diff --git a/bin/pax/pax.1 b/bin/pax/pax.1 index 777780b04..80fcb2129 100644 --- a/bin/pax/pax.1 +++ b/bin/pax/pax.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: pax.1,v 1.79 2024/04/17 15:48:44 jca Exp $ +.\" $OpenBSD: pax.1,v 1.80 2024/11/30 06:59:12 jmc Exp $ .\" $NetBSD: pax.1,v 1.3 1995/03/21 09:07:37 cgd Exp $ .\" .\" Copyright (c) 1992 Keith Muller. @@ -34,7 +34,7 @@ .\" .\" @(#)pax.1 8.4 (Berkeley) 4/18/94 .\" -.Dd $Mdocdate: April 17 2024 $ +.Dd $Mdocdate: November 30 2024 $ .Dt PAX 1 .Os .Sh NAME @@ -553,13 +553,10 @@ and extract the specified .Ar file operands. If any intermediate directories are needed in order to extract an archive -member, these directories will be created as if -.Xr mkdir 2 -was called with the bitwise OR of -.Dv S_IRWXU , S_IRWXG , -and -.Dv S_IRWXO -as the mode argument. +member, these directories will be created with read, write, and search +permissions for the owner, group, and others, +as modified by the current +.Xr umask 2 . When the selected archive format supports the specification of linked files and these files cannot be linked while the archive is being extracted, .Nm diff --git a/distrib/notes/arm64/hardware b/distrib/notes/arm64/hardware index 8601321e7..3a5d57bb2 100644 --- a/distrib/notes/arm64/hardware +++ b/distrib/notes/arm64/hardware @@ -1,4 +1,4 @@ -dnl $OpenBSD: hardware,v 1.25 2024/08/09 04:40:09 dtucker Exp $ +dnl $OpenBSD: hardware,v 1.26 2024/11/11 03:58:26 jsg Exp $ The following machines are targeted by SecBSD/MACHINE: Allwinner A64/H5/H6/H616 @@ -62,6 +62,8 @@ The following machines are targeted by SecBSD/MACHINE: Qualcomm Snapdragon 8cx Gen 3 (SC8280XP) Lenovo ThinkPad X13s Gen 1 Microsoft Windows Dev Kit 2023 + Qualcomm Snapdragon X Elite (X1E80100) + HP OmniBook X14 Rockchip RK3328/RK3399(pro) Pine64 ROCK64 Pine64 ROCKPro64 diff --git a/distrib/sets/lists/base/mi b/distrib/sets/lists/base/mi index bfda0a59c..08040f9dc 100644 --- a/distrib/sets/lists/base/mi +++ b/distrib/sets/lists/base/mi @@ -739,7 +739,7 @@ ./usr/lib/libelf.so.3.0 ./usr/lib/libevent.so.4.1 ./usr/lib/libexecinfo.so.3.0 -./usr/lib/libexpat.so.14.1 +./usr/lib/libexpat.so.15.0 ./usr/lib/libfido2.so.7.0 ./usr/lib/libform.so.7.0 ./usr/lib/libformw.so.7.0 @@ -765,9 +765,9 @@ ./usr/lib/libssl.so.58.0 ./usr/lib/libtermcap.so.15.0 ./usr/lib/libtermlib.so.15.0 -./usr/lib/libtls.so.31.0 +./usr/lib/libtls.so.31.1 ./usr/lib/libusbhid.so.7.1 -./usr/lib/libutil.so.18.0 +./usr/lib/libutil.so.20.0 ./usr/lib/libz.so.7.1 ./usr/lib/locate ./usr/lib/locate/src.db diff --git a/distrib/sets/lists/comp/mi b/distrib/sets/lists/comp/mi index e06fb3a7d..2583effd8 100644 --- a/distrib/sets/lists/comp/mi +++ b/distrib/sets/lists/comp/mi @@ -565,6 +565,8 @@ ./usr/include/dev/pci/if_em_osdep.h ./usr/include/dev/pci/if_em_soc.h ./usr/include/dev/pci/if_etreg.h +./usr/include/dev/pci/if_icereg.h +./usr/include/dev/pci/if_icevar.h ./usr/include/dev/pci/if_igc.h ./usr/include/dev/pci/if_ipwreg.h ./usr/include/dev/pci/if_ipwvar.h @@ -975,6 +977,7 @@ ./usr/include/net/bpfdesc.h ./usr/include/net/ethertypes.h ./usr/include/net/fq_codel.h +./usr/include/net/frame.h ./usr/include/net/hfsc.h ./usr/include/net/if.h ./usr/include/net/if_arp.h @@ -1934,17 +1937,14 @@ ./usr/share/man/man3/EVP_PKEY_CTX_set_hkdf_md.3 ./usr/share/man/man3/EVP_PKEY_CTX_set_tls1_prf_md.3 ./usr/share/man/man3/EVP_PKEY_asn1_get_count.3 -./usr/share/man/man3/EVP_PKEY_asn1_new.3 -./usr/share/man/man3/EVP_PKEY_check.3 ./usr/share/man/man3/EVP_PKEY_cmp.3 ./usr/share/man/man3/EVP_PKEY_decrypt.3 ./usr/share/man/man3/EVP_PKEY_derive.3 ./usr/share/man/man3/EVP_PKEY_encrypt.3 ./usr/share/man/man3/EVP_PKEY_get_default_digest_nid.3 ./usr/share/man/man3/EVP_PKEY_keygen.3 -./usr/share/man/man3/EVP_PKEY_meth_get0_info.3 -./usr/share/man/man3/EVP_PKEY_meth_new.3 ./usr/share/man/man3/EVP_PKEY_new.3 +./usr/share/man/man3/EVP_PKEY_new_CMAC_key.3 ./usr/share/man/man3/EVP_PKEY_print_private.3 ./usr/share/man/man3/EVP_PKEY_set1_RSA.3 ./usr/share/man/man3/EVP_PKEY_sign.3 @@ -1955,9 +1955,12 @@ ./usr/share/man/man3/EVP_SignInit.3 ./usr/share/man/man3/EVP_VerifyInit.3 ./usr/share/man/man3/EVP_aes_128_cbc.3 +./usr/share/man/man3/EVP_aes_128_ccm.3 +./usr/share/man/man3/EVP_aes_128_gcm.3 ./usr/share/man/man3/EVP_camellia_128_cbc.3 ./usr/share/man/man3/EVP_chacha20.3 ./usr/share/man/man3/EVP_des_cbc.3 +./usr/share/man/man3/EVP_rc2_cbc.3 ./usr/share/man/man3/EVP_rc4.3 ./usr/share/man/man3/EVP_sha1.3 ./usr/share/man/man3/EVP_sha3_224.3 @@ -2027,6 +2030,7 @@ ./usr/share/man/man3/RAND_bytes.3 ./usr/share/man/man3/RAND_load_file.3 ./usr/share/man/man3/RAND_set_rand_method.3 +./usr/share/man/man3/RC2_encrypt.3 ./usr/share/man/man3/RC4.3 ./usr/share/man/man3/RIPEMD160.3 ./usr/share/man/man3/RMD160Init.3 @@ -2188,6 +2192,7 @@ ./usr/share/man/man3/X509V3_EXT_print.3 ./usr/share/man/man3/X509V3_extensions_print.3 ./usr/share/man/man3/X509V3_get_d2i.3 +./usr/share/man/man3/X509V3_parse_list.3 ./usr/share/man/man3/X509_ALGOR_dup.3 ./usr/share/man/man3/X509_ATTRIBUTE_get0_object.3 ./usr/share/man/man3/X509_ATTRIBUTE_new.3 @@ -2267,6 +2272,7 @@ ./usr/share/man/man3/__fpending.3 ./usr/share/man/man3/__tfork_thread.3 ./usr/share/man/man3/a2d_ASN1_OBJECT.3 +./usr/share/man/man3/a2i_ipadd.3 ./usr/share/man/man3/a64l.3 ./usr/share/man/man3/abort.3 ./usr/share/man/man3/abs.3 @@ -3027,6 +3033,7 @@ ./usr/share/man/man3/utime.3 ./usr/share/man/man3/uu_lock.3 ./usr/share/man/man3/uuid_compare.3 +./usr/share/man/man3/v2i_ASN1_BIT_STRING.3 ./usr/share/man/man3/va_start.3 ./usr/share/man/man3/valloc.3 ./usr/share/man/man3/vis.3 diff --git a/distrib/sets/lists/man/mi b/distrib/sets/lists/man/mi index e5e342a55..bfac29ede 100644 --- a/distrib/sets/lists/man/mi +++ b/distrib/sets/lists/man/mi @@ -1146,6 +1146,7 @@ ./usr/share/man/man4/acpibat.4 ./usr/share/man/man4/acpibtn.4 ./usr/share/man/man4/acpicbkbd.4 +./usr/share/man/man4/acpicmos.4 ./usr/share/man/man4/acpicpu.4 ./usr/share/man/man4/acpidock.4 ./usr/share/man/man4/acpiec.4 @@ -1453,6 +1454,7 @@ ./usr/share/man/man4/fins.4 ./usr/share/man/man4/fintek.4 ./usr/share/man/man4/fms.4 +./usr/share/man/man4/frame.4 ./usr/share/man/man4/fusbtc.4 ./usr/share/man/man4/fuse.4 ./usr/share/man/man4/fxp.4 @@ -1550,6 +1552,7 @@ ./usr/share/man/man4/iatp.4 ./usr/share/man/man4/iavf.4 ./usr/share/man/man4/icc.4 +./usr/share/man/man4/ice.4 ./usr/share/man/man4/ichiic.4 ./usr/share/man/man4/ichwdt.4 ./usr/share/man/man4/icmp.4 @@ -1605,6 +1608,7 @@ ./usr/share/man/man4/ix.4 ./usr/share/man/man4/ixgb.4 ./usr/share/man/man4/ixl.4 +./usr/share/man/man4/ixv.4 ./usr/share/man/man4/jmb.4 ./usr/share/man/man4/jme.4 ./usr/share/man/man4/jmphy.4 @@ -1853,6 +1857,7 @@ ./usr/share/man/man4/pwmleds.4 ./usr/share/man/man4/pwmreg.4 ./usr/share/man/man4/qccpu.4 +./usr/share/man/man4/qccpucp.4 ./usr/share/man/man4/qcdwusb.4 ./usr/share/man/man4/qcgpio.4 ./usr/share/man/man4/qciic.4 @@ -2053,7 +2058,6 @@ ./usr/share/man/man4/sym.4 ./usr/share/man/man4/sypwr.4 ./usr/share/man/man4/syscon.4 -./usr/share/man/man4/tap.4 ./usr/share/man/man4/tascodec.4 ./usr/share/man/man4/tcic.4 ./usr/share/man/man4/tcp.4 diff --git a/distrib/special/fsck_ext2fs/Makefile b/distrib/special/fsck_ext2fs/Makefile index 764e7e6a4..1b86cf9e3 100644 --- a/distrib/special/fsck_ext2fs/Makefile +++ b/distrib/special/fsck_ext2fs/Makefile @@ -1,9 +1,11 @@ -# $OpenBSD: Makefile,v 1.3 2023/08/14 08:56:20 kn Exp $ +# $OpenBSD: Makefile,v 1.4 2024/12/18 14:09:18 sthen Exp $ PROG= fsck_ext2fs SRCS= dir.c inode.c main.c pass1.c pass1b.c pass2.c pass3.c pass4.c \ pass5.c fsutil.c setup.c utilities.c ext2fs_bswap.c CFLAGS+= -I${.CURDIR}/../../../sbin/fsck -DSMALL +DPADD+= ${LIBUTIL} +LDADD+= -lutil .PATH: ${.CURDIR}/../../../sbin/fsck_ext2fs .PATH: ${.CURDIR}/../../../sbin/fsck diff --git a/etc/changelist b/etc/changelist index 6f933d05a..e756dee44 100644 --- a/etc/changelist +++ b/etc/changelist @@ -1,4 +1,4 @@ -# $OpenBSD: changelist,v 1.139 2024/06/03 10:07:27 florian Exp $ +# $OpenBSD: changelist,v 1.140 2024/10/31 22:14:04 kn Exp $ # # List of files which the security script backs up and checks # for modifications. @@ -168,6 +168,7 @@ /var/cron/cron.allow /var/cron/cron.deny /var/cron/tabs/root ++/var/db/dhcp6leased/uuid /var/db/unwind.key +/var/nsd/etc/nsd.conf /var/unbound/etc/unbound.conf diff --git a/etc/etc.arm64/Makefile.inc b/etc/etc.arm64/Makefile.inc index 005eb638a..9567c0252 100644 --- a/etc/etc.arm64/Makefile.inc +++ b/etc/etc.arm64/Makefile.inc @@ -1,8 +1,8 @@ -# $OpenBSD: Makefile.inc,v 1.5 2020/05/17 17:04:28 deraadt Exp $ +# $OpenBSD: Makefile.inc,v 1.6 2024/10/29 21:03:09 volker Exp $ KERNELS += GENERIC.MP bsd.mp bootblocks: cp -p ${DESTDIR}/usr/mdec/BOOTAA64.EFI ${RELEASEDIR} -MDEXT= bsd.rd BOOTAA64.EFI miniroot${OSrev}.img +MDEXT= bsd.rd cd${OSrev}.iso BOOTAA64.EFI miniroot${OSrev}.img diff --git a/etc/examples/bgpd.conf b/etc/examples/bgpd.conf index 13023c294..e51e1db14 100644 --- a/etc/examples/bgpd.conf +++ b/etc/examples/bgpd.conf @@ -1,8 +1,8 @@ -# $OpenBSD: bgpd.conf,v 1.25 2024/08/29 12:58:57 claudio Exp $ +# $OpenBSD: bgpd.conf,v 1.26 2024/12/18 16:00:26 claudio Exp $ # example bgpd configuration file, see bgpd.conf(5) # define our own ASN as a macro -ASN="65001" +ASN="4200000001" # global configuration AS $ASN @@ -50,7 +50,7 @@ prefix-set bogons { # Generate routes for the networks our ASN will originate. # The communities (read 'tags') are later used to match on what # is announced to EBGP neighbors -network prefix-set mynetworks set large-community $ASN:1:1 +network prefix-set mynetworks set large-community local-as:1:1 # assume simple network with 3 routers in IBGP full mesh group "ibgp mesh" { @@ -91,8 +91,8 @@ group "upstreams" { # Outbound EBGP: only allow self originated networks to ebgp peers # Don't leak any routes from upstream or peering sessions. This is done -# by checking for routes that are tagged with the large-community $ASN:1:1 -allow to ebgp prefix-set mynetworks large-community $ASN:1:1 +# by checking for routes that are tagged with the large-community local-as:1:1 +allow to ebgp prefix-set mynetworks large-community local-as:1:1 # deny more-specifics of our own originated prefixes deny quick from ebgp prefix-set mynetworks or-longer @@ -103,8 +103,8 @@ allow to ibgp # Scrub normal and large communities relevant to our ASN from EBGP neighbors # https://tools.ietf.org/html/rfc7454#section-11 -match from ebgp set { community delete $ASN:* } -match from ebgp set { large-community delete $ASN:*:* } +match from ebgp set { community delete local-as:* } +match from ebgp set { large-community delete local-as:*:* } # filter out prefixes longer than 24 or shorter than 8 bits for IPv4 # and longer than 48 or shorter than 16 bits for IPv6. diff --git a/etc/examples/sysctl.conf b/etc/examples/sysctl.conf index cc8eb45ad..dd82118c0 100644 --- a/etc/examples/sysctl.conf +++ b/etc/examples/sysctl.conf @@ -1,4 +1,4 @@ -# $OpenBSD: sysctl.conf,v 1.5 2019/09/18 08:39:06 solene Exp $ +# $OpenBSD: sysctl.conf,v 1.7 2024/12/04 13:16:26 sthen Exp $ # # This file contains a list of sysctl options the user wants set at # boot time. See sysctl(2) and sysctl(8) for more information on @@ -25,6 +25,8 @@ #ddb.panic=0 # 0=Do not drop into ddb on a kernel panic #ddb.console=1 # 1=Permit entry of ddb from the console #ddb.log=1 # 1=Log ddb output in kernel message buffer +#kern.allowdt=1 # 1=Enable dt(4) device for btrace(8) support +#kern.allowkmem=1 # 1=Allow access to kmem(4), needed for procmap(8) #fs.posix.setuid=0 # 0=Traditional BSD chown() semantics #vm.swapencrypt.enable=0 # 0=Do not encrypt pages that go to swap #vfs.nfs.iothreads=4 # Number of nfsio kernel threads diff --git a/etc/master.passwd b/etc/master.passwd index 1668f5b52..5c3839ce8 100644 --- a/etc/master.passwd +++ b/etc/master.passwd @@ -2,7 +2,7 @@ root::0:0:daemon:0:0:Charlie &:/root:/bin/ksh daemon:*:1:1::0:0:The devil himself:/root:/sbin/nologin operator:*:2:5::0:0:System &:/operator:/sbin/nologin bin:*:3:7::0:0:Binaries Commands and Source:/:/sbin/nologin -build:*:21:21::0:0:base and xenocara build:/var/empty:/bin/ksh +build:*:21:21:build:0:0:base and xenocara build:/var/empty:/bin/ksh sshd:*:27:27::0:0:sshd privsep:/var/empty:/sbin/nologin _portmap:*:28:28::0:0:portmap:/var/empty:/sbin/nologin _identd:*:29:29::0:0:identd:/var/empty:/sbin/nologin diff --git a/etc/moduli b/etc/moduli index bebd3a953..ab7fd2bb0 100644 --- a/etc/moduli +++ b/etc/moduli @@ -1,412 +1,434 @@ -# $OpenBSD: moduli,v 1.38 2024/08/21 07:06:27 dtucker Exp $ +# $OpenBSD: moduli,v 1.39 2024/11/29 00:13:36 dtucker Exp $ # Time Type Tests Tries Size Generator Modulus -20240326013051 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85DDC5DFB -20240326013055 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85DF8EE9F -20240326013100 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85E15B2AF -20240326013115 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85E8800BB -20240326013121 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85EA93D9F -20240326013127 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85ED33B77 -20240326013129 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85EDE96FB -20240326013133 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85EFDC7AB -20240326013135 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85F004B07 -20240326013147 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85F5A20FB -20240326013151 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85F780007 -20240326013154 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85F873847 -20240326013155 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85F8792BF -20240326013158 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85F99602B -20240326013212 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85FFDCCE7 -20240326013219 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86033F8F7 -20240326013239 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A860C92607 -20240326013244 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A860EACC9F -20240326013252 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8612623A3 -20240326013254 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86131122B -20240326013256 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86137AE5B -20240326013316 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A861CE9FAB -20240326013319 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A861DDF033 -20240326013322 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A861F71477 -20240326013330 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8622DF73F -20240326013333 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8623FA97B -20240326013347 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A862A6F8D3 -20240326013357 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A862EDADB3 -20240326013401 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86306A44F -20240326013402 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8630A4F4F -20240326013406 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86329C6AF -20240326013412 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8634D56D7 -20240326013433 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A863ECB6D7 -20240326013438 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8640E99FF -20240326013448 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86456D45B -20240326013455 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8648DB9CF -20240326013456 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86490C78B -20240326013506 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A864D48787 -20240326013511 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A864F4C14B -20240326013522 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86546E877 -20240326013524 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8654FB6D3 -20240326013529 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A865742D0B -20240326013534 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8659900A3 -20240326013537 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A865A3FE37 -20240326013538 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F049F51F -20240326013547 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F0859D0B -20240326013554 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F0BBD077 -20240326013607 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F11279FB -20240326013628 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F1B2B0DB -20240326013645 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F22EA4A7 -20240326013653 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F266CCCB -20240326013656 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F27B8CC3 -20240326013704 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F2B6898B -20240326013728 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F3661F27 -20240326013732 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F382F33F -20240326013755 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F42B19A3 -20240326013815 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F4BFFC7F -20240326013816 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F4C4D313 -20240326013818 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F4CB895F -20240326013838 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F55F34E3 -20240326013843 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F581582B -20240326013845 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F58BB9BF -20240326013904 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F61FCE5B -20240326013920 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F69490CF -20240326013923 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F6A8041B -20240326013953 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F7815AF3 -20240326014006 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F7E1576F -20240326014014 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F818E747 -20240326014019 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F83E49A7 -20240326014532 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3425DB7F -20240326014544 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A34464EAF -20240326014614 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A349D1663 -20240326014629 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A34C39EC3 -20240326014710 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3544B6B7 -20240326014727 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3574A89B -20240326014741 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A359DA947 -20240326014823 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A361FBA5F -20240326014832 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A36377BB3 -20240326015023 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A37A19A47 -20240326015025 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A37A30F2B -20240326015030 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A37AD1B0F -20240326015038 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A37C0B3FF -20240326015116 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A38348BB3 -20240326015159 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A38BA81C7 -20240326015331 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A39D93F9B -20240326015416 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3A61FCDF -20240326015505 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3AFA877F -20240326015516 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3B1796B3 -20240326015601 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3BA5A777 -20240326015813 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3D516827 -20240326020106 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3F7A7897 -20240326020108 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3F7B337B -20240326020156 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A4012DDF3 -20240326020241 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A409D1FB7 -20240326020357 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A418A36C7 -20240326020359 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A418AC37F -20240326020434 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A41F5DCD3 -20240326020621 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A434E3E3F -20240326020642 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A438BE4BB -20240326020655 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A43ADA137 -20240326020708 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A43D0D1CB -20240326020800 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A44709DB3 -20240326020836 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A44DBD6DB -20240326020854 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A450CF663 -20240326020934 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A458A51DB -20240326021106 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585539C8487 -20240326021134 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258553F5040F -20240326021206 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855453B76F -20240326021324 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855546DBDB -20240326021407 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258555BDDCF3 -20240326021424 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258555F11B9F -20240326021450 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855644DDE3 -20240326021458 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855656D6E7 -20240326021614 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258557488DE3 -20240326021659 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258557D16D53 -20240326021718 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585580918BB -20240326021822 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258558D0013B -20240326021836 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258558F7A96B -20240326021921 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855982467F -20240326021932 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258559A0BC87 -20240326022009 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855A12A95B -20240326022029 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855A4C1027 -20240326022038 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855A608723 -20240326022102 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855AA76F27 -20240326022132 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855B050E7B -20240326022301 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855C2121F3 -20240326022441 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855D60DD03 -20240326022451 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855D7D2637 -20240326022516 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855DC6F6EF -20240326022530 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855DEDE3DB -20240326022711 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855F35973F -20240326022824 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125856017684F -20240326022834 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125856032C153 -20240326022854 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585606C9E9F -20240326022919 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258560B97F3B -20240326023041 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258561B88E3B -20240326023119 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585622F17B3 -20240326023135 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585625E20DB -20240326023142 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585626E1567 -20240326023229 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585630054CB -20240326023255 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585634C7DFB -20240326023307 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585636F2A3B -20240326023310 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125856371CA8F -20240326023417 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258564487EA3 -20240326023451 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258564AFE53B -20240326024347 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181186E03B3 -20240326024508 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818118EEB0A3 -20240326024849 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81811A4ECE4B -20240326025526 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81811CD141E3 -20240326025628 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81811D32676B -20240326030110 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81811EF7F1E3 -20240326030518 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818120788D47 -20240326031719 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818125002673 -20240326031926 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818125C6B433 -20240326031951 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818125E6335B -20240326032742 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818128EAC3E7 -20240326032936 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818129980033 -20240326032952 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818129AAC3DB -20240326033059 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812A0B8603 -20240326033458 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812B8E0D07 -20240326033533 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812BBB8B97 -20240326033606 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812BE87FF7 -20240326033629 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812C03788F -20240326033712 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812C3FAF07 -20240326034008 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812D534F8B -20240326034204 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812E080CA3 -20240326034508 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812F2F5493 -20240326034751 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181302AABC7 -20240326034806 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181303CD8D3 -20240326034823 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181304F3DCB -20240326035043 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181312A3FE7 -20240326035348 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181324BFA5B -20240326035602 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181331F2E53 -20240326035702 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818133769453 -20240326035737 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818133AA336B -20240326035756 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818133C16B8B -20240326040216 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81813553AD37 -20240326040447 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81813644788F -20240326040552 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818136A4C7F7 -20240326040951 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D80EA89E4B -20240326042517 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D8147E15B3 -20240326042616 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D814D61A3B -20240326043713 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D818FD20D3 -20240326043724 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D819078123 -20240326043742 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D8191EAEFF -20240326044025 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D81A204197 -20240326044258 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D81B145927 -20240326044447 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D81BB935AB -20240326044534 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D81BFCFA6F -20240326045348 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D81F0CEB6B -20240326045438 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D81F582F4B -20240326045630 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82007A843 -20240326045745 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D820792B27 -20240326045949 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82142CB8F -20240326045957 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82148EA73 -20240326050355 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D822CAC6BF -20240326050713 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D8240BBCC3 -20240326050731 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D824214D3B -20240326050903 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D824ACACFB -20240326051214 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D825DF67F7 -20240326051332 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D826515C63 -20240326051747 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D827E42F0B -20240326051831 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D828243B8B -20240326051843 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82831A223 -20240326052417 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82A48CE23 -20240326052731 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82B78A8F3 -20240326052959 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82C5D399B -20240326053126 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82CE5BB4B -20240326060038 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A3C767FD7 -20240326060444 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A3CF77C3B -20240326070240 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A4448EF33 -20240326073131 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A47DAE05B -20240326073415 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A482BBA27 -20240326080953 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A4CB6AE7F -20240326081127 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A4CDF5A0B -20240326093032 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A56B6523B -20240326093454 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A573897EB -20240326093728 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A57820693 -20240326094259 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A5829EAF7 -20240326094948 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A58FD0FEF -20240326101231 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A5BDEBEE3 -20240326101412 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A5C09FFB3 -20240326102704 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A5DAD12BF -20240326103806 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A5F05465F -20240326105506 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A611EE2E3 -20240326112146 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A647870E3 -20240326114154 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A6707EC03 -20240326114315 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A6729353B -20240326122735 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A6CC0FBB3 -20240326123728 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A6DF24D2F -20240326130541 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A71768773 -20240326130743 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A71AF6A1B -20240326132826 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A743654E3 -20240326134513 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A76478D13 -20240326134939 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A76C9E817 -20240326135416 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A7755E8B7 -20240326143409 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A7C397F2F -20240326144117 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A7D13AF93 -20240326150017 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A7F704F7F -20240326150157 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A7F9F468F -20240326150526 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A8005826B -20240326150739 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A8045FDAF -20240326151012 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A808FF207 -20240326151536 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A81343BEB -20240326162321 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5AD9F98F93F -20240326163529 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADA11D7CC3 -20240326163654 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADA142310B -20240326165530 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADA394A593 -20240326171340 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADA5C7FE3B -20240326175630 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADAB35A653 -20240326175808 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADAB62C48F -20240326184011 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB0B50FD7 -20240326184335 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB1203D2F -20240326185246 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB2435AB7 -20240326190020 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB333EDAB -20240326190122 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB34BD947 -20240326191114 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB482E3D7 -20240326192702 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB67FBDFB -20240326195941 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADBAA83D13 -20240326200115 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADBAD40AEF -20240326201633 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADBCB670E7 -20240326203821 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADBF6DC6B3 -20240326204751 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADC094E45B -20240326205334 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADC1441637 -20240326211827 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADC45F0E3F -20240326212459 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADC52DBD1B -20240326214659 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADC800E58F -20240326215635 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADC9314DBF -20240326221037 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADCAE8162F -20240326225055 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADCFEC8FA3 -20240326225519 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADD072DFCF -20240326231305 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADD2AFDE1F -20240326233946 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADD60F026B -20240327001519 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADDA879EA3 -20240327002618 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADDBDFC89B -20240327003415 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADDCD9388B -20240327012525 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123BF06ED93 -20240327022256 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123C2EB1D03 -20240327025321 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123C4EE6D8F -20240327031901 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123C6A6ECFB -20240327034252 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123C84AA3F3 -20240327034558 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123C876E36F -20240327035607 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123C91E770F -20240327043824 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123CBF90753 -20240327061734 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123D2A46DE3 -20240327071503 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123D6765ED7 -20240327080706 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123D9FC24D3 -20240327091530 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123DE8C18AB -20240327092725 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123DF4D10AF -20240327100400 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123E1BE884B -20240327102109 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123E2D9E9AF -20240327111646 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123E69B7CAB -20240327140134 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123F1C97CDB -20240327144258 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123F48C6AEB -20240327150511 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123F6023BEB -20240327153839 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123F8480A9B -20240327160724 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123FA2AE0EF -20240327170619 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123FE1F90CB -20240327201733 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A541240B20240F -20240327202608 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A541240BACBC77 -20240327204230 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A541240CCB39CB -20240327220340 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A5412412509EF3 -20240327230112 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54124164279BF -20240327231350 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A5412417159137 -20240328011850 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A541241F8FAF0F -20240328020121 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A541242268881B -20240328020416 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A5412422921477 -20240328035516 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A541242A164FCB -20240328051250 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCB60A9A5B -20240328061956 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCBA8EE4D3 -20240328083541 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCC39DE953 -20240328104001 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCCBE8F2FF -20240328123936 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCD40450AB -20240328131851 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCD6B3842F -20240328133514 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCD7C761BB -20240328163521 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCE3D44693 -20240328184556 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCECA94E8F -20240328185443 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCED3C2EEB -20240328190404 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCEDD4DEAB -20240328193132 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCEFA3B567 -20240328194029 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCF039E777 -20240328205320 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCF523DF3F -20240328210032 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCF59C775B -20240328221220 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCFA7B3FEB -20240328221329 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCFA863653 -20240328222505 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCFB420393 -20240328224858 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCFCDA54CF -20240329004423 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD04B953EF -20240329024223 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD0BE0B937 -20240329035503 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD10BA6927 -20240329035634 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD10CC8C1F -20240329035914 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD10F42063 -20240329045640 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD14CA5323 -20240329050935 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD159E9383 -20240329053141 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD170D04C3 -20240329054343 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD17D323FB -20240329062142 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD1A5DB2DF -20240329073301 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD1F20E86F -20240329074920 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD20377F03 -20240329085033 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD242F4BCB -20240329121808 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C124806CA43 -20240329122442 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12485AF08F -20240329153134 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C1252D3F0CF -20240329155254 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C1254053513 -20240329161124 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12550A7BDB -20240329161738 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12555C651B -20240329174531 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C125A40EEC3 -20240329191732 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C125F71710B -20240329195323 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C126178458B -20240329204827 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12648DD15F -20240329234203 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C126E5A5097 -20240329234306 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C126E615ACB -20240330005652 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12726F6443 -20240330033619 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C127B69FC23 -20240330044619 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C127F446BC3 -20240330054010 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C1282492493 -20240330055823 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C128344D603 -20240330062335 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C1284A06C1F -20240330082107 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C128B2D4E73 -20240330083555 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C128BF7E127 -20240330084121 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C128C3C894F -20240330104737 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C129350C1FB -20240330112334 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12954A50B3 -20240330133619 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C129CB0C66F -20240330135122 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C129D7F94B3 -20240330141203 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C129E9C046B -20240330155328 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12A438CDC3 -20240330164337 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12A6FF833B -20240330172236 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12A9222D1B -20240330193325 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12B07FB5BB -20240330201458 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12B2CA43B3 -20240330212712 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12B6C88EF3 -20240330225844 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12BBE67097 -20240331000148 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B73EA509F -20240331002043 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B74F19237 -20240331015303 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B7A08A157 -20240331021926 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B7B77B293 -20240331031147 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B7E5DF07B -20240331032001 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B7ECA5C3F -20240331054028 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B86B76577 -20240331062300 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B891AC21B -20240331063150 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B898D590B -20240331064453 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B8A3FB29B -20240331070343 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B8B4728B3 -20240331082004 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B8F78FC67 -20240331083046 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B90063753 -20240331085336 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B913BDDA3 -20240331104948 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B97AD8FBB -20240331121935 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B9CBCB66B -20240331125021 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B9E75E9EF -20240331131006 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B9F876B2B -20240331135555 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BA21BA983 -20240331154257 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BA8151143 -20240331171643 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BAD603A0F -20240331180835 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BB042B533 -20240331184114 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BB20E55D7 -20240331190024 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BB31FB5FB -20240331193130 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BB4D5DEF3 -20240331203633 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BB878F90B -20240331215848 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BBD220A13 -20240331220718 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BBD9694FB -20240331234057 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BC2D1D8B3 -20240401015736 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BCA81EB2B -20240401044749 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BD41C3C93 -20240401051819 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BD5D2C057 -20240401061504 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BD8EDA743 -20240401062619 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BD98C438F -20240401095349 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BE51ECC83 -20240401133450 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BF189CF03 -20240401134927 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BF2540457 +20240828044144 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63216235F7 +20240828044149 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63217EB4CB +20240828044153 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF632197445F +20240828044203 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6321E28D7F +20240828044206 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6321F5D65F +20240828044207 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6321F5F783 +20240828044210 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63220959FB +20240828044217 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63223CB053 +20240828044224 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63226F7A83 +20240828044233 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6322B452E7 +20240828044240 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6322E58253 +20240828044251 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF632334AB77 +20240828044259 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF632379357B +20240828044311 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6323D336A7 +20240828044323 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63242A969B +20240828044326 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63243E12C3 +20240828044349 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6324EA98FF +20240828044351 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6324F33C17 +20240828044406 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF632569D1BF +20240828044412 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF632591055B +20240828044416 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6325A64983 +20240828044426 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6325F39C73 +20240828044435 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63263987CF +20240828044440 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63265B2A5F +20240828044445 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63267C888B +20240828044453 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6326B9D6C3 +20240828044505 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63270DF46F +20240828044509 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF632725FB3B +20240828044510 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF632728D6F3 +20240828044525 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6327A20713 +20240828044536 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6327FA0007 +20240828044603 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6328C7601B +20240828044621 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602100B138DB +20240828044622 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602100BA7D33 +20240828044630 2 6 100 2047 5 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602100F35A77 +20240828044634 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD26021010E6E03 +20240828044637 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD26021011F7EAB +20240828044646 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD26021016091AB +20240828044657 2 6 100 2047 5 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602101B2C867 +20240828044658 2 6 100 2047 5 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602101B60E87 +20240828044721 2 6 100 2047 5 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602102652CD7 +20240828044731 2 6 100 2047 5 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602102B160B7 +20240828044737 2 6 100 2047 5 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602102DA0A57 +20240828044755 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD260210367434B +20240828044803 2 6 100 2047 5 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602103A3B7DF +20240828044807 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602103C2D9CB +20240828044812 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602103DE1313 +20240828044821 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602104264E53 +20240828044835 2 6 100 2047 5 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602104909817 +20240828044855 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602105309B8B +20240828044903 2 6 100 2047 5 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD26021056A2A5F +20240828044903 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD26021056A52EB +20240828044921 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602105F6DDD3 +20240828044930 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD26021063AE353 +20240828044934 2 6 100 2047 5 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD260210651B5C7 +20240828044937 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602106651B4B +20240828044944 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD26021069D4573 +20240828045003 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD26021072D06EB +20240828045023 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602107C5C8DB +20240828045043 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD26021085D358B +20240828045540 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DB83F1177 +20240828045614 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DB8AA8ABF +20240828045644 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DB90E7B73 +20240828045720 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DB984B19F +20240828045813 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBA2CAEB7 +20240828045858 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBABFBAAB +20240828045903 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBACAA69F +20240828045912 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBAE15E2B +20240828045932 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBB1CB097 +20240828050005 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBB86CA4F +20240828050036 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBBEDB4C7 +20240828050043 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBBFC577F +20240828050107 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBC490C0B +20240828050136 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBCA8444F +20240828050201 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBCFC24F3 +20240828050209 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBD0E9213 +20240828050303 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBDBBE653 +20240828050329 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBE0AE17B +20240828050406 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBE8344F3 +20240828050430 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBEC9D58B +20240828050438 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBEDF58FB +20240828050528 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBF858DCB +20240828050633 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC0619997 +20240828050638 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC06A2A8B +20240828050712 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC0D40C6F +20240828050715 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC0D78F7F +20240828050743 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC12FBEF7 +20240828050851 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC216E8EB +20240828050903 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC235154F +20240828050905 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC235B9E3 +20240828050941 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC2AA4F87 +20240828051038 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC36951FB +20240828051046 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC37DE073 +20240828051104 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC3B311A3 +20240828051215 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC4A3904B +20240828051246 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC502215B +20240828051312 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC5506613 +20240828051329 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC57E32D3 +20240828051336 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC58E630B +20240828051520 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC6DF9DDB +20240828051549 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC736A7B3 +20240828051622 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC7A11C13 +20240828051823 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC933AB0B +20240828051906 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC9BF25EF +20240828052009 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BBF34E3B +20240828052030 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BC38F533 +20240828052045 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BC632227 +20240828052153 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BD42ABFF +20240828052207 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BD6986DF +20240828052211 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BD7241F7 +20240828052259 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BE0ECA0B +20240828052336 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BE863B2B +20240828052339 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BE899267 +20240828052415 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BF03197B +20240828052431 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BF33F3BB +20240828052513 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BFBAA987 +20240828052522 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BFD18B5B +20240828052527 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BFDA82D3 +20240828052609 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C0656637 +20240828052616 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C07626F3 +20240828052621 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C07E39AB +20240828052816 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C2033C13 +20240828052903 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C29B2063 +20240828052932 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C2FB438B +20240828052959 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C35070C3 +20240828053054 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C4050DE3 +20240828053223 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C52F78A7 +20240828053319 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C5E6180B +20240828053339 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C61E1503 +20240828053345 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C62B8123 +20240828053430 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C6B80C6B +20240828053549 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C7B7959F +20240828053758 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C95C0E23 +20240828053817 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C9938013 +20240828053837 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C9D0494F +20240828053914 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79CA42683F +20240828054013 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79CB06EC0B +20240828054258 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79CD234BAB +20240828060009 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A70951B13 +20240828060511 2 6 100 4095 5 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A726F0C37 +20240828060714 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7335AED3 +20240828061156 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7501901B +20240828061217 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A751A9A43 +20240828061522 2 6 100 4095 5 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A763D53FF +20240828061600 2 6 100 4095 5 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7675A20F +20240828061619 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A768B4D03 +20240828061636 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A769E17B3 +20240828062452 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A79B996BB +20240828062521 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A79E2492B +20240828062623 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7A419E13 +20240828062831 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7B0C50CB +20240828062854 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7B27FC2B +20240828063249 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7CA08843 +20240828063334 2 6 100 4095 5 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7CE52E4F +20240828063443 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7D4D4863 +20240828063548 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7DAC7243 +20240828063629 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7DE88D73 +20240828064128 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7FCA819B +20240828064626 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A819B3083 +20240828064816 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A8247AB73 +20240828065323 2 6 100 4095 5 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A84385B67 +20240828065513 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A84DF9C03 +20240828070128 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A872AEE03 +20240828070200 2 6 100 4095 5 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A87566497 +20240828070537 2 6 100 4095 5 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A88AEB07F +20240828070904 2 6 100 4095 5 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A8A00154F +20240828071020 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A8A740023 +20240828071247 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A8B633D9B +20240828071353 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A8BC1DD33 +20240828071426 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A8BF0634B +20240828071455 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A8C19F3D3 +20240828071541 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A8C5E63D3 +20240828071923 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9B3CF4313 +20240828072226 2 6 100 4095 5 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9B4F5B7EF +20240828072458 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9B5EF31DB +20240828073047 2 6 100 4095 5 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9B82262CF +20240828073253 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9B8EDB05B +20240828074035 2 6 100 4095 5 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9BBE344BF +20240828074440 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9BD60A58B +20240828074721 2 6 100 4095 5 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9BE6938F7 +20240828075138 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9C00C2AD3 +20240828075304 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9C0911F9B +20240828075632 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9C1E1F5EB +20240828080239 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9C432FEB3 +20240828080841 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9C68352A3 +20240828081126 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9C78B996B +20240828081614 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9C9536B03 +20240828082258 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9CBE55E03 +20240828082637 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9CD49EF1B +20240828082710 2 6 100 4095 5 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9CD7A6C07 +20240828082726 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9CD8C1A83 +20240828082826 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9CDEC8AA3 +20240828082907 2 6 100 4095 5 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9CE27CDDF +20240828083210 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9CF4E290B +20240828083415 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9D01153B3 +20240828083603 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9D0BAF663 +20240828083703 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9D11A10CB +20240828083816 2 6 100 4095 5 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9D18C60B7 +20240828084040 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9D26C42A3 +20240828090009 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F2258E4DB +20240828090718 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F233F2A7B +20240828091256 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F23ED9417 +20240828091549 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F243D1C03 +20240828092905 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F25E8D11F +20240828093653 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F26E25303 +20240828100014 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F29D9C7A3 +20240828100324 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F2A3C434F +20240828105814 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F3151094F +20240828111427 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F33641C63 +20240828113247 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F35BB7B0B +20240828113333 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F35CD9A97 +20240828113540 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F360A482B +20240828115349 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F3862A7B3 +20240828115426 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F386EC997 +20240828120438 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F39B5CC43 +20240828121629 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F3B334FB3 +20240828121657 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F3B3B734B +20240828122545 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F3C524DB3 +20240828123158 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F3D1B196F +20240828130157 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F40EB0D47 +20240828130238 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F40F7E253 +20240828134737 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F46C46D3B +20240828135646 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F47E7985B +20240828144149 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F4DB24103 +20240828145157 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F4EF2EE0B +20240828145816 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F4FB0AC7F +20240828151150 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F515FD9BF +20240828151822 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F5229B63F +20240828153933 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F54CF3923 +20240828154759 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F55E07A93 +20240828161625 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F598D643B +20240828162500 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F5A998FB7 +20240828162916 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F5B1CC43B +20240828163955 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F5C71914B +20240828164552 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F5D2E5D1F +20240828170129 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F5F34D397 +20240828172001 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F6192353F +20240828172046 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F61A3C147 +20240828172320 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F61EF7817 +20240828173414 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F6352E0CB +20240828173441 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F6359E007 +20240828180730 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F679AD6CB +20240828180915 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F67CD41EB +20240828180941 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F67D23A63 +20240828181257 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F683B05BF +20240828182555 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3180CE228BB +20240828184406 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3180F2F287B +20240828185315 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3181059FDFB +20240828191106 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31812A21FB3 +20240828191122 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31812A28277 +20240828195243 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE318180489DB +20240828195610 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31818728F67 +20240828201325 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3181AAF829B +20240828202233 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3181BD9FE33 +20240828202820 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3181C96132B +20240828204913 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3181F3FE8A3 +20240828205946 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE318209CB6D7 +20240828211537 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31822AC1387 +20240828220459 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE318290F4E1F +20240828224012 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3182D9E3A03 +20240828232844 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31833F1DD7B +20240828233400 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3183494A423 +20240828235802 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31837ADEA57 +20240829001115 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE318395E7B83 +20240829004718 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3183E0E5603 +20240829004844 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3183E34D98F +20240829005431 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3183EECD0DF +20240829010933 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31840CEA00B +20240829014049 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31844D61FFB +20240829014355 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3184533474F +20240829014829 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31845BEB5C7 +20240829015142 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31846235FD3 +20240829015517 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3184695C7FB +20240829020608 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31847F7E373 +20240829023600 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3184BC56B47 +20240829025737 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3184E74875B +20240829031846 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE318511B9B7F +20240829033452 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE318531C0F27 +20240829034004 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31853C097B7 +20240829043625 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD187E5F08523 +20240829053823 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD187EA33BB33 +20240829061611 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD187ECC3E213 +20240829064111 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD187EE73FD37 +20240829065111 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD187EF1CB167 +20240829082003 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD187F52294C3 +20240829091934 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD187F92CC467 +20240829093659 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD187FA58CCB3 +20240829103319 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD187FE2DC683 +20240829123824 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18806C1B393 +20240829130958 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18808EFDAAB +20240829135456 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1880C119733 +20240829150211 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18810B3AE03 +20240829152452 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18812362547 +20240829171859 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1881A26609B +20240829181704 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1881E2C3E3B +20240829182818 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1881EED38A3 +20240829184006 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1881FB9391B +20240829190814 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18821A70EA7 +20240829195154 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18824BB04C7 +20240829200011 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1882546EC8F +20240829203003 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD188274D620B +20240829220907 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1882E2608EB +20240829221444 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1882E810C9B +20240829222440 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1882F2EBA7B +20240829230449 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18831F68C1B +20240829231044 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18832552757 +20240829233827 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD188343C3EAB +20240829235120 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD188351A81B3 +20240830003221 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18837F06443 +20240830011832 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1883B1C9E73 +20240830013013 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1883BE3681B +20240830014610 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1883CF597DB +20240830032931 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD188443580AB +20240830042102 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18847CB52C7 +20240830042255 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18847E4A687 +20240830052035 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1884BDB09B7 +20240830053449 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1884CD217AB +20240830054036 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1884D30808F +20240830060721 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1884F02040B +20240830071657 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18853C7A8E7 +20240830084720 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FEF75703DB +20240830094656 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FEFB626A2F +20240830095006 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FEFB909467 +20240830110930 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF0108EC1F +20240830112637 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF02315BCB +20240830113545 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF02D19C77 +20240830134211 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF0BA3E697 +20240830134427 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF0BC3CC37 +20240830134817 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF0C009ED3 +20240830145923 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF10E44067 +20240830161320 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF15FCEA4B +20240830170319 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF197243AF +20240830171339 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF1A211BAF +20240830173745 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF1BC7E24F +20240830181908 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF1E96C5DF +20240830181940 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF1E9711DB +20240830183135 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF1F5C367B +20240830190740 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF21D6FFCB +20240830192133 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF22C8073B +20240830213430 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF2BE900AB +20240830213722 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF2C10C36F +20240830221923 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF2EF2814B +20240830225347 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF314EE303 +20240830231356 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF32AF8B0B +20240830234723 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF34FE61CB +20240831004647 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF3918C417 +20240831020149 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF3E4B559F +20240831022637 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF4002F243 +20240831030552 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF42BB548F +20240831033741 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF44F1D9D7 +20240831034841 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF45ACBE37 +20240831035452 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF460E12C3 +20240831053706 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF4D2CFB27 +20240831055400 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF4E512613 +20240831073419 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF5532694B +20240831074414 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF55DB1637 +20240831081807 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF583421DF +20240831090302 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF5B405DA3 +20240831093205 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF5D338B6B +20240831103110 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF61456293 +20240831121754 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB1349E143 +20240831124443 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB14CB7AFF +20240831135558 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB18CC80A3 +20240831145738 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB1C36864B +20240831165313 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB22B0FAD7 +20240831185249 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB29880B2B +20240831185952 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB29E5889B +20240831194619 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB2C7FC84F +20240831230544 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB37F47B7F +20240901001522 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB3BE4A76B +20240901013228 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB404463B7 +20240901015829 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB41B1142F +20240901025646 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB44FDAE87 +20240901031615 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB461000EB +20240901042008 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB49A1BE47 +20240901044227 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB4AE1A82B +20240901064528 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB51D37F37 +20240901073955 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB54DB30B7 +20240901080825 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB56740653 +20240901083546 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB57EF4EAF +20240901093005 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB5AF60F7B +20240901122015 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB64814643 +20240901124800 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB661018A7 +20240901134700 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB695D723F +20240901135853 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB6A06CAEB +20240901140005 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB6A0E0D2F +20240901141551 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB6AEB6337 +20240901141841 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB6B0A7C53 +20240901144342 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB6C6CC963 +20240901151624 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB6E3F7CCF +20240901173158 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB75F13437 +20240901180438 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB77CD90AB +20240901182042 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB78AD2B63 +20240901193908 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB7D18983B +20240901195652 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB7E1244DF +20240901202100 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB7F6CD3C7 +20240901210156 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB81BA121B +20240901220732 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB8571A7D3 +20240901233244 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB8A40CE93 +20240902012852 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D46ED77CB9B +20240902013705 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D46EDE42B6B +20240902022309 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D46F07C42B3 +20240902023700 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D46F13D6B9B +20240902033157 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D46F444A467 +20240902074115 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D470264825B +20240902081217 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D47041D069B +20240902085634 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D4706993BE7 +20240902095212 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D4709C080DB +20240902103310 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D470C00A7DB +20240902113925 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D470FB7C81B +20240902145636 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D471ADD1BC7 +20240902162039 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D471F910B07 +20240902162513 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D471FCD9837 +20240902170958 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D47224EBF47 +20240902195925 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D472BED92A7 +20240902201041 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D472C8835C3 +20240902212334 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D4730A0A15F +20240903001824 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D473A91EE3B +20240903003705 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D473B9B08CB +20240903010010 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D473CDEB7B3 +20240903010348 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D473D0B3A67 +20240903034119 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D474614297B +20240903040728 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D4747910563 +20240903051146 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D474B45E3DB +20240903064823 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D4750BE2633 +20240903064907 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D4750C0835B +20240903101831 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D475C6B64DB +20240903113322 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D4760A047BF +20240903122505 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D47638D75FB +20240903124220 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D476482E71B +20240903133142 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D476752BA3F +20240903143834 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D476B1AC6BB diff --git a/etc/rc b/etc/rc index 5ded55cbd..868f5d57a 100644 --- a/etc/rc +++ b/etc/rc @@ -1,4 +1,4 @@ -# $OpenBSD: rc,v 1.577 2024/10/14 02:46:50 deraadt Exp $ +# $OpenBSD: rc,v 1.578 2024/10/22 22:23:21 lucas Exp $ # System startup script run by init on autoboot or after single-user. # Output and error are redirected to console by init, and the console is the @@ -242,7 +242,7 @@ reorder_libs() { done for _bin in $_relink/usr/sbin/sshd $_relink/usr/libexec/sshd-session \ - $_relink/usr/bin/sshd-auth $_relink/usr/bin/ssh-agent ; do + $_relink/usr/libexec/sshd-auth $_relink/usr/bin/ssh-agent; do _tmpdir=$(mktemp -dq $_relink/_rebuild.XXXXXXXXXXXX) && ( set -o errexit diff --git a/etc/root/root.mail b/etc/root/root.mail index 4bcb1d941..83d963199 100644 --- a/etc/root/root.mail +++ b/etc/root/root.mail @@ -1,6 +1,6 @@ -From purplerain@secbsd.org Sun Oct 27 00:00:00 UTC 2024 +From purplerain@secbsd.org Wed Jan 8 00:00:00 UTC 2025 Return-Path: root -Date: Oct 27 00:00:00 UTC 2024 +Date: Jan 8 00:00:00 UTC 2025 From: purplerain@secbsd.org (Purple Rain) To: root Subject: Welcome to SecBSD 1.6! diff --git a/etc/rpki/apnic.constraints b/etc/rpki/apnic.constraints index b1706c102..0ae36468e 100644 --- a/etc/rpki/apnic.constraints +++ b/etc/rpki/apnic.constraints @@ -1,4 +1,4 @@ -# $OpenBSD: apnic.constraints,v 1.6 2024/04/17 14:31:59 job Exp $ +# $OpenBSD: apnic.constraints,v 1.7 2024/11/02 09:43:12 job Exp $ # From https://www.iana.org/assignments/ipv6-unicast-address-assignments allow 2001:200::/23 @@ -9,6 +9,7 @@ allow 2001:8000::/19 allow 2001:a000::/20 allow 2001:b000::/20 allow 2400::/12 +allow 2410::/12 # IX Assignments allow 2001:7fa::/32 diff --git a/games/fortune/fortune/fortune.c b/games/fortune/fortune/fortune.c index 652422839..3cc8b450c 100644 --- a/games/fortune/fortune/fortune.c +++ b/games/fortune/fortune/fortune.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fortune.c,v 1.65 2024/09/20 12:52:37 tb Exp $ */ +/* $OpenBSD: fortune.c,v 1.67 2024/10/21 06:39:03 tb Exp $ */ /* $NetBSD: fortune.c,v 1.8 1995/03/23 08:28:40 cgd Exp $ */ /*- @@ -163,8 +163,11 @@ main(int ac, char *av[]) init_prob(); if ((Short_only && minlen_in_list(File_list) > SLEN) || - (Long_only && maxlen_in_list(File_list) <= SLEN)) + (Long_only && maxlen_in_list(File_list) <= SLEN)) { + fprintf(stderr, + "no fortunes matching length constraint found\n"); return 1; + } do { get_fort(); @@ -1116,6 +1119,8 @@ find_matches(void) Found_one = false; matches_in_list(File_list); + free(Fortbuf); + Fortbuf = NULL; return Found_one; } diff --git a/gnu/llvm/lldb/source/Plugins/ABI/X86/ABISysV_x86_64.cpp b/gnu/llvm/lldb/source/Plugins/ABI/X86/ABISysV_x86_64.cpp index 9d5ed1fa2..0900ff100 100644 --- a/gnu/llvm/lldb/source/Plugins/ABI/X86/ABISysV_x86_64.cpp +++ b/gnu/llvm/lldb/source/Plugins/ABI/X86/ABISysV_x86_64.cpp @@ -95,6 +95,7 @@ ABISysV_x86_64::CreateInstance(lldb::ProcessSP process_sp, const ArchSpec &arch) case llvm::Triple::OSType::Linux: case llvm::Triple::OSType::MacOSX: case llvm::Triple::OSType::NetBSD: + case llvm::Triple::OSType::OpenBSD: case llvm::Triple::OSType::Solaris: case llvm::Triple::OSType::UnknownOS: return ABISP( diff --git a/gnu/llvm/lldb/source/Plugins/Process/OpenBSD/NativeRegisterContextOpenBSD_x86_64.cpp b/gnu/llvm/lldb/source/Plugins/Process/OpenBSD/NativeRegisterContextOpenBSD_x86_64.cpp index b05dde600..26b28bf42 100644 --- a/gnu/llvm/lldb/source/Plugins/Process/OpenBSD/NativeRegisterContextOpenBSD_x86_64.cpp +++ b/gnu/llvm/lldb/source/Plugins/Process/OpenBSD/NativeRegisterContextOpenBSD_x86_64.cpp @@ -9,14 +9,14 @@ #if defined(__x86_64__) +#include "NativeRegisterContextOpenBSD_x86_64.h" +#include #include #include #include #include -#include "NativeRegisterContextOpenBSD_x86_64.h" - #include "lldb/Host/HostInfo.h" #include "lldb/Utility/DataBufferHeap.h" #include "lldb/Utility/Log.h" @@ -24,9 +24,11 @@ #include "lldb/Utility/Status.h" #include "Plugins/Process/Utility/RegisterContextOpenBSD_x86_64.h" +#include "Plugins/Process/Utility/RegisterContext_x86.h" // clang-format off #include +#include #include #include #include @@ -92,8 +94,20 @@ static_assert( == k_num_fpr_registers_x86_64, "g_fpu_regnums_x86_64 has wrong number of register infos"); +static const uint32_t g_avx_regnums_x86_64[] = { + lldb_ymm0_x86_64, lldb_ymm1_x86_64, lldb_ymm2_x86_64, lldb_ymm3_x86_64, + lldb_ymm4_x86_64, lldb_ymm5_x86_64, lldb_ymm6_x86_64, lldb_ymm7_x86_64, + lldb_ymm8_x86_64, lldb_ymm9_x86_64, lldb_ymm10_x86_64, lldb_ymm11_x86_64, + lldb_ymm12_x86_64, lldb_ymm13_x86_64, lldb_ymm14_x86_64, lldb_ymm15_x86_64, + LLDB_INVALID_REGNUM // register sets need to end with this flag +}; +static_assert( + (sizeof(g_avx_regnums_x86_64) / sizeof(g_avx_regnums_x86_64[0])) - 1 + == k_num_avx_registers_x86_64, + "g_avx_regnums_x86_64 has wrong number of register infos"); + // Number of register sets provided by this context. -enum { k_num_register_sets = 2 }; +enum { k_num_register_sets = 3 }; // Register sets for x86 64-bit. static const RegisterSet g_reg_sets_x86_64[k_num_register_sets] = { @@ -101,6 +115,8 @@ static const RegisterSet g_reg_sets_x86_64[k_num_register_sets] = { g_gpr_regnums_x86_64}, {"Floating Point Registers", "fpu", k_num_fpr_registers_x86_64, g_fpu_regnums_x86_64}, + {"Advanced Vector Extensions", "avx", k_num_avx_registers_x86_64, + g_avx_regnums_x86_64}, }; struct x86_fpu_addr { @@ -108,6 +124,11 @@ struct x86_fpu_addr { uint32_t selector; }; +enum { + k_xsave_offset_legacy_region = 160, + k_xsave_offset_invalid = UINT32_MAX, +}; + } // namespace #define REG_CONTEXT_SIZE (GetGPRSize() + GetFPRSize()) @@ -135,7 +156,18 @@ NativeRegisterContextOpenBSD_x86_64::NativeRegisterContextOpenBSD_x86_64( const ArchSpec &target_arch, NativeThreadProtocol &native_thread) : NativeRegisterContextOpenBSD(native_thread, CreateRegisterInfoInterface(target_arch)), - m_gpr(), m_fpr() {} + m_gpr(), m_fpr() { + uint32_t a, b, c, d; + + struct ptrace_xstate_info info; + const Status error = NativeProcessOpenBSD::PtraceWrapper( + PT_GETXSTATE_INFO, GetProcessPid(), &info, sizeof(info)); + if (error.Success()) + m_xsave.resize(info.xsave_len); + + __get_cpuid_count(0xd, 2, &a, &b, &c, &d); + m_xsave_offsets[YMMRegSet] = b > 0 ? b : k_xsave_offset_invalid; +} uint32_t NativeRegisterContextOpenBSD_x86_64::GetUserRegisterCount() const { uint32_t count = 0; @@ -167,6 +199,8 @@ int NativeRegisterContextOpenBSD_x86_64::GetSetForNativeRegNum( return GPRegSet; else if (reg_num >= k_first_fpr_x86_64 && reg_num <= k_last_fpr_x86_64) return FPRegSet; + else if (reg_num >= k_first_avx_x86_64 && reg_num <= k_last_avx_x86_64) + return YMMRegSet; else return -1; } @@ -179,6 +213,11 @@ int NativeRegisterContextOpenBSD_x86_64::ReadRegisterSet(uint32_t set) { case FPRegSet: ReadFPR(); return 0; + case YMMRegSet: { + const Status error = NativeProcessOpenBSD::PtraceWrapper( + PT_GETXSTATE, GetProcessPid(), m_xsave.data(), m_xsave.size()); + return error.Success() ? 0 : -1; + } default: break; } @@ -192,6 +231,11 @@ int NativeRegisterContextOpenBSD_x86_64::WriteRegisterSet(uint32_t set) { case FPRegSet: WriteFPR(); return 0; + case YMMRegSet: { + const Status error = NativeProcessOpenBSD::PtraceWrapper( + PT_SETXSTATE, GetProcessPid(), m_xsave.data(), m_xsave.size()); + return error.Success() ? 0 : -1; + } default: break; } @@ -393,6 +437,18 @@ NativeRegisterContextOpenBSD_x86_64::ReadRegister(const RegisterInfo *reg_info, break; } + if (set == YMMRegSet) { + std::optional ymm_reg = GetYMMSplitReg(reg); + if (ymm_reg) { + YMMReg ymm = XStateToYMM(ymm_reg->xmm, ymm_reg->ymm_hi); + reg_value.SetBytes(ymm.bytes, reg_info->byte_size, + endian::InlHostByteOrder()); + } else { + error.SetErrorStringWithFormat("register \"%s\" not supported", + reg_info->name); + } + } + return error; } @@ -591,6 +647,18 @@ Status NativeRegisterContextOpenBSD_x86_64::WriteRegister( break; } + if (set == YMMRegSet) { + std::optional ymm_reg = GetYMMSplitReg(reg); + if (!ymm_reg) { + error.SetErrorStringWithFormat("register \"%s\" not supported", + reg_info->name); + return error; + } + YMMReg ymm; + ::memcpy(ymm.bytes, reg_value.GetBytes(), reg_value.GetByteSize()); + YMMToXState(ymm, ymm_reg->xmm, ymm_reg->ymm_hi); + } + if (WriteRegisterSet(set) != 0) error.SetErrorStringWithFormat("failed to write register set"); @@ -674,4 +742,18 @@ Status NativeRegisterContextOpenBSD_x86_64::WriteAllRegisterValues( return error; } + +std::optional +NativeRegisterContextOpenBSD_x86_64::GetYMMSplitReg(uint32_t reg) { + if (m_xsave_offsets[YMMRegSet] == k_xsave_offset_invalid) + return std::nullopt; + + uint32_t reg_index = reg - lldb_ymm0_x86_64; + auto *xmm = + reinterpret_cast(m_xsave.data() + k_xsave_offset_legacy_region); + auto *ymm = + reinterpret_cast(m_xsave.data() + m_xsave_offsets[YMMRegSet]); + return YMMSplitPtr{&xmm[reg_index], &ymm[reg_index]}; +} + #endif diff --git a/gnu/llvm/lldb/source/Plugins/Process/OpenBSD/NativeRegisterContextOpenBSD_x86_64.h b/gnu/llvm/lldb/source/Plugins/Process/OpenBSD/NativeRegisterContextOpenBSD_x86_64.h index 60e13da63..0be2a8b36 100644 --- a/gnu/llvm/lldb/source/Plugins/Process/OpenBSD/NativeRegisterContextOpenBSD_x86_64.h +++ b/gnu/llvm/lldb/source/Plugins/Process/OpenBSD/NativeRegisterContextOpenBSD_x86_64.h @@ -15,6 +15,9 @@ #include // clang-format on +#include +#include + #include "Plugins/Process/OpenBSD/NativeRegisterContextOpenBSD.h" #include "Plugins/Process/Utility/RegisterContext_x86.h" #include "Plugins/Process/Utility/lldb-x86-register-enums.h" @@ -52,16 +55,29 @@ protected: private: // Private member types. - enum { GPRegSet, FPRegSet }; + enum { + GPRegSet, + FPRegSet, + YMMRegSet, + MaxRegSet = YMMRegSet, + }; // Private member variables. struct reg m_gpr; struct fpreg m_fpr; + std::vector m_xsave; + std::array m_xsave_offsets; int GetSetForNativeRegNum(int reg_num) const; int ReadRegisterSet(uint32_t set); int WriteRegisterSet(uint32_t set); + + struct YMMSplitPtr { + void *xmm; + void *ymm_hi; + }; + std::optional GetYMMSplitReg(uint32_t reg); }; } // namespace process_openbsd diff --git a/gnu/llvm/lldb/source/Plugins/Process/OpenBSDKernel/RegisterContextOpenBSDKernel_arm64.cpp b/gnu/llvm/lldb/source/Plugins/Process/OpenBSDKernel/RegisterContextOpenBSDKernel_arm64.cpp index 1ebfc6a79..34fc80672 100644 --- a/gnu/llvm/lldb/source/Plugins/Process/OpenBSDKernel/RegisterContextOpenBSDKernel_arm64.cpp +++ b/gnu/llvm/lldb/source/Plugins/Process/OpenBSDKernel/RegisterContextOpenBSDKernel_arm64.cpp @@ -91,7 +91,7 @@ bool RegisterContextOpenBSDKernel_arm64::ReadRegister( value = (u_int64_t)sf.sf_x29; return true; case gpr_sp_arm64: - value = (u_int64_t)pcb.pcb_sp; + value = (u_int64_t)(pcb.pcb_sp + sizeof(sf)); return true; case gpr_pc_arm64: value = (u_int64_t)sf.sf_lr; diff --git a/gnu/llvm/lldb/source/Plugins/Process/OpenBSDKernel/RegisterContextOpenBSDKernel_i386.cpp b/gnu/llvm/lldb/source/Plugins/Process/OpenBSDKernel/RegisterContextOpenBSDKernel_i386.cpp index 9a909a4e0..fc644df23 100644 --- a/gnu/llvm/lldb/source/Plugins/Process/OpenBSDKernel/RegisterContextOpenBSDKernel_i386.cpp +++ b/gnu/llvm/lldb/source/Plugins/Process/OpenBSDKernel/RegisterContextOpenBSDKernel_i386.cpp @@ -62,12 +62,12 @@ bool RegisterContextOpenBSDKernel_i386::ReadRegister( if ((pcb.pcb_flags & PCB_SAVECTX) != 0) { uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB]; switch (reg) { -#define PCBREG(x) \ - case lldb_##x##_i386: \ - value = pcb.pcb_##x; \ return true; - PCBREG(ebp); - PCBREG(esp); + case lldb_esp_i386: + value = (u_int32_t)pcb.pcb_ebp; + return true; + case lldb_ebp_i386: + value = m_thread.GetProcess()->ReadPointerFromMemory(pcb.pcb_ebp, error); case lldb_eip_i386: value = m_thread.GetProcess()->ReadPointerFromMemory(pcb.pcb_ebp + 4, error); @@ -88,6 +88,10 @@ bool RegisterContextOpenBSDKernel_i386::ReadRegister( uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB]; switch (reg) { +#define PCBREG(x, offset) \ + case lldb_##x##_i386: \ + value = (u_int32_t)(pcb.pcb_##x + (offset)); \ + return true; #define SFREG(x) \ case lldb_##x##_i386: \ value = sf.sf_##x; \ diff --git a/gnu/llvm/lldb/source/Plugins/Process/OpenBSDKernel/RegisterContextOpenBSDKernel_x86_64.cpp b/gnu/llvm/lldb/source/Plugins/Process/OpenBSDKernel/RegisterContextOpenBSDKernel_x86_64.cpp index 501fa858a..e87b99867 100644 --- a/gnu/llvm/lldb/source/Plugins/Process/OpenBSDKernel/RegisterContextOpenBSDKernel_x86_64.cpp +++ b/gnu/llvm/lldb/source/Plugins/Process/OpenBSDKernel/RegisterContextOpenBSDKernel_x86_64.cpp @@ -77,9 +77,9 @@ bool RegisterContextOpenBSDKernel_x86_64::ReadRegister( case lldb_##x##_x86_64: \ value = (u_int64_t)sf.sf_##x; \ return true; -#define PCBREG(x) \ +#define PCBREG(x, offset) \ case lldb_##x##_x86_64: \ - value = pcb.pcb_##x; \ + value = pcb.pcb_##x + (offset); \ return true; switch (reg) { SFREG(r15); @@ -89,15 +89,14 @@ bool RegisterContextOpenBSDKernel_x86_64::ReadRegister( SFREG(rbp); SFREG(rbx); SFREG(rip); - PCBREG(rsp); + PCBREG(rsp, sizeof(sf)); } } else { switch (reg) { - PCBREG(rbp); - PCBREG(rsp); + PCBREG(rbp, 0); + PCBREG(rsp, 8); case lldb_rip_x86_64: - value = m_thread.GetProcess()->ReadPointerFromMemory(pcb.pcb_rbp + 8, - error); + value = m_thread.GetProcess()->ReadPointerFromMemory(pcb.pcb_rbp, error); return true; } } diff --git a/gnu/llvm/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/gnu/llvm/llvm/lib/CodeGen/PrologEpilogInserter.cpp index 89a45a83f..bc9738e35 100644 --- a/gnu/llvm/llvm/lib/CodeGen/PrologEpilogInserter.cpp +++ b/gnu/llvm/llvm/lib/CodeGen/PrologEpilogInserter.cpp @@ -1353,6 +1353,15 @@ void PEI::insertZeroCallUsedRegs(MachineFunction &MF) { for (MCRegister Reg : TRI.sub_and_superregs_inclusive(CSReg)) RegsToZero.reset(Reg); + // Don't touch the return protector register if it is used + const MachineFrameInfo &MFI = MF.getFrameInfo(); + if (MFI.hasReturnProtectorRegister()) { + MCRegister RGReg = MCRegister(MFI.getReturnProtectorRegister()); + for (MCRegister Reg : TRI.sub_and_superregs_inclusive(RGReg)) { + RegsToZero.reset(Reg); + } + } + const TargetFrameLowering &TFI = *MF.getSubtarget().getFrameLowering(); for (MachineBasicBlock &MBB : MF) if (MBB.isReturnBlock()) diff --git a/gnu/usr.bin/clang/include/clang/intrin/Makefile b/gnu/usr.bin/clang/include/clang/intrin/Makefile index 1ad66a36c..e408257d1 100644 --- a/gnu/usr.bin/clang/include/clang/intrin/Makefile +++ b/gnu/usr.bin/clang/include/clang/intrin/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.26 2023/11/11 18:35:35 robert Exp $ +# $OpenBSD: Makefile,v 1.27 2024/12/17 13:22:38 jca Exp $ .include @@ -140,6 +140,7 @@ HEADERS+= altivec.h \ htmxlintrin.h .elif ${MACHINE_ARCH} == "riscv64" GEN+= riscv_vector.h +HEADERS+= ${GEN} .endif all: ${HEADERS} diff --git a/lib/check_sym b/lib/check_sym index a7921c062..4e78c93cf 100755 --- a/lib/check_sym +++ b/lib/check_sym @@ -1,5 +1,5 @@ #!/bin/ksh -# $OpenBSD: check_sym,v 1.13 2024/09/03 08:49:16 tb Exp $ +# $OpenBSD: check_sym,v 1.14 2024/12/24 18:14:49 tb Exp $ # # Copyright (c) 2016,2019,2022 Philip Guenther # @@ -45,7 +45,7 @@ # /usr/lib if it wasn't present in the current directory. # # By default, check_sym places all its intermediate files in a -# temporary directory and removed it on exit. They contain useful +# temporary directory and removes it on exit. They contain useful # details for understanding what changed, so if the -k option is used # they will instead be placed in /tmp/ and left behind. If any of # them cannot be created by the user, the command will fail. The diff --git a/lib/libc/gen/getgrouplist.c b/lib/libc/gen/getgrouplist.c index 6f80a2412..1506ab631 100644 --- a/lib/libc/gen/getgrouplist.c +++ b/lib/libc/gen/getgrouplist.c @@ -1,4 +1,4 @@ -/* $OpenBSD: getgrouplist.c,v 1.30 2022/08/02 17:00:15 deraadt Exp $ */ +/* $OpenBSD: getgrouplist.c,v 1.31 2024/11/04 21:49:26 jca Exp $ */ /* * Copyright (c) 2008 Ingo Schwarze * Copyright (c) 1991, 1993 @@ -55,8 +55,7 @@ static int _read_netid(const char *, uid_t, gid_t*, int*, int); /* * Parse one string of the form "uid:gid[,gid[,...]]". - * If the uid matches, add the groups to the group list. - * If the groups fit, return 1, otherwise return -1. + * If the uid matches, add the groups to the group list and return 1. * If the uid does not match, return 0. */ static int @@ -89,15 +88,16 @@ _parse_netid(char *netid, uid_t uid, gid_t *groups, int *ngroups, continue; /* Skip this group if it is already in the list. */ - for (i = 0; i < *ngroups; i++) + for (i = 0; i < maxgroups && i < *ngroups; i++) if (groups[i] == gid) break; /* Try to add this new group to the list. */ if (i == *ngroups) { if (*ngroups >= maxgroups) - return (-1); - groups[(*ngroups)++] = gid; + (*ngroups)++; + else + groups[(*ngroups)++] = gid; } } return (1); @@ -144,7 +144,7 @@ _read_netid(const char *key, uid_t uid, gid_t *groups, int *ngroups, int getgrouplist(const char *uname, gid_t agroup, gid_t *groups, int *grpcnt) { - int i, ngroups = 0, ret = 0, maxgroups = *grpcnt, bail; + int i, ngroups = 0, maxgroups = *grpcnt, bail; int needyp = 0, foundyp = 0; int *skipyp = &foundyp; extern struct group *_getgrent_yp(int *); @@ -153,11 +153,10 @@ getgrouplist(const char *uname, gid_t agroup, gid_t *groups, int *grpcnt) /* * install primary group */ - if (ngroups >= maxgroups) { - *grpcnt = ngroups; - return (-1); - } - groups[ngroups++] = agroup; + if (ngroups >= maxgroups) + ngroups++; + else + groups[ngroups++] = agroup; /* * Scan the group file to find additional groups. @@ -174,18 +173,19 @@ getgrouplist(const char *uname, gid_t agroup, gid_t *groups, int *grpcnt) } if (grp->gr_gid == agroup) continue; - for (bail = 0, i = 0; bail == 0 && i < ngroups; i++) + for (bail = 0, i = 0; bail == 0 && i < maxgroups && + i < ngroups; i++) { if (groups[i] == grp->gr_gid) bail = 1; + } if (bail) continue; for (i = 0; grp->gr_mem[i]; i++) { if (!strcmp(grp->gr_mem[i], uname)) { - if (ngroups >= maxgroups) { - ret = -1; - goto out; - } - groups[ngroups++] = grp->gr_gid; + if (ngroups >= maxgroups) + ngroups++; + else + groups[ngroups++] = grp->gr_gid; break; } } @@ -210,24 +210,17 @@ getgrouplist(const char *uname, gid_t agroup, gid_t *groups, int *grpcnt) goto out; /* First scan the static netid file. */ - switch (_read_netid(key, pwstore.pw_uid, - groups, &ngroups, maxgroups)) { - case -1: - ret = -1; - /* FALLTHROUGH */ - case 1: + if (_read_netid(key, pwstore.pw_uid, groups, &ngroups, + maxgroups)) { free(key); goto out; - default: - break; } /* Only access YP when there is no static entry. */ if (!yp_match(__ypdomain, "netid.byname", key, (int)strlen(key), &ypdata, &ypdatalen)) - if (_parse_netid(ypdata, pwstore.pw_uid, - groups, &ngroups, maxgroups) == -1) - ret = -1; + _parse_netid(ypdata, pwstore.pw_uid, groups, &ngroups, + maxgroups); free(key); free(ypdata); @@ -237,6 +230,6 @@ getgrouplist(const char *uname, gid_t agroup, gid_t *groups, int *grpcnt) out: endgrent(); *grpcnt = ngroups; - return (ret); + return (ngroups > maxgroups ? -1 : 0); } DEF_WEAK(getgrouplist); diff --git a/lib/libc/gen/initgroups.c b/lib/libc/gen/initgroups.c index 8f60409dc..c19e5c8dd 100644 --- a/lib/libc/gen/initgroups.c +++ b/lib/libc/gen/initgroups.c @@ -1,4 +1,4 @@ -/* $OpenBSD: initgroups.c,v 1.11 2019/06/28 13:32:41 deraadt Exp $ */ +/* $OpenBSD: initgroups.c,v 1.12 2024/11/04 21:59:15 jca Exp $ */ /* * Copyright (c) 1983, 1993 * The Regents of the University of California. All rights reserved. @@ -37,10 +37,13 @@ int initgroups(const char *uname, gid_t agroup) { gid_t groups[NGROUPS_MAX]; - int ngroups; + int maxgroups, ngroups; - ngroups = NGROUPS_MAX; - (void) getgrouplist(uname, agroup, groups, &ngroups); + maxgroups = ngroups = NGROUPS_MAX; + if (getgrouplist(uname, agroup, groups, &ngroups) == -1) { + /* Silently truncate group list */ + ngroups = maxgroups; + } if (setgroups(ngroups, groups) == -1) return (-1); return (0); diff --git a/lib/libc/locale/mblen.3 b/lib/libc/locale/mblen.3 index 4523500c8..1474c5773 100644 --- a/lib/libc/locale/mblen.3 +++ b/lib/libc/locale/mblen.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: mblen.3,v 1.4 2022/03/29 18:15:52 naddy Exp $ +.\" $OpenBSD: mblen.3,v 1.5 2024/12/24 10:50:00 schwarze Exp $ .\" $NetBSD: mblen.3,v 1.4 2003/04/16 13:34:40 wiz Exp $ .\" .\" Copyright (c)2002 Citrus Project, @@ -25,7 +25,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: March 29 2022 $ +.Dd $Mdocdate: December 24 2024 $ .Dt MBLEN 3 .Os .\" ---------------------------------------------------------------------- @@ -41,22 +41,22 @@ .Sh DESCRIPTION The .Fn mblen -function usually determines the number of bytes in -a multibyte character pointed to by -.Fa s -and returns it. -This function shall only examine max n bytes of the array beginning from +function returns the number of bytes +in the first multibyte character of the multibyte string +.Fa s . +It examines at most the first +.Fa n +bytes of .Fa s . .Pp In state-dependent encodings, .Fa s -may point the special sequence bytes to change the shift-state. -Although such sequence bytes corresponds to no individual -wide-character code, -the +may point to special sequence bytes changing the shift state. +Although such sequence bytes correspond to no wide character, +they affect the internal conversion state of the .Fn mblen -changes the own state by them and treats them -as if they are a part of the subsequent multibyte character. +function, and are treated +as if they were part of the subsequent multibyte character. .Pp Unlike .Xr mbrlen 3 , @@ -75,19 +75,18 @@ function is not affected: mbtowc(NULL, s, n); .Ed .Pp -Calling any other functions in +Calling any other function in .Em libc -never change the internal -state of the +never changes the internal state of .Fn mblen , except for calling .Xr setlocale 3 -with the +with an .Dv LC_CTYPE -category changed to that of the current locale. +that differs from the current locale. Such .Xr setlocale 3 -calls cause the internal state of this function to be indeterminate. +calls cause the internal state of this function to become indeterminate. .Pp The behaviour of .Fn mblen @@ -116,17 +115,17 @@ always fails. .El .\" ---------------------------------------------------------------------- .Sh RETURN VALUES -Normally, +The .Fn mblen -returns: +function returns: .Bl -tag -width 0123456789 .It "0" .Fa s -points to a null byte +points to a NUL byte .Pq Sq \e0 . .It "positive" The value returned is -a number of bytes for the valid multibyte character pointed to by +the number of bytes in the valid multibyte character pointed to by .Fa s . There are no cases when this value is greater than .Fa n diff --git a/lib/libc/string/memccpy.3 b/lib/libc/string/memccpy.3 index ac5719918..49b8ab5d2 100644 --- a/lib/libc/string/memccpy.3 +++ b/lib/libc/string/memccpy.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: memccpy.3,v 1.13 2022/09/11 06:38:11 jmc Exp $ +.\" $OpenBSD: memccpy.3,v 1.14 2024/12/11 23:28:20 jsg Exp $ .\" .\" Copyright (c) 1990, 1991, 1993 .\" The Regents of the University of California. All rights reserved. @@ -29,7 +29,7 @@ .\" .\" @(#)memccpy.3 8.1 (Berkeley) 6/9/93 .\" -.Dd $Mdocdate: September 11 2022 $ +.Dd $Mdocdate: December 11 2024 $ .Dt MEMCCPY 3 .Os .Sh NAME @@ -78,4 +78,4 @@ The function first appeared in .At V and was reimplemented for -.Bx 4.3 Tahoe . +.Bx 4.3 . diff --git a/lib/libc/string/memchr.3 b/lib/libc/string/memchr.3 index 2c961b633..fa5809fa9 100644 --- a/lib/libc/string/memchr.3 +++ b/lib/libc/string/memchr.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: memchr.3,v 1.13 2022/09/11 06:38:11 jmc Exp $ +.\" $OpenBSD: memchr.3,v 1.14 2024/12/11 23:28:20 jsg Exp $ .\" .\" Copyright (c) 1990, 1991 The Regents of the University of California. .\" All rights reserved. @@ -31,7 +31,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: September 11 2022 $ +.Dd $Mdocdate: December 11 2024 $ .Dt MEMCHR 3 .Os .Sh NAME @@ -99,4 +99,4 @@ The function first appeared in .At V and was reimplemented for -.Bx 4.3 Tahoe . +.Bx 4.3 . diff --git a/lib/libc/string/memcmp.3 b/lib/libc/string/memcmp.3 index 86a95c8c1..ace8f7925 100644 --- a/lib/libc/string/memcmp.3 +++ b/lib/libc/string/memcmp.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: memcmp.3,v 1.10 2022/09/11 06:38:11 jmc Exp $ +.\" $OpenBSD: memcmp.3,v 1.11 2024/12/11 23:28:20 jsg Exp $ .\" .\" Copyright (c) 1990, 1991 The Regents of the University of California. .\" All rights reserved. @@ -31,7 +31,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: September 11 2022 $ +.Dd $Mdocdate: December 11 2024 $ .Dt MEMCMP 3 .Os .Sh NAME @@ -83,4 +83,4 @@ The function first appeared in .At V and was reimplemented for -.Bx 4.3 Tahoe . +.Bx 4.3 . diff --git a/lib/libc/string/memcpy.3 b/lib/libc/string/memcpy.3 index 8df2a785b..b093afc91 100644 --- a/lib/libc/string/memcpy.3 +++ b/lib/libc/string/memcpy.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: memcpy.3,v 1.10 2013/06/05 03:39:23 tedu Exp $ +.\" $OpenBSD: memcpy.3,v 1.11 2024/12/11 23:28:20 jsg Exp $ .\" .\" Copyright (c) 1990, 1991 The Regents of the University of California. .\" All rights reserved. @@ -31,7 +31,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: June 5 2013 $ +.Dd $Mdocdate: December 11 2024 $ .Dt MEMCPY 3 .Os .Sh NAME @@ -76,4 +76,4 @@ The function first appeared in .At V and was reimplemented for -.Bx 4.3 Tahoe . +.Bx 4.3 . diff --git a/lib/libc/string/memset.3 b/lib/libc/string/memset.3 index 0051ff615..34f2ca788 100644 --- a/lib/libc/string/memset.3 +++ b/lib/libc/string/memset.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: memset.3,v 1.9 2022/09/11 06:38:11 jmc Exp $ +.\" $OpenBSD: memset.3,v 1.10 2024/12/11 23:28:20 jsg Exp $ .\" .\" Copyright (c) 1990, 1991 The Regents of the University of California. .\" All rights reserved. @@ -31,7 +31,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: September 11 2022 $ +.Dd $Mdocdate: December 11 2024 $ .Dt MEMSET 3 .Os .Sh NAME @@ -72,4 +72,4 @@ The function first appeared in .At V and was reimplemented for -.Bx 4.3 Tahoe . +.Bx 4.3 . diff --git a/lib/libc/string/strchr.3 b/lib/libc/string/strchr.3 index 07e7f29f5..d1dc67e5e 100644 --- a/lib/libc/string/strchr.3 +++ b/lib/libc/string/strchr.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: strchr.3,v 1.13 2018/10/01 06:37:37 martijn Exp $ +.\" $OpenBSD: strchr.3,v 1.14 2024/12/11 23:28:20 jsg Exp $ .\" .\" Copyright (c) 1990, 1991 The Regents of the University of California. .\" All rights reserved. @@ -31,7 +31,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: October 1 2018 $ +.Dd $Mdocdate: December 11 2024 $ .Dt STRCHR 3 .Os .Sh NAME @@ -113,4 +113,4 @@ The function first appeared in .At III and was reimplemented for -.Bx 4.3 Tahoe . +.Bx 4.3 . diff --git a/lib/libc/string/strcspn.3 b/lib/libc/string/strcspn.3 index 07eb9ca26..91e5c3f1c 100644 --- a/lib/libc/string/strcspn.3 +++ b/lib/libc/string/strcspn.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: strcspn.3,v 1.11 2013/06/05 03:39:23 tedu Exp $ +.\" $OpenBSD: strcspn.3,v 1.12 2024/12/11 23:28:20 jsg Exp $ .\" .\" Copyright (c) 1990, 1991 The Regents of the University of California. .\" All rights reserved. @@ -31,7 +31,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: June 5 2013 $ +.Dd $Mdocdate: December 11 2024 $ .Dt STRCSPN 3 .Os .Sh NAME @@ -105,4 +105,4 @@ The function first appeared in .At III and was reimplemented for -.Bx 4.3 Tahoe . +.Bx 4.3 . diff --git a/lib/libc/string/strpbrk.3 b/lib/libc/string/strpbrk.3 index b758df685..51d2edf5b 100644 --- a/lib/libc/string/strpbrk.3 +++ b/lib/libc/string/strpbrk.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: strpbrk.3,v 1.10 2013/06/05 03:39:23 tedu Exp $ +.\" $OpenBSD: strpbrk.3,v 1.11 2024/12/11 23:28:20 jsg Exp $ .\" .\" Copyright (c) 1990, 1991 The Regents of the University of California. .\" All rights reserved. @@ -31,7 +31,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: June 5 2013 $ +.Dd $Mdocdate: December 11 2024 $ .Dt STRPBRK 3 .Os .Sh NAME @@ -77,4 +77,4 @@ The function first appeared in .At III and was reimplemented for -.Bx 4.3 Tahoe . +.Bx 4.3 . diff --git a/lib/libc/string/strrchr.3 b/lib/libc/string/strrchr.3 index 5abb88ec7..231260f7f 100644 --- a/lib/libc/string/strrchr.3 +++ b/lib/libc/string/strrchr.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: strrchr.3,v 1.12 2018/10/01 06:37:37 martijn Exp $ +.\" $OpenBSD: strrchr.3,v 1.13 2024/12/11 23:28:20 jsg Exp $ .\" .\" Copyright (c) 1990, 1991 The Regents of the University of California. .\" All rights reserved. @@ -31,7 +31,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: October 1 2018 $ +.Dd $Mdocdate: December 11 2024 $ .Dt STRRCHR 3 .Os .Sh NAME @@ -115,4 +115,4 @@ The function first appeared in .At III and was reimplemented for -.Bx 4.3 Tahoe . +.Bx 4.3 . diff --git a/lib/libc/string/strspn.3 b/lib/libc/string/strspn.3 index e339d9b6a..e677ba15a 100644 --- a/lib/libc/string/strspn.3 +++ b/lib/libc/string/strspn.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: strspn.3,v 1.11 2013/06/05 03:39:23 tedu Exp $ +.\" $OpenBSD: strspn.3,v 1.12 2024/12/11 23:28:20 jsg Exp $ .\" .\" Copyright (c) 1990, 1991 The Regents of the University of California. .\" All rights reserved. @@ -31,7 +31,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: June 5 2013 $ +.Dd $Mdocdate: December 11 2024 $ .Dt STRSPN 3 .Os .Sh NAME @@ -89,4 +89,4 @@ The function first appeared in .At III and was reimplemented for -.Bx 4.3 Tahoe . +.Bx 4.3 . diff --git a/lib/libc/string/strtok.3 b/lib/libc/string/strtok.3 index 0f1f359ec..a28f72d6f 100644 --- a/lib/libc/string/strtok.3 +++ b/lib/libc/string/strtok.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: strtok.3,v 1.23 2017/09/02 13:56:44 schwarze Exp $ +.\" $OpenBSD: strtok.3,v 1.24 2024/12/11 23:28:20 jsg Exp $ .\" .\" Copyright (c) 1988, 1991 The Regents of the University of California. .\" All rights reserved. @@ -31,7 +31,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: September 2 2017 $ +.Dd $Mdocdate: December 11 2024 $ .Dt STRTOK 3 .Os .Sh NAME @@ -149,7 +149,7 @@ The function first appeared in .At III and was reimplemented for -.Bx 4.3 Tahoe . +.Bx 4.3 . The .Fn strtok_r function first appeared in diff --git a/lib/libc/sys/ptrace.2 b/lib/libc/sys/ptrace.2 index 06dd079a9..9b4b083ff 100644 --- a/lib/libc/sys/ptrace.2 +++ b/lib/libc/sys/ptrace.2 @@ -1,8 +1,8 @@ -.\" $OpenBSD: ptrace.2,v 1.43 2022/09/11 06:38:11 jmc Exp $ +.\" $OpenBSD: ptrace.2,v 1.44 2024/11/27 05:25:56 anton Exp $ .\" $NetBSD: ptrace.2,v 1.3 1996/02/23 01:39:41 jtc Exp $ .\" .\" This file is in the public domain. -.Dd $Mdocdate: September 11 2022 $ +.Dd $Mdocdate: November 27 2024 $ .Dt PTRACE 2 .Os .Sh NAME @@ -500,6 +500,58 @@ pointed to by The window cookie needs to be .Sq XOR'ed to stack-saved program counters. +.It Dv PT_GETXSTATE_INFO Pq amd64 only +This request can be used to obtain details about the traced process XSAVE area, +specified in a +.Dq Li "struct ptrace_xstate_info" +defined as follows: +.Bd -literal -offset indent +struct ptrace_xstate_info { + uint64_t xsave_mask; + uint32_t xsave_len; +}; +.Ed +.Pp +The +.Fa xsave_mask +field denotes the enabled XSAVE components. +The +.Fa xsave_len +field denotes the size of XSAVE area intended to be used with the +.Dv PT_GETXSTATE +and +.Dv PT_SETXSTATE +requests. +.Pp +A pointer to +.Dq Li "struct ptrace_xstate_info" +must be passed in +.Fa addr +and the +.Fa data +argument must be set to +.Li sizeof(struct ptrace_xstate_info) . +.It Dv PT_GETXSTATE Pq amd64 only +This request can be used to read the XSAVE area of the traced process. +A pointer to a buffer must be passed in +.Fa addr +with a capacity of the length obtained using the +.Dv PT_GETXSTATE_INFO +request. +The +.Fa data +argument must reflect the same length. +.It Dv PT_SETXSTATE Pq amd64 only +This request can be used to write the XSAVE area of the traced process. +Only changes to the x87, SSE and AVX state components are honored. +A pointer to a buffer must be passed in +.Fa addr +with a capacity of the length obtained using the +.Dv PT_GETXSTATE_INFO +request. +The +.Fa data +argument must reflect the same length. .El .Sh ERRORS Some requests can cause @@ -579,6 +631,12 @@ An attempt was made to use .Dv PT_ATTACH on a system process. .El +.It Bq Er ENOTSUP +.Dv PT_GETXSTATE_INFO , +.Dv PT_GETXSTATE , +or +.Dv PT_SETXSTATE +was attempted on a CPU lacking support for XSAVE. .El .Sh HISTORY The diff --git a/lib/libc/sys/sysctl.2 b/lib/libc/sys/sysctl.2 index 61eb4826e..b72a2f46f 100644 --- a/lib/libc/sys/sysctl.2 +++ b/lib/libc/sys/sysctl.2 @@ -1,4 +1,4 @@ -.\" $OpenBSD: sysctl.2,v 1.58 2024/10/10 22:21:05 lucas Exp $ +.\" $OpenBSD: sysctl.2,v 1.60 2024/11/21 11:58:45 jca Exp $ .\" .\" Copyright (c) 1993 .\" The Regents of the University of California. All rights reserved. @@ -27,7 +27,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: October 10 2024 $ +.Dd $Mdocdate: November 21 2024 $ .Dt SYSCTL 2 .Os .Sh NAME @@ -131,7 +131,7 @@ listed here, and described in separate sections below. .It Dv CTL_MACHDEP Ta "sys/sysctl.h" Ta "Machine dependent" .It Dv CTL_NET Ta "sys/socket.h" Ta "Networking" .It Dv CTL_VFS Ta "ufs/ffs/ffs_extern.h" Ta "Virtual file system" -.It Dv CTL_VM Ta "uvm/uvm_param.h" Ta "Virtual memory" +.It Dv CTL_VM Ta "uvm/uvmexp.h" Ta "Virtual memory" .El .Pp For example, the following retrieves the maximum number of processes allowed @@ -386,6 +386,10 @@ Can be one of .Dq auto , or .Dq high . +If the policy contains a comma, the second part specifies an alternative +policy used while the system is running on battery. +The default setting is +.Dq high,auto . .It Dv HW_PHYSMEM The total physical memory, in bytes. This variable is deprecated; use @@ -2388,7 +2392,7 @@ identifiers second level network identifiers .It In sys/gmon.h third level profiling identifiers -.It In uvm/uvm_param.h +.It In uvm/uvmexp.h second level virtual memory identifiers .It In uvm/uvm_swap_encrypt.h third level virtual memory identifiers diff --git a/lib/libcrypto/Makefile b/lib/libcrypto/Makefile index 6a1d12595..db3bc767d 100644 --- a/lib/libcrypto/Makefile +++ b/lib/libcrypto/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.214 2024/10/19 08:26:03 tb Exp $ +# $OpenBSD: Makefile,v 1.231 2024/12/19 23:56:32 tb Exp $ LIB= crypto LIBREBUILD=y @@ -43,6 +43,7 @@ CFLAGS+= -I${LCRYPTO_SRC}/hidden CFLAGS+= -I${LCRYPTO_SRC}/hmac CFLAGS+= -I${LCRYPTO_SRC}/kdf CFLAGS+= -I${LCRYPTO_SRC}/lhash +CFLAGS+= -I${LCRYPTO_SRC}/mlkem CFLAGS+= -I${LCRYPTO_SRC}/modes CFLAGS+= -I${LCRYPTO_SRC}/ocsp CFLAGS+= -I${LCRYPTO_SRC}/pkcs12 @@ -56,16 +57,12 @@ VERSION_SCRIPT= Symbols.map SYMBOL_LIST= ${.CURDIR}/Symbols.list # crypto/ -SRCS+= cpt_err.c -SRCS+= cryptlib.c +SRCS+= crypto_err.c SRCS+= crypto_ex_data.c SRCS+= crypto_init.c +SRCS+= crypto_legacy.c SRCS+= crypto_lock.c -SRCS+= cversion.c -SRCS+= malloc-wrapper.c -SRCS+= mem_clr.c -SRCS+= mem_dbg.c -SRCS+= o_fips.c +SRCS+= crypto_memory.c # aes/ SRCS+= aes.c @@ -281,19 +278,15 @@ SRCS+= dsa_prn.c # ec/ SRCS+= ec_ameth.c SRCS+= ec_asn1.c +SRCS+= ec_convert.c SRCS+= ec_curve.c SRCS+= ec_err.c SRCS+= ec_key.c -SRCS+= ec_kmeth.c SRCS+= ec_lib.c SRCS+= ec_mult.c -SRCS+= ec_oct.c SRCS+= ec_pmeth.c -SRCS+= ec_print.c SRCS+= eck_prn.c -SRCS+= ecp_mont.c -SRCS+= ecp_oct.c -SRCS+= ecp_smpl.c +SRCS+= ecp_methods.c SRCS+= ecx_methods.c # ecdh/ @@ -379,6 +372,10 @@ SRCS+= md4.c # md5/ SRCS+= md5.c +# mlkem/ +SRCS+= mlkem768.c +SRCS+= mlkem1024.c + # modes/ SRCS+= cbc128.c SRCS+= ccm128.c @@ -615,6 +612,7 @@ SRCS+= x_all.c ${LCRYPTO_SRC}/lhash \ ${LCRYPTO_SRC}/md4 \ ${LCRYPTO_SRC}/md5 \ + ${LCRYPTO_SRC}/mlkem \ ${LCRYPTO_SRC}/modes \ ${LCRYPTO_SRC}/objects \ ${LCRYPTO_SRC}/ocsp \ diff --git a/lib/libcrypto/aes/aes_core.c b/lib/libcrypto/aes/aes_core.c index 0472d5f4e..4383d7490 100644 --- a/lib/libcrypto/aes/aes_core.c +++ b/lib/libcrypto/aes/aes_core.c @@ -1,4 +1,4 @@ -/* $OpenBSD: aes_core.c,v 1.24 2024/08/11 13:02:39 jsing Exp $ */ +/* $OpenBSD: aes_core.c,v 1.25 2024/11/13 21:00:57 tb Exp $ */ /** * rijndael-alg-fst.c * @@ -1021,7 +1021,7 @@ aes_encrypt_internal(const unsigned char *in, unsigned char *out, void AES_encrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key) { - return aes_encrypt_internal(in, out, key); + aes_encrypt_internal(in, out, key); } LCRYPTO_ALIAS(AES_encrypt); @@ -1224,6 +1224,6 @@ aes_decrypt_internal(const unsigned char *in, unsigned char *out, void AES_decrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key) { - return aes_decrypt_internal(in, out, key); + aes_decrypt_internal(in, out, key); } LCRYPTO_ALIAS(AES_decrypt); diff --git a/lib/libcrypto/arch/aarch64/Makefile.inc b/lib/libcrypto/arch/aarch64/Makefile.inc index a17ef7f5a..20a634dc9 100644 --- a/lib/libcrypto/arch/aarch64/Makefile.inc +++ b/lib/libcrypto/arch/aarch64/Makefile.inc @@ -1,15 +1,7 @@ -# $OpenBSD: Makefile.inc,v 1.13 2024/03/29 07:24:09 jsing Exp $ +# $OpenBSD: Makefile.inc,v 1.14 2024/11/08 13:34:24 jsing Exp $ # aarch64-specific libcrypto build rules -.for dir f in ${SSLASM} -SRCS+= ${f}.S -GENERATED+=${f}.S -${f}.S: ${LCRYPTO_SRC}/${dir}/asm/${f}.pl - /usr/bin/perl \ - ${LCRYPTO_SRC}/${dir}/asm/${f}.pl void ${.TARGET} > ${.TARGET} -.endfor +SRCS += crypto_cpu_caps.c -CFLAGS+= -DOPENSSL_CPUID_OBJ AFLAGS+= -mmark-bti-property -SRCS+= arm64cpuid.S arm64cap.c diff --git a/lib/libcrypto/arch/aarch64/arm64_arch.h b/lib/libcrypto/arch/aarch64/arm64_arch.h deleted file mode 100644 index 7f35acaa7..000000000 --- a/lib/libcrypto/arch/aarch64/arm64_arch.h +++ /dev/null @@ -1,59 +0,0 @@ -/* $OpenBSD: arm64_arch.h,v 1.1 2022/03/23 15:13:31 tb Exp $ */ -#ifndef __ARM_ARCH_H__ -#define __ARM_ARCH_H__ - -#if !defined(__ARM_ARCH__) -# if defined(__CC_ARM) -# define __ARM_ARCH__ __TARGET_ARCH_ARM -# if defined(__BIG_ENDIAN) -# define __ARMEB__ -# else -# define __ARMEL__ -# endif -# elif defined(__GNUC__) - /* - * Why doesn't gcc define __ARM_ARCH__? Instead it defines - * bunch of below macros. See all_architectures[] table in - * gcc/config/arm/arm.c. On a side note it defines - * __ARMEL__/__ARMEB__ for little-/big-endian. - */ -# if defined(__ARM_ARCH) -# define __ARM_ARCH__ __ARM_ARCH -# elif defined(__ARM_ARCH_8A__) -# define __ARM_ARCH__ 8 -# elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || \ - defined(__ARM_ARCH_7R__)|| defined(__ARM_ARCH_7M__) || \ - defined(__ARM_ARCH_7EM__) -# define __ARM_ARCH__ 7 -# elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || \ - defined(__ARM_ARCH_6K__)|| defined(__ARM_ARCH_6M__) || \ - defined(__ARM_ARCH_6Z__)|| defined(__ARM_ARCH_6ZK__) || \ - defined(__ARM_ARCH_6T2__) -# define __ARM_ARCH__ 6 -# elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) || \ - defined(__ARM_ARCH_5E__)|| defined(__ARM_ARCH_5TE__) || \ - defined(__ARM_ARCH_5TEJ__) -# define __ARM_ARCH__ 5 -# elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__) -# define __ARM_ARCH__ 4 -# else -# error "unsupported ARM architecture" -# endif -# endif -#endif - -#if !defined(__ASSEMBLER__) -extern unsigned int OPENSSL_armcap_P; - -#define ARMV7_NEON (1<<0) -#define ARMV8_AES (1<<1) -#define ARMV8_SHA1 (1<<2) -#define ARMV8_SHA256 (1<<3) -#define ARMV8_PMULL (1<<4) -#endif - -#if defined(__OpenBSD__) -#define __STRICT_ALIGNMENT -#endif - -#endif diff --git a/lib/libcrypto/arch/aarch64/arm64cap.c b/lib/libcrypto/arch/aarch64/arm64cap.c deleted file mode 100644 index aeacebfcb..000000000 --- a/lib/libcrypto/arch/aarch64/arm64cap.c +++ /dev/null @@ -1,138 +0,0 @@ -/* $OpenBSD: arm64cap.c,v 1.4 2024/08/29 03:30:05 deraadt Exp $ */ -#include -#include -#include -#include -#include -#include - -#if defined(__OpenBSD__) -#include -#include /* CPU_ID_AA64ISAR0 */ -#endif - -#include "arm64_arch.h" - -/* ID_AA64ISAR0_EL1 required for OPENSSL_cpuid_setup */ -#define ID_AA64ISAR0_AES_SHIFT 4 -#define ID_AA64ISAR0_AES_MASK (0xf << ID_AA64ISAR0_AES_SHIFT) -#define ID_AA64ISAR0_AES(x) ((x) & ID_AA64ISAR0_AES_MASK) -#define ID_AA64ISAR0_AES_BASE (0x1 << ID_AA64ISAR0_AES_SHIFT) -#define ID_AA64ISAR0_AES_PMULL (0x2 << ID_AA64ISAR0_AES_SHIFT) -#define ID_AA64ISAR0_SHA1_SHIFT 8 -#define ID_AA64ISAR0_SHA1_MASK (0xf << ID_AA64ISAR0_SHA1_SHIFT) -#define ID_AA64ISAR0_SHA1(x) ((x) & ID_AA64ISAR0_SHA1_MASK) -#define ID_AA64ISAR0_SHA1_BASE (0x1 << ID_AA64ISAR0_SHA1_SHIFT) -#define ID_AA64ISAR0_SHA2_SHIFT 12 -#define ID_AA64ISAR0_SHA2_MASK (0xf << ID_AA64ISAR0_SHA2_SHIFT) -#define ID_AA64ISAR0_SHA2(x) ((x) & ID_AA64ISAR0_SHA2_MASK) -#define ID_AA64ISAR0_SHA2_BASE (0x1 << ID_AA64ISAR0_SHA2_SHIFT) - -unsigned int OPENSSL_armcap_P; - -#if defined(CPU_ID_AA64ISAR0) -void -OPENSSL_cpuid_setup(void) -{ - int isar0_mib[] = { CTL_MACHDEP, CPU_ID_AA64ISAR0 }; - size_t len = sizeof(uint64_t); - uint64_t cpu_id = 0; - - if (OPENSSL_armcap_P != 0) - return; - - if (sysctl(isar0_mib, 2, &cpu_id, &len, NULL, 0) < 0) - return; - - OPENSSL_armcap_P |= ARMV7_NEON; - - if (ID_AA64ISAR0_AES(cpu_id) >= ID_AA64ISAR0_AES_BASE) - OPENSSL_armcap_P |= ARMV8_AES; - - if (ID_AA64ISAR0_AES(cpu_id) >= ID_AA64ISAR0_AES_PMULL) - OPENSSL_armcap_P |= ARMV8_PMULL; - - if (ID_AA64ISAR0_SHA1(cpu_id) >= ID_AA64ISAR0_SHA1_BASE) - OPENSSL_armcap_P |= ARMV8_SHA1; - - if (ID_AA64ISAR0_SHA2(cpu_id) >= ID_AA64ISAR0_SHA2_BASE) - OPENSSL_armcap_P |= ARMV8_SHA256; -} -#else -#if __ARM_ARCH__ >= 7 -static sigset_t all_masked; - -static sigjmp_buf ill_jmp; - -static void -ill_handler(int sig) -{ - siglongjmp(ill_jmp, sig); -} - -/* - * Following subroutines could have been inlined, but it's not all - * ARM compilers support inline assembler... - */ -void _armv7_neon_probe(void); -void _armv8_aes_probe(void); -void _armv8_sha1_probe(void); -void _armv8_sha256_probe(void); -void _armv8_pmull_probe(void); -#endif - -void -OPENSSL_cpuid_setup(void) -{ -#if __ARM_ARCH__ >= 7 - struct sigaction ill_oact, ill_act; - sigset_t oset; -#endif - static int trigger = 0; - - if (trigger) - return; - trigger = 1; - - OPENSSL_armcap_P = 0; - -#if __ARM_ARCH__ >= 7 - sigfillset(&all_masked); - sigdelset(&all_masked, SIGILL); - sigdelset(&all_masked, SIGTRAP); - sigdelset(&all_masked, SIGFPE); - sigdelset(&all_masked, SIGBUS); - sigdelset(&all_masked, SIGSEGV); - - memset(&ill_act, 0, sizeof(ill_act)); - ill_act.sa_handler = ill_handler; - ill_act.sa_mask = all_masked; - - sigprocmask(SIG_SETMASK, &ill_act.sa_mask, &oset); - sigaction(SIGILL, &ill_act, &ill_oact); - - if (sigsetjmp(ill_jmp, 1) == 0) { - _armv7_neon_probe(); - OPENSSL_armcap_P |= ARMV7_NEON; - if (sigsetjmp(ill_jmp, 1) == 0) { - _armv8_pmull_probe(); - OPENSSL_armcap_P |= ARMV8_PMULL | ARMV8_AES; - } else if (sigsetjmp(ill_jmp, 1) == 0) { - _armv8_aes_probe(); - OPENSSL_armcap_P |= ARMV8_AES; - } - if (sigsetjmp(ill_jmp, 1) == 0) { - _armv8_sha1_probe(); - OPENSSL_armcap_P |= ARMV8_SHA1; - } - if (sigsetjmp(ill_jmp, 1) == 0) { - _armv8_sha256_probe(); - OPENSSL_armcap_P |= ARMV8_SHA256; - } - } - - sigaction (SIGILL, &ill_oact, NULL); - sigprocmask(SIG_SETMASK, &oset, NULL); -#endif -} -#endif diff --git a/lib/libcrypto/arch/aarch64/arm64cpuid.S b/lib/libcrypto/arch/aarch64/arm64cpuid.S deleted file mode 100644 index 96a9c76fb..000000000 --- a/lib/libcrypto/arch/aarch64/arm64cpuid.S +++ /dev/null @@ -1,53 +0,0 @@ -#include "arm64_arch.h" - -.text -.arch armv8-a+crypto+sha3 - -.align 5 -.globl _armv7_neon_probe -.type _armv7_neon_probe,%function -_armv7_neon_probe: - bti c - orr v15.16b, v15.16b, v15.16b - ret -.size _armv7_neon_probe,.-_armv7_neon_probe - -.globl _armv8_aes_probe -.type _armv8_aes_probe,%function -_armv8_aes_probe: - bti c - aese v0.16b, v0.16b - ret -.size _armv8_aes_probe,.-_armv8_aes_probe - -.globl _armv8_sha1_probe -.type _armv8_sha1_probe,%function -_armv8_sha1_probe: - bti c - sha1h s0, s0 - ret -.size _armv8_sha1_probe,.-_armv8_sha1_probe - -.globl _armv8_sha256_probe -.type _armv8_sha256_probe,%function -_armv8_sha256_probe: - bti c - sha256su0 v0.4s, v0.4s - ret -.size _armv8_sha256_probe,.-_armv8_sha256_probe - -.globl _armv8_pmull_probe -.type _armv8_pmull_probe,%function -_armv8_pmull_probe: - bti c - pmull v0.1q, v0.1d, v0.1d - ret -.size _armv8_pmull_probe,.-_armv8_pmull_probe - -.globl _armv8_sha512_probe -.type _armv8_sha512_probe,%function -_armv8_sha512_probe: - bti c - sha512su0 v0.2d,v0.2d - ret -.size _armv8_sha512_probe,.-_armv8_sha512_probe diff --git a/lib/libcrypto/arch/aarch64/crypto_arch.h b/lib/libcrypto/arch/aarch64/crypto_arch.h index a3dd98d0c..b0188c498 100644 --- a/lib/libcrypto/arch/aarch64/crypto_arch.h +++ b/lib/libcrypto/arch/aarch64/crypto_arch.h @@ -1,4 +1,4 @@ -/* $OpenBSD: crypto_arch.h,v 1.1 2024/08/11 13:02:39 jsing Exp $ */ +/* $OpenBSD: crypto_arch.h,v 1.2 2024/11/08 13:34:24 jsing Exp $ */ /* * Copyright (c) 2024 Joel Sing * @@ -15,7 +15,22 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include + #ifndef HEADER_CRYPTO_ARCH_H #define HEADER_CRYPTO_ARCH_H +#define HAVE_CRYPTO_CPU_CAPS_INIT + +#ifndef __ASSEMBLER__ +extern uint64_t crypto_cpu_caps_aarch64; +#endif + +#define CRYPTO_CPU_CAPS_AARCH64_AES (1ULL << 0) +#define CRYPTO_CPU_CAPS_AARCH64_PMULL (1ULL << 1) +#define CRYPTO_CPU_CAPS_AARCH64_SHA1 (1ULL << 2) +#define CRYPTO_CPU_CAPS_AARCH64_SHA2 (1ULL << 3) +#define CRYPTO_CPU_CAPS_AARCH64_SHA512 (1ULL << 4) +#define CRYPTO_CPU_CAPS_AARCH64_SHA3 (1ULL << 5) + #endif diff --git a/lib/libcrypto/arch/aarch64/crypto_cpu_caps.c b/lib/libcrypto/arch/aarch64/crypto_cpu_caps.c new file mode 100644 index 000000000..b31a50ef7 --- /dev/null +++ b/lib/libcrypto/arch/aarch64/crypto_cpu_caps.c @@ -0,0 +1,97 @@ +/* $OpenBSD: crypto_cpu_caps.c,v 1.2 2024/11/12 13:52:31 jsing Exp $ */ +/* + * Copyright (c) 2023 Joel Sing + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +#include + +#include +#include + +#include "crypto_arch.h" + +/* Machine dependent CPU capabilities. */ +uint64_t crypto_cpu_caps_aarch64; + +static inline uint64_t +extract_bits(uint64_t val, int start, int end) +{ + return (val >> end) & (1ULL << (1 + start - end)) - 1; +} + +static uint64_t +parse_isar0(uint64_t isar0) +{ + uint64_t caps = 0; + uint64_t feature; + + /* AES - bits [7:4] */ + feature = extract_bits(isar0, 7, 4); + if (feature >= 1) + caps |= CRYPTO_CPU_CAPS_AARCH64_AES; + if (feature >= 2) + caps |= CRYPTO_CPU_CAPS_AARCH64_PMULL; + + /* SHA1 - bits [11:8] */ + feature = extract_bits(isar0, 11, 8); + if (feature >= 1) + caps |= CRYPTO_CPU_CAPS_AARCH64_SHA1; + + /* SHA2 - bits [15:12] */ + feature = extract_bits(isar0, 15, 12); + if (feature >= 1) + caps |= CRYPTO_CPU_CAPS_AARCH64_SHA2; + if (feature >= 2) + caps |= CRYPTO_CPU_CAPS_AARCH64_SHA512; + + /* SHA3 - bits [35:32] */ + feature = extract_bits(isar0, 35, 32); + if (feature >= 1) + caps |= CRYPTO_CPU_CAPS_AARCH64_SHA3; + + return caps; +} + +static int +read_isar0(uint64_t *isar0) +{ + uint64_t isar; + int mib[2]; + size_t len; + + mib[0] = CTL_MACHDEP; + mib[1] = CPU_ID_AA64ISAR0; + len = sizeof(isar); + if (sysctl(mib, 2, &isar, &len, NULL, 0) == -1) + return 0; + + *isar0 = isar; + + return 1; +} + +void +crypto_cpu_caps_init(void) +{ + uint64_t isar = 0; + + if (!read_isar0(&isar)) + return; + + crypto_cpu_caps_aarch64 = parse_isar0(isar); +} diff --git a/lib/libcrypto/arch/aarch64/opensslconf.h b/lib/libcrypto/arch/aarch64/opensslconf.h index d658f297a..d844ddcc3 100644 --- a/lib/libcrypto/arch/aarch64/opensslconf.h +++ b/lib/libcrypto/arch/aarch64/opensslconf.h @@ -1,7 +1,7 @@ #include /* crypto/opensslconf.h.in */ -#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +#if defined(HEADER_CRYPTO_LOCAL_H) && !defined(OPENSSLDIR) #define OPENSSLDIR "/etc/ssl" #endif diff --git a/lib/libcrypto/arch/alpha/opensslconf.h b/lib/libcrypto/arch/alpha/opensslconf.h index 6db55ca8c..84ef3049e 100644 --- a/lib/libcrypto/arch/alpha/opensslconf.h +++ b/lib/libcrypto/arch/alpha/opensslconf.h @@ -1,7 +1,7 @@ #include /* crypto/opensslconf.h.in */ -#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +#if defined(HEADER_CRYPTO_LOCAL_H) && !defined(OPENSSLDIR) #define OPENSSLDIR "/etc/ssl" #endif diff --git a/lib/libcrypto/arch/amd64/Makefile.inc b/lib/libcrypto/arch/amd64/Makefile.inc index 2f41f4438..f8f829cca 100644 --- a/lib/libcrypto/arch/amd64/Makefile.inc +++ b/lib/libcrypto/arch/amd64/Makefile.inc @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile.inc,v 1.30 2024/10/18 13:36:24 jsing Exp $ +# $OpenBSD: Makefile.inc,v 1.35 2024/12/06 11:57:17 jsing Exp $ # amd64-specific libcrypto build rules @@ -49,19 +49,16 @@ SSLASM+= rc4 rc4-x86_64 # ripemd # sha CFLAGS+= -DSHA1_ASM -SSLASM+= sha sha1-x86_64 +SRCS+= sha1_amd64.c +SRCS+= sha1_amd64_generic.S +SRCS+= sha1_amd64_shani.S CFLAGS+= -DSHA256_ASM -SRCS+= sha256-x86_64.S -GENERATED+= sha256-x86_64.S -sha256-x86_64.S: ${LCRYPTO_SRC}/sha/asm/sha512-x86_64.pl ${EXTRA_PL} - cd ${LCRYPTO_SRC}/sha/asm ; \ - /usr/bin/perl ./sha512-x86_64.pl ${.OBJDIR}/${.TARGET} +SRCS+= sha256_amd64.c +SRCS+= sha256_amd64_generic.S +SRCS+= sha256_amd64_shani.S CFLAGS+= -DSHA512_ASM -SRCS+= sha512-x86_64.S -GENERATED+= sha512-x86_64.S -sha512-x86_64.S: ${LCRYPTO_SRC}/sha/asm/sha512-x86_64.pl ${EXTRA_PL} - cd ${LCRYPTO_SRC}/sha/asm ; \ - /usr/bin/perl ./sha512-x86_64.pl ${.OBJDIR}/${.TARGET} +SRCS+= sha512_amd64.c +SRCS+= sha512_amd64_generic.S .for dir f in ${SSLASM} SRCS+= ${f}.S diff --git a/lib/libcrypto/arch/amd64/crypto_arch.h b/lib/libcrypto/arch/amd64/crypto_arch.h index 64b2da587..7546fb0df 100644 --- a/lib/libcrypto/arch/amd64/crypto_arch.h +++ b/lib/libcrypto/arch/amd64/crypto_arch.h @@ -1,4 +1,4 @@ -/* $OpenBSD: crypto_arch.h,v 1.3 2024/10/19 13:06:11 jsing Exp $ */ +/* $OpenBSD: crypto_arch.h,v 1.4 2024/11/16 13:05:35 jsing Exp $ */ /* * Copyright (c) 2024 Joel Sing * @@ -15,12 +15,20 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include + #ifndef HEADER_CRYPTO_ARCH_H #define HEADER_CRYPTO_ARCH_H #define HAVE_CRYPTO_CPU_CAPS_INIT #define HAVE_CRYPTO_CPU_CAPS_IA32 +#ifndef __ASSEMBLER__ +extern uint64_t crypto_cpu_caps_amd64; +#endif + +#define CRYPTO_CPU_CAPS_AMD64_SHA (1ULL << 0) + #ifndef OPENSSL_NO_ASM #define HAVE_AES_CBC_ENCRYPT_INTERNAL diff --git a/lib/libcrypto/arch/amd64/crypto_cpu_caps.c b/lib/libcrypto/arch/amd64/crypto_cpu_caps.c index b0da0d636..63b7b64cd 100644 --- a/lib/libcrypto/arch/amd64/crypto_cpu_caps.c +++ b/lib/libcrypto/arch/amd64/crypto_cpu_caps.c @@ -1,4 +1,4 @@ -/* $OpenBSD: crypto_cpu_caps.c,v 1.2 2024/10/19 13:06:11 jsing Exp $ */ +/* $OpenBSD: crypto_cpu_caps.c,v 1.4 2024/11/16 13:05:35 jsing Exp $ */ /* * Copyright (c) 2024 Joel Sing * @@ -19,11 +19,15 @@ #include +#include "crypto_arch.h" #include "x86_arch.h" /* Legacy architecture specific capabilities, used by perlasm. */ uint64_t OPENSSL_ia32cap_P; +/* Machine dependent CPU capabilities. */ +uint64_t crypto_cpu_caps_amd64; + /* Machine independent CPU capabilities. */ extern uint64_t crypto_cpu_caps; @@ -43,7 +47,7 @@ cpuid(uint32_t eax, uint32_t *out_eax, uint32_t *out_ebx, uint32_t *out_ecx, *out_eax = eax; if (out_ebx != NULL) *out_ebx = ebx; - if (out_ebx != NULL) + if (out_ecx != NULL) *out_ecx = ecx; if (out_edx != NULL) *out_edx = edx; @@ -67,19 +71,21 @@ xgetbv(uint32_t ecx, uint32_t *out_eax, uint32_t *out_edx) void crypto_cpu_caps_init(void) { - uint32_t eax, ebx, ecx, edx; + uint32_t eax, ebx, ecx, edx, max_cpuid; uint64_t caps = 0; cpuid(0, &eax, &ebx, &ecx, &edx); + max_cpuid = eax; + /* "GenuineIntel" in little endian. */ if (ebx == 0x756e6547 && edx == 0x49656e69 && ecx == 0x6c65746e) caps |= CPUCAP_MASK_INTEL; - if (eax < 1) + if (max_cpuid < 1) return; - cpuid(1, &eax, &ebx, &ecx, &edx); + cpuid(1, &eax, NULL, &ecx, &edx); if ((edx & IA32CAP_MASK0_FXSR) != 0) caps |= CPUCAP_MASK_FXSR; @@ -106,6 +112,14 @@ crypto_cpu_caps_init(void) caps |= CPUCAP_MASK_AVX; } + if (max_cpuid >= 7) { + cpuid(7, NULL, &ebx, NULL, NULL); + + /* Intel SHA extensions feature bit - ebx[29]. */ + if (((ebx >> 29) & 1) != 0) + crypto_cpu_caps_amd64 |= CRYPTO_CPU_CAPS_AMD64_SHA; + } + /* Set machine independent CPU capabilities. */ if ((caps & CPUCAP_MASK_AESNI) != 0) crypto_cpu_caps |= CRYPTO_CPU_CAPS_ACCELERATED_AES; diff --git a/lib/libcrypto/arch/amd64/opensslconf.h b/lib/libcrypto/arch/amd64/opensslconf.h index fe2b9336b..76abdb0e5 100644 --- a/lib/libcrypto/arch/amd64/opensslconf.h +++ b/lib/libcrypto/arch/amd64/opensslconf.h @@ -1,7 +1,7 @@ #include /* crypto/opensslconf.h.in */ -#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +#if defined(HEADER_CRYPTO_LOCAL_H) && !defined(OPENSSLDIR) #define OPENSSLDIR "/etc/ssl" #endif diff --git a/lib/libcrypto/arch/arm/opensslconf.h b/lib/libcrypto/arch/arm/opensslconf.h index dd0bfe233..a3c797848 100644 --- a/lib/libcrypto/arch/arm/opensslconf.h +++ b/lib/libcrypto/arch/arm/opensslconf.h @@ -1,7 +1,7 @@ #include /* crypto/opensslconf.h.in */ -#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +#if defined(HEADER_CRYPTO_LOCAL_H) && !defined(OPENSSLDIR) #define OPENSSLDIR "/etc/ssl" #endif diff --git a/lib/libcrypto/arch/hppa/opensslconf.h b/lib/libcrypto/arch/hppa/opensslconf.h index dd0bfe233..a3c797848 100644 --- a/lib/libcrypto/arch/hppa/opensslconf.h +++ b/lib/libcrypto/arch/hppa/opensslconf.h @@ -1,7 +1,7 @@ #include /* crypto/opensslconf.h.in */ -#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +#if defined(HEADER_CRYPTO_LOCAL_H) && !defined(OPENSSLDIR) #define OPENSSLDIR "/etc/ssl" #endif diff --git a/lib/libcrypto/arch/i386/crypto_cpu_caps.c b/lib/libcrypto/arch/i386/crypto_cpu_caps.c index b0da0d636..6bb77411a 100644 --- a/lib/libcrypto/arch/i386/crypto_cpu_caps.c +++ b/lib/libcrypto/arch/i386/crypto_cpu_caps.c @@ -1,4 +1,4 @@ -/* $OpenBSD: crypto_cpu_caps.c,v 1.2 2024/10/19 13:06:11 jsing Exp $ */ +/* $OpenBSD: crypto_cpu_caps.c,v 1.3 2024/11/12 13:14:57 jsing Exp $ */ /* * Copyright (c) 2024 Joel Sing * @@ -43,7 +43,7 @@ cpuid(uint32_t eax, uint32_t *out_eax, uint32_t *out_ebx, uint32_t *out_ecx, *out_eax = eax; if (out_ebx != NULL) *out_ebx = ebx; - if (out_ebx != NULL) + if (out_ecx != NULL) *out_ecx = ecx; if (out_edx != NULL) *out_edx = edx; diff --git a/lib/libcrypto/arch/i386/opensslconf.h b/lib/libcrypto/arch/i386/opensslconf.h index c31d7745a..e5aa8dab1 100644 --- a/lib/libcrypto/arch/i386/opensslconf.h +++ b/lib/libcrypto/arch/i386/opensslconf.h @@ -1,7 +1,7 @@ #include /* crypto/opensslconf.h.in */ -#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +#if defined(HEADER_CRYPTO_LOCAL_H) && !defined(OPENSSLDIR) #define OPENSSLDIR "/etc/ssl" #endif diff --git a/lib/libcrypto/arch/m88k/opensslconf.h b/lib/libcrypto/arch/m88k/opensslconf.h index dd0bfe233..a3c797848 100644 --- a/lib/libcrypto/arch/m88k/opensslconf.h +++ b/lib/libcrypto/arch/m88k/opensslconf.h @@ -1,7 +1,7 @@ #include /* crypto/opensslconf.h.in */ -#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +#if defined(HEADER_CRYPTO_LOCAL_H) && !defined(OPENSSLDIR) #define OPENSSLDIR "/etc/ssl" #endif diff --git a/lib/libcrypto/arch/mips64/opensslconf.h b/lib/libcrypto/arch/mips64/opensslconf.h index c6a94d0dc..887442e33 100644 --- a/lib/libcrypto/arch/mips64/opensslconf.h +++ b/lib/libcrypto/arch/mips64/opensslconf.h @@ -1,7 +1,7 @@ #include /* crypto/opensslconf.h.in */ -#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +#if defined(HEADER_CRYPTO_LOCAL_H) && !defined(OPENSSLDIR) #define OPENSSLDIR "/etc/ssl" #endif diff --git a/lib/libcrypto/arch/powerpc/Makefile.inc b/lib/libcrypto/arch/powerpc/Makefile.inc index 0d40e5ac3..6957abdda 100644 --- a/lib/libcrypto/arch/powerpc/Makefile.inc +++ b/lib/libcrypto/arch/powerpc/Makefile.inc @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile.inc,v 1.12 2024/03/29 07:24:09 jsing Exp $ +# $OpenBSD: Makefile.inc,v 1.13 2024/11/01 12:56:38 jsing Exp $ # powerpc-specific libcrypto build rules @@ -7,8 +7,7 @@ #SSLASM+= aes aes-ppc aes-ppc # bn SSLASM+= bn ppc bn-ppc -SSLASM+= bn ppc-mont ppc-mont # bn_mul_mont_int -#SSLASM+= bn ppc64-mont ppc64-mont # bn_mul_mont_fpu64 +SSLASM+= bn ppc-mont ppc-mont CFLAGS+= -DOPENSSL_BN_ASM_MONT # sha CFLAGS+= -DSHA1_ASM @@ -23,6 +22,3 @@ ${dst}.S: ${LCRYPTO_SRC}/${dir}/asm/${src}.pl /usr/bin/perl \ ${LCRYPTO_SRC}/${dir}/asm/${src}.pl linux32 ${.TARGET} > ${.TARGET} .endfor - -#CFLAGS+= -DOPENSSL_CPUID_OBJ # it's commented out in ppccap.c -SRCS+= ppccap.c diff --git a/lib/libcrypto/arch/powerpc/opensslconf.h b/lib/libcrypto/arch/powerpc/opensslconf.h index dd0bfe233..a3c797848 100644 --- a/lib/libcrypto/arch/powerpc/opensslconf.h +++ b/lib/libcrypto/arch/powerpc/opensslconf.h @@ -1,7 +1,7 @@ #include /* crypto/opensslconf.h.in */ -#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +#if defined(HEADER_CRYPTO_LOCAL_H) && !defined(OPENSSLDIR) #define OPENSSLDIR "/etc/ssl" #endif diff --git a/lib/libcrypto/arch/powerpc64/Makefile.inc b/lib/libcrypto/arch/powerpc64/Makefile.inc index 07c9de3d0..da81a63cd 100644 --- a/lib/libcrypto/arch/powerpc64/Makefile.inc +++ b/lib/libcrypto/arch/powerpc64/Makefile.inc @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile.inc,v 1.14 2024/03/29 07:24:09 jsing Exp $ +# $OpenBSD: Makefile.inc,v 1.15 2024/11/01 12:56:38 jsing Exp $ # powerpc-specific libcrypto build rules @@ -7,8 +7,7 @@ #SSLASM+= aes aes-ppc aes-ppc # bn #SSLASM+= bn ppc bn-ppc -#SSLASM+= bn ppc-mont ppc-mont # bn_mul_mont_int -#SSLASM+= bn ppc64-mont ppc64-mont # bn_mul_mont_fpu64 +#SSLASM+= bn ppc-mont ppc-mont #CFLAGS+= -DOPENSSL_BN_ASM_MONT # sha #CFLAGS+= -DSHA1_ASM @@ -23,6 +22,3 @@ ${dst}.S: ${LCRYPTO_SRC}/${dir}/asm/${src}.pl /usr/bin/perl \ ${LCRYPTO_SRC}/${dir}/asm/${src}.pl linux32 ${.TARGET} > ${.TARGET} .endfor - -#CFLAGS+= -DOPENSSL_CPUID_OBJ # it's commented out in ppccap.c -SRCS+= ppccap.c diff --git a/lib/libcrypto/arch/powerpc64/opensslconf.h b/lib/libcrypto/arch/powerpc64/opensslconf.h index fe2b9336b..76abdb0e5 100644 --- a/lib/libcrypto/arch/powerpc64/opensslconf.h +++ b/lib/libcrypto/arch/powerpc64/opensslconf.h @@ -1,7 +1,7 @@ #include /* crypto/opensslconf.h.in */ -#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +#if defined(HEADER_CRYPTO_LOCAL_H) && !defined(OPENSSLDIR) #define OPENSSLDIR "/etc/ssl" #endif diff --git a/lib/libcrypto/arch/riscv64/opensslconf.h b/lib/libcrypto/arch/riscv64/opensslconf.h index d658f297a..d844ddcc3 100644 --- a/lib/libcrypto/arch/riscv64/opensslconf.h +++ b/lib/libcrypto/arch/riscv64/opensslconf.h @@ -1,7 +1,7 @@ #include /* crypto/opensslconf.h.in */ -#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +#if defined(HEADER_CRYPTO_LOCAL_H) && !defined(OPENSSLDIR) #define OPENSSLDIR "/etc/ssl" #endif diff --git a/lib/libcrypto/arch/sh/opensslconf.h b/lib/libcrypto/arch/sh/opensslconf.h index dd0bfe233..a3c797848 100644 --- a/lib/libcrypto/arch/sh/opensslconf.h +++ b/lib/libcrypto/arch/sh/opensslconf.h @@ -1,7 +1,7 @@ #include /* crypto/opensslconf.h.in */ -#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +#if defined(HEADER_CRYPTO_LOCAL_H) && !defined(OPENSSLDIR) #define OPENSSLDIR "/etc/ssl" #endif diff --git a/lib/libcrypto/arch/sparc64/opensslconf.h b/lib/libcrypto/arch/sparc64/opensslconf.h index c6a94d0dc..887442e33 100644 --- a/lib/libcrypto/arch/sparc64/opensslconf.h +++ b/lib/libcrypto/arch/sparc64/opensslconf.h @@ -1,7 +1,7 @@ #include /* crypto/opensslconf.h.in */ -#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +#if defined(HEADER_CRYPTO_LOCAL_H) && !defined(OPENSSLDIR) #define OPENSSLDIR "/etc/ssl" #endif diff --git a/lib/libcrypto/asn1/tasn_fre.c b/lib/libcrypto/asn1/tasn_fre.c index 83c073b55..0e259a13a 100644 --- a/lib/libcrypto/asn1/tasn_fre.c +++ b/lib/libcrypto/asn1/tasn_fre.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tasn_fre.c,v 1.23 2023/07/28 10:00:10 tb Exp $ */ +/* $OpenBSD: tasn_fre.c,v 1.24 2024/12/11 11:22:06 tb Exp $ */ /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project 2000. */ @@ -152,10 +152,9 @@ asn1_item_free(ASN1_VALUE **pval, const ASN1_ITEM *it) * determine the type of the field it defines. So * free up in reverse order. */ - tt = it->templates + it->tcount - 1; - for (i = 0; i < it->tcount; tt--, i++) { + for (i = it->tcount - 1; i >= 0; i--) { ASN1_VALUE **pseqval; - seqtt = asn1_do_adb(pval, tt, 0); + seqtt = asn1_do_adb(pval, &it->templates[i], 0); if (!seqtt) continue; pseqval = asn1_get_field_ptr(pval, seqtt); diff --git a/lib/libcrypto/asn1/x_info.c b/lib/libcrypto/asn1/x_info.c index cb8c46608..d2c4bcfe7 100644 --- a/lib/libcrypto/asn1/x_info.c +++ b/lib/libcrypto/asn1/x_info.c @@ -1,4 +1,4 @@ -/* $OpenBSD: x_info.c,v 1.21 2024/04/09 13:55:02 beck Exp $ */ +/* $OpenBSD: x_info.c,v 1.22 2024/12/11 10:28:03 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -69,7 +69,7 @@ X509_INFO_new(void) if ((ret = calloc(1, sizeof(X509_INFO))) == NULL) { ASN1error(ERR_R_MALLOC_FAILURE); - return (NULL); + return NULL; } ret->references = 1; diff --git a/lib/libcrypto/bn/asm/ppc-mont.pl b/lib/libcrypto/bn/asm/ppc-mont.pl index 2283f7db8..58c803112 100644 --- a/lib/libcrypto/bn/asm/ppc-mont.pl +++ b/lib/libcrypto/bn/asm/ppc-mont.pl @@ -109,9 +109,9 @@ $code=<<___; .machine "any" .text -.globl .bn_mul_mont_int +.globl .bn_mul_mont .align 4 -.bn_mul_mont_int: +.bn_mul_mont: cmpwi $num,4 mr $rp,r3 ; $rp is reassigned li r3,0 diff --git a/lib/libcrypto/bn/asm/ppc64-mont.pl b/lib/libcrypto/bn/asm/ppc64-mont.pl deleted file mode 100644 index 7ac05105e..000000000 --- a/lib/libcrypto/bn/asm/ppc64-mont.pl +++ /dev/null @@ -1,1088 +0,0 @@ -#!/usr/bin/env perl - -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== - -# December 2007 - -# The reason for undertaken effort is basically following. Even though -# Power 6 CPU operates at incredible 4.7GHz clock frequency, its PKI -# performance was observed to be less than impressive, essentially as -# fast as 1.8GHz PPC970, or 2.6 times(!) slower than one would hope. -# Well, it's not surprising that IBM had to make some sacrifices to -# boost the clock frequency that much, but no overall improvement? -# Having observed how much difference did switching to FPU make on -# UltraSPARC, playing same stunt on Power 6 appeared appropriate... -# Unfortunately the resulting performance improvement is not as -# impressive, ~30%, and in absolute terms is still very far from what -# one would expect from 4.7GHz CPU. There is a chance that I'm doing -# something wrong, but in the lack of assembler level micro-profiling -# data or at least decent platform guide I can't tell... Or better -# results might be achieved with VMX... Anyway, this module provides -# *worse* performance on other PowerPC implementations, ~40-15% slower -# on PPC970 depending on key length and ~40% slower on Power 5 for all -# key lengths. As it's obviously inappropriate as "best all-round" -# alternative, it has to be complemented with run-time CPU family -# detection. Oh! It should also be noted that unlike other PowerPC -# implementation IALU ppc-mont.pl module performs *suboptimaly* on -# >=1024-bit key lengths on Power 6. It should also be noted that -# *everything* said so far applies to 64-bit builds! As far as 32-bit -# application executed on 64-bit CPU goes, this module is likely to -# become preferred choice, because it's easy to adapt it for such -# case and *is* faster than 32-bit ppc-mont.pl on *all* processors. - -# February 2008 - -# Micro-profiling assisted optimization results in ~15% improvement -# over original ppc64-mont.pl version, or overall ~50% improvement -# over ppc.pl module on Power 6. If compared to ppc-mont.pl on same -# Power 6 CPU, this module is 5-150% faster depending on key length, -# [hereafter] more for longer keys. But if compared to ppc-mont.pl -# on 1.8GHz PPC970, it's only 5-55% faster. Still far from impressive -# in absolute terms, but it's apparently the way Power 6 is... - -# December 2009 - -# Adapted for 32-bit build this module delivers 25-120%, yes, more -# than *twice* for longer keys, performance improvement over 32-bit -# ppc-mont.pl on 1.8GHz PPC970. However! This implementation utilizes -# even 64-bit integer operations and the trouble is that most PPC -# operating systems don't preserve upper halves of general purpose -# registers upon 32-bit signal delivery. They do preserve them upon -# context switch, but not signalling:-( This means that asynchronous -# signals have to be blocked upon entry to this subroutine. Signal -# masking (and of course complementary unmasking) has quite an impact -# on performance, naturally larger for shorter keys. It's so severe -# that 512-bit key performance can be as low as 1/3 of expected one. -# This is why this routine can be engaged for longer key operations -# only on these OSes, see crypto/ppccap.c for further details. MacOS X -# is an exception from this and doesn't require signal masking, and -# that's where above improvement coefficients were collected. For -# others alternative would be to break dependence on upper halves of -# GPRs by sticking to 32-bit integer operations... - -$flavour = shift; - -if ($flavour =~ /32/) { - $SIZE_T=4; - $RZONE= 224; - $fname= "bn_mul_mont_fpu64"; - - $STUX= "stwux"; # store indexed and update - $PUSH= "stw"; - $POP= "lwz"; -} elsif ($flavour =~ /64/) { - $SIZE_T=8; - $RZONE= 288; - $fname= "bn_mul_mont_fpu64"; - - # same as above, but 64-bit mnemonics... - $STUX= "stdux"; # store indexed and update - $PUSH= "std"; - $POP= "ld"; -} else { die "nonsense $flavour"; } - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../perlasm/ppc-xlate.pl" and -f $xlate) or -die "can't locate ppc-xlate.pl"; - -open STDOUT,"| $^X $xlate $flavour ".shift || die "can't call $xlate: $!"; - -$FRAME=64; # padded frame header -$TRANSFER=16*8; - -$carry="r0"; -$sp="r1"; -$toc="r2"; -$rp="r3"; $ovf="r3"; -$ap="r4"; -$bp="r5"; -$np="r6"; -$n0="r7"; -$num="r8"; -$rp="r9"; # $rp is reassigned -$tp="r10"; -$j="r11"; -$i="r12"; -# non-volatile registers -$nap_d="r22"; # interleaved ap and np in double format -$a0="r23"; # ap[0] -$t0="r24"; # temporary registers -$t1="r25"; -$t2="r26"; -$t3="r27"; -$t4="r28"; -$t5="r29"; -$t6="r30"; -$t7="r31"; - -# PPC offers enough register bank capacity to unroll inner loops twice -# -# ..A3A2A1A0 -# dcba -# ----------- -# A0a -# A0b -# A0c -# A0d -# A1a -# A1b -# A1c -# A1d -# A2a -# A2b -# A2c -# A2d -# A3a -# A3b -# A3c -# A3d -# ..a -# ..b -# -$ba="f0"; $bb="f1"; $bc="f2"; $bd="f3"; -$na="f4"; $nb="f5"; $nc="f6"; $nd="f7"; -$dota="f8"; $dotb="f9"; -$A0="f10"; $A1="f11"; $A2="f12"; $A3="f13"; -$N0="f20"; $N1="f21"; $N2="f22"; $N3="f23"; -$T0a="f24"; $T0b="f25"; -$T1a="f26"; $T1b="f27"; -$T2a="f28"; $T2b="f29"; -$T3a="f30"; $T3b="f31"; - -# sp----------->+-------------------------------+ -# | saved sp | -# +-------------------------------+ -# . . -# +64 +-------------------------------+ -# | 16 gpr<->fpr transfer zone | -# . . -# . . -# +16*8 +-------------------------------+ -# | __int64 tmp[-1] | -# +-------------------------------+ -# | __int64 tmp[num] | -# . . -# . . -# . . -# +(num+1)*8 +-------------------------------+ -# | padding to 64 byte boundary | -# . . -# +X +-------------------------------+ -# | double nap_d[4*num] | -# . . -# . . -# . . -# +-------------------------------+ -# . . -# -12*size_t +-------------------------------+ -# | 10 saved gpr, r22-r31 | -# . . -# . . -# -12*8 +-------------------------------+ -# | 12 saved fpr, f20-f31 | -# . . -# . . -# +-------------------------------+ - -$code=<<___; -.machine "any" -.text - -.globl .$fname -.align 5 -.$fname: - cmpwi $num,`3*8/$SIZE_T` - mr $rp,r3 ; $rp is reassigned - li r3,0 ; possible "not handled" return code - bltlr- - andi. r0,$num,`16/$SIZE_T-1` ; $num has to be "even" - bnelr- - - slwi $num,$num,`log($SIZE_T)/log(2)` ; num*=sizeof(BN_LONG) - li $i,-4096 - slwi $tp,$num,2 ; place for {an}p_{lh}[num], i.e. 4*num - add $tp,$tp,$num ; place for tp[num+1] - addi $tp,$tp,`$FRAME+$TRANSFER+8+64+$RZONE` - subf $tp,$tp,$sp ; $sp-$tp - and $tp,$tp,$i ; minimize TLB usage - subf $tp,$sp,$tp ; $tp-$sp - mr $i,$sp - $STUX $sp,$sp,$tp ; alloca - - $PUSH r22,`-12*8-10*$SIZE_T`($i) - $PUSH r23,`-12*8-9*$SIZE_T`($i) - $PUSH r24,`-12*8-8*$SIZE_T`($i) - $PUSH r25,`-12*8-7*$SIZE_T`($i) - $PUSH r26,`-12*8-6*$SIZE_T`($i) - $PUSH r27,`-12*8-5*$SIZE_T`($i) - $PUSH r28,`-12*8-4*$SIZE_T`($i) - $PUSH r29,`-12*8-3*$SIZE_T`($i) - $PUSH r30,`-12*8-2*$SIZE_T`($i) - $PUSH r31,`-12*8-1*$SIZE_T`($i) - stfd f20,`-12*8`($i) - stfd f21,`-11*8`($i) - stfd f22,`-10*8`($i) - stfd f23,`-9*8`($i) - stfd f24,`-8*8`($i) - stfd f25,`-7*8`($i) - stfd f26,`-6*8`($i) - stfd f27,`-5*8`($i) - stfd f28,`-4*8`($i) - stfd f29,`-3*8`($i) - stfd f30,`-2*8`($i) - stfd f31,`-1*8`($i) -___ -$code.=<<___ if ($SIZE_T==8); - ld $a0,0($ap) ; pull ap[0] value - ld $n0,0($n0) ; pull n0[0] value - ld $t3,0($bp) ; bp[0] -___ -$code.=<<___ if ($SIZE_T==4); - mr $t1,$n0 - lwz $a0,0($ap) ; pull ap[0,1] value - lwz $t0,4($ap) - lwz $n0,0($t1) ; pull n0[0,1] value - lwz $t1,4($t1) - lwz $t3,0($bp) ; bp[0,1] - lwz $t2,4($bp) - insrdi $a0,$t0,32,0 - insrdi $n0,$t1,32,0 - insrdi $t3,$t2,32,0 -___ -$code.=<<___; - addi $tp,$sp,`$FRAME+$TRANSFER+8+64` - li $i,-64 - add $nap_d,$tp,$num - and $nap_d,$nap_d,$i ; align to 64 bytes - - mulld $t7,$a0,$t3 ; ap[0]*bp[0] - ; nap_d is off by 1, because it's used with stfdu/lfdu - addi $nap_d,$nap_d,-8 - srwi $j,$num,`3+1` ; counter register, num/2 - mulld $t7,$t7,$n0 ; tp[0]*n0 - addi $j,$j,-1 - addi $tp,$sp,`$FRAME+$TRANSFER-8` - li $carry,0 - mtctr $j - - ; transfer bp[0] to FPU as 4x16-bit values - extrdi $t0,$t3,16,48 - extrdi $t1,$t3,16,32 - extrdi $t2,$t3,16,16 - extrdi $t3,$t3,16,0 - std $t0,`$FRAME+0`($sp) - std $t1,`$FRAME+8`($sp) - std $t2,`$FRAME+16`($sp) - std $t3,`$FRAME+24`($sp) - ; transfer (ap[0]*bp[0])*n0 to FPU as 4x16-bit values - extrdi $t4,$t7,16,48 - extrdi $t5,$t7,16,32 - extrdi $t6,$t7,16,16 - extrdi $t7,$t7,16,0 - std $t4,`$FRAME+32`($sp) - std $t5,`$FRAME+40`($sp) - std $t6,`$FRAME+48`($sp) - std $t7,`$FRAME+56`($sp) -___ -$code.=<<___ if ($SIZE_T==8); - lwz $t0,4($ap) ; load a[j] as 32-bit word pair - lwz $t1,0($ap) - lwz $t2,12($ap) ; load a[j+1] as 32-bit word pair - lwz $t3,8($ap) - lwz $t4,4($np) ; load n[j] as 32-bit word pair - lwz $t5,0($np) - lwz $t6,12($np) ; load n[j+1] as 32-bit word pair - lwz $t7,8($np) -___ -$code.=<<___ if ($SIZE_T==4); - lwz $t0,0($ap) ; load a[j..j+3] as 32-bit word pairs - lwz $t1,4($ap) - lwz $t2,8($ap) - lwz $t3,12($ap) - lwz $t4,0($np) ; load n[j..j+3] as 32-bit word pairs - lwz $t5,4($np) - lwz $t6,8($np) - lwz $t7,12($np) -___ -$code.=<<___; - lfd $ba,`$FRAME+0`($sp) - lfd $bb,`$FRAME+8`($sp) - lfd $bc,`$FRAME+16`($sp) - lfd $bd,`$FRAME+24`($sp) - lfd $na,`$FRAME+32`($sp) - lfd $nb,`$FRAME+40`($sp) - lfd $nc,`$FRAME+48`($sp) - lfd $nd,`$FRAME+56`($sp) - std $t0,`$FRAME+64`($sp) - std $t1,`$FRAME+72`($sp) - std $t2,`$FRAME+80`($sp) - std $t3,`$FRAME+88`($sp) - std $t4,`$FRAME+96`($sp) - std $t5,`$FRAME+104`($sp) - std $t6,`$FRAME+112`($sp) - std $t7,`$FRAME+120`($sp) - fcfid $ba,$ba - fcfid $bb,$bb - fcfid $bc,$bc - fcfid $bd,$bd - fcfid $na,$na - fcfid $nb,$nb - fcfid $nc,$nc - fcfid $nd,$nd - - lfd $A0,`$FRAME+64`($sp) - lfd $A1,`$FRAME+72`($sp) - lfd $A2,`$FRAME+80`($sp) - lfd $A3,`$FRAME+88`($sp) - lfd $N0,`$FRAME+96`($sp) - lfd $N1,`$FRAME+104`($sp) - lfd $N2,`$FRAME+112`($sp) - lfd $N3,`$FRAME+120`($sp) - fcfid $A0,$A0 - fcfid $A1,$A1 - fcfid $A2,$A2 - fcfid $A3,$A3 - fcfid $N0,$N0 - fcfid $N1,$N1 - fcfid $N2,$N2 - fcfid $N3,$N3 - addi $ap,$ap,16 - addi $np,$np,16 - - fmul $T1a,$A1,$ba - fmul $T1b,$A1,$bb - stfd $A0,8($nap_d) ; save a[j] in double format - stfd $A1,16($nap_d) - fmul $T2a,$A2,$ba - fmul $T2b,$A2,$bb - stfd $A2,24($nap_d) ; save a[j+1] in double format - stfd $A3,32($nap_d) - fmul $T3a,$A3,$ba - fmul $T3b,$A3,$bb - stfd $N0,40($nap_d) ; save n[j] in double format - stfd $N1,48($nap_d) - fmul $T0a,$A0,$ba - fmul $T0b,$A0,$bb - stfd $N2,56($nap_d) ; save n[j+1] in double format - stfdu $N3,64($nap_d) - - fmadd $T1a,$A0,$bc,$T1a - fmadd $T1b,$A0,$bd,$T1b - fmadd $T2a,$A1,$bc,$T2a - fmadd $T2b,$A1,$bd,$T2b - fmadd $T3a,$A2,$bc,$T3a - fmadd $T3b,$A2,$bd,$T3b - fmul $dota,$A3,$bc - fmul $dotb,$A3,$bd - - fmadd $T1a,$N1,$na,$T1a - fmadd $T1b,$N1,$nb,$T1b - fmadd $T2a,$N2,$na,$T2a - fmadd $T2b,$N2,$nb,$T2b - fmadd $T3a,$N3,$na,$T3a - fmadd $T3b,$N3,$nb,$T3b - fmadd $T0a,$N0,$na,$T0a - fmadd $T0b,$N0,$nb,$T0b - - fmadd $T1a,$N0,$nc,$T1a - fmadd $T1b,$N0,$nd,$T1b - fmadd $T2a,$N1,$nc,$T2a - fmadd $T2b,$N1,$nd,$T2b - fmadd $T3a,$N2,$nc,$T3a - fmadd $T3b,$N2,$nd,$T3b - fmadd $dota,$N3,$nc,$dota - fmadd $dotb,$N3,$nd,$dotb - - fctid $T0a,$T0a - fctid $T0b,$T0b - fctid $T1a,$T1a - fctid $T1b,$T1b - fctid $T2a,$T2a - fctid $T2b,$T2b - fctid $T3a,$T3a - fctid $T3b,$T3b - - stfd $T0a,`$FRAME+0`($sp) - stfd $T0b,`$FRAME+8`($sp) - stfd $T1a,`$FRAME+16`($sp) - stfd $T1b,`$FRAME+24`($sp) - stfd $T2a,`$FRAME+32`($sp) - stfd $T2b,`$FRAME+40`($sp) - stfd $T3a,`$FRAME+48`($sp) - stfd $T3b,`$FRAME+56`($sp) - -.align 5 -L1st: -___ -$code.=<<___ if ($SIZE_T==8); - lwz $t0,4($ap) ; load a[j] as 32-bit word pair - lwz $t1,0($ap) - lwz $t2,12($ap) ; load a[j+1] as 32-bit word pair - lwz $t3,8($ap) - lwz $t4,4($np) ; load n[j] as 32-bit word pair - lwz $t5,0($np) - lwz $t6,12($np) ; load n[j+1] as 32-bit word pair - lwz $t7,8($np) -___ -$code.=<<___ if ($SIZE_T==4); - lwz $t0,0($ap) ; load a[j..j+3] as 32-bit word pairs - lwz $t1,4($ap) - lwz $t2,8($ap) - lwz $t3,12($ap) - lwz $t4,0($np) ; load n[j..j+3] as 32-bit word pairs - lwz $t5,4($np) - lwz $t6,8($np) - lwz $t7,12($np) -___ -$code.=<<___; - std $t0,`$FRAME+64`($sp) - std $t1,`$FRAME+72`($sp) - std $t2,`$FRAME+80`($sp) - std $t3,`$FRAME+88`($sp) - std $t4,`$FRAME+96`($sp) - std $t5,`$FRAME+104`($sp) - std $t6,`$FRAME+112`($sp) - std $t7,`$FRAME+120`($sp) - ld $t0,`$FRAME+0`($sp) - ld $t1,`$FRAME+8`($sp) - ld $t2,`$FRAME+16`($sp) - ld $t3,`$FRAME+24`($sp) - ld $t4,`$FRAME+32`($sp) - ld $t5,`$FRAME+40`($sp) - ld $t6,`$FRAME+48`($sp) - ld $t7,`$FRAME+56`($sp) - lfd $A0,`$FRAME+64`($sp) - lfd $A1,`$FRAME+72`($sp) - lfd $A2,`$FRAME+80`($sp) - lfd $A3,`$FRAME+88`($sp) - lfd $N0,`$FRAME+96`($sp) - lfd $N1,`$FRAME+104`($sp) - lfd $N2,`$FRAME+112`($sp) - lfd $N3,`$FRAME+120`($sp) - fcfid $A0,$A0 - fcfid $A1,$A1 - fcfid $A2,$A2 - fcfid $A3,$A3 - fcfid $N0,$N0 - fcfid $N1,$N1 - fcfid $N2,$N2 - fcfid $N3,$N3 - addi $ap,$ap,16 - addi $np,$np,16 - - fmul $T1a,$A1,$ba - fmul $T1b,$A1,$bb - fmul $T2a,$A2,$ba - fmul $T2b,$A2,$bb - stfd $A0,8($nap_d) ; save a[j] in double format - stfd $A1,16($nap_d) - fmul $T3a,$A3,$ba - fmul $T3b,$A3,$bb - fmadd $T0a,$A0,$ba,$dota - fmadd $T0b,$A0,$bb,$dotb - stfd $A2,24($nap_d) ; save a[j+1] in double format - stfd $A3,32($nap_d) - - fmadd $T1a,$A0,$bc,$T1a - fmadd $T1b,$A0,$bd,$T1b - fmadd $T2a,$A1,$bc,$T2a - fmadd $T2b,$A1,$bd,$T2b - stfd $N0,40($nap_d) ; save n[j] in double format - stfd $N1,48($nap_d) - fmadd $T3a,$A2,$bc,$T3a - fmadd $T3b,$A2,$bd,$T3b - add $t0,$t0,$carry ; can not overflow - fmul $dota,$A3,$bc - fmul $dotb,$A3,$bd - stfd $N2,56($nap_d) ; save n[j+1] in double format - stfdu $N3,64($nap_d) - srdi $carry,$t0,16 - add $t1,$t1,$carry - srdi $carry,$t1,16 - - fmadd $T1a,$N1,$na,$T1a - fmadd $T1b,$N1,$nb,$T1b - insrdi $t0,$t1,16,32 - fmadd $T2a,$N2,$na,$T2a - fmadd $T2b,$N2,$nb,$T2b - add $t2,$t2,$carry - fmadd $T3a,$N3,$na,$T3a - fmadd $T3b,$N3,$nb,$T3b - srdi $carry,$t2,16 - fmadd $T0a,$N0,$na,$T0a - fmadd $T0b,$N0,$nb,$T0b - insrdi $t0,$t2,16,16 - add $t3,$t3,$carry - srdi $carry,$t3,16 - - fmadd $T1a,$N0,$nc,$T1a - fmadd $T1b,$N0,$nd,$T1b - insrdi $t0,$t3,16,0 ; 0..63 bits - fmadd $T2a,$N1,$nc,$T2a - fmadd $T2b,$N1,$nd,$T2b - add $t4,$t4,$carry - fmadd $T3a,$N2,$nc,$T3a - fmadd $T3b,$N2,$nd,$T3b - srdi $carry,$t4,16 - fmadd $dota,$N3,$nc,$dota - fmadd $dotb,$N3,$nd,$dotb - add $t5,$t5,$carry - srdi $carry,$t5,16 - insrdi $t4,$t5,16,32 - - fctid $T0a,$T0a - fctid $T0b,$T0b - add $t6,$t6,$carry - fctid $T1a,$T1a - fctid $T1b,$T1b - srdi $carry,$t6,16 - fctid $T2a,$T2a - fctid $T2b,$T2b - insrdi $t4,$t6,16,16 - fctid $T3a,$T3a - fctid $T3b,$T3b - add $t7,$t7,$carry - insrdi $t4,$t7,16,0 ; 64..127 bits - srdi $carry,$t7,16 ; upper 33 bits - - stfd $T0a,`$FRAME+0`($sp) - stfd $T0b,`$FRAME+8`($sp) - stfd $T1a,`$FRAME+16`($sp) - stfd $T1b,`$FRAME+24`($sp) - stfd $T2a,`$FRAME+32`($sp) - stfd $T2b,`$FRAME+40`($sp) - stfd $T3a,`$FRAME+48`($sp) - stfd $T3b,`$FRAME+56`($sp) - std $t0,8($tp) ; tp[j-1] - stdu $t4,16($tp) ; tp[j] - bdnz- L1st - - fctid $dota,$dota - fctid $dotb,$dotb - - ld $t0,`$FRAME+0`($sp) - ld $t1,`$FRAME+8`($sp) - ld $t2,`$FRAME+16`($sp) - ld $t3,`$FRAME+24`($sp) - ld $t4,`$FRAME+32`($sp) - ld $t5,`$FRAME+40`($sp) - ld $t6,`$FRAME+48`($sp) - ld $t7,`$FRAME+56`($sp) - stfd $dota,`$FRAME+64`($sp) - stfd $dotb,`$FRAME+72`($sp) - - add $t0,$t0,$carry ; can not overflow - srdi $carry,$t0,16 - add $t1,$t1,$carry - srdi $carry,$t1,16 - insrdi $t0,$t1,16,32 - add $t2,$t2,$carry - srdi $carry,$t2,16 - insrdi $t0,$t2,16,16 - add $t3,$t3,$carry - srdi $carry,$t3,16 - insrdi $t0,$t3,16,0 ; 0..63 bits - add $t4,$t4,$carry - srdi $carry,$t4,16 - add $t5,$t5,$carry - srdi $carry,$t5,16 - insrdi $t4,$t5,16,32 - add $t6,$t6,$carry - srdi $carry,$t6,16 - insrdi $t4,$t6,16,16 - add $t7,$t7,$carry - insrdi $t4,$t7,16,0 ; 64..127 bits - srdi $carry,$t7,16 ; upper 33 bits - ld $t6,`$FRAME+64`($sp) - ld $t7,`$FRAME+72`($sp) - - std $t0,8($tp) ; tp[j-1] - stdu $t4,16($tp) ; tp[j] - - add $t6,$t6,$carry ; can not overflow - srdi $carry,$t6,16 - add $t7,$t7,$carry - insrdi $t6,$t7,48,0 - srdi $ovf,$t7,48 - std $t6,8($tp) ; tp[num-1] - - slwi $t7,$num,2 - subf $nap_d,$t7,$nap_d ; rewind pointer - - li $i,8 ; i=1 -.align 5 -Louter: -___ -$code.=<<___ if ($SIZE_T==8); - ldx $t3,$bp,$i ; bp[i] -___ -$code.=<<___ if ($SIZE_T==4); - add $t0,$bp,$i - lwz $t3,0($t0) ; bp[i,i+1] - lwz $t0,4($t0) - insrdi $t3,$t0,32,0 -___ -$code.=<<___; - ld $t6,`$FRAME+$TRANSFER+8`($sp) ; tp[0] - mulld $t7,$a0,$t3 ; ap[0]*bp[i] - - addi $tp,$sp,`$FRAME+$TRANSFER` - add $t7,$t7,$t6 ; ap[0]*bp[i]+tp[0] - li $carry,0 - mulld $t7,$t7,$n0 ; tp[0]*n0 - mtctr $j - - ; transfer bp[i] to FPU as 4x16-bit values - extrdi $t0,$t3,16,48 - extrdi $t1,$t3,16,32 - extrdi $t2,$t3,16,16 - extrdi $t3,$t3,16,0 - std $t0,`$FRAME+0`($sp) - std $t1,`$FRAME+8`($sp) - std $t2,`$FRAME+16`($sp) - std $t3,`$FRAME+24`($sp) - ; transfer (ap[0]*bp[i]+tp[0])*n0 to FPU as 4x16-bit values - extrdi $t4,$t7,16,48 - extrdi $t5,$t7,16,32 - extrdi $t6,$t7,16,16 - extrdi $t7,$t7,16,0 - std $t4,`$FRAME+32`($sp) - std $t5,`$FRAME+40`($sp) - std $t6,`$FRAME+48`($sp) - std $t7,`$FRAME+56`($sp) - - lfd $A0,8($nap_d) ; load a[j] in double format - lfd $A1,16($nap_d) - lfd $A2,24($nap_d) ; load a[j+1] in double format - lfd $A3,32($nap_d) - lfd $N0,40($nap_d) ; load n[j] in double format - lfd $N1,48($nap_d) - lfd $N2,56($nap_d) ; load n[j+1] in double format - lfdu $N3,64($nap_d) - - lfd $ba,`$FRAME+0`($sp) - lfd $bb,`$FRAME+8`($sp) - lfd $bc,`$FRAME+16`($sp) - lfd $bd,`$FRAME+24`($sp) - lfd $na,`$FRAME+32`($sp) - lfd $nb,`$FRAME+40`($sp) - lfd $nc,`$FRAME+48`($sp) - lfd $nd,`$FRAME+56`($sp) - - fcfid $ba,$ba - fcfid $bb,$bb - fcfid $bc,$bc - fcfid $bd,$bd - fcfid $na,$na - fcfid $nb,$nb - fcfid $nc,$nc - fcfid $nd,$nd - - fmul $T1a,$A1,$ba - fmul $T1b,$A1,$bb - fmul $T2a,$A2,$ba - fmul $T2b,$A2,$bb - fmul $T3a,$A3,$ba - fmul $T3b,$A3,$bb - fmul $T0a,$A0,$ba - fmul $T0b,$A0,$bb - - fmadd $T1a,$A0,$bc,$T1a - fmadd $T1b,$A0,$bd,$T1b - fmadd $T2a,$A1,$bc,$T2a - fmadd $T2b,$A1,$bd,$T2b - fmadd $T3a,$A2,$bc,$T3a - fmadd $T3b,$A2,$bd,$T3b - fmul $dota,$A3,$bc - fmul $dotb,$A3,$bd - - fmadd $T1a,$N1,$na,$T1a - fmadd $T1b,$N1,$nb,$T1b - lfd $A0,8($nap_d) ; load a[j] in double format - lfd $A1,16($nap_d) - fmadd $T2a,$N2,$na,$T2a - fmadd $T2b,$N2,$nb,$T2b - lfd $A2,24($nap_d) ; load a[j+1] in double format - lfd $A3,32($nap_d) - fmadd $T3a,$N3,$na,$T3a - fmadd $T3b,$N3,$nb,$T3b - fmadd $T0a,$N0,$na,$T0a - fmadd $T0b,$N0,$nb,$T0b - - fmadd $T1a,$N0,$nc,$T1a - fmadd $T1b,$N0,$nd,$T1b - fmadd $T2a,$N1,$nc,$T2a - fmadd $T2b,$N1,$nd,$T2b - fmadd $T3a,$N2,$nc,$T3a - fmadd $T3b,$N2,$nd,$T3b - fmadd $dota,$N3,$nc,$dota - fmadd $dotb,$N3,$nd,$dotb - - fctid $T0a,$T0a - fctid $T0b,$T0b - fctid $T1a,$T1a - fctid $T1b,$T1b - fctid $T2a,$T2a - fctid $T2b,$T2b - fctid $T3a,$T3a - fctid $T3b,$T3b - - stfd $T0a,`$FRAME+0`($sp) - stfd $T0b,`$FRAME+8`($sp) - stfd $T1a,`$FRAME+16`($sp) - stfd $T1b,`$FRAME+24`($sp) - stfd $T2a,`$FRAME+32`($sp) - stfd $T2b,`$FRAME+40`($sp) - stfd $T3a,`$FRAME+48`($sp) - stfd $T3b,`$FRAME+56`($sp) - -.align 5 -Linner: - fmul $T1a,$A1,$ba - fmul $T1b,$A1,$bb - fmul $T2a,$A2,$ba - fmul $T2b,$A2,$bb - lfd $N0,40($nap_d) ; load n[j] in double format - lfd $N1,48($nap_d) - fmul $T3a,$A3,$ba - fmul $T3b,$A3,$bb - fmadd $T0a,$A0,$ba,$dota - fmadd $T0b,$A0,$bb,$dotb - lfd $N2,56($nap_d) ; load n[j+1] in double format - lfdu $N3,64($nap_d) - - fmadd $T1a,$A0,$bc,$T1a - fmadd $T1b,$A0,$bd,$T1b - fmadd $T2a,$A1,$bc,$T2a - fmadd $T2b,$A1,$bd,$T2b - lfd $A0,8($nap_d) ; load a[j] in double format - lfd $A1,16($nap_d) - fmadd $T3a,$A2,$bc,$T3a - fmadd $T3b,$A2,$bd,$T3b - fmul $dota,$A3,$bc - fmul $dotb,$A3,$bd - lfd $A2,24($nap_d) ; load a[j+1] in double format - lfd $A3,32($nap_d) - - fmadd $T1a,$N1,$na,$T1a - fmadd $T1b,$N1,$nb,$T1b - ld $t0,`$FRAME+0`($sp) - ld $t1,`$FRAME+8`($sp) - fmadd $T2a,$N2,$na,$T2a - fmadd $T2b,$N2,$nb,$T2b - ld $t2,`$FRAME+16`($sp) - ld $t3,`$FRAME+24`($sp) - fmadd $T3a,$N3,$na,$T3a - fmadd $T3b,$N3,$nb,$T3b - add $t0,$t0,$carry ; can not overflow - ld $t4,`$FRAME+32`($sp) - ld $t5,`$FRAME+40`($sp) - fmadd $T0a,$N0,$na,$T0a - fmadd $T0b,$N0,$nb,$T0b - srdi $carry,$t0,16 - add $t1,$t1,$carry - srdi $carry,$t1,16 - ld $t6,`$FRAME+48`($sp) - ld $t7,`$FRAME+56`($sp) - - fmadd $T1a,$N0,$nc,$T1a - fmadd $T1b,$N0,$nd,$T1b - insrdi $t0,$t1,16,32 - ld $t1,8($tp) ; tp[j] - fmadd $T2a,$N1,$nc,$T2a - fmadd $T2b,$N1,$nd,$T2b - add $t2,$t2,$carry - fmadd $T3a,$N2,$nc,$T3a - fmadd $T3b,$N2,$nd,$T3b - srdi $carry,$t2,16 - insrdi $t0,$t2,16,16 - fmadd $dota,$N3,$nc,$dota - fmadd $dotb,$N3,$nd,$dotb - add $t3,$t3,$carry - ldu $t2,16($tp) ; tp[j+1] - srdi $carry,$t3,16 - insrdi $t0,$t3,16,0 ; 0..63 bits - add $t4,$t4,$carry - - fctid $T0a,$T0a - fctid $T0b,$T0b - srdi $carry,$t4,16 - fctid $T1a,$T1a - fctid $T1b,$T1b - add $t5,$t5,$carry - fctid $T2a,$T2a - fctid $T2b,$T2b - srdi $carry,$t5,16 - insrdi $t4,$t5,16,32 - fctid $T3a,$T3a - fctid $T3b,$T3b - add $t6,$t6,$carry - srdi $carry,$t6,16 - insrdi $t4,$t6,16,16 - - stfd $T0a,`$FRAME+0`($sp) - stfd $T0b,`$FRAME+8`($sp) - add $t7,$t7,$carry - addc $t3,$t0,$t1 -___ -$code.=<<___ if ($SIZE_T==4); # adjust XER[CA] - extrdi $t0,$t0,32,0 - extrdi $t1,$t1,32,0 - adde $t0,$t0,$t1 -___ -$code.=<<___; - stfd $T1a,`$FRAME+16`($sp) - stfd $T1b,`$FRAME+24`($sp) - insrdi $t4,$t7,16,0 ; 64..127 bits - srdi $carry,$t7,16 ; upper 33 bits - stfd $T2a,`$FRAME+32`($sp) - stfd $T2b,`$FRAME+40`($sp) - adde $t5,$t4,$t2 -___ -$code.=<<___ if ($SIZE_T==4); # adjust XER[CA] - extrdi $t4,$t4,32,0 - extrdi $t2,$t2,32,0 - adde $t4,$t4,$t2 -___ -$code.=<<___; - stfd $T3a,`$FRAME+48`($sp) - stfd $T3b,`$FRAME+56`($sp) - addze $carry,$carry - std $t3,-16($tp) ; tp[j-1] - std $t5,-8($tp) ; tp[j] - bdnz- Linner - - fctid $dota,$dota - fctid $dotb,$dotb - ld $t0,`$FRAME+0`($sp) - ld $t1,`$FRAME+8`($sp) - ld $t2,`$FRAME+16`($sp) - ld $t3,`$FRAME+24`($sp) - ld $t4,`$FRAME+32`($sp) - ld $t5,`$FRAME+40`($sp) - ld $t6,`$FRAME+48`($sp) - ld $t7,`$FRAME+56`($sp) - stfd $dota,`$FRAME+64`($sp) - stfd $dotb,`$FRAME+72`($sp) - - add $t0,$t0,$carry ; can not overflow - srdi $carry,$t0,16 - add $t1,$t1,$carry - srdi $carry,$t1,16 - insrdi $t0,$t1,16,32 - add $t2,$t2,$carry - ld $t1,8($tp) ; tp[j] - srdi $carry,$t2,16 - insrdi $t0,$t2,16,16 - add $t3,$t3,$carry - ldu $t2,16($tp) ; tp[j+1] - srdi $carry,$t3,16 - insrdi $t0,$t3,16,0 ; 0..63 bits - add $t4,$t4,$carry - srdi $carry,$t4,16 - add $t5,$t5,$carry - srdi $carry,$t5,16 - insrdi $t4,$t5,16,32 - add $t6,$t6,$carry - srdi $carry,$t6,16 - insrdi $t4,$t6,16,16 - add $t7,$t7,$carry - insrdi $t4,$t7,16,0 ; 64..127 bits - srdi $carry,$t7,16 ; upper 33 bits - ld $t6,`$FRAME+64`($sp) - ld $t7,`$FRAME+72`($sp) - - addc $t3,$t0,$t1 -___ -$code.=<<___ if ($SIZE_T==4); # adjust XER[CA] - extrdi $t0,$t0,32,0 - extrdi $t1,$t1,32,0 - adde $t0,$t0,$t1 -___ -$code.=<<___; - adde $t5,$t4,$t2 -___ -$code.=<<___ if ($SIZE_T==4); # adjust XER[CA] - extrdi $t4,$t4,32,0 - extrdi $t2,$t2,32,0 - adde $t4,$t4,$t2 -___ -$code.=<<___; - addze $carry,$carry - - std $t3,-16($tp) ; tp[j-1] - std $t5,-8($tp) ; tp[j] - - add $carry,$carry,$ovf ; consume upmost overflow - add $t6,$t6,$carry ; can not overflow - srdi $carry,$t6,16 - add $t7,$t7,$carry - insrdi $t6,$t7,48,0 - srdi $ovf,$t7,48 - std $t6,0($tp) ; tp[num-1] - - slwi $t7,$num,2 - addi $i,$i,8 - subf $nap_d,$t7,$nap_d ; rewind pointer - cmpw $i,$num - blt- Louter -___ - -$code.=<<___ if ($SIZE_T==8); - subf $np,$num,$np ; rewind np - addi $j,$j,1 ; restore counter - subfc $i,$i,$i ; j=0 and "clear" XER[CA] - addi $tp,$sp,`$FRAME+$TRANSFER+8` - addi $t4,$sp,`$FRAME+$TRANSFER+16` - addi $t5,$np,8 - addi $t6,$rp,8 - mtctr $j - -.align 4 -Lsub: ldx $t0,$tp,$i - ldx $t1,$np,$i - ldx $t2,$t4,$i - ldx $t3,$t5,$i - subfe $t0,$t1,$t0 ; tp[j]-np[j] - subfe $t2,$t3,$t2 ; tp[j+1]-np[j+1] - stdx $t0,$rp,$i - stdx $t2,$t6,$i - addi $i,$i,16 - bdnz- Lsub - - li $i,0 - subfe $ovf,$i,$ovf ; handle upmost overflow bit - and $ap,$tp,$ovf - andc $np,$rp,$ovf - or $ap,$ap,$np ; ap=borrow?tp:rp - addi $t7,$ap,8 - mtctr $j - -.align 4 -Lcopy: ; copy or in-place refresh - ldx $t0,$ap,$i - ldx $t1,$t7,$i - std $i,8($nap_d) ; zap nap_d - std $i,16($nap_d) - std $i,24($nap_d) - std $i,32($nap_d) - std $i,40($nap_d) - std $i,48($nap_d) - std $i,56($nap_d) - stdu $i,64($nap_d) - stdx $t0,$rp,$i - stdx $t1,$t6,$i - stdx $i,$tp,$i ; zap tp at once - stdx $i,$t4,$i - addi $i,$i,16 - bdnz- Lcopy -___ -$code.=<<___ if ($SIZE_T==4); - subf $np,$num,$np ; rewind np - addi $j,$j,1 ; restore counter - subfc $i,$i,$i ; j=0 and "clear" XER[CA] - addi $tp,$sp,`$FRAME+$TRANSFER` - addi $np,$np,-4 - addi $rp,$rp,-4 - addi $ap,$sp,`$FRAME+$TRANSFER+4` - mtctr $j - -.align 4 -Lsub: ld $t0,8($tp) ; load tp[j..j+3] in 64-bit word order - ldu $t2,16($tp) - lwz $t4,4($np) ; load np[j..j+3] in 32-bit word order - lwz $t5,8($np) - lwz $t6,12($np) - lwzu $t7,16($np) - extrdi $t1,$t0,32,0 - extrdi $t3,$t2,32,0 - subfe $t4,$t4,$t0 ; tp[j]-np[j] - stw $t0,4($ap) ; save tp[j..j+3] in 32-bit word order - subfe $t5,$t5,$t1 ; tp[j+1]-np[j+1] - stw $t1,8($ap) - subfe $t6,$t6,$t2 ; tp[j+2]-np[j+2] - stw $t2,12($ap) - subfe $t7,$t7,$t3 ; tp[j+3]-np[j+3] - stwu $t3,16($ap) - stw $t4,4($rp) - stw $t5,8($rp) - stw $t6,12($rp) - stwu $t7,16($rp) - bdnz- Lsub - - li $i,0 - subfe $ovf,$i,$ovf ; handle upmost overflow bit - addi $tp,$sp,`$FRAME+$TRANSFER+4` - subf $rp,$num,$rp ; rewind rp - and $ap,$tp,$ovf - andc $np,$rp,$ovf - or $ap,$ap,$np ; ap=borrow?tp:rp - addi $tp,$sp,`$FRAME+$TRANSFER` - mtctr $j - -.align 4 -Lcopy: ; copy or in-place refresh - lwz $t0,4($ap) - lwz $t1,8($ap) - lwz $t2,12($ap) - lwzu $t3,16($ap) - std $i,8($nap_d) ; zap nap_d - std $i,16($nap_d) - std $i,24($nap_d) - std $i,32($nap_d) - std $i,40($nap_d) - std $i,48($nap_d) - std $i,56($nap_d) - stdu $i,64($nap_d) - stw $t0,4($rp) - stw $t1,8($rp) - stw $t2,12($rp) - stwu $t3,16($rp) - std $i,8($tp) ; zap tp at once - stdu $i,16($tp) - bdnz- Lcopy -___ - -$code.=<<___; - $POP $i,0($sp) - li r3,1 ; signal "handled" - $POP r22,`-12*8-10*$SIZE_T`($i) - $POP r23,`-12*8-9*$SIZE_T`($i) - $POP r24,`-12*8-8*$SIZE_T`($i) - $POP r25,`-12*8-7*$SIZE_T`($i) - $POP r26,`-12*8-6*$SIZE_T`($i) - $POP r27,`-12*8-5*$SIZE_T`($i) - $POP r28,`-12*8-4*$SIZE_T`($i) - $POP r29,`-12*8-3*$SIZE_T`($i) - $POP r30,`-12*8-2*$SIZE_T`($i) - $POP r31,`-12*8-1*$SIZE_T`($i) - lfd f20,`-12*8`($i) - lfd f21,`-11*8`($i) - lfd f22,`-10*8`($i) - lfd f23,`-9*8`($i) - lfd f24,`-8*8`($i) - lfd f25,`-7*8`($i) - lfd f26,`-6*8`($i) - lfd f27,`-5*8`($i) - lfd f28,`-4*8`($i) - lfd f29,`-3*8`($i) - lfd f30,`-2*8`($i) - lfd f31,`-1*8`($i) - mr $sp,$i - blr - .long 0 - .byte 0,12,4,0,0x8c,10,6,0 - .long 0 - -.asciz "Montgomery Multiplication for PPC64, CRYPTOGAMS by " -___ - -$code =~ s/\`([^\`]*)\`/eval $1/gem; -print $code; -close STDOUT; diff --git a/lib/libcrypto/bn/bn.h b/lib/libcrypto/bn/bn.h index 523ff4287..66a05ce9f 100644 --- a/lib/libcrypto/bn/bn.h +++ b/lib/libcrypto/bn/bn.h @@ -1,4 +1,4 @@ -/* $OpenBSD: bn.h,v 1.78 2024/04/10 14:58:06 beck Exp $ */ +/* $OpenBSD: bn.h,v 1.79 2025/01/06 13:15:08 tb Exp $ */ /* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -401,8 +401,8 @@ int BN_set_bit(BIGNUM *a, int n); int BN_clear_bit(BIGNUM *a, int n); char * BN_bn2hex(const BIGNUM *a); char * BN_bn2dec(const BIGNUM *a); -int BN_hex2bn(BIGNUM **a, const char *str); -int BN_dec2bn(BIGNUM **a, const char *str); +int BN_hex2bn(BIGNUM **a, const char *str); +int BN_dec2bn(BIGNUM **a, const char *str); int BN_asc2bn(BIGNUM **a, const char *str); int BN_gcd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); int BN_kronecker(const BIGNUM *a,const BIGNUM *b,BN_CTX *ctx); /* returns -2 for error */ @@ -421,7 +421,7 @@ int BN_is_prime_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, BN_GENCB *cb); int BN_is_prime_fasttest_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, int do_trial_division, BN_GENCB *cb); -BN_MONT_CTX *BN_MONT_CTX_new(void ); +BN_MONT_CTX *BN_MONT_CTX_new(void); int BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_MONT_CTX *mont, BN_CTX *ctx); int BN_to_montgomery(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont, diff --git a/lib/libcrypto/bn/bn_convert.c b/lib/libcrypto/bn/bn_convert.c index d38747e01..6a6354f44 100644 --- a/lib/libcrypto/bn/bn_convert.c +++ b/lib/libcrypto/bn/bn_convert.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bn_convert.c,v 1.22 2024/06/22 16:33:00 jsing Exp $ */ +/* $OpenBSD: bn_convert.c,v 1.23 2024/11/08 14:18:44 jsing Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -69,87 +69,73 @@ #include "bn_local.h" #include "bytestring.h" +#include "crypto_internal.h" static int bn_dec2bn_cbs(BIGNUM **bnp, CBS *cbs); static int bn_hex2bn_cbs(BIGNUM **bnp, CBS *cbs); static const char hex_digits[] = "0123456789ABCDEF"; -typedef enum { - big, - little, -} endianness_t; - -/* ignore negative */ static int -bn2binpad(const BIGNUM *a, unsigned char *to, int tolen, endianness_t endianness) +bn_bn2binpad_internal(const BIGNUM *bn, uint8_t *out, int out_len, + int little_endian) { - int n; - size_t i, lasti, j, atop, mask; - BN_ULONG l; + uint8_t mask, v; + BN_ULONG w; + int i, j; + int b, n; - /* - * In case |a| is fixed-top, BN_num_bytes can return bogus length, - * but it's assumed that fixed-top inputs ought to be "nominated" - * even for padded output, so it works out... - */ - n = BN_num_bytes(a); - if (tolen == -1) - tolen = n; - else if (tolen < n) { /* uncommon/unlike case */ - BIGNUM temp = *a; + n = BN_num_bytes(bn); - bn_correct_top(&temp); + if (out_len == -1) + out_len = n; + if (out_len < n) + return -1; - n = BN_num_bytes(&temp); - if (tolen < n) - return -1; + if (bn->dmax == 0) { + explicit_bzero(out, out_len); + return out_len; } - /* Swipe through whole available data and don't give away padded zero. */ - atop = a->dmax * BN_BYTES; - if (atop == 0) { - explicit_bzero(to, tolen); - return tolen; + mask = 0; + b = BN_BITS2; + j = 0; + + for (i = out_len - 1; i >= 0; i--) { + if (b == BN_BITS2) { + mask = crypto_ct_lt_mask(j, bn->top); + w = bn->d[j++ % bn->dmax]; + b = 0; + } + out[i] = (w >> b) & mask; + b += 8; } - lasti = atop - 1; - atop = a->top * BN_BYTES; - - if (endianness == big) - to += tolen; /* start from the end of the buffer */ - - for (i = 0, j = 0; j < (size_t)tolen; j++) { - unsigned char val; - - l = a->d[i / BN_BYTES]; - mask = 0 - ((j - atop) >> (8 * sizeof(i) - 1)); - val = (unsigned char)(l >> (8 * (i % BN_BYTES)) & mask); - - if (endianness == big) - *--to = val; - else - *to++ = val; - - i += (i - lasti) >> (8 * sizeof(i) - 1); /* stay on last limb */ + if (little_endian) { + for (i = 0, j = out_len - 1; i < out_len / 2; i++, j--) { + v = out[i]; + out[i] = out[j]; + out[j] = v; + } } - return tolen; + return out_len; } int -BN_bn2bin(const BIGNUM *a, unsigned char *to) +BN_bn2bin(const BIGNUM *bn, unsigned char *to) { - return bn2binpad(a, to, -1, big); + return bn_bn2binpad_internal(bn, to, -1, 0); } LCRYPTO_ALIAS(BN_bn2bin); int -BN_bn2binpad(const BIGNUM *a, unsigned char *to, int tolen) +BN_bn2binpad(const BIGNUM *bn, unsigned char *to, int to_len) { - if (tolen < 0) + if (to_len < 0) return -1; - return bn2binpad(a, to, tolen, big); + + return bn_bn2binpad_internal(bn, to, to_len, 0); } LCRYPTO_ALIAS(BN_bn2binpad); @@ -225,12 +211,12 @@ BN_bin2bn(const unsigned char *d, int len, BIGNUM *bn) LCRYPTO_ALIAS(BN_bin2bn); int -BN_bn2lebinpad(const BIGNUM *a, unsigned char *to, int tolen) +BN_bn2lebinpad(const BIGNUM *bn, unsigned char *to, int to_len) { - if (tolen < 0) + if (to_len < 0) return -1; - return bn2binpad(a, to, tolen, little); + return bn_bn2binpad_internal(bn, to, to_len, 1); } LCRYPTO_ALIAS(BN_bn2lebinpad); diff --git a/lib/libcrypto/bn/bn_local.h b/lib/libcrypto/bn/bn_local.h index 58b5d5490..310cce2a0 100644 --- a/lib/libcrypto/bn/bn_local.h +++ b/lib/libcrypto/bn/bn_local.h @@ -1,4 +1,4 @@ -/* $OpenBSD: bn_local.h,v 1.43 2024/04/16 13:07:14 jsing Exp $ */ +/* $OpenBSD: bn_local.h,v 1.45 2025/01/06 13:47:37 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -280,18 +280,16 @@ int bn_rand_interval(BIGNUM *rnd, BN_ULONG lower_word, const BIGNUM *upper_exc); void BN_init(BIGNUM *); -int BN_reciprocal(BIGNUM *r, const BIGNUM *m, int len, BN_CTX *ctx); - void BN_RECP_CTX_init(BN_RECP_CTX *recp); BN_RECP_CTX *BN_RECP_CTX_new(void); void BN_RECP_CTX_free(BN_RECP_CTX *recp); int BN_RECP_CTX_set(BN_RECP_CTX *recp, const BIGNUM *rdiv, BN_CTX *ctx); +int BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, BN_RECP_CTX *recp, + BN_CTX *ctx); int BN_mod_mul_reciprocal(BIGNUM *r, const BIGNUM *x, const BIGNUM *y, BN_RECP_CTX *recp, BN_CTX *ctx); int BN_mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx); -int BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, - BN_RECP_CTX *recp, BN_CTX *ctx); /* Explicitly const time / non-const time versions for internal use */ int BN_mod_exp_ct(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, diff --git a/lib/libcrypto/bn/bn_recp.c b/lib/libcrypto/bn/bn_recp.c index 35390e30d..c9a83f848 100644 --- a/lib/libcrypto/bn/bn_recp.c +++ b/lib/libcrypto/bn/bn_recp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bn_recp.c,v 1.19 2023/03/27 10:25:02 tb Exp $ */ +/* $OpenBSD: bn_recp.c,v 1.21 2025/01/06 13:47:37 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -107,30 +107,28 @@ BN_RECP_CTX_set(BN_RECP_CTX *recp, const BIGNUM *d, BN_CTX *ctx) return (1); } -int -BN_mod_mul_reciprocal(BIGNUM *r, const BIGNUM *x, const BIGNUM *y, - BN_RECP_CTX *recp, BN_CTX *ctx) +/* len is the expected size of the result + * We actually calculate with an extra word of precision, so + * we can do faster division if the remainder is not required. + */ +/* r := 2^len / m */ +static int +BN_reciprocal(BIGNUM *r, const BIGNUM *m, int len, BN_CTX *ctx) { - int ret = 0; - BIGNUM *a; - const BIGNUM *ca; + int ret = -1; + BIGNUM *t; BN_CTX_start(ctx); - if ((a = BN_CTX_get(ctx)) == NULL) + if ((t = BN_CTX_get(ctx)) == NULL) goto err; - if (y != NULL) { - if (x == y) { - if (!BN_sqr(a, x, ctx)) - goto err; - } else { - if (!BN_mul(a, x, y, ctx)) - goto err; - } - ca = a; - } else - ca = x; /* Just do the mod */ - ret = BN_div_recp(NULL, r, ca, recp, ctx); + if (!BN_set_bit(t, len)) + goto err; + + if (!BN_div_ct(r, NULL, t,m, ctx)) + goto err; + + ret = len; err: BN_CTX_end(ctx); @@ -231,28 +229,31 @@ err: return (ret); } -/* len is the expected size of the result - * We actually calculate with an extra word of precision, so - * we can do faster division if the remainder is not required. - */ -/* r := 2^len / m */ + int -BN_reciprocal(BIGNUM *r, const BIGNUM *m, int len, BN_CTX *ctx) +BN_mod_mul_reciprocal(BIGNUM *r, const BIGNUM *x, const BIGNUM *y, + BN_RECP_CTX *recp, BN_CTX *ctx) { - int ret = -1; - BIGNUM *t; + int ret = 0; + BIGNUM *a; + const BIGNUM *ca; BN_CTX_start(ctx); - if ((t = BN_CTX_get(ctx)) == NULL) + if ((a = BN_CTX_get(ctx)) == NULL) goto err; + if (y != NULL) { + if (x == y) { + if (!BN_sqr(a, x, ctx)) + goto err; + } else { + if (!BN_mul(a, x, y, ctx)) + goto err; + } + ca = a; + } else + ca = x; /* Just do the mod */ - if (!BN_set_bit(t, len)) - goto err; - - if (!BN_div_ct(r, NULL, t,m, ctx)) - goto err; - - ret = len; + ret = BN_div_recp(NULL, r, ca, recp, ctx); err: BN_CTX_end(ctx); diff --git a/lib/libcrypto/bytestring/bytestring.h b/lib/libcrypto/bytestring/bytestring.h index 171cfad0b..a8028c29f 100644 --- a/lib/libcrypto/bytestring/bytestring.h +++ b/lib/libcrypto/bytestring/bytestring.h @@ -1,4 +1,4 @@ -/* $OpenBSD: bytestring.h,v 1.5 2024/06/22 15:32:51 jsing Exp $ */ +/* $OpenBSD: bytestring.h,v 1.6 2024/12/05 19:57:37 tb Exp $ */ /* * Copyright (c) 2014, Google Inc. * diff --git a/lib/libcrypto/cert.pem b/lib/libcrypto/cert.pem index 0dd54a2a2..4d4d9f82b 100644 --- a/lib/libcrypto/cert.pem +++ b/lib/libcrypto/cert.pem @@ -1,4 +1,4 @@ -# $OpenBSD: cert.pem,v 1.28 2023/11/27 21:44:21 tb Exp $ +# $OpenBSD: cert.pem,v 1.30 2024/11/01 11:30:12 tb Exp $ ### /C=ES/CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 === /C=ES/CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 @@ -148,6 +148,65 @@ d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 -----END CERTIFICATE----- +### ANF Autoridad de Certificacion + +=== /serialNumber=G63287510/C=ES/O=ANF Autoridad de Certificacion/OU=ANF CA Raiz/CN=ANF Secure Server Root CA +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 996390341000653745 (0xdd3e3bc6cf96bb1) + Signature Algorithm: sha256WithRSAEncryption + Validity + Not Before: Sep 4 10:00:38 2019 GMT + Not After : Aug 30 10:00:38 2039 GMT + Subject: serialNumber=G63287510, C=ES, O=ANF Autoridad de Certificacion, OU=ANF CA Raiz, CN=ANF Secure Server Root CA + X509v3 extensions: + X509v3 Authority Key Identifier: + keyid:9C:5F:D0:6C:63:A3:5F:93:CA:93:98:08:AD:8C:87:A5:2C:5C:C1:37 + + X509v3 Subject Key Identifier: + 9C:5F:D0:6C:63:A3:5F:93:CA:93:98:08:AD:8C:87:A5:2C:5C:C1:37 + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE +SHA1 Fingerprint=5B:6E:68:D0:CC:15:B6:A0:5F:1E:C1:5F:AE:02:FC:6B:2F:5D:6F:74 +SHA256 Fingerprint=FB:8F:EC:75:91:69:B9:10:6B:1E:51:16:44:C6:18:C5:13:04:37:3F:6C:06:43:08:8D:8B:EF:FD:1B:99:75:99 +-----BEGIN CERTIFICATE----- +MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNV +BAUTCUc2MzI4NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlk +YWQgZGUgQ2VydGlmaWNhY2lvbjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNV +BAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3QgQ0EwHhcNMTkwOTA0MTAwMDM4WhcN +MzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEwMQswCQYDVQQGEwJF +UzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQwEgYD +VQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9v +dCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCj +cqQZAZ2cC4Ffc0m6p6zzBE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9q +yGFOtibBTI3/TO80sh9l2Ll49a2pcbnvT1gdpd50IJeh7WhM3pIXS7yr/2WanvtH +2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcvB2VSAKduyK9o7PQUlrZX +H1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXsezx76W0OL +zc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyR +p1RMVwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQz +W7i1o0TJrH93PB0j7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/ +SiOL9V8BY9KHcyi1Swr1+KuCLH5zJTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJn +LNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe8TZBAQIvfXOn3kLMTOmJDVb3 +n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVOHj1tyRRM4y5B +u8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj +o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AgEATh65isagmD9uw2nAalxJUqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L +9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzxj6ptBZNscsdW699QIyjlRRA96Gej +rw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDtdD+4E5UGUcjohybK +pFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM5gf0 +vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjq +OknkJjCb5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ +/zo1PqVUSlJZS2Db7v54EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ9 +2zg/LFis6ELhDtjTO0wugumDLmsx2d1Hhk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI ++PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGyg77FGr8H6lnco4g175x2 +MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3r5+qPeoo +tt7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw= +-----END CERTIFICATE----- + ### Actalis S.p.A./03358520967 === /C=IT/L=Milan/O=Actalis S.p.A./03358520967/CN=Actalis Authentication Root CA @@ -587,65 +646,6 @@ CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW 1KyLa2tJElMzrdfkviT8tQp21KW8EA== -----END CERTIFICATE----- -### ANF Autoridad de Certificacion - -=== /serialNumber=G63287510/C=ES/O=ANF Autoridad de Certificacion/OU=ANF CA Raiz/CN=ANF Secure Server Root CA -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 996390341000653745 (0xdd3e3bc6cf96bb1) - Signature Algorithm: sha256WithRSAEncryption - Validity - Not Before: Sep 4 10:00:38 2019 GMT - Not After : Aug 30 10:00:38 2039 GMT - Subject: serialNumber=G63287510, C=ES, O=ANF Autoridad de Certificacion, OU=ANF CA Raiz, CN=ANF Secure Server Root CA - X509v3 extensions: - X509v3 Authority Key Identifier: - keyid:9C:5F:D0:6C:63:A3:5F:93:CA:93:98:08:AD:8C:87:A5:2C:5C:C1:37 - - X509v3 Subject Key Identifier: - 9C:5F:D0:6C:63:A3:5F:93:CA:93:98:08:AD:8C:87:A5:2C:5C:C1:37 - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE -SHA1 Fingerprint=5B:6E:68:D0:CC:15:B6:A0:5F:1E:C1:5F:AE:02:FC:6B:2F:5D:6F:74 -SHA256 Fingerprint=FB:8F:EC:75:91:69:B9:10:6B:1E:51:16:44:C6:18:C5:13:04:37:3F:6C:06:43:08:8D:8B:EF:FD:1B:99:75:99 ------BEGIN CERTIFICATE----- -MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNV -BAUTCUc2MzI4NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlk -YWQgZGUgQ2VydGlmaWNhY2lvbjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNV -BAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3QgQ0EwHhcNMTkwOTA0MTAwMDM4WhcN -MzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEwMQswCQYDVQQGEwJF -UzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQwEgYD -VQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9v -dCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCj -cqQZAZ2cC4Ffc0m6p6zzBE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9q -yGFOtibBTI3/TO80sh9l2Ll49a2pcbnvT1gdpd50IJeh7WhM3pIXS7yr/2WanvtH -2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcvB2VSAKduyK9o7PQUlrZX -H1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXsezx76W0OL -zc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyR -p1RMVwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQz -W7i1o0TJrH93PB0j7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/ -SiOL9V8BY9KHcyi1Swr1+KuCLH5zJTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJn -LNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe8TZBAQIvfXOn3kLMTOmJDVb3 -n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVOHj1tyRRM4y5B -u8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj -o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC -AgEATh65isagmD9uw2nAalxJUqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L -9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzxj6ptBZNscsdW699QIyjlRRA96Gej -rw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDtdD+4E5UGUcjohybK -pFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM5gf0 -vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjq -OknkJjCb5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ -/zo1PqVUSlJZS2Db7v54EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ9 -2zg/LFis6ELhDtjTO0wugumDLmsx2d1Hhk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI -+PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGyg77FGr8H6lnco4g175x2 -MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3r5+qPeoo -tt7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw= ------END CERTIFICATE----- - ### Asseco Data Systems S.A. === /C=PL/O=Asseco Data Systems S.A./OU=Certum Certification Authority/CN=Certum EC-384 CA @@ -871,49 +871,6 @@ dDTedk+SKlOxJTnbPP/lPqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcE oji2jbDwN/zIIX8/syQbPYtuzE2wFg2WHYMfRsCbvUOZ58SWLs5fyQ== -----END CERTIFICATE----- -### Baltimore - -=== /C=IE/O=Baltimore/OU=CyberTrust/CN=Baltimore CyberTrust Root -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 33554617 (0x20000b9) - Signature Algorithm: sha1WithRSAEncryption - Validity - Not Before: May 12 18:46:00 2000 GMT - Not After : May 12 23:59:00 2025 GMT - Subject: C=IE, O=Baltimore, OU=CyberTrust, CN=Baltimore CyberTrust Root - X509v3 extensions: - X509v3 Subject Key Identifier: - E5:9D:59:30:82:47:58:CC:AC:FA:08:54:36:86:7B:3A:B5:04:4D:F0 - X509v3 Basic Constraints: critical - CA:TRUE, pathlen:3 - X509v3 Key Usage: critical - Certificate Sign, CRL Sign -SHA1 Fingerprint=D4:DE:20:D0:5E:66:FC:53:FE:1A:50:88:2C:78:DB:28:52:CA:E4:74 -SHA256 Fingerprint=16:AF:57:A9:F6:76:B0:AB:12:60:95:AA:5E:BA:DE:F2:2A:B3:11:19:D6:44:AC:95:CD:4B:93:DB:F3:F2:6A:EB ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - ### BEIJING CERTIFICATE AUTHORITY === /C=CN/O=BEIJING CERTIFICATE AUTHORITY/CN=BJCA Global Root CA1 @@ -1003,6 +960,49 @@ AgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA 43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== -----END CERTIFICATE----- +### Baltimore + +=== /C=IE/O=Baltimore/OU=CyberTrust/CN=Baltimore CyberTrust Root +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 33554617 (0x20000b9) + Signature Algorithm: sha1WithRSAEncryption + Validity + Not Before: May 12 18:46:00 2000 GMT + Not After : May 12 23:59:00 2025 GMT + Subject: C=IE, O=Baltimore, OU=CyberTrust, CN=Baltimore CyberTrust Root + X509v3 extensions: + X509v3 Subject Key Identifier: + E5:9D:59:30:82:47:58:CC:AC:FA:08:54:36:86:7B:3A:B5:04:4D:F0 + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:3 + X509v3 Key Usage: critical + Certificate Sign, CRL Sign +SHA1 Fingerprint=D4:DE:20:D0:5E:66:FC:53:FE:1A:50:88:2C:78:DB:28:52:CA:E4:74 +SHA256 Fingerprint=16:AF:57:A9:F6:76:B0:AB:12:60:95:AA:5E:BA:DE:F2:2A:B3:11:19:D6:44:AC:95:CD:4B:93:DB:F3:F2:6A:EB +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + ### Buypass AS-983163327 === /C=NO/O=Buypass AS-983163327/CN=Buypass Class 2 Root CA @@ -1106,6 +1106,203 @@ u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq 4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= -----END CERTIFICATE----- +### CERTSIGN SA + +=== /C=RO/O=CERTSIGN SA/OU=certSIGN ROOT CA G2 +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 11:00:34:b6:4e:c6:36:2d:36 + Signature Algorithm: sha256WithRSAEncryption + Validity + Not Before: Feb 6 09:27:35 2017 GMT + Not After : Feb 6 09:27:35 2042 GMT + Subject: C=RO, O=CERTSIGN SA, OU=certSIGN ROOT CA G2 + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + 82:21:2D:66:C6:D7:A0:E0:15:EB:CE:4C:09:77:C4:60:9E:54:6E:03 +SHA1 Fingerprint=26:F9:93:B4:ED:3D:28:27:B0:B9:4B:A7:E9:15:1D:A3:8D:92:E5:32 +SHA256 Fingerprint=65:7C:FE:2F:A7:3F:AA:38:46:25:71:F3:32:A2:36:3A:46:FC:E7:02:09:51:71:07:02:CD:FB:B6:EE:DA:33:05 +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV +BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g +Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ +BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ +R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF +dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw +vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ +uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp +n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs +cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW +xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P +rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF +DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx +DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy +LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C +eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ +d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq +kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl +qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 +OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c +NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk +ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO +pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj +03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk +PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE +1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX +QRBdJ3NghVdJIgc= +-----END CERTIFICATE----- + +### COMODO CA Limited + +=== /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO Certification Authority +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 4e:81:2d:8a:82:65:e0:0b:02:ee:3e:35:02:46:e5:3d + Signature Algorithm: sha1WithRSAEncryption + Validity + Not Before: Dec 1 00:00:00 2006 GMT + Not After : Dec 31 23:59:59 2029 GMT + Subject: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=COMODO Certification Authority + X509v3 extensions: + X509v3 Subject Key Identifier: + 0B:58:E5:8B:C6:4C:15:37:A4:40:A9:30:A9:21:BE:47:36:5A:56:FF + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 CRL Distribution Points: + + Full Name: + URI:http://crl.comodoca.com/COMODOCertificationAuthority.crl + +SHA1 Fingerprint=66:31:BF:9E:F7:4F:9E:B6:C9:D5:A6:0C:BA:6A:BE:D1:F7:BD:EF:7B +SHA256 Fingerprint=0C:2C:D6:3D:F7:80:6F:A3:99:ED:E8:09:11:6B:57:5B:F8:79:89:F0:65:18:F9:80:8C:86:05:03:17:8B:AF:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- +=== /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO ECC Certification Authority +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 1f:47:af:aa:62:00:70:50:54:4c:01:9e:9b:63:99:2a + Signature Algorithm: ecdsa-with-SHA384 + Validity + Not Before: Mar 6 00:00:00 2008 GMT + Not After : Jan 18 23:59:59 2038 GMT + Subject: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=COMODO ECC Certification Authority + X509v3 extensions: + X509v3 Subject Key Identifier: + 75:71:A7:19:48:19:BC:9D:9D:EA:41:47:DF:94:C4:48:77:99:D3:79 + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE +SHA1 Fingerprint=9F:74:4E:9F:2B:4D:BA:EC:0F:31:2C:50:B6:56:3B:8E:2D:93:C3:11 +SHA256 Fingerprint=17:93:92:7A:06:14:54:97:89:AD:CE:2F:8F:34:F7:F0:B6:6D:0F:3A:E3:A3:B8:4D:21:EC:15:DB:BA:4F:AD:C7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- +=== /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 4c:aa:f9:ca:db:63:6f:e0:1f:f7:4e:d8:5b:03:86:9d + Signature Algorithm: sha384WithRSAEncryption + Validity + Not Before: Jan 19 00:00:00 2010 GMT + Not After : Jan 18 23:59:59 2038 GMT + Subject: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=COMODO RSA Certification Authority + X509v3 extensions: + X509v3 Subject Key Identifier: + BB:AF:7E:02:3D:FA:A6:F1:3C:84:8E:AD:EE:38:98:EC:D9:32:32:D4 + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE +SHA1 Fingerprint=AF:E5:D2:44:A8:D1:19:42:30:FF:47:9F:E2:F8:97:BB:CD:7A:8C:B4 +SHA256 Fingerprint=52:F0:E1:C4:E5:8E:C6:29:29:1B:60:31:7F:07:46:71:B8:5D:7E:A8:0D:5B:07:27:34:63:53:4B:32:B4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + ### Certainly === /C=US/O=Certainly/CN=Certainly Root E1 @@ -1193,102 +1390,6 @@ wXARPbv0+Em34yaXOp/SX3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6 OV+KmalBWQewLK8= -----END CERTIFICATE----- -### certSIGN - -=== /C=RO/O=certSIGN/OU=certSIGN ROOT CA -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 35210227249154 (0x200605167002) - Signature Algorithm: sha1WithRSAEncryption - Validity - Not Before: Jul 4 17:20:04 2006 GMT - Not After : Jul 4 17:20:04 2031 GMT - Subject: C=RO, O=certSIGN, OU=certSIGN ROOT CA - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Key Usage: critical - Digital Signature, Non Repudiation, Certificate Sign, CRL Sign - X509v3 Subject Key Identifier: - E0:8C:9B:DB:25:49:B3:F1:7C:86:D6:B2:42:87:0B:D0:6B:A0:D9:E4 -SHA1 Fingerprint=FA:B7:EE:36:97:26:62:FB:2D:B0:2A:F6:BF:03:FD:E8:7C:4B:2F:9B -SHA256 Fingerprint=EA:A9:62:C4:FA:4A:6B:AF:EB:E4:15:19:6D:35:1C:CD:88:8D:4F:53:F3:FA:8A:E6:D7:C4:66:A9:4E:60:42:BB ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -### CERTSIGN SA - -=== /C=RO/O=CERTSIGN SA/OU=certSIGN ROOT CA G2 -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 11:00:34:b6:4e:c6:36:2d:36 - Signature Algorithm: sha256WithRSAEncryption - Validity - Not Before: Feb 6 09:27:35 2017 GMT - Not After : Feb 6 09:27:35 2042 GMT - Subject: C=RO, O=CERTSIGN SA, OU=certSIGN ROOT CA G2 - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Subject Key Identifier: - 82:21:2D:66:C6:D7:A0:E0:15:EB:CE:4C:09:77:C4:60:9E:54:6E:03 -SHA1 Fingerprint=26:F9:93:B4:ED:3D:28:27:B0:B9:4B:A7:E9:15:1D:A3:8D:92:E5:32 -SHA256 Fingerprint=65:7C:FE:2F:A7:3F:AA:38:46:25:71:F3:32:A2:36:3A:46:FC:E7:02:09:51:71:07:02:CD:FB:B6:EE:DA:33:05 ------BEGIN CERTIFICATE----- -MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV -BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g -Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ -BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ -R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF -dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw -vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ -uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp -n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs -cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW -xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P -rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF -DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx -DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy -LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C -eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ -d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq -kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC -b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl -qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 -OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c -NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk -ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO -pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj -03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk -PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE -1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX -QRBdJ3NghVdJIgc= ------END CERTIFICATE----- - ### China Financial Certification Authority === /C=CN/O=China Financial Certification Authority/CN=CFCA EV ROOT @@ -1454,147 +1555,177 @@ W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D hNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- -### COMODO CA Limited +### CommScope -=== /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO Certification Authority +=== /C=US/O=CommScope/CN=CommScope Public Trust ECC Root-01 Certificate: Data: Version: 3 (0x2) Serial Number: - 4e:81:2d:8a:82:65:e0:0b:02:ee:3e:35:02:46:e5:3d - Signature Algorithm: sha1WithRSAEncryption - Validity - Not Before: Dec 1 00:00:00 2006 GMT - Not After : Dec 31 23:59:59 2029 GMT - Subject: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=COMODO Certification Authority - X509v3 extensions: - X509v3 Subject Key Identifier: - 0B:58:E5:8B:C6:4C:15:37:A4:40:A9:30:A9:21:BE:47:36:5A:56:FF - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 CRL Distribution Points: - - Full Name: - URI:http://crl.comodoca.com/COMODOCertificationAuthority.crl - -SHA1 Fingerprint=66:31:BF:9E:F7:4F:9E:B6:C9:D5:A6:0C:BA:6A:BE:D1:F7:BD:EF:7B -SHA256 Fingerprint=0C:2C:D6:3D:F7:80:6F:A3:99:ED:E8:09:11:6B:57:5B:F8:79:89:F0:65:18:F9:80:8C:86:05:03:17:8B:AF:66 ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- -=== /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO ECC Certification Authority -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 1f:47:af:aa:62:00:70:50:54:4c:01:9e:9b:63:99:2a + 43:70:82:77:cf:4d:5d:34:f1:ca:ae:32:2f:37:f7:f4:7f:75:a0:9e Signature Algorithm: ecdsa-with-SHA384 Validity - Not Before: Mar 6 00:00:00 2008 GMT - Not After : Jan 18 23:59:59 2038 GMT - Subject: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=COMODO ECC Certification Authority + Not Before: Apr 28 17:35:43 2021 GMT + Not After : Apr 28 17:35:42 2046 GMT + Subject: C=US, O=CommScope, CN=CommScope Public Trust ECC Root-01 X509v3 extensions: - X509v3 Subject Key Identifier: - 75:71:A7:19:48:19:BC:9D:9D:EA:41:47:DF:94:C4:48:77:99:D3:79 - X509v3 Key Usage: critical - Certificate Sign, CRL Sign X509v3 Basic Constraints: critical CA:TRUE -SHA1 Fingerprint=9F:74:4E:9F:2B:4D:BA:EC:0F:31:2C:50:B6:56:3B:8E:2D:93:C3:11 -SHA256 Fingerprint=17:93:92:7A:06:14:54:97:89:AD:CE:2F:8F:34:F7:F0:B6:6D:0F:3A:E3:A3:B8:4D:21:EC:15:DB:BA:4F:AD:C7 + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + 8E:07:62:C0:50:DD:C6:19:06:00:46:74:04:F7:F3:AE:7D:75:4D:30 +SHA1 Fingerprint=07:86:C0:D8:DD:8E:C0:80:98:06:98:D0:58:7A:EF:DE:A6:CC:A2:5D +SHA256 Fingerprint=11:43:7C:DA:7B:B4:5E:41:36:5F:45:B3:9A:38:98:6B:0D:E0:0D:EF:34:8E:0C:7B:B0:87:36:33:80:0B:C3:8B -----BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMw +TjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29t +bVNjb3BlIFB1YmxpYyBUcnVzdCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNa +Fw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2Nv +cGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDEw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLxeP0C +flfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJE +hRGnSjot6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggq +hkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg +2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liWpDVfG2XqYZpwI7UNo5uS +Um9poIyNStDuiw7LR47QjRE= -----END CERTIFICATE----- -=== /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority +=== /C=US/O=CommScope/CN=CommScope Public Trust ECC Root-02 Certificate: Data: Version: 3 (0x2) Serial Number: - 4c:aa:f9:ca:db:63:6f:e0:1f:f7:4e:d8:5b:03:86:9d - Signature Algorithm: sha384WithRSAEncryption + 28:fd:99:60:41:47:a6:01:3a:ca:14:7b:1f:ef:f9:68:08:83:5d:7d + Signature Algorithm: ecdsa-with-SHA384 Validity - Not Before: Jan 19 00:00:00 2010 GMT - Not After : Jan 18 23:59:59 2038 GMT - Subject: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=COMODO RSA Certification Authority + Not Before: Apr 28 17:44:54 2021 GMT + Not After : Apr 28 17:44:53 2046 GMT + Subject: C=US, O=CommScope, CN=CommScope Public Trust ECC Root-02 X509v3 extensions: - X509v3 Subject Key Identifier: - BB:AF:7E:02:3D:FA:A6:F1:3C:84:8E:AD:EE:38:98:EC:D9:32:32:D4 - X509v3 Key Usage: critical - Certificate Sign, CRL Sign X509v3 Basic Constraints: critical CA:TRUE -SHA1 Fingerprint=AF:E5:D2:44:A8:D1:19:42:30:FF:47:9F:E2:F8:97:BB:CD:7A:8C:B4 -SHA256 Fingerprint=52:F0:E1:C4:E5:8E:C6:29:29:1B:60:31:7F:07:46:71:B8:5D:7E:A8:0D:5B:07:27:34:63:53:4B:32:B4:02:34 + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + E6:18:75:FF:EF:60:DE:84:A4:F5:46:C7:DE:4A:55:E3:32:36:79:F5 +SHA1 Fingerprint=3C:3F:EF:57:0F:FE:65:93:86:9E:A0:FE:B0:F6:ED:8E:D1:13:C7:E5 +SHA256 Fingerprint=2F:FB:7F:81:3B:BB:B3:C8:9A:B4:E8:16:2D:0F:16:D7:15:09:A8:30:CC:9D:73:C2:62:E5:14:08:75:D1:AD:4A -----BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 +MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMw +TjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29t +bVNjb3BlIFB1YmxpYyBUcnVzdCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRa +Fw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21tU2Nv +cGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgRUNDIFJvb3QtMDIw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/MMDAL +j2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmU +v4RDsNuESgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggq +hkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/n +ich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs73u1Z/GtMMH9ZzkXpc2AV +mkzw5l4lIhVtwodZ0LKOag== +-----END CERTIFICATE----- +=== /C=US/O=CommScope/CN=CommScope Public Trust RSA Root-01 +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 3e:03:49:81:75:16:74:31:8e:4c:ab:d5:c5:90:29:96:c5:39:10:dd + Signature Algorithm: sha256WithRSAEncryption + Validity + Not Before: Apr 28 16:45:54 2021 GMT + Not After : Apr 28 16:45:53 2046 GMT + Subject: C=US, O=CommScope, CN=CommScope Public Trust RSA Root-01 + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + 37:5D:A6:9A:74:32:C2:C2:F9:C7:A6:15:10:59:B8:E4:FD:E5:B8:6D +SHA1 Fingerprint=6D:0A:5F:F7:B4:23:06:B4:85:B3:B7:97:64:FC:AC:75:F5:33:F2:93 +SHA256 Fingerprint=02:BD:F9:6E:2A:45:DD:9B:F1:8F:C7:E1:DB:DF:21:A0:37:9B:A3:C9:C2:61:03:44:CF:D8:D6:06:FE:C1:ED:81 +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQEL +BQAwTjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwi +Q29tbVNjb3BlIFB1YmxpYyBUcnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1 +NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21t +U2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFJvb3Qt +MDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45FtnYSk +YZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslh +suitQDy6uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0al +DrJLpA6lfO741GIDuZNqihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3Oj +WiE260f6GBfZumbCk6SP/F2krfxQapWsvCQz0b2If4b19bJzKo98rwjyGpg/qYFl +P8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/cZip8UlF1y5mO6D1cv547 +KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTifBSeolz7p +UcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/ +kQO9lLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JO +Hg9O5j9ZpSPcPYeoKFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkB +Ea801M/XrmLTBQe0MXXgDW1XT2mH+VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6U +CBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm45P3luG0wDQYJ +KoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6 +NWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQ +nmhUQo8mUuJM3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+ +QgvfKNmwrZggvkN80V4aCRckjXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2v +trV0KnahP/t1MJ+UXjulYPPLXAziDslg+MkfFoom3ecnf+slpoq9uC02EJqxWE2a +aE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/WNyVntHKLr4W96ioD +j8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+o/E4 +Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0w +lREQKC6/oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHn +YfkUyq+Dj7+vsQpZXdxc1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVoc +icCMb3SgazNNtQEo/a2tiRc7ppqEvOuM6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw +-----END CERTIFICATE----- +=== /C=US/O=CommScope/CN=CommScope Public Trust RSA Root-02 +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 54:16:bf:3b:7e:39:95:71:8d:d1:aa:00:a5:86:0d:2b:8f:7a:05:4e + Signature Algorithm: sha256WithRSAEncryption + Validity + Not Before: Apr 28 17:16:43 2021 GMT + Not After : Apr 28 17:16:42 2046 GMT + Subject: C=US, O=CommScope, CN=CommScope Public Trust RSA Root-02 + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + 47:D0:E7:B1:22:FF:9D:2C:F5:D9:57:60:B3:B1:B1:70:95:EF:61:7A +SHA1 Fingerprint=EA:B0:E2:52:1B:89:93:4C:11:68:F2:D8:9A:AC:22:4C:A3:8A:57:AE +SHA256 Fingerprint=FF:E9:43:D7:93:42:4B:4F:7C:44:0C:1C:3D:64:8D:53:63:F3:4B:82:DC:87:AA:7A:9F:11:8F:C5:DE:E1:01:F1 +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQEL +BQAwTjELMAkGA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwi +Q29tbVNjb3BlIFB1YmxpYyBUcnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2 +NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNVBAYTAlVTMRIwEAYDVQQKDAlDb21t +U2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3QgUlNBIFJvb3Qt +MDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3VrCLE +NQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0 +kyI9p+Kx7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1C +rWDaSWqVcN3SAOLMV2MCe5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxz +hkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2WWy09X6GDRl224yW4fKcZgBzqZUPckXk2 +LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rpM9kzXzehxfCrPfp4sOcs +n/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIfhs1w/tku +FT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5 +kQMreyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3 +wNemKfrb3vOTlycEVS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6v +wQcQeKwRoi9C8DfF8rhW3Q5iLc4tVn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs +5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7GxcJXvYXowDQYJ +KoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB +KCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3 ++VGXu6TwYofF1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbyme +APnCKfWxkxlSaRosTKCL4BWaMS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3Nyq +pgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xdgSGn2rtO/+YHqP65DSdsu3BaVXoT +6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2OHG1QAk8mGEPej1WF +sQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+NmYWvt +PjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2d +lklyALKrdVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670 +v64fG9PiO/yzcnMcmyiQiRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17O +rg3bhzjlP1v9mxnhMUF6cKojawHhRUzNlM47ni3niAIi9G7oyOzWPPO5std3eqx7 -----END CERTIFICATE----- ### Comodo CA Limited @@ -1652,6 +1783,136 @@ l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- +### Cybertrust Japan Co., Ltd. + +=== /C=JP/O=Cybertrust Japan Co., Ltd./CN=SecureSign Root CA12 +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 66:f9:c7:c1:af:ec:c2:51:b4:ed:53:97:e6:e6:82:c3:2b:1c:90:16 + Signature Algorithm: sha256WithRSAEncryption + Validity + Not Before: Apr 8 05:36:46 2020 GMT + Not After : Apr 8 05:36:46 2040 GMT + Subject: C=JP, O=Cybertrust Japan Co., Ltd., CN=SecureSign Root CA12 + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + 57:34:F3:74:CF:04:4B:D5:25:E6:F1:40:B6:2C:4C:D9:2D:E9:A0:AD +SHA1 Fingerprint=7A:22:1E:3D:DE:1B:06:AC:9E:C8:47:70:16:8E:3C:E5:F7:6B:06:F4 +SHA256 Fingerprint=3F:03:4B:B5:70:4D:44:B2:D0:85:45:A0:20:57:DE:93:EB:F3:90:5F:CE:72:1A:CB:C7:30:C0:6D:DA:EE:90:4E +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u +LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgw +NTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD +eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS +b290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3emhF +KxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mt +p7JIKwccJ/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zd +J1M3s6oYwlkm7Fsf0uZlfO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gur +FzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBFEaCeVESE99g2zvVQR9wsMJvuwPWW0v4J +hscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1UefNzFJM3IFTQy2VYzxV4+K +h9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsF +AAOCAQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6Ld +mmQOmFxv3Y67ilQiLUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJ +mBClnW8Zt7vPemVV2zfrPIpyMpcemik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA +8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPSvWKErI4cqc1avTc7bgoitPQV +55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhgaaaI5gdka9at/ +yOPiZwud9AzqVN/Ssq+xIvEg37xEHA== +-----END CERTIFICATE----- +=== /C=JP/O=Cybertrust Japan Co., Ltd./CN=SecureSign Root CA14 +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 64:db:5a:0c:20:4e:e8:d7:29:77:c8:50:27:a2:5a:27:dd:2d:f2:cb + Signature Algorithm: sha384WithRSAEncryption + Validity + Not Before: Apr 8 07:06:19 2020 GMT + Not After : Apr 8 07:06:19 2045 GMT + Subject: C=JP, O=Cybertrust Japan Co., Ltd., CN=SecureSign Root CA14 + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + 06:93:A3:0A:5E:28:69:37:AA:61:1D:EB:EB:FC:2D:6F:23:E4:F3:A0 +SHA1 Fingerprint=DD:50:C0:F7:79:B3:64:2E:74:A2:B8:9D:9F:D3:40:DD:BB:F0:F2:4F +SHA256 Fingerprint=4B:00:9C:10:34:49:4F:9A:B5:6B:BA:3B:A1:D6:27:31:FC:4D:20:D8:95:5A:DC:EC:10:A9:25:60:72:61:E3:38 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEM +BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u +LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgw +NzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD +eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS +b290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh1oq/ +FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOg +vlIfX8xnbacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy +6pJxaeQp8E+BgQQ8sqVb1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo +/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9J +kdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOEkJTRX45zGRBdAuVwpcAQ +0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSxjVIHvXib +y8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac +18izju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs +0Wq2XSqypWa9a4X0dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIAB +SMbHdPTGrMNASRZhdCyvjG817XsYAFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVL +ApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeqYR3r6/wtbyPk +86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E +rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ib +ed87hwriZLoAymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopT +zfFP7ELyk+OZpDc8h7hi2/DsHzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHS +DCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPGFrojutzdfhrGe0K22VoF3Jpf1d+4 +2kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6qnsb58Nn4DSEC5MUo +FlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/OfVy +K4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6 +dB7h7sxaOgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtl +Lor6CZpO2oYofaphNdgOpygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB +365jJ6UeTo3cKXhZ+PmhIIynJkBugnLNeLLIjzwec+fBH7/PzqUqm9tEZDKgu39c +JRNItX+S +-----END CERTIFICATE----- +=== /C=JP/O=Cybertrust Japan Co., Ltd./CN=SecureSign Root CA15 +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 16:15:c7:c3:d8:49:a7:be:69:0c:8a:88:ed:f0:70:f9:dd:b7:3e:87 + Signature Algorithm: ecdsa-with-SHA384 + Validity + Not Before: Apr 8 08:32:56 2020 GMT + Not After : Apr 8 08:32:56 2045 GMT + Subject: C=JP, O=Cybertrust Japan Co., Ltd., CN=SecureSign Root CA15 + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + EB:41:C8:AE:FC:D5:9E:51:48:F5:BD:8B:F4:87:20:93:41:2B:D3:F4 +SHA1 Fingerprint=CB:BA:83:C8:C1:5A:5D:F1:F9:73:6F:CA:D7:EF:28:13:06:4A:07:7D +SHA256 Fingerprint=E7:78:F0:F0:95:FE:84:37:29:CD:1A:00:82:17:9E:53:14:A9:C2:91:44:28:05:E1:FB:1D:8F:B6:B8:88:6C:3A +-----BEGIN CERTIFICATE----- +MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMw +UTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBM +dGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMy +NTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpDeWJl +cnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBSb290 +IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5GdCx4 +wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSR +ZHX+AezB2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT +9DAKBggqhkjOPQQDAwNoADBlAjEA2S6Jfl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp +4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJSwdLZrWeqrqgHkHZAXQ6 +bkU6iYAZezKYVWOr62Nuk22rGwlgMU4= +-----END CERTIFICATE----- + ### D-Trust GmbH === /C=DE/O=D-Trust GmbH/CN=D-TRUST BR Root CA 1 2020 @@ -1851,6 +2112,100 @@ xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 -----END CERTIFICATE----- +### Deutsche Telekom Security GmbH + +=== /C=DE/O=Deutsche Telekom Security GmbH/CN=Telekom Security TLS ECC Root 2020 +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 36:3a:96:8c:c9:5c:b2:58:cd:d0:01:5d:c5:e5:57:00 + Signature Algorithm: ecdsa-with-SHA384 + Validity + Not Before: Aug 25 07:48:20 2020 GMT + Not After : Aug 25 23:59:59 2045 GMT + Subject: C=DE, O=Deutsche Telekom Security GmbH, CN=Telekom Security TLS ECC Root 2020 + X509v3 extensions: + X509v3 Subject Key Identifier: + E3:72:CC:6E:95:99:47:B1:E6:B3:61:4C:D1:CB:AB:E3:BA:CD:DE:9F + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Key Usage: critical + Certificate Sign, CRL Sign +SHA1 Fingerprint=C0:F8:96:C5:A9:3B:01:06:21:07:DA:18:42:48:BC:E9:9D:88:D5:EC +SHA256 Fingerprint=57:8A:F4:DE:D0:85:3F:4E:59:98:DB:4A:EA:F9:CB:EA:8D:94:5F:60:B6:20:A3:8D:1A:3C:13:B2:BC:7B:A8:E1 +-----BEGIN CERTIFICATE----- +MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQsw +CQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBH +bWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIw +MB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIzNTk1OVowYzELMAkGA1UEBhMCREUx +JzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkGA1UE +AwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/O +tdKPD/M12kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDP +f8iAC8GXs7s1J8nCG6NCMEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6f +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cA +MGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZMo7k+5Dck2TOrbRBR2Di +z6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdUga/sf+Rn +27iQ7t0l +-----END CERTIFICATE----- +=== /C=DE/O=Deutsche Telekom Security GmbH/CN=Telekom Security TLS RSA Root 2023 +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 21:9c:54:2d:e8:f6:ec:71:77:fa:4e:e8:c3:70:57:97 + Signature Algorithm: sha384WithRSAEncryption + Validity + Not Before: Mar 28 12:16:45 2023 GMT + Not After : Mar 27 23:59:59 2048 GMT + Subject: C=DE, O=Deutsche Telekom Security GmbH, CN=Telekom Security TLS RSA Root 2023 + X509v3 extensions: + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + B6:A7:97:82:3D:74:85:9B:F7:3C:9F:93:9A:95:79:75:52:8C:6D:47 + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Authority Key Identifier: + keyid:B6:A7:97:82:3D:74:85:9B:F7:3C:9F:93:9A:95:79:75:52:8C:6D:47 + +SHA1 Fingerprint=54:D3:AC:B3:BD:57:56:F6:85:9D:CE:E5:C3:21:E2:D4:AD:83:D0:93 +SHA256 Fingerprint=EF:C6:5C:AD:BB:59:AD:B6:EF:E8:4D:A2:23:11:B3:56:24:B7:1B:3B:1E:A0:DA:8B:66:55:17:4E:C8:97:86:46 +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBj +MQswCQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0 +eSBHbWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAy +MDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMyNzIzNTk1OVowYzELMAkGA1UEBhMC +REUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkG +A1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9 +cUD/h3VCKSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHV +cp6R+SPWcHu79ZvB7JPPGeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMA +U6DksquDOFczJZSfvkgdmOGjup5czQRxUX11eKvzWarE4GC+j4NSuHUaQTXtvPM6 +Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWol8hHD/BeEIvnHRz+sTug +BTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9FIS3R/qy +8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73J +co4vzLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg +8qKrBC7m8kwOFjQgrIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8 +rFEz0ciD0cmfHdRHNCk+y7AO+oMLKFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12 +mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7SWWO/gLCMk3PLNaaZlSJhZQNg ++y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtqeX +gj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2 +p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQ +pGv7qHBFfLp+sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm +9S3ul0A8Yute1hTWjOKWi0FpkzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErw +M807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy/SKE8YXJN3nptT+/XOR0so8RYgDd +GGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4mZqTuXNnQkYRIer+ +CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtzaL1t +xKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+ +w6jv/naaoqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aK +L4x35bcF7DvB7L6Gs4a8wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+lj +X273CXE2whJdV/LItM3z7gLfEdxquVeEHVlNjM7IDiPCtyaaEBRx/pOyiriA8A4Q +ntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0o82bNSQ3+pCTE4FCxpgm +dTdmQRCsu/WU48IxK63nI1bMNSWSs1A= +-----END CERTIFICATE----- + ### Dhimyotis === /C=FR/O=Dhimyotis/CN=Certigna @@ -2461,222 +2816,6 @@ zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL -----END CERTIFICATE----- -### e-commerce monitoring GmbH - -=== /C=AT/O=e-commerce monitoring GmbH/CN=GLOBALTRUST 2020 -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 5a:4b:bd:5a:fb:4f:8a:5b:fa:65:e5 - Signature Algorithm: sha256WithRSAEncryption - Validity - Not Before: Feb 10 00:00:00 2020 GMT - Not After : Jun 10 00:00:00 2040 GMT - Subject: C=AT, O=e-commerce monitoring GmbH, CN=GLOBALTRUST 2020 - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Subject Key Identifier: - DC:2E:1F:D1:61:37:79:E4:AB:D5:D5:B3:12:71:68:3D:6A:68:9C:22 - X509v3 Authority Key Identifier: - keyid:DC:2E:1F:D1:61:37:79:E4:AB:D5:D5:B3:12:71:68:3D:6A:68:9C:22 - -SHA1 Fingerprint=D0:67:C1:13:51:01:0C:AA:D0:C7:6A:65:37:31:16:26:4F:53:71:A2 -SHA256 Fingerprint=9A:29:6A:51:82:D1:D4:51:A2:E3:7F:43:9B:74:DA:AF:A2:67:52:33:29:F9:0F:9A:0D:20:07:C3:34:E2:3C:9A ------BEGIN CERTIFICATE----- -MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG -A1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw -FwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx -MDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u -aXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq -hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b -RatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z -YybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3 -QWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw -yJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+ -BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ -SaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH -r96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0 -4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me -dKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw -q7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2 -nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu -H9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA -VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC -XtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd -6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf -+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi -kvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7 -wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB -TI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C -MUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn -4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I -aFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy -qfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== ------END CERTIFICATE----- - -### eMudhra Inc - -=== /C=US/OU=emSign PKI/O=eMudhra Inc/CN=emSign ECC Root CA - C3 -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 7b:71:b6:82:56:b8:12:7c:9c:a8 - Signature Algorithm: ecdsa-with-SHA384 - Validity - Not Before: Feb 18 18:30:00 2018 GMT - Not After : Feb 18 18:30:00 2043 GMT - Subject: C=US, OU=emSign PKI, O=eMudhra Inc, CN=emSign ECC Root CA - C3 - X509v3 extensions: - X509v3 Subject Key Identifier: - FB:5A:48:D0:80:20:40:F2:A8:E9:00:07:69:19:77:A7:E6:C3:F4:CF - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE -SHA1 Fingerprint=B6:AF:43:C2:9B:81:53:7D:F6:EF:6B:C3:1F:1F:60:15:0C:EE:48:66 -SHA256 Fingerprint=BC:4D:80:9B:15:18:9D:78:DB:3E:1D:8C:F4:F9:72:6A:79:5D:A1:64:3C:A5:F1:35:8E:1D:DB:0E:DC:0D:7E:B3 ------BEGIN CERTIFICATE----- -MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG -EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx -IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND -IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci -MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti -sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O -BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB -Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c -3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J -0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== ------END CERTIFICATE----- -=== /C=US/OU=emSign PKI/O=eMudhra Inc/CN=emSign Root CA - C1 -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - ae:cf:00:ba:c4:cf:32:f8:43:b2 - Signature Algorithm: sha256WithRSAEncryption - Validity - Not Before: Feb 18 18:30:00 2018 GMT - Not After : Feb 18 18:30:00 2043 GMT - Subject: C=US, OU=emSign PKI, O=eMudhra Inc, CN=emSign Root CA - C1 - X509v3 extensions: - X509v3 Subject Key Identifier: - FE:A1:E0:70:1E:2A:03:39:52:5A:42:BE:5C:91:85:7A:18:AA:4D:B5 - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE -SHA1 Fingerprint=E7:2E:F1:DF:FC:B2:09:28:CF:5D:D4:D5:67:37:B1:51:CB:86:4F:01 -SHA256 Fingerprint=12:56:09:AA:30:1D:A0:A2:49:B9:7A:82:39:CB:6A:34:21:6F:44:DC:AC:9F:39:54:B1:42:92:F2:E8:C8:60:8F ------BEGIN CERTIFICATE----- -MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG -A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg -SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v -dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ -BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ -HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH -3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH -GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c -xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 -aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq -TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 -/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 -kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG -YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT -+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo -WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= ------END CERTIFICATE----- - -### eMudhra Technologies Limited - -=== /C=IN/OU=emSign PKI/O=eMudhra Technologies Limited/CN=emSign ECC Root CA - G3 -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 3c:f6:07:a9:68:70:0e:da:8b:84 - Signature Algorithm: ecdsa-with-SHA384 - Validity - Not Before: Feb 18 18:30:00 2018 GMT - Not After : Feb 18 18:30:00 2043 GMT - Subject: C=IN, OU=emSign PKI, O=eMudhra Technologies Limited, CN=emSign ECC Root CA - G3 - X509v3 extensions: - X509v3 Subject Key Identifier: - 7C:5D:02:84:13:D4:CC:8A:9B:81:CE:17:1C:2E:29:1E:9C:48:63:42 - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE -SHA1 Fingerprint=30:43:FA:4F:F2:57:DC:A0:C3:80:EE:2E:58:EA:78:B2:3F:E6:BB:C1 -SHA256 Fingerprint=86:A1:EC:BA:08:9C:4A:8D:3B:BE:27:34:C6:12:BA:34:1D:81:3E:04:3C:F9:E8:A8:62:CD:5C:57:A3:6B:BE:6B ------BEGIN CERTIFICATE----- -MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG -EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo -bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g -RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ -TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s -b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw -djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 -WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS -fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB -zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq -hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB -CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD -+JbNR6iC8hZVdyR+EhCVBCyj ------END CERTIFICATE----- -=== /C=IN/OU=emSign PKI/O=eMudhra Technologies Limited/CN=emSign Root CA - G1 -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 31:f5:e4:62:0c:6c:58:ed:d6:d8 - Signature Algorithm: sha256WithRSAEncryption - Validity - Not Before: Feb 18 18:30:00 2018 GMT - Not After : Feb 18 18:30:00 2043 GMT - Subject: C=IN, OU=emSign PKI, O=eMudhra Technologies Limited, CN=emSign Root CA - G1 - X509v3 extensions: - X509v3 Subject Key Identifier: - FB:EF:0D:86:9E:B0:E3:DD:A9:B9:F1:21:17:7F:3E:FC:F0:77:2B:1A - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE -SHA1 Fingerprint=8A:C7:AD:8F:73:AC:4E:C1:B5:75:4D:A5:40:F4:FC:CF:7C:B5:8E:8C -SHA256 Fingerprint=40:F6:AF:03:46:A9:9A:A1:CD:1D:55:5A:4E:9C:CE:62:C7:F9:63:46:03:EE:40:66:15:83:3D:C8:C8:D0:03:67 ------BEGIN CERTIFICATE----- -MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD -VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU -ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH -MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO -MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv -Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz -f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO -8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq -d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM -tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt -Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB -o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x -PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM -wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d -GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH -6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby -RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx -iN66zB+Afko= ------END CERTIFICATE----- - ### Entrust, Inc. === /C=US/O=Entrust, Inc./OU=See www.entrust.net/legal-terms/OU=(c) 2009 Entrust, Inc. - for authorized use only/CN=Entrust Root Certification Authority - G2 @@ -3013,6 +3152,102 @@ MQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy v+c= -----END CERTIFICATE----- +### Firmaprofesional SA + +=== /C=ES/O=Firmaprofesional SA/2.5.4.97=VATES-A62634068/CN=FIRMAPROFESIONAL CA ROOT-A WEB +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 31:97:21:ed:af:89:42:7f:35:41:87:a1:67:56:4c:6d + Signature Algorithm: ecdsa-with-SHA384 + Validity + Not Before: Apr 6 09:01:36 2022 GMT + Not After : Mar 31 09:01:36 2047 GMT + Subject: C=ES, O=Firmaprofesional SA/2.5.4.97=VATES-A62634068, CN=FIRMAPROFESIONAL CA ROOT-A WEB + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Authority Key Identifier: + keyid:93:E1:43:63:5C:3C:9D:D6:27:F3:52:EC:17:B2:A9:AF:2C:F7:76:F8 + + X509v3 Subject Key Identifier: + 93:E1:43:63:5C:3C:9D:D6:27:F3:52:EC:17:B2:A9:AF:2C:F7:76:F8 + X509v3 Key Usage: critical + Certificate Sign, CRL Sign +SHA1 Fingerprint=A8:31:11:74:A6:14:15:0D:CA:77:DD:0E:E4:0C:5D:58:FC:A0:72:A5 +SHA256 Fingerprint=BE:F2:56:DA:F2:6E:9C:69:BD:EC:16:02:35:97:98:F3:CA:F7:18:21:A0:3E:01:82:57:C5:3C:65:61:7F:3D:4A +-----BEGIN CERTIFICATE----- +MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQsw +CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE +YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB +IFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2WhcNNDcwMzMxMDkwMTM2WjBuMQsw +CQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UE +YQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENB +IFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zf +e9MEkVz6iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6C +cyvHZpsKjECcfIr28jlgst7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FDY1w8ndYn81LsF7Kpryz3dvgwHQYDVR0O +BBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO +PQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgLcFBTApFw +hVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dG +XSaQpYXFuXqUPoeovQA= +-----END CERTIFICATE----- + +### GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. + +=== /C=CN/O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD./CN=GDCA TrustAUTH R5 ROOT +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 9009899650740120186 (0x7d0997fef047ea7a) + Signature Algorithm: sha256WithRSAEncryption + Validity + Not Before: Nov 26 05:13:15 2014 GMT + Not After : Dec 31 15:59:59 2040 GMT + Subject: C=CN, O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD., CN=GDCA TrustAUTH R5 ROOT + X509v3 extensions: + X509v3 Subject Key Identifier: + E2:C9:40:9F:4D:CE:E8:9A:A1:7C:CF:0E:3F:65:C5:29:88:6A:19:51 + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign +SHA1 Fingerprint=0F:36:38:5B:81:1A:25:C3:9B:31:4E:83:CA:E9:34:66:70:CC:74:B4 +SHA256 Fingerprint=BF:FF:8F:D0:44:33:48:7D:6A:8A:A6:0C:1A:29:76:7A:9F:C2:BB:B0:5E:42:0F:71:3A:13:B9:92:89:1D:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + ### GlobalSign === /OU=GlobalSign ECC Root CA - R4/O=GlobalSign/CN=GlobalSign @@ -3522,60 +3757,6 @@ BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD -----END CERTIFICATE----- -### GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. - -=== /C=CN/O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD./CN=GDCA TrustAUTH R5 ROOT -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 9009899650740120186 (0x7d0997fef047ea7a) - Signature Algorithm: sha256WithRSAEncryption - Validity - Not Before: Nov 26 05:13:15 2014 GMT - Not After : Dec 31 15:59:59 2040 GMT - Subject: C=CN, O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD., CN=GDCA TrustAUTH R5 ROOT - X509v3 extensions: - X509v3 Subject Key Identifier: - E2:C9:40:9F:4D:CE:E8:9A:A1:7C:CF:0E:3F:65:C5:29:88:6A:19:51 - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign -SHA1 Fingerprint=0F:36:38:5B:81:1A:25:C3:9B:31:4E:83:CA:E9:34:66:70:CC:74:B4 -SHA256 Fingerprint=BF:FF:8F:D0:44:33:48:7D:6A:8A:A6:0C:1A:29:76:7A:9F:C2:BB:B0:5E:42:0F:71:3A:13:B9:92:89:1D:38:93 ------BEGIN CERTIFICATE----- -MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE -BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ -IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 -MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV -BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w -HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj -Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj -TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u -KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj -qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm -MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 -ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP -zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk -L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC -jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA -HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC -AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg -p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm -DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 -COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry -L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf -JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg -IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io -2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV -09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ -XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq -T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe -MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== ------END CERTIFICATE----- - ### Hellenic Academic and Research Institutions CA === /C=GR/O=Hellenic Academic and Research Institutions CA/CN=HARICA TLS ECC Root CA 2021 @@ -3820,6 +4001,65 @@ LJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fqdBb9HxEG mpv0 -----END CERTIFICATE----- +### IZENPE S.A. + +=== /C=ES/O=IZENPE S.A./CN=Izenpe.com +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + b0:b7:5a:16:48:5f:bf:e1:cb:f5:8b:d7:19:e6:7d + Signature Algorithm: sha256WithRSAEncryption + Validity + Not Before: Dec 13 13:08:28 2007 GMT + Not After : Dec 13 08:27:25 2037 GMT + Subject: C=ES, O=IZENPE S.A., CN=Izenpe.com + X509v3 extensions: + X509v3 Subject Alternative Name: + email:info@izenpe.com, DirName:/O=IZENPE S.A. - CIF A01337260-RMerc.Vitoria-Gasteiz T1055 F62 S8/street=Avda del Mediterraneo Etorbidea 14 - 01010 Vitoria-Gasteiz + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + 1D:1C:65:0E:A8:F2:25:7B:B4:91:CF:E4:B1:B1:E6:BD:55:74:6C:05 +SHA1 Fingerprint=2F:78:3D:25:52:18:A7:4A:65:39:71:B5:2C:A2:9C:45:15:6F:E9:19 +SHA256 Fingerprint=25:30:CC:8E:98:32:15:02:BA:D9:6F:9B:1F:BA:1B:09:9E:2D:29:9E:0F:45:48:BB:91:4F:36:3B:C0:D4:53:1F +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 +MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 +ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD +VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j +b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq +scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO +xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H +LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX +uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD +yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ +JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q +rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN +BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L +hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB +QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ +HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu +Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg +QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB +BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA +A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb +laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 +awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo +JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw +LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT +VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk +LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb +UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ +QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ +naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls +QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + ### IdenTrust === /C=US/O=IdenTrust/CN=IdenTrust Commercial Root CA 1 @@ -4013,153 +4253,6 @@ tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1 /q4AaOeMSQ+2b1tbFfLn -----END CERTIFICATE----- -### iTrusChina Co.,Ltd. - -=== /C=CN/O=iTrusChina Co.,Ltd./CN=vTrus ECC Root CA -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 6e:6a:bc:59:aa:53:be:98:39:67:a2:d2:6b:a4:3b:e6:6d:1c:d6:da - Signature Algorithm: ecdsa-with-SHA384 - Validity - Not Before: Jul 31 07:26:44 2018 GMT - Not After : Jul 31 07:26:44 2043 GMT - Subject: C=CN, O=iTrusChina Co.,Ltd., CN=vTrus ECC Root CA - X509v3 extensions: - X509v3 Subject Key Identifier: - 98:39:CD:BE:D8:B2:8C:F7:B2:AB:E1:AD:24:AF:7B:7C:A1:DB:1F:CF - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Key Usage: critical - Certificate Sign, CRL Sign -SHA1 Fingerprint=F6:9C:DB:B0:FC:F6:02:13:B6:52:32:A6:A3:91:3F:16:70:DA:C3:E1 -SHA256 Fingerprint=30:FB:BA:2C:32:23:8E:2A:98:54:7A:F9:79:31:E5:50:42:8B:9B:3F:1C:8E:EB:66:33:DC:FA:86:C5:B2:7D:D3 ------BEGIN CERTIFICATE----- -MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMw -RzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAY -BgNVBAMTEXZUcnVzIEVDQyBSb290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDcz -MTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28u -LEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+cToL0 -v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUd -e4BdS49nTPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIw -V53dVvHH4+m4SVBrm2nDb+zDfSXkV5UTQJtS0zvzQBm8JsctBp61ezaf9SXUY2sA -AjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQLYgmRWAD5Tfs0aNoJrSEG -GJTO ------END CERTIFICATE----- -=== /C=CN/O=iTrusChina Co.,Ltd./CN=vTrus Root CA -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 43:e3:71:13:d8:b3:59:14:5d:b7:ce:8c:fd:35:fd:6f:bc:05:8d:45 - Signature Algorithm: sha256WithRSAEncryption - Validity - Not Before: Jul 31 07:24:05 2018 GMT - Not After : Jul 31 07:24:05 2043 GMT - Subject: C=CN, O=iTrusChina Co.,Ltd., CN=vTrus Root CA - X509v3 extensions: - X509v3 Subject Key Identifier: - 54:62:70:63:F1:75:84:43:58:8E:D1:16:20:B1:C6:AC:1A:BC:F6:89 - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Key Usage: critical - Certificate Sign, CRL Sign -SHA1 Fingerprint=84:1A:69:FB:F5:CD:1A:25:34:13:3D:E3:F8:FC:B8:99:D0:C9:14:B7 -SHA256 Fingerprint=8A:71:DE:65:59:33:6F:42:6C:26:E5:38:80:D0:0D:88:A1:8D:A4:C6:A9:1F:0D:CB:61:94:E2:06:C5:C9:63:87 ------BEGIN CERTIFICATE----- -MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQEL -BQAwQzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4x -FjAUBgNVBAMTDXZUcnVzIFJvb3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMx -MDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoGA1UEChMTaVRydXNDaGluYSBDby4s -THRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZotsSKYc -IrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykU -AyyNJJrIZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+ -GrPSbcKvdmaVayqwlHeFXgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z9 -8Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KAYPxMvDVTAWqXcoKv8R1w6Jz1717CbMdH -flqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70kLJrxLT5ZOrpGgrIDajt -J8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2AXPKBlim -0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZN -pGvu/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQ -UqqzApVg+QxMaPnu1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHW -OXSuTEGC2/KmSNGzm/MzqvOmwMVO9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMB -AAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYgscasGrz2iTAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAKbqSSaet -8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd -nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1j -bhd47F18iMjrjld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvM -Kar5CKXiNxTKsbhm7xqC5PD48acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIiv -TDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJnxDHO2zTlJQNgJXtxmOTAGytfdELS -S8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554WgicEFOwE30z9J4nfr -I8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4sEb9 -b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNB -UvupLnKWnyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1P -Ti07NEPhmg4NpGaXutIcSkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929ven -sBxXVsFy6K2ir40zSbofitzmdHxghm+Hl3s= ------END CERTIFICATE----- - -### IZENPE S.A. - -=== /C=ES/O=IZENPE S.A./CN=Izenpe.com -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - b0:b7:5a:16:48:5f:bf:e1:cb:f5:8b:d7:19:e6:7d - Signature Algorithm: sha256WithRSAEncryption - Validity - Not Before: Dec 13 13:08:28 2007 GMT - Not After : Dec 13 08:27:25 2037 GMT - Subject: C=ES, O=IZENPE S.A., CN=Izenpe.com - X509v3 extensions: - X509v3 Subject Alternative Name: - email:info@izenpe.com, DirName:/O=IZENPE S.A. - CIF A01337260-RMerc.Vitoria-Gasteiz T1055 F62 S8/street=Avda del Mediterraneo Etorbidea 14 - 01010 Vitoria-Gasteiz - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Subject Key Identifier: - 1D:1C:65:0E:A8:F2:25:7B:B4:91:CF:E4:B1:B1:E6:BD:55:74:6C:05 -SHA1 Fingerprint=2F:78:3D:25:52:18:A7:4A:65:39:71:B5:2C:A2:9C:45:15:6F:E9:19 -SHA256 Fingerprint=25:30:CC:8E:98:32:15:02:BA:D9:6F:9B:1F:BA:1B:09:9E:2D:29:9E:0F:45:48:BB:91:4F:36:3B:C0:D4:53:1F ------BEGIN CERTIFICATE----- -MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 -MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 -ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD -VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j -b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq -scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO -xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H -LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX -uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD -yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ -JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q -rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN -BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L -hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB -QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ -HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu -Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg -QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB -BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx -MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA -A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb -laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 -awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo -JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw -LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT -VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk -LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb -UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ -QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ -naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls -QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== ------END CERTIFICATE----- - ### Japan Certification Services, Inc. === /C=JP/O=Japan Certification Services, Inc./CN=SecureSign RootCA11 @@ -4944,200 +5037,6 @@ t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- -### Sectigo Limited - -=== /C=GB/O=Sectigo Limited/CN=Sectigo Public Server Authentication Root E46 -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 42:f2:cc:da:1b:69:37:44:5f:15:fe:75:28:10:b8:f4 - Signature Algorithm: ecdsa-with-SHA384 - Validity - Not Before: Mar 22 00:00:00 2021 GMT - Not After : Mar 21 23:59:59 2046 GMT - Subject: C=GB, O=Sectigo Limited, CN=Sectigo Public Server Authentication Root E46 - X509v3 extensions: - X509v3 Subject Key Identifier: - D1:22:DA:4C:59:F1:4B:5F:26:38:AA:9D:D6:EE:EB:0D:C3:FB:A9:61 - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE -SHA1 Fingerprint=EC:8A:39:6C:40:F0:2E:BC:42:75:D4:9F:AB:1C:1A:5B:67:BE:D2:9A -SHA256 Fingerprint=C9:0F:26:F0:FB:1B:40:18:B2:22:27:51:9B:5C:A2:B5:3E:2C:A5:B3:BE:5C:F1:8E:FE:1B:EF:47:38:0C:53:83 ------BEGIN CERTIFICATE----- -MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQsw -CQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T -ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcN -MjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYG -A1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT -ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccC -WvkEN/U0NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+ -6xnOQ6OjQjBAMB0GA1UdDgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8B -Af8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNnADBkAjAn7qRa -qCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RHlAFWovgzJQxC36oCMB3q -4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21USAGKcw== ------END CERTIFICATE----- -=== /C=GB/O=Sectigo Limited/CN=Sectigo Public Server Authentication Root R46 -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 75:8d:fd:8b:ae:7c:07:00:fa:a9:25:a7:e1:c7:ad:14 - Signature Algorithm: sha384WithRSAEncryption - Validity - Not Before: Mar 22 00:00:00 2021 GMT - Not After : Mar 21 23:59:59 2046 GMT - Subject: C=GB, O=Sectigo Limited, CN=Sectigo Public Server Authentication Root R46 - X509v3 extensions: - X509v3 Subject Key Identifier: - 56:73:58:64:95:F9:92:1A:B0:12:2A:04:62:79:A1:40:15:88:21:49 - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE -SHA1 Fingerprint=AD:98:F9:F3:E4:7D:75:3B:65:D4:82:B3:A4:52:17:BB:6E:F5:E4:38 -SHA256 Fingerprint=7B:B6:47:A6:2A:EE:AC:88:BF:25:7A:A5:22:D0:1F:FE:A3:95:E0:AB:45:C7:3F:93:F6:56:54:EC:38:F2:5A:06 ------BEGIN CERTIFICATE----- -MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBf -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQD -Ey1TZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYw -HhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEY -MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1Ymxp -YyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDa -ef0rty2k1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnz -SDBh+oF8HqcIStw+KxwfGExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xf -iOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMPFF1bFOdLvt30yNoDN9HWOaEhUTCDsG3X -ME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vuZDCQOc2TZYEhMbUjUDM3 -IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5QazYw6A3OAS -VYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgE -SJ/AwSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu -+Zd4KKTIRJLpfSYFplhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt -8uaZFURww3y8nDnAtOFr94MlI1fZEoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+L -HaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW6aWWrL3DkJiy4Pmi1KZHQ3xt -zwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWIIUkwDgYDVR0P -AQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c -mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQ -YKlJfp/imTYpE0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52 -gDY9hAaLMyZlbcp+nv4fjFg4exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZA -Fv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M0ejf5lG5Nkc/kLnHvALcWxxPDkjB -JYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI84HxZmduTILA7rpX -DhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9mpFui -TdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5 -dHn5HrwdVw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65 -LvKRRFHQV80MNNVIIb/bE/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp -0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmmJ1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAY -QqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL ------END CERTIFICATE----- - -### SecureTrust Corporation - -=== /C=US/O=SecureTrust Corporation/CN=Secure Global CA -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 07:56:22:a4:e8:d4:8a:89:4d:f4:13:c8:f0:f8:ea:a5 - Signature Algorithm: sha1WithRSAEncryption - Validity - Not Before: Nov 7 19:42:28 2006 GMT - Not After : Dec 31 19:52:06 2029 GMT - Subject: C=US, O=SecureTrust Corporation, CN=Secure Global CA - X509v3 extensions: - 1.3.6.1.4.1.311.20.2: - ...C.A - X509v3 Key Usage: - Digital Signature, Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Subject Key Identifier: - AF:44:04:C2:41:7E:48:83:DB:4E:39:02:EC:EC:84:7A:E6:CE:C9:A4 - X509v3 CRL Distribution Points: - - Full Name: - URI:http://crl.securetrust.com/SGCA.crl - - 1.3.6.1.4.1.311.21.1: - ... -SHA1 Fingerprint=3A:44:73:5A:E5:81:90:1F:24:86:61:46:1E:3B:9C:C4:5F:F5:3A:1B -SHA256 Fingerprint=42:00:F5:04:3A:C8:59:0E:BB:52:7D:20:9E:D1:50:30:29:FB:CB:D4:1C:A1:B5:06:EC:27:F1:5A:DE:7D:AC:69 ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- -=== /C=US/O=SecureTrust Corporation/CN=SecureTrust CA -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 0c:f0:8e:5c:08:16:a5:ad:42:7f:f0:eb:27:18:59:d0 - Signature Algorithm: sha1WithRSAEncryption - Validity - Not Before: Nov 7 19:31:18 2006 GMT - Not After : Dec 31 19:40:55 2029 GMT - Subject: C=US, O=SecureTrust Corporation, CN=SecureTrust CA - X509v3 extensions: - 1.3.6.1.4.1.311.20.2: - ...C.A - X509v3 Key Usage: - Digital Signature, Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Subject Key Identifier: - 42:32:B6:16:FA:04:FD:FE:5D:4B:7A:C3:FD:F7:4C:40:1D:5A:43:AF - X509v3 CRL Distribution Points: - - Full Name: - URI:http://crl.securetrust.com/STCA.crl - - 1.3.6.1.4.1.311.21.1: - ... -SHA1 Fingerprint=87:82:C6:C3:04:35:3B:CF:D2:96:92:D2:59:3E:7D:44:D9:34:FF:11 -SHA256 Fingerprint=F1:C1:B5:0A:E5:A2:0D:D8:03:0E:C9:F6:BC:24:82:3D:D3:67:B5:25:57:59:B4:E7:1B:61:FC:E9:F7:37:5D:73 ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - ### SSL Corporation === /C=US/O=SSL Corporation/CN=SSL.com TLS ECC Root CA 2022 @@ -5421,6 +5320,200 @@ oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY Ic2wBlX7Jz9TkHCpBB5XJ7k= -----END CERTIFICATE----- +### Sectigo Limited + +=== /C=GB/O=Sectigo Limited/CN=Sectigo Public Server Authentication Root E46 +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 42:f2:cc:da:1b:69:37:44:5f:15:fe:75:28:10:b8:f4 + Signature Algorithm: ecdsa-with-SHA384 + Validity + Not Before: Mar 22 00:00:00 2021 GMT + Not After : Mar 21 23:59:59 2046 GMT + Subject: C=GB, O=Sectigo Limited, CN=Sectigo Public Server Authentication Root E46 + X509v3 extensions: + X509v3 Subject Key Identifier: + D1:22:DA:4C:59:F1:4B:5F:26:38:AA:9D:D6:EE:EB:0D:C3:FB:A9:61 + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE +SHA1 Fingerprint=EC:8A:39:6C:40:F0:2E:BC:42:75:D4:9F:AB:1C:1A:5B:67:BE:D2:9A +SHA256 Fingerprint=C9:0F:26:F0:FB:1B:40:18:B2:22:27:51:9B:5C:A2:B5:3E:2C:A5:B3:BE:5C:F1:8E:FE:1B:EF:47:38:0C:53:83 +-----BEGIN CERTIFICATE----- +MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQsw +CQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T +ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcN +MjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYG +A1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT +ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccC +WvkEN/U0NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+ +6xnOQ6OjQjBAMB0GA1UdDgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8B +Af8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNnADBkAjAn7qRa +qCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RHlAFWovgzJQxC36oCMB3q +4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21USAGKcw== +-----END CERTIFICATE----- +=== /C=GB/O=Sectigo Limited/CN=Sectigo Public Server Authentication Root R46 +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 75:8d:fd:8b:ae:7c:07:00:fa:a9:25:a7:e1:c7:ad:14 + Signature Algorithm: sha384WithRSAEncryption + Validity + Not Before: Mar 22 00:00:00 2021 GMT + Not After : Mar 21 23:59:59 2046 GMT + Subject: C=GB, O=Sectigo Limited, CN=Sectigo Public Server Authentication Root R46 + X509v3 extensions: + X509v3 Subject Key Identifier: + 56:73:58:64:95:F9:92:1A:B0:12:2A:04:62:79:A1:40:15:88:21:49 + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE +SHA1 Fingerprint=AD:98:F9:F3:E4:7D:75:3B:65:D4:82:B3:A4:52:17:BB:6E:F5:E4:38 +SHA256 Fingerprint=7B:B6:47:A6:2A:EE:AC:88:BF:25:7A:A5:22:D0:1F:FE:A3:95:E0:AB:45:C7:3F:93:F6:56:54:EC:38:F2:5A:06 +-----BEGIN CERTIFICATE----- +MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBf +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQD +Ey1TZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYw +HhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEY +MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1Ymxp +YyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDa +ef0rty2k1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnz +SDBh+oF8HqcIStw+KxwfGExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xf +iOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMPFF1bFOdLvt30yNoDN9HWOaEhUTCDsG3X +ME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vuZDCQOc2TZYEhMbUjUDM3 +IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5QazYw6A3OAS +VYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgE +SJ/AwSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu ++Zd4KKTIRJLpfSYFplhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt +8uaZFURww3y8nDnAtOFr94MlI1fZEoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+L +HaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW6aWWrL3DkJiy4Pmi1KZHQ3xt +zwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWIIUkwDgYDVR0P +AQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c +mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQ +YKlJfp/imTYpE0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52 +gDY9hAaLMyZlbcp+nv4fjFg4exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZA +Fv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M0ejf5lG5Nkc/kLnHvALcWxxPDkjB +JYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI84HxZmduTILA7rpX +DhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9mpFui +TdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5 +dHn5HrwdVw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65 +LvKRRFHQV80MNNVIIb/bE/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp +0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmmJ1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAY +QqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL +-----END CERTIFICATE----- + +### SecureTrust Corporation + +=== /C=US/O=SecureTrust Corporation/CN=Secure Global CA +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 07:56:22:a4:e8:d4:8a:89:4d:f4:13:c8:f0:f8:ea:a5 + Signature Algorithm: sha1WithRSAEncryption + Validity + Not Before: Nov 7 19:42:28 2006 GMT + Not After : Dec 31 19:52:06 2029 GMT + Subject: C=US, O=SecureTrust Corporation, CN=Secure Global CA + X509v3 extensions: + 1.3.6.1.4.1.311.20.2: + ...C.A + X509v3 Key Usage: + Digital Signature, Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Subject Key Identifier: + AF:44:04:C2:41:7E:48:83:DB:4E:39:02:EC:EC:84:7A:E6:CE:C9:A4 + X509v3 CRL Distribution Points: + + Full Name: + URI:http://crl.securetrust.com/SGCA.crl + + 1.3.6.1.4.1.311.21.1: + ... +SHA1 Fingerprint=3A:44:73:5A:E5:81:90:1F:24:86:61:46:1E:3B:9C:C4:5F:F5:3A:1B +SHA256 Fingerprint=42:00:F5:04:3A:C8:59:0E:BB:52:7D:20:9E:D1:50:30:29:FB:CB:D4:1C:A1:B5:06:EC:27:F1:5A:DE:7D:AC:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- +=== /C=US/O=SecureTrust Corporation/CN=SecureTrust CA +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 0c:f0:8e:5c:08:16:a5:ad:42:7f:f0:eb:27:18:59:d0 + Signature Algorithm: sha1WithRSAEncryption + Validity + Not Before: Nov 7 19:31:18 2006 GMT + Not After : Dec 31 19:40:55 2029 GMT + Subject: C=US, O=SecureTrust Corporation, CN=SecureTrust CA + X509v3 extensions: + 1.3.6.1.4.1.311.20.2: + ...C.A + X509v3 Key Usage: + Digital Signature, Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Subject Key Identifier: + 42:32:B6:16:FA:04:FD:FE:5D:4B:7A:C3:FD:F7:4C:40:1D:5A:43:AF + X509v3 CRL Distribution Points: + + Full Name: + URI:http://crl.securetrust.com/STCA.crl + + 1.3.6.1.4.1.311.21.1: + ... +SHA1 Fingerprint=87:82:C6:C3:04:35:3B:CF:D2:96:92:D2:59:3E:7D:44:D9:34:FF:11 +SHA256 Fingerprint=F1:C1:B5:0A:E5:A2:0D:D8:03:0E:C9:F6:BC:24:82:3D:D3:67:B5:25:57:59:B4:E7:1B:61:FC:E9:F7:37:5D:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + ### Starfield Technologies, Inc. === /C=US/O=Starfield Technologies, Inc./OU=Starfield Class 2 Certification Authority @@ -5766,6 +5859,61 @@ TpPDpFQUWw== ### TAIWAN-CA +=== /C=TW/O=TAIWAN-CA/OU=Root CA/CN=TWCA CYBER Root CA +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 40:01:34:8c:c2:00:00:00:00:00:00:00:01:3c:f2:c6 + Signature Algorithm: sha384WithRSAEncryption + Validity + Not Before: Nov 22 06:54:29 2022 GMT + Not After : Nov 22 15:59:59 2047 GMT + Subject: C=TW, O=TAIWAN-CA, OU=Root CA, CN=TWCA CYBER Root CA + X509v3 extensions: + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Authority Key Identifier: + keyid:9D:85:61:14:7C:C1:62:6F:97:68:E4:4F:37:40:E1:AD:E0:0D:56:37 + + X509v3 Subject Key Identifier: + 9D:85:61:14:7C:C1:62:6F:97:68:E4:4F:37:40:E1:AD:E0:0D:56:37 +SHA1 Fingerprint=F6:B1:1C:1A:83:38:E9:7B:DB:B3:A8:C8:33:24:E0:2D:9C:7F:26:66 +SHA256 Fingerprint=3F:63:BB:28:14:BE:17:4E:C8:B6:43:9C:F0:8D:6D:56:F0:B7:C4:05:88:3A:56:48:A3:34:42:4D:6B:3E:C5:58 +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQ +MQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290 +IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5 +WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FO +LUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1sTs6P +40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxF +avcokPFhV8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/ +34bKS1PE2Y2yHer43CdTo0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684i +JkXXYJndzk834H/nY62wuFm40AZoNWDTNq5xQwTxaWV4fPMf88oon1oglWa0zbfu +j3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK/c/WMw+f+5eesRycnupf +Xtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkHIuNZW0CP +2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDA +S9TMfAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDA +oS/xUgXJP+92ZuJF2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzC +kHDXShi8fgGwsOsVHkQGzaRP6AzRwyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW +5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83QOGt4A1WNzAd +BgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB +AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0t +tGlTITVX1olNc79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn +68xDiBaiA9a5F/gZbG0jAn/xX9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNn +TKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDRIG4kqIQnoVesqlVYL9zZyvpoBJ7t +RCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq/p1hvIbZv97Tujqx +f36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0RFxbI +Qh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz +8ppy6rBePm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4 +NxKfKjLji7gh7MMrZQzvIt6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzX +xeSDwWrruoBa3lwtcHb4yOWHh8qgnaHlIhInD0Q9HWzq1MKLL295q39QpsQZp6F6 +t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X +-----END CERTIFICATE----- === /C=TW/O=TAIWAN-CA/OU=Root CA/CN=TWCA Global Root CA Certificate: Data: @@ -6108,6 +6256,103 @@ L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG jjxDah2nGN59PRbxYvnKkKj9 -----END CERTIFICATE----- +### TrustAsia Technologies, Inc. + +=== /C=CN/O=TrustAsia Technologies, Inc./CN=TrustAsia Global Root CA G3 +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 64:f6:0e:65:77:61:6a:ab:3b:b4:ea:85:84:bb:b1:89:b8:71:93:0f + Signature Algorithm: sha384WithRSAEncryption + Validity + Not Before: May 20 02:10:19 2021 GMT + Not After : May 19 02:10:19 2046 GMT + Subject: C=CN, O=TrustAsia Technologies, Inc., CN=TrustAsia Global Root CA G3 + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Authority Key Identifier: + keyid:40:E4:E4:F2:23:EF:38:CA:B0:AE:57:7F:F2:21:30:16:34:DB:BC:92 + + X509v3 Subject Key Identifier: + 40:E4:E4:F2:23:EF:38:CA:B0:AE:57:7F:F2:21:30:16:34:DB:BC:92 + X509v3 Key Usage: critical + Certificate Sign, CRL Sign +SHA1 Fingerprint=63:CF:B6:C1:27:2B:56:E4:88:8E:1C:23:9A:B6:2E:81:47:24:C3:C7 +SHA256 Fingerprint=E0:D3:22:6A:EB:11:63:C2:E4:8F:F9:BE:3B:50:B4:C6:43:1B:E7:BB:1E:AC:C5:C3:6B:5D:5E:C5:09:03:9A:08 +-----BEGIN CERTIFICATE----- +MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEM +BQAwWjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dp +ZXMsIEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAe +Fw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEwMTlaMFoxCzAJBgNVBAYTAkNOMSUw +IwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtU +cnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNS +T1QY4SxzlZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqK +AtCWHwDNBSHvBm3dIZwZQ0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1 +nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/VP68czH5GX6zfZBCK70bwkPAPLfSIC7Ep +qq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1AgdB4SQXMeJNnKziyhWTXA +yB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm9WAPzJMs +hH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gX +zhqcD0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAv +kV34PmVACxmZySYgWmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msT +f9FkPz2ccEblooV7WIQn3MSAPmeamseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jA +uPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCFTIcQcf+eQxuulXUtgQIDAQAB +o2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj7zjKsK5Xf/Ih +MBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E +BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4 +wM8zAQLpw6o1D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2 +XFNFV1pF1AWZLy4jVe5jaN/TG3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1 +JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNjduMNhXJEIlU/HHzp/LgV6FL6qj6j +ITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstlcHboCoWASzY9M/eV +VHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys+TIx +xHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1on +AX1daBli2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d +7XB4tmBZrOFdRWOPyN9yaFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2Ntjj +gKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsASZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV ++Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFRJQJ6+N1rZdVtTTDIZbpo +FGWsJwt0ivKH +-----END CERTIFICATE----- +=== /C=CN/O=TrustAsia Technologies, Inc./CN=TrustAsia Global Root CA G4 +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 4f:23:64:b8:8e:97:63:9e:c6:53:81:c1:76:4e:cb:2a:74:15:d6:d7 + Signature Algorithm: ecdsa-with-SHA384 + Validity + Not Before: May 20 02:10:22 2021 GMT + Not After : May 19 02:10:22 2046 GMT + Subject: C=CN, O=TrustAsia Technologies, Inc., CN=TrustAsia Global Root CA G4 + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Authority Key Identifier: + keyid:A5:BB:4A:97:CE:B3:2B:7F:A4:31:DE:97:83:59:83:A6:6F:71:CB:DE + + X509v3 Subject Key Identifier: + A5:BB:4A:97:CE:B3:2B:7F:A4:31:DE:97:83:59:83:A6:6F:71:CB:DE + X509v3 Key Usage: critical + Certificate Sign, CRL Sign +SHA1 Fingerprint=57:73:A5:61:5D:80:B2:E6:AC:38:82:FC:68:07:31:AC:9F:B5:92:5A +SHA256 Fingerprint=BE:4B:56:CB:50:56:C0:13:6A:52:6D:F4:44:50:8D:AA:36:A0:B5:4F:42:E4:AC:38:F7:2A:F4:70:E4:79:65:4C +-----BEGIN CERTIFICATE----- +MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMw +WjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs +IEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0y +MTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJaMFoxCzAJBgNVBAYTAkNOMSUwIwYD +VQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtUcnVz +dEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATx +s8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbw +LxYI+hW8m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJij +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mD +pm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/pDHel4NZg6ZvccveMA4GA1UdDwEB/wQE +AwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AAbbd+NvBNEU/zy4k6LHiR +UKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xkdUfFVZDj +/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA== +-----END CERTIFICATE----- + ### Trustwave Holdings, Inc. === /C=US/ST=Illinois/L=Chicago/O=Trustwave Holdings, Inc./CN=Trustwave Global Certification Authority @@ -6574,3 +6819,291 @@ IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ O+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- + +### certSIGN + +=== /C=RO/O=certSIGN/OU=certSIGN ROOT CA +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 35210227249154 (0x200605167002) + Signature Algorithm: sha1WithRSAEncryption + Validity + Not Before: Jul 4 17:20:04 2006 GMT + Not After : Jul 4 17:20:04 2031 GMT + Subject: C=RO, O=certSIGN, OU=certSIGN ROOT CA + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Key Usage: critical + Digital Signature, Non Repudiation, Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + E0:8C:9B:DB:25:49:B3:F1:7C:86:D6:B2:42:87:0B:D0:6B:A0:D9:E4 +SHA1 Fingerprint=FA:B7:EE:36:97:26:62:FB:2D:B0:2A:F6:BF:03:FD:E8:7C:4B:2F:9B +SHA256 Fingerprint=EA:A9:62:C4:FA:4A:6B:AF:EB:E4:15:19:6D:35:1C:CD:88:8D:4F:53:F3:FA:8A:E6:D7:C4:66:A9:4E:60:42:BB +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +### eMudhra Inc + +=== /C=US/OU=emSign PKI/O=eMudhra Inc/CN=emSign ECC Root CA - C3 +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 7b:71:b6:82:56:b8:12:7c:9c:a8 + Signature Algorithm: ecdsa-with-SHA384 + Validity + Not Before: Feb 18 18:30:00 2018 GMT + Not After : Feb 18 18:30:00 2043 GMT + Subject: C=US, OU=emSign PKI, O=eMudhra Inc, CN=emSign ECC Root CA - C3 + X509v3 extensions: + X509v3 Subject Key Identifier: + FB:5A:48:D0:80:20:40:F2:A8:E9:00:07:69:19:77:A7:E6:C3:F4:CF + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE +SHA1 Fingerprint=B6:AF:43:C2:9B:81:53:7D:F6:EF:6B:C3:1F:1F:60:15:0C:EE:48:66 +SHA256 Fingerprint=BC:4D:80:9B:15:18:9D:78:DB:3E:1D:8C:F4:F9:72:6A:79:5D:A1:64:3C:A5:F1:35:8E:1D:DB:0E:DC:0D:7E:B3 +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG +EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx +IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND +IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci +MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti +sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O +BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB +Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c +3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J +0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- +=== /C=US/OU=emSign PKI/O=eMudhra Inc/CN=emSign Root CA - C1 +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + ae:cf:00:ba:c4:cf:32:f8:43:b2 + Signature Algorithm: sha256WithRSAEncryption + Validity + Not Before: Feb 18 18:30:00 2018 GMT + Not After : Feb 18 18:30:00 2043 GMT + Subject: C=US, OU=emSign PKI, O=eMudhra Inc, CN=emSign Root CA - C1 + X509v3 extensions: + X509v3 Subject Key Identifier: + FE:A1:E0:70:1E:2A:03:39:52:5A:42:BE:5C:91:85:7A:18:AA:4D:B5 + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE +SHA1 Fingerprint=E7:2E:F1:DF:FC:B2:09:28:CF:5D:D4:D5:67:37:B1:51:CB:86:4F:01 +SHA256 Fingerprint=12:56:09:AA:30:1D:A0:A2:49:B9:7A:82:39:CB:6A:34:21:6F:44:DC:AC:9F:39:54:B1:42:92:F2:E8:C8:60:8F +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG +A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg +SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v +dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ +BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ +HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH +3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH +GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c +xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 +aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq +TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 +/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 +kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG +YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT ++xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo +WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +### eMudhra Technologies Limited + +=== /C=IN/OU=emSign PKI/O=eMudhra Technologies Limited/CN=emSign ECC Root CA - G3 +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 3c:f6:07:a9:68:70:0e:da:8b:84 + Signature Algorithm: ecdsa-with-SHA384 + Validity + Not Before: Feb 18 18:30:00 2018 GMT + Not After : Feb 18 18:30:00 2043 GMT + Subject: C=IN, OU=emSign PKI, O=eMudhra Technologies Limited, CN=emSign ECC Root CA - G3 + X509v3 extensions: + X509v3 Subject Key Identifier: + 7C:5D:02:84:13:D4:CC:8A:9B:81:CE:17:1C:2E:29:1E:9C:48:63:42 + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE +SHA1 Fingerprint=30:43:FA:4F:F2:57:DC:A0:C3:80:EE:2E:58:EA:78:B2:3F:E6:BB:C1 +SHA256 Fingerprint=86:A1:EC:BA:08:9C:4A:8D:3B:BE:27:34:C6:12:BA:34:1D:81:3E:04:3C:F9:E8:A8:62:CD:5C:57:A3:6B:BE:6B +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG +EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo +bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ +TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s +b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 +WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS +fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB +zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq +hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB +CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD ++JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- +=== /C=IN/OU=emSign PKI/O=eMudhra Technologies Limited/CN=emSign Root CA - G1 +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 31:f5:e4:62:0c:6c:58:ed:d6:d8 + Signature Algorithm: sha256WithRSAEncryption + Validity + Not Before: Feb 18 18:30:00 2018 GMT + Not After : Feb 18 18:30:00 2043 GMT + Subject: C=IN, OU=emSign PKI, O=eMudhra Technologies Limited, CN=emSign Root CA - G1 + X509v3 extensions: + X509v3 Subject Key Identifier: + FB:EF:0D:86:9E:B0:E3:DD:A9:B9:F1:21:17:7F:3E:FC:F0:77:2B:1A + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE +SHA1 Fingerprint=8A:C7:AD:8F:73:AC:4E:C1:B5:75:4D:A5:40:F4:FC:CF:7C:B5:8E:8C +SHA256 Fingerprint=40:F6:AF:03:46:A9:9A:A1:CD:1D:55:5A:4E:9C:CE:62:C7:F9:63:46:03:EE:40:66:15:83:3D:C8:C8:D0:03:67 +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD +VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU +ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH +MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO +MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv +Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz +f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO +8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq +d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM +tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt +Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB +o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x +PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM +wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d +GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH +6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby +RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +### iTrusChina Co.,Ltd. + +=== /C=CN/O=iTrusChina Co.,Ltd./CN=vTrus ECC Root CA +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 6e:6a:bc:59:aa:53:be:98:39:67:a2:d2:6b:a4:3b:e6:6d:1c:d6:da + Signature Algorithm: ecdsa-with-SHA384 + Validity + Not Before: Jul 31 07:26:44 2018 GMT + Not After : Jul 31 07:26:44 2043 GMT + Subject: C=CN, O=iTrusChina Co.,Ltd., CN=vTrus ECC Root CA + X509v3 extensions: + X509v3 Subject Key Identifier: + 98:39:CD:BE:D8:B2:8C:F7:B2:AB:E1:AD:24:AF:7B:7C:A1:DB:1F:CF + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Key Usage: critical + Certificate Sign, CRL Sign +SHA1 Fingerprint=F6:9C:DB:B0:FC:F6:02:13:B6:52:32:A6:A3:91:3F:16:70:DA:C3:E1 +SHA256 Fingerprint=30:FB:BA:2C:32:23:8E:2A:98:54:7A:F9:79:31:E5:50:42:8B:9B:3F:1C:8E:EB:66:33:DC:FA:86:C5:B2:7D:D3 +-----BEGIN CERTIFICATE----- +MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMw +RzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAY +BgNVBAMTEXZUcnVzIEVDQyBSb290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDcz +MTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28u +LEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+cToL0 +v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUd +e4BdS49nTPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIw +V53dVvHH4+m4SVBrm2nDb+zDfSXkV5UTQJtS0zvzQBm8JsctBp61ezaf9SXUY2sA +AjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQLYgmRWAD5Tfs0aNoJrSEG +GJTO +-----END CERTIFICATE----- +=== /C=CN/O=iTrusChina Co.,Ltd./CN=vTrus Root CA +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 43:e3:71:13:d8:b3:59:14:5d:b7:ce:8c:fd:35:fd:6f:bc:05:8d:45 + Signature Algorithm: sha256WithRSAEncryption + Validity + Not Before: Jul 31 07:24:05 2018 GMT + Not After : Jul 31 07:24:05 2043 GMT + Subject: C=CN, O=iTrusChina Co.,Ltd., CN=vTrus Root CA + X509v3 extensions: + X509v3 Subject Key Identifier: + 54:62:70:63:F1:75:84:43:58:8E:D1:16:20:B1:C6:AC:1A:BC:F6:89 + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Key Usage: critical + Certificate Sign, CRL Sign +SHA1 Fingerprint=84:1A:69:FB:F5:CD:1A:25:34:13:3D:E3:F8:FC:B8:99:D0:C9:14:B7 +SHA256 Fingerprint=8A:71:DE:65:59:33:6F:42:6C:26:E5:38:80:D0:0D:88:A1:8D:A4:C6:A9:1F:0D:CB:61:94:E2:06:C5:C9:63:87 +-----BEGIN CERTIFICATE----- +MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQEL +BQAwQzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4x +FjAUBgNVBAMTDXZUcnVzIFJvb3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMx +MDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoGA1UEChMTaVRydXNDaGluYSBDby4s +THRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZotsSKYc +IrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykU +AyyNJJrIZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+ +GrPSbcKvdmaVayqwlHeFXgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z9 +8Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KAYPxMvDVTAWqXcoKv8R1w6Jz1717CbMdH +flqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70kLJrxLT5ZOrpGgrIDajt +J8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2AXPKBlim +0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZN +pGvu/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQ +UqqzApVg+QxMaPnu1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHW +OXSuTEGC2/KmSNGzm/MzqvOmwMVO9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMB +AAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYgscasGrz2iTAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAKbqSSaet +8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd +nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1j +bhd47F18iMjrjld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvM +Kar5CKXiNxTKsbhm7xqC5PD48acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIiv +TDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJnxDHO2zTlJQNgJXtxmOTAGytfdELS +S8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554WgicEFOwE30z9J4nfr +I8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4sEb9 +b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNB +UvupLnKWnyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1P +Ti07NEPhmg4NpGaXutIcSkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929ven +sBxXVsFy6K2ir40zSbofitzmdHxghm+Hl3s= +-----END CERTIFICATE----- diff --git a/lib/libcrypto/cms/cms_asn1.c b/lib/libcrypto/cms/cms_asn1.c index 8f2e12236..2c95eddf0 100644 --- a/lib/libcrypto/cms/cms_asn1.c +++ b/lib/libcrypto/cms/cms_asn1.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cms_asn1.c,v 1.24 2024/07/09 06:12:45 beck Exp $ */ +/* $OpenBSD: cms_asn1.c,v 1.25 2024/11/01 18:53:35 tb Exp $ */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project. @@ -52,12 +52,17 @@ * ==================================================================== */ -#include -#include -#include -#include -#include "cms_local.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cms_local.h" static const ASN1_TEMPLATE CMS_IssuerAndSerialNumber_seq_tt[] = { { diff --git a/lib/libcrypto/cms/cms_enc.c b/lib/libcrypto/cms/cms_enc.c index dee643fa1..ef6925dbd 100644 --- a/lib/libcrypto/cms/cms_enc.c +++ b/lib/libcrypto/cms/cms_enc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cms_enc.c,v 1.24 2024/01/14 18:40:24 tb Exp $ */ +/* $OpenBSD: cms_enc.c,v 1.25 2024/11/01 18:34:06 tb Exp $ */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project. @@ -52,19 +52,19 @@ * ==================================================================== */ +#include #include -#include "cryptlib.h" -#include -#include -#include -#include +#include +#include #include -#include +#include +#include +#include +#include #include "cms_local.h" #include "evp_local.h" -#include "x509_local.h" /* CMS EncryptedData Utilities */ diff --git a/lib/libcrypto/cms/cms_env.c b/lib/libcrypto/cms/cms_env.c index 98979cdae..629d23215 100644 --- a/lib/libcrypto/cms/cms_env.c +++ b/lib/libcrypto/cms/cms_env.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cms_env.c,v 1.27 2024/01/14 18:40:24 tb Exp $ */ +/* $OpenBSD: cms_env.c,v 1.28 2024/11/01 18:42:10 tb Exp $ */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project. @@ -52,19 +52,20 @@ * ==================================================================== */ +#include #include -#include -#include -#include -#include -#include #include +#include +#include +#include +#include +#include +#include +#include -#include "asn1/asn1_local.h" #include "cms_local.h" -#include "evp/evp_local.h" -#include "x509_local.h" +#include "evp_local.h" /* CMS EnvelopedData Utilities */ diff --git a/lib/libcrypto/cms/cms_ess.c b/lib/libcrypto/cms/cms_ess.c index cced99854..f01dcf73e 100644 --- a/lib/libcrypto/cms/cms_ess.c +++ b/lib/libcrypto/cms/cms_ess.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cms_ess.c,v 1.25 2024/03/30 01:53:05 joshua Exp $ */ +/* $OpenBSD: cms_ess.c,v 1.26 2024/11/01 18:53:35 tb Exp $ */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project. @@ -52,17 +52,18 @@ * ==================================================================== */ +#include #include -#include -#include -#include -#include -#include +#include #include +#include +#include +#include +#include +#include #include "cms_local.h" -#include "x509_local.h" CMS_ReceiptRequest * d2i_CMS_ReceiptRequest(CMS_ReceiptRequest **a, const unsigned char **in, long len) diff --git a/lib/libcrypto/cms/cms_kari.c b/lib/libcrypto/cms/cms_kari.c index 242a49693..86b1ad9e8 100644 --- a/lib/libcrypto/cms/cms_kari.c +++ b/lib/libcrypto/cms/cms_kari.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cms_kari.c,v 1.16 2024/02/02 14:11:45 tb Exp $ */ +/* $OpenBSD: cms_kari.c,v 1.17 2024/11/01 18:34:06 tb Exp $ */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project. @@ -52,17 +52,15 @@ * ==================================================================== */ +#include #include -#include "cryptlib.h" -#include -#include -#include -#include +#include #include -#include +#include +#include + #include "cms_local.h" -#include "asn1/asn1_local.h" /* Key Agreement Recipient Info (KARI) routines */ diff --git a/lib/libcrypto/cms/cms_lib.c b/lib/libcrypto/cms/cms_lib.c index 37eb3e294..2d7a8d9f2 100644 --- a/lib/libcrypto/cms/cms_lib.c +++ b/lib/libcrypto/cms/cms_lib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cms_lib.c,v 1.25 2024/03/30 01:53:05 joshua Exp $ */ +/* $OpenBSD: cms_lib.c,v 1.26 2024/11/01 18:53:35 tb Exp $ */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project. @@ -52,13 +52,16 @@ * ==================================================================== */ -#include -#include -#include -#include -#include +#include + #include +#include #include +#include +#include +#include +#include +#include #include "cms_local.h" #include "x509_local.h" diff --git a/lib/libcrypto/cryptlib.h b/lib/libcrypto/cryptlib.h deleted file mode 100644 index 6c3731d97..000000000 --- a/lib/libcrypto/cryptlib.h +++ /dev/null @@ -1,84 +0,0 @@ -/* $OpenBSD: cryptlib.h,v 1.26 2021/11/24 01:12:43 beck Exp $ */ -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */ - -#ifndef HEADER_CRYPTLIB_H -#define HEADER_CRYPTLIB_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define X509_CERT_AREA OPENSSLDIR -#define X509_CERT_DIR OPENSSLDIR "/certs" -#define X509_CERT_FILE OPENSSLDIR "/cert.pem" -#define X509_PRIVATE_DIR OPENSSLDIR "/private" -#define X509_CERT_DIR_EVP "SSL_CERT_DIR" -#define X509_CERT_FILE_EVP "SSL_CERT_FILE" - -#define CTLOG_FILE OPENSSLDIR "/ct_log_list.cnf" -#define CTLOG_FILE_EVP "CTLOG_FILE" - -void OPENSSL_cpuid_setup(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib/libcrypto/cpt_err.c b/lib/libcrypto/crypto_err.c similarity index 98% rename from lib/libcrypto/cpt_err.c rename to lib/libcrypto/crypto_err.c index 459b99d43..08fb0ea16 100644 --- a/lib/libcrypto/cpt_err.c +++ b/lib/libcrypto/crypto_err.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cpt_err.c,v 1.16 2024/06/24 06:43:22 tb Exp $ */ +/* $OpenBSD: crypto_err.c,v 1.1 2024/11/05 11:21:15 tb Exp $ */ /* ==================================================================== * Copyright (c) 1999-2011 The OpenSSL Project. All rights reserved. * diff --git a/lib/libcrypto/crypto_internal.h b/lib/libcrypto/crypto_internal.h index 2c2e63cc0..c5de5b7b5 100644 --- a/lib/libcrypto/crypto_internal.h +++ b/lib/libcrypto/crypto_internal.h @@ -1,4 +1,4 @@ -/* $OpenBSD: crypto_internal.h,v 1.13 2024/10/17 14:27:57 jsing Exp $ */ +/* $OpenBSD: crypto_internal.h,v 1.14 2024/11/08 14:05:43 jsing Exp $ */ /* * Copyright (c) 2023 Joel Sing * @@ -28,6 +28,74 @@ #define CTASSERT(x) \ extern char _ctassert[(x) ? 1 : -1] __attribute__((__unused__)) +/* + * Constant time functions for size_t. + */ +#ifndef HAVE_CRYPTO_CT_NE_ZERO +static inline int +crypto_ct_ne_zero(size_t v) +{ + return (v | ~(v - 1)) >> ((sizeof(v) * 8) - 1); +} +#endif + +#ifndef HAVE_CRYPTO_CT_NE_ZERO_MASK +static inline size_t +crypto_ct_ne_zero_mask(size_t v) +{ + return 0 - crypto_ct_ne_zero(v); +} +#endif + +#ifndef HAVE_CRYPTO_CT_EQ_ZERO +static inline int +crypto_ct_eq_zero(size_t v) +{ + return 1 - crypto_ct_ne_zero(v); +} +#endif + +#ifndef HAVE_CRYPTO_CT_EQ_ZERO_MASK_U8 +static inline size_t +crypto_ct_eq_zero_mask(size_t v) +{ + return 0 - crypto_ct_eq_zero(v); +} +#endif + +#ifndef HAVE_CRYPTO_CT_LT +static inline int +crypto_ct_lt(size_t a, size_t b) +{ + return (((a - b) | (b & ~a)) & (b | ~a)) >> + (sizeof(size_t) * 8 - 1); +} +#endif + +#ifndef HAVE_CRYPTO_CT_LT_MASK +static inline size_t +crypto_ct_lt_mask(size_t a, size_t b) +{ + return 0 - crypto_ct_lt(a, b); +} +#endif + +#ifndef HAVE_CRYPTO_CT_GT +static inline int +crypto_ct_gt(size_t a, size_t b) +{ + return crypto_ct_lt(b, a); +} +#endif + +#ifndef HAVE_CRYPTO_CT_GT_MASK +static inline size_t +crypto_ct_gt_mask(size_t a, size_t b) +{ + return 0 - crypto_ct_gt(a, b); +} +#endif + /* * Constant time operations for uint8_t. */ diff --git a/lib/libcrypto/cryptlib.c b/lib/libcrypto/crypto_legacy.c similarity index 87% rename from lib/libcrypto/cryptlib.c rename to lib/libcrypto/crypto_legacy.c index 8cb05e8cb..d864fc4c3 100644 --- a/lib/libcrypto/cryptlib.c +++ b/lib/libcrypto/crypto_legacy.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cryptlib.c,v 1.57 2024/10/19 13:06:11 jsing Exp $ */ +/* $OpenBSD: crypto_legacy.c,v 1.6 2024/11/06 04:18:42 tb Exp $ */ /* ==================================================================== * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. * @@ -123,8 +123,8 @@ #include #include +#include -#include "cryptlib.h" #include "crypto_internal.h" #include "crypto_local.h" #include "x86_arch.h" @@ -211,7 +211,8 @@ CRYPTO_get_dynlock_value(int i) } LCRYPTO_ALIAS(CRYPTO_get_dynlock_value); -int CRYPTO_get_new_dynlockid(void) +int +CRYPTO_get_new_dynlockid(void) { return 0; } @@ -305,31 +306,6 @@ void } LCRYPTO_ALIAS(CRYPTO_get_dynlock_destroy_callback); -void -CRYPTO_THREADID_current(CRYPTO_THREADID *id) -{ - memset(id, 0, sizeof(*id)); - id->val = (unsigned long)pthread_self(); -} - -int -CRYPTO_THREADID_cmp(const CRYPTO_THREADID *a, const CRYPTO_THREADID *b) -{ - return memcmp(a, b, sizeof(*a)); -} - -void -CRYPTO_THREADID_cpy(CRYPTO_THREADID *dest, const CRYPTO_THREADID *src) -{ - memcpy(dest, src, sizeof(*src)); -} - -unsigned long -CRYPTO_THREADID_hash(const CRYPTO_THREADID *id) -{ - return id->val; -} - #if !defined(OPENSSL_CPUID_SETUP) && !defined(OPENSSL_CPUID_OBJ) void OPENSSL_cpuid_setup(void) @@ -381,6 +357,13 @@ OpenSSLDie(const char *file, int line, const char *assertion) } LCRYPTO_ALIAS(OpenSSLDie); +int +CRYPTO_mem_ctrl(int mode) +{ + return CRYPTO_MEM_CHECK_OFF; +} +LCRYPTO_ALIAS(CRYPTO_mem_ctrl); + int CRYPTO_memcmp(const void *in_a, const void *in_b, size_t len) { @@ -395,3 +378,74 @@ CRYPTO_memcmp(const void *in_a, const void *in_b, size_t len) return x; } LCRYPTO_ALIAS(CRYPTO_memcmp); + +int +FIPS_mode(void) +{ + return 0; +} +LCRYPTO_ALIAS(FIPS_mode); + +int +FIPS_mode_set(int r) +{ + if (r == 0) + return 1; + CRYPTOerror(CRYPTO_R_FIPS_MODE_NOT_SUPPORTED); + return 0; +} +LCRYPTO_ALIAS(FIPS_mode_set); + +const char * +SSLeay_version(int t) +{ + switch (t) { + case SSLEAY_VERSION: + return OPENSSL_VERSION_TEXT; + case SSLEAY_BUILT_ON: + return "built on: date not available"; + case SSLEAY_CFLAGS: + return "compiler: information not available"; + case SSLEAY_PLATFORM: + return "platform: information not available"; + case SSLEAY_DIR: + return "OPENSSLDIR: \"" OPENSSLDIR "\""; + } + return "not available"; +} +LCRYPTO_ALIAS(SSLeay_version); + +unsigned long +SSLeay(void) +{ + return SSLEAY_VERSION_NUMBER; +} +LCRYPTO_ALIAS(SSLeay); + +const char * +OpenSSL_version(int t) +{ + switch (t) { + case OPENSSL_VERSION: + return OPENSSL_VERSION_TEXT; + case OPENSSL_BUILT_ON: + return "built on: date not available"; + case OPENSSL_CFLAGS: + return "compiler: information not available"; + case OPENSSL_PLATFORM: + return "platform: information not available"; + case OPENSSL_DIR: + return "OPENSSLDIR: \"" OPENSSLDIR "\""; + case OPENSSL_ENGINES_DIR: + return "ENGINESDIR: N/A"; + } + return "not available"; +} +LCRYPTO_ALIAS(OpenSSL_version); + +unsigned long +OpenSSL_version_num(void) +{ + return SSLeay(); +} +LCRYPTO_ALIAS(OpenSSL_version_num); diff --git a/lib/libcrypto/crypto_local.h b/lib/libcrypto/crypto_local.h index 970a78466..2b4c74552 100644 --- a/lib/libcrypto/crypto_local.h +++ b/lib/libcrypto/crypto_local.h @@ -1,57 +1,4 @@ -/* $OpenBSD: crypto_local.h,v 1.1 2024/03/02 11:37:13 tb Exp $ */ -/* ==================================================================== - * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ +/* $OpenBSD: crypto_local.h,v 1.4 2024/11/05 10:11:58 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -108,31 +55,30 @@ * copied and put under another distribution licence * [including the GNU Public Licence.] */ -/* ==================================================================== - * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. - * ECDH support in OpenSSL originally developed by - * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. - */ - -#include -#include -#include #ifndef HEADER_CRYPTO_LOCAL_H #define HEADER_CRYPTO_LOCAL_H -__BEGIN_HIDDEN_DECLS - -struct crypto_threadid_st { - void *ptr; - unsigned long val; -} /* CRYPTO_THREADID */; - -void CRYPTO_THREADID_current(CRYPTO_THREADID *id); -int CRYPTO_THREADID_cmp(const CRYPTO_THREADID *a, const CRYPTO_THREADID *b); -void CRYPTO_THREADID_cpy(CRYPTO_THREADID *dest, const CRYPTO_THREADID *src); -unsigned long CRYPTO_THREADID_hash(const CRYPTO_THREADID *id); - -__END_HIDDEN_DECLS +#include +#ifdef __cplusplus +extern "C" { #endif + +#define X509_CERT_AREA OPENSSLDIR +#define X509_CERT_DIR OPENSSLDIR "/certs" +#define X509_CERT_FILE OPENSSLDIR "/cert.pem" +#define X509_PRIVATE_DIR OPENSSLDIR "/private" +#define X509_CERT_DIR_EVP "SSL_CERT_DIR" +#define X509_CERT_FILE_EVP "SSL_CERT_FILE" + +#define CTLOG_FILE OPENSSLDIR "/ct_log_list.cnf" +#define CTLOG_FILE_EVP "CTLOG_FILE" + +void OPENSSL_cpuid_setup(void); + +#ifdef __cplusplus +} +#endif + +#endif /* HEADER_CRYPTO_LOCAL_H */ diff --git a/lib/libcrypto/malloc-wrapper.c b/lib/libcrypto/crypto_memory.c similarity index 89% rename from lib/libcrypto/malloc-wrapper.c rename to lib/libcrypto/crypto_memory.c index 7330903c6..773927b83 100644 --- a/lib/libcrypto/malloc-wrapper.c +++ b/lib/libcrypto/crypto_memory.c @@ -1,4 +1,4 @@ -/* $OpenBSD: malloc-wrapper.c,v 1.11 2024/04/10 14:51:02 beck Exp $ */ +/* $OpenBSD: crypto_memory.c,v 1.3 2024/11/06 04:18:42 tb Exp $ */ /* * Copyright (c) 2014 Bob Beck * @@ -14,12 +14,20 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + #include #include #include #include +void +OPENSSL_cleanse(void *ptr, size_t len) +{ + explicit_bzero(ptr, len); +} +LCRYPTO_ALIAS(OPENSSL_cleanse); + int CRYPTO_set_mem_functions(void *(*m)(size_t), void *(*r)(void *, size_t), void (*f)(void *)) diff --git a/lib/libcrypto/ct/ct_log.c b/lib/libcrypto/ct/ct_log.c index 514246ff4..72045477a 100644 --- a/lib/libcrypto/ct/ct_log.c +++ b/lib/libcrypto/ct/ct_log.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ct_log.c,v 1.7 2024/08/31 09:26:18 tb Exp $ */ +/* $OpenBSD: ct_log.c,v 1.9 2024/11/05 09:35:40 tb Exp $ */ /* Author: Adam Eijdenberg . */ /* ==================================================================== * Copyright (c) 1998-2016 The OpenSSL Project. All rights reserved. @@ -58,18 +58,20 @@ * https://www.openssl.org/source/license.html */ +#include #include #include +#include #include #include #include #include -#include +#include +#include #include "conf_local.h" - -#include "cryptlib.h" +#include "crypto_local.h" /* diff --git a/lib/libcrypto/cversion.c b/lib/libcrypto/cversion.c deleted file mode 100644 index 95479d338..000000000 --- a/lib/libcrypto/cversion.c +++ /dev/null @@ -1,116 +0,0 @@ -/* $OpenBSD: cversion.c,v 1.19 2024/03/16 21:42:20 tb Exp $ */ -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */ - -#include -#include - -#include "cryptlib.h" - -const char * -SSLeay_version(int t) -{ - switch (t) { - case SSLEAY_VERSION: - return OPENSSL_VERSION_TEXT; - case SSLEAY_BUILT_ON: - return "built on: date not available"; - case SSLEAY_CFLAGS: - return "compiler: information not available"; - case SSLEAY_PLATFORM: - return "platform: information not available"; - case SSLEAY_DIR: - return "OPENSSLDIR: \"" OPENSSLDIR "\""; - } - return "not available"; -} -LCRYPTO_ALIAS(SSLeay_version); - -unsigned long -SSLeay(void) -{ - return (SSLEAY_VERSION_NUMBER); -} -LCRYPTO_ALIAS(SSLeay); - -const char * -OpenSSL_version(int t) -{ - switch (t) { - case OPENSSL_VERSION: - return OPENSSL_VERSION_TEXT; - case OPENSSL_BUILT_ON: - return "built on: date not available"; - case OPENSSL_CFLAGS: - return "compiler: information not available"; - case OPENSSL_PLATFORM: - return "platform: information not available"; - case OPENSSL_DIR: - return "OPENSSLDIR: \"" OPENSSLDIR "\""; - case OPENSSL_ENGINES_DIR: - return "ENGINESDIR: N/A"; - } - return "not available"; -} -LCRYPTO_ALIAS(OpenSSL_version); - -unsigned long -OpenSSL_version_num(void) -{ - return SSLeay(); -} -LCRYPTO_ALIAS(OpenSSL_version_num); diff --git a/lib/libcrypto/dh/dh_check.c b/lib/libcrypto/dh/dh_check.c index f6d1cdeda..1e37240cd 100644 --- a/lib/libcrypto/dh/dh_check.c +++ b/lib/libcrypto/dh/dh_check.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dh_check.c,v 1.29 2024/08/30 17:44:56 tb Exp $ */ +/* $OpenBSD: dh_check.c,v 1.30 2024/11/29 15:59:57 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -127,10 +127,8 @@ DH_check(const DH *dh, int *flags) BN_CTX_start(ctx); if (dh->q != NULL) { - BIGNUM *quotient, *residue; + BIGNUM *residue; - if ((quotient = BN_CTX_get(ctx)) == NULL) - goto err; if ((residue = BN_CTX_get(ctx)) == NULL) goto err; if ((*flags & DH_NOT_SUITABLE_GENERATOR) == 0) { @@ -147,12 +145,10 @@ DH_check(const DH *dh, int *flags) if (is_prime == 0) *flags |= DH_CHECK_Q_NOT_PRIME; /* Check p == 1 mod q, i.e., q divides p - 1 */ - if (!BN_div_ct(quotient, residue, dh->p, dh->q, ctx)) + if (!BN_div_ct(NULL, residue, dh->p, dh->q, ctx)) goto err; if (!BN_is_one(residue)) *flags |= DH_CHECK_INVALID_Q_VALUE; - if (dh->j != NULL && BN_cmp(dh->j, quotient) != 0) - *flags |= DH_CHECK_INVALID_J_VALUE; } is_prime = BN_is_prime_ex(dh->p, DH_NUMBER_ITERATIONS_FOR_PRIME, diff --git a/lib/libcrypto/dh/dh_lib.c b/lib/libcrypto/dh/dh_lib.c index 86503bc4e..803aca642 100644 --- a/lib/libcrypto/dh/dh_lib.c +++ b/lib/libcrypto/dh/dh_lib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dh_lib.c,v 1.45 2024/03/27 01:26:30 tb Exp $ */ +/* $OpenBSD: dh_lib.c,v 1.46 2024/11/29 15:59:57 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -154,11 +154,8 @@ DH_free(DH *dh) CRYPTO_free_ex_data(CRYPTO_EX_INDEX_DH, dh, &dh->ex_data); BN_free(dh->p); - BN_free(dh->g); BN_free(dh->q); - BN_free(dh->j); - free(dh->seed); - BN_free(dh->counter); + BN_free(dh->g); BN_free(dh->pub_key); BN_free(dh->priv_key); free(dh); diff --git a/lib/libcrypto/dh/dh_local.h b/lib/libcrypto/dh/dh_local.h index fe7c12bb0..2c89f1012 100644 --- a/lib/libcrypto/dh/dh_local.h +++ b/lib/libcrypto/dh/dh_local.h @@ -1,4 +1,4 @@ -/* $OpenBSD: dh_local.h,v 1.5 2024/08/30 17:44:56 tb Exp $ */ +/* $OpenBSD: dh_local.h,v 1.7 2024/11/29 15:59:57 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -78,11 +78,9 @@ struct dh_method { }; struct dh_st { - /* This first argument is used to pick up errors when - * a DH is passed instead of a EVP_PKEY */ - int pad; int version; BIGNUM *p; + BIGNUM *q; BIGNUM *g; long length; /* optional */ BIGNUM *pub_key; /* g^x */ @@ -90,12 +88,6 @@ struct dh_st { int flags; BN_MONT_CTX *method_mont_p; - /* Place holders if we want to do X9.42 DH */ - BIGNUM *q; - BIGNUM *j; - unsigned char *seed; - int seedlen; - BIGNUM *counter; int references; CRYPTO_EX_DATA ex_data; diff --git a/lib/libcrypto/dsa/dsa.h b/lib/libcrypto/dsa/dsa.h index 67df08f9d..f9cd81bae 100644 --- a/lib/libcrypto/dsa/dsa.h +++ b/lib/libcrypto/dsa/dsa.h @@ -1,4 +1,4 @@ -/* $OpenBSD: dsa.h,v 1.44 2024/03/02 09:33:14 tb Exp $ */ +/* $OpenBSD: dsa.h,v 1.46 2024/12/05 19:34:46 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -177,15 +177,6 @@ int DSA_print(BIO *bp, const DSA *x, int off); int DSAparams_print_fp(FILE *fp, const DSA *x); int DSA_print_fp(FILE *bp, const DSA *x, int off); -/* - * Primality test according to FIPS PUB 186-4, Appendix C.3. Set the number - * to 64 rounds of Miller-Rabin, which corresponds to 128 bits of security. - * This is necessary for keys of size >= 3072. - */ -#define DSS_prime_checks 64 -#define DSA_is_prime(n, callback, cb_arg) \ - BN_is_prime(n, DSS_prime_checks, callback, NULL, cb_arg) - #ifndef OPENSSL_NO_DH /* Convert DSA structure (key or just parameters) into DH structure * (be careful to avoid small subgroup attacks when using this!) */ diff --git a/lib/libcrypto/dsa/dsa_gen.c b/lib/libcrypto/dsa/dsa_gen.c index dc04eba03..a79d0f9e2 100644 --- a/lib/libcrypto/dsa/dsa_gen.c +++ b/lib/libcrypto/dsa/dsa_gen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dsa_gen.c,v 1.32 2024/05/11 06:43:50 tb Exp $ */ +/* $OpenBSD: dsa_gen.c,v 1.33 2024/12/05 19:34:46 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -71,6 +71,14 @@ #include "bn_local.h" #include "dsa_local.h" +/* + * Primality test according to FIPS PUB 186-4, Appendix C.3. Set the number + * to 64 rounds of Miller-Rabin, which corresponds to 128 bits of security. + * This is necessary for keys of size >= 3072. + * XXX - now that we do BPSW the recommendation is to do 2 for p and 27 for q. + */ +#define DSA_prime_checks 64 + int DSA_generate_parameters_ex(DSA *ret, int bits, const unsigned char *seed_in, int seed_len, int *counter_ret, unsigned long *h_ret, BN_GENCB *cb) @@ -207,7 +215,7 @@ dsa_builtin_paramgen(DSA *ret, size_t bits, size_t qbits, const EVP_MD *evpmd, goto err; /* step 4 */ - r = BN_is_prime_fasttest_ex(q, DSS_prime_checks, ctx, + r = BN_is_prime_fasttest_ex(q, DSA_prime_checks, ctx, seed_is_random, cb); if (r > 0) break; @@ -278,7 +286,7 @@ dsa_builtin_paramgen(DSA *ret, size_t bits, size_t qbits, const EVP_MD *evpmd, /* step 10 */ if (BN_cmp(p, test) >= 0) { /* step 11 */ - r = BN_is_prime_fasttest_ex(p, DSS_prime_checks, + r = BN_is_prime_fasttest_ex(p, DSA_prime_checks, ctx, 1, cb); if (r > 0) goto end; /* found it */ diff --git a/lib/libcrypto/dsa/dsa_local.h b/lib/libcrypto/dsa/dsa_local.h index 8d6d2781b..82153c834 100644 --- a/lib/libcrypto/dsa/dsa_local.h +++ b/lib/libcrypto/dsa/dsa_local.h @@ -1,4 +1,4 @@ -/* $OpenBSD: dsa_local.h,v 1.4 2024/05/11 06:43:50 tb Exp $ */ +/* $OpenBSD: dsa_local.h,v 1.5 2024/11/29 07:42:35 tb Exp $ */ /* ==================================================================== * Copyright (c) 2007 The OpenSSL Project. All rights reserved. * @@ -75,9 +75,6 @@ struct dsa_method { } /* DSA_METHOD */; struct dsa_st { - /* This first variable is used to pick up errors where - * a DSA is passed instead of of a EVP_PKEY */ - int pad; long version; BIGNUM *p; BIGNUM *q; /* == 20 */ diff --git a/lib/libcrypto/ec/ec_ameth.c b/lib/libcrypto/ec/ec_ameth.c index f42093c3d..903b18a8d 100644 --- a/lib/libcrypto/ec/ec_ameth.c +++ b/lib/libcrypto/ec/ec_ameth.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ec_ameth.c,v 1.69 2024/08/29 16:58:19 tb Exp $ */ +/* $OpenBSD: ec_ameth.c,v 1.73 2024/11/25 06:51:39 tb Exp $ */ /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project 2006. */ @@ -56,18 +56,24 @@ * */ -#include +#include +#include #include +#include +#include #include #include #include #include +#include +#include +#include #include #include "asn1_local.h" -#include "ec_local.h" +#include "bn_local.h" #include "evp_local.h" #include "x509_local.h" @@ -98,7 +104,7 @@ eckey_get_curve_name(const EC_KEY *eckey, int *nid) ECerror(EC_R_MISSING_PARAMETERS); return 0; } - if (EC_GROUP_get_asn1_flag(group) != 0) + if ((EC_GROUP_get_asn1_flag(group) & OPENSSL_EC_NAMED_CURVE) != 0) *nid = EC_GROUP_get_curve_name(group); return 1; @@ -304,7 +310,7 @@ eckey_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) return -2; } -static int +int eckey_compute_pubkey(EC_KEY *eckey) { const BIGNUM *priv_key; @@ -322,7 +328,6 @@ eckey_compute_pubkey(EC_KEY *eckey) goto err; if (!EC_KEY_set_public_key(eckey, pub_key)) goto err; - pub_key = NULL; ret = 1; diff --git a/lib/libcrypto/ec/ec_asn1.c b/lib/libcrypto/ec/ec_asn1.c index 548afb2d1..98eec5134 100644 --- a/lib/libcrypto/ec/ec_asn1.c +++ b/lib/libcrypto/ec/ec_asn1.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ec_asn1.c,v 1.75 2024/10/18 17:27:07 tb Exp $ */ +/* $OpenBSD: ec_asn1.c,v 1.109 2024/12/06 05:13:35 tb Exp $ */ /* * Written by Nils Larsch for the OpenSSL project. */ @@ -56,10 +56,16 @@ * */ +#include +#include +#include #include #include +#include +#include +#include #include #include #include @@ -556,6 +562,92 @@ EC_PRIVATEKEY_free(EC_PRIVATEKEY *a) ASN1_item_free((ASN1_VALUE *)a, &EC_PRIVATEKEY_it); } +static int +ec_point_from_asn1_string(const EC_GROUP *group, const ASN1_STRING *astr, + EC_POINT **out_point, uint8_t *out_form) +{ + return ec_point_from_octets(group, astr->data, astr->length, + out_point, out_form, NULL); +} + +static int +ec_point_from_asn1_bit_string(const EC_GROUP *group, const ASN1_BIT_STRING *abs, + EC_POINT **out_point, uint8_t *out_form) +{ + /* + * Per SEC 1, C.3, the bit string representing the public key comes from + * an octet string, therefore the unused bits octet must be 0x00. + * XXX - move this check to a helper in a_bitstr.c? + */ + if ((abs->flags & ASN1_STRING_FLAG_BITS_LEFT) != 0 && + (abs->flags & 0x07) != 0) + return 0; + + return ec_point_from_asn1_string(group, abs, out_point, out_form); +} + +static int +ec_point_from_asn1_octet_string(const EC_GROUP *group, const ASN1_OCTET_STRING *aos, + EC_POINT **out_point, uint8_t *out_form) +{ + return ec_point_from_asn1_string(group, aos, out_point, out_form); +} + +static int +ec_point_to_asn1_string_type(const EC_GROUP *group, const EC_POINT *point, + int form, int type, ASN1_STRING **out_astr) +{ + ASN1_STRING *astr = NULL; + unsigned char *buf = NULL; + size_t len = 0; + int ret = 0; + + if (*out_astr != NULL && ASN1_STRING_type(*out_astr) != type) + goto err; + + if (!ec_point_to_octets(group, point, form, &buf, &len, NULL)) + goto err; + + if ((astr = *out_astr) == NULL) + astr = ASN1_STRING_type_new(type); + if (astr == NULL) + goto err; + + ASN1_STRING_set0(astr, buf, len); + buf = NULL; + len = 0; + + *out_astr = astr; + astr = NULL; + + ret = 1; + + err: + ASN1_STRING_free(astr); + freezero(buf, len); + + return ret; +} + +static int +ec_point_to_asn1_bit_string(const EC_GROUP *group, const EC_POINT *point, + int form, ASN1_BIT_STRING **out_abs) +{ + if (!ec_point_to_asn1_string_type(group, point, form, + V_ASN1_BIT_STRING, out_abs)) + return 0; + + return asn1_abs_set_unused_bits(*out_abs, 0); +} + +static int +ec_point_to_asn1_octet_string(const EC_GROUP *group, const EC_POINT *point, + int form, ASN1_OCTET_STRING **out_aos) +{ + return ec_point_to_asn1_string_type(group, point, form, + V_ASN1_OCTET_STRING, out_aos); +} + static int ec_asn1_group2fieldid(const EC_GROUP *group, X9_62_FIELDID *field) { @@ -566,7 +658,7 @@ ec_asn1_group2fieldid(const EC_GROUP *group, X9_62_FIELDID *field) if (group == NULL || field == NULL) goto err; - nid = EC_METHOD_get_field_type(EC_GROUP_method_of(group)); + nid = ec_group_get_field_type(group); if (nid == NID_X9_62_characteristic_two_field) { ECerror(EC_R_GF2M_NOT_SUPPORTED); goto err; @@ -602,16 +694,12 @@ ec_asn1_group2fieldid(const EC_GROUP *group, X9_62_FIELDID *field) } static int -ec_asn1_encode_field_element(const EC_GROUP *group, const BIGNUM *bn, +ec_asn1_encode_bn(const EC_GROUP *group, const BIGNUM *bn, int len, ASN1_OCTET_STRING *os) { unsigned char *buf; - int len; int ret = 0; - /* Zero-pad field element per SEC 1, section 2.3.5. */ - len = (EC_GROUP_get_degree(group) + 7) / 8; - /* One extra byte for historic NUL termination of ASN1_STRINGs. */ if ((buf = calloc(1, len + 1)) == NULL) goto err; @@ -631,6 +719,32 @@ ec_asn1_encode_field_element(const EC_GROUP *group, const BIGNUM *bn, return ret; } +static int +ec_asn1_encode_field_element(const EC_GROUP *group, const BIGNUM *bn, + ASN1_OCTET_STRING *os) +{ + int len; + + /* Zero-pad field element to byte length of p per SEC 1, 2.3.5. */ + len = (EC_GROUP_get_degree(group) + 7) / 8; + return ec_asn1_encode_bn(group, bn, len, os); +} + +static int +ec_asn1_encode_private_key(const EC_GROUP *group, const BIGNUM *bn, + ASN1_OCTET_STRING *os) +{ + const BIGNUM *order; + + if ((order = EC_GROUP_get0_order(group)) == NULL) { + ECerror(EC_R_INVALID_GROUP_ORDER); + return 0; + } + + /* Zero-pad private key to byte length of order per SEC 1, C.4. */ + return ec_asn1_encode_bn(group, bn, BN_num_bytes(order), os); +} + static int ec_asn1_group2curve(const EC_GROUP *group, X9_62_CURVE *curve) { @@ -692,60 +806,37 @@ ec_asn1_group2curve(const EC_GROUP *group, X9_62_CURVE *curve) static ECPARAMETERS * ec_asn1_group2parameters(const EC_GROUP *group) { - int ok = 0; - size_t len = 0; - ECPARAMETERS *ret = NULL; + ECPARAMETERS *parameters = NULL; + const EC_POINT *generator = NULL; const BIGNUM *order, *cofactor; - unsigned char *buffer = NULL; - const EC_POINT *point = NULL; - point_conversion_form_t form; + uint8_t form; - if ((ret = ECPARAMETERS_new()) == NULL) { + if ((parameters = ECPARAMETERS_new()) == NULL) { ECerror(ERR_R_MALLOC_FAILURE); goto err; } - /* set the version (always one) */ - ret->version = (long) 0x1; + parameters->version = 0x1; - /* set the fieldID */ - if (!ec_asn1_group2fieldid(group, ret->fieldID)) { + if (!ec_asn1_group2fieldid(group, parameters->fieldID)) { ECerror(ERR_R_EC_LIB); goto err; } - /* set the curve */ - if (!ec_asn1_group2curve(group, ret->curve)) { + + if (!ec_asn1_group2curve(group, parameters->curve)) { ECerror(ERR_R_EC_LIB); goto err; } - /* set the base point */ - if ((point = EC_GROUP_get0_generator(group)) == NULL) { + + if ((generator = EC_GROUP_get0_generator(group)) == NULL) { ECerror(EC_R_UNDEFINED_GENERATOR); goto err; } - form = EC_GROUP_get_point_conversion_form(group); - len = EC_POINT_point2oct(group, point, form, NULL, len, NULL); - if (len == 0) { - ECerror(ERR_R_EC_LIB); + form = EC_GROUP_get_point_conversion_form(group); + if (!ec_point_to_asn1_octet_string(group, generator, form, ¶meters->base)) goto err; - } - if ((buffer = malloc(len)) == NULL) { - ECerror(ERR_R_MALLOC_FAILURE); - goto err; - } - if (!EC_POINT_point2oct(group, point, form, buffer, len, NULL)) { - ECerror(ERR_R_EC_LIB); - goto err; - } - if (ret->base == NULL && (ret->base = ASN1_OCTET_STRING_new()) == NULL) { - ECerror(ERR_R_MALLOC_FAILURE); - goto err; - } - if (!ASN1_OCTET_STRING_set(ret->base, buffer, len)) { - ECerror(ERR_R_ASN1_LIB); - goto err; - } + if ((order = EC_GROUP_get0_order(group)) == NULL) { ECerror(ERR_R_EC_LIB); goto err; @@ -754,35 +845,35 @@ ec_asn1_group2parameters(const EC_GROUP *group) ECerror(ERR_R_EC_LIB); goto err; } - ASN1_INTEGER_free(ret->order); - if ((ret->order = BN_to_ASN1_INTEGER(order, NULL)) == NULL) { + ASN1_INTEGER_free(parameters->order); + if ((parameters->order = BN_to_ASN1_INTEGER(order, NULL)) == NULL) { ECerror(ERR_R_ASN1_LIB); goto err; } - ASN1_INTEGER_free(ret->cofactor); - ret->cofactor = NULL; + + ASN1_INTEGER_free(parameters->cofactor); + parameters->cofactor = NULL; if ((cofactor = EC_GROUP_get0_cofactor(group)) == NULL) { ECerror(ERR_R_EC_LIB); goto err; } if (!BN_is_zero(cofactor)) { - if ((ret->cofactor = BN_to_ASN1_INTEGER(cofactor, NULL)) == NULL) { + if ((parameters->cofactor = BN_to_ASN1_INTEGER(cofactor, + NULL)) == NULL) { ECerror(ERR_R_ASN1_LIB); goto err; } } - ok = 1; + + return parameters; err: - if (!ok) { - ECPARAMETERS_free(ret); - ret = NULL; - } - free(buffer); - return (ret); + ECPARAMETERS_free(parameters); + + return NULL; } -ECPKPARAMETERS * +static ECPKPARAMETERS * ec_asn1_group2pkparameters(const EC_GROUP *group) { ECPKPARAMETERS *pkparameters; @@ -900,19 +991,16 @@ ec_asn1_parameters_curve2group(const X9_62_CURVE *curve, static int ec_asn1_set_group_parameters(const ECPARAMETERS *params, EC_GROUP *group) { - EC_POINT *generator; + EC_POINT *generator = NULL; BIGNUM *order = NULL, *cofactor = NULL; const ASN1_BIT_STRING *seed; - point_conversion_form_t form; + uint8_t form; int ret = 0; - if ((generator = EC_POINT_new(group)) == NULL) + if (!ec_point_from_asn1_octet_string(group, params->base, &generator, &form)) goto err; - if (!EC_POINT_oct2point(group, generator, - params->base->data, params->base->length, NULL)) { - ECerror(ERR_R_EC_LIB); - goto err; - } + EC_GROUP_set_point_conversion_form(group, form); + if ((order = ASN1_INTEGER_to_BN(params->order, NULL)) == NULL) { ECerror(ERR_R_ASN1_LIB); goto err; @@ -938,10 +1026,6 @@ ec_asn1_set_group_parameters(const ECPARAMETERS *params, EC_GROUP *group) } } - /* oct2point has ensured that to be compressed, uncompressed, or hybrid. */ - form = params->base->data[0] & ~1U; - EC_GROUP_set_point_conversion_form(group, form); - ret = 1; err: @@ -985,6 +1069,7 @@ static EC_GROUP * ec_asn1_parameters2group(const ECPARAMETERS *params) { EC_GROUP *group = NULL; + int nid = NID_undef; if (params == NULL) { ECerror(EC_R_ASN1_ERROR); @@ -993,8 +1078,9 @@ ec_asn1_parameters2group(const ECPARAMETERS *params) if (!ec_asn1_parameters_extract_prime_group(params, &group)) goto err; - if (!ec_group_is_builtin_curve(group)) + if (!ec_group_is_builtin_curve(group, &nid)) goto err; + EC_GROUP_set_curve_name(group, nid); return group; @@ -1004,7 +1090,7 @@ ec_asn1_parameters2group(const ECPARAMETERS *params) return NULL; } -EC_GROUP * +static EC_GROUP * ec_asn1_pkparameters2group(const ECPKPARAMETERS *params) { EC_GROUP *group; @@ -1026,7 +1112,7 @@ ec_asn1_pkparameters2group(const ECPKPARAMETERS *params) ECerror(ERR_R_EC_LIB); return NULL; } - EC_GROUP_set_asn1_flag(group, 0); + EC_GROUP_set_asn1_flag(group, OPENSSL_EC_EXPLICIT_CURVE); } else if (params->type == ECPK_PARAM_IMPLICITLY_CA) { return NULL; } else { @@ -1059,7 +1145,8 @@ d2i_ECPKParameters(EC_GROUP **a, const unsigned char **in, long len) err: ECPKPARAMETERS_free(params); - return (group); + + return group; } LCRYPTO_ALIAS(d2i_ECPKParameters); @@ -1085,289 +1172,322 @@ i2d_ECPKParameters(const EC_GROUP *group, unsigned char **out_der) } LCRYPTO_ALIAS(i2d_ECPKParameters); -EC_KEY * -d2i_ECPrivateKey(EC_KEY **a, const unsigned char **in, long len) +static int +ec_key_set_group_from_parameters(EC_KEY *ec_key, const ECPKPARAMETERS *params) { - EC_KEY *ret = NULL; - EC_PRIVATEKEY *priv_key = NULL; + EC_GROUP *group = NULL; + int ret = 0; - if ((priv_key = d2i_EC_PRIVATEKEY(NULL, in, len)) == NULL) { - ECerror(ERR_R_EC_LIB); - return NULL; - } - if (a == NULL || *a == NULL) { - if ((ret = EC_KEY_new()) == NULL) { - ECerror(ERR_R_MALLOC_FAILURE); + /* Use group in parameters, if any. Fall back to existing group. */ + if (params != NULL) { + if ((group = ec_asn1_pkparameters2group(params)) == NULL) + goto err; + if (!EC_KEY_set_group(ec_key, group)) goto err; - } - } else - ret = *a; - - if (priv_key->parameters) { - EC_GROUP_free(ret->group); - ret->group = ec_asn1_pkparameters2group(priv_key->parameters); } - if (ret->group == NULL) { - ECerror(ERR_R_EC_LIB); + if (ec_key->group == NULL) goto err; - } - ret->version = priv_key->version; - if (priv_key->privateKey) { - ret->priv_key = BN_bin2bn( - ASN1_STRING_data(priv_key->privateKey), - ASN1_STRING_length(priv_key->privateKey), - ret->priv_key); - if (ret->priv_key == NULL) { - ECerror(ERR_R_BN_LIB); - goto err; - } - } else { + ret = 1; + + err: + EC_GROUP_free(group); + + return ret; +} + +static int +ec_key_set_private_key(EC_KEY *ec_key, const ASN1_OCTET_STRING *aos) +{ + BIGNUM *priv_key = NULL; + int ret = 0; + + if (aos == NULL) { ECerror(EC_R_MISSING_PRIVATE_KEY); goto err; } - if (ret->pub_key) - EC_POINT_free(ret->pub_key); - ret->pub_key = EC_POINT_new(ret->group); - if (ret->pub_key == NULL) { + /* + * XXX - Sec 1, C.4 requires that this octet string be padded to the + * byte length of the group's order. This can't be enforced because + * i2d_ECPrivateKey() used to produce a semi-compatible ad hoc format. + */ + if ((priv_key = BN_bin2bn(aos->data, aos->length, NULL)) == NULL) + goto err; + if (!EC_KEY_set_private_key(ec_key, priv_key)) + goto err; + + ret = 1; + + err: + BN_free(priv_key); + + return ret; +} + +static int +ec_key_set_public_key(EC_KEY *ec_key, const ASN1_BIT_STRING *abs) +{ + EC_POINT *pub_key = NULL; + uint8_t form; + int ret = 0; + + if (abs == NULL) { + ec_key->enc_flag |= EC_PKEY_NO_PUBKEY; + return eckey_compute_pubkey(ec_key); + } + + /* XXX - SEC 1, 2.3.4 does not allow hybrid encoding. */ + if (!ec_point_from_asn1_bit_string(ec_key->group, abs, &pub_key, &form)) + goto err; + if (!EC_KEY_set_public_key(ec_key, pub_key)) + goto err; + EC_KEY_set_conv_form(ec_key, form); + + ret = 1; + + err: + EC_POINT_free(pub_key); + + return ret; +} + +EC_KEY * +d2i_ECPrivateKey(EC_KEY **out_ec_key, const unsigned char **in, long len) +{ + EC_KEY *ec_key = NULL; + EC_PRIVATEKEY *ec_privatekey = NULL; + + if (out_ec_key == NULL || (ec_key = *out_ec_key) == NULL) + ec_key = EC_KEY_new(); + if (ec_key == NULL) + goto err; + + if ((ec_privatekey = d2i_EC_PRIVATEKEY(NULL, in, len)) == NULL) { ECerror(ERR_R_EC_LIB); goto err; } - if (priv_key->publicKey) { - const unsigned char *pub_oct; - size_t pub_oct_len; + ec_key->version = ec_privatekey->version; + if (!ec_key_set_group_from_parameters(ec_key, ec_privatekey->parameters)) + goto err; + if (!ec_key_set_private_key(ec_key, ec_privatekey->privateKey)) + goto err; + if (!ec_key_set_public_key(ec_key, ec_privatekey->publicKey)) + goto err; - pub_oct = ASN1_STRING_data(priv_key->publicKey); - pub_oct_len = ASN1_STRING_length(priv_key->publicKey); - if (pub_oct == NULL || pub_oct_len <= 0) { - ECerror(EC_R_BUFFER_TOO_SMALL); - goto err; - } + EC_PRIVATEKEY_free(ec_privatekey); + ec_privatekey = NULL; - /* save the point conversion form */ - ret->conv_form = (point_conversion_form_t) (pub_oct[0] & ~0x01); - if (!EC_POINT_oct2point(ret->group, ret->pub_key, - pub_oct, pub_oct_len, NULL)) { - ECerror(ERR_R_EC_LIB); - goto err; - } - } else { - if (!EC_POINT_mul(ret->group, ret->pub_key, ret->priv_key, - NULL, NULL, NULL)) { - ECerror(ERR_R_EC_LIB); - goto err; - } - /* Remember the original private-key-only encoding. */ - ret->enc_flag |= EC_PKEY_NO_PUBKEY; - } + if (out_ec_key != NULL) + *out_ec_key = ec_key; - EC_PRIVATEKEY_free(priv_key); - if (a != NULL) - *a = ret; - return (ret); + return ec_key; err: - if (a == NULL || *a != ret) - EC_KEY_free(ret); - if (priv_key) - EC_PRIVATEKEY_free(priv_key); + if (out_ec_key == NULL || *out_ec_key != ec_key) + EC_KEY_free(ec_key); + EC_PRIVATEKEY_free(ec_privatekey); - return (NULL); + return NULL; } LCRYPTO_ALIAS(d2i_ECPrivateKey); int -i2d_ECPrivateKey(EC_KEY *a, unsigned char **out) +i2d_ECPrivateKey(EC_KEY *ec_key, unsigned char **out) { - int ret = 0, ok = 0; - unsigned char *buffer = NULL; - size_t buf_len = 0, tmp_len; - EC_PRIVATEKEY *priv_key = NULL; + EC_PRIVATEKEY *ec_privatekey = NULL; + const EC_GROUP *group; + const BIGNUM *private_key; + const EC_POINT *public_key = NULL; + int ret = 0; - if (a == NULL || a->group == NULL || a->priv_key == NULL || - (!(a->enc_flag & EC_PKEY_NO_PUBKEY) && a->pub_key == NULL)) { + if (ec_key == NULL) { ECerror(ERR_R_PASSED_NULL_PARAMETER); goto err; } - if ((priv_key = EC_PRIVATEKEY_new()) == NULL) { - ECerror(ERR_R_MALLOC_FAILURE); + if ((group = EC_KEY_get0_group(ec_key)) == NULL) { + ECerror(EC_R_MISSING_PARAMETERS); goto err; } - priv_key->version = a->version; + if ((private_key = EC_KEY_get0_private_key(ec_key)) == NULL) { + ECerror(EC_R_KEYS_NOT_SET); + goto err; + } + if ((ec_key->enc_flag & EC_PKEY_NO_PUBKEY) == 0) { + if ((public_key = EC_KEY_get0_public_key(ec_key)) == NULL) { + ECerror(EC_R_KEYS_NOT_SET); + goto err; + } + } - buf_len = (size_t) BN_num_bytes(a->priv_key); - buffer = malloc(buf_len); - if (buffer == NULL) { + if ((ec_privatekey = EC_PRIVATEKEY_new()) == NULL) { ECerror(ERR_R_MALLOC_FAILURE); goto err; } - if (!BN_bn2bin(a->priv_key, buffer)) { - ECerror(ERR_R_BN_LIB); + ec_privatekey->version = ec_key->version; + + if (!ec_asn1_encode_private_key(group, private_key, ec_privatekey->privateKey)) goto err; - } - if (!ASN1_STRING_set(priv_key->privateKey, buffer, buf_len)) { - ECerror(ERR_R_ASN1_LIB); - goto err; - } - if (!(a->enc_flag & EC_PKEY_NO_PARAMETERS)) { + if ((ec_key->enc_flag & EC_PKEY_NO_PARAMETERS) == 0) { ECPKPARAMETERS *parameters; - if ((parameters = ec_asn1_group2pkparameters(a->group)) == NULL) { + if ((parameters = ec_asn1_group2pkparameters(group)) == NULL) { ECerror(ERR_R_EC_LIB); goto err; } - priv_key->parameters = parameters; + ec_privatekey->parameters = parameters; } - if (!(a->enc_flag & EC_PKEY_NO_PUBKEY) && a->pub_key != NULL) { - priv_key->publicKey = ASN1_BIT_STRING_new(); - if (priv_key->publicKey == NULL) { - ECerror(ERR_R_MALLOC_FAILURE); - goto err; - } - tmp_len = EC_POINT_point2oct(a->group, a->pub_key, - a->conv_form, NULL, 0, NULL); + if (public_key != NULL) { + uint8_t form; - if (tmp_len > buf_len) { - unsigned char *tmp_buffer = realloc(buffer, tmp_len); - if (!tmp_buffer) { - ECerror(ERR_R_MALLOC_FAILURE); - goto err; - } - buffer = tmp_buffer; - buf_len = tmp_len; - } - if (!EC_POINT_point2oct(a->group, a->pub_key, - a->conv_form, buffer, buf_len, NULL)) { - ECerror(ERR_R_EC_LIB); + form = EC_KEY_get_conv_form(ec_key); + if (!ec_point_to_asn1_bit_string(group, public_key, form, + &ec_privatekey->publicKey)) goto err; - } - if (!ASN1_STRING_set(priv_key->publicKey, buffer, buf_len)) { - ECerror(ERR_R_ASN1_LIB); - goto err; - } - if (!asn1_abs_set_unused_bits(priv_key->publicKey, 0)) { - ECerror(ERR_R_ASN1_LIB); - goto err; - } } - if ((ret = i2d_EC_PRIVATEKEY(priv_key, out)) == 0) { + + if ((ret = i2d_EC_PRIVATEKEY(ec_privatekey, out)) <= 0) { ECerror(ERR_R_EC_LIB); goto err; } - ok = 1; + err: - free(buffer); - if (priv_key) - EC_PRIVATEKEY_free(priv_key); - return (ok ? ret : 0); + EC_PRIVATEKEY_free(ec_privatekey); + + return ret; } LCRYPTO_ALIAS(i2d_ECPrivateKey); int -i2d_ECParameters(EC_KEY *a, unsigned char **out) +i2d_ECParameters(EC_KEY *ec_key, unsigned char **out) { - if (a == NULL) { + if (ec_key == NULL) { ECerror(ERR_R_PASSED_NULL_PARAMETER); return 0; } - return i2d_ECPKParameters(a->group, out); + return i2d_ECPKParameters(ec_key->group, out); } LCRYPTO_ALIAS(i2d_ECParameters); EC_KEY * -d2i_ECParameters(EC_KEY **a, const unsigned char **in, long len) +d2i_ECParameters(EC_KEY **out_ec_key, const unsigned char **in, long len) { - EC_KEY *ret; + EC_KEY *ec_key = NULL; if (in == NULL || *in == NULL) { ECerror(ERR_R_PASSED_NULL_PARAMETER); - return NULL; + goto err; + } + if (out_ec_key == NULL || (ec_key = *out_ec_key) == NULL) + ec_key = EC_KEY_new(); + if (ec_key == NULL) { + ECerror(ERR_R_MALLOC_FAILURE); + goto err; } - if (a == NULL || *a == NULL) { - if ((ret = EC_KEY_new()) == NULL) { - ECerror(ERR_R_MALLOC_FAILURE); - return NULL; - } - } else - ret = *a; - if (!d2i_ECPKParameters(&ret->group, in, len)) { + if (!d2i_ECPKParameters(&ec_key->group, in, len)) { ECerror(ERR_R_EC_LIB); - if (a == NULL || *a != ret) - EC_KEY_free(ret); - return NULL; + goto err; } - if (a != NULL) - *a = ret; - return ret; + if (out_ec_key != NULL) + *out_ec_key = ec_key; + + return ec_key; + + err: + if (out_ec_key == NULL || *out_ec_key != ec_key) + EC_KEY_free(ec_key); + + return NULL; } LCRYPTO_ALIAS(d2i_ECParameters); EC_KEY * -o2i_ECPublicKey(EC_KEY **a, const unsigned char **in, long len) +ECParameters_dup(EC_KEY *key) { - EC_KEY *ret = NULL; + const unsigned char *p; + unsigned char *der = NULL; + EC_KEY *dup = NULL; + int len; - if (a == NULL || (*a) == NULL || (*a)->group == NULL) { - /* An EC_GROUP structure is necessary to set the public key. */ + if (key == NULL) + return NULL; + + if ((len = i2d_ECParameters(key, &der)) <= 0) + return NULL; + + p = der; + dup = d2i_ECParameters(NULL, &p, len); + freezero(der, len); + + return dup; +} +LCRYPTO_ALIAS(ECParameters_dup); + +EC_KEY * +o2i_ECPublicKey(EC_KEY **in_ec_key, const unsigned char **in, long len) +{ + EC_KEY *ec_key = NULL; + const EC_GROUP *group; + uint8_t form; + + if (in_ec_key == NULL || (ec_key = *in_ec_key) == NULL) { ECerror(ERR_R_PASSED_NULL_PARAMETER); - return 0; + return NULL; } - ret = *a; - if (ret->pub_key == NULL && - (ret->pub_key = EC_POINT_new(ret->group)) == NULL) { - ECerror(ERR_R_MALLOC_FAILURE); - return 0; + if ((group = ec_key->group) == NULL) { + ECerror(ERR_R_PASSED_NULL_PARAMETER); + return NULL; } - if (!EC_POINT_oct2point(ret->group, ret->pub_key, *in, len, NULL)) { - ECerror(ERR_R_EC_LIB); - return 0; + if (len < 0) { + ECerror(EC_R_INVALID_ARGUMENT); + return NULL; } - /* save the point conversion form */ - ret->conv_form = (point_conversion_form_t) (*in[0] & ~0x01); + + if (!ec_point_from_octets(group, *in, len, &ec_key->pub_key, &form, NULL)) + return NULL; + EC_KEY_set_conv_form(ec_key, form); + *in += len; - return ret; + + return ec_key; } LCRYPTO_ALIAS(o2i_ECPublicKey); int -i2o_ECPublicKey(const EC_KEY *a, unsigned char **out) +i2o_ECPublicKey(const EC_KEY *ec_key, unsigned char **out) { + unsigned char *buf = NULL; size_t buf_len = 0; - int new_buffer = 0; + int ret = 0; - if (a == NULL) { + if (ec_key == NULL) { ECerror(ERR_R_PASSED_NULL_PARAMETER); - return 0; + goto err; } - buf_len = EC_POINT_point2oct(a->group, a->pub_key, - a->conv_form, NULL, 0, NULL); - if (out == NULL || buf_len == 0) - /* out == NULL => just return the length of the octet string */ - return buf_len; + if (!ec_point_to_octets(ec_key->group, ec_key->pub_key, + ec_key->conv_form, &buf, &buf_len, NULL)) + goto err; + if (buf_len > INT_MAX) + goto err; - if (*out == NULL) { - if ((*out = malloc(buf_len)) == NULL) { - ECerror(ERR_R_MALLOC_FAILURE); - return 0; - } - new_buffer = 1; - } - if (!EC_POINT_point2oct(a->group, a->pub_key, a->conv_form, - *out, buf_len, NULL)) { - ECerror(ERR_R_EC_LIB); - if (new_buffer) { - free(*out); - *out = NULL; - } - return 0; - } - if (!new_buffer) + if (out != NULL && *out != NULL) { + /* Muppet's answer to the Jackass show. */ + memcpy(*out, buf, buf_len); *out += buf_len; - return buf_len; + } else if (out != NULL) { + *out = buf; + buf = NULL; + } + + ret = buf_len; + + err: + freezero(buf, buf_len); + + return ret; } LCRYPTO_ALIAS(i2o_ECPublicKey); diff --git a/lib/libcrypto/ec/ec_convert.c b/lib/libcrypto/ec/ec_convert.c new file mode 100644 index 000000000..a18bc4913 --- /dev/null +++ b/lib/libcrypto/ec/ec_convert.c @@ -0,0 +1,575 @@ +/* $OpenBSD: ec_convert.c,v 1.14 2025/01/05 16:07:08 tb Exp $ */ +/* + * Originally written by Bodo Moeller for the OpenSSL project. + */ +/* ==================================================================== + * Copyright (c) 1998-2003 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ +/* ==================================================================== + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. + * Binary polynomial ECC support in OpenSSL originally developed by + * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. + */ + +#include + +#include +#include + +#include "asn1_local.h" +#include "ec_local.h" + +/* + * Internal handling of the point conversion octet + * (see X9.62, section 4.4.2, SEC 1 section 2.3.3) + * + * Only the last three bits of the leading octet of a point should be set. + * Bits 3 and 2 encode the conversion form for all points except the point + * at infinity. In compressed and hybrid form bit 1 indicates if the even + * or the odd solution of the quadratic equation for y should be used. + * + * The public point_conversion_t enum lacks the point at infinity, so we + * ignore it except at the API boundary. + */ + +#define EC_POINT_YBIT 0x01 + +#define EC_POINT_AT_INFINITY 0x00 +#define EC_POINT_COMPRESSED 0x02 +#define EC_POINT_UNCOMPRESSED 0x04 +#define EC_POINT_HYBRID 0x06 +#define EC_POINT_CONVERSION_MASK 0x06 + +static int +ec_conversion_form_is_valid(uint8_t form) +{ + return (form & EC_POINT_CONVERSION_MASK) == form; +} + +static int +ec_check_hybrid_ybit_is_consistent(uint8_t form, int ybit, const BIGNUM *y) +{ + if (form == EC_POINT_HYBRID && ybit != BN_is_odd(y)) { + ECerror(EC_R_INVALID_ENCODING); + return 0; + } + + return 1; +} + +/* Nonzero y-bit only makes sense with compressed or hybrid encoding. */ +static int +ec_nonzero_ybit_allowed(uint8_t form) +{ + return form == EC_POINT_COMPRESSED || form == EC_POINT_HYBRID; +} + +static int +ec_add_leading_octet_cbb(CBB *cbb, uint8_t form, int ybit) +{ + if (ec_nonzero_ybit_allowed(form) && ybit != 0) + form |= EC_POINT_YBIT; + + return CBB_add_u8(cbb, form); +} + +static int +ec_get_leading_octet_cbs(CBS *cbs, uint8_t *out_form, int *out_ybit) +{ + uint8_t octet; + + if (!CBS_get_u8(cbs, &octet)) { + ECerror(EC_R_BUFFER_TOO_SMALL); + return 0; + } + + *out_ybit = octet & EC_POINT_YBIT; + *out_form = octet & ~EC_POINT_YBIT; + + if (!ec_conversion_form_is_valid(*out_form)) { + ECerror(EC_R_INVALID_ENCODING); + return 0; + } + + if (*out_ybit != 0 && !ec_nonzero_ybit_allowed(*out_form)) { + ECerror(EC_R_INVALID_ENCODING); + return 0; + } + + return 1; +} + +static int +ec_encoded_length(const EC_GROUP *group, uint8_t form, size_t *out_len) +{ + switch (form) { + case EC_POINT_AT_INFINITY: + *out_len = 1; + return 1; + case EC_POINT_COMPRESSED: + *out_len = 1 + BN_num_bytes(group->p); + return 1; + case EC_POINT_UNCOMPRESSED: + case EC_POINT_HYBRID: + *out_len = 1 + 2 * BN_num_bytes(group->p); + return 1; + default: + return 0; + } +} + +static int +ec_field_element_is_valid(const EC_GROUP *group, const BIGNUM *bn) +{ + /* Ensure bn is in the range [0, p). */ + return !BN_is_negative(bn) && BN_cmp(group->p, bn) > 0; +} + +static int +ec_add_field_element_cbb(CBB *cbb, const EC_GROUP *group, const BIGNUM *bn) +{ + uint8_t *buf = NULL; + int buf_len = BN_num_bytes(group->p); + + if (!ec_field_element_is_valid(group, bn)) { + ECerror(EC_R_BIGNUM_OUT_OF_RANGE); + return 0; + } + if (!CBB_add_space(cbb, &buf, buf_len)) { + ECerror(ERR_R_MALLOC_FAILURE); + return 0; + } + if (BN_bn2binpad(bn, buf, buf_len) != buf_len) { + ECerror(ERR_R_MALLOC_FAILURE); + return 0; + } + + return 1; +} + +static int +ec_get_field_element_cbs(CBS *cbs, const EC_GROUP *group, BIGNUM *bn) +{ + CBS field_element; + + if (!CBS_get_bytes(cbs, &field_element, BN_num_bytes(group->p))) { + ECerror(EC_R_INVALID_ENCODING); + return 0; + } + if (!BN_bin2bn(CBS_data(&field_element), CBS_len(&field_element), bn)) { + ECerror(ERR_R_MALLOC_FAILURE); + return 0; + } + if (!ec_field_element_is_valid(group, bn)) { + ECerror(EC_R_BIGNUM_OUT_OF_RANGE); + return 0; + } + + return 1; +} + +static size_t +ec_point2oct(const EC_GROUP *group, const EC_POINT *point, uint8_t form, + unsigned char *buf, size_t len, BN_CTX *ctx) +{ + CBB cbb; + BIGNUM *x, *y; + size_t encoded_length; + size_t ret = 0; + + if (EC_POINT_is_at_infinity(group, point)) + form = EC_POINT_AT_INFINITY; + + if (!ec_encoded_length(group, form, &encoded_length)) { + ECerror(EC_R_INVALID_FORM); + return 0; + } + + if (buf == NULL) + return encoded_length; + + if (len < encoded_length) { + ECerror(EC_R_BUFFER_TOO_SMALL); + return 0; + } + + BN_CTX_start(ctx); + if (!CBB_init_fixed(&cbb, buf, len)) + goto err; + + if (form == EC_POINT_AT_INFINITY) { + if (!EC_POINT_is_at_infinity(group, point)) + goto err; + if (!ec_add_leading_octet_cbb(&cbb, form, 0)) + goto err; + + goto done; + } + + if ((x = BN_CTX_get(ctx)) == NULL) + goto err; + if ((y = BN_CTX_get(ctx)) == NULL) + goto err; + if (!EC_POINT_get_affine_coordinates(group, point, x, y, ctx)) + goto err; + + if (!ec_add_leading_octet_cbb(&cbb, form, BN_is_odd(y))) + goto err; + + if (form == EC_POINT_COMPRESSED) { + if (!ec_add_field_element_cbb(&cbb, group, x)) + goto err; + } else { + if (!ec_add_field_element_cbb(&cbb, group, x)) + goto err; + if (!ec_add_field_element_cbb(&cbb, group, y)) + goto err; + } + + done: + if (!CBB_finish(&cbb, NULL, &ret)) + goto err; + + if (ret != encoded_length) { + ret = 0; + goto err; + } + + err: + CBB_cleanup(&cbb); + BN_CTX_end(ctx); + + return ret; +} + +static int +ec_oct2point(const EC_GROUP *group, EC_POINT *point, + const unsigned char *buf, size_t len, BN_CTX *ctx) +{ + CBS cbs; + uint8_t form; + int ybit; + BIGNUM *x, *y; + int ret = 0; + + BN_CTX_start(ctx); + CBS_init(&cbs, buf, len); + + if (!ec_get_leading_octet_cbs(&cbs, &form, &ybit)) + goto err; + + if (form == EC_POINT_AT_INFINITY) { + if (!EC_POINT_set_to_infinity(group, point)) + goto err; + + goto done; + } + + if ((x = BN_CTX_get(ctx)) == NULL) + goto err; + if ((y = BN_CTX_get(ctx)) == NULL) + goto err; + + if (form == EC_POINT_COMPRESSED) { + if (!ec_get_field_element_cbs(&cbs, group, x)) + goto err; + if (!EC_POINT_set_compressed_coordinates(group, point, x, ybit, ctx)) + goto err; + } else { + if (!ec_get_field_element_cbs(&cbs, group, x)) + goto err; + if (!ec_get_field_element_cbs(&cbs, group, y)) + goto err; + if (!ec_check_hybrid_ybit_is_consistent(form, ybit, y)) + goto err; + if (!EC_POINT_set_affine_coordinates(group, point, x, y, ctx)) + goto err; + } + + done: + if (CBS_len(&cbs) > 0) { + ECerror(EC_R_INVALID_ENCODING); + goto err; + } + + ret = 1; + + err: + BN_CTX_end(ctx); + + return ret; +} + +int +ec_point_to_octets(const EC_GROUP *group, const EC_POINT *point, int form, + unsigned char **out_buf, size_t *out_len, BN_CTX *ctx) +{ + unsigned char *buf = NULL; + size_t len = 0; + int ret = 0; + + *out_len = 0; + + if (out_buf == NULL || *out_buf != NULL) + goto err; + + if ((len = EC_POINT_point2oct(group, point, form, NULL, 0, ctx)) == 0) + goto err; + if ((buf = calloc(1, len)) == NULL) + goto err; + if (EC_POINT_point2oct(group, point, form, buf, len, ctx) != len) + goto err; + + *out_buf = buf; + buf = NULL; + *out_len = len; + len = 0; + + ret = 1; + + err: + freezero(buf, len); + + return ret; +} + +int +ec_point_from_octets(const EC_GROUP *group, const unsigned char *buf, size_t buf_len, + EC_POINT **out_point, uint8_t *out_form, BN_CTX *ctx) +{ + EC_POINT *point; + int ret = 0; + + if ((point = *out_point) == NULL) + point = EC_POINT_new(group); + if (point == NULL) + goto err; + + if (!EC_POINT_oct2point(group, point, buf, buf_len, ctx)) + goto err; + + if (out_form != NULL) + *out_form = buf[0] & ~EC_POINT_YBIT; + + *out_point = point; + point = NULL; + + ret = 1; + + err: + if (*out_point != point) + EC_POINT_free(point); + + return ret; +} + +static int +ec_normalize_form(const EC_GROUP *group, const EC_POINT *point, int form, + uint8_t *out_form) +{ + /* + * Established behavior is to reject a request for the form 0 for the + * point at infinity even if it is valid. + */ + if (form <= 0 || form > UINT8_MAX) + return 0; + if (!ec_conversion_form_is_valid(form)) + return 0; + + *out_form = form; + if (EC_POINT_is_at_infinity(group, point)) + *out_form = EC_POINT_AT_INFINITY; + + return 1; +} + +size_t +EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point, + point_conversion_form_t conv_form, unsigned char *buf, size_t len, + BN_CTX *ctx_in) +{ + BN_CTX *ctx = NULL; + uint8_t form; + size_t ret = 0; + + if (!ec_normalize_form(group, point, conv_form, &form)) { + ECerror(EC_R_INVALID_FORM); + goto err; + } + + if ((ctx = ctx_in) == NULL) + ctx = BN_CTX_new(); + if (ctx == NULL) + goto err; + + if (group->meth != point->meth) { + ECerror(EC_R_INCOMPATIBLE_OBJECTS); + goto err; + } + ret = ec_point2oct(group, point, form, buf, len, ctx); + + err: + if (ctx != ctx_in) + BN_CTX_free(ctx); + + return ret; +} +LCRYPTO_ALIAS(EC_POINT_point2oct); + +int +EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *point, + const unsigned char *buf, size_t len, BN_CTX *ctx_in) +{ + BN_CTX *ctx; + int ret = 0; + + if ((ctx = ctx_in) == NULL) + ctx = BN_CTX_new(); + if (ctx == NULL) + goto err; + + if (group->meth != point->meth) { + ECerror(EC_R_INCOMPATIBLE_OBJECTS); + goto err; + } + ret = ec_oct2point(group, point, buf, len, ctx); + + err: + if (ctx != ctx_in) + BN_CTX_free(ctx); + + return ret; +} +LCRYPTO_ALIAS(EC_POINT_oct2point); + +BIGNUM * +EC_POINT_point2bn(const EC_GROUP *group, const EC_POINT *point, + point_conversion_form_t form, BIGNUM *in_bn, BN_CTX *ctx) +{ + BIGNUM *bn = NULL; + unsigned char *buf = NULL; + size_t buf_len = 0; + + if (!ec_point_to_octets(group, point, form, &buf, &buf_len, ctx)) + goto err; + if ((bn = BN_bin2bn(buf, buf_len, in_bn)) == NULL) + goto err; + + err: + freezero(buf, buf_len); + + return bn; +} +LCRYPTO_ALIAS(EC_POINT_point2bn); + +EC_POINT * +EC_POINT_bn2point(const EC_GROUP *group, + const BIGNUM *bn, EC_POINT *point, BN_CTX *ctx) +{ + unsigned char *buf = NULL; + size_t buf_len = 0; + + /* Of course BN_bn2bin() is in no way symmetric to BN_bin2bn()... */ + if ((buf_len = BN_num_bytes(bn)) == 0) + goto err; + if ((buf = calloc(1, buf_len)) == NULL) + goto err; + if (!BN_bn2bin(bn, buf)) + goto err; + if (!ec_point_from_octets(group, buf, buf_len, &point, NULL, ctx)) + goto err; + + err: + freezero(buf, buf_len); + + return point; +} +LCRYPTO_ALIAS(EC_POINT_bn2point); + +char * +EC_POINT_point2hex(const EC_GROUP *group, const EC_POINT *point, + point_conversion_form_t form, BN_CTX *ctx) +{ + BIGNUM *bn; + char *hex = NULL; + + if ((bn = EC_POINT_point2bn(group, point, form, NULL, ctx)) == NULL) + goto err; + if ((hex = BN_bn2hex(bn)) == NULL) + goto err; + + err: + BN_free(bn); + + return hex; +} +LCRYPTO_ALIAS(EC_POINT_point2hex); + +EC_POINT * +EC_POINT_hex2point(const EC_GROUP *group, const char *hex, + EC_POINT *in_point, BN_CTX *ctx) +{ + EC_POINT *point = NULL; + BIGNUM *bn = NULL; + + if (BN_hex2bn(&bn, hex) == 0) + goto err; + if ((point = EC_POINT_bn2point(group, bn, in_point, ctx)) == NULL) + goto err; + + err: + BN_free(bn); + + return point; +} +LCRYPTO_ALIAS(EC_POINT_hex2point); diff --git a/lib/libcrypto/ec/ec_curve.c b/lib/libcrypto/ec/ec_curve.c index 6d7eea81c..cbe113e36 100644 --- a/lib/libcrypto/ec/ec_curve.c +++ b/lib/libcrypto/ec/ec_curve.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ec_curve.c,v 1.46 2024/10/18 18:03:45 tb Exp $ */ +/* $OpenBSD: ec_curve.c,v 1.53 2024/12/24 18:33:24 tb Exp $ */ /* * Written by Nils Larsch for the OpenSSL project. */ @@ -70,61 +70,19 @@ */ #include +#include +#include #include #include +#include +#include #include #include #include "ec_local.h" -/* the nist prime curves */ -static const struct { - uint8_t seed[20]; - uint8_t p[24]; - uint8_t a[24]; - uint8_t b[24]; - uint8_t x[24]; - uint8_t y[24]; - uint8_t order[24]; -} _EC_NIST_PRIME_192 = { - .seed = { - 0x30, 0x45, 0xae, 0x6f, 0xc8, 0x42, 0x2f, 0x64, 0xed, 0x57, - 0x95, 0x28, 0xd3, 0x81, 0x20, 0xea, 0xe1, 0x21, 0x96, 0xd5, - }, - .p = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - }, - .a = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, - }, - .b = { - 0x64, 0x21, 0x05, 0x19, 0xe5, 0x9c, 0x80, 0xe7, 0x0f, 0xa7, - 0xe9, 0xab, 0x72, 0x24, 0x30, 0x49, 0xfe, 0xb8, 0xde, 0xec, - 0xc1, 0x46, 0xb9, 0xb1, - }, - .x = { - 0x18, 0x8d, 0xa8, 0x0e, 0xb0, 0x30, 0x90, 0xf6, 0x7c, 0xbf, - 0x20, 0xeb, 0x43, 0xa1, 0x88, 0x00, 0xf4, 0xff, 0x0a, 0xfd, - 0x82, 0xff, 0x10, 0x12, - }, - .y = { - 0x07, 0x19, 0x2b, 0x95, 0xff, 0xc8, 0xda, 0x78, 0x63, 0x10, - 0x11, 0xed, 0x6b, 0x24, 0xcd, 0xd5, 0x73, 0xf9, 0x77, 0xa1, - 0x1e, 0x79, 0x48, 0x11, - }, - .order = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x99, 0xde, 0xf8, 0x36, 0x14, 0x6b, 0xc9, 0xb1, - 0xb4, 0xd2, 0x28, 0x31, - }, -}; - static const struct { uint8_t seed[20]; uint8_t p[28]; @@ -296,97 +254,6 @@ static const struct { }, }; -/* the x9.62 prime curves (minus the nist prime curves) */ -static const struct { - uint8_t seed[20]; - uint8_t p[24]; - uint8_t a[24]; - uint8_t b[24]; - uint8_t x[24]; - uint8_t y[24]; - uint8_t order[24]; -} _EC_X9_62_PRIME_192V2 = { - .seed = { - 0x31, 0xa9, 0x2e, 0xe2, 0x02, 0x9f, 0xd1, 0x0d, 0x90, 0x1b, - 0x11, 0x3e, 0x99, 0x07, 0x10, 0xf0, 0xd2, 0x1a, 0xc6, 0xb6, - }, - .p = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - }, - .a = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, - }, - .b = { - 0xcc, 0x22, 0xd6, 0xdf, 0xb9, 0x5c, 0x6b, 0x25, 0xe4, 0x9c, - 0x0d, 0x63, 0x64, 0xa4, 0xe5, 0x98, 0x0c, 0x39, 0x3a, 0xa2, - 0x16, 0x68, 0xd9, 0x53, - }, - .x = { - 0xee, 0xa2, 0xba, 0xe7, 0xe1, 0x49, 0x78, 0x42, 0xf2, 0xde, - 0x77, 0x69, 0xcf, 0xe9, 0xc9, 0x89, 0xc0, 0x72, 0xad, 0x69, - 0x6f, 0x48, 0x03, 0x4a, - }, - .y = { - 0x65, 0x74, 0xd1, 0x1d, 0x69, 0xb6, 0xec, 0x7a, 0x67, 0x2b, - 0xb8, 0x2a, 0x08, 0x3d, 0xf2, 0xf2, 0xb0, 0x84, 0x7d, 0xe9, - 0x70, 0xb2, 0xde, 0x15, - }, - .order = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x5f, 0xb1, 0xa7, 0x24, 0xdc, 0x80, 0x41, 0x86, - 0x48, 0xd8, 0xdd, 0x31, - }, -}; - -static const struct { - uint8_t seed[20]; - uint8_t p[24]; - uint8_t a[24]; - uint8_t b[24]; - uint8_t x[24]; - uint8_t y[24]; - uint8_t order[24]; -} _EC_X9_62_PRIME_192V3 = { - .seed = { - 0xc4, 0x69, 0x68, 0x44, 0x35, 0xde, 0xb3, 0x78, 0xc4, 0xb6, - 0x5c, 0xa9, 0x59, 0x1e, 0x2a, 0x57, 0x63, 0x05, 0x9a, 0x2e, - }, - .p = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - }, - .a = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, - }, - .b = { - 0x22, 0x12, 0x3d, 0xc2, 0x39, 0x5a, 0x05, 0xca, 0xa7, 0x42, - 0x3d, 0xae, 0xcc, 0xc9, 0x47, 0x60, 0xa7, 0xd4, 0x62, 0x25, - 0x6b, 0xd5, 0x69, 0x16, - }, - .x = { - 0x7d, 0x29, 0x77, 0x81, 0x00, 0xc6, 0x5a, 0x1d, 0xa1, 0x78, - 0x37, 0x16, 0x58, 0x8d, 0xce, 0x2b, 0x8b, 0x4a, 0xee, 0x8e, - 0x22, 0x8f, 0x18, 0x96, - }, - .y = { - 0x38, 0xa9, 0x0f, 0x22, 0x63, 0x73, 0x37, 0x33, 0x4b, 0x49, - 0xdc, 0xb6, 0x6a, 0x6d, 0xc8, 0xf9, 0x97, 0x8a, 0xca, 0x76, - 0x48, 0xa9, 0x43, 0xb0, - }, - .order = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x7a, 0x62, 0xd0, 0x31, 0xc8, 0x3f, 0x42, 0x94, - 0xf6, 0x40, 0xec, 0x13, - }, -}; - static const struct { uint8_t seed[20]; uint8_t p[30]; @@ -573,333 +440,6 @@ static const struct { }, }; -/* the secg prime curves (minus the nist and x9.62 prime curves) */ -static const struct { - uint8_t seed[20]; - uint8_t p[14]; - uint8_t a[14]; - uint8_t b[14]; - uint8_t x[14]; - uint8_t y[14]; - uint8_t order[14]; -} _EC_SECG_PRIME_112R1 = { - .seed = { - 0x00, 0xf5, 0x0b, 0x02, 0x8e, 0x4d, 0x69, 0x6e, 0x67, 0x68, - 0x75, 0x61, 0x51, 0x75, 0x29, 0x04, 0x72, 0x78, 0x3f, 0xb1, - }, - .p = { - 0xdb, 0x7c, 0x2a, 0xbf, 0x62, 0xe3, 0x5e, 0x66, 0x80, 0x76, - 0xbe, 0xad, 0x20, 0x8b, - }, - .a = { - 0xdb, 0x7c, 0x2a, 0xbf, 0x62, 0xe3, 0x5e, 0x66, 0x80, 0x76, - 0xbe, 0xad, 0x20, 0x88, - }, - .b = { - 0x65, 0x9e, 0xf8, 0xba, 0x04, 0x39, 0x16, 0xee, 0xde, 0x89, - 0x11, 0x70, 0x2b, 0x22, - }, - .x = { - 0x09, 0x48, 0x72, 0x39, 0x99, 0x5a, 0x5e, 0xe7, 0x6b, 0x55, - 0xf9, 0xc2, 0xf0, 0x98, - }, - .y = { - 0xa8, 0x9c, 0xe5, 0xaf, 0x87, 0x24, 0xc0, 0xa2, 0x3e, 0x0e, - 0x0f, 0xf7, 0x75, 0x00, - }, - .order = { - 0xdb, 0x7c, 0x2a, 0xbf, 0x62, 0xe3, 0x5e, 0x76, 0x28, 0xdf, - 0xac, 0x65, 0x61, 0xc5, - }, -}; - -static const struct { - uint8_t seed[20]; - uint8_t p[14]; - uint8_t a[14]; - uint8_t b[14]; - uint8_t x[14]; - uint8_t y[14]; - uint8_t order[14]; -} _EC_SECG_PRIME_112R2 = { - .seed = { - 0x00, 0x27, 0x57, 0xa1, 0x11, 0x4d, 0x69, 0x6e, 0x67, 0x68, - 0x75, 0x61, 0x51, 0x75, 0x53, 0x16, 0xc0, 0x5e, 0x0b, 0xd4, - }, - .p = { - 0xdb, 0x7c, 0x2a, 0xbf, 0x62, 0xe3, 0x5e, 0x66, 0x80, 0x76, - 0xbe, 0xad, 0x20, 0x8b, - }, - .a = { - 0x61, 0x27, 0xc2, 0x4c, 0x05, 0xf3, 0x8a, 0x0a, 0xaa, 0xf6, - 0x5c, 0x0e, 0xf0, 0x2c, - }, - .b = { - 0x51, 0xde, 0xf1, 0x81, 0x5d, 0xb5, 0xed, 0x74, 0xfc, 0xc3, - 0x4c, 0x85, 0xd7, 0x09, - }, - .x = { - 0x4b, 0xa3, 0x0a, 0xb5, 0xe8, 0x92, 0xb4, 0xe1, 0x64, 0x9d, - 0xd0, 0x92, 0x86, 0x43, - }, - .y = { - 0xad, 0xcd, 0x46, 0xf5, 0x88, 0x2e, 0x37, 0x47, 0xde, 0xf3, - 0x6e, 0x95, 0x6e, 0x97, - }, - .order = { - 0x36, 0xdf, 0x0a, 0xaf, 0xd8, 0xb8, 0xd7, 0x59, 0x7c, 0xa1, - 0x05, 0x20, 0xd0, 0x4b, - }, -}; - -static const struct { - uint8_t seed[20]; - uint8_t p[16]; - uint8_t a[16]; - uint8_t b[16]; - uint8_t x[16]; - uint8_t y[16]; - uint8_t order[16]; -} _EC_SECG_PRIME_128R1 = { - .seed = { - 0x00, 0x0e, 0x0d, 0x4d, 0x69, 0x6e, 0x67, 0x68, 0x75, 0x61, - 0x51, 0x75, 0x0c, 0xc0, 0x3a, 0x44, 0x73, 0xd0, 0x36, 0x79, - }, - .p = { - 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - }, - .a = { - 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - }, - .b = { - 0xe8, 0x75, 0x79, 0xc1, 0x10, 0x79, 0xf4, 0x3d, 0xd8, 0x24, - 0x99, 0x3c, 0x2c, 0xee, 0x5e, 0xd3, - }, - .x = { - 0x16, 0x1f, 0xf7, 0x52, 0x8b, 0x89, 0x9b, 0x2d, 0x0c, 0x28, - 0x60, 0x7c, 0xa5, 0x2c, 0x5b, 0x86, - }, - .y = { - 0xcf, 0x5a, 0xc8, 0x39, 0x5b, 0xaf, 0xeb, 0x13, 0xc0, 0x2d, - 0xa2, 0x92, 0xdd, 0xed, 0x7a, 0x83, - }, - .order = { - 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x75, 0xa3, - 0x0d, 0x1b, 0x90, 0x38, 0xa1, 0x15, - }, -}; - -static const struct { - uint8_t seed[20]; - uint8_t p[16]; - uint8_t a[16]; - uint8_t b[16]; - uint8_t x[16]; - uint8_t y[16]; - uint8_t order[16]; -} _EC_SECG_PRIME_128R2 = { - .seed = { - 0x00, 0x4d, 0x69, 0x6e, 0x67, 0x68, 0x75, 0x61, 0x51, 0x75, - 0x12, 0xd8, 0xf0, 0x34, 0x31, 0xfc, 0xe6, 0x3b, 0x88, 0xf4, - }, - .p = { - 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - }, - .a = { - 0xd6, 0x03, 0x19, 0x98, 0xd1, 0xb3, 0xbb, 0xfe, 0xbf, 0x59, - 0xcc, 0x9b, 0xbf, 0xf9, 0xae, 0xe1, - }, - .b = { - 0x5e, 0xee, 0xfc, 0xa3, 0x80, 0xd0, 0x29, 0x19, 0xdc, 0x2c, - 0x65, 0x58, 0xbb, 0x6d, 0x8a, 0x5d, - }, - .x = { - 0x7b, 0x6a, 0xa5, 0xd8, 0x5e, 0x57, 0x29, 0x83, 0xe6, 0xfb, - 0x32, 0xa7, 0xcd, 0xeb, 0xc1, 0x40, - }, - .y = { - 0x27, 0xb6, 0x91, 0x6a, 0x89, 0x4d, 0x3a, 0xee, 0x71, 0x06, - 0xfe, 0x80, 0x5f, 0xc3, 0x4b, 0x44, - }, - .order = { - 0x3f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xbe, 0x00, - 0x24, 0x72, 0x06, 0x13, 0xb5, 0xa3, - }, -}; - -static const struct { - uint8_t p[21]; - uint8_t a[21]; - uint8_t b[21]; - uint8_t x[21]; - uint8_t y[21]; - uint8_t order[21]; -} _EC_SECG_PRIME_160K1 = { - .p = { - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xac, - 0x73, - }, - .a = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, - }, - .b = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x07, - }, - .x = { - 0x00, 0x3b, 0x4c, 0x38, 0x2c, 0xe3, 0x7a, 0xa1, 0x92, 0xa4, - 0x01, 0x9e, 0x76, 0x30, 0x36, 0xf4, 0xf5, 0xdd, 0x4d, 0x7e, - 0xbb, - }, - .y = { - 0x00, 0x93, 0x8c, 0xf9, 0x35, 0x31, 0x8f, 0xdc, 0xed, 0x6b, - 0xc2, 0x82, 0x86, 0x53, 0x17, 0x33, 0xc3, 0xf0, 0x3c, 0x4f, - 0xee, - }, - .order = { - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0xb8, 0xfa, 0x16, 0xdf, 0xab, 0x9a, 0xca, 0x16, 0xb6, - 0xb3, - }, -}; - -static const struct { - uint8_t seed[20]; - uint8_t p[21]; - uint8_t a[21]; - uint8_t b[21]; - uint8_t x[21]; - uint8_t y[21]; - uint8_t order[21]; -} _EC_SECG_PRIME_160R1 = { - .seed = { - 0x10, 0x53, 0xcd, 0xe4, 0x2c, 0x14, 0xd6, 0x96, 0xe6, 0x76, - 0x87, 0x56, 0x15, 0x17, 0x53, 0x3b, 0xf3, 0xf8, 0x33, 0x45, - }, - .p = { - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, - 0xff, - }, - .a = { - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, - 0xfc, - }, - .b = { - 0x00, 0x1c, 0x97, 0xbe, 0xfc, 0x54, 0xbd, 0x7a, 0x8b, 0x65, - 0xac, 0xf8, 0x9f, 0x81, 0xd4, 0xd4, 0xad, 0xc5, 0x65, 0xfa, - 0x45, - }, - .x = { - 0x00, 0x4a, 0x96, 0xb5, 0x68, 0x8e, 0xf5, 0x73, 0x28, 0x46, - 0x64, 0x69, 0x89, 0x68, 0xc3, 0x8b, 0xb9, 0x13, 0xcb, 0xfc, - 0x82, - }, - .y = { - 0x00, 0x23, 0xa6, 0x28, 0x55, 0x31, 0x68, 0x94, 0x7d, 0x59, - 0xdc, 0xc9, 0x12, 0x04, 0x23, 0x51, 0x37, 0x7a, 0xc5, 0xfb, - 0x32, - }, - .order = { - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0xf4, 0xc8, 0xf9, 0x27, 0xae, 0xd3, 0xca, 0x75, 0x22, - 0x57, - }, -}; - -static const struct { - uint8_t seed[20]; - uint8_t p[21]; - uint8_t a[21]; - uint8_t b[21]; - uint8_t x[21]; - uint8_t y[21]; - uint8_t order[21]; -} _EC_SECG_PRIME_160R2 = { - .seed = { - 0xb9, 0x9b, 0x99, 0xb0, 0x99, 0xb3, 0x23, 0xe0, 0x27, 0x09, - 0xa4, 0xd6, 0x96, 0xe6, 0x76, 0x87, 0x56, 0x15, 0x17, 0x51, - }, - .p = { - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xac, - 0x73, - }, - .a = { - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xac, - 0x70, - }, - .b = { - 0x00, 0xb4, 0xe1, 0x34, 0xd3, 0xfb, 0x59, 0xeb, 0x8b, 0xab, - 0x57, 0x27, 0x49, 0x04, 0x66, 0x4d, 0x5a, 0xf5, 0x03, 0x88, - 0xba, - }, - .x = { - 0x00, 0x52, 0xdc, 0xb0, 0x34, 0x29, 0x3a, 0x11, 0x7e, 0x1f, - 0x4f, 0xf1, 0x1b, 0x30, 0xf7, 0x19, 0x9d, 0x31, 0x44, 0xce, - 0x6d, - }, - .y = { - 0x00, 0xfe, 0xaf, 0xfe, 0xf2, 0xe3, 0x31, 0xf2, 0x96, 0xe0, - 0x71, 0xfa, 0x0d, 0xf9, 0x98, 0x2c, 0xfe, 0xa7, 0xd4, 0x3f, - 0x2e, - }, - .order = { - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x35, 0x1e, 0xe7, 0x86, 0xa8, 0x18, 0xf3, 0xa1, 0xa1, - 0x6b, - }, -}; - -static const struct { - uint8_t p[24]; - uint8_t a[24]; - uint8_t b[24]; - uint8_t x[24]; - uint8_t y[24]; - uint8_t order[24]; -} _EC_SECG_PRIME_192K1 = { - .p = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xee, 0x37, - }, - .a = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - }, - .b = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x03, - }, - .x = { - 0xdb, 0x4f, 0xf1, 0x0e, 0xc0, 0x57, 0xe9, 0xae, 0x26, 0xb0, - 0x7d, 0x02, 0x80, 0xb7, 0xf4, 0x34, 0x1d, 0xa5, 0xd1, 0xb1, - 0xea, 0xe0, 0x6c, 0x7d, - }, - .y = { - 0x9b, 0x2f, 0x2f, 0x6d, 0x9c, 0x56, 0x28, 0xa7, 0x84, 0x41, - 0x63, 0xd0, 0x15, 0xbe, 0x86, 0x34, 0x40, 0x82, 0xaa, 0x88, - 0xd9, 0x5e, 0x2f, 0x9d, - }, - .order = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x26, 0xf2, 0xfc, 0x17, 0x0f, 0x69, 0x46, 0x6a, - 0x74, 0xde, 0xfd, 0x8d, - }, -}; - static const struct { uint8_t p[29]; uint8_t a[29]; @@ -986,269 +526,6 @@ static const struct { }, }; -/* some wap/wtls curves */ -static const struct { - uint8_t p[15]; - uint8_t a[15]; - uint8_t b[15]; - uint8_t x[15]; - uint8_t y[15]; - uint8_t order[15]; -} _EC_WTLS_8 = { - .p = { - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0xe7, - }, - .a = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, - }, - .b = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, - }, - .x = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, - }, - .y = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, - }, - .order = { - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xec, 0xea, - 0x55, 0x1a, 0xd8, 0x37, 0xe9, - }, -}; - -static const struct { - uint8_t p[21]; - uint8_t a[21]; - uint8_t b[21]; - uint8_t x[21]; - uint8_t y[21]; - uint8_t order[21]; -} _EC_WTLS_9 = { - .p = { - 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x80, - 0x8f, - }, - .a = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, - }, - .b = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, - }, - .x = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, - }, - .y = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, - }, - .order = { - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0xcd, 0xc9, 0x8a, 0xe0, 0xe2, 0xde, 0x57, 0x4a, 0xbf, - 0x33, - }, -}; - -static const struct { - uint8_t p[28]; - uint8_t a[28]; - uint8_t b[28]; - uint8_t x[28]; - uint8_t y[28]; - uint8_t order[28]; -} _EC_WTLS_12 = { - .p = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - }, - .a = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - }, - .b = { - 0xb4, 0x05, 0x0a, 0x85, 0x0c, 0x04, 0xb3, 0xab, 0xf5, 0x41, - 0x32, 0x56, 0x50, 0x44, 0xb0, 0xb7, 0xd7, 0xbf, 0xd8, 0xba, - 0x27, 0x0b, 0x39, 0x43, 0x23, 0x55, 0xff, 0xb4, - }, - .x = { - 0xb7, 0x0e, 0x0c, 0xbd, 0x6b, 0xb4, 0xbf, 0x7f, 0x32, 0x13, - 0x90, 0xb9, 0x4a, 0x03, 0xc1, 0xd3, 0x56, 0xc2, 0x11, 0x22, - 0x34, 0x32, 0x80, 0xd6, 0x11, 0x5c, 0x1d, 0x21, - }, - .y = { - 0xbd, 0x37, 0x63, 0x88, 0xb5, 0xf7, 0x23, 0xfb, 0x4c, 0x22, - 0xdf, 0xe6, 0xcd, 0x43, 0x75, 0xa0, 0x5a, 0x07, 0x47, 0x64, - 0x44, 0xd5, 0x81, 0x99, 0x85, 0x00, 0x7e, 0x34, - }, - .order = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2, 0xe0, 0xb8, 0xf0, 0x3e, - 0x13, 0xdd, 0x29, 0x45, 0x5c, 0x5c, 0x2a, 0x3d, - }, -}; - -static const struct { - uint8_t p[20]; - uint8_t a[20]; - uint8_t b[20]; - uint8_t x[20]; - uint8_t y[20]; - uint8_t order[20]; -} _EC_brainpoolP160r1 = { - .p = { - 0xe9, 0x5e, 0x4a, 0x5f, 0x73, 0x70, 0x59, 0xdc, 0x60, 0xdf, - 0xc7, 0xad, 0x95, 0xb3, 0xd8, 0x13, 0x95, 0x15, 0x62, 0x0f, - }, - .a = { - 0x34, 0x0e, 0x7b, 0xe2, 0xa2, 0x80, 0xeb, 0x74, 0xe2, 0xbe, - 0x61, 0xba, 0xda, 0x74, 0x5d, 0x97, 0xe8, 0xf7, 0xc3, 0x00, - }, - .b = { - 0x1e, 0x58, 0x9a, 0x85, 0x95, 0x42, 0x34, 0x12, 0x13, 0x4f, - 0xaa, 0x2d, 0xbd, 0xec, 0x95, 0xc8, 0xd8, 0x67, 0x5e, 0x58, - }, - .x = { - 0xbe, 0xd5, 0xaf, 0x16, 0xea, 0x3f, 0x6a, 0x4f, 0x62, 0x93, - 0x8c, 0x46, 0x31, 0xeb, 0x5a, 0xf7, 0xbd, 0xbc, 0xdb, 0xc3, - }, - .y = { - 0x16, 0x67, 0xcb, 0x47, 0x7a, 0x1a, 0x8e, 0xc3, 0x38, 0xf9, - 0x47, 0x41, 0x66, 0x9c, 0x97, 0x63, 0x16, 0xda, 0x63, 0x21, - }, - .order = { - 0xe9, 0x5e, 0x4a, 0x5f, 0x73, 0x70, 0x59, 0xdc, 0x60, 0xdf, - 0x59, 0x91, 0xd4, 0x50, 0x29, 0x40, 0x9e, 0x60, 0xfc, 0x09, - }, -}; - -static const struct { - uint8_t p[20]; - uint8_t a[20]; - uint8_t b[20]; - uint8_t x[20]; - uint8_t y[20]; - uint8_t order[20]; -} _EC_brainpoolP160t1 = { - .p = { - 0xe9, 0x5e, 0x4a, 0x5f, 0x73, 0x70, 0x59, 0xdc, 0x60, 0xdf, - 0xc7, 0xad, 0x95, 0xb3, 0xd8, 0x13, 0x95, 0x15, 0x62, 0x0f, - }, - .a = { - 0xe9, 0x5e, 0x4a, 0x5f, 0x73, 0x70, 0x59, 0xdc, 0x60, 0xdf, - 0xc7, 0xad, 0x95, 0xb3, 0xd8, 0x13, 0x95, 0x15, 0x62, 0x0c, - }, - .b = { - 0x7a, 0x55, 0x6b, 0x6d, 0xae, 0x53, 0x5b, 0x7b, 0x51, 0xed, - 0x2c, 0x4d, 0x7d, 0xaa, 0x7a, 0x0b, 0x5c, 0x55, 0xf3, 0x80, - }, - .x = { - 0xb1, 0x99, 0xb1, 0x3b, 0x9b, 0x34, 0xef, 0xc1, 0x39, 0x7e, - 0x64, 0xba, 0xeb, 0x05, 0xac, 0xc2, 0x65, 0xff, 0x23, 0x78, - }, - .y = { - 0xad, 0xd6, 0x71, 0x8b, 0x7c, 0x7c, 0x19, 0x61, 0xf0, 0x99, - 0x1b, 0x84, 0x24, 0x43, 0x77, 0x21, 0x52, 0xc9, 0xe0, 0xad, - }, - .order = { - 0xe9, 0x5e, 0x4a, 0x5f, 0x73, 0x70, 0x59, 0xdc, 0x60, 0xdf, - 0x59, 0x91, 0xd4, 0x50, 0x29, 0x40, 0x9e, 0x60, 0xfc, 0x09, - }, -}; - -static const struct { - uint8_t p[24]; - uint8_t a[24]; - uint8_t b[24]; - uint8_t x[24]; - uint8_t y[24]; - uint8_t order[24]; -} _EC_brainpoolP192r1 = { - .p = { - 0xc3, 0x02, 0xf4, 0x1d, 0x93, 0x2a, 0x36, 0xcd, 0xa7, 0xa3, - 0x46, 0x30, 0x93, 0xd1, 0x8d, 0xb7, 0x8f, 0xce, 0x47, 0x6d, - 0xe1, 0xa8, 0x62, 0x97, - }, - .a = { - 0x6a, 0x91, 0x17, 0x40, 0x76, 0xb1, 0xe0, 0xe1, 0x9c, 0x39, - 0xc0, 0x31, 0xfe, 0x86, 0x85, 0xc1, 0xca, 0xe0, 0x40, 0xe5, - 0xc6, 0x9a, 0x28, 0xef, - }, - .b = { - 0x46, 0x9a, 0x28, 0xef, 0x7c, 0x28, 0xcc, 0xa3, 0xdc, 0x72, - 0x1d, 0x04, 0x4f, 0x44, 0x96, 0xbc, 0xca, 0x7e, 0xf4, 0x14, - 0x6f, 0xbf, 0x25, 0xc9, - }, - .x = { - 0xc0, 0xa0, 0x64, 0x7e, 0xaa, 0xb6, 0xa4, 0x87, 0x53, 0xb0, - 0x33, 0xc5, 0x6c, 0xb0, 0xf0, 0x90, 0x0a, 0x2f, 0x5c, 0x48, - 0x53, 0x37, 0x5f, 0xd6, - }, - .y = { - 0x14, 0xb6, 0x90, 0x86, 0x6a, 0xbd, 0x5b, 0xb8, 0x8b, 0x5f, - 0x48, 0x28, 0xc1, 0x49, 0x00, 0x02, 0xe6, 0x77, 0x3f, 0xa2, - 0xfa, 0x29, 0x9b, 0x8f, - }, - .order = { - 0xc3, 0x02, 0xf4, 0x1d, 0x93, 0x2a, 0x36, 0xcd, 0xa7, 0xa3, - 0x46, 0x2f, 0x9e, 0x9e, 0x91, 0x6b, 0x5b, 0xe8, 0xf1, 0x02, - 0x9a, 0xc4, 0xac, 0xc1, - }, -}; - -static const struct { - uint8_t p[24]; - uint8_t a[24]; - uint8_t b[24]; - uint8_t x[24]; - uint8_t y[24]; - uint8_t order[24]; -} _EC_brainpoolP192t1 = { - .p = { - 0xc3, 0x02, 0xf4, 0x1d, 0x93, 0x2a, 0x36, 0xcd, 0xa7, 0xa3, - 0x46, 0x30, 0x93, 0xd1, 0x8d, 0xb7, 0x8f, 0xce, 0x47, 0x6d, - 0xe1, 0xa8, 0x62, 0x97, - }, - .a = { - 0xc3, 0x02, 0xf4, 0x1d, 0x93, 0x2a, 0x36, 0xcd, 0xa7, 0xa3, - 0x46, 0x30, 0x93, 0xd1, 0x8d, 0xb7, 0x8f, 0xce, 0x47, 0x6d, - 0xe1, 0xa8, 0x62, 0x94, - }, - .b = { - 0x13, 0xd5, 0x6f, 0xfa, 0xec, 0x78, 0x68, 0x1e, 0x68, 0xf9, - 0xde, 0xb4, 0x3b, 0x35, 0xbe, 0xc2, 0xfb, 0x68, 0x54, 0x2e, - 0x27, 0x89, 0x7b, 0x79, - }, - .x = { - 0x3a, 0xe9, 0xe5, 0x8c, 0x82, 0xf6, 0x3c, 0x30, 0x28, 0x2e, - 0x1f, 0xe7, 0xbb, 0xf4, 0x3f, 0xa7, 0x2c, 0x44, 0x6a, 0xf6, - 0xf4, 0x61, 0x81, 0x29, - }, - .y = { - 0x09, 0x7e, 0x2c, 0x56, 0x67, 0xc2, 0x22, 0x3a, 0x90, 0x2a, - 0xb5, 0xca, 0x44, 0x9d, 0x00, 0x84, 0xb7, 0xe5, 0xb3, 0xde, - 0x7c, 0xcc, 0x01, 0xc9, - }, - .order = { - 0xc3, 0x02, 0xf4, 0x1d, 0x93, 0x2a, 0x36, 0xcd, 0xa7, 0xa3, - 0x46, 0x2f, 0x9e, 0x9e, 0x91, 0x6b, 0x5b, 0xe8, 0xf1, 0x02, - 0x9a, 0xc4, 0xac, 0xc1, - }, -}; - static const struct { uint8_t p[28]; uint8_t a[28]; @@ -1806,115 +1083,6 @@ static const struct ec_curve { const uint8_t *order; } ec_curve_list[] = { /* secg curves */ - { - .comment = "SECG/WTLS curve over a 112 bit prime field", - .nid = NID_secp112r1, - .seed_len = sizeof(_EC_SECG_PRIME_112R1.seed), - .param_len = sizeof(_EC_SECG_PRIME_112R1.p), - .seed = _EC_SECG_PRIME_112R1.seed, - .p = _EC_SECG_PRIME_112R1.p, - .a = _EC_SECG_PRIME_112R1.a, - .b = _EC_SECG_PRIME_112R1.b, - .x = _EC_SECG_PRIME_112R1.x, - .y = _EC_SECG_PRIME_112R1.y, - .order = _EC_SECG_PRIME_112R1.order, - .cofactor = 1, - }, - { - .comment = "SECG curve over a 112 bit prime field", - .nid = NID_secp112r2, - .seed_len = sizeof(_EC_SECG_PRIME_112R2.seed), - .param_len = sizeof(_EC_SECG_PRIME_112R2.p), - .seed = _EC_SECG_PRIME_112R2.seed, - .p = _EC_SECG_PRIME_112R2.p, - .a = _EC_SECG_PRIME_112R2.a, - .b = _EC_SECG_PRIME_112R2.b, - .x = _EC_SECG_PRIME_112R2.x, - .y = _EC_SECG_PRIME_112R2.y, - .order = _EC_SECG_PRIME_112R2.order, - .cofactor = 4, - }, - { - .comment = "SECG curve over a 128 bit prime field", - .nid = NID_secp128r1, - .seed_len = sizeof(_EC_SECG_PRIME_128R1.seed), - .param_len = sizeof(_EC_SECG_PRIME_128R1.p), - .seed = _EC_SECG_PRIME_128R1.seed, - .p = _EC_SECG_PRIME_128R1.p, - .a = _EC_SECG_PRIME_128R1.a, - .b = _EC_SECG_PRIME_128R1.b, - .x = _EC_SECG_PRIME_128R1.x, - .y = _EC_SECG_PRIME_128R1.y, - .order = _EC_SECG_PRIME_128R1.order, - .cofactor = 1, - }, - { - .comment = "SECG curve over a 128 bit prime field", - .nid = NID_secp128r2, - .seed_len = sizeof(_EC_SECG_PRIME_128R2.seed), - .param_len = sizeof(_EC_SECG_PRIME_128R2.p), - .seed = _EC_SECG_PRIME_128R2.seed, - .p = _EC_SECG_PRIME_128R2.p, - .a = _EC_SECG_PRIME_128R2.a, - .b = _EC_SECG_PRIME_128R2.b, - .x = _EC_SECG_PRIME_128R2.x, - .y = _EC_SECG_PRIME_128R2.y, - .order = _EC_SECG_PRIME_128R2.order, - .cofactor = 4, - }, - { - .comment = "SECG curve over a 160 bit prime field", - .nid = NID_secp160k1, - .param_len = sizeof(_EC_SECG_PRIME_160K1.p), - .p = _EC_SECG_PRIME_160K1.p, - .a = _EC_SECG_PRIME_160K1.a, - .b = _EC_SECG_PRIME_160K1.b, - .x = _EC_SECG_PRIME_160K1.x, - .y = _EC_SECG_PRIME_160K1.y, - .order = _EC_SECG_PRIME_160K1.order, - .cofactor = 1, - }, - { - .comment = "SECG curve over a 160 bit prime field", - .nid = NID_secp160r1, - .seed_len = sizeof(_EC_SECG_PRIME_160R1.seed), - .param_len = sizeof(_EC_SECG_PRIME_160R1.p), - .seed = _EC_SECG_PRIME_160R1.seed, - .p = _EC_SECG_PRIME_160R1.p, - .a = _EC_SECG_PRIME_160R1.a, - .b = _EC_SECG_PRIME_160R1.b, - .x = _EC_SECG_PRIME_160R1.x, - .y = _EC_SECG_PRIME_160R1.y, - .order = _EC_SECG_PRIME_160R1.order, - .cofactor = 1, - }, - { - .comment = "SECG/WTLS curve over a 160 bit prime field", - .nid = NID_secp160r2, - .seed_len = sizeof(_EC_SECG_PRIME_160R2.seed), - .param_len = sizeof(_EC_SECG_PRIME_160R2.p), - .seed = _EC_SECG_PRIME_160R2.seed, - .p = _EC_SECG_PRIME_160R2.p, - .a = _EC_SECG_PRIME_160R2.a, - .b = _EC_SECG_PRIME_160R2.b, - .x = _EC_SECG_PRIME_160R2.x, - .y = _EC_SECG_PRIME_160R2.y, - .order = _EC_SECG_PRIME_160R2.order, - .cofactor = 1, - }, - /* SECG secp192r1 is the same as X9.62 prime192v1 and hence omitted */ - { - .comment = "SECG curve over a 192 bit prime field", - .nid = NID_secp192k1, - .param_len = sizeof(_EC_SECG_PRIME_192K1.p), - .p = _EC_SECG_PRIME_192K1.p, - .a = _EC_SECG_PRIME_192K1.a, - .b = _EC_SECG_PRIME_192K1.b, - .x = _EC_SECG_PRIME_192K1.x, - .y = _EC_SECG_PRIME_192K1.y, - .order = _EC_SECG_PRIME_192K1.order, - .cofactor = 1, - }, { .comment = "SECG curve over a 224 bit prime field", .nid = NID_secp224k1, @@ -1983,48 +1151,6 @@ static const struct ec_curve { .cofactor = 1, }, /* X9.62 curves */ - { - .comment = "NIST/X9.62/SECG curve over a 192 bit prime field", - .nid = NID_X9_62_prime192v1, - .seed_len = sizeof(_EC_NIST_PRIME_192.seed), - .param_len = sizeof(_EC_NIST_PRIME_192.p), - .seed = _EC_NIST_PRIME_192.seed, - .p = _EC_NIST_PRIME_192.p, - .a = _EC_NIST_PRIME_192.a, - .b = _EC_NIST_PRIME_192.b, - .x = _EC_NIST_PRIME_192.x, - .y = _EC_NIST_PRIME_192.y, - .order = _EC_NIST_PRIME_192.order, - .cofactor = 1, - }, - { - .comment = "X9.62 curve over a 192 bit prime field", - .nid = NID_X9_62_prime192v2, - .seed_len = sizeof(_EC_X9_62_PRIME_192V2.seed), - .param_len = sizeof(_EC_X9_62_PRIME_192V2.p), - .seed = _EC_X9_62_PRIME_192V2.seed, - .p = _EC_X9_62_PRIME_192V2.p, - .a = _EC_X9_62_PRIME_192V2.a, - .b = _EC_X9_62_PRIME_192V2.b, - .x = _EC_X9_62_PRIME_192V2.x, - .y = _EC_X9_62_PRIME_192V2.y, - .order = _EC_X9_62_PRIME_192V2.order, - .cofactor = 1, - }, - { - .comment = "X9.62 curve over a 192 bit prime field", - .nid = NID_X9_62_prime192v3, - .seed_len = sizeof(_EC_X9_62_PRIME_192V3.seed), - .param_len = sizeof(_EC_X9_62_PRIME_192V3.p), - .seed = _EC_X9_62_PRIME_192V3.seed, - .p = _EC_X9_62_PRIME_192V3.p, - .a = _EC_X9_62_PRIME_192V3.a, - .b = _EC_X9_62_PRIME_192V3.b, - .x = _EC_X9_62_PRIME_192V3.x, - .y = _EC_X9_62_PRIME_192V3.y, - .order = _EC_X9_62_PRIME_192V3.order, - .cofactor = 1, - }, { .comment = "X9.62 curve over a 239 bit prime field", .nid = NID_X9_62_prime239v1, @@ -2081,119 +1207,7 @@ static const struct ec_curve { .order = _EC_X9_62_PRIME_256V1.order, .cofactor = 1, }, - { - .comment = "SECG/WTLS curve over a 112 bit prime field", - .nid = NID_wap_wsg_idm_ecid_wtls6, - .seed_len = sizeof(_EC_SECG_PRIME_112R1.seed), - .param_len = sizeof(_EC_SECG_PRIME_112R1.p), - .seed = _EC_SECG_PRIME_112R1.seed, - .p = _EC_SECG_PRIME_112R1.p, - .a = _EC_SECG_PRIME_112R1.a, - .b = _EC_SECG_PRIME_112R1.b, - .x = _EC_SECG_PRIME_112R1.x, - .y = _EC_SECG_PRIME_112R1.y, - .order = _EC_SECG_PRIME_112R1.order, - .cofactor = 1, - }, - { - .comment = "SECG/WTLS curve over a 160 bit prime field", - .nid = NID_wap_wsg_idm_ecid_wtls7, - .seed_len = sizeof(_EC_SECG_PRIME_160R2.seed), - .param_len = sizeof(_EC_SECG_PRIME_160R2.p), - .seed = _EC_SECG_PRIME_160R2.seed, - .p = _EC_SECG_PRIME_160R2.p, - .a = _EC_SECG_PRIME_160R2.a, - .b = _EC_SECG_PRIME_160R2.b, - .x = _EC_SECG_PRIME_160R2.x, - .y = _EC_SECG_PRIME_160R2.y, - .order = _EC_SECG_PRIME_160R2.order, - .cofactor = 1, - }, - { - .comment = "WTLS curve over a 112 bit prime field", - .nid = NID_wap_wsg_idm_ecid_wtls8, - .param_len = sizeof(_EC_WTLS_8.p), - .p = _EC_WTLS_8.p, - .a = _EC_WTLS_8.a, - .b = _EC_WTLS_8.b, - .x = _EC_WTLS_8.x, - .y = _EC_WTLS_8.y, - .order = _EC_WTLS_8.order, - .cofactor = 1, - }, - { - .comment = "WTLS curve over a 160 bit prime field", - .nid = NID_wap_wsg_idm_ecid_wtls9, - .param_len = sizeof(_EC_WTLS_9.p), - .p = _EC_WTLS_9.p, - .a = _EC_WTLS_9.a, - .b = _EC_WTLS_9.b, - .x = _EC_WTLS_9.x, - .y = _EC_WTLS_9.y, - .order = _EC_WTLS_9.order, - .cofactor = 1, - }, - { - .comment = "WTLS curve over a 224 bit prime field", - .nid = NID_wap_wsg_idm_ecid_wtls12, - .param_len = sizeof(_EC_WTLS_12.p), - .p = _EC_WTLS_12.p, - .a = _EC_WTLS_12.a, - .b = _EC_WTLS_12.b, - .x = _EC_WTLS_12.x, - .y = _EC_WTLS_12.y, - .order = _EC_WTLS_12.order, - .cofactor = 1, - }, /* RFC 5639 curves */ - { - .comment = "RFC 5639 curve over a 160 bit prime field", - .nid = NID_brainpoolP160r1, - .param_len = sizeof(_EC_brainpoolP160r1.p), - .p = _EC_brainpoolP160r1.p, - .a = _EC_brainpoolP160r1.a, - .b = _EC_brainpoolP160r1.b, - .x = _EC_brainpoolP160r1.x, - .y = _EC_brainpoolP160r1.y, - .order = _EC_brainpoolP160r1.order, - .cofactor = 1, - }, - { - .comment = "RFC 5639 curve over a 160 bit prime field", - .nid = NID_brainpoolP160t1, - .param_len = sizeof(_EC_brainpoolP160t1.p), - .p = _EC_brainpoolP160t1.p, - .a = _EC_brainpoolP160t1.a, - .b = _EC_brainpoolP160t1.b, - .x = _EC_brainpoolP160t1.x, - .y = _EC_brainpoolP160t1.y, - .order = _EC_brainpoolP160t1.order, - .cofactor = 1, - }, - { - .comment = "RFC 5639 curve over a 192 bit prime field", - .nid = NID_brainpoolP192r1, - .param_len = sizeof(_EC_brainpoolP192r1.p), - .p = _EC_brainpoolP192r1.p, - .a = _EC_brainpoolP192r1.a, - .b = _EC_brainpoolP192r1.b, - .x = _EC_brainpoolP192r1.x, - .y = _EC_brainpoolP192r1.y, - .order = _EC_brainpoolP192r1.order, - .cofactor = 1, - }, - { - .comment = "RFC 5639 curve over a 192 bit prime field", - .nid = NID_brainpoolP192t1, - .param_len = sizeof(_EC_brainpoolP192t1.p), - .p = _EC_brainpoolP192t1.p, - .a = _EC_brainpoolP192t1.a, - .b = _EC_brainpoolP192t1.b, - .x = _EC_brainpoolP192t1.x, - .y = _EC_brainpoolP192t1.y, - .order = _EC_brainpoolP192t1.order, - .cofactor = 1, - }, { .comment = "RFC 5639 curve over a 224 bit prime field", .nid = NID_brainpoolP224r1, @@ -2658,17 +1672,21 @@ ec_group_nid_from_curve(const struct ec_curve *curve) } int -ec_group_is_builtin_curve(const EC_GROUP *group) +ec_group_is_builtin_curve(const EC_GROUP *group, int *out_nid) { struct ec_curve *curve; int ret = 0; + int nid; + + *out_nid = NID_undef; if ((curve = ec_curve_from_group(group)) == NULL) goto err; - - if (ec_group_nid_from_curve(curve) == NID_undef) + if ((nid = ec_group_nid_from_curve(curve)) == NID_undef) goto err; + *out_nid = nid; + ret = 1; err: @@ -2678,19 +1696,19 @@ ec_group_is_builtin_curve(const EC_GROUP *group) } size_t -EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems) +EC_get_builtin_curves(EC_builtin_curve *curves, size_t nitems) { size_t i; - if (r == NULL || nitems == 0) + if (curves == NULL || nitems == 0) return EC_CURVE_LIST_LENGTH; if (nitems > EC_CURVE_LIST_LENGTH) nitems = EC_CURVE_LIST_LENGTH; for (i = 0; i < nitems; i++) { - r[i].nid = ec_curve_list[i].nid; - r[i].comment = ec_curve_list[i].comment; + curves[i].nid = ec_curve_list[i].nid; + curves[i].comment = ec_curve_list[i].comment; } return EC_CURVE_LIST_LENGTH; diff --git a/lib/libcrypto/ec/ec_key.c b/lib/libcrypto/ec/ec_key.c index e95982947..a0a8ff208 100644 --- a/lib/libcrypto/ec/ec_key.c +++ b/lib/libcrypto/ec/ec_key.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ec_key.c,v 1.40 2024/03/27 01:22:30 tb Exp $ */ +/* $OpenBSD: ec_key.c,v 1.48 2024/11/16 10:38:10 tb Exp $ */ /* * Written by Nils Larsch for the OpenSSL project. */ @@ -65,10 +65,12 @@ #include +#include #include #include "bn_local.h" #include "ec_local.h" +#include "ecdsa_local.h" EC_KEY * EC_KEY_new(void) @@ -80,45 +82,48 @@ LCRYPTO_ALIAS(EC_KEY_new); EC_KEY * EC_KEY_new_by_curve_name(int nid) { - EC_KEY *ret = EC_KEY_new(); - if (ret == NULL) - return NULL; - ret->group = EC_GROUP_new_by_curve_name(nid); - if (ret->group == NULL) { - EC_KEY_free(ret); - return NULL; + EC_KEY *ec_key; + + if ((ec_key = EC_KEY_new()) == NULL) + goto err; + + if ((ec_key->group = EC_GROUP_new_by_curve_name(nid)) == NULL) + goto err; + + /* XXX - do we want an ec_key_set0_group()? */ + if (ec_key->meth->set_group != NULL) { + if (!ec_key->meth->set_group(ec_key, ec_key->group)) + goto err; } - if (ret->meth->set_group != NULL && - ret->meth->set_group(ret, ret->group) == 0) { - EC_KEY_free(ret); - return NULL; - } - return ret; + + return ec_key; + + err: + EC_KEY_free(ec_key); + + return NULL; } LCRYPTO_ALIAS(EC_KEY_new_by_curve_name); void -EC_KEY_free(EC_KEY *r) +EC_KEY_free(EC_KEY *ec_key) { - int i; - - if (r == NULL) + if (ec_key == NULL) return; - i = CRYPTO_add(&r->references, -1, CRYPTO_LOCK_EC); - if (i > 0) + if (CRYPTO_add(&ec_key->references, -1, CRYPTO_LOCK_EC) > 0) return; - if (r->meth != NULL && r->meth->finish != NULL) - r->meth->finish(r); + if (ec_key->meth != NULL && ec_key->meth->finish != NULL) + ec_key->meth->finish(ec_key); - CRYPTO_free_ex_data(CRYPTO_EX_INDEX_EC_KEY, r, &r->ex_data); + CRYPTO_free_ex_data(CRYPTO_EX_INDEX_EC_KEY, ec_key, &ec_key->ex_data); - EC_GROUP_free(r->group); - EC_POINT_free(r->pub_key); - BN_free(r->priv_key); + EC_GROUP_free(ec_key->group); + EC_POINT_free(ec_key->pub_key); + BN_free(ec_key->priv_key); - freezero(r, sizeof(EC_KEY)); + freezero(ec_key, sizeof(*ec_key)); } LCRYPTO_ALIAS(EC_KEY_free); @@ -129,75 +134,73 @@ EC_KEY_copy(EC_KEY *dest, const EC_KEY *src) ECerror(ERR_R_PASSED_NULL_PARAMETER); return NULL; } + if (src->meth != dest->meth) { if (dest->meth != NULL && dest->meth->finish != NULL) dest->meth->finish(dest); } - /* copy the parameters */ - if (src->group) { - const EC_METHOD *meth = EC_GROUP_method_of(src->group); - /* clear the old group */ + + if (src->group != NULL) { EC_GROUP_free(dest->group); - dest->group = EC_GROUP_new(meth); - if (dest->group == NULL) + if ((dest->group = EC_GROUP_dup(src->group)) == NULL) return NULL; - if (!EC_GROUP_copy(dest->group, src->group)) - return NULL; - } - /* copy the public key */ - if (src->pub_key && src->group) { - EC_POINT_free(dest->pub_key); - dest->pub_key = EC_POINT_new(src->group); - if (dest->pub_key == NULL) - return NULL; - if (!EC_POINT_copy(dest->pub_key, src->pub_key)) - return NULL; - } - /* copy the private key */ - if (src->priv_key) { - if (dest->priv_key == NULL) { - dest->priv_key = BN_new(); - if (dest->priv_key == NULL) + if (src->pub_key != NULL) { + EC_POINT_free(dest->pub_key); + if ((dest->pub_key = EC_POINT_dup(src->pub_key, + src->group)) == NULL) return NULL; } - if (!bn_copy(dest->priv_key, src->priv_key)) + } + + BN_free(dest->priv_key); + dest->priv_key = NULL; + if (src->priv_key != NULL) { + if ((dest->priv_key = BN_dup(src->priv_key)) == NULL) return NULL; } - /* copy the rest */ dest->enc_flag = src->enc_flag; dest->conv_form = src->conv_form; dest->version = src->version; dest->flags = src->flags; + /* + * The fun part about being a toolkit implementer is that the rest of + * the world gets to live with your terrible API design choices for + * eternity. (To be fair: the signature was changed in OpenSSL 3). + */ if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_EC_KEY, &dest->ex_data, &((EC_KEY *)src)->ex_data)) /* XXX const */ return NULL; - if (src->meth != dest->meth) { - dest->meth = src->meth; - } + dest->meth = src->meth; - if (src->meth != NULL && src->meth->copy != NULL && - src->meth->copy(dest, src) == 0) - return 0; + if (src->meth != NULL && src->meth->copy != NULL) { + if (!src->meth->copy(dest, src)) + return NULL; + } return dest; } LCRYPTO_ALIAS(EC_KEY_copy); EC_KEY * -EC_KEY_dup(const EC_KEY *ec_key) +EC_KEY_dup(const EC_KEY *in_ec_key) { - EC_KEY *ret; + EC_KEY *ec_key; - if ((ret = EC_KEY_new_method(NULL)) == NULL) - return NULL; - if (EC_KEY_copy(ret, ec_key) == NULL) { - EC_KEY_free(ret); - return NULL; - } - return ret; + /* XXX - Pass NULL - so we're perhaps not running the right init()? */ + if ((ec_key = EC_KEY_new_method(NULL)) == NULL) + goto err; + if (EC_KEY_copy(ec_key, in_ec_key) == NULL) + goto err; + + return ec_key; + + err: + EC_KEY_free(ec_key); + + return NULL; } LCRYPTO_ALIAS(EC_KEY_dup); @@ -287,7 +290,7 @@ EC_KEY_check_key(const EC_KEY *eckey) goto err; } - if (EC_POINT_is_at_infinity(eckey->group, eckey->pub_key) > 0) { + if (EC_POINT_is_at_infinity(eckey->group, eckey->pub_key)) { ECerror(EC_R_POINT_AT_INFINITY); goto err; } @@ -313,7 +316,7 @@ EC_KEY_check_key(const EC_KEY *eckey) ECerror(ERR_R_EC_LIB); goto err; } - if (EC_POINT_is_at_infinity(eckey->group, point) <= 0) { + if (!EC_POINT_is_at_infinity(eckey->group, point)) { ECerror(EC_R_WRONG_ORDER); goto err; } @@ -534,3 +537,271 @@ EC_KEY_clear_flags(EC_KEY *key, int flags) key->flags &= ~flags; } LCRYPTO_ALIAS(EC_KEY_clear_flags); + +const EC_KEY_METHOD * +EC_KEY_get_method(const EC_KEY *key) +{ + return key->meth; +} +LCRYPTO_ALIAS(EC_KEY_get_method); + +int +EC_KEY_set_method(EC_KEY *key, const EC_KEY_METHOD *meth) +{ + void (*finish)(EC_KEY *key) = key->meth->finish; + + if (finish != NULL) + finish(key); + + key->meth = meth; + if (meth->init != NULL) + return meth->init(key); + return 1; +} +LCRYPTO_ALIAS(EC_KEY_set_method); + +EC_KEY * +EC_KEY_new_method(ENGINE *engine) +{ + EC_KEY *ret; + + if ((ret = calloc(1, sizeof(EC_KEY))) == NULL) { + ECerror(ERR_R_MALLOC_FAILURE); + return NULL; + } + ret->meth = EC_KEY_get_default_method(); + ret->version = 1; + ret->flags = 0; + ret->group = NULL; + ret->pub_key = NULL; + ret->priv_key = NULL; + ret->enc_flag = 0; + ret->conv_form = POINT_CONVERSION_UNCOMPRESSED; + ret->references = 1; + + if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_EC_KEY, ret, &ret->ex_data)) + goto err; + if (ret->meth->init != NULL && ret->meth->init(ret) == 0) + goto err; + + return ret; + + err: + EC_KEY_free(ret); + return NULL; +} +LCRYPTO_ALIAS(EC_KEY_new_method); + +EC_KEY_METHOD * +EC_KEY_METHOD_new(const EC_KEY_METHOD *meth) +{ + EC_KEY_METHOD *ret; + + if ((ret = calloc(1, sizeof(*meth))) == NULL) + return NULL; + if (meth != NULL) + *ret = *meth; + ret->flags |= EC_KEY_METHOD_DYNAMIC; + return ret; +} +LCRYPTO_ALIAS(EC_KEY_METHOD_new); + +void +EC_KEY_METHOD_free(EC_KEY_METHOD *meth) +{ + if (meth == NULL) + return; + if (meth->flags & EC_KEY_METHOD_DYNAMIC) + free(meth); +} +LCRYPTO_ALIAS(EC_KEY_METHOD_free); + +void +EC_KEY_METHOD_set_init(EC_KEY_METHOD *meth, + int (*init)(EC_KEY *key), + void (*finish)(EC_KEY *key), + int (*copy)(EC_KEY *dest, const EC_KEY *src), + int (*set_group)(EC_KEY *key, const EC_GROUP *grp), + int (*set_private)(EC_KEY *key, const BIGNUM *priv_key), + int (*set_public)(EC_KEY *key, const EC_POINT *pub_key)) +{ + meth->init = init; + meth->finish = finish; + meth->copy = copy; + meth->set_group = set_group; + meth->set_private = set_private; + meth->set_public = set_public; +} +LCRYPTO_ALIAS(EC_KEY_METHOD_set_init); + +void +EC_KEY_METHOD_set_keygen(EC_KEY_METHOD *meth, int (*keygen)(EC_KEY *key)) +{ + meth->keygen = keygen; +} +LCRYPTO_ALIAS(EC_KEY_METHOD_set_keygen); + +void +EC_KEY_METHOD_set_compute_key(EC_KEY_METHOD *meth, + int (*ckey)(unsigned char **out, size_t *out_len, const EC_POINT *pub_key, + const EC_KEY *ecdh)) +{ + meth->compute_key = ckey; +} +LCRYPTO_ALIAS(EC_KEY_METHOD_set_compute_key); + +void +EC_KEY_METHOD_set_sign(EC_KEY_METHOD *meth, + int (*sign)(int type, const unsigned char *dgst, + int dlen, unsigned char *sig, unsigned int *siglen, + const BIGNUM *kinv, const BIGNUM *r, EC_KEY *eckey), + int (*sign_setup)(EC_KEY *eckey, BN_CTX *ctx_in, + BIGNUM **kinvp, BIGNUM **rp), + ECDSA_SIG *(*sign_sig)(const unsigned char *dgst, + int dgst_len, const BIGNUM *in_kinv, + const BIGNUM *in_r, EC_KEY *eckey)) +{ + meth->sign = sign; + meth->sign_setup = sign_setup; + meth->sign_sig = sign_sig; +} +LCRYPTO_ALIAS(EC_KEY_METHOD_set_sign); + +void +EC_KEY_METHOD_set_verify(EC_KEY_METHOD *meth, + int (*verify)(int type, const unsigned char *dgst, int dgst_len, + const unsigned char *sigbuf, int sig_len, EC_KEY *eckey), + int (*verify_sig)(const unsigned char *dgst, int dgst_len, + const ECDSA_SIG *sig, EC_KEY *eckey)) +{ + meth->verify = verify; + meth->verify_sig = verify_sig; +} +LCRYPTO_ALIAS(EC_KEY_METHOD_set_verify); + + +void +EC_KEY_METHOD_get_init(const EC_KEY_METHOD *meth, + int (**pinit)(EC_KEY *key), + void (**pfinish)(EC_KEY *key), + int (**pcopy)(EC_KEY *dest, const EC_KEY *src), + int (**pset_group)(EC_KEY *key, const EC_GROUP *grp), + int (**pset_private)(EC_KEY *key, const BIGNUM *priv_key), + int (**pset_public)(EC_KEY *key, const EC_POINT *pub_key)) +{ + if (pinit != NULL) + *pinit = meth->init; + if (pfinish != NULL) + *pfinish = meth->finish; + if (pcopy != NULL) + *pcopy = meth->copy; + if (pset_group != NULL) + *pset_group = meth->set_group; + if (pset_private != NULL) + *pset_private = meth->set_private; + if (pset_public != NULL) + *pset_public = meth->set_public; +} +LCRYPTO_ALIAS(EC_KEY_METHOD_get_init); + +void +EC_KEY_METHOD_get_keygen(const EC_KEY_METHOD *meth, + int (**pkeygen)(EC_KEY *key)) +{ + if (pkeygen != NULL) + *pkeygen = meth->keygen; +} +LCRYPTO_ALIAS(EC_KEY_METHOD_get_keygen); + +void +EC_KEY_METHOD_get_compute_key(const EC_KEY_METHOD *meth, + int (**pck)(unsigned char **out, size_t *out_len, const EC_POINT *pub_key, + const EC_KEY *ecdh)) +{ + if (pck != NULL) + *pck = meth->compute_key; +} +LCRYPTO_ALIAS(EC_KEY_METHOD_get_compute_key); + +void +EC_KEY_METHOD_get_sign(const EC_KEY_METHOD *meth, + int (**psign)(int type, const unsigned char *dgst, + int dlen, unsigned char *sig, unsigned int *siglen, + const BIGNUM *kinv, const BIGNUM *r, EC_KEY *eckey), + int (**psign_setup)(EC_KEY *eckey, BN_CTX *ctx_in, + BIGNUM **kinvp, BIGNUM **rp), + ECDSA_SIG *(**psign_sig)(const unsigned char *dgst, + int dgst_len, const BIGNUM *in_kinv, const BIGNUM *in_r, + EC_KEY *eckey)) +{ + if (psign != NULL) + *psign = meth->sign; + if (psign_setup != NULL) + *psign_setup = meth->sign_setup; + if (psign_sig != NULL) + *psign_sig = meth->sign_sig; +} +LCRYPTO_ALIAS(EC_KEY_METHOD_get_sign); + +void +EC_KEY_METHOD_get_verify(const EC_KEY_METHOD *meth, + int (**pverify)(int type, const unsigned char *dgst, int dgst_len, + const unsigned char *sigbuf, int sig_len, EC_KEY *eckey), + int (**pverify_sig)(const unsigned char *dgst, int dgst_len, + const ECDSA_SIG *sig, EC_KEY *eckey)) +{ + if (pverify != NULL) + *pverify = meth->verify; + if (pverify_sig != NULL) + *pverify_sig = meth->verify_sig; +} +LCRYPTO_ALIAS(EC_KEY_METHOD_get_verify); + +static const EC_KEY_METHOD openssl_ec_key_method = { + .name = "OpenSSL EC_KEY method", + .flags = 0, + + .init = NULL, + .finish = NULL, + .copy = NULL, + + .set_group = NULL, + .set_private = NULL, + .set_public = NULL, + + .keygen = ec_key_gen, + .compute_key = ecdh_compute_key, + + .sign = ecdsa_sign, + .sign_setup = ecdsa_sign_setup, + .sign_sig = ecdsa_sign_sig, + + .verify = ecdsa_verify, + .verify_sig = ecdsa_verify_sig, +}; + +const EC_KEY_METHOD * +EC_KEY_OpenSSL(void) +{ + return &openssl_ec_key_method; +} +LCRYPTO_ALIAS(EC_KEY_OpenSSL); + +const EC_KEY_METHOD *default_ec_key_meth = &openssl_ec_key_method; + +const EC_KEY_METHOD * +EC_KEY_get_default_method(void) +{ + return default_ec_key_meth; +} +LCRYPTO_ALIAS(EC_KEY_get_default_method); + +void +EC_KEY_set_default_method(const EC_KEY_METHOD *meth) +{ + if (meth == NULL) + default_ec_key_meth = &openssl_ec_key_method; + else + default_ec_key_meth = meth; +} +LCRYPTO_ALIAS(EC_KEY_set_default_method); diff --git a/lib/libcrypto/ec/ec_kmeth.c b/lib/libcrypto/ec/ec_kmeth.c deleted file mode 100644 index fa79b9a29..000000000 --- a/lib/libcrypto/ec/ec_kmeth.c +++ /dev/null @@ -1,328 +0,0 @@ -/* $OpenBSD: ec_kmeth.c,v 1.14 2024/08/03 13:06:37 tb Exp $ */ -/* - * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL - * project. - */ -/* ==================================================================== - * Copyright (c) 2015 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * licensing@OpenSSL.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - */ - -#include -#include - -#include "bn_local.h" -#include "ec_local.h" -#include "ecdsa_local.h" - -static const EC_KEY_METHOD openssl_ec_key_method = { - .name = "OpenSSL EC_KEY method", - .flags = 0, - - .init = NULL, - .finish = NULL, - .copy = NULL, - - .set_group = NULL, - .set_private = NULL, - .set_public = NULL, - - .keygen = ec_key_gen, - .compute_key = ecdh_compute_key, - - .sign = ecdsa_sign, - .sign_setup = ecdsa_sign_setup, - .sign_sig = ecdsa_sign_sig, - - .verify = ecdsa_verify, - .verify_sig = ecdsa_verify_sig, -}; - -const EC_KEY_METHOD *default_ec_key_meth = &openssl_ec_key_method; - -const EC_KEY_METHOD * -EC_KEY_OpenSSL(void) -{ - return &openssl_ec_key_method; -} -LCRYPTO_ALIAS(EC_KEY_OpenSSL); - -const EC_KEY_METHOD * -EC_KEY_get_default_method(void) -{ - return default_ec_key_meth; -} -LCRYPTO_ALIAS(EC_KEY_get_default_method); - -void -EC_KEY_set_default_method(const EC_KEY_METHOD *meth) -{ - if (meth == NULL) - default_ec_key_meth = &openssl_ec_key_method; - else - default_ec_key_meth = meth; -} -LCRYPTO_ALIAS(EC_KEY_set_default_method); - -const EC_KEY_METHOD * -EC_KEY_get_method(const EC_KEY *key) -{ - return key->meth; -} -LCRYPTO_ALIAS(EC_KEY_get_method); - -int -EC_KEY_set_method(EC_KEY *key, const EC_KEY_METHOD *meth) -{ - void (*finish)(EC_KEY *key) = key->meth->finish; - - if (finish != NULL) - finish(key); - - key->meth = meth; - if (meth->init != NULL) - return meth->init(key); - return 1; -} -LCRYPTO_ALIAS(EC_KEY_set_method); - -EC_KEY * -EC_KEY_new_method(ENGINE *engine) -{ - EC_KEY *ret; - - if ((ret = calloc(1, sizeof(EC_KEY))) == NULL) { - ECerror(ERR_R_MALLOC_FAILURE); - return NULL; - } - ret->meth = EC_KEY_get_default_method(); - ret->version = 1; - ret->flags = 0; - ret->group = NULL; - ret->pub_key = NULL; - ret->priv_key = NULL; - ret->enc_flag = 0; - ret->conv_form = POINT_CONVERSION_UNCOMPRESSED; - ret->references = 1; - - if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_EC_KEY, ret, &ret->ex_data)) - goto err; - if (ret->meth->init != NULL && ret->meth->init(ret) == 0) - goto err; - - return ret; - - err: - EC_KEY_free(ret); - return NULL; -} -LCRYPTO_ALIAS(EC_KEY_new_method); - -EC_KEY_METHOD * -EC_KEY_METHOD_new(const EC_KEY_METHOD *meth) -{ - EC_KEY_METHOD *ret; - - if ((ret = calloc(1, sizeof(*meth))) == NULL) - return NULL; - if (meth != NULL) - *ret = *meth; - ret->flags |= EC_KEY_METHOD_DYNAMIC; - return ret; -} -LCRYPTO_ALIAS(EC_KEY_METHOD_new); - -void -EC_KEY_METHOD_free(EC_KEY_METHOD *meth) -{ - if (meth == NULL) - return; - if (meth->flags & EC_KEY_METHOD_DYNAMIC) - free(meth); -} -LCRYPTO_ALIAS(EC_KEY_METHOD_free); - -void -EC_KEY_METHOD_set_init(EC_KEY_METHOD *meth, - int (*init)(EC_KEY *key), - void (*finish)(EC_KEY *key), - int (*copy)(EC_KEY *dest, const EC_KEY *src), - int (*set_group)(EC_KEY *key, const EC_GROUP *grp), - int (*set_private)(EC_KEY *key, const BIGNUM *priv_key), - int (*set_public)(EC_KEY *key, const EC_POINT *pub_key)) -{ - meth->init = init; - meth->finish = finish; - meth->copy = copy; - meth->set_group = set_group; - meth->set_private = set_private; - meth->set_public = set_public; -} -LCRYPTO_ALIAS(EC_KEY_METHOD_set_init); - -void -EC_KEY_METHOD_set_keygen(EC_KEY_METHOD *meth, int (*keygen)(EC_KEY *key)) -{ - meth->keygen = keygen; -} -LCRYPTO_ALIAS(EC_KEY_METHOD_set_keygen); - -void -EC_KEY_METHOD_set_compute_key(EC_KEY_METHOD *meth, - int (*ckey)(unsigned char **out, size_t *out_len, const EC_POINT *pub_key, - const EC_KEY *ecdh)) -{ - meth->compute_key = ckey; -} -LCRYPTO_ALIAS(EC_KEY_METHOD_set_compute_key); - -void -EC_KEY_METHOD_set_sign(EC_KEY_METHOD *meth, - int (*sign)(int type, const unsigned char *dgst, - int dlen, unsigned char *sig, unsigned int *siglen, - const BIGNUM *kinv, const BIGNUM *r, EC_KEY *eckey), - int (*sign_setup)(EC_KEY *eckey, BN_CTX *ctx_in, - BIGNUM **kinvp, BIGNUM **rp), - ECDSA_SIG *(*sign_sig)(const unsigned char *dgst, - int dgst_len, const BIGNUM *in_kinv, - const BIGNUM *in_r, EC_KEY *eckey)) -{ - meth->sign = sign; - meth->sign_setup = sign_setup; - meth->sign_sig = sign_sig; -} -LCRYPTO_ALIAS(EC_KEY_METHOD_set_sign); - -void -EC_KEY_METHOD_set_verify(EC_KEY_METHOD *meth, - int (*verify)(int type, const unsigned char *dgst, int dgst_len, - const unsigned char *sigbuf, int sig_len, EC_KEY *eckey), - int (*verify_sig)(const unsigned char *dgst, int dgst_len, - const ECDSA_SIG *sig, EC_KEY *eckey)) -{ - meth->verify = verify; - meth->verify_sig = verify_sig; -} -LCRYPTO_ALIAS(EC_KEY_METHOD_set_verify); - - -void -EC_KEY_METHOD_get_init(const EC_KEY_METHOD *meth, - int (**pinit)(EC_KEY *key), - void (**pfinish)(EC_KEY *key), - int (**pcopy)(EC_KEY *dest, const EC_KEY *src), - int (**pset_group)(EC_KEY *key, const EC_GROUP *grp), - int (**pset_private)(EC_KEY *key, const BIGNUM *priv_key), - int (**pset_public)(EC_KEY *key, const EC_POINT *pub_key)) -{ - if (pinit != NULL) - *pinit = meth->init; - if (pfinish != NULL) - *pfinish = meth->finish; - if (pcopy != NULL) - *pcopy = meth->copy; - if (pset_group != NULL) - *pset_group = meth->set_group; - if (pset_private != NULL) - *pset_private = meth->set_private; - if (pset_public != NULL) - *pset_public = meth->set_public; -} -LCRYPTO_ALIAS(EC_KEY_METHOD_get_init); - -void -EC_KEY_METHOD_get_keygen(const EC_KEY_METHOD *meth, - int (**pkeygen)(EC_KEY *key)) -{ - if (pkeygen != NULL) - *pkeygen = meth->keygen; -} -LCRYPTO_ALIAS(EC_KEY_METHOD_get_keygen); - -void -EC_KEY_METHOD_get_compute_key(const EC_KEY_METHOD *meth, - int (**pck)(unsigned char **out, size_t *out_len, const EC_POINT *pub_key, - const EC_KEY *ecdh)) -{ - if (pck != NULL) - *pck = meth->compute_key; -} -LCRYPTO_ALIAS(EC_KEY_METHOD_get_compute_key); - -void -EC_KEY_METHOD_get_sign(const EC_KEY_METHOD *meth, - int (**psign)(int type, const unsigned char *dgst, - int dlen, unsigned char *sig, unsigned int *siglen, - const BIGNUM *kinv, const BIGNUM *r, EC_KEY *eckey), - int (**psign_setup)(EC_KEY *eckey, BN_CTX *ctx_in, - BIGNUM **kinvp, BIGNUM **rp), - ECDSA_SIG *(**psign_sig)(const unsigned char *dgst, - int dgst_len, const BIGNUM *in_kinv, const BIGNUM *in_r, - EC_KEY *eckey)) -{ - if (psign != NULL) - *psign = meth->sign; - if (psign_setup != NULL) - *psign_setup = meth->sign_setup; - if (psign_sig != NULL) - *psign_sig = meth->sign_sig; -} -LCRYPTO_ALIAS(EC_KEY_METHOD_get_sign); - -void -EC_KEY_METHOD_get_verify(const EC_KEY_METHOD *meth, - int (**pverify)(int type, const unsigned char *dgst, int dgst_len, - const unsigned char *sigbuf, int sig_len, EC_KEY *eckey), - int (**pverify_sig)(const unsigned char *dgst, int dgst_len, - const ECDSA_SIG *sig, EC_KEY *eckey)) -{ - if (pverify != NULL) - *pverify = meth->verify; - if (pverify_sig != NULL) - *pverify_sig = meth->verify_sig; -} -LCRYPTO_ALIAS(EC_KEY_METHOD_get_verify); diff --git a/lib/libcrypto/ec/ec_lib.c b/lib/libcrypto/ec/ec_lib.c index 1918d0ba5..a50b1e563 100644 --- a/lib/libcrypto/ec/ec_lib.c +++ b/lib/libcrypto/ec/ec_lib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ec_lib.c,v 1.72 2024/10/19 08:29:40 tb Exp $ */ +/* $OpenBSD: ec_lib.c,v 1.103 2025/01/07 08:30:52 tb Exp $ */ /* * Originally written by Bodo Moeller for the OpenSSL project. */ @@ -61,54 +61,61 @@ * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. */ +#include #include #include +#include +#include #include +#include #include #include "bn_local.h" #include "ec_local.h" -/* functions for EC_GROUP objects */ - EC_GROUP * EC_GROUP_new(const EC_METHOD *meth) { - EC_GROUP *ret; + EC_GROUP *group = NULL; if (meth == NULL) { ECerror(EC_R_SLOT_FULL); - return NULL; + goto err; } - if (meth->group_init == NULL) { - ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); - return NULL; - } - ret = malloc(sizeof *ret); - if (ret == NULL) { + if ((group = calloc(1, sizeof(*group))) == NULL) { ECerror(ERR_R_MALLOC_FAILURE); - return NULL; + goto err; } - ret->meth = meth; - ret->generator = NULL; - BN_init(&ret->order); - BN_init(&ret->cofactor); + group->meth = meth; - ret->curve_name = 0; - ret->asn1_flag = OPENSSL_EC_NAMED_CURVE; - ret->asn1_form = POINT_CONVERSION_UNCOMPRESSED; + group->asn1_flag = OPENSSL_EC_NAMED_CURVE; + group->asn1_form = POINT_CONVERSION_UNCOMPRESSED; - ret->seed = NULL; - ret->seed_len = 0; + if ((group->p = BN_new()) == NULL) + goto err; + if ((group->a = BN_new()) == NULL) + goto err; + if ((group->b = BN_new()) == NULL) + goto err; - if (!meth->group_init(ret)) { - free(ret); - return NULL; - } - return ret; + if ((group->order = BN_new()) == NULL) + goto err; + if ((group->cofactor = BN_new()) == NULL) + goto err; + + /* + * generator, seed and mont_ctx are optional. + */ + + return group; + + err: + EC_GROUP_free(group); + + return NULL; } LCRYPTO_ALIAS(EC_GROUP_new); @@ -118,12 +125,15 @@ EC_GROUP_free(EC_GROUP *group) if (group == NULL) return; - if (group->meth->group_finish != NULL) - group->meth->group_finish(group); + BN_free(group->p); + BN_free(group->a); + BN_free(group->b); + + BN_MONT_CTX_free(group->mont_ctx); EC_POINT_free(group->generator); - BN_free(&group->order); - BN_free(&group->cofactor); + BN_free(group->order); + BN_free(group->cofactor); freezero(group->seed, group->seed_len); freezero(group, sizeof *group); @@ -138,70 +148,77 @@ EC_GROUP_clear_free(EC_GROUP *group) LCRYPTO_ALIAS(EC_GROUP_clear_free); int -EC_GROUP_copy(EC_GROUP *dest, const EC_GROUP *src) +EC_GROUP_copy(EC_GROUP *dst, const EC_GROUP *src) { - if (dest->meth->group_copy == NULL) { - ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); - return 0; - } - if (dest->meth != src->meth) { + if (dst->meth != src->meth) { ECerror(EC_R_INCOMPATIBLE_OBJECTS); return 0; } - if (dest == src) + if (dst == src) return 1; + if (!bn_copy(dst->p, src->p)) + return 0; + if (!bn_copy(dst->a, src->a)) + return 0; + if (!bn_copy(dst->b, src->b)) + return 0; + + dst->a_is_minus3 = src->a_is_minus3; + + BN_MONT_CTX_free(dst->mont_ctx); + dst->mont_ctx = NULL; + if (src->mont_ctx != NULL) { + if ((dst->mont_ctx = BN_MONT_CTX_new()) == NULL) + return 0; + if (!BN_MONT_CTX_copy(dst->mont_ctx, src->mont_ctx)) + return 0; + } + + EC_POINT_free(dst->generator); + dst->generator = NULL; if (src->generator != NULL) { - if (dest->generator == NULL) { - dest->generator = EC_POINT_new(dest); - if (dest->generator == NULL) - return 0; - } - if (!EC_POINT_copy(dest->generator, src->generator)) + if (!EC_GROUP_set_generator(dst, src->generator, src->order, + src->cofactor)) return 0; } else { - /* src->generator == NULL */ - EC_POINT_free(dest->generator); - dest->generator = NULL; - } - - if (!bn_copy(&dest->order, &src->order)) - return 0; - if (!bn_copy(&dest->cofactor, &src->cofactor)) - return 0; - - dest->curve_name = src->curve_name; - dest->asn1_flag = src->asn1_flag; - dest->asn1_form = src->asn1_form; - - if (src->seed) { - free(dest->seed); - dest->seed = malloc(src->seed_len); - if (dest->seed == NULL) + /* XXX - should do the sanity checks as in set_generator() */ + if (!bn_copy(dst->order, src->order)) + return 0; + if (!bn_copy(dst->cofactor, src->cofactor)) return 0; - memcpy(dest->seed, src->seed, src->seed_len); - dest->seed_len = src->seed_len; - } else { - free(dest->seed); - dest->seed = NULL; - dest->seed_len = 0; } - return dest->meth->group_copy(dest, src); + dst->nid = src->nid; + dst->asn1_flag = src->asn1_flag; + dst->asn1_form = src->asn1_form; + + if (!EC_GROUP_set_seed(dst, src->seed, src->seed_len)) + return 0; + + return 1; } LCRYPTO_ALIAS(EC_GROUP_copy); EC_GROUP * -EC_GROUP_dup(const EC_GROUP *a) +EC_GROUP_dup(const EC_GROUP *in_group) { - EC_GROUP *t = NULL; + EC_GROUP *group = NULL; - if ((a != NULL) && ((t = EC_GROUP_new(a->meth)) != NULL) && - (!EC_GROUP_copy(t, a))) { - EC_GROUP_free(t); - t = NULL; - } - return t; + if (in_group == NULL) + goto err; + + if ((group = EC_GROUP_new(in_group->meth)) == NULL) + goto err; + if (!EC_GROUP_copy(group, in_group)) + goto err; + + return group; + + err: + EC_GROUP_free(group); + + return NULL; } LCRYPTO_ALIAS(EC_GROUP_dup); @@ -219,18 +236,27 @@ EC_METHOD_get_field_type(const EC_METHOD *meth) } LCRYPTO_ALIAS(EC_METHOD_get_field_type); +int +ec_group_get_field_type(const EC_GROUP *group) +{ + if (group == NULL || group->meth == NULL) + return NID_undef; + + return group->meth->field_type; +} + /* * If there is a user-provided cofactor, sanity check and use it. Otherwise - * try computing the cofactor from generator order n and field cardinality q. + * try computing the cofactor from generator order n and field cardinality p. * This works for all curves of cryptographic interest. * - * Hasse's theorem: | h * n - (q + 1) | <= 2 * sqrt(q) + * Hasse's theorem: | h * n - (p + 1) | <= 2 * sqrt(p) * - * So: h_min = (q + 1 - 2*sqrt(q)) / n and h_max = (q + 1 + 2*sqrt(q)) / n and - * therefore h_max - h_min = 4*sqrt(q) / n. So if n > 4*sqrt(q) holds, there is + * So: h_min = (p + 1 - 2*sqrt(p)) / n and h_max = (p + 1 + 2*sqrt(p)) / n and + * therefore h_max - h_min = 4*sqrt(p) / n. So if n > 4*sqrt(p) holds, there is * only one possible value for h: * - * h = \lfloor (h_min + h_max)/2 \rceil = \lfloor (q + 1)/n \rceil + * h = \lfloor (h_min + h_max)/2 \rceil = \lfloor (p + 1)/n \rceil * * Otherwise, zero cofactor and return success. */ @@ -241,7 +267,7 @@ ec_set_cofactor(EC_GROUP *group, const BIGNUM *in_cofactor) BIGNUM *cofactor; int ret = 0; - BN_zero(&group->cofactor); + BN_zero(group->cofactor); if ((ctx = BN_CTX_new()) == NULL) goto err; @@ -267,38 +293,37 @@ ec_set_cofactor(EC_GROUP *group, const BIGNUM *in_cofactor) /* * If the cofactor is too large, we cannot guess it and default to zero. - * The RHS of below is a strict overestimate of log(4 * sqrt(q)). + * The RHS of below is a strict overestimate of log(4 * sqrt(p)). */ - if (BN_num_bits(&group->order) <= - (BN_num_bits(&group->field) + 1) / 2 + 3) + if (BN_num_bits(group->order) <= (BN_num_bits(group->p) + 1) / 2 + 3) goto done; /* * Compute - * h = \lfloor (q + 1)/n \rceil = \lfloor (q + 1 + n/2) / n \rfloor. + * h = \lfloor (p + 1)/n \rceil = \lfloor (p + 1 + n/2) / n \rfloor. */ /* h = n/2 */ - if (!BN_rshift1(cofactor, &group->order)) + if (!BN_rshift1(cofactor, group->order)) goto err; /* h = 1 + n/2 */ if (!BN_add_word(cofactor, 1)) goto err; - /* h = q + 1 + n/2 */ - if (!BN_add(cofactor, cofactor, &group->field)) + /* h = p + 1 + n/2 */ + if (!BN_add(cofactor, cofactor, group->p)) goto err; - /* h = (q + 1 + n/2) / n */ - if (!BN_div_ct(cofactor, NULL, cofactor, &group->order, ctx)) + /* h = (p + 1 + n/2) / n */ + if (!BN_div_ct(cofactor, NULL, cofactor, group->order, ctx)) goto err; done: /* Use Hasse's theorem to bound the cofactor. */ - if (BN_num_bits(cofactor) > BN_num_bits(&group->field) + 1) { + if (BN_num_bits(cofactor) > BN_num_bits(group->p) + 1) { ECerror(EC_R_INVALID_GROUP_ORDER); goto err; } - if (!bn_copy(&group->cofactor, cofactor)) + if (!bn_copy(group->cofactor, cofactor)) goto err; ret = 1; @@ -319,8 +344,8 @@ EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator, return 0; } - /* Require group->field >= 1. */ - if (BN_is_zero(&group->field) || BN_is_negative(&group->field)) { + /* Require p >= 1. */ + if (BN_is_zero(group->p) || BN_is_negative(group->p)) { ECerror(EC_R_INVALID_FIELD); return 0; } @@ -330,7 +355,7 @@ EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator, * than the field cardinality due to Hasse's theorem. */ if (order == NULL || BN_cmp(order, BN_value_one()) <= 0 || - BN_num_bits(order) > BN_num_bits(&group->field) + 1) { + BN_num_bits(order) > BN_num_bits(group->p) + 1) { ECerror(EC_R_INVALID_GROUP_ORDER); return 0; } @@ -343,7 +368,7 @@ EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator, if (!EC_POINT_copy(group->generator, generator)) return 0; - if (!bn_copy(&group->order, order)) + if (!bn_copy(group->order, order)) return 0; if (!ec_set_cofactor(group, cofactor)) @@ -363,7 +388,7 @@ LCRYPTO_ALIAS(EC_GROUP_get0_generator); int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order, BN_CTX *ctx) { - if (!bn_copy(order, &group->order)) + if (!bn_copy(order, group->order)) return 0; return !BN_is_zero(order); @@ -373,43 +398,43 @@ LCRYPTO_ALIAS(EC_GROUP_get_order); const BIGNUM * EC_GROUP_get0_order(const EC_GROUP *group) { - return &group->order; + return group->order; } int EC_GROUP_order_bits(const EC_GROUP *group) { - return group->meth->group_order_bits(group); + return BN_num_bits(group->order); } LCRYPTO_ALIAS(EC_GROUP_order_bits); int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor, BN_CTX *ctx) { - if (!bn_copy(cofactor, &group->cofactor)) + if (!bn_copy(cofactor, group->cofactor)) return 0; - return !BN_is_zero(&group->cofactor); + return !BN_is_zero(group->cofactor); } LCRYPTO_ALIAS(EC_GROUP_get_cofactor); const BIGNUM * EC_GROUP_get0_cofactor(const EC_GROUP *group) { - return &group->cofactor; + return group->cofactor; } void EC_GROUP_set_curve_name(EC_GROUP *group, int nid) { - group->curve_name = nid; + group->nid = nid; } LCRYPTO_ALIAS(EC_GROUP_set_curve_name); int EC_GROUP_get_curve_name(const EC_GROUP *group) { - return group->curve_name; + return group->nid; } LCRYPTO_ALIAS(EC_GROUP_get_curve_name); @@ -443,19 +468,18 @@ EC_GROUP_get_point_conversion_form(const EC_GROUP *group) LCRYPTO_ALIAS(EC_GROUP_get_point_conversion_form); size_t -EC_GROUP_set_seed(EC_GROUP *group, const unsigned char *p, size_t len) +EC_GROUP_set_seed(EC_GROUP *group, const unsigned char *seed, size_t len) { - if (group->seed) { - free(group->seed); - group->seed = NULL; - group->seed_len = 0; - } - if (!len || !p) + free(group->seed); + group->seed = NULL; + group->seed_len = 0; + + if (seed == NULL || len == 0) return 1; if ((group->seed = malloc(len)) == NULL) return 0; - memcpy(group->seed, p, len); + memcpy(group->seed, seed, len); group->seed_len = len; return len; @@ -568,11 +592,7 @@ LCRYPTO_ALIAS(EC_GROUP_new_curve_GFp); int EC_GROUP_get_degree(const EC_GROUP *group) { - if (group->meth->group_get_degree == NULL) { - ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); - return 0; - } - return group->meth->group_get_degree(group); + return BN_num_bits(group->p); } LCRYPTO_ALIAS(EC_GROUP_get_degree); @@ -580,6 +600,7 @@ int EC_GROUP_check_discriminant(const EC_GROUP *group, BN_CTX *ctx_in) { BN_CTX *ctx; + BIGNUM *p, *a, *b, *discriminant; int ret = 0; if ((ctx = ctx_in) == NULL) @@ -587,11 +608,50 @@ EC_GROUP_check_discriminant(const EC_GROUP *group, BN_CTX *ctx_in) if (ctx == NULL) goto err; - if (group->meth->group_check_discriminant == NULL) { - ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); + BN_CTX_start(ctx); + + if ((p = BN_CTX_get(ctx)) == NULL) goto err; - } - ret = group->meth->group_check_discriminant(group, ctx); + if ((a = BN_CTX_get(ctx)) == NULL) + goto err; + if ((b = BN_CTX_get(ctx)) == NULL) + goto err; + if ((discriminant = BN_CTX_get(ctx)) == NULL) + goto err; + + if (!EC_GROUP_get_curve(group, p, a, b, ctx)) + goto err; + + /* + * Check that the discriminant 4a^3 + 27b^2 is non-zero modulo p. + */ + + if (BN_is_zero(a) && BN_is_zero(b)) + goto err; + if (BN_is_zero(a) || BN_is_zero(b)) + goto done; + + /* Compute the discriminant: first 4a^3, then 27b^2, then their sum. */ + if (!BN_mod_sqr(discriminant, a, p, ctx)) + goto err; + if (!BN_mod_mul(discriminant, discriminant, a, p, ctx)) + goto err; + if (!BN_lshift(discriminant, discriminant, 2)) + goto err; + + if (!BN_mod_sqr(b, b, p, ctx)) + goto err; + if (!BN_mul_word(b, 27)) + goto err; + + if (!BN_mod_add(discriminant, discriminant, b, p, ctx)) + goto err; + + if (BN_is_zero(discriminant)) + goto err; + + done: + ret = 1; err: if (ctx != ctx_in) @@ -638,7 +698,7 @@ EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx_in) } if (!EC_POINT_mul(group, point, order, NULL, NULL, ctx)) goto err; - if (EC_POINT_is_at_infinity(group, point) <= 0) { + if (!EC_POINT_is_at_infinity(group, point)) { ECerror(EC_R_INVALID_GROUP_ORDER); goto err; } @@ -655,124 +715,134 @@ EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx_in) } LCRYPTO_ALIAS(EC_GROUP_check); +/* + * Returns -1 on error, 0 if the groups are equal, 1 if they are distinct. + */ int -EC_GROUP_cmp(const EC_GROUP *a, const EC_GROUP *b, BN_CTX *ctx) +EC_GROUP_cmp(const EC_GROUP *group1, const EC_GROUP *group2, BN_CTX *ctx_in) { - int r = 0; - BIGNUM *a1, *a2, *a3, *b1, *b2, *b3; - BN_CTX *ctx_new = NULL; + BN_CTX *ctx = NULL; + BIGNUM *p1, *a1, *b1, *p2, *a2, *b2; + const EC_POINT *generator1, *generator2; + const BIGNUM *order1, *order2, *cofactor1, *cofactor2; + int nid1, nid2; + int cmp = 1; + int ret = -1; - /* compare the field types */ - if (EC_METHOD_get_field_type(EC_GROUP_method_of(a)) != - EC_METHOD_get_field_type(EC_GROUP_method_of(b))) - return 1; - /* compare the curve name (if present in both) */ - if (EC_GROUP_get_curve_name(a) && EC_GROUP_get_curve_name(b) && - EC_GROUP_get_curve_name(a) != EC_GROUP_get_curve_name(b)) - return 1; - - if (!ctx) - ctx_new = ctx = BN_CTX_new(); - if (!ctx) - return -1; + if ((ctx = ctx_in) == NULL) + ctx = BN_CTX_new(); + if (ctx == NULL) + goto err; BN_CTX_start(ctx); + + if (ec_group_get_field_type(group1) != ec_group_get_field_type(group2)) + goto distinct; + if ((nid1 = EC_GROUP_get_curve_name(group1)) != NID_undef && + (nid2 = EC_GROUP_get_curve_name(group2)) != NID_undef) { + if (nid1 != nid2) + goto distinct; + } + + if ((p1 = BN_CTX_get(ctx)) == NULL) + goto err; if ((a1 = BN_CTX_get(ctx)) == NULL) goto err; - if ((a2 = BN_CTX_get(ctx)) == NULL) - goto err; - if ((a3 = BN_CTX_get(ctx)) == NULL) - goto err; if ((b1 = BN_CTX_get(ctx)) == NULL) goto err; - if ((b2 = BN_CTX_get(ctx)) == NULL) + if ((p2 = BN_CTX_get(ctx)) == NULL) goto err; - if ((b3 = BN_CTX_get(ctx)) == NULL) + if ((a2 = BN_CTX_get(ctx)) == NULL) + goto err; + if ((b2 = BN_CTX_get(ctx)) == NULL) goto err; /* - * XXX This approach assumes that the external representation of - * curves over the same field type is the same. + * If we ever support curves in non-Weierstrass form, this check needs + * to be adjusted. The comparison of the generators will fail anyway. */ - if (!a->meth->group_get_curve(a, a1, a2, a3, ctx) || - !b->meth->group_get_curve(b, b1, b2, b3, ctx)) - r = 1; + if (!EC_GROUP_get_curve(group1, p1, a1, b1, ctx)) + goto err; + if (!EC_GROUP_get_curve(group2, p2, a2, b2, ctx)) + goto err; - if (r || BN_cmp(a1, b1) || BN_cmp(a2, b2) || BN_cmp(a3, b3)) - r = 1; + if (BN_cmp(p1, p2) != 0 || BN_cmp(a1, a2) != 0 || BN_cmp(b1, b2) != 0) + goto distinct; - /* XXX EC_POINT_cmp() assumes that the methods are equal */ - if (r || EC_POINT_cmp(a, EC_GROUP_get0_generator(a), - EC_GROUP_get0_generator(b), ctx)) - r = 1; + if ((generator1 = EC_GROUP_get0_generator(group1)) == NULL) + goto err; + if ((generator2 = EC_GROUP_get0_generator(group2)) == NULL) + goto err; - if (!r) { - /* compare the order and cofactor */ - if (!EC_GROUP_get_order(a, a1, ctx) || - !EC_GROUP_get_order(b, b1, ctx) || - !EC_GROUP_get_cofactor(a, a2, ctx) || - !EC_GROUP_get_cofactor(b, b2, ctx)) - goto err; - if (BN_cmp(a1, b1) || BN_cmp(a2, b2)) - r = 1; - } - BN_CTX_end(ctx); - if (ctx_new) - BN_CTX_free(ctx); + /* + * It does not matter whether group1 or group2 is used: both points must + * have a matching method for this to succeed. + */ + if ((cmp = EC_POINT_cmp(group1, generator1, generator2, ctx)) < 0) + goto err; + if (cmp == 1) + goto distinct; + cmp = 1; - return r; + if ((order1 = EC_GROUP_get0_order(group1)) == NULL) + goto err; + if ((order2 = EC_GROUP_get0_order(group2)) == NULL) + goto err; + + if ((cofactor1 = EC_GROUP_get0_cofactor(group1)) == NULL) + goto err; + if ((cofactor2 = EC_GROUP_get0_cofactor(group2)) == NULL) + goto err; + + if (BN_cmp(order1, order2) != 0 || BN_cmp(cofactor1, cofactor2) != 0) + goto distinct; + + /* All parameters match: the groups are equal. */ + cmp = 0; + + distinct: + ret = cmp; err: BN_CTX_end(ctx); - if (ctx_new) + + if (ctx != ctx_in) BN_CTX_free(ctx); - return -1; + + return ret; } LCRYPTO_ALIAS(EC_GROUP_cmp); -/* - * Coordinate blinding for EC_POINT. - * - * The underlying EC_METHOD can optionally implement this function: - * underlying implementations should return 0 on errors, or 1 on success. - * - * This wrapper returns 1 in case the underlying EC_METHOD does not support - * coordinate blinding. - */ -int -ec_point_blind_coordinates(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx) -{ - if (group->meth->blind_coordinates == NULL) - return 1; - - return group->meth->blind_coordinates(group, p, ctx); -} - EC_POINT * EC_POINT_new(const EC_GROUP *group) { - EC_POINT *ret; + EC_POINT *point = NULL; if (group == NULL) { ECerror(ERR_R_PASSED_NULL_PARAMETER); - return NULL; + goto err; } - if (group->meth->point_init == NULL) { - ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); - return NULL; - } - ret = malloc(sizeof *ret); - if (ret == NULL) { - ECerror(ERR_R_MALLOC_FAILURE); - return NULL; - } - ret->meth = group->meth; - if (!ret->meth->point_init(ret)) { - free(ret); - return NULL; + if ((point = calloc(1, sizeof(*point))) == NULL) { + ECerror(ERR_R_MALLOC_FAILURE); + goto err; } - return ret; + + if ((point->X = BN_new()) == NULL) + goto err; + if ((point->Y = BN_new()) == NULL) + goto err; + if ((point->Z = BN_new()) == NULL) + goto err; + + point->meth = group->meth; + + return point; + + err: + EC_POINT_free(point); + + return NULL; } LCRYPTO_ALIAS(EC_POINT_new); @@ -782,8 +852,9 @@ EC_POINT_free(EC_POINT *point) if (point == NULL) return; - if (point->meth->point_finish != NULL) - point->meth->point_finish(point); + BN_free(point->X); + BN_free(point->Y); + BN_free(point->Z); freezero(point, sizeof *point); } @@ -797,40 +868,47 @@ EC_POINT_clear_free(EC_POINT *point) LCRYPTO_ALIAS(EC_POINT_clear_free); int -EC_POINT_copy(EC_POINT *dest, const EC_POINT *src) +EC_POINT_copy(EC_POINT *dst, const EC_POINT *src) { - if (dest->meth->point_copy == NULL) { - ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); - return 0; - } - if (dest->meth != src->meth) { + if (dst->meth != src->meth) { ECerror(EC_R_INCOMPATIBLE_OBJECTS); return 0; } - if (dest == src) + if (dst == src) return 1; - return dest->meth->point_copy(dest, src); + + if (!bn_copy(dst->X, src->X)) + return 0; + if (!bn_copy(dst->Y, src->Y)) + return 0; + if (!bn_copy(dst->Z, src->Z)) + return 0; + dst->Z_is_one = src->Z_is_one; + + return 1; } LCRYPTO_ALIAS(EC_POINT_copy); EC_POINT * -EC_POINT_dup(const EC_POINT *a, const EC_GROUP *group) +EC_POINT_dup(const EC_POINT *in_point, const EC_GROUP *group) { - EC_POINT *t; - int r; + EC_POINT *point = NULL; - if (a == NULL) - return NULL; + if (in_point == NULL) + goto err; - t = EC_POINT_new(group); - if (t == NULL) - return (NULL); - r = EC_POINT_copy(t, a); - if (!r) { - EC_POINT_free(t); - return NULL; - } else - return t; + if ((point = EC_POINT_new(group)) == NULL) + goto err; + + if (!EC_POINT_copy(point, in_point)) + goto err; + + return point; + + err: + EC_POINT_free(point); + + return NULL; } LCRYPTO_ALIAS(EC_POINT_dup); @@ -844,102 +922,18 @@ LCRYPTO_ALIAS(EC_POINT_method_of); int EC_POINT_set_to_infinity(const EC_GROUP *group, EC_POINT *point) { - if (group->meth->point_set_to_infinity == NULL) { - ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); - return 0; - } if (group->meth != point->meth) { ECerror(EC_R_INCOMPATIBLE_OBJECTS); return 0; } - return group->meth->point_set_to_infinity(group, point); + + BN_zero(point->Z); + point->Z_is_one = 0; + + return 1; } LCRYPTO_ALIAS(EC_POINT_set_to_infinity); -int -EC_POINT_set_Jprojective_coordinates(const EC_GROUP *group, EC_POINT *point, - const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *ctx_in) -{ - BN_CTX *ctx; - int ret = 0; - - if ((ctx = ctx_in) == NULL) - ctx = BN_CTX_new(); - if (ctx == NULL) - goto err; - - if (group->meth->point_set_Jprojective_coordinates == NULL) { - ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); - goto err; - } - if (group->meth != point->meth) { - ECerror(EC_R_INCOMPATIBLE_OBJECTS); - goto err; - } - if (!group->meth->point_set_Jprojective_coordinates(group, point, - x, y, z, ctx)) - goto err; - - if (EC_POINT_is_on_curve(group, point, ctx) <= 0) { - ECerror(EC_R_POINT_IS_NOT_ON_CURVE); - goto err; - } - - ret = 1; - - err: - if (ctx != ctx_in) - BN_CTX_free(ctx); - - return ret; -} - -int -EC_POINT_get_Jprojective_coordinates(const EC_GROUP *group, - const EC_POINT *point, BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *ctx_in) -{ - BN_CTX *ctx; - int ret = 0; - - if ((ctx = ctx_in) == NULL) - ctx = BN_CTX_new(); - if (ctx == NULL) - goto err; - - if (group->meth->point_get_Jprojective_coordinates == NULL) { - ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); - goto err; - } - if (group->meth != point->meth) { - ECerror(EC_R_INCOMPATIBLE_OBJECTS); - goto err; - } - ret = group->meth->point_get_Jprojective_coordinates(group, point, - x, y, z, ctx); - - err: - if (ctx != ctx_in) - BN_CTX_free(ctx); - - return ret; -} - -int -EC_POINT_set_Jprojective_coordinates_GFp(const EC_GROUP *group, EC_POINT *point, - const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *ctx) -{ - return EC_POINT_set_Jprojective_coordinates(group, point, x, y, z, ctx); -} -LCRYPTO_ALIAS(EC_POINT_set_Jprojective_coordinates_GFp); - -int -EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *group, - const EC_POINT *point, BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *ctx) -{ - return EC_POINT_get_Jprojective_coordinates(group, point, x, y, z, ctx); -} -LCRYPTO_ALIAS(EC_POINT_get_Jprojective_coordinates_GFp); - int EC_POINT_set_affine_coordinates(const EC_GROUP *group, EC_POINT *point, const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx_in) @@ -990,9 +984,14 @@ int EC_POINT_get_affine_coordinates(const EC_GROUP *group, const EC_POINT *point, BIGNUM *x, BIGNUM *y, BN_CTX *ctx_in) { - BN_CTX *ctx; + BN_CTX *ctx = NULL; int ret = 0; + if (EC_POINT_is_at_infinity(group, point) > 0) { + ECerror(EC_R_POINT_AT_INFINITY); + goto err; + } + if ((ctx = ctx_in) == NULL) ctx = BN_CTX_new(); if (ctx == NULL) @@ -1024,6 +1023,45 @@ EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group, const EC_POINT *point } LCRYPTO_ALIAS(EC_POINT_get_affine_coordinates_GFp); +int +EC_POINT_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *point, + const BIGNUM *x, int y_bit, BN_CTX *ctx_in) +{ + BN_CTX *ctx; + int ret = 0; + + if ((ctx = ctx_in) == NULL) + ctx = BN_CTX_new(); + if (ctx == NULL) + goto err; + + if (group->meth->point_set_compressed_coordinates == NULL) { + ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); + goto err; + } + if (group->meth != point->meth) { + ECerror(EC_R_INCOMPATIBLE_OBJECTS); + goto err; + } + ret = group->meth->point_set_compressed_coordinates(group, point, + x, y_bit, ctx); + + err: + if (ctx != ctx_in) + BN_CTX_free(ctx); + + return ret; +} +LCRYPTO_ALIAS(EC_POINT_set_compressed_coordinates); + +int +EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, EC_POINT *point, + const BIGNUM *x, int y_bit, BN_CTX *ctx) +{ + return EC_POINT_set_compressed_coordinates(group, point, x, y_bit, ctx); +} +LCRYPTO_ALIAS(EC_POINT_set_compressed_coordinates_GFp); + int EC_POINT_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, BN_CTX *ctx_in) @@ -1117,15 +1155,12 @@ LCRYPTO_ALIAS(EC_POINT_invert); int EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *point) { - if (group->meth->is_at_infinity == NULL) { - ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); - return 0; - } if (group->meth != point->meth) { ECerror(EC_R_INCOMPATIBLE_OBJECTS); return 0; } - return group->meth->is_at_infinity(group, point); + + return BN_is_zero(point->Z); } LCRYPTO_ALIAS(EC_POINT_is_at_infinity); @@ -1369,35 +1404,25 @@ EC_GROUP_have_precompute_mult(const EC_GROUP *group) } LCRYPTO_ALIAS(EC_GROUP_have_precompute_mult); +/* + * XXX - remove everything below in the next bump + */ + int -ec_group_simple_order_bits(const EC_GROUP *group) +EC_POINT_set_Jprojective_coordinates_GFp(const EC_GROUP *group, EC_POINT *point, + const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *ctx) { - /* XXX change group->order to a pointer? */ -#if 0 - if (group->order == NULL) - return 0; -#endif - return BN_num_bits(&group->order); + ECerror(ERR_R_DISABLED); + return 0; } +LCRYPTO_ALIAS(EC_POINT_set_Jprojective_coordinates_GFp); -EC_KEY * -ECParameters_dup(EC_KEY *key) +int +EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *group, + const EC_POINT *point, BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *ctx) { - const unsigned char *p; - unsigned char *der = NULL; - EC_KEY *dup = NULL; - int len; - - if (key == NULL) - return NULL; - - if ((len = i2d_ECParameters(key, &der)) <= 0) - return NULL; - - p = der; - dup = d2i_ECParameters(NULL, &p, len); - freezero(der, len); - - return dup; + ECerror(ERR_R_DISABLED); + return 0; } -LCRYPTO_ALIAS(ECParameters_dup); +LCRYPTO_ALIAS(EC_POINT_get_Jprojective_coordinates_GFp); + diff --git a/lib/libcrypto/ec/ec_local.h b/lib/libcrypto/ec/ec_local.h index b837e291f..594990899 100644 --- a/lib/libcrypto/ec/ec_local.h +++ b/lib/libcrypto/ec/ec_local.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ec_local.h,v 1.30 2024/10/18 17:27:07 tb Exp $ */ +/* $OpenBSD: ec_local.h,v 1.54 2025/01/07 08:52:17 tb Exp $ */ /* * Originally written by Bodo Moeller for the OpenSSL project. */ @@ -88,28 +88,11 @@ __BEGIN_HIDDEN_DECLS struct ec_method_st { int field_type; - int (*group_init)(EC_GROUP *); - void (*group_finish)(EC_GROUP *); - int (*group_copy)(EC_GROUP *, const EC_GROUP *); - int (*group_set_curve)(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *); int (*group_get_curve)(const EC_GROUP *, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *); - int (*group_get_degree)(const EC_GROUP *); - int (*group_order_bits)(const EC_GROUP *); - int (*group_check_discriminant)(const EC_GROUP *, BN_CTX *); - - int (*point_init)(EC_POINT *); - void (*point_finish)(EC_POINT *); - int (*point_copy)(EC_POINT *, const EC_POINT *); - - int (*point_set_to_infinity)(const EC_GROUP *, EC_POINT *); - int (*point_set_Jprojective_coordinates)(const EC_GROUP *, EC_POINT *, - const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *); - int (*point_get_Jprojective_coordinates)(const EC_GROUP *, - const EC_POINT *, BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *); int (*point_set_affine_coordinates)(const EC_GROUP *, EC_POINT *, const BIGNUM *x, const BIGNUM *y, BN_CTX *); int (*point_get_affine_coordinates)(const EC_GROUP *, const EC_POINT *, @@ -117,18 +100,11 @@ struct ec_method_st { int (*point_set_compressed_coordinates)(const EC_GROUP *, EC_POINT *, const BIGNUM *x, int y_bit, BN_CTX *); - size_t (*point2oct)(const EC_GROUP *, const EC_POINT *, - point_conversion_form_t form, unsigned char *buf, size_t len, - BN_CTX *); - int (*oct2point)(const EC_GROUP *, EC_POINT *, const unsigned char *buf, - size_t len, BN_CTX *); - int (*add)(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, BN_CTX *); int (*dbl)(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, BN_CTX *); int (*invert)(const EC_GROUP *, EC_POINT *, BN_CTX *); - int (*is_at_infinity)(const EC_GROUP *, const EC_POINT *); int (*is_on_curve)(const EC_GROUP *, const EC_POINT *, BN_CTX *); int (*point_cmp)(const EC_GROUP *, const EC_POINT *a, const EC_POINT *b, BN_CTX *); @@ -145,10 +121,6 @@ struct ec_method_st { const BIGNUM *g_scalar, const BIGNUM *p_scalar, const EC_POINT *point, BN_CTX *); - /* - * Internal methods. - */ - /* * These can be used by 'add' and 'dbl' so that the same implementations * of point operations can be used with different optimized versions of @@ -158,18 +130,12 @@ struct ec_method_st { const BIGNUM *b, BN_CTX *); int (*field_sqr)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *); - int (*field_div)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, - const BIGNUM *b, BN_CTX *); /* Encode to and decode from other forms (e.g. Montgomery). */ int (*field_encode)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *); int (*field_decode)(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *); - - int (*field_set_to_one)(const EC_GROUP *, BIGNUM *r, BN_CTX *); - int (*blind_coordinates)(const EC_GROUP *group, EC_POINT *p, - BN_CTX *ctx); } /* EC_METHOD */; struct ec_group_st { @@ -180,10 +146,10 @@ struct ec_group_st { const EC_METHOD *meth; EC_POINT *generator; /* Optional */ - BIGNUM order; - BIGNUM cofactor; + BIGNUM *order; + BIGNUM *cofactor; - int curve_name; /* Optional NID for named curve. */ + int nid; /* Optional NID for named curve. */ /* ASN.1 encoding controls. */ int asn1_flag; @@ -194,119 +160,50 @@ struct ec_group_st { size_t seed_len; /* - * Internal methods and members. Handled by the method functions, even - * if they appear to be generic. + * Coefficients of the Weierstrass equation y^2 = x^3 + a*x + b (mod p). */ - - /* - * Field specification. For GF(p) this is the modulus; for GF(2^m), - * this is the irreducible polynomial defining the field. - */ - BIGNUM field; - - /* - * Curve coefficients. In characteristic > 3, the curve is defined by a - * Weierstrass equation of the form y^2 = x^3 + a*x + b. - */ - BIGNUM a, b; + BIGNUM *p; + BIGNUM *a; + BIGNUM *b; /* Enables optimized point arithmetics for special case. */ int a_is_minus3; - /* Montgomery context and values used by EC_GFp_mont_method. */ + /* Montgomery context used by EC_GFp_mont_method. */ BN_MONT_CTX *mont_ctx; - BIGNUM *mont_one; } /* EC_GROUP */; -struct ec_key_st { - const EC_KEY_METHOD *meth; - - int version; - - EC_GROUP *group; - - EC_POINT *pub_key; - BIGNUM *priv_key; - - unsigned int enc_flag; - point_conversion_form_t conv_form; - - int references; - int flags; - - CRYPTO_EX_DATA ex_data; -} /* EC_KEY */; - struct ec_point_st { const EC_METHOD *meth; - /* - * All members except 'meth' are handled by the method functions, - * even if they appear generic. - */ - /* * Jacobian projective coordinates: (X, Y, Z) represents (X/Z^2, Y/Z^3) * if Z != 0 */ - BIGNUM X; - BIGNUM Y; - BIGNUM Z; + BIGNUM *X; + BIGNUM *Y; + BIGNUM *Z; int Z_is_one; /* enable optimized point arithmetics for special case */ } /* EC_POINT */; -/* method functions in ec_mult.c - * (ec_lib.c uses these as defaults if group->method->mul is 0) */ -int ec_wNAF_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, - size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *); +/* Compute r = generator * m + point * n in non-constant time. */ +int ec_wnaf_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *m, + const EC_POINT *point, const BIGNUM *n, BN_CTX *ctx); -/* method functions in ecp_smpl.c */ -int ec_GFp_simple_group_init(EC_GROUP *); -void ec_GFp_simple_group_finish(EC_GROUP *); -int ec_GFp_simple_group_copy(EC_GROUP *, const EC_GROUP *); -int ec_GFp_simple_group_set_curve(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *); -int ec_GFp_simple_group_get_curve(const EC_GROUP *, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *); -int ec_GFp_simple_group_get_degree(const EC_GROUP *); -int ec_GFp_simple_group_check_discriminant(const EC_GROUP *, BN_CTX *); -int ec_GFp_simple_point_init(EC_POINT *); -void ec_GFp_simple_point_finish(EC_POINT *); -int ec_GFp_simple_point_copy(EC_POINT *, const EC_POINT *); -int ec_GFp_simple_point_set_to_infinity(const EC_GROUP *, EC_POINT *); -int ec_GFp_simple_set_Jprojective_coordinates(const EC_GROUP *, EC_POINT *, - const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *); -int ec_GFp_simple_get_Jprojective_coordinates(const EC_GROUP *, - const EC_POINT *, BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *); -int ec_GFp_simple_point_set_affine_coordinates(const EC_GROUP *, EC_POINT *, - const BIGNUM *x, const BIGNUM *y, BN_CTX *); -int ec_GFp_simple_point_get_affine_coordinates(const EC_GROUP *, const EC_POINT *, - BIGNUM *x, BIGNUM *y, BN_CTX *); -int ec_GFp_simple_set_compressed_coordinates(const EC_GROUP *, EC_POINT *, - const BIGNUM *x, int y_bit, BN_CTX *); -size_t ec_GFp_simple_point2oct(const EC_GROUP *, const EC_POINT *, point_conversion_form_t form, - unsigned char *buf, size_t len, BN_CTX *); -int ec_GFp_simple_oct2point(const EC_GROUP *, EC_POINT *, - const unsigned char *buf, size_t len, BN_CTX *); -int ec_GFp_simple_add(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, BN_CTX *); -int ec_GFp_simple_dbl(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, BN_CTX *); -int ec_GFp_simple_invert(const EC_GROUP *, EC_POINT *, BN_CTX *); -int ec_GFp_simple_is_at_infinity(const EC_GROUP *, const EC_POINT *); -int ec_GFp_simple_is_on_curve(const EC_GROUP *, const EC_POINT *, BN_CTX *); -int ec_GFp_simple_cmp(const EC_GROUP *, const EC_POINT *a, const EC_POINT *b, BN_CTX *); -int ec_GFp_simple_make_affine(const EC_GROUP *, EC_POINT *, BN_CTX *); -int ec_GFp_simple_points_make_affine(const EC_GROUP *, size_t num, EC_POINT *[], BN_CTX *); -int ec_GFp_simple_field_mul(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *); -int ec_GFp_simple_field_sqr(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *); -int ec_GFp_simple_blind_coordinates(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx); -int ec_GFp_simple_mul_generator_ct(const EC_GROUP *, EC_POINT *r, const BIGNUM *scalar, BN_CTX *); -int ec_GFp_simple_mul_single_ct(const EC_GROUP *, EC_POINT *r, const BIGNUM *scalar, - const EC_POINT *point, BN_CTX *); -int ec_GFp_simple_mul_double_nonct(const EC_GROUP *, EC_POINT *r, const BIGNUM *g_scalar, - const BIGNUM *p_scalar, const EC_POINT *point, BN_CTX *); +int ec_group_is_builtin_curve(const EC_GROUP *group, int *out_nid); +int ec_group_get_field_type(const EC_GROUP *group); -int ec_group_simple_order_bits(const EC_GROUP *group); -int ec_point_blind_coordinates(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx); +/* + * Wrappers around the unergonomic EC_POINT_{oct2point,point2oct}(). + */ +int ec_point_from_octets(const EC_GROUP *group, const unsigned char *buf, + size_t buf_len, EC_POINT **out_point, uint8_t *out_form, BN_CTX *ctx_in); +int ec_point_to_octets(const EC_GROUP *group, const EC_POINT *point, int form, + unsigned char **out_buf, size_t *len, BN_CTX *ctx_in); -/* EC_METHOD definitions */ +/* Public API in OpenSSL */ +const BIGNUM *EC_GROUP_get0_cofactor(const EC_GROUP *group); +const BIGNUM *EC_GROUP_get0_order(const EC_GROUP *group); struct ec_key_method_st { const char *name; @@ -336,6 +233,26 @@ struct ec_key_method_st { #define EC_KEY_METHOD_DYNAMIC 1 +struct ec_key_st { + const EC_KEY_METHOD *meth; + + int version; + + EC_GROUP *group; + + EC_POINT *pub_key; + BIGNUM *priv_key; + + unsigned int enc_flag; + point_conversion_form_t conv_form; + + int references; + int flags; + + CRYPTO_EX_DATA ex_data; +} /* EC_KEY */; + +int eckey_compute_pubkey(EC_KEY *eckey); int ec_key_gen(EC_KEY *eckey); int ecdh_compute_key(unsigned char **out, size_t *out_len, const EC_POINT *pub_key, const EC_KEY *ecdh); @@ -350,15 +267,4 @@ int ecdsa_verify_sig(const unsigned char *dgst, int dgst_len, int ecdh_KDF_X9_63(unsigned char *out, size_t outlen, const unsigned char *Z, size_t Zlen, const unsigned char *sinfo, size_t sinfolen, const EVP_MD *md); -int EC_POINT_set_Jprojective_coordinates(const EC_GROUP *group, EC_POINT *p, - const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *ctx); -int EC_POINT_get_Jprojective_coordinates(const EC_GROUP *group, - const EC_POINT *p, BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *ctx); - -int ec_group_is_builtin_curve(const EC_GROUP *group); - -/* Public API in OpenSSL */ -const BIGNUM *EC_GROUP_get0_cofactor(const EC_GROUP *group); -const BIGNUM *EC_GROUP_get0_order(const EC_GROUP *group); - __END_HIDDEN_DECLS diff --git a/lib/libcrypto/ec/ec_mult.c b/lib/libcrypto/ec/ec_mult.c index a0e97437b..d11086de6 100644 --- a/lib/libcrypto/ec/ec_mult.c +++ b/lib/libcrypto/ec/ec_mult.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ec_mult.c,v 1.31 2023/06/24 17:49:44 jsing Exp $ */ +/* $OpenBSD: ec_mult.c,v 1.56 2024/12/19 21:05:46 tb Exp $ */ /* * Originally written by Bodo Moeller and Nils Larsch for the OpenSSL project. */ @@ -61,390 +61,351 @@ * and contributed to the OpenSSL project. */ +#include +#include #include +#include +#include #include #include "ec_local.h" -/* - * This file implements the wNAF-based interleaving multi-exponentation method - * (); - * for multiplication with precomputation, we use wNAF splitting - * (). - */ +/* Holds the wNAF digits of bn and the corresponding odd multiples of point. */ +struct ec_wnaf { + signed char *digits; + size_t num_digits; + EC_POINT **multiples; + size_t num_multiples; +}; -/* Determine the modified width-(w+1) Non-Adjacent Form (wNAF) of 'scalar'. - * This is an array r[] of values that are either zero or odd with an - * absolute value less than 2^w satisfying - * scalar = \sum_j r[j]*2^j - * where at most one of any w+1 consecutive digits is non-zero - * with the exception that the most significant digit may be only - * w-1 zeros away from that next non-zero digit. - */ -static signed char * -compute_wNAF(const BIGNUM *scalar, int w, size_t *ret_len) +static int +ec_window_bits(const BIGNUM *bn) { - int window_val; - int ok = 0; - signed char *r = NULL; - int sign = 1; - int bit, next_bit, mask; - size_t len = 0, j; + int bits = BN_num_bits(bn); - if (BN_is_zero(scalar)) { - r = malloc(1); - if (!r) { - ECerror(ERR_R_MALLOC_FAILURE); - goto err; - } - r[0] = 0; - *ret_len = 1; - return r; - } - if (w <= 0 || w > 7) { - /* 'signed char' can represent integers with - * absolute values less than 2^7 */ - ECerror(ERR_R_INTERNAL_ERROR); - goto err; - } - bit = 1 << w; /* at most 128 */ - next_bit = bit << 1; /* at most 256 */ - mask = next_bit - 1; /* at most 255 */ + if (bits >= 2000) + return 6; + if (bits >= 800) + return 5; + if (bits >= 300) + return 4; + if (bits >= 70) + return 3; + if (bits >= 20) + return 2; - if (BN_is_negative(scalar)) { - sign = -1; - } - if (scalar->d == NULL || scalar->top == 0) { - ECerror(ERR_R_INTERNAL_ERROR); - goto err; - } - len = BN_num_bits(scalar); - r = malloc(len + 1); /* modified wNAF may be one digit longer than - * binary representation (*ret_len will be - * set to the actual length, i.e. at most - * BN_num_bits(scalar) + 1) */ - if (r == NULL) { - ECerror(ERR_R_MALLOC_FAILURE); - goto err; - } - window_val = scalar->d[0] & mask; - j = 0; - while ((window_val != 0) || (j + w + 1 < len)) { - /* if j+w+1 >= len, window_val will not increase */ - int digit = 0; - - /* 0 <= window_val <= 2^(w+1) */ - if (window_val & 1) { - /* 0 < window_val < 2^(w+1) */ - if (window_val & bit) { - digit = window_val - next_bit; /* -2^w < digit < 0 */ - -#if 1 /* modified wNAF */ - if (j + w + 1 >= len) { - /* - * special case for generating - * modified wNAFs: no new bits will - * be added into window_val, so using - * a positive digit here will - * decrease the total length of the - * representation - */ - - digit = window_val & (mask >> 1); /* 0 < digit < 2^w */ - } -#endif - } else { - digit = window_val; /* 0 < digit < 2^w */ - } - - if (digit <= -bit || digit >= bit || !(digit & 1)) { - ECerror(ERR_R_INTERNAL_ERROR); - goto err; - } - window_val -= digit; - - /* - * now window_val is 0 or 2^(w+1) in standard wNAF - * generation; for modified window NAFs, it may also - * be 2^w - */ - if (window_val != 0 && window_val != next_bit && window_val != bit) { - ECerror(ERR_R_INTERNAL_ERROR); - goto err; - } - } - r[j++] = sign * digit; - - window_val >>= 1; - window_val += bit * BN_is_bit_set(scalar, j + w); - - if (window_val > next_bit) { - ECerror(ERR_R_INTERNAL_ERROR); - goto err; - } - } - - if (j > len + 1) { - ECerror(ERR_R_INTERNAL_ERROR); - goto err; - } - len = j; - ok = 1; - - err: - if (!ok) { - free(r); - r = NULL; - } - if (ok) - *ret_len = len; - return r; + return 1; } - -/* TODO: table should be optimised for the wNAF-based implementation, - * sometimes smaller windows will give better performance - * (thus the boundaries should be increased) +/* + * Width-(w+1) non-adjacent form of bn = \sum_j n_j 2^j, with odd n_j, + * where at most one of any (w+1) consecutive digits is non-zero. */ -#define EC_window_bits_for_scalar_size(b) \ - ((size_t) \ - ((b) >= 2000 ? 6 : \ - (b) >= 800 ? 5 : \ - (b) >= 300 ? 4 : \ - (b) >= 70 ? 3 : \ - (b) >= 20 ? 2 : \ - 1)) -/* Compute - * \sum scalars[i]*points[i], - * also including - * scalar*generator - * in the addition if scalar != NULL - */ -int -ec_wNAF_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, - size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *ctx) +static int +ec_compute_wnaf(const BIGNUM *bn, signed char *digits, size_t num_digits) { - const EC_POINT *generator = NULL; - EC_POINT *tmp = NULL; - size_t totalnum; - size_t numblocks = 0; /* for wNAF splitting */ - size_t i, j; - int k; - int r_is_inverted = 0; - int r_is_at_infinity = 1; - size_t *wsize = NULL; /* individual window sizes */ - signed char **wNAF = NULL; /* individual wNAFs */ - signed char *tmp_wNAF = NULL; - size_t *wNAF_len = NULL; - size_t max_len = 0; - size_t num_val; - EC_POINT **val = NULL; /* precomputation */ - EC_POINT **v; - EC_POINT ***val_sub = NULL; /* pointers to sub-arrays of 'val' or - * 'pre_comp->points' */ - int num_scalar = 0; /* flag: will be set to 1 if 'scalar' must be - * treated like other scalars, i.e. - * precomputation is not available */ + int digit, bit, next, sign, wbits, window; + size_t i; int ret = 0; - if (group->meth != r->meth) { - ECerror(EC_R_INCOMPATIBLE_OBJECTS); - return 0; - } - if ((scalar == NULL) && (num == 0)) { - return EC_POINT_set_to_infinity(group, r); - } - for (i = 0; i < num; i++) { - if (group->meth != points[i]->meth) { - ECerror(EC_R_INCOMPATIBLE_OBJECTS); - return 0; - } - } - - if (scalar != NULL) { - generator = EC_GROUP_get0_generator(group); - if (generator == NULL) { - ECerror(EC_R_UNDEFINED_GENERATOR); - goto err; - } - - numblocks = 1; - num_scalar = 1; /* treat 'scalar' like 'num'-th - * element of 'scalars' */ - } - totalnum = num + numblocks; - - /* includes space for pivot */ - wNAF = reallocarray(NULL, (totalnum + 1), sizeof wNAF[0]); - if (wNAF == NULL) { - ECerror(ERR_R_MALLOC_FAILURE); - goto err; - } - - wNAF[0] = NULL; /* preliminary pivot */ - - wsize = reallocarray(NULL, totalnum, sizeof wsize[0]); - wNAF_len = reallocarray(NULL, totalnum, sizeof wNAF_len[0]); - val_sub = reallocarray(NULL, totalnum, sizeof val_sub[0]); - - if (wsize == NULL || wNAF_len == NULL || val_sub == NULL) { - ECerror(ERR_R_MALLOC_FAILURE); - goto err; - } - - /* num_val will be the total number of temporarily precomputed points */ - num_val = 0; - - for (i = 0; i < num + num_scalar; i++) { - size_t bits; - - bits = i < num ? BN_num_bits(scalars[i]) : BN_num_bits(scalar); - wsize[i] = EC_window_bits_for_scalar_size(bits); - num_val += (size_t) 1 << (wsize[i] - 1); - wNAF[i + 1] = NULL; /* make sure we always have a pivot */ - wNAF[i] = compute_wNAF((i < num ? scalars[i] : scalar), wsize[i], &wNAF_len[i]); - if (wNAF[i] == NULL) - goto err; - if (wNAF_len[i] > max_len) - max_len = wNAF_len[i]; - } - - if (numblocks) { - /* we go here iff scalar != NULL */ - - if (num_scalar != 1) { - ECerror(ERR_R_INTERNAL_ERROR); - goto err; - } - } - /* - * All points we precompute now go into a single array 'val'. - * 'val_sub[i]' is a pointer to the subarray for the i-th point, or - * to a subarray of 'pre_comp->points' if we already have - * precomputation. - */ - val = reallocarray(NULL, (num_val + 1), sizeof val[0]); - if (val == NULL) { - ECerror(ERR_R_MALLOC_FAILURE); - goto err; - } - val[num_val] = NULL; /* pivot element */ - - /* allocate points for precomputation */ - v = val; - for (i = 0; i < num + num_scalar; i++) { - val_sub[i] = v; - for (j = 0; j < ((size_t) 1 << (wsize[i] - 1)); j++) { - *v = EC_POINT_new(group); - if (*v == NULL) - goto err; - v++; - } - } - if (!(v == val + num_val)) { + if (num_digits != BN_num_bits(bn) + 1) { ECerror(ERR_R_INTERNAL_ERROR); goto err; } - if (!(tmp = EC_POINT_new(group))) - goto err; - /* - * prepare precomputed values: val_sub[i][0] := points[i] - * val_sub[i][1] := 3 * points[i] val_sub[i][2] := 5 * points[i] ... - */ - for (i = 0; i < num + num_scalar; i++) { - if (i < num) { - if (!EC_POINT_copy(val_sub[i][0], points[i])) - goto err; - } else { - if (!EC_POINT_copy(val_sub[i][0], generator)) - goto err; - } + sign = BN_is_negative(bn) ? -1 : 1; - if (wsize[i] > 1) { - if (!EC_POINT_dbl(group, tmp, val_sub[i][0], ctx)) - goto err; - for (j = 1; j < ((size_t) 1 << (wsize[i] - 1)); j++) { - if (!EC_POINT_add(group, val_sub[i][j], val_sub[i][j - 1], tmp, ctx)) - goto err; - } - } + wbits = ec_window_bits(bn); + + bit = 1 << wbits; + next = bit << 1; + + /* Extract the wbits + 1 lowest bits from bn into window. */ + window = 0; + for (i = 0; i < wbits + 1; i++) { + if (BN_is_bit_set(bn, i)) + window |= (1 << i); } - if (!EC_POINTs_make_affine(group, num_val, val, ctx)) - goto err; + /* Instead of bn >>= 1 in each iteration, slide window to the left. */ + for (i = 0; i < num_digits; i++) { + digit = 0; - r_is_at_infinity = 1; - - for (k = max_len - 1; k >= 0; k--) { - if (!r_is_at_infinity) { - if (!EC_POINT_dbl(group, r, r, ctx)) - goto err; + /* + * If window is odd, the i-th wNAF digit is window (mods 2^w), + * where mods is the signed modulo in (-2^w-1, 2^w-1]. Subtract + * the digit from window, so window is 0 or next, and add the + * digit to the wNAF digits. + */ + if ((window & 1) != 0) { + digit = window; + if ((window & bit) != 0) + digit = window - next; + window -= digit; } - for (i = 0; i < totalnum; i++) { - if (wNAF_len[i] > (size_t) k) { - int digit = wNAF[i][k]; - int is_neg; - if (digit) { - is_neg = digit < 0; + digits[i] = sign * digit; - if (is_neg) - digit = -digit; - - if (is_neg != r_is_inverted) { - if (!r_is_at_infinity) { - if (!EC_POINT_invert(group, r, ctx)) - goto err; - } - r_is_inverted = !r_is_inverted; - } - /* digit > 0 */ - - if (r_is_at_infinity) { - if (!EC_POINT_copy(r, val_sub[i][digit >> 1])) - goto err; - r_is_at_infinity = 0; - } else { - if (!EC_POINT_add(group, r, r, val_sub[i][digit >> 1], ctx)) - goto err; - } - } - } - } - } - - if (r_is_at_infinity) { - if (!EC_POINT_set_to_infinity(group, r)) - goto err; - } else { - if (r_is_inverted) - if (!EC_POINT_invert(group, r, ctx)) - goto err; + /* Slide the window to the left. */ + window >>= 1; + window += bit * BN_is_bit_set(bn, i + wbits + 1); } ret = 1; err: - EC_POINT_free(tmp); - free(wsize); - free(wNAF_len); - free(tmp_wNAF); - if (wNAF != NULL) { - signed char **w; - - for (w = wNAF; *w != NULL; w++) - free(*w); - - free(wNAF); - } - if (val != NULL) { - for (v = val; *v != NULL; v++) - EC_POINT_free(*v); - free(val); - } - free(val_sub); + return ret; +} + +static int +ec_compute_odd_multiples(const EC_GROUP *group, const EC_POINT *point, + EC_POINT **multiples, size_t num_multiples, BN_CTX *ctx) +{ + EC_POINT *doubled = NULL; + size_t i; + int ret = 0; + + if (num_multiples < 1) + goto err; + + if ((multiples[0] = EC_POINT_dup(point, group)) == NULL) + goto err; + + if ((doubled = EC_POINT_new(group)) == NULL) + goto err; + if (!EC_POINT_dbl(group, doubled, point, ctx)) + goto err; + for (i = 1; i < num_multiples; i++) { + if ((multiples[i] = EC_POINT_new(group)) == NULL) + goto err; + if (!EC_POINT_add(group, multiples[i], multiples[i - 1], doubled, + ctx)) + goto err; + } + + ret = 1; + + err: + EC_POINT_free(doubled); + + return ret; +} + +/* + * Bring multiples held in wnaf0 and wnaf1 simultaneously into affine form + * so that the operations in the loop in ec_wnaf_mul() can take fast paths. + */ + +static int +ec_normalize_points(const EC_GROUP *group, struct ec_wnaf *wnaf0, + struct ec_wnaf *wnaf1, BN_CTX *ctx) +{ + EC_POINT **points0 = wnaf0->multiples, **points1 = wnaf1->multiples; + size_t len0 = wnaf0->num_multiples, len1 = wnaf1->num_multiples; + EC_POINT **val = NULL; + size_t len = 0; + int ret = 0; + + if (len1 > SIZE_MAX - len0) + goto err; + len = len0 + len1; + + if ((val = calloc(len, sizeof(*val))) == NULL) { + ECerror(ERR_R_MALLOC_FAILURE); + goto err; + } + memcpy(&val[0], points0, sizeof(*val) * len0); + memcpy(&val[len0], points1, sizeof(*val) * len1); + + if (!EC_POINTs_make_affine(group, len, val, ctx)) + goto err; + + ret = 1; + + err: + free(val); + + return ret; +} + +static void +ec_points_free(EC_POINT **points, size_t num_points) +{ + size_t i; + + if (points == NULL) + return; + + for (i = 0; i < num_points; i++) + EC_POINT_free(points[i]); + free(points); +} + +static void +ec_wnaf_free(struct ec_wnaf *wnaf) +{ + if (wnaf == NULL) + return; + + free(wnaf->digits); + ec_points_free(wnaf->multiples, wnaf->num_multiples); + free(wnaf); +} + +/* + * Calculate wNAF splitting of bn and the corresponding odd multiples of point. + */ + +static struct ec_wnaf * +ec_wnaf_new(const EC_GROUP *group, const EC_POINT *point, const BIGNUM *bn, + BN_CTX *ctx) +{ + struct ec_wnaf *wnaf; + + if ((wnaf = calloc(1, sizeof(*wnaf))) == NULL) + goto err; + + wnaf->num_digits = BN_num_bits(bn) + 1; + if ((wnaf->digits = calloc(wnaf->num_digits, + sizeof(*wnaf->digits))) == NULL) + goto err; + + if (!ec_compute_wnaf(bn, wnaf->digits, wnaf->num_digits)) + goto err; + + wnaf->num_multiples = 1ULL << (ec_window_bits(bn) - 1); + if ((wnaf->multiples = calloc(wnaf->num_multiples, + sizeof(*wnaf->multiples))) == NULL) + goto err; + + if (!ec_compute_odd_multiples(group, point, wnaf->multiples, + wnaf->num_multiples, ctx)) + goto err; + + return wnaf; + + err: + ec_wnaf_free(wnaf); + + return NULL; +} + +static signed char +ec_wnaf_digit(struct ec_wnaf *wnaf, size_t idx) +{ + if (idx >= wnaf->num_digits) + return 0; + + return wnaf->digits[idx]; +} + +static const EC_POINT * +ec_wnaf_multiple(struct ec_wnaf *wnaf, signed char digit) +{ + if (digit < 0) + return NULL; + if (digit >= 2 * wnaf->num_multiples) + return NULL; + + return wnaf->multiples[digit >> 1]; +} + +/* + * Compute r = generator * m + point * n in non-constant time. + */ + +int +ec_wnaf_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *m, + const EC_POINT *point, const BIGNUM *n, BN_CTX *ctx) +{ + struct ec_wnaf *wnaf[2] = { NULL, NULL }; + const EC_POINT *generator; + size_t i; + int k; + int r_is_inverted = 0; + size_t num_digits; + int ret = 0; + + if (m == NULL || n == NULL) { + ECerror(ERR_R_PASSED_NULL_PARAMETER); + goto err; + } + if (group->meth != r->meth || group->meth != point->meth) { + ECerror(EC_R_INCOMPATIBLE_OBJECTS); + goto err; + } + + if ((generator = EC_GROUP_get0_generator(group)) == NULL) { + ECerror(EC_R_UNDEFINED_GENERATOR); + goto err; + } + + if ((wnaf[0] = ec_wnaf_new(group, generator, m, ctx)) == NULL) + goto err; + if ((wnaf[1] = ec_wnaf_new(group, point, n, ctx)) == NULL) + goto err; + + if (!ec_normalize_points(group, wnaf[0], wnaf[1], ctx)) + goto err; + + num_digits = wnaf[0]->num_digits; + if (wnaf[1]->num_digits > num_digits) + num_digits = wnaf[1]->num_digits; + + /* + * Set r to the neutral element. Scan through the wNAF representations + * of m and n, starting at the most significant digit. Double r and for + * each wNAF digit of m add the digit times the generator, and for each + * wNAF digit of n add the digit times the point, adjusting the signs + * as appropriate. + */ + + if (!EC_POINT_set_to_infinity(group, r)) + goto err; + + for (k = num_digits - 1; k >= 0; k--) { + if (!EC_POINT_dbl(group, r, r, ctx)) + goto err; + + for (i = 0; i < 2; i++) { + const EC_POINT *multiple; + signed char digit; + int is_neg = 0; + + if ((digit = ec_wnaf_digit(wnaf[i], k)) == 0) + continue; + + if (digit < 0) { + is_neg = 1; + digit = -digit; + } + + if (is_neg != r_is_inverted) { + if (!EC_POINT_invert(group, r, ctx)) + goto err; + r_is_inverted = !r_is_inverted; + } + + if ((multiple = ec_wnaf_multiple(wnaf[i], digit)) == NULL) + goto err; + + if (!EC_POINT_add(group, r, r, multiple, ctx)) + goto err; + } + } + + if (r_is_inverted) { + if (!EC_POINT_invert(group, r, ctx)) + goto err; + } + + ret = 1; + + err: + ec_wnaf_free(wnaf[0]); + ec_wnaf_free(wnaf[1]); + return ret; } diff --git a/lib/libcrypto/ec/ec_oct.c b/lib/libcrypto/ec/ec_oct.c deleted file mode 100644 index 824986650..000000000 --- a/lib/libcrypto/ec/ec_oct.c +++ /dev/null @@ -1,171 +0,0 @@ -/* $OpenBSD: ec_oct.c,v 1.17 2024/04/10 15:01:31 beck Exp $ */ -/* - * Originally written by Bodo Moeller for the OpenSSL project. - */ -/* ==================================================================== - * Copyright (c) 1998-2003 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ -/* ==================================================================== - * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. - * Binary polynomial ECC support in OpenSSL originally developed by - * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. - */ - -#include - -#include - -#include -#include - -#include "ec_local.h" - -int -EC_POINT_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *point, - const BIGNUM *x, int y_bit, BN_CTX *ctx_in) -{ - BN_CTX *ctx; - int ret = 0; - - if ((ctx = ctx_in) == NULL) - ctx = BN_CTX_new(); - if (ctx == NULL) - goto err; - - if (group->meth->point_set_compressed_coordinates == NULL) { - ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); - goto err; - } - if (group->meth != point->meth) { - ECerror(EC_R_INCOMPATIBLE_OBJECTS); - goto err; - } - ret = group->meth->point_set_compressed_coordinates(group, point, - x, y_bit, ctx); - - err: - if (ctx != ctx_in) - BN_CTX_free(ctx); - - return ret; -} -LCRYPTO_ALIAS(EC_POINT_set_compressed_coordinates); - -int -EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, EC_POINT *point, - const BIGNUM *x, int y_bit, BN_CTX *ctx) -{ - return EC_POINT_set_compressed_coordinates(group, point, x, y_bit, ctx); -} -LCRYPTO_ALIAS(EC_POINT_set_compressed_coordinates_GFp); - -size_t -EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point, - point_conversion_form_t form, unsigned char *buf, size_t len, - BN_CTX *ctx_in) -{ - BN_CTX *ctx; - size_t ret = 0; - - if ((ctx = ctx_in) == NULL) - ctx = BN_CTX_new(); - if (ctx == NULL) - goto err; - - if (group->meth->point2oct == NULL) { - ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); - goto err; - } - if (group->meth != point->meth) { - ECerror(EC_R_INCOMPATIBLE_OBJECTS); - goto err; - } - ret = group->meth->point2oct(group, point, form, buf, len, ctx); - - err: - if (ctx != ctx_in) - BN_CTX_free(ctx); - - return ret; -} -LCRYPTO_ALIAS(EC_POINT_point2oct); - -int -EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *point, - const unsigned char *buf, size_t len, BN_CTX *ctx_in) -{ - BN_CTX *ctx; - int ret = 0; - - if ((ctx = ctx_in) == NULL) - ctx = BN_CTX_new(); - if (ctx == NULL) - goto err; - - if (group->meth->oct2point == NULL) { - ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); - goto err; - } - if (group->meth != point->meth) { - ECerror(EC_R_INCOMPATIBLE_OBJECTS); - goto err; - } - ret = group->meth->oct2point(group, point, buf, len, ctx); - - err: - if (ctx != ctx_in) - BN_CTX_free(ctx); - - return ret; -} -LCRYPTO_ALIAS(EC_POINT_oct2point); diff --git a/lib/libcrypto/ec/ec_pmeth.c b/lib/libcrypto/ec/ec_pmeth.c index 424d1896b..6d74a7f8a 100644 --- a/lib/libcrypto/ec/ec_pmeth.c +++ b/lib/libcrypto/ec/ec_pmeth.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ec_pmeth.c,v 1.23 2024/10/19 14:41:03 tb Exp $ */ +/* $OpenBSD: ec_pmeth.c,v 1.24 2025/01/05 16:07:08 tb Exp $ */ /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project 2006. */ @@ -323,7 +323,7 @@ pkey_ec_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) if (!ec_key->group) return -2; /* If cofactor is 1 cofactor mode does nothing */ - if (BN_is_one(&ec_key->group->cofactor)) + if (BN_is_one(ec_key->group->cofactor)) return 1; if (!dctx->co_key) { dctx->co_key = EC_KEY_dup(ec_key); diff --git a/lib/libcrypto/ec/ec_print.c b/lib/libcrypto/ec/ec_print.c deleted file mode 100644 index fcd157049..000000000 --- a/lib/libcrypto/ec/ec_print.c +++ /dev/null @@ -1,181 +0,0 @@ -/* $OpenBSD: ec_print.c,v 1.14 2023/11/21 22:17:15 tb Exp $ */ -/* ==================================================================== - * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ - -#include -#include "ec_local.h" - -BIGNUM * -EC_POINT_point2bn(const EC_GROUP *group, const EC_POINT *point, - point_conversion_form_t form, BIGNUM *ret, BN_CTX *ctx) -{ - size_t buf_len = 0; - unsigned char *buf; - - buf_len = EC_POINT_point2oct(group, point, form, NULL, 0, ctx); - if (buf_len == 0) - return NULL; - - if ((buf = malloc(buf_len)) == NULL) - return NULL; - - if (!EC_POINT_point2oct(group, point, form, buf, buf_len, ctx)) { - free(buf); - return NULL; - } - ret = BN_bin2bn(buf, buf_len, ret); - - free(buf); - - return ret; -} -LCRYPTO_ALIAS(EC_POINT_point2bn); - -EC_POINT * -EC_POINT_bn2point(const EC_GROUP *group, - const BIGNUM *bn, EC_POINT *point, BN_CTX *ctx) -{ - size_t buf_len = 0; - unsigned char *buf; - EC_POINT *ret; - - if ((buf_len = BN_num_bytes(bn)) == 0) - return NULL; - buf = malloc(buf_len); - if (buf == NULL) - return NULL; - - if (!BN_bn2bin(bn, buf)) { - free(buf); - return NULL; - } - if (point == NULL) { - if ((ret = EC_POINT_new(group)) == NULL) { - free(buf); - return NULL; - } - } else - ret = point; - - if (!EC_POINT_oct2point(group, ret, buf, buf_len, ctx)) { - if (point == NULL) - EC_POINT_free(ret); - free(buf); - return NULL; - } - free(buf); - return ret; -} -LCRYPTO_ALIAS(EC_POINT_bn2point); - -static const char *HEX_DIGITS = "0123456789ABCDEF"; - -/* the return value must be freed (using free()) */ -char * -EC_POINT_point2hex(const EC_GROUP *group, const EC_POINT *point, - point_conversion_form_t form, BN_CTX *ctx) -{ - char *ret, *p; - size_t buf_len = 0, i; - unsigned char *buf, *pbuf; - - buf_len = EC_POINT_point2oct(group, point, form, - NULL, 0, ctx); - if (buf_len == 0 || buf_len + 1 == 0) - return NULL; - - if ((buf = malloc(buf_len)) == NULL) - return NULL; - - if (!EC_POINT_point2oct(group, point, form, buf, buf_len, ctx)) { - free(buf); - return NULL; - } - ret = reallocarray(NULL, buf_len + 1, 2); - if (ret == NULL) { - free(buf); - return NULL; - } - p = ret; - pbuf = buf; - for (i = buf_len; i > 0; i--) { - int v = (int) *(pbuf++); - *(p++) = HEX_DIGITS[v >> 4]; - *(p++) = HEX_DIGITS[v & 0x0F]; - } - *p = '\0'; - - free(buf); - - return ret; -} -LCRYPTO_ALIAS(EC_POINT_point2hex); - -EC_POINT * -EC_POINT_hex2point(const EC_GROUP *group, const char *buf, - EC_POINT *point, BN_CTX *ctx) -{ - EC_POINT *ret = NULL; - BIGNUM *tmp_bn = NULL; - - if (BN_hex2bn(&tmp_bn, buf) == 0) - return NULL; - - ret = EC_POINT_bn2point(group, tmp_bn, point, ctx); - - BN_free(tmp_bn); - - return ret; -} -LCRYPTO_ALIAS(EC_POINT_hex2point); diff --git a/lib/libcrypto/ec/eck_prn.c b/lib/libcrypto/ec/eck_prn.c index 2798d53d0..98e1a7e7b 100644 --- a/lib/libcrypto/ec/eck_prn.c +++ b/lib/libcrypto/ec/eck_prn.c @@ -1,4 +1,4 @@ -/* $OpenBSD: eck_prn.c,v 1.30 2023/11/21 22:05:33 tb Exp $ */ +/* $OpenBSD: eck_prn.c,v 1.40 2024/11/25 06:51:39 tb Exp $ */ /* * Written by Nils Larsch for the OpenSSL project. */ @@ -62,112 +62,109 @@ */ #include -#include +#include #include #include #include #include +#include +#include "bn_local.h" #include "ec_local.h" int -ECPKParameters_print_fp(FILE *fp, const EC_GROUP *x, int off) +EC_KEY_print(BIO *bio, const EC_KEY *ec_key, int off) { - BIO *b; - int ret; - - if ((b = BIO_new(BIO_s_file())) == NULL) { - ECerror(ERR_R_BUF_LIB); - return (0); - } - BIO_set_fp(b, fp, BIO_NOCLOSE); - ret = ECPKParameters_print(b, x, off); - BIO_free(b); - return (ret); -} -LCRYPTO_ALIAS(ECPKParameters_print_fp); - -int -EC_KEY_print_fp(FILE *fp, const EC_KEY *x, int off) -{ - BIO *b; - int ret; - - if ((b = BIO_new(BIO_s_file())) == NULL) { - ECerror(ERR_R_BIO_LIB); - return (0); - } - BIO_set_fp(b, fp, BIO_NOCLOSE); - ret = EC_KEY_print(b, x, off); - BIO_free(b); - return (ret); -} -LCRYPTO_ALIAS(EC_KEY_print_fp); - -int -ECParameters_print_fp(FILE *fp, const EC_KEY *x) -{ - BIO *b; - int ret; - - if ((b = BIO_new(BIO_s_file())) == NULL) { - ECerror(ERR_R_BIO_LIB); - return (0); - } - BIO_set_fp(b, fp, BIO_NOCLOSE); - ret = ECParameters_print(b, x); - BIO_free(b); - return (ret); -} -LCRYPTO_ALIAS(ECParameters_print_fp); - -int -EC_KEY_print(BIO *bp, const EC_KEY *x, int off) -{ - EVP_PKEY *pk; + EVP_PKEY *pkey; int ret = 0; - if ((pk = EVP_PKEY_new()) == NULL) + if ((pkey = EVP_PKEY_new()) == NULL) goto err; - if (!EVP_PKEY_set1_EC_KEY(pk, (EC_KEY *) x)) + if (!EVP_PKEY_set1_EC_KEY(pkey, (EC_KEY *)ec_key)) goto err; - ret = EVP_PKEY_print_private(bp, pk, off, NULL); + ret = EVP_PKEY_print_private(bio, pkey, off, NULL); + err: - EVP_PKEY_free(pk); + EVP_PKEY_free(pkey); + return ret; } LCRYPTO_ALIAS(EC_KEY_print); int -ECParameters_print(BIO *bp, const EC_KEY *x) +EC_KEY_print_fp(FILE *fp, const EC_KEY *ec_key, int off) { - EVP_PKEY *pk; + BIO *bio; + int ret; + + if ((bio = BIO_new(BIO_s_file())) == NULL) { + ECerror(ERR_R_BIO_LIB); + return 0; + } + + BIO_set_fp(bio, fp, BIO_NOCLOSE); + + ret = EC_KEY_print(bio, ec_key, off); + + BIO_free(bio); + + return ret; +} +LCRYPTO_ALIAS(EC_KEY_print_fp); + +int +ECParameters_print(BIO *bio, const EC_KEY *ec_key) +{ + EVP_PKEY *pkey; int ret = 0; - if ((pk = EVP_PKEY_new()) == NULL) + if ((pkey = EVP_PKEY_new()) == NULL) goto err; - if (!EVP_PKEY_set1_EC_KEY(pk, (EC_KEY *) x)) + if (!EVP_PKEY_set1_EC_KEY(pkey, (EC_KEY *)ec_key)) goto err; - ret = EVP_PKEY_print_params(bp, pk, 4, NULL); + ret = EVP_PKEY_print_params(bio, pkey, 4, NULL); + err: - EVP_PKEY_free(pk); + EVP_PKEY_free(pkey); + return ret; } LCRYPTO_ALIAS(ECParameters_print); +int +ECParameters_print_fp(FILE *fp, const EC_KEY *ec_key) +{ + BIO *bio; + int ret; + + if ((bio = BIO_new(BIO_s_file())) == NULL) { + ECerror(ERR_R_BIO_LIB); + return 0; + } + + BIO_set_fp(bio, fp, BIO_NOCLOSE); + + ret = ECParameters_print(bio, ec_key); + + BIO_free(bio); + + return ret; +} +LCRYPTO_ALIAS(ECParameters_print_fp); + static int -ecpk_print_asn1_parameters(BIO *bp, const EC_GROUP *group, int off) +ecpk_print_asn1_parameters(BIO *bio, const EC_GROUP *group, int off) { const char *nist_name; int nid; int ret = 0; - if (!BIO_indent(bp, off, 128)) { + if (!BIO_indent(bio, off, 128)) { ECerror(ERR_R_BIO_LIB); goto err; } @@ -177,17 +174,17 @@ ecpk_print_asn1_parameters(BIO *bp, const EC_GROUP *group, int off) goto err; } - if (BIO_printf(bp, "ASN1 OID: %s\n", OBJ_nid2sn(nid)) <= 0) { + if (BIO_printf(bio, "ASN1 OID: %s\n", OBJ_nid2sn(nid)) <= 0) { ECerror(ERR_R_BIO_LIB); goto err; } if ((nist_name = EC_curve_nid2nist(nid)) != NULL) { - if (!BIO_indent(bp, off, 128)) { + if (!BIO_indent(bio, off, 128)) { ECerror(ERR_R_BIO_LIB); goto err; } - if (BIO_printf(bp, "NIST CURVE: %s\n", nist_name) <= 0) { + if (BIO_printf(bio, "NIST CURVE: %s\n", nist_name) <= 0) { ECerror(ERR_R_BIO_LIB); goto err; } @@ -200,7 +197,7 @@ ecpk_print_asn1_parameters(BIO *bp, const EC_GROUP *group, int off) } static int -ecpk_print_explicit_parameters(BIO *bp, const EC_GROUP *group, int off) +ecpk_print_explicit_parameters(BIO *bio, const EC_GROUP *group, int off) { BN_CTX *ctx = NULL; const BIGNUM *order; @@ -249,24 +246,25 @@ ecpk_print_explicit_parameters(BIO *bp, const EC_GROUP *group, int off) ECerror(ERR_R_EC_LIB); goto err; } + form = EC_GROUP_get_point_conversion_form(group); if (EC_POINT_point2bn(group, generator, form, gen, ctx) == NULL) { ECerror(ERR_R_EC_LIB); goto err; } - if (!BIO_indent(bp, off, 128)) + if (!BIO_indent(bio, off, 128)) goto err; - nid = EC_METHOD_get_field_type(EC_GROUP_method_of(group)); - if (BIO_printf(bp, "Field Type: %s\n", OBJ_nid2sn(nid)) <= 0) + nid = ec_group_get_field_type(group); + if (BIO_printf(bio, "Field Type: %s\n", OBJ_nid2sn(nid)) <= 0) goto err; - if (!bn_printf(bp, p, off, "Prime:")) + if (!bn_printf(bio, p, off, "Prime:")) goto err; - if (!bn_printf(bp, a, off, "A: ")) + if (!bn_printf(bio, a, off, "A: ")) goto err; - if (!bn_printf(bp, b, off, "B: ")) + if (!bn_printf(bio, b, off, "B: ")) goto err; if (form == POINT_CONVERSION_COMPRESSED) @@ -277,41 +275,42 @@ ecpk_print_explicit_parameters(BIO *bp, const EC_GROUP *group, int off) conversion_form = "hybrid"; else conversion_form = "unknown"; - if (!bn_printf(bp, gen, off, "Generator (%s):", conversion_form)) + if (!bn_printf(bio, gen, off, "Generator (%s):", conversion_form)) goto err; - if (!bn_printf(bp, order, off, "Order: ")) + if (!bn_printf(bio, order, off, "Order: ")) goto err; - if (!bn_printf(bp, cofactor, off, "Cofactor: ")) + if (!bn_printf(bio, cofactor, off, "Cofactor: ")) goto err; + if ((seed = EC_GROUP_get0_seed(group)) != NULL) { size_t i; seed_len = EC_GROUP_get_seed_len(group); /* XXX - ecx_buf_print() has a CBS version of this - dedup. */ - if (!BIO_indent(bp, off, 128)) + if (!BIO_indent(bio, off, 128)) goto err; - if (BIO_printf(bp, "Seed:") <= 0) + if (BIO_printf(bio, "Seed:") <= 0) goto err; for (i = 0; i < seed_len; i++) { const char *sep = ":"; if (i % 15 == 0) { - if (BIO_printf(bp, "\n") <= 0) + if (BIO_printf(bio, "\n") <= 0) goto err; - if (!BIO_indent(bp, off + 4, 128)) + if (!BIO_indent(bio, off + 4, 128)) goto err; } if (i + 1 == seed_len) sep = ""; - if (BIO_printf(bp, "%02x%s", seed[i], sep) <= 0) + if (BIO_printf(bio, "%02x%s", seed[i], sep) <= 0) goto err; } - if (BIO_printf(bp, "\n") <= 0) + if (BIO_printf(bio, "\n") <= 0) goto err; } @@ -324,16 +323,37 @@ ecpk_print_explicit_parameters(BIO *bp, const EC_GROUP *group, int off) } int -ECPKParameters_print(BIO *bp, const EC_GROUP *group, int off) +ECPKParameters_print(BIO *bio, const EC_GROUP *group, int off) { if (group == NULL) { ECerror(ERR_R_PASSED_NULL_PARAMETER); return 0; } - if (EC_GROUP_get_asn1_flag(group)) - return ecpk_print_asn1_parameters(bp, group, off); + if ((EC_GROUP_get_asn1_flag(group) & OPENSSL_EC_NAMED_CURVE) != 0) + return ecpk_print_asn1_parameters(bio, group, off); - return ecpk_print_explicit_parameters(bp, group, off); + return ecpk_print_explicit_parameters(bio, group, off); } LCRYPTO_ALIAS(ECPKParameters_print); + +int +ECPKParameters_print_fp(FILE *fp, const EC_GROUP *group, int off) +{ + BIO *bio; + int ret; + + if ((bio = BIO_new(BIO_s_file())) == NULL) { + ECerror(ERR_R_BUF_LIB); + return 0; + } + + BIO_set_fp(bio, fp, BIO_NOCLOSE); + + ret = ECPKParameters_print(bio, group, off); + + BIO_free(bio); + + return ret; +} +LCRYPTO_ALIAS(ECPKParameters_print_fp); diff --git a/lib/libcrypto/ec/ecp_smpl.c b/lib/libcrypto/ec/ecp_methods.c similarity index 56% rename from lib/libcrypto/ec/ecp_smpl.c rename to lib/libcrypto/ec/ecp_methods.c index 018aedfd4..959342887 100644 --- a/lib/libcrypto/ec/ecp_smpl.c +++ b/lib/libcrypto/ec/ecp_methods.c @@ -1,8 +1,8 @@ -/* $OpenBSD: ecp_smpl.c,v 1.56 2023/08/03 18:53:56 tb Exp $ */ +/* $OpenBSD: ecp_methods.c,v 1.26 2025/01/07 08:30:52 tb Exp $ */ /* Includes code written by Lenka Fibikova * for the OpenSSL project. * Includes code written by Bodo Moeller for the OpenSSL project. -*/ + */ /* ==================================================================== * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. * @@ -62,58 +62,28 @@ * and contributed to the OpenSSL project. */ +#include + +#include +#include #include +#include #include "bn_local.h" #include "ec_local.h" /* - * Most method functions in this file are designed to work with - * non-trivial representations of field elements if necessary - * (see ecp_mont.c): while standard modular addition and subtraction - * are used, the field_mul and field_sqr methods will be used for - * multiplication, and field_encode and field_decode (if defined) + * Most method functions in this file are designed to work with non-trivial + * representations of field elements if necessary: while standard modular + * addition and subtraction are used, the field_mul and field_sqr methods will + * be used for multiplication, and field_encode and field_decode (if defined) * will be used for converting between representations. * - * Functions ec_GFp_simple_points_make_affine() and - * ec_GFp_simple_point_get_affine_coordinates() specifically assume - * that if a non-trivial representation is used, it is a Montgomery + * The functions ec_points_make_affine() and ec_point_get_affine_coordinates() + * assume that if a non-trivial representation is used, it is a Montgomery * representation (i.e. 'encoding' means multiplying by some factor R). */ -int -ec_GFp_simple_group_init(EC_GROUP *group) -{ - BN_init(&group->field); - BN_init(&group->a); - BN_init(&group->b); - group->a_is_minus3 = 0; - return 1; -} - -void -ec_GFp_simple_group_finish(EC_GROUP *group) -{ - BN_free(&group->field); - BN_free(&group->a); - BN_free(&group->b); -} - -int -ec_GFp_simple_group_copy(EC_GROUP *dest, const EC_GROUP *src) -{ - if (!bn_copy(&dest->field, &src->field)) - return 0; - if (!bn_copy(&dest->a, &src->a)) - return 0; - if (!bn_copy(&dest->b, &src->b)) - return 0; - - dest->a_is_minus3 = src->a_is_minus3; - - return 1; -} - static int ec_decode_scalar(const EC_GROUP *group, BIGNUM *bn, const BIGNUM *x, BN_CTX *ctx) { @@ -129,7 +99,7 @@ ec_decode_scalar(const EC_GROUP *group, BIGNUM *bn, const BIGNUM *x, BN_CTX *ctx static int ec_encode_scalar(const EC_GROUP *group, BIGNUM *bn, const BIGNUM *x, BN_CTX *ctx) { - if (!BN_nnmod(bn, x, &group->field, ctx)) + if (!BN_nnmod(bn, x, group->p, ctx)) return 0; if (group->meth->field_encode != NULL) @@ -139,24 +109,7 @@ ec_encode_scalar(const EC_GROUP *group, BIGNUM *bn, const BIGNUM *x, BN_CTX *ctx } static int -ec_encode_z_coordinate(const EC_GROUP *group, BIGNUM *bn, int *is_one, - const BIGNUM *z, BN_CTX *ctx) -{ - if (!BN_nnmod(bn, z, &group->field, ctx)) - return 0; - - *is_one = BN_is_one(bn); - if (*is_one && group->meth->field_set_to_one != NULL) - return group->meth->field_set_to_one(group, bn, ctx); - - if (group->meth->field_encode != NULL) - return group->meth->field_encode(group, bn, bn, ctx); - - return 1; -} - -int -ec_GFp_simple_group_set_curve(EC_GROUP *group, +ec_group_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) { BIGNUM *a_plus_3; @@ -173,18 +126,18 @@ ec_GFp_simple_group_set_curve(EC_GROUP *group, if ((a_plus_3 = BN_CTX_get(ctx)) == NULL) goto err; - if (!bn_copy(&group->field, p)) + if (!bn_copy(group->p, p)) goto err; - BN_set_negative(&group->field, 0); + BN_set_negative(group->p, 0); - if (!ec_encode_scalar(group, &group->a, a, ctx)) + if (!ec_encode_scalar(group, group->a, a, ctx)) goto err; - if (!ec_encode_scalar(group, &group->b, b, ctx)) + if (!ec_encode_scalar(group, group->b, b, ctx)) goto err; if (!BN_set_word(a_plus_3, 3)) goto err; - if (!BN_mod_add(a_plus_3, a_plus_3, a, &group->field, ctx)) + if (!BN_mod_add(a_plus_3, a_plus_3, a, group->p, ctx)) goto err; group->a_is_minus3 = BN_is_zero(a_plus_3); @@ -197,203 +150,54 @@ ec_GFp_simple_group_set_curve(EC_GROUP *group, return ret; } -int -ec_GFp_simple_group_get_curve(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, - BIGNUM *b, BN_CTX *ctx) -{ - if (p != NULL) { - if (!bn_copy(p, &group->field)) - return 0; - } - if (!ec_decode_scalar(group, a, &group->a, ctx)) - return 0; - if (!ec_decode_scalar(group, b, &group->b, ctx)) - return 0; - - return 1; -} - -int -ec_GFp_simple_group_get_degree(const EC_GROUP *group) -{ - return BN_num_bits(&group->field); -} - -int -ec_GFp_simple_group_check_discriminant(const EC_GROUP *group, BN_CTX *ctx) -{ - BIGNUM *p, *a, *b, *discriminant; - int ret = 0; - - BN_CTX_start(ctx); - - if ((p = BN_CTX_get(ctx)) == NULL) - goto err; - if ((a = BN_CTX_get(ctx)) == NULL) - goto err; - if ((b = BN_CTX_get(ctx)) == NULL) - goto err; - if ((discriminant = BN_CTX_get(ctx)) == NULL) - goto err; - - if (!EC_GROUP_get_curve(group, p, a, b, ctx)) - goto err; - - /* - * Check that the discriminant 4a^3 + 27b^2 is non-zero modulo p. - */ - - if (BN_is_zero(a) && BN_is_zero(b)) - goto err; - if (BN_is_zero(a) || BN_is_zero(b)) - goto done; - - /* Compute the discriminant: first 4a^3, then 27b^2, then their sum. */ - if (!BN_mod_sqr(discriminant, a, p, ctx)) - goto err; - if (!BN_mod_mul(discriminant, discriminant, a, p, ctx)) - goto err; - if (!BN_lshift(discriminant, discriminant, 2)) - goto err; - - if (!BN_mod_sqr(b, b, p, ctx)) - goto err; - if (!BN_mul_word(b, 27)) - goto err; - - if (!BN_mod_add(discriminant, discriminant, b, p, ctx)) - goto err; - - if (BN_is_zero(discriminant)) - goto err; - - done: - ret = 1; - - err: - BN_CTX_end(ctx); - - return ret; -} - -int -ec_GFp_simple_point_init(EC_POINT * point) -{ - BN_init(&point->X); - BN_init(&point->Y); - BN_init(&point->Z); - point->Z_is_one = 0; - - return 1; -} - -void -ec_GFp_simple_point_finish(EC_POINT *point) -{ - BN_free(&point->X); - BN_free(&point->Y); - BN_free(&point->Z); - point->Z_is_one = 0; -} - -int -ec_GFp_simple_point_copy(EC_POINT *dest, const EC_POINT *src) -{ - if (!bn_copy(&dest->X, &src->X)) - return 0; - if (!bn_copy(&dest->Y, &src->Y)) - return 0; - if (!bn_copy(&dest->Z, &src->Z)) - return 0; - dest->Z_is_one = src->Z_is_one; - - return 1; -} - -int -ec_GFp_simple_point_set_to_infinity(const EC_GROUP *group, EC_POINT *point) -{ - point->Z_is_one = 0; - BN_zero(&point->Z); - return 1; -} - -int -ec_GFp_simple_set_Jprojective_coordinates(const EC_GROUP *group, - EC_POINT *point, const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, +static int +ec_group_get_curve(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *ctx) { - int ret = 0; - - /* - * Setting individual coordinates allows the creation of bad points. - * EC_POINT_set_Jprojective_coordinates() checks at the API boundary. - */ - - if (x != NULL) { - if (!ec_encode_scalar(group, &point->X, x, ctx)) - goto err; - } - if (y != NULL) { - if (!ec_encode_scalar(group, &point->Y, y, ctx)) - goto err; - } - if (z != NULL) { - if (!ec_encode_z_coordinate(group, &point->Z, &point->Z_is_one, - z, ctx)) - goto err; + if (p != NULL) { + if (!bn_copy(p, group->p)) + return 0; } + if (!ec_decode_scalar(group, a, group->a, ctx)) + return 0; + if (!ec_decode_scalar(group, b, group->b, ctx)) + return 0; - ret = 1; - - err: - return ret; + return 1; } -int -ec_GFp_simple_get_Jprojective_coordinates(const EC_GROUP *group, - const EC_POINT *point, BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *ctx) -{ - int ret = 0; - - if (!ec_decode_scalar(group, x, &point->X, ctx)) - goto err; - if (!ec_decode_scalar(group, y, &point->Y, ctx)) - goto err; - if (!ec_decode_scalar(group, z, &point->Z, ctx)) - goto err; - - ret = 1; - - err: - return ret; -} - -int -ec_GFp_simple_point_set_affine_coordinates(const EC_GROUP *group, EC_POINT *point, +static int +ec_point_set_affine_coordinates(const EC_GROUP *group, EC_POINT *point, const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx) { + int ret = 0; + if (x == NULL || y == NULL) { - /* unlike for projective coordinates, we do not tolerate this */ ECerror(ERR_R_PASSED_NULL_PARAMETER); - return 0; + goto err; } - return EC_POINT_set_Jprojective_coordinates(group, point, x, y, - BN_value_one(), ctx); + + if (!ec_encode_scalar(group, point->X, x, ctx)) + goto err; + if (!ec_encode_scalar(group, point->Y, y, ctx)) + goto err; + if (!ec_encode_scalar(group, point->Z, BN_value_one(), ctx)) + goto err; + point->Z_is_one = 1; + + ret = 1; + + err: + return ret; } -int -ec_GFp_simple_point_get_affine_coordinates(const EC_GROUP *group, - const EC_POINT *point, BIGNUM *x, BIGNUM *y, BN_CTX *ctx) +static int +ec_point_get_affine_coordinates(const EC_GROUP *group, const EC_POINT *point, + BIGNUM *x, BIGNUM *y, BN_CTX *ctx) { BIGNUM *z, *Z, *Z_1, *Z_2, *Z_3; int ret = 0; - if (EC_POINT_is_at_infinity(group, point) > 0) { - ECerror(EC_R_POINT_AT_INFINITY); - return 0; - } - BN_CTX_start(ctx); if ((z = BN_CTX_get(ctx)) == NULL) @@ -407,20 +211,23 @@ ec_GFp_simple_point_get_affine_coordinates(const EC_GROUP *group, if ((Z_3 = BN_CTX_get(ctx)) == NULL) goto err; - /* Convert from projective coordinates (X, Y, Z) into (X/Z^2, Y/Z^3). */ + /* + * Convert from Jacobian projective coordinates (X, Y, Z) into + * (X/Z^2, Y/Z^3). + */ - if (!ec_decode_scalar(group, z, &point->Z, ctx)) + if (!ec_decode_scalar(group, z, point->Z, ctx)) goto err; if (BN_is_one(z)) { - if (!ec_decode_scalar(group, x, &point->X, ctx)) + if (!ec_decode_scalar(group, x, point->X, ctx)) goto err; - if (!ec_decode_scalar(group, y, &point->Y, ctx)) + if (!ec_decode_scalar(group, y, point->Y, ctx)) goto err; goto done; } - if (BN_mod_inverse_ct(Z_1, z, &group->field, ctx) == NULL) { + if (BN_mod_inverse_ct(Z_1, z, group->p, ctx) == NULL) { ECerror(ERR_R_BN_LIB); goto err; } @@ -429,7 +236,7 @@ ec_GFp_simple_point_get_affine_coordinates(const EC_GROUP *group, if (!group->meth->field_sqr(group, Z_2, Z_1, ctx)) goto err; } else { - if (!BN_mod_sqr(Z_2, Z_1, &group->field, ctx)) + if (!BN_mod_sqr(Z_2, Z_1, group->p, ctx)) goto err; } @@ -438,7 +245,7 @@ ec_GFp_simple_point_get_affine_coordinates(const EC_GROUP *group, * in the Montgomery case, field_mul will cancel out * Montgomery factor in X: */ - if (!group->meth->field_mul(group, x, &point->X, Z_2, ctx)) + if (!group->meth->field_mul(group, x, point->X, Z_2, ctx)) goto err; } if (y != NULL) { @@ -447,7 +254,7 @@ ec_GFp_simple_point_get_affine_coordinates(const EC_GROUP *group, if (!group->meth->field_mul(group, Z_3, Z_2, Z_1, ctx)) goto err; } else { - if (!BN_mod_mul(Z_3, Z_2, Z_1, &group->field, ctx)) + if (!BN_mod_mul(Z_3, Z_2, Z_1, group->p, ctx)) goto err; } @@ -455,7 +262,7 @@ ec_GFp_simple_point_get_affine_coordinates(const EC_GROUP *group, * in the Montgomery case, field_mul will cancel out * Montgomery factor in Y: */ - if (!group->meth->field_mul(group, y, &point->Y, Z_3, ctx)) + if (!group->meth->field_mul(group, y, point->Y, Z_3, ctx)) goto err; } @@ -468,8 +275,107 @@ ec_GFp_simple_point_get_affine_coordinates(const EC_GROUP *group, return ret; } -int -ec_GFp_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, BN_CTX *ctx) +static int +ec_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *point, + const BIGNUM *in_x, int y_bit, BN_CTX *ctx) +{ + const BIGNUM *p = group->p, *a = group->a, *b = group->b; + BIGNUM *w, *x, *y; + int ret = 0; + + y_bit = (y_bit != 0); + + BN_CTX_start(ctx); + + if ((w = BN_CTX_get(ctx)) == NULL) + goto err; + if ((x = BN_CTX_get(ctx)) == NULL) + goto err; + if ((y = BN_CTX_get(ctx)) == NULL) + goto err; + + /* + * Weierstrass equation: y^2 = x^3 + ax + b, so y is one of the + * square roots of x^3 + ax + b. The y-bit indicates which one. + */ + + /* XXX - should we not insist on 0 <= x < p instead? */ + if (!BN_nnmod(x, in_x, p, ctx)) + goto err; + + if (group->meth->field_encode != NULL) { + if (!group->meth->field_encode(group, x, x, ctx)) + goto err; + } + + /* y = x^3 */ + if (!group->meth->field_sqr(group, y, x, ctx)) + goto err; + if (!group->meth->field_mul(group, y, y, x, ctx)) + goto err; + + /* y += ax */ + if (group->a_is_minus3) { + if (!BN_mod_lshift1_quick(w, x, p)) + goto err; + if (!BN_mod_add_quick(w, w, x, p)) + goto err; + if (!BN_mod_sub_quick(y, y, w, p)) + goto err; + } else { + if (!group->meth->field_mul(group, w, a, x, ctx)) + goto err; + if (!BN_mod_add_quick(y, y, w, p)) + goto err; + } + + /* y += b */ + if (!BN_mod_add_quick(y, y, b, p)) + goto err; + + if (group->meth->field_decode != NULL) { + if (!group->meth->field_decode(group, x, x, ctx)) + goto err; + if (!group->meth->field_decode(group, y, y, ctx)) + goto err; + } + + if (!BN_mod_sqrt(y, y, p, ctx)) { + ECerror(EC_R_INVALID_COMPRESSED_POINT); + goto err; + } + + if (y_bit == BN_is_odd(y)) + goto done; + + if (BN_is_zero(y)) { + ECerror(EC_R_INVALID_COMPRESSION_BIT); + goto err; + } + if (!BN_usub(y, p, y)) + goto err; + + if (y_bit != BN_is_odd(y)) { + /* Can only happen if p is even and should not be reachable. */ + ECerror(ERR_R_INTERNAL_ERROR); + goto err; + } + + done: + if (!EC_POINT_set_affine_coordinates(group, point, x, y, ctx)) + goto err; + + ret = 1; + + err: + BN_CTX_end(ctx); + + return ret; +} + +static int +ec_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, + BN_CTX *ctx) { int (*field_mul) (const EC_GROUP *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); int (*field_sqr) (const EC_GROUP *, BIGNUM *, const BIGNUM *, BN_CTX *); @@ -479,14 +385,14 @@ ec_GFp_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const E if (a == b) return EC_POINT_dbl(group, r, a, ctx); - if (EC_POINT_is_at_infinity(group, a) > 0) + if (EC_POINT_is_at_infinity(group, a)) return EC_POINT_copy(r, b); - if (EC_POINT_is_at_infinity(group, b) > 0) + if (EC_POINT_is_at_infinity(group, b)) return EC_POINT_copy(r, a); field_mul = group->meth->field_mul; field_sqr = group->meth->field_sqr; - p = &group->field; + p = group->p; BN_CTX_start(ctx); @@ -513,44 +419,44 @@ ec_GFp_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const E /* n1, n2 */ if (b->Z_is_one) { - if (!bn_copy(n1, &a->X)) + if (!bn_copy(n1, a->X)) goto end; - if (!bn_copy(n2, &a->Y)) + if (!bn_copy(n2, a->Y)) goto end; /* n1 = X_a */ /* n2 = Y_a */ } else { - if (!field_sqr(group, n0, &b->Z, ctx)) + if (!field_sqr(group, n0, b->Z, ctx)) goto end; - if (!field_mul(group, n1, &a->X, n0, ctx)) + if (!field_mul(group, n1, a->X, n0, ctx)) goto end; /* n1 = X_a * Z_b^2 */ - if (!field_mul(group, n0, n0, &b->Z, ctx)) + if (!field_mul(group, n0, n0, b->Z, ctx)) goto end; - if (!field_mul(group, n2, &a->Y, n0, ctx)) + if (!field_mul(group, n2, a->Y, n0, ctx)) goto end; /* n2 = Y_a * Z_b^3 */ } /* n3, n4 */ if (a->Z_is_one) { - if (!bn_copy(n3, &b->X)) + if (!bn_copy(n3, b->X)) goto end; - if (!bn_copy(n4, &b->Y)) + if (!bn_copy(n4, b->Y)) goto end; /* n3 = X_b */ /* n4 = Y_b */ } else { - if (!field_sqr(group, n0, &a->Z, ctx)) + if (!field_sqr(group, n0, a->Z, ctx)) goto end; - if (!field_mul(group, n3, &b->X, n0, ctx)) + if (!field_mul(group, n3, b->X, n0, ctx)) goto end; /* n3 = X_b * Z_a^2 */ - if (!field_mul(group, n0, n0, &a->Z, ctx)) + if (!field_mul(group, n0, n0, a->Z, ctx)) goto end; - if (!field_mul(group, n4, &b->Y, n0, ctx)) + if (!field_mul(group, n4, b->Y, n0, ctx)) goto end; /* n4 = Y_b * Z_a^3 */ } @@ -572,7 +478,7 @@ ec_GFp_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const E goto end; } else { /* a is the inverse of b */ - BN_zero(&r->Z); + BN_zero(r->Z); r->Z_is_one = 0; ret = 1; goto end; @@ -588,20 +494,20 @@ ec_GFp_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const E /* Z_r */ if (a->Z_is_one && b->Z_is_one) { - if (!bn_copy(&r->Z, n5)) + if (!bn_copy(r->Z, n5)) goto end; } else { if (a->Z_is_one) { - if (!bn_copy(n0, &b->Z)) + if (!bn_copy(n0, b->Z)) goto end; } else if (b->Z_is_one) { - if (!bn_copy(n0, &a->Z)) + if (!bn_copy(n0, a->Z)) goto end; } else { - if (!field_mul(group, n0, &a->Z, &b->Z, ctx)) + if (!field_mul(group, n0, a->Z, b->Z, ctx)) goto end; } - if (!field_mul(group, &r->Z, n0, n5, ctx)) + if (!field_mul(group, r->Z, n0, n5, ctx)) goto end; } r->Z_is_one = 0; @@ -614,12 +520,12 @@ ec_GFp_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const E goto end; if (!field_mul(group, n3, n1, n4, ctx)) goto end; - if (!BN_mod_sub_quick(&r->X, n0, n3, p)) + if (!BN_mod_sub_quick(r->X, n0, n3, p)) goto end; /* X_r = n6^2 - n5^2 * 'n7' */ /* 'n9' */ - if (!BN_mod_lshift1_quick(n0, &r->X, p)) + if (!BN_mod_lshift1_quick(n0, r->X, p)) goto end; if (!BN_mod_sub_quick(n0, n3, n0, p)) goto end; @@ -638,7 +544,7 @@ ec_GFp_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const E if (!BN_add(n0, n0, p)) goto end; /* now 0 <= n0 < 2*p, and n0 is even */ - if (!BN_rshift1(&r->Y, n0)) + if (!BN_rshift1(r->Y, n0)) goto end; /* Y_r = (n6 * 'n9' - 'n8' * 'n5^3') / 2 */ @@ -650,8 +556,8 @@ ec_GFp_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const E return ret; } -int -ec_GFp_simple_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX *ctx) +static int +ec_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX *ctx) { int (*field_mul) (const EC_GROUP *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); int (*field_sqr) (const EC_GROUP *, BIGNUM *, const BIGNUM *, BN_CTX *); @@ -659,12 +565,12 @@ ec_GFp_simple_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX BIGNUM *n0, *n1, *n2, *n3; int ret = 0; - if (EC_POINT_is_at_infinity(group, a) > 0) + if (EC_POINT_is_at_infinity(group, a)) return EC_POINT_set_to_infinity(group, r); field_mul = group->meth->field_mul; field_sqr = group->meth->field_sqr; - p = &group->field; + p = group->p; BN_CTX_start(ctx); @@ -685,21 +591,21 @@ ec_GFp_simple_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX /* n1 */ if (a->Z_is_one) { - if (!field_sqr(group, n0, &a->X, ctx)) + if (!field_sqr(group, n0, a->X, ctx)) goto err; if (!BN_mod_lshift1_quick(n1, n0, p)) goto err; if (!BN_mod_add_quick(n0, n0, n1, p)) goto err; - if (!BN_mod_add_quick(n1, n0, &group->a, p)) + if (!BN_mod_add_quick(n1, n0, group->a, p)) goto err; /* n1 = 3 * X_a^2 + a_curve */ } else if (group->a_is_minus3) { - if (!field_sqr(group, n1, &a->Z, ctx)) + if (!field_sqr(group, n1, a->Z, ctx)) goto err; - if (!BN_mod_add_quick(n0, &a->X, n1, p)) + if (!BN_mod_add_quick(n0, a->X, n1, p)) goto err; - if (!BN_mod_sub_quick(n2, &a->X, n1, p)) + if (!BN_mod_sub_quick(n2, a->X, n1, p)) goto err; if (!field_mul(group, n1, n0, n2, ctx)) goto err; @@ -712,17 +618,17 @@ ec_GFp_simple_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX * Z_a^4 */ } else { - if (!field_sqr(group, n0, &a->X, ctx)) + if (!field_sqr(group, n0, a->X, ctx)) goto err; if (!BN_mod_lshift1_quick(n1, n0, p)) goto err; if (!BN_mod_add_quick(n0, n0, n1, p)) goto err; - if (!field_sqr(group, n1, &a->Z, ctx)) + if (!field_sqr(group, n1, a->Z, ctx)) goto err; if (!field_sqr(group, n1, n1, ctx)) goto err; - if (!field_mul(group, n1, n1, &group->a, ctx)) + if (!field_mul(group, n1, n1, group->a, ctx)) goto err; if (!BN_mod_add_quick(n1, n1, n0, p)) goto err; @@ -731,21 +637,21 @@ ec_GFp_simple_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX /* Z_r */ if (a->Z_is_one) { - if (!bn_copy(n0, &a->Y)) + if (!bn_copy(n0, a->Y)) goto err; } else { - if (!field_mul(group, n0, &a->Y, &a->Z, ctx)) + if (!field_mul(group, n0, a->Y, a->Z, ctx)) goto err; } - if (!BN_mod_lshift1_quick(&r->Z, n0, p)) + if (!BN_mod_lshift1_quick(r->Z, n0, p)) goto err; r->Z_is_one = 0; /* Z_r = 2 * Y_a * Z_a */ /* n2 */ - if (!field_sqr(group, n3, &a->Y, ctx)) + if (!field_sqr(group, n3, a->Y, ctx)) goto err; - if (!field_mul(group, n2, &a->X, n3, ctx)) + if (!field_mul(group, n2, a->X, n3, ctx)) goto err; if (!BN_mod_lshift_quick(n2, n2, 2, p)) goto err; @@ -754,9 +660,9 @@ ec_GFp_simple_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX /* X_r */ if (!BN_mod_lshift1_quick(n0, n2, p)) goto err; - if (!field_sqr(group, &r->X, n1, ctx)) + if (!field_sqr(group, r->X, n1, ctx)) goto err; - if (!BN_mod_sub_quick(&r->X, &r->X, n0, p)) + if (!BN_mod_sub_quick(r->X, r->X, n0, p)) goto err; /* X_r = n1^2 - 2 * n2 */ @@ -768,11 +674,11 @@ ec_GFp_simple_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX /* n3 = 8 * Y_a^4 */ /* Y_r */ - if (!BN_mod_sub_quick(n0, n2, &r->X, p)) + if (!BN_mod_sub_quick(n0, n2, r->X, p)) goto err; if (!field_mul(group, n0, n1, n0, ctx)) goto err; - if (!BN_mod_sub_quick(&r->Y, n0, n3, p)) + if (!BN_mod_sub_quick(r->Y, n0, n3, p)) goto err; /* Y_r = n1 * (n2 - X_r) - n3 */ @@ -784,24 +690,18 @@ ec_GFp_simple_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX return ret; } -int -ec_GFp_simple_invert(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx) +static int +ec_invert(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx) { - if (EC_POINT_is_at_infinity(group, point) > 0 || BN_is_zero(&point->Y)) + if (EC_POINT_is_at_infinity(group, point) || BN_is_zero(point->Y)) /* point is its own inverse */ return 1; - return BN_usub(&point->Y, &group->field, &point->Y); + return BN_usub(point->Y, group->p, point->Y); } -int -ec_GFp_simple_is_at_infinity(const EC_GROUP *group, const EC_POINT *point) -{ - return BN_is_zero(&point->Z); -} - -int -ec_GFp_simple_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX *ctx) +static int +ec_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX *ctx) { int (*field_mul) (const EC_GROUP *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); int (*field_sqr) (const EC_GROUP *, BIGNUM *, const BIGNUM *, BN_CTX *); @@ -809,12 +709,12 @@ ec_GFp_simple_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX * BIGNUM *rh, *tmp, *Z4, *Z6; int ret = -1; - if (EC_POINT_is_at_infinity(group, point) > 0) + if (EC_POINT_is_at_infinity(group, point)) return 1; field_mul = group->meth->field_mul; field_sqr = group->meth->field_sqr; - p = &group->field; + p = group->p; BN_CTX_start(ctx); @@ -837,11 +737,11 @@ ec_GFp_simple_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX * */ /* rh := X^2 */ - if (!field_sqr(group, rh, &point->X, ctx)) + if (!field_sqr(group, rh, point->X, ctx)) goto err; if (!point->Z_is_one) { - if (!field_sqr(group, tmp, &point->Z, ctx)) + if (!field_sqr(group, tmp, point->Z, ctx)) goto err; if (!field_sqr(group, Z4, tmp, ctx)) goto err; @@ -856,19 +756,19 @@ ec_GFp_simple_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX * goto err; if (!BN_mod_sub_quick(rh, rh, tmp, p)) goto err; - if (!field_mul(group, rh, rh, &point->X, ctx)) + if (!field_mul(group, rh, rh, point->X, ctx)) goto err; } else { - if (!field_mul(group, tmp, Z4, &group->a, ctx)) + if (!field_mul(group, tmp, Z4, group->a, ctx)) goto err; if (!BN_mod_add_quick(rh, rh, tmp, p)) goto err; - if (!field_mul(group, rh, rh, &point->X, ctx)) + if (!field_mul(group, rh, rh, point->X, ctx)) goto err; } /* rh := rh + b*Z^6 */ - if (!field_mul(group, tmp, &group->b, Z6, ctx)) + if (!field_mul(group, tmp, group->b, Z6, ctx)) goto err; if (!BN_mod_add_quick(rh, rh, tmp, p)) goto err; @@ -876,17 +776,17 @@ ec_GFp_simple_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX * /* point->Z_is_one */ /* rh := (rh + a)*X */ - if (!BN_mod_add_quick(rh, rh, &group->a, p)) + if (!BN_mod_add_quick(rh, rh, group->a, p)) goto err; - if (!field_mul(group, rh, rh, &point->X, ctx)) + if (!field_mul(group, rh, rh, point->X, ctx)) goto err; /* rh := rh + b */ - if (!BN_mod_add_quick(rh, rh, &group->b, p)) + if (!BN_mod_add_quick(rh, rh, group->b, p)) goto err; } /* 'lh' := Y^2 */ - if (!field_sqr(group, tmp, &point->Y, ctx)) + if (!field_sqr(group, tmp, point->Y, ctx)) goto err; ret = (0 == BN_ucmp(tmp, rh)); @@ -897,28 +797,26 @@ ec_GFp_simple_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX * return ret; } -int -ec_GFp_simple_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, BN_CTX *ctx) -{ - /* - * return values: -1 error 0 equal (in affine coordinates) 1 - * not equal - */ +/* + * Returns -1 on error, 0 if the points are equal, 1 if the points are distinct. + */ +static int +ec_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, BN_CTX *ctx) +{ int (*field_mul) (const EC_GROUP *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); int (*field_sqr) (const EC_GROUP *, BIGNUM *, const BIGNUM *, BN_CTX *); BIGNUM *tmp1, *tmp2, *Za23, *Zb23; const BIGNUM *tmp1_, *tmp2_; int ret = -1; - if (EC_POINT_is_at_infinity(group, a) > 0) - return EC_POINT_is_at_infinity(group, b) > 0 ? 0 : 1; - - if (EC_POINT_is_at_infinity(group, b) > 0) + if (EC_POINT_is_at_infinity(group, a) && EC_POINT_is_at_infinity(group, b)) + return 0; + if (EC_POINT_is_at_infinity(group, a) || EC_POINT_is_at_infinity(group, b)) return 1; if (a->Z_is_one && b->Z_is_one) - return ((BN_cmp(&a->X, &b->X) == 0) && BN_cmp(&a->Y, &b->Y) == 0) ? 0 : 1; + return BN_cmp(a->X, b->X) != 0 || BN_cmp(a->Y, b->Y) != 0; field_mul = group->meth->field_mul; field_sqr = group->meth->field_sqr; @@ -941,21 +839,21 @@ ec_GFp_simple_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, B */ if (!b->Z_is_one) { - if (!field_sqr(group, Zb23, &b->Z, ctx)) + if (!field_sqr(group, Zb23, b->Z, ctx)) goto end; - if (!field_mul(group, tmp1, &a->X, Zb23, ctx)) + if (!field_mul(group, tmp1, a->X, Zb23, ctx)) goto end; tmp1_ = tmp1; } else - tmp1_ = &a->X; + tmp1_ = a->X; if (!a->Z_is_one) { - if (!field_sqr(group, Za23, &a->Z, ctx)) + if (!field_sqr(group, Za23, a->Z, ctx)) goto end; - if (!field_mul(group, tmp2, &b->X, Za23, ctx)) + if (!field_mul(group, tmp2, b->X, Za23, ctx)) goto end; tmp2_ = tmp2; } else - tmp2_ = &b->X; + tmp2_ = b->X; /* compare X_a*Z_b^2 with X_b*Z_a^2 */ if (BN_cmp(tmp1_, tmp2_) != 0) { @@ -963,21 +861,21 @@ ec_GFp_simple_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, B goto end; } if (!b->Z_is_one) { - if (!field_mul(group, Zb23, Zb23, &b->Z, ctx)) + if (!field_mul(group, Zb23, Zb23, b->Z, ctx)) goto end; - if (!field_mul(group, tmp1, &a->Y, Zb23, ctx)) + if (!field_mul(group, tmp1, a->Y, Zb23, ctx)) goto end; /* tmp1_ = tmp1 */ } else - tmp1_ = &a->Y; + tmp1_ = a->Y; if (!a->Z_is_one) { - if (!field_mul(group, Za23, Za23, &a->Z, ctx)) + if (!field_mul(group, Za23, Za23, a->Z, ctx)) goto end; - if (!field_mul(group, tmp2, &b->Y, Za23, ctx)) + if (!field_mul(group, tmp2, b->Y, Za23, ctx)) goto end; /* tmp2_ = tmp2 */ } else - tmp2_ = &b->Y; + tmp2_ = b->Y; /* compare Y_a*Z_b^3 with Y_b*Z_a^3 */ if (BN_cmp(tmp1_, tmp2_) != 0) { @@ -993,13 +891,13 @@ ec_GFp_simple_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, B return ret; } -int -ec_GFp_simple_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx) +static int +ec_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx) { BIGNUM *x, *y; int ret = 0; - if (point->Z_is_one || EC_POINT_is_at_infinity(group, point) > 0) + if (point->Z_is_one || EC_POINT_is_at_infinity(group, point)) return 1; BN_CTX_start(ctx); @@ -1025,12 +923,12 @@ ec_GFp_simple_make_affine(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx) return ret; } -int -ec_GFp_simple_points_make_affine(const EC_GROUP *group, size_t num, EC_POINT *points[], BN_CTX *ctx) +static int +ec_points_make_affine(const EC_GROUP *group, size_t num, EC_POINT *points[], + BN_CTX *ctx) { - BIGNUM *tmp0, *tmp1; - size_t pow2 = 0; - BIGNUM **heap = NULL; + BIGNUM **prod_Z = NULL; + BIGNUM *one, *tmp, *tmp_Z; size_t i; int ret = 0; @@ -1039,182 +937,148 @@ ec_GFp_simple_points_make_affine(const EC_GROUP *group, size_t num, EC_POINT *po BN_CTX_start(ctx); - if ((tmp0 = BN_CTX_get(ctx)) == NULL) + if ((one = BN_CTX_get(ctx)) == NULL) goto err; - if ((tmp1 = BN_CTX_get(ctx)) == NULL) + if ((tmp = BN_CTX_get(ctx)) == NULL) + goto err; + if ((tmp_Z = BN_CTX_get(ctx)) == NULL) goto err; - /* - * Before converting the individual points, compute inverses of all Z - * values. Modular inversion is rather slow, but luckily we can do - * with a single explicit inversion, plus about 3 multiplications per - * input value. - */ - - pow2 = 1; - while (num > pow2) - pow2 <<= 1; - /* - * Now pow2 is the smallest power of 2 satifsying pow2 >= num. We - * need twice that. - */ - pow2 <<= 1; - - heap = reallocarray(NULL, pow2, sizeof heap[0]); - if (heap == NULL) + if (!ec_encode_scalar(group, one, BN_value_one(), ctx)) goto err; + if ((prod_Z = calloc(num, sizeof *prod_Z)) == NULL) + goto err; + for (i = 0; i < num; i++) { + if ((prod_Z[i] = BN_CTX_get(ctx)) == NULL) + goto err; + } + /* - * The array is used as a binary tree, exactly as in heapsort: - * - * heap[1] heap[2] heap[3] heap[4] heap[5] - * heap[6] heap[7] heap[8]heap[9] heap[10]heap[11] - * heap[12]heap[13] heap[14] heap[15] - * - * We put the Z's in the last line; then we set each other node to the - * product of its two child-nodes (where empty or 0 entries are - * treated as ones); then we invert heap[1]; then we invert each - * other node by replacing it by the product of its parent (after - * inversion) and its sibling (before inversion). + * Set prod_Z[i] to the product of points[0]->Z, ..., points[i]->Z, + * skipping any zero-valued inputs (pretend that they're 1). */ - heap[0] = NULL; - for (i = pow2 / 2 - 1; i > 0; i--) - heap[i] = NULL; - for (i = 0; i < num; i++) - heap[pow2 / 2 + i] = &points[i]->Z; - for (i = pow2 / 2 + num; i < pow2; i++) - heap[i] = NULL; - /* set each node to the product of its children */ - for (i = pow2 / 2 - 1; i > 0; i--) { - heap[i] = BN_new(); - if (heap[i] == NULL) + if (!BN_is_zero(points[0]->Z)) { + if (!bn_copy(prod_Z[0], points[0]->Z)) + goto err; + } else { + if (!bn_copy(prod_Z[0], one)) goto err; - - if (heap[2 * i] != NULL) { - if ((heap[2 * i + 1] == NULL) || BN_is_zero(heap[2 * i + 1])) { - if (!bn_copy(heap[i], heap[2 * i])) - goto err; - } else { - if (BN_is_zero(heap[2 * i])) { - if (!bn_copy(heap[i], heap[2 * i + 1])) - goto err; - } else { - if (!group->meth->field_mul(group, heap[i], - heap[2 * i], heap[2 * i + 1], ctx)) - goto err; - } - } - } } - /* invert heap[1] */ - if (!BN_is_zero(heap[1])) { - if (BN_mod_inverse_ct(heap[1], heap[1], &group->field, ctx) == NULL) { - ECerror(ERR_R_BN_LIB); - goto err; - } - } - if (group->meth->field_encode != NULL) { - /* - * in the Montgomery case, we just turned R*H (representing - * H) into 1/(R*H), but we need R*(1/H) (representing - * 1/H); i.e. we have need to multiply by the Montgomery - * factor twice - */ - if (!group->meth->field_encode(group, heap[1], heap[1], ctx)) - goto err; - if (!group->meth->field_encode(group, heap[1], heap[1], ctx)) - goto err; - } - /* set other heap[i]'s to their inverses */ - for (i = 2; i < pow2 / 2 + num; i += 2) { - /* i is even */ - if ((heap[i + 1] != NULL) && !BN_is_zero(heap[i + 1])) { - if (!group->meth->field_mul(group, tmp0, heap[i / 2], heap[i + 1], ctx)) - goto err; - if (!group->meth->field_mul(group, tmp1, heap[i / 2], heap[i], ctx)) - goto err; - if (!bn_copy(heap[i], tmp0)) - goto err; - if (!bn_copy(heap[i + 1], tmp1)) + for (i = 1; i < num; i++) { + if (!BN_is_zero(points[i]->Z)) { + if (!group->meth->field_mul(group, prod_Z[i], + prod_Z[i - 1], points[i]->Z, ctx)) goto err; } else { - if (!bn_copy(heap[i], heap[i / 2])) + if (!bn_copy(prod_Z[i], prod_Z[i - 1])) goto err; } } /* - * we have replaced all non-zero Z's by their inverses, now fix up - * all the points + * Now use a single explicit inversion to replace every non-zero + * points[i]->Z by its inverse. */ + if (!BN_mod_inverse_nonct(tmp, prod_Z[num - 1], group->p, ctx)) { + ECerror(ERR_R_BN_LIB); + goto err; + } + + if (group->meth->field_encode != NULL) { + /* + * In the Montgomery case we just turned R*H (representing H) + * into 1/(R*H), but we need R*(1/H) (representing 1/H); i.e., + * we need to multiply by the Montgomery factor twice. + */ + if (!group->meth->field_encode(group, tmp, tmp, ctx)) + goto err; + if (!group->meth->field_encode(group, tmp, tmp, ctx)) + goto err; + } + + for (i = num - 1; i > 0; i--) { + /* + * Loop invariant: tmp is the product of the inverses of + * points[0]->Z, ..., points[i]->Z (zero-valued inputs skipped). + */ + if (BN_is_zero(points[i]->Z)) + continue; + + /* Set tmp_Z to the inverse of points[i]->Z. */ + if (!group->meth->field_mul(group, tmp_Z, prod_Z[i - 1], tmp, ctx)) + goto err; + /* Adjust tmp to satisfy loop invariant. */ + if (!group->meth->field_mul(group, tmp, tmp, points[i]->Z, ctx)) + goto err; + /* Replace points[i]->Z by its inverse. */ + if (!bn_copy(points[i]->Z, tmp_Z)) + goto err; + } + + if (!BN_is_zero(points[0]->Z)) { + /* Replace points[0]->Z by its inverse. */ + if (!bn_copy(points[0]->Z, tmp)) + goto err; + } + + /* Finally, fix up the X and Y coordinates for all points. */ for (i = 0; i < num; i++) { EC_POINT *p = points[i]; - if (!BN_is_zero(&p->Z)) { - /* turn (X, Y, 1/Z) into (X/Z^2, Y/Z^3, 1) */ + if (BN_is_zero(p->Z)) + continue; - if (!group->meth->field_sqr(group, tmp1, &p->Z, ctx)) - goto err; - if (!group->meth->field_mul(group, &p->X, &p->X, tmp1, ctx)) - goto err; + /* turn (X, Y, 1/Z) into (X/Z^2, Y/Z^3, 1) */ - if (!group->meth->field_mul(group, tmp1, tmp1, &p->Z, ctx)) - goto err; - if (!group->meth->field_mul(group, &p->Y, &p->Y, tmp1, ctx)) - goto err; + if (!group->meth->field_sqr(group, tmp, p->Z, ctx)) + goto err; + if (!group->meth->field_mul(group, p->X, p->X, tmp, ctx)) + goto err; - if (group->meth->field_set_to_one != NULL) { - if (!group->meth->field_set_to_one(group, &p->Z, ctx)) - goto err; - } else { - if (!BN_one(&p->Z)) - goto err; - } - p->Z_is_one = 1; - } + if (!group->meth->field_mul(group, tmp, tmp, p->Z, ctx)) + goto err; + if (!group->meth->field_mul(group, p->Y, p->Y, tmp, ctx)) + goto err; + + if (!bn_copy(p->Z, one)) + goto err; + p->Z_is_one = 1; } ret = 1; err: BN_CTX_end(ctx); + free(prod_Z); - if (heap != NULL) { - /* - * heap[pow2/2] .. heap[pow2-1] have not been allocated - * locally! - */ - for (i = pow2 / 2 - 1; i > 0; i--) { - BN_free(heap[i]); - } - free(heap); - } return ret; } -int -ec_GFp_simple_field_mul(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) +static int +ec_field_mul(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, + BN_CTX *ctx) { - return BN_mod_mul(r, a, b, &group->field, ctx); + return BN_mod_mul(r, a, b, group->p, ctx); } -int -ec_GFp_simple_field_sqr(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) +static int +ec_field_sqr(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, BN_CTX *ctx) { - return BN_mod_sqr(r, a, &group->field, ctx); + return BN_mod_sqr(r, a, group->p, ctx); } /* - * Apply randomization of EC point projective coordinates: + * Apply randomization of EC point Jacobian projective coordinates: * * (X, Y, Z) = (lambda^2 * X, lambda^3 * Y, lambda * Z) * - * where lambda is in the interval [1, group->field). + * where lambda is in the interval [1, p). */ -int -ec_GFp_simple_blind_coordinates(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx) +static int +ec_blind_coordinates(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx) { BIGNUM *lambda = NULL; BIGNUM *tmp = NULL; @@ -1226,8 +1090,8 @@ ec_GFp_simple_blind_coordinates(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx) if ((tmp = BN_CTX_get(ctx)) == NULL) goto err; - /* Generate lambda in [1, group->field). */ - if (!bn_rand_interval(lambda, 1, &group->field)) + /* Generate lambda in [1, p). */ + if (!bn_rand_interval(lambda, 1, group->p)) goto err; if (group->meth->field_encode != NULL && @@ -1235,7 +1099,7 @@ ec_GFp_simple_blind_coordinates(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx) goto err; /* Z = lambda * Z */ - if (!group->meth->field_mul(group, &p->Z, lambda, &p->Z, ctx)) + if (!group->meth->field_mul(group, p->Z, lambda, p->Z, ctx)) goto err; /* tmp = lambda^2 */ @@ -1243,7 +1107,7 @@ ec_GFp_simple_blind_coordinates(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx) goto err; /* X = lambda^2 * X */ - if (!group->meth->field_mul(group, &p->X, tmp, &p->X, ctx)) + if (!group->meth->field_mul(group, p->X, tmp, p->X, ctx)) goto err; /* tmp = lambda^3 */ @@ -1251,7 +1115,7 @@ ec_GFp_simple_blind_coordinates(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx) goto err; /* Y = lambda^3 * Y */ - if (!group->meth->field_mul(group, &p->Y, tmp, &p->Y, ctx)) + if (!group->meth->field_mul(group, p->Y, tmp, p->Y, ctx)) goto err; /* Disable optimized arithmetics after replacing Z by lambda * Z. */ @@ -1265,15 +1129,15 @@ ec_GFp_simple_blind_coordinates(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx) } #define EC_POINT_BN_set_flags(P, flags) do { \ - BN_set_flags(&(P)->X, (flags)); \ - BN_set_flags(&(P)->Y, (flags)); \ - BN_set_flags(&(P)->Z, (flags)); \ + BN_set_flags((P)->X, (flags)); \ + BN_set_flags((P)->Y, (flags)); \ + BN_set_flags((P)->Z, (flags)); \ } while(0) #define EC_POINT_CSWAP(c, a, b, w, t) do { \ - if (!BN_swap_ct(c, &(a)->X, &(b)->X, w) || \ - !BN_swap_ct(c, &(a)->Y, &(b)->Y, w) || \ - !BN_swap_ct(c, &(a)->Z, &(b)->Z, w)) \ + if (!BN_swap_ct(c, (a)->X, (b)->X, w) || \ + !BN_swap_ct(c, (a)->Y, (b)->Y, w) || \ + !BN_swap_ct(c, (a)->Z, (b)->Z, w)) \ goto err; \ t = ((a)->Z_is_one ^ (b)->Z_is_one) & (c); \ (a)->Z_is_one ^= (t); \ @@ -1302,7 +1166,7 @@ ec_GFp_simple_blind_coordinates(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx) * Returns 1 on success, 0 otherwise. */ static int -ec_GFp_simple_mul_ct(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, +ec_mul_ct(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, const EC_POINT *point, BN_CTX *ctx) { int i, cardinality_bits, group_top, kbit, pbit, Z_is_one; @@ -1333,7 +1197,7 @@ ec_GFp_simple_mul_ct(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, goto err; if ((k = BN_CTX_get(ctx)) == NULL) goto err; - if (!BN_mul(cardinality, &group->order, &group->cofactor, ctx)) + if (!BN_mul(cardinality, group->order, group->cofactor, ctx)) goto err; /* @@ -1375,20 +1239,20 @@ ec_GFp_simple_mul_ct(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, if (!BN_swap_ct(kbit, k, lambda, group_top + 2)) goto err; - group_top = group->field.top; - if (!bn_wexpand(&s->X, group_top) || - !bn_wexpand(&s->Y, group_top) || - !bn_wexpand(&s->Z, group_top) || - !bn_wexpand(&r->X, group_top) || - !bn_wexpand(&r->Y, group_top) || - !bn_wexpand(&r->Z, group_top)) + group_top = group->p->top; + if (!bn_wexpand(s->X, group_top) || + !bn_wexpand(s->Y, group_top) || + !bn_wexpand(s->Z, group_top) || + !bn_wexpand(r->X, group_top) || + !bn_wexpand(r->Y, group_top) || + !bn_wexpand(r->Z, group_top)) goto err; /* * Apply coordinate blinding for EC_POINT if the underlying EC_METHOD * implements it. */ - if (!ec_point_blind_coordinates(group, s, ctx)) + if (!ec_blind_coordinates(group, s, ctx)) goto err; /* top bit is a 1, in a fixed pos */ @@ -1488,68 +1352,123 @@ ec_GFp_simple_mul_ct(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, #undef EC_POINT_BN_set_flags #undef EC_POINT_CSWAP -int -ec_GFp_simple_mul_generator_ct(const EC_GROUP *group, EC_POINT *r, - const BIGNUM *scalar, BN_CTX *ctx) -{ - return ec_GFp_simple_mul_ct(group, r, scalar, NULL, ctx); -} - -int -ec_GFp_simple_mul_single_ct(const EC_GROUP *group, EC_POINT *r, - const BIGNUM *scalar, const EC_POINT *point, BN_CTX *ctx) -{ - return ec_GFp_simple_mul_ct(group, r, scalar, point, ctx); -} - -int -ec_GFp_simple_mul_double_nonct(const EC_GROUP *group, EC_POINT *r, - const BIGNUM *g_scalar, const BIGNUM *p_scalar, const EC_POINT *point, +static int +ec_mul_generator_ct(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, BN_CTX *ctx) { - return ec_wNAF_mul(group, r, g_scalar, 1, &point, &p_scalar, ctx); + return ec_mul_ct(group, r, scalar, NULL, ctx); +} + +static int +ec_mul_single_ct(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, + const EC_POINT *point, BN_CTX *ctx) +{ + return ec_mul_ct(group, r, scalar, point, ctx); +} + +static int +ec_mul_double_nonct(const EC_GROUP *group, EC_POINT *r, const BIGNUM *g_scalar, + const BIGNUM *p_scalar, const EC_POINT *point, BN_CTX *ctx) +{ + return ec_wnaf_mul(group, r, g_scalar, point, p_scalar, ctx); +} + +static int +ec_mont_group_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx) +{ + BN_MONT_CTX *mont = NULL; + int ret = 0; + + BN_MONT_CTX_free(group->mont_ctx); + group->mont_ctx = NULL; + + if ((mont = BN_MONT_CTX_new()) == NULL) + goto err; + if (!BN_MONT_CTX_set(mont, p, ctx)) { + ECerror(ERR_R_BN_LIB); + goto err; + } + group->mont_ctx = mont; + mont = NULL; + + if (!ec_group_set_curve(group, p, a, b, ctx)) { + BN_MONT_CTX_free(group->mont_ctx); + group->mont_ctx = NULL; + goto err; + } + + ret = 1; + + err: + BN_MONT_CTX_free(mont); + + return ret; +} + +static int +ec_mont_field_mul(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, + const BIGNUM *b, BN_CTX *ctx) +{ + if (group->mont_ctx == NULL) { + ECerror(EC_R_NOT_INITIALIZED); + return 0; + } + return BN_mod_mul_montgomery(r, a, b, group->mont_ctx, ctx); +} + +static int +ec_mont_field_sqr(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, + BN_CTX *ctx) +{ + if (group->mont_ctx == NULL) { + ECerror(EC_R_NOT_INITIALIZED); + return 0; + } + return BN_mod_mul_montgomery(r, a, a, group->mont_ctx, ctx); +} + +static int +ec_mont_field_encode(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, + BN_CTX *ctx) +{ + if (group->mont_ctx == NULL) { + ECerror(EC_R_NOT_INITIALIZED); + return 0; + } + return BN_to_montgomery(r, a, group->mont_ctx, ctx); +} + +static int +ec_mont_field_decode(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, + BN_CTX *ctx) +{ + if (group->mont_ctx == NULL) { + ECerror(EC_R_NOT_INITIALIZED); + return 0; + } + return BN_from_montgomery(r, a, group->mont_ctx, ctx); } static const EC_METHOD ec_GFp_simple_method = { .field_type = NID_X9_62_prime_field, - .group_init = ec_GFp_simple_group_init, - .group_finish = ec_GFp_simple_group_finish, - .group_copy = ec_GFp_simple_group_copy, - .group_set_curve = ec_GFp_simple_group_set_curve, - .group_get_curve = ec_GFp_simple_group_get_curve, - .group_get_degree = ec_GFp_simple_group_get_degree, - .group_order_bits = ec_group_simple_order_bits, - .group_check_discriminant = ec_GFp_simple_group_check_discriminant, - .point_init = ec_GFp_simple_point_init, - .point_finish = ec_GFp_simple_point_finish, - .point_copy = ec_GFp_simple_point_copy, - .point_set_to_infinity = ec_GFp_simple_point_set_to_infinity, - .point_set_Jprojective_coordinates = - ec_GFp_simple_set_Jprojective_coordinates, - .point_get_Jprojective_coordinates = - ec_GFp_simple_get_Jprojective_coordinates, - .point_set_affine_coordinates = - ec_GFp_simple_point_set_affine_coordinates, - .point_get_affine_coordinates = - ec_GFp_simple_point_get_affine_coordinates, - .point_set_compressed_coordinates = - ec_GFp_simple_set_compressed_coordinates, - .point2oct = ec_GFp_simple_point2oct, - .oct2point = ec_GFp_simple_oct2point, - .add = ec_GFp_simple_add, - .dbl = ec_GFp_simple_dbl, - .invert = ec_GFp_simple_invert, - .is_at_infinity = ec_GFp_simple_is_at_infinity, - .is_on_curve = ec_GFp_simple_is_on_curve, - .point_cmp = ec_GFp_simple_cmp, - .make_affine = ec_GFp_simple_make_affine, - .points_make_affine = ec_GFp_simple_points_make_affine, - .mul_generator_ct = ec_GFp_simple_mul_generator_ct, - .mul_single_ct = ec_GFp_simple_mul_single_ct, - .mul_double_nonct = ec_GFp_simple_mul_double_nonct, - .field_mul = ec_GFp_simple_field_mul, - .field_sqr = ec_GFp_simple_field_sqr, - .blind_coordinates = ec_GFp_simple_blind_coordinates, + .group_set_curve = ec_group_set_curve, + .group_get_curve = ec_group_get_curve, + .point_set_affine_coordinates = ec_point_set_affine_coordinates, + .point_get_affine_coordinates = ec_point_get_affine_coordinates, + .point_set_compressed_coordinates = ec_set_compressed_coordinates, + .add = ec_add, + .dbl = ec_dbl, + .invert = ec_invert, + .is_on_curve = ec_is_on_curve, + .point_cmp = ec_cmp, + .make_affine = ec_make_affine, + .points_make_affine = ec_points_make_affine, + .mul_generator_ct = ec_mul_generator_ct, + .mul_single_ct = ec_mul_single_ct, + .mul_double_nonct = ec_mul_double_nonct, + .field_mul = ec_field_mul, + .field_sqr = ec_field_sqr, }; const EC_METHOD * @@ -1558,3 +1477,33 @@ EC_GFp_simple_method(void) return &ec_GFp_simple_method; } LCRYPTO_ALIAS(EC_GFp_simple_method); + +static const EC_METHOD ec_GFp_mont_method = { + .field_type = NID_X9_62_prime_field, + .group_set_curve = ec_mont_group_set_curve, + .group_get_curve = ec_group_get_curve, + .point_set_affine_coordinates = ec_point_set_affine_coordinates, + .point_get_affine_coordinates = ec_point_get_affine_coordinates, + .point_set_compressed_coordinates = ec_set_compressed_coordinates, + .add = ec_add, + .dbl = ec_dbl, + .invert = ec_invert, + .is_on_curve = ec_is_on_curve, + .point_cmp = ec_cmp, + .make_affine = ec_make_affine, + .points_make_affine = ec_points_make_affine, + .mul_generator_ct = ec_mul_generator_ct, + .mul_single_ct = ec_mul_single_ct, + .mul_double_nonct = ec_mul_double_nonct, + .field_mul = ec_mont_field_mul, + .field_sqr = ec_mont_field_sqr, + .field_encode = ec_mont_field_encode, + .field_decode = ec_mont_field_decode, +}; + +const EC_METHOD * +EC_GFp_mont_method(void) +{ + return &ec_GFp_mont_method; +} +LCRYPTO_ALIAS(EC_GFp_mont_method); diff --git a/lib/libcrypto/ec/ecp_mont.c b/lib/libcrypto/ec/ecp_mont.c deleted file mode 100644 index 76d1f578e..000000000 --- a/lib/libcrypto/ec/ecp_mont.c +++ /dev/null @@ -1,272 +0,0 @@ -/* $OpenBSD: ecp_mont.c,v 1.30 2023/07/07 13:54:45 beck Exp $ */ -/* - * Originally written by Bodo Moeller for the OpenSSL project. - */ -/* ==================================================================== - * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ -/* ==================================================================== - * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. - * Portions of this software developed by SUN MICROSYSTEMS, INC., - * and contributed to the OpenSSL project. - */ - -#include - -#include "ec_local.h" - -static void -ec_GFp_mont_group_clear(EC_GROUP *group) -{ - BN_MONT_CTX_free(group->mont_ctx); - group->mont_ctx = NULL; - - BN_free(group->mont_one); - group->mont_one = NULL; -} - -static int -ec_GFp_mont_group_init(EC_GROUP *group) -{ - int ok; - - ok = ec_GFp_simple_group_init(group); - group->mont_ctx = NULL; - group->mont_one = NULL; - return ok; -} - -static void -ec_GFp_mont_group_finish(EC_GROUP *group) -{ - ec_GFp_mont_group_clear(group); - ec_GFp_simple_group_finish(group); -} - -static int -ec_GFp_mont_group_copy(EC_GROUP *dest, const EC_GROUP *src) -{ - ec_GFp_mont_group_clear(dest); - - if (!ec_GFp_simple_group_copy(dest, src)) - return 0; - - if (src->mont_ctx != NULL) { - dest->mont_ctx = BN_MONT_CTX_new(); - if (dest->mont_ctx == NULL) - return 0; - if (!BN_MONT_CTX_copy(dest->mont_ctx, src->mont_ctx)) - goto err; - } - if (src->mont_one != NULL) { - dest->mont_one = BN_dup(src->mont_one); - if (dest->mont_one == NULL) - goto err; - } - return 1; - - err: - if (dest->mont_ctx != NULL) { - BN_MONT_CTX_free(dest->mont_ctx); - dest->mont_ctx = NULL; - } - return 0; -} - -static int -ec_GFp_mont_group_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, - const BIGNUM *b, BN_CTX *ctx) -{ - BN_MONT_CTX *mont = NULL; - BIGNUM *one = NULL; - int ret = 0; - - ec_GFp_mont_group_clear(group); - - mont = BN_MONT_CTX_new(); - if (mont == NULL) - goto err; - if (!BN_MONT_CTX_set(mont, p, ctx)) { - ECerror(ERR_R_BN_LIB); - goto err; - } - one = BN_new(); - if (one == NULL) - goto err; - if (!BN_to_montgomery(one, BN_value_one(), mont, ctx)) - goto err; - - group->mont_ctx = mont; - mont = NULL; - group->mont_one = one; - one = NULL; - - ret = ec_GFp_simple_group_set_curve(group, p, a, b, ctx); - if (!ret) - ec_GFp_mont_group_clear(group); - - err: - BN_MONT_CTX_free(mont); - BN_free(one); - - return ret; -} - -static int -ec_GFp_mont_field_mul(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, - const BIGNUM *b, BN_CTX *ctx) -{ - if (group->mont_ctx == NULL) { - ECerror(EC_R_NOT_INITIALIZED); - return 0; - } - return BN_mod_mul_montgomery(r, a, b, group->mont_ctx, ctx); -} - -static int -ec_GFp_mont_field_sqr(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, - BN_CTX *ctx) -{ - if (group->mont_ctx == NULL) { - ECerror(EC_R_NOT_INITIALIZED); - return 0; - } - return BN_mod_mul_montgomery(r, a, a, group->mont_ctx, ctx); -} - -static int -ec_GFp_mont_field_encode(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, - BN_CTX *ctx) -{ - if (group->mont_ctx == NULL) { - ECerror(EC_R_NOT_INITIALIZED); - return 0; - } - return BN_to_montgomery(r, a, group->mont_ctx, ctx); -} - -static int -ec_GFp_mont_field_decode(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, - BN_CTX *ctx) -{ - if (group->mont_ctx == NULL) { - ECerror(EC_R_NOT_INITIALIZED); - return 0; - } - return BN_from_montgomery(r, a, group->mont_ctx, ctx); -} - -static int -ec_GFp_mont_field_set_to_one(const EC_GROUP *group, BIGNUM *r, BN_CTX *ctx) -{ - if (group->mont_one == NULL) { - ECerror(EC_R_NOT_INITIALIZED); - return 0; - } - if (!bn_copy(r, group->mont_one)) - return 0; - - return 1; -} - -static const EC_METHOD ec_GFp_mont_method = { - .field_type = NID_X9_62_prime_field, - .group_init = ec_GFp_mont_group_init, - .group_finish = ec_GFp_mont_group_finish, - .group_copy = ec_GFp_mont_group_copy, - .group_set_curve = ec_GFp_mont_group_set_curve, - .group_get_curve = ec_GFp_simple_group_get_curve, - .group_get_degree = ec_GFp_simple_group_get_degree, - .group_order_bits = ec_group_simple_order_bits, - .group_check_discriminant = ec_GFp_simple_group_check_discriminant, - .point_init = ec_GFp_simple_point_init, - .point_finish = ec_GFp_simple_point_finish, - .point_copy = ec_GFp_simple_point_copy, - .point_set_to_infinity = ec_GFp_simple_point_set_to_infinity, - .point_set_Jprojective_coordinates = - ec_GFp_simple_set_Jprojective_coordinates, - .point_get_Jprojective_coordinates = - ec_GFp_simple_get_Jprojective_coordinates, - .point_set_affine_coordinates = - ec_GFp_simple_point_set_affine_coordinates, - .point_get_affine_coordinates = - ec_GFp_simple_point_get_affine_coordinates, - .point_set_compressed_coordinates = - ec_GFp_simple_set_compressed_coordinates, - .point2oct = ec_GFp_simple_point2oct, - .oct2point = ec_GFp_simple_oct2point, - .add = ec_GFp_simple_add, - .dbl = ec_GFp_simple_dbl, - .invert = ec_GFp_simple_invert, - .is_at_infinity = ec_GFp_simple_is_at_infinity, - .is_on_curve = ec_GFp_simple_is_on_curve, - .point_cmp = ec_GFp_simple_cmp, - .make_affine = ec_GFp_simple_make_affine, - .points_make_affine = ec_GFp_simple_points_make_affine, - .mul_generator_ct = ec_GFp_simple_mul_generator_ct, - .mul_single_ct = ec_GFp_simple_mul_single_ct, - .mul_double_nonct = ec_GFp_simple_mul_double_nonct, - .field_mul = ec_GFp_mont_field_mul, - .field_sqr = ec_GFp_mont_field_sqr, - .field_encode = ec_GFp_mont_field_encode, - .field_decode = ec_GFp_mont_field_decode, - .field_set_to_one = ec_GFp_mont_field_set_to_one, - .blind_coordinates = ec_GFp_simple_blind_coordinates, -}; - -const EC_METHOD * -EC_GFp_mont_method(void) -{ - return &ec_GFp_mont_method; -} -LCRYPTO_ALIAS(EC_GFp_mont_method); diff --git a/lib/libcrypto/ec/ecp_oct.c b/lib/libcrypto/ec/ecp_oct.c deleted file mode 100644 index b3cf44165..000000000 --- a/lib/libcrypto/ec/ecp_oct.c +++ /dev/null @@ -1,365 +0,0 @@ -/* $OpenBSD: ecp_oct.c,v 1.21 2023/04/18 18:29:32 tb Exp $ */ -/* Includes code written by Lenka Fibikova - * for the OpenSSL project. - * Includes code written by Bodo Moeller for the OpenSSL project. -*/ -/* ==================================================================== - * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ -/* ==================================================================== - * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. - * Portions of this software developed by SUN MICROSYSTEMS, INC., - * and contributed to the OpenSSL project. - */ - -#include - -#include "ec_local.h" - -int -ec_GFp_simple_set_compressed_coordinates(const EC_GROUP *group, - EC_POINT *point, const BIGNUM *x_, int y_bit, BN_CTX *ctx) -{ - BIGNUM *tmp1, *tmp2, *x, *y; - int ret = 0; - - /* clear error queue */ - ERR_clear_error(); - - y_bit = (y_bit != 0); - - BN_CTX_start(ctx); - - if ((tmp1 = BN_CTX_get(ctx)) == NULL) - goto err; - if ((tmp2 = BN_CTX_get(ctx)) == NULL) - goto err; - if ((x = BN_CTX_get(ctx)) == NULL) - goto err; - if ((y = BN_CTX_get(ctx)) == NULL) - goto err; - - /* - * Recover y. We have a Weierstrass equation y^2 = x^3 + a*x + b, so - * y is one of the square roots of x^3 + a*x + b. - */ - - /* tmp1 := x^3 */ - if (!BN_nnmod(x, x_, &group->field, ctx)) - goto err; - if (group->meth->field_decode == NULL) { - /* field_{sqr,mul} work on standard representation */ - if (!group->meth->field_sqr(group, tmp2, x_, ctx)) - goto err; - if (!group->meth->field_mul(group, tmp1, tmp2, x_, ctx)) - goto err; - } else { - if (!BN_mod_sqr(tmp2, x_, &group->field, ctx)) - goto err; - if (!BN_mod_mul(tmp1, tmp2, x_, &group->field, ctx)) - goto err; - } - - /* tmp1 := tmp1 + a*x */ - if (group->a_is_minus3) { - if (!BN_mod_lshift1_quick(tmp2, x, &group->field)) - goto err; - if (!BN_mod_add_quick(tmp2, tmp2, x, &group->field)) - goto err; - if (!BN_mod_sub_quick(tmp1, tmp1, tmp2, &group->field)) - goto err; - } else { - if (group->meth->field_decode) { - if (!group->meth->field_decode(group, tmp2, &group->a, ctx)) - goto err; - if (!BN_mod_mul(tmp2, tmp2, x, &group->field, ctx)) - goto err; - } else { - /* field_mul works on standard representation */ - if (!group->meth->field_mul(group, tmp2, &group->a, x, ctx)) - goto err; - } - - if (!BN_mod_add_quick(tmp1, tmp1, tmp2, &group->field)) - goto err; - } - - /* tmp1 := tmp1 + b */ - if (group->meth->field_decode != NULL) { - if (!group->meth->field_decode(group, tmp2, &group->b, ctx)) - goto err; - if (!BN_mod_add_quick(tmp1, tmp1, tmp2, &group->field)) - goto err; - } else { - if (!BN_mod_add_quick(tmp1, tmp1, &group->b, &group->field)) - goto err; - } - - if (!BN_mod_sqrt(y, tmp1, &group->field, ctx)) { - unsigned long err = ERR_peek_last_error(); - - if (ERR_GET_LIB(err) == ERR_LIB_BN && ERR_GET_REASON(err) == BN_R_NOT_A_SQUARE) { - ERR_clear_error(); - ECerror(EC_R_INVALID_COMPRESSED_POINT); - } else - ECerror(ERR_R_BN_LIB); - goto err; - } - if (y_bit != BN_is_odd(y)) { - if (BN_is_zero(y)) { - ECerror(EC_R_INVALID_COMPRESSION_BIT); - goto err; - } - if (!BN_usub(y, &group->field, y)) - goto err; - if (y_bit != BN_is_odd(y)) { - ECerror(ERR_R_INTERNAL_ERROR); - goto err; - } - } - if (!EC_POINT_set_affine_coordinates(group, point, x, y, ctx)) - goto err; - - ret = 1; - - err: - BN_CTX_end(ctx); - - return ret; -} - -size_t -ec_GFp_simple_point2oct(const EC_GROUP *group, const EC_POINT *point, - point_conversion_form_t form, unsigned char *buf, size_t len, BN_CTX *ctx) -{ - BIGNUM *x, *y; - size_t field_len, i, skip; - size_t ret = 0; - - if (form != POINT_CONVERSION_COMPRESSED && - form != POINT_CONVERSION_UNCOMPRESSED && - form != POINT_CONVERSION_HYBRID) { - ECerror(EC_R_INVALID_FORM); - return 0; - } - - if (EC_POINT_is_at_infinity(group, point) > 0) { - /* encodes to a single 0 octet */ - if (buf != NULL) { - if (len < 1) { - ECerror(EC_R_BUFFER_TOO_SMALL); - return 0; - } - buf[0] = 0; - } - return 1; - } - - /* ret := required output buffer length */ - field_len = BN_num_bytes(&group->field); - ret = (form == POINT_CONVERSION_COMPRESSED) ? 1 + field_len : 1 + 2 * field_len; - - BN_CTX_start(ctx); - - /* if 'buf' is NULL, just return required length */ - if (buf != NULL) { - if (len < ret) { - ECerror(EC_R_BUFFER_TOO_SMALL); - goto err; - } - - if ((x = BN_CTX_get(ctx)) == NULL) - goto err; - if ((y = BN_CTX_get(ctx)) == NULL) - goto err; - - if (!EC_POINT_get_affine_coordinates(group, point, x, y, ctx)) - goto err; - - if ((form == POINT_CONVERSION_COMPRESSED || form == POINT_CONVERSION_HYBRID) && BN_is_odd(y)) - buf[0] = form + 1; - else - buf[0] = form; - - i = 1; - - skip = field_len - BN_num_bytes(x); - if (skip > field_len) { - ECerror(ERR_R_INTERNAL_ERROR); - goto err; - } - while (skip > 0) { - buf[i++] = 0; - skip--; - } - skip = BN_bn2bin(x, buf + i); - i += skip; - if (i != 1 + field_len) { - ECerror(ERR_R_INTERNAL_ERROR); - goto err; - } - if (form == POINT_CONVERSION_UNCOMPRESSED || form == POINT_CONVERSION_HYBRID) { - skip = field_len - BN_num_bytes(y); - if (skip > field_len) { - ECerror(ERR_R_INTERNAL_ERROR); - goto err; - } - while (skip > 0) { - buf[i++] = 0; - skip--; - } - skip = BN_bn2bin(y, buf + i); - i += skip; - } - if (i != ret) { - ECerror(ERR_R_INTERNAL_ERROR); - goto err; - } - } - - err: - BN_CTX_end(ctx); - - return ret; -} - -int -ec_GFp_simple_oct2point(const EC_GROUP *group, EC_POINT *point, - const unsigned char *buf, size_t len, BN_CTX *ctx) -{ - point_conversion_form_t form; - int y_bit; - BIGNUM *x, *y; - size_t field_len, enc_len; - int ret = 0; - - if (len == 0) { - ECerror(EC_R_BUFFER_TOO_SMALL); - return 0; - } - form = buf[0]; - y_bit = form & 1; - form = form & ~1U; - if ((form != 0) && (form != POINT_CONVERSION_COMPRESSED) - && (form != POINT_CONVERSION_UNCOMPRESSED) - && (form != POINT_CONVERSION_HYBRID)) { - ECerror(EC_R_INVALID_ENCODING); - return 0; - } - if ((form == 0 || form == POINT_CONVERSION_UNCOMPRESSED) && y_bit) { - ECerror(EC_R_INVALID_ENCODING); - return 0; - } - if (form == 0) { - if (len != 1) { - ECerror(EC_R_INVALID_ENCODING); - return 0; - } - return EC_POINT_set_to_infinity(group, point); - } - field_len = BN_num_bytes(&group->field); - enc_len = (form == POINT_CONVERSION_COMPRESSED) ? 1 + field_len : 1 + 2 * field_len; - - if (len != enc_len) { - ECerror(EC_R_INVALID_ENCODING); - return 0; - } - - BN_CTX_start(ctx); - - if ((x = BN_CTX_get(ctx)) == NULL) - goto err; - if ((y = BN_CTX_get(ctx)) == NULL) - goto err; - - if (!BN_bin2bn(buf + 1, field_len, x)) - goto err; - if (BN_ucmp(x, &group->field) >= 0) { - ECerror(EC_R_INVALID_ENCODING); - goto err; - } - if (form == POINT_CONVERSION_COMPRESSED) { - /* - * EC_POINT_set_compressed_coordinates checks that the point - * is on the curve as required by X9.62. - */ - if (!EC_POINT_set_compressed_coordinates(group, point, x, y_bit, ctx)) - goto err; - } else { - if (!BN_bin2bn(buf + 1 + field_len, field_len, y)) - goto err; - if (BN_ucmp(y, &group->field) >= 0) { - ECerror(EC_R_INVALID_ENCODING); - goto err; - } - if (form == POINT_CONVERSION_HYBRID) { - if (y_bit != BN_is_odd(y)) { - ECerror(EC_R_INVALID_ENCODING); - goto err; - } - } - /* - * EC_POINT_set_affine_coordinates checks that the point is - * on the curve as required by X9.62. - */ - if (!EC_POINT_set_affine_coordinates(group, point, x, y, ctx)) - goto err; - } - - ret = 1; - - err: - BN_CTX_end(ctx); - - return ret; -} diff --git a/lib/libcrypto/err/err.c b/lib/libcrypto/err/err.c index ae20463cf..25fbb0387 100644 --- a/lib/libcrypto/err/err.c +++ b/lib/libcrypto/err/err.c @@ -1,4 +1,4 @@ -/* $OpenBSD: err.c,v 1.73 2024/10/11 13:32:22 tb Exp $ */ +/* $OpenBSD: err.c,v 1.75 2024/11/02 12:46:36 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -122,13 +122,11 @@ #include #include -#include "crypto_local.h" - DECLARE_LHASH_OF(ERR_STRING_DATA); DECLARE_LHASH_OF(ERR_STATE); typedef struct err_state_st { - CRYPTO_THREADID tid; + pthread_t tid; int err_flags[ERR_NUM_ERRORS]; unsigned long err_buffer[ERR_NUM_ERRORS]; char *err_data[ERR_NUM_ERRORS]; @@ -350,14 +348,14 @@ err_del_item(const ERR_STRING_DATA *d) static unsigned long err_state_hash(const ERR_STATE *a) { - return CRYPTO_THREADID_hash(&a->tid) * 13; + return 13 * (unsigned long)a->tid; } static IMPLEMENT_LHASH_HASH_FN(err_state, ERR_STATE) static int err_state_cmp(const ERR_STATE *a, const ERR_STATE *b) { - return CRYPTO_THREADID_cmp(&a->tid, &b->tid); + return pthread_equal(a->tid, b->tid) == 0; } static IMPLEMENT_LHASH_COMP_FN(err_state, ERR_STATE) @@ -557,10 +555,8 @@ ERR_get_state(void) static ERR_STATE fallback; ERR_STATE *ret, tmp, *tmpp = NULL; int i; - CRYPTO_THREADID tid; - CRYPTO_THREADID_current(&tid); - CRYPTO_THREADID_cpy(&tmp.tid, &tid); + tmp.tid = pthread_self(); ret = err_thread_get_item(&tmp); /* ret == the error state, if NULL, make a new one */ @@ -568,7 +564,7 @@ ERR_get_state(void) ret = malloc(sizeof(ERR_STATE)); if (ret == NULL) return (&fallback); - CRYPTO_THREADID_cpy(&ret->tid, &tid); + ret->tid = pthread_self(); ret->top = 0; ret->bottom = 0; for (i = 0; i < ERR_NUM_ERRORS; i++) { @@ -757,10 +753,8 @@ ERR_remove_thread_state(const CRYPTO_THREADID *id) { ERR_STATE tmp; - if (id) - CRYPTO_THREADID_cpy(&tmp.tid, id); - else - CRYPTO_THREADID_current(&tmp.tid); + OPENSSL_assert(id == NULL); + tmp.tid = pthread_self(); /* * err_thread_del_item automatically destroys the LHASH if the number of diff --git a/lib/libcrypto/err/err_prn.c b/lib/libcrypto/err/err_prn.c index fb6e19c54..4bd9482e6 100644 --- a/lib/libcrypto/err/err_prn.c +++ b/lib/libcrypto/err/err_prn.c @@ -1,4 +1,4 @@ -/* $OpenBSD: err_prn.c,v 1.23 2024/03/02 11:37:13 tb Exp $ */ +/* $OpenBSD: err_prn.c,v 1.24 2024/11/02 08:54:40 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -57,6 +57,7 @@ */ #include +#include #include #include @@ -66,7 +67,6 @@ #include #include "bio_local.h" -#include "crypto_local.h" void ERR_print_errors_cb(int (*cb)(const char *str, size_t len, void *u), void *u) @@ -77,10 +77,8 @@ ERR_print_errors_cb(int (*cb)(const char *str, size_t len, void *u), void *u) const char *file, *data; int line, flags; unsigned long es; - CRYPTO_THREADID cur; - CRYPTO_THREADID_current(&cur); - es = CRYPTO_THREADID_hash(&cur); + es = (unsigned long)pthread_self(); while ((l = ERR_get_error_line_data(&file, &line, &data, &flags)) != 0) { ERR_error_string_n(l, buf, sizeof buf); diff --git a/lib/libcrypto/evp/e_chacha20poly1305.c b/lib/libcrypto/evp/e_chacha20poly1305.c index 816a8aa21..d176569f9 100644 --- a/lib/libcrypto/evp/e_chacha20poly1305.c +++ b/lib/libcrypto/evp/e_chacha20poly1305.c @@ -1,4 +1,4 @@ -/* $OpenBSD: e_chacha20poly1305.c,v 1.36 2024/05/22 14:02:08 tb Exp $ */ +/* $OpenBSD: e_chacha20poly1305.c,v 1.37 2024/12/20 20:05:29 schwarze Exp $ */ /* * Copyright (c) 2022 Joel Sing @@ -592,7 +592,7 @@ chacha20_poly1305_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr) return 1; } - return 0; + return -1; } static const EVP_CIPHER cipher_chacha20_poly1305 = { diff --git a/lib/libcrypto/format-pem.pl b/lib/libcrypto/format-pem.pl index 020240320..5a96fe5b1 100644 --- a/lib/libcrypto/format-pem.pl +++ b/lib/libcrypto/format-pem.pl @@ -1,5 +1,5 @@ #!/usr/bin/perl -# $OpenBSD: format-pem.pl,v 1.6 2022/07/03 15:02:04 sthen Exp $ +# $OpenBSD: format-pem.pl,v 1.7 2024/11/01 11:19:13 sthen Exp $ # # Copyright (c) 2016 Stuart Henderson # @@ -115,9 +115,9 @@ while(<>) { close $tmp; chomp $rcsid; print $rcsid; -foreach my $o (sort{lc($a) cmp lc($b)} keys %ca) { +foreach my $o (sort{$a cmp $b} keys %ca) { print "\n### $o\n\n"; - foreach my $subj (sort{lc($a) cmp lc($b)} keys %{ $ca{$o} }) { + foreach my $subj (sort{$a cmp $b} keys %{ $ca{$o} }) { if ($ca{$o}{$subj}{'valid'} == 1) { print "=== $subj\n"; print $ca{$o}{$subj}{'info'}; @@ -127,9 +127,9 @@ foreach my $o (sort{lc($a) cmp lc($b)} keys %ca) { } # print a visual summary at the end -foreach my $o (sort{lc($a) cmp lc($b)} keys %ca) { +foreach my $o (sort{$a cmp $b} keys %ca) { print STDERR "\n$o\n"; - foreach my $subj (sort{lc($a) cmp lc($b)} keys %{ $ca{$o} }) { + foreach my $subj (sort{$a cmp $b} keys %{ $ca{$o} }) { print STDERR " $subj\n"; } } diff --git a/lib/libcrypto/hidden/openssl/ec.h b/lib/libcrypto/hidden/openssl/ec.h index cb6975551..0b64474c4 100644 --- a/lib/libcrypto/hidden/openssl/ec.h +++ b/lib/libcrypto/hidden/openssl/ec.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ec.h,v 1.5 2024/04/10 15:01:31 beck Exp $ */ +/* $OpenBSD: ec.h,v 1.7 2024/10/22 15:54:33 tb Exp $ */ /* * Copyright (c) 2023 Bob Beck * diff --git a/lib/libcrypto/hidden/openssl/mlkem.h b/lib/libcrypto/hidden/openssl/mlkem.h new file mode 100644 index 000000000..8cd80eb3a --- /dev/null +++ b/lib/libcrypto/hidden/openssl/mlkem.h @@ -0,0 +1,49 @@ +/* $OpenBSD: mlkem.h,v 1.4 2024/12/20 15:10:31 tb Exp $ */ +/* + * Copyright (c) 2024 Bob Beck + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _LIBCRYPTO_MLKEM_H +#define _LIBCRYPTO_MLKEM_H + +/* Undo when making public */ +#ifdef LIBRESSL_HAS_MLKEM + +#ifndef _MSC_VER +#include_next +#else +#include "../include/openssl/mlkem.h" +#endif +#include "crypto_namespace.h" + +LCRYPTO_USED(MLKEM768_generate_key); +LCRYPTO_USED(MLKEM768_public_from_private); +LCRYPTO_USED(MLKEM768_encap); +LCRYPTO_USED(MLKEM768_decap); +LCRYPTO_USED(MLKEM768_marshal_public_key); +LCRYPTO_USED(MLKEM768_parse_public_key); +LCRYPTO_USED(MLKEM768_private_key_from_seed); +LCRYPTO_USED(MLKEM768_parse_private_key); +LCRYPTO_USED(MLKEM1024_generate_key); +LCRYPTO_USED(MLKEM1024_public_from_private); +LCRYPTO_USED(MLKEM1024_encap); +LCRYPTO_USED(MLKEM1024_decap); +LCRYPTO_USED(MLKEM1024_marshal_public_key); +LCRYPTO_USED(MLKEM1024_parse_public_key); +LCRYPTO_USED(MLKEM1024_private_key_from_seed); +LCRYPTO_USED(MLKEM1024_parse_private_key); +#endif /* LIBRESSL_HAS_MLKEM */ + +#endif /* _LIBCRYPTO_MLKEM_H */ diff --git a/lib/libcrypto/man/ASN1_BIT_STRING_set.3 b/lib/libcrypto/man/ASN1_BIT_STRING_set.3 index 5d863d19d..a916ca3ab 100644 --- a/lib/libcrypto/man/ASN1_BIT_STRING_set.3 +++ b/lib/libcrypto/man/ASN1_BIT_STRING_set.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ASN1_BIT_STRING_set.3,v 1.4 2023/07/28 05:53:10 tb Exp $ +.\" $OpenBSD: ASN1_BIT_STRING_set.3,v 1.5 2024/12/24 09:48:56 schwarze Exp $ .\" .\" Copyright (c) 2021 Ingo Schwarze .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: July 28 2023 $ +.Dd $Mdocdate: December 24 2024 $ .Dt ASN1_BIT_STRING_SET 3 .Os .Sh NAME @@ -126,7 +126,8 @@ or if the requested bit is not set. .Sh SEE ALSO .Xr ASN1_BIT_STRING_new 3 , .Xr ASN1_STRING_set 3 , -.Xr d2i_ASN1_BIT_STRING 3 +.Xr d2i_ASN1_BIT_STRING 3 , +.Xr v2i_ASN1_BIT_STRING 3 .Sh HISTORY .Fn ASN1_BIT_STRING_set first appeared in SSLeay 0.6.5. diff --git a/lib/libcrypto/man/ASN1_STRING_length.3 b/lib/libcrypto/man/ASN1_STRING_length.3 index 20834e081..0c397607a 100644 --- a/lib/libcrypto/man/ASN1_STRING_length.3 +++ b/lib/libcrypto/man/ASN1_STRING_length.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ASN1_STRING_length.3,v 1.29 2021/12/14 19:36:18 schwarze Exp $ +.\" $OpenBSD: ASN1_STRING_length.3,v 1.30 2024/12/27 15:30:17 schwarze Exp $ .\" full merge up to: OpenSSL 24a535ea Sep 22 13:14:20 2020 +0100 .\" .\" This file is a derived work. @@ -66,7 +66,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: December 14 2021 $ +.Dd $Mdocdate: December 27 2024 $ .Dt ASN1_STRING_LENGTH 3 .Os .Sh NAME @@ -401,11 +401,14 @@ and the reason can be determined with .Xr ERR_get_error 3 . .Sh SEE ALSO +.Xr a2i_ASN1_STRING 3 , +.Xr a2i_ipadd 3 , .Xr ASN1_BIT_STRING_set 3 , .Xr ASN1_mbstring_copy 3 , .Xr ASN1_PRINTABLE_type 3 , .Xr ASN1_STRING_new 3 , -.Xr ASN1_UNIVERSALSTRING_to_string 3 +.Xr ASN1_UNIVERSALSTRING_to_string 3 , +.Xr s2i_ASN1_INTEGER 3 .Sh HISTORY .Fn ASN1_STRING_cmp , .Fn ASN1_STRING_dup , diff --git a/lib/libcrypto/man/ASN1_STRING_new.3 b/lib/libcrypto/man/ASN1_STRING_new.3 index 19b0ca116..212bacd41 100644 --- a/lib/libcrypto/man/ASN1_STRING_new.3 +++ b/lib/libcrypto/man/ASN1_STRING_new.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ASN1_STRING_new.3,v 1.26 2024/03/05 18:30:40 tb Exp $ +.\" $OpenBSD: ASN1_STRING_new.3,v 1.27 2024/12/27 15:30:17 schwarze Exp $ .\" OpenSSL 99d63d46 Tue Mar 24 07:52:24 2015 -0400 .\" .\" Copyright (c) 2017 Ingo Schwarze @@ -15,7 +15,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: March 5 2024 $ +.Dd $Mdocdate: December 27 2024 $ .Dt ASN1_STRING_NEW 3 .Os .Sh NAME @@ -205,6 +205,7 @@ object if successful; otherwise is returned and an error code can be retrieved with .Xr ERR_get_error 3 . .Sh SEE ALSO +.Xr a2i_ipadd 3 , .Xr ASN1_BIT_STRING_set 3 , .Xr ASN1_INTEGER_get 3 , .Xr ASN1_item_pack 3 , @@ -218,6 +219,7 @@ is returned and an error code can be retrieved with .Xr d2i_ASN1_OBJECT 3 , .Xr d2i_ASN1_OCTET_STRING 3 , .Xr i2a_ASN1_STRING 3 , +.Xr s2i_ASN1_INTEGER 3 , .Xr X509_cmp_time 3 , .Xr X509_EXTENSION_get_object 3 , .Xr X509_get_ext_by_OBJ 3 , diff --git a/lib/libcrypto/man/ASN1_item_sign.3 b/lib/libcrypto/man/ASN1_item_sign.3 index b47fd1d04..8c09fe77f 100644 --- a/lib/libcrypto/man/ASN1_item_sign.3 +++ b/lib/libcrypto/man/ASN1_item_sign.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ASN1_item_sign.3,v 1.2 2021/12/18 17:47:44 schwarze Exp $ +.\" $OpenBSD: ASN1_item_sign.3,v 1.3 2024/12/06 12:51:13 schwarze Exp $ .\" .\" Copyright (c) 2021 Ingo Schwarze .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: December 18 2021 $ +.Dd $Mdocdate: December 6 2024 $ .Dt ASN1_ITEM_SIGN 3 .Os .Sh NAME @@ -91,12 +91,6 @@ Unless is .Dv NULL , the same data is copied into it. -.\" The following is not yet supported by LibreSSL -.\" because we do not provide EVP_PKEY_asn1_set_item(3). -.\" except that user-defined key types set up with -.\" .Xr EVP_PKEY_asn1_new 3 -.\" may optionally provide information about a second algorithm in -.\" .Fa algor2 . .Sh RETURN VALUES These functions return the length of the signature in bytes or 0 if memory allocation, encoding, or signing fails. @@ -113,8 +107,6 @@ is not fully initialized. .Xr EVP_Digest 3 , .Xr EVP_DigestSign 3 , .Xr EVP_MD_CTX_new 3 , -.\" We do not provide EVP_PKEY_asn1_set_item(3). -.\" .Xr EVP_PKEY_asn1_new 3 , .Xr EVP_PKEY_new 3 , .Xr OBJ_find_sigid_by_algs 3 , .Xr X509_ALGOR_new 3 diff --git a/lib/libcrypto/man/CMAC_Init.3 b/lib/libcrypto/man/CMAC_Init.3 index f4143cf45..fd32ca085 100644 --- a/lib/libcrypto/man/CMAC_Init.3 +++ b/lib/libcrypto/man/CMAC_Init.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: CMAC_Init.3,v 1.6 2024/03/02 09:30:21 tb Exp $ +.\" $OpenBSD: CMAC_Init.3,v 1.9 2024/11/12 00:42:28 schwarze Exp $ .\" .\" Copyright (c) 2020 Ingo Schwarze .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: March 2 2024 $ +.Dd $Mdocdate: November 12 2024 $ .Dt CMAC_INIT 3 .Os .Sh NAME @@ -51,6 +51,11 @@ .Fa "unsigned char *out_mac" .Fa "size_t *out_len" .Fc +.Ft int +.Fo CMAC_CTX_copy +.Fa "CMAC_CTX *out_ctx" +.Fa "CMAC_CTX *in_ctx" +.Fc .Ft EVP_CIPHER_CTX * .Fn CMAC_CTX_get0_cipher_ctx "CMAC_CTX *ctx" .Ft void @@ -64,13 +69,11 @@ arbitrary block cipher using a symmetric key. The present manual page describes low-level functions implementing CMAC. Instead of using these functions directly, application programs normally call -.Xr EVP_PKEY_CTX_new_id 3 -with an argument of -.Dv EVP_PKEY_CMAC +.Xr EVP_PKEY_new_CMAC_key 3 and then pass the resulting -.Vt EVP_MD_CTX +.Vt EVP_PKEY object to -.Xr EVP_DigestInit_ex 3 . +.Xr EVP_DigestSignInit 3 . .Pp The CMAC API is object-oriented. Calculating a message authentication code requires a @@ -100,7 +103,7 @@ for use by Functions to obtain suitable .Vt EVP_CIPHER objects are listed in the CIPHER LISTING section of the -.Xr EVP_Cipher 3 +.Xr EVP_EncryptInit 3 manual page. Unless .Fa key @@ -244,14 +247,14 @@ The CMAC code itself does not use the framework, so in general, the reasons for failure cannot be found out with .Xr ERR_get_error 3 . However, since the -.Xr EVP_Cipher 3 +.Xr EVP_EncryptInit 3 functions are used internally, entries may still get pushed onto the error stack in some cases of failure. .Sh SEE ALSO .Xr EVP_aes_128_cbc 3 , -.Xr EVP_Cipher 3 , -.Xr EVP_DigestInit 3 , -.Xr EVP_PKEY_CTX_new_id 3 , +.Xr EVP_DigestSignInit 3 , +.Xr EVP_EncryptInit 3 , +.Xr EVP_PKEY_new_CMAC_key 3 , .Xr HMAC 3 .Sh STANDARDS .Rs diff --git a/lib/libcrypto/man/CMS_add0_cert.3 b/lib/libcrypto/man/CMS_add0_cert.3 index c5a7367d2..be9357cc9 100644 --- a/lib/libcrypto/man/CMS_add0_cert.3 +++ b/lib/libcrypto/man/CMS_add0_cert.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: CMS_add0_cert.3,v 1.7 2019/11/02 15:39:46 schwarze Exp $ +.\" $OpenBSD: CMS_add0_cert.3,v 1.10 2024/11/30 21:21:40 tb Exp $ .\" full merge up to: OpenSSL e9b77246 Jan 20 19:58:49 2017 +0100 .\" .\" This file is a derived work. @@ -65,7 +65,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: November 2 2019 $ +.Dd $Mdocdate: November 30 2024 $ .Dt CMS_ADD0_CERT 3 .Os .Sh NAME @@ -183,9 +183,17 @@ and return the STACK of certificates or CRLs or .Dv NULL if there are none or an error occurs. -The only error which will occur in practice is if the +Possible errors are that the .Fa cms -type is invalid. +type is invalid or memory allocation failure. +Not all errors result in an error on the error stack. +The returned stack must be freed using the appropriate +macro wrapper of +.Xr sk_pop_free 3 , +namely +.Dv sk_X509_pop_free() +or +.Dv sk_X509_CRL_pop_free() . .Sh SEE ALSO .Xr CMS_ContentInfo_new 3 , .Xr CMS_encrypt 3 , diff --git a/lib/libcrypto/man/ECDSA_SIG_new.3 b/lib/libcrypto/man/ECDSA_SIG_new.3 index c9ef8e814..2b72e6f1b 100644 --- a/lib/libcrypto/man/ECDSA_SIG_new.3 +++ b/lib/libcrypto/man/ECDSA_SIG_new.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ECDSA_SIG_new.3,v 1.20 2023/08/29 10:07:42 tb Exp $ +.\" $OpenBSD: ECDSA_SIG_new.3,v 1.21 2024/11/15 20:14:58 tb Exp $ .\" full merge up to: OpenSSL e9b77246 Jan 20 19:58:49 2017 +0100 .\" selective merge up to: OpenSSL da4ea0cf Aug 5 16:13:24 2019 +0100 .\" @@ -50,7 +50,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: August 29 2023 $ +.Dd $Mdocdate: November 15 2024 $ .Dt ECDSA_SIG_NEW 3 .Os .Sh NAME @@ -342,8 +342,8 @@ error. The error codes can be obtained by .Xr ERR_get_error 3 . .Sh EXAMPLES -Creating an ECDSA signature of given SHA-1 hash value using the named -curve secp192k1. +Creating an ECDSA signature of given SHA-384 hash value using the named +curve secp384r1. .Pp First step: create an .Vt EC_KEY @@ -356,7 +356,7 @@ int ret; ECDSA_SIG *sig; EC_KEY *eckey; -eckey = EC_KEY_new_by_curve_name(NID_secp192k1); +eckey = EC_KEY_new_by_curve_name(NID_secp384r1); if (eckey == NULL) { /* error */ } @@ -365,10 +365,10 @@ if (!EC_KEY_generate_key(eckey)) { } .Ed .Pp -Second step: compute the ECDSA signature of a SHA-1 hash value using +Second step: compute the ECDSA signature of a SHA-384 hash value using .Fn ECDSA_do_sign .Bd -literal -offset indent -sig = ECDSA_do_sign(digest, 20, eckey); +sig = ECDSA_do_sign(digest, SHA384_DIGEST_LENGTH, eckey); if (sig == NULL) { /* error */ } @@ -391,12 +391,12 @@ if (!ECDSA_sign(0, dgst, dgstlen, pp, &buf_len, eckey) { Third step: verify the created ECDSA signature using .Fn ECDSA_do_verify .Pp -.Dl ret = ECDSA_do_verify(digest, 20, sig, eckey); +.Dl ret = ECDSA_do_verify(digest, SHA384_DIGEST_LENGTH, sig, eckey); .Pp or using .Fn ECDSA_verify .Pp -.Dl ret = ECDSA_verify(0, digest, 20, buffer, buf_len, eckey); +.Dl ret = ECDSA_verify(0, digest, SHA384_DIGEST_LENGTH, buffer, buf_len, eckey); .Pp and finally evaluate the return value: .Bd -literal -offset indent diff --git a/lib/libcrypto/man/EVP_BytesToKey.3 b/lib/libcrypto/man/EVP_BytesToKey.3 index 821259a51..1f78b4de0 100644 --- a/lib/libcrypto/man/EVP_BytesToKey.3 +++ b/lib/libcrypto/man/EVP_BytesToKey.3 @@ -1,5 +1,5 @@ -.\" $OpenBSD: EVP_BytesToKey.3,v 1.8 2019/06/07 20:46:25 schwarze Exp $ -.\" OpenSSL b97fdb57 Nov 11 09:33:09 2016 +0100 +.\" $OpenBSD: EVP_BytesToKey.3,v 1.9 2024/12/05 15:12:37 schwarze Exp $ +.\" full merge up to: OpenSSL b97fdb57 Nov 11 09:33:09 2016 +0100 .\" .\" This file was written by Dr. Stephen Henson . .\" Copyright (c) 2001, 2011, 2013, 2014, 2015 The OpenSSL Project. @@ -49,7 +49,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: June 7 2019 $ +.Dd $Mdocdate: December 5 2024 $ .Dt EVP_BYTESTOKEY 3 .Os .Sh NAME @@ -78,7 +78,9 @@ is the message digest to use. The .Fa salt parameter is used as a salt in the derivation: -it should point to an 8-byte buffer or +it should point to a buffer containing +.Dv PKCS5_SALT_LEN No = 8 +bytes or .Dv NULL if no salt is used. .Fa data diff --git a/lib/libcrypto/man/EVP_CIPHER_CTX_ctrl.3 b/lib/libcrypto/man/EVP_CIPHER_CTX_ctrl.3 index ba0e4b074..a75b722cd 100644 --- a/lib/libcrypto/man/EVP_CIPHER_CTX_ctrl.3 +++ b/lib/libcrypto/man/EVP_CIPHER_CTX_ctrl.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_CIPHER_CTX_ctrl.3,v 1.2 2023/10/01 18:23:50 tb Exp $ +.\" $OpenBSD: EVP_CIPHER_CTX_ctrl.3,v 1.3 2024/12/08 17:41:23 schwarze Exp $ .\" full merge up to: OpenSSL 5211e094 Nov 11 14:39:11 2014 -0800 .\" .\" This file is a derived work. @@ -67,7 +67,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: October 1 2023 $ +.Dd $Mdocdate: December 8 2024 $ .Dt EVP_CIPHER_CTX_CTRL 3 .Os .Sh NAME @@ -131,7 +131,9 @@ .Sh DESCRIPTION .Fn EVP_CIPHER_CTX_ctrl allows various cipher specific parameters to be determined and set. -Currently only the RC2 effective key length can be set. +Currently only the RC2 effective key length can be set; see +.Xr EVP_rc2_cbc 3 +for details. .Pp .Fn EVP_CIPHER_CTX_set_padding enables or disables padding. diff --git a/lib/libcrypto/man/EVP_CIPHER_CTX_init.3 b/lib/libcrypto/man/EVP_CIPHER_CTX_init.3 index f328fc05b..79a8e540a 100644 --- a/lib/libcrypto/man/EVP_CIPHER_CTX_init.3 +++ b/lib/libcrypto/man/EVP_CIPHER_CTX_init.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_CIPHER_CTX_init.3,v 1.3 2023/12/26 22:13:00 schwarze Exp $ +.\" $OpenBSD: EVP_CIPHER_CTX_init.3,v 1.4 2024/12/06 15:01:01 schwarze Exp $ .\" full merge up to: .\" OpenSSL EVP_EncryptInit.pod 0874d7f2 Oct 11 13:13:47 2022 +0100 .\" @@ -68,7 +68,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: December 26 2023 $ +.Dd $Mdocdate: December 6 2024 $ .Dt EVP_CIPHER_CTX_INIT 3 .Os .Sh NAME @@ -78,7 +78,7 @@ .Nd obsolete EVP cipher functions .Sh SYNOPSIS .In openssl/evp.h -.Ft void +.Ft int .Fo EVP_CIPHER_CTX_init .Fa "EVP_CIPHER_CTX *ctx" .Fc @@ -102,7 +102,8 @@ was made opaque. Calling it on a cipher context just returned from .Xr EVP_CIPHER_CTX_new 3 has no effect. -Calling it on a cipher context that was already used leaks memory. +Calling it on a cipher context that was already used may leak memory +with older versions of the library. Instead, use .Xr EVP_CIPHER_CTX_reset 3 or @@ -173,6 +174,9 @@ the overhead incurred by using .Xr EVP_CipherUpdate 3 is minimal. .Sh RETURN VALUES +.Fn EVP_CIPHER_CTX_init +always returns 1. +.Pp .Fn EVP_CIPHER_CTX_cleanup returns 1 for success or 0 for failure. .Pp diff --git a/lib/libcrypto/man/EVP_DigestInit.3 b/lib/libcrypto/man/EVP_DigestInit.3 index e2fd6525a..668c189bc 100644 --- a/lib/libcrypto/man/EVP_DigestInit.3 +++ b/lib/libcrypto/man/EVP_DigestInit.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_DigestInit.3,v 1.35 2024/08/30 07:03:19 tb Exp $ +.\" $OpenBSD: EVP_DigestInit.3,v 1.37 2024/12/06 15:01:01 schwarze Exp $ .\" full merge up to: OpenSSL 7f572e95 Dec 2 13:57:04 2015 +0000 .\" selective merge up to: OpenSSL 24a535ea Sep 22 13:14:20 2020 +0100 .\" @@ -70,7 +70,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: August 30 2024 $ +.Dd $Mdocdate: December 6 2024 $ .Dt EVP_DIGESTINIT 3 .Os .Sh NAME @@ -114,7 +114,7 @@ .Fo EVP_MD_CTX_free .Fa "EVP_MD_CTX *ctx" .Fc -.Ft void +.Ft int .Fo EVP_MD_CTX_init .Fa "EVP_MD_CTX *ctx" .Fc @@ -427,7 +427,8 @@ object or .Dv NULL for failure. .Pp -.Fn EVP_MD_CTX_reset +.Fn EVP_MD_CTX_reset , +.Fn EVP_MD_CTX_init , and .Fn EVP_MD_CTX_cleanup always return 1. @@ -530,7 +531,6 @@ main(int argc, char *argv[]) .Xr EVP_MD_CTX_ctrl 3 , .Xr EVP_MD_nid 3 , .Xr EVP_PKEY_CTX_set_signature_md 3 , -.Xr EVP_PKEY_meth_set_signctx 3 , .Xr EVP_sha1 3 , .Xr EVP_sha3_224 3 , .Xr EVP_SignInit 3 , diff --git a/lib/libcrypto/man/EVP_DigestSignInit.3 b/lib/libcrypto/man/EVP_DigestSignInit.3 index 92b656a10..caf519e28 100644 --- a/lib/libcrypto/man/EVP_DigestSignInit.3 +++ b/lib/libcrypto/man/EVP_DigestSignInit.3 @@ -1,8 +1,9 @@ -.\" $OpenBSD: EVP_DigestSignInit.3,v 1.13 2024/07/21 08:36:43 tb Exp $ -.\" OpenSSL 9b86974e Aug 17 15:21:33 2015 -0400 +.\" $OpenBSD: EVP_DigestSignInit.3,v 1.15 2024/12/06 14:27:49 schwarze Exp $ +.\" full merge up to: OpenSSL 28428130 Apr 17 15:18:40 2018 +0200 +.\" selective merge up to: OpenSSL 6328d367 Jul 4 21:58:30 2020 +0200 .\" .\" This file was written by Dr. Stephen Henson . -.\" Copyright (c) 2006, 2009, 2015, 2016 The OpenSSL Project. +.\" Copyright (c) 2006, 2009, 2015, 2016, 2017 The OpenSSL Project. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -49,7 +50,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: July 21 2024 $ +.Dd $Mdocdate: December 6 2024 $ .Dt EVP_DIGESTSIGNINIT 3 .Os .Sh NAME @@ -97,33 +98,35 @@ sets up the signing context .Fa ctx to use the digest .Fa type -and private key +and the private key .Fa pkey . +Before calling this function, obtain +.Fa ctx +from +.Xr EVP_MD_CTX_new 3 +or call +.Xr EVP_MD_CTX_reset 3 +on it. The -.Fa ENGINE *engine +.Fa engine argument is always ignored and passing .Dv NULL is recommended. -.Fa ctx -must be initialized with -.Xr EVP_MD_CTX_init 3 -before calling this function. +.Pp If .Fa pctx is not .Dv NULL , -the -.Vt EVP_PKEY_CTX -of the signing operation will be written to -.Pf * Fa pctx : -this can be used to set alternative signing options. -Any existing value in +any pointer passed in as .Pf * Fa pctx -will be overwritten. -The +is ignored and overwritten by an internal pointer to the .Vt EVP_PKEY_CTX -value returned must not be freed directly by the application. -It will be freed automatically when the +used by the signing operation: +this can be used to set alternative signing options. +The returned +.Vt EVP_PKEY_CTX +must not be freed by the application. +It is freed automatically when the .Vt EVP_MD_CTX is freed. .Pp @@ -226,8 +229,7 @@ The error codes can be obtained from .Sh SEE ALSO .Xr evp 3 , .Xr EVP_DigestInit 3 , -.Xr EVP_DigestVerifyInit 3 , -.Xr EVP_PKEY_meth_set_signctx 3 +.Xr EVP_DigestVerifyInit 3 .Sh HISTORY .Fn EVP_DigestSignInit , .Fn EVP_DigestSignUpdate , diff --git a/lib/libcrypto/man/EVP_DigestVerifyInit.3 b/lib/libcrypto/man/EVP_DigestVerifyInit.3 index b3286bf20..fa62f5a0a 100644 --- a/lib/libcrypto/man/EVP_DigestVerifyInit.3 +++ b/lib/libcrypto/man/EVP_DigestVerifyInit.3 @@ -1,8 +1,9 @@ -.\" $OpenBSD: EVP_DigestVerifyInit.3,v 1.15 2024/07/21 08:36:43 tb Exp $ -.\" OpenSSL fb552ac6 Sep 30 23:43:01 2009 +0000 +.\" $OpenBSD: EVP_DigestVerifyInit.3,v 1.17 2024/12/06 14:27:49 schwarze Exp $ +.\" full merge up to OpenSSL f097e875 Aug 23 11:37:22 2018 +0100 +.\" selective merge up to 24a535ea Sep 22 13:14:20 2020 +0100 .\" .\" This file was written by Dr. Stephen Henson . -.\" Copyright (c) 2006, 2009, 2014, 2015, 2016 The OpenSSL Project. +.\" Copyright (c) 2006, 2009, 2014, 2015, 2016, 2017 The OpenSSL Project. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -49,7 +50,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: July 21 2024 $ +.Dd $Mdocdate: December 6 2024 $ .Dt EVP_DIGESTVERIFYINIT 3 .Os .Sh NAME @@ -93,39 +94,41 @@ The EVP signature routines are a high-level interface to digital signatures. .Pp .Fn EVP_DigestVerifyInit -sets up verification context +sets up the verification context .Fa ctx -to use digest +to use the digest .Fa type -and public key +and the public key .Fa pkey . +Before calling this function, obtain .Fa ctx -must be initialized with -.Xr EVP_MD_CTX_init 3 -before calling this function. +from +.Xr EVP_MD_CTX_new 3 +or call +.Xr EVP_MD_CTX_reset 3 +on it. +The +.Fa engine +argument is always ignored and passing +.Dv NULL +is recommended. +.Pp If .Fa pctx is not .Dv NULL , -the +any pointer passed in as +.Pf * Fa pctx +is ignored and overwritten by an internal pointer to the .Vt EVP_PKEY_CTX -of the verification operation will be written to -.Pf * Fa pctx : -this can be used to set alternative verification options. -Any existing value in -.Pf * .Fa pctx -is overwritten. -The +used by the verification operation: +this can be used to set alternative signing options. +The returned .Vt EVP_PKEY_CTX -value returned must not be freed directly by the application. -It will be freed automatically when the +must not be freed by the application. +It is freed automatically when the .Vt EVP_MD_CTX is freed. -The -.Fa ENGINE *engine -argument is always ignored and passing -.Dv NULL -is recommended. .Pp .Fn EVP_DigestVerifyUpdate hashes @@ -168,7 +171,7 @@ and .\" it is the only way to verify data. .Pp The EVP interface to digital signatures should almost always be -used in preference to the low level interfaces. +used in preference to the low-level interfaces. This is because the code then becomes transparent to the algorithm used and much more flexible. .Pp @@ -206,8 +209,7 @@ The error codes can be obtained from .Sh SEE ALSO .Xr evp 3 , .Xr EVP_DigestInit 3 , -.Xr EVP_DigestSignInit 3 , -.Xr EVP_PKEY_meth_set_verifyctx 3 +.Xr EVP_DigestSignInit 3 .Sh HISTORY .Fn EVP_DigestVerifyInit , .Fn EVP_DigestVerifyUpdate , diff --git a/lib/libcrypto/man/EVP_EncryptInit.3 b/lib/libcrypto/man/EVP_EncryptInit.3 index a0adfbab0..7765be2ca 100644 --- a/lib/libcrypto/man/EVP_EncryptInit.3 +++ b/lib/libcrypto/man/EVP_EncryptInit.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_EncryptInit.3,v 1.52 2024/07/21 08:36:43 tb Exp $ +.\" $OpenBSD: EVP_EncryptInit.3,v 1.56 2024/12/20 01:54:03 schwarze Exp $ .\" full merge up to: OpenSSL 5211e094 Nov 11 14:39:11 2014 -0800 .\" EVP_bf_cbc.pod EVP_cast5_cbc.pod EVP_idea_cbc.pod EVP_rc2_cbc.pod .\" 7c6d372a Nov 20 13:20:01 2018 +0000 @@ -69,7 +69,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: July 21 2024 $ +.Dd $Mdocdate: December 20 2024 $ .Dt EVP_ENCRYPTINIT 3 .Os .Sh NAME @@ -103,13 +103,6 @@ .Nm EVP_idea_cfb64 , .Nm EVP_idea_cfb , .Nm EVP_idea_ofb , -.Nm EVP_rc2_cbc , -.Nm EVP_rc2_ecb , -.Nm EVP_rc2_cfb64 , -.Nm EVP_rc2_cfb , -.Nm EVP_rc2_ofb , -.Nm EVP_rc2_40_cbc , -.Nm EVP_rc2_64_cbc , .Nm EVP_bf_cbc , .Nm EVP_bf_ecb , .Nm EVP_bf_cfb64 , @@ -553,7 +546,6 @@ returns an .Vt EVP_CIPHER structure. .Sh CIPHER LISTING -All algorithms have a fixed key length unless otherwise stated. .Bl -tag -width Ds .It Fn EVP_enc_null Null cipher: does nothing. @@ -564,37 +556,13 @@ Null cipher: does nothing. .Fn EVP_idea_ofb .Xc IDEA encryption algorithm in CBC, ECB, CFB and OFB modes respectively. +IDEA is a block cipher operating on 64 bit blocks using a 128 bit +.Fa key . .Fn EVP_idea_cfb is an alias for .Fn EVP_idea_cfb64 , implemented as a macro. .It Xo -.Fn EVP_rc2_cbc , -.Fn EVP_rc2_ecb , -.Fn EVP_rc2_cfb64 , -.Fn EVP_rc2_ofb -.Xc -RC2 encryption algorithm in CBC, ECB, CFB and OFB modes respectively. -This is a variable key length cipher with an additional parameter called -"effective key bits" or "effective key length". -By default both are set to 128 bits. -.Fn EVP_rc2_cfb -is an alias for -.Fn EVP_rc2_cfb64 , -implemented as a macro. -.It Xo -.Fn EVP_rc2_40_cbc , -.Fn EVP_rc2_64_cbc -.Xc -RC2 algorithm in CBC mode with a default key length and effective key -length of 40 and 64 bits. -These are obsolete and new code should use -.Fn EVP_rc2_cbc , -.Xr EVP_CIPHER_CTX_set_key_length 3 , -and -.Xr EVP_CIPHER_CTX_ctrl 3 -to set the key length and effective key length. -.It Xo .Fn EVP_bf_cbc , .Fn EVP_bf_ecb , .Fn EVP_bf_cfb64 , @@ -602,7 +570,10 @@ to set the key length and effective key length. .Xc Blowfish encryption algorithm in CBC, ECB, CFB and OFB modes respectively. -This is a variable key length cipher. +Blowfish is a block cipher operating on 64 bit blocks using a variable +.Fa key +length. +The default key length is 128 bits. .Fn EVP_bf_cfb is an alias for .Fn EVP_bf_cfb64 , @@ -613,120 +584,30 @@ implemented as a macro. .Fn EVP_cast5_cfb64 , .Fn EVP_cast5_ofb .Xc -CAST encryption algorithm in CBC, ECB, CFB and OFB modes respectively. -This is a variable key length cipher. +CAST-128 encryption algorithm in CBC, ECB, CFB and OFB modes respectively. +CAST-128 is a block cipher operating on 64 bit blocks using a variable +.Fa key +length. +The default and maximum key length is 128 bits. .Fn EVP_cast5_cfb is an alias for .Fn EVP_cast5_cfb64 , implemented as a macro. .El .Pp -See also -.Xr EVP_aes_128_cbc 3 , -.Xr EVP_camellia_128_cbc 3 , -.Xr EVP_des_cbc 3 , -.Xr EVP_rc4 3 , -and -.Xr EVP_sm4_cbc 3 . -.Ss GCM mode -For GCM mode ciphers, the behaviour of the EVP interface -is subtly altered and several additional ctrl operations are -supported. +Some algorithms are documented in separate manual pages: .Pp -To specify any additional authenticated data (AAD), a call to -.Fn EVP_CipherUpdate , -.Fn EVP_EncryptUpdate , -or -.Fn EVP_DecryptUpdate -should be made with the output parameter -.Fa out -set to -.Dv NULL . -.Pp -When decrypting, the return value of -.Fn EVP_DecryptFinal , -.Fn EVP_DecryptFinal_ex , -.Fn EVP_CipherFinal , -or -.Fn EVP_CipherFinal_ex -indicates if the operation was successful. -If it does not indicate success, the authentication operation has -failed and any output data MUST NOT be used as it is corrupted. -.Pp -The following ctrls are supported in GCM mode: -.Bl -tag -width Ds -.It Fn EVP_CIPHER_CTX_ctrl ctx EVP_CTRL_GCM_SET_IVLEN ivlen NULL -Sets the IV length: this call can only be made before specifying an IV. -If not called, a default IV length is used. -For GCM AES the default is 12, i.e. 96 bits. -.It Fn EVP_CIPHER_CTX_ctrl ctx EVP_CTRL_GCM_GET_TAG taglen tag -Writes -.Fa taglen -bytes of the tag value to the buffer indicated by -.Fa tag . -This call can only be made when encrypting data and after all data has -been processed, e.g. after an -.Fn EVP_EncryptFinal -or -.Fn EVP_EncryptFinal_ex -call. -.It Fn EVP_CIPHER_CTX_ctrl ctx EVP_CTRL_GCM_SET_TAG taglen tag -Sets the expected tag to -.Fa taglen -bytes from -.Fa tag . -This call is only legal when decrypting data and must be made before -any data is processed, e.g. before any -.Fa EVP_DecryptUpdate -call. -.El -.Ss CCM mode -The behaviour of CCM mode ciphers is similar to GCM mode, but with -a few additional requirements and different ctrl values. -.Pp -Like GCM mode any additional authenticated data (AAD) is passed -by calling -.Fn EVP_CipherUpdate , -.Fn EVP_EncryptUpdate , -or -.Fn EVP_DecryptUpdate -with the output parameter -.Fa out -set to -.Dv NULL . -Additionally, the total -plaintext or ciphertext length MUST be passed to -.Fn EVP_CipherUpdate , -.Fn EVP_EncryptUpdate , -or -.Fn EVP_DecryptUpdate -with the output and input -parameters -.Pq Fa in No and Fa out -set to -.Dv NULL -and the length passed in the -.Fa in_len -parameter. -.Pp -The following ctrls are supported in CCM mode: -.Bl -tag -width Ds -.It Fn EVP_CIPHER_CTX_ctrl ctx EVP_CTRL_CCM_SET_TAG taglen tag -This call is made to set the expected CCM tag value when decrypting or -the length of the tag (with the -.Fa tag -parameter set to -.Dv NULL ) -when encrypting. -The tag length is often referred to as M. -If not set, a default value is used (12 for AES). -.It Fn EVP_CIPHER_CTX_ctrl ctx EVP_CTRL_CCM_SET_L ivlen NULL -Sets the CCM L value. -If not set, a default is used (8 for AES). -.It Fn EVP_CIPHER_CTX_ctrl ctx EVP_CTRL_CCM_SET_IVLEN ivlen NULL -Sets the CCM nonce (IV) length: this call can only be made before -specifying a nonce value. -The nonce length is given by 15 - L so it is 7 by default for AES. +.Bl -column "EVP_camellia_128_cbc(3)" "block size" -compact +.It manual page Ta block size Ta Fa key No size Pq in bits +.It Xr EVP_aes_128_cbc 3 Ta 128 Ta 128, 192, 256 +.It Xr EVP_aes_128_ccm 3 Ta 128 Ta 128, 192, 256 +.It Xr EVP_aes_128_gcm 3 Ta 128 Ta 128, 192, 256 +.It Xr EVP_camellia_128_cbc 3 Ta 128 Ta 128, 192, 256 +.It Xr EVP_chacha20 3 Ta stream Ta 256 +.It Xr EVP_des_cbc 3 Ta 64 Ta 64 +.It Xr EVP_rc2_cbc 3 Ta 64 Ta variable, default 128 +.It Xr EVP_rc4 3 Ta stream Ta variable, default 128 +.It Xr EVP_sm4_cbc 3 Ta 128 Ta 128 .El .Sh EXAMPLES Encrypt a string using blowfish: @@ -842,6 +723,8 @@ do_crypt(FILE *in_fileptr, FILE *out_fileptr, int do_encrypt) .Xr evp 3 , .Xr EVP_AEAD_CTX_init 3 , .Xr EVP_aes_128_cbc 3 , +.Xr EVP_aes_128_ccm 3 , +.Xr EVP_aes_128_gcm 3 , .Xr EVP_camellia_128_cbc 3 , .Xr EVP_chacha20 3 , .Xr EVP_CIPHER_CTX_ctrl 3 , @@ -851,6 +734,7 @@ do_crypt(FILE *in_fileptr, FILE *out_fileptr, int do_encrypt) .Xr EVP_CIPHER_nid 3 , .Xr EVP_des_cbc 3 , .Xr EVP_OpenInit 3 , +.Xr EVP_rc2_cbc 3 , .Xr EVP_rc4 3 , .Xr EVP_SealInit 3 , .Xr EVP_sm4_cbc 3 @@ -871,12 +755,6 @@ do_crypt(FILE *in_fileptr, FILE *out_fileptr, int do_encrypt) and .Fn EVP_idea_ofb first appeared in SSLeay 0.5.1. -.Fn EVP_rc2_cbc , -.Fn EVP_rc2_ecb , -.Fn EVP_rc2_cfb , -and -.Fn EVP_rc2_ofb -first appeared in SSLeay 0.5.2. .Fn EVP_bf_cbc , .Fn EVP_bf_ecb , .Fn EVP_bf_cfb , @@ -893,12 +771,6 @@ first appeared in SSLeay 0.8.1. All these functions have been available since .Ox 2.4 . .Pp -.Fn EVP_rc2_40_cbc -and -.Fn EVP_rc2_64_cbc -first appeared in SSLeay 0.9.1 and have been available since -.Ox 2.6 . -.Pp .Fn EVP_EncryptInit_ex , .Fn EVP_EncryptFinal_ex , .Fn EVP_DecryptInit_ex , @@ -911,9 +783,8 @@ first appeared in OpenSSL 0.9.7 and have been available since .Pp .Fn EVP_bf_cfb64 , .Fn EVP_cast5_cfb64 , -.Fn EVP_idea_cfb64 , and -.Fn EVP_rc2_cfb64 +.Fn EVP_idea_cfb64 first appeared in OpenSSL 0.9.7e and have been available since .Ox 3.8 . .Pp diff --git a/lib/libcrypto/man/EVP_PKEY_CTX_ctrl.3 b/lib/libcrypto/man/EVP_PKEY_CTX_ctrl.3 index f07d02c82..137e576c4 100644 --- a/lib/libcrypto/man/EVP_PKEY_CTX_ctrl.3 +++ b/lib/libcrypto/man/EVP_PKEY_CTX_ctrl.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_PKEY_CTX_ctrl.3,v 1.23 2023/09/13 13:32:01 schwarze Exp $ +.\" $OpenBSD: EVP_PKEY_CTX_ctrl.3,v 1.28 2024/12/10 14:54:20 schwarze Exp $ .\" full merge up to: OpenSSL 99d63d46 Oct 26 13:56:48 2016 -0400 .\" selective merge up to: OpenSSL 24a535ea Sep 22 13:14:20 2020 +0100 .\" Parts were split out into RSA_pkey_ctx_ctrl(3). @@ -6,7 +6,7 @@ .\" This file is a derived work. .\" The changes are covered by the following Copyright and license: .\" -.\" Copyright (c) 2019, 2023 Ingo Schwarze +.\" Copyright (c) 2019, 2023, 2024 Ingo Schwarze .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above @@ -69,7 +69,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: September 13 2023 $ +.Dd $Mdocdate: December 10 2024 $ .Dt EVP_PKEY_CTX_CTRL 3 .Os .Sh NAME @@ -410,6 +410,92 @@ macro gets the user key material for The return value is the user key material length. The resulting pointer is owned by the library and should not be freed by the caller. +.Ss CMAC parameters +Application programs normally implement CMAC as described in +.Xr EVP_PKEY_new_CMAC_key 3 +and do not need the control commands documented here. +.Pp +Alternatively, the call to +.Xr EVP_PKEY_new_CMAC_key 3 +can be replaced as follows, +leaving the rest of the example code given there unchanged: +.Pp +.Bl -enum -width 2n -compact +.It +Create an empty +.Vt EVP_PKEY_CTX +object by passing the +.Dv EVP_PKEY_CMAC +constant to +.Xr EVP_PKEY_CTX_new_id 3 . +.It +Initialize it with +.Xr EVP_PKEY_keygen_init 3 . +.It +Select the block cipher by calling +.Fn EVP_PKEY_CTX_ctrl +with an +.Fa optype +of +.Dv EVP_PKEY_OP_KEYGEN , +a +.Fa cmd +of +.Dv EVP_PKEY_CTRL_CIPHER , +and +.Fa p2 +pointing to an +.Vt EVP_CIPHER +object, which can be obtained from the functions in the CIPHER LISTING in +.Xr EVP_EncryptInit 3 . +The +.Fa p1 +argument is ignored; passing 0 is recommended. +.It +Call +.Fn EVP_PKEY_CTX_ctrl +again with an +.Fa optype +of +.Dv EVP_PKEY_OP_KEYGEN , +a +.Fa cmd +of +.Dv EVP_PKEY_CTRL_SET_MAC_KEY , +.Fa p2 +pointing to the symmetric key, and +.Fa p1 +specifying the length of the symmetric key in bytes. +.It +Extract the desired +.Vt EVP_PKEY +object using +.Xr EVP_PKEY_keygen 3 , +making sure the +.Fa ppkey +argument points to a storage location containing a +.Dv NULL +pointer. +.It +Proceed with +.Xr EVP_MD_CTX_new 3 , +.Xr EVP_DigestSignInit 3 , +and +.Xr EVP_DigestSign 3 +as usual. +.El +.Ss HMAC parameters +Application programs normally implement HMAC as described in +.Xr EVP_PKEY_new_raw_private_key 3 . +While it is possible to instead use +.Dv EVP_PKEY_CTRL_SET_MAC_KEY +directly, similar to the above description for CMAC, +that is strongly discouraged. +It's essentially what the deprecated function +.Xr EVP_PKEY_new_mac_key 3 +does internally, and compared to the direct approach with +.Xr EVP_PKEY_new_raw_private_key 3 , +it requires a lot of cumbersome and unnecessary work. .Ss Other parameters The .Fn EVP_PKEY_CTX_set1_id , @@ -453,7 +539,6 @@ supported by the public key algorithm. .Xr EVP_PKEY_encrypt 3 , .Xr EVP_PKEY_get_default_digest_nid 3 , .Xr EVP_PKEY_keygen 3 , -.Xr EVP_PKEY_meth_set_ctrl 3 , .Xr EVP_PKEY_sign 3 , .Xr EVP_PKEY_verify 3 , .Xr EVP_PKEY_verify_recover 3 , diff --git a/lib/libcrypto/man/EVP_PKEY_CTX_new.3 b/lib/libcrypto/man/EVP_PKEY_CTX_new.3 index cc0f5f16d..e74bce9df 100644 --- a/lib/libcrypto/man/EVP_PKEY_CTX_new.3 +++ b/lib/libcrypto/man/EVP_PKEY_CTX_new.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_PKEY_CTX_new.3,v 1.14 2024/07/21 08:36:43 tb Exp $ +.\" $OpenBSD: EVP_PKEY_CTX_new.3,v 1.16 2024/12/06 14:27:49 schwarze Exp $ .\" full merge up to: OpenSSL df75c2bf Dec 9 01:02:36 2018 +0100 .\" .\" This file is a derived work. @@ -65,7 +65,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: July 21 2024 $ +.Dd $Mdocdate: December 6 2024 $ .Dt EVP_PKEY_CTX_NEW 3 .Os .Sh NAME @@ -154,7 +154,6 @@ if an error occurred. .Xr EVP_DigestSignInit 3 , .Xr EVP_DigestVerifyInit 3 , .Xr EVP_PKEY_base_id 3 , -.Xr EVP_PKEY_check 3 , .Xr EVP_PKEY_CTX_ctrl 3 , .Xr EVP_PKEY_CTX_get_operation 3 , .Xr EVP_PKEY_CTX_hkdf_mode 3 , @@ -162,7 +161,6 @@ if an error occurred. .Xr EVP_PKEY_derive 3 , .Xr EVP_PKEY_encrypt 3 , .Xr EVP_PKEY_keygen 3 , -.Xr EVP_PKEY_meth_set_init 3 , .Xr EVP_PKEY_new 3 , .Xr EVP_PKEY_sign 3 , .Xr EVP_PKEY_verify 3 , diff --git a/lib/libcrypto/man/EVP_PKEY_asn1_get_count.3 b/lib/libcrypto/man/EVP_PKEY_asn1_get_count.3 index 6e6c25e25..f7810789b 100644 --- a/lib/libcrypto/man/EVP_PKEY_asn1_get_count.3 +++ b/lib/libcrypto/man/EVP_PKEY_asn1_get_count.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_PKEY_asn1_get_count.3,v 1.9 2024/07/21 08:36:43 tb Exp $ +.\" $OpenBSD: EVP_PKEY_asn1_get_count.3,v 1.10 2024/12/06 12:51:13 schwarze Exp $ .\" full merge up to: OpenSSL 72a7a702 Feb 26 14:05:09 2019 +0000 .\" .\" This file is a derived work. @@ -65,7 +65,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: July 21 2024 $ +.Dd $Mdocdate: December 6 2024 $ .Dt EVP_PKEY_ASN1_GET_COUNT 3 .Os .Sh NAME @@ -185,16 +185,10 @@ object and will never be returned from or .Fn EVP_PKEY_asn1_find_str . .It Dv ASN1_PKEY_DYNAMIC -This +This flag is unused. +It could formerly be used to mark an .Fa ameth -object is marked as dynamically allocated. -If this flag is set, -.Xr EVP_PKEY_asn1_free 3 -can free -.Fa ameth ; -otherwise, -.Xr EVP_PKEY_asn1_free 3 -has no effect on it. +object as dynamically allocated. .It Dv ASN1_PKEY_SIGPARAM_NULL If the signing .Fa ctx @@ -240,7 +234,6 @@ if no match is found. .Fn EVP_PKEY_asn1_get0_info returns 1 on success or 0 on failure. .Sh SEE ALSO -.Xr EVP_PKEY_asn1_new 3 , .Xr EVP_PKEY_base_id 3 , .Xr EVP_PKEY_new 3 .Sh HISTORY diff --git a/lib/libcrypto/man/EVP_PKEY_asn1_new.3 b/lib/libcrypto/man/EVP_PKEY_asn1_new.3 deleted file mode 100644 index cd6a71690..000000000 --- a/lib/libcrypto/man/EVP_PKEY_asn1_new.3 +++ /dev/null @@ -1,505 +0,0 @@ -.\" $OpenBSD: EVP_PKEY_asn1_new.3,v 1.11 2023/12/21 21:32:01 tb Exp $ -.\" selective merge up to: -.\" OpenSSL man3/EVP_PKEY_ASN1_METHOD b0004708 Nov 1 00:45:24 2017 +0800 -.\" -.\" This file is a derived work. -.\" The changes are covered by the following Copyright and license: -.\" -.\" Copyright (c) 2023 Ingo Schwarze -.\" -.\" Permission to use, copy, modify, and distribute this software for any -.\" purpose with or without fee is hereby granted, provided that the above -.\" copyright notice and this permission notice appear in all copies. -.\" -.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -.\" -.\" The original file was written by Richard Levitte -.\" and Paul Yang . -.\" Copyright (c) 2017 The OpenSSL Project. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in -.\" the documentation and/or other materials provided with the -.\" distribution. -.\" -.\" 3. All advertising materials mentioning features or use of this -.\" software must display the following acknowledgment: -.\" "This product includes software developed by the OpenSSL Project -.\" for use in the OpenSSL Toolkit. (http://www.openssl.org/)" -.\" -.\" 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to -.\" endorse or promote products derived from this software without -.\" prior written permission. For written permission, please contact -.\" openssl-core@openssl.org. -.\" -.\" 5. Products derived from this software may not be called "OpenSSL" -.\" nor may "OpenSSL" appear in their names without prior written -.\" permission of the OpenSSL Project. -.\" -.\" 6. Redistributions of any form whatsoever must retain the following -.\" acknowledgment: -.\" "This product includes software developed by the OpenSSL Project -.\" for use in the OpenSSL Toolkit (http://www.openssl.org/)" -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY -.\" EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR -.\" ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -.\" OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.Dd $Mdocdate: December 21 2023 $ -.Dt EVP_PKEY_ASN1_NEW 3 -.Os -.Sh NAME -.\" .Nm EVP_PKEY_asn1_add0 and -.\" .Nm EVP_PKEY_asn1_add_alias are intentionally undocumented -.\" because they will be removed in the next major bump -.Nm EVP_PKEY_asn1_new , -.Nm EVP_PKEY_asn1_copy , -.Nm EVP_PKEY_asn1_free , -.Nm EVP_PKEY_asn1_set_public , -.Nm EVP_PKEY_asn1_set_private , -.Nm EVP_PKEY_asn1_set_param , -.Nm EVP_PKEY_asn1_set_free , -.Nm EVP_PKEY_asn1_set_ctrl , -.Nm EVP_PKEY_asn1_set_check , -.Nm EVP_PKEY_asn1_set_public_check , -.Nm EVP_PKEY_asn1_set_param_check , -.Nm EVP_PKEY_asn1_set_security_bits -.Nd manipulating and registering an EVP_PKEY_ASN1_METHOD structure -.Sh SYNOPSIS -.In openssl/evp.h -.Ft EVP_PKEY_ASN1_METHOD * -.Fo EVP_PKEY_asn1_new -.Fa "int id" -.Fa "int flags" -.Fa "const char *pem_str" -.Fa "const char *info" -.Fc -.Ft void -.Fo EVP_PKEY_asn1_copy -.Fa "EVP_PKEY_ASN1_METHOD *dst" -.Fa "const EVP_PKEY_ASN1_METHOD *src" -.Fc -.Ft void -.Fo EVP_PKEY_asn1_free -.Fa "EVP_PKEY_ASN1_METHOD *ameth" -.Fc -.Ft void -.Fo EVP_PKEY_asn1_set_public -.Fa "EVP_PKEY_ASN1_METHOD *ameth" -.Fa "int (*pub_decode)(EVP_PKEY *pk, X509_PUBKEY *pub)" -.Fa "int (*pub_encode)(X509_PUBKEY *pub, const EVP_PKEY *pk)" -.Fa "int (*pub_cmp)(const EVP_PKEY *a, const EVP_PKEY *b)" -.Fa "int (*pub_print)(BIO *out, const EVP_PKEY *pkey, int indent,\ - ASN1_PCTX *pctx)" -.Fa "int (*pkey_size)(const EVP_PKEY *pk)" -.Fa "int (*pkey_bits)(const EVP_PKEY *pk)" -.Fc -.Ft void -.Fo EVP_PKEY_asn1_set_private -.Fa "EVP_PKEY_ASN1_METHOD *ameth" -.Fa "int (*priv_decode)(EVP_PKEY *pk, const PKCS8_PRIV_KEY_INFO *p8inf)" -.Fa "int (*priv_encode)(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pk)" -.Fa "int (*priv_print)(BIO *out, const EVP_PKEY *pkey, int indent,\ - ASN1_PCTX *pctx)" -.Fc -.Ft void -.Fo EVP_PKEY_asn1_set_param -.Fa "EVP_PKEY_ASN1_METHOD *ameth" -.Fa "int (*param_decode)(EVP_PKEY *pkey, const unsigned char **pder,\ - int derlen)" -.Fa "int (*param_encode)(const EVP_PKEY *pkey, unsigned char **pder)" -.Fa "int (*param_missing)(const EVP_PKEY *pk)" -.Fa "int (*param_copy)(EVP_PKEY *to, const EVP_PKEY *from)" -.Fa "int (*param_cmp)(const EVP_PKEY *a, const EVP_PKEY *b)" -.Fa "int (*param_print)(BIO *out, const EVP_PKEY *pkey, int indent,\ - ASN1_PCTX *pctx)" -.Fc -.Ft void -.Fo EVP_PKEY_asn1_set_free -.Fa "EVP_PKEY_ASN1_METHOD *ameth" -.Fa "void (*pkey_free)(EVP_PKEY *pkey)" -.Fc -.Ft void -.Fo EVP_PKEY_asn1_set_ctrl -.Fa "EVP_PKEY_ASN1_METHOD *ameth" -.Fa "int (*pkey_ctrl)(EVP_PKEY *pkey, int op, long arg1, void *arg2)" -.Fc -.Ft void -.Fo EVP_PKEY_asn1_set_check -.Fa "EVP_PKEY_ASN1_METHOD *ameth" -.Fa "int (*pkey_check)(const EVP_PKEY *pk)" -.Fc -.Ft void -.Fo EVP_PKEY_asn1_set_public_check -.Fa "EVP_PKEY_ASN1_METHOD *ameth" -.Fa "int (*pkey_public_check)(const EVP_PKEY *pk)" -.Fc -.Ft void -.Fo EVP_PKEY_asn1_set_param_check -.Fa "EVP_PKEY_ASN1_METHOD *ameth" -.Fa "int (*pkey_param_check)(const EVP_PKEY *pk)" -.Fc -.Ft void -.Fo EVP_PKEY_asn1_set_security_bits -.Fa "EVP_PKEY_ASN1_METHOD *ameth" -.Fa "int (*pkey_security_bits)(const EVP_PKEY *pkey)" -.Fc -.Sh DESCRIPTION -.Vt EVP_PKEY_ASN1_METHOD -is a structure which holds a set of ASN.1 conversion, printing and -information methods for a specific public key algorithm. -.Pp -The built-in -.Vt EVP_PKEY_ASN1_METHOD -objects are stored in a table containing the standard -methods for different algorithms. -.Ss Methods -The methods are the underlying implementations of a particular public -key algorithm present by the -.Vt EVP_PKEY -object. -.Bd -unfilled -.Ft int Fn (*pub_decode) "EVP_PKEY *pk" "X509_PUBKEY *pub" -.Ft int Fn (*pub_encode) "X509_PUBKEY *pub" "const EVP_PKEY *pk" -.Ed -.Pp -Decode and encode -.Vt X509_PUBKEY -ASN.1 parameters to and from -.Fa pk . -These methods must return 0 on error and 1 on success. -They are called by -.Xr X509_PUBKEY_get 3 -and -.Xr X509_PUBKEY_set 3 . -.Bd -unfilled -.Ft int Fn (*pub_cmp) "const EVP_PKEY *a" "const EVP_PKEY *b" -.Ed -.Pp -Compare two public keys. -This method must return 1 when the keys are equal and 0 otherwise. -It is called by -.Xr EVP_PKEY_cmp 3 . -.Bd -filled -.Ft int Fo (*pub_print) -.Fa "BIO *out" -.Fa "const EVP_PKEY *pkey" -.Fa "int indent" -.Fa "ASN1_PCTX *pctx" -.Fc -.Ed -.Pp -Print a public key in humanly readable text to -.Fa out , -indented -.Fa indent -spaces. -This method must return 0 on error and 1 on success. -It is called by -.Xr EVP_PKEY_print_public 3 . -.Bd -unfilled -.Ft int Fn (*priv_decode) "EVP_PKEY *pk" "const PKCS8_PRIV_KEY_INFO *p8inf" -.Ft int Fn (*priv_encode) "PKCS8_PRIV_KEY_INFO *p8" "const EVP_PKEY *pk" -.Ed -.Pp -Decode and encode -.Vt PKCS8_PRIV_KEY_INFO -form private key to and from -.Fa pk . -These methods must return 0 on error, 1 on success. -They are called by -.Xr EVP_PKCS82PKEY 3 -and -.Xr EVP_PKEY2PKCS8 3 . -.Bd -filled -.Ft int Fo (*priv_print) -.Fa "BIO *out" -.Fa "const EVP_PKEY *pkey" -.Fa "int indent" -.Fa "ASN1_PCTX *pctx" -.Fc -.Ed -.Pp -Print a private key in humanly readable text to -.Fa out , -indented -.Fa indent -spaces. -This method must return 0 on error and 1 on success. -It is called by -.Xr EVP_PKEY_print_private 3 . -.Bd -unfilled -.Ft int Fn (*pkey_size) "const EVP_PKEY *pk" -.Ed -.Pp -Returns the key size in bytes. -This method is called by -.Xr EVP_PKEY_size 3 . -.Bd -unfilled -.Ft int Fn (*pkey_bits) "const EVP_PKEY *pk" -.Ed -.Pp -Returns the key size in bits. -This method is called by -.Xr EVP_PKEY_bits 3 . -.Bd -filled -.Ft int Fo (*param_decode) -.Fa "EVP_PKEY *pkey" -.Fa "const unsigned char **pder" -.Fa "int derlen" -.Fc -.br -.Ft int Fo (*param_encode) -.Fa "const EVP_PKEY *pkey" -.Fa "unsigned char **pder" -.Fc -.Ed -.Pp -Decode and encode DER formatted parameters to and from -.Fa pk . -These methods must return 0 on error and 1 on success. -They are called by -.Fn PEM_read_bio_Parameters . -.Bd -unfilled -.Ft int Fn (*param_missing) "const EVP_PKEY *pk" -.Ed -.Pp -Return 0 if a key parameter is missing or 1 otherwise. -This method is called by -.Xr EVP_PKEY_missing_parameters 3 . -.Bd -unfilled -.Ft int Fn (*param_copy) "EVP_PKEY *to" "const EVP_PKEY *from" -.Ed -.Pp -Copy key parameters from -.Fa from -to -.Fa to . -This method must return 0 on error and 1 on success. -It is called by -.Xr EVP_PKEY_copy_parameters 3 . -.Bd -unfilled -.Ft int Fn (*param_cmp) "const EVP_PKEY *a" "const EVP_PKEY *b" -.Ed -.Pp -Compare the parameters of the keys -.Fa a -and -.Fa b . -This method must return 1 when the keys are equal, 0 when not equal, and a -negative number on error. -It is called by -.Xr EVP_PKEY_cmp_parameters 3 . -.Bd -filled -.Ft int Fo (*param_print) -.Fa "BIO *out" -.Fa "const EVP_PKEY *pkey" -.Fa "int indent" -.Fa "ASN1_PCTX *pctx" -.Fc -.Ed -.Pp -Print the private key parameters in humanly readable text to -.Fa out , -indented -.Fa indent -spaces. -This method must return 0 on error and 1 on success. -It is called by -.Xr EVP_PKEY_print_params 3 . -.Bd -unfilled -.Ft void Fn (*pkey_free) "EVP_PKEY *pkey" -.Ed -.Pp -Free the internals of -.Fa pkey . -This method is called by -.Xr EVP_PKEY_free 3 , -.Xr EVP_PKEY_set_type 3 , -.Xr EVP_PKEY_set_type_str 3 , -and -.Xr EVP_PKEY_assign 3 . -.Bd -filled -.Ft int Fo (*pkey_ctrl) -.Fa "EVP_PKEY *pkey" -.Fa "int op" -.Fa "long arg1" -.Fa "void *arg2" -.Fc -.Ed -.Pp -Add extra algorithm specific control. -.Pp -If the -.Fa op -argument is -.Dv ASN1_PKEY_CTRL_DEFAULT_MD_NID , -the -.Fa pkey_ctrl -method is supposed to write the message digest NID -for public key signature operations with the given -.Fa pkey -to -.Pf * Fa arg2 -as documented in the -.Xr EVP_PKEY_get_default_digest_nid 3 -manual page. -.Pp -The -.Fa pkey_ctrl -method is also called by -.Fn PKCS7_SIGNER_INFO_set , -.Fn PKCS7_RECIP_INFO_set , -and other functions. -.\" TODO: -.\" ASN1_PKEY_CTRL_CMS_ENVELOPE in cms_env.c rsa_ameth.c -.\" ASN1_PKEY_CTRL_CMS_RI_TYPE in cms_env.c dsa_ameth.c ec_ameth.c rsa_ameth.c -.\" ASN1_PKEY_CTRL_CMS_SIGN in cms_sd.c dsa_ameth.c ec_ameth.c rsa_ameth.c -.\" ASN1_PKEY_CTRL_PKCS7_ENCRYPT in pk7_lib.c rsa_ameth.c -.\" ASN1_PKEY_CTRL_PKCS7_SIGN in pk7_lib.c dsa_ameth.c ec_ameth.c rsa_ameth.c -.Bd -unfilled -.Ft int Fn (*pkey_check) "const EVP_PKEY *pk" -.Ft int Fn (*pkey_public_check) "const EVP_PKEY *pk" -.Ft int Fn (*pkey_param_check) "const EVP_PKEY *pk" -.Ed -.Pp -Check the validity of -.Fa pk -for key-pair, public component, and parameters, respectively. -These methods must return 0 for an invalid key or 1 for a valid key. -They are called by -.Xr EVP_PKEY_check 3 , -.Xr EVP_PKEY_public_check 3 , -and -.Xr EVP_PKEY_param_check 3 , -respectively. -.Bd -unfilled -.Ft int Fn (*pkey_security_bits) "const EVP_PKEY *pkey" -.Ed -.Pp -Return the security strength measured in bits of -.Fa pkey . -It is called by -.Xr EVP_PKEY_security_bits 3 . -.Ss Functions -.Fn EVP_PKEY_asn1_new -creates and returns a new -.Vt EVP_PKEY_ASN1_METHOD -object, marks it as dynamically allocated, and associates the given -.Fa id , -.Fa flags , -.Fa pem_str -and -.Fa info . -.Fa id -is a NID, -.Fa pem_str -is the PEM type string, -.Fa info -is a descriptive string. -If -.Dv ASN1_PKEY_SIGPARAM_NULL -is set in -.Fa flags , -the signature algorithm parameters are given the type -.Dv V_ASN1_NULL -by default, otherwise they will be given the type -.Dv V_ASN1_UNDEF -(i.e. the parameter is omitted). -See -.Xr X509_ALGOR_set0 3 -for more information. -.Pp -.Fn EVP_PKEY_asn1_copy -copies all function pointers from -.Fa src -to -.Fa dst . -The data in -.Fa dst -that can be set with -.Fn EVP_PKEY_asn1_new -\(em NIDs, flags, and strings \(em -remains unchanged. -This function is not thread safe, it is recommended to only use this when -initializing the application. -.Pp -.Fn EVP_PKEY_asn1_free -frees the dynamically allocated -.Fa ameth -including all memory it refers to. -If -.Fa ameth -is -.Dv NULL -of not marked as dynamically allocated, no action occurs. -.Pp -.Fn EVP_PKEY_asn1_set_public , -.Fn EVP_PKEY_asn1_set_private , -.Fn EVP_PKEY_asn1_set_param , -.Fn EVP_PKEY_asn1_set_free , -.Fn EVP_PKEY_asn1_set_ctrl , -.Fn EVP_PKEY_asn1_set_check , -.Fn EVP_PKEY_asn1_set_public_check , -.Fn EVP_PKEY_asn1_set_param_check , -and -.Fn EVP_PKEY_asn1_set_security_bits -set the diverse methods of the given -.Vt EVP_PKEY_ASN1_METHOD -object. -.Sh RETURN VALUES -.Fn EVP_PKEY_asn1_new -returns a pointer to the new -.Vt EVP_PKEY_ASN1_METHOD -object or -.Dv NULL -if memory allocation fails. -.Sh SEE ALSO -.Xr EVP_PKEY_asn1_get_count 3 , -.Xr EVP_PKEY_new 3 , -.Xr X509_PUBKEY_new 3 -.Sh HISTORY -.Fn EVP_PKEY_asn1_new , -.Fn EVP_PKEY_asn1_copy , -.Fn EVP_PKEY_asn1_free , -.Fn EVP_PKEY_asn1_set_public , -.Fn EVP_PKEY_asn1_set_private , -.Fn EVP_PKEY_asn1_set_param , -.Fn EVP_PKEY_asn1_set_free , -and -.Fn EVP_PKEY_asn1_set_ctrl -first appeared in OpenSSL 1.0.0 and have been available since -.Ox 4.9 . -.Pp -.Fn EVP_PKEY_asn1_set_check , -.Fn EVP_PKEY_asn1_set_public_check , -and -.Fn EVP_PKEY_asn1_set_param_check -first appeared in OpenSSL 1.1.1 and have been available since -.Ox 7.1 . -.Pp -.Fn EVP_PKEY_asn1_set_security_bits -first appeared in OpenSSL 1.1.0 and has been available since -.Ox 7.2 . diff --git a/lib/libcrypto/man/EVP_PKEY_check.3 b/lib/libcrypto/man/EVP_PKEY_check.3 deleted file mode 100644 index 5a78e3512..000000000 --- a/lib/libcrypto/man/EVP_PKEY_check.3 +++ /dev/null @@ -1,149 +0,0 @@ -.\" $OpenBSD: EVP_PKEY_check.3,v 1.2 2022/07/14 14:49:09 tb Exp $ -.\" -.\" Copyright (c) 2022 Ingo Schwarze -.\" -.\" Permission to use, copy, modify, and distribute this software for any -.\" purpose with or without fee is hereby granted, provided that the above -.\" copyright notice and this permission notice appear in all copies. -.\" -.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -.\" -.Dd $Mdocdate: July 14 2022 $ -.Dt EVP_PKEY_CHECK 3 -.Os -.Sh NAME -.Nm EVP_PKEY_check , -.Nm EVP_PKEY_public_check , -.Nm EVP_PKEY_param_check -.Nd key and parameter check functions -.Sh SYNOPSIS -.In openssl/evp.h -.Ft int -.Fn EVP_PKEY_check "EVP_PKEY_CTX *ctx" -.Ft int -.Fn EVP_PKEY_public_check "EVP_PKEY_CTX *ctx" -.Ft int -.Fn EVP_PKEY_param_check "EVP_PKEY_CTX *ctx" -.Sh DESCRIPTION -.Fn EVP_PKEY_check -performs various sanity checks on the key contained in -.Fa ctx -but only supports a small number of key types by default. -It preferably uses the function -.Fa check -configured for -.Fa ctx -with -.Xr EVP_PKEY_meth_set_check 3 . -It falls back to the function -.Fa pkey_check -configured for the private key contained in -.Fa ctx -with -.Xr EVP_PKEY_asn1_set_check 3 . -If that wasn't configured either, it attempts to use the following -check functions: -.Pp -.Bl -tag -width 3n -compact -offset -indent -.It DH -not supported, return value \-2 -.It EC -.Xr EC_KEY_check_key 3 -.It RSA -.Xr RSA_check_key 3 -.El -.Pp -.Fn EVP_PKEY_public_check -performs various sanity checks on the public key contained in -.Fa ctx -but only supports a small number of key types by default. -It preferably uses the function -.Fa public_check -configured for -.Fa ctx -with -.Xr EVP_PKEY_meth_set_public_check 3 . -It falls back to the function -.Fa pkey_public_check -configured for the private key contained in -.Fa ctx -with -.Xr EVP_PKEY_asn1_set_public_check 3 . -If that wasn't configured either, it attempts to use the following -check functions: -.Pp -.Bl -tag -width 3n -compact -offset -indent -.It DH -.Xr DH_check_pub_key 3 -.It EC -.Xr EC_KEY_check_key 3 -.It RSA -not supported, return value \-2 -.El -.Pp -.Fn EVP_PKEY_param_check -performs various sanity checks on the key parameters contained in -.Fa ctx -but only supports a small number of key types by default. -It preferably uses the function -.Fa check -configured for -.Fa ctx -with -.Xr EVP_PKEY_meth_set_param_check 3 . -It falls back to the function -.Fa pkey_check -configured for the private key contained in -.Fa ctx -with -.Xr EVP_PKEY_asn1_set_param_check 3 . -If that wasn't configured either, it attempts to use the following -check functions: -.Pp -.Bl -tag -width 3n -compact -offset -indent -.It DH -.Xr DH_check 3 -.It EC -.Xr EC_GROUP_check 3 -.It RSA -not supported, return value \-2 -.El -.Sh RETURN VALUES -These functions return 1 if the check was performed and no problem -was found, 0 if a problem was found or if the check could not be -performed, for example because -.Fa ctx -does not contain an -.Vt EVP_PKEY -object, or \-2 if the required check function is neither configured for -.Fa ctx -nor for the -.Vt PKEY -contained therein, and the check in question is not supported by default -for the algorithm in question either. -.Sh SEE ALSO -.Xr DH_check 3 , -.Xr EC_GROUP_check 3 , -.Xr EC_KEY_new 3 , -.Xr EVP_PKEY_asn1_new 3 , -.Xr EVP_PKEY_CTX_new 3 , -.Xr EVP_PKEY_meth_new 3 , -.Xr EVP_PKEY_new 3 , -.Xr RSA_check_key 3 -.Sh HISTORY -These functions first appeared in OpenSSL 1.1.1 -and have been available since -.Ox 7.1 . -.Sh BUGS -For EC keys, -.Fn EVP_PKEY_public_check -also checks the -.Em private -key and fails if there is a problem with any of the private -components, even if no problem is found with the public key. diff --git a/lib/libcrypto/man/EVP_PKEY_cmp.3 b/lib/libcrypto/man/EVP_PKEY_cmp.3 index 2e42a9946..c12843854 100644 --- a/lib/libcrypto/man/EVP_PKEY_cmp.3 +++ b/lib/libcrypto/man/EVP_PKEY_cmp.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_PKEY_cmp.3,v 1.14 2024/03/05 19:21:31 tb Exp $ +.\" $OpenBSD: EVP_PKEY_cmp.3,v 1.15 2024/12/06 12:51:13 schwarze Exp $ .\" full merge up to: OpenSSL 05ea606a May 20 20:52:46 2016 -0400 .\" selective merge up to: OpenSSL 99d63d46 Oct 26 13:56:48 2016 -0400 .\" @@ -67,7 +67,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: March 5 2024 $ +.Dd $Mdocdate: December 6 2024 $ .Dt EVP_PKEY_CMP 3 .Os .Sh NAME @@ -160,7 +160,6 @@ and return 1 if the keys match, 0 if they don't match, -1 if the key types are different and -2 if the operation is not supported. .Sh SEE ALSO -.Xr EVP_PKEY_asn1_set_public 3 , .Xr EVP_PKEY_CTX_new 3 , .Xr EVP_PKEY_keygen 3 , .Xr EVP_PKEY_new 3 , diff --git a/lib/libcrypto/man/EVP_PKEY_decrypt.3 b/lib/libcrypto/man/EVP_PKEY_decrypt.3 index 2166003af..c063847b1 100644 --- a/lib/libcrypto/man/EVP_PKEY_decrypt.3 +++ b/lib/libcrypto/man/EVP_PKEY_decrypt.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_PKEY_decrypt.3,v 1.9 2024/07/21 08:10:17 tb Exp $ +.\" $OpenBSD: EVP_PKEY_decrypt.3,v 1.10 2024/12/06 14:27:49 schwarze Exp $ .\" full merge up to: OpenSSL 48e5119a Jan 19 10:49:22 2018 +0100 .\" .\" This file was written by Dr. Stephen Henson . @@ -49,7 +49,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: July 21 2024 $ +.Dd $Mdocdate: December 6 2024 $ .Dt EVP_PKEY_DECRYPT 3 .Os .Sh NAME @@ -164,7 +164,6 @@ if (EVP_PKEY_decrypt(ctx, out, &outlen, in, inlen) <= 0) .Xr EVP_PKEY_CTX_new 3 , .Xr EVP_PKEY_derive 3 , .Xr EVP_PKEY_encrypt 3 , -.Xr EVP_PKEY_meth_set_decrypt 3 , .Xr EVP_PKEY_sign 3 , .Xr EVP_PKEY_verify 3 , .Xr EVP_PKEY_verify_recover 3 diff --git a/lib/libcrypto/man/EVP_PKEY_derive.3 b/lib/libcrypto/man/EVP_PKEY_derive.3 index 398540a5b..47f467fea 100644 --- a/lib/libcrypto/man/EVP_PKEY_derive.3 +++ b/lib/libcrypto/man/EVP_PKEY_derive.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_PKEY_derive.3,v 1.11 2024/07/21 08:25:33 tb Exp $ +.\" $OpenBSD: EVP_PKEY_derive.3,v 1.12 2024/12/06 14:27:49 schwarze Exp $ .\" full merge up to: OpenSSL 48e5119a Jan 19 10:49:22 2018 +0100 .\" .\" This file is a derived work. @@ -66,7 +66,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: July 21 2024 $ +.Dd $Mdocdate: December 6 2024 $ .Dt EVP_PKEY_DERIVE 3 .Os .Sh NAME @@ -240,7 +240,6 @@ if (EVP_PKEY_derive(ctx, skey, &skeylen) <= 0) .Xr EVP_PKEY_CTX_new 3 , .Xr EVP_PKEY_decrypt 3 , .Xr EVP_PKEY_encrypt 3 , -.Xr EVP_PKEY_meth_set_derive 3 , .Xr EVP_PKEY_sign 3 , .Xr EVP_PKEY_verify 3 , .Xr EVP_PKEY_verify_recover 3 , diff --git a/lib/libcrypto/man/EVP_PKEY_encrypt.3 b/lib/libcrypto/man/EVP_PKEY_encrypt.3 index 6b9f8fa68..c2e70cb31 100644 --- a/lib/libcrypto/man/EVP_PKEY_encrypt.3 +++ b/lib/libcrypto/man/EVP_PKEY_encrypt.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_PKEY_encrypt.3,v 1.9 2023/11/19 10:09:27 tb Exp $ +.\" $OpenBSD: EVP_PKEY_encrypt.3,v 1.10 2024/12/06 14:27:49 schwarze Exp $ .\" OpenSSL b97fdb57 Nov 11 09:33:09 2016 +0100 .\" .\" This file was written by Dr. Stephen Henson . @@ -49,7 +49,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: November 19 2023 $ +.Dd $Mdocdate: December 6 2024 $ .Dt EVP_PKEY_ENCRYPT 3 .Os .Sh NAME @@ -172,7 +172,6 @@ if (EVP_PKEY_encrypt(ctx, out, &outlen, in, inlen) <= 0) .Xr EVP_PKEY_CTX_new 3 , .Xr EVP_PKEY_decrypt 3 , .Xr EVP_PKEY_derive 3 , -.Xr EVP_PKEY_meth_set_encrypt 3 , .Xr EVP_PKEY_sign 3 , .Xr EVP_PKEY_verify 3 , .Xr EVP_PKEY_verify_recover 3 diff --git a/lib/libcrypto/man/EVP_PKEY_get_default_digest_nid.3 b/lib/libcrypto/man/EVP_PKEY_get_default_digest_nid.3 index f0c40f3d1..e9ff7c460 100644 --- a/lib/libcrypto/man/EVP_PKEY_get_default_digest_nid.3 +++ b/lib/libcrypto/man/EVP_PKEY_get_default_digest_nid.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_PKEY_get_default_digest_nid.3,v 1.9 2024/04/18 16:33:33 tb Exp $ +.\" $OpenBSD: EVP_PKEY_get_default_digest_nid.3,v 1.10 2024/12/06 12:51:13 schwarze Exp $ .\" full merge up to: OpenSSL df75c2bf Dec 9 01:02:36 2018 +0100 .\" .\" This file is a derived work. @@ -66,7 +66,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: April 18 2024 $ +.Dd $Mdocdate: December 6 2024 $ .Dt EVP_PKEY_GET_DEFAULT_DIGEST_NID 3 .Os .Sh NAME @@ -116,7 +116,6 @@ It returns 0 or a negative value for failure. In particular, a return value of -2 indicates the operation is not supported by the public key algorithm. .Sh SEE ALSO -.Xr EVP_PKEY_asn1_set_ctrl 3 , .Xr EVP_PKEY_CTX_ctrl 3 , .Xr EVP_PKEY_CTX_new 3 , .Xr EVP_PKEY_new 3 , diff --git a/lib/libcrypto/man/EVP_PKEY_keygen.3 b/lib/libcrypto/man/EVP_PKEY_keygen.3 index 32ed4a15c..e75859b48 100644 --- a/lib/libcrypto/man/EVP_PKEY_keygen.3 +++ b/lib/libcrypto/man/EVP_PKEY_keygen.3 @@ -1,10 +1,10 @@ -.\" $OpenBSD: EVP_PKEY_keygen.3,v 1.14 2024/07/21 08:02:17 tb Exp $ +.\" $OpenBSD: EVP_PKEY_keygen.3,v 1.15 2024/12/06 14:27:49 schwarze Exp $ .\" full merge up to: OpenSSL 24a535ea Sep 22 13:14:20 2020 +0100 .\" .\" This file is a derived work. .\" The changes are covered by the following Copyright and license: .\" -.\" Copyright (c) 2023 Ingo Schwarze +.\" Copyright (c) 2023, 2024 Ingo Schwarze .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above @@ -66,7 +66,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: July 21 2024 $ +.Dd $Mdocdate: December 6 2024 $ .Dt EVP_PKEY_KEYGEN 3 .Os .Sh NAME @@ -80,7 +80,9 @@ .Nm EVP_PKEY_CTX_set0_keygen_info , .Nm EVP_PKEY_CTX_get_keygen_info , .Nm EVP_PKEY_CTX_set_app_data , -.Nm EVP_PKEY_CTX_get_app_data +.Nm EVP_PKEY_CTX_get_app_data , +.Nm EVP_PKEY_CTX_set_data , +.Nm EVP_PKEY_CTX_get_data .Nd key and parameter generation functions .Sh SYNOPSIS .In openssl/evp.h @@ -129,12 +131,21 @@ .Ft void .Fo EVP_PKEY_CTX_set_app_data .Fa "EVP_PKEY_CTX *ctx" -.Fa "void *data" +.Fa "void *app_data" .Fc .Ft void * .Fo EVP_PKEY_CTX_get_app_data .Fa "EVP_PKEY_CTX *ctx" .Fc +.Ft void +.Fo EVP_PKEY_CTX_set_data +.Fa "EVP_PKEY_CTX *ctx" +.Fa "void *data" +.Fc +.Ft void * +.Fo EVP_PKEY_CTX_get_data +.Fa "EVP_PKEY_CTX *ctx" +.Fc .Sh DESCRIPTION The .Fn EVP_PKEY_keygen_init @@ -197,6 +208,14 @@ This can be used to set some application defined value which can be retrieved in the callback: for example a handle which is used to update a "progress dialog". .Pp +The deprecated functions +.Fn EVP_PKEY_CTX_set_data +and +.Fn EVP_PKEY_CTX_get_data +set and retrieve a +.Em different +opaque pointer that is ignored by the library. +.Pp After the call to .Fn EVP_PKEY_keygen_init or @@ -258,6 +277,14 @@ is \-1, one of these parameters if .Fa idx is greater than or equal to zero but less than the number of available parameters, or 0 otherwise. +.Pp +.Fn EVP_PKEY_CTX_get_app_data +and +.Fn EVP_PKEY_CTX_get_data +return the pointer that was last passed to the corresponding set function, or +.Dv NULL +if the corresponding set function was never called on +.Fa ctx . .Sh EXAMPLES Generate a 2048-bit RSA key: .Bd -literal -offset indent @@ -332,7 +359,6 @@ genpkey_cb(EVP_PKEY_CTX *ctx) .Xr EVP_PKEY_decrypt 3 , .Xr EVP_PKEY_derive 3 , .Xr EVP_PKEY_encrypt 3 , -.Xr EVP_PKEY_meth_set_keygen 3 , .Xr EVP_PKEY_sign 3 , .Xr EVP_PKEY_verify 3 , .Xr EVP_PKEY_verify_recover 3 , diff --git a/lib/libcrypto/man/EVP_PKEY_meth_get0_info.3 b/lib/libcrypto/man/EVP_PKEY_meth_get0_info.3 deleted file mode 100644 index acfb035bb..000000000 --- a/lib/libcrypto/man/EVP_PKEY_meth_get0_info.3 +++ /dev/null @@ -1,78 +0,0 @@ -.\" $OpenBSD: EVP_PKEY_meth_get0_info.3,v 1.3 2019/06/06 01:06:58 schwarze Exp $ -.\" OpenSSL EVP_PKEY_meth_get_count.pod 6a2da303 Aug 9 11:25:19 2017 -0400 -.\" OpenSSL EVP_PKEY_meth_get_count.pod 48ed9c23 Jul 25 17:48:26 2017 +0100 -.\" -.\" This file was written by Dr. Stephen Henson . -.\" Copyright (c) 2017 The OpenSSL Project. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in -.\" the documentation and/or other materials provided with the -.\" distribution. -.\" -.\" 3. All advertising materials mentioning features or use of this -.\" software must display the following acknowledgment: -.\" "This product includes software developed by the OpenSSL Project -.\" for use in the OpenSSL Toolkit. (http://www.openssl.org/)" -.\" -.\" 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to -.\" endorse or promote products derived from this software without -.\" prior written permission. For written permission, please contact -.\" openssl-core@openssl.org. -.\" -.\" 5. Products derived from this software may not be called "OpenSSL" -.\" nor may "OpenSSL" appear in their names without prior written -.\" permission of the OpenSSL Project. -.\" -.\" 6. Redistributions of any form whatsoever must retain the following -.\" acknowledgment: -.\" "This product includes software developed by the OpenSSL Project -.\" for use in the OpenSSL Toolkit (http://www.openssl.org/)" -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY -.\" EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR -.\" ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -.\" OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.Dd $Mdocdate: June 6 2019 $ -.Dt EVP_PKEY_METH_GET0_INFO 3 -.Os -.Sh NAME -.Nm EVP_PKEY_meth_get0_info -.Nd enumerate public key methods -.Sh SYNOPSIS -.In openssl/evp.h -.Ft void -.Fo EVP_PKEY_meth_get0_info -.Fa "int *ppkey_id" -.Fa "int *pflags" -.Fa "const EVP_PKEY_METHOD *meth" -.Fc -.Sh DESCRIPTION -The function -.Fn EVP_PKEY_meth_get0_info -retrieves the public key ID (a NID) and any flags associated with the -public key method -.Pf * Fa meth . -.Sh SEE ALSO -.Xr EVP_PKEY_meth_new 3 , -.Xr EVP_PKEY_new 3 -.Sh HISTORY -.Fn EVP_PKEY_meth_get0_info -first appeared in OpenSSL 1.0.1 and has been available since -.Ox 5.3 . diff --git a/lib/libcrypto/man/EVP_PKEY_meth_new.3 b/lib/libcrypto/man/EVP_PKEY_meth_new.3 deleted file mode 100644 index 5ec0b1210..000000000 --- a/lib/libcrypto/man/EVP_PKEY_meth_new.3 +++ /dev/null @@ -1,647 +0,0 @@ -.\" $OpenBSD: EVP_PKEY_meth_new.3,v 1.6 2023/09/09 14:35:23 schwarze Exp $ -.\" selective merge up to: OpenSSL 35fd9953 May 28 14:49:38 2019 +0200 -.\" -.\" This file is a derived work. -.\" The changes are covered by the following Copyright and license: -.\" -.\" Copyright (c) 2023 Ingo Schwarze -.\" -.\" Permission to use, copy, modify, and distribute this software for any -.\" purpose with or without fee is hereby granted, provided that the above -.\" copyright notice and this permission notice appear in all copies. -.\" -.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -.\" -.\" The original file was written by Paul Yang . -.\" Copyright (c) 2017 The OpenSSL Project. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in -.\" the documentation and/or other materials provided with the -.\" distribution. -.\" -.\" 3. All advertising materials mentioning features or use of this -.\" software must display the following acknowledgment: -.\" "This product includes software developed by the OpenSSL Project -.\" for use in the OpenSSL Toolkit. (http://www.openssl.org/)" -.\" -.\" 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to -.\" endorse or promote products derived from this software without -.\" prior written permission. For written permission, please contact -.\" openssl-core@openssl.org. -.\" -.\" 5. Products derived from this software may not be called "OpenSSL" -.\" nor may "OpenSSL" appear in their names without prior written -.\" permission of the OpenSSL Project. -.\" -.\" 6. Redistributions of any form whatsoever must retain the following -.\" acknowledgment: -.\" "This product includes software developed by the OpenSSL Project -.\" for use in the OpenSSL Toolkit (http://www.openssl.org/)" -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY -.\" EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR -.\" ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -.\" OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.Dd $Mdocdate: September 9 2023 $ -.Dt EVP_PKEY_METH_NEW 3 -.Os -.Sh NAME -.Nm EVP_PKEY_meth_new , -.Nm EVP_PKEY_meth_free , -.Nm EVP_PKEY_meth_copy , -.Nm EVP_PKEY_meth_find , -.Nm EVP_PKEY_meth_add0 , -.Nm EVP_PKEY_meth_set_init , -.Nm EVP_PKEY_meth_set_copy , -.Nm EVP_PKEY_meth_set_cleanup , -.Nm EVP_PKEY_meth_set_paramgen , -.Nm EVP_PKEY_meth_set_keygen , -.Nm EVP_PKEY_meth_set_sign , -.Nm EVP_PKEY_meth_set_verify , -.Nm EVP_PKEY_meth_set_verify_recover , -.Nm EVP_PKEY_meth_set_signctx , -.Nm EVP_PKEY_meth_set_verifyctx , -.Nm EVP_PKEY_meth_set_encrypt , -.Nm EVP_PKEY_meth_set_decrypt , -.Nm EVP_PKEY_meth_set_derive , -.Nm EVP_PKEY_meth_set_ctrl , -.Nm EVP_PKEY_meth_set_check , -.Nm EVP_PKEY_meth_set_public_check , -.Nm EVP_PKEY_meth_set_param_check , -.Nm EVP_PKEY_CTX_get_data , -.Nm EVP_PKEY_CTX_set_data -.Nd manipulate an EVP_PKEY_METHOD structure -.Sh SYNOPSIS -.In openssl/evp.h -.Ft EVP_PKEY_METHOD * -.Fo EVP_PKEY_meth_new -.Fa "int id" -.Fa "int flags" -.Fc -.Ft void -.Fo EVP_PKEY_meth_free -.Fa "EVP_PKEY_METHOD *pmeth" -.Fc -.Ft void -.Fo EVP_PKEY_meth_copy -.Fa "EVP_PKEY_METHOD *dst" -.Fa "const EVP_PKEY_METHOD *src" -.Fc -.Ft const EVP_PKEY_METHOD * -.Fo EVP_PKEY_meth_find -.Fa "int type" -.Fc -.Ft int -.Fo EVP_PKEY_meth_add0 -.Fa "const EVP_PKEY_METHOD *pmeth" -.Fc -.Ft void -.Fo EVP_PKEY_meth_set_init -.Fa "EVP_PKEY_METHOD *pmeth" -.Fa "int (*init)(EVP_PKEY_CTX *ctx)" -.Fc -.Ft void -.Fo EVP_PKEY_meth_set_copy -.Fa "EVP_PKEY_METHOD *pmeth" -.Fa "int (*copy)(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src)" -.Fc -.Ft void -.Fo EVP_PKEY_meth_set_cleanup -.Fa "EVP_PKEY_METHOD *pmeth" -.Fa "void (*cleanup)(EVP_PKEY_CTX *ctx)" -.Fc -.Ft void -.Fo EVP_PKEY_meth_set_paramgen -.Fa "EVP_PKEY_METHOD *pmeth" -.Fa "int (*paramgen_init)(EVP_PKEY_CTX *ctx)" -.Fa "int (*paramgen)(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)" -.Fc -.Ft void -.Fo EVP_PKEY_meth_set_keygen -.Fa "EVP_PKEY_METHOD *pmeth" -.Fa "int (*keygen_init)(EVP_PKEY_CTX *ctx)" -.Fa "int (*keygen)(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)" -.Fc -.Ft void -.Fo EVP_PKEY_meth_set_sign -.Fa "EVP_PKEY_METHOD *pmeth" -.Fa "int (*sign_init)(EVP_PKEY_CTX *ctx)" -.Fa "int (*sign)(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,\ - const unsigned char *tbs, size_t tbslen)" -.Fc -.Ft void -.Fo EVP_PKEY_meth_set_verify -.Fa "EVP_PKEY_METHOD *pmeth" -.Fa "int (*verify_init)(EVP_PKEY_CTX *ctx)" -.Fa "int (*verify)(EVP_PKEY_CTX *ctx, const unsigned char *sig,\ - size_t siglen, const unsigned char *tbs, size_t tbslen)" -.Fc -.Ft void -.Fo EVP_PKEY_meth_set_verify_recover -.Fa "EVP_PKEY_METHOD *pmeth" -.Fa "int (*verify_recover_init)(EVP_PKEY_CTX *ctx)" -.Fa "int (*verify_recover)(EVP_PKEY_CTX *ctx, unsigned char *sig,\ - size_t *siglen, const unsigned char *tbs, size_t tbslen)" -.Fc -.Ft void -.Fo EVP_PKEY_meth_set_signctx -.Fa "EVP_PKEY_METHOD *pmeth" -.Fa "int (*signctx_init)(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx)" -.Fa "int (*signctx)(EVP_PKEY_CTX *ctx, unsigned char *sig,\ - size_t *siglen, EVP_MD_CTX *mctx)" -.Fc -.Ft void -.Fo EVP_PKEY_meth_set_verifyctx -.Fa "EVP_PKEY_METHOD *pmeth" -.Fa "int (*verifyctx_init)(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx)" -.Fa "int (*verifyctx)(EVP_PKEY_CTX *ctx, const unsigned char *sig,\ - int siglen, EVP_MD_CTX *mctx)" -.Fc -.Ft void -.Fo EVP_PKEY_meth_set_encrypt -.Fa "EVP_PKEY_METHOD *pmeth" -.Fa "int (*encrypt_init)(EVP_PKEY_CTX *ctx)" -.Fa "int (*encryptfn)(EVP_PKEY_CTX *ctx, unsigned char *out,\ - size_t *outlen, const unsigned char *in, size_t inlen)" -.Fc -.Ft void -.Fo EVP_PKEY_meth_set_decrypt -.Fa "EVP_PKEY_METHOD *pmeth" -.Fa "int (*decrypt_init)(EVP_PKEY_CTX *ctx)" -.Fa "int (*decrypt)(EVP_PKEY_CTX *ctx, unsigned char *out,\ - size_t *outlen, const unsigned char *in, size_t inlen)" -.Fc -.Ft void -.Fo EVP_PKEY_meth_set_derive -.Fa "EVP_PKEY_METHOD *pmeth" -.Fa "int (*derive_init)(EVP_PKEY_CTX *ctx)" -.Fa "int (*derive)(EVP_PKEY_CTX *ctx, unsigned char *key, size_t *keylen)" -.Fc -.Ft void -.Fo EVP_PKEY_meth_set_ctrl -.Fa "EVP_PKEY_METHOD *pmeth" -.Fa "int (*ctrl)(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)" -.Fa "int (*ctrl_str)(EVP_PKEY_CTX *ctx, const char *type, const char *value)" -.Fc -.Ft void -.Fo EVP_PKEY_meth_set_check -.Fa "EVP_PKEY_METHOD *pmeth" -.Fa "int (*check)(EVP_PKEY *pkey)" -.Fc -.Ft void -.Fo EVP_PKEY_meth_set_public_check -.Fa "EVP_PKEY_METHOD *pmeth" -.Fa "int (*public_check)(EVP_PKEY *pkey)" -.Fc -.Ft void -.Fo EVP_PKEY_meth_set_param_check -.Fa "EVP_PKEY_METHOD *pmeth" -.Fa "int (*param_check)(EVP_PKEY *pkey)" -.Fc -.Ft void * -.Fo EVP_PKEY_CTX_get_data -.Fa "EVP_PKEY_CTX *ctx" -.Fc -.Ft void -.Fo EVP_PKEY_CTX_set_data -.Fa "EVP_PKEY_CTX *ctx" -.Fa "void *data" -.Fc -.Sh DESCRIPTION -The -.Vt EVP_PKEY_METHOD -structure holds a set of methods -for a specific public key cryptographic algorithm. -Those methods perform tasks such as generating keys, signing, verifying, -encrypting, decrypting, and so on. -.Pp -There are two places where the -.Vt EVP_PKEY_METHOD -objects are stored: one is a built-in static array representing the -standard methods for different algorithms, and the other one is a stack -of user-defined application-specific methods, which can be manipulated -with -.Fn EVP_PKEY_meth_add0 . -.Pp -The -.Vt EVP_PKEY_METHOD -objects are usually referenced by -.Vt EVP_PKEY_CTX -objects. -.Ss Methods -The methods implement the particular public key algorithm represented by the -.Vt EVP_PKEY_CTX -object. -.Bd -unfilled -.Ft int Fn (*init) "EVP_PKEY_CTX *ctx" -.Ft int Fn (*copy) "EVP_PKEY_CTX *dst" "EVP_PKEY_CTX *src" -.Ft void Fn (*cleanup) "EVP_PKEY_CTX *ctx" -.Ed -.Pp -The -.Fn init -method is called by -.Xr EVP_PKEY_CTX_new 3 -and -.Xr EVP_PKEY_CTX_new_id 3 -to initialize the algorithm-specific data when a new -.Vt EVP_PKEY_CTX -is created. -The -.Fn cleanup -method is called by -.Xr EVP_PKEY_CTX_free 3 -when an -.Vt EVP_PKEY_CTX -is freed. -The -.Fn copy -method is called by -.Xr EVP_PKEY_CTX_dup 3 -when an -.Vt EVP_PKEY_CTX -is duplicated. -.Bd -unfilled -.Ft int Fn (*paramgen_init) "EVP_PKEY_CTX *ctx" -.Ft int Fn (*paramgen) "EVP_PKEY_CTX *ctx" "EVP_PKEY *pkey" -.Ed -.Pp -The -.Fn paramgen_init -and -.Fn paramgen -methods deal with key parameter generation. -They are called by -.Xr EVP_PKEY_paramgen_init 3 -and -.Xr EVP_PKEY_paramgen 3 -to handle the parameter generation process. -.Bd -unfilled -.Ft int Fn (*keygen_init) "EVP_PKEY_CTX *ctx" -.Ft int Fn (*keygen) "EVP_PKEY_CTX *ctx" "EVP_PKEY *pkey" -.Ed -.Pp -The -.Fn keygen_init -and -.Fn keygen -methods are used to generate a key for the specified algorithm. -They are called by -.Xr EVP_PKEY_keygen_init 3 -and -.Xr EVP_PKEY_keygen 3 . -.Bd -unfilled -.Ft int Fn (*sign_init) "EVP_PKEY_CTX *ctx" -.Ft int Fo (*sign) -.Fa "EVP_PKEY_CTX *ctx" -.Fa "unsigned char *sig" -.Fa "size_t *siglen" -.Fa "const unsigned char *tbs" -.Fa "size_t tbslen" -.Fc -.Ed -.Pp -The -.Fn sign_init -and -.Fn sign -methods are used to generate the signature of a piece of data using a -private key. -They are called by -.Xr EVP_PKEY_sign_init 3 -and -.Xr EVP_PKEY_sign 3 . -.Bd -unfilled -.Ft int Fn (*verify_init) "EVP_PKEY_CTX *ctx" -.Ft int Fo (*verify) -.Fa "EVP_PKEY_CTX *ctx" -.Fa "const unsigned char *sig" -.Fa "size_t siglen" -.Fa "const unsigned char *tbs" -.Fa "size_t tbslen" -.Fc -.Ed -.Pp -The -.Fn verify_init -and -.Fn verify -methods are used to verify whether a signature is valid. -They are called by -.Xr EVP_PKEY_verify_init 3 -and -.Xr EVP_PKEY_verify 3 . -.Bd -unfilled -.Ft int Fn (*verify_recover_init) "EVP_PKEY_CTX *ctx" -.Ft int Fo (*verify_recover) -.Fa "EVP_PKEY_CTX *ctx" -.Fa "unsigned char *rout" -.Fa "size_t *routlen" -.Fa "const unsigned char *sig" -.Fa "size_t siglen" -.Fc -.Ed -.Pp -The -.Fn verify_recover_init -and -.Fn verify_recover -methods are used to verify a signature and then recover the digest from -the signature (for instance, a signature that was generated by the RSA -signing algorithm). -They are called by -.Xr EVP_PKEY_verify_recover_init 3 -and -.Xr EVP_PKEY_verify_recover 3 . -.Bd -unfilled -.Ft int Fn (*signctx_init) "EVP_PKEY_CTX *ctx" "EVP_MD_CTX *mctx" -.Ft int Fo (*signctx) -.Fa "EVP_PKEY_CTX *ctx" -.Fa "unsigned char *sig" -.Fa "size_t *siglen" -.Fa "EVP_MD_CTX *mctx" -.Fc -.Ed -.Pp -The -.Fn signctx_init -and -.Fn signctx -methods are used to sign a digest represented by an -.Vt EVP_MD_CTX -object. -They are called by the -.Xr EVP_DigestSignInit 3 -functions. -.Bd -unfilled -.Ft int Fn (*verifyctx_init) "EVP_PKEY_CTX *ctx" "EVP_MD_CTX *mctx" -.Ft int Fo (*verifyctx) -.Fa "EVP_PKEY_CTX *ctx" -.Fa "const unsigned char *sig" -.Fa "int siglen" -.Fa "EVP_MD_CTX *mctx" -.Fc -.Ed -.Pp -The -.Fn verifyctx_init -and -.Fn verifyctx -methods are used to verify a signature against the data in an -.Vt EVP_MD_CTX -object. -They are called by the -.Xr EVP_DigestVerifyInit 3 -functions. -.Bd -unfilled -.Ft int Fn (*encrypt_init) "EVP_PKEY_CTX *ctx" -.Ft int Fo (*encrypt) -.Fa "EVP_PKEY_CTX *ctx" -.Fa "unsigned char *out" -.Fa "size_t *outlen" -.Fa "const unsigned char *in" -.Fa "size_t inlen" -.Fc -.Ed -.Pp -The -.Fn encrypt_init -and -.Fn encrypt -methods are used to encrypt a piece of data. -They are called by -.Xr EVP_PKEY_encrypt_init 3 -and -.Xr EVP_PKEY_encrypt 3 . -.Bd -unfilled -.Ft int Fn (*decrypt_init) "EVP_PKEY_CTX *ctx" -.Ft int Fo (*decrypt) -.Fa "EVP_PKEY_CTX *ctx" -.Fa "unsigned char *out" -.Fa "size_t *outlen" -.Fa "const unsigned char *in" -.Fa "size_t inlen" -.Fc -.Ed -.Pp -The -.Fn decrypt_init -and -.Fn decrypt -methods are used to decrypt a piece of data. -They are called by -.Xr EVP_PKEY_decrypt_init 3 -and -.Xr EVP_PKEY_decrypt 3 . -.Bd -unfilled -.Ft int Fn (*derive_init) "EVP_PKEY_CTX *ctx" -.Ft int Fo (*derive) -.Fa "EVP_PKEY_CTX *ctx" -.Fa "unsigned char *key" -.Fa "size_t *keylen" -.Fc -.Ed -.Pp -The -.Fn derive_init -and -.Fn derive -methods are used to derive the shared secret from a public key algorithm -(for instance, the DH algorithm). -They are called by -.Xr EVP_PKEY_derive_init 3 -and -.Xr EVP_PKEY_derive 3 . -.Bd -unfilled -.Ft int Fo (*ctrl) -.Fa "EVP_PKEY_CTX *ctx" -.Fa "int type" -.Fa "int p1" -.Fa "void *p2" -.Fc -.Ft int Fo (*ctrl_str) -.Fa "EVP_PKEY_CTX *ctx" -.Fa "const char *type" -.Fa "const char *value" -.Fc -.Ed -.Pp -The -.Fn ctrl -and -.Fn ctrl_str -methods are used to adjust algorithm-specific settings. -See -.Xr EVP_PKEY_CTX_ctrl 3 -for details. -.Bd -unfilled -.Ft int Fn (*check) "EVP_PKEY *pkey" -.Ft int Fn (*public_check) "EVP_PKEY *pkey" -.Ft int Fn (*param_check) "EVP_PKEY *pkey" -.Ed -These methods are used to validate a key pair, the public component, -and the parameters for the given -.Fa pkey , -respectively. -They are called by -.Xr EVP_PKEY_check 3 , -.Xr EVP_PKEY_public_check 3 , -and -.Xr EVP_PKEY_param_check 3 , -respectively. -.Ss Functions -.Fn EVP_PKEY_meth_new -creates a new -.Vt EVP_PKEY_METHOD -object with the given -.Fa id -and -.Fa flags . -The following flags are supported: -.Bl -tag -width Ds -.It Dv EVP_PKEY_FLAG_AUTOARGLEN -Automatically calculate the maximum size of the output buffer -in corresponding EVP methods by the EVP framework. -Thus the implementations of these methods don't need to care about -handling the case of returning output buffer size by themselves. -For details on the output buffer size, refer to -.Xr EVP_PKEY_sign 3 . -.It Dv EVP_PKEY_FLAG_SIGCTX_CUSTOM -Indicate that the -.Fn signctx -method of an -.Vt EVP_PKEY_METHOD -is always called by the EVP framework while doing a digest signing -operation by calling -.Xr EVP_DigestSignFinal 3 . -.El -.Pp -.Fn EVP_PKEY_meth_free -frees -.Fa pmeth . -.Pp -.Fn EVP_PKEY_meth_copy -copies -.Fa src -to -.Fa dst . -.Pp -.Fn EVP_PKEY_meth_find -finds an -.Vt EVP_PKEY_METHOD -object with the given -.Fa id . -This function first searches through the user-defined method objects and -then through the built-in objects. -.Pp -.Fn EVP_PKEY_meth_add0 -adds -.Fa pmeth -to the stack of user defined methods. -.Pp -The -.Fn EVP_PKEY_meth_set_* -functions set the corresponding fields of -.Fa pmeth -to the arguments passed. -.Pp -.Fn EVP_PKEY_CTX_get_data -retrieves algorithm- and implementation-specific private key data from -.Fa ctx . -Public key algorithm implementations typically allocate and initialize -this data automatically in their -.Fn init -function. -.Pp -.Fn EVP_PKEY_CTX_set_data -transfers ownership of the given -.Fa data -to -.Fa ctx , -replacing the existing algorithm- and implementation-specific -private key data. -It is the responsibility of the caller to free the existing data -before calling this function. -.Sh RETURN VALUES -.Fn EVP_PKEY_meth_new -returns a pointer to a new -.Vt EVP_PKEY_METHOD -object or -.Dv NULL -on error. -.Pp -.Fn EVP_PKEY_meth_find -returns a pointer to the found -.Vt EVP_PKEY_METHOD -object or -.Dv NULL -if no matching object is found. -.Pp -.Fn EVP_PKEY_meth_add0 -returns 1 if the method is added successfully or 0 if an error occurred. -.Pp -.Fn EVP_PKEY_CTX_get_data -returns an internal pointer owned by -.Fa ctx . -.Sh SEE ALSO -.Xr EVP_DigestInit 3 , -.Xr EVP_PKEY_meth_get0_info 3 , -.Xr EVP_PKEY_new 3 -.Sh HISTORY -.Fn EVP_PKEY_meth_new , -.Fn EVP_PKEY_meth_free , -.Fn EVP_PKEY_meth_find , -.Fn EVP_PKEY_meth_add0 , -.Fn EVP_PKEY_meth_set_init , -.Fn EVP_PKEY_meth_set_copy , -.Fn EVP_PKEY_meth_set_cleanup , -.Fn EVP_PKEY_meth_set_paramgen , -.Fn EVP_PKEY_meth_set_keygen , -.Fn EVP_PKEY_meth_set_sign , -.Fn EVP_PKEY_meth_set_verify , -.Fn EVP_PKEY_meth_set_verify_recover , -.Fn EVP_PKEY_meth_set_signctx , -.Fn EVP_PKEY_meth_set_verifyctx , -.Fn EVP_PKEY_meth_set_encrypt , -.Fn EVP_PKEY_meth_set_decrypt , -.Fn EVP_PKEY_meth_set_derive , -.Fn EVP_PKEY_meth_set_ctrl , -.Fn EVP_PKEY_CTX_get_data , -and -.Fn EVP_PKEY_CTX_set_data -first appeared in OpenSSL 1.0.0 and have been available since -.Ox 4.9 . -.Pp -.Fn EVP_PKEY_meth_copy -first appeared in OpenSSL 1.0.1 and has been available since -.Ox 5.3 . -.Pp -.Fn EVP_PKEY_meth_set_check , -.Fn EVP_PKEY_meth_set_public_check , -and -.Fn EVP_PKEY_meth_set_param_check -first appeared in OpenSSL 1.1.1 and have been available since -.Ox 7.1 . diff --git a/lib/libcrypto/man/EVP_PKEY_new.3 b/lib/libcrypto/man/EVP_PKEY_new.3 index ea22b5eb0..3b1ef029c 100644 --- a/lib/libcrypto/man/EVP_PKEY_new.3 +++ b/lib/libcrypto/man/EVP_PKEY_new.3 @@ -1,10 +1,10 @@ -.\" $OpenBSD: EVP_PKEY_new.3,v 1.20 2024/08/24 09:15:36 tb Exp $ +.\" $OpenBSD: EVP_PKEY_new.3,v 1.26 2024/12/10 15:10:26 schwarze Exp $ .\" full merge up to: OpenSSL 4dcfdfce May 27 11:50:05 2020 +0100 .\" .\" This file is a derived work. .\" The changes are covered by the following Copyright and license: .\" -.\" Copyright (c) 2022 Ingo Schwarze +.\" Copyright (c) 2022, 2024 Ingo Schwarze .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above @@ -66,7 +66,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: August 24 2024 $ +.Dd $Mdocdate: December 10 2024 $ .Dt EVP_PKEY_NEW 3 .Os .Sh NAME @@ -75,7 +75,6 @@ .Nm EVP_PKEY_free , .Nm EVP_PKEY_new_raw_private_key , .Nm EVP_PKEY_new_raw_public_key , -.Nm EVP_PKEY_new_CMAC_key , .Nm EVP_PKEY_new_mac_key , .Nm EVP_PKEY_get_raw_private_key , .Nm EVP_PKEY_get_raw_public_key @@ -107,13 +106,6 @@ .Fa "size_t rawlen" .Fc .Ft EVP_PKEY * -.Fo EVP_PKEY_new_CMAC_key -.Fa "ENGINE *engine" -.Fa "const unsigned char *rawpriv" -.Fa "size_t rawlen" -.Fa "const EVP_CIPHER *cipher" -.Fc -.Ft EVP_PKEY * .Fo EVP_PKEY_new_mac_key .Fa "int type" .Fa "ENGINE *engine" @@ -198,22 +190,13 @@ Algorithm types that support raw public keys are and .Dv EVP_PKEY_ED25519 . .Pp -.Fn EVP_PKEY_new_CMAC_key -works in the same way as -.Fn EVP_PKEY_new_raw_private_key -except that it only handles the -.Dv EVP_PKEY_CMAC -algorithm type. -The additional -.Fa cipher -argument specifies the cipher algorithm -to be used during the creation of the CMAC. -It should be a standard encryption only cipher. -For example, AEAD and XTS ciphers should not be used. -.Pp .Fn EVP_PKEY_new_mac_key -is a deprecated function that works in the same way as -.Fn EVP_PKEY_new_raw_private_key . +is a deprecated function that achieves the same effect as +.Fn EVP_PKEY_new_raw_private_key +in a more complicated way and only works with a +.Fa type +of +.Dv EVP_PKEY_HMAC . .Pp .Fn EVP_PKEY_get_raw_private_key writes up to @@ -250,7 +233,6 @@ and .Fn EVP_PKEY_new , .Fn EVP_PKEY_new_raw_private_key , .Fn EVP_PKEY_new_raw_public_key , -.Fn EVP_PKEY_new_CMAC_key , and .Fn EVP_PKEY_new_mac_key return either the newly allocated @@ -264,17 +246,79 @@ if an error occurred. and .Fn EVP_PKEY_get_raw_public_key return 1 for success or 0 for failure. +.Sh EXAMPLES +The following code digests a message with HMAC-SHA256: +.Bd -literal -offset indent +/* Bogus key: would normally be set from another source */ +const unsigned char *key = "key"; +const size_t key_len = strlen(key); + +const char *msg = "The quick brown fox jumps over the lazy dog"; +const size_t msg_len = strlen(msg); + +unsigned char *out_mac; +size_t out_len, i; + +EVP_PKEY *pkey; +EVP_MD_CTX *md_ctx; + +pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_HMAC, NULL, + key, key_len); +if (pkey == NULL) + err(1, "EVP_PKEY_new_raw_private_key"); + +md_ctx = EVP_MD_CTX_new(); +if (md_ctx == NULL) + err(1, "EVP_MD_CTX_new"); + +if (EVP_DigestSignInit(md_ctx, NULL, EVP_sha256(), NULL, pkey) == 0) + err(1, "EVP_DigestSignInit"); +if (EVP_DigestSign(md_ctx, NULL, &out_len, msg, msg_len) == 0) + err(1, "EVP_DigestSign(NULL)"); +if ((out_mac = calloc(1, out_len)) == NULL) + err(1, "calloc"); +if (EVP_DigestSign(md_ctx, out_mac, &out_len, msg, msg_len) == 0) + err(1, "EVP_DigestSign(MAC)"); + +EVP_MD_CTX_free(md_ctx); +EVP_PKEY_free(pkey); + +printf(" MAC = "); +for (i = 0; i < out_len; i++) + printf("%02x", out_mac[i]); +printf("\en"); +free(out_mac); +.Ed +.Pp +Even though the type name +.Vt EVP_PKEY +was originally intended to stand for +.Dq private key +and the +.Xr EVP_DigestSignInit 3 +API was designed for digital signatures in the context of public key +cryptography, both are also used here because a MAC also requires a key, +even though that is a symmetric key. +.Pp +The same code can be used for signing with Ed25519 by making the key +.Dv ED25519_PRIVATE_KEY_LENGTH No = 32 +bytes long, replacing +.Dv EVP_PKEY_HMAC +with +.Dv EVP_PKEY_ED25519 , +and replacing the call to +.Xr EVP_sha256 3 +with +.Dv NULL . .Sh SEE ALSO .Xr CMAC_Init 3 , .Xr d2i_PrivateKey 3 , .Xr evp 3 , .Xr EVP_PKCS82PKEY 3 , -.Xr EVP_PKEY_asn1_new 3 , -.Xr EVP_PKEY_check 3 , .Xr EVP_PKEY_cmp 3 , .Xr EVP_PKEY_CTX_new 3 , .Xr EVP_PKEY_get_default_digest_nid 3 , -.Xr EVP_PKEY_meth_new 3 , +.Xr EVP_PKEY_new_CMAC_key 3 , .Xr EVP_PKEY_print_private 3 , .Xr EVP_PKEY_set1_RSA 3 , .Xr EVP_PKEY_size 3 , @@ -286,10 +330,6 @@ and first appeared in SSLeay 0.6.0 and have been available since .Ox 2.4 . .Pp -.Fn EVP_PKEY_new_CMAC_key -first appeared in OpenSSL 1.1.1 and has been available since -.Ox 6.9 . -.Pp .Fn EVP_PKEY_new_mac_key first appeared in OpenSSL 1.0.0 and has been available since .Ox 4.9 . diff --git a/lib/libcrypto/man/EVP_PKEY_new_CMAC_key.3 b/lib/libcrypto/man/EVP_PKEY_new_CMAC_key.3 new file mode 100644 index 000000000..d09af3a01 --- /dev/null +++ b/lib/libcrypto/man/EVP_PKEY_new_CMAC_key.3 @@ -0,0 +1,159 @@ +.\" $OpenBSD: EVP_PKEY_new_CMAC_key.3,v 1.1 2024/11/12 20:00:36 schwarze Exp $ +.\" +.\" Copyright (c) 2024 Ingo Schwarze +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd $Mdocdate: November 12 2024 $ +.Dt EVP_PKEY_NEW_CMAC_KEY 3 +.Os +.Sh NAME +.Nm EVP_PKEY_new_CMAC_key +.Nd CMAC in the EVP framework +.Sh SYNOPSIS +.In openssl/evp.h +.Ft EVP_PKEY * +.Fo EVP_PKEY_new_CMAC_key +.Fa "ENGINE *engine" +.Fa "const unsigned char *key" +.Fa "size_t key_len" +.Fa "const EVP_CIPHER *cipher" +.Fc +.Sh DESCRIPTION +.Fn EVP_PKEY_new_CMAC_key +allocates a new +.Vt EVP_PKEY +object, sets its type to +.Dv EVP_PKEY_CMAC , +and configures it as a wrapper around the low-level functions documented in +.Xr CMAC_Init 3 +using the block +.Fa cipher +with the symmetric +.Fa key +that is +.Fa key_len +bytes long. +.Pp +Functions to obtain suitable +.Vt EVP_CIPHER +objects are listed in the CIPHER LISTING section of the +.Xr EVP_EncryptInit 3 +manual page. +Always use an object that implements the CBC mode of operation. +As in +.Xr CMAC_Init 3 , +only ciphers with a block size of either 64 or 128 bits +are supported by this implementation. +.Pp +The +.Fa engine +argument is ignored; passing +.Dv NULL +is recommended. +.Sh RETURN VALUES +.Fn EVP_PKEY_new_CMAC_key +returns the newly allocated +.Vt EVP_PKEY +structure or +.Dv NULL +if an error occurred. +.Sh EXAMPLES +The following code digests a message with AES-CMAC +using the key length of 128 bits specified in RFC 4493. +.Bd -literal -offset indent +/* Bogus key: would normally be set from another source. */ +const unsigned char key[] = "symmetric secret"; +const size_t key_len = strlen(key); /* 16 = 128/8 */ + +const char *msg = "Hello World!"; +const size_t msg_len = strlen(msg); + +unsigned char out_mac[16]; +size_t out_len = sizeof(out_mac); +size_t i; + +EVP_PKEY *pkey; +EVP_MD_CTX *md_ctx; + +pkey = EVP_PKEY_new_CMAC_key(NULL, key, key_len, EVP_aes_128_cbc()); +if (pkey == NULL) + err(1, "EVP_PKEY_new_CMAC_key"); +md_ctx = EVP_MD_CTX_new(); +if (md_ctx == NULL) + err(1, "EVP_MD_CTX_new"); + +if (EVP_DigestSignInit(md_ctx, NULL, NULL, NULL, pkey) == 0) + err(1, "EVP_DigestSignInit"); +if (EVP_DigestSign(md_ctx, out_mac, &out_len, msg, msg_len) == 0) + err(1, "EVP_DigestSign"); +EVP_MD_CTX_free(md_ctx); +EVP_PKEY_free(pkey); + +printf(" MAC = "); +for (i = 0; i < out_len; i++) + printf("%02x:", out_mac[i]); +printf("\en"); +.Ed +.Pp +Consider the following details: +.Bl -bullet -width 1n +.It +Even though the type name +.Vt EVP_PKEY +was originally intended to stand for +.Dq private key +and the +.Xr EVP_DigestSignInit 3 +API was designed for digital signatures in the context +of public key cryptography, both are also used here because a MAC +also requires a key, even though that is a symmetric key. +.It +In contrast to digital signing which requires both a digest algorithm +and a private key, the CMAC algorithm only requires a block cipher +and a shared key, both of which are stored in the somewhat abused +.Vt EVP_PKEY +object. +Consequently, the +.Vt "EVP_MD *type" +argument of +.Xr EVP_DigestSignInit 3 +has to be set to +.Dv NULL . +.It +The size of the resulting message digest equals the block size +of the used cipher. +.It +The function +.Xr EVP_DigestSignInit 3 +does not transfer ownership of the +.Fa pkey +object to +.Ft md_ctx +but merely increments the reference count. +Consequently, the caller is responsible for freeing the +.Vt EVP_PKEY +object when it is no longer needed. +.El +.Sh SEE ALSO +.Xr CMAC_Init 3 , +.Xr evp 3 , +.Xr EVP_DigestSignInit 3 , +.Xr EVP_EncryptInit 3 , +.Xr EVP_PKEY_new 3 +.Sh STANDARDS +RFC 4493: The AES-CMAC Algorithm +.Sh HISTORY +.Fn EVP_PKEY_new_CMAC_key +first appeared in OpenSSL 1.1.1 and has been available since +.Ox 6.9 . diff --git a/lib/libcrypto/man/EVP_PKEY_print_private.3 b/lib/libcrypto/man/EVP_PKEY_print_private.3 index c1e689981..a4b51a4bb 100644 --- a/lib/libcrypto/man/EVP_PKEY_print_private.3 +++ b/lib/libcrypto/man/EVP_PKEY_print_private.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_PKEY_print_private.3,v 1.7 2019/06/06 01:06:58 schwarze Exp $ +.\" $OpenBSD: EVP_PKEY_print_private.3,v 1.8 2024/12/06 12:51:13 schwarze Exp $ .\" OpenSSL 99d63d46 Oct 26 13:56:48 2016 -0400 .\" .\" This file was written by Dr. Stephen Henson . @@ -48,7 +48,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: June 6 2019 $ +.Dd $Mdocdate: December 6 2024 $ .Dt EVP_PKEY_PRINT_PRIVATE 3 .Os .Sh NAME @@ -120,7 +120,6 @@ failure. In particular, a return value of -2 indicates the operation is not supported by the public key algorithm. .Sh SEE ALSO -.Xr EVP_PKEY_asn1_set_public 3 , .Xr EVP_PKEY_CTX_new 3 , .Xr EVP_PKEY_keygen 3 , .Xr EVP_PKEY_new 3 diff --git a/lib/libcrypto/man/EVP_PKEY_set1_RSA.3 b/lib/libcrypto/man/EVP_PKEY_set1_RSA.3 index 3d6dce0bb..39404f528 100644 --- a/lib/libcrypto/man/EVP_PKEY_set1_RSA.3 +++ b/lib/libcrypto/man/EVP_PKEY_set1_RSA.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_PKEY_set1_RSA.3,v 1.23 2024/04/18 16:32:22 tb Exp $ +.\" $OpenBSD: EVP_PKEY_set1_RSA.3,v 1.24 2024/12/09 11:25:25 schwarze Exp $ .\" full merge up to: OpenSSL 99d63d46 Oct 26 13:56:48 2016 -0400 .\" .\" This file is a derived work. @@ -65,7 +65,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: April 18 2024 $ +.Dd $Mdocdate: December 9 2024 $ .Dt EVP_PKEY_SET1_RSA 3 .Os .Sh NAME @@ -96,6 +96,11 @@ .\" The function X509_certificate_type(3) is intentionally undocumented .\" and scheduled for deletion from the library. BoringSSL already .\" deleted it and OpenSSL deprecates it in version 3.0. +.\" The following constants are also intentionally undocumented +.\" because they are only used by that function: +.\" EVP_PK_DH EVP_PK_DSA EVP_PK_EC EVP_PK_RSA +.\" EVP_PKS_DSA EVP_PKS_EC EVP_PKS_RSA +.\" EVP_PKT_ENC EVP_PKT_EXCH EVP_PKT_EXP EVP_PKT_SIGN .Nd EVP_PKEY assignment functions .Sh SYNOPSIS .In openssl/evp.h diff --git a/lib/libcrypto/man/EVP_PKEY_sign.3 b/lib/libcrypto/man/EVP_PKEY_sign.3 index fbd8e6637..d73b0abb7 100644 --- a/lib/libcrypto/man/EVP_PKEY_sign.3 +++ b/lib/libcrypto/man/EVP_PKEY_sign.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_PKEY_sign.3,v 1.8 2022/03/31 17:27:17 naddy Exp $ +.\" $OpenBSD: EVP_PKEY_sign.3,v 1.9 2024/12/06 14:27:49 schwarze Exp $ .\" OpenSSL 99d63d46 Oct 26 13:56:48 2016 -0400 .\" .\" This file was written by Dr. Stephen Henson . @@ -49,7 +49,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: March 31 2022 $ +.Dd $Mdocdate: December 6 2024 $ .Dt EVP_PKEY_SIGN 3 .Os .Sh NAME @@ -180,7 +180,6 @@ if (EVP_PKEY_sign(ctx, sig, &siglen, md, mdlen) <= 0) .Xr EVP_PKEY_decrypt 3 , .Xr EVP_PKEY_derive 3 , .Xr EVP_PKEY_encrypt 3 , -.Xr EVP_PKEY_meth_set_sign 3 , .Xr EVP_PKEY_verify 3 , .Xr EVP_PKEY_verify_recover 3 .Sh HISTORY diff --git a/lib/libcrypto/man/EVP_PKEY_size.3 b/lib/libcrypto/man/EVP_PKEY_size.3 index f49678d0a..cd25eec9c 100644 --- a/lib/libcrypto/man/EVP_PKEY_size.3 +++ b/lib/libcrypto/man/EVP_PKEY_size.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_PKEY_size.3,v 1.3 2024/03/05 19:21:31 tb Exp $ +.\" $OpenBSD: EVP_PKEY_size.3,v 1.4 2024/12/06 12:51:13 schwarze Exp $ .\" full merge up to: OpenSSL eed9d03b Jan 8 11:04:15 2020 +0100 .\" .\" This file is a derived work. @@ -65,7 +65,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: March 5 2024 $ +.Dd $Mdocdate: December 6 2024 $ .Dt EVP_PKEY_SIZE 3 .Os .Sh NAME @@ -134,7 +134,6 @@ For those functions, it isn't strictly necessary to call to find out the buffer size, but it may still be useful in cases where it's desirable to know the upper limit in advance. .Pp -By default, .Fn EVP_PKEY_size is supported for the following algorithms: .Bl -column ED25519 "EVP_MAX_BLOCK_LENGTH = 32" @@ -156,15 +155,12 @@ the situation is special: while the key size is .Fn EVP_PKEY_size returns 64 because the signature is longer than the keys. .Pp -The application program can support additional algorithms by calling -.Xr EVP_PKEY_asn1_set_public 3 . -.Pp .Fn EVP_PKEY_bits returns the cryptographic length of the cryptosystem to which the key in .Fa pkey belongs, in bits. The definition of cryptographic length is specific to the key cryptosystem. -By default, the following algorithms are supported: +The following algorithms are supported: .Bl -column ED25519 "the public domain parameter p" DSA_bits(3) .It Ta cryptographic length = Ta same result as from: .It Ta significant bits in ... Ta @@ -176,14 +172,11 @@ By default, the following algorithms are supported: .It X25519 Ta 253 Ta \(em .El .Pp -The application program can support additional algorithms by calling -.Xr EVP_PKEY_asn1_set_public 3 . -.Pp .Fn EVP_PKEY_security_bits returns the security strength measured in bits of the given .Fa pkey as defined in NIST SP800-57. -By default, the following algorithms are supported: +The following algorithms are supported: .Bl -column ED25519 DSA_security_bits(3) .It Ta same result as from: .It DH Ta Xr DH_security_bits 3 @@ -196,9 +189,6 @@ By default, the following algorithms are supported: .Pp For EC keys, if the result is greater than 80, it is rounded down to 256, 192, 128, 112, or 80. -.Pp -The application program can support additional algorithms by calling -.Xr EVP_PKEY_asn1_set_security_bits 3 . .Sh RETURN VALUES .Fn EVP_PKEY_size and diff --git a/lib/libcrypto/man/EVP_PKEY_verify.3 b/lib/libcrypto/man/EVP_PKEY_verify.3 index c4d983320..d096a3a7b 100644 --- a/lib/libcrypto/man/EVP_PKEY_verify.3 +++ b/lib/libcrypto/man/EVP_PKEY_verify.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_PKEY_verify.3,v 1.7 2018/03/23 04:34:23 schwarze Exp $ +.\" $OpenBSD: EVP_PKEY_verify.3,v 1.8 2024/12/06 14:27:49 schwarze Exp $ .\" full merge up to: OpenSSL 48e5119a Jan 19 10:49:22 2018 +0100 .\" .\" This file was written by Dr. Stephen Henson . @@ -49,7 +49,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: March 23 2018 $ +.Dd $Mdocdate: December 6 2024 $ .Dt EVP_PKEY_VERIFY 3 .Os .Sh NAME @@ -157,7 +157,6 @@ ret = EVP_PKEY_verify(ctx, sig, siglen, md, mdlen); .Xr EVP_PKEY_decrypt 3 , .Xr EVP_PKEY_derive 3 , .Xr EVP_PKEY_encrypt 3 , -.Xr EVP_PKEY_meth_set_verify 3 , .Xr EVP_PKEY_sign 3 , .Xr EVP_PKEY_verify_recover 3 .Sh HISTORY diff --git a/lib/libcrypto/man/EVP_PKEY_verify_recover.3 b/lib/libcrypto/man/EVP_PKEY_verify_recover.3 index 3a55faccd..30c034cdb 100644 --- a/lib/libcrypto/man/EVP_PKEY_verify_recover.3 +++ b/lib/libcrypto/man/EVP_PKEY_verify_recover.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_PKEY_verify_recover.3,v 1.9 2018/03/23 04:34:23 schwarze Exp $ +.\" $OpenBSD: EVP_PKEY_verify_recover.3,v 1.10 2024/12/06 14:27:49 schwarze Exp $ .\" full merge up to: OpenSSL 48e5119a Jan 19 10:49:22 2018 +0100 .\" .\" This file was written by Dr. Stephen Henson . @@ -49,7 +49,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: March 23 2018 $ +.Dd $Mdocdate: December 6 2024 $ .Dt EVP_PKEY_VERIFY_RECOVER 3 .Os .Sh NAME @@ -178,7 +178,6 @@ if (EVP_PKEY_verify_recover(ctx, rout, &routlen, sig, siglen) <= 0) .Xr EVP_PKEY_decrypt 3 , .Xr EVP_PKEY_derive 3 , .Xr EVP_PKEY_encrypt 3 , -.Xr EVP_PKEY_meth_set_verify_recover 3 , .Xr EVP_PKEY_sign 3 , .Xr EVP_PKEY_verify 3 .Sh HISTORY diff --git a/lib/libcrypto/man/EVP_SignInit.3 b/lib/libcrypto/man/EVP_SignInit.3 index 6064bc794..8158b21db 100644 --- a/lib/libcrypto/man/EVP_SignInit.3 +++ b/lib/libcrypto/man/EVP_SignInit.3 @@ -1,6 +1,5 @@ -.\" $OpenBSD: EVP_SignInit.3,v 1.19 2024/07/21 09:24:07 tb Exp $ -.\" full merge up to: OpenSSL b97fdb57 Nov 11 09:33:09 2016 +0100 -.\" selective merge up to: OpenSSL 79b49fb0 Mar 20 10:03:10 2018 +1000 +.\" $OpenBSD: EVP_SignInit.3,v 1.21 2024/12/06 12:51:13 schwarze Exp $ +.\" full merge up to: OpenSSL 6328d367 Jul 4 21:58:30 2020 +0200 .\" .\" This file was written by Dr. Stephen Henson . .\" Copyright (c) 2000-2002, 2005, 2006, 2014-2016 The OpenSSL Project. @@ -50,7 +49,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: July 21 2024 $ +.Dd $Mdocdate: December 6 2024 $ .Dt EVP_SIGNINIT 3 .Os .Sh NAME @@ -86,20 +85,23 @@ .Fa "const EVP_MD *type" .Fc .Sh DESCRIPTION -The EVP signature routines are a high level interface to digital +The EVP signature routines are a high-level interface to digital signatures. .Pp .Fn EVP_SignInit_ex -sets up a signing context +sets up the signing context .Fa ctx to use the digest .Fa type . +Before calling this function, obtain .Fa ctx -must be initialized with -.Xr EVP_MD_CTX_init 3 -before calling this function. +from +.Xr EVP_MD_CTX_new 3 +or call +.Xr EVP_MD_CTX_reset 3 +on it. The -.Fa ENGINE *engine +.Fa engine argument is always ignored and passing .Dv NULL is recommended. @@ -142,7 +144,7 @@ to use the default implementation of digest .Fa type . .Pp The EVP interface to digital signatures should almost always be -used in preference to the low level interfaces. +used in preference to the low-level interfaces. This is because the code then becomes transparent to the algorithm used and much more flexible. .Pp @@ -177,7 +179,6 @@ The error codes can be obtained by .Sh SEE ALSO .Xr evp 3 , .Xr EVP_DigestInit 3 , -.Xr EVP_PKEY_asn1_set_public 3 , .Xr EVP_PKEY_size 3 , .Xr EVP_VerifyInit 3 .Sh HISTORY diff --git a/lib/libcrypto/man/EVP_VerifyInit.3 b/lib/libcrypto/man/EVP_VerifyInit.3 index dfebe8f2b..0baadfb9f 100644 --- a/lib/libcrypto/man/EVP_VerifyInit.3 +++ b/lib/libcrypto/man/EVP_VerifyInit.3 @@ -1,6 +1,5 @@ -.\" $OpenBSD: EVP_VerifyInit.3,v 1.12 2024/07/21 08:36:43 tb Exp $ -.\" full merge up to: OpenSSL b97fdb57 Nov 11 09:33:09 2016 +0100 -.\" selective merge up to: OpenSSL 79b49fb0 Mar 20 10:03:10 2018 +1000 +.\" $OpenBSD: EVP_VerifyInit.3,v 1.13 2024/11/08 22:23:35 schwarze Exp $ +.\" full merge up to: OpenSSL 24a535ea Sep 22 13:14:20 2020 +0100 .\" .\" This file was written by Dr. Stephen Henson . .\" Copyright (c) 2000, 2001, 2006, 2016 The OpenSSL Project. @@ -50,7 +49,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: July 21 2024 $ +.Dd $Mdocdate: November 8 2024 $ .Dt EVP_VERIFYINIT 3 .Os .Sh NAME @@ -86,20 +85,23 @@ .Fa "const EVP_MD *type" .Fc .Sh DESCRIPTION -The EVP signature verification routines are a high level interface to +The EVP signature verification routines are a high-level interface to digital signatures. .Pp .Fn EVP_VerifyInit_ex -sets up a verification context +sets up the verification context .Fa ctx to use the digest .Fa type . +Before calling this function, obtain .Fa ctx -must be initialized by calling -.Xr EVP_MD_CTX_init 3 -before calling this function. +from +.Xr EVP_MD_CTX_new 3 +or call +.Xr EVP_MD_CTX_reset 3 +on it. The -.Fa ENGINE *engine +.Fa engine argument is always ignored and passing .Dv NULL is recommended. @@ -132,7 +134,7 @@ to use the default implementation of digest .Fa type . .Pp The EVP interface to digital signatures should almost always be -used in preference to the low level interfaces. +used in preference to the low-level interfaces. This is because the code then becomes transparent to the algorithm used and much more flexible. .Pp diff --git a/lib/libcrypto/man/EVP_aes_128_cbc.3 b/lib/libcrypto/man/EVP_aes_128_cbc.3 index 4d153e5cb..46e3ef0bd 100644 --- a/lib/libcrypto/man/EVP_aes_128_cbc.3 +++ b/lib/libcrypto/man/EVP_aes_128_cbc.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_aes_128_cbc.3,v 1.5 2023/11/16 20:27:43 schwarze Exp $ +.\" $OpenBSD: EVP_aes_128_cbc.3,v 1.8 2024/12/20 01:54:03 schwarze Exp $ .\" selective merge up to: OpenSSL 7c6d372a Nov 20 13:20:01 2018 +0000 .\" .\" This file was written by Ronald Tse @@ -48,7 +48,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: November 16 2023 $ +.Dd $Mdocdate: December 20 2024 $ .Dt EVP_AES_128_CBC 3 .Os .Sh NAME @@ -78,12 +78,6 @@ .Nm EVP_aes_256_ofb , .Nm EVP_aes_128_cbc_hmac_sha1 , .Nm EVP_aes_256_cbc_hmac_sha1 , -.Nm EVP_aes_128_ccm , -.Nm EVP_aes_192_ccm , -.Nm EVP_aes_256_ccm , -.Nm EVP_aes_128_gcm , -.Nm EVP_aes_192_gcm , -.Nm EVP_aes_256_gcm , .Nm EVP_aes_128_wrap , .Nm EVP_aes_192_wrap , .Nm EVP_aes_256_wrap , @@ -145,18 +139,6 @@ .Ft const EVP_CIPHER * .Fn EVP_aes_256_cbc_hmac_sha1 void .Ft const EVP_CIPHER * -.Fn EVP_aes_128_ccm void -.Ft const EVP_CIPHER * -.Fn EVP_aes_192_ccm void -.Ft const EVP_CIPHER * -.Fn EVP_aes_256_ccm void -.Ft const EVP_CIPHER * -.Fn EVP_aes_128_gcm void -.Ft const EVP_CIPHER * -.Fn EVP_aes_192_gcm void -.Ft const EVP_CIPHER * -.Fn EVP_aes_256_gcm void -.Ft const EVP_CIPHER * .Fn EVP_aes_128_wrap void .Ft const EVP_CIPHER * .Fn EVP_aes_192_wrap void @@ -170,6 +152,8 @@ These functions provide the AES encryption algorithm in the .Xr evp 3 framework. +AES is a family of block ciphers operating on 128 bit blocks +using key lengths of 128, 192, and 256 bits. .Pp .Fn EVP_aes_128_cbc , .Fn EVP_aes_192_cbc , @@ -218,20 +202,6 @@ This is not intended for usage outside of TLS and requires calling of some undocumented control functions. These ciphers do not conform to the EVP AEAD interface. .Pp -.Fn EVP_aes_128_ccm , -.Fn EVP_aes_192_ccm , -.Fn EVP_aes_256_ccm , -.Fn EVP_aes_128_gcm , -.Fn EVP_aes_192_gcm , -and -.Fn EVP_aes_256_gcm -provide AES for 128, 192 and 256-bit keys in CBC-MAC Mode (CCM) -and Galois Counter Mode (GCM), respectively. -These ciphers require additional control operations to function -correctly; see -.Xr EVP_EncryptInit 3 -for details. -.Pp .Fn EVP_aes_128_wrap , .Fn EVP_aes_192_wrap , and @@ -282,6 +252,8 @@ structure that provides the implementation of the symmetric cipher. .Sh SEE ALSO .Xr AES_encrypt 3 , .Xr evp 3 , +.Xr EVP_aes_128_ccm 3 , +.Xr EVP_aes_128_gcm 3 , .Xr EVP_EncryptInit 3 .Sh HISTORY .Fn EVP_aes_128_cbc , @@ -318,12 +290,6 @@ first appeared in OpenSSL 0.9.7e and have been available since .Fn EVP_aes_256_ctr , .Fn EVP_aes_128_cbc_hmac_sha1 , .Fn EVP_aes_256_cbc_hmac_sha1 , -.Fn EVP_aes_128_ccm , -.Fn EVP_aes_192_ccm , -.Fn EVP_aes_256_ccm , -.Fn EVP_aes_128_gcm , -.Fn EVP_aes_192_gcm , -.Fn EVP_aes_256_gcm , .Fn EVP_aes_128_xts , and .Fn EVP_aes_256_xts diff --git a/lib/libcrypto/man/EVP_aes_128_ccm.3 b/lib/libcrypto/man/EVP_aes_128_ccm.3 new file mode 100644 index 000000000..e9023a5b6 --- /dev/null +++ b/lib/libcrypto/man/EVP_aes_128_ccm.3 @@ -0,0 +1,573 @@ +.\" $OpenBSD: EVP_aes_128_ccm.3,v 1.5 2024/12/29 12:27:28 schwarze Exp $ +.\" full merge up to: +.\" OpenSSL EVP_EncryptInit.pod 0874d7f2 Oct 11 13:13:47 2022 +0100 +.\" OpenSSL EVP_aes.pod a1ec85c1 Apr 21 10:49:12 2020 +0100 +.\" +.\" Copyright (c) 2024 Ingo Schwarze +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.\" This file is a derived work containing a few sentences +.\" written by Dr. Stephen Henson +.\" covered by the following license: +.\" +.\" Copyright (c) 2012 The OpenSSL Project. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" +.\" 3. All advertising materials mentioning features or use of this +.\" software must display the following acknowledgment: +.\" "This product includes software developed by the OpenSSL Project +.\" for use in the OpenSSL Toolkit. (http://www.openssl.org/)" +.\" +.\" 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to +.\" endorse or promote products derived from this software without +.\" prior written permission. For written permission, please contact +.\" openssl-core@openssl.org. +.\" +.\" 5. Products derived from this software may not be called "OpenSSL" +.\" nor may "OpenSSL" appear in their names without prior written +.\" permission of the OpenSSL Project. +.\" +.\" 6. Redistributions of any form whatsoever must retain the following +.\" acknowledgment: +.\" "This product includes software developed by the OpenSSL Project +.\" for use in the OpenSSL Toolkit (http://www.openssl.org/)" +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +.\" EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +.\" ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +.\" OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd $Mdocdate: December 29 2024 $ +.Dt EVP_AES_128_CCM 3 +.Os +.Sh NAME +.Nm EVP_aes_128_ccm , +.Nm EVP_aes_192_ccm , +.Nm EVP_aes_256_ccm +.Nd EVP AES cipher in Counter with CBC-MAC mode +.Sh SYNOPSIS +.In openssl/evp.h +.Ft const EVP_CIPHER * +.Fn EVP_aes_128_ccm void +.Ft const EVP_CIPHER * +.Fn EVP_aes_192_ccm void +.Ft const EVP_CIPHER * +.Fn EVP_aes_256_ccm void +.\" The following #define'd constants are intentionally undocumented: +.\" Completely unused by anything: +.\" EVP_CTRL_CCM_SET_MSGLEN, EVP_CCM_TLS_FIXED_IV_LEN, EVP_CCM_TLS_IV_LEN +.\" Very rarely used and unused in LibreSSL: +.\" EVP_CCM_TLS_EXPLICIT_IV_LEN, EVP_CCM_TLS_TAG_LEN, EVP_CCM8_TLS_TAG_LEN +.Sh DESCRIPTION +.Fn EVP_aes_128_ccm , +.Fn EVP_aes_192_ccm , +and +.Fn EVP_aes_256_ccm +provide the Advanced Encryption Standard algorithm for 128, 192 and 256-bit +keys in Counter with CBC-MAC (CCM) mode in the +.Xr evp 3 +framework. +This mode supports Authenticated Encryption with Additional Data (AEAD) +and can be used in a number of communication protocols. +Longer keys make precomputation attacks harder at a cost in performance. +.Pp +For CCM mode ciphers, the behaviour of the EVP interface is subtly +altered and several additional +.Xr EVP_CIPHER_CTX_ctrl 3 +operations are required to function correctly. +Some of the +.Dv EVP_CTRL_CCM_* +control commands are older aliases for corresponding +.Dv EVP_CTRL_AEAD_* +constants as indicated below. +.Pp +The less cumbersome and less error-prone +.Xr EVP_AEAD_CTX_new 3 +API does not provide CCM modes. +Some communication protocols support alternatives to CCM, which may +sometimes allow choosing the better API by avoiding CCM. +.Ss Configuration controls +The following two control commands can be issued as soon as +.Xr EVP_EncryptInit 3 +has been called with a CCM +.Fa type +and +.Dv NULL +pointers for +.Fa key +and +.Fa iv . +Both commands are optional and override each other. +If issued when a nonce is already set, they silently cause data corruption. +The +.Fa ptr +argument is ignored by both; passing +.Dv NULL +is recommended. +.Bl -tag -width Ds +.It Dv EVP_CTRL_CCM_SET_L +Set the size +.Ms L +of the length field to +.Fa arg +bytes and the size of the nonce to +.No 15 \- Fa arg +bytes. +By default, 8 bytes are used for the length field and 7 for the nonce. +Selecting a smaller size +.Ms L +for the length field reduces des maximum size of messages that can be sent, +but in return allows transmitting more messages with the same key. +It is an error to pass less than 2 or more than the default value of 8 for +.Fa arg . +.It Dv EVP_CTRL_AEAD_SET_IVLEN Pq == Dv EVP_CTRL_CCM_SET_IVLEN +Set the size of the nonce to +.Fa arg +bytes and the size +.Ms L +of the length field to +.No 15 \- Fa arg +bytes. +By default, 7 bytes are used for the nonce and 8 for the length field. +Selecting a larger size of the nonce allows transmitting more messages with +the same key at the expense of reducing the maximum size for each message. +It is an error to pass more than 13 or less than the default value of 7 for +.Fa arg . +.El +.Pp +After optionally issuing one of the above control commands, +.Xr EVP_EncryptInit 3 +can be called a second time, this time passing +.Dv NULL +for the +.Fa type +argument, with the other two arguments pointing to the desired AES key +and to the desired nonce. +.Ss Encryption controls +.Bl -tag -width Ds +.It Dv EVP_CTRL_AEAD_SET_TAG Pq == Dv EVP_CTRL_CCM_SET_TAG +If the +.Fa ptr +argument is +.Dv NULL , +set the tag length +.Ms M +to +.Fa arg +bytes. +The default value is 12. +Selecting a larger value makes tampering harder for an attacker, +at a small expense of making the messages slightly longer. +Selecting a smaller value is not recommended. +It is an error to pass an odd number for +.Fa arg , +or a number that is less than 4 or greater than 16, or to pass +.Dv NULL +to +.Fa ptr +when +.Fa ctx +is not configured for encrypting. +Issuing this control command when an encryption key is already configured +silently causes data corruption. +.It Dv EVP_CTRL_AEAD_GET_TAG Pq == Dv EVP_CTRL_CCM_GET_TAG +Store the +.Fa arg +bytes of the tag in the memory provided by the caller starting at +.Fa ptr . +It is an error to issue this control command when +.Fa ctx +is not configured for encrypting, when no data was encrypted yet, with an +.Fa arg +that does not match the configured tag length +.Ms M , +or when the tag has already been retrieved earlier. +.El +.Pp +Before passing any plaintext data to +.Xr EVP_EncryptUpdate 3 , +call +.Xr EVP_EncryptUpdate 3 +with both +.Fa in +and +.Fa out +set to +.Dv NULL , +passing the total plaintext length in bytes as +.Fa in_len . +This constructs the first block to be digested with CBC-MAC +and copies the text length to +.Pf * Fa out_len . +It does not check whether +.Fa in_len +exceeds the limit of +.Pf 256\(ha Ms L ; +the most significant bytes of excessive values are silently discarded. +.Pp +It is an error if the +.Fa in_len +argument of the +.Xr EVP_EncryptUpdate 3 +call passing the plaintext data does not match the total length +specified earlier. +Splitting the text into more than one chunks to be passed in multiple calls of +.Xr EVP_EncryptUpdate 3 +is not supported for CCM. +.Pp +To specify any additional authenticated data (AAD), call +.Xr EVP_EncryptUpdate 3 +with the +.Fa out +argument set to +.Dv NULL . +.Ss Decryption controls +.Bl -tag -width Ds +.It Dv EVP_CTRL_AEAD_SET_TAG Pq == Dv EVP_CTRL_CCM_SET_TAG +If the +.Fa ptr +argument is not +.Dv NULL , +copy +.Fa arg +bytes starting at +.Fa ptr +to the expected CCM tag value. +It is an error to pass an odd number for +.Fa arg , +or a number that is less than 4 or greater than 16. +Passing a number that does not correspond to the tag length +.Ms M +that was used for encryption does not raise an error right away, +but results in undefined behaviour +and typically causes subsequent authentication failure. +It is also an error to pass a +.Pf non- Dv NULL +.Fa ptr +when +.Fa ctx +is configured for encryption. +.El +.Pp +Before passing any ciphertext data to +.Xr EVP_DecryptUpdate 3 , +call +.Xr EVP_DecryptUpdate 3 +with both +.Fa in +and +.Fa out +set to +.Dv NULL , +passing the total ciphertext length in bytes as +.Fa in_len . +This constructs the first block to be digested with CBC-MAC +and copies the text length to +.Pf * Fa out_len . +It does not check whether +.Fa in_len +exceeds the limit of +.Pf 256\(ha Ms L ; +the most significant bytes of excessive values are silently discarded. +.Pp +It is an error if the +.Fa in_len +argument of the +.Xr EVP_DecryptUpdate 3 +call passing the ciphertext data does not match the total length +specified earlier. +Splitting the text into more than one chunks to be passed in multiple calls of +.Xr EVP_DecryptUpdate 3 +is not supported for CCM. +.Pp +To specify any additional authenticated data (AAD), call +.Xr EVP_DecryptUpdate 3 +with the +.Fa out +argument set to +.Dv NULL . +.Pp +If the return value of +.Xr EVP_DecryptUpdate 3 +does not indicate success, the authentication operation may have failed. +In that case, regard any output data as corrupted. +.Pp +Do not call +.Xr EVP_DecryptFinal 3 +when using CCM. +Such a call would not do anything useful, and it would fail +because the tag that was set with +.Dv EVP_CTRL_CCM_SET_TAG +was already consumed by +.Xr EVP_DecryptUpdate 3 . +.Sh RETURN VALUES +These functions return a static constant +.Vt EVP_CIPHER +structure that provides the implementation of the respective AEAD cipher mode. +.Sh EXAMPLES +The following code encrypts and digests some secret text +and some additional, public data with AES-CCM. +Specifically, it implements the Test Vector #1 +given in section 8 of RFC 3610. +.Bd -literal -offset indent +/* input data */ +const unsigned char key[] = { + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, + 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF +}; +const unsigned char nonce[] = { + 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0x00, 0xA0, + 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 +}; +const int nonce_len = sizeof(nonce); +const int size_len = 15 - nonce_len; + +const unsigned char aad[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 +}; +const int aad_len = sizeof(aad); + +const unsigned char plaintext[] = { + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E +}; +const int text_len = sizeof(plaintext); + +/* expected output data */ +const unsigned char ciphertext[] = { + 0x58, 0x8C, 0x97, 0x9A, 0x61, 0xC6, 0x63, 0xD2, + 0xF0, 0x66, 0xD0, 0xC2, 0xC0, 0xF9, 0x89, 0x80, + 0x6D, 0x5F, 0x6B, 0x61, 0xDA, 0xC3, 0x84 +}; + +const unsigned char wanted_tag[] = { + 0x17, 0xE8, 0xD1, 0x2C, 0xFD, 0xF9, 0x26, 0xE0 +}; +const int tag_len = sizeof(wanted_tag); + +const int out_len = aad_len + text_len + tag_len; +unsigned char out_buf[out_len]; +unsigned char *out_p = out_buf; +unsigned char *out_end = out_buf + out_len; + +/* auxiliary variables */ +EVP_CIPHER_CTX *ctx; +int irv, i; + +/* configuration */ +ctx = EVP_CIPHER_CTX_new(); +if (ctx == NULL) + err(1, "EVP_CIPHER_CTX_new"); + +if (EVP_EncryptInit(ctx, EVP_aes_128_ccm(), NULL, NULL) != 1) + err(1, "EVP_EncryptInit(NULL)"); + +if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_L, + size_len, NULL) <= 0) + err(1, "EVP_CTRL_CCM_SET_L(%d)", size_len); + +if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, + tag_len, NULL) <= 0) + err(1, "EVP_CTRL_CCM_SET_TAG(%d)", tag_len); + +/* process input data */ +if (EVP_EncryptInit(ctx, NULL, key, nonce) != 1) + err(1, "EVP_EncryptInit(key, nonce)"); + +if (EVP_EncryptUpdate(ctx, NULL, &irv, NULL, text_len) != 1) + err(1, "EVP_EncryptUpdate(len = %d)", text_len); +if (irv != text_len) + errx(1, "text length: want %d, got %d", text_len, irv); + +irv = -1; +if (EVP_EncryptUpdate(ctx, NULL, &irv, aad, aad_len) != 1) + err(1, "EVP_EncryptUpdate(AAD)"); +memcpy(out_p, aad, aad_len); +out_p += aad_len; + +irv = -1; +if (EVP_EncryptUpdate(ctx, out_p, &irv, plaintext, text_len) != 1) + err(1, "EVP_EncryptUpdate(plaintext)"); +if (irv != text_len) + errx(1, "text_len: want %d, got %d", text_len, irv); +out_p += irv; + +/* + * EVP_EncryptFinal(3) doesn't really do anything for CCM. + * Call it anyway to stay closer to normal EVP_Encrypt*(3) idioms, + * to match what the OpenSSL Wiki suggests since 2013, and to ease + * later migration of the code to a different AEAD algorithm. + */ +irv = -1; +if (EVP_EncryptFinal(ctx, out_p, &irv) != 1) + err(1, "EVP_EncryptFinal"); +if (irv != 0) + errx(1, "final_len: want 0, got %d", irv); + +/* check output data */ +if (memcmp(out_buf + aad_len, ciphertext, text_len) != 0) + errx(1, "ciphertext mismatch"); + +if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_GET_TAG, + tag_len, out_p) <= 0) + err(1, "EVP_CTRL_CCM_GET_TAG"); +if (memcmp(out_p, wanted_tag, tag_len) != 0) + errx(1, "tag mismatch"); +out_p += tag_len; +if (out_p != out_end) + errx(1, "end of output: want %p, got %p", out_end, out_p); + +printf("Total packet length = %d.", out_len); +printf(" [Authenticated and Encrypted Output]"); +for (i = 0; i < out_len; i++) { + if (i % 16 == 0) + printf("\en "); + if (i % 4 == 0) + putchar(' '); + printf(" %02X", out_buf[i]); +} +putchar('\en'); + +EVP_CIPHER_CTX_free(ctx); +.Ed +.Pp +The reverse operation for the same test vector, +i.e. decrypting and comparing the digest, +is implemented by the following code. +.Pp +The variable declarations and definitions up to the call of +.Xr EVP_CIPHER_CTX_new 3 +are the same as above. +The chief differences are: +.Bl -dash -width 1n -compact +.It +The tag is not part of the output, +so the total output length is shorter. +.It +No +.Xr memcmp 3 +of the tag takes place. +Instead, the control command +.Dv EVP_CTRL_CCM_SET_TAG +requires the tag that is going to be verified as an additional argument. +.It +While +.Xr EVP_EncryptFinal 3 +is an optional no-op, +.Xr EVP_DecryptFinal 3 +is not called and would fail. +.El +.Bd -literal -offset indent +const int out_len = aad_len + text_len; + +/* configuration */ +ctx = EVP_CIPHER_CTX_new(); +if (ctx == NULL) + err(1, "EVP_CIPHER_CTX_new"); + +if (EVP_DecryptInit(ctx, EVP_aes_128_ccm(), NULL, NULL) != 1) + err(1, "EVP_DecryptInit(NULL)"); + +if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_L, size_len, NULL) <= 0) + err(1, "EVP_CTRL_CCM_SET_L(%d)", size_len); + +if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, + tag_len, (void *)wanted_tag) <= 0) + err(1, "EVP_CTRL_CCM_SET_TAG(%d)", tag_len); + +/* process input data */ +if (EVP_DecryptInit(ctx, NULL, key, nonce) != 1) + err(1, "EVP_DecryptInit(key, nonce)"); + +if (EVP_DecryptUpdate(ctx, NULL, &irv, NULL, text_len) != 1) + err(1, "EVP_DecryptUpdate(len = %d)", text_len); +if (irv != text_len) + errx(1, "text length: want %d, got %d", text_len, irv); + +irv = -1; +if (EVP_DecryptUpdate(ctx, NULL, &irv, aad, aad_len) != 1) + err(1, "EVP_DecryptUpdate(AAD)"); +memcpy(out_p, aad, aad_len); +out_p += aad_len; + +irv = -1; +if (EVP_DecryptUpdate(ctx, out_p, &irv, ciphertext, text_len) != 1) + err(1, "EVP_DecryptUpdate(ciphertext)"); +if (irv != text_len) + errx(1, "text_len: want %d, got %d", text_len, irv); +out_p += irv; + +/* Do not call EVP_DecryptFinal(3); it would fail and do nothing. */ + +/* check output data */ +if (memcmp(out_buf + aad_len, plaintext, text_len) != 0) + errx(1, "plaintext mismatch"); +if (out_p != out_end) + errx(1, "end of output: want %p, got %p", out_end, out_p); + +printf("Total packet length = %d.", out_len); +printf(" [Decrypted and Authenticated Input]"); +for (i = 0; i < out_len; i++) { + if (i % 16 == 0) + printf("\n "); + if (i % 4 == 0) + putchar(' '); + printf(" %02X", out_buf[i]); +} +putchar('\n'); + +EVP_CIPHER_CTX_free(ctx); +.Ed +.Sh SEE ALSO +.Xr AES_encrypt 3 , +.Xr evp 3 , +.Xr EVP_aes_128_cbc 3 , +.Xr EVP_aes_128_gcm 3 , +.Xr EVP_EncryptInit 3 +.Sh STANDARDS +.Rs +.%A Doug Whiting +.%A Russ Housley +.%A Niels Ferguson +.%T Counter with CBC-MAC (CCM) +.%R RFC 3610 +.%D September 2003 +.Re +.Sh HISTORY +.Fn EVP_aes_128_ccm , +.Fn EVP_aes_192_ccm , +and +.Fn EVP_aes_256_ccm +first appeared in OpenSSL 1.0.1 and have been available since +.Ox 5.3 . diff --git a/lib/libcrypto/man/EVP_aes_128_gcm.3 b/lib/libcrypto/man/EVP_aes_128_gcm.3 new file mode 100644 index 000000000..53c41ea16 --- /dev/null +++ b/lib/libcrypto/man/EVP_aes_128_gcm.3 @@ -0,0 +1,254 @@ +.\" $OpenBSD: EVP_aes_128_gcm.3,v 1.2 2024/12/29 12:27:28 schwarze Exp $ +.\" full merge up to: +.\" OpenSSL EVP_EncryptInit.pod 0874d7f2 Oct 11 13:13:47 2022 +0100 +.\" OpenSSL EVP_aes.pod a1ec85c1 Apr 21 10:49:12 2020 +0100 +.\" +.\" Copyright (c) 2024 Ingo Schwarze +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.\" This file is a derived work containing a few sentences +.\" written by Dr. Stephen Henson +.\" covered by the following license: +.\" +.\" Copyright (c) 2012 The OpenSSL Project. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" +.\" 3. All advertising materials mentioning features or use of this +.\" software must display the following acknowledgment: +.\" "This product includes software developed by the OpenSSL Project +.\" for use in the OpenSSL Toolkit. (http://www.openssl.org/)" +.\" +.\" 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to +.\" endorse or promote products derived from this software without +.\" prior written permission. For written permission, please contact +.\" openssl-core@openssl.org. +.\" +.\" 5. Products derived from this software may not be called "OpenSSL" +.\" nor may "OpenSSL" appear in their names without prior written +.\" permission of the OpenSSL Project. +.\" +.\" 6. Redistributions of any form whatsoever must retain the following +.\" acknowledgment: +.\" "This product includes software developed by the OpenSSL Project +.\" for use in the OpenSSL Toolkit (http://www.openssl.org/)" +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY +.\" EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR +.\" ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +.\" OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd $Mdocdate: December 29 2024 $ +.Dt EVP_AES_128_GCM 3 +.Os +.Sh NAME +.Nm EVP_aes_128_gcm , +.Nm EVP_aes_192_gcm , +.Nm EVP_aes_256_gcm +.Nd EVP AES cipher in Galois Counter Mode +.Sh SYNOPSIS +.In openssl/evp.h +.Ft const EVP_CIPHER * +.Fn EVP_aes_128_gcm void +.Ft const EVP_CIPHER * +.Fn EVP_aes_192_gcm void +.Ft const EVP_CIPHER * +.Fn EVP_aes_256_gcm void +.Sh DESCRIPTION +.Fn EVP_aes_128_gcm , +.Fn EVP_aes_192_gcm , +and +.Fn EVP_aes_256_gcm +provide the Advanced Encryption Standard algorithm for 128, 192 and 256-bit +keys in and Galois Counter Mode in the +.Xr evp 3 +framework. +.Pp +For GCM mode ciphers, the behaviour of the EVP interface is subtly +altered and several additional +.Xr EVP_CIPHER_CTX_ctrl 3 +operations are required to function correctly. +Some of the +.Dv EVP_CTRL_GCM_* +control commands are older aliases for corresponding +.Dv EVP_CTRL_AEAD_* +constants as indicated below. +.Pp +To avoid using the cumbersome and error-prone API documented +in the present manual page, consider using the functions documented in +.Xr EVP_AEAD_CTX_init 3 +instead. +.Ss Configuration controls +.\" The following constants are intentionally undocumented +.\" because they are very rarely used in application programs: +.\" EVP_GCM_TLS_FIXED_IV_LEN (unused in the library) +.\" EVP_GCM_TLS_EXPLICIT_IV_LEN and EVP_GCM_TLS_TAG_LEN (used internally +.\" only in aes_gcm_tls_cipher(), which is unused) +.Bl -tag -width Ds +.It Dv EVP_CTRL_AEAD_SET_IVLEN Pq == Dv EVP_CTRL_GCM_SET_IVLEN +Set the length of the initialization vector to +.Fa arg +bytes; the +.Fa ptr +argument is ignored and passing +.Dv NULL +is recommended. +This call can only be made before specifying an initialization vector. +If not called, the default IV length of 12 bytes is used. +.Pp +Using this control command is discouraged because section 5.2.1.1 of the +specification explicitly recommends that implementations of GCM restrict +support to the default IV length of 12 bytes for interoperability, +efficiency, and simplicity of design. +.It Dv EVP_CTRL_AEAD_SET_IV_FIXED Pq == Dv EVP_CTRL_GCM_SET_IV_FIXED +Usually, \-1 is passed for +.Fa arg . +In that case, the complete initialization vector is copied from +.Fa ptr . +.Pp +Otherwise, set the fixed field at the beginning of the initialization +vector to the +.Fa arg +bytes pointed to by +.Fa ptr . +When encrypting, also generate the remaining bytes +of the initialization vector at random. +It is an error to specify an +.Fa arg +that is less than 4 or so large that less than 8 bytes remain. +.El +.Ss Encryption controls +.Bl -tag -width Ds +.It Dv EVP_CTRL_GCM_IV_GEN +Generate the precounter block from the initialization vector, +copy the last +.Fa arg +bytes of the initialization vector to the location pointed to by +.Fa ptr , +or all of it if +.Fa arg +is less than 1 or greater than the length of the initialization vector, +and increment the initialization vector by 1. +Incrementing ignores the IV length and the fixed field length +that may have been configured earlier and always operates on the +last eight bytes of the initialization vector. +It is an error to issue this command +when no key or no initialization vector is set. +.It Dv EVP_CTRL_AEAD_GET_TAG Pq == Dv EVP_CTRL_GCM_GET_TAG +Write +.Fa arg +bytes of the tag value to the location pointed to by +.Fa ptr . +This control command only makes sense after all data has been processed, +e.g. after calling +.Xr EVP_EncryptFinal 3 . +It is an error to issue this command while decrypting, +before any data has been processed, or to specify an +.Fa arg +that is less than 1 or greater than 16. +.El +.Pp +To specify any additional authenticated data (AAD), call +.Xr EVP_EncryptUpdate 3 +with the +.Fa out +argument set to +.Dv NULL . +.Ss Decryption controls +.Bl -tag -width Ds +.It Dv EVP_CTRL_GCM_SET_IV_INV +Copy +.Fa arg +bytes from +.Fa ptr +to the last bytes of the initialization vector +and generate the precounter block from the initialization vector. +The library does not check whether the arguments are consistent +with the configured initialization vector and fixed field lengths. +When default lengths are in use, pass 8 for +.Fa arg . +In that case, this control command sets the invocation field. +It is an error to issue this command +when no key or no initialization vector is set, or when encrypting. +.It Dv EVP_CTRL_AEAD_SET_TAG Pq == Dv EVP_CTRL_GCM_SET_TAG +Set the expected tag to the +.Fa arg +bytes located at +.Fa ptr . +This control command is mandatory before any data is processed, +e.g. before calling +.Xr EVP_DecryptUpdate 3 . +It is an error to issue this command while encrypting or to specify an +.Fa arg +that is less than 1 or greater than 16. +.El +.Pp +To specify any additional authenticated data (AAD), call +.Xr EVP_DecryptUpdate 3 +with the +.Fa out +argument set to +.Dv NULL . +.Pp +If the return value of +.Xr EVP_DecryptFinal 3 , +.Xr EVP_DecryptFinal_ex 3 , +.Xr EVP_CipherFinal 3 , +or +.Xr EVP_CipherFinal_ex 3 +does not indicate success when decrypting, +the authentication operation failed. +In that case, regard any output data as corrupted. +.Sh SEE ALSO +.Xr AES_encrypt 3 , +.Xr evp 3 , +.Xr EVP_AEAD_CTX_init 3 , +.Xr EVP_aes_128_cbc 3 , +.Xr EVP_CIPHER_CTX_ctrl 3 , +.Xr EVP_EncryptInit 3 +.Sh STANDARDS +.Rs +.%A Morris Dworkin +.%I National Institute of Standards and Technology +.%R Recommendation for Block Cipher Modes of Operation:\ + Galois/Counter Mode (GCM) and GMAC +.%N NIST Special Publication 800-38D +.%C Gaithersburg, Maryland +.%D November 2007 +.Re +.Sh HISTORY +.Fn EVP_aes_128_gcm , +.Fn EVP_aes_192_gcm , +and +.Fn EVP_aes_256_gcm +first appeared in OpenSSL 1.0.1 and have been available since +.Ox 5.3 . diff --git a/lib/libcrypto/man/EVP_camellia_128_cbc.3 b/lib/libcrypto/man/EVP_camellia_128_cbc.3 index 190247a68..6f15a85f7 100644 --- a/lib/libcrypto/man/EVP_camellia_128_cbc.3 +++ b/lib/libcrypto/man/EVP_camellia_128_cbc.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_camellia_128_cbc.3,v 1.2 2020/06/24 18:15:00 jmc Exp $ +.\" $OpenBSD: EVP_camellia_128_cbc.3,v 1.3 2024/11/09 22:03:49 schwarze Exp $ .\" selective merge up to: OpenSSL 7c6d372a Nov 20 13:20:01 2018 +0000 .\" .\" This file was written by Ronald Tse @@ -48,7 +48,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: June 24 2020 $ +.Dd $Mdocdate: November 9 2024 $ .Dt EVP_CAMELLIA_128_CBC 3 .Os .Sh NAME @@ -122,7 +122,9 @@ These functions provide the Camellia encryption algorithm in the .Xr evp 3 framework. -They use 128, 192, and 256-bit keys in the following modes, respectively: +Camellia is a block cipher operating on 128 bit blocks. +These functions use 128, 192, and 256-bit keys +in the following modes, respectively: CBC, CFB with 1-bit shift, CFB with 8-bit shift, CFB with 128-bit shift, ECB, and OFB. .Pp diff --git a/lib/libcrypto/man/EVP_chacha20.3 b/lib/libcrypto/man/EVP_chacha20.3 index 8d0be1ed6..8fc79dbf2 100644 --- a/lib/libcrypto/man/EVP_chacha20.3 +++ b/lib/libcrypto/man/EVP_chacha20.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_chacha20.3,v 1.7 2023/09/12 13:58:06 schwarze Exp $ +.\" $OpenBSD: EVP_chacha20.3,v 1.8 2024/12/09 11:55:52 schwarze Exp $ .\" full merge up to: OpenSSL 35fd9953 May 28 14:49:38 2019 +0200 .\" .\" This file is a derived work. @@ -65,7 +65,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: September 12 2023 $ +.Dd $Mdocdate: December 9 2024 $ .Dt EVP_CHACHA20 3 .Os .Sh NAME @@ -181,7 +181,7 @@ If the argument is a .Dv NULL pointer, this control operation succeeds without having any effect. -.It EVP_CTRL_AEAD_SET_IV_FIXED +.It Dv EVP_CTRL_AEAD_SET_IV_FIXED Set the initialization vector by reading the 12 bytes pointed to by the .Fa ptr argument, independently of diff --git a/lib/libcrypto/man/EVP_des_cbc.3 b/lib/libcrypto/man/EVP_des_cbc.3 index 759e03fac..7c8a08c7d 100644 --- a/lib/libcrypto/man/EVP_des_cbc.3 +++ b/lib/libcrypto/man/EVP_des_cbc.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: EVP_des_cbc.3,v 1.1 2019/03/21 12:54:37 schwarze Exp $ +.\" $OpenBSD: EVP_des_cbc.3,v 1.2 2024/11/09 22:03:49 schwarze Exp $ .\" full merge up to: .\" OpenSSL EVP_desx_cbc.pod 8fa4d95e Oct 21 11:59:09 2017 +0900 .\" selective merge up to: @@ -51,7 +51,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: March 21 2019 $ +.Dd $Mdocdate: November 9 2024 $ .Dt EVP_DES_CBC 3 .Os .Sh NAME @@ -128,6 +128,15 @@ These functions provide the DES encryption algorithm in the .Xr evp 3 framework. +DES is a block cipher operating on 64 bit blocks. +The key length to be used for +.Xr EVP_EncryptInit 3 +is 64 bits. +However, only 56 of these bits are used in the encryption algorithm. +The least significant bit in each of the eight bytes is only used +for checking parity. +Using this algorithm is discouraged because the short key length +makes it vulnerable to brute force attacks. .Pp .Fn EVP_des_cbc , .Fn EVP_des_cfb1 , diff --git a/lib/libcrypto/man/EVP_rc2_cbc.3 b/lib/libcrypto/man/EVP_rc2_cbc.3 new file mode 100644 index 000000000..38c818426 --- /dev/null +++ b/lib/libcrypto/man/EVP_rc2_cbc.3 @@ -0,0 +1,201 @@ +.\" $OpenBSD: EVP_rc2_cbc.3,v 1.1 2024/12/08 17:41:23 schwarze Exp $ +.\" +.\" Copyright (c) 2024 Ingo Schwarze +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd $Mdocdate: December 8 2024 $ +.Dt EVP_RC2_CBC 3 +.Os +.Sh NAME +.Nm EVP_rc2_cbc , +.Nm EVP_rc2_ecb , +.Nm EVP_rc2_cfb64 , +.Nm EVP_rc2_cfb , +.Nm EVP_rc2_ofb , +.Nm EVP_rc2_40_cbc , +.Nm EVP_rc2_64_cbc +.Nd Rivest Cipher 2 in the EVP framework +.Sh SYNOPSIS +.In openssl/evp.h +.Ft const EVP_CIPHER * +.Fn EVP_rc2_cbc void +.Ft const EVP_CIPHER * +.Fn EVP_rc2_ecb void +.Ft const EVP_CIPHER * +.Fn EVP_rc2_cfb64 void +.Ft const EVP_CIPHER * +.Fn EVP_rc2_cfb void +.Ft const EVP_CIPHER * +.Fn EVP_rc2_ofb void +.Ft const EVP_CIPHER * +.Fn EVP_rc2_40_cbc void +.Ft const EVP_CIPHER * +.Fn EVP_rc2_64_cbc void +.In openssl/rc2.h +.Fd #define RC2_BLOCK 8 +.Fd #define RC2_KEY_LENGTH 16 +.Sh DESCRIPTION +RC2 is a block cipher operating on blocks of +.Dv RC2_BLOCK No = 8 +bytes, equivalent to 64 bits, using a variable +.Fa key +length with an additional parameter called +.Dq effective key bits +or +.Dq effective key length . +.Pp +.Fn EVP_rc2_cbc , +.Fn EVP_rc2_ecb , +.Fn EVP_rc2_cfb64 , +and +.Fn EVP_rc2_ofb +provide the RC2 encryption algorithm in CBC, ECB, CFB and OFB mode, +respectively. +.Fn EVP_rc2_cfb +is an alias for +.Fn EVP_rc2_cfb64 , +implemented as a macro. +.Pp +By default, these functions set both the key length +and the effective key length to +.Dv RC2_KEY_LENGTH No = 16 +bytes, which is not a very useful value because it is quite short. +.Pp +Configuring normally requires a multi-step process: +.Bl -enum -width 2n +.It +Create a new, empty +.Vt EVP_CIPHER_CTX +object with +.Xr EVP_CIPHER_CTX_new 3 . +.It +Select the operation mode by calling +.Xr EVP_EncryptInit 3 +with the desired +.Fa type +argument, passing +.Dv NULL +pointers for the +.Fa key +and +.Fa iv +arguments. +.It +Select the +.Fa key +length by passing the desired number of bytes to +.Xr EVP_CIPHER_CTX_set_key_length 3 . +Doing so overrides the default key length of +.Dv RC2_KEY_LENGTH No = 16 . +Valid values for +.Fa keylen +are positive and less than or equal to 128. +.It +Select the effective key length by calling +.Xr EVP_CIPHER_CTX_ctrl 3 +with a +.Fa type +argument of +.Dv EVP_CTRL_SET_RC2_KEY_BITS , +passing the desired number of bits in +.Fa arg . +Doing so overrides the default effective key length of 128 bits. +Valid values for +.Fa arg +are positive and less than or equal to 1024. +The +.Fa ptr +argument is ignored; passing +.Dv NULL +is recommended. +.It +Call +.Xr EVP_EncryptInit 3 +a second time, this time passing +.Dv NULL +for the type argument. +The +.Fa key +argument points to an array containing the number of bytes that was passed to +.Xr EVP_CIPHER_CTX_set_key_length 3 , +and the +.Fa iv +argument points to an array of eight bytes. +.It +Finally, +.Xr EVP_EncryptUpdate 3 +and +.Xr EVP_EncryptFinal 3 +can be used in the normal way. +.El +.Pp +Once a +.Fa ctx +object is fully configured, calling +.Xr EVP_CIPHER_CTX_ctrl 3 +with a +.Fa type +argument of +.Dv EVP_CTRL_GET_RC2_KEY_BITS +interprets +.Fa ptr +as a pointer to +.Vt int +and stores the effective key length in bits at that location. +In this case, +.Fa arg +is ignored and passing 0 is recommended. +.Pp +In the CFB and OFB modes, the minimum required total length in bytes +of the output buffer is equal to the total number of input bytes to +be encoded. +In the CBC and ECB modes, the minimum required total length +of the output buffer has to be rounded up to the next multiple +of the block size of eight bytes. +.Pp +.Fn EVP_rc2_40_cbc +and +.Fn EVP_rc2_64_cbc +are obsolete functions that provide the RC2 algorithm in CBC mode +with a key length and an effective key length of 40 and 64 bits, +respectively. +.Sh RETURN VALUES +With the +.Vt EVP_CIPHER +objects documented in the present manual page, +.Fn EVP_CIPHER_CTX_ctrl +returns 1 for success or 0 if an error occurs. +.Sh SEE ALSO +.Xr evp 3 , +.Xr EVP_CIPHER_CTX_set_key_length 3 , +.Xr EVP_EncryptInit 3 , +.Xr RC2_encrypt 3 +.Sh HISTORY +.Fn EVP_rc2_cbc , +.Fn EVP_rc2_ecb , +.Fn EVP_rc2_cfb , +and +.Fn EVP_rc2_ofb +first appeared in SSLeay 0.5.2 and have been available since +.Ox 2.4 . +.Pp +.Fn EVP_rc2_40_cbc +and +.Fn EVP_rc2_64_cbc +first appeared in SSLeay 0.9.1 and have been available since +.Ox 2.6 . +.Pp +.Fn EVP_rc2_cfb64 +first appeared in OpenSSL 0.9.7e and has been available since +.Ox 3.8 . diff --git a/lib/libcrypto/man/Makefile b/lib/libcrypto/man/Makefile index a6a3cf78f..8df75fe28 100644 --- a/lib/libcrypto/man/Makefile +++ b/lib/libcrypto/man/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.294 2024/09/02 08:04:32 tb Exp $ +# $OpenBSD: Makefile,v 1.305 2024/12/27 15:30:17 schwarze Exp $ .include @@ -178,17 +178,14 @@ MAN= \ EVP_PKEY_CTX_set_hkdf_md.3 \ EVP_PKEY_CTX_set_tls1_prf_md.3 \ EVP_PKEY_asn1_get_count.3 \ - EVP_PKEY_asn1_new.3 \ - EVP_PKEY_check.3 \ EVP_PKEY_cmp.3 \ EVP_PKEY_decrypt.3 \ EVP_PKEY_derive.3 \ EVP_PKEY_encrypt.3 \ EVP_PKEY_get_default_digest_nid.3 \ EVP_PKEY_keygen.3 \ - EVP_PKEY_meth_get0_info.3 \ - EVP_PKEY_meth_new.3 \ EVP_PKEY_new.3 \ + EVP_PKEY_new_CMAC_key.3 \ EVP_PKEY_print_private.3 \ EVP_PKEY_set1_RSA.3 \ EVP_PKEY_sign.3 \ @@ -199,9 +196,12 @@ MAN= \ EVP_SignInit.3 \ EVP_VerifyInit.3 \ EVP_aes_128_cbc.3 \ + EVP_aes_128_ccm.3 \ + EVP_aes_128_gcm.3 \ EVP_camellia_128_cbc.3 \ EVP_chacha20.3 \ EVP_des_cbc.3 \ + EVP_rc2_cbc.3 \ EVP_rc4.3 \ EVP_sha1.3 \ EVP_sha3_224.3 \ @@ -267,6 +267,7 @@ MAN= \ RAND_bytes.3 \ RAND_load_file.3 \ RAND_set_rand_method.3 \ + RC2_encrypt.3 \ RC4.3 \ RIPEMD160.3 \ RSA_PSS_PARAMS_new.3 \ @@ -306,6 +307,7 @@ MAN= \ X509V3_EXT_print.3 \ X509V3_extensions_print.3 \ X509V3_get_d2i.3 \ + X509V3_parse_list.3 \ X509_ALGOR_dup.3 \ X509_ATTRIBUTE_get0_object.3 \ X509_ATTRIBUTE_new.3 \ @@ -381,9 +383,9 @@ MAN= \ X509v3_addr_subset.3 \ X509v3_addr_validate_path.3 \ X509v3_asid_add_id_or_range.3 \ - X509v3_asid_add_id_or_range.3 \ X509v3_get_ext_by_NID.3 \ a2d_ASN1_OBJECT.3 \ + a2i_ipadd.3 \ crypto.3 \ d2i_ASN1_NULL.3 \ d2i_ASN1_OBJECT.3 \ @@ -425,6 +427,7 @@ MAN= \ lh_new.3 \ openssl.cnf.5 \ s2i_ASN1_INTEGER.3 \ + v2i_ASN1_BIT_STRING.3 \ x509v3.cnf.5 all clean cleandir depend includes obj tags: diff --git a/lib/libcrypto/man/PKCS8_PRIV_KEY_INFO_new.3 b/lib/libcrypto/man/PKCS8_PRIV_KEY_INFO_new.3 index 2eb9aef05..822968f58 100644 --- a/lib/libcrypto/man/PKCS8_PRIV_KEY_INFO_new.3 +++ b/lib/libcrypto/man/PKCS8_PRIV_KEY_INFO_new.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: PKCS8_PRIV_KEY_INFO_new.3,v 1.6 2021/10/25 13:48:12 schwarze Exp $ +.\" $OpenBSD: PKCS8_PRIV_KEY_INFO_new.3,v 1.7 2024/12/06 12:51:13 schwarze Exp $ .\" .\" Copyright (c) 2016 Ingo Schwarze .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: October 25 2021 $ +.Dd $Mdocdate: December 6 2024 $ .Dt PKCS8_PRIV_KEY_INFO_NEW 3 .Os .Sh NAME @@ -51,7 +51,6 @@ if an error occurs. .Xr d2i_PKCS8_PRIV_KEY_INFO 3 , .Xr d2i_PKCS8PrivateKey_bio 3 , .Xr EVP_PKCS82PKEY 3 , -.Xr EVP_PKEY_asn1_set_private 3 , .Xr PEM_read_PKCS8_PRIV_KEY_INFO 3 , .Xr PKCS12_parse 3 , .Xr PKCS8_pkey_set0 3 , diff --git a/lib/libcrypto/man/RC2_encrypt.3 b/lib/libcrypto/man/RC2_encrypt.3 new file mode 100644 index 000000000..a90e0f574 --- /dev/null +++ b/lib/libcrypto/man/RC2_encrypt.3 @@ -0,0 +1,195 @@ +.\" $OpenBSD: RC2_encrypt.3,v 1.2 2024/12/18 04:15:48 jsg Exp $ +.\" +.\" Copyright (c) 2024 Ingo Schwarze +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd $Mdocdate: December 18 2024 $ +.Dt RC2_ENCRYPT 3 +.Os +.Sh NAME +.Nm RC2_set_key , +.Nm RC2_encrypt , +.Nm RC2_decrypt , +.Nm RC2_cbc_encrypt , +.Nm RC2_ecb_encrypt , +.Nm RC2_cfb64_encrypt , +.Nm RC2_ofb64_encrypt +.Nd low-level functions for Rivest Cipher 2 +.Sh SYNOPSIS +.In openssl/rc2.h +.Ft void +.Fo RC2_set_key +.Fa "RC2_KEY *expanded_key" +.Fa "int len" +.Fa "const unsigned char *user_key" +.Fa "int effective_bits" +.Fc +.Ft void +.Fo RC2_encrypt +.Fa "unsigned long *data" +.Fa "RC2_KEY *expanded_key" +.Fc +.Ft void +.Fo RC2_decrypt +.Fa "unsigned long *data" +.Fa "RC2_KEY *expanded_key" +.Fc +.Ft void +.Fo RC2_cbc_encrypt +.Fa "const unsigned char *in" +.Fa "unsigned char *out" +.Fa "long length" +.Fa "RC2_KEY *expanded_key" +.Fa "unsigned char *iv" +.Fa "int encrypt" +.Fc +.Ft void +.Fo RC2_ecb_encrypt +.Fa "const unsigned char *in" +.Fa "unsigned char *out" +.Fa "RC2_KEY *expanded_key" +.Fa "int encrypt" +.Fc +.Ft void +.Fo RC2_cfb64_encrypt +.Fa "const unsigned char *in" +.Fa "unsigned char *out" +.Fa "long length" +.Fa "RC2_KEY *expanded_key" +.Fa "unsigned char *iv" +.Fa "int *num" +.Fa "int encrypt" +.Fc +.Ft void +.Fo RC2_ofb64_encrypt +.Fa "const unsigned char *in" +.Fa "unsigned char *out" +.Fa "long length" +.Fa "RC2_KEY *expanded_key" +.Fa "unsigned char *iv" +.Fa "int *num" +.Fc +.Sh DESCRIPTION +RC2 is a block cipher operating on blocks of +.Dv RC2_BLOCK No = 8 +bytes, equivalent to 64 bits, using a variable key length +with an additional parameter called +.Dq effective key bits +or +.Dq effective key length . +The maximum effective key length is 1024 bits. +.Pp +If using RC2 cannot be avoided, it is recommended that application +programs use the +.Xr EVP_rc2_cbc 3 +family of functions instead of the functions documented in the present +manual page, to ease later migration to less outdated encryption algorithms. +.Pp +.Fn RC2_set_key +expands the first +.Fa len +bytes of +.Fa user_key +into the +.Vt RC2_KEY +structure +.Pf * Fa expanded_key . +The storage for the expanded key has to be provided by the calling code. +If the +.Fa len +argument exceeds 128, only the first 128 bytes are used. +.Pp +Optionally, if the +.Fa effective_bits +argument is positive and less than 1024, the effective key length of +.Pf * Fa expanded_key +is reduced to +.Fa effective_bits . +Reducing the effective key length is not cryptographically useful. +This option was originally designed to conform to US export regulations +valid at the time, which were designed to allow the US government +to spy on foreign encrypted communications. +Unless interoperability requires otherwise, setting +.Fa effective_bits +to 1024 is recommended. +.Pp +.Fn RC2_encrypt +and +.Fn RC2_decrypt +interpret +.Fa data +as an array of two 32 bit integers and encrypt or decrypt +that single block in place, respectively, using the +.Fa expanded_key . +.Pp +The remaining functions encode or decode +.Fa length +bytes starting at +.Fa in +to +.Fa length +bytes starting at +.Fa out +in various modes of operation using the +.Fa expanded_key . +Both arrays need to be long enough to hold +.Fa length +bytes rounded up to the next multiple of 8. +The +.Fa iv +argument points to an array of 8 bytes used as the initialization vector. +If the +.Fa encrypt +argument is +.Dv RC2_ENCRYPT +or another non-zero value, encryption is performed; +if it is +.Dv RC2_DECRYPT No = 0 , +decryption is performed. +.Pp +.Fn RC2_cbc_encrypt +operates in cipher block chaining mode. +.Pp +.Fn RC2_ecb_encrypt +encodes or decodes eight bytes at +.Fa in +to +eight bytes at +.Fa out +in electronic codebook mode. +.Pp +.Fn RC2_cfb64_encrypt +and +.Fn RC2_ofb64_encrypt +operate in cipher feedback mode and output feedback mode, respectively, +with 64 bit blocks. +The number of bytes used from the last 8 byte block is kept track of in +.Pf * Fa num . +.Sh SEE ALSO +.Xr crypto 3 , +.Xr EVP_EncryptInit 3 , +.Xr EVP_rc2_cbc 3 +.Sh HISTORY +.Fn RC2_set_key , +.Fn RC2_encrypt , +.Fn RC2_cbc_encrypt , +.Fn RC2_ecb_encrypt , +.Fn RC2_cfb64_encrypt , +and +.Fn RC2_ofb64_encrypt +first appeared in SSLeay 0.5.2. +.Fn RC2_decrypt +first appeared in SSLeay 0.9.0. +All these functions have been available since +.Ox 2.4 . diff --git a/lib/libcrypto/man/RSA_get0_key.3 b/lib/libcrypto/man/RSA_get0_key.3 index 3fb74b19b..f09fb00d2 100644 --- a/lib/libcrypto/man/RSA_get0_key.3 +++ b/lib/libcrypto/man/RSA_get0_key.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: RSA_get0_key.3,v 1.7 2023/03/06 13:05:32 tb Exp $ +.\" $OpenBSD: RSA_get0_key.3,v 1.8 2025/01/05 15:40:42 tb Exp $ .\" selective merge up to: OpenSSL 665d899f Aug 2 02:19:43 2017 +0800 .\" .\" This file is a derived work. @@ -65,7 +65,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: March 6 2023 $ +.Dd $Mdocdate: January 5 2025 $ .Dt RSA_GET0_KEY 3 .Os .Sh NAME @@ -383,15 +383,8 @@ Turn off blinding during private key encryption and decryption. This flag is set by .Xr RSA_blinding_off 3 . .It Dv RSA_FLAG_SIGN_VER -Enable the use of the functions set with -.Xr RSA_meth_set_sign 3 -and -.Xr RSA_meth_set_verify 3 . -If unset, the functions set with -.Xr RSA_meth_set_priv_enc 3 -and -.Xr RSA_meth_set_pub_dec 3 -are used instead, respectively. +This flag has no effect. +It is provided only for backward compatibility with legacy applications. .El .Pp The flags diff --git a/lib/libcrypto/man/RSA_meth_new.3 b/lib/libcrypto/man/RSA_meth_new.3 index f42feb3f3..a3a5c549e 100644 --- a/lib/libcrypto/man/RSA_meth_new.3 +++ b/lib/libcrypto/man/RSA_meth_new.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: RSA_meth_new.3,v 1.5 2019/07/13 17:26:38 schwarze Exp $ +.\" $OpenBSD: RSA_meth_new.3,v 1.6 2025/01/05 15:40:42 tb Exp $ .\" full merge up to: OpenSSL a970b14f Jul 31 18:58:40 2017 -0400 .\" selective merge up to: OpenSSL 24907560 Sep 17 07:47:42 2018 +1000 .\" @@ -66,7 +66,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: July 13 2019 $ +.Dd $Mdocdate: January 5 2025 $ .Dt RSA_METH_NEW 3 .Os .Sh NAME @@ -455,26 +455,6 @@ and .Fn RSA_meth_set_verify get and set the optional functions used for creating and verifying an RSA signature. -If the flag -.Dv RSA_FLAG_SIGN_VER -is set on the -.Vt RSA -object in question and -.Fa sign -or -.Fa verify -is not -.Dv NULL , -it will be called from -.Xr RSA_sign 3 -or -.Xr RSA_verify 3 , -respectively, and take the same parameters as those. -Otherwise, -.Xr RSA_private_encrypt 3 -or -.Xr RSA_public_decrypt 3 -will be used instead. .Pp .Fn RSA_meth_get_mod_exp and diff --git a/lib/libcrypto/man/RSA_pkey_ctx_ctrl.3 b/lib/libcrypto/man/RSA_pkey_ctx_ctrl.3 index cf16977e7..3d4e79cc4 100644 --- a/lib/libcrypto/man/RSA_pkey_ctx_ctrl.3 +++ b/lib/libcrypto/man/RSA_pkey_ctx_ctrl.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: RSA_pkey_ctx_ctrl.3,v 1.7 2023/05/05 12:22:21 tb Exp $ +.\" $OpenBSD: RSA_pkey_ctx_ctrl.3,v 1.8 2024/12/06 14:27:49 schwarze Exp $ .\" full merge up to: .\" OpenSSL man3/EVP_PKEY_CTX_ctrl.pod 99d63d46 Oct 26 13:56:48 2016 -0400 .\" OpenSSL man3/EVP_PKEY_CTX_set_rsa_pss_keygen_md.pod @@ -55,7 +55,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: May 5 2023 $ +.Dd $Mdocdate: December 6 2024 $ .Dt RSA_PKEY_CTX_CTRL 3 .Os .Sh NAME @@ -365,7 +365,6 @@ supported by the public key algorithm. .Xr EVP_PKEY_encrypt 3 , .Xr EVP_PKEY_get_default_digest_nid 3 , .Xr EVP_PKEY_keygen 3 , -.Xr EVP_PKEY_meth_set_ctrl 3 , .Xr EVP_PKEY_sign 3 , .Xr EVP_PKEY_verify 3 , .Xr EVP_PKEY_verify_recover 3 diff --git a/lib/libcrypto/man/X509V3_EXT_get_nid.3 b/lib/libcrypto/man/X509V3_EXT_get_nid.3 index a47a3ef45..ad153c36d 100644 --- a/lib/libcrypto/man/X509V3_EXT_get_nid.3 +++ b/lib/libcrypto/man/X509V3_EXT_get_nid.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: X509V3_EXT_get_nid.3,v 1.5 2024/10/03 03:31:47 tb Exp $ +.\" $OpenBSD: X509V3_EXT_get_nid.3,v 1.8 2024/12/24 09:48:56 schwarze Exp $ .\" .\" Copyright (c) 2024 Theo Buehler .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: October 3 2024 $ +.Dd $Mdocdate: December 24 2024 $ .Dt X509V3_EXT_GET_NID 3 .Os .Sh NAME @@ -69,6 +69,7 @@ if there is none. .Sh SEE ALSO .Xr i2s_ASN1_ENUMERATED_TABLE 3 , .Xr OBJ_create 3 , +.Xr v2i_ASN1_BIT_STRING 3 , .Xr X509_EXTENSION_get_object 3 , .Xr X509V3_get_d2i 3 .Sh STANDARDS @@ -83,7 +84,9 @@ These functions first appeared in OpenSSL 0.9.2b and have been available since .Ox 2.6 . .Sh CAVEATS -LibreSSL only supports built-in extension methods. +In LibreSSL, these functions only support built-in +.Fa nid +values corresponding to static built-in objects. Other implementations have incomplete support for custom extension methods, whose API is not threadsafe, does not affect the behavior of .Xr X509_verify_cert 3 , diff --git a/lib/libcrypto/man/X509V3_EXT_print.3 b/lib/libcrypto/man/X509V3_EXT_print.3 index 0c695842b..edb97d3a3 100644 --- a/lib/libcrypto/man/X509V3_EXT_print.3 +++ b/lib/libcrypto/man/X509V3_EXT_print.3 @@ -1,6 +1,6 @@ -.\" $OpenBSD: X509V3_EXT_print.3,v 1.2 2021/07/12 14:54:00 schwarze Exp $ +.\" $OpenBSD: X509V3_EXT_print.3,v 1.3 2024/12/28 10:19:45 schwarze Exp $ .\" -.\" Copyright (c) 2021 Ingo Schwarze +.\" Copyright (c) 2021, 2024 Ingo Schwarze .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above @@ -14,11 +14,12 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: July 12 2021 $ +.Dd $Mdocdate: December 28 2024 $ .Dt X509V3_EXT_PRINT 3 .Os .Sh NAME -.Nm X509V3_EXT_print +.Nm X509V3_EXT_print , +.Nm X509V3_EXT_print_fp .Nd pretty-print an X.509 extension .Sh SYNOPSIS .In openssl/x509v3.h @@ -29,13 +30,24 @@ .Fa "unsigned long flags" .Fa "int indent" .Fc +.Ft int +.Fo X509V3_EXT_print_fp +.Fa "FILE *file" +.Fa "X509_EXTENSION *ext" +.Fa "int flags" +.Fa "int indent" +.Fc .Sh DESCRIPTION .Fn X509V3_EXT_print -decodes +and +.Fn X509V3_EXT_print_fp +decode .Fa ext -and prints the data contained in it to +and print the data contained in it to the .Fa bio -in a human-readable format with a left margin of +or +.Fa file , +respectively, in a human-readable format with a left margin of .Fa indent space characters. The details of both the decoding and the printing depend on the type of @@ -47,36 +59,63 @@ as it would be done by the appropriate public API function, for example: .Bl -tag -width NID_authority_key_identifier -compact .It Sy extension type .Sy decoding function -.It Dv NID_subject_key_identifier -.Xr d2i_ASN1_OCTET_STRING 3 -.It Dv NID_key_usage -.Xr d2i_ASN1_BIT_STRING 3 -.It Dv NID_crl_number -.Xr d2i_ASN1_INTEGER 3 -.It Dv NID_crl_reason -.Xr d2i_ASN1_ENUMERATED 3 -.It Dv NID_invalidity_date -.Xr d2i_ASN1_GENERALIZEDTIME 3 -.It Dv NID_subject_alt_name -.Xr d2i_GENERAL_NAMES 3 -.It Dv NID_hold_instruction_code -.Xr d2i_ASN1_OBJECT 3 -.It Dv NID_id_pkix_OCSP_noCheck -.Xr d2i_ASN1_NULL 3 .It Dv NID_authority_key_identifier .Xr d2i_AUTHORITY_KEYID 3 .It Dv NID_certificate_policies .Xr d2i_CERTIFICATEPOLICIES 3 +.It Dv NID_crl_number +.Xr d2i_ASN1_INTEGER 3 +.It Dv NID_crl_reason +.Xr d2i_ASN1_ENUMERATED 3 +.It Dv NID_hold_instruction_code +.Xr d2i_ASN1_OBJECT 3 .It Dv NID_id_pkix_OCSP_CrlID .Xr d2i_OCSP_CRLID 3 +.It Dv NID_id_pkix_OCSP_noCheck +.Xr d2i_ASN1_NULL 3 .It Dv NID_id_pkix_OCSP_Nonce non-public function built into the library +.It Dv NID_invalidity_date +.Xr d2i_ASN1_GENERALIZEDTIME 3 +.It Dv NID_key_usage +.Xr d2i_ASN1_BIT_STRING 3 +.It Dv NID_subject_alt_name +.Xr d2i_GENERAL_NAMES 3 +.It Dv NID_subject_key_identifier +.Xr d2i_ASN1_OCTET_STRING 3 .El .Pp For some types, the printing is performed by a dedicated non-public function built into the library. For some other types, the printing function is a public API function, -but none of these printing functions are documented yet. +for example: +.Pp +.Bl -tag -width NID_id_pkix_OCSP_archiveCutoff -compact +.It Sy extension type +.Sy printing function +.It Dv NID_crl_number +.Xr i2s_ASN1_INTEGER 3 +.It Dv NID_crl_reason +.Xr i2s_ASN1_ENUMERATED_TABLE 3 +.It Dv NID_delta_crl +.Xr i2s_ASN1_INTEGER 3 +.It Dv NID_hold_instruction_code +.Xr i2a_ASN1_OBJECT 3 +.It Dv NID_id_pkix_OCSP_archiveCutoff +.Xr ASN1_GENERALIZEDTIME_print 3 +.It Dv NID_id_pkix_OCSP_Nonce +.Xr i2a_ASN1_STRING 3 +.It Dv NID_inhibit_any_policy +.Xr i2s_ASN1_INTEGER 3 +.It Dv NID_invalidity_date +.Xr ASN1_GENERALIZEDTIME_print 3 +.It Dv NID_key_usage +.Xr i2v_ASN1_BIT_STRING 3 +.It Dv NID_subject_key_identifier +.Xr i2s_ASN1_OCTET_STRING 3 +.El +.Pp +Some of the public printing functions are not documented yet. .Pp If .Fa ext @@ -133,7 +172,9 @@ are set, nothing is printed and printing is considered as failed. .El .Sh RETURN VALUES .Fn X509V3_EXT_print -returns 0 if failure was both detected and considered relevant. +and +.Fn X509V3_EXT_print_fp +return 0 if failure was both detected and considered relevant. Otherwise, 1 is returned, and in general the user cannot tell whether failure simply went undetected, whether the function detected failure but regarded it as irrelevant, or whether printing did indeed @@ -145,12 +186,10 @@ succeed. .Xr X509_get_ext 3 , .Xr X509V3_extensions_print 3 .Sh HISTORY -.Fn X509V3_EXT_print -first appeared in OpenSSL 0.9.2 and has been available since +These functions first appeared in OpenSSL 0.9.2 and have been available since .Ox 2.6 . .Sh BUGS -.Fn X509V3_EXT_print -lacks error handling throughout. -When a write operation fails, it will usually ignore the fact that +These functions lack error handling throughout. +When a write operation fails, they will usually ignore the fact that information was omitted from the output and report success to the caller anyway. diff --git a/lib/libcrypto/man/X509V3_get_d2i.3 b/lib/libcrypto/man/X509V3_get_d2i.3 index f9d1e4675..bf442dc84 100644 --- a/lib/libcrypto/man/X509V3_get_d2i.3 +++ b/lib/libcrypto/man/X509V3_get_d2i.3 @@ -1,8 +1,26 @@ -.\" $OpenBSD: X509V3_get_d2i.3,v 1.23 2024/05/15 21:15:28 tb Exp $ +.\" $OpenBSD: X509V3_get_d2i.3,v 1.25 2024/12/31 20:17:00 tb Exp $ .\" full merge up to: OpenSSL ff7fbfd5 Nov 2 11:52:01 2015 +0000 .\" selective merge up to: OpenSSL 99d63d46 Oct 26 13:56:48 2016 -0400 .\" -.\" This file was written by Dr. Stephen Henson . +.\" This file is a derived work. +.\" The changes are covered by the following Copyright and license: +.\" +.\" Copyright (c) 2023, 2024 Theo Buehler +.\" Copyright (c) 2024 Ingo Schwarze +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.\" The original file was written by Dr. Stephen Henson . .\" Copyright (c) 2014, 2015, 2016 The OpenSSL Project. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -49,7 +67,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: May 15 2024 $ +.Dd $Mdocdate: December 31 2024 $ .Dt X509V3_GET_D2I 3 .Os .Sh NAME @@ -267,7 +285,13 @@ parameter is usually .Pp The .Fa flags -parameter may be one of the following values. +argument consists of two parts OR'ed together: +the operation mode and the optional silent flag. +The operation mode is the bitwise OR of the +.Fa flags +and the bitmask +.Dv X509V3_ADD_OP_MASK . +The following operation modes are recognized: .Pp .Dv X509V3_ADD_DEFAULT appends a new extension only if the extension does not already exist. @@ -296,9 +320,11 @@ deletes extension if it exists and errors otherwise. No new extension is added. .Pp +Any other operation mode results in an error. +.Pp If .Dv X509V3_ADD_SILENT -is OR'd with +is OR'd into the .Fa flags , any error returned will not be added to the error queue. .Pp @@ -366,11 +392,6 @@ The following are (largely obsolete) Netscape certificate extensions. .It Netscape SSL Server Name Ta Dv NID_netscape_ssl_server_name .It Netscape Comment Ta Dv NID_netscape_comment .El -.Ss Miscellaneous Certificate Extensions -.Bl -column 30n 30n -.It Strong Extranet ID Ta Dv NID_sxnet -.It Proxy Certificate Information Ta Dv NID_proxyCertInfo -.El .Ss PKIX CRL Extensions The following are CRL extensions from PKIX standards such as RFC 5280. .Bl -column 30n 30n diff --git a/lib/libcrypto/man/X509V3_parse_list.3 b/lib/libcrypto/man/X509V3_parse_list.3 new file mode 100644 index 000000000..447f1a5e9 --- /dev/null +++ b/lib/libcrypto/man/X509V3_parse_list.3 @@ -0,0 +1,101 @@ +.\" $OpenBSD: X509V3_parse_list.3,v 1.2 2024/12/24 09:48:56 schwarze Exp $ +.\" +.\" Copyright (c) 2024 Ingo Schwarze +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd $Mdocdate: December 24 2024 $ +.Dt X509V3_PARSE_LIST 3 +.Os +.Sh NAME +.Nm X509V3_parse_list , +.Nm X509V3_conf_free +.Nd create and destroy CONF_VALUE objects +.Sh SYNOPSIS +.In openssl/x509v3.h +.Ft STACK_OF(CONF_VALUE) * +.Fn X509V3_parse_list "const char *string" +.Ft void +.Fn X509V3_conf_free "CONF_VALUE *conf" +.Sh DESCRIPTION +.Fn X509V3_parse_list +parses the +.Fa string +and allocates an array of +.Vt CONF_VALUE +objects according to the following rules. +.Bl -enum -width 2n +.It +The string is split into fields at comma +.Pq Sq \&, +characters. +.It +If a field contains a colon +.Pq Sq \&: +character, the part before the colon is regarded as a name +and the part after the first colon as the associated value. +Otherwise, the whole field is regarded as the name and +.Dv NULL +is used as the associated value. +.It +For each name and each value, leading and trailing whitespace as defined by +.Xr isspace 3 +is ignored. +.It +Parsing ends when a NUL, carriage return, or newline character +is encountered. +.El +.Pp +A new, empty +.Vt STACK_OF(CONF_VALUE) +is allocated and for each parsed name, one +.Vt CONF_VALUE +structure containing the optional value is pushed onto it. +.Pp +.Fn X509V3_conf_free +releases all memory used by +.Fa conf . +If +.Fa conf +is +.Dv NULL , +no action occurs. +.Pp +The typical way to release the memory returned from +.Fn X509V3_parse_list +is by calling +.Fn sk_CONF_VALUE_pop_free +on it, passing a pointer to the function +.Fn X509V3_conf_free +as the second argument. +.Sh RETURN VALUES +.Fn X509V3_parse_list +returns the new +.Vt STACK_OF(CONF_VALUE) +object or +.Dv NULL +if an error occurs, in particular if there isn't any name, +if the name before a colon or after a comma is empty, +if the value after a colon is empty, +or if memory allocation fails. +.Sh SEE ALSO +.Xr isspace 3 , +.Xr sk_pop_free 3 , +.Xr STACK_OF 3 , +.Xr v2i_ASN1_BIT_STRING 3 +.Sh HISTORY +.Fn X509V3_parse_list +and +.Fn X509V3_conf_free +first appeared in OpenSSL 0.9.2 and have been available since +.Ox 2.6 . diff --git a/lib/libcrypto/man/X509_EXTENSION_set_object.3 b/lib/libcrypto/man/X509_EXTENSION_set_object.3 index 3f6c7709a..45cf0dbaa 100644 --- a/lib/libcrypto/man/X509_EXTENSION_set_object.3 +++ b/lib/libcrypto/man/X509_EXTENSION_set_object.3 @@ -1,10 +1,10 @@ -.\" $OpenBSD: X509_EXTENSION_set_object.3,v 1.18 2024/05/12 11:49:47 tb Exp $ +.\" $OpenBSD: X509_EXTENSION_set_object.3,v 1.19 2024/12/28 11:04:09 schwarze Exp $ .\" full merge up to: OpenSSL 99d63d46 Oct 26 13:56:48 2016 -0400 .\" .\" This file is a derived work. .\" The changes are covered by the following Copyright and license: .\" -.\" Copyright (c) 2016, 2021 Ingo Schwarze +.\" Copyright (c) 2016, 2021, 2024 Ingo Schwarze .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above @@ -65,7 +65,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: May 12 2024 $ +.Dd $Mdocdate: December 28 2024 $ .Dt X509_EXTENSION_SET_OBJECT 3 .Os .Sh NAME @@ -79,7 +79,8 @@ .Nm X509_EXTENSION_set_data , .Nm X509_EXTENSION_get_object , .Nm X509_EXTENSION_get_critical , -.Nm X509_EXTENSION_get_data +.Nm X509_EXTENSION_get_data , +.Nm X509_supported_extension .\" In the next line, the capital "E" is not a typo. .\" The ASN.1 structure is called "Extension", not "extension". .Nd create, change, and inspect X.509 Extension objects @@ -132,6 +133,10 @@ .Fo X509_EXTENSION_get_data .Fa "X509_EXTENSION *ex" .Fc +.Ft int +.Fo X509_supported_extension +.Fa "X509_EXTENSION *ex" +.Fc .Sh DESCRIPTION .Fn X509_EXTENSION_new allocates and initializes an empty @@ -225,15 +230,23 @@ pointer. The returned pointer is an internal value which must not be freed up. .Pp .Fn X509_EXTENSION_get_critical -returns the criticality of extension +tests whether .Fa ex -it returns 1 for critical and 0 for non-critical. +is critical. .Pp .Fn X509_EXTENSION_get_data returns the data of extension .Fa ex . The returned pointer is an internal value which must not be freed up. .Pp +.Fn X509_supported_extension +checks whether +.Fa ex +is of a type supported by the verifier. +The list of supported extension types is hardcoded into the library. +If an extension is critical but unsupported, +the certificate will normally be rejected. +.Pp These functions manipulate the contents of an extension directly. Most applications will want to parse or encode and add an extension: they should use the extension encode and decode functions instead @@ -277,6 +290,11 @@ returns 0 for non-critical or 1 for critical. returns an .Vt ASN1_OCTET_STRING pointer. +.Pp +.Fn X509_supported_extension +returns 1 if the type of +.Fa ex +is supported by the verifier or 0 otherwise. .Sh SEE ALSO .Xr ACCESS_DESCRIPTION_new 3 , .Xr AUTHORITY_KEYID_new 3 , @@ -324,3 +342,7 @@ and in SSLeay 0.8.0. These functions have been available since .Ox 2.4 . +.Pp +.Fn X509_supported_extension +first appeared in OpenSSL 0.9.7 and has been available since +.Ox 3.2 . diff --git a/lib/libcrypto/man/X509_NAME_print_ex.3 b/lib/libcrypto/man/X509_NAME_print_ex.3 index 8024d8380..f1b3262f2 100644 --- a/lib/libcrypto/man/X509_NAME_print_ex.3 +++ b/lib/libcrypto/man/X509_NAME_print_ex.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: X509_NAME_print_ex.3,v 1.12 2021/11/11 15:58:49 schwarze Exp $ +.\" $OpenBSD: X509_NAME_print_ex.3,v 1.14 2025/01/08 00:08:02 tb Exp $ .\" full merge up to: OpenSSL aebb9aac Jul 19 09:27:53 2016 -0400 .\" selective merge up to: OpenSSL 61f805c1 Jan 16 01:01:46 2018 +0800 .\" @@ -50,7 +50,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: November 11 2021 $ +.Dd $Mdocdate: January 8 2025 $ .Dt X509_NAME_PRINT_EX 3 .Os .Sh NAME @@ -131,12 +131,11 @@ is returned. prints out .Fa name to -.Fa bp -indenting each line by +.Fa bp . +The .Fa obase -characters. -Multiple lines are used if the output (including indent) exceeds 80 -characters. +argument is intended to indent the output, +it is however ignored. .Pp The functions .Fn X509_NAME_oneline diff --git a/lib/libcrypto/man/X509_PUBKEY_new.3 b/lib/libcrypto/man/X509_PUBKEY_new.3 index 648b028d5..df1c50bda 100644 --- a/lib/libcrypto/man/X509_PUBKEY_new.3 +++ b/lib/libcrypto/man/X509_PUBKEY_new.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: X509_PUBKEY_new.3,v 1.17 2021/10/26 10:01:23 schwarze Exp $ +.\" $OpenBSD: X509_PUBKEY_new.3,v 1.18 2024/12/06 12:51:13 schwarze Exp $ .\" full merge up to: OpenSSL 99d63d46 Oct 26 13:56:48 2016 -0400 .\" .\" This file is a derived work. @@ -65,7 +65,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: October 26 2021 $ +.Dd $Mdocdate: December 6 2024 $ .Dt X509_PUBKEY_NEW 3 .Os .Sh NAME @@ -354,7 +354,6 @@ or does not contain a public key, these functions fail but no error is pushed onto the stack. .Sh SEE ALSO .Xr d2i_X509 3 , -.Xr EVP_PKEY_asn1_set_public 3 , .Xr X509_ALGOR_new 3 , .Xr X509_get_pubkey 3 , .Xr X509_new 3 diff --git a/lib/libcrypto/man/X509_signature_dump.3 b/lib/libcrypto/man/X509_signature_dump.3 index bc41cc8b6..3333a615b 100644 --- a/lib/libcrypto/man/X509_signature_dump.3 +++ b/lib/libcrypto/man/X509_signature_dump.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: X509_signature_dump.3,v 1.2 2021/12/18 17:47:45 schwarze Exp $ +.\" $OpenBSD: X509_signature_dump.3,v 1.3 2024/12/06 12:51:13 schwarze Exp $ .\" .\" Copyright (c) 2021 Ingo Schwarze .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: December 18 2021 $ +.Dd $Mdocdate: December 6 2024 $ .Dt X509_SIGNATURE_DUMP 3 .Os .Sh NAME @@ -71,7 +71,7 @@ They fail and return as soon as any write operation fails. .Xr ASN1_STRING_new 3 , .Xr ASN1_STRING_print_ex 3 , .Xr BIO_new 3 , -.Xr EVP_PKEY_asn1_new 3 , +.Xr EVP_PKEY_asn1_find 3 , .Xr OBJ_find_sigid_algs 3 , .Xr X509_ALGOR_new 3 , .Xr X509_get0_signature 3 diff --git a/lib/libcrypto/man/a2i_ipadd.3 b/lib/libcrypto/man/a2i_ipadd.3 new file mode 100644 index 000000000..1372b2acf --- /dev/null +++ b/lib/libcrypto/man/a2i_ipadd.3 @@ -0,0 +1,136 @@ +.\" $OpenBSD: a2i_ipadd.3,v 1.1 2024/12/27 15:30:17 schwarze Exp $ +.\" +.\" Copyright (c) 2024 Ingo Schwarze +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd $Mdocdate: December 27 2024 $ +.Dt A2I_IPADD 3 +.Os +.Sh NAME +.Nm a2i_ipadd , +.Nm a2i_IPADDRESS , +.Nm a2i_IPADDRESS_NC +.Nd parse Internet Protocol addresses into ASN.1 OCTET STRINGs for X.509 +.Sh SYNOPSIS +.In openssl/x509v3.h +.Ft int +.Fo a2i_ipadd +.Fa "unsigned char *ipout" +.Fa "const char *ipasc" +.Fc +.Ft ASN1_OCTET_STRING * +.Fo a2i_IPADDRESS +.Fa "const char *ipasc" +.Fc +.Ft ASN1_OCTET_STRING * +.Fo a2i_IPADDRESS_NC +.Fa "const char *ipasc" +.Fc +.Sh DESCRIPTION +.Fn a2i_ipadd +and +.Fn a2i_IPADDRESS +parse the string +.Fa ipasc +containing an IPv4 or IPv6 address +in one of the following formats: +.Bd -literal -offset indent +d.d.d.d +x:x:x:x:x:x:x:x (exactly 8 words) +(x:)*x::x(:x)* (less than 8 words) +(x:)*x:: (less than 8 words) +::x(:x)* (less than 8 words) +:: +(x:)*d.d.d.d (up to 6 hexadecimal words, :: can be used) +.Ed +.Pp +where each +.Ar d +represents a non-negative decimal number less than 256 +with one, two or three digits and each +.Ar x +represents a non-negative hexadecimal number +with one, two, three, or four digits. +Both the lower case letters a-f and the upper case letters A-F can be used. +.Pp +.Fn a2i_ipadd +stores the bytes of the address in network byte order (big endian) starting at +.Fa ipout . +The caller is responsible for providing sufficient space; +always providing a buffer of at least 16 bytes is recommended, +even if an IPv4 address is expected, to avoid buffer overruns in case +.Fa ipasc +is malformed. +.Pp +.Fn a2i_IPADDRESS +stores the address in a newly allocated ASN.1 +.Vt OCTET STRING . +.Pp +.Fn a2i_IPADDRESS_NC +expects +.Fa ipasc +to contain two addresses of the same address family in the above form, +separated by a slash +.Pq Sq / +character, and stores the concatenation of both addresses +in a newly allocated ASN.1 +.Vt OCTET STRING , +which is typically used for address/mask pairs +in name constraint extensions of CA certificates. +.Sh RETURN VALUES +.Fn a2i_ipadd +returns the number of bytes written to +.Fa ipout +in case of success, i.e. 4 for an IPv4 or 16 for an IPv6 address, +or 0 if parsing failed. +.Pp +.Fn a2i_IPADDRESS +and +.Fn a2i_IPADDRESS_NC +return the new object or +.Dv NULL +if parsing or memory allocation failed. +.Sh SEE ALSO +.Xr a2i_ASN1_STRING 3 , +.Xr ASN1_OCTET_STRING_new 3 , +.Xr ASN1_OCTET_STRING_set 3 , +.Xr GENERAL_NAME_new 3 , +.Xr IPAddressRange_new 3 , +.Xr NAME_CONSTRAINTS_new 3 , +.Xr s2i_ASN1_OCTET_STRING 3 , +.Xr X509_EXTENSION_new 3 +.Sh STANDARDS +RFC 5280: Internet X.509 Public Key Infrastructure Certificate and +Certificate Revocation List (CRL) Profile +.Bl -dash -width 1n -compact +.It +section 4.2.1.6: Subject Alternative Name +.It +section 4.2.1.10: Name Constraints +.El +.Sh HISTORY +.Fn a2i_IPADDRESS +and +.Fn a2i_IPADDRESS_NC +first appeared in OpenSSL 0.9.8 and +.Fn a2i_ipadd +in OpenSSL 0.9.8e. +They have been available since +.Ox 4.5 . +.Sh CAVEATS +While some syntax errors are caught, only minimal validation takes place, +and these functions often return objects that make no sense, in particular +in the context of IPv6. +For example, the trailing :d.d.d.d syntax can be appended +to a hexadecimal part that results in twelve arbitrary bytes. diff --git a/lib/libcrypto/man/crypto.3 b/lib/libcrypto/man/crypto.3 index e63c1a78d..f1367e9e6 100644 --- a/lib/libcrypto/man/crypto.3 +++ b/lib/libcrypto/man/crypto.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: crypto.3,v 1.29 2023/05/01 07:37:45 tb Exp $ +.\" $OpenBSD: crypto.3,v 1.30 2024/12/07 19:22:15 schwarze Exp $ .\" OpenSSL a9c85cea Nov 11 09:33:55 2016 +0100 .\" .\" This file is a derived work. @@ -66,7 +66,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: May 1 2023 $ +.Dd $Mdocdate: December 7 2024 $ .Dt CRYPTO 3 .Os .Sh NAME @@ -88,6 +88,7 @@ Low-level stand-alone interfaces include .Xr BF_set_key 3 , .Xr ChaCha 3 , .Xr DES_set_key 3 , +.Xr RC2_encrypt 3 , and .Xr RC4 3 . .Pp diff --git a/lib/libcrypto/man/d2i_ECPKParameters.3 b/lib/libcrypto/man/d2i_ECPKParameters.3 index e82e7911d..c4ede82f3 100644 --- a/lib/libcrypto/man/d2i_ECPKParameters.3 +++ b/lib/libcrypto/man/d2i_ECPKParameters.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: d2i_ECPKParameters.3,v 1.12 2018/05/19 22:51:40 schwarze Exp $ +.\" $OpenBSD: d2i_ECPKParameters.3,v 1.13 2024/10/24 21:42:10 tb Exp $ .\" OpenSSL 05ea606a May 20 20:52:46 2016 -0400 .\" .\" This file is a derived work. @@ -65,7 +65,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: May 19 2018 $ +.Dd $Mdocdate: October 24 2024 $ .Dt D2I_ECPKPARAMETERS 3 .Os .Sh NAME @@ -102,13 +102,13 @@ .Ft EC_GROUP * .Fo d2i_ECPKParameters .Fa "EC_GROUP **val_out" -.Fa "const unsigned char **des_in" +.Fa "const unsigned char **der_in" .Fa "long length" .Fc .Ft int .Fo i2d_ECPKParameters .Fa "const EC_GROUP *val_in" -.Fa "unsigned char **des_out" +.Fa "unsigned char **der_out" .Fc .Ft EC_GROUP * .Fo d2i_ECPKParameters_bio @@ -133,13 +133,13 @@ .Ft EC_KEY * .Fo d2i_ECParameters .Fa "EC_KEY **val_out" -.Fa "const unsigned char **des_in" +.Fa "const unsigned char **der_in" .Fa "long length" .Fc .Ft int .Fo i2d_ECParameters .Fa "EC_KEY *val_in" -.Fa "unsigned char **des_out" +.Fa "unsigned char **der_out" .Fc .Ft EC_KEY * .Fo ECParameters_dup @@ -148,13 +148,13 @@ .Ft EC_KEY * .Fo d2i_ECPrivateKey .Fa "EC_KEY **val_out" -.Fa "const unsigned char **des_in" +.Fa "const unsigned char **der_in" .Fa "long length" .Fc .Ft int .Fo i2d_ECPrivateKey .Fa "EC_KEY *val_in" -.Fa "unsigned char **des_out" +.Fa "unsigned char **der_out" .Fc .Ft EC_KEY * .Fo d2i_ECPrivateKey_bio @@ -179,13 +179,13 @@ .Ft EC_KEY * .Fo o2i_ECPublicKey .Fa "EC_KEY **val_out" -.Fa "const unsigned char **des_in" +.Fa "const unsigned char **der_in" .Fa "long length" .Fc .Ft int .Fo i2o_ECPublicKey .Fa "const EC_KEY *val_in" -.Fa "unsigned char **des_out" +.Fa "unsigned char **der_out" .Fc .Ft int .Fo ECPKParameters_print @@ -213,13 +213,13 @@ .Ft EC_KEY * .Fo d2i_EC_PUBKEY .Fa "EC_KEY **val_out" -.Fa "const unsigned char **des_in" +.Fa "const unsigned char **der_in" .Fa "long length" .Fc .Ft int .Fo i2d_EC_PUBKEY .Fa "EC_KEY *val_in" -.Fa "unsigned char **des_out" +.Fa "unsigned char **der_out" .Fc .Ft EC_KEY * .Fo d2i_EC_PUBKEY_bio diff --git a/lib/libcrypto/man/d2i_PrivateKey.3 b/lib/libcrypto/man/d2i_PrivateKey.3 index 864541430..b544ea0e9 100644 --- a/lib/libcrypto/man/d2i_PrivateKey.3 +++ b/lib/libcrypto/man/d2i_PrivateKey.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: d2i_PrivateKey.3,v 1.10 2021/10/19 12:03:46 schwarze Exp $ +.\" $OpenBSD: d2i_PrivateKey.3,v 1.11 2024/10/24 21:42:10 tb Exp $ .\" full merge up to: OpenSSL b0edda11 Mar 20 13:00:17 2018 +0000 .\" .\" This file is a derived work. @@ -65,7 +65,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: October 19 2021 $ +.Dd $Mdocdate: October 24 2024 $ .Dt D2I_PRIVATEKEY 3 .Os .Sh NAME @@ -87,13 +87,13 @@ .Fo d2i_PrivateKey .Fa "int type" .Fa "EVP_PKEY **val_out" -.Fa "const unsigned char **des_in" +.Fa "const unsigned char **der_in" .Fa "long length" .Fc .Ft EVP_PKEY * .Fo d2i_AutoPrivateKey .Fa "EVP_PKEY **val_out" -.Fa "const unsigned char **des_in" +.Fa "const unsigned char **der_in" .Fa "long length" .Fc .Ft EVP_PKEY * @@ -109,7 +109,7 @@ .Ft int .Fo i2d_PrivateKey .Fa "EVP_PKEY *val_in" -.Fa "unsigned char **des_out" +.Fa "unsigned char **der_out" .Fc .Ft int .Fo i2d_PrivateKey_bio @@ -135,13 +135,13 @@ .Fo d2i_PublicKey .Fa "int type" .Fa "EVP_PKEY **val_out" -.Fa "const unsigned char **des_in" +.Fa "const unsigned char **der_in" .Fa "long length" .Fc .Ft int .Fo i2d_PublicKey .Fa "EVP_PKEY *val_in" -.Fa "unsigned char **des_out" +.Fa "unsigned char **der_out" .Fc .Sh DESCRIPTION These are algorithm-independent interfaces to decode and encode diff --git a/lib/libcrypto/man/evp.3 b/lib/libcrypto/man/evp.3 index 378255ad4..2c54c0f98 100644 --- a/lib/libcrypto/man/evp.3 +++ b/lib/libcrypto/man/evp.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: evp.3,v 1.32 2024/08/30 07:03:19 tb Exp $ +.\" $OpenBSD: evp.3,v 1.36 2024/12/06 14:27:49 schwarze Exp $ .\" full merge up to: OpenSSL man7/evp 24a535ea Sep 22 13:14:20 2020 +0100 .\" .\" This file was written by Ulf Moeller , @@ -51,7 +51,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: August 30 2024 $ +.Dd $Mdocdate: December 6 2024 $ .Dt EVP 3 .Os .Sh NAME @@ -62,6 +62,20 @@ .Sh DESCRIPTION The EVP library provides a high-level interface to cryptographic functions. +The abbreviation +.Dq EVP +is intended to mean +.Dq EnVeloPe +in the sense of +.Dq wrapper library . +It is not related to the technical meaning of the term +.Dq envelope +in contexts like +.Xr CMS_encrypt 3 , +.Xr EVP_SealInit 3 , +.Xr PKCS7_encrypt 3 , +or +.Xr SMIME_write_ASN1 3 . .Pp .Xr EVP_SealInit 3 and @@ -190,8 +204,6 @@ family of functions provides base64 encoding and decoding. .Xr EVP_OpenInit 3 , .Xr EVP_PKCS82PKEY 3 , .Xr EVP_PKEY_asn1_get_count 3 , -.Xr EVP_PKEY_asn1_new 3 , -.Xr EVP_PKEY_check 3 , .Xr EVP_PKEY_cmp 3 , .Xr EVP_PKEY_CTX_ctrl 3 , .Xr EVP_PKEY_CTX_get_operation 3 , @@ -202,8 +214,6 @@ family of functions provides base64 encoding and decoding. .Xr EVP_PKEY_encrypt 3 , .Xr EVP_PKEY_get_default_digest_nid 3 , .Xr EVP_PKEY_keygen 3 , -.Xr EVP_PKEY_meth_get0_info 3 , -.Xr EVP_PKEY_meth_new 3 , .Xr EVP_PKEY_new 3 , .Xr EVP_PKEY_print_private 3 , .Xr EVP_PKEY_set1_RSA 3 , diff --git a/lib/libcrypto/man/i2a_ASN1_STRING.3 b/lib/libcrypto/man/i2a_ASN1_STRING.3 index daa74ca64..7d4647477 100644 --- a/lib/libcrypto/man/i2a_ASN1_STRING.3 +++ b/lib/libcrypto/man/i2a_ASN1_STRING.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: i2a_ASN1_STRING.3,v 1.4 2022/09/10 12:36:18 jsg Exp $ +.\" $OpenBSD: i2a_ASN1_STRING.3,v 1.5 2024/12/27 15:30:17 schwarze Exp $ .\" .\" Copyright (c) 2019, 2021 Ingo Schwarze .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: September 10 2022 $ +.Dd $Mdocdate: December 27 2024 $ .Dt I2A_ASN1_STRING 3 .Os .Sh NAME @@ -189,10 +189,12 @@ are intended to return 1 for success or 0 for failure, but see the .Sx BUGS section for a number of traps. .Sh SEE ALSO +.Xr a2i_ipadd 3 , .Xr ASN1_STRING_length 3 , .Xr ASN1_STRING_new 3 , .Xr ASN1_STRING_print_ex 3 , -.Xr i2a_ASN1_OBJECT 3 +.Xr i2a_ASN1_OBJECT 3 , +.Xr i2s_ASN1_INTEGER 3 .Sh HISTORY .Fn i2a_ASN1_INTEGER and diff --git a/lib/libcrypto/man/s2i_ASN1_INTEGER.3 b/lib/libcrypto/man/s2i_ASN1_INTEGER.3 index 0f0cf2919..a2105bc4b 100644 --- a/lib/libcrypto/man/s2i_ASN1_INTEGER.3 +++ b/lib/libcrypto/man/s2i_ASN1_INTEGER.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: s2i_ASN1_INTEGER.3,v 1.6 2023/10/01 10:51:19 tb Exp $ +.\" $OpenBSD: s2i_ASN1_INTEGER.3,v 1.9 2024/12/27 15:30:17 schwarze Exp $ .\" .\" Copyright (c) 2023 Theo Buehler .\" @@ -14,8 +14,8 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: October 1 2023 $ -.Dt I2S_ASN1_INTEGER 3 +.Dd $Mdocdate: December 27 2024 $ +.Dt S2I_ASN1_INTEGER 3 .Os .Sh NAME .Nm i2s_ASN1_ENUMERATED , @@ -57,7 +57,7 @@ .Ft "char *" .Fo i2s_ASN1_ENUMERATED_TABLE .Fa "X509V3_EXT_METHOD *method" -.Fa "const ASN1_ENUMERATED *aenum" +.Fa "const ASN1_ENUMERATED *a" .Fc .Sh DESCRIPTION These functions convert to and from @@ -140,12 +140,15 @@ Colons are ignored if they are at the start, the end or if they separate two pairs of digits. .Pp .Fn i2s_ASN1_ENUMERATED_TABLE -uses strings provided in the usr_data field of the non-NULL -.Fa method -to convert the value of +looks up the value of .Fa a -into a string. -If no such string is available, +in the +.Fa usr_data +field of the +.Pf non- Dv NULL +.Fa method +and returns a copy of the associated long name. +If no match is found, .Fa a is passed to .Fn i2s_ASN1_ENUMERATED . @@ -193,10 +196,13 @@ colons at the start, the end or between pairs of hexadecimal digits. Error codes can sometimes be obtained by .Xr ERR_get_error 3 . .Sh SEE ALSO +.Xr a2i_ASN1_INTEGER 3 , +.Xr a2i_ipadd 3 , .Xr ASN1_INTEGER_new 3 , .Xr ASN1_INTEGER_to_BN 3 , .Xr ASN1_OCTET_STRING_new 3 , .Xr crypto 3 , +.Xr v2i_ASN1_BIT_STRING 3 , .Xr X509V3_get_d2i 3 .Sh HISTORY These functions first appeared in OpenSSL 0.9.4 and diff --git a/lib/libcrypto/man/v2i_ASN1_BIT_STRING.3 b/lib/libcrypto/man/v2i_ASN1_BIT_STRING.3 new file mode 100644 index 000000000..36d9f7496 --- /dev/null +++ b/lib/libcrypto/man/v2i_ASN1_BIT_STRING.3 @@ -0,0 +1,125 @@ +.\" $OpenBSD: v2i_ASN1_BIT_STRING.3,v 1.1 2024/12/24 09:48:56 schwarze Exp $ +.\" +.\" Copyright (c) 2024 Ingo Schwarze +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd $Mdocdate: December 24 2024 $ +.Dt V2I_ASN1_BIT_STRING 3 +.Os +.Sh NAME +.Nm v2i_ASN1_BIT_STRING , +.Nm i2v_ASN1_BIT_STRING +.Nd ASN.1 BIT STRING utility functions for certificate extensions +.Sh SYNOPSIS +.In openssl/x509v3.h +.Ft ASN1_BIT_STRING * +.Fo v2i_ASN1_BIT_STRING +.Fa "X509V3_EXT_METHOD *method" +.Fa "X509V3_CTX *ctx" +.Fa "STACK_OF(CONF_VALUE) *nval" +.Fc +.Ft STACK_OF(CONF_VALUE) * +.Fo i2v_ASN1_BIT_STRING +.Fa "X509V3_EXT_METHOD *method" +.Fa "ASN1_BIT_STRING *bit_string" +.Fa "STACK_OF(CONF_VALUE) *nval" +.Fc +.Sh DESCRIPTION +.Fn v2i_ASN1_BIT_STRING +allocates a new ASN.1 +.Vt BIT STRING +object and initializes it from a list of bit names. +The +.Fa nval +argument is essentially used as the list of the names of the bits to set. +Both long names and short names can be used. +One name is taken from each element of +.Fa nval . +The +.Fa ctx +argument and any section names or values contained in the elements of +.Fa nval +are ignored. +To convert a C string containing a comma-separated list of names +to the input format of this function, +.Xr X509V3_parse_list 3 +can be used. +.Pp +.Fn i2v_ASN1_BIT_STRING +translates the numbers of the bits that are set in the +.Fa bit_string +to long names. +For each bit that is set, +one element containing the corresponding long name is added to +.Fa nval . +If a +.Dv NULL +pointer is passed for the +.Fa nval +argument, a new +.Vt STACK_OF(CONF_VALUE) +is allocated. +.Pp +For both functions, the +.Fa method +argument is only used for the translation of bit names to bit numbers +and vice versa. +Any names and bit numbers that do not occur in the +.Fa usr_data +translation table in the +.Fa method +are silently ignored. +.Pp +For the following arguments, +.Xr X509V3_EXT_get_nid 3 +returns static constant +.Fa method +objects supporting these functions: +.Pp +.Bl -tag -width NID_netscape_cert_type -compact +.It Dv NID_crl_reason +reason codes, RFC 5280 section 5.3.1 +.It Dv NID_key_usage +key usage purposes, RFC 5280 section 4.2.1.3 +.It Dv NID_netscape_cert_type +Netscape certificate types (obsolete) +.El +.Pp +While an application program could theoretically provide its own +.Fa method +object containing a custom translation table, that is unlikely to be +useful for any practical purpose. +.Sh RETURN VALUES +.Fn v2i_ASN1_BIT_STRING +returns the new +.Vt BIT STRING +object and +.Fn i2v_ASN1_BIT_STRING +the modified or new list of bit names. +Both functions return +.Dv NULL +if an error occurs, in particular if memory allocation fails. +.Sh SEE ALSO +.Xr ASN1_BIT_STRING_new 3 , +.Xr ASN1_BIT_STRING_set 3 , +.Xr i2s_ASN1_ENUMERATED_TABLE 3 , +.Xr STACK_OF 3 , +.Xr tls_peer_ocsp_crl_reason 3 , +.Xr X509_get_key_usage 3 , +.Xr X509V3_EXT_get_nid 3 , +.Xr X509V3_get_d2i 3 , +.Xr X509V3_parse_list 3 +.Sh HISTORY +These functions first appeared in OpenSSL 0.9.8 and have been available since +.Ox 4.5 . diff --git a/lib/libcrypto/mem_clr.c b/lib/libcrypto/mem_clr.c deleted file mode 100644 index a936dcc5b..000000000 --- a/lib/libcrypto/mem_clr.c +++ /dev/null @@ -1,12 +0,0 @@ -/* $OpenBSD: mem_clr.c,v 1.5 2024/04/10 14:51:02 beck Exp $ */ - -/* Ted Unangst places this file in the public domain. */ -#include -#include - -void -OPENSSL_cleanse(void *ptr, size_t len) -{ - explicit_bzero(ptr, len); -} -LCRYPTO_ALIAS(OPENSSL_cleanse); diff --git a/lib/libcrypto/mem_dbg.c b/lib/libcrypto/mem_dbg.c deleted file mode 100644 index a7b386326..000000000 --- a/lib/libcrypto/mem_dbg.c +++ /dev/null @@ -1,119 +0,0 @@ -/* $OpenBSD: mem_dbg.c,v 1.28 2024/04/10 14:51:02 beck Exp $ */ -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */ -/* ==================================================================== - * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ - -#include - -int -CRYPTO_mem_ctrl(int mode) -{ - return (CRYPTO_MEM_CHECK_OFF); -} -LCRYPTO_ALIAS(CRYPTO_mem_ctrl); diff --git a/lib/libcrypto/mlkem/mlkem.h b/lib/libcrypto/mlkem/mlkem.h new file mode 100644 index 000000000..a5645facc --- /dev/null +++ b/lib/libcrypto/mlkem/mlkem.h @@ -0,0 +1,285 @@ +/* $OpenBSD: mlkem.h,v 1.4 2024/12/19 23:52:26 tb Exp $ */ +/* + * Copyright (c) 2024, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef OPENSSL_HEADER_MLKEM_H +#define OPENSSL_HEADER_MLKEM_H + +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +/* Hack for now */ +struct cbs_st; +struct cbb_st; + +/* + * ML-KEM-768 + * + * This implements the Module-Lattice-Based Key-Encapsulation Mechanism from + * https://csrc.nist.gov/pubs/fips/204/final + */ + +/* + * MLKEM768_public_key contains a ML-KEM-768 public key. The contents of this + * object should never leave the address space since the format is unstable. + */ +struct MLKEM768_public_key { + union { + uint8_t bytes[512 * (3 + 9) + 32 + 32]; + uint16_t alignment; + } opaque; +}; + +/* + * MLKEM768_private_key contains a ML-KEM-768 private key. The contents of this + * object should never leave the address space since the format is unstable. + */ +struct MLKEM768_private_key { + union { + uint8_t bytes[512 * (3 + 3 + 9) + 32 + 32 + 32]; + uint16_t alignment; + } opaque; +}; + +/* + * MLKEM768_PUBLIC_KEY_BYTES is the number of bytes in an encoded ML-KEM768 public + * key. + */ +#define MLKEM768_PUBLIC_KEY_BYTES 1184 + +/* MLKEM_SEED_BYTES is the number of bytes in an ML-KEM seed. */ +#define MLKEM_SEED_BYTES 64 + +/* + * MLKEM_SHARED_SECRET_BYTES is the number of bytes in the ML-KEM768 shared + * secret. Although the round-3 specification has a variable-length output, the + * final ML-KEM construction is expected to use a fixed 32-byte output. To + * simplify the future transition, we apply the same restriction. + */ +#define MLKEM_SHARED_SECRET_BYTES 32 + +/* + * MLKEM_generate_key generates a random public/private key pair, writes the + * encoded public key to |out_encoded_public_key| and sets |out_private_key| to + * the private key. If |optional_out_seed| us not NULL then te seed used to + * generate te private key is written to it. + */ +void MLKEM768_generate_key( + uint8_t out_encoded_public_key[MLKEM768_PUBLIC_KEY_BYTES], + uint8_t optional_out_seed[MLKEM_SEED_BYTES], + struct MLKEM768_private_key *out_private_key); + +/* + * MLKEM768_private_key_from_seed derives a private key from a seed that was + * generated by |MLKEM768_generate_key|. It fails and returns 0 if |seed_len| is + * incorrect, otherwise it writes |*out_private_key| and returns 1. + */ +int MLKEM768_private_key_from_seed(struct MLKEM768_private_key *out_private_key, + const uint8_t *seed, size_t seed_len); + +/* + * MLKEM_public_from_private sets |*out_public_key| to the public key that + * corresponds to |private_key|. (This is faster than parsing the output of + * |MLKEM_generate_key| if, for some reason, you need to encapsulate to a key + * that was just generated.) + */ +void MLKEM768_public_from_private(struct MLKEM768_public_key *out_public_key, + const struct MLKEM768_private_key *private_key); + +/* MLKEM768_CIPHERTEXT_BYTES is number of bytes in the ML-KEM768 ciphertext. */ +#define MLKEM768_CIPHERTEXT_BYTES 1088 + +/* + * MLKEM768_encap encrypts a random shared secret for |public_key|, writes the + * ciphertext to |out_ciphertext|, and writes the random shared secret to + * |out_shared_secret|. + */ +void MLKEM768_encap(uint8_t out_ciphertext[MLKEM768_CIPHERTEXT_BYTES], + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const struct MLKEM768_public_key *public_key); + +/* + * MLKEM768_decap decrypts a shared secret from |ciphertext| using |private_key| + * and writes it to |out_shared_secret|. If |ciphertext_len| is incorrect it + * returns 0, otherwise it rreturns 1. If |ciphertext| is invalid, + * |out_shared_secret| is filled with a key that will always be the same for the + * same |ciphertext| and |private_key|, but which appears to be random unless + * one has access to |private_key|. These alternatives occur in constant time. + * Any subsequent symmetric encryption using |out_shared_secret| must use an + * authenticated encryption scheme in order to discover the decapsulation + * failure. + */ +int MLKEM768_decap(uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const uint8_t *ciphertext, size_t ciphertext_len, + const struct MLKEM768_private_key *private_key); + +/* Serialisation of keys. */ + +/* + * MLKEM768_marshal_public_key serializes |public_key| to |out| in the standard + * format for ML-KEM public keys. It returns one on success or zero on allocation + * error. + */ +int MLKEM768_marshal_public_key(struct cbb_st *out, + const struct MLKEM768_public_key *public_key); + +/* + * MLKEM768_parse_public_key parses a public key, in the format generated by + * |MLKEM_marshal_public_key|, from |in| and writes the result to + * |out_public_key|. It returns one on success or zero on parse error or if + * there are trailing bytes in |in|. + */ +int MLKEM768_parse_public_key(struct MLKEM768_public_key *out_public_key, + struct cbs_st *in); + +/* + * MLKEM_parse_private_key parses a private key, in the format generated by + * |MLKEM_marshal_private_key|, from |in| and writes the result to + * |out_private_key|. It returns one on success or zero on parse error or if + * there are trailing bytes in |in|. This formate is verbose and should be avoided. + * Private keys should be stored as seeds and parsed using |MLKEM768_private_key_from_seed|. + */ +int MLKEM768_parse_private_key(struct MLKEM768_private_key *out_private_key, + struct cbs_st *in); + +/* + * ML-KEM-1024 + * + * ML-KEM-1024 also exists. You should prefer ML-KEM-768 where possible. + */ + +/* + * MLKEM1024_public_key contains an ML-KEM-1024 public key. The contents of this + * object should never leave the address space since the format is unstable. + */ +struct MLKEM1024_public_key { + union { + uint8_t bytes[512 * (4 + 16) + 32 + 32]; + uint16_t alignment; + } opaque; +}; + +/* + * MLKEM1024_private_key contains a ML-KEM-1024 private key. The contents of + * this object should never leave the address space since the format is + * unstable. + */ +struct MLKEM1024_private_key { + union { + uint8_t bytes[512 * (4 + 4 + 16) + 32 + 32 + 32]; + uint16_t alignment; + } opaque; +}; + +/* + * MLKEM1024_PUBLIC_KEY_BYTES is the number of bytes in an encoded ML-KEM-1024 + * public key. + */ +#define MLKEM1024_PUBLIC_KEY_BYTES 1568 + +/* + * MLKEM1024_generate_key generates a random public/private key pair, writes the + * encoded public key to |out_encoded_public_key| and sets |out_private_key| to + * the private key. If |optional_out_seed| is not NULL then the seed used to + * generate the private key is written to it. + */ +void MLKEM1024_generate_key( + uint8_t out_encoded_public_key[MLKEM1024_PUBLIC_KEY_BYTES], + uint8_t optional_out_seed[MLKEM_SEED_BYTES], + struct MLKEM1024_private_key *out_private_key); + +/* + * MLKEM1024_private_key_from_seed derives a private key from a seed that was + * generated by |MLKEM1024_generate_key|. It fails and returns 0 if |seed_len| + * is incorrect, otherwise it writes |*out_private_key| and returns 1. + */ +int MLKEM1024_private_key_from_seed( + struct MLKEM1024_private_key *out_private_key, const uint8_t *seed, + size_t seed_len); + +/* + * MLKEM1024_public_from_private sets |*out_public_key| to the public key that + * corresponds to |private_key|. (This is faster than parsing the output of + * |MLKEM1024_generate_key| if, for some reason, you need to encapsulate to a + * key that was just generated.) + */ +void MLKEM1024_public_from_private(struct MLKEM1024_public_key *out_public_key, + const struct MLKEM1024_private_key *private_key); + +/* MLKEM1024_CIPHERTEXT_BYTES is number of bytes in the ML-KEM-1024 ciphertext. */ +#define MLKEM1024_CIPHERTEXT_BYTES 1568 + +/* + * MLKEM1024_encap encrypts a random shared secret for |public_key|, writes the + * ciphertext to |out_ciphertext|, and writes the random shared secret to + * |out_shared_secret|. + */ +void MLKEM1024_encap(uint8_t out_ciphertext[MLKEM1024_CIPHERTEXT_BYTES], + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const struct MLKEM1024_public_key *public_key); + +/* + * MLKEM1024_decap decrypts a shared secret from |ciphertext| using + * |private_key| and writes it to |out_shared_secret|. If |ciphertext_len| is + * incorrect it returns 0, otherwise it returns 1. If |ciphertext| is invalid + * (but of the correct length), |out_shared_secret| is filled with a key that + * will always be the same for the same |ciphertext| and |private_key|, but + * which appears to be random unless one has access to |private_key|. These + * alternatives occur in constant time. Any subsequent symmetric encryption + * using |out_shared_secret| must use an authenticated encryption scheme in + * order to discover the decapsulation failure. + */ +int MLKEM1024_decap(uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const uint8_t *ciphertext, size_t ciphertext_len, + const struct MLKEM1024_private_key *private_key); + +/* + * Serialisation of ML-KEM-1024 keys. + * MLKEM1024_marshal_public_key serializes |public_key| to |out| in the standard + * format for ML-KEM-1024 public keys. It returns one on success or zero on + * allocation error. + */ +int MLKEM1024_marshal_public_key(struct cbb_st *out, + const struct MLKEM1024_public_key *public_key); + +/* + * MLKEM1024_parse_public_key parses a public key, in the format generated by + * |MLKEM1024_marshal_public_key|, from |in| and writes the result to + * |out_public_key|. It returns one on success or zero on parse error or if + * there are trailing bytes in |in|. + */ +int MLKEM1024_parse_public_key(struct MLKEM1024_public_key *out_public_key, + struct cbs_st *in); + +/* + * MLKEM1024_parse_private_key parses a private key, in NIST's format for + * private keys, from |in| and writes the result to |out_private_key|. It + * returns one on success or zero on parse error or if there are trailing bytes + * in |in|. This format is verbose and should be avoided. Private keys should be + * stored as seeds and parsed using |MLKEM1024_private_key_from_seed|. + */ +int MLKEM1024_parse_private_key(struct MLKEM1024_private_key *out_private_key, + struct cbs_st *in); + +#if defined(__cplusplus) +} +#endif + +#endif /* OPENSSL_HEADER_MLKEM_H */ diff --git a/lib/libcrypto/mlkem/mlkem1024.c b/lib/libcrypto/mlkem/mlkem1024.c new file mode 100644 index 000000000..f6fccdf6a --- /dev/null +++ b/lib/libcrypto/mlkem/mlkem1024.c @@ -0,0 +1,1139 @@ +/* $OpenBSD: mlkem1024.c,v 1.6 2025/01/03 08:19:24 tb Exp $ */ +/* + * Copyright (c) 2024, Google Inc. + * Copyright (c) 2024, Bob Beck + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include + +#include "bytestring.h" +#include "mlkem.h" + +#include "sha3_internal.h" +#include "mlkem_internal.h" +#include "constant_time.h" +#include "crypto_internal.h" + +/* Remove later */ +#undef LCRYPTO_ALIAS +#define LCRYPTO_ALIAS(A) + +/* + * See + * https://csrc.nist.gov/pubs/fips/203/final + */ + +static void +prf(uint8_t *out, size_t out_len, const uint8_t in[33]) +{ + sha3_ctx ctx; + shake256_init(&ctx); + shake_update(&ctx, in, 33); + shake_xof(&ctx); + shake_out(&ctx, out, out_len); +} + +/* Section 4.1 */ +static void +hash_h(uint8_t out[32], const uint8_t *in, size_t len) +{ + sha3_ctx ctx; + sha3_init(&ctx, 32); + sha3_update(&ctx, in, len); + sha3_final(out, &ctx); +} + +static void +hash_g(uint8_t out[64], const uint8_t *in, size_t len) +{ + sha3_ctx ctx; + sha3_init(&ctx, 64); + sha3_update(&ctx, in, len); + sha3_final(out, &ctx); +} + +/* this is called 'J' in the spec */ +static void +kdf(uint8_t out[MLKEM_SHARED_SECRET_BYTES], const uint8_t failure_secret[32], + const uint8_t *in, size_t len) +{ + sha3_ctx ctx; + shake256_init(&ctx); + shake_update(&ctx, failure_secret, 32); + shake_update(&ctx, in, len); + shake_xof(&ctx); + shake_out(&ctx, out, MLKEM_SHARED_SECRET_BYTES); +} + +#define DEGREE 256 +#define RANK1024 4 + +static const size_t kBarrettMultiplier = 5039; +static const unsigned kBarrettShift = 24; +static const uint16_t kPrime = 3329; +static const int kLog2Prime = 12; +static const uint16_t kHalfPrime = (/*kPrime=*/3329 - 1) / 2; +static const int kDU1024 = 11; +static const int kDV1024 = 5; + +/* + * kInverseDegree is 128^-1 mod 3329; 128 because kPrime does not have a 512th + * root of unity. + */ +static const uint16_t kInverseDegree = 3303; +static const size_t kEncodedVectorSize = + (/*kLog2Prime=*/12 * DEGREE / 8) * RANK1024; +static const size_t kCompressedVectorSize = /*kDU1024=*/ 11 * RANK1024 * DEGREE / + 8; + +typedef struct scalar { + /* On every function entry and exit, 0 <= c < kPrime. */ + uint16_t c[DEGREE]; +} scalar; + +typedef struct vector { + scalar v[RANK1024]; +} vector; + +typedef struct matrix { + scalar v[RANK1024][RANK1024]; +} matrix; + +/* + * This bit of Python will be referenced in some of the following comments: + * + * p = 3329 + * + * def bitreverse(i): + * ret = 0 + * for n in range(7): + * bit = i & 1 + * ret <<= 1 + * ret |= bit + * i >>= 1 + * return ret + */ + +/* kNTTRoots = [pow(17, bitreverse(i), p) for i in range(128)] */ +static const uint16_t kNTTRoots[128] = { + 1, 1729, 2580, 3289, 2642, 630, 1897, 848, 1062, 1919, 193, 797, + 2786, 3260, 569, 1746, 296, 2447, 1339, 1476, 3046, 56, 2240, 1333, + 1426, 2094, 535, 2882, 2393, 2879, 1974, 821, 289, 331, 3253, 1756, + 1197, 2304, 2277, 2055, 650, 1977, 2513, 632, 2865, 33, 1320, 1915, + 2319, 1435, 807, 452, 1438, 2868, 1534, 2402, 2647, 2617, 1481, 648, + 2474, 3110, 1227, 910, 17, 2761, 583, 2649, 1637, 723, 2288, 1100, + 1409, 2662, 3281, 233, 756, 2156, 3015, 3050, 1703, 1651, 2789, 1789, + 1847, 952, 1461, 2687, 939, 2308, 2437, 2388, 733, 2337, 268, 641, + 1584, 2298, 2037, 3220, 375, 2549, 2090, 1645, 1063, 319, 2773, 757, + 2099, 561, 2466, 2594, 2804, 1092, 403, 1026, 1143, 2150, 2775, 886, + 1722, 1212, 1874, 1029, 2110, 2935, 885, 2154, +}; + +/* kInverseNTTRoots = [pow(17, -bitreverse(i), p) for i in range(128)] */ +static const uint16_t kInverseNTTRoots[128] = { + 1, 1600, 40, 749, 2481, 1432, 2699, 687, 1583, 2760, 69, 543, + 2532, 3136, 1410, 2267, 2508, 1355, 450, 936, 447, 2794, 1235, 1903, + 1996, 1089, 3273, 283, 1853, 1990, 882, 3033, 2419, 2102, 219, 855, + 2681, 1848, 712, 682, 927, 1795, 461, 1891, 2877, 2522, 1894, 1010, + 1414, 2009, 3296, 464, 2697, 816, 1352, 2679, 1274, 1052, 1025, 2132, + 1573, 76, 2998, 3040, 1175, 2444, 394, 1219, 2300, 1455, 2117, 1607, + 2443, 554, 1179, 2186, 2303, 2926, 2237, 525, 735, 863, 2768, 1230, + 2572, 556, 3010, 2266, 1684, 1239, 780, 2954, 109, 1292, 1031, 1745, + 2688, 3061, 992, 2596, 941, 892, 1021, 2390, 642, 1868, 2377, 1482, + 1540, 540, 1678, 1626, 279, 314, 1173, 2573, 3096, 48, 667, 1920, + 2229, 1041, 2606, 1692, 680, 2746, 568, 3312, +}; + +/* kModRoots = [pow(17, 2*bitreverse(i) + 1, p) for i in range(128)] */ +static const uint16_t kModRoots[128] = { + 17, 3312, 2761, 568, 583, 2746, 2649, 680, 1637, 1692, 723, 2606, + 2288, 1041, 1100, 2229, 1409, 1920, 2662, 667, 3281, 48, 233, 3096, + 756, 2573, 2156, 1173, 3015, 314, 3050, 279, 1703, 1626, 1651, 1678, + 2789, 540, 1789, 1540, 1847, 1482, 952, 2377, 1461, 1868, 2687, 642, + 939, 2390, 2308, 1021, 2437, 892, 2388, 941, 733, 2596, 2337, 992, + 268, 3061, 641, 2688, 1584, 1745, 2298, 1031, 2037, 1292, 3220, 109, + 375, 2954, 2549, 780, 2090, 1239, 1645, 1684, 1063, 2266, 319, 3010, + 2773, 556, 757, 2572, 2099, 1230, 561, 2768, 2466, 863, 2594, 735, + 2804, 525, 1092, 2237, 403, 2926, 1026, 2303, 1143, 2186, 2150, 1179, + 2775, 554, 886, 2443, 1722, 1607, 1212, 2117, 1874, 1455, 1029, 2300, + 2110, 1219, 2935, 394, 885, 2444, 2154, 1175, +}; + +/* reduce_once reduces 0 <= x < 2*kPrime, mod kPrime. */ +static uint16_t +reduce_once(uint16_t x) +{ + assert(x < 2 * kPrime); + const uint16_t subtracted = x - kPrime; + uint16_t mask = 0u - (subtracted >> 15); + + /* + * Although this is a constant-time select, we omit a value barrier here. + * Value barriers impede auto-vectorization (likely because it forces the + * value to transit through a general-purpose register). On AArch64, this + * is a difference of 2x. + * + * We usually add value barriers to selects because Clang turns + * consecutive selects with the same condition into a branch instead of + * CMOV/CSEL. This condition does not occur in ML-KEM, so omitting it + * seems to be safe so far but see + * |scalar_centered_binomial_distribution_eta_2_with_prf|. + */ + return (mask & x) | (~mask & subtracted); +} + +/* + * constant time reduce x mod kPrime using Barrett reduction. x must be less + * than kPrime + 2×kPrime². + */ +static uint16_t +reduce(uint32_t x) +{ + uint64_t product = (uint64_t)x * kBarrettMultiplier; + uint32_t quotient = (uint32_t)(product >> kBarrettShift); + uint32_t remainder = x - quotient * kPrime; + + assert(x < kPrime + 2u * kPrime * kPrime); + return reduce_once(remainder); +} + +static void +scalar_zero(scalar *out) +{ + memset(out, 0, sizeof(*out)); +} + +static void +vector_zero(vector *out) +{ + memset(out, 0, sizeof(*out)); +} + +/* + * In place number theoretic transform of a given scalar. + * Note that MLKEM's kPrime 3329 does not have a 512th root of unity, so this + * transform leaves off the last iteration of the usual FFT code, with the 128 + * relevant roots of unity being stored in |kNTTRoots|. This means the output + * should be seen as 128 elements in GF(3329^2), with the coefficients of the + * elements being consecutive entries in |s->c|. + */ +static void +scalar_ntt(scalar *s) +{ + int offset = DEGREE; + int step; + /* + * `int` is used here because using `size_t` throughout caused a ~5% slowdown + * with Clang 14 on Aarch64. + */ + for (step = 1; step < DEGREE / 2; step <<= 1) { + int i, j, k = 0; + + offset >>= 1; + for (i = 0; i < step; i++) { + const uint32_t step_root = kNTTRoots[i + step]; + + for (j = k; j < k + offset; j++) { + uint16_t odd, even; + + odd = reduce(step_root * s->c[j + offset]); + even = s->c[j]; + s->c[j] = reduce_once(odd + even); + s->c[j + offset] = reduce_once(even - odd + + kPrime); + } + k += 2 * offset; + } + } +} + +static void +vector_ntt(vector *a) +{ + int i; + + for (i = 0; i < RANK1024; i++) { + scalar_ntt(&a->v[i]); + } +} + +/* + * In place inverse number theoretic transform of a given scalar, with pairs of + * entries of s->v being interpreted as elements of GF(3329^2). Just as with the + * number theoretic transform, this leaves off the first step of the normal iFFT + * to account for the fact that 3329 does not have a 512th root of unity, using + * the precomputed 128 roots of unity stored in |kInverseNTTRoots|. + */ +static void +scalar_inverse_ntt(scalar *s) +{ + int i, j, k, offset, step = DEGREE / 2; + + /* + * `int` is used here because using `size_t` throughout caused a ~5% slowdown + * with Clang 14 on Aarch64. + */ + for (offset = 2; offset < DEGREE; offset <<= 1) { + step >>= 1; + k = 0; + for (i = 0; i < step; i++) { + uint32_t step_root = kInverseNTTRoots[i + step]; + for (j = k; j < k + offset; j++) { + uint16_t odd, even; + odd = s->c[j + offset]; + even = s->c[j]; + s->c[j] = reduce_once(odd + even); + s->c[j + offset] = reduce(step_root * + (even - odd + kPrime)); + } + k += 2 * offset; + } + } + for (i = 0; i < DEGREE; i++) { + s->c[i] = reduce(s->c[i] * kInverseDegree); + } +} + +static void +vector_inverse_ntt(vector *a) +{ + int i; + + for (i = 0; i < RANK1024; i++) { + scalar_inverse_ntt(&a->v[i]); + } +} + +static void +scalar_add(scalar *lhs, const scalar *rhs) +{ + int i; + + for (i = 0; i < DEGREE; i++) { + lhs->c[i] = reduce_once(lhs->c[i] + rhs->c[i]); + } +} + +static void +scalar_sub(scalar *lhs, const scalar *rhs) +{ + int i; + + for (i = 0; i < DEGREE; i++) { + lhs->c[i] = reduce_once(lhs->c[i] - rhs->c[i] + kPrime); + } +} + +/* + * Multiplying two scalars in the number theoretically transformed state. + * Since 3329 does not have a 512th root of unity, this means we have to + * interpret the 2*ith and (2*i+1)th entries of the scalar as elements of + * GF(3329)[X]/(X^2 - 17^(2*bitreverse(i)+1)). + * The value of 17^(2*bitreverse(i)+1) mod 3329 is stored in the precomputed + * |kModRoots| table. Our Barrett transform only allows us to multiply two + * reduced numbers together, so we need some intermediate reduction steps, + * even if an uint64_t could hold 3 multiplied numbers. + */ +static void +scalar_mult(scalar *out, const scalar *lhs, const scalar *rhs) +{ + int i; + + for (i = 0; i < DEGREE / 2; i++) { + uint32_t real_real = (uint32_t)lhs->c[2 * i] * rhs->c[2 * i]; + uint32_t img_img = (uint32_t)lhs->c[2 * i + 1] * + rhs->c[2 * i + 1]; + uint32_t real_img = (uint32_t)lhs->c[2 * i] * rhs->c[2 * i + 1]; + uint32_t img_real = (uint32_t)lhs->c[2 * i + 1] * rhs->c[2 * i]; + + out->c[2 * i] = + reduce(real_real + + (uint32_t)reduce(img_img) * kModRoots[i]); + out->c[2 * i + 1] = reduce(img_real + real_img); + } +} + +static void +vector_add(vector *lhs, const vector *rhs) +{ + int i; + + for (i = 0; i < RANK1024; i++) { + scalar_add(&lhs->v[i], &rhs->v[i]); + } +} + +static void +matrix_mult(vector *out, const matrix *m, const vector *a) +{ + int i, j; + + vector_zero(out); + for (i = 0; i < RANK1024; i++) { + for (j = 0; j < RANK1024; j++) { + scalar product; + + scalar_mult(&product, &m->v[i][j], &a->v[j]); + scalar_add(&out->v[i], &product); + } + } +} + +static void +matrix_mult_transpose(vector *out, const matrix *m, + const vector *a) +{ + int i, j; + + vector_zero(out); + for (i = 0; i < RANK1024; i++) { + for (j = 0; j < RANK1024; j++) { + scalar product; + + scalar_mult(&product, &m->v[j][i], &a->v[j]); + scalar_add(&out->v[i], &product); + } + } +} + +static void +scalar_inner_product(scalar *out, const vector *lhs, + const vector *rhs) +{ + int i; + scalar_zero(out); + for (i = 0; i < RANK1024; i++) { + scalar product; + + scalar_mult(&product, &lhs->v[i], &rhs->v[i]); + scalar_add(out, &product); + } +} + +/* + * Algorithm 6 of spec. Rejection samples a Keccak stream to get uniformly + * distributed elements. This is used for matrix expansion and only operates on + * public inputs. + */ +static void +scalar_from_keccak_vartime(scalar *out, sha3_ctx *keccak_ctx) +{ + int i, done = 0; + + while (done < DEGREE) { + uint8_t block[168]; + + shake_out(keccak_ctx, block, sizeof(block)); + for (i = 0; i < sizeof(block) && done < DEGREE; i += 3) { + uint16_t d1 = block[i] + 256 * (block[i + 1] % 16); + uint16_t d2 = block[i + 1] / 16 + 16 * block[i + 2]; + + if (d1 < kPrime) { + out->c[done++] = d1; + } + if (d2 < kPrime && done < DEGREE) { + out->c[done++] = d2; + } + } + } +} + +/* + * Algorithm 7 of the spec, with eta fixed to two and the PRF call + * included. Creates binominally distributed elements by sampling 2*|eta| bits, + * and setting the coefficient to the count of the first bits minus the count of + * the second bits, resulting in a centered binomial distribution. Since eta is + * two this gives -2/2 with a probability of 1/16, -1/1 with probability 1/4, + * and 0 with probability 3/8. + */ +static void +scalar_centered_binomial_distribution_eta_2_with_prf(scalar *out, + const uint8_t input[33]) +{ + uint8_t entropy[128]; + int i; + + CTASSERT(sizeof(entropy) == 2 * /*kEta=*/ 2 * DEGREE / 8); + prf(entropy, sizeof(entropy), input); + + for (i = 0; i < DEGREE; i += 2) { + uint8_t byte = entropy[i / 2]; + uint16_t mask; + uint16_t value = (byte & 1) + ((byte >> 1) & 1); + + value -= ((byte >> 2) & 1) + ((byte >> 3) & 1); + + /* + * Add |kPrime| if |value| underflowed. See |reduce_once| for a + * discussion on why the value barrier is omitted. While this + * could have been written reduce_once(value + kPrime), this is + * one extra addition and small range of |value| tempts some + * versions of Clang to emit a branch. + */ + mask = 0u - (value >> 15); + out->c[i] = ((value + kPrime) & mask) | (value & ~mask); + + byte >>= 4; + value = (byte & 1) + ((byte >> 1) & 1); + value -= ((byte >> 2) & 1) + ((byte >> 3) & 1); + /* See above. */ + mask = 0u - (value >> 15); + out->c[i + 1] = ((value + kPrime) & mask) | (value & ~mask); + } +} + +/* + * Generates a secret vector by using + * |scalar_centered_binomial_distribution_eta_2_with_prf|, using the given seed + * appending and incrementing |counter| for entry of the vector. + */ +static void +vector_generate_secret_eta_2(vector *out, uint8_t *counter, + const uint8_t seed[32]) +{ + uint8_t input[33]; + int i; + + memcpy(input, seed, 32); + for (i = 0; i < RANK1024; i++) { + input[32] = (*counter)++; + scalar_centered_binomial_distribution_eta_2_with_prf(&out->v[i], + input); + } +} + +/* Expands the matrix of a seed for key generation and for encaps-CPA. */ +static void +matrix_expand(matrix *out, const uint8_t rho[32]) +{ + uint8_t input[34]; + int i, j; + + memcpy(input, rho, 32); + for (i = 0; i < RANK1024; i++) { + for (j = 0; j < RANK1024; j++) { + sha3_ctx keccak_ctx; + + input[32] = i; + input[33] = j; + shake128_init(&keccak_ctx); + shake_update(&keccak_ctx, input, sizeof(input)); + shake_xof(&keccak_ctx); + scalar_from_keccak_vartime(&out->v[i][j], &keccak_ctx); + } + } +} + +static const uint8_t kMasks[8] = {0x01, 0x03, 0x07, 0x0f, + 0x1f, 0x3f, 0x7f, 0xff}; + +static void +scalar_encode(uint8_t *out, const scalar *s, int bits) +{ + uint8_t out_byte = 0; + int i, out_byte_bits = 0; + + assert(bits <= (int)sizeof(*s->c) * 8 && bits != 1); + for (i = 0; i < DEGREE; i++) { + uint16_t element = s->c[i]; + int element_bits_done = 0; + + while (element_bits_done < bits) { + int chunk_bits = bits - element_bits_done; + int out_bits_remaining = 8 - out_byte_bits; + + if (chunk_bits >= out_bits_remaining) { + chunk_bits = out_bits_remaining; + out_byte |= (element & + kMasks[chunk_bits - 1]) << out_byte_bits; + *out = out_byte; + out++; + out_byte_bits = 0; + out_byte = 0; + } else { + out_byte |= (element & + kMasks[chunk_bits - 1]) << out_byte_bits; + out_byte_bits += chunk_bits; + } + + element_bits_done += chunk_bits; + element >>= chunk_bits; + } + } + + if (out_byte_bits > 0) { + *out = out_byte; + } +} + +/* scalar_encode_1 is |scalar_encode| specialised for |bits| == 1. */ +static void +scalar_encode_1(uint8_t out[32], const scalar *s) +{ + int i, j; + + for (i = 0; i < DEGREE; i += 8) { + uint8_t out_byte = 0; + + for (j = 0; j < 8; j++) { + out_byte |= (s->c[i + j] & 1) << j; + } + *out = out_byte; + out++; + } +} + +/* + * Encodes an entire vector into 32*|RANK1024|*|bits| bytes. Note that since 256 + * (DEGREE) is divisible by 8, the individual vector entries will always fill a + * whole number of bytes, so we do not need to worry about bit packing here. + */ +static void +vector_encode(uint8_t *out, const vector *a, int bits) +{ + int i; + + for (i = 0; i < RANK1024; i++) { + scalar_encode(out + i * bits * DEGREE / 8, &a->v[i], bits); + } +} + +/* + * scalar_decode parses |DEGREE * bits| bits from |in| into |DEGREE| values in + * |out|. It returns one on success and zero if any parsed value is >= + * |kPrime|. + */ +static int +scalar_decode(scalar *out, const uint8_t *in, int bits) +{ + uint8_t in_byte = 0; + int i, in_byte_bits_left = 0; + + assert(bits <= (int)sizeof(*out->c) * 8 && bits != 1); + + for (i = 0; i < DEGREE; i++) { + uint16_t element = 0; + int element_bits_done = 0; + + while (element_bits_done < bits) { + int chunk_bits = bits - element_bits_done; + + if (in_byte_bits_left == 0) { + in_byte = *in; + in++; + in_byte_bits_left = 8; + } + + if (chunk_bits > in_byte_bits_left) { + chunk_bits = in_byte_bits_left; + } + + element |= (in_byte & kMasks[chunk_bits - 1]) << + element_bits_done; + in_byte_bits_left -= chunk_bits; + in_byte >>= chunk_bits; + + element_bits_done += chunk_bits; + } + + if (element >= kPrime) { + return 0; + } + out->c[i] = element; + } + + return 1; +} + +/* scalar_decode_1 is |scalar_decode| specialised for |bits| == 1. */ +static void +scalar_decode_1(scalar *out, const uint8_t in[32]) +{ + int i, j; + + for (i = 0; i < DEGREE; i += 8) { + uint8_t in_byte = *in; + + in++; + for (j = 0; j < 8; j++) { + out->c[i + j] = in_byte & 1; + in_byte >>= 1; + } + } +} + +/* + * Decodes 32*|RANK1024|*|bits| bytes from |in| into |out|. It returns one on + * success or zero if any parsed value is >= |kPrime|. + */ +static int +vector_decode(vector *out, const uint8_t *in, int bits) +{ + int i; + + for (i = 0; i < RANK1024; i++) { + if (!scalar_decode(&out->v[i], in + i * bits * DEGREE / 8, + bits)) { + return 0; + } + } + return 1; +} + +/* + * Compresses (lossily) an input |x| mod 3329 into |bits| many bits by grouping + * numbers close to each other together. The formula used is + * round(2^|bits|/kPrime*x) mod 2^|bits|. + * Uses Barrett reduction to achieve constant time. Since we need both the + * remainder (for rounding) and the quotient (as the result), we cannot use + * |reduce| here, but need to do the Barrett reduction directly. + */ +static uint16_t +compress(uint16_t x, int bits) +{ + uint32_t shifted = (uint32_t)x << bits; + uint64_t product = (uint64_t)shifted * kBarrettMultiplier; + uint32_t quotient = (uint32_t)(product >> kBarrettShift); + uint32_t remainder = shifted - quotient * kPrime; + + /* + * Adjust the quotient to round correctly: + * 0 <= remainder <= kHalfPrime round to 0 + * kHalfPrime < remainder <= kPrime + kHalfPrime round to 1 + * kPrime + kHalfPrime < remainder < 2 * kPrime round to 2 + */ + assert(remainder < 2u * kPrime); + quotient += 1 & constant_time_lt(kHalfPrime, remainder); + quotient += 1 & constant_time_lt(kPrime + kHalfPrime, remainder); + return quotient & ((1 << bits) - 1); +} + +/* + * Decompresses |x| by using an equi-distant representative. The formula is + * round(kPrime/2^|bits|*x). Note that 2^|bits| being the divisor allows us to + * implement this logic using only bit operations. + */ +static uint16_t +decompress(uint16_t x, int bits) +{ + uint32_t product = (uint32_t)x * kPrime; + uint32_t power = 1 << bits; + /* This is |product| % power, since |power| is a power of 2. */ + uint32_t remainder = product & (power - 1); + /* This is |product| / power, since |power| is a power of 2. */ + uint32_t lower = product >> bits; + + /* + * The rounding logic works since the first half of numbers mod |power| have a + * 0 as first bit, and the second half has a 1 as first bit, since |power| is + * a power of 2. As a 12 bit number, |remainder| is always positive, so we + * will shift in 0s for a right shift. + */ + return lower + (remainder >> (bits - 1)); +} + +static void +scalar_compress(scalar *s, int bits) +{ + int i; + + for (i = 0; i < DEGREE; i++) { + s->c[i] = compress(s->c[i], bits); + } +} + +static void +scalar_decompress(scalar *s, int bits) +{ + int i; + + for (i = 0; i < DEGREE; i++) { + s->c[i] = decompress(s->c[i], bits); + } +} + +static void +vector_compress(vector *a, int bits) +{ + int i; + + for (i = 0; i < RANK1024; i++) { + scalar_compress(&a->v[i], bits); + } +} + +static void +vector_decompress(vector *a, int bits) +{ + int i; + + for (i = 0; i < RANK1024; i++) { + scalar_decompress(&a->v[i], bits); + } +} + +struct public_key { + vector t; + uint8_t rho[32]; + uint8_t public_key_hash[32]; + matrix m; +}; + +static struct public_key * +public_key_1024_from_external(const struct MLKEM1024_public_key *external) +{ + return (struct public_key *)external; +} + +struct private_key { + struct public_key pub; + vector s; + uint8_t fo_failure_secret[32]; +}; + +static struct private_key * +private_key_1024_from_external(const struct MLKEM1024_private_key *external) +{ + return (struct private_key *)external; +} + +/* + * Calls |MLKEM1024_generate_key_external_entropy| with random bytes from + * |RAND_bytes|. + */ +void +MLKEM1024_generate_key(uint8_t out_encoded_public_key[MLKEM1024_PUBLIC_KEY_BYTES], + uint8_t optional_out_seed[MLKEM_SEED_BYTES], + struct MLKEM1024_private_key *out_private_key) +{ + uint8_t entropy_buf[MLKEM_SEED_BYTES]; + uint8_t *entropy = optional_out_seed != NULL ? optional_out_seed : + entropy_buf; + + arc4random_buf(entropy, MLKEM_SEED_BYTES); + MLKEM1024_generate_key_external_entropy(out_encoded_public_key, + out_private_key, entropy); +} +LCRYPTO_ALIAS(MLKEM1024_generate_key); + +int +MLKEM1024_private_key_from_seed(struct MLKEM1024_private_key *out_private_key, + const uint8_t *seed, size_t seed_len) +{ + uint8_t public_key_bytes[MLKEM1024_PUBLIC_KEY_BYTES]; + + if (seed_len != MLKEM_SEED_BYTES) { + return 0; + } + MLKEM1024_generate_key_external_entropy(public_key_bytes, + out_private_key, seed); + + return 1; +} +LCRYPTO_ALIAS(MLKEM1024_private_key_from_seed); + +static int +mlkem_marshal_public_key(CBB *out, const struct public_key *pub) +{ + uint8_t *vector_output; + + if (!CBB_add_space(out, &vector_output, kEncodedVectorSize)) { + return 0; + } + vector_encode(vector_output, &pub->t, kLog2Prime); + if (!CBB_add_bytes(out, pub->rho, sizeof(pub->rho))) { + return 0; + } + return 1; +} + +void +MLKEM1024_generate_key_external_entropy( + uint8_t out_encoded_public_key[MLKEM1024_PUBLIC_KEY_BYTES], + struct MLKEM1024_private_key *out_private_key, + const uint8_t entropy[MLKEM_SEED_BYTES]) +{ + struct private_key *priv = private_key_1024_from_external( + out_private_key); + uint8_t augmented_seed[33]; + uint8_t *rho, *sigma; + uint8_t counter = 0; + uint8_t hashed[64]; + vector error; + CBB cbb; + + memcpy(augmented_seed, entropy, 32); + augmented_seed[32] = RANK1024; + hash_g(hashed, augmented_seed, 33); + rho = hashed; + sigma = hashed + 32; + memcpy(priv->pub.rho, hashed, sizeof(priv->pub.rho)); + matrix_expand(&priv->pub.m, rho); + vector_generate_secret_eta_2(&priv->s, &counter, sigma); + vector_ntt(&priv->s); + vector_generate_secret_eta_2(&error, &counter, sigma); + vector_ntt(&error); + matrix_mult_transpose(&priv->pub.t, &priv->pub.m, &priv->s); + vector_add(&priv->pub.t, &error); + + /* XXX - error checking. */ + CBB_init_fixed(&cbb, out_encoded_public_key, MLKEM1024_PUBLIC_KEY_BYTES); + if (!mlkem_marshal_public_key(&cbb, &priv->pub)) { + abort(); + } + CBB_cleanup(&cbb); + + hash_h(priv->pub.public_key_hash, out_encoded_public_key, + MLKEM1024_PUBLIC_KEY_BYTES); + memcpy(priv->fo_failure_secret, entropy + 32, 32); +} + +void +MLKEM1024_public_from_private(struct MLKEM1024_public_key *out_public_key, + const struct MLKEM1024_private_key *private_key) +{ + struct public_key *const pub = public_key_1024_from_external( + out_public_key); + const struct private_key *const priv = private_key_1024_from_external( + private_key); + + *pub = priv->pub; +} +LCRYPTO_ALIAS(MLKEM1024_public_from_private); + +/* + * Encrypts a message with given randomness to the ciphertext in |out|. Without + * applying the Fujisaki-Okamoto transform this would not result in a CCA secure + * scheme, since lattice schemes are vulnerable to decryption failure oracles. + */ +static void +encrypt_cpa(uint8_t out[MLKEM1024_CIPHERTEXT_BYTES], + const struct public_key *pub, const uint8_t message[32], + const uint8_t randomness[32]) +{ + scalar expanded_message, scalar_error; + vector secret, error, u; + uint8_t counter = 0; + uint8_t input[33]; + scalar v; + + vector_generate_secret_eta_2(&secret, &counter, randomness); + vector_ntt(&secret); + vector_generate_secret_eta_2(&error, &counter, randomness); + memcpy(input, randomness, 32); + input[32] = counter; + scalar_centered_binomial_distribution_eta_2_with_prf(&scalar_error, + input); + matrix_mult(&u, &pub->m, &secret); + vector_inverse_ntt(&u); + vector_add(&u, &error); + scalar_inner_product(&v, &pub->t, &secret); + scalar_inverse_ntt(&v); + scalar_add(&v, &scalar_error); + scalar_decode_1(&expanded_message, message); + scalar_decompress(&expanded_message, 1); + scalar_add(&v, &expanded_message); + vector_compress(&u, kDU1024); + vector_encode(out, &u, kDU1024); + scalar_compress(&v, kDV1024); + scalar_encode(out + kCompressedVectorSize, &v, kDV1024); +} + +/* Calls MLKEM1024_encap_external_entropy| with random bytes */ +void +MLKEM1024_encap(uint8_t out_ciphertext[MLKEM1024_CIPHERTEXT_BYTES], + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const struct MLKEM1024_public_key *public_key) +{ + uint8_t entropy[MLKEM_ENCAP_ENTROPY]; + + arc4random_buf(entropy, MLKEM_ENCAP_ENTROPY); + MLKEM1024_encap_external_entropy(out_ciphertext, out_shared_secret, + public_key, entropy); +} +LCRYPTO_ALIAS(MLKEM1024_encap); + +/* See section 6.2 of the spec. */ +void +MLKEM1024_encap_external_entropy( + uint8_t out_ciphertext[MLKEM1024_CIPHERTEXT_BYTES], + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const struct MLKEM1024_public_key *public_key, + const uint8_t entropy[MLKEM_ENCAP_ENTROPY]) +{ + const struct public_key *pub = public_key_1024_from_external(public_key); + uint8_t key_and_randomness[64]; + uint8_t input[64]; + + memcpy(input, entropy, MLKEM_ENCAP_ENTROPY); + memcpy(input + MLKEM_ENCAP_ENTROPY, pub->public_key_hash, + sizeof(input) - MLKEM_ENCAP_ENTROPY); + hash_g(key_and_randomness, input, sizeof(input)); + encrypt_cpa(out_ciphertext, pub, entropy, key_and_randomness + 32); + memcpy(out_shared_secret, key_and_randomness, 32); +} + +static void +decrypt_cpa(uint8_t out[32], const struct private_key *priv, + const uint8_t ciphertext[MLKEM1024_CIPHERTEXT_BYTES]) +{ + scalar mask, v; + vector u; + + vector_decode(&u, ciphertext, kDU1024); + vector_decompress(&u, kDU1024); + vector_ntt(&u); + scalar_decode(&v, ciphertext + kCompressedVectorSize, kDV1024); + scalar_decompress(&v, kDV1024); + scalar_inner_product(&mask, &priv->s, &u); + scalar_inverse_ntt(&mask); + scalar_sub(&v, &mask); + scalar_compress(&v, 1); + scalar_encode_1(out, &v); +} + +/* See section 6.3 */ +int +MLKEM1024_decap(uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const uint8_t *ciphertext, size_t ciphertext_len, + const struct MLKEM1024_private_key *private_key) +{ + const struct private_key *priv = private_key_1024_from_external( + private_key); + uint8_t expected_ciphertext[MLKEM1024_CIPHERTEXT_BYTES]; + uint8_t key_and_randomness[64]; + uint8_t failure_key[32]; + uint8_t decrypted[64]; + uint8_t mask; + int i; + + if (ciphertext_len != MLKEM1024_CIPHERTEXT_BYTES) { + arc4random_buf(out_shared_secret, MLKEM_SHARED_SECRET_BYTES); + return 0; + } + + decrypt_cpa(decrypted, priv, ciphertext); + memcpy(decrypted + 32, priv->pub.public_key_hash, + sizeof(decrypted) - 32); + hash_g(key_and_randomness, decrypted, sizeof(decrypted)); + encrypt_cpa(expected_ciphertext, &priv->pub, decrypted, + key_and_randomness + 32); + kdf(failure_key, priv->fo_failure_secret, ciphertext, ciphertext_len); + mask = constant_time_eq_int_8(memcmp(ciphertext, expected_ciphertext, + sizeof(expected_ciphertext)), 0); + for (i = 0; i < MLKEM_SHARED_SECRET_BYTES; i++) { + out_shared_secret[i] = constant_time_select_8(mask, + key_and_randomness[i], failure_key[i]); + } + + return 1; +} +LCRYPTO_ALIAS(MLKEM1024_decap); + +int +MLKEM1024_marshal_public_key(CBB *out, + const struct MLKEM1024_public_key *public_key) +{ + return mlkem_marshal_public_key(out, + public_key_1024_from_external(public_key)); +} +LCRYPTO_ALIAS(MLKEM1024_marshal_public_key); + +/* + * mlkem_parse_public_key_no_hash parses |in| into |pub| but doesn't calculate + * the value of |pub->public_key_hash|. + */ +static int +mlkem_parse_public_key_no_hash(struct public_key *pub, CBS *in) +{ + CBS t_bytes; + + if (!CBS_get_bytes(in, &t_bytes, kEncodedVectorSize) || + !vector_decode(&pub->t, CBS_data(&t_bytes), kLog2Prime)) { + return 0; + } + memcpy(pub->rho, CBS_data(in), sizeof(pub->rho)); + if (!CBS_skip(in, sizeof(pub->rho))) + return 0; + matrix_expand(&pub->m, pub->rho); + return 1; +} + +int +MLKEM1024_parse_public_key(struct MLKEM1024_public_key *public_key, CBS *in) +{ + struct public_key *pub = public_key_1024_from_external(public_key); + CBS orig_in = *in; + + if (!mlkem_parse_public_key_no_hash(pub, in) || + CBS_len(in) != 0) { + return 0; + } + hash_h(pub->public_key_hash, CBS_data(&orig_in), CBS_len(&orig_in)); + return 1; +} +LCRYPTO_ALIAS(MLKEM1024_parse_public_key); + +int +MLKEM1024_marshal_private_key(CBB *out, + const struct MLKEM1024_private_key *private_key) +{ + const struct private_key *const priv = private_key_1024_from_external( + private_key); + uint8_t *s_output; + + if (!CBB_add_space(out, &s_output, kEncodedVectorSize)) { + return 0; + } + vector_encode(s_output, &priv->s, kLog2Prime); + if (!mlkem_marshal_public_key(out, &priv->pub) || + !CBB_add_bytes(out, priv->pub.public_key_hash, + sizeof(priv->pub.public_key_hash)) || + !CBB_add_bytes(out, priv->fo_failure_secret, + sizeof(priv->fo_failure_secret))) { + return 0; + } + return 1; +} + +int +MLKEM1024_parse_private_key(struct MLKEM1024_private_key *out_private_key, + CBS *in) +{ + struct private_key *const priv = private_key_1024_from_external( + out_private_key); + CBS s_bytes; + + if (!CBS_get_bytes(in, &s_bytes, kEncodedVectorSize) || + !vector_decode(&priv->s, CBS_data(&s_bytes), kLog2Prime) || + !mlkem_parse_public_key_no_hash(&priv->pub, in)) { + return 0; + } + memcpy(priv->pub.public_key_hash, CBS_data(in), + sizeof(priv->pub.public_key_hash)); + if (!CBS_skip(in, sizeof(priv->pub.public_key_hash))) + return 0; + memcpy(priv->fo_failure_secret, CBS_data(in), + sizeof(priv->fo_failure_secret)); + if (!CBS_skip(in, sizeof(priv->fo_failure_secret))) + return 0; + if (CBS_len(in) != 0) + return 0; + + return 1; +} +LCRYPTO_ALIAS(MLKEM1024_parse_private_key); diff --git a/lib/libcrypto/mlkem/mlkem768.c b/lib/libcrypto/mlkem/mlkem768.c new file mode 100644 index 000000000..bacde0c0b --- /dev/null +++ b/lib/libcrypto/mlkem/mlkem768.c @@ -0,0 +1,1138 @@ +/* $OpenBSD: mlkem768.c,v 1.7 2025/01/03 08:19:24 tb Exp $ */ +/* + * Copyright (c) 2024, Google Inc. + * Copyright (c) 2024, Bob Beck + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include + +#include "bytestring.h" +#include "mlkem.h" + +#include "sha3_internal.h" +#include "mlkem_internal.h" +#include "constant_time.h" +#include "crypto_internal.h" + +/* Remove later */ +#undef LCRYPTO_ALIAS +#define LCRYPTO_ALIAS(A) + +/* + * See + * https://csrc.nist.gov/pubs/fips/203/final + */ + +static void +prf(uint8_t *out, size_t out_len, const uint8_t in[33]) +{ + sha3_ctx ctx; + shake256_init(&ctx); + shake_update(&ctx, in, 33); + shake_xof(&ctx); + shake_out(&ctx, out, out_len); +} + +/* Section 4.1 */ +static void +hash_h(uint8_t out[32], const uint8_t *in, size_t len) +{ + sha3_ctx ctx; + sha3_init(&ctx, 32); + sha3_update(&ctx, in, len); + sha3_final(out, &ctx); +} + +static void +hash_g(uint8_t out[64], const uint8_t *in, size_t len) +{ + sha3_ctx ctx; + sha3_init(&ctx, 64); + sha3_update(&ctx, in, len); + sha3_final(out, &ctx); +} + +/* this is called 'J' in the spec */ +static void +kdf(uint8_t out[MLKEM_SHARED_SECRET_BYTES], const uint8_t failure_secret[32], + const uint8_t *in, size_t len) +{ + sha3_ctx ctx; + shake256_init(&ctx); + shake_update(&ctx, failure_secret, 32); + shake_update(&ctx, in, len); + shake_xof(&ctx); + shake_out(&ctx, out, MLKEM_SHARED_SECRET_BYTES); +} + +#define DEGREE 256 +#define RANK768 3 + +static const size_t kBarrettMultiplier = 5039; +static const unsigned kBarrettShift = 24; +static const uint16_t kPrime = 3329; +static const int kLog2Prime = 12; +static const uint16_t kHalfPrime = (/*kPrime=*/3329 - 1) / 2; +static const int kDU768 = 10; +static const int kDV768 = 4; +/* + * kInverseDegree is 128^-1 mod 3329; 128 because kPrime does not have a 512th + * root of unity. + */ +static const uint16_t kInverseDegree = 3303; +static const size_t kEncodedVectorSize = + (/*kLog2Prime=*/12 * DEGREE / 8) * RANK768; +static const size_t kCompressedVectorSize = /*kDU768=*/ 10 * RANK768 * DEGREE / + 8; + +typedef struct scalar { + /* On every function entry and exit, 0 <= c < kPrime. */ + uint16_t c[DEGREE]; +} scalar; + +typedef struct vector { + scalar v[RANK768]; +} vector; + +typedef struct matrix { + scalar v[RANK768][RANK768]; +} matrix; + +/* + * This bit of Python will be referenced in some of the following comments: + * + * p = 3329 + * + * def bitreverse(i): + * ret = 0 + * for n in range(7): + * bit = i & 1 + * ret <<= 1 + * ret |= bit + * i >>= 1 + * return ret + */ + +/* kNTTRoots = [pow(17, bitreverse(i), p) for i in range(128)] */ +static const uint16_t kNTTRoots[128] = { + 1, 1729, 2580, 3289, 2642, 630, 1897, 848, 1062, 1919, 193, 797, + 2786, 3260, 569, 1746, 296, 2447, 1339, 1476, 3046, 56, 2240, 1333, + 1426, 2094, 535, 2882, 2393, 2879, 1974, 821, 289, 331, 3253, 1756, + 1197, 2304, 2277, 2055, 650, 1977, 2513, 632, 2865, 33, 1320, 1915, + 2319, 1435, 807, 452, 1438, 2868, 1534, 2402, 2647, 2617, 1481, 648, + 2474, 3110, 1227, 910, 17, 2761, 583, 2649, 1637, 723, 2288, 1100, + 1409, 2662, 3281, 233, 756, 2156, 3015, 3050, 1703, 1651, 2789, 1789, + 1847, 952, 1461, 2687, 939, 2308, 2437, 2388, 733, 2337, 268, 641, + 1584, 2298, 2037, 3220, 375, 2549, 2090, 1645, 1063, 319, 2773, 757, + 2099, 561, 2466, 2594, 2804, 1092, 403, 1026, 1143, 2150, 2775, 886, + 1722, 1212, 1874, 1029, 2110, 2935, 885, 2154, +}; + +/* kInverseNTTRoots = [pow(17, -bitreverse(i), p) for i in range(128)] */ +static const uint16_t kInverseNTTRoots[128] = { + 1, 1600, 40, 749, 2481, 1432, 2699, 687, 1583, 2760, 69, 543, + 2532, 3136, 1410, 2267, 2508, 1355, 450, 936, 447, 2794, 1235, 1903, + 1996, 1089, 3273, 283, 1853, 1990, 882, 3033, 2419, 2102, 219, 855, + 2681, 1848, 712, 682, 927, 1795, 461, 1891, 2877, 2522, 1894, 1010, + 1414, 2009, 3296, 464, 2697, 816, 1352, 2679, 1274, 1052, 1025, 2132, + 1573, 76, 2998, 3040, 1175, 2444, 394, 1219, 2300, 1455, 2117, 1607, + 2443, 554, 1179, 2186, 2303, 2926, 2237, 525, 735, 863, 2768, 1230, + 2572, 556, 3010, 2266, 1684, 1239, 780, 2954, 109, 1292, 1031, 1745, + 2688, 3061, 992, 2596, 941, 892, 1021, 2390, 642, 1868, 2377, 1482, + 1540, 540, 1678, 1626, 279, 314, 1173, 2573, 3096, 48, 667, 1920, + 2229, 1041, 2606, 1692, 680, 2746, 568, 3312, +}; + +/* kModRoots = [pow(17, 2*bitreverse(i) + 1, p) for i in range(128)] */ +static const uint16_t kModRoots[128] = { + 17, 3312, 2761, 568, 583, 2746, 2649, 680, 1637, 1692, 723, 2606, + 2288, 1041, 1100, 2229, 1409, 1920, 2662, 667, 3281, 48, 233, 3096, + 756, 2573, 2156, 1173, 3015, 314, 3050, 279, 1703, 1626, 1651, 1678, + 2789, 540, 1789, 1540, 1847, 1482, 952, 2377, 1461, 1868, 2687, 642, + 939, 2390, 2308, 1021, 2437, 892, 2388, 941, 733, 2596, 2337, 992, + 268, 3061, 641, 2688, 1584, 1745, 2298, 1031, 2037, 1292, 3220, 109, + 375, 2954, 2549, 780, 2090, 1239, 1645, 1684, 1063, 2266, 319, 3010, + 2773, 556, 757, 2572, 2099, 1230, 561, 2768, 2466, 863, 2594, 735, + 2804, 525, 1092, 2237, 403, 2926, 1026, 2303, 1143, 2186, 2150, 1179, + 2775, 554, 886, 2443, 1722, 1607, 1212, 2117, 1874, 1455, 1029, 2300, + 2110, 1219, 2935, 394, 885, 2444, 2154, 1175, +}; + +/* reduce_once reduces 0 <= x < 2*kPrime, mod kPrime. */ +static uint16_t +reduce_once(uint16_t x) +{ + assert(x < 2 * kPrime); + const uint16_t subtracted = x - kPrime; + uint16_t mask = 0u - (subtracted >> 15); + + /* + * Although this is a constant-time select, we omit a value barrier here. + * Value barriers impede auto-vectorization (likely because it forces the + * value to transit through a general-purpose register). On AArch64, this + * is a difference of 2x. + * + * We usually add value barriers to selects because Clang turns + * consecutive selects with the same condition into a branch instead of + * CMOV/CSEL. This condition does not occur in ML-KEM, so omitting it + * seems to be safe so far but see + * |scalar_centered_binomial_distribution_eta_2_with_prf|. + */ + return (mask & x) | (~mask & subtracted); +} + +/* + * constant time reduce x mod kPrime using Barrett reduction. x must be less + * than kPrime + 2×kPrime². + */ +static uint16_t +reduce(uint32_t x) +{ + uint64_t product = (uint64_t)x * kBarrettMultiplier; + uint32_t quotient = (uint32_t)(product >> kBarrettShift); + uint32_t remainder = x - quotient * kPrime; + + assert(x < kPrime + 2u * kPrime * kPrime); + return reduce_once(remainder); +} + +static void +scalar_zero(scalar *out) +{ + memset(out, 0, sizeof(*out)); +} + +static void +vector_zero(vector *out) +{ + memset(out, 0, sizeof(*out)); +} + +/* + * In place number theoretic transform of a given scalar. + * Note that MLKEM's kPrime 3329 does not have a 512th root of unity, so this + * transform leaves off the last iteration of the usual FFT code, with the 128 + * relevant roots of unity being stored in |kNTTRoots|. This means the output + * should be seen as 128 elements in GF(3329^2), with the coefficients of the + * elements being consecutive entries in |s->c|. + */ +static void +scalar_ntt(scalar *s) +{ + int offset = DEGREE; + int step; + /* + * `int` is used here because using `size_t` throughout caused a ~5% slowdown + * with Clang 14 on Aarch64. + */ + for (step = 1; step < DEGREE / 2; step <<= 1) { + int i, j, k = 0; + + offset >>= 1; + for (i = 0; i < step; i++) { + const uint32_t step_root = kNTTRoots[i + step]; + + for (j = k; j < k + offset; j++) { + uint16_t odd, even; + + odd = reduce(step_root * s->c[j + offset]); + even = s->c[j]; + s->c[j] = reduce_once(odd + even); + s->c[j + offset] = reduce_once(even - odd + + kPrime); + } + k += 2 * offset; + } + } +} + +static void +vector_ntt(vector *a) +{ + int i; + + for (i = 0; i < RANK768; i++) { + scalar_ntt(&a->v[i]); + } +} + +/* + * In place inverse number theoretic transform of a given scalar, with pairs of + * entries of s->v being interpreted as elements of GF(3329^2). Just as with the + * number theoretic transform, this leaves off the first step of the normal iFFT + * to account for the fact that 3329 does not have a 512th root of unity, using + * the precomputed 128 roots of unity stored in |kInverseNTTRoots|. + */ +static void +scalar_inverse_ntt(scalar *s) +{ + int i, j, k, offset, step = DEGREE / 2; + + /* + * `int` is used here because using `size_t` throughout caused a ~5% slowdown + * with Clang 14 on Aarch64. + */ + for (offset = 2; offset < DEGREE; offset <<= 1) { + step >>= 1; + k = 0; + for (i = 0; i < step; i++) { + uint32_t step_root = kInverseNTTRoots[i + step]; + for (j = k; j < k + offset; j++) { + uint16_t odd, even; + odd = s->c[j + offset]; + even = s->c[j]; + s->c[j] = reduce_once(odd + even); + s->c[j + offset] = reduce(step_root * + (even - odd + kPrime)); + } + k += 2 * offset; + } + } + for (i = 0; i < DEGREE; i++) { + s->c[i] = reduce(s->c[i] * kInverseDegree); + } +} + +static void +vector_inverse_ntt(vector *a) +{ + int i; + + for (i = 0; i < RANK768; i++) { + scalar_inverse_ntt(&a->v[i]); + } +} + +static void +scalar_add(scalar *lhs, const scalar *rhs) +{ + int i; + + for (i = 0; i < DEGREE; i++) { + lhs->c[i] = reduce_once(lhs->c[i] + rhs->c[i]); + } +} + +static void +scalar_sub(scalar *lhs, const scalar *rhs) +{ + int i; + + for (i = 0; i < DEGREE; i++) { + lhs->c[i] = reduce_once(lhs->c[i] - rhs->c[i] + kPrime); + } +} + +/* + * Multiplying two scalars in the number theoretically transformed state. + * Since 3329 does not have a 512th root of unity, this means we have to + * interpret the 2*ith and (2*i+1)th entries of the scalar as elements of + * GF(3329)[X]/(X^2 - 17^(2*bitreverse(i)+1)). + * The value of 17^(2*bitreverse(i)+1) mod 3329 is stored in the precomputed + * |kModRoots| table. Our Barrett transform only allows us to multiply two + * reduced numbers together, so we need some intermediate reduction steps, + * even if an uint64_t could hold 3 multiplied numbers. + */ +static void +scalar_mult(scalar *out, const scalar *lhs, const scalar *rhs) +{ + int i; + + for (i = 0; i < DEGREE / 2; i++) { + uint32_t real_real = (uint32_t)lhs->c[2 * i] * rhs->c[2 * i]; + uint32_t img_img = (uint32_t)lhs->c[2 * i + 1] * + rhs->c[2 * i + 1]; + uint32_t real_img = (uint32_t)lhs->c[2 * i] * rhs->c[2 * i + 1]; + uint32_t img_real = (uint32_t)lhs->c[2 * i + 1] * rhs->c[2 * i]; + + out->c[2 * i] = + reduce(real_real + + (uint32_t)reduce(img_img) * kModRoots[i]); + out->c[2 * i + 1] = reduce(img_real + real_img); + } +} + +static void +vector_add(vector *lhs, const vector *rhs) +{ + int i; + + for (i = 0; i < RANK768; i++) { + scalar_add(&lhs->v[i], &rhs->v[i]); + } +} + +static void +matrix_mult(vector *out, const matrix *m, const vector *a) +{ + int i, j; + + vector_zero(out); + for (i = 0; i < RANK768; i++) { + for (j = 0; j < RANK768; j++) { + scalar product; + + scalar_mult(&product, &m->v[i][j], &a->v[j]); + scalar_add(&out->v[i], &product); + } + } +} + +static void +matrix_mult_transpose(vector *out, const matrix *m, + const vector *a) +{ + int i, j; + + vector_zero(out); + for (i = 0; i < RANK768; i++) { + for (j = 0; j < RANK768; j++) { + scalar product; + + scalar_mult(&product, &m->v[j][i], &a->v[j]); + scalar_add(&out->v[i], &product); + } + } +} + +static void +scalar_inner_product(scalar *out, const vector *lhs, + const vector *rhs) +{ + int i; + scalar_zero(out); + for (i = 0; i < RANK768; i++) { + scalar product; + + scalar_mult(&product, &lhs->v[i], &rhs->v[i]); + scalar_add(out, &product); + } +} + +/* + * Algorithm 6 of spec. Rejection samples a Keccak stream to get uniformly + * distributed elements. This is used for matrix expansion and only operates on + * public inputs. + */ +static void +scalar_from_keccak_vartime(scalar *out, sha3_ctx *keccak_ctx) +{ + int i, done = 0; + + while (done < DEGREE) { + uint8_t block[168]; + + shake_out(keccak_ctx, block, sizeof(block)); + for (i = 0; i < sizeof(block) && done < DEGREE; i += 3) { + uint16_t d1 = block[i] + 256 * (block[i + 1] % 16); + uint16_t d2 = block[i + 1] / 16 + 16 * block[i + 2]; + + if (d1 < kPrime) { + out->c[done++] = d1; + } + if (d2 < kPrime && done < DEGREE) { + out->c[done++] = d2; + } + } + } +} + +/* + * Algorithm 7 of the spec, with eta fixed to two and the PRF call + * included. Creates binominally distributed elements by sampling 2*|eta| bits, + * and setting the coefficient to the count of the first bits minus the count of + * the second bits, resulting in a centered binomial distribution. Since eta is + * two this gives -2/2 with a probability of 1/16, -1/1 with probability 1/4, + * and 0 with probability 3/8. + */ +static void +scalar_centered_binomial_distribution_eta_2_with_prf(scalar *out, + const uint8_t input[33]) +{ + uint8_t entropy[128]; + int i; + + CTASSERT(sizeof(entropy) == 2 * /*kEta=*/ 2 * DEGREE / 8); + prf(entropy, sizeof(entropy), input); + + for (i = 0; i < DEGREE; i += 2) { + uint8_t byte = entropy[i / 2]; + uint16_t mask; + uint16_t value = (byte & 1) + ((byte >> 1) & 1); + + value -= ((byte >> 2) & 1) + ((byte >> 3) & 1); + + /* + * Add |kPrime| if |value| underflowed. See |reduce_once| for a + * discussion on why the value barrier is omitted. While this + * could have been written reduce_once(value + kPrime), this is + * one extra addition and small range of |value| tempts some + * versions of Clang to emit a branch. + */ + mask = 0u - (value >> 15); + out->c[i] = ((value + kPrime) & mask) | (value & ~mask); + + byte >>= 4; + value = (byte & 1) + ((byte >> 1) & 1); + value -= ((byte >> 2) & 1) + ((byte >> 3) & 1); + /* See above. */ + mask = 0u - (value >> 15); + out->c[i + 1] = ((value + kPrime) & mask) | (value & ~mask); + } +} + +/* + * Generates a secret vector by using + * |scalar_centered_binomial_distribution_eta_2_with_prf|, using the given seed + * appending and incrementing |counter| for entry of the vector. + */ +static void +vector_generate_secret_eta_2(vector *out, uint8_t *counter, + const uint8_t seed[32]) +{ + uint8_t input[33]; + int i; + + memcpy(input, seed, 32); + for (i = 0; i < RANK768; i++) { + input[32] = (*counter)++; + scalar_centered_binomial_distribution_eta_2_with_prf(&out->v[i], + input); + } +} + +/* Expands the matrix of a seed for key generation and for encaps-CPA. */ +static void +matrix_expand(matrix *out, const uint8_t rho[32]) +{ + uint8_t input[34]; + int i, j; + + memcpy(input, rho, 32); + for (i = 0; i < RANK768; i++) { + for (j = 0; j < RANK768; j++) { + sha3_ctx keccak_ctx; + + input[32] = i; + input[33] = j; + shake128_init(&keccak_ctx); + shake_update(&keccak_ctx, input, sizeof(input)); + shake_xof(&keccak_ctx); + scalar_from_keccak_vartime(&out->v[i][j], &keccak_ctx); + } + } +} + +static const uint8_t kMasks[8] = {0x01, 0x03, 0x07, 0x0f, + 0x1f, 0x3f, 0x7f, 0xff}; + +static void +scalar_encode(uint8_t *out, const scalar *s, int bits) +{ + uint8_t out_byte = 0; + int i, out_byte_bits = 0; + + assert(bits <= (int)sizeof(*s->c) * 8 && bits != 1); + for (i = 0; i < DEGREE; i++) { + uint16_t element = s->c[i]; + int element_bits_done = 0; + + while (element_bits_done < bits) { + int chunk_bits = bits - element_bits_done; + int out_bits_remaining = 8 - out_byte_bits; + + if (chunk_bits >= out_bits_remaining) { + chunk_bits = out_bits_remaining; + out_byte |= (element & + kMasks[chunk_bits - 1]) << out_byte_bits; + *out = out_byte; + out++; + out_byte_bits = 0; + out_byte = 0; + } else { + out_byte |= (element & + kMasks[chunk_bits - 1]) << out_byte_bits; + out_byte_bits += chunk_bits; + } + + element_bits_done += chunk_bits; + element >>= chunk_bits; + } + } + + if (out_byte_bits > 0) { + *out = out_byte; + } +} + +/* scalar_encode_1 is |scalar_encode| specialised for |bits| == 1. */ +static void +scalar_encode_1(uint8_t out[32], const scalar *s) +{ + int i, j; + + for (i = 0; i < DEGREE; i += 8) { + uint8_t out_byte = 0; + + for (j = 0; j < 8; j++) { + out_byte |= (s->c[i + j] & 1) << j; + } + *out = out_byte; + out++; + } +} + +/* + * Encodes an entire vector into 32*|RANK768|*|bits| bytes. Note that since 256 + * (DEGREE) is divisible by 8, the individual vector entries will always fill a + * whole number of bytes, so we do not need to worry about bit packing here. + */ +static void +vector_encode(uint8_t *out, const vector *a, int bits) +{ + int i; + + for (i = 0; i < RANK768; i++) { + scalar_encode(out + i * bits * DEGREE / 8, &a->v[i], bits); + } +} + +/* + * scalar_decode parses |DEGREE * bits| bits from |in| into |DEGREE| values in + * |out|. It returns one on success and zero if any parsed value is >= + * |kPrime|. + */ +static int +scalar_decode(scalar *out, const uint8_t *in, int bits) +{ + uint8_t in_byte = 0; + int i, in_byte_bits_left = 0; + + assert(bits <= (int)sizeof(*out->c) * 8 && bits != 1); + + for (i = 0; i < DEGREE; i++) { + uint16_t element = 0; + int element_bits_done = 0; + + while (element_bits_done < bits) { + int chunk_bits = bits - element_bits_done; + + if (in_byte_bits_left == 0) { + in_byte = *in; + in++; + in_byte_bits_left = 8; + } + + if (chunk_bits > in_byte_bits_left) { + chunk_bits = in_byte_bits_left; + } + + element |= (in_byte & kMasks[chunk_bits - 1]) << + element_bits_done; + in_byte_bits_left -= chunk_bits; + in_byte >>= chunk_bits; + + element_bits_done += chunk_bits; + } + + if (element >= kPrime) { + return 0; + } + out->c[i] = element; + } + + return 1; +} + +/* scalar_decode_1 is |scalar_decode| specialised for |bits| == 1. */ +static void +scalar_decode_1(scalar *out, const uint8_t in[32]) +{ + int i, j; + + for (i = 0; i < DEGREE; i += 8) { + uint8_t in_byte = *in; + + in++; + for (j = 0; j < 8; j++) { + out->c[i + j] = in_byte & 1; + in_byte >>= 1; + } + } +} + +/* + * Decodes 32*|RANK768|*|bits| bytes from |in| into |out|. It returns one on + * success or zero if any parsed value is >= |kPrime|. + */ +static int +vector_decode(vector *out, const uint8_t *in, int bits) +{ + int i; + + for (i = 0; i < RANK768; i++) { + if (!scalar_decode(&out->v[i], in + i * bits * DEGREE / 8, + bits)) { + return 0; + } + } + return 1; +} + +/* + * Compresses (lossily) an input |x| mod 3329 into |bits| many bits by grouping + * numbers close to each other together. The formula used is + * round(2^|bits|/kPrime*x) mod 2^|bits|. + * Uses Barrett reduction to achieve constant time. Since we need both the + * remainder (for rounding) and the quotient (as the result), we cannot use + * |reduce| here, but need to do the Barrett reduction directly. + */ +static uint16_t +compress(uint16_t x, int bits) +{ + uint32_t shifted = (uint32_t)x << bits; + uint64_t product = (uint64_t)shifted * kBarrettMultiplier; + uint32_t quotient = (uint32_t)(product >> kBarrettShift); + uint32_t remainder = shifted - quotient * kPrime; + + /* + * Adjust the quotient to round correctly: + * 0 <= remainder <= kHalfPrime round to 0 + * kHalfPrime < remainder <= kPrime + kHalfPrime round to 1 + * kPrime + kHalfPrime < remainder < 2 * kPrime round to 2 + */ + assert(remainder < 2u * kPrime); + quotient += 1 & constant_time_lt(kHalfPrime, remainder); + quotient += 1 & constant_time_lt(kPrime + kHalfPrime, remainder); + return quotient & ((1 << bits) - 1); +} + +/* + * Decompresses |x| by using an equi-distant representative. The formula is + * round(kPrime/2^|bits|*x). Note that 2^|bits| being the divisor allows us to + * implement this logic using only bit operations. + */ +static uint16_t +decompress(uint16_t x, int bits) +{ + uint32_t product = (uint32_t)x * kPrime; + uint32_t power = 1 << bits; + /* This is |product| % power, since |power| is a power of 2. */ + uint32_t remainder = product & (power - 1); + /* This is |product| / power, since |power| is a power of 2. */ + uint32_t lower = product >> bits; + + /* + * The rounding logic works since the first half of numbers mod |power| have a + * 0 as first bit, and the second half has a 1 as first bit, since |power| is + * a power of 2. As a 12 bit number, |remainder| is always positive, so we + * will shift in 0s for a right shift. + */ + return lower + (remainder >> (bits - 1)); +} + +static void +scalar_compress(scalar *s, int bits) +{ + int i; + + for (i = 0; i < DEGREE; i++) { + s->c[i] = compress(s->c[i], bits); + } +} + +static void +scalar_decompress(scalar *s, int bits) +{ + int i; + + for (i = 0; i < DEGREE; i++) { + s->c[i] = decompress(s->c[i], bits); + } +} + +static void +vector_compress(vector *a, int bits) +{ + int i; + + for (i = 0; i < RANK768; i++) { + scalar_compress(&a->v[i], bits); + } +} + +static void +vector_decompress(vector *a, int bits) +{ + int i; + + for (i = 0; i < RANK768; i++) { + scalar_decompress(&a->v[i], bits); + } +} + +struct public_key { + vector t; + uint8_t rho[32]; + uint8_t public_key_hash[32]; + matrix m; +}; + +static struct public_key * +public_key_768_from_external(const struct MLKEM768_public_key *external) +{ + return (struct public_key *)external; +} + +struct private_key { + struct public_key pub; + vector s; + uint8_t fo_failure_secret[32]; +}; + +static struct private_key * +private_key_768_from_external(const struct MLKEM768_private_key *external) +{ + return (struct private_key *)external; +} + +/* + * Calls |MLKEM768_generate_key_external_entropy| with random bytes from + * |RAND_bytes|. + */ +void +MLKEM768_generate_key(uint8_t out_encoded_public_key[MLKEM768_PUBLIC_KEY_BYTES], + uint8_t optional_out_seed[MLKEM_SEED_BYTES], + struct MLKEM768_private_key *out_private_key) +{ + uint8_t entropy_buf[MLKEM_SEED_BYTES]; + uint8_t *entropy = optional_out_seed != NULL ? optional_out_seed : + entropy_buf; + + arc4random_buf(entropy, MLKEM_SEED_BYTES); + MLKEM768_generate_key_external_entropy(out_encoded_public_key, + out_private_key, entropy); +} +LCRYPTO_ALIAS(MLKEM768_generate_key); + +int +MLKEM768_private_key_from_seed(struct MLKEM768_private_key *out_private_key, + const uint8_t *seed, size_t seed_len) +{ + uint8_t public_key_bytes[MLKEM768_PUBLIC_KEY_BYTES]; + + if (seed_len != MLKEM_SEED_BYTES) { + return 0; + } + MLKEM768_generate_key_external_entropy(public_key_bytes, + out_private_key, seed); + + return 1; +} +LCRYPTO_ALIAS(MLKEM768_private_key_from_seed); + +static int +mlkem_marshal_public_key(CBB *out, const struct public_key *pub) +{ + uint8_t *vector_output; + + if (!CBB_add_space(out, &vector_output, kEncodedVectorSize)) { + return 0; + } + vector_encode(vector_output, &pub->t, kLog2Prime); + if (!CBB_add_bytes(out, pub->rho, sizeof(pub->rho))) { + return 0; + } + return 1; +} + +void +MLKEM768_generate_key_external_entropy( + uint8_t out_encoded_public_key[MLKEM768_PUBLIC_KEY_BYTES], + struct MLKEM768_private_key *out_private_key, + const uint8_t entropy[MLKEM_SEED_BYTES]) +{ + struct private_key *priv = private_key_768_from_external( + out_private_key); + uint8_t augmented_seed[33]; + uint8_t *rho, *sigma; + uint8_t counter = 0; + uint8_t hashed[64]; + vector error; + CBB cbb; + + memcpy(augmented_seed, entropy, 32); + augmented_seed[32] = RANK768; + hash_g(hashed, augmented_seed, 33); + rho = hashed; + sigma = hashed + 32; + memcpy(priv->pub.rho, hashed, sizeof(priv->pub.rho)); + matrix_expand(&priv->pub.m, rho); + vector_generate_secret_eta_2(&priv->s, &counter, sigma); + vector_ntt(&priv->s); + vector_generate_secret_eta_2(&error, &counter, sigma); + vector_ntt(&error); + matrix_mult_transpose(&priv->pub.t, &priv->pub.m, &priv->s); + vector_add(&priv->pub.t, &error); + + /* XXX - error checking */ + CBB_init_fixed(&cbb, out_encoded_public_key, MLKEM768_PUBLIC_KEY_BYTES); + if (!mlkem_marshal_public_key(&cbb, &priv->pub)) { + abort(); + } + CBB_cleanup(&cbb); + + hash_h(priv->pub.public_key_hash, out_encoded_public_key, + MLKEM768_PUBLIC_KEY_BYTES); + memcpy(priv->fo_failure_secret, entropy + 32, 32); +} + +void +MLKEM768_public_from_private(struct MLKEM768_public_key *out_public_key, + const struct MLKEM768_private_key *private_key) +{ + struct public_key *const pub = public_key_768_from_external( + out_public_key); + const struct private_key *const priv = private_key_768_from_external( + private_key); + + *pub = priv->pub; +} +LCRYPTO_ALIAS(MLKEM768_public_from_private); + +/* + * Encrypts a message with given randomness to the ciphertext in |out|. Without + * applying the Fujisaki-Okamoto transform this would not result in a CCA secure + * scheme, since lattice schemes are vulnerable to decryption failure oracles. + */ +static void +encrypt_cpa(uint8_t out[MLKEM768_CIPHERTEXT_BYTES], + const struct public_key *pub, const uint8_t message[32], + const uint8_t randomness[32]) +{ + scalar expanded_message, scalar_error; + vector secret, error, u; + uint8_t counter = 0; + uint8_t input[33]; + scalar v; + + vector_generate_secret_eta_2(&secret, &counter, randomness); + vector_ntt(&secret); + vector_generate_secret_eta_2(&error, &counter, randomness); + memcpy(input, randomness, 32); + input[32] = counter; + scalar_centered_binomial_distribution_eta_2_with_prf(&scalar_error, + input); + matrix_mult(&u, &pub->m, &secret); + vector_inverse_ntt(&u); + vector_add(&u, &error); + scalar_inner_product(&v, &pub->t, &secret); + scalar_inverse_ntt(&v); + scalar_add(&v, &scalar_error); + scalar_decode_1(&expanded_message, message); + scalar_decompress(&expanded_message, 1); + scalar_add(&v, &expanded_message); + vector_compress(&u, kDU768); + vector_encode(out, &u, kDU768); + scalar_compress(&v, kDV768); + scalar_encode(out + kCompressedVectorSize, &v, kDV768); +} + +/* Calls MLKEM768_encap_external_entropy| with random bytes */ +void +MLKEM768_encap(uint8_t out_ciphertext[MLKEM768_CIPHERTEXT_BYTES], + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const struct MLKEM768_public_key *public_key) +{ + uint8_t entropy[MLKEM_ENCAP_ENTROPY]; + + arc4random_buf(entropy, MLKEM_ENCAP_ENTROPY); + MLKEM768_encap_external_entropy(out_ciphertext, out_shared_secret, + public_key, entropy); +} +LCRYPTO_ALIAS(MLKEM768_encap); + +/* See section 6.2 of the spec. */ +void +MLKEM768_encap_external_entropy( + uint8_t out_ciphertext[MLKEM768_CIPHERTEXT_BYTES], + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const struct MLKEM768_public_key *public_key, + const uint8_t entropy[MLKEM_ENCAP_ENTROPY]) +{ + const struct public_key *pub = public_key_768_from_external(public_key); + uint8_t key_and_randomness[64]; + uint8_t input[64]; + + memcpy(input, entropy, MLKEM_ENCAP_ENTROPY); + memcpy(input + MLKEM_ENCAP_ENTROPY, pub->public_key_hash, + sizeof(input) - MLKEM_ENCAP_ENTROPY); + hash_g(key_and_randomness, input, sizeof(input)); + encrypt_cpa(out_ciphertext, pub, entropy, key_and_randomness + 32); + memcpy(out_shared_secret, key_and_randomness, 32); +} + +static void +decrypt_cpa(uint8_t out[32], const struct private_key *priv, + const uint8_t ciphertext[MLKEM768_CIPHERTEXT_BYTES]) +{ + scalar mask, v; + vector u; + + vector_decode(&u, ciphertext, kDU768); + vector_decompress(&u, kDU768); + vector_ntt(&u); + scalar_decode(&v, ciphertext + kCompressedVectorSize, kDV768); + scalar_decompress(&v, kDV768); + scalar_inner_product(&mask, &priv->s, &u); + scalar_inverse_ntt(&mask); + scalar_sub(&v, &mask); + scalar_compress(&v, 1); + scalar_encode_1(out, &v); +} + +/* See section 6.3 */ +int +MLKEM768_decap(uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const uint8_t *ciphertext, size_t ciphertext_len, + const struct MLKEM768_private_key *private_key) +{ + const struct private_key *priv = private_key_768_from_external( + private_key); + uint8_t expected_ciphertext[MLKEM768_CIPHERTEXT_BYTES]; + uint8_t key_and_randomness[64]; + uint8_t failure_key[32]; + uint8_t decrypted[64]; + uint8_t mask; + int i; + + if (ciphertext_len != MLKEM768_CIPHERTEXT_BYTES) { + arc4random_buf(out_shared_secret, MLKEM_SHARED_SECRET_BYTES); + return 0; + } + + decrypt_cpa(decrypted, priv, ciphertext); + memcpy(decrypted + 32, priv->pub.public_key_hash, + sizeof(decrypted) - 32); + hash_g(key_and_randomness, decrypted, sizeof(decrypted)); + encrypt_cpa(expected_ciphertext, &priv->pub, decrypted, + key_and_randomness + 32); + kdf(failure_key, priv->fo_failure_secret, ciphertext, ciphertext_len); + mask = constant_time_eq_int_8(memcmp(ciphertext, expected_ciphertext, + sizeof(expected_ciphertext)), 0); + for (i = 0; i < MLKEM_SHARED_SECRET_BYTES; i++) { + out_shared_secret[i] = constant_time_select_8(mask, + key_and_randomness[i], failure_key[i]); + } + + return 1; +} +LCRYPTO_ALIAS(MLKEM768_decap); + +int +MLKEM768_marshal_public_key(CBB *out, + const struct MLKEM768_public_key *public_key) +{ + return mlkem_marshal_public_key(out, + public_key_768_from_external(public_key)); +} +LCRYPTO_ALIAS(MLKEM768_marshal_public_key); + +/* + * mlkem_parse_public_key_no_hash parses |in| into |pub| but doesn't calculate + * the value of |pub->public_key_hash|. + */ +static int +mlkem_parse_public_key_no_hash(struct public_key *pub, CBS *in) +{ + CBS t_bytes; + + if (!CBS_get_bytes(in, &t_bytes, kEncodedVectorSize) || + !vector_decode(&pub->t, CBS_data(&t_bytes), kLog2Prime)) { + return 0; + } + memcpy(pub->rho, CBS_data(in), sizeof(pub->rho)); + if (!CBS_skip(in, sizeof(pub->rho))) + return 0; + matrix_expand(&pub->m, pub->rho); + return 1; +} + +int +MLKEM768_parse_public_key(struct MLKEM768_public_key *public_key, CBS *in) +{ + struct public_key *pub = public_key_768_from_external(public_key); + CBS orig_in = *in; + + if (!mlkem_parse_public_key_no_hash(pub, in) || + CBS_len(in) != 0) { + return 0; + } + hash_h(pub->public_key_hash, CBS_data(&orig_in), CBS_len(&orig_in)); + return 1; +} +LCRYPTO_ALIAS(MLKEM768_parse_public_key); + +int +MLKEM768_marshal_private_key(CBB *out, + const struct MLKEM768_private_key *private_key) +{ + const struct private_key *const priv = private_key_768_from_external( + private_key); + uint8_t *s_output; + + if (!CBB_add_space(out, &s_output, kEncodedVectorSize)) { + return 0; + } + vector_encode(s_output, &priv->s, kLog2Prime); + if (!mlkem_marshal_public_key(out, &priv->pub) || + !CBB_add_bytes(out, priv->pub.public_key_hash, + sizeof(priv->pub.public_key_hash)) || + !CBB_add_bytes(out, priv->fo_failure_secret, + sizeof(priv->fo_failure_secret))) { + return 0; + } + return 1; +} + +int +MLKEM768_parse_private_key(struct MLKEM768_private_key *out_private_key, + CBS *in) +{ + struct private_key *const priv = private_key_768_from_external( + out_private_key); + CBS s_bytes; + + if (!CBS_get_bytes(in, &s_bytes, kEncodedVectorSize) || + !vector_decode(&priv->s, CBS_data(&s_bytes), kLog2Prime) || + !mlkem_parse_public_key_no_hash(&priv->pub, in)) { + return 0; + } + memcpy(priv->pub.public_key_hash, CBS_data(in), + sizeof(priv->pub.public_key_hash)); + if (!CBS_skip(in, sizeof(priv->pub.public_key_hash))) + return 0; + memcpy(priv->fo_failure_secret, CBS_data(in), + sizeof(priv->fo_failure_secret)); + if (!CBS_skip(in, sizeof(priv->fo_failure_secret))) + return 0; + if (CBS_len(in) != 0) + return 0; + + return 1; +} +LCRYPTO_ALIAS(MLKEM768_parse_private_key); diff --git a/lib/libcrypto/mlkem/mlkem_internal.h b/lib/libcrypto/mlkem/mlkem_internal.h new file mode 100644 index 000000000..d3f325932 --- /dev/null +++ b/lib/libcrypto/mlkem/mlkem_internal.h @@ -0,0 +1,121 @@ +/* $OpenBSD: mlkem_internal.h,v 1.4 2024/12/19 23:52:26 tb Exp $ */ +/* + * Copyright (c) 2023, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef OPENSSL_HEADER_CRYPTO_MLKEM_INTERNAL_H +#define OPENSSL_HEADER_CRYPTO_MLKEM_INTERNAL_H + +#include "bytestring.h" +#include "mlkem.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +__BEGIN_HIDDEN_DECLS + +/* + * MLKEM_ENCAP_ENTROPY is the number of bytes of uniformly random entropy + * necessary to encapsulate a secret. The entropy will be leaked to the + * decapsulating party. + */ +#define MLKEM_ENCAP_ENTROPY 32 + +/* + * MLKEM768_generate_key_external_entropy is a deterministic function to create a + * pair of ML-KEM 768 keys, using the supplied entropy. The entropy needs to be + * uniformly random generated. This function is should only be used for tests, + * regular callers should use the non-deterministic |MLKEM_generate_key| + * directly. + */ +void MLKEM768_generate_key_external_entropy( + uint8_t out_encoded_public_key[MLKEM768_PUBLIC_KEY_BYTES], + struct MLKEM768_private_key *out_private_key, + const uint8_t entropy[MLKEM_SEED_BYTES]); + +/* + * MLKEM768_PRIVATE_KEY_BYTES is the length of the data produced by + * |MLKEM768_marshal_private_key|. + */ +#define MLKEM768_PRIVATE_KEY_BYTES 2400 + +/* + * MLKEM768_marshal_private_key serializes |private_key| to |out| in the standard + * format for ML-KEM private keys. It returns one on success or zero on + * allocation error. + */ +int MLKEM768_marshal_private_key(CBB *out, + const struct MLKEM768_private_key *private_key); + +/* + * MLKEM_encap_external_entropy behaves like |MLKEM_encap|, but uses + * |MLKEM_ENCAP_ENTROPY| bytes of |entropy| for randomization. The decapsulating + * side will be able to recover |entropy| in full. This function should only be + * used for tests, regular callers should use the non-deterministic + * |MLKEM_encap| directly. + */ +void MLKEM768_encap_external_entropy( + uint8_t out_ciphertext[MLKEM768_CIPHERTEXT_BYTES], + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const struct MLKEM768_public_key *public_key, + const uint8_t entropy[MLKEM_ENCAP_ENTROPY]); + +/* + * MLKEM1024_generate_key_external_entropy is a deterministic function to create a + * pair of ML-KEM 1024 keys, using the supplied entropy. The entropy needs to be + * uniformly random generated. This function is should only be used for tests, + * regular callers should use the non-deterministic |MLKEM_generate_key| + * directly. + */ +void MLKEM1024_generate_key_external_entropy( + uint8_t out_encoded_public_key[MLKEM1024_PUBLIC_KEY_BYTES], + struct MLKEM1024_private_key *out_private_key, + const uint8_t entropy[MLKEM_SEED_BYTES]); + +/* + * MLKEM1024_PRIVATE_KEY_BYTES is the length of the data produced by + * |MLKEM1024_marshal_private_key|. + */ +#define MLKEM1024_PRIVATE_KEY_BYTES 3168 + +/* + * MLKEM1024_marshal_private_key serializes |private_key| to |out| in the + * standard format for ML-KEM private keys. It returns one on success or zero on + * allocation error. + */ +int MLKEM1024_marshal_private_key(CBB *out, + const struct MLKEM1024_private_key *private_key); + +/* + * MLKEM_encap_external_entropy behaves like |MLKEM_encap|, but uses + * |MLKEM_ENCAP_ENTROPY| bytes of |entropy| for randomization. The decapsulating + * side will be able to recover |entropy| in full. This function should only be + * used for tests, regular callers should use the non-deterministic + * |MLKEM_encap| directly. + */ +void MLKEM1024_encap_external_entropy( + uint8_t out_ciphertext[MLKEM1024_CIPHERTEXT_BYTES], + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const struct MLKEM1024_public_key *public_key, + const uint8_t entropy[MLKEM_ENCAP_ENTROPY]); + +__END_HIDDEN_DECLS + +#if defined(__cplusplus) +} +#endif + +#endif /* OPENSSL_HEADER_CRYPTO_MLKEM_INTERNAL_H */ diff --git a/lib/libcrypto/o_fips.c b/lib/libcrypto/o_fips.c deleted file mode 100644 index 3ed10d404..000000000 --- a/lib/libcrypto/o_fips.c +++ /dev/null @@ -1,77 +0,0 @@ -/* $OpenBSD: o_fips.c,v 1.9 2024/04/17 22:43:42 tb Exp $ */ -/* Written by Stephen Henson (steve@openssl.org) for the OpenSSL - * project 2011. - */ -/* ==================================================================== - * Copyright (c) 2011 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ - -#include -#include - -int -FIPS_mode(void) -{ - return 0; -} -LCRYPTO_ALIAS(FIPS_mode); - -int -FIPS_mode_set(int r) -{ - if (r == 0) - return 1; - CRYPTOerror(CRYPTO_R_FIPS_MODE_NOT_SUPPORTED); - return 0; -} -LCRYPTO_ALIAS(FIPS_mode_set); diff --git a/lib/libcrypto/perlasm/x86asm.pl b/lib/libcrypto/perlasm/x86asm.pl index e039382e0..7e7270768 100644 --- a/lib/libcrypto/perlasm/x86asm.pl +++ b/lib/libcrypto/perlasm/x86asm.pl @@ -1,7 +1,7 @@ #!/usr/bin/env perl # require 'x86asm.pl'; -# &asm_init(,"des-586.pl"[,$i386only]); +# &asm_init(,"aes-586.pl"[,$x86only]); # &function_begin("foo"); # ... # &function_end("foo"); diff --git a/lib/libcrypto/pkcs12/p12_kiss.c b/lib/libcrypto/pkcs12/p12_kiss.c index 48bbd137c..e4de2eb61 100644 --- a/lib/libcrypto/pkcs12/p12_kiss.c +++ b/lib/libcrypto/pkcs12/p12_kiss.c @@ -1,4 +1,4 @@ -/* $OpenBSD: p12_kiss.c,v 1.27 2023/02/16 08:38:17 tb Exp $ */ +/* $OpenBSD: p12_kiss.c,v 1.28 2025/01/06 23:35:25 tb Exp $ */ /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project 1999. */ @@ -77,7 +77,7 @@ static int parse_bag( PKCS12_SAFEBAG *bag, const char *pass, int passlen, /* Parse and decrypt a PKCS#12 structure returning user key, user cert * and other (CA) certs. Note either ca should be NULL, *ca should be NULL, * or it should point to a valid STACK structure. pkey and cert can be - * passed unitialised. + * passed uninitialised. */ int diff --git a/lib/libcrypto/pkcs7/pk7_doit.c b/lib/libcrypto/pkcs7/pk7_doit.c index aa7c1958e..807d61f26 100644 --- a/lib/libcrypto/pkcs7/pk7_doit.c +++ b/lib/libcrypto/pkcs7/pk7_doit.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pk7_doit.c,v 1.56 2024/02/18 15:45:42 tb Exp $ */ +/* $OpenBSD: pk7_doit.c,v 1.57 2024/11/30 10:01:31 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -813,6 +813,7 @@ PKCS7_dataFinal(PKCS7 *p7, BIO *bio) if (!EVP_SignFinal(&ctx_tmp, abuf, &abuflen, si->pkey)) { PKCS7error(ERR_R_EVP_LIB); + free(abuf); goto err; } ASN1_STRING_set0(si->enc_digest, abuf, abuflen); diff --git a/lib/libcrypto/pkcs7/pk7_lib.c b/lib/libcrypto/pkcs7/pk7_lib.c index 59f348e23..a1c7d61cc 100644 --- a/lib/libcrypto/pkcs7/pk7_lib.c +++ b/lib/libcrypto/pkcs7/pk7_lib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pk7_lib.c,v 1.28 2023/11/09 19:08:07 tb Exp $ */ +/* $OpenBSD: pk7_lib.c,v 1.30 2024/12/06 07:10:20 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -70,13 +70,17 @@ long PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg) { int nid; - long ret; + long ret = 0; nid = OBJ_obj2nid(p7->type); switch (cmd) { case PKCS7_OP_SET_DETACHED_SIGNATURE: if (nid == NID_pkcs7_signed) { + if (p7->d.sign == NULL) { + PKCS7error(PKCS7_R_NO_CONTENT); + break; + } ret = p7->detached = (int)larg; if (ret && PKCS7_type_is_data(p7->d.sign->contents)) { ASN1_OCTET_STRING *os; @@ -91,7 +95,8 @@ PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg) break; case PKCS7_OP_GET_DETACHED_SIGNATURE: if (nid == NID_pkcs7_signed) { - if (!p7->d.sign || !p7->d.sign->contents->d.ptr) + if (p7->d.sign == NULL || + p7->d.sign->contents->d.ptr == NULL) ret = 1; else ret = 0; diff --git a/lib/libcrypto/pkcs7/pkcs7.h b/lib/libcrypto/pkcs7/pkcs7.h index 00a094f5e..6fd5adf45 100644 --- a/lib/libcrypto/pkcs7/pkcs7.h +++ b/lib/libcrypto/pkcs7/pkcs7.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pkcs7.h,v 1.21 2023/04/25 18:04:03 tb Exp $ */ +/* $OpenBSD: pkcs7.h,v 1.22 2024/10/23 01:57:19 jsg Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -216,8 +216,6 @@ DECLARE_PKCS12_STACK_OF(PKCS7) #define PKCS7_type_is_encrypted(a) \ (OBJ_obj2nid((a)->type) == NID_pkcs7_encrypted) -#define PKCS7_type_is_digest(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_digest) - #define PKCS7_set_detached(p,v) \ PKCS7_ctrl(p,PKCS7_OP_SET_DETACHED_SIGNATURE,v,NULL) #define PKCS7_get_detached(p) \ diff --git a/lib/libcrypto/ppccap.c b/lib/libcrypto/ppccap.c deleted file mode 100644 index 8c4565f57..000000000 --- a/lib/libcrypto/ppccap.c +++ /dev/null @@ -1,20 +0,0 @@ -/* $OpenBSD: ppccap.c,v 1.7 2023/01/17 15:04:27 miod Exp $ */ - -#include -#include -#include -#include - -#include -#include - -#ifdef OPENSSL_BN_ASM_MONT -extern int bn_mul_mont_int(BN_ULONG *, const BN_ULONG *, const BN_ULONG *, - const BN_ULONG *, const BN_ULONG *, int); -int -bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, - const BN_ULONG *np, const BN_ULONG *n0, int num) -{ - return bn_mul_mont_int(rp, ap, bp, np, n0, num); -} -#endif diff --git a/lib/libcrypto/rsa/rsa_ameth.c b/lib/libcrypto/rsa/rsa_ameth.c index eb5d599bf..5a8752228 100644 --- a/lib/libcrypto/rsa/rsa_ameth.c +++ b/lib/libcrypto/rsa/rsa_ameth.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rsa_ameth.c,v 1.60 2024/08/29 16:58:19 tb Exp $ */ +/* $OpenBSD: rsa_ameth.c,v 1.62 2024/11/02 07:11:14 tb Exp $ */ /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project 2006. */ @@ -56,20 +56,26 @@ * */ +#include #include +#include #include -#include +#include +#include #include #include #include +#include +#include +#include #include +#include #include #include "asn1_local.h" #include "bn_local.h" -#include "cryptlib.h" #include "evp_local.h" #include "rsa_local.h" #include "x509_local.h" diff --git a/lib/libcrypto/rsa/rsa_local.h b/lib/libcrypto/rsa/rsa_local.h index d537ab9c7..3f88b952a 100644 --- a/lib/libcrypto/rsa/rsa_local.h +++ b/lib/libcrypto/rsa/rsa_local.h @@ -1,4 +1,4 @@ -/* $OpenBSD: rsa_local.h,v 1.8 2024/01/01 15:43:02 tb Exp $ */ +/* $OpenBSD: rsa_local.h,v 1.10 2025/01/05 15:39:12 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -81,9 +81,7 @@ struct rsa_meth_st { /* New sign and verify functions: some libraries don't allow arbitrary data * to be signed/verified: this allows them to be used. Note: for this to work * the RSA_public_decrypt() and RSA_private_encrypt() should *NOT* be used - * RSA_sign(), RSA_verify() should be used instead. Note: for backwards - * compatibility this functionality is only enabled if the RSA_FLAG_SIGN_VER - * option is set in 'flags'. + * RSA_sign(), RSA_verify() should be used instead. */ int (*rsa_sign)(int type, const unsigned char *m, unsigned int m_length, unsigned char *sigret, unsigned int *siglen, const RSA *rsa); @@ -98,9 +96,6 @@ struct rsa_meth_st { }; struct rsa_st { - /* The first parameter is used to pickup errors where - * this is passed instead of aEVP_PKEY, it is set to 0 */ - int pad; long version; const RSA_METHOD *meth; diff --git a/lib/libcrypto/rsa/rsa_sign.c b/lib/libcrypto/rsa/rsa_sign.c index 535676861..6edd20626 100644 --- a/lib/libcrypto/rsa/rsa_sign.c +++ b/lib/libcrypto/rsa/rsa_sign.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rsa_sign.c,v 1.36 2023/07/08 12:26:45 beck Exp $ */ +/* $OpenBSD: rsa_sign.c,v 1.37 2025/01/05 15:39:12 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -130,7 +130,7 @@ RSA_sign(int type, const unsigned char *m, unsigned int m_len, unsigned char *tmps = NULL; int encrypt_len, encoded_len = 0, ret = 0; - if ((rsa->flags & RSA_FLAG_SIGN_VER) && rsa->meth->rsa_sign != NULL) + if (rsa->meth->rsa_sign != NULL) return rsa->meth->rsa_sign(type, m, m_len, sigret, siglen, rsa); /* Compute the encoded digest. */ @@ -271,7 +271,7 @@ int RSA_verify(int dtype, const unsigned char *m, unsigned int m_len, const unsigned char *sigbuf, unsigned int siglen, RSA *rsa) { - if ((rsa->flags & RSA_FLAG_SIGN_VER) && rsa->meth->rsa_verify) + if (rsa->meth->rsa_verify != NULL) return rsa->meth->rsa_verify(dtype, m, m_len, sigbuf, siglen, rsa); diff --git a/lib/libcrypto/sha/asm/sha1-x86_64.pl b/lib/libcrypto/sha/asm/sha1-x86_64.pl deleted file mode 100755 index e080251df..000000000 --- a/lib/libcrypto/sha/asm/sha1-x86_64.pl +++ /dev/null @@ -1,1267 +0,0 @@ -#!/usr/bin/env perl -# -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. The module is, however, dual licensed under OpenSSL and -# CRYPTOGAMS licenses depending on where you obtain it. For further -# details see http://www.openssl.org/~appro/cryptogams/. -# ==================================================================== -# -# sha1_block procedure for x86_64. -# -# It was brought to my attention that on EM64T compiler-generated code -# was far behind 32-bit assembler implementation. This is unlike on -# Opteron where compiler-generated code was only 15% behind 32-bit -# assembler, which originally made it hard to motivate the effort. -# There was suggestion to mechanically translate 32-bit code, but I -# dismissed it, reasoning that x86_64 offers enough register bank -# capacity to fully utilize SHA-1 parallelism. Therefore this fresh -# implementation:-) However! While 64-bit code does perform better -# on Opteron, I failed to beat 32-bit assembler on EM64T core. Well, -# x86_64 does offer larger *addressable* bank, but out-of-order core -# reaches for even more registers through dynamic aliasing, and EM64T -# core must have managed to run-time optimize even 32-bit code just as -# good as 64-bit one. Performance improvement is summarized in the -# following table: -# -# gcc 3.4 32-bit asm cycles/byte -# Opteron +45% +20% 6.8 -# Xeon P4 +65% +0% 9.9 -# Core2 +60% +10% 7.0 - -# August 2009. -# -# The code was revised to minimize code size and to maximize -# "distance" between instructions producing input to 'lea' -# instruction and the 'lea' instruction itself, which is essential -# for Intel Atom core. - -# October 2010. -# -# Add SSSE3, Supplemental[!] SSE3, implementation. The idea behind it -# is to offload message schedule denoted by Wt in NIST specification, -# or Xupdate in OpenSSL source, to SIMD unit. See sha1-586.pl module -# for background and implementation details. The only difference from -# 32-bit code is that 64-bit code doesn't have to spill @X[] elements -# to free temporary registers. - -# April 2011. -# -# Add AVX code path. See sha1-586.pl for further information. - -###################################################################### -# Current performance is summarized in following table. Numbers are -# CPU clock cycles spent to process single byte (less is better). -# -# x86_64 SSSE3 AVX -# P4 9.8 - -# Opteron 6.6 - -# Core2 6.7 6.1/+10% - -# Atom 11.0 9.7/+13% - -# Westmere 7.1 5.6/+27% - -# Sandy Bridge 7.9 6.3/+25% 5.2/+51% - -$flavour = shift; -$output = shift; -if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } - -$win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or -die "can't locate x86_64-xlate.pl"; - -$avx=1 if (`$ENV{CC} -Wa,-v -c -o /dev/null -x assembler /dev/null 2>&1` - =~ /GNU assembler version ([2-9]\.[0-9]+)/ && - $1>=2.19); -$avx=1 if (!$avx && $win64 && ($flavour =~ /nasm/ || $ENV{ASM} =~ /nasm/) && - `nasm -v 2>&1` =~ /NASM version ([2-9]\.[0-9]+)/ && - $1>=2.09); -$avx=1 if (!$avx && $win64 && ($flavour =~ /masm/ || $ENV{ASM} =~ /ml64/) && - `ml64 2>&1` =~ /Version ([0-9]+)\./ && - $1>=10); - -open OUT,"| \"$^X\" $xlate $flavour $output"; -*STDOUT=*OUT; - -$ctx="%rdi"; # 1st arg -$inp="%rsi"; # 2nd arg -$num="%rdx"; # 3rd arg - -# reassign arguments in order to produce more compact code -$ctx="%r8"; -$inp="%r9"; -$num="%r10"; - -$t0="%eax"; -$t1="%ebx"; -$t2="%ecx"; -@xi=("%edx","%ebp"); -$A="%esi"; -$B="%edi"; -$C="%r11d"; -$D="%r12d"; -$E="%r13d"; - -@V=($A,$B,$C,$D,$E); - -sub BODY_00_19 { -my ($i,$a,$b,$c,$d,$e)=@_; -my $j=$i+1; -$code.=<<___ if ($i==0); - mov `4*$i`($inp),$xi[0] - bswap $xi[0] - mov $xi[0],`4*$i`(%rsp) -___ -$code.=<<___ if ($i<15); - mov $c,$t0 - mov `4*$j`($inp),$xi[1] - mov $a,$t2 - xor $d,$t0 - bswap $xi[1] - rol \$5,$t2 - lea 0x5a827999($xi[0],$e),$e - and $b,$t0 - mov $xi[1],`4*$j`(%rsp) - add $t2,$e - xor $d,$t0 - rol \$30,$b - add $t0,$e -___ -$code.=<<___ if ($i>=15); - mov `4*($j%16)`(%rsp),$xi[1] - mov $c,$t0 - mov $a,$t2 - xor `4*(($j+2)%16)`(%rsp),$xi[1] - xor $d,$t0 - rol \$5,$t2 - xor `4*(($j+8)%16)`(%rsp),$xi[1] - and $b,$t0 - lea 0x5a827999($xi[0],$e),$e - xor `4*(($j+13)%16)`(%rsp),$xi[1] - xor $d,$t0 - rol \$1,$xi[1] - add $t2,$e - rol \$30,$b - mov $xi[1],`4*($j%16)`(%rsp) - add $t0,$e -___ -unshift(@xi,pop(@xi)); -} - -sub BODY_20_39 { -my ($i,$a,$b,$c,$d,$e)=@_; -my $j=$i+1; -my $K=($i<40)?0x6ed9eba1:0xca62c1d6; -$code.=<<___ if ($i<79); - mov `4*($j%16)`(%rsp),$xi[1] - mov $c,$t0 - mov $a,$t2 - xor `4*(($j+2)%16)`(%rsp),$xi[1] - xor $b,$t0 - rol \$5,$t2 - lea $K($xi[0],$e),$e - xor `4*(($j+8)%16)`(%rsp),$xi[1] - xor $d,$t0 - add $t2,$e - xor `4*(($j+13)%16)`(%rsp),$xi[1] - rol \$30,$b - add $t0,$e - rol \$1,$xi[1] -___ -$code.=<<___ if ($i<76); - mov $xi[1],`4*($j%16)`(%rsp) -___ -$code.=<<___ if ($i==79); - mov $c,$t0 - mov $a,$t2 - xor $b,$t0 - lea $K($xi[0],$e),$e - rol \$5,$t2 - xor $d,$t0 - add $t2,$e - rol \$30,$b - add $t0,$e -___ -unshift(@xi,pop(@xi)); -} - -sub BODY_40_59 { -my ($i,$a,$b,$c,$d,$e)=@_; -my $j=$i+1; -$code.=<<___; - mov `4*($j%16)`(%rsp),$xi[1] - mov $c,$t0 - mov $c,$t1 - xor `4*(($j+2)%16)`(%rsp),$xi[1] - and $d,$t0 - mov $a,$t2 - xor `4*(($j+8)%16)`(%rsp),$xi[1] - xor $d,$t1 - lea 0x8f1bbcdc($xi[0],$e),$e - rol \$5,$t2 - xor `4*(($j+13)%16)`(%rsp),$xi[1] - add $t0,$e - and $b,$t1 - rol \$1,$xi[1] - add $t1,$e - rol \$30,$b - mov $xi[1],`4*($j%16)`(%rsp) - add $t2,$e -___ -unshift(@xi,pop(@xi)); -} - -$code.=<<___; -.text -.extern OPENSSL_ia32cap_P -.hidden OPENSSL_ia32cap_P - -.globl sha1_block_data_order -.type sha1_block_data_order,\@function,3 -.align 16 -sha1_block_data_order: - _CET_ENDBR - mov OPENSSL_ia32cap_P+0(%rip),%r9d - mov OPENSSL_ia32cap_P+4(%rip),%r8d - test \$IA32CAP_MASK1_SSSE3,%r8d # check SSSE3 bit - jz .Lialu -___ -$code.=<<___ if ($avx); - and \$IA32CAP_MASK1_AVX,%r8d # mask AVX bit - and \$IA32CAP_MASK0_INTEL,%r9d # mask "Intel CPU" bit - or %r9d,%r8d - cmp \$(IA32CAP_MASK0_INTEL | IA32CAP_MASK1_AVX),%r8d - je _avx_shortcut -___ -$code.=<<___; - jmp _ssse3_shortcut - -.align 16 -.Lialu: - push %rbx - push %rbp - push %r12 - push %r13 - mov %rsp,%r11 - mov %rdi,$ctx # reassigned argument - sub \$`8+16*4`,%rsp - mov %rsi,$inp # reassigned argument - and \$-64,%rsp - mov %rdx,$num # reassigned argument - mov %r11,`16*4`(%rsp) -.Lprologue: - - mov 0($ctx),$A - mov 4($ctx),$B - mov 8($ctx),$C - mov 12($ctx),$D - mov 16($ctx),$E - jmp .Lloop - -.align 16 -.Lloop: -___ -for($i=0;$i<20;$i++) { &BODY_00_19($i,@V); unshift(@V,pop(@V)); } -for(;$i<40;$i++) { &BODY_20_39($i,@V); unshift(@V,pop(@V)); } -for(;$i<60;$i++) { &BODY_40_59($i,@V); unshift(@V,pop(@V)); } -for(;$i<80;$i++) { &BODY_20_39($i,@V); unshift(@V,pop(@V)); } -$code.=<<___; - add 0($ctx),$A - add 4($ctx),$B - add 8($ctx),$C - add 12($ctx),$D - add 16($ctx),$E - mov $A,0($ctx) - mov $B,4($ctx) - mov $C,8($ctx) - mov $D,12($ctx) - mov $E,16($ctx) - - sub \$1,$num - lea `16*4`($inp),$inp - jnz .Lloop - - mov `16*4`(%rsp),%rsi - mov (%rsi),%r13 - mov 8(%rsi),%r12 - mov 16(%rsi),%rbp - mov 24(%rsi),%rbx - lea 32(%rsi),%rsp -.Lepilogue: - ret -.size sha1_block_data_order,.-sha1_block_data_order -___ -{{{ -my $Xi=4; -my @X=map("%xmm$_",(4..7,0..3)); -my @Tx=map("%xmm$_",(8..10)); -my @V=($A,$B,$C,$D,$E)=("%eax","%ebx","%ecx","%edx","%ebp"); # size optimization -my @T=("%esi","%edi"); -my $j=0; -my $K_XX_XX="%r11"; - -my $_rol=sub { &rol(@_) }; -my $_ror=sub { &ror(@_) }; - -$code.=<<___; -.type sha1_block_data_order_ssse3,\@function,3 -.align 16 -sha1_block_data_order_ssse3: -_ssse3_shortcut: - _CET_ENDBR - push %rbx - push %rbp - push %r12 - lea `-64-($win64?5*16:0)`(%rsp),%rsp -___ -$code.=<<___ if ($win64); - movaps %xmm6,64+0(%rsp) - movaps %xmm7,64+16(%rsp) - movaps %xmm8,64+32(%rsp) - movaps %xmm9,64+48(%rsp) - movaps %xmm10,64+64(%rsp) -.Lprologue_ssse3: -___ -$code.=<<___; - mov %rdi,$ctx # reassigned argument - mov %rsi,$inp # reassigned argument - mov %rdx,$num # reassigned argument - - shl \$6,$num - add $inp,$num - lea K_XX_XX(%rip),$K_XX_XX - - mov 0($ctx),$A # load context - mov 4($ctx),$B - mov 8($ctx),$C - mov 12($ctx),$D - mov $B,@T[0] # magic seed - mov 16($ctx),$E - - movdqa 64($K_XX_XX),@X[2] # pbswap mask - movdqa 0($K_XX_XX),@Tx[1] # K_00_19 - movdqu 0($inp),@X[-4&7] # load input to %xmm[0-3] - movdqu 16($inp),@X[-3&7] - movdqu 32($inp),@X[-2&7] - movdqu 48($inp),@X[-1&7] - pshufb @X[2],@X[-4&7] # byte swap - add \$64,$inp - pshufb @X[2],@X[-3&7] - pshufb @X[2],@X[-2&7] - pshufb @X[2],@X[-1&7] - paddd @Tx[1],@X[-4&7] # add K_00_19 - paddd @Tx[1],@X[-3&7] - paddd @Tx[1],@X[-2&7] - movdqa @X[-4&7],0(%rsp) # X[]+K xfer to IALU - psubd @Tx[1],@X[-4&7] # restore X[] - movdqa @X[-3&7],16(%rsp) - psubd @Tx[1],@X[-3&7] - movdqa @X[-2&7],32(%rsp) - psubd @Tx[1],@X[-2&7] - jmp .Loop_ssse3 -___ - -sub AUTOLOAD() # thunk [simplified] 32-bit style perlasm -{ my $opcode = $AUTOLOAD; $opcode =~ s/.*:://; - my $arg = pop; - $arg = "\$$arg" if ($arg*1 eq $arg); - $code .= "\t$opcode\t".join(',',$arg,reverse @_)."\n"; -} - -sub Xupdate_ssse3_16_31() # recall that $Xi starts with 4 -{ use integer; - my $body = shift; - my @insns = (&$body,&$body,&$body,&$body); # 40 instructions - my ($a,$b,$c,$d,$e); - - &movdqa (@X[0],@X[-3&7]); - eval(shift(@insns)); - eval(shift(@insns)); - &movdqa (@Tx[0],@X[-1&7]); - &palignr(@X[0],@X[-4&7],8); # compose "X[-14]" in "X[0]" - eval(shift(@insns)); - eval(shift(@insns)); - - &paddd (@Tx[1],@X[-1&7]); - eval(shift(@insns)); - eval(shift(@insns)); - &psrldq (@Tx[0],4); # "X[-3]", 3 dwords - eval(shift(@insns)); - eval(shift(@insns)); - &pxor (@X[0],@X[-4&7]); # "X[0]"^="X[-16]" - eval(shift(@insns)); - eval(shift(@insns)); - - &pxor (@Tx[0],@X[-2&7]); # "X[-3]"^"X[-8]" - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - - &pxor (@X[0],@Tx[0]); # "X[0]"^="X[-3]"^"X[-8]" - eval(shift(@insns)); - eval(shift(@insns)); - &movdqa (eval(16*(($Xi-1)&3))."(%rsp)",@Tx[1]); # X[]+K xfer to IALU - eval(shift(@insns)); - eval(shift(@insns)); - - &movdqa (@Tx[2],@X[0]); - &movdqa (@Tx[0],@X[0]); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - - &pslldq (@Tx[2],12); # "X[0]"<<96, extract one dword - &paddd (@X[0],@X[0]); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - - &psrld (@Tx[0],31); - eval(shift(@insns)); - eval(shift(@insns)); - &movdqa (@Tx[1],@Tx[2]); - eval(shift(@insns)); - eval(shift(@insns)); - - &psrld (@Tx[2],30); - &por (@X[0],@Tx[0]); # "X[0]"<<<=1 - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - - &pslld (@Tx[1],2); - &pxor (@X[0],@Tx[2]); - eval(shift(@insns)); - eval(shift(@insns)); - &movdqa (@Tx[2],eval(16*(($Xi)/5))."($K_XX_XX)"); # K_XX_XX - eval(shift(@insns)); - eval(shift(@insns)); - - &pxor (@X[0],@Tx[1]); # "X[0]"^=("X[0]">>96)<<<2 - - foreach (@insns) { eval; } # remaining instructions [if any] - - $Xi++; push(@X,shift(@X)); # "rotate" X[] - push(@Tx,shift(@Tx)); -} - -sub Xupdate_ssse3_32_79() -{ use integer; - my $body = shift; - my @insns = (&$body,&$body,&$body,&$body); # 32 to 48 instructions - my ($a,$b,$c,$d,$e); - - &movdqa (@Tx[0],@X[-1&7]) if ($Xi==8); - eval(shift(@insns)); # body_20_39 - &pxor (@X[0],@X[-4&7]); # "X[0]"="X[-32]"^"X[-16]" - &palignr(@Tx[0],@X[-2&7],8); # compose "X[-6]" - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); # rol - - &pxor (@X[0],@X[-7&7]); # "X[0]"^="X[-28]" - eval(shift(@insns)); - eval(shift(@insns)) if (@insns[0] !~ /&ro[rl]/); - if ($Xi%5) { - &movdqa (@Tx[2],@Tx[1]);# "perpetuate" K_XX_XX... - } else { # ... or load next one - &movdqa (@Tx[2],eval(16*($Xi/5))."($K_XX_XX)"); - } - &paddd (@Tx[1],@X[-1&7]); - eval(shift(@insns)); # ror - eval(shift(@insns)); - - &pxor (@X[0],@Tx[0]); # "X[0]"^="X[-6]" - eval(shift(@insns)); # body_20_39 - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); # rol - - &movdqa (@Tx[0],@X[0]); - &movdqa (eval(16*(($Xi-1)&3))."(%rsp)",@Tx[1]); # X[]+K xfer to IALU - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); # ror - eval(shift(@insns)); - - &pslld (@X[0],2); - eval(shift(@insns)); # body_20_39 - eval(shift(@insns)); - &psrld (@Tx[0],30); - eval(shift(@insns)); - eval(shift(@insns)); # rol - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); # ror - eval(shift(@insns)); - - &por (@X[0],@Tx[0]); # "X[0]"<<<=2 - eval(shift(@insns)); # body_20_39 - eval(shift(@insns)); - &movdqa (@Tx[1],@X[0]) if ($Xi<19); - eval(shift(@insns)); - eval(shift(@insns)); # rol - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); # rol - eval(shift(@insns)); - - foreach (@insns) { eval; } # remaining instructions - - $Xi++; push(@X,shift(@X)); # "rotate" X[] - push(@Tx,shift(@Tx)); -} - -sub Xuplast_ssse3_80() -{ use integer; - my $body = shift; - my @insns = (&$body,&$body,&$body,&$body); # 32 instructions - my ($a,$b,$c,$d,$e); - - eval(shift(@insns)); - &paddd (@Tx[1],@X[-1&7]); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - - &movdqa (eval(16*(($Xi-1)&3))."(%rsp)",@Tx[1]); # X[]+K xfer IALU - - foreach (@insns) { eval; } # remaining instructions - - &cmp ($inp,$num); - &je (".Ldone_ssse3"); - - unshift(@Tx,pop(@Tx)); - - &movdqa (@X[2],"64($K_XX_XX)"); # pbswap mask - &movdqa (@Tx[1],"0($K_XX_XX)"); # K_00_19 - &movdqu (@X[-4&7],"0($inp)"); # load input - &movdqu (@X[-3&7],"16($inp)"); - &movdqu (@X[-2&7],"32($inp)"); - &movdqu (@X[-1&7],"48($inp)"); - &pshufb (@X[-4&7],@X[2]); # byte swap - &add ($inp,64); - - $Xi=0; -} - -sub Xloop_ssse3() -{ use integer; - my $body = shift; - my @insns = (&$body,&$body,&$body,&$body); # 32 instructions - my ($a,$b,$c,$d,$e); - - eval(shift(@insns)); - eval(shift(@insns)); - &pshufb (@X[($Xi-3)&7],@X[2]); - eval(shift(@insns)); - eval(shift(@insns)); - &paddd (@X[($Xi-4)&7],@Tx[1]); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - &movdqa (eval(16*$Xi)."(%rsp)",@X[($Xi-4)&7]); # X[]+K xfer to IALU - eval(shift(@insns)); - eval(shift(@insns)); - &psubd (@X[($Xi-4)&7],@Tx[1]); - - foreach (@insns) { eval; } - $Xi++; -} - -sub Xtail_ssse3() -{ use integer; - my $body = shift; - my @insns = (&$body,&$body,&$body,&$body); # 32 instructions - my ($a,$b,$c,$d,$e); - - foreach (@insns) { eval; } -} - -sub body_00_19 () { - ( - '($a,$b,$c,$d,$e)=@V;'. - '&add ($e,eval(4*($j&15))."(%rsp)");', # X[]+K xfer - '&xor ($c,$d);', - '&mov (@T[1],$a);', # $b in next round - '&$_rol ($a,5);', - '&and (@T[0],$c);', # ($b&($c^$d)) - '&xor ($c,$d);', # restore $c - '&xor (@T[0],$d);', - '&add ($e,$a);', - '&$_ror ($b,$j?7:2);', # $b>>>2 - '&add ($e,@T[0]);' .'$j++; unshift(@V,pop(@V)); unshift(@T,pop(@T));' - ); -} - -sub body_20_39 () { - ( - '($a,$b,$c,$d,$e)=@V;'. - '&add ($e,eval(4*($j++&15))."(%rsp)");', # X[]+K xfer - '&xor (@T[0],$d);', # ($b^$d) - '&mov (@T[1],$a);', # $b in next round - '&$_rol ($a,5);', - '&xor (@T[0],$c);', # ($b^$d^$c) - '&add ($e,$a);', - '&$_ror ($b,7);', # $b>>>2 - '&add ($e,@T[0]);' .'unshift(@V,pop(@V)); unshift(@T,pop(@T));' - ); -} - -sub body_40_59 () { - ( - '($a,$b,$c,$d,$e)=@V;'. - '&mov (@T[1],$c);', - '&xor ($c,$d);', - '&add ($e,eval(4*($j++&15))."(%rsp)");', # X[]+K xfer - '&and (@T[1],$d);', - '&and (@T[0],$c);', # ($b&($c^$d)) - '&$_ror ($b,7);', # $b>>>2 - '&add ($e,@T[1]);', - '&mov (@T[1],$a);', # $b in next round - '&$_rol ($a,5);', - '&add ($e,@T[0]);', - '&xor ($c,$d);', # restore $c - '&add ($e,$a);' .'unshift(@V,pop(@V)); unshift(@T,pop(@T));' - ); -} -$code.=<<___; -.align 16 -.Loop_ssse3: -___ - &Xupdate_ssse3_16_31(\&body_00_19); - &Xupdate_ssse3_16_31(\&body_00_19); - &Xupdate_ssse3_16_31(\&body_00_19); - &Xupdate_ssse3_16_31(\&body_00_19); - &Xupdate_ssse3_32_79(\&body_00_19); - &Xupdate_ssse3_32_79(\&body_20_39); - &Xupdate_ssse3_32_79(\&body_20_39); - &Xupdate_ssse3_32_79(\&body_20_39); - &Xupdate_ssse3_32_79(\&body_20_39); - &Xupdate_ssse3_32_79(\&body_20_39); - &Xupdate_ssse3_32_79(\&body_40_59); - &Xupdate_ssse3_32_79(\&body_40_59); - &Xupdate_ssse3_32_79(\&body_40_59); - &Xupdate_ssse3_32_79(\&body_40_59); - &Xupdate_ssse3_32_79(\&body_40_59); - &Xupdate_ssse3_32_79(\&body_20_39); - &Xuplast_ssse3_80(\&body_20_39); # can jump to "done" - - $saved_j=$j; @saved_V=@V; - - &Xloop_ssse3(\&body_20_39); - &Xloop_ssse3(\&body_20_39); - &Xloop_ssse3(\&body_20_39); - -$code.=<<___; - add 0($ctx),$A # update context - add 4($ctx),@T[0] - add 8($ctx),$C - add 12($ctx),$D - mov $A,0($ctx) - add 16($ctx),$E - mov @T[0],4($ctx) - mov @T[0],$B # magic seed - mov $C,8($ctx) - mov $D,12($ctx) - mov $E,16($ctx) - jmp .Loop_ssse3 - -.align 16 -.Ldone_ssse3: -___ - $j=$saved_j; @V=@saved_V; - - &Xtail_ssse3(\&body_20_39); - &Xtail_ssse3(\&body_20_39); - &Xtail_ssse3(\&body_20_39); - -$code.=<<___; - add 0($ctx),$A # update context - add 4($ctx),@T[0] - add 8($ctx),$C - mov $A,0($ctx) - add 12($ctx),$D - mov @T[0],4($ctx) - add 16($ctx),$E - mov $C,8($ctx) - mov $D,12($ctx) - mov $E,16($ctx) -___ -$code.=<<___ if ($win64); - movaps 64+0(%rsp),%xmm6 - movaps 64+16(%rsp),%xmm7 - movaps 64+32(%rsp),%xmm8 - movaps 64+48(%rsp),%xmm9 - movaps 64+64(%rsp),%xmm10 -___ -$code.=<<___; - lea `64+($win64?5*16:0)`(%rsp),%rsi - mov 0(%rsi),%r12 - mov 8(%rsi),%rbp - mov 16(%rsi),%rbx - lea 24(%rsi),%rsp -.Lepilogue_ssse3: - ret -.size sha1_block_data_order_ssse3,.-sha1_block_data_order_ssse3 -___ - -if ($avx) { -my $Xi=4; -my @X=map("%xmm$_",(4..7,0..3)); -my @Tx=map("%xmm$_",(8..10)); -my @V=($A,$B,$C,$D,$E)=("%eax","%ebx","%ecx","%edx","%ebp"); # size optimization -my @T=("%esi","%edi"); -my $j=0; -my $K_XX_XX="%r11"; - -my $_rol=sub { &shld(@_[0],@_) }; -my $_ror=sub { &shrd(@_[0],@_) }; - -$code.=<<___; -.type sha1_block_data_order_avx,\@function,3 -.align 16 -sha1_block_data_order_avx: -_avx_shortcut: - _CET_ENDBR - push %rbx - push %rbp - push %r12 - lea `-64-($win64?5*16:0)`(%rsp),%rsp -___ -$code.=<<___ if ($win64); - movaps %xmm6,64+0(%rsp) - movaps %xmm7,64+16(%rsp) - movaps %xmm8,64+32(%rsp) - movaps %xmm9,64+48(%rsp) - movaps %xmm10,64+64(%rsp) -.Lprologue_avx: -___ -$code.=<<___; - mov %rdi,$ctx # reassigned argument - mov %rsi,$inp # reassigned argument - mov %rdx,$num # reassigned argument - vzeroupper - - shl \$6,$num - add $inp,$num - lea K_XX_XX(%rip),$K_XX_XX - - mov 0($ctx),$A # load context - mov 4($ctx),$B - mov 8($ctx),$C - mov 12($ctx),$D - mov $B,@T[0] # magic seed - mov 16($ctx),$E - - vmovdqa 64($K_XX_XX),@X[2] # pbswap mask - vmovdqa 0($K_XX_XX),@Tx[1] # K_00_19 - vmovdqu 0($inp),@X[-4&7] # load input to %xmm[0-3] - vmovdqu 16($inp),@X[-3&7] - vmovdqu 32($inp),@X[-2&7] - vmovdqu 48($inp),@X[-1&7] - vpshufb @X[2],@X[-4&7],@X[-4&7] # byte swap - add \$64,$inp - vpshufb @X[2],@X[-3&7],@X[-3&7] - vpshufb @X[2],@X[-2&7],@X[-2&7] - vpshufb @X[2],@X[-1&7],@X[-1&7] - vpaddd @Tx[1],@X[-4&7],@X[0] # add K_00_19 - vpaddd @Tx[1],@X[-3&7],@X[1] - vpaddd @Tx[1],@X[-2&7],@X[2] - vmovdqa @X[0],0(%rsp) # X[]+K xfer to IALU - vmovdqa @X[1],16(%rsp) - vmovdqa @X[2],32(%rsp) - jmp .Loop_avx -___ - -sub Xupdate_avx_16_31() # recall that $Xi starts with 4 -{ use integer; - my $body = shift; - my @insns = (&$body,&$body,&$body,&$body); # 40 instructions - my ($a,$b,$c,$d,$e); - - eval(shift(@insns)); - eval(shift(@insns)); - &vpalignr(@X[0],@X[-3&7],@X[-4&7],8); # compose "X[-14]" in "X[0]" - eval(shift(@insns)); - eval(shift(@insns)); - - &vpaddd (@Tx[1],@Tx[1],@X[-1&7]); - eval(shift(@insns)); - eval(shift(@insns)); - &vpsrldq(@Tx[0],@X[-1&7],4); # "X[-3]", 3 dwords - eval(shift(@insns)); - eval(shift(@insns)); - &vpxor (@X[0],@X[0],@X[-4&7]); # "X[0]"^="X[-16]" - eval(shift(@insns)); - eval(shift(@insns)); - - &vpxor (@Tx[0],@Tx[0],@X[-2&7]); # "X[-3]"^"X[-8]" - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - - &vpxor (@X[0],@X[0],@Tx[0]); # "X[0]"^="X[-3]"^"X[-8]" - eval(shift(@insns)); - eval(shift(@insns)); - &vmovdqa (eval(16*(($Xi-1)&3))."(%rsp)",@Tx[1]); # X[]+K xfer to IALU - eval(shift(@insns)); - eval(shift(@insns)); - - &vpsrld (@Tx[0],@X[0],31); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - - &vpslldq(@Tx[2],@X[0],12); # "X[0]"<<96, extract one dword - &vpaddd (@X[0],@X[0],@X[0]); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - - &vpsrld (@Tx[1],@Tx[2],30); - &vpor (@X[0],@X[0],@Tx[0]); # "X[0]"<<<=1 - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - - &vpslld (@Tx[2],@Tx[2],2); - &vpxor (@X[0],@X[0],@Tx[1]); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - - &vpxor (@X[0],@X[0],@Tx[2]); # "X[0]"^=("X[0]">>96)<<<2 - eval(shift(@insns)); - eval(shift(@insns)); - &vmovdqa (@Tx[2],eval(16*(($Xi)/5))."($K_XX_XX)"); # K_XX_XX - eval(shift(@insns)); - eval(shift(@insns)); - - - foreach (@insns) { eval; } # remaining instructions [if any] - - $Xi++; push(@X,shift(@X)); # "rotate" X[] - push(@Tx,shift(@Tx)); -} - -sub Xupdate_avx_32_79() -{ use integer; - my $body = shift; - my @insns = (&$body,&$body,&$body,&$body); # 32 to 48 instructions - my ($a,$b,$c,$d,$e); - - &vpalignr(@Tx[0],@X[-1&7],@X[-2&7],8); # compose "X[-6]" - &vpxor (@X[0],@X[0],@X[-4&7]); # "X[0]"="X[-32]"^"X[-16]" - eval(shift(@insns)); # body_20_39 - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); # rol - - &vpxor (@X[0],@X[0],@X[-7&7]); # "X[0]"^="X[-28]" - eval(shift(@insns)); - eval(shift(@insns)) if (@insns[0] !~ /&ro[rl]/); - if ($Xi%5) { - &vmovdqa (@Tx[2],@Tx[1]);# "perpetuate" K_XX_XX... - } else { # ... or load next one - &vmovdqa (@Tx[2],eval(16*($Xi/5))."($K_XX_XX)"); - } - &vpaddd (@Tx[1],@Tx[1],@X[-1&7]); - eval(shift(@insns)); # ror - eval(shift(@insns)); - - &vpxor (@X[0],@X[0],@Tx[0]); # "X[0]"^="X[-6]" - eval(shift(@insns)); # body_20_39 - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); # rol - - &vpsrld (@Tx[0],@X[0],30); - &vmovdqa (eval(16*(($Xi-1)&3))."(%rsp)",@Tx[1]); # X[]+K xfer to IALU - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); # ror - eval(shift(@insns)); - - &vpslld (@X[0],@X[0],2); - eval(shift(@insns)); # body_20_39 - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); # rol - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); # ror - eval(shift(@insns)); - - &vpor (@X[0],@X[0],@Tx[0]); # "X[0]"<<<=2 - eval(shift(@insns)); # body_20_39 - eval(shift(@insns)); - &vmovdqa (@Tx[1],@X[0]) if ($Xi<19); - eval(shift(@insns)); - eval(shift(@insns)); # rol - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); # rol - eval(shift(@insns)); - - foreach (@insns) { eval; } # remaining instructions - - $Xi++; push(@X,shift(@X)); # "rotate" X[] - push(@Tx,shift(@Tx)); -} - -sub Xuplast_avx_80() -{ use integer; - my $body = shift; - my @insns = (&$body,&$body,&$body,&$body); # 32 instructions - my ($a,$b,$c,$d,$e); - - eval(shift(@insns)); - &vpaddd (@Tx[1],@Tx[1],@X[-1&7]); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - - &movdqa (eval(16*(($Xi-1)&3))."(%rsp)",@Tx[1]); # X[]+K xfer IALU - - foreach (@insns) { eval; } # remaining instructions - - &cmp ($inp,$num); - &je (".Ldone_avx"); - - unshift(@Tx,pop(@Tx)); - - &vmovdqa(@X[2],"64($K_XX_XX)"); # pbswap mask - &vmovdqa(@Tx[1],"0($K_XX_XX)"); # K_00_19 - &vmovdqu(@X[-4&7],"0($inp)"); # load input - &vmovdqu(@X[-3&7],"16($inp)"); - &vmovdqu(@X[-2&7],"32($inp)"); - &vmovdqu(@X[-1&7],"48($inp)"); - &vpshufb(@X[-4&7],@X[-4&7],@X[2]); # byte swap - &add ($inp,64); - - $Xi=0; -} - -sub Xloop_avx() -{ use integer; - my $body = shift; - my @insns = (&$body,&$body,&$body,&$body); # 32 instructions - my ($a,$b,$c,$d,$e); - - eval(shift(@insns)); - eval(shift(@insns)); - &vpshufb(@X[($Xi-3)&7],@X[($Xi-3)&7],@X[2]); - eval(shift(@insns)); - eval(shift(@insns)); - &vpaddd (@X[$Xi&7],@X[($Xi-4)&7],@Tx[1]); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - eval(shift(@insns)); - &vmovdqa(eval(16*$Xi)."(%rsp)",@X[$Xi&7]); # X[]+K xfer to IALU - eval(shift(@insns)); - eval(shift(@insns)); - - foreach (@insns) { eval; } - $Xi++; -} - -sub Xtail_avx() -{ use integer; - my $body = shift; - my @insns = (&$body,&$body,&$body,&$body); # 32 instructions - my ($a,$b,$c,$d,$e); - - foreach (@insns) { eval; } -} - -$code.=<<___; -.align 16 -.Loop_avx: -___ - &Xupdate_avx_16_31(\&body_00_19); - &Xupdate_avx_16_31(\&body_00_19); - &Xupdate_avx_16_31(\&body_00_19); - &Xupdate_avx_16_31(\&body_00_19); - &Xupdate_avx_32_79(\&body_00_19); - &Xupdate_avx_32_79(\&body_20_39); - &Xupdate_avx_32_79(\&body_20_39); - &Xupdate_avx_32_79(\&body_20_39); - &Xupdate_avx_32_79(\&body_20_39); - &Xupdate_avx_32_79(\&body_20_39); - &Xupdate_avx_32_79(\&body_40_59); - &Xupdate_avx_32_79(\&body_40_59); - &Xupdate_avx_32_79(\&body_40_59); - &Xupdate_avx_32_79(\&body_40_59); - &Xupdate_avx_32_79(\&body_40_59); - &Xupdate_avx_32_79(\&body_20_39); - &Xuplast_avx_80(\&body_20_39); # can jump to "done" - - $saved_j=$j; @saved_V=@V; - - &Xloop_avx(\&body_20_39); - &Xloop_avx(\&body_20_39); - &Xloop_avx(\&body_20_39); - -$code.=<<___; - add 0($ctx),$A # update context - add 4($ctx),@T[0] - add 8($ctx),$C - add 12($ctx),$D - mov $A,0($ctx) - add 16($ctx),$E - mov @T[0],4($ctx) - mov @T[0],$B # magic seed - mov $C,8($ctx) - mov $D,12($ctx) - mov $E,16($ctx) - jmp .Loop_avx - -.align 16 -.Ldone_avx: -___ - $j=$saved_j; @V=@saved_V; - - &Xtail_avx(\&body_20_39); - &Xtail_avx(\&body_20_39); - &Xtail_avx(\&body_20_39); - -$code.=<<___; - vzeroupper - - add 0($ctx),$A # update context - add 4($ctx),@T[0] - add 8($ctx),$C - mov $A,0($ctx) - add 12($ctx),$D - mov @T[0],4($ctx) - add 16($ctx),$E - mov $C,8($ctx) - mov $D,12($ctx) - mov $E,16($ctx) -___ -$code.=<<___ if ($win64); - movaps 64+0(%rsp),%xmm6 - movaps 64+16(%rsp),%xmm7 - movaps 64+32(%rsp),%xmm8 - movaps 64+48(%rsp),%xmm9 - movaps 64+64(%rsp),%xmm10 -___ -$code.=<<___; - lea `64+($win64?5*16:0)`(%rsp),%rsi - mov 0(%rsi),%r12 - mov 8(%rsi),%rbp - mov 16(%rsi),%rbx - lea 24(%rsi),%rsp -.Lepilogue_avx: - ret -.size sha1_block_data_order_avx,.-sha1_block_data_order_avx -___ -} -$code.=<<___; -.section .rodata -.align 64 -K_XX_XX: -.long 0x5a827999,0x5a827999,0x5a827999,0x5a827999 # K_00_19 -.long 0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1 # K_20_39 -.long 0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc # K_40_59 -.long 0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6 # K_60_79 -.long 0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f # pbswap mask -.text -___ -}}} -$code.=<<___; -.align 64 -___ - -# EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, -# CONTEXT *context,DISPATCHER_CONTEXT *disp) -if ($win64) { -$rec="%rcx"; -$frame="%rdx"; -$context="%r8"; -$disp="%r9"; - -$code.=<<___; -.extern __imp_RtlVirtualUnwind -.type se_handler,\@abi-omnipotent -.align 16 -se_handler: - _CET_ENDBR - push %rsi - push %rdi - push %rbx - push %rbp - push %r12 - push %r13 - push %r14 - push %r15 - pushfq - sub \$64,%rsp - - mov 120($context),%rax # pull context->Rax - mov 248($context),%rbx # pull context->Rip - - lea .Lprologue(%rip),%r10 - cmp %r10,%rbx # context->Rip<.Lprologue - jb .Lcommon_seh_tail - - mov 152($context),%rax # pull context->Rsp - - lea .Lepilogue(%rip),%r10 - cmp %r10,%rbx # context->Rip>=.Lepilogue - jae .Lcommon_seh_tail - - mov `16*4`(%rax),%rax # pull saved stack pointer - lea 32(%rax),%rax - - mov -8(%rax),%rbx - mov -16(%rax),%rbp - mov -24(%rax),%r12 - mov -32(%rax),%r13 - mov %rbx,144($context) # restore context->Rbx - mov %rbp,160($context) # restore context->Rbp - mov %r12,216($context) # restore context->R12 - mov %r13,224($context) # restore context->R13 - - jmp .Lcommon_seh_tail -.size se_handler,.-se_handler - -.type ssse3_handler,\@abi-omnipotent -.align 16 -ssse3_handler: - push %rsi - push %rdi - push %rbx - push %rbp - push %r12 - push %r13 - push %r14 - push %r15 - pushfq - sub \$64,%rsp - - mov 120($context),%rax # pull context->Rax - mov 248($context),%rbx # pull context->Rip - - mov 8($disp),%rsi # disp->ImageBase - mov 56($disp),%r11 # disp->HandlerData - - mov 0(%r11),%r10d # HandlerData[0] - lea (%rsi,%r10),%r10 # prologue label - cmp %r10,%rbx # context->RipRsp - - mov 4(%r11),%r10d # HandlerData[1] - lea (%rsi,%r10),%r10 # epilogue label - cmp %r10,%rbx # context->Rip>=epilogue label - jae .Lcommon_seh_tail - - lea 64(%rax),%rsi - lea 512($context),%rdi # &context.Xmm6 - mov \$10,%ecx - .long 0xa548f3fc # cld; rep movsq - lea `24+64+5*16`(%rax),%rax # adjust stack pointer - - mov -8(%rax),%rbx - mov -16(%rax),%rbp - mov -24(%rax),%r12 - mov %rbx,144($context) # restore context->Rbx - mov %rbp,160($context) # restore context->Rbp - mov %r12,216($context) # restore cotnext->R12 - -.Lcommon_seh_tail: - mov 8(%rax),%rdi - mov 16(%rax),%rsi - mov %rax,152($context) # restore context->Rsp - mov %rsi,168($context) # restore context->Rsi - mov %rdi,176($context) # restore context->Rdi - - mov 40($disp),%rdi # disp->ContextRecord - mov $context,%rsi # context - mov \$154,%ecx # sizeof(CONTEXT) - .long 0xa548f3fc # cld; rep movsq - - mov $disp,%rsi - xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER - mov 8(%rsi),%rdx # arg2, disp->ImageBase - mov 0(%rsi),%r8 # arg3, disp->ControlPc - mov 16(%rsi),%r9 # arg4, disp->FunctionEntry - mov 40(%rsi),%r10 # disp->ContextRecord - lea 56(%rsi),%r11 # &disp->HandlerData - lea 24(%rsi),%r12 # &disp->EstablisherFrame - mov %r10,32(%rsp) # arg5 - mov %r11,40(%rsp) # arg6 - mov %r12,48(%rsp) # arg7 - mov %rcx,56(%rsp) # arg8, (NULL) - call *__imp_RtlVirtualUnwind(%rip) - - mov \$1,%eax # ExceptionContinueSearch - add \$64,%rsp - popfq - pop %r15 - pop %r14 - pop %r13 - pop %r12 - pop %rbp - pop %rbx - pop %rdi - pop %rsi - ret -.size ssse3_handler,.-ssse3_handler - -.section .pdata -.align 4 - .rva .LSEH_begin_sha1_block_data_order - .rva .LSEH_end_sha1_block_data_order - .rva .LSEH_info_sha1_block_data_order - .rva .LSEH_begin_sha1_block_data_order_ssse3 - .rva .LSEH_end_sha1_block_data_order_ssse3 - .rva .LSEH_info_sha1_block_data_order_ssse3 -___ -$code.=<<___ if ($avx); - .rva .LSEH_begin_sha1_block_data_order_avx - .rva .LSEH_end_sha1_block_data_order_avx - .rva .LSEH_info_sha1_block_data_order_avx -___ -$code.=<<___; -.section .xdata -.align 8 -.LSEH_info_sha1_block_data_order: - .byte 9,0,0,0 - .rva se_handler -.LSEH_info_sha1_block_data_order_ssse3: - .byte 9,0,0,0 - .rva ssse3_handler - .rva .Lprologue_ssse3,.Lepilogue_ssse3 # HandlerData[] -___ -$code.=<<___ if ($avx); -.LSEH_info_sha1_block_data_order_avx: - .byte 9,0,0,0 - .rva ssse3_handler - .rva .Lprologue_avx,.Lepilogue_avx # HandlerData[] -___ -} - -#################################################################### - -$code =~ s/\`([^\`]*)\`/eval $1/gem; -print $code; -close STDOUT; diff --git a/lib/libcrypto/sha/asm/sha512-x86_64.pl b/lib/libcrypto/sha/asm/sha512-x86_64.pl deleted file mode 100755 index f7a4dad2c..000000000 --- a/lib/libcrypto/sha/asm/sha512-x86_64.pl +++ /dev/null @@ -1,347 +0,0 @@ -#!/usr/bin/env perl -# -# ==================================================================== -# Written by Andy Polyakov for the OpenSSL -# project. Rights for redistribution and usage in source and binary -# forms are granted according to the OpenSSL license. -# ==================================================================== -# -# sha256/512_block procedure for x86_64. -# -# 40% improvement over compiler-generated code on Opteron. On EM64T -# sha256 was observed to run >80% faster and sha512 - >40%. No magical -# tricks, just straight implementation... I really wonder why gcc -# [being armed with inline assembler] fails to generate as fast code. -# The only thing which is cool about this module is that it's very -# same instruction sequence used for both SHA-256 and SHA-512. In -# former case the instructions operate on 32-bit operands, while in -# latter - on 64-bit ones. All I had to do is to get one flavor right, -# the other one passed the test right away:-) -# -# sha256_block runs in ~1005 cycles on Opteron, which gives you -# asymptotic performance of 64*1000/1005=63.7MBps times CPU clock -# frequency in GHz. sha512_block runs in ~1275 cycles, which results -# in 128*1000/1275=100MBps per GHz. Is there room for improvement? -# Well, if you compare it to IA-64 implementation, which maintains -# X[16] in register bank[!], tends to 4 instructions per CPU clock -# cycle and runs in 1003 cycles, 1275 is very good result for 3-way -# issue Opteron pipeline and X[16] maintained in memory. So that *if* -# there is a way to improve it, *then* the only way would be to try to -# offload X[16] updates to SSE unit, but that would require "deeper" -# loop unroll, which in turn would naturally cause size blow-up, not -# to mention increased complexity! And once again, only *if* it's -# actually possible to noticeably improve overall ILP, instruction -# level parallelism, on a given CPU implementation in this case. -# -# Special note on Intel EM64T. While Opteron CPU exhibits perfect -# performance ratio of 1.5 between 64- and 32-bit flavors [see above], -# [currently available] EM64T CPUs apparently are far from it. On the -# contrary, 64-bit version, sha512_block, is ~30% *slower* than 32-bit -# sha256_block:-( This is presumably because 64-bit shifts/rotates -# apparently are not atomic instructions, but implemented in microcode. - -$flavour = shift; -$output = shift; -if ($flavour =~ /\./) { $output = $flavour; undef $flavour; } - -$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; -( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or -( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or -die "can't locate x86_64-xlate.pl"; - -open OUT,"| \"$^X\" $xlate $flavour $output"; -*STDOUT=*OUT; - -if ($output =~ /512/) { - $func="sha512_block_data_order"; - $TABLE="K512"; - $SZ=8; - @ROT=($A,$B,$C,$D,$E,$F,$G,$H)=("%rax","%rbx","%rcx","%rdx", - "%r8", "%r9", "%r10","%r11"); - ($T1,$a0,$a1,$a2)=("%r12","%r13","%r14","%r15"); - @Sigma0=(28,34,39); - @Sigma1=(14,18,41); - @sigma0=(1, 8, 7); - @sigma1=(19,61, 6); - $rounds=80; -} else { - $func="sha256_block_data_order"; - $TABLE="K256"; - $SZ=4; - @ROT=($A,$B,$C,$D,$E,$F,$G,$H)=("%eax","%ebx","%ecx","%edx", - "%r8d","%r9d","%r10d","%r11d"); - ($T1,$a0,$a1,$a2)=("%r12d","%r13d","%r14d","%r15d"); - @Sigma0=( 2,13,22); - @Sigma1=( 6,11,25); - @sigma0=( 7,18, 3); - @sigma1=(17,19,10); - $rounds=64; -} - -$ctx="%rdi"; # 1st arg -$round="%rdi"; # zaps $ctx -$inp="%rsi"; # 2nd arg -$Tbl="%rbp"; - -$_ctx="16*$SZ+0*8(%rsp)"; -$_inp="16*$SZ+1*8(%rsp)"; -$_end="16*$SZ+2*8(%rsp)"; -$_rsp="16*$SZ+3*8(%rsp)"; -$framesz="16*$SZ+4*8"; - - -sub ROUND_00_15() -{ my ($i,$a,$b,$c,$d,$e,$f,$g,$h) = @_; - -$code.=<<___; - ror \$`$Sigma1[2]-$Sigma1[1]`,$a0 - mov $f,$a2 - mov $T1,`$SZ*($i&0xf)`(%rsp) - - ror \$`$Sigma0[2]-$Sigma0[1]`,$a1 - xor $e,$a0 - xor $g,$a2 # f^g - - ror \$`$Sigma1[1]-$Sigma1[0]`,$a0 - add $h,$T1 # T1+=h - xor $a,$a1 - - add ($Tbl,$round,$SZ),$T1 # T1+=K[round] - and $e,$a2 # (f^g)&e - mov $b,$h - - ror \$`$Sigma0[1]-$Sigma0[0]`,$a1 - xor $e,$a0 - xor $g,$a2 # Ch(e,f,g)=((f^g)&e)^g - - xor $c,$h # b^c - xor $a,$a1 - add $a2,$T1 # T1+=Ch(e,f,g) - mov $b,$a2 - - ror \$$Sigma1[0],$a0 # Sigma1(e) - and $a,$h # h=(b^c)&a - and $c,$a2 # b&c - - ror \$$Sigma0[0],$a1 # Sigma0(a) - add $a0,$T1 # T1+=Sigma1(e) - add $a2,$h # h+=b&c (completes +=Maj(a,b,c) - - add $T1,$d # d+=T1 - add $T1,$h # h+=T1 - lea 1($round),$round # round++ - add $a1,$h # h+=Sigma0(a) - -___ -} - -sub ROUND_16_XX() -{ my ($i,$a,$b,$c,$d,$e,$f,$g,$h) = @_; - -$code.=<<___; - mov `$SZ*(($i+1)&0xf)`(%rsp),$a0 - mov `$SZ*(($i+14)&0xf)`(%rsp),$a1 - mov $a0,$T1 - mov $a1,$a2 - - ror \$`$sigma0[1]-$sigma0[0]`,$T1 - xor $a0,$T1 - shr \$$sigma0[2],$a0 - - ror \$$sigma0[0],$T1 - xor $T1,$a0 # sigma0(X[(i+1)&0xf]) - mov `$SZ*(($i+9)&0xf)`(%rsp),$T1 - - ror \$`$sigma1[1]-$sigma1[0]`,$a2 - xor $a1,$a2 - shr \$$sigma1[2],$a1 - - ror \$$sigma1[0],$a2 - add $a0,$T1 - xor $a2,$a1 # sigma1(X[(i+14)&0xf]) - - add `$SZ*($i&0xf)`(%rsp),$T1 - mov $e,$a0 - add $a1,$T1 - mov $a,$a1 -___ - &ROUND_00_15(@_); -} - -$code=<<___; -.text - -.globl $func -.type $func,\@function,4 -.align 16 -$func: - _CET_ENDBR - push %rbx - push %rbp - push %r12 - push %r13 - push %r14 - push %r15 - mov %rsp,%r11 # copy %rsp - shl \$4,%rdx # num*16 - sub \$$framesz,%rsp - lea ($inp,%rdx,$SZ),%rdx # inp+num*16*$SZ - and \$-64,%rsp # align stack frame - mov $ctx,$_ctx # save ctx, 1st arg - mov $inp,$_inp # save inp, 2nd arh - mov %rdx,$_end # save end pointer, "3rd" arg - mov %r11,$_rsp # save copy of %rsp -.Lprologue: - - lea $TABLE(%rip),$Tbl - - mov $SZ*0($ctx),$A - mov $SZ*1($ctx),$B - mov $SZ*2($ctx),$C - mov $SZ*3($ctx),$D - mov $SZ*4($ctx),$E - mov $SZ*5($ctx),$F - mov $SZ*6($ctx),$G - mov $SZ*7($ctx),$H - jmp .Lloop - -.align 16 -.Lloop: - xor $round,$round -___ - for($i=0;$i<16;$i++) { - $code.=" mov $SZ*$i($inp),$T1\n"; - $code.=" mov @ROT[4],$a0\n"; - $code.=" mov @ROT[0],$a1\n"; - $code.=" bswap $T1\n"; - &ROUND_00_15($i,@ROT); - unshift(@ROT,pop(@ROT)); - } -$code.=<<___; - jmp .Lrounds_16_xx -.align 16 -.Lrounds_16_xx: -___ - for(;$i<32;$i++) { - &ROUND_16_XX($i,@ROT); - unshift(@ROT,pop(@ROT)); - } - -$code.=<<___; - cmp \$$rounds,$round - jb .Lrounds_16_xx - - mov $_ctx,$ctx - lea 16*$SZ($inp),$inp - - add $SZ*0($ctx),$A - add $SZ*1($ctx),$B - add $SZ*2($ctx),$C - add $SZ*3($ctx),$D - add $SZ*4($ctx),$E - add $SZ*5($ctx),$F - add $SZ*6($ctx),$G - add $SZ*7($ctx),$H - - cmp $_end,$inp - - mov $A,$SZ*0($ctx) - mov $B,$SZ*1($ctx) - mov $C,$SZ*2($ctx) - mov $D,$SZ*3($ctx) - mov $E,$SZ*4($ctx) - mov $F,$SZ*5($ctx) - mov $G,$SZ*6($ctx) - mov $H,$SZ*7($ctx) - jb .Lloop - - mov $_rsp,%rsi - mov (%rsi),%r15 - mov 8(%rsi),%r14 - mov 16(%rsi),%r13 - mov 24(%rsi),%r12 - mov 32(%rsi),%rbp - mov 40(%rsi),%rbx - lea 48(%rsi),%rsp -.Lepilogue: - ret -.size $func,.-$func -___ - -if ($SZ==4) { -$code.=<<___; -.section .rodata -.align 64 -.type $TABLE,\@object -$TABLE: - .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 - .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 - .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 - .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 - .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc - .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da - .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 - .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 - .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 - .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 - .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 - .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 - .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 - .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 - .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 - .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 -.text -___ -} else { -$code.=<<___; -.section .rodata -.align 64 -.type $TABLE,\@object -$TABLE: - .quad 0x428a2f98d728ae22,0x7137449123ef65cd - .quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc - .quad 0x3956c25bf348b538,0x59f111f1b605d019 - .quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 - .quad 0xd807aa98a3030242,0x12835b0145706fbe - .quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 - .quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 - .quad 0x9bdc06a725c71235,0xc19bf174cf692694 - .quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 - .quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 - .quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 - .quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 - .quad 0x983e5152ee66dfab,0xa831c66d2db43210 - .quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 - .quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 - .quad 0x06ca6351e003826f,0x142929670a0e6e70 - .quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 - .quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df - .quad 0x650a73548baf63de,0x766a0abb3c77b2a8 - .quad 0x81c2c92e47edaee6,0x92722c851482353b - .quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 - .quad 0xc24b8b70d0f89791,0xc76c51a30654be30 - .quad 0xd192e819d6ef5218,0xd69906245565a910 - .quad 0xf40e35855771202a,0x106aa07032bbd1b8 - .quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 - .quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 - .quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb - .quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 - .quad 0x748f82ee5defb2fc,0x78a5636f43172f60 - .quad 0x84c87814a1f0ab72,0x8cc702081a6439ec - .quad 0x90befffa23631e28,0xa4506cebde82bde9 - .quad 0xbef9a3f7b2c67915,0xc67178f2e372532b - .quad 0xca273eceea26619c,0xd186b8c721c0c207 - .quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 - .quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 - .quad 0x113f9804bef90dae,0x1b710b35131c471b - .quad 0x28db77f523047d84,0x32caab7b40c72493 - .quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c - .quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a - .quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 -.text -___ -} - -$code =~ s/\`([^\`]*)\`/eval $1/gem; -print $code; -close STDOUT; diff --git a/sys/arch/arm64/dev/mainbus.h b/lib/libcrypto/sha/sha1_amd64.c similarity index 58% rename from sys/arch/arm64/dev/mainbus.h rename to lib/libcrypto/sha/sha1_amd64.c index 5f63d0ec4..2976cc7e6 100644 --- a/sys/arch/arm64/dev/mainbus.h +++ b/lib/libcrypto/sha/sha1_amd64.c @@ -1,6 +1,6 @@ -/* $OpenBSD: mainbus.h,v 1.2 2017/04/27 10:23:19 kettenis Exp $ */ +/* $OpenBSD: sha1_amd64.c,v 1.2 2024/12/06 11:57:18 jsing Exp $ */ /* - * Copyright (c) 2016 Patrick Wildt + * Copyright (c) 2024 Joel Sing * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -15,13 +15,20 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#ifndef __MAINBUS_H__ -#define __MAINBUS_H__ +#include -/* Passed as third arg to attach functions. */ -union mainbus_attach_args { - const char *ma_name; - struct fdt_attach_args ma_faa; -}; +#include "crypto_arch.h" -#endif /* __MAINBUS_H__ */ +void sha1_block_generic(SHA_CTX *ctx, const void *in, size_t num); +void sha1_block_shani(SHA_CTX *ctx, const void *in, size_t num); + +void +sha1_block_data_order(SHA_CTX *ctx, const void *in, size_t num) +{ + if ((crypto_cpu_caps_amd64 & CRYPTO_CPU_CAPS_AMD64_SHA) != 0) { + sha1_block_shani(ctx, in, num); + return; + } + + sha1_block_generic(ctx, in, num); +} diff --git a/lib/libcrypto/sha/sha1_amd64_generic.S b/lib/libcrypto/sha/sha1_amd64_generic.S new file mode 100644 index 000000000..d3e184dbc --- /dev/null +++ b/lib/libcrypto/sha/sha1_amd64_generic.S @@ -0,0 +1,314 @@ +/* $OpenBSD: sha1_amd64_generic.S,v 1.1 2024/12/04 13:13:33 jsing Exp $ */ +/* + * Copyright (c) 2024 Joel Sing + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef __CET__ +#include +#else +#define _CET_ENDBR +#endif + +#define ctx %rdi +#define in %rsi +#define num %rdx + +#define end %rbp + +#define hs0 %r8d +#define hs1 %r9d +#define hs2 %r10d +#define hs3 %r11d +#define hs4 %r12d + +#define tmp0 %eax +#define tmp1 %ebx +#define tmp2 %ecx +#define tmp3 %edx + +/* + * Load message into wt, storing a copy in the message schedule: + * + * Wt = Mt + */ +#define sha1_message_schedule_load(idx, m, w, wt) \ + movl ((idx&0xf)*4)(m), wt; \ + bswapl wt; \ + movl wt, ((idx&0xf)*4)(w); + +/* + * Update message schedule and return current value in wt: + * + * W0 = rol(W13 ^ W8 ^ W2 ^ W0, 1) + */ +#define sha1_message_schedule_update(idx, w, wt) \ + movl (((idx-3)&0xf)*4)(w), wt; /* W13 */ \ + xorl (((idx-8)&0xf)*4)(w), wt; /* W8 */ \ + xorl (((idx-14)&0xf)*4)(w), wt; /* W2 */ \ + xorl (((idx)&0xf)*4)(w), wt; /* W0 */ \ + roll $1, wt; \ + \ + movl wt, ((idx&0xf)*4)(w); + +/* + * Compute a SHA-1 round without logic function: + * + * T = rol(a, 5) + e + Kt + Wt + * + * The caller is required to compute the appropriate logic function + * (Ch, Maj, Parity) and add it to e. + * + * Upon completion b = rol(b, 30), e = T, pending rotation. + */ +#define sha1_round(a, b, c, d, e, kt, wt) \ + leal kt(wt, e, 1), e; /* Kt + Wt */ \ + \ + movl a, tmp1; /* rol(a, 5) */ \ + roll $5, tmp1; \ + addl tmp1, e; \ + \ + roll $30, b; /* rol(b, 30) */ + +/* + * Compute a SHA-1 round with Ch: + * + * T = rol(a, 5) + Ch(b, c, d) + e + Kt + Wt + * + * Ch(x, y, z) = (x & y) ^ (~x & z) = ((y ^ z) & x) ^ z + * + * Upon completion b = rol(b, 30), e = T, pending rotation. + */ +#define sha1_round_ch(a, b, c, d, e, kt, wt) \ + movl c, tmp2; /* Ch */ \ + xorl d, tmp2; /* Ch */ \ + andl b, tmp2; /* Ch */ \ + xorl d, tmp2; /* Ch */ \ + addl tmp2, e; /* Ch */ \ + \ + sha1_round(a, b, c, d, e, kt, wt); + +/* + * Compute a SHA-1 round with Parity: + * + * T = rol(a, 5) + Parity(b, c, d) + e + Kt + Wt + * + * Parity(x, y, z) = x ^ y ^ z + * + * Upon completion b = rol(b, 30), e = T, pending rotation. + */ +#define sha1_round_parity(a, b, c, d, e, kt, wt) \ + movl b, tmp2; /* Parity */ \ + xorl c, tmp2; /* Parity */ \ + xorl d, tmp2; /* Parity */ \ + addl tmp2, e; /* Parity */ \ + \ + sha1_round(a, b, c, d, e, kt, wt); + +/* + * Compute a SHA-1 round with Maj: + * + * T = rol(a, 5) + Maj(b, c, d) + e + Kt + Wt + * + * Maj(x, y, z) = (x & y) ^ (x & z) ^ (y & z) = ((y ^ z) & x) ^ (y & z) + * + * Upon completion b = rol(b, 30), e = T, pending rotation. + */ +#define sha1_round_maj(a, b, c, d, e, kt, wt) \ + movl c, tmp2; /* Maj */ \ + xorl d, tmp2; /* Maj */ \ + andl b, tmp2; /* Maj */ \ + movl c, tmp3; /* Maj */ \ + andl d, tmp3; /* Maj */ \ + xorl tmp2, tmp3; /* Maj */ \ + addl tmp3, e; /* Maj */ \ + \ + sha1_round(a, b, c, d, e, kt, wt); + +#define sha1_round1_load(idx, a, b, c, d, e) \ + sha1_message_schedule_load(idx, in, %rsp, tmp0) \ + sha1_round_ch(a, b, c, d, e, 0x5a827999, tmp0) + +#define sha1_round1_update(idx, a, b, c, d, e) \ + sha1_message_schedule_update(idx, %rsp, tmp0) \ + sha1_round_ch(a, b, c, d, e, 0x5a827999, tmp0) + +#define sha1_round2_update(idx, a, b, c, d, e) \ + sha1_message_schedule_update(idx, %rsp, tmp0) \ + sha1_round_parity(a, b, c, d, e, 0x6ed9eba1, tmp0) + +#define sha1_round3_update(idx, a, b, c, d, e) \ + sha1_message_schedule_update(idx, %rsp, tmp0) \ + sha1_round_maj(a, b, c, d, e, 0x8f1bbcdc, tmp0) + +#define sha1_round4_update(idx, a, b, c, d, e) \ + sha1_message_schedule_update(idx, %rsp, tmp0) \ + sha1_round_parity(a, b, c, d, e, 0xca62c1d6, tmp0) + +.text + +/* + * void sha1_block_generic(SHA1_CTX *ctx, const void *in, size_t num); + * + * Standard x86-64 ABI: rdi = ctx, rsi = in, rdx = num + */ +.align 16 +.globl sha1_block_generic +.type sha1_block_generic,@function +sha1_block_generic: + _CET_ENDBR + + /* Save callee save registers. */ + pushq %rbx + pushq %rbp + pushq %r12 + + /* Allocate space for message schedule. */ + movq %rsp, %rax + subq $(64+1*8), %rsp + andq $~63, %rsp + movq %rax, (64+0*8)(%rsp) + + /* Compute and store end of message. */ + shlq $6, num + leaq (in, num, 1), %rbp + + /* Load current hash state from context. */ + movl (0*4)(ctx), hs0 + movl (1*4)(ctx), hs1 + movl (2*4)(ctx), hs2 + movl (3*4)(ctx), hs3 + movl (4*4)(ctx), hs4 + + jmp .Lblock_loop + +.align 16 +.Lblock_loop: + + /* Round 0 through 15. */ + sha1_round1_load(0, hs0, hs1, hs2, hs3, hs4) + sha1_round1_load(1, hs4, hs0, hs1, hs2, hs3) + sha1_round1_load(2, hs3, hs4, hs0, hs1, hs2) + sha1_round1_load(3, hs2, hs3, hs4, hs0, hs1) + sha1_round1_load(4, hs1, hs2, hs3, hs4, hs0) + sha1_round1_load(5, hs0, hs1, hs2, hs3, hs4) + sha1_round1_load(6, hs4, hs0, hs1, hs2, hs3) + sha1_round1_load(7, hs3, hs4, hs0, hs1, hs2) + sha1_round1_load(8, hs2, hs3, hs4, hs0, hs1) + sha1_round1_load(9, hs1, hs2, hs3, hs4, hs0) + sha1_round1_load(10, hs0, hs1, hs2, hs3, hs4) + sha1_round1_load(11, hs4, hs0, hs1, hs2, hs3) + sha1_round1_load(12, hs3, hs4, hs0, hs1, hs2) + sha1_round1_load(13, hs2, hs3, hs4, hs0, hs1) + sha1_round1_load(14, hs1, hs2, hs3, hs4, hs0) + sha1_round1_load(15, hs0, hs1, hs2, hs3, hs4) + + /* Round 16 through 31. */ + sha1_round1_update(16, hs4, hs0, hs1, hs2, hs3); + sha1_round1_update(17, hs3, hs4, hs0, hs1, hs2); + sha1_round1_update(18, hs2, hs3, hs4, hs0, hs1); + sha1_round1_update(19, hs1, hs2, hs3, hs4, hs0); + sha1_round2_update(20, hs0, hs1, hs2, hs3, hs4); + sha1_round2_update(21, hs4, hs0, hs1, hs2, hs3); + sha1_round2_update(22, hs3, hs4, hs0, hs1, hs2); + sha1_round2_update(23, hs2, hs3, hs4, hs0, hs1); + sha1_round2_update(24, hs1, hs2, hs3, hs4, hs0); + sha1_round2_update(25, hs0, hs1, hs2, hs3, hs4); + sha1_round2_update(26, hs4, hs0, hs1, hs2, hs3); + sha1_round2_update(27, hs3, hs4, hs0, hs1, hs2); + sha1_round2_update(28, hs2, hs3, hs4, hs0, hs1); + sha1_round2_update(29, hs1, hs2, hs3, hs4, hs0); + sha1_round2_update(30, hs0, hs1, hs2, hs3, hs4); + sha1_round2_update(31, hs4, hs0, hs1, hs2, hs3); + + /* Round 32 through 47. */ + sha1_round2_update(32, hs3, hs4, hs0, hs1, hs2); + sha1_round2_update(33, hs2, hs3, hs4, hs0, hs1); + sha1_round2_update(34, hs1, hs2, hs3, hs4, hs0); + sha1_round2_update(35, hs0, hs1, hs2, hs3, hs4); + sha1_round2_update(36, hs4, hs0, hs1, hs2, hs3); + sha1_round2_update(37, hs3, hs4, hs0, hs1, hs2); + sha1_round2_update(38, hs2, hs3, hs4, hs0, hs1); + sha1_round2_update(39, hs1, hs2, hs3, hs4, hs0); + sha1_round3_update(40, hs0, hs1, hs2, hs3, hs4); + sha1_round3_update(41, hs4, hs0, hs1, hs2, hs3); + sha1_round3_update(42, hs3, hs4, hs0, hs1, hs2); + sha1_round3_update(43, hs2, hs3, hs4, hs0, hs1); + sha1_round3_update(44, hs1, hs2, hs3, hs4, hs0); + sha1_round3_update(45, hs0, hs1, hs2, hs3, hs4); + sha1_round3_update(46, hs4, hs0, hs1, hs2, hs3); + sha1_round3_update(47, hs3, hs4, hs0, hs1, hs2); + + /* Round 48 through 63. */ + sha1_round3_update(48, hs2, hs3, hs4, hs0, hs1); + sha1_round3_update(49, hs1, hs2, hs3, hs4, hs0); + sha1_round3_update(50, hs0, hs1, hs2, hs3, hs4); + sha1_round3_update(51, hs4, hs0, hs1, hs2, hs3); + sha1_round3_update(52, hs3, hs4, hs0, hs1, hs2); + sha1_round3_update(53, hs2, hs3, hs4, hs0, hs1); + sha1_round3_update(54, hs1, hs2, hs3, hs4, hs0); + sha1_round3_update(55, hs0, hs1, hs2, hs3, hs4); + sha1_round3_update(56, hs4, hs0, hs1, hs2, hs3); + sha1_round3_update(57, hs3, hs4, hs0, hs1, hs2); + sha1_round3_update(58, hs2, hs3, hs4, hs0, hs1); + sha1_round3_update(59, hs1, hs2, hs3, hs4, hs0); + sha1_round4_update(60, hs0, hs1, hs2, hs3, hs4); + sha1_round4_update(61, hs4, hs0, hs1, hs2, hs3); + sha1_round4_update(62, hs3, hs4, hs0, hs1, hs2); + sha1_round4_update(63, hs2, hs3, hs4, hs0, hs1); + + /* Round 64 through 79. */ + sha1_round4_update(64, hs1, hs2, hs3, hs4, hs0); + sha1_round4_update(65, hs0, hs1, hs2, hs3, hs4); + sha1_round4_update(66, hs4, hs0, hs1, hs2, hs3); + sha1_round4_update(67, hs3, hs4, hs0, hs1, hs2); + sha1_round4_update(68, hs2, hs3, hs4, hs0, hs1); + sha1_round4_update(69, hs1, hs2, hs3, hs4, hs0); + sha1_round4_update(70, hs0, hs1, hs2, hs3, hs4); + sha1_round4_update(71, hs4, hs0, hs1, hs2, hs3); + sha1_round4_update(72, hs3, hs4, hs0, hs1, hs2); + sha1_round4_update(73, hs2, hs3, hs4, hs0, hs1); + sha1_round4_update(74, hs1, hs2, hs3, hs4, hs0); + sha1_round4_update(75, hs0, hs1, hs2, hs3, hs4); + sha1_round4_update(76, hs4, hs0, hs1, hs2, hs3); + sha1_round4_update(77, hs3, hs4, hs0, hs1, hs2); + sha1_round4_update(78, hs2, hs3, hs4, hs0, hs1); + sha1_round4_update(79, hs1, hs2, hs3, hs4, hs0); + + /* Add intermediate state to hash state. */ + addl (0*4)(ctx), hs0 + addl (1*4)(ctx), hs1 + addl (2*4)(ctx), hs2 + addl (3*4)(ctx), hs3 + addl (4*4)(ctx), hs4 + + /* Store new hash state to context. */ + movl hs0, (0*4)(ctx) + movl hs1, (1*4)(ctx) + movl hs2, (2*4)(ctx) + movl hs3, (3*4)(ctx) + movl hs4, (4*4)(ctx) + + addq $64, in + cmpq end, in + jb .Lblock_loop + + movq (64+0*8)(%rsp), %rsp + + /* Restore callee save registers. */ + popq %r12 + popq %rbp + popq %rbx + + ret diff --git a/lib/libcrypto/sha/sha1_amd64_shani.S b/lib/libcrypto/sha/sha1_amd64_shani.S new file mode 100644 index 000000000..d7699d10f --- /dev/null +++ b/lib/libcrypto/sha/sha1_amd64_shani.S @@ -0,0 +1,170 @@ +/* $OpenBSD: sha1_amd64_shani.S,v 1.1 2024/12/06 11:57:18 jsing Exp $ */ +/* + * Copyright (c) 2024 Joel Sing + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef __CET__ +#include +#else +#define _CET_ENDBR +#endif + +/* + * SHA-1 implementation using the Intel SHA extensions: + * + * https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sha-extensions.html + */ + +#define ctx %rdi +#define in %rsi +#define num %rdx + +#define end %rbx + +#define xabcd_save %xmm0 +#define xe_save %xmm1 + +#define xabcd %xmm2 +#define xe0 %xmm3 +#define xe1 %xmm4 + +#define xmsg0 %xmm5 +#define xmsg1 %xmm6 +#define xmsg2 %xmm7 +#define xmsg3 %xmm8 + +#define xshufmask %xmm9 + + +#define sha1_message_schedule_load(idx, m, xmsg) \ + movdqu (idx*16)(m), xmsg; \ + pshufb xshufmask, xmsg; + +#define sha1_message_schedule_update(xm0, xm1, xm2, xm3) \ + sha1msg1 xm1, xm0; \ + pxor xm2, xm0; \ + sha1msg2 xm3, xm0; + +#define sha1_shani_round(fn, xmsg, xe, xe_next) \ + sha1nexte xmsg, xe; \ + movdqa xabcd, xe_next; \ + sha1rnds4 fn, xe, xabcd; + +#define sha1_shani_round_load(fn, idx, m, xmsg, xe, xe_next) \ + sha1_message_schedule_load(idx, m, xmsg); \ + sha1_shani_round(fn, xmsg, xe, xe_next); + +#define sha1_shani_round_update(fn, xm0, xm1, xm2, xm3, xe, xe_next) \ + sha1_message_schedule_update(xm0, xm1, xm2, xm3); \ + sha1_shani_round(fn, xm0, xe, xe_next); + + +.text + +/* + * void sha1_block_shani(SHA256_CTX *ctx, const void *in, size_t num); + * + * Standard x86-64 ABI: rdi = ctx, rsi = in, rdx = num + */ +.align 16 +.globl sha1_block_shani +.type sha1_block_shani,@function +sha1_block_shani: + _CET_ENDBR + + /* Save callee save registers. */ + pushq %rbx + + /* Compute end of message. */ + shlq $6, num + leaq (in, num, 1), end + + /* Load endian shuffle mask. */ + movdqa shufmask(%rip), xshufmask + + /* Load current hash state from context. */ + movdqu (0*16)(ctx), xabcd + pshufd $0x1b, xabcd, xabcd /* dcba -> abcd */ + pxor xe0, xe0 + pinsrd $3, (1*16)(ctx), xe0 /* e */ + + jmp .Lshani_block_loop + +.align 16 +.Lshani_block_loop: + /* Save state for accumulation. */ + movdqa xabcd, xabcd_save + movdqa xe0, xe_save + + /* Rounds 0 through 15 (four rounds at a time). */ + sha1_message_schedule_load(0, in, xmsg0); + paddd xmsg0, xe0 + movdqa xabcd, xe1 + sha1rnds4 $0, xe0, xabcd + + sha1_shani_round_load($0, 1, in, xmsg1, xe1, xe0); + sha1_shani_round_load($0, 2, in, xmsg2, xe0, xe1); + sha1_shani_round_load($0, 3, in, xmsg3, xe1, xe0); + + /* Rounds 16 through 79 (four rounds at a time). */ + sha1_shani_round_update($0, xmsg0, xmsg1, xmsg2, xmsg3, xe0, xe1) + sha1_shani_round_update($1, xmsg1, xmsg2, xmsg3, xmsg0, xe1, xe0) + sha1_shani_round_update($1, xmsg2, xmsg3, xmsg0, xmsg1, xe0, xe1) + sha1_shani_round_update($1, xmsg3, xmsg0, xmsg1, xmsg2, xe1, xe0) + + sha1_shani_round_update($1, xmsg0, xmsg1, xmsg2, xmsg3, xe0, xe1) + sha1_shani_round_update($1, xmsg1, xmsg2, xmsg3, xmsg0, xe1, xe0) + sha1_shani_round_update($2, xmsg2, xmsg3, xmsg0, xmsg1, xe0, xe1) + sha1_shani_round_update($2, xmsg3, xmsg0, xmsg1, xmsg2, xe1, xe0) + + sha1_shani_round_update($2, xmsg0, xmsg1, xmsg2, xmsg3, xe0, xe1) + sha1_shani_round_update($2, xmsg1, xmsg2, xmsg3, xmsg0, xe1, xe0) + sha1_shani_round_update($2, xmsg2, xmsg3, xmsg0, xmsg1, xe0, xe1) + sha1_shani_round_update($3, xmsg3, xmsg0, xmsg1, xmsg2, xe1, xe0) + + sha1_shani_round_update($3, xmsg0, xmsg1, xmsg2, xmsg3, xe0, xe1) + sha1_shani_round_update($3, xmsg1, xmsg2, xmsg3, xmsg0, xe1, xe0) + sha1_shani_round_update($3, xmsg2, xmsg3, xmsg0, xmsg1, xe0, xe1) + sha1_shani_round_update($3, xmsg3, xmsg0, xmsg1, xmsg2, xe1, xe0) + + /* Accumulate hash state. */ + paddd xabcd_save, xabcd + sha1nexte xe_save, xe0 + + addq $64, in + cmpq end, in + jb .Lshani_block_loop + + /* Update stored hash context. */ + pshufd $0x1b, xabcd, xabcd /* abcd -> dcba */ + movdqu xabcd, (0*16)(ctx) + pextrd $3, xe0, (1*16)(ctx) /* e */ + + /* Restore callee save registers. */ + popq %rbx + + ret + +.rodata + +/* + * Shuffle mask - byte reversal for little endian to big endian word conversion, + * and reordering to abcd. + */ +.align 16 +.type shufmask,@object +shufmask: +.octa 0x000102030405060708090a0b0c0d0e0f +.size shufmask,.-shufmask diff --git a/sys/arch/arm64/arm64/arm64_machdep.h b/lib/libcrypto/sha/sha256_amd64.c similarity index 57% rename from sys/arch/arm64/arm64/arm64_machdep.h rename to lib/libcrypto/sha/sha256_amd64.c index 951b21bf3..6c5d3e897 100644 --- a/sys/arch/arm64/arm64/arm64_machdep.h +++ b/lib/libcrypto/sha/sha256_amd64.c @@ -1,6 +1,6 @@ -/* $OpenBSD: arm64_machdep.h,v 1.2 2017/08/27 12:42:22 kettenis Exp $ */ +/* $OpenBSD: sha256_amd64.c,v 1.2 2024/11/16 15:31:36 jsing Exp $ */ /* - * Copyright (c) 2016 Patrick Wildt + * Copyright (c) 2024 Joel Sing * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -15,10 +15,20 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#ifndef __ARM64_MACHDEP_H__ -#define __ARM64_MACHDEP_H__ +#include -extern void (*cpuresetfn)(void); -extern void (*powerdownfn)(void); +#include "crypto_arch.h" -#endif /* __ARM64_MACHDEP_H__ */ +void sha256_block_generic(SHA256_CTX *ctx, const void *in, size_t num); +void sha256_block_shani(SHA256_CTX *ctx, const void *in, size_t num); + +void +sha256_block_data_order(SHA256_CTX *ctx, const void *in, size_t num) +{ + if ((crypto_cpu_caps_amd64 & CRYPTO_CPU_CAPS_AMD64_SHA) != 0) { + sha256_block_shani(ctx, in, num); + return; + } + + sha256_block_generic(ctx, in, num); +} diff --git a/lib/libcrypto/sha/sha256_amd64_generic.S b/lib/libcrypto/sha/sha256_amd64_generic.S new file mode 100644 index 000000000..166bce9ca --- /dev/null +++ b/lib/libcrypto/sha/sha256_amd64_generic.S @@ -0,0 +1,302 @@ +/* $OpenBSD: sha256_amd64_generic.S,v 1.3 2024/11/16 12:34:16 jsing Exp $ */ +/* + * Copyright (c) 2024 Joel Sing + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef __CET__ +#include +#else +#define _CET_ENDBR +#endif + +#define ctx %rdi +#define in %rsi +#define num %rdx + +#define round %rdi + +#define hs0 %r8d +#define hs1 %r9d +#define hs2 %r10d +#define hs3 %r11d +#define hs4 %r12d +#define hs5 %r13d +#define hs6 %r14d +#define hs7 %r15d + +#define k256 %rbp + +#define tmp0 %eax +#define tmp1 %ebx +#define tmp2 %ecx +#define tmp3 %edx + +/* + * Load message into wt, storing a copy in the message schedule: + * + * Wt = Mt + */ +#define sha256_message_schedule_load(idx, m, w, wt) \ + movl (m, round, 4), wt; \ + bswapl wt; \ + movl wt, ((idx&0xf)*4)(w); + +/* + * Update message schedule and return current value in wt: + * + * Wt = sigma1(W(t-2)) + W(t-7) + sigma0(W(t-15)) + W(t-16) + * + * sigma0(x) = ror(x, 7) ^ ror(x, 18) ^ (x >> 3) + * sigma1(x) = ror(x, 17) ^ ror(x, 19) ^ (x >> 10) + */ +#define sha256_message_schedule_update(idx, w, wt) \ + movl (((idx-2)&0xf)*4)(w), wt; /* sigma1 */ \ + movl wt, tmp1; /* sigma1 */ \ + rorl $(19-17), tmp1; /* sigma1 */ \ + xorl wt, tmp1; /* sigma1 */ \ + rorl $17, tmp1; /* sigma1 */ \ + shrl $10, wt; /* sigma1 */ \ + xorl tmp1, wt; /* sigma1 */ \ + \ + addl (((idx-7)&0xf)*4)(w), wt; /* Wt-7 */ \ + addl (((idx-16)&0xf)*4)(w), wt; /* Wt-16 */ \ + \ + movl (((idx-15)&0xf)*4)(w), tmp2; /* sigma0 */ \ + movl tmp2, tmp3; /* sigma0 */ \ + rorl $(18-7), tmp2; /* sigma0 */ \ + xorl tmp3, tmp2; /* sigma0 */ \ + rorl $7, tmp2; /* sigma0 */ \ + shrl $3, tmp3; /* sigma0 */ \ + xorl tmp3, tmp2; /* sigma0 */ \ + addl tmp2, wt; /* sigma0 */ \ + \ + movl wt, ((idx&0xf)*4)(w); + +/* + * Compute a SHA-256 round: + * + * T1 = h + Sigma1(e) + Ch(e, f, g) + Kt + Wt + * T2 = Sigma0(a) + Maj(a, b, c) + * + * Sigma0(x) = ror(x, 2) ^ ror(x, 13) ^ ror(x, 22) + * Sigma1(x) = ror(x, 6) ^ ror(x, 11) ^ ror(x, 25) + * Ch(x, y, z) = (x & y) ^ (~x & z) = ((y ^ z) & x) ^ z + * Maj(x, y, z) = (x & y) ^ (x & z) ^ (y & z) = ((y ^ z) & x) ^ (y & z) + * + * Upon completion d = d + T1, h = T1 + T2, pending rotation. + */ +#define sha256_round(idx, a, b, c, d, e, f, g, h, k, w, wt) \ + addl wt, h; /* T1 Wt */ \ + addl (k256, round, 4), h; /* T1 Kt */ \ + \ + movl e, tmp1; /* T1 Sigma1 */ \ + rorl $(25-11), tmp1; /* T1 Sigma1 */ \ + xorl e, tmp1; /* T1 Sigma1 */ \ + rorl $(11-6), tmp1; /* T1 Sigma1 */ \ + xorl e, tmp1; /* T1 Sigma1 */ \ + rorl $6, tmp1; /* T1 Sigma1 */ \ + addl tmp1, h; /* T1 Sigma1 */ \ + \ + movl f, tmp2; /* T1 Ch */ \ + xorl g, tmp2; /* T1 Ch */ \ + andl e, tmp2; /* T1 Ch */ \ + xorl g, tmp2; /* T1 Ch */ \ + addl tmp2, h; /* T1 Ch */ \ + \ + addl h, d; /* d += T1 */ \ + \ + movl a, tmp1; /* T2 Sigma0 */ \ + rorl $(22-13), tmp1; /* T2 Sigma0 */ \ + xorl a, tmp1; /* T2 Sigma0 */ \ + rorl $(13-2), tmp1; /* T2 Sigma0 */ \ + xorl a, tmp1; /* T2 Sigma0 */ \ + rorl $2, tmp1; /* T2 Sigma0 */ \ + addl tmp1, h; /* T2 Sigma0 */ \ + \ + movl b, tmp2; /* T2 Maj */ \ + xorl c, tmp2; /* T2 Maj */ \ + andl a, tmp2; /* T2 Maj */ \ + movl b, tmp3; /* T2 Maj */ \ + andl c, tmp3; /* T2 Maj */ \ + xorl tmp2, tmp3; /* T2 Maj */ \ + addl tmp3, h; /* T2 Maj */ \ + \ + addq $1, round; + +#define sha256_round_load(idx, a, b, c, d, e, f, g, h) \ + sha256_message_schedule_load(idx, in, %rsp, tmp0) \ + sha256_round(idx, a, b, c, d, e, f, g, h, k256, %rsp, tmp0) + +#define sha256_round_update(idx, a, b, c, d, e, f, g, h) \ + sha256_message_schedule_update(idx, %rsp, tmp0) \ + sha256_round(idx, a, b, c, d, e, f, g, h, k256, %rsp, tmp0) + +.text + +/* + * void sha256_block_generic(SHA256_CTX *ctx, const void *in, size_t num); + * + * Standard x86-64 ABI: rdi = ctx, rsi = in, rdx = num + */ +.align 16 +.globl sha256_block_generic +.type sha256_block_generic,@function +sha256_block_generic: + _CET_ENDBR + + /* Save callee save registers. */ + pushq %rbx + pushq %rbp + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + + /* Allocate space for message schedule, context pointer and end of message. */ + movq %rsp, %rax + subq $(64+3*8), %rsp + andq $~63, %rsp + movq %rax, (64+2*8)(%rsp) + movq ctx, (64+1*8)(%rsp) + + /* Compute and store end of message. */ + shlq $6, num + leaq (in, num, 1), %rbx + movq %rbx, (64+0*8)(%rsp) + + /* Address of SHA-256 constants. */ + leaq K256(%rip), k256 + + /* Load current hash state from context. */ + movl (0*4)(ctx), hs0 + movl (1*4)(ctx), hs1 + movl (2*4)(ctx), hs2 + movl (3*4)(ctx), hs3 + movl (4*4)(ctx), hs4 + movl (5*4)(ctx), hs5 + movl (6*4)(ctx), hs6 + movl (7*4)(ctx), hs7 + + jmp .Lblock_loop0 + +.align 16 +.Lblock_loop0: + mov $0, round + + /* Round 0 through 15. */ + sha256_round_load(0, hs0, hs1, hs2, hs3, hs4, hs5, hs6, hs7) + sha256_round_load(1, hs7, hs0, hs1, hs2, hs3, hs4, hs5, hs6) + sha256_round_load(2, hs6, hs7, hs0, hs1, hs2, hs3, hs4, hs5) + sha256_round_load(3, hs5, hs6, hs7, hs0, hs1, hs2, hs3, hs4) + sha256_round_load(4, hs4, hs5, hs6, hs7, hs0, hs1, hs2, hs3) + sha256_round_load(5, hs3, hs4, hs5, hs6, hs7, hs0, hs1, hs2) + sha256_round_load(6, hs2, hs3, hs4, hs5, hs6, hs7, hs0, hs1) + sha256_round_load(7, hs1, hs2, hs3, hs4, hs5, hs6, hs7, hs0) + sha256_round_load(8, hs0, hs1, hs2, hs3, hs4, hs5, hs6, hs7) + sha256_round_load(9, hs7, hs0, hs1, hs2, hs3, hs4, hs5, hs6) + sha256_round_load(10, hs6, hs7, hs0, hs1, hs2, hs3, hs4, hs5) + sha256_round_load(11, hs5, hs6, hs7, hs0, hs1, hs2, hs3, hs4) + sha256_round_load(12, hs4, hs5, hs6, hs7, hs0, hs1, hs2, hs3) + sha256_round_load(13, hs3, hs4, hs5, hs6, hs7, hs0, hs1, hs2) + sha256_round_load(14, hs2, hs3, hs4, hs5, hs6, hs7, hs0, hs1) + sha256_round_load(15, hs1, hs2, hs3, hs4, hs5, hs6, hs7, hs0) + + jmp .Lblock_loop16 + +.align 16 +.Lblock_loop16: + /* Round 16 through 63. */ + sha256_round_update(16, hs0, hs1, hs2, hs3, hs4, hs5, hs6, hs7) + sha256_round_update(17, hs7, hs0, hs1, hs2, hs3, hs4, hs5, hs6) + sha256_round_update(18, hs6, hs7, hs0, hs1, hs2, hs3, hs4, hs5) + sha256_round_update(19, hs5, hs6, hs7, hs0, hs1, hs2, hs3, hs4) + sha256_round_update(20, hs4, hs5, hs6, hs7, hs0, hs1, hs2, hs3) + sha256_round_update(21, hs3, hs4, hs5, hs6, hs7, hs0, hs1, hs2) + sha256_round_update(22, hs2, hs3, hs4, hs5, hs6, hs7, hs0, hs1) + sha256_round_update(23, hs1, hs2, hs3, hs4, hs5, hs6, hs7, hs0) + sha256_round_update(24, hs0, hs1, hs2, hs3, hs4, hs5, hs6, hs7) + sha256_round_update(25, hs7, hs0, hs1, hs2, hs3, hs4, hs5, hs6) + sha256_round_update(26, hs6, hs7, hs0, hs1, hs2, hs3, hs4, hs5) + sha256_round_update(27, hs5, hs6, hs7, hs0, hs1, hs2, hs3, hs4) + sha256_round_update(28, hs4, hs5, hs6, hs7, hs0, hs1, hs2, hs3) + sha256_round_update(29, hs3, hs4, hs5, hs6, hs7, hs0, hs1, hs2) + sha256_round_update(30, hs2, hs3, hs4, hs5, hs6, hs7, hs0, hs1) + sha256_round_update(31, hs1, hs2, hs3, hs4, hs5, hs6, hs7, hs0) + + cmp $64, round + jb .Lblock_loop16 + + movq (64+1*8)(%rsp), ctx + + /* Add intermediate state to hash state. */ + addl (0*4)(ctx), hs0 + addl (1*4)(ctx), hs1 + addl (2*4)(ctx), hs2 + addl (3*4)(ctx), hs3 + addl (4*4)(ctx), hs4 + addl (5*4)(ctx), hs5 + addl (6*4)(ctx), hs6 + addl (7*4)(ctx), hs7 + + /* Store new hash state to context. */ + movl hs0, (0*4)(ctx) + movl hs1, (1*4)(ctx) + movl hs2, (2*4)(ctx) + movl hs3, (3*4)(ctx) + movl hs4, (4*4)(ctx) + movl hs5, (5*4)(ctx) + movl hs6, (6*4)(ctx) + movl hs7, (7*4)(ctx) + + addq $64, in + cmpq (64+0*8)(%rsp), in + jb .Lblock_loop0 + + movq (64+2*8)(%rsp), %rsp + + /* Restore callee save registers. */ + popq %r15 + popq %r14 + popq %r13 + popq %r12 + popq %rbp + popq %rbx + + ret + +/* + * SHA-256 constants - see FIPS 180-4 section 4.2.2. + */ +.rodata +.align 64 +.type K256,@object +K256: +.long 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5 +.long 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5 +.long 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3 +.long 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174 +.long 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc +.long 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da +.long 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7 +.long 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967 +.long 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13 +.long 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85 +.long 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3 +.long 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070 +.long 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5 +.long 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3 +.long 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208 +.long 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +.size K256,.-K256 diff --git a/lib/libcrypto/sha/sha256_amd64_shani.S b/lib/libcrypto/sha/sha256_amd64_shani.S new file mode 100644 index 000000000..df3a796b4 --- /dev/null +++ b/lib/libcrypto/sha/sha256_amd64_shani.S @@ -0,0 +1,209 @@ +/* $OpenBSD: sha256_amd64_shani.S,v 1.1 2024/11/16 15:31:36 jsing Exp $ */ +/* + * Copyright (c) 2024 Joel Sing + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef __CET__ +#include +#else +#define _CET_ENDBR +#endif + +/* + * SHA-256 implementation using the Intel SHA extensions: + * + * https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sha-extensions.html + */ + +#define ctx %rdi +#define in %rsi +#define num %rdx + +#define end %rbx + +#define k256 %rbp + +#define xmsg %xmm0 + +#define xhs0 %xmm1 +#define xhs1 %xmm2 + +#define xabef %xmm3 +#define xcdgh %xmm4 + +#define xmsgtmp0 %xmm6 +#define xmsgtmp1 %xmm7 +#define xmsgtmp2 %xmm8 +#define xmsgtmp3 %xmm9 +#define xmsgtmp4 %xmm10 + +#define xshufmask %xmm11 + +#define xtmp0 %xmm12 + +#define sha256_message_schedule_load(idx, m, xmsgtmp) \ + movdqu (idx*16)(m), xmsg; \ + pshufb xshufmask, xmsg; \ + movdqa xmsg, xmsgtmp; + +#define sha256_message_schedule_update(xmt0, xmt1, xmt2, xmt3) \ + sha256msg1 xmt1, xmt0; \ + movdqa xmt3, xmsgtmp4; \ + palignr $4, xmt2, xmsgtmp4; \ + paddd xmsgtmp4, xmt0; \ + sha256msg2 xmt3, xmt0; + +#define sha256_shani_round(idx) \ + paddd (idx*16)(k256), xmsg; \ + sha256rnds2 xmsg, xhs0, xhs1; \ + pshufd $0x0e, xmsg, xmsg; \ + sha256rnds2 xmsg, xhs1, xhs0; + +#define sha256_shani_round_load(idx, m, xmsgtmp) \ + sha256_message_schedule_load(idx, m, xmsgtmp); \ + sha256_shani_round(idx); + +#define sha256_shani_round_update(idx, xmt0, xmt1, xmt2, xmt3) \ + sha256_message_schedule_update(xmt0, xmt1, xmt2, xmt3); \ + movdqa xmt0, xmsg; \ + sha256_shani_round(idx); + +.text + +/* + * void sha256_block_shani(SHA256_CTX *ctx, const void *in, size_t num); + * + * Standard x86-64 ABI: rdi = ctx, rsi = in, rdx = num + */ +.align 16 +.globl sha256_block_shani +.type sha256_block_shani,@function +sha256_block_shani: + _CET_ENDBR + + /* Save callee save registers. */ + pushq %rbx + pushq %rbp + + /* Compute end of message. */ + shlq $6, num + leaq (in, num, 1), end + + /* Address of SHA-256 constants. */ + leaq K256(%rip), k256 + + /* Load endian shuffle mask. */ + movdqa shufmask(%rip), xshufmask + + /* Load current hash state from context. */ + movdqu (0*16)(ctx), xhs0 /* dcba */ + movdqu (1*16)(ctx), xhs1 /* hgfe */ + + /* Rearrange words to construct abef/cdgh. */ + pshufd $0xb1, xhs0, xhs0 /* cdab */ + pshufd $0x1b, xhs1, xhs1 /* efgh */ + movdqa xhs0, xtmp0 + palignr $8, xhs1, xhs0 /* abef */ + pblendw $0xf0, xtmp0, xhs1 /* cdgh */ + + jmp .Lshani_block_loop + +.align 16 +.Lshani_block_loop: + /* Save state for accumulation. */ + movdqa xhs0, xabef + movdqa xhs1, xcdgh + + /* Rounds 0 through 15 (four rounds at a time). */ + sha256_shani_round_load(0, in, xmsgtmp0) + sha256_shani_round_load(1, in, xmsgtmp1) + sha256_shani_round_load(2, in, xmsgtmp2) + sha256_shani_round_load(3, in, xmsgtmp3) + + /* Rounds 16 through 63 (four rounds at a time). */ + sha256_shani_round_update(4, xmsgtmp0, xmsgtmp1, xmsgtmp2, xmsgtmp3) + sha256_shani_round_update(5, xmsgtmp1, xmsgtmp2, xmsgtmp3, xmsgtmp0) + sha256_shani_round_update(6, xmsgtmp2, xmsgtmp3, xmsgtmp0, xmsgtmp1) + sha256_shani_round_update(7, xmsgtmp3, xmsgtmp0, xmsgtmp1, xmsgtmp2) + + sha256_shani_round_update(8, xmsgtmp0, xmsgtmp1, xmsgtmp2, xmsgtmp3) + sha256_shani_round_update(9, xmsgtmp1, xmsgtmp2, xmsgtmp3, xmsgtmp0) + sha256_shani_round_update(10, xmsgtmp2, xmsgtmp3, xmsgtmp0, xmsgtmp1) + sha256_shani_round_update(11, xmsgtmp3, xmsgtmp0, xmsgtmp1, xmsgtmp2) + + sha256_shani_round_update(12, xmsgtmp0, xmsgtmp1, xmsgtmp2, xmsgtmp3) + sha256_shani_round_update(13, xmsgtmp1, xmsgtmp2, xmsgtmp3, xmsgtmp0) + sha256_shani_round_update(14, xmsgtmp2, xmsgtmp3, xmsgtmp0, xmsgtmp1) + sha256_shani_round_update(15, xmsgtmp3, xmsgtmp0, xmsgtmp1, xmsgtmp2) + + /* Accumulate hash state. */ + paddd xabef, xhs0 + paddd xcdgh, xhs1 + + addq $64, in + cmpq end, in + jb .Lshani_block_loop + + /* Rearrange words to construct dcba/hgfe. */ + pshufd $0x1b, xhs0, xhs0 /* feba */ + pshufd $0xb1, xhs1, xhs1 /* dchg */ + movdqa xhs0, xtmp0 + pblendw $0xf0, xhs1, xhs0 /* dcba */ + palignr $8, xtmp0, xhs1 /* hgfe */ + + /* Update stored hash context. */ + movdqu xhs0, (0*16)(ctx) + movdqu xhs1, (1*16)(ctx) + + /* Restore callee save registers. */ + popq %rbp + popq %rbx + + ret + +.rodata + +/* + * Shuffle mask - little endian to big endian word conversion. + */ +.align 16 +.type shufmask,@object +shufmask: +.octa 0x0c0d0e0f08090a0b0405060700010203 +.size shufmask,.-shufmask + +/* + * SHA-256 constants - see FIPS 180-4 section 4.2.2. + */ +.align 64 +.type K256,@object +K256: +.long 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5 +.long 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5 +.long 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3 +.long 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174 +.long 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc +.long 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da +.long 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7 +.long 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967 +.long 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13 +.long 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85 +.long 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3 +.long 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070 +.long 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5 +.long 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3 +.long 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208 +.long 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +.size K256,.-K256 diff --git a/lib/libcrypto/sha/sha3.c b/lib/libcrypto/sha/sha3.c index b070d715c..6a7196d58 100644 --- a/lib/libcrypto/sha/sha3.c +++ b/lib/libcrypto/sha/sha3.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sha3.c,v 1.15 2023/04/16 15:32:16 jsing Exp $ */ +/* $OpenBSD: sha3.c,v 1.16 2024/11/23 15:38:12 jsing Exp $ */ /* * The MIT License (MIT) * @@ -57,17 +57,8 @@ sha3_keccakf(uint64_t st[25]) uint64_t t, bc[5]; int i, j, r; -#if BYTE_ORDER != LITTLE_ENDIAN - uint8_t *v; - - for (i = 0; i < 25; i++) { - v = (uint8_t *) &st[i]; - st[i] = ((uint64_t) v[0]) | (((uint64_t) v[1]) << 8) | - (((uint64_t) v[2]) << 16) | (((uint64_t) v[3]) << 24) | - (((uint64_t) v[4]) << 32) | (((uint64_t) v[5]) << 40) | - (((uint64_t) v[6]) << 48) | (((uint64_t) v[7]) << 56); - } -#endif + for (i = 0; i < 25; i++) + st[i] = le64toh(st[i]); for (r = 0; r < KECCAKF_ROUNDS; r++) { @@ -102,20 +93,8 @@ sha3_keccakf(uint64_t st[25]) st[0] ^= sha3_keccakf_rndc[r]; } -#if BYTE_ORDER != LITTLE_ENDIAN - for (i = 0; i < 25; i++) { - v = (uint8_t *) &st[i]; - t = st[i]; - v[0] = t & 0xFF; - v[1] = (t >> 8) & 0xFF; - v[2] = (t >> 16) & 0xFF; - v[3] = (t >> 24) & 0xFF; - v[4] = (t >> 32) & 0xFF; - v[5] = (t >> 40) & 0xFF; - v[6] = (t >> 48) & 0xFF; - v[7] = (t >> 56) & 0xFF; - } -#endif + for (i = 0; i < 25; i++) + st[i] = htole64(st[i]); } int diff --git a/sys/arch/arm64/arm64/arm64var.h b/lib/libcrypto/sha/sha512_amd64.c similarity index 68% rename from sys/arch/arm64/arm64/arm64var.h rename to lib/libcrypto/sha/sha512_amd64.c index 21b82422b..0b5424302 100644 --- a/sys/arch/arm64/arm64/arm64var.h +++ b/lib/libcrypto/sha/sha512_amd64.c @@ -1,7 +1,6 @@ -/* $OpenBSD: arm64var.h,v 1.3 2021/04/02 03:02:45 tb Exp $ */ +/* $OpenBSD: sha512_amd64.c,v 1.1 2024/11/16 14:56:39 jsing Exp $ */ /* - * Copyright (c) 2005,2008 Dale Rahn - * Copyright (c) 2012-2013 Patrick Wildt + * Copyright (c) 2024 Joel Sing * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -16,10 +15,12 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#ifndef __ARM64VAR_H__ -#define __ARM64VAR_H__ +#include -extern bus_space_t arm64_bs_tag; - -#endif /* __ARM64VAR_H__ */ +void sha512_block_generic(SHA512_CTX *ctx, const void *in, size_t num); +void +sha512_block_data_order(SHA512_CTX *ctx, const void *in, size_t num) +{ + sha512_block_generic(ctx, in, num); +} diff --git a/lib/libcrypto/sha/sha512_amd64_generic.S b/lib/libcrypto/sha/sha512_amd64_generic.S new file mode 100644 index 000000000..8419d60b8 --- /dev/null +++ b/lib/libcrypto/sha/sha512_amd64_generic.S @@ -0,0 +1,307 @@ +/* $OpenBSD: sha512_amd64_generic.S,v 1.1 2024/11/16 14:56:39 jsing Exp $ */ +/* + * Copyright (c) 2024 Joel Sing + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef __CET__ +#include +#else +#define _CET_ENDBR +#endif + +#define ctx %rdi +#define in %rsi +#define num %rdx + +#define round %rdi + +#define hs0 %r8 +#define hs1 %r9 +#define hs2 %r10 +#define hs3 %r11 +#define hs4 %r12 +#define hs5 %r13 +#define hs6 %r14 +#define hs7 %r15 + +#define k512 %rbp + +#define tmp0 %rax +#define tmp1 %rbx +#define tmp2 %rcx +#define tmp3 %rdx + +/* + * Load message into wt, storing a copy in the message schedule: + * + * Wt = Mt + */ +#define sha512_message_schedule_load(idx, m, w, wt) \ + movq (m, round, 8), wt; \ + bswapq wt; \ + movq wt, ((idx&0xf)*8)(w); + +/* + * Update message schedule and return current value in wt: + * + * Wt = sigma1(W(t-2)) + W(t-7) + sigma0(W(t-15)) + W(t-16) + * + * sigma0(x) = ror(x, 1) ^ ror(x, 8) ^ (x >> 7) + * sigma1(x) = ror(x, 19) ^ ror(x, 61) ^ (x >> 6) + * + */ +#define sha512_message_schedule_update(idx, w, wt) \ + movq (((idx-2)&0xf)*8)(w), wt; /* sigma1 */ \ + movq wt, tmp1; /* sigma1 */ \ + rorq $(61-19), tmp1; /* sigma1 */ \ + xorq wt, tmp1; /* sigma1 */ \ + rorq $19, tmp1; /* sigma1 */ \ + shrq $6, wt; /* sigma1 */ \ + xorq tmp1, wt; /* sigma1 */ \ + \ + addq (((idx-7)&0xf)*8)(w), wt; /* Wt-7 */ \ + addq (((idx-16)&0xf)*8)(w), wt; /* Wt-16 */ \ + \ + movq (((idx-15)&0xf)*8)(w), tmp2; /* sigma0 */ \ + movq tmp2, tmp3; /* sigma0 */ \ + rorq $(8-1), tmp2; /* sigma0 */ \ + xorq tmp3, tmp2; /* sigma0 */ \ + rorq $1, tmp2; /* sigma0 */ \ + shrq $7, tmp3; /* sigma0 */ \ + xorq tmp3, tmp2; /* sigma0 */ \ + addq tmp2, wt; /* sigma0 */ \ + \ + movq wt, ((idx&0xf)*8)(w); + +/* + * Compute a SHA-512 round: + * + * T1 = h + Sigma1(e) + Ch(e, f, g) + Kt + Wt + * T2 = Sigma0(a) + Maj(a, b, c) + * + * Sigma0(x) = ror(x, 28) ^ ror(x, 34) ^ ror(x, 39) + * Sigma1(x) = ror(x, 14) ^ ror(x, 18) ^ ror(x, 41) + * Ch(x, y, z) = (x & y) ^ (~x & z) = ((y ^ z) & x) ^ z + * Maj(x, y, z) = (x & y) ^ (x & z) ^ (y & z) = ((y ^ z) & x) ^ (y & z) + * + * Upon completion d = d + T1, h = T1 + T2, pending rotation. + */ +#define sha512_round(idx, a, b, c, d, e, f, g, h, k, w, wt) \ + addq wt, h; /* T1 Wt */ \ + addq (k512, round, 8), h; /* T1 Kt */ \ + \ + movq e, tmp1; /* T1 Sigma1 */ \ + rorq $(41-18), tmp1; /* T1 Sigma1 */ \ + xorq e, tmp1; /* T1 Sigma1 */ \ + rorq $(18-14), tmp1; /* T1 Sigma1 */ \ + xorq e, tmp1; /* T1 Sigma1 */ \ + rorq $14, tmp1; /* T1 Sigma1 */ \ + addq tmp1, h; /* T1 Sigma1 */ \ + \ + movq f, tmp2; /* T1 Ch */ \ + xorq g, tmp2; /* T1 Ch */ \ + andq e, tmp2; /* T1 Ch */ \ + xorq g, tmp2; /* T1 Ch */ \ + addq tmp2, h; /* T1 Ch */ \ + \ + addq h, d; /* d += T1 */ \ + \ + movq a, tmp1; /* T2 Sigma0 */ \ + rorq $(39-34), tmp1; /* T2 Sigma0 */ \ + xorq a, tmp1; /* T2 Sigma0 */ \ + rorq $(34-28), tmp1; /* T2 Sigma0 */ \ + xorq a, tmp1; /* T2 Sigma0 */ \ + rorq $28, tmp1; /* T2 Sigma0 */ \ + addq tmp1, h; /* T2 Sigma0 */ \ + \ + movq b, tmp2; /* T2 Maj */ \ + xorq c, tmp2; /* T2 Maj */ \ + andq a, tmp2; /* T2 Maj */ \ + movq b, tmp3; /* T2 Maj */ \ + andq c, tmp3; /* T2 Maj */ \ + xorq tmp2, tmp3; /* T2 Maj */ \ + addq tmp3, h; /* T2 Maj */ \ + \ + addq $1, round; + +#define sha512_round_load(idx, a, b, c, d, e, f, g, h) \ + sha512_message_schedule_load(idx, in, %rsp, tmp0) \ + sha512_round(idx, a, b, c, d, e, f, g, h, k512, %rsp, tmp0) + +#define sha512_round_update(idx, a, b, c, d, e, f, g, h) \ + sha512_message_schedule_update(idx, %rsp, tmp0) \ + sha512_round(idx, a, b, c, d, e, f, g, h, k512, %rsp, tmp0) + +.text + +/* + * void sha512_block_generic(SHA512_CTX *ctx, const void *in, size_t num); + * + * Standard x86-64 ABI: rdi = ctx, rsi = in, rdx = num + */ +.align 16 +.globl sha512_block_generic +.type sha512_block_generic,@function +sha512_block_generic: + _CET_ENDBR + + /* Save callee save registers. */ + pushq %rbx + pushq %rbp + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + + /* Allocate space for message schedule and context pointer. */ + movq %rsp, %rax + subq $(128+3*8), %rsp + andq $~63, %rsp + movq %rax, (128+2*8)(%rsp) + movq ctx, (128+1*8)(%rsp) + + /* Compute and store end of message. */ + shlq $7, num + leaq (in, num, 1), %rbx + movq %rbx, (128+0*8)(%rsp) + + /* Address of SHA-512 constants. */ + leaq K512(%rip), k512 + + /* Load current hash state from context. */ + movq (0*8)(ctx), hs0 + movq (1*8)(ctx), hs1 + movq (2*8)(ctx), hs2 + movq (3*8)(ctx), hs3 + movq (4*8)(ctx), hs4 + movq (5*8)(ctx), hs5 + movq (6*8)(ctx), hs6 + movq (7*8)(ctx), hs7 + + jmp .Lblock_loop0 + +.align 16 +.Lblock_loop0: + mov $0, round + + /* Round 0 through 15. */ + sha512_round_load(0, hs0, hs1, hs2, hs3, hs4, hs5, hs6, hs7) + sha512_round_load(1, hs7, hs0, hs1, hs2, hs3, hs4, hs5, hs6) + sha512_round_load(2, hs6, hs7, hs0, hs1, hs2, hs3, hs4, hs5) + sha512_round_load(3, hs5, hs6, hs7, hs0, hs1, hs2, hs3, hs4) + sha512_round_load(4, hs4, hs5, hs6, hs7, hs0, hs1, hs2, hs3) + sha512_round_load(5, hs3, hs4, hs5, hs6, hs7, hs0, hs1, hs2) + sha512_round_load(6, hs2, hs3, hs4, hs5, hs6, hs7, hs0, hs1) + sha512_round_load(7, hs1, hs2, hs3, hs4, hs5, hs6, hs7, hs0) + sha512_round_load(8, hs0, hs1, hs2, hs3, hs4, hs5, hs6, hs7) + sha512_round_load(9, hs7, hs0, hs1, hs2, hs3, hs4, hs5, hs6) + sha512_round_load(10, hs6, hs7, hs0, hs1, hs2, hs3, hs4, hs5) + sha512_round_load(11, hs5, hs6, hs7, hs0, hs1, hs2, hs3, hs4) + sha512_round_load(12, hs4, hs5, hs6, hs7, hs0, hs1, hs2, hs3) + sha512_round_load(13, hs3, hs4, hs5, hs6, hs7, hs0, hs1, hs2) + sha512_round_load(14, hs2, hs3, hs4, hs5, hs6, hs7, hs0, hs1) + sha512_round_load(15, hs1, hs2, hs3, hs4, hs5, hs6, hs7, hs0) + + jmp .Lblock_loop16 + +.align 16 +.Lblock_loop16: + /* Round 16 through 79. */ + sha512_round_update(16, hs0, hs1, hs2, hs3, hs4, hs5, hs6, hs7) + sha512_round_update(17, hs7, hs0, hs1, hs2, hs3, hs4, hs5, hs6) + sha512_round_update(18, hs6, hs7, hs0, hs1, hs2, hs3, hs4, hs5) + sha512_round_update(19, hs5, hs6, hs7, hs0, hs1, hs2, hs3, hs4) + sha512_round_update(20, hs4, hs5, hs6, hs7, hs0, hs1, hs2, hs3) + sha512_round_update(21, hs3, hs4, hs5, hs6, hs7, hs0, hs1, hs2) + sha512_round_update(22, hs2, hs3, hs4, hs5, hs6, hs7, hs0, hs1) + sha512_round_update(23, hs1, hs2, hs3, hs4, hs5, hs6, hs7, hs0) + sha512_round_update(24, hs0, hs1, hs2, hs3, hs4, hs5, hs6, hs7) + sha512_round_update(25, hs7, hs0, hs1, hs2, hs3, hs4, hs5, hs6) + sha512_round_update(26, hs6, hs7, hs0, hs1, hs2, hs3, hs4, hs5) + sha512_round_update(27, hs5, hs6, hs7, hs0, hs1, hs2, hs3, hs4) + sha512_round_update(28, hs4, hs5, hs6, hs7, hs0, hs1, hs2, hs3) + sha512_round_update(29, hs3, hs4, hs5, hs6, hs7, hs0, hs1, hs2) + sha512_round_update(30, hs2, hs3, hs4, hs5, hs6, hs7, hs0, hs1) + sha512_round_update(31, hs1, hs2, hs3, hs4, hs5, hs6, hs7, hs0) + + cmp $80, round + jb .Lblock_loop16 + + movq (128+1*8)(%rsp), ctx + + /* Add intermediate state to hash state. */ + addq (0*8)(ctx), hs0 + addq (1*8)(ctx), hs1 + addq (2*8)(ctx), hs2 + addq (3*8)(ctx), hs3 + addq (4*8)(ctx), hs4 + addq (5*8)(ctx), hs5 + addq (6*8)(ctx), hs6 + addq (7*8)(ctx), hs7 + + /* Store new hash state to context. */ + movq hs0, (0*8)(ctx) + movq hs1, (1*8)(ctx) + movq hs2, (2*8)(ctx) + movq hs3, (3*8)(ctx) + movq hs4, (4*8)(ctx) + movq hs5, (5*8)(ctx) + movq hs6, (6*8)(ctx) + movq hs7, (7*8)(ctx) + + addq $128, in + cmpq (128+0*8)(%rsp), in + jb .Lblock_loop0 + + movq (128+2*8)(%rsp), %rsp + + /* Restore callee save registers. */ + popq %r15 + popq %r14 + popq %r13 + popq %r12 + popq %rbp + popq %rbx + + ret + +/* + * SHA-512 constants - see FIPS 180-4 section 4.2.3. + */ +.rodata +.align 64 +.type K512,@object +K512: +.quad 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc +.quad 0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118 +.quad 0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2 +.quad 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694 +.quad 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65 +.quad 0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5 +.quad 0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4 +.quad 0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70 +.quad 0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df +.quad 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b +.quad 0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30 +.quad 0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8 +.quad 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8 +.quad 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3 +.quad 0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec +.quad 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b +.quad 0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178 +.quad 0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b +.quad 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c +.quad 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817 +.size K512,.-K512 diff --git a/lib/libcrypto/sm3/sm3.c b/lib/libcrypto/sm3/sm3.c index b10485dfe..4da85244b 100644 --- a/lib/libcrypto/sm3/sm3.c +++ b/lib/libcrypto/sm3/sm3.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sm3.c,v 1.17 2024/03/28 12:09:09 jsing Exp $ */ +/* $OpenBSD: sm3.c,v 1.18 2024/12/12 09:54:44 tb Exp $ */ /* * Copyright (c) 2018, Ribose Inc * @@ -77,10 +77,10 @@ sm3_block_data_order(SM3_CTX *ctx, const void *_in, size_t num) G = ctx->G; H = ctx->H; - /* - * We have to load all message bytes immediately since SM3 reads - * them slightly out of order. - */ + /* + * We have to load all message bytes immediately since SM3 reads + * them slightly out of order. + */ if ((uintptr_t)in % 4 == 0) { /* Input is 32 bit aligned. */ in32 = (const SM3_WORD *)in; diff --git a/lib/libcrypto/stack/stack.c b/lib/libcrypto/stack/stack.c index 60a302afc..142466187 100644 --- a/lib/libcrypto/stack/stack.c +++ b/lib/libcrypto/stack/stack.c @@ -1,4 +1,4 @@ -/* $OpenBSD: stack.c,v 1.28 2024/03/02 11:20:36 tb Exp $ */ +/* $OpenBSD: stack.c,v 1.33 2025/01/03 08:04:16 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -68,9 +68,6 @@ #undef MIN_NODES #define MIN_NODES 4 -#define OBJ_BSEARCH_VALUE_ON_NOMATCH 0x01 -#define OBJ_BSEARCH_FIRST_VALUE_ON_MATCH 0x02 - int (*sk_set_cmp_func(_STACK *sk, int (*c)(const void *, const void *)))( const void *, const void *) @@ -202,39 +199,32 @@ LCRYPTO_ALIAS(sk_delete); static const void * obj_bsearch_ex(const void *key, const void *base_, int num, int size, - int (*cmp)(const void *, const void *), int flags) + int (*cmp)(const void *, const void *)) { const char *base = base_; - int l, h, i = 0, c = 0; - const char *p = NULL; + int l, h, i, c; - if (num == 0) - return (NULL); l = 0; h = num; while (l < h) { i = (l + h) / 2; - p = &(base[i * size]); - c = (*cmp)(key, p); + if ((c = cmp(key, &base[i * size])) == 0) { + /* Return first match. */ + while (i > 0 && cmp(key, &base[(i - 1) * size]) == 0) + i--; + return &base[i * size]; + } if (c < 0) h = i; - else if (c > 0) - l = i + 1; else - break; + l = i + 1; } - if (c != 0 && !(flags & OBJ_BSEARCH_VALUE_ON_NOMATCH)) - p = NULL; - else if (c == 0 && (flags & OBJ_BSEARCH_FIRST_VALUE_ON_MATCH)) { - while (i > 0 && (*cmp)(key, &(base[(i - 1) * size])) == 0) - i--; - p = &(base[i * size]); - } - return (p); + + return NULL; } -static int -internal_find(_STACK *st, void *data, int ret_val_options) +int +sk_find(_STACK *st, void *data) { const void * const *r; int i; @@ -251,18 +241,11 @@ internal_find(_STACK *st, void *data, int ret_val_options) sk_sort(st); if (data == NULL) return (-1); - r = obj_bsearch_ex(&data, st->data, st->num, sizeof(void *), st->comp, - ret_val_options); + r = obj_bsearch_ex(&data, st->data, st->num, sizeof(void *), st->comp); if (r == NULL) return (-1); return (int)((char **)r - st->data); } - -int -sk_find(_STACK *st, void *data) -{ - return internal_find(st, data, OBJ_BSEARCH_FIRST_VALUE_ON_MATCH); -} LCRYPTO_ALIAS(sk_find); int diff --git a/lib/libcrypto/ts/ts_lib.c b/lib/libcrypto/ts/ts_lib.c index 1e94922aa..7e4010175 100644 --- a/lib/libcrypto/ts/ts_lib.c +++ b/lib/libcrypto/ts/ts_lib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ts_lib.c,v 1.14 2023/07/07 07:25:21 beck Exp $ */ +/* $OpenBSD: ts_lib.c,v 1.15 2025/01/07 14:22:19 tb Exp $ */ /* Written by Zoltan Glozik (zglozik@stones.com) for the OpenSSL * project 2002. */ @@ -74,20 +74,25 @@ int TS_ASN1_INTEGER_print_bio(BIO *bio, const ASN1_INTEGER *num) { - BIGNUM num_bn; - int result = 0; - char *hex; + BIGNUM *bn = NULL; + char *hex = NULL; + int ret = 0; - BN_init(&num_bn); - ASN1_INTEGER_to_BN(num, &num_bn); - if ((hex = BN_bn2hex(&num_bn))) { - result = BIO_write(bio, "0x", 2) > 0; - result = result && BIO_write(bio, hex, strlen(hex)) > 0; - free(hex); - } - BN_free(&num_bn); + /* XXX - OpenSSL decided to return -1 here for some stupid reason. */ + if ((bn = ASN1_INTEGER_to_BN(num, NULL)) == NULL) + goto err; + if ((hex = BN_bn2hex(bn)) == NULL) + goto err; + if (BIO_printf(bio, "0x%s", hex) <= 0) + goto err; - return result; + ret = 1; + + err: + BN_free(bn); + free(hex); + + return ret; } LCRYPTO_ALIAS(TS_ASN1_INTEGER_print_bio); diff --git a/lib/libcrypto/x509/x509_def.c b/lib/libcrypto/x509/x509_def.c index f85781afd..f9b395c20 100644 --- a/lib/libcrypto/x509/x509_def.c +++ b/lib/libcrypto/x509/x509_def.c @@ -1,4 +1,4 @@ -/* $OpenBSD: x509_def.c,v 1.7 2023/02/16 08:38:17 tb Exp $ */ +/* $OpenBSD: x509_def.c,v 1.10 2024/11/05 09:35:40 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -56,49 +56,48 @@ * [including the GNU Public Licence.] */ -#include -#include "cryptlib.h" -#include #include +#include "crypto_local.h" + const char * X509_get_default_private_dir(void) { - return (X509_PRIVATE_DIR); + return X509_PRIVATE_DIR; } LCRYPTO_ALIAS(X509_get_default_private_dir); const char * X509_get_default_cert_area(void) { - return (X509_CERT_AREA); + return X509_CERT_AREA; } LCRYPTO_ALIAS(X509_get_default_cert_area); const char * X509_get_default_cert_dir(void) { - return (X509_CERT_DIR); + return X509_CERT_DIR; } LCRYPTO_ALIAS(X509_get_default_cert_dir); const char * X509_get_default_cert_file(void) { - return (X509_CERT_FILE); + return X509_CERT_FILE; } LCRYPTO_ALIAS(X509_get_default_cert_file); const char * X509_get_default_cert_dir_env(void) { - return (X509_CERT_DIR_EVP); + return X509_CERT_DIR_EVP; } LCRYPTO_ALIAS(X509_get_default_cert_dir_env); const char * X509_get_default_cert_file_env(void) { - return (X509_CERT_FILE_EVP); + return X509_CERT_FILE_EVP; } LCRYPTO_ALIAS(X509_get_default_cert_file_env); diff --git a/lib/libcrypto/x509/x509_local.h b/lib/libcrypto/x509/x509_local.h index bb64729b3..e4d4b4ddd 100644 --- a/lib/libcrypto/x509/x509_local.h +++ b/lib/libcrypto/x509/x509_local.h @@ -1,4 +1,4 @@ -/* $OpenBSD: x509_local.h,v 1.32 2024/08/31 10:46:40 tb Exp $ */ +/* $OpenBSD: x509_local.h,v 1.33 2024/12/04 20:07:16 tb Exp $ */ /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project 2013. */ @@ -199,7 +199,7 @@ struct x509_st { NAME_CONSTRAINTS *nc; #ifndef OPENSSL_NO_RFC3779 STACK_OF(IPAddressFamily) *rfc3779_addr; - struct ASIdentifiers_st *rfc3779_asid; + ASIdentifiers *rfc3779_asid; #endif unsigned char hash[X509_CERT_HASH_LEN]; X509_CERT_AUX *aux; diff --git a/lib/libcrypto/x509/x509_ocsp.c b/lib/libcrypto/x509/x509_ocsp.c index 11d1a1c9c..6531b4c42 100644 --- a/lib/libcrypto/x509/x509_ocsp.c +++ b/lib/libcrypto/x509/x509_ocsp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: x509_ocsp.c,v 1.3 2024/07/13 15:08:58 tb Exp $ */ +/* $OpenBSD: x509_ocsp.c,v 1.4 2024/12/24 09:14:33 schwarze Exp $ */ /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project 1999. */ @@ -118,7 +118,7 @@ x509v3_ext_method_id_pkix_OCSP_CrlID(void) return &x509v3_ext_id_pkix_OCSP_CrlID; } -const X509V3_EXT_METHOD x509v3_ext_id_pkix_OCSP_archiveCutoff = { +static const X509V3_EXT_METHOD x509v3_ext_id_pkix_OCSP_archiveCutoff = { .ext_nid = NID_id_pkix_OCSP_archiveCutoff, .ext_flags = 0, .it = &ASN1_GENERALIZEDTIME_it, diff --git a/lib/libcrypto/x509/x509_policy.c b/lib/libcrypto/x509/x509_policy.c index 0da16b948..4321a9669 100644 --- a/lib/libcrypto/x509/x509_policy.c +++ b/lib/libcrypto/x509/x509_policy.c @@ -1,4 +1,4 @@ -/* $OpenBSD: x509_policy.c,v 1.27 2024/03/02 11:20:36 tb Exp $ */ +/* $OpenBSD: x509_policy.c,v 1.29 2025/01/06 17:42:39 tb Exp $ */ /* * Copyright (c) 2022, Google Inc. * @@ -31,8 +31,8 @@ #define X509_R_INVALID_POLICY_EXTENSION 201 /* - * This file computes the X.509 policy tree, as described in RFC 5280, section - * 6.1. It differs in that: + * This file computes the X.509 policy tree, as described in RFC 5280, + * section 6.1 and RFC 9618. It differs in that: * * (1) It does not track "qualifier_set". This is not needed as it is not * output by this implementation. @@ -398,7 +398,7 @@ process_certificate_policies(const X509 *x509, X509_POLICY_LEVEL *level, /* * This does the same thing as RFC 5280, section 6.1.3, step (d), - * though in a slighty different order. |level| currently contains + * though in a slightly different order. |level| currently contains * "expected_policy_set" values of the previous level. * See |process_policy_mappings| for details. */ diff --git a/lib/libcrypto/x509/x509_utl.c b/lib/libcrypto/x509/x509_utl.c index f327e9fca..0427b4c6e 100644 --- a/lib/libcrypto/x509/x509_utl.c +++ b/lib/libcrypto/x509/x509_utl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: x509_utl.c,v 1.22 2024/08/31 18:38:46 tb Exp $ */ +/* $OpenBSD: x509_utl.c,v 1.25 2024/12/24 10:52:43 tb Exp $ */ /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project. */ @@ -71,6 +71,12 @@ #include "bytestring.h" +/* + * Match reference identifiers starting with "." to any sub-domain. This + * flag is set implicitly when the subject reference identity is a DNS name. + */ +#define _X509_CHECK_FLAG_DOT_SUBDOMAINS 0x8000 + static char *bn_to_string(const BIGNUM *bn); static char *strip_spaces(char *name); static int sk_strcmp(const char * const *a, const char * const *b); @@ -391,7 +397,8 @@ X509V3_parse_list(const char *line) X509V3error(X509V3_R_INVALID_NULL_NAME); goto err; } - X509V3_add_value(ntmp, NULL, &values); + if (!X509V3_add_value(ntmp, NULL, &values)) + goto err; } break; @@ -404,7 +411,8 @@ X509V3_parse_list(const char *line) X509V3error(X509V3_R_INVALID_NULL_VALUE); goto err; } - X509V3_add_value(ntmp, vtmp, &values); + if (!X509V3_add_value(ntmp, vtmp, &values)) + goto err; ntmp = NULL; q = p + 1; } @@ -418,14 +426,16 @@ X509V3_parse_list(const char *line) X509V3error(X509V3_R_INVALID_NULL_VALUE); goto err; } - X509V3_add_value(ntmp, vtmp, &values); + if (!X509V3_add_value(ntmp, vtmp, &values)) + goto err; } else { ntmp = strip_spaces(q); if (!ntmp) { X509V3error(X509V3_R_INVALID_NULL_NAME); goto err; } - X509V3_add_value(ntmp, NULL, &values); + if (!X509V3_add_value(ntmp, NULL, &values)) + goto err; } free(linebuf); return values; @@ -434,7 +444,6 @@ X509V3_parse_list(const char *line) free(linebuf); sk_CONF_VALUE_pop_free(values, X509V3_conf_free); return NULL; - } LCRYPTO_ALIAS(X509V3_parse_list); diff --git a/lib/libcrypto/x509/x509v3.h b/lib/libcrypto/x509/x509v3.h index 166ac66a2..fa3127928 100644 --- a/lib/libcrypto/x509/x509v3.h +++ b/lib/libcrypto/x509/x509v3.h @@ -1,4 +1,4 @@ -/* $OpenBSD: x509v3.h,v 1.35 2024/08/31 10:23:13 tb Exp $ */ +/* $OpenBSD: x509v3.h,v 1.40 2024/12/23 09:57:23 tb Exp $ */ /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project 1999. */ @@ -134,11 +134,11 @@ typedef struct v3_ext_method X509V3_EXT_METHOD; DECLARE_STACK_OF(X509V3_EXT_METHOD) -/* ext_flags values */ -#define X509V3_EXT_DYNAMIC 0x1 -#define X509V3_EXT_CTX_DEP 0x2 +/* XXX - can this be made internal? */ #define X509V3_EXT_MULTILINE 0x4 +/* XXX - remove it anyway? */ +/* Guess who uses this... Yes, of course, it's xca. */ typedef BIT_STRING_BITNAME ENUMERATED_NAMES; typedef struct BASIC_CONSTRAINTS_st { @@ -342,24 +342,6 @@ struct ISSUING_DIST_POINT_st { X509V3_set_ctx(ctx, NULL, NULL, NULL, NULL, CTX_TEST) #define X509V3_set_ctx_nodb(ctx) (ctx)->db = NULL; -#define EXT_BITSTRING(nid, table) { nid, 0, &ASN1_BIT_STRING_it, \ - 0,0,0,0, \ - 0,0, \ - (X509V3_EXT_I2V)i2v_ASN1_BIT_STRING, \ - (X509V3_EXT_V2I)v2i_ASN1_BIT_STRING, \ - NULL, NULL, \ - table} - -#define EXT_IA5STRING(nid) { nid, 0, &ASN1_IA5STRING_it, \ - 0,0,0,0, \ - (X509V3_EXT_I2S)i2s_ASN1_IA5STRING, \ - (X509V3_EXT_S2I)s2i_ASN1_IA5STRING, \ - 0,0,0,0, \ - NULL} - -#define EXT_END { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - - /* X509_PURPOSE stuff */ #define EXFLAG_BCONS 0x0001 @@ -708,13 +690,6 @@ STACK_OF(OPENSSL_STRING) *X509_get1_ocsp(X509 *x); /* Disable checking the CN for a hostname, to support modern validation */ #define X509_CHECK_FLAG_NEVER_CHECK_SUBJECT 0x20 -/* - * Match reference identifiers starting with "." to any sub-domain. - * This is a non-public flag, turned on implicitly when the subject - * reference identity is a DNS name. - */ -#define _X509_CHECK_FLAG_DOT_SUBDOMAINS 0x8000 - int X509_check_host(X509 *x, const char *chk, size_t chklen, unsigned int flags, char **peername); int X509_check_email(X509 *x, const char *chk, size_t chklen, diff --git a/lib/libexpat/Changes b/lib/libexpat/Changes index c1d22efa5..aa19f70ae 100644 --- a/lib/libexpat/Changes +++ b/lib/libexpat/Changes @@ -30,6 +30,37 @@ !! THANK YOU! Sebastian Pipping -- Berlin, 2024-03-09 !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +Release 2.6.4 Wed November 6 2024 + Security fixes: + #915 CVE-2024-50602 -- Fix crash within function XML_ResumeParser + from a NULL pointer dereference by disallowing function + XML_StopParser to (stop or) suspend an unstarted parser. + A new error code XML_ERROR_NOT_STARTED was introduced to + properly communicate this situation. // CWE-476 CWE-754 + + Other changes: + #903 CMake: Add alias target "expat::expat" + #905 docs: Document use via CMake >=3.18 with FetchContent + and SOURCE_SUBDIR and its consequences + #902 tests: Reduce use of global parser instance + #904 tests: Resolve duplicate handler + #317 #918 tests: Improve tests on doctype closing (ex CVE-2019-15903) + #914 Fix signedness of format strings + #919 #920 Version info bumped from 10:3:9 (libexpat*.so.1.9.3) + to 11:0:10 (libexpat*.so.1.10.0); see https://verbump.de/ + for what these numbers do + + Infrastructure: + #907 CI: Upgrade Clang from 18 to 19 + #913 CI: Drop macos-12 and add macos-15 + #910 CI: Adapt to breaking changes in GitHub Actions + #898 Add missing entries to .gitignore + + Special thanks to: + Hanno Böck + José Eduardo Gutiérrez Conejo + José Ricardo Cardona Quesada + Release 2.6.3 Wed September 4 2024 Security fixes: #887 #890 CVE-2024-45490 -- Calling function XML_ParseBuffer with diff --git a/lib/libexpat/README.md b/lib/libexpat/README.md index 180a68e4a..23d26dad2 100644 --- a/lib/libexpat/README.md +++ b/lib/libexpat/README.md @@ -11,7 +11,7 @@ > at the top of the `Changes` file. -# Expat, Release 2.6.3 +# Expat, Release 2.6.4 This is Expat, a C99 library for parsing [XML 1.0 Fourth Edition](https://www.w3.org/TR/2006/REC-xml-20060816/), started by @@ -43,9 +43,9 @@ This license is the same as the MIT/X Consortium license. ## Using libexpat in your CMake-Based Project -There are two ways of using libexpat with CMake: +There are three documented ways of using libexpat with CMake: -### a) Module Mode +### a) `find_package` with Module Mode This approach leverages CMake's own [module `FindEXPAT`](https://cmake.org/cmake/help/latest/module/FindEXPAT.html). @@ -70,7 +70,7 @@ target_include_directories(hello PRIVATE ${EXPAT_INCLUDE_DIRS}) target_link_libraries(hello PUBLIC ${EXPAT_LIBRARIES}) ``` -### b) Config Mode +### b) `find_package` with Config Mode This approach requires files from… @@ -98,6 +98,45 @@ add_executable(hello target_link_libraries(hello PUBLIC expat::expat) ``` +### c) The `FetchContent` module + +This approach — as demonstrated below — requires CMake >=3.18 for both the +[`FetchContent` module](https://cmake.org/cmake/help/latest/module/FetchContent.html) +and its support for the `SOURCE_SUBDIR` option to be available. + +Please note that: +- Use of the `FetchContent` module with *non-release* SHA1s or `master` + of libexpat is neither advised nor considered officially supported. +- Pinning to a specific commit is great for robust CI. +- Pinning to a specific commit needs updating every time there is a new + release of libexpat — either manually or through automation —, + to not miss out on libexpat security updates. + +For an example that pulls in libexpat via Git: + +```cmake +cmake_minimum_required(VERSION 3.18) + +include(FetchContent) + +project(hello VERSION 1.0.0) + +FetchContent_Declare( + expat + GIT_REPOSITORY https://github.com/libexpat/libexpat/ + GIT_TAG 000000000_GIT_COMMIT_SHA1_HERE_000000000 # i.e. Git tag R_0_Y_Z + SOURCE_SUBDIR expat/ +) + +FetchContent_MakeAvailable(expat) + +add_executable(hello + hello.c +) + +target_link_libraries(hello PUBLIC expat) +``` + ## Building from a Git Clone diff --git a/lib/libexpat/doc/reference.html b/lib/libexpat/doc/reference.html index 4cfb2ce93..c2ae9bb71 100644 --- a/lib/libexpat/doc/reference.html +++ b/lib/libexpat/doc/reference.html @@ -52,7 +52,7 @@

The Expat XML Parser - Release 2.6.3 + Release 2.6.4

diff --git a/lib/libexpat/examples/element_declarations.c b/lib/libexpat/examples/element_declarations.c index 7ce8544f6..d644b2ffa 100644 --- a/lib/libexpat/examples/element_declarations.c +++ b/lib/libexpat/examples/element_declarations.c @@ -15,6 +15,7 @@ Copyright (c) 2016-2024 Sebastian Pipping Copyright (c) 2017 Rhodri James Copyright (c) 2019 Zhongyuan Zhou + Copyright (c) 2024 Hanno Böck Licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining @@ -127,15 +128,15 @@ dumpContentModelElement(const XML_Content *model, unsigned level, } // Node - printf("[%u] type=%s(%d), quant=%s(%d)", (unsigned)(model - root), - contentTypeName(model->type), model->type, - contentQuantName(model->quant), model->quant); + printf("[%u] type=%s(%u), quant=%s(%u)", (unsigned)(model - root), + contentTypeName(model->type), (unsigned int)model->type, + contentQuantName(model->quant), (unsigned int)model->quant); if (model->name) { printf(", name=\"%" XML_FMT_STR "\"", model->name); } else { printf(", name=NULL"); } - printf(", numchildren=%d", model->numchildren); + printf(", numchildren=%u", model->numchildren); printf("\n"); } diff --git a/lib/libexpat/lib/expat.h b/lib/libexpat/lib/expat.h index d0d6015a6..523b37d8d 100644 --- a/lib/libexpat/lib/expat.h +++ b/lib/libexpat/lib/expat.h @@ -130,7 +130,9 @@ enum XML_Error { /* Added in 2.3.0. */ XML_ERROR_NO_BUFFER, /* Added in 2.4.0. */ - XML_ERROR_AMPLIFICATION_LIMIT_BREACH + XML_ERROR_AMPLIFICATION_LIMIT_BREACH, + /* Added in 2.6.4. */ + XML_ERROR_NOT_STARTED, }; enum XML_Content_Type { @@ -1066,7 +1068,7 @@ XML_SetReparseDeferralEnabled(XML_Parser parser, XML_Bool enabled); */ #define XML_MAJOR_VERSION 2 #define XML_MINOR_VERSION 6 -#define XML_MICRO_VERSION 3 +#define XML_MICRO_VERSION 4 #ifdef __cplusplus } diff --git a/lib/libexpat/lib/xmlparse.c b/lib/libexpat/lib/xmlparse.c index d9285b213..a4e091e7c 100644 --- a/lib/libexpat/lib/xmlparse.c +++ b/lib/libexpat/lib/xmlparse.c @@ -1,4 +1,4 @@ -/* ba4cdf9bdb534f355a9def4c9e25d20ee8e72f95b0a4d930be52e563f5080196 (2.6.3+) +/* c5625880f4bf417c1463deee4eb92d86ff413f802048621c57e25fe483eb59e4 (2.6.4+) __ __ _ ___\ \/ /_ __ __ _| |_ / _ \\ /| '_ \ / _` | __| @@ -40,6 +40,7 @@ Copyright (c) 2023 Owain Davies Copyright (c) 2023-2024 Sony Corporation / Snild Dolkow Copyright (c) 2024 Berkay Eren Ürün + Copyright (c) 2024 Hanno Böck Licensed under the MIT license: Permission is hereby granted, free of charge, to any person obtaining @@ -2234,6 +2235,9 @@ XML_StopParser(XML_Parser parser, XML_Bool resumable) { if (parser == NULL) return XML_STATUS_ERROR; switch (parser->m_parsingStatus.parsing) { + case XML_INITIALIZED: + parser->m_errorCode = XML_ERROR_NOT_STARTED; + return XML_STATUS_ERROR; case XML_SUSPENDED: if (resumable) { parser->m_errorCode = XML_ERROR_SUSPENDED; @@ -2244,7 +2248,7 @@ XML_StopParser(XML_Parser parser, XML_Bool resumable) { case XML_FINISHED: parser->m_errorCode = XML_ERROR_FINISHED; return XML_STATUS_ERROR; - default: + case XML_PARSING: if (resumable) { #ifdef XML_DTD if (parser->m_isParamEntity) { @@ -2255,6 +2259,9 @@ XML_StopParser(XML_Parser parser, XML_Bool resumable) { parser->m_parsingStatus.parsing = XML_SUSPENDED; } else parser->m_parsingStatus.parsing = XML_FINISHED; + break; + default: + assert(0); } return XML_STATUS_OK; } @@ -2519,6 +2526,9 @@ XML_ErrorString(enum XML_Error code) { case XML_ERROR_AMPLIFICATION_LIMIT_BREACH: return XML_L( "limit on input amplification factor (from DTD and entities) breached"); + /* Added in 2.6.4. */ + case XML_ERROR_NOT_STARTED: + return XML_L("parser not started"); } return NULL; } @@ -7856,7 +7866,7 @@ accountingReportDiff(XML_Parser rootParser, assert(! rootParser->m_parentParser); fprintf(stderr, - " (+" EXPAT_FMT_PTRDIFF_T("6") " bytes %s|%d, xmlparse.c:%d) %*s\"", + " (+" EXPAT_FMT_PTRDIFF_T("6") " bytes %s|%u, xmlparse.c:%d) %*s\"", bytesMore, (account == XML_ACCOUNT_DIRECT) ? "DIR" : "EXP", levelsAwayFromRootParser, source_line, 10, ""); @@ -7969,7 +7979,7 @@ entityTrackingReportStats(XML_Parser rootParser, ENTITY *entity, fprintf( stderr, - "expat: Entities(%p): Count %9d, depth %2d/%2d %*s%s%s; %s length %d (xmlparse.c:%d)\n", + "expat: Entities(%p): Count %9u, depth %2u/%2u %*s%s%s; %s length %d (xmlparse.c:%d)\n", (void *)rootParser, rootParser->m_entity_stats.countEverOpened, rootParser->m_entity_stats.currentDepth, rootParser->m_entity_stats.maximumDepthSeen, diff --git a/lib/libexpat/shlib_version b/lib/libexpat/shlib_version index 7cc7abc9d..779132204 100644 --- a/lib/libexpat/shlib_version +++ b/lib/libexpat/shlib_version @@ -1,2 +1,2 @@ -major=14 -minor=1 +major=15 +minor=0 diff --git a/lib/libexpat/tests/basic_tests.c b/lib/libexpat/tests/basic_tests.c index 5dba5ed59..cb124a24e 100644 --- a/lib/libexpat/tests/basic_tests.c +++ b/lib/libexpat/tests/basic_tests.c @@ -2357,11 +2357,20 @@ START_TEST(test_attributes) { info[0].attributes = doc_info; info[1].attributes = tag_info; - XML_SetStartElementHandler(g_parser, counting_start_element_handler); - XML_SetUserData(g_parser, info); - if (_XML_Parse_SINGLE_BYTES(g_parser, text, (int)strlen(text), XML_TRUE) + XML_Parser parser = XML_ParserCreate(NULL); + assert_true(parser != NULL); + ParserAndElementInfo parserAndElementInfos = { + parser, + info, + }; + + XML_SetStartElementHandler(parser, counting_start_element_handler); + XML_SetUserData(parser, &parserAndElementInfos); + if (_XML_Parse_SINGLE_BYTES(parser, text, (int)strlen(text), XML_TRUE) == XML_STATUS_ERROR) - xml_failure(g_parser); + xml_failure(parser); + + XML_ParserFree(parser); } END_TEST diff --git a/lib/libexpat/tests/common.c b/lib/libexpat/tests/common.c index 26d0c5473..3aea8d74d 100644 --- a/lib/libexpat/tests/common.c +++ b/lib/libexpat/tests/common.c @@ -10,7 +10,7 @@ Copyright (c) 2003 Greg Stein Copyright (c) 2005-2007 Steven Solie Copyright (c) 2005-2012 Karl Waclawek - Copyright (c) 2016-2023 Sebastian Pipping + Copyright (c) 2016-2024 Sebastian Pipping Copyright (c) 2017-2022 Rhodri James Copyright (c) 2017 Joe Orton Copyright (c) 2017 José Gutiérrez de la Concha @@ -51,6 +51,7 @@ #include "chardata.h" #include "minicheck.h" #include "common.h" +#include "handlers.h" /* Common test data */ @@ -221,30 +222,6 @@ _expect_failure(const char *text, enum XML_Error errorCode, _xml_failure(g_parser, file, lineno); } -/* Character data support for handlers, built on top of the code in - * chardata.c - */ -void XMLCALL -accumulate_characters(void *userData, const XML_Char *s, int len) { - CharData_AppendXMLChars((CharData *)userData, s, len); -} - -void XMLCALL -accumulate_attribute(void *userData, const XML_Char *name, - const XML_Char **atts) { - CharData *storage = (CharData *)userData; - UNUSED_P(name); - /* Check there are attributes to deal with */ - if (atts == NULL) - return; - - while (storage->count < 0 && atts[0] != NULL) { - /* "accumulate" the value of the first attribute we see */ - CharData_AppendXMLChars(storage, atts[1], -1); - atts += 2; - } -} - void _run_character_check(const char *text, const XML_Char *expected, const char *file, int line) { @@ -273,12 +250,6 @@ _run_attribute_check(const char *text, const XML_Char *expected, CharData_CheckXMLChars(&storage, expected); } -void XMLCALL -ext_accumulate_characters(void *userData, const XML_Char *s, int len) { - ExtTest *test_data = (ExtTest *)userData; - accumulate_characters(test_data->storage, s, len); -} - void _run_ext_character_check(const char *text, ExtTest *test_data, const XML_Char *expected, const char *file, int line) { diff --git a/lib/libexpat/tests/common.h b/lib/libexpat/tests/common.h index 52f00cc0e..bc4c7da68 100644 --- a/lib/libexpat/tests/common.h +++ b/lib/libexpat/tests/common.h @@ -10,7 +10,7 @@ Copyright (c) 2003 Greg Stein Copyright (c) 2005-2007 Steven Solie Copyright (c) 2005-2012 Karl Waclawek - Copyright (c) 2016-2023 Sebastian Pipping + Copyright (c) 2016-2024 Sebastian Pipping Copyright (c) 2017-2022 Rhodri James Copyright (c) 2017 Joe Orton Copyright (c) 2017 José Gutiérrez de la Concha @@ -111,12 +111,6 @@ extern void _expect_failure(const char *text, enum XML_Error errorCode, /* Support functions for handlers to collect up character and attribute data. */ -extern void XMLCALL accumulate_characters(void *userData, const XML_Char *s, - int len); - -extern void XMLCALL accumulate_attribute(void *userData, const XML_Char *name, - const XML_Char **atts); - extern void _run_character_check(const char *text, const XML_Char *expected, const char *file, int line); @@ -135,9 +129,6 @@ typedef struct ExtTest { CharData *storage; } ExtTest; -extern void XMLCALL ext_accumulate_characters(void *userData, const XML_Char *s, - int len); - extern void _run_ext_character_check(const char *text, ExtTest *test_data, const XML_Char *expected, const char *file, int line); diff --git a/lib/libexpat/tests/handlers.c b/lib/libexpat/tests/handlers.c index 449ada70f..0211985fe 100644 --- a/lib/libexpat/tests/handlers.c +++ b/lib/libexpat/tests/handlers.c @@ -103,7 +103,9 @@ end_element_event_handler2(void *userData, const XML_Char *name) { void XMLCALL counting_start_element_handler(void *userData, const XML_Char *name, const XML_Char **atts) { - ElementInfo *info = (ElementInfo *)userData; + ParserAndElementInfo *const parserAndElementInfos + = (ParserAndElementInfo *)userData; + ElementInfo *info = parserAndElementInfos->info; AttrInfo *attr; int count, id, i; @@ -120,12 +122,12 @@ counting_start_element_handler(void *userData, const XML_Char *name, * is possibly a little unexpected, but it is what the * documentation in expat.h tells us to expect. */ - count = XML_GetSpecifiedAttributeCount(g_parser); + count = XML_GetSpecifiedAttributeCount(parserAndElementInfos->parser); if (info->attr_count * 2 != count) { fail("Not got expected attribute count"); return; } - id = XML_GetIdAttributeIndex(g_parser); + id = XML_GetIdAttributeIndex(parserAndElementInfos->parser); if (id == -1 && info->id_name != NULL) { fail("ID not present"); return; @@ -1880,12 +1882,6 @@ accumulate_entity_decl(void *userData, const XML_Char *entityName, CharData_AppendXMLChars(storage, XCS("\n"), 1); } -void XMLCALL -accumulate_char_data(void *userData, const XML_Char *s, int len) { - CharData *const storage = (CharData *)userData; - CharData_AppendXMLChars(storage, s, len); -} - void XMLCALL accumulate_start_element(void *userData, const XML_Char *name, const XML_Char **atts) { @@ -1910,6 +1906,34 @@ accumulate_start_element(void *userData, const XML_Char *name, CharData_AppendXMLChars(storage, XCS(")\n"), 2); } +void XMLCALL +accumulate_characters(void *userData, const XML_Char *s, int len) { + CharData *const storage = (CharData *)userData; + CharData_AppendXMLChars(storage, s, len); +} + +void XMLCALL +accumulate_attribute(void *userData, const XML_Char *name, + const XML_Char **atts) { + CharData *const storage = (CharData *)userData; + UNUSED_P(name); + /* Check there are attributes to deal with */ + if (atts == NULL) + return; + + while (storage->count < 0 && atts[0] != NULL) { + /* "accumulate" the value of the first attribute we see */ + CharData_AppendXMLChars(storage, atts[1], -1); + atts += 2; + } +} + +void XMLCALL +ext_accumulate_characters(void *userData, const XML_Char *s, int len) { + ExtTest *const test_data = (ExtTest *)userData; + accumulate_characters(test_data->storage, s, len); +} + void XMLCALL checking_default_handler(void *userData, const XML_Char *s, int len) { DefaultCheck *data = (DefaultCheck *)userData; diff --git a/lib/libexpat/tests/handlers.h b/lib/libexpat/tests/handlers.h index e1f0995f7..8850bb948 100644 --- a/lib/libexpat/tests/handlers.h +++ b/lib/libexpat/tests/handlers.h @@ -92,6 +92,11 @@ typedef struct elementInfo { AttrInfo *attributes; } ElementInfo; +typedef struct StructParserAndElementInfo { + XML_Parser parser; + ElementInfo *info; +} ParserAndElementInfo; + extern void XMLCALL counting_start_element_handler(void *userData, const XML_Char *name, const XML_Char **atts); @@ -564,13 +569,19 @@ extern void XMLCALL accumulate_entity_decl( const XML_Char *systemId, const XML_Char *publicId, const XML_Char *notationName); -extern void XMLCALL accumulate_char_data(void *userData, const XML_Char *s, - int len); - extern void XMLCALL accumulate_start_element(void *userData, const XML_Char *name, const XML_Char **atts); +extern void XMLCALL accumulate_characters(void *userData, const XML_Char *s, + int len); + +extern void XMLCALL accumulate_attribute(void *userData, const XML_Char *name, + const XML_Char **atts); + +extern void XMLCALL ext_accumulate_characters(void *userData, const XML_Char *s, + int len); + typedef struct default_check { const XML_Char *expected; const int expectedLen; diff --git a/lib/libexpat/tests/misc_tests.c b/lib/libexpat/tests/misc_tests.c index 2ee9320b1..9afe0922d 100644 --- a/lib/libexpat/tests/misc_tests.c +++ b/lib/libexpat/tests/misc_tests.c @@ -208,7 +208,7 @@ START_TEST(test_misc_version) { if (! versions_equal(&read_version, &parsed_version)) fail("Version mismatch"); - if (xcstrcmp(version_text, XCS("expat_2.6.3"))) /* needs bump on releases */ + if (xcstrcmp(version_text, XCS("expat_2.6.4"))) /* needs bump on releases */ fail("XML_*_VERSION in expat.h out of sync?\n"); } END_TEST @@ -332,14 +332,15 @@ START_TEST(test_misc_deny_internal_entity_closing_doctype_issue_317) { "'>\n" "\n" "%e;"; - const char *const inputTwo = "'>\n" - "\n" - "%e2;"; + const char *const inputTwo + = "'>\n" + "\n" + "%e2;"; const char *const inputThree = "\n" "\n" - "%e;"; + "%e;/>"; const char *const inputIssue317 = "\n" "Hell'>\n" @@ -447,7 +448,7 @@ START_TEST(test_misc_general_entities_support) { XML_SetExternalEntityRefHandler(parser, external_entity_failer__if_not_xml_ge); XML_SetEntityDeclHandler(parser, accumulate_entity_decl); - XML_SetCharacterDataHandler(parser, accumulate_char_data); + XML_SetCharacterDataHandler(parser, accumulate_characters); if (_XML_Parse_SINGLE_BYTES(parser, doc, (int)strlen(doc), XML_TRUE) != XML_STATUS_OK) { @@ -496,6 +497,28 @@ START_TEST(test_misc_char_handler_stop_without_leak) { } END_TEST +START_TEST(test_misc_resumeparser_not_crashing) { + XML_Parser parser = XML_ParserCreate(NULL); + XML_GetBuffer(parser, 1); + XML_StopParser(parser, /*resumable=*/XML_TRUE); + XML_ResumeParser(parser); // could crash here, previously + XML_ParserFree(parser); +} +END_TEST + +START_TEST(test_misc_stopparser_rejects_unstarted_parser) { + const XML_Bool cases[] = {XML_TRUE, XML_FALSE}; + for (size_t i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) { + const XML_Bool resumable = cases[i]; + XML_Parser parser = XML_ParserCreate(NULL); + assert_true(XML_GetErrorCode(parser) == XML_ERROR_NONE); + assert_true(XML_StopParser(parser, resumable) == XML_STATUS_ERROR); + assert_true(XML_GetErrorCode(parser) == XML_ERROR_NOT_STARTED); + XML_ParserFree(parser); + } +} +END_TEST + void make_miscellaneous_test_case(Suite *s) { TCase *tc_misc = tcase_create("miscellaneous tests"); @@ -520,4 +543,6 @@ make_miscellaneous_test_case(Suite *s) { test_misc_create_external_entity_parser_with_null_context); tcase_add_test(tc_misc, test_misc_general_entities_support); tcase_add_test(tc_misc, test_misc_char_handler_stop_without_leak); + tcase_add_test(tc_misc, test_misc_resumeparser_not_crashing); + tcase_add_test(tc_misc, test_misc_stopparser_rejects_unstarted_parser); } diff --git a/lib/libkeynote/base64.c b/lib/libkeynote/base64.c index 5f8ce7bef..bbc1d0020 100644 --- a/lib/libkeynote/base64.c +++ b/lib/libkeynote/base64.c @@ -1,4 +1,4 @@ -/* $OpenBSD: base64.c,v 1.12 2023/04/13 18:20:21 tb Exp $ */ +/* $OpenBSD: base64.c,v 1.13 2024/10/22 22:33:06 jsg Exp $ */ /* * The author of this code is Angelos D. Keromytis (angelos@dsl.cis.upenn.edu) * diff --git a/lib/libssl/bytestring.h b/lib/libssl/bytestring.h index b9e95a043..1d871e023 100644 --- a/lib/libssl/bytestring.h +++ b/lib/libssl/bytestring.h @@ -1,4 +1,4 @@ -/* $OpenBSD: bytestring.h,v 1.25 2024/06/22 15:25:06 jsing Exp $ */ +/* $OpenBSD: bytestring.h,v 1.26 2024/12/05 19:57:37 tb Exp $ */ /* * Copyright (c) 2014, Google Inc. * diff --git a/lib/libssl/man/SSL_set_shutdown.3 b/lib/libssl/man/SSL_set_shutdown.3 index 678086f88..ef8c004f7 100644 --- a/lib/libssl/man/SSL_set_shutdown.3 +++ b/lib/libssl/man/SSL_set_shutdown.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: SSL_set_shutdown.3,v 1.6 2021/06/11 19:41:39 jmc Exp $ +.\" $OpenBSD: SSL_set_shutdown.3,v 1.7 2024/12/19 06:45:21 jmc Exp $ .\" OpenSSL b97fdb57 Nov 11 09:33:09 2016 +0100 .\" .\" This file was written by Lutz Jaenicke . @@ -48,7 +48,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED .\" OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: June 11 2021 $ +.Dd $Mdocdate: December 19 2024 $ .Dt SSL_SET_SHUTDOWN 3 .Os .Sh NAME @@ -82,7 +82,7 @@ A shutdown alert was sent to the peer; the connection is being considered closed and the session is closed and correct. .It Dv SSL_RECEIVED_SHUTDOWN -A shutdown alert was received form the peer, either a normal +A shutdown alert was received from the peer, either a normal .Dq close notify or a fatal error. .El diff --git a/lib/libssl/ssl.h b/lib/libssl/ssl.h index cf8c051ba..650131a77 100644 --- a/lib/libssl/ssl.h +++ b/lib/libssl/ssl.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ssl.h,v 1.244 2024/10/09 10:27:52 tb Exp $ */ +/* $OpenBSD: ssl.h,v 1.245 2024/10/23 01:57:19 jsg Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -187,19 +187,13 @@ extern "C" { /* VRS Additional Kerberos5 entries */ -#define SSL_TXT_KRB5_DES_64_CBC_SHA SSL3_TXT_KRB5_DES_64_CBC_SHA -#define SSL_TXT_KRB5_DES_192_CBC3_SHA SSL3_TXT_KRB5_DES_192_CBC3_SHA #define SSL_TXT_KRB5_RC4_128_SHA SSL3_TXT_KRB5_RC4_128_SHA #define SSL_TXT_KRB5_IDEA_128_CBC_SHA SSL3_TXT_KRB5_IDEA_128_CBC_SHA -#define SSL_TXT_KRB5_DES_64_CBC_MD5 SSL3_TXT_KRB5_DES_64_CBC_MD5 -#define SSL_TXT_KRB5_DES_192_CBC3_MD5 SSL3_TXT_KRB5_DES_192_CBC3_MD5 #define SSL_TXT_KRB5_RC4_128_MD5 SSL3_TXT_KRB5_RC4_128_MD5 #define SSL_TXT_KRB5_IDEA_128_CBC_MD5 SSL3_TXT_KRB5_IDEA_128_CBC_MD5 -#define SSL_TXT_KRB5_DES_40_CBC_SHA SSL3_TXT_KRB5_DES_40_CBC_SHA #define SSL_TXT_KRB5_RC2_40_CBC_SHA SSL3_TXT_KRB5_RC2_40_CBC_SHA #define SSL_TXT_KRB5_RC4_40_SHA SSL3_TXT_KRB5_RC4_40_SHA -#define SSL_TXT_KRB5_DES_40_CBC_MD5 SSL3_TXT_KRB5_DES_40_CBC_MD5 #define SSL_TXT_KRB5_RC2_40_CBC_MD5 SSL3_TXT_KRB5_RC2_40_CBC_MD5 #define SSL_TXT_KRB5_RC4_40_MD5 SSL3_TXT_KRB5_RC4_40_MD5 diff --git a/lib/libssl/tls1.h b/lib/libssl/tls1.h index 21666291f..d018fced5 100644 --- a/lib/libssl/tls1.h +++ b/lib/libssl/tls1.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tls1.h,v 1.59 2024/03/02 11:46:55 tb Exp $ */ +/* $OpenBSD: tls1.h,v 1.60 2024/10/23 01:57:19 jsg Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -747,8 +747,6 @@ SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB,(void (*)(void))cb) #define TLS_MD_CLIENT_FINISH_CONST_SIZE 15 #define TLS_MD_SERVER_FINISH_CONST "server finished" #define TLS_MD_SERVER_FINISH_CONST_SIZE 15 -#define TLS_MD_SERVER_WRITE_KEY_CONST "server write key" -#define TLS_MD_SERVER_WRITE_KEY_CONST_SIZE 16 #define TLS_MD_KEY_EXPANSION_CONST "key expansion" #define TLS_MD_KEY_EXPANSION_CONST_SIZE 13 #define TLS_MD_CLIENT_WRITE_KEY_CONST "client write key" diff --git a/lib/libtls/Symbols.list b/lib/libtls/Symbols.list index 42c039d29..ee7df862f 100644 --- a/lib/libtls/Symbols.list +++ b/lib/libtls/Symbols.list @@ -69,6 +69,7 @@ tls_init tls_load_file tls_ocsp_process_response tls_peer_cert_chain_pem +tls_peer_cert_common_name tls_peer_cert_contains_name tls_peer_cert_hash tls_peer_cert_issuer diff --git a/lib/libtls/man/tls_conn_version.3 b/lib/libtls/man/tls_conn_version.3 index 9ab6932f5..8fb30624d 100644 --- a/lib/libtls/man/tls_conn_version.3 +++ b/lib/libtls/man/tls_conn_version.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: tls_conn_version.3,v 1.10 2019/11/02 13:43:14 jsing Exp $ +.\" $OpenBSD: tls_conn_version.3,v 1.11 2024/12/10 08:42:12 tb Exp $ .\" .\" Copyright (c) 2015 Bob Beck .\" Copyright (c) 2016, 2018 Joel Sing @@ -15,7 +15,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: November 2 2019 $ +.Dd $Mdocdate: December 10 2024 $ .Dt TLS_CONN_VERSION 3 .Os .Sh NAME @@ -30,6 +30,7 @@ .Nm tls_peer_cert_chain_pem , .Nm tls_peer_cert_issuer , .Nm tls_peer_cert_subject , +.Nm tls_peer_cert_common_name , .Nm tls_peer_cert_hash , .Nm tls_peer_cert_notbefore , .Nm tls_peer_cert_notafter @@ -65,6 +66,8 @@ .Ft const char * .Fn tls_peer_cert_subject "struct tls *ctx" .Ft const char * +.Fn tls_peer_cert_common_name "struct tls *ctx" +.Ft const char * .Fn tls_peer_cert_hash "struct tls *ctx" .Ft time_t .Fn tls_peer_cert_notbefore "struct tls *ctx" @@ -133,6 +136,11 @@ corresponding to the subject of the peer certificate from returns a string corresponding to the issuer of the peer certificate from .Ar ctx . +.Fn tls_peer_cert_common_name +returns a string +corresponding to the common name of the peer certificate from +.Ar ctx +or the empty string if no common name is present. .Pp .Fn tls_peer_cert_hash returns a string @@ -209,6 +217,9 @@ appeared in .Fn tls_conn_cipher_strength appeared in .Ox 6.7 . +.Fn tls_peer_cert_common_name +appeared in +.Ox 7.7 . .Sh AUTHORS .An Bob Beck Aq Mt beck@openbsd.org .An Joel Sing Aq Mt jsing@openbsd.org diff --git a/lib/libtls/shlib_version b/lib/libtls/shlib_version index 07d08b6f1..c74b65c20 100644 --- a/lib/libtls/shlib_version +++ b/lib/libtls/shlib_version @@ -1,2 +1,2 @@ major=31 -minor=0 +minor=1 diff --git a/lib/libtls/tls.h b/lib/libtls/tls.h index 6b36886dc..5a3a6254a 100644 --- a/lib/libtls/tls.h +++ b/lib/libtls/tls.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tls.h,v 1.67 2024/08/02 15:00:01 tb Exp $ */ +/* $OpenBSD: tls.h,v 1.68 2024/12/10 08:40:30 tb Exp $ */ /* * Copyright (c) 2014 Joel Sing * @@ -200,6 +200,7 @@ int tls_close(struct tls *_ctx); int tls_peer_cert_provided(struct tls *_ctx); int tls_peer_cert_contains_name(struct tls *_ctx, const char *_name); +const char *tls_peer_cert_common_name(struct tls *_ctx); const char *tls_peer_cert_hash(struct tls *_ctx); const char *tls_peer_cert_issuer(struct tls *_ctx); const char *tls_peer_cert_subject(struct tls *_ctx); diff --git a/lib/libtls/tls_conninfo.c b/lib/libtls/tls_conninfo.c index bf525170f..8fb56c92b 100644 --- a/lib/libtls/tls_conninfo.c +++ b/lib/libtls/tls_conninfo.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tls_conninfo.c,v 1.27 2024/03/26 06:31:22 jsing Exp $ */ +/* $OpenBSD: tls_conninfo.c,v 1.28 2024/12/10 08:40:30 tb Exp $ */ /* * Copyright (c) 2015 Joel Sing * Copyright (c) 2015 Bob Beck @@ -118,6 +118,14 @@ tls_get_peer_cert_subject(struct tls *ctx, char **subject) return (0); } +static int +tls_get_peer_cert_common_name(struct tls *ctx, char **common_name) +{ + if (ctx->ssl_peer_cert == NULL) + return (-1); + return tls_get_common_name(ctx, ctx->ssl_peer_cert, NULL, common_name); +} + static int tls_get_peer_cert_times(struct tls *ctx, time_t *notbefore, time_t *notafter) @@ -158,6 +166,9 @@ tls_get_peer_cert_info(struct tls *ctx) goto err; if (tls_get_peer_cert_issuer(ctx, &ctx->conninfo->issuer) == -1) goto err; + if (tls_get_peer_cert_common_name(ctx, + &ctx->conninfo->common_name) == -1) + goto err; if (tls_get_peer_cert_times(ctx, &ctx->conninfo->notbefore, &ctx->conninfo->notafter) == -1) goto err; @@ -298,6 +309,7 @@ tls_conninfo_free(struct tls_conninfo *conninfo) free(conninfo->servername); free(conninfo->version); + free(conninfo->common_name); free(conninfo->hash); free(conninfo->issuer); free(conninfo->subject); diff --git a/lib/libtls/tls_internal.h b/lib/libtls/tls_internal.h index 5ff48ed7c..8e566a34e 100644 --- a/lib/libtls/tls_internal.h +++ b/lib/libtls/tls_internal.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tls_internal.h,v 1.85 2024/03/26 06:24:52 joshua Exp $ */ +/* $OpenBSD: tls_internal.h,v 1.86 2024/12/10 08:40:30 tb Exp $ */ /* * Copyright (c) 2014 Jeremie Courreges-Anglas * Copyright (c) 2014 Joel Sing @@ -129,6 +129,7 @@ struct tls_conninfo { int session_resumed; char *version; + char *common_name; char *hash; char *issuer; char *subject; @@ -238,6 +239,8 @@ struct tls_config *tls_config_new_internal(void); struct tls *tls_new(void); struct tls *tls_server_conn(struct tls *ctx); +int tls_get_common_name(struct tls *_ctx, X509 *_cert, const char *_in_name, + char **_out_common_name); int tls_check_name(struct tls *ctx, X509 *cert, const char *servername, int *match); int tls_configure_server(struct tls *ctx); diff --git a/lib/libtls/tls_peer.c b/lib/libtls/tls_peer.c index ec97a3083..6d63a529f 100644 --- a/lib/libtls/tls_peer.c +++ b/lib/libtls/tls_peer.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tls_peer.c,v 1.8 2017/04/10 17:11:13 jsing Exp $ */ +/* $OpenBSD: tls_peer.c,v 1.9 2024/12/10 08:40:30 tb Exp $ */ /* * Copyright (c) 2015 Joel Sing * Copyright (c) 2015 Bob Beck @@ -23,6 +23,14 @@ #include #include "tls_internal.h" +const char * +tls_peer_cert_common_name(struct tls *ctx) +{ + if (ctx->conninfo == NULL) + return (NULL); + return (ctx->conninfo->common_name); +} + const char * tls_peer_cert_hash(struct tls *ctx) { diff --git a/lib/libtls/tls_verify.c b/lib/libtls/tls_verify.c index 78f6c249c..293527838 100644 --- a/lib/libtls/tls_verify.c +++ b/lib/libtls/tls_verify.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tls_verify.c,v 1.30 2024/03/26 06:24:52 joshua Exp $ */ +/* $OpenBSD: tls_verify.c,v 1.32 2024/12/10 08:40:30 tb Exp $ */ /* * Copyright (c) 2014 Jeremie Courreges-Anglas * @@ -210,23 +210,26 @@ tls_check_subject_altname(struct tls *ctx, X509 *cert, const char *name, } static int -tls_check_common_name(struct tls *ctx, X509 *cert, const char *name, - int *cn_match) +tls_get_common_name_internal(X509 *cert, char **out_common_name, + unsigned int *out_tlserr, const char **out_errstr) { unsigned char *utf8_bytes = NULL; X509_NAME *subject_name; char *common_name = NULL; - union tls_addr addrbuf; int common_name_len; ASN1_STRING *data; int lastpos = -1; int rv = -1; - *cn_match = 0; + *out_tlserr = TLS_ERROR_UNKNOWN; + *out_errstr = "unknown"; + + free(*out_common_name); + *out_common_name = NULL; subject_name = X509_get_subject_name(cert); if (subject_name == NULL) - goto done; + goto err; lastpos = X509_NAME_get_index_by_NID(subject_name, NID_commonName, lastpos); @@ -244,10 +247,10 @@ tls_check_common_name(struct tls *ctx, X509 *cert, const char *name, * more than one CN fed to us in the subject, treating the * certificate as hostile. */ - tls_set_errorx(ctx, TLS_ERROR_UNKNOWN, - "error verifying name '%s': " + *out_tlserr = TLS_ERROR_UNKNOWN; + *out_errstr = "error getting common name: " "Certificate subject contains multiple Common Name fields, " - "probably a malicious or malformed certificate", name); + "probably a malicious or malformed certificate"; goto err; } @@ -257,10 +260,10 @@ tls_check_common_name(struct tls *ctx, X509 *cert, const char *name, * Fail if we cannot encode the CN bytes as UTF-8. */ if ((common_name_len = ASN1_STRING_to_UTF8(&utf8_bytes, data)) < 0) { - tls_set_errorx(ctx, TLS_ERROR_UNKNOWN, - "error verifying name '%s': " + *out_tlserr = TLS_ERROR_UNKNOWN; + *out_errstr = "error getting common name: " "Common Name field cannot be encoded as a UTF-8 string, " - "probably a malicious certificate", name); + "probably a malicious certificate"; goto err; } /* @@ -268,30 +271,85 @@ tls_check_common_name(struct tls *ctx, X509 *cert, const char *name, * must be between 1 and 64 bytes long. */ if (common_name_len < 1 || common_name_len > 64) { - tls_set_errorx(ctx, TLS_ERROR_UNKNOWN, - "error verifying name '%s': " + *out_tlserr = TLS_ERROR_UNKNOWN; + *out_errstr = "error getting common name: " "Common Name field has invalid length, " - "probably a malicious certificate", name); + "probably a malicious certificate"; goto err; } /* * Fail if the resulting text contains a NUL byte. */ if (memchr(utf8_bytes, 0, common_name_len) != NULL) { - tls_set_errorx(ctx, TLS_ERROR_UNKNOWN, - "error verifying name '%s': " + *out_tlserr = TLS_ERROR_UNKNOWN; + *out_errstr = "error getting common name: " "NUL byte in Common Name field, " - "probably a malicious certificate", name); + "probably a malicious certificate"; goto err; } common_name = strndup(utf8_bytes, common_name_len); if (common_name == NULL) { - tls_set_error(ctx, TLS_ERROR_OUT_OF_MEMORY, - "out of memory"); + *out_tlserr = TLS_ERROR_OUT_OF_MEMORY; + *out_errstr = "out of memory"; goto err; } + *out_common_name = common_name; + common_name = NULL; + + done: + if (*out_common_name == NULL) + *out_common_name = strdup(""); + if (*out_common_name == NULL) { + *out_tlserr = TLS_ERROR_OUT_OF_MEMORY; + *out_errstr = "out of memory"; + goto err; + } + + rv = 0; + + err: + free(utf8_bytes); + free(common_name); + return rv; +} + +int +tls_get_common_name(struct tls *ctx, X509 *cert, const char *in_name, + char **out_common_name) +{ + unsigned int errcode = TLS_ERROR_UNKNOWN; + const char *errstr = "unknown"; + + if (tls_get_common_name_internal(cert, out_common_name, &errcode, + &errstr) == -1) { + const char *name = in_name; + const char *space = " "; + + if (name == NULL) + name = space = ""; + + tls_set_errorx(ctx, errcode, "%s%s%s", name, space, errstr); + return -1; + } + + return 0; +} + +static int +tls_check_common_name(struct tls *ctx, X509 *cert, const char *name, + int *cn_match) +{ + char *common_name = NULL; + union tls_addr addrbuf; + int rv = -1; + + if (tls_get_common_name(ctx, cert, name, &common_name) == -1) + goto err; + if (strlen(common_name) == 0) + goto done; + /* * We don't want to attempt wildcard matching against IP addresses, * so perform a simple comparison here. @@ -310,7 +368,6 @@ tls_check_common_name(struct tls *ctx, X509 *cert, const char *name, rv = 0; err: - free(utf8_bytes); free(common_name); return rv; } diff --git a/lib/libutil/Symbols.map b/lib/libutil/Symbols.map index c1bac13aa..79a3f2e52 100644 --- a/lib/libutil/Symbols.map +++ b/lib/libutil/Symbols.map @@ -18,7 +18,6 @@ getptmfd; getrawpartition; ibuf_add; - ibuf_add_buf; ibuf_add_ibuf; ibuf_add_h16; ibuf_add_h32; @@ -46,8 +45,10 @@ ibuf_get_n32; ibuf_get_n64; ibuf_get_n8; + ibuf_get_string; ibuf_left; ibuf_open; + ibuf_read; ibuf_reserve; ibuf_rewind; ibuf_seek; @@ -64,26 +65,29 @@ ibuf_truncate; ibuf_write; imsg_add; - imsg_clear; imsg_close; imsg_compose; imsg_compose_ibuf; imsg_composev; imsg_create; - imsg_fd_overhead; - imsg_flush; imsg_forward; imsg_free; imsg_get; - imsg_get_ibuf; imsg_get_data; imsg_get_fd; + imsg_get_ibuf; imsg_get_id; imsg_get_len; imsg_get_pid; imsg_get_type; - imsg_init; - imsg_read; + imsgbuf_allow_fdpass; + imsgbuf_clear; + imsgbuf_flush; + imsgbuf_init; + imsgbuf_queuelen; + imsgbuf_read; + imsgbuf_set_maxsize; + imsgbuf_write; isduid; login; login_check_expire; @@ -92,8 +96,12 @@ logout; logwtmp; msgbuf_clear; - msgbuf_init; + msgbuf_free; + msgbuf_get; + msgbuf_new; + msgbuf_new_reader; msgbuf_queuelen; + msgbuf_read; msgbuf_write; ober_add_bitstring; ober_add_boolean; diff --git a/lib/libutil/ibuf_add.3 b/lib/libutil/ibuf_add.3 index fa3e2dace..358e70fae 100644 --- a/lib/libutil/ibuf_add.3 +++ b/lib/libutil/ibuf_add.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ibuf_add.3,v 1.1 2023/12/12 15:49:21 claudio Exp $ +.\" $OpenBSD: ibuf_add.3,v 1.6 2024/11/26 13:57:31 claudio Exp $ .\" .\" Copyright (c) 2023 Claudio Jeker .\" Copyright (c) 2010 Nicholas Marriott @@ -15,15 +15,15 @@ .\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING .\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: December 12 2023 $ +.Dd $Mdocdate: November 26 2024 $ .Dt IBUF_ADD 3 .Os .Sh NAME .Nm ibuf_add , -.Nm ibuf_add_ibuf , .Nm ibuf_add_h16 , .Nm ibuf_add_h32 , .Nm ibuf_add_h64 , +.Nm ibuf_add_ibuf , .Nm ibuf_add_n16 , .Nm ibuf_add_n32 , .Nm ibuf_add_n64 , @@ -47,8 +47,10 @@ .Nm ibuf_get_n32 , .Nm ibuf_get_n64 , .Nm ibuf_get_n8 , +.Nm ibuf_get_string , .Nm ibuf_left , .Nm ibuf_open , +.Nm ibuf_read , .Nm ibuf_reserve , .Nm ibuf_rewind , .Nm ibuf_seek , @@ -65,24 +67,29 @@ .Nm ibuf_truncate , .Nm ibuf_write , .Nm msgbuf_clear , -.Nm msgbuf_init , +.Nm msgbuf_free , +.Nm msgbuf_get , +.Nm msgbuf_new , +.Nm msgbuf_new_reader , .Nm msgbuf_queuelen , +.Nm msgbuf_read , .Nm msgbuf_write .Nd save buffer API for basic IO .Sh SYNOPSIS .In sys/queue.h .In imsg.h +.Fd #define IBUF_READ_SIZE 65535 .Ft int .Fn ibuf_add "struct ibuf *buf" "const void *data" "size_t len" .Ft int -.Fn ibuf_add_ibuf "struct ibuf *buf" "const struct ibuf *from" -.Ft int .Fn ibuf_add_h16 "struct ibuf *buf" "uint64_t value" .Ft int .Fn ibuf_add_h32 "struct ibuf *buf" "uint64_t value" .Ft int .Fn ibuf_add_h64 "struct ibuf *buf" "uint64_t value" .Ft int +.Fn ibuf_add_ibuf "struct ibuf *buf" "const struct ibuf *from" +.Ft int .Fn ibuf_add_n16 "struct ibuf *buf" "uint64_t value" .Ft int .Fn ibuf_add_n32 "struct ibuf *buf" "uint64_t value" @@ -128,10 +135,14 @@ .Fn ibuf_get_n64 "struct ibuf *buf" "uint64_t *value" .Ft int .Fn ibuf_get_n8 "struct ibuf *buf" "uint8_t *value" +.Ft "char *" +.Fn ibuf_get_string "struct ibuf *buf" "size_t len" .Ft size_t .Fn ibuf_left "const struct ibuf *buf" .Ft "struct ibuf *" .Fn ibuf_open "size_t len" +.Ft int +.Fn ibuf_read "int fd" "struct msgbuf *msgbuf" .Ft "void *" .Fn ibuf_reserve "struct ibuf *buf" "size_t len" .Ft void @@ -164,12 +175,21 @@ .Ft int .Fn ibuf_write "struct msgbuf *msgbuf" .Ft void -.Fn msgbuf_init "struct msgbuf *msgbuf" -.Ft void .Fn msgbuf_clear "struct msgbuf *msgbuf" +.Ft void +.Fn msgbuf_free "struct msgbuf *msgbuf" +.Ft "struct ibuf *" +.Fn msgbuf_get "struct msgbuf *msgbuf" +.Ft "struct msgbuf *" +.Fn msgbuf_new void +.Ft "struct msgbuf *" +.Fn msgbuf_new_reader "size_t hdrsz" \ + "struct ibuf *(*readhdr)(struct ibuf *, void *, int *)" "void *arg" .Ft uint32_t .Fn msgbuf_queuelen "struct msgbuf *msgbuf" .Ft int +.Fn msgbuf_read "struct msgbuf *msgbuf" +.Ft int .Fn msgbuf_write "struct msgbuf *msgbuf" .Sh DESCRIPTION The ibuf API defines functions to manipulate buffers, used for example to @@ -195,13 +215,6 @@ appends a block of data to .Fa buf . 0 is returned on success and \-1 on failure. .Pp -.Fn ibuf_add_ibuf -appends the buffer -.Fa from -to -.Fa buf . -0 is returned on success and \-1 on failure. -.Pp .Fn ibuf_add_h16 , .Fn ibuf_add_h32 , and @@ -216,6 +229,13 @@ This function checks to not overflow. 0 is returned on success and \-1 on failure. .Pp +.Fn ibuf_add_ibuf +appends the buffer +.Fa from +to +.Fa buf . +0 is returned on success and \-1 on failure. +.Pp .Fn ibuf_add_n8 , .Fn ibuf_add_n16 , .Fn ibuf_add_n32 , @@ -297,7 +317,7 @@ and spanning bytes. The returned buffer can be read using the various .Fn ibuf_get -functions . +functions. .Fn ibuf_from_ibuf duplicates the .Fa from @@ -325,7 +345,7 @@ and returns it in covering this region. The data in this buffer is only valid as long as .Fa buf -remains valid . +remains valid. There is no need to deallocate .Fa new using @@ -355,6 +375,18 @@ from converting the value from network to host byte order. 0 is returned on success and \-1 on failure. .Pp +.Fn ibuf_get_string +consumes +.Fa len +bytes from the buffer +.Fa buf +and returns the result of passing the bytes and len to +.Xr strndup 3 . +The returned pointer should be passed to +.Xr free 3 +when it is no longer needed. +On error NULL is returned. +.Pp The .Fn ibuf_open function allocates a fixed-length buffer. @@ -365,6 +397,28 @@ On success .Fn ibuf_open returns a pointer to the buffer; on failure it returns NULL. .Pp +The +.Fn ibuf_read +routine receives pending messages using +.Xr read 2 . +It calls the +.Fn readhdr +callback to obtain a +.Vt struct ibuf +of the appropriate size. +It returns 1 on success, 0 if the connection was closed and \-1 on error +and the global variable errno is set to indicate the error. +The errors +.Er EINTR +and +.Er EAGAIN +are treated as follows: +.Er EINTR +will automatically retry the read operation while +.Er EAGAIN +will be ignored with a 1 return. +The application will then retry the operation at a later stage. +.Pp .Fn ibuf_reserve is used to reserve .Fa len @@ -454,43 +508,119 @@ routine transmits as many pending buffers as possible from .Fa msgbuf using .Xr writev 2 . -It returns 1 if it succeeds, \-1 on error and 0 when no buffers were -pending or an EOF condition on the socket is detected. -Temporary resource shortages are returned with errno -.Er EAGAIN -and require the application to retry again in the future. -.Pp -The -.Fn msgbuf_init -function initializes -.Fa msgbuf -so that buffers may be appended to it. -The -.Fa fd -member should also be set directly before -.Fn msgbuf_write -is used. +It returns 0 if it succeeds, -1 on error and the global variable +.Va errno +is set to indicate the error. +The errors +.Er EINTR , +.Er EAGAIN , +and +.Er ENOBUFS +are treated as follows: +.Er EINTR +will automatically retry the write operation while the other errors are +ignored with a 0 return. +The application will then retry the operation at a later stage. .Pp .Fn msgbuf_clear empties a msgbuf, removing and discarding any queued buffers. .Pp +.Fn msgbuf_free +function frees the +.Fa msgbuf +allocated by +.Fn msgbuf_new +or +.Fn msgbuf_new_reader . +.Fn msgbuf_get +returns the next pending message. +It should be called in a loop until NULL is returned. +The ibuf returned must be freed by calling +.Fa ibuf_free . +.Pp +.Fn msgbuf_new +allocates a new message buffer structure which can be used with +.Fn ibuf_write +or +.Fn msbuf_write . +On error NULL is returned. +.Pp +.Fn msgbuf_new_reader +allocates a new message buffer structure which can additionally be used with +.Fn ibuf_read +and +.Fn msgbuf_read . +The +.Fa hdrsz +argument defines the size of the ibuf passed to the +.Fa readhdr +callback. +The +.Fa readhdr +callback parses the header and returns a new +.Vt struct ibuf +of the size of the full message. +It can take ownership of the file descriptor passed in its +.Vt "int *" +argument. +It should return NULL on error and set the global variable +.Va errno +appropriately. +The +.Fa arg +pointer is passed to the +.Fa readhdr +callback. +On error +.Fn msgbuf_new_reader +returns NULL. +.Pp .Fn msgbuf_queuelen returns the number of messages queued in .Fa msgbuf . This function returns 0 if no messages are pending for transmission. .Pp The +.Fn msgbuf_read +routine receives pending messages using +.Xr recvmsg 2 and supports file descriptor passing. +The function calls the +.Fn readhdr +callback function to get the total size of message. +It returns 1 on success, 0 if the connection was closed and \-1 on error +and the global variable errno is set to indicate the error. +The errors +.Er EINTR +and +.Er EAGAIN +are treated as follows: +.Er EINTR +will automatically retry the read operation while +.Er EAGAIN +will be ignored with a 1 return. +The application will then retry the operation at a later stage. +.Pp +The .Fn msgbuf_write routine calls .Xr sendmsg 2 to transmit buffers queued in -.Fa msgbuf . -It returns 1 if it succeeds, \-1 on error, and 0 when the queue was empty -or an EOF condition on the socket is detected. -Temporary resource shortages are returned with errno -.Er EAGAIN -and require the application to retry again in the future. +.Fa msgbuf +and supports file descriptor passing. +It returns 0 if it succeeds, -1 on error and the global variable +.Va errno +is set to indicate the error. +The errors +.Er EINTR , +.Er EAGAIN , +and +.Er ENOBUFS +are treated as follows: +.Er EINTR +will automatically retry the write operation while the other errors are +ignored with a 0 return. +The application will then retry the operation at a later stage. .Sh SEE ALSO .Xr socketpair 2 , -.Xr imsg_init 3 , +.Xr imsg_add 3 , .Xr unix 4 diff --git a/lib/libutil/imsg-buffer.c b/lib/libutil/imsg-buffer.c index d45802d8d..0ce19c3d3 100644 --- a/lib/libutil/imsg-buffer.c +++ b/lib/libutil/imsg-buffer.c @@ -1,4 +1,4 @@ -/* $OpenBSD: imsg-buffer.c,v 1.19 2024/08/26 13:57:34 claudio Exp $ */ +/* $OpenBSD: imsg-buffer.c,v 1.31 2024/11/26 13:57:31 claudio Exp $ */ /* * Copyright (c) 2023 Claudio Jeker @@ -32,25 +32,37 @@ #include "imsg.h" -static int ibuf_realloc(struct ibuf *, size_t); -static void ibuf_enqueue(struct msgbuf *, struct ibuf *); -static void ibuf_dequeue(struct msgbuf *, struct ibuf *); +struct msgbuf { + TAILQ_HEAD(, ibuf) bufs; + TAILQ_HEAD(, ibuf) rbufs; + uint32_t queued; + char *rbuf; + struct ibuf *rpmsg; + struct ibuf *(*readhdr)(struct ibuf *, void *, int *); + void *rarg; + size_t roff; + size_t hdrsize; +}; + +static void msgbuf_read_enqueue(struct msgbuf *, struct ibuf *); +static void msgbuf_enqueue(struct msgbuf *, struct ibuf *); +static void msgbuf_dequeue(struct msgbuf *, struct ibuf *); static void msgbuf_drain(struct msgbuf *, size_t); +#define IBUF_FD_MARK_ON_STACK -2 + struct ibuf * ibuf_open(size_t len) { struct ibuf *buf; - if (len == 0) { - errno = EINVAL; - return (NULL); - } if ((buf = calloc(1, sizeof(struct ibuf))) == NULL) return (NULL); - if ((buf->buf = calloc(len, 1)) == NULL) { - free(buf); - return (NULL); + if (len > 0) { + if ((buf->buf = calloc(len, 1)) == NULL) { + free(buf); + return (NULL); + } } buf->size = buf->max = len; buf->fd = -1; @@ -83,40 +95,36 @@ ibuf_dynamic(size_t len, size_t max) return (buf); } -static int -ibuf_realloc(struct ibuf *buf, size_t len) -{ - unsigned char *b; - - /* on static buffers max is eq size and so the following fails */ - if (len > SIZE_MAX - buf->wpos || buf->wpos + len > buf->max) { - errno = ERANGE; - return (-1); - } - - b = realloc(buf->buf, buf->wpos + len); - if (b == NULL) - return (-1); - memset(b + buf->size, 0, buf->wpos + len - buf->size); - buf->buf = b; - buf->size = buf->wpos + len; - - return (0); -} - void * ibuf_reserve(struct ibuf *buf, size_t len) { void *b; - if (len > SIZE_MAX - buf->wpos || buf->max == 0) { + if (len > SIZE_MAX - buf->wpos) { errno = ERANGE; return (NULL); } + if (buf->fd == IBUF_FD_MARK_ON_STACK) { + /* can not grow stack buffers */ + errno = EINVAL; + return (NULL); + } - if (buf->wpos + len > buf->size) - if (ibuf_realloc(buf, len) == -1) + if (buf->wpos + len > buf->size) { + unsigned char *nb; + + /* check if buffer is allowed to grow */ + if (buf->wpos + len > buf->max) { + errno = ERANGE; return (NULL); + } + nb = realloc(buf->buf, buf->wpos + len); + if (nb == NULL) + return (NULL); + memset(nb + buf->size, 0, buf->wpos + len - buf->size); + buf->buf = nb; + buf->size = buf->wpos + len; + } b = buf->buf + buf->wpos; buf->wpos += len; @@ -141,13 +149,6 @@ ibuf_add_ibuf(struct ibuf *buf, const struct ibuf *from) return ibuf_add(buf, ibuf_data(from), ibuf_size(from)); } -/* remove after tree is converted */ -int -ibuf_add_buf(struct ibuf *buf, const struct ibuf *from) -{ - return ibuf_add_ibuf(buf, from); -} - int ibuf_add_n8(struct ibuf *buf, uint64_t value) { @@ -355,7 +356,8 @@ ibuf_size(const struct ibuf *buf) size_t ibuf_left(const struct ibuf *buf) { - if (buf->max == 0) + /* on stack buffers have no space left */ + if (buf->fd == IBUF_FD_MARK_ON_STACK) return (0); return (buf->max - buf->wpos); } @@ -367,8 +369,8 @@ ibuf_truncate(struct ibuf *buf, size_t len) buf->wpos = buf->rpos + len; return (0); } - if (buf->max == 0) { - /* only allow to truncate down */ + if (buf->fd == IBUF_FD_MARK_ON_STACK) { + /* only allow to truncate down for stack buffers */ errno = ERANGE; return (-1); } @@ -384,7 +386,7 @@ ibuf_rewind(struct ibuf *buf) void ibuf_close(struct msgbuf *msgbuf, struct ibuf *buf) { - ibuf_enqueue(msgbuf, buf); + msgbuf_enqueue(msgbuf, buf); } void @@ -393,7 +395,7 @@ ibuf_from_buffer(struct ibuf *buf, void *data, size_t len) memset(buf, 0, sizeof(*buf)); buf->buf = data; buf->size = buf->wpos = len; - buf->fd = -1; + buf->fd = IBUF_FD_MARK_ON_STACK; } void @@ -428,6 +430,24 @@ ibuf_get_ibuf(struct ibuf *buf, size_t len, struct ibuf *new) return (0); } +int +ibuf_get_h16(struct ibuf *buf, uint16_t *value) +{ + return ibuf_get(buf, value, sizeof(*value)); +} + +int +ibuf_get_h32(struct ibuf *buf, uint32_t *value) +{ + return ibuf_get(buf, value, sizeof(*value)); +} + +int +ibuf_get_h64(struct ibuf *buf, uint64_t *value) +{ + return ibuf_get(buf, value, sizeof(*value)); +} + int ibuf_get_n8(struct ibuf *buf, uint8_t *value) { @@ -464,22 +484,21 @@ ibuf_get_n64(struct ibuf *buf, uint64_t *value) return (rv); } -int -ibuf_get_h16(struct ibuf *buf, uint16_t *value) +char * +ibuf_get_string(struct ibuf *buf, size_t len) { - return ibuf_get(buf, value, sizeof(*value)); -} + char *str; -int -ibuf_get_h32(struct ibuf *buf, uint32_t *value) -{ - return ibuf_get(buf, value, sizeof(*value)); -} + if (ibuf_size(buf) < len) { + errno = EBADMSG; + return (NULL); + } -int -ibuf_get_h64(struct ibuf *buf, uint64_t *value) -{ - return ibuf_get(buf, value, sizeof(*value)); + str = strndup(ibuf_data(buf), len); + if (str == NULL) + return (NULL); + buf->rpos += len; + return (str); } int @@ -499,9 +518,10 @@ ibuf_free(struct ibuf *buf) { if (buf == NULL) return; - if (buf->max == 0) /* if buf lives on the stack */ - abort(); /* abort before causing more harm */ - if (buf->fd != -1) + /* if buf lives on the stack abort before causing more harm */ + if (buf->fd == IBUF_FD_MARK_ON_STACK) + abort(); + if (buf->fd >= 0) close(buf->fd); freezero(buf->buf, buf->size); free(buf); @@ -510,7 +530,7 @@ ibuf_free(struct ibuf *buf) int ibuf_fd_avail(struct ibuf *buf) { - return (buf->fd != -1); + return (buf->fd >= 0); } int @@ -518,6 +538,9 @@ ibuf_fd_get(struct ibuf *buf) { int fd; + /* negative fds are internal use and equivalent to -1 */ + if (buf->fd < 0) + return (-1); fd = buf->fd; buf->fd = -1; return (fd); @@ -526,15 +549,107 @@ ibuf_fd_get(struct ibuf *buf) void ibuf_fd_set(struct ibuf *buf, int fd) { - if (buf->max == 0) /* if buf lives on the stack */ - abort(); /* abort before causing more harm */ - if (buf->fd != -1) + /* if buf lives on the stack abort before causing more harm */ + if (buf->fd == IBUF_FD_MARK_ON_STACK) + abort(); + if (buf->fd >= 0) close(buf->fd); - buf->fd = fd; + buf->fd = -1; + if (fd >= 0) + buf->fd = fd; +} + +struct msgbuf * +msgbuf_new(void) +{ + struct msgbuf *msgbuf; + + if ((msgbuf = calloc(1, sizeof(*msgbuf))) == NULL) + return (NULL); + msgbuf->queued = 0; + TAILQ_INIT(&msgbuf->bufs); + TAILQ_INIT(&msgbuf->rbufs); + + return msgbuf; +} + +struct msgbuf * +msgbuf_new_reader(size_t hdrsz, + struct ibuf *(*readhdr)(struct ibuf *, void *, int *), void *arg) +{ + struct msgbuf *msgbuf; + char *buf; + + if (hdrsz == 0 || hdrsz > IBUF_READ_SIZE / 2) { + errno = EINVAL; + return (NULL); + } + + if ((buf = malloc(IBUF_READ_SIZE)) == NULL) + return (NULL); + + msgbuf = msgbuf_new(); + if (msgbuf == NULL) { + free(buf); + return (NULL); + } + + msgbuf->rbuf = buf; + msgbuf->hdrsize = hdrsz; + msgbuf->readhdr = readhdr; + msgbuf->rarg = arg; + + return (msgbuf); +} + +void +msgbuf_free(struct msgbuf *msgbuf) +{ + if (msgbuf == NULL) + return; + msgbuf_clear(msgbuf); + free(msgbuf->rbuf); + free(msgbuf); +} + +uint32_t +msgbuf_queuelen(struct msgbuf *msgbuf) +{ + return (msgbuf->queued); +} + +void +msgbuf_clear(struct msgbuf *msgbuf) +{ + struct ibuf *buf; + + /* write side */ + while ((buf = TAILQ_FIRST(&msgbuf->bufs)) != NULL) + msgbuf_dequeue(msgbuf, buf); + msgbuf->queued = 0; + + /* read side */ + while ((buf = TAILQ_FIRST(&msgbuf->rbufs)) != NULL) { + TAILQ_REMOVE(&msgbuf->rbufs, buf, entry); + ibuf_free(buf); + } + msgbuf->roff = 0; + ibuf_free(msgbuf->rpmsg); + msgbuf->rpmsg = NULL; +} + +struct ibuf * +msgbuf_get(struct msgbuf *msgbuf) +{ + struct ibuf *buf; + + if ((buf = TAILQ_FIRST(&msgbuf->rbufs)) != NULL) + TAILQ_REMOVE(&msgbuf->rbufs, buf, entry); + return buf; } int -ibuf_write(struct msgbuf *msgbuf) +ibuf_write(int fd, struct msgbuf *msgbuf) { struct iovec iov[IOV_MAX]; struct ibuf *buf; @@ -549,63 +664,25 @@ ibuf_write(struct msgbuf *msgbuf) iov[i].iov_len = ibuf_size(buf); i++; } + if (i == 0) + return (0); /* nothing queued */ -again: - if ((n = writev(msgbuf->fd, iov, i)) == -1) { + again: + if ((n = writev(fd, iov, i)) == -1) { if (errno == EINTR) goto again; - if (errno == ENOBUFS) - errno = EAGAIN; + if (errno == EAGAIN || errno == ENOBUFS) + /* lets retry later again */ + return (0); return (-1); } - if (n == 0) { /* connection closed */ - errno = 0; - return (0); - } - msgbuf_drain(msgbuf, n); - - return (1); -} - -void -msgbuf_init(struct msgbuf *msgbuf) -{ - msgbuf->queued = 0; - msgbuf->fd = -1; - TAILQ_INIT(&msgbuf->bufs); -} - -static void -msgbuf_drain(struct msgbuf *msgbuf, size_t n) -{ - struct ibuf *buf, *next; - - for (buf = TAILQ_FIRST(&msgbuf->bufs); buf != NULL && n > 0; - buf = next) { - next = TAILQ_NEXT(buf, entry); - if (n >= ibuf_size(buf)) { - n -= ibuf_size(buf); - ibuf_dequeue(msgbuf, buf); - } else { - buf->rpos += n; - n = 0; - } - } -} - -void -msgbuf_clear(struct msgbuf *msgbuf) -{ - struct ibuf *buf; - - while ((buf = TAILQ_FIRST(&msgbuf->bufs)) != NULL) - ibuf_dequeue(msgbuf, buf); + return (0); } int -msgbuf_write(struct msgbuf *msgbuf) +msgbuf_write(int fd, struct msgbuf *msgbuf) { struct iovec iov[IOV_MAX]; struct ibuf *buf, *buf0 = NULL; @@ -633,6 +710,9 @@ msgbuf_write(struct msgbuf *msgbuf) buf0 = buf; } + if (i == 0) + return (0); /* nothing queued */ + msg.msg_iov = iov; msg.msg_iovlen = i; @@ -646,20 +726,16 @@ msgbuf_write(struct msgbuf *msgbuf) *(int *)CMSG_DATA(cmsg) = buf0->fd; } -again: - if ((n = sendmsg(msgbuf->fd, &msg, 0)) == -1) { + again: + if ((n = sendmsg(fd, &msg, 0)) == -1) { if (errno == EINTR) goto again; - if (errno == ENOBUFS) - errno = EAGAIN; + if (errno == EAGAIN || errno == ENOBUFS) + /* lets retry later again */ + return (0); return (-1); } - if (n == 0) { /* connection closed */ - errno = 0; - return (0); - } - /* * assumption: fd got sent if sendmsg sent anything * this works because fds are passed one at a time @@ -671,28 +747,209 @@ again: msgbuf_drain(msgbuf, n); - return (1); + return (0); } -uint32_t -msgbuf_queuelen(struct msgbuf *msgbuf) +static int +ibuf_read_process(struct msgbuf *msgbuf, int fd) { - return (msgbuf->queued); + struct ibuf rbuf, msg; + ssize_t sz; + + ibuf_from_buffer(&rbuf, msgbuf->rbuf, msgbuf->roff); + + do { + if (msgbuf->rpmsg == NULL) { + if (ibuf_size(&rbuf) < msgbuf->hdrsize) + break; + /* get size from header */ + ibuf_from_buffer(&msg, ibuf_data(&rbuf), + msgbuf->hdrsize); + if ((msgbuf->rpmsg = msgbuf->readhdr(&msg, + msgbuf->rarg, &fd)) == NULL) + goto fail; + } + + if (ibuf_left(msgbuf->rpmsg) <= ibuf_size(&rbuf)) + sz = ibuf_left(msgbuf->rpmsg); + else + sz = ibuf_size(&rbuf); + + /* neither call below can fail */ + if (ibuf_get_ibuf(&rbuf, sz, &msg) == -1 || + ibuf_add_ibuf(msgbuf->rpmsg, &msg) == -1) + goto fail; + + if (ibuf_left(msgbuf->rpmsg) == 0) { + msgbuf_read_enqueue(msgbuf, msgbuf->rpmsg); + msgbuf->rpmsg = NULL; + } + } while (ibuf_size(&rbuf) > 0); + + if (ibuf_size(&rbuf) > 0) + memmove(msgbuf->rbuf, ibuf_data(&rbuf), ibuf_size(&rbuf)); + msgbuf->roff = ibuf_size(&rbuf); + + if (fd != -1) + close(fd); + return (1); + + fail: + /* XXX how to properly clean up is unclear */ + if (fd != -1) + close(fd); + return (-1); +} + +int +ibuf_read(int fd, struct msgbuf *msgbuf) +{ + struct iovec iov; + ssize_t n; + + if (msgbuf->rbuf == NULL) { + errno = EINVAL; + return (-1); + } + + iov.iov_base = msgbuf->rbuf + msgbuf->roff; + iov.iov_len = IBUF_READ_SIZE - msgbuf->roff; + + again: + if ((n = readv(fd, &iov, 1)) == -1) { + if (errno == EINTR) + goto again; + if (errno == EAGAIN) + /* lets retry later again */ + return (1); + return (-1); + } + if (n == 0) /* connection closed */ + return (0); + + msgbuf->roff += n; + /* new data arrived, try to process it */ + return (ibuf_read_process(msgbuf, -1)); +} + +int +msgbuf_read(int fd, struct msgbuf *msgbuf) +{ + struct msghdr msg; + struct cmsghdr *cmsg; + union { + struct cmsghdr hdr; + char buf[CMSG_SPACE(sizeof(int) * 1)]; + } cmsgbuf; + struct iovec iov; + ssize_t n; + int fdpass = -1; + + if (msgbuf->rbuf == NULL) { + errno = EINVAL; + return (-1); + } + + memset(&msg, 0, sizeof(msg)); + memset(&cmsgbuf, 0, sizeof(cmsgbuf)); + + iov.iov_base = msgbuf->rbuf + msgbuf->roff; + iov.iov_len = IBUF_READ_SIZE - msgbuf->roff; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_control = &cmsgbuf.buf; + msg.msg_controllen = sizeof(cmsgbuf.buf); + +again: + if ((n = recvmsg(fd, &msg, 0)) == -1) { + if (errno == EINTR) + goto again; + if (errno == EMSGSIZE) + /* + * Not enough fd slots: fd passing failed, retry + * to receive the message without fd. + * imsg_get_fd() will return -1 in that case. + */ + goto again; + if (errno == EAGAIN) + /* lets retry later again */ + return (1); + return (-1); + } + if (n == 0) /* connection closed */ + return (0); + + msgbuf->roff += n; + + for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; + cmsg = CMSG_NXTHDR(&msg, cmsg)) { + if (cmsg->cmsg_level == SOL_SOCKET && + cmsg->cmsg_type == SCM_RIGHTS) { + int i, j, f; + + /* + * We only accept one file descriptor. Due to C + * padding rules, our control buffer might contain + * more than one fd, and we must close them. + */ + j = ((char *)cmsg + cmsg->cmsg_len - + (char *)CMSG_DATA(cmsg)) / sizeof(int); + for (i = 0; i < j; i++) { + f = ((int *)CMSG_DATA(cmsg))[i]; + if (i == 0) + fdpass = f; + else + close(f); + } + } + /* we do not handle other ctl data level */ + } + + /* new data arrived, try to process it */ + return (ibuf_read_process(msgbuf, fdpass)); } static void -ibuf_enqueue(struct msgbuf *msgbuf, struct ibuf *buf) +msgbuf_read_enqueue(struct msgbuf *msgbuf, struct ibuf *buf) { - if (buf->max == 0) /* if buf lives on the stack */ - abort(); /* abort before causing more harm */ + /* if buf lives on the stack abort before causing more harm */ + if (buf->fd == IBUF_FD_MARK_ON_STACK) + abort(); + TAILQ_INSERT_TAIL(&msgbuf->rbufs, buf, entry); +} + +static void +msgbuf_enqueue(struct msgbuf *msgbuf, struct ibuf *buf) +{ + /* if buf lives on the stack abort before causing more harm */ + if (buf->fd == IBUF_FD_MARK_ON_STACK) + abort(); TAILQ_INSERT_TAIL(&msgbuf->bufs, buf, entry); msgbuf->queued++; } static void -ibuf_dequeue(struct msgbuf *msgbuf, struct ibuf *buf) +msgbuf_dequeue(struct msgbuf *msgbuf, struct ibuf *buf) { TAILQ_REMOVE(&msgbuf->bufs, buf, entry); msgbuf->queued--; ibuf_free(buf); } + +static void +msgbuf_drain(struct msgbuf *msgbuf, size_t n) +{ + struct ibuf *buf, *next; + + for (buf = TAILQ_FIRST(&msgbuf->bufs); buf != NULL && n > 0; + buf = next) { + next = TAILQ_NEXT(buf, entry); + if (n >= ibuf_size(buf)) { + n -= ibuf_size(buf); + msgbuf_dequeue(msgbuf, buf); + } else { + buf->rpos += n; + n = 0; + } + } +} diff --git a/lib/libutil/imsg.c b/lib/libutil/imsg.c index ab744fcb1..95f4a6cb7 100644 --- a/lib/libutil/imsg.c +++ b/lib/libutil/imsg.c @@ -1,4 +1,4 @@ -/* $OpenBSD: imsg.c,v 1.23 2023/12/12 15:47:41 claudio Exp $ */ +/* $OpenBSD: imsg.c,v 1.38 2024/11/29 04:35:13 tb Exp $ */ /* * Copyright (c) 2023 Claudio Jeker @@ -23,164 +23,117 @@ #include #include +#include #include #include #include #include "imsg.h" -struct imsg_fd { - TAILQ_ENTRY(imsg_fd) entry; - int fd; -}; +#define IMSG_ALLOW_FDPASS 0x01 +#define IMSG_FD_MARK 0x80000000U -int imsg_fd_overhead = 0; +static struct ibuf *imsg_parse_hdr(struct ibuf *, void *, int *); -static int imsg_dequeue_fd(struct imsgbuf *); - -void -imsg_init(struct imsgbuf *imsgbuf, int fd) +int +imsgbuf_init(struct imsgbuf *imsgbuf, int fd) { - msgbuf_init(&imsgbuf->w); - memset(&imsgbuf->r, 0, sizeof(imsgbuf->r)); - imsgbuf->fd = fd; - imsgbuf->w.fd = fd; + imsgbuf->w = msgbuf_new_reader(IMSG_HEADER_SIZE, imsg_parse_hdr, + imsgbuf); + if (imsgbuf->w == NULL) + return (-1); imsgbuf->pid = getpid(); - TAILQ_INIT(&imsgbuf->fds); + imsgbuf->maxsize = MAX_IMSGSIZE; + imsgbuf->fd = fd; + imsgbuf->flags = 0; + return (0); } -ssize_t -imsg_read(struct imsgbuf *imsgbuf) +void +imsgbuf_allow_fdpass(struct imsgbuf *imsgbuf) { - struct msghdr msg; - struct cmsghdr *cmsg; - union { - struct cmsghdr hdr; - char buf[CMSG_SPACE(sizeof(int) * 1)]; - } cmsgbuf; - struct iovec iov; - ssize_t n = -1; - int fd; - struct imsg_fd *ifd; + imsgbuf->flags |= IMSG_ALLOW_FDPASS; +} - memset(&msg, 0, sizeof(msg)); - memset(&cmsgbuf, 0, sizeof(cmsgbuf)); - - iov.iov_base = imsgbuf->r.buf + imsgbuf->r.wpos; - iov.iov_len = sizeof(imsgbuf->r.buf) - imsgbuf->r.wpos; - msg.msg_iov = &iov; - msg.msg_iovlen = 1; - msg.msg_control = &cmsgbuf.buf; - msg.msg_controllen = sizeof(cmsgbuf.buf); - - if ((ifd = calloc(1, sizeof(struct imsg_fd))) == NULL) - return (-1); - -again: - if (getdtablecount() + imsg_fd_overhead + - (int)((CMSG_SPACE(sizeof(int))-CMSG_SPACE(0))/sizeof(int)) - >= getdtablesize()) { - errno = EAGAIN; - free(ifd); +int +imsgbuf_set_maxsize(struct imsgbuf *imsgbuf, uint32_t maxsize) +{ + if (maxsize < IMSG_HEADER_SIZE || maxsize & IMSG_FD_MARK) { + errno = EINVAL; return (-1); } + imsgbuf->maxsize = maxsize; + return (0); +} - if ((n = recvmsg(imsgbuf->fd, &msg, 0)) == -1) { - if (errno == EINTR) - goto again; - goto fail; +int +imsgbuf_read(struct imsgbuf *imsgbuf) +{ + if (imsgbuf->flags & IMSG_ALLOW_FDPASS) + return msgbuf_read(imsgbuf->fd, imsgbuf->w); + else + return ibuf_read(imsgbuf->fd, imsgbuf->w); +} + +int +imsgbuf_write(struct imsgbuf *imsgbuf) +{ + if (imsgbuf->flags & IMSG_ALLOW_FDPASS) + return msgbuf_write(imsgbuf->fd, imsgbuf->w); + else + return ibuf_write(imsgbuf->fd, imsgbuf->w); +} + +int +imsgbuf_flush(struct imsgbuf *imsgbuf) +{ + while (imsgbuf_queuelen(imsgbuf) > 0) { + if (imsgbuf_write(imsgbuf) == -1) + return (-1); } + return (0); +} - imsgbuf->r.wpos += n; +void +imsgbuf_clear(struct imsgbuf *imsgbuf) +{ + msgbuf_free(imsgbuf->w); + imsgbuf->w = NULL; +} - for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; - cmsg = CMSG_NXTHDR(&msg, cmsg)) { - if (cmsg->cmsg_level == SOL_SOCKET && - cmsg->cmsg_type == SCM_RIGHTS) { - int i; - int j; - - /* - * We only accept one file descriptor. Due to C - * padding rules, our control buffer might contain - * more than one fd, and we must close them. - */ - j = ((char *)cmsg + cmsg->cmsg_len - - (char *)CMSG_DATA(cmsg)) / sizeof(int); - for (i = 0; i < j; i++) { - fd = ((int *)CMSG_DATA(cmsg))[i]; - if (ifd != NULL) { - ifd->fd = fd; - TAILQ_INSERT_TAIL(&imsgbuf->fds, ifd, - entry); - ifd = NULL; - } else - close(fd); - } - } - /* we do not handle other ctl data level */ - } - -fail: - free(ifd); - return (n); +uint32_t +imsgbuf_queuelen(struct imsgbuf *imsgbuf) +{ + return msgbuf_queuelen(imsgbuf->w); } ssize_t imsg_get(struct imsgbuf *imsgbuf, struct imsg *imsg) { struct imsg m; - size_t av, left, datalen; + struct ibuf *buf; - av = imsgbuf->r.wpos; - - if (IMSG_HEADER_SIZE > av) + if ((buf = msgbuf_get(imsgbuf->w)) == NULL) return (0); - memcpy(&m.hdr, imsgbuf->r.buf, sizeof(m.hdr)); - if (m.hdr.len < IMSG_HEADER_SIZE || - m.hdr.len > MAX_IMSGSIZE) { - errno = ERANGE; + if (ibuf_get(buf, &m.hdr, sizeof(m.hdr)) == -1) return (-1); - } - if (m.hdr.len > av) - return (0); - m.fd = -1; - m.buf = NULL; - m.data = NULL; - - datalen = m.hdr.len - IMSG_HEADER_SIZE; - imsgbuf->r.rptr = imsgbuf->r.buf + IMSG_HEADER_SIZE; - if (datalen != 0) { - if ((m.buf = ibuf_open(datalen)) == NULL) - return (-1); - if (ibuf_add(m.buf, imsgbuf->r.rptr, datalen) == -1) { - /* this should never fail */ - ibuf_free(m.buf); - return (-1); - } - m.data = ibuf_data(m.buf); - } - - if (m.hdr.flags & IMSGF_HASFD) - m.fd = imsg_dequeue_fd(imsgbuf); - - if (m.hdr.len < av) { - left = av - m.hdr.len; - memmove(&imsgbuf->r.buf, imsgbuf->r.buf + m.hdr.len, left); - imsgbuf->r.wpos = left; - } else - imsgbuf->r.wpos = 0; + if (ibuf_size(buf)) + m.data = ibuf_data(buf); + else + m.data = NULL; + m.buf = buf; + m.hdr.len &= ~IMSG_FD_MARK; *imsg = m; - return (datalen + IMSG_HEADER_SIZE); + return (ibuf_size(buf) + IMSG_HEADER_SIZE); } int imsg_get_ibuf(struct imsg *imsg, struct ibuf *ibuf) { - if (imsg->buf == NULL) { + if (ibuf_size(imsg->buf) == 0) { errno = EBADMSG; return (-1); } @@ -194,7 +147,7 @@ imsg_get_data(struct imsg *imsg, void *data, size_t len) errno = EINVAL; return (-1); } - if (imsg->buf == NULL || ibuf_size(imsg->buf) != len) { + if (ibuf_size(imsg->buf) != len) { errno = EBADMSG; return (-1); } @@ -204,10 +157,7 @@ imsg_get_data(struct imsg *imsg, void *data, size_t len) int imsg_get_fd(struct imsg *imsg) { - int fd = imsg->fd; - - imsg->fd = -1; - return fd; + return ibuf_fd_get(imsg->buf); } uint32_t @@ -219,8 +169,6 @@ imsg_get_id(struct imsg *imsg) size_t imsg_get_len(struct imsg *imsg) { - if (imsg->buf == NULL) - return 0; return ibuf_size(imsg->buf); } @@ -290,14 +238,13 @@ imsg_compose_ibuf(struct imsgbuf *imsgbuf, uint32_t type, uint32_t id, struct imsg_hdr hdr; int save_errno; - if (ibuf_size(buf) + IMSG_HEADER_SIZE > MAX_IMSGSIZE) { + if (ibuf_size(buf) + IMSG_HEADER_SIZE > imsgbuf->maxsize) { errno = ERANGE; goto fail; } hdr.type = type; hdr.len = ibuf_size(buf) + IMSG_HEADER_SIZE; - hdr.flags = 0; hdr.peerid = id; if ((hdr.pid = pid) == 0) hdr.pid = imsgbuf->pid; @@ -307,8 +254,8 @@ imsg_compose_ibuf(struct imsgbuf *imsgbuf, uint32_t type, uint32_t id, if (imsg_add(hdrbuf, &hdr, sizeof(hdr)) == -1) goto fail; - ibuf_close(&imsgbuf->w, hdrbuf); - ibuf_close(&imsgbuf->w, buf); + ibuf_close(imsgbuf->w, hdrbuf); + ibuf_close(imsgbuf->w, buf); return (1); fail: @@ -326,24 +273,18 @@ int imsg_forward(struct imsgbuf *imsgbuf, struct imsg *msg) { struct ibuf *wbuf; - size_t len = 0; + size_t len; - if (msg->fd != -1) { - close(msg->fd); - msg->fd = -1; - } - - if (msg->buf != NULL) { - ibuf_rewind(msg->buf); - len = ibuf_size(msg->buf); - } + ibuf_rewind(msg->buf); + ibuf_skip(msg->buf, sizeof(msg->hdr)); + len = ibuf_size(msg->buf); if ((wbuf = imsg_create(imsgbuf, msg->hdr.type, msg->hdr.peerid, msg->hdr.pid, len)) == NULL) return (-1); - if (msg->buf != NULL) { - if (ibuf_add_buf(wbuf, msg->buf) == -1) { + if (len != 0) { + if (ibuf_add_ibuf(wbuf, msg->buf) == -1) { ibuf_free(wbuf); return (-1); } @@ -361,17 +302,16 @@ imsg_create(struct imsgbuf *imsgbuf, uint32_t type, uint32_t id, pid_t pid, struct imsg_hdr hdr; datalen += IMSG_HEADER_SIZE; - if (datalen > MAX_IMSGSIZE) { + if (datalen > imsgbuf->maxsize) { errno = ERANGE; return (NULL); } hdr.type = type; - hdr.flags = 0; hdr.peerid = id; if ((hdr.pid = pid) == 0) hdr.pid = imsgbuf->pid; - if ((wbuf = ibuf_dynamic(datalen, MAX_IMSGSIZE)) == NULL) { + if ((wbuf = ibuf_dynamic(datalen, imsgbuf->maxsize)) == NULL) { return (NULL); } if (imsg_add(wbuf, &hdr, sizeof(hdr)) == -1) @@ -394,16 +334,13 @@ imsg_add(struct ibuf *msg, const void *data, size_t datalen) void imsg_close(struct imsgbuf *imsgbuf, struct ibuf *msg) { - struct imsg_hdr *hdr; + uint32_t len; - hdr = (struct imsg_hdr *)msg->buf; - - hdr->flags &= ~IMSGF_HASFD; + len = ibuf_size(msg); if (ibuf_fd_avail(msg)) - hdr->flags |= IMSGF_HASFD; - hdr->len = ibuf_size(msg); - - ibuf_close(&imsgbuf->w, msg); + len |= IMSG_FD_MARK; + (void)ibuf_set_h32(msg, offsetof(struct imsg_hdr, len), len); + ibuf_close(imsgbuf->w, msg); } void @@ -412,37 +349,29 @@ imsg_free(struct imsg *imsg) ibuf_free(imsg->buf); } -static int -imsg_dequeue_fd(struct imsgbuf *imsgbuf) +static struct ibuf * +imsg_parse_hdr(struct ibuf *buf, void *arg, int *fd) { - int fd; - struct imsg_fd *ifd; + struct imsgbuf *imsgbuf = arg; + struct imsg_hdr hdr; + struct ibuf *b; + uint32_t len; - if ((ifd = TAILQ_FIRST(&imsgbuf->fds)) == NULL) - return (-1); + if (ibuf_get(buf, &hdr, sizeof(hdr)) == -1) + return (NULL); - fd = ifd->fd; - TAILQ_REMOVE(&imsgbuf->fds, ifd, entry); - free(ifd); + len = hdr.len & ~IMSG_FD_MARK; - return (fd); -} - -int -imsg_flush(struct imsgbuf *imsgbuf) -{ - while (imsgbuf->w.queued) - if (msgbuf_write(&imsgbuf->w) <= 0) - return (-1); - return (0); -} - -void -imsg_clear(struct imsgbuf *imsgbuf) -{ - int fd; - - msgbuf_clear(&imsgbuf->w); - while ((fd = imsg_dequeue_fd(imsgbuf)) != -1) - close(fd); + if (len < IMSG_HEADER_SIZE || len > imsgbuf->maxsize) { + errno = ERANGE; + return (NULL); + } + if ((b = ibuf_open(len)) == NULL) + return (NULL); + if (hdr.len & IMSG_FD_MARK) { + ibuf_fd_set(b, *fd); + *fd = -1; + } + + return b; } diff --git a/lib/libutil/imsg.h b/lib/libutil/imsg.h index dd47b1889..462bfc97f 100644 --- a/lib/libutil/imsg.h +++ b/lib/libutil/imsg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: imsg.h,v 1.8 2023/12/12 15:47:41 claudio Exp $ */ +/* $OpenBSD: imsg.h,v 1.19 2024/11/26 13:57:31 claudio Exp $ */ /* * Copyright (c) 2023 Claudio Jeker @@ -38,40 +38,25 @@ struct ibuf { int fd; }; -struct msgbuf { - TAILQ_HEAD(, ibuf) bufs; - uint32_t queued; - int fd; -}; +struct msgbuf; -struct ibuf_read { - unsigned char buf[IBUF_READ_SIZE]; - unsigned char *rptr; - size_t wpos; -}; - -struct imsg_fd; struct imsgbuf { - TAILQ_HEAD(, imsg_fd) fds; - struct ibuf_read r; - struct msgbuf w; - int fd; + struct msgbuf *w; pid_t pid; + uint32_t maxsize; + int fd; + int flags; }; -#define IMSGF_HASFD 1 - struct imsg_hdr { uint32_t type; - uint16_t len; - uint16_t flags; + uint32_t len; uint32_t peerid; uint32_t pid; }; struct imsg { struct imsg_hdr hdr; - int fd; void *data; struct ibuf *buf; }; @@ -82,7 +67,6 @@ struct iovec; struct ibuf *ibuf_open(size_t); struct ibuf *ibuf_dynamic(size_t, size_t); int ibuf_add(struct ibuf *, const void *, size_t); -int ibuf_add_buf(struct ibuf *, const struct ibuf *); int ibuf_add_ibuf(struct ibuf *, const struct ibuf *); int ibuf_add_zero(struct ibuf *, size_t); int ibuf_add_n8(struct ibuf *, uint64_t); @@ -119,20 +103,33 @@ int ibuf_get_n64(struct ibuf *, uint64_t *); int ibuf_get_h16(struct ibuf *, uint16_t *); int ibuf_get_h32(struct ibuf *, uint32_t *); int ibuf_get_h64(struct ibuf *, uint64_t *); +char *ibuf_get_string(struct ibuf *, size_t); int ibuf_skip(struct ibuf *, size_t); void ibuf_free(struct ibuf *); int ibuf_fd_avail(struct ibuf *); int ibuf_fd_get(struct ibuf *); void ibuf_fd_set(struct ibuf *, int); -int ibuf_write(struct msgbuf *); -void msgbuf_init(struct msgbuf *); +struct msgbuf *msgbuf_new(void); +struct msgbuf *msgbuf_new_reader(size_t, + struct ibuf *(*)(struct ibuf *, void *, int *), void *); +void msgbuf_free(struct msgbuf *); void msgbuf_clear(struct msgbuf *); uint32_t msgbuf_queuelen(struct msgbuf *); -int msgbuf_write(struct msgbuf *); +int ibuf_write(int, struct msgbuf *); +int msgbuf_write(int, struct msgbuf *); +int ibuf_read(int, struct msgbuf *); +int msgbuf_read(int, struct msgbuf *); +struct ibuf *msgbuf_get(struct msgbuf *); /* imsg.c */ -void imsg_init(struct imsgbuf *, int); -ssize_t imsg_read(struct imsgbuf *); +int imsgbuf_init(struct imsgbuf *, int); +void imsgbuf_allow_fdpass(struct imsgbuf *imsgbuf); +int imsgbuf_set_maxsize(struct imsgbuf *, uint32_t); +int imsgbuf_read(struct imsgbuf *); +int imsgbuf_write(struct imsgbuf *); +int imsgbuf_flush(struct imsgbuf *); +void imsgbuf_clear(struct imsgbuf *); +uint32_t imsgbuf_queuelen(struct imsgbuf *); ssize_t imsg_get(struct imsgbuf *, struct imsg *); int imsg_get_ibuf(struct imsg *, struct ibuf *); int imsg_get_data(struct imsg *, void *, size_t); @@ -152,7 +149,5 @@ struct ibuf *imsg_create(struct imsgbuf *, uint32_t, uint32_t, pid_t, size_t); int imsg_add(struct ibuf *, const void *, size_t); void imsg_close(struct imsgbuf *, struct ibuf *); void imsg_free(struct imsg *); -int imsg_flush(struct imsgbuf *); -void imsg_clear(struct imsgbuf *); #endif diff --git a/lib/libutil/imsg_init.3 b/lib/libutil/imsg_init.3 index d61610151..a7f9358fe 100644 --- a/lib/libutil/imsg_init.3 +++ b/lib/libutil/imsg_init.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: imsg_init.3,v 1.33 2023/12/29 11:48:47 claudio Exp $ +.\" $OpenBSD: imsg_init.3,v 1.41 2024/11/26 13:57:31 claudio Exp $ .\" .\" Copyright (c) 2023 Claudio Jeker .\" Copyright (c) 2010 Nicholas Marriott @@ -15,54 +15,45 @@ .\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING .\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: December 29 2023 $ -.Dt IMSG_INIT 3 +.Dd $Mdocdate: November 26 2024 $ +.Dt IMSG_ADD 3 .Os .Sh NAME -.Nm imsg_init , -.Nm imsg_read , +.Nm imsg_add , +.Nm imsg_close , +.Nm imsg_compose , +.Nm imsg_compose_ibuf , +.Nm imsg_composev , +.Nm imsg_create , +.Nm imsg_forward , +.Nm imsg_free , .Nm imsg_get , -.Nm imsg_get_ibuf , .Nm imsg_get_data , .Nm imsg_get_fd , +.Nm imsg_get_ibuf , .Nm imsg_get_id , +.Nm imsg_get_ibuf , .Nm imsg_get_len , .Nm imsg_get_pid , .Nm imsg_get_type , -.Nm imsg_compose , -.Nm imsg_composev , -.Nm imsg_compose_ibuf , -.Nm imsg_create , -.Nm imsg_add , -.Nm imsg_close , -.Nm imsg_forward , -.Nm imsg_free , -.Nm imsg_flush , -.Nm imsg_clear +.Nm imsgbuf_allow_fdpass , +.Nm imsgbuf_clear , +.Nm imsgbuf_flush , +.Nm imsgbuf_init , +.Nm imsgbuf_queuelen , +.Nm imsgbuf_read , +.Nm imsgbuf_set_maxsize , +.Nm imsgbuf_write .Nd IPC messaging functions .Sh SYNOPSIS .In sys/queue.h .In imsg.h +.Fd #define IMSG_HEADER_SIZE sizeof(struct imsg_hdr) +.Fd #define MAX_IMSGSIZE 16384 +.Ft int +.Fn imsg_add "struct ibuf *msg" "const void *data" "size_t datalen" .Ft void -.Fn imsg_init "struct imsgbuf *imsgbuf" "int fd" -.Ft ssize_t -.Fn imsg_read "struct imsgbuf *imsgbuf" -.Ft ssize_t -.Fn imsg_get "struct imsgbuf *imsgbuf" "struct imsg *imsg" -.Ft int -.Fn imsg_get_ibuf "struct imsg *imsg" "struct ibuf *ibuf" -.Ft int -.Fn imsg_get_data "struct imsg *imsg" "void *data" "size_t len" -.Ft int -.Fn imsg_get_fd "struct imsg *imsg" -.Ft uint32_t -.Fn imsg_get_id "struct imsg *imsg" -.Ft size_t -.Fn imsg_get_len "struct imsg *imsg" -.Ft pid_t -.Fn imsg_get_pid "struct imsg *imsg" -.Ft uint32_t -.Fn imsg_get_type "struct imsg *imsg" +.Fn imsg_close "struct imsgbuf *imsgbuf" "struct ibuf *msg" .Ft int .Fn imsg_compose "struct imsgbuf *imsgbuf" "uint32_t type" "uint32_t id" \ "pid_t pid" "int fd" "const void *data" "size_t datalen" @@ -73,17 +64,41 @@ .Fn imsg_create "struct imsgbuf *imsgbuf" "uint32_t type" "uint32_t id" \ "pid_t pid" "size_t datalen" .Ft int -.Fn imsg_add "struct ibuf *msg" "const void *data" "size_t datalen" -.Ft void -.Fn imsg_close "struct imsgbuf *imsgbuf" "struct ibuf *msg" +.Fn imsg_forward "struct imsgbuf *imsgbuf" "struct imsg *msg" .Ft void .Fn imsg_free "struct imsg *imsg" +.Ft ssize_t +.Fn imsg_get "struct imsgbuf *imsgbuf" "struct imsg *imsg" .Ft int -.Fn imsg_forward "struct imsgbuf *imsgbuf" "struct imsg *msg" +.Fn imsg_get_data "struct imsg *imsg" "void *data" "size_t len" .Ft int -.Fn imsg_flush "struct imsgbuf *imsgbuf" +.Fn imsg_get_fd "struct imsg *imsg" +.Ft int +.Fn imsg_get_ibuf "struct imsg *imsg" "struct ibuf *ibuf" +.Ft uint32_t +.Fn imsg_get_id "struct imsg *imsg" +.Ft size_t +.Fn imsg_get_len "struct imsg *imsg" +.Ft pid_t +.Fn imsg_get_pid "struct imsg *imsg" +.Ft uint32_t +.Fn imsg_get_type "struct imsg *imsg" .Ft void -.Fn imsg_clear "struct imsgbuf *imsgbuf" +.Fn imsgbuf_allow_fdpass "struct imsgbuf *imsgbuf" +.Ft void +.Fn imsgbuf_clear "struct imsgbuf *imsgbuf" +.Ft int +.Fn imsgbuf_flush "struct imsgbuf *imsgbuf" +.Ft int +.Fn imsgbuf_init "struct imsgbuf *imsgbuf" "int fd" +.Ft uint32_t +.Fn imsgbuf_queuelen "struct imsgbuf *imsgbuf" +.Ft int +.Fn imsgbuf_read "struct imsgbuf *imsgbuf" +.Ft int +.Fn imsgbuf_set_maxsize "struct imsgbuf *imsgbuf" "uint32_t maxsize" +.Ft int +.Fn imsgbuf_write "struct imsgbuf *imsgbuf" .In sys/uio.h .Ft int .Fn imsg_composev "struct imsgbuf *imsgbuf" "uint32_t type" "uint32_t id" \ @@ -101,40 +116,82 @@ different rights are required to cooperate. A program using these functions should be linked with .Em -lutil . .Pp -The basic -.Nm -structure is the -.Em imsgbuf , -which wraps a file descriptor and represents one side of a channel on which -messages are sent and received: -.Bd -literal -offset indent -struct imsgbuf { - TAILQ_HEAD(, imsg_fd) fds; - struct ibuf_read r; - struct msgbuf w; - int fd; - pid_t pid; -}; -.Ed -.Pp -.Fn imsg_init +.Fn imsgbuf_init initializes .Fa imsgbuf as one side of a channel associated with .Fa fd . The file descriptor is used to send and receive messages, but is not closed by any of the imsg functions. -An imsgbuf is initialized with the -.Em w -member as the output buffer queue, -.Em fd -with the file descriptor passed to -.Fn imsg_init -and the other members for internal use only. +It returns 0 if successful and -1 on failure. +.Pp +.Fn imsgbuf_allow_fdpass +enables file descriptor passing in both directions for this +.Fa imsgbuf . +.Pp +.Fn imsgbuf_set_maxsize +changes the default maximum imsg size from +.Dv MAX_IMSGSIZE +to +.Fa maxsize . +.Fa maxsize +must be bigger than +.Dv IMSG_HEADER_SIZE . +It returns 0 if successful and -1 on failure. .Pp The -.Fn imsg_clear +.Fn imsgbuf_clear function frees any data allocated as part of an imsgbuf. +This function does not close the file descriptor used for communication. +.Pp +The +.Fn imsgbuf_read +routine reads pending data with +.Xr recvmsg 2 +and queues it as individual messages on +.Fa imsgbuf . +It returns 1 on success, 0 if the connection is closed, or \-1 on error +and the global variable +.Va errno +is set to indicate the error. +The errors +.Er EINTR +and +.Er EAGAIN +are treated as follows. +.Er EINTR +will automatically retry the read operation while the other errors are +ignored with a 1 return. +.Pp +.Fn imsgbuf_write +writes out queued messages. +It returns 0 if it succeeds, -1 on error and the global variable +.Va errno +is set to indicate the error. +The errors +.Er EINTR , +.Er EAGAIN , +and +.Er ENOBUFS +are treated as follows. +.Er EINTR +will automatically retry the write operation while the other errors are +ignored with a 0 return. +.Pp +.Fn imsgbuf_flush +calls +.Fn imsgbuf_write +in a loop until all imsgs in the output buffer are sent. +It returns 0 if it succeeds, \-1 otherwise and the global variable +.Va errno +is set to indicate the error. +.Fn imsgbuf_flush +should not be called on non-blocking sockets since it will busy loop if the +socket is not available. +.Pp +.Fn imsgbuf_queuelen +returns the number of messages ready to be sent. +This function returns 0 if no messages are pending for transmission. .Pp .Fn imsg_create , .Fn imsg_add @@ -224,27 +281,10 @@ forwards a just received .Fa msg unaltered on .Fa imsgbuf . -Any attached file descriptor is closed. -.Pp -.Fn imsg_flush -calls -.Fn msgbuf_write -in a loop until all imsgs in the output buffer are sent. -It returns 0 if it succeeds, \-1 otherwise. -.Pp -The -.Fn imsg_read -routine reads pending data with -.Xr recvmsg 2 -and queues it as individual messages on -.Fa imsgbuf . -It returns the number of bytes read on success, or \-1 on error. -A return value of \-1 from -.Fn imsg_read -invalidates -.Fa imsgbuf , -and renders it suitable only for passing to -.Fn imsg_clear . +File descriptors are not forwarded by this function. +It is possible to call +.Fn imsg_forward +more than once per message. .Pp .Fn imsg_get fills in an individual imsg pending on @@ -280,6 +320,8 @@ returns 0. .Fn imsg_get_fd returns the file descriptor and passes the responsibility to track the descriptor back to the program. +Unclaimed file descriptors are closed by +.Fn imsg_free . .Pp .Fn imsg_get_data and @@ -325,13 +367,15 @@ case -1: case 0: /* child */ close(imsg_fds[0]); - imsg_init(&child_ibuf, imsg_fds[1]); + if (imsgbuf_init(&child_ibuf, imsg_fds[1]) == -1) + err(1, NULL); exit(child_main(&child_ibuf)); } /* parent */ close(imsg_fds[1]); -imsg_init(&parent_ibuf, imsg_fds[0]); +if (imsgbuf_init(&parent_ibuf, imsg_fds[0]) == -1) + err(1, NULL); exit(parent_main(&parent_ibuf)); .Ed .Pp @@ -364,18 +408,18 @@ or the .Xr event 3 library is used to monitor the socket file descriptor. When the socket is ready for writing, queued messages are transmitted with -.Fn msgbuf_write : +.Fn imsgbuf_write : .Bd -literal -offset indent - if ((n = msgbuf_write(&imsgbuf-\*(Gtw)) == -1 && errno != EAGAIN) { - /* handle write failure */ - } - if (n == 0) { - /* handle closed connection */ + if (imsgbuf_write(imsgbuf) == -1) { + if (errno == EPIPE) + /* handle closed connection */ + else + /* handle write failure */ } .Ed .Pp And when ready for reading, messages are first received using -.Fn imsg_read +.Fn imsgbuf_read and then extracted with .Fn imsg_get : .Bd -literal -offset indent @@ -386,11 +430,13 @@ dispatch_imsg(struct imsgbuf *imsgbuf) ssize_t n; int idata; - if ((n = imsg_read(imsgbuf)) == -1 && errno != EAGAIN) { + switch (imsgbuf_read(imsgbuf)) { + case -1: /* handle read error */ - } - if (n == 0) { + break; + case 0: /* handle closed connection */ + break; } for (;;) { diff --git a/lib/libutil/shlib_version b/lib/libutil/shlib_version index 94727e17b..a5757c1bc 100644 --- a/lib/libutil/shlib_version +++ b/lib/libutil/shlib_version @@ -1,2 +1,2 @@ -major=18 +major=20 minor=0 diff --git a/lib/libz/zconf.h b/lib/libz/zconf.h index ed924d081..ca0d597c6 100644 --- a/lib/libz/zconf.h +++ b/lib/libz/zconf.h @@ -233,10 +233,12 @@ # endif #endif -#if defined(ZLIB_CONST) && !defined(z_const) -# define z_const const -#else -# define z_const +#ifndef z_const +# ifdef ZLIB_CONST +# define z_const const +# else +# define z_const +# endif #endif #ifdef Z_SOLO diff --git a/lib/libz/zutil.h b/lib/libz/zutil.h index c8b22a9b3..8ff81c38d 100644 --- a/lib/libz/zutil.h +++ b/lib/libz/zutil.h @@ -67,7 +67,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* To be used only when the state is known to be valid */ /* common constants */ - +#if MAX_WBITS < 9 || MAX_WBITS > 15 +# error MAX_WBITS must be in 9..15 +#endif #ifndef DEF_WBITS # define DEF_WBITS MAX_WBITS #endif diff --git a/libexec/getty/subr.c b/libexec/getty/subr.c index 49b7f3d3a..8980ed4e6 100644 --- a/libexec/getty/subr.c +++ b/libexec/getty/subr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: subr.c,v 1.28 2018/06/14 23:19:27 gsoares Exp $ */ +/* $OpenBSD: subr.c,v 1.29 2024/11/09 11:22:18 miod Exp $ */ /* * Copyright (c) 1983, 1993 @@ -307,9 +307,9 @@ setflags(int n) CLR(lflag, ECHOCTL); if (DX) - SET(lflag, IXANY); - else CLR(lflag, IXANY); + else + SET(lflag, IXANY); out: tmode.c_iflag = iflag; diff --git a/libexec/security/security b/libexec/security/security index ce82d14ea..34bc70a29 100644 --- a/libexec/security/security +++ b/libexec/security/security @@ -1,6 +1,6 @@ #!/usr/bin/perl -T -# $OpenBSD: security,v 1.43 2024/06/09 18:31:17 afresh1 Exp $ +# $OpenBSD: security,v 1.44 2024/12/24 17:08:50 krw Exp $ # # Copyright (c) 2011, 2012, 2014, 2015 Ingo Schwarze # Copyright (c) 2011 Andrew Fresh @@ -902,6 +902,10 @@ sub check_disklabels { system "disklabel $disk > $filename"; backup_if_changed $filename; unlink $filename; + $filename = BACKUP_DIR . "fdisk.$disk"; + system "fdisk -v $disk > $filename"; + backup_if_changed $filename; + unlink $filename; } } diff --git a/regress/lib/libcrypto/Makefile b/regress/lib/libcrypto/Makefile index 387469853..c36e87e05 100644 --- a/regress/lib/libcrypto/Makefile +++ b/regress/lib/libcrypto/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.60 2024/10/02 14:50:58 jsing Exp $ +# $OpenBSD: Makefile,v 1.61 2024/12/13 00:03:57 beck Exp $ SUBDIR += aead SUBDIR += aes @@ -35,6 +35,7 @@ SUBDIR += ige SUBDIR += init SUBDIR += lhash SUBDIR += md +SUBDIR += mlkem SUBDIR += objects SUBDIR += pbkdf2 SUBDIR += pem diff --git a/regress/lib/libcrypto/bn/bn_convert.c b/regress/lib/libcrypto/bn/bn_convert.c index 65f014693..d12291566 100644 --- a/regress/lib/libcrypto/bn/bn_convert.c +++ b/regress/lib/libcrypto/bn/bn_convert.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bn_convert.c,v 1.6 2024/04/17 08:51:11 jsing Exp $ */ +/* $OpenBSD: bn_convert.c,v 1.9 2024/11/05 18:20:08 tb Exp $ */ /* * Copyright (c) 2023 Joel Sing * @@ -23,8 +23,6 @@ /* * Additional test coverage is needed for: * - * - BN_bn2binpad() - * - BN_bn2lebinpad() * - BN_print()/BN_print_fp() * * - Invalid inputs to {asc,dec,hex,mpi}2bn @@ -57,7 +55,7 @@ check_bin_output(size_t test_no, const char *label, const uint8_t *bin, "want %zu\n", test_no, label, out_len, bin_len); goto failure; } - if ((out = malloc(out_len)) == NULL) + if (out_len > 0 && (out = malloc(out_len)) == NULL) err(1, "malloc"); if ((ret = BN_bn2bin(bn, out)) != out_len) { fprintf(stderr, "FAIL: Test %zu %s - BN_bn2bin() returned %d, " @@ -274,7 +272,7 @@ static const struct bn_convert_test bn_convert_tests[] = { .neg = 0, .dec = "8388607", .hex = "7FFFFF", - .mpi = { 0x00, 0x00, 0x00, 0x03, 0x7f, 0xff, 0xff }, + .mpi = { 0x00, 0x00, 0x00, 0x03, 0x7f, 0xff, 0xff, }, .mpi_len = 7, }, { @@ -283,9 +281,27 @@ static const struct bn_convert_test bn_convert_tests[] = { .neg = 1, .dec = "-8388607", .hex = "-7FFFFF", - .mpi = { 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff }, + .mpi = { 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, }, .mpi_len = 7, }, + { + .bin = { 0x01, 0x02, 0x03, 0x04, }, + .bin_len = 4, + .neg = 0, + .dec = "16909060", + .hex = "01020304", + .mpi = { 0x00, 0x00, 0x00, 0x04, 0x01, 0x02, 0x03, 0x04, }, + .mpi_len = 8, + }, + { + .bin = { 0x04, 0x03, 0x02, 0x01, }, + .bin_len = 4, + .neg = 0, + .dec = "67305985", + .hex = "04030201", + .mpi = { 0x00, 0x00, 0x00, 0x04, 0x04, 0x03, 0x02, 0x01, }, + .mpi_len = 8, + }, { .bin = { 0xff, 0xff, 0xff, 0xff, }, .bin_len = 4, @@ -747,6 +763,141 @@ test_bn_hex2bn(void) return failed; } +static int +test_bn_binpad(void) +{ + const struct bn_convert_test *bct; + BIGNUM *bn = NULL; + uint8_t lebin[64]; + uint8_t buf[128]; + size_t i, j; + int ret; + int failed = 1; + + for (i = 0; i < N_BN_CONVERT_TESTS; i++) { + bct = &bn_convert_tests[i]; + + BN_free(bn); + if ((bn = BN_bin2bn(bct->bin, bct->bin_len, NULL)) == NULL) { + fprintf(stderr, "FAIL: BN_bin2bn() failed\n"); + goto failure; + } + BN_set_negative(bn, bct->neg); + + for (j = 0; j < bct->bin_len; j++) + lebin[j] = bct->bin[bct->bin_len - j - 1]; + + if ((ret = BN_bn2binpad(bn, buf, bct->bin_len)) < 0) { + fprintf(stderr, "FAIL: BN_bn2binpad() failed\n"); + goto failure; + } + if ((size_t)ret != bct->bin_len) { + fprintf(stderr, "FAIL: BN_bn2binpad() = %d, want %zu\n", + ret, bct->bin_len); + goto failure; + } + if (memcmp(buf, bct->bin, bct->bin_len) != 0) { + fprintf(stderr, "FAIL: Test %zu - output from " + "BN_bn2binpad() differs\n", i); + fprintf(stderr, "Got:\n"); + hexdump(buf, bct->bin_len); + fprintf(stderr, "Want:\n"); + hexdump(bct->bin, bct->bin_len); + goto failure; + } + if (bct->bin_len > 0) { + if ((ret = BN_bn2binpad(bn, buf, bct->bin_len - 1)) != -1) { + fprintf(stderr, "FAIL: BN_bn2binpad() succeeded " + "with truncation\n"); + goto failure; + } + } + if ((ret = BN_bn2binpad(bn, buf, 128)) < 0) { + fprintf(stderr, "FAIL: BN_bn2binpad() failed\n"); + goto failure; + } + if (ret != 128) { + fprintf(stderr, "FAIL: BN_bn2binpad() = %d, want 128\n", + ret); + goto failure; + } + if (memcmp(&buf[128 - bct->bin_len], bct->bin, bct->bin_len) != 0) { + fprintf(stderr, "FAIL: Test %zu - output from " + "BN_bn2binpad() differs\n", i); + fprintf(stderr, "Got:\n"); + hexdump(&buf[128 - bct->bin_len], bct->bin_len); + fprintf(stderr, "Want:\n"); + hexdump(bct->bin, bct->bin_len); + goto failure; + } + for (j = 0; j < 128 - bct->bin_len; j++) { + if (buf[j] != 0) { + fprintf(stderr, "FAIL: BN_bn2binpad() is not " + "zero padded\n"); + goto failure; + } + } + + if ((ret = BN_bn2lebinpad(bn, buf, bct->bin_len)) < 0) { + fprintf(stderr, "FAIL: BN_bn2lebinpad() failed\n"); + goto failure; + } + if ((size_t)ret != bct->bin_len) { + fprintf(stderr, "FAIL: BN_bn2lebinpad() = %d, want %zu\n", + ret, bct->bin_len); + goto failure; + } + if (memcmp(buf, lebin, bct->bin_len) != 0) { + fprintf(stderr, "FAIL: Test %zu - output from " + "BN_bn2lebinpad() differs\n", i); + fprintf(stderr, "Got:\n"); + hexdump(buf, bct->bin_len); + fprintf(stderr, "Want:\n"); + hexdump(lebin, bct->bin_len); + goto failure; + } + if (bct->bin_len > 0) { + if ((ret = BN_bn2lebinpad(bn, buf, bct->bin_len - 1)) != -1) { + fprintf(stderr, "FAIL: BN_bn2lebinpad() succeeded " + "with truncation\n"); + goto failure; + } + } + if ((ret = BN_bn2lebinpad(bn, buf, 128)) < 0) { + fprintf(stderr, "FAIL: BN_bn2lebinpad() failed\n"); + goto failure; + } + if (ret != 128) { + fprintf(stderr, "FAIL: BN_bn2lebinpad() = %d, want 128\n", + ret); + goto failure; + } + if (memcmp(buf, lebin, bct->bin_len) != 0) { + fprintf(stderr, "FAIL: Test %zu - output from " + "BN_bn2lebinpad() differs\n", i); + fprintf(stderr, "Got:\n"); + hexdump(buf, bct->bin_len); + fprintf(stderr, "Want:\n"); + hexdump(lebin, bct->bin_len); + goto failure; + } + for (j = bct->bin_len; j < 128; j++) { + if (buf[j] != 0) { + fprintf(stderr, "FAIL: BN_bn2lebinpad() is not " + "zero padded\n"); + goto failure; + } + } + } + + failed = 0; + + failure: + BN_free(bn); + + return failed; +} + int main(int argc, char **argv) { @@ -756,6 +907,7 @@ main(int argc, char **argv) failed |= test_bn_convert(); failed |= test_bn_dec2bn(); failed |= test_bn_hex2bn(); + failed |= test_bn_binpad(); return failed; } diff --git a/regress/lib/libcrypto/c2sp/Makefile b/regress/lib/libcrypto/c2sp/Makefile index ddeb1fd96..9b2c944ba 100644 --- a/regress/lib/libcrypto/c2sp/Makefile +++ b/regress/lib/libcrypto/c2sp/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.3 2024/09/17 06:12:06 tb Exp $ +# $OpenBSD: Makefile,v 1.4 2024/10/28 16:27:14 tb Exp $ C2SP_TESTVECTORS = /usr/local/share/c2sp-testvectors/ @@ -18,7 +18,7 @@ cctv: cctv.go OSSL_LIB = /usr/local/lib/eopenssl OSSL_INC = /usr/local/include/eopenssl -. for V in 11 32 33 +. for V in 11 32 33 34 . if exists(/usr/local/bin/eopenssl$V) PROGS += cctv-openssl$V SRCS_cctv-openssl$V = diff --git a/regress/lib/libcrypto/crypto/crypto_test.c b/regress/lib/libcrypto/crypto/crypto_test.c index 38ee2d57d..1b89b0b37 100644 --- a/regress/lib/libcrypto/crypto/crypto_test.c +++ b/regress/lib/libcrypto/crypto/crypto_test.c @@ -1,4 +1,4 @@ -/* $OpenBSD: crypto_test.c,v 1.1 2024/04/25 14:27:29 jsing Exp $ */ +/* $OpenBSD: crypto_test.c,v 1.2 2024/11/08 14:06:34 jsing Exp $ */ /* * Copyright (c) 2024 Joel Sing * @@ -17,68 +17,161 @@ #include #include +#include #include "crypto_internal.h" static int -test_ct_u8(void) +test_ct_size_t(void) { - uint8_t i, j, mask; + size_t a, b, mask; + uint8_t buf[8]; + int i, j; int failed = 1; - i = 0; + CTASSERT(sizeof(a) <= sizeof(buf)); + + for (i = 0; i < 4096; i++) { + arc4random_buf(buf, sizeof(buf)); + memcpy(&a, buf, sizeof(a)); + + if ((a != 0) != crypto_ct_ne_zero(a)) { + fprintf(stderr, "FAIL: crypto_ct_ne_zero(0x%llx) = %d, " + "want %d\n", (unsigned long long)a, + crypto_ct_ne_zero(a), a != 0); + goto failure; + } + mask = (a != 0) ? -1 : 0; + if (mask != crypto_ct_ne_zero_mask(a)) { + fprintf(stderr, "FAIL: crypto_ct_ne_zero_mask(0x%llx) = " + "0x%llx, want 0x%llx\n", (unsigned long long)a, + (unsigned long long)crypto_ct_ne_zero_mask(a), + (unsigned long long)mask); + goto failure; + } + if ((a == 0) != crypto_ct_eq_zero(a)) { + fprintf(stderr, "FAIL: crypto_ct_eq_zero(0x%llx) = %d, " + "want %d\n", (unsigned long long)a, + crypto_ct_ne_zero(a), a != 0); + goto failure; + } + mask = (a == 0) ? -1 : 0; + if (mask != crypto_ct_eq_zero_mask(a)) { + fprintf(stderr, "FAIL: crypto_ct_eq_zero_mask(0x%llx) = " + "0x%llx, want 0x%llx\n", (unsigned long long)a, + (unsigned long long)crypto_ct_ne_zero_mask(a), + (unsigned long long)mask); + goto failure; + } + + for (j = 0; j < 4096; j++) { + arc4random_buf(buf, sizeof(buf)); + memcpy(&b, buf, sizeof(b)); + + if ((a < b) != crypto_ct_lt(a, b)) { + fprintf(stderr, "FAIL: crypto_ct_lt(0x%llx, " + "0x%llx) = %d, want %d\n", + (unsigned long long)a, + (unsigned long long)b, + crypto_ct_lt(a, b), a < b); + goto failure; + } + mask = (a < b) ? -1 : 0; + if (mask != crypto_ct_lt_mask(a, b)) { + fprintf(stderr, "FAIL: crypto_ct_lt_mask(0x%llx, " + "0x%llx) = 0x%llx, want 0x%llx\n", + (unsigned long long)a, + (unsigned long long)b, + (unsigned long long)crypto_ct_lt_mask(a, b), + (unsigned long long)mask); + goto failure; + } + if ((a > b) != crypto_ct_gt(a, b)) { + fprintf(stderr, "FAIL: crypto_ct_gt(0x%llx, " + "0x%llx) = %d, want %d\n", + (unsigned long long)a, + (unsigned long long)b, + crypto_ct_gt(a, b), a > b); + goto failure; + } + mask = (a > b) ? -1 : 0; + if (mask != crypto_ct_gt_mask(a, b)) { + fprintf(stderr, "FAIL: crypto_ct_gt_mask(0x%llx, " + "0x%llx) = 0x%llx, want 0x%llx\n", + (unsigned long long)a, + (unsigned long long)b, + (unsigned long long)crypto_ct_gt_mask(a, b), + (unsigned long long)mask); + goto failure; + } + } + } + + failed = 0; + + failure: + return failed; +} + +static int +test_ct_u8(void) +{ + uint8_t a, b, mask; + int failed = 1; + + a = 0; do { - if ((i != 0) != crypto_ct_ne_zero_u8(i)) { + if ((a != 0) != crypto_ct_ne_zero_u8(a)) { fprintf(stderr, "FAIL: crypto_ct_ne_zero_u8(%d) = %d, " - "want %d\n", i, crypto_ct_ne_zero_u8(i), i != 0); + "want %d\n", a, crypto_ct_ne_zero_u8(a), a != 0); goto failure; } - mask = (i != 0) ? 0xff : 0x00; - if (mask != crypto_ct_ne_zero_mask_u8(i)) { + mask = (a != 0) ? -1 : 0; + if (mask != crypto_ct_ne_zero_mask_u8(a)) { fprintf(stderr, "FAIL: crypto_ct_ne_zero_mask_u8(%d) = %x, " - "want %x\n", i, crypto_ct_ne_zero_mask_u8(i), mask); + "want %x\n", a, crypto_ct_ne_zero_mask_u8(a), mask); goto failure; } - if ((i == 0) != crypto_ct_eq_zero_u8(i)) { + if ((a == 0) != crypto_ct_eq_zero_u8(a)) { fprintf(stderr, "FAIL: crypto_ct_eq_zero_u8(%d) = %d, " - "want %d\n", i, crypto_ct_ne_zero_u8(i), i != 0); + "want %d\n", a, crypto_ct_ne_zero_u8(a), a != 0); goto failure; } - mask = (i == 0) ? 0xff : 0x00; - if (mask != crypto_ct_eq_zero_mask_u8(i)) { + mask = (a == 0) ? -1 : 0; + if (mask != crypto_ct_eq_zero_mask_u8(a)) { fprintf(stderr, "FAIL: crypto_ct_eq_zero_mask_u8(%d) = %x, " - "want %x\n", i, crypto_ct_ne_zero_mask_u8(i), mask); + "want %x\n", a, crypto_ct_ne_zero_mask_u8(a), mask); goto failure; } - j = 0; + b = 0; do { - if ((i != j) != crypto_ct_ne_u8(i, j)) { + if ((a != b) != crypto_ct_ne_u8(a, b)) { fprintf(stderr, "FAIL: crypto_ct_ne_u8(%d, %d) = %d, " - "want %d\n", i, j, crypto_ct_ne_u8(i, j), i != j); + "want %d\n", a, b, crypto_ct_ne_u8(a, b), a != b); goto failure; } - mask = (i != j) ? 0xff : 0x00; - if (mask != crypto_ct_ne_mask_u8(i, j)) { + mask = (a != b) ? -1 : 0; + if (mask != crypto_ct_ne_mask_u8(a, b)) { fprintf(stderr, "FAIL: crypto_ct_ne_mask_u8(%d, %d) = %x, " - "want %x\n", i, j, crypto_ct_ne_mask_u8(i, j), mask); + "want %x\n", a, b, crypto_ct_ne_mask_u8(a, b), mask); goto failure; } - if ((i == j) != crypto_ct_eq_u8(i, j)) { + if ((a == b) != crypto_ct_eq_u8(a, b)) { fprintf(stderr, "FAIL: crypto_ct_eq_u8(%d, %d) = %d, " - "want %d\n", i, j, crypto_ct_eq_u8(i, j), i != j); + "want %d\n", a, b, crypto_ct_eq_u8(a, b), a != b); goto failure; } - mask = (i == j) ? 0xff : 0x00; - if (mask != crypto_ct_eq_mask_u8(i, j)) { + mask = (a == b) ? -1 : 0; + if (mask != crypto_ct_eq_mask_u8(a, b)) { fprintf(stderr, "FAIL: crypto_ct_eq_mask_u8(%d, %d) = %x, " - "want %x\n", i, j, crypto_ct_eq_mask_u8(i, j), mask); + "want %x\n", a, b, crypto_ct_eq_mask_u8(a, b), mask); goto failure; } - } while (++j != 0); - } while (++i != 0); + } while (++b != 0); + } while (++a != 0); failed = 0; @@ -91,6 +184,7 @@ main(int argc, char **argv) { int failed = 0; + failed |= test_ct_size_t(); failed |= test_ct_u8(); return failed; diff --git a/regress/lib/libcrypto/ec/Makefile b/regress/lib/libcrypto/ec/Makefile index 0826b44a2..20d2a9031 100644 --- a/regress/lib/libcrypto/ec/Makefile +++ b/regress/lib/libcrypto/ec/Makefile @@ -1,4 +1,10 @@ -# $OpenBSD: Makefile,v 1.8 2023/04/17 20:41:02 tb Exp $ +# $OpenBSD: Makefile,v 1.9 2024/11/04 09:51:51 tb Exp $ + +.ifdef EOPENSSL33 +LDADD += -Wl,-rpath,/usr/local/lib/eopenssl33 -L/usr/local/lib/eopenssl33 +CFLAGS += -I/usr/local/include/eopenssl33/ +CFLAGS += -DOPENSSL_SUPPRESS_DEPRECATED +.endif PROGS += ectest PROGS += ec_asn1_test diff --git a/regress/lib/libcrypto/ec/ec_asn1_test.c b/regress/lib/libcrypto/ec/ec_asn1_test.c index aaff4aa11..558179277 100644 --- a/regress/lib/libcrypto/ec/ec_asn1_test.c +++ b/regress/lib/libcrypto/ec/ec_asn1_test.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ec_asn1_test.c,v 1.13 2024/10/18 19:58:43 tb Exp $ */ +/* $OpenBSD: ec_asn1_test.c,v 1.31 2024/12/24 18:32:31 tb Exp $ */ /* * Copyright (c) 2017, 2021 Joel Sing * Copyright (c) 2024 Theo Buehler @@ -24,6 +24,9 @@ #include #include +/* set to 0 if/when we are going to enforce 0 <= a,b < p. */ +#define NEGATIVE_CURVE_COEFFICIENTS_ALLOWED 1 + static const uint8_t ec_secp256r1_pkparameters_named_curve[] = { 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, @@ -181,7 +184,7 @@ ec_group_pkparameters_test(const char *label, int nid, int asn1_flag, if ((bio_mem = BIO_new(BIO_s_mem())) == NULL) errx(1, "BIO_new failed for BIO_s_mem"); - if ((len = i2d_ECPKParameters_bio(bio_mem, group_a)) < 0) { + if (i2d_ECPKParameters_bio(bio_mem, group_a) < 0) { fprintf(stderr, "FAIL: i2d_ECPKParameters_bio failed\n"); goto done; } @@ -209,7 +212,7 @@ ec_group_pkparameters_test(const char *label, int nid, int asn1_flag, EC_GROUP_free(group_b); free(out); - return (failure); + return failure; } static int @@ -239,12 +242,72 @@ ec_group_pkparameters_correct_padding_test(void) sizeof(ec_secp256k1_pkparameters_parameters)); } +static EC_GROUP * +ec_group_simple_from_builtin(const EC_GROUP *group, int nid, BN_CTX *ctx) +{ + EC_GROUP *simple_group; + BIGNUM *p, *a, *b, *x, *y, *order, *cofactor; + const EC_POINT *generator; + EC_POINT *simple_generator = NULL; + + BN_CTX_start(ctx); + + if ((p = BN_CTX_get(ctx)) == NULL) + errx(1, "BN_CTX_get"); + if ((a = BN_CTX_get(ctx)) == NULL) + errx(1, "BN_CTX_get"); + if ((b = BN_CTX_get(ctx)) == NULL) + errx(1, "BN_CTX_get"); + + if ((x = BN_CTX_get(ctx)) == NULL) + errx(1, "BN_CTX_get"); + if ((y = BN_CTX_get(ctx)) == NULL) + errx(1, "BN_CTX_get"); + + if ((order = BN_CTX_get(ctx)) == NULL) + errx(1, "BN_CTX_get"); + if ((cofactor = BN_CTX_get(ctx)) == NULL) + errx(1, "BN_CTX_get"); + + if (!EC_GROUP_get_curve(group, p, a, b, ctx)) + errx(1, "EC_GROUP_get_curve"); + if (!EC_GROUP_get_order(group, order, ctx)) + errx(1, "EC_GROUP_get_order"); + if (!EC_GROUP_get_cofactor(group, cofactor, ctx)) + errx(1, "EC_GROUP_get_cofactor"); + if ((generator = EC_GROUP_get0_generator(group)) == NULL) + errx(1, "EC_GROUP_get0_generator"); + if (!EC_POINT_get_affine_coordinates(group, generator, x, y, ctx)) + errx(1, "EC_POINT_get_affine_coordinates"); + + if ((simple_group = EC_GROUP_new(EC_GFp_simple_method())) == NULL) + errx(1, "EC_GROUP_new"); + if (!EC_GROUP_set_curve(simple_group, p, a, b, ctx)) + errx(1, "EC_GROUP_set_curve"); + EC_GROUP_set_curve_name(simple_group, nid); + + if ((simple_generator = EC_POINT_new(simple_group)) == NULL) + errx(1, "EC_POINT_new"); + if (!EC_POINT_set_compressed_coordinates(simple_group, simple_generator, + x, BN_is_odd(y), ctx)) + errx(1, "EC_POINT_set_affine_coordinates"); + if (!EC_GROUP_set_generator(simple_group, simple_generator, order, + cofactor)) + errx(1, "EC_GROUP_set_generator"); + + BN_CTX_end(ctx); + + EC_POINT_free(simple_generator); + + return simple_group; +} + static int ec_group_roundtrip_curve(const EC_GROUP *group, const char *descr, int nid) { EC_GROUP *new_group = NULL; - unsigned char *der = NULL; - int der_len; + unsigned char *der = NULL, *new_der = NULL; + int der_len = 0, new_der_len = 0; const unsigned char *p; int failed = 1; @@ -256,10 +319,21 @@ ec_group_roundtrip_curve(const EC_GROUP *group, const char *descr, int nid) if ((new_group = d2i_ECPKParameters(NULL, &p, der_len)) == NULL) errx(1, "failed to deserialize %s %d", descr, nid); - if (EC_GROUP_cmp(group, new_group, NULL) != 0) { - fprintf(stderr, "FAIL: %s %d groups mismatch\n", descr, nid); + new_der = NULL; + if ((new_der_len = i2d_ECPKParameters(new_group, &new_der)) <= 0) + errx(1, "failed to serialize new %s %d", descr, nid); + + if (compare_data(__func__, der, der_len, new_der, new_der_len) == -1) { + fprintf(stderr, "FAIL: new and old der for %s %d\n", descr, nid); goto err; } + + if (EC_GROUP_method_of(group) == EC_GFp_mont_method()) { + if (EC_GROUP_cmp(group, new_group, NULL) != 0) { + fprintf(stderr, "FAIL: %s %d groups mismatch\n", descr, nid); + goto err; + } + } if (EC_GROUP_get_asn1_flag(group) != EC_GROUP_get_asn1_flag(new_group)) { fprintf(stderr, "FAIL: %s %d asn1_flag %x != %x\n", descr, nid, EC_GROUP_get_asn1_flag(group), @@ -278,17 +352,51 @@ ec_group_roundtrip_curve(const EC_GROUP *group, const char *descr, int nid) err: EC_GROUP_free(new_group); - free(der); + freezero(der, der_len); + freezero(new_der, new_der_len); return failed; } static int -ec_group_roundtrip_builtin_curve(const EC_builtin_curve *curve) +ec_group_roundtrip_group(EC_GROUP *group, int nid) { - EC_GROUP *group = NULL; int failed = 1; + if (EC_GROUP_get_asn1_flag(group) != OPENSSL_EC_NAMED_CURVE) { + fprintf(stderr, "FAIL: ASN.1 flag not set for %d\n", nid); + goto err; + } + if (EC_GROUP_get_point_conversion_form(group) != + POINT_CONVERSION_UNCOMPRESSED) { + fprintf(stderr, "FAIL: %d has point conversion form %02x\n", + nid, EC_GROUP_get_point_conversion_form(group)); + goto err; + } + + failed = 0; + + failed |= ec_group_roundtrip_curve(group, "named", nid); + + EC_GROUP_set_asn1_flag(group, 0); + failed |= ec_group_roundtrip_curve(group, "explicit", nid); + + EC_GROUP_set_point_conversion_form(group, POINT_CONVERSION_COMPRESSED); + failed |= ec_group_roundtrip_curve(group, "compressed", nid); + + EC_GROUP_set_point_conversion_form(group, POINT_CONVERSION_HYBRID); + failed |= ec_group_roundtrip_curve(group, "hybrid", nid); + + err: + return failed; +} + +static int +ec_group_roundtrip_builtin_curve(const EC_builtin_curve *curve, BN_CTX *ctx) +{ + EC_GROUP *group = NULL, *simple_group = NULL; + int failed = 0; + if ((group = EC_GROUP_new_by_curve_name(curve->nid)) == NULL) errx(1, "failed to instantiate curve %d", curve->nid); @@ -297,32 +405,21 @@ ec_group_roundtrip_builtin_curve(const EC_builtin_curve *curve) goto err; } - if (EC_GROUP_get_asn1_flag(group) != OPENSSL_EC_NAMED_CURVE) { - fprintf(stderr, "FAIL: ASN.1 flag not set for %d\n", curve->nid); - goto err; - } - if (EC_GROUP_get_point_conversion_form(group) != - POINT_CONVERSION_UNCOMPRESSED) { - fprintf(stderr, "FAIL: %d has point conversion form %02x\n", - curve->nid, EC_GROUP_get_point_conversion_form(group)); + if ((simple_group = ec_group_simple_from_builtin(group, curve->nid, + ctx)) == NULL) + errx(1, "failed to instantiate simple group %d", curve->nid); + + if (!EC_GROUP_check(group, NULL)) { + fprintf(stderr, "FAIL: EC_GROUP_check(%d) failed\n", curve->nid); goto err; } - failed = 0; - - failed |= ec_group_roundtrip_curve(group, "named", curve->nid); - - EC_GROUP_set_asn1_flag(group, 0); - failed |= ec_group_roundtrip_curve(group, "explicit", curve->nid); - - EC_GROUP_set_point_conversion_form(group, POINT_CONVERSION_COMPRESSED); - failed |= ec_group_roundtrip_curve(group, "compressed", curve->nid); - - EC_GROUP_set_point_conversion_form(group, POINT_CONVERSION_HYBRID); - failed |= ec_group_roundtrip_curve(group, "hybrid", curve->nid); + failed |= ec_group_roundtrip_group(group, curve->nid); + failed |= ec_group_roundtrip_group(simple_group, curve->nid); err: EC_GROUP_free(group); + EC_GROUP_free(simple_group); return failed; } @@ -330,19 +427,24 @@ ec_group_roundtrip_builtin_curve(const EC_builtin_curve *curve) static int ec_group_roundtrip_builtin_curves(void) { + BN_CTX *ctx = NULL; EC_builtin_curve *all_curves = NULL; size_t curve_id, ncurves; int failed = 0; + if ((ctx = BN_CTX_new()) == NULL) + errx(1, "BN_CTX_new"); + ncurves = EC_get_builtin_curves(NULL, 0); if ((all_curves = calloc(ncurves, sizeof(*all_curves))) == NULL) err(1, "calloc builtin curves"); EC_get_builtin_curves(all_curves, ncurves); for (curve_id = 0; curve_id < ncurves; curve_id++) - failed |= ec_group_roundtrip_builtin_curve(&all_curves[curve_id]); + failed |= ec_group_roundtrip_builtin_curve(&all_curves[curve_id], ctx); free(all_curves); + BN_CTX_free(ctx); return failed; } @@ -525,13 +627,8 @@ static const struct curve wei25519_3 = { .sn = "Wei25519", .p = "7fffffff" "ffffffff" "ffffffff" "ffffffff" "ffffffff" "ffffffff" "ffffffff" "ffffffed", -/* XXX - change this if we are going to enforce 0 <= a,b < p. */ -#if 0 .a = "7fffffff" "ffffffff" "ffffffff" "ffffffff" "ffffffff" "ffffffff" "ffffffff" "ffffffea", -#else - .a = "-03", -#endif .b = "41a3b6bf" "c668778e" "be2954a4" "b1df36d1" "485ecef1" "ea614295" "796e1022" "40891faa", .x = "7706c37b" "5a84128a" "3884a5d7" "1811f1b5" @@ -547,6 +644,31 @@ static const struct curve wei25519_3 = { .param_len = sizeof(ec_wei25519_3_pkparameters_parameters), }; +#if NEGATIVE_CURVE_COEFFICIENTS_ALLOWED +/* Same as wei25519_3 except for a. */ +static const struct curve wei25519_3_neg = { + .descr = "short Weierstrass 25519.-3 with negative a", + .oid = "1.3.101.108", + .sn = "Wei25519", + .p = "7fffffff" "ffffffff" "ffffffff" "ffffffff" + "ffffffff" "ffffffff" "ffffffff" "ffffffed", + .a = "-03", + .b = "41a3b6bf" "c668778e" "be2954a4" "b1df36d1" + "485ecef1" "ea614295" "796e1022" "40891faa", + .x = "7706c37b" "5a84128a" "3884a5d7" "1811f1b5" + "5da3230f" "fb17a8ab" "0b32e48d" "31a6685c", + .y = "0f60480c" "7a5c0e11" "40340adc" "79d6a2bf" + "0cb57ad0" "49d025dc" "38d80c77" "985f0329", + .order = "10000000" "00000000" "00000000" "00000000" + "14def9de" "a2f79cd6" "5812631a" "5cf5d3ed", + .cofactor = "8", + .named = ec_wei25519_pkparameters_named_curve, + .named_len = sizeof(ec_wei25519_pkparameters_named_curve), + .param = ec_wei25519_3_pkparameters_parameters, + .param_len = sizeof(ec_wei25519_3_pkparameters_parameters), +}; +#endif + /* * From draft-ietf-lwig-curve-representation-23, Appendix L.3 */ @@ -762,9 +884,10 @@ ec_group_non_builtin_curve(const struct curve *curve, const EC_METHOD *method, EC_GROUP *group = NULL, *new_group = NULL; const unsigned char *pder; unsigned char *der = NULL; +#ifndef OPENSSL_SUPPRESS_DEPRECATED long error; +#endif int der_len = 0; - int nid; int failed = 1; ERR_clear_error(); @@ -773,7 +896,7 @@ ec_group_non_builtin_curve(const struct curve *curve, const EC_METHOD *method, if ((group = ec_group_new(curve, method, ctx)) == NULL) goto err; - if ((nid = EC_GROUP_get_curve_name(group)) == NID_undef) { + if (EC_GROUP_get_curve_name(group) == NID_undef) { fprintf(stderr, "FAIL: no curve name set for %s\n", curve->descr); goto err; } @@ -831,7 +954,7 @@ ec_group_non_builtin_curve(const struct curve *curve, const EC_METHOD *method, } EC_GROUP_free(new_group); new_group = NULL; - +#ifndef OPENSSL_SUPPRESS_DEPRECATED error = ERR_get_error(); if (!curve->known_named_curve && ERR_GET_REASON(error) != EC_R_UNKNOWN_GROUP) { @@ -839,6 +962,7 @@ ec_group_non_builtin_curve(const struct curve *curve, const EC_METHOD *method, curve->descr, EC_R_UNKNOWN_GROUP, ERR_GET_REASON(error)); goto err; } +#endif ERR_clear_error(); @@ -850,12 +974,14 @@ ec_group_non_builtin_curve(const struct curve *curve, const EC_METHOD *method, goto err; } +#ifndef OPENSSL_SUPPRESS_DEPRECATED error = ERR_peek_last_error(); if (ERR_GET_REASON(error) != EC_R_PKPARAMETERS2GROUP_FAILURE) { fprintf(stderr, "FAIL: %s unexpected error: want %d, got %d\n", curve->descr, EC_R_UNKNOWN_GROUP, ERR_GET_REASON(error)); goto err; } +#endif failed = 0; @@ -888,6 +1014,11 @@ ec_group_non_builtin_curves(void) failed |= ec_group_non_builtin_curve(&wei25519_3, EC_GFp_mont_method(), ctx); failed |= ec_group_non_builtin_curve(&wei25519_3, EC_GFp_simple_method(), ctx); +#if NEGATIVE_CURVE_COEFFICIENTS_ALLOWED + failed |= ec_group_non_builtin_curve(&wei25519_3_neg, EC_GFp_mont_method(), ctx); + failed |= ec_group_non_builtin_curve(&wei25519_3_neg, EC_GFp_simple_method(), ctx); +#endif + failed |= ec_group_non_builtin_curve(&secp256k1_m, EC_GFp_mont_method(), ctx); failed |= ec_group_non_builtin_curve(&secp256k1_m, EC_GFp_simple_method(), ctx); @@ -896,6 +1027,1449 @@ ec_group_non_builtin_curves(void) return failed; } +static const struct ec_private_key { + const char *name; + size_t der_len; + uint8_t der[256]; + const char *hex; + int oct_len; + uint8_t oct[256]; +} ec_private_keys[] = { + { + .name = "secp224k1", + .der_len = 107, + .der = { + 0x30, 0x69, 0x02, 0x01, 0x01, 0x04, 0x1d, 0x00, + 0x32, 0x2b, 0x6d, 0xe3, 0x62, 0x60, 0xda, 0xb2, + 0x62, 0x0a, 0x38, 0x3e, 0xd3, 0x8c, 0x70, 0x9e, + 0x76, 0x38, 0xac, 0x26, 0x17, 0xa9, 0x00, 0xdf, + 0xfb, 0x1e, 0xf3, 0xbd, 0xa0, 0x07, 0x06, 0x05, + 0x2b, 0x81, 0x04, 0x00, 0x20, 0xa1, 0x3c, 0x03, + 0x3a, 0x00, 0x04, 0x51, 0xc4, 0x69, 0xdf, 0x2d, + 0x49, 0x7b, 0x05, 0x6c, 0x12, 0x5f, 0x9a, 0x83, + 0x51, 0x7d, 0xf3, 0x4a, 0x6c, 0xe1, 0x3a, 0xea, + 0x44, 0x35, 0x3e, 0x7a, 0xa4, 0x40, 0xdf, 0xc4, + 0x90, 0x18, 0xfc, 0x2f, 0x5d, 0x4b, 0x12, 0x37, + 0x87, 0x4d, 0x2a, 0xf8, 0xbd, 0x29, 0xfb, 0x13, + 0x34, 0xef, 0xfb, 0x04, 0xa1, 0x28, 0x7d, 0x51, + 0xbe, 0xe7, 0x0b, + }, + .hex = "0451C469DF2D497B" + "056C125F9A83517D" + "F34A6CE13AEA4435" + "3E7AA440DFC49018" + "FC2F5D4B1237874D" + "2AF8BD29FB1334EF" + "FB04A1287D51BEE7" + "0B", + .oct_len = 57, + .oct = { + 0x04, 0x51, 0xc4, 0x69, 0xdf, 0x2d, 0x49, 0x7b, + 0x05, 0x6c, 0x12, 0x5f, 0x9a, 0x83, 0x51, 0x7d, + 0xf3, 0x4a, 0x6c, 0xe1, 0x3a, 0xea, 0x44, 0x35, + 0x3e, 0x7a, 0xa4, 0x40, 0xdf, 0xc4, 0x90, 0x18, + 0xfc, 0x2f, 0x5d, 0x4b, 0x12, 0x37, 0x87, 0x4d, + 0x2a, 0xf8, 0xbd, 0x29, 0xfb, 0x13, 0x34, 0xef, + 0xfb, 0x04, 0xa1, 0x28, 0x7d, 0x51, 0xbe, 0xe7, + 0x0b, + }, + }, + { + .name = "secp224r1", + .der_len = 106, + .der = { + 0x30, 0x68, 0x02, 0x01, 0x01, 0x04, 0x1c, 0x76, + 0x9b, 0x2f, 0x62, 0xff, 0x5f, 0x84, 0x6c, 0x7e, + 0x90, 0xda, 0xfb, 0x70, 0x62, 0xc1, 0xb9, 0xa2, + 0xc9, 0xf7, 0x1b, 0x76, 0x7f, 0xbb, 0xb1, 0xd4, + 0xa4, 0xa0, 0x42, 0xa0, 0x07, 0x06, 0x05, 0x2b, + 0x81, 0x04, 0x00, 0x21, 0xa1, 0x3c, 0x03, 0x3a, + 0x00, 0x04, 0x94, 0x84, 0xb0, 0xcd, 0x65, 0xef, + 0xc5, 0x5d, 0xc9, 0xe4, 0x91, 0x71, 0xcb, 0xc7, + 0xf1, 0x8e, 0x44, 0x39, 0xc2, 0xd3, 0x07, 0xf0, + 0x6c, 0xb6, 0xef, 0x77, 0xc0, 0x84, 0x30, 0x2c, + 0xd2, 0xf2, 0xf0, 0xb5, 0xb6, 0x6f, 0x0a, 0xf4, + 0x43, 0xab, 0x5e, 0x5d, 0xd8, 0x97, 0xbf, 0xab, + 0xf4, 0x2d, 0x34, 0x25, 0xee, 0x4c, 0xec, 0xfb, + 0x4d, 0x0b, + }, + .hex = "049484B0CD65EFC5" + "5DC9E49171CBC7F1" + "8E4439C2D307F06C" + "B6EF77C084302CD2" + "F2F0B5B66F0AF443" + "AB5E5DD897BFABF4" + "2D3425EE4CECFB4D" + "0B", + .oct_len = 57, + .oct = { + 0x04, 0x94, 0x84, 0xb0, 0xcd, 0x65, 0xef, 0xc5, + 0x5d, 0xc9, 0xe4, 0x91, 0x71, 0xcb, 0xc7, 0xf1, + 0x8e, 0x44, 0x39, 0xc2, 0xd3, 0x07, 0xf0, 0x6c, + 0xb6, 0xef, 0x77, 0xc0, 0x84, 0x30, 0x2c, 0xd2, + 0xf2, 0xf0, 0xb5, 0xb6, 0x6f, 0x0a, 0xf4, 0x43, + 0xab, 0x5e, 0x5d, 0xd8, 0x97, 0xbf, 0xab, 0xf4, + 0x2d, 0x34, 0x25, 0xee, 0x4c, 0xec, 0xfb, 0x4d, + 0x0b, + }, + }, + { + .name = "secp256k1", + .der_len = 118, + .der = { + 0x30, 0x74, 0x02, 0x01, 0x01, 0x04, 0x20, 0xf2, + 0xe5, 0x5c, 0x24, 0x66, 0x01, 0x2b, 0x95, 0x96, + 0xbf, 0xbd, 0x0e, 0x33, 0x3d, 0xfd, 0x8a, 0x22, + 0x79, 0x12, 0xc5, 0x93, 0x28, 0x1b, 0x74, 0x39, + 0x61, 0x80, 0x1c, 0x17, 0xb1, 0x36, 0xab, 0xa0, + 0x07, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x0a, + 0xa1, 0x44, 0x03, 0x42, 0x00, 0x04, 0x9f, 0xd2, + 0xbe, 0xcc, 0xf8, 0x00, 0xe8, 0xd0, 0x40, 0x73, + 0x11, 0xb9, 0x34, 0x76, 0x68, 0xb2, 0x6b, 0x88, + 0xea, 0xa6, 0x64, 0x37, 0xe7, 0x06, 0xdf, 0x9f, + 0x20, 0xb8, 0xc3, 0x7f, 0x9f, 0x8f, 0xbc, 0x80, + 0x65, 0xe9, 0x73, 0xcb, 0x1d, 0xa1, 0xfa, 0x34, + 0x23, 0x66, 0xb9, 0x47, 0x89, 0xe9, 0x08, 0x92, + 0x5e, 0xb5, 0x37, 0x44, 0x40, 0x1c, 0x34, 0x6c, + 0xf2, 0xdb, 0x44, 0x71, 0x26, 0xeb, + }, + .hex = "049FD2BECCF800E8" + "D0407311B9347668" + "B26B88EAA66437E7" + "06DF9F20B8C37F9F" + "8FBC8065E973CB1D" + "A1FA342366B94789" + "E908925EB5374440" + "1C346CF2DB447126" + "EB", + .oct_len = 65, + .oct = { + 0x04, 0x9f, 0xd2, 0xbe, 0xcc, 0xf8, 0x00, 0xe8, + 0xd0, 0x40, 0x73, 0x11, 0xb9, 0x34, 0x76, 0x68, + 0xb2, 0x6b, 0x88, 0xea, 0xa6, 0x64, 0x37, 0xe7, + 0x06, 0xdf, 0x9f, 0x20, 0xb8, 0xc3, 0x7f, 0x9f, + 0x8f, 0xbc, 0x80, 0x65, 0xe9, 0x73, 0xcb, 0x1d, + 0xa1, 0xfa, 0x34, 0x23, 0x66, 0xb9, 0x47, 0x89, + 0xe9, 0x08, 0x92, 0x5e, 0xb5, 0x37, 0x44, 0x40, + 0x1c, 0x34, 0x6c, 0xf2, 0xdb, 0x44, 0x71, 0x26, + 0xeb, + }, + }, + { + .name = "secp384r1", + .der_len = 167, + .der = { + 0x30, 0x81, 0xa4, 0x02, 0x01, 0x01, 0x04, 0x30, + 0xa0, 0xd3, 0x78, 0x23, 0x51, 0xe1, 0x20, 0x5c, + 0xbe, 0x84, 0x11, 0x2f, 0x82, 0x55, 0xfc, 0xd1, + 0x5d, 0xae, 0xfc, 0x72, 0x60, 0x50, 0x3c, 0x2d, + 0x70, 0xb4, 0x00, 0xe2, 0xe6, 0x0a, 0xdf, 0xc5, + 0x56, 0xe6, 0xb8, 0x69, 0xf8, 0xad, 0xf5, 0xfc, + 0x95, 0xb3, 0x5b, 0x3d, 0xda, 0x6c, 0x5f, 0x74, + 0xa0, 0x07, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, + 0x22, 0xa1, 0x64, 0x03, 0x62, 0x00, 0x04, 0xce, + 0x9a, 0x3b, 0x4b, 0x01, 0xe6, 0xc4, 0x5a, 0xfa, + 0x97, 0x03, 0xc1, 0xce, 0x18, 0xd5, 0x6c, 0x47, + 0x27, 0x4d, 0x6c, 0x9a, 0xbd, 0x47, 0xab, 0x20, + 0x0f, 0x99, 0x83, 0x19, 0x8b, 0xcb, 0x18, 0xd7, + 0xa3, 0xb2, 0xe7, 0x3b, 0xd0, 0xf1, 0xf3, 0x29, + 0xb2, 0x6d, 0x38, 0xd6, 0xcc, 0x8e, 0x5e, 0xf0, + 0xb2, 0xb9, 0xbd, 0x85, 0x2c, 0xab, 0x4b, 0xb6, + 0x9d, 0x98, 0xa1, 0xce, 0xf1, 0x8a, 0xdb, 0x92, + 0x75, 0x7d, 0xf7, 0x82, 0x4c, 0x0a, 0xc7, 0x3b, + 0x52, 0x6e, 0x97, 0xc6, 0x23, 0xc9, 0x6f, 0x3f, + 0xe5, 0xd2, 0xa2, 0x79, 0x47, 0xb0, 0x6e, 0x5f, + 0x85, 0x39, 0x94, 0x57, 0xbf, 0x54, 0x76, + }, + .hex = "04CE9A3B4B01E6C4" + "5AFA9703C1CE18D5" + "6C47274D6C9ABD47" + "AB200F9983198BCB" + "18D7A3B2E73BD0F1" + "F329B26D38D6CC8E" + "5EF0B2B9BD852CAB" + "4BB69D98A1CEF18A" + "DB92757DF7824C0A" + "C73B526E97C623C9" + "6F3FE5D2A27947B0" + "6E5F85399457BF54" + "76", + .oct_len = 97, + .oct = { + 0x04, 0xce, 0x9a, 0x3b, 0x4b, 0x01, 0xe6, 0xc4, + 0x5a, 0xfa, 0x97, 0x03, 0xc1, 0xce, 0x18, 0xd5, + 0x6c, 0x47, 0x27, 0x4d, 0x6c, 0x9a, 0xbd, 0x47, + 0xab, 0x20, 0x0f, 0x99, 0x83, 0x19, 0x8b, 0xcb, + 0x18, 0xd7, 0xa3, 0xb2, 0xe7, 0x3b, 0xd0, 0xf1, + 0xf3, 0x29, 0xb2, 0x6d, 0x38, 0xd6, 0xcc, 0x8e, + 0x5e, 0xf0, 0xb2, 0xb9, 0xbd, 0x85, 0x2c, 0xab, + 0x4b, 0xb6, 0x9d, 0x98, 0xa1, 0xce, 0xf1, 0x8a, + 0xdb, 0x92, 0x75, 0x7d, 0xf7, 0x82, 0x4c, 0x0a, + 0xc7, 0x3b, 0x52, 0x6e, 0x97, 0xc6, 0x23, 0xc9, + 0x6f, 0x3f, 0xe5, 0xd2, 0xa2, 0x79, 0x47, 0xb0, + 0x6e, 0x5f, 0x85, 0x39, 0x94, 0x57, 0xbf, 0x54, + 0x76, + }, + }, + { + .name = "secp521r1", + .der_len = 223, + .der = { + 0x30, 0x81, 0xdc, 0x02, 0x01, 0x01, 0x04, 0x42, + 0x01, 0x6e, 0xff, 0x5d, 0x18, 0x50, 0x5b, 0x09, + 0xf8, 0x38, 0x10, 0x6c, 0x54, 0x19, 0x59, 0xdb, + 0x30, 0xc5, 0x60, 0x28, 0xb1, 0x7f, 0xba, 0x22, + 0x06, 0x4d, 0x8a, 0x69, 0x53, 0xb0, 0xc5, 0x8f, + 0x17, 0x4d, 0x51, 0xc6, 0x2f, 0x41, 0x4e, 0xf0, + 0xab, 0xb4, 0x3a, 0x8f, 0x00, 0x6f, 0x32, 0xe7, + 0xe6, 0x56, 0xb7, 0xe9, 0xb1, 0xcd, 0x3a, 0x93, + 0xe6, 0x8f, 0xe6, 0x60, 0xb6, 0x80, 0xbd, 0x02, + 0xfb, 0x90, 0xa0, 0x07, 0x06, 0x05, 0x2b, 0x81, + 0x04, 0x00, 0x23, 0xa1, 0x81, 0x89, 0x03, 0x81, + 0x86, 0x00, 0x04, 0x01, 0xd2, 0xc3, 0x78, 0x41, + 0xb1, 0x86, 0x24, 0xca, 0x6d, 0x80, 0x5c, 0x97, + 0xcf, 0x96, 0xf0, 0x87, 0xb4, 0x25, 0xbe, 0x37, + 0x9a, 0xf3, 0xe5, 0x4a, 0x70, 0xd1, 0xe6, 0x36, + 0x9e, 0x69, 0xcc, 0xfb, 0x83, 0xd6, 0xa1, 0x62, + 0x6d, 0xa8, 0xe6, 0xca, 0xe7, 0x0e, 0x24, 0xe6, + 0x26, 0xcd, 0xc0, 0x0d, 0x2a, 0x01, 0x81, 0x6a, + 0xd6, 0x94, 0xf2, 0x90, 0xcd, 0x26, 0x68, 0x28, + 0x2c, 0x57, 0xd3, 0xf0, 0x37, 0x00, 0xbc, 0x5e, + 0xfa, 0xf9, 0x36, 0xcd, 0x0f, 0xeb, 0x4f, 0x82, + 0x17, 0x6a, 0xa0, 0x73, 0xd2, 0x48, 0xfc, 0xfb, + 0xf0, 0x54, 0xc3, 0x23, 0x29, 0x76, 0xc7, 0x21, + 0x98, 0x09, 0x29, 0x8b, 0xce, 0x6e, 0x6b, 0xe3, + 0x97, 0x94, 0xb2, 0x30, 0xaa, 0xf6, 0x43, 0x5c, + 0x15, 0xd7, 0xb8, 0xdb, 0x06, 0x92, 0xa8, 0x36, + 0x8f, 0x89, 0xb6, 0x39, 0x2c, 0x2c, 0x23, 0x0a, + 0xb6, 0x95, 0x9c, 0x6b, 0xce, 0xc4, 0x8e, + }, + .hex = "0401D2C37841B186" + "24CA6D805C97CF96" + "F087B425BE379AF3" + "E54A70D1E6369E69" + "CCFB83D6A1626DA8" + "E6CAE70E24E626CD" + "C00D2A01816AD694" + "F290CD2668282C57" + "D3F03700BC5EFAF9" + "36CD0FEB4F82176A" + "A073D248FCFBF054" + "C3232976C7219809" + "298BCE6E6BE39794" + "B230AAF6435C15D7" + "B8DB0692A8368F89" + "B6392C2C230AB695" + "9C6BCEC48E", + .oct_len = 133, + .oct = { + 0x04, 0x01, 0xd2, 0xc3, 0x78, 0x41, 0xb1, 0x86, + 0x24, 0xca, 0x6d, 0x80, 0x5c, 0x97, 0xcf, 0x96, + 0xf0, 0x87, 0xb4, 0x25, 0xbe, 0x37, 0x9a, 0xf3, + 0xe5, 0x4a, 0x70, 0xd1, 0xe6, 0x36, 0x9e, 0x69, + 0xcc, 0xfb, 0x83, 0xd6, 0xa1, 0x62, 0x6d, 0xa8, + 0xe6, 0xca, 0xe7, 0x0e, 0x24, 0xe6, 0x26, 0xcd, + 0xc0, 0x0d, 0x2a, 0x01, 0x81, 0x6a, 0xd6, 0x94, + 0xf2, 0x90, 0xcd, 0x26, 0x68, 0x28, 0x2c, 0x57, + 0xd3, 0xf0, 0x37, 0x00, 0xbc, 0x5e, 0xfa, 0xf9, + 0x36, 0xcd, 0x0f, 0xeb, 0x4f, 0x82, 0x17, 0x6a, + 0xa0, 0x73, 0xd2, 0x48, 0xfc, 0xfb, 0xf0, 0x54, + 0xc3, 0x23, 0x29, 0x76, 0xc7, 0x21, 0x98, 0x09, + 0x29, 0x8b, 0xce, 0x6e, 0x6b, 0xe3, 0x97, 0x94, + 0xb2, 0x30, 0xaa, 0xf6, 0x43, 0x5c, 0x15, 0xd7, + 0xb8, 0xdb, 0x06, 0x92, 0xa8, 0x36, 0x8f, 0x89, + 0xb6, 0x39, 0x2c, 0x2c, 0x23, 0x0a, 0xb6, 0x95, + 0x9c, 0x6b, 0xce, 0xc4, 0x8e, + }, + }, + { + .name = "prime239v1", + .der_len = 115, + .der = { + 0x30, 0x71, 0x02, 0x01, 0x01, 0x04, 0x1e, 0x6e, + 0x26, 0x5e, 0xde, 0x5b, 0x67, 0xd6, 0x38, 0x52, + 0xe7, 0x1e, 0x8d, 0x44, 0xb1, 0xfb, 0xf8, 0xaf, + 0xf9, 0x94, 0x2c, 0xe2, 0x0d, 0xa8, 0x5f, 0x03, + 0x67, 0x53, 0x7b, 0x8b, 0x2e, 0xa0, 0x0a, 0x06, + 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, + 0x04, 0xa1, 0x40, 0x03, 0x3e, 0x00, 0x04, 0x33, + 0xc6, 0xe5, 0x8a, 0xc1, 0x8b, 0x7c, 0x96, 0x19, + 0xc9, 0xe1, 0x54, 0x7f, 0x81, 0x9e, 0x59, 0x62, + 0xec, 0xc0, 0x1e, 0xe5, 0x53, 0xd5, 0xae, 0x6b, + 0xd3, 0xe0, 0x09, 0x07, 0xc5, 0x27, 0x81, 0xa6, + 0x8d, 0x39, 0x8e, 0xfe, 0x01, 0xc2, 0x1d, 0xda, + 0xde, 0x7b, 0xdc, 0x76, 0x27, 0x17, 0xf9, 0x6f, + 0xe3, 0x04, 0xef, 0x5d, 0x65, 0x75, 0x98, 0x7f, + 0x2d, 0xd0, 0x68, + }, + .hex = "0433C6E58AC18B7C" + "9619C9E1547F819E" + "5962ECC01EE553D5" + "AE6BD3E00907C527" + "81A68D398EFE01C2" + "1DDADE7BDC762717" + "F96FE304EF5D6575" + "987F2DD068", + .oct_len = 61, + .oct = { + 0x04, 0x33, 0xc6, 0xe5, 0x8a, 0xc1, 0x8b, 0x7c, + 0x96, 0x19, 0xc9, 0xe1, 0x54, 0x7f, 0x81, 0x9e, + 0x59, 0x62, 0xec, 0xc0, 0x1e, 0xe5, 0x53, 0xd5, + 0xae, 0x6b, 0xd3, 0xe0, 0x09, 0x07, 0xc5, 0x27, + 0x81, 0xa6, 0x8d, 0x39, 0x8e, 0xfe, 0x01, 0xc2, + 0x1d, 0xda, 0xde, 0x7b, 0xdc, 0x76, 0x27, 0x17, + 0xf9, 0x6f, 0xe3, 0x04, 0xef, 0x5d, 0x65, 0x75, + 0x98, 0x7f, 0x2d, 0xd0, 0x68, + }, + }, + { + .name = "prime239v2", + .der_len = 115, + .der = { + 0x30, 0x71, 0x02, 0x01, 0x01, 0x04, 0x1e, 0x30, + 0x2f, 0x01, 0x10, 0xe9, 0x09, 0x15, 0xdd, 0xe3, + 0xdd, 0xae, 0xcb, 0x9d, 0x3a, 0x58, 0x92, 0x02, + 0x1e, 0x6e, 0x02, 0x57, 0xa8, 0x36, 0x0b, 0x20, + 0x0b, 0x7e, 0xf4, 0xad, 0x0b, 0xa0, 0x0a, 0x06, + 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, + 0x05, 0xa1, 0x40, 0x03, 0x3e, 0x00, 0x04, 0x3c, + 0x10, 0x27, 0x7b, 0xac, 0xdf, 0x86, 0xc9, 0x4f, + 0xf8, 0x39, 0x87, 0x02, 0x39, 0xaf, 0x41, 0xbc, + 0x4b, 0x67, 0xd8, 0x5e, 0x04, 0x96, 0x84, 0xb5, + 0x60, 0x50, 0x48, 0x6a, 0x20, 0x1d, 0x2b, 0x7e, + 0x9f, 0xaf, 0xf8, 0x8e, 0x7e, 0xa4, 0xcd, 0x00, + 0xad, 0xb1, 0xad, 0x22, 0x69, 0x32, 0x10, 0x6c, + 0xe0, 0xcc, 0xdd, 0x45, 0xd8, 0xa6, 0x29, 0x2f, + 0xad, 0x6b, 0xf9, + }, + .hex = "043C10277BACDF86" + "C94FF839870239AF" + "41BC4B67D85E0496" + "84B56050486A201D" + "2B7E9FAFF88E7EA4" + "CD00ADB1AD226932" + "106CE0CCDD45D8A6" + "292FAD6BF9", + .oct_len = 61, + .oct = { + 0x04, 0x3c, 0x10, 0x27, 0x7b, 0xac, 0xdf, 0x86, + 0xc9, 0x4f, 0xf8, 0x39, 0x87, 0x02, 0x39, 0xaf, + 0x41, 0xbc, 0x4b, 0x67, 0xd8, 0x5e, 0x04, 0x96, + 0x84, 0xb5, 0x60, 0x50, 0x48, 0x6a, 0x20, 0x1d, + 0x2b, 0x7e, 0x9f, 0xaf, 0xf8, 0x8e, 0x7e, 0xa4, + 0xcd, 0x00, 0xad, 0xb1, 0xad, 0x22, 0x69, 0x32, + 0x10, 0x6c, 0xe0, 0xcc, 0xdd, 0x45, 0xd8, 0xa6, + 0x29, 0x2f, 0xad, 0x6b, 0xf9, + }, + }, + { + .name = "prime239v3", + .der_len = 115, + .der = { + 0x30, 0x71, 0x02, 0x01, 0x01, 0x04, 0x1e, 0x26, + 0x3f, 0x23, 0x4c, 0xe7, 0xbd, 0xa8, 0xe4, 0xfe, + 0x7c, 0xf6, 0x18, 0x6a, 0xb2, 0xa6, 0x39, 0x15, + 0x6d, 0x72, 0xe8, 0x9e, 0x3f, 0x0f, 0x10, 0x1e, + 0xe5, 0xdf, 0xac, 0xe8, 0x2f, 0xa0, 0x0a, 0x06, + 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, + 0x06, 0xa1, 0x40, 0x03, 0x3e, 0x00, 0x04, 0x37, + 0xba, 0x07, 0x7f, 0xd9, 0x46, 0x5a, 0x33, 0x03, + 0x31, 0x77, 0x38, 0xef, 0xee, 0xcc, 0x3d, 0xe1, + 0xaa, 0x57, 0xe3, 0x8d, 0xb7, 0xcd, 0xe3, 0x01, + 0xf4, 0xd6, 0x75, 0x49, 0x72, 0x61, 0x4c, 0xbf, + 0xc0, 0x1f, 0x8b, 0x5f, 0x98, 0x9b, 0xa7, 0xe5, + 0x6a, 0xb7, 0xfe, 0x63, 0xdb, 0xb0, 0x40, 0xcb, + 0x26, 0x81, 0x2a, 0x91, 0x14, 0x0f, 0xc7, 0x31, + 0x13, 0x78, 0x16, + }, + .hex = "0437BA077FD9465A" + "3303317738EFEECC" + "3DE1AA57E38DB7CD" + "E301F4D675497261" + "4CBFC01F8B5F989B" + "A7E56AB7FE63DBB0" + "40CB26812A91140F" + "C731137816", + .oct_len = 61, + .oct = { + 0x04, 0x37, 0xba, 0x07, 0x7f, 0xd9, 0x46, 0x5a, + 0x33, 0x03, 0x31, 0x77, 0x38, 0xef, 0xee, 0xcc, + 0x3d, 0xe1, 0xaa, 0x57, 0xe3, 0x8d, 0xb7, 0xcd, + 0xe3, 0x01, 0xf4, 0xd6, 0x75, 0x49, 0x72, 0x61, + 0x4c, 0xbf, 0xc0, 0x1f, 0x8b, 0x5f, 0x98, 0x9b, + 0xa7, 0xe5, 0x6a, 0xb7, 0xfe, 0x63, 0xdb, 0xb0, + 0x40, 0xcb, 0x26, 0x81, 0x2a, 0x91, 0x14, 0x0f, + 0xc7, 0x31, 0x13, 0x78, 0x16, + }, + }, + { + .name = "prime256v1", + .der_len = 121, + .der = { + 0x30, 0x77, 0x02, 0x01, 0x01, 0x04, 0x20, 0x6c, + 0x83, 0x81, 0x90, 0x65, 0x7b, 0x45, 0x98, 0x66, + 0x4b, 0x91, 0x8e, 0xcf, 0x71, 0x61, 0x22, 0xb6, + 0xd6, 0x93, 0x74, 0x84, 0xa3, 0xc6, 0x44, 0x71, + 0x25, 0xc5, 0xef, 0x77, 0x52, 0xd2, 0x32, 0xa0, + 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, + 0x03, 0x01, 0x07, 0xa1, 0x44, 0x03, 0x42, 0x00, + 0x04, 0x96, 0x8a, 0xc3, 0x66, 0x1e, 0xf7, 0xcf, + 0xf6, 0xcc, 0x4e, 0x73, 0xae, 0xe2, 0x64, 0xc4, + 0x56, 0x5f, 0x2d, 0xfe, 0xde, 0xac, 0x92, 0xbe, + 0x10, 0x40, 0x37, 0xce, 0x24, 0x12, 0x30, 0x19, + 0x08, 0x66, 0xcf, 0x90, 0xc9, 0x37, 0x03, 0xd1, + 0xd5, 0x8d, 0xaa, 0x18, 0x2a, 0xbc, 0xed, 0x82, + 0x32, 0xc9, 0x43, 0x4b, 0x98, 0x7f, 0xdc, 0xb1, + 0x0b, 0xa6, 0xdd, 0x16, 0xc5, 0x8d, 0x5a, 0xcf, + 0xe3, + }, + .hex = "04968AC3661EF7CF" + "F6CC4E73AEE264C4" + "565F2DFEDEAC92BE" + "104037CE24123019" + "0866CF90C93703D1" + "D58DAA182ABCED82" + "32C9434B987FDCB1" + "0BA6DD16C58D5ACF" + "E3", + .oct_len = 65, + .oct = { + 0x04, 0x96, 0x8a, 0xc3, 0x66, 0x1e, 0xf7, 0xcf, + 0xf6, 0xcc, 0x4e, 0x73, 0xae, 0xe2, 0x64, 0xc4, + 0x56, 0x5f, 0x2d, 0xfe, 0xde, 0xac, 0x92, 0xbe, + 0x10, 0x40, 0x37, 0xce, 0x24, 0x12, 0x30, 0x19, + 0x08, 0x66, 0xcf, 0x90, 0xc9, 0x37, 0x03, 0xd1, + 0xd5, 0x8d, 0xaa, 0x18, 0x2a, 0xbc, 0xed, 0x82, + 0x32, 0xc9, 0x43, 0x4b, 0x98, 0x7f, 0xdc, 0xb1, + 0x0b, 0xa6, 0xdd, 0x16, 0xc5, 0x8d, 0x5a, 0xcf, + 0xe3, + }, + }, + { + .name = "brainpoolP224r1", + .der_len = 110, + .der = { + 0x30, 0x6c, 0x02, 0x01, 0x01, 0x04, 0x1c, 0xae, + 0x9c, 0xe1, 0x9c, 0xaf, 0xbd, 0x9d, 0xec, 0x9a, + 0xe4, 0xdc, 0x5a, 0x9f, 0xdb, 0x0d, 0x51, 0x65, + 0xe2, 0x49, 0xa7, 0x35, 0xea, 0xbc, 0x8b, 0x4a, + 0x27, 0xfd, 0xa8, 0xa0, 0x0b, 0x06, 0x09, 0x2b, + 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x05, + 0xa1, 0x3c, 0x03, 0x3a, 0x00, 0x04, 0x30, 0x88, + 0x20, 0xb3, 0x47, 0x2e, 0x40, 0x1e, 0x68, 0xae, + 0xe1, 0x00, 0x58, 0xa2, 0x4b, 0xb9, 0xac, 0xf7, + 0x5d, 0xc1, 0xee, 0xf5, 0xfb, 0xdd, 0x34, 0xae, + 0xbe, 0x3c, 0x93, 0xdd, 0xc2, 0xd8, 0x3a, 0x9a, + 0x72, 0x65, 0x41, 0xac, 0xcc, 0x25, 0x6a, 0xcf, + 0x71, 0x50, 0x6b, 0xed, 0xe3, 0xc5, 0xd4, 0xe9, + 0x1b, 0x59, 0x92, 0xa4, 0xa8, 0x81, + }, + .hex = "04308820B3472E40" + "1E68AEE10058A24B" + "B9ACF75DC1EEF5FB" + "DD34AEBE3C93DDC2" + "D83A9A726541ACCC" + "256ACF71506BEDE3" + "C5D4E91B5992A4A8" + "81", + .oct_len = 57, + .oct = { + 0x04, 0x30, 0x88, 0x20, 0xb3, 0x47, 0x2e, 0x40, + 0x1e, 0x68, 0xae, 0xe1, 0x00, 0x58, 0xa2, 0x4b, + 0xb9, 0xac, 0xf7, 0x5d, 0xc1, 0xee, 0xf5, 0xfb, + 0xdd, 0x34, 0xae, 0xbe, 0x3c, 0x93, 0xdd, 0xc2, + 0xd8, 0x3a, 0x9a, 0x72, 0x65, 0x41, 0xac, 0xcc, + 0x25, 0x6a, 0xcf, 0x71, 0x50, 0x6b, 0xed, 0xe3, + 0xc5, 0xd4, 0xe9, 0x1b, 0x59, 0x92, 0xa4, 0xa8, + 0x81, + }, + }, + { + .name = "brainpoolP224t1", + .der_len = 110, + .der = { + 0x30, 0x6c, 0x02, 0x01, 0x01, 0x04, 0x1c, 0xc0, + 0x10, 0xc2, 0xf4, 0xab, 0xbb, 0x00, 0xa0, 0x14, + 0x62, 0x13, 0x24, 0xc2, 0x8d, 0x9e, 0x78, 0x92, + 0x24, 0x3b, 0xa8, 0xd0, 0xf1, 0x06, 0x69, 0x77, + 0x1d, 0x9d, 0x6c, 0xa0, 0x0b, 0x06, 0x09, 0x2b, + 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x06, + 0xa1, 0x3c, 0x03, 0x3a, 0x00, 0x04, 0x0b, 0xbf, + 0x95, 0xea, 0x8b, 0xa8, 0x24, 0x94, 0x68, 0x54, + 0x69, 0xd9, 0x55, 0xa5, 0x36, 0x34, 0xf1, 0x4a, + 0x45, 0xf9, 0x9f, 0x66, 0x7b, 0x5d, 0xc9, 0x8b, + 0x0a, 0x7a, 0x5d, 0xef, 0x25, 0x9a, 0xa3, 0x86, + 0xe1, 0x98, 0x1b, 0x5b, 0xe3, 0xe3, 0x55, 0xa0, + 0x59, 0xb2, 0xfd, 0xe7, 0xdf, 0x41, 0xff, 0x4f, + 0x36, 0xe9, 0x56, 0xe9, 0x07, 0xc2, + }, + .hex = "040BBF95EA8BA824" + "94685469D955A536" + "34F14A45F99F667B" + "5DC98B0A7A5DEF25" + "9AA386E1981B5BE3" + "E355A059B2FDE7DF" + "41FF4F36E956E907" + "C2", + .oct_len = 57, + .oct = { + 0x04, 0x0b, 0xbf, 0x95, 0xea, 0x8b, 0xa8, 0x24, + 0x94, 0x68, 0x54, 0x69, 0xd9, 0x55, 0xa5, 0x36, + 0x34, 0xf1, 0x4a, 0x45, 0xf9, 0x9f, 0x66, 0x7b, + 0x5d, 0xc9, 0x8b, 0x0a, 0x7a, 0x5d, 0xef, 0x25, + 0x9a, 0xa3, 0x86, 0xe1, 0x98, 0x1b, 0x5b, 0xe3, + 0xe3, 0x55, 0xa0, 0x59, 0xb2, 0xfd, 0xe7, 0xdf, + 0x41, 0xff, 0x4f, 0x36, 0xe9, 0x56, 0xe9, 0x07, + 0xc2, + }, + }, + { + .name = "brainpoolP256r1", + .der_len = 122, + .der = { + 0x30, 0x78, 0x02, 0x01, 0x01, 0x04, 0x20, 0x98, + 0x48, 0x86, 0x7a, 0x5b, 0x60, 0xb9, 0xba, 0xab, + 0xa2, 0x34, 0x55, 0x43, 0x17, 0xbc, 0xfd, 0xc2, + 0x18, 0xc9, 0xa8, 0x4b, 0x28, 0xbe, 0x5e, 0xa0, + 0x37, 0xab, 0x0d, 0xe0, 0x54, 0x65, 0x87, 0xa0, + 0x0b, 0x06, 0x09, 0x2b, 0x24, 0x03, 0x03, 0x02, + 0x08, 0x01, 0x01, 0x07, 0xa1, 0x44, 0x03, 0x42, + 0x00, 0x04, 0x08, 0xd7, 0x77, 0xf5, 0x10, 0xa9, + 0x83, 0xd9, 0xdf, 0xfd, 0x40, 0xe4, 0x42, 0xce, + 0xd8, 0x3b, 0x9b, 0xef, 0xe6, 0x4d, 0x4e, 0xca, + 0x2d, 0xea, 0xe6, 0x69, 0xfe, 0xd3, 0xa9, 0x3f, + 0x30, 0xfa, 0x7e, 0xa7, 0x14, 0x9d, 0x37, 0x77, + 0xc5, 0xcc, 0x1e, 0x32, 0xf6, 0xce, 0x17, 0x91, + 0x1b, 0xeb, 0xa3, 0x8f, 0xce, 0x70, 0x55, 0xc1, + 0xcf, 0xe3, 0x38, 0xa0, 0xb7, 0x95, 0x85, 0x26, + 0xf5, 0xb2, + }, + .hex = "0408D777F510A983" + "D9DFFD40E442CED8" + "3B9BEFE64D4ECA2D" + "EAE669FED3A93F30" + "FA7EA7149D3777C5" + "CC1E32F6CE17911B" + "EBA38FCE7055C1CF" + "E338A0B7958526F5" + "B2", + .oct_len = 65, + .oct = { + 0x04, 0x08, 0xd7, 0x77, 0xf5, 0x10, 0xa9, 0x83, + 0xd9, 0xdf, 0xfd, 0x40, 0xe4, 0x42, 0xce, 0xd8, + 0x3b, 0x9b, 0xef, 0xe6, 0x4d, 0x4e, 0xca, 0x2d, + 0xea, 0xe6, 0x69, 0xfe, 0xd3, 0xa9, 0x3f, 0x30, + 0xfa, 0x7e, 0xa7, 0x14, 0x9d, 0x37, 0x77, 0xc5, + 0xcc, 0x1e, 0x32, 0xf6, 0xce, 0x17, 0x91, 0x1b, + 0xeb, 0xa3, 0x8f, 0xce, 0x70, 0x55, 0xc1, 0xcf, + 0xe3, 0x38, 0xa0, 0xb7, 0x95, 0x85, 0x26, 0xf5, + 0xb2, + }, + }, + { + .name = "brainpoolP256t1", + .der_len = 122, + .der = { + 0x30, 0x78, 0x02, 0x01, 0x01, 0x04, 0x20, 0x21, + 0xb0, 0x02, 0x6c, 0xac, 0x68, 0xe7, 0xaf, 0xb6, + 0x8b, 0xb9, 0xe6, 0x68, 0xec, 0x2a, 0xfa, 0x55, + 0xb0, 0xd4, 0x23, 0xaa, 0xb9, 0xfb, 0x7c, 0xf5, + 0xd1, 0x2f, 0x61, 0x52, 0x19, 0xc0, 0x19, 0xa0, + 0x0b, 0x06, 0x09, 0x2b, 0x24, 0x03, 0x03, 0x02, + 0x08, 0x01, 0x01, 0x08, 0xa1, 0x44, 0x03, 0x42, + 0x00, 0x04, 0x7b, 0x1d, 0x55, 0x29, 0x0b, 0x0a, + 0x0d, 0x02, 0x7a, 0x1d, 0x72, 0x53, 0xc1, 0x84, + 0xb9, 0x90, 0x00, 0xb9, 0x45, 0xe5, 0xa5, 0xd4, + 0xee, 0xd6, 0x9a, 0x1d, 0xb0, 0x3a, 0x91, 0xa8, + 0x95, 0x56, 0x58, 0x32, 0xcb, 0xf3, 0x28, 0x95, + 0xa6, 0x82, 0x46, 0xe6, 0x0a, 0x33, 0x00, 0xd1, + 0x0c, 0x61, 0xac, 0x1e, 0xa0, 0xb0, 0xad, 0x3a, + 0xbd, 0x1e, 0x53, 0x8d, 0x26, 0x96, 0xab, 0x44, + 0x6b, 0x84, + }, + .hex = "047B1D55290B0A0D" + "027A1D7253C184B9" + "9000B945E5A5D4EE" + "D69A1DB03A91A895" + "565832CBF32895A6" + "8246E60A3300D10C" + "61AC1EA0B0AD3ABD" + "1E538D2696AB446B" + "84", + .oct_len = 65, + .oct = { + 0x04, 0x7b, 0x1d, 0x55, 0x29, 0x0b, 0x0a, 0x0d, + 0x02, 0x7a, 0x1d, 0x72, 0x53, 0xc1, 0x84, 0xb9, + 0x90, 0x00, 0xb9, 0x45, 0xe5, 0xa5, 0xd4, 0xee, + 0xd6, 0x9a, 0x1d, 0xb0, 0x3a, 0x91, 0xa8, 0x95, + 0x56, 0x58, 0x32, 0xcb, 0xf3, 0x28, 0x95, 0xa6, + 0x82, 0x46, 0xe6, 0x0a, 0x33, 0x00, 0xd1, 0x0c, + 0x61, 0xac, 0x1e, 0xa0, 0xb0, 0xad, 0x3a, 0xbd, + 0x1e, 0x53, 0x8d, 0x26, 0x96, 0xab, 0x44, 0x6b, + 0x84, + }, + }, + { + .name = "brainpoolP320r1", + .der_len = 147, + .der = { + 0x30, 0x81, 0x90, 0x02, 0x01, 0x01, 0x04, 0x28, + 0x1f, 0x7e, 0x6e, 0x51, 0x13, 0x87, 0x9b, 0x09, + 0x2b, 0x3f, 0x1c, 0x39, 0x0f, 0x9f, 0x48, 0x79, + 0x48, 0xa1, 0x44, 0xe0, 0x5c, 0x73, 0x2a, 0x6c, + 0x6e, 0x60, 0x59, 0xd0, 0xf6, 0x6f, 0x32, 0x0e, + 0x6b, 0x2b, 0x0c, 0xf2, 0x39, 0xbd, 0x42, 0xaf, + 0xa0, 0x0b, 0x06, 0x09, 0x2b, 0x24, 0x03, 0x03, + 0x02, 0x08, 0x01, 0x01, 0x09, 0xa1, 0x54, 0x03, + 0x52, 0x00, 0x04, 0xa3, 0x37, 0x85, 0xe2, 0xf2, + 0x5f, 0xa1, 0x71, 0xa6, 0x75, 0xfe, 0xa1, 0xea, + 0x66, 0x35, 0x7a, 0x53, 0x71, 0x24, 0x83, 0xcd, + 0xc9, 0x5d, 0x3f, 0x43, 0xc4, 0x97, 0x6d, 0xcc, + 0x0c, 0xed, 0x9a, 0x51, 0x51, 0x7d, 0x1e, 0xd0, + 0xea, 0xd2, 0x8c, 0x36, 0xb0, 0x93, 0x62, 0xeb, + 0x26, 0xda, 0xe1, 0xef, 0xc7, 0x1a, 0xfa, 0x0c, + 0xea, 0x84, 0x7a, 0xf1, 0x50, 0x2c, 0xee, 0xf1, + 0xb3, 0xcc, 0xb7, 0xa0, 0x98, 0x5d, 0xde, 0xc2, + 0x54, 0xcc, 0x11, 0x2a, 0x84, 0xc6, 0x79, 0x10, + 0x7b, 0x20, 0x26, + }, + .hex = "04A33785E2F25FA1" + "71A675FEA1EA6635" + "7A53712483CDC95D" + "3F43C4976DCC0CED" + "9A51517D1ED0EAD2" + "8C36B09362EB26DA" + "E1EFC71AFA0CEA84" + "7AF1502CEEF1B3CC" + "B7A0985DDEC254CC" + "112A84C679107B20" + "26", + .oct_len = 81, + .oct = { + 0x04, 0xa3, 0x37, 0x85, 0xe2, 0xf2, 0x5f, 0xa1, + 0x71, 0xa6, 0x75, 0xfe, 0xa1, 0xea, 0x66, 0x35, + 0x7a, 0x53, 0x71, 0x24, 0x83, 0xcd, 0xc9, 0x5d, + 0x3f, 0x43, 0xc4, 0x97, 0x6d, 0xcc, 0x0c, 0xed, + 0x9a, 0x51, 0x51, 0x7d, 0x1e, 0xd0, 0xea, 0xd2, + 0x8c, 0x36, 0xb0, 0x93, 0x62, 0xeb, 0x26, 0xda, + 0xe1, 0xef, 0xc7, 0x1a, 0xfa, 0x0c, 0xea, 0x84, + 0x7a, 0xf1, 0x50, 0x2c, 0xee, 0xf1, 0xb3, 0xcc, + 0xb7, 0xa0, 0x98, 0x5d, 0xde, 0xc2, 0x54, 0xcc, + 0x11, 0x2a, 0x84, 0xc6, 0x79, 0x10, 0x7b, 0x20, + 0x26, + }, + }, + { + .name = "brainpoolP320t1", + .der_len = 147, + .der = { + 0x30, 0x81, 0x90, 0x02, 0x01, 0x01, 0x04, 0x28, + 0x4a, 0x8a, 0x25, 0xd9, 0xfa, 0x04, 0x8f, 0x6b, + 0xd5, 0xa3, 0x83, 0xd6, 0xf2, 0xca, 0x82, 0xd5, + 0xe2, 0x8e, 0x3f, 0xe6, 0x07, 0xcd, 0xa2, 0x22, + 0xa0, 0x3f, 0x0a, 0x7c, 0x09, 0x0f, 0x9f, 0xf4, + 0xe3, 0x59, 0x4b, 0x43, 0x0c, 0xfd, 0x5a, 0x96, + 0xa0, 0x0b, 0x06, 0x09, 0x2b, 0x24, 0x03, 0x03, + 0x02, 0x08, 0x01, 0x01, 0x0a, 0xa1, 0x54, 0x03, + 0x52, 0x00, 0x04, 0x3d, 0x8c, 0x4c, 0xbb, 0x30, + 0x3f, 0xa0, 0x84, 0x61, 0x43, 0x50, 0x23, 0x70, + 0xe3, 0x70, 0xb6, 0x4d, 0x89, 0xc8, 0x95, 0xa0, + 0x09, 0xae, 0xfc, 0x55, 0x9c, 0x2f, 0xef, 0x16, + 0xc0, 0x72, 0x3c, 0x3e, 0x07, 0xa1, 0xbb, 0xd8, + 0x8a, 0xfa, 0xaf, 0x9f, 0xaf, 0x07, 0x7c, 0x15, + 0x4d, 0x75, 0x6b, 0xf5, 0x25, 0x65, 0x5b, 0xc4, + 0x78, 0x59, 0x22, 0xe5, 0x92, 0x5c, 0xc2, 0x8f, + 0xdc, 0x97, 0x59, 0x82, 0xc5, 0x0d, 0x24, 0x70, + 0x03, 0xbe, 0xa5, 0x05, 0x88, 0x16, 0x47, 0x9f, + 0xe5, 0x3b, 0xb8, + }, + .hex = "043D8C4CBB303FA0" + "846143502370E370" + "B64D89C895A009AE" + "FC559C2FEF16C072" + "3C3E07A1BBD88AFA" + "AF9FAF077C154D75" + "6BF525655BC47859" + "22E5925CC28FDC97" + "5982C50D247003BE" + "A5058816479FE53B" + "B8", + .oct_len = 81, + .oct = { + 0x04, 0x3d, 0x8c, 0x4c, 0xbb, 0x30, 0x3f, 0xa0, + 0x84, 0x61, 0x43, 0x50, 0x23, 0x70, 0xe3, 0x70, + 0xb6, 0x4d, 0x89, 0xc8, 0x95, 0xa0, 0x09, 0xae, + 0xfc, 0x55, 0x9c, 0x2f, 0xef, 0x16, 0xc0, 0x72, + 0x3c, 0x3e, 0x07, 0xa1, 0xbb, 0xd8, 0x8a, 0xfa, + 0xaf, 0x9f, 0xaf, 0x07, 0x7c, 0x15, 0x4d, 0x75, + 0x6b, 0xf5, 0x25, 0x65, 0x5b, 0xc4, 0x78, 0x59, + 0x22, 0xe5, 0x92, 0x5c, 0xc2, 0x8f, 0xdc, 0x97, + 0x59, 0x82, 0xc5, 0x0d, 0x24, 0x70, 0x03, 0xbe, + 0xa5, 0x05, 0x88, 0x16, 0x47, 0x9f, 0xe5, 0x3b, + 0xb8, + }, + }, + { + .name = "brainpoolP384r1", + .der_len = 171, + .der = { + 0x30, 0x81, 0xa8, 0x02, 0x01, 0x01, 0x04, 0x30, + 0x02, 0x57, 0xb6, 0xfe, 0x31, 0xda, 0x87, 0xcd, + 0x68, 0x2a, 0x67, 0x98, 0xd1, 0x72, 0x5c, 0xd8, + 0x2e, 0x25, 0xf9, 0x39, 0x36, 0x3b, 0x93, 0x98, + 0x79, 0x81, 0xc0, 0x7e, 0xa3, 0x44, 0x99, 0xd8, + 0xe5, 0x07, 0x1f, 0xea, 0xa1, 0x66, 0x60, 0x00, + 0x29, 0x84, 0xa3, 0x35, 0xdd, 0x64, 0x96, 0x93, + 0xa0, 0x0b, 0x06, 0x09, 0x2b, 0x24, 0x03, 0x03, + 0x02, 0x08, 0x01, 0x01, 0x0b, 0xa1, 0x64, 0x03, + 0x62, 0x00, 0x04, 0x4f, 0x79, 0xe0, 0xe7, 0xf9, + 0x57, 0x33, 0xf9, 0x9d, 0x6a, 0x5c, 0x00, 0x6e, + 0xb8, 0xbc, 0xe6, 0x4f, 0x70, 0x1d, 0x73, 0x02, + 0x5c, 0x87, 0xa1, 0x88, 0xea, 0xe3, 0x57, 0x5c, + 0x1a, 0x27, 0x40, 0xcf, 0xcc, 0x6f, 0x7e, 0x6d, + 0xfd, 0x96, 0x0b, 0xaa, 0xc5, 0x02, 0x92, 0x10, + 0x6d, 0x7e, 0xd5, 0x17, 0xda, 0xab, 0x52, 0x9b, + 0xcd, 0x87, 0x08, 0x64, 0x2a, 0x61, 0x03, 0xc9, + 0xfe, 0x97, 0x79, 0xf0, 0x5c, 0x84, 0x72, 0x50, + 0x53, 0x95, 0x56, 0x7a, 0x97, 0xce, 0x36, 0x13, + 0x23, 0x78, 0x31, 0x82, 0x36, 0x07, 0x45, 0xad, + 0x92, 0x00, 0xaf, 0x3d, 0xe8, 0x5a, 0x7d, 0x7b, + 0x63, 0xc2, 0xde, + }, + .hex = "044F79E0E7F95733" + "F99D6A5C006EB8BC" + "E64F701D73025C87" + "A188EAE3575C1A27" + "40CFCC6F7E6DFD96" + "0BAAC50292106D7E" + "D517DAAB529BCD87" + "08642A6103C9FE97" + "79F05C8472505395" + "567A97CE36132378" + "3182360745AD9200" + "AF3DE85A7D7B63C2" + "DE", + .oct_len = 97, + .oct = { + 0x04, 0x4f, 0x79, 0xe0, 0xe7, 0xf9, 0x57, 0x33, + 0xf9, 0x9d, 0x6a, 0x5c, 0x00, 0x6e, 0xb8, 0xbc, + 0xe6, 0x4f, 0x70, 0x1d, 0x73, 0x02, 0x5c, 0x87, + 0xa1, 0x88, 0xea, 0xe3, 0x57, 0x5c, 0x1a, 0x27, + 0x40, 0xcf, 0xcc, 0x6f, 0x7e, 0x6d, 0xfd, 0x96, + 0x0b, 0xaa, 0xc5, 0x02, 0x92, 0x10, 0x6d, 0x7e, + 0xd5, 0x17, 0xda, 0xab, 0x52, 0x9b, 0xcd, 0x87, + 0x08, 0x64, 0x2a, 0x61, 0x03, 0xc9, 0xfe, 0x97, + 0x79, 0xf0, 0x5c, 0x84, 0x72, 0x50, 0x53, 0x95, + 0x56, 0x7a, 0x97, 0xce, 0x36, 0x13, 0x23, 0x78, + 0x31, 0x82, 0x36, 0x07, 0x45, 0xad, 0x92, 0x00, + 0xaf, 0x3d, 0xe8, 0x5a, 0x7d, 0x7b, 0x63, 0xc2, + 0xde, + }, + }, + { + .name = "brainpoolP384t1", + .der_len = 171, + .der = { + 0x30, 0x81, 0xa8, 0x02, 0x01, 0x01, 0x04, 0x30, + 0x35, 0xea, 0xbc, 0x66, 0xd4, 0xa9, 0xc0, 0xe1, + 0xcd, 0xd4, 0xe5, 0xb1, 0xac, 0x8f, 0x66, 0x82, + 0x56, 0xc1, 0xbd, 0xf2, 0xf5, 0x30, 0x95, 0xab, + 0x30, 0xaa, 0xc0, 0xc3, 0x07, 0xca, 0x97, 0xc9, + 0x53, 0x45, 0xd3, 0xff, 0xbf, 0xfe, 0xdf, 0x39, + 0x32, 0x40, 0xe0, 0x45, 0x15, 0xa7, 0x22, 0x5f, + 0xa0, 0x0b, 0x06, 0x09, 0x2b, 0x24, 0x03, 0x03, + 0x02, 0x08, 0x01, 0x01, 0x0c, 0xa1, 0x64, 0x03, + 0x62, 0x00, 0x04, 0x85, 0xdb, 0x57, 0x4b, 0x71, + 0xb1, 0x65, 0x93, 0x51, 0x83, 0x7c, 0xb3, 0x24, + 0x07, 0x6b, 0x7b, 0x57, 0x33, 0x73, 0x3a, 0xa6, + 0x14, 0x86, 0x83, 0xa8, 0x88, 0x81, 0xf2, 0x90, + 0xdf, 0x93, 0x4f, 0x67, 0x41, 0xef, 0xcb, 0x35, + 0x14, 0xad, 0x4c, 0x67, 0x0b, 0xdb, 0x86, 0x03, + 0x5e, 0x6d, 0x5e, 0x7e, 0x4b, 0x0f, 0x73, 0x9e, + 0x73, 0x50, 0x86, 0x29, 0x09, 0x7c, 0x38, 0xfc, + 0xbe, 0xaf, 0x59, 0x9c, 0x69, 0xdf, 0xb4, 0x60, + 0x14, 0x3e, 0xb2, 0x1a, 0x72, 0x86, 0x57, 0xcb, + 0x6b, 0x42, 0x20, 0x67, 0x7f, 0xbc, 0xa8, 0x57, + 0x88, 0x76, 0x72, 0x9a, 0xb4, 0xea, 0xc0, 0x48, + 0x01, 0x5d, 0x8e, + }, + .hex = "0485DB574B71B165" + "9351837CB324076B" + "7B5733733AA61486" + "83A88881F290DF93" + "4F6741EFCB3514AD" + "4C670BDB86035E6D" + "5E7E4B0F739E7350" + "8629097C38FCBEAF" + "599C69DFB460143E" + "B21A728657CB6B42" + "20677FBCA8578876" + "729AB4EAC048015D" + "8E", + .oct_len = 97, + .oct = { + 0x04, 0x85, 0xdb, 0x57, 0x4b, 0x71, 0xb1, 0x65, + 0x93, 0x51, 0x83, 0x7c, 0xb3, 0x24, 0x07, 0x6b, + 0x7b, 0x57, 0x33, 0x73, 0x3a, 0xa6, 0x14, 0x86, + 0x83, 0xa8, 0x88, 0x81, 0xf2, 0x90, 0xdf, 0x93, + 0x4f, 0x67, 0x41, 0xef, 0xcb, 0x35, 0x14, 0xad, + 0x4c, 0x67, 0x0b, 0xdb, 0x86, 0x03, 0x5e, 0x6d, + 0x5e, 0x7e, 0x4b, 0x0f, 0x73, 0x9e, 0x73, 0x50, + 0x86, 0x29, 0x09, 0x7c, 0x38, 0xfc, 0xbe, 0xaf, + 0x59, 0x9c, 0x69, 0xdf, 0xb4, 0x60, 0x14, 0x3e, + 0xb2, 0x1a, 0x72, 0x86, 0x57, 0xcb, 0x6b, 0x42, + 0x20, 0x67, 0x7f, 0xbc, 0xa8, 0x57, 0x88, 0x76, + 0x72, 0x9a, 0xb4, 0xea, 0xc0, 0x48, 0x01, 0x5d, + 0x8e, + }, + }, + { + .name = "brainpoolP512r1", + .der_len = 221, + .der = { + 0x30, 0x81, 0xda, 0x02, 0x01, 0x01, 0x04, 0x40, + 0x7e, 0x04, 0x7d, 0xab, 0x42, 0xc6, 0xdb, 0x95, + 0xfb, 0x22, 0x0b, 0xe4, 0x09, 0xff, 0x4a, 0x1e, + 0x7b, 0x42, 0x62, 0x82, 0x41, 0xf4, 0x1e, 0xc2, + 0x1f, 0x9e, 0x52, 0xea, 0xce, 0x1b, 0x75, 0x07, + 0x7c, 0xaf, 0x49, 0xdf, 0xf3, 0x20, 0xfa, 0x88, + 0x23, 0xc4, 0x5e, 0x6d, 0x82, 0x45, 0x32, 0x19, + 0x04, 0x4a, 0x3d, 0x80, 0xa1, 0xa8, 0x99, 0x09, + 0xce, 0x78, 0xde, 0x32, 0x18, 0xf4, 0x83, 0x2c, + 0xa0, 0x0b, 0x06, 0x09, 0x2b, 0x24, 0x03, 0x03, + 0x02, 0x08, 0x01, 0x01, 0x0d, 0xa1, 0x81, 0x85, + 0x03, 0x81, 0x82, 0x00, 0x04, 0x1e, 0x99, 0xea, + 0x54, 0xb6, 0x1a, 0x4f, 0x44, 0x25, 0xf4, 0xf8, + 0xbe, 0x33, 0x7c, 0xd1, 0x62, 0x35, 0xf5, 0xd1, + 0x8e, 0x9f, 0xae, 0xa8, 0x8f, 0x6d, 0x61, 0x27, + 0x2d, 0x2a, 0xb1, 0x96, 0x48, 0x6d, 0xb2, 0x63, + 0x05, 0x9f, 0xec, 0xa1, 0xcd, 0x65, 0x45, 0xc8, + 0xcd, 0xf1, 0xa4, 0xba, 0x20, 0xb7, 0xe4, 0xc7, + 0x92, 0x3c, 0x1f, 0x16, 0xf4, 0x5b, 0x75, 0xe4, + 0x2a, 0x2e, 0x44, 0x72, 0x65, 0x63, 0xc3, 0x78, + 0x54, 0x50, 0xcb, 0x50, 0xe0, 0xbe, 0xe7, 0x6f, + 0x2a, 0xdc, 0x24, 0x7b, 0xf8, 0x4b, 0xa8, 0xe2, + 0x1b, 0x27, 0x00, 0x2d, 0xe8, 0x99, 0xdc, 0x5f, + 0xa4, 0x43, 0xa8, 0xf7, 0xb1, 0x55, 0xea, 0xd7, + 0x02, 0x09, 0x08, 0x97, 0x5f, 0x21, 0x1e, 0x16, + 0xa0, 0xd8, 0x27, 0xe4, 0x5e, 0x3a, 0xa5, 0x51, + 0x68, 0xe7, 0x19, 0xc1, 0x7d, 0xb6, 0x9d, 0xb9, + 0xc6, 0xc2, 0x1b, 0x48, 0x7f, + }, + .hex = "041E99EA54B61A4F" + "4425F4F8BE337CD1" + "6235F5D18E9FAEA8" + "8F6D61272D2AB196" + "486DB263059FECA1" + "CD6545C8CDF1A4BA" + "20B7E4C7923C1F16" + "F45B75E42A2E4472" + "6563C3785450CB50" + "E0BEE76F2ADC247B" + "F84BA8E21B27002D" + "E899DC5FA443A8F7" + "B155EAD702090897" + "5F211E16A0D827E4" + "5E3AA55168E719C1" + "7DB69DB9C6C21B48" + "7F", + .oct_len = 129, + .oct = { + 0x04, 0x1e, 0x99, 0xea, 0x54, 0xb6, 0x1a, 0x4f, + 0x44, 0x25, 0xf4, 0xf8, 0xbe, 0x33, 0x7c, 0xd1, + 0x62, 0x35, 0xf5, 0xd1, 0x8e, 0x9f, 0xae, 0xa8, + 0x8f, 0x6d, 0x61, 0x27, 0x2d, 0x2a, 0xb1, 0x96, + 0x48, 0x6d, 0xb2, 0x63, 0x05, 0x9f, 0xec, 0xa1, + 0xcd, 0x65, 0x45, 0xc8, 0xcd, 0xf1, 0xa4, 0xba, + 0x20, 0xb7, 0xe4, 0xc7, 0x92, 0x3c, 0x1f, 0x16, + 0xf4, 0x5b, 0x75, 0xe4, 0x2a, 0x2e, 0x44, 0x72, + 0x65, 0x63, 0xc3, 0x78, 0x54, 0x50, 0xcb, 0x50, + 0xe0, 0xbe, 0xe7, 0x6f, 0x2a, 0xdc, 0x24, 0x7b, + 0xf8, 0x4b, 0xa8, 0xe2, 0x1b, 0x27, 0x00, 0x2d, + 0xe8, 0x99, 0xdc, 0x5f, 0xa4, 0x43, 0xa8, 0xf7, + 0xb1, 0x55, 0xea, 0xd7, 0x02, 0x09, 0x08, 0x97, + 0x5f, 0x21, 0x1e, 0x16, 0xa0, 0xd8, 0x27, 0xe4, + 0x5e, 0x3a, 0xa5, 0x51, 0x68, 0xe7, 0x19, 0xc1, + 0x7d, 0xb6, 0x9d, 0xb9, 0xc6, 0xc2, 0x1b, 0x48, + 0x7f, + }, + }, + { + .name = "brainpoolP512t1", + .der_len = 221, + .der = { + 0x30, 0x81, 0xda, 0x02, 0x01, 0x01, 0x04, 0x40, + 0xa0, 0xcb, 0xab, 0x2e, 0xdb, 0xb0, 0x17, 0x53, + 0x91, 0x23, 0x8c, 0x86, 0x29, 0x8b, 0x33, 0x27, + 0x27, 0x86, 0x71, 0xdd, 0x9f, 0x92, 0x8a, 0x8a, + 0x28, 0xac, 0x1f, 0x4b, 0x67, 0x8d, 0xd3, 0x7a, + 0x71, 0xd9, 0x95, 0x3c, 0xc2, 0x48, 0x9a, 0x1e, + 0x75, 0xcf, 0x33, 0x6f, 0xdc, 0x88, 0x8c, 0x29, + 0x1d, 0x41, 0xf8, 0xe1, 0xb3, 0x8f, 0xf9, 0x9e, + 0x13, 0x14, 0xbc, 0x4f, 0xa5, 0x8e, 0x06, 0xba, + 0xa0, 0x0b, 0x06, 0x09, 0x2b, 0x24, 0x03, 0x03, + 0x02, 0x08, 0x01, 0x01, 0x0e, 0xa1, 0x81, 0x85, + 0x03, 0x81, 0x82, 0x00, 0x04, 0x5b, 0x2b, 0x47, + 0x83, 0x61, 0xea, 0x80, 0x14, 0x85, 0x06, 0xe7, + 0x03, 0xbd, 0x24, 0x04, 0x47, 0x5d, 0x33, 0x4e, + 0xde, 0x0c, 0x92, 0x09, 0x54, 0x77, 0x53, 0x0e, + 0x33, 0x30, 0x73, 0xc0, 0xc0, 0x6a, 0xf2, 0xb5, + 0xb5, 0xd4, 0xd3, 0x02, 0x2f, 0x20, 0xe2, 0x88, + 0xb2, 0x07, 0x4a, 0x9f, 0x90, 0xbf, 0xba, 0xb5, + 0x3d, 0xc4, 0x5b, 0x65, 0x76, 0xb5, 0xe5, 0xa1, + 0x7d, 0x63, 0x39, 0x57, 0xaa, 0x1d, 0x1f, 0x99, + 0x52, 0x43, 0x5d, 0x0b, 0x58, 0xa6, 0x51, 0x1e, + 0x6f, 0x7b, 0x9e, 0x2f, 0x45, 0x5a, 0x2d, 0x6f, + 0xaa, 0x2b, 0xfc, 0xe1, 0x9f, 0x78, 0x11, 0x70, + 0x80, 0xf8, 0xfe, 0x51, 0x45, 0x12, 0xbf, 0x79, + 0xd8, 0xaf, 0x05, 0x59, 0x14, 0x01, 0x81, 0x9c, + 0x12, 0x5c, 0x8d, 0x4d, 0xed, 0xc7, 0x44, 0x61, + 0x68, 0x0f, 0x3f, 0x34, 0xee, 0x90, 0x4e, 0xab, + 0x80, 0x7c, 0x41, 0xd7, 0x8f, + }, + .hex = "045B2B478361EA80" + "148506E703BD2404" + "475D334EDE0C9209" + "5477530E333073C0" + "C06AF2B5B5D4D302" + "2F20E288B2074A9F" + "90BFBAB53DC45B65" + "76B5E5A17D633957" + "AA1D1F9952435D0B" + "58A6511E6F7B9E2F" + "455A2D6FAA2BFCE1" + "9F78117080F8FE51" + "4512BF79D8AF0559" + "1401819C125C8D4D" + "EDC74461680F3F34" + "EE904EAB807C41D7" + "8F", + .oct_len = 129, + .oct = { + 0x04, 0x5b, 0x2b, 0x47, 0x83, 0x61, 0xea, 0x80, + 0x14, 0x85, 0x06, 0xe7, 0x03, 0xbd, 0x24, 0x04, + 0x47, 0x5d, 0x33, 0x4e, 0xde, 0x0c, 0x92, 0x09, + 0x54, 0x77, 0x53, 0x0e, 0x33, 0x30, 0x73, 0xc0, + 0xc0, 0x6a, 0xf2, 0xb5, 0xb5, 0xd4, 0xd3, 0x02, + 0x2f, 0x20, 0xe2, 0x88, 0xb2, 0x07, 0x4a, 0x9f, + 0x90, 0xbf, 0xba, 0xb5, 0x3d, 0xc4, 0x5b, 0x65, + 0x76, 0xb5, 0xe5, 0xa1, 0x7d, 0x63, 0x39, 0x57, + 0xaa, 0x1d, 0x1f, 0x99, 0x52, 0x43, 0x5d, 0x0b, + 0x58, 0xa6, 0x51, 0x1e, 0x6f, 0x7b, 0x9e, 0x2f, + 0x45, 0x5a, 0x2d, 0x6f, 0xaa, 0x2b, 0xfc, 0xe1, + 0x9f, 0x78, 0x11, 0x70, 0x80, 0xf8, 0xfe, 0x51, + 0x45, 0x12, 0xbf, 0x79, 0xd8, 0xaf, 0x05, 0x59, + 0x14, 0x01, 0x81, 0x9c, 0x12, 0x5c, 0x8d, 0x4d, + 0xed, 0xc7, 0x44, 0x61, 0x68, 0x0f, 0x3f, 0x34, + 0xee, 0x90, 0x4e, 0xab, 0x80, 0x7c, 0x41, 0xd7, + 0x8f, + }, + }, + { + .name = "FRP256v1", + .der_len = 123, + .der = { + 0x30, 0x79, 0x02, 0x01, 0x01, 0x04, 0x20, 0x66, + 0xe4, 0xdb, 0x37, 0x46, 0x8d, 0xa1, 0xc8, 0x20, + 0x0d, 0xdf, 0xcb, 0x3b, 0x5c, 0x5b, 0x84, 0xe1, + 0x89, 0xed, 0x30, 0x37, 0xaa, 0xfa, 0xb2, 0x5b, + 0xf4, 0xf6, 0x13, 0x66, 0xfe, 0xfc, 0x7c, 0xa0, + 0x0c, 0x06, 0x0a, 0x2a, 0x81, 0x7a, 0x01, 0x81, + 0x5f, 0x65, 0x82, 0x00, 0x01, 0xa1, 0x44, 0x03, + 0x42, 0x00, 0x04, 0x17, 0xc7, 0xae, 0x1b, 0xe4, + 0xc6, 0xd6, 0x3a, 0xcf, 0x6b, 0x7e, 0x43, 0x29, + 0x9f, 0xdc, 0xc2, 0xa3, 0x90, 0x53, 0x62, 0x42, + 0x6e, 0xa3, 0xa4, 0xca, 0xd3, 0xf6, 0x53, 0x53, + 0xd4, 0xa6, 0x1f, 0xa8, 0x03, 0x1f, 0x6d, 0xd4, + 0x75, 0x77, 0x23, 0xf7, 0x92, 0xa4, 0x7c, 0x5a, + 0x4c, 0xc7, 0xc6, 0x96, 0x54, 0x62, 0x94, 0x9b, + 0xa7, 0xe0, 0x31, 0x1c, 0x4d, 0x1c, 0xa8, 0x2a, + 0x51, 0x11, 0x24, + }, + .hex = "0417C7AE1BE4C6D6" + "3ACF6B7E43299FDC" + "C2A3905362426EA3" + "A4CAD3F65353D4A6" + "1FA8031F6DD47577" + "23F792A47C5A4CC7" + "C6965462949BA7E0" + "311C4D1CA82A5111" + "24", + .oct_len = 65, + .oct = { + 0x04, 0x17, 0xc7, 0xae, 0x1b, 0xe4, 0xc6, 0xd6, + 0x3a, 0xcf, 0x6b, 0x7e, 0x43, 0x29, 0x9f, 0xdc, + 0xc2, 0xa3, 0x90, 0x53, 0x62, 0x42, 0x6e, 0xa3, + 0xa4, 0xca, 0xd3, 0xf6, 0x53, 0x53, 0xd4, 0xa6, + 0x1f, 0xa8, 0x03, 0x1f, 0x6d, 0xd4, 0x75, 0x77, + 0x23, 0xf7, 0x92, 0xa4, 0x7c, 0x5a, 0x4c, 0xc7, + 0xc6, 0x96, 0x54, 0x62, 0x94, 0x9b, 0xa7, 0xe0, + 0x31, 0x1c, 0x4d, 0x1c, 0xa8, 0x2a, 0x51, 0x11, + 0x24, + }, + }, +}; + +#define N_EC_PRIVATE_KEYS (sizeof(ec_private_keys) / sizeof(ec_private_keys[0])) + +static EC_KEY * +ec_key_check_sanity(const struct ec_private_key *key) +{ + EC_KEY *ec_key; + const unsigned char *p; + unsigned char *der = NULL; + int der_len = 0; + unsigned int flags; + uint8_t form; + + p = key->der; + if ((ec_key = d2i_ECPrivateKey(NULL, &p, key->der_len)) == NULL) { + fprintf(stderr, "FAIL: d2i_ECPrivateKey for %s\n", key->name); + goto err; + } + + if ((flags = EC_KEY_get_enc_flags(ec_key)) != 0) { + fprintf(stderr, "FAIL: EC_KEY_get_enc_flags() returned %x for %s\n", + flags, key->name); + goto err; + } + if ((form = EC_KEY_get_conv_form(ec_key)) != POINT_CONVERSION_UNCOMPRESSED) { + fprintf(stderr, "FAIL: got conversion form %02x, want %02x\n", + form, POINT_CONVERSION_UNCOMPRESSED); + goto err; + } + + ERR_clear_error(); + if (!EC_KEY_check_key(ec_key)) { + fprintf(stderr, "FAIL: EC_KEY_check_key() for %s\n", key->name); + ERR_print_errors_fp(stderr); + goto err; + } + + der = NULL; + if ((der_len = i2d_ECPrivateKey(ec_key, &der)) <= 0) { + fprintf(stderr, "FAIL: i2d_ECPrivateKey() for %s\n", key->name); + der_len = 0; + goto err; + } + + if (compare_data(key->name, der, der_len, key->der, key->der_len) == -1) + goto err; + + freezero(der, der_len); + der = NULL; + + return ec_key; + + err: + EC_KEY_free(ec_key); + freezero(der, der_len); + + return NULL; +} + +static int +ec_key_test_point_encoding(const struct ec_private_key *key, const EC_KEY *ec_key) +{ + const EC_GROUP *group; + const EC_POINT *ec_public_point; + char *hex = NULL; + unsigned char *ostr = NULL; + int hex_len = 0, ostr_len = 0; + int failed = 1; + + if ((group = EC_KEY_get0_group(ec_key)) == NULL) { + fprintf(stderr, "FAIL: EC_KEY_get0_group() for %s\n", key->name); + goto err; + } + if ((ec_public_point = EC_KEY_get0_public_key(ec_key)) == NULL) { + fprintf(stderr, "FAIL: EC_KEY_get0_public_key() for %s\n", key->name); + goto err; + } + + if ((hex = EC_POINT_point2hex(group, ec_public_point, + POINT_CONVERSION_UNCOMPRESSED, NULL)) == NULL) { + fprintf(stderr, "FAIL: EC_POINT_point2hex() for %s\n", key->name); + goto err; + } + + if ((hex_len = strlen(hex)) != 2 * key->oct_len) { + fprintf(stderr, "FAIL: hex_len: %d, oct_len %d for %s\n", + hex_len, key->oct_len, key->name); + goto err; + } + + if (compare_data(key->name, hex, hex_len, key->hex, hex_len) == -1) { + fprintf(stderr, "FAIL: EC_POINT_point2hex() comparison for %s\n", + key->name); + goto err; + } + + if ((ostr_len = i2o_ECPublicKey(ec_key, &ostr)) <= 0) { + fprintf(stderr, "FAIL: i2o_ECPublicKey for %s\n", key->name); + goto err; + } + + if (compare_data(key->name, ostr, ostr_len, key->oct, key->oct_len) == -1) { + fprintf(stderr, "FAIL: i2o_ECPublicKey comparison for %s\n", + key->name); + goto err; + } + + failed = 0; + + err: + free(hex); + freezero(ostr, ostr_len); + + return failed; +} + +static int +ec_key_test_point_versus_bn(const struct ec_private_key *key, const EC_KEY *ec_key) +{ + const EC_GROUP *group; + const EC_POINT *ec_public_point; + EC_POINT *point = NULL; + BIGNUM *hex_bn = NULL, *point_bn = NULL; + int rv; + int failed = 1; + + if ((group = EC_KEY_get0_group(ec_key)) == NULL) { + fprintf(stderr, "FAIL: EC_KEY_get0_group() for %s\n", key->name); + goto err; + } + if ((ec_public_point = EC_KEY_get0_public_key(ec_key)) == NULL) { + fprintf(stderr, "FAIL: EC_KEY_get0_public_key() for %s\n", key->name); + goto err; + } + + /* + * Check that point2bn matches hex2bn. + */ + + if ((point_bn = BN_new()) == NULL) + err(1, "BN_new()"); + if (EC_POINT_point2bn(group, ec_public_point, + POINT_CONVERSION_UNCOMPRESSED, point_bn, NULL) == NULL) { + fprintf(stderr, "FAIL: EC_POINT_point2bn() for %s\n", key->name); + goto err; + } + + if (BN_hex2bn(&hex_bn, key->hex) == 0) { + fprintf(stderr, "FAIL: BN_hex2bn() for %s\n", key->name); + goto err; + } + + if (BN_cmp(hex_bn, point_bn) != 0) { + fprintf(stderr, "FAIL: mismatch between " + "hex point and curve point for %s\n", key->name); + goto err; + } + + /* + * Translate back to a point on the curve. + */ + + if ((point = EC_POINT_hex2point(group, key->hex, NULL, NULL)) == NULL) { + fprintf(stderr, "FAIL: EC_POINT_hex2point() failed for %s\n", + key->name); + goto err; + } + + if ((rv = EC_POINT_cmp(group, ec_public_point, point, NULL)) != 0) { + fprintf(stderr, "FAIL: EC_POINT_cmp() returned %d for %s\n", + rv, key->name); + goto err; + } + + /* + * Invalidate the point by doubling and inverting it. Then see if + * point reuse works. + */ + + if (!EC_POINT_dbl(group, point, point, NULL)) { + fprintf(stderr, "FAIL: EC_POINT_dbl() failed for %s\n", + key->name); + goto err; + } + if (!EC_POINT_invert(group, point, NULL)) { + fprintf(stderr, "FAIL: EC_POINT_invert() failed for %s\n", + key->name); + goto err; + } + if (!EC_POINT_is_on_curve(group, point, NULL)) { + fprintf(stderr, "FAIL: EC_POINT_is_on_curve() failed for %s\n", + key->name); + goto err; + } + if (EC_POINT_is_at_infinity(group, point)) { + fprintf(stderr, "FAIL: EC_POINT_is_at_infinity() is true for %s\n", + key->name); + goto err; + } + + /* The points are now different. */ + if ((rv = EC_POINT_cmp(group, ec_public_point, point, NULL)) == 0) { + fprintf(stderr, "FAIL: EC_POINT_cmp() returned %d for %s\n", + rv, key->name); + goto err; + } + + if (EC_POINT_hex2point(group, key->hex, point, NULL) == NULL) { + fprintf(stderr, "FAIL: EC_POINT_hex2point() 2 failed for %s\n", + key->name); + goto err; + } + + /* And after reuse they should be the same again. */ + if ((rv = EC_POINT_cmp(group, ec_public_point, point, NULL)) != 0) { + fprintf(stderr, "FAIL: EC_POINT_cmp() returned %d for %s\n", + rv, key->name); + goto err; + } + + failed = 0; + + err: + BN_free(hex_bn); + BN_free(point_bn); + EC_POINT_free(point); + + return failed; +} + +static int +ec_key_test_i2o_and_o2i(const struct ec_private_key *key, const EC_KEY *ec_key_orig) +{ + EC_KEY *ec_key = NULL, *ec_pub_key = NULL; + const unsigned char *p; + unsigned char *ostr = NULL; + int ostr_len = 0; + uint8_t form; + int rv; + int failed = 1; + + if ((ec_key = EC_KEY_dup(ec_key_orig)) == NULL) { + fprintf(stderr, "FAIL: EC_KEY_dup failed for %s", key->name); + goto err; + } + + EC_KEY_set_conv_form(ec_key, POINT_CONVERSION_COMPRESSED); + + ostr = NULL; + if ((ostr_len = i2o_ECPublicKey(ec_key, &ostr)) <= 0) { + fprintf(stderr, "FAIL: i2o_ECPublicKey for %s\n", key->name); + ostr_len = 0; + goto err; + } + + if ((ec_pub_key = EC_KEY_new()) == NULL) + errx(1, "EC_KEY_new"); + if (!EC_KEY_set_group(ec_pub_key, EC_KEY_get0_group(ec_key))) { + fprintf(stderr, "FAIL: EC_KEY_set_group() for %s\n", key->name); + goto err; + } + + if ((form = EC_KEY_get_conv_form(ec_pub_key)) != POINT_CONVERSION_UNCOMPRESSED) { + fprintf(stderr, "FAIL: EC_KEY_get_conv_form() for %s:\n" + "got %02x, want %02x\n", key->name, form, POINT_CONVERSION_UNCOMPRESSED); + goto err; + } + + /* Need to pass in the public key to tell o2i about the group... */ + p = ostr; + if (o2i_ECPublicKey(&ec_pub_key, &p, ostr_len) == NULL) { + fprintf(stderr, "FAIL: o2i_ECPublicKey() for %s\n", key->name); + goto err; + } + + if ((form = EC_KEY_get_conv_form(ec_pub_key)) != POINT_CONVERSION_COMPRESSED) { + fprintf(stderr, "FAIL: EC_KEY_get_conv_form() for %s:\n" + "got %02x, want %02x\n", key->name, form, POINT_CONVERSION_COMPRESSED); + goto err; + } + + if ((rv = EC_POINT_cmp(EC_KEY_get0_group(ec_pub_key), + EC_KEY_get0_public_key(ec_pub_key), EC_KEY_get0_public_key(ec_key), + NULL)) != 0) { + fprintf(stderr, "FAIL: EC_POINT_cmp() returned %d for %s\n", + rv, key->name); + goto err; + } + + failed = 0; + + err: + EC_KEY_free(ec_key); + EC_KEY_free(ec_pub_key); + freezero(ostr, ostr_len); + + return failed; +} + +static int +ec_key_test_hybrid_roundtrip(const struct ec_private_key *key, + const EC_KEY *ec_key_orig) +{ + EC_KEY *ec_key = NULL, *ec_pub_key = NULL; + const unsigned char *p; + unsigned char *der = NULL; + int der_len = 0; + unsigned int flags; + int rv; + uint8_t form; + int failed = 1; + + if ((ec_key = EC_KEY_new()) == NULL) + errx(1, "EC_KEY_new()"); + + if (EC_KEY_copy(ec_key, ec_key_orig) == NULL) { + fprintf(stderr, "FAIL: failed to kopy EC_KEY for %s\n", key->name); + goto err; + } + + EC_KEY_set_conv_form(ec_key, POINT_CONVERSION_HYBRID); + EC_KEY_set_enc_flags(ec_key, EC_PKEY_NO_PARAMETERS | EC_PKEY_NO_PUBKEY); + + if ((der_len = i2d_ECPrivateKey(ec_key, &der)) <= 0) { + fprintf(stderr, "FAIL: i2d_ECPrivateKey(2) for %s\n", key->name); + der_len = 0; + goto err; + } + + if ((ec_pub_key = EC_KEY_new()) == NULL) + errx(1, "EC_KEY_new"); + if (!EC_KEY_set_group(ec_pub_key, EC_KEY_get0_group(ec_key))) { + fprintf(stderr, "FAIL: EC_KEY_set_group() for %s\n", key->name); + goto err; + } + /* Change away from the default to see if it changed below. */ + EC_KEY_set_conv_form(ec_pub_key, POINT_CONVERSION_COMPRESSED); + + if ((flags = EC_KEY_get_enc_flags(ec_pub_key)) != 0) { + fprintf(stderr, "FAIL: EC_KEY_get_enc_flags() returned %x for %s\n", + flags, key->name); + goto err; + } + + p = der; + if (d2i_ECPrivateKey(&ec_pub_key, &p, der_len) == NULL) { + fprintf(stderr, "FAIL: d2i_ECPrivateKey for public %s\n", key->name); + goto err; + } + + /* For reasons of inconsistency, only EC_PKEY_NO_PUBKEY is set. */ + if ((flags = EC_KEY_get_enc_flags(ec_pub_key)) != EC_PKEY_NO_PUBKEY) { + fprintf(stderr, "FAIL: EC_KEY_get_enc_flags() for public %s: " + " got %x, want %x\n", key->name, flags, EC_PKEY_NO_PUBKEY); + goto err; + } + + /* We had to compute the public key, so point conversion form is unchanged. */ + if ((form = EC_KEY_get_conv_form(ec_pub_key)) != POINT_CONVERSION_COMPRESSED) { + fprintf(stderr, "FAIL: EC_KEY_get_conv_form() not compressed for %s:\n" + "got %02x, want %02x\n", key->name, form, POINT_CONVERSION_COMPRESSED); + goto err; + } + + if ((rv = EC_POINT_cmp(EC_KEY_get0_group(ec_pub_key), + EC_KEY_get0_public_key(ec_pub_key), EC_KEY_get0_public_key(ec_key), + NULL)) != 0) { + fprintf(stderr, "FAIL: EC_POINT_cmp() returned %d for %s " + "after DER roundtrip\n", rv, key->name); + goto err; + } + + failed = 0; + + err: + EC_KEY_free(ec_key); + EC_KEY_free(ec_pub_key); + freezero(der, der_len); + + return failed; +} + +static int +ec_key_test_parameter_roundtrip(const struct ec_private_key *key, + EC_KEY *ec_key) +{ + EC_KEY *ec_pub_key = NULL; + const unsigned char *p; + unsigned char *der = NULL; + int der_len = 0; + int rv; + int failed = 1; + + if ((der_len = i2d_ECParameters(ec_key, &der)) <= 0) { + fprintf(stderr, "FAIL: i2d_ECParameters returned %d for %s\n", + der_len, key->name); + goto err; + } + + /* See if we leak on reuse, whether the curve is right or not. */ + if ((ec_pub_key = EC_KEY_new_by_curve_name(NID_secp256k1)) == NULL) + errx(1, "EC_KEY_new_by_curve_name"); + + p = der; + if (d2i_ECParameters(&ec_pub_key, &p, der_len) == NULL) { + fprintf(stderr, "FAIL: d2i_ECParameters for %s\n", key->name); + goto err; + } + + if ((rv = EC_GROUP_cmp(EC_KEY_get0_group(ec_key), + EC_KEY_get0_group(ec_pub_key), NULL)) != 0) { + fprintf(stderr, "FAIL: EC_GROUP_cmp returned %d for %s\n", + rv, key->name); + goto err; + } + + failed = 0; + + err: + EC_KEY_free(ec_pub_key); + freezero(der, der_len); + + return failed; +} + +static int +ec_group_check_private_key(const struct ec_private_key *key) +{ + EC_KEY *ec_key = NULL; + int failed = 0; + + if ((ec_key = ec_key_check_sanity(key)) == NULL) { + fprintf(stderr, "FAIL: ec_key_check_sanity() for %s\n", key->name); + failed = 1; + goto err; + } + + failed |= ec_key_test_point_encoding(key, ec_key); + failed |= ec_key_test_point_versus_bn(key, ec_key); + failed |= ec_key_test_i2o_and_o2i(key, ec_key); + failed |= ec_key_test_hybrid_roundtrip(key, ec_key); + failed |= ec_key_test_parameter_roundtrip(key, ec_key); + + err: + EC_KEY_free(ec_key); + + return failed; +} + +static int +ec_group_check_private_keys(void) +{ + size_t i; + int failed = 0; + + for (i = 0; i < N_EC_PRIVATE_KEYS; i++) + failed |= ec_group_check_private_key(&ec_private_keys[i]); + + return failed; +} + int main(int argc, char **argv) { @@ -906,6 +2480,7 @@ main(int argc, char **argv) failed |= ec_group_pkparameters_correct_padding_test(); failed |= ec_group_roundtrip_builtin_curves(); failed |= ec_group_non_builtin_curves(); + failed |= ec_group_check_private_keys(); - return (failed); + return failed; } diff --git a/regress/lib/libcrypto/ec/ec_point_conversion.c b/regress/lib/libcrypto/ec/ec_point_conversion.c index 0c1b09d22..a0b849d16 100644 --- a/regress/lib/libcrypto/ec/ec_point_conversion.c +++ b/regress/lib/libcrypto/ec/ec_point_conversion.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ec_point_conversion.c,v 1.15 2024/01/18 16:49:40 tb Exp $ */ +/* $OpenBSD: ec_point_conversion.c,v 1.17 2024/10/23 15:06:46 tb Exp $ */ /* * Copyright (c) 2021 Theo Buehler * Copyright (c) 2021 Joel Sing @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -204,8 +205,9 @@ static const struct point_conversion { const char *description; int nid; uint8_t octets[256]; - uint8_t octets_len; + size_t octets_len; int valid; + int point_at_infinity; } point_conversions[] = { /* XXX - now that sect571 is no longer tested, add another test? */ { @@ -214,6 +216,7 @@ static const struct point_conversion { .octets = { 0x00 }, .octets_len = 1, .valid = 1, + .point_at_infinity = 1, }, { .description = "point at infinity on secp256r1 (flipped y_bit)", @@ -221,6 +224,7 @@ static const struct point_conversion { .octets = { 0x01 }, .octets_len = 1, .valid = 0, + .point_at_infinity = 1, }, { .description = "zero x compressed point on secp256r1", @@ -491,6 +495,49 @@ static const struct point_conversion { static const size_t N_POINT_CONVERSIONS = sizeof(point_conversions) / sizeof(point_conversions[0]); +static int +check_point_at_infinity(const EC_GROUP *group, const EC_POINT *point, + const struct point_conversion *test) +{ + const uint8_t conversion_forms[4] = { 0x00, 0x02, 0x04, 0x06, }; + uint8_t buf[1]; + uint8_t form; + size_t i, ret; + int failed = 0; + + /* The form for the point at infinity is expected to fail. */ + form = conversion_forms[0]; + + ret = EC_POINT_point2oct(group, point, form, buf, sizeof(buf), NULL); + if (ret != 0) { + fprintf(stderr, "FAIL: %s: expected encoding with form 0x%02x " + "to fail, got %zu\n", test->description, form, ret); + failed |= 1; + } + + /* For all other forms we expect the zero octet. */ + for (i = 1; i < sizeof(conversion_forms); i++) { + form = conversion_forms[i]; + + ret = EC_POINT_point2oct(group, point, form, buf, sizeof(buf), NULL); + if (ret != 1) { + fprintf(stderr, "FAIL: %s: expected success, got %zu\n", + test->description, ret); + failed |= 1; + continue; + } + + if (memcmp(buf, test->octets, test->octets_len) != 0) { + fprintf(stderr, "FAIL: %s: want 0x%02x, got 0x%02x\n", + test->description, test->octets[0], buf[0]); + failed |= 1; + continue; + } + } + + return failed; +} + static int point_conversion_form_y_bit(const struct point_conversion *test) { @@ -512,6 +559,33 @@ point_conversion_form_y_bit(const struct point_conversion *test) failed |= 1; } + if (test->valid && test->point_at_infinity) { + failed |= check_point_at_infinity(group, point, test); + } else if (test->valid) { + uint8_t buf[256]; + uint8_t form = test->octets[0] & 0x06; + size_t len; + + len = EC_POINT_point2oct(group, point, form, buf, sizeof(buf), NULL); + + if (len != test->octets_len) { + fprintf(stderr, "%s: EC_POINT_point2oct: want %zu, got %zu\n", + test->description, test->octets_len, len); + failed |= 1; + goto failed; + } + if (memcmp(test->octets, buf, len) != 0) { + fprintf(stderr, "%s: unexpected encoding\nwant:\n", + test->description); + hexdump(test->octets, test->octets_len); + fprintf(stderr, "\ngot:\n"); + hexdump(buf, len); + failed |= 1; + goto failed; + } + } + + failed: EC_GROUP_free(group); EC_POINT_free(point); diff --git a/regress/lib/libcrypto/ec/ectest.c b/regress/lib/libcrypto/ec/ectest.c index b653ab787..48f05eeee 100644 --- a/regress/lib/libcrypto/ec/ectest.c +++ b/regress/lib/libcrypto/ec/ectest.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ectest.c,v 1.24 2024/10/18 19:55:34 tb Exp $ */ +/* $OpenBSD: ectest.c,v 1.26 2025/01/06 10:43:26 tb Exp $ */ /* * Originally written by Bodo Moeller for the OpenSSL project. */ @@ -92,9 +92,6 @@ #define TIMING_RAND_PT 1 #define TIMING_SIMUL 2 -int EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *group, - const EC_POINT *point, BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *ctx); - /* test multiplication with group order, long and negative scalars */ static void group_order_tests(EC_GROUP *group) @@ -325,14 +322,12 @@ prime_field_tests(void) fprintf(stdout, "\nGenerator as octet string, hybrid form:\n "); for (i = 0; i < len; i++) fprintf(stdout, "%02X", buf[i]); - if (!EC_POINT_get_Jprojective_coordinates_GFp(group, R, x, y, z, ctx)) + if (!EC_POINT_get_affine_coordinates(group, R, x, y, ctx)) ABORT; - fprintf(stdout, "\nA representation of the inverse of that generator in\nJacobian projective coordinates:\n X = 0x"); + fprintf(stdout, "\nThe inverse of that generator:\n X = 0x"); BN_print_fp(stdout, x); fprintf(stdout, ", Y = 0x"); BN_print_fp(stdout, y); - fprintf(stdout, ", Z = 0x"); - BN_print_fp(stdout, z); fprintf(stdout, "\n"); if (!EC_POINT_invert(group, P, ctx)) diff --git a/regress/lib/libcrypto/ecdh/ecc_cdh.c b/regress/lib/libcrypto/ecdh/ecc_cdh.c index 0333cf1e8..39351cd7d 100644 --- a/regress/lib/libcrypto/ecdh/ecc_cdh.c +++ b/regress/lib/libcrypto/ecdh/ecc_cdh.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ecc_cdh.c,v 1.2 2023/07/16 08:25:41 tb Exp $ */ +/* $OpenBSD: ecc_cdh.c,v 1.4 2024/12/24 18:32:31 tb Exp $ */ /* * Copyright (c) 2023 Theo Buehler @@ -40,232 +40,6 @@ static const struct ecc_cdh_test { const char *pub_y; const char *want; } ecc_cdh_tests[] = { - { - .nid = NID_X9_62_prime192v1, - .peer_x = "42ea6dd9969dd2a61fea1aac7f8e98edcc896c6e55857cc0", - .peer_y = "dfbe5d7c61fac88b11811bde328e8a0d12bf01a9d204b523", - .priv = "f17d3fea367b74d340851ca4270dcb24c271f445bed9d527", - .pub_x = "b15053401f57285637ec324c1cd2139e3a67de3739234b37", - .pub_y = "f269c158637482aad644cd692dd1d3ef2c8a7c49e389f7f6", - .want = "803d8ab2e5b6e6fca715737c3a82f7ce3c783124f6d51cd0", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "deb5712fa027ac8d2f22c455ccb73a91e17b6512b5e030e7", - .peer_y = "7e2690a02cc9b28708431a29fb54b87b1f0c14e011ac2125", - .priv = "56e853349d96fe4c442448dacb7cf92bb7a95dcf574a9bd5", - .pub_x = "c00d435716ffea53fd8c162792414c37665187e582716539", - .pub_y = "ab711c62aa71a5a18e8a3c48f89dc6fa52fac0108e52a8a0", - .want = "c208847568b98835d7312cef1f97f7aa298283152313c29d", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "4edaa8efc5a0f40f843663ec5815e7762dddc008e663c20f", - .peer_y = "0a9f8dc67a3e60ef6d64b522185d03df1fc0adfd42478279", - .priv = "c6ef61fe12e80bf56f2d3f7d0bb757394519906d55500949", - .pub_x = "e184bc182482f3403c8787b83842477467fcd011db0f6c64", - .pub_y = "f9d1c14142f40de8639db97d51a63d2cce1007ccf773cdcb", - .want = "87229107047a3b611920d6e3b2c0c89bea4f49412260b8dd", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "8887c276edeed3e9e866b46d58d895c73fbd80b63e382e88", - .peer_y = "04c5097ba6645e16206cfb70f7052655947dd44a17f1f9d5", - .priv = "e6747b9c23ba7044f38ff7e62c35e4038920f5a0163d3cda", - .pub_x = "2b838dbe73735f37a39a78d3195783d26991e86ff4d92d1a", - .pub_y = "60d344942274489f98903b2e7f93f8d197fc9ae60a0ed53a", - .want = "eec0bed8fc55e1feddc82158fd6dc0d48a4d796aaf47d46c", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "0d045f30254adc1fcefa8a5b1f31bf4e739dd327cd18d594", - .peer_y = "542c314e41427c08278a08ce8d7305f3b5b849c72d8aff73", - .priv = "beabedd0154a1afcfc85d52181c10f5eb47adc51f655047d", - .pub_x = "1f65cf6e8978e1c1bc10bb61a7db311de310088c8cf9768b", - .pub_y = "f7d438168e7f42ab14b16af53a7a2f646ff40b53d74cbcc7", - .want = "716e743b1b37a2cd8479f0a3d5a74c10ba2599be18d7e2f4", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "fb35ca20d2e96665c51b98e8f6eb3d79113508d8bccd4516", - .peer_y = "368eec0d5bfb847721df6aaff0e5d48c444f74bf9cd8a5a7", - .priv = "cf70354226667321d6e2baf40999e2fd74c7a0f793fa8699", - .pub_x = "5f4844ffcce61005d24f737db98675e92f7b6543aeb6106c", - .pub_y = "5424f598139215d389b6b12b86d58014857f2ddadb540f51", - .want = "f67053b934459985a315cb017bf0302891798d45d0e19508", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "824752960c1307e5f13a83da21c7998ca8b5b00b9549f6d0", - .peer_y = "bc52d91e234363bc32ee0b6778f25cd8c1847510f4348b94", - .priv = "fe942515237fffdd7b4eb5c64909eee4856a076cdf12bae2", - .pub_x = "e6369df79b207b8b8679f7c869cfc264859d1ab55aa401e8", - .pub_y = "1f99c71f801a30b52f74da6e5e6dbb62ee4c5da1090cc020", - .want = "75822971193edd472bf30151a782619c55ad0b279c9303dd", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "10bb57020291141981f833b4749e5611034b308e84011d21", - .peer_y = "e1cacd6b7bd17ed8ddb50b6aee0654c35f2d0eddc1cffcf6", - .priv = "33fed10492afa5bea0333c0af12cac940c4d222455bcd0fe", - .pub_x = "ef0b28afc41637d737f42e4c8aaceadc84ba2e0b849ca18c", - .pub_y = "57797942e552173bba17f73278e029f42335068bd770ddf2", - .want = "67cba2cbb69ee78bf1abafb0e6fbe33fa2094c128d59652d", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "5192fce4185a7758ea1bc56e0e4f4e8b2dce32348d0dced1", - .peer_y = "20989981beaaf0006d88a96e7971a2fa3a33ba46047fc7ba", - .priv = "f3557c5d70b4c7954960c33568776adbe8e43619abe26b13", - .pub_x = "d70112c5f0f0844386494ac1ad99dce2214134176ebfb9af", - .pub_y = "d3c187a038510ab31d459e2b7af1a380dd7576af06267548", - .want = "cf99a2770a386ca0137d1eca0a226e484297ac3c513f3631", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "26d019dbe279ead01eed143a91601ada26e2f42225b1c62b", - .peer_y = "6ca653f08272e0386fc9421fbd580093d7ae6301bca94476", - .priv = "586cfba1c6e81766ed52828f177b1be14ebbc5b83348c311", - .pub_x = "58b3c63e56bec9d696bf9a88df2873738391f76368aa2b49", - .pub_y = "5776773b261faf7ba2fdc4fe43b92c0b1c7a2fd054a43650", - .want = "576331e2b4fb38a112810e1529834de8307fb0a0d2756877", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "539bc40fe20a0fb267888b647b03eaaf6ec20c02a1e1f8c8", - .peer_y = "69095e5bb7b4d44c3278a7ee6beca397c45246da9a34c8be", - .priv = "cad8100603a4f65be08d8fc8a1b7e884c5ff65deb3c96d99", - .pub_x = "b7fcc0f52c7a411edbed39e10bf02b6ae0f26614c6b325a2", - .pub_y = "47483b26eb67776de2b93ab7119d5447573739e3d55e72fb", - .want = "902f4501916a0dd945554c3a37b3d780d375a6da713197c4", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "5d343ddb96318fb4794d10f6c573f99fee5d0d57b996250f", - .peer_y = "99fbdf9d97dd88ad410235dac36e5b92ce2824b8e587a82c", - .priv = "1edd879cc5c79619cae6c73a691bd5a0395c0ef3b356fcd2", - .pub_x = "6ce6adb2c30808f590048c33dffad4524ebf7a5fd39b747b", - .pub_y = "4966bd2f3d00569b4d4c0409fbd7a2db752f6d09bca8c25f", - .want = "46e4de335054d429863218ae33636fc9b89c628b64b506c7", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "8d3db9bdce137ffbfb891388c37df6c0cbc90aa5e5376220", - .peer_y = "135d30b5cb660eef8764ffc744f15c1b5d6dc06ba4416d37", - .priv = "460e452273fe1827602187ad3bebee65cb84423bb4f47537", - .pub_x = "d1bd3a3efabf4767fe6380bdf0dbf49d52d4cf0cbb89404c", - .pub_y = "c150c2b4c8b3aa35f765f847e4f7f8fd8704d241a181ee99", - .want = "1bfe9e5a20ac7a38d8f605b425bb9030be31ef97c101c76c", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "9e0a6949519c7f5be68c0433c5fdf13064aa13fb29483dc3", - .peer_y = "e1c8ba63e1f471db23185f50d9c871edea21255b3a63b4b7", - .priv = "b970365008456f8758ecc5a3b33cf3ae6a8d568107a52167", - .pub_x = "c1b8610c8c63f8d4abda093b9a11a566044bf65c6faa8999", - .pub_y = "a5bc4b3ca095382e9738aee95fe9479b17879b3ad5295559", - .want = "0e8c493a4adc445dc9288a3b9b272599224054592d7265b3", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "be088238902e9939b3d054eeeb8492daf4bdcf09a2ab77f1", - .peer_y = "58d6749a3a923dc80440f2661fd35b651617e65294b46375", - .priv = "59c15b8a2464e41dfe4371c7f7dadf470ae425544f8113bd", - .pub_x = "1fe776f73567b6ac0b0d6764164de6c5be751ba8d1ff455e", - .pub_y = "4c160bf38afb2b71f684261664115ce874553e8b059432d2", - .want = "0f1991086b455ded6a1c4146f7bf59fe9b495de566ebc6bf", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "bf5ae05025e1be617e666d87a4168363873d5761b376b503", - .peer_y = "e1e6e38b372b6bee0ff5b3502d83735e3b2c26825e4f0fcc", - .priv = "a6e9b885c66b959d1fc2708d591b6d3228e49eb98f726d61", - .pub_x = "632bb7651dbf49dde9dd125d13fb234e06617723beed3d1b", - .pub_y = "f4ad5209638488397c5f44f994dd7479807e79f4887d2e71", - .want = "b30f2127c34df35aaa91dbf0bbe15798e799a03ed11698c1", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "6cc4feed84c7ab0d09005d660ed34de6955a9461c4138d11", - .peer_y = "31225f33864ed48da06fa45a913b46cf42557742e35085e6", - .priv = "bdb754096ffbfbd8b0f3cb046ccb7ca149c4e7192067a3ee", - .pub_x = "d9c098d421d741f6faab116f3e4731d28c5558e19fe112a1", - .pub_y = "38d4dc48ccdb1d3ed8d31fd06784a4f87a68aec1cbd5b08f", - .want = "64a5c246599d3e8177a2402a1110eb81e6c456ab4edb5127", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "36157315bee7afedded58c4e8ba14d3421c401e51135bcc9", - .peer_y = "37c297ca703f77c52bb062d8ce971db84097ba0c753a418f", - .priv = "d5bcf2534dafc3d99964c7bd63ab7bd15999fe56dd969c42", - .pub_x = "fda1d5d28d6fe0e7909d6a8bafa7824db5572ab92ffe7de6", - .pub_y = "134a297c1d9c8bbab249abacd951ed11e5a99f92e7991572", - .want = "017b8ca53c82fab163da2ab783966a39e061b32c8cfa334d", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "98464d47f0256f8292e027e8c92582ea77cf9051f5ce8e5d", - .peer_y = "449552ef7578be96236fe5ed9d0643c0bb6c5a9134b0108d", - .priv = "43d4b9df1053be5b4268104c02244d3bf9594b010b46a8b2", - .pub_x = "c3020b7091463d788f1f1d76f7cfeec82ecdb3b7d99c345c", - .pub_y = "9a7710d5179591d8f3df0aa122301768ae7db7eee2d7f583", - .want = "340ef3db3dbebdd91c62c3d4e1a3da2c7c52a3338b865259", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "563eb66c334cf6f123bf04c7803b48a3110214237e983bf5", - .peer_y = "0f351104819199ef07c9a6051d20758f3af79027ea66a53f", - .priv = "94cac2c2ca714746401670d94edbf3f677867b5a03bee7ad", - .pub_x = "b18554a2e743ef0aa2f040987c4c451004e096df3d80ddae", - .pub_y = "6e3e2c618f896e36ba620077684b70a05ffb79bf5e6c7640", - .want = "2162144921df5103d0e6a650fb13fd246f4738d0896ce92f", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "86828c4ac92b5507618aec7873a1d4fc6543c5be33cf3078", - .peer_y = "b22ca72437545e10d6d4f052422eb898b737a4b8543ee550", - .priv = "2a3a9e33c8cc3107a9f9265c3bdea1206570e86f92ac7014", - .pub_x = "a7ba38be1bc669dd23ccfcee0645b1f0db8cf942deafaeb6", - .pub_y = "b82db79d80cd0e37f28d4163adc389dee8fc7797b5c9831b", - .want = "4c69e7feed4b11159adfc16a6047a92572ea44e0740b23af", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "6700a102437781a9581da2bc25ced5abf419da91d3c803df", - .peer_y = "71396c9cf08bcd91854e3e6e42d8c657ce0f27ab77a9dc4b", - .priv = "4a6b78a98ac98fa8e99a8ece08ec0251125f85c6fd0e289b", - .pub_x = "e769dbbcd5ce2d83514b768d3d2d5aa0bcd8f66af15f5500", - .pub_y = "2fc6d0b039e0f28f74fbeffe9e883d4dd72296e4e95cae71", - .want = "46072acefd67bff50de355ca7a31fa6be59f26e467587259", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "a82f354cf97bee5d22dc6c079f2902ead44d96a8f614f178", - .peer_y = "a654a9aa8a1a0802f2ce0ee8a0f4ebe96dee1b37464b1ff2", - .priv = "c5a6491d78844d6617ef33be6b8bd54da221450885d5950f", - .pub_x = "db1b24f7466bc154e9d7d2c3ca52dcfe0bfc9563c5fdb6f3", - .pub_y = "1c74fbbf5bd99921f1a9a744f8e1cf770bd6a76a772b3003", - .want = "ec5580eabca9f3389d2b427ddf6e49e26d629afd03fa766e", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "3cec21b28668a12a2cf78e1a8e55d0efe065152fffc34718", - .peer_y = "1029557beba4ff1992bd21c23cb4825f6dae70e3318fd1ca", - .priv = "2ba2703c5e23f6463c5b88dc37292fabd3399b5e1fb67c05", - .pub_x = "7543148906cef9b37a71a7c08363cdd3bba50142d65241aa", - .pub_y = "8b3a6973de8dc271e27c1ead1e962fdaae3710c724daac38", - .want = "7f3929dd3cbf7673bc30d859d90b880307475f800660ea32", - }, - { - .nid = NID_X9_62_prime192v1, - .peer_x = "7082644715b8b731f8228b5118e7270d34d181f361a221fc", - .peer_y = "464649d6c88ca89614488a1cc7b8442bb42f9fb3020a3d76", - .priv = "836118c6248f882e9147976f764826c1a28755a6102977d5", - .pub_x = "fcd345a976c720caaa97de6697226825615e1287a9eff67e", - .pub_y = "58ea42edbeeafca9ff44cfd7f29abd2cbde7626d79e422c9", - .want = "72e88f3ea67d46d46dbf83926e7e2a6b85b54536741e6d2c", - }, - { .nid = NID_secp224r1, .peer_x = diff --git a/regress/lib/libcrypto/ecdh/ecdhtest.c b/regress/lib/libcrypto/ecdh/ecdhtest.c index 7d7bbf546..465a45d1d 100644 --- a/regress/lib/libcrypto/ecdh/ecdhtest.c +++ b/regress/lib/libcrypto/ecdh/ecdhtest.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ecdhtest.c,v 1.20 2023/07/16 07:34:07 tb Exp $ */ +/* $OpenBSD: ecdhtest.c,v 1.22 2024/12/24 18:32:31 tb Exp $ */ /* ==================================================================== * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. * @@ -174,12 +174,6 @@ static const struct ecdh_kat_test { const char *want; } ecdh_kat_tests[] = { /* Keys and shared secrets from RFC 5114 */ - { - .nid = NID_X9_62_prime192v1, - .keya = "323fa3169d8e9c6593f59476bc142000ab5be0e249c43426", - .keyb = "631f95bb4a67632c9c476eee9ab695ab240a0499307fcf62", - .want = "ad420182633f8526bfe954acda376f05e5ff4f837f54febe", - }, { .nid = NID_secp224r1, .keya = "b558eb6c288da707bbb4f8fbae2ab9e9cb62e3bc5c7573e2" diff --git a/regress/lib/libcrypto/man/check_complete.pl b/regress/lib/libcrypto/man/check_complete.pl index c69ff2fb1..5f2d12ec7 100755 --- a/regress/lib/libcrypto/man/check_complete.pl +++ b/regress/lib/libcrypto/man/check_complete.pl @@ -31,8 +31,19 @@ my %internal = ( BN_TBIT BN_ULLONG )], evp => [qw( - EVP_MD_CTRL_ALG_CTRL - EVP_MD_CTX_FLAG_CLEANED EVP_MD_CTX_FLAG_REUSE + ASN1_PKEY_CTRL_CMS_ENVELOPE ASN1_PKEY_CTRL_CMS_RI_TYPE + ASN1_PKEY_CTRL_CMS_SIGN + dh_st dsa_st ec_key_st + EVP_MD_CTRL_ALG_CTRL + EVP_MD_CTX_FLAG_CLEANED EVP_MD_CTX_FLAG_REUSE + EVP_PKEY_ALG_CTRL + EVP_PKEY_CTRL_CMS_DECRYPT EVP_PKEY_CTRL_CMS_ENCRYPT + EVP_PKEY_CTRL_CMS_SIGN + EVP_PKEY_CTRL_DIGESTINIT + EVP_PKEY_CTRL_PEER_KEY + EVP_PKEY_CTRL_PKCS7_DECRYPT EVP_PKEY_CTRL_PKCS7_ENCRYPT + EVP_PKEY_CTRL_PKCS7_SIGN + rsa_st )], x509_vfy => [qw( X509_VERIFY_PARAM_ID @@ -62,9 +73,20 @@ my %obsolete = ( BN_HEX_FMT1 BN_HEX_FMT2 BN_MASK )], evp => [qw( - EVP_MD_CTRL_DIGALGID - EVP_MD_CTX_FLAG_NON_FIPS_ALLOW EVP_MD_CTX_FLAG_PAD_MASK - EVP_MD_CTX_FLAG_PAD_PKCS1 EVP_MD_CTX_FLAG_PAD_PSS + EVP_CIPH_FLAG_FIPS EVP_CIPH_FLAG_NON_FIPS_ALLOW + EVP_CTRL_AEAD_SET_MAC_KEY EVP_CTRL_AEAD_TLS1_AAD + EVP_CTRL_GET_RC5_ROUNDS EVP_CTRL_GOST_SET_SBOX + EVP_CTRL_PBE_PRF_NID EVP_CTRL_SET_RC5_ROUNDS + EVP_MD_CTRL_DIGALGID EVP_MD_CTRL_GOST_SET_SBOX EVP_MD_CTRL_SET_KEY + EVP_MD_CTX_FLAG_NON_FIPS_ALLOW EVP_MD_CTX_FLAG_PAD_MASK + EVP_MD_CTX_FLAG_PAD_PKCS1 EVP_MD_CTX_FLAG_PAD_PSS + EVP_MD_FLAG_DIGALGID_MASK + EVP_PBE_KEYGEN + EVP_PKEY_CTRL_SET_IV + EVP_PKEY_GOSTIMIT EVP_PKEY_GOSTR01 + EVP_PKEY_GOSTR12_256 EVP_PKEY_GOSTR12_512 + EVP_PKEY_MO_DECRYPT EVP_PKEY_MO_ENCRYPT + EVP_PKEY_MO_SIGN EVP_PKEY_MO_VERIFY )], ); @@ -215,6 +237,7 @@ try_again: if (/^\s*$/ || /^DECLARE_STACK_OF\(\w+\)$/ || + /^DECLARE_PKCS12_STACK_OF\(\w+\)$/ || /^TYPEDEF_D2I2D_OF\(\w+\);$/ || /^#define __bounded__\(\w+, \w+, \w+\)$/ || /^#define HEADER_\w+_H$/ || diff --git a/regress/lib/libcrypto/mlkem/Makefile b/regress/lib/libcrypto/mlkem/Makefile new file mode 100644 index 000000000..a08623c90 --- /dev/null +++ b/regress/lib/libcrypto/mlkem/Makefile @@ -0,0 +1,39 @@ +# $OpenBSD: Makefile,v 1.9 2024/12/29 20:14:15 tb Exp $ + +REGRESS_SLOW_TARGETS += run-regress-mlkem_iteration_tests + +PROGS += mlkem_tests +PROGS += mlkem_unittest +PROGS += mlkem_iteration_tests + +FILE_TEST += mlkem768_decap_tests +FILE_TEST += mlkem768_encap_tests +FILE_TEST += mlkem768_keygen_tests +FILE_TEST += mlkem768_nist_decap_tests +FILE_TEST += mlkem768_nist_keygen_tests +FILE_TEST += mlkem1024_decap_tests +FILE_TEST += mlkem1024_encap_tests +FILE_TEST += mlkem1024_keygen_tests +FILE_TEST += mlkem1024_nist_decap_tests +FILE_TEST += mlkem1024_nist_keygen_tests + +run-regress-mlkem_tests: mlkem_tests +.for f in ${FILE_TEST} + ./mlkem_tests $f ${.CURDIR}/$f.txt +.endfor + +SRCS_mlkem_tests = mlkem_tests.c mlkem_tests_util.c parse_test_file.c +SRCS_mlkem_iteration_tests = mlkem_iteration_tests.c mlkem_tests_util.c +SRCS_mlkem_unittest = mlkem_unittest.c mlkem_tests_util.c + +LDADD = ${CRYPTO_INT} +DPADD = ${LIBCRYPTO} + +CFLAGS += -DLIBRESSL_INTERNAL -Wall -Werror +CFLAGS += -I${.CURDIR}/../../../../lib/libcrypto/bytestring +CFLAGS += -I${.CURDIR}/../../../../lib/libcrypto/mlkem +CFLAGS += -I${.CURDIR}/../../../../lib/libcrypto/sha + +WARNINGS = Yes + +.include diff --git a/regress/lib/libcrypto/mlkem/mlkem1024_decap_tests.txt b/regress/lib/libcrypto/mlkem/mlkem1024_decap_tests.txt new file mode 100644 index 000000000..b4b06e088 --- /dev/null +++ b/regress/lib/libcrypto/mlkem/mlkem1024_decap_tests.txt @@ -0,0 +1,1829 @@ +# Official test vector 0, seed: "061550234d158c5ec95595fe04ef7a25767f2e24cc2bc479d09d86dc9abcfde7056a8c266f9ef97ed08541dbd2e1ffa1" +private_key: 433a70ee6950f9882acdd5a47820a6a8163708f04d457c779979b83fe117224701490830386637da332e74b1aeda0b2f81ca4f9bb2c2b02b0cfd680c11482f335acf7b9139b5b88a34e3542c6861377545983343cd829414e47864212e78f855f52390379acc3a62953131b63ee832adb3bf4bf58e247349b5e097e55abe497b15982373ae732e0439ac67d05c7f037c8a739b18140e144c851dc9611f4bcf04f3a2093c197bd63bb5e6190100545ff81db7fccddd9a324b0bac3c2c2382284058f08b961952c094019c10be37a53d5ac794c010a9d0821f15027a1c419c3c71c9a1d28aed02597ab79b875394626ba39adc090c3a90cf75871a65275eb1c5b03372e13a1a23d0cf9374111f80cc83a905622b83fc513971ec8419f0880c3067633671b09b5456ab6057936d19a4a2a267911b000a13956fbd493821da072c04642b0c20da6cc0d9d864a39365dfd64f10187825fa33250749cbc0c905d7b1ff3cae2412bf86b81a817b86baa30edf7862e5f6bac98726e56b3cec60664caa2a7df670c5e207dfac03824c89897cb490eaa76521222c86205169c91c329c4a184d78721af836ad4db0ca78464d4171473012b7d183bafa627585c64be3809d7e6004cbdc79a5460f0ad677cb716512407d3a619ad09543b739547472a706b317a509be5d861fd66c7d0ed94cd5004795c18159e3a33d798711525f1635a68428172923249635aad032b9e56664bdd48ed24ac75c6468d1903e471086c5f1567e831a0508c539632591ab577d324a82429725809950761d8434288c14034f1c06c1d0aae09a71c740a55701c28ff84499f2bb18b6628caaa3fe75ac4de04c6f913900d86c88126252a17c4d303991db0287120881bb88478aaa9af9bc53d3729843858fdb4648059cac82c1a10878ba39823b041bd0e258487b56cc8a3220c1a58bf66a172b5b9a0c632d674eae885a015c4e37ba073680bede7534f3e34b6050c86b21c3c090941f23b7f6731e2bda0e6ea4646771cec572b98ca0a158919adbeb84ce585ff9f25ebdda6cb6f07a8f811232607e7217bb039babd0d91934a8594059c9687723c04381bfd627a10517f5f4bfc77777aa2671ae124f2b7a5f4d5614029197e6586fa8c17e0ad90781bc7bb19a772d5a4efe32cac89b76c42a5ede9bcc20c1898c08a5b0c07e478b1bbc226efad15f2ac737514b8c6149810779222416537ed00daeab177e903ead6b4ac42370af1b1f50ebafaa1c6e647bbacce72c7d0b88aeb0b06fc1a45457a9c187579bf184579cc351c43dff942605aa5604fc85fc5583f6f1496fe61d70d6cde2327fee713d86f29b3afcbb54e9a92a33a6c1ea6ffa309566b0686233c0f3b1c3144890e4f0829a6099c5749cdec84328ec2cb64a7385a761d64b3a23c489343343b97723ae78c7d805458e1620f0292897691704cb76e3b0b281a83cf64490498cbcaf04802416b33c565171d772d3b9354037587629ae14a5c5031ac36671a0d0c91cc0b4cd69d8402e33b9bcc2bbaf6b971e303fa137be232598a4999bc012574c81651b38b38396c1c365303ad25d49fc6b689951a1cc4c6007613065495f97910f9735d4ea4e442acb2fabaecfe1adef0667ba422c954a05d1b6167a263e1275c6ada8385965304b30324040542cf5a451bcafc74788be3b9b9fcc45d4790e2d7335c60a14f0a49d13053f2626a627ca19553cb336a2cb4a455d8ef3989491472ba0051ef7416e0bbf1a6108fa07c161548e7c62331ae5a2b4e4a108a51093d3150821a2fb547170a1b73c43c550c6557a4048a58a2cd77a244234b2235175a0897d5061b4613482dc136414048c11db37eae0a5df87c19314b0e82397a0d338dc21538af36149d93f8b1a11c53bb5def8b7a2cca3362b7fe3a1408a2547e209058c673a7566c26123a6d8b692a5f33ebdcb2624b79d877bce5fa14e42e83faad82e9900553a3c6045ca329fea4a506558c491b6a616c6fd400b42136f44cb0d0257650819018d3c568ef6c60c6c409e70a829287108c1b6a4d32f76e5cc4d104b02438ef7a467912398ea9c7cbd9981589a341897687b516a13307d66c068c444b4b949a17412413315ccf49b99980034b5b8cfdec4a60b9c1e7455aafbf3a757346990cc32b0599ba217a6c5fc39537911957c125148a87f41589cb222d0d19229e2cb55e1a044791e7ca61192a46460c3183d2bcd6de08a5e7651603acc349ca16cba18abb23a3e8c330d7421598a6278ec7ebfabca0ef488b2290554753499c0452e453815309955b8150fa1a1e393386dc12fdb27b38c6745f2944016ec457f39b18d604a07a1abe07bc844050ffa8a06fa154a49d88fac775452d6a7c0e589bfb5c370c2c4b6201dda80c9ab2076ecc08b44522fda3326f033806dd2693f319739f40c4f42b24aca7098fb8ff5f9ac20292d02b56ac746801acccc84863dee32878497b69438bf991776286650482c8d9d9587bc6a55b85c4d7fa74d02656b421c9e23e03a48d4b74425c26e4a20dd9562a4da0793f3a352ccc0f18217d868c7f5002abe768b1fc73f05744e7cc28f10344062c10e08eccced3c1f7d392c01d979dd718d8398374665a16a9870585c39d5589a50e133389c9b9a276c024260d9fc7711c81b6337b57da3c376d0cd74e14c73727b276656b9d8a4eb71896ff589d4b893e7110f3bb948ece291dd86c0b7468a678c746980c12aa6b95e2b0cbe4331bb24a33a270153aa472c47312382ca365c5f35259d025746fc6595fe636c767510a69c1e8a176b7949958f2697399497a2fc7364a12c8198295239c826cb5082086077282ed628651fc04c639b438522a9de309b14b086d6e923c551623bd72a733cb0dabc54a9416a99e72c9fda1cb3fb9ba06b8adb2422d68cadc553c98202a17656478ac044ef3456378abce9991e0141ba79094fa8f77a300805d2d32ffc62bf0ca4554c330c2bb7042db35102f68b1a0062583865381c74dd913af70b26cf0923d0c4cb971692222552a8f4b788b4afd1341a9df415cf203900f5ccf7f65988949a75580d049639853100854b21f4018003502bb1ba95f556a5d67c7eb52410eba288a6d0635ca8a4f6d696d0a020c826938d34943c3808c79cc007768533216bc1b29da6c812eff3340baa8d2e65344f09bd47894f5a3a4118715b3c5020679327f9189f7e10856b238bb9b0ab4ca85abf4b21f5c76bccd71850b22e045928276a0f2e951db0707c6a116dc19113fa762dc5f20bd5d2ab5be71744dc9cbdb51ea757963aac56a90a0d8023bed1f5cae8a64da047279b353a096a835b0b2b023b6aa048989233079aeb467e522fa27a5822921e5c551b4f537536e46f3a6a97e72c3b063104e09a040598940d872f6d871f5ef9b4355073b54769e45454e6a0819599408621ab4413b35507b0df578ce2d511d52058d5749df38b29d6cc58870caf92f69a75161406e71c5ff92451a77522b8b2967a2d58a49a81661aa65ac09b08c9fe45abc3851f99c730c45003aca2bf0f8424a19b7408a537d541c16f5682bfe3a7faea564f1298611a7f5f60922ba19de73b1917f1853273555199a649318b50773345c997460856972acb43fc81ab6321b1c33c2bb5098bd489d696a0f70679c1213873d08bdad42844927216047205633212310ee9a06cb10016c805503c341a36d87e56072eabe23731e34af7e2328f85cdb370ccaf00515b64c9c54bc837578447aacfaed5969aa351e7da4efa7b115c4c51f4a699779850295ca72d781ad41bc680532b89e710e2189eb3c50817ba255c7474c95ca9110cc43b8ba8e682c7fb7b0fdc265c0483a65ca4514ee4b832aac5800c3b08e74f563951c1fbb210353efa1aa866856bc1e034733b0485dab1d020c6bf765ff60b3b801984a90c2fe970bf1de97004a6cf44b4984ab58258b4af71221cd17530a700c32959c9436344b5316f09ccca7029a230d639dcb022d8ba79ba91cd6ab12ae1579c50c7bb10e30301a65cae3101d40c7ba927bb553148d1647024d4a06c8166d0b0b81269b7d5f4b34fb022f69152f514004a7c685368552343bb60360fbb9945edf446d345bdcaa7455c74ba0a551e184620fef97688773d50b6433ca7a7ac5cb6b7f671a15376e5a6747a623fa7bc6630373f5b1b512690a661377870a60a7a189683f9b0cf0466e1f750762631c4ab09f505c42dd28633569472735442851e321616d4009810777b6bd46fa7224461a5cc27405dfbac0d39b002cab33433f2a86eb8ce91c134a6386f860a1994eb4b6875a46d195581d173854b53d2293df3e9a822756cd8f212b325ca29b4f9f8cfbadf2e41869abfbad10738ad04cc752bc20c394746850e0c4847dbebbe41cd4dea489dedd00e76ae0bcf54aa8550202920eb64d5892ad02b13f2e58626ed79d451140800e03b59b956f8210e556067407d13dc90fa9e8b872bfb8f +ciphertext: c9bead6b0c1114389bd4761c73ab9095b5809daac9f659bb564af226173052a4a3e7f2e5fd47d2b02aaeb5189e06b9f4ae98b619cb63efbdf3989a94b36e8ea0d700633b950a0ae2a78ed92e85c85c70e13e626fb263fac9681521c3ab22fdab29173c9616a2b037083ff7b2e019b5bcde068fac257ef8f12798411693c1bdcc65420997a513a8a69502620be8e4ce7362e412a76cf51c1f2433f1ab64ce0e5d2f56d7c9ade994d0e35d0aeef3ac515b482437664d8c1d25e5a5507cf80f970d3ea7226aacdc457cbf88a0560aa35bb2c5c455867e2159910a35810befe3aa10eb04d8d57147cb8f66d2b070bac43d1f1ffdd57a9399951f64965727bcb9f66ad42309dafc799c1c540af1af93eff68a86d61f5115db662dee7ac9a362677762b6a164a0fa0a4d859e4b8c8dbdb4e183f5e6808fc52229650caf7cf3e16de3d895d148c35448ab8c2753c9831b24bd4921497eaa192565cabfd83c0c68dfe7d392abf5e5e6f84bb9f5af4b7118c0b558105f9c10c9b6d70682e1de6e0689d7106a6374bd34aed7229e6cb356f2ea65e680ce7b1e2c3704e116a38542826e8a001141baf2e34de37a03040986d4c0cd5d57f0701ce930986fd9525b58e2e59f45b8dd04c0f35b0f47970cc67079618eb9e6d91e9b0f8c6d2e165cf448a2c1ebf71b6537e0f375185dfafef698b6239bb35580b315bcb5ed408c357f192def89bc1b75cdd6aae8b5faf0c3e13803f6bdfa76fb407fcbda790c329b3ee42fd3d3b03bd5003f0bc432f7ba39631112452dfd12140433ff8980eb6a526ba85ef99477378b4dc76635a5cd5040e43b8c1fe4ee5e158e423bfc0c893c1d5613bed08da719c9073184eeb36fd357380fb1873d8cbd36e2255e985b1b76819743a6584a9b3a580996c9c2eed9bbbfff78a6204b5e5eeae5f4efd2660078b37f0754ab5da862e666b145b5f23f3d0977799929dfa2aedda53d152eda1d0d0e4ea43f6ed889bb965eefe0a7c685bb36770eaa874242c0e229cf6ce56defa5aeae64d0c40dda8aa26eaeb31458f070a3bc72e1619ee9b5f642291c56df5b7e43db6c802fc74f4f3f9b5c0d355c3aae520aa31229d12f3e7cc5d48e691191a36b283765f4133f0ff1fe2f01c6648b2798a74eb5d842a248f524a7e7f8974211297b44f0dd19f386e86be6ba782de77fde887226f37a1c77bc5eddeee5bf46b67fb7478d559865f262caa84d64a8ce59e4df0818e14861526acd3483600f3dae7959d35d8181ca6a81ce791be00752da7759446a2cfbe00b8248b93491debd520220b755416d2fc6b7c8af2ff75e5bcbb8e7537380a5721c77484957a69271d8bafce0f166735ff869232de5d381afbf0e44d69172b79a35191949de09703b94222b13c385c6081e6d2ede1e57fe184ef8f60196b9a3a7b7eff7497191ca8741b5a01e79cb69a61142e6f5d080fbb3e566f79e146f75c8a1097860841b4747df604dba954e4a8d9e0dccc1f609d05cf8d31219ecd60c312de684552f09227cb829291c645732c5f5d4d711639f42a23080aa34fe1420f219bd6bcf4e3b29b9d02293b2da81383e0a51d2bb186c7b0a211a0cd63acbfc0210401e985d436b3803d5601c24136afd1562522e45b457cb439178be4a87cce40346d34ae0f3c39103c8a3ebc9c86c8db8fc5561eb0f3a143d4e9fe93a5cba6f6fcae5650d3f43d2668a5956c922893b816647ded0afc052a6c3d9d01a3d3af0f1ba807ff10491e131dc15e165cfd0650a1f2c313d7956141edcc61cb90e9e7abf2fe35fc9dc1bde88939fa11f7bbe3eb4d8ffa643b074d74f45113586e9bb12060003d71941f2da098dc0e96cad3255cf328ea2d3308c1f4585e89c613c426b7e798e1ec4e98fe6c71e7491f5eca0cd05115861bd160e3fe73a58a026ba538e0e256b92f1d7a2497570594856860ffd06b601ac575592f4ac612b5de7866042123ebc60c55768e3a7600a3260551f2bea22bbf6b6c8246e80f9125c4bb9db354dd64ae695c15f5071f4abb9639207cac7331b310f69a05f54b995de529a023f033b055db95287a14ba30a7cc526bb724c417fba290636a996f286e3e9e939e4fe1c398b5c6599959d0b4445a327ec469a1653cfaea7552cecec085ccaa68938ae4ac3c424f7e480439ebd2c992b5f6f95ec244b657dbdeaa9ae110aaf4d68bf4e27410d43ceef3e88e9c717dd44c9ee +result: pass +shared_secret: 489dd1e9c2be4af3482bdb35bb26ce760e6e414da6ecbe489985748a825f1cd6 + +# Official test vector 1, seed: "d81c4d8d734fcbfbeade3d3f8a039faa2a2c9957e835ad55b22e75bf57bb556ac81adde6aeeb4a5a875c3bfcadfa958f" +private_key: 1df76d46867cd8c5b94b3666ccc8c368ab45c71abc8df2cf74fb3070095902282b41a698b405947354664df4727af16b549209329623a33889b41747d56594b842be87f40aabb37bb457c935c5a2fd3801694433fbb545b35b23b6d17a8d9aaef6d31fefe99d8c7c2030989a285900d8fb78ed65c97428c25459195890406dc878b2a98993664fecc960237a2326530105f78bb0d04a00030e6ec0a258d803a00844753b8bca802ad335648f348fa34905681a72a8e198206613dc285101499413267a5588bb4331120213bf3dcc0efbd80b70fb08bbeb6067e617d380b804bb6a4e745a97cc8342c5cab4208390147bf1b87c6c4430d8b443e45c101ae65fd9c43798a082aca969b8171b8794c3e442096a139496b9a11e9821afea868107006e4a283f60a035485914e9901e843013d36c36b35318522cd69c1df78acab468336ff89ca4a787363b51f7b62468d974506a245049c0ec7092e7c9368e18c313297a92a292926902d34b0890192b50cb3772a797ea6918d380b1752b8e1e0a36b41a2f865b73a8b3a36d68446ada396ae000898035c40cb4bbc76abe0240392372fa6bca942c4112c86eaeb60a548326868b80af6a8f9dc506bf9474641b7032994d641a3d1c45b8df7c2fb3301003f6481f00622932309e860fcca71f7fd6c38242cda0a4a589e4bb791294a6aa9f85959e91b0b5424a61a974ce29d87c7c0c1b0d7ab804690e285952cd95ca150097a7c6aba8c878a87b883c52b2d076762fd424fd76c074873fafa03d0d98647e76b4fd994300850093c2529b3b599d33692935ba09e4156052916833bc0c13836110bc134c4ae465acf1730a01e261f2d3b1156288f54573aa6cba8d161e533b50c56a2ee0fa04676b83489b742d492aa6650fd658baabe309a860967a726a6cac46bdc8893215160f97c3db16cde48a684ba64fa34a7c9720935711aa4e3bb0fea7b14f4c9a889b9a45024cdbc09f3a971854b5ba1f940712913284516614277a1df04a6a583873b154f4e68151dc8ecb86b5f58842fd31491e4422db7b7059268030c60f4ec3bc1b37b076d157c2c014dc52a9909505d99180b259cfd3204a22825ba2051e9dd4376e7502b305a208a98a2bfba19ad9152d3853acab2c48551ee998c84649c2c8e7b9140bc67cf839c1a49389c0aefb2120ccf6b7cba4360921a0e31b7eec4335926788af441280b4accad52ae014493d15caa20246cd4434639303fb5603f282b8a6f0b1fe41098d28c73f0b74653cbe673340158492d6517c514218dfea8bbb4aba8f741c0820c076a23b170456f8d8598211cbe6a37c15e6c38c905b8ed8430db09982ec4f6c882632383adda285a08bbcbe219947e96017c8bf3b790dca66b868ca729df23a8125bc103b5eeea6cabc6472a07281de58cfbbcb319a7ab27d3a5f5c268bb0ac6587e7774a2a437541a28c84a8c1b986b1a7204fb613cd0067ec26458155923248bf0c641fbb4c4219941414895f60712928fa7275f7a99ed20e6aa7a2e3637d1fabbe65db9dce36b1df2656e0284d3c5b4c2d789802c97515071a8f7c31b5501f4ff492cefc8c7f6b0937da9e02dc6a99493ba7f7269a32b610127f89b6b94020bf58a20ecd7548009d63331b2f4908499b400357c30f1a67694de351ff5cbb4eb553e4d523568542a0e241a6ecc8045caf295bcb12c55861f7b5e5151e5f4cba28d54859619dc04b96b6b3a2a2436d921bc4560a4c4df68a34413733761b8adb790fd95a6479351bbb7cbb17a528ca14f0c31eadb195c86397beec61ab8b8ef9032d1ae0c669fb1203f554d2575e25e45bca0767b0821740eb7aa749161e485152b68d5a8c0c53db6ba6472a34016fd9067d07e8745e66785949a4be88573987aa91da5fe01387b739415b0c5d03caa04089812c85829dd43e9b310ff5887561c7aaf64b1368862050b157e0bcbfbb659934466a3b1611633619d7c2855553b4c3934c8f410e7a097a5b591a76582aef355c57a076a00905b6474626e33ac9dcaa77e8a07bd9509f5baf27bc54bfb8890ac4210f8bb45342350acb61c34999371614d85c7cc49c92e54bbbc94389663053b74088984b1b2d6c335c000ffcd21c9a45a8d377638f954a5e132563f62347614f10d103d0a58408867fec69c50f595c938a454364cf10a4c719113a23b242bc013962f13421ec0686e32ccb80840749643eb4b5cc4182cee2366717cf77f97da296a185440113770b6f755bc596cbbce021e94306b1e4ae437ab7dbc29527142a9223a8a7cb269391cad8f70c6cf666118830485ccaebba1bda242176559904713c6722c413d5c2b9c2669d58138ed5b23506a71c6182af6939dd40c51d678639238c8c071384c1256ee6a307475bb72bc93976c8976bb89c736d8fb19580cacb1f335b97d16943c0706f78095408cdad77a9fe967c4bca738960b3a3c171680426528a21578b79b226bda19a9bf132998a2149c463932d630b0f131e8096be462080e6d17107704f3b0cc90c3908cd645268375056e6072425b51a46c27a48b9c0db67b025a58ee37b44794430f3ae6cc74e1673c2b1d4b29db5370f590eaf6165e5806376f6a7d4825c74038792683f38893464103d82426593f366f96b023008be21956e6be8a4bd612d4f85239d62ab6c39069aa210b47b37ca85394c19327e5303cc9c54a5c63aeb104dacf67a1c1c3142710dcf682edac82471ba98c81a552ad2541b7338b2a0ce41354ccab879f549cfa58995eb8c64a8b30b6f384ec2e04dc1a11ae04c967f744024d70da780516777a1b1715f22cb1eb3511f5c4c99ce577836489a0f813a99a622390b52e4757843c772f6e75f470305259833b3993919f3aca66563f3eb7375f5883cfca72398b049170ebf0997ff277e44501fb0e83d0c5ca6c701048180ac68d857e0dc5d24b1628433c737b8808c290839d42c6a322250e0c22b81b4c018260d288c47976bcb84bcd0856c40448ca40b723b8144837965ad46b521ec4b405c28589b8536621a10678a75233e2cd59bc6e03f49d93925c5bcc133bea39a7e21907a19840c80225f1f154c270a4bf0206a16c241bf42cbd351055adc8519d38fc9d3b976e2144909053c5843c36b7b247a6ecd04c9d792a6fae968cbe11713592b287cc8b07b73c334bdbcb91d05c7ae4e86aa7547b4cc6403504acaef4c6e5b758f4e261c7624337000c187648325f36ac8854d4a8a1c2c732a0811b39439340e23c33af0ce5090ce800070306834321b5af9e4be13b22ea6655da11427f995a115dc86cda737aa99078407b9f78b914e831a6bec2c85f922f972bdda971b66761045813a852a0fd990136840835f8b5a72c5c8e8a65ce8d3ce957b06698261160031597a29e3388a4f5a5f0b96b70481a2e5738d3a50189496c75a856643899947c955be8871e808030a5757d6b46079454b54d51557cca964379bca5a8191698275dc51cb164f8e508fdaf480031a28afb1c9ccc65da9ac1cdec625131c6630188ffffbcb726133ca563da640c76a6c24105502ea3c24b918c5b818121cc68e2f1b62112a41594a6359876b91d058fd66861b7633d73cc7226b8debebcf90fcc390f761360554acf013ad03911b49b641c73687f4a73f8c290a2890c02c56e2a6567fb03826353d87ea41369673e1f9b920b36203cc9aa464192d01b6d859307927a629a24b34132cbceca487a0cb3c7442aba47c4a077fbe7442c2a4221a200a93e726518830b11b690f0497ac0851a5b27ea20253065a9ae7e6567fc26500edb11346955aeb2d9c6c228f1644f21b34e3694c05016284bcaf746ab6344a10eec87cd0f76a611ab64ec86288c339294aa15233abfb680036d2155fe77363530c3ee0c4b8b74a54e9a2453ca081d01f9626867632870b178d25b831fd133a2ac0596e688652c1772e2979305c5e2a10949bf35bdc08cecd6771b7f659b61960a45054998472163c21d31024c0c24972d5b145608c1044718f60894bf5875a453d4a7c4569c63a2b38c2db6a4fb8dc9289610ef12754f37cb4dad3b66e135d1f75759622cd7fa03c4ba81d71ac9938c9a97839a12d7a4622943c381a048edb26c64926b3a807b644aebc9110c54b06d4ea1cbf6462a55b31c7f5202cca8b7c698d9559276a1a3963cc56dd26ce3c051167f299d80c3a8ee894f134567cea1032c845d79ccd95313f04d6459d1ba72e00cc604365a9c5c5185005f17a0397a559a0b28f31b41a5e0948c81501e902b9cc253f6eba88172bbb92024984fa99c5bab08dc01504556aabe8c81bc99c56fc771ddc85d37b7c50182345e189267934564aa9dd80bcdc25b127f1244763644004e5eaf06b095b892bae095e0ba7f9d2700a50cfb6fc18d6419f5438a0573693f421d3793e5ddf3d846678552aaddc19265946003271531cf27285b8721ed5cb46853043b346a66cba6cf765f1b0eaa40bf672 +ciphertext: d0f902d86e1ac0a000f40e508ecb36f575902e319cf05ebb6de2ce63e02b912f9cfea50f513a4167a6f8973a656720aba76c83fc8caf1b9b922233e0356c9bc2b0f6fd5f083aac09b965c01208019d4d0f458f321a07197461eb3f71a136ab7fec0d7c1c6c868d6b2c890f09019f5159fa21642f44b8c1b89b9dbc49a0a9d294fe670ba0915a78c4a5a234af77b925e582eeb1437cebdfd3a86c98abd5723bd2fdf6b54fd79ed0dd867c5ff16fcbfc30bd1b739a912aa87c70e7213a3e42218db247422423089ead4e87ba998da1f354a1d1a65bd8c481c67c7aded64ceecbc1a9bf413e343433ba93fb79350187825e984f6e23f5dfde9b56ae1fa50ebd1e6c6b0141e3b9be3a5d1502dc21656d26dbce6eac70a596f23824d512ba86069a2a28182bf71275cad1639e947666a7c71f04d72bcba3036e774a23e95216af23b19d7af41f8db3f725d937915c72591fec65e902b486f9ef294608624d93da1096370c56a7f340629485cf0684e9ac76609b1f3d8f3b89bd20b87ff3805af4f2c62014a4b3f7e25c3cd12f505048464c490363b40ef68da9da2f25ad691df7bd4402c9e2a210a4ac9c2e1eb9f5f787b876e88ddab57ceae57741c9eb633280995ceb65a6871b767bca78b6569aefa1059d16c90a6afea36f5bce1d6928de55c9241c3b0f225ac7cd55b8ebf663b7c298f41c23fa8ccd279845a48e6614d500c6669cdc232b92178e7fd1fcf5b0b1a9c03f9bfaae1a8bdd856d91616e913f82a124bedb501dfb68d91f106b06acb3f9b6d473d8815ea27bb839856be5e5f26430615b97978f6113b042dad56475304aacb6d0ad777e63b4e8bf53a0c51c8e8b911147ea7404ce6d1a70770662b439fbd3d4e4c2788aef534ed19012b9387ebb9be3323daec6ebe149264c0253912f4f0eccce2d4cf5a7790e035c3a52c6a1541a5ac5be90526a5f031403227ee76d0836efc37a449bba10165ffe58f111dee2dfa288d3da3ac84894ae676f265b02bfa2a809fc622c3b8b4201ad59439d170e7022488e4e6cfd0fb5efe962a704905bc389001ae16ec46af47ff3a0ebf900a21fec6ccb754a89450134ef6945be8fb68960174342121c36cfad95025e336cfb15262caed34b3605ff9b305d98e53a0e1eea5f4f35ad7588b4f5ea0875f7a3c35ebd13863b299a05ffa14662ccc10cb949a56573a419bbab7424f7c13e537d497f002689fc6190d5a079019deeb265a238c1cebb9fccff0a3203783b03da50d589daf28ec573bab47207adeeaff281e180dc499d62c346b2485be4776f163361edb2fa9613537adaa4838396e32a91badc75487be6a1345ad93351bf4ba3b46084a2ba9421f0bdd9ef47be8fc22857cd0c5dc6b83e6a7ae7d0026bc61ca0361aff37b0d878400a1637a522a06fecb7be0e62b60fae2df2c7a1e68ec2992cdb505a5fd1ca7c1f53f0a8ea4162639af6ab32414b33cdf10b8aa579dd827c30b8c1780b3cd9d67320a11704057e0a77e998e1e4c12f3e5d8a13185ae6830911f88e7dc5cac7004abbc512c6ca69006b7dba74f147dc49785a1847a919a620c892d5a8ff3bd4b664bb73271d8d069ea19bf0e924e2869688cf0f26c1349abc29ce6b7fdccc1174f1a4b4fd26158b094808fee9d0ddbd996f785e6a1caddbc3293a1114feff09a19fa71f286f48721e810693ca9095d7b3c0b9736dfab4364dc1c0075e3face4dfe2eb1c815f713028312f1d106184c1bde874900591731dd75fa8f1505d816d51780f53b9b759b295cf5616acc7aa02ebe6b90252956275844bff4865637eea40969fef0ca595979b9215edfccaa44e09e67d8419928e09be7eee4d240d24f70db6bee802729b4244c619f38df99d0635a3125e2cc7c65bbe41caf795fc6d474ccb000f54f6c4daae2b62e62e2211f1258985e55fc5942d8c738c7df8a184ad34308dc798f4933031095ffd01997150899cfac81c533e6b1d92002640babf3ae3b73371964dd6dac95d8927ac33c4bab3e7a7d115fd1722b8c625da2c967d29764ef85240cec35bff4f507e3d0a02ec6d26a7ab90b8c50f392b8160ec34ddbd389a15bd47558b5b890cb45aee2e7c9f516201ad9e603c71fb631d0b930147a8bdba49e1dd0ca6fa3a8a089b520726dc78ac914d0c41d5ffd5875f798eafa2554c1ffed8b4e03f316a195c95c9a7c1351a06231ac84ad6269280ecf63a73 +result: pass +shared_secret: 425ada67204ff5b30a9d1cb545bcb4a6dbbd923cb3ca284911a1c5fe491ffb39 + +# Official test vector 2, seed: "64335bf29e5de62842c941766ba129b0643b5e7121ca26cfc190ec7dc3543830557fdd5c03cf123a456d48efea43c868" +private_key: 9a29ca06e2ccb6a96ad265638a6a057ba846fd6777408cc21aa7c8a7b60aeffc6d014b02e64968cab39948e45c6e32676117373f201dc8a86368f54a54501b8d002d3ea36c1287a5504313f3e03ffbe64d28059b41247e76c24a8c05abc21678110983ca0905434b5b2ac45adc6c5d90d83b416b30351b780e8386d304caafc70f3a2a059e8094ceb83810d7599af876537c4d367c21c0827cef5c80f2b04f554c105c1a8c874389a5f8506d104c105213b64b00b1f194c1f793f6d340a7466896905e295b39d9fa9e6c314e879140bd0b1cc276632e70a56902346fca21d2fc7b0004817b1288b3b34506cc1b15060d1b103025e2ce51e2868335685382b2cea4b87dcc6590fac80825caff465ceb9b1dfb51b52ec97c5077b55d528b32f4b2e344071e04b703f759bac057916916ab758718509921d0c0e0d08bd2037e0643a18ed60f984a837b86c5ebb7b8068c1528100515cb808a019f9017113122a7ed16582c78cdb52ab7b6320e7ec0afc194b651119f79f6c7ff32b003ba7e0160510d32af80eca6547c3999547749dcb7205c50bdc62f54cabb15f386648b1805da6ad5c1a55265b57665bebe46cdfba6604352b5fd036d5a9426f70c014fab63bc2ab7288653ed2680dd6081519b3bc56ba9704ab32bf3a59282257bb9071e270fad6b705e48bed7a546ca6a80a3181f3875580965798e978f757b83fee729774ba46ab32a61343e002b6379a5ad9ee25f37838c84f397b9b4039b447b50c834c1b99eeff51ce6d5bdd8810abe873e1a1c57e74c51bb0139d937390f10c118a568bc464a28028cf5a778bc1a717f9a672ec5cc2b635add077485da497f68c51f017d3785bf0dbb6ad9eb3ab3a02776e9784a864a45dc0527b00d47d2a8c7794d43f059cfe88a2f43160c38292216b0dba17da92b56ce6b2711b0869e1204e21c2834c12a2d4557fb723caadc01af894afe656956b35829e780bba9c8ac28002245cd5d46112dc93dac9a656fe40ef67bb544847bebf73eaffc85ec1514b9a248da8760bbd1b65108acfa364b4286c538ab466f34c383f008e0e611f379aba066638b87854163065afcaf1003a189a81ccfc873c84bb465601479d1ac21d9886e7614cdd3603415b8470766892028ff575a69f471b126aacb0136b5d91d1f532f85392e66e182a5acc4be796e42c16d1d56447264aa9f20505f1a447288cd2362bd99c19a7bba93d1775586d769b3a2a1aebc17f84b1c14c5a0d5908ddab90c06bbb7b31c3b88625b96e9244d163585724ffe361e04127e5a981929d24a8e8b58be5221a9d202b84b3c1e0cba55349abd356d787022bf01a04573ccdbe42d1687b29be8c03cf3535eb952073a43319a2f0e52726906cdf7d06be43319d43370b4131457aa2f968628b5c5a71b4b1804734c85ec5efbbacbacd336ca048f8f3589e9561e3732a0ea5523168a8449a9b30a88ce124c25dc2749a3933382dca4cfea4de519bc17f7605321c99b3b20faa4adf952231fb27a95a55c7238702a869d0b1ca018fa58ca21c6d494bc38db4b34216bc770bbc1b63102a588da22a6ae3723bb80b1c857ad06b88d1d0001b396be411618dd421760a58e0898787c498118775ce407317f4bcbd3477ce35c565d83c1ee124ecafb0eeb1b19a4e05eda182b53920b4613c989523d93dba735423dbd84b76491047db0c6f50376dd5460a9c20c02643b63049dabcb3ec09c9a6aa264f3c02cf4faaeaea9158f74670c74c783d461e1c3aab218403161508be461dc2c09d4c77f6737509cc317a2703e3850ca06636105463a4eb16afe797be2c32763f0ad222401545462ddf41c71b65fb2499ad3d0a7c128556518be54948a86b6bb5a811b76b4c35d35bc2d54c0c60c6a744c4944bc74303144b4891b841ac2b1e63777101465eacbe933087fa6541e502ba54522eb69842d3a706dcc617076ab90c16393853fea190cad088da65953a412c8eee83945cb3e10719f37188054c31518070603bc0af5e483f6155d618700f74093aaf352facc6a1ab0809dc101b64c9ada665d1acc9bf31c15bb3a2d163874b523951c7441bac80823d29a909b9db7b73d43020300e68bc66b1964a1031351b451650b63f0076ecc6fe8495857e6a93c9b667d924eb3a84caae9b401ec2fa3355da1a341b578b4765c4649e6bfaf5c8b2ad80de5200e4dd30da0b693f5ebbfcfba9f0ad2ad46576a7a06b65de6bcdc432b6a753f3a6326a27073436483aef170b8649e2ca022497329d071af4c25968cb0521a118aec41cbeab013786a1c2984cb2c649da0fc94fdd880fd3a05239b84ac053ca0f822e4c94ebfe1b6d6898da03b02e455467af6c89db7225ad653a5ac0c8e165f3b9b68b01270ef0ba7cc56322d5c671805b7d333b899abbac120c010033f3064647e4a387649c272a32c2dcc2fd62793d8689cf59619f43c87fdeaaebcd4c3f21483863563ce8442a7f581009410b3c506146390fcd44d0f918b2903940a321c66700ca4e205d4501ecec23a4d17157ce4a0bac562533273fb8071ddf960217696ccd98a59e6c39dac5cd185a0793a9190e25a0460837d07d020d72b5c5ba9840b0940832fa3a483aec99d0d629cfd67a1ce77766a23b2349947968c238d0126f6ab9422b97d6dec5657a20a683544ba07971bc773a5da90bf471eaf12310283944c723eb1e0600eeb2464bc71de7233ebfb7be64202ee21088222a48ba200f04b6bf6a1c7f6404295764e6fd857d747cd985b07f4d83f8b13a901ccbff7b01e21b8789c05b635bcc14c8128c379bdd52029efd660468a34512bb78da224fff9a223371e457333ad464c6fdba4f6c5451b585583655182691f6ee817cf81ce6e7a5cc6b9cacee275c473ae1c58aa38e43de50796f22475fca44270e3a46fb5b8bdda74e3e05b88210f54f36e79fb05becc76805b716154a6e2346b0f4cac241748fde93f325b4f82f3b681136aff8056bc7304ef22652f1679c816032bc35db68b64b2848351da88df89166707b194cb4759e6761032aca4b7a54e8064f5755d36288fc5061072da1ec35a8491396c9406446060347361bed860b028b57250f0187f45a204fba678f587ae031ac38480cf4c3fff90188d925bd4c7c6bd0b758698bcde97ce3958697610ce05e4abfca60eac13b666732e8262b36b7447c0c93f91362c519337052865927a9862d2c1ed186b411554275a24dc9738751a4ba243bcfe46109212b711aa453a35b09ba20ab405b6f0f3457321b24017261b49923225b3620678c4f474515396113880df463138abc3e820c65415c593d74c01e5136150b02f1ccc55a6c1e7e9b121588362d784c3e85658532331bb596682377c752e7c259608b629e74a5a470bad77d3c0672b23831a217c1ac82b94a82437643807681cc1684098b86de031440a79378a229bd902f2996f326a0df16354778a4cd5375c756a34890ccf0c92ba07a61546387bf54c2cb0c8548d4780aa72b667c0a1fe400b30f194465cc97ff42511e75457d1a8a9712a6ea971d797baa894b0348561df068a3455a89afc3684081ddfc0a90fd8acbdc217c83398380267776051cf3491542534b1a74b409b69a8a142c1b437b5a8561fb064ecb591b7334afc482af678cfa4e11e970a48bdf822a0b45e1c591d07792884e4bd057a15eecc5cdf66c994cca765daab1af377a14b98bcd8918fe3546fa4438ba5322da1ba75543be245b12e228d07c1cf1091499a2c57dd42c9f6ba3240c053165ca3fd669b4c3944a7d003d016a0fca826b5e615846c48873cb7f222cc12462023e38f14d98fa0486eae480f81a7376eb6380a42a1a2a6123d8a4efb102ee7b900cbe7a9238b59006abddf2ab25565815947b3bf6b14eed43be91a5687b339e6bb6614387583c585f1456372aa68b17449c2a1c6269a05f8659da97585f52421ab74b9d705ba13ac139f15be9f41971e0a6e04ba167be9b681d294c706d0477a22d64565e71979009a18c8086059f3964ed327288aaa0c8a2b2d976d5fbb50b842bcdf3c9d25656ed7224f3435c9bc9b59b17727b46a546eb8553dab54ecc6842cba94fb24592ed077fc56bd5dd2cd798715fe0c513377361d263c6348340a5018b0e9b43e112bb6ba60503ca954f2bb25fc585c021b57fb3d1acc80a3b20ff4555ebfa223f90762e2008ce920a420b48cd8fa9606ec5834051d0904847466564294cdaddb25cab5cc68008f96971b2711ae8d73b754cc8ab2bc13e07708e7b555ac681c0af0961a19105bf62b93267b8c47c73526b8c2d08bb13867be10211347656c0108aa3825234847519a52b6a4599ccac59e10e945eb7bd579e0c98d12aa9905ed85271887a974ab8f04a783747caab69dcb74eb00a87eb1651271050e74552291b66a29053bef5e49690d4eec7b7bd352e82fcc97ca60ccb27bf6938c975658aeb8b4d37cffbde25d97e561f36c219ade +ciphertext: cc16437e7453409e7e200c26909b67a5b0da26997f8660fea78caec9503c6d1a0faf70f017ba882f42d9f8b72335b4a3a30ca14339fb6f0f291ab81d13f2a18d4197f1d5f72fea47cad6c1d3dcaa6e4f43933abf3be44d98083d4a4e34e46b9844560006b42259963945e99ea39af5e56d6299e4e18b555729a12d16779359375d74ceec3b24ab394a86186fafc84a4dfe20dc024527450bbc57f2b1b0fa88d4a46cd21341c7efaffd5a05da3e35260ebe19d79509fa7067b3a498c439f5de384b0416a437eecb7cbea64a6f4076fb94f7f8dde4ccb3743d1b3dc11f7c866e637ab75bf8099599c0233929519a5297a298c95a1b6a3cc3fbab718f1807065106bb290be1d61d5dcd5f228f8355b47058095f599f9b34a3710464b7e367c58f34ac6cfea3462491c78667cddc66faeb43ca86fc1c082cdcdf9139ea8246b871fb5f18d82776ae4c6d73104d2e4a1a6bb11cb59fd39ef66f69a99dc3ece762f9f4bc2303591b0cf8cde08512ba2f47bffafae181ecb64c4818a64640a4bcca3c13e075e82d7f3604a0714439297243d204d0c99f77c804bc3eceb1197e389122021abece24f1f68b531e3f56d46153ede5a3a9ce28e172ba71b30ae0cc5ed2857286e4d8cd977f6a939af4948db5c89dc19513a21ab4feab4246e42bb61ad21de0d23bd9bc2eb04233a27a81f5e5e487335dd4525eb230fc827c573456e0fe77acc292e5c5efbf38313899d691b21e627d699f50089f987c7227b4a4d308ab2842b52aad8b020f045b437e35d9de9a7c273276af986af87023bd3eb59d34d6216c4e54a143b3a678f5ab5a466a323ae973c9231d595b8cf7285d32653739192f7f9c0583301f87d675384068102b05ab76f59d45d6155b678cb2776115b44b5209bf7cbee2b98bc55fd8cc5049e419b35fc9bf23c118a5f30e017817d9c5c8c8e1fb1af2e40f5087b182cc2d313a9a7defd25ad69fb8d9a4f3b6d0c5f65da88925d0794c99b9f272645e88ee81d20b4381750fe8a5a53d766da8d054b4110bc979f2524bbbec13cfda3dc0aa8417bf599128c4dd8db36eae44ffdf6102d3e1aa56276b31cd8ac90480fd658035190f781c91ea9e4eafb6f39a24cf72096f48530542c4ac137ad4e7c4a207c82905ee55b698c42a84c6f5838938457d577dd6e3640bacc4bbda63cb0a2b8299a3a06b49ca7b91c448bd6b2926b139e3202c94108b0ac240fed20a3d268280d845bb635288a07f65b019a22df9f31b5b4f228be8bc92539f284c7a94c5e7d75933f557000b75cf2f256d2a32e4c53c33419a5a2d71b635257bce405111a95592ad424edbf7c5a5d175cfedb0f51550cbeb07ce2dc5b148e3889b3bc3cb15f6630c2cbb6641f10faa58a945414cacdde1dc9d5c578d526f3cb2e23491d69271fac2deca3d78cd21f53607ffaa9a9deae490f84a110002cffab17a12c88e07935fc95fbdda51fdeb372014016081500c927c227542d6282cc8dd7d708b3e834bd3b73137e11ee50759a4f83b6d311046f9cc198b2b618dfd5debbba8bde77eb6636985238faddd7ab039cf3e7bf1d2bd21596cf6c7ffc8d0a8cbc0b14524fcbc6f3b240293dd1c75d4a7c9f241f933e630111c68483f9bce89e1a7068952411d6811dd8a0b00cf4664518f6695107ecf569a741950cf278d416c8d200d434f6d17ffe98e7eba8ede594b9ce64c3f4763f2dff7ac81290dc18d6d5a5107995bb7569b053c7c643846d5379e71044ebe486ef49e48af47ba5c520af0422a6ab0c82677f62ee6e9c1430571bac6898d3b78d026a04513d036b855ed51d13047ef6193beb15490babe0567b7375df71b2311a501a14a57ff376bc465e1082cb6f2b9bb1b6ae778130ccb7d93db187d6c79fc6a506d8b2e1ed2a33af3901bb5da0cc2bbd04fa0d10c8f3b5c2f1ff2e790766fcdee2b62be2265a40d6687214dfb225ccbe572f586d54b2b145b0b960c6436d3abfc7c3360df6525d10ba48bc5d6fd8b066b61fc151634689b20d20cf958d187532e1208179c563b9f3b81eb915a0efd8663477095a01274b54a899a37d0ff662e8a3149edb0d8e59eb85a95f3ba34afa14c9cb849466472e4c6b6931e9863923b525d40df418a424618ccb46c8ced0010011f1ebedb5e669cd5655da2bf518be53a42d3ac480be0d8b6cfa7665f54547d129aa88ef6ddbd5ca682735fb075623557ce79b8f1 +result: pass +shared_secret: 2bd0703c81210c5d9bdf59f8cbb7c32e30e042c20743c96c74db89545eba4fa2 + +# Official test vector 3, seed: "225d5ce2ceac61930a07503fb59f7c2f936a3e075481da3ca299a80f8c5df9223a073e7b90e02ebf98ca2227eba38c1a" +private_key: 2ca62ac1f40bbef551a3f75613606661a204ebc3a81a170ab0e80eac65017bf3add2830b80ea56743a56bbb7b428951050844474ba8aab61912d35433a679c6770b3f8174214510215268eb5b14411e982f752192c649b61e559bb189666d98254ca913edcb22f93667970566dd06fcc06bd937bca44ba015bc689278925fbf64f1aeb93ee4a7bce8093aeb6862009c49f89cf31e74f91da8a206ac4ed0c21f8ea9ae1ba7f3ec59dfb5b729e73172770ac90957740068b1fb41ed528c73e2c2e62223264dab7f23b6a583c2e0e4bbcaf9878384376c23c38802c5753da4688554a2e9843b0dca303997451a0609be12d73ca1687e2702db3cfb703504fa7b3fb372a59831267a8b9eaac60ec31932c776907d29be988abd0208789f457def7130d628b4e694760f9883e197475f43670402f992cbf22819aa27a12fd60470e0b2a59700c05287589c2a85fa723b5c95ec12488f7e503bf090c581b112f854383c02e9bc693748628dfb2af873713e268c98fdb5ec890b55d8a7af5b93f3e94be8f5971c8c63590715d09d894e078c07fda4414280b20386ad6c645df5b21fe43b940610dde4b30b2a40131627d68a47045696eca108e93ba6a3600ca7be14f54346e9699331d92bde1786bde2886027a62234155648b2a52e3673fe5653cca7ffac07acc060371d67a581a529d0bbe89762dd1763daef0c09657698829348028c5f14359f4996437ebb092f64e7dea7c87e003c874c0531200e8163a9891cba6b0750051006914cf22d95088542fe58c4f6955256370825306122aa5a26963c66ae4ce268c180698a4123954467972e8c9ab44545d0224443ad83d3d7c48ed052ef59b1772d82de3781d713197e6e739e187cb4ad8b8b9f4972ed232f9513b03d2bd0f84c2d5951f2f20b01e362bed051a1278bf2a185b95514814494f576b56418c9d4de5c62b30ceea03a1e86a7a7fab18a5c4bc9ed43c8f46426a3a853d5127073125bf3510ff3065e81a726d934f3a279950a675f0c3c9bf0bc42a574bbe21be72092ed5ac8323e44cbdc1ce8864031838a7c43b64e9dc28a657bfe11711d0f1c5d407212f5938a7f14e82d9353173bd4d94621ae29247a2328007078fa5029136290d48009afc39720ca4a8b8cfc2233dd0042ab0625007b36474fa370a961b520575404154a1070560bc0bbbd9060daa27d4d10a13da8fa0b676b291544a6c1bb5582b08d761162ba103094df56789f76c8cae2b6637d58391f0ce022c9f77da0888c5045586a0c18a2e1730b3003493dcc8bbabfb359a39796ee578f5cc67fdc9a817461aa5296c5d379a58ab6f7a911114f0bcc39771633a6776965816384e5cd27ff1401a8880b2774cc73e6303e00574e241573edb2282a47c6f1c03b74a91ff3c10e4305fcb86ba613c747a591d9aec4c90193f9617431af4689c11310025b92247c805487de6c82968938e67084a178511c70722b28934e64a6e4a5223105c3bb24a6192d9216b7232ff0764f7d48507b84d72ac2236d92c69716bb6fcbb06757249ab3d7bc5a751e104c9e5881fc4675b374afb7735a56b9872164c847493a5dace7a855674d90091809109c524289ccbc4143a2567a6cb587045ec2d33e93ee2c60c9ea6a1a40344613a49ef538a41753a41d8c203785d38207abb3024584caedb404c8c0661d114405d256bc06164fc6ca2b8d71b1e481ad065462128327adba3d7572c3dc71a75791258a5cea5c65a70e11b0eb93a9f027b3b91aaa58a8a50b6bc2f59049f915404087ae4280cf7f603d110c9eeccb045125dc22b4c1923c83aa84c779a6312888ae7e019b7814d61d1cb6635b69d6445a8d005b4fba51b91604530088cb3436cf73f19e42ebe1acbc013b2e8341e3986c4ae156950e1b9d799c450751953da223fc11688862405691d9120cfe4eb283c99b3e39555c7f246c6e73119f7473e0709f979499c52630f140dabc690beaa91186151e5865f7fc85aeae9c27dc3c03c31715303caba288f95c55bfde806374902d0f50015221a3c3298db60a2257648bf22cefff39ac0e92016d71fafb8c9037246a99a0eaa4566a04b0e7b8c4dcf8abea7f72e214494d4176920858e9ba69487680499d27e2ed56d040045ac671a364848c0a4100fd4b44e1b1e8bb5914ab89dc8016eeae46e2610a5fd252102a480cac2bc6e7860620259e41c64591584f1e6ce8e3312dc8862dd806cc2181a18bb91fb184dcf045b030807a5023c4b3779f14a162e0938743b78c71493beda7826022e78ac100e7892fc104d48e25ce92610c072a3e9e8208c93cc225c916a2941c13838eda382f311a809c19b9ca60f188910a1a1bede4710b6b72127e48a5454a457c8037439572c558378cc784554171f6a0c78c676db8bb8aa380357fcc1f61859b0ec72730c10f8c3932975c70e6329aad34a56797a03c0297fb4aa6b97a63be19f5ca6318d0b2c8b4c6d9ef808ebe364d0a41a82dc768be47f44f300bc9b2e4cca1050e21a9919a9b65a07a6c8bc1ca5622a441117a1749211571c462a40c94c3301081867b3a8957ff45c1c3f7c00097a35af93438d74c78c061c2d645e7f6c3be5fa6da749085dd12461fc517e0c28baf93418978772e4c723c071908915a1a5807050c57d2a3d56597b1e1bae4b437632a2522f314b39fa6ab7a047e12b6502027e334b715b5b0b17bb76ae608acc0250d91a859c8c448b27bf4c44b092350e260b65c20c82588c8c1ef25affaaaf150479e80801c82cbea73a37dd1a7df6d268a9b0c4fc753158c39ea4e90960c20460804329f58bd460a37357ae6515bcd505c7cda55b2669017bec3d51816e7001b0a64837f9e07ea26735e830092a648f828cb3093228b98a0c92656c1a14cb3a306929c6207751cebe31aea4c0372cd5c06cc637dd9b6894f00dcb3796d09ca87884412726a25bfa9bf6eb613e1a2a19a196e1e1634e1ca0347a9bcc96816923092961b69dc0c013c191f7ba4fb0b13ce5555e8c1b07d8568722155287264b5fa990e92603aed71df778832ee3bf9a767fa9e650420a14f5ac227df497efab89511302d231a521c5353bd425306a14b7d2a566ab3b32aacf353c2b04a148e4c93c3e470605067dc7590722c452245b3d750205d2c0aad03b0e2ec535bc6cc3956132e329a980c8495d765ed1eb071c58680a11859c3cc0b1e986486a5b543949643b83452c307df477685a4d0a70a7528a55a997bea46780b26252af157fe5d874cf5c420b5b1a324a932ba52291428a39672bb359abc4b54bbfac608a0135cc99a38e102da3e088e4ec5c47984a636c7cb99a6b6304cb0350052618471f716be06b899087aa38053111e35a95965c04a7c42bda2319598819aa0aeb5c39181079f41982e05223c8e89abbc32fc1487f3cb99a167ba694b0668a5525a88472439c89179147ef831022b45f6b8553c8150e32b5421f75291c830a8698a916406807f201141a0ea1cb28255a9ed709502ec7851a56a86cd3b7f05726ed6a6e50fc52706104e829b02f7b61a1856c9b44b8d1214768851ac190b46b61c053c371a333a95b7806eed16c033790c1563fb823204e26ce3af87750ca639e605cd435024336751ca0bdab99ce5b45cefa04caa29ba33b4998da0aa832ec22551821bac055961acefa077de544bbb80211878c6109b512b6b4850b5a8d0bd9bea6978a0f920c1fe8601e1123a98aa23cfa30090817ee849e654a0387a185171a43047758a578a02ebb557904106eb3096d3c1f92092f02891f1d3b0659f284188b7119c14896688ef2bcc8086c604fc140a8fa24c9595d020269b0355ad9a44cbd803b59010a1b85b12fc785ef0a0789c10b3a30925cf155ae8682859a8f8164cf62fc08df577eab2071db87b029a16ec90303f5b97117761c5f20033110b1bdf7388895b30aca862f22adde6930430821dccb2b1ba4cb923652309b4f16600fc9fbcfaa8553cb45bbb53035cd28526ea8449844ac68b87aa61047b94244f126bfe2323af5f30bba9c1b96a426a1d84c2da35fbc001e20a517d458b4291cb36394cd9a074e51d8a45ce623484a3aa7d575977242aed535d46b74d8645aed246692ac1b8b055d717ccbd59769ff9617bcc3aa7bb9366ba51a736b2ce79b971e0c204ac62fd09755b4e4b233e94a9cd3490f4049ce6cc96c7c0fa1254c4eb67748b337c41c473fab4a944364531a6fe18652856797787c804ce1c59462b8d145cae4b97232440ba99cc3a66c1e019b53fdb272d000c85ad63d686a907a31700fd4a29e5936a53a4f2d2486751851edd1b70115adab07a29b15594566221b329076a5a116676d3534044965014daa0d13da178581619dc06df40a02750beb995480eee94ada82049cbac3e8c6830334021c22894085dbc8382fb43cbe318e8e6ada9955de950541fd53a8a47aaa8cdfe80d928262a5ef7f8129ec3ef92f78d7cc32ef60 +ciphertext: b0175b6f547277d58f329d3b7182bc9a1d18dbbebfa3a5e24dfb783ca9842ccb7c3b26782f6162d9f60971e78af2dfa1a7d40b181ff92872dbb387a1e9d4b962703c7e42778552093cd622686c4b12842b5edaae5265d802e5c2bfb4f4031609661183a55027b4b4ac735a0c3d4d9a8faacaeaef4e0fe7964b3112877d7d9b1cd8923f30fad9f70b5cf480c83970b0aea28107fda48bc67cc0cd00268037004d053392a2522a0b2b9a08bbb678167c2717d9252f19d9c5c6c5f48068ea0b7bb9f0db9b4801eaa168d398b37cc0032401f808b20c8414e9d4ebbf573b1a86e304cec6f10980942c56e18b1e390d43ad4149fe646e0ff8d15fe8f41f7edfe56211e2e08bae7956015b961ff065c06ec846e1ddbf37e77b7dccd34ae270aaa5f01fd92530da96ba73e2c001c8b2ff8a59cc1c26380f796a417959d18c1c97668fd77bc82fbcbbcf1a71f95ebe53265b477f9eff4bd91dfed2cc4b3696f1d6139ccd74d13973acb599debcb81dc3723931987c969da37d90d196ff052c5a6d223be15ae7dc4a90b289a7e46e964ae3035d73d0f958f9c4955c9d4ab38b085291891995b0f8e3239f1408540a8575acca7f0da5d3afa4359a7a403f7c4e636d7fd1a95b7571e430c9e44c14acc516f3eccaff00e2e2fbe91abbfd0e96dbf74f36675735ad70f3c97d515d5d413780f96fe8da72399382e433c76b6deb0bcd215e5ff4ca04968fd7cc0470c10e5d22e00800069944f2bc6ac4988f6eebd35995862d530f3b8478f4c13b8e2dc11128258901af0e4888b97601dca5da385e9a787341c9d74ea1ba2d28b098a9ce395d1992c5ada71b9a6c1b15e20f57da963a9307a3f1b9073a2d9a990832f16ca3aa50ecb5306bb75713c25798a8cce4c529adfc3377e44cf9f10262c3295b01c5d3a4079bcf7ec873524ee7dcae5f2a8a42f5b43205624463ecde93330410c410dabc0eece6bc480a61f6f52b10ee14c8dcacd6daae06c4eed37e3989432490363282a10d276c484cb1013ded7bd58f204c63e78b45e1889b685fb5b37110b5af73ecd51eaa4eed3525adbca8f6d9bbfc19239ec367854342bf02fcadda8d668a30f709299f184c89865038b445ed2079d675648c73e40d90425d787d44e539cfb229bf7dd039dace2f8eacac46c410a2277a93ddd34de171c93e504f1bc3e45cb468cc855228eaf4963a63d6f8f747ada4928b0423c69adc0f88b5277a2decd0eb1fa44440138388073f6ed52309fea034bde1d1e08851cc11a82fffb6b8f34eec75eec9c6237570861a44d679c16594e4031fe6337ca398272ef43176a082958b3b677f1416a55692ecc6f16a6ed4f9b5a51cf2cc5cb50666121ba01fb9bfb89d1744403700faa063f67006b28d579a685f16a81a5b2e87efe0614094f737c9c6e341470cf4ec51580f1023a14420fdc45f83356b4d5d80ff53c85d32067a40d582ffc87792b5b34da52510629185b2480e841f8714ccc7b5b00259913936b097e0dcb6ef2bfe42b084359d68cdc80acdb206afbf419a5718eb1776bef7aca6950519f3ee39f4021af387c8f251d3913683d1d0cfd89ed5ed44d38ff47009220a5b7966a760ac78012e5bc1f6e5684bf39cd0c45c28e0a884db323d647bb7cc202a16a12484b226680ff2abe1b26f8a74f697e4fd7c2132bb0318dd082d3c7cfd7fe279d1940a4f20854bb280498d0a3c76ac7d9f10b9a13205d278d6bd1252df84e75c914916bdf1e5352ebcda297e77aacc782ea4717f07a1f521086cf4debff71ee155ec96a22fe759aba9c0f282a707a8483a11a37df4a947749dfd434359884b17eaa6616fa80dfed1b62f5492a51bc572392ca7cd0708d37a8fb0185202cf7a850fd1954e4cbe7f2973a2874ebc2a2bc4d1821e2600685c0667a97baf5bed4b7a222e9cdc556668da7703da0f03b7b904f0ae942aa02fd0f22dea1337e98b763917c6fec9b030225fae085e050a5b834054fc69d63f72702b7b6aed8467ab29734a7b9f89ad70028b19a25f6ee6233b1876314c7bddf805f55e8a79edbd392620e1ba20cdf6f78f75d5bbdda5ca4215b312cd4ddce4e5c986c7f03b99fe0c835db9e199493b0d54bed56f5dd1e52afda6821a2e6df36f6d032ce33075088b5d6aa9f9c07090dadb5350408804cfe5b704c3e1f8dd9525e7fcda26c0c79562b670cc1158925552f28be8483310f4ea53df0d +result: pass +shared_secret: f6baf98028ce4f75cc14f6a75dd50502c4adc4d1377d72671c9396d4c26fac69 + +# Official test vector 4, seed: "edc76e7c1523e3862552133fea4d2ab05c69fb54a9354f0846456a2a407e071df4650ec0e0a5666a52cd09462dbc51f9" +private_key: 6360495af613e1c6b526a64a23cb3052fa4fc0198a351aa70d982284b13ce66384edb522df0b38199baa8265ca96da7040a7204cd0162ab481517a76d9b94a20306b04d19f5ab43146f26c4f43c23094131b9ca58552ae1eda8b9e623cffc533e77ab7345790a507a3edc589a0e01584a291e0a98389224ac057a2c7a49aa92c012e3068fce416936ace78967543053542faa399a8b7d2f5c483d9b09058067db414b319407dac97a1045d78b6633d2b690a77510d996abd44c972a37b37baae708086a4143926875e09aa15a206b3fdc69562d645ba213a13c74b245072a2480459672b33ab4f1d969157137d85f481828a7cb71aaabbf6b54874821b9b77e41caf849874830a742c887fae918ec657343aa11c8dbb6190d53749157e6277582c589ad1d9a33e740e25f00bf3dcaf2c03b1a6a64ffbc0a104fc37a2c34f7b8c56e06ab258b7c79ecac3eeb9c2a87c02171aba70b84c58d474f4841241dc10ae9645c1b71163ac3053a8b9e999309494763c50354e235f253b87af35818166aaacf85abea0056b3ca078960dc54c599bb43508fb06e06c968964cca2acc72a17c25d47a6768c512836a7ccd3cf58b09a024b1aea57bb26f2219eaa3f473a367efc8bd1790f576978ff159f282a218da906b506be5c63c016a55d92c69999e4cf1e1730af67881dda242f505ff78c242d3a3730c088b83abe4f39bb628a4efcfa03b0ecb8ff98c288d1b8e12b2429263ffb0a638f9665704b1770c4be9d999f8ad6ac080671cba047378a60c259bf042839ba39a11f94354dfb8d3da789a4790b2241718a2a267c7c8b5e1a2178002971306d08f360c6940043a25b4ab350ae385969fb28b64cab121c10ae15ce4c51475cb4794cc18118b877d1e3723101ba4172c272c1cdd1e33f506212c5b421b0f631dd773ba590b894056051753ff73013daa26c597a50d0023b2ca99af7aa5f218971b5c8845c68801468471651765922c6c7586d88b65d017572d792b037d7684a86a517c453fd36ca5135b320092c36ebab15dcb82a70c156e6657ed35dccf34f94559b92d83f7d46277926c9d7422fdbca5424d431d61648a848bd8e260179047120a72a0bd1a495ebbf154908edf0363b86892f783e75369252e92a85097a2636c8f284a841396d4cb39f8b247ce1593fa502a6ca4014cb4036f94810656cb9335c24ee345b1cc15431359dcee9526ec6a42d26280493b6090b0d500808bd29a321959f6101c18af673921804a3501f5848022d0b1075b1adb6f30f47786c9dd345cc33a12fa98dfa909eb724ce7e853b5f29a00f43319f92a14999526cc7966d3c25bc24924f5ca64de9a2a5c69965f95fbf29875b201dd3d54a1ed97cb7039f8d3982764a4e964c45583183a15c0d8097c033dc144bb7ca7d4483900090859c2a25c9c2b1aab964d7629bb420f3261e2e4c76afbcab41272155496c4cf9131d7195b9228ebb613dc7b42541ca05e39ac09e710fb972978f4395b883bc6a67593a7361e4179b7c95945513c28bd488f84146c5c8956c4b18a0da5ce7a680d26a779ea5ab1a046cee3191acd2c655cac8dbd9518528be44e03c1bd758cfc30d9d163b06c0a60e5013f6e646d3461a3993b7608b9edcc65304e92d0e59b193747325452ac403771a657b92fb8d4a57a424f13e323b37c46183b4014600b760bd44c5eb1099167354a5c31ad377a5041c6ea00bcba66b18cd457a6571853db6a90f408ffdbc35fe7bacf16a2be625abc9473f57c269f0029844976475f484b4090a53523f0766168f80a708ab37e0776c0a4b4fe02795073a19c01619edfc36ffdcb12668851c43c2ce7765c050a46a025252904698d2427a634ff421c45d2018772bbbc3aa2ec49799b3e9733e4b0cb16973e51a1f43ab1596d64a92c61576592d6f3cb339f76fffe186106a176f45525900a6b594b673271ce54499bf90a5c5489928ca879e93b3cfa7917999b472d1abd7da21333165b95c8b1f6736bb183fa14b9d1b26143e1807c7f71d66360b1ac2be6db555c1dc907b794dd6a07c505451bda90d2e7a7112636fd7590f48e0c94ceab150906945273cd375b82573ab5994c2ac447f5d53a3d9e04b4d694f5d81b54e29c125f461ba056e599674b5d15b0161802012217cb73419d431e03abe2f7a733c9c0d0a05b6ae91776032105bfa99d149062746ac1fd2ca81db9224518a39629a36d043e6a398444a055a2cc28ac785e22b9ada469d2e3491174a4e16e11824d32c33326f7cc2b73d417a7151496fbb6805a79d5d974b12f3c0125b5d7bfc7c6f244b68e2c1ca8613e891322261b4789898a1f858f5991b2b1b177769aca1453c57c43140548452f3053d3b55fd2c3062a0b11939a3c14a81c59432616a5700c775fe98c6fb88c1eb8277c469be42f541dbb79808479e0cdb11856cb7c1cb6a5b865469bba549d73cfe581bee85494dea28d6e96a5f04cd65e561ef66a2482c806e39257b9ba9581421708663bf0b45b4131eef3384eb53b8733c4957937161c3ccacea5cbf91429e87b8b2b6a0aa44cab94bcd02d14cc3932c3ee58b483b1d11e5243fea0d34912b8d45bdf48c1358db3fc163ac081c23ca6c43919a649c33911c5802e2407e9fea350c3b64f302c5489005ec87650de428e60b790489a17e96b9e1fa91b33bce5f4b8d8dfa1610b39fd2858c25b898c1386c6dc021bd3414bf213719867f8cdccbb4d2bdf12207860a638bd41a05b9697a3bc901e9ad0075c080243cc0cbb3d389977c522230a42125b08d41839986a60acae28bda183aacc32dd5cb149af2bbfc60b0d5ba8ad89b1acc0863ceb24faea37ef3f60168cc96d766642f07a116225873e651ef693f2bb97339acbcba301e975405661b2aa523168e06c86f9bcbb42b5f12d79c3c379afcc37dc4995b11a4afc3578a30a13ff57ab87f022fd5c3ac5dacc3462c7e7edab63b889c22e90d685733a1a79ec336c50c18a5fe4408c2c122e34a60ef56a78bc16b78c3c98ed689e0c9276697cdd8aba667109cd911b77e6930c4f58cef1240c1f7005a7a2b17390988924cb0604b4f897d19c5b0e4a557a6a23470bc71db15bc99248d42d9bed4117652690124b1bebb438473619c4919c6c0e4071ca990b9d005eb287b15126e5c3477a98669f0856242dc073bb2673c7c1b1485799c300a0648a83142b95a2377d7e2b1d994209184309934c914308b7371a307a3bfc825958a98a12524b847ba5b61e5a279eb9f7cab5ce030c45ffcbcf919a6ce1059dd7c6aa077c2d2437408315db32a800c2099a92ab682fac6461896d583007b97af2336b1e6d061643c62f0b5122d48a230225128c52863c9aa7837ab4f254f92863efbb3b379f87e40071cb6c8b74ac79af4ec11da6c028f1caf9545a7d0a984bf6ac8d4067a7ff29325daacd3f9470d529f02b00183586011da8a0295b678b18d7572cd4f081317b92c21803f613bb959170ad3a4cf465645d3e5a1dbf672013bb935bccdcea51393bcbe7c975d30a9823667bbb155bdccd14ad3d8b453b30ec2b0cbd703485975cc571530b4cc521693a9965139fca21a90d57397f34c46822ea0e0ca0f56668b8692127bc93322389046c63fd08ff82b67f9778964054b49ab0dabe24628e771627ccf34f46c6c820e9d890b15f396a291a98eb14a23575952abbe46374c74b812aac6b9ced932c078ad3f2a05c821b720305773d070b8c86d7686c53b81ce241586f5f752fb4a2774152638f04156a0b24b3061141878d5759d12f8bad4e98aa5d41895b91e122074b31aaadc30a1dff707c32aa0dbfb2fe0a519b4289942e99754034d65d7b9eb5c0087225048b5a293038969a944725a23475b0681ca2177c5bee023bb7e0abe99a630b5babb5f8a67c8117fecf20c1187c338a97b72c1674aa302c3005037631ccfd51a5b10ce837911d8d8372b9760c0498b8ad8218f832fd8519476ea5673d6659b558895796e14cb5a55e7a3d0b91cf5a6228a3c93175a2ccb06c26bb00d5224a402f119a3a42356a37cfd82162c65953b798d9d96cf4353805ddca537a9504b708d16424a3c6209c2d738e25c357256833dd14375a65e1e32868bc4c4e5e062fb636e27f4c746eaac0f641330d235d909a128c890e531be3e0cc307e632baab0ef7684cc687bac9b966efecb85ed1030a1b1e15b71be5a263fc64c320b145cab657a14c2749dcc9961952ad5489c6485f208933fff0203f3c31eb6a389f072cc3573166b9349ada4d7dc66bb12c18a7d96a86f93883f83822ec0094b24751388a51166da6b24a0b526935817e1ad73b4403aa3b10b5d1822daf198aa848a73c9f9a866b634f939c2179ce55edfaa1d5d48cb3127f0fea3acc7b163dedc529d14502bab03d1b7fc370f2ede22c7190bd47cc88028adb3294029e264abe2d3c64d38269a1ee8660b9a2beaeb9f5ac022e8f0a357feebfd13b06813854 +ciphertext: f3637bafcce8675a7f2491e7970c65625bce13ca85362c62a0fb24cafa33b0b388b68b12962765da682203c46e6997d4c9c74f13eeba96273d3fd105352e92fcd8f0a4455e23444811c519dfb9aa9174dc6719a76bb6150aeb243e2166d9a63c6bdb9c42ca73604ad748b20ee8d4bb2e414f7a33337bf500a8a354b56211497c6eab1040580215f002f97371a383cb546b509653ee598798b1a9c2b2391d066dc45c69af2eb07d7eb89c43f26c4e553afe4964e0633c3dcb5a6acac36ce88638c17d83cb6bb90f24434c0aae0f302d7154fad1e698a1769d82ae7f90231cf5ae0fd5d7d02503505b6e12bc27ce6a6283f751481a6219d2b01f2e00fd04341ee96a4bd957d682c6b413d2c53c81f6ecea90aadf4482631a65d393e6a80199477b5f808e83be7eaa7b4439c41ec87ea6c69e9a6ee28fc9dec477d7a66744f71ea35cef0d86fb90534a26368055840320e1cfc54ab65fa7462475b541f19b259c79114da9589c8caf1578e2d179efe5a398936058995701308ea61ba4942bd35b36fc60371888a8663ea8eb456f654fbc51a0f701e3a318b64700bc8545685e5fcbb01034b717b691914fc7de9d1c229e16a759b3d25220ceaf72c9c7b5dba5283154098295a08b95efa11b02d7f65ebc6a3ce97b9929456bdaa60854481c6c3d4b851d88beed43b56b0d65533d55d19bf79ae57bfbb0567d4dcaab2b6cda028dfb140c797fab973f5345a55b8c3d5b10b6a94442e1ced434d1c37ae2ec797acadf124330c9a04977b29b0e76672f104e918b2242e0e4a05691bc3ca663b0327a38bdef7ed38c082927acf9d9dafe917d1f3c1c6b6e590206d12c4b0ad7efae9d4e28897da9811bd1210c19e384d9ea2a0b93605c75430edcfc66782421771774072843f8d4231e3dfbe61c5dfd99ae12d3fef73117d9cdf6e7707f7560c212fafe1104edbfb36c4130941b9d6f5a4d067255db6e6bb3559d50a3cee2ec3b57b8a379b93ec32ccb743e7588a3f6dc75f334750e4705a03eb7d75ad766db7a1a88ceb2e5047342a37937cec465ef93bffed2fc238284d367ff320b466673a01fd485ec23e7e21a814c471fc60aad2de49858673d8a5071d00e4b26f4709461b7ef5a74e8c52534bdb6e80bd4dfe09f2c491b20600235743d61787e93ec601d33de9a1a36786827584cc2f33f04c6acff0637b5eb845ed6ca36bc66a2edfe989d2b668268b78e1ffdb1fe9b737cb576385f2be449fe9fd176736955661a330a6fcfba361dd4935715128227b443518e6a27c421eb653168fcc21cc6c4c268b84da4c1ea3162ff85a3754064f4354026f8d99de2a76c99c52daa051e032e766ebd889d4af961edc0e497ee31021f3a38fc5ad1d4ad465d81ebb281f54b1a8c22040ce0099bbf55c9a3ac7c766d65c8cf0765e850404de6184bf81399795d2cab89cd2b73d747903c52140a90e2ecbd3de04c1bfd82c8ed5786b2a409c608568bd7b773dd6086021e53287b46ab5c26f9c04a3157912b079686b29e527bf65922e3b7498f7781978b12da9b938e4f83f005555a716c494277b1d1af716724d35e72ba387efc5e633d2e8ef015a02218b11be67e7e7bd491c7e9c198f18450db3254934756b8965d8b6c60b65b18c12ebe260202c044a40650714309d39c7f5b7d28997cd9f77469fcb1a7a5bd237693e16e6e4e2c645fdc77e859d2ee580ec4c4ddf475bccd6e31092643e62998dd523366d2b28bf4dd3ef54e023544156f0fc6a86d8e749551098ce1e288a62baffd642be9a2499b62c5858250d87913c1709a9a8578a430abe8819622b1d9e800875c6408356b597c3d9a89e164419b6ec3edb03d93aaec5644d3b24b26c1558775ce5e1773e644bb21412e43092136e3cab817fcf89bea3b9439026e625ca19018dd34028afac0665c135b1f2a5c2e8d2e3e34b5eb7cf947c8aef9d03cc20d6d22075eecdc9a44df411c0ccc3d0fc0f32277251c38466cfaf28ca47824194d9befeac21b68ca89c79c672b21bcc4a676ae015676bcb5a93f6b2f22ea25f4422e2a4ae637217f33345ff381d1f8241c251ef3e4be839cd4531855413e775e81d1c0a2774a68a15730d4149b1749471bbacd68ad66bd50feb37e2d97b73e001776b8b46583e9cb581e7095af3a1ffeed83798ba211ab22bdc4bd80f7e5026a373984cc20af678b9ffaad3be3d515a914c501155257d3 +result: pass +shared_secret: 52b1d99af018531b8f3b6226d7ae23843ca7b84d8f9cef28ead85ab3840906d5 + +# Official test vector 5, seed: "aa93649193c2c5985acf8f9e6ac50c36ae16a2526d7c684f7a3bb4abcd7b6ff790e82badce89bc7380d66251f97aaaaa" +private_key: 5999174084c2dbb511a7cc2500577f27809863db3607c863f5e50901e2be2b949ef9b55231b82703a200b1cc181e7119c0f9ab9839b795e763a5e7ca3a0216f6b080f0e7b52c8c196051b5ddd86779587b92bc10a16ba470bc115fe733c1847c689b06cdd2b3cc28a95d92bb479b05244549f5c3114951b872e1257b10acf04ba20cbc2a045947ad631c41781d0704c6f469908da6af1250bd04772cc6c45145e8193b739de340397f1cc431227474f2c15c634961b7af3dc645c9278c8ffc304ac39d1933946981399c92094aeccac243b81b698c2c4985e0191ca1126861d5a5f8eb61c023a5b38489d2168bc75a6f891202d734a28335add858b6a3dba95c86899db97921007777902df820b4d63b1ef40bbf87a59fb20662001511a75c323ee3b2eac47f51ca993f865bb80954138bb59bf2731c2b2498940129746c8c6297d2bb5aa8e75e3560ce91002fae79543289c7f1d1b1850b8ceb2166104b2aa30028cdfc6a5623c1ebc2c8f8cc2f27345412d90a9a840085ecb68214a13444aa3aa7259f35b0c5cb9e80aa83ed21c714a1a51cec15b91a578544294f565fa5c640edd9bb94c52419209006e9439ad53cacf4946567b80d4a11f5b2cef3740d20abcc04e39aada58cae16185072b98c64b7fb756eb0022fd055545b679bb14829bf0606558a6ec5497ea824371ea95312e31a02036179945a599454f5210dce7a3610055bd6db8f40e37502073824eb699a3913348660f3d1454430951732acdf3b4b64d57c9e69c6e6caa65e029a9de4c36942cbcab150034510eada835ff5aa0024b36df8301ef2aae086545a421e834c9dea771575d0ad98a0562e3c56b38546ad04475a39c310572fad7339dffacd2c39888a898ff9703d71147c3c9c476b75911d8615f43c9138003d1ea59e86cc9160f340a03904c8774924cb8ce5f610ee7a979f320960343d22c0cb84f977ec08b7fa18c34a2836a2157271472100758281198cfc88cf2c4b4ec287c6c669553f0135bca1129874b480d4621a4994d690922f67c6ef8b66c6602256ab917a9576638285e0586f3ef860d3891b66a8551a19a57ad7286c700bd7566938727b74401b9225732d5ba65929175480087f645632e93ea2c607b0bb900efb9e71d57b84f63b2d6946be5a66e77b032883b64c2734dce12944225dd58c3d19476a4cb01416711a1a81be7510c3d1183eb5d39391889d78206f3bc2775e174839a0162000921ef689a204565df8cf155131c9e7c5569459c81b3f712a8b0da79b1fcbc9a13c12d346b2e121177adcca95e4c6ab647784231172e4c4bde45c7a4532930a2a0a60a663a5b7bf186a5346a2c0ec9f918147a1e66b7f6289a21c2a6df8b04db12e76027d89bb7c13ba9672d1c76f4057415160430985f5215b53c59ac76c6387e52281889d968592dc607744757b61f30afb6c4e90ca6a580c475cba12664a5552f17330696b12b3ca3ea72784d16d2dfc5acc0b1665bbb1d8a09d8bfc6d81ba51f1117a109b43d2c97250fc9634001fe8018e2c9300e1e46c317c62574b1ee2c850b78383da446deb16aeb66a08a3348adba75693991b4c4172f8575ad7730039e3acb9bc8bf238c20e51b9cbc9818554021d7465d007967d274d82c03afb990f7502a87a60036bf5a204910e7fb3a514b8126aa96de7926592108c0692af748a839335837f0a9d3b20c97f3131906197c6a66ab88291a7c62d7d740f004d44e261c683827fe424b02802937d6ab4a798554574a0a6b5894ba8afd11b782472950c2cc678c148a9f80ca305be0b765a1542a1fe8690f4c865a09931904a3408e665d60633349b72c2353159220a12b5434eda854d7983333c04a0864356c6a137892023a89a2ed1a263a100a7503c1eac6aaea6b12a434b9ba504c9d79c8ab4aaa20611cce877a5f834d740108874bebb82c23e65bb16ca769c60280b036e2b921ea4d30f59f68d189a595dd099a6da6afcca07a6159099e05483b92d00076f22d0a1b94761e8b8399b4a82e204a011f141fa82768b2926d086a24ea0a71aec9d8723aa77614cb0b0ce881742e0a7a2afd0c288244be4400be81a90209c33aad80b84e383f84a4c313acae89a6575a3aa726b65f0d75e5a7ab355f967d5b771c85993a0b6094eb35e05c409f3e47369bc82661a9e822624d2a644e1767de906658569ba68922aa5c18996c58b3325685bf3564518afdbb99aa67acabca017283bcec3cca9075cbcef02cbe57ccfc73581784bc6fc1b8b7623b9255c20f7430887c87a5f6873b8789de3810ee4841447d826706bbe47d6c4bb13380a03a532d240adbb8240847e6ed68eb5abb3452584b949b8889bb77d2bc87a11c4580919931509e8fb931b50957fb00b972c8f17c8be0e0565bd95b16799606b825e462059a701412ac2704cdba91ea269271519421574f807206d8a65f8b67f44117b4c742e7bf4209668cb013975a9317ee847bb09db3c44d8029e01c4ff4954d5ac7557941b4c12c60520785867cef3f77214805c96d8497b508629713064cbb04d0b9abe21afabb10f33eb38b6b3bfb34908ebf048ccb239701944fe64792b8a909cba14bbf50d03b858bf4a318b9860e58141b7f114b38616533c96c4eb25115724e6672ec20937fab6164aa4a9818acf072c90ea4a5ba34cc95270a330e2874d76a5e0fb085f1aba5917a6e6c3a50ae59659d95703d0a1e9c76c0f0055605ac839f70f6868bf0727496f38c4fd042226fb261ce27bcfab89daa192044462cba31297a660b191bf4440305c5235ec225018cc92480c19bccb480d03d08c470ab20c88c7a1b2a9f37dd7b911cae469de0c7f6e08aa9d427a8eb90af2649aa28ccf1bc19c0fd84842e5748f686278631659a5a874377347ea3894b035a5c139ec8cc0aa63a960535f8e3113f668bbfa9a67a82ccb03253461d3354eb81d0d112fd667a1f133c054730f28ab50f54c5416f65ef60b6ce8c86f6608456c819a7e10ba9232322e4bc73d8370874846643275622b3da6dbcaf9fac7001cce6d34565cbc6f34a1bc9ae904c5229320a3755c4a439f035b5f8a099c70a6a57b5e3e15001bfc19710878c5db0930b21f28603ea4087e0b30a2cba02118fa644331a81312a22ca0721ff266620bc91fe318897b77d3c9b7f9986861879a3a9c349e16c72a9b2bd645915fb05a94ba4c57aa72e93c3decc55597e664ae3a683274267f486452e089aaa8679234c2fde99327a60a81e687cf4491de4b90528492b6c46eeb7725d876a91987025af06895279635e98183bb0ef7267c6449913ed09ae1ba77bba0010b03b900863119011b1dd02aa969ba41b6b684fc3976c416342891cbd0588b5c6a480c04d7798820da67c9142fc07a906f2517a9217398c9611b0749f5556821d93368014d9d01cf2976af6bf492e2e59b66d3671e814e466388e2039037313ac690c3dc534ba77281613560b0fc9bc5a298c87b879835b386c6b0e1580830b689e7b005ae950d309c2e264556685c54c606aab7c0318b2c66d4513a707b8b5800ad2ecc1567807f28122525b69b7e1cc0d1646efcc1673a156429a205e4016887464c39a6543e722f0980b81f524203b45deb45184d35351be963d3906e7b0a98b49167a2e0bac9c7a50db62657c4cadf6985d753c33f90bb1a275be17a7342859415f7855384975775cb557a2eb92801bceb7f63cb97a40837ac159a37c2935157160d518bde11c1fbe18c32923d3049b50b50c2ae0a325281c7a4bc32022aa7835630198103b25398d613631860b70a6536bbc66ef6fc9ab856771652689527c5f5db1d1b4243e3f06460eba75c363715378c99019d213732804b31e30cbe3e93c6f83a7ec239560abbbd48d96684f17ed61c9dafcb55cb168e2ba1778ecb0166e7664e9412f4ec7353092fdba5cca4585d173023f1856836619e57b0052b07141ba9507b042c5d5b89ab429b3f237f0d80c5d4126cb4c59d9d19bf0bfa9e3eb42894228d13a05125b36d1daa647661905cb471b08405207469ebb35ba5375a40b923e6b0cdb3f1070bb6728a389ca4b89079467732ec3cd7a27d746850bd4908e401134b650419e639fba07d88eb2bbb755b2a7ac2bc6947ab8907c80a3b5610a771782daf790874563b65a1236baba0b6fac1e5f242919bb4519b637464565467456600882532457e1249e692bb82e16c7f21c370a29453a95600a069a54b0b62087f09ea7ab3da48348257877864cb080f7a39603e284063da75ec0b9219e515021ba46ca8c573b306e814245d45cee5f55d0e5c7e36a31166634e7805a413a062a7b5a7ae75783f97c505daa8f9113507a98a3e8ce6ff046df83fd23815de42eb44b586845b55b2d39aa000ad80db50ddb1aff6498e12eac2d5dcdd68be66c7a569b0153ab4aeba37a75dc973a08ccf451b049fd51d7a9ad77ae14a81569df8c9bd3a8f1ebea86fdcfb823082 +ciphertext: 12cf783cb284a6655af46ee13c23e89b13e8cacac077ffc171c51c3ab7ecbd38853da0344d2d2cae3137bd41af52c1978fb85143bab78f9595971c2366f4d6935124f9d78ac2b1246d12c51858b51379782d2a7d0d7f04bd476bcae1453535cd4e0c3a19023861955290626473fe8d1b60f077c9c79360c71e64ddd5c39fc56bfe4b85b4f565a6ba165cb418838eda6668db441839f81b0b8ecc56825cd5e64ddcc69ebb9241283281866916020d18cbbb5abf1395841c96d81bc7d4bb89fc62e6c3d9dd8acad7ed67f6ad572a3f8ab67c182acac4d2267e46d8577afe2d9b04dcb5d11e33a909439c444c694bd86873bbe6fd6ebc3c293cedff1fe356aa4715993bd716f614e91f44b19f718a467d8c8d345e9759544c3a5ac885b296ced708bffc6c0bfabe31db65f659502cf859114b3394999406656d903ad8dbb543288edc97b5c5c89a58545e3f650030abea8dafb360b15f95e88d44e7f5010ae2f9b111daa6023e4496055371ddba9a83db233104348472056c4c6f50daf5564ccbdb33ac8f02a176e9fc74336f6c0d0eb0f7f78d55f052dad641cf97f4681baedc52611db70a0065ab680586e4dc6827f4e5a913ecae5627ff7b2cd69f253b1d6587f9961e61e75754f3cde176107fed8769898337c84d446ce33dd1767afe323d930e82784ceb7b1c38ab00192738d9bda2b21cb1a14b71a2aff00fc778200d2bc5487d56e88278ab4d6059d8501ed5cf53079826c66af26d59a9ebf8f102164942709736e203a745fe7784a03abc0a776b18ffd23a81f79d26e434a2e99e65b25c407c2d1891809527412e384523a47f3990bf4fe3f9580c0dce5c3994e5c299bb0214516b73e39062f9054f743541fe824840bdd3631df12fbbbae6e1ddd98dc320b9f3d0645ba2f7a32eba11ec9049cd63cc90d9164ed92b945b459200a9fbc2c1e346c88b975e4299cc5a811f88f9ce9633695144495fc98ad1bc1689b6d0fb5b4b9e90a7a5a7ebe2c6c6455f8c4945e34ee2b70e82503f4d3161e517e09ac115f5c0398fd043b2c8eb18a5aae2d2891e0009c5bd9c18c63a8914ef64e4d9de132ac55ff9bf24648361d3339ed8541d3b4543b754893532fcf648f49532382a78fb037d218756c012e2aa99da5a77328c13fa1588c9842c7ceb2318f7c15607d10625f78dbf378ee1789d6885adb50f5c334a768f45406d15ae898621355b16dce505877864802f532ffac78e8cbfa920bab7f1061cf11c5326372506ebf554987db1f59413611c9c0373345be3e612b3581adfcd328e283c1f8881ad1c09cef665d1e668047ac2274ae2fda0c7045019040875de7208ebdf48fa4fcfe533fbb80abd5db7b06fb00702fc440dab58bc46a5627823c55e39a5a3178e72df204f8346c9fcc7b212e81d47d8c571fcfa257a63f75faa6f50f3957836d1e0b41e7d2daa533a8852f1d4bd56afa2c189d4dcac7df6440911f87891371ef9603d9df1fc3859d549a2eb94ac3365acc0265fc9c2686a2e36fca53073ee1b65bec258f4dfc9d5e341cd09a88de63c15ab953ccaa12714488e23b6ac383e8b1bb84a9c7e1920d080f0912dd8cf222ac1b9acbc31a04374ea494ef68283ff906d0ba6c1f63071a86dde361f66bd4f773d43f3825f20c666899dd954043dca2997533dac459ee0fd602a1c564637b1eb7f6f726806a6d1c9e22039b85ec37d2119a31046487e21395182345175755e5b3ca698d5e1f114d66a67353e232bce7a0f9407909b0fd87f7e0ccebbec2a51368bb3bfa5bca5e2227b3abf6e7d0690f732d708da63dc58b208ba34c91bd7800e30a5cd653b09b6103d141f4862e41a3fa88df43083935d50b85fbf4708c96bdddaa5c0df9b63aa4517f5ff87e86f5e31ea9b3ec0d3fc4bb79910da9605d032090787c34be9613d68bbe65dff2acfc4f89259fc61ddcf41aea46106de8e312f1432c838d1acdc98874fddb34610168332bbbc9da4fa8d9f8f41f9d64d384cb7f1ca844197952b5cf69c3f6aa3a981418b9b41571b1a60ba7a14311c5beef82f7faae76fe3c6c9ac342264d3261772ea71d785189d3a9d8bf07efbb3f01d84da2498fcd3e5f62d8ba41d5ac481719200002de59cef1b41439715d5b7e84f37fff645e067a32db5164311f69e1d177e42893aee3d7478f52470f5a62b37fab65d6b960651db061d05b3969f82531c697011e4438f910d +result: pass +shared_secret: 392242412070b869a67b7ab071fd796e83b4e3b5af669ed7a8c4fd1d8d3ecfe2 + +# Official test vector 6, seed: "2e014dc7c2696b9f6d4af555cba4b931b34863ff60e2341d4fdfe472fef2fe2c33e0813fc5cafde4e30277fe522a9049" +private_key: 8146c57021044d4310992c0a37686e1b55240a076646e041eca9976ee77981f4c4743788e5071b28011a2e26c2ca7c3dcde694dd996855ea17dcb241ddeb8ceaa74eb6e90bc7e415028cc4f7280069626196b793e7208b6987516a4a95b4906274b9a154d669ad7a85d454ce905c090aabc30fb68f0a001bb7998772937ee88714fc854dd1cb7f544b7ea345a016841c6eb1bc070066c2134591944016ec8cc5443f57e72fd8020f90f332a0284314ca6b02f8596db0a7244359d97a9a84c07f14939405718781606c80e272a0462fdb2c323c326383a010ab5bb55531a687233af12812d88268a2b73fe0377512e6bfe1fc5f74948a338259654760decb2616f3ab2d80428cd754e27746196b38c399a765b610f46b00f3b717a888b7e2111eb0986c8cdc84a546c420b6b37c882e96e96618b374975c0b8ecb50c6b9bc8d598ae6b46c023b82f3393817a19d09fbacf897251aa9389603321192baf160c0c5489381634320bb2083d604f6db178c8374b055271a124cda7100d48847719704beea14f6d18edca69db74b1e5ccc47cceaa4609a7ac43bc32c8159cb4abecb2800b1947245196bc4e3675540b6d5a29eb7e82db5c3b7f2b70b12042727489170884ecf09b0537134a9aac0cc79568e562695947aac325bc104bb45e83956e857803c563e287a20f9063291b8d1809795a069dbac2525e6cf0e1628ce07a335b110648551ed4471fa166aedb5449f64cad9ea5605bb2c51caa38afac0190c515ff0bac6d8712afb250dc4bc96dcbbeac20c4291097f31611a2a3dda52c94008357901ba6b5a227d5cc744d4a4e3bb97ea0b7cc8b7829bd245e6039e23b9451011334928c6cc22a919e97558cc9a79b988d248186f3acfe7c1ab71500c8671568a591c6306920c19b396923368118153458ea7411cf38cb60779cc9195ce98ea9c0c549889414df119874cb44b332b8789599a713056bc0a6ede61c05777262fb1c7dd03aed0b324dd903b7be44fdba05d192bb5426a86910108e3d257aad1a99fb7408aebc5a758c5728c7375d405c4bb461816bd7583aa2357c83a594d41449f7b7cbaf4d80b3948a8e92cad59a3283f7c3233833ad8c866aaa1cd0b39359a0c60da978046ec7039ecb3bbe752045bb15e8a0c745bab19287e79d844ddaa9eb89a4512b249b637122ba646888a0b14a50473683e05449295f7729980043c03357ec35432585270780805683d04e6a6dc099f7ea4a72b482e090797392aa8168242a5890ec8e89b13ec202a3398a734c75ffcc37a088225e103ac41b52af9412069bf0084c303fc0d205509a7211598d475f4437782fa3637d8c6a7150600061d4458811608ae7d290b1706516a9456c665cf86670f20f2a5f691cf36d1c90772b837747b737029d558cbfd418df8e26e5369bc0fe35e4089c7ea67383ee02f51f5cca36a2a2b867668521ae972486ff865d4e2beca6c4b1e39cac3c61cf131352f036c6292cce7875ce6939544b58634cb62fe6b80c4a4447cba420dca993ae070d3c69d62da3b956897daf687c6e339f8b45760b40c0b9ab06773584584b83a8113bd765815537985d2cbfb784bb3fb50be2b11e79b91129c29b7468638978a1cc8a81ed289cf209f41f85b4b018372c8799e9b7403e10a8a63035417719b3416961b94c47a0d81e51860aca7832b23cc41a541529df511a443e480e31020a1a5b5ac8a43b022b9b1581cfdac0b8d0c082e392c473c922481b15122cf4e47474d6c73f94496d812283173b6361c31ae5251029bb45d21b8aaf3037fba8b3f3744508b25cdcb35873321b6671d94c13148b115ea13b196dc9c3c5c7b37d5324aca344597870f361cb4e5b9450b93ff8a69b8ca3c55bc76845a635584cd0c145b67cb047c0517cf60c8a1146d11274531eb46da9943d8b777df8344f28b8b12fba249398fcc7710ed177c4ab34c0f229e4573c882d00a5a88cb41f4102d309b8a23858da00aa9c935e4e157a7da40885379ade1489b4b75dedc7612282df1969b5e42a915b17cd084788ce92521d6a83a79047e7cae21325d40d357be0b3a47933a5949a4c9b42ff883a3d7130b01843d57717bcbcc09ee13c0b63311df50425e7669540b3c3444a43b775473189d07c1724a114fffe30bb1976004a66ccf811955f39e77f0722a726811358dc0f0b76aa90aab8c2dfdd3a4f3e31cdd076947d2b503c73b8805b26d6780d75b86d5f3b50ba899bef229beea7d18fa9016878f3aa8ba392a4b42ec4f92f42ad08ccbe58a18bbc7c8639c04016b9c663ca32ebc31fc82a138970c0cd238b6d1b2f2645fa407504183a125b1abeb622245886b9dccb9f2793147a63227236c9cda173c0546739bca51ab24cf3287cf935a8d870719a62b71728fc5e262662296f9984e485101860679caaa02fa1209e7703e0a5678c496a401cc5c1b834ae8c02d2a61b8c40694c634c80290a2f5b4a63f865ed6689a54201589a3384acc299c054d1cfa25be6ab278530b93616efa35cbd0ac8fd367923bd89cfa828f1e8a10a6d027ef2417422a491ac1bdd2702d688809b7455824ac902a70b06d54c92d73b2047567a25336fc74a6d8613d6af0a51c0645ed30c19f3231c147ad98e0276654b9277b16e100a2bc1327ed41043b61900d48c1f51c70725133ae31190b90b43da26335a323c13652a04a2e084827f190915548acd4d96323b573aeb2633be0b3061544cb6b80176337adeb4c5eab7c55bb612e9390419a7598dba6a79523f5764ec7fcbcd31b85c41548e1db0cf1aac1dea8031b0c3b9e629b6b9c06ef29628afc979d303355fc4d1a480fcfd0bdd9c04168e772880a4a53d4182ad30b760c89b2787691b40eb56165f321691f3c4880b20a81d08834c9b2d7b2aeb0e537f5ebcaada992ac0a3402e81e18aa1fd1391f00fbb333d46c7ae50373eba628685d15cb1867b952ed05bcaa8a7efce7c825ec58054b2c84d5c69dc22c219cc71d5a92230b9f40f633029c30bc6b266b37bc5e994e14f96d4c568d83db3491e38ae1b4a320d831cdd5a8e582a1e8a43153c347a3c91919ba60d18490baf18ab8a530066a9c35cb7e05915d208294059b161b09a0b8b446c322c9bd6160d7413974a1b11d0b643364432a1a2bacb1c0d70c642b68811b39a69d44974b125655a64075b35cf9cc0d632493ec46307aba8abbc1033eac4e7ad3329c246a08294f3cb141fad16f10b6804f70597dd6ac34b2b40190c36e17325742a4e9386c08b69cf1e0124bdcc2cea6ce77b310262a71ff7017fa1b70deca96dec183f2981975036117656955a5c4f1c674b09c1624c0c48ad2c2584968f511ba5d070ead9c7889e79b1e123c488349a1f5216f351070bc459f3c8cc8314e16b97266d37675b809fe962914d924d0827cf9b41c9fa169612b70ade609bec43e04345e5b97c330d9216a5a7e42632f09e95469e9b3422041c3119de5e845d6e02795806aba9203da928201905e2fa82c6c7229ef074a230a05401cc9e22076e1c372e742c8eeda0fe7aba76ce5baff468cfc93482a1ab5957cbcdb2295ba074038e539be24986cb8297a536fd479b42c8973b7d03d71d74346625f96234b32323b17c3769564a1a82378dd5c4d23a551024c3468e50ad5b97ca5641272711ff4464d62b9619d130de8491430b5ccdbc928b7e411fef80fb942ab322323da20cdc42b5d17a9406e3612b7970b648817e060030d338689665d3aa7cf2b97314f8237afc890b10097d8f304a26b9664844784ac8d00932ed8b32438a28e5b078484b5324d976422324fd0f217314102ea587d6de84b482992d9e6a6cdb3112599942fd76434390c060321d326bc702376d466683ad546b3bc2e47e4b891f3b7d584375dd3859ed58fe94255fe421bbfc7214e3abe265a1465e58c1067bbbf214db3a94c54876725fa0fdd048764921d5b6ba00c3382d5064baf295b30029bf27a88f8f630d5558d595549b65201793229ca2647621648297a66e92917e409cccdf5cb1378b906c3ba731355d57cad41f6148f7a706f850e99e7610d2c78d45b9f699926a4e01527a1a49886ba5fd25ca21c325e21034246c45785127f4859c0a67cc7b76259410b2f408f4e1569c73c54a4da92a40476402573a2973963406290549f4a41a2226131251c5d59d85e1d5123d527576f7c794842974d884e79927f7bf6b09b752cbbfc442934ba461429a3ea921aba995ef12c21116cfe66b132402bdaf690ed95483aec9785e6989e934e7858bd13498f4e994619ea9cd55a9504e40b4d0ccbe8f8cca1f72dbf74caa3975595623c12f22c120c022b59b2cf3748b17199c44cd37f8ea61ba5d8c1bbe50789ce915df9fce1b4cf3c5acd7ce52dfda0237f5f24fca5a18f8f98c916c3e3304d2669330c1042829573e197597d729484ef52db5eaa6df8ec3a0bc5ffa730db0dde8c5f38f266d5c680a78d264a7b96 +ciphertext: 1a2fcfde856f6d8e741237c5e0d0fcd7b58c9886503131c09a9f5db0f76c91349fba53dc31df528f684063909218140888d39923b52ea6b06e55590ddeba2b8173a2945e40c08e965780b225caac8d2b9a66eacb554bde430120b066c6c57ed75b0fc43c08fb4491ea446daf15661ebf4843a22a81059a049fc4fe3d66fcc103b7aad3780f9e21479b75a4f5038a07879ef64d7d12604db56b1f10cbe6ed755e1016e803cf83a0fc5d41354d68bfbf55d65d6c2ef32dfa88541a9cc13cb2beca4786be168e6043afde254a060056259afb94c0e858b59fed243393b7c10c5453852207daa69891bf3054b3af65449bf7a17a2222dd348a06db881cc12c29ac972e347eb8ae56c6008d0ca4927ce7bd482157f123634941db84bba10c7552552362b1d8d08e552f92897f5a75636f649609d25c2a83541b6e3115dffdace94c947036866e22f79b59b7b246e5622e21c4f0914352e09a5866b8dbb113c97c0921ae3e1a1ea0bf726805b4606d15298df0e32eaa974584909ea709b57f8ea6047d908b95a6db05a47b26de1470fc8fecb7b7e53851f732f55b0e4b1c8a1c993bba9a7d22f125849511f124478d468e6b8ebb50f8d11e0ae7f6217e19ebdd57125c04b3df9c1ee65f2940a8b8e24b0a52c012e5c9e2c09103d97477ecb033d7dec5d59fede37c6f95283ef76806926371562cd537c19d6c6fae9bc88d57ea5eb1c8fda0bb8803791fe072bb22f83b9eea89e5fe25e5ece6ddd7764e2aa8cd293b5fa1acf2a831e4bd24e4f91ad27687515f90fdb378c4959fea17ad2ac14721734aebdb0558fb65e88154d11487c89d9880041968a963aa9da09e64521260132f82e39ee1d44f8bacc3c6589af7e049996494790f6f9f5bc6e2fd5518c145dfac55fc339b279552843afa411f6c1d48a940f0c5ceebfb9440b46b8bca9e5a9a7373dc1d003a9bc7e0346e93d440a1ec63ea44ef732b0bdd62febdcc4f7a1acdaf487855e55e8372f6f3bdca58d3c8bff9279e9bde009f1cd6fed525daa609436c55048c06cfd32b5aa0d5d85a607c28047f1f79c74571bf8fcebf00ada66195f0118975f99878fe53bab4e80fd4888788401a5660cf2c8137c553108e1529e4e19932c9d373e72898f5f3a5b4167156834ab1f125a443feba98e898f5336c45027c41d5027e7b319418a6b96fc697450d60a4d8ca418687fb513d53343bebd575b590b1b608b262b1e0cf2e4412e4d659271198c6d5e33231a9d5ac9009b3b275da170470950656844e6e4f7cc0582c9e43c9144b4910048e90a0ecaa92d6b2698914b91c5fd652b1ed6bd624341046c5106e6ee7b4a13abf3e80692af298e0346a383dcb833f615ad69f87fbd1b4f72cd626d78f5bf37b8bdcf76ac984a09ae1a78de07f0e387e455f6e16f37e3ae00a815d997832a86eac07d54767b35e1c426c0fa4cb4df76272045f1169d1748411fc6d79a45bccc476b3e8967981fa9128141b1c85f591bbc239fa68514e65ffc56973028dc9661f1a69e67736ce870eafd4c87c5e2cd3f914e93e5262e8a7e8489b0fe0fae1f238fff41f71574d115be7cacdf1bde432a1e58f2d333860a6605469b5328ef8222ddb9224e1333b260e30d90b75a03dce7c3e4edd4272c3cbef31250c04544fa97ee7a399058a6f230b381215186281edcd6f40ccd84aa9e9c7abc0808dad707bcb93b6cda47d227aeb88930bf68f5723aef9e32e960015dddc944503c131e541771f131a2fef3cb9ceb1896ea98573e2a9f7613c7665758bd3aae087bc574411db82b3a4f7bb71e869ca72a024bac17f41abb843551a28cde20598abf81a82d20d4067b9ddf14208073444755c8bae9420d9f4c1b72777410cf6c10cd7944a158bc636eda4a206ba4a18d3f149af59c5371872c786f7b89cb6b8ca1515250202303887217d7c41ed5ecc66a5528a072b1112165c6339ad27c4ad7ec35e04dcf925903e0ed6bc2a3608c846908cfd0e5ef3c7b2a2fd66d1c19bd79f8ee3ebb1910d010879ade3dabb9cb531247c9c881b1869bfb82e291da45c7896bdcedf7ac87aa72e6270f39951261d5fef37aeb39a8c94f62c78a7cbc0b2a0aafb2046eec47e5012ae49bfd41f46e5428cc90284cf0600a9b9cfd0968650903137ac5091da2aff756e1e39ef133ea7dde4d8ed9943acbeabd396730cb96e3f41e3ad13a94cb56ebf13d3e39597d65af9 +result: pass +shared_secret: 0472c7777196fbf335dcbec891e291c5666791991a332ea676778e01b7379e72 + +# Official test vector 7, seed: "aefb28fdd34e0ab403a703b535296e3a545ca479c1d8148e2d501b3c8dd8b1034bd986f13f1a7b4671be769359fd2aab" +private_key: 617c1296d2bb9802655166cb0c2074c206ce03fc18f252ca7f7a66d3e619acd48697b3a5d9845f8cba2fe98654b56cba727786ae19c961e447c07ab7b9d30a64c85659429fdca3a01823c30a8335014a2472898d963a3407980a63c6bdf5aa79bf2aa7da370f03b593ca91c77f998ad93917711b7639e448a2036b86489489bc41a25404f77b0436b7810b38a3b729472b26bb47c70337d575ed265c22b86d46a8c7f1c668e56a66f3d65223f0bfe60b472a90a463881ed587313a45a675b9aaaa7a618da1165d143ea764c0eaba20ce244f8e3acb79c9be141b73d8d00bb6db5d27e30c2ed5189c31406f154560d7832cea31d40533a45b1811216951099f59896d25e1c1e898ba033aa6107b703cc7cd357b0d60118fec352b5df527fc0245f7a44fdb649c01b1b9e410b8990c689758aa606c1ba559075e2c3068e865cd835aceb37a78268e8eec1e1c93a619abc71c3305e6db35b58791e8d00febca9d3ed37b62a818d2a12a66d591420cb38896248a5792d2716c63c6949b804ce27768ac78a974e42be1437cf170464610223f9812908c29fb748ea9e253d3d8242320b4b0125bb094c7a2f635eea0ad60abb710f85150d797502617fd4341fbd58835b48412309330d3859e1140ba2443f6970b96c154d5b9429fb1a41ee6a30e4c4b919642fbd288629c68301c363599738a5571deb84358c571311737c01101e00c490d918260d7172efbcba6b8544d96a384101be6f64e946012cfc91125236b8a54781c4ab58dac60f737021c5b6e45b0b4fcbccb224bc7cb1b551ac35fd99a5f9c0cbdffd64d43fb3588f177489a02340b19fa12b2f3ba61f6d53a7a0cc1e186bff1a49cf22c500537933364a7fe257a5519c133aba7ab7648e2f7c6869b6531723cd03673afa10eb8b30ada830d53a4c7099695e8f4242454382e752b86fbc8bd361c058986d80699e60039437066db9172a6d8b3274a6369402c12a885a5e5136ab8b10ab8c7d3361eacb7627f16cc411bc7e2b3403d6b5f53b31f6a6657c2464eacfb796afb6a172a201026b3834bc70feca013fa036b5611f6f81013ec66017a4b1ea043f52c02ef0b55f05b6f65783a4dd6641496988e3a84364352967ca26302168ea81405929a4c72c30aa14f83016692413399630b582078fa6574dcbb29f17c5b85e3134e8c2db35c73b4683abd8b7ddf666ac1501b56d855081054b3085144a57f74246464bbc226c8605f71bd620562c044b9a6e656e7640549147819e124afe991fa28b049b388d150a313829144262234f46779264ddae5725469755a3594cc42cf29469b8a35016d170323601131b72304378a66f41dc0e43792915f5f35b338822ca6c7c9e6273f6ff36fc022522732514bbabbace610b9d952043c8d9ac98e89743faf9b2dcdbbb10aeb07c636001060a165d41309b46fd7d32c5f05c138d33cd06c3f316117ff90831aa5b6e0e054d49761ef3b2c6771b0f6f7124e5b8ce0814104500e704c84202b02deb0b78c17883ce72444850e608620c97290af3572f2681460f08e1fda10129806f6431317daa1e091889b7573c9100d16cca12b77a27706a34c5775bd494f13eb59002847d13163e777886501a497a7bac4ca9166b1c2ed27249cf11f135876b4c50c2febbace470505202a8fe10223b9374c6520ad4075dc30b0c4d06ed30877beabb108a6659078b7bd56c9c3d6a83f1b4380019cda1c5c6519145d515dd521449b717a98335efedb5e301a9d72467b4b458089d4242620697e27887d5b88b8259d0564ca792a3395649d4f458100e14f09400e8bbb77d64bab25407c95bc792115bd88e767b3d7c7eafca87dbb27e7c1989e74817b723f348a0a4d3b2b3506cc150934f6f50bcb676b756b1b1a401822c853b986b00599c61a269dc8a1b54227963fc7a7608952e984b90e10a9a81172b2577c7fd9ad3ce4b319fa0611f46706ea596af024831248ee19258c4b0d9928aae5208c4f3621c7696adb95a7cd91c39157cc4ab735cad892768850493b4509564ddef09eaf84c6f86638a1667dad3b2076cb93fb538d02a5c36e28240c367ba19717fa695dba621359f85c05e740bfc2ba1c146dfed60a88785179373ec49680999aa616e7753d3abceb4a2ced2a60c0b00bb3a90b2be5cac300b107f76c0d2245fe775fc5cb525824bf945b31bdbc0a86b88d8827ae7fc0a3db8bb9f534a21792637765081c4669832bb66485133f61bc22c55f03b109882b9ad7e75fbf12519873a18d9472087a6fb375244b313f6a81b608d88b0f79147282c9c37084b00138e8bc8cb3bbbd2bf9c5f95766040617962651f0556756bb9121a6bf09a515c6836b650c44e9db72cef47e08079945b8cf19d8bb25641186a8c8999103898492a904c5a7f2befc1614b4482931989ff7fc83ab40781ce54fb51866706cb04ec2c1c8813e963c70b0f15567b41ffdda8d02a94d00d1348911be52163f5c44188b6214856763a409040e8480c0f263d966a99ba7c7d5724f225ab99327a962d1497e9b265bd819c2959b1cd7995d138b4d71804fb122730b6133713d68c95d861a3c567c803adc403cc911186327e1726e2881bc9b4b1873091637c5532951c0c01a0999e7740fa77c1c1c847feb3dcd387ba3974e1ad0310f889d05e3508f02443491261c367c94e074009103e8bccf25520c4546c4bcca7aad34aac89892524219ba9b715c470c72c6c67811764926335f722c03b85c509105d6f43f65ea9908d4c61f7947cf70c4ecc08da31aaa6ac1887bd388720cb36e10521dd88d7b2a483fc5833f8694be9892bbf8bb19b6ceb08a133f037371f287956821014b58c6eb9351946303a3b7fa920e32a471f26a18a0b939ff137927c2a79c27a991040fa0d29b5a89124de37fced8109ff634f6313551140a873a6b76245a2538aeba7a234845cb4ef0c9707a4c56f8baee1329864591d09745fec24b1b392f86c47c38a62b613a8e6dc022ecf58d7d81c0f1e11a27296290ba0cb5bc04516a50fd1361c248ce450b54698c28a59274204427c53c68b5f73c739a62f9d57ffbd17f18c06994f0cc58f0979646a7273b9f0d3493db0a23df085524845418695edd526af36ac6b0b4c3346a2f61317ac8e93cf54351e12a752183c7adac04c3a943c463599adb1f4dd18a69d6a933a14447b73c2502374682c8209706cabba3a2c27b2a108ffa23a6b9732f5bd14ff2ec25e9a384a8bc83855c043a372687972112050901f12b9c0ba8ae7676b1446cfb376b1ddb89af260007abb736b5b223044e73dab7b3566c7e361c5eaa54978a6f3f72c31bf499c0854e272005ec603d3a50426b24a35721c0f1613d55e68e92682217401b9a21af9296989e75588143495907cae38c231c7521197258ecc60bf0409e4729ce5bd436749343a449a9450c5b2af817db83210f9738c0029ba26835c73c4a2b85255b42af98703d1d47106e2b3bf3f6c90c1b0c88e40f13e18f4870aa42555c08e00aad7760321c6fa8151768930cd7c12d1b6149fb679d35e981319b566108b56b98cf1efb9ecb9a3efbb6ac471c6f0f207569eb2022ea0fb0048207e96a7dc805d0d07de1541531848d670817463bbed673b5071227665a157bdb5509eb09873a00b8c98c48a3c131e029576b76f49b7d0152bceb0bb499ac6bece46f54f16b5d7414c8bc27dfdc9948077c090304acd20a4955b350f22253576780696aff4998daab028632ce4b3a372fca46b0bb33f23a52a93c31dcbba882a925c9c6c0c4546ac152a0eac489e9b27ce9c89aeab652920690b6b9944fc6b807d896cce9bf0a0908f05322e184bb7c5b2a4d7459ea75bc700424f884925a2a83cc95241e7701944ccd53271f8b1992afac3bd3f63af3228e9b84a5d1a9483d5502dac28f992531ece7ccec18b14bac48f1f62039861e90cb8ec0681d059788ed147d1e10115aaab25b6b41a66a5e1388557ad56eeee6571ef418a5f0b797352cc013a1176c3b131b499008319c121185a976c5831bd3258b7bd7b3852aa12fb77e9db085389c0a9e1033eb224835d4793c8603296c965bbc699f87b328db504b335fe83010432a4ef2a0b0a4300e29309e3370660f9b21bbd79382970dbf4750b3e142d5f7c381030901e7c09218636feb3062d43ec75a7ff9a640005c1f08669c50d6a41fa86790f2bb41e7cdb401c06c3c035fb812ae2013604422a7e3c1e6aa437ac4261f7834fa95be9e71001b65bd2e0417164142f2bc80366a8e5e1ace65108771b321da81100397a117f00515b6a2c934599416cad1d5091bd23708e45eb6f90a2fb5c47c8c77d6e395a6332a45f4178b0959466f648ec5c43422397d4e771f902db7b8d876a028f1708e233dc266d76c52b2a849f00690ffb252699d5b3e9f66e0abd3c1362c39cedbc6985099daf37400cfe59841afc412ec97f2929dc84a6f3c36f378ee84ce3e46cd1209 +ciphertext: 61ffa8da30b8111f68c0776905a752fcf8f1f80af8eabb1615649d627412682dd49d521db32e66c36ff89bc7ca88249eb8fda2ff7b70ccf84c79f851d0c7179d3f2ec1b53771c7ca92fb2f9ae2b11d10696a6fc3be2b07fe57b634611e7b3f5d940dc0c9d8aa9a8824b454166c71e50b391ddc109647b68d12e51271e24f64d2d58a6f0567d313781d2c240da9eb8354578c3288eb08ea63801d5364e2802179087c32bdaf8287246ab1a63ec11dab95eaf2a0a41c73a4b5cf3105909dacd0b2fc166f27a287a6aeab0dfb2447a707d880fcaa73f6db886a64e04e2d3a6a8e95a995ec17c39931abc21038efb704750c58db92a20d06136c5fe0295711efbe0cf67b9eb8c20825a77e840dfb7126a3957784e7a6bb17c1cf75fcddb167eb13103f51017240e5da251a498f34edcba91030439821767f969422ee72e27e83e64ba70bf74749ec86c7d6dedb95533e8e3f749650ccd1dbc2e13522fd2f8c70d8a8ea2bcf60b66043853f787d0bed1dfcb0191aedb50585e60b00332cdcc870b467ef5d5d233b2005affcfa5b38ecce4402c572e6b22d3d7535449c8073703d663cb68a91cedd532bbadfdb8a51400d478e33e5c8ff796977e56ecdf74918616a435c3df762f67c2d52c0c332d2498ab4505e2fb5ceefdd16ac5a49919d11be701f476be075e9edd9152539d08c842bff9d332c9c0e7c50c352c2fa96f2b3c50b85f61bd4c21069ce034f9bc460069e7498489322207ce5b5039243a454b9ac824a250fd9b897e1360b1a0cddfaa2544cc09248cbdc0e511bfd4b145e12c8c29b4ee81c3fb0d0c970116b1d0e773f463946ba0215e1afff098fe0c47d9e27439139c7210c419a8e33e0a13fda22604a72872d6dd55fc9be361c299cd32cf5e702967d7c7be8372f6144166bebb05e636268a728c1dc562bc2acaaf1194fc53913ee49be9e297274e690da76a1ce422bf60dc5569faeff4c134c6a72994e441f9ccbe2be5aac361b18ed89ca8ffbeedec74c3d6a3f47154896ec2d5194777d294e9b2d9c23a9b95d3d32800c2b53c166abe25e6949e20fcaa274a792ad6a798a3ef1ab454f708075c75352a6232c5943753f2d164c049de891ccf7e2f0e7331b63f55755566a31f8c8783b6d23c04865187e8a5be7d50c0ab3b1a08bc0b0c8563ddd763a27aa88b67430c5b96fb35e8230c77d0fc501266329c454b9af4c1717f30f145b32a576978ff8c177d738c02980bab45ba5d1932ab73dbec31ffc8dcc66b79b17e35d1a5ca26d10b7a95e859e4266cd8bfe57282f47ef22965e8dca78ca6e4d2f29b036b86692d425528c01f14298069ff40a423cd2011ce382b06d8f6a6b903fa2375a9c9e1123d6af61e7117c5af42907cd3fd04659b239c64e8034cdd351f0afd0de22f3b8108115f9ccb0e977c7fe72a62910bccea232d018b0619eba0871f3b0f63dbb70b852c51757c7da18d971406a86a023435e4fd726746f7da90cd78403410636ce370ff08f716985d7b61405783858d9a8a93f8c6c790b276379003dc2f731694958fdde91147f0dce55060d2bc82f12fd59679a4d5cc7624860aa953227b602316fb8a8e7f4ad7309740cb86866d8748ecc7d46acdb967ed1346ebf98724d5308128ab8dabb6e7a92da6b34654e9f5c7dbc56f2de6eb26a411ea831fdcef744cecf3d736bb607e4125bac94f6ca0d2fc777558be89c2b89cb99fbcc2d213ea8639f4c2d32904628825b3fc224f107b78e2ea7cb4a18e6d74a67d9dcc68012b52e89030b1e425d3c09860368278b27fc091f4bfb87a118916d82305314167c2dab043b3e24570e5a652c4aafaecbe625f7763a4642129b20862953633f8cfe5dabc9f83b8ea99de18aea3110d025e7ba3c8ba128940747fce99d0eb824a68f7724fdb51a721a167e8e791db9d9a1e10e5fea66f981d2e0f33dab616d1037635a1c36bf85248643e5144e36ab80b759e693d09c1cfadca3488eb5a6b141b55e46358414e8c0755f2b5edd91859b02fffc3f1ab9eb6569e076bbd5bcd0f2fa6d97a95b96b9cf21f31030b36dae0115cb6acb43ecf9a59cc53dc02627d31d5f17857061491bea48b0b01d2c73e5bf8eea1333cfcf247895347d7e473a551307c0f77b3065335592071dbb0b2a56fd5a52323651999cf68efed856860a5cbb84bf8783b790e6a5833f70aae68ea0bf8d220616e1c4b40fad5e1ea5 +result: pass +shared_secret: 1518e22b08f28512506461e0c46e60d73f7211cbba08f2880fe612817ce9f933 + +# Official test vector 8, seed: "cbe5161e8de02dda7de204aeb0fbb4ca81344ba8c30fe357a4664e5d2988a03b64184d7dc69f8d367550e5fea0876d41" +private_key: de8539327c009f37124d009dc3d112be749b80e86ce81a4edcc802e757aeeeb0bca029441dd2193c568063599dc8d87209775224a792fa020eaa02aaaeb0c444336d94d38a1a156ddd4014070c197e527d33ba3a40b496c8fb19f61353ca32ad986664cde663862534a7351ceea4779fec825f8ca93aea7f23883548989f23f77a25f99ba847b427d319145cc8e32656e83b6295f50a015263c75ca8778650624ab7409c0f45964a8cf466d2fc95417807a481a1d2062629b17df583b254124342316153fb5d45f67bba6024f6180252b6b54662cb2ad793704c51fde4bcc758314dec86e6751ecd6a0324aa123109c38d356b0dfc9676c087bd7c945871a33e46c0924b8e8e1b6777f530615a5e3a71c95ca532c8255e8eb6afa1b0570be3b80fd1974b170c3cf30559d998e0684f92fb1bd4fa79b5bb5aff34443c0c1a5423c42833b9753b1f98e46a024cb1d3074b00f101802b105a89b95b306a7d546f1d357cce202a71043ac2859265cb768a29cea051810a08965c773546768c09a66aa76710ed954269070fc886a30eb42e33c4cd7ca650cff5aba39b7b0ad62311b92139805e89dcb14507c0dbaa6ded775bd1107fa1e1c5d2a61ba9d732df58b8845b4965d001f78066261794311701330b238483bf61780f7a4082881aa316892f5cab105b5519ad111bc7e32fa5f23f98202cccf67d825826cfc50a6db58c15e12a6d84c185b469b0f94022550eb72a4332d4377dc356a5b34135d1593117651a5c0f0c87580b392b8643386167119f4651b7a433d7104f9a216486ab6a6e0208ed6b75b93989797472391c3464054eaa91558e1b570bb2116ec964eeaabb650896bc296c93a090bbe1c79a320f4e94a2a27122fa8c422a0a4d318c62cc840ea2379ccda0a4fc71c1fd7759133520b8ba0037f688f2a3057fac7fc5e6b3d3b1652c2567b092b7add6a542c182c579a366d620c2f40e59a13983609df8d2c6a7301e0566323f00132ec9a3ce800892304ddf74411d3932c27089dc987e8a3755fb010629887e0e518acca18110ebb53a48980091ab4c156185c8965acc1d16d702efc301fa88a20c5b4fdb24a25e0a6822c9cd9d6b7a095c2e14b027ee38319fc0827c5c393fb6c3eee59cf315031e5baeb6b08753c7aa0cc7cf8abb926298c444352b50d12e7f2474aa065eb6c16b1b660f3a1a80dd36151c8b40bb265cbafc87c526b89b860de3513770110402734fc2a3568aab6e751233f5da9a7f846f5e4c7d318595f1989d557312d791261e642fc93b23e6378d61fa036cd11f0e3723e7790551d010cba70acf913acba674393b06de7aa856953f10ab2ec7f182996695d4bbacc5457b904b7df2fcc73bdb62c047b3c7377e5c41b247fa1f562c57d4a09c6b9710c7675e267263cd06781a5b63a58c36c94317509540a81063cf97af65249eb6648290e10c627b1029fb593a05cb575c3f63f280d367cffd0c9a8443836235b90201c5a8c53380b4b3c669936f965337acc72c05ac5b441fd8dab2ba5259e38c9b87c98bcd9646aa397961a160c7718808c414ddb05742189ec4730feb020d92f84296dbb97a453f7f4b09c965a6652894e92350f097b184a1bccb0728ed70c0da600b3e3b1c6cf0790135a329b6b3c86c748ae6840ef581939c81ccec3848f15821643e4a41cd9b48b1e0979a964c858de00c67970ba281a4d70678d61a0b6e5b93cf7b5297c6219c1733670407d8272491d137bfccab4709984aba8a3842415ec337e6eb5e22b4855aab21bb394c470881bec25f21238bce98caa9a44e06277870a74426bb927b46cb63f10d116bc94232c566406b79c1199cd16dbedaad1404ae4f98ba38b58d6f6b7b46fa21247b0d93d58b0081c5473aa14c7964d56496739214033c34528a8b51d0857ad3b18699cf7a025e84d91788d906e70c011cdb3b291019e2225696a2c61d0787fe445b6e36c64231288f3854e52aabd1295cba072adf5b756aa19c9b079084c204ea1bc7b65a34a2e8894fcbca16b42ddf415b40b73d5bb36ad2714b233c899fd42040502a9ac208c031885791323a9b706a35cbb9f935de1633d1b6b877d5c402e92e8d06117ea4a8fb709de91320d5aa554d77a945b30c127031030858c066556c957fa8813bf9f4bea15257905a4de4f12b6f27cc55032582857549f3ba0d6bafeee47ca2e2cee04b023b066f53f75a5dfaa0aca416ed16cabdb510564738aa08134346757f92585ac112c25a6e0723958b7b23bed41a126617b4dc30de275bce903a1c6c2a28c5c58c49a5f0c447fb0c86f5b6a6e9d271383588ec398fe6928f04b67ead2633ee174564cb2115a55d8a53971e0c9fe2a209f9c8745467bb8d9944e6c1bbc8a54a5d28cf82e8815a3615dec5695d00c0e72b2f7c483f72d36d2f091cd169311a283a42d608d0d66e020172a6a799a66c10aa9b93a9dc5caefc805cd77d567390bf017693db8b33392bcf96011dc88287375bee828341e5a515a97c019895c8e68d41c0675723af42b6a50da91d04c9880d21a5af9929362411f5b36c75199211da655f454539aa399ec276af29011fc2b5e7f5534461220ec3ad3869178109a282e8a960b6119d0a4ce801d05150c636d20d70dbb092999bd2ab9597a0b1de56086c27ca8f5c22b86995e5aaa9f6514323a31750eb794adc1ea1247317f82eb443604ff254e99a895436060291afccaaa1fa26b20fbb9f48e462851513f7707a5c3461e3f4b3b4e72ba3089c53fb85b9c0576c06b2dc832fafb929c3b34de6974021378356fbc4e1282884d062b831b9adac1eece03f5be7c9c7e8b69b1a7a79304842231f0ba1107079416b388a074ccddae26b4d22693f95a8bbcb2f3445ccf74abb702428fd3a04bea9ce55b6c251c57b6ff10232a6a85832530835883336a10992cd30144b757ab6a6377389e36093e218bd09cca1504400a7a473e248ccd40567637183ccbab9bb2dde7198abf35df8f8c836e1bfe061448b133898fa6ce3abc79beb4ac8d9997c12588c908aa1002b2570a64654c8bb3c1914583748b95d13f9619659ab4c8687f872030df926ee04b6a74047b995625b1a9a929a7fad134f989c7cac25c42817bd9f45327725474a629df0944f5fd3bf06057355f2843e8157115361cd627ee6d548230a89ad49bf1b156e50cba74fc19a63ea2e01796b6ef4a37d4212897346da865f5c36cc49a6954a8a868ae195bc4625300716d3b3692e683a10d9192e2ac5d096c465126730a9b72bb3a729a7cf39922674e39900dbbf91b2785e301ad8a3843f875361b5c4ee0953ae34a583b36d0f54cc194800be6b0a6465479c51999d5029ff50117d5498e8c6a0c81bbdfc6c220b21a310993fd5e7691834732e358faaca460fa26ad20044dbb7177c47736c412bc9011f09a0ba4d22aefb485a524bbb8f74bddcf78358c8addec550b86895fc3141682c0c323210ed756864910c9446c7d9983cfa98ce9edc644967cc93b7008e3c9166ccbffad008cca6569ae913e7327c26032744758f2e82a70f8a399ac72657995ef2754e3184c263ab93ced1510bba1d0838a13aa2cb9d7a25c236a37ec37fc5c0093bb47dace9944d077f5c837d78c54e3fb1cb0e8a70c4a18b6e8b95f6b7be2b79b802055ad4ea5febe770c39757ac42a09feac48b6174bee79621bb3af7d0a0094895cc8b6aacf722eeb76abf6b6f0d66bdc545c68c845b22cb167f96a0448b0cf812c46793a28b55a600a1431374b570c93d6dd7b4f789101e578e29d96b2384a8e09115f9e1c8dd008d0047926c17285dd996690b4ee9957cde5ba56451bc2de46371738e65744fbbb558537b33581998dd0525ebb9c17d9777a701a676956a03bb4911070d83b603f5169f66838cb671627b899e9706be9460ccbda50135d504e2709ac31c48c4fa67eaa740bcba4173ec25fd7766bca198fe4122fe93be5b646b1a475c74ac276bca3904a7c119b057dd2bbade1701ff249f484a4bef04392122c416aaacd5726a273066fc510f394903b5f34860206d8c45a4cc340440179694223b8eb578c5bac2cdd183507946e3d02c0e219ae33008e19822d77acfe5c85bfee7a0b6aa0eada58ad1ca5ba1e12ac92063c326ac4140250be091b2095f568ac7b483acafd7045a229954b8583a33376ca7b19a948a10c4a45a5b80d403c89773b7c2c67ad1358bf2900e8a793dee71b91c978c389b4d8c824937e921a17914c6d1a4bdd6460a2c7cac50cbb2f006ce9c98c7a3342f9acfe11094b249870afc3e15800701d606471a7a0dfcc073c277bb74706e5571f81cae7331a7d1e36dfb437d7d52957526bda146bfa3530dfc93063fecb103ce58c30abb5bb70c6dbc92e5f3bf40602bfa2721399623d76222e93d092c34792aa8308d8999aac7e17433da2166292bda1804ddb5aa9b1c6a47a98f8505a49bae2affde5fe75e69e828e546a6771004 +ciphertext: 77f22646c2e9df7da84340db963c6c521ce4eaac3b2ee0b081f60f15ed977007439c1f2c1a434a753885d909ca9397c4676653626ef814145fe6316c30fdefef47778f3b98547003b3d3cca6351d35ca4eb5504710ed90fd32f0b91ca9947f8521b567419646e075202f8ce6c2d06e8e26700d7dfb2f29a2c1ab60b41aa56937417076a5788fc5cf1dbe371b20019ae99c33c557db0142443e3cb2587b51c8839e47060dab64d9f1ef45d2d6f49a7a586f9d1838efb3c2fd1d733995f87e2dbb324781e8086248024efd5a916ba0eddc2122d362328c4fda90a294722cb1b547a78ccfbebd6628cf16dfbd94c8fa743bafbb825b792823ddf247d72db72d9b600ffffa0df9e5a45bf62e42fd3f46d93d4d10ebbc39851dab8b2103a3c643440a2897f31cb12ef49dbddf9250c16c148d05eb51874b214bd400f959ccce73d41b3e0c1cf3696743d47724f40cbb1d6d2f1515a2df9d18859628fa4674c6b1401d03763f9b2ca9de2820f0ff5d65f25d3acae5fa0b2d2b970f50fecbbad74f91dff754543a7986666f123faf6d32295b1c1fe950d507bf95ecf966eca6a9abc98c9b08ae039f25ab5f7835e533ce17b4cd801880b17c9bf942796687fc3ac888578f3d21be15d3cbef45e196a81a19edf3d87c818102c696c230dd028f5d89bac044c02b0735877f78e6e84c6069bb6c6624c381f063fe3613ff2a1d2393c4517b8658d3a4ca568c79b6ab1a6c8e06a9fcdb3c8e15d679df23187452007dbfcddeb1dde7583293c98ffb87f83c4626833d941b2eee611696763d9779c31ee8acd31e8382f1aae2140972fa74f9aee07d9d83e6f2ba707401783342a8a133f57caf9cd88e41ff752df945997b7ee91c450758a73533e83ff15f6f3ecd72eb1f33abe1651cae93ecbf4c28fb7b4de4cdbf957385e84a19f0dae52ba23097230f4db6bef2cdf6939494a68042d821ef4ca2872c9a13ba4048e202ba5ec21a0eae5e46e20829dd889051910e5df7d78e7c0f24d62ea928ecf5c952098694e7828d59d3bbeb3394e51b634cdd39f4f6cef6f02a8d49dece71660445eab37573fea3c1bae06a9a42d42beefd39b9a6576fe290483150bba21255eded67cb351338e45906e80a055c21ecdd1e51b05164f01549af64978863ca3c5223a614a8d4268f3b515b680b9538d33490c1092d86af2aeb8e9cfe4a786d69dbb27ce746dc775c544fa4a05ffed255cc27926d6beb5e61b97c2711c7abb1c2dfc340b89d8a732fa6c06acd53bde442c97193cf60e1422bf32679d20417a0e56b110fbc6a6dbcfd4c56fa7c7f37acf042401a59f0ba1d8b87c0d3eba3c7f058a45be0b4743a18fa88dabdcc198ac263d9f449bee8aa06967d007be82844a9416d7c87ea940c1874fa99d2a83706da36713ba539211152dfe78169f39b0e74a8523e1211a102fece7b25e56da3bc708686e288415054d9562bc326cd54e564c57cc9bdf19462c1f7c7e04f6202d888837719192db89bd81f3ae7e5bf97e38ff27af9009361e6688b2316790a5062865d0e1763e7578fe78e02267055cd39dfb9e662791ba909039e7ba88cfaf04ac4a3efaaa0caf3c35049c6dddb2776633c4d2599c062dda533ae3efec032d91448b5e5afb27d623724bd03070ccabe02cfe605535bb95dee8777e02c28a96193d74abbcac8ce7ff28988ba448ffebb5910b414c1e9aca70f2e6f8b8d2405524eba4bc0b0620cdcca7fb794849f10be427a9910b5eb7f78ed9b2a7d682dac5fed4c79385e3521d69d8064d065a4fd796e1ede3d864b007517690074e6c07b8cf1da174e2d15fe638470e4c3d7486e6229d9cf57089bad78558612d4dd0d04c0701da389bd8204f1525ab377d5416b0153c07237f54376d35ad4afcf6f079c9bf9df8606b6c2dfa775e2cb55ec807303bd5ae3f5a368c1ea86ad311e697d199c8e4dee3e2969ab6c726a2791a517d6f705e96531e0cf06366b22013117917ec154ffc93596f56a9dc366f467f52ef12c15de01d744b42d1fbc0958c85d07003f2f3414fca21edb4a428619df21034d8babcfce9d4cdc48c55768430053e039f6f757911b6370971a673e435cd36cf1612bc7711f6b0246bdbdd3a179d6eb61b2057db48e96539ba542d4acdb1498e71e9ba15c6ecd960a4f33fc9247b9c20ec5cb01bc1029ade985cb196e44b7a5b787f94e4a3f88307ea98829bf7d36 +result: pass +shared_secret: 31828b1321febce31e35e6843462b302d13162eed40f0f495fef0654e67faabb + +# Official test vector 9, seed: "b4663a7a9883386a2ae4cbd93787e247bf26087e3826d1b8dbeb679e49c0bb286e114f0e9f42f61f63dec42b4f974846" +private_key: 7592584ba97569a4cc9c918d9deb2312e81719fb4286d67866e9a14fa947f220692ce29d0f68a97f851e5c938db1587180ecae36fcbdb8eb19d96302bf38a02e0128fa562ba7a9260c873460814ff3021d511482f4f731f9a152ca42c920285003025c5aa0c77698bb5b778c1f864d696c0dd4d634421224c7d14287d625b422062310af94c005636c8f15a486e3ea3151b5230e337aaa59235bf7968d9c7b067b8d1bd6247316047d0568aef514f725befea696ef124f10f822d45773e780226730b8aa043f80229ae2200739392a3b42c0f3833da3b18b38c243f0a72760a917581bc6d2784cd4b796e6812fbde666fbda9ce9522a32242a644032f144c4904031100c12ae7a3aa52aa3eee02f27909736a8bf9f8992079c76157001c64b08428a5acd67762d01c4009d4ee71c3c9047751d89b0f6020ffe848bf3013a5e4c5c3db6457c55bfc8d62f6db63fd4ab1b51a06b43f8b7eea0ab5987bda78278d711ad53a6b5fe58ba81c5931c9b1edc74643115bba84ca0621a9c3e49325f8b583715142732c4e0ea713f36c6fbc3c90a467757c798ede3368015b95a62adb0a62a12452abdda5e0b9a882eabc2f1150157e8aa950010efe51f29b3c88f132a02e311fd75497bd21828f428cfb12bc361250b3a765e022d70bc3544b55df119adbb5c63399172ccc7bb6f392f04cc02f96aab64e0b46744abfe9acc869487f929317ae1c103508556f688be7c3407202a79e54f68683cd066c537366bfb918b3916a8b030b0cc1301e1e4b7098a47cbb46d417caa00418e9020629db0bc597b2a9008cfde2bbcc777ac7bd55f2215502fcb3f803075037a56e70c8b4f3b44b9269824610bccd15ca8a3c52357bd582c52ea217b22627ed9eca00e390e7e890e626b75af7bb9f5d8a05c293642c51b0d399d9d5250b19724d22b3f1010389bc38752a032622bc44fc4ba074b0b1ee753f6305931fc3cb7b0c88fbba271f0722e73c83e8c49a120cd3130471a78c10df4cf52952829e596bd651ab39c430c4c4904b55ebfb06f74640dffa40d76c15e3779bb752ccb3d86ad225b8333208ec12c50b7e923a9f67b3e77aa55a8486cba6efab46ce56a7adb92739b264617ccbdf5f41d5797873a42b36f26a6fad310df949f9c670014403136522fd5530e03263401f3138847c363e400477baff7c38ba4631a19517bdb61b8cd3868a7c6bde90a97d5722b9c5b17bf05c60822a705179d018a324e0ca09b54998ca8ac188b0037e4b563b479c4795562591cd3e06f64bb83057631b243cd981819a3655f68b506fd0cb52237c9b9166d07f46a44c22c037b7b07250cb5088a96473c9d225b79aa8c09245d8b9a71496ac9ce658d0cc329a1bb3fbd03c433e413f355515b2373d8158a40562501fc46c0e7a4e903293442a2d8bc0fb26a1475d2ad52cc1b99229c4de5a78b7b07d84475b5e8651590916a4978dcf72148838140896e210a3c328486a315a9e15592b9945730cccd1fd75ed55a74f4897e63b3a1d8b96d5021cbd0b8141176af3aa4a69ae6c634419246ba662f5739e46991b09c631db407e1a94eeaf717f92a977a448e67891be2006da0371aa0b0c581db7a605080533b2427194df500c4d4d17a24a6a98f96714556cba48327ba2abeca7c06ffd382133621cbe68d9c11b07ff458e584848473431b488ed6730aeb26093288058b653cfe453ee00c3d97d35e5061660f246ff10c75f6ba6b404a48d537a846c06d02b7242462b0c0a80cbfe9022d97852c290887d0766ff81cb9a08f0f06bf00d6996c962ebf4139739709bbcabe7e770f01fc720bf015e81517d1a7ac1fa69236d452f783c0dcb65cfde091c0b8abbdb8b83fd2134e7434452c21bfbc0d5fb81f631c2afb1c0f65ea0172999c6888b2c39a8269fc383c06105a34194d8bb64d31bd56e86e5c3758293b7844fc5412a7b7d9cb9a614420be1c079ae9830a494f356b99e9981e55b5cdf2fb227f2a8eabb86531a00e42f07c0e1a0b198bb198ca8252763b62872ac7c742ba04084df82f542b067c23b72fcb51dfc9a4fa2958ce0c2ea4265c1654bb2090ba81273e83faab505871ddfa6c76062b3308ae5d8143e258793130431a16ce5e7b62ba9b90dc776e778280d0f2b8cdf7bc8750a96b219eda180621707f1e778910b9afed44842d78417cd027f819699af6b0ab475a18b7359817b50c306bba0728c5a9088e667dcb7944af6c10ba86300308165c1242cbe8708c8347c44ab77478304efc0a9e5328f203b90108418fd1b5b7c3b085e74cf500729e27719c2596feaa689a54ccb3a5a4a74acf36c652fb97ad49190cc6f08382017db7a910f816701957cdd8449ca075b9a3c18bd88469e3f51e0c967146413bdaa15c38284a726a8935b3987e774a182023cc0acc18a80b8b6909b52b8726881380b204cf1c069415a99556476b0218ebb4217ff33a0593be5f3cc47ef89c13397d68933721c5a6f1241b88f452654c249d35c1a8b16305469586435c1a6156f8520ad33938c8dba429c118154020205b0235262f233c36a89b384d82bbc49b6d6074517a631c5ed285f56585b286462872503da5c3df9c91340071eec625f8b29e4c416e93b46d37f95822ec35c2897417d7181dc9a7097aa74f3a02bf1420b1a568e1d7b1a743c0d07623e2296071912f7db25d67d751fb3b9ffa671403f29d162b635f0c7ae693578d2a752984914eb9036bca365a76861a05075b4b2a95077b6600a42e071d60e21618a689e3f7b5c9836b7451997ef80917f6351f814e2ef1786736a703012d3c9ab9db50b5b9f08bce69ba50a2c48f059dde2181f725cf39f426b39028402acac36bc0797c918d30a4a6d4bdea2927cd75364d167f34db97260039bfccb64b0003ab3532f77353fb6a0433a5a95570c2ccbc77f0e4bec1584cb1a88735f27acf58120d01265cd7236f18af3c00b4363cc372fab07ef3a87030b19b07af020320f1f747e32a8bd1f32e78f1a62960a43327307d8c212d1044689805be15c1c68682d0a8a24ea51267058dc4b15f36e12104ea83e425c248209a8d193911e2a2dfe3a47f485abb226f02919f9bba4014262ffe6b4607bbb511fb5fcc205134f8aae2310245b9c9e73957a2b5b4cfe0916dc1bf6ff891c645b28e63bab6c23e5077a8c3954fb5978ad8e07dac5c5c1fc4759912524566785df222d04435a6a24361178d917b53af57438b46aeeac546bb5207c186bd196bbb6277216d95ab6e545d78e04b82669d19093241b808aedc5db79a9e54762074a0aed86931497917969ca7f20942eee719287c887b3508f23b919418278be0236043acb3e4abac940c44c3aec3ab8c78bcabd84c1d373899369b515c2478c6085ced3b08f668224f950d3b82355468bff0534cc7660045e96ca40067de520091437309f7030f71a250c359f0c71c2f8819b62cb39646b19d63669f679ff9f48ac7a426e3fc1a1d358b675105f28586726304adb8109e104715b6c330f053961207eb96148a866c12c9349fb6aafd1b42f5f80a2d827094c3b4def6478212332d96359fb3450cfa6bee8327ea707b8cc61799105358521c6199607d9b769b38ad15e4b638d12d16aa90aa49cd90b9047696acf9c14cbee59f82b46de5bc644402400baa2e839ac801c70a368a3611cb11a1484dadf30185112f52421196d1797a3085f5d429d286343953ba8de676c381aebf394d0453bf1610905f3b6afdd5299a750f2333b3944067d9a9cc201922f9b5162cc41cbd35400a275717228050a97d05d0c1b303bad3405f36a1218c5c089c98467aa37905b334edb31f667a88c2129c1749784f49b83a329275e1b5fff4798d4b1c5779a5d433ce716bce5763572a29cbddf5b40b464f3e163cd5b554c5612c20726f57244735e2616f45356237263d69a1e1e03cc4d9ad57c83b3075cfaee45418282261d8bb531b685c766989c28ae9f991415907858308a1fa027156b6d3c8c0cf926553b570fd077b6fc419d8f4556655ce53f6802d406781b06463042304477bc8ea19757bb54f2cb54b9276fdd575d5a00c267b1222d4c25de11860dc14a1f3453423caef02bfe8720472c194dd234038f8aa0d3118286b530247b88a83318fda0a9c226cbcf22510f681db3880c2208b70f67c124437dd32ab9120894aa287c7040e06f6cdd0121ede209068238b57716db488335564c316111cdd90741a197646874922ec355a26a7e5ba4af5873f974b2626b40afbbb5c59501fceca0c9fc76fe9b8786ad1c5c76b071b6c054aac0eb8e0535bf8a4249a9256e4c1e8ec673fb5bcae20063a90b601e047e9bac3ba827acfba4a7e9b040776bd6f351e548ee005d759da86c9b2971f9d6d1cab8d517dd00566aba5f53253d778ce06e380b14c9019095028f3944a31a1aa4816d556047447b810cc094d400ab204cf9ae71e3afa68b88586ecb6498c68ac0e51b9 +ciphertext: 5aa2a84d580e3c22578c26b98e9ecfe5088d3af1fc9e3a81d24e25a30df69803be604b3fdfbd4709b7924d39ec03bc1384b0c5b9e601088f96d9ec6a34411126dcf855dd55a800052705656471c5f7e9247abaace66cc8746f5379cb31346a5e0007c52b186b50ee3eec28f8b39ade1a9d0c215d30cd4814bf79a0efc5e18c8de7d4116988f060cf5ae420706f19a88345bdefaa8a59066bcd0ae9586cc338140b77f3f33a2c074c59225f1e649aaf8ad20c39a1bcada26a6c3e4b2cce106dc82c14bc17fdd34f19e757b8436124e2382ae28f34be75d8dc98fea5b636957f7c9bea48237cfada97819af6c1a34dc91b14ab7d694e4f4a5c1e34ec42140f18327756f36594fe64f012b249f4c82291b8fe5bd3e1ed410d80deceabe5ba8a09fe819d8e6a3c191e2390fa0f3c7ce59197e7c070f308cde90cab5498c6dcd6916b44950a404c4405aa24f67859556e35966c7b80c61a794be0199a841adc8a2911d947669c44a38377bf884b2eb0215cb465781c3b81d35ffb677240c86ebb201309771835c422692a82b1e3bfeb4f7cbb64f99a2db5c8bee93759799409c422ae930937a387886612448df9b1b01aec237dbd0f9c4738bc421694c873914568733744cca7e892258168c2ebeb6b307ff5e35546f16dec0c99815210da6dfed3ede3323c9fe2c693dd31e3ebd003197cd497d7af3eef133d611355509af3b9a02aaeea73350472e06de207b12cba089f201866f2d57d27b056d5bbc2e4698412544f88b2a56af7f802b2d5982e4b31997492f8dd419b4ef3e8ba76b52e43e04f0d5bfe24c8854f335a47843d27b42cf7c1f462cc2e5f938d0b20a29942f2d83c232807e021223d8be33f00f1373ac1891f1612d45e26920486b4abcac66f4588accd7e178d2baedd8539b4d35232b0d121939bb664cf9ab70f5a87d4b4cc2d3daa4a37d064e4494174975bb92dfa3f965afbb76535df9cb5c0de541672821423780d102e9152900306752c2bdee5a32dcb375df2ee84cbe6a410a5249c292f5aba70598e4934be4295b9997251c28440f3f647946fbbd4dace8b2be424ad81114236f2fedc062d5abf4f2beb2b731647af6cf8b07646805c69e624906567da4c75968fdce86c9966090f2b117c153e3a5cfbc4c3d52a611a5936297a60171151ef3a97b153484ea0ab1efe8a4efe60ed47e0054978e152bd9c026372515a4188d02bc1b93ffa5a6b145539b6318d75a15a5521ae042c8756cd67c5fd611f8d9c44045b7efd5e6348fcf7a6b56adaec686eb5692549a33466080e5886c83c8453c9e4e44fbf0b293b45da5a3064f7abd6986bdf3bfb9000e8d24574f5f81991ece501d4f725218d6a2ea009f525c3619c8685c2c2b34fb2ce1b93764e07dcc1d3cce5d535533fd7dd28ed24ee4dea9f95fb2c0edfc347ec9cd9b49706f70f2884df179759d200487c1e6000a91cc9229c6439c32901be5d357382c9e37b7c6154dc06127d3ae93dcb4ed8fdb44dd109d1256123ad3b3030ddd37b7dec4a715f0bba2514ffc88876e9dd9d66974ba8b5637bd7b829ecfd423e0137685d3d72f534721082b65e644665f580d23599cbac81a283885e41a6e85116fad15e53dd301e38317e74b468fb3f1eb6d54184c5dfd1d8b9f82b36ccecfe689c39ff8dd6dc1d6138aff0057fc9246608440ee5fc70c095b837edc79e31fcf61ae2b07714fb3ef5b2d2a5c1b9ce794b207879f0c5395a6e880ac7e566fa9d695a5180d406f1b1ff96be6b4091d5cd378c6ed4efb3b23a84fc78f5a5566a170244fdaa6bd324fe6d567ee403fe93fe2e4e00cdf0eac1b16cc4ca2df1672f7907c6b240f8d9de657e8a2aaca0c5a9ca982ca0f9e97c92fc273545ace9875ddd46fea0997ad92998653cde6ee29d042422fc33a6107d47470ffc662b2d2dd149778f2170fb509a2bfea4d7dbc4c22635c16c70dba6c180e35a911b67c3f139b4359382690443c06f5dd7b75b78bc82c1e06de357c8f63bdc75bb10cee006b6e41dbfc24afb6d6d73a55e411d2ba2f4a45e635ba341605643554c7cc53510e8aa8520351a374e27265f2d62e0381ebc130561ad53c7e0a6d5e82d37b719162d5ac8580aca912ab9e48243572b52e6283d23f71c827c46b56fd0be4b27d7d1005420e83b65cacdc52f3bf3ec432c51c37af64fb8aa78c35c8728e7e6a7a68ad1060cd8a6fc22e5684b8f +result: pass +shared_secret: 3c2d5cd46985e0e37e487c51af3850c5516673fa376d128fb32e63ae84d5de70 + +# Official test vector 10, seed: "980d0ba7c8f8b23d0e948a6029ff2659810ea1360064663a8994d0333c8543ee5ff5d6d5c9acf446e61dc464f792b9d3" +private_key: 25c969038aaa118900417b46198c2c1d718005994dfa10ce5eb8b998a524dbb1a4f3e0716d314458ec6de9972dc3d988a064cb0b11cb82450f1055c9f333b2c82541f99167786b126c8427c515a8f9f506f878427e1a5e239547f1d6bd97674379b06813624a220a22f5c51e0dc0582ae30caae6cc39cc1350412c7de154c3484602496bf84cb3df4c031192bad2390f9f60c7e84855ca118b00bca814510c6a019d25e8687489cfc7c0240c822de267359b877adddba93ee7b99b8831efcbc6c915639b7547204190f4d500701b239a161cc4858411542fe113372cc3b0e3b4417ee5117df681ccac2efa3988921a151c8418e52cb49215b1e7c270812b876d37b092b882ef98a8075226ad76ab0bb9170f61c73d1caddc201ed8a38b9e237a6c345fffbacd6f86c47bfa56bb04b05185607fea02a16a132730710c85a424a08ccac9c8dcb662fe0650fdfb1ae1ba973e95079fb9717de44348cb0930d1c8ef1202b4c7849c244436d7b477c2211758801c316ac9b5be8a082661ea78e2b14e87da8c78e81ef2285f00d116755c5cff986b56b29032b390bb8453e8d970c7f90237757ec291ca8f71c9b691cda16749a63246ee865ac503a5573962be14a61c31a6bd3995e51684c1e59d2e803b5061b2ce633e7b692b5503818e349a61155b8820b790a692896317fb56366b63cfd7a4305f1082bde4cac8904d22f782fcd7c89f32cd98125f7ed96b0ef932cd077131424437744a5cb74f2dac52932c6c25ec282caa4e65fc9b38a43e21d3b95cc5bd67801a22d95280457b5a182f6d9c8fdd197cd12231f7889af318aa0dba8e3ec6056fd6687a476a971abe6cb439c055b21c6933c5f58c9409cfdf29ba810b87cb971f1e314256dcaa7ad63a41a11b4c1c127a8065c24979b89c96d3a2a944d16d20e39c27cc2969bb132a688a0a419c726338f93593005453001b753afca27c84c25661a63628365ce3074c90448c92b20e1299b2a10403fc9fc8dac9bd479802f8c3add3929b60b409f73e53fbaa328756a7b3ca8ab8a3341863ca5c625697b4e1760e63217275ea216a61951f88b9ce64839c461de048b3aa4692e6095496482130ea3be3569cbdac7c6684c4c561043b4167795138c662b44eaa97a279a7ea1a9e94d83d008ba136c484fa27c05db44066fcaa02f71a663512a71c7ae01742082c5fbc879a046373759965b0e565930506a8f6cd1035aed5e4a12b09a7abd74d4135653c509444775190b3c822c567381a266d1a7d6e19a60a536f60a946a455c71ba2385fb099addbada7691de2c54d5ea88020db4424605c69ba6ac2bb4181b363c688c24611737cebb00f536a83c3b30f0a9d46946ff4814aa8559368d393d94264da25b805b417158b6d0103ca9d1c5b62b1b5cfe969677a70ec1385c17a59a065809e52b99fb647e63b1f1db0800dcb9952710a94361d60fb0f932b30ed8b6715d913d8ac16a095809dbab0b0f64b6f5a7ac4aabb38414401c58b935586f000354be345f9c45cb0908df8e33063cc0997d122ec830e4c871166ea0499d6710e919faa269b064374d463bcfd96b427b47755d689fb3320b3e4759ac13f738a72516638d8194c31802abbfb68f4a6b107e05d81ba4d5d70ce6e140771f08ff7e966364703fe8a2f2ea8cbcc960ef834a711cc7c3baa7485059d7315ae0b395baa55652cf54fc817bb23819117b933b82bafb146248310b494c506ad0ab37025965f550a2d821787671cda3c9874e6781ad85934da3393b566d58742bd8cc44043ca7a4268b757ba3e1b4975f112617707c7f603cc3569b82b100fd79a391673ded0a14cb11af1556fc26a4a11291f4ef1816c52c292475807f58a2d461ca15b13adc4a7e1a75e1b4bac02f11c3af98f57b5516da77b49455ccfca47bfa0c70e0935f53b14c3431724a35a8fd663fd2ca7107c8e4f0a14d30b98b5f03e1cb568331c0f14e7756aa4901313842447ad98874165f8372334869e89c82eb36429c13f442a3f6f92a9a3f75b931b97b5d4080442371babb4509c5e1b997266805b777c1253fba72a839f9d62002bc2075788cec91269f0f1408e71031122b107e11486d096b1faab348c5aa46cc63eb38c4935915e037f4238b9be3b59975c6a67fc807a732b0ac43671825cd0f74d1cb3c6a7f721c4039b10482990923aba0427e2da5bdd30bd55133989a5b43bc371d2105415e76ba18786237c7151548b26005961fb2a9e737e39bbaf97f612cacc3ebbd216f9f57873f97c503a95a49a1a113b0c454526a082203b1a27e2fb170ff1b59b0657861567d5565555f11ea31523c42898d6ea1ae260cd98b9cd69f9ae4d19a81365154d24c008bc15d1482665c313c3721cb701c3a407373e1bca5829cf45d484721357d5f83b5cb58b21987d9fb7b77224c03c017e183b31fb4c407ac23312aba708e8bf7f905d68b4895a48cd7a70af6ab9060d959f56a02d7e3672a90a6218fbbc6fb641163674bd736af2764c72c5bc85651be47350507ab81749bb2b6c744520b5b0a3b6633355c0991ce4e1a813615f2e8300366521040049b1054a7741b29af1c300e2c86977af90e820dcfcb8cd967c27102d49fb1683c63553289cc0c62de0e26f7555392187009e0cc5896acd8c3c9a4a7c637a107da325cb7a694e9a1107e889cdc6310671bb6c5b51a35a0169ff7b5158bc6469a71a3e8740e9281f5869180c91cec8e1169e2b377c8174669ca67418116c3cbd2ab61d8a874f9bb767de8973d8425cd118bc9a320453db9c64183248b22af3f489ae69159a056ad113833c2a9fbc56b10d013e911210bdb8cba68a0ff0f0729757bdcdf68b3fc7be480481ff64c4c09825ee52b274e85e544091c3d36f40444d28878d7c19122957348e3c27fbe74685fc1a3c21126064242616bc4aaa5284f5588435140956cf37bc72daf5a73ff6ce452ca689066fd6e118bcd4988660c7c8501c34dcbf1965c66fd95fdac910b9e48093fcb200564b4cfb36c72c3096c5579f736059534d57b7168813439b722d5230b255532d838598d615c1b641a9d5807f33653a1be96835f474d4f1955e3c5bb5c621497c3451003ca76275af98b25a962765e5bf2fe754330a77837288810aa53be9a2564451319405cc38b13401a7f7dc960b5b2096f45a94098a2fb39dcd654f846388cfb4b57b4b92abb321a16a83b3e6953a0724afb47902e581acdc278957100548c735fa5c04a4147e826a77030284615b82fa60bd3619b57bbca10872afea091fc6288ee434d8319f028125a0b5006cacaca8ca6eb95c7ad87c7e499a4ad81bbf79d144ab16ac9cb49743258cf0c83f2b006b1d0585efa0ac7dc722ed6c12170831f0964cae2b6d2f808afdc6223d11b510b949e76a0a4c262748148ce17b38c55cc7eac2bfdf468105bb89298c88c8806b124c7488d606b52b217c81a17ee5ae67cc27f6a3382d50705a9bbb1d3c59f68b8ba9a45ed1c97ea1eaab76903d1f2a1c71a07420f47695d1b68d06c5dc85114ae83204fb4bf16c09385934105c9e2fd803d83542f4aacc3af6b949a63e6d0b0c46ca8a6b4633926c0665bc09b69ca250945c14366d49705658f6cd76964e107497bb42290f4c1471a4ac29a60c3dfcb701770619cb45b0613068091a68b58c7b2a19ca9933cceb112e234014816b7db43beef660100a19377a4200a0806be78d30169c4b747e8208780a14aa53987065936ac4f06b7a710870fca3b1bacb04c2af5e3005a9208b3a03929b864d0e1011cec63b93220e96b480128c20b7675c9a87c1c8e2bab4a7422fe9c16d367928117765458a3803af02332d1bf654e782816b15a5bcc3bcf0213dcbe07c59a92d1b1baf1f217061e197c71223c12746cfc0b0aeb99fea7b29bb3a1300bc266f1692fd8641d6fc594b9894dfcb0c951b8351236087241f7cc3506ca74ccfb4c930fca1be940af6606ffc76bb92b53768294c30370b29b795de63caef451a18317384299168b77793e22fe0fc03e4c064cbb6979b38871eb11c5650587dbb31eec0cf7ce128f535b0545ba98af5ab4bc186ea1081ae15bedef5945410c800553d8a2211e8e16125d4a7cf25a91f13858e1cccb8e56481a5a3bbc3468bb624f282069425c8b5462725a813bbe53c1cb11bbfa242c2a1619763448af184958cc333c3aefd35c4a4861c5cfb2ee1b0c39b0c73314aa3d191b6406caa94d8280d8b01e1b73e56f5bdbba80fb3923a4b608543ac827395cad1b050530b5e908231c324132d782994753284927f3a379f71603036a172ef58018cfbb879f29a42a106bb32a384db6e033401fa46045b035ed2b3f277ee6bc7b69ea2a0946112498da4ee64a2be6ab49596c4e61553e1164dd2d4c9cfe0e22188f2bb5e538a054c904cdd0d6dd921af93591f4a37e9ea2b5c8d6c42e7270ee2b77b6045385f3d175984a0e260363166c73b0c70c971644363 +ciphertext: 72e827fd0a9213b7233fb4f586a9e7658e4d9af82f46552bbf29cbc288757c90fd64f98f0a9ded011ab822f9f9555cff8eef77867af89244230e81ea24a9a8bf3fe80459b1462c163b50708c7ad66bd1a2d0b543e0a1d731aac2cbae9094daf15d472a3e4e4e215c8ab38ebca960e4473214f7db59eb183ab71c72beda92eff09d995b4d6a94da0db0cb91658e0747c09d74561a1d5d1a7f983cb0a3672c1c342fb5bc8455261646195143f41e54e83a9efed0b3ddd7173640b2a8fd9b4adef0848d94129f45b09bbc88fe7267e4855b1058e6df5a73901d44f1099d48b560bb3fc5dfadf9124973ea5762183b952766a11fe1909342ccedb0b14d56571435e38a43995e19bc5d3771b0e28d87aa882d052155dc332acf2dbdc2fe6c4b21b719735fe77998c837e9b871d15f6863ba17d28e371e31ee2a066bf9d3f9dc25969c78936afb7533d8b611cccfe77203895340020822a82f732aaeab1263163d68680f8a229ae1e80bb4422dac4c4c4faaba84c054bad0d9e1aa0992c2013b1cdb7005939bad0e44241216d6580479f6ac6066cbda1a580caad53434c6f2a537121a549401cb990d4765812ac1eb27cbf666f5d2d96f3cd804b43052c1cf53d2b11a2b924ca1971bc5e30f2e9a8fb05e28e474fd34563836ec9b19ea492bac7422392336c2354a703ae054995ec347e563fe2c5ee48d0c2bd9968556dc41e5d3c939694675ae23112f64cc7ff1df4696a73ebe472fd76198998626409e8f8d6c6fdeb9bf589cc60e15253cb985be0ac507ac8076f606c11478e78a481fb749adb2420ee0f6546b518652b905f328c712305e80d8669c5dcdd863db97ddad05b86ad9d5dfc52b8a41cd2946df58b7d5032eea4efb6e8ca780b02ac58261bd3aaf04a88f482e242d698cc8c55d87a2e178c741f8b9a03f453d844d71011f5c7677541fc25d58a138348df949e4cad85367f817255281b49116c5d101dac5fb26e1896d97f67cb712dbcb5a573b146904af4e9b2a7a02018c6ad812d1b8b1bcc8a062c5a3fbb9cb9ede7db4bb39e31a8296d2b4d9c34ce6b06a88425c75a3b53f7398edef454b9b2bc24fc8c8dbbcc4ddfe2b0e52b7b9f6f695d5cf8e7706f0a67d0132a4234334376996e71c5a9bc41e6ed16d712a1fa83031d774ddd45d9701584dff472e31f2bbb5c09bbfadbeac285b313a8b32e5e78d10ec59658210bb346f0f7c50c233c7c1d018ac200ee64cd512f849aa8cdaf3a1d8cd23fcf974ebd05a5a29acc5b4bbb594fc967dd500a08020c10f4d1a613d55463d76ba4fd6e0230565ac45a5fe9b1c4477cd40db46b71c111b1f66bd072a28d8d1a43614e785e838d3217f52233883c73a1a7c4878290bcc97e47b4694df427f2ba787eae7c495b2455504f4168fc70189bc77f01bea35f4781d45c170bd7747d7d85438442ec70bc40549f30b1ced6e00d9f3bd1473f0df98527873e775df348061c9f4b16450a518e6ebcf6aa81086d1b9e9b355d405f431dfc585b1a82fd7436fc32f9f90171b0ee2db4431ad5090d61b8dc41f4c1f806f56119fa6bf4779c1dfb1dd9ff535ac662c7121fa5fd36c2f85895dfb4f63f32172c8fba3dea868b02cf2c23ed351a71c5cbfabbc4bb9504533a67d6c7af1ddc267ed430421dd15ef27ad4c30f4a384b6b72c4c4e3ebf5e254f67e61f84c0f7ed2061c92a504fd662a1e4a191afb56957c8e11ce0292f2eb49f71e106ff5e202add3025c0b15c9cf946bfa12d17761398223039e2c19d270c101a2303a276d7d7c81332a285ea94a28c4325fe4f323cc6ae72c306ed5c04c7592733522f1b16ab3e5ccf7e50c6ea926fc9601c3f27b66363bcaead3d9e2b66a436d2b77f982f7ea36d124c3ae3483a09d3be896f183ea041eecd11c8245151a17ef5daeb94e4c90a341b86cadd49b58357115d1a305d8e7950e1a7d6c604070b2384cfa7d05ff8a578d694041d7abe179b456de185c12e0bd4354e419231e5abb7542f814fa307e4d82e8194dcdada546d09173bede3da358d5c7c2c972e5bcd1487961d4023534b16b71ed1efc8c231df1c218c42dab650d4c6eebb5e0eee547b897b757a79530ca47054b9e42d1b6fb68c2fdca74099e218863818d11cba4fa40f32d3420a24643d32e387ae9e0c21119387817feab0ecf26bf68b32e3b2b34cbe08ef0c12a830ee0b9753ecf3da7a0995094ede649094 +result: pass +shared_secret: 8916871d69a1d3eff8176775f01e75198ca74da4ef8d8f410706cadf9bfcbb91 + +# Official test vector 11, seed: "6c029462ca42ed520f10a579f52687101105e0b90c6e7bfa582a4c112b579d5ad0a0abd38f72abcfdcaaf5893a112bdc" +private_key: fc569914244bca63c05d25beb59702977903c59c046079c9410c873936b86945ae56f3c1f049a3ba4185ad5c49bcbbbe7fc89e561b2a940aaf66538ebf594eb0e5bd163824f8022f6b5183c0839b59361b96008f3ba83d1cc37ca7581121a0b552908e28245218730b3817a27e4099313484b6fa99a539295713abe453afbf8788fe6ab530e1cf3f430f4a855abf3bc11da69e10cb2d879075fa6198b1601dc8903c32a845d4da3b726b6828ac84e3469dc9e66701c16b64957d36128856b82e1367ac00c274d9a366b6b38fa87364880299e86561bdb46269a951c273710616109aecca78e5710c406b27ea403c05704c77b27da95c45da86d2c586f72a0ba1bc5493a389961b789cf5b35ef88dfc38cf6443b7c3190069a19be5a7b11a7339f6cb445f88c90d1b350d5c3089ba13c4c70ed5514dea34b61d7ba5abf4c78024abd21a9a84f4cd73f86b43f3744ffb572d918338688168cbac7f979bbdb2c52910402f94c3fcaa29f4362147205dc5b5af7d4cb920f21851392ed6a40e10f1013b380ee87a4fe70b864ae285bb5b1d01a448aed532da26948f639258a4af94b3270a984063c927929867e1fc9415815fc51c5158cb4ae9d8c81cdb30a98a82e6367e6340c6f5704a37e06523e736bba1c4d98c524bf136a3a48b5786a9ec624df5a992bc89c389861b03aba410531340baae94c5a91410370f92573c3b28f2e2a47a2695a9626cf311b834597c0a09ab0ee2a588e26962189b7b50a99d5b7906c274a8130f3a30b56cdc85c1a8ab9853476a22a8c047b4f825032a742d601ca1bf319b8a1825be3c38e93a686a50694e15164d9c603f537772f88abc1258749a1adde38b55e0485f34bd20129a1f6180eb2382bf2b96120cb798fcbd98401a62a872b4b175f80ca9aa0b496ec12fcf713184400d43212db7a55a522a1d718c43d61823f4e342e9396e6c2451c056ce3ccc93c7d9a45ff41461262e49c01def44a350e5cb7e40bfc2845989bcb8cd59600f1120647b45a585318b0bab8a202afb7348028b3fba36a41aa7528dc9973feca1c28a722525c29687398f607e02c9be2b2491a0458e1aa6c10882bb4c0bb50985cbdba386d0b53cefcc6f316965e1f289148c64be223853791a254b38a98160f0bc3aa63cb6d45263cd61048a831a5440413ac3c6f38670a83190d2bb32ac5a35908c41618ca017893b3eb2628265b857d5130c821af61c895c274faa2150034c0e80e2318917bf9aa15cf2665c1b3ab8b62a39282c738ffbbf7760845637861f46c3e5137f050a907e98bcf755a3bc0ca201522acc9bc780d10d4c41c69eb400f9234c8c7907bce0cb52b783c0fa82410a5b0f325753d985622bbab7639b649c5b36696e2bd8b5c969165f66ba02b142e4380e77ac07d2a85c599b9449e48f4a6aa0fa30160c18180ca2056fd52a94fc2f2d26c0f5641c81cb854197af4eaa389aca0e5dc9bdbd4885da4b9ae207983cf37bf8955ccfbb37e57b30e74bb6f798b4ba62273059b589e51f78b79fe927818eb12f0e73636321b51e456dc5f90281153c7687cc313723b1034de828620d17aecee6482242afe899c45735209606b82a1c284fd7a0dd819f72ac71d30bac8b54715e422e7c4511a073039587ca15251d8bd926ceb2b0864c159d348889bbadeff732d0303951d1b491b98b43214d26bc7a3b121dce077739109b5c00441917cbf3169577d63bc7ca18e4478f4fa8bf23164c8ec68e86acc8d0e1ad1034a99eea986699cdb6176c84294f711067ec7748ba83cc6dc51fb3e9576d7150977c76096a233b2233c68995333b82baeb80c3f2480fbc93b414cd3df6165e4969aeab0b052492faa0a613818b6f60086cfa21a1ea774afbab6857033c65bc38395b47f3514c624d27e3120a969d01b1a49af814c7192ad1f97c2b398301ebba4e76be866c8dd17a46c7db9d5149329ca53460d135e323c6488134e9e3ceda48562aa78cefd098ff75a93f3413384904cdc10278c798a77aa93f033eb4fa32f7698318d23c79b4af83639bffdc56af742144e7b36c217f13244b152b88fa3192781594759b1e0d158cda2a12c1fc85d093390f42413e00a4337c32092618908a24379444fbb5c7f702b2fea3098aa125a89b82336a3789a3bef7c403a5a2c56bdc0a78d90b2d2b06c3c74e60306d7e0514fbe0111a930a10627e5b2b11077ac78bc32c46d1406ee73acc41b518b2c1a8cbc93990b9c1d0964b1091b0871dfe594aeb6719400c71e96893a7524d082bb5b7b3711f586f9ecc4b65f66fdb2801495086969a6a49961d563391a24b1029a7a3c9e2399f605a37a4a05237570160976b658da00b57ced318b4c7025ceb071c269ec9db9d6a2944c973cc9b427d5573c2eb37c64e4624216c290c5645b36cbb3e82713de383daa5cb4029c6dfb14c43f4aeaa9c93843b784fdb63957b75f39088820694bd0706ca856864fa031b682031581673608dc9ea058dea014ab79eaef74928d4cb33308fcad06ed303a1ab8b6cbbdac332a24ce5474013c90c5b1b869bc9881323435a097d09e5910e39cae5a1bc148ab7d8aa12c84634864930c24ac4f375731cfb65d5992916302640a524a4a52c9a2281534956f946473541852d0884e6461614f9a1dd95cc923c6298998b21c2415518443f86949e6c390f9463b69a63f2f9b328053c01872ea2ea8fc45185ca3bbe74b713528cb3525a60f7639f770824686c1b2ad719fbda1d4c44c9dcd0b24f5277fb6720e686270b5349fd3b1215008c6b24c26aa943ae71146f063072f0c42ea114d3986ed1030260e88f2f2c34e7385491565168e1c18ad324fb13482f5b83b2f6020a6895f9d24b93805fd5556b4a048c2e3106eb02a53a774b169106a77bc166137e7dcc4b60569e77dbc6d5f9c276a011ef59bccd08793b695eb3a5bd3c1b64ca3bbfecd1adb5f97294d8909b31772929c693ac396d412549b1cf910aa3c60ca0250928ea4350b8c91df7d31474ea07cff56dbe417b16603c6af97329d53163343e0af3a84ed37cb91a349bf2af7ee84d8ee504f2a73e9dc3301480bc6f144a631bc3c160348773cb0b6a3b57fa1286e2107e950ec6a682edcac892926966e28ab2a482bd5991f8c6c6f5e231b0826191a8c8d3c2701984980146bbd1b8a629b548ce578f5df90b58305026aca96ef20c77610a2da79018b0047f5351858c2c99a035f2f339885521d09611a219895e987471a2c10ee576e07320b7f9b5d678221aa995afe550c0f72f1b647f3ef429d3720802d7b53ceb917feca63860337ea126fe41777b85980744025ef9418bb4c1983c8af0109d2a0a0ff47c121de1926ffb5b3d8bcac797a0f5309c8629605a757a6ae91beaa437cfe184bfd3b703052ffe8cb2d7e57b411719625a9f1e11473aa8a4814788c0280fd179596db23d3003461314896d38a9e8fa75e93b65cc76cdccf24a72b1294acc47b3e7843b2a322e82c98f906ba369b7e8b588d2dc8056b70e8588c4eb80ce8300630d265a8f6a74306374da0622eb125f51764c81c55b9966c27b562c5e930a30207f825b27711c3124fbb98d4a8351980a04041e99f7af63ac015d667232162db0e793eebc70dea04eba186d2c14381ae886f7c6b934f587710aa095b206621cbe4ca1bbb8752b5489626ac72290315fe9a967ef6980f9486462b74e7938800b020519c5c0a684adc1b82f0ccaa3988cb5a28264ccfcba1e8119add64a58da88bed5cb01f5b0410a3ee03c9105029ea789bf65bc9ec58b4b2b0c9aa9c7859a48cbf0c12cf9e78049528118d366d0345951d0aa9102b5c12b36c6022fa4c7b4554178a8800c1a968ec74569af3815acdc39bfe029807a8ffe1267a69073744a806161bb5ab59d5340b8218054a252560c188314c177c5f3300e86863eb97253e6778415b77f140d498aa104eb291b21bdc2c5693a39254cb01c8a3a9e8e14a965d107a6b98eb09a26c2851059a290b6e94ec10138289148086456047750a3f8aadb5b1693c9642a8ba89b89c6f45c18ba750656c151cb563ba7260ca09c780077b956e5275cf998c86748d2d332a9008f8625bc61939b18f0c063f171175338464c0d402915c6e54682fb6876c7338f654d1916655fb19e21f18e2c0629e0962457cb62bdf3c93cfba8a551c752642016f72b5479615da16c1622b21a105da72413df20b125c48b0a76001472780be292a98500321c007b1a0273108be097ba0e5972a2394861c5c9f8e0093dac8aed47a6467570299a5501c6b2f281283d0013260901a08531e737bb6baa0fc13895253ac4469519c483b591d28cb8a9a0ecd051937eb8d82bba18673a17339dee827be4156633d8a2c376d41fa4e7bd70d4e199ad2b1951f0dce0b0afd296d3f22bafe4f13638ee2540caf8a6bf7d0387265bf8812083bfa3b670e3eaf9b443702fb6db16ac1197656bbd61a8e25ed523b8d1e5 +ciphertext: a8ea9ae69b53329b2bebd1fb1e3a67c0b693a15630c57550e31e59fe4f9b617dac6d5e16607b7433499cff0808d4bbff91b2ca7ed0f05fd3223e9300e4f251ce24b9667afe7f88c7fb6f4d7d921943fdc93d98fff7c4c7ca1c5f68cb44365682363296da5985dd5270007625dddffa50feb140412a6bd3a777b3b9a6b6fbf43d8cc90f6a1d24896c387e0487f03ef8c45bab4aecc0c90456688799f7a5417bf523deb8af083a75429e08c242587d01e6ae78f7b165b2dbc9e67a8e1fc61f95d1fafedc77e7827eb6e718941fe091138f9c4afffd53dc7b632403f4197d53c8658b67c7905a76abe466357f2690ef633d4b20d0dd73e489b0d046d2a684e21f95fe1d19569b076a6ec0e0e2ba05e8a838815683d5cb3b84be0fe3e363a7a3761521c2e04bcddcdad2c956f66542c23d7446984f6c169ac4c7846a9d8afe236d0c8ee7dc2afea49837549f91803142f889b2ae4a629f2ee67c2fde6032866339dd512896e8ad025d7afe1c797630c2bb4d01e4f5004ce288d1d879689331686fe6934b43f34f40210006a4418a54c3e3cbdd96a09ec364cfdb76b72dc12ea17e7061a3a1c16f04dbfab2cc69ccb244fb46975218d8e15a5eea8e85249d901a2379054182e2af17970328cbb58c99049afac91606aa090bad9aef751b76ab1430be40f62ae0a81f6219d98fce9f71afaaf5f68389d07a2da75df31a2bf58cbb4feaca21a775ff92917f8b32b72d0b880a77f9bec1074b1d1cf9be04912a8813f5579c911d46d06c66ae1c943329b246a0cb80bbdabdb22063754840da03c3c3d4a072f805902054327963dac5d17074f60db1a37a3d7b7be87b953324e964041964576e95cd9d7adec5a5f9386538912e7140b758d54aca9b5b6adb631fadf6db3cdbcc6a2f3e475bf669e0888f5c37967feff2c73fd4498a95ffba69a84d1bd2ce7524e4e5f8330a4c6c6b0714fd7201ed6efdee9f08fa2304e9999ec2dbe6a4756c67514e3664fde289c1d73bdfc65d24e1d5c6c1703d5c466df114a3017ec38510f44ea50cc7e883ad24e340f3196263c19a4d9fced324d0d1a3abdd5f3553b6e3c14ed46faa97fc18d0db7edb064fafc4fe2a018e2d1943301b734ed76729043f4a54d1fe75f0d7d52419b597e3c6a33638e9ab1d3d5fc971501cecad64f86b3ebd05e372d1f56ff635839914f4d202094942ecfd5a26dd59135f574d6924a7a64c6079dda2e30d843db9ab000bc67fb2aad73d0a142da2f56cda206845cd433dc53ea67b9ce78bb9a860f34f72770afe8bdb6d0bab4d2509be1dc2c435cfe59aa425cf607b550ee8e2c6e6ff885c4a95f659ff7f1556f8a02613f6b12e0693f285954a84e13996342f99b4f2dac6852f7d9caebc9a409121a86905c4f540f5d88b44b065cabbec28f1a48ccf635d20f4d0c7e3264888049a7983411a1bdd2d393b7246d5ed0b74e2ea568de1674a3339e864d8a54a32f65f2d19993655e04496f566b5c8e6f793fcba6bc2a583ffd61e7d23c3c986d178b8af86b8e4714bcd405be30dbbafcf5aeb6d3abdc9d81b73c7c219e460a8ea5b253dbc0aa97e967f2febfca583c2ea23810ed31f6a1062741f02656ebb9af490b43c3c935e008236b9be6cf7cb545726a59dafbb769d31555bc1dd747e9800ae5190a48eba0cdfd175ca609be6cb89e6b91ba78c761a53ece35edd41b9f61e0c521b848aab26c557603c120abfbc01d1d252a6bd31fb75ec8d17fa0c15727ae7d160581b3689a365854ef10605425e18e28562aa104c7bd1e7ae2e1dfc902928261833cb6da12da185ecc05cdffd69d3419b27b329819e49e41e8e64b0f9c222ff04249f9044d16a3660e3cf13e1769f9d4f33f8c39f9c491e2085b608c3b430d4ca662175da3d9c5a6dec274ba37e0bf2b0d034ec067d614afe9e7cd34565dff83bb1463a8c0b08d4198bf7b5495ea294478ffe57c994e1c99607a3e9a00d9ea4ca568c81aba09fc418427fcf343ec9d3ce37fdc1108ff017ee0f4a32d31a824a97a96ba6dd5f3fea36984931a433d774950800e6a8dbfd65431c348f14c7762d68277f9eaeaaed15543fa041c3ab72903370e947daa93db55c9dfb71270c5be4f74446afda6c63ea115ef40c3ed2f62c38dc73165d156d26514bb11af35a659a007673fc6acad7043c967e3370d8c5c37f0183ec064dc08f6e2b687b736fbb703f810d0414aa9c +result: pass +shared_secret: 3ae3603ac2c25b00d16e4db451d8e13dc77a3c0fa4f775c74e028abafab70164 + +# Official test vector 12, seed: "db00120937570d62331f4c3f19a10465231eff46465cdee336a0d46aa1e7493df80f18617f9ffd0476cf7784a403ef4f" +private_key: 7445654a55ad6aba3d41506b872c53fbc83988eb1aa5d4ca645854ae700cdf3a1fbb448b51d83b20c3bf82ba45000357d3820a0ce20f011581d2a4c4f186522d568861554efafb1c843296c927a3c29a19bcf7037b497f6ed90706305bfb28b06818549e9b7700a387ce14420c74a5151555dda18b216b0846c5a90cbc29bd623bdc8c74f2dbafff76a1a53ca1b9137ffc687c5304a3faa42772c85719585c39fc923d7c253dfa471ed7260394134c058b8c768b04123f3c955bb8c94a26d4b6b44824cbcc79f305516672311da2b15be23a183c323f8841ec76882bd161844c2829da23482a3ad106225cd444f4463072f096740aa4a72c88dbb9b393289d91b85b20db1cc38096c0bc6dee84a16068a80d759d0d861a6eeb11d82a2b1b6909280c32ba42733d259ad3bbccd3e0bf13446b0ba77df35085f6494934555514353825c33a0ff41bd00545f607096b524519dc3ffd73a65dc1b9ba4ac7d32818ba2b21e1a300da3248b2fb913154be448c76195ba9cee404b0f8ce458540a678984d034e4067065116a4c8580da808b3e0f07d74a2a6a6b391eca57039bb3d5643a5545394057ac7222abbece46e06e4684830aaddd737baf64fabd956712b57add25a462441e362796d0796cb4c10706017c42c4070d8a51492b7c0db033e29761e593927111a9bac35e8e9a12a6423d8726237526d95e10cb0a3bf8b2302882c55eb92a69173b3a6353fc34711b51cba08c3642c449ac9bacd0b2906a2b5a8b53a1bc64b810023cf4fa7c73b3779ab468131569a60409831f32e2d87bcb455c15b705de96948cd9652f30619881879f3d043a341a3239680a6b12645b750e42cb736245fc83330ad7408e8b56bb535b865a9bd79549fbf8ac3468b9e90158b0a92c53a08b774b2caf4a124b8785f26589e65346b7f4469b807292108520a02c9e5da14c1fcc21fd526aeac3088d94666b54cb3bb00e3887f34b0670fba3d167b1b9088651a377aa8098c1f87888655b0bef1364e39973442c1b8fb4396e3079cd244c241149535aee7767ce60267a6bc733de942cbc81e0ab46f19370e5a82a09cd724043204cf6372ac5ba918fa2105c54640e3b9bfb0ca60600ec5091236a44d7fc5a183579febb401872066a95b22cacb9492f14955843a0460102319a1c49980405bc947283f95643d0b63b80d36b7ef29097bcb057926b2583745de85192a65070a0143be745e0651775b84480f7b0ee9727ea738b1c36b3890e19aa4431c46a7ab29f273660983e5eb05810327da1bc0ac5020ccd34bbb4765cd632e3f1b727483b76a0262c0617b3a06439171ace34b482674a967474c1bf77536bc6819bb77ad40b157267c6648c9c05259f06c20ad7b814048c926c52e2c14682b464a4c2740a37c3434b7055fb99efb813df8637bf8b4ab530731f77653ec2ac15a174769dbc5e435ae8b4668d009cffea1716f38037752a007c788ba80976a319b5455bbfc41119aa24e1e43a0ecf02c4fdbadfa60c187bca996f7b039692a6a03439221aa85c145c1110e22d46ae25ac7e1f99c68b7ae69fb22adac7446961e543532b5c10dfa74388a031c310275cb29b4a6f290b97c9fe8f7052ac51b759a75a9e552faf29f10114e43237f3e758506e53fa110488b11b3c1e339a7c8312f1335af7a8a456b581bd61d0af384d0796d531b6af20b2b08725c341b5d38737fcb055bca240ef239c0419598ad303344722dcf2c5dce35bb393b89dd876f9dc97020724c6cc75892f996b470b609872a127a3d73bba81ba14c7bc0049a9bcd5985ca4ad15d20267f6e56088e1512491aa7b51a6e3aaa6d34f870eedb3db6eb03ff44b3a674750967ca88a0a1cb110c9e9566cb20b42a696e86f3711ad407e3a01c269600ca9446a87baf63789410975376a5bcb801303b30cd1df625129b44e388672356132c10b6a6030c1678797d157c55b4741dd925df96374b16b8fb464d4bb39eccdc30124248aca11a2521bb0af5aa53c61f29663b6e103a6ee6940ce05e071242280858a06930bb5413ac75a3df260e070752e1818e12c221a69554a774507e892bd18b88a4672bc2fcb07302a132648d49c08d65804d1da7324fb00f53b44e6539b941839ffa36c435498809c3804685273324147ac41c259b86f5a09781f27e76a1562bd2c206ba3087231983aa0bd65420e2b71b749605960c94319abeb1e80aebf274b27a9237740c07114614658c51d0c5118b9fe6d0064e9b47641ab189b2ce2086293dba6054a1437d00719b5c11351a9901b0a15e4c7efcfbbe9a3a7ac6ab157586c8d5b68b2d9b747b2461f2a2cc3179a70926423ea5aed845407846bb9c5c57534b66a6cb8b480c9a18453e047c58ef00cf652867b474c7b1b62fd7aa0d7b4c63d881b05f6a8d8549257d7b0b7153525d5b295e8bbbf3d36da46a5d425601e9fa8ee7402535d553bb60547bbccb7777b5e48373f2b38f3c566e7b98a85465590ee1c8cef16e4515ac3b4c69f99ca7f3495254c345b0405fcf975bb5cc26a1faa82fe109f8d670f17164f25878a9e8834b4271f75338dac56ca7b4bb3b56ae95444af369c20b582edc204928037434c3c5f8c372fc9449a773261ecbaa4ddb929f148bb6bc471d2a72706a1f621ca295eb8b44a83a4b99c6f3bb04002b2d6ed42fa5418bdca5a07f743754882e2ec966f44235fd3b48c1ba874d8765ee30156cbc0456e610c5b02c8fc3b6d305aa23a5528e77aebf2bc3696a37c438a2a1259054c3537ab8798ab9c16c2b9bec71a861a96ae2387955cb95fc4c984d2b936be897cd05ac3524b845a2aed4bb981dc47120fc9e4c6476e7847ea69755886a5c85cb059ad0cf05b0aac6609104e0449e36815efb9c0b232c7e5b9b80e386a8ab12be22a72e0a4efb447b253c65f619c2c85a878a54457d272d2e9a32d2668d9a02089a434a1bcc4cdec25f909640901ab4ea97128850335e63882f363eae699599a1bafea68c9987882751b545795ed6428162993b17e7a7fbccbd2115c9cdb83c9852912fc21baf53082fa41ae41723a8e6a8e6a3c008dc8b8b6250c7c740ad2a3b92676960db68318c3cf24b855b62b237b97df54c561b72b0bca0877925734d650c0824ab8081802f166d8a294ffe8328fde34b02436ea27086b870009545a71d56ccfda986d00ca3e6931b85a53cab3aa85a2184e55718a9988e11aa2f024076bfb36c0d222685977ec39702e4eb7045229e5256890ad87d84dc8de5c44f8e73c65970216c6312bc22920fac8e24a6b251103beaac8b4a911a1bf62870a33ad9986d81161a3e44b0f5c9508be97324a97107cb15b2a2b9f6f71b80fc7b59d199ff7b04652644f10156c2dbc33ee34cea079e6b718ff4e2ba10858a2b33827f7019bacbb952ca83a8f38d69422431fa722bf31683e3ad6e1784ef9ab210391ee600c2d0c690d739ac5a581c4f5660576bc743d79552cc833222b43e45201888a3ec82194dc2307a07b8549c838bf4a70f9c4f8cf5868710cadb4636bf12a257a57c344061b9f83dbe9324195651020c2f02574a2db4aa4ef527e5a66fd4758382f96e52d84472852a30b49ee7d60698f4b9b6e9003f475623e345e1db767b143bd30bb5273636ca7926f434863ce41813767082873ab5365dcc72a251c035da426fe6db4aa1f34ffa45c9277327a7125c866546bbe22b9c09c054e133b3d8b3fbf18832248e5a3198c89794c5ba4e6486574de79cd67626ef2953007431ad08895ae499cc17111f76c002322a6602b677a922fc450971fc90c0b8ce16dba195fa80196569fe8b87fe060311867e6c6abc87f2351f4b0da1f837eb7830b9319498f36ff707c80926158b84a934400f63911b5650c6d205686f7bb7d415ca9dcca9a94c5706945580f49eba773067eac6c989a8e1d84d2586c58e70793933367da73ef0509e27a97f03c28a10086d782a3ef2251d08793748357f411200b5803f0c76c886b35bfeaa68544aa038374f868c474f0a6df1061de88886a1241f090ac4c7c17f6a429f5ca400e8dc98554c56363c8fcd728a1fab7c0007c67915b7d793c0ec5514c8f6a394c8502ee3c63b73b26da015c370826278aea16ac479884ab77a2d3c0b147e93181167bc1980627b46b7d06509d7725cf1085850a53f442c226cfaa24c8721db0c137c7a72b5898cd2137839202db535cd8ae76e42219e49eaabe2fbbb643742ed91551cd54f1de16f63c953fbc7b5849ccda3167660fb28f2a6ad8327a6d6ab649eb22ccfca574733cf01663fbadb3be7c33a482c13e50027d76a134e114c54380c1e84255060944dd10321b29149922be789eb0a8fb7721fe98a1e0bee89476e7efd6ba100e4d6c896905fc524e7f98558672899468fc0a35e2a8c6fcbb35b2912e4aefb8c396bb9738e3c16c95ccf758e9a30597e4b52ffa87a54b83c91d12a5e9c2cd90fcac2c11b3a348240411a4c +ciphertext: bfc010052e4a98535398330db6929dc14274ec2eea49137079453747e20d8348d534940809227b777a2bc15714782c05453f524ca3fdcf0df3ef076133b33a8205c6efa7f0998f5af79e7ba4a60d09b82975c6bb4939202082da7ec4d36ace0474ff661f27c127f088948dc789263925c9e66366ddff38156a7f29e4966b14b8c97e7ec42a845528ca6b6b3184bca46a10df3f0cf97f205f3e200028655002e95ddc121e692967869914900253f021a2ac4f57ce80b877650ef17b255bf6ebe351177ca540991e5c9e1bd2f11d669ec68e9ddcd42acd87738aa5b6907f957ddb88972daac3ad492fc42b34bc942a54a8e95ae810114e91e56bf15f2925174d2a0ffcdc143f60f32ed7a78d1267f9fdffd8cbd7fb786ef9080849a96115cd5447a0b5d939b2cf7c72c109e3a1e001e8c0294c6cde41eb8cf94fa1984ff8a69753b5169d83dc7daeba17c044d1ac0b75a300d604819989e55334cfc159c10c10d57b0d4247bbe568831c8446fbd06e61d86b36cd6cb6928386993420e6e4cacc75c302ebd7fbf68c26e4e47ee9b95d55e6fdf84ca11a20109dea65610dfaf2409cece66b5459d5ccdab137785985826f1ce139ec6a85c14b7179028e189abb634ddd65e90e24d0956185e10478f655223a12c12a58bea556d1ca83442024590e7552ef3de5b507d4780d2df02a8d1df58ffb198e7ec90105260c3b4690fdc3aa3eeb29a7c35d70e17e95ee80dd29e28d3f983af8e56a8e5a4e342f7755dd63ac17d760112ae33b8ff4fabd99ea81d5bc055ba05b14bb2d1bc5df6535c669925f66bd28c36e3e138a43f5e52aa8e3bfcfeb6119c2bc2ce1f07ac342d376df5955dcc82c5e1ec98053617dd269f94218d7e04f60db5f6086b517caf7e378e4f997871002d13fb034d0431ce0ceac5790f9ef66fcbd576e483da676dc2656f39e13ef9e53b0f3af715ad68ed200c153c3d4faee4726e40281fd3a8645d5c44662ed4a0cb2b08a546e4465df1a99c96d6d8792a49073dd33b265bff415cff1870ffc10baa701d18acfac906b93ff266bb0eeff4f9e25ff31bac8c8d55255d5968b63376236434da60619240ede97dc9a8e465993cf6154ff9bf26b0c30b5b090742e80ce28146c41d24a1309826a50f1c0eae9a92741d87da56c4a3e5565a205667ae31e284158709d3c606e4019ec5a0faa3dceb1125f15f7366e03801974849d4393e8ccc539f1731c574a072e8e1f283d2a58ba2094c7e1e20aeb9bb7eb597a2af60a51de419ce403defa27b952aaa1ffbb7884099d47a1f7fafe2bef66c2217c39b2ddbd0bace0e6399680cdc3dc1584bee8803025723a9ce96861d5ac18cd3ac86f88e6cdf29bea502845850913bb4ee3cd5aba6d71be09a6e8baf9afe06a4de80a8dfeaaf6289f484d084a7c47a28235eebaec311feccde4f2564665f7d100fa728e608606b15f3a2f0933fb2ec3508a329f388e3c19fed26e4d5fabe83b36ef8441d0e6f96ce9cde8110cd3b208a24d15b71877d54a7b0a9cfa3724b05d8f438b1d70ed5811ea82609a7e3482af67d380e8467eca9d9b03a0168240f7634f1a7b976680f877c604775e877fd07231ff766f22cebbc7971cb545df0faa77d78c35d1ae13439b340f30436071064e18f97399422484b12116ac86a42132cb044f4757623d70f7508431e3f4fee1be9d13e77d2a98437067a18e0b6dfd3a99cb43aa6900382ee5d3441cd39749d7528df82e964e4b42cc0b10b1fb47ae4cb448a57304fa0501ea3c171d6c8f82c542e144a56d7081e31fb0ae0592d9e7f1f207d4465584996e100c3cb7760f95089f73c19113ba4c683174d8a1830f2e2f8f03db4b9c988b160aaf6b26e1b49bcd0b45b2ab61338bdeba09b7356a647b77d058e046752ceb67bf7edc94f0939eab75135dff909e164c96de4e4e8420f20396e04825cca4f09accf33cc2fc313d39bd65f9441b991ccb9bfba1c548f434bb75824ea31ba21e8a0ba90bac70f3ba7e59b0411fa4bda9f68db7f2df81ce7ffacc8ca1b7b39a2e408d471a3df57f39bc662d8ef050c1638441fa49d60bf74be7dda58cea679f90e91f8d7fdb400ef0e8dfd0fe2e9a6838f76101e2edf3fd83b3ed722b12ee03d0fe632814466806b882581b5638475f160e4f8f6eec6d302f8ebbb2e847aa5978909f7ab1dbd57170939a65e74c27b92235ecfe9dbb67051f763680a0 +result: pass +shared_secret: 480307819049683defc30e7eb2f711a150d8c5503e52d93e95875754046004dc + +# Official test vector 13, seed: "bd26c0b9a33e3b9b4c5d7ea32d5bd1fc371015be163c86f584e49bfd5362c8d8341161cd1308115b2a03b7e5eaddd418" +private_key: eb8809301a6603d8822f86b6b44286f1e1b83b121b3880c35731a1215722562a2f14d15364b7aa6ab35503331dc63bc435f31a23ea1a7dd060195ab2626245fe2853a88244b7522bf9fc39a76b188c7260c9c2829f7a6e1964cfc8c28f45889958731f742aba74993c2a75bf4557c71fc5390067ac00a39fbb7049c657056b168a83899e94bbb38adb1837b53a32e74b8eea1a2cc198105cc32932bc5d4071b06b1a6cb7587deab9f7528309a64dc5d696ea00575be8ae3788721b061e6f143dfb73bd9e2bb04cca4074894b067a70270b7fc8762772890ab8d3b3a5545b9c48be169c1fff82473b250a25f15f0bd7b142c97a3400233c57b8f5db3db25817880a4490f04977a605cef4c151593bf769100eec456ee7831a526066e757f7844f660392f6f91372dbb0b8a3325a498bf7291b3ee048fcb61db8ca6cf8fa0b98671894e95094b325b922103b564189937c1f032488d868405800264781a702878268a7c19b8c39899262c246a8b4cc91eb5afbc8765d23a40b40c49decbf917737f14765d0e7ca19879236551ddce824c22676f754444a829434a01b264019d970cb44f1b8128483c549c329288c9a55991e12bce3547f22d4088527a8d1322fce360bcde1309205b2547b32e917a39d4846e45c5d4d16aec4435ad8695ad384236bd71336358294652418a33839608230270ae247780f16ba3fe7ba2de37063b66402d360601baa068833bdf2325f144aa6528db92225360032e5199a8e61ade5087dbb741e2903c245a1c95470c795bc0ac363806cc6be3268cb51d333100a21f00917bb3479fed22f3d263763b406dde76514e929f5c604dd7536be6305d6035f31790c40aa6bb5f17ea2ccc9e07c6262878ffca72d78f4208bf804b4c322b1287011a21dc54b81bfa22bc77ac1a0db6dea6c4cb7ec49d8858138f45d9d200a52d33d13b533cb6447910cc4cc21a0b9350220845c1c4b64b5c84bbbf7c7c3a4932000559e2b068d2ca9bf44b0f7ea760b225a37e78a84a5b14c5a2fb926ac622b8f86c7ac7734a82125b18f1575fb3968a4634d9633ca7b0a2d3e56580c34bc3b13741406be06396e66e64126888055aba9c8ca2ed2bc344a38a710dcb1e7d72d70a166dabc79cf79439f5340225378e7e062472584a477cd67c812733b5d57127d6cf9a6855b9a4479af6870a6090caed93a642bd91224f6b1d1f13b86582a5a7c227bf21b1d7547b2dc398fc88158e87571e826baa55933459521401c432782e2112d1fd7adec475178aa2a3ce59c96da6449b75dc5aa37201ccf404c5efed99c7b266a97d46494f1316f0781ed830da8484a2c5174403c0efc2b1010d9559329c714771b7bc7023e9c89e3f0a601d439b8bc2d3ea1b01a991fafb409ce994868ba5ece31330118161ce9a6c08c5f4c65af7334920b659b56d2c658ca4d9951c4c0b93f43a91d580b81087838ae28ba99c1b916103a91709b384840fa4a047eb94abf2c96de847d04e2198e363d248921a2537172735537878bb65b2b4eca2d9a1c4270a8a00ac667e7f9192f7c46c244b6b7676086f18eed246bfc10855e9591de3415142a8621f98170fbb55e608e10e38b6ce140a3835172387ea722339b1c6598e53d7fb694978bb5a3b5cadd1822374071ad6bb1a1569230c6042c9cb9e205104bc6827d3b9b1912a3f275cfd31a28b7291d4875c88954a36e078c9f72956e874426632a9b2b24132a1a45306a4d8caeda6a2c401713d4176c694378698a77284b7a9dd016cb332da7138511923d9f3850ddd5c6ef5ba28c357ba766b960e351df862db600320f996943e10046891f27b2b243ea71506b755f27c032690713c42298a16096d28cbce4051633974f02adeceb95e1bc264c45944d752e23b000419c2b88108a0320b3c86204edf5914f324b221bb9884499603137342b8d102b96117c88d6b589f9545b639cc18fc2c89d144107610fada81b1e2344a5cabb357acae302bebd71159bfc23906bc2bc781a76a68489a73dd5235738b06f8bd54a8771257513b6e1e74dfbf774b1e469e67086b84c1a6ffc274b73633903aebb05911fc7b99151a8a6d0abe8aa466473b2ff2155ae2568c23576f70648676bcc1a6a19e880267f139edeb973a8a9a59ad2a8edfb5cea9a0bb39407f5153633651904e40d7b863a34774ee1e401a9a24a960045d4537e5124921355cce831936f307c7cd807eb376ca1b640e7a76964c0195b6848b2cc9f832ac0c11c3c3c7290ee182c46bc1608c49e809b1c24a7c738845e9ae972d70c5ed346c46ccc73e0e251b1b57368b96dd71cbda55366585011ee659a2f081a7288c873c8a98964131c078aada0ad1662bb0d2b0a1555a3c84555c593231d167d378ba606257fd3958bc24b47e8380dc370c374a869413547d0703d28e4b5ec85cc0c897f14d5b03d6520937295183ccb1059821c2b866e755e24286634ec088522941516c592418a4fa872b2f911018843d7c877da76c1822246cbdcc046695a1e93aff063a577fc0eff56b27a2bbb56f76dba2b34b6a6765b78493f514661a4a83b58b42e4b96b471068682bb73f535e32c8fc7964a978b47be9b23cdc2b33ce980f66a033f8154bf24b73147152f544939377ba2ecb5a288276c712f2317ac69292eea9005a74a3fe336aacc4257e46395fa9a96a3fc9172b5229c393021e57265d017f6e7a5e92066b459199957cf4dc653ac222bf0b953c3c4ccd5f7463de539c024bfcc9475cb3437c22502fe16b909f73b6e733c6dfc6d87cba8a13220e823a46ed900c7649494006766a23cec36aa46756d3a7124bffb2af34c586847162735ca2d1b259f5c1eb0912afcf6846641984763266bc0add6d60fdf5b6fd87343a5d59c108cc663d8b700ab1dd5c0ab60fb66b764201722c9c2f5b2ce9a88162c3135d44ca9a735fc90b35058bbde332063820f3085cad54c4a8cd8708d43b871ca2b41d0cfbbc066ab45bae33cbf2700c67a5a62cbf1ca19c2431b6c52ac476fc2ec4c00ea9c14cbcee11b1232d523aae8af555958c3089c6c45b47ba58cf1f884e77893fd296ce80584a76abbf2330ab058c2af770e4468097cc20748a188b6620f128912126a899d7b0df24b067a73c4329314c3f6b0b9b83fb450414cf0a2ffac6fe2aac17359b20288a14272a952642958058f04b24a69b93492bc0dad67a7552b37f2417cf7e5b889e97b2d02980f7336f8e0198123c855dc1a40bbc5a93779c7c7be7089a8440214b3542341e56499ac1f6ee61b981705258c5ff6e74637fa0e48556bd3542ee342891ea4b4dd5a4982b0471ce63d61b3adcd1197dae05627c5993b502bf3025f6cb8792f32264184b362909be8ba74a1b6674e253f28b086189115129919821b867cc84341e3ab43b350a5c79d5af47b4cd228856189454538d362049c710953f33678c28f3cd9812d731aa9f95004b94425c60cff24186f644e749a6963b77760ba491744ccadb72e23653a3a08a1f7bba316a9c83e3113cb49022dd2be9a4a69c7db6145377289c921ea0292f3e4ad84e99ed72696dbbc97a3644478761d6083aeaa59004a9694d545835549ca3357cd9d63007cdbabd6e1a0b661113ceb370fac0da48b893b3c8635619e79f4ca14431cd9a1be2f34aaf3bc059de3a3d9b630b5542f38a5a1712c67327c893bd64883b7701636b0576223c4868f2195716c3499a4295b0387715c9ca4feb3b1bc08c6e09c1e809988e2f414f0b0cce5515f43b50c2dba028e9ac11e6368062c360370bb7f5655a3a75c2e7aa86ba9b892019db150bc7dc881c5e3b24e414780512bfefbce95c914cf060a76fa4c34359c634a1a11c40ab7b56af1d19e2732ba6f3cceb93cb31e08c93f2a9a33841d667079f1715a56013c0e68386b639e414540cf2b13650ca9378234b94c24bce9a9cee8c2adf4356f246dbec0bd9b371ddd296ee623603edbaf65e734504844aff0438d163b27c34d52163d736bcb42b0a1a67067a6e84bc8f849531a631fc55046da2b31e0b99b938d4f8b239384bc2ed54e46e17e9a8297c2a16775f77859ba69c759638fea8fc2057b5105952b34058b329ee7b2b08a69b00962c31a5106a281890ad6257daa8c6ad5854eec7e8a203cddb935ab5545e3e57ee5f78925b1531e5c4593a7afee319c5215645905b50cec48961b2b6c1727b4794ed382c66c11b67804b18c3c0000868ee4e3ce4e9790b681161b2cac3f8a1a419892608814aad65880e683fa75ce66335831a7bbcc236dd6f2b8c63560ff1939b2b56b97e87049eb4c65f42d640c0d8fd5841e48bcbd1815ef0c62da099f5478bb93198ef28d89ec6714b0f142ece80c6a6050d3aa936c25bbed1dbcfc99f39b4805782b5bfb6d44c0e7348fba37d50b05031c0489d4294be6cfdc6f4146740e54fa5d698aec87a9a79204cee2986867a2906eb851b734b8b22b91d6749b1a5f07c44e3b +ciphertext: 7cb3891440c7d6eeaf5300ec18a786e5179b97b2c15d1cce3d4e5ff49e6c4494c165bb4b5d822e1e0d0dab2cd477816452c21d8efc981549d4c6ab18683f19c29e3a938ac1d6c0eb18ad94b9e1e8831aa8e66455fd0b91df49384465d7ffdccc9e023584089e7e30676fbaa0762672babd2a360a8038da9bd50c0fca9a5dfbd0872d8777f829b3f17c757ccd44b22af73ff4fee09fadb5820c5404154ea71cff70fd5b3689c52c0cd76dc0d8a4c2f32d32d9a914453be5ad2a3e14e3f5d846c92d50c4d65330b1d15d88d7b8f466d31f3f51d23fec066ced6f751495d3737bfcdd87c27559b167597d0fcc90e66dbd5c5d92a9daea58d05ccf286e2c27b04ca589ff454a078c4b5b4e5110d9d5e3752e9e8025341e425099a08045cf7154c77a4204280feead5353780c65e6b799fd26eb26e1dd50181c9bf76e5e2984dfb0deb74a4ec89b9a7e12f6e124b2ecdd82fa6d34473b9ead35b28f6ccd9709ac1aa317821bf3e92d952f39d9bf98811328698fa2faed3d9dcee31e334f7838fa82c397999bf7372f825cefce367b800d3369cc20161da21ea5f49e9c1704e3e9e6e87210b684df8a038b2143c780e4cb7bbb072a2fb94463ec095816bd499f6b5445eea99646ef1dcf4c331671e0948f27bf8bdc92616ce200739c86a3901003002cdf4f6c353a0abfbaa8cf9c34a8720835e6b366be22933d7a965f97286f38e9e8d21620a20131be8b97e7a67a2ef535f893124a9d2580222db771badbedee98c79d716bb3dc091101caa5e17d83ce35bc364ea143cccefdecbc0c4bde06d47ccbf59f3190e174c738f10433db16355cbb1644ef2ea8f33ae8ac8456afa4f488ab1327885a635fa2bc0df50133f053882d66f5fd3e649905a3d1495e41df802c216d254cc519bb78c70cf0fb0d28092e7ef4329c36df72b98f37165c229722d5e643817ebad995c8a361b43b7a6ba60a645104ffb57e05f70b65153965f0be99f76f1f798f9043ee86acbbc8102aa01a304014f082425c86e88f975272fe2a97261ac233e5b2491f0113fed7d6f31582d51f5bd27ac0f2f6a66c5f584607a8845a88c57d3efc64e07bed4f31cdf73c63bdc387085e2a50b30c8d4b393e055609680a6e39e3c19c764d3e4f01a536e2c112f3ac35cf3fa0ac77bf2189299f0de958876b65db62ba3d1b6b55b3f11321aece3b41095d284c4c23a6f86ee0c68e7517536e5f7fe09c6b3d543f0356fb98a75c2e06a73eba011679e1173009c9a5a1b7944ce1749264a2879dfc797edc0616862f582acad6cbe3615f6096f5b99e5b339fd9109b56ceeee55752145e5a6660ca4c948f1ae4169b54563f3ba206202f548fbffde7e505bcc9fae4929162b550bf5fe34af98891d57109b19bf31c57630eb2b9532df07bff6097da78d5874f2e9b2e5e01a35f904218771c8dfd6d230b4d1780875b45a1f846854cd02c43b76774ca8a0d2a1f7afd7df4931c1762c3fd5ae6b401e12b91641e64f3203159cac0aa43930c8fb14f5a9c7658a28399e9c32a77e738694a900ba0c160d8837b587be3042f412181bf2103b94329e2e143916323dc8c18d00d6e35f6f7e2441def99273d36cfc9685f07a7d34366a92e1f447e463bd085982ce62304a5e3fb1830b59292e94f7a887fea83d7bc014c94b2896207836042394ce50c0e7e2c0c9de867641a22e3c421e5b60a58291862c91b59e7bd4f90fbe3b83240f4b28ed38cf3b8ea899df3e569730c8a7a4f2a9fbec8cca2c06661e9058c54be3541c73ea24daaa34a659a564c51aeb2234140a5f110dc40261ad594c2121780b956d039d23a8e3a1a12aa99e5fb88edd774d8e9d22b3700998f91d05ed60bd0a89a3224c322686f27932713dcb24e363955a548ec5c625b7e30b6dba231f64934a9431336e74b0e891d5e1866965531a84761a632e0eb007095b90e8f8c409e051d0f4843ddab0e84f2711e4038fd6e331f53ce194823f4444a77ec73b082f73160fa266c4037fa02e20a2d01d617aaf7639df69a8fc83c84cc350807dee143c089adac7e052384c2f1460e9b3f3209b53b3e89156953255eab169715845f458676ff656689f77ba16ceff3e5b285c70515a1a5074231a02a97ba8492e64c70971f522de003129c517aac123a4509ecac5385eebaad022c7c5ea1b29f1ba4f68e7c5b88528b7731d1b46528c579d5346b4741ef9980e588 +result: pass +shared_secret: 8d0ebe7aafeba5ef991b1647872cf097d625a671203c53a05c4dd624c087855f + +# Official test vector 14, seed: "e2819ef86853bca1b9dee7ee1c1619988964f9a913e635aacf0d96ca6e0300d084329dabd8f149e24176d22757404260" +private_key: de2a5203a614274820ac186bef852a92160817520323d112ea9240ed0bb381db4b012a4282775c91055800516cd465812722c6696165d80188c1f7bcf2f99cf18124a2905b6e3a69185c0a20f61913402bc2622a5477bd455046a032823da983660bd0aa51238de42a86fa9654f61ce0ea1e8f865bcd9407b879cd54c8520acb99b74abc1a6a23b767ac7c9449613a4a4b5003b2000aa52c17cb6652ce133abc641eaa34141feaa745c06ed7a1273be6a66eb6779232635c22b4030252ab30ae3c13291513438f2b19c4a10cc6f884d093223d2b12e460b49c191adcfcbd4f82c67ea936f946391835b2752ccfefe46230d84245ea8d8c799eec979f98409f51a65cbfc62a8c3a889d33a72ea24c96c094257104701755949524d5d4abba117a098b16da589c47e5415ed0920c4b2b5ae0bce2616c5781a903953d2d768ef5c58431984f671a3b31953940a6b52f24658ce943fc360fe9b0c9f9308caaf7a04e3779ef5ccf99a505b2b27d1c0b68f9f2254752820f6b721d55be6a205b3c832213d8cc015a14f5895d8ad17a14501ece031adbe36362b1c475c7cb2129863838ae80ca94d67007e3b5668ea415e5ac3e66d1aadc76021c4a47c1ea8c41423571a553d041a07096ce6548511cf08e108893ac1c0ae3990559b21952e5cdaf1751052425f483c88a3356ea567c717c75dfb70ee49b0be7f9cbf172ab7dd22172d40214bb7c9f22801c3645c8d075582965eb02ca9dc68dd6c3798d28162de30da699a29c216220e35f725a14b0708349e4c87f726755b68f632918daa2c83836b8ed34a542daced4a46351f337b16516b853bc2a44337710043a58a83ba5870af51af1252b83e69ca81539bb89af01526dfe7162665b9347d441bdd77b2e4a3665565307e65fbdd341b0b154fef5aa7ea530c93362a0a4766ad13307e90d1dcc2a2a37746e881d57a718e2964fa80080d9f28074121893c95ae850c61028a6e82caa571a63b7d85c37290b61ec6ebee839da040fd1d5b359d9bce5ab54462242eee31892030f7402aafdc1a2575000ad636337ec69537c4b61669547859875a2b94f13aa723182f9424e8a95051f10148f470f1d04c9c444641d4ba30ceb312bb89dcd04be5b421fa5d7327748c7a37acbdcd73589a94070635ea6198f014b4471106862ea794d2c8eba828e95d81f3bd226247952db967f72aa44311438d4d995b3c6ca6d6233705a311f095a6c9ca8cec042087c8071d00ed4acced97053116a8928981e61c5b3bf8177e4d99b4a130999066729f2875da7462b7827ca00980eb96d3ada528778cabd214dc0969ffc38b795512bc385921496a27b1ac7a099989a22c173a06ddc4b81b2365a9c6a160cb36f70fa4ebcf22c77e477da74a7be867394e5168b744dc03a32ff21221f877421a4aec9e9a2bcec7e46c88c2ef550333787dfe664e767124c5b0f09f8874d085324fa2eee6a127cb2a3c6936f649719171116bdc8a6db265c387930be3a1daac267b838640d44c8ba75537347735de517582c9d8da18666942db6951a4a7a2ea8f09768d026734c0bdcf7983f877e29c42f659873114669974c9018e7392c4500a45bba4f3c834275c84289c23fa13ca6e927c128accd480225c79247982b811b885062022eda9b448061aa908664400acc9b7f34284d98d526fb96336b408845d85c4be2b0215b0b32547c5f4b7e43fb465a358f6b1297afc22bf08b9307fa8e5a1361b03882a26798106526fc136cf93438b03601d48a145d58998f087d0c4386afa0c834a91ad3121de0c57dd7c117fd339dde05bc09e0a157c9c638d8c1a1d10687fa3eeed68eee7b3b2adc8b970bc0a0820b14679462c1113221cdcc045906618dda5cc340c448ba0038c0bbc36de75c00fbcb11f55e6532504fb2ad08e59aa3c65702547d04a02c5da62286a2053a75975c38c865d3bddc9506fe7c7081345700daa716da27b789590360b5c6f5b9f964921b7680ed159899829052987536f4375a8c5ca9e322e05a3d11f58bea4b1de4191667e87508ac279f4757a54393130b04675c312314218ad0c98038488bd501104989055bbde396cec47790b462b13b00a625a732959157e5715b16f4aa25582b7728c427c5758d25191b5b42c33b5d096ba301075d7c515ad195aa24e5249c820c83a86b66536c8fb371772408729447f8f2bd61fc63db224d868b70c8e8ac6685c8e3bc2375049c25f941169291c38a0eb0f3cf027bc8324398fcca99feb47059e87db1c2b723522d3f09cb8a19bf7b2b35db5516a652b837fb94a6ac6701c479686ac758c381fa242d8e67b1e7f6b0cb04cee5fcbe2bc5b266dcb55f1c72b091039596c4e4e50db8741763c35365931bb37a3552bb3223938c6a876e54121fa489c502e14943aacebe7a5e7747bddf5c6e916095bea36dfe8059cac7adc0dcb10a64bbc2812bbceb001e22cd5438183f9b3249a27566098af16782c6b503b987a6a5896c1bd82ef7d3c5c77b82cc797bd682849826981187a1530b4fc07173dda9ccb8c5248583503a8b974e8b1ca39b1beae9ab516087a170ba4d12ad5e555f77f27c55c519226cc6b3246ca1328db15648ed4394cc038245bb7d9ea48af2350f0961283f195bd51304af6653bd133e241729b5a62495c8c45583cd4c30bb1c538fa4f86afe799026f86e1de0024ff13ed5713a8806cb9eb6cec9c94c4fc4abb2569d9486507137733e681a5eeb479c8256ceac1ef823b34995c65cf43bafa250a874b743388cb6541d8346071f075b439620bce761cbf1848953200543177e0154c9343b47ba3f5ca025fad201bed145b7e8abec99a404621a11372c930713a013b0cf4b346ea6cb64620859d458d0e08b5d416bc86552c79b087f63539303c6fa96aef18c6a61dc37e1e8436fac43763c9acb9b5955157cbdc15d356936cbc603f6eca2e2a53163591b3d2257d67335caf60b4223b8c0cb7c54454e3b4812e5760848ec0babd9a0d7da9e83719bb0d7395418c44d86bfeff4c8a8548cee6780a5388e36eb4f5667ac2182c213a577fa2c4616814ebda8ce8a1c5851e0551d356471a8051d179de078c9f12163b0234fd729c9b02c302997c13974b47aec7573604d8278783bca1a5f184f77047f3b1861b7e1c2dfeba290e785d77ccc37e0ad03c199322c475191aaaf87300ea43f6a956b7d03b338b147cdfa14467b2850a73ba99c6b39d89ec6fa3052a9bfd0f6922f9b37ae6966c940370811aad1572039ba3365d089016c21fcb64fe3d924f805336d49683ed262410594f8205bb2649082642314fc7065cba9b8c4421f1bac52f69ea8f96093f89342b879eeb785756587a4027680119d41bb559c758197d360342bc3845237aed01aeb8104490b9bcb4ac158f154b347a49219ca5a401f90d1c1f4f7ba521bb33ae0610767207f3c9feb991e7ce444a42b33ee5a14710586523cc98aa53de01801bf383e33ebc03900678750734311c349cac283ba827fe39f976b3de28610113291f61325b870384280c58ac9c48bb65c5d8a672c86b218e8a706d3b87f2341b95199956886ee0ab068d927ddd109af491d23e991f4e8619e4aae99053c4db3514d380133105ad60885a9fa5fa80c144a3949cc8c33b591c776d5a7a6e9c8d12417b4c1661c867119f7006e6520462b63e1770aa6424dbec6b9a0c2cdb8c8945d653e62c790d7857681b479fda12c8894640aab041a044d897c565ce882aeeb8caf42630e10afd12293fbec9d7ef259bf881c92cc7706ac41626bbe1d17373e57b3a86a3ba62cb6084869b58c659371c110930b6c75626651971641a899645846f96081b00f6c29bcf8c646210676bf266467d90eb393b64a1593b4579adb0b549e6648da5c9e2eb3bddbc78c468912dc674b126acd4448bb40bab46ebc8620288253156d8d39ada1b639c6f69d34e9a25e6b6bf4241bc00b5968282bab963820fac7159001fa414dbe2b94a74158ab43c6a43519f9a34a716cc07908452e5a0a517138cf46220243bf2e27ae78835b73e0720222700861136b2a405a241e58f37f132c588a1102a5344b704619666900c73990c2145497565d09e984f2689e315ab204c59a360534a641228768a9f1581532ea9d7717b8d8069158605508a24ad1c71fee5760605bc2d619b177985ce89cbae0ea5ea335529a20225cf83744d807b886ccd5cbcbb8393d5bf144497a4c454a2ac7589b5315937345cc02372fde21bec80c0ac8912d28b3348df2a88c35b7f384809f24665600583530226b50a6429217ca211946ea66451c9092e7c42b309a922465561b307f8912f29a1ee687b1d96d8c201bdd75a34e09d954a4267f21490c0eb74ae98fad1b5a3b5d2b9f70e922599b58af4bf05a9815c270046161175cfdbc167293cfd50e9d74851ef1d1dfa2acf359556df4a2abaeb9dcee945829beb71185b4d6bd18b76e5668f253383a +ciphertext: 98b43ce1b5e3f4f7627465e5147c9ae5a547f3c748a683be0c41c952bf9134ac4aea57db428e0c534c8df32bfde046a4bb694ceb92ff9368f22565c10965512103c00604141bb05572e4d9ce098ecaf9c610ef9f9f371991b3ee605fcc8562bfcb8ce12b559ae3736e617846b75449a1d8640d8cd81b10e0e1e16d37283fd693876bedf41f4ad3acfb2c7fbac12f81d45dda3db5a0bbe6c79ebcf83f7328e5a2a477dace62f9ac8e8a82211613d7a59a0ea5a25c92fc868f1f2853b030028a869e8035800bf110436828b851b91a9af639da94d6dcf5997b42978f02df5316dcb445caaa23b57eb05cfaa8cd70de8035cf76be6d812e4e48e3ee10d3d196f40478eb06b944f6696bc700953897498bc73020cb6d61f86dd8d0c32d86e875fd67b3d4a506db533ca7d49c996facfaac18009d8e5876cf108c9f64f14cdbe1803235ddd328b1de2eeda09e1b0f2d46137be0ec466b9be1790736d38c317c7db5291accfe7003aaef4bb4fd6c77ba7acb36c9a7da91917ec5989559516eda9556aaf4059a31ec6a4b119b80e35a1d974dcc1cb12378c97e7b98bd42fdf0d5f6e1612bdd81246fcec86ea81aa635d8c1e7475afcaaa0566ad8f1c2fe556c0399da36bcff131b5f5af6a93877d4f3a69e1d7b51667bf90c665c86018204d496fea4869116035efebd7b7ea505f77fdb6fa8e5b436ef053c6ff72d4f11a40f7569f46394a6fee11092e37fcff1b881148738ec0eff7004ab9bca6c3971b1514955d6436356510018b90c1954cab172ab8cc852c0aee45f2d44bf5e4e5ca48d0bcc683af70d9fb5e90598c81e70c4ef11ba0fcc3f3bc0979fcbc3555379400a858e2ab05509a207a8edd852c8ec0b64a616cebcd0c90605d10b451bc2ee1fa6c4320193002148f7e0eaf8fe480d9f1865777515905f5500447ed1dd9fb96b0da711bba70efef9ee86a3c1eb0a523ccea666d4dc8e6c6e00725cbaab126cc1d0562b4d6d3d08efab09a1e07ebed940d74240e12c171fccee0a22df8dfa768979e5b8bfbff75ec945c0d86b3c8bfc41be1bec09c1998e4d54bd9ff309b1b8a14123bb963c39902478fc70010e43dac70cc799f439b51fa0a56f53c0b792931695820ae1aeddc75dcc4b8b695409e4d5d91c5170dc8852a68c0def37a69e0e449bff582e1ca9452b9a3109800349d3d8f648ea219e22d79363bb1327f459bff8ab2a98325b3f2ce2a16d66165f3e3a353d82a254177baa883efeb8e2bb4195444f90aa595831d059988548535c0fbc70a3ceb954171000f300d7509f3c306207a92aa5b961891417e97ac706eb7be17bd21d144fe368449fb0104a0f84211b884314fd894b4e227c81440b37e66962b80723823b4f0ba3584ff8670d65e07ce18d1aab6058a1f42b33ff9e382eaaa8a6c3ef1bd8bb3ce9bc940b2e9593d54f1cb6b8ae23488c67ab4e14ce11592114373024ad4fa3f946a187edb673a28731787960e096a00b956acb5912378bc794179306763661a8ee183cdd786bff72d946d53207b409ed9f76881c2518163b0215a78a3a0b3120838ff4103192d2e78bfcbb5397911c0b3ad281762fe4b760f5c80f6bbdd55205032b60aa26781c23a18be4fccfcbcce7b4ea8ce9d285df0ea24507994826770387ba75fe9cf229a569970046f7c927aaae551e40e3c56b2c00be3e5ad6c364eee23cec1f4002e9678bdf12c52300e374be3cde9a434dc4c015c985d63e36327ecec520c0a7f7ce1c92dfe2b780a180b42b6495d1b49d83e6602f853462c83817dec59b9c67ba60582f20b7d7362c04b5f50574fa9bfc5221087e94b760b6a84788b4c563f5c8e77b173098197e2d23d060187cbd13e11fbc252c7afe39b3d84bfc8daa8fe7b208bcc694ef7050a6d47dc7de96f54b0d56017ad92f2344713486bd9719232ea99f9d049bd9b1f221b7dfe705fd5a29d12f1a08f4d02f4811683f3d7793ce079f5ea02d6a2b05e2f82348ed7f5e2b94cdbb3eb9558e9fa6c6a538919cd5fdf66d7c56358740c76ed0af28e7ea769a715d4e56367c9a2411759508a4f761bc4a76c468345009731f2584427f648e8971847ac724282a4d6017b4715de7645559218c3a0d9a96ef78cac19a05284d98b7e403e1845fbe5a2c9055bb779b6851d7321a2489090b2b1289298abe26e98fd1bff494f021485114a8a44efa64d6c1e1479a36912a6dcd1449b3 +result: pass +shared_secret: fcd665fd50eafdf62b40f8eee25c6f38b5b4d110e329399460596d4f5c0bee30 + +# Official test vector 15, seed: "669c4ef8a051ce201da65fc4bc34d398ec1f806276fc5d987ad71d93bc12dc8f107b58be6e8422a0795c88cb9a0e7488" +private_key: 402525b257c035fbc56b1aacd731540e40999eb1a2cce3487189184f088a4bc96d9dcc63ab435bb6e26f78a90ca281b436ba7b222cabbba20b4ca3223b1210b5da1c7fec7e64d27b9d7abd831417d8e384aa500a5a986442c767eed412e6499825ca2946bbb83e1a9d07f14429aa46ba598595dc4639da5015c96535c90e99a1c36dd511daaa713f741f3ce3cf8232cb5ff403f32c75467440092a4f7714524b9ccc3fca9503c50cc8d676758ab660e2742930bbb061639549346b9a67d82617a33283061011844467bf12ad270ab2e047835ce36276051062f46f32e05c3af197cf7244352c03f423305c6477a9b606301b606c693ea08196a2c8b639c21aa641646bd3c958f3b6da0ca8234b17ead33b9a855e2b0181dde85ae8a33ce357273583cb06968f07f6b52de50d6600973b5b60ec3702c5480d95820dc0aa611cf80891338b5187b74d7046906499bf7419f2dcc89f7808b5557915ec82dd90102800a26e1ca3503b8844416c688386c3a74fe6b11fcbb6293f9c65fa247c70a40d8779056663bf92ab39b2596a17710204b884765c5c90f6b61b660a32c8158ce1817f45c2d9c769bb203acea434817c6f788482135118623152c0f38ff33733013a3fe5898f741986a5d322f679a7c0a17040b4cfc0f65e0395bb7d5b698e676db248880791274ea868d13009e289951d3b80d57385924a433a83a42d879208072a2a5b563b171c9b53c263c6b233a27e40f6b3205741373880498552afe88132b80f3849c937fa91ebb3a0770c5027a7065b961365429a7685bd2df71792ba893cec50bf398493d0676e002ea5a9054f095d52870728fb9ed9536da077273437689209b2b14407f9639bdd287ba9f77af0f6c750580c7cec0426035e89745e88f3b328c60fb31987d7fa0280d062d8ac2f57b5133aa1af119151344b5f4589389aa11803da3c1f08aef60589ab2687e5ebcdcccc9d3c38b80d078c3c4038d0870e0da3adb641a5f22198868a24d2a128981b4bebab984f9c39edb9650d23823dc1ad7f2c39067b95844829bf24ca25b68325134f14d9a849db47169304f3319f95da79e119be3f31af93cc1f1a1bb6743379a6314477fa01e687b135256f72d5657561b98d215ed6bc1bf80239e3831c16317cef9b7e2ff60c6d116bf8456c11c6a47006b75b27ada9c6baedcaaa8775306319982372a39039bfd1315aa310c7859aa42c287dda6cbbe0f24f288ba3f9d78b214b6065d35eb9374ec46c251e77608c53161232cf11480b92505ba69a7fba20b5713bc616317e4c963fc938af06558ec62b47be7c967e652dc55c1ea38c1a9d90947d167d672c6d0c608b6b9535bfe20e2e2bb322155ec3e777341c3b5f4a5c79a93a376a023f263e71c215e19b2cae2c11ec400a93439b0bd13f8caba7366094635cbd1558448294704c5b209d7b7a6ba1aae425aa03ab197aea341d0166eca608337c387644638ee00cc3fca30f2a063b8847f637299320127d038343f001720ba4aaf339404a2494b1385f851ec06b07105869960332a8da7f5a7065e8983261eb7b68191481062a22a800932a38e0280ce73c1b762a3f95058492c27c4022cb2f82c1781418ce217c06d5ca7f1ab2e99167705b3721719497b266db68b6ea1356b4c642058b4f1aab6c4093c3b2532181f9bda310387a216b6339341239b8fbb9cb9d8a46554c1aa875b1acb34ba50b2b6b11cd07ab0c695a66f025cae448229655b177543b98478eba7895882a6a7e20a5263370c7177370d1ae4b48b18583a49dc62228165c55368ae6aab812f6321aeac1ee5542bd35a9c291b6f8ac01df1c10e5e10a00d61acaf83b125407445a341aeaace6f592fed5bff105178c018f893116bad4aab410ce04071e312269bcb1725cf229bf57103fe90a99dbb8a0105e926c28aa87571d613290550ec96bc9e2213a088c98c3981727e8311aa595f221183a9657e0cca6ed40962a30570a475e7c70281576013d725793e11a91b312e688a55365ce42ab08ac759897a8af7c607622e56014dc825f647d1421a9099b14bcc4934cc4b389b333c14373fa593f0851291a1b3b4fa96edbaa893e4814f887adecf9560154876e1b861841a2ad37236dc2c647e608cef8a3bcacaaba0a66acfaafe173cef526c86d31416820166411abe7da1944fb933eb009de46ba60e249664722776b37ccf770b187269cb240004aaf74c37eb027c62536ae847b8ec48a6b2a9ac68307802db576b70226fa1b951da9cfe094a0bf4b0b306c5e030baaa25baa591b289fa24148c7ca16a19e0a0039eda555645bb65685a75a57028bb29456e4c16ab48c06d346ba9925db4184adf635e779522c2670dc5bc1ac86c662eb37975aa806a2b2e307904f6c6a0d094828aa1c07891cf098223ea78967e7af701273a8a1859adccac61bcd0c103f3c13aca18689397bab1ddcbdee2ab113ec6932c68622c513b0d66c60244cd77441c7aa964b5331ec11a088a5034e064a1d95b4b389c15c51426fc9a135464416881858511fc894bc2a3b0b742366dbca062f2c3eec28bc3c38c809eaab081c5dca65bfce171057ab8467eaab50987732b9c85bdcaee647342c3660950b9ca7c0bdfb3bab69268fc8486397b540f0831efb861ac11855dea4a588c4935847a644a470f055a923162f1dbc2b699020880cb08b80621de33a9f0aa83fa2b5541aa2cf41b98214a5fee14785661a63603f0492163b47829c71a7afb0b5efe94e8e225ea2c0179539772a510a5ab5456be4670a076ee1b25ff62687a96284166576e3e773adf2c061258bf2d28b1ba00fd485b8151076eac5be6ab7ccd81312a9ca938f256b6fbc8ab6d3c3a1da5c75e1806c5c4cd4202c0b20816e368bb2443684463ed43787a89236fec32fc99891166462852750a8c1445ac407924470a56b1cc75c7a378a2e40c00fb35c0d4f65bd12f49911fb923bec1b635baca8428ec7d13b36079732838459c669f7f0c26281717ad45eec972011c66d63a298b95566afe11baac79a67dbadc882815d014549cc294b658a8c00a2422c0d23f6a0be9bca232c8374e616e749623e8a99b0f96a08c95897e88900851076b1b470732ec2462bc9c943255bc475da70b44b134e0cafe8f3cef42972cc175e04fbbcbdf4cd151639155a0469651408c9292de9383e63c08c8bcd96a69a3ebaad9b2c1940a37f6c32b1d3b702d28acb908cb2c7b88b89a7ad4c87cfa6c53987e4721d2302bfb53ef3e9bf7319219926bb7884111fe2c4a9aa4c4c1c0f8be3bda890c0342b56f826a6e971c33f900408292c5820c92b66bc8432cf735388ddc35eb004506d8a671547b7f324741f609e2121a0592644e7e0cffce7280f77c34d05b930b96ec9c79838da4a78680da3b07c1485081d14b9d880bf3ec61d852114d738580918c72a270d7034412305ba10d6a5629a931747611554602f529f32356d9e0331de2232e65c695af1b597cc816d001ddca540a0fa3ae67313853b6a46606c1bd3b32d193bdcf2cdfc2c1f9006724365550632bae19bb3d60804d0c80f17681ee020c6cf3cb7c19a22b1d4acaa8abb40f308ec2cc6616164e106a06f700bc62266ccd40d4a414dfc818ef3ea39540247c0853309d45fb99b84fc3ba114c240915a19e96b742a234ca1e0183e60c8acb65ed2c8a7d239b408c33fc5e31ae83caaad17c24b99238b2a52181517a1202c87a17f22bca93e758ed95a895a6a97c163cba8a4c0d0b980e9871fa8f595a668adf927c4538374c7e65fd052196a64cbaa23969a1c07145352b6829aa9e93993c640e0f62b5bb0228ee37400619eab437434026df078bef452267841bcb72844e836ac95d25439567a76f69a3b2c6cfc1c4525f340b40c558007b4f76864e8367cba7c71edf2aa9ec56f25f606cdd66cedd0937451b95422a509b12553a8cebe7b95bd97b45564c98d20a9ce8c51add836d8c00af538b0d0528507bc3924a731ac05a688a1680e050b770c3a8f49c654138bde367f4269abdc4215175799a6112bbc186b23745fb0cc3f2bcbb6ba1670b1834e99e10b2fe25003243284c59ee4202ee28a6ec2086510697240d60961398c77b3b046a23a55b89151673e1ad8a9de959923974c540902716c973ea402b3576f5b664da2a104812a6101996980d68baedc34f9856effb6c457c8332487349ea3b8bc67acb7fc509c22a476c331af75374c57b4c010675d490da92c7c60ac69d89a25e0d67351aa5c9e9880bc1386b77019436abf526b319ce44cc759b009b93f8b9c3059bc7c63ab483a749e1a761e90587f13945674e85b7c896280d15d2d20bcea11db480755602348b4616400faeed3c143406ea9c1307e37e2642ee73c442a4f71da07c289afd5cafba73184b9723c238da81e3ae109daca1873ae1e34d84adf05318b5f655efe36f1b678cf4b875108a18db2fa312261caf839f84bd956c5 +ciphertext: 5e0c732a103af159a069419ace2a1d915ad5c589beae24c7ce3b5330c10c59170511e4beeedfd369fc2001ae60466c3be35a244469b0260c39d59eb33dc744eae2691eaa75a34811054bce72dc3f5dc7cc57fe96913911e27e1dfb7a134b6845196175bbf4531d87ad6e8145950df2a98cc571b35d9d20f638a40a3cbda7d53ef3eafc890696cf511cc962fa48513534877fb63d69cbc4dbe1471d6489f5cdfd83222ae0c45abc143554e148eb3a0030e9bd687fe684a4218f2371640878b80dac9242aee40d7d80971baa2e34422cf0083e59ab6be20f3c8aea270b273952b8ea7fa0c0ddbcf55769e548d549f4cda9b161f0565b87c7cbbec7ec157b1c578e03bf84264c0d4d84b7660ad4ab5b009a3c85d995d4c663cc7eedda0f2aef0283143bbd10ca643b4eab50961c7df5a633860f735a52710bfaa27b3a3ac4dbe56a82632bcda5c5f70b20d241814e7f6e9e6b9b7f089c30294a0899e55ee74e366425849483138ec5ce41fe4760f94e630e9030a5add852d30f2ecdcfca1f431f943c82299f5032cc79f4baf2580d15881567957fa266c18efcee6b34085400ca89ba05f696e39f4cb552944f2d39b4a0bfe9d8df6b85f5547f16cc3ee8e0460ff7af9b4a236e463bc9922d99507e069ce84ac77bf56366bb1a6eb58d1cc7b560bcb47578661682aa24240a28208bef802e6df94b1478af7c103ff756bc661fbdeaff6a841af2c0b39f75df4e078a62e267fc1c2d491d589e0f9091e764568691f3fbef675d466def5098322e1313435b689005bb8af98865bad6de64083596137ff4b36091716445bd5ba416ee0fb961f65bfd243e841e5d2cf0d822678a1605e353a8dc0898d60dc3fe8d2f4ae980f8d135a6a74779f85e77770830417a6ae47cfb804d4b7cec8961ab44b12636d0a9522cce47bbadaf947fb91542dc71e059a669029dddf78947abc8940873b4f882dd3526bbecacb737f2af651c0ed0d9b01dd198328e31d2405d58dae57e755a8500ec058a36ec66885eba5bf5285a048d913df95c9872edb0f19ff783f1d832f9b24ba194b2ada14410c6aea961ea029e4179dbe05ccbf96b62d34ccf1148ea799c644201d6df9c14ea208a38b7783c69f0ce80131e46d5523f8ca82229652585002a66761b702a3565f62d4955124e21a29671e5e71d03059f341ffeeeb4959487b7d26a2da280c340583bcef0f719caa1817c785a1816fe68f32ab5f426c5a0b06694974151c7512e9137db5e2dfdd5d7a29775464ad44b98aae9e1a930d2b35cf0cf119ba74752bee665e65d6e968c286370eb0ad177777c8b6504c7551a57aa6875f18fe54538fba04a74a721f07c893d211723c8ca608670bec9be28e249c4632ef63e59dd790617e9ac0a8bf3c0eb419fb435c346803bdcf2112ad81edea320202e21718197e4bd995ae7f7396ad00b9f8bf11b0bdbee0061bf06a298eb1a837bc14b0da80395d676140fc7ab22bfdcd9e3c087b122c4fac6a9a9e05706c93084be7610b3a76902d846fc93b782d582a548b3bbf607b30bd72fad1781e765ace7861547188757ba4f63300eb08a19bf7597900048ac1731625b1db936b02f56225b5615850c97e507997eb402d9a26b6a6b25fc802e506537138481fed4151874929d70d8062af6f1d3ac6ea2120ae799b124b3c7cdcd639415382f0c9792efcbef2fef5c9c514266fb1cc704f1ae0966a05169d342fca180363d43b9a0f6366f3d8006fc748e1c5d29eb65feb99127b25ba8340efe4c7f3886edfa6c3e05b7f9075cc66a9e93e7db6b8f57bb42fe74de1b1b14c3836cff9b7273729a7a7281cfbb9cb11dc8479ccc3fa6344271bbf1c1f03648ba971100abde22267b7681d2e7fe6daafc539cf8fdda1ac18563297be8f48c4ecdf91eae21a0bfe5c095151891c69f01c74f71ba54d4bce13cb0268c87dd8335043b210a680219634d9fe00173aaeedc4ae6f86acdc0e85157006aa48bc20f4ddd6e90b3e1eeddbdb84af544055f7f908d5f31c559f8ccc592cacfd6c550ff92e1166eca53d170767656ac402dcd437d084433a60335e3a59093cd2b434f7fe182e68f7f4911463ea2bd23e01017140967fc045d377f81e1ca8c3c0fe2b649386dcbc20dd243448b2a0b0c7f9b776a6be6aba385e2e61341c4d3c59443552a99797171077317df925a6961398db170c14361a15043b256e972289e +result: pass +shared_secret: b7928b922df5a82fc6217de5f086de8cfedf91cc521f1207f3d912b2274fcebb + +# Official test vector 16, seed: "9debccfe818f6b5204db4ea09c03ec9a19dcf1629c1527685b8a29776bb1daaec45f8abf8f0adc9a8c8bd6e2df6d8048" +private_key: 499333bcb7971e60c8a924aa6ebb2ccff48b4d3b9fd4786741668c071aab1c401d6e50928ee83d7997cd10151b1bb28bbdc8844681cbf736c4110cca8f32c3ce345060080d9280b9d8d8b8621b690eaa77e6bb8ed23285eaac41ee6b44d85a7253d70dc3180c5bc16ff3b7a4371616c98b50c3dc46bdb3207f880220b6ba60bb6db6a3326137190fca28777a519377cf8f08b333a721ddf9c8a91479a600087fc15a35430091357759da0b009d86d312aa7c8abed3d6babc371612543edb115c0273c999452f85d796d9eaa442c880eb098ec2a8b249d3378611b4a27a583cbba276790e9a119abc9cca1ba7c57414c1d697303dea1778b736ddbb9f521a44b76941538666a98140263419d3bb593cb23bd070008f396aa8532a92dbcfa7031d5c537feb2594131204691605d7fc8e5c7c6aaeeacdfd169e62b476d3a65d611801ddb06988f38636f32600ebc192b8709b1c56070a68fed61866f00d0f2b16b0429a9edb6e6850366cf3995eb5c926ab4c82506f50017a1a106e2cc32698fb77bdabbc60f35dd93a54faaa10f4272c2ec98357f3c137628c855513173c4788c35af8bcc723b97910343eaf4172ac586064dbaa43ea90cc36521a54aad84b3cf906145ababa3498cf2ad900c10b5c7beb0fc11b8d358a90d34383faa5032d535935fa4c639cc7e0094534623176b836d7c041d2b6c1689c3325c71dbef0743863a4993c34623578428910959075c5129d7706a3537172cfe981e8ab8a29bb09a1681b6fb75bb60017ba998af84863aa17c03cfac56e18aaf714ac9854616f09becf13427e996dfb084b1e62c5495c9eeeb1c0bc23c971077255520f17692601a9021662b770672a860c025ba9238cf8c73a8a467833bea9462ae604387f11431ab5794907916aa15de03aa6501c993bc684506b24d715557ddb7ba01c492407147905abb8977902da131cebbfd9b3b5dbc7a03580726510393f2835a1db389804a7af54743c553f5c445b4d350d3679b8d300916be22dccc7a0aa009e22e98dc21003f7a8041813bf84a8592d7979ae34b299e9403fd8a073cba7dea6a44968944eb4be70623163eb9e59da4516612d3df06e80d8326090b52ec78c3b883e70c06a77c70fd0426ef34150ba3195d05075a08c133f608de4327712c825e05878ba74acc9ac66a7573f6d245f2ab3c09e702b1b395bb28c1746eca972b41fd9d28743b736ab39853066c5029b4cc37089b89179e3a822cd606bfbb74820d3885e3b08bbb0716a7c7d4b674f46ec36d6d89a4e331add040ef64cca6c3b1e1bacb5a5d857a729beec7b5f4b068c3a685614619d6021170ce22f3f28a52517268ac6693c58b3f19798e4b186e2f0c471e33c4ca0338555ce3c37316a291cb89a3fdbd1b64fea422c46c51e65844e5317e4dc47a9461704e16259701718600610d7273a09cd53b256d5c6701dd1cbbc3b452bf943729c3f35a2761360885cd65a0bd06965443e2762b4d5152f50a4c18171205bb192de1619d9f3217a870ef1272edd442f62c21257407427fa0d4e85bf4e27563fc2c569357e44f7239edb9828c65dae20870d5a48b4f807cba20062eba57f0613114c335969ad471178e6f3318103b038c2812c18bbd68903c00827179a710c23ce84670c08075b70513aa9d5c6b3c34a3e4c437cc6c14b63b4c3e1c27638151d8a2fe633520f1159c52c4c59536eeb22b6981b8d10c29469242f3a09a7a416c79d893fe2c5c3204895ab23b0b062160b58b99d501f2dbc3c75a594e0a605dcb6ce54832d2bd450bc4c53abd892fecb0db87319adc0294345770197acc8e1b8fbfa67e8a830834432fc93aa463541456059da44be22695b3ec0caec411835e409430076de94426ff03af3e97c5ed07dc0b9450cc1a37508d019ba1b08d89943a5661fda1e84f09f2b8961d36243f36155f95c8a74e83b0fe61966f1008826566f5737bbda0a3bc1b2e0852f50f96df1c692be536346fca97d83c41ef6cc63ab22f4a159229217261a8760e648d2653d4fe13884624baf9a57af50802ad6c90359a10f3a9e83119834a001b74a09baca15c80c2b1a391dc652236011885bc181f6a8b42e7b0581798348cbc987959462e3b2f8986e42f59d84ba35cb171f2e81bfa5079dd30b981973adf67c645dd82d60045ceea77d8303982ab9b039dc4c3fd0159d46c89e618304fb5d4cc53e9766138fbcb061b56ddbd61e33873a953590f628c122d049cf722737b54d4430c312342189b59364e14fdf8cb1edc540c39612f8e2bf88710c26425c09dc7affa63f52fa01db7794aa2c2abca69145e89c06d40189fa704dfc4b252811b939118f1b9928d0b0b6767a1685804f502a19254ff89a45d9539c9f968835013b69a362f634b269b911c4327520673049c00e0fc437448c2849089918ec93c2ea270bd0699c85898c0148f4a1095039a216a51143183f4d695aa456c32e8a35d351415120725ef995010409e1176806da6b6e08ccfb3093914c87c107cd14e11f937a9f138b928ea5580494c6eb643ae33b5600f7726e2004f52cc39ab24d0cc9c3f9e57a0b821fdfe8404e6532bbe01609a61def2b4f452a1fbff381692975e05121e2330c789055e5a4ad696678bbeb1a8d3247d2257ba246a2ef966c305a8f4fac73a6fc08f71ca500aa9d00962caab7a2780cb94c209b1cd43151f3248dd344bc9898b7780950a10211d73aa0ba20d89b01b36623ed8aae48845e1d7372f12b9a692b3d525263dfa12b3f312f91b5802d3b3380e58be6a92a70e77cd6134103496dc3e9236ff17cb0ebb04a1783379baa0a3c54cf1c5eb1b4afcd9a7042c50d6405b1b610a9429aafe61a5423055af9f61d3617be60bb59ee8019e72123069614e738a46703af5bf25d31ac4f1357832b1232cbb9325e522e79571a1d226397e407e4b08b44082e71e984e463747a230bed934127e892fba29b88857606983a60b9425008117ce17d20c82b6171165e940530254f2b0cb4e5c235dce373fe1450ee6457da59c331b17f8d4b5e0bab25aac789c04acffb957724783d00dd24eec3375f97ad838ac0c261789cd3afcd68b2d53c0c9bf944f094bf0875c0f08c161d3618c774304ab25563981974ca2e13b5bbdd210ec10ba39c64635c9025b9610b623c2f12a768e03163d75315c7097782b69c44b3a0c33a552228c6001c5ce194346a80824627b974d2c64fba994d2c62f8babac47c51dc100c54789f737c61b9b3420469b11d110dad9010c6c67ead2329d3b4c665ac528041bfd028612c608f87f3ab74b6b68309317e1c0ee5662f8dca46c26039e2dcb1fe8c42cff0057d4bb3e4ab3bce13c142e589592c0850e117cabb2cac88431461a5e6743695e096099a8249e22f4033c15e9266cb00a9a36103ac473123e95d373b0dc92cbdf6b2b173b07a3771456d283c758ab963811e5168694cc20e64e8a677e05e3915c4d93c8531b75d430b3709753f899b1c45434be196a3fbe5149dda2ac0912afac619b4a45f3df262f7d617322a9e8221a79f2319e6ac59034c80b3214953419a191b0e4a25247bfaa0defa001d5529b1cbb9e63ac03768404645bb8ac7ce25687be70796bdf516b76039f7b689ce6c3f569a04c52875ecdc9fbc97447e0160e75a89215aa263091e7cb5534a97660cc8515ed61d9b624950c089d9aa647f787a8ed7c89216694a83c56cf278fa94340d790015b914d09ba91e10ac5b7ba95792bfe779966ebc07ac6916fe1aa4bce56cbaf506563319c5a4c4344344b472226f59b7fbe7982c08afe9a60a80c446b8b341eac220fa8a664b6b1a0df72684b67bf2032d75f5aafff7cc724acf3f1051ec3cc4ce8768fa9ab51f960f3293a1fc527686570da34404b5681967258799fa26f22179e18221f4babc2b7c46601ab7ceca1a345027d44783e7d6c511615b108c4197bc0d9ee49c91621074a907ab292d4575abad75a19f10c2a493af902252bba57348dc33fdab3217778429680b4f352b52445eb662101dd22ddd211f314577cb23bc47c7176942c5cba072996c048408a5dd795907bb2e2f49acd0e75a93cc4f7938136d7c26da0691c08733e8138caed6c8cb116b900869f9fba9f5823b20626980ea86e6f487af758830c787bb1bbd8de024be9765dd04b969dc21589312e709cd6780c9a38a8207fbbe74f220c3c33e2a127588b64e3170999d3a77c8f67eec947cb69649dc64010a3119c9030e1fd0530cf5c3b73b631917719d0983ad0a06d2963741289a282a717d7487acb30354fc74b005ba01101a1c8b52c130a00339bff4f480a4e890030a709b28082d3c501b2aa2d14fbef9e429f8cfb50e84c327ba02edb7f6abdde459896eac77b5d8c7d7cabe482c88cdc80345768e4cb54d17aebf2947b07c716dde8da26e0b7114f85dfd29df7d92dda83e6b2ef4cce08c9134563063068a196d7b1a1a13623e48ae12528e +ciphertext: aa9d348a26143a9b7645f5ca60b8164bec6c46f77160898d42692dce57ba70b1a76389cb3bc4565939d9a05b0d8c80b10981d94cf593e001ae86bc722eec3af8fc152737f283b23c1f87beb4750b9edca2f0832a902e91a3fbb3895f915c94244189c7e3ac05fbf3214d319744f8e62e1218d29b501fc210e5defc4356d38d18f20a2a456e770a2e50e452118155c57569d85b566960dce62cb650a6476145b5e26ac71d9db03300283d5ebfedaaa84424c3129e4ffbd10d5a995cc6801118a13cd9fe635695a01ce0befa9865e9f940d8ec5cd9b5aa4163a525a37bdd5aa2240c071c99e5a55593ce0b8aa1e46be7682175ed83cd369a4df3072fabc968dcab66361a650f8c3b9a85ce39db4351ba975dedd52825a2cb3392b2ac34cede2c17d9bbe8134705714832e55921fc91a5b7e126d0379004a1d2aae26af0b169da33ac8cb56352d51e474a078bd192e7388ce8bbbc1c03c7fd129cdc21bc529a3c6ae161b68765338d3473e8e5ae83a13aa4f279d72c836b7876e0eedf1cc9f956dd9ae68d016d6f64ff585739c0e6eb94f7b1e34433e4a52dc7653c9334a94b8d52cde4df49addc20e62bf8e682d762a94f539fbd059a9c47a13a6adbebb914eba693ab9862c5ef480389a4b7a6540a24f994d5d105415641190395edb0f9085017a1f1a4c399b45ef13054d9ab2c2b288695e82e9000ace60967501e0030144465edf4c843b82af76d4849aeb1e357c7863ca92287996b9fc794f5fb9593c5a31fb296443a89007f1ace1235e2553498c1e9cd67efd33502227ae657b31cc603c6be6067c34c99f338e08130404b1100bfa732fe449ae17ab8b3cc1a8e8c96404ae9675982dc6269a7dd2bcef77fdefd5e767ed3bf80288c8926060a0ebd6731962d3ec846ef0784a22900335ac90e68054afcfa4d0a373b1993a42df0a6eb1a4fe4f371d6dd1bf7c1c73fbebbc2bae4497b9391d9cb7c1293059f2f2e42e485c4a1a6cc7adf10da6559643a11a6184aa62ef65597d4b7266080518c646ace2a4863040934169034c1a1721ed73fdd2ebf704480c0f5aa885ec5be064b9889ea9566e72a5f32be32a9edae3d8bc8513f136fadaedd0efedec6c08e934f3addd073f8a6ed95015ba1c240f85de99d24053babf604e6466d3c61b8ea2b19d413a173d33663e36e8871cb4bb8df1f7c2a0eab6b1d985981aa61abe005cb835174556d53281699e1dbacf6ca1bc517540d942b55d0005cece29365d18720ca24f05e697da16be5e135fcd5df9ef9741da03f1c76a44fc31f7dcaf8949bddce95eb2634439c5cb59a07ca03ed199b6a79970724b731b6bcd34b20d83f097c47d56d87e629166c27a0a888cceac6273d67e8f6a62ae0e515d96552cd8e147a6e67c6fc4fb6bb1928ae70ac7271e583026d40d423da81b0621a948fa966616e2d5e5375421c715dc8c81fd58b3c280214ff5cc0db1bfd2311f7d126d33553e0fe2d195efe85c42f56f67cb9486d279ead1bb221a2b8d83da105c5733f2b9ea60d370f4c746e1063c1797c5e9971d913ab2708f15de5b78b26414d3b53ac858a901a4c1914c89e8c147e5f30e875938408cb3ce54eed5f7e6ad9966198ee24cb3be353bdaabd1592c1886948c17466adf039c20bcfe4db27a1020fadcbf34ac7cb36b2b6757d94187636ede4ba456de96416373bfeafde43ded757af3e01b6ad422a17d330f3ca8929a28a163e7d045f149baada7d7cae24b19a04f06490e3cbe658496980dda1d82b21d460eb1c46bb76ead1d13fcc52ce1a1a15063550669afb3b20d16b7184e68dce36e5f9f7df838e5ad160c6748105cfaec014f15714748c5a10fc377bc59a24d5d770031f82e0925f184de62890d9205ba132800731988122d161de63f0313ba563233debc9890752168a4a0fb24465a8d576772ad7434e1f3a1413244e397ab1d0b0607a429178d247d1e8910738c1ac1f4c7844a6352e95bdb57983fb36c318cea8577212f7d010f30a82f8e86fd0100d0c38204b99577465dd0c51c6a6a0801cd977149985f7fe6d71de1c0b130dfa4e127453c9adaec1e8e211f9acc662dd43d4bf755bdb651457dcd7370b9e88b84a38c7c4cc94ced8285f4ee8b0e2b646d5aa2682d84ee85a6505989c757857a71bef9d4bbda0f1593de4ae2858a1d64a9019b2f9b182f37cfb1435390991c3d0d93d2e05c2edacbe117fa7 +result: pass +shared_secret: c653e05ceaae3783b2cd20961c12a4331f920ed695b6047ba6eaf5d256b8af1e + +# Official test vector 17, seed: "8098ae7a92c10f707d405f7dea02c2efbef44efa132ba8aefe81bd45e543ecec74f10920ae48a40b0653d63532517f2a" +private_key: dc0009fa7c1c6bcc6a0164044607925524ccba9a8c5986419805c924374838a2764fea94d7db8cdae57360510aa9da6b61134d767b14cc87a2aee90a68c10ce92a41bf8144e97c73e2b730f15673165a5647ca4d536bacf780a3e33a224f67b58258b3718bc184534b8436c1162bcea0b5c6599c00c262c34283b5bef25a1620ab60410c9ff0b21cac43cf0a68ab784a1110c183e06984596712560c087aaa05b67be9d6bd9520a486750e18a14ac0796ab1e9c33629bd1375316be248f06295ffc665d8d9bdb701c0447b33252360377611b04a30812b0e2d003cd1365f122104e71b8f52256976b6415ca0b1e2713214527515d37eca3c466a9b11fef107577caeb5e17e33aa0c9c4a71c7ba9b4813b3413ba65887c4fbea22e80251e3f727d2b7b0128555be6965cf704f9409b57b939aa2612d1d7241adb88eab14926a3718a483ba06a604d72591bb0377d53a31b8810ad8f70a8a2757ddb44ff1b02f557b9b61eb5a33c481f4b25ae00b1389b93437b5cde202ba6282912a095f19255c7b7bc136072ee3e7ca4c6800c415a2135871313bbdd47338ceaa715ab7450293a984e3805141b1185a84bd867202ab34b0213f917728176b5edee0a0904bc29aa74880c8618ee862c326c37152b325b5cbed5c679268aad2c903cfb6a5691912fc0508e23a8e88957f89d79e93b91da85742ede6ac13f0aa15d76b9952c1f5058a3ef0b453691ee45943b7564adcec64d4a02389d3b2f255553e440203605a0f7a192ba417ea54ad6eb347ae52250c5a2bd59c46bf750d60372eaed87c8bf11c44e65fb8db1017411776b161551a9d29212e98cc9c6c735ff8100267296db77b2425b6319a3b6ed5998a6426125cfa78167c0a6ea6c6f8100f7a19628c325b4ef4b29ba97297258565dc5da1042f80c7c634140a2cf93d2c19973506cb6b84c67e32c0a7d718b7d86265a76fe1417bdaa1c8d56a1748016c4b9ac886736a8fb3cfa2693d4a443309dcc003f227f1586498c0cea3d6853e5c07c66ab02943cf9cc791fd2289ab7a1a13c7b3d3a0b990e32d747c2588eb54018c1d25e86cb4d84538da8752248c04353cea97c534801eb223c877682d2dc50284f932095bb2e55b031a144f8f646aad45935b8c947b37b19b99092a0b636d0962d93053e147030187954614ae54caa88eb3736c5745d2d5bdbc462389f97d72f128ab4b5bab3a7aa9e1588452c240774ca5783f56b01824f007d1946d0414a1a722c32154598f3682f3e24aa5c80167956ccafc84b6c343986729e7d03c87f418482b56963243fa67cefda9b221253753a004bccc4d156817bcc9b8e7332128b38c6f6625ced3713c51a3ee137d37785a35d88b7a2b4daae5b356e07bf6ea7a67b5763b04a2944475a5323002b30a6680c9eb08b5954347824a2ae17a29c1a69523ca73bbc9403c35c3b2c74affca1864e24556b90162d07a95e138ea80469d021e35a1770a1c3a5185258cc9659d10054f814ecfbb0937233c3f322e77d3821e9ab61033c24fea260a4b8b3004592c50c68d41b72a67936598a177a6aec3163bc3dc9872415e1f60ac07640b9180a20500bced23add93752d586915a2c448301449e024967159e4f278c674b0313d00dd69cc819c354f5722537dc4dacf29f58b46579b917ba38b2807978f1569df299246a6c23b1e92907f540ca9c27d2393b0481cc10e47d3246cdd599312af942a38cb8ff936e3b64743a6b22a7e96925c863d82b963fb909ef439ff687544b53937c8110399c1dc37c66c987124aa56f9b8c8ec0501dc170252aba325a5a70bc134a2e73c90ecb5cecd373820a34eb706bcdd25f95b3cc9c035a4f1659ca5252a5a21d895cabba090c5115028a079bd81a3c948201b6f9981fb45e73600b2475578d08a8218a9d832ca974d992d13984664057fea0771a0c125b16b9a2d33b72d2478250a4cb9a34a1b3ceddba53d1a4905332217875797ab6248c6b97052678317a99716376b851204cf24fe743782c88ca93b90da03c3e54321ed9500af39b9bf2f7856b13604013a7f502b4c60049b1a03e91292c40d487cc9673e8bb150cd84b11c83493dc0ca1d5568f532af3e54c8166b5b180a6e253840012b7a5eb4f05d53f3bcc5c9414136a70057037c7b88266bac70e4c01b0944633d5f98af3845ca7c37f1be75a52410da5d2bf9d102305eace09009e6ea21b6c543a25032612492b58247f13f01c6ebb27fd469dcfc83ac93071d3368fa128a4c71475ac1817a8b1744c9a2085e54ebb8455bec286dee50cbce87ebb0bafc32341e877aba7a5ac10dc99b65687aa53cdf2585976a06bef586e8993953d5a3cfad8a7593349f9c31010e6becd32cf6ec70f4ef88b1ab955a5d6aac2a877323181668a2c731726236c4c1f77768ed06a7358744c91c690029c4c747603289874032fe6730d96392805e10b7a50a6b849985083caf8d64c1fc257747613b9e6c85e455ace3755ca9034089162d96346e3f0cdde0a81f6a7727babab5f1401dc1832bc175e3576b36747101ccac305d28ac5386ea92447f483408aea6ab22c1027b99b9f14a1b6a67a24fccfd5f52295dc11995b9503d76c7d0ba51abac76777b960c45ce8dcc24ff6031da9a99174be42a381654b5c9697b13188a38c278d94f801a2b94685acb0935074c06272e0ba87b6214f717c01d9508d77535e444b5a2b461d02acb855d7309b8ac6b7731bab6626921160e1a35d0bf14deeb922d770be063198d5a72de076216bb366a0889773bbcdef5872934a894c7664f568ac7f1cb5bc72587767025a271db13a0ce44697aa4c0dba80a730c0c1c2146b36a50d23926df520ab3460b18687921de988c2a7c97dabacc5aa849068ad76f10b361b9a2d1436bd88c962ec724dc15a6583ca8a41704f3946da465042b808f2513b65a5009da5b44125308142478ad82ac64940164c24a599c96eb69ee5e4bef1e45066e2cab719b57fbcc03c1985472cad16a2699e4939b2e2850c1b24e8049a41362b2b908e52e2a9f7808d06a6298e059bbe1c5a87a8610a06af0262bc61390f90d962ec95bcc907c850721778a947677a226c0482b5704e7e0176f1e28e27150ad84093ae862682b4a74e8a7d330c4c4e144c3a39c3a3da3c75873dbaca4880c2940ce30ed10c395805c0bc043cd2861b2e9c0da1b59474f8c492024cecdc7676d4b8c4b3311096270d29057d05cba6494b6aa07379b73bdfac9a561a8ffdd3a43c5877d85749db9c8379abb29f7567fa1cc57b09c35e7b6ff3f735cc18473049ba2d5837edd8176531b67e04a509ba811a9467c633b962e8392d065a03865658913f494501fe9c0a6a649dc8f3256b6274cb6235b0cb278132676d028a24e07595f56c4727a7b11830c1c9840c002db53b6198444e5b63be4c46be9548bf4e1598ea6371686c63da774270b82c95f0c9a12b5c8f9a591ec50971d897b3c1c4e0701da5e26be2760ac99b481151abd2a20ba343bf46eca8699487d14a9667565ca4e30eae468ac5e6cae54b4adcd5acd74812ebc3b4066021b0cc890099b911553b95c794643a97f99a512ce874f10a3c250a513c005a70605429f5943600cfb9e4b2c5e72c821149d9c2c554c43d9bdb271806ae8b58506571c061240b6e7967417542334773178424d46122c7212e0ba7b5bf4388e8f4a3f60caeff712c1e3773fe51b357584a917bc3e4fb950c442ae17abeffe262a4a6550576b6e8297ba723943ae3bf60971b9b86cf952c806fecbe937c7b15c91c9e438ebee95e51d209e60105bc43be345167ac92492bba9549807361a06f525380f5f19f7d1bb926cb1c2fa726cf371174caad5034037d07ae2f305f4ba52f9415b0c624398b936333d68625f533d7da20d62507768a73f579ae71b2193f52a214b30921dc121b6c94042b386f52a202794bab835a9391ccbdbab2ddd94b3b04acf71a12de67cd24d1a85e7330dd36bbb6b387acb6bad3a59c1d292fc24aa6045c8c34ea4771b8137537b644997eb45bc2ef2a1165b308d3c926a0d23d09e749a142493a99ab1c3a80a87c3003990956729ec1c6c60a47a16f495813cb75c995aeaa481875830f1e906fd6eb993a8b3365189d1b50627466161451a21ee45397971d8f56634d90cd0e136c9d82729f8a76c61298a1a240f611824173abfb52ac1aa4bed85b4b18939988895075e888ac0c519ec75ebf693d3903560445414ed3bb3d262074981524e361efe44945b14daccc62e2c335ec40bb4453cae2524229571eceb64a25026b3e1ca249c127aacc08cde4203ebbcb6fb427379097fd222b4e24cb9cd47381c6b780553dd196bfc6c356f031eeed6c85b57be19afc39dd1f929bbb2d627f5f19dba8f24545f5c1f2244d7712dce7596ce08146dae6a7f474daab4056da2d22c4ad0f6aa3e88f7fa8a96067f8cdaeceeac90c2d0b5e277e56e9c405ec9420c30252 +ciphertext: 6d412e5c3964d81a28ae3bbb3d82723f10ca2f9db3fa6322598a429b9e108652885c174ad8bf1339d998b1c8cc2f17911a3653f252c6f68f4febb61279cce5a424cc46bbff959ede8b799828b2d2a7d224c9702b20b5fcf1a69788d470f5f8bd351a9dbd7e1654cc2883f9b261e2c73f40d3a97113b00673dd6da30a1e948cb1dc3e7a7611424cc648c2628614b1a047bd7cef9a069908b4a25daa193015f8d01a99dcec1256686aedf007c09870cde994f5f1b353b9349d57ecd449f5f6ca036f60bfb3f908e63c8fffff202f0132c8992d4d14a3f1c71dbbbbb1cea6746cf77bfabf8e0ef00202f3627b8e16ca61cc37afbfae596a496906ec3a4687e4ad72ce7781bcc9004badef6aeb2f72cbb2cef5b10efc9f39ba2cdc486b5d077592570ba3306b0ba79bf30c4486b313cb8a44162b3ceeb16390abc7762ec20b5e7a8270abd0468ee473bb3d1572d5df8e5d07066c4e30af725c74552d88d00627c32542fcbbb66af3eea4c495138e6c6a9922c96c587a51075197422d4a58d6acd810059747464569a4a50b24d82809576b19bf93df1f311b2224d4cb86886e2739c1b3f5f4edcf9fd3e6e4d1b9df3e2fdb2a10ad9bcaa1184d5131d546aaeb74c344f309db617bca6cf5adfb4b2bac58b6ad1d0fbb1cd6936461d32e58789c3b69f048c68121bcc1e00bcaf1a1a914caf9b56c9c72bcd9884bf1e763640a6a345534fcf0fbaebfcc5774550fad937240a84619ff34df18dcb909468212c6e68c3435d4989e1cecae914ebf5b0b14d0d512f3ea72b8989fbdac9feffac66ed5ecef1ecf41d453a7f2341207ebf6973cd2d6fcabebb815d5bbff4fc8ce850ef3541e77bfbc90d302abd12eb8cdf3d877e413d82aa2060668a6c9c7a88a3cd7c4ff3c3b53ddc2bb9631a3f36ea45180a6af6ebd040aa79e80492bae5cbf5ada46bb40f66f4b1b2b01fb22c94468469d96826ea4c120a1bd0040dfa49ba3bf4ef40d6b2b303d7542a3a021a9591849d7eea8aa29efeb8b591fdb86abee4dccb8b4006a509bc4f35782096aa330f973bebd99ae1225d74d07d7a9c1ccc1721a861900c0b0fdfa777a281f2cad68f70df6b1cbaee12350a666900c3ed1b0adcebbc4b9423f4f05469428f774519b84622078e4c23b73d0774ae055619355bef69c1c619986c13cda903aec68a851c5308f19ac98ca11384fe8c55d1ac5dddfa7c25081e0a1c8a8206ecc6b73bd33372fbc6bafa2764773a55a9b061847224ec50800ec2118de658b7bfafe47d3ab154b6ae12cbbb94464ca65edc616005e6b14e919a2c1d8bd1f5c4f3a1b9ec9d115d68c87d0293607a87d9c7a02123b71bf61e3d75196db377cafe14da53ff9c6d7f01eb3f18d43265eabc52ca49a8d00bcf7c226fb2bdf81d8edfeac40ccf3f88dc1aa74206990bfe44129e6b4d4b032ccfe30505d0e3d9b1ac0e9022698f9e010b77f47c7b37f3f272b39eaaf12fba68a4645f9622efd080342ae3c48a3a32b1d5914887c3667aa4028504f03ca99f13580caf672789f68427786513d23396455c01e5a0eeac158d1463f3a8ecec9a2bb94a027b065923e62ae458e42b62a0a53ad1cb83a4b8ce253000eadb124222e2ed5f5b9b86e807a427522a32e08d20ed45c6287c664a50bd48dcf4a9c67d30214a628cb5f6281b0091d4cc5e4305457c8162b475b7c10f93fc8c4753d5fee5b33ef22ca6f01940004b8b2f81751c4b01d4fbdb6453edb0bbeb4eae9cc5304556235fdb85a4f9bf011311ca85fc0114b5ecc8be9e59ee43750ed6b5e3d3a8a6896e91ef3e46877ee51d1561811f06058dda0705523b6fd20685f982ae9aa18b3b58a117563e2059abfe03c1bbc5a30220604c3184e51e6f626def6af264de64724adb2fc188ebde8f11a1a550afd6dd06a7b5847b42d5db0f165515c6793ea9138dd23dca2278c805cda53604b42cda8ad762cc5a5dbced461af33a9b83b4c1e085f1c4efe174b101a1a43c73efccc7bfb0b7a3a1b5fc20ba33f34037f25cb2b729af2dbe46e253919b0d70b474560eb4a7b3c9aba5575ee6f7b94de0a09f9e595c9ae67f566d1fc14ca01fc8f468411f642d37c3d521604ab26069fe9adc4a70a4c859502b1b717eafa31fd2a42f0d80f0f0804475de384a208deab52321b03f2bfeda30795c91ee7661d7883aa9d456885cc9169d4eb90903142e07def749d9a46c3b2ccca0d +result: pass +shared_secret: 9fa99f495d5ec88b908a180594ea391556d73b5043fd53e60413cbdce7512ed6 + +# Official test vector 18, seed: "d5f23808871544e9c1d6eace2028362b48e225312f77663e9f78cafeb512b908cd9e25875d61a16ec615f4b8ff826856" +private_key: d0f6234ea63d21038094ac3082f06f5dc2081b5a6083b00a59e5490266a351259927ecc2855c144a83871475277f89311b71436ca835797a1250945a9cf23e041a7020e0cc3ad5c719c9707a6b823b3083351451fa94a7258986c05421e8c98d6e0140a8c171c1116a5a6939dfc95308e8495a47c2aab4b4d30a663e005ca89273b3fa6bed9475bbfa3a6526673d2b4428f01a8041377dc04b9d21618ea05cd2988070c91e95f489b76225ac396de3562ba513b3f23b9809f86eedd7bf9a29a8cd856587eb558772bbe847c2e93497a226080df9567e3a6b22c513b1523c5977b1a1d573336869ef2389b37c3867a5121fc92a097c9640bc996e2845514b04f1b315eb0c7ce4a0b0b219b9c0846cb46c5668796d83759da3a28348f170c3042a86846b78ac7fa5e5c831c4bb953ccdf6821bfd674a8e775a17a4429a197c910b0163454ec3c286cf94ce7e9562f67797896927bcd1b07c1c1b62714a7261ae5d9180473120da730c5e3b8cf1b8b9d9aa54d5392d5c695bd84badf3e20ceda5bb15c1a1c231878d35267bb49571a2216b067ba7515b3cc2661bc8742c3a8616436d117a53e6c96474fb67f0332a261884adb452219b52f31545550b5520c48da1acca388bc35aa120e05433ea1c31b35113f9ec2828e6bf63dba38afb0ed144015c3bcfbf221af1954f5d95b02e3b3df2ea8cfaf09f152987e3db11aa112fb0270d69fc3ba8e26ac30556340bc630c60af699171dc4914daa5fbe81125941982a900a1155188a7a55962639408a2856f480fe22830305078c8785cb9591728a47b0043d0a987a498542f31a113ef0a2ed971a8fb2aea9b334e5354b901393c5a140b05a72e54c21c4860da23019edaa2d0b8680e4379a7813b07df36969e22ae2b4102132711a63171c8bb97f30a599552bb8b902cd9565ba1b0cad788ce92b85b7a468b8348094bac38980981797c80032376da288df3cac31f202f3c3279882b4124761d1c02075303f6f1401bc4b361dc156a417028e56a2822bc941c7aacf26667b100f9bc003398866e9d104f9090c46e23c1d249cfe4619059b38a9012db2d8833b9c96cd40945b83be73b16fe8e53f5e69612f488c7d0753856071882741d533adcc9ac1323513ef15bfae06761385a651994085ec4820e75e7694c5b2423cd12a3b0d06a7194b87055b973803899b4492ae8c6e006636e3a21ea9d872b13c9364e208e99c2c74965215d6290eb96a802a1c836c2819772e21457596982d72e6491651070f1cc7e6861d5a7a01bceabb0daa0692321e9f49bffd83a07caa9a15453831898df4505cf33899f4cc81ba7059d592690d784263074060155c4491130fb9159c09028ec559c4169faf663af83c8d82db07ab08213b1b97607ba0dd50962966683b014bf381be25da2ee32057bb55562a6197b3d6555570af1107ac025cc8ffcb3f4ca17ea33ab0cc792bc83b4674f0014e3808ea128f7e3cc01b4495a0b72846938d23a32eca110e47b17c7db043340a79f7d521407cb0da754b59f267721c63d46c5c4fc58d88f75426a00914dbb3e98246d1b2573bf59cd65222e5939c34b25856625916c28c9cdb82c5643bd13c9b8a634235f1badee54aa3180c1c2bae97828d8746affc737f5bda768ee34bf9fc17618164f59b689f094aef337ab0f56840dc569f20b313647b87c74154a4c6b79968b29627eb067d2918bed7a94d24163848830463a1088a60c49a7c3fe9579a58ca4277a8a75fa7c4a734c2917a98e540b5405a3699949fb66340b36c449b685a1b03896df118a73213bb404cf6daa413134ae2a5594de4c98789b3f5e93fe9a51395d22f72211429252489673cd7668d8cd48b733a472a2736b82ba3dbaa0757b89debf5883909c82b7ab523e2aa6d0156dc2ac8c9f6352f038e4ff045f7a81a0f026881a3890425180e9742cdd0c6a7129a163338ec0ab2ac4b7d80145053ab101ff05f771568a724cee02741a604c92b53485b617c8ed24ef14a2fc608c882c59d9be5717e444fe347b0cab7b07f4b5d405034c9baacae2c4e844046a95275738966eb87322479043ed7083cb2a60fea71019baf85d3866a5cc3a8b93f09260b5533819aa7b6cf0bcec07181b6659f469533b3419f32129fb33b2e8166aa8d10acb4f035d7e6226d3b096a7383933c0cb6615824885499f79dc06b5e874203c3349b2c3b27b1f1012e52bce9968496c068b6e6c7244722621a1a44349314845b1d8831d9821eca386eb8fc254587be5dc529438485b3fac44af0613732509cf225f5c127a4056cd5e503eb742cf03154511969e7a743834708d71579e9ca4a4e281aeb177ef50cb0db826ddd17873e63a182e3b001f659ea3cc73cfaa5d7d7b5e7e9cdaae04c9944978dfb7ed34248d976190cdc0184930e25c6306312180a0b8758395d1febae95b22e0945c5fe265595a9ae91616cf9f35b588b7a02f66d8d49800c50017c7272bbebcffb10a16a5c8560130d96fb0c241a286ba949620ab83539b83d862ddce2507ec4b4bc4330c27517172b43bdf09a5e6a5fb684166800372663544859acbe07424705809587a08dc50fafabc1b2f9486ca6415266c502f7b998dcc947c7b5f5584cd34cc90a4c385f30a2cc051237c6a85d4a5571305a5182c970b9bc87268484f293464545f4c349e8b2ba3e5b4a5e7c42237c0e6e1b7722b04e3d02a27d0597d7169a49e340a778179a924a1d31c0c3d53bedb46868a62ae17847f130ad1478b8428b09fd71b028f1933803318af78103723ae7e1185801872f847753862f9f72323f980d6ba9744cb6c079341b02443b52e4becca891fffbc6084ab40bd17af7c6b2b21c09c170455c52c4c7093c44aabbb1a0c1d11b12070894f7649112f32a98d976c72291100a3bb4948f928771b063839a94a614227587d1a9bd25479bd8bd06e114894bca10814f0c516e1be41b81ccc6044a8f3654679df531c7220982760aa39a4e982ba3247b009d405c0b50969c694858889b4058089631c57dd1c5fe12acd5b27143d09a2d90c8abd8930d16769aa44a3927967b2975a329bce9599bfb170e02a7994fb90e0b1c7bc7db753c065cacf820b80c6c1d585624c93ff14a26afe6245ad8a6b2c082ec871dd1fb10c3acca1898520647b8ef8c0e45580c87f718eaf18ed4e97ea1516acca657bdfa16493115e6c90eb998cd31e6ca095066bc75057b2b71ac2a75711a7820984ae9306dea825c80f26a1ca6c686189c93550d931a1f73fc3ed0341ea703c033bb463c6260097c54bd17996a82abb0d32010cc53d81b7b7052b86abb6302b57d6a34895d09840b3b6a50c9962dc248edfcb328e94460d3c82819cbab49a79f742a86e85577ec995a025fde616fad52c4f092bd89286297d8a8912294faf7c959ca392cd40989c92b8229ad3ec91d352a6bb7d757d3709c5810b40157cc0fe006bfe843419b8a1d792d00c1505e0a63b39c7c2ca2c96f695426073ebd50283572bace67c01bb7b27b09be59e589bd60acca376a8630034cf87e9d49411648a1b05c329af92cb29942cb2369381c3ef761a02f8c905f963f0b08514a7c1302b4bac9f261fa37855b67250258c003e5bc9ad07035e667bcd6a537f35a0756bb2801a0aca56576d72f3a8c0c2f371e5aa036af3a987bb550ac06980bea73b938ce91715a4b19620a08be52695abcb3c833eca2824b60de483810857aba0a9292911c4167159b023989d061ba81c94df979917c72c8eaae518ab0e46ab8927b5b9db690bac6720667baf711a73952b033abaa59d5c4ccf676007044e26c2bb31b5aa2095f2da9724570cb04174e9ac174216c1390a687c60b6c396aa48ef849d19234f36886205b0b28250e7803502565523d0cc0bffb78efe64dc758cf3c93bef42103694b434c4819f82bbc42ab45ad827287a560ee43600b87443d8bc91ac5b15fab2701f05577c32678e06790808d4a6965c30a0915ac8fc7950b274c428a43650003beee2726bd31a09de14e892b54c2605269b8c22f146afe669dc9c4775d200aa9534af5612ea736b01543788b13c3fba608ae90aac0da9335e6c115fbb1d67938b86849d5087a87f3437ea29d7b899144fc3e739a4c079628597c618b554468f56cc6745ff6500d3118c55a8171e42b67ca43ca32135672b22286f78d0485b363d63a2ec737d2aa98ae602d3c485814d2c195db5d7bea8b3ae5470ff7a1e8225f82d565414c6b59379cc5b26155f682f6098795c52e3e8acfed87743737c1bee0ba875a95e9509d89f3667d741cb3aaa989378a2425a0e5f218c02763de4345a208c5bbe4949a506dcd5b01c5f8f4ec5f5bae6946c95ad7fa4e1e5f80354b5112d882796092029150d5d6211c931f81fc67b2316f99db7f55d799363828f7de74b5e979fd7620c7449132d44f3029e1be4e1c0258c3a22ff5b50b2674cc094ba7018da2a61569845c17d26f +ciphertext: 29a04526a0c95d33c0ff721ccfea7e7c15c88040d8cbcc77759871674a074b97bd18ac3918db551fe069642f81f09945bf219c631d070369d50a317e95fa46599a058cc549b706584dae3d4c46e697876303bfedba4a19d83dc9bf2b9e0b6067303fa374b47548f70137324d1a3b0282af3e58909f5fd542bdbbc224cc54de3740e9e9f97f027e065e26c92e35c5ccecfdf6daed38b5901771eb81e6cd1ab7bb2e1e3bbb4293a64851faf9b0e9c9737710f5b38262ce26c6e01f5ab14d389bcf5b529d1fde7d8373ca6b9c073cea78836047c35f95e8abae2633c883069e77533db76dffb6a736fb2a64bc3189f9a82153787e03a79621c57fd4a110d262617264c94da4b7c3178f469790a7d2b0a6fe1126294f798aab1a41af2ae9e348afd7af13ed805228f378a4582810753c0faa9b7caec913a32275f5b9b67b3779e268bc93db076ab774c6a171ec6733a61373407707ddb539b8fde040ec617b841d41dad7bd094f3f3fe46a8953651e58ae11f0332c4ee155b9dd3330a910d7f188f12e823016f4dbe751608e8704e2508cdc0ceec8fb9ce26f792d0e2469e4b24d275d6f020cb39fec52f92672b6935e15a8a83a64ac080cc4f488343dc3d5fbafa73f26f44cd1608f96c799336d84e4a82c9c06f019e49ae3871ba14801d43dca78cc6a05978919c9dddc7e8371546ce205b9cef943e939586a07762feaa427effd373a0affb7feaa691b960edb8abdee3d62b6bebad516cba6d6533615eb25194c996255bf2c6b04c8ca1a7d425f1ecb11b28b2ba5af11d4135092de06313070d14efcf6794d3a200e05a398da25149c7635487d32e74bf69491d10d2a17b712316ce5629787b740bf77673e9cfe9d7459a4125d4e0ec93f69e0318f0a69c36e597a65ae21957a6cd659879b3a6a9d5348eaf378ef2b3efa893025b906f2b86bdfb1d52e00b64b26701d4f3a88a50c24a8a534d70c46c90cc1e27851c11e679bb95de1eed93b827dc9fcde8b7ffa43c98029877087d74e6f0af2dab01aa4c018c89ba3a4b0cf0bff09c1f7b0332d15c8f929dfadbfbb2d272f49fee30b68bcfbcecdf22b739d4fe9e9033b94e545c1772114e7cad746f14885a67f1ae72a94cbe4fd6087efa70b0f3851eb9561e8b737897022b3592b2562292e6fe82eba945fa2c55afee464753d3ffaaf43edd0b1342f9f8977fac2e2a00dfcc3954c3df9a0e482a89166224cdc26a29a682807aa24842db39d7c867fe2a59d062dd7e58174e6fafc0d0d9fe9dd1bf9df791feef3dab0d3e1e0f51daa5c2a007b3c2cab400d0da44c7c1339c403f4a0341fc73bef02339e9f1447f9de95129e3442ceed7adbaf470b795d902995541333a1c9ed5a3ad6ed4a6c7ca0bba221a45e7e640880185470b1b8ac00511d455670e55b84ccd8097687729c293f8932e608d279dc0bcecc77a986de4010290ceb2a28327fe93d7e191eb4f1274eede3ba1bde770fb6c7542cd9b3147a574ba092a05298299d6968a4585d727d0d5cbaa60d0c7e165f20ff50fdccd56996940f8173d9887b75aff72f16ed907fc5a95666f22ebb127c439375257b56adfc30f4c06585019f941636429d8ec9740cba71da5fd7c4d76d0a0e75d0b024a61b8ab66881ae9e48f063ec6191592040d896be263c4b7559d3d2d218d11dc8a3d4cd8c17b19e321ad796e9a91d69e2dc9c165be0e35825ccc3f83bc1390f2e1edad44e16ecee5eda90ce6c76a9275207469575b11c113cf045496941fcdb646ea8766e98214b8b2ae1a43ce2d7163df57600e6be191c60d65b36cd15363f55718fec02d3e61881aaf99b7c6fc4e3335c9ff93fd9a4072af723a0969f0be5458b29c5a2e7bab4274bd90ab0e66527d09fae43ddaee47a122b9610e39476c0921b84b7f3fadd309cf0e166eeee533dc99e7bf38f3a03c4eb8aa42240607488971f9d7283769a289c4531c37b90a2487aa9ff876cc2dbf22e340edcc0f71cafe5ccaab8628c024e4f3ebb2582e5c7f1483b6a3c0384bf9c75d0be7913430f876303649e14c43d9e2fbb83f85bab7f2198f8c6dd01f95c09bd876c853b041fceae938f138068ede7ed1f2f195161dc657fcc45c367cccf9cca84a1d5ebde17e33e5e225590bf0cc4407929ed5643765ed351efca55a5b834a49a482962d8988473165887bcd57f89078a3fc68d3ff12fa2ed354a23dfaf3d189cdd7831 +result: pass +shared_secret: 9b93f91e8134042ed4915b713269a6a3239b08ed049def076439151344e508e8 + +# Official test vector 19, seed: "822cb47be2266e182f34546924d753a5e3369011047e6950b00bc392f8fec19ea87c26d8021d377df86dc76c24c5f827" +private_key: 2b8c2ea5542d9e3b90c417523f690109007c5aa97940102ce5ec7bc9bb471726b202d02e4f871062c281d2a095c4cac14d6b9ade99421d2599fb696942f6b74d349bc23a2099f687f1a3b1db3781095615a341862246b29500cf6c3828085c8f72c303ebb9773dd90c37d1001bd70e1ba70ab99cc2440a6d8b841314e84c71718c1ff802897abde7694d49e416090527a600b2ab4578a378b0cd9b52308403ce5c5ad198bcc6dc0b3d5bba010ab9d5c18ca3210111654b47fa504cc2b34ebab1a9e328fb963b22491d5dcb13b5f46b3f43669101483e95aa0bfc83cbfbbc6656269d900138dbc252206fe781b007b3c2a26740643b0b9e6cba3d83a3546b112baa3113fc5ce4e94dce8abb1180564c6cce9583a703da022d20a14489426e6693ba2710aea52761173f5f5379ca711df6972e7264b3c8d2805fb08880a6420eaa1a060476e792562cd3cb8a768d2ba32402b2659330b7970a1ad3782d670486e4e73a6cf47938549a8246991d205f4a4bbb8f977ddb3c8f724110ced267ce681e1240ae0c9674c4e20e4d82194a1bb835e1b56166cac3714e3b42a60092bd746665e253933d6786dfe6b95eb9a98f7c299fa9993d803755e40ef80aa7de893948b5bd65366288a7000c6a5c3b7c5b00d7102ea95f490bcda8d6ab38520c30e231a449a69bec79cfb80dada50739f83a85c624a1458c135875a803041f186fb6c50d2c0b657b59377bd2aeccb343b56a7a5dd2466fd902d5b5bd3cd3557fa31465fa8cf9ccabd05a24ad290988355ee1318789fc81e4d112cc797dc5e087c0ca19d5e8b85c57463f456868eb585a188a27e51858f8cc8c24a9a1b47b38934e07b92529c0722b98ae0c3ba8d7f329e19c0f6e8092acc7c617fa145c37bb477501c1919b26b041aa6641362a480397c5e0441439545deb6b5c47d01539337f523ca078c6543ed9984aac812638a00fe930a07b56e6859a20f0ce54617ee6b8395867319930583309a67530aedf8018b602536d33c98f81b7a7b6a252a00073443c9ff4bdfdd87b3513536d93c908188516749a28a92a410919a2c803196b1e4a533cf8133bf97c2f49fbbb1cd19e2f3838f3d05fc8e5c11cc602ebe5a2a5187ff2a74025a7af16075fdf88374624305c191116c9bf59dccf9fe89e86f007a6e3c0b0dba7333bc4c9733214bb233e05c8a033ae93e85bfbdbafe31260e8f7a5a1abc9da303fadc8697a264012900fd1b713f8da7ac5ca8f2206be63c31c5fe3c6f6188deaa31d89502aac2ac5052b982e3a75b385ad353c9c035c862cd5a6290076c959b11e6a4832793378b9828b0236e016bf6817511dd9a86022cce5182f660013f8b2a036a993c90740a6a5ae2779724a60b872e5bf76c78a6d95997397bf1092b2827924db015caa204bf23710da941e0d3a1a05458ee4386404aa5ec1cbb108925ac4703048a09f37814c78e63fc4b31f2341c559222a6db43d50bc12d8c88962cb7e9149c009414c519721b63970953524009b8be2ba1644c787edfa0d9f9c0eae722037f0546fc96cb333a062206436dc21f6806099bb5fa43879e2d433c9e1be8b073076b1034d062ad0348e6213176960a90b7ab4dea8adb0ba41c73b2c4be4c0a06200e3a975042346b52244ef5334c98189247092a19092e8833ad43096e4b47c50668356ec0bc5ac212e8a1972e40e7029561ad20e33ba29f97cba0e3153b338a09841bb6eab67fce41a86265d6a2899d1b7bf4416ad1ac211f7969914930da09844a2603989998542ea9ec24c0a5d8b01fec38c33e84d51b93c360a4d98d439c593063a3747fb9c2eb16439ab7035490a99793939445ccd33c4aa2974aacb21873a7659a98bb67668ae47548ab98b336e2103323522dcec9b59c80ef0e5c935b697c0ac85da18766b39cc1e8c1319567b9560109c2c2f66a9ae528a889f500e8e11b9d548690750c54ac1785bf998be78cc935bcce9e8185efa9f009791d4a687f131309a0c8d51105d2b650e295abb3ec29f1b421063148638626019525c844974f12a9add84c72e324ea3698bde2b33de8770aa65674f43b861e28e53e54df35040a4a91ac6cc4867635ccb91680d943a4782af82d17c2fc8a3f5eb2af0a1525a29af94d2cf7c8631f95862fce1a401e175de0c3c184072444c10cd22ca9cea98bcd401164c349b35c8b36424f294b11ec7c7d0a3953fec20dbb283ef99a3452496d9b86513e33633765c10b45c6612bfcf590f6036a711eb3dead00067649eedd14491716caed40a3db26d7b00c6e8396858c3916397166d24370b033ee54c3d3b85b5382b1f3f1220325aa2f804bba473cc70b15d443548491416bc1698a5a9c39dea2ba59171f35569ed6946621c1b3647598becbcbbc72a0781c77baa5ba128b1b7053b2de9c122b8790125c50e003a119964aa48392a96b01d7675af541b46b4369b10c38a2c68ee5425c5f6293c2255a19a7cc2607774d342af773a22c3943a9b411bd69a92e1c756993a1a392698a93d5f4772c374b549c15a0bd636be908641a7b8ed758e3c341292598b82a7976f45ae4fb0bc2af0352d92751a6a5e5015444d3b82cef064d32c3bef9b2292571092360e1806b5e5a892586029ab421ed247afff408f7fbc9b5cab930a6896b1250ab1c58ac4231fd6d0bd9b990b649028e4c28e435093b36462e28940fd2723e7bc20e59914e1c812bb3aa912318f15472a64b75c12ba361b2843751611183870a6028496195cd5d219698a89dbcb2c1c06ab2bd5937c1cb5a2da7774bc3facfaa028829f3c3c9bd6c584eec882ccf3ae1b00b1357692ed377f09712a30fbc73f17c0bc462a88e64de262c24e7a7f7c784dbc5b615ad57e58484db23363433a4680126c2eb5b9152c162e3277c0bc4da9693b22daac51a1c6107242b7428ac3f21f2c3968810435f9aabf3c65b7db7b37361218b49b9c76695b53c9a227963ccc1b60d447b3b7d15765bab6b3b73585f26c2f0862c927b6f23624f360a4f6c537b09563adf7a9616a4dba03732c707fed845c35c660b5317ef652055843cbc28ac501dcb493eb5d6bd5c322ea2f2a8b61418b9788482f51b8135f4c1f1173895057ad3218387d527133890fa3a9425d73ce03e1879b85a5b120285b823501487d5c555ed2b7bfac82762b9262d3d4b3b64736497899a768903750bff4a82e6a0097f3c230dba5bcb0ac95006852bf60480d039d1fca9fb758b5562a384160acd9c489a3b4bdbcd96989c57eb7a411ea3540ada882aa567fbb340b518477839925577c780953bafd0cbe2803626b89cf1c3b3056c4bd78c88818211fc836765fe813c7b18e5dc9725978ccd9ea8c7e1710ddeb883ad93e2cc987024b817c30908ab1ba7a658399dc931a4ba4fca5a10398289e9718e906336b148c328c2930b843cd4ca0d4735b633618e8c1c327b29596c24bab053867747883231f11005ed6987679544b51c45d42cc209b7061a91a0c82a92c943c85c149b79c1a190716c03f156d3c22ad27e7b8b87962c8c5421d3b01c7eb2220452b22d813d2180e7a38be15b6976aec7659d25b60d3c780fa75c3654d7f9b6de0d33c8c28c97b6b95bc8c2cb517b497f73a98c41a64f312fff48fcda7b07e86a8136c05720a8740d866bc024ca1e22d43f6470c8a38a7301b3ce74585e6ab8b899b13ea39c163ae79e764e0b846fcd57029a73708091f053212c6f93f1173a854b26d7e49bfae38046e43193b98460d171fb48283e736c7a1651deee6272387cf65ac876feb4292bbbc9200981299c9bff13690d6c2017bbd3e257700a111fefa33072ccc8e952263e4867590c79b558187e3441a930964aa3ec0441e91e7ad198cb6e8959a35051ddd972a43a020d0f968eaa8696b9686dab01b9f9b8095522a7b411d486444b16ac4fee7b245f50ba1a26d81457b802bba966ac8eb300cd92773ca26908a91a2e23b21b0116dfcaaa5f4a57514dc2ad736cc788904c29050389b80cafb0d71b131b567551f6a2e16390c55234e5ad50080ea6268047618b333a49795b4233bd07530a89c275bdabc4ec99d84a812d9e20e2c27072196138386ba42cc4998314905e070ecab69f2d12aa204a32ad28658da3fab69223521b81461312cf88700a49077914af3c28a2f544d608209e24cccfeb46ae13bb90e8b86a4bc85d5f41a9ada7a957ca8763acad6713623ec20e2f199b1270966432bf2b8cacec65776d8a63a471cb4a7c891a01bc92c8c28719c3ff9a8a7a350d9454729d2ce932982e94bbf30b298b3353ca6c459ee5017fcb724ff430a9348b9fb46abc86374b245668ac71096501a7f3313823c5749e01d0e40444111bebc0a6858891224b08cfc8e74c41084fd5c03c102480537c11d5e63a349785e242cc58bf790539d3adf4844176afb3ade1db843a9e6ae9f1c0ec046899a777655233e4e1b5ca44e9afbdc67964bfd5d5e3dbb45e60d03cf +ciphertext: 63d6fa95398bbb5cc6252d3f85dd6b4237aa349b547e8e797ef542fb715f07e00e226a4531c7e73f37fe3e087a03ed41c2f0959aac4262b2abed8ba6c6fbec26040f0eb47abb84a3c6e88ef2f821cf78d4cc51751083006ebf5854086c9d3f0faef0debdbbc1010af6288b7aefd203ec88e2700da503101b6c470267e109e96717404e2eb97f499bbb6749bce23274c649b25ad90bc7829f1b63a4b2c26811fd9add3d29d1818f00969f73f1b6afdbb68cc8423dde3630c679a0d8c934410287719c7ffe1b6eabf4415d4f4e14746086a22bbecba104ea27f7efc10a40bb1a87872ca72a80669ab1f02956bfb0311f87173df960b2417381b34cdab574efd7f4c884d879606684d344431c57c1b46b07c8bac3243e4969f484b9446946c7c0af4e2e5e05ab87f527290ff9fae3edcf5b8fdcc0b3de2034f26a19f0844839fb26e790e38ee44e21c9a01d96f4bde5296e021ec68352d938c1ae66154b6efb60ac2f5c96eb0c269b0be10f4cdbcec80eb739e7d4c78fe410fbb427b95cb1c09b7eacc303993a25b38aaf91962f4046597da21956bd98f9575bf1e9fac24bd420ed299f8940d92988a2f44647691c616542f8d617b19363570510a643dccfc58dba36a7aca98b277626b56672d21e67ee3af62b26921e48c2b69b766dd6b30f942a7025762554c9bf05bfeb960e0696bb2c7b1fa05e388fc5e5f495c2a853137eb15387fee4455a54dc30aabbbef10018e4c135df1e6fbf2d5c2399478039eadff9151e9ad56f8f0cd96eeb6423224df09df74438176fd5dcaf7e6db01b89204ab099802b94755c0740975198a4104001a2724b9889a60411997040938895b9b7d6889b17d0f79b97cbf249fe33eec67c1d77b84694979ea0e4f7b5979486ec187ece4de8d017b01d4d65ac63fd0c04ae5d5c073b15fc182438acecec41bb9b277157a2d023a9a73394491d65b3f103e6f498982645da202a0c8978d4b06a406f8561b819a8f4305deba7a8fd67801f62e10445de38d45b487075ac0eb698525ead41e8a10047625922f197530cb6ae8a1714265d322f22fe4fc97f74e585452fcfbb49815c793e65585522847ed4cab843e416c777b19958346fd716378bc78ac25e6d2a9f8f81f504210918261cb8afaf27ee2a97b53a9e044a17a3bbff44b7e1cb843c01bfbfb7d3f3c014c430753308ee60ebed89cb10f55541560473b4481a4d7d414d6784f7a6eceb2f7b68eb8eee39d093b7f5c98243dbffe414965a5eec8b9c6eaa79885366ff8f414cdc290ef8a9a12f89dc48aad20325376e81ccc707fc90cde5a9d8deb4dadeb06a8867e3f0c9589798950be6373059772a3b9f68912c227a37266f34d5bff7119a1dba2fb43596d239c8367f5d3aeeae8c1f87dc2a84f629ea5cacee50bba554cb1a17ac7e8674ad6d9ab7ba149b621f3ed1889e904248f63a94214806a4fb634ef53d9ed39e18eadf6cdddfa7e88d897943226b7555ff9b0773ac7f538e377cea881c5561d88fd8346d21931ef7eba7f87e3da5582a7939cc47bb5817edeb8c369373bcca25ef3ac10aef2f404a70abce312a5c7443bc50f63d516e9b151380a8d57ec19a65c3926ff2e5e5e6be8455bc3b4bc543cb0cd7d057966ec422d67565be74fa0b6534f90b4271d2786c553839948b873b2dc6fb18b9e045a75cac00d98fcad5098d24014438c717174a5e62808d386eedc22cfc6ab5c94ebd00b164f0c86fe25de8981850ad8d965db545166eab7056d23944d0d1a25fe0a77c33df334ef7dcffe8ef353c724003db5cd42e1d80d2bfe0a2531faf2c5d8408608ba85e1535f4f5905770559a069167c1b5c90b4644e4420c3ca700a33114fd71dc2f956c958093436b77805781da06bac77019fa8bd04da156a4c595f33ae5de0e16d4435b227c9d2783ea3fe02a6a9d273201cdb9601da483e74d908ed10c67576dec23164e33b890fedff26cfe273e650c731df6ab11d010dcad78a92de3399f4dfdad418026460eb361b54cc4621d8bbed1d95de9ae21a0aca3d82c33848b84918ebe928024b2e37217c19ef27b80cfa368e439485886009317483c380dc822a3cdadac0e0f2f2fc0680ae72792a4907e70bb5a12b02ce1ce7c39af82880e6fcc0fb132cd07571aa16e94926e0efe2336018e01dc021fa99588d3c75fc31663e2a25abb66e05ee2034d642f4b2cacad9fa5ca1c15d7 +result: pass +shared_secret: b616ad16ce3e737184ea0f5b25f8439ffe0bbe9647e0c2c725d23d4eb2f13464 + +# Official test vector 20, seed: "81401db81138d6874e91b7c11d59596e4ace543f5a3471b6fb00999221765fec3ca057abe20f03b2d59003375fd71fe8" +private_key: 04a39f7840ad6e0c41084136f21609602a0a00cd8e0fe0158c1c3c27845ae6219abcfc95e72814a9776655841e46491a9ee342591133569123d6a09a54a8a253a49af9b27103d196873622ea93bd17da439e88226a333da9c525b856c7ed53593a002007235d84225fca027493168f9748c4384004d873abe1bba69212c7fc4ca89ec745ffac84b99c8707860ef798bc1e7c4f2f0344542054f3c46dc72a6f9d2b9303e6cf114040e136087b66af5fb47ec6a55c11c02acca23f306a7221f3c81470714a472ea822bd387cb29de9ce4bc96655d63e1811c93a740e148c994e149554b24edfcc6b4878c55570971d95576acb6943c6532cb2101b4468cf578a99348634836174792758c350651224a2d22647446f67a056180ab2afa34ba27a76933c9f4f3447c0ac6b605b144a2c9f2c626e8f434b4f35ccf894327c53a7dab9009d5a9a4e7bbf0e6a22d4f120b0c42ae4a7c0ab08774cf8a33e069d4860655cd4bff1940a22314356e8525213c351688b1a725a673918078031ec37080956973266811dd8ca275c9a75fcbb7b9891c26a3e343b36be5273ec946f42f70865bc48d6238ad42b616c11b708d3551d3b9dc61b653e06b1e6709bc115256687af92941b2fdcb99948184b025239c89052765b3d63b476c3a4df499564ec0749a03496040029da776d686dcf9984ac9354c2c69f2c3c8d3d5774201b7ac0254a891871847acca5099f89733fbe2a4979dcbc26f5c38efc5129e083f508441dc6c7eae73b1e7958671767968b180a3b34343cca94289fe0a8788b1cc8394c5710b9ba6fac1cf3147db32c9060a9cf2d056734031190b53ae17917e40907b61826527c277344c8bc475451414e00e3cfa6c15400cd5a6875c7b2820702706566a00460acbe58128e4c869095160fd0dc303ff8ca68a8947e3110c626c707da0344717297147aee5c39838c0f73ea57f70308601ba55e977bbd7b681e0c4c1cab818aa156eab24f74c2b66ffc8959c3617f92941f1c0935d89702c71f4d76c44402ab92310904504ab5f9a002c321b411bead73a819e02d006d8ac368bb89231af85a97bb6b0e23ac2ca869306e9239d808cb24312c48c4624c33537a8092f6e8c147900894f3838db9b0fc9419dffb6e78127e922042fe4a3c20e5c48e478bda52a2bb0a85612024ff5c92801ab1eda82de8aa6442249ade4b6bb9886015035d436a855cb495f6885f6d3084f498affdb17272e127bfc3bacd3831d06c20569b92fa9b90278707c995b2db1b63a423a997e37a244c763394b9b28b3d3538c981da0be1556696a7330fa83882c1b7da6668f1fa5841ea5a984b4f6f4869356682b9652a842859bf079238a83ee3d6b01610270488247c6b5e63cb1e4336773231b6dc6bbe6888345a0ab5cd27091442786f2313c16bab398356f1899554c69c4fc09c9a720fdd8bb1de03c80e5241d25559fd7568b321cbffec8f619403662a61c696ad90346bac979a7e446e41d5582acbb5e0f70aecc4330a550854e60eeb5290198825a1f01915bb094f10bc0bc29572430bf8cb8938a4c182698557ca49ba9b7494419640792c3fb31cce70aa2ed24830b65efb3218052c539f2539dca01532513717c7bc552179957671275327ff44a79a49b92f343a533baee4e06caff23d7857ca540a78f886be136b3506bb080ef563e8a3987c083b4b5cbef410ab20213af7807d3c52c58c852dd48c4060587ccf259f00f40816ea86edd276d1135eec70b990e5c11e97c470d97ce45a3a105a9da1ca768166c86c41474be92535f1bcf7539d09598e773aadf39a5b66ec79b360699e953bb0babde4f0c707b99ce6f5075217a054407072b084b7546bfa95ccedf1666746bfe74c674fdbc80edc35b4769f5fe08632aba9b5398e79dc45ad014a8ab539c157b672eb74757c6632e6c922202590a27dd1c82527a36287e2ab7a327a264abd300634226149513980b9dbca957c1560a6c32a20328b6926c843b53c635719f635edd90f3c5313ee1766563a7a9ab6b011462558b229fb913179a438f3b5b2f427adfbeb90f73a2ceb190cc6dc713b83afbd12a54b0c170cf973367b11db2cb3e5d880c169041732a276b93056e4632deb8606c276a0897116a0829482bbeec870f18c247309759971c4e1702117a1c1ca6b5b6bdabfebac339a5c121792056c508ff99588d292cbcc1760f1eccbf105281116a623c600e87b4231c2a94689133ca16b6d99796700b917262f4d776d10709a26123a5af9af5ac7455882caa4d220437271aa5c9e30877a3cb263f9048a483a826774c806941939c44274287b629b2bcba56f19e7aab2b8c6a3f72bbdf5820c774c48a151c381a5a75c27337c60c406cc1ae36a3eeb25d91521918a780d75a69f94aa4005771a5c22ed4466811834fbb238e6351fb055a70c32994442297f273752db6f03f445804c0cdb380f838c484c50250bb2c849e308d8f608ed942442e85bae7cadf4c6c3a49cc1cc107ff32154e61a99df1244f8f956c678ac4192aba83b5485f284f1510b816c26d16922412738db9796cf6023e558741c7ca293eb35fdd71f9175b838377fff3050d447a35e208027881406446061686621fab300755a15921be9d24b721a50976884c76ba928405ea9e6b7b357baa68674bf412f66f54a454c03fc2a64b1c1142bc56cc535911efa578c5a097d8301836cc641e078bdf1245e5359a0d7ce3a87012d199880a3ab5d61753488782b9734c26947b6c925e4fa6ca38475905a9f45a88221db62b762b4c884344cfc7d81e55fa34293dbf49e4e8bce0bb95408b32bec404a245c153042a3ebcbbd8598a3f9537e1403319a5cc6a006a37db5a3fc4960ddc5381a1b0b85657d41d085309b47c9e21a0641700a14150a0b3e00823e76c6bad867c6f3e6568eb840b9a9c4f4f45d35e733ae56377b9c2e008b66f9436b59320f3107aa43dc123bc2a89637637dd3a26ab0abf355c0fef642632523611a196e2402ac16c38562a0f8c65b6a0485dee1492ce2494b7230422abb2d705333d4c3f4e10b28d3c4b3266949ca4b95062e3d600caacc77655236181208c0dc4487063ccc528961661dc0e474bdd88faceb2ec448c1ea8a6f14206a33195e30fa4efd463b7f438ecf4ace66090bc268b532b251d783bb380380e12a79ac044bd72c0d9478018d98b6e4e36f234142347b919601521365665ed05111f39698c43f5b62c047f1ba861a91a1e29f6bf1b8ba376280db89feda41195a9564d17c73f4305d73cc6a606530179029e192352a5aa9e58f4df6c0c9d8846da4518192bc360544f734340c9b072cf399806906784073f622ac18c766de49a65df56b6ff99a6e896245c7aa5585723d1c6981a0ad2fc09115b8b8321941961959a8e40b37c24a66125810223dcfbaa093510bf0b9c631e65021d64bae6bbe847c7576826506f73493d19da8d47f07898d179697aec0a1df3cad227cbc83c33c6b72b450731d943041f79136d34c7f039558468c3de1e3021e509a2d898ec1245fa9a966ba457e5894691899521362b7f2d607578b01f230365a84c7ae1ba12ba53c1e216933a34e53e75e252c52087c615fd5ad705743494b10042b033468af0016274df94f2e65048e9a4595a4b541b082bcd96e6d90a44af778077007c069ac9673cb4a559820a2a9992c4500da89f5acc48a6bc9ac1922be9c211f36c468986d0704121193ad5e2732d693c650d867234c9c261525325157fdf94d89eb2da1949a627338c0d07b1cb9cb45d95b64b38a22b029bcb87c928c7c97984d760bb11b9666271aa914d3cbefd723d40928ede94af17516ef7a72c1fa978584111f8b0903c544dd7c81d94a3b8502cc08b21cd89c8fafb94d9eb57f9061a51e9aa6f3860ca3da018dec14d46981062b8ffd542747e7c83cf815989117ac14ba1654be4a92b396b01fab274a082609ed9c685f125fdc4611cc8c00167a8be5f28f0867397da186ae68a29701b4c1885235faa006d45d30b990d13c479fa5b1b76ca2406a46a0c42f9c63cccdd187f5e93b16f20bb86b5251b00842d28e58c86dbca41ad708a62c28846d0c983dd60dc4f5b018017fb1276eaf839a2898a8caec69f11037498c5a621c05cdc5bfc9ac9dde250a7c4c1531b813b3f84e70a43baa43950a9cacf07c9dc6c8b8c4a660aee6ca67159a00010a3414c87fd94ad197856d9940ddb47ad0d8700f635e58408a5af8213fe4636fcc594ee677b3f205e3552202ca8087922402d24ac4f42fdf5c99ba1356f14cbff297192a40b48abb531912b8f853a07bd241b19aa1effa784e5746905449b1e7436a79a28e3f712507e5bc0d026037001723d3443145bd066cebaaa3d000c9f0ca5955b9c5a4f2ca172535d5a32ef67d54f334bf726829082485a7b83d43b46b236590a2e5c7ed86cf2c5c2a898662bc9a81418720bbb632ef9cf0b845ed052d73 +ciphertext: f605d7f505e0fe8ef088c83ba4fff503ef6cf01cfd1ebc1de439deac5a95f4e38b9538d124635bce71eeffe55f70a3674eeff62ad618bfcda3cd2af15ada072885cbc36b5693deb6aa5e9391478e37f43a4993451a1d2ca8b1c7f305eec6f33cd473f5c0c32878f04697a215f721821adf39a35f1e6387cf545e34b2e6e7752e0c4059d659c93224110c42abd2d7661d1dcf8ff3c911b25eefda9878494336447ec650b15ce1fdaf1895b55b53ad7c67eb2ebfaf8a9851d0f6456b79486a2499b1cb0053d3fb4b0e2a71cee95ebf420cb0cff6fe121717899dff28bccd41e2a501e5667a502491cade70d225666e4a37a543a6336ee70b6a8d0a9fb63d4c5e463b54a0057e9b787b4c06707fdf6444d6fa1b3c93c31761b30b72d8c4d7367f97d50a466af778616748909ccd7e7728e4a4e572e45dfcbbd4527c11adac3717ec369d2cfec6dd81ae8242b82c35abaa7c960324bfad3f852b4e6a322b90e9dbd614c233cc58dc0fd676106990460187b69d33e572e638cfec27c025c507cd991d5282c83b48871ece91b7255e9675aed2fcaa4199a429a6bd8b83632119bc9771bfa14480f3b37cb7df7f80455df8f9367c216480c3289eeaadab9aaa845f5d078b756556b3cdaa03c00c984a32d3f3f06faf156981a26df5e3f6a02fded61977e366c589fc795baabb8858bd8bb371b12cf4ba2c0d432df56bd431d7a218067eb2373c1fa69e3a84b7d5678119c57ab67480931a543fb81bc087ce99224eb1a47f9d592a874d56eb0c4330554bff08da929f9e95112c1ee6ace229983014efb098b074df89dadb5eff8b6bdd415a1501d0611b6afb645a03d964ca2ed657e8140c45fe6e2dcd77c735b47c944867c42cc482376fb901aca1b16a2206a1a64987a321e7ae1b93f64750a3c3a2f409ad5415bf829c7721d39326fcdecee96ae1760e0586f38966e4950e7aa8ac7d7b9a376705cd7d00c7dd16f80b2f43e51494f23f4878a6fecfe78fc829fd434afd2a92926a00db7374bfd914393b649e1c83106741ba515c935ab17efd4cdf2f2f21266aee6895a863d4ec76e664ed6d4aafe4f6a93209d65bc4e07d1da5390931f67b258e815d7e690382fdc30ed24ed71a4ba493f414a1bd819e03954cee59536f246f491d041fe93eb6fb304c73efe1ff24c7d27b1cfb13434693591dd1c703253dfcba6d2f259856c57ca3fff6e3945944c11572e639aec5251d5bdcaa95cdbb42c32c46312cc8da6e4cfce716a39b507ef2edfd550a4d3ce610811b2908e7921c86edc26ab8ad7be77a218a5196a0f8f7747f82a1cd7190b3c5e2dc9ac9ccb41fbd4b285c549957392d305fb73a5a383fc1201488e979e15a96ccda773a0cc4eeccfb66e1a4c0682d7d5999a1a764ad7d0985e9232fb703c7621e7ed0c8ba06f772fd64e29e5f3972e49326052807179242ee5cf1d56120682c73c4ea48c135024a3c75a62bcbe17c44b6777d0c3069589bcbecc80c056bc5643664cc7e89ee9ce5df543b1592792a58528204bf6981a62eb5f19384a735d040dfc2febecdde5b7aca54031cec4e3919e54b2759d61d47d964b17c4744df220d86016a73a04189c6ea4be973191b65cb695d9de8d7445401fffc8653460cf4a21f55dd57c740756a8675660c71e5c47dae0d2063d68e355747bdc3b71c743dc4f8fc6e2296bde795bdfad9e7ef9be2cab791dc2862421716744594a1f5a92630a913779a0bbc2dc8c55daf05a7010a24f81faffadb2c5490f42ba265242d34698453aa40788a6def27a7dadbe839e4ccb23fcb72c10d7748a86422dc2ba55cfc2f79adec0363ee4b8d2eaca8a0b23ad4b6a26c8193b9172ae25eaf52fceeef855a4a61e4a0247abc5a642a435463f6ade5fd978328883966085aa2371899f39a84c18d70463dcb9c04f3459426f43d3e23e3246baf6693e4fd216835be3f5f9377de1d96c7d7062d0c62a700b24fef99c6bda9e8f818773ac4ca5dcce6880d30c9ca28191a43629a020e57a32c04b3e198006f47a8098ad93fa697548c33d02ddb81578504ddcacb3693afa604ad00edebad0391c3b73b4766c3ed02f9025aa39fd4c368ae961d44114f3f8f7c422117d494df0b7031349de637cf57245cb4a818d95ffcc488cd887b1824ae61d3a8511d95dcbf495d9003b7a3ce53465dc1ec6fab9f6c0590f76372a6e51e00b8d11135ecdfbdfe2d89 +result: pass +shared_secret: 634ce1c824fa766f69c30548e34a772e828248e5ea4c4a7780ff38e2d7d3a4ea + +# Official test vector 21, seed: "30b5de5b73681ec08aaa03f6f2d2169525d25f4042a5e3695a20a52ca54927b85f8bb948fc21df7defc3910b28674994" +private_key: 93ab695549515d75a2caf8a97b8974e75407d5e56416d3a3010c304c99aa39d468bdab9dab3b87db1c27a2b831ea3595d371039345c37a892328287cf39255619494927828d95a7139871eb99496755ab3b689969e907cedb05a97c7976a31683f329fe0237798f9387d5ba11870cf6dd01668ea8d0a74c0aea46e13697dcc9846b1a8a9f2bc5304378154bc7cf8ec2df7f070ff06b085239589b1a7ffd13f9653a821767a36a8294fd59793abbb833b09d6e09e71b9062dd3055cc9a04fa0b8e6d41ae10001c18a398ed85bf31218532271332c73cea3862867081a8b2c610b1785412be3f42ea64917d3ca6779ab6581809d5f0412f579019a35c6ab21a4f9142f9d2a4b0c731ab447a002c7029b490ad5c1372eb6483a205fedda376ff1b432430e1738b7ab9531bcd48b4da54f4d3a96a00c718fc809303c50d1042b7e49457c9512e4f66e6b75415fa1bb6b23a1edec751c60aa619473b9c489d6c5c4935380dcb67ff7f59d03a33881b60818a12639386db06c6ee6313f98bb8c1163b2c8526744b560f1d7c672250258288a78761c99a8aee292a6b0b48b80d2495684891a28bf0c226de929b8229289f3e290d21a450901659c404e0b9c25a55c7dc39bbe070203c85cb3e9708071f6cb9e9045cf460939f29c321583f8695ab709ae11721924282afbf225cc54ad87c13c56733a21294beca82d8472363a2308a41163c2d60b7c3b42fe1b74c93a6a5146418e58697d3344006aa576d6300728440ffa0a6166514539bcc908cd1b3ba889d9ae234316a8d7709a7156635412f0eb33451942dcdb77aa9b4e29d1ae41b586ca960660e08672accafd847ff9289035e10e05f0c35d5b1a9278615105533c98ca6b1b930f207c5ac3380f2933e834b4e45983a92a1af994bc51ea5ec3e38389d2559275ca3bcc4d7c50585cea9fd145bf284262d458badd032f294050e01422fbe34c0501815008205ec4a8d43006674788a8d3a64c57470c953ecfe789fb3224efd84d4a40c921852056a8cdf43976648429729386e663397f475900655be634aab9344610fc6322a28d859b5214395172468a15570a171096c5401175fbcb0db8ccccc16e5e6b82f7732c2c47ae7d15738d650189b3702d859ee43bb0a0650fa0cc823761bee4a40877727eed58815a64c38a94b7de743688156a18368f7fa9a83064cdb972b762a97ba0bc61bd45650478661819ba109947a9327d1e54b1bee845e6e54efbb51c9f2cb38ae825286c4a1a872d4a0629ad00574d60569d6106063ac54380ba3cda463d41736535b631a3245f6360860b4d75fa153743203ea0846ce423bab1095ba148a18c2ff75222bfb295ee904cc83bcc89d44a82558753e096da4964346470c920499faa392a3c7258c5b17a770b50906c6518239d81301de60bd5522e1168a16801683ea09ab8d083c0250eb1413123164f95a36a5c053e706327c49ba727f00a6000c35db64c01f92f4a746cfc76c9d0b7810e559f9b12b0370075e42153c7f66bd5b79c94f4c80cb0226be6924f1a29a707007d998ad9a1aa5eb7176879b2ff476918732d1a810d456168ef86467f1aae56a673e40921d48440914568c3c98e33f5835952517d6ccfc0206c2cbbb79a43a428a4858bc5200b5735d7809de666ce5e124169b7acc44a3e6b1838d497873aa48b66893fce45c252813ad2e3b68c1c27ea4237841108218b8d7bbb8733ba43c6f6b2c7818b74fbb41e238ba1f5c1c5db2ef8bb80f2456f228592e952caddf6bcac9c362a031bdb4b7f422573cb772115f385b830ca6fa368ac3920e43b5ab283989b3c719e295867539047d4420f71a2ec046f031a43ff738ce87b67ec19c4f284cb1c1cb07938348f17332bea4dfb4c4417d7a30275460e498784f50d6af7920a78a69e070d2786036e3145e1d7a503f188e81b42a8fa8658e30a8701341bc9b7278601951b2caab4997dbcc7c8c15c00611cebd801b2b3b3155433240c6a8481a9eaf0b34f6750bf6c974962210f69a4022471a4c72fcaac2dffc4c603b6b4fd6b4d7806c0c275585eea28b8f010a1d48506b1516872b70c43b6576544b9a19644fc1d00a7bf9a59a51afa318818819dd8b1498bc1fc913b55c573b39633343c2691f6a8af8b65ad05559e1721ddaa391415979ea32a494182483627849169e2006e9306448025229ed2c14ff825a43976935a8a14b8448d6c4db642a1726823a2053f4f75951b80b47056bdae61ab68402d4aea6ead635f2262082d71c4ff5c78e6a6345a72505e23064dd773118ac985e49e4d88c64dd894322b0d2a712f0cccbb506436c3f0bed765ad0b193ea520580be4c12cd65f2406cbe1fc9281d37bed1988d7488f3925244454b82982c49fb522a2f83a7d131d1cc65cfc7179f8a043da781959a815b5e45f6e0b37269c84237424fcabbf4dc16a722cb171984e48864ef70c0fe14c69ee385f15eb7191249bbe3a3888c50fcde9302ac5aac6105503589b3748938eab5614d626c6a301599b623ada44f432bb18e359c7b223414a34945786468628c6579f9b004185cb7590e22f94e83de26c6a9b69702f704041da3ffbc8ce5fc2367a3a97c4b997bb06a01b8964a8534e2f713c289a0dc8c072dfe4a42f305785a99c0dc898d3104e0dcc62c0e600253c218f0511fcd94bf78497b03a08efea8bf7fc0e45d3545df2c6d708435414bc00e64c76a523bc0ac823fb56da247da4643fd9063748b23128c6ce4316bdcad4bafbca77b8ea6c10e54ad063a1433333252311f68c676ebac53aca8fd70b9404c1cf3c979ca0c492198a2f92294ee5ab4a2ed15100f20e5eb948916ca7bac7b28fdc904ab1911afc19a454af45e6a265a726340291bac80cee679e009c02254a6c6130227464b2fbf2a95661bed8b348ae9c759fa53a4b429c0b536fd6bc85d5c96233f90ca3057839a47b068855283487c90a8088e271a3e33f5ae5695d044c4d14ae8440bf03b318549600e39cb9d9d58ea2d2a5e3d08a11484801b8167d4c5afc20c56bf970a230231da8372eab0f5266686b4a3da0ccc6b57cc81aa29053142cf0f35cf0c83282893c25983ca06606cf255cc1b41add5947ff9322a4c23bee47cc49656a8581ab5a99a3797798ea77a1db18c39acc97e6342b8770550212718856398878900d6cc9a5963a71432e5678a12ce86257b0b32ee751eb181fff62ad98443f7d79cc4f85bbc67190a68504a24a3166c588ac7b40fed53318b8b452d1a738e59a2c82442feb013f9b2429b6c603f71619f386118327eaf0c13ea30fd620222af064c61aa8d9801d53192c61575e3448b265ea9987bcc84ca825943a4d51a9cbb5e76e4fe88cb6d92215f60b0941c46b89a746cc96c74cba7b097bfcf27533a46fcd928f49d670f85179e6b598ec595cf39c3554eb5f93ab9707d4a559069d24a4005cf28bfeab0bead80363ac608965141e252de510562ccb5fdf94c30da1247ddc4c80554d879b62d0b49eb3b21ebad10a50794545577be4eab070d30365dc9c34eaad1163b251b223e8ba45dcb77dcbab0a07fa635d8b841179a354304e0d249dde2319d85cb724245877a549ccd8230fac8721d82e8a2182e5cb63285ca8a0d049cc7160d7116d5c1c0127a9ae5fc808eee88e340a57a80964b21a353b08bd35da0dc1d7020d6cbe43f49547686546391d94b9a2b2d63b23fb2fb8c30f7ac371b3a80aae0470d93b610ba1681af1be2871a49419a23610843bf940804483dea0ad8d609500d8aa2426cbf0ca5aa353668a7151bb54c7c4e4ae3354c598cbac6e90949cf6b79a941c541c652351306f810494dc0ae743cedba7904d34c2e0b32b603606e33156bc750bbc477313219a97e184d695c701b2009aab8806709b8d376b9cb6a24f3b6d0a4157398c740d08809328aed069a52fe77cd68b9dac62cebe3649cd1b139fa84f6a2333ab702a30414425f50e25e41bfe9a2e277869e17c035652237889c37e3c86cde41c7585776d14682f3c0309a09c1ed43609b5b82e03508869a7f6b627c3710c58198ebe9100f433ac0df22d03934c1eaa10aa98b88c879fee60596a3ab29739b613ab741ad4518e6ba5edec190678b20e6544f469791c64629657b9b1c51eff1616e29a1b3bc25a55cc9c481995bbe68abbc383dcc02e4c8208ccfb57e052ae86017dfebcbd2165810151538e7a9af3a4c5364c02208428d2b98890923b7bb92d66a2907b5376906a61115c979d4b34670a91339008bb466928b30e807cbecb307becd228657bae78f5869c3463d1b73e09aa7f6274c7fd2a3a9cdb4160da310254462eba30dcdbb5c30542463266d790d0fd79c3c76f5da348753312e4949ff2955212edc46dfcf9e6c37a1f40abf556c865cd096c702d21239de7c22713d70626f1a3a4c4cfbdf3faca62b6591121e25d64010c25a18676033e1d7278ac5f2d0b43a31f3a4156ae710465 +ciphertext: 079c990481efd07ae4b9248272683087f09cff5301fd533ab46d3391764af358e5d1a0a656aae24c92bb6e6b95c3689ad3cdb2ff9a7f4377f9dfe6ac4a56b996d7e1516e5d2127eadfd3a4a02caf6ce2b3d7d0cf37604bffe3b44c759231e485a298ddfcbfc7ed7d7d9bc4628153f47c06410e5ea8d2dcbe4178eecf94af9315f446ce0526005556fcae18fbdf92200fcf0bf528f07b066e8dd7154cd1d9ff02fed80e7c23213ddfa05698843cb3ee4da7de296f7882aab57b39cd0bd77d4d2174ec9e609cc8d9910dae1339f5b3ff84ada38c897d79771258450f00653a4df57e61c653819926307db435c67877e3e9d0990f8ed65e6b72ea8aa4512ce96c98132890449569bc164df74b94e5542c1ed573e82b5eddee80a2843478d77cb4691297b4d31a4ad9c1130aa9a98216a4e20b286cd109871d929b63404ac069d065a40bbb6f48ed46d719549562cb70e0c97a2885686678d4b2f9debd38be8b8eec6b57d48ab39bbc0ca7d859c090d1a45ffff9889a2e0deaeb28f16b8bc5870976ebc16f2fa9738465943942f30eea8510f3ca526fbf3876330fe9acb5e3748e04fe20cc7f170a9bdc2b55fc95d489150c677402f6b894d084d2b80051f093f5c9a9e0dc0dd0fab7d4b46bf5e6bd304c6c1895a22fe9a8c3d6b5f8a7438e93d2aa50a2da9b9b42909a54603ddd942df723c7bb7de5cd0920569ab8f37c5aeb7cb03c24f2ae8f6227454e298219cfadd873b9077b2cf8368cbf0581698cf6706f1001407313821d1d1713c9eb465aeb6ebd83ae07e57cb1de96606afb1840bce415a775070586812045ec8d04149f84b032767632c3d29c6ed58c8d8d1d914fb3c66338764e44b1be25517dc39d20d7c0da787da0a700d6d49edc99944f9d37b5741601c248e5457c5772d6455079cf0eeb4981a7d33179f99fe8e2263db64fffad5d7f6b9e2ee0a0d2efad1d7432aaa93344059847697f3127cbfa062c8eef3203a21319c3bee0c21a2ab0615ed7dfff5aa1f8ad3b13b26c6f1df39d5b7bb80d29e0b4387faa2322ea89d7ce888061fdd267b75926e128e31c6aa0f8cb6bb2e3416652c6ab631fb5592e4c9526fabb948d53136bfd7cdfc292375826e55d11f2fa160676acef87bb052677ac22590d8c1fe8723434aaa2ddaf5c12897e5c8c5a241589146e3c0419eba3ce0fcb7c2cdd59b2b936a2ac1ec4e16221485bd4f8b477356a005305b987f179e690d6b853361692f605f826c46b28b5ac821d7bf394c477e976645727ff07642f1f45240775a766aa9cdc1883b0e211473165e6f7e8ff9f8b2b6b8b0675c13d1c6052190506cd583b02d961476f9f142a253908eef2642b882f866828e9acc655b931fd69f327aed8967356471e145e9e1a8a40694aac47a5f6b3aeb522ab90006ca85d41864c305531ed12312071ccc9b05e0e79adde137e636832a0640b3d0577f08ee9621b8154fec9ebffe7ae0b74925163a6f6fd1b069e8c0083b8bb6d0c9e741a0c59caef40af376bd1a3b9a7e71e322cd09a2bb4c218dbfae2fdb6c2f70a3c1a784ce9a0140e94695edb8f9fddce3636af525a0ef75da4be60124e8cea81417bbda781548e03f05609850e1719ba2bb4ddb545bd279cdf42d89c13829cbf730b5e74ca68438e2547bfaf9040451c045ae998e9a0937fa9913d0a7485a89cf8bfbc6f78920d788778f27f7eba2d316aab1923ebcfbd62dcf592a731c5626c89b6b76893b9c16c2d53b8f1ae0841bb2562311fa87436b1981d342d95513f309b77279caa06b14b76e4dd6c23e7f6c482644c3af40d3de7a76a2d0df8fe958c1eaf402da41b5ac87e173a8fa5753e35e30de6d106a02a0651886b24348444cbd8ee46900a946e66a0adea73f2ef9aa0c30fcf0f829348182c34bee6528a15ba4521b4386ddcb4dbf96a33710331d6ea0f9cddf04bf23eb0200ba87baa2bd9fd6195c8e017a420c10259f72d916d70724f3ca6a1d8f2de635b1a385835c4104a244a1c8a936247c90320ff646cf19682fa81e9cc63ef05245363dbf42c9fe51f20498c267fefe512388e00997e12edc50ff253178f3fb56293cea491820bbc84bcad68b7ae1fb914e6ca37ef626e04e7e2a65df199e4f5275245b25e2fe7fd86ebcfe582908ea88fac778bbc75f43afaa961104bde49580641fefaba4609fa2dd098e926181f04248e26c951a0d14ad3c65aef6f5c +result: pass +shared_secret: ee1b62c612b20db1f35a37f94f3cdcf4d3c02f1a7e2ed944764ca65711cc7cdf + +# Official test vector 22, seed: "e335df8fc0d890588c3e305ac92c7160ff199e07c85760a828933750e3fed8c83b0dbe802234481ecf890a32d7a2884f" +private_key: ea4c84806ab1066a1665a830346b85ab6b9494364f2d46661cd97115948228557cbf7a541f34899cec8cf1a3c57c913d6eb713d3022b13c7c15ea35158b043b9829c0516c5ba44327ca81de2313aedd1a3e9a5c07ab07bfbab2686b9a33010a85382094e1c9c400714839ac2a2422ca6e10a96f70c8edb8ffab42562e7598d501168d919a6475e619a87a4c0790131684f3c8320466e002d619ae828324c163cc32a56a55afea2bd51625186784db007673f1314efcca127a90b53893901d4253ac3625ba543a4b875ed322b2c510a9522403fa08bdee8814492112da917c1548e93ac360bd651f311ba8d675eebda8e78b6a0e5d4c314d89100b58a4fe6af99979bf58b8b2a88229a53c73be55ecfe26c48dcb4ed005680505caf570998341eff71864ee44d030262f3bc1346e44795d24cbe346a9f7871ffc71fbe0c9f03c925fc9904abc4a58bda6ef7d408b21a145e544e7f28758223c1b2636ebe2647abc39b076c8903426eda5359c58b22be15c1f2405caf641029f6810789b5c150525db917bb8b82ef217f1b726dbb3a1589445e4fa472da00b3ed673b8a95104e9039e1248e14137fee3a34c0daa6b937af71b75337694394a7c180191b1137a92cd71a588ab5969694956369ee85a139dc552151ab48068147047b0d0a8f8a0a3373c60732fc0790d488784a58e07b0180b1a5f322a5c7609ba0759db31ac35431736564724a53cdec4cab8155229a7036524acc08b8b9069b53e497195f656b581a037d8309ef072a2810a5762a05f759bebb7a27dcc0ad3e4824cd2781a6a2431e8badd79902e8e492e40a9253e758100a19c17246409444f3b4bffd2442ae86c544061fdb5971a0e0a1bdea4942a8c4ad11571ee9460a539b8f49327db237e2c5b95b371b2259138f68252aa5cd95d3c2bcf410e9201e71641d62ec9c9896a86d643505c8b99a625a8d19c6c4e0a94b816b910156b7f125c14cac14498c643c8635d8b49962019f0a885b4a91836ba9cb16142ad712fc5c99137a2afe2195e27a006f9b6be6d67fa9eb00c9741847c1bb228036330999120870562487fe8843a967b362e1659c8337bba05108741340e38057f351a4605388874561f99db1c696b23b45f96a48377a18acfb4d7200b7cb65b6fd0672671259f9337579424ceb2315336919a84965ff1bb9cc92622adb3b8a991768b72d07c93898d815e4f49e8cc0500e64bb37bac3c4613b6d4badc656530955b9f3984c7b1a97d09c75242c169e9886a8e543c58812f4829778fa9cb20706dc84a4b5226786950db1337061b79ccb78c4f520b232db36aa599c1e800956a28f2e0b05e3ba11e1432c89713a4be993cfa552f1c11d0cb8b3fcf2525e30c2aab210ea488871430bfb2528858053ba499df337b8853959a10504c124569086cccb069b97a1b782150542e184e210a24c0b5447487ad5a8c291c5c8a9b3b9b701c13d7114e337231959b7c18b2631fcaa40e841ce72b633279e57a38e2ff26eaed13af3f061595b679cb0c886304d874392b31173c89889615ba9676320d917424b608b057974d18c1806bcad1d955b48420f927c6715641e6e867f073968a23a5751a799b08b2e1d30c8894634968b6450c48b7a4ba3894628697960efb753d2540b6b4432a6b59c92ec3398e9c0c476173843ce80c626df72b18ff7424c923fb0db28a8b1903bd19b963acbe1fb6f3fb27180490e82c97592d41abbe486128cb57999816a97c050ebbc4781a672d07acd13415f036b26763365ca756a7c13db0b1f46fa23f591bc5a5b527e72136368bb85bc52f0916f921b2ff3c96ee0759a00f230d8b141a8c532f037770422a95a495b3087013393694d496a0a4241e8d62547178e2ef3663e211ff7bb213bb69555b25e91cb7b34039b6995c8bb91a1e31937af23b09410cf9f583a76e04948c7c3d341c75a30aa670707ef83793537392917a0c2195013b54c0a8b3e4686c10d25239a03c3ed28c916f40d3809068c542eb8e0a321bab4ae0011273190bb1136d5852abaf8bf82156f2ec402725503b8849daaa9bf266490da991a56a30fe3c089cee7ac241bc1528a0129cb8ea22b1c90023c9d1cb4bb04268b60cfeeb8071e4b8d6b52798c3b960cd87bdc66ad467649d0a835b5153bf2ec57f12b93a1f055f88cc36236016d4809e5d9096762571c15863924797872cdd77370917720776b8ea9b72189f237e9d710da6906ae25331b9c82ca0ca257dc980ccaa23ee61ce1e681ae09aecf967c33505f83078bda132d1ad623373252b72109f6e6b8f5481dbe89b6033558b90a70d3866930a3c78e024b268604c8b3beca583b8b531a4a6c094591bf173107025ba079c3062a607e30647308987084341925531076ba04e03c8dcbf551b56885c383a5929a54c207b39e162348f7a7fb375f38896e7c1c6641b56557f52f4da23320252aeb382082b8560cdb83c34614c40b8e4dc4ce54b4c009d9c3cd6884c11c616520ae0d220e2cd03a869147ffa894d5b02c75007bb09b51c8f59a53eac1af1a0195623217b578bf4c3bf59459fe3c9ca7b677155436336176a99653fe677d0d9bcb266b2e5484a72bf8a86f1b250b5666e40083bd24cf578c4f9386bce2f034d2e9347835632a1ab39726c2f467a864f5863c0b498491111221bb2e83386da51c764b8597e2b503a21eeedaa6350683aa82659fa276d9b8ad3875a019ea6a00b31193c9284832c581555d7c478f81e259150c41e8c23047eb0599647ca403a7f19273a765c439535efb20a6861a1b7fcba48927412af6c9364670e2e44c6c630a930b9437529f0afa7534a08b7606a512fb737a50b6a08c637087314da4bbd76c35a312c091fa3a863a3b8c7874501c8a9233212e592c828829800c9d174cca70761bf8188ff5585fe1d59905373420120848f22ce8d4bb8ea253d3499e0ae59b526555a2245eb0fb0ba2a38cda009a31f89bb46851a4277b808018e8f23148789b8ec69d8c622247e207d2e08491a3945a60aabdb7b5cbd260a348818c8493159199717bbe5305a5c785c4eeb26dad73c76a04bb28b740d2a761c8c02096e0b6dd297485725ec59b107086bc40e71f61b90ba596cc905b564cd33d76e2b1624bc3a2e75440474daa778b79f3819d237a41d08d9260226e63231b5494da150093566f31cc3a53f581880512c25826a7981241f4c90ee3b3eda1c277b5c157226342fb7e3622b0665109fb7342d13a96e3eab49c53074b76b3a2aa26c899bd86c8a26159ca278c034e323475a0b12f447df223aef827597eb5422bf26cd48b6a40b40200898430ccbe1a6b8ee1635c761623a956b270dac22e3a24fbbc8cb62710a197110491aaf8b89575d68b530530cb2380a5e65cdcc044b52a922b346e50005da16b8c2189525950a109f74b225213c28113bc793857e9c384914809cac7c8ec5667a34b007c7eec63ae9ec21a46497b6b836cac1c451b03814b7c47554a9e6039842418468fd5860ed6cb13311c638b86680ba1628ca09afc406d944cb0ac11b928899cf333ab54be5796a6e0db7cb2b2c8c9b9ae6f300a3d508eedd292c77c589c6682e2509b8d712c6b41669a5b5363fa06f6bbc0bd272abf0c423e0c719ba90cff3b0dc2c390e30b46b38281864b5d8bc2ab339c48bd9cc8fe70067358722cfabff6bc907a457f84b1bcbd6c765ada9b5c684d290c53614123a02660ffa22ffaf602111b7612862d2d204c65e82dc232798982652ea51a362743bea629a8324f76b693124b2c3772111c627e9db55c49fb7ae4204222d850311ca5d99213173416df4bbe68b6b6fb514dd4b821bda1b50f5587b7bb254a65a2d9e6a2c5baa0e71b0be88199096c516f84a20f38a9d32520a0064e955697008a9bccb6524ee56825bcbb776092c99a040b85c2e6e1669f08932f63635f1c37e989a4f8b2190c335e31a03aa06a755022c895485780bc90a969c834091f2cc64960d399ee65359ac245201b948bc2827943a06165255b0492a7236e7b69b66847824d8873a24b6267acadacf330f306652dc766df9269ef911068b50dcb199996a294b8f935df477f00b99882a5a5fa8147023737592a2d797358bda228bd62440fb0c3811b73ca1c8fe4e1c070498b11bc816da770bd895a96338fd9a6659ffb88df51719bf3a4b208647063cf9ec985ec087fa643608e0aa23ce7749ee3c7983783992961a409729a1c6f416a0a0a5659e8320f95277ccdd31de6fa3e41ac9de3293e3ab36971842d6f8b2ffa9a26de29b0c1a26815362a657a5571fc378425b23089bb94016ab2e180888226d1f7b448749280b978958198cbc626539abaa520f4c1ffed3ecd10dca6a4d6edfa0952d6e2785cbddbd5d6b62e0449476f7c6f9ea3621237bce0f97b11fe0e65776f1e92da38362cb376eae84d11c4528382828f7a689a0d5cff87b8ca0bba97feacb39b935a8788cb +ciphertext: 5ead197f374db8ac3b0108c6b48be7d7a015a2f827d92c6686bb717bf55d48f1f350327627f184cecd044b6df9f775f53006d4e102f22053bff4fad33013d61b1b889a5e3e905ea297252e2ff8ee4d099430b7f0876e39a2202b3a2370253c00dff9cb62a1831dccdd4b95d60469828ead71c71047e90420e0b89460f9b5c5f0dd9c83e47c9551b227d7b54a0edeb79f129d150f8753e92f69ae75919fd82daf1eed6954c9429e39130265ccab4865b0ed1814406124cd9d1177361573267c2fcd41b793778cf3c4d23a41177eb8258b599f095082ef1e91d36bceb56a1c3a932e512c5a73b6f73255a74e76b7ce114002778a3f00e291592d76c3dfd33f4e5d3f409284f6a4fb654ad4855d5184a355d7e5a78aff17320536d83e3a33cd14f6cc2376e7697fb712bf0ad2c9b719edf9aeedf66ee481983fa551b973c3f7b17fc848a39606dd4fa254bd513bce300330adae0cb923a743730c83db40670d0c9a406bdbadf4a25cd11ba16b8b67ecc0aa3d632b4f8892b9d1571f0ef3cf09b29b4d956345be438a1f07444c5b83db5d34b2a7783f52039a27a771a2d114715e6778b6f970926626608423a91d485484dc14665b0cd31f7f38e017ea4408476345ec571eef240c9b04b023858b3e7bba470c21f1cc0883dae601d107a870e583a398198e41addc692491d11afa17a8f6041ed6990e0fb1ddb13ba2c0638288200c94512f0e74af90507fe23c69577ea17af0db97a32113abcee1c6fd15a0c524b72ae35d5b7fae7f9461373a0dce13d5372bd6dd3b9119406ad6837e1b3a05cfcda080ce1cfe8108c050764a2ad8d5ecdb5130bfae0d3564ba8f48742c3080c59c884c2fac31748966b2e003f14962803b4885625467306e0b0ac4009b377d6c46207a04fcf17e507a6fa4d37ae47bf7a646d202d378a387be5d4a9e2a25389204aadfdc4eaddd5fad5498ab1f908c36cd21e971812904bce453bba6287016fb5ed0e9266da7e7d5961555ead3fb8df66ac598889442746b75bdc9f5122037b4b6cee66aa613a239bd409ce747d53bccbf7ccb27d25067f28d851c590eae2a855999d5a201c79d83c63816b919bd22fc42f8a173fec47a71f5a9e42103738edeb4eb6e933cffa23cf6edfdff13bf7ba4494ec055b7779e0cb82a99fb739d0bac382eadbba1c8221983f11554997ea752a8069dbe7430d795350199299314aa476f5f22595d429663d66b340e0f58462f94d8809d7f798574dd7424bf21282fa8301c809d6efc94b5f9240a65504614ccf509295de40d8dcd1d6303e2e116de6b0dbddcc79a456054b4375f20969c58a98fe60e6ce828ebbc3ac91721abfa9148ee24a2e08c342c58dadb89926e864c3df8c16e92955b2ecdeba9ea53286eb27dd2348baa27a6115f216e2d7c7945d095514b31971028f7344757cefa9077a8a41064c52df9e2fecb7a963444597c98ff1c946e60607c3d3fff8df8723029769cdbd0f3e5a9a07917dd25974f1dcba2c86ebe31c129b553ee528f5ea636ba87ea6da7a170e7a4bdbc300e5bc1726044ca987bf24de6051e55289aec3881c16d59bec4c06043337b1b99fe2b6579947bd41d73bccb9509381a8f29d00a101397732f4e49b1753f464d1edbedbb278912de0cda6e11f4da9ba519302ced79e23e3e0b1a87157f4b7b8e1ecfbcd1230a2e1308a683c3be1865b58c79b01119f2df07cba766ff6ad23c0b2fbe2b664aa113067a19f221f81cfbad093e873c224cb34f3d34acb4d7a4b781edaa6042119924229718dfd348a72a7b1ab35a5d877a13b9feaf34745bd60839d13ef6c0cc1e7ac1897869fc2f3f7901f6a1e5625727dc19ac44c74b67f3d8d78bfabe83127a9b8f16345172632dc2698c299541cfd96ac5a99bce1eb768f52840d6b61052458bc072862ba936a9901008b7c7834111a04eed9e10604404da2c2758dae053ca3011d1bcb92088cbb8a4c521bbb9be7f81e424bf3d6ba6dbf8959a58207b6993570a6508420799795bba2e987483026cb94e16834b28715a7812d82e8155ddc69771e6bfbc43a0b1e1b11ecbe73a4e509d70ed055812831be7330fcec915f06920e89f0d6b6ec5a75f036ca9818d6145af671fe3f695aad955a3cee0e28dc66c41e2c0bf6575e51344e9110ff33125f445a5c2a9bef490fd0d14097ae84d09be325b603264c1933cef9d0956a51c61fd17e07f +result: pass +shared_secret: 1554300d6dd3d2dbb7a1647991daceaac9bd28f6bc937cc8bd3246c48e219f65 + +# Official test vector 23, seed: "fbea1bc2c379f4f8fdcb0de260d31cdb064c9ea9b1d6dfbe91b3692add1d34dec9c9ffae7bf5e72ed2743ba3f9f2e43d" +private_key: 2a3a066cb7ce2fd3976cf377eb5500fbf9887c2375705c6feac85eb92cc4d423ad0dd37b4b1abf98d72a57e3905b9531b3f9382a2817b464769ba133c3a550036abd7a704ef0026e832b5a0d494362025debc90eb1a03807b35832aaa00a8c93bd72bd1908819ef7165358541659aca85c2e640987d5cc3fc941b7777ba63e17987bfb81869a484ffa81a83293d87272ebe243416728a92632480112628463d880c8cb23193b7038b765cafd629605b0a1645a2770635b47cb35d728a264a03c2d2c260d965a86eb9603b16c33a092d472c0857b632be44a04a2424f4ab1f1ec6fa54200c1bbb4ef0a35a59bbca8b889889332577835121195d38248d849087c996933403f74e56c9b3406dfcb416359cc9912cff4f69b3e826071c5029671724c28212f0b85950b100412bc574a059aca60a3f1c76ea45a6dc88cf4998c21805f9b17c3ea7793af98224b017ce25bb16676a1146c933a587d98448d7fc188e6a510272770983b964091bdc09b10ff341064da0cb347c8ca92c53eb83bab85248e0859a4a933be5078feba8a8ca12d8b634946c24861fa7a699069c2c72ddc840ff20c4795a680111222b3e52116e64134616f4b223e0fdab1b7a514c667155a42847c4c726e2c7211e675ace1412303390b6a2dbdfcce2d435750c94799a82df899227d344a81a5422af0c05b4a605ce5b00a438fdbdb80b8f224051c7c934937fcc8889c6baa43e89244e1bc5f9b136a2b6b956a349aaa3cde7338e1782faf951518f29d492842a936cca4cb09e81ca78586558550a7e11452197c29f7625e680138b03039612048913aa4a8c8b383e8655900549a472dc552ba39b617bc82405830cb186b1c89327145e1cb07113dcd39110cb7b45dd9a92a4b28b6e8794ca070f1e398e603ba39b5a7eb7b289885039be10bed6a08b296298766752ee392e5d693396b90e71147463a63aa6b69e1e3c1426c403bccc11c58beec481bd1f5b5a26657cdc75cd93ba89f834594240295544420e09f5b0bc9e76458ad426ff6b6247534aae1a04a6a5a67894638c88bb858c0c21af8376500b33143c917148c3244c2bd176fb134154879314d111bc2193ae5b03fab328db03837a177c8caa585caa45ba51794a7954837cb671017cc6325196fd767d50a65ce798754754403a0af6a1c25de2b051e502da59c20e80528cf0b6e509772114a0e7b43436877cb0f175f8d1b0a774c36ab09a9d13013cf20667100ac1a314f0ba661ba72bbfb86890a48929dac8ca0e40604b17bc9434013f707a2e37099021e1c7c8564e7848bd21b45d13c020b3a2c09823194cbb46841675a92c888bd1191b3cd78b154f650732b12634c3b8473cf044471a8a54de3a601a4545566e9076d0149c8e8760cf0aa1a820e7fb24ce428a49f572ac1028e7109be2ccb41f5e02bb902697e537305ccb425b8cad1d63fecd8a8e1852e1988419e7688e891bad58155c72002f190ad27a55725398831310cb8b14b06516ee2906ae86874629b7073e8acc95548065275a66560d7935174cc4dc8f4596d000d288c5ce8536666fb275e33cd68e004210985c7d146bfc1b2e1b9a1ba1048c6516a4e4384c48921f271a4207369963b75c3d15e859322715b8a59b116deb2bd623acd158a8375a2c403f15068f74bfbdbbeab602357461b9bb1ac5d429929025ac2a3b1200376a953704888a2b304b3ea608fc10b1f05716ef9466a670407ae66baa218557177193df197f3d692536c02ff5816cba620d23b0a866980d1820d2417722ad440534a0f15e65573cbb8a896be183b83cf2b954139a27d4a4eaf267b0a2471182963bde3503e7b7fa723ac20e97357f24d5b6cc01b8b8606aa6ee251578963593187109452b352ab1f90a8928999b87b1c054a3b8ea30c4f79907c831636c9071277412a1fda2e5631a86e7124f0393e1892857458327136a136414cd0db09e7a9948995831882b1f08ac2b9767536e41d19fb54ccfb3565a470e1350b9d3a81ec11043a3a6f445433db604dda35af06aa636bb88426d0623fbccb6f9c43ee1b32f822416335ac36c7200e60ada28096bec7cafe37c3aff80f0ec27dc4ac5390e0756e080ff198bc11ea96178b55b00a21f5c81ec67744a8b236100cbf5cd98204000f931898eac7cc091389ada7c7f6a193f8174b99e5b0c249517ac47c4ababda18b523a665587579d884b7d98f778758c48d28c89c97441e7ba1ddcd020455c73a30377402c13c20bb8bcf9042066424a9081c9d44139e53f3afb7d9a687c3510a2f4f22fd5ab37bb778267053055f38158c3762694aaa89596ed824a0a10490c49619960b79db3174a227c7687ac0b4533197799969911a24bcf1e19a4d6224e2fea4c4da636483a09c39c0e63531e367b7b74c9734313bad6056228d00d90f8806b6a06dfb45e4366867c2175d692c66ca91083b5ad8566bfb4816b40da9971bb4855b44e13a04eac687af1a025863b8878827c1a06360e84c24e8940e404716e665e570a12b0532bc663001ae8cb94aa658a9394b60a6a1c8b008ec7bdf432002dd43f34fa04665278057cc5a0ec65b7315e831681e4d5ccc2f95588089122b18b4cb93df740b2910ccb49142942b563d2027c8552ba5bb595ef35943db0bc2c912d57f2cf166b2b9d219222a6a71bc55ccf7cb9c7c8c23398761aa58bd8a587013841a266000a375cc14018cec577260aa9d962799d9900a991873b175194720f50a90310c4b8b5248c0f08a0b609440eca877c708e1941a15af6407d5873fc62492bea381f431c8a727e5fa235b39434bdeb8e0918c4ab82a5d735b0f676aac18463f8e65cf2b30ee3a97969da994105d056d49e2245ac4fd1912a44b6f3647cb9c377df2c7f0a99016725bda1fb78670013fb25061e11c09fe1c92ec21a83da9a2ed2c95636598f63c264c972a4365e6580440b0327d3638628e06cbb7ba024bb2481f64bbd39a5e79c46b43abf0f405fee38076a600468f033b9c52aff5c3ffb6191ab8b37dbd8730ec63677e6b43afc74331631fa0c5263268b17bb0a77f2699e839e66489a8744230aac9c77ab765cc9094a8077c12c8e8dc6bcfe900e831c02cf01161c083b14677f01878655394f31296a33c612a18121cfba2f7a1358af8904b5e8c00028434ef812ac1a5d24bc2e09eaa5929c5e6e05683d292428324fe2a021e238b2717490f4731aeff426ad085574c9a1f7cab392d662fd25b4390a694946c6684c0a02d85da187769632b6a829cfc24999a317436d4b47473bbf8fd73f9576c6424acf65e88a4bb230aeec1f5e08c7c05a1c84aa3af9d44c25c81e4db436285a4b1a572f950437e277294de7c0ec087b8148607b30229bc97f7907076d9842f5a77fc5644177fc095e7245eaa7ba8f9c7840c99f852a109257b04bbb3679f80a617ba997f5b5b22c14d13807ab9bce20cc271c9b2cb5dcbf67e4a0df65a5adbc0f8634670c4718feb06880293d7c7184c52601c69c58f110cb1ef961aeaa95133483714b11b57b71cbb94e6a483444f65f293b7d349a02950079ecc18ce091ab09d647141065e037c2041c932ca092ac7b870e4a64caf14069fc9845cacd62549356c38fafba2a7f7133c5f7c630721fca36ad23767e4d86a2d1ec8c41da18355a9375659c9b7c04539864b1098b8c862dcebb94785370430498cecb064dc8aee2e385fd775749f47c1f38b6d6d08a6c3a5b2e148204d50048a3c8e5f13e2e3059e6a3554a636acca6b634aca6da71977e33a74f0a56e78cb856b816b73681a3a96f5a4328a1911a7e063eef31440fd21e5f281e9be9954113acbc3662529911cbd8221a7227e2d38e9bf798de61627d67b8e8f62f2e10bf66f24187d2ad2efa071f0b2210e53091e29be859857e801348092c572b91b59102e325104c6c1a49c7654c2bb4df431c12ab0f88e1132b63bf56c1616028994a304536564dbf18b54a16b50b9c75d3f347d8cac3f3bc2dc9827155c507294014c8c92e4121386c936f3bac661f4c4f8604a2b648053e88792f5ca9a48719bed781ad4a7bebd8306b5401dcba9a69a35128a7a89d22b97ffa5c2336cc5cc090a6cac001dc560aa25f8f65093f0c2fa5540b51f56862380996a4c48d90a68f8956ef49019ba809b84496118235e02535a37b1da0c95845f18342545ed12426a6e5ba1bcc7b348585669c003b02033eb024cdb70405f5c5e6077449d8c4e6e66d65a23b9bf51f40230bd241bac33b708ae7b2147809ba2a14005038d0d197c790491ffa5c74626d2f6c5e0ab2c69ba55ebc83195044cd7c4c00d84bc716d02f8bcccbb4f85d5e50c6efec71d667cc0338e6a6ca392e61bc1211681ce762516ade8bdad2f1ed78a9731a2634269505d6cb8212b9dad2fa70171035fd4107ff47c02696b3489650d5ef9c6f19fc9ebbe336dc464489861db8253606971bd0a9008a433ed17752d04023781552 +ciphertext: 2814c86b427bab251a952ad9e541866a832001ed9859d12101dcd24f0d739e08a6b9a62d1aab7a2818c5f9dae38ef61423844427a2b64c90e1ce73a506b0302e531dba5617f739a4fd960602a9124848185aa176d57301803d2135c299d4be766607a219866d714055f6c6288d364db1e8bca2bca23f9f2a4e2af7915e556739f5137ebabead85315fb456f9499501b519283db6c67bea65bc915ca50ee1c77b9f035a15ca8d1ca5bedae4b5762e9acae10554d0eb6174938c786bfec3128bb65ea86a60379b477b88ca97df17539bfc142c67f0166be78a8cd3cacadd4af9f148354b869ce61bf39dfae8db4109b96a6da80f3c7b8316156234df427843874cb33bc4597fcc32cad20358ae650e82864fd407f06750b4c3015ca0d831e76cfa0b6fbcb5c920c9729fc729fbb1c404330bbe965848857966f50835b6f39a42d465563ee024343b0f81e7feb02baf0fa45cb866e51fd3153e79aab9866e91417df875341515952d5fceda11c76a6c3b4b885412cdd880becdf1613a05b3d48396e64b6446f0b39fb10ab170e5325bbb2e08a650c2065f85a7b4d5536d294e6aaf2350828a922f6f565ccec8cfb22bff15352b81dba6f97e929f7637000f46ce8279806b21ef3890b1e0e99228499507093dd808d4922d86d4dae2ae50a26a83fba367b50cafa044ff72efaa1ecaa9b759e630f254118b5aa10d88837c8add3aaf04da5f214765663fe46eebf244e22a3cc2ff30ca287b28a2cf6f96d8fabf68963ded2d72493db9dc71bed3eb4dbd6f9c2c73ef8d1f7250fa95d40dd27a689e0d020989b11d3818421101d6b850b6b3241f503e464acb922d2dbf587b69fc560f180566669b2ff16032a898d15bd79e4b0b68d8f9485eeb58c65c8e6b6d2e35d3c923fcae3c478f578beb54fda3dbbe59be441072b8e5b6ebf0f62d275d09169d02c161d458121358d3f5558318af0bc73547cf0fad3ae03b6fce3ee42907bacfc1656e3c1d0dd54e0c01914f4869fb9b05b890c6f71854f059903edebac8b51f7b68313b669adad1abc2c65d0d6a4c3aeeded37fc07770ee6604531d5aa3319ea94acc1755913e8b36d4733809460e26d3f3d99862853ee8f9576f911efeb47c6cda258f1926620375526cf86bcbd3fdd0eb0f848fba9834ce2499cf158cf772f56cf106c4d9d4221a5c47e1c387d39dfc0d80652005a0d4597f309bb39c305b02f73095510e016832014b6ed9210f96d4270d7da0591d1800f88d90639f4aeaa80bce27b46d18fe412c1d1293891278c2f4a0469439513622ad18824d8fbf924bd607f475ae2bdd27f1d867f427cb5205f856357dde8a1de80d497cb63f882fc316d9a6360462c12aaf05e08a96511fb06161b1107aaac9b5c2270ccee41ed68843fd279e31fca518e5829c3f01da85e8dee3c1c236732b5c945870257d6ee824884e4d949f4529515e74c26d4e5fbbd0c7639b4c9bc521d555b77d180cc770535a4d0f0963bca767994c5367d9bde70a966da321b3152b5a13bf928776ca66e14794b1a9b366b26eb955480cefd0048f3ed26405d2806d1200ec8a2541b1040741910a9f7c4dfdbae85a1b5a323b12984fb29bd254410662975f8976ce79bf511a418fe0cdcc48dc4228981e6f37f0dd4e0b2991baceff40111502205d77569bb9fb5487d03f22c7a852a0b6c620ea3f00b03fc13ea0220c01ef9dde592c99e8a01ae7604949a4cd9caeb936c7be6189cf8a332d9f01c66caaf7a6a17bde66d97342cb0f92cdc225400cbfd4b1c5743b65cc443cdb7aba62a951ed6a19f978ef15d0466ac128f51481f44e83c9b4445b8cc6851802ab5e0f244df4a231c5aac27b4ee4290375df1bb99b4a6ccce29bc0fb14d0ea5d1cf4083915d1448883fe4b6d081d01d5647d10338e2cd33b84f489d31029c4a9308bb6426443b79d27be8d0b11f058b7e214523cea5b443b783f54b29858336532bbf772991f0a4b0b67aa00def079fe2b5ea4a5f4a6e141346330b1776ecb7be83e2897d6ae40aa9c8cf0f5a8bda5a3a114c2f01d97c8795c0f93d396156f678473f80a3ae82db82dbbaab52a9c4a77ece6c8557463448e519ee72889f16eadc57c82afb28e4247443f0bc48278bb4cbaeadd6527e25b587425cf3710408f626b87344578990fadd2ad8bc2855302857ae91ebaf38d45eabd4ed4c67465f38f38235dfb7af77518e60a +result: pass +shared_secret: 321f4ce476ad84c9f9d3b906a733b8bbd8aa0c3301d81d9cf7587345c098157c + +# Official test vector 24, seed: "7e87fb886bc3c7c9fc12569f465d2ecd12532e76cc27c65644c8d3dd603b0cb2d036c5974e675058f271d5c82ad7a813" +private_key: 09080dc7cb09012bb14eaa2b8d92a71c0078a792ca0607908c04b8b684a0aae139231991812b5e763b2f191526268519469673713359936bba126ab5e0b4b62d8a5fa0d76b365212d686ab74188878aacdc1b420d323ac67659dd2e8851317b0c132ca57bba44671b7b9a78f6e6c73503125ab718bd386b2bff1b6f026c2a2da0f5a05578b8013a0b78fd628cfd7090c648c0afd11a9fd768e56dca02a6a87c7c523ea959348fa0dd38b5d380291c99a989589b6b784bec0cabc181c33c45840700622a0e666f3db15c32bc4636782fc688c8d5433bab63c35d3ca26eb488660a4d141b33371413156322fc2a9be424fb96712e7b6a324fc1559508910124c7eaa62b731147d1331a375b597494cac741520a07082d6945ea92b7f326d3830814f62b20c84179071182dd707d4bc87010b406299c11a633210726c59184767f96720a918de74178d397407950c62974b3ed703b8305e9892016d859fb1479046bc0a0e1766a985266b950d56e9b178244d9a5c969fac3e1a41983db574b3c9b50f2797c807b03de8ab0e692ff913a79e1600a4dc8f4d537368784844a34797433c7fe2b8c5ba14af06bb9ae4c5b301201a55a55b2a3be308a0354456f0243882651d91f69cd5930a27a25874b45b7a556dbeb65ba5f68f684c643a81c0810143de8c2352b0a92e86c72db570c3ac0ceac65bdb5912cb59683a88627086a06a00ae99922fac3a47afe5451b813c7fab053c043069e70c0624a40b6629ef46bfddc36f82173abda6a36642c4b3685ea23375a1906c9eb98e3e057889671d2d6ba894876816c79a6ad476363b27a2811fdd4baba235077a037fb780c540132a046432f04aa041f25b44897c885c8ab8e070d5f07042c2a383a9886bcc40c7750e5ce85c5fe1b217151ffe2ba53bc9875af281f927c8c88529f6395a75783098a9b3a89cb494a131d3118a51a868ce76b84cf3b2ceac1ae145b070793ece3916b86726cb52bb1b40a24be7a9580a29f1ea9146ab5d787c2f3f777638fccaeed72a74f0959ce5b0edd45bde14c4edd0aa601b82ff6b4edb9b77c833a8b0aa59252c812d25bb627b0f82e3186f4ca2ace595cca41ac2612e6c409011854b033360f179c397b06c82e43dafc47b3f424d4d59051048c624e999fab7bd73b18b13a9305064844be040fc5c4a033b59c097299e6221e2c5ca3b9b05317376ee4b4e9963b172802030ab06e403b6940b5d8258572d16ce4c80a20ec0a796b06df076b73e2b648534520dec6ef0b57f61f4b9b5519c82d9931e863461d26d41f35c0a3509a1d684cc5047b9482955d0387808a26bacb2b3922ab780b7ce43256246073b6c5900f004a3830fc14770debb620b1569f6c98db310abdaca61dbd337a9773758ab92fb490a9fb95596d1087a696fee494c0e5739a2aaa63a77cfdaac6a37618cab56a6c6ccbdace66f7eaba24be57cf1d1c1cbc42517604c17801865081f13f3c04c9118444578b95b6a55e51830f3c594b3662351b113d57c6f49640ff14468dbbaec7a7ead354506c0adb923a0050bb3f89cc82b2cceaea4582f1998691bb1845a22cdfc721d6b088bfc52d6a8ca526625b6fc2267c277b9e86b88d9ccf81847c79a0075d36f9b7315273870d0239b8adc9f9dbb05a1e44e7c4604aa3947ee2085dda65651b6069e2c7d64f06986f527c02525e103b50363cffb93c9735135eb1a0a1bb056842278badbccb43810c3727028fcb0f4cc5dffbcb7d39590165a01ad4092ce6954f8c3bd28663d5e3c35142b0351538b2660020dd30d35c0bb5bd7276a8743c79c53a1f80146c16523080db316382d2c9ddce7857703bc3c939b4d5372185603fed280dd8b57fb6b7d80270049aa09bc6a206ccc47f935ad40602a89e9a633541f903a16545274d8a51a40150cde7555a56bcc80261d9522acdb3390f6a5719d57705ec8aa871ba41fbac75254349b15bb6af427bc1053a8a05e2d766a3b8243690b1352a59ea4f2c18e202cf69c205db06a3915058fa01fa8e4a35e3c26bd5abe05db1240687616d873355b6485dc858f5441d9155ab5e6c9fa115f46815e6394c2c1cba717cc0d8048561bab198a9449d8d9ca47803c4777ab6e55443b3ba176a15a0167826ec662877a457e5b4e7401b9b30883bf67b1ffa09f306c0e7e44a625f44880cb0d125bac36b650f8430c647c68e1ca6306e39c61142c2a5924cd0c9cd5a085f4eb5dc4815711e4aa7e3a26e521cac85c303e420a18a3393d996c1cb68dc9904588301385451788e57842305c064807421034ad845df2baaead84acee401fd912b191c89f51c436ff6bcf4b33b0b2120440e65777f4bff5dba7560148364046598acf3d46b70f7960eb9a7c5fe893c87c6dc5741cd84b080b7a4d0a596effa363b6441848d849b72a7cb9f1597c99b7eb6697bdc3181db25ce213c35725bcca20c840066dba39420763572f187758d05f6e43cbd41296f7c7a637cb49a57b00a2a9cfa7b2bd1745b5cb0255b1a68892431704f4bbf5c4844d0c1e9ca5bdefab042fe1ad30d4491427543cb39fd11717035690a77149e09a9173a433dde8a29c40744cd4a7d2ebae568a392981326fc8bdc2989869d6a56f6715ce65a51dc9a5e8f5c304ab6937f41964e80bcb259b9494bb713b6c882b94af5528a6b1bee6886f1da41d5a10b8cbb188aca7a820761e10b6797a8a5aaaf54b5f724c8fa9a41ad09bf9c9875df8ad40781ec93748b428cb0527c9257aa83d412ff1755d835343ae05be3211a447011944aa8952f2ca001153f10bacb18ac64619689ea6562f23c0fb5a33046c5dc5b7c37e2133d0987a44c207ae5abcb38ba68e13505fa5a05be45af5887606704b7b4a4e18e5b78f518e8680a4c3a678b5513cdfa3b18ddb285a562f00f29cad2c984f60c005f73d23e3cc617148d6a53177d10004981fb7e8a1cc362224e48d0cf69d28f213082b4425368c2757ac8493393e5495f35a41646225b3741e5dd1bd6e354681e8b47ae5c576b19d7c807feb4abc89ea94f2d150f946920a0a3d6bcc3d1799332304035515273c2c4e3764ca04e1653bdabdea77819e0490416211ba7877ab8028f8416fa08918c7a7791ceb4a65b567838283cea96997e3ce2564cfa0d41c43868bf6f6828dcc78f5c03afc4422675b9fe926c5d2cc197046c38a30cd5cecc076ba9bdb3c57a4fc806e835ef6b52b44070e4689baa7633458e0acbab3a781aa83158b31b1c949338b58ac034ff2c2c80d3bb54ef7c10c5281e0d5930f3817b9893032246f6aa82f7f6cb29a467395340c6b81347b2997f5514d90c95e7e84633813861c488ea27200ebe7cee795b560973effe3a19c32950e821ed1140b454c8d5da64453fccfee09565c7cac7192952c360232861eaba924780895ca022737ab9139645bcc7b6edc67050c5a90a4308c44764740279107f2799a455a8e4b2d384012d66956384b0cdfd108a1db088fb34cf0824f82ccc7da6a8824a90982a92ed3b46aea02837f57aa0ada783e8766887b538fba4c33b157c2138e9a9155795399cc99613bf9b707519f001241ab2336e96981aedbabd2f41f6673c4bf28929f777f2500cf0e382f8ca2182b9b8e4fc36be4ccc4a1293aa477a76625429a68178733380ce950d5871bd7a0695254cd4367a1d8a94bae95304f23622d07650a17341d401cc5133a772c8aba82a63feb19db78af7fd850c2104fd207579649b0b9eb38c9f2236f1669cc31a5a116474c9b66897c4f6d96cef6428974748bc066338a510621d9690e4345c1a3756dea7355148d45c89a16da8867e164ab538e01e35489c792f79a53a967277054297fdb4365fc7f9bc15068b70b6702a8d0aa9968a005a5422c30596dfc9c635c189f9d2ac1f9481167558992b21ab4dbb54f88742167164ff964c64201da9cabdce9b458dc8cd7489684d4c8ac7951a2147b7358098975837083723eb85a4889547c3847d7317cc88a1c5ea19294358941467fc48bc6bb38486ca05715058171c7b2a178cffc838de1ba0a02c02d4049960d477d9f79a0b1b17ba9345afaf641aaf80218d41a71b9063a5680579123992cc4efc596ddbc0e1d2c66f035963f7b11c7d74c35158ebaf6bc16d6798a24ce928274e125cf3d51419bc6926e69aaf11562f541446df6b77c625f9ec820587b68f1b50e590132d9c988b65c0a86b6c721384b9283cbea128904f5a8dbb6b6a5fb2ada47918ae3544c7978fbf9381f78468b0265290181b8f57ee043690023bc9dd4360fd13514c79cf9e3639b792aa1e70c763c52a43773fbe6732d262f9385716528200e37054237c04504a8169baff63f6fcbd8988928266537d344dd44533e2797aa03d8cb025e705a9f453e8ca044ed0e215c83f03eb98b6da9da137ff2433b319d9ccbd0bf054135d63bff8563038aad865a817cab9ce98846ba75be9363718ecf5fea538aea90b2a558 +ciphertext: ff7ff6f6c8d57f4b3171c626be53e470c28f8686823d6af92427d22f30ef064312f00bb7daa97c68d5bfde9abcae3f34ad687f914976410d121ae4790852d0b8a0d607dc39f4deedb8921a58946de99ef1a5223db28cb3f2ba6ecdbbaff27bbb8bec11c90b7711b7b2fa139b18e49054623fe5b08b6f5e416018a6ff6bae5daee3b26bc0b46277b79e02645f16d84ca6dd362552ecbdaa6901ed7f4835662bd22cbab1405e8c301f6bc807a8c2f31741cd617a652767f3fe575d2b057f00b91503c457a60766924a2033d1a62c8e5fcb882e1cfa608f4ec15e74a893e170c5122a86a23187113a73478ebdc71b504a9890bc5056e973fb591e4f2e2f26c8143cd9c6568fc00296b0608eebfd14956afc65ef01a4a0feea97dfb7464d10646e1d18ad135b0f920fe274856dcaadac5d4f2dcd54b73181997b9d1f7521eb70c20edc40815d4a28965369a7af6e01663e163814d01e7500ec5143910758bafbc990bb4b9b34adbadaae3e46110aee4c3dcde08e51a9fee0c59e90c4a45409ef9226959e9ecda9d795dda6b2c3f3ccafe224167df3390e88b16f909b031250df56b821e0b1087a9512f72da732004770aeaa08f8738784f3da8b8f33eb73b3cb7430be7ed3ecb27f38261175e340a15090b29eb6a48470d434092cf937ea238b1537f5acd76cec471c2d4562040beb08b9b81715f5732c2c427cfb44aee961ac73cdedaa24b71bc937463a83503f251a03d6364fbb4604dddd584423a8012f9de10c91ec53852084a19ca71471c79fa158fa47458b198188f9f21ea5e5534f7fbbcb0d32bc5ac2ed288644945a5890f4a86c50609cd63e372ff1ce093056fc12010ed854c4aaf8cd2c1dc711cab1037cf36579274e42af5f21499781f9af2c3d1be65a6bdeb0d39ed227d556f36fabe8cd4dc33b94a1ec74029c2c47abbb3841aee0356e48baeb9e2d263572170d6349327e24836e55dc3f816d1b91301d134041c12798eaab3ab38796b10a17ce183b913af67e201e8875d8224468f2f0289cf9d8a3f196fe2d4051b8f5a9dac0fbfe9426f4521cbb622a8b3c46a5791283d6564f6f823d2b97f6bb58fef2b40e0afb8b6e3deedec06dcd4e55427ffef8538e18a95cf43c0543e7ef731fd6395fe0c42203f168f8c48b1f9dbb61e9958529ff8de9bd8c2dd8509c048c3e54bf8f1433c9d7585b3060b21b624b70d11632381f30174444346b3ef75956ede16485e2156ed2917ab9b020cc672b8ed2ecc6daffb7eed584705d405a515d16596c4701cb89557d9b46a5ec6302ef6eb43cdef5679b5618e376efe26254c1407b70334b7e3ea30b5def506191f4b2d7e148d94ab9e1d0cbb52284e90eba2461921d6fab64034c05d3dc80c92fc2965abf4a60d8d3f50cfbd13f3469fbde1737ea5f54911c590a4a008b3497a172cf0463d83fb20efc9cdc69e8910f5755287b9dcf6946bdb27b814813c6f515722d7e01abb9a137fa37a5e86f05695134c51a12b992e03c8689a91fcdc0ea6d9612f4d3098d415c199051b68c3df5f101af6929711c3487acac92391db09265034498a5514b647cfeda149cf5a0613e5ed29749470026fb622280e5d43f131bdc2e80eb1ef801a636ac13748dc60c770f471e514905dbfac4d554f020273d64b72dac4caed2d9ff446dd31e39d03d43a32188d6a03def8e22f60beb1e21a32b0d56c8eb19ee6c5ea6b249c73e2036afdcccdb0f945263df3cd25eebfb2f90c7c2804f7ae9ceef277c0cafb7881dfdd9b43f43510a78f36862484c70bf3587b981181c4340141379d50922fe43390c1433e5ffb9578f957f2aa0be393baed2cdf481ffa9d5914856ea4ef2f31ab5ac2cb574f1983da1796d8706d70b904e6962afc2a5270ed319734bc6aa48bb21d51a554b98dfc0d73f395e648ec0786e03c7a69011544e3d653338e8f272d56854c91bcb2ffa84a060cab98d5c4aec1cc80ffcab9c82cc551b461564d93aab81fa8457f2a12b80d26bab3f4519c01be31dec9c67b4aa00b2124ef81f25bc71f40af090297e8bfd9ce5da48c6c29318109927b54d7ee2463175cb134d8299aa645782b7bcf1efe4a7f00a19f688d0e0f63f262ddb7890be4a2b60fb51b00d8693d12d49bcd30efdff4a123574debb51ae0847fd40d1ae298afe11b3089b55c130aee7b128d07a90f0d4c27aec2565b59ec01e1754105c5bc95fc01fd3 +result: pass +shared_secret: 3f9a0a1579989654c58a2d33470a0ab5b6587419be2e9cf4c5027ed252c48494 + +# Official test vector 25, seed: "ad1424e804f306c7ff513da4c1e8d445afca7bc942fac5c0b335733aaf70693712ecbde26ea726ee0f9fd9d52a83b1a4" +private_key: a902027dfa84635138ab20cb6b0cb06df848adb138ed618d93b5857f11042d2c753e0765d3a1c6febc1fbef347c58b4993f5bfe065a9464098bbcc2c61aa1ae338217592b657f60cdb39b740871103019d17504c4a572f2c5490ac61cbacd3148d23ad48bcba53a7a331e3403c13934ed8a3a6f794c263be9e1b4fe96a40e991798987a54af53048ab9646db8b06b9152136713668a4ca1cb3947469ac27c035ba69fdf43c2b4128efb31aa7226902e41de295cf22b6711cfc34a5276dc6ac9329d30269e637a4e92a80fb481e123c45e9bb04b1724e4065524612ff66a30633a4888bb8b5a15b8780a10ef8841c35c54b90b98f156dcde86a0b78a8052399d0d4bb6d2822a450cdfb5c245f245274167388d25f278b2a3b13bc7ca108d2e09a2af50f47e82bcd8c62813375d88c92f9005a1255a4ebc720146b97929925d9940797a95354d3cb64e0a399cb1ed1f1b395419c0332293fe37c6d676123394e40e3be474cc211dc5240dc855f27ca87d7af59b799860ac3427959516a4794ec9318d1826e8c529ca7bf0e4613a7e9299a416c4dac9937733825f1223d369fe773782381c1374b9f0eb942d5eb446f07c3c4130b3dc057e4222ec6a5c365f2b8ca618cfe998446171b2ccb940eb49a47b1cd123196c04128e1b9c35f30b38287b831ab79191c488de7b4f302be30c84ee446b29e4476b41a4901d85cab92767bcb88cba8b91a23aa45e088f2c82bffb330cdd9cc4aa6b46b032e36a885f61627357208a1b4031c858179305a52f57480483a6bf30654022fce933da873af8c64a74b1b51f1b9532a6caf0dca3fb16b50cad1189097b18526691cec9e3d2b6d53d1687fe64b434a7084873593ca8f359365eae00b1220099adccfa4c78b5f3056d5bc6e3ab96aaf917d4f1073c4a517f66447a4c15a26f96a9ac3c4fd624283757abf435aef7a6de4fb6aabdac65a99792e548e2c2c24fff7259bbbce3d588ae4725585517b5b68b712166171b9780a8c46b3d07b1864ba4a4b5c88e14666b09733c3ca7f1a185dc950e6854a086cb8642487a313a72f916200255a70d94a43cccd9664975d50c2995c56ee142c53bbb1f596a9454b1bdef4a11dd6a21746a3d499c6e3d7209b1004924b2b69c7c9e4286d871546bfc37481faba482616512b3492c4778fd1977bd079ecc188c3172d3b6193b7032708981a71fb72495c6e6787c7012748c062cdfae690b3ac483b985b2fea1e16e51b4ad408e1f53290b48bf4a972a3676862853ba348b0f8d730fc577657545da7500d989c657e787783008509d81babd7227348c574474f574aa60e976b97814a5f7c886af9c3941bb04ec3314ecc1ded62b39ed69636c07227dc11d9596103dc104d96b96cb085cd18ad7087743795b28bc6ad4af3196dc7c7da1907f6d7c7c862b4f9f1045c5b7c57907fc319aff58a113807269d9a2deaf4ca4ec501d6a35c1c23710d674f5b0ad0c5b14d3ca61145b4c8aaf363c7560a61923fb54b3daae6ab4f979dc78b971a105f5d5bb3d8f6201b82175a215d16c501726c8fbd903a2878152fc471a8b4236d6c10698284ad07a7f4b1784aa893669539a7ca8093d81c367b5f51996e3477148b626a35326010d9b7a52044d56355f7008375e2237b312c3a399f265304ed53382f766c21a6822c4864cedc9bd8a26b3928ba0b206d7f446b95161b5cb4415696cb50739b8b7a484470c8d196a762f586c5604f3e0c7bb41669bc538436a413b2630d12d23b94486f3d8bad351a5cb277933e6b1db56b3850149e28a91091aacd9a87beb84a457bf242e78c9d1af9b0412c0b61867f6981cd6c6b8b6b928409f606c4fc1ff6f6453a73b209527bb2e25527e791f729414544c8ac4c7c51b9a64591102c36c5942365498cbe7f9379890a70cd8999610c06e7504a96b6a7f839617fe42e2d13972ef49af07ac9f35444d89a7454e1af46b239fbf2aafb87405768760767a2f4721d7a57288a42bfecb512ce6a023a3221c74266990171d09aa61596787984584697bf80d79dffe0674e416cc74b311a9cbe9fcc7d6b185a5d1322aba71d6f11b673aa293e037464d214e9061ee19341b11199c88a78e4103b41f90e849664c08c30e3d9c011595199913dc231bdfcc98b0ae15f276054215b1feb4c4efe3200f3e260b8bc589d0162aa2b1eabd229f9ab6f64e528e0f05b3c69b9c9f192964a3a6d2c96b8d525f0bbb32b848e5c244409904f1583c7d58209b91465b9e3a6f2a515ecf55a778119455bc57af5aa885b64100acbf9746787b9757a17c1416c4ee317b017348f5299661436c1fb5c8aef032929fba046a601804b7b4474461957c8eedcc19c609253c23ae1428674b5ba69264ec1ea74f825198ca71c3ad929465b2769338a6359132027aaf46173415b31ca0624d7e6c258a91388742b0f71917df814b75c38b06025fc9682876b597cd65cf21943cbcb4e77b1314c4b487aa46493fb7d5f734d0da891bc51cc8fd0454a7c9bfed5747daa43e2c95fea422165e02819882a535a7e3127396120a242412bbf7384bc91372f640202ea9ea5830002654d40f346c1f2025dd648befb332bf9ae0809810445a2c91a6c51c68ea19b01ca287e3e967139f58ee66b4632346cf4240634095c59492fc3b919be49c7f32b00da0a9b95625131e24a3b03c0b44c0cbcaa7fde1c7872645950818c69a62d864b251e54b10fb6820b9678026353fb3bc09fc90cc5842849252d2c6208dbc7754cd70904f15434a8840104b6a74814b555c69897b4b2d2a69407715f93ab337a7005007218b5536a89020332998a040599bc688f6497c520b73ebaa40b735f41d966caa24e655848fa66a2b473437d14c4f80357e449643cfb34e1759676b0b2b3733bfa6b2324357931a72866e99430454fb1b65797a90e5257037744c0f06415fed93540a68fd2bc5ae74247940c21a061923c603c4a89309f8a7d1ae48a29370908d9137db01ee84c3fb6d4bcde28ca63c34cf1012bdb060d830c2aa6da19ecc0c0a8fc0272e066a8d6225f3a2873a52992768ffef0bd9b109ced760dfd2c3ce7d17cc95095f95bc84f448ec51331066ab0126505df1273741220a869b518cb458b00b5e1e503f53c639bd2bf11d71c45e8866582c71c0663ccd19b0519330f36594f1385ef82199d76b4507318fde59b6ae4185f3811f15b873be902d80c44a9523351653365e369be2939f6f17f753c776fc3421dc75bd0ccae0fab9bcc2a8175408950fa32e983cb736075040a857501b2e543b043b617c16001cef203ae164effc243d4b1cba2f225f361a7d65949cabc32b3b3a782bb18d03627cd2507f1d122a46c3e35f91315ccaaea110709f648114220524b8fae55c8e6caa27a693c3a559496d30db2458674392575accea61c91cd3b9188b94654d15e7eebb383e19d114bc0720b7552ba0d42d85863e984a220bc4632bbd7d1c33f925836e117b209351ffb01c8923edbf4a54d500ce7dabda45021601a5b19d9b0b736c8b1e30896b285a633c647658622b30a9b476a8fcc251e0971f8938063550cf39718c86b6849c7b55319b7a4e817b4447d265bc5189614247026c82c557be5a4e1d302397865af7277646b442874a5b0d5ae60429e4dc5ab30c132052030d747715dba66c16316a7d10d180b6ea88a6e97601ae1131a2412b5e83039c75a1cdfd8c0764109d360094882725c627a8f9395cdfaa7bea40263c8479b3a3e1d68cfa5688cfa19322b833e0eb863171a3f48b9910e5289611c4d51554574cb239934cf870550a0f7a4e78b1ac50b59ac5b1de0f348f0315e627cc2e50707827b9f9c6b943010b46a2b752500526840a13d3123621462bf5486820594c40318b86731e1258de6215d76d68b58083149a041394114caf69198277a8a57082da4a440f799f78064310660350b0ab34970e6d9c9e53a2a24b2c95135971db128eec54cc21378b6067d648c85c8bc21bb9551a0648825719d5fcc67717083e9d677abc523340cc24da5b489933ad7d1c1d12b7004bc1a875244a7b9810b29c77826aac6daa1753681e2b9cefa4aa3a5c4cdd63a844166017f8aa79db97115b86c447bb7e66b7964a19d410149fbc475ec1bab8b06cf96ba0861062f89a621776507ae40849b82615f0b6d81ab82a92184ce9b8b07f69311fb295eb83cc5cc4545d89362c33c8dcc7453a70051f40a56691e212897746c17f5002d8c15bbb2b625ef267914d62759cc01da4c8437eb3facf336fa0bc0e83a9ff51c793dc44007a63432309460162257d191ed8872ead9a8a66296a7e55d30d86ddee023ccb84744bab7db9c015a60707cd7aa0ebe7b8cfb1d663d8b18c5bbf06da994e7eff9d64742e2b4ecd70cf455e2195477c581fa72af1ae232e7b5efb374d9607fd958447b7c67e1fb7456ac0aa1b97068f452cba64ebdc138bcf5d36b0a0fada2a3b374141eb9 +ciphertext: 404d2a66e2815b1dac12b2ac170bd54d035481a4df94a2773f03cfcf3d0100524e7fbfb8c41056b83d967ea669e174675b908d34dc4d1ba8f7e322ddebb1a35a38d3243e7d3b55a65915e2fa9dc43ab74648db1e10ae6b516c3e547343e85914db7f1433f7747c8519c8f3a4c60b579b6fad545e1c31b7f92032bce8b7862861c87dc8362bcdc54c1f4d57d0f54a2815edc2bf7dfbb2691a84dc970032901033166084de5b4513d3982d3a0324220e432bd8ab501934ddd9e02e9bc8a47cf54fb33dcbcd71a6d7eaa605683be12efef95aa8765a593a3210ff202cab70880dfb359c57dbdd4df350c5eaae4b19e665d5f14dd12661bebb33fa574aa76d118b058a7cdf2cedf0ffe46e10ffc0e0237ac9f26553cc6e576e0ad8b563a41519d7b7fe2d84710470992d36a26f29ad5edd385707df85f73de32ba0eb4da2877f8881ded4a46c8471c506be310b70ecefb3852459fba07b1c879f2f72ca960a7e3a09c02315a7fe5e66359ee2d10d7112b41987db9749a48ee25b30e2c8cd5b16b9b72970b4f632960e1365968dbe1de58cc7afe07e8354c9a80aa0fdf189cb47ad8d257cafd6e7272c3fb026db7fa0e114d04be0523b149eda1e1158fbff7d99db920dbe5c8460451f76e124146a8ebfae8aa27c0971ff4e2955fcf243775c9ddb08d88c250268e01aee185287681e1ac7790d8f6a21ad61cdce1a7cd4ecbe85bca908ba7ad56ab27008086d7d351a4d1eac429a76a8591ee4124507a73ce204d7bdfd1f36f36966847726e44a7202a9181a5714896350567eef85a7d19e62b210cdb90d43e8b54a1684fecc4941993e93063e096df50b911bfc6cfb6d1b56b06a2c45c0cad9229bbc4d0d44617fb869d17dd72a0aae77a9c04045c125432f48c092fcb641f8165ce30ac1e382909e7bc51e057957e65103f1d9c24b6243baf375e45381c7447479292d4762bfb7ff52ab0d6c2a108a1ed717dbd8029384b72d554b7bb178ee6f7685a27175a595a03dd65a5ea1995ffc30656a4bce5b7acb0709185795ac106204dd4230ee71e56a53389c7a634e1175ecddf88503f24ed7066ad1b5b523175b071f2f44aa3b198b6bab481e69cdf1199cee43dccfe7e6cedd1e371b147dacd1f572373e2d072e3c6612b7920a6b71186dc35070d98c614a9a82fc5da515148cb29b5f4c4af120fe1c5d1b8717960b6359af4ed0962c17c1e28137702176fec18311138927493231228859770c4eac31c18ece82cbf769a5357e792da69aacf714b41c138664902fb556649cd93ff0cc3b57c8eecb81be7377f4c8df23048d530009f16537c2135bafc07d6ad666b8dc24d7385c316a69df4e7769ef16814563f1989d7a7c593aa4a25f3b7b3cd9baf3659831a4b9871ab96d07e6c6f71bd5ca81aa66ead3aa21080f8ae78d8fe030466e931b50e9402511bc145caa0c30b0d1446e2a8ed36e60efc4f86371161a58d7259dd748185c30b445b49829e7baf11b9982a01e64378ae9b205787007029c8673cbe52d93206503039731b7943334a58682cae94ef5eb2c39c8fb91615fbb0c18a9452b478014d89a5714630316d66e775294ef96bd401a55fa8ce4d2894c1a1182d81c89950f366dce9c271c4be3dc0a71bf48b8f9068e798ff1ea2ac3a534dc65c591fd14d5f53d68ef39550515c3631877b9e953ea7690495e67d3abcf1e5c7ef3ea1ada99f3233fe47180a9ad000031113e4faa26823615b4b6f68325bc88ad783b6376c166a91bd753e5162b8f5f30c68c04d85291e119f14836100335d57f78033080d9cce8932ea6f81f546ef63e59f9d4d7ea4c2c459c69c7ee7b6f7481cd2d584f30e7d17cc9909bda2fd14247595953748537feb6e9007a5a7f58f916901164bc91a48f63c92fec8d2648c83102c4d1f0b10cd076320e64aca3e2501ff913106900fa96aaef968fb677f92325a16bea0be578fac616dd0da218b4bbe6bf1f1c296ceeda0c30bfa5321e5cecd626be7c4275c1bd9dafa8bf53d634cf36983b958b6af3aaeef9fb1499433737fec3f7bdbf5e49f59a456f529429eb6ef83b87a7a302e888aaeeabd73a80936103b7a256bdf8c01327147accf69c4428660902a5a0e4475b47d94041fcaad68b63cb417fa951599e1205b7f6c9663aad90bcc31f8a6cf3c4359fe2d68936d6fd7c567cfb0aa4786884e498eacd740a27045c3f1e683a1198032d +result: pass +shared_secret: a28945631e9d080f64dea8dc345de2a4cb95048d5b78cc573afac0fd86ce57b3 + +# Official test vector 26, seed: "7c33ca0e987226c8524dd56c811fa4d1ccf9995b1e4e4dd5b1481974e88cfabfbf6787775c2611cefb27ed4403ea9b46" +private_key: 6fa78813f0808fb375e817a1aa133a3564c1bd632f43a517d7d0bc43386df21a252c71c707c5295109a5f5b64d8d8b338b86ce24290a1857364f69750ff116fdf273cd6861fa085f0ee8333e32cae0c4c202b6af2be601a62c1e78ac3330b96dff58c2037652fe497bb9c6b544460f58d59bc63091c9dbbad4225d4f4a2ad5936a6fa20b5ef52be6d72b8b2c9c9ab23a4937ce834364068a6a9feba95c41b577bc8e70d58425466bebb66167384d6ed37dafd7741e05971b5509aa5c7969c908dc71670e47c45358170f12b9d2804149350663a8a9bb45454929813e7c7fea462440ab4bef1035277a24a9076d7d11256ce4cd024157c0f2a37111a5305459f220aa4c569d0636ba1dcbb918903edff43aadf5c8843a99a9031b35311522d0ba96d6514ab0ba44908749422782a66f29ea4cc916adce65978b6a8b1be6b0bb930427e8af9ef176a13593b4bb1ab1eb4e816725fa182655750a9d835a4c20470e6c646c6314c42559bb2762077b482ca069787836d8d94412d946330a66dc819b49d0a0e42393311826507aa0124c47b5d402758b40d88bab51333f1ab1a61bd81ccc561471c239d4f2cc2af811b93250e4624d8817539fc95e90fa7a7c344d82477d0d632283624d48103e40fc924f1c5d372560af7b96bab49a3de15abe1363e17cb9fc722e986b48ed03b0e727b126320969a56c94428ba31878c6803033689639c67e5950b55f35000f90505ee871c3bb27df9c5253634865024201d50384671813ab1cd77ac1261b08fa9702575673d8b3b40a02530928757842979df188b2c697406a4800e59888623365b6a3299710eb65adddf4b85f087a87515fe9c46332fb3e825b9b37a40d48ac1af52886ba7742f2a528ffd046b4d72d85b49da1fb956b11886562afce32c7dd3771c9c4432871762f00bd72eb5cab4a0cb401605d18c9b66c20b492365a2520f391be37b449866181903653c40312b9395e57496e94c5a913d5a0aa7b41daa33e4c3bad134569e1039a5fecba93a3be80221c7f5cae6b1242cfbc6b15f33540caba84755c2dac7b3239b6aefbccc239ab170b9168e842e53308f9e737c2695a09513c1dc213e7fabc79950aa4063104120b1670b7ade210ba6a22069441b9f1cea4964b7621c6b842c409d1093b8abf7a9c12a9972a7bba867b07af3451af3cd6b61f58af1d842ea8e4391de05f41ec639b3c63a72c4e0af51ff8d144d3654fbb2582c488241c2369dda7ba047181535432fcbb15d58548a7e991922c5a32ac86a80725b0aab1b3c37639e812ca9568f00b88d84b3dc4ec9580b1760301a38ce7a78850a2f7b0931c1c729481c90aa367882643a432155e472ecd1280d5c68cda283304646dcfc13672ab9a72c039d1909650db543dc15bf8b2a94e68858c41c17f2c718977bb0a10a34bb093fb318650cc8af102c1ea138a73e392bd8100f66b287d2a0e5bdc6b63b92db44aa2a42251e6276079c1a53e896764c201077c1e052995ea609b9948cd04e175a3218a25288009b44b9a72cbe37bac0801821f5575a2c54bb367530cb1367d36978a8ac6ecbc718107318ac28c5f18426489536c22359004a478799fc50a21baf28dd269c34c218395c2a06ab07559157142c46ecf7517dfa9192b0c08e8a2524b46c7543753708b726ecbbececa5218849f6b0142b9d45afda4c9a68ba91f6264e4d6a4649aa66aa6165120c4f57b3ce81a3833978aebf52ffb536f61b74a25107e8ed440504c546f1941ac762d42f0a10c890dcbb79b35d93bb85195c8c58d9b27a934fc7466631a5451939d61b009cc054a90c143636b3aa76fbadb37dddc5afc231cc68320940098fcec220d26114fb88b3e10cdb3a98b5df06d2259911d340d27798b27108b2959c5734432a5f45298d4c9be20ce912c199ceb1f53c309047a3100c5400cebba5d6c6e4ba7ae707c38cdc7782254b280b1c8dcb85726579842674a7d6061185556ce3c841fcc4927264712645b6369c30fc388d6899480490e9f223e7435a3ba055b96179c4e625eebe824ca0498a2646749d04340c28edb1077cbcc871ab64a2c23b14fdc1a45b063ecd263ab49936d325cbdd7a80d171de2e6156445655629bd64ac08963824abc09014b497ed50af28b1b62b6c9d35515a0393341ddc9ffcc42e1ada20b880b35f49a312180f66b866c4952d92f2bf38b08f6110850224909413938678c8f9585a0741b561a36b7680644947485b2462d984ae5ea115fd52202643014607067b9540457a3405e7127e841d004b86c094468a0743b82bc70569c3388338e0dbc6abd1456ca3afc4564ee9d361ca0a708e417aaca1af12151d5fc93db4b652eb990a0335c799a27b713172b6949be937b570384f3627102dd2bd784c97d46c8a2ff2a1d2a0c438f0281cf29971e3c58df77c33b83b5252cf0e72c4fb9448aca6a3abb06a22677c0206609598c544781598fa318bd58da2625ccaf7ae759b774147380f0304163b0786a9203a1169d943b54b9b92f7bc7be5fb17e87a37dfe73712c33fc0824ab448a9b2295a7364629956cac2cb6ed54ac085bc3693fbcd9cf7b44d4b318e248ad737aa1b821fa985bf7f219828b1cabfe66deb269a6be49dc3f74af594c820748fca60961fb04f22ac2cd4787b5a41a91195b8588b3a74a1a188f95e50ab047cf42fd5b63fb88ba57dd24528f90c2f966a1cc91ce39ba848fbb2ec4576df188350f587e59b0ac0848d71a93cfda63e3ef93745c6516cbb69a5505b1f900aa4f91094306c84f640050393f1c751a05872aa7b027f678b1aa2cd5f97ca25806a53016eae4412a7f23ebd8a7359e5a706a11415951ae2a45d60fc999b66a255cab76ef85601b2974c462ec4202f83b2ba85190aec7c6fd6263d72e19f7ef71b6fd37694ec1e56090290549d002c2da8b18beab345f969bf1b23144486c299104dc7dc367265902469c45d7788c5d23941c6a1608a12586692eb759eb4835c537429ef287b6709b87dc22653d7a92cc314a295a6a6c939e33b3a87394cc40cb284b17987a088fffc3f401c2b072cb72b467d59f930d82101ac725c79d54fba036aad5760a615cd5fa1a323a87fb63a4472228f124a3ef72a086ac74245cac6b7784249d17c7a19a126b28c7530c1ebd6a806097de35177a5070abe84bbe3b99ee7149c57224357c8624d08ce6467b144e598701987fb460b21e53957f57ce98343a564c63fc466f7e04bbbdaa63ce79448364ff1d9c05257219d03b2d90c9c0c299026d3c0aa4845050092fc7424f1ea03716a456bb2b935a2be5a5570b1eb467d54890493c4977300344887718bb54aa06bd890229359ae33395d7a7b08a71465297780f54cb0d2125ec1311d6bd31766470dc18810848706c0e79c8654c6c6cb35d4f62ee70541e92982ba570dbc289be8e842a31b7e7158660744992d6506e1d1c8bb512f98015270376158228319cbb7a2411253a98cbbca8a6d86c2710631e105c217b2ac05f813474727c1b089b3c8ab8779ce91619352d86b38c5a622c73d692814fd36800d5c009af0bf0eb6734eeb382f70412c2469d10698071c772e62c6243cca236c2676fb0258487430998ad99a1456d29d79977c810953b138642754c0bb993e8b9b7e3b3b7972359569c44bd6576fbfc212f78c0c33362011225d2596bfd2ec1a4b721a36259fb723c6413910219048596252225879bf301c20d305dd3bafb2e62ccfb1c3d300b5460ba561f3c61930662f3641b763b2f5b5b2682546cba9a15331b8afca63cf68b7a1fc2e49c5b4042a3a2b2148c427c9701727dcf3371bc7b13aa62878c8a358f391f02b1fd3d2ad663c4f71c36cbfe11581e1995d976ca37440ddf9c4de2b48ed9c492730a977e017a7065cbcc811bfd155d1935122e12325732505c6c568fa67bf7968ff6836f765c242b5b9966c333ea1161a336164d72cc5767e40939590f07b537788c46265fab1bc3078c470e98dc1b7a31cc53a83a0a7e95c4634754a069007341396371ab79f6343b601b50966c5999144cc46b6d06089a879871bd1bb9c2cbcef84cb8fb4a031786bf778703b164f6787c5cd63ac781424f8550e1ac992a6c04bf7953787047b043632de12698e80526c813e08f36dc1db592f48968395817566886bb2c7d3fcaddf331273ec7ecbdbb3e5d70c823323fa8a1a15e1371534cd0462cd052685950bb6b6833600243e35c7047bb20832f09e1d854739c5b425bb32bf86029e1159d79ba70293badaaa25385563cfb4babdf4bbbe341058d3817e9a7941e69adcc867559b822bf63d0034c15de1a9371945bfacb1caca4fad8590f723014cf5355228d850d99c57f85c67295a4afa0b9d8e1da6065ee0e9e43b6da97ab878370142b7b2b346179050eff0a4153943be66d9ce47c6772362ba795b9da0c5da5f195b80fbb99c2e8b06926074f3f604b3f6195b5a5b9737876bba72 +ciphertext: c8940c3e69cf3837c2792ac9341408c5106afac1fc3985744f4d0289f745add955784e39e345526da04ebb3af35ba4b4a8cf8ab6fab0cd9c27b03266dee9d0c224f6a3e481e313af21e485df717fd89bb60ef6cd991896095eac6d37c20245223c5c2b62358a0d57f255e53ba44663667aad78d564c0c6b1a3cca8da1fc81ceec31d3f347d890b5d829f2c93b82d25b6642ed1b911ec82b7032ce5c0e56649dbe11582097ce456352f842095e8ea4a14dc3ed29958d548b960380f4c50dfaab65accb98d74862dba822c438dcc4a21ebcb3a99f89496aece9d7ab098e7deae6ff750f979e32f16d5796e5b4a68cc10a396d1894066c1a335b4a15069916b0e81ecbbc526192c904d857bfacb6434b061a94c55904d20e478a512474ecd6da3ae06fdbeb4d9db1d571dca82e43934160d0f36e52cbbd8f9f781c07067b4e82cfa9ff0ab971502d9c09a323c36ff304198af9dfe121311e207d9a949591f5e6e64accf451bd14c06e165a177dc4a47414528c85c1375ad952cf16fc1622d32513405d0959f333cc139a6c27a68976f06b21d55f4332680dffcf12d636f68142e13e5f05f2a8dd0ae56328f1b0e409eec89323c4b03f693276bfe99a5dc16071d034a33cc0bdb6a533af8d2b755d4e4f89521762705d0cf88a69238439f51a2c6982a82272616d34aa986db27404b60a43b18b565faca6263a888e506ddafb1e8898483ed24422ff52af414227c649aa280e7b1ecfcdfe6e9f852a52824572964d9a0309e0eef481852f344c727be41f136f5acefa62275b1eca25ece000949e5f93412deaba1f35d979281fe2e687b3ce49fa69bd2e70fac2dc72dc546ff68b2394d5066e7dc7e1e8e4461464235820b54a2672ea3d541f582e8ea28efd277e8cd22458962a3d9d8d1b3dbfd978402e20b0c25dbe8093632454498620f27646fbe1ca40b07fdf986399f4c742ed706b3e1c3add52e20a971a3bfd97e7b77b557da18fdbcaf8d1a53ae79a08dabeb69bfe5be215a74791a2686c8d13f49146cfee7eebac74e8b0b35d1e5d638b10732c2077594683425c11600bd90a61cb7deddc91cd16faa1b4d80b33e37cf89a73c5a2066831fbd00a6c838342adea2cf7ffb9eb9117024a03e10331d5faa00478d8c9826c2df0f44480ffcbffe3e4eec957c2e95c135c2ac2f1bfc9d9c241d1550869bde95c00616f067bc85cbf1a58b3d53ed57dda18e2668070f9524d22591717ca7426876977447bb4ab0598d52ae2145b389d5889f414c42236e8ce34677a3948214683e4083ff91d96562a72395d3a3b18262db82cd484a5351dda702a03431859e3832c4ddc46eae03250b186fc1ac8837a1407df20a3cea689d163067cb3915a067f8e32d1137d08fa382abed6912b0669c360b8bf42de50a596036ed45e5481dd6e42f984110a632ef441a92489444edcd716cb9df602755a60a94032dd528ad2627c0cef727f5b21efda54bd27459b3e1d8b311098f10a1534b30a34975c86110e3b8cf37dc1087e52097e5aea8e4cc49c62d3770b4d9d5aeefe42ced080a4c946c3ba70d5e601a18e0f0ab985eb0973ca252c65fa89308dd7c2ee239595f464a290f570046f31a9549efabcad5c33d6ce7794d08cb3a42f594f89489eef9486df572dc93259e412a9c310f878d785ec432c373801cc9319a008624a3d2619d74f0caf877322d52d091a0ee4e1e845637e6752f610870b8bd9c62e1d7b53a84a6d8ce169c7834f2239a20420d5724f1473dccb15eb74db3b6465b8dacac10d1507d403919b964df03eaf7be3d86b26e7defacf89ddac3c6a21f60673cd2fb9f4524992875f6c0f1e390b969389d6a79d06412851c5443ce70aaef5f6168d8ba1441036d197d4cbdab95b144044fe88ce36818f2ccec8b1769108eb7cde1d9ed6030e39e2be445e8573989f818d660bf94ac95f2db111e28a6ba839b94e6486dfb6d75ce48168b16feb3e6510a862ad777831ec3d2ae73eb15722a45ab65f921a2bd39c7013d39da9e75a80975c2c9281a6efa7c6d26bd80ab3de9980074d9a59dd41d1b56a4ec95a0b5a9f2aeb90aee83da8eea8ba2531f095b3f365aacc6f3321b624513e35fd3c9087ff0d32293ef2731d81d956667e0b2be7c8f44d3238931c69d022473059f5c014282932194bf30a392bc4f1f8e3290824ca56b0570af2cdc6a80028f88bd7641505abe9cc7 +result: pass +shared_secret: 5a2913f3ed09c2f765977781f18823602437334e5a5c210a71f4cd734fd10b07 + +# Official test vector 27, seed: "54770ea1252ea2857d6635151194f5f520adea8a41e409ff498d40c271359858fe2b084d5b96bee087b8e8f4dd4e00c5" +private_key: 93d973d0a7b385a29d218666fad6525fa2788a053b455422c2526d556b1e79a17330c18063b054f0e238ebc1ba8cb874836989c4a7c75d364118585b7db99469d52b043243ac867b25b2b8cb9a8f6699c3d8fbcac40423fad90a56775c57d02107da9dc94731a2a298da61caffd12ffc119f817cb01d4c98a2f48443d6b36782be1c25adf882702b225f439000ccc8c3c16129f0040fb4bb1a4993470f7c20d73ab393016847a1647a3c14ea88a7095658b0b9c61c8c726fda255d641b83f03bd1c9c3cfc20709909b1f227c89d9c7f5d51fe9fa753ee729571a3e7939af9cdc17a0373f86a4253dfb849f70c52c336d1f34a682661b6c21c73e9a92c50bb69363a9cb3c41d55c1da8d69607e012f5193a79d581bf8760cdd742f63003e96c6a1305aedfb36de84a9e5b832eb5ac2ff204397d28c8eb64a756c27d8e7b0cfee3ba9ba2989c2310633813c9828705266c2f8569163c91e33baa49e6a4b6b92bef81174d24bff6c0cc6c020eb501126ed1507ee8cbc4a7281b34c82da47bd06851c0e52e5ad9ac27f3be552564b7792fdf847f3cbb5283ca8f04c4b6a5e0bbdcf3c77a02c29fb847a5643ce719b276a39ddec8a361d73a4a54bdf1757cb6c65b0d62333c562a64317f713ca2c714a2ddb1bec986583e8b07a5f24217223aafc711ccebb83e7921a41625853a045ca02cb8b597332b524dca8e15b02804101e3cc2882546864d732094e2cbb06699027727509a4a22e28b7cbba46a30b174594c7abb7735a47a471a245050c0aa5c6abf020e005441766bb4741c756c588e4bb7963ef2a889e40d542b65a38a888e0511d8053aefc6401db4c795b718b9019c96b39458c62da35a383738649c065fd0812ee4a0b9b809725359ce754604c4e8462d7094beb3ccd17148e4ebce2a799dca2c55174c98bcd9206a0c340f8c559f6c7745d7b305b672f263643362b2fb099fc5173b43c167cc25bd8fdb7dfb7b3252162ac665bed6bb0edac9822745a80a463329db5853b091f304094dc949b797b127e11ce4860793757cdaa510cc5c04f0c7575567ad1457c54c3176861c77e7f86446d410e9b3a005678577787d32741595989d9fc92fbe5b0620a11aaf94beeb68000877cbaf39bb6bcc2bad72975bf94ff94a56419726630cbb32114bbb412c27779bc49632faccbadc4c3bc1a61f5d2337754b5981382e6d406828c6ace3f73adba6021aa15e52eb152b222b0bf593519703b3ecb38a39adeea3123a2167f1c102a19bb83a76b562090e7d24c9fdf53056f35cd367431b82a7ca210521d4c78f78ad54244e97149cb2d28bf96cc36756bc4474c0bff06aaaf3985329af217469612b225504afe70c69cd4467b3f277df5a2b74b14f407a649dc76361527c0059a8c3fca243b0c2eec7c615f7c8a15a5d4055a301abbfd5a5be42a8cb7f4b0700f4575ffb719965a56ac21dfdcc19d48a8302c29cfc340fdfc391e2838f878164cc7b58355473a9ab44098ac0c0f8cf2c0b3657709e48419c3aec2509222cb658aa1f6709d0c4bf6a077197a8a89f433ed18987072a9bbec9a19307c51f66cded27a2d0538ed86989040308fcb42e8c8a9bd2c5845a914c18c5c2aa5cc2bc418ccd5328c139af2d66b63190b99c5042e7b81372772610511fcac1449e71a6db9b35fc1b5871a627a63900594869b20a1483a055c8bcadf3468b4e9a7cfa6c4e3230c550889a48f0a5b5ebbe64cc06110c96987ccc2343bba708791bd9b2d5d6b028b9425841646244745b38c644342781e886ae452e3f04098e9c0b1c37c30e08328b011e0f4838a64874b1985ca1834559a07711c035e29c0159286d9473551ff65251e2c26a227e75f1293b2b86c53650a33b2e4b77b0108050f8c8cfc965771bbb8a9ca0075e09a30e81b2a4bab1e424587ab282ca7927bfe1bf3e18775cc36a6579a3fc338db8e090707ca42ca12981dc7956763285014577e9af843b7ccfc631bf706a1186c6973b532fb204fb0c0645e54b7581871db60e5b4c375dd2bd43b35865b08856166f640ac7efa516f24885fc9216fbabbce3d66fe9466db3907ab224244e759d1b89c041bac289040d125aac681cb048d908d38513eda6a23248a01c5b2c1b6c6296a5c612b21ad0b433bc3296f9f40b42f02973d2a4740c823e074aaa7ac9f7703a87b72bd0aa050574b63fd80ef56c882109c9eab220e67041396a29d6977f9530c3628329a2e02a7850c77c73a4698145c837087f2241ae46a1b7b692fb5c81de38846a5bad7246b596a889eaf558d1d55bf1372057f1795b40076d53c0b81288fc9009757a9111ea26c3410d55217768378cdc94a3cb40af38f67b1b473b15205c58d876077b2c8005bf870588dd6318ac154dbd9aaaa6d48d1dc05118739fcc7c12327a68f8b5369a846b6aac56fd1043c5ca8675752c12549840d47b6563c703723d6b8791bdf14e0011c0605136a1521265c13874b9ba6064b85ea895180c634168774aa55e2df34ebd8132bac959dba90ffa656e7c61677d3b801ef3604814ac36d31657bcb05bf20c893a4a2d50644902133b9b16e81c1abb2b5521408f3799152ba14d51a6a7f4a231b5167b0273b22cfc606482cc6685bbe8e80f6aab99d7f55b50e093aa55b568c45aa3e4a0766a9228192e5e91378af608276308905826c6a24e7413aa98f57495dc2d5ed5bd6fb5c65f4b4ed7b9c4c7b504548b0306c892f547613516a9064417b1b96a95cbce5b502bc770356df5ad52b98adf01bd66175ab3747910c814e7b070205b60978aad90c43341ac6aee03cecf7cb8cd2b4842c3401ae1a3b60207af366fc7f78069e39fdda0ca53402ba455af5ebb21ef9a6d60501d6ecb1b5297312b280ab2023f2fcc42c2d66308f263b7d019af68144247c2dd93a05df57daa5a03e896a182b480f1f607ea668aea60b66964b2a3fb609ff547da9a51aa6848ce2a686406c7fcdb058595a807a6692f833cbe3166fffc73a2f30523c86db1b98ee7f477d7f1a8c7110076774d6147bb56a79aceb6804eb982a8d00356553a68ea8e91d8b86d676f394a776353bc830043cf209dead22480c08d5df25e80fb734bd6558f1b9080b09fab642808c458cdeb0d72e5b49305aa502321711131c7f848fd14811d718be5c805c8b254c8c556981ac8c1dab13cbc9e91708d99688e36599f3b7a23f7ab83f2a3b613b38287b2856aec5b4ee90c33e85b8d88cde3870759320b4c1c0d8d727c8e379f84da0221b2cdfef70270299bab0b7f9db8c69d7c9ea6d01df6107e04440bdcf945af329bc016892d8c01f071654ae3b19374946246027210cf9b1760aafb5e4a935c2d0b7c70db3721279e6fe43d712468fed532cad432ec30a1372554c97c3769c380c709018393364ca97f9dc37a0d393511990aabf398474965dc45ac2a37ad60163145bc3b73e7a6c2032f7d2216bc19b26b4cc55bc68ed996411bb00715473f4e0636282c203770a3bbdb26cc58aa7b4c69dcc01ee3e53ae514169859b632937cd8c355c560cef5c091f4080047929554c94d7115393fccc11fe397f2854564533fe9e66614da3afe15be92196268720f5fca36878797a2b045dadb2491fb3cdcfb7253f18750774d4108bd6c7c6545b801e8e368a1087e0f33c22a359907c1c75bd59db28268da457699337356436786b16bf6a25fc55141bca303faf566039991c700a227c01e6543bc173c06b9a8026fe07e032c30f5d4c86a950a3a7b32e6c67e51771d78c08cb5382bd4fa8068969926d352f7e5820ab19878197c25172e95d6ab6a05acbbe375ab955bc777977d2b926786c9143978113c490731438ea53c0db27bada4be961b38138b4c684a12d4b08b6f03ab28f6a260b01afd348b59684197002bc534836c8b735df139ff98c84ee03a58e02d0e6125f1e09bf7d7a91840226362a667627ae5f580ee50b594fa64892a508ff8bf80851abdc45486936e11e26beca14334454d66c0128663c52a8700b525950425a4ce7824b25b9e45ec6bfff8279d1503816ac76f498f8e18b2b626b285655ab40096ceeb229856457699b500b77f7af5c2bc8c545c4292a387583fd74dcd20c4bed85bec8c245c63608ea302d557199d9a70194a5e92acb24264532b02baa8f824052379395b3b4222536164823c379782837ff417b1583238721b8b6b4a5be982abfd35a90d07bade5c03c4c3170257bc0e88b41b242b146027baa2cc72474d00427b0c79cf294203df379628799452d3952d2ac709f20dcfe33b001022917a4678966f1d9065cad2bb9b6979817873e8d662d7ba8343d18729291c544c00fdeac5ead3c8dd2cf3e2ec7899253e7f980f9ab3230eb1a9a3688f94bd522ebe016e2980d72c13035e253575fcae389887037cdbff8ea508ff9e5337e2fb607919747cc53df871600a8982c350df524cde514431ded7aec23576530894bcbf0ec0bfef0bb64f +ciphertext: 5740d7e2c1b500947e7aa2f01381407b5627047669bc3a89bb5040aed14f0be11c05a56d743b884f7f493184a108e2820a859bacf72be64709a6f57ac785d44070647596e7f23cdd66a2e0403371a0ae36bcc95212fcfd7b00af1dcd22efc5905c37501ede6abd9c7c7b366762a727e58ea82288ed7946fcfb6cb6f17cfab6c30622da11b4b6200fc8237beb65d50f2749c26c3c1b014782e8cf3bafab9c6efc12d674642101d5148e610d0b62ea6d024af6386f5ca7a15f1a2f793615e8b053ce0542ee0c622bdced6cb81c4ba9afb6d6b70cc07e7d42cd72556b8e2c87169a8fde513a8c53fa66e280a1b61e68a0a4a0103440826c430a4d0b55c8181f95c573582246c34b880fbeddc4e6e9ba0f3938004cd8d4b429f639ef3b214f78aad31074ea3b6344522ffc306ec466ec89c5919292d39d682ad3e62b398a2f7991ef3a1a64e94b72d7ecaa48e1ceb95ec88fff36dc28a8ad20485b5fae3694fadb942bd6817f79adaa43a9c747cf29fda10472797bd7736c0d92d56ef30e6d10dffbebc0ca4610279677fdd4b015fbb5f6785deea717282c4eaec871b8b5f6e93b197e37ac566348d4d80fa4dfbf9fdb33164f09eb687c5c445942813885714523166ae4d006e0a0204bd88a870df62a933a794a1dabb4646386c0a428aef1e4ce77fe2b41819ea313e3f475e69113d7db68bd0212de9ac74286f8f99ec35892a7ba5a2c6caaebf76683194ceee062243affdb66b8d31319ea1f72a04b29d96423fdabe01dc36feabe0c1f4e189d6704f7215903ca7e0a5c7d9e32347ac8eeed0430b634684636ca55cf3ee8f782afc18e76729bffe70a66ae2134a8d46bce987e54e407e5e2631b5838c461bc26366883b3a45a71e7e9a4559304bb9e0a0abc8594d8e4035dcfa5fd87b202222aa5692f8d6c682ff889c3f0137d88b56959f03e2b210151ca42af8f130777545e9ce51235cbf5e77a2c6dcbeecb42bd7ac91978c951f52e1e6fde74ce808de813bdd12fce935826a39426ea9a9485f3c11fa141ccde32ba5131f25fdedb7ec732e7716404c0c762c3b4b616eca02fd824bf28d3926d38817d0bcda5c2c3db0bee7b5075f140be211a310dc652130c271e65965ed2efecd53b2b119d531666dabd920da11861b68137ae03eecf96535ada14502c3dcfdbc6a224d94fb138e3ee8417f1547743dc618bb573f48984bffa721977fa26fc695f8053cc98c681f481b45321aee96dc9ac158473aa1cb4904dbc5614ab3b7856f0612f3b619f97094dbdae6da8a4af8fa0f302a85492e6fdbb15982b783eb1736f8667f84aa031ac5db11084db69d09e8caff7c52d89fb7a23e63c125ce4c39b1de1c1c5f8fb750bef864b57ab6483d49c99d403c47f1dcd5fab8e3e02bc80689ab7987a90c7bbe1a5f5caee65f16014d17a32eb9a6a963ece4fc691b4fd323384696af89e015a03b57638eede81d2e6716fe8ad838f1148cfb5175953846680c9ce86d8c786a1f6042ea39472a47e8ef3f81f07a35edb0378228cfa7760ade7da7a6849cf3b8a18ef60286d27f9ff341a4f1fd4f04633a277593ff38fc095208cc37628d980e8ec2e8b4d57c0529aab6752096968ca0a17d1abd1071d197930b846c1aae49b69cba4b3fdd2293592e6da36bca6cf38e03e666d30f33c581e54efca3115b69957ad66232643bca122dee5c7f1afaf155889cea07781fa92e1f221ebd9928fa4a4cda0d2d8b95529a153f965192421bef46603a9b89dadd13a29c56239813e3bc577373a7321e1df79f7b59b57d9e39ec44760b1e5fc72ad82771917ef756917489ea0f128211aaa31a50f9d380fa48933383bddb3b11e1b252e2d2180a9a7329ba501917b7efd21a7ba71e89b20f5633457792d08c20025b41a80d58d3f8ca1216d20f04f62d1d2742e3b7b6c77e2c6fbd1a4424534c72c914c0484304e8e789c83b7028fc0042fb16e5a30dcebf2eb01c4aea036e2edd975caeb8a32f6afa3466bb740e7735df8e1b7d1838c85b366b43dd97dcd1a66b7cde59de198d5e0d0f3c1d74ad06772fd41ccb2b568277f0106b0a41fa1afdfd58aea61ffad6de24dcda35c9f8e0e864d898670af25268b3a2ab0240e95a0c0c36821991631742529e5f8612bcc0f71602fbf5448aaab72e6e598e5004e454bbd056e76a54eb2cd7eaa92186744acaf865373345fc79d42c5cb08314ec7a08550 +result: pass +shared_secret: 3084c8b9e79c5eea12b89c5acd1a5cc6d9835656138a1f5d68d27fbb56988d57 + +# Official test vector 28, seed: "cd6cfe94e9c0a1cc4ffdcd2d7876504be5f50f1d1ca5cf93482943465b268276056f2781f4de805c138976ca72621387" +private_key: 5bc2b53498cbfbe8cad9602f75187bd676b0b4995353374df1c4aac9d105b8172badd17b6707b89ca23568f5bed5969479557cf8a0abfa8b4913a7bae3720fa73c705655cb39c48137d2b0878429fbf44a0297b1dc71496de1c341290865d60b8bd34c761933b3f7cd78e42039a4377fab7c8c82b9cfa6b0358b0783b766e3a598afca3aecc59d0eec2d35a0a55210a94eb44377634a1c097635d851d022c5f15838bd299f6e1a2c7e8cb330515f595966ba717e0da12a2dc84e16902e6b022a48c4cabd27993e5587cfb4575fda0e67830078d01935e4b47861c893d3c59267404bb2238ca14534823a3e1c82a97047f1b32388c96f615c729feb7500125e17881bfeb2b7425151914c5bd24b479ea33bba133a56fb1bb155ac34aa2c15d77588ab13ed53432bd0bcea28b79c9cbde8e66d75e6ac227224299a3391a38be9ec2154751729022e588b341a062f6794494b0b549b0832d011ca6d04c976d76111f85456ac9c21649106a8b58b359c943aa7722c0b737393f5c9040e0a9126dc8ded3703ee7298e1424c18c2492fa1573de9b77ea9988ef88db2a61221c8729f0b0c88773f8f9553ceba7ae0d6c9ad7ba7919741fa140e0703c96034766b126a6f992bf13381366121d0205ef45a9515b5a05d8c6dcb293ae44469c8875c40813db41a06e935c80fe24ea9e178edea641f48519d6a6e6b0547c4940ae1178b234bc06f07129a6c9287dabd64f151f0f2be8bc9b988b71341c74164d430fc6bbcc4e23d36938e2a4a8ebb8b5a0d906e428089e48946b63bb2525954323421fcd76bb00245ec4761c5fb3ee5f255ebfa33f64584f6dc971189a07bb19479f99247c11b3318076c2c9c08457e35aa25973a31e1f0a82355916d5891f193b0c45bb1d496091d7a47a33a83a5f34ebdd9b8935601abd60768fa5c2ff2bbf2457aba1523a3007e09b90a400a0c8b23beae5b48d6e9c642d985376a09b8ca6ddfb493ee37a0f6551f9c9208229a36cff883c09b5239a55680967648116010645450da2175ec5e4a452c982ab3ced778a802644945678dc514daa144efc4b53a153d6737a6dc3515c4744e39c61f9fa8522f39384738c99faa3a7cdb779b9a7b75a5603ac55bf13620b647692f40594e144c378a3b5041ac1c63034198976bf9492b7393de8455c284b1d3b2b773c448539bb493a9a8f1fc39045917f40a8cf2a052008626423328417478856c1cb67c36a34507ebf38eec630ae5a73f7998344cf7be33268fd99492d895aaadf5164df7429af1816e516f2717a0f6d0858b3a0119aaa1cc041eb5172d465184ff312e23f766ad29746e78aff74abd65a2af2a0ca0b65cbc1f1a9b8544446c28c010da1dffb708d842bc82014cceea6784a35d74510503e8a8afb7985684253f000bb2c95524c0827401ae9b058bc65896cfe43b9acb3a00a475614136930bcbf0ac993e61236c24123105a6a70058a8d49a11931875f48f69a074d1757876f598a4a665ae6278a8e27d1591849857c42fd2a75dd4096359c4cee2a42620b62ab641da1bbc1ff4acdf2220fd0751cc8a3789c06500765c632a32bfe88d0f9bcbb9303eb1f6cae94a45d5f537c7eb7205d81c65863216f571d3babac57a6520a30a76f4950628cd46b88ab8f4c88fb33dfdb13089d85bdc7550647b257dac3c6484cf0e881b83f241b5d869b5076148607718e43ef56572a3aba527595c25d541ee1477f50773cc433d573b8c1599295b01b321c7aac1f001c65baa0d63650fc8c45f7312d1a7700fa1bf92092768c406934a8bb3c94951f17fde83804f2608d292999f53872b167d2c4c17cfaccc9ff37ff7542e6d097bfa414ede2453f2328408f0580aeaa7e67116cd895594452458675d93c03177c31bcfb57cd173006548966bbb6cc628c446576e9eeb602810a04fb126b37c45a6e4041df38330812fa517117400ae7f429ab1a610d9d09e9ed36cee0401d09a0d847b3dd2f826eee3c841b4526280225d106eeb183c816a6b8387277e588712279cee18c34d3162878204d4506f659047a9e126dfc756d946892d991b4bd406c83cb013fa8a9e7758aac12c0f0bb6c014a048d5457309a125aab0759aac0bdc347dbc7eb572386d71569198c6f0a6c213c44a14a22ab40a7f34d1ac821972710b8c10489b6e431f18744974e86c075394189349b00b1ffd5cac6072cc10217b0e3203e3f61e1d9281c2d208af83a7f071ba78546e273271ac1cc01a320f35e845f10c59bb8c97e1627603e51a06e532ee716eb83519c80a4833c7ab45e6951137c0f731964ed2197b033e17bcb5237a1128179a85d24f730a6b31ea0e52075ae2198b48106ad0e1225701313af1a7b675347bc0ca48d88c4ff054edcb1092e87ccf070e10dc093bcc9bd400490250b7dca3775b715f218448caa01a8d8c8c6577cc9f21a7e3e6208b2c42215794954aac57712a3845523c74960b57a97e0c310cf7b8798192eb9507fe65020f706be129774f10794f2296abd13587a78456b083a164bf23c801969a57591062d22bab23b61e7dd5b31bd54520f4080a4c6c01c6603f4b4b1aabb99681be0b9c671f496f8cba2a571502e0da35ffa9bd2c77a5e66809e4d54000b851b2226e23c1072253826f374842da312ff0931b7a85e6186f5e6a31276a2d40a81fbe135e2c86c328b896f07c2269f983b313cd92578882a321f0031fcb9a9e7d618fd3d543e34abcdddb98d4c4585cbcb67789283c442f8c5cc914427fb1a53f3e35b78c2110ba956defa035084c53cc9b6fa7946e11840087e8194db6607246c7b314ce7644b8e522cf494a6333dbcc23da197cea95c318797ef0a18c84bafbe968df375fd0c9981757aa8c878658722bfc2684e012af3b30a067ac996315b0cfb13ec45220c9447ad4374c78484ac652921328214ca33466f6024abb7a78cbb528c44a339638eef09d3ee370d3a1746053629e7a37eb2600f2f73eb9d572030598042315b093c0082456fab06ca2a4c9bbd4c651bb297b494fe7e38d5c8aa3c7cbb6f1189d4a2c02de0acdd0e2c7ffa22e83c63623a21dc137c00e07193bd28264ec0fee2259ff2362ebd1c252103d93645e92e398f46935109bc0cb50c619424db0461823d33fd8d271727554a4c86a5113a17de7bd17b47cf04bced6cabfa7e926993b57a6c0a693e251e3b90b7b17195ff037fd867b87109a8be90403060cb34b32688c263eb00194391ef6c978db4c83c8967a735895a70b6dced06016b3737015696f1a1945110a44f022472c0ffbd049c0925ab1d68ef3f775308c2a95e99865c04b17b34d28a1254c433313c972a7f51a48696db9d7ab71d4600c0563b36437fac1ba6ab9ad6e89630357485dac1485e2808de8869ae59fc6a952890c69695424e3bb9f27aac2199301dc6b36503699f2504ac5e35adfe08048f9842df3260abc3d209a1311d65c048b58111bc7fbd6953d21b56364a51d9c2419072dece82b9d93aeb99c3f0a5a6c3f276504c3697a7c19563abd84068e8a39373c1375d848400c663c44e6c968c3c61fb375eed10baa60cf6158aa7e39c99e609a8b0765e36a2fbca515e4581a0207ac3fd5b3b7a95f193a08511109f335cd1dccc09223129da93aeab93ebf397bb073bd6374634675b6386caa33f71e04b1b420a2036979acf22835fcc511186441e1f5858402af78ba99673125ce9331b6686821ac739fe41467ec22736463ac4415db238bdb9a32e1895e0445aeef16b12e818f33a435afa91f850549ed465fc026163f988582040274638eada37dc162bb2d2839ca934bfa44acaec450ab4436ee78a5e658134bf80f914052be1a605e69ba87005f4042a25569c29243157865c5bed6918da360c4b824c7ebc8157870962737d150ac5583907c0c0f0603b1dceca45e10467ecc3a4435355af8254aac26f411a37b2587f40cc023c1c497664de5d705fbd0c103e36875b168c1c732ab364e1a4726c1d8207e1830d73721dfcb55557352a6508469eabccca2ca706c1de5fab0a7647d2cf7b05e117998173c5b3958d483491f128f01889fdf00d0b668a857479030f0c16bb753794719e4e142f0c5a1a52445de8862cbe3377c383deae1817b8110e045321a16594fa7c1d1037fbcd2208158c625514f3464237d7c73b0dcc605fba342cb6fbcbc71391577ac3781adb39d4b1c2236a4c9579810d039c10fe556dd954d71e705c6fc9389f3be0089697dd6703d8bb8ff08c88bf6773082a56378b52bfb30182c9ae1512ae1c2b9f99b4f3d0b20f8593bc530c585d737540972bcea60e11441e07a9c6827031363990b383b6f42afebf55e5f20635ba731fa86c24d6908aed77e3a57b2138c0c83a5bc98ebd3a002c0a9c60409f3dfebc62eda14a11b1c03d59d46382c2c2a579009c0355da8a58440c49a0e145e44aae52cfc609e6f47fd7a6f6af877190ff52256d0ac5b05b89c3f449f +ciphertext: b55c52a5e679423c1ffd045386899ee3fd7a9e783eef9e46f2725ffffba09835961521a6891a76ad591526e27db7bc973b07bb6b4e768ee4dd4c8b49acab0389c95044b6c2021cf943beafb912b0a492a01aeb90960f09fde6f69a55356624d7482cdb2a6c4faf3c89aee8c745754ffaf34f69f4cf5423e752aff68d305a2dab756a20a37ad209ea7f9b4cc5e5d493771977bd8276c79c77c1ac529c1ba0972a127e0abdc345923802b8aed0c1fe0d34064f43bc57fcb56a54c29079da57ceea37c877bf5d888233d2d45dcaf897d729ef94d8ace2be06efcb785660bc14971f5474440299341ee1690f11f683515b35f30ada4a6944c1d379c74af9dcd1439a780edfa81f1167304467c5e5442031fd6b8aea5533e605f4904cd118bf7572d1526e6c4a18fbebdb268b1c695441deb5568eb417ce16713bba343dde15ba464064bb4a8e8f76eb78aa8cb15a2c568568eadffbfbbc248575a4a80cb58282fa6a0dfa766f542f844c6f282d9f5ff882ef41e65b84f684a2cbf4abe8ada244dba1a65830c1abccabcdd19a99f3d9a722ee10d59426400f39b92c385498f4f4677502683bb6e9e38f3ef1f33f275ae2a24cecf14faf4052a5f560ccc887045c74213cbf118e373c093372ee148b6b94e30bd7fbe1ebfc61d9161982db6eaff4f4eada119599f7bf111537c9d98f81063c3f2d78e447d4a142d1fffd144dc998a1b72387c64458c6ad9f585212e5fdecd3728f2491bdef0de8ae60aaaca1a774ba8062ee5383f818c2223bef3c9fbb39e2754c809e2d914c899a331688eec1ce36968be0d21acaef4be75a3bf5e1f7365dbcdc0c9dc0c9730ea1e9fa79357572ad04a8d2cfdeeac940de6268e24566729d34f2f257af4b7ce48a43d218ffd4fcc3beef82a114e79289a601218e2872dd9c1467849c4f6c386322508ac137e56949eb6e9577d4e418a3033654e1dfb8d0bc196b3fd3220a8e34c02b988bb84ff0e6c2413168d9a018669b602994384e84f16b3f90fcc174a9ed7ea15d091df8f29bae868e27ded0badc967be3706b1c6ae24a903c4913bbec392cc0cbc8344465cd133d6c682b6580c8dc16c7f0c2c277462479f9fb94b0fc2ce36f210dfcacd4e14abea15652e5c1f2ad582e0ca1f769600c04411411c63aa8311b59a0436cefd61e500481dabd7675332c94d03c158e15d052a061ae9de4f5154ef3adf4198b42e503b2ccd6208686c3d927c616a6d788cb938d435c599cf1f6b7b228a87dd557ec583740292da0065ea653ff9e5e45e0b7a2bb289a4f679ee1ec537ebe5be7b416e08a42ef6f2ade5c7ab864eb60db71af24d1282b222c7579fd9a083af417fc075bfea4b2fdf9a8403c4f3646f3d2c7535f6852f7ba49ae0dbdcc0e06fd5f5d5333bc70f971f1b8f45894fef181e65da15232065e30d3d9595e70eb276c0e58814d7f4455d19ebe868731c2e5a9ffe2cc268234c7e23f3ef61d72998e15ef32e410fd4124edaf55b2e40eafcd21f48430d87208aa4d40809d0e89599c48d99b1b905271563a3e2028a1051892e588e94dfe0d32f232c4995c3a781c95954433e1a9603241ac0c2d100a1805e06165aaa36bb70eaeb6b78dd0b8294b88dd8f1a1499c7b088660cf0d2219486664602711de0eb49424b1e46ef3c494b7549b5fb77270708c825a40f3844495d4ad240f6265a969ffeee75c2102ea4825244e547d4ce847a13d88b59229c4347e35bd35b0a22628ce51144f88913ddc94922cd930721b2091760c5e15886be1ddfd8fc7444dc8c16eda51fff288b2ba3fd37554672e953c38c96e4573e38a712fbb903e3d9193f7d89d8ad54c3d2d1556a664b7d49554161d98aa662bb78d71c147732b3e9d74b541ca4d5b7c8b383f2488168f5e3604c51a01e3684ff2257300013f50c88c9b7bdfbe1fd4ca5e2719e12db0b0a9a0798e74ce0a383853ca52ae166c719af930acaa48a7829267ff1f5b6954e6af6a6e7fafd23c9196e916ecc150d88093d1a495ec33b3b369471a0fce99178489e0e6bda2dc3ba9f73ac4ceda0981a92ba7895fe42fb85c0e8ff2dc822d8ee4dfb1766243323e158ddccf4d44c7e4fe3c1fb4429e28d14d6645ef477d5af242cd0e352e10dc9309172b82d4debe3331ae1e384c61b5972766a1c53d903b55085bed136096e573a56b8b349f88f3498d47046c7dffe1847a8aefcd1aa6bccded545 +result: pass +shared_secret: 2c9aa133dc5aa592b7c73f23ddcb85faed4c69d249363f9cd7fdfadc7329ff86 + +# Official test vector 29, seed: "265eb2de7099e4bd5614e5de7f0c2a05c78ef3e8e2dd4ae4cb70f3e5e59c8d1d88248303f07de0c5508652da66b47222" +private_key: 55fb671a41c8a2850965768b1ea68a496a772291ca1bb79aaaa07b542678f391bd786579be185f883cac4350621fe531dde9a3729493e1e71530a5261a4cc20b41847d815297ba8415954ac0307543c34dae9b5007254c18414a01ac0fcc55707d906a73ca41a2167d64470b9cd6c082a27fdc62b7711b2c6d4aa9fa00c1348c7666b7a181bb0b84617a9f67bc9825c0e2011b4cc5b1c3f243501a56d27cbbe2f73897332f1bf57edf885f7a462d801089e9d96d14b9a891a909dd8aa7205545fd319598d3ca93e13eb0219a3674554c45238890cd54bac9bf3058bd0a6c7de7c3ccc98ab53c99f1e0bcd0f975d51c0eb11113b1144c8f46be95c11b6a7909aea01e3cd013a274354118b351e95c043073f4a3c0f8fc5d50570540281da1d0cd7401615eb29d4c15b8562690d96531e48003478b805e222043c0611c276940d58e41900c34862f0cf80dd072ce0f8cb6e948cfcef439333ba87dc04031711dd7859855a4493d4462d5b08bfa825c0a01972c333ee1291dde850a33eabbd83ac27dda737a0aca9692b197358d82438fa24c7721773a61a52cd2781640ab111b588fe4f7a8ceec4136115d30e325e5160975dc915cab6369c579f2240881a02276938845ca6c679942757263cd4216cd0c09d01696cbc83b84b430366c2a73207a586b8400f4a9b098bd53a222a51b31b3e1a5a215824f268790d620754c1a387001bc9a3605d94360f9b50ba29723d8088a0871a0b79badc669cf18bb95ebca4e53106160a71eecbd492757f2e98c27a47fba13c7519399cbc2a2121a1ae5376594159ac23b856888a34026904a3734141bbe75904d9d727486e644d7d1c7eeb4b7697ac925dc9fea40421482ade07b35879342b71426c8e21ce9ca3081d62e615661d1168e102779352571d884c1104b760e29bed2bc4f5e01bef7322d1ed2a8c0c882798781310197828792430530443481a253ced84b8b7ac4736452703298519d41bd59cb3c32a2271a592a0f754192a6672607a346fa3997b360f0a75b423397b2520cfcc44c0197c7c7a6443154ac6f3985c1256a0aec9bf72b1d8dac046c7376b6a424b5324ba04881afd25d16387c43aa57ecbb9caa055c6863339f420b09e1cc665982e73997e23179234250b5c047a9e5b656169734576fae1b970c15a9bcabc1742792e2a9bae6c29b391b6a91136e31abcdc859ca9d3a7a807c36db195c1731ad11da6afb304704475ce0c3a73b42be27172c8f2824fff7b933102d1311a310444a73cb2e71a9aa6b482c73317689235b49f44c7af6a02d5ab3547234944bce390756719cbfc6370b18ab828a6971f770182422a9f2eb2c8523605ab228026797fc1721aa942ae8087010a5bd2c2886eff0a29fa99daa8a91b8a1c6395544dcf07586ec99e592b995074fda2a716d8a86fb1005a380878c07243d708b1bb15bc2e639cac28011e461c34c17a47a0e5e07bed0b6761429b21c04689df8a2aa22400253801f41196a02522ab49c1b724107012ee3c362ce351f774c8943832f27732014c8918b2c8e747bb0cb531a3019204a441786ac3dad4532a508147a334fd772ccec01a07c021e2b59238d7b57d24a8f4c90b1b7a7546144c9fff2bd9b931eeea30fb2677d5a3bb24ffb4c15c0a222f151b0fc3b2fb68c96140c22765e36d471bda76bead7baeaea3e86296403a673b0c60389a66003da689f42c73471c0025364f86a66826b9e03864781073614d90eebfa1f266c4255823a37258f51c0839d2106a90171f1191035310abcc8522d814310b488e51bc7ae20c8597cb2ef11645c9b921ca2424f3780d6c87a17a9ae9fd0a5b15c6d9085c6e580a1cee699a624046595401a370912381a5a9731e3f3396070c2e2795690abc0383a71ea4aba69459123aaaceb99691a82c729d028bbd69ec903a60acc9fad24cedc2c391c4007dd324ca46581558cbc0bd4a397a776db07c41eda6c24f436021b4b269b105d33ae94a55594e70232c15cede461c40742bb950447064d21220e41673f98b57ffb9a23fe096dfbb4417e024ad4121a824274c75c7d457794c9034364aa1681c79ad7f3c3e308ce35ab8704ec566eb786283a9ed8eacb14e24ca349a581598e26967b88ba5b3e4a1bcc9c13cc74330d6409e0e1057c125aaaa4ba0dc34b0fc991bea47b02a8cae2f81a10043ec8d655124b3ed56505296c5aa2227ce2ac04a0a31ca05575b2e55c01119d6588cfb529aa54e707155bb4f9a63966d9566bb65a95287591f715e6bc0d7fd1691129999552b1771b35a322c5145c7a40d79d6d9c3eadf941112c4f76d678cb0aab59b9a30bbb340e078bc2899951691f9bf84189a87f2af590f881027a489ea1bb89e3a8b65959ad503a5e051c5f398a654c708f9ea51bf75c6bfc25634145076a93aa6e6640e6b47158ecaeb621c606c065972c9f26a34736067161e6bd49fa2871631aee5b518ddab90f692929d5a7a6e76582e53dcd36acecb6a76dd9455358ba95eb8a70d3786c01960b367e15536b456408e4faccaaa139c8e9737ad6b8b0e380bbac446c73b7b388b319dc2047fb7338072a0f225b506253afa722c812419e9c739c90beed97ba8f684111900e7d1762a5c0903c390786e1445b615a1e054efb7b0b1daaab671a63cae7b55c8b6f13f10d55707650ea8d864c7e5217b572643e6c7480411489c9ab18400483a657185990bab58b6a734596a6123dfe5240b2f908fc8c3591490f89875e0ad3b06f6812ea973e6fb0a69886199b3b55b7d26a55501b43609b3d6a3981cab946049c10b5737daccfb2040e014a5f715b4c1f8b0406b3a3204602182450d10b019b388bfe31b5a5a9794b5863bcb34cf6f659b25cc95f0a42fa9305a0d647342845d5b28ff5c1727975bb48c5ad2c96b97ddc3bd4f0b40e9b6fe1138739f1a9ca3b969cf33ccb700fa9fba93ef565a8aa180cc3711974bda14ab85e3817ef4801c0c3b3f68403bc94cc7412ad044a220750b6ca963e3e052f310bb1474623f707157c8a7d67f95989492278ca5707ea6d106431fa5a3b88c39e3e360bc0288925932d44a2523b0980a221519ceaa65353a7483b7de6028744a2869bbc869a58bed2327b3c6a4aa7447a9a09bbbaf322d5914dc9d5a1ef8aac92b920524c6968289d7da06db2561eeea26fb764168c185ec20ccf2b57a89f2887720809e94c377b313cd5ebb7f71037bbf01bf85b675432b891850316f6b938231793aa3aab2972e979c7aa258735858434b6386cf0c5a9232f60a70624b4cbe9f10fc9e3a0d7605bcaa23ab49a222f66127a1a4b9f2bada03c8dcf330e1dd90131852b71cbcfcee91f528377d200433dc898c2118f7b6275f4e0b9a97028e759ae0c77477cfc26a1398cade7671ab89344140f5c3662c736107205a2cea71c3612c4eb063cac777b9d6b61cc0419fcab4908ac161674c6b4c58c53a5065c637d0a4c964e29729667aa949c39ea0797b6882951314354ac28d52c2096049df866bd028b1ac3b47cd2e648eb322134522ab2993db33491326a625e8739672551562b2829ca57ae6518dd4553146281fa57aa373412f22c2d0cd02b6141ba29f31612447deefbaf8f974aea75140db2b85de409db834c283440e377147b2b8204f09da14028f1960fd7c6b29ec1bdab0098ea22669d7123d36a52dcd634a447209bdccea731b47719745597955d3372cc533cc9b59712e770d7cbb63cf114cc02ac9933ab248617b9b284a8763a8856afea63c442ba7407905c6db13dde25a24062b7db428958e2b72117652535c1c24226266bcc7e87a721181ced66cd9dd1c8d86a1c28d0c335b66eaf7422c1bbb3a7dbc7f2a81c7a477a35717a23b486f307c766f1291be3afe8408026352d28a826a7e57819390f3341bfb8e258640213bb06b8aed87eb78b216971060b590f16d05d83801404ebc63b7304a0880062b4c1e235655b43c2b6062c28d4064a1a861a9844544776e8eaadc0ca66b2cbbb691460382b586e77856b8085a1d6795f82be8185c62ed79b2bb8a3ebf57150145892f99a27ec8d1701265cd16b5f5293955400a44192b0e47f399a0bbb9027f9d3aa1f5407465b8b28e2a87ab881be300fb72047f61a53b1282c13b65ec31045b1e0b779580017e1776e46a5018598799296f49c1447370af1227a7c000e327b40ed2965ebfc7a555803d4d34176e14bd6f9905c5c4e253062c1110dce0c22e74779f07846a6806eaf340bec965dcbcb1a2c40a5e6428d2bfb50ceab3a64cba6aed667edac0cbf03ccd8d8a56d73c70b122628f90e4c760ea21c485a0536f6f1632f900e1cb13208f442501c6cfd05027f5fae41abece025084a5e4598a766114b13b17dd16a4c99f255a964f69c975bc276b67b828d04997c8caaf20600da330ec642633f9789858f7350a7a2354f7e5cefa6f4a4e9a1c411eb9364506e9e1204a8acb3cb77fbd2c4ed +ciphertext: 3a8bca083a1f082d72c5c05b6d3ec147cd1646564b8aa4915a4c5adee11141d3ec19deba2de14e8df899b62d842619a1e89b9bdbce4f556331143aa99fd8b244e439ece01179bb5dcc22d9b7296dbfa90225c218b7e37873a8df58578667ab8795e20e508b268f0075596d1586c8cf5ae079e6844c6bb0ba6e4335638894dbcb1a657cc96e432f04679709c508a05a6e4136cd79a1964385dc8effd835d7ebc71bc3f2e0d6ce09fbd2b9284c9d9126639e86d37139c974b7679b20b06a65a9f45b29c9d4cb88b42b8d0c3800b3589e5e3f6ecc43adea2a56d38ae6d4c5bb4398bfb3b67dc818c37baec8a888e57dfdeeb6675a9be7c99942337e3ef419e5beba7043689fc2e41d422faecef51107a624488ab2ea49eaf7b95aa1a526cea835fe8b6fffd2ce1c8eefc6297dd5ff418f925dae3a5dcbcf2fe937a97f9c07bcafacae582aac5fc3a1cbe041de2c8acb8f3d87ae31c678bdbc6e9d7473a0983d45f5096d45c803c0bea4686879c7b7fce5219748128b8af367b44a7d6aa7a9b7d1c3bbd6d677118e35f5cf69a9440253e494473cb86fbc1944874e8b358d8b1a92cf45fd0ca86cdbfbdcd4991915ab0b4985f96ee49e0771a6683cf301982f9ac9d8131b7d36ff527c5df10d2afce8bcde6a469db425d6c10dd08ffdf12e179a1d58a5e8ebec1176a70e614f06db5d1aaa93dce14257736b0d92689a1c7ed2c5614246c7a37db2013ecfa6dc94e8c43ffb382333d16c79d07100fd92bf0c7fd63ddaede55b4bff6f3130b5132ab6aecd2a8e25201496cfd7049eb3cf4b8fbcb4039666d5f1d7847e8e73bd5399567aee06035e4836a437fdc515a05101e0ac7caf2651a2ba2945f9128f5e979d05272701658d12dcd6d6351b235952237c541f0af1c35abffdb0b67d209375f4b0cd58f777ad29c42475c270514d4964bf2405b4a180b0ab400de1187bd5fd0b778273f3e87b5f43e72f3a916191446380133adfbdbc2a2befc11c787f8527f46f14880a9def0ac05583cd2fe0b44a67a1934698f3e10e63cff7e5b6ef1b2e380de905a29d237b1a5788a46fca785193f45f079b0f2288b860a606d332356fc758f6df5ff6b8f4e538bac5f04cf93b00834c9c96598994387ac9bac71b739a292173b974e1d96875985f3a74bd1fb65a60fe5f8d7c5a087f5e6b39c479ccc072d64b39c5d1b18cc909022edd5ad5407a588522fe019b5be8cb7e56071c5a4a510dde41a35916600714ba8a69487181da0b4af43f36ee3cd5a682cfef1b2872ffdeca351d3e126962737c8d8ea2e86a1ef248d5b95c39a58bf5d1b76d202010ae0a52965bf40e08120b7193de091996e0e1c51bbb6a66e4cb3cf6141b44afd07ebab50102dd90bda6f21674cb3a86069b1a3452c044279dab24c94fddc7e8a4e98718310bae45ed518d401e3e1b3aa76152103ef76329c949a0d51442f9214b1c09f8cc4180d877681f1ec8e7a0c6bc2ee9bd3365708937399bfc146482d0b78b445b74ed602cef450cf90f20e9890d4aa801cf451bbbe19211b3d8446ca5a1787d4e1c693eba82c51f62d85771d246cb1a4179084f6131aaa733016ee58bf9e0c71cdb00a8620dad38edd3be398ce030486cc504449b7ccc7c7ac70bd0eb60fa76d1ff7e4ec85902a70f10b3db794f432c95bc67cee8fb083d538c72c265e5c7eba29a14e79dee53a821de768d864fcce7ba524ceb3e85f66ae20fe7ac3e648b46b1c9cf5a1b1cb60dd9ec67eb9bc4e4ba8f30e08859a41240a0ffa0daa3ab1418f153afd8aed9b17f5a8eaee948b75b882d83719421ae259935a464c77189c808766a809522fff78fd92caed13670374e5933ad1a61b59de2b0ba82c6bb33b165ab6564cdb964ace0f5f8e3b4a42b5a463645581b3993bbb95847b2f92ebd01af96de01cf007cb0341d943f74af023f133fbe5c95eb885e9eaf06c71b468beff1de1c89a703b88d128308db5c9b717a190373d68774bb6351a108a3b2f29c2d168cfc11d62efa411efbd1ac8a93d85abc683b443f21a19b9bc3a1ccd94447e926e969503b239f73e5904635674e60dec54358e61b39780c00ab5341c6deaec0d21f4a785986298b5828951905a44d05affa48dc11d928dfcaf7364b8075e52127b5f89406b4e138537878fb81c8b04486e0f6f86d350d796e94263709390ac0566a9b5f666a7b4e0222ecfa3ef4afb50e7d420987 +result: pass +shared_secret: cedbcc4a7eb422e8a50f22ff47da0bd8b6f2337cb2aea98fcd80288c14da7d92 + +# Official test vector 30, seed: "806bbd111f27c2668318387bd0830f65ec21a51af01985ef48d03d64e1958ff7ee5133a4ebf6dbf36329bcaaf65f40ea" +private_key: 0054c46a1943ae410f1d4b32823272687175a7fc81c1307f51e384fdf6168983525c430f0ba34722230657c2ce28f47fe354791b624ca6462f5634be583c822a55180dd8a7f00b21fc2b58d1a1746699ccd91acdde65280048302af4141a56000675448f00b57db19788678872abcc7f727af4e816f6a1b8ba7ab408ab03a28a28c0906d47b98b702b513d306212e96be12647c9586808025b74e37a593a47e2b00f6d505e38586885baa7fd6257d30c3ba38027f5d149a4d53ab5019386779423851f84c234931c341a216f84e503fb429183e8544018b78bc90c5dda2923b68ed2f47014683b3be50f17cc7ccb36b314b0528f8c7cbca19d936300970772af962ade7c7efc2602a9175fe0b11628702502a9a0143a0c7004ae1dfa2aefc3986c74348485a846981121250d07b78818302c41c20292143a9b5c6e22f61de390286e0c9c036b945fa5495a592ac3b2aaabacb11824614ab15114dccf02dcaef932361ea0621f860b1d399a22153140220497bc723a00791df15b6aacbcbfd5b16ee74daaf059e4b85e30e4bae4c53e2a133466413459e0857fc8c136e072f1b75be9a3b806335f5603a46c734edfe0994408b355442db7967682859d1a5b36f6a135f5100d259715e04c00236b3855fa25551334437198e2b317c1f54207a1b504475368d328b9d561ba33c9ac75231c127ec8c8b6807aa787b15c1bf756c923aee186a680acc4f1d6b3a70116016bcc3fb9a4d95b9f3596ad52895de27abbe0d42751804ec2f1818f5361eb68a9b0f8188e9647ec627d1751a8a5f37e6ed4a42e2540dc97272bb380195b75df18aa8709738f6207ba65affd669e3d23ae7bf1b7569aa9411561857921e048000a44819466ae28c631cdd68416e596abd9365642113b78901b1986f7b43f240300fd487689e63773c1555d1b4ece69304389074bcc99f1c88bc3068df61880d32c43b6326cfc11836d94aac626cdbdc6addef07086eccbf6f44850242a5d15219fa5598d45097171598cf6803e7b1110a04265544fff9612416446bc62cb3fe6718b2152292552bd05be6a30874111538af71b5fe08367f8a646b925e7d52cb4331ddae40e66302db02c87437c1ca03176edec873c883707ea0edc41a45c386a5782beef1c2353a97ee5a198a6e572a467aac63aacc528777d847ac835886a15415286b4e0b0c9089c6472c00b389353f0c6441d84bbd12bba40931bd2bc84270177c5db13dc7a2c913c4718a63d9470cf63aa35c705a37cda0becc0c024d1257590272d6a302f275595d18a679573f2ba283a162114f34ba8c06d21435474697ef301a0d8f50fac4324d32448940792a2c174948cab5f3710a030cd282bc97ae617bc67823bd33efd32af9861ae0b4a7d04b4b207d9cdd7244f23651424602d8ec1ccfd77a7b4317bf2504a06646aa19280a22b82a41157cefb3d3a08431d889e7afcce2c771bc5c604f71310983433cd59bd43a4adc2fc8776109beb59039aa70e8c1b8c7dc5bfed08c4789337efec6692db5cada88f0e3998e8b30e9a8897dd85cfd051c62bd9a9e12b47aa4015dd156616682e1c299357d57a2fbb22c2139cb562971c6360a7b607d7e2001ee26baf0b5957f73f8d94acbf8b3c56a3b72b11054febcf21c95d9ee82b70739846f06eb9966e280a8b007313d3084cf984cc1f7b34d7243627eb70e558b096644feeaba78541a06abbaf2cd331d8749247c2220e722deafcc5a76a0998d7bd62c50623ec183e4544f647943655cb5330381bf608536c81755319854296e2f3b52209ba9df6093536541fb654d0170c5901228a4c8f95914c1a2c87cf76a3cbf3c6a9fac15716001a2b7e0e0a8c00f984b08358e1902238e36046ab8da9ea35560313c476286e1abf559b407bf2080684b11bf44573f642002d364c35183a8b107c3952afa40cd68a22b666af575344be88a269e141ff171a6169a29a92a1b63cc1ddcc642808b6f22b65a8345ada90a992d91a9114480df287359b9b709814e425c1a397ad0714948ec339b96a229e5ac0fa985df1a19ed1440d1fc78c1fa77920abadc31c5256c52314cc970b72b0a6d84fbeb1b1f08657a636be530a5a8129a8f8137c6ffb5e5f549197dc2fe05259841b681a6393a6a7781fd03fcf592ec3b458d3027fad4330bdc85f4699cccd373de5d7266e5530a73a42d10c9b327a57715539eb99030873689f47bf6871a00c6caa06e4b04a832c865b69293303cf838ac186b453d77088895db36163b1074a8e045911fa92db578cad284642bcbb44f844c6663f3f4c98cc8acfa1a96b6df57f5be10fc76477d306245670b2c796672331076f74480c2627a3a44421a01229509752a536e95ba97e85aebb920b4b1b1bc55bcb95fc76ed43b9805236cdb62861fba353f08409c91126661580123509c05208c8604389b2dd3b0f8fc94f432b41632c4ae1ca0bdac54ceabbcb743362725b839dc18add4b7795a025261139539641aa43a9c185621d13c33c579189244c884c047bab4187577c97639ca4abc631eba5e9b141e11b6aa8d562449c3ccd8757503a7ab358a24d2b36f2e1768fb24727801123354b6dc661f640883e0613c8886121b89336202eddc464204b1dc16b9fcd3906bb9a6cf8d6a176a43aa1b13200d67ad0e21f2f73186164a6fab968ea0427c82501c59c49488846489710d7976a5c812f78b5b7df2aaa6437054b0a03180c4a886b7d653149e8497b18b18e98e72f9815be90d252a4583f2de88c0d7bb10cea4d65ac1f59683db4ca4969a9b57ba65e06908f7e9267adc8c87e8b8d8d5651b234bc9ee1c65fe42a51368a041253e982100c25955bc39b70b36c67484f8df88c2066cd2a5339c471b60a1b81acc5922e274cea4a071eb71e788241ad1b7c41db1e972212e27c770e6720a7e67de941a1ca952bdbbc591ef78019c67dd184259bc873f045607d1440bee46f199a7d2274b4e40062c064368bf5c6d50046a198c89e1372950b7710b3b6376caa9bc32882a6b0aa9b7fae86cccad0574cd8b417047d30d41bfba0119b909142363d307a006265a3961c9c604a7b65384a5deb1c61f25f66fb3b7640b5c3e22b8ed488f08201a10c3b5a42b043965d4fba6f31b90c5a8a1d8b29a01d500be93225ab6acf77960afd2824f2283ce86288cb1a9b98c11b03dbbb0e0854731b22464331f6dc70e7e1771471236b5b26ce131649e77d46e7946b85593b2989bab4ce5d09ab8d745a64d53401bc0ca4855e54b20ca4811ae5d9192de398d9d65dd3a327499cc0ccaa9f9b2b547c5b53722b50b21c7bd2c3c7f67a15be8371e9d4583faabf2467a4d5365cf7d92b8de8a55de200b61185b89c83bdf817adcb67fc775a5bb19f1aa453b491cf1bfa8d51d0cc499331de7730877a2db14778052cba5d759e21a8cea550724f52bf25c2a31d7b117a4377f7a461ff92882e11a4a8c137ee5a4b7aa67f712838737a96faea898141a1b5165761401adbb650bbea1698267d324a3cb1d9933be8bc95d55aadc4a814f201ebf724fa024763563e2656b028053cbd16b32c20457349702702c4b453a277b318551c8b732378e3d7bc31a10b5ed975ab032fbff647c6340c2d5c91f68c1addb447fff01dfd4c0c9d925111948f001880b36588df16cd1b9bbe85973ce513662267214660340262273fb45f97f65da4e615dca4a6aa06c5e9ba0ff727775c84608611827c98c8b7717daa60004d2212dc28b4392a6e0333a77cb9400978b60a00a766f6264486c60af452fe92452156961f2467d013072f1c4cfbe08ea7885a74d0649517178412a1ac63261981adb7708dedc89b64e67dc2a8b25d98cb1ad74289372e48fabe360495b4a7472f3c8b7f877280ebcc6019648ef960ca23a1c49b684f947460e96f0e941408fa026c127900d84665768db52a8ec05696725b3dd82498226030b7189c9ae1c612e9a2c65c86c29426caf686d5b00ea0557466a1b04f8485a457bb83dc68c4b1cb01e7831e476453f084434151fc0c9ea3b7081ee00b4665048bcb8fab778eadf90c25f54d8f452381e252b2382d04028378e7cc7b3973cfb776249857cc611af8f91db8d5b9f5d90212b27d5fc9a794d53e3e002089a05a421a540b36aac5c803c8f5cd71012f176ca57a7a439db90bdc71ac65f0470d54188927bf3d2640e5a3a45d9021f876562fa7c6c2b37be9261393861c5f0336a47ac373e6874ec53fc9f90d856807675858ba1291c7134c4b8432f9782cf6855ae9d49226055d9c4b2f23c0238f20b516d6600fa72d8a5c2d06e1613dbb7fcdf9817cc299ef2614b6085517cca4006876de51659c317c7c9d15b2dfa3cfd29db64b6dee0f6e53b6bcee0ac31c086db16d2a63040993f86bda57d8006a152c436e383ae407c7d9bd7a715a2f9efa507422f072d9b5a99f9c7a0a011e4dc10f6b600d611f40bba75071e7bee61d23fd5eda +ciphertext: cef4be98dc83da0b9570bccb0cd85d237536d29da6544e77e0ea894fb5a777f7966ce27f9baa0c2d13b2559906edd041641ef91758e5e33c09c0aa3657892b63b7450243e4c07d4ed5bead3239f6c3ed3c59fe3d302b1fa9360851a7f6057f3275899d48db6b713a9b221fea8f1830b45c2fdf9f08cc8a5bb390c9b31497bd35e6c659739eece6306ecd8d77610b2ebd9258f68de04671fcfb85199eb7c5593369fff6828c0412b666e9b969adbbb494702001ac8de879533cc2727260b7664edda4f06fecd7f775b9d4dfded03c9c3c309f16f91011d6240bf0f81eda6850f88e96ca462bc0c836e08408159f911f41b47a83cd8271bcabaf5111eaf3cbd36b5f7c6e61293fc1cb5a021f1438488f220b0bfd439c0b53d814a085ab07b8a1a751a9880dae73b97c5b45091ff63d1504298c7a0ca59f394f1d7a2064163cf8b4d59b432fee9c73492daadc5a3a9a6b132686b75db0805eb7745adbaf38d12637693a85cdc77fab26a48f39837d84a6be8734d28ebb50ad913f5ccd177ba3b632a0122345c1601c4582a0718254be614c8b619660a92ed1caf7f9b79fa0f0b2f1eea8c06962fa85d2d3699ba1e2cbeecaae9921754deac38225c9bfb23ddd4dba78a327638e1ca00697a4b93786f01b979c169a3509104fcb58ca1d7941f803263c2ae446b75081ac4df6c154b811ac394f87cecb719b6180772f9253e32f82dbe7ba2e5c4f1c8a8c5ac37075c3a129bf96cde8dc9834153ee49d17414826f4a4904b19f97f9f592ea2bdbebe51d72e112d600b795b788b1f742188c38a72d3e0d7e8f1a80bac86c56a8a6101bc3653fc22959580e543b0cd9eca89e077d9b1331e3d5aa096bdc2921fc5bba044e5f96c60d4088b54e5904ef842d8d160980b3bd11309ede2bce224cda218bb65a64bf5ec0f1fc6d4a5ebf01a01483ec968dddb1c1f56ac906853c69f90f9a5ed66bd13c13c0d5c8e74e39f6a3b7808a67d01b9edba03b391c8912ced938ebe7bc9c97f82a3efed9b5dd12dd83f92bb7a20e5f3d15b0341ac07fa3234b33dabfeb62bd399fc5921aee054dac42883990d7a6fb7e470ca11933ad82491983c119b86c35868276bf804ff5b39b1af66467a3f5ee835078ba96f2666acc015d9facb8153b3fea916985fa36b050bd3eb5f2b903768c390bbb917a85d14216c98f9a050d057dc4dccaf665b94a1d3a899474fff52cce5376b163c19c07cfd8046787f2714a14343b18b5bdb49c06e76d945418525cb46520a29d7c62421b81cb57188b4ce22e2402380e494a03744d2c6a4398e358efcf0ff62ac6d9479909be5e41f2a6e649835858168221f6ed1a857e3deb195a6e68917d8eb3e945f294ac6555facc46c558ef6260820575c3de0d896f53b9e864f76eea4cf2ad6243d9e4369ef7f22aecb1b349c342e428548f29e58e0096da1579c0f2d200fbfd205c4daa7d0420bd3a4b0dc7d5e6c9cae7ba37a7065705a213d4bb070e291158fa6a3b67bab4574a712e1aa9806a315b1b7c559385181ac322855d30c3c1aeac5b34be0f6b6a0a5d9ba07c02da1ed4eb279ca6ecbfe015869ce6faa62d32d32ffb190d9b3cf96c7ede8423bf33f3b124b2f9a2fc8990030fd1c5a3334d3feeb134c2b8b65b5f515f1d668be68753d5b980e4d37b20d14533c98974529bddd2198a1856f0c7555c1624942147946ea61dd511537a78b401970e493c9927a14f2f5dc26b397f3e0b28340693d95378c67af4fd4f04cc1fde17f01ac79a15c3da1bcd842e5f610cdc807970357c56e3d6eb66556054dcd8844323dcefa4281ede5e0657977ad4f277e3b72a326f7d9c448137e3b7c6bfb841116584f85b6b8970cc911829ab38719a0418490690344ae98e62d114965d8a9d154bc0c6b49ca0826b4909dd9c3c56348e34581b93570c7533e0dde9c0c5c5c28f4497c2d399151438b241af777b0a04e9317c48971e8e2a22c83e25b9ff9a170010b6487170ffa8d03e7cd1115caccce2fd41ccf6f44c1b25fb4ee4e105aa4e9c3418e6d998f8f738df1ae86372b0a383cd63c24971df937945646d4207a7b6042df82653450095d62154e115d13bf7992aec6e52cc20a9f430a0356436531ff985761467b8dbca0dbd15ed5760ef24c37d74c90a998ee3ae7c748d703411519b7004f38fcc48ad35cbe2f8218249c845d3a04a3b4f345421003200718c59a5c2a +result: pass +shared_secret: cd0a41e85f2afaabcd7f00c2a9be9bacc6d6f79e0ae6b7ef64de31dcdfa02b91 + +# Official test vector 31, seed: "ad540a9ce816d6fb1661e5483c44f6fdd00c9e7bd1a8ceda4b4c4d3697d4f78ed0a56954996ccb7da96ecb8f5cb15809" +private_key: c5aa9d405bcc9af610795279ef2403c6f92389332592d0adf1b3a5172c795b483e1f600f2c79a7a683574076ae8941b68fd17793fcaa9cb60d39373da09b827662835ea227ab05845853979910154dca8ba44c1511172123ea658b519a53695e1315accd3c5855e03c1e40a50e10666ba253ff23b1377830ca1a485f656b24662dd3eaad239553f3a50b2934225b2647658aa1a21828a413944a53135ff9516850a2b0a66b8d502a17322ca87b3c09866059942bd8eb4f44d646e5a80a38687dff595e92b2250c2331dfd2495964bc03a2ca5066cea671a5cb0ba079788366376f8078804e98c9493a9556d044e7d218ddb83597f9bb33369266711f0ed4514582b25f04aaf1d0247c5624eb5555d0b08c14d307b7084e41e1185465c193ab04d4295790e4451dc25491796d4b3c47b1051d021a91440b869a75848e9894c8d393c534c4b2ac1318a5cb482b53f9ba76203331e87569803b0fc2e96072f777f61b008941642fdc76e9744faf9c6f06c381f5d54492eb6ccde84f09101501c60ddda80788c4619cd48defd9a9ca6576dc451101d37d422350b4357c49a90c291aa393263cfcf887c1363769c40c76530877dc9cef88bc13f740a8612ab43599933b7a3a7495a03800b9dc66be070d8096976c85962f3c75bad40c71457e5ee929386c7f65869f3e3c067512b2256112ffe557881b873bd313a021851c581259c2cc1f3617b38cacbf4a5bf2346623f2b316e4c82cfc9c4ae2c08742709af023b91ccdfa0b829fb047661c8dfab33bc9ba334328a8f22419f2f8768039c098806937c05cedf34a8d65930b07ad66cca3ceba2de45694cb534f7ea881c2a2c8df9c9f52163feaf0cf199cb81f1c05d1ec3774c203961c2d14c307bcf4716f69b837b7c894843766700cffa87a5b6b655fa304d8b2a8aa32637af967814b7915e5283f1263ed03469768783fb757f4b8385f7995548c75b98c24fed4b2a3b28729924ccd618a21f9385c5b577642150534c31a15a854179e1a0398df0c2c69a76816979f0834000378bb9f4ac43bd098ad6944b2cb028924b201b6cacdd87f25a67e676c738931acb4c42594a4ae4354cb87008cb2f486dd50a16e0228db6b547e48780e523b8841cfe8b636670ca397990550c540e2572349947d15cc46e186cc3197045d77b8dc85943c0abdcdf1629f4a74092a65f579b33f5233ed47916f1475aa284675972c7611c1f35c41cbe6a8f1f18f3bbca2f7d9380e2c9ac9126ac3287a09e80a041531d83b39591a9618232f990862d125a29b85a1de31bc4380c0c4f56e8a93a7a332a86d114faa06189f91b76ce79cacc88bbb2360599c0e9090226c82a57c5c1403745703f6b55cb9bfee17c4dd382c17da5585b823f9a037bad4101f07a301e96953e02a32a31326b04e02a52928293af67a6fb115444f4a4b58ea17ae716d61806094a301bed3015443abb0389afd98196611cb1e0c21c951517717835e7868c4bb8c958c630b0c78032367b5eb30100a15ad9949e8051c9bab638e8c0e271cab8a3a43998532469724979879dd46c40426cb49a29f987c9beeb92c1a393d6132921b019791d776728617597b0f2738916c99a9d889619bdbaff69050e6b0c906f3048b8811a8da04aab71a1ea85e2b07ab021c089dfa848800aba0d8838dd8af43d82abb6c664e363ba30b0e383214801cc69191bbd7913cceca3a45b52b9688957843bbf86112c70a64b0e2a1c3c89ac5d881848616ca3838c3647ae686568883550e93190eba3b1a08080b46373fd05f8ec81a535650c5281843279073c0802cd33a7caca35547c0740256f8b7ccb85c790aec85525759c0b22b15d268c9755bf020bf6c913074c5a4118bb45b025372dbaed0f96329c245052c8e831c5966105ed6d098a4e4527768cc3cdb47eb343788c9b5ad2b4ef15b24d8193b5e9b6611e3bcfce348869b07bba361035b54484257d1d65b3d11226f31c299607674c783b81aaefa6161656115be771991615a7e5a7b4becc21dfcb48738cbacd764d1b8b8b9080d6811caf9927a4bc68dab415628422b05530ba495101a9b336a896457837d6694bd568290e2259dcbc302ed2baa96292536b9a0154771b0c791b7ec8c4ea2489062160f8691cad483b020afbb076e0ee7c54188b32bf6a6fce45eb9d6a03f11858433994e304b2d379c43d4670be6c9d65a61e50c34ed26c67e716933cc5d9ea22d14f86e5cc54967ccc82e3506efb8cdf40c31f313135b597b3aa72fe83b01ec88a97e32464733107294270f82216e11688df6cefc2a9332243eb75059fcecad20a681aaa17402fb36c6e091728ab92efa891d141c251895f4c79fe2db4b2253114be24d22a38b9d14532ff80e384778c8b99a4303506d08303bab91d6e05c68a0c0affb5dea7344ef5ab21a559cdfbc3be395834b4b8d8d9c4af6a9ca37a34fbf05669f99af8bdb3237c98f98802ad76a26eb353c6612674e8b4f93a190f293c80da025da00aec20265cba37b0df43d78982e6ff49a9f464e7ff57680e7455f816f815c733bec25e4227ca3257336005d0559b647585379542eeaa8282d8a90b7a885b0360c4c9428951820d189b873e246e4d793fa94c0211630f54510f7f06d116acfa35c856f87913bf61cbdeb0554589dae65a2e25341e4b93916aa4b738714526653e798c11f24563b2200319c60343869579b74f2ba9ddb03c6f3479a0ef3a5e5f80183d69034968e25892c28c272dc501466621bc091c0fcfa09a2b56c9f8cca6cda208a523ea6a40a4907c1f390780d4a04624466206594ccdb1b19d2b9cc407bd172428316692e09229fc963710165970471e1b554f322c1548a118f84169dd9731bc8c49d1b0130287024c391ca027065591fd9755ffc2a68d36b7dcdac3a54e0ce67e432e35695a3987b1d4a1e5ea32934c1cbefac253da2ba9714ab6a4a46a07950b6477c303067e0e673fc6cc800a26fcfb59a01e397f944335eec26002889b08a26338947dcca758eac669929bb4c608f9861812e06aa61f5b8b56299efe95109d57c42c066ead511bd868c2b107522043da8356f617c26f7082b078234b435c478d48a53d5a369f7907ce2be8370c0ba7347707b7ffdb25e6bab2fa85b5922e0bba7269fb7a9799a158f9806bc3589268d8514134aab1dc83d415a235ef49586133de1ba59b8fa1ef5493cf9dacbeee04f4b9a94b3daae423575682311bc70c49e65090a87137cb327419a2f2d5481d6b10044c6a551eb711bfa828a3cbf22e026d2345dca2415b6d9b03e9479faf589ea02a12d1c03939935e8b225d7c18534a2cef060456bb58145337e81f7346e057bbb98a8c0a312f784351dcb11a1fca7984a2443b409ba903c3024b8da9a8b6aabca90b74a34b532bf01c7c1c1c7ce05bf08c5c65164a01f64c86797317dc03b2d69c263390f9e411df4f4508d7b03c7b473a7e195e8338cae5b89b85465779029c0ac711653b1c7a24bb3b9bff0c612887c12a39c2f5bb2920313cf3522396eb79065bb1e854a8956f7ac2143abb4136b0682bd01275506a765175c4b7648a0dbb875e2864d52aab697533512164be2659c57151c4af898d689a8619726406110faa69f61320e75d3a05cc27febf609e52026c10c01c30118ee3693a7293f4f7cc4d9f84ec37c5f38890a6a58afce1855d4d0ce1f0a577790423115c59228b96bd62d68d90f4bfac9f17a7597a492e5711b65d8626e568f0150a458201c6205a81fe74a591b547be842765723b57503c3b352478b304c39b22b147bf6b5bc489c2dccd44c9f206b7cf58fb3faa3c8891524faaa88479b0c4051deb63eab53822f84935566ab7978c1b9e5cc043767c109bb4663960a534a750cae177aa33315584138138d52648aaa5cefb09f5cd58d008d4c69a1c85a242dd63a997385b529a288758c427ba15b05642c230c8a0180938606c6e1465166f128a35ca3855657ac1b3677a0a15d094ec68caaf90cc1958ba0dbc22169f3853f3b7d56f4bde7bb2c1c71c8c4c95299d95873f89a17a4583bb9198e0279a45691a3107ba1294726a385ed95163f0bc3c609c01ee201c5900eb763518f212f14723314715e7bc84b75a611c481cdf858350de0495d1c020228b004624900c300cd018166fb4dd217cda3c792da49a87a3bcac52542f3b3243f689ce69c1946a134a97061c83134ac52c92d97a458b7b38dfb7f42476b6c5c272c71065e5159121484d4a541311c97fca3488d13b1de64610483cb3a9551cf4a3317d0c76766c777e526595539ad17bb6c184aff73b6c4eaccd5a14ed1b1b836975deeeb8909458146938505dba5dad77c1a3acdab128b36dc1e94a121c545e3515ed56687f8911eb5e1724016ac096bf081a60fd2726d6b275f550c50021d42608c49c93385828573f89f5a4d0a8a41c4f666854e9b13673071ceb2fd61def9a850c211e7c50071b1ddad +ciphertext: 3a385d4faa2e13cc995be625819127959a2cdbf5030edfa42c129bf7efa22ecf8b2c50d0b2e6e7c3bbec34b609ddea036ede43e34ffc35a98661a78c3f29d07aaed7df7d8a04e53f2484d1c63b14644e134704dfd643e9f87a1a60e0a95591a6897f38924ae27812d9ea3baa5926a657dff1a5f2202e781270f8d37fa747c9b2f71767f265a86b3e9816d0545cff49ea6b0aa9297921637dd928ae528c90124b0d5786d6b0e77b1bb6f49fd8e0799b98bcdf6d39efed155c8b29ecc32547327ef733d644ae279b4ceda0ed406fa5a55f9cae0f5c97dc0bb12b112a4d2b4b24cf7d78ee1a2aee6aaf10c4c311278bf521b3431d9177be5c6bb414074870c56adb807331b640dcbf15d1f0e28beb419da866eee0581f25aa8567fc28dc7d8477cdff4fe27561519df585073a47e544708d80735e086c6f9cfce4531a5123d1b8071f34168349e4d35f7cbd235b92e9ee34bcf0e1f056dae77af055975f97f9a5a8880cdca6b1eb79407187f6954ad5c06fd5cad5ee2a5e4de17ae0d9a58a614a3dae0ba03bcf8990e47b548d94023a436d3066c34527af538aa01f62e8581c8f824b9c25e495f565fbaa7c11823f2f6b25b672a742626ec8f044814fec20afd555156ff2c16f1205cc4c5f0076db3f8f6a0b4c814371e96311c43c2e6fc3aa811d5bae3898d7497199c8ec0060546cd6facfb27138da4acad7129917d4affb94456c6e4842725b78b410b6b56a53b27f54792dcbbb9f32d7607e071f09e105fcdb8861bf5e452810f2917c73fddfcc8776cee79fd7a8711af303bd892d00d9b757a252c3c53dac6fc7223f6d480a277c38d6d836542761912a1181e9043ce70025ec14c79d01ca72f93d12a19a50a8021033ede24a361e3e152f97e9313fc3812a0787d61705365dfb3c115eff71154d1145bfbbf1185558aecba14e669b9a354d2fc9302904b13a69d1068465b3f969338bb7e5f9f819959eb1e779f04dca99f7a92cebbc668c5e8cc416d077ff12f4524e959cad611a8c175e4e9757a9ef9c42886c6851bd684e6bdf4e94d82e7b3c909b108174b8d0b1042a41028ca149caa29763ec56f2964fb3cf6bc4d8e3563a4ad320aab53c80aa41307e9942b45ec8dc17758750bc60d413806f65cf5a5ae12ba8f839eb8d4768c1fd86e64f1f11c5160b0cdc3ebebd8a4dfd19b8bf4f0325c2d23970fd25f1b6829d648a86bd035649a2b2084f26cc08506a7fe12f57628524d01d84be8b73f7bf6c8d030a617bad843866a430060b325b0cc5092fd6e98e5df5bffabda29bebd91c4bf1535275652cd7a7394ddfd0fe3ad8053a3db3dc4e820a77dcd81e71a7081d21563894234cb2f8759e1b239350bb9b2eddfafa555571b642780c8671587b86b64185ca9c3107e3beec412ed6029ab679903e356d449e4e8832b651318b7e6367462c0297a31159e9d1c0d2278280bb92a65ff6c946f6991dc73cf60fea144c6fa1026708ad9477831a2766db8bc80b1607bbd4193d7901e1a824785bc435fd8915d2d55c4397c2e0b6a9bab6f9665b27253e492b44fb96f604c16b3ef21da9d9c33c80e1b8e2fc11c53c37d7f465c44de890fb65a7194b8d1f348f3fa35a0df294ec9fe1639ef96c33633ebebb44c5e92b27d199d9a0a339ca893e3073b48e92813db2c7e572e0f5f52c1b5971d4ceae3a81cd420e2750e58b16f7b0914c2ee61cb239e1af94820a9a96c794170fd1397e04093792241d81f3df0827b8369277a1a139d723c5529bebcfd40a9d168dbbe9613fe08b28a8e98c317a6bb1392aa39e0203e1f7de6ef6181f96ec520b518375a362344b9e08a43c374cd2638e52a0c1dda322dc46b3bc9c1120d18793f96f0e911102312f6e2bf0b56cc3c6ab6aaa8c3bf7f61be3b1f9e410e540de3b0084f35ef7f8ce7426ed3713687bfe53172e7e7e80a409774fa1578bb6cdfe9499acdf29e0af32117bbaa40f7134d25c23bfa322b0279e1ec6632730d9768f27da21ff481f777a633a042c223505c263bbe5787388ae3cbd95ce29ea5ca08181383fcf77aa8ff293039670cca4a64afb79c786cd122dbdf960cd3b81b862a7473d72342b8f8d8c46d6b604245d48805640dcb423a417e619ec3ee38f4bc557a4c700f4e5df3a685ede647c90427724265e2473fde973b3cd3c0a2f79659ab360f3a051050ded822bd8ed4edc218a893cdbe10572745a93a6 +result: pass +shared_secret: 1537e848472d0efdb11567f6ae943c8d16d37f91285fa7f77bf589ecc5e33d10 + +# Official test vector 32, seed: "288a5f2684d862a86d2790afddddbac6fda934ee7d2e6da1508bb550838609e8107312b28e00a6c01706374ccd3aefa7" +private_key: 23f2a309696a69c78a5272b1318a02669321e5461de8166ebcc0a85df06f30782c29dbb0fe921b9c7c54eba9771d7b52887b55850234de9b296c925420567fd327842af26d0ef1cc1ec393507c540f27184f297340651ec5a0151cf385ba7a8b82156cfab21419633338708212364997ba39755864b368c333397bef42609f4b09c68a096f086ab6530a3816c35d6170b4b28479e39f3a5c621f4198f8b8ba5cab50194bc8490a227c473854f9ab021851eb1a405cb236f8937723d74f0963a67dd465fb172489c594cf91517c3c0dc20c6bec78ca1e52373a57805c30a3b319ac204995846c0bf1286cddb73f777522dde85b43e078c74634408c5e14777f74f9696e1c0703d9a221f04592f4218988ad5cd0b434541be033cd3a28b039c22c77ab9fc1e477e6bc223703610c4076ad3b583c9402ccd26841a55074dc27ba3981a9552578644895e8279c02c39cc8c22da0b11f16ccfb3750cdf76c333ac9988a23f1bb33030718279582fdb578b37512ea084348bb52fbd63c365951d9428468310821210105e0600b5723416b62a72c92c7a26642e7c9c562be22bc9b5b82a16a00069b104b6e359328d0c78af04bb337415f5a14c5730681e3c323098f117a1ff85cba1780cb8e51690d8a8565f9739d15391fd7b6aa2091a828a4bbaa45d80b568fc59c77375848cb44d6f5a76f260fbdf6223ff80b3f1229992a7e8421acfb918d28324c94350dec894b50e73e084026be12733146bc4ff3b76061cdc27470052175179c2dd2ba84db17501d41a16cc183c8d0c2318480efd5632e630b6c2612f0c88a9240017ba431c5a8629107af4cf08614f24e44808949e75c283ab36092266ae41b66d67aabc836c7364525ec4db7ab972d46709ff08762618d7050a3c165b21c5611de2aca9de5a6d826c6441b4894f59bdb93690757461579024feb4531abbe20d0410ef201e7f35ac3d304378971df8855f992cafac0ca7d7c277907d071cccaa84b3cb2203a72bb3d7f0c3e08321c7bb944a4a19fe794544c28181d92cdbe62ba9c270df5d646e1b05adccaa2835aa8b40a8b1741b10cda223783a788f36a3a8c00eed901c74b95b009a04fa169d8e0512e28266d3348774c7248d6c7122362661c5a1146103d401621434198963f26d3459c6572b029a3828bccc1ea35be549bae2c1aa094374061492636989bc8528d2a7ed649c1062a10c372c7635a4d0155a12b82a3656a491e1041fe25522ce39ddbb144a0ba37dac28608794c87743b8884b2fb2cb2dc1a37fdf34718813ab58b8f73c0742d2595802381748736458a846dda95df2740842411661853de6a8c04d1cc31975a8b8b3f676c4636a606dbc0906d101ca6e290d364b4a83b1ae5f461c56100d5d48a93c5448c12c67da30341664f2f2a35b58c25a3397462308170ab80a95780ea1a4e650c6cbd90755c0905026a42d4001612289e7a4a0170b9907d689141138de4460d143744b5e4975f027d48186161458c5d05cbccba6ee3a0a88135b94d0aa28db8b61131783d63224fcb4962d83ddc39c08fd0773642340d93125e83bb31838e786a2ce3a1a68a4084c214b9f304ad8e4a13e80bc168f8115b378fe5cc0a12468b3c24ccd2dcbaaab7bb4848c731e68810b92342b77e6e207d5abc7b93118d0384941460249a3c495b617c35ab97c912589c76313b3cbe21a3ae88d9b0e93a2a24d8449b6816c1045760e7ab5b37649a97938fd4317f3984ccd33a0c6388dec97f4c0b685f536a30e5c06af072f7ba2c129c05df5c40c7aa3e633aa44566689008506ba90107817205916df72b97eaf79ab0d5c97a483f4c9825f485679ceb0d15c981f1605a86c637fad32bdfa800cee7846f6cc52df8475b170316815cef36137c2378e9e27f8121b5b8123a1fe62589db2108810cd360b108018f5d67bfe36ac51ba1c56485cd8a88918cf70141b39ad513846413342be9a31f62691d221df48c125b1829526290c71ca471868c6df5a5b1a5cb14052a46f34e5d5b1e271251427bc4f7f3249c220341261d102b31979821de60610f9323da66061311ac2f2413ef97730b0a38e436958daa13a4f015cf96ca59d93bb56c58e66ab56ad7ca707a44cc1901e5866c3a223831faa00ebbad437a0a9dfa83bd32218bf66027f82d26c68b1ba4659966cc95d79851f03e029a736c3b4809f9c366093967c53769b4796ee76b4f1277f1407b8c478fc1400de6415c2a231727303c86110af4b743aa85b73e38b41b819021b07d1ed5c6c171077e9c9b6a678d67b94958c66921e9cf0f573585bc3b47323f32979b91c411c9133b3b8b03199179c6f457f106be4201bcf2d142a4814c5e166c17680fdb2a1296890a89c802120585951a9051fccc4c42001346c9add97f93191c720466f95c5590b0cb8046a470cb50a3716a063135ea4a0219217b4d373efac8625ef44e5c0761bc0404f4ab87bd8abb068c07da5c832de7530be88532fbb5d8eb5c6023a5f0db1aee3a50d2864601a579e6dab597d6cd29208c48f075d42c6b27aa3c3cd837e224bdef354e20168c03172a16973224d50cc0ac7f60fc9b0afc7f399c29a9509f9bc3abe7298303db253dc04a69bc873e874a43dc28fba6339e4152e4399a3ef1055bd81099b33a5087b816ccc668a75bed05650d37966d058d6ebb2b3a819218036c2ba064ebac797c671ead151c121ab88f6c9395204e714310a8293c64bc9789864f93569ca043b856c8412ad985d8206b6e7485f1956d7e616104f720e76459bbb0c874e45479e67233137875c82dc6509cc124bc184a3dbec02cbb08b989103fb59c378670be58f0a96a694d71062e6af424b6745fd9130beac38d297a5f1ac783ef064084b84aa06ac9c2680e8db2487cf43bbe6b8574311a4bd99d733a1b6a751f68401938f4091d25837120664033770d476096e561a1b03e8cc878480a015225cdc1d0719be196b4aa94074c290590988e9b4a4ebbb4b3e5477483cfa6860219237924641cf9a2a7a1219a8a87bde9d08166f0c3081297eda4737d082ac5617cc7c36d428b9dbb7237c122676ce932fd01aac625b5db503a8042c0112714eb43370b5b5bb0d53378a5b6f738c874dc7a7f1c15987c28112857a4bb4310788375d9aa0e60c59958c7f0db809f688f7640805c334e9b1aaf78761d5107c12618b81ba12a1258c4b0123eeb570ccd9924084b7ae3473eccb429ae0c7fc059926f25542911a8738b0186c404f2f107716b5d2e228f91306e3bda12a9b281a598c52228330ef93962d085adeb6beb1076969844e1980295964f9f115840753c15674c86119909d111719182f880ad9ee9792bdc128a8c4df1da9b3cd43301037b192abdc694099bab87441113c77a7f7210764cfb463a96c4007108d4537f29d4859d305987930fd4d94c796cbd55452d10e9b8723a6165ccca8dd39741e94418812291facdcdb453529960d850a40745a022643cd1cb70ec330a6e190ed04963ee28cc774198914b5bfd7c43c6614007d49dda88c1d8b42e05a388f4db09ff1a394b01547155c79ff4933a28568e172133515eafab53b86a078a1a62b114b9977465342a61ada1a20c236d3778250eba35f8d36ac0d58c91198d4974610181bea1cca0724061976a7aaf161afa1b111f0b0e5b835ace9ac1fda361048a9b0008096b41bf7c619af3299c5abb04499c272211931f7b6528c17d5f52405097afe5e0c6ed2aa2cca7915fcc2543b4c8268256cf49936a858f7401117b80b18b081e08b45a0e828bf830c13fdc55fb468d99e8107b93616da437b90a5b52896330c53cf3e28bd3799f65f28bd5f0406638c18c8c9838c555a9b015dc99a61ac330fb11654831571fe667f208689d1c045517af836abaae37184ec603d01a918733362942632644b9b3826ed0967e6db05a6e3ca77cc1604174a2aab6ce72fb1eaa31480e235be79c1c25832ccef512e6c65261f2c485cbccf4062a81912abdbbb3c98c5a6912388a236161e7b8283965536908c0145bdc170bec33c5b2e437628b452aaba7f3ebc8fa730147469d63eb8294fc3cc9096781e58d0ba64d6dd6837812b530e9077a5c5648aa6cc024069150c5acf26d3cfa2d658ab18b86b1eeac4ae2422d41704b9982c8db14bc53e0721123a209d67999c9035ea07f3485ac50e35f85379396c620ddf159c3a4cd57fab15b53c8f2e6aee06c6f2ca02f0d99543368ab70b9bc3f655830d7cb47962d7c3789ddc893ab0a1ba3e1170590249a594445135aaf71a902d9aedd178d88d980345190d72b710ba08077fc868e86713be6bb45652a26c73ca91089040322801b9c68de70662248670f323f4233c1a3c0937dc86f0b6476d12f426868be1ba08c74eb9f3d9296c268dcd23c66bf0250b222854a5c31830b7431ccd3ed53fd36b817736cbc5f7b1dd6eef5fe6332fb1a598f3871e5470d440fd2ea631da28a +ciphertext: 99ce600c4a66fb31f655570dca9daa4ad7c548a6617019fe7929426b3b0b0782c46bb60a9a618a41dc2adb77334e9e20b6fff08f9658767c818b415399c26a69d110f8a36406e1b9e4f18e79dbe98ef3c5be1c71bb9583e94a4bae18e786d892bec54bfecaf15d4ec112d034658d27ffe26cd690e5665ec07504934029eee4314f49ccd9c73747c089ca0744b2c43298a17ed480859ea7f3ce9ba577c3da53c84deb0d34d78b5581e76321b895697704dce1e36f30b3686b32cdb20c8f865b7788cb93459913bb3a623904e51a106785dbad7471e269c333ae69990e8bfce1a8f38ae3b2d5dd68875e5abbaddb4152178b84f62df313d6bf7e4c8dee49c84eb6571585b9b2b1aff78e5d5c2192ffb0600f3317d9a14217b45edfbd6af064e9468fd2838fd83a0ee27e4fe33df64462e5fde462c3ba7710b1439a96f4c93d14a97dca88a45151c4ad8bb7e400990f28a4b98bf6a4826058f87af51bd1901ab37e4a7067e01b7ba1bb65ad6efce8c79e35a7dbc707f64c7eed28a91976a7026a1037e353c2e17753571007ab7b49caf80b1f35958b0308aad971b0b36ff5b95a290c1a0e2ce9d299e8cb1be448de63dcfa467f5067736bb649988c020b1e2118633260e02d9aa0a6640fa15a85423c7319adfc43ed03ed4c0f7fb4a67ed3ed9ae0024acfb75c7f421af32f9559fe95e261d5cc1df7da8bded18b1f109325105a59a3ee04d1bc428abba2a3411f6220e51bec19056d0eb2da00f78ace86ce7e22a525ff0d8f0aab674174ad1a1975f5ed0edf8767733dae428d9018155de34665090952cdf1cf93297dd65aa50ea2e7804536f4037a819ef059423ec0d235cbf71b0c870c6729ac1241431c7a9a9300a9dc4386f6d9864e3324dbc4b0f7357b98b65d489fc05c32302d8b8f33cab4dd01e1426ee197c2fe4a2b79619fa9113d92d15ee3df01c31fc33a0caeb2d7448282bd56ea9675b56b34ed39072dfd1481ae524459b6bbf81d3acd8bec34a8fb3acf9100c5642b709dc8e6b8c90c5a85e975acb13e9ea501301bea7e9c2b87ae2c4217e4482c3ef609fb833b0258505aa7f0c65963b60f1a4500eaeeb1ba0f6b46a0c4b58d28b16d3b86073bb977f72a1aece3b05b4662448a41362517da77694802bcfb1c2b413321fc1fc992b7b09df003345ffc0a34f76963a3cadc10610ce18f7a89835216ba09dac2f0a2731f9846bab78a0edaa1ad9bd6f63d4a43143b31a846ce138ff97590f60ab7347fb272be1d9f35939221dfa49d9ea311536def8020bea5759af8a6fbd34947ff6c812076ecd9fb45ae16b69efaf9ace46c9ab1a162490f8552ac273abb174ac4888ec0db9957fe3db777a2936291762fcdbd52e0eb55f7787225ac8e0ce9dc89a124d975177404c6a557692bea069a87f220a23ed09d24001763b37c3d0e3fe7c981beda9c05a78d14d6fe23c6fd9b93b45274c13c286d8e4034696382f3517002a564f38577df0cdc2f80b323fdf0d0df3bafeba4ad6b012dfcdda8c61bc4d60f6f635fef5c3a74dd73c4fdbd2988f142e2cad4312c4431e2808e41ec844f736158c23e874bee4b2711be9614e8cf4541538186851696ecd991eaf3c26a2e88648e310b35918c27058303a6f9ffe23cbc189221841299178d54320aef48ee89e7ef580609a17dcf8d31d2e2b082ccd6cb374198e06239db17661614e551621219900a778019c8e69a21b0e0dfafe27bc2fa3f28dcb07697fd402fe0ee2414c8de7086b69e1135c6a8824ae48e33624add195ff04077d2afe4fb79b24155bcc28948e79ef03c7b5213a456765d7b7f3e204c33b73eeb70259aac4f92728eda87ae7676174233c3d7ab43b1c47e77506dfea9bec8b5acdf0dd6ef8fcc8a8ca8eed48db06c367f9be106065f75bc55c9bb7ff972551243148b41bc54ca633c1564721ba98e151883847ba11beaed5ca969ca174b3651d86e14fb765e9523201679b770aedbfbcfed91231eaeb3da9d76c52b2638f539e80df8036f5c0e4b14f01fff3cfe9562df159f22569ac29190800b514311d965c88ede61188ba079717e213254c6fbd3fb2ac9922fd923dc3543210506fc41abea6a6b26c62ab02c5112df3e3643a914c1ec0fb6e709713f5e697f8dde78619034bf0e52cda5b626d5f1f4ae6baf907e3a3ad9898eb13fb1fc5a251eec7d039ce105bec76332cc00dbb74b189b202721ba +result: pass +shared_secret: 5aad40b5528d175e52ceeeb0e70f31d8eaebb691d69f87029c966f191c6e5a59 + +# Official test vector 33, seed: "4635dc5bb92ef98cdb6220df0dd717c7f8158375eaa2b78fc3f0b58e9c9653e92684cad3461d9158a481da3d14694c44" +private_key: 2702a72c612968570b25144125a96fc1e89d964a96ca260ae250c7af8c825d857b795396e4eb439f131dc9f36cc190b8ad3a385747a83a976a0e3662834662ca8c7f68386486da8663774f04066d3af42713aa6c8280aa96293bd92217c4aa8cc26b5f3371290eab1aa0d0cee1382de722162a23bc001690cc5ac2c49705711164508ca429e06ff1231ebf0b64550c359b93be6690b9d7e2cbd6027de95c34f03c3d2097cbe1150e4861b57b691e18100c333a3bdec306a87121e51c7641687290553d7005a5241609b75239e43abe459414ff1ccc41118417633d72522b7d1b3746f8a542106061d567cb4370f721540cca09bcb9cf8c364fca8322d2d56a6f1026a53a1593981cee1b8d8776b3827b5161886aa4e91d6bc26a516a757a353f6c2020db2b090a7327215238f5eb4c91594e555b8b0a3680ba6b9bc0589b5e91600da829205395ee836deda787045438e657830cb0c6f82379795a72f698c0d7209c85438c92812938c65407058985184e48f9093f6439fa158749696c1144a336614459f2bc41c9a7a31a2b74ac216d202ecce10f82488b4f32c010a23f35c918ac8c3ea7906219fc85f67730ad12450120091a4b8b53f5378f81b5b7b0bd85b486c6aca5b5435f33f8c38dc255c9b42f1a191457497845f291fbcc239de68c1f6875a445baba0951238265d90b87f630530ff089967b50a1d722ddcc7bb1803e552463b62249b4454095a0903da20077b045213b0db8953340761a8591b042fc885daa8a8c6a2985836c9109b827b804ed5c0e92b568b221618df155c1535fbb128012cc27b7aa6a5a362bb3747712cc693bdabc919bcf2be8afe42a76d814a3362b5337853828639767bb7fbc4bcda6988a7a933f68aa3b3cb7baddc065efa98da09cb742ba3563e19e27eccf6b68b94dd28fbb351220764bbd781ab884956a865bec99c222e59295842eda25c340a45275dab51631b24bb86b70a2b831f171ce9222e350a70a1879adc70d87888db2b1c540c4666f7641ee36c30e733ae206b087084fa3bab717d2c8761b78c20a31093ba5e923298ac59cfb768c527a3aa4d19d1f0262d6d4bebc41699d152e092368ffac3088d2488e6b177bf9045802579ba973b89a2404db17df25c546fac731480d180a519a9309e28a98fe3b521c978df1a94aed0a2aeab5b971c995724189afe7b3f90c5b1563a9187311abe681d61834ffdc8a2142871cdb48096a25c0a315f12a627304206149312a4c647d1059a1f559e6aa3b4f22ba01ac09365718763a720d94506a39582e6400d93a19540690c94c9afe1c5df5b6716ccb4b80939698caa521313a3b3ab17a06a8ebc3713944656a75bc95599a67744bbe79997b4153182372754a9d8238926b1cc239d5942e60c1b5d85fbf828409bbcb68e30e89180bf08083e94816dda4aaa53267787880b9cb38e381585535c80ae47d226893889b5240db1d82d926656541f3196be9458a1a20a5b9b263bfc60670d6baa7981672a4654fa87a37804486258403c9b0dc48054d312c52592de43a41a3a7aea934a72281807d26c10aec91bbbbc8ea75b2b215083cfc94a12c61be14cfcb2b688b097832fb016b0a60cc133c709b9d6c1734d4a100d3523f8f30c78f9647808b6cba905cb4da605a2b3fc3a433c916089304c868257bab174861a8b57f6bbf6b79ab55a3044be689a8e19f3d598f7453b3a71a06b29bcf3eb3819ed35d56b74a176cb9bc81b9ad94250e639c17f431b1c856b02c4d6579417d304f3c7b2a34579b6c09a866ac9d871acfdef3099368025f4109240372feabc2d17a7e89031e67a74b68144ee1a871c8737feef4b9c663bcc9a42770ca4571a9b92c60ad14f53600dda002509f109659f8b2a5a83ab6a1d8c3025c38ebe6346ea5cb11e66d560a9c656a61de98407c130b1094c391a879ad70ae5ddc2acce2b42ccb378b9a9997d6042581230e6843e70634d25ca675e09947027591372e50fb42a28cc9c8e13693267305c89b7ca4cfca931eb1e6137f6470432a55a08a183d1187ba7a8f78e6b960874001515ee15437bbb8157c382af1641693b20e2de25cdfb7c4bfd9a803517fac4ac6bb960377f17ed89b216cc92eda7b08a89505903659b94552ed2433d7d6668b226081691f4ea558f2b072af6c50f1421cc8e1532bc6afdfe7acf2a43b34130fea7ca5b1409ab0f10dfaa5a5f0e7b9a62006f1c53e82b5c7ea427009c990bf31a939ea2705630164445715bc5c80b3906739c46a4c4cf1024776037bcfb0716d1ba00110637fc177fa1768e73cad8fa4777e13aac74338513c516715b645e3bed722382950b132418fee81639d448eabd55a94c66a34eab68ddcaf1c756a4907bc3f5115aeab5320f3b9bbe84e0d885fb784af7fd8c1eaccb37642cf39c8a24c4903a7e80578ac7e9f2a95cd806caa200e23873f751636cd606d819731cf1b812afa2ed24381a52b4f5fba658618a02e0418d6823e7f418294c81032936559a77f9c014d8a3b38df8bb17b7a8c3b45b53ad60b0d9929a21a4ae3039366f894b1082db5f3cf2f13381d53827b5a568fc5234e099d6b94bc1a013ddde944b4ea13eb52bfa880716b1a10d8827a033878986155b7f2944a63a2cc32bbd61907125475bc09b0ab76222cb4c9f2e80a00f9b71bf9705e3576b5a96f6229ba1ce06fa1b2079cf66c59f30dfb88c1f9412b0b2ac059dcab8782abe57209188bb938d08bda140a0eb08de0db3f8558c403c725a77aa1e0563a54a77f32aa30cb780f4e562716075763e9c5d470564ec12cdfab424ba970c51201081193741a5e358cc7d63064a7183d99b28ddc5b0f10374ea9710193385b855a259130bc490041f76a9d661483aa668aace51c616804b5e7c1bdb8762b73b39f17785af94b355b0fed72083c2b71efd1cd43c1a9704a93e0e5752e99a2ef115b6ecabc74cb03bc091038f5701659a0d4bc693805080d6a5c81a0273be9149861c461c47cf496cfb22526d3fb8ba5a3396dd19a8477611b814b76d5c8191ac1c8190ac3b12065ca4ccc879d5f34bc4479a5c8d4693d8771b434c4b8e8b8ae921e01a131e9410ed11c505d226722e011f2073b0db34d10c104afc2656dd053e43a8db7c00fe705b0ba520980dc71e834127c08077806cd8e82144d50448dd59a085776dab69e42db0e7e8ccfc010a140b50b50e09f233aacd3da972aa40f1d1241d718b54b6009d3daa090186cb167c1ab3979c8356397e598502422da2935edd9c8c44b90e8c50473119d26e99575c0c328307e2017b515f33d4d2821bf341480780b21d37fb6cc3049324eb12a42c9f7c9e086bd0f39a1949058f1d8c8f0739c23fb1dc542429933080ae732b750af73b05df6b46e0f27b678668f9450c193c861e7e38d65e5cb05a52f62b29d21b4b33d34771bca88b3149aceda8553c5813bfa6f8a99c656601fd6f4ca7e54cf80e48fa144bd996bcf41e49aec97734687a7d0da2c71231dd841c8fec9a8fb686a7cf81106b16735d6559424c1ae7a5a5f0515a8074bd879c1cbd6012a3b5a7079bbeb6229de7676a876c02f1620d04905341c95ce512d20c4ca11f7c08684473a31313640760d24b4946c0268c108a8b96f699634414b070444480800c6c3d4bbdf339c47e9b1660b9ea039bcc6836a6fda9489e76418047eb3e99d40aabbdbba140221333cf1cf2bc121318aab09022f95c31b12abbe67469bc34ccb88c8a0a965902e47494c7a0bd573910a97377b764ea7443e73346ef9bac0376711db236f89a025d9b09931aa473ad04b351a00c5d3b969134f03c1745f672138f52ba47a542942c1078892ca3b9509f435d8521a373810b12393c8eab18fe7b6f3f4ad7ea88b88b21db46338adac939040674be52e6c2948fd659935a86691f076c7f228bc5874fb8214ece1947f68b057411c218b776a332f5aa351b4d92560a42346180edb08bd57f5342773249fcb1f036955da0269695a712ed852a35a3de8662966c0b2c2038ea1ab7b4f9708c5849dbdc6a29e734ce8db1f447109b755af11976b73cb6c8594a5de221c44b61b9d425280007ef4ec4ce3b34beb733cc73a1a7f6857218476adb0200d96658c8456576666b6d7c06da03663191e649457d298b81b067789c285af151ff4b97239c35ab8688a8d6b4469fcc7e42201d5d57bf3cb98c883c5c9c88f05555674e7a1bdd59e3f327b69a74f0d4a250aa89fe1359e5724ca02c38784a14690c62d891364b752ada80402128c623d0839a0f09bd0e6a37b724070a4356641c538415f2a97701c5492d29a2f2823884496af9dd06703d8ac2c17c4ddf5561590b63ff78c4995a31a18d861a91c43c5dec3705c6112d81b81555f7a3b432f37e94def940045d3fd9ddec0289680ae2f96d9d43f5d774a81b86ae7a4761ab275d12195ec32a8686d0600e45d4a7f54219b0d7a3826d193a51b9156ecf2edd6 +ciphertext: 6506597d34901eaeb07e2ba2d0a69f64a75006df37ae149cbae6232dccd9d62cdb088a2c55fa3cba76155241aa2827d1f98c5deb271240a165b0cf64d3b7584fb580cb93f4f717fe7b50c30e52fe8f9b1487baf0d745678455096949aaf46402b8bd5f8945251c0ec00458e6c347a123b47350f5b35a7c42f0d1a744637e7f2445134eb74949e95f877b9dd9c58c3ac30ffd248e72a8b568891d1e70e0d12a8ad0f50a8fd455ad503a901d82ffbf69fb75c629a9f6a689de28ba150eec51c66dd0d49dee6ef4e10d0bcc202420eba18a9884fd4261ae8537cc90a6d3d3cdfc39415151609e506f789d7430cdf4ac700a101b40e0b8142dec62a1c9cf29305030588d21a01fb51d6e91b848c198fb37f2489c7139882f032a116ab707d019330953bd8698ff5e54e34821a448a891e74fe2d6971a568d416295906a232dd1dbb5d7fadcbf2f765ac035c2df1298e46683be665cd8f8dcfa6e4b7034b468e0f53e01ec07b0622c1314d15df534fd27db47ce8b18c88ed6f04231db94cf59889483b29967c56a7fb98945cd3ec21ac881675f36593cda7f20433b1c7b2ce7e841b76878ae25883c0e579a6b4f848aacbaa55fe1478ad2a2e6f1893f7154b53f2ea3aa8fd05cfe05fc921852ef372ef28fc6f9a865c055705e4770b2f0e0af58bbf55c7b3c8fad039be3e9d77219cc9f1883a3307641aed538368f96b7f6c34324fd659e2981bb1ea35085c076853b31e8dcfe98099edc6f78f31a90930f12b7a02c655c07712d94470091e568b724dba0e53e8c726eac8018fbfd95ab92e5a8ecf14910bd306b6de6e6b4c95dae6257c0aa9fd8342fd62b96a58322d559146299e9cf70f193ad3dff5950455cfffc2cfbbf21f322ee48305aa55f81c1296fff5fd2cd8a4fd56b40a6cd17d2237880d08359ec9d1950dcdda8997db7ed75c3700d2b896bc84b6a52e0189d1f23df4d0b522c474d5962dde1c7a176fc3a3a2687d732bf7c4597aaf7258f40965d3adaeaf7846e3ec496f39ac1eb7e20f95ac719f22802ecd32e1487b9d8618238cc23ed2e3b9e0d76ee4272de5bafd3190e7d229efb57451270291ca11a82ad0512a93afa24827d8e6d7aeb86d9bb021df121273f424f37d4120872e3aa40974e1ab9cfb180b1d3795e35659cb77a6748e2c68c30f617f5e26b11d5c31ecf56d8365df6f6ca6b6eaff107339620b468e489c2eb03deba9fe98108777ef9397ea0ebdb7dad462df11c52456b0bf2f8f04c7c8d1d1831d99d9596d4e65dfe49446dd91503d909f04cd04251af58ce187027fb587bc9dcacc90145b7b0221a142aff0cf0273d45236f86d4bcf1615685f7cffdf96c29ca4a7ed8ed3dc0958cead9dcb5095fb96fc3afb7e950ed9f2fa342ee8335e32eefd5b932d3859f1408a6334b3266259c86640f8e0dc41f1c7bb05cc7a2f9d480c372a854270f21f13329f7b6e4c711627929c9df3381578acb54a29dffea14280cf4d85829d1289f4793daa4782538518dac82c44e36dc46dfa839ae7673c6388bde9842abe646177f92b4868441be5b82bdcd082a5f2cbfdca0c05ce14ae7689463ba62e773c1bc3d9614907dc86f2ae02fc2823b23000845177a0696a89a7a0b8f2ab01f2ed2518d9b20c73adebbd40708974bf59adfea03e0461ebba4210b31056885a88227e4b9e775339c2500b509e5a4c006115d368e3917cc539e855ab51c286fa71871a2f7c9d42ab8cbcc5a39976483f1fd7524250245318ed8edbaf4e07d8f7c7a5a0e34e0aa7f5d1cc2da7adee0ccbae93b3a723ee56657543f0a3642c01f13f84068856b331198ae9ad6badefe2238c7170cf884dfa96f4ab86a4c99903d285346575f19e8e8319a284a7f67d6f56ce78c5343e2bd1a25a52feb56769e2d1041679696fa45bb8d5da89e5f55844530d06ad5e1a2771eff0359386212d3e0d1109564c6c9176613f9bf2f994e7af4873b4179591b583eb3004d1c8e6082adcc155b3b916032b8a2a1e52907384f16af21b6ff4320c617187000be4b0f511c56116c25508e29fd0e76e6f062bce64c8786a3bb382835a970c2741be8566d1f7ae3489b8a79228f0897a85d60aff154596249143447db552577ebcd611a63e3d92dbb5ac57d87d9a6dc92cda84cd008d266c481b2ebc3affc084857ff44bd3e04d9c47e46ea8580ec2c0eec6f4f1b97bf4b020fcdf05e6cab506b9e93 +result: pass +shared_secret: fdf3ed80a2b98a72be0cc079b8e1af0ee6491fee10520a1fa694fd692d70787e + +# Official test vector 34, seed: "5da2c51b4acf488c8bded5e985cc4702e4a7bcb248b5ac18aaba529f7f9cbf30efa776e99f76d5c1686e94f50fb57dae" +private_key: b212c7b33a82755496caa9b591e69054a2808962aa4b703ff72b8f7ee2206f4a7cb77262dd34c791e095cc059b1e00a474e5b60a3a8b2b77b0b6a34968f02a67133b5f93c96e94657c8995aeb2c6706a1361e7370a8072ad3713f56c6aa32c19e34278fd2c397e84905813b10fac77595a624476c9be5a06dea927614c8964c9300f6cc7d0e974e334540b60c48868c8fd99829a0ca9743522cc88b6bbfa77b9432b9c373c07573c5477a339697ebd8c4c2e087fde72bf826b001cc7b3d3f7b05484193fa38982f3ce0488182f59cef992b82c6039218829e4e4b1c554a9aaaa301f4733c0540fc2c7acd1a13d9fa0bb6da18f1631c5ffca65bd9519fa454ca76c1b8f5c8f41037499561ed02252e4e408aa352af4155a9d940e5fb964a57117d250556cb9ba2c888cd877083b742428ea6b62f0208c862a39dc6f9d6671965610d69a54d10abbc1238931777cefa00461ec086b26ca2dea34e88565a6a89bd1a138178298cacc938135ad58cc98fcd29851409a3e93cf0a270f4d8779b5f7aefc2143e0e082e8e8b357b84af630364538b19b55954edcb3f250a2a53cba04682065846c0323556f154b97b7973d267c1678a02d1b2f168977a142bcd492509b46a6bda72255510ec952a50aa11907b42b62694f978539fce0cc35079a4bd164fac25c46737c22540803d4a04f54824ac381eaa5ad5ca51568a8c256762a1021a8c46142e0a99f16db9cff371317c602bb08b275269b312411ae849c2c29285cc98d1244a346497ff59c9143a3cc9481ab5ac82ccc86c2d38512bf901b97d83b518aa0812aa2c6e3c2f8da9e8cd8154f299fc8bb52e9ba96a4aa264f8b828fe783ca4190ac42a56a97c0e6d88ed658b6993399e47127040a44aa539480131b485318ffe6a598570139c06ad4054b70b6991fa4b82e59018b7a206f5595e0a2456fc122ea8828fc3b75744650b2ac1a248133bae700585784a1949caf7c58bca497b0d03569127c6fc88b407268cfbaae78e779acf25e9c9767bc691eb0969f69988d3af98ffda60b308a789b8c985235c9d694c6f0e1425cc1782a921b11444e54e7a94819021cc1899439a753a677913970f470854966357569924cc5ad3e2210b6654193a4b2f145782c9397c2c6bf8fc14535149289b904a1f628a45b2cb0e66bd955c3c153baeed32a71673067f7262fc0bd6385c6cc00793528b9cf021b339c179a157087864f70d24cab938be046cf3e409e01faa10e4601ae47b677b670b11ba1edcacb5b292908588554a8b9f204af840a2d2581ae916652db5a71e36822a37b6ffdd3664b9ac253acba6187211866b25a46b62853878ba777a5156948e52e0040bc63f120644a8ae466591986acf5c1c41b77b562a2504c0509b411a879997491c9c25ca38aa3d62250ca5267854e1ee9554e064b4a6181958c50b11708a348929579ccc09953191011fefc0c6a2242adc09ecdd29d1de974a2d3497d904baf5494d4f96ef5fa8e86e45fe4f0c79bf3861be98b7177093e9312c0f77b88f23fa62ba2c6f93255131f23e9607f3bb54c8888eccb2e01cc22bff2384bab57fc2c62a8d47f73051af951c7efd63c0f0a87d29460402814e85602997a765a3597d5a9099b99a37d2817e827b76eb4a2da2622f516364c525c69586c8e5729e3309925fbb3f9e86717503d04682fc5d83888b96e00bab9348c426ce55977a73c40ea2315f122e724a17252317af5187c290a87e6675e78589170454df4b800d2546f9a33a288256669c09ec63e49eb755cec96a542b49ed0365d6130ef2051b9a0c42c675302453ee7ea854c1184b43609a0b25f30164269479e6f2bc7a76aa758db9709204739cb3378dac80f54c665eab7dcc0be9e8186349b9f2e2bcdd9e2af7ef03ce65c62e2d798fe588242f990caa7650b5ba55897615a85ad2f96906651becadc7b53b38dd74962d7e6cc79d68f7b273452aab4f692018bc60dc6161e36e8b523b3b349f6666f4583855998d1f41f9333194b567b9b3332d8e93fe30b8e19813bfa0abaed64106d147495a6abbb4909e7aa06970b2b20914c51a5c6f1d9894d911038600bf22268b58ac4d8b8bd07f24deacb1737779cd5b328dfc251577846131392d8533e70d074fd50841698bfb584b620a100b09ab9ad6c60822a87a132c0b9e3c13bb45e2eb5bb47535099e37019b3c7ac3b81c6225dcc65476fc12e7a81cc80c9a508e507f201632be9c1bf27317fd97275cc3f481bc7c5c25a4b1462767a42cba43b152c276ffc8db55a96d418246e0bb7d5a15f0d883597e9579d675e816b8333097787c613cac29427b11739e650cea2ca8b198c0158caee9971894b67332baf761caf88c16bd11c9f1dcace7b83a6bec71f0ed9bc28f706c38b057231b7c330a4b99898037720cc88245f8982daea502ad30e315c2ca477a3f045084356cb81184ed90734e0cbc0d1553adaf5a94c2a6d8a51566997c735bc45fc408241357da2c38c8a0520fb5a33e1d5c06cc80c4e91314d08599763232517b501097e4bb09bf814a0cdba619c701d249c933d143bbd92c163724b523bc05568a410952380177ff6084c6416bc22c637b7e1ad586324103677101a74835c4255b89ea1935ec8b8382611bd4dd91931c436f9a909af4747dce811a2ecb63f046b411a201d1b4f12442e73d7703e22896a904736308453b946f248a6bd11800797886af555b0787d84daad7883c0e583a7b6530c7d0a8559906f0e423e9e6cb600b9917768777b7489dc173fc67551ad92a26b054ddf13c4f83b5805b9b7b9829513611e171b9ea358abf9054ddf02629a397489dc213705a9b86735577493b86c326e857eb816663dc1417cdac788900c8030803751bae22292af87cf8fda4f2991418948c0b4f54c19163dc4b195b76cc5def67b5288bad948cf214cc6a11c6e1ab1a5b9b1501baa75cec23530c091cadb8c9a02415e816ebe708422dbc2db224b74ba1b83327c8b25bda3cb7127f5c5b963cf3c9abfa15c952bdba2acc01c9d377a89eab6a96a65cfba3d722b6618262ea78770d5fbc556789ce4d13bfe02065f033362124b84560f462c64443b88f3135f585a3b29e450c1dcbaa7b9181133c915522a90f56e595ba11ec3327e6a83c7f1ba59951c4684995ea64edbb3451271a878e42be7d763b27cc430ab6b068173b973141e0a72cdb185b263071d20a8f5a37dd08ab6ea7a2639e0cac1790d5573053569addc1731a339488268873d89a1490b78ee404c2e8328004d44cb4521a68737f195634ab659b919a94e268131ca290e59756311b6273b5dfc2c3adb21534609cb2fc553906a14d8c079f487091587943df49a39d1b465952efae34d33fb9ade56cb6ca9cfa8221458d9940d4bb5f044297c4160a2284032458bf909c31e47a27c7aabdc9815f1ecccadc6288fdaa6c0316f2cdac38ce89fb31cb81b673f26e5709e08c474cc41f213b0fdbc5563851bbec682d9051a5d58148a72956721bb96224214d03e8b89021b98b9a0a87dbf15b491125bc07c6ab6353560d61814ea3cb2e72344104b06413f963091802413521441da171e6b6b039391842141c87c991a4157b428e35ce499a805e2c0954457582b6a8f52c4e102bb33cb01d1ba883ed4cb126c2137a75aadca26852223741c07b027a1883220ca9a65585a5e0c0847b9d0013f821bdad0902504785e927016328c99ca1f3d2bad906b3cef04a3598b2992b2c587100533bcccd15ba1aef877c3a565cb352b7b856880108fb828b42d3612473970044c6c4a057f18ec13deb2c398393c19383603c183b02a461bc9b8ac0969e04179e53c5a8f54a556f54218024041137448d08401fba8e4bcc09cf3b91cc28ed9bb700cc74523c251ad3a7c21f43398f85c7941387612c0c76a43db2a0a368101e88480aa1a5f1500b2a17b5704299d5639b477802fef34bcfd548274d26c476c50fff8851f29ba5ad66caf066ddfec2140dc97b83077a9e21bb4f87aa85a16a7107e3597a1bf4a5bdf008c14bba230cc95e6071bf0e6a25607566c9008d715223c483dfd6737e25a2dea490eb5606c6e32b8063128bcb6181166a93da7626c4273157c47b5a2adb1d88441e76ec9fb6efbda9fd084b496d5635794aa23a43a8c4650e05bcc2e415d775971922b1a446411f952b7e5540091a430882067c0f008211a705e4842789ccf653bb919e742b65339aaf4653e474c10583d9329cadc47a6ef20589572a2e6e4ad67d03abdf7ce1dc9015ba94ed9c69220d63b423cb5daf465d5e3a9d190a6c9d84fb28141f28990959250d48162c68b813460b04a78126e4b2c4514d83cda2735e3d3f1889578b626b002cd859ea9ba6fc856a8030f6010c780ee3fad17b073dded30b6531f854523002db21673437ae275e8a4d702ef311619248c0a21ea0bb6d6f56f12300e8584d8e9a34e0e6f52227281151ae4c305fb8f +ciphertext: 83fbe3b2e33a13730c0bd4e1dce1ef7c4adefc7d62d5bf91a540fef7010299009c7c2b603da43440fa34903d6b920aaecc99a68789b13ce11d43cc05b3b286589c2528480fa0db9bbccdc4a29a63a6482efc4c82612b3fc4152648a0c4a16f1d74fd2458240de7a72a878773c962fbbde1f83801c0a8044282185d20ade7882a67fb445440bc1072968af622305106ec5fd6884542474f7e28ad36101bdf31d3f5600ff4f865e68cf612d63868ca95083971c6aa06a93b5fddfb66a682874a28e5ce77d09953482ca7c917daff026ab259ae6a9580ed39cf94d345bced2ac41ee4bbf5c33648c4849e2a44acc344967a5f13367fa5fe3d014698040983ec41d09763f087496499086e8fd882eff48d7ff3655a9fcb87028795df440cb4dae831e45ffc80c2baed790819fab9ae70beb4f3b1a8abd7fc86304a95614e2fd59769ecfec62511d5ef0276bd4c7f75fdc8af140638db9e948fabd756ca0fd5f21959d6ba9f5c13a6981f83cb9808c660b3b67b76a6fbb5660a8997d362968134a92b0c14d255c81db897d7ceb9af1af1eacb8f42522fea9edb7587e46f50ba817350ff9cbf3789728d3ceb119642285a7a3d025488a3aaeca3a2960c7444f9c686530f1dbec6eb92dd7731e60c40c58c137e7bfaf027aed2a1bd28fcbfdf450a5448deda62d5cb5bc6a0cddf2453d34c7011e4924606727aadd0e29512f62fcd5f7f26a4be5681e2e598d281e0102ac16a5e87e60e9cf97980e8d0dbf8061c59132cf166872af741c08af8db9236cf3c0b6ddf926db9d620ec8f507e6b52bdd3a26b2bd39d1b06435b5696d388d8c7e287508c3aad29f8c49a580004090fbe1ee07a5821e4bba206a91472507a7a58aca5c54652d4950469bc060e498d38f0a5e27e7b1e47c5f1c4e9c5000b16899ae3fc31e0d0561f54fc3846fb9a618eacd102e39ddfed953bb5d7180dac7148a21c0832a2f9a9deac049fdf9a46fb5fb78cfadf42244ca05280302b70ff2c7c140d6b2ea6f0bb296f8231fad365b6561b2c0f7a6b8ba9e977b153f0f33bffa14a6f01c28a733d6a2829d407908797efe3cb345722271022311f1d2df6b8f0706f9ba5c423248e19a76fa65e9ac7df98a5286f172319e874324c92da7270cd97af76d43e277c59c92346cbc3f455b463101295de98109d344ca04049b4a3fed33587cffd19fe562fb146fa50483f471dc594b75e75d179e0d22cc294148ed3bbd1411496a2f7ae00fa964be786a97619ac789587fd34e6793a1ce0ab1b69b27e42fec77ebc88e5b081d5cb031cef71826a54c23ced97df258618f038d5c9aafeb0500a0f00fc3bd375486fdb1567b5595184040d951a925602a7cbca4ee8e39120f3358d8f6678887eb8aae4156536f23eb2c8e558be3b91ec30304066e84f0a7f77b659086f33a60b757c48e2766b4600a520a85823f80059ac237026852430901403a2ca29e3d464b59c65a910d54aac7484cb1ee04575562d19ccdc89e988a412e1fba496a7ae800b2e7c35cfa106e8c33a11841079cd824c17dc4c0cf0be4ec83d386c66dfd5660e00fd24cbb89e85df49b5694e8e985b2a3575adfb142baf10ccb255a3718d74c6e3f40afc0252e6c610509dcab44cf85c91dbe471f67753d65ea8c83eccbc4ebd8a0b31709a297633ea73e9f280eeb9aa4f49ee249ee028b17dc9d5041762bb6930cc94cddd248231df4da3e126e1f50c1df527f61622fa86de97fd8c6c21f8c22146666ce92ab682e0f7cab45b4901bdcdbb9b98830a97aef8bdf98b1573527b436850110a6139c5ade2e31b10ce7f1aa9d966bab3b7ddb49381efe266a94cc74aa38fb901f5161fe18e6476ad4fdc5d4943b82ae655eec0e155dd739fb84d2d64d72cfc2d6640f52206304fa90f05729ccbaed580cebe61a666e114a383b9f212dc83fe1e54294b1281518ce489eeff4b22cb450489bd8c9eff1d79f5fb3032463e61523a331fd92914dd83e50ca25417205b382b42421b4eee89ec3b1360ed68df782dfe84710fdbffa1bc6802ff8809205f144cca551554945695d447f5ca4ef8808fcf06cfec427babcd552ea0551823d12879f9ae5e322f1d91b8410371188dcbdd077cfba41b219a125accf3598c7ec40f866cf9c30ae13f704b800c19145ad5a2453261f02ef3afc8f94d85687a43c5712fe8ea3ebf7d5f377698a556435c90ef6213abbaf55f +result: pass +shared_secret: fa205e16b79ab208250601b4ec37f6a13f6851b94d93a0899a395d623f543836 + +# Official test vector 35, seed: "4d2239e84b052109a78dbab6d80c51a86d38248105970476b74a0b78b9cfab6283e30d5a406fae1c7f54f8bae1110ee4" +private_key: ab6656e1c10c6071c28b24c6461336d91c7b5ff6cb9c97ab265215951983f6530ab7da57f0e4967321866ab70204396caa7b9917c9c6e082b331d65fd1eb300dd481311b723c44408a1b1f9657b19bb73ac593a3b2a86a1de53f2fd150abe7620fa9b061340ac23ab1ccf45914170ac5553873873fd0175b79d500c2e92ad5fc71ab348522c5c82b81c89303abdf684eb9f638a2c502a088795caa954f9255ec8389d0097d768133a7340857534cce37b7372388507c8dd9908d01a62077dcb583a5328238a097a572b800ac1e3a4b02080edf616072229b74f4078d99018eb6191e09c5d498a32cd04e22398604479c85c61436606dc6cc4256611fb8d0c2a4f83fa160c1e7810e558526140c42c2c111141a3a24ea7400e44e3a472d1e913e341b50d88364ae301f4917ad1bc94ce43027a2435c6ea9b979cb30d86a856bc69928348b52b36915684cb5b02c23b00b8fd68831d593338b07ab0316bc3656e9b58b4ff4969fd461ad72ab05754399e39e2776a08ddbc25e4a8db78a279575bffaaba7b9143c337888e8f524c163c059f860187b2cf674b6fcb94b480a859a2b7af7066be0111c94510a919739757470b1a25fd9eb3143cc66c7a2a0c4f9ae57ab26d9481aae956240785043c43bb130c25bc10bc9956a930c009b7a08839cb483c73e671c29f2609667b49e52c79d494596a668484b5659c90965e8222db617ce6e18c94cb80aad565206c930cab57e8040cf6d2c1bd4219bde58538bd71eeeb1ce8ac9bab801aefd84406d7233a0a21a68d48fcbb10892f71a7b98110cb780db9b07b6e53339e3a0ae3921a0f85c4dc282c4874b7f5a56ae059ee327bbbf68ab3ca84e1e72b5955cc3caa12b86e949025a7bad520acc7037e97a51bde797636c5ebaecb671f68518756207327f8acb9594971e7ea07030748a87d674604b2c53b6cdd6f16a0e4669ba37a20477b25ea47ce56aa81f100bc3d4392e224af7984d59f0570e9b020a698409e8b119425756a678cf6c98cf814be4e02be4d1bfa9daa20b91a934da2b18a9cd294808f838bd21a93189859fd6b645f805b8c2caa10904697189ca2a90bb8c9431c14372fbe552009067d6097b11246c4d8469d01c470509079183082e6c10784a5110b93f450a8860134514110079393f3bc45a2442b59de6b37896be3a54553fcbb72cb10755649341699be44488bce835caebaf9f8a017437615d6409b576b90f8021db6babe5c10c0fb159ab9060a0744837631046d04930eb853a1970bc34734bcb327721b39528c0ded4226207033aa18a3171b50f698035282000696c9bb14a6617ae7453b608893bab7b385e87ccfb83929cb968746c5196ac7c46423f4b10ad3ddccf8f9616def05642e22e15e15b5827b850249434d9088896cdc45b39582c3e2d7340650365c929546298beb4fa024da8b3886a8ed6699bd15bc645dca53dc792458470395bb64cea5bd9916a11f5920487cb60776f3fa1b7e6d16007a5322e92410377c874f98bdf32066a136d8221b95474a240247bea21cf0a572cdd721ad9c98f6a248c33a20ccd3a6965133e6e47055b5893d8db26c6b77754f441bfe7439b8a5269280769247adf0665d161c88e756de537bf5601b248e9632886c84b572aa542b53f25001586c60eab6e1cbba8b62582efe41ca212874f402635815611f09ab9ca4ce29b6fc665478192452d667228f17d1500d0a18574527a3ea92bb208e037722684b2f14db7d7cfd11616d9a528e0d54ce197b16282bb2a2a778b81999bd38fa2d86b071b7d47db2c7b3b3af53b4a8bf7051b38468e63b2728003e8489d33caabf3ba196468abf982452f7a261993bcd3941fdc59a60ee24d19f060d7e493c29ca5a7510918b918eeebab86dba7eec12f233c0b0adaa65cc1ada2d64976c0399dc8092d5c3ef0774101a01f6643ce8ba0280356cbefb2c2856cb6021768564342287a9952b1c2da5928520cbdf6d8a970c4aa776c60d7781107ac9da66672dc0490cde4b38dbc08422624e50b9b3b775c8806adcec9a5a2d94f56d488a8ab8f90b6930cdb8fac4ac5b17b66c6b1167c981a55cba0c8079d1668ae51f32a62d4513165b275097597e422fb3ccb4bfcbeba52c0b028a01c94c4a192b9f1dc4f584328cbacb263b5c71c145bb9c82a0db31fb3c6458ef4c21b5663ef7795f4c36ae77a85ed8304a4066c48741323ebc5e5f50d50a704de206c4f6a5719b27b8fec3d95e77f545a7f78c57a9432a329741159808d255232d4288032d658bc483d4afc3d6ba94f8bf44b347a8fd4bb7e2e4000db9909c3720920a410a46905d3a34083c3484bd2448f232ed825658a8b25d99c995be0866a18c01274607ad6bc0154a4fdf70f42768a5ca86df321327b89094383648a236d8f74bd3e3854b110ad8d1403e428a73d9a13cf29a6240c30cc53532d60152ff560d1e3c3205ac557fc76bba0af547c69e9819d1ca412088a8665863f64cc98f3853e2ce115c4c3080e002542714efb10b8f51a59ab954885b313af6000fb8c0b23bc59ae73948e8b30213c84230098469200c8d3aa1f68160963b4dec95c20c8290783457c06b7ed61ab17077709591416a422e52a2afa2c61ec4932df188a4a0c056dc854acba8acd5298a6cb2de04c7c3bc7bc724157fa2b9d01c9bcb0624d79e52988a4b783e8a6d7c45115c548e0eb474368993d971e59e96d5c2a9341b40f461752dd73cbff7543031caf370130311c458684a80209565b754437926bb20840aac329392cbc4f7022eeb03580696b239b2993c9927f649aa838c4e88726f9633b8630977e85350bb25c130161b6c0298c03bcb387c38b4853ce8258166175623107f3d4c5a4b266c9978154e710f11337f05986e921b20d1c02d0667b42d1a4f09231d7d8993263a2cef7b3e5f153aa691a12b7ad28513eba123945f0651b83cd36099047b997ddc5128325213875ab7ac39b6e969693c4746f19a159b19b7911abf45a9215f5c9ebf60c46f254c27285e9491486773ca0f8848e23bc16d83155c302d0e42504762226701bb3a446316b9199860b824c1bb5bb2b4f535e74c493a80b3faa5b635d65364fc241a2e1366f3a2ae40ad07e6621ef64428ffb6c86a1883aa20d04b610ffea3b48e88e6073005e281e91d65cea99079e1846ce89c2fffc8cb38932c00783c9812d26f91937e6966dd2642bc1b494775f5acb46ddb3bfe70c62e2018cda8b16ff762ec3944909d034c27ccafd2803e4f392fedba006d672021a8eec76cd2c5b1f2bb65737a5369365c8ff6231b7866973201853d7538b27825592629c7812dda74b795ccc56fa684e8244a4b204c0b2bce93100a57c02dd13c5af5718084042e9d809eee01ef78166d5579fb0702deb07b6708c7ae2757a004d2ce31921030059c36a014df0178d59c7a7a7b1c3e04bfdca8ad4697bc2a36b5a213900249ce02a678009a4c9f8589bc24810e611a942ad468a2ae2d8af0b3b3a7d741fdaeba89f3b6c1fd302dae37f2d54ba53fb78e040991f4c468bc2b6f527cb985a9ae19797cf845c53803d13b267c8f31e4382791f0a7ed27a96ac609b40c8bedfb1a11d8c244cc85f4b692607d72f3cd05b070b5e8f4b7e0ba56657434296caaed3928f32d526cf0281a57960e5c55f6deb1636494e3d618d1e4431fce125adf544b91904cef045f1d088e159a6cff792ff5182386a87277953b4c4ba3714c20bc50e04c2b2b628b147d07291e24e18a6906b5300393180ed011b2c458d7e2a1f4604816a94b83c93c5160b740e3640707a4fe8f265ba351f4ff2c7fb75baf8980f136b2ba2e81cac3b27c2653c89b65ce236a3c0c28759b12275c4cddf5c14c7b69e951bb30459b150983fbc330db7dc3220420dd5e928ef5905a78a0b0e214bf1252765646f6c657aaec11fa775183c1ca3bb7261a2205e46d064239103203532556ca7fbf750d1f88ed6862ed02489bb30c976b4abfc0123583837a8db3f6a38bc5e9a44a990a471cb3e380b4508ac4162a4073f815507d33fffec823f9ccf17aa150a5bc7562a4e3f85995444c787d16901332989c15fdce4b43a215da66000525ab32f5b1d728846fea3ad2c092e271208b6f833e51c701da8854b867e0bd0234a3c9d98117c58ac1ac8b05f59f027b4a78e94771ee263792cb891e9d5abf0706f70f149482948eb6248bd811210765f93b4cd49daa19a17843e510409d6638dda571f680f02b17182e1c7eaa542e990275bd080bca0c793d3113d524598fc9dbc453a0560c556e7bfa3856570b570a1b43f82657458615be5080c89c0bc7e99a67a91bb9b8cb821e426b843f7542c5ce12ca13b5b7f6c716e63411681fef0ff85e8cd3fcde5abdbb9e471c37cff80f992f3359ded64b566956adfa3266cb05f171eb644711d3a2cb4b41646460817a0fce5836bdfe124a7448e7adf7b8ecc2652ac6d280e986682df71 +ciphertext: ee3f98af1d174b594dc0ce0558e943a69ebdec0a31ef0b0c7fa26ba7d9c80a64208e66389bc232fb7847ce8f4c89e1f3b3d2a201ef4a055c07a82f6564d3f1baf47564d11d9274b4c69b30003d98aede74baf75c2d7d76f9d4a7af78031117732e4434dbde3ab4c302054dd8158e449de6759125718081658ce91de018cfe1c37577ea0e396244ed732c62d5471f7732c8826442a374c06ffb7bc6c7bdeaa70981e2caff21fbb2330d1013cbd5a37cc1651c3624d2b130475cdca8ceb4098045f63630c338c40f8bc07dfc5f97a363686b13b7a759163215a060f1f971968644ce362f99c4201b483d0bdbd7029ec1365efd2a621fa738438bb797aa2a030158a7fdbffb2a5f1b27cd4a356c7e1d7dcfbf1e8a8ff0ef52fb7f7088452d1d15f42545bcc78c1cd90ab4e4a75b10588d1303877e78d6937c009eb071493b27c27564899464288d4b65d2c3aeced1c7ce69e82935443e1f2560789e240ef213d4521fae62506ac96d3176093d79867dca89e5491cbe53fd78dc66e064b1ed8167fa6864de9f1c29cb81185bf00f6354a38bfae33d8f2306acca3131db5aef13bd0c3c55f02d1c069a21a663c0f754b9c4016239bfe691e50da24cccf54fb9588a280c89be25a48e77f9e4dfeecddb00a06911a33e9efd58ccfd170d19009ef16c3a54a986e55c39bce875a61786990a1d057bd9fe07d57e143969bb5553971d9025ce7bcc0e96d01a496491b0bb8fbf886d8d5527a765808f2a78590ad5c84b965b5535b82506857220fedb7a1bd86ee6622a31de73139fd143ea6b9845c22c215a890936af8765a58dcc24ae6ea2240d5a5667b268490dea3fb3252ba81e71953e4c25ada1da0191f26082d80e66e6d1469c01bbebbc096e2700d98c7b605593b0ad895962e183c7a0cf0ab101f65f2329eb160670dd86b215f27025ef96a72aa2666ad9873474844518adf83d7e6714951da83ad15c89882df4f27ddfbb8e270445e403213c7357c985a5ebeb1db03d1b34c971ae11c986089d1c7d4086954e7bb17bc1cf6d6c4b4df9190265e2bf8f0580fa9b5540ca0dbc635d1a6492cada9ce0ed26b029817e366a494bae2e7e5d618beb3e26f0b9d8985eb23bf20bf097a600d9a06103e20ecab5d5c933ad4e2c77d5e72775f9ca84c0e71d3400e0579882284be79bb3df2f9bee359b2172943b9f4c78e85843834fffc59ee297ef0fad3e03212123bb957f1e0475641f1b4e6771091871e05ff6f2d8313882453c0fc6ba7a2271cc2985835063c0fdcbd2947478b7c9c728f77154b731a1cdbf0d928c326caae6d3737cd478b3af92383b5610ae3109429487fe009411b3fa6eada1ccb2916b37f633e1bbe6af135e95b0f0e54f079fd86ad11129fc10103a0de8a9105480f0369d763161a366f78ce4e679f1a9ded37aa63353bc9f47a5f9b4c63f9fabb2a19e5003b703ecc93233637568d211eb291b3d03b5d0846a78b0f4c9aecf442f0976dd8abcb18a72b81fda3c8de270855587225539d117e2f2a7a135d6b879a3240673c2622fbb1db86fa0e5db9f19ded3215ce5c9ef0b8851109e0994dcd3521781f25891c6ac10b3a38b56eced9498662eb4ab65b8f3d3ce21837a7285a5a2d03c1f8806665b45357564cfa3035f2b8bd342a21ecf6b7897c8b3fd08afa925360c11825ff3e96133fd6cecf35151a95ec05b82e342f4657c297716131e65c3b346e6647de6c92085e6d2204496eea67c97f866fc1ca0e235ea457169de6e4d7a308e4d348ac34701bd8f990f8d15f3d7b5dd9cf3f50d41b9b2a10bfeac96b9438c75adcffd46a60b23f5037b8b2d0984be210bc58180669c7a12b2269538740e776f9716154a568df5dc7e6e3b329f77f69a7637cc78e128b991a4e1eff3d3d1409ce6b110b250cb8d3e092d48b9e33f3d2f258fabce5bd0957c35b47fbfc6ab6608253248c2cf3210b6261146bdb6818cec194f42ef1485ea6b467227a63d461eb7b617105ceb28126f99ae3eeed721ae0f1cfcd05206c207f895dc4183282478acdd1daad21dc0af197dd8763d943199042c4bbfdb84ca4781a3056ffb3031d3ee3d639683b01445a9d82e3a18a7c030da16375d7b69dcc5b533435acf8a3b08c56bfe07cad6795b5a1f794f73f94489579d70436a323ed5f10a9decd33f0d5baedbdb89d2d50b3aaddd515b9ab879e7e39e3e06efb9f9221de583c36b +result: pass +shared_secret: 11e27d94d4dd5a8e8088e281608ed424a9384bfe96ffee3b6305d17cddf698fa + +# Official test vector 36, seed: "ee762f5c9021c36446706a88ef16312f4a12c725cd7afff1484337c91eda8e89f7007f3705747d29907b3fb7500e5074" +private_key: 6d02b73b69cadb317ae9c9b09a74634c1762b30c55e793c0fdd50574eb6156f152e7dabf92b1a4cf7a9afe32cb5f95909f1c045bf9c7c76c137c6c4a4c170f82724c32921a2ffb7250ea6fea48060cf88b69a0506e2bac21912e4ca5806d15983428c4d7f32847b6a4bfb7218a4cc2b09a343de3ae2fe392ad6a555c035ecd0a16c66339280219bb40ba2ff5432524cdb0ca32a6d1b8a9ea96893c3864494e3690647d8318a3520682cbc19632cfe2e28733da34a9811f5e659cfe99b7894a88aa01c3979285813a149e196ff51206ba654215985c47f3bd24848e0c959a93eb20c3176c68188139b72929b83533ea0a70e44333d923512750cd9520f98bcae6c16643c080fc836367aa4a39c88f66c0ce09428135673b0f09529d0bb1e9e4b14679cf41f433bcf533e7e4cb1db4b5e800218f564fce359056706f9f091f6b1a0420269948512748871ea2b7c7fac91411c70a23418a336297ce670ebba02520c3c1d13807bad55100ab3d0a8b4e87fb5a5d21925a6892e93c3c10a66fc4974b282ccb9cb134aa0aafa86a527f96b2df98ba19da2e536614d243a19dd1a095fa37e9008607c882b48a79b3403f76342cd4345e6f6c95327965c2f860c4367135124373fb54a4aa7284429455f1637f56b4443ab048e0c9b82289f7d2340c2547a3bc8e66343248b5114d27cbb0e19a6a6a82c84bbcb340113ed65460052c088c555c27847078319149048c5a9103dca6770aac9d5a75f84930d6f7cd5813590a22040ffa2b9b631ec897409259037fea8547dbc92288414dd002a4c377e501800aa49b28e68a528a3312060d635ca584542a8452cca7c0cc3ebc4e3f46a5a5cb1fa49718b1c71f95224f9cbbcc9376737cf827b25caccb4b49cf4a0b0de096e4d83f319582edc68ba1177bf7ec2e2a41b0686bc6678b8355cccb7b9a8519aa68b39067dd178db2fa8ab33305efb7592a29a8f49b9264251c1ef83d75518134da35ec07ca4beb10e102466da0b74673b9fd7cb93f287ab4e321c9c4034cb26be63567f7083cc86a15b67535b1c235c7aa4ab1eb5097947b5b282e15b888a8b010e8596faaa410f6ca7fd358765ed97e5f8970abd54e36938709f6410b779077cc0b01052b412822ce256f15352fe5314aa2b41be3611ec14020b975077a444007296455818b90f6b85c50a3fc4506cc48c1ad436308154c5075755c6419ed7a267561841cc56b428608ee62047122aaa674bc9af18f15c52bfcc981fed3622f302896d7bf238b9808152b4d8ca1efca092569595deabe45f6b35c8c9b7293a321e96e9574726dfa93c79b162eebb0e7a37cea7127ef1179c728c22d98328b59b86ba4a85d11249ea08a3e594e7df1210846c8f7683f5b856ff4fc8d63b129cb1c8ea72a168c71c56c166cdac216e07097e9fc050f458e0cf6bfc5f55116e161938c8df6643b6d5514ecd860a4372693e12c1fc8b1552800802ccb48d16f4fd89306d30af791aecae205a6235eb9343c6576034c38747a306db6c2302e5569c19a75b2cc62d3895584361284801f368766f27a83cd376952d0374316af68d06b3c242d7188acbf8847f55b80750bab52b2043df10b47dca1986131f2db9c9b12bf4664a3db6bc1859b59b468c0f34c1bc8d8c74243aa3f434f044a408ab988a5820ca9317d35b8344e45273f76259c813ddf991e0e02664a4c8353252c85ca8531b6196bd68767cb8010d92fcfb12acc9c931d169b9cd247aa2c8c5fb6013cf65f0ebc432c38936db3b6ec983f742a1ca6449011bbb70f5bc7755b58d4c011455aac47c6831d6a3368905e6b700c987cc910b23d3e406e81e56f28d0a35aa331f7499c63a10b2eea5dd24b4e7c173d9e694d6c6b7a6262b26c99163c337ff3fc9dc9586548665c1472935aac3a8b653e07802b1f2a291929233e7c8d1932718ca63299ba4919d9936d65a2b78c733ad2c15f13cb4f45252b7004d9d9911bc5293c61983eb24f7b9c1808285d82cacd48801a721b15f43c0f4563c494a9a5491c30dfaa5ed5f89e08cc76dd7324d16b3ffcea5393aaa525e90f7a4bc88ac07010a60e68f7be39b20faa28610db77006a5577acc2d33740b6ed66341a56dcb4ac5a3eaa431765d006caf51766a00e07f84a6bb0222c251764d628b9cb38860c4d8cb35d29c0d6263d9020389240d058974e871ab8e433196680f50c7b88e6a3ec8764b4509c3764bb4db404a8e932413930dadbb5c5d60a01539763428cdffdcca2cd0554633367ad245e069bfdb397b803c68c8543583581bfcc9bb1147a2063262774706dab0a015e7c57e244b12406b0009024fc06181bc058b466ee12c3ecd1a983fe1bb030774db831ef1bb26539245caab4d9954bb01901c6bb66534b95cdcc92a1af075be8a949829558ce625ace38b1296a75058b9a3f90e74e04ff3880106869899e6844a6504b8a0cf99ba86c72cba26564739d0221fa20fb412828180a14bc570503a033eb379790a457f9277a221b75720537205cd19969149ab9d2b87a19250b595186454c99b46ab8f03365200424b4ef8cae2569ab4bc07b98acd2e50b0426032f967354c70b6c1f1a1df32406c296b0e9b8066904fa2184e0dd04ad5c27f9e952774bc82a923ae90888613144bbe376b38112a836b7d6b0606d25abdcec0b471a834fe20adbc78a68cdc5619089ae4f09b32947eaeda996adbcf131621bdb99173063f98f1380a324f84626212f8acca34205299399e62b321030191379b8bf96ccb336498d2a8bf573f44596d0db92792122026b61264693be3a3a7160a9e60fc1fc0897e5f602483d6c81f382e3e237d6709b82056976ce23d66b013ea48cb56d78d12c68dc2cc6fdc7aa1142548e1940e3d889c71e990fbb19d4fa0bf892b5cb873ced68516e544bcc4bac3734215201c617767757dd3ca2b0a5084002f175995abb6a7b88892d07b4ac68b974ca83f13722f028bad4aa9400f0b755fa3352c90673a44be327845d1dc1cada0996d57b62fab1032ccb6eb947646fa25d06495a6577a17d707b11c3e8fe82325d21dc2997d0ada9bf85b45d8e5431ce5ac571c253744108f91aba0b2868c7096c92b2f53fc5a0d996cd8414cf230cae4c58059177607040d871b8b1da28837c7ab177369fd2c05fe300da0d84e97497cf5f22a36b966b5872266202d207740d47c8b1fd118ab390cd5ba70bfd9a0bf8b59d14b165575a079d82bd0fb1cc015340a1c0a0c77c7f822cd2999c6f10b5aab063181775b7f42b2fbc813b2fabbfd76c0a5d4942df97c449cadac303ccf4790685438257a0093461f581c981bc61229c94a130372ad920d2cfa5cbec684f8986a7ecaa94275814cdc2d7fe403c933bc0038b18b28cc3eec9ccac49bd922c446267cd07b786de316012330ae70bc49216fcf6b4c7db2bbab55153e21089d04c3fde934955ba215d047398ac172c2b1a18c0597182e88a327d0f0968796ae0a03772adbb406a210f2e004810513f09712836c45cc11a0d8c8433b813e0e8aa380cb166fa93961a2b6765287aecace40cb4caa064f6b547f0084bcba7856898b221d362c9de766c7d447bc10925330ca87a8379ba944323c638f33b164e13731b0b92a134ee9d454684387790361b31b53c245328bb19185f9774e2764fd429e11e2a4851b222c4a9e504531fd962fc23852bfa3b4632aba9be4595cf5083d64522ac93b41c7409aba1b83ec51cb6a1c0bd0c24e35cbfff95088d7b6ec890cb5559c44553dc44822692a243d032ff75c7c08914d847551151052c6846e2f556201205dc130babd9483dc721d42f42cbabcacff1aa93d05a2ee54bd399186bfd4978a7a76d5d24008fc55ec40a6bdc899ea0a69ca22acdf8bbd14a5cfa2a06587728427865a3331c60e77b5782c37e79561cb622195656d8f9c0c8c2c560ac95cb0b986ffa0784ee17554cb2bd0d332645958bb68cde65b13d274ba9a655bcc8072d6681cf556c7931000b94a9436602f0a5a6fbf770a2b323612bc47190c9a88d4588d97c099ca04b3b7377867a6e68869fda2258083cdcaa41aaa798ea11ba7f6cc4838f2aaf9c5795f8137adbc4c17b491a59255e61ba078a9b4179cbc89cc3c9946c65efb9ca5ac5765f3570f673ac80c1d26b5af8f031266c65b4ef41f7923af49dc6eb3d0a0eac745aca402ed4b9b2de754bc3b7a6b54c2159baee1f560dc502e4ee6b3a3d6b4c1ac1e06dca9edb6775f5696cf91acbd9293be7a82244234de9869afb1b2696300331aae6c9332840145eb16b016f8714fc00020d429f75231f73b265272a936e404f0d57b79c6ca8c25cb7c8bb89284c4e7b0ba9eb33c0406a8c39eb0d5429fcae286a9c56be5839c10ad33e8a58374dff41feb6af202d9ad3f2c7ca61993e238140ce8550a5f0c39147130a5313c8c02d68de779238a80dcfd7c992d84b2dffa67493e669243d4fa38c46b090bdf86bc548411 +ciphertext: e08924a91b398adb3daac6ee525b89bc18256d7c0ae328ee197c02c77442f97841b0ec33c6fb217d3bea65984c0225ab052b8fcfa3955809b56cc7565e97037664738cd195dfb3ec7e0a2ae1477664913a01d6d15362e847cf99cb88d3f8da414569b8cc5afc61490f2be47d4b54e57271f9ce5c8e592178f070d4feb22d003d0224551bb529628357cc896433a87a5cd7ed2c051bc8b0c4bce2256d04dd6f33df91c3af9820d4fc5f99a15669a0049f3dd2843b6ba5022cf0ee81f1e17601c1cb567ceca60d6092c100944c1e67eed0a6c9a7a11d697231594eaae2876077a47632c4714b4955a727ac32f2ecb48e23698b47583245cc7d830c29c408af82653fe37efa53d46f71d22cdbd477ab034386c8241f0bca25ab3a0182b7fd28acd4b1e633f9adedd58a069bf9f20582724f33eed04dbafb95553c145705bbab89796bc21ab9a0780a9cd392be274ad451447be7a195b23126bf18cbe75f12a12eebfc96d9b22fd19d57c342cb4bd3878cd69d21aaf0c093eb7b7a6f149e4d6c214814bf8f1690988b794c06a5b1111c415220cea0acc02b452c6f2678616e52c538dc71b10166067cb0682e6367a861dc6029cec249057484367b5be34f9b5593cc7f92c81cb80e00b1f7535237369b82208f5a8b697a6ef4caed276a16b1b2916cbd7888d18dcd22567e92de1d0acfe7ebc4a3f96014754b84fdd8d3d46203230a71104b3c825d71e4995948414283b636e98d447aef4e9e96d3240bc99607f1a9597408c8556dc37e9cd18bd1be56d6dc73a154576dbeaf710ac9e20afcd5a41db8efc363a7d26ba223a58e08fd1984073fa6f115a616b8a8e388165df7b1ff1bbfae32aacd893d0cf5c0b260f0d0d809ba9092823cd83e58848cb17de31bec1856360ff6a2568cbf27829998e741b9dde5d765e971cec53cd94d1faa6ce89a8a57821be0d7c7dd56f31c1de1f49c76520a324b5c978e075af190b620cf7315bc338a6b60ba6e896496f8afb86f6f67941ce00846a5ac726264b3b3fca4c201a30b867a36731058d67255ec0ef57222d51d5e915a79068e36a62b9b9ab84767ffa472100e21875e1dd288c4382654d1547d11a58be3911832be2a2779c84b8775bf1285eb7a86b98647f0533cc7b9fbc013d3f20b492e06228d4f5b4c859653caac26d2a9cc13ecaf229edb5761d094386ae4a111e56e4e13c992bc994d47aa9c45c0ba40f5afe8531a10a51f74e1b8a6c71ae55f4af1b43939f1d299e396b1e573a25304c5c8d700d95ed1bdc5d35c4e6776be305336b2b26fbc3c78d2a3336607e5fce6f1c6d7a41efbd0b1185ba60092e78e2414edbf5ed1d3785878a5c029ea06b3ab0a5a3cee467eb582064c9b7d29cf826c0cf7e828fd1963c39b2f3e40731f2bd6f2723aa94b16504156a405ad041c1ed04e4c00c5e34be37128f7b57efd9729c544f13e16b1eba33dcceeffb7d8547b0eec6703609b053a897c1cde85871fde1142dff09a55e068b30f694064035fed0889ca095afccbc8434d75456509cdc40e42021a4f196c339e0379b5804c7beb3963d941a3482c96a8f28d9ceffa3513ce752a38290765fdfc551b8b996e7581458659ae35549c9a3593eaf9b5d6705b085ded007fdcc454b35d84bbb583ed1ec2fb74a6aa26119cde1554aa2c6ebc6c74cb1ce3c06b978371c9103d638c37d3d1d1945cbbec11bd5cf736ada2fb8767bca80e88db70af0018aadb8e3e43f3d08ab5f017ebd5c7ea661ec1fab82b8446a8be2034d29fb42d6dfa3cef966c1a3b6107198291aeadb8f29cbd4117df8ef571f3ea2df5fa052e20eaa89c2c757be75aa657678f0ede06157903fc08dfa8280cde37ae23a313e1b501f3ad51f02629189f2d6924c2ed26e3c78c9c90ec6ea36cb0be8cdc0016c10eb728c03e8664901fc9ef25ba20fc8d058070aa17af214bf7175bc1ac736eb22948511c8cbcb4f0d98ef25a73eedb857b43039b4729faa9233b4191fd0700ea3a8b32d4afd55e92b8602a640b75da23902236ca97a92053a98a4ab78bad3bd5cf202b452b31afffa6393c8d28d5812fefa53455aafd8ce3f953701e24820c19f799746ea6aca59e38430edaf1ba46b750d8b2441538f59cf25b437b9c95e3ca3856470609e569d5fa08bda01aae9674e29f96c1c8e22cc5d7710de5eba022766492e265d5f24330ca833dfb3936f7cacba046c761 +result: pass +shared_secret: 86d765b2917cb98458fc5f5d26cc9a28426655a73109ea65f61377532c83c280 + +# Official test vector 37, seed: "d882ba69ac8bbc88715f1c6387531f53273a5dab87e66faa8221a7f628d2bdeee1cbc59c0e08d0add84520a3a70c1389" +private_key: 4f311376e73d8074bebfa35fb9c25879f482ab77c1708a8974d609f4aca60712bf80e6a4948042a333cb8abbb1bc32960c75776194adddf09925b605efe3cea0421a9cfc63acfa774858b9f8468c39e9038434517b103e117abda9531ec9db871b0144de3b3e6a99cc091a696ec218e6e099188872d3b2b2e4188c1935530a364ec7a1a98d9cba4bb68d26ca98eb437d2a3378bce40fcd3b4a8f7982485a1296364363dcbcd813a2d434bf3f68788c035980c0be8f46a6ef54a198d64c0d149731a097cac43d7d022167aa8657ea521197cdb3585b4ef64b1f6708082471820919e8b9392a5c2f56e56148d10f18525491647fb0140e7c66bd26e3631f3bb3f20c947a67194b9c5de9793d55c2b800263e50929889d8afc878b661c7cb2fb366b8f70f8ebbcf75822caed8a6c83a3651557389c51e5431ab15095705300a88ebadcc417a4e955f2858b797b39b64f10f587119e24a01e2a17a638873b485b2c8d867969c39b30c01404905ed14aff50484da83a8bfdb23689900a7954695b6695186b590e5c3dd27ab6a619a2cd13b78c9cfc7c966d4d373485ab99e522a74372c51a4764ec0152a29acb154826479567b1c6aa68bb2fcf471e035c0d7f22478fab87e7c035102a8fbb5cddef910923748bc752d0c82cfdf8b7733f30e6752b037482bfcc8a38097c9a9d8745b0681ad79710a4049be27c13680627516aba8d308287a45f498c9065900cef26280f17b8ea6216f60118eea6243337fb2d7ccc156325c33116b057b92e24d662718235a7e7b69186b17232132b529e44d558039eff0c2aa6b0b0bf8332c382e1b132c3f343a2bfb3f11a116563a7905617e639c6bed21051f5513c4793dd887b9ea26b90dd7076aa4aad5614d53e87d91861caddc1dab846c6933a689eb2d1566814f31951546b820620fb60690a7734153e79e9ba9a054aaa9b908605b10384bba08e2213e683c6d64e9a80d8235f02c39a6bb42def54865164c86c08af24a614f3608b24a617bab86e5196172c81f1a6a001ca4cf72c9bcd6f89b8dcc154dd761a3c02362092db91b3da7dcb723b59c3e029be1f96e6933a5a7a8296da3a043a32e9fb27573a62352a088afa68baef5403f200d8d71743ed79ec3acbf1c4811a0308f425a05714c5637560cb7b36dcc91008d715248fb3e2e52c38b9c67381c3e0bd8127c163e320504ab20588f02a0ab036e8cd121d762af33980c0a7625c6129b83b6c8d7e304a4529ac33c204d79741c1a68ce356c4ca04a4f16406b462db4038f78bca2baab2926250cec30a3ce827e56186da8669fbd7a2199f53cf87cb2656349b6d2ba189079e7d2aff8938a983275551a21e7e179e13cbcea08885af930509c68456a9e778baa0e4649e2c830454c278a06849f088d130c176320b260381259d4458555a2d8715a93957470e538448a7b29958d7119c17f6a38f09a8b441c371114cf1cf390b56365d7c71fe9bbcb496401bc8b07d15c06a49c221828b6b7b56cc601bfd6d75fbf3aab16ec9584b78078324cf9060c5304354bc99e9a69c090c6513e16b6af982f2bfb4e0ddc4cb69ab1fea10575a53358890feb66162d29b4af6023eff84070e25bb84b0b5ef18f4bc554b8d661cb5a97a83b856d6437eb503de82760cedb83a5ac4b05261a02a621937231eee26777d75a3863cdbc24954f74b43260a089823b8c659108bc86dd1bc36e9643b4f62c1489a880099622b27160a2c934f4b3369a9afa7531ec39487ef2b8742b63cc5059a8f9317b06aa8401071d86791b09249510aef7924c25a2458152165ed7c4403c0ccb5a8db007221f930ff9162d66b4a1522b878d8b08624a0ef3b24c1cec21928773c8fb99f4816a7955a2a2816949eb1dc1a794f7b61c1837398521bb07c0063b2b01571054af509dc94a3ef1882b0928aeb4dca18769b593d2b357e56bb3148ef7d4cfef73068d0b48cb37c168168a46701e3b16b6e8d463fd47ca5f7b472878497eb9a60e629897108c30461bf6f09283a006b95ca010aa80c50072892a1d7f406799593112b81d61775d4c15a3ea54c4184b775a88cc3c427d9a36cd1e77948ed33bc0891b24dc7a08822cd2c94246758cc4e49f04a61d0d721e43e57b8c18337293c25e109e64f01e88bb0c08497d49083a9fe260349251ec123ce574a5dd6ca1d14a967e7177aae64d9678571d6b0b0769935a1a2a8dba53db6c5b7067210426c64f53542929b31d565bd25a480d9065d79852b0f05002964772465c3fca5f8307308055603039b1b56726eea02a8cc19c5af41309f145000d2aaed3038c17911677a2631242280c23e9816185c75e5dab43b4b04c8777a35721605aab1adab828f2640ec5b23173f6cf5d37ace602ce5af62108ecaa540ba46594181ac9869517502aa73ddedc4131ab152b53501dd4aabd79556476063da48c4978835f28500f810b77715257080d87247354302399485852314598fc6eb1f93feee6429eac96d37c8422dac30f473b56db0dcd2c64f1c18f91950e7984a88b63979b424c6d4a36220019881b5aaac715e426a6976a300ff171a29778c82a1520f42a2f0b10d26035613a1e0511720087be146ac9f0cba2c1929c0960bc16065748573d61eb195de53ab9ec802d247b210b747c70c45aebcf39229e4b938eff354fb9f65cc6b52ff0163494744848885ee577048b506a95112ed45466252783a4016f30e29b1928acbb448379723d51bc3b59a62df46ca75f64bae27aa2d9456c66e2997b48274f425004e6884e296e17912f7e387db452681cb32e7217566897287fe9c38622325a8c6716e5a767a626d98836cb779983c31d1802b0e0bca04bebbfa9e2cc02429f987a31f73274ce5320e1b0cff8154da331be8ee21cae8c5037a1baa4956b04833d4928a1c32147246002466716ea9c69f4032d33260c338cb13ea09e5e47957700c33bda9b147a3f3f64b46c933b7f4689d2797e4ad24df42c002a323ac0e781b7e8c8e679c949ca730826b3f6c28813ac24ce7ccb21136695c75b3d028fbf6ba94f5a06115c72bcb879d64cca29309502836edab5c7b2a79a1e1204161369c5e8b63dc513d0aac9fd366387f0aa2e736bc09b4dba05414659a6937264ba982b419342e8c063ec64b28663cbf4d12aa5a6ae5aa9056ae71c4f5643cff81ce6d7a8d29a250ac27be274afef453dd176c462791c249a817329142c00ba332851e50a01660a47e35bbf3890c23be173dec1a1d57a4837975c14269707384855e897cb44c4bef532a003409aea41d2fc889f572ab20c0409831ffb0222cc7246438a95fe4a6e32412688b2cc8c1963e38526201aa9d2b0963533b2fa42af59e61d53c4bac2bcc09e44c5f9c4963525a7c015244000749e811873a391f71315d1fa60c806390fb3aa80295e77e80158c665ead61283271a1997757e5c4dc6893ad71a63a1898fcda02165db76e252665153016c90bb9c8423cf8a1d371338feb40a382c2c3f99840ea96f99246044f4a5fa5cbb8d7473110b4a5238255e5c3d43463b055bbe46211d2e05812dc46bcd539c56a15199cabe5019220dccc1a828a5e0c37bf130a6df762e395915654b5bcb5c3eaa7142e1706697b9914a287513e407ed376354697144b33260eb966316c05dca8655a0436bf47967779d43cca5edccb932c023351542857268a57a74c4eb08b7809c289c5543cc3730594b3ea33de6e23a5600ae6a68cde3614cb1a80bd7c2379c1834c349c55fa73859c5a3ad45886286973f1363a5a536a0b08faf26a939179f873cac62281260868569372dcc744185a55feccb261fb0af1ee7a50dba2c49636e09687f4618667db136bb291f4b4c129fc7635182720521acf1d67c719a283c412bc9165d9f883db9049b98381a4412b6599316cb39986a9c3f8c069aedb9b5e13b82f3abc0c1cb70dbf0b5d1d66ea003676197c1be2c15bc6533a41804ce0c123fa55a87fa344d850af4f5b12fc0ae3610593e1bcaa1868571b2a618db9f1900c459376798341e4263c70cb94a9db42a04067f7a5310c606bd7ff661ef3508e6b6b6373c7ba0c872b8019676263bf912673c59a4c51372a2da860399222654518063c3e1f07cc6c93e91ac6b53f3c04516b76da65124325c59d4360091923d1883977a52b328c0d508d0f039696db843bc12c506b521ae34c9b9d145047293a6eb99686770dd587c92bc65aa3a4083b40e8fe2cf891c5152281744612b2598664e4368775572e4a03a9ff53e307caf081ca897dcb43061a404c689d934653769ad59d68475a8b0e7277bb280ac77ea7b1a1b6111c1574c6358dd6a472c49c264965f8cd9fab7d1fd2c5f4c3a4ffcd66e5b05a4879536aee3074b69c3d4e6b1eba48a8a50609e70baaf4c552f680f0b02afab2da76d8833a2cbc3b6f782b36a1f135cf64b6403e103afae34da038613e2853bbfc36baafa3c6a95347193f37c +ciphertext: df97e2ea928ddbc0fee9eae81ad53728a6a3a953ecb6e3071ca382f9357facebc3cfef5cea739968c1b98081b008096cd4a4a6ca597ae85b46340abbb9d700add2b26b14f4f9cf68780815c4f38adba9b9929a0efa305be578c55c5a028cd3ba6ddf750546e49bd4748064afa4997f09254f33c68bed867ee934f8b0a5974894726446468eaeaa4129e05eba9d5d1cbc878be4d2d4a881a3a8d71c158db0005c30855059cdc29185c8512509dd9567a8605feb883994479426b637dd3c068d47c98e98f18b6f69273d2b168bdcafbfe90579af203ba597cc53ecf12eeed9b6ec7b177d665bdf90ebfd4a9fe18863a23348324e9b891b60d4c720e4f67241dc6ce5ef766edb36b3599701b2343f9406fe97e8b7b77a030a5eea4219f07775d41a4e613fa41d99fabede9779b9b957f8857b795538ca11fbdb670fe2d96131b0d7944f75944c99fa7d1ab90ac25cde6149dcb3b9e128fe2c46e79a26479008a57f6a1155291950d0963d5f702ec4c58ca46720987ede70518dac5f2b8921cd0f367f9e0950cb44d9016ba078e4e22609a849a2a34bcd8f4795a3c3acf8e02f25d187b554dc2edd9f5f68788a007e05abc44f5d3bf9126ed5060e08eab422da200783549c24103f412cb9da9beb8e09a96f83b73328347b6e2dbd951194197cfea6ec0bb2ef3469d50c991e0a348f34cfd1af87fa1548bb501bb34aaa69e81ae0dc314aa984144d87cfb9c973bd16ea7760c9816d1ac8cc745515aea51eb7f538b4c7abff9fb184b34d01fc94d82e1b3f2baf0e8c0a491b411fd570e1d02a98fdf9f0098da68c5d026b07e97672d4abeda9ef0ce886f83584bf212e4f46219e95fd33e6cb90521ff7026e57108e0eb73bcdfb1160875a99f95b3d955f444321fbeb431c8864f7d387ea52ee3c04088b731b53ad9529eedde950ac39ed114a92291c8cc7db0dbf1815d5066faec5c5c943657f562b43c0dfd6059d631e2bff45b440c3dc00cb032ff6c3ccd687620457910a72a83488ce93dc99204adde3d38dbd3e0db8996216b5d65a11215e0d5865ee6aa848d51464f28aaecf323d32e927f024abd06ec057403ae7c6e931c320c1eadf2cc66d30b5f854f52f238d20720f2020b1dca40405f38d3f89a19161d2cad8e85534ff5a2a046db25c804c53667d1239df5bb6052d21f8a43136f694f3590ab02bcfa13221fd80838e5da3ab0dd3c212a2ee094d1be5933f71fb62f74422d38a05bb842be8d82ef68830398d7bd1c822fbe6ceaf6361868f6a05754b1aa176c4b84da0f93e4564e1cf2e47d54ab5308ae66ff66b0eec00afe8da1773ffae4724822e90d52a12e174f5a72f5b6f18ddac08290cd4131c5b5b9a5a1f0cbaf71147c4139c45ab2f622d0d4a9fffaa258d6ab7d57185bba9837494c1ce264b8eec129510f761483875802dde735ccff53cf7de86ee3b14fc81432bfea8c98e8f2fbc680efb73dc3e14ed27400aef7a9e834518360060e0ccbbe151c72144507d389233b1cbff481e8d89754d59b213ccfffc657cb1d25fae45b28fe152d73e14c29e49f3eedc3823a7a75bf38e8f0d2e5872810af32e5ac4415b07d0379edfb869ce7306e8e74fea6953066f12cdece8cf01ca4723f5dab6d44a4a60e4bc79ea7b0d70492c10537fbe5d5bb3b61bc3a497c1c78333e2923f44e3fcfe0ea24f768093635a66d4278e5133626c2be5ced1e5fd6e1f07a47d2718f23e475a39c7bf9fe53cf26aa1d581e447d3df277951201a0f63d0ea7c27de1b51e472ab3668ca5884eed5561140db1e46d8442afa25343d968699df67b6ae7f17786c674d60579093988bfdcce853e48e1ce54a5930544fc6548daf3b7a8478014648e7b5625b87c68404b9a71fc3bb013c77d4ba91f75bffecabb32d0a9add7a13190718cf61e7e9903b3317e97df05b64f1e85ef0a164dc986b44ef94e250faed57c94dfca9991fb0dc3e044c9d8d13080955dbc6a988406a428e64398aef8a9977a0668edb140b38cd38e172aa192ffa82b0b45d3aa9edd568019b948aa10df147b1b60ab95bf9053e83d9881ae88ec0569fb7fb3cddb167025bf545083de9ad03a4dd7f67108ea4dab51ed24ab192087fa5816f057837e1c0c3fed094ccd52ca892e097e11e1ba9d2e827555d91d3fb1c19ef625ce6761c66a19eac07a3ee51445e5cd130cad23f5bfd247c443106d8b8f26acfa36d80 +result: pass +shared_secret: 5f83d8b07d320694b387d4ac6084fea240a41f02e66a12a7280e5078ae0ce208 + +# Official test vector 38, seed: "6c3aff39f5d097096d882f24717718c8a702382dc4aaffd7629763fda73c163cf084807bbb0c9f600cd31a7135f48aec" +private_key: 68e429be33972613c71269a6d8c28f37780f659bb7329478251ba1f0a71e5292986ef1054d57a4a1a98eea60bdd2244908972f138761469962af11078f880e900543195101e2238cc4065ee72a33cab77529c891209116774a34aa531093b15a133b3bbf24ca44787294578312a9648d6b427cc630be8420ac73ad795175563b471694658721ce97a74719587f6dba69307600ecb86c16d14428d264080b7083145c1ccb143933b902d463ab1264c53360c5fc04cad928d3f91efd67795ee2a9273a41353529cb3b6d3f61b2d4759662f1b0aab989b1d42c40e05f53e7251d56879e57c40dbaaeeee626f87b4f4efa07a7666049c5c6af4446260a1c2641432de89eb582ba6f8c84640723b7a6449f268a7e8b93af9b8a98552bf2aa940e277859824c22fb0ce8d1b3d118813d1c9749a345c990818091a21ebb2027a1bcb7434097b83fba702eeab0a8a8c3719df9821ce2c0c6a392ce5a48b56a73801accf9bc0f55c96ad21c3ad7793dd62ac413f9cb25a75065e68edc63508b13b90b6bcdcc127816d5c1e3b246b1db27e50528ebf6b946b93962469de91a70ec36c848c8bafa2b13199c146e224552e619295703ed8c441a41188a004073392c59e88b76e847a11b527c6479daf28548a5540ddc811d7727e203b51699a0dc85820aa90e7a96378d99148553726d251f73ab290b206452fb15314a7005a50fef5b6a3c69b5c91125a161699d0956bca47394567eb0cc4145fca15b2ca32a751946841829531adb91b9efd60bb2018a13d736e67aa86c12517b134cbf51a6831a80188b54b051063561b1419c4990b1aaeb52280a2ca421a84b1f1827e544c27b88c1db7593fbf3a9146633dd41a2cd26bfeab57c7b01c3a7b07b0ea196db4c21259baddd81981d9a917b4a7bbbd45fd2773539817b77c09e79797bf301077bda0e6de9829b01c6beba809130a1a9724e3ce39931b58c07344ec731a11402470828be43b33601667e46c66a59979b8b1a15d9739a7da6aa19ba6def480d0e2b2f859b6482d128ee6262a929cec408974af41b9e0c9c6a9b0c32abbae27a36dc373199f65a18d4b3e4153086f003c127c7926c9dc3510ba0f99280a5360f29447c9204e7472e10486c3c465dfe4855b1d8b8d557b99232531c0b43426521c8034518d32bd5981c149883e8b95ab150c051793384c9662aa795c93b25dd3957fd3382aa117a9d6b333035650918cc924732737aaff69472b4f699a99288c5a24946138fb955385a8a75f2088c143057275c3e7c97615c7721e0a049b544864c358aa8c0a30ba788c2e71de8261567084040f83f23e333a4d74c55d52acd20bd7c56142c2152407864f62c3d482622d87394e246110e133315d151dcbab02909cd0a10754681af44c2445331912a4031dd800e07e4aa3b37aaaa827738048a5afbae9677452cab2deca0205ca5b3e6f577892555ed3872bc845f97a86788a9577996810f0277cee3235574a6ec91cbd49cca68c870e161a7c9cc4b4c2252bb4c2f7cdc0863959061d73efd366a65c140a014cee9042734a9b79d67bf7ab6ceaf5a2c1feb9b283502f940cb7e49c199cc7a4f885bf4b041cf418eebacabb41067042b3c9c42a72655947ed2233a778fba0338ba0b6ff8c58858e48281799f94acc6694148b07cb1a5f8ae6de647251758a2a72f19a34c6176614dfb6294646c5b95c59d857320cb2233b9aede91a6837820ef74376ba533d06487939348cf70681053078466b900206af71a76d18a4e5f063317ecbb394ccc7b5ace6151b1fa662abe652186b92b3f785e828c2b1ad967feab658439c73ce93adc47382c63544fe5cea89a5c2602aced184cb45b18fd3108bdf70152421571b9a432d299eda808f8e0794e482bf468cb7b9b349932492f43c57e216281e1506d9a1679a54e4fb1986e284e6ca5466bdc8b3386b47e5103c0c70d796b4d42e17e279a9a31e434d2625efeb4abac6bcd3014bc1ffa5b6424674710059a74b6b4e4b32bb8b183c76d00a109909cc799430a2ce6abee67504f1a65f2d4c5a305639b0a1e31776797734dd535bf20545e37b33624865890114c01c874c7f78bd6d88ed73356ebe5b14db386cf677fb9315f8fd9a32039651a28338a0834696613502ca86f4830dd34b806a467fc2a726a515110c076dcb486eafac9040ac0690b79f5278022f59bfc316494a782d92310489c9f93e61585b3bd292165f651a7017a994b2512f0a5bdc8e77e9bab7e5cccaa7bbc779d445e5f16b871989974d92d2c268bce10764c0146a683ae56c47c4644057ce8b4739031879bcc287b194cb36fab6916ff563248d04851c74a7fe87f4fea546a565eefd507457882cf288ed294783179577ee898bed18c97660bdb726867a2c9581cc13bdb263dbb414d695990ccb897fa31984734e3178e081856627b0a4bbc736a235b3e392b3996441198c41bf8cef5ec64d2f5c4b628490736cbbc076d8ebab4cd1ab4936935fa3aa40d941e85cb08774520bde23f24739400bd45b1b056d8a09ebb49a3e4b7209037c94a47084604697185bac8772122d1bcf22888f165546bb699b23b2262035135120cf677aa7f767ca049b869137999884e360518358852cbbca3f90643764cb30fa16cc009766c43b89e599203d6344b1081e97c863190ab57d42812d603ab56068283cd30e92e3f7a8989715479cc3735f3cb1ed9120e8b8c720ba35ab1178b426c413c5e89eb5483bb0fbed13a2fd0783ce4bdb1aca87d80000dd48caacb57c74b802c6b133817ab099c84f1c22383e57a759ac6eab76df67876e3591f32595a56a027f2087b63db7dc138cd820a84b09411da2284ac78445850ba820c31b1ca97f3e680e24201fe67154b935a36292b18857007953a848c49d0236406e7a320243fee64ac24b02952d0a02a57ac4fba19ce373e3382cff61160913ca55a091696d782f4134db83958ded48e681546ecf2be93c09a9bea7b3ff420c84a9107f4a75a2a1c40ba0f9e6060e936218f0c0904bb29add2305cd59e29d2b10fe667f9ea49cfd149d1d8bd62e549e08baa1ccc63b8cbc734a24017e4a099bc5a939828ffc8cac5fb5d388ac8613216f21942675cb714e32cfe666357413773ab5f6a2c405179995ef42635cc7db7238dd7c410ba529e7d7391556c5f604c38fa079a70fbc2e8b393306832fe2a8bca891d880209b9719eb4d2732581408a3896735143462a45f5e4267084bda97a9a5324a2e23a714c1322f4368be3ea5219c10f56cb560a78786c2a51db18c79f151f3743a7de67c43a35c63d1b70e17aaf4e4c48e300a73f9c07bfa776ee8797f803ca148aba782a2fab110a7c4440c5791354b25c1107106be979b2077d422a6d8edbc04225ac63c3705394c9fd5389c11855057572fb303ffa365cc2854a3bf620ce5203b21bcf7ad9c675427ca1294c7b001e37a02be18473d1b13d9c52b9d59bc267ecb1fdf3bb96c2b374e72e4bc0898441c47adac60c1955bd1a5096f371bfc709ef624078139feb979c9ef48bc0bb9100d0a97198b466bc5821978c87da85c4e4164ba61a010b5fd99435dd18129a6b379c3232f75c8789d486ee3b6c84e052b55066e81c409c182d4e84926a42abac49846fd7b6f7c305e234130026540a6571d2c241c2700ed4e073d0262bf196164c71a62b904938cab91cf12fc8d527a091c20a86b163aacaf2f25d1814bf2d435dc7881b0f0219bcf40f90f894e74392fea065fd1b69f2e959cd0a5850b002cfaa8e44d0867a16ba5b173711d77f355a71bdf7674299a91cc05f2c772a5280177f2551b6f4a986f3bf584a899e755464166c3220130e694616f76cc3722c999536b6d145dfa5a27aa591ee994332893fa87acc2df67113f8a9c438abfa667022b92842c73b15047d6db08e02930a6348a71472a5e04bcf856058e785c10d049af83736b2f78f8fa0b16b0b7e897cb695ec20d37c35190a079a57cb41ba5a0f010f4cb94b585466c9a802f0855946361237a0840d43487bf65bd9f000f2480afcfc03b3dbba6ff053aae4981fc619d82818251c0d00ddb269042902b4c28fe6578709374f2461b0fc1a00441b78582db2a76dee8729be071ea3c9957f5a3e75934628081eb8339ca5cb5ae83677d4c31d7b12b0463b57bf7aae0af3901a9795085b8aed0564d3755588a0829615785f322add179edf08204021b86bb3cf8f3528ad652437ba8b0c6901cdbb748ee8a2d854644cb694668b9ce322992dc43f2d8a7ee655be3b257a0974ad0649104b6b4e9a16bb8cb79a42968ceb1cbbbdfc6c3921ae35f6b22ac3c2f858184475b4f2a12db3158b3bbf2d64f07ee186fc57de21c26bfcf6b645f83cbd47cef72136aeb64469835f3a1f1d9511e257abfead77d365076a5c423ebf1554cecc7b29c0a61b6762d7033947ae42ca53522a65fbafe18d3bc3e0cb66164e9a094fe4b44d8977ed +ciphertext: 80efccbe9e2d761ddac476b72e873a252a02782ae13d9b8f863e943ec06f26f8c080b9d34ffc22a8ef2cee0a4797d781da660eb80d6e5160d3d88f0ac65c68094abf9f9199d2f92c9fef5f8abe17e80237943a66eb26406d46ff8768233b9e8f059c61c8638ad84add34752ddb6fb9e85f784c8e33d2537712fd29592894cb1ceb1dc6f2aa9d26fff99aec7bf00763dc03ba44065848d60a8ee2536fd1761f209728bb62c2935bc1d28f4ec860df4f3f16605b31a2105e2819fc2cf0066938e3d54058587dfd4acc7d716a320c31ccdea328454a0e8b86e56da5f7da253955cc9558c270577ced143eba13ece0d597ebe3e0a04e48c704bff12ae19e7befe7d7fcc20ec3ad5736206c836afdba38ac4aab46f28d65edfda9599e69e1944d0ba65ec1807719cceae163c84bd3a5cfa1dfd2001da4c7ce8edac1b9c9ce15a22cd7cbd63c56eb27ea4c06907a896574f15fa98a1b65122fa94b720530b04509aad646b84e2620c8f511d9c8d2695c8aae14964a555d7e4b276d4d55667cf709ccba138b2dae4f6d796d8b146a920263b9664a99a9e88639030cc01602d0984c72a52b0ec87762480277dab8c3db42a19e9d8e183f50b777f7b2e2eb44fe34c8b3689edecfb3b94e7e7655487ba73e169c7066b81c18ddbae4bb949c329e299d37bdec28655ff7e1fab642c961e21e88442ea00648bf32b9330c31ae883bd5a359620f05f00d31b5f0585d6883d3f65e6644dffcf86342f9dc8a7ae2641fa3f7ea8bb72c1d9229bacc2a5730d77b04b2a6f54b0f935f2762dceb8ef229ccefa06fd885b022181fe5b29e90befc48b044d4636e649500b94741b3a4f7a4098514839015420dcd3aee122dc29b2216bf03a380e7dab2c56acc8c46bdd8d9f1b11a3df65933de2a419bb67ea3fb75cf6e56020a8075f15a58bb4da4bcc02182170c027e15402a2d5ab76b41d4a1b7ee34f7145fa1fd85f800d9635066675d4f91e5ae4bfae91dc172b19e36e17831c062b2fc0437bb14c3d1035f59762dde5df04cda8f16ab5cdb981dac9542be07a330836958c9c03795b08aff25c525f0f585abd0e9068c68aa205c1ba880ceacc9c8074711180bc790aa51fda9a7897a74539f79381ac7a1b0044a482db549ed4cb0328cc51e944fecdc1b956c5b63e177aadf3f857057b1e0d63117343dfb5c1fefc3934f64cf5af9a10bb8ae15b1c3266c49e05bce2f96d87be534bebdecd0b16dc534f95697fd4d6812bd098ef3e89fdade0ff4b1a93d77092d0d7324037c27f402dd0c434e55d8a61db3c2eaf103b6eaa851028b4191cb88e32afe42af49c6e878da887e7bb57ad417b1e1c190c434d79c3ca319d58bc6c10e9a16ff3bdf52b025023788e755e35806f52f7f6feb72c4b687aa72a1f2bdca1eaef6b496d68b361e56d552a0c8c5f8c2affc345a2f94ea62728eddcd207d5c3291eb455f0b67bb1fa96fa296de8e4f0053e47e2bccb90852dba79c7516354c7feb9b39e0eeabf64382cb4571cde7a4913e254b46e912350e2d4d7a01e825571b2804124943b025acc211224b06def37c8c537823dc24d26dcd28502dcc56559e08a160fcb4f03bd10fff9fa86e6bdd0327590b603b2064302e374abde67593c205d5f73e03aead35a9041442f7f0a2e1b534be07d0209c0f432939688f4e1fe0fffdaf2395a457ebdd59b7a5f05d79139eec13585607e6ed69a1ffec0f6d12b28d0988b8b09056c7ed48c8e234962a52948842ce7d53a6cf39eecfc533d40eaccc868d0699aff4b216a8f43b94a4b84534608e3f3a97ec7e84bf9dcd5a02dd7fe47d93134abcf78184ec182c63837cb16222282a499f9ace26d59d5de962e8b879b255540291017d8c3adde725727e7276959559d478d6edd243236f74ff49f8eeec7972af6dbb73839238068ac0a6c1937d63c1c8358161debba36f18e402e4045d6c5ebcc55d37fd2eb5e20ff13c2dd231237a049bf1cc6bac16f0444943ebfdbd139b521d0bec71d38ac891763b8ac87b093d9b540dcc326381aea049ef1ec5ec701df7c5e733c6f58291da9a53a611f7ce6acfb99d45f7374f5f536b3b0b9c80756c79944ab262f9c6536a80f51545d46277ecf7fa0b569721bb207b4ce8ca4f25c49a04dbfee807bff9c4008f5e017902294828e777131fd89b032e79648c08fd457010415e997c114cbfac1a6d496570b5cca27fbe192c +result: pass +shared_secret: 070da4db5d59e004607fef8f49379692999d0d4cb63dab350cf8c546fd954ee1 + +# Official test vector 39, seed: "cf520b92a2e3677afd003ec1ec6ef136a709d78f828c9c0dd4946efbd451c5faabfc83ca66f9d3d17ee4220553b7a69f" +private_key: 4ee12caa4baa2439ab1e4ca28bbb4f3a85c606a636cdc0553d821ec2aab20d0394a0e3ac09c96cce60cbfd9a1351b3cceafb11ca7c87bc42a1a191506ba9b3b617a6aa7a705c26b7820068d930bfcc96c3728bb277b157cba1c1f8f17c415a1bc9e9ae5f4771eb38cfb7231108212167d6074ea1cf2d5b4c04179740c31ba48750e206c8c584355fa9c57d6cc84d1c88bb2a43fda99cfcb14da5e285b7ecade1761d4c711b7a83b738d7060bd820e03529c608937b4734f8237ff746b47b3460a40c9ffbb18b6b30437c4b55df55544f74bf3fc5758dd2b4320974698aadb0431f5670580ed39c1e1645101b635a49998157221ae3087229bb0f9ca04d2766cf308500eccf34c40730888fd9c1ae671415892a8044d780d27b3f3ba3751cb9c9bbe61174614d2f15339d0a066eb738a0b43b8e0ab0e422b64f50c125769bd812b1de3672a1976402909d353042d8c4a535a1acee33245254b575e71c5713a3dd919a8a9446b9fcc80368be2f67669bab466b91486a94a940e007a761461401d0512788aa06111c8c3da1b136d3074598cc7a9d9aaf0a390a6468aab1fb56a71414139840dc7582b439aa78b9194cfc00b0c357e8840fc583380942b26174838d558c6c441f1e634ac590bf9c1344b8fa95aba16c6c130d8137706c424092ca5cc2bab74340aa6ed81535fc6a0ab7b59cf276f55583759b0b009b4d6e117410212dae343eaac5946c3b379b7169cd5b5a4e838a2b0a7810a05c2ea6bf10667b4cd7a2e71b321d2395fa48a02fa08497fb68c771b1eae67d5c11224eb19ab241770fab2fc1800074e697d27b0ad3035cdb09772b222945a9bd9b2cc20d4b488df40e80776eabb475cddaa0efd3c05f1c792ee9c946e717984686bd43660eb334bf775cc5470462d03cde3c9830ac8a66879ea04aba173b0858425774fa9306590a8c273cdcf347202267b44c3c52063693abbafdf65f4a2949c18b0bbcd02812da0eb7f6a753b0893c4771a13986c408a2b2f3cb2144b1b7f7b6799177e0a258415cc91d449009c17a265803a038a21ef2911778242b043e19f986ab2754c33c31c8100a15f8609fc05804730d0b2212768901d7e4afd4451950cacc42e891ae845a53bc396ed0b6c1423584c6b575a535e949909ca7cd95d05e743c16c25b57fc0a973e7b026197c6eec688a5c19596bcb9879b44d2b1358f35b5a31bc3d8e38f003bbcf82a540993c73f30123c66bd31f04964235477d5323f69c6a99399055c8347cbb443c9ac5ffa477e05229457111dd212928b337dd6a98f59a303097536c10d7064177e06830497a644ac404226b688d354237742fdc6639a979625558ba4509cac106121d847932311e4c22340b056f0ab54a4a1b5bc186c864397d7984defebc974b25b211849ad36a93ea21d5eb9926f7c6b96233f11822bfdd822fa211ac570196bd1aca785463c56a7fbb602aaa3c8dee8bfee7c18fec5ad0f844ebe66b17d71337f71bc7335a86002ce28e65e6a5101c7871e9f651f04c1c6ec45c47bb97b1e4253e4110fb0339fdb84a7ca40a6f7ac81fb43681ed56c1f51ab7812cbbbc3a512ba340c566a9d60cd1ac90d568033d0e1166d70c9e10583e61282794b8247f4c2b248a71d379302b82e9d275f07bac252ac4d09633be60002a2a7cc23f1b1448c1e1ae77fe9cb8677cc3a2e8a1f6f3bb786a8b3b585946dd909ae296dc6648f1695b66d51c056e741c4468a3db6acc1c340228ab88d83cb168982008d9fb07b177278c893472437a12f3b2099c80322610c96c9754cdb513626297dd9dc5c8b64babbb2cd2b904a52d67a1d00c92462a291d6b509fa66de596516774edccc48ce2c145e625158381814709f23d3427bb56b465531453185ed500341a317f97c48373a0778293bf989529edc39ca931f23b341bbe18bb071c61e488e45e100091ab58f18a7f33335d11019a973899f173fef0b43454a2d091274c4601029176900d03d068164b2f1279094c16d38b32c2973958c0cf5362d34983ab213a4cc235d3ea428bf289d08428e02c3b23dbbb89d35c7c571a1cf018dbd6b377dbb2f09fbb30c5c0244c8782ac46e98c4cf614c42f48b49cfd8114cca11e1455a419c2bede2684ed140aef81bfff6c2b32911013432fdf751e5855320202481d55ab1318e2c501e7d462cea98864e291c2c727e6ef2349332680fb06b09767a2ca72cfc078163c140dc7151d869a9c785ac62c6ade5f7519e070a08269938c7796b54b482f027a0c63ac24a6a00f7a0e7c65843e1c1fd01bd11d24ecf3c8b90cb803626044d03a39fcca7e918ae418512631898f417c9c9618055340a05f67b6f1cb7cc44117af09922cc07e9522285d16c42a7b2f833b51e72ce1c28a3ff37ab697cbd90d96b3e460c56c1734f1b11280ac33f170b3447c07f99a68f9a6f1dac6083368555782f800bc7f4409abf76b0eccb6da8f0825cc0c696cb9119340f663317913a641ff369657207194b65fa6b1dbbba94d22b512b56877120a6edc10dafcb2f727349e5831a3dc8a539c0a55a517e65982eba97930020608094b93e481fca819058537bb2c051cb2c3f0e5a97e8365a14491fbbc03f603977273a035855c414812ece238d254ba7334cc5bce7256716077766cc21c617a9c378fac1786c1cadecd13948591198682cbcf0cb098c504dc4b16a8269d13a701731b29a71432205660005919721c994011ca3c0ba8c3178a6d80b2abcc9f6e6b7880811894cc6e62c0134011aafa69568a1b95bb43c815c1405b4351a7290b856c50e284eca0cc384a4551f455b503488313a341aa25f80aa02c97b9d3267492c31652b7654621a59f1aa64ae4410a1099ed7f14aeb10485f794e61157c1563ca5515684db66eb99b76836a2441139a0906b35553c9e3e317f5e2c08487697574464a9936aaba528fe2b0c0c6b058b791d94aac3bac180b0609ab36b27579864c5bc6d8288292387dc4931fc889a45fc8bad636ae2bd493a5ab401311084fb57c6fd88c2f0c504d5c463738ba7c5a97237c1681d8aad66307ef648748198f6ea0c8fd6ba7ec424052c8a9b070c571b136cfa86f199542b12cb2a77c6973494bd41a2f0b55cb0e4122d0958026b7c54bc42eddc040cea8470f738f9c9916c158a9ca6457d8d9a0649337a3ec7347475eea8c34e8127636b3897c547c0479a1e22bb2f7606afd97cabee179467880dc02c7b6f892ff3a7a29844476fa9843943d68ba4df2db6b8368394b62cfcd257beff5b8b54150407c5529349769824af105adfabcc53f936a8a492825d6a9b1108f1ea258c9dca2d739a600f68616b2094ad29207184607985e3bb784d7977c20dc0585233131f93fdfdc9ee151c6937c7bc7fa4af43b3b1dc4774ce6273ab04736308e89e21eacfb81845678a0c220309a3c9fe3104f61680f334227670f95f2b84c137a964a0a3a57525a4b99b231a8f22830d5bc588c0c705189b2e8a19c4362cb50186b99b5a783031300a26300280f279987ec058425817327b481cbfc789f659530d9c5d9c8432959adf71741c1f9353d9a84836a5a5487392d19b5073a72869ba4e454c14ea5a93751322b8592e8566236a86c6619648be1782cd03749d9b9604209ec66804c64913a143887212e7acb54d5d995d0cb17e3e27c6dac70904235f5c9bb29d908d8098b11739b16706541f31b53e3a384e594a7a640629543943a1262558530c193d18079426708117197a90b1c45e8b394125ac46238d2e22fb8750d1c190824828280565093999608f4113acc18370509201056d589041d748b2fc71da15490882805d3d3c0fa0a837400b73d25688c698cc8d78d144a80aba8372bf7c349b9c395bbb8adfb885906402eab1ea58b622ff45c4dc14c9d11708659596552b18a3c0a1af2cd7b558f15f461f0501c409a120b4468f2c09282ab7b25f9b028746fbc9ab77af4262691a64dc43d59139c21eac58e58a491e26e10974e6cbbb82af385c4f77e7312ccb5194902257d3c4a4fa1a9035a670b5db47ee67c1b07747b889a6c481490462829b26184be3c9b0d7a0f9f2bcb10c8176f03464772479e9b84dd28ce94199d31845dff0614d02841f4fc92f9221cff071551e82dc829c9cf991e42265f94f7b4dbe7b791c244e37c3ca4192f70c32cbe9366db59a9dd8582d6e69d849151cb7c6ab82ab8e7854c7b4c15b1557443cc2b1284b7fc7b16e415007427b5a9909b99f21c47956c45e14022374440b70415b896659178d3c98bc4f3bbe904a470e4838849bcccc2ceda8b9bb1e2af29169d5919145b3229fb8c9ee705cff4d91fb9729c6cb52725321f208f2d0b39ed53edaba2c350ecba69a4ee1f3159930f65c8baac80b2e03649c5c2f1142a51eafdc3edbdcb3c5150c608d828b7e1b9c1ace00f9a548fce01c8e376fdb140ee343106c093af7cb149b316ba79446ceb4e5e0cedb9b164f9 +ciphertext: 4583baab569c07628c4931763b142daa34f7bade4707b002a966dae6982ec9efdbb2ddf1b82f2f9fed20289dc4851dd6a6e6540f63ead0986171ff9aa92ac558be96585eb1b3ecac469f5878a9b271f2388fc213578eb7639d018850148ed9af6ac2ef136e48a148d0f8b018d00f2d229dd4b89587782e4d3308daa12b39fba3a8b82de3e5ce1e381fa8770067ef16551b352893e21098830c2c973c04bc24dfbaef894d3c01f4410f7c8dbd7321a4165f9040a2fed09497db369b406a159db7a642fc840547804dc77050fbefc8167bc17bef43022eb0ac7badd682775a8f6dade61f443ccdd1e649247f17abcf2453ebe21c4b3af4eff0996f7b5e6024c809a385503a189b984b021e650ac2d182b947d6f248104b8592ef66052d80c8d1bfb612ae1d58e79d17df364c23841c0a969e9139068fe1b3a51cb992c255c21008a08f21f661be10c4f5199a7bc1dbed99d253c34a98504d85954ba733217545807a7e85f2d65dc77a054365a275ed9d4c408c0d10d9651c99bfd789f00a29b95c4a91db3c479a7a759ab00eae24ee49712984a28888ff16534b59c33e160fbd8980ccac1fb6a4c9f20761d9c7030974ddf02346869d9a95631a9bd3c87c3973693a5e6c249278f3b85b7e8011285e6757b908a8842749e93d8568e8cc570dead4f2d86ae4fdef2852f156dc03204e32c1c6946b9b7aee25a96ad20e122c52e6fdea2e1e37aa92d8f50b62ccf4cb3f44001a1a7ce112bad5b9dd005235fdace0741ff622168204981514aa2643e3c2c4c03601e3bdcafa2ba76bd326a86fc8334d2a3192b4033316b9f02a7e9fab545fc5580680363779137be9c49329d1264279d6587f1efc8a1591021b13af1627c172c1279ec61b23d51191efb898d8a9214df1cf7f2b1737a0e97aa45e813549f42e828f90c1e914093066a0e94da503932f931ed491bc43f4a8a689f89ce5e819f0322464954eb154046d3f6ff3423d2a1dd928a1eea9b496e64c928d18f57953b009c74c9f3b83ed0b6b9fa99ccfbe79c47fde9b54e2df8e819488cc5534e8c61dd6127615f3442384a6770ec9268a9bff0db2920ffb63c8b0d375781a48d4a11d08854f14bae1d25902e54900568a46e3916290eb3e0d7b47ec6669c93ea516fb93e7228e3723630247cc061404bf2a8209dee902ed514efa1fee05dda7daa39667c3b06b9ad0522be960264d4c06efd899333d61e68964c3a1035d95f32a4135da95c720958016b5d17b6da0931e95921aaf48ddaf762069230dba7f8d570cf42a78e0bc82327258b71f073071b8cfd69b24f3de704173fc3157c05389bffe6105cf0e81602600e18a0e3be22e052b975661db56f3c500c1dd2a99258b203ee2ae7a8d5b1b91fbd5c5d7c9d6b07f64d860c8721dc51adaf24fa2e99ef8a80a5d41c850a255be2b686920a64a69914071be73a460e806eebadbdc5ec665a4f26065dbaf0b9721206f761376f5709bd4cb34af09208970bc1825e460419e223c960cd7f7fa20a582ef9ab90b946a3017b375763265f8118056c7cb929f1789fab3b10010267515dbd9e3b0e0ee4082afb9f780b740272037cf0b83df078d4827ecea5dede4352eab5f94edce1e88564311e91d2cb1893d4b5ecfe47415025fee66241ec51f0896872b298231a222409a9abfb447779c180898209df96a4639284bac56d8b94f3ad67996eb877f01cca0faf9be45d540e2b350c7ab293cc3d0c49711e2b7d7856f0a1e297e21fa89a474cf96e2a1028007f2d472f9ebb4bfbd3b3dafe8ddb17c574c09fb4d741b4480f2e525c75a712d6127af50d95ccb4622d344bd9c2163b9014be4a050cb6ad7fa065ff2464ef4575fd208f910445cb2e0771aa1c97873ddb95a9f0b33c9936b4134f06adb22cd00c3ce148ee21868d30e890b44a6c4cd1dc02d15a4e6d28e31cddc125cb3fcaea52a184aa041708c4bab098e387f6b4862c7569ffeafd128472096841596a6ddebd47d4f92719bde6e6d5651943b68c820b6bf4ec1394a259651d2ad460ff28f2a2b9063c686f3df62c6562e9f28ea02568058e27ea9f2519e7485ac9c4028be344ef015449ae79874d22b02d94c9d6fc5c57cd49e548edfc703fee0a68bf7039d8ce4d3b179c0df80270ba9efe440fdc1a31120aaa88992dce10110e6a7a845929b86c4aeae473c72ce6abffcdac33f104a817f86a8d470f0b8aee3 +result: pass +shared_secret: 16d4d64c78114b5fecbb99dfeb59623cc33725e9fde5fbfe1f805c05ea7c6c4c + +# Official test vector 40, seed: "197e5d562de7e01bed4fc597db28dc6efdf0179f3a5bda5f94caa39d67bae730540534d59a7a06c8448f628da8b7859f" +private_key: 04c78eb9c2cafcf78072b8508905b42c5698b3c86d8f20bcdc31a3e0801a084b35913203a642cf671c434ee39477e83d7314bc81a5b0a5d010031a26dc55bde54c5194525091314212063b7e852476364aa64155e6e9a52bda41c17939e553c26378175fe3c4cff13e3f20543a275d6263276d2262d1a9596b52996c4982817a4fded3924416b65e9bcaa45c6a6956c3724c0ea4171757393b5af903de5694e8962f3a122104092924f25e1590419fe11cdee60bb33b5bde000f7d621811819c77e4584a89659caa85e7197588498ee8c8a8397c1157c29a7c8b696653a941ec2579c1ca7368bc0be8bf4442222390bcbb871aec382de3c5011368cd420abd03fa8bcc35a99aa27a1412515710b3f5118eabcc9055a09b350644a490bf83dcac4c2035c81895ad53545d5b59bfe5455ab9c7caccb4418b5830838e0403a56619af355ab2448a69f2b848ffb42a8f5407fccb9c5164b7f306b109533dd8c690a5a9332f058a1978915244645eb127b6ab92a732bfa7f0b528aba0bcaab51d52a54f57cf75c54ce462bf7ab8414c9974b58272357bc204d13d198058cbe21781e7a83507a7e1220195ec34cc84125d18cb7610b3996035e755421b969ab6cca1b79a8315b791d96207b6920af2e26fe66ca583a943aa3914a930943a723447c1639c22a937d91240839824547eefb69e8c5868f0fa6df79570dc01041d763b13c08084b8cf0213a5eeabb0d7507a0f8837e9138cd99349d4b2acd1f72749b804eec23f88ea19b00b5fc06bb665886c105786b45610e9a431ff8a48da00ad35369843096f542396ea143974791c1e830256eb7c291368ba95009e6b4ae821ba1839ceee153adc9b7fd5b6462d4938a9129898b9ce6be51c9ae90b065232616712580a80c6e57d57b1c597b526cec406a948abfa1bba5d1835eae0755270b8ffd5cbdf772c5c68c4a7f66f972c1c49553e206b08ed95067bd615b12b35f3e84f6e7a8fd72180fd904ac46ca901b89a5fdc2da3b472f0a547901755194543e7a399c4363c33cc305345b79ea06889e12e049319a0428142e6a77d4b7223c72d3dd0c8e3c315b2677b19fa8c1ba7107d10b31e719a2c90abc3102ea5e074f9707fcacc8a10e42014c21d7aa74153da8b80779ef71a86c9d10bbafa7432c9072e3cb4def92b9264af134917dd24a687a492f0d351d3e9c61a421d0614baf259752db556c8bb401dfc33d9b0869af44c81210bc25aa2ec07afb5ec862d390c6794a0668580ebd39a23f914feba865a33603d5794e6f4bc210bb82b7a3914c1b5812120aba6a58ef7381bc89e49817f0607980c93458343a12e26666c664832da7552b804ab349e0b56a174716e3ef1270669653ee63a73a09c66e12c7b343a7ac13cb5ac4c740057c947bc3145b037d756bb8bcbf46097dce24c2801c0b364b8e02329f7fa183c1003fc715ae470b50f1561fb3168b421727e66940a717a350a69aad45e506144fd528f07235fcdd0c5b7b659f8c0bf85bc53195c75c447442e533b12e08404db99a7346524964e312c48736c99a651407a3661b3812f83da22f2e455483c44af351ccd50721828313586665e95804f9a4e7d3878cf134a9d815ab4fbaa711517119043a46963101390c20c552d4c5366a92693526ed0893aa097481f8658122c3df8fb21a150c52f9367991bb31955035d286fbdb5040e58556b2a8b7c88011877890f9abbe1292f9bc36cea7463318c5047629ed9a31c39d65f92c18b02e5a7eb16c4aeb68d7a057623f25c0ac68b48aa3a06aa534830a790cb36840c8e1c4b653cda1acdc1a13777aabdf19f55b66488296f407366dbf03d3451b8c55284a9f15f8f16cf51ba93781550ede5bf43ba4470e6bf1d4236c4c78f7710bd0df79f98d55873aab6e8e573d88b19655497812aaea85ca6b95ac5e0e908d2150d68c110e24a48f0e7a581eb4fda5b7c3d97a68e26c9f709126089753d2c072e88ab97796600b2732104acf744471bc562bfe4a995e88c36a80c5479c0f1204fbc6b723a1b1d3f817341853a02d75c1497b18e242e9e037aebbabf28bbb5c4b72f22eb02734bbf5a897e77f84d9e4209d3fa77eed12bda34378a541e5e5c3258399386c49be1a05b6c509724c68d42b5a9be11bc08d154c9e07bfca513256a52d4f7656b2b7819120a7cb68a80b91f2783979e1a329574272a3b154b52843bf80f88d947c79a58ae555e819674df71b13ea48741d103d345a8d4786eb43012fddb0b01c3baa6a0cf128b099972449ecb3de50020b025c486b4b5b115c78d927fe5e06bf8e29068d0b3d963c3b46cb9d1ba3256fba01f2185cb566556151ed2e1c993469190b75fa75259a5b1096d5a1647448013c21eca67a3aba096a4dc77f35c2447e81114f732148663a9439b1304b148b813f12c61654688d35318b8c0a8c33738a2f1bd2a1b6e8ea93eec771ec8c0094d4c6a45ba61579c72c2a41ffd468a6c679fc3d6b15d5a549b1614bc8874304bb6f01b775511ce5bcc7c055441ac72c34ca164f461990a57baaa98840439371c26134500377b39ad6d222feb0b67dff197c550541b63173e2b1b7031b30cc3772e97734ad3c5b6243b3269c48fe055a82c9f4d1c166c294b8077269304cecbc404ebf8bd82c041c911b09fd7c2cee33fee1bb754878d8143cc93b81c7e99323b5210e7a64c7a3b8d96c1594ff3ba50132484e663797246dc3238a1eb743c4a33c51c6587a224bec9bebcf5ceaf175dd37c3591ac7d82512e9ee7c4acba2cf5bb26d3a2188be321114a7724c797a2bb26cbe43b3fa03a8bc16dd5a49a68544e9feb51786c46794c9f5239b7584acff68a2f7561bb05e6b5505c249262b509a922e97c40b4736e8fc2af4017acce951cdacb3385f060cc1c55a4f79a60daaecc939036115d2f480f6f0315fed05387e99f9448b6155a51d66a6940519b361233b2b7b34c740f0cb64a7cf0bdc48677292b0d1ed5898ce928e9040308807cfc730be0d8c614d322735c1af2d2199ccca1dd80a96cb60247125cab18ce7a1c5e4f0c4b978581742c8550cc9c84b0632967654b968c01492557ba0630ec0caf04a443d9b2f616a9cb4ca13da38fd9d611a59bc697c20e8eaa0d2b96aa2db111bba3a05fb463bdf7a777cb91b1086adce17ded04be8b92254ec5442a6852134b5fde9b060fda258c18740b79970dc981cdb883cbe3297fa33ea988b07f9a581bd086d53507ce07536012a211c6b4de17b73a08153c3514daf12185416a81c61fe255a3e04b33e3c5a6a0188f6e09855ba504f838cb8417c2f0e97bbf5b937ff53848031274489b5366abeca2caa7636cdbe83f15980c02f207577b5efb947692fb40ae7b36dfa83b728478f0541511fa58aeb121c14056451654d0dc4421695864db64bc271a79ac0beff724b6bb2290cb64087b72297a6c3881765cd909aafbae72c9448b232093694ce522c72d2475f281ab1b633432175e3f78715de1082df66f74a351903b115d74489a32bb7a873aacf195f8f043922272cfec2798f52f65f4638302c62648199e7979f4740b30d38f7d794cad179ac960c838db4ad7038ab84955960b4822324c5d01c5985ac8f47138bab522db895af2f9a983494f360b061bc5120f385166a5ae9ab844c278008e47b655570430451cb606c24840b7a0e51268cba81998697a5653e33bbe47d43edc3249c32964e87bc8ccdb6d603c0f7387306b043fdb343e8500aaf0104683dc9488b0ad3d04a1c2657f11a99d46b040d0950d0937a4927012f4a78ee2405eabcac445845d7e88b54a8c57947b7ec0c12bf654059d93ba38ba2e50ca3fee8194053b2c9f10cae8c846710392733123b0eb0ad895216efac4931cc782e886fb2c87bed305cdcc690dabbeede21addf7468e4873919865b905b3149a4d686b7c96fcc014b578e1d36bc3b63449f467b09bc84a92b20b01bf70200e703a0ed084c860f40a336576274c7e5475835bcc8ec515050eb8215f397f6312c9b1db1ac1da29ff90a4ed58b8f8623d4b893e1ff94e3e48a0ddc5c221c0b34a798713897bbe16a4c298c5e9f44932b09806e554f76b76fdb8744cb38d00f24f5cccc75dbcb3f81233c454ce3664a807d82c68255c422866cec26ef6e428677b4db8f712abf50c1e11c9f014b9ad59077cf0475f925568300c49c08e4e17cb7a5581ddc17331eb3bd7bc04c933b646224d3386a3140cadd445b632268458f63942455ca1b164c9ccb2ae679ddb12524c34cf823b3626b224e466245cacbbcf57896b7acc6f6b702ce9000371473c622303db63b2744c7138363a832b2973bb3144bba8001999eef108e317890c4b63e857c6de99266629d3267db18fd97baa47b2da64fcd1f651c0028e1e5653a53302082d4e89b76b6b6a939a2f2f5b6b7d5931ff3ed6c50e860576285483bb5fd36e2f944d32c4317bebc1e441470c1372046a790d79d4 +ciphertext: 930ffe1df39f897e44077f527157207b3bde1ab660a8ecf9d3ec21c73b991ce3f65539a874da5cb458bfab7925748164205723e059a080ec253a8cc03257a7f7ae9063d457578a4ae84527f7ec168496478289572405bf84a958214a776650db772fb8b4123abf91d396bbec103d0b5149ebd23148f2d97ff70d7979d9d0561181a0e8d866f8839238ad8281d601c9d855db0917e5f167b99c24033b44c598e0fdb0b1951d18238a2ab8c0281bbba81761ab4bd51ee9ce5e0913c76228985358c09587ce471014e21ac316828cf2e8664adacdf20ce6f7930e3f6dd9033b3b9f1a37d28f8905c21c8e8a826c9a9442ecddd9aaf5ebb47c5641d7de702811649b1aaa75b13ef896b296ce1f2af0a69b746cb8b5043a986b1320c241d42b6d1e61aa55aabc71206308a3735bef5879e9c34ec697233c2a7eedce55b012d9a1139bd3c03c4690f89fe825937a3d70d18fc14c1e067c9782018e62498d609424f34407b74dc3ce04b7e87ac33e877878c8b8ba19cb3da78bfb8457ab0c47a4e307be49fbfe8a12af06cfecf8784e028ffb00d181bb705059eb841d51af8c606cb241cb758c6ed3fe16bcb87a5534b4f805675dc03b47413856b67555af680f43f64b7b5b0094f70ac6555e0b517d0f661a0c9bb1d3e38730d434f7364c83adf7da670f1e2a26441c1c856a722764c0a6941823333f65e82bf77949e104daf3d9cdede1fdeab13e8a6a0142caf8da3c2d66cdb9c8726b8a85339f0f27b56bfb446d52e799de9bd0cb33ec0ef5848982c4c2dd9367e7108b174b8d3b3c3fb7913e55bd05b0d5afd3a035f24ab614698e94d2ea0ef5288a50fc98d521917e4be40aa038fd3eac0e7594f32aea68b4a4b046d89aad216adc9f9a824f0ee62ebba49e2a170694524d97736be4cde034b576590e3e955a946acf4df8c5d3c794132079dba476fea76b734e8224d6534a212efc7ad9af83c91128b8c7ab3861d31b2e6009c7d7bd0d1035b53f518e32d442583981ac415d9037901d222b5d20821c80964400534ab05f5068feef04256d01f30b28c66f5f83191765c54547a8c6242f55a0c3d5097593cda695dc83f646153ab958d8b0db0c4a5564399304b7227b0424863c57e8d8bc954df042050e8de966c2efd63a48ade9eca925137f3bb56b067ccdfdd44ff35a890ca7fdc1a8a86aac65a6fa5898a6f287f73219b43a0474c246d686d3654322e3f21de06ef63ba6bbdc85c168ffbd670f335dd9aef753407584ccf3fb0e96bee0031bcdabe0b2810836197489dbfaa17903afcc729e56012a85d74a2ab94abfbe89671e9c67eedbc91d7688c6e34e1473424e604961976efe2c7f3710016ab858e3bf1ab984910f9f79884c5817cd2052c19daa950f6ed873c9e52c0bc09e7cfac132e864aac204b0059474936eafa4b36a5a017383c6827f5b6b194df7b6bf8d7b420331175e35eb7ed7d028dc956920d4072c2d8a51cd306365e09145bb2c57c56aac1ec5e6147a73de749de38b3e635fae41402df3a0090a39ad95fade379a9fb3ae3cab24c04823f9e36b693ea722e65d53b7f5e6bd0c4a2f3fe760969e0b9f03317132812283f0a4b20b277101b2cf8b37e0e3d2a1c23aac41515348ddf0db3758244ed476cb6af9ec2db9b68ef1dd3196474c92cff905d794cb5f963ea78173263465f1781bcca7430e5e1776de8962db7ada24eb5c31ab574469dd5336c4b3efdea3c218259cf602b571c0cfb83f996fcbb6ae63ed4b7ce80f4813fae069bb8a6e296ad42b6ccb5f19da19db41aef3f10d7dbd23dcef7673ac2cd56216b794372e955c197d4e88734c11166f60d753341b76f866322835d226199e69bae5c40c45dcd20f8fa5f83438d760ac1d6fba0b8560c36a423ddd8980559e65ffda8d78c639eef3a36833f6bc9efa8d7b147156e6fda7cae1b30d98fc4871f4d71e3f52d0996b4ef746653ace05b60957ecaaa99deb58a979fb269e522606982cf00205c6a9217366fcb0a24d366f2861f8dc538255bcc24199626fbb4cfbe74b5163854501d5eccbd95a3aa37bb565d7d4e723732193069e558e72add81bafa75fcca810c57611c181a0619035a2ec73db33711f4a94d2507b1e0a0ea2eadd18d5ac25803ee01b4434eb7a4382455b00c3710f98d85281c1f27cdb212eaf82a865d0b454064b39790efa2d7c93b99a22605c618be3f126eb4408b9 +result: pass +shared_secret: 7822319b0d51be73985bf8e42d01dba870be788b62f9fe8bac94a109cf202111 + +# Official test vector 41, seed: "f170583cb451d8a45d105457c02c01a33a40350616ed8515bd49067142f61efb00f07857e4fff3fe11e7164c648c76ed" +private_key: df9a22dc6c97b1e41ab3d6b79d183b1ed95c6cb32277a25155d380318260933cb26e427fe1d6be2e40bc02ebc9e85a3850b30689acb277096d8d48cf9b3c6b699864fc4b085ba86fd2b92396dc384d03428ceab2173380603b49bf2668af38967b4145a427c04a5541357771256277f7956335da5bbda033fc7b3909321777e2991189a93b730feea54fd6445796726c52752a7d11235c8461c281c9bdc3651dc72b4bc86efcd5cc62a18ece4b6586b2b0be374ce392214cd175117453d393842346abf0a0527e791e484c08b5324bc0e489ce327eb536609c4a646330a3d1168401f9420ada3f4b7104af688bb2326908d023f990ad064b6fcb4ac12903290e93bea142a092c72b9b77b56f27552115057e6a7e92822ea635c1419159c186690e67beac07785e0a585681c67cb73aad460378691b07d653ec0308cd0c21058892d34c437a5bab3bbc83f660b644507a5dc00ad5e01a231a7d426764b9561c974490c85911ed94330ce8ab4b6c0c72d67114096691d1476eb820ae01ac8df78aa1fc10d2b898a8f600cc1878360961ec5018d7f63d79744b41da21bcd086e55a83e1b07aabb47aff6831e9ba51dca086208531d1205e8124b66a40a5c0d7249a29a1a218be0f6091cb8135f552b81c397a000ab923050d167940cef362ba796b9bd7b7f1a197c8704ab51c63f362c368c77dd5563b82336edb912984fb144e46cf21a11c490ca7e8c66cae89772b2b96e8085abeb82aa8e33da4b56693f81592545ddf9176486350e86229b423072d586852328e7bb2065d5a7a8600aec4911d07271d75924d412494cf77b868aa7b192a11a5d66eda19a10ee8c051d456fe7846bc8c52a0923d76e7b4e5b27bb2e2a03f8c214e6636620b54b893a3c9ba9bb7e68546626f601c8591bb33537b71b9302a15b81d6fb7919202c45c0341e3e17b9cf39964a4a48ceb4b7d936fc007c486f40b4265a8cf677ab5e97d1381bf1d8267e4445aade22c4fd536392a6219d3c9855b06de9610f714a5eff2158f4ac31a29b71e0a9db207c2075109c0fa762b70bdacf391399113fd8429c48a6a3edb5d465a45e357332a7a1ffc414325849d9325be55586aa9535f85e20ddd2696a615139c037757514295173dc7c92a5274c1571c0893190c5513c990c5c1fcb67aefac3be248c9111c752c94c180fba60064af53d35ded934d7c72856bbb9703fa43ad125e285626065869c10027e0c374a28732bb238b426905491c25e73907d293b40777782c3ac846675502958bba239597fa230930b515996e5b3054581a94f0f848ce13ae14425aaf593b175635b6db63131c14abdc4be6e984e62bba9f95a9c3d986c71640ffd1a3585c20423068b52662929406945199fa67a87f289cb15b85e6b28099f3477b8166d0d398ba922c22a1319cc168b970c699706eb87891b1504f99f91919da8300a49dd8d292390c41f9735ba65c19fbb83c80e08392f10b31c0c18708a9b1780e253404bcd5753eb75e269b980ec34040a4495c2146ba5a1edf3a8f228bcc10206d2868ac73318a361318be704518a71b0cf65eb91823b643392bbc02b0e0835832adbbe34577119c75171460a891efb51559282700a80e65797e6b367d444c024332a5bbfb2b8c9619e1498adca52e985a9d03b91f356718e15bb11ac4bb133c08bb82c2a9fa0ff8785e92902818d314bff162bcf5393dc0b2739a7271d02606673eec47cec412484f9b1437c688b3f147f1792a463738649a0df8d0480e0a1cdfe3107d48c5ac11c3d7dcc204b439ef3533ddc2098cb22746001ae103c8d99704e7974e27b710a57cbd9e7a4509ec96374b648e6c49d0b0b0b7354e3dcb206e5b47942a29c0c498c7a1c1d401af425a604c729a8fea21a77aab00c67db762b5a32ca0e73aa9f5e2319ae5cc419c964c418f19276bbee6af76aa4fd04278d4c28aebd4ca01b6999a5c8068540a07c2823116a4e56468abc468fb222f32326bf5c02eb313c4b4ab4d92f408a60047d6890de1ec3994e23ec757c138caa5e3cc14b9d60153565af3c20581a24d2684c4d251aea1b36e56042fdc7c922812ae69796cc4912c882c5d46b4a2af9874d91c3982660c2dd6749ebb2484009be255177c9ac65623c65e0a896b1979e9ccc093ea5113fb59d4cc6b2829b04a621a204a4e63a2308d728b28c16652fa939d455181fa1b7b44447d1abc83e46f9d5c4133b104cbc1369812bbf9e83ae1e58f66f8b7c2e56d902cca69dc841f31372b783bc6421723ab0b2bc21cebc7cdac0cc3c55a3a088c0d21a4271264945766740af06ffa65275f9c00b44b1b3e6823d3c29c0a509bcaa2be1486972dc178821c40a203849a3abef402408ceb1e543c3bef193417bbc0c5679c13074063e83eff63af43464b3ce47e4b86953bf21583c2515f7b1025bc0e50454a08313e915882dbf556fe9b18ad27250030723db50e5dfb2380d8b74874c78862a1bc9083e1a8438e546ff9ca64c4a53bd17c1558067206056a0f222c8a4a00b2a92631179b6aac71fc711cb635b008f28cd69b51b5d7aa6839a1aca1a0da854faa39925cf606ae20612fc9c7573c73393a033cc8417d427db29bb6973546a967354fca3c43223a657713e150262e5621053bca46931248386114564cd4c0861d4ca648e789efc4221f7a075dd8b119ab7bb3f467abdc6cd3c808d1586199ea7be6e75c03916da4c012d8e81843f472c8504ff4239d3c0881e0e664f6e253bf2112beb301f19774e6998d4e8b68332346898087f1b7460b664d5d10b1ae199ba661cc460685d56808d6e66f3a78b6f5382ee3eb945482a1419a0a509a8909e8ab02990166c84905c7533159a9dc447f11f649e367486e2191a6c48b61331fb6137051b1410467cc440c8d0f9c9369b8803cfb33da7416dfc47db6726440028b23807c0f68804915a09ab16c47287d4eca5f19b98839030e9606815629b1e153a5cdb954f6e3281749040d91061df4afb67a5f8b19b30abbbe9b4b98b39182c4e48d514c35b515cdfb5bc61553c7ef047b17ac2ab3d10fe7d86a78386a0589072fc58983058a6959915b12a80ec79035c660afb04e9670cba471125e7a16d9fabea6ecbfe1d18904757b0bf6a459f0087dd193be490b4bf87bcaf772547b863eaa703ae18b58926aee14cca8015af2939a49e29d546b968ddb17eb62b9eaf9ce53949e7477c4e9893a40766a4a15cbc392c73b313a0ee3201431bf3d5555dcf73174f3299c2b88dfab4430c08c94183c27d1035c78769b143563a942047035a6c2373a03c0bcfc3973db4f8f25c002c46376d6a6fe103bc641608e98948d86bbe6e89d5405542587aa4821c30ac8756f07c593044570f536b4b07fb14b3236422d01789822aaa020e4acd92126809b2d47f49049875c15472a37b4b033fcc260fca04ab629474c9b82450ae6572d891a58629caac895bf2f52babeb6974be787397243b20a99f37b52ee77934ed2b6157ac3351b9c0f3405369885a54bc33b2c487200ba8a326b9d1674209924d3d50527517978eb040bf85ccc9569a6b3138f072084595825a994078a09bee86ed1e75ee9e759b31c491d9292fd2abbe3cba62661ad9440bbd392cb7d303cfab4bd6b0130af1c3336e2768907aff0633f18f9bba3706434b3bce7c75d6c40753b6bbeaf11c47773cff33b5067890fd5b8548e66c33d25906a066bc421617a909196a3986d362d3b80095e1077a5a087238054f2d89e0fd9a0d570c5ee2aacd3abc16111189aacb4d2e911abb7aa5099bb4a269d760174c324094fe944a4dc55d7708395f6aed8654831f7c3ecd85baf03c44390193634b16e1c91aee33979666edfb18d7713c547a90ff9514ba6469e0a6716ff4c0420427bf00b794775043e162e798871f710c87ff423d5580d873b7f624c96c7d63e23ea02b1c800914a5836fa73d7a748472b0b7af3099eb933f4a440ecd48262d4c9de4c044ee30cc51877352b53b0c1c14153c88b44931df12ee8520cd07117a1266815b74a431652d33074921c1d6dd6c0104aaa3f1a84e2f7cb24461290fb321d706113b172a2c7bdee921dcdc31640f9c749f4b27d024a7488728f605f8ae904571062ce9b36c009937f51722639782d56496fc056b06b8a4a6c3f402649e0c15eafa83e85a40eda43433c44b6d8f037487c9e1b66622c6798c94b9228c7a52bd18360e07ac4b057218469ac09b397477d7f5325ca47b901d0a5d0b6977194a12f71abfbabb3d910a8cbc52ca0dcb4f9f52d36c22b71b8513070c1c6c9a33397c79e4680862196cc1c3baea5bd04c58ab295b5da152a98a6ab3035b2c48478f30cdff392b47dc011e8fc82e0914e5ad3c8eaf0f76a57327c62bc9d4d63a647d85d1d66436cdf42ca198a44b31aa9f9d28b0311fb858cb5ecf74eb770f89d7d99d5c3e0d10d6ef9af054d842375f695abb28e3b8eb495100f04306e92 +ciphertext: b0ea256858a3db2e3e527bc33fd2d678666174c55219aedfab289dac80ffca03e3731f08f3499c6d0ac86b8ca457762ec1a49a8895eaa6a12e64314b43339e7b82b48930f148cb42208d507664f0c5e3d66f7ffa556a7370fdc4a1e07616d0ad0b482f624ec113d2743a4bbf2880bb9235ae5502c994ad277164d0bc7f4779cc1157dfcef551015d97cd77c8fe05c547be971f1aab0f0cb615af80fe622cf6188eec57bc3778ca72858ecc90a05ea89499a5b2a6e40b56b61cddcb49327920682919eee7abd4fd4be3b7e9d53ded77a9e5a543acb6f8abaa0d330fa8916d18a414c0dd4883b7b1aa3b1198e4339247aca326a757277463f2b414d46bdf5df3681763509e1c55ab13918c4b1a78516cc86403ba49950d1065a07f3cb124d059e5fd71d0617ea447360d6dab6524f9db46dedfbf4eda60b25274e14001e5413bfe7b7f0f3f503721715a03dc853fd7203b57c45237257a329d6c2479c63b4772bcae7761eae739dd12dc65d8d3786a8b28411b296633cacbe75395a10b5debbec79ebedb3993ff54ff04bf21cfecd4df1f1d791f5171ece67ab4b9d2a96fc8d233a778c9a597b294ccea9893bd9af82b4e2e10b1c159ee3cfc0f5eb867fb929ae518dba18831905ce0d9d3547ba1807dca5434edd9bce57cc1b83b8e02db852f63294247656269c5787b809a9358f96faaf07ec14731569e4778cb02ad894ca0383daff978a0ec1705bc12509cf33ef87dfb76a897f939cd9cd67685da6be0ee5de1eac34df23b287dd823bc13e1984ae9091ceebdfa0f404b617d1d973ecb8680886cc6bee5bd142b7b1d7dbc611afd3d54d14f8b2af838a862982ed0662b7c35d4566be24bc10d8d730949c372a5878e714f4750d276589e35d490ebc84444bfbe3eb3b9217bbc011703471b2cd518800b4d2de71f406cb304c11c3c33402864f81567b5a8d9ee510c7393726a8144ce5faf17ac318c117a9f8dcc18b44905534cf88894f9fbb9b6075821b306911a4470771bec3a1b3ec97376b4b62fd56a51a6a94cd74c75b731c53029a2cb1f3473ea2991d5d02ea7572b572381bb8d4acdd1844d1a9399cd3cf7b8fe1fd0fd3dbc4e9b15c92ea94f1174cf5ac0401bf24d9b2bc83aa3cb6e83d047e2b977ae3524b4c194b4a45a261743d055f73d39cbd0fb6fc80e65db7e738a42b470a075ed208aaba0fed3cfb695e8f5a1d4443db9a1a8c0084587657b8d557635abf0274a00fb8c9e2ef84efb8115547914aad99d18bc91286fd881dac92dd2a2edf1d5e6362b1f2b35a00bc22199b80ac5ad5ad75537466edae8c45e92f0238dda6a2481e0076a625f1dfc9df3ef76b2024252d612926105301f508c045d287e379391e86a24e49ea23ba017c4b771b7b77ed8a43f0cac5ed918ffcf5067ba2f59e449ac8bdee9cc855cee5fef36fa00bb9cd53aad816626b4f58d8342900ddd5133cc98a746d6888b86e420affad19b1a20b7ee43a30cd54398b6b9bcc7d2788907a2132c0832b032b46e189a1526ab44904275b7d1ec753964f739b9e9c2241a77978552e8c4c1417e9126ba10bfb854882a778b615456dfef1f5c50eefceedc61e4d685e1bafa09a1f38109eee2b047b7954cfa0937718c21c7ab4c389a57083ef935cb73179f4355906727cfd4e188e60e23c1b7c4800a783b93a8a22f780ef49f0b15aa58bd6a3307d6ab2aa2d801ec897834d431e23a54a832f515522ef77f608a222bddec7c545873c9412de81151489673a8ed28c7b914edf285f8afd4388bfaf257349686d840cd838b00dbd9c8d156768bf0f0c7815d6b4bee3f866aa79c07e978a58e5c9f739cd7508b1d050244a309d98155a711134f4f55aa1c324df55e0f39bf71e21171e2e540ed16ae2ba99f6ad2cf267a7f6f5770a5f1a33a4078c0e9873b17e23100f312939b92e70acf195a38495102f17ab500f8f02dcbe6fae0b02bfb9d290e1ff57956122dcf411f1e6a41e47a0289ff3aa76f94e565d86a0e13f0e49e534b9ad49bf538e53e4fddfdd9b9655482a5d935c38949f5d7f2885be3e80aa7050bce4e5b39eea1f966452afad6749d44f7524d0a6c8906acc07fcfc85fc92b5d1d5dabf514ced9984925356043b3091d05e8cb55753e699f3c1cc0a9edc1c0207c8ae13c1c29ab76ed3a46893879413007d84ee61de5f9b6acc654b25c994af6054d092a482057a8ac6adceb +result: pass +shared_secret: 3f338dfaa091406b88dc39f5e82ec7582b90e4066882aca5ec4be352d4cff72d + +# Official test vector 42, seed: "44a6774b2cac02dff210ff861a090561a453db311f47b6fedb81811872d5d9489f5fc4103010139ae53fcaed209dc9be" +private_key: 536b38508a50a06441226094dd386686e461226c3a3c121f4c906608f7a78ce66d7f574d479a7154c87e1e88278409968859356c7b6dcfc0a9cfc473e670bd377849619887ab701c3c4a1d2bc0b6a9633247cb47e8305d983b80a37462512b1e587ab1a80293d3ec1d9c785be97b7960e96cb4bb2a70454d5c619022cc647e12b67f786c4f386f68c03caea65fc0c14d8d0809b5a181f3fbcc5446037a00bed867264f167c69152789e38399356e1eab187490b8c8c3c5b8f226bfa41877374d41972c151b11168c5d971740a373967492804bc988afc31e7cc195f71c8cb4a53c39d16666982685368194a70fdc0b7ea96729ece4085c6c59ae12218f649e1552998d571c0a41503fb278c2195d16f79012251ed5eb281ae05f88650cb62017781b7ccd534a0646a4e2e2a4a8f6160b64cc3aeb4cd78c17f633068d299b286730b2db36f2963ab421b0f3dacfd18a5a02aa807b47231001ac238c176bc01646541f465b832c448ad4f157093c8d26b0b1da121d17c21c71c64bdfe4793095c38d930b7a26a85c87c5b87821c389bc4f3ccbf42424d994754073605c166731a48923cca3a30ba4df4c2ee7457d5feac30ab08b21b71abd66c8173a84587a047454afeea38e6ee12936743195eb79b6548e73822960c7428a7b36c75b5f549b66f2b30ae3cbcc4f10cbf672817b9b45305c7cf290c4c8c60aa2d443b03a6418b8bb42309f2d912a6268260d35b5c2d72ab320617d114ff649308789a3ac88817498333f2c8e65f47a99755929b35af1bb975cb804c7f71469f32027c33e705c12e6ab4227f2bf37eb2214b66a00c556ccba44ee84654212495d96983ef16d9af2b848919005700f01b58b3d5667f6220983e1ca9cb8cc1ab09b609224afa0269f935d99d92535cb2758c24f08aa76dd1cb889320c187c48bf781a10cb3762e402f3e39cc151ad6b7c6c8c50b71e7682364314a64c6c8e799915d84f50b37403077d41c76062277b6a1354d298427c31b52446864ac075e4229b598a9bcac0c03ee1934207cbeebaa931c18870e7787f4718830a932375935759c98dd5074cdbc3a2cb6786ea21ac928b34d675ecc9affa0c8c0d341fe0588a8a6a398e994edd03786a167982815d693c9b149600fe5b265a94697ecbb5a9632f3a158e0eab8d06dc0bd176bb02172c68851237e7bd9592433cf97b33017c32bac8c719926c4a8cd6788f494806e7821edc0c798cf6424767ad4715cf2e02c806565b5829bb4d9980210566763999046075ad12612ae07d6c0394be26cc1c375c757ca776f7852002b6e1fa8f44db1e643753f1daa627799eb8d320edf134b5362a7079093f519dd20a9fb662cc47e373ee81a058e367f4124b8dfc7eafe83e2ed7693e46be701aa7a9e3ba45338aa4c9c26831a5b1f7c03227c97c515e8a1b154ea910d7265aee1c3f16198905e9c3770aa5ba924fddf0433edb6df1ac0d2e6282e018912db1c056f613bffc51efa044d995be8a83a5560a4ca3c554ac538a45060b42cba3255332cf2529795ac109db6715d87810e697d97a4c88fba86760460aa493bc25b2cc6bb79e3b1391134ec2934165a77f44b81b1416799d027e488450e43c42792c7753a8ac4805c13ce7a654b4a1bd881503a8cb3ed462e40a42f71c280c175663a64657fb61a9d8cbc58452141366a1f34eddec4e8c40b59d82a9260a68727431d8f36a614a8ffa681774c60587153aca0591d212bc5c3a22423267d4345db36878fc771c0319178a6936569bb778cabaa0e211b2a14efff4a4649052c60a9dabdc37350bb1c931ab2cb3854ae4999fc0a9f5d92a117783f975ce6d1297d7621a48fc0a2ab584d754b036a831051ba25b7b5b9e1442fc3a7f17d2710e7aa3d86b85ddf2abedc30ff756b2262a1d2d1165574a13e51373382704bc062f5b2261ed5053608446b7db9e12d0191e1a2d41a0adb4015696c3266c79497253c6bc51c20999b890bb21c8fcc9a786142e57009505694b7155b386c39b5c1b84f0791d9583d58a904eb66f461b2621f2c024b4a6f0cc1b2a7bca62f5378fa1334b7b6f06c61cf5362cd4e3cccea93988eb757032a844037aa0186df5703ee8f7c649c9785a26197c2593af38c8f56b849bd68e12c696825982b4f2919d9942ec240178848f68d31d58c83101c3626170b992c2ab3c181f3d58b554249aa9e73c9e691be2c6c402755ce0737ca2e2524ff59d3397b417965ed4c547f8dc97252c58f4367379f4bc9da75b64b4a40a329952623f0615117d28af7cfbb994b8ad70b2540978242ca0609a082dfd70aa5910778fb1cfe537c5c1aa5612029d9b972aec8235466098558c1bb4fa2b84e1cf9c16300035a57328b460b20facea43d5502958b968547b60a3c9255ea20faeba1f4e69cef343a6f3793d4b0418edec073909b6786a38fa3337c61c8f7af5a796f41a3731a4ca6096382423c941616452b6a5438977445ffff43d54e7b787cb9bc6c95c36003d87b9bf08934996f7301618c5a2a9b6d5d802d57c02018b44b0d95c5ac1c46b910dc518277be4c8960400b14c51eec975976975825b2d574965c338c121a056e2b9c9cd88ce4111c0eff01db722734b296540ab44a40214646c32713c87bba448d349cd5b160db48411a77593886c81ac1b59d10b51e8338a4178082ee858ff3987e58cb7e2a58cf23c28ccfc6141270c5ed0b883d01092c3095f0abafa2c43eaa7181136bd6e2b0c332b3e78ba665c73304df21d83cc3915f9c8073b7d6d907c13bc4a295432fb0a894958b98c9629d6a025e3368fa234399ad0aa5f8c8fb54b9af1d3a18d1a7ec1b22e7f5056c0d97595a801885202ff8c9ce2315ba340924d1c5e2efb2de7c1a468b684c8f7a363eb98dd4cce7ddab73447a5d263b2cfc4129be74174b50ae359c69f086153ab30038a13ae21ab5ef870c44490990806c4936eff553ccd9ac01d90b1e3d54bbf943b19236b935cafefeaa1059823b1d928cb77cbdc0ccff4024e79219852c0653ecaccc3d9292a18783c10cce69732dfc4585c8a45138ab94ef2c84de2aed22b98bee16bef556331e56eb43c3d92e55a7c1bbc0474251a70ac72d5cdb9b2a9ebb9be53c0cfc037c1678a1351cba5e91bcf7147002518b8c8933cca1c34f9da03d2b70e885059b259b499901b98345aedb9075aa1686e36a85c6337f01b4ea2f2ab29939eba618c68c5256eab4e6c1a1beb334f93e99bcf3cb31012b1252537f8d1a589430b46e487ad07cfc5c58a2865b0a92a621006248a46c837f095109a3de16b24b2339a509284c9055778816e9656c743a8929cb622f3e34f0141c820d231501c920581bc259c8be8b0928b58b6f1e2b34b628301230fb18c3904741a0f061cb613b560e972b406c44e154724f6af887a345acc63065481c4b468423742e742582386c00f2531c67835f3c679ebfa9aff871f0b006c461b760fb3171b99c9cc74a5378c3ac78c87c847a65f4bcb5043a551c223418114d58bbbf6aaa4422aabd4d70e7d78a61fb1af33882eb5bc886d154ee032b0cf300efbec2acc811ccd2c6968e90f6d146dbeb0932a569896f96a91ba3298c57c5ebb4aa130a7730a996054b9c058057fdb41825a2323799bb0a51fc0018428061ab3f3c12a6479c3367810acc4aa869867f5888a90a1ac51913292a194f1b3d8c976902221d3b0c607714f4fdc8196859c939b499e511f54e52d059a25449068c39081dd59624a6515e282935ea454cae482ca990a378a3b41e0b0adc6702a9533c0c479a4f6176be1a9a081a357f5bb98f835ed13ca29eb969f3a7c759b43464155ea78067752534d1044be2501c38387b31c662e6b9cfc4584e5dc43cea0805e273d9e56b71fc924204c8ad82ccb315207afe34efea97f72a21760cbb629d6391ac85fe28ac568b1b96ad8b888c9cceec93fc08825429614be352c55ab218383ccadf0bad13862778bca36285d67381164f5853340c0b9516ee3916700f4c3b8326e497ba7966456b6144b87f70c89cbc07a3a553c60b80e01c0c7e9297ec70e5a3017e906cf24593f86d3b6d1db26004b8ebd7047339468183c20df37055637995522a8322b04618b123bb3b1cbf765beb8cd17a302b88166fb84a9bf1728bfbc57853b7de3f113257359f6b7835e9953da123bfcf545e5e3541c8620f5f58872f1192b67424b5a9909d5324a342fc74caf906c69fbe3b2384a2a9bab153439241d6065e0f944ef67c4d6873635b3650bf4cc4a4b879cca63b6873c8e681982e4a183557e0465bb0f60a8b9d97625065d4727731e173977a95e7bc2ce3494b58071c1b89b1866c85ff814aa4843f7ab5bee6124c2166757943afa3df3d5f59581246cddf8777c228d53729573ce2f4f51da212385808ef436eecdb8fb9f3c8346800beb4b9e537d1dcd292e4c5f9e1a55e0489bceffb204d672a6215f4f3980a646d9f880817c52dd +ciphertext: dc5913055a1ecf9c95b554684a294b4a03cb3406842c86ee29ca36f740c42c0e5580dab3b289917c7e3378c630fe329bcecd5865f474a9470fdaadceb4dd94fe7dbe4e1f0cb8bf149710c96080d8752e5bafd195e916d5ab5a9af587645a3e982ade25373bd38a93a14b5a9f09d13ff95a2943229388a420e1592751b2adc2041091e265f940d619141cc1f358b91669b5018757a71bfceb76fd04700842a9b3a84a238e4677c1d15374a34c0302b0ab5d907e0ef4d43b576a839efb86df9e093dd25d9f4792a31a3bac22589bc68c500603afd6ec99044ce0f49b23afad853b45e1ebaf9f5c63ac00dc05d4c45cebf345146d1ef38640c8a3f641e21612203f503c181c31a43519ca123b3122897456a83124b4ac4ed88f822bfcf4fc2ba8df4aa9bc6cb6573b8585558775eff7e84b330f25a5c9c72d61b163f2e0448a2a5fdab6e3aeb4d97835a1aee23f56281618e6df02ea0094273728342f8b5651fdbb19e0858ec10c4d2e07535d3d09b7a2c91b786665aeb0b247ad1abf4bc3297d7de00d143674d84d2545c84ffb166d39b8a0664cae9abf621121cdd5009eaff969ca3d68a2f6864bf9aa13cc500a08d650914e36d22ba7e7b485c065432daf4791dfd606223cb66b6bcca6e90b3ef6603bcde3dff4cac572177bde955695f0d72bba2c0a06b65f22a622c9ea109fdf051411a06a295a34265ab8a733ba1af947984c8b6c3ee8aed5bcd25ff26ecc46b8e70528a38a86c1de5eeb6e5d37147fd8ce1f70999f5c59602418f16ff49622a3d0a5a02111f6ee16cef7207ecb3d651290434f962b2434e727a277cc45156e826d3f1d5cfb0b1508781c077c0199bb567d545312dfc0f9ab768e02db41e9c4830cf65d047ef6e24865f8a046748279ba29cbf078e05bf0c63eb24f0ee38de4efa3418f1ae1f925c848cfbe8fda802dff00516e48e5d77142f0861879d6f63292cbcc2eaaff23224ac5041a779a6911ceb196d4b747e74cf4b770e9103f0934d95009d5b196e7110532a489b78d6e6f084af9abc6612dc01addfe8387fd4cbfb826a816f6ae28d88a451db79f5164db33b82c0a4249005be545346cb91f33ef9e941faea2a64984f05d777c0a4b5e34400cfc8a181fb385a84099ffe714b91801bef493a914355602f07ae87f57bf07aed84b7bcdac762a670d6b6674b9cad3678b880005c515931fb4c930c3a4fe48e1d8ab7f35a352c6d6c63f122a01f6138b36fe0ba8d28203520481496cb6483005d9b00c6b828b320344bd9a2fec60525005cb1185b9cbf14b368a096c6a676a79869921b72078d21a3f00b154a467027663a1157c14138cd60a52f691e156c3407387575bb410301548042dd9208903ef2164522e32276ee0497a166624984747438f5ff6da89d7195c725fb80680bbe9ca6f98e2de2c791a966b216d4dc8096acc625193f550bd84000179de531221763e2fd5604b7a68b7df8e1ac43cd2dbdfe0046b040708010b7be729c6c6e705def69d7cee1465dbb7af3b4a3dec9340dbfb548b153d11e816fd9fa3f8356c0e96f9d1c11f72448b631b63ef1eeff4ffdf6f7d66163dd2f0ab41611addde395562d420cb16002516acc8ab40cf12f76f4982cae50c0685d70371b54a37716e5a950d6fce4f4de34a8523654e840396ca498ea90e044cc7fe019204133a55c902819496bd4818528cb364a5128ca1f13cdff549839669f3bf8f0001c0020dd1bbf91a204abd21eca71cb52167a058b21e35122b9015133a7fbe038cd2bb57cc46a06cee96de5b0f09ea26354553c6fdf4f00bbf750c16d452f20043dc5b58e8a3ea04a19905a39d7174cc8a7af304c8c69f3e3c7f92a6d450f8820dbb906c98842dfbc66964758bf1a60892657b445c9015f4b1f3b7a720c63454f61ad925a60ca5288c490f5f47de14a0b880b19fae871cf15e67e3d8fb7d7a11aeb91ef8fe0d957bfab406200a32d83f9ac31a4f79139005b8d3ff506e65556c1df42ed2a723df287890e11134c0cecbb80e44d3e7c1590258528e2cf2295acbbacb41a60c209e9e7d62fa70393dd3e16cc487f40e0425654fb451680fea99406974a01fbd4054b8d197b99c81c1d624aeb225a1c380aad745be460121886f7eaaff265a237c25566315fb8613a623a8de975393d58cb6af63f4243f12f1493a6558c33b383555076c1bbd0a93974ac38e1012e6cea25d54 +result: pass +shared_secret: 59c094e831e466b4329ecc5f2f627c2bff4d0a1f1f3454f5b052fd1be7d6358e + +# Official test vector 43, seed: "49e1855588b6235df2a400c4a70aedf8ab17b6e5e2891aa745f132fa2e7ab0c8117c1df37c39f5d57624eb77c2b4a091" +private_key: 548b6bf0069239d110a3699befec0527e89da2e3792653549fb865d1e9ab9ab9250ee00d913b83df22acd9b4b17a23cd1bbc9c0b46b5df36c3d5a636cd9808e08b8affe75d42dbaddb9974e8417c8cf14ffbdb8e89fac43330bab32c9bd8005b0a1c4948c04c4d110a6248ad52018549360b4e7a950a29a911e43250127a5362787d67ad2d85243ea92cbffcce1ac4cf4f979b59e47f60ca1156096c0f93a219328619fc00d2912d1a23badb2c5190d211e339bbc3317e1a22afe452492b75b0138600848894f3b86eefbccada8c55c73877f9d9ab985004c86c717b199a164c2e25d79f3230368216800de11fae5c2d8892c5f33456dcb2cdb62392bfd1b2e7658c979b87d287ca62d052e86a1afbd367bc066de99851331a00e9461adfcbc6b770471ac76bea98bd52824fafc790b41aa977481fdce18f91528939c202bce50fc64667fdc6c06e339b2ce3aced139739036a7141b1d3b293ee188d57354969485238669b74514d281a7a5bbac250ca154fe898e7cb42ef6670891b32dd97494f75ac96c6bd10682c682786d270bdd73a204aa340cdd9ba00162ff1787b81d2982d9a5fe90038537b65c5bc68bcc22bcffa87e1415b79fb35dbdbb6af8673e56baab96104cde80b3d59ae0563660f8b068d3049c23c0afb59b36d537dabd8c4dd2063afc12b19539a845b51fb4594ca58bf967a9b87a057f7352d40c0b8e79b71e86a34a79116a5e13ea1d4054a35a65d50a57b61bb8f203f8f221c5a79119f0b3dcc2974038865b54c9711cacd1a2b306188235f36a173e99ff982a966d4030a84220604717e8b7726136941d80d23420ff3c599b623276e510567b499da25abecb32a51165f4800b95fb66b6ac1693e52305f32bbb4d980d8a53d83d44f754b0798e6596981c0260300bcab8d55574c92a09ac86b277383b062857d1e4919e094b0b835b7848176a8984ec639942ae9a541fa0549d62570bac5ee458130b0bb46c30ff3c8c7b2d67cb21785b82a9367e59d38528c82694d25756890b789ff86b9a755493eea0b6f640afd8c26ad833be6014ebadc04a6866f2250c73cf5121522bd4d6ab3d8366e04676734fc92699531f5f6c0e595befbc425f91c2c978842595668415c59582142ed11418fe2983128959dc425b61183d2ba458c477e4b9338228b3ad1a16316ec976522b9eb95596628a3aad73953b2877a038887b96a991ca938aa2615751b22f9429a65a8ea4c637f63b313b48f29662950227b702c6811b75564e58d9ffc3609479ee75205171c7db51776177a2a83c74e3f61cfde821f4b60b433902542770ffbf45d668001f94c553673742c96b76eda9750f154e61362d4a173c806ccaf48aba8ebafa9648cd1b3a17e135840800cee9855e1f4623f9768197b2ac9f5525c534c8bd7728bbac26bc18aa5e412fdb92ed262027dca769d9851917510b9e1a66826cda147705f703512767a4d9245a2660ade559956f67b7a012df0a99fbf911d73367c0e7372e7265fce319efb818f139b84a5f652f183c7f2f68c1c252bfd69a586a716dce522aab98d94587dccfc99a4b813ad60a15c924c87a9b11516188c4787171c98fb11466c59b3c72017d9ac1d9e6522b52c1ccbe45ebe0ab6a0983e84e8bec3001ebfb845a14a47c34c9a74234676a28b33d2aabe157f56c26895e7586658649687cd7442832a1c1f2401207b51c676b90c41295bd609882e40a170008be7c3909318593857b602ca882a998ab0265f5e162c60aa090287a9e7a3627909743de22272ab0214816311cb4548fbb5b093c29ee57170121337000208759f6e224c6992c593337d62d3011e02ccd41015497190e9ba5df520b3fab78d68c2b0c18b72c8f67aa9e056a26ba52e32ad7c717472766f5be4acdc60b48ee38bf361b1ff52b11df42546e30a2e0c3f37456fdd190030921e301c555f73b68e5818f285714333b5e2818c5d460994985e81c09448f9a58bea16b87a02e4bc5d7765ab4936ae83b035a8878ce47a659778cad7248733772b52459744362a51b05dc4d17f0e6b72fd1119b1d24d378b6b50831759870d2a80b8dd5c67e13a30a9bab1cddb0d5007ce2d2c7f391a654ce2ce94a77a83035f7d059f4016098f21a9b4633a96d634c32419aa073be74b792b080be8b672b2c2247d98c617419adcbb5027b320e54205ec3b9c37fb528be1bcb29624f0851a9844b83c5788a2332c0148c6c982be4ba98be6d9a54623b8183a66dbb8456473ace4f18829a56d1523497e1731c524ba3545652be97aece915ec25cb8c18364ff961dad655e2d08e14293a77963e4154b5d52a6d424a3ff976b69fd6c073b7bd960cc397d7511f76aee624240cf6430d612385a21a33838d181c3f77197e530463e952662e512a538b81e72913eb32357577319d29599ea2ca2e088c91681ebb295c5fb3c4f11643be6686f62b259c737c4ed37b38901eb7a79d5facc426438f6ae228338439d136ab68ba7ecb760a3b45c77f186c177c2f79f47f7cbc2a43da4b94371e4ffc9f8d520a9c1749d5b63b01a2af5b7a10ee47505598ceba4ca724f22fc15626a5243895db48cd2bbee25c27b171c44fa09d9dac21a11803ce0a6492b72d16803dc793cabab535eaa44eaa14b2d81a4162c32e73cb38a7bc945d0c1d6e0022e2785093d66c29e31616ba7ea0f58def02339ad231c3806600ba8612080d6dfbb50353b0fcc98dcab2c07473b34e05a556d777cb1982bbe521b1cbc58c680606f352b1560e7e4589b905b50c299ae8d3328a3729ac0420c3d23eca06491c43ba8d72af0cab1a869002434476bd7527f27b751c9364670a3730c52d514454e03386c66406a4b4315c8201db561e9b79c2ca4c60b25044e6bc1253465b4d0206fbf695470b4b7b8bc068d391f5d0b7e9d8028f1591ed916da33157cdea92ff46ad98d18e1ce6c4b2f75854733e913c5ad2d13e23ba51b7f8c2d3cb0edea793b55acc3995c97d3c65c0981f12913c88b56f62623f41e85a84543d4e4520c884981a3531d200ccbaec0bf1096fa7ac429a9b3bc1a2b38de159c2139361dca3ea805d97e67f61d10c0911674fe148b33572797ace2138ab478a51057306f010661d569ddd9a4e55e73f67f25f0db09d61f1951279cb79d814d1a21a4ff311be441bbba97d81935b31bb4dd558544babb18175b893357504589fe79170199129e78874882aa89b87c20bb03591f321419a41c1a78f87016b4e551c6928a37fa7c60708afc03c8b5b17001aa3088dca6ac9ab93fe5665f1781e36d7813945471f6945198983815c2737713f9c53a8e717bed4d9a7a706ac41d339001c5d74548388a2439cb0142bb6bcf2e23442155adeb4269cb39432d31455f0191a25822f35c889f2962ff081f1c1b5c55b9af0b14a414b618c7366fef512d94077470440fed7c2d101b5c9ec7b79ba17cdc14653b6c3179261a9401a0b20bfd201bbe243b8cd1322fc872c4bc29889586a8e302ac26b043b605c13c1300a68c95f269b2ef49402786819668e964c921f765abf805477ea239d3b8b203c7db303afe5a8c70158874981c663f1b3f8a645991cbe42a2498beb4579b314918c85a8388f31e628010bca96858a09e49365725b31d0726c0379709529c38b47e15678ac9625b28a763b579af908cc1cc45a5ecb23e5a6ced504b9e3101cc562be9714bf4931cbab020fa3e10456d23d2d01af6dda8dc6e09ec6aca54a3253f5d905d4b34b66250f80324060b1609083028a63aed377a7cca6a929da786eb080db750cf906c98eb9a105f288a36427519c0087e300705524ac343b2c448ead7802404417cacb6ca5a398c7e9c2a7b2855fca298ab1bd0fa9c23af9c5079496dfb2996a3738d5ea37ccbc24f1744eb9f5c672d74968c872392480fba91daf0c60fe96b13828bbefc6156f860ca304970de5695553a631a10c799b29b2585652065f33c6b53179bac6473b4dc2b277284181c7a2a9491ea422c5087358ef8835bf5711df91b38ab90000d324e7b6ce841830bd952e18583eab6b6a922427b2d094ea633cda75c94bdaa1a3d928fd2376a876ac0306b1ee631fe38987e50421389cb224d4045e260a9d34508d1739f223765a3a8f2699a8919b30f80177d9e141d7d9630b46cf5dcc4ff85045e62a4f0f86bdbd6367c1471ac4b22210771eb636c2bbe564578266b8682817a9118d95ade51031def42e0d9cb273c03e3f93ac97395d9f09be36eb8b2c21a4c74796ae501758b222101634d1668656b02cd0026c9eda07c0f3bb7d99b7fac6a78793bcddb2a18cd4262039723f41223d336451eb31911219750098125d62110dfcb20e30c6d5cf75212b294eadf4ac273ecb8bb5beea59108851b460166dfba8564a4a16e7f53e467431528a6e2d8b62b614d427846b701fbff5f48c64c049c6dfc0f1476cffd520b055756162f7ec94243de6b14ac0b9e5fb366c +ciphertext: b646b26612445d07ae9377b787af734d0f1bcb2ca61f9392d5b1d60cb66fd916a54da0cdb9aa35d59c7fed3a20728bbdf90d5f149600cc7bc4e36e577db66a69acebedba78142aa18ebf4c8e2dc5b1cb919d37d171ecf6a0972640e5ee2ec09d60f6c8574a4b626dce674cec73941c15bef59bd002a96a0d5c47e5c8149382c1149c85be6d96b0404858c1c5cabe68e22b85176d4443d491b0f320a63e6bee2c0459fea321b4fb70313fa63948e7391aeb9b9c28490d80b1376b852a33c7460a8227669c8ea6114665c91ea9bf6c90d7d92db6e8365d42f325be58a7094a40dee5050e53967481253a929966aa469ab11db9c3a388066284a5aeb6fb209a13c888c1abd2110d695acea81487cdc8620be72da3e8dc5548ad50e8da415238a96fcb0504568c161e9ae617b12409b25f27f2c6f3554136a429cdba75a051900e8100513c02cb87a360d38bf0ad7c636898fd98010d68ca8377c637562b42e7327e43cf6be833c1432155f86b28a0c5c7f70787fd021a2c5bd689f79f8062c94daaebcf499e89b73fd9217c4c428ae08db840738e8e3c12d13d2205b3b29ee6d4ba9c3593346d04c770d430cc3b016b6bb024174c5a912639f30f1252bb46b82c1cfe20c923b5bbf3ee18c072fafec4a3f332a80179adc86060b7ad3d5869a2ec5c88b10058f86f27cfc8d6bd3037c599ad60fa9ad7d922f788023bcd585046f82bcf162e741b1e7e2efc63afe4236c2dac92ef56508a7766cb6e3999ceb69a4379bb9f0768e21a2e49b145a028023863e202aae60f2c9bbdc34d65811ca1757a30ac7fae86678085a2b1c54acb0ada5b2ac82bb6ff15a4d08e3777f3fca2ee1b9ea69c4ac8eada9213aaaa0e3c49ee071ab9b7a337397a3f2d8c54df4ed13c242521b5e3bd80a2eb844e174a04803c68f8c45e0976e0042e85796346bf7e027f71d24b6ef4135ef05abffb64a2a8a92bbfeb01b733edc27c03a67d8f4c369080835d763a17f1f210b55d633a8f404d361c8de3c81da4118ebec9fb17b52a9d994e47b93bbe01a70b384ce738e08ce7b0b12f2fbf5a02d20d170dab8551467f00479d0a7ae184d385f6d74ae18f6329e149e8264f5f2e0b9abc6afa0d675af74c58468b45e4562deca3168a1e8d41865da855a25756adcb182c307c0c068cdb2ea292968109981d72e94871fadb275981a486dd9a658764fb01c8c53ec70fc52a90c4eab76cda5c3f5283c84324fedee0fdf9758e5094c00f81c7d9c239797abf10fbd53138f4ecdac12c382bba60fa766c7efd6482e4f1f66dd4348004e02209976b8934266d5360a85d73510fb3c40848f40f5eae1af28f85349510839eeab1beaaea9a5b197a60e8e130618e08a203d2d633bb88491bde3380271cafd119b84013d9ae0d373d2f6f5299f820d7aa29bc457d2ba102ecd9591e196ad1ffdf95fae9ebdb79ecb148b3deadcd0754bf9823a9a14a42611bcf20d77e8aad7d65bc912b2df657fe8ff43cee9a7bb34c1e119e8f69fa00d6a58c0543cefb0d35f970c1f349c7ccee8dc22a5c0fb653c394763695baec9c7ea42a8e7e7d3559bbf67ab7fb57707a48470fc54821de07bbc006b3ad877d7c660738283043952dab37b5bdb0c7f3e538f987396f9c65774efde07c0affe3f69360789a4ce7d681f0cde4d22361d07afa2b1b9906dc67c30a4b5da3d32274227768e8754d265139c54ae96207390067f97c0e1d791a413cf4e02f0cf9c65aaddc8d54dae6440786131ea9510649dbbc7aceb1a07be479cf6a7421c6ae1ae1733e3b19e19fbf3b6401dc6b4b27ccb1ef24f4525d88df1fda4f0b18d21ed6259a81572f8d4136c3d67a36f28e5cc16535afe95b1dcff21694c7a62b021bf56bde5a31eaaaff38e60ed4861282ca8d03cc5a869e0fd6e61b3275ee433784925f6bab1a9734949801dee45a9acd7bc074113ec9c248e4011646c34a321b0a8c566b88254449bb1db9a8a796ccf67f1937bc9624b7226e0c5e47edd520ea4cafcb0590b9b1129edb25c1f1ababc9738e7e7e0514618daede8c10f7ac4a26a402fb7fbe34b8c659c781d17e3305d7f29c43a4199d69de39c9dedb2183a037d576e985d1adb56ad3e7855e9dcbf48cf19c07a1fab67e3531d70c28e8a587fb3a73e2de6b0022e6ffe83c485e4d3cfaa7f480a419f23f0494abac17ee44dcc6caf8e196dd81634e1f07a18999b27cf6 +result: pass +shared_secret: b2420d66a17633b60ca68b5c7adcf36ce7b39ea418b39e63bf68288a5af09112 + +# Official test vector 44, seed: "df0e41d2f6f86c1f79d31fd5878e7ab434fc0af3a0d5f47d2ab3fef31a42bd949b0e3629df9f575befbb62e829e51dae" +private_key: c4ba61e90c3a8868850ff1c4662226ac4953de3553f0701c404618bc69c0f57b527ee459f171bebe70c730f1841ba702f182aed1ab25ae59cb9e793d7a22c4640ba87e78433b639bb061106c0581809675c702596af67e382b564b514c4d091a13f35629bc71aca95a502239bbaa7fa15310ae31b7e8b97ab3ba783a27c8b9eca6b9b054911c756085002a329063067b06707a6d3a31c27c234fa36daa420c5ec0aca490c0fb66023c34064f09832d43b465dc8f84572130270599c10534294ac0458412c58273f49c39cb12d522317c980670692207b3af7417bef469234ac081b1884815972c7fbb3733e22d8a164c614ac8546c14cbf05a6bc47d6424c36d3b106fb245ca335a927538d227be6aa1a4dcc33bd1c68851e18e2ff7cc7ea93104521db15c7f11041676855e0bec2b2f9b8e9f63920858b3db1cba7005c5e21c4effa94427d155ec0c1432cb2679c45802795e0ff13674f15be6d60ed4326ca4f230d87a59bfb268f08362a6764aa2402e270172275191649bb3991200330a62594aacc81a8fe9e5004bd5ab8ca4bce4e36860eaa9e49a2f77762d88f0935d6563296121764aa34ce64b41418bcf275b8e5bb2a25259669b3010b239f111b2f6584c3ee9bfe7608d12639e72ea38073c9c45107abbaa5c673718ec2c4a77a19464209b8efba54ae482731bbb3aa036a67653ffdb0e8741c678b88d4ad4647f8b39dc61a879eba65db1b98281ca641c954915a916b15307808587ec3d7248668b1003a1612f9ea13e4ca7b660431a7a55199814ba1e757ab08056b7d9c13b0334661839c334449afb77de61aa7caa28ad57acb2ba0e02e76ad9218a29c6c638390823d6ca512139d3f8826b5c176da373d7754cdce78c614b98a59b4bc607382f103eaed7645cf791b3fa3374fc1fb16493658a7885735f7fc38fbd324fbdeb904f17b7a9fc7af45013a0e8c1d3c4b9b7ecce171731ef1c97693695fa775ff0452d457b8d7f17bf24638112391d1b4017db07c3a037845722aa4fd72a0a079803102b0cf49b522302b37a46e482914ac51af1f007ac91a84d6556a176affcd28553362c16471eaf569e666683ab71cbb0748b6bb026d6b736e68203a3103940315650c4201f31bd286643c635644a567b2d38b1c6746757e956c663cc2ffb1230e7c20e94ae939c8ad10b9be3887b8fb7ca9ed360b2295f03725047cb8cb771adb18b7f1c976cb436ccc0c675f99575cea24675c358c3678b3dfb345100caa3d11a4fe8a34737c4c11131b7e400aefab6380b4565326f1ab8510d4210e3335a5ff07473a46d9ac73974aa4c8a10ae5851addc7b4d3bd9823b71aa1c0a7f2b4746744bbdb9335d7b161f55276a1b63c3b5b4800d0344023093ace786fd99c144655d6af601e86336a5e16e6cab8b772a39cba32c68e84390a80d62701af5d5822629a758b49cba714507c7cdf2034cf65c4a0601bd1b07b4e1c1a70ae555d7368a568aa0e59b5494239d2e25a9eaa34bf8b29b2fa31ef8eb606e69602ba0a4024780d5c29cb6c63cee9187249280ea56207b4628f8964579bb878ef25aedb180931aa5e176ad53a890b3f705bf626861265bb9331d79f66b87e96a6724634df6a35a82979a4a2b1c23bbe585a001a936d548599cb82c8e362442a6481ad29478ec2e389853fdcba3853629630030c9091e8781a33287001a6abdeddcaf69856a832cbcdd3894f09690b581ac6f7951b7f3558a284c8298225bf74c6847c8d834aa4b118a37fcc87c44749031091af154b6273bbfb4ac7a3b34ba6c5642a78a22b213428782eb81194297a88c1c04ecd35d6c548289285999b69ac46346127aa097eb2a08fc1bae1a944ae83bff25949e27af6167b73938147bb97ad5380f599822f788508eb73563e82e73c9951d5c94428a056939b9c5ab272525a7088977135008b0c5181bfa27e336457375b1438914bc0189c00bb2f07c5eb5429ee6956943d4c5aa597cf1376ff7083da68b7c1941529ff5509ca82e3a424dcbe4673ad16439ea874786544e7181bb755250025572c9bcd36c28338482e31449a3b6a917c9947876a702b8567327309b3812a3aa4bc8b979168bbb2db72f533434808cbced5ba7f567ac05082db4b029512747d203c84ed6aac81245522a4d30a887b8f44b4e35c7f9aab819e1981647b85f7b73ac0b8ed44a9ebe203998771af684086e00a0ba098841e7979baa20d82b450bc35b88884eb935788dba47bc63247de5cf5cda3f069a02874598468c6651842e56464d9731cc027aa307da811c8c163d62cd057863a8c2764f81c889d718d10267200c8c2e7877d7d853a73287d8b1aef013c715f69083b29a589b8e2afbc72a76587032936899244d435f1df58a957091241728dbf57693f46accc214dcb89fa35ac97c77732d0768e11b15b6d5c915ac78d5aa17323bafa8262f75b66d06f55eb015a5774a3854d09bd130473295a946771652176dc0479cb862cc7b93494df1c815d754f86c290f44c1c828228d48a5573a574a2039dc9140ee8a55c6abba1986938a47b0e84859558399a42ca013450033c53b1e978d5a3ace10a87761d51a19bc349fd19f555042e0e2806c1aa76436bc32831f0935c51384b6698a432fd4a014157b8a9858cbc216fa784e66bc09f02258a9dbbc402422cf652a3e430301678283d19889c7b61226951bfab2814a7c7a2899f83670b1a396f4d260aa869feb409b0af63b0b2438fbc72baf0753fb2c7473d577618109a9d2c2a8448a0e756b4402c7c0e280fd1160f20b9b384224fa2ba06ed2274852b15e1b35851ab6e8a5bcb646ab45a85744141970f6c5af2720fedb56abdb65603588d73109630baa73f773f260c63d81c9137100b1322d7c21181285b773b7c552a4000cdb2830e28daa17ca1db9bfa0226e2c1ca720e7565e80bc08f1c742e453fb2230138bc430335c2965386323b269922e5713957057311ba3394320096075b492b641369236134095d728341db3aa13ec453eb4b9c986085e23453e878e42d20c9af4376d092da16c8a9afa9834cca64f16b2b1561a4068c0245c4b6e329fcb1c0a9b15660485672ce70f3f17b486586597e8aebf9987af18bb2ce3267722c549a8519527515f4129ba5c986327996c38babd95cedfc1305f4378fd2c8b6761a24334192d47596502c86080bb202946f34c08d7e201a3ac937844b181d739b9807ea3d6792cac7a7a1b4ba7fcb2c5833cb0101291523208e7bcd486737b982c1136381be16f75202757fbb86970194c4a32eed31b01ccc5a2f0534bda8ee61b0f4a2023ca58b415e59a8d9bbfa9964cf765b31fb0c565174bc7b006855c9747a66747e18e954444dbaa8272a15cae2b7749b08df9811e8cdc01fa46a362052f50aa06eb2249287abfda0aadb2e719f1e1afa3c29d7c855a6ca27aea661f40210c1c629f611343240b3968238746a245ace3994bf88b46893eff1a3a6096166e0bb7341900e73bcc36bb92d3e539e456bed44b84cc00bd836081704ab2e4065559896657ab31c60c3564981453b58bc7e238fc5b778cfb4aaba57417009a789a13bb075b6d9541692b85ab52961fe887c29289923797d18ab8c9d35230624b004457f749497267a2efd15fada244c1d35c44109add503328d063b7e8c0fb8c66bcb42c8b1c1eac421563c232e579431fd9ce4d572904577811e23af28109b2e419515260e0e1bf4a969d18a4378147c0334a5886046833ab8d06c78041c6b848a43810208a5fa0a202ec2320f4adb15bc299c6649c694f76311d8c0450ca829c3545ace79a33e0942f133c35e1e6be342c30fa9b8debe6820a3cad5a2995414bb7f0744a22194435ea8e5a534dcb8c754bc75444093af5d72490a3468bd06bfd1442870701896a4f1fc11fd5c8c50580cb06192ce7b90f81d920a3bcc52ed02fcf703428c22c8ae25fa56085f8033c972b47c61998db005b019032d7a83660803cd39014bb3165c94b9dba1c6e38abbf6567cd513283174c42bf4605b3809c29dabf149a650bc906a4cb1e33a469bff3820713040aa067701282cc1c6826008f8787cfd0796bcb568210e088f649349ad921b9349cd4998189b4b945d92ba6bbcc972155d26920e1a756bce6441748c41c6c7373723a9c00434e485216d92dd6884f6113068fc2b798790f41bb3104a513f0e413ced19303f396e5f7c72612c4f4112f41518ea77c850f7b8e64d1b6df73a40f87b2945b14b8275aba42b455253b9d522263e4bddd6c24222062ae68bfe5ba4193195ed026712e729d59c7a1f519a9c65c566a51504cb93355a33d83acb62a268e02874c67c89530f914761b751f03f3d2307ac9ede742f51bce4342afd3cb6ce2ab83fea96998e3f52b93dc875dbbd503bc67beeee7f1e46083868f96edb9ec3601dad0e40771856eb77e4633504899fcb86c6a3d433d0b8d60e26f07bd61f1d4ed69bd +ciphertext: 6a873bd2880d314bfcaf492967c54b83bde3ce79b864c718d15730d64eb990de99ccad48da0afa4e66c505c77656fe822218672b77d28e4b14f4b11aa9ee3731d6ec00c807104bb09aae7f2d53b91fa4fa9b651ece46b5d0199054f0d9b4646845d2fcddfea617f70c5ce3f40ff7b41bf181223ad2cc1f45a31e6bc9b822f7272cdd80fdb033b36f4f7db10b874c123d1fdbfc4fcdc167edd8fba63c519d66167bb44c70ecd648362d811f8897ec4873fecf69ec6881432df9e2d30f83a5bf24bb43314e0256065824746883cc13908add804632f501a0be1d6246f67c7fecece41fd4cd6670f2e12e238cace966f8b83e02cd8fad38b4e7ff7f6bc8b2f7c9c1ff7f6499305cedfc7d472e89df731739f2a9ea455bdf110899ea84b686b668a1f52c6ff2889f565fb55ae8874efcc985efe688d5a9f52da28ad4fbffa0c9d196637251e91de6d2d56b9809e5040fd0d43cf756cfb5cd14b40da7f2ed1e94aa9b384a2e59fa75f56e5f5d2c441ad4bad6ea25c76811b3ce8dbe2d7d17dc830d8dc57c2e9f110ad2a1aa99861cc7312b9f0bff661e12a15409cd6d5536d699bb099a26fc60d8e891578039c435fad1fed7bd0fd13acc016966456168b51e533166decb49912780a842778a5b35c638af3d4de8d35db9ec0461b2bbd585f756c8fd8b89898fae974358cd6bd74a31fa5e223d7925725b602d44483bc74ef47a32ab444f7108a7488a27c013af0dfa481cef8752e5e0084df001df2b1a8022428c9ba7b0289f4a3b8df3c4f4a6a98d215e1874abcc6b5094157707e015e79affb5bbfdc272e64736ebfecded3c18abd25da44a8df479489b3b9a9a5ef178715e1e132ab38d5a09bc66e68ae8dcf464ab675cca458c608a9323f346ebf6a5c0d9eddc61a71c1e13f85069a2c4586149702e03a9b263ea68964a7edbacb77e59c4873fb35fedbc0b78bb97a172a10148184efbfc0ae272e0372b69482871a2a1a04f7da28198e7cf8677bb7e9874842d50067e247a506ed9edbf3934546527345599f15d5dc8198b03ec44669bea78f489425357e2e9c5536ee9d79ab164ddbcd3d78c1b90dbcdfeea79815d3f004520ebccea33eed44e0a3898bad96f4ddf7eb7abda800cc2c11ffc71c30d8ce610d9a6e43e924d0f462d24c15728699105cd30aaf78f5ade69bbbf7ab2b10c78714121abb09918077eca882bc077c235395e76d78afd271a8b27899540cd4a8563d8c290d27f01534311441a0aea72f6b23761ed3745134e6a4a5df91d30d961ea410e18126983aaa9b380d3510afe914a56668bac76a439c5b610abbeec3a213033d642f2417aedf224a8ee0d96ee6d9a668f5611671ea4494cb9415f9bd11093b8befed7f38b53b4b7eb42d4610af8f02af8ae4704257323ba7cc4592c5e29810eab67f6ee85d14119a85a7302ecce88e7fe5a2ad747326fed534fcf0801ead1d00691b8df565c14d2e303583fc635b6aa70dc12ad8fb122b8cc7e991907966288150affdf1f507168dc8ec732256279ac77925679540a08228a74fdb8c8571796e0f6ac176691f20850624d5c4ce8276766d628d06d3eb40a96ec70a85701230cd39ed63a33ea9c6cb73e46c3dbb114d7294aa65836198a16e8742b1b4a4484d80c0d79e91d5330a067d1f2f7ea8e9ebdec57f88c38167c5ec7fc5f2e196fd5dcf02d99dc0e65811472feafc946decd6737fd7b101907fb6346e32ebdfde0d98a241cbb35a4b28b41f6abad162ced0c5a55ef8f634bd058d1f96b05dfe051a0075eda9fd77f119b861026b8af09725175943d3f2ea105fc143b962dba902de7c5fa959d1900f0eda2c5eda6b645c985fd49cf6e98f259a1474500445837797a6ba15b92abdfee1fa409494b277a68716d52e8a60aa4e80c9cdfbfa41e9d326d49997b74a081666eff4dff2cef7206957ea78486f3ed2e610431783145bc73753380a7f82b13088409871a5e4db16b4477e8a12517d05720e2e77646de5ce1c1a9e7f58b06b2ae24ddbf9f4fb281b5d0302cb8f7cc96a6703280e7468808911a28e93b99ea06d135c7decfe3c52c877b781f9ee49bc382f5af000d350ac4f4e12cb50241180e6c28832cb1aedb279be2507b6762773da39185da073d695d289b082d777c052a620bc3c3d41021f3516448f0533cda900e9b4cb05f66ac01fa657990a4f5f474981df918af572f01ffc3bbec1126 +result: pass +shared_secret: a108c039dd241e403afae065b37d609b13afe12380471f5b398f5a66ccc78f66 + +# Official test vector 45, seed: "d3c9ebba6eb03ccb5c9b9d2c8d7f0cfbbf50841e24396cddf0e56525b38918c2fbe6c34cc1b93f7bcd4f4d5777e1a488" +private_key: 744900d5a1cc90d1baf5c17965a200ad563be74168e130481832184937172b780a1cb0249bc3ac8fe09d7892709c70bfd6496041ba834bb1c291d5a73368944d13561790a20603bf8b97929624c5f586ceecd1636b6cb09c99807cbb9befd3b2688a29a63120132b05b5420a0d984b9368338710b29a4c5a4102b25ce23414e3563272c2c91a33467aa665b40b7a18ac434ba8e1fbae3a7cc2493b531c6b642759625009cac7751496b18127d33d4733af3fd461c1cb7531223945eb1be69c8486a35bd49ab075fa6227465f97ea2efe552db4329bdf66259d091956a41a1d938940998c8e83329ae0a8309b521af642b9466aa3a52a4572a00cd6acb467bcd0a0551f4538fbf78db2e0668f47ae9f65094d4a30814371e20350066bc797777d79135d9f104f773289c2c20c55d4bcfea1a674f454c87ab9d809a1ab91a6e13747438a7eb7f814464426cda6c10d9456a34c66dc37766b87cf01a4a38e45154bf96d5a5617a9e3a353a57706ab5911dc3f50a1c9ccecb4590bcf8c4765fad91ef119b00c027cf5f30bcba608fc4667843891934935c49c8a945553575c67a1e3c80df48bdba8778865ad972bae7733c8c4d2787609d062b16aa61c25564955213a06e8d021d631bc032257d0618d1b0122491b8c9df8251886a2efeba199a850ca41bdf7c0362293b80a25c247820571eb6d6d798da2c207115500a1441977a3362a2c1366a15cf60a6086258d35a695690a53ee6737cc76a8edd47795ca913daa42d762996e4061f8353be362752fdab69a571fa02671432615834c8008284293c9c83ca3b1eea330a91a7522aa876d37cf7da439e2b31db5c903b17b9449e397659bc7dd668f3e9cb2cd877c57fa3ee2fa9a3b3c9d22e5c02a48ae494142e5d56664ca0ffdd15be6c4c2a063907e842b800912ddc9141af93839b17f37f3725ce36b9a7631e6a002a7676df2d7a72a740302fa5ba55a41fba7953a5812ce30823195cf26b8611c401242ba90487ca730472f30bc8975d78741051d91701b7fd707b7846ba16874a8984446d017bbf2357526a4882359edda98570b44aa2b1d968c4a2de84ac78330d2d2725f7a317c093f42809d3d26092936330eb51e93132c975096df35506fbaa429c67ae6b75d24b9a510ac2bee812ced4a732fd1198fea3e135ca2a97657608b6944181d062b1df05679d8d847e50a8668fc8238caa884b31fdeb3adf0f890a4956887417d00376543fb8588fb4433156ca8c7152ef466b9eb7534e9030980ae47d82c04f55d5764827fe036fe58c6ac9aaae51c115ed619e5db99f3f6143354903bccab9cb5448f9a8e76c3690c76732db1757d9742aec5334f79c0080a9c0f251b34f637f80253152b4c5d8124f302c3f6e15ea5d09758e42b99f15427ecc63976a0315644ed8ba516429a1aac16aa2045fef31a4a68c737f206fb26667a403c3af01d82a191bef752976c1962b53b0228513a3026a0ba7358162dd8885aa3dc31e45b72346a055026396b405ece0579bac0504082589023b4e0aa77b07366ecd188381ab2b9ab47287c44c14a36fd1095453b2b3b0a816af1c62ebb2e023247e4983bc983b867460158eaad4876551638ba5b528e0c74b9a081537b7bce3e1540062b93fe447873523766f2cfbb4c46e3c3751057764568033942b89b7325e639c318f63aacd82139192c81e45f4484073a540df8e459fbb9afcba59c167a1ecc71aae7473c8d9cbfe41cc27db6b72c804f64cc1a015018d212c9dbe320aae4423596b4fd544c6bd16af096af352c18a8dc1d68fa29df7a454d54b92bcb21a74cb107153b8386285c0479020c04ac0b59ba8392bc976c046995ff606f2aca215ababd04f031e52032f6c08e63149dec0a590a4c49ef55533735224c341baab9b0fc36771790c0301638ad09882634871196b55e87a5e7b9348c8a83d9fa0b1be81232864342262f57f063d38940947b48ae840dc42b27d52a01f4c624196c9198d081992934777653fb533e525cbec4591844485ee6a457f4b31ff94927713c9392627a0e676231318f18e084cee43501f0bbd708196dba67644145e7561fc1fa2c5c4835c76a5264a25d96d47138e2cb3d75297345910c164ffb30cd4c26cd1189264a602a3397aa6afbb27dda27a6566e9769a5f39713c311077c359f42971b65463a8de1aed9879abd512cb55b6e44f5c690e0a3f60768a778cc9cac5ad6b897379507e3ccb994956284a7715970b0e3f6189f0c66d99c667119b82d87a6507141cfdba46fcbafa8a2a1352139b1024dbc64388a3275f34180ffdacc380132eff35eaf788364f3aafdd6af9c02cfa396592282cbfa110792f87b6182b2f36a0a895c0791276d789976cdf09d2c16a32aac669647219086bd36f6bf631392510c0e0970007a88378b647b52fc20ee9148cd4575bb8b31b06449994098bdf77680a48ab51b8e5732545d6b87112884e35a2302f60358f651f8a71c0789018dba79bf5298a9f6ad16bcbbecac4f0cc9888cf55bbeb38264c885ce098fa80463f63806a544bfc194b77895a76b22b81b1098a8c3819e035268d22f4ba0339067ab3bb30e65506a86e74fde52afee944df4e4c745f9393ad59117dacf74a407c236b8b5a2aa11b1c9f86163df31129e885ebf68040f822314c2bc4dd12751851864d743ea49b68a93212d392845ac46f95715796a488cb44072ecceca89878f37b51d662d783900b6341a65d894771476fb942ed058b15150bdc67a3b7f4cac93733f735b81f8dc4aa5eb1288d761b0b74238a5cd73c8bd2457bc195b785fd31804d654aae06eaf5b08a365a472503809b416904162c17942fd27671989c553ab5137488f385b7b9519a69cb496444a7a2db607adea5c3e128bcba31f586c5603f953f4fbbb4381cadcb88d6aa7784562c6ef302ed398cc2113abd257c9554818c8175db54baf20024978e167620b672b28bf24465d2cb4cfc6c08739fb9696bc84fdd76b136b39b85c7deb4c10ff59337b4112e32bb25a665e9cf624baa86aacb2a18ea3cb67462874117445f913558c32e5eb7e1329cfc2d99ca4d83007467b80d74d2ec9832a5785fc7293eb466d55cc8904874bca5714c776579b253f86b17187b9c19d702ae65aad9d7cc23afb041e593bc41308572825a76b4dfd51a2bafcaa10390a76e08458c384cd0089668955fcab00082759de9147bdf581aa4a81f8f82bbea84d255b43e30b6728fb7a705c0aa96b794c7ca28730c6a1b1b2c1040fa24a98ac862ed74453c03a3d842cb0bc87409a09456c739ea08717d7a1061041c424d13bbee299c1ab1bf328b42314263f186e5b198bd5b1712c04402bf849df6473b8e78c4009c944d05277c68d6eba8555ec48139560922a7a142632d4168dfbc6396d0046c53221d43b7bbe01bdffcc672f214217679853d3c0939acfa7b45ac81b145e5bc7d668a4466156faa6a44ae2b9cd6caa5d42cb1c2ac5aa847cc6501ce998b2896652e2c901483acdffa695cd1625b124a8a88490b12b72a5cbcb67a29aa955247fd17ef46606ab5b5fda6ac39edc0128e46310903b32435e2f02158f678462f2bb230246455b7d307b5bdb40375c6cc507987ef616816d3a97545bc0f6e44c025c961cca33a828beb6480494cb9049bb2e0c8734437ca0745b55174b67fca6abe743c7f9793219a19a88298211562e7ad85643b0b680c957eb6b740ac142276822900110f3998f2b043816c9216c416d64e482dc1053928722efda8c35bba98c563eb4fb280791a9a330968cd29360860737d3cabef87d158419cd8794d15771588cb049f393d3729fe3276590488e97f00e63b6cdb760c22fb853352c2eaaf7340b204d6bf8cd186cab5f786e7f967a4d147686a690ca7308173843dbc0bb17fa4ab2788436f43009827946265e86e782b97b2b27b87ee2c0ba9ff23d6d620ac02124189bb008d54da8f0118a081a70040b0c722a7b5a97194c5641078b22446d7ce9b66ab9332f2ab85d7320fc651eebf8b93b838421ac6818f87673872582360bcb903ab70972e8e589465660e6e4b9295675416547c277827d667102c99297f9909548c52621846f5978a5d6971ac97c6df5cf1a3a42717194f112093b73642cd757b541c6d5094931d97afa952ba80024b5d76caa088577f24b86208da3448dcce24769dcac3af496b4ec8e634294c7d323a85128d4e20dbe5b7bbafa8fbce12131f0663572a4c1a4885ac49cc607578042c0c68853b661b452662ae194512b208435a72ebad23519e07f96f59edfe2a5297c351bb38773478747732d9841b5c26091ce45559d7184e1ca01b7c388a8cb030a00f66b47988c2d7d195332662cfc7d90b279248de101f77e30087881ddff4095efebaea305138bf83f0e3071f5494c3ea5bec8f775128ce60aded5edaec5de3bf5b4d7c2f2e18e87f499c1968993eff196753db8045e2c8ba8 +ciphertext: 5b094b6a42f9e8d31e0d9c28b18a5e323246ab6fb4a425fdbbd85e4fa833b4a589c910a3446ee9c2a3ff7964cc512f4623de3ad6fe3ad55f895c90d95149ebcf10a0654596fc8aba7caae1a59663ea958afee82518f78bb9839513d7199b10ca2c24f7b22169c17e7673eac8b858ad21d6aaca86017ef069af7170f5c825de5205994ff786ded53fe3352acbff1937181b2a29064e19dbfd316430a54b2369218365ce659e732dbb45721ececa352188d551ec1550938b7147cc5b2ae888146fe86b01750a85e8b4179e6c8a9c9adc0a881e5c5929299ed199964981e3c94b56a5e7720eb9ece6840d27861275e06d0be5a3057972604053d4835554d68e5a6f85ed8e2e101b2ddff770b8f4686668bd4ccab7a3fb58eb78e14e28f21443ab2e95717f8950e5b79de809c46cc434bbb592bed388d0c93ecd9144f41a7d053e312be740fb66f6be31538d663cc086cf23b66ef9771f3b2275067d553a0a1e6fa6b32673a1a2bf1dcffd602df83af95b5da97fb2a9df78a745f0fdde031fd21c0894234d9700889d825561c49c14134894b99a82c6f0c776db90773012faa4d7bee06877fd415fd407c7aa5effe897d70ba4088252fea08f56a5c16527c50283b1ee18db3e353196f8c031caba69ecaa877944125decc249842c140f30377c0c36525345dff045957be02ca335feaca4ebce4db5b5c3e7009eee36a4a9753bd2382d85082d01b954a0f207444e8a775582566a6928eadbf41ba235a1f0093eac2c7e27ea73af81849a66e2ecf8bf94a0532016ca6a43aed5f261dda9388de24e0e9b594b35259fbdbd46e5aa82bb52cf3d39574c46ed91257f1c49f93ecf6783d2b01ba5acee812a0b8469e5e4224821b17981b79670259a9977b54502bffaca22fd424a0f5566dffe1371ab30522184b533b9fefa5e6c6667f4e0b85ac805058a947ec77f61f50c447b2d27f4615684a3a914bd21b86a9ca58aa25526a4ae98ed34a78100a65a9124a1b2390333e96dc87460cb9e506331175fe9722f18761b1455688aafead26b76f13d852138d25f017279ad113f7b80b9f443973e13649dd12aecde5c7fcff30f89389fa138f6ce0e9e7bd5c383879398fccffa0505bb38e4f19cb6e65c21186484e9e10276fac9462f77b0fd7e251bbaa21ad855c8c56ee015ca8c973d31bb9440f98d9f7096bd2383720712eeacce4b8bdd025a9db914396139805b7d1ae8cccfd7491ca90526b8025176aa313904699babaaa0c76208ec9d3d5766b1844f8953f89b6fdbdba214dba86475633172fbf497c6f4343f78135db84c3e45e29211f517852cdad693d5882327f2529069fef977a7dea5aa0754597bb9793af511aefa511f678631ee1b94bb0ebb7e95bbf31381e499372241f0718fe2db2b8d4b30b7e4e9d7c9058967df46d8d2d160f6d241b8e05a4b70df811c43307f57f9a1f7d067994f6fc4e30d80a480842ba8ad0e245200efc31a0b8c6e3c39d01ea5d621ebec15a7a9ae5108ae12f8cca83f942053b31e4591401bd7e800a50d7c1389f1db1b771902e144d86bcf61de58b88dbcae5909431e81ab6d942d3af39c4518e1d4fa7f05b1a716006fe5e33d2c87603fb7de199a98252e28eddec620ab6df85137b8686ff0e2d4e76f4993825879c57c5d84e0cb4be1ec75f791e84df42ee7d7c3c77044f32996ee7b7d0f85c77d38f342fcd0e1be880c8bd2ef581278d4b75b3b80daa9d2c5c28a8ddd2758a3ed65fe42f7d4995f7122220f4ed660b7c2dd20916bdce54d2cd62b787f009993a51e0efc7aafa224fbadbeb6a719f8dadfccc0ade3fda88e7ffbc1efc061ef486625ad06ada94487874a7b3f7844918438729fcafa50a02cc7033266fbf052842fe95baae92db63899efe7330603b50f0de189e45e9600c822e1f5564c2fafbbc50abc2c4bca45ab2fb3425beaf4f3145e2dcda7e82da95b44b38ac19440963530ad99b6f732a2c06a98f12cfb8557b83dd515fc1284a762c8dbed28b21f52568295546b452c7b403096b78655c3d18927714e82380ca5c0593091acbd2e4ecf21891955bd78c17c90c58f27f575d1cd26c5f1be1e530b5072b95033ec174f1ab4c7fdedaf25d68fc7f4889d63d010250afa73bb30906610dc5ec4bc98e7f4afcf762e410a68f3e2bbceb37a1794c8b4396f5c6b06fce43c39194a042baa84bb49b78938fb97586732d4a1 +result: pass +shared_secret: f37800ef70ba18d14be289229810194a8f3f6f8c3a8e71d85afc29d133663964 + +# Official test vector 46, seed: "6b3996e8bc6f52879f2b7be012c44ad555707cb7e5fd8abb3457a298336d6fdc9eb7853008ff13201d5969a315c7e493" +private_key: 74e23285e187f22c6a1f0b5258081ca00c59ad4a733b6c168c39ae4994c7cac606422ab8ae07968a652c7cb130e3a1b5b65077ad348f2b213ef368c46c1b45ecf9c58fe49a86396285d554b157ccf2142864fc88df377c2bf758a3488722dc9111b39a90c58d29d18b0373801d761faab0845e78bef3c0b91509c7c9e44cf6a74bcef19de93538567564855981484ba0dc5a0553e921d302449663cce9c3aa1fdc3db0129999e011ea3172a1a3a504e2286550cb86156a23c74e0b2b2750648a15479aad813c4a576fc8f70553a34287147580b6a62957a26306cea1571963d4171dbb38448763b664752ce93a21d84101f79a66bb1e192b2c4ea0266d1c869226b0e110975bfc13e6e384c1883a76e5258c129185ec036a6063f182a35c3ab843523ca5c9b30b655eacd967847c86de2c169c40866f8b798555497ea94cfa99591c1c563264b54d369f0297168339379310be3354baf9d1ca6d7a79a2d0517e39c0f6412bf64bc57059b05db3888dd35e5af70fccd55e38e053b453aa43d0027f8ccfc0e15da1c91e4a0b3b4bb776df88aac1308f444856f3e888ae4753888b017cb342e70c78318a7a3a8142bb28326caa32809571d547c15b86437c655ebcd48bb2990493001ef4bbc7b4a02008396755b911e1782ddffcaa92a34c39dc8e0b9a48a33a252d6c547ca341f92727b5b40e92565ac466ae58000799a534b8277591e99876b4925a9a046644056a625a7a51431aec58c5d6b98eb4a0f40724e24477f6ebc52ab7859987871e623e93a0c081c9212e5b33e1c813c6a81980a5a670c1991dfc721ec62dd771cc9a30bb7eeb67ba71ae78c81cb802743b3589e661c4af476bb5753458db8c7d281575eab3f9216307a02f95147eeddb5fcc76c158701bf8a44d3890b65e6b43761a757221a70769b825b6cac8fcabb1dc155af64b86258f0ed5260522188ffb472cf64b82cb68cd41b986b560bd00b6cd99b805531076e25a2bd6204e264114602d6c1bcc5e9235c85575e66b391bba0d4297c9cb5508dc5cb3200b092400ad59508d7fe14703d433f980a79a796f24b82c60741a8276257c5b5311d85cfe1b8733eba10e305a3ea4affa5304f98a438325647a521f1b154a6547cbd8457545dab60ea7966a03b40e7c28ec1a22c4757a3b3c7dbb191895dc419cf609adf40c5fd86436506894a3932f1666ebd14a74c93d5e93511b5401fac02fc7280d088057eae2b3c457168b1b9e25fa81ffaa9d30c27dfb250dd5f287f281b12f1381657918eaaa067ccb07bc0a67bd4827368c7c0b4cb45d403159f9cd8de5caea6b5521ba173160561c9270ab15c85351cd46e8c4a3810587702f3f0b6921367e4648b654fb53d9627f573b936c6bc050a34b7e3c7c379a4c744b80230c35b784bf9a4a3fbd8a892450b4739488912b2b822b3664c25327d051c0236e05487671461264e2643c0aa7ca89a9c85867c817b714507c2b955371583611e77c783b68796267259638d4001e0555a19644b70b8527d9d66a5a3036e348cbf21200e3e07717cc83d0866ec7356412705706f192dbda8f43ab30d3f14d059190c1c95bec240e0c3271c2b755942183379893fb6cb0c0075c7b67352a76bc2bf7390c39c3768127e9402fc7e2716431bf25cc8405e23bb5830f348b4d00fcc1fb44389100cff58a3409174fcd39c5779c93336a053d04531942133fc92d66e3855043bfdea0c0f7b7795b0941db78a52d6708a83913cfca678f67000d873060777ed6f0906976ad12946b70c9b5f9e4a95a8b1eb5b733d3d92921cab8bb610b3ea33549e6371ae507ad34170fb09ca9d65c4360ce42ec63db51b1705b19205b01688aaaa7c00af97c93fae66dccf93d44a61ab5381326982ff2a73bc5b19e17b126c7a652f36154401a6d28006a383841f4d9998a06152d0b58c5e6457b601953536693918768cc1ec85b1494255858da9253693293848bf8c14a6bd362a2b91137cbadfb82a4b1f80a3577869b50716983730a31ad1574a3f5a62ad6635ad11c4706ac6912248a6b55cba70658deb6336e7344f1535e195722486866475bca60c8ba89cb591afc603ff0cddfdc55a705beaa1b99ae725a400454f6874462713e12698a55a267a96092be913b3472b0d9fbaecf20169790368f010b2d661f371b1f9a3c88556374af9b603c8c1db100ac3e600c042672bcd971857232fbe70e3c1280f5ac45d0e819a8495d2da89ef5086b110773c7d1539ec94a44fc0cd6f4a39362731f527de3f06f4a78b0dfbb94e4977a564c765cf8ca68658fbe27937a7b15a8671cfc8b3e779533d1b5c092826b3038b213550421004012a4cb3f12478efb0c92bcbdca4259b153584bd4b65a6b8d66f578f6f408bfe246deb5304ce5487b7a95c6db5605818e26d2cf5fa6adabea9e3a48b6f889305c016055db7a02a34ba5e10573143ddb8659fbe25c7b621e3494aecef037effb36b2819a1816788a6b410918745c2a423285c7e0021cb8c8793b60b4c9061a39f97ff1212f02d387d224b0ec258268a374b6e27ac9c4598fb78c387a7daa439280d79a6218b3ceb0bfc2e685bad8801d92b5b1a42f64c8890709c58c95bd8ebc43568c33362a53b5a12c052489bfd806cad36dda117b2180b68cfbb317d4bcdf745c50324e19dc7b17ab7f31649a57bcce91fa720052afb0b0ba5e8b57a5e4296b1c390da9a4f76a869af0b9389c0ac381aeae0a779ba588ff415858b3300d71b99fc172de950a95c3a61c9072b6f2a7cd9245da690128b9c597c44903837b8a9443865c785ff6bc05854e1115b9e3d7a70c7c40216ca48b1c6497062d61fb8cb29c71e5800b8e752e70b9a8655baa8408742a511ede8409301620f3bbc2a27790dd7058841432cae4cae719740835571ce65027e74d85958db506a8e9601c1f5ba5728a6e710a3d3d93748a7a640c460167482dcd6cccfc238326171927c6a72ee7084ee97d3e7519744ab8df651b9b2b69d4ac7cdbd9437849114e29550ba3321202906e9331bc7ccbf4571da4c6ae1a0b2797ba4bcc75398e18505eb02dc760b00f687c76f2a35f707f609ca149b4be233b3ba4739e19e4462d78950138cd1b210904b10a83356156a63631d4a6193c68e78642e7c5c0daf403e8520cc2f7438ae950d4136ad32684f2881c50c1a508b0442bf6c92f030f82653578c79fb4eaab1cb60df4870d6966ca5bd8651400a5a6d424749c8cc6aa6fc90b6514a8274e633aaa74435542bd2eaa354d65a32591819b8233834abf1391470085c9144b8239390f97624fdbc645d3662f8a7a2b7ae412f8525884081b3282390f8c35e2379aa5d234dfe9c0c94098ecfab31dfc315413c62aa80fb8a9ad11d070d02cb192d18f3717c1375401c0713437b0868298205162a78f8b00fb46ca2ccc6dad2717185b72793b2aa009419a6330ec508c8c325110c53fa0512a713c500631b36ac410c5a966edf1656419740baaca6719639987bf5e17444b4122650c87c884069fc52ba082837158b9bb85b2c961268284b5d8636b2ed3bd1781296de78a1cca44502a779b2bacb6f86d676355d4d527bd050ca8d33a12d059e6d697f986177e1b95424ba97cda6b6ae0191ba70bcb75172c354541c7742556c5fbe591f33b9624452392412f3859953ac21c50d5a445a34d94d492afbb01a84c844fd582802391f4f4a5d012a8a62079e254363fba52c83a399bb3398f6807e6f03f74f68fc788187be6bcaa5491ff666c98e43c3f860470380768f70b4987c6ea10411ea60fc7e8cba0b1afd72a52713a41a2172804ecb9fb60315e37c544555a8aac8089081c6c2695af8011bd991e1ddc87c841cbe0c0357e04489785222930a5d75b81cde91e5804315bb30bc93294367a4623a0c4a0ec8ddc436c7992b157039879bacbcb590490c28ae7c9142267654291c06a75237b24b8895404cdf32a073c4922c202a087bce07aa5708816818564c68237136c0a98119c2a6244a59051071414425b9230a6113cab28b06a058e67b16b9b3287f001422c276c78aaf608820836c863a1555590bc802a70abda52e4c430c80992745945ebd343277c222836631c652dcc425e1fec6f22383eb78c9b47967e865c6382231b4ff42b94f281c4e9a849477706c339a48ac2c69416d1e51914c751dff0b74cc657a8d9b0d0e21cb2c3a72fa241338b11f529a0ea9cbb8bd310203b29775867f23b7a6ed35890f3014474b51a578110cb1e1d052d2cd03a19fa06f1750279476642752934201c0832b80b552c7a4b4eb1118e2466624588ac1d0148c1c0484352479ea604758012b5d49e885965bf6ec29407a0d9d3f1f08826007a5a3d32062d2a775728c35116642149c2d449367bf894b2bffe5be757d54623b972fdb9093b0f54568b4f6f2e688f86ab2eab1c96249919cedc2369d8d739ab125e0d2ccb82dfebcd90240a545cdfe07511f2 +ciphertext: 5b726c1d492fbcff00124b62e2a5a166b83d928a64d0c68052b126d354bfc34e4f6b38edd661c6c407913602d55ce892fdaf631d96c4d94de045fdae852b5d7d88c73584663ade3e5432280d137af39c49aec6bd72caf308a6f3a8255b58997c8c189089c76a4d6c718ba0e01ba1b457d89e0413e89bc2b461b117c7fb011cc2206f027399c387bb3b8222eb56ccbe89c333ce3e46f2e507e3169a75f052d92c10eb3ffd04e5b59aea872c5a3df2bd23872aeb599fc0baa82c6fd2131357b0abd7638b9c8d9bdfd65a5dc9608dc0204cf88a9f2a5aa370f4fda768f7367ac51a5910f492cd4f2b9c05a993dd03f71b1dd1774c949d0e15f7f17831214fd0b33dd41ccd02aeb46fa66f63c17dd6cdd42b02ea18e1ad6183a2a0dcebd4da99dd49405be372047e4beacb32e237f37541e40e2daa91059ccdb8e956343fd009578e5d1b9601513ad916ebb324da5c3bcc5ea2162f507046477acccfae79d7ede561cc2837c0a95b32140bcd7e30c2645aa21a153d56358a8a767cf887f79e85fced38ef732b83a4c311ec77d67dfd164940d6263dcc00f0a76560102564913918741f88d22ad4f7aac99d560ac15b56be3b3e747ab5af9d9c87ffd2b5a7b964c2f8b3b87a13b64cf53a8731cb0d4e0535bb52ee97905435f1f7f0679fb55820160f200bbd6ac39c105387885a81f5c8e7f2d3ec3bdbd6604db8249408ea26f329e1faa5cfbb79f22f84da9095071673b56e003e026b373bcd97ff31ecdd4267ee8bd8e9865ab576e033a0094a96b391e9751dd988f340f06368edfca09403c2194a053a682e94524c955ed193b608a044af29357132ddc3d113f7bb680f9c0d2f8fcbae081bb211715177079e3e5d731c5f3e32f0703ec6c979d0601d628bcc9ef88bd70c020c05007cce62e1ce70d538b3109abd4c05e541b164d03ccf1d7b82fff255433a3357e71e4241354c40a5f6a6b83296e752697e34c77729ec0e6322f9f948f0764ab60842739debd37ee3791624ef110e2fbccd314286353d243b846b52ba87944ca8118da0e83ee94ae8e2e335016f57b704e379168102284b4e2fa4775c9949462863bac38393a7865a2bc5fb8593c856dd024daf88cfb786f98a63288429ba6b2963ca6d54f66fc49d5d61babace50df519ad4e24c7cfc246ec5a01f315a65ef60fbcd2f4d2cf0fe20a803834556d74b1a3fb0960b4bc7d9bf1494c6395c1ea7a24996b04b97f10a6907b66712931f1615c7b76d93e57c90b8aa57d70d2d8c578fc61cdabdd53b42e6cd59ae63b2beffc3e9414abc820191af70312d489f8841b66273eb164d9c3ef3a4d273eb11d708e3a562d113bd397707c1ad7fd7769d4e694270f250240a666c73295e541888cbbd10228b527fd78eacf305a5b7f609985bb869a97f642dad2b04c47310bbe6fca70ecd5957b7e12831c5c400c30d924eb99a1495de8f968135a5695cd9fb78e91345476ce1731443fa85ee0aa266ef0c2bfe720c3d27428255e01992e3b03a09d5c22a5f4a6edb203fad98ff5e0aa74535d6de951f68524f6c11f056897913a84296a3cafb5be71bd90038b8973ccfc2e58b868f61d95b659b16548e3f5a94d5651ff1921395dcceed2ca6afad67ef9ba1cfcadfe63533401ec05f246a453277beb31bc8636251b40310cdf38d743f3566f8aefd7b8d6834390c2035e7493e60bbc93a91258a5926424ed863f07282ccfcdf663aebc6586e129e1c89b049a78ba9c4916a5129a2727d5dc0a3dfb4ac9625096f27c476895e0cedf6fa75da79e08842e6b6df7cde91d4e090a94973c1d3c0da86e11c93adac0173070404bff955ca59822e7a3ffe600f58ed6c22207815d2c4e2ae4cf7df596eb99d50f731d5202232c6bc3609e071ad73cda4bb6f5d5fc027328f5ad44bc36aa9d938ab168f574966c493ddb7e989a04e1431803139965c296dd518bd5294385aff816c8bbf52136c18870ff530435a9e4c45855c6872babc041a2153d78151bcc7decb4bc80ca73c7b2724a1b9a934b3fbc2c5a310717677c939651f4252935dfcb2614d3223e4ee451ec0ffea2fec151ff43d5baacbc038629af6c684e401aa8bca7e385fd5a5d18b8b9c0f325109036fcebcee3483d2e6d0cf74c6d2ac07cca57261b6ed3ab8836e20c876a4a84499ef5e7e78b1465d2862a620efc7e21f45d91269458329d9e0b968183f720c947d25 +result: pass +shared_secret: cfab6ccf400c22dd43b0094cf8161fb453e5291fefb299719ac2e7000325d1b8 + +# Official test vector 47, seed: "730b65ece22de27d573ce3aea7cb021c415df210d228808d91d4f380070ffcb0778b683c71d4853deb569c822765f2a3" +private_key: 3642bf33d87830ec6d87e3ca5e4432a0553fa502878f93281671b93e87cb76763518841148126ccdfb6e8723aec1975cc8a3971e24a8a9149a9957620b0b211c4c3f942a21daa5182c63049bac82959429f2c1b4f4b1204ce35c7c683db5127a89699e23588d194574e603557d811af3104b7f23627dc046ecd6aa633a20054ac997625147a2cb6bfb62e44bc7eca7a019d41ff5ac505870c0dc648e209111ccd5827c750eb676058c6a14267ccb865b3b40da4e2476aff41b9227e18274c96e32966f2eb611fcfb3880159e6f2c62a9565c8e6c3a84bb530a13895f841ff354b798299ad3b68ca32838ea6b3920b3b6f0415b7a750295d33eae09022b8c17d7ac040df6b298d7bfdad78f868cb97d178d5c80b27b69ce03d37f3277661d9b9340f347bc7296d310041c996efa841bddd592fe4b480da657d47bcb4d147c112243f15268340b14ae26742b813934c26be8204ad984863eb44c50c510a5c5872cf334275c5bd2517c55772e9d5020e8093d5f21264929b1c7858b4f8745ed0b2c9bf9671d3c085e80804ad730b8e0865b82a6d6bb1595331a0a05567bd3af6a641918019d9a89b08f227640182fb8c7adc6278473b2b8af4c4c9e6b8f8232215d265f433c7357fa8c91751f6cd08b678240c5da1ebc38ce3f2735d3320713ac4301ea1fdc1990b8909cb718b6344c45a612633376bb9e003656ac347305c3aec055689c696eb01ff62b3a4fd0272b10cd778572667702fa4c2b7ce5305c413d91596904b872a0b051a255af18119d00e1a4654c05259cc16663674365708843c20df18b95d212efab1dd9485dc4426782fac42e258fa0cb8bc3896a507107720246b972c457750bb98ac03c9375820046fa7021af606c9344599ef233de25667592b423e456a659c0389b86b27a0eb4675693c029c489a4daa1b5ecf37afbf80b8fea5cd9d37beadc9fd812428ec68484b8853cc82f019c9a7419115e8ac0972836d42bb459611ba06b82a59592f5440134908f35d182c0a765f9f44b66b293f471222d648989b61b7eb8586e004e7bf789838500c2aa2de031661d4b7c46737772f4a86df60e050164a1a998e996042e22b7db76c3a4575f99199c5851c75f901085b21f6f693b5839557f259194590e84dcbad233bd9b670049d47b67d91616db28dce64ec552712129a2abac23b4922fb4cb6bb3e54f7ddb093c5811a638cc3330a1170c46de338757f445df01aa42e056e6d59daf690d3b4961365a6927db368a5633a4ca087fa74020b0b7884a0afecb5bb3d124276b38eb8c19c7c8afb616a854b444f7f0910ed6c3eef93722c827e80297e7f411b90b41ed430258e091e5ab151d961af1e51fac9aa03172c147d69e84274b3eeb949c8588edac38b400c775849cf162932bdb6f80fabba816bfcaf51bfe9174cfe0191084004486814e938153478728041fa06a78e1916d20465370e55aab5c993ef543c360bd082c7298250678f979904b402de70dc4f9403e805b71955039b539784b2e79173d870363d8b677aa5c823b8980062ca773ba71bfebafca6399b40c8109f4848db6cb154a4846cb9c638c4e8b10149de52667a21d1af419de65c030cc7bc8586c45a615dc346ea4073f4eb131e0607740c73ded62c192a413e955146f86ab9386156b3ca110295ced41977b147ec9e73f934ba396a27b6d6c37d2460e4e15c0af6a090cca7947c0103489c7dd9a56dfe62f5c9692531087fb7b7a75206765f34316378673c52b6279b0db8c8dd74049052aafa5467ac9fb7686cbb904f24afdebaaa8a7928de03c02e35c14e4102b560d8831c62c44154758582bd901ed9c963fc558ed076c107a87f0e49bb2e1585e809ba31788a925588a0c8fbab37b3bd79268eb359982063775abaf9622024aaa9730cff8411c04401cb58a4ee90b83ea547b1fe8ae6c3a93531511298331ffc512ec195f982c39c9394bb0933bbbfb1b46fa0c2dbc120c8acb03953e188a6ee6b2852e79642ea3261c8403b3497b99ba7b25fb99949300dbc9bdcbcbbd72ca935242ae35d27cd66003f22c4918ac412f3304ee92b740c86cb12362df19353438569c16935edc8af7b6091cc97c59996ce174253e9b2612a54dd9399fb11a5d0fa3af913bbc66e1874dc7527381b593966014fba090c537fb848ea86c2ba929c7b97456ac4b5c5007b27631aadde902ae1917dba8cf2936427fa22504aa2bca42bdacb21ac9a497eb1cb8a4b096e69294620386abc48f389c7f14380b03b10c614c625427c8cb9962f3d75409d923a56717882169bdab15e4426dfdb26072952255eab0380a88277ccac1d24939c98900d0be4570b3df596aef0a1747b2b0106c31e9aa9164f7745de23bd1cb222178ba13f7c806c0b02ff9898774646417bb2fc3153167c1eb707655c548b63caaf3fb3f37771be2fc972d03bde5286586d406b00902dfa0897785481b95805ab79dac44233af99ed3f53bfd6cc36af1cc79006289563456fb71b54c6e5e894f47d715ba062e010841a9e67abdbacc31dc373ec88ce8eba2f96381edd02fd0b88b47888f5084ac264c755c62a663ca9e30bb2bb8c89dc2ba91ba652fb79008ad91090c0614d6c7c674139ba5d57d26dba05e7c47e2107aac4cc28405a7d0d415e2472f66c40d49e094add494c19175886474b5a6991e355738c66d9178c94bb4c05912bd9d709290a8b562a358814a14c50750d17054273c7587b7ad5e403f231964bb40014fa7121fdb74dc23875a148f0f021a8ceb3cbde6842714cdf1008d85b0af62e65ccda27d9fc2a12e415801bb22a865b861aab5cc3c9093c3164e6b436a3475e5359bb8c241b635c351ec3614f7a225d522f2a0b7b181a1f7a4ccc858014a2222ba5b19767154e27b2667e90aea352ae7d3c68e07b7c4d0482ec38aa226ac4f2b63a8da4be57842a4a65b6e04c2166327be09a30128bcc33c154031b94ee13aa5d60f7708347659b4d73bc500432bf2401861c183c732019576a672d0c10d5c18afe4364e9ccf67d670b29283d0f0b9f91130a0437d7450acb4d76af99aa4ea287a6bfc73fbaa3207f58fccc775a811a7e6a0b7a63bcd87f04f1eea0d57ab7735315324282b4818b8d4346b0ecbcea3ac9c0a7bbc17a955617570a511447a9b8475f7c602135f57255e2412cb6ddb0d22c30159b43b9dd58066d81d77f7a4e263603e193ebf671fa3283c69e71a4ac433297867da2b2b7eca19373a9b4d3897689031e58284ec8779fcc4cb742b8712b11a3d143b02645a99db61bfb19c26a5902f7b3d77302a9ab059350925d8e1a994b586ea777697c389f9cb6e25817e07c5716db9ab63f451dc89a852031bb3352e8ba53643c509ed8590694b6a07340ad0fb2f1788937a0c45cf9a441494ae447c44c6917f2d7b21bdc6b7d3853bd8e33bc7ea75e62535f95096a9d0930cbcc0a210c2f5b81090d20a5d7c0346bb43ebe6b77072859f13a6576c72c0553da80a4ca8f03292d86a98246151960e4b15b758b28e2ad2271c9ca70f92061c8a560be21a2d967c0ae1b0ca446a987bbfd888ce4ccb725b95050d03134f3441f853935255bce8473e88397d5eb4cb8d6acaa6bb8d5f5003a560b08c89ac890b77aa16304f5cc74822764d82823b317572c5bbee018eedab6cd93caa924279ca8932a8858079197d412b7283e084a7fb9dbef26d4530c1b6136619b06fbae495d207a3c326910a5c2ac9c7b919498bef5482532535d2551fee95154b2082a76c0d3b16ced88993697b344cf7be4742a3180c69f6fb589ac17fbd03489b13a0af951ec1d9776efa82cfd0276e58c553b2046b4594c9621e0aeb160d7923bbfa53f7c9c2a4a077d51a6f38473fb6d7a2b2b99c5414c5e646734fc48c56c18d30997d8073afcb822680b321c40696092a7a9f9072cd034523acb15154354d697f27a312348601d0d1170beb4759510330cb0adef4cf31ca82f7f15bc02310f22c92dcbbc059e34771725685955dd5490331e0bd99829692275598a77a310243a6225f392a9f83910afddc172d124cd295288a77ae051031f898b42d792ddfe8c0902944b68043bba48a25c27323f07d4f6a8c6ecc33f13948ad12463e834d23514af69954395a144d1a4df8f526c0331247d16d05e185ddf04a94a92047bcc976bc17f6b7488dd390eaac4b608390e9fac6c2829eed0903d544b3ff08b2c27a779198387a8112e374ce4f5b0f5f898101159462929c5417bf373420811b4ecbc034eb41aec0888a30976428e2a54463072f3c9b55341147c464dc88b55daa1fa7920c22fb6c8225b2ccf47692713ded1c4a76a479bb111e56cf782a6cafe938d47de49bb47e732223b0bd1bee7bf690d1857044eef2aaecfcda92e6bdb853f01617133d65b67c0d6cc83710c053a18263aa91dbdbef7b85bdc370460375a778d1a31d01c42b66367ed8d9e8f84551002f552f0e52102b5d +ciphertext: 933b2c004331af9c0e4699fedc9fc3999fcb8213c308ecd4e33c3ff41ef3cdad8f02f0f0bfa8db24218e8c81f0934b98153497e7e36fb78d48322742c84870a8b470dca9ce9a017e215d33b9b09d8477b5b292263e4da46ded3ecf5afc0d9472d7690d24d07eaa35644cfd30b3b530f527b4dab5df72947af1a08264abaccc588cee00be666e987de5f0d84bdfac563879916b912a3ba625e16ec3458c08ba116d8411408a9a9044fcb2fb39b2db31bf446b840fa196a6b61134619643116b85d14fea5389b2b0aea25cae45197e14844e8c4b33bd73b85799832cdbb3b5fb031bba251182ad85492a071bb4bcc5476f3a9a5f4c6fd740b640fc87379daa2da4e0819e983da6095257a6cdbb2e4a59055d0251480ce14983e598c5c4f362e49f992cee925fcaf504020134f9d26bda51f88006a0e4df6c4229ce87c19139220bf4f27ad189d9c6b2fd3f3387e344632e497f0f9086752318615850a51730732009afdd4fcce3226645fc26a98de7dfdaeac5de30fb7c676035ac267ec29303b6855a458682baa9b6ae49911ebd981f14ec358857f34a3e396fb6c4cf83911029ff15f23ebd105fe6178adec98efce9e5bf79478a278fe128c7521a81c529fc8544d5c9344d16aefdf7a4da73f4155737238c3d0bf820e1ce3e26e1b5f26e6dc0bbfa0e910988d98c655e1dcc1dcbc4c434b2d2b9420f98323e19e2214ec7e470848adc7c77a9317ad64d4a4b05aa4f72dbb269c4d30c98b9e7a39787f7f77b519afcf42541fd9e2fcc228efeec98bd4a021cd03d5c3526cbaf28a2c075fd83e6c47017cc1837a936f3b1a477b4c955df76d40bc4c9e3165c672fc617b941743fc1d596ac2000bef5a4eeeef54db3922c27755c5c58bfa0e3f2a97b475345793aaf44f371dddbb8c0ba11dd2fb4c6c38d1eeba05d4a1224d59174a0fdce7c85cc57c913a47c1de5bdf883810f833d9eb441e2b9164fa00e84261b67f56c4cda52dc863396f9a7302093bd657cd0c7349309acae2e7ce7b40deeee285552e3c31976917774052dc8c0b80fea4d1c0382825d5f3ff1911c5667b5d9e727b1fb5ef17f2040ba56397d4d8f1bc4fb445a054a39b40145e3457597739d6bd8e5d194e3e6800504c9ebd25129bf575bd8a859a16c056c9bd2e2c8d0d9c0d5d9ad81c47f0f6be82bfe80cd60fb158297942a0ed963ec522c0e5f58a5e7065c113336d55370f006003986832844e940f160682e2f69dbf6edb9d4b6268a087ba28663cd002152bb20f659107c7fcf337e37ad086a5c072bc632414886d328d7fbe79d7785404b550f99510c7f24c3b6f455d3a12a820f26d6b2259d7bd0a0981af26ed4494f66bcdf4171fb2be6bfd9dc1e7a183e499a068a1791d398beeba47af660724656406f3a581ed42bca59ed18bdee126cf8520ad6e7a3c7f37d929f8a35abe5b46177ad34dccc4addc2fb354b0dc266f8a1966510a68a82c7571498fd4a59dfb0004a3bcf9d88c7ef458733577ae764d90e29dbcfcdff40cdbaa1f8963125bca7011c4aaa6246be182651d97937933e1cc74927bc67791764bb20d1a04805ab073f00a9a5c6e74f35e45101fc31e8571757d06df9109283152a2348764329724ac053aa5f1a2a885fb745ce92914790955436b9d4cb59d922e1c4e07525fbde26ce9cf4619cc83888f3790fbfffd1932ca4d6a1fbec63d72a899ed0897090ff253dc371175b8c1db02ae0ac8438cda23c5533a113af068fd34d2b23eb52a30118308a85b6c851d3ceabf8eac3c6e2c54cde101580681b90eaac4e099e9eb35c49e80ec4b08c1f6adb547ffd0618ac7300fc2c032fe82ce1a7dfc7679ef0c0db03b494e48ca8ad2251311761b0839cd3d576980461e4faf81cf27ae1d13e1c3886be97c6da2ccb43339048c2706aacaa160d28771325e90a94025faf4bf4cb7445f318960308bb59fb756eece70cdb134c7171eae241915712b7e3ce2f373cb2ac3d26435c13034b21948f9a462f1eeca57a9a34c4a7b270b9aa8eed19212d0bfefacd8c8011c2ac38e4a4599baa799a9f06f9dcfa1518e04f246296d85cdbcd341156615fab90d9713ddc433f73cc595916bae88ba9a9c411f506b9ed5d66dce3ef9f350d51baa6a11ecf502edd6a2e49df6c25c77c0c814ba99abe4df7208dc80f948408b4af3289379f1ad6cdbdb4165c683aa3428d83cd091cad7aa9d59dd8 +result: pass +shared_secret: abdf30bf8e4ed92c05241b6f00895dc0d56759ac668245a88c7ffa59cdb48fdb + +# Official test vector 48, seed: "5522a5a891a9a9b5514f4556afd8df40b9cec63a01492f0cb8a1db073a285a963e4a9ff2376c88662f7d8d241f8acf17" +private_key: 58b513bc1a5f348c2e22a0a8c99bc5178a736854b211c6b4e191b497f288755843e306c1527c87ac5393c98c77669a29299c660bfc0d67453de33cc838d2c0e2d561e54600f89951f7543a42e0891d846f347a0e2fd956e29072d7b1565be798d3a295321cca8209aa439b5374602da08792d6c814fe3b0398a2743cd258a8e505be98be9c5c806c7007abbbcec5caa7151363789b22d6210e519649c34c56ab5b7a8318944370c30d4c16b226490d738282e63881e0b163e11b4818083cfc7593b068eb7c8711ab06553164382a87a683267957485df51dd5f5b0135bbd09e0be01594b3a134761e3a7efb567c4554b0d4b6ddabcc50c036144b1b88484a19ab8a94e168cff620330647dee43b673664a01407334883cbd6379a61a1c7b755d28c80921416edec02ca326c8fae52b4495b991335d253387682716f283675ae96ef431b98a821dda681f35c71f5da09ffdfa471d915574f23391072c9d8b50b9e06bd91055395958bb911a399c8ae9eb2884154cb7d59aa36a4d05b5887a23962260a057257e7e815859f53c85059760857882ab38fd8cb7a2514d2745867fb348b4f1ab4e8c0f200261e68474dd45394ce01c1e4a07799ca7dbfb5b3c51c7c1500edc768bc389499427955868c21bd3a94c3694d588700da5641b242edc152f1c1c90e3ecadcb04b8512342a76027c98a6af96a0958f775abd890fa586d81497013e062af9aa7e7734017807d89076a102bc46924b854d32476b1b6ac2cc922f0afefc6c90c6814a1819e96b429991b1250817a9187755805956d28a7cccb043469896d326df5477699ca89081cb44cc492ebc6671f3108f0795cde1422d3fa8dffa15e3d6040300b462f57986b355d7fb12454bac56d66aca19240c70445c166cda05a8d5a0763034387b50c32df573e61c921cca5b26ee3095b0739cb7cab1756a097b4c5a24555bc4a84681772b1ecca530a41c7db1f2c49c2aaca0ee363ca9a29b1040a5c31c608c235543d36abc90a36d8110badf3b10af267f6cb11ebc7c0224175d2d82a0df8485a7a754319952da50f48563937517fd4032935830b47f907a9489011b93a0e9a3d999b3d13416be914a4d9a4196ae573d73a4bf1099dc3c19dcd2b6cad5999a71a7e25717729495597997112f23f38d54808bb0b86c2558c83bc5a290b0ddb26a9493abfac76e9d25fbc888928417f5c2a1a1e34a355343a45c4309822cd83bc55362a7b8ee521fc816bfe22afc047196f87b9eb9092700723d3611dc5a53e8f9108e5064a9183aaa252ae2024b33ad93ad1c96796603a8538c7f1a3af202024ce12cb4025192744bafa338f325c10e1544e18a92509639bb62c4372ebc39965cab0d1317f91bf1b46a4523bbca018526cd681a3082cdeccce960c6d2e5b317e2568b2f4a25a8cbd1844b1dcfc32c0160f12f126f0caa3e6e37d95db68deebccde353d7ccc22e204bd8b016f9dc1bca5c8439a4cce98ebbfae4111a8776b09bc325599cdae20c354640faee43c07911e08348a17e75f483a3751237f1eb9a43a49702654a4a0f21c3d6b591d3b4add7c3320d8083c223e889080ab6b364118cdd1d42038182ce07bcd7adb2deb2531a2536d2126460227604740cf54bc513c918058ca527b48b0ec1c6d6cd4549b5c18d50a477a80cde6e87efad1284a71869d46b47f54465b9669e1ec5ed18505bd8c49bec69abee2a2c69c684db270e5a7a69846738f2a2416148098174c038964c8149f56097caf8840fca26d4f47a68d333761db2109372778f56aa0003f402b3237b079f3a8ac031a41eed50c218673b05a5757d29196a653a47b689ac25a2800c79ca20bbdb02ec6b430456435df3b7d81089cc986bdb246193bd1a153796ca5f1099d2a8c23810cf8467517085ef79b7bdfa7ba0c1b180b8312fba0999f87c8bdd518b5654075950cd27861ad55724766664d8a3468a8139201cfc9a48fcfd0839dc41b0d61798ee6180bf33335c78faa7a6e1a31262521ba7fd79a5ab0854c6a2f14265e418212324817cba46ee849713fbac9bc11a8de51376ac02c35f45e21f642732cc132745c5dd1cd1e45a31b5c9abc56055a8510f5fa71eb56c89d7685ceb4afe3255c734a59dcc2b5a9910db6ebbeaf4b110bda0270fb568c3c6a59130fe6390d12e4c27fd191ab43b4aa8a66c4326e681cbe1207bc2d5aac1ac59ef0a8aac0c8b91f7c23ac35abf566c75ad3b01d6b1dfbc29db4a334b44c10fc25808f9b8acdb4a2ba67528fba8ee942a895d5544857473459763e92174dc640bf284908023146fb553b1b8b1e99a7446c5320ca17eb6bc497a330ded7b1016a1c28d23964f24f2188b2d7ebb2bbe954c9d9271baa7e429c02dab991dffa49410ba6ab20829ec41b03b8ba8756b5cffc640e928b24361f0f007226f2b5315a8bdf8a10aa88581ce5a140588b69b531f5112610c5306fe41d4c018302dac1dbf69863b6bf99d892072591a0168decc69f89823999095f256c52c6336acb063bd741551bb855678c4e8bf90191a38c2fc641957312ee758e73d88d8c8937b9c6912c59ca13854a4209924db71fd8b547a076a340560155122298e91328a71773e1cf117920e5faa8fbd847fdd027f734c06bec0bf479b97cc11d626122d1049e96c7643a6b323aa93e10521460c7193d7c85a1a8969dd0b0835b64ade28df777a1c70646b8e55578ba9da6d82a96b5bbca1b2e9346775d24b987535882468b3e9263a1c74288695722142d9ba23fd747383832b2a3b6720b21cfb5f00a178c51a878992d666872685cb1f346c77b86a0174ac955b06df96ba094101330958452074c57377f520bf0766881752d70c0a778415f9bd3b5d276100f00ad563735cce0952354260c153c3ba227181a21b9f8166dc0aa42acc241f6051624b88d1659a2a81f9cf92ce82c76dadc27bc3b018f953a5af66ee21401c02a4e3b8b4188a36be3818ccb82686cc21d50614f1f000721f8445323b4920b3d929c1362d91ef948371b531096186034d61f0401c09679c54c5a993ce85137f15f50466bace29512e260f990764c31648d6649d23c800750a08f759fa84258515c4625b856eb368d917c36768a8a1471a376ab367aab46295707e94080bce47dd4633c2b50ce0b19bf47d4a68c3519da21c205b0c9128606ef8a7405ac525a12b0c613c7ae96aca34743ca9679bf078d5d016405f336f6088a9652204154648e4b3f6872929f02670c7962f4b08bdda9beb2a33a2babcef40cc4de288460d0188fc29ca85b212eb40f7b158aa4a38710e0608eb150fa5252860058ccd822618961cf5c18a01bcb2eb92dda84597fe9b345e06d14a597917a4748949ce5f29e60a7ab29740242166c5a651501010bbbc73926a7c4d0dc6aa415240e0c0769774055f9882aa4330dac1d8500747bd5264bb7625c2ab58e7917cd122858135ec09a3f0128837669bb37911903854d57da6957d70407c752a20951535503847b17c536a69ac09a84ca64633a4fb9c26221296190b27c03781729456f6653639fc036fe17c4b66b390b2204a1361555323dd307572b2caf24148dfea74eef05880205c164da71980974240b2167b3c3200745ce778a4cab786a0cbb132188158c3111707058884358db6ef3d04480d7ba058c7e52e4052c1898e2918d98590716a80bd9a3a4c3d53cd8111005709e708b04c6d18bb1577219a39d26a496582384f1126fe491a2dab7b8adb4a07563c687c4a6056455113c6fe9b7bd30cb7fbed2839a93a584c76af5c1422dca809cc623079ab65cb146a3011c38c1a6f3db134b72583ab9331d418c7ab513d77b91a612053f217d406babaf4170607a1979ea637f8875154561f69870fb1682a62052fa36a21bf94fb4f24ea54c1658d8bea4e2813707981366a8d9655400db440db8c27af57ebdaa8ed897c7594712e6881c81f5b79557834e53c9b537ab69942830fa60a0c8bc7518192e52396ee15d945b9f8df019f8f32513817117834a9af58ff761a1830798edd48fb571be338b43140c44d17b272db6aeebb0cab160342b49cbe2b47a6a5006b5cac09d763f168c6a5f329b7d1b87dde69542a4437b8c426890b4a5487ab43a98ef94667efc881a943b33b42c776b3f8af853fd59c2d3031fbcf541247100d22219e67094ba89791186bc8b7b536fb6438aba5275d234adc5a9ff129fa7d1b5c5757483f02980fa40882aa0c72c0ef233b0c2931f1e15cb7d528b471c50903256e54a87f8c16f02b3bb904133bf60136d603bc57c503420a8b6701aea4a3b4052334f75bf820c2ed9890bcb812b20d9031c269af9598acdeb8a52bfa7cb804627acfa20285753264f3df670dc445647c881e112b71095f109342b8799c6382723886f5b8371ee58a35fbb48022d9c107ba6fb6dc5fdbd4ff573fd5a08f656a6eb8cd20679930a31caa6a6331c4b133a6838c223ef9f769f6246 +ciphertext: ae2c5cb63dd84bdbf16f45be0e0c322955c2c3cfa3fea74aa30c6706a28e5861a92e2692df21654f0722901fc86576d0378f662afb915da4ef65df72c0d9032f43de8b69eb9e37abc502442fc3be17a539a4958350e42ee2a83adfa66d393d94356b2f81706483a2da094284b7c39d4c7ccb4c3c6b48552fb4a6df7d2fbf5fbb473ee164680217a54fef6d1a8da22faedb6ddf9683adbe5685c61e5410ca24619dbc0b9cb728fed6207f75095b73b4f2733401182320dafd1574b815ac1d92bf61fcc50baa791b540d25083786b221070b9b5ec97c69a2ab709a2dd82224d50c7223bc620a4f142ccba7f138ae06a9839b17f31b5a78cfff773595c34a7092c5c2a67df0392985afc227f171a22283e3fc5c12cccfd8bc98a1adec1ec8e610008dea6bda2067624a7bf003ccddb8b1fccaf84650a4175fbfe299f56191a3251fa0ec63aa6198b7b9f13490dbe41b23dd44c5015f82299f2e873a576b7e44a3769d5b1886b2114b31a5b2359affbaf2d9156e5ca200c36be07c3837e5a35be36eeae315d888da4cb2e5911ec897d28ff484f4a13ea45bb5e645383e93f39b90c600bd6ee8899c5436f18eb9cdc9f7670cd66c42dd182edcd9a1e03c7c7e6cd22bdea33cede3fe43aa7e9bbcee5bbf6334e516e4228112e3165a50acd9c00da196d83f1e71f97fff99912807d5b174377c81b5dbc734175085a1df2535323d821601b42bb08cfc508eba25b75eb878a175e69b9704d31d8d4c626705622821b0fc787d741da974a99c873b11c10157dd73728fa96d979bd825265c5c2fa198cd18db467e391ca1b8a1cd83a3363e763bd0dd1eace13455553f0d0a8b594d2f82443a377ca830540522e1a9ad2fbbc9e974e63dab823d347e93d90c18190a7bb4366e3fd0c81d4e10534056e80c483b998c645fbde1267a0a7e94a5950942aa114615d38ad0b8336b13289d8ab76ff03d49f419de79d309e515d668ba644aa43ab75919f1be4360c0eef3cc0544a80d8a46d6cd9f5bc7e50bf3d22cfa338fcfb015af7459dcd63b066077198fbf468a75ff1d4277c04c6dad16866fe79ad52873165078d3d8ad1ffc1453b6dafc3171235acef1a16912ae4aa7eb4e31e5a3664b19f01bfbb75172605d237c23d22a2251dcb9bac2cff63e54f5a8145fd2bbf63b76edcfd5e87400e50bf239a83693387780a182f4066d624b7ea1feb629329f80a0c9f07369a6a70a710bbbd80a189e92c9de920a4dc1fe1c90e2bcaac35e2b0e76841ea451dba128c0317442de8c7f95dba18fc667d9b4561302e17114597d9bb1882e35515e8a2ee995af7796b8d88215addc8d41daf201ad155e2dfce73610219477b8b0c2adefa24b27534d5ec7c35d0a2586a14b1a796721c532aa269f3859e50e2fe4008a2aa39f86d82bb99ef6162a7fc6a3818d05b69c4af85d2d16e4edfa291af1a9babfb7d460747770cfa5ff0b20bc4d6fc2ebe88f527f054178b1daad883f910d67f36787029cff7837bb147179c0869d2c87395988bb925dedb34a4b8221735131a558ecf6a4c5718b01dee25147cf12a11039ef6de8001bec3423b54c75db145894a412e282146f59ae7bc1d88f7586d29ad802e8ba080fa6bd38db67e09d8c3018836a6e2f48eabf60d2181651968733272db494aa086306f274e02292df35db37ec2cc15b2866617e9e4fb34144420bcd31ef50fdd42106547fbfb2453f9d7fcab4e3f25d56b502f04f0d51d9c725698576bf32b7a67e168877cfd8aad057bc4891f7d493a07b626c43be7610b5388ec6751568b153051dde7922b4003b6c34f3af807d17e9630cc452a49ae14f6d34b4934b81896f4daaded277c1757067c12f143c552a83495226cd6805a73d11724328533e087b980db0a6d22816da01ba0b8f06d4afebc893d1b6bf8dfa5039ef729d48bc274f3a8fdffa73054d8a562b2683c6f758f9cafb7a2b31dc596f628d081b659fdf08151a85a9b3575eed8978085dad4625832f803dbb7cc90f82b3186708a7f4cc5853ca3e1fe958cffeecd27b685d8b7bc3a6707446ac2a29865cf56d1958438bc09a4e8d11abb0d53e1e8f61e8bf044c6541415569815295a9ead015913dd9979dfdbb7e3cfc8fe520a79e8191881e617d78ba0b9ff588a55698b9deff3046009783e9d9ad99fd270ed0e3a4467486303024fabd673dc2322190f74ac36f2c5c0a3dc36b4f +result: pass +shared_secret: 9ac4dcbe2ce4c1b26961fd95fbdc719296829c8107260b8a21cf3dedb292eb7c + +# Official test vector 49, seed: "1853e72329353b3f89ae6a1b1ef700da8ed3c10d19f9e61ee9252e28ebb0e15802ee43083a12a0b7527088832605e3ab" +private_key: 4ccb897e841627f45dbaa7b00b670c7bb17786a89a4284047a2527c9464307c2b1d4072f357a09df72a768b752e8794218f94bf07a6d288507fad04380b13e397c80ce956e3e96a604d668530b20759438a83b35219a6cf39a44d2cb697453265ba04784501bd310560e7cb693a06944cc2ec1fc1201e5a105b239d024a41ac50103335c170684c9f03727185858506ba29c8d8c19a150bcc6d8dacc1054bd7ab4c054d390ff8484861c8c4b823d3c3b11e31cb2e4dbbc7592ca95e983aee58ef4b6ca6227a2d024ba7b383b3fa752d6c9be8cc91e6905619ea17c0a1b24d2586e91e590ba51c1672442bc9c7af0e6bece484a3b96a4d76467bfe4b199d22646fb86c74864b39a60d8ec41e7b5adc791c1fc563ff2e14ccb8228f1944cbf1aa2f4258d6fbc5ea7c46282d109b8a87cfdfc576d74263be3c866311a2ebb1ad5628e14975ea8da31b7622245330788c340e0b1094ad8c2a1a1ba14663d749013742235bbbb6045733e7e6519cd1c8593e1baad83a50003b73900bd69e6cdaee53db7a7684afa3b4566375b693c1410aab368015e12517cb04b3eb6b824767724ec7718a403e5e7178c01190c289811b716c79a846133243ff383ede452f15b7912f0b763c08de8d0a2c08b67b3b41f39b63bc7bb7601a0ac7fc03dd4a656dfc89179c34f05976be42896ffb49759222f259895dd433ed73b4e77a715127a3876849e1b039cb8a71ba4f2cc640b93986974a46c15974b7ef3b3745c3893b5327848590ac2dc44b5e032591b2acbb055f2d336abc062a1ea11388432ab2a7e402a62a4ac1ac5503ffbca57f2505a951c0ef2b2bfd36ac5e4a0ae116c189aaa95202cc280e08dfde77952bc6566513878c4077bd45fdb87520478073501818d2271324820ea038f79059c871a1b19625fb60a9e7c806dbc444fa8261c1540c890d315b1ba2bc4857445a539af555d6ce710aac7b9dc15a149d1bb356b2321112c6c530a63a9ae1d1b59dacc92e9f919f990509e7a66dd41cdedeb8252d692e3dac47db872ec36bc4513741e31a65376abe99a6d82e6110e2a5acf501e3b785088a4298639144560c6d07c3c39c9364ca56dae571abfb13bd805cfa19054e8403493f2cce7121836d01a83561d734aae163481eaf2ce8519bfbd6aaa1b29ad09f8705e8582ade2774161a2f47b03b2c995eecb024622b287e84500369ce1a71c77483d1c30653a7657f953b0503192c97528b4d92856696d256bba012bcfdbd8c3256c9969819268c40944a9015750cfc255411c196147470743609356e7ca800c2635615337b1383267bb339934c3f68dda85bb582c7bd7131f6041bb21f14aa0b25df46bcf1c6b42b1db5b604c17efd00f6b23c85a3c054c600f9c40c21d1810f6699bb8620146a4c2466cab86b1659313290d9c182da0555e417009b3ae20f6cf1fa128d86307ca75c0046c269df20f0c98342f39af8c00918f93550c668f9e6c4423f559350185494c5663ab81bce72919521baaa81680e19e38154c4e0809e64c184a9396e1dc813de849d13a7d6922cb41b2346dac86f06996f8a71d3fd09b44ca60233c9229750263e88c10264694ac305c7390e2b63d8076863865047c80088894916b54756278c6f9c0730f4abacb129842d1610db66892c52616f62cc3e26f93e22b736ca9f43c16d3826f5e324150416a8c554874d094493a135111afa6d45cf1f58a7177b242fa9e9b185eec54659c887005b702db26a05cf53dcfac6179342abbb707ea449912d9021cdc5716bb469e00baecf754cea89b36eb6b1c130f5d439b4ad903f09752effa555f182fb1c578855a44d4f9048479ae4551b61d34048ff53d911a51c547999af5aa76500ff4b8434f2043fb583e5fc5af9c73584f5065f1e465a794490a1a296bc8bd43c647e4a3283b24c4ba3301b40c462dbc20f28bbb17c1a0706a5fa084268298899f0a0fa4d36c74952fbdca323bb3adda17944ce5898b9027d876a457d066819ab43d32a9a04b2ee3378c23e6cbd25bb2b317767866406d374bcf327b1045cb96f656fae8228295156ce26dc2770ef48322972668c5c746deb4b57b37040e9aa732c79a238227723576ef822e95a6c80e6151f6523fe6db352dda9f7f613a3601b6d61719a21c3696e4c9f80500fc918d96f73135fa51010a83491b407571126d85002a60cccceb5393b459cb39b4dcf175b2134cf515c06b38cb0ea33d8c34a7283b99b6d0c9e90825159cbf4bc2a1c0f131580557f243184bbc7498b39266f669fc161150482de480ab196ba61dc526f8a46a2ae3336a7abca9e2743fd654e965b3b33ca0b9cbc8c96095d78a971a7277496a8c123967e8c204765a864890b762d34e83570a8dec5cd25333276555e7644eeb5ccf8004579c357481000ae9a930a7313468d3a8b6d5b4da4a558a7c1318da670dec758c98c5048144843096c2b781d73a9f215c2ca0481ea5aca259997c8479256841507717b7dd01cfe1755f8ac2bf1008c2c61b7bd13810787185cdf16a17c2cf00bab7eab737a641cc12ea6d8bc802e0661730628194c40a7865a3587cc2f5b0ac1d328307c55388970b96c4969a533e04b425e528c713d41821ca6cf1f5bc74e64859c49b914563ad193c626c6dc520143a755132260d5940c76e20a7f07987fa7c1a4d1283bd700c9759871f973fa6d94fd88015cffb046555b36559420bcb98ce617169465770135b15612a9884586d0232d44606632c50a9d5beb3697669c9940e1739508c360505248f501dbbbabf70e7cffb24652b782de5f4a310a7767826bc73886e60e51230068dcfdb2b3ef246f7701d65813e54d78ddbc34cc9bca025914883364c60576a5e0c5a863a17a9872b818c070647170cc46f44880d4ff46d68c4694442433c823c0ab39656b715e0443e8eab14a990c42a031ebefa6cfd54c32fe4521e218396d53c5554c60b93cf2f1cbb0062c6101686e5738896621e44b32449c297d968b16c80ac7491279dab0f84749842195aa3dabbaddc2457fc8b854752d33cb1a5499dd53725bf34bf34a68457e57e4b270fe0f07323275fb99b78aa90af27480b6440217b01867a1b7a5a5885fbcb931c524395cb11a406a492c4251f9c09e14a45e2b86a98c72f1532664879a2d5557fe9db6bcb2ab6197892e5686b2e1ab35a3434a77a65ebb6189aa00e19fbb045a03fb767866184c5c2e2b155f465bc7a135ab25cc5415b0a42aa17595a32e2a370317414913278c18837f346c3a54be5722520315332b2b43ed4089b427cc8e24f10f17610e40882b4c724c48b6315aa6f0c64a4032e4be75bb6b0702a2cb7a11cc6aa14bccfe91af25642513425ca475fd7e7c387214294a36fff09bb1388a5322910b9906491bc923a2644259086bc5131e5d67794d91f65b24a0da06ceeb63239456e6c3b1cf4fa04165879b5858bf60664aaeb45b3a238b1a926489a2d395473d3a5173fb37a51fcb5ba0c9cc3eb01debc383260b4f5033bee258f66a504e64a74fafcbd1a46076ea00a02246eae52ba6591a8ced21b58971f289847c508768dbba5ab1921c14982c9525ab4b64285723954d33c8a35396db137c0db48a39432da0abc3857c5369b236bc03ef562a8a5e4211986a385b8ab4d1745742411a9712256636e62976f99a72d75c654f8574737b6ad34c129a2eac22fe166b2682840f7043d4339bf699b68d51ecc32974c161136272f9012219bac6bfa8950c6016207dc6566d20b916974743290f0a52b8be51c9f3c239e8b6842278417a05dc789bc43fa1ee0671a51ba3301246ba780ab71295cbd20ada7a07e5593a3933604ef972a711349a0678a60d2af2434b17ee940c067bd89496c90d4b9903b9d146a49c36138dabaa405499ecdc02f791562a5d446fb358702b2a5eaec93b7f4756762b3c17b0e8d48ceb5d5244965168fd9c3e6495d1fd578ba2c168805897cd351202059b5a4b96687465741b077677583ca7411c4331583308da00ab5045ec5943beb2800b30978c31031675a84dbfcbe6d7b27b2da65152c692fb8727a485b9641888b1b36a25491ac76045792278125b0a3735f3e759901507ca4a2aa12dcbccf3c35c68873518a4fc778201f0b960c7b551f038c6201378ee101948629dae0364e38ad079320d2cc35bfbc8ae7cc446526447d60b19a36519daa8331a45f1e4308d564979a5179073130594cc5fc07a1fb6b5966277511544611e018f3f8b76567add2c94a0da8502063c66c54c3a50644e43b81a93c7cf0409b505c77f5d06d34432bec389a137b6fb9f18da05426d03477ff0b8185327c37f449c8f6398680c78ef7d26c51bba9665cf58b72cdfb115bcc2a0715b5b4f40dd01c7a0585bbae739590cca5e4b82099b66c7175c5f858851eaca730fd0c55edf9ae451e07bd366d20a7237801f470fcc2bd9fd7bea8322859b850f7882d362947432913dd068c01 +ciphertext: 3d0c67db088b150e110e9a395a143a94c0bf6fd9dab5ff681c38e1ac6f34156cdba2b28bdfcb62ad002b1763e31bcf6316df977e6533e12536bfa9933780de5cffeaed2969902df53f34b1026543523dad947decfaa8ac43b223a5bbc59dd5c7647fe3a17ec79a84e89e820bc0ccaa56016540d3c821ae453dec695b4a2232a896264e475cdc16cbd476fe8778d57e5a31e6b3e6e9dcdc96c69ca0d25da24b2a8ae65e6f8a9eb723594f8e989dc10078e20f058ef8e765c96093e9faea1a5919c27e69396b53c5e87213373ed900a8a763b9cfab262637f40038826fb7355e8f0cb8672eb3f478e577956fc339ec67de582e6d9b5cd578874d3db3d774869b291c5ef0b2a3393fc4dab94510401ae107eb65560d9685c14b06a788fa8ad177f76b176007ceeeef6da8913c82744ee66813004ddb6591a02e745a960a53a06e824a28cbdb197591dcc02658d4f7bdd401bb829a9f3ad2b3cb3093bfab0d8acfa0a66b6dea77e9c905f7fc3b0063f3cc12c190ea6e574b9b606fc5243ae567e88383b2d936e89c2e12c23850470d09c219568a9a8de66bd77612a4f13718da6f0b4cc20d9bf0e437c859ceb6468713159ff61ba9c26f9393fac3fbef93c6718d400ac9b5816c96e5258416df120614024bcb5e7eca61449af540993e27a067203237acdaaf8b0e7381e3413de5f4eaed01e7092d40b522e4508c3ae928996a960e4866f78a0b5b42a7bf43298b4d05169e815e82802e9afaa2bad286ed0fa4a1efffaa1e3854aaa9bf12121ca7c6711f6b4c838eeec2a9b5da3e4ff080d513e18b71e4a71bf9fcd544ea44d5438d4f56bc269c63fb2b4f4de5ef9551a52b7cd781d4a6ecbcbbab8825e2fe6693b41f34f0c07690971aa6243046977c0c48713b9f2c320686e02bb01c789d9a6e46f9a3b8fb480f4d7c755bb5c093f4903a5f332ed9a805d024323635c4a51667394813f01a634c90f6a82a16b6bc1a2b3dc7e25b0947900051da0e5101900fe7c725324fd5a316057955ad4aed9e08b67405dae766aa628f599776b0f3dfa2b12c2e40e480d7c6cd4562f0bbb206eb4478125b5febe34c7c81924a3fdf70ee2f21ee2b3fd0823ea16edc4a5e07f2adb10422e4df4051725c6a99e4f5b8f463eed69d8921ce36e7ce5b6d14a2be719907d7c547a16ecfbb733868455aea386c52bf9adc93bb1792bf0d8b056386c6311015f47d6319c41be520128cf2ad3e1e0e8a568c4b3c07e2b10589f6498d01cac1f8c2a50d20ef7b3ffae9267d3cf3e66cd57d6d42a87865131d5eaf10f1345c1883d475f7b29c8f07f04533f39dcceef2904ff0c6d86b1ca1acae4f6a20a649a95bedcac1d7e87c17cd75ac8b1a636acc3187eca7586db053a6595d7c39ce1e57e839065793c2ec2072371cefdfb9e62c559c3d2ef9b736a61a72695d4349d933952fa9796bb4d39cb5a88709474472a19da3b7589cb01a11de4dbd79e0555f6a290ed047fe4e31a6ccc35a904f4d30d363f10421f5a9de22c059a6ed0e404ffb62b0626b0b0397c30c59d56ee18364c8371d095d1cdb0ad08dea67dbeba8e2883ab4762d4b2ca32485a6747893c03f137780b105870284d523cc92cdb85bb94602bbcc9736175a3958629fa45f26e6c8a84fb61f5a0619ce2cbf5d4178aab325b393dc1c201ea7f751c8916e5281db2eaf733417f12c3cbae76a2c891e7291f54b8aa7e91c05f4bef7f75d86e7827dbc8634f7b4c19c88371087a5c80fcb48aaa051329e8b474d0ac5b606b40323327cab61899c0f12ebe3142766f70da217c57534983041eea96206a27926e4b296267a6f555356f3ec387b2cc21d541560f932e716de3a67fe1afdc193027a90c8b5bf14dc60285ca131a643a1231a5552d624bc930e7b5965871c85c5ba055191c23934e651c03570819207df6e4b467bfa0f2048838ab9658f9abcc6a0a74d81058510d435ef7239a334437cd0254eb4ae2760b51cc84733f18730ba68f48c73cf3a211c9a8ba65d61afe39cd6d5e72c4589b7a9dc4a49a2f05f17afa14c89d4ecf1fbf5769cbda70a570d73851694e1c3acd74f80a25a063843664930f168cb3d679ec883b82c471ed634238b58d43bf732e71368839c64fe1a54e0d8d4c58e06f20848c823f49dfcc17517d60fa56bd5e496990bb973c52596eae1077227e33b04cbf67a30ad91c510bce5f9c480a273b205446e +result: pass +shared_secret: d1e8a626ea8c5fa1b89ae3c05f745517eae6a8710dc1173083209de32cc685b4 + +# Official test vector 50, seed: "027c3d5847ed4470931141104f25b19ae76117cbb64b224ee424ffb782e9a0e988839e0bded0df666fe8e5fcbb5dbc09" +private_key: ea9b6cf63a18d0045a6aac4003930bd833a2109bc026caa6b9a38261ecb70f9992ee3a47bb4335eb80314e699734098178c25f924444714a9348b980ac7699111856623c9d9f2b4f7da5cfd47970a149c3bb882f84146e7b8562a549ad16e447a7c154b2eccb38020b44c6119ce9663d34a646d6c31cf296f5b65ccb055cada93c272ac018902c1ec93c907bac9b7790cf5b2c129738e573c5d84734ae095801863b654b740fc216edd2064c230e6266454d064adc932428e6944c2a7951268f4310209cdba48262036921bbd35c71d8728e46b291f9e865873316d9c0525c702841c3acf3252bb36020d18238d36b245c08ac1e8a28b75c5b29a810d3c6087ed058cea97aadc75f28bc92bff3614dc04c825716f79b363e971ec215974277c02277322c1471959ca699aab4662acc7fb62120896b14a3a25151280e7741bdea18e32a72f0b267ffc7b2108094e1378b169093c007c0769213e28b9249acc9b2acb5f8e7972ffa629a5b40fbc9773e921354b31bad947c45d079da092b5c4b7c094573d1da2d378c8708d98e55061b9281c2feebbcb62a99b0c6a05291345b731788e6879de89d9756a8795839318249849bcf7e432d622a319e57c0a982a2e034be75771f06917a3193564c3231590c74eae7638449989f703c6a664736823e039a571431535af0211a1931177a4761e022bd925f76913c522b128fa54ea1a04a1f2196508a2d65106950437f13d463f1652691ab919d62118ce743440b273217acb03ccd67e16cf85265b67c8ee56a4cd757c860372ec1f01d7e61aacfc55f072423abcca70834b550a4bc8228be40bc08e723b37fe945f66018b6f4808257607a9612f9577d6bd86fcb3c149edcb7d8d28cb5fa63b72a41d42471a0f8b014f8315e1ab6a894b2dc70c71f782c00e52c3f1534d46c83b2d2bbf4b0258c919307e9470e8027e5b261bc36c33511299e1a990ac68b6a735c3cb39baf03af5b4206601a7a6c24011fd56a965190b0b675d33381e5320d03dbcdcf684f782cbc2b80791e00a0b27913001796ed9baeab103bdfe2cddcccb0395b441d72746b5c13470408530460b473466d6b8f69ac8518a3b26c9ca22d077a31a3640538cabbfc852d3159fc26730fc5af89c5b5200a7636e56f74f99953886f80b77f6e22055d51048cb4122bd525710a4ec272628cb50ce549342c314e81253e0cb2be1d779b82462085829bb2ccce74290e2018ba51d1cd08f00fe0870254f4a73fc637d0f5c6d8f56ca376690265c4b7773bdbaa0b08880da2d82e79c87402c38bd60a4c07e219aa30b3566b78ded73683fc1dbac43d033559e81364f8a0cae5096243f15b7bbc3bf7cc061fd2921b12a5feab37c8b402ff97718faa1ffe69122a658804310d9ba4555977b2cb5a97e14ac626fc4770fcc8c325b4e03472f8e62ae7c37918a48f6ecb15c0a01ae920a84b4b7113a74bbd39bd3318c2361401f1c15fb95875ffc55bce76c77c3563d302a2794b92dc800cf9f38c5809c29b4b7e0e38c340e458bb00b44d7a11594a87ca96bab666277970b569e5c21f574563da3dd139ccafaa29f8a79578a7afb0930be8f8914a17415ebcaf14d13f5a4037a960c70884b43c066698cb4a004aa9e32a4b1150a98b708e185a5b4ba09e4678290d33c13c14137a2b61e19495587190d34a2ed82aa0f9861b04e51344e4cb0eb60bad5010d635c4811006a130470459262d028fa6c383417ab81586ae5cdba777071d687c99dc9ab4ad21692d70679e0c4dae3b1243294146d6bc1bb4b8d6b6a3e8da24a27c62961ccef556359a9486db3642102c0c129224b2c035792649923010152c1503e797635905dc442db389acf6c30219e3a25538ae1e696b74576fa7997177343914f45954728499b3cc26c768a3d476ebd7120b336baeb4c65b72c8518357776c774cf48996d6ad205c092c9791e55c727bac7e916a2bbcf994c5f9c4330976b1743894dc024dba7997e33efd944405844c01235d4308c09a75548b43555a8a6ea0d212f5da6c8427862873149cb6c3ce7a07ea39af30e7a7505caf30762798e84bc7e965ef96c51899341567c1324b6b07a984cbe7aa6b56cd52702fb106b1cddaa02d50362cd12737308e3e93a45c9c0a3420c4b71167d9587a4b2188b6ca993b37800c878b5adbbaef794f4f24abfeaa40eb1c5763fa55b7369e5be8754beba6be9319cc3a482a53ba93c417bc9a5a3030cb2a247177eb11b63a672e0039fe71735ca9cea99168d1634df2737b45324034492e1d3c74f10239564b23e39585734c86d98118dbc944dec28869ca8be7e17b39bcb0b0e34e257bc9ba42cc782078945094eb1336e516c62b00871d12c6019700b478b5db43ac419b2c7a50442d9458ba4b853d5a29ca946d64b6a6e6cb3485439abd4a9cf34b5921242ddf3611289a72efac4101b208cb7598894a9ef1ec38e34a58b2c071b3e6738138bbaf416f246072ead83b354a0832b98b551b7210095fe9323e1f75bb99905e5bd961cd778d32c1be94512a7893c062f6a66553152d1c820b8825c25938c0348a3d2206897ab903e6472193b5c2aa3f1bfb22bce88bf3723eaa8292d5446546865218d5827a5ba0da5354e2f6c81eb96cf0f28efae54935138273447a953aadf9757319e03a6ad19d7e613c2cdc7f5a3aa1891368399ab5c5337881c782bec48f9161774686204027b6fd895ed1b800db68c2d9d529156b0a8db90f107964d8f5c860737db2a3375df20b7bbc7f1ea57ab6e2a2eb44b5f8e6980d5233a0791350f4ac23210a4bbaa928273294691b7c441edac04909472e8f6714e99bb7de1076a121576eeb1d419122d4366023bb2fd66937ed940566ab07d7b480b330937c341106c3bc01f3c26eb7388ce7404222bccd7cc42e8a56909239a2968f2da3cea3c6695cbc909ee481b4c619f1e7ae6750b4d8f691d70490134ba02cfc97327c9f14db4bbfca7b4589431e0b8fb8dc61658110dcb675dd1bb46db49605c66534ca53d918aee579557e82c733a3841a7338f9947d92d4379b3a2d47469166bbc20ecc4de2f7c768a0ba4dd788cebac30eccbdfa11ccbff61328f92739e12160b83369d8466421374380a1a2c8bfd701a869b49d09644266d300493badff092390e894102028768a4592e96306130550291ecdaab48c711e8a1822cd278b80357856a739174b3da66795fa8375333554fc92298dd92b3c962bad035424f418b9b626d32b5383005564b8cbad0915a977b1c95710ae490bfd158a2c780e14c85ef92a02a2601c3538c1297772d1045bc4811e4e7893310413b4121201eba6c4db8658378fa3a6b9b919c9247c40ef39a7d564bf13a6c8ec575fc3b58f42426ae1a4944cd638bcf8336504577c65a7b75b06649802bf898fc3337ea3f783bd58bc85e33c51c91412c09d99c310ab9802ddeb4e977a640eb05a6e01984186b62f3237230b33cc4721d984382d003a4472496c163a0c23aa7527a7a98b45260794c109c3ef645fd352b778f06c6de40ae1aac577698edc053e951931e88b75619a2e3a795d9d7a015fc39978ba6832da41dfc1aa36d53351321107d33d00d934ce079f53c1ad114b622ef09fdb70888a861e8b9334610a9c2a5614325b9265219dadfb7eec92b472c87c0f0181e73c580b9ca8564bc1e3b9b70528a30d0c54bbf48b3001c46b536c51e15c4d0844fe81bc035351d919212c699a455b7f0900121a77360f4aaf09443e9031ba9286c0ef18a72a0c6afb2b380452379fc14dde6a20cae7c703b8c367bbbf4ea43df773bd6a3a4c051caeeb66a236244f7bf5a837731655a73bf6e7a3413459cbac0dde329e59fc9521fc2009e480d82711496a5871f33d0378223243137486504a209d9012574b10561fc04deed84999baa3a936a9b1234ac4c4afe451042f828cf40c49e632c6153684448154a023684af08ce13b204ac025991c5e44b63201073f22a50c935b9bc1c488aa8a704bc178ab0a752595cfe050b341a295f9b851b67a3c09010ecf297791c746ba9247df2a1be5a82cc8f904e1553b31d53710b0b0b7372b8e9c0b7c15636097316d46587e07753ba05e03f7cb3c6c78870a7ab21ca99db30217245a29fccc3ed80364ec661ea93194d472813a3cb0203b223b909c5774f2dca50e8a9753e36c33d92c278a52122a72fe389f0f962ce5d3a1d9f5c07000919e4761a07282e016854579b1c2e7c608630c6b2a6a1bd96c71392b9ef15e04f7bcee414cf5d9a6ff701c4d2586506248f4bb6bd4ea4a45fa79fd92aecdecbf20d7ad8534673832a0d6ca13c561a446aaa23539624487767e4a195dce0e2bc6a3fd1a73e918f297aa031fcd8c14925529ed33b83ae8e7ab9b3999082be47443720bf6b573a95207d1eee1b3be613a1985b3d6f48dc648787b534537addaba4ecf14f02ab317d36cb9f0f50222ced7cf029dff8a0d3d2fd9 +ciphertext: 74696b4c1a221c93a233381becc649df53c59889beaaf8cc06879dfeabfaa190fc9d7a9b6995bf4d9571d3277188c4db8552bf90a4b51787bec3636efcf8628e199204f230241198f517345d76a105ac070cf81591bd22bc1e566205b7d01c16c2da03f1ad0682d1f32ddbb6a2ae8f35351cf5d5bacdc727d603c3ec4c5f51a9906a3f12bf064d27a5b573a1b91f652c4bac4155045d69669158e226676c7049a439fa3213ef20cc61c8f0b89c194f131e172ccc4c1f6c37567bd910eba09c21abbd3a8ab275ab15136f6fc92593766b930983539eabc66e7f63f572fac05348c7cd6ceabbd1c4865e346298b6df6959caee42fc1b60df6373ff46fc935e881b478a0983c1467c1a7fd343693996668ce1d8dd147193d85fa44277c5a21c57d1d420e1e5caefe51049285ec812dd0d4de6117ea2fbc9e9d74221c4e8340895ecaf684081fb845ed994279e1ab22ebc0ddaa9eb5066052aa9cd371894035d56d125f40bf836ff159a14dbfc99d397b703824b1a7b74ac15514905fdadb8034c09f018d3d87c4d2c2d520a2bb2a240050fdfa67a157bf1b17931106c859256b5f06da1ac1666337850dd9d4fb1ff879fab3a87b645c0e1d22b11599584e67e44eebe9d3d6864538d86df728300268f0c2fabd12b474c7fa2bde4dd04353cf54874663a029e2ca6017a6a59d6611a862e3826a1f1f18b20be5beada3bb1edabf9ef0c0ce83ef22674feb2147c769b7534c4f50f80f48cde1db0ab0934815e39f963430ef4f6b4204016363e105e258e733371c8d6a8c517150cc75cdbc6dc28c98359ff083306a0b5215ba1bc17e660dcde16add252177d931b6d8bacc181dcc5dd285825e083abef17438904b46d21b2c3914543f34e3d958e41e8089f89f5aa1af040fb1258ddc663925b55fb486dab814a45210f0ebdaaf4bbf2115b0784862c640677fcfdfba3d05c47e2c5ded2f6c03b42bcc9f87fae722e895bd4f91ed91207f8bdbd4f849c73e3b53e8a5ac14b500ad19fa5e9675592595250c8e54795e829443d9c3b924efa8d64a3751e34212205ea88061071b7b4fb8309e0dbc0bddd329a55e30d4eeb3369e9bdc2d949565f6c4ac214530f926b7dbc5b6bb9a645635b3ad1056d36606c0bc34089f50646f0bb948e3ad50cec750de11a3b4436c572c10608502d8ee43dacd12b20183006070aca57dfff0c39edb760b29a8d1e2790825961f8d3d2b27e4be8d06ba613f80422e40d77de5b44793262fb2e5c5d613f4d66f8d6e29f5aa312dbb80eca37d9faf6b98ba63b0dac2622ca7eb1a53ecf7ad39a78d34dd787ebd686c155041adc742d8c13480b36dd8c50856f2fac0c8fe532260b6e5e8f79d4836033bec19a96b5c272ec3505b800b555a763bc7d673a876a9ecd4f1e64fdbb6bc4710066b5c1f943a53f3e934b1f9d30e8edfc2aac8c775bacf9a447626838aefa0200df587b4a4bb930341342d9bf4af28e196abfcc98fe8c98ff3ef9a318304680ca5221fb7f8f408e6f5e56ba69a9286afbabf3d733ef1b958cca8bf57c2b7e23c1209ca90d6e3e8f10ddb54ff29243fc340f28b97013f15cc21a92299e4cc45bc007ba13c69f3ba4af497aa17b289b3379f553b3ff92318d7f5f3fd55691a094761ff55015be61a7ac24128f29f552ac8faa5ed8ba3a8654c035fb08180f1a72ede79cb6c549475cb1da0de23e42fb887a30ff16732131bad9014c58364c5e91bc12988ca31a8d9ea5dda91411f7cd5e8f4ca503ec1df40ef53bf0893265241aef66fa85fc15c07726439e741ace97300bf89fc57ec746e34c40d9e6561f69ec2871ab520723fbfc72213d7dab6df13cb96311b502423dd0109659a93b5bf692eac025369a9f2ed7fa6a30a824d29aff97a5299c91280c4f9256677d872ec35df835a20d621b6e407df36ae67d769a30899d1f3ee148b7a8b2b05ebb3fbff4046a08b9691b5036d8176d72dcb6227416f68ce7de42d9afe1a7b20cfcfaa6803e043a0b11d614473b46c09751538cb9acff02767b957efbb3834e282f439565d3d144d5823653701c19a1ea7bc0a204d72ca7641377f241df87cc98e0e355877fa1ae26f91b23dd2113412bb7c03ec8f27da2612e26ea61a911a276cade74d287f57c292b4991808a66c8c25afc3f1ac370333fa9c9261db06e9c6dae2446026ac9b95641c60ba622f5547653ab4b654daf578458b0 +result: pass +shared_secret: a74e04b62bad015f2346f2d44395cf5e7c380cb5228c55e843ba8189ac2fd7be + +# Official test vector 51, seed: "450751d4401737459c6d93e6c5f2fbcc4a3af7cd7250ccf404bbb817a67bab7b4c9d0ef4570bfe25cf919da331c31d88" +private_key: 09e4c3ac7c3e706ac8eb1a3c09ecc4c26a683a3b0141298052e81871d820b931a79e4a3292550098c93be9ac0d9539641825928d8398c1c5082550489e1aa671b936bfac883e23ce83b24122a28b20b5908b4c5d65e4c8322bcae55755892c8896d9ad6c4b78f1d616aa37c61f3b117ca77643fc65d74746b1110c6a0c6abec7131f79c62a5b90d6ca21139682165ac043d063b0d4644edcbc9746c498a55d2ccc1121996cd82769c9f388e2c37e7ea3b5e4e76da12c4121ab1aa40a5b8a045e5ef767ba1b2da22847424049e73ac213f7333a9664b836abb08650e1370d4e3693898a802896300bfa14ed3b62c8156f76f6c5573946754c95e238136f33709800c589c38e76d76d946581c554aa5d608d613b2756963a3cf512d823afd6d4afd428601a1c5c7de8c58d3727b8bbcd7a704b2b33b161536affc498e5d6ae2d1c9a3f9823dbb32664d36242185c6da03c11fb5e21905dd374641b569ba4d3096ac5833faa0641d40ded086973a49413d8596ea97c76f4838c37824db6c8b4310311501cfde747b4130c916927fce26777f7978f2a0a3c89c93439ca7e00121c5b2074f775acfc4239b0458038c90d71b45f83899c7b20bd91b1c697a12eb958f1618a2b8c5bf1a8b1fc765c7346b53f2c8dd311cbb8985d93e9184dd73eca6036b1a73abb38505744001260c21f123fb950cc550563c2e5240af922c5caa5dfda1afa84b23ae8420960ace7224954dc08001513ed63a4896c96f45824504341f8b8b84cb2979947a923e3883eeb3ce2f06ff38a7247504c8e1c6ad0b014836001e12705534847a676b2c824c04d71467a58cecfa97672069df0376db8c23d1400ce62f1a0c3a258b763a58077a1fa01510a8071dd939ac1183e3bf22f880b5102878b1317a67a874d8e211aec3a3adc921272e756ec16b4694c2e398798f2ca8d7a668ac51711329b30483828f41b2efdb9823a957d601381d2e86ab2502680f1004d67887a890336b218b2940eb60262f6c1593b500f45d18d2f081b5a956ef5b1817250452d87128ef0126b98302ebc3dac33780e260b61f30cb5c81bc6a54fcb362a64f804506c79922893e889bd6c22c16a9018b9a522749950bd5ac6129126dfb2409bd512f5106e3e757f749a5efef79a5949096b47686386159a47ae22456257093f27455c402574ffe725b59a7afe89b036e34e6190928c70b15f525daeb69c71a08f1f611dc84748ce219fa38b89b06a15f576885ea73a4f773932ea14823c404f2004c056bbf6463268a1a6192443dd06b92c8cb0d11bc9f0029d6b4c9b44304cec028c6e46ba3248b7f2912a1854a1a90229402035f1519535e53777a494e5da9ce02195d7646ca2993b38c409f6cb3c9baa7f461bac9a877cda431e1b5244ade7351274bc69353437f4cc9641111ab74e07a734b1f0be390b3421a598ab91770587af7f16cd043990d0d73af2e861b0f216b53865d42c8e8e1baa52735f684248f14b8020461d974c2f79bbab12d0717cf08d72c9a9f8f1c60b4c01362cb4c16620b6ac5604661728781e1f51cbfb7cabc24243235c1dcc19394bcb115bc2a2e6443527f7c446a3ac04c58de930b5f19a9bdbb34c61c3c79a2ba4760173cb55c5171908aea5c1e6860ca1898f51174c7ff50d92e87d989a36da409db602ac0eb8bf13655ea8e9b46956b9b80a4e97918623469d081214971b4b32c34c5bd9bc5d299eeff97629a0c8e935816e1532853952ae007a6e9224839169bff49493c13a5842aaa5b32d9257c30bf36d53870bef195dee5819e185a5db768e950986ca8092ca371863b442db96b62877bbda7179d5c009a9626c6c8537a114ccb571c714644bdc9449d070bd9b35078fd71e862aa59d57630b0b3f0b17361a05aba7b906f3d66c2a1c52da0135742c40501a15f4b269c66683038b4bcc9aa5fae69edbd765e8cc34c5b31f0f56008a04c137f9507096c1a173466a8b496e1c7165cb9631e0b039ea8bfd55374d674a9d2ba84dd29cd200600ff374fe128a8ee4ab3b824126ec3450367784d936ef927e4339cd05fc013d57341ac63530c8808ff734531c5e802161baa0697bb9b8f2545e36a2155958af41d4bc95e27a8ed5bc5a24386fb73ce97b628d972eec7703575c598b7a95f36c89586474cd413396886aea374a0c4886e4185a5ad8ca7f1a7df73c6af1282397a6a9b94c95c8284a0d65c3e614cc73159fd71bbd699006d1b97da241c470aa28113a24eef9856ecbc3619bbdbc25bf1691a241414cc3a816433c6d9466037cca4dcce8851aa9a182fa9e7ecc47e42713e9f81189cb5b68b52389095544427321ac5bb12000371a1e1cd96b585223eaa02218543c6f32a777d79c3de28d13dba32818ce41d13e2eabbc3c1223eae799057c43a2977ecff4a5966a7e52d0554a8907cc39495fa80339160fce96742fe5679cd4c4648910ae0715a9899530723be9b551e404b88a1c272e72b1b3e56144a4974df799eeb20170862305e647951645de729da99bb4fe579309d4abeac03ea4d029990b3fa8464f82e4472125bfb98837e275508d161dde593b490461e6508276b344bb18b93cc3c965e084df68a68af14e6bf37b4dca585d0621a4f32263abab1684ce0b1a5fef971e8fe18928d38477572e55596e35ab6270880c2e6abd0ee9080e75850155273aa38c0bf588e02006f5837c01063360773ff79376a72380d9e123b199b561007f1873a4ddb715abc93d95c7a8549407ec94cd0b928b30e3cdb15804cad99ab2202005675e68ec6f71f70082139b42e5bf02abcd4a4988ee0a16415a095ec8b94d2431070a710d72a596e30ed4588fde91670f3ab70f35a5f0870e86927d68f641faa10f962941e0026908ea7d27084261d190cb62b4354a1c8f06ab864031341637929b1274a1c97bd62208e681f3a96333871c41916b03e668d7559fc0a67deceb0d2f818f45d82a9e4a679d76436bcbc45f1c971e966a6cfbb4e1948f2e4b0620a28d633b78951812fa15c4696a7bb17a9ddec0329e927aa1294e5b7974bbc7008a977e0e13500337cd62b281bf73920f02b19c357eb57b3c575265f1e73a16b455af856826f29be11049a7005d9aa401aff512e8f8210f296fe64ba0ee77b1734bae34000b85c609d8bcb39260690ca9b82e105746acc35fc49ba6d1461a748206361ec179990c1b2ec71387b51c1c7ed344b816008c384eba96432ed66fe4e7225c0047e2b2979bc359a891b258a2cd40ba3694086489088b42452682518ec4c1bf8b56b91519c8d02395e726ad48696d5a2809d7f3021539bbdb38bb11e823cbea2e7273742c87776457a1804b89d524acfcb39e19fa454753908813815349a872e131a5fc91c51579b3a50e9142955ac575a8a528ffb35a77a6347f119ae0fab07701cd4166a0144963ad69268bacbfdca7bb18305efd006e44f812d063b0b7e8b1fd75b5b1662a49e26324f89415a51fbea41b75485c53b661c97ab2b9e193d6f1067f518e8522a73447aa1be8af9cd722eb8653e1837279c5194eb21bc9127f1eba895f9924a254c6b38caa0907018197a771d531a506713d3434c23a3a2b996b7e11c83b97058af811e974819da2147a473686869f4d04bfcb9786a0f9723dc67e70e4ac0f565b85f4bb30ebce82b21950838a2102805550c9fc1607ab93a7e42a0c9e79611fa7829beb0254050ee730792e73975a7b38bb718ac65064ed7090471658657123e7823631e802142aa563771bc6975ce2722f0e012f555c3f021a7fedf78f51020935d01a92362dff154daafbc4ab6c8d32d2a11525a474757c690b21274b443b58458b83766df851d95214dd04bc0af73679249cde1055e1977559d26b3bb60bb306503879b7fbf0b2eb2508aef52049f43adf6275d4db027b6477d6479cfbba91ae0abf1dc8126fc962ce9921da1b0005a09c30b6894ef6b3ff79a0c088bd2d6074988ca824aa18b887073a10c7f21982f802204c220756c0bdf59ba855a63a026125bd5c677db08368b475b52c3559c3031ea56040b9590f859f6c2560f9170f5fa759068678b9e22888671cb0a693e825bafbda853c0b56b79a63aa198710b6246a4aa58b226086416d3ed82c412b282cf38c71348b40eab105ba23b2f3720ebaa6f21c9f7b23c4e324c4c3a821de7957c21183fb48c4c127732ab169f822c3003a803aaba857c6b92bb22d8c10251ee1a6838b18c650cd5b8304f886240e16c8cf4a74f14938a21a8f3e87bca0351daca3a8d5c014037ca5665a2589eb7ec6f29d18d891c0cac822792b3408617166b55cb1182341a309f86f99f86b4e7c54e6c2bcd15b15b091274f185cbf5aa7a7a8ce437adc43de798498003691147635e787ee4e145d000a02fc34e2891d2047f787ad49b9adede43fc52fba6803172487e191f48a9254dd40b117941fa35a66bb50296327b725525deef70e128ca8045ec451 +ciphertext: 41f7f6acd3a13f0f0e91c0565efad496157e3214fe0389a827ef01e586b395079a7e4149d29973233be333f2ec98af0833a079fc604df34cc4b979237327d7bfbfc5601a3145dee46b7c2bff3b415d6c133430a849f9d2899262c0b5878a7b81b7023bdce506753692f82f7ebbe11b9ab07f090ab5b5c25723bd3b41f7984f95aaf9492f12f1901c5eff906515aa974b0bc342e1474aa6a0e838b79ffbc0cbd9af44684a29aac1fb249194c3b81f37699d959602a4870bd1cf6cf8a56c05a10c0f1d3e3f61735876e9d20660ff520a42632c19ab533f38409fd85e8b3005577fc86e06c36d6a059742a3a915a67d04094bd32606201b48aeb2d2e986a15688a598dd618f3f8d530a855167f911a5121bfa08da8afc95ae3c80ce7f9b9250b0cd7dfc44ef05cec340edfa9b34ec510f1b48aaa1f5442540b506be68a5e1afe2d8333238f7e7bc5c1ec0cb469d820c1d4d1e385064bef6424df8e4c1184fb62f92aeeab255b5514c18de635cfafbc5c2af129733fad7fff2d30c6734c04d49951148faa8864c4e4e854c841ad05e3f1482e23eebc714aa95acba233fbc6f562478548160be934935970de913e3d448915f696fd2cd36eef9f13e529bd04e993d632e2d65e3b589891d0d1a4885724a3802e8513ec68360f03fb1b273bc7715c3d675226793313768d4b1937cd5703eff763a77b66bddd49b77482305b3574f0c8adee13e35d1177b9ce29ae279ac4bbe11f27f59261351f26dafb041788d9e57d9aef53ef156635e5bb12522ea4454a52217d8e20961b39765f3a689b9827245d0653dd4a23e628ad08d19812639b62f4c278b5733a618debca4ea65ce7e4ebdd2775ee90db0f5ab96f57be14691758f5cb8ca89b656d1a3a591e9ecad9b9cea665c2c58cf111935a2e50d61ed981340e77f89a12039fa8b9fa6f226a01238f5ad3bb87b7c83506265785a3799fa58baf5ca23780956d4727eb907e327ee3d575899fdfccd80e909b64dd70a63848a5bf36c79d539145c137e860e714617bc32e9297d16c199bed73b06a431c4a974c621e9ccf438e56fdd4ccf89f1b6073ada4b3f586cbf574d91a76c5581cce76ebb3a54f5a60c464b25aa0b43f5521d104a0cab9eee9ba3c4582115dfe9fddc113b3064e57cb95a59e32e7a2fb22fd19f86771fd3c5a5ff430d223442a797f018c6903461242b7cac41ffe9fd4932f25901fda592e52ad42b03c258092b7b9a28d531ca802defecf7f934a04e6bc0a736b136e1df01cc6db426c80871b9dc2e8bb2d76eb258182a3160700d3ca0c72a1251337200bca137147a6e901d79c49fe663a7a43a0d056d4f9634d563a1f3650ecaaaa20e520eeacc863f204420eabc2573eb85d76a32b894697bcc246aa1d9bc7cf5293f405d22eb21411e6b9b3bc3efddc5213a0ef74e32845626092ac8d2dab463bbbc31c8697c265a5b005363a3631aaf6a12459c451c1196c783c0bc8b76454c1034c79a79cd6bd54ded518de741c3df1846532b3ff540c6dced5dbaf4b18583b7b214d9123a94571e10944736dc8bdb7bd747c509d4d33dd3066bf78b07f440ce1626046e16ee05cbd09750340b1ce080bd0bbf13fdab443117a21f5928c27ea58fd7760a812aeebf3ed3fa601ea0fd92f217edfb3423966a13deb3755ca26002142f7d624034206e022a0b230e5e0a84e38c60332b79497fe7a73982581b14e2676cfc5746b6771f0df2139c49a0e06fa7ad0182ce6f197c90b59784eb18a83baf25c1628d1b3e92e4a52a26c97956341416433d94be539add37e4de168f87e9eeed8038df0d649a1c50f6185fd0f144df1c1a7d08a59f6a2fe6e3767a0556f322a1b5f0235e1cbf61a4f567c95a84f564d17ffbf5adeb01a5a2d81f5501764aaff6009b00103dc287eb5ad4ee6d04b8cdfd178e38f9f31d175fe86e22887fdb97d47538f0aa4118f84bd56362d08f9fdeca3110df7b766dd5e3b92f1afb29e583358d1997713aeb3bf88af40585462194cc4ce6a60c570e1401eb93ef70d0c5b4ee09e4bfe4b39ae03d6f179dd5e5e861d4f26e3bf7a03f03fa83c1e0d1ba095cd2168a32e74cb834cc6707905d57c3771fa85ee2c44b54008d660068280f94bde10839ff502f0530fb245f9472fe9ae5f9e252e0d861724fedc5df4dc7b6a0c62113339bdb1405bb039adb2e2d5246383e17197ef89025d9028c05a18526 +result: pass +shared_secret: 8feaaacfb4827cfb8e45729780e72705d15cad0e7754231fc4c47260a740b051 + +# Official test vector 52, seed: "5de720f2d152bf4e1f96a61e7ae5f1bed6b8548e32638c2ccec9f43b87d1bb43dfcf334f0582984d27e440d519ab662f" +private_key: 0b57a478859c30104a9dac5c9c4b15ad5a2c3dd362b50c7ecf4b4f5861b60c9774994752ae90556290193f02b53fc3cefdc6864b9845185a1b99745ce6120f6df5898e8682d2484fd809106c9a01283251569a67fd8692fe202995290b6c54cde2166a8926a96864c2f1d209da830832d05275101a8791a5fa7b42fde06d7109002d580701ec45777a5cef2a961306244f540cfa4120aa146269d8b9178c34b0f9086895cf4376c10176621138ad1216bb1e0a109c0cc4da4167a5fbc7497a6663a5cc2853b347801e5401b2846b7ca0233ccc78b2b79c0da56a1854696180552a05a3cbd024668e593a65143de0a969acba37d3da4e834375f564379978121aab89f2e210934c5a5529ca121c015474afc1b805103226899967c616c482462fb588bd8e90606e440046a3593f4bc1fda596067532f340469bac9e75226b328c491411b940e27d196c872d3630e5a396bb47b38a256f6b376508e1b6ef92c15915469d2b781a8c09bb5382be765af47035a57b0bc85120cf10200f98844c410d3c077e0bf7703ad090fe58a7763c77881761fe651f1b8ca7003a99d7f4b94560b0b501241f102e93476dcdd937331b6a415317df973c2a33c98d835c19b78f548b314bc5933474132f89876c9204e2221a61f81d140083df2aba9a674b088156c99a71f14674b2daa435a85c4ca2cdf4a2588858cdede20516181e3537b1bb0060b448a306c691e93aae45240800b390e77163f25b8ca78a7868c0b738a671f3a78171a931ff164b5bfa058d481aad6245757bc47e32038ac95508878070bb6061069e2a0a1369c45daeaaa04b9766b21c354fe31635189c4516694faa2c72fcc8d15c9162ebc7bbb98b07e52c296a4087ea7eb7a0ac1233ab108c3603670d3b15ac529157356139c4dc19c5ab85c31c9b3ef4911861419f821a8d6a2a191925bb76ab9f203a2e241873b264ee980267f150b9b9b836e88fbfbb79c5fc2e738ba031d8b51439834d96c75d6017f4d404a0f41d0781986e7c72a98a2702143264b153b93b05b08b414a221eafa3a733b8ccaac737cdc6497dd07b171525730978d01b0222a54450334777a2658ca37bba60afe909896f47217f45652c1b1670c54098b962e49493239b62b17365b391112110b3f3f3b6df73008bb238fb029e46c06e488b28e0d599eed122d3350c74c168e79592de7c31f443b848051c8b8bc159d301c323ac43f24c9e06456fd19b72a1c237e25f8113047ad20b686c2541850b42c9056c68c9a95c3413f61c8a713dee849732930b71f0cd65930cdaa816fc20b8db2aa130202418f94115e2b6549a01da9183524607cfa78f787219a4c88ec0c3913882429fb16961b2a8f6b298b24b2503254d6500746352030119c5c0a153b7dc204227a641417669139abb8083f0552cd2a24e3cac82899773bb77becf49aa6faa95cc230c9db01dca7094d44269c4e9823cd17f5344bffd2c999dbc011d466eaf987eb4074a0045997bd18da0213d5805afc7278459f31151c6c81a8b54a3a6562422a4123266d66bb47a1ba3089a583e517f92d3386407a4d9849fd6197581b43c3bf0afff21b14b925954459e0348ab52b5120e140069ea1f47c97d3cc9a865f56a00b1b68190ba331a1a72d06b22847af0248a21424e8c08426e3c5f40ca61a1705fc36c3a228332c1626ff9478c3382059126c9ae101278fa968ff7c3acc43b326b9d0f7baf4f979baf542bb6d04769a05139e358150210d8bc26abb209a3e17e5b6c85a5d5861906c943c3a25bc41baa292157ba5e1998addf38b6d01cc4be39c91e8348b1b38fd8324cf413125aa0c6bfd2749ff43c8edc33e4a68b0ee9c6d5ca31b6e3c2f5a261dcc804d90a3cdf09a17881a697f52a9eeb2d81f48ef191408fa915f6ac9601f19bd4442ea74c2d99505a25b36f83000236a73de7d776b6e57f7baa41257a261e008fa4f574f8f90cd9865670b280d2ba02ba647d2eb6c7e7b1b679f85c03597764a59e51caa147c63a4d9ab99815cb716593fbc898bfa9ce15f68d938ca77ba537ef1215bf160553306279dc539cf2395c004374860e812b7035fa14a2aa711eeac5e666ac51096c5210a3b744681944a5877b917f6cbb7c58123c6372d87b12555105cd773c86249ff866a24942a758aa18ba96bfc11884b9304cc16b669550cc08a2828dc34e704534fcc057a45b25ca8ab600372cf6f60bfd530b1e67309d5004361acacd392d104c9d3bf66075d5949ad75815bc9517f13208068ad5250595d76caebc3b188a268312353e232cbbec0830c45b44e315b4e037f66722f2c8c58d37228a7b3c81a8914de52757947eddb3a99ad35bcf1bbe82d9249d228a15009bc2521162d28f91b70ce3c05c4f027cf638053776511fd4c24e660023720370042c6bdcbee2cc853e1345268235e1e31d41106b1c359c8c4844274a42059724b1ba455e01ac4b800d79d4050c4260b862ca9e30a3cb876852997298609c19479b7ea35691ec5de9a16b09382cad755cd1a008c06b3a5d347b75a06825d4a8077cc6a61543a6e4c362e979a6824dcb494b7f510c1a3557664b8ea3d681702932ba284deaec19e83bb4eb0b4e916670c185b8effbcba3252959714462809d54049561baa71f13ae08d25fc587a01c853b32681cf1fc906fe00c2cc58971f8863b803d9752310a18303298ac6c188b46ac03e3a24486b6bab54306fb1942b908635028238622198882989f712ed3a30ef5970528bb477ee6a670d031e5dac2557655acb2c10923441a77959923bd8fe07745988efdf48bf794659bd34cd8941733f97d85178021e8b20b185e0cc47973173c15a681f4a0ab52c5c4c6f3a2364465d3c727928853a5a55998743e58695feeeb9f06c2cfaa70679c00cc6ea329c16bb4943418d90017beeb03852400b7e87d6eb8be948303e31306a4116fea8ba59d30ab6f0a5060c2aa89329306065290466508c17eaf7687c551100a18cdde6600b9e467e3fa7b10dcba2a722347349c2ed9443c401b6749225f38195c04838ce8b96ab66cc2d7235c8b0316eb7e1ab1ca956c5780fa491a7720b073beeb48b98dc41a1b276020256ae6d85aa3cb2d60e6375b44aeb6e34503fb0a73426cf999af33e89f1f2934c3438f47814d76413b87a264ffc67263e3cadbda0366f13b82d9a789d55f05a30868c6a9b7bc7ca7e69184051d9f2abff4ebcf0e26290e69c0bad83ce3ba19d71133a0d8b347e1adeebb8a8b915247689311e5378d256ffa867fba904217339976b4af06bc3e5a9093e8e45cd615cbacf65bf1b0899da61790883ebec896a095959af55d0d7b39a9611e439a26caf8c71cb05a57ca071c719a281625c2e4615cd4b74826323b163cf161bf6a0424eeb2381df549b050bfb9628461210461a9a35863bc0103c8290244c6ea5ba381c421421c91c010645ca365549c7aa09520257634442b83e5806d2a274df4b8888bca68accbb5350743443d8dcb471e25ae4b748338a922b7e11f761b059bd5848eaa441c812951729d6e7013fa98340ae9a142b84b6a98c6577369053652b3b505d4d8607737b49fe06c5ce8b40ec680838a182e34296c317df67826f4ea16f4547b4fb9cd0778b2e5c66e1e5382db0c0c432770d82a1e20f59ce1eb1cba29a1b9d8a5e2dcba6b04022bb72923591e79dc4f0616b2d4637be08558a212166a97588e128c08579859d1012088a7ef26355fb4b83849aa3ab06b886aa45b9a1824a74b05f090baa7cf2969368e6a82750160ceb0107811543ad0bd25031a285c4186719d9a30270fe1c73ac8bb64d912dff5bc324441df18ae94d03c82b63cdc9085d073063da296627a5cc754973cf296f11aae6bc102e940740c853fdf2576c24b3816e60483448d9a28c3e1b295a4e6bb36283f4706290882b52f7babe54b95772a174a4a0a3767c2f6aa992f5904350071ece661d94c868df7396c1a1588f80f78f82babe28531d97617335cb098cc530c5234dbb4db98269d60b271376a52621fa40a464bfc620cbc08b2ab0198e2bcf6912752b39caff4938b842b1519455bca30c8b15f6e2942b1c6798b584d89382abb26af5be574fe12838737091611adf21507e6803a88570d19e34331f07766d39d57f80ceaababb0ac5a29991a1189a6c9364b93a53e73c13d91c656de3038302279de8a0d45d46715d78a8c9aaa5414540d9cc6553cc910b24cc941769ca5b8c576ae8e559969720d8048291c9374913ba79ee9cc3cc217c5f1a590a7ad9bf27b365881366c2a529a85ef8b34d64792bf786964831da9a38dbd81a573b74a8247b040f60404a038846bc2a3117bbd025b0f7a7de41806de885d79e49a5eee5db12a57b1a7da55ccb00b5b706781da8dd5f11267492109ea905a77270a67315eea1f5c223aa9378bfb8116e6c45c7fc62329b13c8d29844405db8ff6860de474bf727ecd19e54e6e1a141b +ciphertext: 32381a661b39fcf9ed796acf47b145bbfb95995255370e072dc8690b72a0430b316712f2fbfa1c70d95a3ff4a81a054280b50a7366972b7fb7e3342006a84979323b1ed528969e2d4a1288542ddec0df9ff963abbfb483b204324a26e1c21a9e1c6089962612915de3824f034653eb664c837c7db70b35462fdda46e1fcdbc57d4b5a611e7391c669183ca58ca8a7dc015a3f7c4647d5fcfecf87df2534b0517da8d8a1e3585e918ae72822b37c25633b773c2837eb28d8c527ee211987427bfdd7e93909bbd43783433b587c6ec5ed0b9e75f673884fe22a63a16e8e5c1945905afa2bd194a2a16062523cc0a5c873b02583ec65e6999a20ccf4ba76031773ce2efd50d95e841860a727055de7247c24eb610aad0c65d4c40b90c10452b663538ab81e96879d5757af125c719ec3e6489556d20be9bb28e6c894ead6fa96b9bd8b1f15524dfb1d6c959724b3b46bcea58805a0045b9722b1930a3bf5916b4d8a8712f9af1c40589def2ad4d8aa99a415a897eec81c5da5b0c933ec04f1f9d02c0907da1b41e6bf043a8f85fe5f4ba76c29ce2c8c6503e975efce053aeed389035bbad720d05bd081f72b395890109250dccbb4ce195c9ea46d55c2f44a7baa3e89fd04e909a81d19a964539b58c1b7e034b74babc73f35a34ae87a0d6b44498d4168c65a29841adbcce73e3820674fff1a8f45b0757d206b1595371f0b394e1e70783269fa75623aad43461c8ce8fbdc0592d0f1df8188c66df2c217037391666c2b95e59254137f26682f9c19a2e665dfdea3d79e8e8ec2c0cf9de2559cab184f3acdf0135cc8867615c9e2a7ef4a8861d33f62e89aba5b831add345d0348811324c0c934600993cc6a3e628d28c18c8d416b8b9960d621e5c4062668b60204467a5ed85c857dcdd057350c9af0d6046108943a10f8cbe9da835aa0bb0a803a9ef69e880b0cfb61540d161ee4aafd3a60fe8ef6404b1e06041eb9b6a91bf32f1b6be7857558bf240cb16532cfc8cf5d1e41f18531404e9209f99ad2d2134b07117f49d9d2fa6e7463697593fa55caa39b3dee39c2f377fda9543d90f591b5716cf2f8105f8179cd3995674af5ffb1b91e4d65aae0fdbe8b473349905d4f31bd864e65728ce2e0251389bcf8bb41ddc476f0f4ff5dccf8c35dc66a05f3f85d470c01fd2fa37ad39d187159981276ac684ea7d767a2f07b68063e7cf984cb2c9de7ce3aa98cf2ea1cb1b6b3ea1f42db3ff887653410c5b6109f1f29a272e590bd99145754d238c5fabb1c588c0af8b6e95b698a0349a7a218292f0360b5a32457fe8fc6eda0fa51781694947f97762b1b08704fcb6beefeae1f1af76a5acb12323ca14b92629e323447e4d3852e1177ca219c29e3d68216f19b470c57c9e57388dea6eac11a9c512a3cfe9ebec129e6dc298fae802a13b22b21372097cf60fc0db70be35324152afaea7e4f42bcc30adbf67005104fceda73238eb042b5e42f5f99cb802044edbb0aeeb564cabccb0f356d7e090b175a4175d44f3c06f5796d0cb5054e2a6a73b71a5a0fa4528e9b49acac5cef1a90070d07b0a45c95e4fc046321f903defe1e08b102b5821f53c09ac4d9f1de76b93e6fae303a2b695706c025993e396279b15e29df2aad1e046157bfda3d61e11b7136c82dcbbf6c115b6d8578eeb0f3a326287c64ba47a01ab8f680300324edac1cc84a147121c30700e345509d6d18ab26febd02b9b8760167aefcb05f92f128919f6b2c3e39f39d2404139df30e4176f3d297ed2cf24ec2a310900ca356a6099cab367a9677f110e4e2fd7d8d7734eb4d6d0c9ba07b96248f05793d3ceff900dd3f03ae5e16a95b420dce402be568faa24e6e3470194d7adbdb9762a832e74c788cb97e9c6161837074267ee67c83660af6bb845947f248a88c9e1ed8d3f6bb63799de261f77ca70ac129b60f6dc1cf22360d5e132db7e1b7198d8de3791cd4044573b65f82f013aaa642bf8a93e55b5d9334bfebd549665e20f4e496b25281816ac761f4f4f2064b8c0fd31f281bfe5fbc67d60a079fc7d024657e58475916031f962792cc7fc457cdac76f73d0698af97e218e4aa175411e0d1ffd0188e0e89b45c0948efccc3d9631d0a15db4d55bce5ade1506a52e7656c7dd3da4122a4392061942d694d46a20189559bb03a9436f2cf3e47106428043563ab0d0a2f967173d63084558e20ee065 +result: pass +shared_secret: 7837d532d751ebb2d4e8debc55c324f951e2128559c9f7db17fdea6e39bda6eb + +# Official test vector 53, seed: "d71729dcbb27d7cb39e9e905025d3e55c8602efbcc483c9b866ebf82326157833169243c14550ad728bd1470f39c642e" +private_key: 455c59bac459203a7beb868c8477cf5ce391d9842619abc685ea791c1c905cda7d92a4cb0560c022bca55c78ca606904ce666b79366eb2a06fcd6525f6075f80a5c23e7621965292549775e9250e8f7b6f902a0f5ac93ca9fab1c843b0f71652cce35f8950cb88981b5e9c20b6c639d2486dbdf823641836e453b4f3b3732965b8b9f64ef7c0897225cd495c8d38406b3b380a70c0b499788cb22b5c6859c25590bdffd578396372c47cab57d22a02313b23966e2c2b6f84f49fe69b7bff77474b0654bbc71ab6346001b2c11f446818c041646050cf6136e037cd4cb8a69206a7bbf2c6e3d0a92b68a1e7caba00a6a70551abdcaccb618b35a3e96026b6499735bbc8b9551938680978804b1735f2dab7bcdbcc3c4cc15a73053dbc1a7ae967ec073863132da8f742c343a0b48851eda61f97d6018f7bbdbc674cf24b6290d6a7a9577745ebca38859d5a7c7d1e54cc18983d9a9530910a10ca8aae777336cc147c939622bb433ae125484d2518ca45c000d2004ba72acca4288d391103a9a9f3db703584451932a02dc46eae313f55305e5990cfb776605fd268b63306fada7a4337c51b2c2b44665b93e2a2d6709c0b08a172db7ea5410b2c252a86d2a08d1aa9126986e78a910b852a12278b1df95baeb41965d1caf6798ef097a5f7d9bd13c83b7c87aa29e4069a376668f730e1d85f693742cad56a122494f926944db6c8270407eeb7b0e3e20a56161948baa86e218dad3703d19854e5e475223476d2da9b1469531322a1c7592577d7035f144ab29a76f661803b125046e33eb230cfb194ce37a228cf251e1c7190d9c231bd5bcf65d03595b4601ef519b91232f745c8182c921d937ba8f6a75ad524ae1a84aeb61a1bd4647e7a3f43315445f7bd6db427bf309fa6e715cc1354bb3a66052a7665e53c8218b4afa57b91e9576dbb562efca278b04707d8760ab73799260ea88b10070c2ed6fa545ba8a43b306d326abf7054488702a5882c19848ac8c2397e42972260cc1cbf6b66cba994a0282784c05acdd25cf4e99f6f91086e777d3b0449aea69d85570ad3ec60923300869502f245845c43bff69b83e1ec790af2b610f7cf09c3456b81023dcaa497277fd44733fc836572b76744280aad512a94582c0a6caef92c02b81c646583ce8223183bd4303a741f6c752b8604be7b8b7a0903ae91836d39bbb1b9fb864a86636977b1ca742a99d949818b535db3ae8aa4618bc702cc4a1766411ad6fb993008a0b8ab46a0bbba563006b0fc82c5b1667fba4774f176cbd667068c7a5cb0055f2229025b3c99b890c1cb6757c14e748358d90c040f44a6dae0025fa820c5d037d48c31e11892ec496833d41e1cf226c19341fbab7fccca4b111160122755f35c43cbb75063462e3de16a4619139ed178f78686b3590009153c17d142e34175d1b4c1d2d476c0ba4f8f715f0ec862138bc70a7a919237c2344ab8a971146a013864ac6128315590c671b1e6c1fb329df06052f782a06a4a1fd8a66eda148d03f04ecf878a13e50d657167db2c57700278fcd1813884657caba453dba396005f51949619342e83b601eb1b85de358617663656ab006aac29443c4ab0696c48824db1351bf9dcac02f32fb45105151c936c48642429758979b1089c0696e039e8b4cdce179ed2b457e65b3f9d65afbaa5885a377581a2814ee1b048b10209918fda1b7e2fc4368a525626a601b621503afb0d3f883b94d1a41089c89c8c1c81880fbdb312e72983a38471a8d797b5719799a8c8482c9a99b07240438c01361a156a1bec17619a60535a745670db06b8c33b83d17f9124076409bf9130595e1322137c3deb17b6da088fe160b8345624a5612330c2042b98b13c6c2c8191772cc37623353d4dd2a9e2a156a30a7ad2c3461f6548d9282115a1b115d81293bc155881bfb49c5d16da815ce4ae5c871abc62828535cd8c4a98fd0430711b50d468715368a15680a6e0a78d088660e0364a3f279265f1556c7a711493b666f5b20be30890cbbebbb429b5c84f3f6a7cf6085e9f411656c65771806c69db98168b278f506ce4d385b95468b1e94f6b0b6dfbf77ea7c8b924c81449530161b61b1d0a3884a23c90069837a386cb06b4caf3a5bd0608d7b33dee6a25a9712db231961d73cd6d3b572626cbb144988961cd4a5b3797911772787768b796a5157c180a1264c1bc6ad588139028f9f28b3d8866b8964a5253b79ae86064b5979a0b468f87ce0ae843f34765982114bf327ff08c801a3a99af0c27c72cac48614620d373b23c01d1ebbb3331c4f0ab6cf7a03804545427547acc2a467e895d75486f23cc23c779a390026e41b56cfb04b1e22190894a3c1ee16f19017d7cd75151047618b49921c8990a580a03e1656f841e95101eacc1106f0cb94dc2789bb1a2b3591134b05e7d983736f83cdd985d160a9caa210de0813ee78b411c813fb3008742f793e337a699b3a1180c5a48e12d92b9709525858a70ced2d2c81efa2401283fbca4c4b4f1904e75ad66a894aa57cf240118c73643af435f024013d6664543888f7f30327bc65e3631a4da4b6629131ec5067ec5a8c354f94aa207b587f139fd3583b3cb51e6f7926b9a914c15928738a75c9b618b250ffdecc61061618a8038b3c65841ab3d5bf203c122723b087d4ae2604f5bb6c9013c4f38903f65248c9783db79b98b9a827d528444c26c8fe408d785530d90123d30371cf46307e1c6a81097ab96280ee058d598207e666ca0dc213fa48892c3b7d5f49bdcc894f2a8659fe882201b4eace22e1713c06d74156a6a04d84c0b29f6b53fb61773d19f5cf9394dc03ba90923d33055b5c089f43961ce810a27f0878f4a77e9d60a2a1842a0450ab7208d24cc865a6393a9820b62f96abadcc0650b171b473db3e91906720cf7ea3730435f639c1ae9fac889d76bca6602ba96b0eb98aa44136cc3a978b747acba054032d36509a7ae9dc30855b2b1699628601793062c5705c5b103344c3a77947992a2071c35f6393942dba3b8545eb9a58ded8a5407a270b676061dea1c5d490f25a05c0f82750ae6151de2bf028a28657269789733f1e4c279203e2fb837e6ab1f30c04daedb3ac2809791e8ce988a4c1754c8fdfa8be0fb8c94a240ae3b1e73ecca729b4ab04044be1b97972a1a27bb10bde4240d49a568114b938bcc050b26145598905735ba2a3198e3a375b752d8f5a84004890e25916871a34469a8cdc8b1077482f785ac3e497574aca642d74a3625ca37dac98565ab6f4c95a289a434c9ce9fe61d129c073b5cb755306d47873fb186bcb86ac00be265c320c70788bca0f462fbca6db8805986425a6437304ce48d59588489561d37b60d1f171f03ea8ab817c93ea7c3afc06447eb823e630acb4213b50793457aa8f0b9b484d5830399bc2c98a7fa452fc30713fc85ad9a7707e8343e2ed113ec436625172cd4162cb7730e5f327e9566a01df27d06b460d155c8717469a365acd5ea80b935445a6610efd3062ca954276c70a8085c42aa7f82628655f97a06c098aa7ba8a1783060fb819de027dae9256e8ccc9a72539985144830c23ddbb3a1860147bcc0edb69a0ba03bf9626c1f35a611f686cb71801e130e0cf363b795bdd9c32e82978f53083262a703f85398d0587c2cca06ce1c83ffd614d1a85d437784623814d804cc00778978e0cd3e2704d34563fc23494d84b6a4482401b009b601582bf48d7521676023439ae2c48e5b54bae0c592b64d038883a1ca9a4a843c100a58d19270f8484da82ac633c3550a1634d0a7cb8bacaa19d4500af0ae14499ebad63ca1d2afea753e762246a0834942643050b151cc9aaecb587808754e2aac15d5b2c074667766181309b113211320603499d9b2a5aca065d8c088b24482200c0eb26c3f7de8751ef56850ac8097581852873b396b05ea4c12347309c7814dc89929ea6c3f09d9bfa92bbfdd0680591a69dd855269fb77e8184ddb4aa0d3b2a7013ba06d447598e95222774badd3544b6c80c229392b0caf13a94eb3bc920fdc0ad3aaaab352554a15ad0aca4d7038c208eba4f4b181e8194e21575687e55b5af0c2551acd36824c73c950b1d9a8a76264adc88e6e220396bb1aeb6ac835f2cb3167c7f4db6bf0b6552db314bb91584b86c0d7762041075a432583f8f357a77731edc1a7ea932dfd40a8ac9c09d3a687dd530ff1ab95c4e56537dc6e82210c0d3c582049a180030acfc3790fa1b437e91e1f67262e03cb59a87485658182d1a518822f678c266ad70fc1622c5b206ab7c61510f1c920db37ee852276f1961e64614ec8167fda7091988c176e893ab163e034a7e92d569882badf4976ba648396ee00e3af7f5bdb9a417e243a93c5dc84bb3afe84c380645fad6886c5614a8735a6f718acc565905e35325a3407f591791a5db4578b5972093a95bec3b8e70c1d542c9b5c9789729f8922 +ciphertext: 1f4d4173d751f63ede8c9347d3bdb775f629eecfc284a185d9c633ce212e168f1a1716096e7b86ac9d637bd9e31a82582104b08375b5a4804e67ef72e1aa69f5860477c11aa0bbe3395934912120cd65d178e83f4eacd7d68243545874b3e88b670768d7e73b8b2a3844abfa49f1c3996ed490d19513d93576e212c357e9a1d38de0b59fa52e86da6e519d4918d09bf673430f59cd61c7f31754d1c56c0f0be72abd97e744d859bd39c6269f12a1e8e54fbb546ec4fb24a1ab867a8d33ba986366685b43eb5682aaea735361e65dcd7375a20a6f1511e5f2c1815569e93631839d3d443c7ce279cadc2766db0611d5ca845466c4332a5f0ce96c68d4c34e58b8ff81b1b11c2b824215440c25dae0f1d6c3c81f702a06444412c307f6db4765d1c0adb5c890b4655f0bbcde0fcd031297ba9d05e1796264cfdf138f259cf503a2410f87866be23624e2aa7292aa5082e263793e6d20801d238eec7e9180412bd118a6b9423dbee8f313aca37328454ae381a71afc476b993b3c7a2e738981dec9d6c005db2d04138d1b116a71df068d2e146c31aefcebf381f077b276c4e2693da745d90657a38a39311e875737b6938a58d0ec6a3b43d00b86ce3a64240d27c96f1b2edc705632b5035640e7164adf3bd698434c63af5f03e3b62ceb05903c82005800c2e8a5128754d5d74171096ccba35130fd7f7ebb8f1e9413b2380d1c40ec05e724fd24ce8a9f01792e624ef9f77fa1cccc8477f6bb87dad3b13ec15220d408bc6d98fab7bc7a46c16efae45f60377fd2086957dfa9f3837237e7545ecd0a0779686a5c3ff7f842e2480667c8a8c07131f54a1bdfd820fa5067e699459c942019e2acdef021393e8538ee32bab41813b64437609df35ea1b775a5c69e94fb34059ed4a3395abe419e2534cf450bb053f0f227b32969d47ef9d80ea2f68d27817d9de83aedf06fc19aaf3e1e1f61f15ea41ca2886d6c43235d47376c02bc9c061cd4b556486d502a724a05786745f0f39760ccb3c3cab55297696936a835f4415deeede9139504c483402577730ec1ac7878635e1ef482d441f25beb2b0ce79af6691ee0b41f8c56cc20de0e85da79f750e087ac1eb1684ab2b3884ff126b5cfc21fc322475ef1c3a111fcd98ba40ae5a7cefc8be88e192a60089247064a3a705108ac38c3a0d9044a74e6247477233e90175d83b10e4d49881196f0c50096d6750dbe10f11ee263420d63de467109f98d3a3aaa0e577e07c83c0e2b6281a50cf3c33286306601c637dacc6915fb23af9151395ec5719a692e60ba8ac123d16684c968ff534bd91d4ea0144c13ce513f962d055a4320fd31eb096655888bb4a834b2a828645d66c72d7825c8e995a2d68d9b59ef21f447298fec25221e5b3274be0d73bef1633c57323a745d426192c6b6fc8d195c4be182ee95e2555b07597d76cc8755b58eddfc92d08117a262d0c80297defa70bed167c7b4fc03729cb91f063ec0c85b3ea34e11d5835219516422e0b653f1a4b6c6d85bb19238e16b5405491f482dd517412b00d67596587dc6d84093bf681ad17cc293a5c70800419366796d6403259a62ff5cc10c02fde2abe8bbeec6e1135f54579d58f0cb8c560a15d90f11d289966f081586f3fd0476e90a214ccf66b55404400f4ab2e41b9b2ec1d1bbeeb61c27bf8d6593ab65ea06b5628289d0abb1296d37b17f17da5ef89cb180a1b82b73aed5469864e3b751c9bb45285c2caaaa904b1f756d3e053be1fa86f5fddc691b76714170b8be35a9c6e8f180965fb84a430a62f939eeb4c3902211e9e602c205f57cf91607b459696136486dade5099a9a2a0c20508e0b4d08c35f7922fe548a4313b246f902dd7384f5d8677c150b9b4c3ba3c985306450cb0267d34bede536e010fc8dfd792861f8f34890b29b92e7e6840cd05a41a746a3ca877f6a1ba79808b91b21e9ded72342565e651232307f6afea7601433b92ede5d4e80cefaddb313a8c6e08a3baef45e675773cf201e6b86050a85c6f3b602b9b47edcb75d35511e2a4079d1584c18329a43be1a37b55a548b6e8504c0d3818950070d6880856c5f7e5ef35e62b3f8c1d8f4328d522ce7be164a27ff263cd09e8c8e365b92ed898927bc18a534cce4984f36a8b42b4eb2ba7dd26b660147ce5933753a2959b4071826f1caa12b13aae83544863c2a46260592d0479e9b807dc5 +result: pass +shared_secret: 5354347e316b6122fc62202a775657e779e82f6b292a11ffa2b9bb7dacc4f1f6 + +# Official test vector 54, seed: "a7c2c8edb3601396beb2df0657ec82fd5780a2723581a9e03dee1cdb018440439bb1142cab0487c5d136e9af46338ab7" +private_key: 62d210ecf64cdf77865b40c9b663c2d30a39bc7916c4d7beb420c29dac6e3a7a1fdcac2c68a117966c2bf4e2aec3a7895cd83f0e426cf826c8d679055773798b748253f34a873824b01153566499460bbf16b41502e97bd7a4cdeae40ab2f4372c755bb0a624a220b774345d3ebb235e06afbea95669e75dcf78502f68439a485e72427345e17a845109d816c3bee592ac82c7b27902e43b31b5460e37a43a16fbc98065125109c9aef2c8f1ccbc99ea571781595fbb27b8f26f62c995afe082e46caca8929e5c48510f05b1c6a28ba5c0c652dc0ff6e20a5a3c8d19691f0a29be46246eed49b66d2398378b1b3583656cfcc1f1cba0422b2a5e474c5f7854724607cee3955e108b93585c3794cebaeb8f6e4c24b653988a84708e3bc9649394f422c25bd88ef774aa17f8bf9bf19aa64cbeb4d343eedb0bfbcc8b07330334278aa7901f8b7810a1e49a3449bbad23cd17721a52a03dae0822a4333c6896a303c26356008aa03c9f9414b47c8137bee6922ff9160ca84d9a0a11e444528004ad471598737699ead095c4991f99257981a7668dd60d97ebae26019073657409bcb8909c3247bc7973b79882009aeb701eb82bb6b568bffa379ffcf235460143ab7a4624f797ea324e16c6757072bc0e5c95166acb3f9b30ffdb46b5b720bcb55209d96f4da40faaf21e2b9b5014d049936469a63940704947e5670310178c65f9c7ba44a6a6eb5580a0174b43595933b19eab8c4d978d29bb8e7ff4b37fa1ba4dd9af62daa5ad879836849b88678bd3549238e2674963770a657c1389b023b75e8a7262e8c97a94444fcccc63f3e4c17db97c6131b721561d28146521f3afa60bb75b0491e9f22636017f7c2587e8e64a8cf4b2d0c5c2dd53322419038e239c7f60b10c66905917c2c7267303d565fa30169904159b7a2e348cb641782599787d7c63be7a536890dcc858f7a43a7080bd3593f6da1f4c5454e745cb4ce2ac2a5051e8052a3616b9dabcbac6b5c43fc3c28fe0505aa823fd324d79f0c1908c2720b37cffdb58c7e822a48b7052748a996043c31364ab3b9974560f63e00d7e06184ae0485cd649374632ffeb64ed749e1bda052ba4c0a972c679db187a345e8c055fee4c28df4537795aca7a602a243b77499146f649226f73991beb88544ac439e53c2f060952bc5fdc3648e8b850526837b2744d0e7323a97598e01690e04c63d92891c64b9b1c962541755cdd861390dab893b3adbcc04d52f0ae193b27fc948305e5787bc2c27efa77c7b6823fa700eba383c96a119d453036ea2966988acb289a324a02272a75acd3a4551562ca894bb63c6d38b6710f90537dd007b807bdc0071a88537624876d58ecca89d27757c9acde480bcbc96ca3d338f014b6da5251d9578ded5aba69b7047f88a8c75860cb652c744571591369a69ac0118209a70b2a06790baff6c35f515811e45b9b94a9d9b4add0c898037c2988858eb15bafe5a88439f67cfd537a3070a12f40394cd86afffa967a206a5ab72afedc52acc6add22ca1e0b0816d729d68d67bf1b387eaf43461a5cd28ec6fb70ccea4828a9dc6237f04681ab4cd3e9c69138b48459769e07a3f6ca684c299bf3cc95df9656df5968ce5bc91c87487a600236bc64ca9881797b626b0881903a899f945716fa32d955711f289328c66c518539dcf9b83f241347b11210e4a3dcef1516be12f9ce514c38200d8757220b30ca95b7682eb16f7a305f6580b4a764c23470bf159846e656f62da82b8db4828f7244608320f5860d02821dcb61415249779d4941a06bb88c64fb14b8fba049960c2118cc9473f66ab577a953e283732c689506b4b4c95a4ac105aa418a144b2901180876aa4128424baa807354e12631473b8e05c00d0d505ce454bd425a0a1443aaaf92ff2237bc0f7458ea72b6632a2b8b760e377ce48ea5a60e8c4daec0670102c4c747492f28f81069cd1d64345553f8cac531f23b6556010f79b623ac6a8fbfbb68176c41d3609e73c65c1006de04804a0f2222433a2d1834dc80828fb06c098565297b815889161a58c0d187454b61a1a2986ad7e07a6edf27fb4626277892bd12051a0c263e6f94cfd388e1e32ac4de308edfb070eb60dcb5887fe7ca44ba4a39ba7bfb363c98b00b60a4c7781940bb69998032c5f6a930c1f65420b0c2bbab954ae55ca8282b1da2a61f1b111df231df1151504e9031b7b28e793109ed49d46702d25b37f58fa812f68508fe2b9efc319a1976064a648bf7a251a948b74ca3f1985c5f114033e1240bf3691238b507bf28956a52204459eae072bbe10431a56af24ac15f8b546a62c03740c16ecc8afc58871537c485ca93617a324f72991273a0549b377ac040aa12a46d366462ff7b76a429bb781922f7a5397385421424a24b366651b72c5f8870c21835e0b2949f61eb3571cdcb780db683c95e23b708889303a4b9f2b862b68a4e2614eb2d8169ecc1349d9b71b5206973487660b6e4cf544baa688202b0e8df9ae88d85115f9a183fc95265608661993839914d9926cbac8993013c59e979aa8444a54972b99257542e4adb869cf56dcb305455bfec5bcf64137b72b2a6c9b0dcc6c386ed616d6a25259ea612e89c21a170b64e379458b0abd725dc8f53a55e57604282dd474c4ab30c4218a32b4183f0df24475d01fc9f8550b0aae3990bd414561463a023445bd23c7c321dc80eff509a6155cd6b2059fca448ce05d1f0062f3c21849e38a7a90bfbf15b192265f11b5bef91a6bcd0823e2e1b414750e057583401b3a5f140ed7bbcb87bba4b1aaa1aa75a911dac26298a7b9a1830a48332f139f7a4a12a528b9486197999b5717cb8552b38f7f759becd04970eb64bb4826a5cb47bcfba7cc46ca17039f1da30dea436de4b6ab76f43c06d1a1db65a9001a1e0f510d7b4755137bb4c08a710e9a9d7fd8cb32d64152c0b85f40b9cb433ed1d7bea1821c6881309642053f993739e3bcd38951433b291ea26f0948cb2dbbacc3088d58d42de008ab581b0b3a9341ac18c28b131fd4e49964d72d65658c684472550a06e68391f8d34bc09a2f25161745c74d68681c3b333ea58c412f68b44d066e33cb7ed17253fa655603dca0de7a13c7c0c78c9630f5c57ae925ac97a823102c423d0b7a3af864c7a95885e574d570895540a3793b3cd0c73b5a21660b64577d6b146e888a113bc44d78c175aa7ee72760f3b62ed7c971ae62a3e8f08ca4ab7daa43c51a18cb72158de398326589241f07a9e78bbe0c4cbc5dc388b03a7c131c885fb63841445469c42501d198d114c31da36418985ca5d95196fa12b59599f90750e4567a76a767547baea91c6580a628c3c052c3c8bef8755238c2b31d52621ea5579b649f6328695af62aa8d28402a554941b11baf7b54ffab7bd21918a0a6d6a368516b4a04354b6a922901fb8a0e9bc9f7713b977226bd8477d5c7088b8b90afabb61d0b32de98529aaec904aeab8d0240bcf114c5e3a2a44f0043b628f03fa04addac64c918916a3031d6808104539275901c8d8cbf17741a6e185250c7eb9379de46176d0b6cb02621f97c083b8fc1dabc9a0cafa9585aa848606c9cbc58b96da5a8f414bc9a6ab4d9811cd3b3b512925bb5b352cb67f76c810b3fc79113685e85595d4c62d41633fa092c31fd3102102960a0024d1f460be791bdb0b19b6610604fa26d6423864e93493066f859b86b6c2693a899dbc36cf667ab5e4d8278371cc411abba846b780090c7023a09409cc4541b4d8784ba0f643aa62336551525b315d6fb7086ac604b2272333c071b23595ccabb5459b6307b59786731008b14ea142c89a066d5e5c502724bc384013b5544a99aa872d5b65e5100315f70091d9aae9d1aba29c18a5549d11aa195d7046ae51a864eb4d69192da8248300f985fb5742a8f0623859b2a7aa600fa835a0aa647efb62b9309ba89a9c4b7478a8a1086d6c955834223600b65a80342cdb6788f09b138456773aa8a2b175f477b800c2803867253b06b5c5296d8ca3a4c85496fd9b413383c0cbb95880545c168099926c175bb6008b1abd69505b8c782c9ee06877523802a936830c9e58145c6591c66bc56abe2804b1ac28394b9f0db695b15c560bf48ded5c54a47244daf089975065b8aabc77e4a6d1178ed5b503a4ca40c2584e878c5c15fb41307ac297da94a3ea7e204b8a4156489df3577d74186d5255156aae92f77512d0b54d1c1559b8866af41ec7db75cf658625f784ab26089a076ae52103ee3053acc22a21a2920c65c10ed64372380292293f494c2c663a87d7eab6ef126a4ef50002924497e70154426f8b9801b09ae930907e6284e384a1c6554b2bc594591397810b18d01bd3777534ec53d050d5a81c049eab8f93e7768c39323dd805f12c6553c204d58cbc47d8e8b9402bf02481ce4b27a52e87feb92c4399c7f2988d40e942e7496ad15ad2aa88 +ciphertext: 5dbbbbb0482e3df0ce0cc4bfeacacef5a8c408cc33fafb645ebe51452f7e1f4ab58c0066614ac8ed6e71a53200ed108c6bb6286b97618eea3aba554f72d4074edddb457e516a4507eef3f5615fc111a5a127f6b28b925fc0b73431c3eb24258e671338fdb6b5508a5940e8b17771e06f3988051549aab62c21180592f4a7d4ef8befdd0760d48284fc977387b2592fb31d638e4bfb0b8b40d00fd8a5ca33b1ebe235c3b35749c3ef9821d4d571a3f32212775dbf8f6ceca4f21ade85dfe5c7d06b11b93217aa165937ce8ab6d5fe513074bc7d05d846694be093dbaa95810984978911031a0313ee25452151d04b57cc8e1c72f88400f1ab93d6b929b2e70e5742b95bb6552e8b228954dfcccd4a009662b7074c2f2b116b1a091a88e5ee7f15bcc0736f00d8af3a430f75adf20eb30297c3928c7f33396facf62bdfb42ae261b95d6a0295906598f4f0e5f06acc2dd390b0e7fe466edebf06592b8a238397aa5c8807dd555003b676caa0de103ca3850109d42c053474e8d8cab1853229ee32c9f65895e73f64da4e485db143ad754a50d96f01b674b5390fa1a5a644eedf8fd3c84b4e764b3c4a8052d6a3cf45dbe98491dbcd95a173031b33a2928d50f3a71728b9b21ffaa4fbe87a8e54ee00a154690739fc1feec0ca8899f225a3e92e04121165b092669f4ba41b7564f65b158c401e8895a365bb1ffb9d63f59e1de277e387bd519f60c466114823180c75427863465cc9e8ce8713d76d531cf8ff75d66573071205d69ce83b5fbef5c6170f0bd0c84db9e2d18171b52eee79ea76e0f960f80e783cc5a73d3360abeb6a5fbb93798a8cd301ea9ffa1c0fbd93527e2ea37230b9349405edcef15862f8adc9c04d95c6d7d0a134fb5a16f8dab7db9d5da26c56829e90056929daf41de948d968338537c80ebda900be95ebed473025c20c1ca8a0a2602581d4c8b17f01060f767c461c7da84751bb75de30042e56919dcb6d429833ea0ad72aabef9174a0920ee3bbd1dc216e07b5333092cd67d4cdf5d7c306387aa6762ec4e285de7d2be4d26f15e775fe4f7cca27ebc4c3b3991540975298e83c922123d8e6e9994f3542703a84cffc681722ff3fa15862ddc062515a2be78b60c2522c4dff01b52dacaffe074c573bc360856b8e8ee656b609791c86f192d3362e7ff47f616d53d028cd3dec69e33eb1b4523f33bec0977a504626940f4491362fa46888f8729a6883061f530a5e587be29bb1569d41f2c593d7b5209342f59f118b79213fdab6fa145b4aee2ef4b6edb888afb59688bb3688e66a0366e5cb0379d679cf5743e184d7978ec9ec58496e9c09a209dca53181c8e07b8bf3b4b8048110e16fb4cb3573700acadea95e7ba624e293e8438512bc122dd2f71e41717ae965e56ffd8aecd15e8530fb5b40ae25ded10d6fc5c72596077dd918a328bacf4018896c8ee24e18613f149316f39ead53019c042c872097de18f282a4978149539df1ec47febe6c352916cc804fab02b84089948ad5c8c2e94626b7b7b9fef58453727f534e3cd5a3a30d7ae1a7be98220c77a04a447ee7b65b36890a4e974d20416449a6f48c8efc1924ca17f44d28bcc7d76d795049ef9a0eb65eba9006f8d487f5258af3647be025a0e60b8998b5914df9c1cbf987a32d928b410b028d45bae13a4b3e5d6ae0b0770b634da807e23b0e2cedf13adaa0f87cc1553f40fa81e51490dfd072c05c5f9f86d6838bd177cba78c36119413f7fef19af1170c90888ff9432992473677b4cfd3b87d227809282bead69d05ae6f005648bea7a80f405870ff3afcc12f87cc23e56fe31b200ff47497963e407ea244106d54b0578b9d411269dd7ddcd0e801bbe9fcc0accd43ab0c88f6ba1ae664c14c231b6762f1fa0a1eafe23d9663b85818dc8db52e35ecb420f8faf2120ac5d3e5d51cbf5fad360277311cc1e8be2c9150768ee3586cfae7ffeb8d376984b86b0b08d4f85c7688132eba1bc272dd6f1a6809cb925c2d27354a87a39f0e1ed129625ddb437d5aa798c674c17f671401434b93cf1b6f6e17f73f2a286800471cd7861f71cc9e15d09ff533b1a34f43bed647f55759e85f706935c3ac7c16f851648de50b238d648b0a7fb15bc9f258bf0033ee19fd6a8f3b2071800ab761d4c3c66f71b8c0813214f428129879cccec4e697bccd2b3d5eafd14bb48c2bd46d7bebfd2123 +result: pass +shared_secret: 634c1076627a11c878cb3a75e7026f50656e2a90614b6d76985998f51791ec27 + +# Official test vector 55, seed: "467f6158cb86b724039ff18c47950ae5c49170163c910fc9a9b30141f86e9c06ebcec91497bcd156d95758c9f0c6ef91" +private_key: 08d1b85a3b6262a96eb593935cf9aa02b2738496441be27303da5e8a5badb4c23fd7c2873c28429c7778a3f41c430786dcc92e41d41ab97028fdd1a87914190b210a0a108c74c86597f280ae4195b39a00d7a35a210b80d15c1aa54945887634e7db73de2945355227b86970bdb0abfb8baaaca1be8f4382e36c0c3bb972f68a5d7e089ed430c977d4836e3a18116584e1c860c99277c00b51e6480bd78004ad660bd0002fbc4b04eec53def499da022741d96ba4277a2ddf1ae2d309cc9cc3c76c28baf0180b03b4d5751572c2253e5e033114a81580b960059b6cda77a06d990d2fa285d7694036b3c714acd7c80a6e7a28d8ba01075b65772e65843e679702879e4d77fa61a7018da1d14b6664b0133506bae1840a6f2ec8897eb72e22874ce275ec4a81dc1714343d31a0e99cbcd497dfe5376d8e3caf40683f7491f1fb85ef9a43587e07d21196161b831b0020c643845fbb26101389ffc83c88de29def6b550b683d374c26883c4807b51a23110ef6b8c16ec95e0dc03f7fb6a8ea09a83cc4a82ff4c7e407271acc2fb3943a3b0a1571d1c060d80977770d0bc17ed94679381984ddd7460f782a8a596646a49c48e59b0890a99768740f1c66d58a7dd7f88f27dc4f41b28db4bc240aca187371110ed39871ccaae2972653db394312793458208a29ce6a676498a100a5199ec642853e4661247b0fcf60a218f424a6831eb2488300542f1f354863db3e32878758d21fea35b06c79787851a61da1786bc45008085e87eaa72623cb41a28200ed0b4cb86e77f510f4507c6c321891d455842750e933967890ae10e91b0eb5b23789ce5da58ee120b965d20765830f9c4079a64848708a51d1826ca3425e0ea31727107c2ad28d1e8b0a6559094cd5c000c271e70b98949359be468307526f683a32df61aba0821efdc289aa273a9166abfb4abdb6c0a66cd444f349c8c2015ccf5cb3f72a561cc37bfc210f8ee4b0b89873b67506766383d279a2f1d28077e91f6b4ac289d3bc3934766af53d2f238ea8227e9e9226b4f7a8c47b8fc5874dd30c51a1d61235bbb5ddc7b22511a776359ee18842e5b8341ce045f6cc9ea6922a0bac7db004217c0c234b52c53a33c03c8b1990f29fb2816d7aaca9f633495ed0aeeeb112f180b2d740b550550d8fa56b9ee659420a3575ac40c3d2041e01be4e58824b2bc85685a5bfc7289494175b81626c7b88530bd031c68cae15a76c510310b161229cac449ba38809be3446734a84080473c80a58c3e1a56ae49b2ee802a896c3c051d92ee2bc7dd9478e5954ab98202a2403ce6bb3660e20c4de2c54289963f2cbcb692349a8a7b6676413105923c6c30a557c958ae16c03d7817a963230692ca16cc8cde66a8b0a01b0d63b58d76b7d76b078db1351931f0c23673c275a9fa87fed1a758b9302d8e65567ca508452b3068a9f3eccbf53f44cead8103c3b0d5df16d605b7ff9296434692b2a8c079be8659cf507e8d59663e6116ac03b43f54528427176a354420212f9208abbf933679c9c302c39fbf777bdb21c197065fada38b9797586e61327565e40113cf5980a32936b57ab0719a837d2a394372230d9f03a9aac0c8cb6c5491c7ea371bb17740bc76b851d77488c3b4c21d9c510b49971e11874ba9c46e3af7b555163339b3c739e4349291e931bb2c9cd86fc44f0e1911c08864cf3bb74b3484f0a7a347ca8fa335c58a2ac4687a33787c1b49b791c026c7d4b1adcf13b4c7a51e705c1ae114e527690b2713234d089fc35b880027215784d27e50e6a513598ea7a47bbb574a31d872c3549d307850b80dfe04350b814a297340fec56662c7131d99ae573800d0669ba2b8570119d69f30de12535cf05acd9e8b66215b6d2979ea7a64c25941c69c61400a62af40412fbeb1870319b37bc75d9292e2e6a76659c87e22cbd01fab946f1c855bca6d3d052ce42659c8c98d53674c83800d1776279a494c44617c281631dc9a338545f14fc1b7b7b407944786f8c25f69ab5e50c5d4d6315505c5cf03bc23b454d2427501a13c813cc11cc76681b90264121aea8594bf087b474d821ea102c7014a796429a05d38a1a4b8e6ef8504591bee10a3a7fba19c9d8122c4c66503462b3a14e99144257203f76ca484fec606ca158a8e29d944760059a381bd53c19d170642535f7c56a2f6bbea8b824a81339da5945f7175d08c69784e67d5e079fec9129ee799a1860ba58485ed631cabc19ad60934c192a27f9266bef098ce2d847407826afcb0ab43057008339c534b9e19c5a3542b40a3a88d41533b346754fc09fce920ed73b2fd7048e540bc9af49247122771fec129bf133c3c3711a679353a9a0ad47c4094471aee9619eb58a3831bc60257e07d09def864638498d3a731f24a814177801ae900b5fb6cf3374320a261d57c170dab6a473c86036733e85f290c9aa4cf7b56011c61723839b1e7c629c7cb5f4e4bcd1d6c9fec583d4b78670fa7a53f65b9fd0a91cc6620a5c1129339ce2a93a66618c1ec69e584a0e9c283993268fdb1c8ec25669439472d409447b6a04cfd699d167252c29af53eb27f6c3950b456861b7ad273887bcb3b41e75bdf2962b604ba62852a92f7b192cca7391accd0ad0bb65672e66317ab82bba06766917455f7fea8af660cbf6e3103f7a60b9736bf897b3a53c9be798ac0c493911b835b4514f3e095a49a474c0c907987867cd11ae24d22d20ea24ba028f02d1b295605270c00c732b1c19658af0424f2b01b7c4b8896e6706ed564b87f21afb1208f9f85e1b40244d622a5aa461c25b0319567b7cdac03d9bcbca028ab108837150a6426138b1073c348a1de7eca92acbbc0a95aa88864d734bb90cc8b8dbdcb91c4c333ae46dfd8353c27438abab8a60572d19c5bacf6b35a50b86e80a7b9b44bc74f74b050c2d6965298d33150c63c7a15150fb66082c851637568c2e5a9952e7ad62436e8401a0545c6415a948adf1449a51779005bb08bb75fd518c2dc02ed5c0b63dbb35a37612ec44b2a04a3d3c15414c0193ef5c09aac62d1cb212bbc7bc7b380bc88a37ab103d872605ba7883cc0bc83a20b2ce28a31a3b0bec216b7b1419bca5425e255b25a86ddb5ba95900c108f036a9ba2e941a1966b225b03cb7335901e6d32613b54806c0c737984da16284ab0b4594b0734fe5c6018c047d238fea777538d49992992d1a012f4a65008554405e3c0bf8d386c2eac5e07470d4d6015de45b3f99cc1b9b6f8e459e9987b773d69e3783b520d1282b177edd9c631bb4a76052c8eaa8aa1bd62269a2b2d7a6ba35b1670d27be1eab28d1571054a67e94ab3adcca05ec609b5171a1d4ac1b3a2876e33b7218c7b1a119812479c4974575208540a0831446a7be7ae0150859ad521a0d891b7a6cb9cde236b48868c30ed26391410548eb21756c3d9efa564df5780ff7b1b1f830bfbb70ce7181df82abccc941f1d79b6db3a012d5b7ce5b7ea9ca24b387cbfc34400d47200ba07d5f82c28991b289f56361f31330245f264149c9567feb569f4e2c21cd9b80a10a1ace3804b899410d912d42a9ab68b76c2b4197ec5aba066453fce1cf04d2a315961126cc04fb63361e137a258832679865cea937cab03534746918080b1b92cd099622ea137e4d6b0b30d18ba27582775398027bc54fa09d7a23655655c491f23181816d45437be2892eb73958b56899f25b3e48874434f12a0052518f3caf11215df0bc3265d648935a68806a75617506fce900de0cb07f7686223b9990719af5252ac61a6c44a7655f54585abb4d26e2ae5192c2381009b4796c87097c2657095ae03b924653bffaaab6b9035d176fb34184e58227a64059f54b44fe62a68c7a0e798362de1966db1a982ec3af25ec20f3824cafdb53cb526f055bcabe72a9e807079046b57eec2f681ac8ebcc0734a71ec65224e4a80244340ea1d339e44c7e2c5717208a034e9a6791888c9968987e710fde215207eab3f38aa49195190a885fe75074e17920ea64b6fa077336aab211fbb757880dbe36247299bb8f65c132e48c54d47eccc7aa124547c910831bd98b07bb1f435ab7c96a4cb9b46b36b6b667da4eb7cb2a12f1bbfa88b98f3c6c3704be3f000f65562d7d4c4977ac8c98ac44958c28f65280ae68466f6b7495650cde4aaac4c68e07767d09f44917b29df63352dcd76c1e393e0d5067c76855a989b04547a625762c730624835a6636191c83d3836bf74593839a83847aff3bcb3ab169f65000c6aab1df08994e161861498fa2e42d1203786300adb060a9c2429bc7325eca24279404ac3c934ebed4991502bd669309e7a76cf09507b31fbf659deb7bb881f5358d70595c01fbc7ae7183540b7883122d67bafbeea6f8085943992ed8b051cf758a8b8166c1a1e5f818f0deb30fa1fa06190424c3da70fe850e80aa818301d60c70f3038153866dcd5d179e22db59b8991bb4 +ciphertext: 9b957d47479a6dfd155260fbfb8752d27e19f551c55ba9b4b6629d8db47365a328ffe7d1bb1fa7ab7294c9ff449cacaafc8b4dedfa54339b5334301f1e17de9e27b5a5985420fcbe6b163d007830147ca38d9f9aa299ea2a4cda106304634ad47abeec58fc06528b5c245a90758a81ffb75648d115d39aa75856b64977ee1a7651c826a508174a7ab9c49a119bfcd973a4cddf2fdb4ef2186c9622c9d93fffb7e5581b4d28add151aee63e66f42eba9f3feb05b4f86f8410e80a33cf390721cababa5316c37b53e5afd955a90ccff287e121c64e3950d6d3e90e4cff61a638cb058648d19c2082a2802b92b10b91f4a0e00fbdb835c10f70f3b87c8b45dcf6615bafe6f059ad4a4d0b4ff94260b8fc421515bc0160d9b3c797df18f735054470934084c287e45ebb56d5464d2669015e2a072d48d46571bc7bd1eef75338d635c9f2bcab03c196d5d1aa5910f10e299f87988e1d44fb42b6ce5a8d49464c3e36f52af37ddee6d39a888f3121764342fa80de26763fa424ea3f3f961074688e200274cf047838027aa56091648793af6d7b0c5a27e308fd3ea090d531d5e1670e7b5b47c28e6751dcad317a5f8effc85dd4cf323653892d1c8126ef3247af8d250f4b541b446339131e90a9c307c93f7d98a17fc066d34e2457a6b3a6e3b4ad1c3b10649e69b11ea90d5b79a501d8ad68937dafcf660703df77375a59378fb3ef8d22250a848ef5f4801472ef39fa6e57e22adcbbc22c2e8730d1e23c4660e3780b6dfaff439a5aac5fb7e9ecf2db74c4ed16e487a68a08bff6918f5415c2f2f6b034428290a6555c6c12708a2883c121194b07f7e55ea70bebe1fd2bb577a8c52d91375fbb7d1561534215d1fe34d4931179c15e46b5e8bd7ddc045b82b09151f68800bcc3a612ef003f12f50df2c00aa2f4e371cebe4fceb0c9e7ba3200c07b04be526e71b859ab8e64b39b76d47bf2960083b66c1218aac27bf9d6b06cbaed870a0f379ea957857be103c3b2d254b72b01b049b11ce3a5c1d90ae13d4811e900cdbbe4d4ef1454bd744e798da49eedbd278483c9c8db68169951bd0063aab7166bb674cd78d5187f1cb5f2505a64687db7b54951ec6c064f625d6a74e86b5dd935b94077397cd434d28824387fab8413ff9b8295e274f869fdaa3786c543e8b1ce9dcb788687c158a80407dad0d4bab16e6dae51a4166f093c572787065954d4732deae996d58e6bd79ee17dc6d78f7721c23b8ee7f2779adeb3c7471cdf3006eb9b642fc9cda393374ced828e4fd4a8af9e99890f322286d08fd63a604a61d5144d9ba88276afbe84ee7c27ab956d253734d5f880974b592ed7174a0ba743fdac3c8c943bcfc93fa14e472c77b5a2ea1bfddeddae59895d43bf3e46c477c9023869beb1e07b7f80a7cf324684e2e0f67ca7843a10a30f7768bf838ff428efb22e4c71e177efd2181c9e4a78e3bc180736e9649e8e9663a76f01751150b74a48ae0bebbccfddaa449611884fb6fd7c335cfc0ca789a78ac1e1b465ca866e905aa971e6b346859b018316cd0bfdb7a3b8ac17ee08b044e71cac64e521c2d577dd5f4c6ac8aa97463334b9485f84b9a19e3cd99d99f911b7a5ae949545819fbd9bc5bc357c07c45801835d06aaa1760c09b450e77e547815d7e8a38c8c46b1c2442ceef1993827832bfc417a2780dcb788b75543b4edfda1d1629f7e21ebdb5b19e5cd72cd1cdd95cc9d6067921a7e23d68c26713e5db7443b392b7039b806973775643ad704376e8e51ba68e8d47af6924195421f98c134a016708312da306c275ad375b1605ff1fbc1a2cf8a6101c4ef45ba9085a6c28c5998b1e9130721e398dd3f4228791b0a09519072d46cc19ad5dfd824575aacdf9aea052c757cb95e7040028bb66002196a5cf9e632869c0fec3849314e6124a290dc4fd8a124a0a3219f106af488e135cb89dcbe41a33e33af79c84b0efa25f6d488ff56d49435b25cbb7f9d76c9ae7fd86f40773f8f250b59ab264eb60c702360813d20d9cd94526cbede732811475c8d7a3cf1b11d4565abaf8d996bcc023bb95601b88e316ffe8e3398b2a9f6e5f6fd80d66152f2f9669b74a4fb9221298ec7a7881ac8197466ae63a8642f641faa8bccb832f2b52b54d2dbd8248ca3760b912950128fee065b6ff2d9288fa9159239f0def0d06bc6dccbec5e5ffb967eafb5e4ffd8d1e53379 +result: pass +shared_secret: 39be6e85e7c17bd9e17a0ecdeb3e60f75cd5fe7913e7556ccf166d24049b6abe + +# Official test vector 56, seed: "687c02de1041abac7b2c1e6ec2a7c3375552ed5edb10e3a8139c24cc76bda44d719d8121a81d47a0b762b4e9eeb85235" +private_key: 59985866133caf531409205b859b9783cc2cffb66f52973ff226822187c58234ae920a4cd64665e6e60ac668a793052eb07981fd99c6592090e2286f0c405308970ddf93857e1c8f202173aa886fb54c242ee64167e9188c797888d1ca74604edf6a21f38a8787b5ca07b49a7c491c240050d8eb234d891a3e120165bc1bdb1800b7b32c254900f9e36e40cb55b4d2b366d99f1c86304f6a970941bec4d48905b33fc44564fdccacd60993352a215daab12a93417d51a3db6c9aa1a0c9a7d7b4a2ea121cf483090bb855048cbb6c4051140744919e4bc651b5007e8f3893c6ab6d745334918a2407a75557ec6b2db1cbd819509958c255776158f4ab1be64e3e431efe786c8c941ad91936f1e37ee396b8609b4e0781ce842c312b1ca70ca80690773455421d50f49401a16fbf47192ca7649e3989e0546a662a84e1904d82133dd2fb83ceb959f33c3e9d46b69a107eb133be1297749386ba7cdbadeec0508256b126f801138a17a0488cccea64a0238384ba53aec7b342c247257c5fcea471d6123c942b312b486438351ac4b5306c6699bd868087348de8f22f7f714ba3b74ba9b9c63a9098e45c1e37f2a4db9c5b9a8a9f662a2f3fb1bdcd48caaf1b5f01574db0712a34429a87690639fc148f984434ba7e35173f924a60dd70208d74443921ae4805b03c77bc48bb7b3b0964e9c743d02801b7a727025a79104c8eedfb80df6552f7038a373283d7a38b6ce430dd8b46ce067d0b699ee27b1690538541d28742a125bd2bc801a660410492707abc70725661f16b9ea10e7fba2da2d256962887c2a12d282907220456ce8a82ec163a54c97f4b7a9392d004a64731ca6b883c94a836e0539db41e36d9471cf13c0cf343ad250d05a26966898505a161a5910132d747fca047b5489a32245868778a68041b6b7870b0730afca761e640059d200f7a8948294991e6954e48f41e5f039072337aa5f2b3ec4bc2f1f12eace4ba397230861773ef628d3f13654352adfcc7c1e91510e22a4d0ad799c94a889562145f1372ab85bae981023458ad1bb9859a701af2c2149803058f435b4bc18e8a62c68c355c8b8450dfdb345d47a2585382e13c7d2f9a8adafc4643f642d4a463abb34c25341545816c169527641a63d85c0180d74a09b070b182bf0921ac8f59c5dc194ef8b93a0235cad649b781c58037e6153128bca0699d0b9494db44407f5455cb013d1a9073de80a128e04cecbc639c64898d022f3c0b514408c8035cbca60c4eade1bc5e9873ef1612890c0a253a6c34f0cf9f9cc8afe65737523cb83a90de44847102ce96956cdc988448f7134ac791fa44c0bf760e07b05482fa1443e72505e1b2e4e73f6bb775c3a1072bd62452d7994056101a63467da7511572142dd703aebb4bc4723988c334f4f71baaaa8ecc764abfa43273eba82b46b53f2b0f59f88cd2d113e49b52fc740ea0a5026be88739aac300e2810379027ca3b5467413b3484578062aa6b01fa91186bae66d3994cd41c191cae212a546354c7bc22d169dee7132a8c53fb6dbc4e81ab5cff448f5e7acd9c5bdec7c61b14a8671e45305341a4b8416798138a475154000b1424b4c2579a630a0968dfb7595c92c42292c5798b6ce4693c7566877e2725dbb5871c51fde7b2022f28674d11d5c86c0a1874099fc192af6b4cdc50843131c232c59e6e48a21dc1b8926b40375b6eadc7f11a8713e08c0a15220001469da3a84a8a802b2737e596bacaf674c29d72fb1d463286cc3916b064e076d53058a5f86118506cd99e8372996a8e32a36ceb31163694bbada95e9c36f02851d379a3522f638f737723f2b840663a60d2a8e25d49dfa6670b997b361394e9db653b269c352e5135adc008ba82cbae431f6440c8ad9774c181dc0c07b0e0a326758bc536cb94c0c4d3e5490b6f7158c93a1b93915cd70bbc78631d9d8a34bb2c383ca2e1a59859c51306a50b8da12c41467c6a89cb6e4506d1da5177b2b443c644777a74e96f65913589582a8c7abd99876f48efe540cfca7a88bbbc7784c2815fa82d3f17645fa632017c4004a5846503c9bd629850438d964892d0208b67903ddfc5476e50967a665b4b90abe8795c7a234b2759826f9b1ab846d5f763007fc93107b1efdc7a2876488b19554d4d3a9f08b82128a170837c0c51758a801316881c56d436839e5778e79553d97c6c48587bac980e17632f7c7af3de5a9b15ca6d33626254a9e83009442289274a4c860f42c86d8060b2821c873aa5cbccde4540a8e5a6784ac15e6b30cc71a8de57a83bc5924d0117bbfbace8ad5cdfeca785eb224baf8361eb64c81453fdeb54e4e86ab4a397ed6e84b9ba73a0c4b8b606318ccdace61b70df22c4518f463d8342ba6faa846eb55284995f36a7467385bc8b77689807ef511122d12066e12619e37c8ad0872d5710083a2b9dc7107c955623cb209139034c9b3c6cfb7b3133502621662a61bb63b9c3a4586c2201516ee6c3f2d25026f932fc13c5426d64093cbc768985fb8f70b6871755f8811c60a4317a21ed8b5a7e51c1784b562c2a244065451e22935ba9c3ca6a63dc945ca37489e317abbb02c9e87b6b7092b1b4049c603f087d3596169baa2c6e3a778e61ac5f04962b61aff07a70ea72800a0143e9c43f2972908a27e0f3b627bf14841693613711115bc19659c5b3db6bc19ab7be40c24d5887d93e6b7d31899771244c756790ee881fd605d1383409d608fc1a10d6f2511ce815361a66db6244bffe1b61a46a888a06f3260409239abbb9c717d76ac4d658e728977c9f09bae86105d796f0bfc4b87385efcc791aba5169c679dabe34e1ee44ea66ab3d58724c3e7099bd80a9d52cca8ba95f9699c3ad8c90199a3b9613cf9652a79cbb93c8c949dfb0a6a7a1fc5e4a6032247b7885b3843a7af4c7bd49068228875a002321530bc6b5076d0853be448a8a85a8be09b94e5d65d3bc2194a977396d71924bc5b420aa6283b7ed9ac822c27641c811777a8550168468892987e936488d71c9af0a8732b6ac23acc23c2bf8719be59b23aa96110ff02af63858b7405482d684848d83fbf3b317217be6bb750cae74df77a8dfd32539e8964b764a100688301ac20a95306163ca391d33052e7488cf27d4da5be786caf99e294ba1782d462c446613a15f97e9f5632c524cbc0430382e828560315e6bac00b35c084740dbf159809849f8e104eaa28abd5f6978f071d53279c4689c77c43c0b649b8aa042a9c8ca968f28c81c211f8bca19269a9d79985478707489caf7690b529b988471b12523405db659014138d9a6133171c68961a327099477759261c523f9ba6a008d3c14b0a02295902637912bf1230a8b763ae397f805c2cfb4228776443645274f5c01515986cdba31285f9c72fe7634c0b44a42150b1dc75d8cc512d503b3ef7487371b70d50b9650360f073936398356cc3419f1225a3946a61bb38b2e61f0ef85d1686a29e56192d8a26d42a22f274811dfa1c1c4cbfec8323880523288805ac98000944b667346e173611fcdc3d474b0c30b0620f69b3d45321d9c91a130cb6842659a6a0904ba598ab706336417e17607e865328ccb035bd0646b023c3545c2b437463cffa14dbd86ee12b8ec24375f5b4a3a0548eb9997030ac092a579bcb6a0a984c9f354312931c653242678e98502a519d15e64597fc224101cd9462ace9ba56c421b692668976b3a170d88c4501147e6c68ede8a29fd4951d32ac9dc06f700cbe9b536a476736b1eab14e2493c5a94a07f6ab5a323ec3e9b9f639258275523fd32071739b585b5d8657aa502262700998f0c5ba71974c35573f14c13a70842149c077624737e5a06d52863d63f815d57acb4f0142c9167d2784365ed78c9f6b235c7368f2b26dad962e05f2279ceb44784901dbe87e413a04f462b4395b5e2264784c2ba356935dc1ab3c104b6be09b08941a02512055a1d70ecdc281e09c78214a0e57f2ce035947229181b943c5380b7e6f804fbc815a1f3023e4aab03fb4b0e2c459f58c348249adc6b4a5474622c3262b11814acfa872bb6c79b3614e3ad2a1516a0b0dec98f863cac0b061670ccd8d0c6f7eeccdac933bad47cecedac3a5231ef1c040aef8bc53025e0dfbb3d5c6cb2ae96f11a05dcf8885aee9756a13ca0c1280c4d331d50b850b6c00999360dc585e1d849114b13f3849b361f7083b5b3db470796f5761f7641a89189c748b4f6b88822ec85b04228f04a669c495af4c091b54a3835b379201d9c7273557f73c1e357588b68baf3e2a5c88ab0e9e057cdae06ce672c84b2a04503372c0f370d114ae10f97052fb3ba450d323fd3bb1b887fc4da6dbfef06ba5a2d5344feede346d1f04ad60895ab5aaa698c34e1b3b6ef69049a883160c66533c8a65249aa35006f003d4eb4350a43afdb8a246a56ee71465591831c371f2eb87467b0559dedd776ba063ee6d2f93 +ciphertext: 3233f4cc3f6ec789ddfcfda18b29607feb86a95d113e2ad085bc8b00391c70ede55956a82cc4a693d9ce7f66d6955d281a33b19451e9998b28cedec33c45435e6a720ac19ce7ab900fd16d239ddba34bde4d0b4cd5d307b261f8ec893dcc93b635dd7d608586c71560075dfd15effa71782616fe8679197ebb9f98469f28950634a1c1a90f1cb80cc8d0314beccd8a8768e20eb715c2e5f6ca3908bb7b18c5242ce5b22287657caa8dd787c46cbc30f843a9dc0f0dd156ff016bb21701345dbb673fce26277bb49188102b49a52c2289f18429b4cde4c0455bc809a8e20b6d8c779b47cb585d5f9455b416c44b2a8519bd4159d5779b4302f1d632466620ac286ff8bdabbb37299ef5be3984759269af8cf2530ba8af630d4862bf4cd2e4a569e035590c316f9a9346a8a0ab271b7a6a8b7b1dd9d2bde91f4690ebfe7b759f9614412bc76364285cadfc7a4a7b688c08b2b769e7ea7a53e0196dfb7c1e26f447b1a9de9d587c032ba60fe7b7298d1a70dcc96617282cdadbcebe809affc49cfd635f273ac9f57ca1ffbb7f0c5bb0f47d180e562da14d33c9c2f7ce5849f1c68037c31c0906d7ad6adb228f3e9d68c3ccb51d2900c39a2176fc86e50b5c8faf857ff1bdc9a4d6d40982444469ce4b918d435e1878044ada54032855cff3fb9f0841a412336e6407cd8c142c137e81a113da062d061ab2f817104a179f2452ebf3b92612da3592a74054d01f17126b217c58a6023a7381a3d1b63d224fa552cb1087ed7734561fe699a11b073c7402a801326229675d6ce72706ba7b69b87f5316ea80cd5470c4ef45bbc4c0253c7b5d9b2cb51259f791fab2b9fc9821fc76b54107edfeaa2717ceeb9e8dff6cb2a4bbb22f012ff1f87cc4703f52653dde94db328dbbb35b9bb5da3bdbc01c3acf4b2601d9ac1f9a98d189fb1faa073b52af448a6e933781017c38aa87070b4b4c2ace0b5af9b0e5e6eea43e4f7681baab39cf40386fc503f291d45050fc6283eddc551010cdf583f8632d69444d95ccbd15464833c724bf9d2d82bd30ba3874174ac4c2fd6168f282a82795f60486c88bde20f67e645394dbba2670487f9748bf719fe5dbdad7b98cc8dff4a1a4b9bc62da1d7efeeedc0c37d5f95816ffffb78a77ea756e53e28ed69ad661287ad919af2de3f9b53f7a592402218527d8522e8b82cc235e3d5f41f2ac909e40a7a9295fb28d6cdce5a70eaa2fe905e8a1bb997d06ff9eb9b486184931f0f3e8a59ebcfcc814d31c69bcb6eaf5ee9c9a93b7feee0e336c8dd63bf5ead30f419ddc0360916d945609d30e008aa5f7a8b58ae7d2c7855131bb89935c59370341297c896c8278521c4c3eeb558a58114895d3da678249d0862f0ee3842379f59aa2eb4d12a78552e4b6f31e014cfe27b354484c53137630bcb56eb5d19320310b5d9c309bf2c4ef461d19adb919d7958a0821026c5107f5b028d6ce5069239e1fc9230bde296b2eda8fe7b723bd1f5ae93a24e62194438a9673c0becd91137dacdf9f6fb00da48e1417df117d21640dd92d98dc7dc139b6c445a5e275b74fc1e38c8550b3d822c2b2436db3ae0c1f3c5bb86f33f9d36e9af17114f52e7c9236b5b7d2e6da889d5572b8460bb002442d062506e66085e8b90c76c700f6a7b56977aebca7039e152579c4ee27b6c2a1f7aff87f6cee904f3e87c94fb271d074b66be181d11e15e15c4e101018b6ae70d63fbc42a2ae48994e4fed115ca3c84cff62a88898087b5a6b1874da7e14b39f4b09b8e2b10a7428f336d82a39e150dbc37bce6255e0a5e8fa2b74b5b24a8aa601a6c671df2dc52e13cccdbe32c4852e676e1a77468ae66ba1dc2ffcbde477041ec452dcb78d12e3c3c4057b51c74464c41e65718b25c8ecae2fe5c6e069d5163689d2671acf75002839305752512d0b5c977b9da6e981b344793b8b162e78398290425009f32441be21418fafecf2b2c7aacf0dde97896533c11ae8b94a698ab8cf8cb2cf3ebf19a358bc121dda105498fec665c760c7ae16de69f0098fc1c9481ccd817fe9cb5ea31947a35206d9c1f86b8bc8766373bf2aad13233a001e1e8cd865f8edc67974849ab0e98699fbaf73b57255afb0481cd55a032c533ecfa7219cf7f9987679a180a2644eb4d373278f1d45f8d69759319e1ed80eca491ea1df75c8cd98d694fd2480617170cca06cca20ca4650f02ee58c53 +result: pass +shared_secret: 468a5377e8dfb3c0f0b79590876887667c470a1855c55d47ada807cee4fbb8d8 + +# Official test vector 57, seed: "4142237070c216bcbe245a39bd9220533c97651d84832b26727855ad994a0760c52b9319ad404693e4248b8c5ff324b3" +private_key: a1ea441afc0440b20c72e1b094ec44783325ba58a537bb2ba389b1a8e111fa85ac48716072d2345d789b2a9a07519506cba99aa60932f0a112282531a4123c99b8b4eba967f8b82b9b81c3b913b05cf51dd862810031aa7928242ce7b0a9404bc0142746b151eb3b002d571c07893507b7487063a4d59453dca293625cb45fc8464edc0322d3c9ee8b8c002c227d97b36611cc60204af3d88352d6bd6c07c87b1365c8c58d3a2468d2103be03604065734780765e4b932d6b0bf3935aac04849b0498a7087c7dadbcebc167858c778e8a09138481ef7074afc688829a45311d16077e5a9e38744c140159795a281206998943db5315599391d39007c25481bd79c8c0fe55aa013397be3ab85204792872577ea1b3393cfee4c90b442640f864bf0605a70f608657782a36cb78bb37d91748e1bc2bb388880a3b9ad78235ecad24b95f2c0f880a59775c90ca46819300dc0cb35ef0b6aafaa2f9234bfd7f0bf41507fe0166f7a4698e992373b6867704c2e7aea3344288d98b22f42888ee4da9ecc411aa079253309a2a9483d2ee2906518661e64482bb9cee4dc314034741fb7377728831664ad3a333105b261ee87b107720a5da79bb234cde3234364973237d825d98657709715b71a4d7b78952406b56265b6756611d9a2a4844924a78a0bbb3c25ffab7f5b94c96a3a90569cc178f06c884934b547a116938458e5bae601b49754b3e0e48c86f141dfc624ecc0823eb6215476911b4b9d13b93fce12076573b995ac8984b5a0dc33826d3b87ef0a77c363bf3d5c23255021f8612f28eb501890666b4486a972a3522b07e1c13beb539e731167bd535593796d68d6547c7913abc73d8812143bbb2cc6a05908c1038152655df28fba4912c757c9671b8d01570a5dd91a5dba81113a69d15395c25b474dd817d862ad78d24566d7989b3691faf25b88137f3c683e9917152e9b7d7218083df9a0e1fa702f184d745b7dca658b07a42494d27c15fb44f7c1199eab93daa26fe3d5406c09ad407b6d28945493db62a9924e755c29b7b1873f242f7c637d9ec2a222b9ceed63bc73543a5729b93d618c09738957c8368c50a58d01a7ba0bd06548b763a4b3891641e640c89af573be0382055a9539b471c661646047c10c52c4d8121bf32bc89532b763656cfb19be72330d4e7cab3053b900b162ff480dd5018c9202d0a41a4185fc554216065ca0cb01d5460f209debb40496eac65ac73ba264041bfb43db29b0038ac8c12164f9826c20ab8dc4248dd7717ec3d6c2bf974da380a31323b1b38678abf80a32f832e642c31fa69a163b4a3af6250ea212e8033377d1c596a72795196de2873bcc00c21e8b5d75619c31cbb1b1e339aacb204c919b43cc4982b3405d82bb0c97b2db370230c2413418c91eab62e30b57b304a91568a8dd29506e656c6785bf482807960bc962e43fa7d8ce04669044924f8c62660e5a0eb9c4885e739c58c22d7440583189c6c9e51aad37328a1c605bc44136f34b3fa82e24764743a43983f91125415c2e5042ba6393d2159b8992c41781a06d6c5745c5cc3bf10785f19ba1133cba89c2609a26a3524daac54d152b34d62399459cace6d0caa1d01e77841ab153387c64c5dbbc29bb88250221046e927f6e7a4d85c5299887ce3774a726096d37c61343aabdab95720ac89bed9b7ec29a14568178c9a63eae1268f9f29d9c4080cef312609834bff34bfa775b4b3078fba0cff3812c1d79674d13c9a0853f89a1bb9a87529d55548e303d51d8004f539f60d17e3d858037e90e04dc54a2f8bba79a395efc823e085c93eaaa069c4a27720c16047934e2cee970bec418a02cc91ee82a3999870fb190855e571c075445e2f53c8eb65f4a18844032b6991c098ccc069ff55a84d484e4261c7a379655aa1d2fa461aaf74deea4603838b9e8d908f9b7a3939c17b97cc9c330438855c77c284270e81528a745a7b97098b55e7a120791491c10615494b39934143b18311e83b13b6e92bc6d450b47b7589c1571a122370cc98793a13d1e008d57e955998c222a97814a1caa5fe7c336ca331bc6266dcb85d3ebcada0593c04bb91c3155e83b2e0a8a57b5532f799263b0b3111b1146fac429ef4c870911399e8158915b7522477500941b2c560cd7a39000219f2ce082fee023e6c49fe0381cf056ac1bdc95895271f4e245bdc98ee3a87f651191832b224b3c5528562f9498979c4485c3206eee0a6f5cba8fdaa70dec105bedc40e4c6b667d1739c8580f2d246371f415411c803ae0b52f0b5a6cda5fc3340f1bfa10bb29accf402d6f06472c14cc52556e5a97b56c190eabe6817985cc346baa02c76afbb6b6dfe33f711c78896a529656b4abe25516e448bcb41dbabc340ef4b483b750b0180f68ec0020271a0e9b9f466a4728c19bdaa426fb82294ca00261cc0c3349b75d397674644ae5ca363774abe8a290240abe4039a7e124cc894657c9025e1534b91b896eefd3af2d559da9f8558fa7774708a7fd535580545bc68c9cc89ccdbcc78ed5203ffb653965e7b0920574b7907443b9931472cf19c17dd18ab87842c853462366646881592ec3f5cab67b7e768472a08a43681120f491bcde05a9805c6787b96ecccb05d7d944fc858b5ec3828859234da88d8d00542b104883e824e7b630267111e49b1bb5e4103ea9ac2b187e046b4cd109709fca26af813440f30318dbbc34598ee5dc2806794c4e0a8c6b9c2310c34636088da92147d6b32a7bb447f50b898c5a3e5cb43d6e3c147ad085652ab9edda72f25b7bf250ac84d1288fc188ba645d88333b65b1150722334b5616429b608a0c93d0d946c15576c82093e0b263bb521d9fda997a461f1ee47098861feeb8b557b4656cbac57dc61fa9510bc1c95726b561a1ca4000f28a5720c42eb932f1ca8fc9b647d3740117ebca3d5587816bb48cfc1cb4e9caeb7834e1814a7c478fa052640af253371242da9575c2a66bd01c5fca4b958ea437e6474301069d0ddb254bc4603d3ba5b7415a96e5327743662caa7e08f608be974341b70db77a850b2c11e3b4cc6525808238cb097611e77cc449f17c63da122966394e79518fb6022ec470e8c5082a945c73b52f05c38e2dc3419af4080e890a6e819bb1b301046057e548894f511989a40e854aafb62ace7e586793921e292cc8601181599977d9fa457aa2039b14488d5698a8f03df1b56479f9109ad105b028219b3c90adac962369ac1f0043373bc243286c24f599de3a28684524988198971c1f88419ca09b3e4f22b64a221df8d32afdb0572ba62c7387235ee2752903535c9c912ae30c9151a3b6c415d59a4969cc432d088196f22c518037044236eb441438acb6bb61ca45c947ab98a53b44c48119135f776f2aa4a8413a1142cc4eed8c2948f8ca5db39388dbcc15c12d13035763a57c523b99a1912d0fd29b952776eb03aeed697320c66c0f65b369e13c7eab1e98b281e7b17cc2cb9ceab725671bb5df0933eb5c70a3d39e0eb5a55cc20af912af87cc23e10ab77a9c9755201ec393b523f51d5307b176f05fea16a2dfcac794f834f60a712f13ac8d5174d3a7627ce66fb862497cb95e36da3f486c7432e5983c2cc8cc3a7582a6b22c5a7ab3bc5107c831af145fbcf74ef9523bc7f0ca5eb97b34a3872b9870eefa3fabf609475c46b1e736cff313f046b6050c13392571f2d252959aca2f8418f7489809ea51939a1e8192bea5719262208109b37bae2424ec3655ade90a9ca235f69c8a3be54793655a9e8c6e9c64354a842458067295f08b6ab3b938e6b188bc252d4569589282eb703f0cb237a67a779d8957c4602a9bd80f266303898acc60439a975c8e9d8342f6f1a7d6c92f11606435878739d3bd27460fb5e735a73cbd1cb6c657d0a6074633de38647035b54bd10986e4573e09820ef56fd8d71ee778822f72194237c0b5344cd8c888f12bb34fc86e6147161143365fd45960396bf45a8868176c7d0c440fbb71b8c6aca11b6ef3e33484f9bc22d090011918c3525cd0f0724423bd1e1c2b46a66552926a3a6a0389410a3e5c41d66b07c1b41c645787e8503c613343cc73066bc85b028025c3bb6901e33e242a0061e001ecbb7ac690837b02282a457ccae40dde98934bf37dbaa00dae287fa0a628c42a66a7e05a6645b244e909fccb6abf0075bcf0974b97099a7c67a2c71090c7bb016210d0ab69ff775dbc47206429b347e6749eeb3e23983759a583e08b1653cbb5ad4b677f9b9b365287c1b559c199c3945653a3bc7b0da8b41914be5b411268080396795f1b95ae14871397e14f8f3bc940f00d669886668c2dddebf98e5e270510db63b9982ef818d1253d74a644fd56900607545ef85499cb370a74dbc96de89daa52e6af0482648e3995fce28f7b7c0daca7b78f1a230e05b7114ff0395cc6634db1eae8258072d09c09f291e92d6620b177dc50d7 +ciphertext: f05495bf998983547ebf417fa81ee0e20f21bf5372e112eee88c6b10b7e92b488546cd524e4eb6a674f20d9c2b0c54245be13ae593a1b894690554bfafa7f5c4b51cf7778d52dd74226637f0d80635dca6f838cb29d04182acb82ced6873a63f7e35da73f6a1c80c12be044412a2c6fbdcad994727b8c613ca1f7c71aa730c195171e929777178188852f0238d30be6438548d5a58178895847e3ad3995fa45a4213062b9cfd0337dc726fff4a71077690015d9f59ea6e206b3fd06a59b792d20cb74c4a69e706daf0efb0e2002d194aabeca9bcebb2e6e99fb3b03f4c98ae7444af336222753c90d43c76c73e20cf4276b8ddfd81e1271ab0b6105f0390852970d90d2d662fdd6675a9a44b4d64fe8e19e43110a5707f0123993d698e46901e78a7b9c015464e387a62d2b07e32ec8137af4b323b6785ee7ebe0d9e95f438fa79389d661820227d1279782dd02bd0afd6d1056364e786322bc17679bb8626f13ffd3e00adec533e1f1bb563016f618a0482c3e8f8dedf903898dd9ceff7d7f4b0ad53e91441a383c557dc5b61af80daede143cdb67ac4976ed740b006deccc2a60b4bfa234e3b2594527ef2acc10edabbd8cce6b6d31f7a2375c147aea1517f4ed29a3fe73c525974c4b0c02917a12e417fde222770ea9f8ce374978b962e0e4ca5c5a2dded62f632bd5db71e80f91d1cda3ccb6861045b35fdd136de1106d5d7af3ace8b7af2af137b63e396fd74d81a804fa7ae1c0b244eb567318d4a446518baba13342bc4290ad6727fa0a1105dfb3cde778b47e8f3886c3a93e2877a41873de3301c745785dab0a31d6b3429abae65416fad5f4853810e9a73c1298e98a8b6b5c6ad48a2d461ff62f114f8adf3c26769f870216a52a186cbccf85beeb6e189e23df0cf457b75aa9744d489f4b703bcdd951f1e8501cca99f299efe177cbf05814b7329b6f3e70f019551f16640713f24786921e42535ba17c246c1a3bc30aa50101c3ba30325e8a14b6d9e943f789103c2498c41634e14ca58c4ae55332418969f146f1e3f3123690137d54533733e7b4c61a06ca59bb99cd2b02c55c6c83948c452e1780bb15f95e05329fdda527cae208c698408f6a4f1d3d081cde45e3e2226d74d280177a4eb64f1db5259ba1ca7f51322b414d199d994c0acadba583fa1528f57da7fdbea17523c3c2659219d735b0b7add995d074a7cf3401512df7bfd1594045e78c9366cf0bca693eca3c0882fcb736eb318f74c6fd122b74db92262d933ea95ba45765f4d68d4cd2a46cf3ea603d4409a709fd0cae87abdc1e07b0f591f6534545647693ef6b8441ded679254c11037380a0b049642e6b5f7fa3a53a84303e24abc20df6537b41eefdadf9052bad0894f467c158b2088cc397bad26dd1951017b9278fbd0de090f424ad58d5f576050f3d319ad6426ba0a6bf3e5df032320b0e7e0c1eaa2662b8c9ef163715cf44c2580a1b36d2442582aa9ee05b0e6c88533c4fb75d3aa37d9244f70af8dbb12df6945baf175a00846f851eec8e30963b0b9adc6fdec86d1f4327138c10f699becd1e346aaf5a18ca4b9f377edae3d0754907b5f62b589cacb24aa60f5569b1e9d80bec0231aea82576494d66f9e31a010416229480db8579e7f9c967c52ca8344a3b2e7161b1779477b83a4740a22c27d1524223c9701d2a410ceae55da373c3a6a84de254f73c917868c59d95dbd07a89a4c41bdeed5dbb18505ba1eaae4d97470768306afdf30b5de51ccf87e49eed389fc3f9dd571b1e29140d248032d8715c178ca2e2b6c1d0efbb59b53972dcbba6ebb8aae1b0f375152bc63dd5a67eadb83bead97c73bbc5b3f9705cc1a83f95a7a15d79a522c7e825388707d63fccc08242b4d62cddc5a3f5a0be9e27efe2528bf26bbe47726cdea7366834929cc06745d57d31699b0e4fd6aa09718654cdade02a79ee69278633e3b80327ad2e732e24980907caaa989130fb7364f313df57607d47d4be7caee53990a1e7ebae03044412b01d35caebab19d9809f6ed2bb60eefd6149d2cd4b45b0fd6c901154546b0cc4119e89e15e2a3e19d3722e46fd89b1692951607debf04eff35268cc6d5c54a5dfe000fc56b5439a3c34a2df49cca808fcafbfd7435ec6c70b9b48ddbb5ab27170314d61d41ef71fbc54d5b17d279c092e920a79cdda050ddb9c320c24e27344f8ece7eed184579363 +result: pass +shared_secret: fc48d9dd239e6fea212e83f63e1dec4bb5fdad92a33d06ec3b5dd53bddcb1d83 + +# Official test vector 58, seed: "bd334d7b7eb14e00e68863f2e5551a095f8af10681c28353fd19b9a7e70b8bfe266840860609008a567abc66316c77ce" +private_key: e8d7111942790185ab64776746d835f4f3b4b8458eece8cf89e08b7ae974bb84c5a5325faa7958f830bfc65a3f57b9bb311928d939b7bec454b051b399103aa8f871f3d87d240693a2d10587371a40fab0a52a3c13091710476a393a90a89b3ca8ec955f3b42287b23b2519cac32a1b8ea6194752a3b1083930a0c415159da51967ba96299065158f156d31189c797c150306c2903b1fa4639252aba2e131b3ee74917ea269aa41cfbe05915688b9e73780d46ba63325601895aa054023ce760347bada01916087a700963aef293a40a0b3e4de60258a0a687e367489a684a22b86e22aef5e5976989b09f1931d3e753a6265aeb677c0fb3629329c28b2061be210b3c156b46c5364df8b74cc95b416341ae5080488b895e2c4e7005901f5397249a3fc1747baf1c8105eb433227c959b6ac876629bcc911eb671689b2bb33d8b6a1cbaf90d81ce3f11200314dc0a53b41dac824ea117e25852f2339a33934278cca7dd0797c7b55af75ae8f6a1c34f288c1124dac01ad5399c1966049e8569efaa305caf9bba4e92e15154d2b2521d0f245aa89788687817afcac195315befb50eb77bcfa487be2547e98306fd9e92bab57cc7935168018c570260c93d712e3058a843aa36e88123815a847411a3c4078e336b2bd26472be6b8bec382898b57e02048e531b335894ccfeb24ede00f9a46a34ddc67f9f73bf5d98a87b50fcb115694e7b3daa7067f287dc665a13bc58661b53137401403a211a3574a7a596679a021f8458c7baabe9efa18f3f82bdac20c6cab93bcdc2d31218dfe0c451724226961189b460958a9bd12d87446b7b8dbf65ac7d908ff1c9fb7e927ec1679da95c4b43cc5a11937b3538446298cc7b55b178078025a229be58a95a0727928bd3370901b180543d78233530186b3155a78162d3969bdd6b6a0204a25066303c495fdc9c9df947959b79497a805a3122c71e96efa728c6b92042b39b45291cc87895d4ab62a2437c9aa7754b54a48cb34c1070b08fe2cb2edb974ba633cc6c5413980ca5173160ca43cf77320850a12e402a0c94881d3c50eb5f317628c4e0477bb4b1b962c15081b2662d65c4ee1099c001835de716ac6a924d3702dd2c61acc2487851a14ef06c36c6925f9e6714291765d8272bdac11651ccf6848975d57323f599de580cdfd892209c7888b7bbcf6b65c1c32b5a8e9885a29c16446369fc51e4155b9d5081d9c74c2eb2c545c07277f608616d800e3ca0ff95a655b7189c48412556a8fdea48e0701b4d1d5175cf0088b70042b5678f91164eb42031067814db0ade6b26c606bbf8cf596947980793ac48f7abee21a854fe00551e98ce039734ca028c8d8a3169c9922dbc273580fd5bb03a85508e0141eef13a37e80ce35531ba7b900599acdd281ce729c4f2bc6b898b47622f5b559e7cbc86a26ad61a0edaacd3aa638879296a5413dddb78edf347879c4c325ec69e2bcc7710b65b4821489aab9ab7c8ff9e6b8bfec9d5c61967b1c77f7823cdaca03a7fc04703740dba421c30b8ac1894ce58845ce9a73b2321c65228ea0d64c68d3c7a6533837b6967ad3139a709acd8517ddb693ecb75ce3db51b7235b34c0b296038a140737bf77ba7ae91c9c49200d6262a2d357ac390c744bca28c9ca4d32a2dd8b456715907b1b42e7381a605b16e4e2a021e383f4d051f859be8e83b39a2bbdb9987a37423b689718c72365dd5b65d1601b48707955724ea106602b6b4c2223b142907195855d652c13cbf29340753911714f82bcafbff178d52bae8b9447cef9745a6b18f53bb697ac157516c3123c526073cd7aeb3550128b1243b95f178705accb7efa2fdf9c5ff9db4a6d1c171aa7b6222151375796b93c8f39b8262d56169f591a8b3964ea228de76710698698f23a147e3206a8641f5c46b7573b1eb13b8432104fc7751e813c4004d25c2af512c5a47bd4a50a37129d7b0b80ae551145356ec304751a8ca143a57c6c1830ab5717e3862b50f70b745b33210bb73b340154b6197f1423f9ccb88feca121e24e79600dc0b047a36b1b76697fa06395ca8769763443695852923572566abf8c5c7097f6425ae1c7e1185b1db5ab75a9856217ae82c61c82265e18151f831b65a5b435dae57a89b2ad55c3cc02f70fcdc55901069a2e773b4f240d6d4ac24ad53108968ce43555fd4bc4e3ba3df7a1541e0764c6a387de455a564203faa38457376a3170360b5303be69450acc7ffdf638a90c7cf4031719eb27fad55e4c901cb7dc5fb828ae50730609b80d5a92a89ef1963d836a16685881028759d06c55b9505e84b1aedc5e07d5294a084c1201c0109699b3009b2c67603c055949f400ad487167c1ce048b49a98a8740abba9291618f7c395d77b0649cbec1a2c0e2d25c86c70320e92be7595e103013c4974b7a3b70d8100d61b89a1ff43c30f48c137511375ba781e74bcbf322be908d09fac8991b4213db7a298c2c29455b3a5092ec8610c0325187434239a8b651f0a164240ca4e827f7bb7345848e01b50e34162a359c2ef8c8c9e6e9b7a18bc371a20d2f086865a83a2ba3545943068e173941e4875600183fb19bcf8242fb576f908a8d805cb0909054de4cb6b84b179478a0bae353d8b10ecd278a310466fc0a00c68784ef246f1f0847ccf72894549806c2c9650c9430b02fdd5cb0b3a9608bc85f02dc32933811d87322dc4993d3d13177b7440822c62fc7a31ea174159814c59bb209356c5dd20620b40d08169df1a12d913105225cbacd9c6054f1499d6204cee06206389b05057e579a9e294b43243ab92e136265470786b256f615cd3540c5ca675c4bf68f7da4760105367ad3c6d71a2a4b209296daba2768223aa30845d4ce7d67c2906156bbc4c24410176652765e294a9e22c58cb031ba06a11b5a8ae035a37db36ce1771999061d722cc99de03e96ec3216543ef74447dad96bfbd386b3154b35e08dcccc88791677053a0001dacd8eb6c34cab6eea355a10c517c45164e9eb4c714091bf129186a6b3bf33a86049671652ceade8b55ad17472b49513a79f2b867bf3157d5dbc929974147903ac69a6618f67781a450637eca5d0950948ca8f3d7c41983b8942b03d6a04842a09a4896ba3cd345e7d72a16ba3c63d95a1e85ac4fbf42efb588b088749e2f66bd6f06d56bb80a818c2c56c5d1d1b5580863d1ef10ae2a97f5f83be12491c7fd629d112823d728a2aec939e163436259367473ea0b63ed37bac19934da906a21e5355a3a2277519c8f53c96b4f1a8704b8d79666c1224819590048f5b9a8b767ffda0a20697caa075ac25b5546ae32eb2959947b11fdd384aea2692f7952266267aa559c8ef9168a04cc57fd8ae46674b75e785535a2b1c0c779a553f4ce5c1bf6094541363bbda825fec4b42035325a3a2b1a8135dcbcbf1122b8fa1a37e925440e95c2e4c0ee1f69318d04282c0bb5fc8616e99c9ace80d27a79b64c843b08cb9fc7a27d20309726cb50735cb3450be54d86860d7708b11a615dc662ecb229997004f9670e27898e78a4b3732b4ae5cc459f28e78741f9355a8ef9b394cab001c912124a01d27232f060ca523d378a5d42e0022bef2d2700d7c6c14da09736679b2a0c33c035b3f0513bdb5b46fdbbf3a5b80d65c4be918511bc8631e35aa5459793f858f364c96f2010d8849229acc89e8a50360551afc8c1d481a1c21ebb100079cf3d45ab4159371c49b16cca69fda67aed5881f300c5864c03a9391ab1080b92601f23a417a0563c0c14b16b0255c36529f74a103036466fa9290744eca08cb16b94f30340c49581becea5b64088fa7498e02b439981cb4b4ac29ec4684152830ed82864ca833481323fd8a8f66ca34bd4abcef70c15c926fb8b6323c609efea710dcb6548c06bc13d6bbb41b40caea5745c68cc550873bb467f9dc6b3e720ff4649aad171bc5527b0633cc2709932f0869a0702da790a305761f9d146c1b24005f6c1c808b6dd5d97c647232e843cd61e39894902b76624b73739e3a1bbe4fb1b4b2348c836592a2d31dc9884394628ebae00112643bcda9a01f34a8bfa828333b32e8063acc5344a4b36667691c55c50b2e3098bb4c7069846283b57fee61089654a8ba06797c57c2e7e9bf1404077b80928f5a1bb6c6a753bb8a95bc46748c32e0e1c8f7aac1e2573a47d104ff9567daa2c0732c501bb9ac1315a211c11593fc1a38a69651347b6aa1250f3895a7844e1de2ae45ec66214a8b41da464baa5fc50100c5073bdaf5b4a88c70450256b6d65413ab3ed302ccbee864c578733d40a796981a8c3849f465cacaec79898cceaac424fcd9b57b426caf306d165d1e0ba6573a638fd7df6b3f824f240e7e0eaeee7d7a093875cfb4f6a03bb7707d37c80474f92c12748b37f448186584df115ee97c195d45a81100ced48add211a5c937b8d6079d8e271af3f949edc61f70e60453aef20dea9 +ciphertext: 26d223332fb3dbce267a1f4f233b61afa2daa02cacafe508d152b22f30478e423e7a2343c857a7f8deebbb048c4ec22a4ba846eabef5785a4c81a3001a2cdb984efaef5f9e3ac845252540b62b861695266e264600a8a284c048e3194fe84ef07b16f87bbb0194a85369c985f3f84e7f12b38d6d48233c930589af674b23fb36eaac8f07c9f60c8df3cba30aec93a7fb646d25e2fe31fb6746399461f3abc0965ee8eec0f5c86dba92cc394bd66116e4fef46be8a645b5d842eb097c6b8532f8c3be8ba1b1efc0d8915a2a3f10544f9fd10e3f35f7306482bba8e9e1e9e51444a871a26ee894dd35bc67439ac7e5695a32bd21f7645273f8363b6926eeeca3e916d3467e2b5ae16149d7d7e008728fb7956402818dbd1c7244b7ad61332ebd9e1ecf6f70e964ce9fc3f3ba70e9d48caec8f4513e7b78733a265a254c999928204f4c581cdc5865da6fad0e9e9df36a5d4e3c45ad4bf985536c21bee5cfe4f30b81cd966e30b3f09de1adc14ba9c9d39cf970455f4a64ed3abdf672ceff6de1b50459c8c84ad3d1f7fd63e529b6aeda25ca573ff9ef6b21bbdd0b9870f2a420b7dbba0a22b2e5a74d7378b6e560b605765f433fcef08f46e8d3be9582233d66336416853442194136e59968a8a93ff47d767d577258572b70c7d64924eda5722b476ebc44bc4db3f47eccfe4e124525ebad251f94843f5a0b81cd8a6082d15b49598638c1c0a87b8a6ee78cb2930388dbde1923a762eaee2b217c5543dc4ff32c0a5bbe4cf8b17dc2f0f1e6999c77253a770d6f8e1b0930613a50da18856ee2186230ba3c2e7cb13f0773fc995e4ce177438380a38e454dfa3152f0544ea5200004e1b23df4264087bc75e63acfc806e248fa11f32d5adf8f8b53df4ba9e074f2114e8d40fbfd2eee1c6edde3d4847161224bf76ab6dae50c9d277ef3d756fcbcbf693c5eec17d3128efdf95626e0a8ff831cdbff506fcccad8c10fee500d12cb9cd05aec3785a5e9290f580b8d69b4379e143f3b06befc67420975f8937af5573e3b35ed5956fc974a1108f94c991b5f20623c7d484af686e00f6860331ce47a75588d7cd2d5b0656a34ff38b5a0ad9bf69e7168fe6fadc9037b443aa72d2c5467fcaca05ec9fd3a634b37ae7cb2fd82cc329fa0786cd612cd795b776ea96aa5a4c2738e6a9c4bbad68c291cad54c40d566f72c1e4342eba719b50404b48b66e784f068309a1bb52eba27c9069a75816e572b983ae94c3a3589e5619862c38e591c8c02e7dd836a67c5483dee238e881e74be53bdd36fe710dd42e999680db458d4adf6b1495c8647950e2a27d1f3c77542675a80b7fd0d74e69a79b508b09de328a517c1d6b870f40f3b0e6a2599eca98112e97a7b72df92c46010ef119ad9faeb2f854f8680b86f8e84dc87d8ef1b78b483585e2208c4dcc1059a5f2973540d20b17101a22339de1cbbd5ac4509cdd4e6af81b4eaacae4a0778b3e8d4dd9c586370e67a2e74dca8a249ed86f0e402b1bbe60bc05cccb0c02486fb66dcbb8456f2c5f0b38dc4590088b2128c5a7e32a3980007a139f66001a8886778bacc6992108b27331ac25c18d137cc5df933ae5a8fd37e301c512c0a4663a6e1b446589ea649fd840099c9c0f6af432924d9b92bd7af6e4f3bc602831d5c1ebd62b3075a6cc6c2191c09c3545a676f3fef6bc80def9b1803479691311744f9b03d965ef39d696df935b5fc7838cd32baa57d2b7ddcabe2f9138ce1f8110562f524383e3d70c51bf06c231e76c37a68cbe5aca313fabd677f846b7be2e5d646844d5138d012f1189a1b4a43d1e624c4d20a319976c8db0c41c44a5e50c982a3447cf0a0723f4e2fbac00eccc6335e24fd77c16b9b1dcc25778cab0b6b3bbae720b471bc817d778d422ad01933271140d8cc9afa066a01cbaddf93259044f9e4cb0980cb2a90ca03e81e7a9e7444ecd64c6d230c80d12ec95bf3930775bed59af076c78c77e692f5cabb3b788dcaf7115a155bbb60aa9dc0b648df006cd5cda9b12ee2b9ffc37c9edf086f0cc78a303aac777fb7a7383385af51c1e53152d746712bf714ca05186f752533a17859f2926bc9571ebe88af6f8150366f89bf0632fd31773153f57a274fd1b5e3ec61ee6a4a372d4e6208e5491dff3205b5d298afb1dc9f2bf850b2f9a4bcb0127edb08ad68bf851b2056d3b2bbae51f32faca7ccf5892bce2 +result: pass +shared_secret: 7f0ffa83f99901f27f121557ca2da03bcdee03d808e0e4421de3a07c86764d88 + +# Official test vector 59, seed: "a0264c58ab1f2cbcb212077fd378d340307accb31f1312137cf84e3d3135044d4eae8bd38bc3e540a0c14d46458f6179" +private_key: cd85bacc99669bb19f64f32796599fa909499edb700670ae7eacc07c89b4659cb7c3bab323f3761728c79ec67515102091b133e3536a2032093df24531874108d1010194338b16475f531030e0073ad08e168976af67243eab3596b9975b2a216e8146a5192577975883c21646cc20c036577dd709edda6abd44989e6a8e07c555474b3d14215777193308d56fca4aa7e2378a94f80daeb4788f4c87b6477193d7a5d0bb6c49407adfa222e7d34ca19b046cb14a37db2cbe781288584f5c386a2e9c4fae79a106c28f27c49ca2401a0a375664e885070814f96c9048993300065037ec06e1e692a97835c129b06707cd501c6c5cf1646d82365942cae5e104a5bb71fdf42518485c1602838929244a49b194c76cfe2bad0e758701214cc6c938adf0c8e4712e0ce148576961f3b613537a843ac07243926a92a324adc52b65152c69613acc6336341a72f7104ad72c540de40c4bbb8611a03ce9271680aa77bb827d7bf629a44bca141c0cdf912b8b372a32030ac9680a2b64ce93f726001d6ba184736d571cfc79282cca13dd0aa3adc14683ca9bcd89b72d7cc280963f2d37925d57693b947017d61b716626e45a5c6eb295ba0963f2a9086615697688383ee8775228afcd760c2a90c85d18c3fe553edc719926ab0ce6e40d690a53b34626c6e28925b469eaeac11209c7b00a03f020cc25176fad9a2ad2b38fd16b04758a5d379630f3c9cc2b0824eaa882fca6b134011a0e3035b1f2cb19346303a17837c30b60f11ff8795593035c6d335496734c491552ebf4a38ea10ab203b13f325a4df221b9dbb7eb01ab00097845c1335f6349ce50c15e64a02e644e058807c9b764badc44c6f21745c80b6f4264b1a7ce8fa65657d75d5319807a9b5bc17b1d76ca64ec831e113c1b8e79b5a1fc0b32d21f839a64bc212722e1664b9ac5c39a3dd0d8961d53c6dd697a6c896b664a6c7c5a70de5a0df2745a64cac12447b70b1ab16395b71dbb810d763faf817d42149b99181f9b9835c8e947cce200a5a5aa573b44544226b1607cf58968b3829de360952a8307f7fcb157c4affc5009ca6628f0527042e235f5d1c1a91bc178f8288bfc37b2f53077cc0c7c414e59f57e78d5357f447871579b54421986116c6bc22be84080422c9b983794ae70304d601e2cf0ae29f6172a5529e8a4a14a89b064a3b142c4c90e421b59a48471e4852c749b9dc4867c677e52e44363a5131eb5642c4415f5248ae4358a3fbc01beb2568c8321b711bc3199814a2b9e9be56e266b2639fa920dd204dc41518b19b8a9dc0b5ba3290b362e9d071dd61c041b4a809fb92f0cd2b25bf94f04701299ab530ee704dcb6ca69613439c4c288e7a0643ca3ac321d930a99586c85ae0597b2c56f9a870e7bb260df51ba7a62bed6859d7159b56b211d282b7e1bf85d81b1258fc01e2b8b15e3829bafb34aa81036d05531d288a0efda8106362da9878b61a4b3ab6813f27ab65bdb48105686ea3594fab5c2d83aa867055a233052a5d57c741086814b7e4ca39b688669d4688cfd92203c902dc1d9831d3652475328c99bca41a7b0f54a7795f8c2a4f90f305626e4e31b983c9fcb0748aaa856630a67399b37a2f204186388dcdb740f8b8b00ca0e328958a821a9f5e9a26d39c60a37b2a513b79c37930a992f3710ba1f574471f2175d2a777112a4f5444d37db793d87c1c1e8b4cb37bef3d06f8785ab65d8bac7c07cb4003fd4a9933c3117e347664d92a18f137980f8065cc031aeb8b1a98b24656031c3b57d36894964171d6f511058e21a63a2083fdc37ef1848379ab86b7c53eedc941d16174553966415439f6944393660c6209e59981662387a1e827b768787b8b46b685b8bb3b72175a367af89b5f3953f4a636f9bb89b8351866a335a7ea422f9e9c794a24372b40fd277a5ba2a2531a4703e60827f562acf95a8193991c8f4417109c059e91c4fbc289233b080a0aa8a4b3e02b35cb59216a9c37509a91725910cf8b11d6e7b985ba5c0d85073a99b324d0583c7f8c73901847e41c4515048a7556a0cc206711550649926514c96e3535ef6194a37c1a3eae023a8851dfd0bbf0efba981880c19fb9d4e6c2f80b4b8cb4031b8106ab6ab33b6a37b3f8b5d133244894ac86929b4373b30f6bb4395b11914905ebe26c856fcce2c623156e43efd0433c19858c986436150968132591db37eaff112c1383238c0767316c0077a00a4714e49d694d802a510dc960c525bf601384b96b90141b846dca14f34159db490479205b30800137819406bc6e14786dc4079e0481d098ca4a3f15f593135ca64cd7c32c46b45b3bdea0d7fd70dee467020ab49d4360355146d7f00337a1cb452357bd01074234b464a134abebc14f7557597bb057c4972d2f012b59a0b83328e88d76bd257ca5aca8912c2a9f90672903cbca16b9746e135108638c388676cd189452325dafb4ddfe435e13908b177a5fc883bc233679df34e40a09fe384654e6a857e49c5f62aaa30e123ed71a4d79a65bab40eb2ba7e1c497ea28c069ce9898f3789fb1b03cc07a5789569496a5a6b84966dc3b601577b07b01e2bd6afc315cbe74b03cbb51bb68920362474819a02e5c60db441a3e0a2a7299ab0913a92e3228986c18639ab0b952a01c77907e6a0b59625c01b1c406a4b339c10b0c8947fdaf5c14f6721be5c11e3a62a7065a78b9b1176e64ad075150b67aaf70820b9a62848378c374a3aeae6c63cf620d0927971c0188768991734754368bdebcac2d6b899e5ecc20922059641566b4996be455e90ba9aeca1a40ce8cbd68a6ac0cc708458169c624ef80a25ccc7c931d938687ca4a12290711b1e72fb3793a760a5c29942896853e26dd1606fb48c22b53506b4413e8f5b3c20b446dfeb586532a09ad602e5c54d5e0c0149ec3526758f174ba49134c980ac109e711ff658b7cdf0178b8c861a71c700e90b1ddb9265e9bfbc07a253726fc9c54419bcc39932555024af651a277302bf383cb67dd2a929037fb4109c69347876751f4f83955a4768fb94622390790796084215b6108c72e10217fc9134b7872ac6ea3d07b989bc70a23a826676718f31338c68a5b1f9ecba4b18bc47d3161419530b67041b3864686224d0171dbd248a48527950f2c4c857aac6f7a3394662afd84f79d5854ea77c26e7c57fd8a3aad0399ccba0ae4780ecd2481ae065e3597cf1868c327c14baf36d9711a3a8647d26ea52a4f9139ba835f380ce9cc599f6f11586f158f941520d143f75d00125a3806c56108de46c5ad093872ba5f927bb2a4a88e668c40af5b4fe9b17f80ca75ab58224ba1b485a9e1c3a6e82b814a1b23bb0d61ae14a9ca4e95d03746a564087f9c53a343ab7595572cf2542d7a9cc90060e6e99cb2d18880f082d3ac91fbe00c5ab141c6385895c626d9c143ccd94042a27509ff67c802098415a49bfe163ca01a20a45add4916aa512467db549e7b0c898656cb4265df3987998c8737f3c79bedba48b9c6b8967a9bfaa0b22e6858307977903001867282cd38a01798d3b71bed21459ed4c4ca6e185d55525baa096c1897c55789b9e19a6b303af32f493cee717bad70cedd67c3dd89bed6926a0f20b1798bb46d173452a31d7543530311734422f3cc9561d5360b665ad87a19da71a7270998b87d62d5e7b0a5ca969120b4c610848fdc6afc0e631fb2abc21096347221971a08b94b0ca4116c2f5a8188cd982f3e647ada99eeadb3ac25310dea91fa724cf3e1017c0c86c2a979791d30192bc3163ecaf73c819dcfc113535bb3a40b252c8bc269884cf7407fcda465c2aaeb19681dde0c99a3853a861ac81f77e1319afc6f67b2fe52dba6b38523147f4e589ee716172650c7cb44e0b760174691217093ed4421dd5a38f2ca2c41604c592366a89c4c70adba149ac63de1b5e21e78788f33d9e135890e61d69529dd9f658b340848623b17447998bacbf1c315b1fc5bdf8fc357e89448fe7a40217205c64961cd643ac6bc3486c5efc003011e80c4f4494cba123c2ac45f7d9019cbc7018669921fa76db3cb5436763b48a8046fa71d186b57c942f6529930d23737c49698c15404de20f8f357d5da523ee3a117fd8b69ab80335e388fcc661a0c8b583f94a8c7869e464a0544c84d160a828f1770d97be7bc43cdfa8566791727b7884e99a5d9fc549369a4ec5195ef1285860cb263085740cd466bc24835ae33bdd1499ce941f8041571ab638bcf896201cbf0b7324ec22c6d3c00f60ac6e6f0317efe14efb13440330b50cf86227fcc7bedac20f9364e2593adb7599b5142174d6b999c725f7d119814642f79de48f28d8b47d06bfec41fd06e2da9ae905005ad241ba55ab42a993df755120179b32e6faf885f946898d545245757425d719681b0b2ba24d49340f931cf87a3cc8aa3239d4c52ce4c95afdeff6efbfacac10d294edc0e7cf4535059bfdba +ciphertext: a047e3dce5d5e4c323b3b4076f1d4d188e291151696de7dff52f9e2391919e077021eedfdc8750cfc16d8bc28e56faf53ca3bf0a00f80ec7740d7d32cdef30faa00b1d074d70ec64a154101e9be710969bb91f168d25079d67a861664bd4605546296cc4e6e708aa043f2fb2dacf8071215f80c9c710a8b0e2dff75e42b767ceeb643208c909646f8880d83b5168c07fd36cf9502c3eb170e81f9df2686108e001bd15f11b7a2f99b1ec6ca9dd0206401df24160a975ae0ea179da5b3c9756ace0ce3e9b42f32045ecf6ff10ab387cffc357518560905ee8f31c5c577111d0c50b4a7c131aa18628cd1fb61ad7484b43310e252437cb20dcccb807a5777cba2404ff76e54f10638cc66a925eca98f9340c7839c12ed1dcb23d39b4f99b1f731be3cc5738ed2f115a0cad0cfa0ee7f9aeef3ca7485cd221a61848922642de62d248e18743b060c42ae934b0a5e7ebca43e266e0a58f7d951fc5696275807916d552a372eca27c535525933630f0a5f3369be348021a338e7074292115fc8a786ae736cf5203537088f97e68c78271424a67a1f2632c1539d34b7f90bb11051d9825e911b42056f60ad0d28cb70a4a20a13009887b8d12f8fb07dae59e2fc621d76be8f8b28c6d31b4116e81ade5f973f44e4c819ed374f45db6e68e264ce5d4973b666cc0214ad7a51b1e8fda04a41ff465f1603a427c92c01813fbf54bd5253c53022652f78a3f6b88331192f0cd8c1ba24958495c98fe29696391dfa56357607936b9889123c5222c92c09f9e69c6b2a0e6b389113924a1940e5d82ac13091e47b76970d0a06a682c5441fc20114f1246e69f486b3030d42bf0e5b8480304eb49e8b4c2f1c5d5a11f77d8a25a0ed106c665610c2a62df65026845ef99d2d43d7d3a503fbb702c4806255cb5f0a458c2673d9de010ed4e78dd8fd1af0bea91b8ef35246833117dc3517bdbd8e897ea83f6ba5442fdc41e661082157ed9be5da8d8f911f8982e976812f5d157c83f7dc9249c4e32a7b0c6b08c653a014caa4a8e9903027c7ae748edd7e026f7f3a934fd7b62799b4e45cb9b14c4b3fc95e3df7382462931335dc7e7beb1bd806077e1d36fb231c76659a85da15d87fdb582adae063b3d3584af6416a153272a2f27fe5205d827fa24693fd62848bd2eee681e8d539028a6c81c4753786c4b1c991bf6730bed5e14a9e4f34bc80b8b598fc75cc7466b986aa92f976c3322113ddd84913b3e1b364dcf01731d6537f56b2b4eaa45a4063d23e61dbcedbd00435b4ed3b5b79de52363e1d40f2aa6450493875c6ad3660bb9ad68d4aac0ca4e5797f6f1151223840feb154f9e6c749ad66b8f0a0bcac22859e1cf3eea7aab96db9aab863168d36958381c5c95884dfdb8e4fb69c5c1f079c7271e3687db754d2a8a9a9597ee633c18255326ef63a50ac58fcf188f729e718a959fc0320568d36ade385e67a148152d1ba4ff009b056ab843471bd94c7a832fb2b706cfaadbbbd8aa42de9fe7298e53b11d4056c9ed043bc514d3e7da9f7da6726f267d584cb185d777dc58ffb0e44141bd24ddbafd1509387e9bf9aa532f6dd5f1bc83b6fcbd4eee3e9ef49a692818b644209030d944208182a394c10aa61c1869c7824f028ffea498bcb87c0c6fc5df46447f3607b2fdcdcdd3ca9bf885792d418563f404c39acc8f7855599f0943fe507e5c02cc947762d3390ddab882c46a604278359655b399985cfb3aa434a04f0716d2d94ad8c9f5a5b0dc448c0f85751ead9f22ba0052810f66205cbc7d7b8440441a892bbe6487da07d482bce368372ffac7db844daec7d5364d650f70113f86346886c93b948985a4187226793ce3febe4372ec6394201011d6e66c342a304576f33ab5de2428bc4abe940dc78d90c3a4238f7f06189fb440ab3cf8fa36fe19a0b03a2c2a119d2ec5812b999a277be469bc9ad6614472ecf1a70ccde3a4dc5fe647574b4827b2aba6e1d65a0f37a696b9a73e0cf3a9cd3293e36369363d637fa22d484b3c9d451bf96d993402f442591079c0293275216ff5b46e4170b9459ae31a9a7f4397112f0f9e1c778b79520aad1245b611e920010e12ff14bcab2a090767803fb30478d813d4cde9858befa2930572c45dc2e1fbb117ce98e81734806d1106ff3d256cf58d7a3a6efddd9ca2b1d87de57113eaa7ff1e34ab7fb98514abe99a268c8d87307fbdc9 +result: pass +shared_secret: 6674a584a85e1ef11565916b1779603295226e1eb7ce22a3e06ebf19dd468a51 + +# Official test vector 60, seed: "99a9cdbfc674ab3ff2c64cded7d697a6e27a767434a47aff7c3fbf3c6a22d6043d27868955286a13efe3de36d22ec48e" +private_key: 6b3b1e9e6771d2b6946533c210a8bbfe297df569cdfc56b501c54ec9e21dbac3ca24335438a71c456842ce4653ec9b4ed5ba80ebe665b40597230213f58951104c7ca0f225eb535fad8c5724189b49138c22f4478b19492403c2c41c452080a2625654beab411ee59f1f372effdc5dd282a5b4244a8d7a0ade30386a13a353d1516ca38991948497a4ca83cb9f65f5aa1a6ac85dfa634253068b2b43a1ac8c41f156e0acaf4f05505edc57a1a6bb1a890c15d35967b86e84f16d2a1056916c8f90db83b47275b28ca3efa0bd4f18b9caa5b480e80566cb3951d606887777c2c3bcc88640a6c1c826ea51b169c8bb11a7f51b084bf0246f93990e62ac6f012b89eb025b5962e9a6bf36564ee9b483895b2ecdd6699421abe9cab8820771e121719922315de8677fa1214e332379caa11133a5ffa13dbba75c6491308ed201c23812db0a8d006c9ca9e7606c532557c8555cb10d6194284b71275ca84eaab50e50470fc9e8c2954b70ecd96dde6937616618ba91b1fa858335605c162972495c4846b46b6831477dc5658751c0169a5ba0c733863555f62c5c1bc5c83bcabbdbf1438617412bebbfb5705622c258a301caa76a4561099c3ae34ea4e014f89431cfb957c6a930315b7a001955310caab03076440594f7a66c1385637b69135ad50df1934a1bc754eec983dcf351b306a14fba9ea5b6a416fba9b46a40c99b640048aed0e4ce74771704a3b3a7c90009c964e7b055f4753bf062349a368aec2423bd6a278fdcb3d9f0c81ef551a0122a72175e76d5970fbaa44ff8399fec7498e59dcd685a6b4038b3b5bf47dbbce204ad99b8945bd3afaa237af16a81db0c15a906364e1733427b28040539d32832cc5a7f0cec282ed902df9a0af281cf14256da8873317fa5f6e9149a2d6ab544c97697683032455591c75eb2a0bb4aa5eec1c3499b64b78729b6cb7553f1653bd4181224cadcd62ab80f5af7478b909a4ad9dc1cf97e608234b48b2d9b005a5ceb80ccafae85e431a258c77601dc3764823177e970ab5763b154447de89cb2c6cb11ee51195f59977f983c1629dfc640026a8c36b909d4aaa9f9e0b642140a35d2a5fe503a07a800c62cb4bb7c6334c056500d14337dc984c7730fb37891ba737f2a65545b2943bc22a5099345732a1129bbe22e88b987aa1c8e33934323006eac14f03a9970cafd6ec587d15544ed9950d5a851c63898c3b2331192e0fc620937c30a5e8b56355319ccac8094ca136c237941372b17ac5367aac78269658f4b40d04b33e84961733a353baa9d5f4b2dc69609ce6a00ee6af8dd425d2b04bca841411473070d7a1f4042a8167cdcd138634619bd78c5c37511b54b3857a897f17fa02de663854196418b4b23ed80008b6af534b28b1f0027dbb41ebcbb83c9cb0f0080d5e9c8e80a83d120a0d679c9b3eec7d4f94c9046832d947a622f7509d41ae888107f5fc7539cc0053a1365ce005caf627f8185cd1355d4ae65638c18510b93eeb87642cdc87fdb858c4a997bce0963f6b3a1318c206635289aaaf73a33cc7d76977e3570aaa98c515436ea39cde485342a4503d991ab2e374ef2ca8e221c71840b876100aeecabd475233a40122f2832193f40bf29ac1fe71c1eae1767ea470f3e580089ac09bc1737fa3449b4b9911c114191614599a8b8e02060517c57ea13baec5ac77b34b7ae21c2c9646fb6b6f9a0a3787760509e3cd9af200f8cab9daa5a4bd7a9c816b4fd7d3c0905a2347215f5ec01e40c605ded70ebf472b1ca4cb684272dcc75fc17a3a150c06af61ca0573ac03473c395bb35b34bdb0d3297a5c4729a14345546124377896b11975c26118d79970c76128502d474b8828b3b01a9bbad62728b8593a254734ad208f29722fae409d7f178b4a0937e86542527201a7e4c14547b599408552952cc65128533c4207ab047287af05e9bc5ef0b110e4ce977660cec3adf062a154c24cc86494bf5b2f3f1424f42a7308d0057f041c077528030182295a67c27422af6180a2010e4cc478444b595ca065b8a50de1c775174bbe870a874beb8649d82c07a68341165c11abad1fb5b7bdf2bda1511543108158471d94c3b59ad199c868bb67e210a724909b9452ded168587247977a70da79b3750c39f319b44198a5dbf047ce618c212bacc3413ae8c00a2b78cc3b0c7958e349211bc64f036a70aa16067882330a36aa4cb183497c0251b2b942964a922c25525ee9e3834504a085540b36971963e09106fc14125659bae0c96e6663a479a381a915fda7b8a404061c90b814c3146a549b517a3735760244ea8959eb2d98bc37e2f7309e09749c4c689f6b640d28a7a0b8524fb9bc0b544eb219683be91e79baa327b5c0d2f2713b78341c9682f6941327959f853195aa36b919e07c1d5723d6528269b360984857df1636f2a80cf1383a775c230a9991f8602d074b5f0bb42c13ca1eaf4b3c7336a4fe61a8310c9c27f37454f9af3ff0bbb2232689c63ce4b7cbb880886b36681414902bf77a2623ae5f0c359c038f82433413d2cfa88373bbd17bf1d5503774939e916c415c8b929b5c2303234501ba642b75ef2823e42b71647014044a9450a55cedc0592da6554cf74693429d2d526d34851fda24a64450c785510111988982914fcba3addbd0963c3bce55f41b3cc71c0300ba32b02fac76158d673ab1ec7a23b30afd2a53d5aba3c3c87e0fa54408864037511dc3ec113153681d28c45b2a25e7256b6fa90df8b8ba8435b2f90727d4394eaf49981b397916c1642abb68f5006fbb2ba6c2c53b6dc5795a261ba674778ffa7e9daa65ac93366954710419c99fb21a46b029242158294107dfa28c53554aa3d79878b53506ea03846a9041664bab6056f7211a337910f77a2f37b993324927d64aa0d5085840475039c04acaf0ce5721b1f182b53e96928927961b8a04500118a453738c78b8a796ceebd960473b2fd2c9c825593ff4a95f3f659ef00b251449a253332171bbcb051699b100501f84bbc64c4e7f9c7db1190c4621664fb33c624910078155c1f2035d1755f7b10112e4521d58cb9c89575a3a2fa6caae5dba470a9b4d3fdc9b7ca6ac28e0570cc92647d382d04a5091d8a1ef749067848cda293a47d772372820f25245ff457580857eadc0bda0a059ecf1a3adfbc6d7e87184337e94231e8e3774c9854ef1c6b4c872bea6f939845942ff2732aed903a23b72cbb5122c43c8ed303ae0d33a7a704001890f0b378039ca271205d052fb594c526e7c761ad6b0cf14bb251225c7ff42b4b5f651ed55143ecc05cdb21962157e28d7be4fc4b5aebb6cfce5396fa51af1bc85fda50b00fa63ed800d60a5761dea715258bcf597a434e48b23202d8a415831c0417c6c43a659036df10772e796a2d70515939823575cb5c01d35155f7399bfe1b3ca9bfa47ebd69f5c8cc8879b87ae34a7dc32568817aa3f923df22c92be454e99d83023d3caa2e80e0ecb8818414b0241a6315ab20b63c422b6be8572b5e7f249fa3802fa647febc89c8ccc22583c144c191b91187257235d857b9bba3b13db06be10a35d712c540e7bcc62373d76e5828be049b6462d8da931f24a6827d314f5c0ad266a3529fa9b47cb6eec425b326ab0bfa032b6809d82c1cc3e2427787a413daa7d3976aaf83ac08d87b34da219a92a631784bce31cc66693c75aa58c7c87a9e3a926b5229a4f008b85090f351694f66743dae3a59a86299b43c20522cd82f96284623ee20b521794114d1459fdf70739558123f18ff8304730fbc63f198a2eb992e7115e07f509dc58b1e2a00c314714b5162334861ec20acac85664d14057d2788207c01a7ae383c93971d850102d60ac0d042c648c100ed660ef8a2cad375ae1a21b11998264e86ae0561e19d971689183968a98be064486b8abc3634021f770e2581b4383aa3c938bf3aca4aa2a337ec06647aa47428bc027339f2802b9f135820f3a8bea06846beac4c1a2702c502e50d338fb80a590a564f48a6606a10b51e839a4034f2b906ea34b4d3c875f1ff6bb57797b076638e4b576fe8c5a490806bfd178b4569a69626001c8a5fa1582bf4bb7bd586296f9ae74724d7b6c9c38d25273e114fed525ab008b887b9e5871172cc393938902914a3ace06a41cf92f6da963e4217f6b1363f7273cbf4a342865a761371f24285113e74f7a770079157c0ba0700e6bb9ca99ae10b83299ca9445b8024e450cb6152fceb79c0c433753c0b88b21c71bcb38c643ae5e16502fd14c0aa8939219005a15180446a166e74933f46f41a68675692e25816e7a227808764e20c98d33d6c3ef3801d21cb37d2872fe76749aeb09976580ccd4feadcea0b16f00970f92acb21c560501728ffd648a3b658ce84640d17ad1564189385fe895b25cd30d122a90decaa0583b908f1481d7cab000e33fa07de8dc9627a85e76fabb4428a3376e66300cf12a0787 +ciphertext: 7444dc5528743f695af09c910e1a574f43aba4282a54f050174a3d219c33694c05e6cffb95c7b43ac76e56e244b079759e8202b6425d6c3a124750fcd90eceb029bcfefd2d7ab513f5bb298aff940365f5064d68ce6c485b2f99c76cfe75917280d66c349b9d16eaad19b0814a8ee783e52ec7a964a66e2515dbfb50877f5fbd3781ba5593cd8ca22ce1531b4638c2624129c2a557764ca86fbf735cfeba58ce6b0bff7f039dae5a00f8faa86c463cb1176985ebfdf9aa6856d05b7b657760d5905a735e1cca3f033225da99a8fb631a6c710792ce7f83d8e4bdbd713c072f2e6ca08f80887c9631c325b8b853161843810f4a82e1cb49711e875a6328167170d796c365a6754bcb6a39237642a3a25121759523ef3224a74acd8c182e114a709552478c942adb7ba0133944490d7458fc4ef364b34fe1cc94f8215207a939c92921778ad986510247255b0def4baf40810ff5a148c46984f70b67608991b93125688af498f53a40a9e80424ef660c6cca5e7c3ff1024691f67659a31ec331e3b95a9a54f31c84257c12665e684cc49f4dfb13dafc414fbdd7148d9c9b21d84cc58eae523fa9b1b55aad27c95fb35696020fa7becad60973177788670c785a029567198a5240ece3e80133bd446080e29a749c7e6eef6eea00ee547428961353bb063a175426ca066ec2aa5c35c6ac6ba77a2b16974de8767d7ea028a83dc127f05a9ac0e46ab6784bfefc2a0e9d2db662ac0fa63403dfb787c63d57d1e3c51bba51233415af6ce6c3b6cfcfed555fee4a90f9368a5db2d9aa2a847efa6a25b198b69046314c5d43778ec30dcfe00c62e04c55051071de02976dda6a7f3c7495b98b62b0005850748d5b5e4d413f6bcf2f7a9095836790781d946b399b3dfa087ba6b02726e3a7dfbcb3b50e828b747a2eadd904a14a85dd136f074b76b17fee0d68e62591b8bcee55a3305ad469c28f6372e75c698ac8b5038c700e920fdaf2e02b8f87f91ba8b4b8ac1fa95513567a35ca4328649baa1fc68cf975f9ce53bca91f3d536f9d3dc85968fe18726009036403b9fec674a8aa4d3ada1396fecd59212e2dfdf7b185e5cd90e8749891f11a4ee5f515c7ee2f2d259e397be82ec63eae4935e9c43920c3563b98b17f1a29bd765da90a8cbbe902ef9b467c161dccae224f1b5f263cb6f5dd1ed070e045279f5114180169ea9f2c34a2d62535ea22ae6eeca384c9d9862d618d2accc856e2d5295709d4a66dda98588cbc1637e9dd5288129b92ba287833eff7353f57ae273fe0b664973058b88d1dfeea2c1a14485f61ec761169cb73d10b04dcbb39648f970ede927463f0ba35c6e5885c6257516d87a32e4e7e7a7ef58df4e03a5b8850e3113bc3c22de934b1c5a13c6ebc64d1c0adeb1d80851ca12adb496551b662bad4be6acb3059f5efb927f69b711bbd77429547ed21fb14d9c14e87f364fc7f5335ab0ed3312ea8670a92a58d42106f6969688ed106d2028c0b0393f2b2d4810d574eb76ca14062c7cf0fa284b393553de48b98a237679651535d1a8c20dc04676937a6a35ab0d90ad1ddd5f3056508d6e4dab52709a4bdc50ebad3c549973a278f920119e7731ea497d31428c96eadad8cb0f918e7dbd965287e7aaa60f6fed80d3ca2d4a0228893ddf8a36ec02354f02d7ab8f8490a6be91eff2f5d50013fbecaea945a7859296109eb200e3a406b96bad84846ad7fba8c519a25d224022b1b21d1b42ec28ebd8a280970027270ceada0a98107eecdc6bf3a63c5bd59d739d6024ee83d18abab1d27dfae98ec8c270caffb87904b2abe8aae05224ae346a4b1cab500aebce199c675792a4185ea761f1ae81b43dfc0530e6ec253cdbec633befa4f18b35c01ad3fc359e7ba70bd857f5afe83d6fba06578b6147a454e12bb9a559ef838163e906fdd089b5f4d302ab3c8449350243f48e09abdae9b4b499e709e03b34a2aae069a9011a73199c90e719b3f9993b256542c55d0bed6a7fd3e0e857bd7211b8303fe2d4c38a9755c546ea391783d960c1fce230bc59e3cf151acd24cdf85c785a6f27364567f200d18efe9bfd222a160924a16f198846d8636a44aa6f0c5027663c5aa6a76fbb6b077d2aa98c541109d82e4a8fb0d76f43af57a26a4d642396174d15dc9a10d15f01fad78b9ddb2c9709205f20c2ba1807608d25af4b0418bf2b657e2808efb341fccaa2d +result: pass +shared_secret: 6843c8212348defcf5017ec29c620642d127ebc33fb539c4d07cca88e5a3bd9a + +# Official test vector 61, seed: "c799d57b41f28c5c446dfc58a5ac6499c4bcf3c162afd2b09a16549826ec2a6f689e44bafc4acc82f5d6aec23f4a3993" +private_key: 41b21693eab370113852491e3791739eb8b3ba69a2c2542a85b4c536d840d4b90800a7a6062b7c98f920fdb11ba6b0262a647dee2570f422cce4b7673b51670be0694083c23ffb380025279c849a91d147ac85a3eee4c8ace51c314b21382009845bbc56c9a967a5bf25d1bd75908ccd0a5b86f14106998b27a41a38c365130a420569975da13bda305553750bc5b9402bc38646857bb50a97d016749cf7394dc35ba1f69c17b080a6961203514eb2520189b846d9597d3e443b0168028943bbfe80b1d0e4a323f61324352aae686b1aeb914dd33745da83f9451edde1359a630a4c79b4e9aa7cbc464b1f3923e981654f80922ef604465740938a9484137077533f4f7c379312306c6a26bad108cc16c59cb729fa6ca21feb2365f12e3e32c75b95cf9201bcddc2046f93893db11e35103303478f6a661e4747c854696d6fa00b47f3b18e32469e3b9312225b1a877eda5b2f17699ef4bbb5054961e2a7c445e70c1bccbe6613a4f332b380fb21565c809fd593e7076c42b9b891da4513742e45fc4e60934583f888f399b4a3a0054bdc3639b73f756b94edb5401fa66211d2bf7c714f527c48854a73ead8993fe1b3a851048aa638b2a5538848912f6672430273e82820044a6d6a6b4b80ea6a12aa1becf8b647292a2d328877c10d64706de00a677f0399e30b8842633e2246109a407465f096a1e4b9f14605387494e3f3cc7f200e4398b2c234575e022bce0961b0a8686537cad6054a81fc83b6167c7a855d54e662aa29358bc192a0925d00d15a4634453a494c96758aa687476a7b15075045684b51a82225a562c2d1c28b36ccce25668ced9ccd0cc58522d36ebb6c0368f67104f6c8a240b976c59ef5b46c62323cfe74bb95a55c8ee3b934253de101a11832cc91d685cdc1599da17362763abc4a63a0c13cba2123b76b391d20592c8799bf86054203307d770bc87696457962dfb39fa988a954532671818f6d7438ccf3c044599486e6b781933a45692e1fc79fad5a7d8fd8bde635ac05c631ace040f383b9e5aa69bf39243c711455f605ddac05ee905aecb6c971bb85c1ecbcb695810a713fbee75d71362e5b6777322528bc54a77b6a979ed7c48e9270ada7824814957563585334998fd6ac4566bb22da8cb18a425bdab55d61a1b8427ab1b817e8853ef002cf00389dc36a8e739c601be907d749b4165ca166e6a42253c897a6112d2994a0f492116181081356ab447787d3c8d399a807d48860668dfa2aa8890ca8a7128cd38cbff5eb5e6fc5a46c903eff075ab70a36b85958db922ca9172f53b7202744cf11452bdee486d44b3920636bd7962c3622633324a2bb5b82fd3225a0d83b9ffa6b433b19b49a11db2a19a7a5587553a4832a4dd2412502a575660bbdc1d9a23fc6ac2e7047ee9941ed3b99e7951c81d6473b440416a18332914d97b7c6897bb248876ad757c74d83950951c0d14724d99caf72d17462d006e4d0064d14057a2c1488c79faf4cc08114c9eb2c6ea68220d64735ccf603baa718bae17d130457835019e7e943a43347f7b3253e750bcaf71dd0f0a63d91c7deb97e270209a942a9512b635f5c704f830649909c7c1107986bcb7df1a191366f80ec694c179bcd9029f62880c60061627078b2d3277421169e45ae35f9991730159b005f50ca257ef3b1194b46dae425b9d67e1692c9f1c94da299a19aeab00f45c62449af52c81633403e2bc77ed6750eb91c1735411a32a9bd458029d31c1673c86db6eb6c739021bf1508ea97b902a14bbe298f676258d9260c9f7305d5d1248332069432941ad759f3488d3a2c927793add8ab08bceb6524f8b6f5103c2aac069d0c46f8c314d1c77a86a605db2a773aeb8b44ec8d12477970167ce70ab3a449276a7540313927e61239e23c79bb260aacf4c7de036cdd5a55a45a8a7b898fd8b209c6f643b4202b16187a87842b33f0574fd0a4198a7ecf7b46282b8344ebaad63ab34a652c22521561f2c74a68c485f4cf22735ccd203a8265ad5ea173ae4b8fb0cb4ca979ce33557bb09010767acc4b881f24fb94ccfa008a020e3cab56cba5c3c6c87d4bb6a2448a94c55bba200681d88878563b05454ccc7171a42abcc545649483418bfaa6c3b1e568b251962a75853b6634872529d31b32fa0c29f81037775c727839696adb115a704f10199031d9ba3d3433ecb50702068392ac97a2db354cb311dc39aaf9719c4f5a7c0401282ba4697ca8c70ebc4e179893135179cbf02820d6bb7263708b2339f777c242f4c34155ac2452cc21904580b381a964c281d750c15c42d8477e7708c45c61bbefc6928f191260409ac31a61400350e928a3b24c313a71020fd186f6e9afab17bb065132588c115c31ca8c630275b4baab7a98a778b97a680adb4611e6471683352b6928b7f0378105383b5f981923e800ff11ce6b64904ad3835c270cad0cb0a6e1b8879cbe152221e6e0994fea9bfeb9cf4f582e4f429170295a8419c984283d79b882bb420876588ae6403f207b3798d89ddc1bc90d7c91d7d07aeeb2bc0e491269281cfe93129c5283a03630542a1312ba5c896b969ac0aba14a289c0672b964a6cb1c4a11c3617ab30e4beb8b8864285087a15c574c833166c759741f493438a535918c0ab0e46926d195802a5cca3078fcf3770ea9644a69c730314f3d91b5e04150b670b23448008ee55f841c148a699387d919dcdc63a23966a43b2927fcaf47f2cb36935d65622214403256753ef3dcaf73d183c79384e7914bfe597363684355f25ac1042505361a04798e377791b5553c449927efdb48606a272c029a2da819a48749bd66a32091946a2a7a0649095da1193c1650aef47099456861519bc8701477bb5b01359c4772269735485b829835861496e437a063838a0419ae6877d0c493b5c3aa56777f3a727e0ee5825dc83ae9f4a51e612002748a5d1a21c1f870f5886b39a23e0cfa14b6151053580a8d8a306af04a7418c88bb5c398c6cd8f6529edfbcd601c049872c11381ab10c0267c0c8c2f614b16d92800dd0989fb2a23887ccf46401b864552105dc79bb0def57eb8b6974723a9164c2737abbdb793bfbf00a860a185d3a81a2257ca91e09f547c6acaf35ac5833fdd9a1f38a5b4f5e227b3fc692677766bb81f85e34de5b200dd077573f0796175140fa9c920522d68040518c5aa8f84b1ccacbe5be03e0a0789372c338a1b24b47a8bfb0941aaa8601a7937d5577fdab4a6d3094aee7c073a7632f417b63383bd035a351c3656b0a52c6e435d6d6699946585b6ea9e8568307c18c025a80e9074629dd70dae6bbdba296e0897c8ea895fc6b5b446d1000e4c880747798cd42c860c3bda63607b69a6c4fb88082593c1d965ac6cc71125cc56a72b60d1297605787819749d43be46431959ac29a01c3ebaab30d9a18c1c7998d9e29415ba0cd72c0d933086dcc1c20c537a6f296d88f29b5d2a21fe314999cb6037d539081120d60206eef1b1e1a498eb65268e94366cd8912d269b2d12a3f1b99572e6138bc29fa5520c8a6cb23f90859ea0a494c17fe7ac09beb658f260cbf3a5cdf9933ca1659f2a0551b881055406cc6b72baeaccbbc4b6964751afe07754da9a8b0b151f02972df2bc1465929c0be64e38e6c55ed237f182151d1a91e4253c42d05badb82cf3457e01cb59a96730b5007ae0fc37a3a322115c8560f0a2a1395a88464728c18a16bb249c168accc3165305a6584939105b594af244c2bb41405163e5bb50fde104e7dc604a592b9e22649c0686be9a8860794cee458a73796ed877b18e034f2f50b8441609cf53280f9c095fd67749871245a4c2bc9cb008ea3e44f424dbd56a7c734b1a322de366541c732fd5f74a0663a61f277301723579158ecd08bd014c5cfdb7610b61789d8b84da23a58e571a72981cf63cc49c59ccf045acbd3cbfed4571f6daaab9b23bf26091bc581cbe301674972ee4420e7e0740bed617a3c94c3ca3be7125c7d6242185163398458311937adad8462b0cb3d5900994f5906121c20f6731ac81a32a864ec383bd8310bd64a30f3d575d936426e721228b93c0c482c1be106f4ce41c5e0057116b30cbf44aa2a217b08b690ff891657188d3b6702ffa9d8ed7b62cf78f6831a13b410679e60fbf9a3221906b5885404a7326589681c1549b9459745455bae21ca799796065925ff980aaa68c206b17aad1cb9511201e53dca34d439167d55924018e7e513fa919a4573b5500a91c8ab61f17cb5bcc282939172217365ef694c98a440b09c883cccc114769b84ce736c5c9c52b050ea16a0e4b8c58465438b7aa11c2c98ecf4aea6284cd00c4229cb6fe2f90dbbc05eb935c85f1ca2afde0d54307949544b08a2ea8e2ff6fa677e3c2ba136c16dffd11094ad7f4ed4c5e7c11e3898a284ee2f8d320ac3cb0c52efdc753282f092bc39baf4a18783a48ea031a191865eb78 +ciphertext: 11c6b00acaa538f146d7c8dd2f0a44e1bab24875544ffbcb24857ceeae31d7f44bf05624541b6bdac79eea7d55d5063c65c5d003a8977ab872d53c77ebcb8d9d6ab8a17cd7e1969667c1600af54a52c49881fa22c15d8bc5131438b3165dfb158a2b8757539c2b5331f18aebcab7ad3e90c8207aebd1729905973272ac4d24bf86ad39a4b38801b449d202aa338332a0c5d284e5b62d1115eab7cfc5b415edae163c0374b7fa53c91a0eff51d32a2e76f21b208f1af7537de5fb4fcc35e770e84e75cf7547cbf23ebfafd7479897e8c30c9419689a267cd1931cdc7044fce50d9ad606f90f5f5096751ee2e2e7ef03bbaf9caf7481f2ff7432eb5b40f90d23453289e47db76a4219aea192d66c09dcbb9b37b5286f9c3d138fbc712b10c1b8d553c222e2b93ba268cdda88386fcec1a209f384ff6da9837f62aa0bac05cfe490492e96a7ed8377592252d04bac953f2ee24d48a0208364f5543a8389f19ccb7b54597fe03dd32f019bcca2c5307732b7658d04b0524e3656d0d5c71766ba0f11700070399d023842f4f7f90186016248ac1deb3d0c5c07e7116422b2ffb18a87575516143d6b12ec66571e6a0a3bcb0a482b45230901e17dc5db38347b7a7efb0d6adb9165dfc85376918cd78e93ff0c3702c1e37ad7a03430a5f076c9cb770736003991a558770cc06971dfbd61d52b1e46a89dff239c1d41879b4c80fbb74506cc7c5e48785cab3260b4962419e997b9c869d9006f7ca166f63d2876ff06c6316571c06e9042968419cbfdfad551087c824b0511487d2d696b25a8b11ce78b06e9bdeb48521c7afbfa4645209a7e74053e313b65902e11962febc482a093b10d24a0d1c13548332dfd7871524aa269b2d70303a277465d7a1cebcaa796398772b48473f5b6159994351abac4cced4d2203f7846c8802023e8939b197a16cf1c839494f9adcad03a4d3193d159bf09efb4588c9d9aa53890553d2cd5acf533922da4184ed80a17c1fa916e049a530e2fe330e470f8bd4feb429a537a006c6f759b1e98e73084a58dc05af1efc0fde60ca440a5ee8f094d10f52b64bd825f5c0ef8dc89463f13ed9c36ee30cfb72f2046ad58198cf374c2d039684debe17b34d9c82e73cd6483d5a9da9993eef118308f88285d8e99d132f5af9bfc6df2986c99b9dfb4b1f512a61f28a2ce8a948e292d027b5d9c320692332de93cfb794adbbad8747c598d401d2b7dde4f37434148268a36d4400e953bf61115de643552bfadd1ee65ebd13c87f2a5ff62a8e4622d3b093fffcddf5a897e2dfca8cd94aa1c2ed67595241b3b8a81a6ab46d950f17a4d5798a74294ffa1fc044736bd3050d586ec4c3a80ac2fad1f0260707d97dd3fcafea1c5653e51fec2b5e7e681b5168b2077b65d8935d2aa497f6abeababef6cfc250ae6281d6ca1cb61bcb26d62d40b01440049628c902e67c9514c7b2e6da7f46f4554ae4aab9bd2336548b3d325ef734855fd1543f714401c12e9c58e5f755201aa1ccee4ed0173dfa3aba864760104a671967c21ad30a7479bf513627e7cd21e91e7d0107822e9a1d4dbcece8ebeff33c0fcbf7a08c81a5f69c09abb48728167528d37368da4726f538696796ed01af351c4401649f0813344f8a04cdec44f0483bb69158dd89d3808af0bac71ee3e000a1bd7b0d47359c4896c99d1fdf6ebef54bf57b1631d62cabe02fd0c02515974ab09fa243364f36b2ead8add458c840f3e037a13bb678fa061cdeb302010838e5d92545fcf2310264ce64c00593e0462c62a0c1b35cb3baa017bafe03225c91f2d55ea4f6657fe8772bc8f438c83e4827f444ddbdb6abc05fdf282bae61353f239c72ca3027a573432e002745382b024bd7d3fcd7b6195929c24d3cbeb9edc90c9f61ea9da77f9d63a148d85d77569d721e6cb7415e75fe1377ba54b1e971f2683554a845fcd41567757a6ce6439ae3a4fbdf2695a654c4d83cb6fcca6251ff2e05923745ec6e746dc21ecf273906e4992e5c7f0c300e09422e0b15ef2f85789296afd12ae927161ba51c648a0fa8c56614d732a51667a5041c814c4ed7e4058b727b2e12ece2e6f3cfd43cffe4aca871b9b8eed8fea56eb64e2f30b0a99382d7bfbfc67fb4a571ad991919a07b7a67834bd31f23c0ade5276df2ead3c39f375c8402a83b4e2c405f405ff34b689b29a5c8de61577dd77503314cfce43660 +result: pass +shared_secret: f09ab02775dcc52cbdb2a5159181ab535d1ed680df8fe320856b547166c2abf0 + +# Official test vector 62, seed: "f7ae036a0176a9de9a036a542dd2840033277c44ae936d10b768566216de9d4395cd42b116873b69d9804ba6ccbc05d5" +private_key: 79949cd3da852b8381b94853cdc981b74971879b0555d5b51d5ac57707a8d340c2070c9395214d3a6c0afaf0a675f45f4fc779a7443219471570d43bb73caa4c9501f2a220ffa00b60695b049b8543cb0aa94884be42276588c4a211908dc979a0292a9b3c891cd2c59e39bc11b725d66ccccdcc9d35a03d390ad0656bafd8f9a778222c8fa753f4d78bb1792e87542c8fb3b71043607d77672b1a6a7f7840eb953d3290cdbfb78ab1535aec0544bb6a6398466eb1711f9ce01c42d2aea9fc255d694bf4c02b7e1cb6763b274807b1802aae3a3a95e57c78002493faea627bf5bacb17a3b1085baea7802958c9bdb398377629b8c8c03057497bd542ea4c6b28c2cf0cf316cd820c6cec0e2bd121664c252b0b570826ad17490363232d731b4f16b68291c78c3ba252ff110bd756225ca82b38e2b65d9979bd2b7ea0b30d83461f6e09219af2ce1309cd99a87de718cd46e40c091603cb572e6de993e0051f84b55db3ea6c7a64b9c67bce6c3c6a0bf02cecf39e93d149ea38b585d77be9726e662860dab465959588c9225303c8b4ed935ded42721196747f104f02c17cdf3520f2435ca0f963d9ab8754f13b22ea157d0c061ca65d8a363c8c4278512888ef6111618c18be72103de324cde4cf16f26f6a8421ae61aa867b3854d54e0163811a3843a7984e815a26a135ca43d249d17c9d93f8a742037db4d95b2fe33fa3da0db12b7247d665f7488ba34ac5ffb0cdd0e123e812b6854739bfa740792b0a5038037c59991aab615f937caf9b89e4b9742992c5534939e20353c8573d9ee399280984b446a851868775a7a0da729d8c594a5f5518f0681e22069326b1146d1213fab35b0c811d990b529f7c7f7d11645da77ca0f081ad592291ba2a0e15a880832ed7f02fc70908366485a9562cc45888c1304aeea26e9ba961bbb53c89f79265a962f2c72b39f9cb43118a22abaa91e96fbef1c42e6334aa258ceb739bb17a24aec2a8f59b972cc7910647cb1ca86031ea4b80c97308697cc4f414f7575154d51ce8c9bc9309c92b113da36a1915934a64cbb358151dc28186c7f71bea603c73f1c5aba4a6da017f10b16053d77cc92751bdf8c59220b5eb574e1f51a374f337d663213d3756f9096b6b9421a692a4820943576ac2a10246207aafdeb8acf6dc32b9a6cab2f1ae21dab2a678a308e138298a1d947151b5743d8eca936963271ea15d5195304d268d87ba70e1c1a9ded02ef5da2e077cc8a576b433716c419808bb187c9fec2371832a09360525b49d89c84f84d1c10f1a7514077d14515ea63918a76577f1957cb0cc393e7122c097b51039869765342aeab8106398ffc009e0f403225b2df37c3d71f93c78763abb49bf23e7a1c3a1695986824a54aeda43b3f7dba478097cb9019390187a6d9b8d9b684ad169ace6f1b0fdb9184fcb15b0e724fa17b986576b3f5986a5fc603b466d232094402b0571a82864367dfcd17a53c3c74ae4ac0455af209b05371174312679ee5a8d1a3326b70246642631a479bbe51bb73581549f7957747b87030ac019b454522b31cfa9cfcb7518deb670bfb4b62cc964109c6773b885691b199259412f49b00c5ba719db7162819e20984373175170f7a16de42ef8770e55a6bb6d98748f9a0e6dd1335e2669764bc2754c7223b8a23986b5c7d49d3ea4a5529422a98c7b4de1205465b357a1c8fc188eb0c4797f847602cba59a20a4a2842bc05a4dfac46b1469be6c434e6feb017be1cd206247b6742edc1141f9b54fa00a8f757887a4d04d0fe892db899354e73442265251b30caa18496aa22806425f0da193f4932bd057c8c7a06ebbc3cf373205ddda04efab885d12396b09c1df636dd5d5c721f103c93a18b5227ad0e3339d44b804b65a6c628f71fb5ab900a8ab9917c94a51540a7b2f9badb405853e9823d30a80ab9613556555b4273486927427942e7a6caa1a727dfc59089f540a2beb9802c91f324668f78a9e4431c6255603c5f15642e60a0dd843f8fc610fe102716333121105bedbbf161b77d0bbcba13296967a68c14aa99a6765718ba3782b3835f7571177212e0763a5cca4492b94ae59616f9b5839141af31a774fc32fedf0a3408c211050948c24a722a48ca6913b32305e7a5194b7e187bc255f3618532075355227748594cc5ac52decbb390cb6a9b8f989c7048017f52231125d91c51ea6174ef4a37b7cb505b4a029f44079e14b957ffa2f8f325e7334bcfb5b023b4801f5f576333c54ef0440b4f7c8f6b3afec2524e31943fd6323d8f2300ba1b8095309e41c1ea6016de8f6ce4af647db19467e492c1cc12b5b5426b8339ea122473d1b84c603babba7b32534587145b360474a8483be8b06a6086bc5666a9b5af8b4eda929fb60606b85305c89cbd26a4be8a6b4866808fc2120649a60a3da2c64330a94dabbdc4cab2b956b2a5b7dc9e7cbdac88a71d5c06df3b192c5cc5dc6b7d10b07846026a3f5cf0e5b2c5d1c80bde5c3ca231ac908bdb7054190e77d54d40b9e7534dff0b36eb92652449aa4305967e57c9e358f8114544e0a5b8ff2c490c4a3267a405e38653449b617f26c6a3a74033ac483c074d5d0029d882f3507a7936845a6ab4d33bb4dda806759852488a06731222681326e9c6691077a35a7791734bc6b8e2511ab961bb1f17ee411ae86ebabf1b4968da61faf667b507450fff1a3392425457ba4625086ab1a871c8386982a322b82b7cf198ad639060eecc1c2e40bed7462ce4c6792764509e5cb9cc28b5a71a26d52658c0b5b951180f903bad708ca9bf7995e4595b8a009c614406c669468c1b4fa3740a9e91c64c03ce4a3adecd19a716a82530a508970cf16fca38aa10baf9810a8c3334c7b4a29904b7f72bea3e61505107e641c2be03ccd6c0546d2698c110caf2f194789c616ada3103b5c7f015991d473837e9451c9cbc9dd02333636bbbc825dd0da77a6731fbc3a831348cf1a3550166b72b4d0c59a5bb31de1829cc77c235b73bbdba937e5b45a456198b218b641be8c05ccdff9746bd64fd5a759a4886d3022cb63167aa3f37655a55e9acb9671262aeeb99f6d5618212419b1a41b7c260213b86ad9c995294b9e96e77ba66a40f9b5243bb38e6b7a7311d7c29c9272f98308a5f68c58cb111e33964b797a151588ee515fc0f032b054c7dd35ce5c734b8887465b0b4bb58c491f9953b1133561977f0c25401e6b577cc1cbd555bb8ba7760fb972a6b2344d2222c0fa575717501b3191ecc598bc93bd145800d9924c06c36d0360aab9678e93138d266572b305b7ea69a6ac8ca3ed647137090cec1227169754b49324f029776ad3c6c3e33e14170265296c1a7056282074a64690450555945a87ba57b54eb3595df82e81c1552f19c415c6cfdc0cb5fb32c3db060dcc208b6beac782668eddf9986e0a1bb5a0941a3745ee0b73ca0a5f98f5928bd7189ac6b20205555050846edb51a75573e9011f2d7738bb8c58bcd16795805f03a42aff1b854d3981002614b39b90c6f8bef32bc0cdc085466c8f55c7935b96157a624665404468783478d4b121d6b6a026818dc04515d0b98f9a1634977d3521316839253b7a847224c3819802d6b84482988122a7c87d069a13315fbaf56c9047c03641b4b008070bd885f1e3252f16918cf03af8634a8f7291e7b64df4e14feab909c10c7fbed446bdf2557d8a96e2cc17cbeb91515a2ff0b78bf0a21abcea847deb7311e2a782a567a6b1a57bf105a4513de2c378b1c0186909838a01abc000a829a9503d8c12f374c0d48a32c6f539a2ab28ad12bc49507e230c9a3881153113c1ddd446ab513608a567aea199624c98845a3adf90a5a89a3098091f207b46f28a5659f54c75a01347e18a11db75f9247749c03c7ccc6b9ed722da1b118d3c2760216c792b7f2f406397bc9a7f18343812a09e97a0f6c3c3b87179888a6d69b01b9d8c4b8cd215af5b76f7249747aba3537044f7991bc30854eb68c2f6f8b404257cfd6043a3a327d457651f0b600415a977d1cb30904bb853b4dc380ba4802b28f7c479fa7705b3a6cdf8a99ce2604af2670ab6a751236e08321d61d92a27412febca600fe30850f3c86c647746a65b1a9210adf34003a39c16ea69a626c73929567f1b001923b4f0726337f90124b74e500007ee8938cebb15e1f993e1ea0726d04a5e3b52579c625ef79ebf66485083ade6b1bbd0c9a953092fa80755f1471ff7f063a2f0013f429f155609142a685039c0aa540b3e410654803c7f281ce44b9cae5842f7347b29336b5125586d151117f3afe13669bcd7991068bdc68676a7f30708906db24033fc5822b8cbe33012f5e916c80ec7dfb3661e433431ccb796ba70c5a1ee85d63dc27bb236759e3a2af7553c03894124a6bdd3e3c87def1f1bf3e01fac4709aa9b393308641a9a4647f230201e1389624a296b55192a9819fcb19ab77c25f95445 +ciphertext: b102d7ab71da57485f6d6fdc4fc78c8bb17afb69c4f5f266e402c18a619367c1ed5a5b59825162633e1bf5ea82ed986c309361cae4def129f3226230b611ee9c81d19cb1dd83f8c762e3366cbc1ab58222f5889258cbcb1ab9b47886eed1c843b39aeb6ecdb1d1135756ba2d30acfd553ab558bfe6eab9a1596dba1d3265d711f6388a0bfaea56c87bab7e88fdd6ce8111241f7ac973ec4b689b88140f237cba5a2ed5270cccdf73b599e2740e2f05139bab15a6a0083e5edefbde36558a17dd50145d32e7573cdc74751cb15859d103baa9340c4b784d92170d230bb46a2b04a5a20bf6db3bf8b7be88b5a7823fd6c0ed36881c3e630e5dfea590e712ea81f7c242cd09c0f51f3c73772a92e8f95586b5c10abd53cc9a2bb2a90a6d083b7af422e36d0b1c6b97e3eac3036fcc4ee7402f003473bd10592914e007cb0f2921a219a5cb0cb3f756d5d28bf9280d55664c6b5436b3349ab07fc15ace7ec83831b1a54b5bcff901e47dbb49fc68d1deb5f3c254d1e4fa2f6ac962362df8277a274dbcd58ce920961a4b6d15e7edd85e5315bfe6233aab84bc73866f2d5e06744b855ee34667890dc35cd1c8bdaff4b159e4e6e5a3f53c333ef9ce8301512cb5df60928fe7d72a0e8723897c5ca57e6eddc4dca47084b7dc830b88862898f56f14f29ee286c9e65ca856431b16cbfcada1a53ca163e506d1ede9d42ec3c6fedb23de6da3c74a69eafef6bca75fa5bb33974633017f455403c6f09e9474c61e234edd8ce301fd0c53530b54a5007e2ae6e0b8afb7e23d045a974b0191a5640728170b344cdb4aba753dcc5f86292d1b3437cfcec6bf22471f8086098fd4e94ff9e6521e6a326684df5c8204c9405bc7b5ce79c9bece25a9da57e1ad7e076ada0372fab1948c0a9fe326b53c905015bc90873517f436d26761866666109b977b6f1c12aef71ddcfc35075dccc3863566aa39f1f568f7c70572d5b8e45e358be7473630327901407b53520b483efdf37ff810912529334e4a5d44c2cd568c2310c14a1236fcf82a8a1c0eea577d4609483334dcac7aaaa39bbf3491e3ce0f9a975dc15512c028932d9d83e1e6263ded536e2892605516d1b37aff7ea624f1db3588c6e82ae7d591cdaa1ce70b261e61541bff6f9ca6a426277dcd33431c119ed6e36fe8b1c5d04edee4850138fb0d968bff73cc6a8ff4ed1b081403680428b6033e3b01e1a197912666e881e630d3d675c3c8f3d2b3bfe80370dbb2c4a48917796f24eb89b50d0f8ed19be24c44f6c109bac0f8f93f8acd596412566e98104c0b68acc2142aa486249717b427128a0a16efb7ffe7c2cdc06af88fb4213188e610de29a116d792360f9eddd06fe560a948bf87511e5bc76fea7d5ea57d42f7dc1486c6cd79b90a0ab66a1a4f6c3e1ecb0fec8ed361c9f952efa6a09a635d18f1cc5b113e1646a348e34c1e3f3b0472d4a5c50fd1d9830d00a3455a25c73347196111b6999ee332d66a26087f7d3b36ca5c946157039dc06909acba5a9e458f7e487f36c2d41d9fae232208c7f345e8f6909b0de4932ba55614b6611e369de0beb2f9c574336fff0228665698069120edf08cfe00b10f13ebd12ae0c52e4de8b8e62b659fedf834d9d8f14a5d53ceb47f076472981f9a89c208399e583e86b73247a0a44ebd3bf84dbd397d0d66b86619cf5d60d5b9aca7b7f2b5ff84dcb833b757ee0b0a38d7262926f315a315b1eb0419146c242195f5b4e5f25dc8f4f4418b855694f9c1f6ce65c4d48d6d0a1800d3e494437180a1770a4d41f3f5651742336918ef49248762b537c948ecc94fcbe6663a749c0cc67eafe7631c183da90d0cfa69a0c4be70761538722a6d45e4ce53fc31c78e15e5a5bb62f73c802cd8b1d102fb27ae9403fbd2fc7fabf5a59c5054dd699d49fa873aabc070c33045e084ed1b7f863882bd12bc874e9ecb080c00b47a4b322be1793c06672b11238085df22202ac1eed8d139c83ca5cec9887fd9f2f7e7da073d42f4ba5cb9400be47cf30aff2c60f1b38ff13e4e2c95a233a3a6c295767c3e59f86b895850b44eea221acef869ebfed4689cffd6d33f88f62ea125d00c990e505bd984985565093075bd4d5eb0beb8b6a0fa5e378d2a9ea5453dabab99657a74472750574cf1782fa3369eaa34daadb6d986df2e9848b4b4e24350ff61e92b1237fb5714c1b2003219b849c70624a1 +result: pass +shared_secret: 69c261cbedaf5dd46d3305a59efc0de94b0f31d8f993870b40bf5de2a99abffe + +# Official test vector 63, seed: "d995d38f934b6e1a7ca77c9522e3d037676cc939b0c8bd4b84394b3dc91a791f09d2d97199258c9943da955e7f7b26fc" +private_key: 01ac758391018442afbf29af226cac76c6bcc2f256e0454802a968d79b90ebe3252fc57781952afff183ec0c7b11ec71a6868963335825c00cedc8089d822e8470978d74c75806654ed5bf178ab7f1a658440b0d28996b4fd23cc4104f811882a1129fbfacbd29ab2f278ca869ba0722544f0d28c879f0b1655525169a723a09bf15cab7d3a1ce835294ae77c3d55c7537478660cb696025cb0db431fa42349ee5266d5c41d92c64544a6a79d9099623b513190946b24bb2707259eb40ad59510496bd4eac68ba9c14058665a465578e2bcf28068f54b47c957a7a1d1004648b2332a113c85b0261f1474718c95b95553e083b50b69d455764c6718fc286348c187fb0f8cdbc8a7c37db679fe41d853769ecc03063aa1dbb215f044a025ce98767e7a52fbcb44a9c67b5529e3f9b9953640e525471511336d993b6e741bd9e8cc942a1219fe23835384ac0f990f1646e487aae445065ccfb1cee5790342b4d9594687bd53b871b2ef34c619994093f368049a6a483c007ba115af85c976fa28787805bdfc158f64b50de04ab3b82ba026621ae262d25c4bef55776fe7ccfb15524120171e806bd413300089490d233c00fd20783630e2bbc5a661a0700cd1181c0559ed5712e0949c720cf2b15b776240b7535b76a237e37a86b81f6b59d4418c3a00624166559e180e18acb91157c715c0030640522eaa523d76f073a1279b570eb08b14bb697c93345c3da33b6d65f5ba668c80477140c22a56700feaabd73f90237c54754f377695b83a7d5ba8ea4cd9934cc83a3c7abecb927e1cb1ec405b58a7c4a010d3df2a9b48c213d0b63dfcb1533602d26614c08995c561a3bdb4933a6ca3defe340e52a20e3894e8bb95657e8ae363b928b3648ec266193d44c11ba2e47e2656d54c3a13558510c9a739c7f857b586f13a5efcc403ad347eec8623a3b41f8447301e1bb512766eb803fc1460d05880d8272c4b38a03894c2f41b1c4f08a416bf06b3595070e985768132bec00c05f5ccfefca9a1851c9b4100110051c977729b7d3446edb2ec1d02820d189fc6476b6aba6e08021e5000fe8f20d8c48b75daa6d8de2c0456345cae60309589ba9c289c6dc664328b5ffe10610a5b2af41053e21c8b58c7872ca332a8b6d12e75f739a6bfda88e85690cb35c5952c1a238d2b82ba0216a44a9c1d346188ccd3365b0f0e66007b606e04ba1d8c2c08cb6a901f491ae6c4442417a86da9d7051812066a652ccc178c0be52b304dfa4b6092b8d5e8486d4918321b6537f883661cb8ea4596c804c6534c40404f992841309f272cb61ba90d7a439dd204d9d7369523087fa2818dd56a712227d96f026f1fc1d4a3b272475beb1c0a398189fd392b0112ccaec4704b7983c10da4b1735ad78cbab8144b485f2b721193b1a9654eb734dfd2b42b50078db163b67c192f014becf74847bf47f19e5a70eb6b28a717ca908a944ac6575f43d048950016b69bfb86e21e012e15435cefc11e5b6813ad37942bb646752b82ef9c76f99a77b0707a8338a7528c01981b2b19cc64be2ade4e384aec67773912e0dc9c8c5d431c099abc663bec1f64050517acfb8584323169c941d1dba6c0be940df049e7bdaae440614e9c389a5817e54700b1710a24467146d124a12b90fcd18a964a8ca0b8883ab26916ec339d39133981570966083dbea8038716d6a574a03710477bc7776f7338c435c4ff27ea3b42c315700d327757b821117595026392e8526ae12c51b27752499cc02faca268594bedfd3637d78abe703b4a47564f7d78f87726e6ab45e814493e8103aa0255c26cabdd1321205657878460afc005bb952482d672f8f9c4196282d5558085857a83bd43ca75805557898d49a9afa414d6d2ab315506cb2879ff7628982588b62f2a428e21516c47757e36a1ce0236d9a074cd2928c043066ca3a3358b6d8065d8ac8458ce374ac71c0f6c6415faa870b760aded1668fd09f00dd2650dc75b426228d23b579204843cc0a2c9170b1155d7e445f93788308b316b9fb2c3b3c6ee79026ebf611505bc91a476baaf65bccf86091010dd14b7456e2a2ae8b0cf7e655ff251515f6627e01b1279bb0ed640d266c4b9798647fb17c09cc183f2170e9d8709f537cb6e7911ddcaf969c438c55623b89b037708303a595bc577a703b4201253367762bdc7a8d14e60784e5bf04ac62f5cba8327c781122427a83800c9b342792ad6e93bdca2491720894dde616a9a9674e771439b8704ea57d70e9095e05a03f3155c3007b1ae0467b7c7bcfd67a5dc679c8f6ba53b44c110560359c65ef6425f667b5ebf967497119fc3b0bd0600c93fa269f349bec1397c4b23bd851a0824b80b664070622860aeb98f2b2c9349c8e0cc824f5b0386348a77857c277496cf10046dfd59765dc9d00b013c3002060737e668cb6440aaed4f3220f789826b579359a3338b91f6584b27dfa7324f61859370795568de4cb39c4b1b015fb693f42c09e981c7c5658d1cab448a947f3a0caa999625131c9118258ab7635d78caeb86ac5c100b30a57216f586901d1863e27262ebc2e3ffc09ac4b6ae45c968fa81aac089a04e7393409799e853499888dcdb29690c12a7e512891421f111a2189cabc1d00a2fb9878c0057144bcca25c9a3f1a2c3b92c61261a3557177628a252347355bee55dcec7be730639fac28e0536c0636bbadbe97674d83b6c209442b34e37d9a43d508e849b3c21369149a7270e56646d984effa143c87777083bc54270b146291d8b4cbafc6ab7e72a871469abf3018ecdbc0753b94ba98140e4956c80913efffb22ad687921560055f466b1744e9bc851e12648899b7665a18a71130c1e4a47c26cc8f1a4972512186fb89a740cbebc6553ac3c088b01b21bd9c47cd5578cc58fc4697a0c756e7f860f91086aefb4cd02d184d294acf1f2872191851f585d96d3b98a755bdce648e8d7ab5e8bbbe8ba0b752973fab007e5390bcb6ab750f8aab5c907042ab8f49acdc47271d6b2a2ee148f13518243809fb5651f6da4379225bd864597aa65343b21b8f8753ab2994d981961cea24b7f780643b5674520b7fd11793b1a4ff110aac7516c1861ad54296b917c72e281692797af7a594e50c35d958436816036d13348f81851bc5332f6e1b55aa575af0c0035432b10abc89ca5cf19170d9537c413d1c7674992467323ded94c4c6b694558cd3ed45447bc5fd3979a68427916a9297904b02d48918d914ad9e88c99b5c28a6ac037248be9d3054adcb0f3746acc2c0a6711cbb1401c6d08d07a947d3bc35eb7b477ce19068fcc744772a126f98789d349fb7c58d9c91cb1ec4830ca54e2e44dcd27b45c48ae07e84c045487b2252178075cda577b26704803a94f9b07acc6e815a75696fc927c1cac2c5be290855247a4546288a383c15b05714c1eef845e9bd70ef5d3284d5800df8ab0a6522372893618d6a28a922152b1adc2e93f60813025d2b15667947788b93ddc34f05374c9997a0ab8b72023ce47a50c86ba00c86a37e33b7516437a23d37d6dab5197a88e823a5129d656af31b755a89c4df21b520b3cbda5581200c9695b497ac2b0f582a42ba28b537a7024d30c127907bcc1667547b79ae655b4143723dca5ec494d851b3e3eb763f4809cb045ca69407627cb49aa59099b050c26151b4d89cc55e762c1e358f1679b7f30a8cdc531b80580beb1b8495487d2d0ac3a9a240ac1acc457b53f6aa6a580b79d9cb953240e9bf90e54644253dbc79b2b3028e26ac8641042f7715d97190e64ca4e13624530a882bc53b2c724f68511021641ce277d0ae32d329b9ff554502ce25a294a3829c770e9565512d52f08211b7fa583ca675491533d14813ddbb96ba4f05fd9b95cca052b7cf098000882be1c2ad9865e4b9b0834189f91d5444791a561ec7baae5c82b09893a900920d6bf6df1391cf1a2506acb25d79f6d441a17bc5eb4d133f5059ae52565014939aaf208882631a531582b486bbd72850a0724dd52a225c40fa2a33f312c16a426a3162993cb7370d23c300e2a5d2a70102e9aaee23b715c11860386c4be5080283a4727954f2c5197e6125bc2c28757a63d46c0b322299e5f483edb10caef28c44cdcca5a9bc9505199e7da28286815757a63ff83c7149bc0152a674404b3c2c06949950f7b073f537728514b20c676c53176002a8c7af2865ebcfa57f1226fada60eeae67fa5417ea4b863d82c3871c4269974bb76e3338328c00530122e38c138e42df370cb51830980f9a6b4829af71a7149a28379a251530306d0719d0d6794f89750ce06c27a913832a9595b9a9c1728bbdc4515cf1afe1dcac211a3135eeecae628aac9538ef2fa7dac989ebf18207def1330f4828e22a13ca5031217a3d8e6f8ed708a7026e1a96d8ebc4fd2f54b5051eac9d531a532770837a854b4f5531f6e0c8d6c10183b30d3435498c2dd142951 +ciphertext: fa50afdd558e08fa0991d99c7420f9788265d682145abdf4d579799783c509f63c6bb3bd9fff32fdcd0aa4528f7461154bb30fd2bf34d5af56d3e097e64330db512bd8fa8912cb54e2af9998e625270a63feb2483b0bcce294384e0d213360db0b6f9968c61f23fec7e417795bff16d8ffd89ea6a4f08f9c9eb49f95094b1219c1388efa157a885c12ad226d93d2e1df960b113e43f8c95e478f30d65a59ff9e6dd70fbb5cbbc523c5070557c7d268201c974ff1b28ba585e95b8e6bef88fa0319c99d8d18bc5f1363eb26fa36aa0619ba7a73d023acff3dabb02358e16f271f5d5034b15480b15d8e108bd2ce74b3e6cae83d683fd5ab321f30eba9aa098a28523f2d91defa57ad07d2fe89330b4ba2f95b7823fbf6c920c38f001cbef83d27330a0d646cf8705b3a3b44ccdcf7d16af8b0e227fbb8fee4cae2ca5a69acfb01a5ada1ebff06b58199e4efd713bd915be7cc1216c7510fd6f1400c46e6805b8c812090e47828fdc0565b1a4b1be10101722d788658669998ee3fe6b019c84cb8620ec0678c03e44bd67218312924355e61bb71b7398970cdbb0017da227b68f7c2861f19edc80a8c4f6fd2f6770f3049ad7982ca5ff8920c934d6ba6bfc5114d44517b9d49ae2e21b4545ac386dab5018a04d32e11df835e6d13ba7904fa269049b5b54db5e47b9db426b6b0bbe7a1109c3c968d3d1810c94154e3ba163f3865039e43f74b925ad9e3a847da0bc21d8ddb3e928e5107b68fc0b317a33777315f0ba2b00c202ce78797fd7f95d3712e70bf742c9e8343a6d00f24c922f0179399d16f7cecc79ec8930c8c0226bc057633cbe5829880ea52513d7adb29d330819151c1ad81be030e4e0f48b732efdd315657ca4ddb8018b79ecd5e13bfbd1e1357bc33324cbb95052da6d7570de804646eefb932f39e3b694da67731c96531e9a080ac0ed2cea4dbef51372f4c2b4810cb95e157ceeb06dde752b4786d837af8e1dc2741f0816be444bffd29943c535a15bf38a33375a5ba97636dea4c93883fe772a0c459aee9fd452e115278feccf1b07887143c5c6d5d22a4fda4563b178b795a3d686b2bccc04455fbae584f9d0ab687e6cdc32c849e8b7bd0826d9ad7fa94f95a788c5900e9af7c6d9d36763d76841e186434cab559f8347c6b5ae3a12f995df15be97d8e7dc52c1c0e51677c0aea08ce2cfd8e3b14c970fb1e0e48c139c41aaac31796ae220a19c2e7ce341c2d2ee6555988ca1996834197bee7132221e2864404c662df7e1c942b516c7339ddd143e48899b5b3bba4975d049816978e9fcdf84f76f46482fec4444cb65c97946c8eafbca4ac386fca82879e3ce2d3592bf18357b98335cd411b9bb60a26ccabc081726610d9d30bf03cf95b9976672cc61cf34930acf1725fc4ea57e503c42d2bd4aa110e5a636c34d5a26e2cbb91ec68ccb10bed5f16a685dda63083a786f2ed583873a7983739f19824772e1ef8a95fdd9b30cf4fd92c33abefede7d5c7ab5bc723c800696a6067958b3f33eb785ea33fb7ef1c1c79cb69b1d78d34d29a4f2e938140c306b3061d9d6b342560cae88a0579136f7322e9cfa01c57c7895637afcbe3509c57277a5035790085bfa881a78ee06f34e9d7ab771d1337b4d5804f09caa90f61c1bb0fba34b353592fe1763786db69ac381483b48088c2a29fa7144b81948a9128bd569a35e83871af70dace9bca084e6933c350703ab4be1047f6a583a509a8b6b42279b416fd74564b8143498a639d4ba9e3ab0a7d0ccdfc4066b3986aa18d0cafac9a6bdbd49762e351d7fbf5f75eae5a4f8e9a68d1ee21d1694c3a9011f9baefab8dd4479a0e76ddacf3adee7d9764c0078b0b1d720be9a0462c96046a6096cb00877afb8a360f221d25ed5dc148925be426f2bcc99dcd9a6cee6ff4f5db923d0ebcd312957be9d9d1c3ac7073b15316d46b8490cc131ab6bf7e32109af1f33edc9eeb14a124f9179e34a1e8ccf8805263d57cba6212895a3f89212c3ae2dca1616de55c3978cc0e550a06cb0f257205f99447aca459405e0e5b1575f48d589a90651cec6d9e36bf0374ecc6825947945d11c3c770ed4e950d7ffb789f9630286335276b6187775eb92c8b2b009d98fe4bf744c4b24b6dcc920101f4a4e190ec599535b3e0ae28b7169e2ac190b27ba5823103a61fd403776c0c9f9739454e9b6ec20dc26cef817f1780 +result: pass +shared_secret: d66f47c870254f7eb7ac771dd6e7bafe94d0dfa62240da301a5cd05f2ad7cd4a + +# Official test vector 64, seed: "5929f02a271725cb40200de32d9d03d8bea53b53ac83186c42c7f565ccb1ca508305d470850cf86e9b2c61a5b8ca1c93" +private_key: e747a3e56b5da1ec0b2859be85084ecfb60144b5ad600a4bd5f31ee866b72bd110f6111653124f695b75dbca4a5aea5c17c237d3e5748d842830fa2c87454960bb6652f5b0108332ef3024a2346e5c9ab71d4466330c2761f7cbfa29bfbb51931970b3a291179a1139a0e23e46b62dac796eaac32b4225c7bba9638fc428d3d4b691e5263c3c586d8abb56a313bdc69dfe323bfa237f27b046966c0748128ea32c9f0b34015e6c3bc8578dee1465f63c92e2e197e4e2ab2a76a9a41bb57b97903808472255b2f98bb24fdb4e8657ca5ed0cdd176931c934b33bc08f97646f6e7ab9ac565b7c04f26d12c44228e36824838c84b2efb0b5db6126b1b54614521c55455ada2002203b12954652c84b3ed26163b70c8cd5c76976075bf323d1f7984e2ccba31fa26fbe82a61895504abb81d660da8943bf6c29f16b72e59965813cc218a8635380044d40bcbcb728d9c37c375a975e619524e4c10d7a73fd8c400694ac396b384699bae098c07ba1483c834aeb3f1222d753758f3458fa2b579f3a156d0a27554a27b9192ea872ad9a83d137a1ef1f3445458761348ab6f40a0b8121f25f56fd9e7cb57318169768b46d71c7c41914de73838fc4adbeacf5f7778adc5cef5764f41b8b5b0e1aaaa594eae08b84f1b2fa8caa94eb46e2468b090832f9afcb4b543a61a5b572de2b79967c03d97cdfb5c0cdd5166dd121f8e1552780667377783c7e14f23ac2a4f2a3de89735c9e095dafbc72fa8351cf5203b7c9e96db2f5926320d8aba5a2750ec7668406319860101d86b92d4fb00f0fc75d8e3b344573d70449fa2fba847d399ee982540ba92a8149c24c411d4a13154ca92ab5a8a2be2942d45370a1a56e3ab715dcb7864b9956f2aceeec963d34cc3ea33cc9ae700b58c0953011adba08c115574a377a71bec017c79c12ca7a9362c6e40391dbf3ac987362569dc34d20a07b03306cf7577ce94078ef122207bc05e55a0d1d6368ef85874ba21a0090825c720467a891e1106a4c229446086bc71937904b534780e40b07d36175c81c8287dac48fd72c37946b98a9ca814401d1dcb5a243cad5240543234c00cc146b9ebbcc0dc57f5f963255366e4424cc595a1f7f2b9a066792fe0835e97390c97a43a52c39676af8be2393ca82d64039e6ae6a6ffd5b582915b23db1f307c1b18c90086263a9ea5a87d5470b1584c0ff272e6cc3e1c3b59b895b048db369bca70a3d22263483226262a7f15b96eb316dc62178a52af1810a7fd357679121c78083acb8ca1f0f6c3959c235ed901e32366354087162c3c86828c7b6b8688120ebaf50f55f111950ba79093a3c2029deda0a007b73241d30024d897bb66a0653386bdb344d10c90e43249d1fa0847f0ca918a414484656d4c0c246350be4722b43343a2e310ec985476fb754c93256a8321d9369fc531495b263a440c1db25b975d0a74d6b6cae1686a63b64a1fe0c51433ce5b886c34d9a44afc76133245b302a277403ebd46889e4b84585615d6482a4b0b5d528790e40538d4612646a690f0e7a451fcaff648583fb7025ea2038540acacd2b30429a550c980247188cea490e5252fdd0481d0b9837ce69e03d4798cdbcb25867b9e794ddc945d96489625aa16ad4150a925aacd254a6ae309869a018191c9e6f9411a6b375bcc9cf81925c57b99beb92921ab932aa87c3e68c500070f5568757b2b8e86035f717b88b3735ae662add2334184e6cbd2ab026b8a9d41f12eb322afc154a0b21330c951a4bf5c54959a515896adeeb73c42d94218d46219c01ce056bf78fb88902ba686b440c1026bfda6455610a1fa008d44c28bf22796204850f0e124108816e39b3c55c7ccee889effe88587b0a12a5c0b2a30152e98c612b61b95c0ca8fb3b203dc850ffc7f866275c7c851b67333f2c37a6b5b999b686fd6ec67ba67c9b0910e95f84a5e9a826e0617229206d94b98927c418cea516604444978c24dab19f0c63536076e9a0841873338767b3d935cb526c04c2ab5015fbaaee2a523ccf7154353b5282c7d9af78f55a73857ac5a70a03a584a8f1b0bb762f9c7265b40404888516016f6808bb3b3b7d0553e2877726ea63312f3afd494b5c1b60fc4b6bb6c8a68fcd1a6cfbb9265a10fa4c4bb76b8b47d0bb34f99b612a595aaa91dde62c02cbc473601b03f5547f1b4a8078aa079c4cf39c56f88925a9383b9a0f57b58741760c58d2629c5d70074df007e715a3f9344755ba908a4a310de73150a79a9ee3957a730687f4b2e7df025c1d699c254af6642bfab84809ea9a3b35410c7688b296a3da82c6cf6790b48fa3f66f5b651912e7939ab76b0935f49c1e0a25422365974698c9532ad00120bd2ab10a8d1a78ecb392e6892624a3f96b2758a423246d67933eabe6ba2bc019a031431338ab546b3154a80945a9b31bb5f9c4071a4b0ac4b1b85b3a11ae1371db39771259936a27ebec742e7d6282f19c4b6ec1a70085ec6cc23186c8a29f4c3a1d3ade8912e3e238f024cbd30e61b1ff2312c91a2eef9cdab68446bcb64ae505c32f0ca5d02547c3b2343962df8d384bac81d15fa3bd2a116b4d9aba31041428ab688f950809c94404b5c35f303d9852a0f029e609126110b64e310c81d634117e3b3e1994ee2a2799600aa38966e00aa9450f24657a39b4901764c3a267f2018363950256a69d5b0240f368bfb238fc3abae22dc2f3fa6c9e7f055a8712cec654adc039c49aa1d303158e05b0ee4f1ccc0e07cae74047b603671b9704e70646cdc0b1d1423bf3c4fca6612360269a26b9731524a2117a2b686131708470ab6c1ecec857465cfdcaa5b1506abdcb6a5e379bb4e358462f802c2a81b26d0091a9a281a891c06737fda60afd65ab7c7bc4d97667220ea69896a46f20200b0333546713d9e685d8230487bc39b68b170105231839417fa92aca1cc38246b3d0da638aa28c907c823a1fc779b7626a1146645db0582e23115c64ca6468bc21a480385b27fcc28c0e6b8430a270c5061012a619da7138ca97da7832807aa4f338a3983170b62145f36a35241d21c13c61a1044b5bbd2232f5c16f106ad476818f83920f650a87dd80c3213680cc1572b0625391a92dd423e53dcc0ef58ca376b18a46b8ba4506878f38c88d814bba280575235b23107bae8c1f443a5e9c1058c904a09366b50e7b531451f8416342267352fcc7fb21c05bad69bac0967778c0c2d48a60980ab5b7901b84b54f1a53b6bb09b37d48dea04838193657cc7b47b436d4dd36cf9bb4bcc552700f98a88a850dc009b00bc41c9f552e5b346416024065634f4d768cf49bba831758af42e408668aa712f93f43658c48b80a72bfecc0258ac6fb10c51ba665e8f25537116ae53336a8f3a0d2101b705642c5891b4500ac61d023398b35a21e37ec6c9821eb46c348c594590941fa0cb5d88ad32c3165cbc3569e15960dab8f53c16d02320b7c8394971c14c5633ac5023d572608c60a726d50b22dc3696e7c352fa6faa0c8e73127ece085562bb8a86ab6628149292a750588aa90d268f5fa618b559a4f8468218985db9f4cdc1f65b4644cf585a1a8057431985058476cfda6ca0dedb2fd77917fda88d799709c169c01e90c5528a9ffa144636334d8cb3a1cb27b81df55c9205aa1cb43f04ec29beb19539992846db361de4bea0a7b045749609571639933e6c105221782033885385c5036153ab3ee68156f0abcebcc67c9163fd09cf2a50910c8a5e50ebbaecc030ff38b041c3513da677f78b253d7c5d9bec993f85aab56a21502b1ee66922ce9995eb83376ed309b1f66c9e9b46436399364496a51851d48ca06e342fd40a6c64748d6db5a9bf18893d65a9fc3b227401c9410888287100482438e604cbac435abe040598f5cb7f07aecc23b6b38a95f9cc8ebbcb4f5cfb17a8443f89ea8eb592456da09fe9a36bb31a98e9e5372d4bc83f9a7509da4ad87036581b27844b79a9753bad9a476ef64661ca2a5e49797fe161159aca36f017d947b66d87833383c9eb593313054e00867a81e0aa6b1a8493a082305a387f8c50024a9f682c69ca0aa180eb8dcdbaac44f4a3fa830bb056352095c2b8b65eef62775a470638c252f40c8137d05cad7c9508c3c34a6b29e6c6431b34882a3526ced7143da2bb9733c2ef816e28d3a1372b418ca595ba593b18789b7c6a411e27acec3b4246e8659a2330c628436d21722536858548a280588cadab316411b5edebb50ddaae15c32ecd74af476b3d4d834c1047376001cecac303f5c1bf7afc7b63e8372c97a8fb68837064294527799a8874684a81f6145ad7ebac7a5cbccb696472ca98fd95b9ba4db7d8729965aeb56b8ee101d0b32b6b80a772fa80e70598b17e84fa2a35c723556eb2782c7cf77ee75f8928f8038ee66db41346741fbd6aa1daf2b43fc3d8392cb53f36ed647364a04e37278a0e0a45b720f4a75c580c9920eba98d +ciphertext: d2f9087631c7583df5f541588ac0a0696e83c45765f3eca327740dbde9197ba2ca9d072aa0089db2f79746b0535fc8a77bcae1500e3fedfc3d911d97c8ec22fbc1f61a5bd6305d736d68061072982438c4f673ea82023e56b42e1385ebe4e85d5296e28ae0352d5546cecc6f29cf4e25368a6a794f6b0b33fb1c568dab46ca7a1353228ab01184be7c0fc603f5460fc1cec63c240dc96ed5e346ca6ad214b00c9e0679619ac924254f5e75c8f96a8f8d6228d3910a662c24003960011e93360c27179f826393cea762a09549950cdba847ab8f676530d832dc16d4e479c4207ad6f9de68a0d4decf15d46d98da375b5730a6a8322a1126b6ecd8d42772b76318708a9366b8da5c7eee8fa928ba2e9959a1889f4eb63cc5b4c1dbc06c728ee16e93b8276ba862e5ec1b8cae91582bb1c90893e96871689edd35c1cb12ae33c55a69d4c5e5bb6d553980e0ed3c131d2d87b52cc3fd176b92425bf6a90fe5f5cb88fe69bf5dcf827bfc20b3c6a4145d400e4ea80e9b519df58fc3eeb0e9579d147505c5eaeca51f0894f5f1050c07d53bb715671799c13486b8ae5d26216306a974b4efd27d8f7b534dfe1e25831cf74693f7469c64d09f63432a1b369a1b122b1f4c0020b30c1bc781f5824aa91a4d70db70b8f121e3615faaeb7ace2b53de58a56fb44cc47e5b70172d0849957f5a1ba90aba44504249a5f8fbd9af379f0cd256a8dbd728131cb2b09274bfa9d7c67275fc502c531a02879eb7715b00f2bb794c2cb357917ab53f6e6a85648056904641ade5a0f88c2fd00f4933c34e9edaf34050f97863c36466741a5ca0dd7d9425278a1079bc9351cc6c45a1e80d3953fa60c502da6533188fe91057feb940fc926feabeefce97441becde7782f365610e1565b6a5660d22d34298df8bb679442bb821941743ad5e8390789f3c262c6f90b4685a0b7381762a9aa21142e7fe80735832918330967fa9949e44c30eb06eaa729a108116f533d72c3d20eac2f1e8fcf5c39e86d7b453894ef01681f0b46aff3ebad2927d3af51476543afde23040abbfc167cd5a9c1bcd980f2d2c8fb09bb0b81f4c778a6fb4e114c874f6bf0a115ae64cdf82bd3aaaac90b004c407aae67371ac62d9235fefb47de6488627e3c997fa0b5b76289d0166cfc4308a4b9bfc674ecf643ebaf66c2932a792a360ecf2bd4fbf4c675daa7df02eeb54e2a2f0a5979c33474832d509c94895c61a93873c4e699a130b1fe3dcce9603d56755b501440167b09b6acb9e115ef4133963cd702f9097f6ff44887bb0e230f80e97c41d1028f36e6344c7c1e4a19792b9c8cf838bbefd4fbca05e1edce7eb9bc9188d89d784305b3ef71a3e097a7ca675a775656fbe3f2219941a0a70a777260645fc2198536b585d8ab161084f78fcfe04dae0e1816f0bad71581eee3d663536680b1aadb31a6711832a7d3547d97e7e1fc9bdea77acb15d7d82bacff5769da9e7ab730c8db6db6a9b51e2c419756159ba73b6a4ccaa8cab4f86e483237f8c6ba850155d5e0894f9f3105bd11a33ba4c07338bb03e67d59dfac122dceedb28d349aa26c61cf95ed6ff2f7056b5af9947f563fd016d046c9c2e9497f665702643d42f5a277e3e4b8f905db9ed6caada50941473e3caa26f70a9b68284c09159380e02b64d7a4da9070ea4b91514041a18036e7284407456bbd8a5718a9125828183dcc65fb0807d2a53eff3e8b010ddaf62e0496b23fc21ca0996a0a625839793774a3c5e0597e00fb4cfc6fbca08d94e809969710d091a45156c1b883935c94b1c8c514fb8fbf6d0dbc00fc4038d05f92362e5ce0080353c61b65f201f079ab708d86feb9f6e25e0289abcf52ede8e241daacd90a6669c17d1f1e257569a4832cfdb2917a64619e95a8e6682e83ce07b01dbe1e261ba31115e05b2405809e123215ea11c067f059c10851cdb00fbe8ae6c9508ea8dd9df624eba5eff018880dcef0171ddaf375724028fcb2b92a8aa1d6418162fe994d1b7b2bfadb2c9d72529ef51711745fdd43da7675ee19ac6b6b2833c69fbb7dc00c4572bde53014877cb5aed967a7f9477417a396f77302330ef0423937e5d4893d06662e2237e5952911627aacac06f37eb7d38239d2623235efb3df0a1d630de19afa599b66f41db7381acae5664deb979604274253b7ee8fd840e2a324e3db89a711ebdb5799c4c31f45482c5a7 +result: pass +shared_secret: 166b559e963a2f4c7236e90818442e9d9b2ca49f91d96d54f239b9682d00b5ce + +# Official test vector 65, seed: "905074033d7b75deb2d06a2f29144eb377b452534c5710632989f02d45312d156557e96d4486020826db200153bc4a8b" +private_key: c35b3d09514951dc232b3b261cc77a4b23b033a57012277498f66299f98b2e58a618cc8b68ba21d1f86cee4b7221611b8d003010c870a4f8510198a7f486279a168ac82aa70744cdf8662ce35b65ac836895255089ca97e4b61c1a52b7b6cc24b434b25be51814d09b4312a1150931d627685917b8535bc52aec1eae1338bcb6c087bc419d3a30f625812bd73fd3e3c798d61be67b30d0d34e34434878f53102437db096cdeff6c79992337e1122902c803e58c56d0878c5e891fe47441f95390fab44d716978a0c4af218863ba783a8c7b5b9f74ae671684fa284e1399e3ca469acf757f6dc3b6306a2b241005214554a7430dd97646fc26f4b45ceb8e13fe47bcd2a1b0ea558caed29be60baa1803808e4702eb6f46d92d1c36c5aa89fe27346c56d17b52ca4394ea563022551922923b6c5d36477002d92a88041399f33a902a0292563182a48145bb3791e0eb45708a4132fb768850c83c9517d25b1954939c857311cc94a168756aef272764cf63cca0b1a95ac4bde1c2c531769ce89419edbab9614c620583aef725eefda51bc16b5193241b986073764c4503b7b497a9d77587443a52ff47803bb40432852a1e4f6a7f1fb0a46304da84a85523bba99e06b304583bab0baacdc98db486439916bd3eb4fa6706c8f26682d728be9a82fb96c6f82a1c7414c5fe645b833ab30b515a446e54e5389a972d6222ae14209d9634af7bce363a0db3222378968eb589f9bc2a5032c37af18a9dc72211b5858575147aeca713c216dd4c7486861a16d9a56305c81255403be295de819b8efe70a19a1201e7740240aa2a081739946606f7786a6a745b6929e70f552b7a28f49990c82e114360b63cf739712dc647fe8a03b9a8ec5a2b4f8c3010ce71ca964a1a89c61729c3c18bcb8891bc2f880c93041a5ffb9600e184df6a07ba52838123ace34f01099d5507e7820abe2bb4f9b67012a4419934d13db839d36aa6de939feecae90cc35955164d9d9c8a078909d4cb22016854c2729633b2f2899302f356521f0427cdc7907b4529155c871779149f606ba29aa0d9586ee05baa1c78d12b9807ca995d38122c43b9671b16fd03436fa87143805c71c4656c29b8da8b3293b44be0a0bb873647f7aa92562e4706362110388c9f15962cb249953128a53e30998918ad5370ff32081f4053d13f741d036c36fa47e8a97b15c647272a52ad94620c4ba7aded0259323067f8b5612fcbe0aaba35d6999339cbff2502ea693b446f626fa05b5f3b90c7362a38d0a710a32a1e68614b1d63469182baba57bed2a462e879b7a172bde9ca930d85b393a797e339d4116c3bca1cfcb16205ad5c0e68488a112c34c66b4d617b856ac8c66aaa98ca458ec4219a747930f3394c4623a7d402b557069aa524eeca0a6f65a82a2c95aa816723aa2cdfa841106b0336a613420994580b94b3261a15799cde04ca3a758884be34955725827c15432e194f624921c674ed10877cb5078d1b29a52694fac72cc2aa435549cc34242906ed1cc12e523d6ea0ce55cb8a09c22cf580a76a8909d3c3cd749bbdae9c05f117114f4b5ad58533d410f8b2010fb8c25fc1acd38c69dba50803a3066214914cf9a8ab056a47892197dc50783072764a69d8b988798aaae3f1c1b2a268312bcaffe253940311033c64d20c1aeb501029f873a6aeb1d249945a997819651bbc86b96cb0537e7e80c0e382df932606bd58ca3d21c01332cc65c1c00b31c34588d1b10cc176b2ffbbbaf2fa95545e51f0d7445cc017c4d3178fd38c9d85123040a702003af65b74904028753825c7f7c6843b3bfc8020535fb6888227f6bf329d5203eaf8b8a3890716e563578e795ed566d43b071858b1336165544ec566acb361a8b8564796b8934c8ce253c409677c2d45691306301a58da9ba2d05f0c847684e960590f1a5c60217c5ab905cc8a95e9bd26301802ba9257370b73e63d647f02cca6d58907da1759cd5c20f7a8762e56c1e09b95c1b99f2bcab69931f03a707baa0580a896c022a53c3c846e4d0551f5a2d6f6b4d22ba779b017fb36546430292d950c10ee42862c749bd95104f133252b15771db7d3ff4a7cc310036903650041b40609d6a9c16e40ba12e6c390a388b95950b1de92acb71396e4a0fb7890bd7d123d710a5d0c53790651f609447f0b18434e5b31f2b2a3d1233205c11e5841daccc2017203be9c26db2ea7de30a6671f79c1c424052a784e727c36a3b9dd1d71ba80a542dd42b17c85eebd81406dc394ec556acb00932fa9a8ae610646a973de42f9fe29c92b35c04884be2a5bd3f68b2083945f8ec525d651877d924482b024847938eaac5690cb33f0a878927bdb4a84ad627092f046a2968437bf9a675d91e25e89a3f246b38461f002c3d78206539968d9b7a83745869ea8accb72ab1dab78ff0183c2ffa338c819dcfc1178ad8b928c68abc98209819ad705a3fc264bde3047fd2065c3e1806a9318d75a39c6e4541dfb86433bbaabd12762f521c842a2381dc78fb312b1a6a318c5201bed68ae518be985746b863ccec279836d6810178c54902619301467bc986a735a9e93678b1f433bcb7af36da821dec7546a4957e413d30a4b1d75ba216da71af7a7b17a932c224bfda459681893ec103a4b56c10805a24543741ed0b1f5bf84daa018f94c07434758d32d80a3d8c6b54774da822451b12aa086782f9c0622c2b8ac9776639084a19a509124b5de6d77a83bb6e123b8eb1019a2b203f87896f23018568da081df72e460a1d8a2815794966aac55fa07cb7007ac3743a0f2ed5b6f377286a7c2aa4b9655237b3f1635dc25527357bc4714c3a47285c9ae3a5a84886c7302d22ba2d3c15580be7b1627c81fa1b0942e85a3a075845e47dc0674f4ec2c1ed9ca031ac1cd934a01c022d26b6ce5c038fbd541dcd4ab4a9bc17c06842d7645935b57587559c11b99af337bc629a45ec37a3a20b1fe905510971b6e0926126e815625c5d79f677ebfc69b1489809172f34e075c29a6e9fb4b536f892b16c7aa97623168823d5b1afb439cd2603c9758904b942971d769826b169936ac108c6caedb98982098d5176c71cbcb11b22b96143433f6c083bf83f6005c5c8b93562e081c940903ae662a8f17fd0882fcb399161d2a2bd2b8d1af0731b0303e3c9beec81c5473384b7a04c1c841f60e27eca0977eab4c750930a2bcb3983daa99cd4c2e2414ab8f77857432036c1a9a65c493afc62ef80758830417375c697a2a7fd0782ac011014733e51f088bf32b7135b5db727b147936740e320c603365e280cbab502b64412abdc4d25fb9a96ccc96f166445f6a6c3a894a6c10ac7bc074fe7b5a1d2964ef0531e7bc445e0a402f45b0f29809a84795848812a1b935d220670c2cd0e3332abc68f57b98f24cb9e68f8b1663b4c793ac4212177f11c594671550e44794f84705fa4835d918b317a1d5aa39e65026d3888aaf40cc247023b74cc4e00fb1c011c6a266560949c626e08263891608713c12e75a229c5bc114bada81395b00a5b6e695096b2790e85c954028c5b288758c9ad634a3ae11b069790bff9428b425ab70c5c46c2150346235814e7af8576af3071c6e6d4b56b61412d7a5cabe21cdbd0aa69e53d4d223d72e4c77afb927958245cd57967428d9f6c81cc604fadb43dd56c8148664942e2085395b17a1c53646287fa14a9bb208aedb1a7e6f73828f0aaa5918a69c211bd765cc0f93615a57609b5aa91c502b851c4a9b24335d282348ba33a802170524ee3351b6c780a3a9b46cf472fbab34be9f508c32a64bc37b6e6b30f37a7a9f200c34811c2b8553ec3ec091091bb08ab02ca7680867244fd3c991508902e84bb5e177f7251057c38784c0905cbe7041f12bdb77c07842228ab569fb69700f9b3a058dc5791b600dc48855fb1cb938b2e2599c1f3411628b64094ac20eb6c50f5f5cfdfcc10471346de9429dd29953e7b139e2a46f04127d7225fd46723dfe19522a4a76389bfe6414450b885cb211ae680b59ef46177d50b0b3306820a9d57293ae6753e65097f8de97c898c465b07b6e89459f446a59c04145f2c30dee57368e0479468ae96bb2e8b0332bb7535104498ffabb2abd65a6b8a2358d467eb8376a795aab40108ed9b0967a710083acb476c28a01b46e68a3d64b12dbb49146df48f31e1531cfc3295e4cda083af7b3a17617286f60b5ca9d21858508f8f009878916473c85360e8cf6ae8360c80aad7a10f6cb7a707063ea9b2ac097155e6961388f87327d084baea61d5ba26e1d5bd9cc25ffdd46a24d81c40532697b4cc8f58643d41afb6d29b7c857837a1e385a9106e3bd9911c697c8709312db4ee1d9b023e39fb4a92d9d95ff01560d717ee34e223ead8139db400078cb308c3e1bceb046cd9d53f1a2abdf8f924d7e4b5d8021c486b9c3114d7cbbeb7cd49eba8a61bc2bcae1f1bef30a1daf76d +ciphertext: 8e1b874c5239db036b813ba1154ca84f8219a8a4bb785dc48912a04e5d60175821c3f7609567bd3a11ae75bf88025cf960768bec53b0350531fdce65e204065e23b58cd995efa449db59eae436e84b4e7cc80dc78cd4ef12bae5c5522c7e7e8a977270b9868acdf57df9f67128e5f26179e11451a81c45778fccbdca9e5894cace05e2e512b07270e97dc7258fdbf8b0f2d532683cf0578bf0821e5c96654d9b166c4aeff1899cac0d9a898cabfcd572892b151b48da4cea71222fbae06269d2ef9e564670ac80965b71e7263a0a14ce5a1411e29c043668bdb93af3b9d4c2f86a917118ce0b147c5c99562463cf9d907623b3b5c09bab327879c8e17bdc16f6a559aa855c5dc90adedb3ad4b642d8a84250ffb2a70a861c6ce71b24f8c6ec9199c060531e365f6bded0dce14f5a42a572f3b49a9f9696ac3da5a842640edfcef5cbccc85b3563107957183e1004443de9e416500e4254e3ca7ded5535c437b098c34f3e10a568b12f30f8d0ade71b9e2e666393e61fe757da50b9c3d2a7682ef24cd9aa296e1e92267d9d1fd686b11507b984f4f05d218d98bdd7bbf67ccd84bb4def89865a3cad879785c449c517e29699b0f3d09737558dd4ed27a41d065f88b7a07569d28616664bc6923ff77337ad3107efef86ec513b991fb5d9a58044bff3412cba0723a83fb30c465f9cf4a4c733be247281cc56e8ed00ef84cae631b2bbcf647227002cf7c7a400d465d467188c3402d7b9afb67c7fa7b2a1ecae21ec56124392be4f33df423bc6a29d1bb8641f230e5078d5642be440923fc761bdf2835fa99f505f2d9f3ddd90187ff278c2f55792c5ac147785a5420a72fe9b55bd7a69ebe877954807abe351f950de6b5766a516e5cdc0668513440c695b3e0a0c9ce68ec0e036e3e7efcf65c8af343c03802ed7b84d940b796b79c08f8fdf86cb956fd9ad3f6336a39f814d7cd68971074a9045373462f1eb03c216d5431584a7b77e67cf73f30d4fcd66ff55141859fbb48be45de1400cc66505411f91faf600999dbcb50937486c0e71722d8aa11d1146cf2ed009c1888da11e14787ecb008aeb71e5c2827135c930788bd964082c147d39da28d15382aa86763db13c0d48257d8a9253dca4d1a1ceaf5cddafd9ca74653f833ad22663a5b158fa142bde1980f14800714ef5222d4d97542cbc0750bcd24d26dcebd66edd7daf309dff500cd2dc924f651d5deb9142e81434ac9a2ce80c8155d1975fc5dd2a1d9bde9e40a85bc77942b916d4cab359579cecbfe32cbcc639cb8f6840405a4e2003a6587a229811556ea15982d193d5b84777517e757acce84f30f957c019533da3eed6f51fc3dd69ceff6bab3ecf918dd29eb0f741284cc4d4a17bd111d6e2f964360e6cfe86a95c58e0d3b3ee14b11d15d9f1354c3f364430913cec29728ee2b8cf391d012a8a48064731e51ad86399788deea1138de74476fe3a8da432aa9ff654ab7e71a9b33fb08a9f7e8d703ea3e831f575c13bb0cc592bd6e387f1c960ab82b04b29f03b94f0daf0b56477517d47aecd0d08efe6e61f8823b0621cb83a578bdb6a9976593bc825991e887a59caea6003b11fe23ac1e540d2a67262807e65422fa8f5b47e5c8b452ef29ccd60ae85448daeb744b337bc20ee87511312c2cf4aaa76f0080e166ac4d0cb02f3456777166ff968efadf6fe78dcbd93c8ba8aea5bc0f14f65262acf72052fe8d23933e4847a9eae488ba2049478b09ed9dcbbfc9ede10454744b5ee95b6381a30d838bb9060a67636b7cb75c7394e02b1e58ea3736443ad43dd540f52212f686544481504224d8d50b1e009c5ecee23882c8090fa0c7f0ae1b9f507dfa76329f788b0080f6e985c7e02886487b9379d1229b0a6aa23304a056cb9f893cd89addd87bf0928f42d4ebbb2d90e82f17d88cb1ffd34c0e90d6126cd8a8b29e2e6454c212034342b204b6ed5d462c3402fcf96c3ab79d4db0fca0ca1adf6ee0407c701105ad9884f178b979fc55ea74cc0a176a7be6f1f90f675c4f687b44b2d6923a6f8e1de0f5e6f76c4516fc1ccedb1c4c9bc51c72979270cb972385191c83e8278a4c8279a36c528a91446d9fdb06fc26ee7023beae01adb417a11176839e74e6766745c2cb8cd0b74e8cf020cce2648949e729626c129bb204789542f74bd1defe1984d43c9b046604d223b4a10511248daa39bfb88028b +result: pass +shared_secret: c71845a26ce9635a0a37462bcae6dee1b2f6901e5986bbaef9660cdd5875243f + +# Official test vector 66, seed: "a3e2e511afa7bb560446bdadf67d2ee2e16ffc7baeae7efb8c5455068bbd4e91bf9be9d98b280072faba7712c75b26d4" +private_key: ad3cc5e966747302200dd35f1d80350983648610ce07452591948a1c6a9debda418fd0ad79da318004aee89acdd62c689f88a5a7621f7ef3b1f16c5bfd5c17438b98f029906c276ef1202d1f5504bec6243f608438047e6625c825b902ce22141142145368298d0c33ef857a45c872aa73308ed112726847def20029c2730768abd1c40a8dca501fa61ccc737d8fa497091ab5ea532bc730bb9633becde90398a391b4e60f5a5a31a360529b1486530b98742780c78c2761c09e655334be04b71d8b9b04a7b7daa7ac4d2a98e2ba49a54c2e91016be462418e632a4e023bc6e816240927c73703fdf0ae2912787626c55f4614c93731c9c679984738c96b5cf64c7f3919cd4d217f44e668e9fbaee0530949f63ac68137c841ab926587b161c56d218e3500885b82bce07668ca959093792507eca4827a003d26cd02324e352388fc76197ec546d590b00f646de107681ad32c708561546bccaf0489495821f8d43a436c1e4d9ccd9be2a5b46232dd37485328c3ade9bb08e53947eb16afbc6ac1b2b96b496f1afb250277bdbb0b6186b61b88b81240292880d9cb9a43352546a5e9f600045153ba033c3148a5aa78afa9b2b7c8b86e4dd70a0516a8a3e746e83ca8b919104015650da3a6f7ab9868e1c8e33b039b9279e4680b5c2a382789049f953fc28764a0422f00e9cac3ec794de5ade0b432d294a9c06941a814ab0f89bf88e719d081520b114c9c821f772a7a3b2a16edbc2f140724e7dc1649281233507187e4b87ea13803bb8e23541e176c1cdbf38ed1a225fc932716974829a6b83f30b3f587804eb8720e102278d5c7a2668f1481c42adc13788604d60c9ed1498bdda86a9640bc0b8137f3d7ba17e0bba28167ff1c5e3eb86b6eb5c018ac766e15193b8b4f65acaa3a2c191d646f97f19b200ba588780aafbb2f1c582ddf4105767cb93fa984c5b6cb73cb0301d9183513582af59e04d9c5869cc99ed83677d5a0f4405d166a97ceba0d6e0b8692cb6ebe130f77025a24264bf6851b2a52b41ef989b9f890cdccc3867c3ae19c7238750bfa11ae52dc573e87554a40088e682f15f9be503b05e2b53fc4411758854f5d691ac806ca00136a0702ca52803dca8c935d98c87fe476f960a169401147b240c026745c894d7d91197bc7b2d7802568f61eee554d3b852902934906521fa08b29b6c7c27c6867667168b796b5249bb442783970e7c443469c540aa9598834bbc4bf8ec97a18119b496a56c3fac7e2627b76ccc51fd60edf764f68ec032bdb7a1b5424be15329a54c537810205c15ca2ea34a6462cb3647dc7a38590b120a8d141d821a20349631e7c4804f11af9ab9ad4917a27ba99b9f2277f3a8afc059bab0072e93131a1936f87c8356e3859fd97a89e17affe170693309eb4e29a769ab2ab48659f635acb4ac986f08f1b186bb6a70a50a6cd4c202a10bc2f1d24ab4338b2d9765ca263ce01295537dc56bca315db1c652e850dfaa522cee677d2775f878037e5c17da2e6c7fb296927c64ce9256f88851d31ba9658f5bd7aa0636cc2bafb1c3494110e7fb8683bdcb3acbaa7274351b14a81bafb0a4e2208d3c204e84c00920c0c074109a81426416bb805465e429641bc9006b56c75ba1c75c5ac4113f95bce7843344749e969ba2702adf09032af83396606903772547365cdf835a5bcf69d3c14505b5472475c97acd88ec1ca4d52d0b1281086a5bb3bed1cb3986238385391a0e59523b5a16756af4e15b58a07426b574ec080893294a60d1148dc418c1312673f89951ec94e1db149365b33ff60cb2bc372763277eb97c5c8884ca7421f681b90b249275e631918aa57a7ba65b4d620cbb59131201c9a3c5e070ac76f7214e167853fe16c6058a9231a0f5cf69339c0463d290457fa47d0d949bd7362b5c0c2236826e4241353c2ae7833c31dbb03e7332dbf370a637a8885cab1b9d1a864b98bef6c81a27c93cc306a27b37bf794190a3cb6d55bc580d295ae6087d05775fc802198191ac5f400c25b39102a54820b5ed02146d5f19586a8c66126c87bd22b0e9c7857c3426b470768676be8f7b826b1c1dc486c9ee64d79c33372e33ad4880f357196ca95637c80668040022885549d1a9801109a96398f1b8c6247f203ddc4350cf730892b53037b4a13665dbe0a4aa46bcc40862f1e3621f2596ba293466f7499d9954eb6a6251483b350072ce7a4910f008166e62476e383f0151fe706c23999b71dd2471af759b99239ec05996a94b7a3943e37f10dbffa1ba205b2ed836aef025221ca53ac612d41339770d80b03f0220fd1580b786353c9bf15909242494253684c8e2b5a28216501e1b4f1820d6312cac1bc02c122bc0ed71350a05457f4c40a29584e20b70a8739f1e733483b7e7f8ab62b664c9672229980536d747f3199a064ccbd66e7be173641808a93231aca8a7b54dbd0c593ba85df11c54bc2894c6a797bc0557df513734c74f3641a6d2c98fcd8c1ed356c2e199c28088ef495a54fc1019b736f2fb8895eea391c67c895041f97805bfd2354ba1c3dd8e98467d302366a616d280bdb4747fb5a000bc5781bd8c1cf2b563db206e6e512248319d2122f5ee77802d88466a61f5006239c5001975b00dd634377705274629f16a92f13b37049698b12c39bb1c3579d693970736fd72c8d8654943e5868c53a51324abdc57b330ed30145e92ab82c91d975244288833ff3a2d9d92aa1f53d99b11d191c99e06434196318e04087d9aabd03d7ae1cd2887cb2197ec4b09f7699861193d8eb77da9c9e33749e4a0c5bab3bb64adc4436b7a6d84b9463c4887e4642d490052093399b2cb52a73b5904920a601c327e2937ac439fcf3b78ee830b4ecb795376dd263a3cec91c6a6b60e48001a0f739e217b5b3c4ab0a676131514bb62c9fa1801bc80b6c8c7ac70110b4860cbf221543f2aa61e0683bee500f98ba4fa93c2865a28ba4820aecc3a6c7b56081869c701b1bf741152c0ca0a753a211c3562ca26a15395a630a4a92729ed9a3092d23bea5433447139ac0518f75d11af6113b8368cc72891a5de08dd7689b2592256a8ccfa524a2344921a0e887627bcf7965a1875c1ea5c255c36978da7c4f184a1cbaf24a2df142ef80c07750b87269419721c48d8014f4ec8b4ee23d95ab1ed9f8b5ee9943669007d48ac1657454afd466e8765c877a54466171b649188a7c205bc3073791b832b6a752625809919db9258ef1b7a15d2c54c6c02f57fa65751438f4186a8b576d7c561d649a7a60d1928e013df7d69f4dd7035485107a7062bf3ca84a93a5a0197ea00b7522dc769ed45596bc5e712954e1eb37ffd69d63ea2ce5e33df8088545e3a738b864bb61b916d29e45ebb39d8a7a6fb3cb3901b9880ab0547107c9073b19258e4e290156f54ae3d44d19d8abc5fb334ad757c7e24986a26a31d458edd45c69b9b8d87b0622166e66c76afc49a23e1c1abbf357b7328781aa9a054b24aa2645d691639f141981c30a7203623d550c31e2bd4bb95b2e7b518b44512dfa6a5387afd6c7ce162a434a6b9ed937cd79222134310a2420934b357e72e009ea8413a9148698240aef2732836b5659566d21111331fa9bb0b762c948247cba816e313109270eebe826ed722322f9841f33a935209e0df273f4e2237a59b27cf85fb3773998a295a37714ba074d1093b0f096b2eb5133bb273e50e17de75b45300c0c862354344336fd028a4a631da22b285d4435082667ffc21fa01b79625c019e71cd0ad86032fbaa79326630692b9d02be55315543d83c0b84297945406c339699b1093e4b188511aec19b3c9069bdb8799a2e077af4308c401982e96819c7f17f6bca98054688c30a75dacb90ad342acaa9ba227a7f6784100428cda9d6890396cc19cb90a81153bed281cbcb1036113250206b59208d8c75839b76ab8425211961967396c696f05d913598259334c742915dd183f32c5a4e957013868634459f038340aa7761ecb628fbbb435ba642e21c538b907d8710413ac10d7f0a7965b03cb8c36d39336543193d0d768bceb00af79069e7c85b09114e77e6063aca18f27376beb9ac4a0b976ce745fa7972e9fa74d0055ef490cf40e11e6cd785510bc4bc1231d88abbc9b22fc1e2577608580e26635070702fea437f8a13f6fb37343b488c1c0b2560027bda77fc6a97222319b66a86528061f21019aa73674519420bfa26ac5616efd714cd46b7b7751922175a1dcb22831609eb40b4d16107c8438f33e203cdbb85be910b78a99d766499d4541b91567fd8c7a85d983080b91c9254ce3c2a9feddb8c8ba948f0986a90d02681341fac1cd19451956432b83b79d115d32a3d4f86f902f2f6b0c95ad7f4bd49566debcfc9a4f48f6f60ad57731445a7861bb9c371e4ee4407b35df5a730f36db2dca81e3f5f748d23c9d356a2209f6b2d60247b2e45c9808de497f64f124643 +ciphertext: 2c5bdd1856863d324e1ae5352968c7d4d39beb7f06ce366afa1a831eeafeec2bcb99cdaf79355b2eb34dfcbac2705f30a84ceec1c23d2c42418c888c7a76aecf36c2c924576a87fde0c4ee2754e39dd6813abcc06f24790fc34a9b80a6fcf712886f5600e0444e675b8787a9ac8b0871e00d2cdbdc031b95dffc25c3537b5a3718ffc8ee03944e46b30dd986ea6207eafab87fb4bd9890a230b26a777f62bd7bef4264c52ba5a38cbd7bd795ed352777aca856a195784f9d433ffa2549383bd60468a604c069370031f787b743e087bf0c544a1ce2be61f9d19a5f780c9c9d135ca083e6b315c693e214e5408685bcb24a17886751d1e0d5233df90d1cadb41165473b2b9e2778fd88ada34b0ea9ffb1c623090c221da8063569d8c2943a0938598486c6ae9d4e4c7cc2b0a505ff8e3a1fe057dd34419de75381cdb15d4e0ac372c92b2434b6970e5501792e632af78bcd3853a380719b7497f669f5bbc03aa2b04c624abd6f881630bd765283ebcf64d80e1500767d3d28666b407d41628c5aa47649705cd5672eac55fde509601ac6194edbac2a0a7519d01407c435391cd1518f11839a908f6276cd9252a6eb401c61cc1c2c3105736723d47390bdb74847aacb3bf7275c1c4a2383eae54d0bd38dbedba95a3dd32c1023129161164aa29049d3d898448f1bc6a64895e01271924e9d57dc804ba8ff7162f0f55b4a6f9a71fbac28f1b5cf5e269a3ae8dee58e7af29f4105a862db54325dca76509682f8ada8a427a902cb9c98f8a0fb6859142bba23007e9be5ec038b4bdca79bfdc0917b35506235348b7b1018f90e2ad5d5b3530ec9980d059b4dfa136f3dbfce5e3eda2caf6124c5db8f59dd2b505fcbf9b4a5037894a2461145468b52e7fbdeff9b1701ce67a14dec2d9df763f56be36e5d8ab4c5c4f2b37ec7fc8c7923f30799b7a4f472b1f7f8be36c312c4619196407eb2aa526d07a8871e37cf8022f54109e3cf49ed1a8ba013f16998f5823732c28cef54518ccc758c2fb3798ecf5ec0d1ea918588b6a0002f1bc8514e4b71bca70863226978716a0a5c79ade76a939b998f9582312dfc840f226fab3759f2bfa76819205149a6fd938df2cc2da48d44136e69885882f131cebb748307c837d3b24e5707d464403de00d890868a413fcc737b30d96d4a01c51e8494434ad0f4df1757fa07c4e044f3f6170db50c302cfe8664e400d59deaaa2100167009b8f55c0bf1b447bcce8a470375cd54d2a88f103a4558d4ff4dc5be27483d2425eed2fd223529187029846b0426224b895a9dd34197205b8e5be922cedd0102b03b0ae5ce282db67bc6a9c643a27d4790f9ff1ed5cac1380504bf356d08369fa115a49af41ae5425ca9d60da1ea123ca3d86805e539657a49e001ae17b7cc89ca66c71406d46c9318f4fad897f241629a81b7ca44139fd59f187824f98265f227ebb3b40e9673659e56c35a56a298ed40a68e10f5aa94599d2375b47007df883cb56a47610cceb5c99b1f97b1066c6bcfe50899c70bb8f06a030e85c42db7e18a743a2ba87e2b0f81355838e48d604ad884b469463cc4b02cc75a79677978b3e665d03d2a38cbf9f907a0d1f3674b195f46f792a9667b62a0564a6385b962f97ff0f8ecb5c38158bf68c410b00277e07671229a27e81613eb88c60f1540e615f15c2e7e14d134ec83b6d9a8e1f45d190f8dde5bf2c2681d186df1f24dd27b5019c63b2c05e4797a52d792d9ddb2bff9e4991082dccb007a269c64eecba2043c621965668266d0f1f366ce4a8a1c2315c470a5c638f3b45553bc74582e4c1036be0f1db44db4a1fcda54aa4fb8388ce2b59c9bf90abbfd76706d50a354c2ef55403ae1039e79a6298e5d542cff9aab37132fa5f8b60f5376cb976aa58f4962ad445bec45a0ffd828292eb9e92b15d47b650628beb48ceb6777807c0212ca943b6177bb42db90de28dc20d76031d5e69caf18bce7046c562b522eff42ebaefec52d139da4086ea9c8612ca1562d7fc15bfb42b62cbaa507127f0e780a3ceadacd74b2e5f23e96751e8a78539e88ecc7058ff72cd4f4670a8297877d91c8a34fde5ece933c2e5bfb002f6b7edcfe1edae249062a444247d2d24abe422277631a36666b53e8cd3446cf1388297fa61aaf0f9cc86ace67c86e47d1021b965e393b54282eda8eeee5f592b53e39fcb04e1f1fb5910f92f3046 +result: pass +shared_secret: 66624ae1204f311caaaa567dedcbf695f48afa8c869b468142d05da1dccb1d66 + +# Official test vector 67, seed: "074ab1a37ba5a0403d8f68d26fb787bc2c90f5ef88f2a6d286c3e6b168abd85d393d8225618608b8eeb301d26af53bc0" +private_key: a11ccbcf239bdf7642937b7d37c0b33dc0667f06b13d7a166870cb3c696c93e038b314276a135cbbc672f830585a46c31cd09c621bbad1f4c611f3349104857a4b1117f47142d36fa8f73834260fdc337d7427aa0fd90b5646587330cbfa5a56f3f42d211226c6a627085b86cdd73c05838f46692be0d15a7d59b9c2e803940708946293adc5c338a29913c489ee1396de0162588b6449452259a243d422a92dacaf5ed9a88921a37500cb0b1031467c494b3c207acb6d4fb444cafbc9dd364933a3488ee654b7fa866dac82a53acc8c15464a29cacefa9432256934c7790e1b99c85c599e3c5c0ed11310dc2ea6d813b505a6feb4626048bb6ff0ca8a1c418bb4512008a94d863a6f7b359df211f061584f34043aa628ab80c46007257283a6b5052e8967a56e86230d9b58acc6125406064f03b6b25a5f9a706aef5812790566308ca35b19b3c6a7a2450a56b164bdd19278de85a5769186e7c67ea9dcb7e2a8223774ca66290368f67ef6494d2bf5411f7114e7e930b7a99beb84bc69494e7461127fda4d6edc4959c375b6d8b48121312000a6ddf510504a8454600f87523d71071e13a0b676fa681428c31d7cc0d2492bc7c94c7b423092113dbb1b123a3936c0d1846057b2970a37d1caa6e53988bc0565842b143cf2207af23167080257a339795141318562a0141d1f7b59f68169fd0a2d7c959af209971860123e5b30464a740f5214aceb6b322b4cdcbcbc28285aa2746090a8595d4371508735eb5423b94a54f6bb8aa2019b76bb76b25c1dde42b56d13819123be6ed3bc3d26b1dd515121a268d3d3381ad4432713868d7059a06609864671fd9a6a1777803e4b46d9ba6d45050fb2c80f88f450a3b655843872f727a68aaa66c758a8317a3e2aaa55bde0a97dda29a244615ea33469cc5ff82a6c2e0982935c9737943b45c77c3355900ed32785f59fcad14b936c1708baa6b5686b952b07683c1252c99d8a49272b053faf69ac090a8c0e2a0f639544ca196c00975f77667bd54289445cb62367bd79a290683319daf1be3cc89a5d105069e221b875075e7162b12b3203630ebdaca13bd6768cd9ab4872a7ff54ac4baa49c3680e372b9c7e25124f6a9c62c498adfbbe9a90a79fca19fa358367a2b5a24b821866402e43b93dbc3cce1467245a42cae42eb6217cb7470158a24fa225467cf0962b399741c4743ea2222f265a45e7a94ad800734a050635aeba147023349854305c59276565e32dfadb17b3183722b1c44af4c289430f6ab53b416ca239b409fd1584a7891cdb77b742a32e55875d9a20a92f877dde6662a0c0513fbb0875973924c16dd283ad5cbb18dfcc37fbf28914713a04dc05146a7d5399adbe57b60d6003a81a3f9f5559450483d4116dbae0470e15ba3f6323adab47af30252da7bc45e38759ba99877a6421f04232b35cd3b372c0c30ed32c64b0d74fa70c7e6085048c76c2e7e9b1bdc8b033021f7600be3135b785491cfe48932e30a89f34729c012588374fb1307c808228dbf704f9a8c0eb8a98765a8e4c1b0591c212d5aac9f9593a1418afb84bbb931349b1b1bdd8d10bcdb66e7e97299a4b1c23770f8ffc8a08a0391f826b5058240d345fffb4ac4c03483b74626d049f7fa52693b18b5381cec4b13dd1478c5912a33f009f0d533bfe57105755392ee76df7dbab0db56fbd2733487b511804bd63ec767464c10fd22817d79aa7909471b14c1e0445722a240918c2cd829d3c6c4ba81c0b6493b9d0dc3910ba048d515f2e3116142c553fd230d110cd71b449f6216fff68839d83096638348a42a5ecf0986c62bf9305068ceb799ca1b7b8826a8fdaa131d6b872e1afde468aff285aa818c8caf80b9ebb2730f770fd143d81c86819b223d4059ec5a39f18ab5386142464195263f02f9b577105658ddc80a1c7ec2d82bc8c657b00c3d986f8261b039738449c0db616207676b9ffb36a986c3350b698289367ca28cb404ca0c1e436f0e91898941d72e7c1bef2a9aef3305fc4c73d7acf83f5248766a95f9a5b97185ed14c7508d7c8f7ca571a534bf4b843145799233818e0a65e0a7065ae5678411a25d95610dcf91847513bfe14abbd94300f322619fbcb0b03857ef1340de5510156579a52ada7601eeda662b61b16677c2c81f998869a9e3773a7c7942e279471a233a05d77899c2a18f35ac98a3243fa6767f076976529b75b75b070a341dfc95bb85c4bfa1394081141fe1b1b31365e3c2302c8a0296b9769de04024da48c2d7a3e5b29ae58659384fbcb4ba2ace58c4ceca5baa5131bdd465797664276aa44e8331e2f1328aa6910f68a6a73210e575ccbbdc689199559f094bb62380f436a925a7305fdeba6c53a9193069873e724cb1b67fb8820e75c27d175bd5f5b5db020c91eda2439383b579c14da0173e1704a318a03de6691ecbc600097b41a7a9a429ca1a4d8a34dfc6c85e034e8a17629181fe7c993ab018d135a73861405186763b0f70c80d09706c9af971313e47bb917761a0e3a39f7b96702c288254675f6a07771768f3939b7bec979cbbb8bca011124f08347b7bc7c70833197b192fb26589098e48834e8fc8551a1c1fc52a1701323d98c4bbe7779b867b813a5a2a5040d8e8845d4a2b03efbcdbbb3083831b1ffaaa9e21c7a3ad77053793b1f7b7475b021e2c1ae25f194856b1594228e938a29b832930d5bad3667c854366f83b48cd3501768f086b68007ead71b2f046f630196b8237967c940d4727d388800dfebb3b152cf57b33068803c1d55c59fba14e31c323e820265c8826ec3b6018c8f60445a11268da9b44f8dcc512b860212f408d3baac60cc6ca42211d2ca3a41271f745bc46fa70a9a8a3999ca83e8635e7a4843ea3b861194bf00909e4250ad1ddb3006f86daad2b8fa720d969a7d87dc97ae214ab3769eac0261076092250133726265eb7987bd4bc01ec004e71bb8f7b06ab339ac9c0849fcb23c4bf35b11955c52d30fa0eb56dc7cbfac95704e51969ea45ab01c10e59c691dc3908c083263c3565766a34b216f55f8284f219dbc158cff247e2296c86ba69c922161ed753fdc1471834270095a85a5fabb1db91fe203113139526961bb40b41e8f913a36461ece86b37fb809779005c4312727f68923187203d001a378c0073a240190a144962bfaa89b1c384083178a1b44461926a9ed135abae505c93177f263996de9780fc573619b63f741091ed57657404644194a25b6cd1e5aab45e9021d9a8839546a9913752621bd79730685397d93ec49d86910c46a28142928a054599ba18cc3964cc4db8bb7a87543e8a53fa23a95bb5b6713478f4b0b5ca6248018a729469a3794a8ed04a315f3783e667c0cd2ac80c68a40c35d64c90e5e8a3135ca15cfea69d4a1a2e9b562dac51409c6485e026001eb1196a487606404b6519974b386abfc9cf4a0305aab4a627b6c22a994dfe46035447f0cc09d1bac0397a68fd647b0b13630d1439e63fc8fca2b01cbe66bfdb4315230b06a9797b34a57a5db208061195813073c7a10ac95b8755aa79b2033bf90386115066f177ea1421ab0267672b91830a26c20b4a8ab9011668cc46b49a2d824067102c95dc842b4f423feabbd774b4a4be351bcd8cf2c486ca70a5eb502ab5ffb8d77c2bf00fb7887fb960c089210d673679a0c71428b5ae348ff293602833b6927add5b18f22acc4ce01517c65c848680d59931175954ace9689fb6881ce17073e113cbcd53547bacb3946067a1a46cf6b4969065c98c17304d53ab5804501711c153a1b13d7cb442221ee311466469ba1225cbb312708c7b5e0055e3b476264b2244fe9590a557f088c9d4fb47a3d598a998a1b5f821d19909220a229ff020bc11143cdfaaa90e00b71d6c8b7622f24584508ab4d036792135b750eb9ae091b4baa96a27dfb1aeaf605122060e5268bc4e9c08d1bbcd451a22e44a2d6201c6de52baf940f14956aac311b5c3782e64377c645b35d210e1ae043ad6142bf6c05aab07d3915500b67989709b7477432b947239a9c7abbe747b2238ade292448836b87938e804a4029f24182941cae500d85aa7ab9556ca98c7808d90558e771d8709446bb1069541dec34b69834c857215822f773871c4401da04c70503cee82491b07e8597480b6bae6245084a4b92f9b015a158295f237a6376118868486d9c1a8389baed937b392ab840d4bf67e31df2c073a4a8c691896b6d6b623b95670cf404dd499773a54210975d1ea72667439e0fd8c112f33470789f2899a64217400e4b51fc501362ec98a45620ff6ba180a211ce5c154bb62a1904cc13a64fb6f445b48ef88ccad56919a0deed94a2ab2d4b6442a71c288753f1dc41ef5389e394976ac9cb9123b99fcd75201ada0fd5daf1a51f1d069822d795f8e736abb8d1fcd6aba5068af837be962f439f233593d193ce5e08f7d66efb3389885927b89d2523 +ciphertext: 80b2121c5ffe5e10fbe5244fb9d79f6c1a5cc82a850a9a347e439f9e8d95b827f59c74bd2e92338b7edb992e8e1bae6872f51b0fda5e14cfcae8e789428753e97f4ade4213b9f1d88d932bd829ac8fc47952f455ec61a75f7c42334eb17bfe2e1991b3a97e3da5f3756f538e36845d7da303d1c41254c1ee9655d0eeb9f93036fa50495bb1dba1ffd7f879c095ca6c62d9a7e28a19538c1fdda0abee14156a298d8473dfd64d90813e4e760d1dccd97475719c15a973aec286a46f9c4176cf816d1495a031bd971ac9ab58591e6f1039c73835fb2cc82ea9f48f8aaac3e5efd3062d3dd1a349eaba7b792d1ae4ffe41c11a2dda1b1e66d40c38e4d960b963ec220b16b7c3e2cda012ebf1016f616c78b64098592e061b533c09e4437f41e2c9800641cb74704ba141bf656da410cb886e9a4344e3e0d7c442bc810322762d052a818677ee4003e0780fbbefb32b9d791f782485bbe0b25d0cdcdade1ca5f046f5778402fe555575d3ca829712e1d264db9ba1986460043e654ff6683a1f59676922c008dfe4903408f80f6e3604f50716f83b9b7ccd711d03a0167690eb705f8f79ea3a56ebbb0099c71e475599f490beef33da232f35ea5e7509c25c76040637d6a50110e8ece957371c4600d382372b89db1427c97d8af57c5ab9b1f2ddfd1ce7c6fdef2083996da61e00676a79cd0db2a6436939c33086f752bcb0b343551f6a29c258053b7e17ce1b09f54ec15cac7333dfda71e9b4fbcf740107e76ebd8d5207da82fa7b41d8bdc2d9a284dfb8e4c2032e7913d5703743c436535f3bd0df97f961587dce17a2403bb6bc3bac6a97c45a0e32573c81e919e0117457af4d693eaf239f0958cd9a2d44640ebe107ca0f34a6eb7703153c07b5568c143d211e9d31f1665fecae3c51269e472160a89c48af0a74123a9f743c1c0bc964bb3787646d307b1508c1cc31eb2ba4f6271c5522e81cc3442315945a94f89ed18aa5c3bbe2c552d55429cae27b946664a33d35085dcadecb1484a3e25e5bb409c8a238cd634bb03c80f66c7f539eb41513e06d2c7da5418d9ead72477117e7ef732734d6f90424a5d98a444ae95d3b09237b022a25d09b9de4c47a9a1b1ec5474a19a9e4f53a9f0c330d71651f8071f39b0e806a1dc1646ce155a0b4708076238f9e269802f707f0f5071b1a3f97bd63c9c89501612960a16fb6a2b74c183ad073c6bd59123e72608eafb1423fad10df3d3c2108de8f38cbd283c220288e34019bc96330745070a65410c523e5423eca7fe43c09edf732ec3ab8439782ff69bd27771f4e88a4c9a6447df87f222b3af22975189fe9e0741626b0b9ba7a9e81db8a4f887964fd8cd94e90d6806648140a39f2dbd76169c3fcc743ad776b50f89e9fc4a6ba71698fc35aaae3c9eb0d98de8e29efa0f4d07b59451b62600af56dd95a8e5b461e57ef5ee0ea3b32b5d8208b9c7c7e68938d86fb9e2500dfbfbec2b5f309512d4f1d145751f5ed00b73f38e9980056e6b8a6b02d4eed3b6158a61b6505086d5b1900e9b168e9dab5bcfb63a0018facd763fa6f53de39adddd9cd1a6069f0ea28ddd9d7ff2f37e6ee73d31cb7526c1435ec97eb6671f7e7908871a6570a5a8641c93cb774d87b18d435cf3eeaff0155c309286a5ef54b2a068029911820896facf98d1fee9d6880db48a3158be42f3243ea88af5df7ae3b9cfb2bde9bd6430006c8685ab59579104cd32ef74f6a57341b7bfd9bd89d4b697c496859e307a830e225c67ab66817386f617e4672f7a91039a7dce039ec5badf05d23c4f9f64744744cdd3c03832bbc99f7c19e60acabcfef41258cacd781f5979017745b10a10ba824606a10e2648ac4f97ae7af9fffb80e3801106ce9e1b264fa86e3b3294420564a65b5e02fb4a79f078a4fe4903c26cf6c9902999cd9b3a3b0667172a30d205b94998356d4ddced92c0bd2ac68afa9984c271f6446d66fc9526f064b90e9645b5b8ecfffe179e492ade63b51fb77f7d0b84ef059f077f135761c7f9c07b0a4f429812593dbb16155489a1a55be6eedd541dad3003f9e853aed5625c6124d345e71fa7330868fe85debb7a0354e81a6fd5417ffc120a9a4c757ec424b96fc6729cbaa654c89a479dd9e453c48cc16e5321441a9378dd5164ea34a34b0ba92faca01903083c0b21c46670bf25de670056792534bd0c9c7f10141f6425c4af049 +result: pass +shared_secret: 187e5b0a3b6f881c8c16f777d015d1e9e80917e49f39e4a5362539b7870bce77 + +# Official test vector 68, seed: "cc0c86cc0abf86fa21899be1953913c00e7c46e6b5f730c4e88b3c034012763981d7f14459d3081638080378348856ea" +private_key: 160b1e369b620e7891965a391bb99d9933bddd1b407a647daba289f0f16509f41eb62576b3ccb404744d2b699891300b119cb1bcbb97c090ab4091c1d15454cdfb2e0e181eb677797041b47069680a929f85da252b34b571467b564ba72256867aba61d8b14561b7a6c6cc0bd73227a3f5c840d264ca45cbb4d6c529329f011b2235b83fb8158a3966643c5664e4a4028b784aa3f84c2d21a6abcc5f0bbb5160326963929fb3296b3c65502a34c409ca9ce0fac53661a77a6ab85339364f0a999d21147958b01276c31454c14410989186496a5aa529223cc1d460a729a5d5170fbcd3c742b267d5c6aad2047154630cb8492556372e927c0ff48015b4121966c742730c223ba3ac0d9553e8f3043c84a19cc40657167a75603a2e467698d117e0e96beb199ebef57ad25b91be9bbbc31499999068d4f56315c05cf69727f6c1b09038ce4e3ba307fcce081669c7f666934a9feef44653466915360c9160a573781b0be59f23d817922bb9453802518b52250b5bfb1631f16327ea30552cd26725d94717e098e9b40559d12db67680f52aa19ce11ef22641d214b1d14689252027e68bae8f3a0034189c2452a89a8011b0f228c2f4c6c575ae8ab49d9b951b7f534c5c0c02b94c2eb1c120fbc6cab391ac02d71b3a61aedc65211314129ce950f4e82530f297f1d6b8b9fb6f0c423ddfa842f5f6667109caf5ac5db25a26ff46a771bb1731b855e909604dc4426d1598ba26b94fab7188ca788c1b473bb00f74232d7772c196e3be42c20ad9991b1460661c85a90285952a5565b9290d50fc2821a84eb80680c4d204981851882565e20455e7f70015289032d1792ee5475c499c8ba701bc094cde789b7647536ceb7471db9e4fa51b1b0a97d2d94f73024e83077dab62acfa03289197cd5d802901e34230d47cd5b469d202ad64e98f612cc286a267d17596bca1634094ca33e09b9fabb5ca170920804a3f58233ed2ca62362cdba424114275c1ea0df1183c33303efa559bca706fc77b164670058708b5a97c6f18acbabc011d8fb230ed56265c5c013bda6defd92e76c0ab04fb8b1e0758073325c8c60465678537bb5ff47923b39a800cf39eb5686b653c9423594fd7290745d566abe2735dfb4e9f7454eecc53b6fb11bd407d37e49a3155cc3561cfbe8250dc207d3f942fcaf3cfe5223103d2475d0aca6809ccce5b8d70c7aebd053f4c94bd2b66c9e1eb68b7b6989f6babff582f85d08b3926c0fef7ad5ee61cff982b690689996412504284e65bbe77123180f78efbc01c41a8262ee26765d39e94400a1a27ce4b147ef5e25d314c69aa86353f9a3933b73ea131bd7ef12979b863ba331f1412386f87336a90718da6c9265249cde518c39ba4e6ab83ab53c2d2c846f43041c4855d93099939d0bbf88722d873bdcf5bbd73519d8ef50255c7a18cfb04187147ec706fce576ce8f13928530b43262cae618f09d434fbf29fb5380add29c3a7992613733fa730a17e059c67297598f44fe28b4c4fb04ff17bcc7f3c8e516b557bda28fbf82971e8134e3082bd7497995bb2e09cb398254a12e0bdfab5a1f3234853c3067903a64ac22e528963eecbcedc58149deaae0965185b1c2588b40668103719152016e833a95184da4b10958c78b2d4ae2ca07466700f62fc687fca4779b500aa904a0d95c93464717b3c21e58b9e4c133d793ca5660348ab0198a81937a8e000225b8728477922813b9f79325f788bd8020f052801fc079f3d604b3ec830d29407aa9c2168a122434b751085804207b29062b343fb90426319998a98401232f3d0ca1b475d15650e7e9a42f498a7995c4bdcb893d09531832a4fd12c8874e4c3c65005d6c27a102725a8113d2ec9663a40255fd4cab9328b2220737f13aacb4646b392811eb3ca72307f89919525107be84a5ccedc1bb9d313f7b99d619cbafeecab88a01ba78c688166a6710b12a4724b2c661351574d7b1ba6b9265948d5a572b2c74982bb6f8546b8684cfb6916c9c1093ba1c205f92afe80ceedb043a04b67468335d28a8eb2406c72690700e724d773b40f4875c30b056e904ab688888195655d020ddaac5d1b20032a9b65501b51ba036ba2d48e5fd75b5c2a4d8b65766bb7a341247ee8121961e40cd192c6c126a3fe92488d467212b3141c2441f96a053ec568c7d2b7e1229fdb620d905119a05690cbc9564bc9cad3a66e05f641302a38ada62e07380ba315acb5a3af9f02aba7811726a3ac94723d6e66428ec8576718c4da712846d450cb428571b1786267487b353b37d984cadc2f51aa6fa58c48b011360c5b1989e104b99671ce2985a174aebf31cb5f803d29d93133d2ac1c9851031b21e8da4021b44b4064ad7415786022bdb27a187495908ddb6109489ca2a67dea269493986565e33941c1012e5504f4e5abe662235bca3a144c149d970ef3815079e2bbfc26066a7c8dc5591871e83731139951a262f9f7a2630c0e0fe635cff95b792a6b9d490f0ed14b125b652de35cff994ef341a15bf57978211ca4149fc389c60f915edc45610b9c5883080e96d77267268a37b4338ccca90490cac44a61f2795f943a25147a8943dc545c0805e5d39b70139bef006df10c695cab9cdde3b7c3a2afe823c709936d7c3818584abce96950c06b248b858859bc2231622426078e480074bfb011baa6b11336206425211c71b48d134b7b0b1c960c9429829ac5191f8f8aac1ed70bcfa4342a362c68a35591db506f2b69bff31033f5ca4654421f48afdd736e25d810add97f750530c443618e674a6691229c3a17f3b19e9d3740ae4a6aa6b77254b27374b246381483e52624a473035fda0eac427cf0f7244b3b8fcf4c835df23cc5b729bcb1285ac49529c1241977741ab15c2984343f5139e1219d65992ff75637fa3a486232c1069cb49269305057080b535d4a624bdbb78ac18407fa8b48caec62459b80cdac45013403adf41038fc0b97fbb3b9450e9953718cd82b4e951b3628c7c1fa39f5629dbd074548d156437253ffd92f7de9b292b00d1812cad1ea7c26a295e373bf80fa6f173b68e7149ec6a454db833d00fc462472ac51a208341a39fa8ba8f7c8243987cafc65a48eb30e729a033cd8929a746ab6eaaba19388e9246ff28355bcec0249fab0e00b722b91bdee0b8fd80377509937f201880239ce9c9251a9d3b48d455884e98acd948f0aea095155b360620f29a279116ba08a5b5ccd6c86e0e57f4b33c5787c38b7f0b924d71d7c06c58f932d7c68422085c8e365c6787b8069d21f0fa5a414d44267b40a5f629b6cf82de5588b7e828868c5b6ab9438af030983c7c37c1032be605936002558e161ba0bb2b1b4c6b1fb5fec029ec389a375d563dde64eaf7b95e4a05e2cb7b1a4809e4e98893fbb2d79aacf0e7a0718a322ed8296323681ea398981512d04f56ad2bc10667187b2ecae2e9aa5e2922fdff22eb9651c37c75f6ca87aed6213e0048e36984e2b9b6936d61318da6b7db7c8b1538754b997dd325052c21d22328f03d5774e711a51ac6d3c333f0a529c1568840bc92ad42603b4a361197b36681722d45b497cd94f73d90fd48570b445c4b166a02c5a3c5928bff91545053166f0fca5f7b2229232a301484ddb25854d522f546c477f43072814668a734786b6810770b227487a21abaf17e79dfc365c3843363ec53af3686cce7429104740a327ce441bb8e3736af22448016b8e69784d3a2c92e0f1787e818139e19e95e2a9db2b62164221d9b77ab2ca91dc221ba5533322aa772459c6c5763f24a07c5b715197a20c7357cdbcc18840aa7af18c4684e275cb3220010386095259c4fa71f94662133622a2945d8cc6572b2311a7fc0e1091ce19d8c5d7913acc490e6c1751d5aa3e5c7218ebcaba43a8c0f6d78897c15a20a87a891bc2ca94779525499a2958a60b4878db537d9b148c01b7c2a642fedc0624e594cc318a0fcb52960526af556198fa028604a9f0181be16399edb84b38405e33b43c13d83e54483418467a57f8a796b4032d37a744fa6200b0aae04899c6865a66923eb173906b26c33231a90044c9c4d5215117ca1d50cbae1120471c0462eb1247f07a2197680856428ba494dc721bdb3760c1a97d2e59735bea6064650f55212117659380052550fa311599923dec097cb28d601cc4a117269822a2bb589ad165a8587893bec2b0e22030dd8736d387673a67151b249c49e7abf96960f5394fb255be8cd9927152211613c5242a45e87028745626de709542338e131678b871955582014f1074e2f8be14a634ae5c40dad64b78352febcb21bd987d7632c16e03261c4771bed2bac280f77da45501c2ef4d97f2faf650309211985bbee4c3a85865a7ea65e4729daac39a47c305ad3084af028e66f759e0e22469d0386c10bfc23a0f4dff8e56f68440836a072412a30d851ace2c7c6f02d60e7a8420001a63e6c6 +ciphertext: 7b73df5d74dc99937afc0d6f6a0ef62e563a69bbcea3a3fa5ef58518bd06c122995eb5c937494315af7b67c3630f29fecc06a73c54b951e159efe8d72118352879a6127f2a640c4ada847db224771e3cc45bb9516bc72a09102cd800ff110e6eb37e14f7a15a51d9362bb543dc8e783ed874198a312f9894ea60d707d0e9ad04727471f40a9c19bc4b9197d48d6663feb7b2cd9eed42eef4490961e6d90aef914bd5f48b449f4519659e12c4407ab61544da3d063271e4b1674e3f145aec8a9ccae7b458b05c3d53e0f99e8f138a3387459df53289cdf5dadaa3a3dd2ff6f190648fc43bbcc1fad38a6eaa013b7b09ad69d0c73188522ba07ed82e8a34ca49a04d056f484155e2850c978f8a5e4f026ffa7aaf387d1c14a489acdff0bf348c1116fab4411f2b0af7642f88e64778644411d218c31b55503bb9f3645ce3f6b213624a3a8e646e157edfdc2e30a764f71b8c23fd95330805d4b2ac13691dfe436fa58c3d3bd05765f2b501b9ca82d50c58ecaa1f0ef930b20919eb1b00ee2eed99ef61c85d22cf2f72324e50655efbad70a87a8c8208239da0151406f93d39ecf642f0ac388f6e7638642803883f8acbae1f54ce221675a4efc9f3a35df05488fb1def243bad65057646a5e5827fdcac36bae4ca16f66fd4a3130dfc358a8d07468a6b9843b56a02d9af6befc9fd0ce94f3db71769bfe19a3a0066519f967fa786bd397b33d3e930d464ad4a1034cee019fb86bc268e91c9d8c97bacf53940d906bd641b2b67e0de90452052bd0390c45a565fddd931deb1723edc2e1a486e32cc51a8442e8c027892c1e7f6fe6eb9757a1aad7daeee6a7cb834258d2f4453e367db1a4fc9d1eae40a24b97e8b29edf5aafa7ba86f4cf8ab25dbc32d8287cadf895ca3ee539cfecc09ca4cd8116cb6c0cfb62a6d9693e6c2bcde497129213bf13efc82b0ea9aff794e18409bfe09b7487083cef1e33a59054414dbc4e72d264f390fc945d3a54e926763dc866bc92b77a6fdd82a285e69c63cf4f634b6d4f97d088d3f7a8e53cdd8b8bdf21acdc23adae7feb36b3f14a638fa5b4c1289718172d11b5e8400549929fbf1dcd7c5d413111c4dc4857110a5e051d7c6250e2036b49583322e99edf2d9276fc4447a9581923a086a59e4ef59aef1d480117ab5fa76330797192ef0f281f3c0a80d1218ad485d68d5d36724418ca7d50a6c4936b692790884bebc9e1531af6e3eb74dadf702b31d54ee524bf50407fe425dd05fda0a4e9fb2ce40ecdc326688e5c77de894377868bd4c2e2139b474e37f2c81d5cb114aa7a011f4245c6db4ce78c723f24969c0dcfb8994185663fb1d2e48e337706a2194ea212e0e1ba32c8dffefcb10b4658167dfa163d4ed8eba694c7491d4640dc7dacdf23de8f7c7338616bd684f1e514308a1812e04e9568e857f3204170e67f105f0abf43459e9d07c1a0360031b7fdd3cf03e75a358453154e29f211f445b202de15e190801a1cd4a56e7f3c52d26423d1d92fbcb486d6580d8d2ebd0a3065d2b5c343247384804009768aae6be410ba31d0189c9490f738756eb4281b205ab8bb376a53b72c425492b71ef5bc181d79b540cbc3c6337e4b8705c3063e1ea4d326f14c22b4ac67e8f00d11702d02ce1f30045453af30efc07f53c13de8d1cc0197770e094bf8baaa637fdc544850b870d1bcedd4c56b88fd8e1dae9197a14665eaeb97e11025a21fd21e6c40ee5bfb3f6da5f6acd5b2b2e47e78fdd7c777a1538647a96896ca51c0f1dfe06d3e5f293ee25a289291b664736160d9d925f5d45073f4e6bdb39f891d07589d129fb7b6c77113aa3d3161d45f6bdbefdf494a8be0e03c4ab518ea334941ca62d4babe3f5c79c814c1abde6366154f1e82ddaae9dc970daf395bfb416f6b8e33b0a85d131ec429070737b1936121059cad2644c5d759ee1d1b646d53993d7381b84af391145e86084b1bda89b0c71171b8ebb3f2ceda08782f8a2dcca9176e651dc182f1d888cc196eb45b2e664d88a3562df9a0ebc24826de5b7bf674139c961af36a05aa71baf645aa353d439ddc81f4d18504f711a1be110c3ec4f134ee17cfeb3d60f85987c37e966f887cbb3dcb914070e1424e9232920cfcd48360c217416d9680a9e3c6f1009302fbdd7f49e12451da74794e80c623c5467b6625c474646e2c13d1539cd8d156f4852aa6b60f027922e3e +result: pass +shared_secret: 3c4902f19d2eed8fb7470fabe5171d9f4530208c50521e6df3e8c568f8a24f57 + +# Official test vector 69, seed: "6d5a7cc326ecf3983c4e7683f45263a37f692f3bcd2d920e1fd9584350119e74f9a3f905f70d3e20318c1413de2a0dea" +private_key: 41a174fe5ac24562ad78e74c8e65930e7cbaca489509d26ebd09a742548fd3b90406b2b8a218bdbbe4a5222c13dbe576d37c0d4dc20f3e416dba4b784491ab7a534d28b90c7121589dbc55bb214af6475853b74a4c048885a6ceb5184535a5cffe6c3a1c43c305fac42ca17ca7f64a24700c0048447154cf15d25636873d41c0b588190b2d0178f12940f5eabec85a59f90179076abfc3e734973b4074c721a3d41ab31465392841ec558580711aafa93bc1382efa153f5bac2fab8c17eb7872e9d3b7b6fa94c2ea20d964388bd5144c237771e1c6a7f991d37a55975078dddbb76499b6b87c974bab79ec5513d839cec1926ac9c5a7e45861e0a226e6f2b00a95bd52a17eeed93f573c19724c593ed7749e542287a62ae01a4021737242424694637649771345408d2800b5a03872cf6c70ce848b8ca2c57f93543bf7a61434a48f536338051bdcb092dea6690ff3b6ea892612ab5472c0cb9e7987c3756548937e47a2cfed69ad4444cf35242bbd1b7d65ec028f2116507ba09ca114e4cab4bcb736ec5109822b0a590270d3268de357bebf98317090185db82b6c28cd4d7838d8a2368c9a315661b3554b43a8cb4cf376bd771664b5ea2c50eb929eb768bb685812ec4853a33a49519ab98c1ff8d4cf37b2bf5b97c2e0921a0d769abe68c7e19a87b50a6a56228f4fa4915b2192d1e4225a58b3d2f0ca23a05dec8bb5ff613e636c95fbbccbc5f86d49e447d0124631f52fe575652f782cc5e3a376bc868695868d17b254c797d8cbc543343804c7b5bfa731df211f48b20d0930b19485531c678328ac647c2260f6062af02cc2c1778833a62b4c40bbc095b285e282b641b75c5cbafe41a0ebf88b3cf890b13b5b8b032177754763454ef79403b6922cb012013ad810cd6875759693b298a57d107b8b568778e6c493239719c73249545ccd0520805ace114c0b7b936314a6af1f37bd3876322ad855877448e5ba7162cb7c7457c8d2a47d128b1bc8603a60d06b044c7611239ea90c0cadc09a4e8c4cb0ab386ddb2ac14c2741bb7ccf6c0387e6966ec824691855cf748b680134535397ec427df2149f27fb14fd814d47031dacc858c52a5b435b6d9b8c8f76a40ec0486d2c670b5e4878adf7adeaa9b752b0350775ce1b9b590a9695c3c05c2ee0a6f2064a363664dff41668c3bfac172e1ba87e3d3845d1119a36f52c394cc328d8ab23914609c058b8f72b4f8851048868216a9b13c7cc55177ce559553ad28ebdf2c927aca49ca90142e2caef59c9d457387d81c55729177c665de8d2ae21453f91b7663b2b1f4304bbe02499f690b95ae18976a00e3151c570c479a6d512afecbe34a2a2f2b7cfcc03290a052f00a093956091c22729e57044dc066f892799b9e263dd957296865e09a2c15e300c4cd1b1d05067fa1483c6e765c551425efc7d5b15517bd911178a2b9692a1fae74ef4cb2785e561a51c498ffcc20f039e0ce74dc62c3a56303774449661f171487cc2cacc071bc3b2cc54bee99332d655ab4e6b8b9a8351397a398c484ae22a29a4187c6f5690bc741c23e9c2af0916f8f4becd630d47010402850f3111930cdaa5fea74e3748492e6b2c589ab4af5a011bbc8ccf878bba2708720408cc56bd83859e62ab95dad5c17da8301010933ec27d18f02318fcaa9fb5336bfb608cba4d0b59cbde5c8317d09443f7aa641886201b62cc3b233903ba98cca9a40ab8345c1dd886bfdd87cf6ee2c50af15bb0539ac2673d0ef08e58bb34e3a83198093380f11035e38a0cf532cd47a45ed7cb95bb9420aa62f779345b6c851f9b09de8c79ee1a807160763b9a0b26e74ebb32aa2f429740319285161585a7bfb6f7294669cce50a044ad055d2f747070aa6cdc5195b221dcef05c43456dd2bc1c1784b397444e6eb397f35b5e4cb8aa04a7207633ac1526bdcb9591494554d03557ce60820325008b42acad262f8a062e1ad11716001d99e8b3a1caad0226878099947a2511f62a333b1b97f5b1654a35c73f0c69fd92531d32a33cb50be57041ae870e15019a0f30c35ecc8f33ea39ae209d7f65c5937b5be1a82192c8c335f35b36d6cbedfc953eb140e191c819a0ca16fa8775d67192161a3eb1a508b0695d61971cb9b4ca61ccb459b8fc3748d7c9596a93a88b535a5cd35cd8f09ec13054176c506d02a7258a84eb685d14c3352f0b0051757c30d4184ab6a37bb6058c4451e89106ad2c259bc6791de49ed9dc0bf62bab1201429035c8716b864552a26b0549b1832a2bb01cc8f8cb55630618a525f885cb6fb407f042610681428031399e5666d56a9656e1a530460ab4178c3e957d22244b1366750da084f572399a33bb452c7c73f3cbe9a7028cf3849b475606ea2c96958dbef17aa08b3f15c146edb65de9379f62c11226f9b4b85802694614eb229c8ed44198542685610f53885f5bbabdd95c5597f89d825b0f441b21aa476ba4970be900a2f40cb742402c2093803f27ca37d06347615131b81fe6ac6ac9249459c92d92133870111aa5176c6bb828a4198c865a1730a84961f3914379bbfbeb46411c1705bc86f8a38a5f817f1b4c34e99784773051764b3f55d38571e98d744043287a19dddba7d4eac3f0b98173d09f0cd10b22a0bc0417a056c66064c906b7559ab134b6c47baa7932540070811d3ab8f5f265822873b4c78af45514ffdb6d03d79c24a88531d4ae7230486977b612cb05b906ce19337ca1f0455718569e80c2c2c795b7a156e60c5c65fa19fdfb5e4fd96727947fd66abd94774a5bc45fda822146a12b67534ad93aabae123af9cba2b2a376608cc6335aaa99f759dc964aedd80e432c6f417a1a65c63f639b5312c35038faa9c45051ba31c66912538fb51a85189d846b799d8c2fedc439ec8685b547376be49a83fb60281accd733001d729e4156badffb3b7dd8cb40411ee7a3970a168357a89dcb75535ce341b5b47403308bd87bba01f5cef30634c9d27d56da4d4373234790acbfb5051ca2a8519a42e610269b4b32c64770a5db4caa1ca6670c432bd74745fbba2f22377c729446954a6e067454639c3771aeb626871e3558a0f141a37c2732b13b13532cd16462f7822ba2869a0b20717e3675a328625da796e12c4403d380cdb54930db78493994c0793fd67b0a91140758fb78d229051e696c8707cf5a1c40ef511123b7c6de51ba4b792eda810762cc114f716c66a79dd4f5b0865a1a2a1144da80c4106b72aabb0a8f8036bde19b204992dc600956ab076ccab601f4250ac4b2cef77c38d6b6ef8907feec307ab29502b269dbc063e337ad43958d893a36318c6c052549bd907313c2251744ad02c30f78d0b394635508951856d1160706cb042275ba20a4bb6a734f9856aeba164af669f43c5016f1305e8084389581bc146168c0914d1a65ae5188e19082d585af435c183df28179c6b2278491dde450e7b1bf64075e0a9a8301454b5e111e39b0cced002680e173c5db96de082c3c399e398210c974b6f47449dc9326c1a7a79f893f454834e6ec1bcf0a860d962a4e05a1f51825981b18dc4ab661abcc98d4313cb40baa402307895460139c75b6aa69e27c5e69273141487b849a42996a55788b3b42018da0ab1c315d10308f05c54176d727a04b656ce6859f69471a186a4ff6b17b877070924758c83dc681292bfc7618f2b75413c79eb9b945d1b2aef95a47cb21cc8982f405739c9064975b5ab875ae5ddac05a65a43cec4ed80acfeb15aae898b995e649f32b98613c77fb926879ec940bacbca0696cf6c6749604a1a59979a623477be871a2278d22134a95ecc1b116c48340c6c6981adbe742ede1426bb65b942302162b8164352f918679d53c06beab47f07c8a37aab0a7449d45e01cfdf9422a783e06f645353cb56b8c57e28840e074629bd58b5646cf1c96003181b915a71caa00a35fb4533df22b2367c9bef95ecc85359a236e23a425f9c975ef842ee20228c66673f1ea3be278b0fd43ad4c004655532654598f34a257bc7c81dc0999266c8c2f40a4d9364f602bac27145b5be7c4fb0759288761ccc586b9039d6ee57858a21a05676edb52c937f11c35fc091d3baefccc15bb953bf5c50b95b449b8db449810680fcc53169bc8403bc70a5b2e3dea7af89aa0fd662255197360b8c7325545b7f45f2dfcce05d939ee5556f5c63cef52cd68e8399ec25726a316269374eb94bc3884011c89890e828b5c726d149cc3446b8a12d76c35545eecc7aaaff17030a0cf9c993e53a88ca000116c2b206f0187f725acc696112b5c44976a22ab617a0c42a64d03b8ce88b7a8aa7cdba28a197a5d3bdc64cf089f922345dae5a7c6bd86d17444f21dd9b1a5c82b9fc906c4ad49e021cee8b1f3fe43508e7bb3b567d02568cc93c39c3cc347e2dae6e0144714d80cb28f7e7a15a005f92400ce33db073d49b53871594a88fc45e0f94207b5f0f2dc +ciphertext: 1db1afa16d8fb4e47ce58533e1022da2bc47db14d7c6e7afc7865fde201719c50f722cd79c2b0da234e075a3211009efb905d45fed0a83548746a9ee3159052015761baf021f52f9f9aa19f495db0dbedc911d357130420a5ea04516edc2ab8406be562181944b816458e815e0958653fecedd6a19193098c301a74352fc2de472ba7be44a513807096f7a0c42be557bf3f831d628ce208f33d5c797da2166c95c88ddeb42c7d78ecc54f0088f9e76f1721a4d7d088dc3b5bfdf8e39febfaa0e32c4fd4215c4816731bb515a96e6498846fdb6d58470a0148196ee81d3b7c8fe01f6b0ed7a20fc3f0910eae4656ac421448aa488a52c06b1385d4d1d73389e724d05720bf3cf5c7b863a0791b864b8d978f5fce0403263d73889aa0aa476d8a760d31494ee6a69bfec705b30a5bdbfa3dd74cce40c0ecaab83db1eb7172ae07689db456c33902175940c66c18ea93eb7ba50948cc27ec47100fd60404302d607b6d1a9374ffcd6cc8cd449455baf194cc71888463ea98ab3aa855546696c4d0b38c3058e97018cb27a7269d95c3835742de93d05fff40596a60c1408018d8d59d41c8295260ce51b09ed49ac79ba2115582309ffbe504e4ad56fcdedd57e544a0ba8e09638fc8da99948ea71d6cc75e2f03ff766b03c768c50cba64d8a3bd961161fa3466d5cefac84e7fd9157fa37a0920fc411bcaf0ff85eff2542556d02945b71198ec612908c02b14f9fa4905e1270dc709fec98841a5b3cb0a5b0108e2fcc0ee90403429110440f06ca40da8869ea802145f1cc2588b8d7f2cad465c3384ddaf4e0b7ceafab3b30e1d70d9eb812902562b360f33cf80546e1105f2bdd6496986324eff2c11f2e1ea54c66d1a082a8c19f705df7ddbe69f9cfa95431a5706850fd9a5a395571839ed73e2c19afadb4deef4dcbca3a75a63c83b22dc81466b09e4a4ac71c59bd69a6123f1a082e536bf1accc1afa6655e4cfe66e9a990e1a5b96a52b315fc08398b9958dd5965d5dfb4abafb3c63a7ce553c372d5c97e59aca1a6fe330db286ad684fe42c4a56d5729cd6b68b6b60bc924588f3cd09d95dd504773f61ebef4964199d183cfc04dd580132e1620b7a412a6e210074aaabc788381e98a9ff5f662bcf9214903681e255173c8db36a16388186456142fb49010978a984216a1d0f9afbe810cf811b01ab3784acf9ed2cb47452613ec2b154875de5af387c0ba3ccb0d725a0ccf2ef470f670d96bce6a5154a3cb7e78d786eb8a01bf066dc2f98c190273db023035ba3fa9217d366a6c5b421920e61ea44781715237b561f08471a2b98b58c4f0f45e30211a132006d089417f5272fd571de7520ce852e76f367ed4262e93b26e905ad8c21b92017dbf2bafa11b1a5fe15ed1162ab3392c23a930883ab50273aefea408dda64580f3665127f08b468bfbbcf702a0724b85f4a3242c13a16c15917f57a50fb63e0864975c0b10bd6e53e26cbd089fa7ad92172c2c03abc151c7a62a342963debf3ff960ba2beb2ca796135f3c54ab8441e823eb884360ea6ca9f81977b86be07feae2afc34c422c8c0aa76229d1ba7dea4ffae74149f9af18efe2cec31618abce5cb9ecba8243c7c116952d2439a3766f83ece57cb8f069fd5523b4bff071e844b7c3e0dad013dafb16575498d86663b2c8d8adb379eaf259c1c39953ed4b6b3a13e7e92db9a57a330e0628633040fbf324c1a86aa1e6bc9ffcc2a1b76e42fd71ca475997d16d385f02a860a001afac2e1ecb6d932a80e157704d6df6f3b3e9774132f9649ef81e4970e69b5bbfe8519d1afe7fdd03dd5d59646d88c3674221d1d2959b5806bde1339e88ecd181411b6776e1c2a8fc4055843232c9fbba7f26de53c163c6438e31ca5184e075510774b933f111f74a7931f95cda817c2c4575065d109263d24e9ab56941ca9ef136143e7f46f33b35c486efb2ef8d915544b8dd83b3a5dce577fa578fc90d7d01b6bd50f1a49bd245ebc3f062590be903b7a421610539cb53c8154e09eb4e26b6490f31efa406657ae5f37452d822acdea9040db94a1e20adc2f2e6ef68ba390cedca1d3df89556c6f4460528e04ed2cb4436312c50a428f096de7218633a8b1921924c96d64c32a841dd894da56302b56cfc00a7da32be9b28b94d7aac13a00c04c98cc440d449611fa0bff1d43d9281a52bf230d63ca2bb14dd5dd1d8646e66 +result: pass +shared_secret: 2a9393a6e60be8ac438b247fd72c75c1f547dcae83c7ba7e791176523f4e5eb7 + +# Official test vector 70, seed: "f68fc0314dea88f66afaa76e6c9b6804b13d4876924410d1f526fac59a62e26c560b125b1d0f8b461f1fc2e351effb4f" +private_key: f1594ece355ed8872280f422ecd4b02c1c9fd2716ce375a9c01b172b3c735e4908dc96c1a58945e70813250a95c1d48f6bf159aaa265da841dedf23d0bc71809c6bf16856a0d316f59955dbbe18a39175295d5899b4abaeeb6a7b3f9267426b6190c1f3c7372a0235a644b1dcb577065a6a2e6cb130f8150a8633ca8f388ff6935c2f3584508c0da3898e5a1be423506e612982d80179c4cc950aa35df21244bba78e2b24176769c934a020554aef4d43caff4203ed5351bf822695814cc0ba1860a27031c0c9de66ca3675ecfbb3aea48496a2179e6124e755656f1412b04f2aad353c93cb068910c0c73362183063a233183db280174c0648c3422361954be811651380ad3975305bc6e09b9736e911d6c55083f63347e2584e6a26bf3200c7cb9c1d71522fa87c684ac208a81b3f01298ab315773ca10d8243f465055d8489d5ce385e7c6c0b5cc741df52b7e62caf73509ccb814e9644f6c35bb394a4094745ba69b6b8f933b715581fda1abb0f8ac9ec15ded803a28e057e4d87bd7b9c53af6b943a00e3f694810e3878e3359ab109245b29a962ac32d1a066872a6874a4e3a7235c5157250086d00610e21372218859f807207e20911826b1533c851024054441014bbd618e65056576aa6404a1499c92683872eafb152fb2a171ff02f4f895f3a4b3d9bdc22a9627c6095957f86b41395b98b947e4611ae496844ba3083eb9228cc0277cd21c050f181d79bcb90416d4d5c5932f5643766a3dd1295cc2805721b58a0596a371cc1eb69c986c2b230f4ab6905468ce77916c816df1b7668e6ac5ae2429cf56a9fa6a7327892556c58ab5b24be7a9beff69ac35ba63a11c6dd15772b501dfbbc6d1437cb2ee29c98779131a56a28258b8dd6237629276894af0b46af6ed66c2b7272fb3ba9b936027b330e2f20b0813a240d27c7ae10778b0a0776e17751f85f410c373a6376670007d8eb78a7213a5ebb8a89d02cc902a62ca15f15709fef9caf5a558168b90fae5b5f3909259184c20a0c37a0196a37b2232c34a32704301cfb56066ca60aa65a6a459689bab328114e731650cc690b7f50814da97dd2495302fcb61ee375afa57eb06247277ab8ab96355ab42c87714ec6020fb6f95f05a02e679abece5069356c70d2444020521eaeb6376af0630edcbb1b655cee8a734d577353d95e3f93bb7d703a6399050e12c1e41340807cc91e274970f27d7ec86c0e7b632190a65e886b52e02827795a8e3ba1aca22c80e59765461b128543ae34965922876f2c418a47cdb447168160c12bb03e94fab4ff012845e15bc17985a38c7f3c6b6ac365adc1e8744b15334079bf0b081d3e2a9572119501892537bb0be05249661a5700bbb268f153603aae0850cded06a4d7b548550797459141beca50dc609110b22fbd61a2ce84c4d437663be27cee1b8f234b4e58bcb3d8b63295a5891ec1a63a933420a33eed084626f83dccb82002d844a593b693190f4291372dd6428c7b90bf9a97019b7b1f9bae23c87f152b6e514554cf6b9703604cbb2c864c94a024d54b7f3a2709ac878a8c2a9ea74c03f9a027d0b4973b062a45340eeb1b08aa2236b021f9fc56757237cc9411cde098aadc935e52832d3a3101268ca57b566c1804ee9831863b2fabbb9497833c2d9097805b3d125c96c2eb3bc2612df211829fc842ee6ca3770852beb38d48399a195cb91fab32e0b6752836cedf05345fec5143b28a5ce2a2510548ca95666c579f36e477e67a6ae6275ad32813a4f3795a602d24d6372ee039e50844cc000be6609cf388686cfb1f6e775951a6a2626095b190191702114ad08193d714abc32849a5a33858b1f951b09fb115f2f8481610cca8bb14a10b54e8e364c471ae4e57037c3baafd9ba275f1a4baa82c585279eb01403b2669dfd6b1735c5b7d85c5efb3a1ad8c0e8d40198ea4b4b7d1427c39660c04635ce59619b5824c80b84164641ac45257817c0cb038b3047c30ec460298c75b73a2f7f0b82b6a6583391f58ba057a6581bada84b5978888e15e9462952349961093354dfa34c0c08972b7571fd99197b13aa8b19a7f6920e5d41f50613a5c2a6036b79c0037113f41a3146ab6d7235185f51526f9b564462ad4c70f8f30346ce7282635783b9850eb9065ce58a272193166834aa6b266f0964efa45c0469249c3fc0faeeb19d1508cb7c409b49a7e38299920c3433da3929b2552d5e9a1f092383e3b4d3d8a16ffd199f7d933eaa506062697c29b1fbf10292a4758d26ab61f085c31a0a3b85a19e956860f93a3ece8a0c22426b40bc8d0c1191754803d0204ff048c07f6c778fc685b2108b0327dba9361b00c071c8223aef0949ddb804075c3a0178f41bca68b676ec8469e417547617c8b8ebb6e19e83af1ba27e2db7d08e11f25805f959285add216c25a029684160a880fd2dc5753709ea3d81a59a91357205cf126c24f8858a3757be1c562c65166a0800047949c062bca79e03836d05aa6a91a30856a367b087b455169a7c3591091e72c96b7432397b6a257723508661349265c4c475ee7251e4cc26d739b33190cbb07a993e5b72288a55d5792cdd2c9177c9541f0a70bf066135e06a3ff1700af24247aa61e70f4727e6a9fdad70c470b671ca31a21d236bcfc508a833714182198c4c41bd1aee23b5acc9720a3e955adb119e9e06fb6c8a7ba5a37bea21565f77f7f037f0ad71d6ad13301a547fe8458c8363feb218a3ed5bf594c3bdc7a03003641da15479304810b5a0c949417b9a8473f76ae6c13144d7b3673074703da0389e82ad34165f0c258457367b5521128ec318df886eaa203e259bca111b68e13ae684b1f1b3781d8305193e094c20b1e91b473ac9992d1e77db85023cd043b147681fc9c2c9c2c1237c27f1e459b953ca0711a318a4b76d924baebf599d9eb852dca1dc5f80191b91281f8345d774a29053513f159164a705c954e53ea26b6927dc57a0fae5a19bd33bd67339e8eb925576a2eabda6b0a4743abe05545e080d5495402eb0629859671e130cd048235f254fff49a7d394f3b1c3de06a7847473119e218cf0944609958300b93046869c026cd93e21925a30da0389e24ba6f08d498748730e2b40d1c73452de8b7570027579c11a7417f2bbc67122c9286d1219d7230ee5b0c42d724d1b1cd4b031500958dc7124177a25651781657904fd1267f2bb69d5c929f8967cf216924d63696627c917f82bd2813563cc443705b0a1b279eab237326b4ce45504ec710ab95d01ad812559b2b8be763c1e9c55449a1366fa2cdb6d0106856b080a16d7e3700b0771a422423c806c62614b047820ad6876d7740b35fd674d99605fc61638d863ce5cc6a55d62f83a4a68aac10ac065657870b5c623970db1a40773500757178f29d54548aefe92eac306fa8f926e5f84b15f339f4fc388a554b79d87325c81f9e9989c690920f018fd4440afca405b1b667e489568121178cb7a18ee2c38e10ad4f5a09df64a76c0badfd08627861144f8a449df4089a08c48cf1b110b443d16386042b6f24730c921643a6f8b7aedb9a7036339f1b156c1c4de7f4a03acb57b1cca827146f4bbc30f17a32ded42949ca5340b0494cd29098260a87bc7b50440ded82befaa1a6c4c28bcebcbb16990978ea92a3709b817996f51a6e080578f2d060b924c5d9b93098725eea946ceb84a0a884c7fad252bfda7aaf374e5ff8703941a8483493a5143e0f9b6f5ef45f683c2ea2c4b5e8b92a46984064b97e28d339789a8654e27e38c84ed7e4cb204412a434bac227197528c6c6e1625dab98c25557e16cb5b8249ebc11caade0b5fb505527d45981864d4abc8e1060cd9a7467465064c9b8cce823b6bdb9c702a7a30415b4fc6979d2476b4511909c90559f70597375c050189ff2932852a51e74a21b32c834c734052c61137025c20708263e0aa71d87b20263bace0c0c98a58cdfca4889672e6b654c003a7e22465f97021ac7c11fc4d1c0525ccab768c6dbd124c8c533f49ba88629c71fd1cb6ebc4aaf09ab6db011348b2b0691bcf8eb1bea9588b640cf3fe97e35e92440284cc9607d49a3891283ac96c32a2a223d1c372b509b1d9401ba6bb13ebd5ccb6c44ba12e392b4d165c4940a714359ce122f6b34bc1344af802992c6fa2d85f1957045bdbda400b526b21bca1a0ce181531c8bc644799ee8477af16fbbfc33879868135a5adc748f88799d23476aab0643e5dab979f3658cb1cf19292ac6f30a486353275cae5fb941b2d49a0d0349e65917b4f4cddb9a976f322d8917b70278ab9cb16ef193cc33b312e1689170532f31b001350225180493d7966e2b216c709ac1bea73f1c624a081620b7981c1c95ae0387aea62fece8e4c1277c5b64512a4b2bb7cc80044f98e2b654e5bf0f4ea520caaae1f2efd8128601c28b1def8d393a0db283229f7c7383152a814e7cefe8ef9d9768c473 +ciphertext: 9014923a6bb3766cc008194257fdb5ef86a601ee1bef6189bad5f73394a590a44fdee7b3792b124f19ad9d5d468d9cde7defd8a741b25a84d9e2fdf4746fd47a7c6ef65e14adb90d0ee45bb269fd513c0326bcddccf1c785eb2b87ffcf12fe00172bc0346a1c19b8522feca6dd95e19f71d8dff6ebadc5eee0b40a74543937b7475874bd327237f6c2021b86e4da652bc6a9312b184ee80ae92a9e5758d2017376352c3cf3e60beeb18b2fa25798b13e88907bff06ac2e43562fe3bf658f0a48f39ecafc5f74265d61835c79d89793841d435ba1deba46d46bdbe95f24b539b0c860796f8b8537c8755e480b3bc14a0fae4928946607371b79ee10a19b49cd7ce8a34179bcc6d3c526c34db107dc24a29fbbd93900abeae40ec107fe3de3289b748794469d375e4f0f2e3546c40c73b4d4f7846fa37caf3d6afa1b0f6eee1b358aaedab8f41c1b74eb5d77bce45f2f3b70eaf15e95b49681569e5d29de8ff9a7afe7ac65916cff80b26aac57d8d88864c35a12ad1572a4f17c6c58304c4b4fce4fb37e51504f6fe2505fb142c7bf6c5b7837459c3ff55225736a263fc5e49dbbfd552efd7208d8f65e8ed58b48d9db43dcc13117bd2f80be9c78ee4162c0dceb49a974975aa0c978d40f2882a1f547ece2450cf69ec2d31dbf271b2606b45d2fb7ebaf324a7e37a57c122f3c397b0ab84ff860b1f8641ca5a957d3446b56ac074832b382cc8189a5d49c9a53a3161a8eeef4f275f290133bf6a3b401df3760fbc5c23c94678b3a552dd95a4b5e45d5a7c657e0e27d30d5bc3bd5e8b78025040d5314aaf1c18a27cfcb9fd19ab5bfa906659aa8550bd26c242d9f5af54a4605e4178689a9405f3a03f15715e0c4e8a9d0b69b7a005469b0707906ca70dcf9d2792aa22aa4a063d87f7d1dc69218c5553cbc0a2204e81b97541039bd834be57580d5938f7c5e170eea127cc10bfbaac51ff8fa2394bf36ae934c92f0869129a876c8a6ea5e8b1173885d6a632f7bf9a0864d8adc1cac3c39fc2ba3bbdac80b608c2d617ed136db694bd951656bc7899e94d69719bba791d028144d857c01aa8701b50c53bdd47a0ceceb58ca6a019b09755190f47466a10a95389b9799c3baf1a55e51e7ab7b070359abb607919899c84ec4c636d242cf3d86cbe8dc76488b6852d5e9695cf03bad089456848080a929ad490ebfc551c43c6294e956f15fb2737fc1cf90b3ee67c38b9b6b651f651adce59de4434bec6d805c7c2efc36fcaca87015d9e9f994de4a1e708dc028cffd7b512091e8cfe2d97b858fc30f077dbc8dee63595e9175d3bf37979587f29256cae0c84469e4c7db00ba7c61b09dbbb512a42935ca55ad40ccd0259a6400eead12d9734632bf78eaeaf9501a77ace2a6f45f247d3a30a80e95049705adeb482a884444a22772c535a19c3ef50c9d3040d47131112c2f71d25827f691e410cca40ed6ad581f8ab0e9cb7b78f95044cffb2d8bf43166b31caf0d4d5902a51239d13bf6d5be5dead1f4c62cc0f5fbb56d1131a73551d7cdbf930daa82c9df3e35cfb5a7dbe738ca215911e0f1229c22e07fdc1037148a478e537d490390a593fbdd921de127fb033b1631a52ac9a54ac072d49cfedc0bb1370d0101ad40cd98f4d1b2530d2f12b98b39fe5ff96ca58024902fb26aba400bbf32983e15ec43f1194d79292839034e161c7ea3c81c9b53e112d035c8c6321ba150308cbc934470fa625802992cbf5d2246da7af70b9e371ce112fc984052ba2fbe1be8884fa85692f343c5be53bc472a9a18c899b157b32bfddbd42f761fea66708ebc3481ec5afb6c7938bf4e3a3c8b6fff32475391193103c53015880b5c0232fffc8d605402240a48653f84a54bd6c0d366455f012d6ee2f0c3519632bb5a4f577668d1eb97d92787a26f86bca10a1eaa55f9e7c6c2a4981c0f7cfa4702fe1f72e4fe112ae248425bdb28d919d5c97ccb84007528d527135255dd8cd5f230d35e137fafcb10f26e2a8c57b941aa32b63796ce2eaa9e0180b6746dc3c1272a855a101026704dc55e8adc870ffb6c7fbc3f41120fa2e7be78c5f46b72a03eb5077a43f3b7811230b5fbf43753ed2d08052414826a715b08189b311850064da249f7bcdd9a179b946d391e6769fb44b7d32f2b44da31b557bfe940ecc1d9eb99a9c083085b62fbcdb4d5e0695f1d1c177acc57d86b68f1aa0ca5dd +result: pass +shared_secret: 2d5b67aa0cf3c22c0cb58a11b2cbaeef150878a908f8d627457966ad96f2361a + +# Official test vector 71, seed: "a229218b0d51f58d915df549901548fb0722f352c7470900e7e4d8399205764a319bbddbd06c00e8c5932722ee5a404d" +private_key: 6cb427a837b55537299e1a8836b9c79afab583679fcd65663b17a3008200d9035fdbd50b99449ff6d14d5e0611bf21c652743d60268c89e0c75c5b4445707215a31593349a86960219f0cc079a2e39e221060aa5dc19861197049e817f692ca55e328ab0c32ec8fc5cd25a83311bb49ec8929455330764885c70c9d988a5dfabcb1366ac382b18bc866e5b93b780736558a0afc0580c4af75f6b6c63f95a454f0bb106627a2294af45f02d948c1075618b8fb01228401b1fdc2b65b02b52f40452b86a1b235298b535b7990ab75565f66568be06aea98a6a1e4744c1728914d00cdf16cf3d940ada784e14eaa332026c2f3cb05a7793c4239d5628281356170b181aa3ac98af93193cb6a9bb6a682ea5073e11c5fa7558c9f713b98a424ff86d84fcb5238b8258076529311d3b522189b0a440b4194bd15344a5044216a524862acd43223b51682df641ff3876521cc9372c19ecf117d505b6e1b26a33bac9b81c13b2900f11d849a0843a44c3061cc111c34acedb3b98a49874f4642ddbac92d969597a635d64109ba5d55a20968b65072ba0bb4349046dc3c25cbe154790d3353e580c3855a755215aecd7b9c800aaf9d12816135f80f010c07824483c838c8176bb58cae99817f1d2a538d694470021e3d87989f4b31e19539f1b60211022a3a74df892a08db12b03e3051d4b3ba9144926c1431a87cfd0f5702a7a127cc09b92f2a1d474b013cc9443f137e0bb1aab721ad975c13bf69d6c5a2725a2b2ac88b80d7b8079b811e978caeb96a89f97781dd7c422461d6a309add83cf83d563d2bb3d381a1dd4147943f76010d292f6703136d127840c9c4b532b86d46587eb54ea613e542645d1156f5b965c772905f90b3f518821a1b18961d61acd7c0d3fd09df90b9a1bf993282b7de33a1ed638cc9a162fde471971d2a5e946b70bccaf00fb76c02a520343b24f1173d4d27e2ac574e1c123e7d663bc054cc432bf1eccb0ac775377c65bbb2291c9695b55a2265f87323a7b63980aa0f1485775b2369ec3a3eb5a0fd126860ad14db7928a9618c684c7790610c118a0aab2b3adceb88b278a3fceac58dfc80bd9f2c7a2d55b35b82f18363a3e577737788dfbe0c6d995b3da953a9bdcb46b1754e0a187f872c2af0b0bfc70327646ca6778928f1005767a091e727d6f287a684199eb36a21b5a42d0c9775b9a2cf6d2ba31ac7677d075c9b207107c79a863c4ef47aa71a0ce5a409d6de8b9549366273967a760101a67c3aaca617d49960fd658bbeaa371c172113b017e1445fa2096428074857142b07782924909c7097412280d45930561a80cc47720234c94cd682ad3c18572e5becb8413b1868f7f3941e7256b01280330620056431911a638828162eba4c7df9c4c5c537b9738643e72b04f4c280048a4cf37becb58a83cc0913ec58026b59135d15fe8950832ca27c1459cce071feeba54106b89cef37bdbf9515f25bf9de37363d61ab5e02fb867bb86fa1f95b3638e105310258548a7986ad04a33a9745a71c41e783a3b86bbad123a4b9971cf6755e7ea7df2a5481d9973c079ae7801747ff8b03043944ccb8b3cc1320168566070bab7e05bd98823220b17d8084dc77ab9ed4331df4495003162c009b24735c736dcac1836b8603c7893cac54b922e50e64310196b08696b42fb8871b0991ad80977aa3de41a25d6c918f2bc0f76b940a0ba85af62c54a5b260807c5e76a062277a6d2a87e42e68e7f66b3c60936c207a57195cd0f4342be7557cca765094cb7d8cb0b03b134cca0578ca61619d67f44b9a0c0843daed00fefa300c8678ebe8642046c454a34202a617bfce69127f07c6987ccf09b1ed7e7c7b6f311293b575517c8cc720f8e2643c616269f6bc4abda117fdc031b93588b888833f0c791eb2862abb733dc5691b670d041b171788c39d5b62aab751b5361ddc4ba7a0a6690d2205c7cb2cbf65ffceb0830383cbd134bb35175760350f5f9a4b4f67390e671bdec8e3a61af35c79c4d7c72feb112aebcbc22c074ae77b172e5b5dbd3374acb2f031bb18c174b02755d8a53a882459695305d772176273b5300d02d7ed2a272f9c7babb545a6c1aa25172f11096af5398c9d6c4590730ff05c74c81308ae5315ba24b17fc738a30718ad046d0627e4b81b214830be3ea225e8161039550c3c320e6c57220e076224aa8fd48b4db59a30f71b2a2fbbeb05b3885819b672c48393c5fe1865a4c113b736505c1199b807c5e7669b7d2499931d899b21b8c1d9caa129761bfa3974c4a85677a0ea1a49c4ee022cf3048012a3b108b4380f10ad2c327a009717a64704a62cb31446c5c810a5a9928e1e4564f95b027ac251c464569344f0086106f7a4dfac13eb194abbd64a8e7db2352cc07ef52195de869bda087cf838fb42862f6346754f1744de8a414464ecaaa921bf76a4ee344e3055ce0fac32c15bc9ff3019c7b9205737426cc29239721ecf65ddc241f33dac59dba06db577514891f70d020f5b240b03493aba381f6716a16646a8a8343efc41394a90cfc896dc04c4fba8aad7cd66005e426a3113dd1a4be4a661eac59cc2742a229c6bab9ba26cfa9194ab41674e89a410bc7e8a25bc410bf95738f8420c64de5715ae624368322ec4a513647ca86a231e76b62e52753c939308f8460a7650a28d258b24c4662793e2ad4454b5756e1692c6e6822a8dbc070ea81f4a85d6a2a852c452235f63816a08d957cbab030c33b5535c87c5e7851c55503898f21138b61558b38b04ce78527658082308117978bca146f8f338c4b4b623177a0b1a51b5f134ba58c19b4db69182807f3bcb29838a0729cc2d34200379cba1f751b6764c27d471fcf7a0b3f9a404fd3bf98150150b540d79b1df00038ce770424838f58e10aecc304f29a9103177752520ae3d967ba33ac2526c85d9a7aee03845b911f9c0a516f10a06a018af24319385a81c153653fa81808a6bd74680f684a52b8a72ba5288b6e75bca97a0304f2c3d8e940dba7239869bf68c951ed8884dd32cdb254755098cef7abaadec1a47a7a0fa646b1ae78af8c608ee7535bc43371bf1206c8680634174426e062ad9c28f4474a01b6785df35df57014c3e8858c2a2ed9d911cda8303c318bbdb13370b07bad82acbad0bf04c3ad2c491328a20790c39292629152dc0e6a29199251b5bdc956a2c4272a4b894a87359a11803a8b67e236837d25a274c97eebb6a8a9e7ce73cca9dc91a1129236730786de0a22286b71afea28e01abdf69cbf460ba2d7d69143895630f526c5f2c6fe9a289a3a058d84b64228389c94984644bca5fa1f61004a3edcb94557093345991bcb9bdea45915a5bb95618f4d62cce22717a67c60042856fe8ab437066aaa733567694dcbd301307b4eb02cce11124bcde6a79819b95ea621f1b11492315e60f774bc5b207f42c178708b28a18c9883561cd66daf17bc0bc42e0050b2a8157354f7945828a488a941363b3393a1112c691e123c6b5699a5c945038b6b2dd6725e7e619bebf1c34c7c32245461d32525c5f49a763944cb64581cea3a178146dc759c29c995ca0793df62cb2153859a32905e785e8e6ba2b834918f2c2dc5cab10f8b95867467adc87111d7beaf69099400aa4e908fe0a299e8901ef5f9346fb07ba287235087a1aef51bc8933823d22b8a02c1fffa56ea5b1dfb143ec1426f32959a4103b9e343108c87aad2fc0bfc7384c0101afcb4740f01b57b483c0300baba66543adca822b4381e99870727a75c491a1129af47d768e4f59fdf05c6f491aaa5dc11b9ac7e20e541aaea11b6ec8b27e94189dc1be939cebfda109cd53f38fcbbee7aad3c65a3c51aa3970ccb31695bbfba3e3b10cdd0d37d848309ebeb3ed8601ca2d1479f3aa0f2766d24b0b0feb01d34bc5627ea8dcbd935a2303bd6aa6d01e7605d23217b98b2ce8564ce077032abc35aa6afa046254d9a63be6c4bdebb95e0020ab5fb89aa5b01238047a3c183188bcec1158c0cf901636b3a459a223a73986afb886787cf93a8aabcd9af1e4cc585cac6f6f424131a9e01fb49bfb38ea664ad31dc16b2dc3c701753a2870cf9c27114262167763902b58b2f03bd906aad3b0101b7898e2663bd458b5c4bb7c5f49c28fffb97bb4393ba3aada4c023e25427dd5016b089591277b13dd0c26ae3ccb06c088fac04b475477ddc1be06620cf3754548a6b2a551aa1b97df5faa296c6a6ecd052cda5903533c93445778755876136c193fb0e3c937bf71ab2968a25e8d1c9e49a9962ba0c78951f64882c826016f63b97e6f8ba0242a45d69276fe0ce06f14be7535859c87a9875904870890c5a620d8632f30f55d3cae33d1c6f5896e6b12354a75c7894d8905403ef5c4f316e67ab8b72581b6eb228a8f357b716164e0388d504a7f1aafbb06d48b6d75eac6c76ced1b0a025b40a55440712ad8424672e761e9bc400d63812006f +ciphertext: 0187e1b558e87cf7a8b1a050fac3953c8d3038758f8e909e57c479f1f52cff138a78e583ebc02aab45781641aedb6786e7daa2693fefa5a39cff0a2b5359e4c09fcb167e64736752bc3f30a9249ad439689d11dd325232ca64af152f16abf8f821d144d97ab82df93bf348c86ac75f28f00e7b259494dc4efa7b125782bbd9b88583248e49849c08854e08ad05cbdbd6cbd911bc3482dc234a6ae89f9d7b5cfc9ccc8b0c3b2f38b7ae14c067d4e0f45e0f531a26cd2f49c6ea2596cb1a7b148df8ab01b0a60e4150d41ccb9aee48cc05ade595033682b29b6156d1819f8419fea16efe54c1f742bc2848d4351f7012d52a064d5ddafb007bc36a37d1de88f6e7a19a3f293f9b18f4dbad2604cc77dfbcf26f409535497bc0f9e05c830d1ac52f43740554008f032126e8464cacbf305d482a00ebbd737ea201cdcdcce295199150082c3964682584d3ec1da02f9462b84f36f88e81b93df3bb13419da7eb30a60920899caab1153f888941d88ab042d99c4c7accc20593b95634becd3124aae533c258f7b466867d7401595533dcdb941a73a72aba52abc9f614e6361381b8b39c3028cf8d65e518e7e098d4afa39384db1ca6aebbdfc4ace6f88649ab1d91ab0418cf5df4f93ddaecd76448528b2ab715633af9c8563b9f01955c0e86fdffa0132b62af9cb6adfc47f804cc66ec62562c51bb62203326cf812299c4d0818ed5eeadaf737c354164da0972a34cd35fc891d81603ee4698bbb7b87a6083ba2bcc6a52a574a5fc909d6bf3967ca3860e2f6e589201fc874e246052cae6e9d6cf9348231f7f30415a2703ad119758aa8a7d6a88b3ac897b25f7216dae443808ca1d76857f7faff60ca0d0855703f3726efbf91cfff5bbf11019f43ca3efb3851d324dd5b344ec0a7307b02ff76b92f8497a5e86ae94bf89f0956cd7ad30cd2a58f37af5452f356f53aa606c7c6ec7da7562e995ce3f9bf9e76c7f957085766eaff21ed335180c5e0c01c05b011ab76f2474234305038f7e6761b82ec6bbf19eb19127c01f1ff1a1772867350838eb666eb39ec6221488e7bc2dd3350e57a842aef984e7d00390d056962908fa2d3ed3555cafb639e5538dc0bfe712dc75e8f19a54d3c96866f0b40aaf200daddea384e4f736d41a7488121ec88b3d3e17768c5c1c1e089fb4c61c2da5bdbbf04e341567689b6162015d4203b221a0c32b336753dc49b7cbd2d61c2f044ec6b911c8f5adcd6c4ce68949d3c16a81371c5bfefb8e75654963cf2cd5b65ca9a08426102df9f8bd9c95a3bd0994f29c92bf978d82cbb6e7457967d4753f88522560fd64cecd04dbe4cf1a1b89cee7a34be93fb89dead659d73c881aeafd709da98fff4d5b7834b2a76d7943664fbc5c9641e11884d89b66b6c54015a8b2bd883d7c65f83d219e658b20f1321c95de44ff46bdc8aa6ca0a33bcb79841384673d5cd0a2cdd77d46121512c1b22f0f42d87481b8877fab7d26d2231631c69c4d296274527c5072069173ec72017f8c9ce6a83f944b64e9b1b55d2b714926f71e7e7795c5665c6b931e72044bf2c070df1ec4b42c530ee5e8b8a8b5323a82ea79f7d6f301a0babbf9a69542008ad7731fb985e5b8148275c92969a8a543945ce880cd22141ed171bb00ea3b396040664451e14833b894e4ee1c301bbca9540c3658b15a60da505f6f1fa625ce7107352247fa70bebc22eed0a0e073c70479ec126c6d1b7479a5d2e5159a25548448ca3edaf620f4d6fde071fb77621ac03196138e212b0c161daec7f12ba17fe5a57e6edf4ac4e2a8e491cef82f86f0437ba48289871684d354577e391743267722540e1bfea234b0caf5af9f4a3947dc8deb2d4d6b64b68f54adc2c06ba24046f23b40e07267bab085482aceb644351e255971c82fc73c792fa4420ee7e1bf42b2dcd5aad71f66954e91d4367c8505e1cc4fbd2705dbab906b56447bbfc73296f1e4131e60273f33cff963bef087c4f11f8077a500b3dc082e1bf6eaad76f301d7d72aef47816f0ede7c2c5f48305719076d4e62c49ec6f7535eb9ade87ee094ee3d81c0a983b38e15b1da0545d3957687ed5dfa834e0a3c1061d13d7c06a27a1899eed333e7895e7b451331268e5d661165b0a4b6623d8e5192468375327081558f15252bb8c3feabfcd480a802f3e671cbe98f78b870a89e8360cfb62b67cabf971c59c2fecd55fb54e4 +result: pass +shared_secret: 2dd5a204c2cc0e2e99265e4243221a99eb3c56c7bc25c442a1cb85ada77d40c6 + +# Official test vector 72, seed: "6960f21c7350dcf41b4770c551dc8692d8ba2c0b6e162c589166ff22e7a1ac0f94c2f48504a5f7eb0da094df427bc98a" +private_key: 342c2896a97cd8d63c24504629c1555870aa71fa19b668a558e2bcee667a6b61463dc46547419dc8c458b24b5f463ca8399337782b02df7704e53bc2f2d49f2ddbac73dc3c84728738a29e6f1a906229a05bfc4673c87a2d2b0894a67c549b6631a925c562258edb258524152b7816a9310d99883f4a583df4e582ff16acd9846b04a957bc54665f86c237bcb092a505fb089a8f76b865c130c001529ab53fa3b61f45376561a781c6ec75d0810ccdf44dcb0055bc70bf98f9940b000212215040cc08b31b90a395acf312a9fea3adfbfca17d309ee84b25bad086ef669986c4bbf1aa6f694bb74a760cd235650e5927184ba6e4e918a1fac482109767d2289dc16277468ba17031772868eb6749175c9a2755c18d67a0f6658fb6b5a27374ba2914680d730372e725181a6292db0d1c719501257b0f33a152dc077188673fbace2ae568bc1a890fda174edb4a1c10b825b85a78b26563b9429fc7caaa116bf5d808427c0bff488ea615017ce73008e9cea01747b73733e91ccdfb5c88611a94642b661d1a41a943bf065733fe2449ee68b4537cbc86871e1268cca564b5e952188e90aae25988f79bb706706aade42add2c1b2951b84d040e097b85d78c3c5b10c595879784b71638b2c70c390ad308a311a337413a20857a216d31134e2429cee72be2268cc38ac8617b7d45d2651efc06c3b1c1d0c44531f5523a707d0802251576ac2d6a91b463a68348a2673a2f74cc7c20a79b73bb1916637830c91e701bb200166d2a63a21b5b8e52c7acda296d80d6c897c86334d8424f44677e9246ffa32c5c1754b632692af6bffd05458d131c41275161cc50a51ab2570746048b455420053193b6f1c0ae02f83ecf364e50a6694285523c5372a84b6345f484d0b2c8156c05e9f3c6b661bf1cdc5573082313c5c05c648be94b7b83b68ad93019b8469dc93a51e9f47a532a15d9140bb56878984877311a8c303b7c2cb9b62cb34c1f70cdde82c9d9e76c5037c46e6196903b1a372860110a721fbbc844963f287909e2e093c4b89358160bd6ca892b95a910565fb67b640a803a4eb7c08109cbd235b773f91cf54842352b4a7677bc310563e5fa320fdab95517c61952b5687379c6e229f4d296bec53cfaf346d0050ea6465040fa11d5f04e997932b9201a117b3d552bb853161de6f6ae5669ae9cfbb36c00ba54052e5a70071398b0f1858ee5e3a6740a7b93a453af91550e7cae362532d59490d70ccfc9997da3519638302be5c01cbdfcac7b32a984049426acc67f12283598588d68a46c1720445b6602e4b60df0864ad3760892403b575e61120863f03d0d67551103d02a8386b1abcbd2b6307b42a62103a6e970cc0a021e5fd54b659b6c0fb8641c6c74c12873f5348c3fda18ee264af681316af0c55cc2bc91d767344c7046c0455b36b673591942a622fd122fd6505ffb4a3fe61b0b0bf1bf0c539efdaba1aca1baa254a788f821502b06db752f702c15227c4a60fc09bb28c3d2165c95171c20ea6e8526cace1c239da3705844c860c35d6dea477aa1339813a9f2d755a21b143724621421abf6d5aae62c591be72a8e817603d942a35c9e7a391bab514e88c1b54d9830ef7c490644287594c834d898a50c2f6e18575454733d40ce0bf20033babb661c84d9040a12e4881e9947ba4023b0eaa86f9984f4158d825bcdbd888e7ae6084e3b2f49498fcea10f1db637c82287e6f8cd553caf40b7bb00236450243eb7349958286f380bc456b7208922a5d8887a075acc0c29b231c51cf9839e1fac91e3d0631b865bcef168e71a4a53921c5cd9aa758175c8b94a2be1af094c5a5c518ba3c7ad0a0cc105126217f04a49c674b7fc3e6a9bae73778c02320512d1ad3b7b2508590dd544b03d2c21d0549eb5a146d87c3897a5525df8735079970afc8b58f419bab8b3b513844cd08164a2882518ceb79abf6ae8cce5618afaa228db659a6ae16b82e351ed4646f2a3cbe1ac1dc0b6a0838532a0b2aead760ac43a7eaa290d991a172e4a1fe1e860bdc50b51e58d18272a942a9045358faf279a916663cdb431bf81cb30777cf105a032108769475f84c74b20668a991b53541a45061236c232cc85a56292ea7d470b00b4b128e45586e1531c02f364ceeb86e4b22fe6d4a049399c70ec588f847ca3ea21787531444355e26000209110be1b6994c3003332b95b6aa30f8a0d047cb6a2d9cfae2977e08962b656255637405057c233388e018753fec08442a6603878a6d4f8cbb2574b9dca1c32dc0964e82606739ddeb92402619649bc143950b753993e48da443b1bbc8c3a0e2edaa2710a541ea6ae48022ae1f48af844c2b32707733916c259ab588241ee58aca3538a0bd79fbf3589eda9ab08906d77778649f0a2b2a7898a651bae7013f8b863112c4ae2830a43ac421434236151b2aa7a5b3be77d4c85c89e3140f52804ca470aa2b929e8e8bf9b4278be1657ce321572d2196c4bb158ea891e627861dbc811525cb5f07a3377be081b4651eba3c311bb1c0357bf7a7923a524f003b02ebc030400b4b1e1711ef633b8921c101bcabce37655e8c651cc9458110e68566d0871659c3072c509538c5a6174063469a25c4134baa4f136e71464179b004fd361cb2b19d955376d137284039a6820211aa578189765f15a47e4b52d4af9447c4a8343f84edfe7ae76901d871b0a0d72414c4b01f35a38fe35a268848e663263439b4dfb9b3435537f54bb1e2b132528fa5942da8563554276d466e97a25cea6c7841729cac824dc3ccefa91c7d0a377f45b10b8f8cf78d00657f90e114363644869612bca78e402c8e2a6ee1910e07b72ad43b44edac06ec2cb3c448b506cb0a09746ccd84b3b993213b7a76dd681d6e7b7e9916276172d15538209b01ba5149bb0aaa55cbb04ac89674700544ec7079a8277a3dbc298034e08716849c0542dc42b7e32319b0b7efb43cb57f951b4912af0141965fa6e1701cc53d08c1887bb31fc93399823f1371712785ce6cb549b91099a2245dfd350c374943ee6826cd3c9bed72e7012028b938bd304ba0f5255ca664389335962f35bdf253e2b3933689070145462f245696e4b1d852bab0c817193679229ec684979c8f17965f4411fc1382309c28e98c095f663b587e967ef6320a84a474ed415e64381ff341daf491a9bd872a019a112a2ceea76661015b54181b8c325977b50993a5c26a7d992cf519d64f0a013f517664268d415a9c7f178c047a684495464332fd89071da200c2d70ba68c68425b815772b349cf4ace5dc1437bbb21e3283d2623cb58680fb1084e50685b99224f8c91d167590d4b03fd9a62d54695345217fb08658f1f6c25d0652cbc8cdd858ac9ad44616a8be03e06e14288c1ab27e4d3c15b156732d246ef8492efd508b41e6438c1c899b339874792f2bfaa1b8e55dc2740b02d23e8da9c0a1b91c61db66c92cb8bb3c64cc68bf4af341892441085a96f3aaa1a2217bf6c005a3938c2c61a15a701e090c84d93628e7cb6bb0e49c170079df1c0e364a4ad3622033b762593586549c79b764710b2107bd0c0acf106c7f7ba9accccc6ddb15d2b68a9fe7a2e8820ee9acbfdef8c139bc8b5ef47fd18626285409a59479d517714637b9d75aabae29cbf3418bd56154fae5195372299942271b0c90f0bb7f0c2537df6a433a2350127a24aa144d30b95faafb39f566651cc1bf205814027477c46b7ff1b66837c657af9cb0e7f46a42b4a74a69c36e716e2e993ad3c574aaec31a8fa5a950a8ce7823a7e032cb4930c95d8483aa102d1b20926a6a324b9062b29192431bcd61aa56488be8b9491ea373fdd276bf986ac01e6a9683785d3384acce6297da89657c005ac086687161bc21a18d6d325fef6059ff711a60782263a5dd87552f3b6691708a60459a81321caebba42faaa5593982ad4e0956aa42bb03867664470c8459a511026c2b8791a37278faa906b288dac6a1b7aa9588ae9062a31823076864800b08396aa90ab0a48a9798a146a8e77b104125ab1f1b5448cafbdc749ff085f06b02a2c25174f587f6c2583cb0384c521990b6c15cd926b40712bc503471d4b807f85b7baa361138312f1c62d62431297a451957375607bceb0009d09ba904a864be363bd220cab37d13a77daa42454b867307ed7c2a956d41a62b996e0e78c34b4ac0e7aaff8d8164b4a11f8aa4379fbbb34f14e9fe13a7f4ab0025586f130914c6183719a941b0338e1e11aa3f167a421bfa38c9142e02316d1ba4e64c60320c0a190cec011304f0bc58af38e492937bbd0ad3a5a904fb39ce365a13dc902166c864a972082fd9e2ea5548a3b6c7d885a3ca6ae2e12efc2ea3ee4ca0b0b171ee93a198b42191fc1297d126ae957ec70b3e5cc940f2649f5a8cee53a1feb5e68e08aeadddc273b38bddc18488024ec90e62a4110129a42a16d2a93c45439888e76008604c6 +ciphertext: 513b90e91123157cbcfea4a884bc01e7126867dad5849630204d7659363db9741b75bf90a60fb1454a58a6b9218ea88480a9c3784ff905ec79dc457c1bdbf42949c892d62050c4a3a5b1934d9efdba27709c1448f561cabd43ebd07992fe9a3eeaa93d2f85a58c78501ede9066448fafd52334e63e32e257b857434f1ff9d2bf2126f73fcf7a4f4d5fb1a9d3ebe75553e6f663ed451cee5c3d427fba5b362a554f3e25655de48f690b6d9028425b00598988fdd3fb41bc3cf7be9861b82b9a1bfcdfddd4da0166408498a88eb2e9e52ed8b0bf1685dc6862f14b59f9f9017459aed302a242f24f833f03042541a553340a99c26288d4d80257b867eb75ee67b949a09261c5c3575f688240595f90e95c5f4aab0d924ce0f9b2a4d6f7b21f1254caa24b0498271cc57f83323dd40d0f1b566cb72e435ae8cee0f502a6900651ba29064ad72bd0d2373dbbcb96938f110577cc08a90f8ddae8c897169262d3475ecf8ce5976a27a84ae6840077a21334bbec3bdb120323e01733e4125dce4413487cae5d26cc1439b07fb3c2bbe2321c12f7a9bfa3cd37f282f8909656470f8dc01aff581be3b2b5daf242fe8075e3f2dc7cb1cf640dd07709faaa95f2a210e3680675ca6583dcd36c15cf4d5b1234d76729a3e181409a60aeb6c3443eb828ea034cd97c7b1917d80cc3f4b6b94d0623f502ecd1095d2aaf6357a15c008ef838487131e9c0eefff80d64b961c56e400d9a0987d6002d787a733669b8a14f68022a47a7f1a7d5b0cc2982cfca20ce49b9910f656c8493431220381da944da3195acd40cd3cefdafab652acad95d1b33c45d69dad1349c314f7e0a5df35931489e3f0ea1bba8931c0ac5a9ff1900ab0b3319b7b32323d8540e6693b394765178366c2783a02de21196ef15b562bb0ddf92ea35f37659ab026b56c1d74c6e5ea282106b8e0d3910f0611ffbc00d4a2bebae4229375be72aa985211041b6be3afd316a7b237af61d591bf19b7d66e7b2141518c36394458d38397f8619f0939de57c53e116aa3989fb875cfd60d7c2c8f9f95a9b03a8293735d76caa4bee486f56e127af5319e02e8a6511fe1f4732b707198884a461f8af105658808551b3cb59bee524a8122badcea5a014855fb0ae4f66543bc1de0023432db13ba03b161da4971c9a647a9e944f04291d40416d01ae8d9e8789fa84456deb8e74b8deac4a4adfb91bae56ee88cc3e44d9227d356901351ef3b2ecf4d4957425f5744c09e57244ce56ad2aefd84a6f62c79fb22d6c165b969f9a2856388fcee1683265467b5e56d2b55e01d907293f5b441cb38d753cf85eda74e0a33a30f22c12f99f0f79d6a431f6d749eaa62c13b56e1e327ce0531d6495f043b6c77a697ed0127618e8b864e53b7155a63f76d210a5977a3432ac64dfcf93eba99e5308aa9cae3a2fc2692a7aa05018e66f1347e2131f3cbafafc14f6f1d6b1e2ab5ff905dbe8c0e0602ed774360c4557679d4b58adb444388e396e30d59ea092043e4d9bf9c4a07837dc6d30134428e827278dc13d8059563c6210f2192cffa0443743a829679fd840a6d2ac535caa5384a0002e2467f6b1aa0fd92c53531d8d885e947d1573f248d9f2dad6b009c511964f2eefed5e1fe6b37e5472e917373be0b2d1c9e30844f39a03b6a2fc3bcab6753ebf5c59ed4acc740fb56fd14b3a5b41050fa63ca3eb8c68a2742890bfe9f840323366e0fd40bce50578e5030359befd7cb00341d35257e959651e50afd875f2f59769392163ad2bde60d0e2964caa6634d6b2baba36286f6afb652d8b497ca74ff24b7b106f21116c67133ffcb55c2443ebe91b2f34c37fb0168b1ce69316c79afddc9095b2dc271e81088ab56442c87f1e7ca7fb7a38f69c184c4dbab3d98dd058e6f3f253d4e5f943df7b6e0d720771ab50dcbaf26d180bcdd6859ffbfaf447598b36fdbacbcd85f596f8d0faa0e5453aeda7270a88149b2513265a99cd2d12d465ba7ed2f2c2917e78d0bed73fbe3cf0e368585e58444038a443ba92f56f14034b03f1a3be51a15ffbb216ebd23eb533a0dba7e84029ec4f24f686ac968b7d77bd6c4e869e0f8a80905fb88ac04db1035ec0c7bfa8effe39f9a4146e6a4fae014e7fed997ef0a58e4957f81429ef52f08eb2c5e62d2cca021e79de0453381bf40e1ab17b8f88ff25a4b0a023d3542fa58aaa19653d99d65085 +result: pass +shared_secret: f672d4af4d2ac0dc3b671317cacb5334b45c985f53c0d6fb7c3a24e5f88ef643 + +# Official test vector 73, seed: "53df46012cad4a745b7a3c06e18ca95e0b839fd8161e3025749a0887549eb0ed6a44eeea08bd6060d6509dbf7e9dc864" +private_key: e6d51f1ff8939a52842f092d10a9cd02fa1b7840147f3a5417da6994e7663b536d253b627094b87d951583c61b8ed8a15295276df7b080c71a6b2a4fb93b29512977f02c7f8dc36eeb2644f4db64a60ba2083b984a010e0029616295835118ce0382144701cfe9d5a02bea7fc8ba9ea074c15cba8f2a77062270b9818ab99d856e3c4c104a66441eca4d7fc74b148a37a5eb7103f021c955826048a1ab6a4c3619c1a2884fbf4495b1469e33671c845a40314ca87c4bc87e8c8bab04a1b9b237413242a83cc41517c11d50b7124a730d7b54a68282e2cbbaeba0896b2453568c22b3e779899a5e8850424fa2b68af95381cc5ade59b54d6a1bf2f1b16ee59375a314f811a716239085a77bc4e29506589a420a6c09c2206cc1aa97f2aad03657eb967c1ab8bb73a87a4853035d77285c29c788885bf1108fafb517e5bc1f13f89cd5ca97d70c12b5f64b88376466230439026d73a3aa9d11b03db22e541c28e32c22a2976b23508717379ded0989e2345cb5f0c7d9c97a81ba09514b0d27598554189f7e8b6e977a5d3588c979aac19ee60c4f64ce5ce73b437c0c1d11577d539af94158b946918085c689dcb227d72240a843b2bc4979f5cfdc2791eec3bd168593ba7b1eb06b829844b9861387af68b466498c84e8aa31fa39488cc676f728ed106aa9e368459028fff42aff418320498fc283b8ce860fd1c02ad1c0a7d0d92d61b6aad6d1b939ab0396983693353f23507335ac5fce277df06559dd3a6961cc43247cb0f9e7269c438ab4e14ebc0ac2907bb1289741b211cf40a15ded58b8d18c4948294b774c6edb047114991981fb612c5a196354bb80a2bf6efb713aeb72d5f434f9c46d14dc461507ae5bacc7c04789c1dcace8904cad02401ada53489a04fa2140d1864c76fb91777bb9900b010d7a6f2d09868504823d83c5e881aa7b5b408f144e01f2a83de212a7d3188c845539bc6b061c2f72b5c771f8b7377c678ce473ddb25b33518cfcb71a18455acdb02ce73433961a98d840c6bf844014c7c89cca5ea58a6291391ff6c0135e11911b6895557193dfb84a97e4b8f1ebae016947a70b8b08e5c578591f0874c6a2b7b900a490d240ad36bc745c113778ec3777c3220cb19fb49634cb200fb1f67e5decafd84100544c86ee79c000169cd908a884344ed2f40862558819458d5f87c4f3714fe0925538f002a7d454c2f438a3c751a1fbb13f77c85c612e16c0cb979249518b82b85586df793db403ca55709e1e6030356048b458a492ec56e0b08c661c5ba04b805cc631b12a741216448e22a22db406c04935f7c6cba44c213968a5fb6ca9066c88f70900411a43e8651641197fcef47470299c51473f158175e2e7857716ba80f501e156525ce0bd05cb3327673385095d144562dc4b006c89b0c6aaa2e21ccc79c0a7f3b0aae77142a447454b65694c6a5eaf3a7761b860189846a8612b89fa5ed5715c8eb3042890c52326af5edb7de3b578dccc61283474bb8966b187acebb9bce0a08031e66cec0bc57fa368af2574e7397a1177828d4326a66a8093415872537099d77eb83b9cbb516f40d235c0831b3ff663d3f3a9db6c0cb5106c905cb55db0721e45a7ebb676def137a585ccf493002055536c3ab49a17a68783290fc9366923654e310b17c2551816a9196497ee62ade56b24a2b421ce48a583d46f3192bc09493ed47502b75580be01cc94cb4893f32fd6266fdaf865f4f16571d18c8e1a301341113d5c6b59061cd3124683748f5c20426288c7bdf8ccd2d21acbec096101283534cd4974978b117beb70bcb5fc557d5b7482c626a390a10f500e65f8af72b3779068b24228c37907477017327026324fe3c607a86ef7fc453af88c2dba51114cc67f32bb46e58cb7995d4ac31f9b0c2048b05012189e73562fd2baac0cc4795e55b5058b9a747a5c34c63438f2767d32354f12a0ba546c76f38cb54ca632f321eb39ab0528942647415f91cd0738190ed20b1401aa0b1c4765674df3e47755a12426a2a307760dd9d39c2f7728dec213b2559cd2128181e74426595082dc0065a2aa132c72b798aedde6a7c2bc03cb0539ec61bbcca78e510600faab6828ac6a60f58b6bc894d16712b34892fddcbb695c36eb9c3169543c61969c22f95b6ea52bdb9b2ed0947b8b21912d062783fb94b458013f34480ba83178c87d9ca4575ac9014ab22a7cb92b1bf41ecf098f735b3401e31bc02a43c447220da64ce22b17408ac536135641100d1ea581a14818eaa4c77b229b31511e0a403229889fcba0a2d4d3c845868816b79f56d6265d678c9138b716213fcfd7acb2c68f4fac7914d140cd2a7487b34146708115689407a9bfd24216f563a6fd220893c1c5e2c657031b43a29b19471b084485b7f739af017459ae50423518460266cf449b524406b9a2b80a77093afb1344bc1521e0220c5a113cc0c4a4321a77204521e3c758927c83398aa1f4bc43ac61487e7158ab4053fce98a74b14632054d3d3aaf018cbaad771326b7160247cc10a114434087faf515c7a39b0705bc374b7af73c5b60741e037bc69b10949db1739ad74a240c2191b3201a020f43890cb16390d6c27c39d40af0043b57e8a0f978627fe1b36c6c83fc97b49ae9268618b2c96a7a3612002b2673bc1ac762a37e07fc6ef3749009876399862d67b5b48571caf8b326a4a80b4544c03ba811b3501518d5caa107be696cbdaae79caa0191f5678fbe14934609aeb501bdb0a525ada654d77cb3042159686381e3677edbab5f7dd87fe1c4566dd7382f03c2acbccb14182b9a65afc0aac41f4c3095675a316159b0b7271f0284e160190de000fe4076b6e3073d302a51c7a6f6486c52c97446b506dd7c76ebf08a5f8c70e6e8479735c2ae79a6d4a99444a347ba838c43a1ace485a005a7531916c45181157c955817c488ccab9aa4d55dd79a5e243504a74405a8a4ac01cb1b9f2917fdab3b2909ca609739859383d631b65965affb4490d5b9be84a2902cb34cc50b5c49cbce43f8351a68b3476387bf87a16b9784a0e801e1eb39ee33b8b9ca82bef596605b59f33035a05a012d8549f0b68c93b784c7a309dd71425d3175ba50107d28aa8dd42369bcc68a8aa074020b4b21c3d537ca25b82a50dc875ab76b35a982b0792fd84b60e7db48fa0b80cdb90e1a95038842404a78c17d6c73e42951ecf2160db816cb7323cfc0b8b0057e6e66a36a856eaa60735433bc1680636d137b8da85f19334bd0ec9617d8b484986af31bbaf7e81a050c5b4dd9356563bd2f874b6b82a6e8b088b2ca59ef3866fdd4217efbc5dd66c72b66137ae65e7dc5c541c42a5c4cc1c1f1b678b7941d37ab5bd7292c665ea89b9679c5a6f8248f9fc61c2af282ec048bea74cccefc2077f370d3979b83e2a65d64be85742bb9b66308fcafc84038e72950e968b33fd98da2750484f1138aacc0e5e8607e352804316b26111c5a242c09901339fcb7d304c749d9205f169d2663a03bbc82658a0ca3025ec4d0a1e445be8fe3a72c672333188abc3010b6a98ec0f01d698b87f195b2e398ca6f8038ef0739af347b22076a58391c46573b0f782444464d9ea0645b4cc6f7136927c34e51fba618b082f826b29fabb8bce80bb0f05524348104eb4732e0ab4f4040e104b78ab9317b558330d4995168752ee23455eba2cc4cb679687be93860ccd1848bac42616893e6e710645b354a657e4f064e2d3266f89bacb8585e6d927259723e7d321aadbcbf9638b1bcf917e3c203fd06145fec0be1059c4a52ad751986d0f0bbb46bcccd365ad6b614dfb87dd7f97ccd731f4f9b280cd321d7d7679743833823aa5a05b1b3d0263858cb2ec27677da6928b26d3459573e25b0ca4964d6798cf250860d055418761d7ff0189223a1d3eb6ddab21572b58f0f5ab03a1bc047d7928c060844160e169b2ce072a89fca5b384b81b89b24741674ff5223d4116ada77797234ad3cbb1f6a78cc33e27b03ebb0d5a18427f625a4311a9599ae8723bacf392b7c915aa731c943f49c24f189055143502cb35318432c8b89bd2b9243f35c4b443ad48126207559a2314a77bc67c4d79a3e010fa1686761509e6774bc2df86eec6c5e3cd547f9a5457fb4a984590e57ccbbef3b38e441235d90bb60a24a691425cd65bb43b5868d128e3428b446409804a25333a7ad1f5c6d712169f660798de5a448aa393b5c496db978934c6eb001112440784db13825167a33206f76b05eaaab0b89966150238748c492379b387ec863fda621ada4296fe16593358ca0ab83c15225dd26691da0b00554c2398a2c44f171bfe63d48db72ee6cf36f47dd054b8f7bec5a4bbb6b0d62bcd24a3b8a6d32c53a51bfb7c57ecf5fb124740e9315cedb69ebbc969314e2b7469c2d2e2bdf2698af4bd116f0d12da3729672816f3eba84c9638a79676eeac0f22c8a48e0c5d50a26ff0844c66b99 +ciphertext: befe323a205445d0b526d8169b8499bb6d5e557381bd3dbd8fccb9705743ab4df3d5bf1e83f78312a87d74389813f2ea4249e1c56d6727cb6e1d6cadb74c331652284c68d81087a237662da796bffcd14239e03d2e097987476f62c3757334a724d9b9518dbf2a82d06bfc12bb1efb86a1d68e638ca37cda0ab9fe2b0bc0e54111b11bba4ac4023decedcea63cd038a9c0a1ea66968a9600943b68270e653a38bf08536dc6f8a7f67fcdc4580c08ffd0eda430761bff7030795107a83ac82754748eef53621cdd138128d6773c411ddbc635e4851a11f4f01a172ee11ddc79a525f2de9f2831f34e55b679a21fe5cc96095837d863d515b257f76ce9d588dfa6267c93711b98b37d9d2a4222b250b7a452102b2f3a33462b828608531eae54b2b3688a68443a77088b93fc16cb7e59cc86705b371689790fdd47ed4699d959e82cbe3c90209a54830c56b0acf1c20b2685eea9c2237d2ef573d8739bab9d4f3deeb7cb4320ca1856e1ec8759c23bd361c18046fc43216b46269a076bd8b02f1847e54fb6faf7dfc73536a2a06c9817c022814a61dabb29d6222af5dc508c08999136c3631e33a09c485bf6ee6ce8a89ae9b89ae5ce5f7052291f32c7d18e1e082f1a5f208e049157cf7c3d5c007068fbc74bde86631089f232a176c03cd596732a00e720900ceb6e48bbdb4221fc7fc414c81e699064f97129aed58229ba7e1ca800c759c1b5a16e18e6744b327990d087346d70f535582659c77ec633756b999075bce6e996ea47a0e6b5a889173e9af7ef022a626d1037e8e8a6a4ccf10cd84440419a95d0fdad3a3058c3d308f3c47a2d79285c97ffd67138e6b44b3ef332cfc5874764dddebecef283ebd31be660ecfd8d5a4a5f540b6e297cf7c296ff88790e64886938f28b203317dca7e870f7f5c115910e250c66530bc9e127c3c6efb5fdbaed54d25c2c5f8e07f4b21edf148ff413066d2fa44aca9efc06609914b1dead69a60db93a3dae76ca9a588be28af1a5700afc4abfff20ed9f6757c5b23856e91b103daef0b5416d7e31450a0f85470b5954848b7e21e982fc083cf7eb181336bc2d91a0fb7109bd14a30e076ff633cd6a539b0fff5103e5bc3ee814d9365cbe0c8915e5d7fc6a85af830840c0246cb348e7bef496482bf3127b04ad2cb151994bf0f3051ce41bf7734cd555bf1b41ef517a1918931e2c2a1118aa0ce30475d081a8e36b2928cb83e86c7ccc3ab9231fb1fcc227338229f16cef4f6ae922d2310e35b34d1be490ebd8e91c03beccbc38d264f9a62cf8f0dfcd539ccd43469d4c8e6e088a8815c14d49a69e3b28ef990f319113b5d39d2b3388a2c6b8daa788482b78ca6b24a6d64cc7b0def3a3aeef1d2dbb8692dbd82a124638cfdba641f0d9c7d7c45a2593a4b46cec98184fa3067970c190e34b135d07328c785e489724ba1576e5768c6d1e2148e44168dd1e91647b8613233fbe9c9d4021194ed8936fc6d3327cda69c02c3cfed6b40da3a9784f4ecb8561f34179a3518aa6228d37a9209f502bf518f641daf5147377cd65e20152346151d553e748a02c498417cb2920c429d3251ff6f87eb6460cc5a70866b52084ccd68b4446032efbffd3d87c6ee663a85de4c6221413efbd940fb2722aecaac71394f245c5e29973526124bb1dff567d3eb734789ec4f49c5c4b96142f0de143792f15df1bdfb358eec7a5916c9bf22aade6bf7961c6cf4cfb33bca6e0975311e75d3d90a1923ea440911664ea2bcde517be31be414312ade1604b96d443bc4807af3c75e431668a95a03320d19785c8ec3f05413dd52cc18d01983c70e9654abb28fe90b795e8f14dcdd44d0212de2e6f9b3bc21f5ebcd50ff4bb5daad6fece570719d0acc62f033304495abd5cc6dbb47a08b1e94480ad4e009ce4401a10a997c981689f3041f8ac66d75fb26548a4bffd65ddc42f3eea2af680512bfeecb605aefb4d210014682984dca65c87567193c580db8f9e74574985eb71f8db1172515d25089dbc92a90ea463622ba1ae32d9146d59372e353948495c3dd09b526218834a064ca56a041bcc4d2f6284d3d87c73243ffb436cb3abc12e36a8805d15ae524a3c49de249190f4d245d67804344dcd052aa05ea1cc9534e4f8b9efbaf1144272fd82196cc6222622425e202a104e6cfefb6cea45cb7936aef4cb46c0c0fcff6e3d0544fc2ece9524f5 +result: pass +shared_secret: 25c89884be152d8641686c8334cd51a4477be723cc9c0cdd6092531dcdfa76a3 + +# Official test vector 74, seed: "deb963f8b1d8fbdf499d564ba8d2d47915bb402da02f17031b37b4039a842afb9b7e48f37200605992bd2429427a7a4e" +private_key: 401208d8b00dd0515a1f7c23013c9a8d48062f281437a312e94c7a76055580b894cf66a7795c182d889a1a940ea044112a265dee346d902758ef7b3500a02f8c009e3c803a9fe2a39e95539702250fe05da8a85fdc2ccf54bc17b540947e280276a084de678fecb73a5d1bc985718c09ab5bd87675736bcc8eb858cbc246fdc07f0a7b3dbd1656f04c7bfa3854b502a71db111fe2c36a25910d37a5c357ba0667417550071fd0b0c4ffc094b37b67d262734eaa64794c5e0d66d0ed96a5d7c7f3865ca8579b89c2b7349b3134e43a677680414eb2d88587c73192a11e5088d673e65eb1e88fbcefd8aa72b704521749a384588a6009b3e41cd839313ed00b5b4a14236835055a875ada5674a1959e2746e3a38a1cbc7bc0cf6a2c9ab95c135287bab8b7d12bd8dbc79d2e6b36f0542ec73bd66f6949ef00975f74ec8f31c0cca8544c25a431c8e43a9c0c99545a18ca7c5f28d4e0173c4505c5c4ba94e1b87a3b4b0eec5759bdbb221530ffdc9048517102e70745eb09079f376914b643ecb3fddf0b68d384e2fb727bac38148d897554cc8eee5a986ec0c2081a2d583b73db69bff054133e18e0e7b52e9e9c5c0e088a99895baa375f5b27255f1b64b38b96b91b08afb5b36371802559f240ac4bc4234d8da75b6839ecc822721a466e0f7a292723286f38646e396e7aa3dc9239c3d621fe70a2eb14c37139b878285435c682b9b5489903bba677a963509c5ba412f8165bba029084344445e21bfb1432f97b27b3377252df129208c71c41a10955c79c6b6507b1067dddb8e1331897854897b6ba01f79ba6f6273cbe540620c27d731a86719903fdb5534bbbd9a9275870103d9bba74b694595188460b80490e0269dc678fbf0cab0918c59958ec297bff5e6572b3133660936689a393ac36f638883d5a95e1d78c6460c692040a9a28895fec808ceac9590aa8552382b31a489ef167429e63c7387b794552cda972d4dd3aa41835bf29315bb095b95d4539b66008887ae15e66fe561534fbc973f4621c4f41ab9498d0ea667637c5e563accb2b0429d580cee038326a8413271203b93607acc70666c50e34c6186d03600043ccb4c7e18a1182ad39eb49c0bcd746832b1ad47bb9248402091872ba2b68d25c0b04064558f9453de628c4c983c1eb202fa724a9f373c003da76c37743a452d8f765d82c292468c28c16c9b26a2727df96b26673b191b3162970a557caa63827b5a2b631abaa861763663d08b72b712ac53990a35b57f99b5b7d4ca3035a590db287e1513193177f687157ee74ae10b73e6f24e8838c3df29c6d8b78ac6b70aa1ea1b6467b6d4319dbe98771ca752c9986006a687d0812e9e46374563a15ab32c7b70b58a21c976816192d36f04634fa0b46fcf202b44e684008c624f0209ddd64497184524032982dc654fe22751846a2402c17503799e9a7d686326873a4593479b615c13f91cbc3abc952bc4792ce04f7a272921d13e34b10a203c2c06d65dda903287887c29cccffbd4059c5b1fc2c3b7786c0ea2e49ad792136635982103473657ca2e4b32881b6ebe8c4e7c63594d34b341f515689b7c671b4f40fbc7d8e1ca6cd4016a9200cbb58741fb21ec84030f6cbaa282b9fc4365196094dd39bc6447739999041ee1055b373689589da7a6a23a007145ab208bf56ea51c3d68e2c3b4cc4f0da518f9089d4efb28c7f746f0b948a2955e26db2b5ecb7c6db2694db5ada7a7aa939109b1d0604c5a2b654a4674b636cb9a5f65712f404b4edee505093b1fd76b627b32c4c42910b1390ff03c30a5e79be6241dfa39a2d9456c331c4404e7a159b8a89e10588e3446c7151d7bf31a6b930f09312b5d798dd71c45b2273f513c8279034483ca7010a9b3d597cfc7f699e649a99238b1283a935b199f57f6333c2a08c553a9bb8c38109319486a4a44d71a5317ad4ecaa9b4548b86a9560969690e8b02a38bbb628391eafa6d2eeb4a783c661f14b9754a8c2faab853dbc10793a61ce2b1eb72c7e5b15789fb1885e7bccc89c03350a047b811c54738fa91219744ce5166a4882412c6898fe9037b817099779968eabc1261831a6c0a5f308431d8904cb9d4a1bc8b79f0ea01395088a5377935c26906093a34e0bd61199a9b8a06511b2127340c9c0169961a08e3658e3c8607f9775ea3b57a481ca307a36b36780efd410873f9067ef06a6f75b2f695620c9753f97b167df14f4b59a66ee953aea71abe866ff3e34cae61b53f5842a9ac3c811abc36798059db5a51bb1a003b5687dc73e279236e69477cd03c5143b6e22bbde999379ad131215c9c46e37376402d434a58f4ca4c5249c537b15937c38282d2759a45243ce36d24eb234c5bb875b2594ac89e51564e43d2869edc93cb2143d3f72c6d8672df16a08cf94031612199c224e25bb223fb646ac5997b806adc1bcbd49a7833409515c05238aa2c3445a290eb4e4cda6fe1e61fefd58084db9ed675b608ea1bf660195c226a6b70cef5a114ec584903aa427a34c4f75b7d0dbb4564c72c2b252ea9b99173659ab3639d3476332c74aebe0b6656e3cc3f99206406718e5718e76bbc2dfb8b409780263851db783979fc5ea3e4a18d6383762c6d5f782e7333876c10414dfb4548296d33947590534a01c399a3731ddd4c882012bd0b1448e066c528f28c52d3c34f1ca1e2da234f571ae9921084179a9673091555b9d671aeb33a3c41c22adfaa8ca800b92e9401fe31b35c311d7820284fc534c928bfd575881e5678fe81803ed08041475b0f4a36c7644441a067cb35a633a2afe385ce1a1b5c4f9c4a1580003d1aacc548a4d5e7c94c6a4799cb843fd4c6e6209e1eb1a71be32b501b004ad9c0d7a6b44c2970140a021416483dd835e7987b779041aac46806a1a538152e3b716beab69a86e5291b431b1eb68105380df09758871335be0735b4a22de2c4593da03679622c2af78f4d888fb178098486602b743d72f25a57b3533623b57cb905ab499835093b1c4b9d40d361fec791cf82a17417981ec713514ba50b46608c1307b7939ad5f9b1ae47ac2f0c76162161cf0677aeca801504512433918aab949c078d46399d873b0a6e9987e9aa71e52c5691232b8bc68c55508c9bec555d17a6293525d297be94559671c0209561c6bf7859c3469772c25e0863c16c9c4aa453862e52ab3ca942d887c959850cf4fb2afa3420fe55660c22516bf8c940ebcb1ddab9a36a341cc144a646321037c07231424e040ad92c706d254e56f48012601e0de8402221711102be85f54d3bc513481c1e2ae6c50a022d056967c6b032c99ba89070847bd5aceb4669619c71f2b7581736726dc800a3148bd2871d8bf60708da4cd13b8822209bc09cc2a88a43defabe6a24986d697fef253aa91525b3a3cc9f102c9ea158c699745b03af77d41d4df72be7fcb6b7130f308bbeef6ac699388976a574ee1a74e84b48649bb32ec763227584ee24c0248b7f5096c72ca172d2b81982f676dfe44a896618c77393475521eb6a6fb8ec6e153c72d7f8c9067a765cc4149fc58777974f96411739168deb8a6b0e905997563d7f13590ab30173bb23f7b7440fcb6db8f910b12958e0b62fb6f84fa5aa931b118ab4f1ad6374a34721c053224b04cb07982988fa3a569ae9342953165b012f31728960f89d589613d07a2b16c71e0ec942a812a72cf90ec9b23118a59c6bf7c273c6163a8470b18c8c2ee76f4d2975e7d79df7e80e759a52e6b689ebb7bbc7abbf6609560081aac3aba2b43aba545951427cc35dac5cbafc7d394bbd57a2854e84b5f0f3059a94b35f3b0f1ad3344cc2a40fb89a87e091c9c0125c0052e8b28cfff0c3e0390967e1364a4ba8c0b77a7fe83a65b76255422ba7a128fd4b3c8ef85fcfc16f80ba5701c9a48ca230e455b02b28641b98a67a851f31621733c0a779170ebd690111f395e7461127481fd8e1057d35b6c20b1f68322e72e92a2363825566445544995dfc08ccc492f6e19072e398bafc32eff92c7e229f87d1327bb1884cd04849569c415860df59646ec59ed052bade3a0ea6bbb8e9d924e6c43aea22cd4969528d50af83b977d4f8681fa52ae6f5a60ec1cedbac91b14b70d46c5ea18551f288690c3aad6428939426326c54a80b1c6281d51b3d47462f18c6c5931c60395a1e74826f6c258f5622f689c4b5470976a961934104b41100142854bbf75d40d09bfd9a0e64575a7546bec19108770c19a7cb48208780e1c657863163022c910f071c59f239a23cc9f1697cf5177f88e7580df8c925b2c405a3360d0a80a6ea1486136faa9c48aa3801ee87b7cc5c638d67be57548c03711f9b2b31ab319d45c578e5acfa30dc426ac3b194230a4bb5ee07f4c5b86efedfe663032fd6ec053e7ae81ee85ae4b3f808156cd357c2b36db2f7fae03ff73e02a217659f53d8c47556bf3d8c94040f630d63605e2d0f923579370c +ciphertext: 47587ab04e0e551845e526234cf731036de9817d48ec4510a84cb183e70900d2ce322c999a9d08e654d466beb2ffe46ecd746a91882bd73176f6077ec0fbc4f51117805b7541fcd988faa8d02ce31eddb953410252ae9caa86e2a5d3079ba87e986caedc21c12944c88401435ba434bf0770446a6c4ab115f22095592487f89f38b6d659e9c800c3c901c140b6e027a5dc357ba6ff5489b20e3fe72ac7ba203b1655942c663cc98a31e7a745ba46ab052fca73acdf9f898101e8eb8f4d08a8f6352911e90f072a537d29f512ecb10b6fee65b2e4d8e529190df6ae31d5989c62ec4863513f28444f470abe04f95f2c0e79891710002572b43ea8de4841f13d72e97eae417254511bb4c69bec2040887b01e2f4991c52cf5e165fd922692bd3efe666af3a5e3f3ea046d160dbbd10e2859499e6ec260dd4db9b4b706e889a699c511ed02ff2a4cd562ff56039d4876573a6a380e77d87fa880d5d8bd7c8f8a42e97df4c80135f8d57d300736d9bd9ca9e8e9849e8d8d7e48a6e89ca52a6859615b6ceb2b412bbbe4ed6ee4c9f5c21c1574003261714a4ab95bb2086c88c441cd3425b6141a016d582269c2cf6fcc40f5fce13b7a882c978119e0c839c7a0129550155312c90e363c7ba4276114200a230da3f2ea0bd3b8363a73abb07d3b31f28100da8899809e529ddd346c78a9f017408656c943bd7a028322ada4240d47d33c84a0ef2bacfa1adcb71bc142d0e6c652b1549271c9dbdc4330ebc71581c1d36274f893429d08cd966e4ddceeda95e3e8b2e79c4760342dfb8620db4632fd20b885e96d07af21d603781fc4b39c7ff245b0e8c29dfd0b77e108a1ce8f42b5ba5564968d7cb77fcf3f5bc7ade80e6fd1d6676edcf06516193e481d3df21e36fc612e984c63a1c44d2a7614760f7b07aeb9be403912f8071b1a8c2b13d1bbce9e67ac29896cbeb5dae6f87431b39c55253c1b929f837d74d053be5a46d56880d96f4047a271861e418f870efd8cd26b351a4c15d7f9633706ba8fb5af7e967715a8a94916af9a015aca2331c77b95546f48ad8c8ec3ec00c048fcb61ea5af8191e617294e92e5ceb7a19b17f7af42fe9972e0166395c812328e59042f3f2790fc85106cb87ad2b318e201ee9a597f0cf982cf313196e02a5145a83ea1a0fc8054b42ee6d32468528232240fb914e0178544d6d200c1172feab5722290195444af68462057799dccf6c5b2b6a5add344d66d8c100b9c3ad1654ba1fa424c0a23772dcb1b60d64c624292b24efda70875ad9fad1210c80f6ff7478d9a14926da1875bf614eaa412c14d01cdd9e790d9c8488edfd005c9d3e1a034030eca417fc99b91a199cd3dfb4b52deffb565d4de0c569d92605276111693045fd8b3b3a84cae2a4616c6f249a06c3776e9cb4a59bf40e64207f180a4807220115e139c23ad7a3573f3012c05177a4511dfecfee943b650ceb60e4000bed6acf2ebbe270198306d079c9b6e5e5fb1199dbcc01e888943e808f414ff3704169c1d5870f5d0001ab5e844d10a8f0562103b79947f244e4eb9cc03fd261d9dddd5fedbe4592dfa5cba8a642195ec97b991bb52c129ab66d428d23a2e9070968604772783c2a4f215169f7fdf3fb38df8434e28f02b96c61cd6b86cf37aae45f637b1ef2aa07ad59899720833bd64eff30c485a8629a6a416e577ebbf9e770bf3ba067c00ab935a98ba543bbbb3cfc1e8e1cb51be7b62d1c8d0a5fd56fbef29a23815e053e16b5324312d060d4b1985ca0d855ec1dcc61a755633524c0a3d685b147c5a5209317a8caf4d6c22f549ab539ff79e32ea1f04e0a7ddbfc6fdfd0fe4188241f576c6e818e2156d64188a64548d5b19559702bcff4bad39f5af66723358804567bcc9709d0d4ffb402b48b4ebdb79c10400d43ff175df89f60051d5c1b608d87671a616c9589e76bb6156f6561cceb30babc2231147c7e7d3ca1756d02a401fb6412117b0b6e9a9e0f6dfe9982fb4c736b9996c16c390c6a0ae174deb550f5486dab3b4c2bf54c02e7ff67e9f3f00627d1e9b4762ad6cd629e765af4b026d470bcc8cc7d55834527ad061a034bff65afa62ca6b8e9a9961721533f318050e1ff4a67091fc298c9a685b74e035b2aec08ab44bb2f4c4e30cf788ab3ad83e488a517862cbd9e62c20890533af39c006f140cd24b5e0258e7a7649cad69a86c0bd0e5378dd65a +result: pass +shared_secret: bdd73d5ebb59092071fd710a25275c1dc819f549b5cc34b6f8353d13be70189e + +# Official test vector 75, seed: "8e2995f1b3e43853b18916bb1212aceb05898e2b177a87abeb928ad7184e59695c56b2cccf5db80853c28a525e327d13" +private_key: 76a86ace9756dfb462fcc13e1c01409b79a49c256d8a75a9a30712f5e913e38240f3520c11344f4329c3372ace01c1979b75c641dc5f0fa2c2ff1a8055dc61dde093315910e032ced42248ead082e9b355a0bc17cf349b2659555d5844d94310633b9098f3ad6353a4fe71809ee99d05c5a055a68e83a35b614361d4ab7e4bf30a80cca2edcb692c25bb35c702854c55939b88e020a329cc35f6f702c94740a614390d6c89b2fa2c324681ce4b600d87b0adc91aee506b50f40640259927b120df4a3a2a2c1411e1a198102b8eb03fc1569b83daa50a7687e1f8b7e2e16b5d13ba38905ceb285a57513532aba8a235c4f9566d1bdbc64be56e4b088e76854868377665cc922cb0a401c14142308e8851acf4ec8484177eaca16ab5164a37f8bd12f4b514eba7ff555ed43415eea7a4b7b4ccb0a08d507992ade401af6a60426972d5f8a19d72cc2409584c4473f4d8088e34b376504344c242c6c7163ce6ca351b3b40a2ae3b7c45a96ac3c30136c880bfcd4166014736e0d575d72c9c2b1278db43126c952b393c47b45152b2c7c59253b9b8d97e19818a9b007fae17765cb60c6722014c6562aa4723c5a33ef63821dd9464ca298b72c68e80213613953e89e2b0d3a4b18347030015cdc1a6716d8a534b5031a5367c70184d7daa93533b46ef97a573fba6b7c39c9971b1538cc1b708b921196e97c7a3658ca9efd1670b1b7934502896e02e18fb0f01b7a8b9b81322951ca25714da90baca924c56132bc8a09b52192de63726d30186146b8b2c233f08acb46092b5ca654c14c92b69e1ca946812fd3b0fe56ac13739bd2fe99c3c62c46ad3b39b4214a3d8220e67a718a16901ca82d59c08bcc7cf2b6a3abdf995ec7a38c06801b0a2ceb88937a3164424161403fb639fb2ad6947a7153ca7ba8290f099a7d6d8322448127adba4e26c5972ac4ebc95905e7148023bb74cc13684267123f57243368f0c141ce0b05f29a61866f99a15a2a85437cf651ca4ed718e5787a0872c536f86198f0125087bc898bbbb479c1dbfc23231db78d47b61edb37f3b03981ab15cb70181fc3b9a1366c9f98acfbb3b6e1cab49b4110eee3cc87dd2ac8d8720f48633d0910c2eab7ea1fb197d3431c7b1becc201a21c02b2e4b5c9e85c5a9560b2105b99c7b7b121842a79179057b6642976ef5e650aec633b0b2b3dd14ca2c0206746595113c7a241443a9a0521421b21bc7238ca77691c76be86365cd20be3d1c8af7c559333b5f94a344c2891467a742be4a457064ae4fe0355f2910a2252269c60a2dd723d5c242a055ce73b2c29df12a629ca382e6789cc95f0aa44bb1e1710690056d507392c9c004fb9079d27a6695b762d80b6533a8114b6691845d7e92ccf189bdc4c32f06e986b2d82706f47819f807032ba5dce871f355433cf05ae849037fb6455c0caba5951d4dd77575832c4425cdfcc70536f741b1a4a1ec47b600d430df473f2ada9313f2aa9b972e7e68c2a2c84d7c9b17bdbc9aaa4468598412c9dc325e3b9d8c545b80e13767373ed61c9ad5c531f6c391f293ab7195237e3a2d77f2685c50b2a9e09afc18c18678b97143bbd52823218a60a87b71f321429a5b7ce32a48d5b3a4578a9eaa45aa66e6444d534f4ed46acedc33325333bb986027d0cb05d93e659a6dd5a09f3f820db8b1751ab32c46473b4284499b5165196871eac3730c062be3482ae8d969a8ab5cf3d1234859bea98476942439e2180ada967e4cb303f8d884fed11a4998af1b2b1113a9878a9290f1e846d3ec68a21c8c4026ca25844ed1464074b84b3b51351dd5a7de685ba338387eb6277e8018091cb7aff0449540b896fa3a63c2bc9034a3d99990b0c34d91d464063c4d7ec08dce0a493096149955b5e06773d790c618a881e91ba94d276e034497b433a65d393b3b764201583a3b57c9cfca20e2526e4670725bc346b1330880d4a4ae348813956439721a3d1a5b7871622378cf73554e0d33905e8656968510e4b2274e69235fc63e0ef78745f99236c27d33e676a626c7a679588ac7998e2332b8e0a39ca33d5d099b087cc966a10c40f52a8ce89b905586a95c1c6c2521136516db69ac7e439e000a97031b7378b99d2112ad69a5ce78c46cc2c6a9efcc85fc3932a956ad313536f3a5b9810ac8bd8557528725705c2bd05331fbc20f5560259fa82d438392c7299463710357160f985555dbb2ae4438310e3879982b55f03018c17101c2556ec377b15fe6507488052cd2360b52b8cbc7856c8894cea237e76214da481ef0363c877294399cca9e38c249392d61a2772fa4bffd98165d24760bb90ce22614e892a9c7f350706427ba2257ea7a1304029a6ea715bda9b2fd682c6aec65f70018c26c3a41a30f53976ad8b83aff7268f6d9b3124a15b94528024a179dd24b8c56cc8605914ca89815f943c1c568f255b757220ac606d06a1701457b057ca323ddb65ef076cda0044cac79455798b501463d38d24cb9c65faae94410f79995d917c49319e898aad54c620291491f96362d4792bc3639b6551e5a8b7030e9870896ccf461b65fd82ed0f69dad10bb60805c553a1a195336435303c1c8834c3a25c2832bf7b62e1b50c603951c12ab6b74eb72f4b15abb5455d9f681a0d5a290c0bf0ae79b03973e3ca80d9ed283272592fd0a64938c26803441dda5907be52aab1b9ae14b62f9db044cc0c2f5f48f0b8348a6b26631433dfb00b180b721910b8fb533cfe4a8be1d250d75a9cd492ca059fa115132ae5463577de070c87944bc48695f3b4b04014e9dc29185446e4683ae2cf5b9b3ac399fb6c6541925075b7bca7b7326861dc105b3b57ab55a8117ef69b33cf79665663d3355819dbbb235f9693d7c0062e5293c0a32d7342c18648500f8cb3ae925c530b6507418da33a819e57897849bf3f36f6bd68287f7cf8b5281e9e5af40bb5f76c63d4a14cfbdb8235c6a95415c4aa157568c34ca9f58b3991a756bf5ab9b658d9464ae207206d9d2049d9145b7cc59261860267806a23aa513f3c39cd7aee8e71ae4b3a4a6ccc570f179148c2aa50bcdd612bd81f8206fd1334389b9a726208db920944530ca839f316161b89a59350b2220a4b6c67caaa2425d78da2a3b454e396386c5500f7726aa38530b881640a6870d2e5100ec0c25d5a39bca206ea5652b55a8a31cebc84fa62f2ab6a57a2658240a0f14841e48340cf158bfc639149921632047ace0cc2aee5a3e0f647fc0c671f648c689002d98910f78b34e80c523f9073e4e4c9e6e102818e996d3a30886e7bcf18b69d2a16fba1181610b6bd248035cb90d8d440f6d4729031b21a4e1237d710bddc5040047745b231a22246e517a76d76a0ee7985ebc794fc5a51c17d9a9e9acc471f89cbe260df5c4676d870b8713bca53a400cb9b4fa6c36df97a023ac03b08c621e7329635c2e9828719203852970c2fd557348f5365cc917fd3ccf71d38d5d96336026c7d33b885526632860044237b4a6b09ad392414b068144ac67972b3ce7a25753f631eb1a03b4fa2e9f553302a22eb9c721e9f2bf74a06673fcce5bdb77eb4b525d63906ab2c4e8518322d3065121a20546a8a4eb45f85881ce25721b0058c2334ffcf2946c7b9d6ac05806fa778b2041bad1c1250883873a95e3d5b76a3480d8da8b48683c5db2757eab9193750649e74440dc58a56b3ccc27b2a8177bc638b61e0136a215c8079666c77857018784f38bcdda0c56639c03196b54cbc80b49b0aba6f6a9df352cd09c5cc6e05f62e835f7a125845bba2fcaae4bf61bc55ac98bd67763ec0214cc1b7cf91632960c9ec01e0f27a97f909d7fc2486d0cabfa146b72baa14371041a5336c71305e6e68a43577bc1665c0d66c76a239095e13921c00c4ad11cdb69050f7857c3a1b70e2a2152ebcd0961a936f6146d6a58305086e934061ae32bad1b894cc27949f280320401188775aa5078b1497315639288aa2f1f826b48465613a73c5301383b69181cf14ab3a05035a79de39973ec5c1fc5869af11320350c3c4208cc68db8943a017215b72b3353b77003fb0d513bf677b81f66085e8205c17cdd6b603ac98310c9a967a7b99b8d3af10b66821612333e50d72faaabcf93612210572e6710e482702b17bed5abb5e4a57baf365c39b59dc7cbad13601de6b40f5370a49e5b48c9580a0c26195013e6b6889b99b7ee5d93fc8b795cc62a37ccc5e3de2692ad66e903c74bcc45ed6f16a68ab17d8e5094680c428a242d2fa247985a0b7d7a300f70e844765dc30437d032f216a8d99dcc54da34c0a4c25a8a120b3c32f45a3777467b1e639bcff1bb9839b6b45c7895bcf62307460df309eb4e61aa9cc8941418677001064ac161a607e24e15109d06641e916a660b3e7f849f08b9dcc32c47e4a7df2d5d4a374d3e5718a459f684fb055ece19459eb464e91e126a7a6e3ed11ccee0046da234d964c985110 +ciphertext: 86bd45c7f9fd03921c702aeca836925f7f4b3357a938b39e06cf93ca6bc8fb51b72546182fe2108eaa9a3e2b3e182797e9b2cd3199bf716a8d797a4362cdbe2135197e5348a916f1071ba69b6034a81f145f242d8011b303b872f3a65ddf91d244722d6487694e0834c59bd1262eed11131f44f7f7725527b662f9d6fc872a290d2887486f920d55ee53c68e764324a9141b1e51d83f51fc41f775f28102bcd79e6ee8a6cb7c5ae4a4d9ebb81d8128bffaa3089d3c8a28b47387c3d128feda9e3bea9782557c62890364f1dba9a9f40f3151bf2ef0614aa3c21d20219304b4ba0033f1da2d7ef2a986682aebb48cc2e414e87372b7eb6395e12219b9787ea6337a866cd1b57bc1f92b3ed07b95af0949ed4fcd5a68cac94cab44d41d8dde50b4b952641f9972519943a9e676ae8326b244d9ceba9a777f133fd61e48ee6091181f0eed4fef74ea084d7ea18e1a5dee64c2fb45f7a79a173a661ab047a965e5fddcd09bebed7997aaccddb5a428050ffea4a71ab65a812afe9216adcc0ff0bb452ce4e05350499bec8bccd91d29d99831077bf544f45d2b47ed0528e9a8c70c75a6172d8a356ab9916328076ca9838c9088a70af666bca5a43a854b0ac6aa3d1ad17d44ff57d75f3536b55b30f0db350b4147609a0b7697ede10b73d1769173dc618cab1ecfe6b42bd0d4417165b00008f7a1057516bccf53e22a911d6f025ebed8fb25358e4df02c8d7dff9969f8e0cd317db8c97cea03bbea44a3e54ceef4cfac42fa7787e993ed1168d63766323ab1846bbf80231ca255c47c69e102a5ee0d46c76cbf440edaf8dbde36c5d1977a692ed34428e73a4b5229b73696189194c813819724d60ebb1484a805455e938b74790651a9a4b823a6fc1205c1e96e306c4ed46b16e19db187145fdbf22c37ffac2f754ea752b816645848965a5afcd4b51aecab597f959cf7584b919f795f921dd5fd4eab2adf52f4582dc8849eb5a37f171920413dbd6a114cb5fdae452b0e16353dd06716f4b24b82deba79fe3af51fc98c7d417ac5e735ce3b19add258fd6e0ceaf98830e82e273335aea870e9744505713a083655c1295cb6bfa26c07fa2b8dd8dc97e65955e2001a64006c62392b97ec5df62c88e3c2debe1735c0dec98253e7ceee437ca1541f3a73209b356fa4b2e38c3569cb268afb062319f05a8f2853c9f081c5185386d5f5d8336016802d805c536a72e13d54c13aa3c1e1bb79e2f0dba1c143bf4d903b18cfa956c2b5276def5bb0bb4b5f89c834bd19e8badedefa2f0274e83df07fa989537ba8b8cb8af458f7a02bf44b269d6556dfa91ecd76636e56730e35b07c45a9143afa4cea876258caf6e724d7fe0ae0386b9eb3f2c45fcfa31e8f9343e771e8cedb9771fc864f0a728854e3b9fc4b04c30f8c8adeb13c6489b66c5f68aa5cccfb25771b666340747d0002bd70f76ea5aa52446f20894af51a9469f49e16723ac9e0602f1ab9297f072daaffa8b4104264ae578c1e3789fb405f01b44c46548944a46c87b3da0ac08493fc6e0239d86568b1132c2ad430ac0d76bd2046bdf31e98b3bfa83eb29ff895c05cebf28edb792e7678ac7379578c1b6738ff0ae271e9de818f7071ab22798fbffe9a94e728abbcffa249be1f0aa11bb428740f2ee39bf24858bc583b1aac546c1ca09fbc87a5b46df572be14e6fa9f6abc4cbe3bd41bc100e8a4d2e73e60f5251c931cf133d2883de857dba56c945b6b80a8872ba0f505e889f9033915912642c5cd6be706fb39100f3954b93498f19c6c880215f179a331859af35da03b3de56f3c18fe2f2bd84ac483aa86fca3698f82ea27c15fa6c844e225aca5647abfc0747fdc5570fff8209c288d01c7f405bbd4d2da146b79c4e394f999ca9ac92179680943a62fc5b7af0e4cc71fc15e639af6b70d4df4e2cb2c7382436cc62ed422186e5f88219571786bcf60f3efd119dc9e06d2cf0c9aec122072658525f86ebf99579e5733f4f8429bfcd75f0ac58bc9823eaef89deaf510503b51af131a81a58a7eca063c310cbaff194924e98c4402beccd0c7e83c1233bd87c6b32039db84d961508e60b108fde7ce1b5f74ecbf28362c1db18414d66a75742c5f2d6dc3069960cab26d2447d7fa3140b017bb3a4e06a0b8183873c4f79b54f9afe05c7885a3105e49b30dc6beda36118f074af630ef7766a34d2d14568eb02de6 +result: pass +shared_secret: cbd7e4a223241e16d0527cb926ff8a4c945f11314f238b121a387f9aae140632 + +# Official test vector 76, seed: "9218943c51fd2de47e509aac67eff176795102f37d7a2017e3afd768fcda7877af38739b00fcdf227c2fd62eb635942c" +private_key: 26c5b889fbcfb6f91cd0805ff87c89368c9cf82c43aa70c6f59b01e297bbbaf7b8c9332721c2bdcb0526788204e7674eb1e975e3e609c82a97988787b8bb8daf49763bbc0fba822a3dda19509bac10396261134d0402073deb6b64ea8e0e98a55fa2cd37b14c1e27cff4e64c52bacadc319d57246bff7145adb11d06ca87f2939478eb094a06361d65aecc8b148b653ee2c15dc618535903b26592c4c334245661830f15638ca13583e387d92c6cc21ab77eb3cc13969322c8521809346a873ee9d9b888b695f695bba983645e22b1a6a30bc05baf1cb49a51dc9eeb5c9c7077495e6800fdca87d3a15ac0d8cc2f2bbfca1626107b3c2a670039ec12aec506e82040cf72ba510881a408595d22c88c9c8d0806a079fc6f7fc32996273a0496c61a22b9c87926aef37097c947eb5875599401d1911b175a770d901a453ca20af484e9735a27a7b4cd3b52a2409a567a369801818e22314ab369c1fb93a9f2a669f4028128bf3a929424d84ba8c0adf7b111a45b1dc6430bad947a4d19152709001c069e1b0b7c00a05c3c420478e05e49788e27d712ae99029037c2e3fb4172d0594d69cacebc05c5d87a8bc91662071c3ed07d84f2bd477454e4fb37468151c0c346053a3adde76c9575386f63bf44ab4b23d3852e274cda84712a28777d69cea67463e563722c90a956057a922c72a5810b0e5895f09baefa947392725c4211898181acf14815eb316855066145063b75260a4c281ba96538073971ac59bc5ea863161a7c0aeca766526b9c627d716521aaf55173fb8eb7308805b47c89a520404548a144589d15490477ac5eb56c62e441d728a808a2ca8dd74981d205c11813ea165e05b938cad77be34a0d1612cb2ec6c90e6283aed35065e74a4d9905713bcab3a1105287162786cd7839537f186bc6717f1132054c482ba0765ab95cb2b4bc4e15704f5808108244bcc1490338ab97cc94a2a02814ad440d34bb7ffd753dd5535f6b7b1f35bb44656726229522e5890ee2f3ae36a468c3c7c21716411bb0c4fa11a3e2baa334c149483a404e5220cea6926ac56dd1fa856db5ad60bb86f0a3cc731b8ac0c48ce98a90c6c20617c8c142697425a7b6017555c7012b63769d6d817e0a810ed84cb436a2cb9a2167c7a0be998b9a42a43545697577209fd09a03d5c902e9082091d0c933665ae84068d3384066b197c71a07c4307fe9aa1fa17436c41550a0337cf70c68a9220df0852ad92853f7fa25905b81c528bbeb8260bc10654589475b1883b77a672f7bbfe8b9bcf5f8b2c432994d975cf6ca8cddc929088c2806fc49037b3c8052448b65812124c82cec2601268f0e998bc41854de6350f56b4c3d31acd427910c8546921132e88a8d1f9c573388cfa3bc93f57c6345682387a69d4220b756f7546d5687dfc9586245b6bb08a9d68263e67c21135301ac1ca2c08a1523132c6cca56b6c05c91d33c44bccc515ab429d9a812693eb1f3380e69be20fc81c76b57bc99498c52784ef3650bd296d6675c7ccb55b67a59cbc09d44d9499a6243140040f2e30d1ff3aa0cf66c6569cfa6d2ca8517a1d5c87fd0d0693ef20d8e21ba5a4a2bebd77cf55698b1a09b2d05bbf7d973c5f5792b165c35bc17f873a9dd95a696929d0f3106bd685fe83871ec99772ba3c21aa523842138191527cfe7646717c65cdc2fa2a9ac97e818625455c2877346b378a4653aacbb1643f075762a9ceba500f0283013269f1b970c9d01588a149c1d8823eb214e76dab3966a622e815ffb22a39e2cb7898b4245a82e72557d51785f3888bef9bb9f1ff3312ac32a0524115ad1897753325378ab94b50dd5172cac3a453535af258a05d57930c035a503f26af358c537519ff53c0e602bb8266abb0a1854524b5311d7488754b51c672fa0b3312e356a60c62202b1678c241438d22720963a0ba51bb4441bd3246adb2511dcd132abbb85c18ace9185907dc3175ca0cc9681c52e91388ae5b4cb4acc4183c588a43e08986e4ca45770a5a40913ad353549c9652d60d5400282040ce17af243614ee4cf045b2c10b6845d8a7704d4173e5cc2b3a6439acb9b2df0901bc229c46945c2a81c7e7742fd96a71066118d618154aabb8e7c9c45b2436f132e3fd48fd5ec04f857b24737c4ea5c218f52c562345af7a1521ddb8ce3e91a2835a177988a4e856467f6ced236ada9bcce8ed885b19b862b952cc8a2269f35826a290a90c170b7f9195f816dd631b1ce66442469c42a420fad3970edec539f11826a4a917ab105123b4c14087f7b2455202a5455159e828cacd84767e5b9c024f4ae6d37596ca7570fabbe591082de627fe04a97f45409fe265054bbb57426b6cfe71825837b4be360ff7b48af3a7226525b77c450cdc4a483a17d77e723c8b1282bb40fb621731fb504277ab50f171bec369818bc3ec22126f6a47ca2937f907890c7815a1e115143f62f58550a0459ce7e04695bc7737787a972321578222f5622449010287ab844e624699a1ab50bd872cb29bfd534b401e538c51c12dd8c467a14c24f5c9856234da17ac5fa28870dfb70565ac954c440db457214016e301736520b5e15538e92d1cb205776f849cc0b23211e6a67ad5c9fceda1577e625bd271587f939fb3acee14135613592a7364534c77c2a1564151c12e1c6a219b878180001e2c94053ebb1282c5288a707ed7b245f15054d87b901c939373244f776ca51b3b9d00628c9a8165993974bac2c0b26715ab1a1b9706e8264a0d210a0e627ae60b59ba58a4abbb61e93f0cf31230a624591e0d1a368390205d6526889640651b7cb71c26807b11913056629914fbb1bc2545b55b2610f992e73812e82b73d10a541a7c8621a4690b2c00149b5b952e91d992c52e8426448e5936dd41ed7725ff1c5bb54803690e7b642805b168829ee5696b5d51a13560a36409a1ea41f03ccbf6bb86a1b205bec128ef81c2af9701752fa54cb3784081b5dec67bceea87a8864bae5bca2aeeab4eca30d460b4015870c0187b2519783fa030a3774277e018274775ea2ba027b8624c1dc569416a3117b57dc5b34a1056e4c9b1ea54b6e5f55bf1cd3c027cac8f5f9b9e4c921d98692a007ac22c6b044f6ac9ae5acc4aa3062a348eb2cad9e77189131bf56aba2d86612e01accc76b3222b01d30b079ff5250e0869545641213c175bca181eb738fc7e80e989b43a0c4c7ba0b41404abe955c3c01859dc17b35f48cc39e9c6ff84625923c1229e9b7c3c2ccfa760c8808b43225ce4fc96bf0c0affa26aa43341f7f14aa37ba5d48798c1661319b31325d04afa0759c35153ec77b07d5d88050f5a1f55262860c94990460341c6eaa32055a480547bb0829d5c3398208018b4c098ac686f1b18870864e2cb0777a798c221a659a0e7e9c5c2936afc4897a611c55086330ee1689f7817f44a6c127a53597576f37b35b4f74c535444abf5342dcf256d04800b04361adc83a207952fb81caa20cc8dd07a6fe8864e562844882b405b5b4b65c948b237b385974a9d4963068c3e5b18c51d42a7a9211d4f274ee5208e530907db49db956b8e10977e2357223523a58b511fbf7993bba3c38a95bc0b98062312a1c9449ddc4082601780ea65a6bfb1467a01d9e326cd10a8e202320d2a29e9b36ad09c44127820d6d024b3ce0c818234f55d7855b0b000462b198a669bf924bc81c99ae0b32a1c21f448ac6084c71a59a90fb43aaa73266e69a077d16a8d1443de4c2b61c3ccc731437ff744b7a7cc3a02a948da951d5763f078a991cb64ca7b049fa1b1eecb534509aafe04437e5f84e974261957ba746705eaf4528b4ba3764816f45045d40e807c14c3577a25f75f69ccaa136ce627742e33db588bdb5cc339ef916d7a9b108180a637586da55085eda466e3c7734f85e6a903ef0fc91ce793910231a8f46a7e084c595177a501b390eaa818c0a9fd37c9be78160c7a398f0e80d8e58966140639656890cd08f7fe92fe316cb1e1517ae7741445a47c8ec3ff8f54f476146f1095f9973062bc17f6723542b0a48e12b7e4dbab100f3bf6dbc219816a76a3109ebba8c823cbbd9176061d072d57726cf12908747bbc267c59fa71f6c719cc7827b91919ca3793d03a73604e1c2c98ca2e99877b6c2b93c97965c06b2dfd71cbbcbc7c81cb56b36587a174e899306acf88fd2689e345a78657c5c0b65b0f3f8206e405dae4738a7061d54db38bdb2ab87e8cb6dc93f2ba0c11b65712840b740ac90ac3404b69cba2123cd335004d8e363eb08148a627b66b4142f66b18e460b59d05091640587212f4dd60b84e61f0db00ac05b15e83a6e0ed3c2bd281161cc07676e12ef19a936d073d684c1491518bdbd426eb5a1463cea8b671c02b230ed109318ca7c1470f5a0ab154b74ee3990ff20ca8ccb835adfda4867f03a8abb0a5010f400ae5722a75bdf5a2f6d5b546b34d73857cb1bfc7e587aa7 +ciphertext: ab3bf275721fa888504426dbd58ac20a234331510daeed10186073ff9e2d7b156caccc8acac8278c19968e136956b745d6ea41832eee321f9ed5ffe78b15638b64f4e467c8b02b462baa3e1a39fb6ce67a53699dda3848bc4707ad980be6ef1dd837a3bee0f2b5c1741fc83c6dff1fe486f5aff17f19596b5cfa50c48661285c395c5e74191f37dc4eb0d47bfd5224015e7b3443e2f41365b338d7806366059cf7cc8041d63c7867bf425b1468f2844b7c37e4a2a95f6be3f971002edfb5d9cd697a4e04ac19e00cb1bec5549a25ea22d581b2f7dd9fa57dfa570ecbdb6eaf15e96507a1f8eabdb5a56c93ec3b2d935180a26ce884e69e550edccffb8d5511a2a67ea30aec2c689f9209e11607ffcb3d3e59eb43e10864e45ceef642c74e065e671cf008efea88b0a6aee56e3208611e05b3251ebcb23f75ce7dcd75dbd3f393deb4a6cc4cf593f3c19515739d4f8fc3f567bb73fe27261c600608715e599e43f2f0fc408578b2ff7bf13dedbb9607e9fea6462cf1490396db33d1e86f002dd0ffd8c04c6364f422ce22c6a36cb379f6a8f75ef6af6cbb771b9a45f5093b3f0891a1c28c90577c3ca9c7e72bacee041ccbcb8504dc94d0e61c707c2bc25ac907fca7e32323f9b8056ae7b655587e77e3101dd9c7901f81472086851b78b083cda5932ecfa518547f23702ac75e09fbc45dac81c94817908ac1ec29aaafc197b9f743b87cbba8f5733730dec689648da1dfb24685b79b4a4b78cf9b3bb844fbbe52db29e96e71d0c2dcadf6a9a02fe25181e87ae45686cc857de917a7b60d6dcbb3abaacb2a6c6f8d59e1a052a9120a85da873132ab45dea2cc5fdc593513e172e970af99e73b9717e2e2e85e25081ad945ef3397d7338254a60d9549ce995518d371c0c672331405bcf88d6b3122eb55f876753520166622e6176436a9105655a1b21468608070a683bce0d9a959553a348591138c414f40ca3b7260737d70d79f5ff67327cd0811f695143f48c2fe55ecbeb7b66823251f97e7ee1689578548430cd832eee8701855c9a15aa932290fa9e19c688be321c4136c2dfa9fde8d7ad97bd1fe0a1829066616f312b473c0c996b50fdabdeea8fec2e88df7d7c8532a493baf9df9846292803fc682bc89104dc1f83540f3e621d0d8c348f0ff85f11a2d0d0d702857d1a68124ae30ddcdc38d38bc351873ae574f1c7032c524c87b7c38609840444f73c048a23abeee5bfd4027a26d2afe6a51460ad081a8ae98e881272c39036a07dd34b839076484b4bcde7ea5a0c4beceaf0d0c7e491375c5c8f796e64643195960243816a25f6f7e5fa1ec23f5b42c0b76ce60e581b53dc8933288486c400eb837f660be01982b8621aede8d15ab7570b6abdc9a357b338c681b208ba9ce8ec3fbf70994d5d6050686604dab7f87a27dc041acca71bc9376495ef033135ea27b9e3542c2cb980e6f6b75ea5740b1e049bff28b4f33f486bf8bb952762994df7c12b2907457208d700b485da9cec56362525562f7b967725a506d0926487f2994cbfee7f4c945dfd228894dd9c4dc30985bceb0fb4aebb36d8a6c0f1977593beca4834fa25b24102dd56623e725e40cfacd5b058dd7583fec862b5dc44ce3ed116e24191d342aac3e012285e511d4987f0183d032b37d24c19f54f35944a6c131f0558aa4df636ccc1283224aecf4c3f5b77b7a5db6405a51e060c960c87ec15cdaf5e080a089dfddc90ba709f6769c28a2be186bed959ae4b6a217b51c607f212213b1230e7015ef77a893e5816fdb1811317e321be94f2fa0bf398b8a52acdeb9059c37b65fb6ec48074eb376c522abbbe9f91d1e5661681bff86fa11d1130ff8e03ea5cd826bab22facc03ace0c7d66e0439f58f90790f1de4ced6a69b21af46c09116fdc8cc439c8e64d83d400326202921fd5300a3fc4688b9bd2fcb193d91e460dba2757a7e6f8d98aff772845df9041ce5ba2bb3e820b7af7a77ba40d0330bba2d48fe5d7ae02e3bbd01be2acec545f003d02e7601ac1ad0cc7b696905e420202ba9cf8afa16fb199a920aa8f95115ecbbef6bf031baa16b02ca8f390aaba0a9c13f9742b3b7ae7e9200307b76b79108022798a4a9dda95bfc45992575bfa04f2c69d1d887e95486438b6b19c51480afedcb28712b2ca165c942af6d08b8051222e24ae7b22dec5be1843529866fc2a9ee3af64b27a30f +result: pass +shared_secret: 7849697d9e1c731b82ee49f017fd67d6bcb906408a9b09213b075f6ecb658387 + +# Official test vector 77, seed: "542e20078add5296050af150360f057f6b9ab3ba835589dd56987de805f900b906505b5390a0d86cba28038992dfc59a" +private_key: dcbb8186f46c07bb4d36203fb6c89a5a487a0d16c2aa674a1b7a4724176d0a3a3efa4c42a258c7566b39ee2172b36b8102b900327b5c97876d2df233951c6ce26366c264b4202508fb4b37fab78977c76cb91707c32b41ae916708b108c2c303c5958c3f8a84c0b44ed504af57e31baa864871871583a98c4360a8b467ab78d16715860e4f112f4ce4a203e154e78c29ae4035f6a6b3df33a0118b6a70d5af8d9a95c65a6c223398bf541879351943515db63a4c97f7255171cd45c34c803c02668c73397c4adcc7874b2346aa6123bcf9050c22942fe7605606b745e6b375b35ef4b3be364353428abe7b29a9c93072e24b6af7904d87224b4b877a204180ddd63281d7211c17b8dc2ab00b5c71cf086e79b99cf1f7834e85b7c8e403b5e09c15042f5248c665b6b85bf84168d0165ab990eeca036e822bf6499f47b6162261b29f44644c78200a09bfada808a8db934977956fe026aaf342cd768d8f68ab2eccb64d67710995ca46eb10ee5b54d05925019510405606633538e45c91cf5c8d285a42eec3cba21509356cca48633e40b26ae5689e51a618b8b2481b780f071451d6c641911183184748185aa629b316139bbb8b666b9d165a24280bcf695b0d7a539a7950b0f133727141618605c7d8311ec5c61d153badb14117a502f353570c051a7975cf3e0031389ab13409a699ab4b8711c5b5188d71d4195ff54a3587b8a965280326afcd609e7b133da87ab115e63963541e512a6a4966c9ba569f43f68877e9c7659a7f75011e5c9757d6ac23782b9579032a2d83848f2966a5e007464c1f26510589269acdf80d28640aad02142d0c02368203c80ca9d6274a66083b194200df05473a056b20449d68d5af4ad617698c1126666276d38368ab87b104158e0c025dd5b7f8835e9757929c75814179943f05467eb6984bf4600bbc99cc7022fdf21a174bcf7d1504a69ac7693c175cc1bb3aa93dcc1c0599b73b1fe8cb3daa93cfd63dba315a5bd84d5e13b59cf15b86539037565b4e753ba075c9dfb049692525a015428f07b8ad5b3ec2ba89a4691615115b647cbdc9787d3f51109fc42a3c6005fff13ac191883c2683c6f45143e298ecd57f63c9bef9294d7a6a00a2737475d46e0927cc2a3c172f4a2fd960470bc4ca50db3b6ad5902508bb7538b7f9a9a42922104403a0d22bad7f36033c91b6acdc03205ca685e144bf72278efbcea55c7fbedb3798f0c2ac2969e4a9c742e6435400a9beb5c2a7874d971a36a278aac25113f382aaeb0877a2241fc3b089e929b806d72613007924c65c72611d243b00554a864367ce38a1842797cc5d4270f297647f1a4bd87236de55c6f3d1343e26708a623b8a03c3d3043055457a574c9b7b6a013d501189828c99a33d3fc715be7cc72e27cc8b0a397b95a79fc5b78bc5179bf1ce44f71a5d699ba34a271ca67409c115bc67b6a7790d384026246ac0d5fcc0d0f5b92ad2cdfe9c5b3dab52f07590ea07ca292cbfd2c44321c4687c385760988c0532c3dc237a9ec0ac139783d5caa0ebc76d0c25a8c1a0bf1e1ca106466548558290d2683bd69ca296711072c6dd5b95040a5b434b8193fb0c7b0496f9334cc86528cf04b77e3451ae590cbf2c0c55219ee1310989aa2ffe7b3bfaf09dede24a86b765fdb9045919c2c70965f581ab16a90afbdabd46d21edb9b3710c392f1f8115dd12377321016e96334491bf6b4a5f661797e92926551c006dc5a5db6512dc91542f017bd1976068386435a52f6684a0bc257ebd0869f72a5a269a46e5aa608d1a551c8192a7349885b95b3cc38d2d134442c69eb0655d9792ee8d3518cd7841b0563198a9f5526b925d2a02a5b3e7ea358cbdba5b1d22f9416915dfa2d9c399fcddc1f70a99e0c534bcc35382f1b4b4283cfd4575a3ea10ba05c77f316acd1a7459eb40a663978114425e0740676e483c9ac833f881523427335796405f3a0a52c8eadb3952f328a0f5ba2468a594ff00bd673922782b0210a3d97b546e4d3333a7104409625795016e9dc57a7e4815268a06273cfc0866126605110163d6de117b551c986ac4613d24aaeeb0209db97bb734da4ab0c9da2adfe1a058b88b2e5311118279443da1859b23a814b6a10125c7c2a7b2686465840ccedd31980f00786191ad330c36f161381cbb8ff776b4299a36c893aea783b541b50b2c253c088683aaab40ed421eb113add58b322fccacbc9aa91b74fb0657e7a2706ad9c7c7f7813be9008cb07980c310f47c764b4ea496af60e8e6a534cb49852a2c17b4c7bf096c52c72264b7855b7a5552aa93d9aeb47f5ac34e340a094d411cb2cb962b90588a1b32dd68b662060ffa2ae2999525424114ecb4905a19a1284928ed8c42a2c5461520437f93d3cb76502201412a65983dcbe4c70b9f9320418421962005b39ac65703442002d52d18a83b08574895c0eeef19bfeebcfcc7c308f960090e9be93a01c36044220858f671bbc04f1a7557897df2a51adf85a0f7b25f1480089855f1a150bd8207edd0c63db7b99497aa03eb33a8068067d43a24957a20fdb6e11942559087c3ff343a2f5503b33756d55c9b9f29f6fe83d80cc3cbe9a00e8a31d0b986d1ef7635cfc1cde434f6c826ba5445a5933845d1cb8047a8e2f263e1a86b4f58433c5318e6b86942ca92cae767e2cca9111bbcd8b582a81aa5d22aa29dcc21f374a96e55302b837aab8709202141324386ff7f9c7d2ea068b057cf6954e6a433a5502785bf43ec8854ee7982002c703a0d6c35ee79a316a1fe3148b0d933fcd450829746c70e26d5b7b4792c40ee5c51b80cbba439c212f1c66cd619408d654aacc9c1de097a9d03478351e9a377e08710263728c08a71ab3db7f4a50774f0b99c8306f7d39c1aabc4b4bd64356476f85d6945a404df00b2da8988bc9f6b34579447dc3bda9d1a686e2c8ba67666f179f77217daa8cbe47a40b154c16a773627ab06c66b5c291b8616bd675c0351db13938c0a22c874b33d7cc128113642ad1321e5520a636681ae188f962a793b072badc69316b96fb591a99f53ce160c1c9e56384925afcf5c2dd74069f89580b3c18bc15ab0c91578686cf801b25c56c3e37847be52b5869c2b3f03b9b5b6ab0d2b5043e56bddb1c793d2c0fe47544e61c12ac0771a48c8249b3649d77ad9a4bb5d20c3ccb0ac05b51a0d1e29cc791677693b2d96b83c0d599e46b238063c50c7c101f3b3bcba18fc4da9d71b23dc133148417c2f4369b0c92855e538245f44496413c741282f5d7b1482167d90536b89165226aafd7e8aee821b22f69b963a87e4bea84d5ca3040464e7293b1bab723dd393ee3606ca2940431502f56183cdad305ea19cc3f3974236310d05220f233b383c5bc97ec1544a8528c1c74a6a48e9b9b31097477efa632baa4bc6a8abd6ceab5d774bf988b7d708926275227be2c416dc90fca4720437425ae9b4769443472e2b54ad8924935bc0f65a4740699f2051c1e53153cc354527450c8909366f696c8a323a300a28388bdbbec532afc1580faa1f7821c5a6988d8386265bb9dc1043c5ec2a1c51a35ec910d80a1a4c41755fa669a89e05de79b331bf13ecf88bff92ca340d5b961f446eca336af53a95173cbddeb643d4831c2f563950736fb912bbe370daff28cddc319ebe86958fb1794a97001a14df90b01b3aa0c6e952e79c7af072905f552487bf255e1f61536dc93824c7709492bd133516ae71c1b057cbce6a4a3d48b0744a5ceb1604e41a378e53a9afbac28c3cf97b1b03b31797c40654fc23666c34f77207639faabce69c1e98262ae22ca956bc043fb6748f54310379e975958584579fba4bd50e04b739020df78849aba007a4a23da8a18d449194073903d1a3ea4f43e0e76b299c233c5fc8534d831e69475ab6b611ab02da3251fdfe6b92475041f7814be839fc39bb06912799c553b4647a7073482980090c2c9a96b2866d6d8b65db1172bc062f3490b708b239fcc8a39e8175924c930825916386b463b645b4832bcc399b69a812a992d09d260cfc964eef5c883027a2d44743fd538d05b3417a26974bb639f494131803b10678c725a389aa6abeaf83bc947c6a3d031487488c72b1700b76f25f42ffff6595d87426b67258fb6b993508189e9b37f16c2efe87e3de705ff794b0a50cb7d8bba4059ae2e3ab4297429a3122c3e0568a64b64a401aca8ba2edd807dc0c0656b60b027290d23bcad4ba71de7f9989cd85ff43a1fd519b7eb40352d85b940208f9f8596f1946dc2366736a345d9c7501511101e81928380591c19868128a921e56383d12f19446577783e0b1665396c56cc9046c4c7c08a569d8edf0b76096e3c0643e13acf3d522c782871a1f0b31cf8e5a656d13cdb067db3640acd507a2fdc583369ee08e235663a202af6720934c3a59b3bd23b49a95bc1fad20070fec930b6060bd827d742b077092e422268e15d +ciphertext: 43caeabbb0780353630265f7ec031e271d21eb33a99193e5103482cbbb2be9eedaca422f46f1467f31f75e4add80f18ba0bf5ba8baf7f2e1f3f53a10a49a8744fbb5dcbf31fd72b8e2f43a3ccb1297495d690dd23c0cb128a080321ec598f9b10633d3b00fa818d199dadd8234dcd421fee4720e44b5b090a844fc95e37bc7e561507ebaea139fc9c2e137d6fc7dad05532bfd714a50afed3e10d6ee30ea4b53be87a81a2edc6f41545f1a4c4e74226371b513ba31a0a05123882c8709885170d8b52bde2488ef13627d3168af330a914219cc1c869b83a531e573025839676125100b376d6c7e19f0a8c39a84b7942a8f493803ecca439b8b0d6aa984092e1dbb44552bef183812235bf7c1771883e56ec1064166083fb23be4a7a5ddbfa743109a692c282e0be159447fd648417801281944a32bb68e39dd18081b9c2bfdc2828fab3089023acbe74ddcdcad8ccafe75030dddef45a3b323eabf4b5aa07ea14a814fb80ee16e8208fea7a21ff0ccfe155b5547fdb330c90aeae7a9fc63090e784d894b4dc25396dd989e3a0ce8fac844472170db804106f76c360f666860d50e4d9d2e44b32adaebbb84a276fd41c50067bfc7f158391ae6df38cbc70712d6f185558bc295135fe35781a73ad1ea611f33f465feb4201336338e37bbe146f966818902db5d9a8073ed3306b5946e08bf593352f9edc6e545d477834c77ae2239fb89b88650e1c3d7918426ddaef8445b7a32d6ea77dd761ec980b5167a3fa3613d5c7edb02227fb57d7981290ad7891ab98c1d127b75f5ebeccad787c9f6d2d7b3fe5db6ae2838bcd9ee58cf4ace6de6febaeb2062b1029751357733ca4946fe95c17ffc65c5ebcfc0a4049e55a9cd6ad190572fb5ab0d36244d01fe2a76ed4cf1fc6e709d8ceae012e613f81befc46810dc9b745f918d0587238d304840f7068c2c6f646f569eb5aa6c628a2ac4a77f270e337c3e7e809d83ed3075b9ef199fade755fb0ade87d4458305cb06a1fdcc77888fc772efff4ca7588499615e18aeaa17aeac591bb93f2bbf3d8b363fec4f7f62363ec2bbe9707664f5a18c6ff1d1198dcc42740324183a530b401b3c480f10531c2eb23b2b2fc9b4fa5891fe3c38ce751258c58e2d36eafa05b434b78018a91a7f010d0c8aec5460aa4ea0c474d888a7719c8fed5a1a171bea5b7783403435855b66f0054018271002342cd8927afadf5901500ac05f86c53f245210f54d4396053b5e4cfb140c9d850889f022447e947e039462f169dbfc6f58ce8a8aea3eafbb0bc57c5c34bebba106411e6606fd23a31e468e34677db5c4e9fa3897b05a4e9594dffd4c3c8f3957fec8fca9d6820aacd586d280fdb364cc83b001d5f4a167444fa461e9c37a131bac23fff2c500bfc4779bfb9e6f07548012df8af569f743aad0349c1ac04bcc61f949324284db3f9c84dc37e19508d5d9e4afa3c1781ea5bfbdbaa0d40f54e53a8146ef1bd01ca96fc77ef2f06b622dd645bfede60e92533b15d5eb753142cd2f845afbf41c3e309bb610b9dcd7642cbc64e9554b5dc09e3cec0cceb778d66891f6edec41e67aa4229fec60ae15f7bd3bc5960e5a6a8dcad120505c4071a722fdbf28fdaa344b132fa97f601743151eacb3bb04d071f4c566ddacaa02f226347a9368545c6f821293e6ff3dc6ee11c203e8e02055072e0cee63f0b062faaae446e595041561d57b5c74c6457b58e747fd63d7b1e9fdb12a1ea7c7c59a5d9df42de4c61c0fbeb55d946351ca5d78f41f5d569ad82766a6c386010d6e93bbc3b50cbbd06658bd416ae16bb3147a16131892ce84acd8871111c7e058f28f401518ea00abd0037d6be24195d0844e17dc72509aab8d39d2bd47cb43605ba4dfd475e603ebfa243ebd56a1f6544e705e59899ec3982140d8b783e523d54e2998bdc59f6f7e76a729184f09d780c8235456a595327298c07a146d4a52ab9f24da8c3bdfa6e77f0dc216762884adaff8c582a300daf4e3c8a532817a3b6c015328e6af6f948e239c257593c61da28d00b834c1b23ebe44a61c032b96b435d5a1648d2796e500600450ab459a1611b9dcdd78afaa382cf31f1adafeb6c49eb3ca4af14878d22f9ce1a567b1e502127d5f4ca85afc070e5f59aadadd86b14ac6e6076d247b5807e14b935d7b05c3686e47edf3f9c03f0aabe274232953e2199073d78ad827e77739da +result: pass +shared_secret: c543e8af9ae37877d6df73cb7c52819c2a252a85bbd12ca9ef1990d73aedf939 + +# Official test vector 78, seed: "6a85a61dd08c0733fcbc158abb49fe0b0d96a50dcca140a2e9f5a254f1901985844613b1c656c0cb0112620591b88ad0" +private_key: 7c12448f6c47d923c2abe1a0d6f5259b00b5b0f84304fa9192c5ae32fc6e7d0c6d2cd2162e121c4d202a01d0c471f7a959f3941fe56655f808c139b471827d24d97464993bb77b69a45b0380a666874804de793a2ab31d749070bf174ddc8a113b50c8d11037dcec6ea71a7a37e84e133551494a2cfa01bfbac60ea3691b60312ae6707883c74fe70954565abdabe07364db5c76fa2afdc234c63b39fbb597eea25faadc07d326bc06918b201630cbd166e935cf713373bef1749f0a579b77c185a9855e444a353a0804065c3640114d29b25e96ca34e8912454a2c9d39f353103ac17b7d3742222e605b50043e06350e655bda46760e6073b0710691072b52681a81557930fea99f1c13ae618930466305cd56e7879c455f1c7f140bb37dcb56c807955a084a7866b3858a78372487a565da243c7c328c355bb1e21d25c499bcf2de82fb77349d712a365b395d3a1a82d43326d464cabcba97d634fa0f54226029d576304ab06229bf59be0a3be83c4a927157db10743b9cb4070896e79b17483b07d185aa097c790b1b8168fe0aa02f47965e11a1f63587cb512d65b2cf4080d8be80608e0aec5d98a77813492e57db94c20b3b4a29912466c2b693b2464dc8248757b808931727a7270fedc06d86339886a90ec5a0cd5a66462646f66a9bfa959a5c790af13b777f31bb0d1952e1c0a241aa743b54bc2cd4a3583d735a0774a65a57a1db99fde48381b456b2d415ba066ce94c8ce2f144efdc71465f3aa19bbc8aa2cafc85a0fdb06a784a48fb617bf3b7847b91037ce732d10cb2cb92331c38003dc87647015146adccd2a3761283c221f90ab65816107d69d5b481269009f43facad5d52830f53df74b172b41c1aa693e2bb9a2a1bbac5a362a9c190f142b71ed621429b58e88b05851668bb0193df370402a8c6dc19591d84090a879b0c297c2b352bc74bb6a91a598997cb8a7bb3ad9553b9eb114e4b44e30e2698e83a38134be232995a66644e1a0c308b014e1dc5dfc71c580d61acc478db94052340c109339731610223e212cd7ac3e7be983cb75b0a9145fc2a058eac5288a584ca024258a596bdb2a64b42a471a2c40bea222cad46478007cf981ae7b179f1864a76d0b6d3cc3324735bc2c7474a7c9778777b01cc85c67fb68f5671a74479b691137a006d0d5531014ab4261dcc4c88c07ff298eb9209d3234637f1b8bb0bb506d582467247fe6286ea885612b0648aa593f5436873646406bd03e65a549e610a6502121c0c84ad16c7da8026b2d47334553967f749cad20421be2c67df13225d694a4f84faf99c61953a5199a556b8b6e86ac9dfdd4223fd3adb37623d5a6c8a292ca4a048a7a72b7cde58f60e227efcc5290f5c55e75274860813ea29496123adf577d22dc57174a25188ba951970597359c32b24031f264fd8494121727c7b4940ff4cf12f4ce8ae074272a0ce870304af5b274e44eb34c8aef476190917b0194bb75a23be748c15a69525aaba908baafe6f67b4140bcc9f8670b16a84ea855d67610ec1a6cebc7ca15534bd740bde1181660501094050fc8c58a48f4b87f98cda881569d03be5db1a4418b86f93aa5f18a9e2873418d5bc9cb849aadbb04883914d413955fc072b26c17af227e7e3bb41c666c8ba269e5d6c9d14a13b458cc7e7b37907003e4a089f2941f4ed3b3b7f7caec60ba21389570e014612088db3309582254e7a4667cd3755f4b3e536ab68f36459ef04c1eb210e17259ff714ab8d1052a6c03351a829a02a0f9267e6f62912b188627d907d11a85237ac296e3629151516e495e69c9bf93677bb1582900d5c3ee554d9e491bc1972239c96d17937b094795e6780b84f7baf953095e909c11a90c2d803a3d7a265a9894d9b76988f9b54dd033d4c2461000087987a1f81a2027a036138c42dff0656e4338bb717b0da922e677b1d6447565f5cdf202ac9e7232c2b962626729c1f6836862900a32688ac60716286ede932085d23774512f610881b63b1e34b77b25e30c7472969b7b2f4fb03a4fc46217a0a562b27345eb8038b22160913bf658478d089a88eb9e07b559d268be07ec3e9f9a752f7c110633821fca2ee9dc3b94e9a190759c6c4ca9aaa5547c1c86d714ccbed6c41ab53d3379bbe7c189bd1860df788fd4528281fb1c51f687aa1438a329b100805f99f016d9119d2d06c1a6978569e7c40cab47ce5cacc4d35aadd89047a3bf7175cd8833540b8a028c27461d334b3f8680daf57313d7713a35075ce971cac3cfeac02774c3589c21232d5a73d959705be77c3ca0884f8a1c3a89a1059972f115257bc0ce9f13271fd73e7293bf944b82865986a5d56e6c9c825c83271f42908c0953fea66de4ebb820013fe9aa9522ab4ed66334de641f8e66766bfc47a7a5156c182c0bb3628b81b59461b05e3a11d945b36a3923b12abf8f698d1234593d0c784633cdaf09cf8f4148f6320b15c48aa81b1fc3e79fa4055599935e1076c8c1780b1910af4ac9652249b0c64c94137132a12ab62dd265334cc46a3444437a74b076039f39bdcbe2016d8402081949c8e6066f09839cc0adfb5215590aab10c51bb03b68701b0692d1c5c47c58d214b139b83562728b3a771f25cb7638077c4b6b2f83b11df2369ebe9b4e51f36be72bb04e1b591852aea0cc31d1a774768940d73801b8ba23f71c542c8c01559862af4950b7e21f5d4abc3a1104251574e5597076f971b46c370fb1858a1cba35353d29a23db9e756c57a115539824f5375080990b3835023f448a2314d08c6897da5ae35325f9a6107ad4ca05d653ba78c5769e51b368c200543c2a2884a2d504a73827009d166218a981189b5556b38df395ae007772c1222c3e2778c34774c87ae0931bd116c82ae33b3454808e07cc5c6d16c5108c155a451e046260067c6fb0181ae084588017fdbb7ae63e96321290bdb4b3867074e6e684b700b7d5b1074641c5702e287d257b8a54597667c1ccc702f735c30bbaa84bf405123602572962ed89c2d7a3817ac4879d1392f9199c003e63666f1cfc6f91cfc9386b18615bd36913f010270e8a4a9a99e772cbb994b4ca926bf8a04cc1c20c885d2683301cd8c7b381190b0e3dca0d6c33fdd49465fd265781a16fbb546e9b6c6ce0462c604b9fff09cc2d4608259284b8a83a877b9fb18415cd60c37b0b3d6a48c803a61b0a5c9675018f64a013062440f0c40c62055cca7bb6cb9a293193485fc529922478e4c620a73144a57833d3b5b9bb222f2f4b452447cc06638fac1b4404402449a3cd60bcb2fbccdaea42086682ad7f972008276e4e5449217088b485ce6757eb3410c62796d0e7a643a3c72c612ab165475f6e51456d498e858aff563c1f7781035fcab3c85cfa2f207d1e4703d3015e14689fa0c9b1f57984b678baa10cace44a2fb23bc1f317d5304552306183435c62012b2ccdaa9a744575f959b57b9ccc2c28e1a94959a812da6f259d11479fbbc97f54a57a986be61f49ec42124da687221aa3eb3b2c0298249746b20cba291f1633e784608d5897da13a20ea377df6b95198132a7fd526d065250f97525d809bf9cc7270c7b723cc95dc9c8ddf5113ec4c8b3cdca07a7242034741a3cc684a998514fbccc435a8a2d92675e6c3f252a7019a74818689574c6ad907080954557cc12e1d47ca23240b78c2301f39c78127180c268b76289132aab01f457adfa649a4324a08e0bb5345cc2ef90fe6e33588d6adb499b04daa642fc01f5777bef8a7af04179630619d13ba0991cb36e8c23f16baab09a72e7388c93385331f7b5bdf420f1e75c7ad28c54df96df3f1086fe4120843af7c7878b4483956b022ae05112253b97e6a61780ccf4047589ea04000d57593622983e8187a6232deeb59f5e147ef1628a9f692b8bccea069cee6f49533b7301728a3ffc85d7db98398ccb38523254f843dd79bb58b4796a1fc6d68095b8faa7ff9381d01d61bd6694f2c225c46086031a86105661033948c29278e422b304dac9817401af89540a29a1cd6093c86a3878c226fcae156b85038f4ac53579143f2f5854f825b0d45bb974b724368814a9487a60a6e41261470935a90ebcf45b53279c67d92330556e99606dc22a2419021896b2eb750b2479aae7a706b1bbdd9514173f23dd3066161a0af8a6a9ef6aa7efcfb1306b9c421f63be2e376f747731a233a45a8309ba8182d24cf6598c26d65c89da9c9e9e6b9579a4817552a8d355ede798e09781b387c9935333b15d92998a4c736d266dfc2ab61708fcac7b821c01044492f7f4bb8f37b5026790f3a437cfa63af88341b95a8899ad31b37491ce3e42fd9b3701a63d537569b75a6b4b362c14f1b4ba66ab7914c9900187f105744df0b816ba22f5d471848886dd490d5c76169a14af42c03b0b56a7e26aa7ac4e99c0e7b82be89bc3c1eaee6680aa4efd394e40c2b3f30523c8117f7c26a8969 +ciphertext: 61571d32369b0173448b4bbab36ed34c32b4ffec1ba3370a0d7f9d7bed5e5ad086e8bdedc51267f09f4c9e442e42a8cac476db901c5cb6d9e599f64aab780b6b7fc119dd1ba42bff5b16f54e9379886baf6cf4966d99948f0392ff96fb1e027af8f750487b4bef68a50e6d383e927991b6932eb9c0435895c4823e9dc1f3ddd167309180e82da6a309be4debb3dd34b86bb545a24d20971f850c6ee2d21ed70dca709b78e43bf011ae7a00bd916b0e5fa520622614b5c4d0b8852a72f1231bd63cf5e1b72ecc8b13a26a9af8092852db8a3ef4f9ccc31248a5732a6744835a9554f6a14f8778ca9727ab30efe3cff4f66ac0510262d476380239f9aa249b50aa6297e5efab9e2f407559990c60e3816410912b0cc3d480d54c28af0b81c921d9f2b79fd3d22a33c566930b4f70cfcb23196a9e14b9bb3593a3f995bee0e9bc64c415ef3d9b532d531c9639e233fff5c5360b7ebb8ea11616f88e1dbd36b6c3d9037df99f265861b62ae4634b66baf884c1b72f581e4b2d5f1fca24385a76a998b42b5b9a094bbac9ffef15b795fa007d0840d4755a7bba1417c2e09095c5fe5cee4ecdb2548eb73b8d6296a2e4303e79ce65ef9187b7e7ff9aa087e52eff322f7e4ab56fcb8f0732f336318d2dbc2e485a358e36d70f91ad7149f6d7c80401216397f32f10928a0572896583c0e0e2ab0b33906cdc8b59a41ccb83e4ce9e1ff09598e45c05965b3548f5233b8ce34456a373f7ac51547a1bfbf91ee1947fb2bea228e76a46cb1b6370247adfc245fca831a0ecee168e16e71f87faf6c43f3107a2183d4e5b59052707f4bc2075730986d7e637ba5561feef9cd68951e45898b3d6bd107f236442cae0bd583904f53008ab5d291167f6f53f1e4e4040332938fb59d8b71a48b7274280c0fd00591b2140650b06b3a71efdadc63bd8a6b0113cc763fcc97f367f6c57e3e4456953b667f6b2f98adbcbf85d1815a6a7491a252b6c63c40674fc8529a263f64218b7f88f86fdf5e770e78743ccf29ddce1c499224b0263d080b7ff5174f332041f94972a927adb8c6b9bbda97852bd077b8958e83629530ed15eb82f46751d0c8a01a41efb9bc6c3d989eecbb66719746e218a9ea7c988efedc9b9d9cb42595fc3e836b902a1281a823cec78d6bcd9bcb8fa2f3e0ed6139f007e65c9b380f635187c66d80ea2d1ba706c7678517192bca307ab3bd796eb48a58e22f5caa6c2dd22adeb8a52f0e176d54a3361d0f71bcd46c6e10bad4892abb4b9bae96ced17e64bbf8f99f7ee31d18f635d2e775c554a6c5f0a7545d9071b99e35d0b3e6a943d1f42d977ece6303ebdc53f4f168ffed2ef618ec69967e376a111c39102e9a72c79ddab5fcf5f41eebfe9d6558a5d1e1fdeb7902a56cf436b1449e1b8fa89d5e2c0ab0d3343a84346ff7a9255088fefe8a04718c4a7a010732418694cab282592804dd6b808fa66c869624edc3bf66ef4fc81b3271e6d20ffa7b17e3c7df0c1d5c7f7324176770f8bf89b8f127308fea0bf4f42f363eaa11fe83e790b493117da73032446cca8bbe3ecea86e08ba7bd64f09f48ba3106a7a8c30ea9962d2bb950bbfc4ab12e0b7aa098c763973b7ebace2a7541fecb7b380b84c6ed706f0db059d952f0b3b25c650b974ccc2afa8f53ce2c746afc6e51e482f8d38c7d51ba2f304e89e4b7f5d3ab0784d891aa20ad7fdb03e718f5a092984a82b6bfc8f94c3ad1959d59fa163deae47091768e923f2aa072c8705f19e3de919598e85f13ed240540e329faa942d60f489141e55a01c49f69ff1aaa6961b867ae13b77325ca8c4fcf9a85aa1fdcc2f35c94ab7765f3db7c1502ffe33b73046238d7a38a66a8a21cab1af9ed6d46c39c8d2806ed98949e60be6864a277da88d93fb3ea64983c8d492552bf108b6d02ae15d295b3e071ea002517aaf1484bfe02f20f9ea52a4761d7bfbf220620ff5ff5a5728251f31f46efbc5526f04afb170766c06c856a355e831ec6bf4506812711314c96ec4ee7a25243d96c768048b5b2a527d970519809abfd2f0ae56e0e4b20dce86f28aadf9eff31caadcc7b4b52c0f285bdd59ac272e7a8a900e346612e2745f51700ca7694e4c85b13e25fa4380d6b4f21ffebaaa63aa12e3796be74ae4569ab7a19f7ca8adc75a4deb44281cad9baf579ab7e1848a30b734f85b9a2e335101f6227c9545e438e84305a50 +result: pass +shared_secret: e35bb159c5e2b555d89b163bbb2145638ac948d0b10efa8c4f1f385fed047f87 + +# Official test vector 79, seed: "7f4a56eda151e7b097cfb8ef980440fff707affba91867c89522ced6c5ff3bd7f5f00bb49ddd615d9361a7e4efa42851" +private_key: a9a63209470b02c598d426b60572256c3a610ee70e65d20bffac56f5371d896255fb79ac3934b43c78ccb0cb8ca428c975e0be2e901c85f92950ab2e2e30b75953656e87c5107b1ae0b0275c0ab1e0a9019b3681e0b909ffebcb467447ea7c8a4328c7fd485f4a6c6aeb6c730f10ceb68c3a3974bb5c2a37f3c588e6e9058dd458f478b702467155d9a2b0d28b5d60bebbea16924c22efa742f59c10ff235f3ea05c51a721ab75550207b3a6f36e34683e7cc5127210015f20082ef4aea1c273ab2c1adbb235ba590f027028313b9fcaf656e4747d0461422efc565276577720223f8600f9c3739e185c98669cc75a282ab8a663285afab5b1b406818c19508f99c9f35a01144a36fb8a68f12516b7eb09eed336bb0440a013bf78c19ca0f11257db7751e5b54033a74fb5ac24d07fe2a547a0f9882b83570ed29e2ae403eef911c3827cce4a3b926b4c5fc579486836cd9c78cb537369d270798aa6a5707a28a2b48a93302f4ba79c8882e23256a335bd7674612749383e8399c7715bf53945e57927c29b2d04481e43e8a91d58511d975bef95a304f253f9027d2948431da71b92c0319b9512b5cb7dc6908a9fab80d0f25f18207fa0323c7951ba4272c053440d0b9a81fc84708643b1a2880c7272a9cc0034246430cd396d4d2134fc1477aa0261ad5595a384cf19a6c37be499274b870ce21120033092e70a38175388645c86692c5e213a29c910323270c790376a19a3d11742376c797e55628adb813aa4ac10d2659a42a3fd7aa13c9c67cca92d0bf0a37fd093a3267892bca285c93c45ec65d4e0a63c3bba8f0051f35a939f0c11b0356c160b14921b4aff79a127b35b5a27c431252abda5a570c48327fb7204d7ba38a79f34a15ae5a2750e27a3e62acf8fd87329b78e426a1bf91901190a29fd820c7656969ae737044207c8137d8eac5edaa41b606b257a53af4d0acca2266618f081d743ce9803c1ebf29afe0c24ac83bf3ebca2bdd35b98355260c31819d7c4ca9c5550972b34ea388ec62a04cb6d06f083b06c4850814b1b4b65e3931e2037c4d89ba1314ca2c47b7dd7a06f11150bc5188178584f825205b693cbcd51612c13385c98b57168b0c4f9a488a81d31a3429968310496a665446fa6a988b7647b95ab582193543906b274cc73925073c55532d7e9af4066998edc208aacc5a0e23431255f1cacbfb380335046cdaf416417b80fab2bcc834bb9a377709069a330f654929c39a0aa95126cbf26fc320dc34fa8eb706234878b516ba9854d2265acfe5ca3ee0ccf5a413b884a9757608453516a524565345b0290421003e71ef631266a021488303a56998505cb4020b1c38c859f33d914ab97a0bae13f620a090f80382be3a40efa723bf42fa10aab9651485f8c6d3a8621a863723bc4ae27627c18287d0bd01b8393819100cbcd28b4173c35b0d874dbbb4e7e3793f16785742c282e590b4b4960c8503152980dde8b5cab7186fce546a8642e7a43a0e939c17b25c8f7ca3b15814ebc91cc213920bd35848d8b412c0269fbd59f74382a27206f2886b33ffc71cb896f225170cc730e07092031e60cab064be4e005af92428b8bb522237413e72b18949cb06588db32c5b53570a93796ded26a22ec8e27b9a042795901b97507789905c421b3e1260263ab704925c7d8ce3393ce04a19486559eea554ec40361010b73544c590147256cb50e7d940e9dd859ac8647f418548270941a53bc4d126f050152ae557f15756562c0267d26c1db4313e5ec6e0f76a2085a77aff2c1ec5cc4d6299591bace03b527f3fa71d9786dec5c9c1547c9e1665d707b565bdc93f0a0c88ae3aa5a00975d136a64a375f05b9e4efcb85775627619a04000b1cd518dc8854362819ca583c71f4c6cbe624d847a2651776672501a71e3717f249b5a7582583b18f006530feb7d68855592026cf6f52f3640ab33032e7d609fb8d3cfcaf15d3abb0691e478d528af606014bab3c15ff5cac8c774142c9433d6bd192676cc4b7230b66ba55a50426c1a47ea6118b4913b46ba3f72255689416cc47caeeb470f8372dd21aaf34687bbe5a66c402762b64b96a42a3bb47d14554c8dd4c31d4c7c1c8071050a41df9a1377d6457c341f6f1538fc74247581640a505f85e151f1775885d7b655a15b77118695a2bfe69365a4474cc5f1bd3bc30beca40fa5ab05198b708d58110aba64fa4a8e5f955bfd935530b95f16ea816074ac23f8435eb22e85b7621481444b699278082693f073d623c99764c759aa0d6d3211fea1a61b048519e142eef86ec20430812c26aa3812c42471cc8799b80915222111c96b09ea063518c42786569101f81eafe3229fd85900da5abac8a84a688bd58a03213ac8019929e089a24ff8c712a1751856722fc7af3c57bbf95c77c38c85d3e481916c75ffa371d2a0c583b03d301538cf49c744f429d2c80e1ab13c5e126ab6d3ccd733177e469e6a30cbe0c3212215b66f57bedbca118be24c4a3267a1e65c8f924588e9b10ce22157650e64314b7643136e87bc141c9a01dc7b746556a1ea01f5aa8d22671be3177bcbeb605093a225e1a847c6ab78ca89c4d3a4a618932025aab56646a974b088429e182308dbda27fe6a0a7f5a6b36d681cbd94ec205a018319a89345ca5715ef79266d1f67dff2a1867366d14bb60625b9883740f4b3627ac385fa728a51c162401d86c4f2385bb9661ca891562523a7a66111195bacec69abd4c35ba6959397664ab56a621a25b00c5aa2c0793487a8b1b5847a29844d6e8cac42ba2aa3586ce117b010aaa324236855771cc999929f0b948c671b4a7ced082358fc94147f86fb01c3b1210bfdfe266d1f60a72baab460aa7ce7083d4b913635332cf559b121a26fa643fbb7553781847787c8d78e9662cb82941627bc863bc79799d4681830d3b41d156384f157e3ad27192b92e47c106ab6c1304a3b56723162e933cc28b220f45cbb9615cc90aa3483cbb9b510e7aecbd80b28ba3a51e1264b6c6023c30843462f33faf090e43555635c674a80679fbc88270ab53ccc83b79673e296a1394dba0bc2b421b02a0d4213890d0093c19384298b039b5b8f4f61a2ce286bf11b9a6c164bb5a269427999d707c3e62ce88d66fa283218ef393a4ec7a35e2a927b92866e5976e1b95122236c2800d2b4989e0759ab8bc1f37da21288ab22fc4a13bf8068a9abac80c814d150885762275c638087b643b60b4673408869156d52ca257ba50ff1354f4164b4d29069a99c7805527c7674c2dbbcf26656d110823f082bc88405299e093195038f7562b11daaec75668b71244fa6769a18b2d4643930704199f0105082ba91ff44f7b6bb339f243b524979ac51fc92c6b75711193fa29f898141a6c444e2850f03353fc6ca27f0023b9c88f6c0b8aafc9cb9981c460e2b17d594c7a60b6e3451c9675c923a7b1645c4d3fb28b1e42ae1f93090b86659e1a7d46183d26f380a2c046d9028e9906cbdf1ab605367be6a5609e79cb8dc349c739b7d4f74007fa69b9b50c94223e214509b2e057272476b1653d90740b0c059b1d2845ea9a57cad384a2c7cc2b926979f60fde47bfa01a217cd3c43bc01aae86642b84b79ce58296700427c78b7f32116823ba964379f1374e4b164eac108234b12139d580ec4bc11be3b62442445409204e1a9459ab3d7d33815e76589ca4009b27ca2e6ca470b61504569d0e70155d988b80988cda1c9ec0da673ac2497d6a2fe1cb8539f5262bba5104a4cf7659a616755cbd6a1cfd42a9ee1c115158a66af0bbceb149dba4af4ed2a128a988d8aa5c97164be56483e1816e52402b908b12429c505d0a3a4b2366a7bb38169497e7ac0e3ca8ad8f9636a54cb4b4d667d91752d6658a08416d552c3ebee80a613c41de4478611598bd05b34a66853b079481885225941beb4b67218013a3772a60e55aaa25ad44575f45a3178d37af2786a76e20a5a8719d84e693f693507aab4cb43c55a64339359b8075a643b7a696c373144a743288c37ffe36c454a45444c2a48c3c7d0415c125d133670ca1709c7f80897751fc8d07f30ba0a3b10f7110b03863e5b040b7942c6a527008f7952b89cff921280296955261ca76f50d1dc0a0d2b8b682d8459fec291c27c1e281bbf5a17dff0c0c75a3bb4c987f30b175c293931fc444728ab8590c6095c60542e6bbd2a39e324b96af61328ecbc54da1a44ca7a175c61a131610bad5144b702380d45b5df1622f3b2a4e640457ac830c8cc05ef95b4429b599983bab346a47443575087e975a57ab91601ee65966b51838108117934a5f334979349e3fdb9b49ca49252a4214b6e298c3b12e5f6e85ddfa7edc01a03b27468684972318831ae360d6a628c3b1b5dc926153f22a88c7b953085255edd2a72799bda15e49dffa9c35d165453e5fcdc6f9df64526d9de698f2bd3e6bac6c7fdd86601b9ba5f4a5 +ciphertext: df7c965dedf9efaf8469f3a6b7a1a1031590bc2bf82f05c498d073a2a4c604ee164ae8a135f351723714a757517c138457e6272f7b7666e59a5ee0bfd374bd364d8deea94caf7d807776ff1af1210612c5a95a8a8deffdafe4a5b6e1aa85d79808c94f32aba7b9874961e64639b52a790fb5a24537e70b6a0070065d51b7684425558c34b044a598724c226a7d1f45c8a0f4fc1c07e7ba45107820524272915b31a1ea3c18b890d3057028af0018e0d8f50214a78fd8c666e567b65555b91a7167c8c3e738444377a109742129cb53ae56dfd923d3b1aa40e4bd0c9f35f1346d622355b23bb69f4fc09f28adc5101ff08ccccb9ff384a40f1810fc009608ae901913f8f7e3386d63298ae6c34bfdf4c17e8069d72a8b490988c9808401c7de5b804733ddadbcc97d9f94328931d168380182d823cbca3542439ff2e82bea058ffa5085edfcb9fbecac507f50922fe1fac0854edaaf5b003f921ac0f95b710c924377742ef3aa4494a2a65c561754145914050df0d8ea009366b6a75a40034fc992f59ffa93921e4b8db5e46116e04f25b648118f7a5e226675c1e25abaecb5c2492dd4092bd2334fa5a4a14c067350cb64f566c4997af1f4f6901d70c2f9c4a3cc0c6eafb6efd830487a339c5f63a51788b13be38c3ba4fac0a64fe7e1bf513853b785e98283763ff23b730168d1debfd411a6d529f30a93b482150995abafbb8fc3a712f32127dfd040459e947bcba53814bc9b512e857b94c6d1450d26fe17674b7db6cb33afba1717ec003642769380553bec6003eac872b8c3b3cafffdb3d7c0601d493f10bf5e6792e9a49e86fa7393a3c8bea7bf9d12afe864e7201e2887053b67ee445486646981e0bf3e6d93eeb178f6f5a7a10a3b596168ae1ba4c1f093acbfa879331f4483657e43f9200c5aae4b0557a94cb01bd9e2dbd6cc0ec6707b36565c0faf3619ce98f4ad0866f9f7314aa5996383d04fdb08340a889f3478dce0d0a3c0fac862270469a535ae52a1a06a95a58ba396e1c8cc4d7da22fd5f68c240653ec20c39f705c998bb37ab0e173207c49970d6cbe68d74da764e70a0432907cba6d91a307d5e57124d405c1928b429d2ca5d6e2d0082dd0548fb0b5c41dc65968d129328935b169c7b8d401d29588c3dfae5419c4afcccdc9a3bcae8853fd47226867b9f864dad3cacff59cbe536be7e5f1ed1a705798874db514c8230483c4dee889acceade05970292e7b649ea429420bbe0cf166d4d022cafaee141fa08baa7af787cf1daaeae2edaa53f764e6d233e89f770c647473823b0db4bfa8403655d1734b276d09f58104b5892180c7c6b8f818d9a924900ab3c6cd6945d5cae4b6d876ca609839a416843d202d585ef7983181df3bf7040962f266a2f09f85479fb8f67acf20c306cc1bd191bd956bb99058461e9361812b14562207ebc7adb0fbee7dbbe7f9adc9bae7cf759835c780caa24c69db6d7922aaf0d9174f62d10ab7d42bcb152991b0673756b522e95a0a83231797dba4c9f486da9667506e37cbcc5aa42d54a6009cec6da6830154a8ca40aee3d4e2fbc4d813036500fdf5b2dae8af33cd86726e8b344a2043684f3cf7bc991d86cff533c6687df082b595d4d6e705c1b0aa28645a1077569343aca38f19149267f8e8be8a862cc6dc9370528c544bc9aa31898906e5f64b2db77e3128f5b59adc526f6f076ea70942eb44a2d2e6151db00c3431b39bafba841d40a2f686155f588e41fb1dcaea9156498b1ca82f1c68c6660abf20c6deda010290cdcacc2990132483b2e4d90de9ba0608438638c459038773ea3f1432c4fbaea491d5513b633a04423b60b3ee6f920ceff200fe71a8798adfb11d5607c57dd6e53e7aa8fe80375e2a76f82c8d73775d1dad6080a9f15eb51e2014a912eed3216695270bee882eb0559141c47ed66f8646fd3259297e1daa6e1b6e93ec7d170d4c818bc53b01744f4fa613c4484f1abc0ea225d7c15a93ab1401346e72baeb992b049bcbccc641a142ec39c6cbfd554f9bb3acfa38c5077a63dc7b2912a1eaca455fa295f9377c993237f44263c425bbf8ef5dedba0daa909f662cdeccfe2c67be4d03ba13d3090796db0461cf12256bf65e849e07a808d0577c5ebef283f9000a0b136f50e1dc35f29b01584b2285e82b1862779d76c59a8ec6200fd4901996d18932916c9dea3ac8ccae015136f9 +result: pass +shared_secret: c10f4e51bff1a6f49da4cf9504d8c0dd1832c0860090fa892d5de6be27102354 + +# Official test vector 80, seed: "09fc004519bcf85b20d25d314a0dfc79e00cb6262a7dddf9c52473641afb8cfa0f5dd5f53558184caae9ec34b459e98e" +private_key: e7831320d38dd5629ccd557808a8b263730777d379caa64e1da51cd8c2baf8ab930118770cca3dbc11825c867af4421c87541c5a6788bb93b560948dc8555c8caa6597441e1a6313ac5a8ecc6a0acc25cdabb2c59b49352cc589f13269ca38094d2a2029b070e989b0a2d15332ba43657b23f278b1a253c4250b2210b0905b4737f678a83da40ca296bab3461b58c1274ba0ce79e5562723242ac1cd86839e32e4302e84b42bd118fc4415b71c92e149cdaaf06dd12837a5c03aa41b60178c1518130ac4c7017d78c5afd922e83ac2bcc3c3d94b6d8dc8062cd54649339ec4b75c49704d2e5c86aaf48294d19e4d28c12fe45cc56898c630a252e09e6f718c36c71cf9b38d38a3a9731c4f6f02528107c745277841b29d7b93bbc4b5c860147777f79745ea2296274856915d06944582055b31741f291c66df5c4a2f09351311a6d56a8572aa6240a42be432a5e4d98cf229195ee0a72f6c67cb4a9c48a9932d36cf70164364988270503573e43e2b730d88f94d23315b6848549515104320c26e83206ad5c33ac98c922b6bc0c961ef2607aab223a4fabd82dc7670fc999263991612440d93a2e3eaa8e65961d441a8548762c84754fc4880da92aed2621876294d1c086efbbb52cd252e2f14853f6a2b7d0bc9e1f104b9703a27779733049013da1812257bb8db3857075b665c8e7622ccfa10667de3ba468808fba7b6dda902a1337af7ec59e4aabee16c8017674114dcc2a0571730c14a9d07485648228ff8528c155f6266b79b3c76a8ba2ed133401d6bc56394785089abc368b9d05b4a1165912360bf87fb6ef6f79859f8187151a31437904398c997c30092ca21c43996805245904a0d90ba8658309be2b4306266888f5564b631cb250569aec1886059352bf770e1137f5287058ba78463523c59f14d1846b7e1764aaf2210a58990fed7528bab242ee02949539469122dcff23f921b3a0746b44f64a7aaf81f99954ad88b67567c120b191abde6c7d54aab5ce7bc87960e2ee2618e24746f24c03b153dc988b0d3712c42d20e152533bcb914588a32ffbc2c44b4045f07ab79ea5627045f45b11d62d2a3bbf97e57e8c27439418be800a667bcd35435b6770b8223ace5284371f5b0d8930aa93b8a3889984b8065f408bafd0c5d5df30cd3e5911d9845c9f687980a1609198dde43a52ee970867c0addbc2114d52d91073d6c95156f7c95a40a575ee07228b22bdabb0b16729b2266b13ec29bbc70486e13612270541102baf04a96b24900af60cdaaecaa1af07459f554b53b7806a65465fa8ed5c2bf65d32410caa887a90527b82a9697738cc71a1926478bd4cbd70067a50479058bbaeac05698b1530a1774c0f45001ec718e05053da12f24115acdd76bff98094f8bcb45960e635377077b6d92150221c87b60994bd7732e24c34b55ac1fe660450af46b3397a0c1c577a30b2fe1c263544c025172164f7c5620b5658d34455757c920f229920729264a159b20658a75496c6bb48fa9090d88be51f754988ab5cc774d526a1c27361cf3ab173326886eb0053b082ee9279c27a428d6f7cbf9fbcc15ac4988d13dced43e0045167d33b0aac4c11c383ccd1025bbe1c83bf5c43ab6836328959ce979c3914510027121a00061e12d1d831efa030cddf9aba24754bf556a99f65109832ef12ca41ed9342309c24e7a09cfc93647c6cfbae5cc262764aa64ab49132da03a6e7424c56ba49bcad27affdca4b88584b74c0623224541b82419e563db5b90ab40787f8425e4b38bbc573918224c4d73149bab4dbbe350630229a612bacd4b081ca05eb95a62c50453695a65763461586c8de2934d31093297ea1384d3c2f2f811bc75c960237693652387a13f69629a3fd625351927a9658bd4125c713177959aa82ef3771c03b5bd5805b7d56f00d86fecc7aa29a7637cf3bbea377ee7b9b1f94836197a718b097f510c81594a0e11381f01584a87419f51f49c120b89514754dd85a6be48ad947b81698001f0a256f8a92d09a1a049c0376d236a19f19bcf431a90f94b028475c11807d14c5562e5747f1b8db5b072017023bab895a07415deb89cb3cb8a9115b63216bd69243186901ae32b24402b88bd18cd03b2216d24928eb82e385684bc143e0d5745892b0826f89f9fa8a931596bd912527e2c965ce3344b4621190c106f5084836006296c37949aca196c426f4783b65221b9c50827c85b7067a9872a6d9277828ea9385f9b512a8a3e897628d1aa36a5206b35fb219ae26269126b75590b2d1067419b27fa6852a3552d6ce48c9193c96a3131397166d47c53eebbb68b949a5bc3c7d585027961aab89b38f5295ce7c60d3d9009508769ee37a48de0685b9228d998b883d871985108b49c908390cb68147e8bc561df29cde02b1ed5236ed77b23b3f32e687b859dd63439890d8735640f5c073bc05cda79603cfb37fc5ccd28e98b4eb169271408a1cba57d21afb87c97e2044766b38280b6911b95725d5a77327764832603fe771aed89baa1c8b2ff49b741081884c6326fa0693fe64551402301a0552f49035a262e9d047d8a2075fdf6636c726f8b6098fb2b8f01c89e87478dc1112c37f1b857fb13cec53673e297b8aa9612d26a4cd0c6168c9dea407133acb939d06a7c660581a877f046b9b1138f6fa6156be2a5bfb23d04954fe32b1272d73e39c79094864cc9e36e46e9c8f1db330c17a0ecbb332e385769c4c0ace7c0b0d49fb89503cbc13ff3a1b19f421b80855fcb947cb651ccc0a7b55b5100c09aab9201c4ff8c56a2d90bac255a3665a731d07b8ad829f7a7b556ac12acbc1073a40b7c36059edccd97a50c493359c8ba390e3716921a69998b9b111c4dd283456f7b61ccf97c1dbc362e2760e2928227405e449c126d7526516298f6315302288043085808195ea587118d731543f09479a2adb96884b3a620d4c86123818cf848b295eb0035211bf614b077871db1d8c779d61e90257730e47bba178ac5e28b8e47794517727e4049dc759ed5a69cf7c66de05c0a5a00c366a87f7f2914e1e059bd1921eef61da9cc201f016f1cdabca2d2cd99e1884c114100ec5fd0f415d6fc6222981d8e4582dd138d71a368bd5590645359cf767146f2cf5f7a58e0e1becadcb1da0c87fd385c4ad15e02836d866025d0d815af61b564e803f0f0bda9a1ad0a3b86dd9a79b29792a713c78f00c55668aa2a0962b4a9be8bd9cb6966a054f0ac39182ca4d54fffe197891b964933aa8d60a87ab0af08c139a8e79b7a5773cf189caa615f64b973eb273edefb27be439ddff2a1fdba7f2cc3c65dfb0d0cb177b7ac49ad1b4da0725a3f3a2741fb2c82347dac329657c9bbaeaa948102295c1828b01c22ae45cb0e0b46a68837ca5c8639ab483eec5b4dc9caf028a7bee18accc402ec6aa57a93a1c53a145e923194341bde96296857890fa616d1bca0cadbbba3e4302e55286c58a283ca8d1626515e6a84881aa692c662a3567cc294a23059392887ce7a835f8b8030f5c1060518c71e0c5621812d54d50043b73182fa67de92768c63c4a2c562ac151342fab8fc9181be82301404792a94258b98411ed093a9121699ea13fc822bb5a317b55c1167ac12bd8c3ccd9bc743a634ed6a0961e13ad91a779a242dd0b9b4b41a5da11cbea085032ee2382c4b8ce088524075cdfe7b7c06cb6f2ae128f4f7a6c5d58011b42b8cd39a8a0aaaba14a0ea8c9a72f322693410cac54c3ee5487d726acde02f9cd0b027844ea1c018e2744571c3a2c36b4e0da088f09ab939152e30696cfd3473a085be3eccb53eb406b66c95ef8b1cfcfa1df8c8238b8c129abc9176e0864415852cc8ce13970fe8a76ecfe246800997c56668af974605e748e3054700d7b75fa182278309e41cbe5b4a17696c843fb4ad72471bac747faf30c99d2433665433ef29b64870ae8a3593845ac211ca4af0e5aeb9b8afa5b4419559502e834f993543353835596985e31529c1482d0fcb9c11a1c79a704db1d531bd0774f91b6810b98766a83387387c0682584c94793fa771ab8b4216455f7a117c65e5a481e01b5bd8bd0a9263635815f3c13c7c6740d2d1778ab47d56c9a37ed4a660249b8a4a02cbd716f6a09a646456c4b54cad68c86f8b998855379560692cfa68b5176309162a7a506b28e042c25850a7e6357ebcce387146b94a09fa82ad2cda8123477f926757d552929ea72e379a9bb997bab0d1aeb5f02568e7715d959168129cd58048ab1299eec754b9080e7337084ddc37c4695b75488effdc370edb65655231ef1091d762b8ec53a3283b3f7bb5114429c788a2cbdce1c0454466882448990d0c963c4dc08e6955a7aa5238a6347a0d168a1ab143347ab4c4e4ad5295a60c2d41e0b7a7bc92148855ebedb4f2b77da0c706a1bafd6429d55fe6141a25f7ab9f875f79e0a82d6ea5cde5a017ab637d5fdb7c42646a1d71df +ciphertext: fab59e039993ccd4f50ccbe8c886407e46508fc6d007172a747786974d2eed73538e8c47ffd4e3d961be7d83ced37f11f3db879752f36cdb659ce2b77c1c3096a6406c3af929526157cc49ab365f9f5fe8b60c1b67ae8db2aa260485538ae844c06a121606c3422910dc3afbb4119bedd73a800ce1cf1ae6a4955367a7dc994fcc653b4f94652bea15f60323e6f2dcfc6fccd1f79085a8b846a0ec0f334db86482b15738f011398bfca13570f97c2e5801b60a5264072a7011b98b9e1de2651f78905842fb8b22da803f03211ce0e4b39c6ef8c7c73e611aa8e5b20c9295334e9319c73f5f78956e28a008e0e681a193ff229f375ddcb2a9b9a750bd97e055f6749af2ff6a601133fc7a069c4f72f5ad4c930b5d37e91b208b4e36970087ef4200972d204e5a3fcad1f033035e39202dabc309263834e8ee8c45f6d3a8ce7861e8c639a61b0a12b950525bfdb6b45d813797bf73952b7d6be33c489a4be615bb892b171c3b831d609cc7a5326409a80b755d08634ba177a98ebd56fb89b87678d8be5bf508dc131ffb01500dcaa087e75226a6367ca24d0f7f2f9d4a8218e50f30d9d4a8eae36bda94660c194eb4fa91881632d2e8f2211dc28b7fa24766793eb3c9a969fe08c7ab94f655a7f7ebc5599a766ad576da9f0c9bf04df04118e6511ca541512f9826aadbc59c431fcac0dcc1421cabd3ec85ce5fbe31fee445ae4a418462555a22ea3900f29ad77b231e2ff51cb4d3713d83ae0d5581c8db197bcde4ca4e42be102b3bd240694c82143b683778a868d574204a1d02e34f2fe91130f283ac40ccc2efe76bd100c780914af245efc5483ef94965dd8e166ebba97883cd7f1ddd5cd623e5598509c858f4249f4673bf6a21e037b6e804b7e2508dc8ed0cfcde042b5f307c2faeb68801ff7e90738643af5fc46ff1118661341caad34d327e1ea28c8bd350bb78c277403129ffa723e6839f0caf93e9abcf672f8f4a074ba3fdf216f040fda8458a7d9581f9321cdb541cb61c7956a3d75f279c1a832b0c656b9de198ec59ad87ffe29f31224819a7c57c178e52c7209110fb9c0e63d2b99b8257dfa6a1bcc6edcc64d7a64f3840fc2b343175bedebe7db7aabcfca4bcf744c7a0ea8d2bfbeb451453597ad97f76d553bb2bbdd523462cce707cfb3f2d0d4bbd9ebafe0bbaa2116b2f00d6d543678575a1a86da89566974324f6fedcee53702d341aa57e4653757d291867c2e63c8e1ba98942193f60d6da8b7232b672835318e9ad102eac0ab89dc06cd4dcdc74f19848dfe0ea55b4d9d59e8dbc1a53f0d230e76524c658f2e12c01bfb4ddca8ed4f6c21b2204caec44a80b5a5768bbbeb65b36107f34f3e786152d6e0d33b11be83e255b541cdd1ae99dffcff273c55b665fa09d7a89de5bea528e6569e525f683c32a9f01f4a8349b91eae519efb2d5da8c111886de94111dc6898527ec85181e974fa77130ba19e251118d9dff1149610bce6c8e5507a4b266859c2e71cdeed75437efeb9db9b6e7a201f7a32cd5d0ef378588cc6cea5387d3a89d38c93fb3f2cf990796a23bc73d07f427e90173f173dbdc97ebc03a557daea271d2ea56cbdc5f19af6683e749a4e25b52d876fcb2f05a4ab8b616ce7dac1dce610afeec8e5fe12c6a703698049a32fc3532ebe1520d95bb3dab1c89e430d6a4b87e7520aeba06cc7dd15ccf6767a9ef0bf331f6869625c877b6986157f39788b4c06e96f5a380f352f28cb62f911a72b5eadec6ccde6adc51f5d18e56629c831972b3beb4438b8cb5e4f64c05e841f199459c5557d7b3a78ae92eca093f417131f237e4a27c0f9154030e451a9a587d95e6971183e059ab37ecb9ca97d8ba4a945dc35c9a21a97fb7c2ac30646e8c1e7fc1b2a7d594dbf45b6060073bbdf3874d7f627e599491bdb11f33fb0475dd07aefc14909e78ddd87f68d085880e8bddc6b39bb7621cbc686803821e34abf5f82b9077724652defedb728f963a957ebe369256c18a09992de7ac7647d14f7c094bd72b4baa651937da84c137d1f407147d335957a1ebb86e1a25eb962a50159b6637dfd25d5d3ecb417b4c19568af0f6c00fdea172fb7061580363434d08fab0c04c6f3867bda85851ec12558bad21ecea88361575c76e423fbb1ef837bf35b1937bae52eaf838df96106468b8e16742080d4afc19965d4f2ff36de956e77a9c7cdedd7c +result: pass +shared_secret: b515a69280079b7c57997a183bdc160eaa0ecee319220fa690356aa42d0b59a8 + +# Official test vector 81, seed: "e3c41cca6f04cfe7732fd54de30cc5caac93e2f80e76aed7d24a962a3969c1b6a311459a3ec3e510e3e9b1e4291d4d7d" +private_key: 27cb06cadca3f6235b6b59c5a5e7499e95130ab431fc7c4744d1ad414393f5acbd04d15b23c8867dd88ae7cccff7a03122b44de4a4beccc2251744c517f116b413a18d614d5bc371df9534eb76b5fcb13485e60304f02425e37a653c76e08072ae9527e449783cfa72fae68c27e4abcd59ab364b49e6045d764581a9738e3f6443229196478ca629b28dfa519400149a1433b716564dc0959956c87e67e8179b46b1b1b4b9b60a52641971fb91372e6550af2c4e1be88e534108c059217b4071493807e3986d182cbe451047fa4021e264ccdfd89c5458085832c7e157676a649e4533a91904ab61e875ba8180d8639c82522a211787b4a490fcd587d93a7ce8e08dd0094fdff708bf23c35e1b904ea56ce14a9bc5272ab935a69e36cbb15ac1aea1865b7710aa747570704627aa79a1075d8adc4d008d45926b8b55dc12624b6e66f4ce3502150aa0bfc6125430550d595b6627f9ad22243a12aa70b5597708509f9dd09f5ad23a4a876fb251a46f013f05b1884aab725ff1786a4892542c2c0b23150bd6cc3b25427f4b76365193d008a074715b06e713a4e71e3819776b078390b8042d312715b28f1d44a4d540abfdb9a2b3b7660a7101b31030dabb52a05b7f81a488a5e306156a268fd7396d4394a43534d9c4beb2f91686014ee0d7c103733fda120b62ba668f0955db0c596355091002b4af9929384075d6575938468f95571397f8a2f227b57c8599eac2586b72902c698800c78f4b1b99b7284aac542fee229f32a25312f85469f9bf8b81aac6440d4dd26d38c001f2d625d21577d0ca557016405de603b7f26dc7199b300b120a0c278a1475b266354bdb961f5a54a4e0cd70a05e23d7a59debb4134111906a9f6f5b66704026cf033b98c617fc528b104060b8673083490d6c238ed1c943a217533475b5e7c00c871c81292516763b3936d3b99c680695139e6534335bf499aa6abbe10acaa5a2a75f659baaa1a743d228934a129beb65158a04b52c999612c6a8e602afd532139006f386ad51a618702769ece33229187e0f647027420418d560329abb658aaff3a358c5577115f437f59c06d503b154f380c4512d66364c0ce20b5f0a7563626d9f2620f09208adb71b3d91c94a10c4ec29aaf892b8d0991e7f699bddda9c2cd8b96de4661674b400f780fb60921008ccdc911ce6e29a771cb308e86415f4b641d33bbe0746fca69e2a00015f9932af23772abc68abdc5ddae66e84e3826e3cba0a7234df3868fbaa8b2afc0cac953be2271ca2da5cc674569db62a2bc5c5447966a0553eb3a258dfa05ad763850c0ab1724a01f2e2b4a2f3640398bd0b8bbe8af79adc3ccdebf775f2a545a7e8a8685ca73d4c5bf0d788d6a21fef02c241b34f80752f8860249966ada889927582c0f60642b042b95eda965c8873fe8191967b3acc13457e0708316096cb50b856c35a7c19ac64a85a03f9b81e9a756046b901dc9491947c077a05e5d9986cfc3dcba09d02055cae5a47a6969652b056035453c97571138561e28b3b0d0160da428c9104810ca69c75d15ce66b126a27b96654c6e2a0a463d1cd4775458964be2e5a3bec582e38b64c8bb68776c15bc2919d5e99259a68c5c8e42c37b2b4a6b0351c18a09d2378f04403a04aaa7a6ba6589b63061b0eeb80442ada851bcbb5afa1be84d688b3050647530fcac5af0f8b275f036ab0d354991265fd1190d7f5468fc3578e15723214aba66b855b0b5ba2fb27c8b1b7dd37790a8c77120a6c18797b5a920450f87144872d83e8afec5a72df7a61b50655f5081389225235389bf15444c90c1b332b5395796a185b1f9d816ac1b69fd1457e1ce4b1d7071e1956ae9282645b8458cbb8c3f5711e3064a4d05488104848a846aff4c01445241db51b81549ab00230621c8c699fb13c94679f7f51879bc2676973c7418b6d14d9963426819768631abba1db070321a32c0edc95b35c206272946ff134afa2093efc76b28927a948bc4f1931e1a2cbcce18ce9c93c8b029b13291234e76b00452bb3f7860ed98ca0fa2a01a16735272b09c4c0a0b08904f5654911a937f9237818926c03cdb0a98b167b6434a96fe74796ac233716625927535581516ec3217382e61710991003e81f2e0b8d139821f3bc631edcae24cc4583a8abd7e9bfebe65e89997ce4e680ce385c8eeb2862175fbdc9b25dc7724f641ca14b1675e13465d634915593a228c35432b316d295dcfcac909b9aaeba2e93f6028be9045610ba38c763c08308a1d6b9b8667b500c649b94cfa703432f8695377462ec6159313a184f7349be26512759a112223af1b12127f5566da94c8bb19765849f9e849a4f235c9df3783627b3e548242fe2cf506ac1fd09cd5067422789ca6bd3ceb0e516a2e88d0406abe03b65b0f064d7600ddc227ca460cc784652fc1168e8ea53f825851a222eab10bb9c8598e6930a2abb627ec5640d4a3c6eeb225561ae19f20eb6d0536ceb93145c7616fcb46c04b2076b9d8a4013a4bc527848a8972b0b6577c50f63194e6357bb2084fae54c592577d6c7a61b79475fe1c43e70980762132806a7d25482ec2a0e19778aec2685ac19490c303cbee96e2992b836305b58270553d07184507b12c06510437b5c78b3f5cb1b57627da57611dd3361772a213e033dd5519666d18bccb13b3f751901d601ae131ff3c061af87839692967cb88199f1770ad0ae196388ed6b9746fc6e536443afe04a3b92352acc4ea04173d00ab9e3eb9c1cc137b2d6b14fe36dff9591b5300853a349dc23799d8209e811965ac84090f34d36382020ba31531a0dc909b9ed725ef6120929228f48a94a5e04d03314993fc8b306572a4d5a7063110c051011c1b09ee2d09315196f09192c329565cc5a64405c3acdc234acbc0a78e81b3c9523c43a2fb961873eb207464a302d8349ab50167ca33cde091be57801b6e850dda6c5baf498ce1897b247bc7e1a84c6b141fb00286fe864a9f27db6475ed24371cf0c19586750cf72ac1cab46ce08860090a0c1322aba42cd902b6c05f4c4bab667b54b0d5a04332335731544675f80a2ade66dbc075d7a9b4ed924417677b6e195b902842fbd4390597c28a1504e161175d259ae7c44333e742471b58756c0666900cb94d87f73043e940a5733f89ae3e8cf037b83a51b4768a19dd1a96729216c7e317bcbf60b3b07cd82784d964754a440ce297b40e3f8811834885ae76a9605a249958f02d9bf2ef0a195d3603261560593a636b15dddc681ab9bb19ab7ae95d32ea474388d81585e49b463b47033f81964481f46c229f751a930f6a632e8aba8981cca880511164b8f09a8bd9ab8c07bc8a28636d0d32bed77b2cd032b18090928f01e192943e028af329b4b812238a3362b5e2a61cd7b3691d06148703d692080a6c755c560490cd5b47606ac9cd9bdb927b6e3b26d9060921757a0f85a2f82b618bba9008b7073f24a88fdfa922eacbd6631c32157b36150be06d3ce2c4b64410543ccf280143c1de73917b816c86b1a04204a8f3fd7cadbd20b41831c8229788aba219ba59af78388c2b9865eb3000089c6c05c850e91021a5328149cb2a1a27e075a3ec8630d8f515cb77903fb5531f6e05ce984296669b0bfe8af8ae59438b834d4110ba0606ee426799c313233ca9487ea35071871420c6825889c07da0f87f1188d75650e36ad21a265d4b44c01361c0653b55f409ff3c290d2c2c212319297d5aef2bb87164b7535b7518ca14469fabee91c81384025f6914c19018a0775598ad4bbada98e06c87c9af309c73903ae1b84fa9a3c3f668042883a8195cea1fa5bdca59c203178eeb18041aa2e9af770d180be044bab1c8c36044a70e50281540501ad6b165c021e53b86a5f368728e2aeed1520a09a48c1ea0e9419b313d7c6a9e59f17121c8ad47410abb73e008c1ecc16c32b4a46f39712648cd06196ceb8a076f5c7048a3aad37393973b8679c55393137e6b6ba2dea4d50f65e1ef12116598de49260112055f4b0acda503395e242b990398943c18c01cdca993b3c9a74e19ac6768581ccc9a0331c005ce873b241b3e5e497493ab134e18569e80a6d12a04616911f9072fae6a30e529cea1bbdbaecc7cc64a7d655a730335e8a22b4f4250e2c54976c69a161694aba04456bc14e2bf8c13b1ba2a5ac1a6b557bb061805c903d1d1aa3367922fe0c51dbc35da6cc8593b8b3cdf741220126eea9cc5b9c0632f75c7aa3aad60a46afca4a6d166f2b2ac858c2a572e4cdc2d65bca199cd73367b83909fb324855c4899d920a32b3107ec56789d63c25036c35d30be5d28d54d725f1eb3f924bb991cc4c5ec2e36585c0133b82099b8234cb459a9fd8aca37c4249a3b02025a466c0b64a911e75243db16841847a8ac72dd835486e96a168b2f9fec46f3011eafeca9e810796c34e8cfce9d59342884456007b01ddd12edce6d10ed87e4c +ciphertext: 7c00e16d0e64a68ff48151fd02eca316fdb77ed8e12cc3cd318b692e43db05fdeef4ea363e297d9c32f8c079977dd3915db9892dd78cb2b2fad8bceb72a953b03ecf93afb749d6486b15bf456e83d554a45c0cd8d981494a0f40a511a259d1d6890babea2f1c770900c03d66d26331c9fc126eb32bb5135ad7b3b51c70c64923b8b60db51d96f87cb2626626282b8bbf018047e5f3798041f4598bf7f6ca93e0dfd8f7caaa104ded188bb13ebd5fdf6cb21fb9cc9225e63d0ea3017805ad509e7d23e76f1351fdc02584f65ca06687c3db9964151d6964c6799165775f60d4a91b5e8b41c920c2394e4bc587733bda3107aa33a7eed8d62997634591ebb7d69ea547cb2d74ed7a7f6f0d036681e4e7d0d5079e544cb657493ecc0fdcc8942f93df4a8f404a9ee4f41c44ba99ce3f236ec1a62068bfa6fb93a1e20dc2740cf9abd91f31d9caca34f4c288be80492cb589e4b12e4bd73b664c4cc33ed3559325af26dc8de7b0548d4a26cb0bd8fd587e871475318581056c95256fc4e95a84ebccbe9382ee1c095a4581005713bb77d2d19a8c1ceb5a1bfb4005849f0365d2503f7ed6d849f377ef66888402df896ed571de6b06793da6bef4f6ea029bc014065a7784f7a83c92e21cd1c7001770b7781e894b46aba2e6fa40918a805937a9b1ea25efd59cdc26918921b0093001b36877a010209fdd9b4f5c61d4e7b9d43a2f91e72d4b24281151950b73de9de304a6c1cfa8e33cb5034d1031a6ab4d3dbf771c585654663bf592ecde6ad53a5fce007119b5b73a4103134662cfed595a02677b220cedb31b78c3063470b17a56af64024ba3cba30eac461a12b79a9ddc2b439ba2eb649defec5b2669830d6aaa8865a4ad999d8520edcabd5c23de6faf4d390afc3e9978f127d087f14d2abf2951cae4c62d7ab91cb634800c7db777306403c5023e97b3a0fe0aca6466b6d8b58f6f07acf1f2578dc30d283ea883fc3508679806febcee954a9a285830a39fba3781fd179f5068b9a7061cbddbfb466734334bc6a7deee3bb569244782bbd3c78347ebaa66c84d628a0c9b26b6af95a116ccefc57595f786b17967e2a21695fad4e76a51c1f697e8069efaa15bc10bb0c28b468d61c492bc4e037fd612486d746fc2217093fa025c80d87cecc99679887b50e31fa553ea319075ab8a2e27e87a5b7be0d9b0c750674c440235c2ddb8f6c496bd20569b52fd84eb264c67baed5ca95c0dfe125b06f4e68f6354c15cb41514a45a2cc62aa9e2e4a18cadaef473c983b0f952fdbc00cc3d5a960d7644484ba38e3428dba2c81e8c76db05fa606788fe32b95b453bdeec8cc778bb3221a082d453da84fbe4d4c7996fb2c98d2b06ddaf26c759106626728e6db392efa97f0c9707827f7976554d6479413ca8ea2e764d5992cdb7dcd64bb5c0bc7b213cd08d15af938c6ddbd1f2d5a0cfb0240fafdf31c0e9857098de9bb7883b8ae7e78187ced571a9fe90edbc6ca0a250d842b8a2b83adcd32354c66861784d7355c1a93b8b26fb67ce63be71ff7700352f3c5eed0cff007107a47847322f70d785b260f74afad72c98cfa9b495de53ce8b0bfc3bff0d88717ba8c47569e1f85ef2a87302976fdb5d866cb156152aaad33fca306839dffd063386303c568425ef47613a0de42023b1a076961c27d29d258c24246212883803d09e96ae41e6aff74812b7d55d00d6b83575aae548395f9572c90bfafd6370cda88b222a869c117c1d4d8276c176c44fd9c2533fec2d41e0ce343f60aeb7a8560c2241a4c97c1c86ecbb26b487c5be4ae37d69d465635db14037833000389b89fa9721b7fe14a3099e2dea671c1e63452478227c81575eb229234c469dd52494607b004d9380bb003f94c98290020569c244958716e584ec0eb7b4000f9223eead95e371323033a6d7d966e55fc5b38fb3881ee162d0e04a40c448a42587c99724b408a89f1db02c57cc8c0074b117298f9fa7eef5cee82d256b85ae755dbaa5838cecfe2e7da59956b0333478e46c409b493b3760c8cf57a8fa6521132c9dbb1ee36ff60ea6dc7a9e1af615f1dc6b81bdf00425d24e4a1431d1e35698b0267eb73bc6a512eec505f69becb384367a1d3dd7720f1cd8ccb582b39f3a66e5a0090ca722b8a7f9ee59651091d241a623aaf4588c8945c1c8dde04d2d7a48023c6dc3f3b764fbdc23609f0a9933909def +result: pass +shared_secret: cf55eba9c0e1be66a0023794be974825ce8f00444905499486176dfde1838c05 + +# Official test vector 82, seed: "373fdde922cfc416ed96b444e445bdd0962e8989f6c50adf9912a89937c57217d3600b06c95440448e3f601ae69ca5be" +private_key: 0be83a886381009553ee02aa62b113ea829ae09b3cf11b62d21091f1115cf548388e71abb52315ca69a4d1d601a192a4e7b494b1d3127630cec313c15c9cbc91693375a1776b51a08b56b31f38783af9c052b34b7c0cbaa4eac4618aca24dbc843322fbc666f07272a587c5c54b778aa446b349b88f2416557aa2bb9e3bc74979f3cd287645435d2ab30abf0b6e094446e95536dfb0cbafaa2e87706738b192ef721edb12d6d9a3dc366214e9752a4e8b0ac3ca5a69944ff0aa86eeaab62ca34b8fc7d74bc6eaec56612267724a038a47982fd6ab6cc726ea0e096529476329843ebe484fb7263b4e97fc2f68eb89a65ab8750ce193d9f3176bd876b69f9a826a64dac2186af796eed9469aa79660c295121367906478940099e51bc36ab67a72558425e153821ec43a560558d59b136255f655c161d729d7c21ca29a70b7bfb1b5ba66c0922947dca55d854863203064b52896e3a412a9a5afef93fda7601adc46fdc3a1d25660df46437debccbcfdc78a0d90234f0073b496d5b586a9f8b36988b33ec82c8782ab744b3355fc934544b656ed93eaa36734cb40217d680ea85476fa98d3a50c86b4a2589e85249b9a7ad01aa4afa2df396c5fda43753501bb2b614acb5bc715a113c382b6667457bc30e79e58b41b7511e011965820f2fd6c5280caa7a35c13eba57654501d6c326eda25b7a96ad0236c663d70f9b46cc798cb2a4d335f6c68181c49d669946673741285626b078401928c466c1c51922c4a62553141a86e4082f661198b07539a47283aea18c0cda348375201473a8d3f211b1770ac0dab8252468303b909d078524f10bc3d4958f7037f830b96c64c7f3a89586e3254ac823f8a4911a878c9394006429152b7260bccc60d4604d1226a87cf434e39158db5557c887207f1aa4bc9b3fbe8721dd4c96e294c2b581c78ab3997e740a86707888b6929db848ee38bfb6411110d1b5dca49dc4109f62762126d9a7d2e46400755513eca554665556d3ad2c047f011076e4fab77579c3f9f515500c7ec9747ee5b56f840994d2eb91d13c523cbcb506f011e250c23ce4243795b4e83a8f4f32308007610e23c64f38aab3aa9ac0c303edc77442a2a29ba6bfb46343e32c549d043371ab941c5982feaa30334531f61877e1515449690dc4c6a94de7cb3739c43a53a89f41ac39f0ab90622d41b48f69567c9ba5c128041426cc367ab02ec5c3b082936ded118a50c7933de5a5fb51a07f04ae11012123857bcef60e5e70a51e109382d17fb1d461a157c6b10b7eee63af1bf40626a61c2f94af7c93041676705fec9db5670777a462de3659a20ca8ec41060168c06fe925cf294cd2175e7591600492018ed70cda9266a7772103fa43c48129a1235ab1348bc5b2960140a460531ace8c01e6c136d69751f623c29bc0cad760743cc04011782790115bce926202575fddb867ddea380852b2420a7555994f91525d4a5ab5291983d87abc22407325618b04a42f8f11b203a33353245f06432778c2b3e9f08e2f9234777b00493364ee48cd5c256f15d62e03a52e5d52a849d042a84239d64a08f86a7a20334c77e332d7f886620461f0c0a86292c15180903990a68ce02d4dda33f8d34cf003a4ae80a160a27edbbb300b693f01a151d1363cc247b41c66b3eae25bdc76609d2bcc5f429540543d1db01c801137a99b1df325b88225bdf5d802c84771df545f806a0fa8f85779f56319e25d262b37f952b7bc962911822ab4f98bd65c9720208f6b0953b1d62e51937997b480497cc656341b2fea7b812c3db311784c6a17790321c1cc5021543ad7d54946d71d57c2a517b1187054725e7040cc4506de0208513366c014116fa4444bc06cf5e22e50a993ddf89f19aa14937443ce2676fa817ede4928f81394cf82b9bf629f8d33b7ec0c6b3a35c6adf0ce6480bd837655c2297833a8c150d45610a011b57224ce3b5b47e8b2895c95c24745d1e44b0cf26eee771f906089c0c864dff15da9e6c53c62371de9875030c534daa8be4719fb8a1dbdd2aa12617e4dd3b9e7c40906817398a42dbe3384fc4a4cadc098647ba4c0035774aa1d9fb85cd6d9695088271431818980ad32e4c493ea358f863853e2ae8be6ba9c978fe45b379f90aadc4b59a4c92cfe8288a3073f31f21927c546b8f148cfc133aa807fd7c233c7b5a5c3f6b8da210ef7dc5c1a834fd1559cb2439406895223991a4e682554c63ac3a117d840aa4848b1b3864edac960c656046e3bc6d3b681e1e6b49bb0259f1aa2a4329b2598b932e26c00fdae2cf4686803ca7af8bf0f1243e64544d51794583349f9854dae778894438805793b085373d09a185cda5489d74274eb7bfee433b63a56e14b95941440924cad32935440b46235a8576d11b8d65a2e8198b64b510fc1f942bd9b0f8e077fe33c559cd987615263e9b66c38c5683893c3e10965f18aa755e1bea6d1789913cf2cb21b41b23c4eecab25798ad13a26321c59e35b0517a78743c4469a4435970bbc2b9c15498b1f17cb0fccb446f67c2f437415abe98cdeb3346413539961b3dfc1c40e243296695f27152b7f7a32ff4b185ea437b275c6f617523ada8f7d2a594e277b9318019abc0051aa399642cc0a478ac7466e0729848a516c9e86bc8ad85be985b395e3b28ad89f71e3b584d857bbc1915a47a2fdaab586b7916d9a87a56235db0c683b9bbd5f000e6a218e54464043ea1e882bb906c917cd4449fdd5acadf5b017983c87b4a8b0fc9ded7a1e2e7ba359240009b06701b5cb29fa3b9250715ea31bd8784dd1d91d26764f32b9a49f934c8cf61b4d4a8f36f81d3ee33023959427d889e4a3c796d284a1fb0895184ba4351034a0280f34af119004e9b06fb1e69050fa2db039a9abc6ab00484b9a2694980197b69b9730da0b8455bf591b2eb4f9cef37a06e7c107bd56c3f7ab10ebdbc60de87bdc8c22f62c2e4db973140c5fff95631839264aabac5dd4873e44b8b2f7106c083dfff8b6403322f467a91e52cdd359293540a45134b97a39aefb6252c9c928adcb231eac0d790422a9e3bda366762e2514758badb2a2114a9ac924553d42e05d3769350e4ca047d4219f1b6fa953b60cc67b07a71dda85649af0076ec5c55ef46e73ab06613a84b2422c1bf039564a6873a9385fb18c4ab92ca7a1b205e8ad57728ccaa10b13268ca519c2a0da39be15918bc724f7760e826ab9d47cc288918b60aa87e037a60809b230562ce18c1d76bc457107c8bf80574a2cbd0f945c59d4371af14737983fc089a425d1ae74993451055ec21435a8114060baa6d774bb6ca82efec1a40df1877011163108a2b20190135900a98a337192088d8c66e9e774b02c6d55819dafd9bf3ca886d39165d1c4cf29b1abd6b185dee9671eb941ac598e1b0240d92ca7bfa119cca15a643ac29b30afeddba1acacca8b83a123102ff20b1bb94ccc16fbaefaea4fbaa36f3d46b7f5706a7ef60e04125228900261271c9ab11b04971ca5315e6f3c9eac795687da91eec532476bc66b2ba7a5650eeee119ea13c91bd94b19c31fdbd80842d25dbff62f928550b1f6183ab64443e6b0d9653c5379158af74a6436ce3a1150ea31367aacc7558c201124573235a5997773064a621869707ac661a29238421c9ce88cc38e733c75539443613d8d81c60da70e46035b343577a1660e08a67849558901d539ed84cadaecce4da36c4b9940e106011b872d1b9748cb08c2e3db4880638767bb67c74311021b6c46698a21aba391c65b9aab238d93a4ba80be911c3ba8319bc866cac3e67fee11b773ebbbb8639891809d555258dc9445fcd815af355ce2cb38552c5be069b6c7d0ba83f8495f1230f50bb57a8c4d82ea8912608cef0ca6cfe408052b736d9c6fbca2ca08e76300d150dba48080421c5a6b13f74b8f705b4eccf9c1a336a0e7a47263d30b5d1675df4a2abec7522868ba4c6139a8d22c23608c40a8bb5e8c65661b94e008ba442b9dd9883e8953029d7c4e7b46206880b48214a84cea0b34560f29054756f427d185241d946efbda04956a3972f974be20be202314d9c58dfa3543acf894d65b6f22047032e408636440024452f6c2cbb5d698730907c3271774da95b09421e499b17f670caf8585e2330394302aac52b0c1d2b2ad16656cb79257b143f555757b989c79a49730354e42299f28a166ece2a03e1a6dea08b01b9323d9958d9e320f3055c9500625b731bef77c3f30fb2960974815243f7edba28b64a58bf5afebd76b53675dbfa62b05b89f85f945c00b3de4f8ad2507121bab1a86224a9db9afe8c26513219ccc9b19156268d159097ad048f7fc245fcb93edce592a8d415d4a38502632973ed98b6f97f986dbff7e53ac28332ea3f161cf5dbc077e44f725b05ff0ac4abf95f60c5713aef1bfef4d11136e2681df2ef881b51a092a9badbe72c9772c169808521c47149578621e28 +ciphertext: b6aa20edc9f8ef7fd2fc2dc864289f6c98db6c4e7be0afa4539a83ac0bb55256356abb022d1497988bf0a664f8c2465b15f867aaaa9af528943000e9318bd733aeafc681a9d79e1a1466bba45d5bff19a5f4120f35b1c3c47aac4aee81f61119dc3926bb6c5cc1543cdc914e515b1258a22f07a23a6051e29894bc11019029af844a442f926d27b280f20ec61c4b633edd12c37542d93bb6deb907cbc3ad5ccb72a13763a1a91da7dea74966dc53081d789b6040f65d08c2dec770dcb3b5d37cb8387a7dd953df41f06b097aa7e866b08cbdb1b226477a7502846881b1bf22813f9e4bbe40d80ed0cbedbef9651a93701cbfa15384819df097306f7a8236c7ccedf62504303160515b72f08653ede849d19732335d5c4037252968566c78331afdd1dcfbc1336374e10cf679bc4b01289c46536da48c485ef54c6cf2f40b85cf272cb2d379a1ffa239b3870d488d8d2a18ba80d40d282a0b23073ce5303fa7266c329c03df33565c4178e99e2e0aea2290c846e5eb37fa293e4b7c7ab2965a67d76cc233f418e4711aab7326ebeb2f3efcdb2b79cf12654ad1cc22a748d4160fd13db4fd9b0e32a0cf6a5e2d03a88439ad1c3ec2d190cadf463e03cfd434c0a351e44950ae3f0c52f1987d69a8b6b7da85c445a0149e60c94258ab92cba1ba4d0f43da93ba87a4e1bd0bc62aa1d3faddbbbb6dcff737ce8bff4d108a31aff8ed870b0cd7d06fcb2a34bb9ef25f18f8bbc3848de931456437fabf9402d1d9b9932aaeb890fee4eb4b60c1d61cd7345d7a7a80d091566c9270a8e24a77bc26133a8964527e9b5b1fc8b376d5b65c9fb5bfc9d36dc6538ae8174c42a54940276a74a2a4d1aa99d721a113e65eaba503b604ccaf41ab0a867470244a08655211cf86a684292c2d3170e9dc2207a1edd0fff62c81108437354b1edffd0abf96c3a577820e7f4659561e11e57177564b1745cd240743eca37b0f827af298d25f5c352ad29082aa5a9030b69896d47e4460c210ca9f3ef1981fdce6fdf13a54bc77ca902bf35e31100b06f336690bf2f9a12fa1e9ae2b2a7d7caceb65cbbfccfa52c69cdee200ba34da38334356b7ec4d7765c3ad88cd6f4b3af13827240dd43c9f47b7f7b1fd918fb828aa6a8af0e8f7d3ff8710124dda6e6cfa923ecbd60e007ee6f2b4865937a411fb4859d40feb7974c9dfd27b41880056e35427063a1bf21f1a9ef1a7f05f49e41c74813452ca3265ad710a43be1afc528682e256d24d5b39fe2cfa57c9bf7f728e2aca3b36df31a9618647e4291f603b87a5a82850a0ea288a926812232e5c1cfc3b2ede5b9888a4a039a612158315bb55f2fe481e47dda46caa0f5f1db4fb78299ddfafb43bb55edf77b1402a3d61c4b9d84fa2cd3f9827b1e73a200888aa7ea2b4589400ee0bf389c3fe530e0227dfd7c7f9b4fb5d3f8d127a49b7fb33f3edaf19a1f546444811f5fb83e4126ac5062ef352319abfd9a34a8961ad1061d3577a3ecaa9220713b11bd6311ec7524a687dd46bd067cd8fed06e63d364f4bf4082d8b41cba87a5bc713fb1de4ef661ca05fdc40a098c56184e4e8e63ac7b06a9dd2bf6da4c5820d4f5a8b476f930801b9fc4767a98c0c597c4ef5a3cee795598c7df3911ba71153141b3f74e68eb3afde37c40bfb6a6da19e73cfa3fa4f8f9d622f9f9b7e027e686f872698ce1c415b4ea07d19c20cf40df424d01848e65093e52b049ffb8389626956965a1fa19f3ac8943ef2457a6c31cbbae469846b29a3b92ed5f6d37fd3192caf8fcca888e0fcc45612f0c8103eed3ce543d4e4f2165ab64100c2d1b86fe2c140faee78887df0c34e8520d40a7dddd8c6d423121df5688c91ec5186184dc4bf5db4aa1dcf071c0446f33f3fd37e14ea8ca77752bc73c4ddf515bf04026b68ae127efb7e63958494a13a0a0319f46ee9cbf92c36ba8f15e16ae46c5e9b8ae654f332e36713236368734d83c9eebac4a67c6d142ba20dcc83060c37733e6b9d98a75f7e367c905fca0f8b3bd9b53968d0f7ac129afc6a1ab68642bd5db00b4cb443797a239f291e77d75ae8a8854cfcd916b71cc53a135a96da844e75cabc2a455e7a17257a94ce917a2f92d408f74a09adce0705606394bb3e11db5554bd5ad035b28e754048d832eaf932172d942fe144ee7b310c2db9a6385ebb2ac085baff10b1dcae517a7ea7158dc00c3fa34ba0950f +result: pass +shared_secret: 1d660952391268c94f6c47347627fe3b2a5e1097d6d85dcc14e3dffe3a4a1fd5 + +# Official test vector 83, seed: "16bef67f7ac3a755c59c816478b75fcc16ce5844db537791accd1ebd49d2824b105fd2e970f728c8f0cf16e439a9ae2f" +private_key: 974b92e8755220ba2f34234c9c59c29de41c7b9967d54334aa259f05a73e43285e4a6ab005a36528153c5599b79fb680f2d82559b68bd3a46b159c3f2e28c960d6cbf8c103aa205fdd885bcbe2c48723b789766038678d15f72ecb96afbd340d4a17ad153a8f31a1c6b0f8291f6b5a1a4979197ba6cad90c26e25f6424cd1e856c0fb5ac336a01c7e5c472c575ae15a5264263d3f82c11a8111ad7a88d536884c664c4a52d4adb85f1a3567f48cfe068c038f5c10813a99ec6c605920cd481a6d6e0ba5409a65c6168f3d5a34e3b1fffd16bc5522d7861441300c550022ef3235c85f5a1fdb6b7c4742a42351e957666a66aa918d959a4f10d24533abb63196f44426f19302b3c0651779c690ca0a108710f4a8fa001a25f6619a49768416886c5d34dc8ec3eb4a89824e04e67cbc87dcc392d64004b5386f40796c71c017e133cd7853f2955289d7a52d7388dffa436ad1363c03902b15128285341217a0832f094bc37733826c13c0886e123a490741ee0859923ec825d26aa4a3ba5c094728f83956596a14f12b4b0958fe01bca0cf557265a5b5f367917d3841e3c16b1dba445038cb95542f7276f906136e7f76c32ea23d78183acc4bbd4067e08e3379ca47c2f37a4aeb1b2c4e4023b8b241993bfce492ab7fb26950b4ac8c5bb1f7bc209957d72a2a87d0b37e0d74c08268bd81822d4272f6048997e9449579b4f972bbbdf1a2083f49996725c68693eacd63d98f3bae3fba88dac46eba99ed324c5ba3523c5398df6035dfdb82e48a49acc15b823d51d812cafa9ea7041bb1d6b848cc4c1cb0bc67ef6a7a6d9b013f3356f353b1dc5c5934fe483099300a800c82d7513d8286e64d5b87882c03cfb1c981b2613d5981f92026f46403286136fe40272841eae68c34e56363226cfaf0c7fb4a64fd094a7cb3b1b8dfc7bafc2552bf98ec7e8967b46c70e4c0eb649a8f0464612d08b69a72b5a89820f1c1fd8e19a55526f592a79dc1a475d16099ec133b21c973c90160d68cf4ed7282096265df929b43b0b265982b4a78a72317cd603c09f70b622b14c31f52f68a6572d749b60b92bcf4a7f3c539da10c8c3c3c4131ec88485225955b63fe8617703c499f9201bdb583d07cc0077347e28b0275a26cf2e600122b73d8b22bfe17cb4a48183211a4c7a83f8002004dea91bc2863b6b9086dd7a8965795392cbc188739702ca7ee84c85c867fc45431a7579dad1bcdf5162d876499b039571174c44d679a7475a156ea73c14113aa206223e90a63c8b450369a89fa59fb65ac7ec1ce8e830b84a9a330e63f7f494a32867f6a815546d100fec9482771871376ccd5aa649293c57800792275349baba6589327dd883053f59d13695c41ea73c8b832a5521bc234a73bf668c80c7665a9aa98c0560da4a6e9ccb0cd7c77ef39670a731a53a85606911b900866a8d272abf56f31dca4d15c7ad19c8d4bb31d9e545c84687fb50757f54ba51d283dafa480c2aacd8c0206877948e1b8215088ab3c0b019eb42956a00e00e875dd4594175ca709164fea4a0b3f819e4dd57ef4d2016e799e5d645e8a47267bf714c88080d7329a8f075af812b3c7acbfa0dbb477b93b789b76ce445c58b9b977a681e6b22730e35a82851f40649a3231bd7fa1a19ff859ad1b007a30413087c0b98a31c9423753f3c2feec9edcd1cd2fd7a930fc08e811cf49762d792513719b370b7c809de37bbd53879b533fed6295e3318a03cc94c1f81ccb563afbb72bf6643c9a80c333134c8734360dfb4f001b27f58b625cc50e20acabf7e1165d0a22bd96ac403440eb802e5fda4d0653491979b331f0ce326a8365281b18ec83bd33319bb7149c192ebe202c6e2c2ad69313c12bc1c0b56599b90bef70a8e70b60b72570bb49c207524850e8a7b549bc07b660e5d26ea8d94a5d1a59a9c8ab17196000c97f48e2b3f060c8b2236f6cc60f6ee09d019cc631809c91da3ecb2544ca4237f37a20c2a82397e3be1f0cb7af6c693b994c8b811537e9007ce088f0fa4c02203b9e08388b186e3be11093e218c8c3763e9810c9760e26d6c90c6400c349cf22069b86dca993f36a303436166bbac8db1cb9e2a37c155f0f678dab52abeeca048b1813d63b42b2a986ae296e3f027854393dcf47004942ce611b9a82a54098c5377fa74b86746684a02b2cc8694852594b62cc0dec3c240c49b1cba8235b2b7220cca57aa380ca7f6ff96688b70299a0a52e34805ada0144632ceb704b0f08a3ad9c78dea9a9f1f556bb830cb0345ab9f2503342aee2944879ac0103caa1cfb1932062a04cf473ff372d72d500574660435b756a99635a9626f9f085faa880f8c332f674a76ab0196a3326b0e88ac19547b6e8a4cce3a3a60a9590d524e61501a41262cc67a3cf036e08e947e11c33d34895a2d4b7ed348ea8329f8e8775453a65ec242ddc6b33e6374acd4064cd8c765bb3079550c05e0054dc11b4032b33c4e9371630aff59986b95b7c729402d61c7ca3bccbadba94ecb5151bc60330379e24eb3fc36358cb83c55f18789c37c541e93b3b781d42904ed910aba5f6a4168336dc351aee66761cd17617db2962547d77fa238bc415a6f441c0f50fc2cc88dcc7049fc58c3bf3a3091458278087ab81569b607c66c6b6e4f677b4e0c3b4188dc3d3741ecb585ca68a72d0b18f18739e0194448a1da0d436f2a71fd08218283c416a0a580588932fab5903c289bce9a1b53328c70bb943660ce98773ad14a51783486268c270808cddf713160068cc8c8682ba11d4a21a3408b181625bca33491522949fe6a3ae6a2f046619114a0318fc69a3d58bc048c45ed4ac3a610ad1987629b2bd66200bc0e7b083b1b26cca00f576a2d2b8ad3c5212d956a5ee0985cc4023e9a99031f3a903934f2ec24e2ca46f06a26efc2a19fd28236e9097420337ddd61bc2b7c15fe9949acc7c279708a7365ca87b72b635aea5d67541853530f66be8da1730815852cb3c62024be50288c7ab08a3a2c442307667c8bdcbd940c0a6b91ee1657be599f13722f1d21848d189b8b389741a5ec86560f1b862eb63669753558190516964c610696e9b24a955d07bf388ca0cc4bd0861b388e5a9f1c78014da35ca594f9f1b766494b7ab4377eae61bfd8cbb5e775a4e627e2dc80c17128bb5c314be217033668c29198ce8bb27bebc79b1b4c5fd81578eb32709ac6badc3cfb7c414584bc3a38ba2ca1c9eeca55db9bc295791ba22ab54f9d22cadbc83efb58e243517abd4a93a11bd083950ec71536bc49b39c53d17b8a301a17ec0b90188c800cf2400312b76fd85a26557022909866f5591eb8017440364868c459f9039ff053e6e829ac73b2aeb81c9dfa78703c7af8efc6ee88c929183351f752a47e608638c7016026a031c289b936e06f46889e827a1e0c99ec431c763ae80e72b8e8cb87c3b7b74159596a9cc5a6c67253738e6889f5259a0ec87555e975ee50c82cd44428182827faa7b81a0abcd009a05685813e3000f9623e1c4536443811c98148fab9c8941163a57b8c7377d55a994d6ca310ad58012f51f94bcc9fae366a0591adb9a7a78e78478d1076d65c8f029867d69be153cc7f7b7c3f7f6b5f1832bea256f3f9b7f1165978eca35728115a115500677c1bd232fdf7145ed07810ea4651985a3ad7b5edb37bc21e33115d4c8c8b5094419780831c65b88a7d934bef0b9a52ca4299adb84a6d9053eb4999a92c92b353d9823896d3759c3daa69879782785017747c102e7afc0a330ae96bc2e7a4e6c4b5a637b2d85ebafc4e6c4cc676f78e29e6eb5b8a4bb942a797d78cc708ad3cd2f04217f18bb3677318d3a917db689599c009d3897d95b586e899e5855253cf54974ec4f6fe8be5a4c6804c99dbcd7c3e7407fa99b90a5586e9f180aa559a81978adba7b770a4c601980ad940ccd42eb70010254848b8c4a2886a1d835abcb9097253e2fb817425525cbd37c1b8b3a2ef47e8a15147a6a441be37e7b2579e5f74641c4731ccbaee47b1f5bd744a15284239179a70a70bb8217b1371f928b275e14c83554788687ace377888321c87eb5403cf3c93cd4c9e302b63533591d96af9aa5c47353c03171caee118bd868a6fe29575f5881c5a5bc7f67a2dd5457efd71329473364d509b02914d543843cc3b36e213e27facd6f0369f165adcbb314f9c4c8930564b9f5aaf21c82860035e9f729dfd30584b8cd6735aafff819f9d244cf8bcf9ec15770903a3cfbbfaa385cb960692923b88364100ff67a2dca71154700e0594dfd66ae557ccc6ff36519a2252adba29881b7dd1283d3b621b40acdb3bc22fae51c5a64488a3993ab8fdefb1682784edd39f0fd80883fa378cde6eff656f57119177c56a90b6cae64de81b6f1395296905389da76ca7c5435e1c4b2d93cc5c303d31bc0536ceb14f7662be0c42779459f69a145c0e2ce9f0bd9a0cd1bf32ed5694cc9ae32 +ciphertext: cda962ed9823fd85e1279d4c2855e9e16b01e1228905d7a7c243f94adca4f22a33ddb85ef0cf052b8968e3963757c19d104fb566b9188006da9ce5b5c57ea9c30858aab0776459ed0272a0492705c5643dbd7110ca2c2e6a4dfa8a00512f9b2cb730d5b94cb816587fe6714ad7f69bccc08f45e78170be9cce0414d096d961ffb1a180442f510fd65c5fa8ad49afefb8d96a8d85077dca9ab501aa4bbb91b121927ceb461c6c7b907aec1b6e874db0ec7171522122824975b1eae1f4319ca046edc531055034a1fcdfd37b05248ce9a1fd240e44dee1264989e1380a5970e533e10a41498792de3390dfbebe2ef26470276046867194bde9858589c8da307b3093f9fbbed633b628973e9073a9a2e204d436bf4b5509555e0e06d5bc8efd56f2e3ac2e2265987811b396eed0dbe7421d01a09dc97b90cf3df6dd959edaffec7d0bc17e01ecf78025dbb35b6cebc555f89e87e68e272e260fdca9f7c0b886f85d23b7b38fdc565270c52395b136b8f1ac289b8d37358fbdcb9c516eb4bd0d9e75afdad371c1a2bc693c3dc6f89a5c731666dd5d93c9dcf59be90a8fe8c48a41b40285fc43d6ed2a9112f43d7f46f79788642518039f9e1e51e8c21ea7e0c6246fd8395177b271d9dc6e3c5daeec361d2f168d3f50288f4078de91eda0b1396809f9dfbbfa54e6803894e802396d50accf38dac484237f1ec851d93605655d4ce0ce900982618baaf24b3e7521838b9b4b1ec656684d82b3a2f82fc06d1d29d3f00c83fcb4c579dfce129156b809410074fac770227de7a1263a8c9b619781929083b05918faddb75a73ff32ac0925f7cc336dddb1c03ffa6e7d4449053e3d9452b971bcaf7a914a28b16ca4615e76ea00f3c15507df347254a10f4957a560ca28e518a5569d1d153fdd625b538b4065c6375d8cfad5aba472ed15537c22aa8febcaf408bda07bdb83f737440dfdc28da8ce43bfa5edb7798921e0c70dc6341117e70c825f7bc9b83b8c5c036bf3889eba5725b7e1af2fbc6aadd190d3ab68f94f80bd71a4b79aac2186fba726d0be379f1669ab4a91e38c680e38f1495b96fb45533d73d62685621092eba9068eae3ea1ad1c27d094fc6c3d5f52c958391bd58aa00eb55c329452dce85199414e61abcf3608133dd72651c01cc7a7c0a1ad3593fd227d714025bd57920e92b1a3eefde9cda50456aa257ffb85668064c5b3e22c1b0d27dc0e41a8b68d9709615b5138e6272d4f8b7fb26ef147dafab88cae1027f0ae026a413f1f130fbde445df7dc517471223e5b0a5fd96fec3294c66fff3799597689e1e7c84c8913bb9fddf91bf77b339c8cf4412e8ff8d496c6f6d97ba772ab8b1c44779eaf1339e87bb16799c1291ad46dd9776d4d3b15de11931c508a6eba012182784e374a381c671d26ebbc2c744247438e5fbef7021001c233542d13e17fcc4438c4be9310f5fbbf9ab2cebb2aa2097d5f2d30c0471512e8b022b43f8025408ba09c31a246a8ebd9fe904ddb03dda3f1a7a74f64befc83f89375628e7ffb587dbcf904b8d7a5ce52407eed130d42dc4554771c2a10b11c09373160463e775dc2ae642fd76e43441fb544ecadae0b5d6221f4b65b458f02378ab217b4e3e980b0d0ce70f548e5b0b312133dd6c5ab74fd947109d5753168d395b6620d4c9134d6640f216dc86453360aa47e0be2ca5a4431631acdedbcc50e8bfdbbdcfdc9fcdd9695561716ca01f2a872dbe7704ccac7fa6d57bff833335dacdd3b3da12c5eb03556271355881dd2a7d47bf45e1dd87a3a7253357af6a4a92016c5da1816c089be187895f3a576c23226192ee5b66fac243fde774f645552d87e6a50d75ea560cedb453730b7b4be30c5420e2103db839ba14e6c35815020046730762ce2bad97b004db9632c5368fe4a613030eb6830767ff15bc01243158c4ea0033b8989b18f4ed2e5885313044b81d03a0ddb47404b815830c50922a79882e0fdb75ea99428435e776add924ea6921a01bf5fef8995904d09a898b095d5aaef5d46d253ca3a36b4a89d4c34d3a4d6b56465210d4668d4a201d0415dbce1170dd3a52c5c9179aa1ccd90619613ce8a09d09a44a8f042c652eb1c4836cbc1f8d5f4849e4f25ea5bc313aa79e48fdcad067386d8d1216273f7476da2c64cae20c0bfac4c2c4c3e2d05b080ea5c2b14d83d3f199b310f956c4a9345c57265e0a50ff +result: pass +shared_secret: 06b3f79ba4b060d1fefdd589c9b87c48cf1acb34e0491e98b28293fb6b801baa + +# Official test vector 84, seed: "d0611f9ae5be4da5d7eadc9109944348e716cb3daee545721eea8c892e7831cf2e54603146454cbfd92387739e9a78d8" +private_key: b3d43c1965522268cac5210ff79934c1420c14030e9da56e02e26afda97824904fdf2a107a37baef774ca7a87030b1662b97cf678bc3bcf7586d78285bc44a9bbc546a7b1f48491f30f2939c11516ee6cced064d0647950e004cf966045b871093cb8a42b9c903c5802bacc2aab484d35b319a0025c330208913220c2a8033b4152eb39b08fbbd468c754dfb47cdf790a300be561c004047826a03a175c285b5ca718919a119fb80f1f43e6bb00efbd44c1d67c853c118604cbf2b980cf312caf81793558050ffa5bb3643cd86788c6f5734cf652eca45301ea97283f6c52da4adcba71ed4e1acd3499188d555082aa43fac55e8e45bae0c023801133edcb2a5665bfb7829620ba4e21c746ac2c1e46c4000d93af973810a881c1640562426424647752f162d2e65bba6020143ab7fc2486401a30f36e3a81040b4442382608a02c4031cdd6a9569229fee9c87e668a77e9bce352704b8220136f3439c37c05c917eee0578cb2c689a907e2b2544d26444b1f0a11c0c34b2bb0806a072e39c6952e28a08515dfddc80e19413a2a3ae74092d34c2cd71e770deb1cdb1e15a497a0def06b14b6cafd066713f44a77755a7909bb4e90301a995c280982249714a72773493f060f6175a51f61a340022e69125716661d235b5ac124dc381a15fb356dddb3623c53fcefb0865d18c0a4b1f028704d50313dd0bc80f674d563588eab3712a5c4903f27c4a9a3440443c31c2bf51f21fa9e6417a5479c2b5be1a242ff9ab5da06124f7544172456115481e8441aeb7a8a01f218e286b9b52d5618cd0b05fc99a02a24420a359c3a7a09beca408915d4ffbaaa4865f37670f8744548b5bb8ceb9bf1deb799ca06483d521e44b63c9e485bb75c8e32c42247b5fdbc137856cbce035cec6e1323c9a04aa154585f8a9a6c08dccc720a3690d6192ca6e63990a5a9c7ef519808c68819a66394829025543bd3a823f729b98175b5e2576bf557609f50212524691f7b6bbd91a877a0b297c7facf50967059e2fb23caee12093ac230505a4d8d8963cc05277361c371b4a50cc638882b068883de6d69ef590a33a384deff6b618f9199099734e7b9c951b8318030a9cc92496db0e03e738e0a64d1d24afe6274e5e58b364ab1626fb188a91b35eda4156c483830c2f603138a660310cb39dfc490e510b88b5ac4ac9006e6888b33b992b8343c71085ad4311356cd5563e03c75517c99e9bb59188abd8880559d0b8fa290274dc6fa70bc97fc552f4a76b901a212f0364c584717a39a6e66568bbe0a277f9bffe8355072c75d6c4cfc7ec7bb644b8932b41d191a058f2cfda77cb3e876d00ad4b3b80aa7e1b83b031a4e3f891ff747b17782f633324aff6afb58975cbcc0e14fbc9f90584c51b049e6170af720cc36c9acd7002aba933b685b34c665e90a4219d6721a71b79402acb2e53480865b62dc97432d800be255e7565b5f7ba6ca39c6fa443ceb79308ec9c2527a799cc75535082bfb4a5246ef8026ef925dec7164bdba472db7919b17458f83386764b84e83e51e20b41346d424c65b7949a9db6ab79b091f3a980448c0d253c36e9808d586c6e55e669c40bb9633a156733c76aa709b4bc9a877717b5bc4b0cd91ef75c0272119370b8401c815c129836ef785faffb25ec787188f40990f986961c5e785b9e6627913f7b2163408a7f99329314305c0b330bfb0ee5759016b4232e06b627b84f6b51843e34425deb2bb8e10566e91b37a3657c2ca240f57711420094134c9242936c4a76582686db9001635723c63795451537831460d0b4140fc811ca977fa2eb7bab8a597a162336790697ec94ee684dfdf649e327cf61a15f2a6262a3001c5a342ace47b394626439b313f9e21382987ecfa533d09c6a489b2ff84c63c0f5b4c3f8895d2283cd59305ca7248c6b293ae1b4b3071e5cba9058706a1ea9add7fcafa2c50b86ca10e3a951a5fab5a0015ef09901b36b4f4055087a5361ace4a1d2acbcdff1048fe17bd84b6c4dc05bdf4c453d18c6250a8ecb69b3da26cadde7711c0520a59ac94ee57b77a6aa13db76bfc40af90161e3634459b3263ae233178796148b592271408ff06b5ec012f5c082e107510907bb36e330d5c9bdd1245242d724a6d438085a30705662eef25fb465a9aa584ee5bc009432c97a66bea57133df41cd6d6095a69192226c8a1c6a0416dc13bcd39cee2867e991102ab5c7ee37ab23d33e113b3e7766b7c652cd0fe03fdcf38653149139b532ac46b7e80229c2576c44834080b75d9f2490d79a23e6d6cba707458c90c7bb758e3c7049d5868b32e2c50441b280bb1fe7528924181051a9b35c6ac779645e6554b5deb21959754f3a47454837b9512820d04722a884b10e01b5acec05aecc2a778091bdab81f0091ed67a7c7d062085866df21734959206733257294a4c82a7295a739638141aa3821c764891fdbb64dbc6aebb67a8c82caf86f7248afbbce556055405ada63ac9f6423de12447d89746fea494662a69a021733592a0fed82749e73d4c2c9d192c994a535f126700a6c4cee988945353c9e9d2240828bb674bc98f22a298fb6750da5ee76345ee1b2dfda01862d2116e6607d3c251ade46ef82974ebd2a14502684be1cc3eea46cf3c2b3c4c14178a79fb495a44275cfbdb5a23ac7b8a911d7ee2ac0672b997cca5d4442a5d80be02c149c0c333caea0090937df91491f3e03ca3f8c85357001e4b0c1c9a73be64abbd7c68776179d4696fa138834325715e115584c368b720ac8eaa45aa4176e9860200cb56c41143985a6bae63aa16733464acb2cc948a949528bf6a91156a3a6bfb55bbe1980d499543720cfd435289c880ad10a4e990cfa2548f17bab1fa31a45eec41361198daf50f22a271c7f1acb7f70463b9b4c82b71228644b3421325b09de2946b829b31e56b0c95727c762b5b5d078c1bb46ff2596b4db6863987c69b26225bb9595d612a5a464d84b6bc775701fa5559d5c8cb55bb30e2e3bad532125ce9c790774dafacb19f4c9dea8abb25b26a6c6a51e27205b0d2031938a9f1700d353c2997e935461b121149a16f7a133af9a103b34e2d3180516a5421243769eabc81952a407486e2111238d99bee90554c32aa12e774dd9b17a5d98cd68029f1bc8671a9015591cfee86bfb8712a5948b9455caa51074db3771f89e74695524fe030aecf998b6eeb301d865f67b9bf4718476026ab3161c77f677fe77a301f357caefac5e579bbd0b34b51b8b58eb71c44c52dc669b9341670bb653ca363096d691680c95a0086601448c619050486b6c244eacaa0198f77d987c5083853b0b9b5531a716a10e7517484a36e38e465e4c855164b2091c8a23e5b2f220524285c739d8b519f55ab1d6c4505ca6a00f6cb6de0a16e1355c1c8824ea571611b8a3925c4fc64a5de44a2a1bb189d48aafefa13ace52290a615b5b4339008181d428f3d33267cc135a2649eb113c023432132a0b93bf08203b40ef0e6465c1ba8a1fa517c37c3d363b80d25c70248c52010cd995a866c8004eba1ae03e56e4783453e52609d6c84264c836857a24f2955fa955041a44c6157bd2e627124fb102ea2bf87b1ac628a393fe09968d707c0f27105b491e19c34dccc207367ae309cc1a0f0cb0072781c63642823623b2239335a73db76bd449b401cf5636114a22863b50ee32bd4804006f13dd66b44058b43be960e9a3a5adc3437298b05c7b314d3fb9d4c7020b64b6488f70a73811d934bc0a81677d1664bb497949b757b02e074e76c8a2e65410158973e30a2a9b6b034c0baaa22cd62a421bc25c7bfda61d0578c1436b808540cbb608cfcb78c8af6a43188bc26f637ab479a1ce86242766d9daaccd93c13d1885c7c994acb657fab0a75de17037f637076f2099560799520182b8265f9ea8440ba9e07b084efa2a6cb244d7db1a39b10297eda34bdc82bcb6a2ee871bf13c1cb8ee602c0b3818335895e754ebe75476ee1786d4ccb52c7164c33a76a3b3e2b57b170c34d37295d22e2351be21a95b6495432a1a5e8489edabe9b71a4459a4ea08b8dd65c4fbeb66a5058cfe7706d8e09381979b608230c7430879bbbc30a6150af273cc4d52c5f1c43e723a036530eddf0cbbfb6ba091b0861f1c751530ce52c947743a59595c15e529104a892e089b912975c7c598b1de528983b5a66a7a66c459610f63e95a7b1198b4e42710d69ea7a8fc3880c0876da82ce872952120a666aaccd5b1001b6b99877610071249db481117cd69f6a252ccaf1a64b45c84c2004eea971ade4659e3508e7b623fd9658f1ac8789297a8dfb3de7b385d927b522126a05aaf40635372f59af9ed4e64cd55048057d8b30c04fe6c876b8a67009f33aa451c6ad54d556d60210a23da8fb68662c39a1e08d893e1d1e784fb71702faeb2ef44d2f608621e831187ce79b2d2f4a20f1568bbe76b0d3d5af36111714 +ciphertext: df6932fbd48242f30e3b1ea4ada5d8bb84e27babdadab801a1ed8d36f93d123cedddf0da50035531fe9d7abede9969acdeb76d9f26648a1d0c2f4a03d78e7cb7321adac80135603cf52b48e6b9e577b167c8b4227a325bb9eaa7bcf517eee62c0a30206b140ac27023ffc1c0ed126002e5c54a146f29f615cb320b7d19e1d32704717bd271264852d8e154fd4739b54ea3fbae78eee7c6297dd59489bbb35d29994353caa7ae27850b3722f56ef241d6e2479fb8423f9507a0e232cbb0554af598ef5460e151e2f69f04e8508ddd1e86dde600d645906b5800ef8cd70f5a11b9c9db74f65b03b0c57b5d9d3ff821690ce41ecfd9e2f80593591b48ab8fff0671ff47f58f2ba533d9e11f6251384c3b3d7ab0176e1509a274af00df564cbd89d5145b9640249a80aade7e6c6695ec3628e1a035216bf49b7e4f034029399d3ca4d60455d20e460005a21393c5ab7ae4ba564cb4067ffe1f51bcdd7032e339db7875f3bbb99ea2893fcf2e055d4226e566260646a09d66c6942fc24f3a06c8fdbe46e95db21400a75501a6c10fe94d5fd1de7d110115525428d641a695f79fafa86a0fc6d2bb01060b9edf55f2efa42ee9a3473bfa966c98a2091f01d8b85b48331a727ab9573da40b55d15e5f68d227c7d8dc803fcebaf3fb171b32bfb30b82d812ddcdfde1c1833043664db97729967431194ab78e254886c404a2aba5d2de25e8e5c6d98f797490e8b135ef54c40b77967a58cd733850adc1b56fc39a5d1429ec6ca0158c2b4b5aad303834e148aac021472b10e4e4696dd73c49a7e2d8e6ca56674cf267a116cb76cddffce8ab6f44500d0dd66a0ae460571199d17b87d3dbaa3832e90f0e26263ae301ab6df79a461b91bd149a1e99187c09d259baae83cfa3c9f33d4bc700285f25a423d05c0e9a50e2bc3efd291c8f74f21c5a2b7e35f13d3e13d5e78c84e2cfb449dbc02ff4f1fd5e98164c4ac30f6663e2ce79ba97997370637437277bff8b2b08b1a8183e4b1c340bce2a85dbeddb2cdcff31152829c294355204fefa07e75fdbbfd48985ede759049de9f1625d43cc83c895e6b0e806874bd74c75f1088a48b2f0eb4e37f70cf38d6496abed79ded46ec7c6ed709161f2996a8fc337bcd8457f155252c0d2b5dd21937259c11e769d507c713b558ab492bb055d2cabeb8f5206eed3d75daa508a1533aaf3a44307d542e7c25fa8ac6a38df6ae99148a746f440687fa5822c02dc6c2cc625f90ab9ebe52162d2382b851b14badf23737e5e94ef61c8401025dae044d3f6033b257fd5a8f8b8ef1be2b03a4045f9da7fb9bd0efcc0f81dbd526c9c4cdf810bcfb3ebe0ed96e0bf69b0d1c311152e715e542ff959ca7ef7bfa072ccca22a864bf3c4514aa23867f1822be589e1776849d1b681832f41f4ea2109aff5926abf92a2d5f546206bc81b40305f2f2891acee0f32443d8e709c27efa376522d8deac407202f258afe4810fbda7868e916a683a6170bd2a221f33890d37db1a9deb131285549c13bbcf858953298b0c2c1a2a39eda9e7ba0c4d550709f17492fbd138df32c5e3d99d7553a3d5ad82f4c81e97560c1f0df2abaf489ca7dc841f12adfcedeb8005d1d90afea3c6b44e646b2774976074262364341f447a34b0b2ad77048d426b8502c3a0a66564ce93f75ffbc7589d774ab33e56a5a2e96c060f60396b7e6016031826c1bc0eae28f3694ffc582d63e1a7ea78c9abee8b8372f7acf672efe98e383d06ac56f03de79aae74c3a9b82a9cfb63e083dfebf2df0a50745c4f41b11e894d192a9fdc272df804a0cd577a7dca7b9b17bab29d537396de43a4554f2b4ecff541d3fb544fb12785c3d200d8c5d75c9113ea2a2a8a0e8f6bdf31f2428de88bc71ba028e06654d1e4aa78745c1e9dd9e5530c3037578bfe6f5b3f081ba5276b49e33992f2ad4494101ebfcce435943ec8c948eaf0cc109f82d0fcad7372fc9791fe4d99c4ba1cb4bb76072e98f76ff1c080ffdbb1790f886c9769c4011a36e9d88f33594e90222e1bc14ed23f53014a0a2f26344c7b4af10cf4b5dc14d7f3a3a9ea3674bfd295c6a78343fb64270824b10d79dee3d8152366f7c4bc99336d69b5fe117dd526744ad5e3dbeb255bf4edb49670daadfc69373ca1e70ba7a3a0839b95afdac0d293f39865013f9746c8eb4295aa6f5a40bf85300266fad6ce396124e71ed5583d +result: pass +shared_secret: 46228506ca245daf1bf40b48167a9bd3603c5d123db157645bc93780509b404a + +# Official test vector 85, seed: "fbc38d7614d7718e931edb850d2c6f0c5eea9ee889b3e25bd69ac255d5b91e885d93e808e66bf9c88c655dc594da5792" +private_key: d246b3612b31d8212a89f347bc6411c7f73e78e23a18fa3972a98dcd857165c070dfbbc8f62197e22b40e2021d5bb1384862c61a6380e042b3714695c515c5a984abfedb949f91c0ae23c4eda48a276c9cc9e6911fbb4b20620875127704ebce55db5300ea34a1c76de6a09c7933a1740552762a2d1d0754192019792a068942574037b949830c2121639e630449b1bfcd02970ea8887f4ba1cf278d819b14f9b58be74566846c742ae150a70380fd0ab9ce2557b2349890969af0bba2fa05335c28b2b125806c637ff4b70095f66e41c136ae3b400323cb04909c035b3c6aa4c5676590ab448c0e6aad6f246a6c59938ac3a56afa0e4e23844220741c93507c445a9efc53c7e6298305c5db623d6469c15a4bc597d1af24a532aa935aacba42da1831b8fcc344088b090a1b08031bb2364e2923afa448a6a7a56c45a90181527776a70858631fe304acdbd37036c83f976991ce8aa99c2252b73c6e54ca894301832c129dfa45b59a023ee45229cb8b3e34805b4d4590e857bcba451e9b6c009abb9a92a19b61f2b814325860680934f30847b5895a430b843969b24cb6dd1c66900569088897821aa058c2c814f3b7a0b14893f96fb241029141c90f63954709187186538b36c4c44536503056d740536d8212236925df8c7a5a19ab01c70a5100759ff5b46aa5c78a8833dc48288bb432b2e741d1746f0f81245982395c39ae716bb35eab66551a1f3c59b873487097d8748a285fdd1a6fbb963e3db4207159256f2121ad6216df07628ac607c1faa3e6b158c5b218cae892cf457dfc29acf2e24bc3672d57e014f4143d301a3e00e276f0066178bc08d66cb163157fa534c96d304e489b22ece80509e8437e23b556217c42b64be26a3f9a445dc830746b47c011ba941b118965f52f44d126e5087c81368b42f1b73195cecde34238f2300d909937722f3d2c999daab1b395851db4cdf4152fb699c7794977d819988020836a185f62a57e1ed656166ccf27f50482c517d7d09b65f0af06651fb15052aa65813b3b1bd1c33bdab745d9a2a2d7373e9d6b8445e9a35f17a8e47c79fd768be8f37dbe19a686ec6887d510f8e2181692282557458678c6d8c90cf1208c8470798f4799b5c2c63e0c350b46091b1a40286c7ad955ac7935965d944baf0ba45ad10512c698d4c6a117ba3132e06812d10d13708285948bbaaa728d2b74e612a5a1f3545fa937a11496add908c932849d577b2a7115b4b47e67e543fb36a809d6cc369a1cb3ba357e332b93276b3af902433b81fe546aa47a322b4812d4955bac7365f4e33e767068e5928119baaa867740068351cf70b75e2998b6e77ee1d80409d6b2d97c9732861cd9acc05b1a1faff8a944537eb56b06c3c520365bb405780d12016baf661bce454e6da89507267aa0fcc880078728d12ec0e6b364c60e6d589e50b7371a66caad262b729a0d34b08f0798951be0c7d6798aa99670d9106a186001b93ba137461c0d3b8da691194f0a9ffbda4418bc2e97076b8ae3a4fc700531c502febbbfc766131dd4b00546151ba804ef08998ed9346c596d804473c54ab8d6f64ae654890a54a3ceb9201a74816d086fa121034a6661a20295bdca444b1c64c9b77e235cadb4c08d75b5c02f62401208578442bd44b2615d3869f8526fc6f71a08b4a1e2398b81e86fdf3b89a3453569a66e52d5bbbdd670f173529d30950ab1b9166821e8538effc1495fd0c268baa07e5212fc41385bc0a902d85f5f2093601c77b43bb865559cab77b4e6d89b5a7a0a6d069e5ff839a77603ee4ab29a331c6f9b64aa626755e61648992003a556c210345f33c2300c3504f33fc57c32ec196b1a9a353f04020bb16818136d32737dd4c92f7b4656a83580ff053ad4d6a13ea364431ab1f3d8ac1f510d3fa25d8c33084a10ba42a50943fa22ee420bc7d656492952e157a689c73cf8d45487293b0c8c4245b410848670d66ca54a3a3e016b36fc1227ffcb63b9310b8dd73bfa405b3da64c69a64173c15000f88dcec5007e58bb05a81672e02414612829cb7e25637a77c49d434a44f4874bb4f27b3584cf85b3c73e2b9e0ba2a92b977e9c194584b04c3e8c37d9b7404e77802c05b50b3acce5b46e54c7354087321b4822cab148137459124caa95197546f8b65e8ca56e95a1b844147c6011e93057b8d35b6d6052ca045cc1d8444c1b603ff211fc67653a03cf7d3930373206d4ac62090712be287eb6404843c5c1208b0b993c028a445be50550e2b5625e3124bc58b256eb0886e74ec7f0c4d082a143139222b80037b61649e1b4f3079c3f12cd9742486de788ac1a987c158f5d20296742af5953617a5608b5b965ce1cc261139655a09936f555ad8882f3d7b823c400fb7056abd05bc4cc18636141a3f0c0688b5cc04455b768be41096eb7676315f808953c8aa95656e4686c89078e36290fb0b01697c56e41a0bdb7c9c6c6ab8f50eaadae889fb9e0a41d757ec6756bb6e690819b95bd02386398817e1c9ad7db807a842e75017f5bc6b46fa6cd1580993c1238aa197931c9b55d333e953420dec916dcb00b657b5c6fb538468a855e830f1afb9eb356098e12226a7a0718919dfee4ce6e275211804079bca97f291355790aeff36f7baa99c79ca6a4fb1979331494407b33cc6fef3663fa018e28d76e49eb1b5fa828fd7aa270f917e143a9a7938bd9a05d9e483a2d7725061a88588c3df6935ed6c411a149c634d0376decc87d2988954671c8e9249f517ea3d939af8a71d505a628958c634221f11ba962aaab9fc91565fb647973633a4946976b379199105eaa8e8721a12ef43325f08fe6e173bac2243ef74f92074d7e96124d70b3327839806876a6d6b982219bbce5499bc56df2b45af9cb67e3eb878d02b881a5ce9ec55b98808c48a2c963d8854f0172083c9bd2f55b15f6ac7ad7156af33fed0a5b6b668d654b602cbc3e3f9b81b3eb3c476b5bab8b6c886528ae4699e3768b51cc7f48ea9304d77cc8a708ed08321e97228ecb97aec4ba224baf4e684fcf62753985c8ea07c86f501433f40c21f6903cc8166a7332c0b6a8a9c121c41c35690413e98a1a0fc672fb1cad48d74044811f5c7363d7b03fafe2a6a3634d850cb4fb505547b72daa710babe7165b50ba090338f6001d8744041b5b3db9dc2bef60c5b73928889975f51548ab72b4b88a85cbe2457810115a9121f72a3d8dd6bd0c0b2476b2bb9e69a7e613a83d820670596353944a26a16115fca33c505a4dbc5c1136ae3a981da1d1a4b2c25ca0d5474916675ec8817a969e78812414053a4d0245d86119e1072c8dca8c211b9bf3c91fee350f2a0a392c4017c5705655f26657c5090206270140bb93718c37918b4ce79918a9356161b00f09a43aea259ff94d0dbc95a6b83eda5326397750c68cc6b498ce974235484aa453334e05c8232dba3dd1a182ba4543b4a944a5220c46d56812e125c06bba360ba7759cca24a1cc02b13ee9fb75ce8459df3c601da31ad552c153f789905a105929a223e3101f32431f346bcec3a128b0a3c3d4290d270b34e643e17bb5d53b6d248455502c71edd01654d028525576e3422bdf69571e9c10cf3c3c30227c89e2ce0c62911e5014b78b0cdabab060579ebf1a517414bbe5343bf33311c0ab1f659b3d30727184ec1aa8f1c3a3db45fbe215aca961fcd8ce98429d381995280ca0e5e78cde55442518476e0b404a2668424719abe71d64083ff8b63f285396f5989dd4aa9332426eece567d8098951e141ec43747c17cd9b1805f9245e0819ae416c61f3c60818ea448d397211e8b97e755494f0403a133abcd0882ab907e55a130528a5ac535ade736081d1cabd62980355cf85f84559ea36d6d3855030c341babcf65a20c9bb67ed4901f8b2617c7b9c8466976da39c6780003b71a74f6a16339082e6a62458835d30f1b32041bf9ed21c65ec59db3044dae0654e743a5e65836a4b9c5d2c9c4de859b1a6755ae7860fa6053de71aca0a61cdaa34eea773867a7ce66654380219c7b756d117a81e1c1f81156c6d5cccfbdb285c831317e5cfb8fc50b673600bb46469bb3c7c6072d87cc3b17bbb65b95e81875548b63e3024a24a329a4bb1404ff862ef10bcbe6a997c847650b5402b888e0d71c900d4a4a4cc429d717d3860a6615869f734244a0b25cd463371b189a243733469bb5dd97cb3e856cdf2ae64fcb519d9be1a75aa8794542f51bd67878e9a1b8f6d70a650b05b6a609ca9f477579264b127230966a289295719158b63931a3c0cb764e4847c9ac8bb91598b905a650a0123c7c0fb939f7e3943a2f3bafa20a221f37dc17933cf5e868b958e4e7cea4cfd021ef0ba63ff7a7250d21513171d5ecba1f135207bd2ab61bf7718dc6825848e742ad56f9f8099bd43905ebd9d6ba7a2985c1c4d203778597947d710dec806e36b0cd949fe460ef141213bfc525e5b +ciphertext: 266487d97a7e78c94cc702e1869784dee13c887088707aab4bfb065bb5ca21efe01033215c2ea740d838bfa46fe849f697786ed81bd42ada9fd509065daedba4738c5299b3fd20b9805bacca7fb67777b05e2d1f25b56335b2176b59fd4e6cdfe568edfe76fb17d9ec39474983f44752e59eb2e18d8aa659f7a0dd9ed701ff05f94576f9ce83c4f04e2d47c13a2b3c407c6083a486d299c7e335bde88ff84b6677938b2ba4f6d307275c5e883b06ab66de74b5613257cd17e58409a8ea521a81b43653f652ac178c3bd19204addb4d6d66e9fd34363c7a9359094600212baddd2bc5b7780b222c5acf0e866e16adba183f12410c7cf91a9512d567bbe8bba633b363ecdff1fa198abb376b1ab479fde329ea207d0c665a0cae43350c871a20bf99f3b867bcfcf26e144c64b38131558cca0cddd3afc9c095621bfbcf789af1db138a58c5a2e97dedbe0c05d1d2d9bfb3ab3b1d87770d61882ccda744f67e89cfb89385e989e48595b975ee51d3631187f67d35640aae07eda8f0ed815b3fc2bc952b075db1856c84d8e20dabb7b1ff3f3fd8aafee26ba1cd69ec1c37073f27cbca57f1e493a1833d57702baa80aebcbbc1475ea314135f1598dc69737f325dccd2c817746ffe03302546ee6a8dd0e66d2487fe0400eb0278513940dc453e95b1c732bfa691459e96d864e342d532f39fd1099d2d19f81349c92aaedb560d2ae2b97859b430bdb4662f1546056ec29f80f582af1ca3bff28aadc309e3e22f63ff8944fc2a2ee0e88935a6239a68704eab53e737583977a66798436acfd373eaf5ef04870ceb6ad0077075287892c01a914408dc1703eb332bb66c4f721264c2a582297bf4853a4d402193dd48fd80401e1994685f600bc1a1e4e6c1419fb944e642ae4aac3f3b28ed5ae13a0fe822a019174e4aba84fd0f84f5623d54ba6ab820859827ca997039018fae104fbb95756e4a308314dbef967add842940023487d5100c1d146d5f5fa270b1ae998e08c8370b21d4fdc3b7e56ba64adf9f8f7c4af431a0ab53611941fe5be38abd05ec13456e30c48f80ec39e111676dcc831d9f41c1a3861ba29ebb24784686a2fab5a50ca72c8d7600b2b833683e7bfe2bdf9b63eba575620cae84c87d7e9e0393d4f146ba6c8f4fbd3276567a0b45377f55c5bea463862721be3a02b7da77671e48891551c753520b52962c2d1ef4ae3fa1133f7c065328db517868003a28c59562d40d8cfda5327fca66fc54134fa303b506e7fd55ddc0263f72a9579edc9a8491ac33145338b81e1960fa395f808ae09420734fe952056fcf038af61ef94983750bd56c72ffd1dc13ef624bc3ce95239a71e2fdf9e403897cf45e581ce8af63a245223adca6a3a31132dbd21d55482871aa606345b27966e2e07f175ee4be7cf0efe4d84ab6fb979e365b26ed749eefdbbf2148eedfec6871420bcda1467d8e5ac88c3d023585d8dc980cb6d0423f016eee54ff9f93a62cbe758559207e9cde870ba5382563867973491735e0c2b745eb79b88f1852d585e90f572cf3e00c6dd2987a066ba1f742dd7f58555f5f9f3973334ec91700cd21bda10628acf624a31f9395a468bf6ff78d4484ff60e44c13af103a81d8d0ef5e26efce7530983527e95fa7a5f6a4280768bf91f0ea21efb607c73843a6d2f80cf77656f01608c3102e1bba81f2d72b37fe34cf35bd7150de20d30da1049499d775107c306f88067977231a06181b3700d602489ae9327581cd431a1e83fd3dbd92bfdcb787743fcfb066bf1446fea699f75f9eb3906cf829e31497d74b92c7bbdfaf798d2f54b91f35bf2eefffe1865abbe4e399e27a78d9e32c683590bb77fcd2dccf1ce27523adabcb3edc0805fe5439409f9ed2b90537ecb2066d7560226d352a8e67e54161ce51c380b8ffb176852d132d0604685b5b267d01be16fcc2934b325bdbcdbad79cde7d4ba07a3c63a2e645fc143d62827730ad34118eb6ce61ca2cdf890abba3f9169e287417c97d0719da6b9f1a45c179b1641dd0357ffee577aef94efd5b498868d91d19a780e2b65dffcfb23d01f6536d91bd49fc0e634b79449bbab49f612d41afb45060b448830643a0f246ab5019ce2b1e08f871eda66bf23ccdda8a421985b58199dc3d7e42207bf830b2b12fd859578aa2b153bfb93e65ea210a5c0f024925d77fb096b50c1ca77758fc67118559dd7f +result: pass +shared_secret: d51687f0a54626d49e07e8c8c272283b6b4f6a0c85c5a6875107b53c100264b5 + +# Official test vector 86, seed: "1722219cb5db47374eb0af0232c856a57f026f1cb09e5a5799f4c333dd422ff6a0a67c4da502faae727fb2d45dafcf35" +private_key: ffa253d9738c7f3cc8d3d9645bfa7b3dfcc722170ccf43200ed962315c4a48882756588b0ff85656bc8329c33d81dac016a5b048a25204396268ea3e16b63aff88a6c0b0344fb1afb0f530ff3b2858954ebbe8155c287b3c0244f3ba7aa05c1ba3c7bec8861a15f621d420653a44354415a152b774e31cc0d3ab9b08486ae87a406f17b062b224b75c81d3f1bb1678aecea90a9a950f86ec8fa357984e697d21c82b70a0933dd34e2782189fe64f94325bc3d068f9a56328f6cd0fc93e74462640998cacaaa7d4aa17496c4fa0414f55e2a5601b3651934cb566594027a9ba5a77b2729165a51cd457907a25786d4510a5e281c2dc3ed422a40bd23a36494d4825a32caaaa244685734a543c8c65b6bcc11db390c24c57e3821ca2a229052846fdf155a786cae0c3474c58c4cf6a4fc3f0cb4040a699198fd4f9519fc9533724b9d5a5c76e8c5f38d28f034cce980008645704ad2b5e2f985657047554b389cac253e51a862eba7491aa76517224d7d247eaf35fce78b0ce3c8ef14c901d2122e364449967446437416e052b8fa6671a04a173559f46015fbde16c11657c7f759242ec6950523be14c8e402a1cbf973c91ac94e004c00be513ffd90c179071c5b05fd20a3db6727b90325592fa06b220104988916d558817a734394b1ca7c95f2da093ff211afa8aca0c11bffcdb243e986b34b72d66647d05173ffa621d0a191e6e69cf7dd33c252a8267d50b57babe73cc84972665db7343eddc2926dbbc17f44e80e229ba494743b6201a0693f4081bc6124bc27067f0a566ee95b455f6cf414c6621536f14762ff8b1b36342adaa6c381656bf2fba2d96304f895b6b0beca0e7fc02603671d2a916a2b571cf17b060994c0d296089e3804cd1b76db57d9a23640bccb4adc34ba970b9fe131427538dc80c41b2891c0900b2c16a42018696490c4dd31329577542e0b56778281f05379cebe49f7276ac28cc0082ab23fb983811daa72c940b8ab912aaa41d3ec895d215bd4325268ac137ed7bb97fa09f5c7aaeea47b822ec6761740809a9b58470ae5b970d6bfc37c3092250218bfe248e2358600170b8c0b3444527947ac515211b9b2d65328e13cb33e413847cbad815412ef36c7e7a42a6f097b0193af3bb0c6049becb3051d60a10ba1c6cf4b9cd10583886172fb2527d85ca2714fac6a7352ead8050819bb08ab050b5525e2a093ce296a0dd7a0e79faca7a209e08fcc4366ac22bf63393eb32285a5dfc2198c0f3ae7f389d4283ad23e86a2e7972e6e4b22fcb7c5cf54353500d680288bd004a5fd28a280c09acd35dcd245051545b46598524ab218df38044f52f038281b332b2d6610d7fccb9f25173b48c8a2b18b3dda8c3b0abc4aaf28ff2b4a6abd085b6d8722c9a02ccdb96a0dc90922691f96769e2d9800cf5818b23c2f9030c929c3f11995c68c504c91b753496cf7b3b00e46a78babc61043780ebfb9f037668e3b5039663c8cc291db5f5a4e3352db5079387e5855d74b84045b1ecc7b0371a048f484c658502c344b6bee19e370c78b203260f6732ea55a0479453b4684454588c90e49d0a192f2634004d326292011f1d53b0ae71bb8284379d925fc139b581f402a9280dde30a9f5847fada70582a7af03c71d0a8a3147219f986c329bd60079f38f22e99dac8cbf4ba67ad77b0819334135d00888f476985441de439df0b81673d3274da42aa8851c34ba304b467441405559491662443d51e92f50a056d4fac1ed2357f00503f5280da63c055f923cda36916ba51f35e13cb17476a879bf88b406dce51ca85475b7447c0cd6c46ebb0722a8cf8d8250fbec5bbcb5b9b644238168151ad9ad156c7e0dd1abeda37e8d511a34b447195a897568b0809a02b4207aa8ec12b2ba73d64bb97952328fa1c5c19801cdb237ffa23115a774592c5f644bc60fe3b5b96a1689a90cd1d6abfa9a50bb430ae796364cd99d8e6261820282204a8dc81cccc40b67b82067fbc38faeeb068ab72ecf3a6af5259092b06b2dea6665b7901ffb6c2a243a3d2b4235552935c323aab07769aac9ba0a8c3813c536700ca8323ed662954adc5bf811c4d09434d0046566363775f4965e626346b6bc1b50655de01cc642b7f984c925b11b5442c827dc28a004c38ee59d74cc0dac334bdffb649aca864c32b4f082ab455c94e6fac7ac1c6c46943e0d4b811e48a80f18a22130589937a1f4e4097dfb8c3342aab55648486701ec3c36ed167dac427c7dd54a6ef844468a481595b933701a2db33235439d702967ac1b77f47391e6700596d52b534b6ef33357322ca6f1c6a6917b1d8d9cc7f83028437c125912b4e8d33db0d00b6d475452f41a5088a9e5d169d1faa564b220c3aba1d6c27a5b87aef7f4afb75442c0565cb78c7b81144aa3c209f9a808d43132c75399293400ef70551b51292ba501fb613998011a35153046787183580e485bbf5b81bb9fc690ecd0cb7449615a0b0134f559b6e1062d9209ca62aa10279e2c7475e48837e70a2ddecc66d1ba5dac35760a5a5de0764136618b78516a0c711c3c4440c1f0117d617cd64b55482c952e7617176443c802c8046012e9b774d0312a68c49c85a44d430984ec510212316d43ecc3d6fbcf9736cd3e712d0d3011b645107a22b9d8f51e8dbc30eba66e98624473880c3378b8bf933d6577cc31d0105e19565f848290059604f9b71b755e123b7401f204356120c769cccc2b1660e03e688a75fb370ca4088b46d955cb24b7073c8540ecb2a537a66980332df62196d8c6e5584b7ba8a4c8739eac585a812aabb33a5f591b428e50c7291415012467d49b232989c34711009806249580a557048dd3dc0d2d6599cd556ac325a5c00b8820f0c9dfd3336bfa5f61d6baa5e26b848b39ca02cc542c1dbe90ad8d355cec4c9f3548868e9052618c86fb729998cb4cd610c8fbd86429621e34d11c4943402c2598b80aa98f395a85a180ad402587111de30cbb41e0c5f6044219d6a243860fa8da94f2fb878c8625b8e8243731aaf5b511fe7b3c34ac3fafc68df6d4be563727f705ad41245fde8048d184337e662aeb85135df92d4c1a3b36f1c984079d50248f88523483cac2dfe959162a79353708d09b399e6534aa88aa5bb3cf3eb59eec6a5c8309c6980bb2e4681bc47b7dc2939ffd5439ec4473606166da1053e9467c50854712490b583ac02a657c61812336b47a5e2912cbfb4a1acc84991116b9cb1497f199ab41b98bb54343d188ae54a269c89c36a61be71898006bb9ec531d6006325a47a13995492f41498790bdae9a9e41c0cef6fc78f8e027380cae57c2372308a1b0c2321f8ba17867a1358c5c13095617c2b276aa3c0b36588a9c62683104db5c94643c69c1330db1fa9a66c107c62567f2898419008b9465355af511afc923415c545ea44f15e7b98dd09ec0d79da5893125d6125aca7adf78a32f918af2a41cc6377c04a627fbb28ad5bb65bcb16e3f32622f45b5600cc367348379894c65f494f79948e6e1941c10afc4cc00ed871e529c8573b36debc7c80364b01ea874f345271517b6c399a6277b80bfc1a9996a3748a0bbba5a24abf84d6a714695202ab7779637f85774c27a51446e72fcb59ee684873ba60315a84988b5936674833a93f06b283c6cc1eca1bbc36a02c8197480c24e17e2316eeb58b81a3f5a063b1dc4b20239818c8aa67fd96cf6ab52017979bd82431c862837a1b796d0744a27559e748db8da63676369795ba92d48bb11f9bfa5393c522403b6379b0d2c82beb17ef29b37fbebb387aa695d54c241d51fc3d5bc7f8316100021fd805d76a601862473ae3996b2840ec274bfc37bbf5119668dd0bb0e909fc2a28f3b3c469a9b279bc4810c040b70781f3d67c584a965a94ac1bc088cd2b61c54f301f5dbb82f110c20d51a6c882cfd3c2ad1e6311fe4041eb6cefd7681e75a72d7b0cf39742394e33328374e5ee5b0fb3b0e2c709365780ed3191e56008280188baba9c745fa5a8958c0ef28c1fb641e4ec13dd77404dcb031ff3b670a2092edf848900818c7104b3e457d4189cac8082b55c55573c2021fd32e4b331eb515092843c323b02228737b2c8915beb2718d63b8020c2b3a957fa5029638846abcda5c3c0cb2aef55d05c38cdc1755328735901ba53d685b939b168b9cc55aa0ae05fcb8815400a9dc36a58a1f4f90b3eda3060a4490751413d9c1453ec8cb64dbb679fc69073c9e839c40e8ba4cac38124c3697528404bcc6435c9c21a5b89cd05516686b4df7da8ed3bbbb9afc428a842a90bc09666804988c7386b794b460105fc5035dc3018dd494d421ae46f978b305738d5f40faa6dd68ee73df57c41f89935528e64270c9759d496204f118f77224920bf4ff7c69db5ebe12eacdc6012d57e2ccb3d690db251204dce3ce7683f8a03d3cf04e46970ff7d6a12494ae12558346dfc8fd9370bf944a0102 +ciphertext: 6b0bf99e0b0ff75905ca7bbfa272c50e2603e7c2c8d0d7a28aeffa277c279baa6eac0dae07dbaade7b9e47f863555ff913e0c55410e5eebd974cb98e3aa0f73bd7d7bd52c451acea0137df60c19ac883f92bf27fe16d086457c46820ab90192cd4f1bcfcf62d7904f8af6a028e4ea5e490f404e88596d0af72f3b2e1da4674e20e7a437f921f036aedbc3619fc9f0a700eb103146fc8ced979319283b7b32d58996c7d430fa89db2ac9e717b51dae25147d92e8ad5f01d738b3eb308087a4204377ef5bb35f8d02c707bd407a2b706e7832582b288a082b238c3bbcba73604537956c3d12614645539ee1aa5449b721776fcd829209e2961478d154f122af4e4e42a9a88a02579e2e60af3df04d56189d89ccf236c5b51d5dff985c1abc0c18cc85d1e01d8f0a95e88df078c296f50ea8efd6d792ddcd8d694fcd935206850f423240f860d94b9843822a8818d9e24589ea80be4ee48341b5fecb9064e863f33840e7f48d2f2ecdf64330ed811c3e9301ad48cbf5a8969470d12cefd1a927636f8f34d78fc1427f9e3876ea2ad0979aa967f70630a2c0347118b8f2fb54ce3e61a2538b57a941d3c8b14e8c7c10af9bfcabc00af5a5eda911bb1a489b45f95ae1e621a58d4c1a287feb55a8deb01adaf0321f2c0979faffecad7fc5474f62503056582157d7e920522adb236dd7a27b1d5d61f2b13924b78ae8fbd8c4187be30bd181cd57e138518d4914893c6ab475d23191b25ca3ed1ad74c0a519d19b3e269f0e9408608a898df75cc8253dd36641f280369365d532dddefbdaa9253e732f767641616c2d2232b0e3a7afd1b46acdba3f1ab7af1e422bf2c4c9b8e6d1585a50b900888dab0e2d7f421d213d8842ca007b9f5fe7f76c2ddc963671cbc896f5569a9531b5c22bc085f944edb6c95cfb6797586c8d8eeb40055aa002ca3110e9254e1af1a54abe82a0418bbab6b2325ecedb6056b7e0bdb9108f2f8443ae8279e0fc3db874cc2c0026c2b265c2bc9b406049c015da6c8d86a3d5b23de546a63b8d8d98d9e3cf0a621590e443d8147640621addae6d5c1cf2bbfe3427ab820ac18c2a0d6309c29568e064bebf72ba372b3ea006260b3b1b84363e1478fdcb8e727fcbb80fe0daee1cb4d0b47f3fc5690e8885c9e76e299ea74edf30610cd418437128bd48991ed47010b3f7a1536292da3dcf44b9ababbb2914f53d35f2a1c2e5a3ca48d96ceecc2e92089101e8ee50c9d0ecf93e9f4a68450a3fb23b34377aad47381188517d8d0c6a185a07d1de4a30ac45b328c8104b5fc35eddbcfac173e4b668d603ab703abf600d3043d6b64c0494fc757e530fc99b13296200c2016089472168c9230029ac155aa5d6ae83da44880a86483ac0a8384862747947e585f502e1b1e3aecf4c9c4ac62f8cf348b23e0e015665d97ab654f51f624e5b54efe23b83daf84df2812eb434393193d0ca8f8c7f60f354508d5e46c97c775417cb82b66a4d9a683c2d9397e3136ba9264ff9cd7676995932d9f803c6ebd2d446990bf5313cd4677fa10ea6d9c5d5f3bbc00667fca3009b69b953f22c33fcc800b4e9a96627c838966cf00e2b5647725ab18950de4fdda622b8d19d94c3b3f188068b4e538c1d8dc8f69d32d8708efe5bbeab6a9a3fd9bd58f2bdb4691bc72d933dd6b303e586987e57a212af80bbb763d43b9adf32ebdb28113a6f3911d95a1b75656efc36c4b950f4b523bff785cb5eb1ade5878d53c74e113a1f6f97abed9bcaee8d5a012d9453720cb4217a359d5b800569626e63b74fe4439df428f380aa00ee9563bfd8fded9d364ba45ef5477a4f27f6ee637435bd5b7c970e181733bdad678dda5e11969bd2d15504f705e4a3fe34ce6d6457dadc0300f6640a8d6c53fbbfc993c42f2c26a9dfecc04ce2bc6e63e1258868f1c787287e03dd4698d2d400bc5857a56ea37d8f02a38a7fb02c98f0c084aef51a83e8c4853043f71fe70bd1e6d758e673260aac5b305028091fcc44ccf993fbb232462dbdd6694fec69487fd6338b4a7f0aa0c3c4286223566cee9c4facc6faa84fdf7fd41dd1072353c51f9e5d99b7a15b9a7fcd960bb747a8a4a0980b99c847db7e6793b65cdab1abe753fde758c55d6ef85bc81df59cacaeac2368c255374fe9d1f94a2c482f40855f7cae9dddc131268ffee6a5616312893b819e285390ca57d814c9e3790989a29f9460 +result: pass +shared_secret: 73e86d2bb2813c76a8a901b8c665497e2d16615c5b2d58c9772306a3d6bca39c + +# Official test vector 87, seed: "ac139b78fd16ca0f26d6d7f9e15345c888d857b1910cf38d883339b37ead2dcac30f7cf10176f23ff34b4488eb79437c" +private_key: 3724c5ebbc753f55535fc5ac0069c238d8b7c111bb7eea08b59999349bb352cc5c18f9926bf676b53a15c759964f205a322a1c88e1b4266c2d6a311384216ee6e4625c15414b77849706292fd79753163975a4be5b9410f3d261e1931c934380263740d2a2666d861010036251e7061f04a6e8f8acab2907edb1cf01f906bb972b53f79df07b3ae368411913976e73360b077771b16489e83818b6a176223097e2397432c9fb4bb013b2c8fbd2815298b0214b97cf8b740aa4bd89067ced36be138a3d096bc51f606d3865418610083c71968fa41009530931da393aea3ad975423829233bdb9b0095c2421a3db1d914e502c4ade29c408c84257a2a1b2a100839600a659026e6362be2acc789a12832ce5d876533862c0d20844e903516448448c0a600b6c7cb812a3847037cfc0cffbaa582b9028528b52580c956d4383d10155dd58bb84bba99cbae99055574b02aea64828f4c28b8a0c19a4009d6e6c58c661bea9a84f6e273b9c50d9a8048ab144f168912ca1c5efbf87997bac3834300960aa1598c15221a1a0de795f9385fadca44cb036972a8c37dcbb61c793d851214a701b3f23645a166bf1912a827934a32a58fba6abfb41a4ed2331ce0d08378417f42c176403a9ca5eca30370ca2c523e7a294c7f9a7cf87b941ea47b19928fea095ae42038217b3fa0b54caecb60ba03a8a99745982835afb01934e1bd4c432f3f3c041e96c08c8836e267a30b8883997749b56047d182758a683123a91f70e08b1b42121b666c27d4c902939cc90442c19079e53b87b834baa609413aa3698d365e5bd71b247a7f0d42184b166cffd532b0691563c7874e9392fb1c9c528387ef3648d72cc063546cf22b23b6e68c340a23895a6573f80f30e3ccbde14f56aab4fba5505314605d5311ee89a7eb5cadc7523716885b4150bc07318902657ad101594c24c7328004a29cb8caa4a3f48c1aaf7c289a063a6ed690f72625c6ebc7c10bc500b8a0f5e807655b1470a4802fa6c3d9fb0beee3386858328ef97e0b94518a455c5c6a3020a70a9468cd784a38bce99492cba4be53624925c3f74c533aa681a8482fbba5c15b026462956fb4269bfbd3591ae33823425ee57398dcfc1e7f3a53fdc6b031267e59f0c82bb4b7ceca3cedb23cbd29af7c797867493046b30e1264141535315c24a03f08c811716da610726472039fc1cdf489595e072f717a67487b842a6c8b2cb33ee9420ec5428ffa6b85a7311014595f409ba93e8b10100ac45bda836a522c01c78fa8b904bd422ef17a93d1767f31b02b7540ac4ebc3cc6025884ac9fb0ec996e537608695b84c350eff27a15f2b83d76b1622789f55157be7274b73378994a997d564b819552389918b781c19317cf85a72dfe66bf8c44b032210b9395ae35f9ce61d002a2e4a0d6f823698698a0d475e6d90baf596b83d2628b5b345570680a13b56c27a9a2d7be01ec655da3c1c93886d15b6b6f28404c85b37b09701aea3c50a146be8bb93b10c65b96248a02bacec816444c911a700f7acc16497c536da22ba6995f89985f59e0bb5a16984a005f2c64584ffa868da78d33b44b1afb5a25f85c083ccf6db93a59720aadccbf2598228bcc6da0676fec92109480548e421a618c0f0a519750d846d4818f5d1a625b877c64e9ccb639aa69186b70775bdd6612c7607ae6149f52d447a9b2946af664b493805de93e9a4846b734c0946822df415c446455cd037fece9302eea5a856208c1a3bca48c35e88cb329f2cdd6f56a1b89cb8ab972140093f2686a2cfa1ee17ac413ba6f3f83723bcbcd933947389476ecf71c676a3c327c9725048dce400f791c9eae184aa95c193e84040cda88f1a497a2b90201c95248abaad0c8848d7280be076ea7b4ad3bf083656948c952417ad3bdd28821c9c92e59f90b5582bfbeeb560469aace0b1e7dd53d29f59f12b767355a0790780e19716b588c150603bf3680464f15aab3809ef240b1759288ec719b64f7a184b890060ad066a41923f25ad87b55ae89a1222b4bdbda1e07631d95c704f6866b1f9994f94681c21b41c3d7972ccc2b842759754ca826e433497b358c071f306a464d3b0f7950b5503304910529a6e476cce974488443562cc11dd13f45ab1926859952b67fdf277ad3cb8965c1a31e4205e8fa992213c49059a409aaa3ac72b85837cddde4c4ac42a9a35ac7fb80ad2d8c1eae7019276b1f3f3a6761602a01d99d4d050c23892427d6267efa092b587a5d2376012cb755627b9e63a2a04432260aa1abb2698ebb6075620ff11b01e4d049de698966fb49bdfab73675586583c744b5bafbe9692b6c6c1448899ab72a8821b52b4bc061910fcc70beaef424afeca7d3737f4c7c6711b38dea919e1a13c78160c1c652a81210c010c48908b13101b04334e6534aa0986ec01a86b30d41cba67e573ab6b0cc1a2c973c0041bd26721b508a667bc28e010265b762a223128e092eb512bb9d6150af6840581514470212d0e5c1f4696e45ab102a91a0848497e8a7a52ef20c85d7067e6a1f99e1c0de84473b735bfb001e860c3194029d5a06484920bb0e371114ab2f3bd775248a9449d2c19de5023876931de00dfd609c95c98c133bcbeeb52c0f713a19176dc90b5143a6876ab45b7f717865d4b8f0b8a2e6a45f123b85c8fb584cd3c042676ead069cf9c23682aaa05c1010e122473907547d79b0f8b61180014b1b3a56b88b3b4fd97eebb21eaab37883889a37676c61061d41b40b49dc5e68f64ed979bbd3da4a7824b32fc0bab9985a94251fcb740bd2b103f9c21c25bb055043c895531e68b17a3cf3190683969d6299c850b7d11a6b7a183b4b3a3daccc41d3321f5c088035102ab68b2938975ff180890153135e284155f971ca624c19f15ae4a3023f20cda6d404406c39cc26ac4df1665a3c19107a99bb289176a09e4a7c197ba72d6131980264a907b605c1e1791305974d49b604c81a9c8501ecd0cdd32a5f94dc3f64481164323736435d1043b09fd1ba63ab6956e4216ce47f719bc10f0c2b2830c17886965188534205c3f8818369aa638d5902cedc28b56c9723aa4eee8485151a270d3c1d963404bc265b912c6e52099df9ea72910674bbb8493f670620645fba16c0e6c73ffa20a99d6378433c6c55ab20f0a40c74ba37ddda39d2ba4d7f34c705a4117c618ad91408ba3bcce9fa9900d2650fb109fe2221f0f6219c226b74e7968f5aa0b3e3575be051446b1b76b8a7785a43c824c73688ce495681fe723d97b249e5a65a961abd0d61527d4b18027b00dfa49f4d213253e80ff2a556c48ace2b6a5122b42c2d15622e158e2613b23e62c6398838aa821cb05a4424817f0f9291f4ccbe6578941070b22b9c36bbe89ecad318e4251451a80202a70e1b2274854809e770677ab76c9e9c5cf4e8621e4338a279169ab46a6e5344ca391b80eb12f9b8a582105380384f2fe845b7298e52803989211498b42537b8b1cd22a59085bc00941f190a66fe77a1a6745e8af09762751c63656a26692bf1870df08cb861abba73b50ac6b03f880844a2c6811a031eb412501c79201e686ae528c84b7606aac09bc42265e77b56fde93022a71374693f9ff5787fa0855c79321d147831ca28e7880dfe1c15c66bbccdb93c0e7113a5eb9b97285ae8717bb87c1f071c284c0089fbb5a7b5121770950d255aabfcf54f1c18c8d9b2bc4aa253d5ba49bd2944a8c440d01343f0770f690743dd952f4f6692a60bc3360588f9575636748e3d321050c42c11d75b69d316cab62c681ab48f1880a9d787449440d1f1cfa0386613c2b3d25494e7c17d3e4b1f5a5780a9f088f00a9d6a79c6b1bc0e1d501fdb398421a19e316489bf1105d9f79c74433c82b87a775ca358965e8b1248134a94179c20011121aff04b95130f2ea20a0deb2d3ad8a0f6086481d8297a10374602661ce031b99012be53c70110b53d28966d8009ce6857f778006a304fb402769065c04d25b2f3aa1bae18a692d7552bc9805897c9b65a930ba11c6f3487801284d85579a912664118075b7237e66183c66510202188dc8abc1aba9524e0450b7a29b4d6b5076769b7e419fa4a63521619d1f76cefd0a7de67c7f5491724d063a13bc27bd20e9d486fd5158d3b7c04a97b95bb06895206058f94050dd8c262eb70a73746cf279350125807c52ae8a29db743099f259c9748318f391e524c9d8b46932157c94a8179e02897f33226ef1964f4cc92c7323df35a7700daa10170082f0664e4b8a221da0b5da84f43b79584194aa8c18724a6452760365c316c1f36212811a8e1936578653878b2372fe58505e7957a3e0e0f1ac0d822a80287d204eb6a446a74afae0ccd1859a2544aedfd8678b1f242830fb21f34f7beb20a96ebbbd6181890cee3bdcab29697c5aefd707f7054814869cf7625e45647bc1547aff288dbb90699b2ad84893f3b755d9722 +ciphertext: d93e928dc35a487d9008fdcaace3165118ed7938a9a119b07fc9a2110843cb1f43a8353b000f2ac5b46f989a23991c018f9d43e53c586322fbb7bf31cf3d28d93eda34863ef22f6b51001879614bd8abdeb10d9728183d0f2e6c4c64f9f1ad6790e5f27a6fd601620526f0e5380778bb087e2dd437ea330340444af5a65eff203fbe231b0fd1649218fe4592bffe22f6d4427d053f22cba52c25559c5536b262ffc21c1c384bdfed79a974429f9e7158eb23802b3b4d6131817a65efb093629d3ec4a0cce7c5e8428954489a7c9f10d9efeeb9ab60cfa1785fb0cce23cd7ec12882a840a56e106e4f2251ead429cabcb92a1de08c9e79776ea090e195a80b755d3807ce234e7ca665b3dffdc34f6f30ed2a67e246f8008ddb9dd29aee41495151549c6f86d8233da909dd49fe814c8f3213197bb3300e5cf5ae564e55b0b71c4016067d416d3fb94cd4be0f200d403edfd964da3372e7cbc1fedf96ef3bf3f4f2038877343ea9ea1092cc40249aa46e5a307945c639f9c653b44957c8f121dc4c84cca6a7a2c240f13ea6d9020233f4f75074501f100bb53dd3b7f9a905c7534edf518efb4090c47bd52f09cf98190308eae80b12957f42562d2038c85d1f1712fee26c66fc959577cae0d1e699f00aff7ad2911d6826879161c9b9b12cab1412e11b8a42502acd2baf888b82b8f2e06b03c6cd96d8a2b44a9625d029439d2e0b8f7723bc252e6edd566c394a9ef0f5496ac59e04f34eb0eb7cce7c446ed2b0aeae5ec63d27d7f2a257ca71763af1a5e85fdf33afcfc1ae8f7c7b992b22bf57a8f62b86e7da0aa00f2b2fac92aea4598b270284640a285db6a5a37eb74300f7b2814278e5813a213d89ba2e3c8ee000164d5e14cbdfdc869fcaeefe3a5d4763e5a21c2b27023f26067f2612a5f4f2603dab06a9e885b86aa76d920ecc59c77e9c26b21e5ee02cd31cd740732032c9bc29c1e21b442435db3554edf0dcb8df0c67c0bd2c1c9a822caf88fbfa10ef7bd4bf7423433c5b24cd61f8fb6c527ed516d64890f4a376604b9eb126a83b435ea7e8592252ebceb331e94be13bc4a7a3521f9f6ffee6068312a9ee6f97a9be5b86a8f6e4ab6a9174ae67b05151383bb79781a532f6b6e3101c48612ea76e98de53e13f3a7a58005e3333ec353499ce107dbac10dfdc83671fb506378febc6debaaed17c71069e9b9a51189d76a8504950682305c05a9d53b32c1ff29d7d8ab2b79a5f97a304696c5de3076504d0118d85d0e02c1c961774de4412ae6016108506e038dbf7deae8201243f252bb6c9969ecd50dc198cdb7c48535c1d86fbf56b8e138cae78d1baf6d76001d668e93600032374c1646f19e89e73318e74e90404b3091626767a7fc610771e9cc7babd9407c1de14d54ec1ea0440a320d0a050fc547309d5e65b6be2ca147f56140750e36273b7a0b36d689f90c9c8f7beedd56eecd931c5ad003a7e7f892d029eb5752e19464c273084490bb693677d448a797e2edd6e60eaa484e807a5207b6c0e5959aebf4830de62bf03a955acd692ad37fec58d531ecf49c75582a77369af12502dea9c051237e882dd7399ac9c6293c98cee53895c16efd7447cf15eb50d67469e9f34d444a049d5ad57116454b322c75f67f36da417393341fcff60d5b46bc6dd4a14bb53d7b9b2a70faa788c8da1146ae4964ff5edfc3b239a435c4c49a3a3313bee21295240eb2c2781626b96b99215e356be5f56c4570ad59812ac2944465015fd5f1e098a6969233e0a5910aab8096e75903023f3d11aa37086bf41760d010da3789b157175a4d255631f37212bfbb5a35c0e914db64d31e5cff36dcbe9304115d4f0299599b6b067ebb541986495584181b5f02a10d8e51f20795f2a2ae9e6da72e9682f0c39e70a5331f34a3e11c0f184548f7775c1ee7aa1759a9d7f8af4d876d0c94db0db580f720d0477e48ba4a74430b14635be23632eb1ea40cb7264d786e3d474753a8b8b6c009af2c6a2600d0fde3e03d108ec237508b3daa6bae725f8f9398b8f61c17510d135a80fb939411606080b9f972cac3fd4b1b0cdee99752f42f41daebf3608a70a66e569fd37d849fc469ded909c8cbc41b2c598b3e5e1e301308f2765eb68f1544565f1e1b950b26d16a127601c0e94f61920806cccb9d97f6293271a11cc0de7551ae996c6abbe317bb7f64ddc6bdf63df09fab9fc83 +result: pass +shared_secret: 17b113a1728b3b0847062a3ad34968ec3192cecdd758fa1c3188d57df9fa0326 + +# Official test vector 88, seed: "cc7152849c98d5fed2813275d32069e44824ecb14eaef425ce017448cd9a401c91c06d0f7eed6d22b7bbe8ba6c429ec3" +private_key: 081ace51252462bb622ed578c65c864be5210ad1cbe55b6288a8cc22d297edb0aaf549bc240963f0c65368cbccfec732a7345f43d563315442aa97acaee1036c58a4fb752984ac6e85c4b744f5177cba665ee2154b5c6c3c0455b4cc602d9c411186ccaf5c1a1ec51558fc5eb1713229ea213f261a249c225566c5d9333b9a579a907016406b709b8c97a0d2270aa0a11e72ac51e1a5192545c6515153e193ebaa7985bb23a47138bfdb6f96e47e8bda4042cbcd993948ffb7ca2673c4a3773e9ce5a97c34c543ea24eed7537ba8a5604ca316aa38b0b04beb922c9c62af8e010a8ef9b22ac92fbb7a6035e0c842c3caabf12c90b706cac75f6868b26b8ab652476d520662faa46ecc990a4db166262c19521817b3a82dc3b8b671ba21dc4b06f3150209f890be837882570bc7603c48026c44415ed938146c57b36c361b7c0b0e04bc81f532494a198af962208e0785ec1601b57967bba750d4a34bed69c1c4b2982b97a1fc49b4e7e970307087930b32a44ca7fa4c4bcf5a91e1b86a2d8c60e3019b7cf98f634aba74c84911ac4b159636a4d49d63bc81fb2210fdb40bf3b2a467cb101c43c68473046cc4b6b741bebd71b27a56ae4de70288d74e6eabb2f9a1b334f4274e7369b7618b31316f5555288ea88310b97ad7b425d052b21fb42487331cdaccc4398bc0a67b4a28a77a2396327a95cc6cd98b54058428d9a9d7a45f83ea5e1bd26222c60cc3f77e0cc87449836940815279ecb65001c5bb4a599771848e10a64d8c4ac30b57c6638fb11bb1350b1d5fa34153804556266fc8d70a4b56067718c47899a134e36a1815a791600a14f43c9a2065ff786aaec7a7c4571546ba339dbc41bd98c462a85e5b72cdd07c5af9979f74c32b2d501f05a57d5d659958b78f26853500dd47f0cb8ae5c08db6a6a97c1312ae3c20bb34c4c3a2a9177cbc1b152c2f9940937433b3414067093375fc6bdf44b8738b4ad95261e74371ea2cb2eda13b57579cd2a939f7c9a9950a32ad07baf63c02603a626d9c7edc89817ed02bbb376dc2c523b9a84e45dc811d736789647c5c291aaa9a3d01511b9237a56e26130445a4486962ef8682f71412104b7ffec39b11fc713a234ae3087181a2ce5a2a3e7bec354e2921806b7c99c57c8f5bab84a83dd75b16147ab62a39064b530462e40d38c4971c18bf39f469d34c12dce7707ad61cee073c6fc0cf6ae259ce16890c2528a499b98ac82712b8aee7225b78ec01a19bbf5692366e737591733015616c38e30924044c2f551cfe2c90755362c34abb53c59fdf8a50c1e392af7a0a739a5626246e655991c41c9aff111e2c21cddd5242801561747306fdac5b54cc4e76543e39900e491cb24fe353b45b38de47cb3e05693c9525f88b4886e1514564231caa5f33d776cdba9d6ce8323f7c02ff9310c7227a37c172392a85f3c234f73c52ecf48a3385c310554c04481d28b59185b8cdcf80437b04087a7820e94b95e31189f2eb4a02e4cb13e683971b9d9d912d2c369488a1037b468ca88061b1a96bb8acb2a21bc54b402cf84798008006caeb9266b9783ba81482f02e19da185aac95e233659672479d02c0e1a418852230f28a3faabaae8c058a995cb843d98e048499f7250e1b40c532380917fb8156d0b5ce338fb6256e31752ba16aad5b9c7e1017188de86e509109586cbc59916993a5226c13332bea339716a228cb2c6a90b485440a98d6cba8c5592b692763f853f56c35948b0860e087a15a78a134c3585cb034f135a2b79d2ffc73db89b65512253893cd2aa937eaa1ad24d0aab311845becac9f15b7ec1b6a51aac4aa45c337b44644499cd464cd6f717472a08cedb8570c8714d088a2cc21c4efdacf8cc59c2de91764141acb26851cc584484728fa1290a90338468aaf944c943beb9d7295cc500054615ab770423f82f329e3d3b751c70589c693009d7c1634b5c43ba5b795ad3873ada60669835a034d61439f3a897c021a057616f911087bb626ebb5a9e6d63e896371ae4192c93471b66ac0544131ec28074cc6a12b4364fe362c2fc68f359a7313ac5d744989bc33b1846a2b0db449f84a273738c9f2d98e6bda993dd514f17aa047e8b72e413bae7495f0b58b38b71d85a8cfc1f183eaea4cc281a5ba6a876d7233107b1beac2871f16b152d08e74e28a250999db0a6db7036711a24370401ab844cd39b124b8d42e8a15b2bdc85fe3b11c9caa30ee666f260ab0f0e230a5901229b974446428a9e24680a884208a2dfd3899ff1a4920b798ab275d5a10b01503d000c23db72ccbb3a91ab0186fa7850de3055e4531439bfa9cdce3ac888066d17469dce07f76d0397bd46a59c29a4a776c8b7310021128dd248beec9296c7c5e95d13aae21303127778b653131babc17494f0aa63c18260130315bcca7a8c8521e7b9c9544c1260bd201ef23974957a6a4d3658d96a7fd4cb7daebb11e5acec216042cac64af05c8a7db570ceb09393c7a24f5ae305280b1c22b9d68b02a0c521dd6393c20cb3eb798db457ccbd869748aa2cdc8336a58162e56528c3ac7a7bb41e2db1a35257b6135247c7802024ca258f03de2ea93e2f6c42e539617d27fc62510ea016deaf787a2b3b930165ff1fc8e20413b90ebc827581b74988937a018f612ac4098514480212781c4ea128680448b58a5a296b35020c6668acc7a39ec329f3c5eb00c44f43c9ddd612c0860031669c911e0b4d5d20f45ec1b6c5b6be399c2bde785757215be7617aa6a57eb6b797c8c5cf774274b2463d0c85e1343554ba052fd9b36da139e13e04ff18427b418282a5642429825d15636da6c45834375d543714e80530deaae0b006488eca46974642c8307aa5297d34619dc39863f276189a20b75673744fb934420a138506fb04b0eb2e22108c1923784523e767dc70ca546fb820de07bb9663333e623889279bc596b2f559f5699c272c3040602a0ea98c878d2af1d7aa697aa83f1dc10e54017e2e586b220804588473c4b9d05aaae6ff9c038d00f953547ec748e62ba3426001c3f669941596c6184b353d3919e591df898831eb11aaedbc49b88c8187cc13eb79eb09c7e07545be6041a9bd0a70519b17b5479aef79d105b83d74c08c719843a94bd1f76baf7e3bbd6795e05830184c53f42061f4b6b0321e2561b4c474865a0c825c96f9269e12742771c4c9b20b9380540772a24b43c2ab3051b88ec4760f794c17aaa55199e39eaab54c53aef32bfd339c824501972eb5ed299908ff0ab3da01460f106919b450bf00678967e45c18531d112b481918fb7023efa1617da59ff391b84b03ac199a1ab31208b918777a2c8a9706cc8359d09e4a817386ce09757c44350d10c4edf02625ed06dd3db07514639f67828c5077f0eb722f39587830c506c4bbb4bdc60a1b256bb157ed4770e603211d508165edccdb2d6cf37f039578176032c2158eb3c9d48921cb387339267bb728eccf97bf31309d08611b91271ec698d8920ca3bf334fd8765b0170608726a6220a3ecc14023f02aa4f31446b22da93597e4a46d451cada3965ef2148a832221c4d8a7d12157d9b3bc69fac8626b2dd1c44aea272cc2125dc79a4f90b56ea75144037a4f0060c33c5b6eca4572142310ce956fd6f31d23c6c9f6235057362b884a014fb5867b2c1976127a5a287ee371b7430caec5d35b63789b31d176d2553f82c8407f585c32511e3f0cba0ba60537780edc6ca22d1422ec8c3357eb203ee68c8fa135b0ac2836e027fe3161769c6838e98cd449c14ef2b07afc714cf02d91d387a27472217c9ea6bc5cd1249bba38842cf1b28701a6074ccfb7316dcf345acd84660d02381040cbe8109c5d423921b84771a1cba981c5fb08c5de08ae6cdb38fd5b9489357df11565d48a7797a6af82553225d73cebb362abb1ce335358c6776d9fbba731883ae7cc517e0a0a3bb5b970e4cda95a98aba47d9e2397abd7757218c5d7bc4ca59b70be5aa4d7b62afb54048ffb0c64919afb746120b383958b715d110e5e6ba666940328ab4510fa25e9b43537e566ef760d2cc52b07e5bc089b8ea9e166c513bacbccc332f36d6afc379e1a838ac24ea35c1260726d029651088996631c55e846adcf36c792c21011320b2287973a770d2636470c080b2893a09bcc8705306c5b364837b7cc89a9ad1fd9c1edcca9a0b4b81846c8e088b36fe361539060cc08c911c9058bbb0839183b0c59302171826dfc7b6fb1c623dba3f0f9b30768346a7714481b741bd0bb7ca32ed73a00a6a1874d8b7369f695efe75e00f03be6cac1476815ad889c69ec6bf7fb38ce9609c174b902b6047ead37da33285d1009b83c39ff67773cc46f7b4b2cee35e8e95100c31dc59eb9d604833a540d9922a7dba53d67a38de1634cddee1b169b45bb9eb3646e55fc0dd82c2f1bf2e6aebde5660fa73356982e12999d8fdafbb3cb186341d0386dead0 +ciphertext: edd9d2379c9063a3b97781b2f9bb06055ee94cb8182157eba71b983ccd18f237d8f9449c156ece2064d19ae1dc32861784c7e5829217397b27df13a61ce333f9d48677f1e4e6cab1763128d2b94aa9ac7f5785314289441fab4da9d6d021fe9fd21a53b0d18b58c8ee916232aa19e08da9f7521d4f959f85f32f3bbbbe741b021c915d5702a97028019c7dab562b9fe01bc3fa954e71bde099de02c842ca8304f0214c77741c901c0add89d96a78b1245875fe0a1523d1d03b7a6637c2fd6dc919e45d4ef10ba5e01996a43169dc5cc91293e382edffa16db90011f2aaf64c3a3533628f5739a2887c56af3dbed3486c2eabcd3c1d2c19667cceacc21b2384a2f38ef0de2969884619bd282af2cbf2091a959af8f26a15471b1637deec3885ec81995fb516e63c7908eb189bca27aa7ce70e7ee6e289c8aeb2ea4f79b9fc5bf0155c3cd09430f8bab8c70033afb42261b957ae60636204ef70d401678e14cb08767b22b8e22edc120515d9203abf4af7fd12a8f3dd908c7ecaed10e3cfadb3408401b6e96ceb58f71c69492a3956fc1d442ba092477e98696cd544f52410614622296c6aa73557878dedb5c5ac21801648cbd5be2972252774a54cd44b801e9cbe9ed13f73f3ff472d3f36751f7cfc5a81b93c0dd7bd825267ae0613a4c26b2d677712c2f78068e61ebbdcf955e44edc66910160d0981b992ed92c91a21fdf985d2934bab8e864b34fd125f85972e36802a0fc32fb2cbac4074526d8341a9098c9b0a91ec9d6371331791af6f6fc90fa5fbcaf3086377cfc141e0d972df44568adafa6bcdd9bd3792eeba068d8f07903a9fcdb2e6b29c5e56bd748aea8c06d502bfad55f28f750d0331e24c96d3760f796f12c4e6b97c5ed58b56836899c81ab3ac0f28907709e8304c95f6f67c80bbcacf1c94aef29ceb353a55005cb3fa48c9b39973dfe495cff4d483b1c1ba3976eded81e31c5325c7b6e177131d0a72315763731bb905cbeb9ab31ce7d1bcadc0e8cc9d82d5ce127901578bc742cb04075622bd5ccc85bdda27326e5f114295c2b31033b01094001634aa55b9187c5fb4a1e3be6b71f361325a54bff9fe3380488e0f09b407e3e53f2266133b8bc80bd96f7c2842430e653e7461bfcc5a21a29838103b8dc509cf01bb1984beaf43d0e5a45092413d396d9ce7f2d96762be56e45b530bdc7ee477337fc4318929097a60bb4bb88df9b4bb01b6cba86c148f841121cfdc369083fc0accc80d4e33d582427c84c34e134d06ca2023c09708d848a7c5cc6dbdf280c1eaaeab8d2806b53a28194b9a95a1e2509f8fb40333564cdddde4bc34e6d2c81ffdd07bdb5546a34af69347803c14e19558c82fed568f5d3da003618c6b570f59c1913a44c281e65295119219ae5427fd7683913402e41d60775d27089ae706bd00dc94bff715a2fbbafd9932645f90da872167c95ea89ab446828230b0be29b93e214caaac2b49ab88e420732d954ff24d0c6b0d07b60c34d9a25e5237cfc2950f01c10755631a30166e6fe742a316c3c952bb9af53782a255aa58fb817107de7bbdbf589a8aa1f1e48c7ee493117a3c76ebd891185ce21250378a39a495c3977e5a14ba6c1ab47ec71e5a8f3266046e50009e09d7544945d71a423cf320cf7e18d8759df9a027aeb38799a1590d74fdad410e39ac9e1f654d69ef624a1b9ba1639d1af179930ab071501f0df65be8a65327cd97cf028983077757f693bfc4fab29fbff36fcc9cbdfe23a84551f9da0c93c9905b31ada24dea830932525402db03ff3dbfcfa562ec028495c5fc1325a2fa5ca9251ad3853cd2d2a21051afd4b14f6677dc897dce4471adef042f067802b4f60559c0b592f18c33d6ce638dc2a56ea16479835e447a77956aec7b933060ca8ae1d5a79a9e5a8eae8631076de019ed933ede4339f6bcc01eca00845028001653f6c61dfb9a9089e4a84482ce83f1188f84498df81aa890e361a1ef0d226e6553ee3c079e796f7be70651b2eccbb38c7fbe22cad04f777e4f73d11569e3cdcef469e703070c4a195a499af2e41488f201d9d91d1162054bd9cae3949d7054056d487f8fdfeb1c6389ccdf76f26233d3635c4e1c4b7c831fff636b1b63e9d683b4e06added2541b5c40bd2d455bd50e2867840add364897c25daec0ffa4b065d78c6f9945868408a65dd78bfbd3d4710e6cbc5693b501570d +result: pass +shared_secret: 5ebc9538f357baa7df0165af3e7fec1af8f4c1c051a214135c1fc03d026cee6e + +# Official test vector 89, seed: "96d9a06f88ff2c2036fa8e914b89c765e4a510b468dee40f914f78858c811857efe9fd0e17c0048e7389e8d996b7e2b0" +private_key: 18264c57aab774ea1ba3555c788511bbc7bec8d072c953579d7b8558425123a057f94bc5670c85b11b81963731fc611bf751973a1105c7138d9c8ca76a559d20d25c79b64b70a91224e8110f623da7097668bb1ea2a17d8c085128225af2506c3f52a1f57011f849cecd605340724aa418ca6a86204fa02b0efb0102e4b2d6f34a2817643ba33561827b3ea92fe0270fbfe89c3f84438c4397ebe8a735a77cb8597ad73b95d170b329d491ba624660a01edd634acaf45303133127e11b4a3b95804620a7c6b1f84bbd916744d18487a5d9a54697716a965b7a9530dcb406ff8b276787ac9e846cd037a00852662a6b73e976807615bca1c00c1554ad0282b544daab0533b1ae9c1e71061dc18a79486c7ff9f0771a8138f93983134c5cf123955e748ce224ce925883c3565910088fac9393d423ad55ba3fad9012faa77957d88573a721f372b2e3fb977de30f72116090cb1cf02b0c1ea68cd23cc593e715a6a53493759f16a26a5c5745787115aaa233ec305b65b846c775bf36a754c8d563e25ab9e7681d589632131b8596b36a4fea7382938e121c38d4b2b218b90d4c602354a3bce5b58c4841c8daf61f8573b7b1e46f38e203bcf0a0d0981576a45215f2c7339a6fe91839d899b995b839b9b465aa942f994913b906698b9a31530b0d4f096de5aa3e885c6ad9468e1e674fc9b2acd26c4a20ea5363f32d745a0af3f037adac5350f07c5ca17738a243a29564455290602884866913d62413ca628aeaf248885b7517033583e05ccd55ac272b8cf142bcdf0bcea1a9c271e747c8507fa6bb89b1f0345300bddda4bf13b40dd323c860f237d8f2b14e03cf02e923990bb8baf13fbfd355cc3cb46bbb41b2f265a403c58e440306c7ca5a11cf2265562898b2ec28b5c6d396a1c668fd95b02e3451621a2d7212793e0921324450d601a19c975d877c84a91aa4b1e381d4f9256c0428c32809857b1cce8b7ba412a3f7d4b3135954177865677c45191294636241609c533d548dd5e8131be776724068a59242c1263e55abc515e4b3536c6cc836a140062e11dbb43ef9831a012b8c34714467906b78a5ed8a8e515258ddc6abbb0a110b6451544b78d85cb0dd78894d9ac491a7a5f08114833bb9c7628dd4061610944fd3a92205d7be722a8f2a51a07d75ca660107254c88653a79a8d79811543dbaa5205c290a4f615df4a24e7a7012155006db9715ccf712fd65876013a6c5f12c272c112db75e0c2983478328066496c34bcd763703e012076f85564719a4b477b8fc93845d30ba64164b28fa025ccb077a457f029b367ddc001b8cbed771b391857666ab88672b4bb5e4b653a8035225708b897fefd950f8d9614e310ef1b65942d53ba13611faf259f0a02c1cc357c36870b8b747fe1c66a5097ff49607007c0f52a74017d798dad417cb308ba8b0381f692081c51fda5b21cc5a471f5321d2128f0867714b141a37d983f3121054934b320aa2b044ac971870e0b2a6d14227c785504d341e3df90c586b5c66243b01b42f6686afc0c8b6a2faa636e39a0c550a7f61ac5af769e2573cea2a8da6b8adfb03b12c74b330b02042e8c2921239c45641ed1899376c7939c51c08a15e23493c9b8a6396c44bbaf4212b05cea4668a2e851c56ba56abd11410e21b7bf18347cb020c33429c15b6658248dc75224189cf5c53b920068c855b24f9809cfdf8c61bc9662e981d8dd896c8b99ee667cef1a4cdb2f14df05435efecc3d974cabda81dc18192bfb39ccd144787bb3a6051b06b1082f2b75eed10c4da0132d27c4fdd854b305b02c66a04dc50407d7160f1d54929e91a6a008d0a28cfe109be18774744250c69aa7ee7bc41944597311c87438441cb59b082a5348e312b30d66f936585f356c06d761ecb04b48339082f1542e3f3cd885aad7056a02d075aa825a3b99848c2e2ba518aa4e6662198fa871f744bff97351e613cf2e7505d2115be9a7386680300c1a985b39e0eb3769f73576eeaa28ed8c0f3b76ab5acb302877bce254fcf3636b4f6c4e0089d59305d5f819be4f380d669186a24214e9b2477334c25d23910907240ca8f7e1720dc8abd38e2b88246be2a55c72f6c1db3840370836f93992893b98f42f9180778795830ba59f09650986e5197a4dd239f99e7b5f8ca36bdd81e5969c6e2f8a58829a9b7697b6b36983e896e82b40738740fa2e6b657616b0b4cc0b15c2292eb5b42550f812673194b944b830051e4206670bce9734f53232b408a6cbe7542712352c453cac39741b5b940151580482b4752d16f58a1c090b101cf985034299840a186a1061e59eaa300b66fec19a3abac920a1a12e1e4070aa37893923067614f9e53c0d859917626c6d6658a0324419d0b0d16a647ed57c3cee638400875cb0436671a0c9f472eede423125a95c86c60d2301c85660807f43f35208716905ab4153b6510c128e038920a3a13e957e2e209afb46c7e0c9e92fabbb80063b93c0a963b1aa2d49f48174f86c761d923259ee04c65f4b85dc110cb04ad4e26c369682e213ac4114824a526b2e6a21705174110b538e3562bd93cb251962e71782d89e562482a51949707ac8337b78627d489b193600636fc44c44898b2dc7c87332f3dd9c7579a68e0c01211fc1957c43d781473fd3bb17ce14456e62d93c236bd9656f5ea8088339668658ed8cc1e909a026fb76f0ec747d5a570ab88aeb44750710c0d10ac86caf73f8e2238b7e51da8722317973bd544834fa31571f48744b6a7cac95e1d3375949038588cb1d5d50476629432ca9e43076bd260b1a6a3472be2cd780177c4750b4080c09c820bf9f1ce2de695478ba26a216ba2b032cb7729770514f71700864ab0e3780cf94cb7e94c88dd673dd03b8690ac65b8e0c597fa8098111d36ea9fc4b166d9e6bd4935993dbc8f21acb9f53a20ee118a721541425a31705a5d67a6196c91a96dec2b2b48536e118afbd5c8fe46455aeb282a7a6e73b734001b6d3a997ff1d50ac7d3c97eeb4338f13f8eac05cb0b6f7f60908c0b1ed89682192a6ca384c7ded2170674c353d9aeb8696648cb83ac986dff669e23f49c47e9208df49187c1155bb1c876d1242098bb7951454e677c67042dcde2af77e8090935b5bada59c4252c6889b16765a033d98452f25632710ca5553559d76358c162c70c1b5624abc090b59960c65889351529bdae24170751a45a566ad858444ff61cfeb7003b08605f3b2558577f0e12b31a447d377294e7e4060ec12a5ecbb9770bb8707240c1237b08c744e70057d0e68e2fca1cced27a1997389bdaada271054f72b849329e9a2321aeb03a940c44239844e94181b627876838671bdb3e9b4061fedc74741b4b5e9c4b421167bf420cc8077c5bf02721076c1c5462d7624f8350af75c50eb7267a96359004166c84145e72b731d5a82d43469c98b00a0c2352b7806313c60c04dc5f5c8b39d50376a9461f2a8773fe06973e852a04025ba6592f632bcfc3ea0ae572a50023c684a4a7a0db573ad1494458990938c624e5928c028ec48a9a26492420781071d13a85a332dbd8abb8f318a31596a38c7efeec28bbc1aa38198aa66ca68d811cf5700d9e093e34f38d0cc74a989459ab0b200a8caaf6d40ab5e5cd651c05fcf68e14a1ae602560186a10aa452328218e41c49b7e5154c67099ec790e88ab641ae03dd6acb82c33a6d4034a775515c52859bfe354b2e881c7c577bd5663b19b124948739be90addb36348912710cc12102553765c580512b22ea35141ea4ffe681045497fca77ad2e35c1a5b31baec2a8279c783d28241c923040607d38463a9b615be08ab87acc5e31b84ed8376d75f31dda47c869f82ce14022acc6c70429ba854b58e942635a12209240bae3137ec8a40e716655a0a82bd02003f20428d15806594435de6c39b746298aa9a693577783c71154cb31b7b31283f46733d199ae627ddb7947c4f4aaf1172858a97ef6140f56477b80450536396399a14a984caea756b1b5c09ed1f43c4e1754f40ad0bfc8c5f153346e0113930a3c9ad215f11c4ece2875c41516b0a8452e948f3f3cc45960bdd8b23f14eac17927142eb4a72ef6c3585899efc128f53b022015b2bbb9642b5675be352b9d442194d54d5b40a17c236e8a275dc2358fb31471a3f521b444040d983e64976b50f71441982f29fc690c41a954512f82a3abf85235847a28982009e3303239454ce0c7a2c3840cce031ad37516e6a3ba59b79ba4478afdeaa8ee8ac4731ccbb34125d0a7c6504a8d7e285171a464129b714d8521c69b8d952b4623aa8967f644c8c08bdef96117198e56c12602501201e036804129d528d717640ea33c9fb4885d61fa43860dafed4282b108cac59b140df7d3285c832994e7a4ff5491c786281fdbd6f43a4c3902d4eac0d28b2809fd40008be70a6b184981101724bc3d5ec5e1956b510b82fd5ad0668a5a +ciphertext: 3804e49185cee41c6861a7a0941d454024e2310333f1103d73334739510be6a09619c5229bd73c4199399f0bc7e43ab79b06bb836cf443912d2142f98a5dd284c457740a4da361946ea3138a9be5e4c46a7f0550b7a807627ccac5e0c658a0a57f70633758f77f555fbcbafdbdf5a19f2e0efbb7e932b262998f179f7aeee18652d5d572d5d71d0af89e58a1fcd401287e046b1429f504a4759b56fc90735b91dc640c55ce2f736f1ed491cfd3fa25c17c2ef4afea940de20ebadd1ac456c5c184b660e3a2791df78e4a4716fb09a78a3ed4aff107717b8ee823f689c31c1b7bcdade58567a8941a64033738345c6e7f11378b6c3b680b94b15c12e9d291ab54ac66def4f97616bcf996a840b93c960e24e5729a92da64ceb8608afc9ecddd9190a188fe142e7796dfde0b44b83d37b4f3103dcdbe37f0db2c404517be707b0671673e2f53c59da7dcea24fdf2ceb22a711e1081ffa529df068e8e2285b17e81c45d43d672f02d49e04df68f784be77625131e702f12d907e010b1c05fe379e42048620f533c9e17e0ca8b7aaa003695d085bdfc2c74f98dfdc9d7290f03dc00d89c2d94ad8b390ac3fd88e4c255242e7420c9566fdd6693f94f86b3317d7901305e209794d0ed5f0038a5e5f988b2497a5732d05b0372fc27862b339d3dbb6cecddeb0fa5da20e80edfa5d8677301eab7ed43159a1cc62b25f10a4a2e1c3f1d08884177ea74c2110f8a496e73d732f02f4d4a0c091aea4b4715e78bf1738279006a4f8e3397743998f334db9f91005333776a6521b8931fec72e2231efee7043517070ef977cc6fab6bda27de97ce4ce13554dd35668ff0f753606f2687ba5b1a12b2b42607e0a767ff95e962144e7e67065efbac277cc1695ac1e12f1a82072f9ba15e24af37e36b345fb50cf7bed32803b63343ba5593de883aeffdd75d92cb42e15efd70b944b8330826b31b1d69453aabcc803b3f1f390548bee070b84a38eac4fb244247ae4c5a26024a8634bfbd9c7eb94fc84a65599805e9c150e215e2978064d7dc5bbc4bcec8e16adc6f55190fc11496028afec6e41881e0a0094bc17632249613b6e95cd210f7763d2ee99a56087938f721abbfd09a72abaab9cb7aac78ee1202f3406c0dff5a4f31e70760c7bf2f7cd4f27fb6f7d6e9e9eebd737f30c080c0ea8bc5bd6d7c58cace07bc82f55c65788624e7e17faf3f4d54b0e5845b8da07cd51b589409b2ee4865b908367d1887111c8817ffda5fa7ef26a5db54cbd2b51777865240284aeec8f7c40966e9589f071d875858133b1496e1e5b9ad7447156b60067fb0e61441015ab474d1539745386ef550becb1345341a8bfdc2051041aef1458da87fd8ac4016b9b8ad24f9afe3f5acd1858639068512af6fcaf9e9522b98027dad0f6ba914ad2c35b99528f6a812257cb21b6ddacec678c2bb44398104b373c984f72dac502cde60d2576d3def63438697d50bc6e912a8f6310bac01ebf890200904318b7efb9616485539c472220735873ce9885e6651a244c56b296c1badef19af9dc6ae5ba8015efa52ce5af25768dc10b32ee36b637c4048ad832316e20e5a929d0dfa8d4dec7d5e195e0b59f52a4e39c05a4fd2f23962c945f04876bfe5f0d2cb1b66b7c7ee3107c823b4c60d98521a24a7f82f39e0363e411c9a5a3c0cd3959029a5f86844e08d13997cecbb483f24060bf1ed28892a99352ec3c538877ae85339c1d05523b483f676dfb26b3e3d154ffc3d33c46d06b089c6a7fa18266afaff1552266f5bab7ba6cd9ac64a1a81ecfbf5f654428a697ef439cb6ebe8c005f7685df5a0a9f475500339ffd92e0103c78549b3d4984268288501968f0e21c815a7c3f6e6f50960f5de64ca611c584e53d7c21c0d002b699fe330456ef42840bfb8b475f56deaf67cdb656a7938d0b7484687ce5eb0261cd67607d9c822e9b3e4991c32ba9145c6d33ec1fa4746c27c4e0d38c000495a8934283ce88e7460e4e6ae32b16814703cea8b0f5d34610b401677117bb3b78659d2402590b2161791c10a7c975e2892e316d49cab8f54ca1b4cb98d2f1ad9ebb8f91e57240367e1ef5831d77769e73c3876361356243c120c224ad8462504a1ae0904a707348aea1e29d1c6eb2a9c60e1f2bc0ea4a9e0558ec177030aa14c394cb946fb23f1cb0c2c6472c13fa3405a60434956e9cf7a686fe47a08f5d8d5a +result: pass +shared_secret: 2478974168bef71749a93fc9005dfc0bbfdfb7c5e485878bc04025ac7f97de82 + +# Official test vector 90, seed: "d26ce360d399bf7b89dc364aa7ac06bb513eab8f527383e93e30727edc3f22c262aa0ec70257b39edff0630dcdc1b79a" +private_key: 6a45c4d6507cd4abc9be8cc42a75bb661007f8bb7c8a408e51fc9b63fb8575683e3ac77aa6862f808529819219d8639f0c261ca4a2c2021426b53c19eb7c6dcb554f39952c0f4940fabb4c03903c5bd2592fd4178a68601a8c4b4fe598b3b874dce5581063351683a672612904b17bca915ff161c26aa8a27b212a7650b0858736c1d7025a987c91171e4465702007b4bca05fef05186106b895c62c42f33aaf449ea0d4982c46276069a970e04e8c58ce53356f18a99c7e2a8b1a9714a64aacb42338a2e05f377b969c82958891a9c335ce1ea24865ea1440d99038d82035cab7d011508a802da9b51a00192344ab9a38a59a2b203b448639b89a80b2c2b3f6163562cb2a01f526bf812181ac466c55013c94190172c086a2cafba3152ff247b89120efbb1e957a33615924c34c0260034a9163c3da2b2afa4302595c4170953864990a95146dbf30b379f343b2f236c03bb4851775da2a50f9a40121f7107d184d410975ed743fdb674b179c396b33c808b1af0e717eb95000b62526598879fb5b972b54668b62306cc2c196f81113b72f6e4b0433b44251121cb7b872c54656a8e211b30b57c17a29fbc91de1a8943eb2a0ec7cb04b4b3d4d057c12181684519da9da271e8189c8a6171f9108740482da39c8da064f5d2745ea9585702601513a2c5c1322fc95a7ef15ad1c4353710080ccf396f2f006335480ac1932407b048e72c0ac24a106051e7737a1e11ab0905ab829404b5e37bca2ec9f9bdcb370b68404875061f1035978a3c7f7962fe015aa4c019465cbf37c929848c335e9cec829218e15902fe045e6d43c845b99a8878ef7a73238fa87cf0c58dcc3913dcb29238928d948c94bd54029d9651b25401e64a29df9a04c15bdf047a3ae857d74a5a22b383069ec24bfdc3e0d85aa892c6e69651a07eb61ccb40ea1d0bf624a17c4b849fae348f8a8c326f875dad81227465688b264de92a195635a690b3d6126989af58cb6e205cb8253ae8472e2e9b2c8d711fea534ba41c108f22cef0829f1bb4372d7a76dc4901f07aa413395998734390c07be80ca1dc6cf087b11ffb180f94b86c051b505752d27ac9fefa29fc849c77201b90641906492b54cc595e1dc71738a678451aeb9d4a30bfb2776435eb3d990f8405623856abc7980b0a4c65d40abba6278fa4c7b3ecbb718180fb3225b597acfc7e43caae9413fe858359334499a921b3216a03403672b6b1920c6f39b8ecdba69d87ca52542cb0898477587aaac8369f6e39ac7609c437456290434b002b2c3f32b05c41c1f827accf461dc159fb7caa9856438fc232a5b4545c25c66a8a25c1f240eaaaa263f22cf5fa86506b51fff385affd91b6ad8bb599633264c3ce786670ae70266f898a48040639ccf334188774c90b08b99e1a07be3244d7ba319146711faa921b647c7227b6caaa70152701562d81bd1d1cceec218ea967bdff454fb176f6ec504d7285779c3866763cff23cad659803b41448bfe253e391a21c67b89911c06e7c78b6b2ac56f737aa027cb7f80fcbd0897f60781767980b89266e342e80c97bc2336be308a7ce393a229836f765086a6709191878570c6919d825e6c2a8f3fb9b4689079ca814759a8234b5c49c19623ed637859b991335672e168b7a31b788667cb088c4da1a64319824f2002be6d942c3e4891b032cdd347361352ffd3022f68017184110507017243c68906425c883093ca944ea118b20a30e05f740fb86c96742cab2c086c4309fc53760e77a8500fc6830ab9fab96be00a319615905325103113956e233728a8c8755789f0b0b5f6061b320f0c3217415eda617d33758fda34c0acc07c4c46a7c457ffb2ab6962397e1349325a90dbee0aaa5977047549f28873e034aa770064fcc40c069166061b5ad66277320e989712a30a8969882e275b160046bc80077dca73b307d71979c55731741e916657a1a46104d511b7bc8378b833350be93c3015b68a8c651b960238853a294853d1f60a32d016721c25a30542367426fe2a22b45945a4c61117dac71cc04a9ddb9b86a5b4b25569a04a19d28778e6fd27ca9763db9e4b40a773b1fd53dc0466ca2086a561969d842310e5bc14cfc22fd3a5b4a969800e036e47c9f07b3aaaa0181cd8cb43b11534e267751337bfecb7ac19093bdf18070e37b3ab06ade8b14de2b34ca99763f575e8d75177c72522c6c4eced8ad20ac6bfc4aa329e765f986579c373a3a333d6167c2c7440e8f4131ec305188c989140b63b65019f2949c81c36cbc45939c026a42a1554f2385a738a229534cc6552d5e76076087c9e5b260baf8724973b9152b3941fcbe19227bb7987d74856d3636049715beec638db8e3b1d4e3ba2a440b46445369b60e0ad3c9c07c3203e2716ffa51eb5005d1a797079089f6e14d86d988d7f960f0dcc553a83f7433be60a463b04423a6977599b7c1f7730265807b3f7b2bb8a625e0b0a0f3f1171d6c4e7a9a6cb5803b4871501453ac19b576364c3bd7e01f1bf475a9e71d557171e4d33bd3d14823672f27e356c89395c1476e0fa065dd168478bb710394116de27cc3b0617ef5b74ac718e8b8c152c052a4d57828824af38807d91295a0da9b49dcbda052317f5576e52b51eca732d8d260d08832918094de65ab48d3351b1327568574dcc82e3e8a222044984649271b3b45861ab6f5250a770b59071309d118adb32322739cad7227ad2b3460d156c065713f29a05ec48bb21ac7261aa6a0f3f19d05f0aa577cc8cad6a7fbd25826a3cc6ee225c1b183d8e124055414c54469e4e410828bce94a5cd95e22c7ca3770ec5a023f0656447621006929174850c786fd6357f36188a4884cadc108485277890a0114b4c565747c4165196e3e90cfa659662d992c33bb2582970ceb60582a691d66174952841ac5a64e53b31566671054486ee20437e245e234176ebc696a55a53308abf020b40b944cbf382155ba02fb9ec298aac3c2b81278772c9e0c730ab13c6f374ba8c886300831adcf9ccdcc566e2456bef479f4ed08ef803ca8719c382dcc667a21897db1f81b41521790ee233020f3301bc9910dce2202bf4329f632542f820bcabbd2bf38962e6810bfaaa5377a83b10a62495029e99c4becba9f0b3a54f70788f97ae54f01781b8505c27c23b810ee9c7452952af9339c4ab88aedaab3b9f951cecd828daea0888a3481ab39207a6851c0285226136ee392996c41b7d93221df711d44531c8818bf3b71aa65aa0a3b5055634699b007a47210e9583928ea984c413598868bfbd021cff817c426caeb3a77c9067b04dd3cdaf2b840af6a44e5a5ec3956b21697cddcaa035c46159262524e55f9923a5c44c1c747a1e35889b20ac2ecf5883577c0722316d6a82a88b21c8334ba25a442101b6828b10b1d9280f13f867e10c88ff3cce3af457a4ba82ccc4c231ca991b79c66be0c56666c80656845789b45f0606539149cb12b0917b297fa683031413d3e89d3e38544ec40cbf288320bc3b812311ef69125e641232322e3f1ba325b668174179e38868bd50233c78b0cd8721acb23b0b065a13f36a2b8b8245095cc785c64997add4a33b45e9a602b10edb318830a046d8f700b2e76094228a14a251e8f48403914cfdcb9e3ac0795f907cc592ae18d322ebb882a1473ff2fc666b7a829189a4910c60f8b1193d59515280bc5a9169ca6433c4e560db8ac756944fd9ea1dd1a0c9f9f57a474c32b94730460046251aa7d27a9a3f2c617816386207449d8c18f04537084a3f464b737c1a49e59c9042876e0556b92139225fa3aadad3b5f18752dd614c1fc200923c0e0b4804fc5b26f7c6cdcc684da00289ce344518c7a480936e46ec4c01b36a7f2645074b26d0414fcfc46d2ada8fbdf1c50c128ec5d2abe11ac78205310ac8aea724a117f00246046c4360662101b191228628383cd9047a28025cf8d6a47dc161af353e9067ae4433803c48b3cde24466d00aaf68be2eb1a209e8b1f6264fb14873edac70f834c710acc18fa4c6d16a627b03406fc7501ef71e62963e01869c80787af2d96a4ef8c72d273a3318c2826b8bb513bb2f6739648666af720fbb4b7785c853bc1aa4cca2c9d5852706b7bdde4c06c78c960265ce1887b5e13275f42377447751ac0bc811e26c2f65bb19e058d573a64959bc0d74727a4b5ae8ba23f2179ffdfc171563712eb028d9524af43c6143277bbd537f1155b04c0006b66036161472a199764ef7283e044c62a7244593564b15436b435da9e995fc803964f631f8332fc8887e49a87c5812860cf96747ec5891a9ada1e769af720e946c9727731449cc7179f73e867c8a63b210d73ca9f8d4eb44b5da3b57dfed46bd22ab85b9bd9155568513eaa3de494e114c2700ed07ffc1c2f8ef741765e8a42579da4946ae0a201cc95fa08ed106ce84660e8a4c90bd2b22634e40769aa0090a101c5dddad45edc5 +ciphertext: 02c2554bfae2f207dda53c0c9957f1002311f18d7adc29263a5cd54ddbb844871d65fc88128c8e0d7a569d0557d352dfa0443980fd4b675e8ddfd43cc330f23f0c8ed0a344060dacb235cf748ef5652b2f91472751c950613ddc48696ad0268f1e49989ea267e4fed6e5df8701704abdaaa36d965e5e94eebdeba377091d9a6d8174e2362bbb17d4d4033ec53ca3fa57887ad7190892867e736f55c07226cda68d4dc6b518e4910d8a1eed5658a5e007c9ade97b270bdd9b9f18d8a98cb235e3a19e808cc015d3f90639e6c6a6c33e1dfc21bc09f7e7ce8d490d746f7f0d08e22bb6ea9863f8365a1c1b60ee660112b3528c6106772fdf0b2c795f637c35a3c77c63bbdd6e905c49b8ccad39b7b1339933bf9174f0f753195e67c1fdecfd1e3264d277a07c7a67da8665fc992620bb34ba73b33ac373a7a8de1ad27ad22de16433d3d43323f5690ac1144f0cf20ae1e94af27e7fe23c0f0b822b739bb473039a50138390f1d3fd99ce2e598cd13177a5877256e092f25436eb6254b82c213d0c1ef35e1a141c29ae4ee1dfe8c39f2e70121a852938167e930cf41d22fb9e22d3698b105b3e62bd4aa3bfb1087e5406349b2dc9f4101c3cc5a7104d8d4403afbe4f896b640e03a194c30c401fbb2c73a54fa8ef1c2519ddc21d8d5c0634056d749eb10c41394eae0d6d4b73c6fabc27fc2e346390e2c771276f0551d27a20f98089dd6557efa1cbf4f020797c5524590191901e52ca66cb74173a2da456bdcec454d3ffd45691dff6a70dde3437b30794776290782a265bbe3a1c07688d4fb3ba1fad312399d30c7fa9d3d43a855e0cdb0e02b1a76dc3fd8c3e53b3c814f98fe7d24493bd6e854336a77732747f809c0782a926aa275637c29c041f284170b870352aff1e0bf77c0776b33e051eb539b864c3d9800a2f082899db3b22d37607080b29486485c0e6c92c1b00df67ca5be95fce1b262b32ffff00f04b17435d7cae7be5f9af0d673e4536b383bf912d68cb1592a01cd25df2039f826ad43a137c81ed2ce0928b1315c144ea3a1fc9c12aa13bc9564be273a58427b467936773b6555e05682cffc87dc8685889853237fb0e3c5cd0c3a4537a9577fe47a8aec0421f023628c941994dcfa7e699fb7828e125ff08a58e24e3e63801837c801cdf5e2fd9ce710040753da43d02d383acc82abd9291c47ab4b870c046af3ddc9bb68697b8e89ab550b9cf0c6c98cf3d3781ce0a655c6bbd8dbdbf9db669eae8d3610d23c03fb0f364f489f02bff1d42e610fb3bf94157d1ad8fa6a7063b02e910c145e3d9582b1efd64d6f745a733afa5c8b38cec2f748768bfe9432b612c73b2e7887fb8a06aed687b3619f56fa3c750fbfc35fb5481a0c21aac19733071e1cce965fdd5198c12649c7d5c8eb3d519980717665786aab878bdbe6240f58d913ebb9993c3779b5e51c6ebd3f95532c42df3a8025ea1cd73aacf40ca79b1a6f8e280b97d9c2d9b15f96ad265c6382c4f915b705068710b02136b98d0415adcbe79228f5b7a06dc97ba2b35dc76d37fe4216d5a896472b2f60a86759e596fcbffad1910304d3ce37675a4e6b34dbd75e52465d3f71aa7a8e366fa915a4c2544060e67ccfb4c839945d5dd9548fe8d63e2381055dcbd9cbc8a2cd483716ccf3902c78130419d2971367304e0f25097b2c0bca79017f6c12b428c3f47b649c6c41f1a8e6b17ec7852debfbaebe46906a9c0d8019a3db8ab0ae6e02af82cce0acdfdaa01e66f8fccf3b0600a256aa1e7c0a70e49fe22e1ef12a00b7bfc3b37b8f8fc65a382a873d29b85756ee84d0b9dfe2a20e062422b99163dacf5f96bdb34aaa88377495abb000b5fd84c75a9976cffc3732f5f989b40c4353275212a740206e575565de708f9892144bd2323da14806b6c8d590b1bc845541848c990c56ed334de9a59cfd5e7ca775644ff9ee3969ed606f0f48565fb566f205dbb4633b62d731e0498614a5fe9ad277e49557ea1eeac5e9601b205525a09d3ccf146f856e766406f256e2cf44fbff3f911c4f34dd94cea64a143d23fc6ca01abdb42db6fa0b426ba8fdf846629d32748f8981828e64332fc6488cca38faa48c36cb212bdcd6b969df4008f55389dfcce4ce12b83d5e80b1d62912f3daa79958381c0edc39479b1f525a17271faff55e9d8c476d17b7d33556da787d1c4e47a89dfed6f265396e05ee70b +result: pass +shared_secret: a3611e119061c60bb8f76b765b1d00ab8dd98b6036338462619adf32ca39b2f6 + +# Official test vector 91, seed: "c5856298c3cb6ac9787a0f30938537ab2635b96f6d19cc9522063360e7a5c88e644929d2879180e3e5bcad2422b7cfc3" +private_key: 1783c5f7f498d7d8c421436701176e6349c025970f41744b369852a6c2cfabc9096f48706a702d3ae62d6a2c79e068143f45ae3d472180c432d6ac6897633982806c87526ee2f837dea521fdc3c3a473a6d7405c2cdcbd1d99142d097ec5ac782cb80909b9c47b7a173922cceb52c926f4b5c904c5f342c460356c72751baf271a496ba3ded912e6810b8f498e78b194a02643b855aab4a6c7df2938a0da001c461b52829cda688aea4c21ccc478c04923406acf8a7b72f5b52cb091ca66d769fdcb2d2cf220c3eaa73db7888cb37ebe441d81d0b53bf41259433922a1c6df57062c2a010bc3c190e7c19157207d1b607ee33469334b3ee4500bda58a1785b2c247410573d6d703d822149a5ab5a4e811516b69d76f3a80fe8b84fb8ac7f3568cfd69521036541e975e5c09f63905e571531984921f9c159cc2964541b0b55860270ac7795f0c26a3b9fba603c26601322ba61ac86722b7933edd01c68a292c783a56d55c0254439e936af5b9970241c73a9244a271a43cff187bae40ef9cc6d47f23f3b68cb4ac08180537b16daaa329345f17102bff856891ac52e25bae2e95ec2ebb21b9330067091cd7b0a963588e9700b89fc4ea40aa6c4a2c8b63568663b8c2ec9ac281ac3d470098f559f49966e01a91631f263b834a19ae5b3d6d150509815684c300cd483c3fc475b324c8873bf5cb01609b58bf573cce0034b19425edca86c598aa4da9bc4ad2cc78545917df6962ba4ca06b0bbdb322fe300984e16b982773a0c1a1bba55a14f575150484f2be11ccdf97846a33aa8580c22aa647b7089a73831651c506045a05e785c1d682a0af364b4cb1fd704b1c306523d6a7394ab1abc34719a0c97f49cbe6ce9519f8b03556cc9c72c613e513aaa68074130456f2ac4775218f7a1c35ee07f229a7d59994f6b909c381a0385c2a6d1bc8d7a60a1a113442de3cd785b7679230ca6d49d17f2c7fcfb1fc2e7121e20b87cac2817e26854c392dbe25b31753db9c5923879777364530c4551c28a3a5d83c9631008571c2f889889e8c835eca3ce30e81c03cab74b3b5b198458f0f81cdfd6ce88e7cb79f704c0159b83345232541cf4ba04a1c2c2a929c3687996d25ab65fd9a93cc6590846a861c5b72ce4640b47673e5a883d44162f914a318a163b5c33c37a6330f34b28b22aa639978598c3c6ac93d811c60d0330ab500d41f950e51c9fde115619f022f9e88f7892ba41330018da306f42bcbc8cacecabcdb0e5085bb687fc14c55ba8630df92c3a2b7867e951f3ab12f8ba2417a70f766c60cddc85a012b60e368f7c75a6102684efb14d21961f2231c0394520ea813eea69465a8a8582e89beb3aabb9b42fbee8bbd4900ca52247a322837d58c9c7b0a9e5d246178862253c7baf2081d7c02367956a7a68554debac141c634048053d602645a88549b94c95d907ac1c02058c66fd5b894222331952c4e214ab1331a3b2a83dcbd8c747431565026ffb231e9835961919c659f734c665636196aaae827bbe2c30f736384f74cec5ccc3de622879f6afd1a0c472509f9460b07e524bdc65cf605a36ee35cd6267403cd91b8ad8376c670c3be6b4ea42c3cd46b275b9394db41e0b389642461d443ba0163b7d7530243b911a64a27560e3956f18744a673606089fd611c9b5d4b6e9a5c0927632b259056d95235ed5a0490435127405cb164d8b0540bad0b706a431fe077d2e385e4b64beb3a8527c1921d119c6676bb4e59937e0600c07f0925d665a9b643e034478def83188f4caa30764394a3fb0c3b9f4c2243b0a53f8b2ccc5d96ebb0478201cbc7e165fefb565ea149bed831df5dc4df16531460a28c6e708a7686f61101d327a88f998223c9abcc7d22b5ef78765e075ae4aa41730c3d507837080c4955614e88826ef4a8dcffab0bde615673150a7f36ebac7bb4c793dbd9a11f2e765bbfcbae5d2ad2239ab9a2548ea20c47458b3a998533df6b3900997770153c73955d200656314b90bd49d6d95407302a67813a62ab3b63d61b9a3195effcc87d6ca43cff278bcc65ee0bb06c3da296a117b3cc86c78e29c33748c0d293e243c25897b200f3b2d7a5b96215822d310805a35a331615c59172709baa171d947d1b12e2c2699fb460b8219992fa09d529069c40138f24cb4cc9a64734c470128056a7b5d374435c099752edca129091770d6af831ac7805a7dd5657bcbbcc9d751b140283a2ec533c17ba38a392bb98421a4f0731390c30a8701c1396a4c17cece6cbce99949d0279119e8790722b0e2c748348a8a5a7c760826bbc0d395313b893a796b9d572c10432b2f5363b9682a89d1174f822bfe38b05ddc5b68ba3ad62497c3ab8ea6d13b11a6a69ddb1f1340b41f013952da1ee1e759d2d5459a01cece819e5de09b8d707c7d59519369660306c4174505a51846d5476d41d00393979293c1325a1b6673f16c32550529b21121e95f99f503cea88530e2c72b038aa641327181673e301dde28b0ba76b2b88453d1812499681cddf932370c864bc6205b6cb13684455fcc5e008bcdc16597ed661b3732a60e329df82820af51b1ba4647a7944c4dcc7a8f1bce390c44a9a7221e0c0943cb4ff6f048e2362f89f4113fd3636b97919e41acf042189e02a83b580e5d4a996fec6d6b7b33d690825f366d89f8952898152b3671685a22d8898bd62c83c32a1e3076aeeae845900ab2cfab51ea76c3022b52dc702d05b17a76609c88e69d12d7694edc3e91420737b17bb6844a1a28c0c756038a8c6c6a74906232b50d74cf532b5266d32d01034c56aa898d624727e5363e0bb300203e792b3afd39b5376998142acf52f6933a594c9a5872ab619a8a4317e86a91d419a78d47245b1780bef14abedb77ccb97d550ac223e5001e0b64a61b8fa0526331b409505a512b4b6ba7e3b4b630a112920b431292db5962b577af8d546b7465673a8641ab5807443085a9f0849b914a31393c1dab0fa30b3b1c1261bdc9a8ca69cc0f0432e91c1d42b6a8346cb6fd9cb49b189d125c8be422a690dc90ed4a87c70ca8e35caa16a35a3120b9716bae021c861267aea4244219c60fb1c788ce8264c0241156340daa3b1ae7725c6552cdadd4c244079cce22aa083a1a2c0810fc7ac55d77bb6ef934fb73a8e8f4cc299b28c42c5d26f36518ba4cd3b320ec3158b8b36108bb6d4f6427dc46653ec24927a833853b4b0af5723d8a3c5f37c17b3476d86161c57579cd020167a70c1c310325c6707fc82270f0c73d552363e2343b371fc1448b2770bfae474707305a9b32a6aa77c7fc7715cb35826bfa1696d67ec48cc0c9554691d186dd025ead64a9e39657be0292f39829ef696d3584b99c7367a00034395252f2443ef4692c163a5ff1863be79273a93192d10b661b9051d57572d5caa817338c52374ddb282d4722b1efac7339f1ce852867e4ba2a4d368ccfa58fda097fc59244fae273aa7c63f891bbbce875624800dca2b5d65b5a2d414a81c7525583c0160a006be08a68776223aa97525a1e97b241f59c0dacb50ec89b90bbd58e8f27c9f19729782b2c06bbb91725c3b6ca991e75bdc7850a0107674fabab38e28ac5b9b717ca7542ebb563d078e4c856447a0ac85c9240d77210e4ce850570ab693aca497819b5210e2cc957fa9b4542070171c56a2c1253e006cf12162e9168673a08d82b90812c8cb989394ca862aedb1ad9885598d39a42b3ac25bc914fc15eda2501d7c8c51aca0c257cb8b0c16de89900b2b12a875116cfc967553829e59510a00998440b93d8371a0b294aab2b4697196d397a9ccedbcb2f5414dc8c764189cbf720834327a9557cb44a90286277c54aa424d080822814626b753cb281b9f2fca8680c2e197bab18643c9b0aacf8445618a45814389466f67a5c557aeccabcf083cbdff5569e39cae20584ef46bb56456386f3c7ef5a5c196c51646b69154393bc7a6a6d0869e06c3f8ababbd7aa070f974e682398508a356c78c74be8108b42c6b53744c3742f16c84e5bc6750546739acbada819a2af9c5bbae2ca34f6215df82c10ac8a5873a2a8c04ced887730988c14f00a33821994503f9e3555f790715414095f05bc7d5c20dd9313acf98b10daa4053c90f3d2c0dcc676dba1cc0ec92427d4bbf61425935314494c3e65b266f16411a1250667954388fc5b750270e00a8bde873d3d58c627c6b31d8610597174366c8052f21e429c185bbc4c080122b4b25d00a982101b4b44c18bae64b7aad2a2bf646e39bb241df17d8c5b42db08ca0d6571097250072420ddea731357154e861809fcc1ceb7ad01d843ea928dcad3c1370b6b517f5473b94bd6351e282f01bf82a24c3ef05658b9e66735007b45f5b008a7bd627d8e894a4fd9228571ecb1041a11f23220b1b83a46d7ec32691ec9bdceac14e15274a8e2bc08fe818b117ba28c5dfae74d54fcdf6f20052f79be333edc8dde +ciphertext: acc839c2bc7a7d56a8472ece2cc56b8cd74eeaa4b37d366f3fb119226553304fe6673e37db7fc7a0735ab3ae10f6cc38151b7f3ece0a8dcb646c571aea0656bf0a6ec1c90023300ab33169845b8a64ffa012b890e06d691d82be4b5741e13d4920079b3d939215f3e7d73d4b9404c28c0bfa50cce06e6288ffd58c73326b77f7b6606ea5d742a32c54cbcded3f92f8c210b44242df2ab8ac2ac906860f632058e90d2ff90251efd91c9bcc9fdd0180cbf824f4487cc0fa6a812e2392eddd62d08c4ef62633b1a914f410ccd7bfb1d66240c035bc97211ce567070ea112a17b0ce6cbbc02587626b266caa1b06852661c5be631b24fc5ba4717e14be2f5ce7f5903c89fc56a46d7f31d840e3efad03c29869ec8475c9844404ff71380b4238c6da7c22cd500e6902fc962684b5d3900c23bd871ade2c7ac0cc004a3ab60d70f946ffe660f3d731a831190a03c20d66483d99cce14133f3a3e7f42a07b985579e0e77bbf338dfafcb0a850794f37f677c61df96de1fce1ff240775339eb9c97a92df37d7983bc27977dd2e54eb22729c495d345968fafabb96fc4592f89c89ee022bb477ec8d48d810e3b1fafd37526303a0430092ab6d43b253a7e0200cf45b037063ce753af83469911634aca0f890d3d9bb7671f5a6a171fd2af27d94155bb4c7e7d5e18c788864ae4c0e3057f6f6dbcffb659ca48113797b66b26e46449b197b72f7f5af1d698b654f0de61136e99bbce7462b823d86f4dd5e7bef7dba147a5a9a6dfd7aa70cee2fc7d558f0a25d5f111134f2777fad92840f2a969da17de0de10a5f74a665a7eed83382857c0f9e3ac4e686b712fea2d99eee8422508056cbf988b33e1bb1cc685a556607ee1876f53bf548ae9deda1fb4f1e0c4e724e4ad1ea9ce3da9af39d5fc7a6fbe8f76c89f7bfc22aeb08708ac6ca7bdf730b7334ed58dfd2dbb82d56d085a553ab8fcc9a3fb865fe9dd3743f33b0c008b48f3c1212ce04a2066bc1e916470bfbf0225745e695798c6dfe308f433c5c9c8eb6aebdffe47ef0b8df31f702f1a7fefd6b6ead7b69b22d55223e8a7ad096e588f941763b744ad565282ce29ec6161d5934e5dea1780c940033f0089d762eec127663d9b4fd5c5d39498f6d01c0687733426db733c9e6eb15798530db3fe5b6915b7945b80aaa0780d8800d9bc6ad02281a25a33450abde1942c0726c807ab3d46d9c91c03140444642d9fa3c2c436287d1abf1350d45154a38594b1d881be08437f27ae1763607e4f7836f562749c399a74bb7e8101875e47f3f4c6cd06b715e6e4cf3a8d7ec0215706ccf5b627c763df70aeb3516cf45976a42fa302faaf4aa0db5c1ea75dd0399449ce029f3b766f9b58a0217e97f58cd10bc4e79d228e2424d57cc423a09a5f55a4934384a0fb2b3414fbd93a4d1289096f8dd2154d919b1894ab0b38f484fc69fd9674504c829116d4cfc8e544cff6c74b44086498a0266cd9d4ad9c6b9e863e0ad7738ddb22fcbfe642b5d30760fdc3142f31e27aebf763926909a720465ecb22f1f7b9676d41f85a5cc407f6c52bd849891e16000ab5c5b3a369f71b1abcf6cd302809cf2cde77465fd823fa85c6050c9d5fc83cbe0d9de966646b679bb9af2c1d89fb4da1bcdad86e2bcd2b7430e1b33183c3192697ee2c902d3a68ba250d633ed6ca044b0c0b5e3776ce445342c1859a9159737304187e14f608b091ac6946fb817b9cc4afad0d7dac61b653620aa1f695bddc40113dc884d762e399f0df4fb6637f1dbfe3ebc32c5e37fa915a1105a01fbd341070c771dd8b3247c99d935157c5e17218aac87bfa024f3d344e9c33ddfc0a0d5d8f39ed4cd2ae97c5d40097548cd79ac398ad1200dc7762e0273dca642462e76a91f242da10c8c38cbbdcf44fa45e00eaa1fac8bcbb67fb138bb5dccab1012b881bd8148049c6aedcf4203b9191ee1b181f34f73ba8107e0fb5d3c93698dc80a70e6f3a23b4e080f0ccacf162e318149da1c1cdd3e64e8de6e5394c29c312272c0110a1c29e2b74baeb0988600bca03912131528d24595841d4fc442d9dda00570f86927dea5447efe93d60be3fa106bc50339d81bcf0df550e317acf652b286b8511d9b75ce32ec55ad5dfb5bc574ca3cdaeb83f975be3a852149528db62b127cccf15784d482f271ed0b70e78ccd779a8be7ec03fe8f734091fefa5eab7cc6154a0ecbb2d +result: pass +shared_secret: 3b6be80a10667e6ad229725c012d7c5197194d5fc26787d53925d19f81b865c7 + +# Official test vector 92, seed: "a28ead0a08e7228aeff602b16a1e752278b8ed1e91dac67994f5adc372e1d82f95cc390cd97ab9212275e0566c833fd8" +private_key: 214a365e155f2468311a972eae496d188b7d7ce281b8dc49d326c2935829652b1a8e936030ccbee7989dcd407dc74a5da47b7387674310c37da58c0b9474a7dc5a5f97763211b6208ff9b7ad343b0c0b58b5c3b2e95210a2844c6b013d5c3610f71006e8c806bc61a90071bdddab9dd214cfc9f6501f6570305b5f03c38fcdd9516e73b76f5b6bf2b7665c70c31d763a1721628f73490402c8a18ca4c8f42c8a95b81e0219fc0c66db22763707c44e555924fa385aa212d4c643e6f51234728b47c37e67f2bc559c92b5a6248e9cbb8f197dbf4221e8fb938a4881c22841076c2c2ca6b5798b5991623160148a8de9c4c7667fc4ab2d30b8917304011015400644079be43f60f07b8501957a53a0acc69520871013aca31fd4b3bc246f5e300d8e84340927a645532b251945a9ca024892b0bab4769f6c27f497206d1598259aa0f2d649d560c082b12cb1d851d757cc38e1abd7a6c38a947b36e95579da29a25765f2d85d5e5016e0c91d25c6a7cac3cb4d504bf7046b7b32646cbab6a3eb8fc1ea63016c0cdd74cf63b8c86b790660c94110e4c6119736af99a75ffc2f98c7cb0ac653cb90cf69978e0859c610362b24b14c309476c53b5dd058c4075c59c2c753aa76b7e04520f2250319d41c6c6183921409908b6df6fc8e7d17296a9a0826101be7450ab3babea3c520b6735ea8d545949988baa98f7a2684f3b3c62e058b398a21a5f5073177798d1c44ee5c94ffc564357718b7fa59e68610aaf8294eeb0619502cda583f0a744d8a03be0a6c9d6f756070dbba4ef85ad8711bd691b489a3a23332a6e766c79eab5644e42378ba05b9ab0eb6d790ae65c2dbe3620c26783b8a11ff59850ea182e6258b5232833b4538eab3306023b2eb01b2ea157571791d0d37c6d79c2caf1601528b6fc1600ed3db72e4414822051b469b8b0e962d94c1672e318796e0cd17fc5df12bc1e7f6b91c5a3449c16effea06999bc5344c19b5d36466d18f5dbc56d7065a924b4f128639ee5acc2e37c02c5332e2919c1be01e799c27e18bbfb7404c6299b2335b6b410c4cf28474eb6ca8a4859f0a4a587ff6b356fc1c330041c72765fbdb1d2bb779ac384c53f77124faa473716047d2159a3326798b0d38c0c77c4568d6450a0aabc9780aa2b3252cd3da838094a867ab89e12c342953a3a0ab33bf6b27d4a0758c248dd9f2b0864c08d1083e32031283d979ad81709fe2466e7b15c7cc4429bb4d96b2733aec85eefac633f626edd8cc64114572608408d614e3c0a1473c046fc5405f46bd229b30659505094a312c170a0c21b33628a220a281637b3909d418268bcbbd746df44c5e94dc5ae6db45312b05f7c99985b3423755c17f9acbd7d831f5c3aed7f33284745f09e0cbd0f4b841fb84fbb6cd190072773388a334cfbd05a45468cdaa249ab02c4394c264c276be8ca164873c5d4e035b043c86d8a09d0aaa3e7f983a9cd3108f56ba545847ed27c29a1a84bb11310e556821181c4cb79b4abbaf3c123053f9c92ca15f6c326e2fe67f24a20ae584bdfe763db45ac37ca8a2239394cc86ba1ad976b7cb41b5304cf6eb23a5b8456470237731882bac17ba241cee78b740ab91a3b13b716634cd55c4faf9c80da43b43e13e770a90a9743f151958a267a8a6622bc57aa51ec356ca98034f836f6716840ff98dd190a6bb509d000211ac802c80bc3b28ec20c7407cb898980ef125b0fa34a88812550477dd267d37495930cba3f9e43f920a42ddb34eb7b72801fcad3000aaddb473210436e5110efcf52791c9593607bfc6a440a8043ccdd9965099a200c7a4aa93944bf7ac55132efc367aaa358eab042a6bfa125e19759f469ee054147c58adc98991cf92693708c75534a13e125b9a0540e423aa29059103c7708edb1cf626a95e2ac9e34b9694325e9c9546e7fc566a013128c2ae932690447a552c2bab21d249cc6590a1fb05ad0cb90edb8b7074bd7d172b1977581cc0840f1a69cc0abfba1091927ba9cf7821aae3295ceca3c20c018c3590c4151c0fd13958890195e761fb0c5bf8d1caa0b57087997e8495c430373362a71dcf670e0b1108ada374dfc08b57a0ab687a7d5b8172318c0e4fe868fd68a7da773dca08a71a49a4ca1b45ee3b223b785f2e6b0dd195ce79a1cb36751b60c06a2db222a10a620d78b129042477537aef90b5f0f20a58b6005ed0234f3168ee927d726733c3221035f21dc2a95471fc5aff57381741c9ddda97273909ec4c68d4b2a22019cc2d58b0f40860cf429c20757c91269979a17e5d01aedfc21d3706369c3294617628bb97c2655656301772007414aed6a9113ca543f9b027b2aaf0f122d1747a800a49da48239eca99fd4443566348a3f8142c6ca511e769cee83d0513444e7778018211f3a683ceda1ba2881a37f92586a54806858058b37aad546d48b4a5f3e6289c237a041814c0531b27045b8716c1ab1566ae22bb1eea845340791e2899020c8ac1d6724a0b8b432222b204b0b2ac55d924b4afa5083426c716ca2de71c99687748b56342ed726694ba5e63e42911f66f8f8b3111261ec39bb3dbcb9ed5c729b401a23aa26015d31bdf8c8301f61abe695066eccdee028b11322aa437c26a785899817893cb321e0b72e7a7131410772799500a116f612838d7601f66f29567e8a0f0b7477114281df703ca76326b8aba041457004156854c1b81092ffa869eb46807e6a1108ceb06f65453800b72ebb4613e2c363b6190eae29735d48e537a717e335c9f7b456c923c42a31b8f4b4dbba96f59362743d516a01400b8f1b3ea71954f85b0ccfa751d3428fecc2663d509c8b9a211c011313b5cc8e8930b223d08c95e5eeb47127a4bc5482b0e871a758893e9b64bdf4162332b8da6d7b29152a914f5c748a404fd865dc1224e0b64cf782b7c866833dc8773b20c6eb28ac57cf5166895cee2e78d41f97b5eea14400c1d329363915094bd5650377924c15c86ec833b0ea0b3e476aa91398c108a6e99e7ab64990513e061ca52756cf29238564cf0cab366f8753aba1fd3e9ab70621a0cf161b398c413a39280a268c1d28172d6501d313ed15284d12250e6b75704d1950bdc5af1959bc3e93156346dd3b47450f758d3e9796cba90598224740b33b239b97c45c696323a05cb15ea44ca4fd98ee589a2f5aa1d1ee00a476533d5baa58027aaceec151c9c5eda23b14367b8bf7571e7c75d197a55ed3a349de636bf84ad6d446e2c3ba5657c683622b136384be3b89c7eba095a89697b4c8ed9215d1e5544f3d957e51a86efc098fbf272a6140a17530ef6e703f272792371b7c5e36a83c61c7ec18e6bfa7752c095639420968b91aee627c3ec575d74b49fe13f2a216c711508a4ab1fe84a20bfb019aae1b8b3c8750edcbc30cb47ab0b567720421359a0c8c08295ccb705222141b74b8361004d9c484061aef8c19de9f8c809b90050f3345d65531070cd36d5b2e50047b97b61cdea5c3b896dc0a22f6ac2a2585295ae0993be023a498cbabd6b37d56c2f8db63804d0ca52a169f5d003efe695b6eaa2c530773cc4347d4b9e0e46a822a980a9f4c8900070c67437576c572160ac7b297bdd074c9eec3a368297f0a34772b8292d0b7a29faaccf7bafd2dcc6999b0766d106e04a76bc9118b7875c187b1f8cbb00b3c882f3bc6bc65b294443610c65b19aa72f90c7086ec18f228c36d63808b0aa253052c1a44a6842568d82b43a994b5b6c69555a449ffd0c3959870f3b679e4643842083b20a40401c51898e138a092ba393bbaca9fc6f37f28d88560a7992c5b95c228b3388a622a6f2839da96b121dda0c75c0b36ef162bd7981ec294ba7f91a97b34c69bca54c2b7e91548fa7c396f3d783255a79b3fc579cb62eed83b430c45377857190d06e5a26576d92af1b79941f922bb234a68b21309db9aede9765c78c486da51e400cb46cb586c33c46db9ba99b983b94815fc5b52b7feabe42b4253df9cbca4037819a47f8541bd5747ccb34ca74158318664b243c81b85484bf050ed3aa81ff37725f29b962f901f5f44b4768cd9db394fc7370d0ca72e1607f83a0cd82793ec3a23d3510ae6ef3375c3265dd8268b3f31bcefa83f8e5aa3d1077cc62a8ed858e6ed4639447aa3d705a1dfc4cbe7c4b74d67183a5875d24552ae74e546ab15376ac54f0582f3a92a1e1075cfb682a16b6a46ba93f31165f32654838c9e14b46476465cfe45bec653d2c0a1cef96cf01e123f1a3116c93b1d5e54730dcc5f9d618b53a7917a71abbcc312cacb170c10e454c41869717afd8aa4a86113ceb654d582af443a0b6a74173f963d99c8d44e5520ae278370855c0e9e01df9b37d13e35124e6c2590e9a231a219c07ef6c49cec726e5bc6c6280269fb608e754d097ae818b16b386bc895af3bb9f5f2a4481c38c2cb5cfafac81b96a810ab749b61806b6d54c9f8cf4bf1be0192423288f +ciphertext: 940def77ca2ceb3a5493b53f9f11b03d8714dc86580ad78129deb2f2f402c99f49d8a37eaf9841e9f7ec3485eb2b830298487de09d7387cc32db2d89ccf1341d5a58f41288115b8a9950e3771d7ef4b722565ecf49c40838848262c72cf630dd23a29175a30d589bb271d0059f038ce32fe941da9a687b76496d4dd1b040e013d129abba459d7320a43ad9f5454d22058c137273c167e4bcca4c491d73322cae90e30bd1c5d2e672da993b7ca42137e33e80d51ce3e6f07a0e2d641dcd7bf1ee96861b9d05c99304d3cea4e06df0ecacce42121cc86566764c30c2ffc5e53fb9c3a38c346018953028b0958a41cb7d22640115bc576859c458fbfaf66a916d01384a335bd3e5470944eaa3bd3f00a4d1311a3b1e2b9db547e20298b5145a302ea0a7eb9373822eea0facaa85d58133bbe1d5ad4fcb32d60da6db4ba4d5b0744f7b85413d551406a93bfbcbdeac128f20b5b268089ba063d6fc3c4700f5a1c36dfe179e71ec20a628f453768a2bb70ac71c69b1beea25199613f6d8fdf24d1192228145313d4c6c405071fdd41c61b63b91daa197dddb02806d131365b8dd7db229a47a84d6768ba308ca5f26115c723b68c4e040aced7dc5ec5662ad73fbf958ff04aac4d749e2931a9613e869dd50169bbdbfcf03b4d594e2ec327ea1936f64ff1589b258fb7cd1aa31bff2d0561bc91a6c945f81adb345836b6a028ea7216ff18264bf67e68bdf9e586d07fb6876dab46825aea47415d3ef91a3af677ce277c4d5744c2dc686afbcc30b5eab9ab02280f6ee99c181430ef7305781e42a874d8e5591a6090a740a7c5c5a0bd3b960e0458d270a641c7583b00ceedb6dd7b3dcc16ca1605f46bf799928e5a80f7ec445ced534b02c9ebc3aaec035d3a24adc4cb6617ef8469e98352aea0929d3287ca56ac8b7925074702570920be595df7717f3addc22e842a1d72e2864e32bbbe97d8717ceee02581496e92bcf75158868de27cf0b4b6c5508a9abed542f49e01bdd849ffff94056b8612e955d2e430cae6e34e8e45c655ce37e1fa49bd3fab70ac5c84f14e31622d079088e972555ab850d8608161dab959300d64d6a9e963661a0eb615bd1cf87252c64ba41740fb9682695e4fe11e7318539ebdcc0d29d42c2ae0b764da06425f0be9d9343a43fe1afd763d93b2af27cfbc6adae24f52a87b57453778fdf8178280f4f05cd59b31833af437fafa11ef5c7d3851e0010b83379986f531090e62e36222fac7a8e94440d7bd101264c5b3400224fc700fc0fe9600d90b2d6b1552e66cf6cd14a3dea3b806b830bcda236d93a3d4164db43a96db6266b4e25df70747b421f6e8cc19c37fd3c903e4fe7c22c3bd1e56e60acf7f635a792209e06cb34f5ffa2a882e4e1a4abf4fa1805fc06a72cf23481badfce075a6774430d68d98504d75b87bd3c154e3363c7975f1363fac01a04f0f3ad92e081495cbcdd027ae81a3a8adb35d3cf13a09c04513ffd66544ea4bce399e2ad4c243148dcf41ca01b0f6fe528f598d21704d4f8ccf850d852883b81cc1914fe50cd09d4fe795cfec90652a9dea7bae10244ae0d870b75549bf90087a6aedba5f92bcecb15f770cc14018ad150461b73d3a4fcefd70e1ec8eebb428eeb78a665f4e180b312d0d7f5d88a9e5a17f6fd48cb92147b4a2bb2f9332d8af37e667776b4e82f850dc58f1173f3dd56c5ffca7ce5b5b516d77621ff3a78df6fe7a88479aa1c3b8bb0d40466528e4483d2a6a60be6cf32ece2e91bc090a36708c1b7f29f3318189bb6a05f9acf730d2d6cd20e1fe3739d9179e639ea34eb7eeb35daf32b78d94cb31da90dae7668fdf6d06b6ecdb331415272d9496d2a78b4054f9d59054a07f74cab7697b83ef03501d1bb1ab250ca9caecc8861d8f2b56090e2cf7dc32526f249034891a54b2a8f4187957c374567d741b3d2ab260663da07330621925b35d020c9ef6b354c646891ced14e0f9f4172b2eb9cfea714b7a296b4559a99a6b5393b343e59a00190cad70247d670b0c22599119a545d3140b240e486dbe7fe3532f4e0c23975fbda2bbb8824e93af3f9d2d76484bd0c1f130ebe1a61bf20be7f667fe55b8cec87ed597f8ad2402a0f0786d0cf5141a6e11c4d1eee404aa252baceb67a323a8b091a704dd774ac79be50999466d12caeb95bfaf9324cbd0610b0a4dcc630bd654e9f63a9ca6e72cbb940cd +result: pass +shared_secret: e6a61e88faaa25ff8bed035f8a47afa4f034121457104168a3247e366e781871 + +# Official test vector 93, seed: "92877d706daf88ef3412eb143db8cd91bc047a9a43b7acdaa42523560dee4c172697be4332042fcab91135839bf74ab2" +private_key: c73842b1f8a1f7cb343c570bfa701270595100a58798d235bad4ae8ac7376607675de7cddab1432f5b04fa1045af5a2644fc431c604a2c794d57b1cce958707e508c0ff80ecd5c001439456b65091bb75dae518b9dd5a28fc8c549e4450ed9b92a6c77c5849836f52bad941438672e06786cf16233fbbccb192b5c07a9a2eceba39571778b665df2b0c359206cbb34b33e215d1f8900bfc1bf6dfc69490257e2a533430a79522957d1677a19526a44e4bdac44358cd283e60376b8026a0d389912324b1f37ab4283156a913782d26d7696827fd55a2d636afc42173f86b03622091e489d55f74db20c846b0c27e7c1c0ea8729b97ca5ffe5296fe180aa2a5728f7befc320bbaf64c0e5555b1f35bf9203ee22478127122aeeb4a3d983fee5219dad3b4db5197ad079be2803491238bbfc003e2e22e2ff98f0e0b2389c83c7a30a870e63ab54a094b27adbf301526d04449b1283b02254aa2074a902e67b978c1ba92ad014c7a15c2f678bf3d1342fe588e4d7b8b674b9b92699d8b312fe0a64c0da1a7d93c16f4917a96f03e3bb21e400b3141b17f90d58a853445efd63e607cbb05036ed720c783f187aa897cd5282d64fc119da7882bd28dbc42ccd3c1982e1ac0b4aa1497dca5f764217a068acb73af404a5c8daa35268484666199d7761b1a802f5334bd1bb4b05c5501bf1c4a1b23a35e3341e7623f181546fd2c069f63554a67c0d85a479123680849a17ec1890ab616de357f16d14b3a75326e13ccecc690eb66af0216921043c31a2c8a44688b670a060006afddc6cd13898dd97214f405a24ea5990e06b55c278cc66115f8655d4d8381eb55a0655655966b3f2ca433d3c78fe3a0aa0e6196ce4b355425ae81434c27e47b73cb6e024065fe2bbabee99ccb8459e1ec8bf6703032330d402b2155765097f650681135a60c6fa2aa74cc1490dd22525a7a65ab853579026750bb5fbc645ab3c796bc798dccf927663c9ce82134b9536a9ef38d54fc421f964d4c20ca8d5b9a5795bf1bb1c3857954d91c27140528fef1c366eb41d78bbdc773b58b81420ff36ddeb3349375bf1a3933c7a865e2e16cbfec0cd93567b09b18c6d2c9dae2500c7b19e42c62326a279cd75cd7aca7e9b08c08a81087012f75e278a281c9c482c149473cf5f8965acc8db1b74a205103a89686bfcc65d40576dab5c33960069db6c390138647b5301448627fd1bdbf68abc6979a03f47651a13c098386c6551a89fb9ea39696a8182d390388b12070d4e378b70c13a4f6af1fb860b7f1a42bd1c8373839432609032224cfeb9ee0814e5ca4b57af39f84d53a4f9a7a311421c9dc7e411c102c207a34c2161c7099e9cc39d5908ded696abe32a97b8a297c28b868792305490a691291f5e73ca8163e5b9a17e8d417b2f14aeb017a2757653b6b92aaa73aff638cb5412f1508b9c7aac9439787f2883043660aac7294aef5694c3294c1471dfc49be531611ec7863fc4c2f58c7141418b285b209f6738e45d09f5956b44d6106ed04b59164287efbaa28a63cd80c59636896104261c10ca8c2c8603fba2b53c531cf7a8da7e3abada81507487c28b9bb07477e0241c958584e6047ba1119783d62c4cac3c4563c628a5503236c7a997377ad53b9a4ba153645933856671aacca85d55ada82c39d82280de07100e1cace49a6dd09c22f2c1da1077b9dd437d55b0d7b6978446a19ab106ce18529608c2ed283c9806689b0624dcf10c6a8665948250af74182d9023895a577c5eb880359a046ca7a15297b3bc3ad227972ba80061570a7c10bb26cd87f05736a492405b4267fdaaaab8062a5b10bb65ac597d8c5a5e123a0f242ae2470c1f0d8829dd73fbecb53076aa093b73e68e35a3bb649ce4621bbdb7c95bc0dcf997b83c0a65be2015a5465fc1273b599c7074220786c306f4717fa50936bb22417a2247dea1aef76895522cfa8b20cbd9c344047984e9b67985307e8f64a15813cec89b8b004c1d61a884b327badac95a14a2d2af1a7a5b5ca6e3722d150cb4be7a376372beb7a99dc94654f652780411a43e619c0643d266a8b1aab982080b1b9aa52e007b1eb6b76b3147b14785652b5cd11586f6904ce3a9554f745947ff27e87e2c6acc205d7689d908068608053387600c6aa9ba285738b9372c75c9083566b23acc2e981457fab1306b04340969dd1081f074a2a33bb85b892750bd34336a68362e00302712410eb8fc8f37da6530a408b17fddb0fd602c2e40a7dc4c94ea843226ca79b167b180f3024a273c57f91cd69629c970617720497c4308e10f03a038544fff13a3afb83fb2291dbf177a003b0197037a3c9283de78dc911beacf30e6c4c6740300266c6ab69893aa9e112b67903df849a4bd59ba106030b62b61bc293fef997a8851d06c956631c266ad533791124a4e09bdb06c0ffa681cf2c6d43670e2a017b9a40c13e85bc1c24ad914003aa69439d401ba605d013a2baa0e0b010363574b71242745e9d709a3ff3b0a2ac7f374684bce9bcf0200db5a09b5d0c92cdc7bbfb3c24a79a8a4a0a9a64376a0793c1252362af170856046471b1a60eb33f23c59122d0aaeda79caef27df971ac8764986cfb2617fc3bb71355a56867c29795f46668f8166970b06c6ca91d8651ccdcbc23fc1b2f0a75c45fb3321151953315036d52322c9b6408152bbb595129f41a8b8570f02b8ccba66de5fc36d892457673a9a096c556c9afd11b06e1ca9cc8b3a9e9765e38e711d039612c4bb296061771e42efd68c9acc8ca61012f295251ccb33252e8b0e6486c5a5bc28683347571b8f0a42aec4873cd3549324ab728324030196035b29ad3043ab9008da6b924bd376cfb103fcbab9450b44c299b4e27165303786944009418cbc66fd9a570468dd85ab652d86402501d61f5272cd880056521f72a362170580675bddd505840378d96334a704282934527f70a499ae99db81516b1d1426d233dcf9855880022d72100e14858c0a226325338b33ab5ecc5a86e0ac4e8504e168c5e1a4788177878bd569d49dc60b1484f43134e2bd39efb207430aa564ab7a88cd40ecc00a10e4b6c663b61a6054323429c0722b2e4464ec0d43374234b4884bb8ddc0a28852600369635531ff943194cf91937b43afd418f8f964cf9c9cc66988407bcc7b5247a2372980035c8f8357bc3db948c0c4b391ab47636024dcb79f094c62ccb64893c0c45c1bc88cb00ba85248253606735547d424797b0bb302c5eb9631ac98060bc47341e69379bba5b5e44980970c699187f62731f2b1a4bb4c7a33f8a20758335bc8a3c4c4c0900b3c2cfe35356a58aae233b066466b34c814a4cb6b9f916581b0361e78a2971bbfc014a7476ab2f7c291ba688d5f75153c4ad7ba4c664a8002058c9eb195a3ca7ab70638bb114c3618bac3ab383dbf292705a478a35c31f06a1823b545366cb6900c59c036b063727504a55c2ac940606c7bcc74643644bde915d83c395023c8fbd069f9ec50e1fdbc8edb0387ad1074b11bfdf220edd7486082a4842d6c737c6a1ed5b98bb78cd6de1153480b3bf095b04a7cbccc19102964e34693a6e492fae134c9d726e49532236018dc517bd94232d717a408af43fd5c837a21cca33ecc2a3859eaf8a74b63c36fa70168f241e2ff52f7197a615d04357a7acca269e47848375bab1f82ac686903d44786d540a496e29642f71061ee76054b5aa6ae67cfa01704b386a657a6773b8509cc1b4e16bbb92cb204b5bc6638cc5dd868db40358dcc4c258915d1e93771a12aa7ca4b3bcd854ea2a111c09afbc60cc91f5abd63ca5ccd11ef2c1b06a38925eb9a4bb569d8c4b859ad278ceb006a3d44328636809a31c377c58957aa5408b488445bf1fc4ca378c733e410e3814c4300850fffb052df767743468c6a91d81dc3c4c34b4b5a06dfab7cb6a741c91107758859f2e1c2d06881612e05cd7444abf23c104b6a068988fb794306e90aa1ad2ccf76482f0fa7067467dc105c27ea7192d0c6fc50b4042934e81876e121c6c295a5432219345bab9ca566f0dfb6b9d4728ab7187f311ba22d55b4047b9b3a17632925ec31bb2322257dfea3d1c1b4331467904eb2bc1f7a4369aab9912531a6835358b016889ac910a7c398c18a1636976e04c7227cc9fe13d61a848eeb60d56635064ba07359730a0c269ed6cb25ca2908f524ae3c9bc860a062192421cdba741dca98f98ae0d955c78d141fedb59bee95957e035d5b05155f5792e88ce43342f410ac92eaa68cd055fe28c4a217b9c2da4ba64d4a6605565d41a00acf377eaf80881d9a5305766747cb076149866504db6b96ee4cc9d4bb977165f0b04d3c03c1f8150a265215387c7983d37463a3136a1b7c694b79d85075e5a897a948edceafc78b87b7fbb43b11f82831299a9ee660b3d40c06c5bef7b6508409daf847a64c8d30d0974fd3ba7476dc76c46b458a036d884 +ciphertext: 0512de1ce921b93fb6e5bc9b3c41ee032b2dd86806cc50d2529bb8a79fa67177246fe90c67b3303bc92b853f645968a3d196b869145c83acc953228cab2ec6171c7bea6bd89376f7f20accd881a38e498f8e01cff9e6b291d3ca3e478ea2b710a3305c812c467303d84332ede16cf30ce7ced5cd1a1b3467e727313777e04f7e6c66acc22dd3d079b2fcb0b519f5f86be0d201027e93f4b1757ff2b23ced963b2b01eeb967b71498e33b47ddf1ccca9de66c13c733f126606907bf717e08d4c6adc879f6a59db879986e5e3fc01340c3b1122ac08beaba9e4cfdc912c738ce91fe440d706eae8233260082a97710df67622e7e5da4653f52c76571f4d707469b2de6ab29f568c68b750fc55cb11a69385b1ccf86f3058f9521a1587f87dd7fe581b7419a75066c58713b3b350d01659045d3f66da70a8a48fa42fae43311028b0b61bc49e756e55cde70befefade922d01b943f9f3ce870dc6f6adb1adf53134758804f2e20919913529bfaa187b37f4115a06b0ae8ad84a28c5237c070599eec2064e4905d584cc6bd5216b193286392977eab85fbf357b565e6071b744476c9f9ac7c76d8a8f36e238d75fc69d8464537230b18d73a3a0ae41ea6c12796978d2deb5cbdc6305a6287541d4e443483577a1c1baadea774c5c87e5dd3489bd7e9ec4dbeab1ec4b3dba80c28d599d2992209f5e89b057d742a68e3586f11839579f34dc314264ba9538550aa6a8141370f4090078be5cc3d06d9b355b478d0b16ed945a51a25a6b8ede93f40412005a20fd40eef736cd1fe8e08fb564479be00e59e1ec273c82f92a8a816868b45a4a40b965cae14115668afe9c2d5848cc0e5717b05fc8431a9cd4ccb1208d35230840e32bc8cdbcb4513914714a203890bdec25c72f89af01ceb2c2f9073232c5464e7ff2dbc3687c798ba88d72fe9a1a47fd91a0f17a8fed16aeeb3a1b5d13df78c2580635f0e2af0e439fa35b1e7091ea821a77bdbc7b219172ecad5bf43db870d21ac01e0954fc4092ea8e85e1fab1c8eaf5322e6dae64b224df3b7c2b7f31f4d6101a82bf17e74b64bbee7256dacc3ece2ab95d0ae162118c5c7c6a1fa94a9015fcf76cdcb97a5af486139f23fd48ea62d4ad5c84125ff7044756016a84654b2ac4c2c0ba6915991575dda35570fb23f1a50ff61dfd88c1e9b14ccdbc48015b49f773ca2426122c323eb2dd2a972b64fc2718608a16162c6f38570d30c1d39dba3bee7367daf206594f6d2eb19dd72799c2b9351e5825d5ff453c5b650e0906bfa5a48f6a12b8d1534c60d75b40b48c1e457da5c9bb7281e503270c5ff5e247471fb14c1af2012d52ea24f48855d51daace8c4e8a615f825e8e24203613ece54deee01a0aba1d0fde8e5ce495c382382de6e95fb640483ca7405d02fff7c4d3799e9931ad3e6d64230d6c9d99afb39a049ed44ec2ddbd7c793202168ea54c60f7758c1da23f6c2a9165b6b5581fbce1ee7c41eb3830ce978b20af2eb4108edf93e27db402ad68256c1f53f4066902461fe8c9dcc92e553f679bcf19b8da57ac0d15e3e2b4f6d57dc9d5a870fe2dc252ed58171f585168c4823320daf7c25af7be123382d6d45998b53f6fe29a2fdc7e6851ffb53f63c8a2e0ab0866d7a680d65c54547d6f610207dca369db3b1ac44858ba5793c1270d8a2bd41400272dd6a19ca3fcd8917a52f65cdcede7aea00731f6786e16362e836c197a9e2b3c6228e9884ac942d66b67bcef075d85ae394a9b6b7c2c4ce43e8d940a0e888947d041fdf98c879f550705e2a7ea4c33af64c56af512ea79b94b865d4eaecf93cb6e03d454146ff5ef8ffe21bcf36db1cefa6ccbefece8d3e9cae9e03f259bcea9d65b23fd395b66c9981d6102d938913d6997772c2582b8ee09f2ff1675c116d04669224b6f867d0cab6699be7b03568c953901e75b67a1da01248c02ee2ee4d1bc7c3282c7b55f511e0242ab59b69a90300c5cfe3c80f8c382d9259a3ea1804211d02a95d166c17cf3e0319b47c4ad1425dc0a9338e6eac2eb91ad3250b6e69fd6dc5b193609c049342531aae7179f3fff718f62d6c1752b5c2e465fb6c625a299364a964e56a9ea758af79b3958a5b016442c76a9554cbbea5833c921e356d6fc6a688a55b2d37b29fe8ca97d2c1926f3e9da8ccfbfe2df9286c821b13e28f39a9ffe42f41075f93e3dfbffa4d3fab09a8ce3bd +result: pass +shared_secret: 7b5182633888d2708c344b6bcc5bd895e0f1c31719ce78efb0eff0240453fb4b + +# Official test vector 94, seed: "bb4c0082ca4044b1ff60b036c9b0e0495d58667156786c530bc69d949a13bfaff53798e456423d7a0e162a60039367d7" +private_key: 29450b5491a0266aa9fd363954b83ffb586f34256d0ccc6436225516953bd1982aee4224545abea8d68e9dd24b0f354f83978d0de0c5639acd6bd0a3c27289d20c9d55e56013aca5dbb7045d748077f4b9bc967dc2259cc79aa29a5a7cbe66b9484ca649042eee3b440bdb3f6475a02f61a85b2b373b91338940a2872213913ab6088b319d2b509ab46cd19aa454480d9560c0828a24b695cbb166471bd01a3bd406bba004e0c21f969675bf0884aca29f247c29f95097927490b5b3b72c30b59dda7d2b6a54693a1ad6ac033794cd0941be1c38998b488091a860a69c5e82248b5941851d8553f2159782dc7c2767c09b93671ec2c90684a4d3b27b6a88be09c50edc55b9291656177803461b4f312a6f4abc5ed1c97a6384356c549e070200245c6e39eac4267a77207293fed95fef2c29f3d93d2f1c6a609c07a3b8624bbc8da5c2538c25affefb815cc0675d88ba2c7629618a8e47b98433acb57c0b8e6499c44c311288c34d8566becbac15afc9a5a3d7c49ff25892a7a758b77e7540ac9e61ab0128cf301769dc65bd83542ee4b287849c75d53102ae750148d0839425a4b10243656397c16b05a9591817f117e6923d63584eb5e2c84a922d9f89b554579f9c526e6ab612a096a22760040a564649244ab8da3f066a4f0cd6906d83ca49ebae1fc49b00a5c36776c6f0911222602f7f2799fc3018828415d7c2ac0b88116dba3d0e1c62da01365e32bd111709fb7c07cf905e0510b9da4a61d7254d9a9c92cfab5002926954781ae86b0d88660c94e6591188c629a39e2d1748f2b44eb0961c7a480768e63d0560b65702c4d782193b7c9a89807729a3ca0c5c737e15506fe79912b05f25767fc53b772e952b6b900ef2b535beab49b69c0b958a42fd47b28dba99777291994598a64586cb86c8a98a12cc20322d2cb1a8819caf36bbcc387265b57819e496cca38b5c0b0b6f86c3b2d722d4eb3db4d97bf5aa2fe0a212f8f9b14e39495abb305a40c0c7ea77c315a2eed52fc31a75fe224bf08749ab8b7a5858860dd304f95608988abacf00bc0daa7f03b57bfed80503b366ada238312a155d398e26491abf1c5b10d22f8ee568d6f8867256684b0500d02a77070b8d54cb3504500a1935577cfb46113277933155d089c456d28f28aaaf0661a4a60486c4f7ba710253f753af6d75cd7b265f3365b2213878bce6c9f806c9df532ce2a5a656d072e67238e0c74978395552eb88a0b9b49b3205c41b3027d40b198184c67a8d5d3303d25987e9598de984a2f2eb69da7b843c6277ca144c2cac1babe34f119abeb5d6c1f6780d54cb511b2795a9118b4695749682cce3625cf7e85a00b82f59ab33184c2f6b6559084a1550675f72795e6ad74b22d57b903678ec4bc07da10a04b0c0ceb92a5e224661c9688e2a141d0c73af528826f65a330ca36a0b220bcc8021bcc1fcd408fdea0b2d709bfd368fdf1992f3d2841256647d2077f2a39c5770a11ef945823c55616cb00df3adae6478caec0ea05171aeb86eec42bb56c53ce27262a5db7e9aca343c036d8a7ca15ce23ab90312c8322e541773ace463a03801c3c44a7aa39723f2092a6c86c3f0c7b316865b50a13b84485eba71bdb2420bf351e21ba1b1169bf9414cdfe1235cb6024371450d9849ce8997e716bdb151119399884069bf964337dac8291c47abe351c914626ced0654e7a2cd65690e3fc67b3be0af7350c0d09ab978da207db5cc82902d6f3705f8b672384c0743d81a0de0871ac4a7fbc7bf1224a2f6e2b1cfd90f37e75f61a17f7fc9ad14b35ac0f79e6567a0208c0bf049a624566204301cd2582510f1c19de245b25394c8ea1405f7afd7a325bac60c93f700f77b258ba5b7177958fc8664e5e42d1600bba29b63b17046881a28dde4742dd7b8ef476f50186ab287a9f6c17321760a2332af65f136cd675b63695bbcc86081a10365aabfc9008db28b0123534acc645f290805d8b9bdf0636934b0b955555476b7604850ca5b3350d20b9269a3898fd45b161b165248830bd952b92a4c12721b67d724336c327a46753dea31a5c440f86c941660bc4e72ba51313d82842ff1e0175aa3c682a973f0861905fa9954770f83265f7f009474f118b081a24f9492d7d7408df21d000087b9e8cb88d5437c59835586a5b224aaa6428374da6bbed37b0f67c3b5352a5ec2bc072247d20c7e83d83ec162a3dd00b44c070577ebb614c97b06e15d7a41ccb6a45fb2205bb57ba4dac40a12ac5f6bb522ed863daf67379d230badf71844256cfc596d28957bae0c050b9182668857951a38628b83e2082659317ffdfa0e279644fed9877d6775e131682b998adb000ace652f13fb0b9aa57b9022b792bc4bae5ab5f07372bcf131ab93523ff42e5a328fe465520bc57d62f222e0a3623ad8b034f164b1800926ca8a850277d0054f34b941e6388349a87eb853375055caa0305309a06fc2016ba8a3c9bb06bbe7581946755e6c726e9767330d639ad4ca467ff670414a65eacba93d2b33aa628f9eb2949054c82e62774cc13f013998cf29465e8b83dce66928b2c9e1f4cebbb91e2d8b2278879073411358910ef23c66c3115af8ca4ed0b595c8a49ae8eb955a86a2549132cd65a2f6a44eece7b43a40629ef172b068aab1c2126fe058ad02183dea6994abc7daa71414666c57b4c40a17781ac4784e6ab2ecbb8fb2101fa1530a00032b5d1b51b57ac1537076faa54b3b9bbfd9dcac565209cc681b73d5a3c7138156b258321c05a494345c9aa72197c9d3a9552e437e891c437ba16c00c76f0a6252c8e4cebed86398957088596ce28c5880db1b90306958c12a45b5a14e1b05c161c5a3aa78099154a557a58e6c2c7758653e3209edb90110e40e037732a7e44d7a60736437c7a3e872c82b20478083b2592ea7418b75b002f1da834df8624f665df2677e0ae98c62636f603bc1d796935a11bd18fb851e8076c7e4c58b41abc71481608281ee4c572b612c08b8cadcd6b7dc83130f161edb26b1335662a5161478eb5d5a8c61faa175f54166ea2741d27c0496292380e93f6b77577b494c463c9ce8960bcec25f43f198f0552da73819bd7131cec101fe6448f7ba3fb03637b351af9e284da6677b53b71ffde41ee41518b18c39813a82ca041f2466321ba9531ad4b576cb8825978b565580d5f000b9a56a943c2cedec578f728785487abc0a8f2d28af8aa3237022125fab084cd19565816d15f8bc6936959eea23f8279c74946a8ba37d2eec75622c4f911c24839b78cbc8812fa55e19e10ede4931f5d16bba8aa44943bf9720395a8b1328648b887b28a98423e4322a69a752d1d2121d447c2f05bc91e52635d06bb1e05daab02f02b6ba9ea8944d9344ef68c23af10144b93a40c456da0857acdcacebf1782d63a0648497c91916a50b3d0688800b968f1e2200fceb4538f7520becb0fb86368ada208c0602e1ba5d2ca85da8d36ab8782a80436d69f65622279d8145aa5ed9671a28699ac9990d738c3b67ba500a731cda82965a01b4c16144383bfbf3334d159c31831f94301d6a0320a4c7a340aab3a18825516b819a285dbb82a28f164091516c2519b9b534ab8d116cf61303dfa4091fab8669a417a9862f90491d251277d4b7b0523b7c4e345ebb090e5ee581f1933e7168567a857dfaf916f7747550409889bcbfb7e32840537ecb7c050b18552fe5aabb6794b27505f3b721c0b96b738c844f816160d3c4349c4463f12d248a6605b52bb9f8b370e958db55b9ee0663454104c47781e8e0a6eceb2a2632acf0082c4e1806c0927a25e7ba8f1a395f1a352e72ccf72093a9587299e5bc23933395836bcc97832360a992b040a7b67d4e2caa3d227f60d4c8ae293070b1878c63c8e106267a8ac7bcc850dabb5904769fc487b4f417388ce6755058470a3a7fae41b56f009b01c74af2c0a7d252b30302a7b3585864c84c8aa4ac42e82b1ab44215191284799c40d5ac80079d30625dd09562e555167391a370fb6841a98ff2b85713b75ff58b984efaa29393540fcb20e3c1cdb1887be3a30fd3861d62999f2c376704983f969197c9165f19b498bc169966269e3af2300847c908a4738c8655f476238fba9bdb05c3e4f1c3aadc7432960603c36f759c69e4ba048c76561ab4831b40341ed5c05c7b8a853169f2d75713c97a883419457193b9889724d3a108c1c3d083404d93a25a98babfe33d36fccf4f6623b9e378fc5c731b0a20df7b5c28a0c86c065017d37a65d89e8e127acb630f4304739f19bb2a596bf950c996805f73d79ec0aa09dbb0561c3a3bdb13009f672b9f2c907c468d916c305d530fe5910a3c029a722a9e1e6048ef23454bb64b1c9eb2d1c1fb4c57d68f592a778a0b3bedd71c5d4f75c2e46b6088ca12a0a5e9596d5999259f13ff4f797c007e4061f95c7d56cfc7ee5c49e849dde3fea8f25e7876df2a18515c34 +ciphertext: 9ea5dcbbe778444d92c1162b8842a4a2fc33f2e4de75c1e5dc23569c80479384067bc22205b47bba218bb0c8f54475d71141a2e66dab38320476b00695a09735ff5037008e16ebb9f5d5865a479fefd25cc29e9661569237ef9b1a0f3f857328d857c1052490b533f46b50653e95b7159cb7373ed0a06b86229d0cdabda69738c45e9ce6339c58a5206ec77b73e71f29c55dda3b396ecea3f5dbd533f8e5892608c204518174fe2abf933b4d1a734cf0f0b3e53b566e00ddc9551164577ec0b9b698a35bf949fedbab9ba066b0bccc5611cc57ddac6cec3307a51e9af5ccc4aaab97551d005a68c968c5ad29ac12681672910919f4f3708c839f68ba43ab6ed9b3fd5ab913c156daca0c79d4ce04604d49494ffe53e204bfb04810cc179d830b22b36563674fda54c8369e412160d3d5f1e5494ec76e1714f70b5d41312802dc615f06a22159e762f825052d1de9d1a43bb476c43ab6071a53dcfd1575beeb415a58902a22b9018d1fe86b664d8676b2cb145a3b86756dd1dc7c0c8cd64777064e95f3e47c54544a0e192116b54ee581444e8a809f6b4e790888560842609c2115b6851cb388eb3d441c28ad517eeccdcc7fc0f5a487bb38995143fa2f0f99d0ab708df86ce26756adbf7b75844c8e94b628ec2b117e07180b7ef46bcb04f9473903e75cfe8c34eaa3fbc44a9da3568b06ab5b8a2196b09cc53c0d47d28a118c1ae014ebefb782a4927500a57c8a4f44a9051eea6cbfb00a20f3b62d1101ee1d0a9f7a706774b9aeeecd91daaa82ce8ca7adcaa2727cfc2ae37c1d05ac515e37108678272226d1dd0a7a4a7aee2be99831ff18864cc3d438427897f22043cb5e193b27465b3627fd9d7a0976268f2c2934050701783e25b73537aae506b6dd8de3a03381b96c9af1e0cb477bb1da66683b832402c829dcf20e872ab79f5f4a658af4f7d53430b415d0cb50ed334acd4ae8693bb27a0b36b5f2769674758585d03121c3636ebe4d4a55f23e0fdf7463385fac3fbe4827a6cef0e814823dc6aa558c1e9f18ece63a62820bfb338a5929cbbcbd496c601892a9f6b4a34fa43d3ddf9fcac8e0069a733e4a9cf976427979bd829c0d394ca2b09ae53a4a3e7582e8035d22b42f0f66549ccaeaa5809afd1c18b22d5570e4bd6a872dc534b4a1c404e4f9985aad35422a27af913f8f8f39ba3535ba4339710e2869aa150fdadd00ed2ddcdb85404bf6623ae56f8279b5f86f7e3b28643c8588d7900397b567cbbd62bf9399aaaa1f608b2be7f0caa251b451b6186fe58b49d4b7e061193ee591da5bcdafe08fe03e3ff0bcd7b5327817e8d155859e77bb84ef616897e15ac38b516bc53421230cb0c256fa5aeb72455300983d2114b64d61c9b2f2f08e5c1f3af7a00f47eeaa36c9de5fe9487533fb893281607bef7b7c940216abbec21befdf21ab4e5078ce57dacb96b9b46281a483a11d05df9933a1e09385e6cea10a26fbad604cfdb56e82e6e7fe146d34d935946e19dcb87dd0dce2d2110614027e7ec6208bc2ef5d0a1f9554124abc026233d41958d683667a20829811d224f978d5a3fca48340dbf8b6bf0953d90eff929431b8c312335ab4c5a8538d6b07dd53fa214974183f2c0f8b2969f59881c5a7a90605a8ac2d47001a9177391a66cbe2f26664b5b446e03df736fd43ad9dd80d753e0c7cc9c86c0fa36fc0edd2e5515683d88d30f16c0a89fe72f855bc47c0cb676b2be16be3f93476df3128d49e8107a05b8128bf69a8d4ef13ab3805d78c2dd2d27b771daef67c3958117901d0f23f4432bf07a45cfc0ee2345363bc713c3e34980c6b0266f990e33fa25cf7a6ea84fdb6eb43761d3117d99a1e44c4996787d286ee5776381557ae949499ed5ffb3834aa30585aa8f782aee707e02aab97a4749fdf26aaab56068b35ccbcd148db9b87e07174600338942ed289afe3cbf81df1636dea87a53a15e87456cee2c8693d2f727035e52d89f4919575c7843485e147c36e9efd0831c1ceb9aa70bc6f0dbea7398e924ca07fc682dbb2b9c419e693267c37255397ae89f3c76c6ce634d7113eaad6474dccfb0bc914b4d11371f4730b228dfe89a4b0db7753239a9959a3b250ccf43be6207a12e588529019e72c0b4f432e377abc4f29449c45e987bfa765a45ca0fa39d96014dc447de4ccd3b0a6e07def8afff4cae12af7673935771be3aaba37060d +result: pass +shared_secret: eff76345f442ea27594bfb6e1e9eeffb55dbd15b9936a3aab881c0d21b45c28e + +# Official test vector 95, seed: "121d90e70af6204445d0deb28ac0c108262719e9fd3476aca74bbfde89faf04d8d5f89a624e8a75db80431f0d10ad28f" +private_key: 38d11a53967017a25d6522c539d05bb58667841b27c88c5f684597c79950739b4b3e15976bdb84de829fab2a74e888a65a336b5cf51e57c3c86e6caa9d9a4e7eaa69f9b53a719031a0d078f2257522bc083184bffc57790ba35cac0333f26925e87696c7749cc1129bf1d411fbea5049fa56231217fe9c073e59cd389c7b8fb0240f568dc815459ad132b932956288c3d93aa36d1627ebf1947c707a7f19c9d637b4d4a712e9b61444604ea1711cf08a91ba112087143b8893abc4db933fe973c65cb1c6512519b38e7385a1596407dd4850aaea36f9d4cc75542e96578b7230bd775040d6c03ef4b5b79406063c75b863a51488d395c33262a62268c1d11d53b315820b5190a94c8792aa24f651964061aca4212f452e7566b21418a9c7d84075f609e7456f069c105cb41ed9f638fa417e73f55f4c01bb553c085b3740a3bccd2cb76fe56b1f1b4892b762c2ad3c6eae082531b5b50e265ce5e104e8479087639368c091d2e2087a10b5d5f92cadba3c1b540bbf7945d9d04982ac5bbaa342ac5817b3a982e98a5e99a249555205d827b5e3348b31dc34af06b84dd52bc6d771acdb3b77a41aaa951b7fa5261d56bad24932531c35820943b0b2984afbca41506c4b3481f8817c285136c7185d8aa4a22f48920719b4d525ba81381142e8b178a0019313bea431c7ecdc7aec54662f591be66b74d85070c68817bc01c50e248b347c6eb3a97a70da43f51aca3df1cbe1316f93c50f4d02424578c6d274074e13accc57bbb8222d87db597e6c880cd794a94597faa10fb4f901208244c788afaf18502e3b7fec113510470d39db48352a7331b24a3ee15f986364a0e42aac36bd6a82b78b803571f632a0a49e6a871a9ec17dcca396c1d57a49ec5b46a981f6ba316f181721b40f17266120c0bf64a9a1d9116e2f104a0728bdfd54570da246c512c102d964c3c8432839900ff26910992309aa78aeda610cda4cf12aabd3dc7a96b1c26337c1e2fc858db6be45321de76aca80e417c7410283634b3e613d6594b8748917b60333a1268e6f943746377ca9c5ab428a0b6f37b844c25a8b0bc52e25cdeca953e089b9d787a738911cb6f209bc3b85c415b1d0a3630115aa496227a5d9bbe4a67ff05c2c8ab29090f52a9ad33a06dcbcff047244e170a9fb9fa7298b06313b80d4b1ca0a61d1531effec12c77405e188053fc0aa1a0329bf1139cfaaa86341004a4a11c461a5ab38036fd777afec0fc8965ef19144f0f81e40065fb23986dae3569dbb5feaa79b4c867be5a536dc9379d0365b00e91de1ab9a9701011cec0721c2905ea049fc221f39a7a80aa11114e69e7bcb3822b3c61a46386c1994141918ecd7068370ba638770fd2831dc758496056d15a82c6e0196c152592a216749eb02d2099309573fb9298e6d1cbda57898ca8788efd280934b4b60e40584c365633bc7fd091db45a644936be33953d4675c2fbd270ecb82b3e550d2df36eb5d11f7f6726d722861468cc2e830a11c419646c28e4c0bedc9627a0cc83ab9b9d4e3b320cdb18c4165c3b32ae61a05aa0869778a51df37b9c125045c6899724152c7ba7a6536b3d9e92ac2c63c29189813f55b5919861f38cb6d30845ce353dd0e199503785ed6b43ab60c0b6233b64265c7a794ca19838776a65ee97935cd4a63862299297c15b6a17bb91cf0ad393972b867fb11dc1e24ec7e205a42925ad337874b3263a7008e6487ed08c14a8b7a973f6a340f2af81fa76691c6343577e8b83399ec1a356b78d1e92ccbfa54cb79a3110411ee82161578c6a07d5746734710ee8a65f69780c16bf600737be4b48c7c977cdc2a3a6769301328f7ae7238f297f16a897cb3b768401544b974007c64be131b45d454a24a21af8440792631d78fb3ac527112da6222ab0ae47490c8247c847b5aa9700c05f7abf8f084cdf97c2bbc11414aab6ae26a276145cab441240808d1c3069847ba4a288a01822c9aae799dc44328a749042ac06a39130c513235f2567a34b52858199fe59758328010ccb7d8de311220335b4a555342633e5ea60b0b599e483787d2417790282011a0b34d13151a02581d939423c364a0a348f81412d07738299cc7bd12d41d1642d3b861c661338a3568a956ec7a4b5d855733626b5164c8c2ef2a56897a656180d96474d83a849634866a5cb0e6e00b8cb964067060df339cb2ea05fbc6021057978ff3baf47ccca15d90147473e8bab23693b6b70872b27b4a4c0730c5374a260e7cbbe9a094ab50e6fab80c32875c2032a5eaa8f2347c313409ca19302a0437cdea621da1ca0082157ea362ef7907fdc5826f067ac4a4a1e4b997d240c7d3df9ae6db528159402d1943fad6743e6e18b345ca2c0494d9bc956888ac85c021153b65388f04c456608e41361a6d3525a1143f610c21b2a9a7f5a2e1a461552904e341ab427028e567741d9906982e4b563d980b68871eef012f2c3639a244cd300cd0030bcf4a2b1db5101c1d66ee28bc3bc276b7e9922d0253904f30bb676777a36a897d35d381292915a82f9b2b7705380277916e16a137030198032b865c823e80a58c12ab39639488d65b0c80a391102cbcb4811911c60f618323c13a0e967bac6561483026c32348502927f70cb2f780bb571f861cdd5394296436e37737a8ac6cbdc42a0f9b96941907be3abb5e7740e193d590c862130283f0711665a85fff5158c968578781a7b766cead81633b6a2560b0a740752d83253a04c7f17b90b63860c19f38b78866edbb79482d8af6cb858c8a38fcf1c423f10cbbd9131ed87116b611a75bc109ee57eeacb6b2e1201e488c785b87f384c86587844a921701205979c1ba17dbc1519dc0908c656d7734a5a354e05606acf7901f0c7590e3a324c30a905b2462da7cfe478a4697601618bc74070a9e30707219c53b48c14c01a8fc745098a27b799868166c26f51a12a9a24c9faa336f92692c141961ba4444dcba2a370a63f533f87ca2b1b9537987b7b71043d5fd090300a7d4673a38cb781f833897e94955bba19d428cb7f71710e98901b3597467795a84487bcc5a1180482fea1205a0a854481719c12b11054ad3c85175a04c27011c29c387d0e571084f625a6f73cb5986945cccaaaac7d9eaa305c31535877cadf213d5bd25801438717dbb5051532f5f135f2f79fbd093864439507446b36f349ce4748fe614463917864eb90f3f36742f026ecf32e82f1cb90017099ec78380b5aca2c7e82657557eb66c2fb633aca3d99962ef8927a3f3c9d8da538b89525310664dc2889410465e90b4d078c7dc8f030729555756c807fe228623a37a2b248ba55516caca65256bbffaa6cf6457dba32336a71221659358f955416074ad0131dc4d186bcca317d193a91d12900c477a00490cc464a119214df01882576b41ad7b6f29b34dbb3b03a5c77b2d4162d985530c908b186b7e168c2ad69830302283cca078f5816a9c79add9bbbca9b3fee02447dca3ccb82bac0ccc385538208e49742da9616a28bb3c20568838de02140eee3a7e5a94a82563a90720c62ba2f32f05ddea552f565b4e2597b17c3b8c24168d4484deff79a25b82ee1253049e619829508b01a7891a10db5c5a532f4880c169a38c7a0c99715a2a696bf66b678a0349ef02c7002a5e5ec3db2c3647b960fe9a343b540069a6c228e024719e269853535f5e841f78922dd85c3052188a2db0b2a453b5119311747386352a437d0a0e2fa474aec0bdf1090ec169cf473b9cd153c2131b2e7e001d3525957a487a38c726d710a6bf6a1f0027432c53a56a96c3a1a100ea69103fbcca441a3f43002dd47714d397f7a3a02d0137a0dc060ea0669530161c67334b8965faba455b81a6dcb37c8d2ba97c9496c3e3bc984c44a7b2611b51794ee2347cc489c07b4a89e8c5c620221b9c98c08eb5b245819a92cadeb684b82757e00039079e550a7c7a14bc856e0d347d28861921277bf18932183cb9c40cb07d67202a7838b500df71b1ebaa87202a0943d982aedf41260b38c67e25173dbc67be8b33d10724b08611857c13870bff8c0324acb67f498b599db59515ca863bb1016e87d07b747efe8c903f50b3f7468053587555163e7f5165740204b78ccf2bb11dc32ad1cea844073b7d4667fb55b93bdb4a708db296f3bbbc511119db4479737578859075c320e55b0a5185552cb9426a69b0bd11b4dff716d5cc208e3fb46c3c4456cd63ef1d598bd675d55b1adc177790da6509dea49aa958d2ce9a9e6ecb19fe96548a88f7b489433147dde00139007b6bdca9b3c6c0eff0a1832c10a257599fa50200b167829bb34ee72551bbf3a650c7a34ae6ed516d401d89486d438a0515a537077561ec79e1a3963ab873d11d816550a4c1b14b584703531dd7cf0d97269125dbef3d73e443d017f57e32d432b4f9f751bde0496c580a181ffed762aa35454a02d3f1f47ee0394c89c +ciphertext: e93751ffa496e521eb17c23e50a0f6760223fd2846317d2e479e6f78088daf421843d2da3581c95bf51904b3a1716bb0c0f47095622b02ed4d8a7ae681d50b91606b597fac2c506380b94600919c4d3bafbfcda50717f13cd2d149f6992e48390333fa9016604aee7a8680b6e20003f62d265c5db1248774abf9a37b47cb63057486cbe378767f4f43a1280b8abf9678a86ad0195f915d880b0ddb336924c3fcc135a7a34517713d5c43a1ad0775530dc1429b55dba7b95dc1ca7809b5e84e905dc12b47bd82289af59ef73ccaa232b34e68a2e1cf445f657fa9ba97dd8164e39937f19e5d3c185098683aa7a5ffa27077a2f2f898c91d0dd71f8a11c6fbec90bbb3777da4e6184b24d8aa84280d02ebc034e884d53cd00f1d7cdf5d1da8e0139d0bb23e02d82aa50c65067366478176bb3997e0ac5ee7d499aefdffbb93d5a809e68c2d36dafe9ddb1fde88b9aa682fd32bfd10994e4636005aa3444f5d69434ce963faa32092f0fb99e980b1b3e9c20d322c8dc3be47365823084740da3358ec916d9f73e4e7d14ed93b8af46636564e34302906c2056eec89a6d5b80f464fe052348715f341e4463d6be386f6a00c9f2195e8528f7874e802ef1a67eeda9f2d88ccb798afee08312f50831c7464d8eb9477d215ff6197dd0c527388ad39f285fbee3b7e7b3577e5ad8c9a3296a3336e20d0e488a136a12d216f956f431098d4851bf0d5a39a6c9816b793e02f3a0caa80b12d75a6d3b30dfa8ef2c5df0b7ceae707589b11ba925c389b91335b7108c54baf166b458493037091b9b03d4464e30938f40963c535ecbc15911506a392f8c810faffb3935d9d8ba7cfa7f9bdee26dc7c8adf4cf456455aa4a9fbc9923752d9da4373b3e4964ae8fc35d47db83884017105d83b403e265e707e08904ce12ef68be7fa4ebb2e394cea40f59d149e4c4c36517b4ca97715811d263f75f3f0fead99bb8237c1ddd87f0c97abec768b6778ad9d7766b59110031675a710e2ca58adbed88f60ab224f438d66803c824a597f4788f04d363b01993fd1d781fade7473d9642436a6903a4f90fe2c657210543ad430f380192f3fec2cde08ffcc8ddf6f06b2ec6ded6df90cecad837d216b8a2430fa202096a874a8ad599ac981851b3d2473e34cfeebaf6c80c83dce157e1d48dc55fa93486df68761a68cd4ac25598e7aa592176cb2c129afb0bd1605785f677ffec08ea09687aca6862ca2553ff6ab3b06efd9d95d9e85b9762f7d6c69765f12f88f5c53fd27eb2f01e4befa14cb806ae36f3e03279e63f9654fc6117939c821e95cd395233278f13a9383ce09098d908ea7cbf40601f69643a6570eca6fec04a20eb27c621edd89fe1cdb8e5a92ecd5a79f9195832126e3bf6a50d5fa01d9b6b421497d847507cf1f09f292becdf91857b8e5b3be40400095dc02624bdb895dc54c59294806919a370433cef927d816cb8f4bf1fd8d86e1b997176bdccf4faa3cc2015612d08003a1a20fd0af157192fa4e5242da1375ca707fac2eab67c9f9c8d7dd0cdd555e3ec7dd475655f6d5a02c5956c3168ad4c0c7b2b661ac2f02898594fe539e09c2d484bd179f4d58a3c2dbf64deadce93d6c5941a14b68caec2d6599bd323ae520c9e388dae37c28ddaa92ec49c725ada348b867014b72f9e18a3020dac6438bd35b0a5850fb9f60f2fdac1a7d4c7a1755c898969666778fb16f13621fa171efd844d89eb7c687d429e3e35eb353acc6aa2d85948527f4f704c4bc7f96ee8ee8c6110859cd798c12610ac35035ff371ef30e20622339805b8a09c8a10b45f32e1f67372bcf47c3b5c1c3f4786a01fa6dfd40a75859e60ad6e74b1bfa906c5f72c0631661943aa2d7ef701ba54546b5bdf6a057e4b4354442a8188fa6b2b4d316a59c3f7512266e145976ba4a0be6b65b6a70da0c31a14810f27ed51dd30ebd9032583e65c3f6e7efe5f6ef9b311e2984c94e88007d4e810c387135175bd7389ea96ca37b041bb0e1d6143b3f4df77e43ffa3a5e2b07c3534b774c2eee8ee2ea2b2f672a7fc40c73f8fff21b7feaeedd7ec5e34047cd6665a58eae2e42f9ee1b52429328c961449b1b712c2d8f3a637878acb02801ebbd15158c1c86ea656db183e583b297fbfb6a2f64ba68eddcb2dc61eab4cc180b0efdcee90dfab0feb0f49f833cb029f8a901cabf2ea1f7de4b8aafb630fd56001cd +result: pass +shared_secret: d788c3a7c4d8a957b409028cfc62e5266559cbec39534d7f337aad2123bba577 + +# Official test vector 96, seed: "b3ac6503206accc2a92cbc210d020a2654726911d11ce676aa04feaa08af1d20c654e4105883ae470ec3ab299075d420" +private_key: 5cca6a37c37871e04cfa962d1716088fa90f49d176bd5077881b53d6f20da1027284e94a28058a0e249da3c36c5ad6af6056c4f8774af6343b19a0cf5f3a4c594489a64305d3196e71e390528141a735544b9ba54cf64523c39797153ae1620087264a5bc804cb864c92781ac4756c4a216d6d041ee6369436dcabd1b3a33fbb2fac37a994e2251aa9112c28ade1761151947314134ef0567962819ad9e47f56e7724ffb8967db192dbc50e0358d4ed578db4b88f76578196799340a21686c747b4763b9302eb4d5648cc83f75587627661a269801ff10662ae713a03b7ef1dc1918493885e811163902c7a8c5cc51c639c5750c13abc126431dd85d9706c945fb5d736224c5456d6da493651b148de081607116437a9c45e6614f76a5c6502b65a1ba5a31318893bba3b68e3cdc3680560d22c2b33745a4acb3a8af56452b7201cb42a0301c9a41848315212f60bb7d6cf7c8647cc7acf68b81959a8a6a91dfaaa41f3a679dd136d40046d7846f170bcba2648e08185a6ab380236158442299897814913196bd649a8b735d114135aa466804fabca21084c28844bf00cd18d6c8dd0b48a0f61139458f08f912dd28c4b4b6b012f6cef761740d97cc81341c80190a0659380ca04934e3b4426c7a22255815646afed165f68186da0206aec0b841828cd3130c59f3295ab80613e07a85b599bfa444364a569486075ab07815c74b4729a9281c6afef55fe7737f621128e18a355bb89c392817c348aecec895da19125af968bd1b4968240a025b051c49650594110e96547c10a127148ac162baf3625093c26577174586ecc30e4234b9b626c58328613b21bd4a8fbaca56ae9c9b943a7d2d79230e01caa6c6135900b33ee8925ceba22ee6b65fa09056e539e71b20c4815b448c70ba772302b9cd6e7546e756a85b41c409062348c334c6ec74c130a13a146757b8b566d33d7b0918ecec6acac9c579e5cc7e3a33c5da79d86a36b0e9b6ce1b22cdd696e1e793f6109da565137e2b666631225143a9c8b95d8d3a21c467c1dd2c0ce774a45006abea578844e09f8b982f0ebb53435c0941bc7cd7d27e8336cddd8332d62c32068623bf18944643634d814af239a12e3aa0daa027a8241297fba5bda40eb7630d1c2a4acfb7529963aa1f80ceb901b7159020b910c252bac2110a6da65732ae359ae3d0032494885c6a44874735d843cf2ac6a5e5f5a625069c0a49a66c8270b8e5a00d91293f0664f64594d7493f5399a3ec6a2c4f4a31bd604b04449c1b215dfb227f43778d9fe33f52e9c687452926e46a508c8a2d7a448af4539c05b4bf512b962017781c0e157686b748cb77b36a95c459ce5011da0c88f58a518932b5f7eaac67a27d89a60884d8a9f2729509db5cb76cc6f6236ddd0911d9c41f526086f3a24e0e160192577b8ac91ebc0860f7ac884161c6b62b872f129cb8fb11d56ccfe8b9adbec54ffd23b02e471284dbcf508c6a1912213ff754f1dc195f97b0bd798d8ae8b44114c4dfca0f76e479d39c4a19ac67445520ebfac92cc300fc62a94541b345f10b0f79c519c576c2037998564eb1506e6b91c8f606cac8f9b0d6927ab0e885b4704ac54cb14c67949f506000ec9e0685a9684b648a802cd8b5c8cd82860566b2d6e60e213429882ab51efbccbbf33f4f7a0cf57b6ccb8a27d95936a87814e6d80c4562c7a753c0a7e03b3685891e77338034713b7c8da4d097281753e54828ce951c60279a729376e991aac5101c6de3ae87c4ad3f4c75ddd517978bcaa4e85deb15c10fe701710067d25c2da778b4018c500c7368e58c550ab5825ffac4d58b87e745bf10d8118a787a5c5694bc099b38d89ac7f890d25497a8e521c8505e659506e0c65678279bc3daa95a82c806f04219944c5ef308315c69bc753d50490002c22e8eb89a65c93ac116692370595492cb626a8b5b64c291f77f256583bfe2a2372cbe80ac5704a2bbf3f0bd0a4515cd131814c6aafd39934adbab22ec3889572b423b643bd56cdd3ba2b8b20e98bc8afcc33d78c9bb8e466047961b03d31f94b783ee80a7506504ed3a723094c460d07adbc7b4ce258f9072c687e6346c850edefa4d3600cd616c6e8138ce6c3854a9452393a9266c2141b1d62d4111adf9833e2f2ba9be4289db4317cac169cbf017d8e336efbb596130b73268680be4885255aa6353a39f04740be2c3910a9ba91700687088aeca7fd4a37feca45bf29a27824babb327c49f18539ed20c1755983e6b1e03f98f8610227362c9e12246d2176ddaf48dac31955e59a7d69a8dfa582f8c66b14db7259e6c4c63bb88c995a71fc44bf964b1650746ff672fc2716528741dd8174aa2326e21f025367a0f243ac63728bc6ab95dc22a9632e18cff13cc6e38a1f4a0a542259d41db0c1dc640e8735dfbaca58c3c7f18e39c74641d477099ff1ac96c924e366b16ae423de8bc9610c855eb686e8d9301f2c08e96e3a2776523ffb93cfa3726c1d03d0c2c634f1cbae6dbb4cb987be8eb464190056cdc29a7651c79773b1686269c1646a65786f667986e7a552278713fe5c5a4f9c23633c467b8b63b408c4229cea5f5a0664852729a7474695137c0961783656df45277092226e232d5eb929c8bb57781cded3b7d5266bf5c2ccfa992bb9d8b59746319e6b5803d00a84e2a99989c08bc9726783389fd506074606a0945c7e3e22500d58fe3a647213b19beb6174c72833dec8ecd036499e53b0a18a1d6e471712a1d64a903b1f3634ceaace56a906a1336c9d9708768a6bcb9cfc036ac22607810457e8560561a38c5cd84c6ca021a98c15aadc47e874778a81423d669ab411a72aa4a661deb2b8f4a06600baac967617bfc5dc8d12d44d9a7f80b46d9a40b91a66e3cfa0bfb5523c04922db21c4120717b436c6dc81030d13b867e707b9a3891791c756800adb41cc9a29260d98202472b733611037a98b454b6b5af423df236dc079941b160ff1c0b8ed1b14e787898da354cf79ca4fe506d5742b58141dcf624964397274737e4ed1aacb76a92bba8966ab24741163893587c94cbd4581bd0a110937946051c572f2232a149667794812039ba9e6525a298531e7479a161123da95b83ee746dcfa1d880130af080fd71480a4d51a48c48abcb62d4c7b44b712bc0ecc4eb53a929a1167f3c49be7b019002679123348af5b7ab18a36f86a23b309154c5307b003966c8755047718b32649945c7865f123ee60198af51dd591934ee02ef7ec218569129d03b76e9729dacc17e4407eeaa4820e238deb307d819528b932bbdd74ac25c0476c037cd8200ee9231533676f3e1b11a6fa2511a3160f10b26f2cba2966572450516be1a39ed8bf651b961e58be810bbe83957037f1671c128f91f302dfe1103d624b97b4c331db624fb354178047ad4b909ba93211908e35014d896144356c250df2248c5487ea11b329214b4c3b2342e64244d684ba914e020228e0d9b5b0283b5c96a22b510f31974843b21df48878652721bfea1b38054ba1b39ebd0a03746ab5d07ba3d80b5be050af1282bf1ef87629ea0e2f9a272bac24b7d3b464c182a8032dc2acc0b7ba3482c5cd7c0b5199522634f61d553534020671baca3534193b2a9585f47394aca1c8aff24c05a7a8b0f59745e56e12321fa1a7b38db38de3485f017626eea474e3e3c1a6bb5242f26de2529e517928e547423b79cec6452f14c17ac403c0a6e23d25d334ad07aabd8c60310082bb4a194d656b2e2b64ff3475fcc9226a526867ca7dd03c75351ab921eb35e445b144f4a7e743acca85372a03c4cad754f1d788a1c919efc198aef95baf7768dbc94f36d5a37db440ee403b9b8a339bcc50c0469f51681fcbb294a042147f895d9121701071a6ae8b85b3ca4a7f197f06cc5ed4e40c5bd1ba18f76a8010857bb0c3f8c15ef8f89fcf22afd560445c8576b8a46297f1cbf5896232040727eb40b78c97099a09eae192803bcdb153b7c9918b8c66a3e8ccb0a928b2505b3034886b452bc9f7719246d62ad183a292a75f4d6715a42153b8f8656b2c397428803725bd66239587506e9ad5694ee0592918a14346cdb0a9117b7969345bb11be07b82dc4361b580fabc4a91d919fc97251ad1a69938b507e066cfa6a251d98927f2bf2a9806163c07d1a96627265776105126e5ca5872c61e4bba95220ed45124e76b334df40fe0cc4f193baf6ce69581313616c0a9de56824f007d65692d0f675aafe086b6e2621bfba18ce1adc4337553c81b92ca4a9a2c9712416a168a7a9fd06450589641e952a96b122b4c4bb63721d6e76201f96e7403a908819bb61864f9225185678741da30f96e7973a83811b94c50bae593d1da6d3b306bf50669e590eee255b703fe0b2aebdd29f6ceb606f15213da5f478ed4605a212f52358e2046d5b05aeda108ea4d6c6bc0fb958286850422bc357ca67b83c986048e0d0087fa11ec +ciphertext: 3e9c6cfffce759668c9ba24ab80658675c29e84e998e85c476cd6854af0964756021a73b731c075391093a652e118d97f33128fe1fc8af0184a7db5a9c9ce619133154b530b34a32e1bae01226994aabfd137ec3ce15f3f83b80c78dced99d36b689e94c39e740b30c3b60f9df1980d0ceba60a721c171030034c8b686b8ffb86e14cab112da3b734d6e7f402540377546d9f46c90b52693986293ba3e96e570ec9bccac78fd3399c1a7ec2bf01492da9a54df0d106b311014af8ebff9607ad85341f31f8f389f0f780a24a84bedd3e62e5ad282c5520a7a58508f32241817ed1d673c344fa35e2949b50e5812cf2029921d4e673703d056b5a99650feee6d77ce424003fed4b0583a0b9e7331613d566399c244b2d497885cc4cf7f067cfeadcdb1702ba29d1407ac4986a0e29db84866f003f1d3f56c01a42837167ceccda9b6afc39b8ea1859d587a092202003fb06da60bc4928ba839544954c1c9bcae5b93dc808d7f312ce500ca22c7272dfc7a75182c020b5004dbe76283bf5561bb5c0bec93de1675f2e299d977433cf601b46fb52c4f7629b2a85a687a465c16bbea40c06b36bafbe2bc16bb7bddd9be6b4b710fdd63bad9bd37637f46b3d4503655cd517327ec5e32af5faa3cdbc0a83ee5fde307547b80a5da0a047945542b768add53f4d159004dc826b7469d944e802461d2a9f04857ea16b29121fdbb84ea84b1cbbb5c3accbdf7b756be7e01d25530a315848d7c5fce23e96054a5c253d4ed5a3c218825b707f97e9ce17a6e5d6c7771085eec55068f2c19591aa2324d0ba0b2cefb03fbd8d26c7e9a37cb9aa7ad69b782405606f32b80c47e54a563a960d2e75352d7b4eb4946b5e744621d62e80602902380aca323b31e52c013af38e3ecd9bd47fc632c2dbedf7948aab5a10bf492362a94eb8bcd4997899e7e6a888befb98d618327dcab4c69b25a7cba0c8cd1b9b675bbf0c051bf1b8bc1e88785b10fcc67b6bf0f690df552c2720c78767b79b02355a19c56751a007c36480e3cb90b9d91277feeb13b437b35b4ab6325113317d0129d85a386533dc8d53dd3bcd38d93cc6815abb1f30c1a3d38544e8ce0d08db592c5688598ee73eb89402b2966d736e728b75e6ff5702454b31f5c4b68c60cfb64bcec551b92d922b9a418c12b021e847021dcde19401ea9e277b136f9ebc4e066935c45280f546c806ee6a2e5d38a43f64bd467ff41aea502ca82a5cca6d26a9c688e23c0543632513279be831a342b9c00b2518657059e0992beb4267aa2a441bf252b01a92e65269288cadf6bec7f17927f01cb88d8b785baeb4678c16e20aab4de33a458356ed74471507c15dd95c97377a08485f8ad20eaa450c65e6620c40cb569f429dbbccf46d5ada1ea1ff01dd0a4cf1aa1c9b94490c0a216e1e6df250620fbf705b706856bb03a645709d82cf3fcf6f840f98b3fb4b8161c06b8a1ee5ff8360423bfa725641fa779d3f24f40c8b348f68563dbae52e3ccada99cce8ad681213c046582875ac027e6ddc210636fdd68d3f6b250ad9f9c789b76329c01859917f8b0f10b5ce451c821f9ac8c060fac028077aca46fdab43ca273d98a004acb81976ff47a50afd625d5122c7cfca554048183ddf5e34342796b17b9848071359e5722a5e4bec026733a57b1fe3ca8f5af95f3b7674d38110bee4d2c0ae39418c2b6484ac676cffce8781904cf3202d9e1767599fe870d1856bd52ba4bb1d34bf623cddcc67b9f967289b02b09ac41b55cf3a66b1e5c4a972bbea1494a4377cb0aa1b51596c5fd0f874bf8b2acbb5a0c0dd6c7c41b8ca66def9b190db9afb1fc24eb91208ecd17b8cc6e4f563c7f7d81c6188384f09ad34f8c3a6e1f1a592390780df959e0b7ab7cb255bc8ee1df237b361c88001fd1606bccc88942cf7810201bc62a9963f8bb8d2ce4592e0159950451a4d5aacfc1aca2cce03c54bb1fab96cf1f79ce3195181daaef8c527d504f5ed6bb29efdecea74202c3a7b9bb8582abe579720226df3c953a8d4d19e680aebe1536efab43379f36c215527dca12c395f71a0efcd74c6f2be3979b45234e3e16abae1a1f559470ebd9217050e6d635dfdfc410962e611917832575e1700ae85e6c79db04ffde6e7bfdbec672e5620f70d4ad86bd0b12c65de71b4dea5dc97d00e0c51d3c7707360106da1f7949fb7d706a97594224c473b77c699a +result: pass +shared_secret: f4da03d95d99bdcde651fe09b288b46588b50ebf50ac1e35d86077e04f76944a + +# Official test vector 97, seed: "59eff60b1ef6185db34ee1e3b1dd2f159106ceceaa79beb74923b4f5623d5bc52dbf5d2594a1f7c6c64d12cf144e9ed4" +private_key: ae7abea38c394ec61b08f8b73a42afe39c0510a45e50a3c3565941c54332e613c5687c6b7f1ac590c7a2472597e331a23f3122e0a12a8688a9da651aec131981aa6c623aabff1b682db2525543afdb53b461853aabcb955435178d9939c2e262554978b998aacc07728f29a6ee7c54f34738db084c81b6cee4914b0706ae0ce056eed5c97851a0c861a91f42938678ba9383b4a8dc051472cd38d2c85de9747d90ce0e46bb059688cd2cc90721187f56bbb695c43c61651bac8763572d78a4014ea4106a9916ff378cab1518801455683175aa75af0619a6eef774f25568dd35cbe312b80db29ab007ba069182a0369d8025ca8fca341dfb99ccb044b1ecaa19979957e2001af126df1159f13648bec2a71ac53a8cdc957b731c09d84249ec7a53b3507327b1fe36bb79a7668dacc9f898698bf296bb078d612603336109dc29664635b9fce33005c704eb3512df2c4ab3e63387126146a56c00a04954516e386b554eccc45a848c8ab79513e9a7e1e0692315714b292090b281678b70af0847d3211b97f89cad50aeeff5660ba620302724eb2403d4c0a8dd015e7362077e0944da2b5afaf2ba08687c25e491192659e48363143600ca16441a678c7fb40a76c08760c102247606f5d128dc0a13a8a86f758725d4205f1a2393a7479af603a2f173c841b27b51f90833363b87d8134a904dcbca542f76caeedbb57f73522f227f72056390939c10d28b52a824ed621d861c8080660472f01a3d692b1802a7bceb5cabc12dbdd649713227bf9a53f801420c0421cb48c3214755917ab076709231a27dca46a2a603649ba1aed077960e5ba1d44bb3f2ac2c0536b8dee5be0b7c682851553d902939a775d564b38ada0fabd429e105aba00433527b3ea6f847ee7c1667590f96fb7c4f2083c2d540582bc79dfc3e881905b8c16b5bc0c5c5c46880822cea340c95006d80b475d0485c1539880d5298fe1018f9302723d5b3e64515851364e8269a6bc824c562a29c801806289d82389945a4974d16865889bc05d42f57ca85a6499ff0e5534b9cb8041cc0d5f30ea82a04746b51d8242319d980d274102b997b70688f63014f2b473f14b344d9dcbb08c400355a53b923b7a5539b2c41ca08a31556c32c67303448b088a9ac95005c74385baea6a227cd535be3b58e97aca21ce97f89e6c634d175274b737c74a8feecb38bb587777b27ca372ee6c44592ac2f54618e77eaa6f11342de70ad66da080ff75d557b5e052bc4e6e9614f0b23c2b9a13e540637444585a81a5e90b2c1178881ca41a5863c45f42564200e7f9b82222430e7b185fea1a5337a2beb4bcd059cad0b2141fde13060ac4c2bb4b87ccbaddbacb43ea9bcd15a32e02ab9446c7086f64653f45fca9190b0037fb5eca9acb9c28b757f177a9ef74bb4ab8cc526d2b4074b99ef4b6b3fc85cbb343834f929496a043a037e7e3c1eb71323f5cb62a57b3b7cf64d639c2cad92623aca195a43b684058f342713eb661d78a59ba2b57fdd7a64d2643add5738dfa57e575a11bcb956d628c85d06051109740a706fb649203ea70aeeb4cc07e1cbddc2645e2613b6e90d5a12b0b9a81cb94152b106cb4d25830af5b76dd61d98bbb9a6d5cabfd13fdfb139a90286379c5aa772af1c10812da52b582437b6543665f522aa7ab8ecf57e584429cb74abff84b9281b8fe0fa540f542599529505e0bdd117a3550bb1fdc225a250a8781ba42d45a481e74de5598f4153650a4c85a005901a149c47fca69f1b8ed039884c74b39582cbea46b31061627368bbcd0c4de55a5930670274b6bb33a737c9b376144b81c16b9b23292f2d15cc8a3aada3cb7475c3425f8334fbd474a71a83ed957954fac29db49983c8a82bf41fdb0188152c5d20c6a9ad9bbb8f88693636ae00c4a61eb2be93f95a96441a9d7bce5b291a56d92640c4a22b1251ebe36379954fa49605216756b7d07943a176706a20f01362b96501ded810ccc709f54aa8744911811c2ce4e6490d6bb5bffac3f067278755bc8d472689720ad0f98801b6255bb399ec38272bc50aed950291d47ed97cc0c9c1542944afb7c313565c414e18934532aea2430c2c4aa95f31ae44b42e713387ba046aee62a3dd4416d0f4071ae6541efc7f8170995e376c41b57b7192c712a9be8945cc28753a4f3771a68a9000944d726479e1a79d88675fa13795fc086d79f82ea5dc7e2da5ac939a42728963bfc3659d50345694373b877b0504a864247addc746e98126cdc71d0e3b0c7f457c046ac8b8c1458ee70c82905ff5183d890845b21c66953c6402cba2e329886ad51a92f7c673995fe255bf9462b2edcc899125b1820125590024b6928fa0c79476ccc407312664b83c9c59a806989c3252683b139799561708732f57804a96c0b58c88cb4a83a1271a05a9a58a4c187b45cc893b9621e8c5543a02221efa2617b0a42bca1880959e70496cd1452d36191dea226b49f76418b1a44079c2d6392c37a319ca007b65f57743598f2c40a68dcbb603f11cd32c368a0688343a25f6a348c0b260b1946abbf15b3c9ba0ad1cb302b918e4285870c9444118598ad60dd6030c45f33239abc79a04a05a2cb8e62128a3a9ccb61248f1021c7ba5751dc60d50919862332bdd0bc371e4037063879fb5bb22290328c9194aa83716316b7747a5130a984a249e2e124ea0eb67396a3197fb80bd672c6e6cab6de2cca2e3ad70d5866fc878dab1cd654729ecf9ceb733a1b81890cf51c2ac112a52b6a4122c27b86cca81089afa1361c4015abe68c62d9a11bb10358459882f58461761a7ecd3b9b3b17e32a682a389c4328bbc4aab01f44ca93f150e72678160243130555ac9e964c784c33943b5ecd07aa8097be421b796305f05e196ae166559ca5c59a445bc98092be1182f8000d5c39b7c074e016433235aca94d7162b853e45367d42e1604b10702cea82d9004259d130ad5117ca24c6ed411d5929c3f7a6bb35cbcb2ca6bf08c06d1a1cb63aa54d4164a838173b82b45523e00559994e8ff5a9cab63c6fc3266998ca8bd5820e7b16f8f86ce149c355e49451c89624b4b1f2fa7f09c5a15bbbaeb6a641d561830ba25ea470c9d7c397499c9747994bb8818bef9c1ef7802fd6963dbafb6e6dc5a3ce1509510578b96983d08c53c9384e45e6a5bea7c943d11c5c46cef5d0566c4c1f99d00079b0641636bc31913034a134e7a4b0cb959ea4662be55157fe89a7eae1a976f30517ba7e019820984115e5ec2e7d00267240695f600b2eb4181adcad96c7605d5c750154a41124c6f23696845b9b5539ae30b1564bdb2b41c09feb96b31b0796fed8503028af11b02e68f342e3210845525a52268a1b0b4f7648600b455c5c824c49e2972371808bf572017331cc8bc0e11147bc10793e096144a4187b196abde288b134bc54c5b3b85312e7a9bb90135dca9bc7396615ac979de9800c26057ae3064090174437209ede210cb2c733302c4ae9c1ac1462024d54006835ac3f23611d1bcfc945a58401c6a6da42242983f4e712a5080bdd13633b1c98f32835f179a3d011aaa46b9b2fb810dee9495cb4451fe0ba20f71992a445e0c16486d06382c8cc4051647739762257a00d80956475b4521493df79a28319c2c1338c9cb3791980785c2a1ec4a11844b608a7c7c92b81015534a03904cd5a4777fd587ad8004b61ec40bc9aa7a4268ef445900522759cc5057baa2a5729bcfb3a0666126a90d56b7527c32800960d9586e93579eed18189f0a762518125a4317649a3c1883c6ed8b047b5444667b4d53ab5d5b952b10ca1b8aa4ca5e438ee3c2e79c2132bcc257d8585abb609ff870d25826a67075fc38c32cd1c6d78e56a4f18cb59c756979331f1786820ba297f4c26ce251c93686506b26805286cf5919ab660092e6c1825d746c8c9478b408aca024376233ab8c287d709d02f7b8c6d80b4430917fe546ba774482b9b77c20bccad85355f562152a1593cf2bbb02014df47b29d1ca5c1d300445cb4835b45bd59b92caa1cadfab9986869f5a7875967981f1267e615180bf7952a27ab3527a60b130d69e155ff88410b1a10a705b14df248cca801e3b7610baac9d92c75e4c759cf7c8f644b610a350a9a9b5b59eb798a1cbf42d02f211a27aaf05ab8e19baa600f3babca5d82c9388466c5aba81c32a7dabc9775e73a77432f9b96225db1698a2c7a6c9b6949c59d7796758d24c41872802a63bc9723b17f703903c84e425383051abb07e94a1f19a258a61c66b56f46cccf68fa4ad62c528cc1bba2d579913ab754268eadc4204b887bb764096783301fd30ef9d972acacc01977d137525d619df951b0f9a5008bd9cb4524c5ae7cec747696489a8fc0ef65c68e808974e356659cf3d88474ae8af1480f2c4bf5f053b0a8c211d43921f735e63f8ffda3565c2424c89b20974b748a65a5aba75133fcb3156dfb6626a83bab +ciphertext: 6b45b47d66751eaf9909cd0edbd820b9990a7fe19e758d8391c34f5839c9d883ffa86690b4429fd944b2ea3242fc374b007779138a8148c80349b13d098bab8ba58e7c06fa8c7f06e681402dfc890421cc926b7b6e1798eb43ad3e65802b9b997a85985ce8abec4643de68dfe0aa48abaae4f1a91df524608cb6552019cb45a5c42bdacec25bbcde3fbf357258dc908d513d9868a5b8057b12a68086c13aa259c5b53079bb6790b52f7fb8f0e5b220f8960e337f1d60f72819551c9280910e340d3a60c653f384d9dfad692c84d86c3921f427b396a8de54c846274005115119ad5dde417ae74c49dbed1fe8b34eae4091f2d5b8316f7015b74ca8f18be3ad970a99860da876a68fba30375e095fb96fd31d770b290bac3289692831b813261d357e176d39c4e95aefc2d476c2bd03c85e47893e6d730c57f463ceddf1b519f73c56ad3fe2e8966dcf9df718d0589b4d6c78f74c06d0f6b0e3a5d411b00026e950822f90dd1bb91bcbbe81b18f694eb115ea5b529aaae5837a3203cc788b1f25f5712ee61503a2e433cbe61b5242f97c8b9b6ac3e9ff3d50f6240b486f7b127d4ef67fd7db5fbd37d6954ca43764bc9e93e6895455b3b97787b867d47c3fe58e9cbfd916bde745aa799f6c624e66b9ce6409343844cef89a72d50885019be04deb1b5fb94cd74e3fc04163ec07d3ae68e6109543693e6ebcda3fa2921128e53f13536398b0a233c82b31c66ca4ea913eb54402628a1174bcd3212eb460006b872fc5955a998e20d05fd8861e296ae371e84fb3641caf9a64159b9e40b140d9e676c5fdd40f1f6b8050cf2c96a530b2e7752a6587144ed01b585f8c6da4802a4ccb0444fa9849f49f5bd02acf084063639bbf440e14da90f0ec5ccb0bc3a343a6edcc5416907a78ba52ed607747d431b1ab2aa2a166c75af9773be3c10e30c0354596cdf55036de3705c541a0e776e5c06079fa77790da400608823ff5732da88a5e0f04daea35c2ee37b2e852defd3ac53cd0bd411206eb6172ab133d3864170a2185bfa97daf434b1a944501e278bf9696cfe7d5331ab222fcde6237c765336d38d1791bc6f94364699e1fb040ca99633d107998152a78b918e58925fa510174cca3eac4db336ea9eee5fcdc4bc637273e221d6a6a23acbcf63b90b2f12f776cf1aa7449365695d487a7d9d1c84238556bc5a1aacb169f0be9ad07d796c7e0065497c0dc4eb75b00afc7aad3c14b145bc1119feb43a54c00a79455d92bfeb5637f55507f6fabc9643872423a71c791568eb5cd4de77bd5dc3bbbf3fa866f1481d87866232a30f8d826dbbfe440505a2d72cb314d15a8831c21ed690e51ac7f78b2c8ac79e4c1b0b8df49c1b35799d1f9f67a7d0603dc7b7247de7db7c9b3f1fab9555a8b45369aba7111a3cceda4ccde002b225b2b9eb02a0291672fcba505e0e2c7dda86a41fccd3ea865460c734778683cf73cbb420e0bb0a6507195c45691367442a823d0c74c36ad52e45cfe3e458b098b5a535dff6b90d74247ae425f22c4148ab53085ac3165c63c689e7d09d0c5e242b41adab8d295c7a01bf343221b831cb7915d2127b076c96f161949096424790e2614b73e6d7b107d6628d012c8c6f7de8c4577a8b8c67c50099595c104a13012c33de38cf7db732dade0f1cc6da14e785b104ba024920222a00b183f1957ee8a11b121aa624fef83d80e112da47e80476bbd73a03e579b4fd821525ec0768d84cf9f1e75f09852eeb3b13df721b58d174fd06e8f0bbdcbf8dd194d2a5393f22fc7249448050f29b9b74c044bdb8aec832ca049146e3c4fa06c0b4e699f5ed8a3a0f630ce91f1091c827dc7d790db09d2e93768957be071e6c9dceb41a26916b6110586e85d75fb45691cecc84022e0d49da6cfe5d178e798ab353541bfa947a2ace7765163615947c1f4d6b06d8287194d08be3b5708697cbbab8e2a875f3f362c20ad3a92260a80d1a24e72a0392766b5cd759e246bb8150b397479d43e5a4b0b568786dc50ff13f5acd640e975a89be58dff8be1197e33d7d0a0e10922878c7377d09402e888ba06fc11e0e0cbf5034b5638a7b043c097d90898272ce306aaec09610cd2cb0ee870bbde1d92b6d9cb5c46dae7e5e2ccd08565f6556fb2a442fa74b898c18705d82f011a50e0dcf96d14d7dfaa7602d56dc53b54f907b6b1feef5845a5b27c2cce78ba138ff +result: pass +shared_secret: 4aac182a36508198689ad4b0c24abacfa421cddf073e6ccb3f5c22c37f1c9eb1 + +# Official test vector 98, seed: "dddca9dc31bea737d3f474e7560b37facb2f53c803e768ffaade7669ff94b1d4fbd17068cffd5dfdd24aadada4ef6b12" +private_key: 52309729384894d97de3098b745a1f88166013ec7422b31ed4ab74e69c3b7b094dfe982a7db3cdc5d4aaf9e468d0471eaa8c8aa3148cc3a49cb1eb4e4d420b497b73573a839814032f655f87245dc6acafb9602774500919361beeb7b9fd4688fa8238c8c1116f51970394c39354a39212b9508815dffa2e87416269c88def88a639cb1b3560bae168be823918afd8af8d42c3ad9b43ce33428b6b19d4038cd03169c06c773ad1295fe5c06ad97b17ec93cd639732faa7b88029ed160652930595719e5c734420028d60c6180263c9c7db51a2bc5d52b232d0279ef9e7761c1a4578b2b2c21778ca806deef18f9c8778f0b5204d661425c3023c451de2f806c67436fd2b7e2ef208023abb81f87666c117a78b696d65630b1334ef853934a39d9d959ac8990b674534257012796352b0a41308a1104f82a09df85aca25137d597a33c088f942c496998a367a08473a49acb2bd38d27b7ab21fe80959f3bcbcd0488c5bd4c42928155ce5a91da1b437539a33a34ca0cb1c4d179540816f0d063664b599fe195ddc777ea8836cf5c20f8ab34e3c8c6026e58e8b032c6b720324a882a5512d502880b3d2a3df38cf5da7c5fef955524b451d5c7ff24c926d0382535c0ecfea73b4e736a25957c74084448324fbe462fb0c656b074ee596abffaa67b692b770e734f56c53a97bc846030fa6ab726ee7097a49a64f098aa3c763942001c7999131220a47751ef3ac3cd729238c671f5ff51aac89101b772cea01144e469510502103e70a67b08dd968b21818934693037f653c845579e25c5be3196e180447210c97a9a724863588d5f38d20a8c5123a6b2aa549d50a8b03dab4536bc658c8b9d8c782b3e02321c90525e56d3ea8cdf91a7340c88c8d90426414469adac2268214433c23cc078a12c5bfd3ab079db8ab6222cf6f47c005fb84775ac60a606e1b460879d19ddf619293113b80598e87658a025824888541c2246f93870271c767f7d099e70227b97091d0d4c72a1248e47c80b99b2d8072cfc0552bb82320a6ac00f04232c75050afb90f4295c98ccc09414b402782a0ed168d31c2cf913288e57245c8ab998d99b16ba26313d05d50e15617fa0e3aa1a32ff2717ac486ad72bfa679a5a63a047983af1b6544c8405a4513af232b00907c935f3b452619b91ba35c6e6297d5f4abb981a6654b425e612b431359c5b861189a6ecdb978ae3b9804740c7db22013b39da62099d397659d847e7c6a9121991db5abc317b8287f2c9f07d4bfd9c3780e29441865458df968187763b9eaa8c3c99c22976d77760f31b5c369917249a78874f2c22671446d289f996ba38f5235152c366bda9d50f66235484df4f6b0b8f243776bb09a7958668b77f9e1a537428395457873d6be96868ee474c83d969d43e0bfd6976e9a75c79094574595aec7fa2dea390202dcb289f7823a35ca79632343c96e916a097e7314efc002799047c3a608b62829d2669fa6f0a95f594533d910ce6594e9a8186444bc6826541f3c834af812a38a2d8a87c8128837f68c93dc49b664813511fc64cafa56e324556b2803e56503db153ecec99d274c889227bfe8a6b4ceaa578ad37684984a6de966b0f9cb8740c7c5232293030aec6c4828c29152ac2fdfb29ee8c72172105365b465d1bcc2c2a07269895397842f2a839467e49a422657cff06e2320ca5687c52dea39470a8b2b84710ec05bb7bc10e7f3542d4a9e5e2a377cd15d8189a4522b107c866ebc4b7777e602fa4a46981339879534a92b679be67de762b2b0d07a3ae14434220d749c0d3a556295757c747a248a3b2e172a9f7ea35f646c2c2bc3615aa110fee2ce88d24ba7d12f0fd24d209a6fc44995ddf957ebc80014c4c904947a5c7a58a503be4d18a9450c10a4b90e93b780d17c7073623296c62a3feaa30b0414e1c8566d65b95a7c98890b366913336130cb5adcae5f40518325cf2328680d9c3e430bbb2bf32754235a4777280c934d33c2bc571a637b965583678b8280779ad6a2ad9a65d849419de930327b5b00ebba96dc14093088038982409a1b9b19c8085a3bc9a21783b51ab266a996a512c4ebb550c0c871f58332839ccb02a6b1509a89f43a54d302c865463bb12f5d87c1f0989322c48fe1927aea1029e748593995a858514bfab5cf19743430a247522566196826be35c3ba55053ed8c8ac04211931a38d5a100c7097059bc058d551672542a8f1a7ffe81e0c43b1636572f4608dfadc72f9a786c4c2b2d27c576d29461ad56369b7300d3b0a7890ca3d8407a8a1a90f796558843202152a7131919d9417065360440ab8516909087b2f4ea408baba0cd5c0af2a85634e88693b8c121dc8121d462650f2b417a0c44a5018bc2a70e68a590b757b4c0ac70bca25923049fda10856f62ca42701ab9a75d9991fe3d99856138112ba4f52da1166f410e3f15baf7c3062563dbf0626f76c4ce98ccb1f238a8870201654a6e551a5de9cc24fb36dff2334f2f7bcf51b8b6f8c2d07b4892a657e58637011624076040c02ec59924916f5e49956534b0b7a746b16663f33cef4440f2eb5be9fe4034db153d296a86d83bee3b08ae5341223193a7febabc53956049bc1e14819391c5be5e216377438b0fb56ad770335a97c8e574c015c66d99c59325a2edafc7a6b4ba77fb51050a2c400d754d71c0fac84781af78c03c094bd800fe25b7f7060bfb4252643d97ccc6002a1568d4af181e992b1ffa8cc17bb835f0b2e6b72026478729275b002636cb49c9edbf4373912961da0b913e6cfc1959b80e711cea276c10158dc43b6887042d8d58402cc54a671275fb49a7920c35651aa4d81aebdc772112420db0162b94648ccc519e369958ce40adc90413d9802e621b6e8ccac13d846151c19c6813259c5998f40710f3162d006c5d3a9b2d18861789aa7854831a0314eb74a03b84921ed73ae13db7298288ccec07eaef97716d14a8a296bc3d0b95e4a78e1fa2467c6ac961a73ce63085ca1a4b101adb7f2a4059a97a24bc2dfdb6115386de5e95486a46e6697a17a88510c97a0602205e008088d269082b2c1790c02912a9f03383a94d2127ce1a0d7f558434a6300513a14e2c4f6b33d8a159a06d09983688f75265a84637f07846f0c47441bc6a6a8e48142b39b4891bb5c321c8bd307dcb6326dbb960b532d88f08f8a299d914824e46189378c635cf2088ed8382fbb4164d01c867c1f1c4973116c3629b3cddcb40b1832a0f06b6d04ec8edc46205da3b28f50bd1730bbc04c5f927209a4369b878596a2e149767139e4a06493ea42034062ab1ab037728908c07f9bdc820495916c9114f7e95683c945c19354dc06c5b7888244ec179bf88ed4e68bd10483918bcea652446b7333e71a403e97446564361b5253d0b225d4155682123725f61ed5d4655bdb7891c6572758977f0b4e8de021e832ce6314c25e82392cbca5c794cd20241b87ec87a85a017774bc3da18e77e0b53a521b2eb0a7006b35edf5b0a85b44d3d78dfbb476861997714330c9c5ae5e0027d7298a64b62f2523670c618051629c9577abc2f456eb0ca33fc86e94d910d186144be3a886230cf3566cc09c2ccc76719bc349cfb70c35b24ea6b4bf1c0394527a529641a2b45b60da3a976d70012e48b5df60a7d8382ab149760cb5579f0673f78a52c01c8efd1a667d86635bf15035ac32805b56cc9a1cff506ca38b3df7a3b860985fed84b2b4f1c7f3a88122630f438c565660362a90887a9cb55090cc448c9088c6783aa890cb51ccc3c8cc7c097d59808f06675e1e826869abbc0644a612d471d5c106214abcc1115b106ab3405b1de14c664a773e6e5667d8177ed736a967710edda390f0b105f9c5ba3a2a61912a2414397030022035c533de16c634a799f2b72fc3112071e7aaebd1636a3603971020e2f90fb8113387ca17171b39104595e5500b50c99c37aba1fad50fed567d5eecc00db3ac14624675c76846b42327b9510ddb882b24be90c9661f5c46eb5b1991d25920c78f35807ec55ac2827776a54ac4ee272b469ac65aabc6ba199dbe33724e5866e24a8058d5908e30bf54325745907752d324490b766f6672c4c8443ff7647dec597276135a4789dbab39355175bf3a63ca6a359a879d648c0b388270680781d3e732efa5c85f1c020e4384875954b50403a4987ce54a6f24c83e541491b7d144012544b96b00b933c51704bcfc2b20ada6c481ab32d555898174526a266f70b7939054a88256a59c95a0ec2501cbd45f0ff2ad418b82ecb514f7ebc3fc33647f5c43c5026fb547a33bf2642c9279dc39ac6012a770267d6c947324c6d45b65393421bf4bd7068abb93ab3a36081a303cf37b90037749a046d478b6481b87d7f462e656db85d6046534ae44d82b1cb737a0194eaac814c7b85493fda268813efab5204efa60f78bf81d320d01ac09ac06244f7afbd2d80fd356d9 +ciphertext: b194cfcd01263bba40476580d27f88b07b884d31221bf0e63c7951ff897d292c0fff18238fb1c563280953dd81591e55830ec1430dbae2c77a8b116679a80cf79d651e7ee9e820ca0551511f525df28319be43fbacc67e58e3617852e7fc9933d49826837b88f18474a71710e58a5d0ace606d58e596d63843762964e98c56861c20cac9deb2f4e8ebbf5d522e6d059721d628ec00e988043587b4472d630dc65a73ca4f218e0bb8045688409185183a6c7263c6cf90e00b1016c70a70ffaa02fa3ee39ed539387c67b92a48d5c829aba6906b82f322db0b632b1e557f9af22adb324fa555a44caccef691a57fca147707d973dc9f4fa73ade6bcaed8c7ccb789162a632fa1c9014b91950788d6d6c3019d2143c376ce025726c3cb7451f506784ced9baefca8dcbbb3a52151611d8a08ff87fdb67d9b5e59e78df8cf674cee8bbe5e4c513089f6a91441dadfbb12c869be7c805a650b62407dedcaa5e4bbe7f25cc654e75335016f53e5d73046358f82e457c2e28ac678ca8eb67c25b87e47bfe02bf16aee67d99f6670560ee4a4a6ecbb0c85695c3d89b6448e02b47aedb9901ba5406711f7583d3a9ea1ce672a06a243763855cf17f900136b90b478c4b4f3ee0028b5608fe2ae58083cd079dcc47e4fbceff2340bf87310278a4eec7ef794b576447b87d991d2164815d05b93b7d4b1f1aed5b536dd57a374312b801b3dbfa9822d9e381ccc160653c72b1c129ce6c61d94bc2e647cd86defe3210ca3c31501ad31aa38ae48c0743360edd1b88d6dd6981657283a4f745fe69949e1b402903efab49cb71072280e75b1ab271aa84f9ae18532e90eb21279a8c11a4e3539b0ac7e5cbe6c1eafba4969a65ace86c355c8d0d2e884eab80f3073e6c26c8454a6ec77961b02018739fad9ca01e4963532450e5f477685c82244af62d58bc3d932b2c34bd30772a0d0ea939f7a6f609034cbf27aa308cf90efd2b3baac238b01bdaab0b5f6970bb0ce8cb0154461d8ec9239c4db6cab7b109d48695120d9ef3e75977205c7746d1c2bbe5a4bc4799e62ced8b5e4d2c924aece66c7e3c93859619c4791b10adb6e6f19cf0437c86cea08e3fd1d8dd35200598f5740461ce79d75f72b6e1ebbbc2ef5534eb2a76f6410c9fc338ee0ed87427df9efcd06df7cd29f4cd4273f68c6bb6d22c9d511575f25ada1ddf2b497537fb2a5fc7b7370c741a355b5cc6c19267d2d14b75b3fc6797268bff49c5e791cd085abb53e309f1f68cf25a6c10c53c2b7522739f763c2efb08c9bad5ea5c4ad37dec829fce7e0c1838c1fdbad2cdf2e9ca493f78429e2b1cc23cda79ebc3a559c06c771264fa69b42985bb6b51408ad7ee0a5f5f97514ce8505b1e9f442d3a48038d7d258a98fc64a2ad5973dd69b88939bf3fe7760aacecbaccb546dd7fb0630194a4456e214d931b9d12174a9f386807ec46683e424dadec6f86e9becce6ff2627ddf9b65098a26844cfccc30b9a822201d90448d81189547e9d6383e392f661a61b9bce01d765cecbe8ff6f31b9daa9a83141c7b02f993244c45b8262eab127f94d6304a375406c31de7cd51209e64e3172caa871db3af0dc3f7c806665407790c18f533d7dd742f43961e55a646f6661936eee04d489e9adc7c241597683814d222c5addae355666deb5f118387b4a5c4d496c856b001243113e9ad3d099bdd50fd177d72c86c1ca9a039941dc845b6355a05489ba51b7c0d7169883bbdd89d2a3afd97d932f6417d14c7d48f1f3dae337d070ac8d297ac3dd4886c3149de9e1a3a082f1890e01ee224bf8cf49e0fa01d5cb9b81cc4b1763e02b8fcc27231601a6768a55490a6ca280d78999b5b482fff4b78c5cf2c20512bb02ba980b50d138bd6fcfb42e055b7f93b814b3cad013c38282c25a9beff303963c33d91a699be48b6754087f80d39c7cc5d1fe3e5b0a0878d94494bc933119c0f5562ebbc1fe7b6d68df2ad51ea2f055c045b048932cf6df144db0dd8b04f9787932a13e91ec19871239a2d650055e8ce262c2aa3caef9a7f487bd7c53d47f899b7dce9e99c12a3d4276e7988950d72e7a7eb099f954311b0a357ea77df6e8650dfb872fbd64dffd5426485b9b60058af70396298ebe82f0cf8f2cf7b4fe82b0be28888339b09a13b9dfefb41af339ffe33f37c539c67f9d15047acc6de9ee6b71eb41d2bd7e04fe8e1704714f0512 +result: pass +shared_secret: a51f089d627c8d7da9740aa9d768778124229c4ea9408941ee04a1940c1762fe + +# Official test vector 99, seed: "2a6f7386b815366f572aeb6c79e272cc21b7095fe09575f18072c9d677da23bc9c8a4bc393b7524604d299bedd260c8b" +private_key: ead08feb355828171b57c7a2c7328d0a736fc5b548308a22b8672c19c820192297e4762a8bea6c048a33c0248676f2bf0b8393b34667de1abaec665a886ac369320ce3188f66d6482cbb184ca6b189c70c531661e10784f4b5116ba5000d0b06714320d8b72ea88621093a0338e5b628f44194925219406517e36d14096b2cf5286f6981f8885efc1ca4074b2d5ffb118eba8f1e7aa83dc8ac1aa9bad3b5cd257465bedc943fdc9a88915aa573a2ff63bbc2e29abe33cd919bcd725bb24486b847f2cdcdf36fdeebc79c123151a02a7f4a42851c0c56e08cb5b6cd34309200e80e9344a229917dc5231e1608115f6120dcf177da2bbffcd8a389e0623c81baf62a3033f99ac0027540c93d2071380d5ac60d894b85d18b20f21aaa5151657b34d5b125557832fdb09dd1c5bedb2bcce9d3c71e742923ea341b1657ac7908ae474cb7340d2f917513958ef6fc9bc4997a9a91662300a610868840c7b868ac0755e0a3c16a9b8f2343c2308e5e256ec7c60811822545eb20c3b8077ae771bd4313208584551cc2463691ab1ab4d5c112fe951bc0b9c02e867377dbcf41114d1553912400d065308456c1314641adf2038a8625b6311c3b0f98aa1ae37caf188f4448a6b5a78b746a0bcfba1ea2016d34059a3dc34fefd9261d5308b4e03c5677895822bc96441741865ddf787545b80c509259265976f187833959229cfaa95765a41837b210661a1e06137014b08039c88be27b9d292ac3969bb9ac396fbcbcd3626f3ebc78fbd6462e673cffc06d490b7dee720e57130acb1a1edd9c4e64a2aaa2f92411d489c9ea00b68a7d30d347714059487b8f837c1bb5070260b2521642cef747c602398902e33c6022aff921a25e941955f81515a245f6d717d048a307020055e988d760b141e23a16f767260877b7551e9bc80828626829f94e20c4020a9a2688d1168ca5c3a9f752643a17237ba623b79f144a118f5cb41f466a27cca78a208815538290b8ac4b086cf626932869b43e4b5477834606d9bf8e21295d6284d0cc72e64875cf526b8c380731880dd00c20fc2a31496274b94aa87ad54de79aac54995c951a1371da09770b8446aa1e40b1cbcb57ba5f446fdf1260e9bca676dc3db9a24c5f99cc300b7b08c9abf620bb03e75d0a5b872bc79cde550f8b243940737cecc136918b61adfa167553a005e0c2fa3190a895c2ef4a53ff90a75a879cb0e9855f2826ad7a9608579606904411b25ab46c6181203756a93c7a9ba7c2d3b862889fbd153a394791d3c481fb64aabad314c7d637dc43bff1a6ba7c031698f245c29294a533700145a904b17f9f30853090a0f68574b2b4a095033257d205a4e59af580b362a5be3c0311abb22e665c9558f29ef456cb3aca8d3a149a01118f7ce93d87ba57a814cb7e7c84dbc614fc2614ebe6892d6037df49446d135a6cd05d224786d79ac87417626d831134b95d129a42bc4663ef09184c53c50dcc9d2dca8efc81254aa76a8e8370bb03ca7c30124d5c2247490c03488484cc110c9b1233e482899ca443f0a4b44a6fa073ac87e82688763ad72bcae0db87b1a5a629d27f8aa2b11793b47c82af1486c97e41b7aa308e1a23af4b68be5c849625224aaa0cafcfc3a21ba49e3ba168d16512a5968d5c0222696649d7674332f884f31259cf9b477d1445eac17c4b11afd2fbb6a68aaece5a47ac5031e5457d32cc2a601b6b91257b64ea7c30b6b32ef7b949893a3aa14ca0d1a153b50bba60398cc4090a9390f714541f34bb4c93a81f734809cc86b8fab6be5539c9f6a968ec207eb577b16116169565b86c21561936a467a435b88081e71925576350cc964f5b37fd73c421e7a076703fc308947cc5a3f2e21d328b8c23e32fc8f5c04faa6d72395fc7c8b2d8fa72c6f35c9d81271ac34c0ca2685b5c5571f7b9b9245133c58b3bf155e6668315d0899bac05dfb0b8661241f22772dd290bd963087cb94c9fa464788b8a87c637f327ccbd31a34328cb58b5c7f95aaf9f51aa5bbc284fb26b40cc438843a6ac41c82886a2236734dcd81584d8ce18184b90b22e62296ace4191efe679d4d52c12351e3d41bb2d815035d62380c45bf078025d4a12885ac092057b009d6c3105ac49641cdfe0c48bc41a6f14c0a5f31423ec378ea2098b48557665cd15516d767a980e05ba44d761fe17355c0aa302f3826dd25da4ca4d044c299dab608da967c1e253ba77108df51914a15541763f737a89fef62be1f7b4e1b8b77eb719a84377be0081f7d71a6e881e15578603867855d87ec04b5f1f133368e43ec6282fe5eb16935a04ec9916caa90031e40d98b0a8ced98979fa7742a20dcbe84c67223eb6925d7b1b12e07a47677b56e9916029204e91408635eba66a6a844de5ccff6aa63fe15190030b8771101b456288b170bb117584c996c8515262c684a4718f8b369011865c756827d3038d62355f4c994a539815f4d6b6dc9455f4d7ba24501029170cf1aa3b0944574f6642c446a3f121cd08c7bb67e7239da147e0e9c9b5c57b8f2182e00488341994f620c99978c818aba5e4516efe23690636cabf607c438cc288e944b3446b41a264b88c6e0371a08a1c02703c21a0bc5d73e6b95e7b5fb87c6cd43415aeb26f92abac0371b9a7a70ea51c88e12bbcdef7c3cd3a4bcbfa3bb83606b25c85984021122400272a616fc4071db20560654a7ca099a6d0754c43687d9657b1b816a04b8d4cb63d0e3765e228890e0907accb4734cc557fc96ef7fb6b463cc2fa5b73b7fc231f230028201483e66efdd4570365865c08028f96609377703a2300f7e1b9f4939475541e0cda2527b28aca7374d1827206426637965870e9b86cbc115d9a04c0e73e8b7a866c277da3c58e0d2094fa285e2d05af7ef64f8ea6146ec4321395b7f30a6e52171ba28984b1e49726b48ed259638f6bacbfc5c2a4baa3cc391f0be917f7ba3a05dc911642a63db03fce58bc6ff92af7616569d04415a26eff8c271f9921ddd302787959f5397b70d7a388f7569e010cf26b67fb2c3a2a52714f5666b9726cb775c28a79a41531213e4766c9442fa06498f6d5a1816b7338f9afb779a40f2670221bc5ef319786762fc78b1a25fc9db8e362f11c9f374b04204940877bc209b25ae7f461c40a0193f66a95ab7dcc80afed9402ab725dab23c1abeacad633c461a26790865c21a960d338a7e485cb2b42a8b0963b8689c9d4287643b8685a341333dcbbd7637fa2671c1048638a547815f07b255ac115c8bc32b61a369128c60076c3464fdbe2c7c0bc5ef1e383ddd2ae8b0457410c19ba1c486b702a9048049e85cd1e7569eac6b3be8287ec9c195c3bb0b4f28952823832c55257d05ebd8a8bff9c372095be66359c9ba7384080a7acd9567db7905c50c36734cec7519e8e57195247b48a65a1e34cb942d741d88b429d226a4097beed271dcbc8a035606e056a89a8487197039adde30f78bb17148a4f0bc84bf1dc0d9057c97b028296b9260e601ed1a675bca781c53bcbd6866b4ae108d059ada7c6b8615195336c2df2e71ce97528378b2fdc4b6501f2443fd4b6248429b67a4624769236e32c12e3116ef66ae2554f55c7be15319e803b8ce0089d3c04b65ec8340c483b2ae4c2b8ec7daa91b39270ab7ec04fee436e1c008f61c46fa854363287573c50c63c3b1f94d52feeba13aec5c926257592904b00ca8615469df5539e8f4c627b11be02e96d17189a80f37da5d08db81baeb7c34b5c58ab3ccb25af3c29cec9364175b6bb4a04b5958079e18d5440bf24538598c1c548327980297efe531d4c14a9360b8dcc173f6536b760b2a6fd59bae262087989269c884a966c658017ce65d14519a2c61266b344f6648abc0a657580130c6fa0f6565d8100f0532011945c3fa296de184750aa931582a90e6bb9080971cdd6b470f68db4e529ed61bf97f62bfac5cb534c1570db606cf0351e1866d7e199dc329d70316d7fd849d5c296d76a8db20306bbab609e7a9ac05c7896b150d6962d2466158f8697e532901e421d5ec00671344640623891a9221ea17ebcf6b290dc54359814a86658e2c0159c2374e1dc5f94dcb30ce01f3633129274585e304f0436396d66660f81c4cd273b94a3740f9c2fdd081bc309602a2cadd82aad35a46684547d01c74c38547176113a697b49e6c98c1c017b25f817e19c2a0302d083dc5c74c4c38b6706e94c10d178369b375df9c118130824fe99ac49f24a682ac23de429f8c7a6d1a89c36f82f0a47379e7aafadc744e1f20b9186c67784c3e6b823306896fca303baf61309cb498a216431862f00198c26ab6938487dacfaeec6906ae45303ec7dbc2889a8eefa511b82609b980dad54ebb3e7091e9d42a9b1d5b6521a7a4527116aa7c38f6ddf99acd4a7b9837317d99f83732bb7caae77e0f9f21eabd8c0c6eea7767f4e10fde5c2d79b8400bf96b19014b457ec21 +ciphertext: 2dc32e31aec258d6463c8b3a5b9464fad89f1399b6464d5194a8704edbe2fd1abd7044fcc1fb2781c4ee362beaa35ae6a1f8b37ba5d58610092cc908ed65ea0aea8b393781be6277d0842fa27f9fb97b61b33eda5e50c1254b0410fdf9dd42306694b158bbf9a2acc025ba0018448e4adf4a1c9f71c7086750217ed7afcd3a2a2651797944e8cbfcbeb6e9b67d2ed65dbbaafaf3bdaccbb12e17d90e91e8cc1e0c96e3ad6387d95e2ce0b74ce9238c400c75723e8100af62a9fe53732f256d410f16de8c88eb484e45062c60d39fed5a780af738d320097139d4f26f9f39b8b1e777d5d0eba2bdf08d7950ba817522ed34c4774976ee6210f61393cc3c3d34da2ae3ac491db3c2de20b223bd73ce0c45e4743996e3ddcf286d7ac5e2c9b42f23afca77956e39c7fe65246863465de548f754fa5c07ed6bddaf138b22fae3b316dc5571b9a452c65fc01d9680cd4a6f04e69cfc885f80d1850994d85d4cd13afcd51ce1470c4c467442f845b5904b54f53b6b9150689fa40670f00b78f1a40735a2a8c4075520e1593fa8f2624b1dfa86b60c37ef09d97cfc4ef03002a3cd104f7399204c5849a860bd2685091364aed298b73e44f414eb62d093317b710da0e3380167aea5a87c071495a57243542f1a8b1a2aa433b25a9778f3224d75a8e5b913feacb83ec1ce53e9de2d53f6ccd326c463c0b82bc41f1532cb74d95b820a2cb1ddeff87393d219ca1c58a6bb742fde0787708cddb57fcccbe523c90674857074b2875cd961e8144aa6c2eb4f33972e695441f659b0c066bb7bba5925d26811c794d4a2c2c9c5f167cc92d8bef403151cc1f27fd0addd2a1297a07c5f47f9f8fbf72d0eb08158993efd5985970de5938382f4b504dac300ba12f6e733fd8f3d5fb26ae306164fe0ad0df2ec13ee8958ef7667a88d36ef9b7a521d840c69e208eb7df5f862de630c74c1ab65909d0fcc6093022d7f475a2d095801c1b12884b9f97643f714865d9752e25111a5c29ea974ce2532301bc0920de36d35abb364cadc0b3941034ddf459bde80f28c1178df12f50047b73a7370d380a858430e0eb7a3589bbbf578559c94035a6aa69b5dbccf09d2ad755311c97e80b75086462fa35027d72f6205e0a4b8ad20c5b56f91dcde31aeb8937d23939115ae4b76833dd5265e1019f8126069fd0da3059e96df4209efc730d4cca140076418c1f1fbac6b6a5422d56cd2d9eb16fb23d798021aa03292f34a6d302e119e4b3aa104e4856689dc10685c71ee038d02b8a0b965691c46b014184e20497f05d46e6f955b20a67ddac8f6d0cacc5f1e0ac6e826338026b58de71b2292ffa6d1ce333d124f17735fe21009f46fd2009829fedb8ee018e6d773a0bede891cd7ff9acbbbe9ea5a772850d38b89d3f423b0eb53458f28bdfd57184f6aa830307dbe8f8e9acb86dde8649115e0752dcbb4ef99437c488ca7dee225ee999ccf8176e1cd8a735817b927baf1e4d602c37815a086f74f27d318ba91c0bba5d6c52a4fd3a481373575345e660db150505466e9513224a540c33d9713b755c82a67dc3482e6ecce3a46dbc189d9a71a7f5feb091ea1e8b395d599cf0ae5c4ed6dfde8fa12bfc93de992e19d75434ecf158be6a3a22607b4a54b702e5822575c28ddb1a51500c5894f3d01d6bfbdc895bae212e8ce78ae75a38ad93123fab702a2c3e64db8bf44d05143aa87ca54c66fab032142b9569dd21f74d67148f54d513c991362097ed325953f0c621c42968806460763c211b4d8b383a724a2d53b7b7ba72bca0fda2ccc816bc74935d66b408e174994d856a20cab75fc8a0ace390f47c4f26c8a513c21fd3e8ea5d0ab19fe2547fe4f1981ea9133c2d9aa06580369ac4ce8b95c78d57043dbf444daa14c0841d84c2dbf7298e3df9e21d771265c4471778d0522ae99ca9c86e4cf568c8e18075bd6c6348455b53816a673d56f6fcb63238f653cd8dad471721b272585b6713f223afc43d05409a1e032642f8f653304696f758832db360d754666e1bee5a33c6c52027fbcdfe51abd5e4b3c165d219ade2a527ebe6d77096de845e09316c9099c7605953a31dd68b936bc96144c8120e00dc00300667fb8471dcbe770f72a5e3fbffceaf6edebfb8d786f7830f7aaf48e1cab9372ab7442176e8e9eb8d71df0001d5fd4afa3f4b1179d4f50fd338c2f15bbc27c3419a931ade3aa +result: pass +shared_secret: b00f65a7930ffc261046644203b94c89dfa7334bb011a4ba896c2d547d96637c + +# Private key not reduced +private_key: 433a70ee6950f998facdd5a4792da6a8163709fd4d457c779979b840fee72257d1490830386637da43fe75beaeda1bff81ca4f9cbfc2b03bdcfd78dc1158ff335acf7c9e39b5b88a34e3542c6861377545983343ce8f9414e478653efe78f855f52390379acc3b6f95323eb63ee832adb3bf4bf58e247349b6ed97e55abe498be5982373ae83fe0439ac68dd5c7f037c8a739b1824de144c851dc9611f4bcf04f3a2094ce97bd63bb5f6e9020d545f08eeb7fccddd9a324b0bac3c3cf382284059fd8b961952c0a4d19d1dbe37a53d5ac794c11da9d19fef160f7a1d4e9c3d7ec9a2df8aee0f597ab79b875394626ba39aecd90c3a90cf75871a75f75fbec5b03372e14aea24ddcf9384e1208dcc83b9d5622b83fd5e3971ec841afd880d3d67633671b09b5456ab6057936d19a4a2a267911c1dda13956fbd493821ead72c04642b1cf0da6cc0d9d864a39365dfd64f10187825fa33250749cccdc905d7b1ff3cae251fbf86c8ea817b86bab3dedf7862e5f6bac997f6e56b3ced6d664cbafa7df670c6ffd7dfbcd3824c89897cb490eaa7663ef22c96f05169c91d3f9c4a184d798feaf836ad4ebdca78464d427e47311fb7d183bafb6f7585c64be48d9d7f7dd4cbdc79a556df0ad677cc7e65134d7d3b6e9ad09543b73954757fa706c3e7a509be5d96efd66c7d0ed94cd60d4796ce8159e3a33d7987125f5f1635a68438e72933f49635aad13fb9e56664bdd48ed24ac75c6468d29d3e481d86c6fe567e93ea0508c53973f591ab577e3f4a834f97268d995086ed8444f88c24d34f2cd6c2ddaae09a71c84da5580ec28ff8449affbb18b6628caaa3fe75ac4eed4c709e3900d86c891f6253ae7c4e3d3991ebd2882fd881bb88478aaa9af9bc53d3729843858fdb4648059cad8fc1a10878ba39823b14ebd1ef58487b56cc8a3221cea58bf66a172b5b9a0c632d674eae885a015c4e37cad7378dbede7534f3e34b615dc86c2ec3c19d941f23b7f683ee2beade6ea464687ecec67fb98dada1599e9adbeb84ce585ffaff5ebdda6cb7fd7a909ee2336d7e7217bb039babd0e9e934a8594059c96887f3c04381bfe6f7a115e7f5f4bfc77777aa2671af1f4f2b7a5f4d66e4039e97e6586fa9ce7e0ae9d781bc7bb19a772d5a4eff3fcac89b76c42a5ede9bcc21ce898c08a5b1cd7e479bebbd2f6efbde5f2ac737514b8c6149810789f22416537fedddaebbe77f9d3ead6b4ac42370af2bef50ebafaa1c6e647bbaccf7fc7d0b88afbdb070cea45457a9c187579cfe84579cc351c43dffa4f605aa5604fc85fc5583f7fe496ff6ed70d6cde33f7fef7e3d87ff9b3afcbb54e9a92a33a6c1ea6ffb3d9567bd686233c0f4bec3144890e5fd829b6d99c5749cdec84328fcfcb64a7385a761d64b3a23c489343343b987f3ae78c7d805458e26f0f039f89779e704cb76e4bdb281a83cf64490498cbcaf04802416b33c565171d772d3b9354037587629ae14a5c5031ac3677ea0d0d9ecc0b4cd69d8402e33b9bdcfbbaf6b971f3d3fa137be232598a4999bc11f574d8e651b38b38396c1c365303bdf5d49fc6b689951a1cc4c6007613065495f97910f9735d4ea4e442acb2fabaed0eeadef0667bb5ffc955ad5d1c6e67a263e1275c6ada8385965304c3d32414d542cf5a451bcafc74788be3b9b9fcc45d489de2d7335c61ae4f0a49d13053f2626a627dae9553cb337afcb4a455d8ef398959e472cbdd51ef7416e0bbf1b7ed8fa07c161548e7d6f331ae5a2b4e4a108b5e093e3e5092ea2fb547171aeb73c43c550c6557b4d48a59afcd78af44234b2245e75a0897d516eb4613482dc136414048c11db37ebeda5df87c19314b0e82397a0d338dd2e538af36149d93f8b2ae1c53bb5def8b7a2cca3362b7fe4ae408a2547e219d58c673a7566c26123a6d8b692a5f33ebddbf624b79d877bce60ae4e42e83faae8fe9a0d553a3c6045ca329fea4a506558c59eb6a616c6fe5ddb42136f44dbdd0257650829d18d3c568ef6c60c6c409f7da829287109ceb6a4e3ff76e5cc4e1d4b02438ef7a467912398ea9c7cbd9981589a341897687c5e6a143d7d67cd68c444b4b949a1751f413315ccf49b99990d34b5b8cfdec4a60bacee7455aafbf3a757346990cc32b0599ba217a6c5fc39537911957c125148a87f41589cb222d0d19229e2cb55e1a044791e7ca61192a46460c3183d2bcd6de08a5e7651603acc349ca16cba18abb23a3e8c330d7421598a6278ec7ebfabca0ef488b2290554753499c0452e453815309955b8150fa1a1e393386dc12fdb27b38c6745f2944016ec457f39b18d604a07a1abe07bc844050ffa8a06fa154a49d88fac775452d6a7c0e589bfb5c370c2c4b6201dda80c9ab2076ecc08b44522fda3326f033806dd2693f319739f40c4f42b24aca7098fb8ff5f9ac20292d02b56ac746801acccc84863dee32878497b69438bf991776286650482c8d9d9587bc6a55b85c4d7fa74d02656b421c9e23e03a48d4b74425c26e4a20dd9562a4da0793f3a352ccc0f18217d868c7f5002abe768b1fc73f05744e7cc28f10344062c10e08eccced3c1f7d392c01d979dd718d8398374665a16a9870585c39d5589a50e133389c9b9a276c024260d9fc7711c81b6337b57da3c376d0cd74e14c73727b276656b9d8a4eb71896ff589d4b893e7110f3bb948ece291dd86c0b7468a678c746980c12aa6b95e2b0cbe4331bb24a33a270153aa472c47312382ca365c5f35259d025746fc6595fe636c767510a69c1e8a176b7949958f2697399497a2fc7364a12c8198295239c826cb5082086077282ed628651fc04c639b438522a9de309b14b086d6e923c551623bd72a733cb0dabc54a9416a99e72c9fda1cb3fb9ba06b8adb2422d68cadc553c98202a17656478ac044ef3456378abce9991e0141ba79094fa8f77a300805d2d32ffc62bf0ca4554c330c2bb7042db35102f68b1a0062583865381c74dd913af70b26cf0923d0c4cb971692222552a8f4b788b4afd1341a9df415cf203900f5ccf7f65988949a75580d049639853100854b21f4018003502bb1ba95f556a5d67c7eb52410eba288a6d0635ca8a4f6d696d0a020c826938d34943c3808c79cc007768533216bc1b29da6c812eff3340baa8d2e65344f09bd47894f5a3a4118715b3c5020679327f9189f7e10856b238bb9b0ab4ca85abf4b21f5c76bccd71850b22e045928276a0f2e951db0707c6a116dc19113fa762dc5f20bd5d2ab5be71744dc9cbdb51ea757963aac56a90a0d8023bed1f5cae8a64da047279b353a096a835b0b2b023b6aa048989233079aeb467e522fa27a5822921e5c551b4f537536e46f3a6a97e72c3b063104e09a040598940d872f6d871f5ef9b4355073b54769e45454e6a0819599408621ab4413b35507b0df578ce2d511d52058d5749df38b29d6cc58870caf92f69a75161406e71c5ff92451a77522b8b2967a2d58a49a81661aa65ac09b08c9fe45abc3851f99c730c45003aca2bf0f8424a19b7408a537d541c16f5682bfe3a7faea564f1298611a7f5f60922ba19de73b1917f1853273555199a649318b50773345c997460856972acb43fc81ab6321b1c33c2bb5098bd489d696a0f70679c1213873d08bdad42844927216047205633212310ee9a06cb10016c805503c341a36d87e56072eabe23731e34af7e2328f85cdb370ccaf00515b64c9c54bc837578447aacfaed5969aa351e7da4efa7b115c4c51f4a699779850295ca72d781ad41bc680532b89e710e2189eb3c50817ba255c7474c95ca9110cc43b8ba8e682c7fb7b0fdc265c0483a65ca4514ee4b832aac5800c3b08e74f563951c1fbb210353efa1aa866856bc1e034733b0485dab1d020c6bf765ff60b3b801984a90c2fe970bf1de97004a6cf44b4984ab58258b4af71221cd17530a700c32959c9436344b5316f09ccca7029a230d639dcb022d8ba79ba91cd6ab12ae1579c50c7bb10e30301a65cae3101d40c7ba927bb553148d1647024d4a06c8166d0b0b81269b7d5f4b34fb022f69152f514004a7c685368552343bb60360fbb9945edf446d345bdcaa7455c74ba0a551e184620fef97688773d50b6433ca7a7ac5cb6b7f671a15376e5a6747a623fa7bc6630373f5b1b512690a661377870a60a7a189683f9b0cf0466e1f750762631c4ab09f505c42dd28633569472735442851e321616d4009810777b6bd46fa7224461a5cc27405dfbac0d39b002cab33433f2a86eb8ce91c134a6386f860a1994eb4b6875a46d195581d173854b53d2293df3e9a822756cd8f212b325ca29b4f9f8cfbadf2e41869abfbad10738ad04cc752bc20c394746850e0c4847dbebbe41cd4dea489dedd00e76ae0bcf54aa8550202920eb64d5892ad02b13f2e58626ed79d451140800e03b59b956f8210e556067407d13dc90fa9e8b872bfb8f +ciphertext: c9bead6b0c1114389bd4761c73ab9095b5809daac9f659bb564af226173052a4a3e7f2e5fd47d2b02aaeb5189e06b9f4ae98b619cb63efbdf3989a94b36e8ea0d700633b950a0ae2a78ed92e85c85c70e13e626fb263fac9681521c3ab22fdab29173c9616a2b037083ff7b2e019b5bcde068fac257ef8f12798411693c1bdcc65420997a513a8a69502620be8e4ce7362e412a76cf51c1f2433f1ab64ce0e5d2f56d7c9ade994d0e35d0aeef3ac515b482437664d8c1d25e5a5507cf80f970d3ea7226aacdc457cbf88a0560aa35bb2c5c455867e2159910a35810befe3aa10eb04d8d57147cb8f66d2b070bac43d1f1ffdd57a9399951f64965727bcb9f66ad42309dafc799c1c540af1af93eff68a86d61f5115db662dee7ac9a362677762b6a164a0fa0a4d859e4b8c8dbdb4e183f5e6808fc52229650caf7cf3e16de3d895d148c35448ab8c2753c9831b24bd4921497eaa192565cabfd83c0c68dfe7d392abf5e5e6f84bb9f5af4b7118c0b558105f9c10c9b6d70682e1de6e0689d7106a6374bd34aed7229e6cb356f2ea65e680ce7b1e2c3704e116a38542826e8a001141baf2e34de37a03040986d4c0cd5d57f0701ce930986fd9525b58e2e59f45b8dd04c0f35b0f47970cc67079618eb9e6d91e9b0f8c6d2e165cf448a2c1ebf71b6537e0f375185dfafef698b6239bb35580b315bcb5ed408c357f192def89bc1b75cdd6aae8b5faf0c3e13803f6bdfa76fb407fcbda790c329b3ee42fd3d3b03bd5003f0bc432f7ba39631112452dfd12140433ff8980eb6a526ba85ef99477378b4dc76635a5cd5040e43b8c1fe4ee5e158e423bfc0c893c1d5613bed08da719c9073184eeb36fd357380fb1873d8cbd36e2255e985b1b76819743a6584a9b3a580996c9c2eed9bbbfff78a6204b5e5eeae5f4efd2660078b37f0754ab5da862e666b145b5f23f3d0977799929dfa2aedda53d152eda1d0d0e4ea43f6ed889bb965eefe0a7c685bb36770eaa874242c0e229cf6ce56defa5aeae64d0c40dda8aa26eaeb31458f070a3bc72e1619ee9b5f642291c56df5b7e43db6c802fc74f4f3f9b5c0d355c3aae520aa31229d12f3e7cc5d48e691191a36b283765f4133f0ff1fe2f01c6648b2798a74eb5d842a248f524a7e7f8974211297b44f0dd19f386e86be6ba782de77fde887226f37a1c77bc5eddeee5bf46b67fb7478d559865f262caa84d64a8ce59e4df0818e14861526acd3483600f3dae7959d35d8181ca6a81ce791be00752da7759446a2cfbe00b8248b93491debd520220b755416d2fc6b7c8af2ff75e5bcbb8e7537380a5721c77484957a69271d8bafce0f166735ff869232de5d381afbf0e44d69172b79a35191949de09703b94222b13c385c6081e6d2ede1e57fe184ef8f60196b9a3a7b7eff7497191ca8741b5a01e79cb69a61142e6f5d080fbb3e566f79e146f75c8a1097860841b4747df604dba954e4a8d9e0dccc1f609d05cf8d31219ecd60c312de684552f09227cb829291c645732c5f5d4d711639f42a23080aa34fe1420f219bd6bcf4e3b29b9d02293b2da81383e0a51d2bb186c7b0a211a0cd63acbfc0210401e985d436b3803d5601c24136afd1562522e45b457cb439178be4a87cce40346d34ae0f3c39103c8a3ebc9c86c8db8fc5561eb0f3a143d4e9fe93a5cba6f6fcae5650d3f43d2668a5956c922893b816647ded0afc052a6c3d9d01a3d3af0f1ba807ff10491e131dc15e165cfd0650a1f2c313d7956141edcc61cb90e9e7abf2fe35fc9dc1bde88939fa11f7bbe3eb4d8ffa643b074d74f45113586e9bb12060003d71941f2da098dc0e96cad3255cf328ea2d3308c1f4585e89c613c426b7e798e1ec4e98fe6c71e7491f5eca0cd05115861bd160e3fe73a58a026ba538e0e256b92f1d7a2497570594856860ffd06b601ac575592f4ac612b5de7866042123ebc60c55768e3a7600a3260551f2bea22bbf6b6c8246e80f9125c4bb9db354dd64ae695c15f5071f4abb9639207cac7331b310f69a05f54b995de529a023f033b055db95287a14ba30a7cc526bb724c417fba290636a996f286e3e9e939e4fe1c398b5c6599959d0b4445a327ec469a1653cfaea7552cecec085ccaa68938ae4ac3c424f7e480439ebd2c992b5f6f95ec244b657dbdeaa9ae110aaf4d68bf4e27410d43ceef3e88e9c717dd44c9ee +result: fail +shared_secret: + +# Private key not reduced +private_key: 1df76d46867cd8c5b94b3666ccc8c368ab45c71abc8effcf74fb307009590238fb41a698b405947354664df4727bfe6b55afd932a6f3a33889b41747d56594b94fbe8704dbabb37bb457c935c5a2fd48d1694433fbb545b36bf3b7de7a8d9aaef6e3efefe99d8c8cf030989a2869d0d8fb78ed65c97428c25469e9599d406dc878b2a98993664fecc960238af32663d105f78bb1dd4a0013de6fcda258e8d3a00844753b8bcb9dfad335648f348fa359d5681a72a9ee982076e3dc285101499413267a5588bb444ee20213bf3ddcdefbe8db700bd9bbeb6067f6e7d48db804bb6a4e745a97cc8342c5cab52d8390147bf1b87c6c4430d8b443e46ce01ae65fd9c43799ad82aca969b827eb8794c3e55fd96a139496b9a11ea8f1afea868117d06e5af8406da035485914e9901e843013d36c36b353196ffcd6acedf78acab468336ff89ca4a787363b51f7c6f468d974507af45049c0ed7d92e7c9368e18c313297a93af929279d2d35bd89029fb50cb3772a797ea79e8d48db1752b8e1e0a36b42aff865b73a8b3a36d68446ada396bfdd08a8d35c40cb4bbc76abf0f40392372fa6bca942c4112c86eaec6da5493f6868b80af6a8f9dd5d6bf9474641b7032994d641a3d1c45b8df8cffb44de003f648200d622a3f309e96dfccb7ef7fd6c3834fcda0a4a589e4bb7a1f94a6aa9f85959e92bdb5424a61a974ce29d87c7c1ceb0d7ab80479de285952cd95ca160d97a7c6aba8c878a87b883d5fb2d076762fe4f4fd76c074873fb0ad3d0d98647e76b4fd99430095d094cf529b3b599d33692935ba09f4e5615f916833bc0c1383621dbc134c4ae465acf183da02ef61f2d3b1166f88f54573aa6cba8d26ee533b50c57afee00ad5676b83489b742d59faa675dfd658baabf3d9a96d967b7f6a6cac46bdc8893225e60f97c3db16cde48a684ba64fa34a7c982d93581eaa4e3bb0fea7b14f4c9a889b9a460f4cdccd9f3aa7e854b5ba1fa4d7139e32855e6614277a1efd4a6a583874be54f4e68151dc8ecb86b5f58842fe3e491e54f2db7b7059268030d6df4ec3bc1b37b077de57c3dde4dd5fa990a5d5da9e80b259cfd42d4a238f5ba215ee9dd4376e85d2b305a208a98a2bfba19ae9e52d3853acbbfc4865eee998c84649c2c8e7b9140bc67cf839c1a4938acdaefc3ef0ccf6b7cba4360a2ea0e31b7eec4335926788af54e280b4accae5fae014493d15caa30f46cd443463a3d3fb66d3f38fb8a7fdb1ff5ed98d28c73f0b74653cbe673340158492d75e7c525fe8dfea8bbb4aba8f84ec092dc077af3b170456f8d859831ecbe6a37c15e6c38d9d5b8ed8430ebd9982ec4f6c98f632383adeaf85a08bbcbf2e9947e96017c8bf3b89ddca66b868ca729eff3a8125bc103b5eeea6cabc6472a17f81de58cfbbcb319a7ab27d3a5f5c268bb0ac6587e7774a2a43764ea28c84a8c1b986b1b7f04fc6e3ce0d67ec26458155923248bf0c74efbb4c4219a4e414895f618ef928fa7275f7a99fefde6aa7a2e3637d1fabbe65db9dce36b1df2656e0284d3c5b4c2d789802c9751517ea8f7c31b66def4ff492cefc8c7f7bd937da9e02dc6a99493ba707f79b3fb6111f7f89b6b9412dbf59bfdecd7548009d63332bff4908499c5dd357d3df1a67694de351ff5cbb4eb553e4e5f3568542a1ef41a6ecc8045caf295bcb12c55861f7b5e525ee5f4cba28d5485a6e9dc04b96b6b3a2a2436d921bc4560a4c4df68a354e373386eb8adb790fd95a6479351bbb7cbb17a528dae4f0d3eeaebe95c86397beec61ab8b8ef913fd1bedc6690be303f554d2575e25e45bca0767b19fe740eb7aa759e61e485152b68d5a9cdc53db6ba657fa350e6fd9067d07e8745e66785949a4be88573987aa91da5fe01387b739415b0c5d03caa04089812c85829dd43e9c4edff5887561c7aaf65be36896f051be57e0bcbfbb659934466a3b26e16346e9d8cf855553b4c3934c905ede7a097a5b69ea7668faef355c58ad76a019d5b6474626e33ac9dcaa77e8a07bd9509f5baf27bc54bfb8890ad4f10f8bb4544f350acb61c349993726e4d85c7cc49c92e54bbbc94389673d53b84d88985beb2d6c335d1ddffdefec9a45a8d377638f954a5e23f56306f4486e4f11eed3d0a58408867fec69c50f595c938a454364cf10a4c719113a23b242bc013962f13421ec0686e32ccb80840749643eb4b5cc4182cee2366717cf77f97da296a185440113770b6f755bc596cbbce021e94306b1e4ae437ab7dbc29527142a9223a8a7cb269391cad8f70c6cf666118830485ccaebba1bda242176559904713c6722c413d5c2b9c2669d58138ed5b23506a71c6182af6939dd40c51d678639238c8c071384c1256ee6a307475bb72bc93976c8976bb89c736d8fb19580cacb1f335b97d16943c0706f78095408cdad77a9fe967c4bca738960b3a3c171680426528a21578b79b226bda19a9bf132998a2149c463932d630b0f131e8096be462080e6d17107704f3b0cc90c3908cd645268375056e6072425b51a46c27a48b9c0db67b025a58ee37b44794430f3ae6cc74e1673c2b1d4b29db5370f590eaf6165e5806376f6a7d4825c74038792683f38893464103d82426593f366f96b023008be21956e6be8a4bd612d4f85239d62ab6c39069aa210b47b37ca85394c19327e5303cc9c54a5c63aeb104dacf67a1c1c3142710dcf682edac82471ba98c81a552ad2541b7338b2a0ce41354ccab879f549cfa58995eb8c64a8b30b6f384ec2e04dc1a11ae04c967f744024d70da780516777a1b1715f22cb1eb3511f5c4c99ce577836489a0f813a99a622390b52e4757843c772f6e75f470305259833b3993919f3aca66563f3eb7375f5883cfca72398b049170ebf0997ff277e44501fb0e83d0c5ca6c701048180ac68d857e0dc5d24b1628433c737b8808c290839d42c6a322250e0c22b81b4c018260d288c47976bcb84bcd0856c40448ca40b723b8144837965ad46b521ec4b405c28589b8536621a10678a75233e2cd59bc6e03f49d93925c5bcc133bea39a7e21907a19840c80225f1f154c270a4bf0206a16c241bf42cbd351055adc8519d38fc9d3b976e2144909053c5843c36b7b247a6ecd04c9d792a6fae968cbe11713592b287cc8b07b73c334bdbcb91d05c7ae4e86aa7547b4cc6403504acaef4c6e5b758f4e261c7624337000c187648325f36ac8854d4a8a1c2c732a0811b39439340e23c33af0ce5090ce800070306834321b5af9e4be13b22ea6655da11427f995a115dc86cda737aa99078407b9f78b914e831a6bec2c85f922f972bdda971b66761045813a852a0fd990136840835f8b5a72c5c8e8a65ce8d3ce957b06698261160031597a29e3388a4f5a5f0b96b70481a2e5738d3a50189496c75a856643899947c955be8871e808030a5757d6b46079454b54d51557cca964379bca5a8191698275dc51cb164f8e508fdaf480031a28afb1c9ccc65da9ac1cdec625131c6630188ffffbcb726133ca563da640c76a6c24105502ea3c24b918c5b818121cc68e2f1b62112a41594a6359876b91d058fd66861b7633d73cc7226b8debebcf90fcc390f761360554acf013ad03911b49b641c73687f4a73f8c290a2890c02c56e2a6567fb03826353d87ea41369673e1f9b920b36203cc9aa464192d01b6d859307927a629a24b34132cbceca487a0cb3c7442aba47c4a077fbe7442c2a4221a200a93e726518830b11b690f0497ac0851a5b27ea20253065a9ae7e6567fc26500edb11346955aeb2d9c6c228f1644f21b34e3694c05016284bcaf746ab6344a10eec87cd0f76a611ab64ec86288c339294aa15233abfb680036d2155fe77363530c3ee0c4b8b74a54e9a2453ca081d01f9626867632870b178d25b831fd133a2ac0596e688652c1772e2979305c5e2a10949bf35bdc08cecd6771b7f659b61960a45054998472163c21d31024c0c24972d5b145608c1044718f60894bf5875a453d4a7c4569c63a2b38c2db6a4fb8dc9289610ef12754f37cb4dad3b66e135d1f75759622cd7fa03c4ba81d71ac9938c9a97839a12d7a4622943c381a048edb26c64926b3a807b644aebc9110c54b06d4ea1cbf6462a55b31c7f5202cca8b7c698d9559276a1a3963cc56dd26ce3c051167f299d80c3a8ee894f134567cea1032c845d79ccd95313f04d6459d1ba72e00cc604365a9c5c5185005f17a0397a559a0b28f31b41a5e0948c81501e902b9cc253f6eba88172bbb92024984fa99c5bab08dc01504556aabe8c81bc99c56fc771ddc85d37b7c50182345e189267934564aa9dd80bcdc25b127f1244763644004e5eaf06b095b892bae095e0ba7f9d2700a50cfb6fc18d6419f5438a0573693f421d3793e5ddf3d846678552aaddc19265946003271531cf27285b8721ed5cb46853043b346a66cba6cf765f1b0eaa40bf672 +ciphertext: d0f902d86e1ac0a000f40e508ecb36f575902e319cf05ebb6de2ce63e02b912f9cfea50f513a4167a6f8973a656720aba76c83fc8caf1b9b922233e0356c9bc2b0f6fd5f083aac09b965c01208019d4d0f458f321a07197461eb3f71a136ab7fec0d7c1c6c868d6b2c890f09019f5159fa21642f44b8c1b89b9dbc49a0a9d294fe670ba0915a78c4a5a234af77b925e582eeb1437cebdfd3a86c98abd5723bd2fdf6b54fd79ed0dd867c5ff16fcbfc30bd1b739a912aa87c70e7213a3e42218db247422423089ead4e87ba998da1f354a1d1a65bd8c481c67c7aded64ceecbc1a9bf413e343433ba93fb79350187825e984f6e23f5dfde9b56ae1fa50ebd1e6c6b0141e3b9be3a5d1502dc21656d26dbce6eac70a596f23824d512ba86069a2a28182bf71275cad1639e947666a7c71f04d72bcba3036e774a23e95216af23b19d7af41f8db3f725d937915c72591fec65e902b486f9ef294608624d93da1096370c56a7f340629485cf0684e9ac76609b1f3d8f3b89bd20b87ff3805af4f2c62014a4b3f7e25c3cd12f505048464c490363b40ef68da9da2f25ad691df7bd4402c9e2a210a4ac9c2e1eb9f5f787b876e88ddab57ceae57741c9eb633280995ceb65a6871b767bca78b6569aefa1059d16c90a6afea36f5bce1d6928de55c9241c3b0f225ac7cd55b8ebf663b7c298f41c23fa8ccd279845a48e6614d500c6669cdc232b92178e7fd1fcf5b0b1a9c03f9bfaae1a8bdd856d91616e913f82a124bedb501dfb68d91f106b06acb3f9b6d473d8815ea27bb839856be5e5f26430615b97978f6113b042dad56475304aacb6d0ad777e63b4e8bf53a0c51c8e8b911147ea7404ce6d1a70770662b439fbd3d4e4c2788aef534ed19012b9387ebb9be3323daec6ebe149264c0253912f4f0eccce2d4cf5a7790e035c3a52c6a1541a5ac5be90526a5f031403227ee76d0836efc37a449bba10165ffe58f111dee2dfa288d3da3ac84894ae676f265b02bfa2a809fc622c3b8b4201ad59439d170e7022488e4e6cfd0fb5efe962a704905bc389001ae16ec46af47ff3a0ebf900a21fec6ccb754a89450134ef6945be8fb68960174342121c36cfad95025e336cfb15262caed34b3605ff9b305d98e53a0e1eea5f4f35ad7588b4f5ea0875f7a3c35ebd13863b299a05ffa14662ccc10cb949a56573a419bbab7424f7c13e537d497f002689fc6190d5a079019deeb265a238c1cebb9fccff0a3203783b03da50d589daf28ec573bab47207adeeaff281e180dc499d62c346b2485be4776f163361edb2fa9613537adaa4838396e32a91badc75487be6a1345ad93351bf4ba3b46084a2ba9421f0bdd9ef47be8fc22857cd0c5dc6b83e6a7ae7d0026bc61ca0361aff37b0d878400a1637a522a06fecb7be0e62b60fae2df2c7a1e68ec2992cdb505a5fd1ca7c1f53f0a8ea4162639af6ab32414b33cdf10b8aa579dd827c30b8c1780b3cd9d67320a11704057e0a77e998e1e4c12f3e5d8a13185ae6830911f88e7dc5cac7004abbc512c6ca69006b7dba74f147dc49785a1847a919a620c892d5a8ff3bd4b664bb73271d8d069ea19bf0e924e2869688cf0f26c1349abc29ce6b7fdccc1174f1a4b4fd26158b094808fee9d0ddbd996f785e6a1caddbc3293a1114feff09a19fa71f286f48721e810693ca9095d7b3c0b9736dfab4364dc1c0075e3face4dfe2eb1c815f713028312f1d106184c1bde874900591731dd75fa8f1505d816d51780f53b9b759b295cf5616acc7aa02ebe6b90252956275844bff4865637eea40969fef0ca595979b9215edfccaa44e09e67d8419928e09be7eee4d240d24f70db6bee802729b4244c619f38df99d0635a3125e2cc7c65bbe41caf795fc6d474ccb000f54f6c4daae2b62e62e2211f1258985e55fc5942d8c738c7df8a184ad34308dc798f4933031095ffd01997150899cfac81c533e6b1d92002640babf3ae3b73371964dd6dac95d8927ac33c4bab3e7a7d115fd1722b8c625da2c967d29764ef85240cec35bff4f507e3d0a02ec6d26a7ab90b8c50f392b8160ec34ddbd389a15bd47558b5b890cb45aee2e7c9f516201ad9e603c71fb631d0b930147a8bdba49e1dd0ca6fa3a8a089b520726dc78ac914d0c41d5ffd5875f798eafa2554c1ffed8b4e03f316a195c95c9a7c1351a06231ac84ad6269280ecf63a73 +result: fail +shared_secret: + +# Private key not reduced +private_key: 9a29ca07efccb6a96ad265638a7ad57ba846fd6777408cc21aa7c8a7c6daeffc6d015bd2e64968cab39948e45c6f3f67611737403dedc8a86368f54a556deb8e1dfd3ea36c1287a55053e3f4ed3ffbe64d28059b41247e77cf4a8c05abc21678110983ca19d5434b5b2ac45adc6c5d90d83b416b30351b780e8386d304caafd7df3a3ad59f8d94ceb83810d7599af876537c4d368cf1c18f7cef5c80f3bd4f555ce05c1a8c874389a5f8506e1d4c116fe3b65bd0b2fe94c1f793f6d340a74668979d5e295b39d9fa9e6d3e4e889e40bd1becc276632f7da56a0f346fdaf1d2fc7b0004817c1f88b3b34506dceb1516dd1c1d3026efce52ef86833568548fb2cea4b87dcc6590fac80825caff465cebabedfc5eb52ec97c5077b55e5f8b32f4b2e354d71e04b703f759bbcd579179e6ab7587195d9922ddc0e1dd8bd2037e0643a18ee6df984a837b86c5ebb7b8069ce5292dd515cb808b0e9f9027e1322fa7ed16582c78cdb52ab7b74fde7fcdafc194b6521e9f79f6c7ff32b003ba7e026d510e3faf80eca6547c3999547749dcb7205c50bdd6ff54cabb15f386649be805da6ad6cea55265b57665bebe46cdfba660445fb5fd036d5aa4f6f71cd14fab63bc2ab7288653ed2680de6d81519b3bc56ba9704ab32bf3a5939ff57bc9d71e37dfad6b705e48bed7a546ca6a80a328ef3875580965798e978f757b83fef7f9774ba46ac3fa61343e002b6379a5ad9fef5f37838c84f397b9c4d39b447b50c834c1b99eef05ede6d5bdd99edabe873e1a1c57e74c51bc0e39d93739101dc118a568bc464a290f8cf5a778bc1a717f9a672ec5cc2b635add077485da497f68c5200e7d3785bf0dbb6ad9eb3ab4bdf776e9784a864a45ecd528cddd48dfa8c7794d44fd59cfe88a2f53e60c48f92216b0dcae7da92b56ce7bf712bd869f2fd4e22cf835defa2d4557fc7f3caaecd1af894afe656956b35829e780bba9c8ac38d02245cd5d56e12dc93dac9a656ff4def67bb544847bebf73eaffc85ec25e4baaf48da8760bcdeb65108acfa364b4286c538ab466f34c3840dd9e0f6e1f379aba066638b87854173d65afcaf1003a189b8eccfc873c84bb4667de47adeac21d9886e86e4cdd3603415b84707668a3df8ff575a69f471b126aacc0e36b5e9ed1f63ff8549fe67ee82a5acc4be796e43ce6d1d56447264aaa02d505f1a447288cd246fbd9ace9a7bba93d1775586d769b4afa1aecce7f85bec14c5a0d69d8ddac9dc06bbb7b31c3b896f5b96f9f44d1635867f4ffe46ee051f7e5aa8e92adf4a8e8b58bf6ff1aaefd2b84b3c1e0cba55349abd356d798df2c00ea04573ccdbf4fd1687b29be8c03cf3535eb952073a4331aaff0f5f726906cdf8dd6be443e9d43370b423e457baff9696f8b5c5a71b5be804734c85ec5efbbacbacd336ca048f8f3589e966ee383fa0ea65f3168a8449a9b30a88ce125cf5dc2749a3933382dca4cfea4de519bc17f760542ec99b4bf0faa4adfa6ff320bf7a95a55c7238702a869d0b1ca018fa58cb2ec6d494bc38db4b352e6bc87dbbc1b63102a588db2fa6ae47f3bc8db1c857ad06b88d1e1dd1b396be4126e8de5fe760a58e0898787c498118775ce407317f4bcbd3477ce35c565d83c1ef1f4eca0bdfeb2be9a5ed5eda28fb54afdb4613c98a5f3d93dba7364f3dbd84b765aed47ebdc6f50376dd5460aadfdc02643b63049dabcb3ec09c9a6baf64f4ddfcf4faaeaeb9e58f74670c74c783d461e1c3aab21840326e508be461dc3cd9d4c77f6737509cd3e7a37d3e395dca06636105463a4fbe6afe797be2d3f764fdad2234d1545462dd04ed71b65fb2499ad4dda7c128556518be54948a86b6bb5b9eeb76b4c35d35bc2d54c0c60c6a744c4944bc74313e44b499eb841ac2b1e637782de465eacbe943d87fa6541f6dfba555f2eb69842d3a706dcc617076ab91ce6393853fea29dcad088da65953a51fc8eee83945cb3e117e9f37188054d3e51817d603ccdaf5e483f6155d6197d0f84d93aaf352facc6a1bbd809eded1b64c9ada665d1acc9bf32ce5bb4afd163874b523951c7441bad8d824df9a909b9db7b73d441fd300e68bc67be965bed3145eb45175db640dd86ecc6fe8495857e6a93c9b667e9f4eb3a84caae9b401fcffa3355da1a341b578b4765c4649e6bfaf5c8b2ad80de5200e4dd30da0b693f5ebbfcfba9f0ad2ad46576a7a06b65de6bcdc432b6a753f3a6326a27073436483aef170b8649e2ca022497329d071af4c25968cb0521a118aec41cbeab013786a1c2984cb2c649da0fc94fdd880fd3a05239b84ac053ca0f822e4c94ebfe1b6d6898da03b02e455467af6c89db7225ad653a5ac0c8e165f3b9b68b01270ef0ba7cc56322d5c671805b7d333b899abbac120c010033f3064647e4a387649c272a32c2dcc2fd62793d8689cf59619f43c87fdeaaebcd4c3f21483863563ce8442a7f581009410b3c506146390fcd44d0f918b2903940a321c66700ca4e205d4501ecec23a4d17157ce4a0bac562533273fb8071ddf960217696ccd98a59e6c39dac5cd185a0793a9190e25a0460837d07d020d72b5c5ba9840b0940832fa3a483aec99d0d629cfd67a1ce77766a23b2349947968c238d0126f6ab9422b97d6dec5657a20a683544ba07971bc773a5da90bf471eaf12310283944c723eb1e0600eeb2464bc71de7233ebfb7be64202ee21088222a48ba200f04b6bf6a1c7f6404295764e6fd857d747cd985b07f4d83f8b13a901ccbff7b01e21b8789c05b635bcc14c8128c379bdd52029efd660468a34512bb78da224fff9a223371e457333ad464c6fdba4f6c5451b585583655182691f6ee817cf81ce6e7a5cc6b9cacee275c473ae1c58aa38e43de50796f22475fca44270e3a46fb5b8bdda74e3e05b88210f54f36e79fb05becc76805b716154a6e2346b0f4cac241748fde93f325b4f82f3b681136aff8056bc7304ef22652f1679c816032bc35db68b64b2848351da88df89166707b194cb4759e6761032aca4b7a54e8064f5755d36288fc5061072da1ec35a8491396c9406446060347361bed860b028b57250f0187f45a204fba678f587ae031ac38480cf4c3fff90188d925bd4c7c6bd0b758698bcde97ce3958697610ce05e4abfca60eac13b666732e8262b36b7447c0c93f91362c519337052865927a9862d2c1ed186b411554275a24dc9738751a4ba243bcfe46109212b711aa453a35b09ba20ab405b6f0f3457321b24017261b49923225b3620678c4f474515396113880df463138abc3e820c65415c593d74c01e5136150b02f1ccc55a6c1e7e9b121588362d784c3e85658532331bb596682377c752e7c259608b629e74a5a470bad77d3c0672b23831a217c1ac82b94a82437643807681cc1684098b86de031440a79378a229bd902f2996f326a0df16354778a4cd5375c756a34890ccf0c92ba07a61546387bf54c2cb0c8548d4780aa72b667c0a1fe400b30f194465cc97ff42511e75457d1a8a9712a6ea971d797baa894b0348561df068a3455a89afc3684081ddfc0a90fd8acbdc217c83398380267776051cf3491542534b1a74b409b69a8a142c1b437b5a8561fb064ecb591b7334afc482af678cfa4e11e970a48bdf822a0b45e1c591d07792884e4bd057a15eecc5cdf66c994cca765daab1af377a14b98bcd8918fe3546fa4438ba5322da1ba75543be245b12e228d07c1cf1091499a2c57dd42c9f6ba3240c053165ca3fd669b4c3944a7d003d016a0fca826b5e615846c48873cb7f222cc12462023e38f14d98fa0486eae480f81a7376eb6380a42a1a2a6123d8a4efb102ee7b900cbe7a9238b59006abddf2ab25565815947b3bf6b14eed43be91a5687b339e6bb6614387583c585f1456372aa68b17449c2a1c6269a05f8659da97585f52421ab74b9d705ba13ac139f15be9f41971e0a6e04ba167be9b681d294c706d0477a22d64565e71979009a18c8086059f3964ed327288aaa0c8a2b2d976d5fbb50b842bcdf3c9d25656ed7224f3435c9bc9b59b17727b46a546eb8553dab54ecc6842cba94fb24592ed077fc56bd5dd2cd798715fe0c513377361d263c6348340a5018b0e9b43e112bb6ba60503ca954f2bb25fc585c021b57fb3d1acc80a3b20ff4555ebfa223f90762e2008ce920a420b48cd8fa9606ec5834051d0904847466564294cdaddb25cab5cc68008f96971b2711ae8d73b754cc8ab2bc13e07708e7b555ac681c0af0961a19105bf62b93267b8c47c73526b8c2d08bb13867be10211347656c0108aa3825234847519a52b6a4599ccac59e10e945eb7bd579e0c98d12aa9905ed85271887a974ab8f04a783747caab69dcb74eb00a87eb1651271050e74552291b66a29053bef5e49690d4eec7b7bd352e82fcc97ca60ccb27bf6938c975658aeb8b4d37cffbde25d97e561f36c219ade +ciphertext: cc16437e7453409e7e200c26909b67a5b0da26997f8660fea78caec9503c6d1a0faf70f017ba882f42d9f8b72335b4a3a30ca14339fb6f0f291ab81d13f2a18d4197f1d5f72fea47cad6c1d3dcaa6e4f43933abf3be44d98083d4a4e34e46b9844560006b42259963945e99ea39af5e56d6299e4e18b555729a12d16779359375d74ceec3b24ab394a86186fafc84a4dfe20dc024527450bbc57f2b1b0fa88d4a46cd21341c7efaffd5a05da3e35260ebe19d79509fa7067b3a498c439f5de384b0416a437eecb7cbea64a6f4076fb94f7f8dde4ccb3743d1b3dc11f7c866e637ab75bf8099599c0233929519a5297a298c95a1b6a3cc3fbab718f1807065106bb290be1d61d5dcd5f228f8355b47058095f599f9b34a3710464b7e367c58f34ac6cfea3462491c78667cddc66faeb43ca86fc1c082cdcdf9139ea8246b871fb5f18d82776ae4c6d73104d2e4a1a6bb11cb59fd39ef66f69a99dc3ece762f9f4bc2303591b0cf8cde08512ba2f47bffafae181ecb64c4818a64640a4bcca3c13e075e82d7f3604a0714439297243d204d0c99f77c804bc3eceb1197e389122021abece24f1f68b531e3f56d46153ede5a3a9ce28e172ba71b30ae0cc5ed2857286e4d8cd977f6a939af4948db5c89dc19513a21ab4feab4246e42bb61ad21de0d23bd9bc2eb04233a27a81f5e5e487335dd4525eb230fc827c573456e0fe77acc292e5c5efbf38313899d691b21e627d699f50089f987c7227b4a4d308ab2842b52aad8b020f045b437e35d9de9a7c273276af986af87023bd3eb59d34d6216c4e54a143b3a678f5ab5a466a323ae973c9231d595b8cf7285d32653739192f7f9c0583301f87d675384068102b05ab76f59d45d6155b678cb2776115b44b5209bf7cbee2b98bc55fd8cc5049e419b35fc9bf23c118a5f30e017817d9c5c8c8e1fb1af2e40f5087b182cc2d313a9a7defd25ad69fb8d9a4f3b6d0c5f65da88925d0794c99b9f272645e88ee81d20b4381750fe8a5a53d766da8d054b4110bc979f2524bbbec13cfda3dc0aa8417bf599128c4dd8db36eae44ffdf6102d3e1aa56276b31cd8ac90480fd658035190f781c91ea9e4eafb6f39a24cf72096f48530542c4ac137ad4e7c4a207c82905ee55b698c42a84c6f5838938457d577dd6e3640bacc4bbda63cb0a2b8299a3a06b49ca7b91c448bd6b2926b139e3202c94108b0ac240fed20a3d268280d845bb635288a07f65b019a22df9f31b5b4f228be8bc92539f284c7a94c5e7d75933f557000b75cf2f256d2a32e4c53c33419a5a2d71b635257bce405111a95592ad424edbf7c5a5d175cfedb0f51550cbeb07ce2dc5b148e3889b3bc3cb15f6630c2cbb6641f10faa58a945414cacdde1dc9d5c578d526f3cb2e23491d69271fac2deca3d78cd21f53607ffaa9a9deae490f84a110002cffab17a12c88e07935fc95fbdda51fdeb372014016081500c927c227542d6282cc8dd7d708b3e834bd3b73137e11ee50759a4f83b6d311046f9cc198b2b618dfd5debbba8bde77eb6636985238faddd7ab039cf3e7bf1d2bd21596cf6c7ffc8d0a8cbc0b14524fcbc6f3b240293dd1c75d4a7c9f241f933e630111c68483f9bce89e1a7068952411d6811dd8a0b00cf4664518f6695107ecf569a741950cf278d416c8d200d434f6d17ffe98e7eba8ede594b9ce64c3f4763f2dff7ac81290dc18d6d5a5107995bb7569b053c7c643846d5379e71044ebe486ef49e48af47ba5c520af0422a6ab0c82677f62ee6e9c1430571bac6898d3b78d026a04513d036b855ed51d13047ef6193beb15490babe0567b7375df71b2311a501a14a57ff376bc465e1082cb6f2b9bb1b6ae778130ccb7d93db187d6c79fc6a506d8b2e1ed2a33af3901bb5da0cc2bbd04fa0d10c8f3b5c2f1ff2e790766fcdee2b62be2265a40d6687214dfb225ccbe572f586d54b2b145b0b960c6436d3abfc7c3360df6525d10ba48bc5d6fd8b066b61fc151634689b20d20cf958d187532e1208179c563b9f3b81eb915a0efd8663477095a01274b54a899a37d0ff662e8a3149edb0d8e59eb85a95f3ba34afa14c9cb849466472e4c6b6931e9863923b525d40df418a424618ccb46c8ced0010011f1ebedb5e669cd5655da2bf518be53a42d3ac480be0d8b6cfa7665f54547d129aa88ef6ddbd5ca682735fb075623557ce79b8f1 +result: fail +shared_secret: + +# Private key not reduced +private_key: 2cb6fac104dcbef551a3f756146d6662bfd4ebc3a81a27dab0f8deac75d17bf3add293db80ea56743a56bbb7b428a5e050844474ba8aac6e912d35433a679c687db3f81742156ed215268eb6be4411e982f86fe92c649b61e559bb189666d98254ca913edcb22f93667a7d566edd6fcc06bd937bca44cad15bc6892799f5fbf64f1aeb93ee4a7bcf8d93aeb6862009c49f89cf31e74f91da8a206ac4ed1cf1f8ea9ae1ba7f3ec59dfb5b729e83e7287dac90957740068b1fc4eed528c73e3cfe632f3264dab7f23b6a584cfe0e4bbcaf9878384376c23c38802c5753da4688554a2e9843b0dca303997452ad609cfefd73dae688ef702db3cfb703504fa7b3fb47fa5993e267a8b9eaac60ed3e932c776908df9be988abd12d8789f457de07e40e6f8b4e694760f9883e197475f436715dff992cbf238e9aa28ae2fe6d470e1bfa5a8ddc0528758acfa85fb7f3b5c95ec12488f7f5d3bf19dc582be12f854384ddfe9bc6937496f8e0bfaf8747e3e268c98fdb5ec99db55d8a7af5b93f3e94be8f5971c8c635917e5d09d894e078c07fda441438db20386ad6c645df6bf1fe43b9417eddde4b30b2b4d1326f7d68a47045696ecb1d8e93ba6a370dca7cee4f54346e9699331e9fbde1786bde2886027a62244e55649bfa52e3673fe5653cca7ffbcd7acc16d371d67a581a529d0bbe8986fdd1763daffdc09657698829348028c5f14359f4996437ebb092f64e7dea7c88fdd3c874c0542fd0e8163a999ecba7bd75016ed06914cf22d9508864ffe58c4f6965f5647d825316e22aa5a26963c66ae4ce269ce80698a4123954467972e8c9ab44545d0224443ad83d3d7c48ed15fef5abe772e8fde388ed723e97e6e739e187cb4ad8b8b9f4972fdf32fa5e3b04dfbd0f84c2d5a5ef302db01e46fbed15ea1278bf2a185b965e4814494f576b56418c9d4de5c62c3dceea03a1e86a7a7fbbe8a5c4bc9ed43c8f46426a3a853e6ef7084ef5bf45e0003e65e81a726d934f3a279950a675f0c3c9bf0bc42a574bbf2ebe7219fed5ac8323e44cbecece8874d31838a7c43b64e9ecf8a657bfe127e1d1fec5d417f12f5938a8fe4e82d9353173bd4d94621bef9248af328017d78fb5d29146f90d58d09afc39720ca4a8b8cfc2233dd014fab16f5007b36474fa370aa6eb520575414e54a117d560ccdbbbe9d60dbaf7d5eeda13da8fa0b676b39e544a7cebb568fb08d761162ba103094df56789f76c8cae2b6637d58392fdce022c9f77ead888d5d45586a0c19afe183db3003493dcc8bbabfb359a39796ee578f5cc67fdc9a81756eaa5296c5d379a58ab6f7baee115fdbcc39771633a6776965816384e5ddf7ff25dea898db2774cc73e73d3e00574e34e573eebf282a47c6f2cd3b74a91ff4ce0e53d5fcb86ba613c747a69ed9aec4c90193f9617431af4689d1e310025b92247c805487de6d8f968938e67084a1795e1c717f2b28934e64a6e4b6ff3105c3bb24a6192e9f16c7f32ff0764f7d48507b84d72bcf236e9fc6a7e6bb6fcbb06757249ab3d7bc5a752fed4c9e5881fc4675b374afb7735a56b9872164c847493a5dace7a855674e9d0928d9109d5f4289ccbc4143a2567a6cb587045fcfd33e93ee2d6dc9ea6a1a40344613a49ef538a41753a41d8c203785d392d7abc4df4584caedc4d4c8c0661d114405d256bc16e64fc6ca2b8e7eb1e58ead065462128327adba3d767fc3dd7ea7589e258a5cea5c65a71feeb0eb93aa00f7b3c9eaaa58a8a50b6bc2f69d4a09e5404087ae438dcf706d4d21dc9eeccb0461f5dc22b4c1923c83aa84c779a6312888ae8fde9b88e4d62decb6635b69d6445a9edd5b4fba51c9e60464dd88cb3436cf73f19f4febe1acbc013b2e844ee3986c4ae156951eeb9d799c45085e953eaf240dee68896f40579ed922dcfe4fbf83c99b3e39555c8ff46c6e73119f7473e17d9f979499d5f630f24ddabc690beaa91196e51e5865f7fc85aeae9c27dc3c03d3e715303caba288f95c55bfdf8d63759d2d005d1163fea3d3f98dc6da2257648c02fcefff39ac0f9f016e7efafb8c9047f46a9aadeaa4566a05bde7b8c4dcf8abea707ff214494d4176920858e9ba6948778d49adf7e2ed56d050d45ac77ea364848c0b4e00fd4b44e2bee8bb5914ab89dc8016eeae46e2610a5fd252102a480cac2bc6e7860620259e41c64591584f1e6ce8e3312dc8862dd806cc2181a18bb91fb184dcf045b030807a5023c4b3779f14a162e0938743b78c71493beda7826022e78ac100e7892fc104d48e25ce92610c072a3e9e8208c93cc225c916a2941c13838eda382f311a809c19b9ca60f188910a1a1bede4710b6b72127e48a5454a457c8037439572c558378cc784554171f6a0c78c676db8bb8aa380357fcc1f61859b0ec72730c10f8c3932975c70e6329aad34a56797a03c0297fb4aa6b97a63be19f5ca6318d0b2c8b4c6d9ef808ebe364d0a41a82dc768be47f44f300bc9b2e4cca1050e21a9919a9b65a07a6c8bc1ca5622a441117a1749211571c462a40c94c3301081867b3a8957ff45c1c3f7c00097a35af93438d74c78c061c2d645e7f6c3be5fa6da749085dd12461fc517e0c28baf93418978772e4c723c071908915a1a5807050c57d2a3d56597b1e1bae4b437632a2522f314b39fa6ab7a047e12b6502027e334b715b5b0b17bb76ae608acc0250d91a859c8c448b27bf4c44b092350e260b65c20c82588c8c1ef25affaaaf150479e80801c82cbea73a37dd1a7df6d268a9b0c4fc753158c39ea4e90960c20460804329f58bd460a37357ae6515bcd505c7cda55b2669017bec3d51816e7001b0a64837f9e07ea26735e830092a648f828cb3093228b98a0c92656c1a14cb3a306929c6207751cebe31aea4c0372cd5c06cc637dd9b6894f00dcb3796d09ca87884412726a25bfa9bf6eb613e1a2a19a196e1e1634e1ca0347a9bcc96816923092961b69dc0c013c191f7ba4fb0b13ce5555e8c1b07d8568722155287264b5fa990e92603aed71df778832ee3bf9a767fa9e650420a14f5ac227df497efab89511302d231a521c5353bd425306a14b7d2a566ab3b32aacf353c2b04a148e4c93c3e470605067dc7590722c452245b3d750205d2c0aad03b0e2ec535bc6cc3956132e329a980c8495d765ed1eb071c58680a11859c3cc0b1e986486a5b543949643b83452c307df477685a4d0a70a7528a55a997bea46780b26252af157fe5d874cf5c420b5b1a324a932ba52291428a39672bb359abc4b54bbfac608a0135cc99a38e102da3e088e4ec5c47984a636c7cb99a6b6304cb0350052618471f716be06b899087aa38053111e35a95965c04a7c42bda2319598819aa0aeb5c39181079f41982e05223c8e89abbc32fc1487f3cb99a167ba694b0668a5525a88472439c89179147ef831022b45f6b8553c8150e32b5421f75291c830a8698a916406807f201141a0ea1cb28255a9ed709502ec7851a56a86cd3b7f05726ed6a6e50fc52706104e829b02f7b61a1856c9b44b8d1214768851ac190b46b61c053c371a333a95b7806eed16c033790c1563fb823204e26ce3af87750ca639e605cd435024336751ca0bdab99ce5b45cefa04caa29ba33b4998da0aa832ec22551821bac055961acefa077de544bbb80211878c6109b512b6b4850b5a8d0bd9bea6978a0f920c1fe8601e1123a98aa23cfa30090817ee849e654a0387a185171a43047758a578a02ebb557904106eb3096d3c1f92092f02891f1d3b0659f284188b7119c14896688ef2bcc8086c604fc140a8fa24c9595d020269b0355ad9a44cbd803b59010a1b85b12fc785ef0a0789c10b3a30925cf155ae8682859a8f8164cf62fc08df577eab2071db87b029a16ec90303f5b97117761c5f20033110b1bdf7388895b30aca862f22adde6930430821dccb2b1ba4cb923652309b4f16600fc9fbcfaa8553cb45bbb53035cd28526ea8449844ac68b87aa61047b94244f126bfe2323af5f30bba9c1b96a426a1d84c2da35fbc001e20a517d458b4291cb36394cd9a074e51d8a45ce623484a3aa7d575977242aed535d46b74d8645aed246692ac1b8b055d717ccbd59769ff9617bcc3aa7bb9366ba51a736b2ce79b971e0c204ac62fd09755b4e4b233e94a9cd3490f4049ce6cc96c7c0fa1254c4eb67748b337c41c473fab4a944364531a6fe18652856797787c804ce1c59462b8d145cae4b97232440ba99cc3a66c1e019b53fdb272d000c85ad63d686a907a31700fd4a29e5936a53a4f2d2486751851edd1b70115adab07a29b15594566221b329076a5a116676d3534044965014daa0d13da178581619dc06df40a02750beb995480eee94ada82049cbac3e8c6830334021c22894085dbc8382fb43cbe318e8e6ada9955de950541fd53a8a47aaa8cdfe80d928262a5ef7f8129ec3ef92f78d7cc32ef60 +ciphertext: b0175b6f547277d58f329d3b7182bc9a1d18dbbebfa3a5e24dfb783ca9842ccb7c3b26782f6162d9f60971e78af2dfa1a7d40b181ff92872dbb387a1e9d4b962703c7e42778552093cd622686c4b12842b5edaae5265d802e5c2bfb4f4031609661183a55027b4b4ac735a0c3d4d9a8faacaeaef4e0fe7964b3112877d7d9b1cd8923f30fad9f70b5cf480c83970b0aea28107fda48bc67cc0cd00268037004d053392a2522a0b2b9a08bbb678167c2717d9252f19d9c5c6c5f48068ea0b7bb9f0db9b4801eaa168d398b37cc0032401f808b20c8414e9d4ebbf573b1a86e304cec6f10980942c56e18b1e390d43ad4149fe646e0ff8d15fe8f41f7edfe56211e2e08bae7956015b961ff065c06ec846e1ddbf37e77b7dccd34ae270aaa5f01fd92530da96ba73e2c001c8b2ff8a59cc1c26380f796a417959d18c1c97668fd77bc82fbcbbcf1a71f95ebe53265b477f9eff4bd91dfed2cc4b3696f1d6139ccd74d13973acb599debcb81dc3723931987c969da37d90d196ff052c5a6d223be15ae7dc4a90b289a7e46e964ae3035d73d0f958f9c4955c9d4ab38b085291891995b0f8e3239f1408540a8575acca7f0da5d3afa4359a7a403f7c4e636d7fd1a95b7571e430c9e44c14acc516f3eccaff00e2e2fbe91abbfd0e96dbf74f36675735ad70f3c97d515d5d413780f96fe8da72399382e433c76b6deb0bcd215e5ff4ca04968fd7cc0470c10e5d22e00800069944f2bc6ac4988f6eebd35995862d530f3b8478f4c13b8e2dc11128258901af0e4888b97601dca5da385e9a787341c9d74ea1ba2d28b098a9ce395d1992c5ada71b9a6c1b15e20f57da963a9307a3f1b9073a2d9a990832f16ca3aa50ecb5306bb75713c25798a8cce4c529adfc3377e44cf9f10262c3295b01c5d3a4079bcf7ec873524ee7dcae5f2a8a42f5b43205624463ecde93330410c410dabc0eece6bc480a61f6f52b10ee14c8dcacd6daae06c4eed37e3989432490363282a10d276c484cb1013ded7bd58f204c63e78b45e1889b685fb5b37110b5af73ecd51eaa4eed3525adbca8f6d9bbfc19239ec367854342bf02fcadda8d668a30f709299f184c89865038b445ed2079d675648c73e40d90425d787d44e539cfb229bf7dd039dace2f8eacac46c410a2277a93ddd34de171c93e504f1bc3e45cb468cc855228eaf4963a63d6f8f747ada4928b0423c69adc0f88b5277a2decd0eb1fa44440138388073f6ed52309fea034bde1d1e08851cc11a82fffb6b8f34eec75eec9c6237570861a44d679c16594e4031fe6337ca398272ef43176a082958b3b677f1416a55692ecc6f16a6ed4f9b5a51cf2cc5cb50666121ba01fb9bfb89d1744403700faa063f67006b28d579a685f16a81a5b2e87efe0614094f737c9c6e341470cf4ec51580f1023a14420fdc45f83356b4d5d80ff53c85d32067a40d582ffc87792b5b34da52510629185b2480e841f8714ccc7b5b00259913936b097e0dcb6ef2bfe42b084359d68cdc80acdb206afbf419a5718eb1776bef7aca6950519f3ee39f4021af387c8f251d3913683d1d0cfd89ed5ed44d38ff47009220a5b7966a760ac78012e5bc1f6e5684bf39cd0c45c28e0a884db323d647bb7cc202a16a12484b226680ff2abe1b26f8a74f697e4fd7c2132bb0318dd082d3c7cfd7fe279d1940a4f20854bb280498d0a3c76ac7d9f10b9a13205d278d6bd1252df84e75c914916bdf1e5352ebcda297e77aacc782ea4717f07a1f521086cf4debff71ee155ec96a22fe759aba9c0f282a707a8483a11a37df4a947749dfd434359884b17eaa6616fa80dfed1b62f5492a51bc572392ca7cd0708d37a8fb0185202cf7a850fd1954e4cbe7f2973a2874ebc2a2bc4d1821e2600685c0667a97baf5bed4b7a222e9cdc556668da7703da0f03b7b904f0ae942aa02fd0f22dea1337e98b763917c6fec9b030225fae085e050a5b834054fc69d63f72702b7b6aed8467ab29734a7b9f89ad70028b19a25f6ee6233b1876314c7bddf805f55e8a79edbd392620e1ba20cdf6f78f75d5bbdda5ca4215b312cd4ddce4e5c986c7f03b99fe0c835db9e199493b0d54bed56f5dd1e52afda6821a2e6df36f6d032ce33075088b5d6aa9f9c07090dadb5350408804cfe5b704c3e1f8dd9525e7fcda26c0c79562b670cc1158925552f28be8483310f4ea53df0d +result: fail +shared_secret: + +# Private key not reduced +private_key: 646d495a06e4e1c6b526a64a23cb3052fa4fc0198a351aa70da8f285be3ce66384edc5f2df0b38199baa8265ca96da7040b7f04dede62ab481517a76d9b94a213d6b05de9f5ab43147ff6c4f43c230a4e31b9ca5865fae1eda8b9f6f3cffc533e77ab7345790a507a3edc589a1fde585af91e0a9838a2f4ac057a2c7a49aa93cd12f3d68fcf4e6936ace78967543053542faa399a8b7d2f5c483d9b09068d67dc4e4b319407dac97a1045d78b6633d2b690a77510d996abd44c972a37b37baae718d86a4143926875e09bae5a206b3fdc69562d645bb2e3a13c74b255d72a258d45977fb33ab4f1d969157137d85f481828a7cb71aaabbf6b54874821b9b77e41caf849874830a742c887faf9e8ec657343bbeec8dbb6190d53749157e6277582c589ad1d9a33e84de260ddcf3dcaf2c03b1a6a64ffccda104fc37a2c34f7b8c56e06ab258b7c79ecac3eeb9c2a88cd2171aba70b84c58d474f494e241ece0ae9645c1c7e163ac3053a8b9e999309494763d5d354e235f253b87af35818166aaacf85abfbdd56b3ca078a6ddc54c599bb435080bd7e06c968964cca2acc72a17c25d47a6768c512836a7ccd3cf59bd9a025beaea57bb270ff29eaa3f473a367efc8bd189df576978ff159f283af18db9d6b506be5c63c016a55d92c69999e4cf1e1730af67881deaf4305d5ff79cf42d3a3731cd88b83abe4f39bb628a4efc0ad4b0ecb8ff98c289deb8e13bf429263ffb0a638f9665705be770c4be9d999f8ad6ac080671ccad47378a60c259bf042839ba39a11f94354dfb8d3da789a489db234e718a3af67c7c8b5e2af1791df9723d6d08f360c6a4d044af5b4ab350ae3859690bf9b64cab122ce0ae15ce4d5e475cb4794dce8118b877d1e372320eba427fc273cecdd1e33f517fe2c5c4f1b0f631dd773ba69db894056051753ff84de3dbaf6c597a50d10f3b2ca99af7aa5f218971b5c8845c6880146847175e765a2fc6c7586d88b65d017572d89fb037d7684a86a517c453fd36ca5135b32019fc36ebab15dcb82b7dc156e6657ed35dccf34f94559b92d83f7d56f77926c9d85fffdbca5424d431d61648a848bd8e36d179047120b7fa0cdea495ebbf1559d8eefd363b86892f783e75369252f9fa85097a2636c8f284a841396d4cb39f8b247ce1593fa60fa6cb5de4cc4d36f958e0656cb9336cf4ee345b1dce5431359dcee9526ec6a42d36f80493b6091bdd5018d8bd29a321959f620ec18af6739228d4a46def5858d22d1be076beadb603e047786c9dd345cc33a12fa98dfb9d9eb724ce7e853b5f29a00f4331a09fa14999526cc7966d4cf5bc24924f5ca64de9a2a5c69965f95fbf29875c3dedd3d54a1ed97cb7039f8d3982764a4e964c45593e83a16cdd8097c033ece44bb7ca7d4483910d9085acfa25c9c2b1aab964d7629bc4f0f336ee2e4c76afbcab4137f155496c4c09e41e7e95ba2f8ebc6e3dc7c4f541dad5e39ac09f8edfba7f978f4395b883bc6a67593a7361e4179b7c95945513c28bd488f94e46c5c8956c5be8a0da5ce7a680d26a779ea5ab1a046cef3e91addfc655cac8dbd9518528be45ed3c1bd758cfd3dd9d163b07cda60f6de3f6e646d356ea3993b7608b9edcc65304f9fd0e59b19374732555fac403771a657b92fb8d4a57a425fe3e323b37c56e83b50e4600b760bd44c5ec1d99167354a5d3ead377a5041c6ea00bcba67be8cd457a667e853db6a9104d8ffdbc35fe7bacf17afbe625abc9473f58cf69f10f9844976475f484b419da545f3f0776e6908da708ab37e0776c0a4b4fe02795074ae9c026e9edfc36ffdcb12668851c43c2ce7765c15da46b0f52539d4699df427a634ff52ec45e3de8772bbbc3bafec49799b3e9733e5bdcb16973e52aef43bbe596d64a92d6e57669fd6f3cb339f76f00ef86107ae76f45525a0da6b594b67337ece54499c09da5c5489928ca879e93b3cfa7917999b473deabd7eaf1343e65b95c8b1f6736bb183fa14b9d1b36e43e28d7c707ee6646db1bcfbe6db555c1dc907b794dd7ad7c505451bdb9dd2e7a7112636fd769df49edc94ceab1519d6945273cd375b82573ab5994c2ac447f5d53a3daed4b4d694f5e8eb54e29c125f461ba056e599674b6de5b026e80212ff17cb73419d431e03abe2f7a733c9c0d0a05b6ae91776032105bfa99d149062746ac1fd2ca81db9224518a39629a36d043e6a398444a055a2cc28ac785e22b9ada469d2e3491174a4e16e11824d32c33326f7cc2b73d417a7151496fbb6805a79d5d974b12f3c0125b5d7bfc7c6f244b68e2c1ca8613e891322261b4789898a1f858f5991b2b1b177769aca1453c57c43140548452f3053d3b55fd2c3062a0b11939a3c14a81c59432616a5700c775fe98c6fb88c1eb8277c469be42f541dbb79808479e0cdb11856cb7c1cb6a5b865469bba549d73cfe581bee85494dea28d6e96a5f04cd65e561ef66a2482c806e39257b9ba9581421708663bf0b45b4131eef3384eb53b8733c4957937161c3ccacea5cbf91429e87b8b2b6a0aa44cab94bcd02d14cc3932c3ee58b483b1d11e5243fea0d34912b8d45bdf48c1358db3fc163ac081c23ca6c43919a649c33911c5802e2407e9fea350c3b64f302c5489005ec87650de428e60b790489a17e96b9e1fa91b33bce5f4b8d8dfa1610b39fd2858c25b898c1386c6dc021bd3414bf213719867f8cdccbb4d2bdf12207860a638bd41a05b9697a3bc901e9ad0075c080243cc0cbb3d389977c522230a42125b08d41839986a60acae28bda183aacc32dd5cb149af2bbfc60b0d5ba8ad89b1acc0863ceb24faea37ef3f60168cc96d766642f07a116225873e651ef693f2bb97339acbcba301e975405661b2aa523168e06c86f9bcbb42b5f12d79c3c379afcc37dc4995b11a4afc3578a30a13ff57ab87f022fd5c3ac5dacc3462c7e7edab63b889c22e90d685733a1a79ec336c50c18a5fe4408c2c122e34a60ef56a78bc16b78c3c98ed689e0c9276697cdd8aba667109cd911b77e6930c4f58cef1240c1f7005a7a2b17390988924cb0604b4f897d19c5b0e4a557a6a23470bc71db15bc99248d42d9bed4117652690124b1bebb438473619c4919c6c0e4071ca990b9d005eb287b15126e5c3477a98669f0856242dc073bb2673c7c1b1485799c300a0648a83142b95a2377d7e2b1d994209184309934c914308b7371a307a3bfc825958a98a12524b847ba5b61e5a279eb9f7cab5ce030c45ffcbcf919a6ce1059dd7c6aa077c2d2437408315db32a800c2099a92ab682fac6461896d583007b97af2336b1e6d061643c62f0b5122d48a230225128c52863c9aa7837ab4f254f92863efbb3b379f87e40071cb6c8b74ac79af4ec11da6c028f1caf9545a7d0a984bf6ac8d4067a7ff29325daacd3f9470d529f02b00183586011da8a0295b678b18d7572cd4f081317b92c21803f613bb959170ad3a4cf465645d3e5a1dbf672013bb935bccdcea51393bcbe7c975d30a9823667bbb155bdccd14ad3d8b453b30ec2b0cbd703485975cc571530b4cc521693a9965139fca21a90d57397f34c46822ea0e0ca0f56668b8692127bc93322389046c63fd08ff82b67f9778964054b49ab0dabe24628e771627ccf34f46c6c820e9d890b15f396a291a98eb14a23575952abbe46374c74b812aac6b9ced932c078ad3f2a05c821b720305773d070b8c86d7686c53b81ce241586f5f752fb4a2774152638f04156a0b24b3061141878d5759d12f8bad4e98aa5d41895b91e122074b31aaadc30a1dff707c32aa0dbfb2fe0a519b4289942e99754034d65d7b9eb5c0087225048b5a293038969a944725a23475b0681ca2177c5bee023bb7e0abe99a630b5babb5f8a67c8117fecf20c1187c338a97b72c1674aa302c3005037631ccfd51a5b10ce837911d8d8372b9760c0498b8ad8218f832fd8519476ea5673d6659b558895796e14cb5a55e7a3d0b91cf5a6228a3c93175a2ccb06c26bb00d5224a402f119a3a42356a37cfd82162c65953b798d9d96cf4353805ddca537a9504b708d16424a3c6209c2d738e25c357256833dd14375a65e1e32868bc4c4e5e062fb636e27f4c746eaac0f641330d235d909a128c890e531be3e0cc307e632baab0ef7684cc687bac9b966efecb85ed1030a1b1e15b71be5a263fc64c320b145cab657a14c2749dcc9961952ad5489c6485f208933fff0203f3c31eb6a389f072cc3573166b9349ada4d7dc66bb12c18a7d96a86f93883f83822ec0094b24751388a51166da6b24a0b526935817e1ad73b4403aa3b10b5d1822daf198aa848a73c9f9a866b634f939c2179ce55edfaa1d5d48cb3127f0fea3acc7b163dedc529d14502bab03d1b7fc370f2ede22c7190bd47cc88028adb3294029e264abe2d3c64d38269a1ee8660b9a2beaeb9f5ac022e8f0a357feebfd13b06813854 +ciphertext: f3637bafcce8675a7f2491e7970c65625bce13ca85362c62a0fb24cafa33b0b388b68b12962765da682203c46e6997d4c9c74f13eeba96273d3fd105352e92fcd8f0a4455e23444811c519dfb9aa9174dc6719a76bb6150aeb243e2166d9a63c6bdb9c42ca73604ad748b20ee8d4bb2e414f7a33337bf500a8a354b56211497c6eab1040580215f002f97371a383cb546b509653ee598798b1a9c2b2391d066dc45c69af2eb07d7eb89c43f26c4e553afe4964e0633c3dcb5a6acac36ce88638c17d83cb6bb90f24434c0aae0f302d7154fad1e698a1769d82ae7f90231cf5ae0fd5d7d02503505b6e12bc27ce6a6283f751481a6219d2b01f2e00fd04341ee96a4bd957d682c6b413d2c53c81f6ecea90aadf4482631a65d393e6a80199477b5f808e83be7eaa7b4439c41ec87ea6c69e9a6ee28fc9dec477d7a66744f71ea35cef0d86fb90534a26368055840320e1cfc54ab65fa7462475b541f19b259c79114da9589c8caf1578e2d179efe5a398936058995701308ea61ba4942bd35b36fc60371888a8663ea8eb456f654fbc51a0f701e3a318b64700bc8545685e5fcbb01034b717b691914fc7de9d1c229e16a759b3d25220ceaf72c9c7b5dba5283154098295a08b95efa11b02d7f65ebc6a3ce97b9929456bdaa60854481c6c3d4b851d88beed43b56b0d65533d55d19bf79ae57bfbb0567d4dcaab2b6cda028dfb140c797fab973f5345a55b8c3d5b10b6a94442e1ced434d1c37ae2ec797acadf124330c9a04977b29b0e76672f104e918b2242e0e4a05691bc3ca663b0327a38bdef7ed38c082927acf9d9dafe917d1f3c1c6b6e590206d12c4b0ad7efae9d4e28897da9811bd1210c19e384d9ea2a0b93605c75430edcfc66782421771774072843f8d4231e3dfbe61c5dfd99ae12d3fef73117d9cdf6e7707f7560c212fafe1104edbfb36c4130941b9d6f5a4d067255db6e6bb3559d50a3cee2ec3b57b8a379b93ec32ccb743e7588a3f6dc75f334750e4705a03eb7d75ad766db7a1a88ceb2e5047342a37937cec465ef93bffed2fc238284d367ff320b466673a01fd485ec23e7e21a814c471fc60aad2de49858673d8a5071d00e4b26f4709461b7ef5a74e8c52534bdb6e80bd4dfe09f2c491b20600235743d61787e93ec601d33de9a1a36786827584cc2f33f04c6acff0637b5eb845ed6ca36bc66a2edfe989d2b668268b78e1ffdb1fe9b737cb576385f2be449fe9fd176736955661a330a6fcfba361dd4935715128227b443518e6a27c421eb653168fcc21cc6c4c268b84da4c1ea3162ff85a3754064f4354026f8d99de2a76c99c52daa051e032e766ebd889d4af961edc0e497ee31021f3a38fc5ad1d4ad465d81ebb281f54b1a8c22040ce0099bbf55c9a3ac7c766d65c8cf0765e850404de6184bf81399795d2cab89cd2b73d747903c52140a90e2ecbd3de04c1bfd82c8ed5786b2a409c608568bd7b773dd6086021e53287b46ab5c26f9c04a3157912b079686b29e527bf65922e3b7498f7781978b12da9b938e4f83f005555a716c494277b1d1af716724d35e72ba387efc5e633d2e8ef015a02218b11be67e7e7bd491c7e9c198f18450db3254934756b8965d8b6c60b65b18c12ebe260202c044a40650714309d39c7f5b7d28997cd9f77469fcb1a7a5bd237693e16e6e4e2c645fdc77e859d2ee580ec4c4ddf475bccd6e31092643e62998dd523366d2b28bf4dd3ef54e023544156f0fc6a86d8e749551098ce1e288a62baffd642be9a2499b62c5858250d87913c1709a9a8578a430abe8819622b1d9e800875c6408356b597c3d9a89e164419b6ec3edb03d93aaec5644d3b24b26c1558775ce5e1773e644bb21412e43092136e3cab817fcf89bea3b9439026e625ca19018dd34028afac0665c135b1f2a5c2e8d2e3e34b5eb7cf947c8aef9d03cc20d6d22075eecdc9a44df411c0ccc3d0fc0f32277251c38466cfaf28ca47824194d9befeac21b68ca89c79c672b21bcc4a676ae015676bcb5a93f6b2f22ea25f4422e2a4ae637217f33345ff381d1f8241c251ef3e4be839cd4531855413e775e81d1c0a2774a68a15730d4149b1749471bbacd68ad66bd50feb37e2d97b73e001776b8b46583e9cb581e7095af3a1ffeed83798ba211ab22bdc4bd80f7e5026a373984cc20af678b9ffaad3be3d515a914c501155257d3 +result: fail +shared_secret: + +# Private key not reduced +private_key: 59a9e74084c2dbc5e1a7dcf500577f288d9863db3607c863f5f5d902efbe2b949ef9b55231c8f704bfd0b1dce81f8ee9c0f9ab9839b795e763a5e7ca3b1fe6f7bd80f0e7b52c9ce9615eb5ddd86779587b92cce0a16ba470cce15fe733c1847c68abd6cedfb3cc28a95e9fbb47abd5244549f5d3e14a5eb873fef57c1dacf04ba20cccfa045947ad73ec4188ed0704c6f469908da6af135dbd0487fcc6c45145f8e93b739de44d397f1cc4322f7475ffc15c634961b7af3dc645c9278c8ffc304ac39d1933946a8e399dafd94aeccac243b81b698c2c4985e029eca21f6861d5a5f8eb61c023a5b38489d2168bc75a6f8a2fd2d734a28335add858b6a3dba95c86899db979220d7778adfdf92db4d64beef40bbf87a59fb206620025e1a75c323ee3b2eac47f51ca993f865bb80954138bb59cff731c3bf498a4d129746c8d6f97d2bb5aa8e75e366dce921dffae79543289c7f2deb1850b8cec2e66105bfaa41df8cdfc6a5623c1eccfc8f8dcff27345412e9da9a94d085ecb68214a13444aa3ab7f59f35b0c5cb9e80aa83ee2ec715aea51cfce5b91a578554f94f565fa5c640edd9bb94d5f41a2d9006e9439ad53cacf4946567b80d5ae1f6bfcef384dd20abcc04e39aada58cae26e8517fb98c64b7fb756eb11fffd055545b679bb158f9bf16d6558a6ec5497ea824371ea95312f3ea02036179945a599454f63eddce7a3610055bd6db8f40e37502073824eb699a49e3348660f4de45453d95183facdf3b4b64d57c9e69c6e6caa65f0f9a9de4c36a4fcbcbbe500355e0eada835ff5aa0024b36df8301fffaae086545b5fee834c9dea87e576ddad99ad562e3c56b38546ad04475a39c31067ffad7339dffacd2c39888a898ffa7d3d71147c3c9c476b75911d96e5f43c91390d3d1ea59e86cc9160f340a049d4c8774924cb8ce506e1ee7a97a04fd960343d23cdcb84f977ec08b7fa18c34a2836a215727157f100758281198cfc88cf2c4b4ec287c6c66955400e35bdbee29874b480d4621a4994d79d922f67c6ef8b66c77df256ab917a9576648f85e0586f3ef860d399eb66a8551a19a57ae7f86d8ddbd75669397f7b755deb9225732d5ba65939e7559dd87f645632e93ea2d6d7b0bb900efb9e71d57b84f63b2d6946be5a66e78bd32883b64c2734ddfef9452f5dd58c3d19476a4dcde4178eea1b8ebe761dc3d1183eb5d39391889d792d6f3ccf775e17483abde6210d921ef689a204565df8cf165e31c9e7c5569459c81b3f712a8b0da79b1fcbc9a14ce2d346b2e23ee77adcca95e4c6ab64778433e172e4c4bde45c7a4532931afa0b6da663a5b7bf186a5346a2c0ec9f928e47a1e66b806f89a22cfa6df8b04ecefe770f7d89bb7c13ba9673dec7704d57425e60430985f62e5b53c59ac76c6387f5f281889d968592dd6d7744757b6103dbfb6c4e90ca6a580c475ccae2664a5553fe7330696b12b3ca3eb7f785de6d2dfc5acc1be665bbb1d9ad9d8bfc6d81ba51f21e7a109b43d2c97250fc96351defe90e8e2ca3d0e1e46c317c62575beee2c850b78383da446deb16aeb67ad8a3348adba75693a9eb4d4e72f8575ad783d039e3acb9bc8bf238c20f5eb9cbc9818564d21d7465d007967d274d83cd3afba9df760fa87b7dd36bf5a205aede7fb3a514c8e26aa96de89f65931d8c079faf748a839335837f0a9d3c2dc9803e31916e97c6a66ab98f91a7d6fd7d84df004d44e36ec6848f7fe424b0290f937d6ab4a798554574a0a6b5894ba8afd11b78257f950c2cc679ce48a908dda305be0b765a164fa1fe8690f4c865a09931904a3408e665d60633349b72c235315a3fda12b5434eda854d7983334cd4a0864356c6a13799f023a89a2fdea264bed0a85d3c1eac6aaea6b12a434b9bb5d4c9d79c8ab4aaa216e1cce877a5f834d85de08874bebc8fc23e65bb16ca769d7df80b036e2cafeea4e3df59f68d189a595edd99a6da6afcdad7a615909aed5483c9fd00076f23dda1b94761e8b8399b4a82e204a012fe41fb8f768b39f6d086a24fada71aec9d8723aa786e4cb1bdce881742e0a7a2b0ddc288244be55ddbe81a90209c33aae8db84e383f84a4c313acae89a6575a3aa726b65f0d75e5a7ab355f967d5b771c85993a0c6d94eb35e05d4d9f3e47369bc82661a9e822624d2a644e1767de906658569ba68922aa5c18996c58b3325685bf3564518afdbb99aa67acabca017283bcec3cca9075cbcef02cbe57ccfc73581784bc6fc1b8b7623b9255c20f7430887c87a5f6873b8789de3810ee4841447d826706bbe47d6c4bb13380a03a532d240adbb8240847e6ed68eb5abb3452584b949b8889bb77d2bc87a11c4580919931509e8fb931b50957fb00b972c8f17c8be0e0565bd95b16799606b825e462059a701412ac2704cdba91ea269271519421574f807206d8a65f8b67f44117b4c742e7bf4209668cb013975a9317ee847bb09db3c44d8029e01c4ff4954d5ac7557941b4c12c60520785867cef3f77214805c96d8497b508629713064cbb04d0b9abe21afabb10f33eb38b6b3bfb34908ebf048ccb239701944fe64792b8a909cba14bbf50d03b858bf4a318b9860e58141b7f114b38616533c96c4eb25115724e6672ec20937fab6164aa4a9818acf072c90ea4a5ba34cc95270a330e2874d76a5e0fb085f1aba5917a6e6c3a50ae59659d95703d0a1e9c76c0f0055605ac839f70f6868bf0727496f38c4fd042226fb261ce27bcfab89daa192044462cba31297a660b191bf4440305c5235ec225018cc92480c19bccb480d03d08c470ab20c88c7a1b2a9f37dd7b911cae469de0c7f6e08aa9d427a8eb90af2649aa28ccf1bc19c0fd84842e5748f686278631659a5a874377347ea3894b035a5c139ec8cc0aa63a960535f8e3113f668bbfa9a67a82ccb03253461d3354eb81d0d112fd667a1f133c054730f28ab50f54c5416f65ef60b6ce8c86f6608456c819a7e10ba9232322e4bc73d8370874846643275622b3da6dbcaf9fac7001cce6d34565cbc6f34a1bc9ae904c5229320a3755c4a439f035b5f8a099c70a6a57b5e3e15001bfc19710878c5db0930b21f28603ea4087e0b30a2cba02118fa644331a81312a22ca0721ff266620bc91fe318897b77d3c9b7f9986861879a3a9c349e16c72a9b2bd645915fb05a94ba4c57aa72e93c3decc55597e664ae3a683274267f486452e089aaa8679234c2fde99327a60a81e687cf4491de4b90528492b6c46eeb7725d876a91987025af06895279635e98183bb0ef7267c6449913ed09ae1ba77bba0010b03b900863119011b1dd02aa969ba41b6b684fc3976c416342891cbd0588b5c6a480c04d7798820da67c9142fc07a906f2517a9217398c9611b0749f5556821d93368014d9d01cf2976af6bf492e2e59b66d3671e814e466388e2039037313ac690c3dc534ba77281613560b0fc9bc5a298c87b879835b386c6b0e1580830b689e7b005ae950d309c2e264556685c54c606aab7c0318b2c66d4513a707b8b5800ad2ecc1567807f28122525b69b7e1cc0d1646efcc1673a156429a205e4016887464c39a6543e722f0980b81f524203b45deb45184d35351be963d3906e7b0a98b49167a2e0bac9c7a50db62657c4cadf6985d753c33f90bb1a275be17a7342859415f7855384975775cb557a2eb92801bceb7f63cb97a40837ac159a37c2935157160d518bde11c1fbe18c32923d3049b50b50c2ae0a325281c7a4bc32022aa7835630198103b25398d613631860b70a6536bbc66ef6fc9ab856771652689527c5f5db1d1b4243e3f06460eba75c363715378c99019d213732804b31e30cbe3e93c6f83a7ec239560abbbd48d96684f17ed61c9dafcb55cb168e2ba1778ecb0166e7664e9412f4ec7353092fdba5cca4585d173023f1856836619e57b0052b07141ba9507b042c5d5b89ab429b3f237f0d80c5d4126cb4c59d9d19bf0bfa9e3eb42894228d13a05125b36d1daa647661905cb471b08405207469ebb35ba5375a40b923e6b0cdb3f1070bb6728a389ca4b89079467732ec3cd7a27d746850bd4908e401134b650419e639fba07d88eb2bbb755b2a7ac2bc6947ab8907c80a3b5610a771782daf790874563b65a1236baba0b6fac1e5f242919bb4519b637464565467456600882532457e1249e692bb82e16c7f21c370a29453a95600a069a54b0b62087f09ea7ab3da48348257877864cb080f7a39603e284063da75ec0b9219e515021ba46ca8c573b306e814245d45cee5f55d0e5c7e36a31166634e7805a413a062a7b5a7ae75783f97c505daa8f9113507a98a3e8ce6ff046df83fd23815de42eb44b586845b55b2d39aa000ad80db50ddb1aff6498e12eac2d5dcdd68be66c7a569b0153ab4aeba37a75dc973a08ccf451b049fd51d7a9ad77ae14a81569df8c9bd3a8f1ebea86fdcfb823082 +ciphertext: 12cf783cb284a6655af46ee13c23e89b13e8cacac077ffc171c51c3ab7ecbd38853da0344d2d2cae3137bd41af52c1978fb85143bab78f9595971c2366f4d6935124f9d78ac2b1246d12c51858b51379782d2a7d0d7f04bd476bcae1453535cd4e0c3a19023861955290626473fe8d1b60f077c9c79360c71e64ddd5c39fc56bfe4b85b4f565a6ba165cb418838eda6668db441839f81b0b8ecc56825cd5e64ddcc69ebb9241283281866916020d18cbbb5abf1395841c96d81bc7d4bb89fc62e6c3d9dd8acad7ed67f6ad572a3f8ab67c182acac4d2267e46d8577afe2d9b04dcb5d11e33a909439c444c694bd86873bbe6fd6ebc3c293cedff1fe356aa4715993bd716f614e91f44b19f718a467d8c8d345e9759544c3a5ac885b296ced708bffc6c0bfabe31db65f659502cf859114b3394999406656d903ad8dbb543288edc97b5c5c89a58545e3f650030abea8dafb360b15f95e88d44e7f5010ae2f9b111daa6023e4496055371ddba9a83db233104348472056c4c6f50daf5564ccbdb33ac8f02a176e9fc74336f6c0d0eb0f7f78d55f052dad641cf97f4681baedc52611db70a0065ab680586e4dc6827f4e5a913ecae5627ff7b2cd69f253b1d6587f9961e61e75754f3cde176107fed8769898337c84d446ce33dd1767afe323d930e82784ceb7b1c38ab00192738d9bda2b21cb1a14b71a2aff00fc778200d2bc5487d56e88278ab4d6059d8501ed5cf53079826c66af26d59a9ebf8f102164942709736e203a745fe7784a03abc0a776b18ffd23a81f79d26e434a2e99e65b25c407c2d1891809527412e384523a47f3990bf4fe3f9580c0dce5c3994e5c299bb0214516b73e39062f9054f743541fe824840bdd3631df12fbbbae6e1ddd98dc320b9f3d0645ba2f7a32eba11ec9049cd63cc90d9164ed92b945b459200a9fbc2c1e346c88b975e4299cc5a811f88f9ce9633695144495fc98ad1bc1689b6d0fb5b4b9e90a7a5a7ebe2c6c6455f8c4945e34ee2b70e82503f4d3161e517e09ac115f5c0398fd043b2c8eb18a5aae2d2891e0009c5bd9c18c63a8914ef64e4d9de132ac55ff9bf24648361d3339ed8541d3b4543b754893532fcf648f49532382a78fb037d218756c012e2aa99da5a77328c13fa1588c9842c7ceb2318f7c15607d10625f78dbf378ee1789d6885adb50f5c334a768f45406d15ae898621355b16dce505877864802f532ffac78e8cbfa920bab7f1061cf11c5326372506ebf554987db1f59413611c9c0373345be3e612b3581adfcd328e283c1f8881ad1c09cef665d1e668047ac2274ae2fda0c7045019040875de7208ebdf48fa4fcfe533fbb80abd5db7b06fb00702fc440dab58bc46a5627823c55e39a5a3178e72df204f8346c9fcc7b212e81d47d8c571fcfa257a63f75faa6f50f3957836d1e0b41e7d2daa533a8852f1d4bd56afa2c189d4dcac7df6440911f87891371ef9603d9df1fc3859d549a2eb94ac3365acc0265fc9c2686a2e36fca53073ee1b65bec258f4dfc9d5e341cd09a88de63c15ab953ccaa12714488e23b6ac383e8b1bb84a9c7e1920d080f0912dd8cf222ac1b9acbc31a04374ea494ef68283ff906d0ba6c1f63071a86dde361f66bd4f773d43f3825f20c666899dd954043dca2997533dac459ee0fd602a1c564637b1eb7f6f726806a6d1c9e22039b85ec37d2119a31046487e21395182345175755e5b3ca698d5e1f114d66a67353e232bce7a0f9407909b0fd87f7e0ccebbec2a51368bb3bfa5bca5e2227b3abf6e7d0690f732d708da63dc58b208ba34c91bd7800e30a5cd653b09b6103d141f4862e41a3fa88df43083935d50b85fbf4708c96bdddaa5c0df9b63aa4517f5ff87e86f5e31ea9b3ec0d3fc4bb79910da9605d032090787c34be9613d68bbe65dff2acfc4f89259fc61ddcf41aea46106de8e312f1432c838d1acdc98874fddb34610168332bbbc9da4fa8d9f8f41f9d64d384cb7f1ca844197952b5cf69c3f6aa3a981418b9b41571b1a60ba7a14311c5beef82f7faae76fe3c6c9ac342264d3261772ea71d785189d3a9d8bf07efbb3f01d84da2498fcd3e5f62d8ba41d5ac481719200002de59cef1b41439715d5b7e84f37fff645e067a32db5164311f69e1d177e42893aee3d7478f52470f5a62b37fab65d6b960651db061d05b3969f82531c697011e4438f910d +result: fail +shared_secret: + +# Private key not reduced +private_key: 8146c5713ed44d53e0993cda37686e1b65f40a076647ed41eca9976ee77981f4c4743788e517eb291eea2e26c2ca7c3dcde694dd996855fae7ddbf41ddeb8ceaa74eb6f9dbc7f4e5028cc4f738d06a6f6196b793e82d8b6987516a4a95b59d6274b9a154d669ad7a85d454ce906cd90aabc30fb68f0b1debb7998772937ee897e4fc854dd1cb7f544b7ea345a01694ec6fbebc080d66c2134591944016ec8cc5443f57f7ffd91fdf90f332a0284314ca6b02f8596ebda7244359d97a9a85cd7f149394067e87826d6c81ef72a056ffdb2c323d3f6384bde0ab5bb5563ea687233af138e2d98f68a2b73fe0377512e6bfe1fc5f74948a348f59654760dedbf616f3ab2e8d428cd754e27746196b38c399a765c6e0f47bd0f3c7e7a888b7e32eeeb0986c8cdc84a546c420b6b37c98fe96e96618b374976cdb8ecb50c6b9bc8d598ae6b46c023b82f3393818ae9d09fbacf8a7f51aa938960332129fbaf26dc0c5489381634320cbf083e6d4f6ebe78c8374b065f71b1f4cdb8ed0d4884771a7d4befae4f7de8edca69db75bee5ccc47cceaa4609a7ac43bc32d8e59cb4abecb38d0b1947245196bc4e367564db6d6af9eb7f8fdb5c3b7f2c7db1214f727489170884ecf09b0547e34a9aac0cc79568e66f695947aad3f5bc104bb45e83956e857803c563e287a2009d7339eb8d28d9796ad69dbbcf525e6cf0e26f8ce07a336cee0648551ed4471fa166aedb5449f64cad9ea5605cbfc51caa38afac0190c5160fdbac6d8712a0bf60dc4bc96dcbbebdfdc43aed9803e611a2a3ddb5fc94008357a0eba6b6af27d5cc744d4a4e3bb97ea0b7cc8b7829cdf45e6039e23b945111e334928c6cd2fa919e97558cc9a79b988d258e86f3acfe8ceab726ddc877e568a69ec6306920c19b3979f33691e8153458ea85eecf38cb60779cc9195ce98ea9c0c54988a4e4df119874cb44b332b8789599a723d56bc0a6edf6ec05787f630bec7dd03aed0c3f4de9d3b7be44fdcad5d192bb5426a86921ed8e4df57abdea99fb7408aebc5a758c5728c7375e4d5c4bb461816bd7583aa2357c83a594d41449f7b7cbaf4e8db3948a8e92cad59b3f83f7c3233833ad8c866abaecd0b39359a0c60da978046ec7039ecb3bbe752045bb15e9adc745bab19287e79d844ddaa9eb89a4513bf49b647e22ba646889adb14b5d473683e05449295f7729a9dd43c03357ec3543258527088d805683d04e6a6dc099f7ea4a72b58fe090797392aa8178f42a599dec8e89b13fcf02a3398a734c75ffcc37a088226fed3ad4eb52af9412069bf0084c3030cde2065d9a83ee598d475f4437782fa3637d8c6a725d60016ed4458811608ae7d39db1706516a9456c665cf8677df21ffa5f79ecf37dec9087fb837747b748df9d558cbfe4e8df9ef6e5369bc0fe35e4089c7ea67383ffdff51f5cca37afa2b8676696feaea7f486ff865d5efbeca6c4b1e39cac3d6ecf23e352f036c639fcce7875ce6939544b58634cb62fe6b80c4a4447cba420dca993bed70d3c69d62da3b956897daf687c6e339f8b45760c4dc0b9ab06773584584b83b9ee3bd765815537986dfcbfb784bb3fb50be3be1e79b9112acf9b7468638978a1cc8a81fdf89d02d9f41f85b4c0e8372c8799e9b7404feda8a73d35417719b44e6961b94c48add81f5e860aca7833bf3cd4ea5425f9df61ea443e480e42df0a1a5b5ac8a43b12fb9b168ecfdbcdb8d1cd82e49fc473c92258eb1522fcf4e47474d6c73f94496d92ff83173b6361c31af5f51029bb45e2eb8aa03d47fba8b3f3744509bf5cdcb358743f1b677ed95ce3149cee5ea13b196dc9c3c5c7b37d5324aca344597870f46ecb4e5b9450b93ff8a69b8ca3c55bc76845a635584cd0c145b67dbd47c15e7d06dc8a1146d11274531eb46da9943d8b777df8344f28b8b12fba249398fcc87e0ed177c4ab34c102f9e4573c883edda5a88cb4104e12e3d9b8a23858ebddaa9c935e5ee57a7da40885379aeee489b4b75dedc761238fdf1969b5f4fa916be7cd084788cf9f521d6a83a89d47e7cae223f5d40d357be0b3a47933a5949a4c9c4fff883a3d723db01843d587e7bcbdcd9ee13c0b643e1e05d425e7669540b3c3444a43b775473189d08ce724b1e4ffff3dbb1976004a66cd09ee955f39e77f0722a726811358dc0f0b76aa90aab8c2dfdd3a4f3e31cdd076947d2b503c73b8805b26d6780d75b86d5f3b50ba899bef229beea7d18fa9016878f3aa8ba392a4b42ec4f92f42ad08ccbe58a18bbc7c8639c04016b9c663ca32ebc31fc82a138970c0cd238b6d1b2f2645fa407504183a125b1abeb622245886b9dccb9f2793147a63227236c9cda173c0546739bca51ab24cf3287cf935a8d870719a62b71728fc5e262662296f9984e485101860679caaa02fa1209e7703e0a5678c496a401cc5c1b834ae8c02d2a61b8c40694c634c80290a2f5b4a63f865ed6689a54201589a3384acc299c054d1cfa25be6ab278530b93616efa35cbd0ac8fd367923bd89cfa828f1e8a10a6d027ef2417422a491ac1bdd2702d688809b7455824ac902a70b06d54c92d73b2047567a25336fc74a6d8613d6af0a51c0645ed30c19f3231c147ad98e0276654b9277b16e100a2bc1327ed41043b61900d48c1f51c70725133ae31190b90b43da26335a323c13652a04a2e084827f190915548acd4d96323b573aeb2633be0b3061544cb6b80176337adeb4c5eab7c55bb612e9390419a7598dba6a79523f5764ec7fcbcd31b85c41548e1db0cf1aac1dea8031b0c3b9e629b6b9c06ef29628afc979d303355fc4d1a480fcfd0bdd9c04168e772880a4a53d4182ad30b760c89b2787691b40eb56165f321691f3c4880b20a81d08834c9b2d7b2aeb0e537f5ebcaada992ac0a3402e81e18aa1fd1391f00fbb333d46c7ae50373eba628685d15cb1867b952ed05bcaa8a7efce7c825ec58054b2c84d5c69dc22c219cc71d5a92230b9f40f633029c30bc6b266b37bc5e994e14f96d4c568d83db3491e38ae1b4a320d831cdd5a8e582a1e8a43153c347a3c91919ba60d18490baf18ab8a530066a9c35cb7e05915d208294059b161b09a0b8b446c322c9bd6160d7413974a1b11d0b643364432a1a2bacb1c0d70c642b68811b39a69d44974b125655a64075b35cf9cc0d632493ec46307aba8abbc1033eac4e7ad3329c246a08294f3cb141fad16f10b6804f70597dd6ac34b2b40190c36e17325742a4e9386c08b69cf1e0124bdcc2cea6ce77b310262a71ff7017fa1b70deca96dec183f2981975036117656955a5c4f1c674b09c1624c0c48ad2c2584968f511ba5d070ead9c7889e79b1e123c488349a1f5216f351070bc459f3c8cc8314e16b97266d37675b809fe962914d924d0827cf9b41c9fa169612b70ade609bec43e04345e5b97c330d9216a5a7e42632f09e95469e9b3422041c3119de5e845d6e02795806aba9203da928201905e2fa82c6c7229ef074a230a05401cc9e22076e1c372e742c8eeda0fe7aba76ce5baff468cfc93482a1ab5957cbcdb2295ba074038e539be24986cb8297a536fd479b42c8973b7d03d71d74346625f96234b32323b17c3769564a1a82378dd5c4d23a551024c3468e50ad5b97ca5641272711ff4464d62b9619d130de8491430b5ccdbc928b7e411fef80fb942ab322323da20cdc42b5d17a9406e3612b7970b648817e060030d338689665d3aa7cf2b97314f8237afc890b10097d8f304a26b9664844784ac8d00932ed8b32438a28e5b078484b5324d976422324fd0f217314102ea587d6de84b482992d9e6a6cdb3112599942fd76434390c060321d326bc702376d466683ad546b3bc2e47e4b891f3b7d584375dd3859ed58fe94255fe421bbfc7214e3abe265a1465e58c1067bbbf214db3a94c54876725fa0fdd048764921d5b6ba00c3382d5064baf295b30029bf27a88f8f630d5558d595549b65201793229ca2647621648297a66e92917e409cccdf5cb1378b906c3ba731355d57cad41f6148f7a706f850e99e7610d2c78d45b9f699926a4e01527a1a49886ba5fd25ca21c325e21034246c45785127f4859c0a67cc7b76259410b2f408f4e1569c73c54a4da92a40476402573a2973963406290549f4a41a2226131251c5d59d85e1d5123d527576f7c794842974d884e79927f7bf6b09b752cbbfc442934ba461429a3ea921aba995ef12c21116cfe66b132402bdaf690ed95483aec9785e6989e934e7858bd13498f4e994619ea9cd55a9504e40b4d0ccbe8f8cca1f72dbf74caa3975595623c12f22c120c022b59b2cf3748b17199c44cd37f8ea61ba5d8c1bbe50789ce915df9fce1b4cf3c5acd7ce52dfda0237f5f24fca5a18f8f98c916c3e3304d2669330c1042829573e197597d729484ef52db5eaa6df8ec3a0bc5ffa730db0dde8c5f38f266d5c680a78d264a7b96 +ciphertext: 1a2fcfde856f6d8e741237c5e0d0fcd7b58c9886503131c09a9f5db0f76c91349fba53dc31df528f684063909218140888d39923b52ea6b06e55590ddeba2b8173a2945e40c08e965780b225caac8d2b9a66eacb554bde430120b066c6c57ed75b0fc43c08fb4491ea446daf15661ebf4843a22a81059a049fc4fe3d66fcc103b7aad3780f9e21479b75a4f5038a07879ef64d7d12604db56b1f10cbe6ed755e1016e803cf83a0fc5d41354d68bfbf55d65d6c2ef32dfa88541a9cc13cb2beca4786be168e6043afde254a060056259afb94c0e858b59fed243393b7c10c5453852207daa69891bf3054b3af65449bf7a17a2222dd348a06db881cc12c29ac972e347eb8ae56c6008d0ca4927ce7bd482157f123634941db84bba10c7552552362b1d8d08e552f92897f5a75636f649609d25c2a83541b6e3115dffdace94c947036866e22f79b59b7b246e5622e21c4f0914352e09a5866b8dbb113c97c0921ae3e1a1ea0bf726805b4606d15298df0e32eaa974584909ea709b57f8ea6047d908b95a6db05a47b26de1470fc8fecb7b7e53851f732f55b0e4b1c8a1c993bba9a7d22f125849511f124478d468e6b8ebb50f8d11e0ae7f6217e19ebdd57125c04b3df9c1ee65f2940a8b8e24b0a52c012e5c9e2c09103d97477ecb033d7dec5d59fede37c6f95283ef76806926371562cd537c19d6c6fae9bc88d57ea5eb1c8fda0bb8803791fe072bb22f83b9eea89e5fe25e5ece6ddd7764e2aa8cd293b5fa1acf2a831e4bd24e4f91ad27687515f90fdb378c4959fea17ad2ac14721734aebdb0558fb65e88154d11487c89d9880041968a963aa9da09e64521260132f82e39ee1d44f8bacc3c6589af7e049996494790f6f9f5bc6e2fd5518c145dfac55fc339b279552843afa411f6c1d48a940f0c5ceebfb9440b46b8bca9e5a9a7373dc1d003a9bc7e0346e93d440a1ec63ea44ef732b0bdd62febdcc4f7a1acdaf487855e55e8372f6f3bdca58d3c8bff9279e9bde009f1cd6fed525daa609436c55048c06cfd32b5aa0d5d85a607c28047f1f79c74571bf8fcebf00ada66195f0118975f99878fe53bab4e80fd4888788401a5660cf2c8137c553108e1529e4e19932c9d373e72898f5f3a5b4167156834ab1f125a443feba98e898f5336c45027c41d5027e7b319418a6b96fc697450d60a4d8ca418687fb513d53343bebd575b590b1b608b262b1e0cf2e4412e4d659271198c6d5e33231a9d5ac9009b3b275da170470950656844e6e4f7cc0582c9e43c9144b4910048e90a0ecaa92d6b2698914b91c5fd652b1ed6bd624341046c5106e6ee7b4a13abf3e80692af298e0346a383dcb833f615ad69f87fbd1b4f72cd626d78f5bf37b8bdcf76ac984a09ae1a78de07f0e387e455f6e16f37e3ae00a815d997832a86eac07d54767b35e1c426c0fa4cb4df76272045f1169d1748411fc6d79a45bccc476b3e8967981fa9128141b1c85f591bbc239fa68514e65ffc56973028dc9661f1a69e67736ce870eafd4c87c5e2cd3f914e93e5262e8a7e8489b0fe0fae1f238fff41f71574d115be7cacdf1bde432a1e58f2d333860a6605469b5328ef8222ddb9224e1333b260e30d90b75a03dce7c3e4edd4272c3cbef31250c04544fa97ee7a399058a6f230b381215186281edcd6f40ccd84aa9e9c7abc0808dad707bcb93b6cda47d227aeb88930bf68f5723aef9e32e960015dddc944503c131e541771f131a2fef3cb9ceb1896ea98573e2a9f7613c7665758bd3aae087bc574411db82b3a4f7bb71e869ca72a024bac17f41abb843551a28cde20598abf81a82d20d4067b9ddf14208073444755c8bae9420d9f4c1b72777410cf6c10cd7944a158bc636eda4a206ba4a18d3f149af59c5371872c786f7b89cb6b8ca1515250202303887217d7c41ed5ecc66a5528a072b1112165c6339ad27c4ad7ec35e04dcf925903e0ed6bc2a3608c846908cfd0e5ef3c7b2a2fd66d1c19bd79f8ee3ebb1910d010879ade3dabb9cb531247c9c881b1869bfb82e291da45c7896bdcedf7ac87aa72e6270f39951261d5fef37aeb39a8c94f62c78a7cbc0b2a0aafb2046eec47e5012ae49bfd41f46e5428cc90284cf0600a9b9cfd0968650903137ac5091da2aff756e1e39ef133ea7dde4d8ed9943acbeabd396730cb96e3f41e3ad13a94cb56ebf13d3e39597d65af9 +result: fail +shared_secret: + +# Private key not reduced +private_key: 618ce297dfbb990f655166cb0d2d74c206ce030ce9f35fca7f7a66d3f6e9acd48697b3a5d9845f8ccaffe98654b56cba727786ae19c961e447c07ab7b9e3da64c8565a4f9fdca3a01823c30a8335015af472898d963a3407a8da63c6bdf5aa79bf2aa7da47df03b593cb9ec77f998ad949e7711b7639e448a2036b86489489bc41a264d4f78bd436b7810b38a3b729472b26bb47d7d337d575ed265c22b86d46a8c7f1c668e56a66f3d65224fdbfe60b472b9da46398eed587313a45a675b9aaaa7a618ebee65d143ea764c0eacaf0ce244f8e3acb79c9be141b73d9eddbb6db5d27f3dc2ee5e89d3e406f154560d7832cea31d40533a46be8122e6951099f59896d26eec1e898ba033aa6107b703cc7cd358bdd611e8fec45fb5d05f8fd0f45f7a44fdb649c02beb9e51db8990c689758aa607ceba569d75e2c3068e865cd835aceb37a78268e8efcee1c93a619abc71c43d5e6db35b58791e9eddfebca9d3ed37b62b8e8d3befa66d591420cb388a6f48a5792d37e6c63c6949c8d4ce27768ac78a974f4fbe1437cf27d46472df23fa8e2909cf9fb748eaaef53d3e8f4242db4b11f5bb094c7a2f635efadad60abb710f85150d7975036e7fd4341fbd58835b484133d9330d3859f1e40ba2443f6a7db97ce54d5b942a0bea41ee6a30e4c4b919642fcdf88629c68301c363599738a5571deb84358c571311737c12ed1e00c490e9e8260e7e72efbcba6b8544d96a3852debe6f64e957de2cfd9e125236b8a54781c4ab58dac60f747d21c5b6e46bdb4fcbccb224bc7cb1b551ac35fd99a5f9c0cbdffd64d43fb3589fe7748aad2341be9fb1fb2f3ba61f6d53a7a0cc1e186bff1a49cf22c500537933364a7fe257a5519c133aba7ab7648e2f7c6869b65327f3cd03673b0bedeb8c3dada93dd53a4c7099695e804f52454382e85fb86fbc8bd46ec058986d80699e70d39447d66dc9e72a6d8b3274a636a5dfc12a885a5f5e36ab8b10ab8c7d346eeacb7627f16cc411bc7e2b3403d6b5f53c3ef6a6657c2464eacfb796afb6a173af01026b3834bc70feca0130ad46b66e1f608e113ec66017a4b1fad43f53cd2ef0b55f05b6f65783a4dd6641496988e3a84364352967ca2641fe68eb8e4069f9a4d7fc30bae4f840e66934e339973db592d78fa6574dccbf9f17c5b85f3e34e9cfdb35c73b4683abd8b7ddf666ac26deb56d855091d54b3085144a57f74246464bbc226c860607ebd620562c044b9a6e656e774d54914781afef4afe991fa28b049b388d25da3148f914436f234f46779264ddae5725469755a3594cd4fcf29469b8a45d16d27d3247de131c7f304378a6604eec0e437939e5f5f35b3399ffca6c7c9e6273f6ff36fc12f52283f514bbabbacf6e0b9d952043c8d9ac98e89743fafabfdcdbbb10afbd7c646d0116da165e4e309b46fd7e3fc5f05c138d33cd06c3f327ee7009e831aa5b6e1ed54d49761ef4bfc687eb0f607e34e5b8ce18e41056dde704c84203bd2dfbdb78c17883cf7f44495de6096f0ca7f90af3572f278e461fd8e1feae012a8d6f653e317daa1e19e889b7573ca2ddd16cca12b77a27706a34c5775bd494f13eb59002847d23e63e77788660ea497a7bac4ca9167bec2ed37f49d0ef0135876b4d5dc2febbace57d5063dfa90fed223b9374c75f0ae4d75dd3db0c5dd6ed30877beabb108a6659078b7bd56c9c3d6a83f1b43810e9cda1c5c6529e45e5e5dd62e449c7e7a98335efedb5e301a9d72467b4b458089e4f4272d697e27887d5b88b8259d0564ca792a3395649d4f458101ee4f0a5dde8bbb77d64bab264d7c95bc792115bd88e767b3d7c7eafca87dcbf7e8ce989e74817c7f3f349ada4d4bfb3506cc150934f605dccb676b757beb1b5de822c853b986b00599c61a269dc9aeb54227963fc7a7608952e984b90f1da9a91e72b2577c7fd9ad3ce4b3190ad711f46706ea596b0df5841f48ee29f58c5bdd9928aae62d8c4f46f1c7696adb95a7ce9ec39157cc4ab735cad892768850493b4509564ddffd9eaf84c6f86638a1667dad4bf076cb93fb538d02a5c36e38f40c367ba1a7e7fa695dbb7fe359f85c05e740c0cfba1c146dfee6da88785179373ec49680999aa616e7753d3abceb5afced2a60c1cddbb3b9db2be5cac40db107f76c0d2245fe775fc5cb525824bf945b31bdbc0a86b88d8827ae7fc0a3db8bb9f534a21792637765081c4669832bb66485133f61bc22c55f03b109882b9ad7e75fbf12519873a18d9472087a6fb375244b313f6a81b608d88b0f79147282c9c37084b00138e8bc8cb3bbbd2bf9c5f95766040617962651f0556756bb9121a6bf09a515c6836b650c44e9db72cef47e08079945b8cf19d8bb25641186a8c8999103898492a904c5a7f2befc1614b4482931989ff7fc83ab40781ce54fb51866706cb04ec2c1c8813e963c70b0f15567b41ffdda8d02a94d00d1348911be52163f5c44188b6214856763a409040e8480c0f263d966a99ba7c7d5724f225ab99327a962d1497e9b265bd819c2959b1cd7995d138b4d71804fb122730b6133713d68c95d861a3c567c803adc403cc911186327e1726e2881bc9b4b1873091637c5532951c0c01a0999e7740fa77c1c1c847feb3dcd387ba3974e1ad0310f889d05e3508f02443491261c367c94e074009103e8bccf25520c4546c4bcca7aad34aac89892524219ba9b715c470c72c6c67811764926335f722c03b85c509105d6f43f65ea9908d4c61f7947cf70c4ecc08da31aaa6ac1887bd388720cb36e10521dd88d7b2a483fc5833f8694be9892bbf8bb19b6ceb08a133f037371f287956821014b58c6eb9351946303a3b7fa920e32a471f26a18a0b939ff137927c2a79c27a991040fa0d29b5a89124de37fced8109ff634f6313551140a873a6b76245a2538aeba7a234845cb4ef0c9707a4c56f8baee1329864591d09745fec24b1b392f86c47c38a62b613a8e6dc022ecf58d7d81c0f1e11a27296290ba0cb5bc04516a50fd1361c248ce450b54698c28a59274204427c53c68b5f73c739a62f9d57ffbd17f18c06994f0cc58f0979646a7273b9f0d3493db0a23df085524845418695edd526af36ac6b0b4c3346a2f61317ac8e93cf54351e12a752183c7adac04c3a943c463599adb1f4dd18a69d6a933a14447b73c2502374682c8209706cabba3a2c27b2a108ffa23a6b9732f5bd14ff2ec25e9a384a8bc83855c043a372687972112050901f12b9c0ba8ae7676b1446cfb376b1ddb89af260007abb736b5b223044e73dab7b3566c7e361c5eaa54978a6f3f72c31bf499c0854e272005ec603d3a50426b24a35721c0f1613d55e68e92682217401b9a21af9296989e75588143495907cae38c231c7521197258ecc60bf0409e4729ce5bd436749343a449a9450c5b2af817db83210f9738c0029ba26835c73c4a2b85255b42af98703d1d47106e2b3bf3f6c90c1b0c88e40f13e18f4870aa42555c08e00aad7760321c6fa8151768930cd7c12d1b6149fb679d35e981319b566108b56b98cf1efb9ecb9a3efbb6ac471c6f0f207569eb2022ea0fb0048207e96a7dc805d0d07de1541531848d670817463bbed673b5071227665a157bdb5509eb09873a00b8c98c48a3c131e029576b76f49b7d0152bceb0bb499ac6bece46f54f16b5d7414c8bc27dfdc9948077c090304acd20a4955b350f22253576780696aff4998daab028632ce4b3a372fca46b0bb33f23a52a93c31dcbba882a925c9c6c0c4546ac152a0eac489e9b27ce9c89aeab652920690b6b9944fc6b807d896cce9bf0a0908f05322e184bb7c5b2a4d7459ea75bc700424f884925a2a83cc95241e7701944ccd53271f8b1992afac3bd3f63af3228e9b84a5d1a9483d5502dac28f992531ece7ccec18b14bac48f1f62039861e90cb8ec0681d059788ed147d1e10115aaab25b6b41a66a5e1388557ad56eeee6571ef418a5f0b797352cc013a1176c3b131b499008319c121185a976c5831bd3258b7bd7b3852aa12fb77e9db085389c0a9e1033eb224835d4793c8603296c965bbc699f87b328db504b335fe83010432a4ef2a0b0a4300e29309e3370660f9b21bbd79382970dbf4750b3e142d5f7c381030901e7c09218636feb3062d43ec75a7ff9a640005c1f08669c50d6a41fa86790f2bb41e7cdb401c06c3c035fb812ae2013604422a7e3c1e6aa437ac4261f7834fa95be9e71001b65bd2e0417164142f2bc80366a8e5e1ace65108771b321da81100397a117f00515b6a2c934599416cad1d5091bd23708e45eb6f90a2fb5c47c8c77d6e395a6332a45f4178b0959466f648ec5c43422397d4e771f902db7b8d876a028f1708e233dc266d76c52b2a849f00690ffb252699d5b3e9f66e0abd3c1362c39cedbc6985099daf37400cfe59841afc412ec97f2929dc84a6f3c36f378ee84ce3e46cd1209 +ciphertext: 61ffa8da30b8111f68c0776905a752fcf8f1f80af8eabb1615649d627412682dd49d521db32e66c36ff89bc7ca88249eb8fda2ff7b70ccf84c79f851d0c7179d3f2ec1b53771c7ca92fb2f9ae2b11d10696a6fc3be2b07fe57b634611e7b3f5d940dc0c9d8aa9a8824b454166c71e50b391ddc109647b68d12e51271e24f64d2d58a6f0567d313781d2c240da9eb8354578c3288eb08ea63801d5364e2802179087c32bdaf8287246ab1a63ec11dab95eaf2a0a41c73a4b5cf3105909dacd0b2fc166f27a287a6aeab0dfb2447a707d880fcaa73f6db886a64e04e2d3a6a8e95a995ec17c39931abc21038efb704750c58db92a20d06136c5fe0295711efbe0cf67b9eb8c20825a77e840dfb7126a3957784e7a6bb17c1cf75fcddb167eb13103f51017240e5da251a498f34edcba91030439821767f969422ee72e27e83e64ba70bf74749ec86c7d6dedb95533e8e3f749650ccd1dbc2e13522fd2f8c70d8a8ea2bcf60b66043853f787d0bed1dfcb0191aedb50585e60b00332cdcc870b467ef5d5d233b2005affcfa5b38ecce4402c572e6b22d3d7535449c8073703d663cb68a91cedd532bbadfdb8a51400d478e33e5c8ff796977e56ecdf74918616a435c3df762f67c2d52c0c332d2498ab4505e2fb5ceefdd16ac5a49919d11be701f476be075e9edd9152539d08c842bff9d332c9c0e7c50c352c2fa96f2b3c50b85f61bd4c21069ce034f9bc460069e7498489322207ce5b5039243a454b9ac824a250fd9b897e1360b1a0cddfaa2544cc09248cbdc0e511bfd4b145e12c8c29b4ee81c3fb0d0c970116b1d0e773f463946ba0215e1afff098fe0c47d9e27439139c7210c419a8e33e0a13fda22604a72872d6dd55fc9be361c299cd32cf5e702967d7c7be8372f6144166bebb05e636268a728c1dc562bc2acaaf1194fc53913ee49be9e297274e690da76a1ce422bf60dc5569faeff4c134c6a72994e441f9ccbe2be5aac361b18ed89ca8ffbeedec74c3d6a3f47154896ec2d5194777d294e9b2d9c23a9b95d3d32800c2b53c166abe25e6949e20fcaa274a792ad6a798a3ef1ab454f708075c75352a6232c5943753f2d164c049de891ccf7e2f0e7331b63f55755566a31f8c8783b6d23c04865187e8a5be7d50c0ab3b1a08bc0b0c8563ddd763a27aa88b67430c5b96fb35e8230c77d0fc501266329c454b9af4c1717f30f145b32a576978ff8c177d738c02980bab45ba5d1932ab73dbec31ffc8dcc66b79b17e35d1a5ca26d10b7a95e859e4266cd8bfe57282f47ef22965e8dca78ca6e4d2f29b036b86692d425528c01f14298069ff40a423cd2011ce382b06d8f6a6b903fa2375a9c9e1123d6af61e7117c5af42907cd3fd04659b239c64e8034cdd351f0afd0de22f3b8108115f9ccb0e977c7fe72a62910bccea232d018b0619eba0871f3b0f63dbb70b852c51757c7da18d971406a86a023435e4fd726746f7da90cd78403410636ce370ff08f716985d7b61405783858d9a8a93f8c6c790b276379003dc2f731694958fdde91147f0dce55060d2bc82f12fd59679a4d5cc7624860aa953227b602316fb8a8e7f4ad7309740cb86866d8748ecc7d46acdb967ed1346ebf98724d5308128ab8dabb6e7a92da6b34654e9f5c7dbc56f2de6eb26a411ea831fdcef744cecf3d736bb607e4125bac94f6ca0d2fc777558be89c2b89cb99fbcc2d213ea8639f4c2d32904628825b3fc224f107b78e2ea7cb4a18e6d74a67d9dcc68012b52e89030b1e425d3c09860368278b27fc091f4bfb87a118916d82305314167c2dab043b3e24570e5a652c4aafaecbe625f7763a4642129b20862953633f8cfe5dabc9f83b8ea99de18aea3110d025e7ba3c8ba128940747fce99d0eb824a68f7724fdb51a721a167e8e791db9d9a1e10e5fea66f981d2e0f33dab616d1037635a1c36bf85248643e5144e36ab80b759e693d09c1cfadca3488eb5a6b141b55e46358414e8c0755f2b5edd91859b02fffc3f1ab9eb6569e076bbd5bcd0f2fa6d97a95b96b9cf21f31030b36dae0115cb6acb43ecf9a59cc53dc02627d31d5f17857061491bea48b0b01d2c73e5bf8eea1333cfcf247895347d7e473a551307c0f77b3065335592071dbb0b2a56fd5a52323651999cf68efed856860a5cbb84bf8783b790e6a5833f70aae68ea0bf8d220616e1c4b40fad5e1ea5 +result: fail +shared_secret: + +# Private key not reduced +private_key: de8539328cd09f47e24e0d9dc4eee2be749b80e86ce81a4edcd8d2e757aeefbdbca029441eefe93c568063599dc8d87209775224a792fb1fdeab0faaafbdc444336d94d38a1a156dde5de4071ce97f5f7d33ba3a40b496c80beaf61353cb3fad986664cde663862534a745eceea4779fec825f8ca93aea7f23883548989f23f77a25f99ba847b427e3e9145cc8e32656e83b629505db025f63c75ca8778650624ab740acdf45964a8cf466d2fc954188d7a58ea1d216f62abe7df583b2551f43433e6153fb5d45f67bbb7df4f628d252b6b5476fcb2ad793704c51fde4bcc758314dec86e685eecd7ad324bae23109c38d356b0dfc9677cd87bd7c94597ea33e46c0924b8e8e1b6777f530615a5e3b7ec95ca532c8255e8eb6afa2bd570be3b810de974b27dc3c03d659d998e0684f920becd4fa79b5bb5aff34443c1cea5423c42833b9754bef98e46a024cb1d3074b010ed2803be05a89b95c3d6a7d546f1d357ccf3dfa71043ac2859265cb768a29cea15e810a08965c773546768c09a66aa777e0ed95426917dfc886a30ec4fe33c4cd7ca650cff5aba39b7b0ae6f311c9f13a8d5e89dcb14507c0dbaa6ded775bd21d7fa2eec5d2b6eba9d732df58b8845b4966edd1f88d662617943127d1331bf38483bf6188df7b4d82881aa31699ff5cbbe05b65e9ae2eebc7f3ffa6ff3f993dfcccf67d8268f6cfd5da6db58c16fefa6d84c185b469b0f9402265deb72a4332d4377dc356a5b34136de593117651a6cdf0c87580b49fb8643386177e19f4651b7a433d81d4f9b2e6486ab6a6f1fd8ed6b75b93989797472391c3464054eab9e558e1b570ccfe16ec964eeaabb650896bc296c94ad90bceec79b4fdf4e94a2a38ef2fa8c422a0a4d318c62cc94dea2379cceada4fd7ec1fd77591345f0b8cad037f688f2b3d57fac7fc5e6b3d4be652c2567b19fb7add6a543ce82c579a366e6f0c204df5aae39846d9df9dfc6a84dee056632401de32ec9a3cf9dd8933d4ddf74411d3932c37d89dc987e8a3755fc1ed629887e0f5e8acdae8110ebb53a4898019eab4c156185c8965adced16e7d2efd3d1fa88a20c5b4fdb24a25e0a6822c9cd9d6b7a096cfe15cdf7ee3831a0cd827c5c393fb6c3eee59cf325d31e5baeb7bd8753c7aa0cc7cf8abb926298c44445fb51eefe7f2474aa065eb7ce6b1b76df3a1a80dd46e51c8b40bb265cbafc87c526b89b96dde45e37712ed402734fc2a3568aab6e761f33f5da9a7f846f5e4c7d318595f1989d5583e2d8aef61e74ffc94bf3e6378d610ad46deeef0e47f3e789d552ede0cbb7dad09e3acba674394bd6de7aa856953f10bbfec8fe82996695d4bbacc5457b904b7df2fcc73bdb62c047b3c7377e5d4eb2470af0562c57d5ad9c6ba7e0c7675e277f63cd06781a5b63a58c36c953e7509540a91d63cf97af65249eb6648291fedc628be029fb593a05cb575c3f64ff80d367cffd0c9a8443836235b9030ec5a8c53380b4b3c669936f965337acc72c05ac5b54efd8dab2bb5f59e38c9b87c98bcd9646aa397962ae60c87e8808d4e4debd5742189ec483dfec1fdd92f84296dbb97a453f7f5bd9c965a6652894e92350f097b185aebccb17f8ee7dc0db7ddb3e4bec6dfd790135a329b6b3c86c748ae6840ef581939c81ccec3849fe5821643e4b4ecd9b48b1e0979a964c858efddc67a7dba38ea4d70678d62adb6e5b93cf7b5297d6f19c17336714d7d837f492de37bfccab4709984aba8a394f415ec337e6eb5e22b4855abbf1bb394c470881bfcf5f21238bce98caa9a44e06277870a74426bb927b46cb640ede116bc9433fc5674d6b7adee99dde6dbedaad1404ae4f98ba38b58d6f6b7b460af2248bdd93d58b018ec5473aa14c7964d5649674afe4033c34528a8b52dd857ad3b18699cf7b0f5e84e9e788e9d6e71cd11cdb3b2a2de9e32f5697afc61d0787fe445b6e36c6434ef88f3854e52aabd1295cba17fadf5b756bae9c9b079085dfd4ea1bc7b65a34a2e8894fcbca16c4fde04e5b40b73d5bb36ad37e4b233c899fe4f0416dfa9bdfd8c13e88589e323a9b706a35cbb9f935de1633d1b6b877d5c402f9fe8d16e17ea4a8fc7d9de923f0d5aa554d77a945c3dc137d31030858c066556c957fa98e3bf9f4bea25f57905a4de4f12b6f27cc55032582857549f3ba0d6bafeee47ca2e2cee04b023b066f53f75a5dfaa0aca416ed16cabdb510564738aa08134346757f92585ac112c25a6e0723958b7b23bed41a126617b4dc30de275bce903a1c6c2a28c5c58c49a5f0c447fb0c86f5b6a6e9d271383588ec398fe6928f04b67ead2633ee174564cb2115a55d8a53971e0c9fe2a209f9c8745467bb8d9944e6c1bbc8a54a5d28cf82e8815a3615dec5695d00c0e72b2f7c483f72d36d2f091cd169311a283a42d608d0d66e020172a6a799a66c10aa9b93a9dc5caefc805cd77d567390bf017693db8b33392bcf96011dc88287375bee828341e5a515a97c019895c8e68d41c0675723af42b6a50da91d04c9880d21a5af9929362411f5b36c75199211da655f454539aa399ec276af29011fc2b5e7f5534461220ec3ad3869178109a282e8a960b6119d0a4ce801d05150c636d20d70dbb092999bd2ab9597a0b1de56086c27ca8f5c22b86995e5aaa9f6514323a31750eb794adc1ea1247317f82eb443604ff254e99a895436060291afccaaa1fa26b20fbb9f48e462851513f7707a5c3461e3f4b3b4e72ba3089c53fb85b9c0576c06b2dc832fafb929c3b34de6974021378356fbc4e1282884d062b831b9adac1eece03f5be7c9c7e8b69b1a7a79304842231f0ba1107079416b388a074ccddae26b4d22693f95a8bbcb2f3445ccf74abb702428fd3a04bea9ce55b6c251c57b6ff10232a6a85832530835883336a10992cd30144b757ab6a6377389e36093e218bd09cca1504400a7a473e248ccd40567637183ccbab9bb2dde7198abf35df8f8c836e1bfe061448b133898fa6ce3abc79beb4ac8d9997c12588c908aa1002b2570a64654c8bb3c1914583748b95d13f9619659ab4c8687f872030df926ee04b6a74047b995625b1a9a929a7fad134f989c7cac25c42817bd9f45327725474a629df0944f5fd3bf06057355f2843e8157115361cd627ee6d548230a89ad49bf1b156e50cba74fc19a63ea2e01796b6ef4a37d4212897346da865f5c36cc49a6954a8a868ae195bc4625300716d3b3692e683a10d9192e2ac5d096c465126730a9b72bb3a729a7cf39922674e39900dbbf91b2785e301ad8a3843f875361b5c4ee0953ae34a583b36d0f54cc194800be6b0a6465479c51999d5029ff50117d5498e8c6a0c81bbdfc6c220b21a310993fd5e7691834732e358faaca460fa26ad20044dbb7177c47736c412bc9011f09a0ba4d22aefb485a524bbb8f74bddcf78358c8addec550b86895fc3141682c0c323210ed756864910c9446c7d9983cfa98ce9edc644967cc93b7008e3c9166ccbffad008cca6569ae913e7327c26032744758f2e82a70f8a399ac72657995ef2754e3184c263ab93ced1510bba1d0838a13aa2cb9d7a25c236a37ec37fc5c0093bb47dace9944d077f5c837d78c54e3fb1cb0e8a70c4a18b6e8b95f6b7be2b79b802055ad4ea5febe770c39757ac42a09feac48b6174bee79621bb3af7d0a0094895cc8b6aacf722eeb76abf6b6f0d66bdc545c68c845b22cb167f96a0448b0cf812c46793a28b55a600a1431374b570c93d6dd7b4f789101e578e29d96b2384a8e09115f9e1c8dd008d0047926c17285dd996690b4ee9957cde5ba56451bc2de46371738e65744fbbb558537b33581998dd0525ebb9c17d9777a701a676956a03bb4911070d83b603f5169f66838cb671627b899e9706be9460ccbda50135d504e2709ac31c48c4fa67eaa740bcba4173ec25fd7766bca198fe4122fe93be5b646b1a475c74ac276bca3904a7c119b057dd2bbade1701ff249f484a4bef04392122c416aaacd5726a273066fc510f394903b5f34860206d8c45a4cc340440179694223b8eb578c5bac2cdd183507946e3d02c0e219ae33008e19822d77acfe5c85bfee7a0b6aa0eada58ad1ca5ba1e12ac92063c326ac4140250be091b2095f568ac7b483acafd7045a229954b8583a33376ca7b19a948a10c4a45a5b80d403c89773b7c2c67ad1358bf2900e8a793dee71b91c978c389b4d8c824937e921a17914c6d1a4bdd6460a2c7cac50cbb2f006ce9c98c7a3342f9acfe11094b249870afc3e15800701d606471a7a0dfcc073c277bb74706e5571f81cae7331a7d1e36dfb437d7d52957526bda146bfa3530dfc93063fecb103ce58c30abb5bb70c6dbc92e5f3bf40602bfa2721399623d76222e93d092c34792aa8308d8999aac7e17433da2166292bda1804ddb5aa9b1c6a47a98f8505a49bae2affde5fe75e69e828e546a6771004 +ciphertext: 77f22646c2e9df7da84340db963c6c521ce4eaac3b2ee0b081f60f15ed977007439c1f2c1a434a753885d909ca9397c4676653626ef814145fe6316c30fdefef47778f3b98547003b3d3cca6351d35ca4eb5504710ed90fd32f0b91ca9947f8521b567419646e075202f8ce6c2d06e8e26700d7dfb2f29a2c1ab60b41aa56937417076a5788fc5cf1dbe371b20019ae99c33c557db0142443e3cb2587b51c8839e47060dab64d9f1ef45d2d6f49a7a586f9d1838efb3c2fd1d733995f87e2dbb324781e8086248024efd5a916ba0eddc2122d362328c4fda90a294722cb1b547a78ccfbebd6628cf16dfbd94c8fa743bafbb825b792823ddf247d72db72d9b600ffffa0df9e5a45bf62e42fd3f46d93d4d10ebbc39851dab8b2103a3c643440a2897f31cb12ef49dbddf9250c16c148d05eb51874b214bd400f959ccce73d41b3e0c1cf3696743d47724f40cbb1d6d2f1515a2df9d18859628fa4674c6b1401d03763f9b2ca9de2820f0ff5d65f25d3acae5fa0b2d2b970f50fecbbad74f91dff754543a7986666f123faf6d32295b1c1fe950d507bf95ecf966eca6a9abc98c9b08ae039f25ab5f7835e533ce17b4cd801880b17c9bf942796687fc3ac888578f3d21be15d3cbef45e196a81a19edf3d87c818102c696c230dd028f5d89bac044c02b0735877f78e6e84c6069bb6c6624c381f063fe3613ff2a1d2393c4517b8658d3a4ca568c79b6ab1a6c8e06a9fcdb3c8e15d679df23187452007dbfcddeb1dde7583293c98ffb87f83c4626833d941b2eee611696763d9779c31ee8acd31e8382f1aae2140972fa74f9aee07d9d83e6f2ba707401783342a8a133f57caf9cd88e41ff752df945997b7ee91c450758a73533e83ff15f6f3ecd72eb1f33abe1651cae93ecbf4c28fb7b4de4cdbf957385e84a19f0dae52ba23097230f4db6bef2cdf6939494a68042d821ef4ca2872c9a13ba4048e202ba5ec21a0eae5e46e20829dd889051910e5df7d78e7c0f24d62ea928ecf5c952098694e7828d59d3bbeb3394e51b634cdd39f4f6cef6f02a8d49dece71660445eab37573fea3c1bae06a9a42d42beefd39b9a6576fe290483150bba21255eded67cb351338e45906e80a055c21ecdd1e51b05164f01549af64978863ca3c5223a614a8d4268f3b515b680b9538d33490c1092d86af2aeb8e9cfe4a786d69dbb27ce746dc775c544fa4a05ffed255cc27926d6beb5e61b97c2711c7abb1c2dfc340b89d8a732fa6c06acd53bde442c97193cf60e1422bf32679d20417a0e56b110fbc6a6dbcfd4c56fa7c7f37acf042401a59f0ba1d8b87c0d3eba3c7f058a45be0b4743a18fa88dabdcc198ac263d9f449bee8aa06967d007be82844a9416d7c87ea940c1874fa99d2a83706da36713ba539211152dfe78169f39b0e74a8523e1211a102fece7b25e56da3bc708686e288415054d9562bc326cd54e564c57cc9bdf19462c1f7c7e04f6202d888837719192db89bd81f3ae7e5bf97e38ff27af9009361e6688b2316790a5062865d0e1763e7578fe78e02267055cd39dfb9e662791ba909039e7ba88cfaf04ac4a3efaaa0caf3c35049c6dddb2776633c4d2599c062dda533ae3efec032d91448b5e5afb27d623724bd03070ccabe02cfe605535bb95dee8777e02c28a96193d74abbcac8ce7ff28988ba448ffebb5910b414c1e9aca70f2e6f8b8d2405524eba4bc0b0620cdcca7fb794849f10be427a9910b5eb7f78ed9b2a7d682dac5fed4c79385e3521d69d8064d065a4fd796e1ede3d864b007517690074e6c07b8cf1da174e2d15fe638470e4c3d7486e6229d9cf57089bad78558612d4dd0d04c0701da389bd8204f1525ab377d5416b0153c07237f54376d35ad4afcf6f079c9bf9df8606b6c2dfa775e2cb55ec807303bd5ae3f5a368c1ea86ad311e697d199c8e4dee3e2969ab6c726a2791a517d6f705e96531e0cf06366b22013117917ec154ffc93596f56a9dc366f467f52ef12c15de01d744b42d1fbc0958c85d07003f2f3414fca21edb4a428619df21034d8babcfce9d4cdc48c55768430053e039f6f757911b6370971a673e435cd36cf1612bc7711f6b0246bdbdd3a179d6eb61b2057db48e96539ba542d4acdb1498e71e9ba15c6ecd960a4f33fc9247b9c20ec5cb01bc1029ade985cb196e44b7a5b787f94e4a3f88307ea98829bf7d36 +result: fail +shared_secret: + +# Private key not reduced +private_key: 769f584ba97569a4cc9d9e8d9dfbf312f8e719fb4286d67866e9a14fa947f32d692def9d0f68a97f95ee5c938db1587180ecae36fcbdb8fbe9d973d2bf38a02f1ef8fa66fba7b9f60c8734618e4ff41fed511482f4f731faae52cb4fc9202850040f5c5badc77698bb5b778c1f864d697cddd4d634432ff4c8de4287e6f5b53fd6241daf95ddd5636c8f15a486e3ea3151c5f30e337aaa69f35bf7968d9c7b067b8d1be6f47326d47d0568ae05e5f725befea696f01f4f1008f3d45773e89df2683db8aa043f812f9ae33dd73949fa3c4fc0f3833da4be8b39cf43f0b7f760b9e7581bc6d2784cd4b796e79effbde666fbda9cea6ffa3234fa654d32f144c4914d31101ce2ae7a3aa52aa3effdff289d9736a8bf9f8992079c76168dd1c65bd8428a5acd67762e0ec4009d4ee71c3c9047751d89b0f71fdffe848bf40e3a5e4c5c3db6457c55bfc8e6ff6db63fd4bbeb52ad6b43f8b7efadab5987bda88f78d81ead53a6b5fe58ba81c5931cabeedc74643115bba84ca0621a9c3e49325f8b583725e4283fc4e0ea713f36c6fbc3c90a467757c798ede3368015b95b6fadb0b6fa1255fabdda5e0b9a882eabc2f125d157e8aa961de0eff5ef29b3c88f23fa02f3e1fd75497cefe82804f9d0cefbc47ef50b3a765f1ffd70bc3544b55df119adbb5c633a9e72ccc7bb6f49ff04dcd2f96aab65edb46744abfe9acc869487f929317beec1045d8556f688be7c34083dfa79e54f68683cd066c537366bfc9e8b3916a8b13db0cc23d1e1e4b7098a47cbb46d417caa014e8e912d629ebdbc598bfa9008cfde2bbcc777ac7bd55f2215502fcb3f813d75037a56e70c8b4f3b44b92698257edbcdde5ca8a3c52357bd582c52eb2e7b236f7ed9eca00e49de7e99de626b75af7bb9f5d8a05c293642d5eb0d399d9e5f50b1a7f4d22b3f111d389bc38753ad32622bc44fc4ba075bdb1ee753f73d5931fc3cb8bdc88fbba272fd722e73c83e8c49a22dcd323d471a78c10df4cf52a5f829e596bd75eab39c430c4c4904b55ec0bd6f7474ddffb4dd77ce5e3779bb752ccb3d86ad225b83342d8ec12c50b7f9f3a9f67b3e77aa55a8486cba6efab46ce56a7adc9f739b264617ccbdf504ee5797873b4fb36f26a6fae3e0df949f9c77d0154d31376fffd563de0326340103e48847c363f4d0477baff7c38ba473ea1a5e7bdc6eb8cd3868a7c6bde90a97d68ffb9c6be7bf05c6092fa705179d018a324e0ca09b54998ca8ac189bd037e4b563b479c479556269ecd4ed6f64bb83057631b243cd9828e9a3655f68c5d6fd0cb52237c9b9166d07f46a45dffc037b7b0735dcb5088a96473c9e2f5b79aa8c09245d8b9a71496ac9ce658d0cd3f9a1bb3fbd03c433f4e3f355515b2373d8158a4066f501fc46c0e7a4e913f9354fa2d8ccdfb27ae476dfad52dceb9a2f9c4de5a78b8bd7d84475b5e865169d916a4978dc07f248838140896e210a3c328486a315a9e15592b9945730cccd1fd75ed55a74f4897e63b3a1d8b96d512ecbd0c8e41176af3aa4a69ae6c6354e9246ba662f5739e46991b09c631dc4d7e1a94eea07e8f92a977a448e6799ebe30d6da047eaa1bdc581db7a615d80534bf427194df60dc4d5de7a24a6a98f96714556cba493f7ba2abeca8cd6ffd3821346f1cbe68d9d1eb07ff458e584848473431b488ed683daeb36d93298d58b653cfe453ee00c3d97d35e516e660f246ff10c75f6ba6b404a48d537a847cd6d02c7f4256fb0c0b8dcbff9d22d97852c39d888dd766f08edbaad8f0f06bf00d6996ca6fec04e3973a7d9bbcabe7e87df01fc720c0de6e825e7d1a7ac1fa69236d452f783c0dcb65cfeed91c0b8abbdb8b840efe34e7434453cf1bfccdd5fc8ef632cfafb2cdf65fad172999c6888b2c39a8269fc383c16e05a44e94d8bb64e3ebd56e86e5c3758293b7844fc5412a7b7d9cb9a6154f0be2cd79ae9830a494f356b99e9a8ee55b5cdf20bf37f2a8eabb86532bdde43fd7c0e2adb198bb198ca8252763b6297fac7c742ba14d84df82f543bd67c23b72fcb51dfc9a4fa2958ce1cfea4265c1654bb219dba81273e83faab505871ddfa6c7616fb3308ae5e8e43e25879323d431a16ce5e7b62ba9b90dc776e788f80d1ffb8cdf7bc885da96c2e9eda28d6227d7f1e778910b9afed44842d78417cd027f819699af6b0ab475a18b7359817b50c306bba0728c5a9088e667dcb7944af6c10ba86300308165c1242cbe8708c8347c44ab77478304efc0a9e5328f203b90108418fd1b5b7c3b085e74cf500729e27719c2596feaa689a54ccb3a5a4a74acf36c652fb97ad49190cc6f08382017db7a910f816701957cdd8449ca075b9a3c18bd88469e3f51e0c967146413bdaa15c38284a726a8935b3987e774a182023cc0acc18a80b8b6909b52b8726881380b204cf1c069415a99556476b0218ebb4217ff33a0593be5f3cc47ef89c13397d68933721c5a6f1241b88f452654c249d35c1a8b16305469586435c1a6156f8520ad33938c8dba429c118154020205b0235262f233c36a89b384d82bbc49b6d6074517a631c5ed285f56585b286462872503da5c3df9c91340071eec625f8b29e4c416e93b46d37f95822ec35c2897417d7181dc9a7097aa74f3a02bf1420b1a568e1d7b1a743c0d07623e2296071912f7db25d67d751fb3b9ffa671403f29d162b635f0c7ae693578d2a752984914eb9036bca365a76861a05075b4b2a95077b6600a42e071d60e21618a689e3f7b5c9836b7451997ef80917f6351f814e2ef1786736a703012d3c9ab9db50b5b9f08bce69ba50a2c48f059dde2181f725cf39f426b39028402acac36bc0797c918d30a4a6d4bdea2927cd75364d167f34db97260039bfccb64b0003ab3532f77353fb6a0433a5a95570c2ccbc77f0e4bec1584cb1a88735f27acf58120d01265cd7236f18af3c00b4363cc372fab07ef3a87030b19b07af020320f1f747e32a8bd1f32e78f1a62960a43327307d8c212d1044689805be15c1c68682d0a8a24ea51267058dc4b15f36e12104ea83e425c248209a8d193911e2a2dfe3a47f485abb226f02919f9bba4014262ffe6b4607bbb511fb5fcc205134f8aae2310245b9c9e73957a2b5b4cfe0916dc1bf6ff891c645b28e63bab6c23e5077a8c3954fb5978ad8e07dac5c5c1fc4759912524566785df222d04435a6a24361178d917b53af57438b46aeeac546bb5207c186bd196bbb6277216d95ab6e545d78e04b82669d19093241b808aedc5db79a9e54762074a0aed86931497917969ca7f20942eee719287c887b3508f23b919418278be0236043acb3e4abac940c44c3aec3ab8c78bcabd84c1d373899369b515c2478c6085ced3b08f668224f950d3b82355468bff0534cc7660045e96ca40067de520091437309f7030f71a250c359f0c71c2f8819b62cb39646b19d63669f679ff9f48ac7a426e3fc1a1d358b675105f28586726304adb8109e104715b6c330f053961207eb96148a866c12c9349fb6aafd1b42f5f80a2d827094c3b4def6478212332d96359fb3450cfa6bee8327ea707b8cc61799105358521c6199607d9b769b38ad15e4b638d12d16aa90aa49cd90b9047696acf9c14cbee59f82b46de5bc644402400baa2e839ac801c70a368a3611cb11a1484dadf30185112f52421196d1797a3085f5d429d286343953ba8de676c381aebf394d0453bf1610905f3b6afdd5299a750f2333b3944067d9a9cc201922f9b5162cc41cbd35400a275717228050a97d05d0c1b303bad3405f36a1218c5c089c98467aa37905b334edb31f667a88c2129c1749784f49b83a329275e1b5fff4798d4b1c5779a5d433ce716bce5763572a29cbddf5b40b464f3e163cd5b554c5612c20726f57244735e2616f45356237263d69a1e1e03cc4d9ad57c83b3075cfaee45418282261d8bb531b685c766989c28ae9f991415907858308a1fa027156b6d3c8c0cf926553b570fd077b6fc419d8f4556655ce53f6802d406781b06463042304477bc8ea19757bb54f2cb54b9276fdd575d5a00c267b1222d4c25de11860dc14a1f3453423caef02bfe8720472c194dd234038f8aa0d3118286b530247b88a83318fda0a9c226cbcf22510f681db3880c2208b70f67c124437dd32ab9120894aa287c7040e06f6cdd0121ede209068238b57716db488335564c316111cdd90741a197646874922ec355a26a7e5ba4af5873f974b2626b40afbbb5c59501fceca0c9fc76fe9b8786ad1c5c76b071b6c054aac0eb8e0535bf8a4249a9256e4c1e8ec673fb5bcae20063a90b601e047e9bac3ba827acfba4a7e9b040776bd6f351e548ee005d759da86c9b2971f9d6d1cab8d517dd00566aba5f53253d778ce06e380b14c9019095028f3944a31a1aa4816d556047447b810cc094d400ab204cf9ae71e3afa68b88586ecb6498c68ac0e51b9 +ciphertext: 5aa2a84d580e3c22578c26b98e9ecfe5088d3af1fc9e3a81d24e25a30df69803be604b3fdfbd4709b7924d39ec03bc1384b0c5b9e601088f96d9ec6a34411126dcf855dd55a800052705656471c5f7e9247abaace66cc8746f5379cb31346a5e0007c52b186b50ee3eec28f8b39ade1a9d0c215d30cd4814bf79a0efc5e18c8de7d4116988f060cf5ae420706f19a88345bdefaa8a59066bcd0ae9586cc338140b77f3f33a2c074c59225f1e649aaf8ad20c39a1bcada26a6c3e4b2cce106dc82c14bc17fdd34f19e757b8436124e2382ae28f34be75d8dc98fea5b636957f7c9bea48237cfada97819af6c1a34dc91b14ab7d694e4f4a5c1e34ec42140f18327756f36594fe64f012b249f4c82291b8fe5bd3e1ed410d80deceabe5ba8a09fe819d8e6a3c191e2390fa0f3c7ce59197e7c070f308cde90cab5498c6dcd6916b44950a404c4405aa24f67859556e35966c7b80c61a794be0199a841adc8a2911d947669c44a38377bf884b2eb0215cb465781c3b81d35ffb677240c86ebb201309771835c422692a82b1e3bfeb4f7cbb64f99a2db5c8bee93759799409c422ae930937a387886612448df9b1b01aec237dbd0f9c4738bc421694c873914568733744cca7e892258168c2ebeb6b307ff5e35546f16dec0c99815210da6dfed3ede3323c9fe2c693dd31e3ebd003197cd497d7af3eef133d611355509af3b9a02aaeea73350472e06de207b12cba089f201866f2d57d27b056d5bbc2e4698412544f88b2a56af7f802b2d5982e4b31997492f8dd419b4ef3e8ba76b52e43e04f0d5bfe24c8854f335a47843d27b42cf7c1f462cc2e5f938d0b20a29942f2d83c232807e021223d8be33f00f1373ac1891f1612d45e26920486b4abcac66f4588accd7e178d2baedd8539b4d35232b0d121939bb664cf9ab70f5a87d4b4cc2d3daa4a37d064e4494174975bb92dfa3f965afbb76535df9cb5c0de541672821423780d102e9152900306752c2bdee5a32dcb375df2ee84cbe6a410a5249c292f5aba70598e4934be4295b9997251c28440f3f647946fbbd4dace8b2be424ad81114236f2fedc062d5abf4f2beb2b731647af6cf8b07646805c69e624906567da4c75968fdce86c9966090f2b117c153e3a5cfbc4c3d52a611a5936297a60171151ef3a97b153484ea0ab1efe8a4efe60ed47e0054978e152bd9c026372515a4188d02bc1b93ffa5a6b145539b6318d75a15a5521ae042c8756cd67c5fd611f8d9c44045b7efd5e6348fcf7a6b56adaec686eb5692549a33466080e5886c83c8453c9e4e44fbf0b293b45da5a3064f7abd6986bdf3bfb9000e8d24574f5f81991ece501d4f725218d6a2ea009f525c3619c8685c2c2b34fb2ce1b93764e07dcc1d3cce5d535533fd7dd28ed24ee4dea9f95fb2c0edfc347ec9cd9b49706f70f2884df179759d200487c1e6000a91cc9229c6439c32901be5d357382c9e37b7c6154dc06127d3ae93dcb4ed8fdb44dd109d1256123ad3b3030ddd37b7dec4a715f0bba2514ffc88876e9dd9d66974ba8b5637bd7b829ecfd423e0137685d3d72f534721082b65e644665f580d23599cbac81a283885e41a6e85116fad15e53dd301e38317e74b468fb3f1eb6d54184c5dfd1d8b9f82b36ccecfe689c39ff8dd6dc1d6138aff0057fc9246608440ee5fc70c095b837edc79e31fcf61ae2b07714fb3ef5b2d2a5c1b9ce794b207879f0c5395a6e880ac7e566fa9d695a5180d406f1b1ff96be6b4091d5cd378c6ed4efb3b23a84fc78f5a5566a170244fdaa6bd324fe6d567ee403fe93fe2e4e00cdf0eac1b16cc4ca2df1672f7907c6b240f8d9de657e8a2aaca0c5a9ca982ca0f9e97c92fc273545ace9875ddd46fea0997ad92998653cde6ee29d042422fc33a6107d47470ffc662b2d2dd149778f2170fb509a2bfea4d7dbc4c22635c16c70dba6c180e35a911b67c3f139b4359382690443c06f5dd7b75b78bc82c1e06de357c8f63bdc75bb10cee006b6e41dbfc24afb6d6d73a55e411d2ba2f4a45e635ba341605643554c7cc53510e8aa8520351a374e27265f2d62e0381ebc130561ad53c7e0a6d5e82d37b719162d5ac8580aca912ab9e48243572b52e6283d23f71c827c46b56fd0be4b27d7d1005420e83b65cacdc52f3bf3ec432c51c37af64fb8aa78c35c8728e7e6a7a68ad1060cd8a6fc22e5684b8f +result: fail +shared_secret: + +# Private key not reduced +private_key: 25c969038aaa1199d0417b46199cfc1e7e8005994dfb1dce5eb8b998b5f4dcbea4f4ed716e3e4458ec6de9a7fdc3d988a064cb0c1ecb8255df1055c9f333b2c82541fa9e67787be26c94f7c515a8f905d7f878427e1a5e239547f1d6bd9767437abd68146f4a221af2f5d5ee0ecd582af3dcaae6cc39dce3515efc7eee54c3484602496bf84cb3df5cd3129fbad249dfa06dc7e84855cb1e8b00bca8156edc6b0e9d25e8687489cfc8ddf40d9ffde267359b877adddba93ee7b99b8831efcbc6c915639b7547214e90f4e5d0702bf39a26ecc485841164ffe113372cc3b0e3b4417ef5e17df681ccbcfefa3988922ae51c94e8e52cb49215b1e8cf70812b876d37b092b882ef98a8086ff6ad76ab0bc9e7106ec73d1caddd3deed8a38b9e237a6c345fffbacd6f86c47bfa56bb04b05185607ffad2a17ae3283d710c85a425ad8ccac9c8dcb662fe0650fd0bebe1ba973ea5d79fb9717de44348dbd931dec8f02fd2b4c7849c244436d7b478dff11758801d3e6ac9b5be8a18f661ea78e3be4e87da8c78f8eef2285f01eee6755c5cff986b57bf9032b390bb8453e8d970c709d337757ec39eca907ec9b79ecda16749a73f46ee865ac503a5573962be14a61d3ea6bd3995e51684c1e59d2f8d3b516eb2ce633e7b79fb5503818e349a61155b892db790a6928973e7fb56366b63cfd7a430601d82bde4cac99d4d22f782fcd7c8a03fcd991f5f7ed96b0ef932cd0771324f4437744a5cb74f2dac52932c6c25fcf82caa4e65fc9b38a43e21d3b95cc5bd689dea22d95280457b5a28ff6d9c8fdd197cd22f31f7889af318aa0dba8e3ed6d56fd6687a476a971abe6cb439c055b21c6933c5f58c9409cfdf29ba810b87cba7ef1f3e4256dcaa7ad63a42beeb4c2ce27b8d65c24979b89c96d4afa945de6d20e39c27dcf969cbe32a688a0b4e9c726338f93593005453001b753afca27c84c2576ea63628365cf3d74d9d448d9fb20f1f99b3bed403fc9fc8dac9bd479802f8c3add3929c6db409f73e53fbaa328756a7b3ca8ab8a3341863ca5c625697b4e186de642e7275faf16b6e951f88b9ce64839c56ede048b3aa4692e609549658f130ea3be3569cbdac7c6684c4c67ed43c4e677a5e38c76fb44eaa97a279a7ea1a9e94d83d008ba136c484fa27c05db44066fcaa0207eb6645e2a71c7ae01742082c5fbc879a046373759965b0e5659315d6a8f6cd1035aed5e4a12b09a7abd74d4135653d5d9444775190b3c822c567382af66d1a7d6e19a60a536f60a946a455c71caf3860bd99addbada779ede2c54d5ea88020db44256d5c69ba6ac2bb4181b363c688c2471e737cebb00f536a83c3b30f0a9d46946ff58e4aa8559368d393da4f64da25b805c4e7158b6d0103ca9d1c5b63beb5cfe969677a70ec1385c17a59a065809f5fb99fb647e64bef1ebd800dcb99538eda9446ed600be0932b30ed8b6715e9e3d8bce6a095809dbab0b0f64b6f5a7ac4aabb394e4401c58b935586f10d354be345f9c45cb19d8df8e33063dcd998eef2ec93de4c97e166fad499d6710f9e9faa269b064374d463bcfd96b427b47755d689fb43f0b3e4759bce3f738a72516638d8194c329dfabbfb68f4a6b108ed5d81ba4d5e7dce6e24d772fd8ff7e9663657d3fe9aff2ea8cbcca6def834a711cc7c3baa7485059d7315ae0b395baa55652cf54fc817bb248e9117b933b82bafb156f4841db494d5d6ad0ab37025965f65da2e9fe78777ecda3c9874e6781ad85934da3393b566d58742bd8cc44043ca7b4f68b757ba3e1b49760ee36187d7c706d4cc3569b83be00fd79a391673dfdda14dceeaf1556fc26a4a1139ef4ffe816d5fc292475807f58a2d56eca16be3adc4a7e1a75e1b4bac030eed3af98f57b5516da77b49455ccfca47c0adc70e0935f54be4c353e724a35a8fd663fd2ca7107c8e4f1ae4d30b98b6fd3e1cb568332cdf14e7756aa4901313842447ad98874165f8372334869e89c82eb3642ace3f442a3f709fa9a3f75b931b97b5e4d8054f371babb4509c5e1b9972678d5b778ce253fba72a839f9e7fd02cdfd75788ceca1f69f1fe408f8ed3122fb108fee487dd96b1faab348c5aa46cc63eb38c4935915e037f4238b9be3b59975c6a67fc807a83fb0ac436728f5cd0f74d1cb3c6a7f721c4039b10482990923aba0427e2da5bdd30bd55133989a5b43bc371d2105415e76ba18786237c7151548b26005961fb2a9e737e39bbaf97f612cacc3ebbd216f9f57873f97c503a95a49a1a113b0c454526a082203b1a27e2fb170ff1b59b0657861567d5565555f11ea31523c42898d6ea1ae260cd98b9cd69f9ae4d19a81365154d24c008bc15d1482665c313c3721cb701c3a407373e1bca5829cf45d484721357d5f83b5cb58b21987d9fb7b77224c03c017e183b31fb4c407ac23312aba708e8bf7f905d68b4895a48cd7a70af6ab9060d959f56a02d7e3672a90a6218fbbc6fb641163674bd736af2764c72c5bc85651be47350507ab81749bb2b6c744520b5b0a3b6633355c0991ce4e1a813615f2e8300366521040049b1054a7741b29af1c300e2c86977af90e820dcfcb8cd967c27102d49fb1683c63553289cc0c62de0e26f7555392187009e0cc5896acd8c3c9a4a7c637a107da325cb7a694e9a1107e889cdc6310671bb6c5b51a35a0169ff7b5158bc6469a71a3e8740e9281f5869180c91cec8e1169e2b377c8174669ca67418116c3cbd2ab61d8a874f9bb767de8973d8425cd118bc9a320453db9c64183248b22af3f489ae69159a056ad113833c2a9fbc56b10d013e911210bdb8cba68a0ff0f0729757bdcdf68b3fc7be480481ff64c4c09825ee52b274e85e544091c3d36f40444d28878d7c19122957348e3c27fbe74685fc1a3c21126064242616bc4aaa5284f5588435140956cf37bc72daf5a73ff6ce452ca689066fd6e118bcd4988660c7c8501c34dcbf1965c66fd95fdac910b9e48093fcb200564b4cfb36c72c3096c5579f736059534d57b7168813439b722d5230b255532d838598d615c1b641a9d5807f33653a1be96835f474d4f1955e3c5bb5c621497c3451003ca76275af98b25a962765e5bf2fe754330a77837288810aa53be9a2564451319405cc38b13401a7f7dc960b5b2096f45a94098a2fb39dcd654f846388cfb4b57b4b92abb321a16a83b3e6953a0724afb47902e581acdc278957100548c735fa5c04a4147e826a77030284615b82fa60bd3619b57bbca10872afea091fc6288ee434d8319f028125a0b5006cacaca8ca6eb95c7ad87c7e499a4ad81bbf79d144ab16ac9cb49743258cf0c83f2b006b1d0585efa0ac7dc722ed6c12170831f0964cae2b6d2f808afdc6223d11b510b949e76a0a4c262748148ce17b38c55cc7eac2bfdf468105bb89298c88c8806b124c7488d606b52b217c81a17ee5ae67cc27f6a3382d50705a9bbb1d3c59f68b8ba9a45ed1c97ea1eaab76903d1f2a1c71a07420f47695d1b68d06c5dc85114ae83204fb4bf16c09385934105c9e2fd803d83542f4aacc3af6b949a63e6d0b0c46ca8a6b4633926c0665bc09b69ca250945c14366d49705658f6cd76964e107497bb42290f4c1471a4ac29a60c3dfcb701770619cb45b0613068091a68b58c7b2a19ca9933cceb112e234014816b7db43beef660100a19377a4200a0806be78d30169c4b747e8208780a14aa53987065936ac4f06b7a710870fca3b1bacb04c2af5e3005a9208b3a03929b864d0e1011cec63b93220e96b480128c20b7675c9a87c1c8e2bab4a7422fe9c16d367928117765458a3803af02332d1bf654e782816b15a5bcc3bcf0213dcbe07c59a92d1b1baf1f217061e197c71223c12746cfc0b0aeb99fea7b29bb3a1300bc266f1692fd8641d6fc594b9894dfcb0c951b8351236087241f7cc3506ca74ccfb4c930fca1be940af6606ffc76bb92b53768294c30370b29b795de63caef451a18317384299168b77793e22fe0fc03e4c064cbb6979b38871eb11c5650587dbb31eec0cf7ce128f535b0545ba98af5ab4bc186ea1081ae15bedef5945410c800553d8a2211e8e16125d4a7cf25a91f13858e1cccb8e56481a5a3bbc3468bb624f282069425c8b5462725a813bbe53c1cb11bbfa242c2a1619763448af184958cc333c3aefd35c4a4861c5cfb2ee1b0c39b0c73314aa3d191b6406caa94d8280d8b01e1b73e56f5bdbba80fb3923a4b608543ac827395cad1b050530b5e908231c324132d782994753284927f3a379f71603036a172ef58018cfbb879f29a42a106bb32a384db6e033401fa46045b035ed2b3f277ee6bc7b69ea2a0946112498da4ee64a2be6ab49596c4e61553e1164dd2d4c9cfe0e22188f2bb5e538a054c904cdd0d6dd921af93591f4a37e9ea2b5c8d6c42e7270ee2b77b6045385f3d175984a0e260363166c73b0c70c971644363 +ciphertext: 72e827fd0a9213b7233fb4f586a9e7658e4d9af82f46552bbf29cbc288757c90fd64f98f0a9ded011ab822f9f9555cff8eef77867af89244230e81ea24a9a8bf3fe80459b1462c163b50708c7ad66bd1a2d0b543e0a1d731aac2cbae9094daf15d472a3e4e4e215c8ab38ebca960e4473214f7db59eb183ab71c72beda92eff09d995b4d6a94da0db0cb91658e0747c09d74561a1d5d1a7f983cb0a3672c1c342fb5bc8455261646195143f41e54e83a9efed0b3ddd7173640b2a8fd9b4adef0848d94129f45b09bbc88fe7267e4855b1058e6df5a73901d44f1099d48b560bb3fc5dfadf9124973ea5762183b952766a11fe1909342ccedb0b14d56571435e38a43995e19bc5d3771b0e28d87aa882d052155dc332acf2dbdc2fe6c4b21b719735fe77998c837e9b871d15f6863ba17d28e371e31ee2a066bf9d3f9dc25969c78936afb7533d8b611cccfe77203895340020822a82f732aaeab1263163d68680f8a229ae1e80bb4422dac4c4c4faaba84c054bad0d9e1aa0992c2013b1cdb7005939bad0e44241216d6580479f6ac6066cbda1a580caad53434c6f2a537121a549401cb990d4765812ac1eb27cbf666f5d2d96f3cd804b43052c1cf53d2b11a2b924ca1971bc5e30f2e9a8fb05e28e474fd34563836ec9b19ea492bac7422392336c2354a703ae054995ec347e563fe2c5ee48d0c2bd9968556dc41e5d3c939694675ae23112f64cc7ff1df4696a73ebe472fd76198998626409e8f8d6c6fdeb9bf589cc60e15253cb985be0ac507ac8076f606c11478e78a481fb749adb2420ee0f6546b518652b905f328c712305e80d8669c5dcdd863db97ddad05b86ad9d5dfc52b8a41cd2946df58b7d5032eea4efb6e8ca780b02ac58261bd3aaf04a88f482e242d698cc8c55d87a2e178c741f8b9a03f453d844d71011f5c7677541fc25d58a138348df949e4cad85367f817255281b49116c5d101dac5fb26e1896d97f67cb712dbcb5a573b146904af4e9b2a7a02018c6ad812d1b8b1bcc8a062c5a3fbb9cb9ede7db4bb39e31a8296d2b4d9c34ce6b06a88425c75a3b53f7398edef454b9b2bc24fc8c8dbbcc4ddfe2b0e52b7b9f6f695d5cf8e7706f0a67d0132a4234334376996e71c5a9bc41e6ed16d712a1fa83031d774ddd45d9701584dff472e31f2bbb5c09bbfadbeac285b313a8b32e5e78d10ec59658210bb346f0f7c50c233c7c1d018ac200ee64cd512f849aa8cdaf3a1d8cd23fcf974ebd05a5a29acc5b4bbb594fc967dd500a08020c10f4d1a613d55463d76ba4fd6e0230565ac45a5fe9b1c4477cd40db46b71c111b1f66bd072a28d8d1a43614e785e838d3217f52233883c73a1a7c4878290bcc97e47b4694df427f2ba787eae7c495b2455504f4168fc70189bc77f01bea35f4781d45c170bd7747d7d85438442ec70bc40549f30b1ced6e00d9f3bd1473f0df98527873e775df348061c9f4b16450a518e6ebcf6aa81086d1b9e9b355d405f431dfc585b1a82fd7436fc32f9f90171b0ee2db4431ad5090d61b8dc41f4c1f806f56119fa6bf4779c1dfb1dd9ff535ac662c7121fa5fd36c2f85895dfb4f63f32172c8fba3dea868b02cf2c23ed351a71c5cbfabbc4bb9504533a67d6c7af1ddc267ed430421dd15ef27ad4c30f4a384b6b72c4c4e3ebf5e254f67e61f84c0f7ed2061c92a504fd662a1e4a191afb56957c8e11ce0292f2eb49f71e106ff5e202add3025c0b15c9cf946bfa12d17761398223039e2c19d270c101a2303a276d7d7c81332a285ea94a28c4325fe4f323cc6ae72c306ed5c04c7592733522f1b16ab3e5ccf7e50c6ea926fc9601c3f27b66363bcaead3d9e2b66a436d2b77f982f7ea36d124c3ae3483a09d3be896f183ea041eecd11c8245151a17ef5daeb94e4c90a341b86cadd49b58357115d1a305d8e7950e1a7d6c604070b2384cfa7d05ff8a578d694041d7abe179b456de185c12e0bd4354e419231e5abb7542f814fa307e4d82e8194dcdada546d09173bede3da358d5c7c2c972e5bcd1487961d4023534b16b71ed1efc8c231df1c218c42dab650d4c6eebb5e0eee547b897b757a79530ca47054b9e42d1b6fb68c2fdca74099e218863818d11cba4fa40f32d3420a24643d32e387ae9e0c21119387817feab0ecf26bf68b32e3b2b34cbe08ef0c12a830ee0b9753ecf3da7a0995094ede649094 +result: fail +shared_secret: + +# Private key not reduced +private_key: fc569914244bca63c05d25beb5a7d29789d3c5acd46079c9410c873936b86945ae56f3c1f049a3bb4e85ad5c49bcbbbe7fc89e562bfa940aaf66538ebf594eb0e5bd1648f4f91fff6c5e83c0839b5946eb970d8f3ba83d1cc37ca768e122adb5539d8e2824521883db3817a27f4d99313484b6fa99a549f95713abe453afbf8788fe6ab531eecf3f53df4a855abf3bc11da69e10dbfd889d75fb6e98b27dedc99d3c32a845d4da3b726b6828ac84e3469dc9e66702ce6b64957d371f8856c8fe1367ac01cf74d9a366b6b38fa87364890f99e86561bdb46269a951c273710626e09aecca78e5710d4d6b27ea403c05704c77b27da95c45da86d2c586f73adba1bc5493a389961b789cf5b35ef88dfc38cf6443b7c329d06aae9be5a7b11a7339f6cb445f88c90d1b350d5c3089cae3c4d7ded65e4dea34b61d7ba5abf4c78024abd21a9a84f4cd73f86b43f3744ffb572e9e8338688168cbac7f979bbebfc52a1d402f94c3fcbaf9f446f1482d5dc5b5af7d4cb9210fe95149fed6b4de110ed23b48dee87a4fe70b864bef85bb6bed01a448aed532da26948f639258a4af94c3f70a984063d9f7929867e1fc94168e5fc51c5158cb4ae9d8c81cdb30a98a82e6367e644dc6f67d4a38ed6523e736bcaec4d98c524cfe36a3a48b5786a9ed6f4df5a992bc89c38996eb03aba41063e340baae94c5a9151d37109f573c4bf8f3efa47a2695aa6f6cf41eb834597c0a09ab0fefa589ef6962189b7c5da99d5b7907cf74a823df3b3db56cdc85c1a8ab9853476b2fa8c047b4f835d32a84fd601ca1c03e9b8a28f5be3c38e93a686b5d694e25e64d9c603f537772f88abd1f5874aaeadde38b56ed485f34bd211f9a206e80eb2382bf2b96120cb798fcbd995dea62a872b5be75f80ca9aa0b496fdeffd07e31855ddd443efdb7a55a523aed718c43d628f3f4e342e9396e6c2451c056ce3ccc93c7d9a45f04e56136fe4addedef44a350e5cb7f4dbfc2845989bcb8cd5960102ef0647b45a585318b0bab8b3dfafb7348028b3fba36a41aa7528dc9973feca1c28a722525c2968739906d7e02c9be2b2491a0458e1aa6c1098fbb4c0bb50985cbdba386d0b53cefcc6f316965e2ff89148c64bf2f385389ea254b38aa8e60f0bc3aa63cb6d55f63ce7ed48a93ea554d413ac3c6f38670a93e90d2bb32ac5a35908c41618ca017893b3fbf628265b857e5e30d9feaf61c895c274fab2e50035cde81ef318917bf9bae5cf2665c1b3ab8b62a39282c738ffbbf786d845637861f46c3e5137f050a907e98bcf755a3bc0ca2026ffacc9bc781eedd4d4ec69ec4d0f9234c8c89d7bdedcb52b783c0fa82410a5b103f5753d985622bbab7639b649c5b36696e2bd8b5c979e65f66ba03be42e448de77bcd7d2a85c599b9449e48f4a6aa0fb4de60c28e80dbfd56fe5fa94fc2f2d26c0f574ec81cb854197af4eaa389adade5dc9bdbd4885da4b9ae207983cf37bf8955ccfbb37e57b30e74bb6f798b4bb7ff73059b589f5ef78b79fe927818fceff0e7363642eb51e456dc509d381153c7687cc3147f3b1034de828620d17aecee648234fafe899c45745f09606b82a2cf84fd7a0de8e9f72ac71d30bac8b54715f5ffe7c55e1a083d39587ca1535ed8be9f6cfbfb0865ce59d348889bbadeff732d13d3952deb491b98b442e4d26bc7a3c2fedce07773a1d9b5d0d441917cbf3169577d63bc7dae8e4478f4fa8bf23164c8ec68e86acc8d1eead1034a99eea986699cdb6176c84294f721d67ec7748ba83cc6dd5efb3e9576e7e50977c76097af33c2f33c68995333b82baeb80c4ff480fbc93b414cd3d06e75e4969aebbdb052492fbada6148e8b707dd86c0af2a1ea774afbab6867d33c65bc38395b47f3514d6f4d27f3e20a969d02bea49a08e5c729fad1f97c2b398301ebba4e76be866c8dd17a46c7db9d5149329ca53461de35e323c6498e34e9e3ceda48562aa78cf0dd98ff75a93f44e33859d4ceded278c798a77aa93f033eb4fa32f7698319df3c79b4af83639bffdc56af84f144e7b36d2e7f13244b152b88fb3e9278159475abee0d158cda3ae2c1fc85d09339104f413f0da4337c320936e8909af4379444fbb5c7f80fb2feb3d98bbef5a89b82336a3789a3bef7d4d3a6afc56becda78d90b2d2b06c3c74e60306d7e0514fbe0111a930a10627e5b2b11077ac78bc32c46d1406ee73acc41b518b2c1a8cbc93990b9c1d0964b1091b0871dfe594aeb6719400c71e96893a7524d082bb5b7b3711f586f9ecc4b65f66fdb2801495086969a6a49961d563391a24b1029a7a3c9e2399f605a37a4a05237570160976b658da00b57ced318b4c7025ceb071c269ec9db9d6a2944c973cc9b427d5573c2eb37c64e4624216c290c5645b36cbb3e82713de383daa5cb4029c6dfb14c43f4aeaa9c93843b784fdb63957b75f39088820694bd0706ca856864fa031b682031581673608dc9ea058dea014ab79eaef74928d4cb33308fcad06ed303a1ab8b6cbbdac332a24ce5474013c90c5b1b869bc9881323435a097d09e5910e39cae5a1bc148ab7d8aa12c84634864930c24ac4f375731cfb65d5992916302640a524a4a52c9a2281534956f946473541852d0884e6461614f9a1dd95cc923c6298998b21c2415518443f86949e6c390f9463b69a63f2f9b328053c01872ea2ea8fc45185ca3bbe74b713528cb3525a60f7639f770824686c1b2ad719fbda1d4c44c9dcd0b24f5277fb6720e686270b5349fd3b1215008c6b24c26aa943ae71146f063072f0c42ea114d3986ed1030260e88f2f2c34e7385491565168e1c18ad324fb13482f5b83b2f6020a6895f9d24b93805fd5556b4a048c2e3106eb02a53a774b169106a77bc166137e7dcc4b60569e77dbc6d5f9c276a011ef59bccd08793b695eb3a5bd3c1b64ca3bbfecd1adb5f97294d8909b31772929c693ac396d412549b1cf910aa3c60ca0250928ea4350b8c91df7d31474ea07cff56dbe417b16603c6af97329d53163343e0af3a84ed37cb91a349bf2af7ee84d8ee504f2a73e9dc3301480bc6f144a631bc3c160348773cb0b6a3b57fa1286e2107e950ec6a682edcac892926966e28ab2a482bd5991f8c6c6f5e231b0826191a8c8d3c2701984980146bbd1b8a629b548ce578f5df90b58305026aca96ef20c77610a2da79018b0047f5351858c2c99a035f2f339885521d09611a219895e987471a2c10ee576e07320b7f9b5d678221aa995afe550c0f72f1b647f3ef429d3720802d7b53ceb917feca63860337ea126fe41777b85980744025ef9418bb4c1983c8af0109d2a0a0ff47c121de1926ffb5b3d8bcac797a0f5309c8629605a757a6ae91beaa437cfe184bfd3b703052ffe8cb2d7e57b411719625a9f1e11473aa8a4814788c0280fd179596db23d3003461314896d38a9e8fa75e93b65cc76cdccf24a72b1294acc47b3e7843b2a322e82c98f906ba369b7e8b588d2dc8056b70e8588c4eb80ce8300630d265a8f6a74306374da0622eb125f51764c81c55b9966c27b562c5e930a30207f825b27711c3124fbb98d4a8351980a04041e99f7af63ac015d667232162db0e793eebc70dea04eba186d2c14381ae886f7c6b934f587710aa095b206621cbe4ca1bbb8752b5489626ac72290315fe9a967ef6980f9486462b74e7938800b020519c5c0a684adc1b82f0ccaa3988cb5a28264ccfcba1e8119add64a58da88bed5cb01f5b0410a3ee03c9105029ea789bf65bc9ec58b4b2b0c9aa9c7859a48cbf0c12cf9e78049528118d366d0345951d0aa9102b5c12b36c6022fa4c7b4554178a8800c1a968ec74569af3815acdc39bfe029807a8ffe1267a69073744a806161bb5ab59d5340b8218054a252560c188314c177c5f3300e86863eb97253e6778415b77f140d498aa104eb291b21bdc2c5693a39254cb01c8a3a9e8e14a965d107a6b98eb09a26c2851059a290b6e94ec10138289148086456047750a3f8aadb5b1693c9642a8ba89b89c6f45c18ba750656c151cb563ba7260ca09c780077b956e5275cf998c86748d2d332a9008f8625bc61939b18f0c063f171175338464c0d402915c6e54682fb6876c7338f654d1916655fb19e21f18e2c0629e0962457cb62bdf3c93cfba8a551c752642016f72b5479615da16c1622b21a105da72413df20b125c48b0a76001472780be292a98500321c007b1a0273108be097ba0e5972a2394861c5c9f8e0093dac8aed47a6467570299a5501c6b2f281283d0013260901a08531e737bb6baa0fc13895253ac4469519c483b591d28cb8a9a0ecd051937eb8d82bba18673a17339dee827be4156633d8a2c376d41fa4e7bd70d4e199ad2b1951f0dce0b0afd296d3f22bafe4f13638ee2540caf8a6bf7d0387265bf8812083bfa3b670e3eaf9b443702fb6db16ac1197656bbd61a8e25ed523b8d1e5 +ciphertext: a8ea9ae69b53329b2bebd1fb1e3a67c0b693a15630c57550e31e59fe4f9b617dac6d5e16607b7433499cff0808d4bbff91b2ca7ed0f05fd3223e9300e4f251ce24b9667afe7f88c7fb6f4d7d921943fdc93d98fff7c4c7ca1c5f68cb44365682363296da5985dd5270007625dddffa50feb140412a6bd3a777b3b9a6b6fbf43d8cc90f6a1d24896c387e0487f03ef8c45bab4aecc0c90456688799f7a5417bf523deb8af083a75429e08c242587d01e6ae78f7b165b2dbc9e67a8e1fc61f95d1fafedc77e7827eb6e718941fe091138f9c4afffd53dc7b632403f4197d53c8658b67c7905a76abe466357f2690ef633d4b20d0dd73e489b0d046d2a684e21f95fe1d19569b076a6ec0e0e2ba05e8a838815683d5cb3b84be0fe3e363a7a3761521c2e04bcddcdad2c956f66542c23d7446984f6c169ac4c7846a9d8afe236d0c8ee7dc2afea49837549f91803142f889b2ae4a629f2ee67c2fde6032866339dd512896e8ad025d7afe1c797630c2bb4d01e4f5004ce288d1d879689331686fe6934b43f34f40210006a4418a54c3e3cbdd96a09ec364cfdb76b72dc12ea17e7061a3a1c16f04dbfab2cc69ccb244fb46975218d8e15a5eea8e85249d901a2379054182e2af17970328cbb58c99049afac91606aa090bad9aef751b76ab1430be40f62ae0a81f6219d98fce9f71afaaf5f68389d07a2da75df31a2bf58cbb4feaca21a775ff92917f8b32b72d0b880a77f9bec1074b1d1cf9be04912a8813f5579c911d46d06c66ae1c943329b246a0cb80bbdabdb22063754840da03c3c3d4a072f805902054327963dac5d17074f60db1a37a3d7b7be87b953324e964041964576e95cd9d7adec5a5f9386538912e7140b758d54aca9b5b6adb631fadf6db3cdbcc6a2f3e475bf669e0888f5c37967feff2c73fd4498a95ffba69a84d1bd2ce7524e4e5f8330a4c6c6b0714fd7201ed6efdee9f08fa2304e9999ec2dbe6a4756c67514e3664fde289c1d73bdfc65d24e1d5c6c1703d5c466df114a3017ec38510f44ea50cc7e883ad24e340f3196263c19a4d9fced324d0d1a3abdd5f3553b6e3c14ed46faa97fc18d0db7edb064fafc4fe2a018e2d1943301b734ed76729043f4a54d1fe75f0d7d52419b597e3c6a33638e9ab1d3d5fc971501cecad64f86b3ebd05e372d1f56ff635839914f4d202094942ecfd5a26dd59135f574d6924a7a64c6079dda2e30d843db9ab000bc67fb2aad73d0a142da2f56cda206845cd433dc53ea67b9ce78bb9a860f34f72770afe8bdb6d0bab4d2509be1dc2c435cfe59aa425cf607b550ee8e2c6e6ff885c4a95f659ff7f1556f8a02613f6b12e0693f285954a84e13996342f99b4f2dac6852f7d9caebc9a409121a86905c4f540f5d88b44b065cabbec28f1a48ccf635d20f4d0c7e3264888049a7983411a1bdd2d393b7246d5ed0b74e2ea568de1674a3339e864d8a54a32f65f2d19993655e04496f566b5c8e6f793fcba6bc2a583ffd61e7d23c3c986d178b8af86b8e4714bcd405be30dbbafcf5aeb6d3abdc9d81b73c7c219e460a8ea5b253dbc0aa97e967f2febfca583c2ea23810ed31f6a1062741f02656ebb9af490b43c3c935e008236b9be6cf7cb545726a59dafbb769d31555bc1dd747e9800ae5190a48eba0cdfd175ca609be6cb89e6b91ba78c761a53ece35edd41b9f61e0c521b848aab26c557603c120abfbc01d1d252a6bd31fb75ec8d17fa0c15727ae7d160581b3689a365854ef10605425e18e28562aa104c7bd1e7ae2e1dfc902928261833cb6da12da185ecc05cdffd69d3419b27b329819e49e41e8e64b0f9c222ff04249f9044d16a3660e3cf13e1769f9d4f33f8c39f9c491e2085b608c3b430d4ca662175da3d9c5a6dec274ba37e0bf2b0d034ec067d614afe9e7cd34565dff83bb1463a8c0b08d4198bf7b5495ea294478ffe57c994e1c99607a3e9a00d9ea4ca568c81aba09fc418427fcf343ec9d3ce37fdc1108ff017ee0f4a32d31a824a97a96ba6dd5f3fea36984931a433d774950800e6a8dbfd65431c348f14c7762d68277f9eaeaaed15543fa041c3ab72903370e947daa93db55c9dfb71270c5be4f74446afda6c63ea115ef40c3ed2f62c38dc73165d156d26514bb11af35a659a007673fc6acad7043c967e3370d8c5c37f0183ec064dc08f6e2b687b736fbb703f810d0414aa9c +result: fail +shared_secret: + +# Private key not reduced +private_key: 7445654a55ad6aba3d425d6b872c53fbc83988fbeaa5d4ca645854af8ddcdf4aefbb448b51d83b20c3bf82ba45000357d49fda0dffdf011581d2a4c4f186522d568861554efa0bed853f96c927a3c2aae9bc07d47b497f6ee9d7073d5bfb28b06818549e9b7700a387ce14420c74a5151555deae8b217bd846c5a90cccf9be6f3bdc8c74f2dbafff76a1a53ca1b9137ffc687c5304a3fab4f772c85719585c39fc923d8cf53dfa471ee7f603a4e34c058b8c768b051f3f3c955bb8c94a26d4b6b458f4cbcc79f30551677f311eafb15cef3a183c323f8841ec76882cde61845cf829eaf3482a3ad116f25cd444f4463073fd96740aa4a72c88dbb9b393289d91b85b20ebecc48d96c0bc6dee84a16068a80d759d0d96ea6efbe1d83afb1b79d9280c32bb4f733d259ad3bbccd4edbf13446b0ba77df45d85f6494934555514353825c33a0f04ecd00545f617d96c5f4519dc3ffd73a65eceb9ba4ac7d338e8ba3bf1e1b3d0db3f48b2fb913154be448c76195ba9cef4d4b0f8ce458540a678984d034e4077d65116a4c868dda808b3e1fd7d75afa6a6b391eca57039bb3d5643a5545394057ac7222abbece46e06e468493daaddd737baf64fabd956712b57aedf5a462441e46f796d0796cb5ce0717de7c42c4070d8a5159fb7c0ebd33e29761e5939282eea9bac35e8e9a12a74f3d97f62385f6d96fedcb0a3bf8b33d2882c55ec9fa69173b3a6353fc357e1b51cba08c3642c449ac9bacd0b39d6a2b5a8b54aebc64b810023cf4fa7c73b3779ab468131569a614d983103ff2d87bcb455c15c7d5de96948cd9652f316e9881879f4dd43a44ea3239680a7cef645b750e42cb736245fc83330ad84d8e8b56bb535b865a9bd79549fbf8ac3468b9e90158b0b9fc53a08b775bfcaf5bef4b8785f26589e65346b7f4469b817f92108520b0fc9e5eae4c1fcc21fe5f6aeac3088d94666b54cb3cbd0e3887f35bd670fba3d168beb9088651a377aa8098c1f87888655b0bffe364e3997354fc1b8fb4396f3d79ddf44c35ee49535aee7767ce70f67a6bc733de942cbd8ee0ab46f1947de5b8fa09ce7f4054fd4cf6372ac5ba9180af205c54640e3b9c0bdca617ddec519e236a44d7fc5a183579febc4d1882d66a96bf2cacb9493fe4955843a057de02319a1c49980405bc947283f95643d0b63b80d36b7ef39d97bdbd57926b2583745de95e92a75d70b0e43be745e075e775b84480f8bdeea7f7ea738b1c36b3891ee9aa453ec46a7ab2aff73660983e5fbd58113f7da1bc0ad6df0ccd34bbb4765cd73fe3f1b727483b76b0f62c16e7b3a0643927eace34b482674a967474c1bf77536bc6819bb77ae4db157267c6648c9c15f59f07cf0ad7b814048c926d5fe2c14682b464a4c2740a37c3434c7d55fb99efc8e3df8637bf8b4ab530731f77653ec2ac15a174769dbc5e435ae8b4668d009cfffae716f48d3785fa007c788bb8d976b3e9b5455bbfd5ee19baf4e1e43a0ed0dfd4fdbadfb6dc187bca996f7b03979fa6a0343932eaa86ce45c22ede22d46ae25ac7e1f99c68b7ae690bf3adac7446a6ee543532b6deddfa74388a13ec320f75cb29b4a7ff90b97c9fe807d62ad5eb759a75a9e552fbff9f111e4e43237f3e758506e53fa21d488c1eb3c1e339a7c8312f1335af7a8a456b581be6ed0af384d0796d531b6af21bfb097f5c341b5d38737fcb055bca34def239c0419598ae3d33458ffdcf2c5dce35bb393b89dd876f9dc970217f4c6cc75892f996b57db60997fa127a3d73bba81cae4c7cddd49a9bcd5985ca4bde5d20267f6e66d88e25e2491aa7b51a6e3aaa6d34f870eedb3db6fbd3ff44b3a674750967ca89ada1cc2edc9e9566cc2db42a696e86f3711ae4d7e4bdec26a6d0ca9446a87baf63789410975376a5bcb90e303c3dcd1d06f6129b44e388672366e32d1db6a613dc1678797d157c55b4741de9f5df96374b16b8fb464d4bb39eccdc30134f48adbeea262ebb0af5aa53d6ef29663b6f1d3a6ee6940ded5e081f42280858a06930bb64e3ac75a3df36de070752e28e8e13dff1a69554a774507e99fbd18b88a477fbc2fcb0740fa132648d4acd8d668d4d1da73250cddf53b44e6539b941839ffa36c435498809c3804695f73334e47ad4ec259b86f6ad9781f27e76a1562bd2c206ba3087231983aa0bd65420e2b71b749605960c94319abeb1e80aebf274b27a9237740c07114614658c51d0c5118b9fe6d0064e9b47641ab189b2ce2086293dba6054a1437d00719b5c11351a9901b0a15e4c7efcfbbe9a3a7ac6ab157586c8d5b68b2d9b747b2461f2a2cc3179a70926423ea5aed845407846bb9c5c57534b66a6cb8b480c9a18453e047c58ef00cf652867b474c7b1b62fd7aa0d7b4c63d881b05f6a8d8549257d7b0b7153525d5b295e8bbbf3d36da46a5d425601e9fa8ee7402535d553bb60547bbccb7777b5e48373f2b38f3c566e7b98a85465590ee1c8cef16e4515ac3b4c69f99ca7f3495254c345b0405fcf975bb5cc26a1faa82fe109f8d670f17164f25878a9e8834b4271f75338dac56ca7b4bb3b56ae95444af369c20b582edc204928037434c3c5f8c372fc9449a773261ecbaa4ddb929f148bb6bc471d2a72706a1f621ca295eb8b44a83a4b99c6f3bb04002b2d6ed42fa5418bdca5a07f743754882e2ec966f44235fd3b48c1ba874d8765ee30156cbc0456e610c5b02c8fc3b6d305aa23a5528e77aebf2bc3696a37c438a2a1259054c3537ab8798ab9c16c2b9bec71a861a96ae2387955cb95fc4c984d2b936be897cd05ac3524b845a2aed4bb981dc47120fc9e4c6476e7847ea69755886a5c85cb059ad0cf05b0aac6609104e0449e36815efb9c0b232c7e5b9b80e386a8ab12be22a72e0a4efb447b253c65f619c2c85a878a54457d272d2e9a32d2668d9a02089a434a1bcc4cdec25f909640901ab4ea97128850335e63882f363eae699599a1bafea68c9987882751b545795ed6428162993b17e7a7fbccbd2115c9cdb83c9852912fc21baf53082fa41ae41723a8e6a8e6a3c008dc8b8b6250c7c740ad2a3b92676960db68318c3cf24b855b62b237b97df54c561b72b0bca0877925734d650c0824ab8081802f166d8a294ffe8328fde34b02436ea27086b870009545a71d56ccfda986d00ca3e6931b85a53cab3aa85a2184e55718a9988e11aa2f024076bfb36c0d222685977ec39702e4eb7045229e5256890ad87d84dc8de5c44f8e73c65970216c6312bc22920fac8e24a6b251103beaac8b4a911a1bf62870a33ad9986d81161a3e44b0f5c9508be97324a97107cb15b2a2b9f6f71b80fc7b59d199ff7b04652644f10156c2dbc33ee34cea079e6b718ff4e2ba10858a2b33827f7019bacbb952ca83a8f38d69422431fa722bf31683e3ad6e1784ef9ab210391ee600c2d0c690d739ac5a581c4f5660576bc743d79552cc833222b43e45201888a3ec82194dc2307a07b8549c838bf4a70f9c4f8cf5868710cadb4636bf12a257a57c344061b9f83dbe9324195651020c2f02574a2db4aa4ef527e5a66fd4758382f96e52d84472852a30b49ee7d60698f4b9b6e9003f475623e345e1db767b143bd30bb5273636ca7926f434863ce41813767082873ab5365dcc72a251c035da426fe6db4aa1f34ffa45c9277327a7125c866546bbe22b9c09c054e133b3d8b3fbf18832248e5a3198c89794c5ba4e6486574de79cd67626ef2953007431ad08895ae499cc17111f76c002322a6602b677a922fc450971fc90c0b8ce16dba195fa80196569fe8b87fe060311867e6c6abc87f2351f4b0da1f837eb7830b9319498f36ff707c80926158b84a934400f63911b5650c6d205686f7bb7d415ca9dcca9a94c5706945580f49eba773067eac6c989a8e1d84d2586c58e70793933367da73ef0509e27a97f03c28a10086d782a3ef2251d08793748357f411200b5803f0c76c886b35bfeaa68544aa038374f868c474f0a6df1061de88886a1241f090ac4c7c17f6a429f5ca400e8dc98554c56363c8fcd728a1fab7c0007c67915b7d793c0ec5514c8f6a394c8502ee3c63b73b26da015c370826278aea16ac479884ab77a2d3c0b147e93181167bc1980627b46b7d06509d7725cf1085850a53f442c226cfaa24c8721db0c137c7a72b5898cd2137839202db535cd8ae76e42219e49eaabe2fbbb643742ed91551cd54f1de16f63c953fbc7b5849ccda3167660fb28f2a6ad8327a6d6ab649eb22ccfca574733cf01663fbadb3be7c33a482c13e50027d76a134e114c54380c1e84255060944dd10321b29149922be789eb0a8fb7721fe98a1e0bee89476e7efd6ba100e4d6c896905fc524e7f98558672899468fc0a35e2a8c6fcbb35b2912e4aefb8c396bb9738e3c16c95ccf758e9a30597e4b52ffa87a54b83c91d12a5e9c2cd90fcac2c11b3a348240411a4c +ciphertext: bfc010052e4a98535398330db6929dc14274ec2eea49137079453747e20d8348d534940809227b777a2bc15714782c05453f524ca3fdcf0df3ef076133b33a8205c6efa7f0998f5af79e7ba4a60d09b82975c6bb4939202082da7ec4d36ace0474ff661f27c127f088948dc789263925c9e66366ddff38156a7f29e4966b14b8c97e7ec42a845528ca6b6b3184bca46a10df3f0cf97f205f3e200028655002e95ddc121e692967869914900253f021a2ac4f57ce80b877650ef17b255bf6ebe351177ca540991e5c9e1bd2f11d669ec68e9ddcd42acd87738aa5b6907f957ddb88972daac3ad492fc42b34bc942a54a8e95ae810114e91e56bf15f2925174d2a0ffcdc143f60f32ed7a78d1267f9fdffd8cbd7fb786ef9080849a96115cd5447a0b5d939b2cf7c72c109e3a1e001e8c0294c6cde41eb8cf94fa1984ff8a69753b5169d83dc7daeba17c044d1ac0b75a300d604819989e55334cfc159c10c10d57b0d4247bbe568831c8446fbd06e61d86b36cd6cb6928386993420e6e4cacc75c302ebd7fbf68c26e4e47ee9b95d55e6fdf84ca11a20109dea65610dfaf2409cece66b5459d5ccdab137785985826f1ce139ec6a85c14b7179028e189abb634ddd65e90e24d0956185e10478f655223a12c12a58bea556d1ca83442024590e7552ef3de5b507d4780d2df02a8d1df58ffb198e7ec90105260c3b4690fdc3aa3eeb29a7c35d70e17e95ee80dd29e28d3f983af8e56a8e5a4e342f7755dd63ac17d760112ae33b8ff4fabd99ea81d5bc055ba05b14bb2d1bc5df6535c669925f66bd28c36e3e138a43f5e52aa8e3bfcfeb6119c2bc2ce1f07ac342d376df5955dcc82c5e1ec98053617dd269f94218d7e04f60db5f6086b517caf7e378e4f997871002d13fb034d0431ce0ceac5790f9ef66fcbd576e483da676dc2656f39e13ef9e53b0f3af715ad68ed200c153c3d4faee4726e40281fd3a8645d5c44662ed4a0cb2b08a546e4465df1a99c96d6d8792a49073dd33b265bff415cff1870ffc10baa701d18acfac906b93ff266bb0eeff4f9e25ff31bac8c8d55255d5968b63376236434da60619240ede97dc9a8e465993cf6154ff9bf26b0c30b5b090742e80ce28146c41d24a1309826a50f1c0eae9a92741d87da56c4a3e5565a205667ae31e284158709d3c606e4019ec5a0faa3dceb1125f15f7366e03801974849d4393e8ccc539f1731c574a072e8e1f283d2a58ba2094c7e1e20aeb9bb7eb597a2af60a51de419ce403defa27b952aaa1ffbb7884099d47a1f7fafe2bef66c2217c39b2ddbd0bace0e6399680cdc3dc1584bee8803025723a9ce96861d5ac18cd3ac86f88e6cdf29bea502845850913bb4ee3cd5aba6d71be09a6e8baf9afe06a4de80a8dfeaaf6289f484d084a7c47a28235eebaec311feccde4f2564665f7d100fa728e608606b15f3a2f0933fb2ec3508a329f388e3c19fed26e4d5fabe83b36ef8441d0e6f96ce9cde8110cd3b208a24d15b71877d54a7b0a9cfa3724b05d8f438b1d70ed5811ea82609a7e3482af67d380e8467eca9d9b03a0168240f7634f1a7b976680f877c604775e877fd07231ff766f22cebbc7971cb545df0faa77d78c35d1ae13439b340f30436071064e18f97399422484b12116ac86a42132cb044f4757623d70f7508431e3f4fee1be9d13e77d2a98437067a18e0b6dfd3a99cb43aa6900382ee5d3441cd39749d7528df82e964e4b42cc0b10b1fb47ae4cb448a57304fa0501ea3c171d6c8f82c542e144a56d7081e31fb0ae0592d9e7f1f207d4465584996e100c3cb7760f95089f73c19113ba4c683174d8a1830f2e2f8f03db4b9c988b160aaf6b26e1b49bcd0b45b2ab61338bdeba09b7356a647b77d058e046752ceb67bf7edc94f0939eab75135dff909e164c96de4e4e8420f20396e04825cca4f09accf33cc2fc313d39bd65f9441b991ccb9bfba1c548f434bb75824ea31ba21e8a0ba90bac70f3ba7e59b0411fa4bda9f68db7f2df81ce7ffacc8ca1b7b39a2e408d471a3df57f39bc662d8ef050c1638441fa49d60bf74be7dda58cea679f90e91f8d7fdb400ef0e8dfd0fe2e9a6838f76101e2edf3fd83b3ed722b12ee03d0fe632814466806b882581b5638475f160e4f8f6eec6d302f8ebbb2e847aa5978909f7ab1dbd57170939a65e74c27b92235ecfe9dbb67051f763680a0 +result: fail +shared_secret: + +# Private key not reduced +private_key: eb98d9301a6603d8822f86b6b54f86f2eeb83c2feb398dc3583ea12167f2563aff15de5364b7aa6ab3550343edc63bc43503eb23faea7edd60195ab2636f45fe2853a98f44b86ffbf9fc39a77be88d7f60cacf829f7a6e1964cfc9cf8f4588995883ef742aba74993c2a75bf4557c71fc5390067ac00a39fbc7d49c667d56b168a83899e94bbb38aebe837b53a32e74b8efaea2dce98105cc32a3fbc5e4d71b07bea6cb7587deab9f85f8309a64dc5d696eb0d575be8ae3788721b16ee6f143dfb73bd9e2bb04cca4074894b067a70270b7fc886f77299dab8d3b3a5545b9c48be16acefff82473b35da26fe5f0bd7b142c97a351df33c57b8f5db3db268e7880a4491fd4977b6d5cef4c151593bf779e00eec456ee7831b5f6066e757f7844f660392f609e472dbb0b8a3325a498bf739eb3fed48fcc6edb8ca6cf80adc9877e894e95094c3f5ba3fe03b564189937c1f13f488d8684068d0264781a80f878268a7c19b8c39899263cf46a8b4cc91eb5afbc8765d23a40c4dc49decbf917737f14765d0e7ca1987923665eddcf8f4c22676f754444b8f9435bdeb275de9da7dcb45feb8128483c549c329288c9a55991f1fbce3547f22e4d88527a8d24fffce46dbceee309205b2547b32e917a39d4846e45c5d4d16aec4435ad8695ad394f36be7e33635829475f418a3383a6d823037dae247780f16ba3fe7ba2de37063b66402d360601baa068833beff325f144aa75f8dba3ff5370d32e5199a8f6eade5087dbb84ee2903c246aec9557dc795ccdac363806cc6be3268cb51d333101af1f019e7bb3479ffefff3d263763c4d6dde76514f9f9f5d6d4dd7536be73d5d6035f3189dc40aa6bb6fe7ea2ccc9e07c6262878ffcb7fd7804f18b08d5b4d3f2b1287012bfedc54b81c0bffbc77ac1a0db6dea6c4cb7ec49d8858138f45d9e3dda52d33d13b533cb6447910cc4cd2ea0b945d220845c1c4b64b5c84bbbf7c7c3a493210d559e3bd68d2ca9bf44b0f7ea760c2f5a37e78a84a5b14c6affb926ac622b8f86c7ac7734a82125b18f1575fb3968a4634d9633ca7b1afd3e56580c34bc3b13741406be06396e66e64126888055aba9c8dafed2bc344a38a710dcb1e7e7fd71ae66dabc79cf79439f5340225378e8ed62472584a477cd67d8e2733b5d581f7d6cf9a6855b9a4479af697da6090caed93a642be9e224f6b1d2fe3b8668fa5a8cf27c0fec1d7547b2dc398fc88158e87571f8f6baa559334595225dec432782e32efd1fd7adec475178bafa3ce59c96da6449b75dc5aa37201ccf404c5efed99c7b266a97d46495fe316f0781ed93dda8484a2d5e74404cdefc3be010d9559329c71487eb7bd7d23e9c89e4fda601d439b8ccfd3faeb01aa9efafc4d9ce994868ba5ecf3e330128e61ce9a6c08c5f4c65af7334920b659b57dfc658ca4d9a5ec4c0b93f43b9ed580b81087838ae28ba9aceb9171d3a927d9b384840fa5ad47eb94abf2c96de847d05ffe98e363d2499f1a2537172735537878bb66bfb4edafd9a1c4270a8a00ac667e709ea2f7c46c244b6b7676087fe8eed246bfd1d855e9591de44e5142a8621f98170fbb55f6d8e10e38b6dee40a3835172387ea82f339b1c6598e53d7fb694978bb5a3b5cadd28f2384d71ad6bb1a1569230d6d42c9cb9e215e04bc6827d3b9b1a1fa3f275cfd32af8b739ed4875c88954a36e078ca07f956e87442673fa9b3bf4133aea463d6a4d8caeda7afc4027e3d4176c694378698a77284b7a9eede6cb43fda71385129f3d9f3850ddd5c6ef5ba28c357ba766b960e351df96fdb70d320f996944fed04699ef28bfb243ea71506b755f27c03279d713d4f299ae6097df8cbcf4d5163397500fadeceb95e1ccf64c45944d85fe24cdd041acfb891d8a042db3c97fd4edf591503f4b221bb9884499613e37342b8d102b96117c88d6b589f9545b639cc190cfc89d1441087edfadb8eb1e2344a5cabb357acae40fbebe8ee59b0cf4906bc2bc88ea76a68489a73dd5235739bd6f8bd54a888ef57513b6e1e74dfbf774b1e469e77d86b85cea6f0cf84b73633903aebb05911fc7b9925ea8a7ddabe8aa466473b2002f55ae2568c23576f70648676bcc1a7ae9e99df67f139edeb973a8a9a59bdfa8edfb5ceaaadbb3a4d7f5153633651904e40d7b863a34774ee1e401a9a24a960045d4537e5124921355cce831936f307c7cd807eb376ca1b640e7a76964c0195b6848b2cc9f832ac0c11c3c3c7290ee182c46bc1608c49e809b1c24a7c738845e9ae972d70c5ed346c46ccc73e0e251b1b57368b96dd71cbda55366585011ee659a2f081a7288c873c8a98964131c078aada0ad1662bb0d2b0a1555a3c84555c593231d167d378ba606257fd3958bc24b47e8380dc370c374a869413547d0703d28e4b5ec85cc0c897f14d5b03d6520937295183ccb1059821c2b866e755e24286634ec088522941516c592418a4fa872b2f911018843d7c877da76c1822246cbdcc046695a1e93aff063a577fc0eff56b27a2bbb56f76dba2b34b6a6765b78493f514661a4a83b58b42e4b96b471068682bb73f535e32c8fc7964a978b47be9b23cdc2b33ce980f66a033f8154bf24b73147152f544939377ba2ecb5a288276c712f2317ac69292eea9005a74a3fe336aacc4257e46395fa9a96a3fc9172b5229c393021e57265d017f6e7a5e92066b459199957cf4dc653ac222bf0b953c3c4ccd5f7463de539c024bfcc9475cb3437c22502fe16b909f73b6e733c6dfc6d87cba8a13220e823a46ed900c7649494006766a23cec36aa46756d3a7124bffb2af34c586847162735ca2d1b259f5c1eb0912afcf6846641984763266bc0add6d60fdf5b6fd87343a5d59c108cc663d8b700ab1dd5c0ab60fb66b764201722c9c2f5b2ce9a88162c3135d44ca9a735fc90b35058bbde332063820f3085cad54c4a8cd8708d43b871ca2b41d0cfbbc066ab45bae33cbf2700c67a5a62cbf1ca19c2431b6c52ac476fc2ec4c00ea9c14cbcee11b1232d523aae8af555958c3089c6c45b47ba58cf1f884e77893fd296ce80584a76abbf2330ab058c2af770e4468097cc20748a188b6620f128912126a899d7b0df24b067a73c4329314c3f6b0b9b83fb450414cf0a2ffac6fe2aac17359b20288a14272a952642958058f04b24a69b93492bc0dad67a7552b37f2417cf7e5b889e97b2d02980f7336f8e0198123c855dc1a40bbc5a93779c7c7be7089a8440214b3542341e56499ac1f6ee61b981705258c5ff6e74637fa0e48556bd3542ee342891ea4b4dd5a4982b0471ce63d61b3adcd1197dae05627c5993b502bf3025f6cb8792f32264184b362909be8ba74a1b6674e253f28b086189115129919821b867cc84341e3ab43b350a5c79d5af47b4cd228856189454538d362049c710953f33678c28f3cd9812d731aa9f95004b94425c60cff24186f644e749a6963b77760ba491744ccadb72e23653a3a08a1f7bba316a9c83e3113cb49022dd2be9a4a69c7db6145377289c921ea0292f3e4ad84e99ed72696dbbc97a3644478761d6083aeaa59004a9694d545835549ca3357cd9d63007cdbabd6e1a0b661113ceb370fac0da48b893b3c8635619e79f4ca14431cd9a1be2f34aaf3bc059de3a3d9b630b5542f38a5a1712c67327c893bd64883b7701636b0576223c4868f2195716c3499a4295b0387715c9ca4feb3b1bc08c6e09c1e809988e2f414f0b0cce5515f43b50c2dba028e9ac11e6368062c360370bb7f5655a3a75c2e7aa86ba9b892019db150bc7dc881c5e3b24e414780512bfefbce95c914cf060a76fa4c34359c634a1a11c40ab7b56af1d19e2732ba6f3cceb93cb31e08c93f2a9a33841d667079f1715a56013c0e68386b639e414540cf2b13650ca9378234b94c24bce9a9cee8c2adf4356f246dbec0bd9b371ddd296ee623603edbaf65e734504844aff0438d163b27c34d52163d736bcb42b0a1a67067a6e84bc8f849531a631fc55046da2b31e0b99b938d4f8b239384bc2ed54e46e17e9a8297c2a16775f77859ba69c759638fea8fc2057b5105952b34058b329ee7b2b08a69b00962c31a5106a281890ad6257daa8c6ad5854eec7e8a203cddb935ab5545e3e57ee5f78925b1531e5c4593a7afee319c5215645905b50cec48961b2b6c1727b4794ed382c66c11b67804b18c3c0000868ee4e3ce4e9790b681161b2cac3f8a1a419892608814aad65880e683fa75ce66335831a7bbcc236dd6f2b8c63560ff1939b2b56b97e87049eb4c65f42d640c0d8fd5841e48bcbd1815ef0c62da099f5478bb93198ef28d89ec6714b0f142ece80c6a6050d3aa936c25bbed1dbcfc99f39b4805782b5bfb6d44c0e7348fba37d50b05031c0489d4294be6cfdc6f4146740e54fa5d698aec87a9a79204cee2986867a2906eb851b734b8b22b91d6749b1a5f07c44e3b +ciphertext: 7cb3891440c7d6eeaf5300ec18a786e5179b97b2c15d1cce3d4e5ff49e6c4494c165bb4b5d822e1e0d0dab2cd477816452c21d8efc981549d4c6ab18683f19c29e3a938ac1d6c0eb18ad94b9e1e8831aa8e66455fd0b91df49384465d7ffdccc9e023584089e7e30676fbaa0762672babd2a360a8038da9bd50c0fca9a5dfbd0872d8777f829b3f17c757ccd44b22af73ff4fee09fadb5820c5404154ea71cff70fd5b3689c52c0cd76dc0d8a4c2f32d32d9a914453be5ad2a3e14e3f5d846c92d50c4d65330b1d15d88d7b8f466d31f3f51d23fec066ced6f751495d3737bfcdd87c27559b167597d0fcc90e66dbd5c5d92a9daea58d05ccf286e2c27b04ca589ff454a078c4b5b4e5110d9d5e3752e9e8025341e425099a08045cf7154c77a4204280feead5353780c65e6b799fd26eb26e1dd50181c9bf76e5e2984dfb0deb74a4ec89b9a7e12f6e124b2ecdd82fa6d34473b9ead35b28f6ccd9709ac1aa317821bf3e92d952f39d9bf98811328698fa2faed3d9dcee31e334f7838fa82c397999bf7372f825cefce367b800d3369cc20161da21ea5f49e9c1704e3e9e6e87210b684df8a038b2143c780e4cb7bbb072a2fb94463ec095816bd499f6b5445eea99646ef1dcf4c331671e0948f27bf8bdc92616ce200739c86a3901003002cdf4f6c353a0abfbaa8cf9c34a8720835e6b366be22933d7a965f97286f38e9e8d21620a20131be8b97e7a67a2ef535f893124a9d2580222db771badbedee98c79d716bb3dc091101caa5e17d83ce35bc364ea143cccefdecbc0c4bde06d47ccbf59f3190e174c738f10433db16355cbb1644ef2ea8f33ae8ac8456afa4f488ab1327885a635fa2bc0df50133f053882d66f5fd3e649905a3d1495e41df802c216d254cc519bb78c70cf0fb0d28092e7ef4329c36df72b98f37165c229722d5e643817ebad995c8a361b43b7a6ba60a645104ffb57e05f70b65153965f0be99f76f1f798f9043ee86acbbc8102aa01a304014f082425c86e88f975272fe2a97261ac233e5b2491f0113fed7d6f31582d51f5bd27ac0f2f6a66c5f584607a8845a88c57d3efc64e07bed4f31cdf73c63bdc387085e2a50b30c8d4b393e055609680a6e39e3c19c764d3e4f01a536e2c112f3ac35cf3fa0ac77bf2189299f0de958876b65db62ba3d1b6b55b3f11321aece3b41095d284c4c23a6f86ee0c68e7517536e5f7fe09c6b3d543f0356fb98a75c2e06a73eba011679e1173009c9a5a1b7944ce1749264a2879dfc797edc0616862f582acad6cbe3615f6096f5b99e5b339fd9109b56ceeee55752145e5a6660ca4c948f1ae4169b54563f3ba206202f548fbffde7e505bcc9fae4929162b550bf5fe34af98891d57109b19bf31c57630eb2b9532df07bff6097da78d5874f2e9b2e5e01a35f904218771c8dfd6d230b4d1780875b45a1f846854cd02c43b76774ca8a0d2a1f7afd7df4931c1762c3fd5ae6b401e12b91641e64f3203159cac0aa43930c8fb14f5a9c7658a28399e9c32a77e738694a900ba0c160d8837b587be3042f412181bf2103b94329e2e143916323dc8c18d00d6e35f6f7e2441def99273d36cfc9685f07a7d34366a92e1f447e463bd085982ce62304a5e3fb1830b59292e94f7a887fea83d7bc014c94b2896207836042394ce50c0e7e2c0c9de867641a22e3c421e5b60a58291862c91b59e7bd4f90fbe3b83240f4b28ed38cf3b8ea899df3e569730c8a7a4f2a9fbec8cca2c06661e9058c54be3541c73ea24daaa34a659a564c51aeb2234140a5f110dc40261ad594c2121780b956d039d23a8e3a1a12aa99e5fb88edd774d8e9d22b3700998f91d05ed60bd0a89a3224c322686f27932713dcb24e363955a548ec5c625b7e30b6dba231f64934a9431336e74b0e891d5e1866965531a84761a632e0eb007095b90e8f8c409e051d0f4843ddab0e84f2711e4038fd6e331f53ce194823f4444a77ec73b082f73160fa266c4037fa02e20a2d01d617aaf7639df69a8fc83c84cc350807dee143c089adac7e052384c2f1460e9b3f3209b53b3e89156953255eab169715845f458676ff656689f77ba16ceff3e5b285c70515a1a5074231a02a97ba8492e64c70971f522de003129c517aac123a4509ecac5385eebaad022c7c5ea1b29f1ba4f68e7c5b88528b7731d1b46528c579d5346b4741ef9980e588 +result: fail +shared_secret: + +# Private key not reduced +private_key: de2a5203b6e42758f0ac186bef95fa9226d8186fd324eee2eb9f40ed0bb381db4b012a4282775c910558015e6cd46581282fc66a6e65d90e88c1f7bcf2f99cf29ef4a39d5b6e3a69186cda2006ea145dfbc37ffa5477bd465d46a13f823da983660bd0ab6ef38df4fa86fa965406ede0faee8f865bcda4d7b879cd54c8520acb99b74abc1a7af3b767ac7c9449613a4a4c6dd3b31ddaa53ce7cb6652ce133abc74eeaa44e41feaa746cd6ed8bef73be6a66eb677933f635d2fb4040f52ac3dae3c23f91513438f3be9c5bedcc6f884d0a3f23d3be2e56db49c29eadcfcbd508fc67ea936f946391835b2752ccfefe46230d84245ea8d8c799eec979f994d9f51a65cbfd6fa8c3a889d33a72faf4c97cd94268ed470175594a5f4d5d4abbb1e7a099be6da589c47e5415fdd920c5bfb5bedbce36e6c588ea903953d2d768ef5c58431984f671a3b31953940a6b52f24658ce943fc46dfeabdc9fa3d8caaf7a04e3779ef5ccf99b5d5b3bf7d1c0b68fa0ff6485f820f6b721d55be6b2d5b3c93f213d8cc016ae4f5895d8bde7a156deece13eadbe36363bec475c7cb2129863838ae80ca94d78dd7e3b5668eb4e5e5ac3e67deaadc86d21c4a47c1ea8c424f3571a553d14ea07096ce6548511dfd8e108893ac2cdae3a9d55acfe952e5cdaf17510534f5f483c88a3356ea567c717c75dfc7dee4abdbe7f9cbf27fab7eeff172e4d214bb7ca02f801c3645c9dd75582965ec0fca9dc68dd6c3798d38e62df3dda699a29d2e6220e35f726ae4b17d8349e4c8807f6755b68f6339e8dbafc83836b8ed34a542daced4a46351f337b175e6b853bc2a4433782dd43a58a83ba5870a05ebf135fb83e69ca81539bb89af025f6dff7e62665b9347d441bdd77b2e4a3665565307e65fbdd341b1be54fef5aa7ea530c93362a0a4766bde3307f9dd1ddcfa2a37746e98ed57b7e8e2964fa90d80daff80752fe893c95ae95dc61028a6e82caa571a63b7d85c3739db61ec6ebee839da14dfd1d5b359d9bce5ab54472f42eef3e89213df750faafecea2586dd0ad636337ec69537c4b61669547859876afb94f13aa733e82fa4f4e8aa5d5202de48f57df1d04c9c444641d4ba30ceb312bb89dcd04be5c5fefa5d7327748c7a37acbdcd73589a94070635ea6198f014b44721d6862ea794d2c8ebb8f8e95e8ef3ceff6247952db967f72aa44311438d4d995b3c6ca6e6f33705a311f095a6c9ca8cfcd42087c8072edded4acceda7d53116a8928a8ee61c5b3c08e77e4d99b4a23d99906672aff875da7462b88f7cb0d980eb96d3ada528778cabe2e4dc0969ffc38b7966efbc385921496a27b1ac7a099989b2fc174ad6ddc4b81b2365a9c7ae60cb36f70fa4ebd0ffd77e477da74a7be867394f5e68b744dc03a32003ff21f877421a4aec9e9a2bcec7e46c88c2ef550333787dfe664e777e24c6bdf09f8874d0853240affee7ae27dbfa3c6936f64a7e9182ee6bdc8a6db265c387930be4aedabcf67b838640d44c8ba75537347735df5e7582c9d8eae8666a4fdb6a5ea4a8afea9fd9769edf6735cdbdcf7983f877e29d4ff659873114669974c9018e7392c55d0a45bba4f3c834275c84289c240ae3ca6f9f7c128accd58d225c79247a8fb811b88517fd22eda9b458d61ab9d86655ddacc9b7f34284d98e5f6fb96336c4d8845d85c4cefb0216bdb32547c5f4b7e43fb465a358f6c1f97b0dffbf08b9307fa8e5a1361b03882a267981075f6fc136cf93438b046d1d49ae45d58998f087d0c4386b0adc834b9ead42fede0c57dd8dee7fd339dde05bc0aeda157c9c638d8c1a2eed687fa3eeed68eee7b3b2adc8b970bc0a19fdb14679463dee1332ecdcc0459076e8dda5cc340c448bb0d38c0bbc36de75c00fbcb11f55e663f5050bfad08e59aa3c65702547d05bdfc5db6f287bfd53a75975c38c865d3bddca5d6fe7c7081345700daa716eaf7b78959046db5c6f5b9f964921b7680ed15989a8f9052987536f4375a8c5ca9f3f2e05a3d11f58bea5bede429e667e87508bcf79f4757a54393131bd4675c312324f18bddc98038488be5d1104989055bbde396cec47790b56fb13c0da625a732969e57e67e5b16f4aa2568fb7728c427c5758d35e91b5b42c33b5d096ba301075d7d5e5ad195aa24e5249c820c83a86b66536c8fb371772408729447f8f2bd61fc63db224d868b70c8e8ac6685c8e3bc2375049c25f941169291c38a0eb0f3cf027bc8324398fcca99feb47059e87db1c2b723522d3f09cb8a19bf7b2b35db5516a652b837fb94a6ac6701c479686ac758c381fa242d8e67b1e7f6b0cb04cee5fcbe2bc5b266dcb55f1c72b091039596c4e4e50db8741763c35365931bb37a3552bb3223938c6a876e54121fa489c502e14943aacebe7a5e7747bddf5c6e916095bea36dfe8059cac7adc0dcb10a64bbc2812bbceb001e22cd5438183f9b3249a27566098af16782c6b503b987a6a5896c1bd82ef7d3c5c77b82cc797bd682849826981187a1530b4fc07173dda9ccb8c5248583503a8b974e8b1ca39b1beae9ab516087a170ba4d12ad5e555f77f27c55c519226cc6b3246ca1328db15648ed4394cc038245bb7d9ea48af2350f0961283f195bd51304af6653bd133e241729b5a62495c8c45583cd4c30bb1c538fa4f86afe799026f86e1de0024ff13ed5713a8806cb9eb6cec9c94c4fc4abb2569d9486507137733e681a5eeb479c8256ceac1ef823b34995c65cf43bafa250a874b743388cb6541d8346071f075b439620bce761cbf1848953200543177e0154c9343b47ba3f5ca025fad201bed145b7e8abec99a404621a11372c930713a013b0cf4b346ea6cb64620859d458d0e08b5d416bc86552c79b087f63539303c6fa96aef18c6a61dc37e1e8436fac43763c9acb9b5955157cbdc15d356936cbc603f6eca2e2a53163591b3d2257d67335caf60b4223b8c0cb7c54454e3b4812e5760848ec0babd9a0d7da9e83719bb0d7395418c44d86bfeff4c8a8548cee6780a5388e36eb4f5667ac2182c213a577fa2c4616814ebda8ce8a1c5851e0551d356471a8051d179de078c9f12163b0234fd729c9b02c302997c13974b47aec7573604d8278783bca1a5f184f77047f3b1861b7e1c2dfeba290e785d77ccc37e0ad03c199322c475191aaaf87300ea43f6a956b7d03b338b147cdfa14467b2850a73ba99c6b39d89ec6fa3052a9bfd0f6922f9b37ae6966c940370811aad1572039ba3365d089016c21fcb64fe3d924f805336d49683ed262410594f8205bb2649082642314fc7065cba9b8c4421f1bac52f69ea8f96093f89342b879eeb785756587a4027680119d41bb559c758197d360342bc3845237aed01aeb8104490b9bcb4ac158f154b347a49219ca5a401f90d1c1f4f7ba521bb33ae0610767207f3c9feb991e7ce444a42b33ee5a14710586523cc98aa53de01801bf383e33ebc03900678750734311c349cac283ba827fe39f976b3de28610113291f61325b870384280c58ac9c48bb65c5d8a672c86b218e8a706d3b87f2341b95199956886ee0ab068d927ddd109af491d23e991f4e8619e4aae99053c4db3514d380133105ad60885a9fa5fa80c144a3949cc8c33b591c776d5a7a6e9c8d12417b4c1661c867119f7006e6520462b63e1770aa6424dbec6b9a0c2cdb8c8945d653e62c790d7857681b479fda12c8894640aab041a044d897c565ce882aeeb8caf42630e10afd12293fbec9d7ef259bf881c92cc7706ac41626bbe1d17373e57b3a86a3ba62cb6084869b58c659371c110930b6c75626651971641a899645846f96081b00f6c29bcf8c646210676bf266467d90eb393b64a1593b4579adb0b549e6648da5c9e2eb3bddbc78c468912dc674b126acd4448bb40bab46ebc8620288253156d8d39ada1b639c6f69d34e9a25e6b6bf4241bc00b5968282bab963820fac7159001fa414dbe2b94a74158ab43c6a43519f9a34a716cc07908452e5a0a517138cf46220243bf2e27ae78835b73e0720222700861136b2a405a241e58f37f132c588a1102a5344b704619666900c73990c2145497565d09e984f2689e315ab204c59a360534a641228768a9f1581532ea9d7717b8d8069158605508a24ad1c71fee5760605bc2d619b177985ce89cbae0ea5ea335529a20225cf83744d807b886ccd5cbcbb8393d5bf144497a4c454a2ac7589b5315937345cc02372fde21bec80c0ac8912d28b3348df2a88c35b7f384809f24665600583530226b50a6429217ca211946ea66451c9092e7c42b309a922465561b307f8912f29a1ee687b1d96d8c201bdd75a34e09d954a4267f21490c0eb74ae98fad1b5a3b5d2b9f70e922599b58af4bf05a9815c270046161175cfdbc167293cfd50e9d74851ef1d1dfa2acf359556df4a2abaeb9dcee945829beb71185b4d6bd18b76e5668f253383a +ciphertext: 98b43ce1b5e3f4f7627465e5147c9ae5a547f3c748a683be0c41c952bf9134ac4aea57db428e0c534c8df32bfde046a4bb694ceb92ff9368f22565c10965512103c00604141bb05572e4d9ce098ecaf9c610ef9f9f371991b3ee605fcc8562bfcb8ce12b559ae3736e617846b75449a1d8640d8cd81b10e0e1e16d37283fd693876bedf41f4ad3acfb2c7fbac12f81d45dda3db5a0bbe6c79ebcf83f7328e5a2a477dace62f9ac8e8a82211613d7a59a0ea5a25c92fc868f1f2853b030028a869e8035800bf110436828b851b91a9af639da94d6dcf5997b42978f02df5316dcb445caaa23b57eb05cfaa8cd70de8035cf76be6d812e4e48e3ee10d3d196f40478eb06b944f6696bc700953897498bc73020cb6d61f86dd8d0c32d86e875fd67b3d4a506db533ca7d49c996facfaac18009d8e5876cf108c9f64f14cdbe1803235ddd328b1de2eeda09e1b0f2d46137be0ec466b9be1790736d38c317c7db5291accfe7003aaef4bb4fd6c77ba7acb36c9a7da91917ec5989559516eda9556aaf4059a31ec6a4b119b80e35a1d974dcc1cb12378c97e7b98bd42fdf0d5f6e1612bdd81246fcec86ea81aa635d8c1e7475afcaaa0566ad8f1c2fe556c0399da36bcff131b5f5af6a93877d4f3a69e1d7b51667bf90c665c86018204d496fea4869116035efebd7b7ea505f77fdb6fa8e5b436ef053c6ff72d4f11a40f7569f46394a6fee11092e37fcff1b881148738ec0eff7004ab9bca6c3971b1514955d6436356510018b90c1954cab172ab8cc852c0aee45f2d44bf5e4e5ca48d0bcc683af70d9fb5e90598c81e70c4ef11ba0fcc3f3bc0979fcbc3555379400a858e2ab05509a207a8edd852c8ec0b64a616cebcd0c90605d10b451bc2ee1fa6c4320193002148f7e0eaf8fe480d9f1865777515905f5500447ed1dd9fb96b0da711bba70efef9ee86a3c1eb0a523ccea666d4dc8e6c6e00725cbaab126cc1d0562b4d6d3d08efab09a1e07ebed940d74240e12c171fccee0a22df8dfa768979e5b8bfbff75ec945c0d86b3c8bfc41be1bec09c1998e4d54bd9ff309b1b8a14123bb963c39902478fc70010e43dac70cc799f439b51fa0a56f53c0b792931695820ae1aeddc75dcc4b8b695409e4d5d91c5170dc8852a68c0def37a69e0e449bff582e1ca9452b9a3109800349d3d8f648ea219e22d79363bb1327f459bff8ab2a98325b3f2ce2a16d66165f3e3a353d82a254177baa883efeb8e2bb4195444f90aa595831d059988548535c0fbc70a3ceb954171000f300d7509f3c306207a92aa5b961891417e97ac706eb7be17bd21d144fe368449fb0104a0f84211b884314fd894b4e227c81440b37e66962b80723823b4f0ba3584ff8670d65e07ce18d1aab6058a1f42b33ff9e382eaaa8a6c3ef1bd8bb3ce9bc940b2e9593d54f1cb6b8ae23488c67ab4e14ce11592114373024ad4fa3f946a187edb673a28731787960e096a00b956acb5912378bc794179306763661a8ee183cdd786bff72d946d53207b409ed9f76881c2518163b0215a78a3a0b3120838ff4103192d2e78bfcbb5397911c0b3ad281762fe4b760f5c80f6bbdd55205032b60aa26781c23a18be4fccfcbcce7b4ea8ce9d285df0ea24507994826770387ba75fe9cf229a569970046f7c927aaae551e40e3c56b2c00be3e5ad6c364eee23cec1f4002e9678bdf12c52300e374be3cde9a434dc4c015c985d63e36327ecec520c0a7f7ce1c92dfe2b780a180b42b6495d1b49d83e6602f853462c83817dec59b9c67ba60582f20b7d7362c04b5f50574fa9bfc5221087e94b760b6a84788b4c563f5c8e77b173098197e2d23d060187cbd13e11fbc252c7afe39b3d84bfc8daa8fe7b208bcc694ef7050a6d47dc7de96f54b0d56017ad92f2344713486bd9719232ea99f9d049bd9b1f221b7dfe705fd5a29d12f1a08f4d02f4811683f3d7793ce079f5ea02d6a2b05e2f82348ed7f5e2b94cdbb3eb9558e9fa6c6a538919cd5fdf66d7c56358740c76ed0af28e7ea769a715d4e56367c9a2411759508a4f761bc4a76c468345009731f2584427f648e8971847ac724282a4d6017b4715de7645559218c3a0d9a96ef78cac19a05284d98b7e403e1845fbe5a2c9055bb779b6851d7321a2489090b2b1289298abe26e98fd1bff494f021485114a8a44efa64d6c1e1479a36912a6dcd1449b3 +result: fail +shared_secret: + +# Private key not reduced +private_key: 4035f5b257c035fbc56b1aacd83e540f4d999fbea2cce3487199e84f088a4bc96d9dcc63ab435bb7ef6f78b9dca38eb436ba7b222cabbcbfdb4cb3f23c2fe0b5eaec7fec7e65df7b9d7abd8324e7d8e384ab6dda5a986442c767eee4e2e6499825daf946bbb83e1a9d08fe4429aa46ba598595dc4639da5015c96535d9de9aaec36de5e1daaa713f84ef3ce3cf833fcb5f04d4f32c75467440092a4f7714524b9ccc3fca9503d5dcc8d676758ab661ef742a3dbbb16e639549346b9a67d836e7a43f83072de1844467c01fad270ab2e047835ce3627615e062f46f33ed5c3bfe97d07f44353cd3f423305c6477a9c6d6301b606c693ea18e96a2c8b63adfeaa74e646bd3c958f3b6da0ca8235be7ead33b9a855e2c0e81dde85ae8a33ce367f73583cb06968f07f6b52df5dd670d973b5b60ec47d2c558dd969fddc0aa611c08d991338b5187b74e7d46906499bf84e9f2dcc89f88d8b5557915ec82deade0290da26e1ca3503b88454e6c688386c3a74fe7ceefcbc6f93f9c65fa247c70b4dd8789d56663bf92ab39b2596a188ed204b884765c5c90f6b61b76da32d8e58dee817f45c2d9c769bc2d3acea434817c6f788482146ee8633e52c0f38ff33733013a3fe5898f741986a5e3f2f679a7c1ae7040b4cfc0f65e0395bb7d5b698e676db2488808aef74ea868d24dd9e289951d3b80d57385924a433a83a42d87920817fa2a5b563b27ec9b53c263c6b234af7e40f6b3205741373880498552afe88132c8df3849c937fa91ebb3a0770c5027b7d65ba6e3664f9a7685bd2d07e892ba893cec50bf398494dd676f1dfea5b9d54f095d5297d728fb9ed9536da087f73437689209b2b154d7f9639bdd287ba9f77af0f6c75068dc7cfcd426035e89745e88f3b328d6dfb31987d70ad381dd62d8bcff57c5e33baeaf129e51344b5f4589389bbee803da3c1f08aef60589ab2687e5ebcdcccc9d3c38b80d078c3d4d38d097de0da3adb74ea5f32e98869af4d3bef8981b4bebab984f9c39edb9650d23823ecead7f2c39067b958458f9bf24ca25b68325134f14d9a849db4716a3d4f43e9f95da79e119be403eaf93dcef1a1bb6743379a73e44770ad2e687b135256f72d565766eb98e2e5ed6ccebf90f39e393ec173e7cef9b7e2f06dd6e1e6bf8456c11c6a47006b75b27ada9c6baedcaaa877530631998247fa39039bfd23e5aa41dc7859aa42c287dda6cbbe1ff4f288ba3f9d78b214b6065d35eb9374ec47cf51e77608c63e6133fcf1158db935d5ba69a7fbb2db5713bc6173e7e4c963fc938af06558ec62b47be7c967e75fdc56ceea39cea9e9d947d167d672c6d0d6d8b6b9535c0ffde2e2bb322155ec3e777341c3b5f4a5c79a93a377ad23f263e72dfe5e1abfcae3ce1ed5dda93439b0cde3f8caba7376d94635cbd1558448294704c6bf09d7b7a6caeaae425aa03bbe97aea341e0e66ecb6d8337c387644638ffddcc3fca30f3ad63b8847f647f9943de27d0383440dd2720ba4aaf339405af495be385f95eec07bd7105869960332a8da7f5b7d65e8983261eb7b6829e48116fa22b8d0932a38e038dce74ceb762a3f95058493cf7c412fcb308fc17824e8cf2e7c06d5ca7f1ab2ea9e67705b37227e9498bf66db68b6ea1356b4c642058b4f1aab6c4093c3b263f181f9bda41d387b2e6b6339341239b8fbb9cb9d8a46555ceaa875b1acb34ba51bfb6c1ecd07bbdc695a66f025cae458f29655b177543b98478eba7895882a6a7f2da5263370c7177371deae4b48b18583a49dd6f228165c55368ae6aab812f6321aeac1ee5542bd35a9c39eb6f8bcd1df2ce0e6feda00e6eacaf83b1264d7445a341aeaace6f592fed5bff115e78d0e8f8a4ee6bad4aab51dce0417ee322f69bdbe725d0ffabf67e03ff9da99dbb8a11d5e927cf8aa87571e6e329065dec96bc9e32e3a088c98c3a8e727e8311aa595f33ee83a9657e0cca6ee4d962b3d570a475e7d8df81586d13e7f5794feea91c3e2e688a55365ce42bbd8ac759897a8af7d6d7622e56014dc825f647d152ea909abe4bcc4934cc4b389b333c14373fa593f096ef91a1b3b4fa96edbaa893e58e4f887adecf9560154876e1b86194ea2ad47f36ecfc647f6d8cef8a3bcacaaba0a66acfaafe173cef526c86e3e416820166411abe7da1944fb933eb009de46ba60e249664722776b37ccf770b187269cb240004aaf74c37eb027c62536ae847b8ec48a6b2a9ac68307802db576b70226fa1b951da9cfe094a0bf4b0b306c5e030baaa25baa591b289fa24148c7ca16a19e0a0039eda555645bb65685a75a57028bb29456e4c16ab48c06d346ba9925db4184adf635e779522c2670dc5bc1ac86c662eb37975aa806a2b2e307904f6c6a0d094828aa1c07891cf098223ea78967e7af701273a8a1859adccac61bcd0c103f3c13aca18689397bab1ddcbdee2ab113ec6932c68622c513b0d66c60244cd77441c7aa964b5331ec11a088a5034e064a1d95b4b389c15c51426fc9a135464416881858511fc894bc2a3b0b742366dbca062f2c3eec28bc3c38c809eaab081c5dca65bfce171057ab8467eaab50987732b9c85bdcaee647342c3660950b9ca7c0bdfb3bab69268fc8486397b540f0831efb861ac11855dea4a588c4935847a644a470f055a923162f1dbc2b699020880cb08b80621de33a9f0aa83fa2b5541aa2cf41b98214a5fee14785661a63603f0492163b47829c71a7afb0b5efe94e8e225ea2c0179539772a510a5ab5456be4670a076ee1b25ff62687a96284166576e3e773adf2c061258bf2d28b1ba00fd485b8151076eac5be6ab7ccd81312a9ca938f256b6fbc8ab6d3c3a1da5c75e1806c5c4cd4202c0b20816e368bb2443684463ed43787a89236fec32fc99891166462852750a8c1445ac407924470a56b1cc75c7a378a2e40c00fb35c0d4f65bd12f49911fb923bec1b635baca8428ec7d13b36079732838459c669f7f0c26281717ad45eec972011c66d63a298b95566afe11baac79a67dbadc882815d014549cc294b658a8c00a2422c0d23f6a0be9bca232c8374e616e749623e8a99b0f96a08c95897e88900851076b1b470732ec2462bc9c943255bc475da70b44b134e0cafe8f3cef42972cc175e04fbbcbdf4cd151639155a0469651408c9292de9383e63c08c8bcd96a69a3ebaad9b2c1940a37f6c32b1d3b702d28acb908cb2c7b88b89a7ad4c87cfa6c53987e4721d2302bfb53ef3e9bf7319219926bb7884111fe2c4a9aa4c4c1c0f8be3bda890c0342b56f826a6e971c33f900408292c5820c92b66bc8432cf735388ddc35eb004506d8a671547b7f324741f609e2121a0592644e7e0cffce7280f77c34d05b930b96ec9c79838da4a78680da3b07c1485081d14b9d880bf3ec61d852114d738580918c72a270d7034412305ba10d6a5629a931747611554602f529f32356d9e0331de2232e65c695af1b597cc816d001ddca540a0fa3ae67313853b6a46606c1bd3b32d193bdcf2cdfc2c1f9006724365550632bae19bb3d60804d0c80f17681ee020c6cf3cb7c19a22b1d4acaa8abb40f308ec2cc6616164e106a06f700bc62266ccd40d4a414dfc818ef3ea39540247c0853309d45fb99b84fc3ba114c240915a19e96b742a234ca1e0183e60c8acb65ed2c8a7d239b408c33fc5e31ae83caaad17c24b99238b2a52181517a1202c87a17f22bca93e758ed95a895a6a97c163cba8a4c0d0b980e9871fa8f595a668adf927c4538374c7e65fd052196a64cbaa23969a1c07145352b6829aa9e93993c640e0f62b5bb0228ee37400619eab437434026df078bef452267841bcb72844e836ac95d25439567a76f69a3b2c6cfc1c4525f340b40c558007b4f76864e8367cba7c71edf2aa9ec56f25f606cdd66cedd0937451b95422a509b12553a8cebe7b95bd97b45564c98d20a9ce8c51add836d8c00af538b0d0528507bc3924a731ac05a688a1680e050b770c3a8f49c654138bde367f4269abdc4215175799a6112bbc186b23745fb0cc3f2bcbb6ba1670b1834e99e10b2fe25003243284c59ee4202ee28a6ec2086510697240d60961398c77b3b046a23a55b89151673e1ad8a9de959923974c540902716c973ea402b3576f5b664da2a104812a6101996980d68baedc34f9856effb6c457c8332487349ea3b8bc67acb7fc509c22a476c331af75374c57b4c010675d490da92c7c60ac69d89a25e0d67351aa5c9e9880bc1386b77019436abf526b319ce44cc759b009b93f8b9c3059bc7c63ab483a749e1a761e90587f13945674e85b7c896280d15d2d20bcea11db480755602348b4616400faeed3c143406ea9c1307e37e2642ee73c442a4f71da07c289afd5cafba73184b9723c238da81e3ae109daca1873ae1e34d84adf05318b5f655efe36f1b678cf4b875108a18db2fa312261caf839f84bd956c5 +ciphertext: 5e0c732a103af159a069419ace2a1d915ad5c589beae24c7ce3b5330c10c59170511e4beeedfd369fc2001ae60466c3be35a244469b0260c39d59eb33dc744eae2691eaa75a34811054bce72dc3f5dc7cc57fe96913911e27e1dfb7a134b6845196175bbf4531d87ad6e8145950df2a98cc571b35d9d20f638a40a3cbda7d53ef3eafc890696cf511cc962fa48513534877fb63d69cbc4dbe1471d6489f5cdfd83222ae0c45abc143554e148eb3a0030e9bd687fe684a4218f2371640878b80dac9242aee40d7d80971baa2e34422cf0083e59ab6be20f3c8aea270b273952b8ea7fa0c0ddbcf55769e548d549f4cda9b161f0565b87c7cbbec7ec157b1c578e03bf84264c0d4d84b7660ad4ab5b009a3c85d995d4c663cc7eedda0f2aef0283143bbd10ca643b4eab50961c7df5a633860f735a52710bfaa27b3a3ac4dbe56a82632bcda5c5f70b20d241814e7f6e9e6b9b7f089c30294a0899e55ee74e366425849483138ec5ce41fe4760f94e630e9030a5add852d30f2ecdcfca1f431f943c82299f5032cc79f4baf2580d15881567957fa266c18efcee6b34085400ca89ba05f696e39f4cb552944f2d39b4a0bfe9d8df6b85f5547f16cc3ee8e0460ff7af9b4a236e463bc9922d99507e069ce84ac77bf56366bb1a6eb58d1cc7b560bcb47578661682aa24240a28208bef802e6df94b1478af7c103ff756bc661fbdeaff6a841af2c0b39f75df4e078a62e267fc1c2d491d589e0f9091e764568691f3fbef675d466def5098322e1313435b689005bb8af98865bad6de64083596137ff4b36091716445bd5ba416ee0fb961f65bfd243e841e5d2cf0d822678a1605e353a8dc0898d60dc3fe8d2f4ae980f8d135a6a74779f85e77770830417a6ae47cfb804d4b7cec8961ab44b12636d0a9522cce47bbadaf947fb91542dc71e059a669029dddf78947abc8940873b4f882dd3526bbecacb737f2af651c0ed0d9b01dd198328e31d2405d58dae57e755a8500ec058a36ec66885eba5bf5285a048d913df95c9872edb0f19ff783f1d832f9b24ba194b2ada14410c6aea961ea029e4179dbe05ccbf96b62d34ccf1148ea799c644201d6df9c14ea208a38b7783c69f0ce80131e46d5523f8ca82229652585002a66761b702a3565f62d4955124e21a29671e5e71d03059f341ffeeeb4959487b7d26a2da280c340583bcef0f719caa1817c785a1816fe68f32ab5f426c5a0b06694974151c7512e9137db5e2dfdd5d7a29775464ad44b98aae9e1a930d2b35cf0cf119ba74752bee665e65d6e968c286370eb0ad177777c8b6504c7551a57aa6875f18fe54538fba04a74a721f07c893d211723c8ca608670bec9be28e249c4632ef63e59dd790617e9ac0a8bf3c0eb419fb435c346803bdcf2112ad81edea320202e21718197e4bd995ae7f7396ad00b9f8bf11b0bdbee0061bf06a298eb1a837bc14b0da80395d676140fc7ab22bfdcd9e3c087b122c4fac6a9a9e05706c93084be7610b3a76902d846fc93b782d582a548b3bbf607b30bd72fad1781e765ace7861547188757ba4f63300eb08a19bf7597900048ac1731625b1db936b02f56225b5615850c97e507997eb402d9a26b6a6b25fc802e506537138481fed4151874929d70d8062af6f1d3ac6ea2120ae799b124b3c7cdcd639415382f0c9792efcbef2fef5c9c514266fb1cc704f1ae0966a05169d342fca180363d43b9a0f6366f3d8006fc748e1c5d29eb65feb99127b25ba8340efe4c7f3886edfa6c3e05b7f9075cc66a9e93e7db6b8f57bb42fe74de1b1b14c3836cff9b7273729a7a7281cfbb9cb11dc8479ccc3fa6344271bbf1c1f03648ba971100abde22267b7681d2e7fe6daafc539cf8fdda1ac18563297be8f48c4ecdf91eae21a0bfe5c095151891c69f01c74f71ba54d4bce13cb0268c87dd8335043b210a680219634d9fe00173aaeedc4ae6f86acdc0e85157006aa48bc20f4ddd6e90b3e1eeddbdb84af544055f7f908d5f31c559f8ccc592cacfd6c550ff92e1166eca53d170767656ac402dcd437d084433a60335e3a59093cd2b434f7fe182e68f7f4911463ea2bd23e01017140967fc045d377f81e1ca8c3c0fe2b649386dcbc20dd243448b2a0b0c7f9b776a6be6aba385e2e61341c4d3c59443552a99797171077317df925a6961398db170c14361a15043b256e972289e +result: fail +shared_secret: + +# Private key not reduced +private_key: 499333bcb7971f6dc8a924aa6ecbfccff48b4d3b9fd4786741668c071aab1d5ded6f5d928ee83d7997cd1025eb1cbf8bbdc884478ecbf736c4110cca903fc3ce34506018dd938db9d8d8b8621b690eaa77e6bb8ed33f85eaac41ee6b44d85a7253e7ddc328dc5cce6ff3b7a43726e6c98b50c3dc46bdc3f07f98d220b6ba60bb6db6a3326147e90fdaf8777a519377cf8f08b333b7f1ddf9c8a91479a71dd880ce5a3553d091357759eadb009d86d41faa7c8abed3d6babc47e612543edc1e5c0273c99955ff85d796d9eaa442c880eb098ec2a8b249d337871eb4a27a583cbba27689de9b1e9abc9cca1ba7c57414c1d697303dfae778b736ddbb9f521a44b76941538666aa8e402644e9d3bb593dbf3bd18dd08f396aa863fa92dbcfa713ed5c537feb2594142fd46926d5d7fc8e5c7c6aaeeacdfd169e62b476d3a65d6128d1debd6988f3863603f700ebc192b8709b1c56070a68fee6e8670dde0f3be6b14f9a9edb6e695d366cf3995eb5c926ab4c835d6f510e7a1b1d6e2cd3f698fb77bdabbc60f35dd93a54fabae0f437fc2ec98357f3c1386f8c8565e3173c4788c35af8bcc723b97910343eb04e72ac586064dbaa43ea90cc36521a54aad84b3cf916e45ababa3498cf2ae9d0c10b5c7bfbdfc11b8d358a90d34383fab5d32d535935fa4c639cc7e00945356f3176b836d8cd41d2b6c1689c3325d7edbffd743863a4993c346235784299e0969d75c61f9d7706a3547e72cfe981e8ab8a29cbd9a178eb6fb75bb71de7ba998af84863aa17c03cfac56e18aaf714ac9854616f09becf13427e996dfb084b1f6fc5495c9eefbec0bc23c9710772566fdf1779f601b9d2176fb77077fa861cd25bb9f38cf8c73a8a467833bea956fae60438801e431ab5794907916bae5de03aa6501c993bc684507bf4d715557ddb7ba01c492417e47905abb8977902eae31cebbfd9b3b5dbc7a0368d72661d393f2835a1db389804a7af54743c553f5c445b4d45dd3679b8d40d916cfffdccc7a0ab0d9e22e98dc32dd3f7b8d41813bf84a8592d7979ae34b299e9403fd8a073cba7dea6a44968944eb4be716f3163eb9e59da45177efd3efd6e80d832619db52ec78c3b883e71cd6a77d7dfd14f6ef44e50bb3e95d15d75a09ce3406d8de53f7712d8f5e05878ba74acc9ac66a7573f6d245f2ab3c09f8dfb1b395bb29ce746eca972c4efdadf8743b736ab39853066c5029b4cc47d89b99e79e3b8f2ce6d6bfbb74820d3885e4bd8bcbd716a7c7d4b674f46ec36d6d89a4e43eadd14def64cca6c4bee1bacb5a5d857a729beec7b5f4b068c3a6856156e9d613ee70dffff3f28a52527f68ac6693c58b3f19798e5be86e3fdc471e33c4dad338555ce3c37316a39ecb89a3fdcdeb64fea422c46c51e65844e63e7e4dc47a956e705ee625a8de7197dd610e7f73a09cd54bf56d5c6701edecbbc3b452bf943729c3f36af76146d885cd65a0cdd6965443e286fb4d525ff50a4c1828ef05cbe92de26e9d903f27a97def137fedd54ff63dfe2584d74270ade4e85bf4e275640cfc569357e4407f49edb9828c65daf2d870d5a48b408d8ccbfd062eba57f16e3114c335969ad481e78e6f3318103b039cf812c18bbd699d3c018f7179a710c23ce8477dc08075b715e3aa9d5c6b3c34a3e4c437cc6c14b63b4c4eec27648e51d9affe63352101e59c52c4c59536eec2fb6981b8d11cf946934ff3a09a7a416c79d893fe2c5c3204895ab23b0b17fe60b58b99e6def2dbc3c75a594e0b6d5dcb6ce5493fd2bd450bc4c53abd892fedbddb883e9aeddf94345770197acc9eeb8fbfa67e8a830834432fc93aa463541466d59da44be22695b3fcdcaed5ee835f4d9440d76de944270fd3af3e97c5fdd7dc0b9450dcea37508d019caeb08d89943a5661feaee85fd9f2b8961d46f43f46e55f95c8a74e83b0ff6e9670ed18826566f5737bbeada3cceb2e095ff50f96df1c692be536346fca97d83c41ef6cc63bbf2f5ae5923afe7261a8760e648d2653d50ee38856f4baf9a57b05d802ad6c90359a10f3a9e841e9835bdd1b75ad9badae5c81cfb1a49edc76ff3611e885cce81f6a8b42e8bd581798348cbc987959462e3b2f8986e42f59d84ba35cb27ef2f8ebfa5079dd30b981973adf67c645de8fd60045ceea77d8303982ab9b039dc4c3fd0159d46c89e618304fb5d4cc53e9766138fbcb061b56ddbd61e33873a953590f628c122d049cf722737b54d4430c312342189b59364e14fdf8cb1edc540c39612f8e2bf88710c26425c09dc7affa63f52fa01db7794aa2c2abca69145e89c06d40189fa704dfc4b252811b939118f1b9928d0b0b6767a1685804f502a19254ff89a45d9539c9f968835013b69a362f634b269b911c4327520673049c00e0fc437448c2849089918ec93c2ea270bd0699c85898c0148f4a1095039a216a51143183f4d695aa456c32e8a35d351415120725ef995010409e1176806da6b6e08ccfb3093914c87c107cd14e11f937a9f138b928ea5580494c6eb643ae33b5600f7726e2004f52cc39ab24d0cc9c3f9e57a0b821fdfe8404e6532bbe01609a61def2b4f452a1fbff381692975e05121e2330c789055e5a4ad696678bbeb1a8d3247d2257ba246a2ef966c305a8f4fac73a6fc08f71ca500aa9d00962caab7a2780cb94c209b1cd43151f3248dd344bc9898b7780950a10211d73aa0ba20d89b01b36623ed8aae48845e1d7372f12b9a692b3d525263dfa12b3f312f91b5802d3b3380e58be6a92a70e77cd6134103496dc3e9236ff17cb0ebb04a1783379baa0a3c54cf1c5eb1b4afcd9a7042c50d6405b1b610a9429aafe61a5423055af9f61d3617be60bb59ee8019e72123069614e738a46703af5bf25d31ac4f1357832b1232cbb9325e522e79571a1d226397e407e4b08b44082e71e984e463747a230bed934127e892fba29b88857606983a60b9425008117ce17d20c82b6171165e940530254f2b0cb4e5c235dce373fe1450ee6457da59c331b17f8d4b5e0bab25aac789c04acffb957724783d00dd24eec3375f97ad838ac0c261789cd3afcd68b2d53c0c9bf944f094bf0875c0f08c161d3618c774304ab25563981974ca2e13b5bbdd210ec10ba39c64635c9025b9610b623c2f12a768e03163d75315c7097782b69c44b3a0c33a552228c6001c5ce194346a80824627b974d2c64fba994d2c62f8babac47c51dc100c54789f737c61b9b3420469b11d110dad9010c6c67ead2329d3b4c665ac528041bfd028612c608f87f3ab74b6b68309317e1c0ee5662f8dca46c26039e2dcb1fe8c42cff0057d4bb3e4ab3bce13c142e589592c0850e117cabb2cac88431461a5e6743695e096099a8249e22f4033c15e9266cb00a9a36103ac473123e95d373b0dc92cbdf6b2b173b07a3771456d283c758ab963811e5168694cc20e64e8a677e05e3915c4d93c8531b75d430b3709753f899b1c45434be196a3fbe5149dda2ac0912afac619b4a45f3df262f7d617322a9e8221a79f2319e6ac59034c80b3214953419a191b0e4a25247bfaa0defa001d5529b1cbb9e63ac03768404645bb8ac7ce25687be70796bdf516b76039f7b689ce6c3f569a04c52875ecdc9fbc97447e0160e75a89215aa263091e7cb5534a97660cc8515ed61d9b624950c089d9aa647f787a8ed7c89216694a83c56cf278fa94340d790015b914d09ba91e10ac5b7ba95792bfe779966ebc07ac6916fe1aa4bce56cbaf506563319c5a4c4344344b472226f59b7fbe7982c08afe9a60a80c446b8b341eac220fa8a664b6b1a0df72684b67bf2032d75f5aafff7cc724acf3f1051ec3cc4ce8768fa9ab51f960f3293a1fc527686570da34404b5681967258799fa26f22179e18221f4babc2b7c46601ab7ceca1a345027d44783e7d6c511615b108c4197bc0d9ee49c91621074a907ab292d4575abad75a19f10c2a493af902252bba57348dc33fdab3217778429680b4f352b52445eb662101dd22ddd211f314577cb23bc47c7176942c5cba072996c048408a5dd795907bb2e2f49acd0e75a93cc4f7938136d7c26da0691c08733e8138caed6c8cb116b900869f9fba9f5823b20626980ea86e6f487af758830c787bb1bbd8de024be9765dd04b969dc21589312e709cd6780c9a38a8207fbbe74f220c3c33e2a127588b64e3170999d3a77c8f67eec947cb69649dc64010a3119c9030e1fd0530cf5c3b73b631917719d0983ad0a06d2963741289a282a717d7487acb30354fc74b005ba01101a1c8b52c130a00339bff4f480a4e890030a709b28082d3c501b2aa2d14fbef9e429f8cfb50e84c327ba02edb7f6abdde459896eac77b5d8c7d7cabe482c88cdc80345768e4cb54d17aebf2947b07c716dde8da26e0b7114f85dfd29df7d92dda83e6b2ef4cce08c9134563063068a196d7b1a1a13623e48ae12528e +ciphertext: aa9d348a26143a9b7645f5ca60b8164bec6c46f77160898d42692dce57ba70b1a76389cb3bc4565939d9a05b0d8c80b10981d94cf593e001ae86bc722eec3af8fc152737f283b23c1f87beb4750b9edca2f0832a902e91a3fbb3895f915c94244189c7e3ac05fbf3214d319744f8e62e1218d29b501fc210e5defc4356d38d18f20a2a456e770a2e50e452118155c57569d85b566960dce62cb650a6476145b5e26ac71d9db03300283d5ebfedaaa84424c3129e4ffbd10d5a995cc6801118a13cd9fe635695a01ce0befa9865e9f940d8ec5cd9b5aa4163a525a37bdd5aa2240c071c99e5a55593ce0b8aa1e46be7682175ed83cd369a4df3072fabc968dcab66361a650f8c3b9a85ce39db4351ba975dedd52825a2cb3392b2ac34cede2c17d9bbe8134705714832e55921fc91a5b7e126d0379004a1d2aae26af0b169da33ac8cb56352d51e474a078bd192e7388ce8bbbc1c03c7fd129cdc21bc529a3c6ae161b68765338d3473e8e5ae83a13aa4f279d72c836b7876e0eedf1cc9f956dd9ae68d016d6f64ff585739c0e6eb94f7b1e34433e4a52dc7653c9334a94b8d52cde4df49addc20e62bf8e682d762a94f539fbd059a9c47a13a6adbebb914eba693ab9862c5ef480389a4b7a6540a24f994d5d105415641190395edb0f9085017a1f1a4c399b45ef13054d9ab2c2b288695e82e9000ace60967501e0030144465edf4c843b82af76d4849aeb1e357c7863ca92287996b9fc794f5fb9593c5a31fb296443a89007f1ace1235e2553498c1e9cd67efd33502227ae657b31cc603c6be6067c34c99f338e08130404b1100bfa732fe449ae17ab8b3cc1a8e8c96404ae9675982dc6269a7dd2bcef77fdefd5e767ed3bf80288c8926060a0ebd6731962d3ec846ef0784a22900335ac90e68054afcfa4d0a373b1993a42df0a6eb1a4fe4f371d6dd1bf7c1c73fbebbc2bae4497b9391d9cb7c1293059f2f2e42e485c4a1a6cc7adf10da6559643a11a6184aa62ef65597d4b7266080518c646ace2a4863040934169034c1a1721ed73fdd2ebf704480c0f5aa885ec5be064b9889ea9566e72a5f32be32a9edae3d8bc8513f136fadaedd0efedec6c08e934f3addd073f8a6ed95015ba1c240f85de99d24053babf604e6466d3c61b8ea2b19d413a173d33663e36e8871cb4bb8df1f7c2a0eab6b1d985981aa61abe005cb835174556d53281699e1dbacf6ca1bc517540d942b55d0005cece29365d18720ca24f05e697da16be5e135fcd5df9ef9741da03f1c76a44fc31f7dcaf8949bddce95eb2634439c5cb59a07ca03ed199b6a79970724b731b6bcd34b20d83f097c47d56d87e629166c27a0a888cceac6273d67e8f6a62ae0e515d96552cd8e147a6e67c6fc4fb6bb1928ae70ac7271e583026d40d423da81b0621a948fa966616e2d5e5375421c715dc8c81fd58b3c280214ff5cc0db1bfd2311f7d126d33553e0fe2d195efe85c42f56f67cb9486d279ead1bb221a2b8d83da105c5733f2b9ea60d370f4c746e1063c1797c5e9971d913ab2708f15de5b78b26414d3b53ac858a901a4c1914c89e8c147e5f30e875938408cb3ce54eed5f7e6ad9966198ee24cb3be353bdaabd1592c1886948c17466adf039c20bcfe4db27a1020fadcbf34ac7cb36b2b6757d94187636ede4ba456de96416373bfeafde43ded757af3e01b6ad422a17d330f3ca8929a28a163e7d045f149baada7d7cae24b19a04f06490e3cbe658496980dda1d82b21d460eb1c46bb76ead1d13fcc52ce1a1a15063550669afb3b20d16b7184e68dce36e5f9f7df838e5ad160c6748105cfaec014f15714748c5a10fc377bc59a24d5d770031f82e0925f184de62890d9205ba132800731988122d161de63f0313ba563233debc9890752168a4a0fb24465a8d576772ad7434e1f3a1413244e397ab1d0b0607a429178d247d1e8910738c1ac1f4c7844a6352e95bdb57983fb36c318cea8577212f7d010f30a82f8e86fd0100d0c38204b99577465dd0c51c6a6a0801cd977149985f7fe6d71de1c0b130dfa4e127453c9adaec1e8e211f9acc662dd43d4bf755bdb651457dcd7370b9e88b84a38c7c4cc94ced8285f4ee8b0e2b646d5aa2682d84ee85a6505989c757857a71bef9d4bbda0f1593de4ae2858a1d64a9019b2f9b182f37cfb1435390991c3d0d93d2e05c2edacbe117fa7 +result: fail +shared_secret: + +# Private key not reduced +private_key: dd1dd9fa8cec6bcc6a0174d44607925524ccba9a8c5986419805c924374839af764fea94d7db8cdae573616edaa9da6b61134d768be4cc87a2aef9da69dedce92a41c08e44e97c73e2b730f15673165a5647ca4d536bacf88da3e34af24f67b58258b3718bc184534b8436c1162bcea0b5c659acd0c36fc34283b5bfff5a172dab615edca0fdb21cac43cf0a68ab784a121dc184ed698459671266dc087aaa05b67be9d6bd962da48685de19ae4ac0796ab1e9c33629bd1375316cef48f16f95ffc665d8d9bdb80ec0447b332523603786e1b04a30813bde2e0d3cd1365f133ed4e71b8f52256976b6415dadb1e37e32155f7515d37eca3c466aabe1ff0ed8577caeb6ee7e33badc9c4a71c7ba9b4813b3413ba65887c4fbfaf2e90f51e307f8d2b7b0128555be6965d07d4f9409b57b939aa37efd1e7f41adb88eab14926a47e8a483ba06b6d4d72591bb0377d53a31b99edad807db8a2757ddb44ff2cdff557b9b61eb5a33c481f5bf5ae01be389b93437b5cde30fba638f912a095f19255c7b7bc13617fee3e7ca4c78d0c415a2135871313bbdd47338ceaa715ab7450293a984e380524eb1185a84bd867202ab34b12e3f9187f8176b5edfeda0904bc29aa74880c8618ee862c326c3725fb325b5cbed5c679268aad2d9d3cfb6a56929e2fc15d8e23a8e88957f89d79e93c9eda85742ede6ac14fdaa15d76b9a5fc1f5058a3ffdb45379eee45943b7564adcec64d5bdf389d3b2f255553e54d2046d5a0f8ae92bb4e7ea54ad6eb347af6ff50c6afbd59c46bf85dd6047feaed87c8c0eed44e65fb8ebe0185ee777be61551a9d2a3efe98cc9c6c735ff92dd267296db78bf425b6319a3b6ed5998a6436e25cfa78168cda6ea6c6f92ddf7a19628d3f5b4ef4b29ba97297258565dc5da114ff80c7c63424da2cf93d2c19973506cb6b84c67f3fc0a7e7e8b7d86265a76fe24e7bdbaec8d57ae7490e6c4b9ac886736a8fb3cfa2693d4a443309dcc0040ff8f1586499cdcea3d6853e6cd7c66ab02943cf9cc791fe2f89ab8aea13c7b3d4adb990f3fd748cf588eb54019ced25e86cb4d84538da8752248c04353cea97c5359deeb223c87778fd2dd5d284f932095bb2e56bd31a144f8f646aad45935b8c947b37b19ba9d92a0b636d0962da3d53e157d30187954614ae54caa88eb3736c5745d2d5bdbc56f389f97d730ef9ab4b5bab3a7aaaee58855fc240774ca5783f57cde8250dd8d1946d0414a1a82fc32154598f3682f4ef4aa5d8d167956ccafc84b6c3439877f9e8dd3c8704e9482b56973f43fa67cefda9b221253754bdd4bccc4d1578e7bcc9b8e743f128b38c6f76f5ced3713d5ea3ee137d37785a35d88b7a2b4daae5b357ed7bf6ea7a67b5763b04a2944475a63f3002c3da678dc9eb08b5954347825afae18af9c1a69523ca73bbc9403c35c3b2c74affdae865ef4556c9d163dd7a96ee38eb8d469e1fee36ae770a1c3a5195f58cc9659e2dd5508e4ecfcbd937233c404ffe77d3821e9ab61033c24ffaf60a4b8b3004592d5dc68e4eb72a67936598a177a6aec3163bc3dc98734e5e206dac0774db928da2060dbced23add93752d586915a2c44840e449f0f4967159e4f278c675bd314edddd69cc819c354f68ff537dc4dadff9f58b46579c9e7ba38b2807978f1569df2a9f46a7cf3b1f9f907f540caacf7d2393b058ecc10e47d3246cdd599312af942a38cb8ff936e3b64743a7bf2a7e96925c863d82b963fc9d9ef439ff687544b53937d9ee039acedc37c66c997e24aa56f9b8c8ec16dedc28df52aba325a5a70bc134a2e73c90ecb5cecd373820a34ec7d6bcedf5f95b3cc9c035a4f1659cb5f52a6bfed895cabba19dc5125d28a079bd81a3c959fd1b6f9981fb45e747ddb2475578d08a8218a9d832ca974d992d13984674d57ffad771a1ce25b16b9a2d33b73df47835da4cb9a34a1b3ceddba53d1a490544ff17875797ac6f48c6b97052678317a99716376b96ef04dff4fe743782c88ca93c9dda03c3e554feeda6ddaf39b9bf2f7856b13604013a7f60fb4c70d49b2ad3e9139fc40d487cc9673e8cbe50cd84b11c83493ecdca1d5568f63faf3e54c8166b5b28da6e25384011fb7a5eb4f05d53f3bcc5c9424e36b8dd57037c7b98f66bad7de4d0eb0944633d5f98af3845ca7c37f1be75a52410da5d2bf9d102305eace09009e6ea21b6c543a25032612492b58247f13f01c6ebb27fd469dcfc83ac93071d3368fa128a4c71475ac1817a8b1744c9a2085e54ebb8455bec286dee50cbce87ebb0bafc32341e877aba7a5ac10dc99b65687aa53cdf2585976a06bef586e8993953d5a3cfad8a7593349f9c31010e6becd32cf6ec70f4ef88b1ab955a5d6aac2a877323181668a2c731726236c4c1f77768ed06a7358744c91c690029c4c747603289874032fe6730d96392805e10b7a50a6b849985083caf8d64c1fc257747613b9e6c85e455ace3755ca9034089162d96346e3f0cdde0a81f6a7727babab5f1401dc1832bc175e3576b36747101ccac305d28ac5386ea92447f483408aea6ab22c1027b99b9f14a1b6a67a24fccfd5f52295dc11995b9503d76c7d0ba51abac76777b960c45ce8dcc24ff6031da9a99174be42a381654b5c9697b13188a38c278d94f801a2b94685acb0935074c06272e0ba87b6214f717c01d9508d77535e444b5a2b461d02acb855d7309b8ac6b7731bab6626921160e1a35d0bf14deeb922d770be063198d5a72de076216bb366a0889773bbcdef5872934a894c7664f568ac7f1cb5bc72587767025a271db13a0ce44697aa4c0dba80a730c0c1c2146b36a50d23926df520ab3460b18687921de988c2a7c97dabacc5aa849068ad76f10b361b9a2d1436bd88c962ec724dc15a6583ca8a41704f3946da465042b808f2513b65a5009da5b44125308142478ad82ac64940164c24a599c96eb69ee5e4bef1e45066e2cab719b57fbcc03c1985472cad16a2699e4939b2e2850c1b24e8049a41362b2b908e52e2a9f7808d06a6298e059bbe1c5a87a8610a06af0262bc61390f90d962ec95bcc907c850721778a947677a226c0482b5704e7e0176f1e28e27150ad84093ae862682b4a74e8a7d330c4c4e144c3a39c3a3da3c75873dbaca4880c2940ce30ed10c395805c0bc043cd2861b2e9c0da1b59474f8c492024cecdc7676d4b8c4b3311096270d29057d05cba6494b6aa07379b73bdfac9a561a8ffdd3a43c5877d85749db9c8379abb29f7567fa1cc57b09c35e7b6ff3f735cc18473049ba2d5837edd8176531b67e04a509ba811a9467c633b962e8392d065a03865658913f494501fe9c0a6a649dc8f3256b6274cb6235b0cb278132676d028a24e07595f56c4727a7b11830c1c9840c002db53b6198444e5b63be4c46be9548bf4e1598ea6371686c63da774270b82c95f0c9a12b5c8f9a591ec50971d897b3c1c4e0701da5e26be2760ac99b481151abd2a20ba343bf46eca8699487d14a9667565ca4e30eae468ac5e6cae54b4adcd5acd74812ebc3b4066021b0cc890099b911553b95c794643a97f99a512ce874f10a3c250a513c005a70605429f5943600cfb9e4b2c5e72c821149d9c2c554c43d9bdb271806ae8b58506571c061240b6e7967417542334773178424d46122c7212e0ba7b5bf4388e8f4a3f60caeff712c1e3773fe51b357584a917bc3e4fb950c442ae17abeffe262a4a6550576b6e8297ba723943ae3bf60971b9b86cf952c806fecbe937c7b15c91c9e438ebee95e51d209e60105bc43be345167ac92492bba9549807361a06f525380f5f19f7d1bb926cb1c2fa726cf371174caad5034037d07ae2f305f4ba52f9415b0c624398b936333d68625f533d7da20d62507768a73f579ae71b2193f52a214b30921dc121b6c94042b386f52a202794bab835a9391ccbdbab2ddd94b3b04acf71a12de67cd24d1a85e7330dd36bbb6b387acb6bad3a59c1d292fc24aa6045c8c34ea4771b8137537b644997eb45bc2ef2a1165b308d3c926a0d23d09e749a142493a99ab1c3a80a87c3003990956729ec1c6c60a47a16f495813cb75c995aeaa481875830f1e906fd6eb993a8b3365189d1b50627466161451a21ee45397971d8f56634d90cd0e136c9d82729f8a76c61298a1a240f611824173abfb52ac1aa4bed85b4b18939988895075e888ac0c519ec75ebf693d3903560445414ed3bb3d262074981524e361efe44945b14daccc62e2c335ec40bb4453cae2524229571eceb64a25026b3e1ca249c127aacc08cde4203ebbcb6fb427379097fd222b4e24cb9cd47381c6b780553dd196bfc6c356f031eeed6c85b57be19afc39dd1f929bbb2d627f5f19dba8f24545f5c1f2244d7712dce7596ce08146dae6a7f474daab4056da2d22c4ad0f6aa3e88f7fa8a96067f8cdaeceeac90c2d0b5e277e56e9c405ec9420c30252 +ciphertext: 6d412e5c3964d81a28ae3bbb3d82723f10ca2f9db3fa6322598a429b9e108652885c174ad8bf1339d998b1c8cc2f17911a3653f252c6f68f4febb61279cce5a424cc46bbff959ede8b799828b2d2a7d224c9702b20b5fcf1a69788d470f5f8bd351a9dbd7e1654cc2883f9b261e2c73f40d3a97113b00673dd6da30a1e948cb1dc3e7a7611424cc648c2628614b1a047bd7cef9a069908b4a25daa193015f8d01a99dcec1256686aedf007c09870cde994f5f1b353b9349d57ecd449f5f6ca036f60bfb3f908e63c8fffff202f0132c8992d4d14a3f1c71dbbbbb1cea6746cf77bfabf8e0ef00202f3627b8e16ca61cc37afbfae596a496906ec3a4687e4ad72ce7781bcc9004badef6aeb2f72cbb2cef5b10efc9f39ba2cdc486b5d077592570ba3306b0ba79bf30c4486b313cb8a44162b3ceeb16390abc7762ec20b5e7a8270abd0468ee473bb3d1572d5df8e5d07066c4e30af725c74552d88d00627c32542fcbbb66af3eea4c495138e6c6a9922c96c587a51075197422d4a58d6acd810059747464569a4a50b24d82809576b19bf93df1f311b2224d4cb86886e2739c1b3f5f4edcf9fd3e6e4d1b9df3e2fdb2a10ad9bcaa1184d5131d546aaeb74c344f309db617bca6cf5adfb4b2bac58b6ad1d0fbb1cd6936461d32e58789c3b69f048c68121bcc1e00bcaf1a1a914caf9b56c9c72bcd9884bf1e763640a6a345534fcf0fbaebfcc5774550fad937240a84619ff34df18dcb909468212c6e68c3435d4989e1cecae914ebf5b0b14d0d512f3ea72b8989fbdac9feffac66ed5ecef1ecf41d453a7f2341207ebf6973cd2d6fcabebb815d5bbff4fc8ce850ef3541e77bfbc90d302abd12eb8cdf3d877e413d82aa2060668a6c9c7a88a3cd7c4ff3c3b53ddc2bb9631a3f36ea45180a6af6ebd040aa79e80492bae5cbf5ada46bb40f66f4b1b2b01fb22c94468469d96826ea4c120a1bd0040dfa49ba3bf4ef40d6b2b303d7542a3a021a9591849d7eea8aa29efeb8b591fdb86abee4dccb8b4006a509bc4f35782096aa330f973bebd99ae1225d74d07d7a9c1ccc1721a861900c0b0fdfa777a281f2cad68f70df6b1cbaee12350a666900c3ed1b0adcebbc4b9423f4f05469428f774519b84622078e4c23b73d0774ae055619355bef69c1c619986c13cda903aec68a851c5308f19ac98ca11384fe8c55d1ac5dddfa7c25081e0a1c8a8206ecc6b73bd33372fbc6bafa2764773a55a9b061847224ec50800ec2118de658b7bfafe47d3ab154b6ae12cbbb94464ca65edc616005e6b14e919a2c1d8bd1f5c4f3a1b9ec9d115d68c87d0293607a87d9c7a02123b71bf61e3d75196db377cafe14da53ff9c6d7f01eb3f18d43265eabc52ca49a8d00bcf7c226fb2bdf81d8edfeac40ccf3f88dc1aa74206990bfe44129e6b4d4b032ccfe30505d0e3d9b1ac0e9022698f9e010b77f47c7b37f3f272b39eaaf12fba68a4645f9622efd080342ae3c48a3a32b1d5914887c3667aa4028504f03ca99f13580caf672789f68427786513d23396455c01e5a0eeac158d1463f3a8ecec9a2bb94a027b065923e62ae458e42b62a0a53ad1cb83a4b8ce253000eadb124222e2ed5f5b9b86e807a427522a32e08d20ed45c6287c664a50bd48dcf4a9c67d30214a628cb5f6281b0091d4cc5e4305457c8162b475b7c10f93fc8c4753d5fee5b33ef22ca6f01940004b8b2f81751c4b01d4fbdb6453edb0bbeb4eae9cc5304556235fdb85a4f9bf011311ca85fc0114b5ecc8be9e59ee43750ed6b5e3d3a8a6896e91ef3e46877ee51d1561811f06058dda0705523b6fd20685f982ae9aa18b3b58a117563e2059abfe03c1bbc5a30220604c3184e51e6f626def6af264de64724adb2fc188ebde8f11a1a550afd6dd06a7b5847b42d5db0f165515c6793ea9138dd23dca2278c805cda53604b42cda8ad762cc5a5dbced461af33a9b83b4c1e085f1c4efe174b101a1a43c73efccc7bfb0b7a3a1b5fc20ba33f34037f25cb2b729af2dbe46e253919b0d70b474560eb4a7b3c9aba5575ee6f7b94de0a09f9e595c9ae67f566d1fc14ca01fc8f468411f642d37c3d521604ab26069fe9adc4a70a4c859502b1b717eafa31fd2a42f0d80f0f0804475de384a208deab52321b03f2bfeda30795c91ee7661d7883aa9d456885cc9169d4eb90903142e07def749d9a46c3b2ccca0d +result: fail +shared_secret: + +# Private key not reduced +private_key: d006f44ea63d21038094ac3083fd6f5edfd81b5a6084cdda59e5490266a351259927ecc2856ce44a83871485f77f89311c7e436ca835798ae250945a9dff3e041a7021edcc3ad5c719c9707a6b823c3d83351451fa94a7258986c064f1e8c98d6f0e40a9ce71c21e6a5a6939dfc95308e8495a47c2aab4b4d30a663f0d5ca99f73b3fa6bed9475bbfa3a6526673d2b44290deb814e377ecd4b9e2e618fad5cd2988070d9ee95f489b87ff5ac396de366fba513b3f23b9809f86eedd7bf9a29a8cd856587eb55887fbbe847c2e93497a236d80df9567e3a6b22d5e3b25f3c5977b1a1d573336869ef2389b37c3867b5e21fd9fa097c9640bc996e2845515bd4f1c3e5eb0c7ce5adb0b219b9c0846cb46c5668796d83759da4af8349fe70c314fa86846b78ac7fa5e5c831c4bb953ccdf79febfd674a8e775a17a4429a197c911bd163454ec4cf86cf94ce7e9562f677978979f7bddeb07c2ceb637e4a736eae5e9e80484ef0da83dc5e3b8cf1b8b9d9aa54d549fd5c695bd84badf4ffdceda5bb16cea1c33e878d45f67bb49572bff16b067ba85e5b3dcf661bc8742c3a8616436d117a53e6c96474fb67f043fa261884adb452219b52f31545550b5520c48da1acca388bc35bbef0e05433ea1c31b46ee3f9fcf828e6bf63dba38a0bdfd154d15c3bcfc03feaf1954f5d95b02e3b3df2ea8cfbfd9f152987e3ebe1ab2effb037dd69fc3ba9ef6ac30556340bc630d6daf6a9e71dc4914daa5fbf9ee25a4e982badda1165e88a7a55962639409af856f480ff2f830315d78c8785cb9591728a47b0043d0a987a498542f32ae13ffda2eda7ea90bfaea9b334e5354b901393c6ae40b05a72e55cf1c496dda34de9edbafd0b8680e4379a7813b07df3696afffae2c4e0223f711a73e71c8bb9803da59965fbb8c9d2cd9565ba2bdcad788ce92b85b7a468b8348094bac38a8d981797c8013f376eaf88df3cac320fd3f3d3f7998fb4124761d2ddf0763d3f6f24d1bc4b361ece56a427d28e56a2822bc941c7aacf26667c2ddf9cddd3398866eaeed4f919dc47ef3c1d249cfe56e9059b38aa1efdb2d8833b9c96ce4d945b83be74be6fe8e53f5e69612f488c7d0753866d71882741d533adcc9ac13245e3ef15bfae06761385a651994085ec4820e75e7694c5b34f3cd12a3b0d06a7194b87055b973803899b4492ae8c6e006636e4bfeea9d872b13c9365ffd8e9acfc74965215e6f90eb96a803aec837cf81987fe21457596a8fd72e649176ed70f1cc7e696ed5a8ad1bceabb0dbad6934fee9f49bffd83a07caa9a15453831898df55d5cf33899f4cc81bb7d59d69f690d784263074060155c45aee30fc9e59c19d28ec559c4169faf663af83c8d82ebd7ab18f13b1b97607ba0de5d962966683c0e4bf48ebe25eafee42d57bb55562b6e97b3d655567daf1107ac025cc8ffcb3f4dae7ea33ab0cc89fbc83b46750dd24e48d8eb1f8f7e3cc01b4495a0c7f846938d23b3fecb2ede48be7c7ebd43340a79f7e5f1407cb0da754b5aff67721c63d46c5c4fc58d88f75427bdd914dbb3ea8f46d2bf573bf59cd76ff2e5939c35bf58576f5917cf8c9cdb82c5643bd13c9b8a634236febadee54aa328dc1c2bae988f8d8746affc737f5bda768ee34bf90ce8628e64f59b689f094aef337ab0f56840dc56a02db313647b87c74154a4c6b79968b2a6f7eb067d2918bed7a94d2416384893d464bed88b6dc49a7c3fe9579a58ca4277a8a75fa7c4a734c2917a98e64db5405a3699949fb66340b36c449b685a1b03896e0ee9a84fe3bc4d4cf6daa413134ae2a5594de4c98789b3f5e93fe9b5e396efff733ee42935f489673cd7668d8cd48b733a472a2736b82ba3dbbad757b89debf5883909c82b7ab524efaa6e0e56dc2ac8c9f6352f038e50fd45f7b8ea100f6881a3890435e80e9742ceddc6a81f9a163338ec0ab2ac4b7d80145053bbe020fd5f771568a724cee02741a604c92b53485c6e7c8fdf4ef15affc608c882c59d9be5717e444fe347b0cab7b07f4b5d415d34c9baacae2c4e854d46aa5f75738966eb87322489d43ee7d83dbfa60fea71019baf85d3866a5cc3a8b93f0936db5533819aa7b6cf0bcec17e81b6659f469533b44e9f331f9fb34bfe8166aa8e1dacb5fd35d7f6f26d3b096a7383933c0cb6615824885499f79dc06b5e874203c3349b2c3b27b1f1012e52bce9968496c068b6e6c7244722621a1a44349314845b1d8831d9821eca386eb8fc254587be5dc529438485b3fac44af0613732509cf225f5c127a4056cd5e503eb742cf03154511969e7a743834708d71579e9ca4a4e281aeb177ef50cb0db826ddd17873e63a182e3b001f659ea3cc73cfaa5d7d7b5e7e9cdaae04c9944978dfb7ed34248d976190cdc0184930e25c6306312180a0b8758395d1febae95b22e0945c5fe265595a9ae91616cf9f35b588b7a02f66d8d49800c50017c7272bbebcffb10a16a5c8560130d96fb0c241a286ba949620ab83539b83d862ddce2507ec4b4bc4330c27517172b43bdf09a5e6a5fb684166800372663544859acbe07424705809587a08dc50fafabc1b2f9486ca6415266c502f7b998dcc947c7b5f5584cd34cc90a4c385f30a2cc051237c6a85d4a5571305a5182c970b9bc87268484f293464545f4c349e8b2ba3e5b4a5e7c42237c0e6e1b7722b04e3d02a27d0597d7169a49e340a778179a924a1d31c0c3d53bedb46868a62ae17847f130ad1478b8428b09fd71b028f1933803318af78103723ae7e1185801872f847753862f9f72323f980d6ba9744cb6c079341b02443b52e4becca891fffbc6084ab40bd17af7c6b2b21c09c170455c52c4c7093c44aabbb1a0c1d11b12070894f7649112f32a98d976c72291100a3bb4948f928771b063839a94a614227587d1a9bd25479bd8bd06e114894bca10814f0c516e1be41b81ccc6044a8f3654679df531c7220982760aa39a4e982ba3247b009d405c0b50969c694858889b4058089631c57dd1c5fe12acd5b27143d09a2d90c8abd8930d16769aa44a3927967b2975a329bce9599bfb170e02a7994fb90e0b1c7bc7db753c065cacf820b80c6c1d585624c93ff14a26afe6245ad8a6b2c082ec871dd1fb10c3acca1898520647b8ef8c0e45580c87f718eaf18ed4e97ea1516acca657bdfa16493115e6c90eb998cd31e6ca095066bc75057b2b71ac2a75711a7820984ae9306dea825c80f26a1ca6c686189c93550d931a1f73fc3ed0341ea703c033bb463c6260097c54bd17996a82abb0d32010cc53d81b7b7052b86abb6302b57d6a34895d09840b3b6a50c9962dc248edfcb328e94460d3c82819cbab49a79f742a86e85577ec995a025fde616fad52c4f092bd89286297d8a8912294faf7c959ca392cd40989c92b8229ad3ec91d352a6bb7d757d3709c5810b40157cc0fe006bfe843419b8a1d792d00c1505e0a63b39c7c2ca2c96f695426073ebd50283572bace67c01bb7b27b09be59e589bd60acca376a8630034cf87e9d49411648a1b05c329af92cb29942cb2369381c3ef761a02f8c905f963f0b08514a7c1302b4bac9f261fa37855b67250258c003e5bc9ad07035e667bcd6a537f35a0756bb2801a0aca56576d72f3a8c0c2f371e5aa036af3a987bb550ac06980bea73b938ce91715a4b19620a08be52695abcb3c833eca2824b60de483810857aba0a9292911c4167159b023989d061ba81c94df979917c72c8eaae518ab0e46ab8927b5b9db690bac6720667baf711a73952b033abaa59d5c4ccf676007044e26c2bb31b5aa2095f2da9724570cb04174e9ac174216c1390a687c60b6c396aa48ef849d19234f36886205b0b28250e7803502565523d0cc0bffb78efe64dc758cf3c93bef42103694b434c4819f82bbc42ab45ad827287a560ee43600b87443d8bc91ac5b15fab2701f05577c32678e06790808d4a6965c30a0915ac8fc7950b274c428a43650003beee2726bd31a09de14e892b54c2605269b8c22f146afe669dc9c4775d200aa9534af5612ea736b01543788b13c3fba608ae90aac0da9335e6c115fbb1d67938b86849d5087a87f3437ea29d7b899144fc3e739a4c079628597c618b554468f56cc6745ff6500d3118c55a8171e42b67ca43ca32135672b22286f78d0485b363d63a2ec737d2aa98ae602d3c485814d2c195db5d7bea8b3ae5470ff7a1e8225f82d565414c6b59379cc5b26155f682f6098795c52e3e8acfed87743737c1bee0ba875a95e9509d89f3667d741cb3aaa989378a2425a0e5f218c02763de4345a208c5bbe4949a506dcd5b01c5f8f4ec5f5bae6946c95ad7fa4e1e5f80354b5112d882796092029150d5d6211c931f81fc67b2316f99db7f55d799363828f7de74b5e979fd7620c7449132d44f3029e1be4e1c0258c3a22ff5b50b2674cc094ba7018da2a61569845c17d26f +ciphertext: 29a04526a0c95d33c0ff721ccfea7e7c15c88040d8cbcc77759871674a074b97bd18ac3918db551fe069642f81f09945bf219c631d070369d50a317e95fa46599a058cc549b706584dae3d4c46e697876303bfedba4a19d83dc9bf2b9e0b6067303fa374b47548f70137324d1a3b0282af3e58909f5fd542bdbbc224cc54de3740e9e9f97f027e065e26c92e35c5ccecfdf6daed38b5901771eb81e6cd1ab7bb2e1e3bbb4293a64851faf9b0e9c9737710f5b38262ce26c6e01f5ab14d389bcf5b529d1fde7d8373ca6b9c073cea78836047c35f95e8abae2633c883069e77533db76dffb6a736fb2a64bc3189f9a82153787e03a79621c57fd4a110d262617264c94da4b7c3178f469790a7d2b0a6fe1126294f798aab1a41af2ae9e348afd7af13ed805228f378a4582810753c0faa9b7caec913a32275f5b9b67b3779e268bc93db076ab774c6a171ec6733a61373407707ddb539b8fde040ec617b841d41dad7bd094f3f3fe46a8953651e58ae11f0332c4ee155b9dd3330a910d7f188f12e823016f4dbe751608e8704e2508cdc0ceec8fb9ce26f792d0e2469e4b24d275d6f020cb39fec52f92672b6935e15a8a83a64ac080cc4f488343dc3d5fbafa73f26f44cd1608f96c799336d84e4a82c9c06f019e49ae3871ba14801d43dca78cc6a05978919c9dddc7e8371546ce205b9cef943e939586a07762feaa427effd373a0affb7feaa691b960edb8abdee3d62b6bebad516cba6d6533615eb25194c996255bf2c6b04c8ca1a7d425f1ecb11b28b2ba5af11d4135092de06313070d14efcf6794d3a200e05a398da25149c7635487d32e74bf69491d10d2a17b712316ce5629787b740bf77673e9cfe9d7459a4125d4e0ec93f69e0318f0a69c36e597a65ae21957a6cd659879b3a6a9d5348eaf378ef2b3efa893025b906f2b86bdfb1d52e00b64b26701d4f3a88a50c24a8a534d70c46c90cc1e27851c11e679bb95de1eed93b827dc9fcde8b7ffa43c98029877087d74e6f0af2dab01aa4c018c89ba3a4b0cf0bff09c1f7b0332d15c8f929dfadbfbb2d272f49fee30b68bcfbcecdf22b739d4fe9e9033b94e545c1772114e7cad746f14885a67f1ae72a94cbe4fd6087efa70b0f3851eb9561e8b737897022b3592b2562292e6fe82eba945fa2c55afee464753d3ffaaf43edd0b1342f9f8977fac2e2a00dfcc3954c3df9a0e482a89166224cdc26a29a682807aa24842db39d7c867fe2a59d062dd7e58174e6fafc0d0d9fe9dd1bf9df791feef3dab0d3e1e0f51daa5c2a007b3c2cab400d0da44c7c1339c403f4a0341fc73bef02339e9f1447f9de95129e3442ceed7adbaf470b795d902995541333a1c9ed5a3ad6ed4a6c7ca0bba221a45e7e640880185470b1b8ac00511d455670e55b84ccd8097687729c293f8932e608d279dc0bcecc77a986de4010290ceb2a28327fe93d7e191eb4f1274eede3ba1bde770fb6c7542cd9b3147a574ba092a05298299d6968a4585d727d0d5cbaa60d0c7e165f20ff50fdccd56996940f8173d9887b75aff72f16ed907fc5a95666f22ebb127c439375257b56adfc30f4c06585019f941636429d8ec9740cba71da5fd7c4d76d0a0e75d0b024a61b8ab66881ae9e48f063ec6191592040d896be263c4b7559d3d2d218d11dc8a3d4cd8c17b19e321ad796e9a91d69e2dc9c165be0e35825ccc3f83bc1390f2e1edad44e16ecee5eda90ce6c76a9275207469575b11c113cf045496941fcdb646ea8766e98214b8b2ae1a43ce2d7163df57600e6be191c60d65b36cd15363f55718fec02d3e61881aaf99b7c6fc4e3335c9ff93fd9a4072af723a0969f0be5458b29c5a2e7bab4274bd90ab0e66527d09fae43ddaee47a122b9610e39476c0921b84b7f3fadd309cf0e166eeee533dc99e7bf38f3a03c4eb8aa42240607488971f9d7283769a289c4531c37b90a2487aa9ff876cc2dbf22e340edcc0f71cafe5ccaab8628c024e4f3ebb2582e5c7f1483b6a3c0384bf9c75d0be7913430f876303649e14c43d9e2fbb83f85bab7f2198f8c6dd01f95c09bd876c853b041fceae938f138068ede7ed1f2f195161dc657fcc45c367cccf9cca84a1d5ebde17e33e5e225590bf0cc4407929ed5643765ed351efca55a5b834a49a482962d8988473165887bcd57f89078a3fc68d3ff12fa2ed354a23dfaf3d189cdd7831 +result: fail +shared_secret: + +# Private key not reduced +private_key: 2b9cfea564fd9e3b90c417523f79d10a0d7c5aa979412dfce5ec7bc9bb471726b203edfe4f97e063cf81d3ad95c4cac14d6b9ade99421d2599fb696942f6b74d349bc24af099f687f1a3b1db37810966e5a44e862246b2960dcf6c48f8085c8f72d3d3ebb9773de9dc38eed01be7de1bb7dab99cc2440a6d8b94e314e84c727e8c1f08d3897abde7694d49f4e60915f7a70db2ab4578a378b0cd9b523094d3ce5c5ad198bcc6ecdb3d5bba010ab9d6ce8ca43ed111654b47fa504dcfb34ebab1a9f3f8fb963b2259ed5ddbe3b5f46b3f4366920e483e95aa0bfc83cbfbbc6666f69eadd138dbc2532d6fe88eb007b3c2a26740644bdb9e6cba3d83a3547be12baa3113fc5ce4e94dce8abb128d564c6cce9583a703ead22e2da14489426e6693ba37e0aeb5f761173f5f5379cb8eedf6a7fe7264b3c9df8060bd8880a6420ebaea060476e89f562cd3cb8a768d2bb3f403bf65943db7971aead388fd670486e4e73a6cf47938549a8246991e2d5f4a4bbb8f977ddb3c8f735ee0cfdf67ce78ee134dae0c9674c5ffde4e9fe94a1bb836eeb56166cac47e4e3c4fa6019fbd746665e253933d6786dfe6b95eb9a98f8cf99fa9993e8d3755f4def80aa7de893948b5bd65366288b7d00c6a5c3b7c5b00e7e02ea95f490bcda8d6ab396fdc31ef31a449a69bec79cfc8ddadb5d739f83a85d6f4a1458c135875a813d41f186fb6d5dd2c0b657b59377cdfaeccb343b56a7a5edf466fe9d2d5b5bd3cd3557fb3e465fa8cf9ccabd06af4ad39d988355ee23e8789fc81e5eee2cc797dc6ed87c0dae9d5e8b85c57463f456868eb585a188a27f5e858f8cc8c24a9a1b47b38934e07c9f52acd722b98ae0c3ba8d703fae1acdf6f8d92acc7c6170ae55c37bb4785d1c29e9b27bd41aa6641362a480397c5e054e439545deb6b5c48ede539337f523ca078c6543ed9984aac812638a00fe930a07b56e6859a21fdce556e7ee6b8395867319a3d583309a6763daee09de8b70f536d33c9908eb7a7b6a253bdd073443c9ff4bdfdd87b3513536d93c908188516749a28b9fa4119e9a2d8d3197bee4a533cf8133bf98cff49fbbb1dde9e2f3838f4dd5fc8e5c11cd6d2ebe5a2a5187ff2a74025a7af16075fdf88374624305c29e116c9bf59dccf9fe89e870dd8a6e3c0b0dba7333bc4c9733214cbf33e05c8a033ae93e85bfbdbafe41f60e8f7a5a1abc9db3d3fadc8697a264013addfd1c7e3f8da7ac5ca8f2206be63d3ec5fe3c6f6188deab3ed8a6dfaac2ac5052b982e3a75b385ad353c9c035c862cd5a62a0d76c959b11e6a4832793378b9828c0f36e016bf6817511dd9a8612fcce528ff671de3f9bfa036a993c90740a6a5ae2779724b6db872e5bf76c78a6d95997397bf119fb28289f4dc0e5cab2d4bf247e0daa4ee0d4aea05458ee4386404aa5ec1cbb1099f5ac57d3049ad9f388e4c78e63fc4c3ef244ec55a3ffa6db43d50cce2d8c88962cb7e9149c00a4e4c51a7f1b639709545f4009b8be2cae644c787ed0ade9facdeaf8ff038fd546fc96cb333a0632d6436ecf1f78d6099bb5fa43879e2d433caeebe8b073077ced34d16fad0348e6223e76a6da90b7ab4dea8adb0ba41c74bfc4be4c0a17fd0e3a975042346b62f44ef5334ca8e89257d92a29d92e8833ad53d96e4b47c50668356fcdbc5bcf12e9ae972f4de7029561befde33caf9f97cba0f3e53b338a0994ebb6eab67fcf4ea86265d6a2899d1b7bf4416ad1bdfe1f7969914a3dda09844a36d3989998542ea9ec25cda5d9bd1fec38c33e84d51b93c360a4d98d439c5a3d63a3747fbacfeb16439ac7d35490a99793939445ccd33c4aa2974aacc2e873a7659a98bb67668ae47548ab98b336f3ed33245f2dcec9b59d8def0e5c935b697c0ac85da18766b39cc1e9ce319567b967de09c3cff66a9ae528a88a06dde8f1eb9d54869085dc54bce785bf998be78cc935bcce9f8e85efa9f009791d4a687f23e309a0c8d521d5d2b75de295abb3fcf9f1c5fe0631486396f601a5f5c844974f12a9add84c72f3f4ea3698bde2b33de8770aa65674f43b862ef8e53e54df45d40a4b9eac6cc4867635ccc9e680d943a488faf83de7c2fc8a3f5fbfaf1ae525a29af95dfcf7c8631f95862fdeea402ee75de0c3c194d72445ce0cd22ca9cea98bcd401164c349b35c8b36424f294b11ec7c7d0a3953fec20dbb283ef99a3452496d9b86513e33633765c10b45c6612bfcf590f6036a711eb3dead00067649eedd14491716caed40a3db26d7b00c6e8396858c3916397166d24370b033ee54c3d3b85b5382b1f3f1220325aa2f804bba473cc70b15d443548491416bc1698a5a9c39dea2ba59171f35569ed6946621c1b3647598becbcbbc72a0781c77baa5ba128b1b7053b2de9c122b8790125c50e003a119964aa48392a96b01d7675af541b46b4369b10c38a2c68ee5425c5f6293c2255a19a7cc2607774d342af773a22c3943a9b411bd69a92e1c756993a1a392698a93d5f4772c374b549c15a0bd636be908641a7b8ed758e3c341292598b82a7976f45ae4fb0bc2af0352d92751a6a5e5015444d3b82cef064d32c3bef9b2292571092360e1806b5e5a892586029ab421ed247afff408f7fbc9b5cab930a6896b1250ab1c58ac4231fd6d0bd9b990b649028e4c28e435093b36462e28940fd2723e7bc20e59914e1c812bb3aa912318f15472a64b75c12ba361b2843751611183870a6028496195cd5d219698a89dbcb2c1c06ab2bd5937c1cb5a2da7774bc3facfaa028829f3c3c9bd6c584eec882ccf3ae1b00b1357692ed377f09712a30fbc73f17c0bc462a88e64de262c24e7a7f7c784dbc5b615ad57e58484db23363433a4680126c2eb5b9152c162e3277c0bc4da9693b22daac51a1c6107242b7428ac3f21f2c3968810435f9aabf3c65b7db7b37361218b49b9c76695b53c9a227963ccc1b60d447b3b7d15765bab6b3b73585f26c2f0862c927b6f23624f360a4f6c537b09563adf7a9616a4dba03732c707fed845c35c660b5317ef652055843cbc28ac501dcb493eb5d6bd5c322ea2f2a8b61418b9788482f51b8135f4c1f1173895057ad3218387d527133890fa3a9425d73ce03e1879b85a5b120285b823501487d5c555ed2b7bfac82762b9262d3d4b3b64736497899a768903750bff4a82e6a0097f3c230dba5bcb0ac95006852bf60480d039d1fca9fb758b5562a384160acd9c489a3b4bdbcd96989c57eb7a411ea3540ada882aa567fbb340b518477839925577c780953bafd0cbe2803626b89cf1c3b3056c4bd78c88818211fc836765fe813c7b18e5dc9725978ccd9ea8c7e1710ddeb883ad93e2cc987024b817c30908ab1ba7a658399dc931a4ba4fca5a10398289e9718e906336b148c328c2930b843cd4ca0d4735b633618e8c1c327b29596c24bab053867747883231f11005ed6987679544b51c45d42cc209b7061a91a0c82a92c943c85c149b79c1a190716c03f156d3c22ad27e7b8b87962c8c5421d3b01c7eb2220452b22d813d2180e7a38be15b6976aec7659d25b60d3c780fa75c3654d7f9b6de0d33c8c28c97b6b95bc8c2cb517b497f73a98c41a64f312fff48fcda7b07e86a8136c05720a8740d866bc024ca1e22d43f6470c8a38a7301b3ce74585e6ab8b899b13ea39c163ae79e764e0b846fcd57029a73708091f053212c6f93f1173a854b26d7e49bfae38046e43193b98460d171fb48283e736c7a1651deee6272387cf65ac876feb4292bbbc9200981299c9bff13690d6c2017bbd3e257700a111fefa33072ccc8e952263e4867590c79b558187e3441a930964aa3ec0441e91e7ad198cb6e8959a35051ddd972a43a020d0f968eaa8696b9686dab01b9f9b8095522a7b411d486444b16ac4fee7b245f50ba1a26d81457b802bba966ac8eb300cd92773ca26908a91a2e23b21b0116dfcaaa5f4a57514dc2ad736cc788904c29050389b80cafb0d71b131b567551f6a2e16390c55234e5ad50080ea6268047618b333a49795b4233bd07530a89c275bdabc4ec99d84a812d9e20e2c27072196138386ba42cc4998314905e070ecab69f2d12aa204a32ad28658da3fab69223521b81461312cf88700a49077914af3c28a2f544d608209e24cccfeb46ae13bb90e8b86a4bc85d5f41a9ada7a957ca8763acad6713623ec20e2f199b1270966432bf2b8cacec65776d8a63a471cb4a7c891a01bc92c8c28719c3ff9a8a7a350d9454729d2ce932982e94bbf30b298b3353ca6c459ee5017fcb724ff430a9348b9fb46abc86374b245668ac71096501a7f3313823c5749e01d0e40444111bebc0a6858891224b08cfc8e74c41084fd5c03c102480537c11d5e63a349785e242cc58bf790539d3adf4844176afb3ade1db843a9e6ae9f1c0ec046899a777655233e4e1b5ca44e9afbdc67964bfd5d5e3dbb45e60d03cf +ciphertext: 63d6fa95398bbb5cc6252d3f85dd6b4237aa349b547e8e797ef542fb715f07e00e226a4531c7e73f37fe3e087a03ed41c2f0959aac4262b2abed8ba6c6fbec26040f0eb47abb84a3c6e88ef2f821cf78d4cc51751083006ebf5854086c9d3f0faef0debdbbc1010af6288b7aefd203ec88e2700da503101b6c470267e109e96717404e2eb97f499bbb6749bce23274c649b25ad90bc7829f1b63a4b2c26811fd9add3d29d1818f00969f73f1b6afdbb68cc8423dde3630c679a0d8c934410287719c7ffe1b6eabf4415d4f4e14746086a22bbecba104ea27f7efc10a40bb1a87872ca72a80669ab1f02956bfb0311f87173df960b2417381b34cdab574efd7f4c884d879606684d344431c57c1b46b07c8bac3243e4969f484b9446946c7c0af4e2e5e05ab87f527290ff9fae3edcf5b8fdcc0b3de2034f26a19f0844839fb26e790e38ee44e21c9a01d96f4bde5296e021ec68352d938c1ae66154b6efb60ac2f5c96eb0c269b0be10f4cdbcec80eb739e7d4c78fe410fbb427b95cb1c09b7eacc303993a25b38aaf91962f4046597da21956bd98f9575bf1e9fac24bd420ed299f8940d92988a2f44647691c616542f8d617b19363570510a643dccfc58dba36a7aca98b277626b56672d21e67ee3af62b26921e48c2b69b766dd6b30f942a7025762554c9bf05bfeb960e0696bb2c7b1fa05e388fc5e5f495c2a853137eb15387fee4455a54dc30aabbbef10018e4c135df1e6fbf2d5c2399478039eadff9151e9ad56f8f0cd96eeb6423224df09df74438176fd5dcaf7e6db01b89204ab099802b94755c0740975198a4104001a2724b9889a60411997040938895b9b7d6889b17d0f79b97cbf249fe33eec67c1d77b84694979ea0e4f7b5979486ec187ece4de8d017b01d4d65ac63fd0c04ae5d5c073b15fc182438acecec41bb9b277157a2d023a9a73394491d65b3f103e6f498982645da202a0c8978d4b06a406f8561b819a8f4305deba7a8fd67801f62e10445de38d45b487075ac0eb698525ead41e8a10047625922f197530cb6ae8a1714265d322f22fe4fc97f74e585452fcfbb49815c793e65585522847ed4cab843e416c777b19958346fd716378bc78ac25e6d2a9f8f81f504210918261cb8afaf27ee2a97b53a9e044a17a3bbff44b7e1cb843c01bfbfb7d3f3c014c430753308ee60ebed89cb10f55541560473b4481a4d7d414d6784f7a6eceb2f7b68eb8eee39d093b7f5c98243dbffe414965a5eec8b9c6eaa79885366ff8f414cdc290ef8a9a12f89dc48aad20325376e81ccc707fc90cde5a9d8deb4dadeb06a8867e3f0c9589798950be6373059772a3b9f68912c227a37266f34d5bff7119a1dba2fb43596d239c8367f5d3aeeae8c1f87dc2a84f629ea5cacee50bba554cb1a17ac7e8674ad6d9ab7ba149b621f3ed1889e904248f63a94214806a4fb634ef53d9ed39e18eadf6cdddfa7e88d897943226b7555ff9b0773ac7f538e377cea881c5561d88fd8346d21931ef7eba7f87e3da5582a7939cc47bb5817edeb8c369373bcca25ef3ac10aef2f404a70abce312a5c7443bc50f63d516e9b151380a8d57ec19a65c3926ff2e5e5e6be8455bc3b4bc543cb0cd7d057966ec422d67565be74fa0b6534f90b4271d2786c553839948b873b2dc6fb18b9e045a75cac00d98fcad5098d24014438c717174a5e62808d386eedc22cfc6ab5c94ebd00b164f0c86fe25de8981850ad8d965db545166eab7056d23944d0d1a25fe0a77c33df334ef7dcffe8ef353c724003db5cd42e1d80d2bfe0a2531faf2c5d8408608ba85e1535f4f5905770559a069167c1b5c90b4644e4420c3ca700a33114fd71dc2f956c958093436b77805781da06bac77019fa8bd04da156a4c595f33ae5de0e16d4435b227c9d2783ea3fe02a6a9d273201cdb9601da483e74d908ed10c67576dec23164e33b890fedff26cfe273e650c731df6ab11d010dcad78a92de3399f4dfdad418026460eb361b54cc4621d8bbed1d95de9ae21a0aca3d82c33848b84918ebe928024b2e37217c19ef27b80cfa368e439485886009317483c380dc822a3cdadac0e0f2f2fc0680ae72792a4907e70bb5a12b02ce1ce7c39af82880e6fcc0fb132cd07571aa16e94926e0efe2336018e01dc021fa99588d3c75fc31663e2a25abb66e05ee2034d642f4b2cacad9fa5ca1c15d7 +result: fail +shared_secret: + +# Private key not reduced +private_key: 04a39f794dad6e0c41094e36f226d9603ada00cd8e10fde58c1c3c27845ae72e9abcfc95e738e4a977665594ee4659ea9ee3425a1e3357aef3d7ad9a54a8a253a49afabf7104de968746f2ea93bd17da439e98f26a333da9d5f5b856c7ed53593b1df007235d852f5fcb0f7493168f9748c4395dd4d873abe1bba6931fc7fc4ca89ec745ffac84b99c870796def798bc1e7c4f2f0344552d54f3c46dc72a6f9d2b9303e6cf124d40e146d87b66af5fb47ec6a55c12ddfacdaf3f306a7221f3c8157d714a57fea92fbd387cb29de9ce4bc96655d63e191ec93a84de148c994e149555bf4edfcc6b4878c5567d971d95576acb6943c6532dcfe01b4468cf578a9934863483617489f758c350662ff4a3eff647446f68ad56180ab2afa34ba27a76933c9f4f3447c0ac6b606be44a2c9f2d6f6e8f434b4f35ccf894327c53a7dac9d09d5a9a4e7bbf0e7af2d50ef1b0d4fae4a7c0ab08774cf8a33e069d496d655cd4bff1a4da233e4356e8525213c351688b1b7f5a6749e8088d31ec47d80956973266811dd8ca275c9a75fcbb7b9891c26a3e343b36bf5f73ec946f4207d965bc48d6238ad42b616d1eb708d3551d3b9dc61b653e06b1e77d9bc125f56687af92a4eb2fdcb99958e84c0f5239c89052765b3d63b476c3a4df499564fcd74aad349614d029da776d686dcf9984ac9354c2c69f2c3c8d3d5774201b7ac0254a891871847acca5099f89733fbe2a4979dcbc26f5c38efc512aed83f508441dc6c7eae73b1e7958671767969be80a3b34343cca94289fe0a8788b1cc8394c5710b9ba6fbcecf3147db32c9060a9cf2d05673413e190b53ae189e7e419d7b628f6528cf77344c8bc4754524e4e00e3cfa7ce5400cd5a6875c7b39fd7037d6567bdd460acbe591f8e4c86909526dfd0dc303ff8ca68a8947f4ee0c626c707ead3457e7297147aee5c39839cdf73ea57f713d8601ba55e977bbd7b681e0c4c1cab818bae56ebbf4f75cfb66ffc8959c361809f941f2cd935d89702d7ef4d76c4450fab934ed9055d4ab5f9a002d3f1b51ebead73a81afdfd006d8ac368bb8933eaf85a97bb7bde23bcfca869306f9f39d808cb254efc48c4624c33537b8d92f6e8c148add894f3838db9b0fca4e9dffb6e791f7e932d42fe4a3c20e5c48e478bdb5fa2bb0a85623df4ff5c92801ab1edb8fde8aa6442249ade4b6bb9886015035d436a855cb495f6885f6e3d84f498affebe7273fef7bfc3bacd3831d07cf0569b92fa9b902797d7c995b2db1b63a423a997e37a244c763394b9b28b3d3538c981eadbe1556696a7330fa83883ceb7da6668f1fa5841ea5a984b4f6f4869356682b975fa842859bf079238a83ee3d6b0172df70498f47c6b5e63dbee433677333eb6dc6bbe6888345a0ab5cd37d9154f786f33e3c16bab398356f1899554c69c50cd9c9b8fdfdd8bb1de03c80f5f41d25559fd7568b42ecbffec8f61a4d3662a61c696ad90346bac979a7e446e41d5582acbb5e007dbecc4330a65d854f6deec5f901998f5a20dea15cbd9501dbc0ccf957253dbf8cb8938a4c182698557ca49ba9b74954e964089fc3fc3eccf7daa2fdf4830b65efc4fe8052c539f2539ddbde5335e3717c7bc562e799576712763f7ff44a79a49b92f343a533baee5ed6cb0ff3d7857ca540a78f886be136b3506cbd80ef563e8a3987c083b4b5cbef51dab212e3af88d7d3d5fc58c95fdd48c4060587ccf259f0004d916ea86eedf76d1135eed7db990e5c11e97c470d97ce45a3a105a9da1ca768166c86d4e474bf9f536febcf7539d09598e773aadf39a5b66ec79b46d699e953bb0babde5fdc707b99ce605d85217a0554d7073bd84b7546bfa95cceefe666746bfe74c674fdbc80edc35b4769f60ed8632aba9b5398e79dc45ae0e4a8ab539c157b672eb74757c6632e6c9233df591af7dd1d8f527a36288efab7b3f7a264abd300634236e49513980b9dbca958ce560a6c32b2d328b79f6c843b53c635719f635ede9df3c63e3ee1766563a7a9ab6b01156f559cff9fc9e3179a438f3b5b2f427adfbeb90f74afceb29dcc6dc713b83afbe1fa54b1ce70cf973368be1db2cb3e5d880c179d4183fa276b93056e4632deb8607cf76a0897117ad82958fbbeec870f19cf47309759a7ec4e28df117a1c1ca6b5b6bdabfebac339a5c121792056c508ff99588d292cbcc1760f1eccbf105281116a623c600e87b4231c2a94689133ca16b6d99796700b917262f4d776d10709a26123a5af9af5ac7455882caa4d220437271aa5c9e30877a3cb263f9048a483a826774c806941939c44274287b629b2bcba56f19e7aab2b8c6a3f72bbdf5820c774c48a151c381a5a75c27337c60c406cc1ae36a3eeb25d91521918a780d75a69f94aa4005771a5c22ed4466811834fbb238e6351fb055a70c32994442297f273752db6f03f445804c0cdb380f838c484c50250bb2c849e308d8f608ed942442e85bae7cadf4c6c3a49cc1cc107ff32154e61a99df1244f8f956c678ac4192aba83b5485f284f1510b816c26d16922412738db9796cf6023e558741c7ca293eb35fdd71f9175b838377fff3050d447a35e208027881406446061686621fab300755a15921be9d24b721a50976884c76ba928405ea9e6b7b357baa68674bf412f66f54a454c03fc2a64b1c1142bc56cc535911efa578c5a097d8301836cc641e078bdf1245e5359a0d7ce3a87012d199880a3ab5d61753488782b9734c26947b6c925e4fa6ca38475905a9f45a88221db62b762b4c884344cfc7d81e55fa34293dbf49e4e8bce0bb95408b32bec404a245c153042a3ebcbbd8598a3f9537e1403319a5cc6a006a37db5a3fc4960ddc5381a1b0b85657d41d085309b47c9e21a0641700a14150a0b3e00823e76c6bad867c6f3e6568eb840b9a9c4f4f45d35e733ae56377b9c2e008b66f9436b59320f3107aa43dc123bc2a89637637dd3a26ab0abf355c0fef642632523611a196e2402ac16c38562a0f8c65b6a0485dee1492ce2494b7230422abb2d705333d4c3f4e10b28d3c4b3266949ca4b95062e3d600caacc77655236181208c0dc4487063ccc528961661dc0e474bdd88faceb2ec448c1ea8a6f14206a33195e30fa4efd463b7f438ecf4ace66090bc268b532b251d783bb380380e12a79ac044bd72c0d9478018d98b6e4e36f234142347b919601521365665ed05111f39698c43f5b62c047f1ba861a91a1e29f6bf1b8ba376280db89feda41195a9564d17c73f4305d73cc6a606530179029e192352a5aa9e58f4df6c0c9d8846da4518192bc360544f734340c9b072cf399806906784073f622ac18c766de49a65df56b6ff99a6e896245c7aa5585723d1c6981a0ad2fc09115b8b8321941961959a8e40b37c24a66125810223dcfbaa093510bf0b9c631e65021d64bae6bbe847c7576826506f73493d19da8d47f07898d179697aec0a1df3cad227cbc83c33c6b72b450731d943041f79136d34c7f039558468c3de1e3021e509a2d898ec1245fa9a966ba457e5894691899521362b7f2d607578b01f230365a84c7ae1ba12ba53c1e216933a34e53e75e252c52087c615fd5ad705743494b10042b033468af0016274df94f2e65048e9a4595a4b541b082bcd96e6d90a44af778077007c069ac9673cb4a559820a2a9992c4500da89f5acc48a6bc9ac1922be9c211f36c468986d0704121193ad5e2732d693c650d867234c9c261525325157fdf94d89eb2da1949a627338c0d07b1cb9cb45d95b64b38a22b029bcb87c928c7c97984d760bb11b9666271aa914d3cbefd723d40928ede94af17516ef7a72c1fa978584111f8b0903c544dd7c81d94a3b8502cc08b21cd89c8fafb94d9eb57f9061a51e9aa6f3860ca3da018dec14d46981062b8ffd542747e7c83cf815989117ac14ba1654be4a92b396b01fab274a082609ed9c685f125fdc4611cc8c00167a8be5f28f0867397da186ae68a29701b4c1885235faa006d45d30b990d13c479fa5b1b76ca2406a46a0c42f9c63cccdd187f5e93b16f20bb86b5251b00842d28e58c86dbca41ad708a62c28846d0c983dd60dc4f5b018017fb1276eaf839a2898a8caec69f11037498c5a621c05cdc5bfc9ac9dde250a7c4c1531b813b3f84e70a43baa43950a9cacf07c9dc6c8b8c4a660aee6ca67159a00010a3414c87fd94ad197856d9940ddb47ad0d8700f635e58408a5af8213fe4636fcc594ee677b3f205e3552202ca8087922402d24ac4f42fdf5c99ba1356f14cbff297192a40b48abb531912b8f853a07bd241b19aa1effa784e5746905449b1e7436a79a28e3f712507e5bc0d026037001723d3443145bd066cebaaa3d000c9f0ca5955b9c5a4f2ca172535d5a32ef67d54f334bf726829082485a7b83d43b46b236590a2e5c7ed86cf2c5c2a898662bc9a81418720bbb632ef9cf0b845ed052d73 +ciphertext: f605d7f505e0fe8ef088c83ba4fff503ef6cf01cfd1ebc1de439deac5a95f4e38b9538d124635bce71eeffe55f70a3674eeff62ad618bfcda3cd2af15ada072885cbc36b5693deb6aa5e9391478e37f43a4993451a1d2ca8b1c7f305eec6f33cd473f5c0c32878f04697a215f721821adf39a35f1e6387cf545e34b2e6e7752e0c4059d659c93224110c42abd2d7661d1dcf8ff3c911b25eefda9878494336447ec650b15ce1fdaf1895b55b53ad7c67eb2ebfaf8a9851d0f6456b79486a2499b1cb0053d3fb4b0e2a71cee95ebf420cb0cff6fe121717899dff28bccd41e2a501e5667a502491cade70d225666e4a37a543a6336ee70b6a8d0a9fb63d4c5e463b54a0057e9b787b4c06707fdf6444d6fa1b3c93c31761b30b72d8c4d7367f97d50a466af778616748909ccd7e7728e4a4e572e45dfcbbd4527c11adac3717ec369d2cfec6dd81ae8242b82c35abaa7c960324bfad3f852b4e6a322b90e9dbd614c233cc58dc0fd676106990460187b69d33e572e638cfec27c025c507cd991d5282c83b48871ece91b7255e9675aed2fcaa4199a429a6bd8b83632119bc9771bfa14480f3b37cb7df7f80455df8f9367c216480c3289eeaadab9aaa845f5d078b756556b3cdaa03c00c984a32d3f3f06faf156981a26df5e3f6a02fded61977e366c589fc795baabb8858bd8bb371b12cf4ba2c0d432df56bd431d7a218067eb2373c1fa69e3a84b7d5678119c57ab67480931a543fb81bc087ce99224eb1a47f9d592a874d56eb0c4330554bff08da929f9e95112c1ee6ace229983014efb098b074df89dadb5eff8b6bdd415a1501d0611b6afb645a03d964ca2ed657e8140c45fe6e2dcd77c735b47c944867c42cc482376fb901aca1b16a2206a1a64987a321e7ae1b93f64750a3c3a2f409ad5415bf829c7721d39326fcdecee96ae1760e0586f38966e4950e7aa8ac7d7b9a376705cd7d00c7dd16f80b2f43e51494f23f4878a6fecfe78fc829fd434afd2a92926a00db7374bfd914393b649e1c83106741ba515c935ab17efd4cdf2f2f21266aee6895a863d4ec76e664ed6d4aafe4f6a93209d65bc4e07d1da5390931f67b258e815d7e690382fdc30ed24ed71a4ba493f414a1bd819e03954cee59536f246f491d041fe93eb6fb304c73efe1ff24c7d27b1cfb13434693591dd1c703253dfcba6d2f259856c57ca3fff6e3945944c11572e639aec5251d5bdcaa95cdbb42c32c46312cc8da6e4cfce716a39b507ef2edfd550a4d3ce610811b2908e7921c86edc26ab8ad7be77a218a5196a0f8f7747f82a1cd7190b3c5e2dc9ac9ccb41fbd4b285c549957392d305fb73a5a383fc1201488e979e15a96ccda773a0cc4eeccfb66e1a4c0682d7d5999a1a764ad7d0985e9232fb703c7621e7ed0c8ba06f772fd64e29e5f3972e49326052807179242ee5cf1d56120682c73c4ea48c135024a3c75a62bcbe17c44b6777d0c3069589bcbecc80c056bc5643664cc7e89ee9ce5df543b1592792a58528204bf6981a62eb5f19384a735d040dfc2febecdde5b7aca54031cec4e3919e54b2759d61d47d964b17c4744df220d86016a73a04189c6ea4be973191b65cb695d9de8d7445401fffc8653460cf4a21f55dd57c740756a8675660c71e5c47dae0d2063d68e355747bdc3b71c743dc4f8fc6e2296bde795bdfad9e7ef9be2cab791dc2862421716744594a1f5a92630a913779a0bbc2dc8c55daf05a7010a24f81faffadb2c5490f42ba265242d34698453aa40788a6def27a7dadbe839e4ccb23fcb72c10d7748a86422dc2ba55cfc2f79adec0363ee4b8d2eaca8a0b23ad4b6a26c8193b9172ae25eaf52fceeef855a4a61e4a0247abc5a642a435463f6ade5fd978328883966085aa2371899f39a84c18d70463dcb9c04f3459426f43d3e23e3246baf6693e4fd216835be3f5f9377de1d96c7d7062d0c62a700b24fef99c6bda9e8f818773ac4ca5dcce6880d30c9ca28191a43629a020e57a32c04b3e198006f47a8098ad93fa697548c33d02ddb81578504ddcacb3693afa604ad00edebad0391c3b73b4766c3ed02f9025aa39fd4c368ae961d44114f3f8f7c422117d494df0b7031349de637cf57245cb4a818d95ffcc488cd887b1824ae61d3a8511d95dcbf495d9003b7a3ce53465dc1ec6fab9f6c0590f76372a6e51e00b8d11135ecdfbdfe2d89 +result: fail +shared_secret: + +# Private key not reduced +private_key: 93ab695549515d75a2caf8a97b8974e764d7d5e56416d3a3010c304c99aa39d468bdab9dab3b87db2cf7a2b831ea3595d48ed39345c37a99f328287cf49f556194949288f8d95a713997eeb99496755ab3b689969f9d7ceebd5a97c7976b3e68403f9fe0237798f9387d5ba1197dcf6eede668ea8d0a74c0aea46e13697dcc9846b1a8a9f2bc5304378154bc7cf8fcfdf8fd70ff06b08523958abea700df3f9653a821767a36b8f94fd59793abbb834bd9d7ed9e71c9d62de3d55cc9a050adb8e6e4eae21dd1c18a398ed85bf42fe8542f71332c73cea3862877d81a9bfc611be7865efbe304ffa659e7d3ca6779ab65828d9d5f14e2f589d19a35c6ac2ea4f924ff9d2a4b0c83eab447a002d7d29b59dad6ce372eb6483b2d5fedda3770feb43253de1738b7ab9531bcd48b4da54f4d3a96a00c718fd8d9303c50d114fb7e49457ca5e2e4f66e6b754160aebb6b23a1edec751d6daa619473b9c489d6c5c4935380dcb67ff7f59d03a33881c6d819bef639386db06c6ee73e3f98bb8c1163b2c95f6744b560f1d7c67235d258288a7886ec99a8aee39fa6b0b48b81df495684891a28bf0d2f6de929b8239f89f4ef90d21a450a0e659d4d4e0bacf5a55c7dc39bbe081fd3c85cb3ea7d8071f6cb9f9d45cf56d93aff9c321583f8695ab709ae128fe92438fafc0ff6cc54ad88ce3c56733a21294becb8fd857f363a33d8a51e63c2e6db7c3b42fe1b74c93a6a5146418e58697d3344006aa576d6300728440f0adb6166514539bcc908cd1b3ba889d9ae2353e6a8d7709b7e566364e2f0eb33451942dcdb77aa9b4e2adeae41b586caa6d661ed8672accafd847ff9289036fede06fdc35d6bea9278615105533c98ca6b1b93102d7c5ac3380f2933e834b4e45983a93aeaf994bc51ea5ec3e3838adf559275ca3bcc4d7d5d585cea9fd145bf294f62d458badd13ff2a4d50e024f2fbe34c060e815018f05ec4a8d54dd6674788a8d3a64c57470c953ecfe789fc4ff4efd84d4b4dc92195f056a8cdf439766494f9729386e663397f475900655be634aab9344610fc6323af8d859b5214395172468a1567da181d96c65de175fbcb0db8cccdce6e5e6b82f783fc2c47ae7d15738d75d189b3702d859ee43bb0a075dfa0cc82386ebee4b4d8787f7eed58815a64c38a94b7de743688156a18368f7fa9a83064cdba7fb762a97ba0bc61bd45650478661819ba109947aa3f7d1e54b1bee845e6e54efbc5ec9f2cb38af8f5286c4a1a97fd4a16f9ae0d574e6d569e7ed6063ac5448dba3cda463e4e736535b631b3f45f6360860b4d750ae63753f03fad846cf4f3bbced95cae48a19cfff86ff2c0bf95ef9d4cc83bcc89d44a82558754ed96da4964346470ca2d499faa392a3c7258c5b17a87db519d6c6528f39e8e301df6dbd66ffe1168a1690e683fad9ab9dd83c035deb24e3123164f95a36a5c053e7073f7c49ba7280ddb610dc35db64c01f92f4a746cfc76c9d0b7810e559f9c1fb0380d75e52e53c7f66bd5b79c94f4c80dcdf26be6924f2af9a717d07d998adaaeaa5ec7e76879b2ff47691883fd1b9edd466e68ef86467f1aae56a673e419f1d48440914568c3c98e33f5835a5f517d6ccfc12d6c2cbbb79a43a428a4858bd5f00b5735d88d9de666ce5f1f4169b7acc44a3e6b1838d497873aa48b66893fce45c2538e3ad2e3b68c2cf7eb4f37852ed8218b8d7bbb8733ba43c6f6b2c88e8b74fbb41e238ba1f5c1c5ebfef8bb80f2456f228592ea5fcaddf6bcac9c362a13ebdb4b7f422573cb87f115f385b93dca6fa368ac49f0e43b5ab283989b3c719e295867539047d442107ea2ec046f031a43ff738ce87b67ec19c4f284cb1c1cb07938348f17332bea4dfb4c4417d7a30275460e49878405de6af7920a78a69e17dd2796d36f3e45e1d7a504fe88e81b42a8fa8658f3da880e341bc9b72796d1952bfcaab4997dbcc7c9ce5c017eecebe8d1b2b3b3155433240c6a858ea9ebfdb34f6750bf6c974a7ff10f69a4022471a4d7ffcabcfdffc4c603b6b4fd6b4d7806c0c275585efaf8b90de1a1d48507be51697fb70c43b6576544baae96440cee00a7bf9a59a51afa318818819dd8b1498bc1fd9e3b55c573b39633344cf691f6a8af8b65ad05559e27f1ddaa391415979ea32a494182483627849169e2006e9306448025229ed2c14ff825a43976935a8a14b8448d6c4db642a1726823a2053f4f75951b80b47056bdae61ab68402d4aea6ead635f2262082d71c4ff5c78e6a6345a72505e23064dd773118ac985e49e4d88c64dd894322b0d2a712f0cccbb506436c3f0bed765ad0b193ea520580be4c12cd65f2406cbe1fc9281d37bed1988d7488f3925244454b82982c49fb522a2f83a7d131d1cc65cfc7179f8a043da781959a815b5e45f6e0b37269c84237424fcabbf4dc16a722cb171984e48864ef70c0fe14c69ee385f15eb7191249bbe3a3888c50fcde9302ac5aac6105503589b3748938eab5614d626c6a301599b623ada44f432bb18e359c7b223414a34945786468628c6579f9b004185cb7590e22f94e83de26c6a9b69702f704041da3ffbc8ce5fc2367a3a97c4b997bb06a01b8964a8534e2f713c289a0dc8c072dfe4a42f305785a99c0dc898d3104e0dcc62c0e600253c218f0511fcd94bf78497b03a08efea8bf7fc0e45d3545df2c6d708435414bc00e64c76a523bc0ac823fb56da247da4643fd9063748b23128c6ce4316bdcad4bafbca77b8ea6c10e54ad063a1433333252311f68c676ebac53aca8fd70b9404c1cf3c979ca0c492198a2f92294ee5ab4a2ed15100f20e5eb948916ca7bac7b28fdc904ab1911afc19a454af45e6a265a726340291bac80cee679e009c02254a6c6130227464b2fbf2a95661bed8b348ae9c759fa53a4b429c0b536fd6bc85d5c96233f90ca3057839a47b068855283487c90a8088e271a3e33f5ae5695d044c4d14ae8440bf03b318549600e39cb9d9d58ea2d2a5e3d08a11484801b8167d4c5afc20c56bf970a230231da8372eab0f5266686b4a3da0ccc6b57cc81aa29053142cf0f35cf0c83282893c25983ca06606cf255cc1b41add5947ff9322a4c23bee47cc49656a8581ab5a99a3797798ea77a1db18c39acc97e6342b8770550212718856398878900d6cc9a5963a71432e5678a12ce86257b0b32ee751eb181fff62ad98443f7d79cc4f85bbc67190a68504a24a3166c588ac7b40fed53318b8b452d1a738e59a2c82442feb013f9b2429b6c603f71619f386118327eaf0c13ea30fd620222af064c61aa8d9801d53192c61575e3448b265ea9987bcc84ca825943a4d51a9cbb5e76e4fe88cb6d92215f60b0941c46b89a746cc96c74cba7b097bfcf27533a46fcd928f49d670f85179e6b598ec595cf39c3554eb5f93ab9707d4a559069d24a4005cf28bfeab0bead80363ac608965141e252de510562ccb5fdf94c30da1247ddc4c80554d879b62d0b49eb3b21ebad10a50794545577be4eab070d30365dc9c34eaad1163b251b223e8ba45dcb77dcbab0a07fa635d8b841179a354304e0d249dde2319d85cb724245877a549ccd8230fac8721d82e8a2182e5cb63285ca8a0d049cc7160d7116d5c1c0127a9ae5fc808eee88e340a57a80964b21a353b08bd35da0dc1d7020d6cbe43f49547686546391d94b9a2b2d63b23fb2fb8c30f7ac371b3a80aae0470d93b610ba1681af1be2871a49419a23610843bf940804483dea0ad8d609500d8aa2426cbf0ca5aa353668a7151bb54c7c4e4ae3354c598cbac6e90949cf6b79a941c541c652351306f810494dc0ae743cedba7904d34c2e0b32b603606e33156bc750bbc477313219a97e184d695c701b2009aab8806709b8d376b9cb6a24f3b6d0a4157398c740d08809328aed069a52fe77cd68b9dac62cebe3649cd1b139fa84f6a2333ab702a30414425f50e25e41bfe9a2e277869e17c035652237889c37e3c86cde41c7585776d14682f3c0309a09c1ed43609b5b82e03508869a7f6b627c3710c58198ebe9100f433ac0df22d03934c1eaa10aa98b88c879fee60596a3ab29739b613ab741ad4518e6ba5edec190678b20e6544f469791c64629657b9b1c51eff1616e29a1b3bc25a55cc9c481995bbe68abbc383dcc02e4c8208ccfb57e052ae86017dfebcbd2165810151538e7a9af3a4c5364c02208428d2b98890923b7bb92d66a2907b5376906a61115c979d4b34670a91339008bb466928b30e807cbecb307becd228657bae78f5869c3463d1b73e09aa7f6274c7fd2a3a9cdb4160da310254462eba30dcdbb5c30542463266d790d0fd79c3c76f5da348753312e4949ff2955212edc46dfcf9e6c37a1f40abf556c865cd096c702d21239de7c22713d70626f1a3a4c4cfbdf3faca62b6591121e25d64010c25a18676033e1d7278ac5f2d0b43a31f3a4156ae710465 +ciphertext: 079c990481efd07ae4b9248272683087f09cff5301fd533ab46d3391764af358e5d1a0a656aae24c92bb6e6b95c3689ad3cdb2ff9a7f4377f9dfe6ac4a56b996d7e1516e5d2127eadfd3a4a02caf6ce2b3d7d0cf37604bffe3b44c759231e485a298ddfcbfc7ed7d7d9bc4628153f47c06410e5ea8d2dcbe4178eecf94af9315f446ce0526005556fcae18fbdf92200fcf0bf528f07b066e8dd7154cd1d9ff02fed80e7c23213ddfa05698843cb3ee4da7de296f7882aab57b39cd0bd77d4d2174ec9e609cc8d9910dae1339f5b3ff84ada38c897d79771258450f00653a4df57e61c653819926307db435c67877e3e9d0990f8ed65e6b72ea8aa4512ce96c98132890449569bc164df74b94e5542c1ed573e82b5eddee80a2843478d77cb4691297b4d31a4ad9c1130aa9a98216a4e20b286cd109871d929b63404ac069d065a40bbb6f48ed46d719549562cb70e0c97a2885686678d4b2f9debd38be8b8eec6b57d48ab39bbc0ca7d859c090d1a45ffff9889a2e0deaeb28f16b8bc5870976ebc16f2fa9738465943942f30eea8510f3ca526fbf3876330fe9acb5e3748e04fe20cc7f170a9bdc2b55fc95d489150c677402f6b894d084d2b80051f093f5c9a9e0dc0dd0fab7d4b46bf5e6bd304c6c1895a22fe9a8c3d6b5f8a7438e93d2aa50a2da9b9b42909a54603ddd942df723c7bb7de5cd0920569ab8f37c5aeb7cb03c24f2ae8f6227454e298219cfadd873b9077b2cf8368cbf0581698cf6706f1001407313821d1d1713c9eb465aeb6ebd83ae07e57cb1de96606afb1840bce415a775070586812045ec8d04149f84b032767632c3d29c6ed58c8d8d1d914fb3c66338764e44b1be25517dc39d20d7c0da787da0a700d6d49edc99944f9d37b5741601c248e5457c5772d6455079cf0eeb4981a7d33179f99fe8e2263db64fffad5d7f6b9e2ee0a0d2efad1d7432aaa93344059847697f3127cbfa062c8eef3203a21319c3bee0c21a2ab0615ed7dfff5aa1f8ad3b13b26c6f1df39d5b7bb80d29e0b4387faa2322ea89d7ce888061fdd267b75926e128e31c6aa0f8cb6bb2e3416652c6ab631fb5592e4c9526fabb948d53136bfd7cdfc292375826e55d11f2fa160676acef87bb052677ac22590d8c1fe8723434aaa2ddaf5c12897e5c8c5a241589146e3c0419eba3ce0fcb7c2cdd59b2b936a2ac1ec4e16221485bd4f8b477356a005305b987f179e690d6b853361692f605f826c46b28b5ac821d7bf394c477e976645727ff07642f1f45240775a766aa9cdc1883b0e211473165e6f7e8ff9f8b2b6b8b0675c13d1c6052190506cd583b02d961476f9f142a253908eef2642b882f866828e9acc655b931fd69f327aed8967356471e145e9e1a8a40694aac47a5f6b3aeb522ab90006ca85d41864c305531ed12312071ccc9b05e0e79adde137e636832a0640b3d0577f08ee9621b8154fec9ebffe7ae0b74925163a6f6fd1b069e8c0083b8bb6d0c9e741a0c59caef40af376bd1a3b9a7e71e322cd09a2bb4c218dbfae2fdb6c2f70a3c1a784ce9a0140e94695edb8f9fddce3636af525a0ef75da4be60124e8cea81417bbda781548e03f05609850e1719ba2bb4ddb545bd279cdf42d89c13829cbf730b5e74ca68438e2547bfaf9040451c045ae998e9a0937fa9913d0a7485a89cf8bfbc6f78920d788778f27f7eba2d316aab1923ebcfbd62dcf592a731c5626c89b6b76893b9c16c2d53b8f1ae0841bb2562311fa87436b1981d342d95513f309b77279caa06b14b76e4dd6c23e7f6c482644c3af40d3de7a76a2d0df8fe958c1eaf402da41b5ac87e173a8fa5753e35e30de6d106a02a0651886b24348444cbd8ee46900a946e66a0adea73f2ef9aa0c30fcf0f829348182c34bee6528a15ba4521b4386ddcb4dbf96a33710331d6ea0f9cddf04bf23eb0200ba87baa2bd9fd6195c8e017a420c10259f72d916d70724f3ca6a1d8f2de635b1a385835c4104a244a1c8a936247c90320ff646cf19682fa81e9cc63ef05245363dbf42c9fe51f20498c267fefe512388e00997e12edc50ff253178f3fb56293cea491820bbc84bcad68b7ae1fb914e6ca37ef626e04e7e2a65df199e4f5275245b25e2fe7fd86ebcfe582908ea88fac778bbc75f43afaa961104bde49580641fefaba4609fa2dd098e926181f04248e26c951a0d14ad3c65aef6f5c +result: fail +shared_secret: + +# Private key not reduced +private_key: ea4c84806ab1067ae665a830346b85ab6b9494364f2d46661cd97115948228557cbf7a541f34899cec8cf1a3c57d9e3d6ec7e3d41ffb13c7c15ea35159bd43ba8f9c0516c5ba44327cb8ede33e3aeedea3e9a5c07bbd7bfbbbf686b9a3311da8549fd94e1c9c4017e4839ac2a35ffca7feda9607dd8edb8ffac4f562e7598e6de168e9e9a6475e619a87a5cd79023e684f3c8320466e002d619af8f8325ce63cd3fa56a55affafbd526f5186784db007673f23e4efcca127b9db53893901e4f53ac3625ba543a4b875ee4ffb2d6eda962f4040ad8bdee88145afe12db9e7c1548e93ac360bd651f41eba8d675eebda8e78b6a0e5d4c314d89100b58a4fe6af99979bf58b8b2a98f29a53c73be55ed0ef6c48dcb4ee0d56815d5caf67d99844ee007f864ee44d040f62f3cce346e44796df4cbe346a9f7871ffd7efbe0c9f03d9f5fca9d4abc4a58bda6ef7e4d8b22ae45e544e7f28758223c1b2636ebe2647abc39b076c89044f6eda5359c59bf2be15c1f34d5caf74e029f6810789b5c25d525dc9e7bb8b82f02e7f1c7f6dbb4ae589445e4fa472db0db3ed673b8aa5e04f9d39e1248e14137fee3a34c0daa6b937af71b75337694394a7c18029eb1137a92ce7ea588ab5969694956369ee85a139dc55225eab48068147047b0d0a8f8a0a3373d6d7320cd890d488784a58e08bd181bea5f42fa5c86d9ba0759db31ac3553e736564724a53cdec4cab8165f29b7d36524acc08b8b9069b53e4a7e95f656b582ad37d93d9ef17fa291da5763ad5f759bebb8af7ddcdad3e58f4cd2781a7af431e8badd7a9d2e8e492e40a9253e758101ae9c27f46409444f3b4bffd2442ae86c54416efdb5971a1eda1bdea4942a8c4ae1e571ee9460a539b8f49327ebf37e2c5b95b47eb2269e38f78f52aa5cd95d3c2bc04e1ea3dee7174ed62ec9c9896a86d643505c8b99b6f5a8d19c6c5eda94c8e6b920e56b80ef6c14cac14498c643c8635d8b49a7fd19f0a885b4a91836ba9cb26e42ae7e2fc5c99138afaff2e95e28ad06f9b6be6d67fa9fbd0c984e848cebb238d36330999120870562487fe8843a967b363ee659c8337bcad510884e340e38057f351a56d5388874561f99db1c696b23b45f96a48378ae8acfb4d730db7cb65b6fd0672681f59f933757a4f4ceb33e53379e9a84965ff1bb9cd9f622adb3b8aa9e768c7fd07c93898e8e5e4f49e8dcd500e64bb37bac3c56e3b6d4badc656530955b9f3984c7b1a97d09c75243ce69e9886a8e543c598e2f58f9778fa9cb217d6dc84a4b62f6786a5ddb1337061b79ccb78c4f62db232db36aa599c1f9dd957af8f2e1bd5e3cae1e153fc8a7e3a4be993cfa552f2deed0cb8b3fdff525f3dc2abcfe0ea48887153dbfb35f8868d53ba499df337b8853959a115d4c124569086cccb069b98aeb78225d543ee84e31da24c0b5447487ad5a8c291c5c8a9b3b9b80ec13e8ee4e347f31959b7c19bf631fcaa40e841cf7fb633279e57a38e30ff6eafde3af4fd61595b679dbdc8873d4d874392b41e73c89889615ba96773f0d917424c6d8b057974d19ce806bcad1d955b495fdf927c671574ee6e867f073968a23a5751a799b09bfe1e3dc8894634968b6450c48b7a4ba38956f8697960efb753d264db6b4432a6b59c92ec3398e9c0c486e73843ce80d6f6e07fb18ff7424d9f3fb0ebf8a9be903cde9b963acbe1fb6f40bf718059de82c97592e4eabbe486128cb57999816a97c050ebbc488ea673dd7acd13415f036b26763365ca756a8ce3db1bef460af4f69ebc5a5b527f8fe36368bb85bc52f19e6f922bfff3c96ee0759a01ff30d9be41a8c532f03777052fa95a495b3097d13393694d496a0b4f41e8e6f547178e2ef3663f3eeff7cbf13bb69556bf5e91cb7b34039b6995c8bc9ea1e31937af23b0951dcf9f583a77ed4948c7c3d44ec75b3daa6717d7ef83793537392917a0c2195013b54c0a8b3e4686c10d35f39a03c3ed28c91604de3819d68c64feb9eda321bab4af1de1283e90bc1e36d595fabaf8bf82156f2ed4d27265d3b8849daaa9bf266490daa9ea56b3dfe4cd89cee7ac241bc1529ad129cb8ea23bec910f3c9d1cb4bb14f68c6dcfeec8d71e4b8d6c5f798c3b960cd87bdc66ad467649d0a835b5153bf2ec57f12b93a1f055f88cc36236016d4809e5d9096762571c15863924797872cdd77370917720776b8ea9b72189f237e9d710da6906ae25331b9c82ca0ca257dc980ccaa23ee61ce1e681ae09aecf967c33505f83078bda132d1ad623373252b72109f6e6b8f5481dbe89b6033558b90a70d3866930a3c78e024b268604c8b3beca583b8b531a4a6c094591bf173107025ba079c3062a607e30647308987084341925531076ba04e03c8dcbf551b56885c383a5929a54c207b39e162348f7a7fb375f38896e7c1c6641b56557f52f4da23320252aeb382082b8560cdb83c34614c40b8e4dc4ce54b4c009d9c3cd6884c11c616520ae0d220e2cd03a869147ffa894d5b02c75007bb09b51c8f59a53eac1af1a0195623217b578bf4c3bf59459fe3c9ca7b677155436336176a99653fe677d0d9bcb266b2e5484a72bf8a86f1b250b5666e40083bd24cf578c4f9386bce2f034d2e9347835632a1ab39726c2f467a864f5863c0b498491111221bb2e83386da51c764b8597e2b503a21eeedaa6350683aa82659fa276d9b8ad3875a019ea6a00b31193c9284832c581555d7c478f81e259150c41e8c23047eb0599647ca403a7f19273a765c439535efb20a6861a1b7fcba48927412af6c9364670e2e44c6c630a930b9437529f0afa7534a08b7606a512fb737a50b6a08c637087314da4bbd76c35a312c091fa3a863a3b8c7874501c8a9233212e592c828829800c9d174cca70761bf8188ff5585fe1d59905373420120848f22ce8d4bb8ea253d3499e0ae59b526555a2245eb0fb0ba2a38cda009a31f89bb46851a4277b808018e8f23148789b8ec69d8c622247e207d2e08491a3945a60aabdb7b5cbd260a348818c8493159199717bbe5305a5c785c4eeb26dad73c76a04bb28b740d2a761c8c02096e0b6dd297485725ec59b107086bc40e71f61b90ba596cc905b564cd33d76e2b1624bc3a2e75440474daa778b79f3819d237a41d08d9260226e63231b5494da150093566f31cc3a53f581880512c25826a7981241f4c90ee3b3eda1c277b5c157226342fb7e3622b0665109fb7342d13a96e3eab49c53074b76b3a2aa26c899bd86c8a26159ca278c034e323475a0b12f447df223aef827597eb5422bf26cd48b6a40b40200898430ccbe1a6b8ee1635c761623a956b270dac22e3a24fbbc8cb62710a197110491aaf8b89575d68b530530cb2380a5e65cdcc044b52a922b346e50005da16b8c2189525950a109f74b225213c28113bc793857e9c384914809cac7c8ec5667a34b007c7eec63ae9ec21a46497b6b836cac1c451b03814b7c47554a9e6039842418468fd5860ed6cb13311c638b86680ba1628ca09afc406d944cb0ac11b928899cf333ab54be5796a6e0db7cb2b2c8c9b9ae6f300a3d508eedd292c77c589c6682e2509b8d712c6b41669a5b5363fa06f6bbc0bd272abf0c423e0c719ba90cff3b0dc2c390e30b46b38281864b5d8bc2ab339c48bd9cc8fe70067358722cfabff6bc907a457f84b1bcbd6c765ada9b5c684d290c53614123a02660ffa22ffaf602111b7612862d2d204c65e82dc232798982652ea51a362743bea629a8324f76b693124b2c3772111c627e9db55c49fb7ae4204222d850311ca5d99213173416df4bbe68b6b6fb514dd4b821bda1b50f5587b7bb254a65a2d9e6a2c5baa0e71b0be88199096c516f84a20f38a9d32520a0064e955697008a9bccb6524ee56825bcbb776092c99a040b85c2e6e1669f08932f63635f1c37e989a4f8b2190c335e31a03aa06a755022c895485780bc90a969c834091f2cc64960d399ee65359ac245201b948bc2827943a06165255b0492a7236e7b69b66847824d8873a24b6267acadacf330f306652dc766df9269ef911068b50dcb199996a294b8f935df477f00b99882a5a5fa8147023737592a2d797358bda228bd62440fb0c3811b73ca1c8fe4e1c070498b11bc816da770bd895a96338fd9a6659ffb88df51719bf3a4b208647063cf9ec985ec087fa643608e0aa23ce7749ee3c7983783992961a409729a1c6f416a0a0a5659e8320f95277ccdd31de6fa3e41ac9de3293e3ab36971842d6f8b2ffa9a26de29b0c1a26815362a657a5571fc378425b23089bb94016ab2e180888226d1f7b448749280b978958198cbc626539abaa520f4c1ffed3ecd10dca6a4d6edfa0952d6e2785cbddbd5d6b62e0449476f7c6f9ea3621237bce0f97b11fe0e65776f1e92da38362cb376eae84d11c4528382828f7a689a0d5cff87b8ca0bba97feacb39b935a8788cb +ciphertext: 5ead197f374db8ac3b0108c6b48be7d7a015a2f827d92c6686bb717bf55d48f1f350327627f184cecd044b6df9f775f53006d4e102f22053bff4fad33013d61b1b889a5e3e905ea297252e2ff8ee4d099430b7f0876e39a2202b3a2370253c00dff9cb62a1831dccdd4b95d60469828ead71c71047e90420e0b89460f9b5c5f0dd9c83e47c9551b227d7b54a0edeb79f129d150f8753e92f69ae75919fd82daf1eed6954c9429e39130265ccab4865b0ed1814406124cd9d1177361573267c2fcd41b793778cf3c4d23a41177eb8258b599f095082ef1e91d36bceb56a1c3a932e512c5a73b6f73255a74e76b7ce114002778a3f00e291592d76c3dfd33f4e5d3f409284f6a4fb654ad4855d5184a355d7e5a78aff17320536d83e3a33cd14f6cc2376e7697fb712bf0ad2c9b719edf9aeedf66ee481983fa551b973c3f7b17fc848a39606dd4fa254bd513bce300330adae0cb923a743730c83db40670d0c9a406bdbadf4a25cd11ba16b8b67ecc0aa3d632b4f8892b9d1571f0ef3cf09b29b4d956345be438a1f07444c5b83db5d34b2a7783f52039a27a771a2d114715e6778b6f970926626608423a91d485484dc14665b0cd31f7f38e017ea4408476345ec571eef240c9b04b023858b3e7bba470c21f1cc0883dae601d107a870e583a398198e41addc692491d11afa17a8f6041ed6990e0fb1ddb13ba2c0638288200c94512f0e74af90507fe23c69577ea17af0db97a32113abcee1c6fd15a0c524b72ae35d5b7fae7f9461373a0dce13d5372bd6dd3b9119406ad6837e1b3a05cfcda080ce1cfe8108c050764a2ad8d5ecdb5130bfae0d3564ba8f48742c3080c59c884c2fac31748966b2e003f14962803b4885625467306e0b0ac4009b377d6c46207a04fcf17e507a6fa4d37ae47bf7a646d202d378a387be5d4a9e2a25389204aadfdc4eaddd5fad5498ab1f908c36cd21e971812904bce453bba6287016fb5ed0e9266da7e7d5961555ead3fb8df66ac598889442746b75bdc9f5122037b4b6cee66aa613a239bd409ce747d53bccbf7ccb27d25067f28d851c590eae2a855999d5a201c79d83c63816b919bd22fc42f8a173fec47a71f5a9e42103738edeb4eb6e933cffa23cf6edfdff13bf7ba4494ec055b7779e0cb82a99fb739d0bac382eadbba1c8221983f11554997ea752a8069dbe7430d795350199299314aa476f5f22595d429663d66b340e0f58462f94d8809d7f798574dd7424bf21282fa8301c809d6efc94b5f9240a65504614ccf509295de40d8dcd1d6303e2e116de6b0dbddcc79a456054b4375f20969c58a98fe60e6ce828ebbc3ac91721abfa9148ee24a2e08c342c58dadb89926e864c3df8c16e92955b2ecdeba9ea53286eb27dd2348baa27a6115f216e2d7c7945d095514b31971028f7344757cefa9077a8a41064c52df9e2fecb7a963444597c98ff1c946e60607c3d3fff8df8723029769cdbd0f3e5a9a07917dd25974f1dcba2c86ebe31c129b553ee528f5ea636ba87ea6da7a170e7a4bdbc300e5bc1726044ca987bf24de6051e55289aec3881c16d59bec4c06043337b1b99fe2b6579947bd41d73bccb9509381a8f29d00a101397732f4e49b1753f464d1edbedbb278912de0cda6e11f4da9ba519302ced79e23e3e0b1a87157f4b7b8e1ecfbcd1230a2e1308a683c3be1865b58c79b01119f2df07cba766ff6ad23c0b2fbe2b664aa113067a19f221f81cfbad093e873c224cb34f3d34acb4d7a4b781edaa6042119924229718dfd348a72a7b1ab35a5d877a13b9feaf34745bd60839d13ef6c0cc1e7ac1897869fc2f3f7901f6a1e5625727dc19ac44c74b67f3d8d78bfabe83127a9b8f16345172632dc2698c299541cfd96ac5a99bce1eb768f52840d6b61052458bc072862ba936a9901008b7c7834111a04eed9e10604404da2c2758dae053ca3011d1bcb92088cbb8a4c521bbb9be7f81e424bf3d6ba6dbf8959a58207b6993570a6508420799795bba2e987483026cb94e16834b28715a7812d82e8155ddc69771e6bfbc43a0b1e1b11ecbe73a4e509d70ed055812831be7330fcec915f06920e89f0d6b6ec5a75f036ca9818d6145af671fe3f695aad955a3cee0e28dc66c41e2c0bf6575e51344e9110ff33125f445a5c2a9bef490fd0d14097ae84d09be325b603264c1933cef9d0956a51c61fd17e07f +result: fail +shared_secret: + +# Private key not reduced +private_key: 2a4ad66cb7ce2fd3976cf377eb65d0fbf9887c2375705c6feac85eb92cc4d423ad0dd37b4b1abf98e7fa57e3905b9531b3f9382a38e7b464769cae33c3a550036abd7b7d4ef10f6e832b5a0d4943630f5debd9deb2ad3807b35832aaa00a8c93be7fbd1908819e07e75358541659aca86cfe640987d5cc3fca4eb7777ba63e17987bfb81869a484ffa81a93f93d97f72ecef434177f8a92632491ee2628463d98dc8cb33e93c7d38b765cafe6f9606bda1646af770635b47cb35d728a265ad3c2d3cf60d965a86eb9604be6c34ad92d57fc0857b632be44a05af424f4ab1f1ec6fa65fd0c1bbb4ef0a35a59bbca8b889889332577835131e95d48f48d859d87c9969344d3f74e56c9b44d6dfcb416359cc9a1fcff4f69b3f8f6071d5d2977e724c38f12f0b85951be0051fbc575ad59aca60a4fec76ea45a6dc88cf4998c228d5f9b17c3ea7793afa8f24c0e7ce25bb16676a1146c933a587d98448d80ce88e6b5e0272770983b96419ebdc0abe0ff44e064eadcb347c8cb9fc53eb83bab95f48e0859a4a933bf5d78feba8a8dbefd8b634947cf4861fa7a6a9d69c2d7fddc94dff20c4795a680122ff2b3f5f116e641356e6f4c2f3e0fdab1b7b5e4c677e55b4f847c4c726e2c7211e675adee412303390b7afdbdfcce2d435750c94799b8fdf8a9f27d344a81a5422bfdc05b4a605ce5b00a438fdbdb80b90ff5051c7c934937fcc8889c6baa43e89245eebc5fabe36a2b6b956a349aaa3cde7338e188ffafa5e519ff9d492842a936cca4dbd9e81ca7858655865da7e11452198cf9f86f5e690e38b13d39622d48913aa4a8c8b383e8655a0d549a57fdc65fba39c6e7bd8f40593dcb187bec8a3f7146eecb081e3dcd49e10cb7b45dd9a92a5bf8b6e8794dad70f1e398e603ba39b5a7eb8bf89895d39cfedbed7ad8b2a6f98766752ee392e5d693396b90e81e47463a63aa6b69e1e3c1426c403bccc11c58beec58ebd1f5b5a26657cdc75cd93ba89f83459434d295544421ed9f5b0bc9e76458ae4f6ff6c6f47534aae2ad4a6a5a67894638c88bb859cdc21af837660db33143c917148c3244c2bd176fb144e54879314e2eebc2193ae6bd3fac3f8db03837a177c8caa585caa45ba51794a7954837cb671017cc6335e96fd767d50a65ce798754754404adaf6a2cf5de3bd51f6dfda5acf0e815f8cf0b6e509772115ade7b43436877cb0f175f8d2bda774c36ab09a9d24de3d02d66720dac1b3e4f0ba661bb7fbbfb86890a48929dac8ca0f4d605be7bc943401307d8a2e3709a1fee1c7c8564e7848cefeb46de3c020b3a2c09823194cbb46841675a92c888bd129eb3cd78b154f650733be2634c3b8473cf044471a8a54de3b6d1a4545566f9d76e0e49c8e8760dfdaa1b9fde80bf4ce428a49f67fac20f8e7109be2ccb41f6fdfbba0f697e537305ccb425b8cad1d63fecd8a8e195fe1988419e7688e99ebad68e55c83dd2f29dad27a557253988324edcb9be4b075e6ee39d6ae86874629b7073e8acc95548075f75a66560d7935174cc4dc8f4596e1ddd288c5ce85366660bf85e33cd69fdd4210985c8de46c0ceb2e1b9a1bb1d48c75e6a4e4384c499f1f37ea4207369963b75c4de5e85a3f2715b8a5acee6dfbfbd623acd158a8376afc404fe5068f74bfbdbbeac7df35756eb9cbeac5e4f992a0f5ac2a3b1200376a953704888a2b304b3eb6d8fc11bef067e6ef9466a6714d7ae66baa218557187e93efe97f3d692537cd2ff68e6cbb6f0d24bda866980d29fdd2417722ad440535adf15e65573cbb8a896be183b83cf2b954139a27d4a4eaf267b0a2471182963bde3503e7b7fa723ac20e97358ff4d5b6cc01b8b8606aa6ee35e578963593197e0955fb352bbef90a8928999b87b2cd54a3b8ea30c4f7a9d7c831636c917e2785efa1feafe573ea86f8ef4f0393e199f857458327136a1374e4cd0ebd9e7a994899583198fb1f08ac2b9767536f4ed19fb54ccfb3565a470e145db9d3a81ed2ed43a3a6f445433dc6d4dda35af06aa636bb88427dd623fbccb6f9c43ee1b32f92f416335ac36d7f00f6dada38d96bec7cafe37c3af08e00fcf7dc4ac5391ed756e18dff198bc11ea96178b55b01af1f5d8eec67744a9bf36100cbf5cd982051ddf931898eac7cc091389ada7c7f6a193f8174b99e5b0c249517ac47c4ababda18b523a665587579d884b7d98f778758c48d28c89c97441e7ba1ddcd020455c73a30377402c13c20bb8bcf9042066424a9081c9d44139e53f3afb7d9a687c3510a2f4f22fd5ab37bb778267053055f38158c3762694aaa89596ed824a0a10490c49619960b79db3174a227c7687ac0b4533197799969911a24bcf1e19a4d6224e2fea4c4da636483a09c39c0e63531e367b7b74c9734313bad6056228d00d90f8806b6a06dfb45e4366867c2175d692c66ca91083b5ad8566bfb4816b40da9971bb4855b44e13a04eac687af1a025863b8878827c1a06360e84c24e8940e404716e665e570a12b0532bc663001ae8cb94aa658a9394b60a6a1c8b008ec7bdf432002dd43f34fa04665278057cc5a0ec65b7315e831681e4d5ccc2f95588089122b18b4cb93df740b2910ccb49142942b563d2027c8552ba5bb595ef35943db0bc2c912d57f2cf166b2b9d219222a6a71bc55ccf7cb9c7c8c23398761aa58bd8a587013841a266000a375cc14018cec577260aa9d962799d9900a991873b175194720f50a90310c4b8b5248c0f08a0b609440eca877c708e1941a15af6407d5873fc62492bea381f431c8a727e5fa235b39434bdeb8e0918c4ab82a5d735b0f676aac18463f8e65cf2b30ee3a97969da994105d056d49e2245ac4fd1912a44b6f3647cb9c377df2c7f0a99016725bda1fb78670013fb25061e11c09fe1c92ec21a83da9a2ed2c95636598f63c264c972a4365e6580440b0327d3638628e06cbb7ba024bb2481f64bbd39a5e79c46b43abf0f405fee38076a600468f033b9c52aff5c3ffb6191ab8b37dbd8730ec63677e6b43afc74331631fa0c5263268b17bb0a77f2699e839e66489a8744230aac9c77ab765cc9094a8077c12c8e8dc6bcfe900e831c02cf01161c083b14677f01878655394f31296a33c612a18121cfba2f7a1358af8904b5e8c00028434ef812ac1a5d24bc2e09eaa5929c5e6e05683d292428324fe2a021e238b2717490f4731aeff426ad085574c9a1f7cab392d662fd25b4390a694946c6684c0a02d85da187769632b6a829cfc24999a317436d4b47473bbf8fd73f9576c6424acf65e88a4bb230aeec1f5e08c7c05a1c84aa3af9d44c25c81e4db436285a4b1a572f950437e277294de7c0ec087b8148607b30229bc97f7907076d9842f5a77fc5644177fc095e7245eaa7ba8f9c7840c99f852a109257b04bbb3679f80a617ba997f5b5b22c14d13807ab9bce20cc271c9b2cb5dcbf67e4a0df65a5adbc0f8634670c4718feb06880293d7c7184c52601c69c58f110cb1ef961aeaa95133483714b11b57b71cbb94e6a483444f65f293b7d349a02950079ecc18ce091ab09d647141065e037c2041c932ca092ac7b870e4a64caf14069fc9845cacd62549356c38fafba2a7f7133c5f7c630721fca36ad23767e4d86a2d1ec8c41da18355a9375659c9b7c04539864b1098b8c862dcebb94785370430498cecb064dc8aee2e385fd775749f47c1f38b6d6d08a6c3a5b2e148204d50048a3c8e5f13e2e3059e6a3554a636acca6b634aca6da71977e33a74f0a56e78cb856b816b73681a3a96f5a4328a1911a7e063eef31440fd21e5f281e9be9954113acbc3662529911cbd8221a7227e2d38e9bf798de61627d67b8e8f62f2e10bf66f24187d2ad2efa071f0b2210e53091e29be859857e801348092c572b91b59102e325104c6c1a49c7654c2bb4df431c12ab0f88e1132b63bf56c1616028994a304536564dbf18b54a16b50b9c75d3f347d8cac3f3bc2dc9827155c507294014c8c92e4121386c936f3bac661f4c4f8604a2b648053e88792f5ca9a48719bed781ad4a7bebd8306b5401dcba9a69a35128a7a89d22b97ffa5c2336cc5cc090a6cac001dc560aa25f8f65093f0c2fa5540b51f56862380996a4c48d90a68f8956ef49019ba809b84496118235e02535a37b1da0c95845f18342545ed12426a6e5ba1bcc7b348585669c003b02033eb024cdb70405f5c5e6077449d8c4e6e66d65a23b9bf51f40230bd241bac33b708ae7b2147809ba2a14005038d0d197c790491ffa5c74626d2f6c5e0ab2c69ba55ebc83195044cd7c4c00d84bc716d02f8bcccbb4f85d5e50c6efec71d667cc0338e6a6ca392e61bc1211681ce762516ade8bdad2f1ed78a9731a2634269505d6cb8212b9dad2fa70171035fd4107ff47c02696b3489650d5ef9c6f19fc9ebbe336dc464489861db8253606971bd0a9008a433ed17752d04023781552 +ciphertext: 2814c86b427bab251a952ad9e541866a832001ed9859d12101dcd24f0d739e08a6b9a62d1aab7a2818c5f9dae38ef61423844427a2b64c90e1ce73a506b0302e531dba5617f739a4fd960602a9124848185aa176d57301803d2135c299d4be766607a219866d714055f6c6288d364db1e8bca2bca23f9f2a4e2af7915e556739f5137ebabead85315fb456f9499501b519283db6c67bea65bc915ca50ee1c77b9f035a15ca8d1ca5bedae4b5762e9acae10554d0eb6174938c786bfec3128bb65ea86a60379b477b88ca97df17539bfc142c67f0166be78a8cd3cacadd4af9f148354b869ce61bf39dfae8db4109b96a6da80f3c7b8316156234df427843874cb33bc4597fcc32cad20358ae650e82864fd407f06750b4c3015ca0d831e76cfa0b6fbcb5c920c9729fc729fbb1c404330bbe965848857966f50835b6f39a42d465563ee024343b0f81e7feb02baf0fa45cb866e51fd3153e79aab9866e91417df875341515952d5fceda11c76a6c3b4b885412cdd880becdf1613a05b3d48396e64b6446f0b39fb10ab170e5325bbb2e08a650c2065f85a7b4d5536d294e6aaf2350828a922f6f565ccec8cfb22bff15352b81dba6f97e929f7637000f46ce8279806b21ef3890b1e0e99228499507093dd808d4922d86d4dae2ae50a26a83fba367b50cafa044ff72efaa1ecaa9b759e630f254118b5aa10d88837c8add3aaf04da5f214765663fe46eebf244e22a3cc2ff30ca287b28a2cf6f96d8fabf68963ded2d72493db9dc71bed3eb4dbd6f9c2c73ef8d1f7250fa95d40dd27a689e0d020989b11d3818421101d6b850b6b3241f503e464acb922d2dbf587b69fc560f180566669b2ff16032a898d15bd79e4b0b68d8f9485eeb58c65c8e6b6d2e35d3c923fcae3c478f578beb54fda3dbbe59be441072b8e5b6ebf0f62d275d09169d02c161d458121358d3f5558318af0bc73547cf0fad3ae03b6fce3ee42907bacfc1656e3c1d0dd54e0c01914f4869fb9b05b890c6f71854f059903edebac8b51f7b68313b669adad1abc2c65d0d6a4c3aeeded37fc07770ee6604531d5aa3319ea94acc1755913e8b36d4733809460e26d3f3d99862853ee8f9576f911efeb47c6cda258f1926620375526cf86bcbd3fdd0eb0f848fba9834ce2499cf158cf772f56cf106c4d9d4221a5c47e1c387d39dfc0d80652005a0d4597f309bb39c305b02f73095510e016832014b6ed9210f96d4270d7da0591d1800f88d90639f4aeaa80bce27b46d18fe412c1d1293891278c2f4a0469439513622ad18824d8fbf924bd607f475ae2bdd27f1d867f427cb5205f856357dde8a1de80d497cb63f882fc316d9a6360462c12aaf05e08a96511fb06161b1107aaac9b5c2270ccee41ed68843fd279e31fca518e5829c3f01da85e8dee3c1c236732b5c945870257d6ee824884e4d949f4529515e74c26d4e5fbbd0c7639b4c9bc521d555b77d180cc770535a4d0f0963bca767994c5367d9bde70a966da321b3152b5a13bf928776ca66e14794b1a9b366b26eb955480cefd0048f3ed26405d2806d1200ec8a2541b1040741910a9f7c4dfdbae85a1b5a323b12984fb29bd254410662975f8976ce79bf511a418fe0cdcc48dc4228981e6f37f0dd4e0b2991baceff40111502205d77569bb9fb5487d03f22c7a852a0b6c620ea3f00b03fc13ea0220c01ef9dde592c99e8a01ae7604949a4cd9caeb936c7be6189cf8a332d9f01c66caaf7a6a17bde66d97342cb0f92cdc225400cbfd4b1c5743b65cc443cdb7aba62a951ed6a19f978ef15d0466ac128f51481f44e83c9b4445b8cc6851802ab5e0f244df4a231c5aac27b4ee4290375df1bb99b4a6ccce29bc0fb14d0ea5d1cf4083915d1448883fe4b6d081d01d5647d10338e2cd33b84f489d31029c4a9308bb6426443b79d27be8d0b11f058b7e214523cea5b443b783f54b29858336532bbf772991f0a4b0b67aa00def079fe2b5ea4a5f4a6e141346330b1776ecb7be83e2897d6ae40aa9c8cf0f5a8bda5a3a114c2f01d97c8795c0f93d396156f678473f80a3ae82db82dbbaab52a9c4a77ece6c8557463448e519ee72889f16eadc57c82afb28e4247443f0bc48278bb4cbaeadd6527e25b587425cf3710408f626b87344578990fadd2ad8bc2855302857ae91ebaf38d45eabd4ed4c67465f38f38235dfb7af77518e60a +result: fail +shared_secret: + +# Private key not reduced +private_key: 0918ddc7dbd9012bb14ebafb8e9fa71d0d78a89fca0607908c04b8b684a0abee39231991812b5e764bff1925f62695e9469673713359936bba126ab5e0b4b62d8a5fa0d76b376fe2d686ab74188878aacdc1c4f0d323ac67659dd2e8851317b0c23fca57bba4477eb7b9a78f6e6c73514ef5ac7e8bd386b2c0feb6f026c2a2eadf5a05578c9de3a0b78fd628cfd719dc649cdafe1ea9fd768e56dca02a6a87c7d5f3ea9593480aded38b5d390f91c99a989589b6b784bec0cabc181c33c458407016f2a0e666f3ebe5c32bc4636782fc688c8d5433bab63c35d3ca26eb48876da4d24eb3347e4131563230cfa9bf4f4fb977e2e7b6a3240ce65a5d89111f4c7eaa62b84ee47d1331a375b597494cac84e521ad7082d6945eb9fb803f6d393d81506fb20c94e7918ee82de7d7d4bc87010b406299c11a6332117f6c59184767f96720b9e8de84e78d397407a5dc62974b3ee7d3b93d5e99afd16d859fb1479046ccda0e1766a995f66ba5dd56e9b178244d9a5c969fac3e1b4e983db574b3c9b50f2797c807b03de8ab0e79fff913a79e26d0a4dc8f4d537368784844a34797433c80efb8c5cae4af06bb9ae4c5b41ef01a55a55b2a3be308a0354456f024388275ed91f69cd5a3da28af5874b45b7a556dbeb65ba5f68f684c643b8ec0820e43de9cf353bda92e86c72db570c3bcdceac65bdb69e2cb59683a88627086a06b0dae9aafffac3a47afe5451c8e3c7fbbd53c043069f7dc0624a40b76f9ef46bfddc36f82173abda6a3674fc4b3685ea23375a29d6c9eb98e3e05788977ed2d6ba894876816c79a6ad476364bf7a39eefdd4baba245d77a037fb88dc54023fa046432f04aa042ff5b44897c885c8ab9ed70d6fd7043cfa383a9886bcc40c785de5ce85c60eeb21725effe2ba53bc9875bff81f927c8c895f9f6395a75783098a9b3a89cb495ae31d41e8a51a868ce76b84cf3b2cebceae145b070793ece49e6b877f6cc5fbb1c4da24be7a9581af9f1ea9146ab5d788cff3f777638fccaeee7fa75fd959ce5b0edd45bde14c4eeddaa601b82ff6b4edb9b77c833a8b0aa59252c812d25bb628bdf82f3e86f4ca2ace595ccb4eac37efe6d4d9011854b033360f179c398bd6c82e43dafc47b404f4d4d69d51048c624e999fab7bd74be8b13a9305064844ced40fc5c4a033b59c0a7f99f7ff1e2c5ca3babd5317376ee4b4e9963b1739df030bbd6e403b6940b5d8258572d16ce4d8da20fcda797bd6df076b73e2b648534520dec6ef0b57f61f4b9b65e9c82d9931e863462df6d41f35c0a45d9a1d684cd5d47b958f956dd387808a26bacb2b4affab88db7ce53f56256d73b6c59010dd5a393dfc14770debb620b1569f6c98db41dabdaca61dbd337a9773758ab92fb59da9fb95597eed87a696fee494c0e5739a2aaa63a77cfdaac6a386e8cab56a6c6ccbdace66f7eaba24be57cf2dec1cbd4f5186d4c189de86518ef13f3c04daee8444578b95b6a55f5e830f3c594b366245eb113d57c6f496410fe4468dbbaec7a7ead354507cdadb923a0050bb3f89cc82b2cceaea4582f1998691bb1846af2cdfc721d7bd88bfc52d6a8ca5276f5b60cf368cf77b9e86b88d9ccf81847c7aad075d36f9b83e5273870d0239b8adc9f9dcbd5a1e44e7c56d4aa3947ef2d85dda65651c6d69e2c7d65fd698605f8c035f5e103b50363cffb93c9745e35eb2ada1cbd56852f78badbccb448e0c47f7028fcb0f4cc5dffbcb7d39590166ad1ae4d92ce6954f8c3bd28663d5e3c35143bd351538b277dd20de3dd36cdbb5be7f76a8743c79c53a108d247ce652318ddb316382d2c9ddce7857703bc3c939b4d53721866d3ffdf80dd8b57fb6b7d8037d049bad9bc7af06ccc47f935ad417dfa89e9a63364ef904ae6555f74d8b5ea4025dcde7555a56bcc8036ed962facdb3390f6a5719d57705ec8aa871ba41fbac75254349b15bb6a04f8bd1d53a9ad5e2d766a3c8f43691be352a59ea5ffc18f3dfcf6acf05ebd6a3925d590bdefa8e4a35e4cf6bd5abe05ebe240687616d873355b6485dc858f5441d9155ab5e6c9fb1e5f478e5e6394c2c1cba717dcdd8048561bbbe98a9449d8d9ca488d3c4777ab6e55443b3ba177ae5a0167826ec662877a457e5b4e750eb9b30883bf67b100ae9f306c0e7e44a625f44880cb0d125bac36b650f8430c647c68e1ca6306e39c61142c2a5924cd0c9cd5a085f4eb5dc4815711e4aa7e3a26e521cac85c303e420a18a3393d996c1cb68dc9904588301385451788e57842305c064807421034ad845df2baaead84acee401fd912b191c89f51c436ff6bcf4b33b0b2120440e65777f4bff5dba7560148364046598acf3d46b70f7960eb9a7c5fe893c87c6dc5741cd84b080b7a4d0a596effa363b6441848d849b72a7cb9f1597c99b7eb6697bdc3181db25ce213c35725bcca20c840066dba39420763572f187758d05f6e43cbd41296f7c7a637cb49a57b00a2a9cfa7b2bd1745b5cb0255b1a68892431704f4bbf5c4844d0c1e9ca5bdefab042fe1ad30d4491427543cb39fd11717035690a77149e09a9173a433dde8a29c40744cd4a7d2ebae568a392981326fc8bdc2989869d6a56f6715ce65a51dc9a5e8f5c304ab6937f41964e80bcb259b9494bb713b6c882b94af5528a6b1bee6886f1da41d5a10b8cbb188aca7a820761e10b6797a8a5aaaf54b5f724c8fa9a41ad09bf9c9875df8ad40781ec93748b428cb0527c9257aa83d412ff1755d835343ae05be3211a447011944aa8952f2ca001153f10bacb18ac64619689ea6562f23c0fb5a33046c5dc5b7c37e2133d0987a44c207ae5abcb38ba68e13505fa5a05be45af5887606704b7b4a4e18e5b78f518e8680a4c3a678b5513cdfa3b18ddb285a562f00f29cad2c984f60c005f73d23e3cc617148d6a53177d10004981fb7e8a1cc362224e48d0cf69d28f213082b4425368c2757ac8493393e5495f35a41646225b3741e5dd1bd6e354681e8b47ae5c576b19d7c807feb4abc89ea94f2d150f946920a0a3d6bcc3d1799332304035515273c2c4e3764ca04e1653bdabdea77819e0490416211ba7877ab8028f8416fa08918c7a7791ceb4a65b567838283cea96997e3ce2564cfa0d41c43868bf6f6828dcc78f5c03afc4422675b9fe926c5d2cc197046c38a30cd5cecc076ba9bdb3c57a4fc806e835ef6b52b44070e4689baa7633458e0acbab3a781aa83158b31b1c949338b58ac034ff2c2c80d3bb54ef7c10c5281e0d5930f3817b9893032246f6aa82f7f6cb29a467395340c6b81347b2997f5514d90c95e7e84633813861c488ea27200ebe7cee795b560973effe3a19c32950e821ed1140b454c8d5da64453fccfee09565c7cac7192952c360232861eaba924780895ca022737ab9139645bcc7b6edc67050c5a90a4308c44764740279107f2799a455a8e4b2d384012d66956384b0cdfd108a1db088fb34cf0824f82ccc7da6a8824a90982a92ed3b46aea02837f57aa0ada783e8766887b538fba4c33b157c2138e9a9155795399cc99613bf9b707519f001241ab2336e96981aedbabd2f41f6673c4bf28929f777f2500cf0e382f8ca2182b9b8e4fc36be4ccc4a1293aa477a76625429a68178733380ce950d5871bd7a0695254cd4367a1d8a94bae95304f23622d07650a17341d401cc5133a772c8aba82a63feb19db78af7fd850c2104fd207579649b0b9eb38c9f2236f1669cc31a5a116474c9b66897c4f6d96cef6428974748bc066338a510621d9690e4345c1a3756dea7355148d45c89a16da8867e164ab538e01e35489c792f79a53a967277054297fdb4365fc7f9bc15068b70b6702a8d0aa9968a005a5422c30596dfc9c635c189f9d2ac1f9481167558992b21ab4dbb54f88742167164ff964c64201da9cabdce9b458dc8cd7489684d4c8ac7951a2147b7358098975837083723eb85a4889547c3847d7317cc88a1c5ea19294358941467fc48bc6bb38486ca05715058171c7b2a178cffc838de1ba0a02c02d4049960d477d9f79a0b1b17ba9345afaf641aaf80218d41a71b9063a5680579123992cc4efc596ddbc0e1d2c66f035963f7b11c7d74c35158ebaf6bc16d6798a24ce928274e125cf3d51419bc6926e69aaf11562f541446df6b77c625f9ec820587b68f1b50e590132d9c988b65c0a86b6c721384b9283cbea128904f5a8dbb6b6a5fb2ada47918ae3544c7978fbf9381f78468b0265290181b8f57ee043690023bc9dd4360fd13514c79cf9e3639b792aa1e70c763c52a43773fbe6732d262f9385716528200e37054237c04504a8169baff63f6fcbd8988928266537d344dd44533e2797aa03d8cb025e705a9f453e8ca044ed0e215c83f03eb98b6da9da137ff2433b319d9ccbd0bf054135d63bff8563038aad865a817cab9ce98846ba75be9363718ecf5fea538aea90b2a558 +ciphertext: ff7ff6f6c8d57f4b3171c626be53e470c28f8686823d6af92427d22f30ef064312f00bb7daa97c68d5bfde9abcae3f34ad687f914976410d121ae4790852d0b8a0d607dc39f4deedb8921a58946de99ef1a5223db28cb3f2ba6ecdbbaff27bbb8bec11c90b7711b7b2fa139b18e49054623fe5b08b6f5e416018a6ff6bae5daee3b26bc0b46277b79e02645f16d84ca6dd362552ecbdaa6901ed7f4835662bd22cbab1405e8c301f6bc807a8c2f31741cd617a652767f3fe575d2b057f00b91503c457a60766924a2033d1a62c8e5fcb882e1cfa608f4ec15e74a893e170c5122a86a23187113a73478ebdc71b504a9890bc5056e973fb591e4f2e2f26c8143cd9c6568fc00296b0608eebfd14956afc65ef01a4a0feea97dfb7464d10646e1d18ad135b0f920fe274856dcaadac5d4f2dcd54b73181997b9d1f7521eb70c20edc40815d4a28965369a7af6e01663e163814d01e7500ec5143910758bafbc990bb4b9b34adbadaae3e46110aee4c3dcde08e51a9fee0c59e90c4a45409ef9226959e9ecda9d795dda6b2c3f3ccafe224167df3390e88b16f909b031250df56b821e0b1087a9512f72da732004770aeaa08f8738784f3da8b8f33eb73b3cb7430be7ed3ecb27f38261175e340a15090b29eb6a48470d434092cf937ea238b1537f5acd76cec471c2d4562040beb08b9b81715f5732c2c427cfb44aee961ac73cdedaa24b71bc937463a83503f251a03d6364fbb4604dddd584423a8012f9de10c91ec53852084a19ca71471c79fa158fa47458b198188f9f21ea5e5534f7fbbcb0d32bc5ac2ed288644945a5890f4a86c50609cd63e372ff1ce093056fc12010ed854c4aaf8cd2c1dc711cab1037cf36579274e42af5f21499781f9af2c3d1be65a6bdeb0d39ed227d556f36fabe8cd4dc33b94a1ec74029c2c47abbb3841aee0356e48baeb9e2d263572170d6349327e24836e55dc3f816d1b91301d134041c12798eaab3ab38796b10a17ce183b913af67e201e8875d8224468f2f0289cf9d8a3f196fe2d4051b8f5a9dac0fbfe9426f4521cbb622a8b3c46a5791283d6564f6f823d2b97f6bb58fef2b40e0afb8b6e3deedec06dcd4e55427ffef8538e18a95cf43c0543e7ef731fd6395fe0c42203f168f8c48b1f9dbb61e9958529ff8de9bd8c2dd8509c048c3e54bf8f1433c9d7585b3060b21b624b70d11632381f30174444346b3ef75956ede16485e2156ed2917ab9b020cc672b8ed2ecc6daffb7eed584705d405a515d16596c4701cb89557d9b46a5ec6302ef6eb43cdef5679b5618e376efe26254c1407b70334b7e3ea30b5def506191f4b2d7e148d94ab9e1d0cbb52284e90eba2461921d6fab64034c05d3dc80c92fc2965abf4a60d8d3f50cfbd13f3469fbde1737ea5f54911c590a4a008b3497a172cf0463d83fb20efc9cdc69e8910f5755287b9dcf6946bdb27b814813c6f515722d7e01abb9a137fa37a5e86f05695134c51a12b992e03c8689a91fcdc0ea6d9612f4d3098d415c199051b68c3df5f101af6929711c3487acac92391db09265034498a5514b647cfeda149cf5a0613e5ed29749470026fb622280e5d43f131bdc2e80eb1ef801a636ac13748dc60c770f471e514905dbfac4d554f020273d64b72dac4caed2d9ff446dd31e39d03d43a32188d6a03def8e22f60beb1e21a32b0d56c8eb19ee6c5ea6b249c73e2036afdcccdb0f945263df3cd25eebfb2f90c7c2804f7ae9ceef277c0cafb7881dfdd9b43f43510a78f36862484c70bf3587b981181c4340141379d50922fe43390c1433e5ffb9578f957f2aa0be393baed2cdf481ffa9d5914856ea4ef2f31ab5ac2cb574f1983da1796d8706d70b904e6962afc2a5270ed319734bc6aa48bb21d51a554b98dfc0d73f395e648ec0786e03c7a69011544e3d653338e8f272d56854c91bcb2ffa84a060cab98d5c4aec1cc80ffcab9c82cc551b461564d93aab81fa8457f2a12b80d26bab3f4519c01be31dec9c67b4aa00b2124ef81f25bc71f40af090297e8bfd9ce5da48c6c29318109927b54d7ee2463175cb134d8299aa645782b7bcf1efe4a7f00a19f688d0e0f63f262ddb7890be4a2b60fb51b00d8693d12d49bcd30efdff4a123574debb51ae0847fd40d1ae298afe11b3089b55c130aee7b128d07a90f0d4c27aec2565b59ec01e1754105c5bc95fc01fd3 +result: fail +shared_secret: + +# Private key not reduced +private_key: aa1fd27dfa84645e38ac2dcb6b0cb06df848aebe38ee6e8d93b585802ed42d2c753e0765d4aec6feccefbef347c58b4993f5bfe065a9474d98bbdcfc61baeae348f1769fb65706dddb39b74097e1040e9d185d4c4a67ff2c5490ad6ecbace3e48d23ad48bcba53a7a331e3403c13934ed8a3a6f794c263be9e1b4fe96a40ea9e798987a54af53048ab9646db8b06c9e52136713668a4ca1cb3947469ac27c035ba69fdf43c2c5ef8efc3eaa82f6902f4ede295cf22b6711cfc34a5276dc6ac9329e3d269e637a4f9fa80fb481f1f3c45e9bb05be724f4d655256e2ff66a30633a4888bb8b6ae5b888da10ef8841c35c54c9db98f156dcde86a0b78a8052399d0d4bb6d38f2a55dcdfb6cf45f245274167389df5f279bfa3b13bc7dbed8d3ed9a2a05e047f8fbcd8c62813375d88c92fa0d5a1255a4ebd7f0146b9792a9f5d9a4d797a95354d3cb65eda399dbeed2feb3964e9c044ff93fe37c6d676123394e40e3be474cc211dc5240dc855f27ca87d7af59b799860ac3427959516a4794ec9319de826e8c529ca7bf0e56e3a7f9f99b4e6c4dac99377338260ef33d369fe77378248ec1374b9f0eb942d5eb446f07c3c423db3ecd57e53ffec6a5c366ffb8cb6e8cfe99844627eb2ccb940eb49a48becd133e96c15ef8e1b9c3603db38287b831ab79191c488de7b4f40fbe30c84ee446b29e4476b41a4901d85cac9f767bcb88cba8b91a23aa46ed88f2d8fbffb330cdd9cc4aa6b46b13fe36a885f626f7368fd8a1c4d31c85817a3d5a52f57480483a6b03d7551fffce933da873af8c64a74b1b51f1b9532a6caf0dca3fb16b50cbeee89097b18526691cec9e3d2b6d54de687fe64b434a7084873593ca8f359365ebfddb133dd99adccfa4c78b603d56d5bc6e3ab96ab09e7d501d73c4b5e7f66447a5ce5a26f96a9ac3c4fe6f4283757abf435aef7a6de4fb6aabdac65a99792e548e2c3cf4ff07f69bbbce3d588ae57f55865e7b5b68b712166171b9780a8c46b4dd7b1864ba4a4b5c89ee4667bd9733c3ca7f2ae85dc950e6854a086cb8642487a313a7309e6200255a70d94a43cccd9664975e5dc2995c56ee24fc53bbb1f596a9455bebdef4a11dd6a21746a3d499c6e3e7f09c2dd4925bfb69c7c9e4286d871546bfc37481faba4836e6512b3492c47790de977cdd79edce88c327fd3c6e93b713f708a8ea71fb72495c6e6787c7012748c16fcdfae690b3ac483b985b2ffaee16f5eb4ae4d8e1f53290b48bf4a972a3676862853ba348b0f8d730fc577657545da86ddd989c657e7877840d8509e8ebabe7f27348c574474f574aa60e976b988e4a5f7c886af9c3941bb04ec3314edcedee6fb39ed69637cd7227ece1d9596103ece04d96b96dbd85cd18ad7087743795b28bc6ad4a03ea6dc7c7da29d7f6d7c7c96fb4fa0ed55c5b7c589d7fc319aff59ae13817f69daafdeaf4ca4ed5d1d6a35c1c23710d674f5b0ad0c6be4d3cb6e145b4c8aaf363c766da629f3fb54b3daae6ab4f979dc78b971b1d5f5d5bb3d806f11c9fe75b2e5d16d5d1726c8fbe9d3a2888e52fc471a8c4f36d7ce06a8f84ad07a7f5be784aa893669539a7ca8093e8ec367b5f51996e3487e48c6f6a363f6010d9b7a62d44d56355f80d8376fff37c4efc3a399f2663d4ed53382f766c21a6822c4864cedc9bd9af6b3928ba0c2d6d7f446b9526eb5cb4415696cb50739b8b7a48457dc8d196a762f586c66d4f3e0c7bb41669bc538436b4e3b273dd13df3b94486f3d8bad351a5cb277933e7bedb56b3850149e28b9e091aacd9a87beb84a457cff42e78c9d1af9b0413cdb61867f6a8ecd6c6b8b6c9f840906d7c40cf0f6f6453a73b20a5f7bb3ef5527e791f729414544c8ac4c7c51b9a646aee02c36c5942365498cbe7f9379890a70cd8999611cd6e85d4a96b6a7f839617ff4fe2d13972ef49af07ac9f35444d89a7455eeaf47bf39fcffaafb87405768760767a2f58fed7a67f88b4fbfecc5e2ce7ad23b4ff1c84f669a0e71d09aa61596787984584697bf80d79d00ee674f4e6cc74b311a9cbe9fcc7d6b185a5d23f2abb7ed701eb673baf93e037465efe4e916eee19341b21e99c88a78e51d3b4109df849664c08c30e3d9c01159519a9e3dc33ebdfcc98b0bee5f286d54216befeb4c4efe3200f3e260b8bc589d0162aa2b1eabd229f9ab6f64e528e0f05b3c69b9c9f192964a3a6d2c96b8d525f0bbb32b848e5c244409904f1583c7d58209b91465b9e3a6f2a515ecf55a778119455bc57af5aa885b64100acbf9746787b9757a17c1416c4ee317b017348f5299661436c1fb5c8aef032929fba046a601804b7b4474461957c8eedcc19c609253c23ae1428674b5ba69264ec1ea74f825198ca71c3ad929465b2769338a6359132027aaf46173415b31ca0624d7e6c258a91388742b0f71917df814b75c38b06025fc9682876b597cd65cf21943cbcb4e77b1314c4b487aa46493fb7d5f734d0da891bc51cc8fd0454a7c9bfed5747daa43e2c95fea422165e02819882a535a7e3127396120a242412bbf7384bc91372f640202ea9ea5830002654d40f346c1f2025dd648befb332bf9ae0809810445a2c91a6c51c68ea19b01ca287e3e967139f58ee66b4632346cf4240634095c59492fc3b919be49c7f32b00da0a9b95625131e24a3b03c0b44c0cbcaa7fde1c7872645950818c69a62d864b251e54b10fb6820b9678026353fb3bc09fc90cc5842849252d2c6208dbc7754cd70904f15434a8840104b6a74814b555c69897b4b2d2a69407715f93ab337a7005007218b5536a89020332998a040599bc688f6497c520b73ebaa40b735f41d966caa24e655848fa66a2b473437d14c4f80357e449643cfb34e1759676b0b2b3733bfa6b2324357931a72866e99430454fb1b65797a90e5257037744c0f06415fed93540a68fd2bc5ae74247940c21a061923c603c4a89309f8a7d1ae48a29370908d9137db01ee84c3fb6d4bcde28ca63c34cf1012bdb060d830c2aa6da19ecc0c0a8fc0272e066a8d6225f3a2873a52992768ffef0bd9b109ced760dfd2c3ce7d17cc95095f95bc84f448ec51331066ab0126505df1273741220a869b518cb458b00b5e1e503f53c639bd2bf11d71c45e8866582c71c0663ccd19b0519330f36594f1385ef82199d76b4507318fde59b6ae4185f3811f15b873be902d80c44a9523351653365e369be2939f6f17f753c776fc3421dc75bd0ccae0fab9bcc2a8175408950fa32e983cb736075040a857501b2e543b043b617c16001cef203ae164effc243d4b1cba2f225f361a7d65949cabc32b3b3a782bb18d03627cd2507f1d122a46c3e35f91315ccaaea110709f648114220524b8fae55c8e6caa27a693c3a559496d30db2458674392575accea61c91cd3b9188b94654d15e7eebb383e19d114bc0720b7552ba0d42d85863e984a220bc4632bbd7d1c33f925836e117b209351ffb01c8923edbf4a54d500ce7dabda45021601a5b19d9b0b736c8b1e30896b285a633c647658622b30a9b476a8fcc251e0971f8938063550cf39718c86b6849c7b55319b7a4e817b4447d265bc5189614247026c82c557be5a4e1d302397865af7277646b442874a5b0d5ae60429e4dc5ab30c132052030d747715dba66c16316a7d10d180b6ea88a6e97601ae1131a2412b5e83039c75a1cdfd8c0764109d360094882725c627a8f9395cdfaa7bea40263c8479b3a3e1d68cfa5688cfa19322b833e0eb863171a3f48b9910e5289611c4d51554574cb239934cf870550a0f7a4e78b1ac50b59ac5b1de0f348f0315e627cc2e50707827b9f9c6b943010b46a2b752500526840a13d3123621462bf5486820594c40318b86731e1258de6215d76d68b58083149a041394114caf69198277a8a57082da4a440f799f78064310660350b0ab34970e6d9c9e53a2a24b2c95135971db128eec54cc21378b6067d648c85c8bc21bb9551a0648825719d5fcc67717083e9d677abc523340cc24da5b489933ad7d1c1d12b7004bc1a875244a7b9810b29c77826aac6daa1753681e2b9cefa4aa3a5c4cdd63a844166017f8aa79db97115b86c447bb7e66b7964a19d410149fbc475ec1bab8b06cf96ba0861062f89a621776507ae40849b82615f0b6d81ab82a92184ce9b8b07f69311fb295eb83cc5cc4545d89362c33c8dcc7453a70051f40a56691e212897746c17f5002d8c15bbb2b625ef267914d62759cc01da4c8437eb3facf336fa0bc0e83a9ff51c793dc44007a63432309460162257d191ed8872ead9a8a66296a7e55d30d86ddee023ccb84744bab7db9c015a60707cd7aa0ebe7b8cfb1d663d8b18c5bbf06da994e7eff9d64742e2b4ecd70cf455e2195477c581fa72af1ae232e7b5efb374d9607fd958447b7c67e1fb7456ac0aa1b97068f452cba64ebdc138bcf5d36b0a0fada2a3b374141eb9 +ciphertext: 404d2a66e2815b1dac12b2ac170bd54d035481a4df94a2773f03cfcf3d0100524e7fbfb8c41056b83d967ea669e174675b908d34dc4d1ba8f7e322ddebb1a35a38d3243e7d3b55a65915e2fa9dc43ab74648db1e10ae6b516c3e547343e85914db7f1433f7747c8519c8f3a4c60b579b6fad545e1c31b7f92032bce8b7862861c87dc8362bcdc54c1f4d57d0f54a2815edc2bf7dfbb2691a84dc970032901033166084de5b4513d3982d3a0324220e432bd8ab501934ddd9e02e9bc8a47cf54fb33dcbcd71a6d7eaa605683be12efef95aa8765a593a3210ff202cab70880dfb359c57dbdd4df350c5eaae4b19e665d5f14dd12661bebb33fa574aa76d118b058a7cdf2cedf0ffe46e10ffc0e0237ac9f26553cc6e576e0ad8b563a41519d7b7fe2d84710470992d36a26f29ad5edd385707df85f73de32ba0eb4da2877f8881ded4a46c8471c506be310b70ecefb3852459fba07b1c879f2f72ca960a7e3a09c02315a7fe5e66359ee2d10d7112b41987db9749a48ee25b30e2c8cd5b16b9b72970b4f632960e1365968dbe1de58cc7afe07e8354c9a80aa0fdf189cb47ad8d257cafd6e7272c3fb026db7fa0e114d04be0523b149eda1e1158fbff7d99db920dbe5c8460451f76e124146a8ebfae8aa27c0971ff4e2955fcf243775c9ddb08d88c250268e01aee185287681e1ac7790d8f6a21ad61cdce1a7cd4ecbe85bca908ba7ad56ab27008086d7d351a4d1eac429a76a8591ee4124507a73ce204d7bdfd1f36f36966847726e44a7202a9181a5714896350567eef85a7d19e62b210cdb90d43e8b54a1684fecc4941993e93063e096df50b911bfc6cfb6d1b56b06a2c45c0cad9229bbc4d0d44617fb869d17dd72a0aae77a9c04045c125432f48c092fcb641f8165ce30ac1e382909e7bc51e057957e65103f1d9c24b6243baf375e45381c7447479292d4762bfb7ff52ab0d6c2a108a1ed717dbd8029384b72d554b7bb178ee6f7685a27175a595a03dd65a5ea1995ffc30656a4bce5b7acb0709185795ac106204dd4230ee71e56a53389c7a634e1175ecddf88503f24ed7066ad1b5b523175b071f2f44aa3b198b6bab481e69cdf1199cee43dccfe7e6cedd1e371b147dacd1f572373e2d072e3c6612b7920a6b71186dc35070d98c614a9a82fc5da515148cb29b5f4c4af120fe1c5d1b8717960b6359af4ed0962c17c1e28137702176fec18311138927493231228859770c4eac31c18ece82cbf769a5357e792da69aacf714b41c138664902fb556649cd93ff0cc3b57c8eecb81be7377f4c8df23048d530009f16537c2135bafc07d6ad666b8dc24d7385c316a69df4e7769ef16814563f1989d7a7c593aa4a25f3b7b3cd9baf3659831a4b9871ab96d07e6c6f71bd5ca81aa66ead3aa21080f8ae78d8fe030466e931b50e9402511bc145caa0c30b0d1446e2a8ed36e60efc4f86371161a58d7259dd748185c30b445b49829e7baf11b9982a01e64378ae9b205787007029c8673cbe52d93206503039731b7943334a58682cae94ef5eb2c39c8fb91615fbb0c18a9452b478014d89a5714630316d66e775294ef96bd401a55fa8ce4d2894c1a1182d81c89950f366dce9c271c4be3dc0a71bf48b8f9068e798ff1ea2ac3a534dc65c591fd14d5f53d68ef39550515c3631877b9e953ea7690495e67d3abcf1e5c7ef3ea1ada99f3233fe47180a9ad000031113e4faa26823615b4b6f68325bc88ad783b6376c166a91bd753e5162b8f5f30c68c04d85291e119f14836100335d57f78033080d9cce8932ea6f81f546ef63e59f9d4d7ea4c2c459c69c7ee7b6f7481cd2d584f30e7d17cc9909bda2fd14247595953748537feb6e9007a5a7f58f916901164bc91a48f63c92fec8d2648c83102c4d1f0b10cd076320e64aca3e2501ff913106900fa96aaef968fb677f92325a16bea0be578fac616dd0da218b4bbe6bf1f1c296ceeda0c30bfa5321e5cecd626be7c4275c1bd9dafa8bf53d634cf36983b958b6af3aaeef9fb1499433737fec3f7bdbf5e49f59a456f529429eb6ef83b87a7a302e888aaeeabd73a80936103b7a256bdf8c01327147accf69c4428660902a5a0e4475b47d94041fcaad68b63cb417fa951599e1205b7f6c9663aad90bcc31f8a6cf3c4359fe2d68936d6fd7c567cfb0aa4786884e498eacd740a27045c3f1e683a1198032d +result: fail +shared_secret: + +# Private key not reduced +private_key: 6fa78814fd808fb375e817a1aa133a3564c1bd73ff43b5e7d8ddbc43386df22af52d7ec707d5f95109a5f5b64d8d8b338b86ce2439da1857364f6975100ee7feff73cd6861fa085f0ee8333f3fcae0c4c202b6af2bf6d1a63cee78ac3330b96dff58c2037652fe497bb9c6b54456df58d59bc73d91c9dbbad52f5d4f5afad5936a70bfdb5e05fce6e7fb8b2c9c9bbf3a4937ce834364068a6a9feba95d4eb577bc8e70d58425466bebb66167384d6ed37dafd7741e05971b65d9aa5c7969d9d8dd7e670e47c45368e7101fb9d38d414945d663a8a9bb45454929813e7c7fea56f440ab4bf01d35278af4a9076d7e2ef56ce4cd034e57c1ffa3721ea5305459f32daa4c569d0636ba1dcbb9199d3edff43aadf5c8843a99a913eb364ee523ddba96d6514bbdba459d874a5ff782a66f29ea4cc916adce65978b6a8b1be6b0bba3d427e8af9ffe76a13593b4cbeab1eb4e8177f5fa28f65585da9d835a4d2d470e6c646c73e4c42559bb2762077b482dad69787836d8d94412d946330a66dd8e9b4adda0e423933128f6507aa0124c47b5e4d2758b40d88bab51333f1bbea61be8eccc66e472cf39d5ffcc2a08e2ba3f50e56f4d8817539fc95e90fa7a7c344d82477d0d73f2846f4d491d3e40fc924f1c5d372560af7b96bab49a3eee5abe1363e17cb9fd8ffe986b48ed03b0e727b1274fd969a56c954f8ba31878c78d3033689639c67e5a5db55f45d0109d505ee871c3cbf7df9c52536348660f4201e5d38477e813bbecd77ac1262bd8faa7d2575673d8b3b40b0f53092875794f979efe88b2c697406a4800e598896f3365b6a329a7e0eb65adddf4b85f087a885e5fe9c46332fb3e825b9b37b4dd48bceaf52886ba7742f2b5f800de46b4e7fd85b49da1fb956c1e88666fafcf3fc7dd3771c9c443297e76300dbd72eb5cab5adcb50e605d18c9b67cf0b59f365a35f0f49ebe37b449876e81903653c413e2b9395e57496e94c5a913d5a0aa7b41daa33e4c3bad134569e1039a5fecba93a3be813fec7f5cae6c1f42cfbc6b15f33540caba84755c2dac7b3239b6aefbccc239ab170b9168e842e543d8f9e737c2695a0a5e3c1edfe3e7fabc79a5daa40631052fdb177db7aeffe0ba7af2069441bafecea4964b772ec6b94fc40aeed93b8abf7aace2a9a7fa7bba867b07af355eaf3cd6b61f58af1d94fea8e4391eed5f41ec639b3c63a72c4e0a05f0f9de44d3654fbb2582c498f41c2369dda7ba057e81535432fccbe5d58548a7e991922c5a32ac86a817f5b0aab1b3c37639f8e2ca9568f00b88d84b3dc4ec9581be76040ea38ce7a7895da2f8bd931c1c72958ec90aa367882643a54fe55e57fece1f80d5c68cda283304646dd0ce3672ab9a73cd39d29d9650db543ece5bf9bfa94e68858d4ec17f2c718977bb0b1da34cbd93fc3e8650cc8af20fc1ea138a73e392be9ed0f67bf87d3ade5bdc6b63c9fdb44aa2a52f51e627607acea53e896765dfd1078cee052995eb6d9b9948cd05ee75a42e8a25288009b44b9b7fcbe37bac090e821f5575a2c54bb367530dbe367d36978a8ac6ecbc718107318bcf8c5f18426489536d2f359004a478799fc51af1bbff8dd269c34d2e8396cfa06bbd7559157142c46ecf85e7dfb9e92b1cd8e9af524b46c7543753708b726ecbbececa5218849f6c0e42b9d45afda4c9a68ba9206f64e4d6a4649aa66ab6e6522dc4f57b3ce81a3833978aebf52ffb536f61b74a261d7e8ed440504c546f1941ac86fd43fda10c99ddcbb79b35d93bb95e95c8c58d9b27a934fc746673ea555e939e6eb009dcd54b9dc143636b3aa76fbadb37dddc5afc33ecc693f0950d98fcfcf20d36e14fb88b3f1dcdb3a98b5efd6d2259911d44dd27798b281d8b2959c5734432a5f45298d4c9bf2dce913ce99cfbef53d3d9047a3100c5400cebba5d6c6e4ba7ae707c38cdc7782254b281bec8dcb85726579842674a7e6d61185556ce3c841fcc4927264712645b6369c30fc388d689948059dea02f3e7435a3ba055b96179c4f6f5eebf8f4ca0498a264674add4341cf8edc1d77cbcc871ab64a2c23b14fecea46bd63eddf63ab49936e3f5cbdd7a80d27ede2f6e56445655629bd64bcd89648f4accd9014b497ee5daf29beb62b6c9d365e5a0393341ddc9ffcc42e1ada20b880b35f49a312180f66b866c4952d92f2bf38b08f6110850224909413938678c8f9585a0741b561a36b7680644947485b2462d984ae5ea115fd52202643014607067b9540457a3405e7127e841d004b86c094468a0743b82bc70569c3388338e0dbc6abd1456ca3afc4564ee9d361ca0a708e417aaca1af12151d5fc93db4b652eb990a0335c799a27b713172b6949be937b570384f3627102dd2bd784c97d46c8a2ff2a1d2a0c438f0281cf29971e3c58df77c33b83b5252cf0e72c4fb9448aca6a3abb06a22677c0206609598c544781598fa318bd58da2625ccaf7ae759b774147380f0304163b0786a9203a1169d943b54b9b92f7bc7be5fb17e87a37dfe73712c33fc0824ab448a9b2295a7364629956cac2cb6ed54ac085bc3693fbcd9cf7b44d4b318e248ad737aa1b821fa985bf7f219828b1cabfe66deb269a6be49dc3f74af594c820748fca60961fb04f22ac2cd4787b5a41a91195b8588b3a74a1a188f95e50ab047cf42fd5b63fb88ba57dd24528f90c2f966a1cc91ce39ba848fbb2ec4576df188350f587e59b0ac0848d71a93cfda63e3ef93745c6516cbb69a5505b1f900aa4f91094306c84f640050393f1c751a05872aa7b027f678b1aa2cd5f97ca25806a53016eae4412a7f23ebd8a7359e5a706a11415951ae2a45d60fc999b66a255cab76ef85601b2974c462ec4202f83b2ba85190aec7c6fd6263d72e19f7ef71b6fd37694ec1e56090290549d002c2da8b18beab345f969bf1b23144486c299104dc7dc367265902469c45d7788c5d23941c6a1608a12586692eb759eb4835c537429ef287b6709b87dc22653d7a92cc314a295a6a6c939e33b3a87394cc40cb284b17987a088fffc3f401c2b072cb72b467d59f930d82101ac725c79d54fba036aad5760a615cd5fa1a323a87fb63a4472228f124a3ef72a086ac74245cac6b7784249d17c7a19a126b28c7530c1ebd6a806097de35177a5070abe84bbe3b99ee7149c57224357c8624d08ce6467b144e598701987fb460b21e53957f57ce98343a564c63fc466f7e04bbbdaa63ce79448364ff1d9c05257219d03b2d90c9c0c299026d3c0aa4845050092fc7424f1ea03716a456bb2b935a2be5a5570b1eb467d54890493c4977300344887718bb54aa06bd890229359ae33395d7a7b08a71465297780f54cb0d2125ec1311d6bd31766470dc18810848706c0e79c8654c6c6cb35d4f62ee70541e92982ba570dbc289be8e842a31b7e7158660744992d6506e1d1c8bb512f98015270376158228319cbb7a2411253a98cbbca8a6d86c2710631e105c217b2ac05f813474727c1b089b3c8ab8779ce91619352d86b38c5a622c73d692814fd36800d5c009af0bf0eb6734eeb382f70412c2469d10698071c772e62c6243cca236c2676fb0258487430998ad99a1456d29d79977c810953b138642754c0bb993e8b9b7e3b3b7972359569c44bd6576fbfc212f78c0c33362011225d2596bfd2ec1a4b721a36259fb723c6413910219048596252225879bf301c20d305dd3bafb2e62ccfb1c3d300b5460ba561f3c61930662f3641b763b2f5b5b2682546cba9a15331b8afca63cf68b7a1fc2e49c5b4042a3a2b2148c427c9701727dcf3371bc7b13aa62878c8a358f391f02b1fd3d2ad663c4f71c36cbfe11581e1995d976ca37440ddf9c4de2b48ed9c492730a977e017a7065cbcc811bfd155d1935122e12325732505c6c568fa67bf7968ff6836f765c242b5b9966c333ea1161a336164d72cc5767e40939590f07b537788c46265fab1bc3078c470e98dc1b7a31cc53a83a0a7e95c4634754a069007341396371ab79f6343b601b50966c5999144cc46b6d06089a879871bd1bb9c2cbcef84cb8fb4a031786bf778703b164f6787c5cd63ac781424f8550e1ac992a6c04bf7953787047b043632de12698e80526c813e08f36dc1db592f48968395817566886bb2c7d3fcaddf331273ec7ecbdbb3e5d70c823323fa8a1a15e1371534cd0462cd052685950bb6b6833600243e35c7047bb20832f09e1d854739c5b425bb32bf86029e1159d79ba70293badaaa25385563cfb4babdf4bbbe341058d3817e9a7941e69adcc867559b822bf63d0034c15de1a9371945bfacb1caca4fad8590f723014cf5355228d850d99c57f85c67295a4afa0b9d8e1da6065ee0e9e43b6da97ab878370142b7b2b346179050eff0a4153943be66d9ce47c6772362ba795b9da0c5da5f195b80fbb99c2e8b06926074f3f604b3f6195b5a5b9737876bba72 +ciphertext: c8940c3e69cf3837c2792ac9341408c5106afac1fc3985744f4d0289f745add955784e39e345526da04ebb3af35ba4b4a8cf8ab6fab0cd9c27b03266dee9d0c224f6a3e481e313af21e485df717fd89bb60ef6cd991896095eac6d37c20245223c5c2b62358a0d57f255e53ba44663667aad78d564c0c6b1a3cca8da1fc81ceec31d3f347d890b5d829f2c93b82d25b6642ed1b911ec82b7032ce5c0e56649dbe11582097ce456352f842095e8ea4a14dc3ed29958d548b960380f4c50dfaab65accb98d74862dba822c438dcc4a21ebcb3a99f89496aece9d7ab098e7deae6ff750f979e32f16d5796e5b4a68cc10a396d1894066c1a335b4a15069916b0e81ecbbc526192c904d857bfacb6434b061a94c55904d20e478a512474ecd6da3ae06fdbeb4d9db1d571dca82e43934160d0f36e52cbbd8f9f781c07067b4e82cfa9ff0ab971502d9c09a323c36ff304198af9dfe121311e207d9a949591f5e6e64accf451bd14c06e165a177dc4a47414528c85c1375ad952cf16fc1622d32513405d0959f333cc139a6c27a68976f06b21d55f4332680dffcf12d636f68142e13e5f05f2a8dd0ae56328f1b0e409eec89323c4b03f693276bfe99a5dc16071d034a33cc0bdb6a533af8d2b755d4e4f89521762705d0cf88a69238439f51a2c6982a82272616d34aa986db27404b60a43b18b565faca6263a888e506ddafb1e8898483ed24422ff52af414227c649aa280e7b1ecfcdfe6e9f852a52824572964d9a0309e0eef481852f344c727be41f136f5acefa62275b1eca25ece000949e5f93412deaba1f35d979281fe2e687b3ce49fa69bd2e70fac2dc72dc546ff68b2394d5066e7dc7e1e8e4461464235820b54a2672ea3d541f582e8ea28efd277e8cd22458962a3d9d8d1b3dbfd978402e20b0c25dbe8093632454498620f27646fbe1ca40b07fdf986399f4c742ed706b3e1c3add52e20a971a3bfd97e7b77b557da18fdbcaf8d1a53ae79a08dabeb69bfe5be215a74791a2686c8d13f49146cfee7eebac74e8b0b35d1e5d638b10732c2077594683425c11600bd90a61cb7deddc91cd16faa1b4d80b33e37cf89a73c5a2066831fbd00a6c838342adea2cf7ffb9eb9117024a03e10331d5faa00478d8c9826c2df0f44480ffcbffe3e4eec957c2e95c135c2ac2f1bfc9d9c241d1550869bde95c00616f067bc85cbf1a58b3d53ed57dda18e2668070f9524d22591717ca7426876977447bb4ab0598d52ae2145b389d5889f414c42236e8ce34677a3948214683e4083ff91d96562a72395d3a3b18262db82cd484a5351dda702a03431859e3832c4ddc46eae03250b186fc1ac8837a1407df20a3cea689d163067cb3915a067f8e32d1137d08fa382abed6912b0669c360b8bf42de50a596036ed45e5481dd6e42f984110a632ef441a92489444edcd716cb9df602755a60a94032dd528ad2627c0cef727f5b21efda54bd27459b3e1d8b311098f10a1534b30a34975c86110e3b8cf37dc1087e52097e5aea8e4cc49c62d3770b4d9d5aeefe42ced080a4c946c3ba70d5e601a18e0f0ab985eb0973ca252c65fa89308dd7c2ee239595f464a290f570046f31a9549efabcad5c33d6ce7794d08cb3a42f594f89489eef9486df572dc93259e412a9c310f878d785ec432c373801cc9319a008624a3d2619d74f0caf877322d52d091a0ee4e1e845637e6752f610870b8bd9c62e1d7b53a84a6d8ce169c7834f2239a20420d5724f1473dccb15eb74db3b6465b8dacac10d1507d403919b964df03eaf7be3d86b26e7defacf89ddac3c6a21f60673cd2fb9f4524992875f6c0f1e390b969389d6a79d06412851c5443ce70aaef5f6168d8ba1441036d197d4cbdab95b144044fe88ce36818f2ccec8b1769108eb7cde1d9ed6030e39e2be445e8573989f818d660bf94ac95f2db111e28a6ba839b94e6486dfb6d75ce48168b16feb3e6510a862ad777831ec3d2ae73eb15722a45ab65f921a2bd39c7013d39da9e75a80975c2c9281a6efa7c6d26bd80ab3de9980074d9a59dd41d1b56a4ec95a0b5a9f2aeb90aee83da8eea8ba2531f095b3f365aacc6f3321b624513e35fd3c9087ff0d32293ef2731d81d956667e0b2be7c8f44d3238931c69d022473059f5c014282932194bf30a392bc4f1f8e3290824ca56b0570af2cdc6a80028f88bd7641505abe9cc7 +result: fail +shared_secret: + +# Private key not reduced +private_key: 93d973d0a7b386af9d218666fad65260af788a053b4564f2c35f6d557bee7aae7331ce8064bd54f1ef38ecceba8cb874836989c4a7c75d364118585b7db99469e5fb053f43ac867b26bfb8cb9a8f6699c3d8fbcac414f3fae9da56775c58edf107da9dc94731a3af98db6eca00effffd1e9f817cb01d4c98a2f48443d6b3688fbe1c25adf98f702c2f5f44add0ccc8c3c27ef9f014dfb4cbea4993470f8cf0d73ab3940e6848ae647a4ce4ea88a7095658b0b9c61c8c726feaf55d74eb84fd3bd1c9c3d0dfd70a9d9b202f7c89d9c7f5e5efe9fa753ef7f9571a3e7939af9cece7a0373f86b4f53dfb84a07dc52c336d1f34a68276eb6d2ec73e9a92c50bb69363a9cb3c41d56ceda8d69608fde2f5193a79d581bf8760cdd742f74dd3e96c6a1305aedfb36de84a9e5b93feb5bcfff204397d28c8eb64a757cf7d8e8bdcfee3ba9caf989c33e06348e3ca8f8705266c2f8569163c91e33baa49e6a4b6c9fbf09ee74d24bff7cdcc6d1fdeb61ee26fde507ee8cbc4b7f81b34c82da47bd06851c0f5fe5ad9ac27f3be552564b789ffdf847f3cbb5283ca8f04c4b6a6edbbdcf3c77b0fc29fb847a5643ce719b276a39ddec8a361d73a4a54bdf1757cb6c65b0e6f333c66fa653e7f713ca2c714a2debebec986583e9bd7a6ff42182f3aafd7e1ccebb83e89f1a426f5854ad45dbdfcb8b597332b524dca8e16cdf8052dee3dcf882546864d83f095efcbb066990287f7509a4a23ef8b7cbba46b3db174594c7abb7735a47a472af4515dc0aa5c6ac01fde005441766bb4741c756c588e4bb7963fffa889f4dd542b65a38a888e15e1d8053aefc6401db4c795c7e8ba0e9c96b39458d6fda35a383738649c065fd19efee5adb9b809725359ce7556d4c4e8462e7d94beb3ccd27e48e4ebce2a799dca2c55174c98bce9f06a0c340f8c559f6c7745d7b305b672f26364346fb2fb099fc5173b44ce67cc25bd8fdb7dfb7b325226fac665bed6cbdedac9822745a80a463329db5854bd91f314d94dc949b797b128feece496d793757cdab5e0cc6cd4f0c7575567ad1457c54d3e76861c77e7f86446e4e0e9b3a005678577787d3284e595989d9fd9ffbe6bd621beeaaf94beeb78d00877cbaf39bb6bdcfbae7f975bf94ff94a5641a7f6630cbb331e4bbc5efc27779bc49632faccbadc4c3bc1b6ef5d2337754b598148fe6e4d6828c6ace3f73adbb6d21bae5e52fbe52c3ffb0bf59351a7d3b3ecb38a39adeeb3e23b2e67f2ded2a19bb83a76b56219de7d24c9fdf53056f35cd367431c8fa7cb3ed521d4c78f78ad54244e97149cb3df8bf96cc36756bc4474c0c0fd6aaaf3985329af217469613bf25504afe70c69cd4467b4ff77df6afb75be4f407a649dc763625f7c0059a8c3fca244bdc2eec7c615f7c8a15a5d4055a301abbfd5a5be42a8cb7f5bd700f4575ffb719965a56bdfedfddce9d48a8303cf9cfc44dfdfc391e2838f888e64cc7b58355473a9ab44098ac0c0f8cf2c0b36587d9e494e9c3afcf50a3ffcb658aa1f77d9d0c4bf6a077197a8a89f433ed18987072a9bbec9a19307c51f66cded27a2d0538ed869890413d8fcc4fe8c8a9bd2c5845b9e4c18c5c2aa5cc2bd4e8ccd63f8c139af2d66b6329db99d5d42e7c8e37287f6116eefcbce449f7ea6db9b35fc1b5871b6f7a649d0594869b21ae484ad55c8bcadf3468b4e9a7cfa6c4e333dc550889a49fda5b5ebbe64dcd6110c96987ccc2343bba708791bd9b2d5d6b028b942594e646244745b38c64444f781e886ae55fe3f14d98eacdb1c37c30e08328c1eee0f4838a64874b1985ca183455aad7712cd35e2acd159286d9473551ff65252efc26b2f7e760efa3b2b86c53650a34bfe4b77b0118d50f8c8cfc965771bbb8a9dbdd75e09a30f8eb2a4bab1e424587bbf82ca89f7c0eebf3e18775cc36a6579a3fc338db9ed90707ca42dbef981dc79567632860e4577e9af843b7ccfc631c07d6a1186c6973b5330cfd4fb1cd645e54b768e871dc6de5b4c375edfbd43b35866bd8856166f640ac7efb5e6f24885fdafe6fbabbce3d66fe9466db49d7ab234f44e759d1b89c041bac28914dd125aac681cb048e9d8d395e3eda6a23248a01c6bfc1b6c6296a5c613cfead0b433bd3f96f904dc430dfa74dfa4740c823e074aaa7ac9f7703a87b72bd0aa050574b63fd80ef56c882109c9eab220e67041396a29d6977f9530c3628329a2e02a7850c77c73a4698145c837087f2241ae46a1b7b692fb5c81de38846a5bad7246b596a889eaf558d1d55bf1372057f1795b40076d53c0b81288fc9009757a9111ea26c3410d55217768378cdc94a3cb40af38f67b1b473b15205c58d876077b2c8005bf870588dd6318ac154dbd9aaaa6d48d1dc05118739fcc7c12327a68f8b5369a846b6aac56fd1043c5ca8675752c12549840d47b6563c703723d6b8791bdf14e0011c0605136a1521265c13874b9ba6064b85ea895180c634168774aa55e2df34ebd8132bac959dba90ffa656e7c61677d3b801ef3604814ac36d31657bcb05bf20c893a4a2d50644902133b9b16e81c1abb2b5521408f3799152ba14d51a6a7f4a231b5167b0273b22cfc606482cc6685bbe8e80f6aab99d7f55b50e093aa55b568c45aa3e4a0766a9228192e5e91378af608276308905826c6a24e7413aa98f57495dc2d5ed5bd6fb5c65f4b4ed7b9c4c7b504548b0306c892f547613516a9064417b1b96a95cbce5b502bc770356df5ad52b98adf01bd66175ab3747910c814e7b070205b60978aad90c43341ac6aee03cecf7cb8cd2b4842c3401ae1a3b60207af366fc7f78069e39fdda0ca53402ba455af5ebb21ef9a6d60501d6ecb1b5297312b280ab2023f2fcc42c2d66308f263b7d019af68144247c2dd93a05df57daa5a03e896a182b480f1f607ea668aea60b66964b2a3fb609ff547da9a51aa6848ce2a686406c7fcdb058595a807a6692f833cbe3166fffc73a2f30523c86db1b98ee7f477d7f1a8c7110076774d6147bb56a79aceb6804eb982a8d00356553a68ea8e91d8b86d676f394a776353bc830043cf209dead22480c08d5df25e80fb734bd6558f1b9080b09fab642808c458cdeb0d72e5b49305aa502321711131c7f848fd14811d718be5c805c8b254c8c556981ac8c1dab13cbc9e91708d99688e36599f3b7a23f7ab83f2a3b613b38287b2856aec5b4ee90c33e85b8d88cde3870759320b4c1c0d8d727c8e379f84da0221b2cdfef70270299bab0b7f9db8c69d7c9ea6d01df6107e04440bdcf945af329bc016892d8c01f071654ae3b19374946246027210cf9b1760aafb5e4a935c2d0b7c70db3721279e6fe43d712468fed532cad432ec30a1372554c97c3769c380c709018393364ca97f9dc37a0d393511990aabf398474965dc45ac2a37ad60163145bc3b73e7a6c2032f7d2216bc19b26b4cc55bc68ed996411bb00715473f4e0636282c203770a3bbdb26cc58aa7b4c69dcc01ee3e53ae514169859b632937cd8c355c560cef5c091f4080047929554c94d7115393fccc11fe397f2854564533fe9e66614da3afe15be92196268720f5fca36878797a2b045dadb2491fb3cdcfb7253f18750774d4108bd6c7c6545b801e8e368a1087e0f33c22a359907c1c75bd59db28268da457699337356436786b16bf6a25fc55141bca303faf566039991c700a227c01e6543bc173c06b9a8026fe07e032c30f5d4c86a950a3a7b32e6c67e51771d78c08cb5382bd4fa8068969926d352f7e5820ab19878197c25172e95d6ab6a05acbbe375ab955bc777977d2b926786c9143978113c490731438ea53c0db27bada4be961b38138b4c684a12d4b08b6f03ab28f6a260b01afd348b59684197002bc534836c8b735df139ff98c84ee03a58e02d0e6125f1e09bf7d7a91840226362a667627ae5f580ee50b594fa64892a508ff8bf80851abdc45486936e11e26beca14334454d66c0128663c52a8700b525950425a4ce7824b25b9e45ec6bfff8279d1503816ac76f498f8e18b2b626b285655ab40096ceeb229856457699b500b77f7af5c2bc8c545c4292a387583fd74dcd20c4bed85bec8c245c63608ea302d557199d9a70194a5e92acb24264532b02baa8f824052379395b3b4222536164823c379782837ff417b1583238721b8b6b4a5be982abfd35a90d07bade5c03c4c3170257bc0e88b41b242b146027baa2cc72474d00427b0c79cf294203df379628799452d3952d2ac709f20dcfe33b001022917a4678966f1d9065cad2bb9b6979817873e8d662d7ba8343d18729291c544c00fdeac5ead3c8dd2cf3e2ec7899253e7f980f9ab3230eb1a9a3688f94bd522ebe016e2980d72c13035e253575fcae389887037cdbff8ea508ff9e5337e2fb607919747cc53df871600a8982c350df524cde514431ded7aec23576530894bcbf0ec0bfef0bb64f +ciphertext: 5740d7e2c1b500947e7aa2f01381407b5627047669bc3a89bb5040aed14f0be11c05a56d743b884f7f493184a108e2820a859bacf72be64709a6f57ac785d44070647596e7f23cdd66a2e0403371a0ae36bcc95212fcfd7b00af1dcd22efc5905c37501ede6abd9c7c7b366762a727e58ea82288ed7946fcfb6cb6f17cfab6c30622da11b4b6200fc8237beb65d50f2749c26c3c1b014782e8cf3bafab9c6efc12d674642101d5148e610d0b62ea6d024af6386f5ca7a15f1a2f793615e8b053ce0542ee0c622bdced6cb81c4ba9afb6d6b70cc07e7d42cd72556b8e2c87169a8fde513a8c53fa66e280a1b61e68a0a4a0103440826c430a4d0b55c8181f95c573582246c34b880fbeddc4e6e9ba0f3938004cd8d4b429f639ef3b214f78aad31074ea3b6344522ffc306ec466ec89c5919292d39d682ad3e62b398a2f7991ef3a1a64e94b72d7ecaa48e1ceb95ec88fff36dc28a8ad20485b5fae3694fadb942bd6817f79adaa43a9c747cf29fda10472797bd7736c0d92d56ef30e6d10dffbebc0ca4610279677fdd4b015fbb5f6785deea717282c4eaec871b8b5f6e93b197e37ac566348d4d80fa4dfbf9fdb33164f09eb687c5c445942813885714523166ae4d006e0a0204bd88a870df62a933a794a1dabb4646386c0a428aef1e4ce77fe2b41819ea313e3f475e69113d7db68bd0212de9ac74286f8f99ec35892a7ba5a2c6caaebf76683194ceee062243affdb66b8d31319ea1f72a04b29d96423fdabe01dc36feabe0c1f4e189d6704f7215903ca7e0a5c7d9e32347ac8eeed0430b634684636ca55cf3ee8f782afc18e76729bffe70a66ae2134a8d46bce987e54e407e5e2631b5838c461bc26366883b3a45a71e7e9a4559304bb9e0a0abc8594d8e4035dcfa5fd87b202222aa5692f8d6c682ff889c3f0137d88b56959f03e2b210151ca42af8f130777545e9ce51235cbf5e77a2c6dcbeecb42bd7ac91978c951f52e1e6fde74ce808de813bdd12fce935826a39426ea9a9485f3c11fa141ccde32ba5131f25fdedb7ec732e7716404c0c762c3b4b616eca02fd824bf28d3926d38817d0bcda5c2c3db0bee7b5075f140be211a310dc652130c271e65965ed2efecd53b2b119d531666dabd920da11861b68137ae03eecf96535ada14502c3dcfdbc6a224d94fb138e3ee8417f1547743dc618bb573f48984bffa721977fa26fc695f8053cc98c681f481b45321aee96dc9ac158473aa1cb4904dbc5614ab3b7856f0612f3b619f97094dbdae6da8a4af8fa0f302a85492e6fdbb15982b783eb1736f8667f84aa031ac5db11084db69d09e8caff7c52d89fb7a23e63c125ce4c39b1de1c1c5f8fb750bef864b57ab6483d49c99d403c47f1dcd5fab8e3e02bc80689ab7987a90c7bbe1a5f5caee65f16014d17a32eb9a6a963ece4fc691b4fd323384696af89e015a03b57638eede81d2e6716fe8ad838f1148cfb5175953846680c9ce86d8c786a1f6042ea39472a47e8ef3f81f07a35edb0378228cfa7760ade7da7a6849cf3b8a18ef60286d27f9ff341a4f1fd4f04633a277593ff38fc095208cc37628d980e8ec2e8b4d57c0529aab6752096968ca0a17d1abd1071d197930b846c1aae49b69cba4b3fdd2293592e6da36bca6cf38e03e666d30f33c581e54efca3115b69957ad66232643bca122dee5c7f1afaf155889cea07781fa92e1f221ebd9928fa4a4cda0d2d8b95529a153f965192421bef46603a9b89dadd13a29c56239813e3bc577373a7321e1df79f7b59b57d9e39ec44760b1e5fc72ad82771917ef756917489ea0f128211aaa31a50f9d380fa48933383bddb3b11e1b252e2d2180a9a7329ba501917b7efd21a7ba71e89b20f5633457792d08c20025b41a80d58d3f8ca1216d20f04f62d1d2742e3b7b6c77e2c6fbd1a4424534c72c914c0484304e8e789c83b7028fc0042fb16e5a30dcebf2eb01c4aea036e2edd975caeb8a32f6afa3466bb740e7735df8e1b7d1838c85b366b43dd97dcd1a66b7cde59de198d5e0d0f3c1d74ad06772fd41ccb2b568277f0106b0a41fa1afdfd58aea61ffad6de24dcda35c9f8e0e864d898670af25268b3a2ab0240e95a0c0c36821991631742529e5f8612bcc0f71602fbf5448aaab72e6e598e5004e454bbd056e76a54eb2cd7eaa92186744acaf865373345fc79d42c5cb08314ec7a08550 +result: fail +shared_secret: + +# Private key not reduced +private_key: 5ccfb53498cbfbe8cada7dff75187bd676b0b4995353374df1c4aacaeed5b827fbaede7b6707b89daf3568f5bed5969479557cf9adabfa8b4913a7bae48fdfa73c705655cb39c48138dfb08794f9fbf44a0297b1dd7e496eeec34139d865e6db8bd34c761933b3f7cd78f4f039a4377fab7c8d8fb9cfa6b0359bd783b766e3a598afca3aecc59d0efcfd36ada5531da94eb44377634a1c097635d851d12fc5f15838bd299f6e2afc7e8cb3315e5f595966bb7e7e0ebefa2dc84e17adfe6c1ffa48c4cabd27993e5587cfb4575feade6793d079ede935e4b4796ec893d3c59267404ccff38dae45358f3a3e1c82aa7d47f1c3f388c96f615c729feb75011f5e1798ebffbfb7435e51914c5bd24b479ea33bba133a560becb155ac34bafc15d77588bbe3ed53432cddbcea28b79c9cbde8e66d75e6ac238ff4299a3391a38be9fcf15485e72a1ffe588b341a16ff6794494b0b549b0832d11eca6d04c976d76111f85456ac9c21649106a8b58b359c943aa7723cdb737393f5d9d40e0a9126dc8ded47d3ef7f98e24f4c19cf4930ae573de9b77ea9988ef88db2b6e221c8729f1bdc88773f8f9553ceba7ae0d6c9ad7ba7919741fa24de0703c96034766c1f6a6fa9fbf13381377ef1d12d5ef45a9515b5a05d8c6dcb293ae44469c8875c418e3db42ad6e935c810ef4eaaee78edea641f48519d6a6e6b0547c4a4dae1178b234bc06f17e29a6c9287dabd65fe51f1ffbe8bc9b988c7e341c74164d430fc6bbcc5ef3d36938e2a4a8ebb8b5a0e9d6e438d89e48946b63bb25259543244f1fcd76bb10f45ec4761c5fb3ee6ff55ebfa33f64584f6dc971189a07cbe9479f99248deeb3328d76c2c9c08457e35baf5973a31e2fda82355916d5891f193b0c45bb1d4a6d91d7a47a33a83a5f34ebdd9b89366d1abe6d768fa5c30ffbbf2457aba25f3a40d7e09c9da401adc8b23beae5b48d6e9c642d985377ad9b8ca6ddfb493ee37a0f665ef9dafd8229a36cff883c09b5239a556809676491e6010645450eaf175ec5e4a55fc982ab3ced778a90f644945678dd5e4dbae44efc4b53a153d6737a6dc45e5c4744e39d6ef9fa8522f39384738c99faa3a7cdb779b9a7b75a5603ac55bf146f0b64769304d594e144c378a3b514eac1c73d34198976bf9492b7393de8455c284b1d4bfb773c448539bb493a9a8f1fc390469e7f40a8cf3ad520096f64243f8417478857cecb67c36a355d7ebf38eec73dae5a73f7998344cf7be33268fd99492d895aaad05e74df7429bfe816f5e6f2717a0f7dd858b4ad119aaa1cc14eeb527fd475e84004ffe23f766ad29746e78aff74abd66afaf2a0ca0b65cbc1f1a9b8544446c28c010eaedffc7d8d94fbc830e4cceea6784a35d756ed503e8a8afb7985694f5401ddbb2c95525cd82750eae9b058bc65896cfe43b9acb3a00a475624e36930bcbf0ac993f7ef36c34e23105a6a80d58a8d49a11a3e875f48f6aad74d1757876f598a4a665af6f78a9ef7d169e849857c430dfa75de4d96359c4cfefa4272db62ab641da1bbc1ff4ace03ff0fd0751cc8a378acd6500765c632a32bfe88d0f9bcbba3d3eb1f6cae94a45d5f537c7eb7205e8ec65863216f571d3babac57a6520b3da76f4950628cd46b88ab8f4c88fb33dfebe3089d85bdc7550648bf57dac3c6484cf0e98eb84ff41b5d869b50761496d7718e43ef56572a3aba527595c25d541ee1477f50773cc433d573b8c15a9f95c0eb321c7aac20dd2c65baa0d63650fc8c45f83e2d1a77010aebf9219f768d4d6934a8bb3c94952fe7fde83804f36d8d39f999f53872b167d2c5ce7cfaccc9ff37ff764fe6d097bfb4e4ede2453f33f8409fd580aeaa7e78ee6cd89559455f458675d94cd3177d3ebcfb57cd183d06548966bbb6cc628c446576e9eeb60291da050cef6b37c45a6f4d41df383319effa527e1750dae804f9ab1b6e0dadd9e9ed36cee14d1d0aadd847b3dd208f7eee3c841b452639df25e1d6eeb183c816a6b8397f77e588712279cee18c34e3e62889fd4d55d6f669d47aafef6dfc756d946892da9eb4be4d6c83cb013fa8a9e7758abdefc0f0bb6c014a048d5457309a125aab0759aac0bdc347dbc7eb67f386e7e569198c6f0a6c213c44a15bffab40a7f35deac821972710b8c10489b6e431f18744974e86c075394189349b00b1ffd5cac6072cc10217b0e3203e3f61e1d9281c2d208af83a7f071ba78546e273271ac1cc01a320f35e845f10c59bb8c97e1627603e51a06e532ee716eb83519c80a4833c7ab45e6951137c0f731964ed2197b033e17bcb5237a1128179a85d24f730a6b31ea0e52075ae2198b48106ad0e1225701313af1a7b675347bc0ca48d88c4ff054edcb1092e87ccf070e10dc093bcc9bd400490250b7dca3775b715f218448caa01a8d8c8c6577cc9f21a7e3e6208b2c42215794954aac57712a3845523c74960b57a97e0c310cf7b8798192eb9507fe65020f706be129774f10794f2296abd13587a78456b083a164bf23c801969a57591062d22bab23b61e7dd5b31bd54520f4080a4c6c01c6603f4b4b1aabb99681be0b9c671f496f8cba2a571502e0da35ffa9bd2c77a5e66809e4d54000b851b2226e23c1072253826f374842da312ff0931b7a85e6186f5e6a31276a2d40a81fbe135e2c86c328b896f07c2269f983b313cd92578882a321f0031fcb9a9e7d618fd3d543e34abcdddb98d4c4585cbcb67789283c442f8c5cc914427fb1a53f3e35b78c2110ba956defa035084c53cc9b6fa7946e11840087e8194db6607246c7b314ce7644b8e522cf494a6333dbcc23da197cea95c318797ef0a18c84bafbe968df375fd0c9981757aa8c878658722bfc2684e012af3b30a067ac996315b0cfb13ec45220c9447ad4374c78484ac652921328214ca33466f6024abb7a78cbb528c44a339638eef09d3ee370d3a1746053629e7a37eb2600f2f73eb9d572030598042315b093c0082456fab06ca2a4c9bbd4c651bb297b494fe7e38d5c8aa3c7cbb6f1189d4a2c02de0acdd0e2c7ffa22e83c63623a21dc137c00e07193bd28264ec0fee2259ff2362ebd1c252103d93645e92e398f46935109bc0cb50c619424db0461823d33fd8d271727554a4c86a5113a17de7bd17b47cf04bced6cabfa7e926993b57a6c0a693e251e3b90b7b17195ff037fd867b87109a8be90403060cb34b32688c263eb00194391ef6c978db4c83c8967a735895a70b6dced06016b3737015696f1a1945110a44f022472c0ffbd049c0925ab1d68ef3f775308c2a95e99865c04b17b34d28a1254c433313c972a7f51a48696db9d7ab71d4600c0563b36437fac1ba6ab9ad6e89630357485dac1485e2808de8869ae59fc6a952890c69695424e3bb9f27aac2199301dc6b36503699f2504ac5e35adfe08048f9842df3260abc3d209a1311d65c048b58111bc7fbd6953d21b56364a51d9c2419072dece82b9d93aeb99c3f0a5a6c3f276504c3697a7c19563abd84068e8a39373c1375d848400c663c44e6c968c3c61fb375eed10baa60cf6158aa7e39c99e609a8b0765e36a2fbca515e4581a0207ac3fd5b3b7a95f193a08511109f335cd1dccc09223129da93aeab93ebf397bb073bd6374634675b6386caa33f71e04b1b420a2036979acf22835fcc511186441e1f5858402af78ba99673125ce9331b6686821ac739fe41467ec22736463ac4415db238bdb9a32e1895e0445aeef16b12e818f33a435afa91f850549ed465fc026163f988582040274638eada37dc162bb2d2839ca934bfa44acaec450ab4436ee78a5e658134bf80f914052be1a605e69ba87005f4042a25569c29243157865c5bed6918da360c4b824c7ebc8157870962737d150ac5583907c0c0f0603b1dceca45e10467ecc3a4435355af8254aac26f411a37b2587f40cc023c1c497664de5d705fbd0c103e36875b168c1c732ab364e1a4726c1d8207e1830d73721dfcb55557352a6508469eabccca2ca706c1de5fab0a7647d2cf7b05e117998173c5b3958d483491f128f01889fdf00d0b668a857479030f0c16bb753794719e4e142f0c5a1a52445de8862cbe3377c383deae1817b8110e045321a16594fa7c1d1037fbcd2208158c625514f3464237d7c73b0dcc605fba342cb6fbcbc71391577ac3781adb39d4b1c2236a4c9579810d039c10fe556dd954d71e705c6fc9389f3be0089697dd6703d8bb8ff08c88bf6773082a56378b52bfb30182c9ae1512ae1c2b9f99b4f3d0b20f8593bc530c585d737540972bcea60e11441e07a9c6827031363990b383b6f42afebf55e5f20635ba731fa86c24d6908aed77e3a57b2138c0c83a5bc98ebd3a002c0a9c60409f3dfebc62eda14a11b1c03d59d46382c2c2a579009c0355da8a58440c49a0e145e44aae52cfc609e6f47fd7a6f6af877190ff52256d0ac5b05b89c3f449f +ciphertext: b55c52a5e679423c1ffd045386899ee3fd7a9e783eef9e46f2725ffffba09835961521a6891a76ad591526e27db7bc973b07bb6b4e768ee4dd4c8b49acab0389c95044b6c2021cf943beafb912b0a492a01aeb90960f09fde6f69a55356624d7482cdb2a6c4faf3c89aee8c745754ffaf34f69f4cf5423e752aff68d305a2dab756a20a37ad209ea7f9b4cc5e5d493771977bd8276c79c77c1ac529c1ba0972a127e0abdc345923802b8aed0c1fe0d34064f43bc57fcb56a54c29079da57ceea37c877bf5d888233d2d45dcaf897d729ef94d8ace2be06efcb785660bc14971f5474440299341ee1690f11f683515b35f30ada4a6944c1d379c74af9dcd1439a780edfa81f1167304467c5e5442031fd6b8aea5533e605f4904cd118bf7572d1526e6c4a18fbebdb268b1c695441deb5568eb417ce16713bba343dde15ba464064bb4a8e8f76eb78aa8cb15a2c568568eadffbfbbc248575a4a80cb58282fa6a0dfa766f542f844c6f282d9f5ff882ef41e65b84f684a2cbf4abe8ada244dba1a65830c1abccabcdd19a99f3d9a722ee10d59426400f39b92c385498f4f4677502683bb6e9e38f3ef1f33f275ae2a24cecf14faf4052a5f560ccc887045c74213cbf118e373c093372ee148b6b94e30bd7fbe1ebfc61d9161982db6eaff4f4eada119599f7bf111537c9d98f81063c3f2d78e447d4a142d1fffd144dc998a1b72387c64458c6ad9f585212e5fdecd3728f2491bdef0de8ae60aaaca1a774ba8062ee5383f818c2223bef3c9fbb39e2754c809e2d914c899a331688eec1ce36968be0d21acaef4be75a3bf5e1f7365dbcdc0c9dc0c9730ea1e9fa79357572ad04a8d2cfdeeac940de6268e24566729d34f2f257af4b7ce48a43d218ffd4fcc3beef82a114e79289a601218e2872dd9c1467849c4f6c386322508ac137e56949eb6e9577d4e418a3033654e1dfb8d0bc196b3fd3220a8e34c02b988bb84ff0e6c2413168d9a018669b602994384e84f16b3f90fcc174a9ed7ea15d091df8f29bae868e27ded0badc967be3706b1c6ae24a903c4913bbec392cc0cbc8344465cd133d6c682b6580c8dc16c7f0c2c277462479f9fb94b0fc2ce36f210dfcacd4e14abea15652e5c1f2ad582e0ca1f769600c04411411c63aa8311b59a0436cefd61e500481dabd7675332c94d03c158e15d052a061ae9de4f5154ef3adf4198b42e503b2ccd6208686c3d927c616a6d788cb938d435c599cf1f6b7b228a87dd557ec583740292da0065ea653ff9e5e45e0b7a2bb289a4f679ee1ec537ebe5be7b416e08a42ef6f2ade5c7ab864eb60db71af24d1282b222c7579fd9a083af417fc075bfea4b2fdf9a8403c4f3646f3d2c7535f6852f7ba49ae0dbdcc0e06fd5f5d5333bc70f971f1b8f45894fef181e65da15232065e30d3d9595e70eb276c0e58814d7f4455d19ebe868731c2e5a9ffe2cc268234c7e23f3ef61d72998e15ef32e410fd4124edaf55b2e40eafcd21f48430d87208aa4d40809d0e89599c48d99b1b905271563a3e2028a1051892e588e94dfe0d32f232c4995c3a781c95954433e1a9603241ac0c2d100a1805e06165aaa36bb70eaeb6b78dd0b8294b88dd8f1a1499c7b088660cf0d2219486664602711de0eb49424b1e46ef3c494b7549b5fb77270708c825a40f3844495d4ad240f6265a969ffeee75c2102ea4825244e547d4ce847a13d88b59229c4347e35bd35b0a22628ce51144f88913ddc94922cd930721b2091760c5e15886be1ddfd8fc7444dc8c16eda51fff288b2ba3fd37554672e953c38c96e4573e38a712fbb903e3d9193f7d89d8ad54c3d2d1556a664b7d49554161d98aa662bb78d71c147732b3e9d74b541ca4d5b7c8b383f2488168f5e3604c51a01e3684ff2257300013f50c88c9b7bdfbe1fd4ca5e2719e12db0b0a9a0798e74ce0a383853ca52ae166c719af930acaa48a7829267ff1f5b6954e6af6a6e7fafd23c9196e916ecc150d88093d1a495ec33b3b369471a0fce99178489e0e6bda2dc3ba9f73ac4ceda0981a92ba7895fe42fb85c0e8ff2dc822d8ee4dfb1766243323e158ddccf4d44c7e4fe3c1fb4429e28d14d6645ef477d5af242cd0e352e10dc9309172b82d4debe3331ae1e384c61b5972766a1c53d903b55085bed136096e573a56b8b349f88f3498d47046c7dffe1847a8aefcd1aa6bccded545 +result: fail +shared_secret: + +# Private key not reduced +private_key: 55fb671b4ec8a295d965768b1ea68a496a77239eca1bb79aabad7b542678f49ebd786579be185f883cac445d621fe531dde9a3729493e1f7e530b5f61a4cc20c4e847e8e5297ba8415954ac13d7543c34dae9b5007254c194e4a01bcdfcc55707e9d6a73ca41a2167d6457db9cd6c083af7fdd6fb7712bfc6d4aa9fb0dc1348c7666b7a181cbdb856e7a9f67bc9825c0e31eeb4cc5b1c4ff43501a56d27cbbe2f7389743ff1bf57edf885f7a56fd811d89e9d96d14b9a891b9d9dd8aa7205545fe3e9598d3ca94ee3eb12e9a3674554c55f3899dcd54bac9c03d58bd0a6c7de7c3ccc98ab53c99f2edbcd0f975d52cdeb22ee3b1144c8f46be96deeb6a89d9afbdee3dede3a274354118b351e95c053d73f4a3c0f8fc5d5067d54038eda2ddcd750e615fbf9d4c15b8562690d96531e59dd3478b805f3ff044cd611c276940d58e42addc3496ff0c08ded17fce0f8cb6e948cfcef439333ba87ecd40328eedd7859855a4493d4462d6bd8bfb8f5c0b0e972c333ee139edde95da33eabbd83ac27dda737a0aca979fb197358d82438fa24c7721773a61b5fcd288e640bbe11b588fe4f7a8ceec41371e5d30f3f5e526d975dc915cab6369c579f234d882bdf276938845ca6c679942767f63ce5fe6cd1cd9d01696cbc83b84b430367cfa742d7a586b8400f4a9b098bd54bff2a51b31b4eea5a215824f268790e6f0755cea398dd1bc9a3605d94360f9b50caf9723e8d88a0871a0b79badc669cf18bb95ebca4e63e0626da71eecbd492757f2e98c27a47fba13c7519399cccfa2122aeae5376594159ac23b856888a34026904a3734141bbe769d4d9e7f7486e644d8dec7eeb4b7697ac925dc9feb4d42158fade07b35879342b724f6c9ffece9ca3081e6fe615661d1168e102779352571d884c1104b760e29bed2bc4f5f0ebef84ffd1fdfa8c0c882798781320e97828792430530443481a253ced84b8b7ac473655f703298519e4ebd59cb3c33bff71a69fa0f754192a6672607a346fa3997b360f0a75b423397b36fdcfcc44c0197c7c7a6443154ac6f3985c1256a0aec9bf73bed8dbcd46c7376b6b4f4b63f4ba04881b0df5d16387c43aa57ecbb9caa055c686333a05fdb0aeecc665982e73997e33e79244f50b6cd47a9e5b656169734576fae1b970c15a9bcabc1742792e2a9bae7cf9b391b6a91136e31abcdc859ca9d3a7a807c36db195c183ead11da6afc3d4704475ce0c3a73c4fbe2727fc8f38f4fff7b9342dfd141ea310444a73dbfe71a9aa6b58fc743e7689235b49f44c7af6a02d5ab3557f34944bce390756719cbfc647db18ab828a6971f88de8252fa9f2fbfc8523605bcff8026797fc27f1aaa4fae8087010a5bd2c2886f0fda29fa99daa8a91b9aec6395544ddfd7586ec99e69fb995074fda2a716d8a86fc2dd5a48d878c17f43e7d8b1cbe5bc2e639cbcf8011e461c35ce7a48ade5e07bed0b6761429b21c04689df8a2ab2f40025380205ee96b0f522ab49c1c7f41081efee3c362ce45ef774c894393ff2783f014c8918b2c8e747bb0cb63ea3029f04a54e786ac3dad4532a518e47a334fd87fcced0ea07d1fee2b69f38d7b57d24a8f4d9db1b7a7546144c9fff2bd9ba3eeeeb3dfb2677d5a3bb24ffb4c16cda223fe51b0fc3b2fb68c9624dc22765e36d471bda76bead7baeaea3e86296403a673b0d6d389a66003da68a04fc7357ec0025364f86a66826b9e03864781073614e9deeb0af0266c42568f3a37258f52cd839e3ed6aa0e71f129e0364edabcc8522e8e4310b488e51bc7af2dc8597cb2f01e645c9b921daf424f3780d6c87a17a9aea0dda5b15c6d9085c6e68da1cee699a634d46595401a47d91248ea5a9731e3f339617dc2e2795690abc0383a71ea4aba69459123aaaceb99691b8fc72aedf8bbd69ec903a60acc9fad24cedc2c391d5dd7de3f4ca46581558cbc0bd4a397a776db07c41eda6c24f436021b4b26abe05d33ae94a55594f7d233ce5cede461c40742bba5d447064d223fde41673f98b57ffbaaf3fe096dfbb4417f0f4ad52fea834f74c75c7d457794c9034364bae681c79ad7f3c3e308ce35ab8704ec566eb786283a9ed8eacb15ef4ca349a581598e26967b88ba5b3e5aebccace3cc74330d74d9e1fed57d1f5aaaa4ba0dc34b0fc991bea47b02a8cae2f81a10043ec8d655124b3ed56505296c5aa2227ce2ac04a0a31ca05575b2e55c01119d6588cfb529aa54e707155bb4f9a63966d9566bb65a95287591f715e6bc0d7fd1691129999552b1771b35a322c5145c7a40d79d6d9c3eadf941112c4f76d678cb0aab59b9a30bbb340e078bc2899951691f9bf84189a87f2af590f881027a489ea1bb89e3a8b65959ad503a5e051c5f398a654c708f9ea51bf75c6bfc25634145076a93aa6e6640e6b47158ecaeb621c606c065972c9f26a34736067161e6bd49fa2871631aee5b518ddab90f692929d5a7a6e76582e53dcd36acecb6a76dd9455358ba95eb8a70d3786c01960b367e15536b456408e4faccaaa139c8e9737ad6b8b0e380bbac446c73b7b388b319dc2047fb7338072a0f225b506253afa722c812419e9c739c90beed97ba8f684111900e7d1762a5c0903c390786e1445b615a1e054efb7b0b1daaab671a63cae7b55c8b6f13f10d55707650ea8d864c7e5217b572643e6c7480411489c9ab18400483a657185990bab58b6a734596a6123dfe5240b2f908fc8c3591490f89875e0ad3b06f6812ea973e6fb0a69886199b3b55b7d26a55501b43609b3d6a3981cab946049c10b5737daccfb2040e014a5f715b4c1f8b0406b3a3204602182450d10b019b388bfe31b5a5a9794b5863bcb34cf6f659b25cc95f0a42fa9305a0d647342845d5b28ff5c1727975bb48c5ad2c96b97ddc3bd4f0b40e9b6fe1138739f1a9ca3b969cf33ccb700fa9fba93ef565a8aa180cc3711974bda14ab85e3817ef4801c0c3b3f68403bc94cc7412ad044a220750b6ca963e3e052f310bb1474623f707157c8a7d67f95989492278ca5707ea6d106431fa5a3b88c39e3e360bc0288925932d44a2523b0980a221519ceaa65353a7483b7de6028744a2869bbc869a58bed2327b3c6a4aa7447a9a09bbbaf322d5914dc9d5a1ef8aac92b920524c6968289d7da06db2561eeea26fb764168c185ec20ccf2b57a89f2887720809e94c377b313cd5ebb7f71037bbf01bf85b675432b891850316f6b938231793aa3aab2972e979c7aa258735858434b6386cf0c5a9232f60a70624b4cbe9f10fc9e3a0d7605bcaa23ab49a222f66127a1a4b9f2bada03c8dcf330e1dd90131852b71cbcfcee91f528377d200433dc898c2118f7b6275f4e0b9a97028e759ae0c77477cfc26a1398cade7671ab89344140f5c3662c736107205a2cea71c3612c4eb063cac777b9d6b61cc0419fcab4908ac161674c6b4c58c53a5065c637d0a4c964e29729667aa949c39ea0797b6882951314354ac28d52c2096049df866bd028b1ac3b47cd2e648eb322134522ab2993db33491326a625e8739672551562b2829ca57ae6518dd4553146281fa57aa373412f22c2d0cd02b6141ba29f31612447deefbaf8f974aea75140db2b85de409db834c283440e377147b2b8204f09da14028f1960fd7c6b29ec1bdab0098ea22669d7123d36a52dcd634a447209bdccea731b47719745597955d3372cc533cc9b59712e770d7cbb63cf114cc02ac9933ab248617b9b284a8763a8856afea63c442ba7407905c6db13dde25a24062b7db428958e2b72117652535c1c24226266bcc7e87a721181ced66cd9dd1c8d86a1c28d0c335b66eaf7422c1bbb3a7dbc7f2a81c7a477a35717a23b486f307c766f1291be3afe8408026352d28a826a7e57819390f3341bfb8e258640213bb06b8aed87eb78b216971060b590f16d05d83801404ebc63b7304a0880062b4c1e235655b43c2b6062c28d4064a1a861a9844544776e8eaadc0ca66b2cbbb691460382b586e77856b8085a1d6795f82be8185c62ed79b2bb8a3ebf57150145892f99a27ec8d1701265cd16b5f5293955400a44192b0e47f399a0bbb9027f9d3aa1f5407465b8b28e2a87ab881be300fb72047f61a53b1282c13b65ec31045b1e0b779580017e1776e46a5018598799296f49c1447370af1227a7c000e327b40ed2965ebfc7a555803d4d34176e14bd6f9905c5c4e253062c1110dce0c22e74779f07846a6806eaf340bec965dcbcb1a2c40a5e6428d2bfb50ceab3a64cba6aed667edac0cbf03ccd8d8a56d73c70b122628f90e4c760ea21c485a0536f6f1632f900e1cb13208f442501c6cfd05027f5fae41abece025084a5e4598a766114b13b17dd16a4c99f255a964f69c975bc276b67b828d04997c8caaf20600da330ec642633f9789858f7350a7a2354f7e5cefa6f4a4e9a1c411eb9364506e9e1204a8acb3cb77fbd2c4ed +ciphertext: 3a8bca083a1f082d72c5c05b6d3ec147cd1646564b8aa4915a4c5adee11141d3ec19deba2de14e8df899b62d842619a1e89b9bdbce4f556331143aa99fd8b244e439ece01179bb5dcc22d9b7296dbfa90225c218b7e37873a8df58578667ab8795e20e508b268f0075596d1586c8cf5ae079e6844c6bb0ba6e4335638894dbcb1a657cc96e432f04679709c508a05a6e4136cd79a1964385dc8effd835d7ebc71bc3f2e0d6ce09fbd2b9284c9d9126639e86d37139c974b7679b20b06a65a9f45b29c9d4cb88b42b8d0c3800b3589e5e3f6ecc43adea2a56d38ae6d4c5bb4398bfb3b67dc818c37baec8a888e57dfdeeb6675a9be7c99942337e3ef419e5beba7043689fc2e41d422faecef51107a624488ab2ea49eaf7b95aa1a526cea835fe8b6fffd2ce1c8eefc6297dd5ff418f925dae3a5dcbcf2fe937a97f9c07bcafacae582aac5fc3a1cbe041de2c8acb8f3d87ae31c678bdbc6e9d7473a0983d45f5096d45c803c0bea4686879c7b7fce5219748128b8af367b44a7d6aa7a9b7d1c3bbd6d677118e35f5cf69a9440253e494473cb86fbc1944874e8b358d8b1a92cf45fd0ca86cdbfbdcd4991915ab0b4985f96ee49e0771a6683cf301982f9ac9d8131b7d36ff527c5df10d2afce8bcde6a469db425d6c10dd08ffdf12e179a1d58a5e8ebec1176a70e614f06db5d1aaa93dce14257736b0d92689a1c7ed2c5614246c7a37db2013ecfa6dc94e8c43ffb382333d16c79d07100fd92bf0c7fd63ddaede55b4bff6f3130b5132ab6aecd2a8e25201496cfd7049eb3cf4b8fbcb4039666d5f1d7847e8e73bd5399567aee06035e4836a437fdc515a05101e0ac7caf2651a2ba2945f9128f5e979d05272701658d12dcd6d6351b235952237c541f0af1c35abffdb0b67d209375f4b0cd58f777ad29c42475c270514d4964bf2405b4a180b0ab400de1187bd5fd0b778273f3e87b5f43e72f3a916191446380133adfbdbc2a2befc11c787f8527f46f14880a9def0ac05583cd2fe0b44a67a1934698f3e10e63cff7e5b6ef1b2e380de905a29d237b1a5788a46fca785193f45f079b0f2288b860a606d332356fc758f6df5ff6b8f4e538bac5f04cf93b00834c9c96598994387ac9bac71b739a292173b974e1d96875985f3a74bd1fb65a60fe5f8d7c5a087f5e6b39c479ccc072d64b39c5d1b18cc909022edd5ad5407a588522fe019b5be8cb7e56071c5a4a510dde41a35916600714ba8a69487181da0b4af43f36ee3cd5a682cfef1b2872ffdeca351d3e126962737c8d8ea2e86a1ef248d5b95c39a58bf5d1b76d202010ae0a52965bf40e08120b7193de091996e0e1c51bbb6a66e4cb3cf6141b44afd07ebab50102dd90bda6f21674cb3a86069b1a3452c044279dab24c94fddc7e8a4e98718310bae45ed518d401e3e1b3aa76152103ef76329c949a0d51442f9214b1c09f8cc4180d877681f1ec8e7a0c6bc2ee9bd3365708937399bfc146482d0b78b445b74ed602cef450cf90f20e9890d4aa801cf451bbbe19211b3d8446ca5a1787d4e1c693eba82c51f62d85771d246cb1a4179084f6131aaa733016ee58bf9e0c71cdb00a8620dad38edd3be398ce030486cc504449b7ccc7c7ac70bd0eb60fa76d1ff7e4ec85902a70f10b3db794f432c95bc67cee8fb083d538c72c265e5c7eba29a14e79dee53a821de768d864fcce7ba524ceb3e85f66ae20fe7ac3e648b46b1c9cf5a1b1cb60dd9ec67eb9bc4e4ba8f30e08859a41240a0ffa0daa3ab1418f153afd8aed9b17f5a8eaee948b75b882d83719421ae259935a464c77189c808766a809522fff78fd92caed13670374e5933ad1a61b59de2b0ba82c6bb33b165ab6564cdb964ace0f5f8e3b4a42b5a463645581b3993bbb95847b2f92ebd01af96de01cf007cb0341d943f74af023f133fbe5c95eb885e9eaf06c71b468beff1de1c89a703b88d128308db5c9b717a190373d68774bb6351a108a3b2f29c2d168cfc11d62efa411efbd1ac8a93d85abc683b443f21a19b9bc3a1ccd94447e926e969503b239f73e5904635674e60dec54358e61b39780c00ab5341c6deaec0d21f4a785986298b5828951905a44d05affa48dc11d928dfcaf7364b8075e52127b5f89406b4e138537878fb81c8b04486e0f6f86d350d796e94263709390ac0566a9b5f666a7b4e0222ecfa3ef4afb50e7d420987 +result: fail +shared_secret: + +# Private key not reduced +private_key: 0054c46a1943af5edf1d4b32833f72697e75a7fc81c23d7f51e384fd06e78983525c53df0ba3472233d658cfce28f47fe354791c6f4ca656ff5634be583c822a65e80dd8a7f01bf1fc2b58d2ae746699ccd91acdde75f80048302a04e51a66d0067544900db57ebe9788678872abcc807f7af4f8e6f7aeb8ba7ab408bbd3a29af8c19d6d47b98b702b513e3d6212e96be12647c95868090f5b74e37a593a47e3cddf6e5d5e38586885baa7fe6f57d30c3ba49df7f6de49a4d53ab60e938677942395ef85cf34931c341b2e6f84f5d3fc4f9183e8544018b78bd9dc5deaf923b68ed2f47014683b3bf5df17cc7ccb36b315bd528f8c7cbdae9d9373d0970772afa6fade7c7efc36d2a9175fe1cee6298df502a9a0144adc7004ae1d0afbefc3986c74348485a846a8e12135dd07b788194dfc42dfd292143a9b5c6e2206eee4adf86e0c9c036b945fa5495a69fac4bfaaabacb11824614bbe5114dccf02dcaefa3f361fad621f96db1d399a221531413fd497bc723b0d791efe5b6aacbcbfd5b16ee74dabfd59e4b85e30e4bae4c53e2a1334674e345aed857fc8c137ed72f1b75be9a3b806335f5603a46c734ee0ed994408b35554fdb7967682859d1a5b36f7ae35f62ddd25a7e5e05cd0236b38550af6551334447e98e2c3e7c1f54208aeb504475368e3f8b9d561ba33c9ac85f31d1f7ec8c8b6807aa788be5c1bf756c923aee186a680acc4f1d6b3a81ee6016bcc3fb9a4d95b9f3596ad52895de27abbe0e4f7528d4ec3fe818f5361eb68a9b008e98e9647ed6f7d185ea8a5f37e6ed4a42e2540dca7f72bb380195b75df18aa870973907fd7ba65affd669e3d23ae7cfeb7569aa94115618589f1e058d00a44819466ae28c631cdd68416e596abd936575fe13b78901b1986f7b43f2413d0fd487689e63774ce555d1b4ece69304399d74bcc99f1c88bc3068df61880d32c43b73f6cfd1e836d94aac626cdbdc6addffd7086eccbf6f4485034fa5d25f19fa5598d55d9727e598cf6803e8be111ad4265544fffa6e2416446bd6fcb3fe6718c2e52292552bd05be6b3d87421e538a07ec60ed8367f8a646c9f5e7e5fcb443eddaf4de674dfdb02c87438ceca13e76edec873c883707fadedd4ea45c386a588fbeef2cf353a97ee6ae98a6e572a467aac63aacc528777d847ac835886a15415286b4e1bdc9089c6473dddb389353f0c6441d84bbd12bba40a3ebd2bc84280e77c5ebe3dc8afc913c4718a63d957dcf63aa35c705a37ceadbedcdc025eef576adf72d6a302f275596de8a679573f2caf83a26f114f34ba9cd6d21435474697ef40ea0d805e0ac53f4d32448940792a3ce74948cab5f47e0a13dcd282bc97af6e7bc67823bd33efe3faf996eae0b4a7d04b4b207d9cdd7244f2375e4257dfd8fceccfd77a7b53e7bf35d4a06646aa29f80a22b82a51e57cefb3d3a08431d889e7afcce2c87ebc5d6d4f723e0983433cd59bd43a4adc2fc87771d9beb69d39ab7de8c1b8c7dc5bfed08c4789337efec6692db5cada88f0e3998e8c3de9a8897dd85cfd15ec62bd9a9e12b47ab5de5dd15661678fe1c299357d57a2fcbf2c2139cb66f971c6360a7c6d7d8ffd01fef6baf0b5957f73f8d94acbf8b3c56a3b72c2ed54febcf21c95d9ef8fb70739847fd6eb9966e280a8b0083e3d3084cf984cc1f7b34d7243627eb70e558b096644feeaba7864ea06abbaf2cd331d8749248dff20f8ffdeafcc5a77ad998d7bd62d5d623fce83e4544f647943655cb543d381b06d9536c817563e9864f96e2f3b52209ba9d06da3536541fb654d027dc5a1ef28a4c8f969e4c1a2c87cf76a3cbf3c6a9fac15726d01a2b7e0e0a8c00f984b08358e2adf238e36046ab8da9ea355613e3c486f86e1abf559b407c0fd90684b11bf44573f642002d364c45e83a9be07c3952afb4dcd69af2b666af575344be88a26aee41ff27ea6169a29b9fa1b63cc1ddcc642808b6f22b65a8345adb9da992e9ea9114480eff87359b9b70a8e4e425c1a397ad0714948ec339b97af29e5ac0fa985df2ae9ed154dd1fc78c1fa77920abadc31c5256d5f314cc970c7fb0a6d84fbfbeb1f08657a636be530a5a8129a8f8137c6ffb5e5f549197ecffe15f59841b681a6393a6a77820dd3fcf69fec3b458d40f7fad4330bdc85f4699cccd373de5d7266e5530a73a42d10c9b327a57715539eb99030873689f47bf6871a00c6caa06e4b04a832c865b69293303cf838ac186b453d77088895db36163b1074a8e045911fa92db578cad284642bcbb44f844c6663f3f4c98cc8acfa1a96b6df57f5be10fc76477d306245670b2c796672331076f74480c2627a3a44421a01229509752a536e95ba97e85aebb920b4b1b1bc55bcb95fc76ed43b9805236cdb62861fba353f08409c91126661580123509c05208c8604389b2dd3b0f8fc94f432b41632c4ae1ca0bdac54ceabbcb743362725b839dc18add4b7795a025261139539641aa43a9c185621d13c33c579189244c884c047bab4187577c97639ca4abc631eba5e9b141e11b6aa8d562449c3ccd8757503a7ab358a24d2b36f2e1768fb24727801123354b6dc661f640883e0613c8886121b89336202eddc464204b1dc16b9fcd3906bb9a6cf8d6a176a43aa1b13200d67ad0e21f2f73186164a6fab968ea0427c82501c59c49488846489710d7976a5c812f78b5b7df2aaa6437054b0a03180c4a886b7d653149e8497b18b18e98e72f9815be90d252a4583f2de88c0d7bb10cea4d65ac1f59683db4ca4969a9b57ba65e06908f7e9267adc8c87e8b8d8d5651b234bc9ee1c65fe42a51368a041253e982100c25955bc39b70b36c67484f8df88c2066cd2a5339c471b60a1b81acc5922e274cea4a071eb71e788241ad1b7c41db1e972212e27c770e6720a7e67de941a1ca952bdbbc591ef78019c67dd184259bc873f045607d1440bee46f199a7d2274b4e40062c064368bf5c6d50046a198c89e1372950b7710b3b6376caa9bc32882a6b0aa9b7fae86cccad0574cd8b417047d30d41bfba0119b909142363d307a006265a3961c9c604a7b65384a5deb1c61f25f66fb3b7640b5c3e22b8ed488f08201a10c3b5a42b043965d4fba6f31b90c5a8a1d8b29a01d500be93225ab6acf77960afd2824f2283ce86288cb1a9b98c11b03dbbb0e0854731b22464331f6dc70e7e1771471236b5b26ce131649e77d46e7946b85593b2989bab4ce5d09ab8d745a64d53401bc0ca4855e54b20ca4811ae5d9192de398d9d65dd3a327499cc0ccaa9f9b2b547c5b53722b50b21c7bd2c3c7f67a15be8371e9d4583faabf2467a4d5365cf7d92b8de8a55de200b61185b89c83bdf817adcb67fc775a5bb19f1aa453b491cf1bfa8d51d0cc499331de7730877a2db14778052cba5d759e21a8cea550724f52bf25c2a31d7b117a4377f7a461ff92882e11a4a8c137ee5a4b7aa67f712838737a96faea898141a1b5165761401adbb650bbea1698267d324a3cb1d9933be8bc95d55aadc4a814f201ebf724fa024763563e2656b028053cbd16b32c20457349702702c4b453a277b318551c8b732378e3d7bc31a10b5ed975ab032fbff647c6340c2d5c91f68c1addb447fff01dfd4c0c9d925111948f001880b36588df16cd1b9bbe85973ce513662267214660340262273fb45f97f65da4e615dca4a6aa06c5e9ba0ff727775c84608611827c98c8b7717daa60004d2212dc28b4392a6e0333a77cb9400978b60a00a766f6264486c60af452fe92452156961f2467d013072f1c4cfbe08ea7885a74d0649517178412a1ac63261981adb7708dedc89b64e67dc2a8b25d98cb1ad74289372e48fabe360495b4a7472f3c8b7f877280ebcc6019648ef960ca23a1c49b684f947460e96f0e941408fa026c127900d84665768db52a8ec05696725b3dd82498226030b7189c9ae1c612e9a2c65c86c29426caf686d5b00ea0557466a1b04f8485a457bb83dc68c4b1cb01e7831e476453f084434151fc0c9ea3b7081ee00b4665048bcb8fab778eadf90c25f54d8f452381e252b2382d04028378e7cc7b3973cfb776249857cc611af8f91db8d5b9f5d90212b27d5fc9a794d53e3e002089a05a421a540b36aac5c803c8f5cd71012f176ca57a7a439db90bdc71ac65f0470d54188927bf3d2640e5a3a45d9021f876562fa7c6c2b37be9261393861c5f0336a47ac373e6874ec53fc9f90d856807675858ba1291c7134c4b8432f9782cf6855ae9d49226055d9c4b2f23c0238f20b516d6600fa72d8a5c2d06e1613dbb7fcdf9817cc299ef2614b6085517cca4006876de51659c317c7c9d15b2dfa3cfd29db64b6dee0f6e53b6bcee0ac31c086db16d2a63040993f86bda57d8006a152c436e383ae407c7d9bd7a715a2f9efa507422f072d9b5a99f9c7a0a011e4dc10f6b600d611f40bba75071e7bee61d23fd5eda +ciphertext: cef4be98dc83da0b9570bccb0cd85d237536d29da6544e77e0ea894fb5a777f7966ce27f9baa0c2d13b2559906edd041641ef91758e5e33c09c0aa3657892b63b7450243e4c07d4ed5bead3239f6c3ed3c59fe3d302b1fa9360851a7f6057f3275899d48db6b713a9b221fea8f1830b45c2fdf9f08cc8a5bb390c9b31497bd35e6c659739eece6306ecd8d77610b2ebd9258f68de04671fcfb85199eb7c5593369fff6828c0412b666e9b969adbbb494702001ac8de879533cc2727260b7664edda4f06fecd7f775b9d4dfded03c9c3c309f16f91011d6240bf0f81eda6850f88e96ca462bc0c836e08408159f911f41b47a83cd8271bcabaf5111eaf3cbd36b5f7c6e61293fc1cb5a021f1438488f220b0bfd439c0b53d814a085ab07b8a1a751a9880dae73b97c5b45091ff63d1504298c7a0ca59f394f1d7a2064163cf8b4d59b432fee9c73492daadc5a3a9a6b132686b75db0805eb7745adbaf38d12637693a85cdc77fab26a48f39837d84a6be8734d28ebb50ad913f5ccd177ba3b632a0122345c1601c4582a0718254be614c8b619660a92ed1caf7f9b79fa0f0b2f1eea8c06962fa85d2d3699ba1e2cbeecaae9921754deac38225c9bfb23ddd4dba78a327638e1ca00697a4b93786f01b979c169a3509104fcb58ca1d7941f803263c2ae446b75081ac4df6c154b811ac394f87cecb719b6180772f9253e32f82dbe7ba2e5c4f1c8a8c5ac37075c3a129bf96cde8dc9834153ee49d17414826f4a4904b19f97f9f592ea2bdbebe51d72e112d600b795b788b1f742188c38a72d3e0d7e8f1a80bac86c56a8a6101bc3653fc22959580e543b0cd9eca89e077d9b1331e3d5aa096bdc2921fc5bba044e5f96c60d4088b54e5904ef842d8d160980b3bd11309ede2bce224cda218bb65a64bf5ec0f1fc6d4a5ebf01a01483ec968dddb1c1f56ac906853c69f90f9a5ed66bd13c13c0d5c8e74e39f6a3b7808a67d01b9edba03b391c8912ced938ebe7bc9c97f82a3efed9b5dd12dd83f92bb7a20e5f3d15b0341ac07fa3234b33dabfeb62bd399fc5921aee054dac42883990d7a6fb7e470ca11933ad82491983c119b86c35868276bf804ff5b39b1af66467a3f5ee835078ba96f2666acc015d9facb8153b3fea916985fa36b050bd3eb5f2b903768c390bbb917a85d14216c98f9a050d057dc4dccaf665b94a1d3a899474fff52cce5376b163c19c07cfd8046787f2714a14343b18b5bdb49c06e76d945418525cb46520a29d7c62421b81cb57188b4ce22e2402380e494a03744d2c6a4398e358efcf0ff62ac6d9479909be5e41f2a6e649835858168221f6ed1a857e3deb195a6e68917d8eb3e945f294ac6555facc46c558ef6260820575c3de0d896f53b9e864f76eea4cf2ad6243d9e4369ef7f22aecb1b349c342e428548f29e58e0096da1579c0f2d200fbfd205c4daa7d0420bd3a4b0dc7d5e6c9cae7ba37a7065705a213d4bb070e291158fa6a3b67bab4574a712e1aa9806a315b1b7c559385181ac322855d30c3c1aeac5b34be0f6b6a0a5d9ba07c02da1ed4eb279ca6ecbfe015869ce6faa62d32d32ffb190d9b3cf96c7ede8423bf33f3b124b2f9a2fc8990030fd1c5a3334d3feeb134c2b8b65b5f515f1d668be68753d5b980e4d37b20d14533c98974529bddd2198a1856f0c7555c1624942147946ea61dd511537a78b401970e493c9927a14f2f5dc26b397f3e0b28340693d95378c67af4fd4f04cc1fde17f01ac79a15c3da1bcd842e5f610cdc807970357c56e3d6eb66556054dcd8844323dcefa4281ede5e0657977ad4f277e3b72a326f7d9c448137e3b7c6bfb841116584f85b6b8970cc911829ab38719a0418490690344ae98e62d114965d8a9d154bc0c6b49ca0826b4909dd9c3c56348e34581b93570c7533e0dde9c0c5c5c28f4497c2d399151438b241af777b0a04e9317c48971e8e2a22c83e25b9ff9a170010b6487170ffa8d03e7cd1115caccce2fd41ccf6f44c1b25fb4ee4e105aa4e9c3418e6d998f8f738df1ae86372b0a383cd63c24971df937945646d4207a7b6042df82653450095d62154e115d13bf7992aec6e52cc20a9f430a0356436531ff985761467b8dbca0dbd15ed5760ef24c37d74c90a998ee3ae7c748d703411519b7004f38fcc48ad35cbe2f8218249c845d3a04a3b4f345421003200718c59a5c2a +result: fail +shared_secret: + +# Private key not reduced +private_key: c5aa9d405bcc9a06e17a5f79ef34d3c609f48943f593ddadf1b3a5172c795b483e207ddf2c79a7a683574076ae8a4eb690de7793fcaa9cc6dd39373da09b82776f835fbff7ab05845853979a2de54dca8ba45ce51127f123ea658c5e9a53695e1315accd3c5856ed3c1f4da50f1d666caf53ff23b1377830ca1a485f656b2476fdd3eaad239553f3b5db2944f25b2647658aa1a228f8a413944a63e35ff951695da2b0a66b8e6dfa184ffca87b3c09866059a4fbd8eb4f44d646e5b8da38687dff595e93cff50c2331e0df495964bc04afca5066cea77ea5cb0ba079788366376f8078804e98c9493a9557dd44e8efe8ddb83597f9bb333692678eef0ed451468fb25f04aaf2edf47c66f4eb5555d1bd8c14e3d7b7084e42fee85465c193bbd4d4295790e4451ecf5491796d4b3c47b115ed021a91440b869a75848e9894c8d393c534c4b2bce318a5cb482b53f9ba76203331e87569804bdfc2e96072f777f62bd08a4e642fdc76e9744faf9c6f06c381f5d54492eb6ccde84f0a2de501d6ddddb8d788c4619cd48defd9a9ca6576dc55e101d37d422350b4357c49b9dc291aa393263cfcf887c1363769d4dc7663d877dc9cef88bc13f740a97efab43599933b7a3a7495a048d0b9dc66be17dd8096976c85962f3c75bae4dc71457e5ef9f9386c7f65869f3e4cd6761fb2267ee2ffe557881b873be3e3a12e851c68e25acfcc1f46e7b38cacbf4a5bf2346624ffb316e4c82cfc9c4befc0884f709b0df4b91ccdfa0b82a0bd47661c8dfab33bc9ba334328a8f234e9f2f8768039c0998d6938cd5cedf34a8d65930b07ad66cca3cecafde45694cb534f7ea881c3afc8df9c9f52163febfdcf199cb81f2cd5d1ec3775dfd3962cfd14d3d7bcf4716f69b837b7c8948437678ddcffa87a5b6b655fb3d4d9bfa8ab3f637af967814b7915f5f8401f63ed03469768783fb757f4b8385f7995548c75b99cf4fed4b2a4bf872a9f4cce6e8a21f9385c5b57775fe50534c31a15a854179e1a0398df1cfc69a76816979f0844d00378bb9f4ac43cdd98ad6944b2dbd28924b201b6cacdd87f25a67e676c738a3eacb4d4f594a4ae4354cb880d8cb2f486de5da16f1ff8db6b547e48780f5f3b894ecfe8b636670ca397a9d550c540e267f349947d15cc46e186cc31a7d45d77b8dc85943c0abdcefe629f4a74092a65f579b3405f33ed47916f1475aa284675a7fc771ec1f35c41cbe6a8f2fe8f3bbca2f7d9380e2c9aca1f6ac3287a09f8da041531d83b39591a961833ff990862d125a29b85a1df3ebc448dc0c4f56e8a93a7a43fa86e1e4faa16e8a09eb76ce79cacc88bbb236059acde91adf26d8fa57c6ce403745703f6b55cb9bfee17c4dd48fc17da5585c8f3faad37bae4e01f07a301e96954fdfa32b3e327bd4e02b5f928293af67a6fb115444f4a4b58fae7af7e6d628d6094b3d1bee3d15443abb0389afda8e9671ecb1e1cf1ca5e517717835e7868c4bb8c958c630b0c78032367b5eb30101ae5ad9949e815ec9bab638e9cde271cab8a3a4399853246a7f4979879dd46c40426cb4aaf9f987c9beec9fc1a393d623f921c0e9791d7767296e7598bdf2738916c99a9d889619bdbaff79d50e7bdc90603d58b98e1a8ead4aac7ea1ea85e2b07ab022cd89dfa84890daba0d8838dd8af43e8fabb6c664e363ba31bde394fe4801cc6929ebbd89e3cceca3a45c5fb9688957843bbf97ee2c70a64b1efa1c3c89ac5d8818496e6ca3838c3647ae686568883550ea3e90eba3b1a18d80b463740dd5f8ed8ea535650c538e843279074cd802cd33a7caca35547c0750f56f8b7ccb85c790aec85525759c1cffb16df68c9755bf12dbf6d9e3074c5a4118bb45c0f5372dbaed0f9632acf45052c8e831c59671d5ed7dd98a4e4527768cc3cdb47eb343788c9b5ad2b4ef16bf4d8193b5e9b6611e3bcfce34886abd7bba361035b54494f57d1d65b3e2ef2703ec29a6d7674c783b81aaefb6e61667ee5be87e9926e5a7e5a7b4becc21dfcb48738cbacd764d1b8b8b918dd691ecafa9f7a4bc68dac4e56295ffb0563dba4a5e01a9b336a896457837d6694bd578f90e2259dcbd3d2ed2baa9639f536b9a0154771b0c791b7ec8c4faf48917fe60f8691cad483b12dafbb076e0ee7c54188b32bf6a6fce45eb9d6a03f11858433994e304b2d379c43d4670be6c9d65a61e50c34ed26c67e716933cc5d9ea22d14f86e5cc54967ccc82e3506efb8cdf40c31f313135b597b3aa72fe83b01ec88a97e32464733107294270f82216e11688df6cefc2a9332243eb75059fcecad20a681aaa17402fb36c6e091728ab92efa891d141c251895f4c79fe2db4b2253114be24d22a38b9d14532ff80e384778c8b99a4303506d08303bab91d6e05c68a0c0affb5dea7344ef5ab21a559cdfbc3be395834b4b8d8d9c4af6a9ca37a34fbf05669f99af8bdb3237c98f98802ad76a26eb353c6612674e8b4f93a190f293c80da025da00aec20265cba37b0df43d78982e6ff49a9f464e7ff57680e7455f816f815c733bec25e4227ca3257336005d0559b647585379542eeaa8282d8a90b7a885b0360c4c9428951820d189b873e246e4d793fa94c0211630f54510f7f06d116acfa35c856f87913bf61cbdeb0554589dae65a2e25341e4b93916aa4b738714526653e798c11f24563b2200319c60343869579b74f2ba9ddb03c6f3479a0ef3a5e5f80183d69034968e25892c28c272dc501466621bc091c0fcfa09a2b56c9f8cca6cda208a523ea6a40a4907c1f390780d4a04624466206594ccdb1b19d2b9cc407bd172428316692e09229fc963710165970471e1b554f322c1548a118f84169dd9731bc8c49d1b0130287024c391ca027065591fd9755ffc2a68d36b7dcdac3a54e0ce67e432e35695a3987b1d4a1e5ea32934c1cbefac253da2ba9714ab6a4a46a07950b6477c303067e0e673fc6cc800a26fcfb59a01e397f944335eec26002889b08a26338947dcca758eac669929bb4c608f9861812e06aa61f5b8b56299efe95109d57c42c066ead511bd868c2b107522043da8356f617c26f7082b078234b435c478d48a53d5a369f7907ce2be8370c0ba7347707b7ffdb25e6bab2fa85b5922e0bba7269fb7a9799a158f9806bc3589268d8514134aab1dc83d415a235ef49586133de1ba59b8fa1ef5493cf9dacbeee04f4b9a94b3daae423575682311bc70c49e65090a87137cb327419a2f2d5481d6b10044c6a551eb711bfa828a3cbf22e026d2345dca2415b6d9b03e9479faf589ea02a12d1c03939935e8b225d7c18534a2cef060456bb58145337e81f7346e057bbb98a8c0a312f784351dcb11a1fca7984a2443b409ba903c3024b8da9a8b6aabca90b74a34b532bf01c7c1c1c7ce05bf08c5c65164a01f64c86797317dc03b2d69c263390f9e411df4f4508d7b03c7b473a7e195e8338cae5b89b85465779029c0ac711653b1c7a24bb3b9bff0c612887c12a39c2f5bb2920313cf3522396eb79065bb1e854a8956f7ac2143abb4136b0682bd01275506a765175c4b7648a0dbb875e2864d52aab697533512164be2659c57151c4af898d689a8619726406110faa69f61320e75d3a05cc27febf609e52026c10c01c30118ee3693a7293f4f7cc4d9f84ec37c5f38890a6a58afce1855d4d0ce1f0a577790423115c59228b96bd62d68d90f4bfac9f17a7597a492e5711b65d8626e568f0150a458201c6205a81fe74a591b547be842765723b57503c3b352478b304c39b22b147bf6b5bc489c2dccd44c9f206b7cf58fb3faa3c8891524faaa88479b0c4051deb63eab53822f84935566ab7978c1b9e5cc043767c109bb4663960a534a750cae177aa33315584138138d52648aaa5cefb09f5cd58d008d4c69a1c85a242dd63a997385b529a288758c427ba15b05642c230c8a0180938606c6e1465166f128a35ca3855657ac1b3677a0a15d094ec68caaf90cc1958ba0dbc22169f3853f3b7d56f4bde7bb2c1c71c8c4c95299d95873f89a17a4583bb9198e0279a45691a3107ba1294726a385ed95163f0bc3c609c01ee201c5900eb763518f212f14723314715e7bc84b75a611c481cdf858350de0495d1c020228b004624900c300cd018166fb4dd217cda3c792da49a87a3bcac52542f3b3243f689ce69c1946a134a97061c83134ac52c92d97a458b7b38dfb7f42476b6c5c272c71065e5159121484d4a541311c97fca3488d13b1de64610483cb3a9551cf4a3317d0c76766c777e526595539ad17bb6c184aff73b6c4eaccd5a14ed1b1b836975deeeb8909458146938505dba5dad77c1a3acdab128b36dc1e94a121c545e3515ed56687f8911eb5e1724016ac096bf081a60fd2726d6b275f550c50021d42608c49c93385828573f89f5a4d0a8a41c4f666854e9b13673071ceb2fd61def9a850c211e7c50071b1ddad +ciphertext: 3a385d4faa2e13cc995be625819127959a2cdbf5030edfa42c129bf7efa22ecf8b2c50d0b2e6e7c3bbec34b609ddea036ede43e34ffc35a98661a78c3f29d07aaed7df7d8a04e53f2484d1c63b14644e134704dfd643e9f87a1a60e0a95591a6897f38924ae27812d9ea3baa5926a657dff1a5f2202e781270f8d37fa747c9b2f71767f265a86b3e9816d0545cff49ea6b0aa9297921637dd928ae528c90124b0d5786d6b0e77b1bb6f49fd8e0799b98bcdf6d39efed155c8b29ecc32547327ef733d644ae279b4ceda0ed406fa5a55f9cae0f5c97dc0bb12b112a4d2b4b24cf7d78ee1a2aee6aaf10c4c311278bf521b3431d9177be5c6bb414074870c56adb807331b640dcbf15d1f0e28beb419da866eee0581f25aa8567fc28dc7d8477cdff4fe27561519df585073a47e544708d80735e086c6f9cfce4531a5123d1b8071f34168349e4d35f7cbd235b92e9ee34bcf0e1f056dae77af055975f97f9a5a8880cdca6b1eb79407187f6954ad5c06fd5cad5ee2a5e4de17ae0d9a58a614a3dae0ba03bcf8990e47b548d94023a436d3066c34527af538aa01f62e8581c8f824b9c25e495f565fbaa7c11823f2f6b25b672a742626ec8f044814fec20afd555156ff2c16f1205cc4c5f0076db3f8f6a0b4c814371e96311c43c2e6fc3aa811d5bae3898d7497199c8ec0060546cd6facfb27138da4acad7129917d4affb94456c6e4842725b78b410b6b56a53b27f54792dcbbb9f32d7607e071f09e105fcdb8861bf5e452810f2917c73fddfcc8776cee79fd7a8711af303bd892d00d9b757a252c3c53dac6fc7223f6d480a277c38d6d836542761912a1181e9043ce70025ec14c79d01ca72f93d12a19a50a8021033ede24a361e3e152f97e9313fc3812a0787d61705365dfb3c115eff71154d1145bfbbf1185558aecba14e669b9a354d2fc9302904b13a69d1068465b3f969338bb7e5f9f819959eb1e779f04dca99f7a92cebbc668c5e8cc416d077ff12f4524e959cad611a8c175e4e9757a9ef9c42886c6851bd684e6bdf4e94d82e7b3c909b108174b8d0b1042a41028ca149caa29763ec56f2964fb3cf6bc4d8e3563a4ad320aab53c80aa41307e9942b45ec8dc17758750bc60d413806f65cf5a5ae12ba8f839eb8d4768c1fd86e64f1f11c5160b0cdc3ebebd8a4dfd19b8bf4f0325c2d23970fd25f1b6829d648a86bd035649a2b2084f26cc08506a7fe12f57628524d01d84be8b73f7bf6c8d030a617bad843866a430060b325b0cc5092fd6e98e5df5bffabda29bebd91c4bf1535275652cd7a7394ddfd0fe3ad8053a3db3dc4e820a77dcd81e71a7081d21563894234cb2f8759e1b239350bb9b2eddfafa555571b642780c8671587b86b64185ca9c3107e3beec412ed6029ab679903e356d449e4e8832b651318b7e6367462c0297a31159e9d1c0d2278280bb92a65ff6c946f6991dc73cf60fea144c6fa1026708ad9477831a2766db8bc80b1607bbd4193d7901e1a824785bc435fd8915d2d55c4397c2e0b6a9bab6f9665b27253e492b44fb96f604c16b3ef21da9d9c33c80e1b8e2fc11c53c37d7f465c44de890fb65a7194b8d1f348f3fa35a0df294ec9fe1639ef96c33633ebebb44c5e92b27d199d9a0a339ca893e3073b48e92813db2c7e572e0f5f52c1b5971d4ceae3a81cd420e2750e58b16f7b0914c2ee61cb239e1af94820a9a96c794170fd1397e04093792241d81f3df0827b8369277a1a139d723c5529bebcfd40a9d168dbbe9613fe08b28a8e98c317a6bb1392aa39e0203e1f7de6ef6181f96ec520b518375a362344b9e08a43c374cd2638e52a0c1dda322dc46b3bc9c1120d18793f96f0e911102312f6e2bf0b56cc3c6ab6aaa8c3bf7f61be3b1f9e410e540de3b0084f35ef7f8ce7426ed3713687bfe53172e7e7e80a409774fa1578bb6cdfe9499acdf29e0af32117bbaa40f7134d25c23bfa322b0279e1ec6632730d9768f27da21ff481f777a633a042c223505c263bbe5787388ae3cbd95ce29ea5ca08181383fcf77aa8ff293039670cca4a64afb79c786cd122dbdf960cd3b81b862a7473d72342b8f8d8c46d6b604245d48805640dcb423a417e619ec3ee38f4bc557a4c700f4e5df3a685ede647c90427724265e2473fde973b3cd3c0a2f79659ab360f3a051050ded822bd8ed4edc218a893cdbe10572745a93a6 +result: fail +shared_secret: + +# Private key not reduced +private_key: 24ffa309696a69c78a537fb1319ad266a3f1e556ede8166ebdcda85efd6f3088fc29dbb0ffafeb9c7c54eba9771d7b52887b55860f34deabf96d9f5420567fd327842bff6d0ffecc1ec393507c540f37e84f29734075eec6bde51cf385ba7a8b82156cfbcfe4196333397d8212364997ba39755864b368c333397bf04f609f5bd9c69ad96f086ab663da3816c35e6e70b5bf8479e39f3a5c62204e98f8b8ba5cab50194bc8491af27c473854f9ab021851eb1a405dbf36f8937723d74f0963a67dd465fb27f489c594d09e517c4cddc20c6bec78ca1f5f373a57805d3da3b319ac204995847cdbf1286cddb73f7785f2dde85b44ed78c74634408c5e14777f74f9696e2cd703d9a222fd459204f28988ad5dddb43464ebe033cd3a28b03adffc77ab9fc1e477e6ccf23703610d4d76ad3b583ca4d2cddf6841a55074ecf7ba3981a965f578644895f8f79d0fc39cc8c22eadb11f16ccfb3750cdf76c333ac9989af3f1bb330317e8279582fdb578b385e2ea084348bb52fbd63c365951da4f84694ed8223ed106ed600b67f3416b62a72c92c8af6642e7c9c66fbe22bc9b5c8fa16b1dd69c1d4b6e359329ddc78bfd4bb337415f6ae4c583d681e3c323098f118aeff85cba188dcb8f5e690d8a8565f9739d15391fd7b6ab2d91a828a4bbaa45d80b568fc59c77375848cb44d6f5a76f36dfbd06f33f08dc402ff9992a7e852eacfc9e8d293f4c9445ddec894b50e73e095df6bf1f733146bc4ff3b7616ecdc27470062e7517acfdd2ba84db17501e4ea16dce83c9ddc2318480efd5632e73db6c36e2f0c88a935dd17ba431c5a8629107af4dfd8615ff4e458d8949e75c283ab361aff66af4eb66d67aabc836c7364525ec4db7ab972d4670a0fd87636e8d715da3c165b21c66e1de2aca9de5a6d826c6441b4894f59bdb93690757461589d24feb4531abbe21dd410f0fd2e7f35ac3e3d4378971df8855fa9fcafbcdca7d8cf77907d071cccaa84b3cb32d3a72bb3d7f0c3e094fec7bb944a5ae9fe794544c38e81e9fcdbf6fba9c37ddf5d646e2bd5adccaa2835aa8b40a8b184eb10ceaf23783a788f36a3a9cd0eee9d1c74b95b009a050ae69d9ed512e38f66d3348774c7248d6c7122362661c5a1156e03e5de621434198963f26d3459c6572b029a3828bccc1ea35be549bae3ceaa09437416e492636989bc8528d2a7ed649c1063ae0c47fc7635a4d0155a12c8fa3656a491f1d41fe25522ce39ddcbe44a0ba37dbcf8608794c87743b8884b2fb2cb2dc1a37fdf347198e3ab58b8f74cd742d2595802381748736458a846dda95df27408434e1661853de6a8c05decc31975a8b8b3f676c4636b6d6dccd906e2deca7ef90d364b4a84beae5f461c67ed0d5d48a93c5448d1fc67db3d341664f2f2a35b59cf5a33974633d8170ab80a95780ea1a4e650c6cbe9d755c19d5026a42d51de612289e7a5ad170b9907d689141138de456dd143744b5e497600f7d48186161458c5d05cbccba6ee4ada88135b94d0aa28db8b6123e783d73f24fcb4962d83ddc39c090dd77374f340da3e25e83bb31838e787afce4aea68b4d84c214b9f304ad8e5ae3e80bc16808e25b378fe5dcda12468b3c24ccd2dcbaaab7bb4848c731e68810c9f342b77e6f2d7d5abc7b941e8d038494157df49a3c495c6e7c35ab97ca1f589c76313b3cbe21a3ae88d9b0e94afa24d8449b78e6c1045760e7ab5b37649a97938fd4317f3984ccd33a0c6388dec97f4c0b685f536a30e5c06bfd72f7cafc12acd5df5c40c7aa3e633aa44566689008506bb9d1088e72069e6df72b97eaf79ab0d5c97a483f4ca8f5f485679cfbdd15c981f26d5a86c637fae3fbdfb8d0cee7846f6cc52df8475b27d3178e5cef46e37c2378eaef7f822eb5b91f3a1ff6f589ebf1099edcd46db1090e8f5d67bfe36ac51caec56485cd8a88918c07d241b39ad513846413342be9a3206f691e3fedf49ce25b28f9536f90c71ca471868c6df5a5b1a5cb1415fa46f34e5d6bee281f51427bc4f703f59d3fd34136ed102b3197a8f1df6d610fa3f3da76d6141eac2f34e3ef97730b0a38e436958dbae3a50de6cf96ca59d93bb56c58e66ab56ad7ca707a44cc29d1e5866c3b2f3831faa00ebbad438ada9dfa83be4ff18bf6602708fe26c68b1ba4659966cc95d79851f03e029a736c3b4809f9c366093967c53769b4796ee76b4f1277f1407b8c478fc1400de6415c2a231727303c86110af4b743aa85b73e38b41b819021b07d1ed5c6c171077e9c9b6a678d67b94958c66921e9cf0f573585bc3b47323f32979b91c411c9133b3b8b03199179c6f457f106be4201bcf2d142a4814c5e166c17680fdb2a1296890a89c802120585951a9051fccc4c42001346c9add97f93191c720466f95c5590b0cb8046a470cb50a3716a063135ea4a0219217b4d373efac8625ef44e5c0761bc0404f4ab87bd8abb068c07da5c832de7530be88532fbb5d8eb5c6023a5f0db1aee3a50d2864601a579e6dab597d6cd29208c48f075d42c6b27aa3c3cd837e224bdef354e20168c03172a16973224d50cc0ac7f60fc9b0afc7f399c29a9509f9bc3abe7298303db253dc04a69bc873e874a43dc28fba6339e4152e4399a3ef1055bd81099b33a5087b816ccc668a75bed05650d37966d058d6ebb2b3a819218036c2ba064ebac797c671ead151c121ab88f6c9395204e714310a8293c64bc9789864f93569ca043b856c8412ad985d8206b6e7485f1956d7e616104f720e76459bbb0c874e45479e67233137875c82dc6509cc124bc184a3dbec02cbb08b989103fb59c378670be58f0a96a694d71062e6af424b6745fd9130beac38d297a5f1ac783ef064084b84aa06ac9c2680e8db2487cf43bbe6b8574311a4bd99d733a1b6a751f68401938f4091d25837120664033770d476096e561a1b03e8cc878480a015225cdc1d0719be196b4aa94074c290590988e9b4a4ebbb4b3e5477483cfa6860219237924641cf9a2a7a1219a8a87bde9d08166f0c3081297eda4737d082ac5617cc7c36d428b9dbb7237c122676ce932fd01aac625b5db503a8042c0112714eb43370b5b5bb0d53378a5b6f738c874dc7a7f1c15987c28112857a4bb4310788375d9aa0e60c59958c7f0db809f688f7640805c334e9b1aaf78761d5107c12618b81ba12a1258c4b0123eeb570ccd9924084b7ae3473eccb429ae0c7fc059926f25542911a8738b0186c404f2f107716b5d2e228f91306e3bda12a9b281a598c52228330ef93962d085adeb6beb1076969844e1980295964f9f115840753c15674c86119909d111719182f880ad9ee9792bdc128a8c4df1da9b3cd43301037b192abdc694099bab87441113c77a7f7210764cfb463a96c4007108d4537f29d4859d305987930fd4d94c796cbd55452d10e9b8723a6165ccca8dd39741e94418812291facdcdb453529960d850a40745a022643cd1cb70ec330a6e190ed04963ee28cc774198914b5bfd7c43c6614007d49dda88c1d8b42e05a388f4db09ff1a394b01547155c79ff4933a28568e172133515eafab53b86a078a1a62b114b9977465342a61ada1a20c236d3778250eba35f8d36ac0d58c91198d4974610181bea1cca0724061976a7aaf161afa1b111f0b0e5b835ace9ac1fda361048a9b0008096b41bf7c619af3299c5abb04499c272211931f7b6528c17d5f52405097afe5e0c6ed2aa2cca7915fcc2543b4c8268256cf49936a858f7401117b80b18b081e08b45a0e828bf830c13fdc55fb468d99e8107b93616da437b90a5b52896330c53cf3e28bd3799f65f28bd5f0406638c18c8c9838c555a9b015dc99a61ac330fb11654831571fe667f208689d1c045517af836abaae37184ec603d01a918733362942632644b9b3826ed0967e6db05a6e3ca77cc1604174a2aab6ce72fb1eaa31480e235be79c1c25832ccef512e6c65261f2c485cbccf4062a81912abdbbb3c98c5a6912388a236161e7b8283965536908c0145bdc170bec33c5b2e437628b452aaba7f3ebc8fa730147469d63eb8294fc3cc9096781e58d0ba64d6dd6837812b530e9077a5c5648aa6cc024069150c5acf26d3cfa2d658ab18b86b1eeac4ae2422d41704b9982c8db14bc53e0721123a209d67999c9035ea07f3485ac50e35f85379396c620ddf159c3a4cd57fab15b53c8f2e6aee06c6f2ca02f0d99543368ab70b9bc3f655830d7cb47962d7c3789ddc893ab0a1ba3e1170590249a594445135aaf71a902d9aedd178d88d980345190d72b710ba08077fc868e86713be6bb45652a26c73ca91089040322801b9c68de70662248670f323f4233c1a3c0937dc86f0b6476d12f426868be1ba08c74eb9f3d9296c268dcd23c66bf0250b222854a5c31830b7431ccd3ed53fd36b817736cbc5f7b1dd6eef5fe6332fb1a598f3871e5470d440fd2ea631da28a +ciphertext: 99ce600c4a66fb31f655570dca9daa4ad7c548a6617019fe7929426b3b0b0782c46bb60a9a618a41dc2adb77334e9e20b6fff08f9658767c818b415399c26a69d110f8a36406e1b9e4f18e79dbe98ef3c5be1c71bb9583e94a4bae18e786d892bec54bfecaf15d4ec112d034658d27ffe26cd690e5665ec07504934029eee4314f49ccd9c73747c089ca0744b2c43298a17ed480859ea7f3ce9ba577c3da53c84deb0d34d78b5581e76321b895697704dce1e36f30b3686b32cdb20c8f865b7788cb93459913bb3a623904e51a106785dbad7471e269c333ae69990e8bfce1a8f38ae3b2d5dd68875e5abbaddb4152178b84f62df313d6bf7e4c8dee49c84eb6571585b9b2b1aff78e5d5c2192ffb0600f3317d9a14217b45edfbd6af064e9468fd2838fd83a0ee27e4fe33df64462e5fde462c3ba7710b1439a96f4c93d14a97dca88a45151c4ad8bb7e400990f28a4b98bf6a4826058f87af51bd1901ab37e4a7067e01b7ba1bb65ad6efce8c79e35a7dbc707f64c7eed28a91976a7026a1037e353c2e17753571007ab7b49caf80b1f35958b0308aad971b0b36ff5b95a290c1a0e2ce9d299e8cb1be448de63dcfa467f5067736bb649988c020b1e2118633260e02d9aa0a6640fa15a85423c7319adfc43ed03ed4c0f7fb4a67ed3ed9ae0024acfb75c7f421af32f9559fe95e261d5cc1df7da8bded18b1f109325105a59a3ee04d1bc428abba2a3411f6220e51bec19056d0eb2da00f78ace86ce7e22a525ff0d8f0aab674174ad1a1975f5ed0edf8767733dae428d9018155de34665090952cdf1cf93297dd65aa50ea2e7804536f4037a819ef059423ec0d235cbf71b0c870c6729ac1241431c7a9a9300a9dc4386f6d9864e3324dbc4b0f7357b98b65d489fc05c32302d8b8f33cab4dd01e1426ee197c2fe4a2b79619fa9113d92d15ee3df01c31fc33a0caeb2d7448282bd56ea9675b56b34ed39072dfd1481ae524459b6bbf81d3acd8bec34a8fb3acf9100c5642b709dc8e6b8c90c5a85e975acb13e9ea501301bea7e9c2b87ae2c4217e4482c3ef609fb833b0258505aa7f0c65963b60f1a4500eaeeb1ba0f6b46a0c4b58d28b16d3b86073bb977f72a1aece3b05b4662448a41362517da77694802bcfb1c2b413321fc1fc992b7b09df003345ffc0a34f76963a3cadc10610ce18f7a89835216ba09dac2f0a2731f9846bab78a0edaa1ad9bd6f63d4a43143b31a846ce138ff97590f60ab7347fb272be1d9f35939221dfa49d9ea311536def8020bea5759af8a6fbd34947ff6c812076ecd9fb45ae16b69efaf9ace46c9ab1a162490f8552ac273abb174ac4888ec0db9957fe3db777a2936291762fcdbd52e0eb55f7787225ac8e0ce9dc89a124d975177404c6a557692bea069a87f220a23ed09d24001763b37c3d0e3fe7c981beda9c05a78d14d6fe23c6fd9b93b45274c13c286d8e4034696382f3517002a564f38577df0cdc2f80b323fdf0d0df3bafeba4ad6b012dfcdda8c61bc4d60f6f635fef5c3a74dd73c4fdbd2988f142e2cad4312c4431e2808e41ec844f736158c23e874bee4b2711be9614e8cf4541538186851696ecd991eaf3c26a2e88648e310b35918c27058303a6f9ffe23cbc189221841299178d54320aef48ee89e7ef580609a17dcf8d31d2e2b082ccd6cb374198e06239db17661614e551621219900a778019c8e69a21b0e0dfafe27bc2fa3f28dcb07697fd402fe0ee2414c8de7086b69e1135c6a8824ae48e33624add195ff04077d2afe4fb79b24155bcc28948e79ef03c7b5213a456765d7b7f3e204c33b73eeb70259aac4f92728eda87ae7676174233c3d7ab43b1c47e77506dfea9bec8b5acdf0dd6ef8fcc8a8ca8eed48db06c367f9be106065f75bc55c9bb7ff972551243148b41bc54ca633c1564721ba98e151883847ba11beaed5ca969ca174b3651d86e14fb765e9523201679b770aedbfbcfed91231eaeb3da9d76c52b2638f539e80df8036f5c0e4b14f01fff3cfe9562df159f22569ac29190800b514311d965c88ede61188ba079717e213254c6fbd3fb2ac9922fd923dc3543210506fc41abea6a6b26c62ab02c5112df3e3643a914c1ec0fb6e709713f5e697f8dde78619034bf0e52cda5b626d5f1f4ae6baf907e3a3ad9898eb13fb1fc5a251eec7d039ce105bec76332cc00dbb74b189b202721ba +result: fail +shared_secret: + +# Private key not reduced +private_key: 280fa72d7ef96867db25144125a96fc1e89d964a96ca36dae35dc7af8c825d857b795396e4eb439f23edc9f36cc29db8ad3a385747a83a976a0e3662834662ca8c7f68386486da8663774f04066d3a04f813aa6c838daa96293bda3fe7c4aa8cc26b5f348ef90ebbeaa1ddcee148fde83fe62a23bc001690cc5ac2c4a7d5721e64508ca42aed6ff133eebf0b64550c359b93be679db9d8efcbd70f7de95c34f03c3d2097cbe125de496eb57b79ee192ddc333a3bded3d6a98ef1e51c7641687290553d7005a52426d9b85f39e43abe45a4e4ff1ccc421e8417633d736ffb7d1b3746f8a5431d6061d567cb4370f82e540cdad9bcb9cf8c364fca93f2d2d56a702df6a54ae593a8ecee1b8d8776b3827b5161886aa4f9ed6ccf6a516a757a353f6d3df0db3bd90a83f7225f38f5eb4c91594e555b8b0a3680ba6b9bc0589b5f9e600db8f9205395ee836deda787045438e657830dbdc6f82379795a72f698c0d82d9c85438c939ef938c65407058985184e4809da3f6439fa158749696c1144a3376e445affbc41c9a7a32afb74bcf16e3dfecdfedf82488b503fc011af3f35d9e8ac8c3ea89d6219fc85f67730ae1f45023dd91a4b8b53f537908eb5b8bdbd85b486c6aca5b5435f33f8c38ecf55c9c4ff1a29e457497846ff91fbdcf39de68c1f6875a445baba0951248f65d90b87f73d5310fd89967b50a1e7f2ddcc7bb28d3e552463b72f49b4454096ad903ebfd078bd45214bddb895334086ea869eb042fc885daa8a8c7af985836c9109b827c8d4ed6cde92b568b32e618efe55c1535fbc1f8012dcf7b7aa6a5a46fbb3747712cc693bdabc919bcf2be8afe42a76d814a3362b5337853828639767bb7fbc4bcda6988a7a933f68aa3b3cb7badecd65efa98da09cb742ba3564ee9e27eccf6b68b94edf8fbb45e220764bbd88eab884956a865bec99c222e5929594feda25c340a45275dab5173eb24bb86b71afb832fe71cfaff2e45da70a1879add7dd87888db3bec540c4666f7641ee36c30e733ae206b087084fa3bab718dfc8761b78c20a31093ba5e933f98ac59cfb768c527a3aa5de9d200f62d6d4bebd4e699d25fe092368ffac3089df488e7be77b09d5590f579ba973b8aaf404ebe7df25c546fac73158dd180a519aa3d9e28a98fe3b521c978df1a94aed1afaeab5b971c995734e89afe7b3f90c5b1563a91883e1abe681d61834ffdc8a224f871cdb48097af5c0b3e5f12a627314f06149312a4c647e1d59a1f559e6aa3b502fba01bcd93667e8763a720d94506a39582e74d0d94ae9540690c94c9afe1c5df5b6716ccb4b80939698caa5223e3a3b3ab17a06a8ebc3713944656a75bc95599a67744bbe79997c4e53182372754a9d8238926b1cc239d5942f6dc1b5d85fc08f8409bbcb68f3de8928dbf18d83e958e6dda4aaa63f67787880b9cb38e48e585535c80ae47d226893889b5240ebed82e9f6656541f3196be9458a1b2da5babf63bfd6d670d6baa7a8e672a4654fa87a388d4486258403c9b0dc58d54e4efc5269fde43a41a3a7aea934a7238e807d26c10aec91bbbbc8ea75b2b225d83cfc94a12c61be14cfcb2b688b0978320bd26b0a60cc133c709b9d6c1734d5bed0d45f3f903dc78f9647808b6cbb9d5cb4da605a2b3fc3a433c926d89304c868257bab174861a8b57f6bbf6b79ab55b3d44be689a9ee9f3d598f7453b3a72ad6b29bcf3eb3819ed35d56b74a176cb9bd8eb9ada4f50e639c17f431b1c856b02c4d6579417e3d4f3c8bfa34579b6c09a866ac9d871acfde03da9378d2605ed9240372feabc2d17a7e8913ee67a74b68144ee1a871c8737feef4b9c663bcc9b4f770ca4571a9b92d6dad14f53600dda0035d9f109659f9bfa5a83ab6a1d8c3025c38ebe6346ea5cb11e66d560a9c656a61de98407c23db1094c391a879ae7dae5decfacdefb42ccb378b9a9997e6d4269ef30e6843e70634d25ca676ed99480f759147fe50fb42a28cc9c9ee3693267305c89b7ca4cfcaa3eeb1f6e37f6470432a55a09ae83e1e87ba7a8f78e6b9608740025e5ee15437bbc8e57c48faf174e694cfde2eef5cdfb7c4bfd9a8045e7fac4ac6bba6d378fe7ed8abf16cd9feda8bd8a8a5d5903659b94552ed2433d7d6668c2f608179ef4ea558f3bd72af6c50f1421cc8e1532bc6afdfe7acf2a43b34130fea7ca5b1409ab0f10dfaa5a5f0e7b9a62006f1c53e82b5c7ea427009c990bf31a939ea2705630164445715bc5c80b3906739c46a4c4cf1024776037bcfb0716d1ba00110637fc177fa1768e73cad8fa4777e13aac74338513c516715b645e3bed722382950b132418fee81639d448eabd55a94c66a34eab68ddcaf1c756a4907bc3f5115aeab5320f3b9bbe84e0d885fb784af7fd8c1eaccb37642cf39c8a24c4903a7e80578ac7e9f2a95cd806caa200e23873f751636cd606d819731cf1b812afa2ed24381a52b4f5fba658618a02e0418d6823e7f418294c81032936559a77f9c014d8a3b38df8bb17b7a8c3b45b53ad60b0d9929a21a4ae3039366f894b1082db5f3cf2f13381d53827b5a568fc5234e099d6b94bc1a013ddde944b4ea13eb52bfa880716b1a10d8827a033878986155b7f2944a63a2cc32bbd61907125475bc09b0ab76222cb4c9f2e80a00f9b71bf9705e3576b5a96f6229ba1ce06fa1b2079cf66c59f30dfb88c1f9412b0b2ac059dcab8782abe57209188bb938d08bda140a0eb08de0db3f8558c403c725a77aa1e0563a54a77f32aa30cb780f4e562716075763e9c5d470564ec12cdfab424ba970c51201081193741a5e358cc7d63064a7183d99b28ddc5b0f10374ea9710193385b855a259130bc490041f76a9d661483aa668aace51c616804b5e7c1bdb8762b73b39f17785af94b355b0fed72083c2b71efd1cd43c1a9704a93e0e5752e99a2ef115b6ecabc74cb03bc091038f5701659a0d4bc693805080d6a5c81a0273be9149861c461c47cf496cfb22526d3fb8ba5a3396dd19a8477611b814b76d5c8191ac1c8190ac3b12065ca4ccc879d5f34bc4479a5c8d4693d8771b434c4b8e8b8ae921e01a131e9410ed11c505d226722e011f2073b0db34d10c104afc2656dd053e43a8db7c00fe705b0ba520980dc71e834127c08077806cd8e82144d50448dd59a085776dab69e42db0e7e8ccfc010a140b50b50e09f233aacd3da972aa40f1d1241d718b54b6009d3daa090186cb167c1ab3979c8356397e598502422da2935edd9c8c44b90e8c50473119d26e99575c0c328307e2017b515f33d4d2821bf341480780b21d37fb6cc3049324eb12a42c9f7c9e086bd0f39a1949058f1d8c8f0739c23fb1dc542429933080ae732b750af73b05df6b46e0f27b678668f9450c193c861e7e38d65e5cb05a52f62b29d21b4b33d34771bca88b3149aceda8553c5813bfa6f8a99c656601fd6f4ca7e54cf80e48fa144bd996bcf41e49aec97734687a7d0da2c71231dd841c8fec9a8fb686a7cf81106b16735d6559424c1ae7a5a5f0515a8074bd879c1cbd6012a3b5a7079bbeb6229de7676a876c02f1620d04905341c95ce512d20c4ca11f7c08684473a31313640760d24b4946c0268c108a8b96f699634414b070444480800c6c3d4bbdf339c47e9b1660b9ea039bcc6836a6fda9489e76418047eb3e99d40aabbdbba140221333cf1cf2bc121318aab09022f95c31b12abbe67469bc34ccb88c8a0a965902e47494c7a0bd573910a97377b764ea7443e73346ef9bac0376711db236f89a025d9b09931aa473ad04b351a00c5d3b969134f03c1745f672138f52ba47a542942c1078892ca3b9509f435d8521a373810b12393c8eab18fe7b6f3f4ad7ea88b88b21db46338adac939040674be52e6c2948fd659935a86691f076c7f228bc5874fb8214ece1947f68b057411c218b776a332f5aa351b4d92560a42346180edb08bd57f5342773249fcb1f036955da0269695a712ed852a35a3de8662966c0b2c2038ea1ab7b4f9708c5849dbdc6a29e734ce8db1f447109b755af11976b73cb6c8594a5de221c44b61b9d425280007ef4ec4ce3b34beb733cc73a1a7f6857218476adb0200d96658c8456576666b6d7c06da03663191e649457d298b81b067789c285af151ff4b97239c35ab8688a8d6b4469fcc7e42201d5d57bf3cb98c883c5c9c88f05555674e7a1bdd59e3f327b69a74f0d4a250aa89fe1359e5724ca02c38784a14690c62d891364b752ada80402128c623d0839a0f09bd0e6a37b724070a4356641c538415f2a97701c5492d29a2f2823884496af9dd06703d8ac2c17c4ddf5561590b63ff78c4995a31a18d861a91c43c5dec3705c6112d81b81555f7a3b432f37e94def940045d3fd9ddec0289680ae2f96d9d43f5d774a81b86ae7a4761ab275d12195ec32a8686d0600e45d4a7f54219b0d7a3826d193a51b9156ecf2edd6 +ciphertext: 6506597d34901eaeb07e2ba2d0a69f64a75006df37ae149cbae6232dccd9d62cdb088a2c55fa3cba76155241aa2827d1f98c5deb271240a165b0cf64d3b7584fb580cb93f4f717fe7b50c30e52fe8f9b1487baf0d745678455096949aaf46402b8bd5f8945251c0ec00458e6c347a123b47350f5b35a7c42f0d1a744637e7f2445134eb74949e95f877b9dd9c58c3ac30ffd248e72a8b568891d1e70e0d12a8ad0f50a8fd455ad503a901d82ffbf69fb75c629a9f6a689de28ba150eec51c66dd0d49dee6ef4e10d0bcc202420eba18a9884fd4261ae8537cc90a6d3d3cdfc39415151609e506f789d7430cdf4ac700a101b40e0b8142dec62a1c9cf29305030588d21a01fb51d6e91b848c198fb37f2489c7139882f032a116ab707d019330953bd8698ff5e54e34821a448a891e74fe2d6971a568d416295906a232dd1dbb5d7fadcbf2f765ac035c2df1298e46683be665cd8f8dcfa6e4b7034b468e0f53e01ec07b0622c1314d15df534fd27db47ce8b18c88ed6f04231db94cf59889483b29967c56a7fb98945cd3ec21ac881675f36593cda7f20433b1c7b2ce7e841b76878ae25883c0e579a6b4f848aacbaa55fe1478ad2a2e6f1893f7154b53f2ea3aa8fd05cfe05fc921852ef372ef28fc6f9a865c055705e4770b2f0e0af58bbf55c7b3c8fad039be3e9d77219cc9f1883a3307641aed538368f96b7f6c34324fd659e2981bb1ea35085c076853b31e8dcfe98099edc6f78f31a90930f12b7a02c655c07712d94470091e568b724dba0e53e8c726eac8018fbfd95ab92e5a8ecf14910bd306b6de6e6b4c95dae6257c0aa9fd8342fd62b96a58322d559146299e9cf70f193ad3dff5950455cfffc2cfbbf21f322ee48305aa55f81c1296fff5fd2cd8a4fd56b40a6cd17d2237880d08359ec9d1950dcdda8997db7ed75c3700d2b896bc84b6a52e0189d1f23df4d0b522c474d5962dde1c7a176fc3a3a2687d732bf7c4597aaf7258f40965d3adaeaf7846e3ec496f39ac1eb7e20f95ac719f22802ecd32e1487b9d8618238cc23ed2e3b9e0d76ee4272de5bafd3190e7d229efb57451270291ca11a82ad0512a93afa24827d8e6d7aeb86d9bb021df121273f424f37d4120872e3aa40974e1ab9cfb180b1d3795e35659cb77a6748e2c68c30f617f5e26b11d5c31ecf56d8365df6f6ca6b6eaff107339620b468e489c2eb03deba9fe98108777ef9397ea0ebdb7dad462df11c52456b0bf2f8f04c7c8d1d1831d99d9596d4e65dfe49446dd91503d909f04cd04251af58ce187027fb587bc9dcacc90145b7b0221a142aff0cf0273d45236f86d4bcf1615685f7cffdf96c29ca4a7ed8ed3dc0958cead9dcb5095fb96fc3afb7e950ed9f2fa342ee8335e32eefd5b932d3859f1408a6334b3266259c86640f8e0dc41f1c7bb05cc7a2f9d480c372a854270f21f13329f7b6e4c711627929c9df3381578acb54a29dffea14280cf4d85829d1289f4793daa4782538518dac82c44e36dc46dfa839ae7673c6388bde9842abe646177f92b4868441be5b82bdcd082a5f2cbfdca0c05ce14ae7689463ba62e773c1bc3d9614907dc86f2ae02fc2823b23000845177a0696a89a7a0b8f2ab01f2ed2518d9b20c73adebbd40708974bf59adfea03e0461ebba4210b31056885a88227e4b9e775339c2500b509e5a4c006115d368e3917cc539e855ab51c286fa71871a2f7c9d42ab8cbcc5a39976483f1fd7524250245318ed8edbaf4e07d8f7c7a5a0e34e0aa7f5d1cc2da7adee0ccbae93b3a723ee56657543f0a3642c01f13f84068856b331198ae9ad6badefe2238c7170cf884dfa96f4ab86a4c99903d285346575f19e8e8319a284a7f67d6f56ce78c5343e2bd1a25a52feb56769e2d1041679696fa45bb8d5da89e5f55844530d06ad5e1a2771eff0359386212d3e0d1109564c6c9176613f9bf2f994e7af4873b4179591b583eb3004d1c8e6082adcc155b3b916032b8a2a1e52907384f16af21b6ff4320c617187000be4b0f511c56116c25508e29fd0e76e6f062bce64c8786a3bb382835a970c2741be8566d1f7ae3489b8a79228f0897a85d60aff154596249143447db552577ebcd611a63e3d92dbb5ac57d87d9a6dc92cda84cd008d266c481b2ebc3affc084857ff44bd3e04d9c47e46ea8580ec2c0eec6f4f1b97bf4b020fcdf05e6cab506b9e93 +result: fail +shared_secret: + +# Private key not reduced +private_key: b31fc7b33a82755496caa9b591e69055af808a6faa4c7d3ff72b8f7ffff06f4a7cb87f62dd34c792ed95cc059b1f0da474e5b60a3a8b2b77b0b6a349690dfb67133b5f93c96e94657c8995afbfc6707ae361e7370b8d72ad47e3f56c6aa33ce9e44f78fd2c397e84905813b10fac77595a624476c9be6ad6deb9f7614c8964c9300f6cc7d0e974e334540c6dc48868c8fd99829a0ca97445f2cc88b6bbfa77b953fb9c373c07573c5477a339697ebd8c4c2e087fdf7fbf827bd01cc7b3d3f7b05494e93fa38982f3ce0498e82f59cefa9fb82d6d392198f9e4e4b1c554a9aaaa301f4733c064dfc2c7acd2ae3da0adbb6eae8f173ec5ffca65bda5e9fa454ca77ceb8f5c8f4103749966eed12f52e4f4d8aa45faf4155a9da4de5fb964a68ee7d35d556cb9ba2c888cd887d83b84f428ea6b630df18c96fa39dc6f9d66719666e0d69a54d10abbc1238931777cf0bdd461fcd86b26ca2dea34e88565a6a89bd2ae38188f98cacc938135ad58cc98fddf98524d9a3e93cf0a37df4d8779b5f7aefd2e43e1ed82e8e8b357b84af73d364538b19b55954edcb3f35da2a53cba0478f065846c0323556f154b97b7973d267c1678a02d2bff168977a24fbcd59f509b46a6bdb7f2566edeca5fa50bbee907c4fb62694f978539fdedcc35079a4cde64fbcf5c46737c2264d803d4a04f54824ac381eaa5ad5cb5e568a8c25686fa112ea8c56e42e0a99f16db9cff47e317d6d2bb08b275269b3134e1ae849c2c39f85cc98d1244a346497ff59c9143a3cc958eab5ad8fccc86c2d395e2c0adeb97d83b518aa0812aa2c6e3c2f8da9e8ce8e54f299fc8bb52e9ba96a4baf64f8b828fe783cb4e90ad4fa56a97c0e6d88ed658b6993399e58ef7040a44aa53948023eb4863e8ffe6a59867d13acd6ad4054b70b6991fa4b82e69d18b8af06f5595e1af4570def2ea98f8fc3b75744650b2bcea258e33baf7d0585784a1949caf7c58bca497b1dd356a1f7c6fc88b417f68cfbaae78e779adff5e9c9767bc79eeb0969f69988d3af98ffdb6db308a789b8c985235c9d694c6f1ee425dce782bafeb11444e54e7a94829d21dce899439a753a677913970f57d854966357569924cc5ad3f3fe0b6654193a4b2f145782c9397c2c6bf90ce4535149289c9d4a106f9a46bfcb0e66bd955c3c153baeee3fa7167306707f730cdbd6385c6cd0d793528b9d01feb33ace79a157087864f71df4cab938be046cf3f4d9e01faa10e56d1ae47b677b670b11ba1edcacb5b39f908588554a8b9f204af841afd268eae916652db5a71e378f2a37b6ffdd3664b9ac253acba6197f11866b25a46b62853878ba777a5156948f5fe014dbc640ef1644a8ae466591986acf6cec41b77b563af504c15d9b51ea879997491c9c25ca38aa3e6f250ca5267854e1ee9554e064b4b6e81958c50b127d8a348929579ccc099531a2de1fe0cdd6b2f42aecd9ecedf9d1de974a2d3497e9d4baf5494d4f96ef5fa8e86e45fe5fdc79bf3861be98b7187d93ea3e2c0f77b89ff3fa62ba2c6f9325523ef23e9607f3bb54c8888ecdbfe01dcf2c0ff384bab57fc2c62a8d47f7315eafa5ec7efd63c0f0a87d294604038e4e866d2997a765a3597d5b9d99b99a37d38e7e827b76eb4a2da36f2f516364d5f5c69586c8e67f9e43d9925fbb3f9e867185d3d0478ffc5d83888b96e00bab9348c426ce55977a73c40faf3160ef3e724a1735f317a05e97c39da87e6675e7858927d454df4b801df546f9a33a298f56669c09ec63e49eb755cec96a64fb49fdd365e6e30f02d51baadc42c675302453ee7ea854d1e84b446d9a1bf5f30164269479e6f2bc7a76aa758db970a2d4739cb3378dac80f54c665eab7ddcdbe9f8e86349b9f2e2bcddaefaf7ffd3ce65c62e2d798fe588242f990caa7650b5ba55897615a85ad2f9690675ebecadc7b53b38dd74962d7e6cc79d68f7b273452aab4f7afd18bd6ddc626ee36e8b523b3b349f6666f4583855998d104f09343e94b567b9b3332d8e93fe30b8e1a8e3bfa0abaed74e06d147495a6abbb59d9e7bad6971bfb219e4c51a5c6f1d9894eaee0397ddbf32f68b58ac4d8b8bd08ff4deadbe737779cd5c3f8e0cf51577846131392d8533e71dd74fe5d841698bfb584b621bed0b09ab9ad6c60822a87a132c0b9e3c13bb45e2eb5bb47535099e37019b3c7ac3b81c6225dcc65476fc12e7a81cc80c9a508e507f201632be9c1bf27317fd97275cc3f481bc7c5c25a4b1462767a42cba43b152c276ffc8db55a96d418246e0bb7d5a15f0d883597e9579d675e816b8333097787c613cac29427b11739e650cea2ca8b198c0158caee9971894b67332baf761caf88c16bd11c9f1dcace7b83a6bec71f0ed9bc28f706c38b057231b7c330a4b99898037720cc88245f8982daea502ad30e315c2ca477a3f045084356cb81184ed90734e0cbc0d1553adaf5a94c2a6d8a51566997c735bc45fc408241357da2c38c8a0520fb5a33e1d5c06cc80c4e91314d08599763232517b501097e4bb09bf814a0cdba619c701d249c933d143bbd92c163724b523bc05568a410952380177ff6084c6416bc22c637b7e1ad586324103677101a74835c4255b89ea1935ec8b8382611bd4dd91931c436f9a909af4747dce811a2ecb63f046b411a201d1b4f12442e73d7703e22896a904736308453b946f248a6bd11800797886af555b0787d84daad7883c0e583a7b6530c7d0a8559906f0e423e9e6cb600b9917768777b7489dc173fc67551ad92a26b054ddf13c4f83b5805b9b7b9829513611e171b9ea358abf9054ddf02629a397489dc213705a9b86735577493b86c326e857eb816663dc1417cdac788900c8030803751bae22292af87cf8fda4f2991418948c0b4f54c19163dc4b195b76cc5def67b5288bad948cf214cc6a11c6e1ab1a5b9b1501baa75cec23530c091cadb8c9a02415e816ebe708422dbc2db224b74ba1b83327c8b25bda3cb7127f5c5b963cf3c9abfa15c952bdba2acc01c9d377a89eab6a96a65cfba3d722b6618262ea78770d5fbc556789ce4d13bfe02065f033362124b84560f462c64443b88f3135f585a3b29e450c1dcbaa7b9181133c915522a90f56e595ba11ec3327e6a83c7f1ba59951c4684995ea64edbb3451271a878e42be7d763b27cc430ab6b068173b973141e0a72cdb185b263071d20a8f5a37dd08ab6ea7a2639e0cac1790d5573053569addc1731a339488268873d89a1490b78ee404c2e8328004d44cb4521a68737f195634ab659b919a94e268131ca290e59756311b6273b5dfc2c3adb21534609cb2fc553906a14d8c079f487091587943df49a39d1b465952efae34d33fb9ade56cb6ca9cfa8221458d9940d4bb5f044297c4160a2284032458bf909c31e47a27c7aabdc9815f1ecccadc6288fdaa6c0316f2cdac38ce89fb31cb81b673f26e5709e08c474cc41f213b0fdbc5563851bbec682d9051a5d58148a72956721bb96224214d03e8b89021b98b9a0a87dbf15b491125bc07c6ab6353560d61814ea3cb2e72344104b06413f963091802413521441da171e6b6b039391842141c87c991a4157b428e35ce499a805e2c0954457582b6a8f52c4e102bb33cb01d1ba883ed4cb126c2137a75aadca26852223741c07b027a1883220ca9a65585a5e0c0847b9d0013f821bdad0902504785e927016328c99ca1f3d2bad906b3cef04a3598b2992b2c587100533bcccd15ba1aef877c3a565cb352b7b856880108fb828b42d3612473970044c6c4a057f18ec13deb2c398393c19383603c183b02a461bc9b8ac0969e04179e53c5a8f54a556f54218024041137448d08401fba8e4bcc09cf3b91cc28ed9bb700cc74523c251ad3a7c21f43398f85c7941387612c0c76a43db2a0a368101e88480aa1a5f1500b2a17b5704299d5639b477802fef34bcfd548274d26c476c50fff8851f29ba5ad66caf066ddfec2140dc97b83077a9e21bb4f87aa85a16a7107e3597a1bf4a5bdf008c14bba230cc95e6071bf0e6a25607566c9008d715223c483dfd6737e25a2dea490eb5606c6e32b8063128bcb6181166a93da7626c4273157c47b5a2adb1d88441e76ec9fb6efbda9fd084b496d5635794aa23a43a8c4650e05bcc2e415d775971922b1a446411f952b7e5540091a430882067c0f008211a705e4842789ccf653bb919e742b65339aaf4653e474c10583d9329cadc47a6ef20589572a2e6e4ad67d03abdf7ce1dc9015ba94ed9c69220d63b423cb5daf465d5e3a9d190a6c9d84fb28141f28990959250d48162c68b813460b04a78126e4b2c4514d83cda2735e3d3f1889578b626b002cd859ea9ba6fc856a8030f6010c780ee3fad17b073dded30b6531f854523002db21673437ae275e8a4d702ef311619248c0a21ea0bb6d6f56f12300e8584d8e9a34e0e6f52227281151ae4c305fb8f +ciphertext: 83fbe3b2e33a13730c0bd4e1dce1ef7c4adefc7d62d5bf91a540fef7010299009c7c2b603da43440fa34903d6b920aaecc99a68789b13ce11d43cc05b3b286589c2528480fa0db9bbccdc4a29a63a6482efc4c82612b3fc4152648a0c4a16f1d74fd2458240de7a72a878773c962fbbde1f83801c0a8044282185d20ade7882a67fb445440bc1072968af622305106ec5fd6884542474f7e28ad36101bdf31d3f5600ff4f865e68cf612d63868ca95083971c6aa06a93b5fddfb66a682874a28e5ce77d09953482ca7c917daff026ab259ae6a9580ed39cf94d345bced2ac41ee4bbf5c33648c4849e2a44acc344967a5f13367fa5fe3d014698040983ec41d09763f087496499086e8fd882eff48d7ff3655a9fcb87028795df440cb4dae831e45ffc80c2baed790819fab9ae70beb4f3b1a8abd7fc86304a95614e2fd59769ecfec62511d5ef0276bd4c7f75fdc8af140638db9e948fabd756ca0fd5f21959d6ba9f5c13a6981f83cb9808c660b3b67b76a6fbb5660a8997d362968134a92b0c14d255c81db897d7ceb9af1af1eacb8f42522fea9edb7587e46f50ba817350ff9cbf3789728d3ceb119642285a7a3d025488a3aaeca3a2960c7444f9c686530f1dbec6eb92dd7731e60c40c58c137e7bfaf027aed2a1bd28fcbfdf450a5448deda62d5cb5bc6a0cddf2453d34c7011e4924606727aadd0e29512f62fcd5f7f26a4be5681e2e598d281e0102ac16a5e87e60e9cf97980e8d0dbf8061c59132cf166872af741c08af8db9236cf3c0b6ddf926db9d620ec8f507e6b52bdd3a26b2bd39d1b06435b5696d388d8c7e287508c3aad29f8c49a580004090fbe1ee07a5821e4bba206a91472507a7a58aca5c54652d4950469bc060e498d38f0a5e27e7b1e47c5f1c4e9c5000b16899ae3fc31e0d0561f54fc3846fb9a618eacd102e39ddfed953bb5d7180dac7148a21c0832a2f9a9deac049fdf9a46fb5fb78cfadf42244ca05280302b70ff2c7c140d6b2ea6f0bb296f8231fad365b6561b2c0f7a6b8ba9e977b153f0f33bffa14a6f01c28a733d6a2829d407908797efe3cb345722271022311f1d2df6b8f0706f9ba5c423248e19a76fa65e9ac7df98a5286f172319e874324c92da7270cd97af76d43e277c59c92346cbc3f455b463101295de98109d344ca04049b4a3fed33587cffd19fe562fb146fa50483f471dc594b75e75d179e0d22cc294148ed3bbd1411496a2f7ae00fa964be786a97619ac789587fd34e6793a1ce0ab1b69b27e42fec77ebc88e5b081d5cb031cef71826a54c23ced97df258618f038d5c9aafeb0500a0f00fc3bd375486fdb1567b5595184040d951a925602a7cbca4ee8e39120f3358d8f6678887eb8aae4156536f23eb2c8e558be3b91ec30304066e84f0a7f77b659086f33a60b757c48e2766b4600a520a85823f80059ac237026852430901403a2ca29e3d464b59c65a910d54aac7484cb1ee04575562d19ccdc89e988a412e1fba496a7ae800b2e7c35cfa106e8c33a11841079cd824c17dc4c0cf0be4ec83d386c66dfd5660e00fd24cbb89e85df49b5694e8e985b2a3575adfb142baf10ccb255a3718d74c6e3f40afc0252e6c610509dcab44cf85c91dbe471f67753d65ea8c83eccbc4ebd8a0b31709a297633ea73e9f280eeb9aa4f49ee249ee028b17dc9d5041762bb6930cc94cddd248231df4da3e126e1f50c1df527f61622fa86de97fd8c6c21f8c22146666ce92ab682e0f7cab45b4901bdcdbb9b98830a97aef8bdf98b1573527b436850110a6139c5ade2e31b10ce7f1aa9d966bab3b7ddb49381efe266a94cc74aa38fb901f5161fe18e6476ad4fdc5d4943b82ae655eec0e155dd739fb84d2d64d72cfc2d6640f52206304fa90f05729ccbaed580cebe61a666e114a383b9f212dc83fe1e54294b1281518ce489eeff4b22cb450489bd8c9eff1d79f5fb3032463e61523a331fd92914dd83e50ca25417205b382b42421b4eee89ec3b1360ed68df782dfe84710fdbffa1bc6802ff8809205f144cca551554945695d447f5ca4ef8808fcf06cfec427babcd552ea0551823d12879f9ae5e322f1d91b8410371188dcbdd077cfba41b219a125accf3598c7ec40f866cf9c30ae13f704b800c19145ad5a2453261f02ef3afc8f94d85687a43c5712fe8ea3ebf7d5f377698a556435c90ef6213abbaf55f +result: fail +shared_secret: + +# Private key not reduced +private_key: ab6656e2dedc617ec28b24c6461336d91c7b5ff6cb9c97ab276fe5951983f663dab7da57f0e496742e866ac7d204396caa7b9917c9c6e18fb331d65fd1eb300dd481311b723c44408a2bef9657b19bb73ac593a3b2a86a1de53f30de50abe7620fa9b06144dac23ab1ccf4591427dac5553873873fd0175b79e5d0c2f9fad5fc71ab348522c5c82c8ec89303abdf684eb9f638a2d5d2a088795caa95509f55ec8389d0097d778e33a744d857534cce37b7372388507c8dda9d8d01b6f077dcb583a5328238a097a572b90dac1e3a4b0218dee06e60732f9b7404d88da9d18ec6e91e09c5d498a32ddd4e22398604479c85d6e4376d6dc6cc42577eefb9ddc2a4f83fa26dc1e89ede5595f6140c42c3dee1141a3a24ea7400e44e3a57fd1f9e3e341b50d88364af4def4917ad1bc94ce54df7a2435c6ea9b979cb30d86a856bc69928348b52b36915684cb6cdfc24cddb8fd68831d593339bd7ab13e6bc3656e9b58b4ff4969fd461ae7fab05754399e39e2776a08ddbc25e4a8db79af79575bffaaba7b9143c337888e805f5c163c059f860188bfcf674b6fcb94b480a859a2b7af7066be12eec956eda919739757470b2af5fd9eb3143cc66c8afa0c4f9ae57bbf6d958eaae956240785043c43bb23dc25cdedbc9956a931cd09b8ad8839cb483c73e672cf9f36d9667b49e52c79d494596a668484b5659c90965e93ffdb617ce6e18c94cc8daad565206c930cab57e814dcf6d3cebd52e9bde58538be7eeefbece8ac9bab90eaefd84406e7f33a1bfea68d48fccced89207eb7ba8e10cb780dbabd7b6e53339e3a0ae49f1a0f85c4ecf82c4874b7f5a56ae059ee327bbbf68ab3ca84e1f7fb5955cc3cbbefb86e949025a7bae6fdacd7d37e97a51bde797636c5ebaecb671f685187562083f7f8acb9594a7ee7fad7030748a87d674605bfc53b6cdd7fe6a0e4669ba37a20477b25ea47ce56aa8202ddbc3d4392f2f4af7984d5afd570eabd20a698409e8b11a4f5756a678cf6c98d08e4be5fdfbe5debfa9daa20c9ea934eafb18a9cd2958d8f838bd21a93189859fd6b645f805b8c2caa10904697189ca2b9dbb8c9431c14372fbe552019d67d6097b11246c4d8469d01c470519d79193d82e7ce0784a5110b93f450a88601345152ed079393f3bc45a254fb59de6b37896be3a54553fcbb72dced755649341699be44488bce835caebaf9f9ad17437615d74d9b576b9109df1db6babe6dedc10be59ac9d60a074483773e047dd4930eb853a1970bc34734bcb32782eb39528c0dee4f26217d33bae8a327eb50f69803538f000696c9cbe4a6617ae7453b608893bab7b385e87ccfb83929cb968746c5196ac7c474f3f4c1dad3ddccf8fa6e6dffd5643fffe16ee5b5827b850249434e9d88896cdc45b39582c3e2d7340650365c929546298beb40ad34da8b3886a8ed6699bd15bc645dca53dc792458470395bb64cea5bda9e6a11f5920487cb60776f40aeb7e7de6007a5322f9f410377c874f98be04fd66a136d832eb95474a240247beb2ecf0a67fcde8fead9c98f6a248c34bfdccd3a6965133e6e57d55b5893d8ebf6c6b77754f441bfe7439b8a526938d769247adf0665d26ec88e756de537bf570eb248e9632886c84b67faa64fb53f35d01586c60eab6e1cbba8b62582eff4eca31f87505df6368e5612fd9ab9ca4ce29b6fc66547829f452d667229fe7d160dd0a18574527a3ea92bb209ed37722684b3fe4db7d7cfd126e6d9b5f8e0d54ce197b1638fbb2a2a778c8e999bd38fa2d86b071b7d47ebfc7b3b3af53b4a8b07d61b38468e63b2739dd3e8489d33caabf3cae96468abfa8f452f8af61993bcd3a4efdc59a60fef4d1afd60d7e493c29ca5a86ed918c9e8eeebab86dba7efdeff234cdb0adaa65dceada2d64977cd399dd8d92d5c3ef0774102bdef6643ce8cbdf80356cbf0bfc2856cb6021768564342287a9953bec2da69f8520cbdf6d8a970c4aa776c60d788e107ac9da66672dc0490cde4b38dccd84236f4e50b9b3b775c8806adcec9a5a2d94f56d488a8ab8f90b6930cdb8fac4ac5b17b66c7cee67ca8ea55cba0c8079d1668ae5103fb62d4513165b275097597f4f2fb3ccb4bfcbebb5fc0b028a01c94c4a29fb9f1dc4f5853f8cbacb263b5c71c145bb9c82a0db31fb3c6458ef4c21b5663ef7795f4c36ae77a85ed8304a4066c48741323ebc5e5f50d50a704de206c4f6a5719b27b8fec3d95e77f545a7f78c57a9432a329741159808d255232d4288032d658bc483d4afc3d6ba94f8bf44b347a8fd4bb7e2e4000db9909c3720920a410a46905d3a34083c3484bd2448f232ed825658a8b25d99c995be0866a18c01274607ad6bc0154a4fdf70f42768a5ca86df321327b89094383648a236d8f74bd3e3854b110ad8d1403e428a73d9a13cf29a6240c30cc53532d60152ff560d1e3c3205ac557fc76bba0af547c69e9819d1ca412088a8665863f64cc98f3853e2ce115c4c3080e002542714efb10b8f51a59ab954885b313af6000fb8c0b23bc59ae73948e8b30213c84230098469200c8d3aa1f68160963b4dec95c20c8290783457c06b7ed61ab17077709591416a422e52a2afa2c61ec4932df188a4a0c056dc854acba8acd5298a6cb2de04c7c3bc7bc724157fa2b9d01c9bcb0624d79e52988a4b783e8a6d7c45115c548e0eb474368993d971e59e96d5c2a9341b40f461752dd73cbff7543031caf370130311c458684a80209565b754437926bb20840aac329392cbc4f7022eeb03580696b239b2993c9927f649aa838c4e88726f9633b8630977e85350bb25c130161b6c0298c03bcb387c38b4853ce8258166175623107f3d4c5a4b266c9978154e710f11337f05986e921b20d1c02d0667b42d1a4f09231d7d8993263a2cef7b3e5f153aa691a12b7ad28513eba123945f0651b83cd36099047b997ddc5128325213875ab7ac39b6e969693c4746f19a159b19b7911abf45a9215f5c9ebf60c46f254c27285e9491486773ca0f8848e23bc16d83155c302d0e42504762226701bb3a446316b9199860b824c1bb5bb2b4f535e74c493a80b3faa5b635d65364fc241a2e1366f3a2ae40ad07e6621ef64428ffb6c86a1883aa20d04b610ffea3b48e88e6073005e281e91d65cea99079e1846ce89c2fffc8cb38932c00783c9812d26f91937e6966dd2642bc1b494775f5acb46ddb3bfe70c62e2018cda8b16ff762ec3944909d034c27ccafd2803e4f392fedba006d672021a8eec76cd2c5b1f2bb65737a5369365c8ff6231b7866973201853d7538b27825592629c7812dda74b795ccc56fa684e8244a4b204c0b2bce93100a57c02dd13c5af5718084042e9d809eee01ef78166d5579fb0702deb07b6708c7ae2757a004d2ce31921030059c36a014df0178d59c7a7a7b1c3e04bfdca8ad4697bc2a36b5a213900249ce02a678009a4c9f8589bc24810e611a942ad468a2ae2d8af0b3b3a7d741fdaeba89f3b6c1fd302dae37f2d54ba53fb78e040991f4c468bc2b6f527cb985a9ae19797cf845c53803d13b267c8f31e4382791f0a7ed27a96ac609b40c8bedfb1a11d8c244cc85f4b692607d72f3cd05b070b5e8f4b7e0ba56657434296caaed3928f32d526cf0281a57960e5c55f6deb1636494e3d618d1e4431fce125adf544b91904cef045f1d088e159a6cff792ff5182386a87277953b4c4ba3714c20bc50e04c2b2b628b147d07291e24e18a6906b5300393180ed011b2c458d7e2a1f4604816a94b83c93c5160b740e3640707a4fe8f265ba351f4ff2c7fb75baf8980f136b2ba2e81cac3b27c2653c89b65ce236a3c0c28759b12275c4cddf5c14c7b69e951bb30459b150983fbc330db7dc3220420dd5e928ef5905a78a0b0e214bf1252765646f6c657aaec11fa775183c1ca3bb7261a2205e46d064239103203532556ca7fbf750d1f88ed6862ed02489bb30c976b4abfc0123583837a8db3f6a38bc5e9a44a990a471cb3e380b4508ac4162a4073f815507d33fffec823f9ccf17aa150a5bc7562a4e3f85995444c787d16901332989c15fdce4b43a215da66000525ab32f5b1d728846fea3ad2c092e271208b6f833e51c701da8854b867e0bd0234a3c9d98117c58ac1ac8b05f59f027b4a78e94771ee263792cb891e9d5abf0706f70f149482948eb6248bd811210765f93b4cd49daa19a17843e510409d6638dda571f680f02b17182e1c7eaa542e990275bd080bca0c793d3113d524598fc9dbc453a0560c556e7bfa3856570b570a1b43f82657458615be5080c89c0bc7e99a67a91bb9b8cb821e426b843f7542c5ce12ca13b5b7f6c716e63411681fef0ff85e8cd3fcde5abdbb9e471c37cff80f992f3359ded64b566956adfa3266cb05f171eb644711d3a2cb4b41646460817a0fce5836bdfe124a7448e7adf7b8ecc2652ac6d280e986682df71 +ciphertext: ee3f98af1d174b594dc0ce0558e943a69ebdec0a31ef0b0c7fa26ba7d9c80a64208e66389bc232fb7847ce8f4c89e1f3b3d2a201ef4a055c07a82f6564d3f1baf47564d11d9274b4c69b30003d98aede74baf75c2d7d76f9d4a7af78031117732e4434dbde3ab4c302054dd8158e449de6759125718081658ce91de018cfe1c37577ea0e396244ed732c62d5471f7732c8826442a374c06ffb7bc6c7bdeaa70981e2caff21fbb2330d1013cbd5a37cc1651c3624d2b130475cdca8ceb4098045f63630c338c40f8bc07dfc5f97a363686b13b7a759163215a060f1f971968644ce362f99c4201b483d0bdbd7029ec1365efd2a621fa738438bb797aa2a030158a7fdbffb2a5f1b27cd4a356c7e1d7dcfbf1e8a8ff0ef52fb7f7088452d1d15f42545bcc78c1cd90ab4e4a75b10588d1303877e78d6937c009eb071493b27c27564899464288d4b65d2c3aeced1c7ce69e82935443e1f2560789e240ef213d4521fae62506ac96d3176093d79867dca89e5491cbe53fd78dc66e064b1ed8167fa6864de9f1c29cb81185bf00f6354a38bfae33d8f2306acca3131db5aef13bd0c3c55f02d1c069a21a663c0f754b9c4016239bfe691e50da24cccf54fb9588a280c89be25a48e77f9e4dfeecddb00a06911a33e9efd58ccfd170d19009ef16c3a54a986e55c39bce875a61786990a1d057bd9fe07d57e143969bb5553971d9025ce7bcc0e96d01a496491b0bb8fbf886d8d5527a765808f2a78590ad5c84b965b5535b82506857220fedb7a1bd86ee6622a31de73139fd143ea6b9845c22c215a890936af8765a58dcc24ae6ea2240d5a5667b268490dea3fb3252ba81e71953e4c25ada1da0191f26082d80e66e6d1469c01bbebbc096e2700d98c7b605593b0ad895962e183c7a0cf0ab101f65f2329eb160670dd86b215f27025ef96a72aa2666ad9873474844518adf83d7e6714951da83ad15c89882df4f27ddfbb8e270445e403213c7357c985a5ebeb1db03d1b34c971ae11c986089d1c7d4086954e7bb17bc1cf6d6c4b4df9190265e2bf8f0580fa9b5540ca0dbc635d1a6492cada9ce0ed26b029817e366a494bae2e7e5d618beb3e26f0b9d8985eb23bf20bf097a600d9a06103e20ecab5d5c933ad4e2c77d5e72775f9ca84c0e71d3400e0579882284be79bb3df2f9bee359b2172943b9f4c78e85843834fffc59ee297ef0fad3e03212123bb957f1e0475641f1b4e6771091871e05ff6f2d8313882453c0fc6ba7a2271cc2985835063c0fdcbd2947478b7c9c728f77154b731a1cdbf0d928c326caae6d3737cd478b3af92383b5610ae3109429487fe009411b3fa6eada1ccb2916b37f633e1bbe6af135e95b0f0e54f079fd86ad11129fc10103a0de8a9105480f0369d763161a366f78ce4e679f1a9ded37aa63353bc9f47a5f9b4c63f9fabb2a19e5003b703ecc93233637568d211eb291b3d03b5d0846a78b0f4c9aecf442f0976dd8abcb18a72b81fda3c8de270855587225539d117e2f2a7a135d6b879a3240673c2622fbb1db86fa0e5db9f19ded3215ce5c9ef0b8851109e0994dcd3521781f25891c6ac10b3a38b56eced9498662eb4ab65b8f3d3ce21837a7285a5a2d03c1f8806665b45357564cfa3035f2b8bd342a21ecf6b7897c8b3fd08afa925360c11825ff3e96133fd6cecf35151a95ec05b82e342f4657c297716131e65c3b346e6647de6c92085e6d2204496eea67c97f866fc1ca0e235ea457169de6e4d7a308e4d348ac34701bd8f990f8d15f3d7b5dd9cf3f50d41b9b2a10bfeac96b9438c75adcffd46a60b23f5037b8b2d0984be210bc58180669c7a12b2269538740e776f9716154a568df5dc7e6e3b329f77f69a7637cc78e128b991a4e1eff3d3d1409ce6b110b250cb8d3e092d48b9e33f3d2f258fabce5bd0957c35b47fbfc6ab6608253248c2cf3210b6261146bdb6818cec194f42ef1485ea6b467227a63d461eb7b617105ceb28126f99ae3eeed721ae0f1cfcd05206c207f895dc4183282478acdd1daad21dc0af197dd8763d943199042c4bbfdb84ca4781a3056ffb3031d3ee3d639683b01445a9d82e3a18a7c030da16375d7b69dcc5b533435acf8a3b08c56bfe07cad6795b5a1f794f73f94489579d70436a323ed5f10a9decd33f0d5baedbdb89d2d50b3aaddd515b9ab879e7e39e3e06efb9f9221de583c36b +result: fail +shared_secret: + +# Private key not reduced +private_key: 6e0fb73b69cadc3e7ae9c9b09a74634c1762b30c55e793c0fde5d574eb6157fe52e7dabf93bea4cf7a9aff3fcb5f95909f2cd45bf9c7c77ce37c6c4a4c27df837f4c33afea2ffb7250ea6fea58d60cf88b6aad506e2bac22aefe4ca5806d15983428c4d703f947b6a4bfc7f18a4cc2b09a343de3ae2fe392ad6a555c035ecd1ae6c66339291fe9bc4dba2ff5432524cdb0ca32a7deb8a9ea96893c3864494e379d647d93e8a46fd682cbc1973fcfe3ef8733da34aa9eef5e659cfe99b7894a88ab0ec3989f85814ae49e196ff62fd6ba654215985c47f3bd24848e0c959a93fbf0c3176c68188139c7f929b83533fada70e44333e9f3512750cda5f0f98bcae7ce6644cd80fc836367aa4a39c88f67cdce0a4f8135673b0f09529d0bb1e9e4b14679cf41f433bcf533e7e4cb1db4b5e91df18f564fce3590577d6f9f19ef6b2ad4202699496ef74897eea2b7c7fad9e411d7da244e8a346f97ce77debcbdf520c3c1d148d7bad55100ab3d0a8b4e87fb5a5e2e925a6892e93c3c10a66fc4974b282ccb9dbe34aa0aafa86a527f96b2df98ba19eafe5376e4d243a19edea095fa37ea0d8607c882b48a79b44d3f7644fcd4345e6f6c95327965c2f860c43671361f4373fb54a4aa72854f9456fe637f56b4443ab049edc9b92f89f8df340c2547a3bc8e66343248c5e14d27cbb1ee9a6a6a82c84bbcb45de13ed6546015fc088c555c27847078319159d48c5a9103dca6770aac9d5a75f84930d6f7cd5813590b3fd40f0afc9b73eec897409269d37fea8547dbc92288414eedd2a4c377e60e800aa49b28e68a528a331216dd635ca58464fa855fcca8cdcc3ebc4e3f46a5a5dbefa4a7e8b1d7ef962f4f9cbbcc9376737c08f8b25caccb4b49cf5adb0eed96e4d83f319582edc68ba1177bf7fcfe2b4eb0686bc6678b8355cccb7b9a8519aa68b49d67dd178db2fa8ab343d5efb7592a29a8f49b926435ec1ef83d765e8134da35ec07ca4bfbe0e20f466eadb74673b9fd7cb93f287ab4f3f1c9d4d34dbf6be63567f7083cc87ae5b67535b2cf35c7aa4ab1eb5097947b5b38fe15b888a9cde0e8596faab4e0f6ca7fd358765ed97e5f8970abd54e36938709f6410b779077dcdb0115fb4138f2ce256f1545ffe63e4aa2c4ebe47eeec25df0b985d77a4440072964568e8b90f6b85d5da3fc55d6cc48c1ad436308154c5075755c74e9ed8af6766e841cc56b4296d8ef7fd4722faaa674bc9bfe8f15d5fbfcc981fed362304df896d7bf238b980825fb4d8ca1efdad92569595deabe45f6b35c8c9b7293a321e96e9574726dfa93c7abe62eebb0e7a37ceb8ef7f01e79c728c22d98328b59b86ba4a85e2ef49fad8a3e594e7e0ef20846c8f7683f5b856ff4fc8d64cef9cb1c8ea73ae68d7ec56c166cdbdfe6e17d97e90cd60f458e0cf6bfc5f55117ee61938c8df6643b6d65e4ecd860a447f694fefc1fc8b15538d0802ccb49de6f4fd89306e3daf89eaecbffd5a6235eb9343c6586d34c38747b3d6db7cf302e5569c19a75b2cc62d389558446e2859def368766f27a83cd376953dd374316af69dd6b3c34fd7188acbf8847f55b80750bab53cfd43e0edc47dca1996e31f2db9c9c1fbf4664a3db6bc1859b59b468c0f35cebc8d8c74243aa3f434f044a408ab988a69fdcaa3e7d35b8344e55f73f86f59d8e3ddfa9ee0f0f664a4c835335fc85ca8531c6e96bd68767cb8010e9ffd0cefacc9c931d169b9ddf47aa2c8c5fc6d13cf65f0ebc432c38936db3b6ec983f743aeca6449011bbb70f5bc7755b58d5dde1455aac47c6831d6a33699d5e6c8ddc987cc911bf3d3f4d6e81e56f29dda35aa331f7499c64bedb2eea5dd24b4e7c173d9e694d6c6b7a636fb26ca9e63c337ff3fc9dc9586548665c157f935aac3a8b653e089dfb1f3af91939f33e7c8d1a3f718ca63299ba4919d9936d65a2b78c733bdfc15f13cb4f55f52c8dd4d9d9911bd5f93d6e983fbf4f7bace808285d82cacd499dea722be5f44cdf4563c494a9a5491c30dfaa5ed5f89e08cc76dd83f4d16b3ffcea5393aaa525f9df7a4bc88bcd7010b6de68f7be3acfdfaa28610db77006a5577adcfd3384db6ed66341a56dcb4ac5a3eaa431765d006caf51766a01ed7f84a6bb032fc251764d628b9cb38860c4d8cb35d29c0d6263d9020389240d058974e871ab8e433196680f50c7b88e6a3ec8764b4509c3764bb4db404a8e932413930dadbb5c5d60a01539763428cdffdcca2cd0554633367ad245e069bfdb397b803c68c8543583581bfcc9bb1147a2063262774706dab0a015e7c57e244b12406b0009024fc06181bc058b466ee12c3ecd1a983fe1bb030774db831ef1bb26539245caab4d9954bb01901c6bb66534b95cdcc92a1af075be8a949829558ce625ace38b1296a75058b9a3f90e74e04ff3880106869899e6844a6504b8a0cf99ba86c72cba26564739d0221fa20fb412828180a14bc570503a033eb379790a457f9277a221b75720537205cd19969149ab9d2b87a19250b595186454c99b46ab8f03365200424b4ef8cae2569ab4bc07b98acd2e50b0426032f967354c70b6c1f1a1df32406c296b0e9b8066904fa2184e0dd04ad5c27f9e952774bc82a923ae90888613144bbe376b38112a836b7d6b0606d25abdcec0b471a834fe20adbc78a68cdc5619089ae4f09b32947eaeda996adbcf131621bdb99173063f98f1380a324f84626212f8acca34205299399e62b321030191379b8bf96ccb336498d2a8bf573f44596d0db92792122026b61264693be3a3a7160a9e60fc1fc0897e5f602483d6c81f382e3e237d6709b82056976ce23d66b013ea48cb56d78d12c68dc2cc6fdc7aa1142548e1940e3d889c71e990fbb19d4fa0bf892b5cb873ced68516e544bcc4bac3734215201c617767757dd3ca2b0a5084002f175995abb6a7b88892d07b4ac68b974ca83f13722f028bad4aa9400f0b755fa3352c90673a44be327845d1dc1cada0996d57b62fab1032ccb6eb947646fa25d06495a6577a17d707b11c3e8fe82325d21dc2997d0ada9bf85b45d8e5431ce5ac571c253744108f91aba0b2868c7096c92b2f53fc5a0d996cd8414cf230cae4c58059177607040d871b8b1da28837c7ab177369fd2c05fe300da0d84e97497cf5f22a36b966b5872266202d207740d47c8b1fd118ab390cd5ba70bfd9a0bf8b59d14b165575a079d82bd0fb1cc015340a1c0a0c77c7f822cd2999c6f10b5aab063181775b7f42b2fbc813b2fabbfd76c0a5d4942df97c449cadac303ccf4790685438257a0093461f581c981bc61229c94a130372ad920d2cfa5cbec684f8986a7ecaa94275814cdc2d7fe403c933bc0038b18b28cc3eec9ccac49bd922c446267cd07b786de316012330ae70bc49216fcf6b4c7db2bbab55153e21089d04c3fde934955ba215d047398ac172c2b1a18c0597182e88a327d0f0968796ae0a03772adbb406a210f2e004810513f09712836c45cc11a0d8c8433b813e0e8aa380cb166fa93961a2b6765287aecace40cb4caa064f6b547f0084bcba7856898b221d362c9de766c7d447bc10925330ca87a8379ba944323c638f33b164e13731b0b92a134ee9d454684387790361b31b53c245328bb19185f9774e2764fd429e11e2a4851b222c4a9e504531fd962fc23852bfa3b4632aba9be4595cf5083d64522ac93b41c7409aba1b83ec51cb6a1c0bd0c24e35cbfff95088d7b6ec890cb5559c44553dc44822692a243d032ff75c7c08914d847551151052c6846e2f556201205dc130babd9483dc721d42f42cbabcacff1aa93d05a2ee54bd399186bfd4978a7a76d5d24008fc55ec40a6bdc899ea0a69ca22acdf8bbd14a5cfa2a06587728427865a3331c60e77b5782c37e79561cb622195656d8f9c0c8c2c560ac95cb0b986ffa0784ee17554cb2bd0d332645958bb68cde65b13d274ba9a655bcc8072d6681cf556c7931000b94a9436602f0a5a6fbf770a2b323612bc47190c9a88d4588d97c099ca04b3b7377867a6e68869fda2258083cdcaa41aaa798ea11ba7f6cc4838f2aaf9c5795f8137adbc4c17b491a59255e61ba078a9b4179cbc89cc3c9946c65efb9ca5ac5765f3570f673ac80c1d26b5af8f031266c65b4ef41f7923af49dc6eb3d0a0eac745aca402ed4b9b2de754bc3b7a6b54c2159baee1f560dc502e4ee6b3a3d6b4c1ac1e06dca9edb6775f5696cf91acbd9293be7a82244234de9869afb1b2696300331aae6c9332840145eb16b016f8714fc00020d429f75231f73b265272a936e404f0d57b79c6ca8c25cb7c8bb89284c4e7b0ba9eb33c0406a8c39eb0d5429fcae286a9c56be5839c10ad33e8a58374dff41feb6af202d9ad3f2c7ca61993e238140ce8550a5f0c39147130a5313c8c02d68de779238a80dcfd7c992d84b2dffa67493e669243d4fa38c46b090bdf86bc548411 +ciphertext: e08924a91b398adb3daac6ee525b89bc18256d7c0ae328ee197c02c77442f97841b0ec33c6fb217d3bea65984c0225ab052b8fcfa3955809b56cc7565e97037664738cd195dfb3ec7e0a2ae1477664913a01d6d15362e847cf99cb88d3f8da414569b8cc5afc61490f2be47d4b54e57271f9ce5c8e592178f070d4feb22d003d0224551bb529628357cc896433a87a5cd7ed2c051bc8b0c4bce2256d04dd6f33df91c3af9820d4fc5f99a15669a0049f3dd2843b6ba5022cf0ee81f1e17601c1cb567ceca60d6092c100944c1e67eed0a6c9a7a11d697231594eaae2876077a47632c4714b4955a727ac32f2ecb48e23698b47583245cc7d830c29c408af82653fe37efa53d46f71d22cdbd477ab034386c8241f0bca25ab3a0182b7fd28acd4b1e633f9adedd58a069bf9f20582724f33eed04dbafb95553c145705bbab89796bc21ab9a0780a9cd392be274ad451447be7a195b23126bf18cbe75f12a12eebfc96d9b22fd19d57c342cb4bd3878cd69d21aaf0c093eb7b7a6f149e4d6c214814bf8f1690988b794c06a5b1111c415220cea0acc02b452c6f2678616e52c538dc71b10166067cb0682e6367a861dc6029cec249057484367b5be34f9b5593cc7f92c81cb80e00b1f7535237369b82208f5a8b697a6ef4caed276a16b1b2916cbd7888d18dcd22567e92de1d0acfe7ebc4a3f96014754b84fdd8d3d46203230a71104b3c825d71e4995948414283b636e98d447aef4e9e96d3240bc99607f1a9597408c8556dc37e9cd18bd1be56d6dc73a154576dbeaf710ac9e20afcd5a41db8efc363a7d26ba223a58e08fd1984073fa6f115a616b8a8e388165df7b1ff1bbfae32aacd893d0cf5c0b260f0d0d809ba9092823cd83e58848cb17de31bec1856360ff6a2568cbf27829998e741b9dde5d765e971cec53cd94d1faa6ce89a8a57821be0d7c7dd56f31c1de1f49c76520a324b5c978e075af190b620cf7315bc338a6b60ba6e896496f8afb86f6f67941ce00846a5ac726264b3b3fca4c201a30b867a36731058d67255ec0ef57222d51d5e915a79068e36a62b9b9ab84767ffa472100e21875e1dd288c4382654d1547d11a58be3911832be2a2779c84b8775bf1285eb7a86b98647f0533cc7b9fbc013d3f20b492e06228d4f5b4c859653caac26d2a9cc13ecaf229edb5761d094386ae4a111e56e4e13c992bc994d47aa9c45c0ba40f5afe8531a10a51f74e1b8a6c71ae55f4af1b43939f1d299e396b1e573a25304c5c8d700d95ed1bdc5d35c4e6776be305336b2b26fbc3c78d2a3336607e5fce6f1c6d7a41efbd0b1185ba60092e78e2414edbf5ed1d3785878a5c029ea06b3ab0a5a3cee467eb582064c9b7d29cf826c0cf7e828fd1963c39b2f3e40731f2bd6f2723aa94b16504156a405ad041c1ed04e4c00c5e34be37128f7b57efd9729c544f13e16b1eba33dcceeffb7d8547b0eec6703609b053a897c1cde85871fde1142dff09a55e068b30f694064035fed0889ca095afccbc8434d75456509cdc40e42021a4f196c339e0379b5804c7beb3963d941a3482c96a8f28d9ceffa3513ce752a38290765fdfc551b8b996e7581458659ae35549c9a3593eaf9b5d6705b085ded007fdcc454b35d84bbb583ed1ec2fb74a6aa26119cde1554aa2c6ebc6c74cb1ce3c06b978371c9103d638c37d3d1d1945cbbec11bd5cf736ada2fb8767bca80e88db70af0018aadb8e3e43f3d08ab5f017ebd5c7ea661ec1fab82b8446a8be2034d29fb42d6dfa3cef966c1a3b6107198291aeadb8f29cbd4117df8ef571f3ea2df5fa052e20eaa89c2c757be75aa657678f0ede06157903fc08dfa8280cde37ae23a313e1b501f3ad51f02629189f2d6924c2ed26e3c78c9c90ec6ea36cb0be8cdc0016c10eb728c03e8664901fc9ef25ba20fc8d058070aa17af214bf7175bc1ac736eb22948511c8cbcb4f0d98ef25a73eedb857b43039b4729faa9233b4191fd0700ea3a8b32d4afd55e92b8602a640b75da23902236ca97a92053a98a4ab78bad3bd5cf202b452b31afffa6393c8d28d5812fefa53455aafd8ce3f953701e24820c19f799746ea6aca59e38430edaf1ba46b750d8b2441538f59cf25b437b9c95e3ca3856470609e569d5fa08bda01aae9674e29f96c1c8e22cc5d7710de5eba022766492e265d5f24330ca833dfb3936f7cacba046c761 +result: fail +shared_secret: + +# Private key not reduced +private_key: 504ee376e73d8074bebfa35fbacf5879f482ab77c1708a8974e6d9f4aca6081fbf80e6a4958d42a333cb8abbb1bd3f960c75776194addefd9925c6d5efe3cea15fea9cfc63acfa774858b9f8468c39f9d38434517c1d3e117abda963eec9db871c0e44de3b3e6a99cc091a696fdfe8e7ed99188872d4bfb2e4188c1935530a364ec8aea98d9cba4bb68d26ca98eb437d2a3378bcf4dfcd3b4a8f7982486ae296364363dcbcd813a2d434bf3f68788c035981cdbe8f46a6ef54a198d64c0d149732ad97cac43d7e1ff167aa8657ea521197cdb3585b4ef64b1f77d80824718219e9e8b9392a6cff56e56149eedf195f5491647fb024de7c66bd26e3631f3bb3f20c947a77e94b9c5de9793d56cfb800263e519f9889d8afc878b661c7cb2fb366b807e08ebbcf769ffcaed8a6c83a3651557389d5ee553eab150957064dda88ebadcd4e7a4e955f2858b797b39b650ee0598ee9e25ad1e3ae7a638873b485b2c8d867969c39b31cd14059d5ed14aff50484da83a8bfebf368a9d0a7954695b6695186b590e5c3dd27ab6b6e9a2dde3b78c9cfc7c966d4d373485ab99f6ffa7447fc51a4764fdde52a29acb154826479567b1c6aa68bb2fcf471e035c0d80ff578fab87e8cd3520fa8fbb5cdde09e1923748bc85fd0d8fcfdf8b773303df685fb03758fbfcc8a38097c9a9d8745b0681ad79710b4d49be27c1378d627516aba8e3d8287a45f498c90669d0cfff6281fe7b8eb6f1707de18eea6243337fb2d7ccc156325c43e16b057b93ef4d6637e8235a7e7b79e86b27f3223fb529e44d568d39f0fdc2aa7bdb0bf8332c48fe1b23fc3f343a2bfb3f12bee6563a79066e7e639c6bee3ed51f65e3c4793dd887b9ea26b90de7d76aa4aad66e4d53e87d9196ecadecedab846c6933a689fbfd156681503e951546b8217fdfb60690a7734153e79e9ba9a054aaa9b908605c1d384bcad8e32e3e683c6d64e9a80e8f35f02c39a6bb42def54865164c87cd8af24a614f46d8b24a617bab86e5196172d8ef1a7ad01ca4cf72c9bcd6f89b8ddce54dd761a4ddf36219fdb91b3da7dcb723b59c3f0f9be1f96e6933a5a7b8f96da3a043b3fea0bf7573b6f353ad88afa68baef540403ddd8e7e743ed79ec3acbf1c58e1a13d8f426ad5714c563766dcb7b36dcdaed08e7e5248fb3e2f5fc38b9c67381c3e0be8e27c163e3215d4ac2d58900fa0ab036e8deef1d86faf33a8dc0a86f5c71f9b83b6c8d7f3d4a55f9ac34cf04d79741c1a68ce356c4dad4a4f16406b56fdb4038f78bca2babbf92635dced3da3cf8f7e56186da8669fbd8af199f53cf87cb2656349b7dfba199d79e8dfaff8938a993f75552af1e8ee79e13cbcea08885af930509c68456a9e778baa0e4649e2c830455cf78a06849f088d131ce7642db26048e259d4458555a2d97e5a93957470e538448a7b29958d7119c17f6a38f09a8b441c371114cf1cf390b56365d7d7efe9bbcb4974d1bc9bd7d16cd6a4acf21828b6b7b56cc70ebfd6d75fbf3aab16ec9584b780793f4cf916dc5304354bc99e9a69c090c6513e16b6afa8ff2bfb4e0ddc4cb69ab1ffbed575a5335899dfeb76e62d29b4b07df3eff84071ef5bb85bdb5ffe8f4bc554b8d661cb5a97a83b856d6437ec5d3de82760cedb83a5ac4b0536ea02b6f1947f31efef6777d75a3863cdbc24954f74b4336da08a8f3b8c659108bc86dd1bc36e9643b406fd1489a880099623bf7161afc934f4b3369a9afa7531ec39487fffb8742b63cd5d59a8f9317b06aa851ed71d86791b19f4961daef89f4c26af45826fe65ed7c4404cdccb5a8db017f21fa3dff926fd66b4a1522b878d9bd8625adef4bf4c1cfcf1928773c8fb99f58e6a7955a2a38e6949fbedc1a794f7c6ec183739862ebb08ddd63b3bd1581d54b05d9dc94a3ef198fb0928aeb4dca18769b594dfb357e56bb3148ef7d4cfef83d68d0b48cb37c168168a478dee3b16b6e8d463fd47ca5f7b472878497eb9a60f6f98981d8c3056ebf7fd9284bdd6b95ca010aa80c60d72893aed804d6799593112c8ed61775d4c15a3ea54c4184b775a88cc3d4f7d9a36cd1e77948ed33bc099eb24dc7a099ffcd2c94246758cc4e49f04b6ed0e8fee43e57b8c18337293c25f1d9e650def88cbdc08497d49083aa0ef60349251ec123ce574a5dd6ca1d14a967e7177aae64d9678571d6b0b0769935a1a2a8dba53db6c5b7067210426c64f53542929b31d565bd25a480d9065d79852b0f05002964772465c3fca5f8307308055603039b1b56726eea02a8cc19c5af41309f145000d2aaed3038c17911677a2631242280c23e9816185c75e5dab43b4b04c8777a35721605aab1adab828f2640ec5b23173f6cf5d37ace602ce5af62108ecaa540ba46594181ac9869517502aa73ddedc4131ab152b53501dd4aabd79556476063da48c4978835f28500f810b77715257080d87247354302399485852314598fc6eb1f93feee6429eac96d37c8422dac30f473b56db0dcd2c64f1c18f91950e7984a88b63979b424c6d4a36220019881b5aaac715e426a6976a300ff171a29778c82a1520f42a2f0b10d26035613a1e0511720087be146ac9f0cba2c1929c0960bc16065748573d61eb195de53ab9ec802d247b210b747c70c45aebcf39229e4b938eff354fb9f65cc6b52ff0163494744848885ee577048b506a95112ed45466252783a4016f30e29b1928acbb448379723d51bc3b59a62df46ca75f64bae27aa2d9456c66e2997b48274f425004e6884e296e17912f7e387db452681cb32e7217566897287fe9c38622325a8c6716e5a767a626d98836cb779983c31d1802b0e0bca04bebbfa9e2cc02429f987a31f73274ce5320e1b0cff8154da331be8ee21cae8c5037a1baa4956b04833d4928a1c32147246002466716ea9c69f4032d33260c338cb13ea09e5e47957700c33bda9b147a3f3f64b46c933b7f4689d2797e4ad24df42c002a323ac0e781b7e8c8e679c949ca730826b3f6c28813ac24ce7ccb21136695c75b3d028fbf6ba94f5a06115c72bcb879d64cca29309502836edab5c7b2a79a1e1204161369c5e8b63dc513d0aac9fd366387f0aa2e736bc09b4dba05414659a6937264ba982b419342e8c063ec64b28663cbf4d12aa5a6ae5aa9056ae71c4f5643cff81ce6d7a8d29a250ac27be274afef453dd176c462791c249a817329142c00ba332851e50a01660a47e35bbf3890c23be173dec1a1d57a4837975c14269707384855e897cb44c4bef532a003409aea41d2fc889f572ab20c0409831ffb0222cc7246438a95fe4a6e32412688b2cc8c1963e38526201aa9d2b0963533b2fa42af59e61d53c4bac2bcc09e44c5f9c4963525a7c015244000749e811873a391f71315d1fa60c806390fb3aa80295e77e80158c665ead61283271a1997757e5c4dc6893ad71a63a1898fcda02165db76e252665153016c90bb9c8423cf8a1d371338feb40a382c2c3f99840ea96f99246044f4a5fa5cbb8d7473110b4a5238255e5c3d43463b055bbe46211d2e05812dc46bcd539c56a15199cabe5019220dccc1a828a5e0c37bf130a6df762e395915654b5bcb5c3eaa7142e1706697b9914a287513e407ed376354697144b33260eb966316c05dca8655a0436bf47967779d43cca5edccb932c023351542857268a57a74c4eb08b7809c289c5543cc3730594b3ea33de6e23a5600ae6a68cde3614cb1a80bd7c2379c1834c349c55fa73859c5a3ad45886286973f1363a5a536a0b08faf26a939179f873cac62281260868569372dcc744185a55feccb261fb0af1ee7a50dba2c49636e09687f4618667db136bb291f4b4c129fc7635182720521acf1d67c719a283c412bc9165d9f883db9049b98381a4412b6599316cb39986a9c3f8c069aedb9b5e13b82f3abc0c1cb70dbf0b5d1d66ea003676197c1be2c15bc6533a41804ce0c123fa55a87fa344d850af4f5b12fc0ae3610593e1bcaa1868571b2a618db9f1900c459376798341e4263c70cb94a9db42a04067f7a5310c606bd7ff661ef3508e6b6b6373c7ba0c872b8019676263bf912673c59a4c51372a2da860399222654518063c3e1f07cc6c93e91ac6b53f3c04516b76da65124325c59d4360091923d1883977a52b328c0d508d0f039696db843bc12c506b521ae34c9b9d145047293a6eb99686770dd587c92bc65aa3a4083b40e8fe2cf891c5152281744612b2598664e4368775572e4a03a9ff53e307caf081ca897dcb43061a404c689d934653769ad59d68475a8b0e7277bb280ac77ea7b1a1b6111c1574c6358dd6a472c49c264965f8cd9fab7d1fd2c5f4c3a4ffcd66e5b05a4879536aee3074b69c3d4e6b1eba48a8a50609e70baaf4c552f680f0b02afab2da76d8833a2cbc3b6f782b36a1f135cf64b6403e103afae34da038613e2853bbfc36baafa3c6a95347193f37c +ciphertext: df97e2ea928ddbc0fee9eae81ad53728a6a3a953ecb6e3071ca382f9357facebc3cfef5cea739968c1b98081b008096cd4a4a6ca597ae85b46340abbb9d700add2b26b14f4f9cf68780815c4f38adba9b9929a0efa305be578c55c5a028cd3ba6ddf750546e49bd4748064afa4997f09254f33c68bed867ee934f8b0a5974894726446468eaeaa4129e05eba9d5d1cbc878be4d2d4a881a3a8d71c158db0005c30855059cdc29185c8512509dd9567a8605feb883994479426b637dd3c068d47c98e98f18b6f69273d2b168bdcafbfe90579af203ba597cc53ecf12eeed9b6ec7b177d665bdf90ebfd4a9fe18863a23348324e9b891b60d4c720e4f67241dc6ce5ef766edb36b3599701b2343f9406fe97e8b7b77a030a5eea4219f07775d41a4e613fa41d99fabede9779b9b957f8857b795538ca11fbdb670fe2d96131b0d7944f75944c99fa7d1ab90ac25cde6149dcb3b9e128fe2c46e79a26479008a57f6a1155291950d0963d5f702ec4c58ca46720987ede70518dac5f2b8921cd0f367f9e0950cb44d9016ba078e4e22609a849a2a34bcd8f4795a3c3acf8e02f25d187b554dc2edd9f5f68788a007e05abc44f5d3bf9126ed5060e08eab422da200783549c24103f412cb9da9beb8e09a96f83b73328347b6e2dbd951194197cfea6ec0bb2ef3469d50c991e0a348f34cfd1af87fa1548bb501bb34aaa69e81ae0dc314aa984144d87cfb9c973bd16ea7760c9816d1ac8cc745515aea51eb7f538b4c7abff9fb184b34d01fc94d82e1b3f2baf0e8c0a491b411fd570e1d02a98fdf9f0098da68c5d026b07e97672d4abeda9ef0ce886f83584bf212e4f46219e95fd33e6cb90521ff7026e57108e0eb73bcdfb1160875a99f95b3d955f444321fbeb431c8864f7d387ea52ee3c04088b731b53ad9529eedde950ac39ed114a92291c8cc7db0dbf1815d5066faec5c5c943657f562b43c0dfd6059d631e2bff45b440c3dc00cb032ff6c3ccd687620457910a72a83488ce93dc99204adde3d38dbd3e0db8996216b5d65a11215e0d5865ee6aa848d51464f28aaecf323d32e927f024abd06ec057403ae7c6e931c320c1eadf2cc66d30b5f854f52f238d20720f2020b1dca40405f38d3f89a19161d2cad8e85534ff5a2a046db25c804c53667d1239df5bb6052d21f8a43136f694f3590ab02bcfa13221fd80838e5da3ab0dd3c212a2ee094d1be5933f71fb62f74422d38a05bb842be8d82ef68830398d7bd1c822fbe6ceaf6361868f6a05754b1aa176c4b84da0f93e4564e1cf2e47d54ab5308ae66ff66b0eec00afe8da1773ffae4724822e90d52a12e174f5a72f5b6f18ddac08290cd4131c5b5b9a5a1f0cbaf71147c4139c45ab2f622d0d4a9fffaa258d6ab7d57185bba9837494c1ce264b8eec129510f761483875802dde735ccff53cf7de86ee3b14fc81432bfea8c98e8f2fbc680efb73dc3e14ed27400aef7a9e834518360060e0ccbbe151c72144507d389233b1cbff481e8d89754d59b213ccfffc657cb1d25fae45b28fe152d73e14c29e49f3eedc3823a7a75bf38e8f0d2e5872810af32e5ac4415b07d0379edfb869ce7306e8e74fea6953066f12cdece8cf01ca4723f5dab6d44a4a60e4bc79ea7b0d70492c10537fbe5d5bb3b61bc3a497c1c78333e2923f44e3fcfe0ea24f768093635a66d4278e5133626c2be5ced1e5fd6e1f07a47d2718f23e475a39c7bf9fe53cf26aa1d581e447d3df277951201a0f63d0ea7c27de1b51e472ab3668ca5884eed5561140db1e46d8442afa25343d968699df67b6ae7f17786c674d60579093988bfdcce853e48e1ce54a5930544fc6548daf3b7a8478014648e7b5625b87c68404b9a71fc3bb013c77d4ba91f75bffecabb32d0a9add7a13190718cf61e7e9903b3317e97df05b64f1e85ef0a164dc986b44ef94e250faed57c94dfca9991fb0dc3e044c9d8d13080955dbc6a988406a428e64398aef8a9977a0668edb140b38cd38e172aa192ffa82b0b45d3aa9edd568019b948aa10df147b1b60ab95bf9053e83d9881ae88ec0569fb7fb3cddb167025bf545083de9ad03a4dd7f67108ea4dab51ed24ab192087fa5816f057837e1c0c3fed094ccd52ca892e097e11e1ba9d2e827555d91d3fb1c19ef625ce6761c66a19eac07a3ee51445e5cd130cad23f5bfd247c443106d8b8f26acfa36d80 +result: fail +shared_secret: + +# Private key not reduced +private_key: 68f4f9be33972613c71269a6d9cf8f3788df659bb7329478251ba1f0b7ee539f986f0ed64d57a4a1a98eeb6dbdd2244908a7ff138761469962b02ed78f98de9005431a6ed1e2238cc4065ee72a33cab77529c89121aee6774a34aa63e094be5a133b3bbf24ca44787294578312a9648d6b427cc630be94f0ac73ad7a5e75563b47169465882ece97a74719587f6dba693086d0ecb86c17de4429df64080b7083145c1cdbe43933b902d463ac1f64c53360c50cd5cae9f8d309effd67795fefa9273a413545f9cb3b6d406eb2d4759663feb0aab989b1e4fc41ed5f53f7f51d56879e57c40dbaaeeef6f6f87b4f4e0ad8a7666049c5c6af4446261aec274e432de89eb68fba6f8c846417f3b7a6449f268a7e8b93af9b8a9865fbf2aa940e27785a8f4c220bdde9deb3d118813d1c9749a345ca9d81819ea21ecbf028aebcb7434097b83fbb8dfeebbda8a8c3719df9821defc0c6a392ce5a48b56a73801accf9ccdf55c96ad21c3ad7793dd62ac413f9cb25a75065e68edc63508b13b90b6bcdcd1f7816d5c1e4bf46b1ebf7e515f8ebf6b946b93962469de91a70ec36c848c8bafa3be319ace46f2f4552f6e92967d3ed8c441b5ee88b0d407349fc59e88b76e847a11b527c6479dbff8548a5540ddc811d87f7e203b51699a0dc85820ab9de7a96378da9e48553726d35ef73bbf90c2d64520be6314a7005b5dfef5b6a3c69b5ca2ef5a26e699d0956bca47394567eb0cc4145fca15b2ca32a85e94694e82963eadc9eb9efe6dbb30e8a13d736e67aa86d1f517b134cc05ea6831a80188b54b16ed6366eb1419c4991beaaec6ff80a2ca421a84b1f28f7e544c27b88c1db7593fbf3a9146633de4ea2cd26bfeab57c7c0ec3a8bd7b0fae96db5cf1259badde8e981d9a917b4a7bbbd45fd277353a8e7b78cd9e79797bf41ed77beade6de9829c0ec6beba80923da1aa7f4e3ce39931b58c07344ec83ea1150f470828be43b33601667e46c66a59979b8b2ae5d9739a7da6aa19ba6def58dd0e3bff859b6483eef8ef6f62a929cec408974a04ec9e0c9c6aabdc32abbae27a36dc373199f65a18d4b3e41530870dd4c127c7926c9dc46edba0f99280a5360f29447dafd4e757fe10486c3c465dfe4855b1d8b8d557b9933f531c0b434275f1c8034518e3fbd5a8ec149883e8b95ab25dc051793384c9662aa795c94bf5dd3957fd3382ab1e7a9d6b333035650918cc924732737aaff69472b4f699aa9f88c6af4946138fb955385a8a75f2088c153d57275c3e7c97615c87f1e1ad49b544864c358aa9cda30ba788c2f7ede836e567084040f83f23e333a4d74c55e5face2dbd7c66e42d2e52407864f62c3d4836f2d87394e256e10e133316de51dcbab02909cd0b1d75478eaf45cf44543e912b4d31de9dde07e4aa3b37aaab8f7738048a5afbae9677452cbbfdedbdf05ca5b3e6f577892555ed3872bc845f97a86788a957799681100f77cef3f35574a6ed9ecbd49cca68c870e26ea7c9cc4b4d2f52bb5cff7cecd863959061d73efd366a66ce40a014cee914f734a9b79d67bf7ab6ceaf6afc1feb9b2845d2fa4dcb7e49c199cc7a4f885bf5bd41d04e8eebacabb51d67042b3c9d4fa72655947feff33a778fba0338ba0b6ff8c58858e48281799f94acc66a4e48b07cb1a5f8ae6de647251758a2b7ff19a34c6176614dfb6294646c5b95c59d857320dbf233b9aedf9ea68388f0ef74376ba533d06487939348d07d681063d78466b9012d6af71a76d18a4e5f063317ecbb394ccc7b5ace625eb1fa76fabe75f186c9fb3f785e829cfb1ad967feab658439c73ce93adc47382c63544fe5cea89a5c270faced184cb46be8fe4ed8bd07d2535fe571b9a433df99edb8d8f9ed794e58fbf468cb7b9b349a3f492f43c57f2e6282ee506daae679a54e50be986e284e6ca5466bdc8b3386b47f6ed3c0d7dd796b4d43ee7e279a9a31e434d36f5efeb4abac6bcd3014bc1ffa5b642467482dd59a74b6b4e4b32bb8b183c76d01bed9909cc79953da2ce6abee67504f1a65f2d4c5a305639b1aee31776797734dd535bf20545e37b336248658911e4c01c874c7f78bd6d88ed73356ebe5b14db386cf677fba3e5f8fd9a32039651a28338a08346976e3502ca86f4830dd34b806a467fc2a726a515110c076dcb486eafac9040ac0690b79f5278022f59bfc316494a782d92310489c9f93e61585b3bd292165f651a7017a994b2512f0a5bdc8e77e9bab7e5cccaa7bbc779d445e5f16b871989974d92d2c268bce10764c0146a683ae56c47c4644057ce8b4739031879bcc287b194cb36fab6916ff563248d04851c74a7fe87f4fea546a565eefd507457882cf288ed294783179577ee898bed18c97660bdb726867a2c9581cc13bdb263dbb414d695990ccb897fa31984734e3178e081856627b0a4bbc736a235b3e392b3996441198c41bf8cef5ec64d2f5c4b628490736cbbc076d8ebab4cd1ab4936935fa3aa40d941e85cb08774520bde23f24739400bd45b1b056d8a09ebb49a3e4b7209037c94a47084604697185bac8772122d1bcf22888f165546bb699b23b2262035135120cf677aa7f767ca049b869137999884e360518358852cbbca3f90643764cb30fa16cc009766c43b89e599203d6344b1081e97c863190ab57d42812d603ab56068283cd30e92e3f7a8989715479cc3735f3cb1ed9120e8b8c720ba35ab1178b426c413c5e89eb5483bb0fbed13a2fd0783ce4bdb1aca87d80000dd48caacb57c74b802c6b133817ab099c84f1c22383e57a759ac6eab76df67876e3591f32595a56a027f2087b63db7dc138cd820a84b09411da2284ac78445850ba820c31b1ca97f3e680e24201fe67154b935a36292b18857007953a848c49d0236406e7a320243fee64ac24b02952d0a02a57ac4fba19ce373e3382cff61160913ca55a091696d782f4134db83958ded48e681546ecf2be93c09a9bea7b3ff420c84a9107f4a75a2a1c40ba0f9e6060e936218f0c0904bb29add2305cd59e29d2b10fe667f9ea49cfd149d1d8bd62e549e08baa1ccc63b8cbc734a24017e4a099bc5a939828ffc8cac5fb5d388ac8613216f21942675cb714e32cfe666357413773ab5f6a2c405179995ef42635cc7db7238dd7c410ba529e7d7391556c5f604c38fa079a70fbc2e8b393306832fe2a8bca891d880209b9719eb4d2732581408a3896735143462a45f5e4267084bda97a9a5324a2e23a714c1322f4368be3ea5219c10f56cb560a78786c2a51db18c79f151f3743a7de67c43a35c63d1b70e17aaf4e4c48e300a73f9c07bfa776ee8797f803ca148aba782a2fab110a7c4440c5791354b25c1107106be979b2077d422a6d8edbc04225ac63c3705394c9fd5389c11855057572fb303ffa365cc2854a3bf620ce5203b21bcf7ad9c675427ca1294c7b001e37a02be18473d1b13d9c52b9d59bc267ecb1fdf3bb96c2b374e72e4bc0898441c47adac60c1955bd1a5096f371bfc709ef624078139feb979c9ef48bc0bb9100d0a97198b466bc5821978c87da85c4e4164ba61a010b5fd99435dd18129a6b379c3232f75c8789d486ee3b6c84e052b55066e81c409c182d4e84926a42abac49846fd7b6f7c305e234130026540a6571d2c241c2700ed4e073d0262bf196164c71a62b904938cab91cf12fc8d527a091c20a86b163aacaf2f25d1814bf2d435dc7881b0f0219bcf40f90f894e74392fea065fd1b69f2e959cd0a5850b002cfaa8e44d0867a16ba5b173711d77f355a71bdf7674299a91cc05f2c772a5280177f2551b6f4a986f3bf584a899e755464166c3220130e694616f76cc3722c999536b6d145dfa5a27aa591ee994332893fa87acc2df67113f8a9c438abfa667022b92842c73b15047d6db08e02930a6348a71472a5e04bcf856058e785c10d049af83736b2f78f8fa0b16b0b7e897cb695ec20d37c35190a079a57cb41ba5a0f010f4cb94b585466c9a802f0855946361237a0840d43487bf65bd9f000f2480afcfc03b3dbba6ff053aae4981fc619d82818251c0d00ddb269042902b4c28fe6578709374f2461b0fc1a00441b78582db2a76dee8729be071ea3c9957f5a3e75934628081eb8339ca5cb5ae83677d4c31d7b12b0463b57bf7aae0af3901a9795085b8aed0564d3755588a0829615785f322add179edf08204021b86bb3cf8f3528ad652437ba8b0c6901cdbb748ee8a2d854644cb694668b9ce322992dc43f2d8a7ee655be3b257a0974ad0649104b6b4e9a16bb8cb79a42968ceb1cbbbdfc6c3921ae35f6b22ac3c2f858184475b4f2a12db3158b3bbf2d64f07ee186fc57de21c26bfcf6b645f83cbd47cef72136aeb64469835f3a1f1d9511e257abfead77d365076a5c423ebf1554cecc7b29c0a61b6762d7033947ae42ca53522a65fbafe18d3bc3e0cb66164e9a094fe4b44d8977ed +ciphertext: 80efccbe9e2d761ddac476b72e873a252a02782ae13d9b8f863e943ec06f26f8c080b9d34ffc22a8ef2cee0a4797d781da660eb80d6e5160d3d88f0ac65c68094abf9f9199d2f92c9fef5f8abe17e80237943a66eb26406d46ff8768233b9e8f059c61c8638ad84add34752ddb6fb9e85f784c8e33d2537712fd29592894cb1ceb1dc6f2aa9d26fff99aec7bf00763dc03ba44065848d60a8ee2536fd1761f209728bb62c2935bc1d28f4ec860df4f3f16605b31a2105e2819fc2cf0066938e3d54058587dfd4acc7d716a320c31ccdea328454a0e8b86e56da5f7da253955cc9558c270577ced143eba13ece0d597ebe3e0a04e48c704bff12ae19e7befe7d7fcc20ec3ad5736206c836afdba38ac4aab46f28d65edfda9599e69e1944d0ba65ec1807719cceae163c84bd3a5cfa1dfd2001da4c7ce8edac1b9c9ce15a22cd7cbd63c56eb27ea4c06907a896574f15fa98a1b65122fa94b720530b04509aad646b84e2620c8f511d9c8d2695c8aae14964a555d7e4b276d4d55667cf709ccba138b2dae4f6d796d8b146a920263b9664a99a9e88639030cc01602d0984c72a52b0ec87762480277dab8c3db42a19e9d8e183f50b777f7b2e2eb44fe34c8b3689edecfb3b94e7e7655487ba73e169c7066b81c18ddbae4bb949c329e299d37bdec28655ff7e1fab642c961e21e88442ea00648bf32b9330c31ae883bd5a359620f05f00d31b5f0585d6883d3f65e6644dffcf86342f9dc8a7ae2641fa3f7ea8bb72c1d9229bacc2a5730d77b04b2a6f54b0f935f2762dceb8ef229ccefa06fd885b022181fe5b29e90befc48b044d4636e649500b94741b3a4f7a4098514839015420dcd3aee122dc29b2216bf03a380e7dab2c56acc8c46bdd8d9f1b11a3df65933de2a419bb67ea3fb75cf6e56020a8075f15a58bb4da4bcc02182170c027e15402a2d5ab76b41d4a1b7ee34f7145fa1fd85f800d9635066675d4f91e5ae4bfae91dc172b19e36e17831c062b2fc0437bb14c3d1035f59762dde5df04cda8f16ab5cdb981dac9542be07a330836958c9c03795b08aff25c525f0f585abd0e9068c68aa205c1ba880ceacc9c8074711180bc790aa51fda9a7897a74539f79381ac7a1b0044a482db549ed4cb0328cc51e944fecdc1b956c5b63e177aadf3f857057b1e0d63117343dfb5c1fefc3934f64cf5af9a10bb8ae15b1c3266c49e05bce2f96d87be534bebdecd0b16dc534f95697fd4d6812bd098ef3e89fdade0ff4b1a93d77092d0d7324037c27f402dd0c434e55d8a61db3c2eaf103b6eaa851028b4191cb88e32afe42af49c6e878da887e7bb57ad417b1e1c190c434d79c3ca319d58bc6c10e9a16ff3bdf52b025023788e755e35806f52f7f6feb72c4b687aa72a1f2bdca1eaef6b496d68b361e56d552a0c8c5f8c2affc345a2f94ea62728eddcd207d5c3291eb455f0b67bb1fa96fa296de8e4f0053e47e2bccb90852dba79c7516354c7feb9b39e0eeabf64382cb4571cde7a4913e254b46e912350e2d4d7a01e825571b2804124943b025acc211224b06def37c8c537823dc24d26dcd28502dcc56559e08a160fcb4f03bd10fff9fa86e6bdd0327590b603b2064302e374abde67593c205d5f73e03aead35a9041442f7f0a2e1b534be07d0209c0f432939688f4e1fe0fffdaf2395a457ebdd59b7a5f05d79139eec13585607e6ed69a1ffec0f6d12b28d0988b8b09056c7ed48c8e234962a52948842ce7d53a6cf39eecfc533d40eaccc868d0699aff4b216a8f43b94a4b84534608e3f3a97ec7e84bf9dcd5a02dd7fe47d93134abcf78184ec182c63837cb16222282a499f9ace26d59d5de962e8b879b255540291017d8c3adde725727e7276959559d478d6edd243236f74ff49f8eeec7972af6dbb73839238068ac0a6c1937d63c1c8358161debba36f18e402e4045d6c5ebcc55d37fd2eb5e20ff13c2dd231237a049bf1cc6bac16f0444943ebfdbd139b521d0bec71d38ac891763b8ac87b093d9b540dcc326381aea049ef1ec5ec701df7c5e733c6f58291da9a53a611f7ce6acfb99d45f7374f5f536b3b0b9c80756c79944ab262f9c6536a80f51545d46277ecf7fa0b569721bb207b4ce8ca4f25c49a04dbfee807bff9c4008f5e017902294828e777131fd89b032e79648c08fd457010415e997c114cbfac1a6d496570b5cca27fbe192c +result: fail +shared_secret: + +# Private key not reduced +private_key: 4ffefcaa4baa2439ab1e4ca28bbb4f3a85c606a636cecd553e9feec2aab20d0394a0e3ac09c96ccf6dcbfdaae351b3ccea0be2ca7c87bd4fa1a29e506ba9b3b617a6aa7a705c26b7830d68da3dbfcc96c3728bb278be57ccaec1f9fe7c416aebc9e9ae5f4771eb38cfb733e1093ef167e6d74faecf2d5b4c04179740d3eba48750e206c8c584355fa9c57d6cc84d1c88bb2a43fda99cfdbe4da6ef85b7ecade186ed4d8eeb7a83b738e7d60be8f0e045f9c608937b4734f8237ff746b47b3460a40c9ffcbe8b6c3d437c4b55df55544f74bf3fc5758edfb4320974698aadb053ef577d580ed39c1e1645101b635a49998167f21af3d87229bb0f9ca04d2766d03d8500eccf34d4d730888fdaceae6724e5892a8044d780d27b3f3ba3751cb9c9bbf6e1756e4d2f15339d1ad66eb738a0b43b8e0ab0e52fb6505dc125769bd91fb1de3672a19764039d9d363d42d8c4a536aeacee43f45254b575f7ec5713a3de9e9a8a9446b9fcc80368be2f67669bab466c9e486a94a941fdd7a86e46150ed0512788aa16e11c8c3da2be36d3074598cc7a9d9aaf0a49da6468aab1fb56a724e4139840dc7582b439aa78c9e94c0cd1b0c357e894dfc583380a4fb26174838d558c6c54ef1e634ac69dbf9c1344b8fa95acae6c6c23dd8137706d4f4092ca5cc2bab7444daa6ee8e535fc6a0ab7b59dff76f5558375abdb009b4d6f1e74113efdae343eaac5946c3b379c7e69cd5b5a4e838a2b0a7811ad5c2ea6bf10667b4cd7a2e71b321d2395fa48a030ad8497fb68c87eb1eae67d5d2ef24fbe9ab34e770fbbffc29dd074e697d28bdad3035cdb09772c3ff945a9bd9b2cc20d4b488d04df80776eabb475cddaa0efd3c05f1c792ee9c946f7e7984686bd43660eb334bf775cc557d463dd3cde3c9830ac8a66879ea04aba174bd8594f5774fa930669da8c273cdcf347212f67b44c3c52063693abbafdf65f4a2949c19bdbbdedf812eadeb7f6a754bd893c4771a13986c408a2b2f3cb2144b1b7f7b67a9e77e1af58415cc91d44900ace7a2668d3a038a21fff911788f42b043e19f986ab2754c33c31c92dda15f860a0cd580483dd0c3fe27699d1d7e4afd455e950cacc42e891ae845a53bc396fddb6c24f3584c6b575a535e949909ca7cd96dd5e744ce6c25b57fc0a973e8bd26197c6eec688a6ce9596bcb9879b44d3be358f35b5a31bc3d8e38f003bbcf82a540993c7404de23c66bd32fd4964235477d5323f69c6a99399055c8347cbb443c9ac5ffa477e15f29467e11eefe2928b337dd6a98f59a303097537dedd7074e77e06830497a644ac404226b688d354237742fdc6639a979625558ba55d9cad1d6121d8479333e1e5dff341bd56f0ab54a5aeb5bc186c864397d7984defebc975bf5b211849ad36a93fbfed5eb9926f7c6b96233f129ffbfde8f2fb3eeac68de96cdeaca785463c56a7fbc6d2aaa3c8dee8bfee8ce8fec5ad0f844ebe66b17e7e33807ebc7335a8610fce28e65e6b6ed1c797ee9f75ef05cec6ec45c47bb97b1f4f53e52edfb0339fdb84a7cb4da6f7ac81fb43681ed56c205eab791fcbbbc3a512ba340c566a9e6dcd1ad9dd578d33d1fee66e7dc9e10583e71f82794b8247f4c2b248a71d379302c8fe9d275f07bac252ac4d09633be71dd2a2a7cc24feb1449cee1ae77fe9cb8677cc3a2e9aef6f3bb786a8b3b585946de9d9ae296dc6648f1695b66e5ec056e741c4468a3db6acc1c340228ab88d83cb168982008d9fb08be77278c89357f438beff3c2d99c813f2610c96c9754cdc5e3626297dd9dc5c8b64babcbfcd2c9d4a52d67a1e0dc9256fa291d6b509fa66de596516774edccc48ce3ce45f6f515848e8157d9f23d3427bb56b465531463e85ee6dd341b3e7f97c48374ad778293bf989529edc39caa3ef23b341bcee8bb17ec61e488e46fed0091ab58f18a7f33335d22de9a973899f173fef0b43455afd0a1f74c57de029176901dd3d078e64b30ef89094c16d38b32c2973959cdcf546fd34983ab213a4cc235d3eb4f8bf289d094f8e02c3b23dbbb89d35c7c67ea1d00e8dbd6b377dcbff09fbb30c6cd244c8782ac46e98c4cf614c42f48b49cfe8e14cdae1e1455a41acfbeeef684fde40ae08ecfff6c2b339e1013432fdf751e58553213df481d55ab1318e2c501e7d462cea98864e291c2c727e6ef2349332680fb06b09767a2ca72cfc078163c140dc7151d869a9c785ac62c6ade5f7519e070a08269938c7796b54b482f027a0c63ac24a6a00f7a0e7c65843e1c1fd01bd11d24ecf3c8b90cb803626044d03a39fcca7e918ae418512631898f417c9c9618055340a05f67b6f1cb7cc44117af09922cc07e9522285d16c42a7b2f833b51e72ce1c28a3ff37ab697cbd90d96b3e460c56c1734f1b11280ac33f170b3447c07f99a68f9a6f1dac6083368555782f800bc7f4409abf76b0eccb6da8f0825cc0c696cb9119340f663317913a641ff369657207194b65fa6b1dbbba94d22b512b56877120a6edc10dafcb2f727349e5831a3dc8a539c0a55a517e65982eba97930020608094b93e481fca819058537bb2c051cb2c3f0e5a97e8365a14491fbbc03f603977273a035855c414812ece238d254ba7334cc5bce7256716077766cc21c617a9c378fac1786c1cadecd13948591198682cbcf0cb098c504dc4b16a8269d13a701731b29a71432205660005919721c994011ca3c0ba8c3178a6d80b2abcc9f6e6b7880811894cc6e62c0134011aafa69568a1b95bb43c815c1405b4351a7290b856c50e284eca0cc384a4551f455b503488313a341aa25f80aa02c97b9d3267492c31652b7654621a59f1aa64ae4410a1099ed7f14aeb10485f794e61157c1563ca5515684db66eb99b76836a2441139a0906b35553c9e3e317f5e2c08487697574464a9936aaba528fe2b0c0c6b058b791d94aac3bac180b0609ab36b27579864c5bc6d8288292387dc4931fc889a45fc8bad636ae2bd493a5ab401311084fb57c6fd88c2f0c504d5c463738ba7c5a97237c1681d8aad66307ef648748198f6ea0c8fd6ba7ec424052c8a9b070c571b136cfa86f199542b12cb2a77c6973494bd41a2f0b55cb0e4122d0958026b7c54bc42eddc040cea8470f738f9c9916c158a9ca6457d8d9a0649337a3ec7347475eea8c34e8127636b3897c547c0479a1e22bb2f7606afd97cabee179467880dc02c7b6f892ff3a7a29844476fa9843943d68ba4df2db6b8368394b62cfcd257beff5b8b54150407c5529349769824af105adfabcc53f936a8a492825d6a9b1108f1ea258c9dca2d739a600f68616b2094ad29207184607985e3bb784d7977c20dc0585233131f93fdfdc9ee151c6937c7bc7fa4af43b3b1dc4774ce6273ab04736308e89e21eacfb81845678a0c220309a3c9fe3104f61680f334227670f95f2b84c137a964a0a3a57525a4b99b231a8f22830d5bc588c0c705189b2e8a19c4362cb50186b99b5a783031300a26300280f279987ec058425817327b481cbfc789f659530d9c5d9c8432959adf71741c1f9353d9a84836a5a5487392d19b5073a72869ba4e454c14ea5a93751322b8592e8566236a86c6619648be1782cd03749d9b9604209ec66804c64913a143887212e7acb54d5d995d0cb17e3e27c6dac70904235f5c9bb29d908d8098b11739b16706541f31b53e3a384e594a7a640629543943a1262558530c193d18079426708117197a90b1c45e8b394125ac46238d2e22fb8750d1c190824828280565093999608f4113acc18370509201056d589041d748b2fc71da15490882805d3d3c0fa0a837400b73d25688c698cc8d78d144a80aba8372bf7c349b9c395bbb8adfb885906402eab1ea58b622ff45c4dc14c9d11708659596552b18a3c0a1af2cd7b558f15f461f0501c409a120b4468f2c09282ab7b25f9b028746fbc9ab77af4262691a64dc43d59139c21eac58e58a491e26e10974e6cbbb82af385c4f77e7312ccb5194902257d3c4a4fa1a9035a670b5db47ee67c1b07747b889a6c481490462829b26184be3c9b0d7a0f9f2bcb10c8176f03464772479e9b84dd28ce94199d31845dff0614d02841f4fc92f9221cff071551e82dc829c9cf991e42265f94f7b4dbe7b791c244e37c3ca4192f70c32cbe9366db59a9dd8582d6e69d849151cb7c6ab82ab8e7854c7b4c15b1557443cc2b1284b7fc7b16e415007427b5a9909b99f21c47956c45e14022374440b70415b896659178d3c98bc4f3bbe904a470e4838849bcccc2ceda8b9bb1e2af29169d5919145b3229fb8c9ee705cff4d91fb9729c6cb52725321f208f2d0b39ed53edaba2c350ecba69a4ee1f3159930f65c8baac80b2e03649c5c2f1142a51eafdc3edbdcb3c5150c608d828b7e1b9c1ace00f9a548fce01c8e376fdb140ee343106c093af7cb149b316ba79446ceb4e5e0cedb9b164f9 +ciphertext: 4583baab569c07628c4931763b142daa34f7bade4707b002a966dae6982ec9efdbb2ddf1b82f2f9fed20289dc4851dd6a6e6540f63ead0986171ff9aa92ac558be96585eb1b3ecac469f5878a9b271f2388fc213578eb7639d018850148ed9af6ac2ef136e48a148d0f8b018d00f2d229dd4b89587782e4d3308daa12b39fba3a8b82de3e5ce1e381fa8770067ef16551b352893e21098830c2c973c04bc24dfbaef894d3c01f4410f7c8dbd7321a4165f9040a2fed09497db369b406a159db7a642fc840547804dc77050fbefc8167bc17bef43022eb0ac7badd682775a8f6dade61f443ccdd1e649247f17abcf2453ebe21c4b3af4eff0996f7b5e6024c809a385503a189b984b021e650ac2d182b947d6f248104b8592ef66052d80c8d1bfb612ae1d58e79d17df364c23841c0a969e9139068fe1b3a51cb992c255c21008a08f21f661be10c4f5199a7bc1dbed99d253c34a98504d85954ba733217545807a7e85f2d65dc77a054365a275ed9d4c408c0d10d9651c99bfd789f00a29b95c4a91db3c479a7a759ab00eae24ee49712984a28888ff16534b59c33e160fbd8980ccac1fb6a4c9f20761d9c7030974ddf02346869d9a95631a9bd3c87c3973693a5e6c249278f3b85b7e8011285e6757b908a8842749e93d8568e8cc570dead4f2d86ae4fdef2852f156dc03204e32c1c6946b9b7aee25a96ad20e122c52e6fdea2e1e37aa92d8f50b62ccf4cb3f44001a1a7ce112bad5b9dd005235fdace0741ff622168204981514aa2643e3c2c4c03601e3bdcafa2ba76bd326a86fc8334d2a3192b4033316b9f02a7e9fab545fc5580680363779137be9c49329d1264279d6587f1efc8a1591021b13af1627c172c1279ec61b23d51191efb898d8a9214df1cf7f2b1737a0e97aa45e813549f42e828f90c1e914093066a0e94da503932f931ed491bc43f4a8a689f89ce5e819f0322464954eb154046d3f6ff3423d2a1dd928a1eea9b496e64c928d18f57953b009c74c9f3b83ed0b6b9fa99ccfbe79c47fde9b54e2df8e819488cc5534e8c61dd6127615f3442384a6770ec9268a9bff0db2920ffb63c8b0d375781a48d4a11d08854f14bae1d25902e54900568a46e3916290eb3e0d7b47ec6669c93ea516fb93e7228e3723630247cc061404bf2a8209dee902ed514efa1fee05dda7daa39667c3b06b9ad0522be960264d4c06efd899333d61e68964c3a1035d95f32a4135da95c720958016b5d17b6da0931e95921aaf48ddaf762069230dba7f8d570cf42a78e0bc82327258b71f073071b8cfd69b24f3de704173fc3157c05389bffe6105cf0e81602600e18a0e3be22e052b975661db56f3c500c1dd2a99258b203ee2ae7a8d5b1b91fbd5c5d7c9d6b07f64d860c8721dc51adaf24fa2e99ef8a80a5d41c850a255be2b686920a64a69914071be73a460e806eebadbdc5ec665a4f26065dbaf0b9721206f761376f5709bd4cb34af09208970bc1825e460419e223c960cd7f7fa20a582ef9ab90b946a3017b375763265f8118056c7cb929f1789fab3b10010267515dbd9e3b0e0ee4082afb9f780b740272037cf0b83df078d4827ecea5dede4352eab5f94edce1e88564311e91d2cb1893d4b5ecfe47415025fee66241ec51f0896872b298231a222409a9abfb447779c180898209df96a4639284bac56d8b94f3ad67996eb877f01cca0faf9be45d540e2b350c7ab293cc3d0c49711e2b7d7856f0a1e297e21fa89a474cf96e2a1028007f2d472f9ebb4bfbd3b3dafe8ddb17c574c09fb4d741b4480f2e525c75a712d6127af50d95ccb4622d344bd9c2163b9014be4a050cb6ad7fa065ff2464ef4575fd208f910445cb2e0771aa1c97873ddb95a9f0b33c9936b4134f06adb22cd00c3ce148ee21868d30e890b44a6c4cd1dc02d15a4e6d28e31cddc125cb3fcaea52a184aa041708c4bab098e387f6b4862c7569ffeafd128472096841596a6ddebd47d4f92719bde6e6d5651943b68c820b6bf4ec1394a259651d2ad460ff28f2a2b9063c686f3df62c6562e9f28ea02568058e27ea9f2519e7485ac9c4028be344ef015449ae79874d22b02d94c9d6fc5c57cd49e548edfc703fee0a68bf7039d8ce4d3b179c0df80270ba9efe440fdc1a31120aaa88992dce10110e6a7a845929b86c4aeae473c72ce6abffcdac33f104a817f86a8d470f0b8aee3 +result: fail +shared_secret: + +# Private key not reduced +private_key: 04c78ebacfcafcf78072b8508905b42c5698b3c86d902dbcdd3ea3e19dea084b35924fd3a74fcf671c434ee39477e83d7314bc81a5b0a6ede0032af6dc55bde54c51955f50923e4212063b7e95f476364aa74e55e6e9a52bda41c17939e553c26388e75fe3c4d0fe3e402d543a275d6273f76e2f62d1a9596c5f996c4982817a4fded3924416b65e9bcaa45c6a6956c3725cdea427e757393b5a09d4de5694e8a6ff3b2ff10419f925ff5e169d41a0feecdef6dbb33b5bdf1ddf7e7fe8128e9c77e4584a89659caa85e7197588498ee8c8a8398ce158cf9a7c8b696653a941fcf57aceca7368bc0be8bf455ff2249dbcbb97eaec48fde3d5d11368cd420abd03fa8bcc35a99baf7a151f51581db3f61e8eabcc9056ad9b350644a59dbf83dcac4d2d35c81895ad53545d5b59bfe5455ab9c7caccb4418b5830838e0403a56619af355ab2448a69f2b848ffc4fa8f64d7fccb9c5164b7f306b109533dd8c690a5a9332f058a1978915244645fcef7b6ab92a83fbfa8fdb528aba0bcaab51e5fa54f57cf75c54ce56fbf7ab8414c9974b68f72357bc205de3d1a8d58ccffe781e7a83507a7e23fd195ec34cc94e25d18cb771db39a6d35e755421b969ab6cca1b79a8315b791da7fd7b7afdaf3ef6fe66ca583a943aa49e4aa3d943b7f3448ce639d2fa937e9e240839824547eefb69e8c5868f0fa6df79570dd1ed41d763b14cd8084b8cf0213a5eeabb0d85d7a0f8837e9138cd99349d5bfacd107f849c8d4efcf3f88fae9b00b5fc06bb665886c105786b466e0e9a431ff8a48db0dad35369843096f542396ea14397489ec1e93d256eb7c291368baa5d09e6b4ae92eba1839ceee153adc9b7fd5b6462d4938aa1f9898b9ce6bf5ec9af9db075f326177e2580a80c6e57d58bec597c5f6ced4d6a948abfa1bba5d1835ebed75537db8ffd5cbdf87fc5c68c4a7f66f973cec49553e207bd8eda5d67be6e5b12b35f3e84f6e7a8fd82e80fe9d4ac46ca901b89a5fecfda3b472f0a547901755194543e7a399c4363c33cc305345b79fad688afefe04a3e9a14f8142e6a77d4b7223d7fd3eddc8e3d3e5b2677b19fa8c1bb7e07e1db31f7e9a2d9dabc42dfea6ed74fa7d7fcacc8a10f4f015dfed7aa74153da8b80779ef71a86caeedbbafa7432d9d72e3cb4de09fc9264af1359e7dd24a687a492f0d351d3e9c61b5fed0614baf259752db556c8bb401dfc33dabd869af44c823edbc25aa2ec07afb5ec862d49dc6794a0668580ebd39a2309e5feba865a33603d5794e6f4bc210bb82b7a3915ceb5823ef0aba6a58ef7381bc89e4a8e7f0607980c93458343a12e26666c664832da7552c8d4ab349e0b56a1757e6e3f0ef80669653ee63a74ad9c67fefc7b343a7bce3cb5ac4c750d57c947bc3145b037d756bb8bcbf56d97ddef4c290ec0b364b8e033f9f70ae93d2dd3fd7e5ae57db50f1561fc3e68b52e727e66940b7e7a350a69aad45e516e44fe5f8f07235fceddc5b7b659f9cdbf85bc53195c75c447442e533b13ed8404db99a7346524964e312c48736c99a75e407a3661b49eff83eaf2f2e455483c44af45ecce5d721828313586665e95804f9a4e7d3878cf134a9e8e5ab4fbaa7125e7129d43a46963101390c20c552d4c5366b9f6945f6ed0893aa097481f8658122c3df80bf2a25dc52f9367991bb31965d35d286fbdc5d40e58556b2a8b7c98d11877890f9abbe139ff9bc36cea7463318c50486f9ed9b3ec39d65f93ce8b02e5a7eb16c4aeb68d7a057624ff5c0ac68b48aa3a06aa53493da790cb36840c8e1c4b653ceaeacecea13777aabefe9f55b66488296f407366dcfd3d355eb8c65f84aafe5f8f16cf51ba93781550ede5bf43ba4470e6bf1e4f36c4c78f781dbd0df79f98d55873aab6e8e573d89be9655497812aaea85ca6b95ac5e0f9d8d225dd69dee0e24a48f0e7a581eb4fda5b7c3d97a68e26c9f719e26089753d3cd72e88ab97796601bf732104acf744471bc562bfe4a995e88c36b8dc5479c0f22d4fbc6b723a2bed408e7341853a02d75c1497b18e34fe9e037aebbabf28bbb5c4c7ff22fbd2734bbf5a897e77f84d9f5fd9d3fa77efeefbda34378a64ee5e5c3258399386c49be2ad5b6d5d9724c68d42b5a9bf1ebc09de54caed7bfcb5e3256a52d4f7656b2b7819120a7cb68a80b91f2783979e1a329574272a3b154b52843bf80f88d947c79a58ae555e819674df71b13ea48741d103d345a8d4786eb43012fddb0b01c3baa6a0cf128b099972449ecb3de50020b025c486b4b5b115c78d927fe5e06bf8e29068d0b3d963c3b46cb9d1ba3256fba01f2185cb566556151ed2e1c993469190b75fa75259a5b1096d5a1647448013c21eca67a3aba096a4dc77f35c2447e81114f732148663a9439b1304b148b813f12c61654688d35318b8c0a8c33738a2f1bd2a1b6e8ea93eec771ec8c0094d4c6a45ba61579c72c2a41ffd468a6c679fc3d6b15d5a549b1614bc8874304bb6f01b775511ce5bcc7c055441ac72c34ca164f461990a57baaa98840439371c26134500377b39ad6d222feb0b67dff197c550541b63173e2b1b7031b30cc3772e97734ad3c5b6243b3269c48fe055a82c9f4d1c166c294b8077269304cecbc404ebf8bd82c041c911b09fd7c2cee33fee1bb754878d8143cc93b81c7e99323b5210e7a64c7a3b8d96c1594ff3ba50132484e663797246dc3238a1eb743c4a33c51c6587a224bec9bebcf5ceaf175dd37c3591ac7d82512e9ee7c4acba2cf5bb26d3a2188be321114a7724c797a2bb26cbe43b3fa03a8bc16dd5a49a68544e9feb51786c46794c9f5239b7584acff68a2f7561bb05e6b5505c249262b509a922e97c40b4736e8fc2af4017acce951cdacb3385f060cc1c55a4f79a60daaecc939036115d2f480f6f0315fed05387e99f9448b6155a51d66a6940519b361233b2b7b34c740f0cb64a7cf0bdc48677292b0d1ed5898ce928e9040308807cfc730be0d8c614d322735c1af2d2199ccca1dd80a96cb60247125cab18ce7a1c5e4f0c4b978581742c8550cc9c84b0632967654b968c01492557ba0630ec0caf04a443d9b2f616a9cb4ca13da38fd9d611a59bc697c20e8eaa0d2b96aa2db111bba3a05fb463bdf7a777cb91b1086adce17ded04be8b92254ec5442a6852134b5fde9b060fda258c18740b79970dc981cdb883cbe3297fa33ea988b07f9a581bd086d53507ce07536012a211c6b4de17b73a08153c3514daf12185416a81c61fe255a3e04b33e3c5a6a0188f6e09855ba504f838cb8417c2f0e97bbf5b937ff53848031274489b5366abeca2caa7636cdbe83f15980c02f207577b5efb947692fb40ae7b36dfa83b728478f0541511fa58aeb121c14056451654d0dc4421695864db64bc271a79ac0beff724b6bb2290cb64087b72297a6c3881765cd909aafbae72c9448b232093694ce522c72d2475f281ab1b633432175e3f78715de1082df66f74a351903b115d74489a32bb7a873aacf195f8f043922272cfec2798f52f65f4638302c62648199e7979f4740b30d38f7d794cad179ac960c838db4ad7038ab84955960b4822324c5d01c5985ac8f47138bab522db895af2f9a983494f360b061bc5120f385166a5ae9ab844c278008e47b655570430451cb606c24840b7a0e51268cba81998697a5653e33bbe47d43edc3249c32964e87bc8ccdb6d603c0f7387306b043fdb343e8500aaf0104683dc9488b0ad3d04a1c2657f11a99d46b040d0950d0937a4927012f4a78ee2405eabcac445845d7e88b54a8c57947b7ec0c12bf654059d93ba38ba2e50ca3fee8194053b2c9f10cae8c846710392733123b0eb0ad895216efac4931cc782e886fb2c87bed305cdcc690dabbeede21addf7468e4873919865b905b3149a4d686b7c96fcc014b578e1d36bc3b63449f467b09bc84a92b20b01bf70200e703a0ed084c860f40a336576274c7e5475835bcc8ec515050eb8215f397f6312c9b1db1ac1da29ff90a4ed58b8f8623d4b893e1ff94e3e48a0ddc5c221c0b34a798713897bbe16a4c298c5e9f44932b09806e554f76b76fdb8744cb38d00f24f5cccc75dbcb3f81233c454ce3664a807d82c68255c422866cec26ef6e428677b4db8f712abf50c1e11c9f014b9ad59077cf0475f925568300c49c08e4e17cb7a5581ddc17331eb3bd7bc04c933b646224d3386a3140cadd445b632268458f63942455ca1b164c9ccb2ae679ddb12524c34cf823b3626b224e466245cacbbcf57896b7acc6f6b702ce9000371473c622303db63b2744c7138363a832b2973bb3144bba8001999eef108e317890c4b63e857c6de99266629d3267db18fd97baa47b2da64fcd1f651c0028e1e5653a53302082d4e89b76b6b6a939a2f2f5b6b7d5931ff3ed6c50e860576285483bb5fd36e2f944d32c4317bebc1e441470c1372046a790d79d4 +ciphertext: 930ffe1df39f897e44077f527157207b3bde1ab660a8ecf9d3ec21c73b991ce3f65539a874da5cb458bfab7925748164205723e059a080ec253a8cc03257a7f7ae9063d457578a4ae84527f7ec168496478289572405bf84a958214a776650db772fb8b4123abf91d396bbec103d0b5149ebd23148f2d97ff70d7979d9d0561181a0e8d866f8839238ad8281d601c9d855db0917e5f167b99c24033b44c598e0fdb0b1951d18238a2ab8c0281bbba81761ab4bd51ee9ce5e0913c76228985358c09587ce471014e21ac316828cf2e8664adacdf20ce6f7930e3f6dd9033b3b9f1a37d28f8905c21c8e8a826c9a9442ecddd9aaf5ebb47c5641d7de702811649b1aaa75b13ef896b296ce1f2af0a69b746cb8b5043a986b1320c241d42b6d1e61aa55aabc71206308a3735bef5879e9c34ec697233c2a7eedce55b012d9a1139bd3c03c4690f89fe825937a3d70d18fc14c1e067c9782018e62498d609424f34407b74dc3ce04b7e87ac33e877878c8b8ba19cb3da78bfb8457ab0c47a4e307be49fbfe8a12af06cfecf8784e028ffb00d181bb705059eb841d51af8c606cb241cb758c6ed3fe16bcb87a5534b4f805675dc03b47413856b67555af680f43f64b7b5b0094f70ac6555e0b517d0f661a0c9bb1d3e38730d434f7364c83adf7da670f1e2a26441c1c856a722764c0a6941823333f65e82bf77949e104daf3d9cdede1fdeab13e8a6a0142caf8da3c2d66cdb9c8726b8a85339f0f27b56bfb446d52e799de9bd0cb33ec0ef5848982c4c2dd9367e7108b174b8d3b3c3fb7913e55bd05b0d5afd3a035f24ab614698e94d2ea0ef5288a50fc98d521917e4be40aa038fd3eac0e7594f32aea68b4a4b046d89aad216adc9f9a824f0ee62ebba49e2a170694524d97736be4cde034b576590e3e955a946acf4df8c5d3c794132079dba476fea76b734e8224d6534a212efc7ad9af83c91128b8c7ab3861d31b2e6009c7d7bd0d1035b53f518e32d442583981ac415d9037901d222b5d20821c80964400534ab05f5068feef04256d01f30b28c66f5f83191765c54547a8c6242f55a0c3d5097593cda695dc83f646153ab958d8b0db0c4a5564399304b7227b0424863c57e8d8bc954df042050e8de966c2efd63a48ade9eca925137f3bb56b067ccdfdd44ff35a890ca7fdc1a8a86aac65a6fa5898a6f287f73219b43a0474c246d686d3654322e3f21de06ef63ba6bbdc85c168ffbd670f335dd9aef753407584ccf3fb0e96bee0031bcdabe0b2810836197489dbfaa17903afcc729e56012a85d74a2ab94abfbe89671e9c67eedbc91d7688c6e34e1473424e604961976efe2c7f3710016ab858e3bf1ab984910f9f79884c5817cd2052c19daa950f6ed873c9e52c0bc09e7cfac132e864aac204b0059474936eafa4b36a5a017383c6827f5b6b194df7b6bf8d7b420331175e35eb7ed7d028dc956920d4072c2d8a51cd306365e09145bb2c57c56aac1ec5e6147a73de749de38b3e635fae41402df3a0090a39ad95fade379a9fb3ae3cab24c04823f9e36b693ea722e65d53b7f5e6bd0c4a2f3fe760969e0b9f03317132812283f0a4b20b277101b2cf8b37e0e3d2a1c23aac41515348ddf0db3758244ed476cb6af9ec2db9b68ef1dd3196474c92cff905d794cb5f963ea78173263465f1781bcca7430e5e1776de8962db7ada24eb5c31ab574469dd5336c4b3efdea3c218259cf602b571c0cfb83f996fcbb6ae63ed4b7ce80f4813fae069bb8a6e296ad42b6ccb5f19da19db41aef3f10d7dbd23dcef7673ac2cd56216b794372e955c197d4e88734c11166f60d753341b76f866322835d226199e69bae5c40c45dcd20f8fa5f83438d760ac1d6fba0b8560c36a423ddd8980559e65ffda8d78c639eef3a36833f6bc9efa8d7b147156e6fda7cae1b30d98fc4871f4d71e3f52d0996b4ef746653ace05b60957ecaaa99deb58a979fb269e522606982cf00205c6a9217366fcb0a24d366f2861f8dc538255bcc24199626fbb4cfbe74b5163854501d5eccbd95a3aa37bb565d7d4e723732193069e558e72add81bafa75fcca810c57611c181a0619035a2ec73db33711f4a94d2507b1e0a0ea2eadd18d5ac25803ee01b4434eb7a4382455b00c3710f98d85281c1f27cdb212eaf82a865d0b454064b39790efa2d7c93b99a22605c618be3f126eb4408b9 +result: fail +shared_secret: + +# Private key not reduced +private_key: dfaaf2dc6c97b1f4eab3d6b79d183b1ed95c6cc3f278af5155d380328f60933cb26f4f7fe1d6be2f4dbc02ebc9e85a3850c3d689acb277096d8d48cf9b3c6b699864fc5bd85ba86fd2c9f396dc384d03428ceab2173380603b49bf2668af38967c4e45a427c04a5541357771266f77f7956335da5bbead33fc7b390a4fe778ef991189a93b83dfeea54fd64457977f6c5285fa7e2ef35c8461c38ec9bdc3651dd7fb4bc86efcd5cc63ae8ece4b6587bfb0be374ce4aff14dde75117453d393842346abf1ad527e89ee485cd8b63f4bc0e489cf3f7eb536609c4a64643da3d1168401f9420ada3f4c8ed4af688bb33f6909edf3fa9dad064b6fcb4ac12913f90e93bea24fa092d7fb9b77b56f27552125d57e6a7e939ffea635c1429e59c186690e67beac07785e0a58578ec67cb73aad56d37879eb07d653ec13d8cd1cf1058892d34c437a5bab3bbc83f76db6455d7a5edddad6fdea231a7d426764b966ec974490c869e1ed94330ce8ab4b7cdc72d67114096692de476ec8f0af0eac8df78aa10ce1d2b898a806d1cc1878360961ed6de8d7f63d79744b41eaf1bddd86e55a83e2bd7aabb47aff6831e9ba51ddad86208531d22d5e8124b66b4da5c0e7f49a29a1a218be106d91cc8e35f65fb81c397a000ab92315dd167940cef362ba796b9bd7b7f2ae97c97d4ab51c63f46fc368c77dd5563b82336edcaef9840be54e46cf22beec490ca7e8c66cae89772b2b96e8085abec8faa8e33da4b5669308e692545de09e76486350e97ff9b433d72d5868533f8e7ccfd65d5a7a870daec5aeed0737ed769f4d412494cf77b868aa7b193ae1a5d66eda19a10ee8c051d456fe7846bc8c52a19f3d76e7b4e6bf7bb3efa03f9cf14e6636620b54b893a3c9ba9bb7e685476f6f601c8591bb33537b71ba4dfa15c8ed6fb791930fc45c0341e4ee7b9cf39964a4a48ceb4b7d936fc007c48604dc4265a8cf677ab5e97d148ebf1e8f67e4445aaefffc4fd536392a6219d3c9856bd6dea6e0f714a5f00fe68f4ac31a29b71e0a9db207c2086ed9c0fa762c7dbdacf3913aaee3fd94f9c48a6a3edb5d465a45e357332a8aeffd4e4325849d9325be55586aa9535f86ffdddd2696a625e39c0377585e4295173dc7d9fa5274c1572cd89329dc5513c990c5c1fcb67aefac3be248c9111c752c94c180fba60064af53d35ded934d7d7f856bbb9703fa43ae1f5e2866f6065869c21df7e0c374a28732bb238b4279d5492cf5e749d7d293b40777782c3ac846675502958bba2395970af40a3db515996e5c3d54581a94f0f848ce13ae154f5aaf593b175635b6db63132ce4abdc4be6e984e62bba9f95a9c3d986c7164000dfa3586cf0433d68b5266292a4d6955e99fa67a87f289cb15b85e7bf8099f3477c8e66d0d398bbaffc23ae319dce68ba7dc69a7d6eb87891b25d4f9909ea19da8300a49dd9df92390c41f9735ba66ce9fbb83c81ed83930edc32cdc18708a9b188de2544d4bcd5753eb75e269b980ec34040a4495d2e46ba6aeedf3a8f228bcc112d6d2868ac743e8a3623e8bf7d4518b7eb0cf65eb928f3b643392bccd2b1ed83593fadbbe345781e9c7527e460a891efc5e55938f700b8de65797e6b367d445cd2443fa5bb0bfc8ca6e9e1498adcb5fe985a9d03c9ef3577e8e15bb11ac4bb134cd8bc8fc2a90ae0f8785e93adf818e3e4c0fe62bcf5393ecdb2739a7272edf606673eec47cec51f484fabe437c688b4fe47f189fa46373864aaddf9dd480e1aecdff3e07d48c5ad1ec3d7dcc204b439ef3533dedfd98dcff7471deae103c8d9a7d4e7974e27c7e0a57cbd9e7a4509ec96374b648e6c49d1bdb0b7354e3ddbf06e5b47943af9c0c498c8aec1d50eaf425a604d7f9a8ffaf1a77aab00c67db86fb5a32ca0e73aa9f6ef319ae5cc419c964d4e8f19276bbee6af76aa4fd14f78d5cf8aebd4ca01b6999a5c806864da08cf823116a4e56468abc468fc3fff333f6bf6ddfeb313c4b4ab4d9204d9a70d47d699dde1ec3995ef3ec757c138caa5e3dce4b9e6d153565af4dfd582af4d2684c4d35eaea1b36e5614ffdc7c92291fae69796cc5aefc882c5d46b4a2af9874d91c398276dc2dd6749ecbf4850d9be265e77c9ac65623c65e0a896b1979e9ccc093ea5113fb59d4cc6b2829b04a621a204a4e63a2308d728b28c16652fa939d455181fa1b7b44447d1abc83e46f9d5c4133b104cbc1369812bbf9e83ae1e58f66f8b7c2e56d902cca69dc841f31372b783bc6421723ab0b2bc21cebc7cdac0cc3c55a3a088c0d21a4271264945766740af06ffa65275f9c00b44b1b3e6823d3c29c0a509bcaa2be1486972dc178821c40a203849a3abef402408ceb1e543c3bef193417bbc0c5679c13074063e83eff63af43464b3ce47e4b86953bf21583c2515f7b1025bc0e50454a08313e915882dbf556fe9b18ad27250030723db50e5dfb2380d8b74874c78862a1bc9083e1a8438e546ff9ca64c4a53bd17c1558067206056a0f222c8a4a00b2a92631179b6aac71fc711cb635b008f28cd69b51b5d7aa6839a1aca1a0da854faa39925cf606ae20612fc9c7573c73393a033cc8417d427db29bb6973546a967354fca3c43223a657713e150262e5621053bca46931248386114564cd4c0861d4ca648e789efc4221f7a075dd8b119ab7bb3f467abdc6cd3c808d1586199ea7be6e75c03916da4c012d8e81843f472c8504ff4239d3c0881e0e664f6e253bf2112beb301f19774e6998d4e8b68332346898087f1b7460b664d5d10b1ae199ba661cc460685d56808d6e66f3a78b6f5382ee3eb945482a1419a0a509a8909e8ab02990166c84905c7533159a9dc447f11f649e367486e2191a6c48b61331fb6137051b1410467cc440c8d0f9c9369b8803cfb33da7416dfc47db6726440028b23807c0f68804915a09ab16c47287d4eca5f19b98839030e9606815629b1e153a5cdb954f6e3281749040d91061df4afb67a5f8b19b30abbbe9b4b98b39182c4e48d514c35b515cdfb5bc61553c7ef047b17ac2ab3d10fe7d86a78386a0589072fc58983058a6959915b12a80ec79035c660afb04e9670cba471125e7a16d9fabea6ecbfe1d18904757b0bf6a459f0087dd193be490b4bf87bcaf772547b863eaa703ae18b58926aee14cca8015af2939a49e29d546b968ddb17eb62b9eaf9ce53949e7477c4e9893a40766a4a15cbc392c73b313a0ee3201431bf3d5555dcf73174f3299c2b88dfab4430c08c94183c27d1035c78769b143563a942047035a6c2373a03c0bcfc3973db4f8f25c002c46376d6a6fe103bc641608e98948d86bbe6e89d5405542587aa4821c30ac8756f07c593044570f536b4b07fb14b3236422d01789822aaa020e4acd92126809b2d47f49049875c15472a37b4b033fcc260fca04ab629474c9b82450ae6572d891a58629caac895bf2f52babeb6974be787397243b20a99f37b52ee77934ed2b6157ac3351b9c0f3405369885a54bc33b2c487200ba8a326b9d1674209924d3d50527517978eb040bf85ccc9569a6b3138f072084595825a994078a09bee86ed1e75ee9e759b31c491d9292fd2abbe3cba62661ad9440bbd392cb7d303cfab4bd6b0130af1c3336e2768907aff0633f18f9bba3706434b3bce7c75d6c40753b6bbeaf11c47773cff33b5067890fd5b8548e66c33d25906a066bc421617a909196a3986d362d3b80095e1077a5a087238054f2d89e0fd9a0d570c5ee2aacd3abc16111189aacb4d2e911abb7aa5099bb4a269d760174c324094fe944a4dc55d7708395f6aed8654831f7c3ecd85baf03c44390193634b16e1c91aee33979666edfb18d7713c547a90ff9514ba6469e0a6716ff4c0420427bf00b794775043e162e798871f710c87ff423d5580d873b7f624c96c7d63e23ea02b1c800914a5836fa73d7a748472b0b7af3099eb933f4a440ecd48262d4c9de4c044ee30cc51877352b53b0c1c14153c88b44931df12ee8520cd07117a1266815b74a431652d33074921c1d6dd6c0104aaa3f1a84e2f7cb24461290fb321d706113b172a2c7bdee921dcdc31640f9c749f4b27d024a7488728f605f8ae904571062ce9b36c009937f51722639782d56496fc056b06b8a4a6c3f402649e0c15eafa83e85a40eda43433c44b6d8f037487c9e1b66622c6798c94b9228c7a52bd18360e07ac4b057218469ac09b397477d7f5325ca47b901d0a5d0b6977194a12f71abfbabb3d910a8cbc52ca0dcb4f9f52d36c22b71b8513070c1c6c9a33397c79e4680862196cc1c3baea5bd04c58ab295b5da152a98a6ab3035b2c48478f30cdff392b47dc011e8fc82e0914e5ad3c8eaf0f76a57327c62bc9d4d63a647d85d1d66436cdf42ca198a44b31aa9f9d28b0311fb858cb5ecf74eb770f89d7d99d5c3e0d10d6ef9af054d842375f695abb28e3b8eb495100f04306e92 +ciphertext: b0ea256858a3db2e3e527bc33fd2d678666174c55219aedfab289dac80ffca03e3731f08f3499c6d0ac86b8ca457762ec1a49a8895eaa6a12e64314b43339e7b82b48930f148cb42208d507664f0c5e3d66f7ffa556a7370fdc4a1e07616d0ad0b482f624ec113d2743a4bbf2880bb9235ae5502c994ad277164d0bc7f4779cc1157dfcef551015d97cd77c8fe05c547be971f1aab0f0cb615af80fe622cf6188eec57bc3778ca72858ecc90a05ea89499a5b2a6e40b56b61cddcb49327920682919eee7abd4fd4be3b7e9d53ded77a9e5a543acb6f8abaa0d330fa8916d18a414c0dd4883b7b1aa3b1198e4339247aca326a757277463f2b414d46bdf5df3681763509e1c55ab13918c4b1a78516cc86403ba49950d1065a07f3cb124d059e5fd71d0617ea447360d6dab6524f9db46dedfbf4eda60b25274e14001e5413bfe7b7f0f3f503721715a03dc853fd7203b57c45237257a329d6c2479c63b4772bcae7761eae739dd12dc65d8d3786a8b28411b296633cacbe75395a10b5debbec79ebedb3993ff54ff04bf21cfecd4df1f1d791f5171ece67ab4b9d2a96fc8d233a778c9a597b294ccea9893bd9af82b4e2e10b1c159ee3cfc0f5eb867fb929ae518dba18831905ce0d9d3547ba1807dca5434edd9bce57cc1b83b8e02db852f63294247656269c5787b809a9358f96faaf07ec14731569e4778cb02ad894ca0383daff978a0ec1705bc12509cf33ef87dfb76a897f939cd9cd67685da6be0ee5de1eac34df23b287dd823bc13e1984ae9091ceebdfa0f404b617d1d973ecb8680886cc6bee5bd142b7b1d7dbc611afd3d54d14f8b2af838a862982ed0662b7c35d4566be24bc10d8d730949c372a5878e714f4750d276589e35d490ebc84444bfbe3eb3b9217bbc011703471b2cd518800b4d2de71f406cb304c11c3c33402864f81567b5a8d9ee510c7393726a8144ce5faf17ac318c117a9f8dcc18b44905534cf88894f9fbb9b6075821b306911a4470771bec3a1b3ec97376b4b62fd56a51a6a94cd74c75b731c53029a2cb1f3473ea2991d5d02ea7572b572381bb8d4acdd1844d1a9399cd3cf7b8fe1fd0fd3dbc4e9b15c92ea94f1174cf5ac0401bf24d9b2bc83aa3cb6e83d047e2b977ae3524b4c194b4a45a261743d055f73d39cbd0fb6fc80e65db7e738a42b470a075ed208aaba0fed3cfb695e8f5a1d4443db9a1a8c0084587657b8d557635abf0274a00fb8c9e2ef84efb8115547914aad99d18bc91286fd881dac92dd2a2edf1d5e6362b1f2b35a00bc22199b80ac5ad5ad75537466edae8c45e92f0238dda6a2481e0076a625f1dfc9df3ef76b2024252d612926105301f508c045d287e379391e86a24e49ea23ba017c4b771b7b77ed8a43f0cac5ed918ffcf5067ba2f59e449ac8bdee9cc855cee5fef36fa00bb9cd53aad816626b4f58d8342900ddd5133cc98a746d6888b86e420affad19b1a20b7ee43a30cd54398b6b9bcc7d2788907a2132c0832b032b46e189a1526ab44904275b7d1ec753964f739b9e9c2241a77978552e8c4c1417e9126ba10bfb854882a778b615456dfef1f5c50eefceedc61e4d685e1bafa09a1f38109eee2b047b7954cfa0937718c21c7ab4c389a57083ef935cb73179f4355906727cfd4e188e60e23c1b7c4800a783b93a8a22f780ef49f0b15aa58bd6a3307d6ab2aa2d801ec897834d431e23a54a832f515522ef77f608a222bddec7c545873c9412de81151489673a8ed28c7b914edf285f8afd4388bfaf257349686d840cd838b00dbd9c8d156768bf0f0c7815d6b4bee3f866aa79c07e978a58e5c9f739cd7508b1d050244a309d98155a711134f4f55aa1c324df55e0f39bf71e21171e2e540ed16ae2ba99f6ad2cf267a7f6f5770a5f1a33a4078c0e9873b17e23100f312939b92e70acf195a38495102f17ab500f8f02dcbe6fae0b02bfb9d290e1ff57956122dcf411f1e6a41e47a0289ff3aa76f94e565d86a0e13f0e49e534b9ad49bf538e53e4fddfdd9b9655482a5d935c38949f5d7f2885be3e80aa7050bce4e5b39eea1f966452afad6749d44f7524d0a6c8906acc07fcfc85fc92b5d1d5dabf514ced9984925356043b3091d05e8cb55753e699f3c1cc0a9edc1c0207c8ae13c1c29ab76ed3a46893879413007d84ee61de5f9b6acc654b25c994af6054d092a482057a8ac6adceb +result: fail +shared_secret: + +# Private key not reduced +private_key: 536b38508a50a06441236d94dd386686e461226c3a3d2fef4d9d6608f7a78ce66d7f574d479a7154c87e1e98f78409968859356c7b6dd0cda9cfc473e77dbd377849619887ac8dec3c5aed2ccdb6a9633247cb47e93d5d983b80a37462513bee587ab1a90f93d3fced9c785be97b7960e96cb4cbfa70454d5d6e9022cc647f1fb67f786c4f386f69cd3caea65fc1ce4d8d18d9b6ae81f3fbcc5456d37b0dbed877f64f167c6925f789e38399356e1ebbe8759db8c8c3c5b90ff7bfb4e877374d41a7fc152be1168c5d971740a37396759f804bc988afd3ee7dce95f71c8cb4a53c3ade6666a8f685368194b7dfdc0b7ea977f9ecf4d85c6c59af2ff18f649e165f998d67ec0b4e5040bf78c2195d16f7901235eed5fbf81bed5f8875dcb73de7781b7ccd534a0646a4e3efa4a806e70b64cc3aeb4cd79ce7f643d68d299b286730b2db36f2963ab52eb0f3dacfd18a5a02aa807b57f3110eac239ce76cdde64664ef465b832c448ad5fe57093c8d27bdb1db2fed18dfec71c64bdfe4793095c38da3db7a26a85c87c5b888f1c389bc4f3ccbf434f4d994754073605c166731a48923cca3a30ba4df5cfee7457d5feac30bbd8b21c7eabd66c8173a84588ad47454afeea38e6ffef936743195eb79b6548e749ff960c7428a7b36c75b5f549b66f2c3dae3cbcc501dcbf77f817b9b45305c7cf39dc4c8d6daa2d443b03a6418b8bb433d9f2eaefa6278f60d35b5c2e7fab42d617e1e4ff649308789a3ac88817498333f2c8e65f47a99755929b35af1bb975cc8d4c707e56903f127c33e706ce2e6ab4228ffbf37fbf214b66a00c556ccba44ee8465431f495d96983ffe6d9bffb8499e90068ddf01b58b3d5667f73fd984eeca9cb8cc1bbd9b61aff4b0bdf69f935d99e9f535dbf759cf4f08aa76dd1cb88a4fdc187c48bf88ea10cb3762f4d2f3e39cc25ead6b7c6c8d5db71e76823653e4a64c6c8e799915d84f50b37403077d41c76062277b6a1354d298427d3eb52446864bcd75e52f9b598a9bcbcdc03fee934207cbeebaa932ce8870e7787f57e8830a932375935759c98de5d74cdbc3a2cb6786faf1ad9f8b34d675ecc9affa0c8c0d44efe0588a8a6a398e994edd03786a1679838e5d693c9b14a6d0fe6bf65a94697ecbb5a973ff3a158e0eab8d06ecdbd176bb0227fc6895e237e7bd969f433cf97b340e7c32bac8c719926c4a8cd6788f4958d6e89feedc0c798cf6424767ad4715cf2f0fc806565b5829bb4d9980210566763999056d75ae1f612bed7d6c0394be26cc1c375c757ca776f785210fb6e1fa8f44ebee643753f1daa627799eb8e3f0eefe34b546fa7089d9405e9dd20a9fb76fcc47e373ef8ea058e367f51f4b8dfc7eafe83e2ed7693e46be701aa7a9e3ba45338aa4c9c2693ea5b1f7c03227c97d5e5e8a2be54eb9e0d7265aee1c3f16198905e9c3770aa5bb9f4fdefd433edb6df1bcdd2f6f82e018912ebec05606e4bffc51f0ad44d995be8a83a5560a4ca3c554ac538a4516db42cba3255332cf35f9795ac109db6715d87810e697d97a4c88fba8686d460aa493bc25b2cc6bb79e4be391134ec2934165a77f44c8eb1416799e0f7e488450e43c42792c7753a8ac4805c13ce7a654b4a1bd98e503a8cb3ed462e40a42f72cf80c175663a64657fb61a9d8cbc58452141366a1f34eddec4e8d4db59e8fa9260a68727431d8f36a614a8ffa78e774d6d587153aca0591d31fbc5c4af2433f67d4345db36878fc87ec0329e78a6936569bb778cabaa1ffe1b3ae4efff4a4659d52c60a9dabdc37350bb1ca3eab2cb3854ae499a0cda9f5e9fa117783f975ce6e1f97d87fea480cdb2ab584d754b036a831051ba25b7b5b9e1442fc3a7f18df710e7aa3d86b85deffabedd3dff756b2263aed2e1e65575ae3e513733837d4bc16ff5c2f61ee5d53608446b7db9e13ede91e2afd42adadb50e5696d3f66c79497253c6bd5ec20999b890cbf1c8fcc9a796e42e67d09505694c7e55b386c39b6ceb85fd791d9583d58a904eb66f462bf622ffc024b4a6f0dceb2a7bca62f53790ae334b7b6f06d6ecf546fcd4e3cccea93988eb75713fa844037aa0186df67d3ee8f7c649c9785a36e97c2593af38c8f56b849bd68e12c696825982b5ff919d9942ec34d178848f68d31d58c83101c3626170b992c2ab3c181f3d58b554249aa9e73c9e691be2c6c402755ce0737ca2e2524ff59d3397b417965ed4c547f8dc97252c58f4367379f4bc9da75b64b4a40a329952623f0615117d28af7cfbb994b8ad70b2540978242ca0609a082dfd70aa5910778fb1cfe537c5c1aa5612029d9b972aec8235466098558c1bb4fa2b84e1cf9c16300035a57328b460b20facea43d5502958b968547b60a3c9255ea20faeba1f4e69cef343a6f3793d4b0418edec073909b6786a38fa3337c61c8f7af5a796f41a3731a4ca6096382423c941616452b6a5438977445ffff43d54e7b787cb9bc6c95c36003d87b9bf08934996f7301618c5a2a9b6d5d802d57c02018b44b0d95c5ac1c46b910dc518277be4c8960400b14c51eec975976975825b2d574965c338c121a056e2b9c9cd88ce4111c0eff01db722734b296540ab44a40214646c32713c87bba448d349cd5b160db48411a77593886c81ac1b59d10b51e8338a4178082ee858ff3987e58cb7e2a58cf23c28ccfc6141270c5ed0b883d01092c3095f0abafa2c43eaa7181136bd6e2b0c332b3e78ba665c73304df21d83cc3915f9c8073b7d6d907c13bc4a295432fb0a894958b98c9629d6a025e3368fa234399ad0aa5f8c8fb54b9af1d3a18d1a7ec1b22e7f5056c0d97595a801885202ff8c9ce2315ba340924d1c5e2efb2de7c1a468b684c8f7a363eb98dd4cce7ddab73447a5d263b2cfc4129be74174b50ae359c69f086153ab30038a13ae21ab5ef870c44490990806c4936eff553ccd9ac01d90b1e3d54bbf943b19236b935cafefeaa1059823b1d928cb77cbdc0ccff4024e79219852c0653ecaccc3d9292a18783c10cce69732dfc4585c8a45138ab94ef2c84de2aed22b98bee16bef556331e56eb43c3d92e55a7c1bbc0474251a70ac72d5cdb9b2a9ebb9be53c0cfc037c1678a1351cba5e91bcf7147002518b8c8933cca1c34f9da03d2b70e885059b259b499901b98345aedb9075aa1686e36a85c6337f01b4ea2f2ab29939eba618c68c5256eab4e6c1a1beb334f93e99bcf3cb31012b1252537f8d1a589430b46e487ad07cfc5c58a2865b0a92a621006248a46c837f095109a3de16b24b2339a509284c9055778816e9656c743a8929cb622f3e34f0141c820d231501c920581bc259c8be8b0928b58b6f1e2b34b628301230fb18c3904741a0f061cb613b560e972b406c44e154724f6af887a345acc63065481c4b468423742e742582386c00f2531c67835f3c679ebfa9aff871f0b006c461b760fb3171b99c9cc74a5378c3ac78c87c847a65f4bcb5043a551c223418114d58bbbf6aaa4422aabd4d70e7d78a61fb1af33882eb5bc886d154ee032b0cf300efbec2acc811ccd2c6968e90f6d146dbeb0932a569896f96a91ba3298c57c5ebb4aa130a7730a996054b9c058057fdb41825a2323799bb0a51fc0018428061ab3f3c12a6479c3367810acc4aa869867f5888a90a1ac51913292a194f1b3d8c976902221d3b0c607714f4fdc8196859c939b499e511f54e52d059a25449068c39081dd59624a6515e282935ea454cae482ca990a378a3b41e0b0adc6702a9533c0c479a4f6176be1a9a081a357f5bb98f835ed13ca29eb969f3a7c759b43464155ea78067752534d1044be2501c38387b31c662e6b9cfc4584e5dc43cea0805e273d9e56b71fc924204c8ad82ccb315207afe34efea97f72a21760cbb629d6391ac85fe28ac568b1b96ad8b888c9cceec93fc08825429614be352c55ab218383ccadf0bad13862778bca36285d67381164f5853340c0b9516ee3916700f4c3b8326e497ba7966456b6144b87f70c89cbc07a3a553c60b80e01c0c7e9297ec70e5a3017e906cf24593f86d3b6d1db26004b8ebd7047339468183c20df37055637995522a8322b04618b123bb3b1cbf765beb8cd17a302b88166fb84a9bf1728bfbc57853b7de3f113257359f6b7835e9953da123bfcf545e5e3541c8620f5f58872f1192b67424b5a9909d5324a342fc74caf906c69fbe3b2384a2a9bab153439241d6065e0f944ef67c4d6873635b3650bf4cc4a4b879cca63b6873c8e681982e4a183557e0465bb0f60a8b9d97625065d4727731e173977a95e7bc2ce3494b58071c1b89b1866c85ff814aa4843f7ab5bee6124c2166757943afa3df3d5f59581246cddf8777c228d53729573ce2f4f51da212385808ef436eecdb8fb9f3c8346800beb4b9e537d1dcd292e4c5f9e1a55e0489bceffb204d672a6215f4f3980a646d9f880817c52dd +ciphertext: dc5913055a1ecf9c95b554684a294b4a03cb3406842c86ee29ca36f740c42c0e5580dab3b289917c7e3378c630fe329bcecd5865f474a9470fdaadceb4dd94fe7dbe4e1f0cb8bf149710c96080d8752e5bafd195e916d5ab5a9af587645a3e982ade25373bd38a93a14b5a9f09d13ff95a2943229388a420e1592751b2adc2041091e265f940d619141cc1f358b91669b5018757a71bfceb76fd04700842a9b3a84a238e4677c1d15374a34c0302b0ab5d907e0ef4d43b576a839efb86df9e093dd25d9f4792a31a3bac22589bc68c500603afd6ec99044ce0f49b23afad853b45e1ebaf9f5c63ac00dc05d4c45cebf345146d1ef38640c8a3f641e21612203f503c181c31a43519ca123b3122897456a83124b4ac4ed88f822bfcf4fc2ba8df4aa9bc6cb6573b8585558775eff7e84b330f25a5c9c72d61b163f2e0448a2a5fdab6e3aeb4d97835a1aee23f56281618e6df02ea0094273728342f8b5651fdbb19e0858ec10c4d2e07535d3d09b7a2c91b786665aeb0b247ad1abf4bc3297d7de00d143674d84d2545c84ffb166d39b8a0664cae9abf621121cdd5009eaff969ca3d68a2f6864bf9aa13cc500a08d650914e36d22ba7e7b485c065432daf4791dfd606223cb66b6bcca6e90b3ef6603bcde3dff4cac572177bde955695f0d72bba2c0a06b65f22a622c9ea109fdf051411a06a295a34265ab8a733ba1af947984c8b6c3ee8aed5bcd25ff26ecc46b8e70528a38a86c1de5eeb6e5d37147fd8ce1f70999f5c59602418f16ff49622a3d0a5a02111f6ee16cef7207ecb3d651290434f962b2434e727a277cc45156e826d3f1d5cfb0b1508781c077c0199bb567d545312dfc0f9ab768e02db41e9c4830cf65d047ef6e24865f8a046748279ba29cbf078e05bf0c63eb24f0ee38de4efa3418f1ae1f925c848cfbe8fda802dff00516e48e5d77142f0861879d6f63292cbcc2eaaff23224ac5041a779a6911ceb196d4b747e74cf4b770e9103f0934d95009d5b196e7110532a489b78d6e6f084af9abc6612dc01addfe8387fd4cbfb826a816f6ae28d88a451db79f5164db33b82c0a4249005be545346cb91f33ef9e941faea2a64984f05d777c0a4b5e34400cfc8a181fb385a84099ffe714b91801bef493a914355602f07ae87f57bf07aed84b7bcdac762a670d6b6674b9cad3678b880005c515931fb4c930c3a4fe48e1d8ab7f35a352c6d6c63f122a01f6138b36fe0ba8d28203520481496cb6483005d9b00c6b828b320344bd9a2fec60525005cb1185b9cbf14b368a096c6a676a79869921b72078d21a3f00b154a467027663a1157c14138cd60a52f691e156c3407387575bb410301548042dd9208903ef2164522e32276ee0497a166624984747438f5ff6da89d7195c725fb80680bbe9ca6f98e2de2c791a966b216d4dc8096acc625193f550bd84000179de531221763e2fd5604b7a68b7df8e1ac43cd2dbdfe0046b040708010b7be729c6c6e705def69d7cee1465dbb7af3b4a3dec9340dbfb548b153d11e816fd9fa3f8356c0e96f9d1c11f72448b631b63ef1eeff4ffdf6f7d66163dd2f0ab41611addde395562d420cb16002516acc8ab40cf12f76f4982cae50c0685d70371b54a37716e5a950d6fce4f4de34a8523654e840396ca498ea90e044cc7fe019204133a55c902819496bd4818528cb364a5128ca1f13cdff549839669f3bf8f0001c0020dd1bbf91a204abd21eca71cb52167a058b21e35122b9015133a7fbe038cd2bb57cc46a06cee96de5b0f09ea26354553c6fdf4f00bbf750c16d452f20043dc5b58e8a3ea04a19905a39d7174cc8a7af304c8c69f3e3c7f92a6d450f8820dbb906c98842dfbc66964758bf1a60892657b445c9015f4b1f3b7a720c63454f61ad925a60ca5288c490f5f47de14a0b880b19fae871cf15e67e3d8fb7d7a11aeb91ef8fe0d957bfab406200a32d83f9ac31a4f79139005b8d3ff506e65556c1df42ed2a723df287890e11134c0cecbb80e44d3e7c1590258528e2cf2295acbbacb41a60c209e9e7d62fa70393dd3e16cc487f40e0425654fb451680fea99406974a01fbd4054b8d197b99c81c1d624aeb225a1c380aad745be460121886f7eaaff265a237c25566315fb8613a623a8de975393d58cb6af63f4243f12f1493a6558c33b383555076c1bbd0a93974ac38e1012e6cea25d54 +result: fail +shared_secret: + +# Private key not reduced +private_key: 548b6bf006923aeee0a3699beffcd527e89da2e3792653549fb865d1e9ab9ac9f50ffddd913b83e02facd9b4b17a23cd1bbc9c0b46b5df36c3d5a636cda8d8e08b8affe75d42dbaddb9974e94e7c8dfe4ffbdb8e89fac4343dbab32c9bd90d5b0a1c4949cd4c4e2eda6248ad530e854946db4e7a950a29a911e432511f7a546f787d67ad2d95f43eb9fcbffcce1ac4cf4f979b59e47f60dae156096c0f93a21a3f86190cd1d3aefd1a23badb2c5191efe1e339bbc43e7e1b2fafe55f492b75b01396d0848894f3b86eefbccada8c55c73877f9d9ab996dd4c86c717b199a165cfe25d79f333d368216800efeefae6cfd899fc5f33456ddbfcdb62392c0deb2e7658c979b87d287ca63dd52e87aeafbd367bc066de99851332ad0e956eadfcbc6b87d471ac76bea98bd538f4fafc790b41aa97758efddee8f925f893adfd2bcf5dfc64667fdc6c06e339b2ce3aced139739036a724eb1d4bf93ee188d57354969485238669b755e4d281a7a5bbac250dae54fe898e7cb42ef6670891b32dd97494f75ac96c6bd1078fc682786d37dbdd74af04aa340cdd9ba0026fff1787b82df982d9a5fea0d38537b65c5bc68bddffbcffa87e24e5b79fb35dbdbb6af8673e56baaba7ed4cdf8db3d59ae0563660f9bd68e3d49c24cdafb59b36d537dabd8c4de2d63b0defb19539a845b51fb4594ca58bf967a9b88ad57f745fd41cdb8e79b71e86a34a8aee6a6ee3ea1e4d54a35a65e5da57c6ebb902d3f903fec5a89e19f0b3dcc2974038865b54c9711cacd1a2b306198f35f36a173e99ffa8fa966e4d30a94f20604717e8b7726136941e8dd245fdff3c599b633f76f6ed567b499da25abecc3fa51165f490db95fb66b6bce693f5f30603fbbb4d980d8a53d83d44f755bd798e6596a8ec02613d0bcab8d55574c93ad9ac87bf77383b062857d1e59e9e094b0b835b7858e76a8984ec639942ae9a5410ad649e6f570bac5ee458131bdbb46d3dff3c8c7b2d67cb21785b82a9367e59d395f8c82694d25756890b789ff86b9a755493efadb6f74dafd9cf6ad833be70e4ebaecd4a6866f235dc73c05e3162fbd4d6ab3d8366e04676734fc92699531f5f6c0e595befbd4f5f92cfc978842595668415c59592e42ee1e4190ef983128959dd4f5b71e83d2ba458c477e4b9338228b3ad2ae6316ec97662fb9eb95596628a3aad73954bf877a038887b96a991ca938baf61585eb22f9429a65a8ea4c637f63b313b48f2976f9512f7b702c6811b75564e58d9ffc3609479ee86fd5171c7db51776178afa83c74e406ecfdf9fef4c6db434adf54287dffbf45d679dd1f94c553673742c96b76eda9751fe54e61362d5ae73c806ccaf48aba8ebafa9648cd1b3a17e1358419ddcee9855e1f4623f9768198bfac9f5525c534c8bd7728bbac26cce8aa5f4e2fdc9fed37fd27dca769d98519185e0baeea66826cda14770607d3512767a4e9f45a276dade559956f67b7b1efdf0a99fc0aeed73367c0e7372e7265fcf3e9efc8e8f139b84a5f652f183c7f2f68c1c35fbfd69a586b7e6dcf5f2aab98d94587dccfc99a4c8e3ae6da15d9f4c87a9b11526e88c4787171c98fc1e466c59b3c83de7d9bced9e75f2b53ceccbe45ebe0ab6a0983e84e8bec41deebfb845a14a47c34c9a74234677af8b34dfaabe157f57cf6895e7586658649687cd754f832a2cef251ef07c5ec676c9dc41295bd609882f4da1710d8be7c3909318593857b602ca882a998ab0265f5e26fc60bad90287a9e7a3627909743efff272bbd2158e6311cb4548fbb5b093c29ee571712fe3381dd208759f6f2f4c6a9fc593337d62e3d11f0fccd52de54a7e90e9ba5df62db3fab78d69cfb0c18b72c8f67aaaed56a26ba52f3fad7d7e7472766f5be4acdd6db48ee38bf46eb1ff52b11d04f646f3da2e0c3f37456fdd29d031afee301c555f73b68e68e8f285714333b5e38e8c5d56d994985e82cd9448f9a58bfae6b88ad2e4bc5d7765ab4936ae84bd35a8878ce47a659778cad724873387fb5245974446fa52bd5dc5de7f0e6b72fe2ee9b2df4d378b6b5093e75997dd2b8db8dd5c67e13a30a9bab1cdebdd5007ce2d2c7f391a654defce94a77a83035f7d059f4026d9902ea9b4633a96d634c334e9aa073be74b792b18dbe8b672b2c2247d98c617419adcbb5027b320e54205ec3b9c37fb528be1bcb29624f0851a9844b83c5788a2332c0148c6c982be4ba98be6d9a54623b8183a66dbb8456473ace4f18829a56d1523497e1731c524ba3545652be97aece915ec25cb8c18364ff961dad655e2d08e14293a77963e4154b5d52a6d424a3ff976b69fd6c073b7bd960cc397d7511f76aee624240cf6430d612385a21a33838d181c3f77197e530463e952662e512a538b81e72913eb32357577319d29599ea2ca2e088c91681ebb295c5fb3c4f11643be6686f62b259c737c4ed37b38901eb7a79d5facc426438f6ae228338439d136ab68ba7ecb760a3b45c77f186c177c2f79f47f7cbc2a43da4b94371e4ffc9f8d520a9c1749d5b63b01a2af5b7a10ee47505598ceba4ca724f22fc15626a5243895db48cd2bbee25c27b171c44fa09d9dac21a11803ce0a6492b72d16803dc793cabab535eaa44eaa14b2d81a4162c32e73cb38a7bc945d0c1d6e0022e2785093d66c29e31616ba7ea0f58def02339ad231c3806600ba8612080d6dfbb50353b0fcc98dcab2c07473b34e05a556d777cb1982bbe521b1cbc58c680606f352b1560e7e4589b905b50c299ae8d3328a3729ac0420c3d23eca06491c43ba8d72af0cab1a869002434476bd7527f27b751c9364670a3730c52d514454e03386c66406a4b4315c8201db561e9b79c2ca4c60b25044e6bc1253465b4d0206fbf695470b4b7b8bc068d391f5d0b7e9d8028f1591ed916da33157cdea92ff46ad98d18e1ce6c4b2f75854733e913c5ad2d13e23ba51b7f8c2d3cb0edea793b55acc3995c97d3c65c0981f12913c88b56f62623f41e85a84543d4e4520c884981a3531d200ccbaec0bf1096fa7ac429a9b3bc1a2b38de159c2139361dca3ea805d97e67f61d10c0911674fe148b33572797ace2138ab478a51057306f010661d569ddd9a4e55e73f67f25f0db09d61f1951279cb79d814d1a21a4ff311be441bbba97d81935b31bb4dd558544babb18175b893357504589fe79170199129e78874882aa89b87c20bb03591f321419a41c1a78f87016b4e551c6928a37fa7c60708afc03c8b5b17001aa3088dca6ac9ab93fe5665f1781e36d7813945471f6945198983815c2737713f9c53a8e717bed4d9a7a706ac41d339001c5d74548388a2439cb0142bb6bcf2e23442155adeb4269cb39432d31455f0191a25822f35c889f2962ff081f1c1b5c55b9af0b14a414b618c7366fef512d94077470440fed7c2d101b5c9ec7b79ba17cdc14653b6c3179261a9401a0b20bfd201bbe243b8cd1322fc872c4bc29889586a8e302ac26b043b605c13c1300a68c95f269b2ef49402786819668e964c921f765abf805477ea239d3b8b203c7db303afe5a8c70158874981c663f1b3f8a645991cbe42a2498beb4579b314918c85a8388f31e628010bca96858a09e49365725b31d0726c0379709529c38b47e15678ac9625b28a763b579af908cc1cc45a5ecb23e5a6ced504b9e3101cc562be9714bf4931cbab020fa3e10456d23d2d01af6dda8dc6e09ec6aca54a3253f5d905d4b34b66250f80324060b1609083028a63aed377a7cca6a929da786eb080db750cf906c98eb9a105f288a36427519c0087e300705524ac343b2c448ead7802404417cacb6ca5a398c7e9c2a7b2855fca298ab1bd0fa9c23af9c5079496dfb2996a3738d5ea37ccbc24f1744eb9f5c672d74968c872392480fba91daf0c60fe96b13828bbefc6156f860ca304970de5695553a631a10c799b29b2585652065f33c6b53179bac6473b4dc2b277284181c7a2a9491ea422c5087358ef8835bf5711df91b38ab90000d324e7b6ce841830bd952e18583eab6b6a922427b2d094ea633cda75c94bdaa1a3d928fd2376a876ac0306b1ee631fe38987e50421389cb224d4045e260a9d34508d1739f223765a3a8f2699a8919b30f80177d9e141d7d9630b46cf5dcc4ff85045e62a4f0f86bdbd6367c1471ac4b22210771eb636c2bbe564578266b8682817a9118d95ade51031def42e0d9cb273c03e3f93ac97395d9f09be36eb8b2c21a4c74796ae501758b222101634d1668656b02cd0026c9eda07c0f3bb7d99b7fac6a78793bcddb2a18cd4262039723f41223d336451eb31911219750098125d62110dfcb20e30c6d5cf75212b294eadf4ac273ecb8bb5beea59108851b460166dfba8564a4a16e7f53e467431528a6e2d8b62b614d427846b701fbff5f48c64c049c6dfc0f1476cffd520b055756162f7ec94243de6b14ac0b9e5fb366c +ciphertext: b646b26612445d07ae9377b787af734d0f1bcb2ca61f9392d5b1d60cb66fd916a54da0cdb9aa35d59c7fed3a20728bbdf90d5f149600cc7bc4e36e577db66a69acebedba78142aa18ebf4c8e2dc5b1cb919d37d171ecf6a0972640e5ee2ec09d60f6c8574a4b626dce674cec73941c15bef59bd002a96a0d5c47e5c8149382c1149c85be6d96b0404858c1c5cabe68e22b85176d4443d491b0f320a63e6bee2c0459fea321b4fb70313fa63948e7391aeb9b9c28490d80b1376b852a33c7460a8227669c8ea6114665c91ea9bf6c90d7d92db6e8365d42f325be58a7094a40dee5050e53967481253a929966aa469ab11db9c3a388066284a5aeb6fb209a13c888c1abd2110d695acea81487cdc8620be72da3e8dc5548ad50e8da415238a96fcb0504568c161e9ae617b12409b25f27f2c6f3554136a429cdba75a051900e8100513c02cb87a360d38bf0ad7c636898fd98010d68ca8377c637562b42e7327e43cf6be833c1432155f86b28a0c5c7f70787fd021a2c5bd689f79f8062c94daaebcf499e89b73fd9217c4c428ae08db840738e8e3c12d13d2205b3b29ee6d4ba9c3593346d04c770d430cc3b016b6bb024174c5a912639f30f1252bb46b82c1cfe20c923b5bbf3ee18c072fafec4a3f332a80179adc86060b7ad3d5869a2ec5c88b10058f86f27cfc8d6bd3037c599ad60fa9ad7d922f788023bcd585046f82bcf162e741b1e7e2efc63afe4236c2dac92ef56508a7766cb6e3999ceb69a4379bb9f0768e21a2e49b145a028023863e202aae60f2c9bbdc34d65811ca1757a30ac7fae86678085a2b1c54acb0ada5b2ac82bb6ff15a4d08e3777f3fca2ee1b9ea69c4ac8eada9213aaaa0e3c49ee071ab9b7a337397a3f2d8c54df4ed13c242521b5e3bd80a2eb844e174a04803c68f8c45e0976e0042e85796346bf7e027f71d24b6ef4135ef05abffb64a2a8a92bbfeb01b733edc27c03a67d8f4c369080835d763a17f1f210b55d633a8f404d361c8de3c81da4118ebec9fb17b52a9d994e47b93bbe01a70b384ce738e08ce7b0b12f2fbf5a02d20d170dab8551467f00479d0a7ae184d385f6d74ae18f6329e149e8264f5f2e0b9abc6afa0d675af74c58468b45e4562deca3168a1e8d41865da855a25756adcb182c307c0c068cdb2ea292968109981d72e94871fadb275981a486dd9a658764fb01c8c53ec70fc52a90c4eab76cda5c3f5283c84324fedee0fdf9758e5094c00f81c7d9c239797abf10fbd53138f4ecdac12c382bba60fa766c7efd6482e4f1f66dd4348004e02209976b8934266d5360a85d73510fb3c40848f40f5eae1af28f85349510839eeab1beaaea9a5b197a60e8e130618e08a203d2d633bb88491bde3380271cafd119b84013d9ae0d373d2f6f5299f820d7aa29bc457d2ba102ecd9591e196ad1ffdf95fae9ebdb79ecb148b3deadcd0754bf9823a9a14a42611bcf20d77e8aad7d65bc912b2df657fe8ff43cee9a7bb34c1e119e8f69fa00d6a58c0543cefb0d35f970c1f349c7ccee8dc22a5c0fb653c394763695baec9c7ea42a8e7e7d3559bbf67ab7fb57707a48470fc54821de07bbc006b3ad877d7c660738283043952dab37b5bdb0c7f3e538f987396f9c65774efde07c0affe3f69360789a4ce7d681f0cde4d22361d07afa2b1b9906dc67c30a4b5da3d32274227768e8754d265139c54ae96207390067f97c0e1d791a413cf4e02f0cf9c65aaddc8d54dae6440786131ea9510649dbbc7aceb1a07be479cf6a7421c6ae1ae1733e3b19e19fbf3b6401dc6b4b27ccb1ef24f4525d88df1fda4f0b18d21ed6259a81572f8d4136c3d67a36f28e5cc16535afe95b1dcff21694c7a62b021bf56bde5a31eaaaff38e60ed4861282ca8d03cc5a869e0fd6e61b3275ee433784925f6bab1a9734949801dee45a9acd7bc074113ec9c248e4011646c34a321b0a8c566b88254449bb1db9a8a796ccf67f1937bc9624b7226e0c5e47edd520ea4cafcb0590b9b1129edb25c1f1ababc9738e7e7e0514618daede8c10f7ac4a26a402fb7fbe34b8c659c781d17e3305d7f29c43a4199d69de39c9dedb2183a037d576e985d1adb56ad3e7855e9dcbf48cf19c07a1fab67e3531d70c28e8a587fb3a73e2de6b0022e6ffe83c485e4d3cfaa7f480a419f23f0494abac17ee44dcc6caf8e196dd81634e1f07a18999b27cf6 +result: fail +shared_secret: + +# Private key not reduced +private_key: c4ba61e90c3a88688510fec4673ff6ac4953de3553f18dec4056e8bc69c0f57b527ee459f27ebebf7dc731fe841bb7d2f28faed1bbf5ae59cb9e793d7b2fc4640ba87e78433b639bb17ee06c0581809675c80f596af67e382b564c5e4c4d19ea13f35629bc71aca95a512f39bbaa7fa163e0af3eb7e8b97ab3ba783a27c8b9eca6babd54911c756095d02b3f9063067b077d7a6d3a31c28cf34fa36dab5fdc5fcdaca59dc0fb76d23c44d64f09832d43b465dc8f8467f13037d59aded534294ac0458412c58273f49c39dbe2d62f317ca8d67079f207b3af7417bef479f34bcd81b1884815a7fc7fbb3734fffd8a164c614ac8547ce4ccfd5a6bc47d6424c36d4be070bf45ca335a927538d227be6baea4dcc33bd1c68852ee8e2ff7cc7ea931056fedb15c7f1114e676855e0bfcfb2f9b8e9f63920858b3db1cba7005c5e21c4effa94428de55ec1ce432dbf679c45802795e10fe3675fe5be6e6ded53f6ca5ff30d87a59c0bf68f08362a6764aa35dfe280e72285e91649bb39a2fd0330a62594aacc81a8fe9f5d04bd5ab8ca4bce4e36860eaa9e4aaff7786fd89fd935d65632a7ef1764aa34ce64b424e8bcf275b8e5bb2a35f59669b3011bf39f21eb2f6584c3ee9bfe86d8d12639e72ea38073c9c461d7abbaa5c6747e8ec2c4a78ae94652d9b8efba54ae482731bbb3bad36a67653ffebde884ec678b88d4ad4647f8b39dd6ea879eba65ebeb9838eca641c954915a917be53088d8587ec3d7248668c2dd3a27eff9fae3e4ca7b66053ea7a65e99814ba1e757ab18d56b7d9c13b0334661839c334449afb77df6eaa7cbaf8ad57acb2cade02e76ada2e8a29c6c63849d823d6ca522e39d3f8826b6ce76da373d7754cdce78c614b98a59b4bc60738301d3eaed7645cf791b3fa33740cf0b16493658a7885735f7fc38fbe3f4fbdeb904f17b7a9fc7af56de3a0e8c1d3c4b9b7ecce171731ef1c97693695fa775ff055fd457b8d7f17bf2463811249ed1c5de7db07c3a03784582faa4fe7fa0a0798042dfb0cf49b5233d2b37a46e58f914ad5eaf20dd8ad9ea84d6556a176affddf855346fc1657eeaf569e666683ac7ecbb0748b6ccdf6d6b736e79fd3a41d39413e5650d4f0203ebd286643c635644a567b2d38b1c6746757e956c663cc2f0be330e7c20e94ae939c8ad10b9be3887b8fb7ca9ed360b2295f047f5047cb8cb87eadb18b7f1c976cb436ccc0c675f99575cfaf4675c358c3678b3dfb34520dcaa4eeea4fe8a34737c4c21e31b7f4d0aefab6380b45663f6f1ab8510e5fe0e3335a60fd7473a46d9ac73974aa4c8b1dae595eaddc7b4d3bd9823c7eaa1c0a7f2b4746744bbdb9335d7b26ef55276a1b63c3b5b4800d0344033d93ace786fd99c144655d6a06d2e86336a6ee6e6cab8b772a39cbb3fc68e84390b8dd638deaf5d5822629a758b49cbb7e4507c7cdf2034cf65c4a070ebd1b07b4e2cea70ae555d7368a568aa0e59b5494239d2e25a9eaa34bf9bf9b2fb3eef8eb606e69602cada4024780d6cf9cb6c63cef9e87259f80ea66f07b56f8f8964579bb878fff5aeebe80931aa5e176ad53a890b307d6c06f6861265bb943ed79f66b87e96a6724634df6a35b8f979a5afb1c23bbe585a001a936d548599cc8fc8e46f442a6481bdf9478fcfe389853fdcba38546f9640d30c919ee888ea33297d01a6abdeddcaf69856a832cbcdd3894f09690b68eac6f7951b7f3558a284c82a8f25bf74c6847c8d834aa4c1e8a37fcc87c4474914ed91bfe54b6273bbfb4ac7a3b34ba6c5642a78a23cfe3428782ec9ee94297a88c2cd4ecd35d6c548289285999b69ac46346127aa097fbfa080cecae1a944ae83bff25949e27af6167b73948e47bb97ad548df59a8f2f788508eb73563f8fe73c9951d5c94429ad56939b9c5bbf72525a7088977146dd8b0d5e81b0af8e336457375b14399e4bd0e89c00bb2f07c5eb64f9ee6956943d4c5aa597cf1376ff7083da68b7c1a4e529ff5509cb8fe3b4f4dcbe4673bde6439ea874786544f7e81bb7552510f5572c9bcd37cf8338482e31449a3b6a917c9947876a702b8567327309b48e2a3aa4bc8b979168bbb2dc7ff533434808cbced5ba7f567ac0518fdb5cdf9512747d203c84ed6aac91f45522a4d30a887b8f44b4e35c7f9aab819e1981647b85f7b73ac0b8ed44a9ebe203998771af684086e00a0ba098841e7979baa20d82b450bc35b88884eb935788dba47bc63247de5cf5cda3f069a02874598468c6651842e56464d9731cc027aa307da811c8c163d62cd057863a8c2764f81c889d718d10267200c8c2e7877d7d853a73287d8b1aef013c715f69083b29a589b8e2afbc72a76587032936899244d435f1df58a957091241728dbf57693f46accc214dcb89fa35ac97c77732d0768e11b15b6d5c915ac78d5aa17323bafa8262f75b66d06f55eb015a5774a3854d09bd130473295a946771652176dc0479cb862cc7b93494df1c815d754f86c290f44c1c828228d48a5573a574a2039dc9140ee8a55c6abba1986938a47b0e84859558399a42ca013450033c53b1e978d5a3ace10a87761d51a19bc349fd19f555042e0e2806c1aa76436bc32831f0935c51384b6698a432fd4a014157b8a9858cbc216fa784e66bc09f02258a9dbbc402422cf652a3e430301678283d19889c7b61226951bfab2814a7c7a2899f83670b1a396f4d260aa869feb409b0af63b0b2438fbc72baf0753fb2c7473d577618109a9d2c2a8448a0e756b4402c7c0e280fd1160f20b9b384224fa2ba06ed2274852b15e1b35851ab6e8a5bcb646ab45a85744141970f6c5af2720fedb56abdb65603588d73109630baa73f773f260c63d81c9137100b1322d7c21181285b773b7c552a4000cdb2830e28daa17ca1db9bfa0226e2c1ca720e7565e80bc08f1c742e453fb2230138bc430335c2965386323b269922e5713957057311ba3394320096075b492b641369236134095d728341db3aa13ec453eb4b9c986085e23453e878e42d20c9af4376d092da16c8a9afa9834cca64f16b2b1561a4068c0245c4b6e329fcb1c0a9b15660485672ce70f3f17b486586597e8aebf9987af18bb2ce3267722c549a8519527515f4129ba5c986327996c38babd95cedfc1305f4378fd2c8b6761a24334192d47596502c86080bb202946f34c08d7e201a3ac937844b181d739b9807ea3d6792cac7a7a1b4ba7fcb2c5833cb0101291523208e7bcd486737b982c1136381be16f75202757fbb86970194c4a32eed31b01ccc5a2f0534bda8ee61b0f4a2023ca58b415e59a8d9bbfa9964cf765b31fb0c565174bc7b006855c9747a66747e18e954444dbaa8272a15cae2b7749b08df9811e8cdc01fa46a362052f50aa06eb2249287abfda0aadb2e719f1e1afa3c29d7c855a6ca27aea661f40210c1c629f611343240b3968238746a245ace3994bf88b46893eff1a3a6096166e0bb7341900e73bcc36bb92d3e539e456bed44b84cc00bd836081704ab2e4065559896657ab31c60c3564981453b58bc7e238fc5b778cfb4aaba57417009a789a13bb075b6d9541692b85ab52961fe887c29289923797d18ab8c9d35230624b004457f749497267a2efd15fada244c1d35c44109add503328d063b7e8c0fb8c66bcb42c8b1c1eac421563c232e579431fd9ce4d572904577811e23af28109b2e419515260e0e1bf4a969d18a4378147c0334a5886046833ab8d06c78041c6b848a43810208a5fa0a202ec2320f4adb15bc299c6649c694f76311d8c0450ca829c3545ace79a33e0942f133c35e1e6be342c30fa9b8debe6820a3cad5a2995414bb7f0744a22194435ea8e5a534dcb8c754bc75444093af5d72490a3468bd06bfd1442870701896a4f1fc11fd5c8c50580cb06192ce7b90f81d920a3bcc52ed02fcf703428c22c8ae25fa56085f8033c972b47c61998db005b019032d7a83660803cd39014bb3165c94b9dba1c6e38abbf6567cd513283174c42bf4605b3809c29dabf149a650bc906a4cb1e33a469bff3820713040aa067701282cc1c6826008f8787cfd0796bcb568210e088f649349ad921b9349cd4998189b4b945d92ba6bbcc972155d26920e1a756bce6441748c41c6c7373723a9c00434e485216d92dd6884f6113068fc2b798790f41bb3104a513f0e413ced19303f396e5f7c72612c4f4112f41518ea77c850f7b8e64d1b6df73a40f87b2945b14b8275aba42b455253b9d522263e4bddd6c24222062ae68bfe5ba4193195ed026712e729d59c7a1f519a9c65c566a51504cb93355a33d83acb62a268e02874c67c89530f914761b751f03f3d2307ac9ede742f51bce4342afd3cb6ce2ab83fea96998e3f52b93dc875dbbd503bc67beeee7f1e46083868f96edb9ec3601dad0e40771856eb77e4633504899fcb86c6a3d433d0b8d60e26f07bd61f1d4ed69bd +ciphertext: 6a873bd2880d314bfcaf492967c54b83bde3ce79b864c718d15730d64eb990de99ccad48da0afa4e66c505c77656fe822218672b77d28e4b14f4b11aa9ee3731d6ec00c807104bb09aae7f2d53b91fa4fa9b651ece46b5d0199054f0d9b4646845d2fcddfea617f70c5ce3f40ff7b41bf181223ad2cc1f45a31e6bc9b822f7272cdd80fdb033b36f4f7db10b874c123d1fdbfc4fcdc167edd8fba63c519d66167bb44c70ecd648362d811f8897ec4873fecf69ec6881432df9e2d30f83a5bf24bb43314e0256065824746883cc13908add804632f501a0be1d6246f67c7fecece41fd4cd6670f2e12e238cace966f8b83e02cd8fad38b4e7ff7f6bc8b2f7c9c1ff7f6499305cedfc7d472e89df731739f2a9ea455bdf110899ea84b686b668a1f52c6ff2889f565fb55ae8874efcc985efe688d5a9f52da28ad4fbffa0c9d196637251e91de6d2d56b9809e5040fd0d43cf756cfb5cd14b40da7f2ed1e94aa9b384a2e59fa75f56e5f5d2c441ad4bad6ea25c76811b3ce8dbe2d7d17dc830d8dc57c2e9f110ad2a1aa99861cc7312b9f0bff661e12a15409cd6d5536d699bb099a26fc60d8e891578039c435fad1fed7bd0fd13acc016966456168b51e533166decb49912780a842778a5b35c638af3d4de8d35db9ec0461b2bbd585f756c8fd8b89898fae974358cd6bd74a31fa5e223d7925725b602d44483bc74ef47a32ab444f7108a7488a27c013af0dfa481cef8752e5e0084df001df2b1a8022428c9ba7b0289f4a3b8df3c4f4a6a98d215e1874abcc6b5094157707e015e79affb5bbfdc272e64736ebfecded3c18abd25da44a8df479489b3b9a9a5ef178715e1e132ab38d5a09bc66e68ae8dcf464ab675cca458c608a9323f346ebf6a5c0d9eddc61a71c1e13f85069a2c4586149702e03a9b263ea68964a7edbacb77e59c4873fb35fedbc0b78bb97a172a10148184efbfc0ae272e0372b69482871a2a1a04f7da28198e7cf8677bb7e9874842d50067e247a506ed9edbf3934546527345599f15d5dc8198b03ec44669bea78f489425357e2e9c5536ee9d79ab164ddbcd3d78c1b90dbcdfeea79815d3f004520ebccea33eed44e0a3898bad96f4ddf7eb7abda800cc2c11ffc71c30d8ce610d9a6e43e924d0f462d24c15728699105cd30aaf78f5ade69bbbf7ab2b10c78714121abb09918077eca882bc077c235395e76d78afd271a8b27899540cd4a8563d8c290d27f01534311441a0aea72f6b23761ed3745134e6a4a5df91d30d961ea410e18126983aaa9b380d3510afe914a56668bac76a439c5b610abbeec3a213033d642f2417aedf224a8ee0d96ee6d9a668f5611671ea4494cb9415f9bd11093b8befed7f38b53b4b7eb42d4610af8f02af8ae4704257323ba7cc4592c5e29810eab67f6ee85d14119a85a7302ecce88e7fe5a2ad747326fed534fcf0801ead1d00691b8df565c14d2e303583fc635b6aa70dc12ad8fb122b8cc7e991907966288150affdf1f507168dc8ec732256279ac77925679540a08228a74fdb8c8571796e0f6ac176691f20850624d5c4ce8276766d628d06d3eb40a96ec70a85701230cd39ed63a33ea9c6cb73e46c3dbb114d7294aa65836198a16e8742b1b4a4484d80c0d79e91d5330a067d1f2f7ea8e9ebdec57f88c38167c5ec7fc5f2e196fd5dcf02d99dc0e65811472feafc946decd6737fd7b101907fb6346e32ebdfde0d98a241cbb35a4b28b41f6abad162ced0c5a55ef8f634bd058d1f96b05dfe051a0075eda9fd77f119b861026b8af09725175943d3f2ea105fc143b962dba902de7c5fa959d1900f0eda2c5eda6b645c985fd49cf6e98f259a1474500445837797a6ba15b92abdfee1fa409494b277a68716d52e8a60aa4e80c9cdfbfa41e9d326d49997b74a081666eff4dff2cef7206957ea78486f3ed2e610431783145bc73753380a7f82b13088409871a5e4db16b4477e8a12517d05720e2e77646de5ce1c1a9e7f58b06b2ae24ddbf9f4fb281b5d0302cb8f7cc96a6703280e7468808911a28e93b99ea06d135c7decfe3c52c877b781f9ee49bc382f5af000d350ac4f4e12cb50241180e6c28832cb1aedb279be2507b6762773da39185da073d695d289b082d777c052a620bc3c3d41021f3516448f0533cda900e9b4cb05f66ac01fa657990a4f5f474981df918af572f01ffc3bbec1126 +result: fail +shared_secret: + +# Private key not reduced +private_key: 7459d0d6aecc91debaf6ce7966bfd0ad563be84e68e23d48194fe84947e72b88da1dcdf49bc3ac90ed9d799f709d7dbfd6496041ba834cbec291d5a73368944d1356189da20603bf8b97929624c5f586ceedde636b6cb09c99807cbb9befd3b2689af9a74ef0133bd5b65fda0d984b936833881db29a4c5a420fb25def3414e356337fc2c91a33467aa665c4db7a18ac434ba8e1fbae3a7cc2493b531c6b642759625009cac785e497be8127d33d4733af3fd461c1cb75322f3945fbebe69c8486a35bd49ab075fa6227465f97fafefe65fdb53f9bdf76f59d19e956b4ea1d938940998c8e83329beda8309b521af642b9466aa3b5fa467fa00cd6acb467bcd1ad551f4538fbf78db3ed668f47ae9f75d94d4a30814371e20350066bc797777d79135da01d4f783f89c3dfdc55d4bcffaea674f454c87ab9d809a1ac9ea6e13747438a7eb708e54654f6cda6c10d9456a34c66dc37766b87cf01a4a38e55e54bf96d5a66e7a9e3a353a57706ab5911dc3f51aec9ccecb4590bcf8c4765fae9eef119b00d0f7cf503dccbb6d8fc4667843891934935c49c8a945553575c67a1e3c80df48bdba8778865ad972bae7733c8c5df787609d063be6aa62cf5564955214ad6e9edf1d73ebc042f57d16e8d1c1ef2491b8c9d08f61886a2efeba199a850cb4ebdf8cd362293b80a25c2489fd571eb6d6d798da3dfd71165d0a154e977a3362a3ce367ae5cf60a6086258d35a695690a53ee6737cc76a8edd47795ca913daa42d86f996f4d61f8353be46f752fdab69a67efa026714336e5834c8008284293c9c83ca3b1eea330a91a7522aa876d37cf7da439e2c3edb5d9d3b17b9449e397659bc7dd668f3e9cb2cd877c57fa3ee2fa9a3b3c9d22e5c02a48ae4a4e42e5d56664dadffede5be6c4c2a063907e94fb8019e2ddd9e41af9383abe7f37f3725ce36b9a7631e7bdd2a7676df2d7a72a84d302fa5ba55a41fba7953a68e2cf3d823195cf26b8611d5de242ba90487ca73057ff30bc8975d7874115ed928deb7fe7d7b7846ba16874a8984447ede7bcff357526a4882359edda98570b44aa3bed968c4a2de84ac78330d3df725f7a317c093f438d9d3d36d92936330ec5ee9323fc985d96df35506fbaa429c67ae6b75d24b9a510bcfbef9efced4a7330eee98fea3e135ca2a97657608b694428ed063bedf05679d8d847e50a8668fc8238caa884c3efdeb3adf0f890a49568884e7d00376543fb8588fb4433156ca8d7e52ef466b9eb7534f9d30a8dae47e8fc04f55d57648280ed36fe58c6ac9aaae52ce15ee6e9e5db99f306e53354903bccab9cb5448f9a8e76c3690c76732ebe757d9742aec5334f79c0080a9c0f35eb34f637f90f53152b4c5e9ef4f40fc3f7ee5ea6dd9758f4fb9afe5427ecc63976a0315644ed8ba5174f9a1abce6ab2d45fe03eb4a68c7380fd7fb26667b4d3c3b0dee83ae91bef752977ce962b53b0228513b4df6a0ba735826fdd8885aa3dc31e45b72347ad55026396c4d5ece0579bbcd50418f589023b4e0aa77b07366edde88381ab2b9ab47287c44c14a36fe1d95454bfb3b0a816bfec62ecbfe033f47e4983bc983b86756d158eaad4876551638ba5c5f8e0c74b9a18e537b7bce3e1540062b93fe4478745f3767ffcfbb4c46e3c3751057764578d33a4fb89b83f5e639c318f63aace8f13929fc81e45f4494d73a64ddf8e459fbb9afcba59c168aeecd7eaae7473c8d9cbfe41cc27db6b72d8d4f64dcea026de8d31fc9dbf3f0aae4423596b4fd544c6cde6af096af353ce8a8eced680afadf7a454d54b92bdbf1a74cb107153b8396f85c0479021cd4ac0b59ba8392bc976c046995006e6f2adaf15ababd05fd31e62d32f7cd8e63149dec0a590a4c49ef55533745f24c44ebaab9b0fc3677189dc0301638ad09882634871196b55e87a5e7b9348c8a83d90adc1bf8e23286434236ff58fd63d38940947b48ae94ddc43bf7d53ad1f4d6f4196c9199dd81992934777653fb533e525cbec469e844485ee6a457f4c3eff959f7713c93936f7a0e6762323e8f19ed84cee43502fdbbd718e96dba67654e45e766efc10afd5c4835c76a5265af5d96d47139efcb3d85f97345910c164ffc3dcd4c26cd1199f64b7dfa3397aa6afbb27deaf7a6566e9769a5f39713c311077c359f42971b65463a8de1aed9879abd512cb55b6e44f5c690e0a3f60768a778cc9cac5ad6b897379507e3ccb994956284a7715970b0e3f6189f0c66d99c667119b82d87a6507141cfdba46fcbafa8a2a1352139b1024dbc64388a3275f34180ffdacc380132eff35eaf788364f3aafdd6af9c02cfa396592282cbfa110792f87b6182b2f36a0a895c0791276d789976cdf09d2c16a32aac669647219086bd36f6bf631392510c0e0970007a88378b647b52fc20ee9148cd4575bb8b31b06449994098bdf77680a48ab51b8e5732545d6b87112884e35a2302f60358f651f8a71c0789018dba79bf5298a9f6ad16bcbbecac4f0cc9888cf55bbeb38264c885ce098fa80463f63806a544bfc194b77895a76b22b81b1098a8c3819e035268d22f4ba0339067ab3bb30e65506a86e74fde52afee944df4e4c745f9393ad59117dacf74a407c236b8b5a2aa11b1c9f86163df31129e885ebf68040f822314c2bc4dd12751851864d743ea49b68a93212d392845ac46f95715796a488cb44072ecceca89878f37b51d662d783900b6341a65d894771476fb942ed058b15150bdc67a3b7f4cac93733f735b81f8dc4aa5eb1288d761b0b74238a5cd73c8bd2457bc195b785fd31804d654aae06eaf5b08a365a472503809b416904162c17942fd27671989c553ab5137488f385b7b9519a69cb496444a7a2db607adea5c3e128bcba31f586c5603f953f4fbbb4381cadcb88d6aa7784562c6ef302ed398cc2113abd257c9554818c8175db54baf20024978e167620b672b28bf24465d2cb4cfc6c08739fb9696bc84fdd76b136b39b85c7deb4c10ff59337b4112e32bb25a665e9cf624baa86aacb2a18ea3cb67462874117445f913558c32e5eb7e1329cfc2d99ca4d83007467b80d74d2ec9832a5785fc7293eb466d55cc8904874bca5714c776579b253f86b17187b9c19d702ae65aad9d7cc23afb041e593bc41308572825a76b4dfd51a2bafcaa10390a76e08458c384cd0089668955fcab00082759de9147bdf581aa4a81f8f82bbea84d255b43e30b6728fb7a705c0aa96b794c7ca28730c6a1b1b2c1040fa24a98ac862ed74453c03a3d842cb0bc87409a09456c739ea08717d7a1061041c424d13bbee299c1ab1bf328b42314263f186e5b198bd5b1712c04402bf849df6473b8e78c4009c944d05277c68d6eba8555ec48139560922a7a142632d4168dfbc6396d0046c53221d43b7bbe01bdffcc672f214217679853d3c0939acfa7b45ac81b145e5bc7d668a4466156faa6a44ae2b9cd6caa5d42cb1c2ac5aa847cc6501ce998b2896652e2c901483acdffa695cd1625b124a8a88490b12b72a5cbcb67a29aa955247fd17ef46606ab5b5fda6ac39edc0128e46310903b32435e2f02158f678462f2bb230246455b7d307b5bdb40375c6cc507987ef616816d3a97545bc0f6e44c025c961cca33a828beb6480494cb9049bb2e0c8734437ca0745b55174b67fca6abe743c7f9793219a19a88298211562e7ad85643b0b680c957eb6b740ac142276822900110f3998f2b043816c9216c416d64e482dc1053928722efda8c35bba98c563eb4fb280791a9a330968cd29360860737d3cabef87d158419cd8794d15771588cb049f393d3729fe3276590488e97f00e63b6cdb760c22fb853352c2eaaf7340b204d6bf8cd186cab5f786e7f967a4d147686a690ca7308173843dbc0bb17fa4ab2788436f43009827946265e86e782b97b2b27b87ee2c0ba9ff23d6d620ac02124189bb008d54da8f0118a081a70040b0c722a7b5a97194c5641078b22446d7ce9b66ab9332f2ab85d7320fc651eebf8b93b838421ac6818f87673872582360bcb903ab70972e8e589465660e6e4b9295675416547c277827d667102c99297f9909548c52621846f5978a5d6971ac97c6df5cf1a3a42717194f112093b73642cd757b541c6d5094931d97afa952ba80024b5d76caa088577f24b86208da3448dcce24769dcac3af496b4ec8e634294c7d323a85128d4e20dbe5b7bbafa8fbce12131f0663572a4c1a4885ac49cc607578042c0c68853b661b452662ae194512b208435a72ebad23519e07f96f59edfe2a5297c351bb38773478747732d9841b5c26091ce45559d7184e1ca01b7c388a8cb030a00f66b47988c2d7d195332662cfc7d90b279248de101f77e30087881ddff4095efebaea305138bf83f0e3071f5494c3ea5bec8f775128ce60aded5edaec5de3bf5b4d7c2f2e18e87f499c1968993eff196753db8045e2c8ba8 +ciphertext: 5b094b6a42f9e8d31e0d9c28b18a5e323246ab6fb4a425fdbbd85e4fa833b4a589c910a3446ee9c2a3ff7964cc512f4623de3ad6fe3ad55f895c90d95149ebcf10a0654596fc8aba7caae1a59663ea958afee82518f78bb9839513d7199b10ca2c24f7b22169c17e7673eac8b858ad21d6aaca86017ef069af7170f5c825de5205994ff786ded53fe3352acbff1937181b2a29064e19dbfd316430a54b2369218365ce659e732dbb45721ececa352188d551ec1550938b7147cc5b2ae888146fe86b01750a85e8b4179e6c8a9c9adc0a881e5c5929299ed199964981e3c94b56a5e7720eb9ece6840d27861275e06d0be5a3057972604053d4835554d68e5a6f85ed8e2e101b2ddff770b8f4686668bd4ccab7a3fb58eb78e14e28f21443ab2e95717f8950e5b79de809c46cc434bbb592bed388d0c93ecd9144f41a7d053e312be740fb66f6be31538d663cc086cf23b66ef9771f3b2275067d553a0a1e6fa6b32673a1a2bf1dcffd602df83af95b5da97fb2a9df78a745f0fdde031fd21c0894234d9700889d825561c49c14134894b99a82c6f0c776db90773012faa4d7bee06877fd415fd407c7aa5effe897d70ba4088252fea08f56a5c16527c50283b1ee18db3e353196f8c031caba69ecaa877944125decc249842c140f30377c0c36525345dff045957be02ca335feaca4ebce4db5b5c3e7009eee36a4a9753bd2382d85082d01b954a0f207444e8a775582566a6928eadbf41ba235a1f0093eac2c7e27ea73af81849a66e2ecf8bf94a0532016ca6a43aed5f261dda9388de24e0e9b594b35259fbdbd46e5aa82bb52cf3d39574c46ed91257f1c49f93ecf6783d2b01ba5acee812a0b8469e5e4224821b17981b79670259a9977b54502bffaca22fd424a0f5566dffe1371ab30522184b533b9fefa5e6c6667f4e0b85ac805058a947ec77f61f50c447b2d27f4615684a3a914bd21b86a9ca58aa25526a4ae98ed34a78100a65a9124a1b2390333e96dc87460cb9e506331175fe9722f18761b1455688aafead26b76f13d852138d25f017279ad113f7b80b9f443973e13649dd12aecde5c7fcff30f89389fa138f6ce0e9e7bd5c383879398fccffa0505bb38e4f19cb6e65c21186484e9e10276fac9462f77b0fd7e251bbaa21ad855c8c56ee015ca8c973d31bb9440f98d9f7096bd2383720712eeacce4b8bdd025a9db914396139805b7d1ae8cccfd7491ca90526b8025176aa313904699babaaa0c76208ec9d3d5766b1844f8953f89b6fdbdba214dba86475633172fbf497c6f4343f78135db84c3e45e29211f517852cdad693d5882327f2529069fef977a7dea5aa0754597bb9793af511aefa511f678631ee1b94bb0ebb7e95bbf31381e499372241f0718fe2db2b8d4b30b7e4e9d7c9058967df46d8d2d160f6d241b8e05a4b70df811c43307f57f9a1f7d067994f6fc4e30d80a480842ba8ad0e245200efc31a0b8c6e3c39d01ea5d621ebec15a7a9ae5108ae12f8cca83f942053b31e4591401bd7e800a50d7c1389f1db1b771902e144d86bcf61de58b88dbcae5909431e81ab6d942d3af39c4518e1d4fa7f05b1a716006fe5e33d2c87603fb7de199a98252e28eddec620ab6df85137b8686ff0e2d4e76f4993825879c57c5d84e0cb4be1ec75f791e84df42ee7d7c3c77044f32996ee7b7d0f85c77d38f342fcd0e1be880c8bd2ef581278d4b75b3b80daa9d2c5c28a8ddd2758a3ed65fe42f7d4995f7122220f4ed660b7c2dd20916bdce54d2cd62b787f009993a51e0efc7aafa224fbadbeb6a719f8dadfccc0ade3fda88e7ffbc1efc061ef486625ad06ada94487874a7b3f7844918438729fcafa50a02cc7033266fbf052842fe95baae92db63899efe7330603b50f0de189e45e9600c822e1f5564c2fafbbc50abc2c4bca45ab2fb3425beaf4f3145e2dcda7e82da95b44b38ac19440963530ad99b6f732a2c06a98f12cfb8557b83dd515fc1284a762c8dbed28b21f52568295546b452c7b403096b78655c3d18927714e82380ca5c0593091acbd2e4ecf21891955bd78c17c90c58f27f575d1cd26c5f1be1e530b5072b95033ec174f1ab4c7fdedaf25d68fc7f4889d63d010250afa73bb30906610dc5ec4bc98e7f4afcf762e410a68f3e2bbceb37a1794c8b4396f5c6b06fce43c39194a042baa84bb49b78938fb97586732d4a1 +result: fail +shared_secret: + +# Private key not reduced +private_key: 75ef3286ee87f22c6a1f0b525818eca00c59ad4a733b7ce68c39ae4994c7cad6d6422ab8ae07968a75fc7dbe30e4aeb5b75d77ad348f2c2e3ef368c46c1b45ecf9c58fe49a86396285d554b157ccf224f864fc88df377c2bf758a3488722dc9111b39a90c58d2ade8b0373801d86efabbd845e78bef4cdb91509c7c9e44cf6a74bcffe9de93538567564855981484ba0dc6ad553f9f1d40f449663cce9c3aa1fdc3db11f999afde1eb3e72a1a3a505fff8665dcb86156a23c74e0b3bf750648a15479aae8e3c4a576fc807d653a34287147580b6a62957a26306cea167e963e4e71dbb38448763b664752ce93a21d84101f79a66cbee193bfc4fbdf66d1c869226b0e21d975b0ce4e6e384c1883a76f5f58d1f9185fcd36b6d63f28fa35c3ab8445f3ca5c9b30b655eacd967847c86de3ce69d4d866f8b798555497ea94cfa99591c1c563264b54d369f02a7e6833937941dbe3354bafadeca6d7a79a3dd517e39c0f75efbf64bc57059b05db3888dd35e5a07e0ccd55e39ed53b453aa44edd27f8ccfc1ee5da1d9ee4a0b3b4bb776df88aac23d8f444856f3e888ae4753889bd17cb342e70c78318a7a3b8e42bb28326caa32809571d547c15b86437c655ebcd48bb2a9d4941deef4bbc7b5bdf008396755c9e1e188fddffcaa92a34c39dc8e0b9a48a34af52d6c547ca341f937f7b5c4de92565ac466ae591dd799a534b8277591e99876b4925aaad46654d56b6f5a7b5e431aec58c5d6b98eb4a0f417f4e24477f6ebc52ab7859987871f6f3e94adc081d9f12e5b33e1d8e3c6b8e980a5a671ce991dfc721ed6fdd87ecc9b3dbb7eeb67bb7eae78d8ecb90f743b3589e76ec4af476bb5753458db8c7d38e575eab3fa2e6308bdff95147eeddb5fcc76c1598debf8a44d399db65e6b43761a75732ea70769b825b6cac8fcabb1ece55af64b86258f0ee5f6063fe88ffb472cf64b82cb68ce4eb986b560be0db6cd99b80563e077ef5a2be6f04e2641157dfd6c1bcc5f9f35c85575e66b391bcadd4297c9cb65d8dc5cb3201bd9250dad5a5d8d80ee4703d433fa8da79a796f24c8fc6084ea8286f57c5b5311d85cfe1b8733eba10f3d5a3ea4affa63d4f98a438325647b6fef1b154a6547cbd8457545dab60ea7966a03b40e8cf8ec2af2c4757a3b3c7dbb29e895dc419c06daad04dd5fd864375d6894a3932f1666ecde4a74c93d5e93511b64d1fbddffc738dd098d57ebefb3c467e68b1b9e25fa81ffaa9d31cf7dfb35ddd6ff87f38eb12f13816589e8eabad67cdbd7bc0a67bd58f7368c7c0b4cb45e4d3159f9cd8de5caea6b5521cae7326d561d9f70ab15c8545ecd46e8c4a49ed5888dff3f0b6921367e4648b654fb53da6f7f573b936c6bc050a34b7e3c7c379a4c744b80230c35b784bf9a4a3fbd8a89255db4739488913bfb822b3665cf5328dd51c0236e0548767156e265ef643c0aa7ca89a9c85867c817b7155d7c2b955371583611e77c783b687a6f67259638d51dee0555a19644b70b95f7d9d66a5b3d36e348cbf32fd0e4ed7717cc83d0866ec73564137d5707fe92dbda8f43ab30d4fe4d069e90c1c95bec34de0d3f71c2b755952e83379893fb6cb0c0075c7b67352a76bc2bf7390c39c3779ef7ea5dffc8ef71653ebf25cc8406ef3bb593df348b4d00fcc1fb4438920dcff58a3409174fcd39c5779c93337ad53d04531a5fe33fd9fd66e3855043bfdfadc0f7b7795b0941db78a52d77d8a849e3cfca678f77d00d873060777ed7fd906976ad12946b70c9b5f9e4a95a9beeb5b733d3e9f921cab8bc7edb3ea33549e6371af5d7ad44e710bd9ca9d65c446dce42ec63dc5eb1706be9206bd1688aaaa8dddaf97c93fae66dccf93d44b6eab548e326a8fff2a73bc6be9e18cef6c7a652f46e54401a6d290d6a383841f4d9998a16e52d0b58c5e6457c7de9535366949e8768dceec86be494255858da9253693293848bf9ce4a6bd362a2c9e137cbadfc8fa4b108db3577869c5d716983730b3ead1574a3f5b6fad6635ad11c4706ac6912248a6b55cba70658deb6336e7344f1535e1967f2486866475bca60c8ba89cb591afc6040fdcddfdc55a705beaa1b99af7f5a400454f68744637e3e12698a56af67aa6d92bf9e3b357fb0d9fbaed03de6989d36901edb2d661f371b1f9a3c88556374af9b603c8c1db100ac3e600c042672bcd971857232fbe70e3c1280f5ac45d0e819a8495d2da89ef5086b110773c7d1539ec94a44fc0cd6f4a39362731f527de3f06f4a78b0dfbb94e4977a564c765cf8ca68658fbe27937a7b15a8671cfc8b3e779533d1b5c092826b3038b213550421004012a4cb3f12478efb0c92bcbdca4259b153584bd4b65a6b8d66f578f6f408bfe246deb5304ce5487b7a95c6db5605818e26d2cf5fa6adabea9e3a48b6f889305c016055db7a02a34ba5e10573143ddb8659fbe25c7b621e3494aecef037effb36b2819a1816788a6b410918745c2a423285c7e0021cb8c8793b60b4c9061a39f97ff1212f02d387d224b0ec258268a374b6e27ac9c4598fb78c387a7daa439280d79a6218b3ceb0bfc2e685bad8801d92b5b1a42f64c8890709c58c95bd8ebc43568c33362a53b5a12c052489bfd806cad36dda117b2180b68cfbb317d4bcdf745c50324e19dc7b17ab7f31649a57bcce91fa720052afb0b0ba5e8b57a5e4296b1c390da9a4f76a869af0b9389c0ac381aeae0a779ba588ff415858b3300d71b99fc172de950a95c3a61c9072b6f2a7cd9245da690128b9c597c44903837b8a9443865c785ff6bc05854e1115b9e3d7a70c7c40216ca48b1c6497062d61fb8cb29c71e5800b8e752e70b9a8655baa8408742a511ede8409301620f3bbc2a27790dd7058841432cae4cae719740835571ce65027e74d85958db506a8e9601c1f5ba5728a6e710a3d3d93748a7a640c460167482dcd6cccfc238326171927c6a72ee7084ee97d3e7519744ab8df651b9b2b69d4ac7cdbd9437849114e29550ba3321202906e9331bc7ccbf4571da4c6ae1a0b2797ba4bcc75398e18505eb02dc760b00f687c76f2a35f707f609ca149b4be233b3ba4739e19e4462d78950138cd1b210904b10a83356156a63631d4a6193c68e78642e7c5c0daf403e8520cc2f7438ae950d4136ad32684f2881c50c1a508b0442bf6c92f030f82653578c79fb4eaab1cb60df4870d6966ca5bd8651400a5a6d424749c8cc6aa6fc90b6514a8274e633aaa74435542bd2eaa354d65a32591819b8233834abf1391470085c9144b8239390f97624fdbc645d3662f8a7a2b7ae412f8525884081b3282390f8c35e2379aa5d234dfe9c0c94098ecfab31dfc315413c62aa80fb8a9ad11d070d02cb192d18f3717c1375401c0713437b0868298205162a78f8b00fb46ca2ccc6dad2717185b72793b2aa009419a6330ec508c8c325110c53fa0512a713c500631b36ac410c5a966edf1656419740baaca6719639987bf5e17444b4122650c87c884069fc52ba082837158b9bb85b2c961268284b5d8636b2ed3bd1781296de78a1cca44502a779b2bacb6f86d676355d4d527bd050ca8d33a12d059e6d697f986177e1b95424ba97cda6b6ae0191ba70bcb75172c354541c7742556c5fbe591f33b9624452392412f3859953ac21c50d5a445a34d94d492afbb01a84c844fd582802391f4f4a5d012a8a62079e254363fba52c83a399bb3398f6807e6f03f74f68fc788187be6bcaa5491ff666c98e43c3f860470380768f70b4987c6ea10411ea60fc7e8cba0b1afd72a52713a41a2172804ecb9fb60315e37c544555a8aac8089081c6c2695af8011bd991e1ddc87c841cbe0c0357e04489785222930a5d75b81cde91e5804315bb30bc93294367a4623a0c4a0ec8ddc436c7992b157039879bacbcb590490c28ae7c9142267654291c06a75237b24b8895404cdf32a073c4922c202a087bce07aa5708816818564c68237136c0a98119c2a6244a59051071414425b9230a6113cab28b06a058e67b16b9b3287f001422c276c78aaf608820836c863a1555590bc802a70abda52e4c430c80992745945ebd343277c222836631c652dcc425e1fec6f22383eb78c9b47967e865c6382231b4ff42b94f281c4e9a849477706c339a48ac2c69416d1e51914c751dff0b74cc657a8d9b0d0e21cb2c3a72fa241338b11f529a0ea9cbb8bd310203b29775867f23b7a6ed35890f3014474b51a578110cb1e1d052d2cd03a19fa06f1750279476642752934201c0832b80b552c7a4b4eb1118e2466624588ac1d0148c1c0484352479ea604758012b5d49e885965bf6ec29407a0d9d3f1f08826007a5a3d32062d2a775728c35116642149c2d449367bf894b2bffe5be757d54623b972fdb9093b0f54568b4f6f2e688f86ab2eab1c96249919cedc2369d8d739ab125e0d2ccb82dfebcd90240a545cdfe07511f2 +ciphertext: 5b726c1d492fbcff00124b62e2a5a166b83d928a64d0c68052b126d354bfc34e4f6b38edd661c6c407913602d55ce892fdaf631d96c4d94de045fdae852b5d7d88c73584663ade3e5432280d137af39c49aec6bd72caf308a6f3a8255b58997c8c189089c76a4d6c718ba0e01ba1b457d89e0413e89bc2b461b117c7fb011cc2206f027399c387bb3b8222eb56ccbe89c333ce3e46f2e507e3169a75f052d92c10eb3ffd04e5b59aea872c5a3df2bd23872aeb599fc0baa82c6fd2131357b0abd7638b9c8d9bdfd65a5dc9608dc0204cf88a9f2a5aa370f4fda768f7367ac51a5910f492cd4f2b9c05a993dd03f71b1dd1774c949d0e15f7f17831214fd0b33dd41ccd02aeb46fa66f63c17dd6cdd42b02ea18e1ad6183a2a0dcebd4da99dd49405be372047e4beacb32e237f37541e40e2daa91059ccdb8e956343fd009578e5d1b9601513ad916ebb324da5c3bcc5ea2162f507046477acccfae79d7ede561cc2837c0a95b32140bcd7e30c2645aa21a153d56358a8a767cf887f79e85fced38ef732b83a4c311ec77d67dfd164940d6263dcc00f0a76560102564913918741f88d22ad4f7aac99d560ac15b56be3b3e747ab5af9d9c87ffd2b5a7b964c2f8b3b87a13b64cf53a8731cb0d4e0535bb52ee97905435f1f7f0679fb55820160f200bbd6ac39c105387885a81f5c8e7f2d3ec3bdbd6604db8249408ea26f329e1faa5cfbb79f22f84da9095071673b56e003e026b373bcd97ff31ecdd4267ee8bd8e9865ab576e033a0094a96b391e9751dd988f340f06368edfca09403c2194a053a682e94524c955ed193b608a044af29357132ddc3d113f7bb680f9c0d2f8fcbae081bb211715177079e3e5d731c5f3e32f0703ec6c979d0601d628bcc9ef88bd70c020c05007cce62e1ce70d538b3109abd4c05e541b164d03ccf1d7b82fff255433a3357e71e4241354c40a5f6a6b83296e752697e34c77729ec0e6322f9f948f0764ab60842739debd37ee3791624ef110e2fbccd314286353d243b846b52ba87944ca8118da0e83ee94ae8e2e335016f57b704e379168102284b4e2fa4775c9949462863bac38393a7865a2bc5fb8593c856dd024daf88cfb786f98a63288429ba6b2963ca6d54f66fc49d5d61babace50df519ad4e24c7cfc246ec5a01f315a65ef60fbcd2f4d2cf0fe20a803834556d74b1a3fb0960b4bc7d9bf1494c6395c1ea7a24996b04b97f10a6907b66712931f1615c7b76d93e57c90b8aa57d70d2d8c578fc61cdabdd53b42e6cd59ae63b2beffc3e9414abc820191af70312d489f8841b66273eb164d9c3ef3a4d273eb11d708e3a562d113bd397707c1ad7fd7769d4e694270f250240a666c73295e541888cbbd10228b527fd78eacf305a5b7f609985bb869a97f642dad2b04c47310bbe6fca70ecd5957b7e12831c5c400c30d924eb99a1495de8f968135a5695cd9fb78e91345476ce1731443fa85ee0aa266ef0c2bfe720c3d27428255e01992e3b03a09d5c22a5f4a6edb203fad98ff5e0aa74535d6de951f68524f6c11f056897913a84296a3cafb5be71bd90038b8973ccfc2e58b868f61d95b659b16548e3f5a94d5651ff1921395dcceed2ca6afad67ef9ba1cfcadfe63533401ec05f246a453277beb31bc8636251b40310cdf38d743f3566f8aefd7b8d6834390c2035e7493e60bbc93a91258a5926424ed863f07282ccfcdf663aebc6586e129e1c89b049a78ba9c4916a5129a2727d5dc0a3dfb4ac9625096f27c476895e0cedf6fa75da79e08842e6b6df7cde91d4e090a94973c1d3c0da86e11c93adac0173070404bff955ca59822e7a3ffe600f58ed6c22207815d2c4e2ae4cf7df596eb99d50f731d5202232c6bc3609e071ad73cda4bb6f5d5fc027328f5ad44bc36aa9d938ab168f574966c493ddb7e989a04e1431803139965c296dd518bd5294385aff816c8bbf52136c18870ff530435a9e4c45855c6872babc041a2153d78151bcc7decb4bc80ca73c7b2724a1b9a934b3fbc2c5a310717677c939651f4252935dfcb2614d3223e4ee451ec0ffea2fec151ff43d5baacbc038629af6c684e401aa8bca7e385fd5a5d18b8b9c0f325109036fcebcee3483d2e6d0cf74c6d2ac07cca57261b6ed3ab8836e20c876a4a84499ef5e7e78b1465d2862a620efc7e21f45d91269458329d9e0b968183f720c947d25 +result: fail +shared_secret: + +# Private key not reduced +private_key: 374fbf33d87830ec6d87e3ca5e4432a0553fa60f878fa3f8177eb93e87cb7676351894e1491f6ccdfb6e8723aec1975cc8a3971e24a8a9149a9957620b1bf11c4c3f943af1dab5e82c73d49bac8295a4f9f3ceb4f5cef04ce35c7c683db61f7a89699e23588d194574e603557e9eeaf41d4b7f23627ecd46ecd6aa634af0054ac9986f5148afcb6bfb62e44bc7eca7a019e4eff5ac50597dc0dc648e21aee1ccd5827c85deb686d58c7ae4267ccb865b3b40da4e2476aff41b9228ee8274c96e32966f2ec6e1fcfb3880159e6f2c62a9565c8e6c3a84bb530a13895f94eff354b798299ad3b68ca32838ea6b3920b3b6f14e5b7a85d295d33eae19d22b9ce7d7bcd40df6b298d7bfdad78f868cb97d178d5d8db27b69ce03d37f3277661d9b9340f347bd7f96d42dd41c996efa94ebddd592fe4b480da657d47bcb4d147c122f43f25f68341be4ae26742c8e3935cf6be92d4ad984863eb44c50d5e0a5c5872cf334275c5bd35e7c5587fe9e6df0e8093d603ef64929b1c7858b4f8745ed1bfc9bf9671d4cd85f8d804ad730b9ed865c8fa6d6cbe59543ea0a05567bd3af6a74e9190e9d9a89b0902f764028ffb8c7adc6278474bfb8af4c4c9e6b8f834ff15d265f433c7357fa8c9185ef6ddd8b688f40c5eaeebc38ce3f2735d44fd713ac4301faefdc1990b99d9cb718b6344c45a71f633376bb9f0d3656ac347305c3afcd55689c696fcdeff62b3a50edf72c1dcd7785726687d2fa5cfb7ce5305d4e3d91596904b872a1bd51a255af191e9d01eea4655cd5259cc16663674365708843c20efe8b96efe2efbbedd9485dc54f6782fac42e258fa0cb8bc3896a518ed7730f46ba7fc45785dbb98ac03c9375830d46fb8df1b06d6c9344599fff33de2566769fb423e456a659c0389b86b28adeb4675694ddf9c489a4dbaeb5ecf37afb08dc8fea5cd9d37beadc9fd91f428ec68484b8853cd8ff019c9a7429e15e8ac0972836d42bb45a7eeba06b82a59592f554d1359d8f36de82c0a765f9f44b67bf93f58ef22d648989c6eb7eb8586f0d4e7bf7898395d0c2bafde13e661d4b7c46737772f4a86d06df060e64a1a998e9a6d42f2fb7db76c3a4575f99199c595ec760ade086cfef6f693b5839557f25919469de84dcbad233bd9b77d049d47b67e9e616ebf8dce64ec65f712129a2abbcf3b5afffb4cb6bb3e54f7debd93c68e1a638cc343da1170c46de338757f445e00eaa43ed56e6d59daf79dd3b4961365a6927db368a5633a4dad87fa74021bdb7885adafecb5bb4eef4276b38eb9ce9c7c8afb616a854b444f8fd910ed6c3eef93722d8f7e90f97e704e2b90b41ed53d259ed91e5bbe51da6eaf1f5efac9aa0327fc147d69e84274b3eeb949c8588edac38b50dc775849cf26f932bdb6f80fabba816bfca05ecff9e74d0fde91094d04486814e93815347872814efa06a78e29e6d20465370e55aab5c993ef543c46dbd082c729835d678f979904b402df7ddc4f9403f8d5b71955039b539785bfe79173d870363d8b677aa5c823b8980062ca773ba71bfebafca6399b40c8109f4848db6cb154a4846cb9c638c4e8c2de49df5f668bfed1a04eade65c030cc7bc8586c45b6e5dc346ea4073f4fbe31e16d7740c73dee6fc192b4e3e965e46f86ab9396e56b3ca110295cee4e977b147ec9e73f934ba397af7b6d6c37d256de4e15c0af7ad90cca7948dde03489c7dd9a56dff6ff5c9692541d87fb7b7a762d6765f34316378673d5fb6279b0db8c8dd84d49052aafa5467ac9fb7686cbb905ff4afdebaaa8a7928eed3c02e35c14f4e02b66dd893ec62c54e54758582be9d1ed9c963fc558ed076c107a87f0e49bb3ee585f8d9ba31788a925588a0c8fbab37b3bd79268eb359a9fd63775abafa6f2024aaa983dcff95eec055decb58a4ee90b83ea547b1fe8ae6c3a935325e1298331ffd5e2ec195f982c39c9394bb0933bbb0bec460add2dcce20c8acb03953e188a6ee7bf852e79642eb3f61c94d3b3497b99ba7b25fb9994a3d0dbc9bdcbcbbd72ca93534fae36df7cd77dd3f22c4918ac412f43d4ef9fb740c86cb12362df19353438569c16935edc8af7c6d91cc97c59996ce184f53eabf612a54dd9399fb11a5d0fa3af913bbc67ee874dc752748eb593966014fba090c537fb848ea86c2ba929c7b97456ac4b5c5007b27631aadde902ae1917dba8cf2936427fa22504aa2bca42bdacb21ac9a497eb1cb8a4b096e69294620386abc48f389c7f14380b03b10c614c625427c8cb9962f3d75409d923a56717882169bdab15e4426dfdb26072952255eab0380a88277ccac1d24939c98900d0be4570b3df596aef0a1747b2b0106c31e9aa9164f7745de23bd1cb222178ba13f7c806c0b02ff9898774646417bb2fc3153167c1eb707655c548b63caaf3fb3f37771be2fc972d03bde5286586d406b00902dfa0897785481b95805ab79dac44233af99ed3f53bfd6cc36af1cc79006289563456fb71b54c6e5e894f47d715ba062e010841a9e67abdbacc31dc373ec88ce8eba2f96381edd02fd0b88b47888f5084ac264c755c62a663ca9e30bb2bb8c89dc2ba91ba652fb79008ad91090c0614d6c7c674139ba5d57d26dba05e7c47e2107aac4cc28405a7d0d415e2472f66c40d49e094add494c19175886474b5a6991e355738c66d9178c94bb4c05912bd9d709290a8b562a358814a14c50750d17054273c7587b7ad5e403f231964bb40014fa7121fdb74dc23875a148f0f021a8ceb3cbde6842714cdf1008d85b0af62e65ccda27d9fc2a12e415801bb22a865b861aab5cc3c9093c3164e6b436a3475e5359bb8c241b635c351ec3614f7a225d522f2a0b7b181a1f7a4ccc858014a2222ba5b19767154e27b2667e90aea352ae7d3c68e07b7c4d0482ec38aa226ac4f2b63a8da4be57842a4a65b6e04c2166327be09a30128bcc33c154031b94ee13aa5d60f7708347659b4d73bc500432bf2401861c183c732019576a672d0c10d5c18afe4364e9ccf67d670b29283d0f0b9f91130a0437d7450acb4d76af99aa4ea287a6bfc73fbaa3207f58fccc775a811a7e6a0b7a63bcd87f04f1eea0d57ab7735315324282b4818b8d4346b0ecbcea3ac9c0a7bbc17a955617570a511447a9b8475f7c602135f57255e2412cb6ddb0d22c30159b43b9dd58066d81d77f7a4e263603e193ebf671fa3283c69e71a4ac433297867da2b2b7eca19373a9b4d3897689031e58284ec8779fcc4cb742b8712b11a3d143b02645a99db61bfb19c26a5902f7b3d77302a9ab059350925d8e1a994b586ea777697c389f9cb6e25817e07c5716db9ab63f451dc89a852031bb3352e8ba53643c509ed8590694b6a07340ad0fb2f1788937a0c45cf9a441494ae447c44c6917f2d7b21bdc6b7d3853bd8e33bc7ea75e62535f95096a9d0930cbcc0a210c2f5b81090d20a5d7c0346bb43ebe6b77072859f13a6576c72c0553da80a4ca8f03292d86a98246151960e4b15b758b28e2ad2271c9ca70f92061c8a560be21a2d967c0ae1b0ca446a987bbfd888ce4ccb725b95050d03134f3441f853935255bce8473e88397d5eb4cb8d6acaa6bb8d5f5003a560b08c89ac890b77aa16304f5cc74822764d82823b317572c5bbee018eedab6cd93caa924279ca8932a8858079197d412b7283e084a7fb9dbef26d4530c1b6136619b06fbae495d207a3c326910a5c2ac9c7b919498bef5482532535d2551fee95154b2082a76c0d3b16ced88993697b344cf7be4742a3180c69f6fb589ac17fbd03489b13a0af951ec1d9776efa82cfd0276e58c553b2046b4594c9621e0aeb160d7923bbfa53f7c9c2a4a077d51a6f38473fb6d7a2b2b99c5414c5e646734fc48c56c18d30997d8073afcb822680b321c40696092a7a9f9072cd034523acb15154354d697f27a312348601d0d1170beb4759510330cb0adef4cf31ca82f7f15bc02310f22c92dcbbc059e34771725685955dd5490331e0bd99829692275598a77a310243a6225f392a9f83910afddc172d124cd295288a77ae051031f898b42d792ddfe8c0902944b68043bba48a25c27323f07d4f6a8c6ecc33f13948ad12463e834d23514af69954395a144d1a4df8f526c0331247d16d05e185ddf04a94a92047bcc976bc17f6b7488dd390eaac4b608390e9fac6c2829eed0903d544b3ff08b2c27a779198387a8112e374ce4f5b0f5f898101159462929c5417bf373420811b4ecbc034eb41aec0888a30976428e2a54463072f3c9b55341147c464dc88b55daa1fa7920c22fb6c8225b2ccf47692713ded1c4a76a479bb111e56cf782a6cafe938d47de49bb47e732223b0bd1bee7bf690d1857044eef2aaecfcda92e6bdb853f01617133d65b67c0d6cc83710c053a18263aa91dbdbef7b85bdc370460375a778d1a31d01c42b66367ed8d9e8f84551002f552f0e52102b5d +ciphertext: 933b2c004331af9c0e4699fedc9fc3999fcb8213c308ecd4e33c3ff41ef3cdad8f02f0f0bfa8db24218e8c81f0934b98153497e7e36fb78d48322742c84870a8b470dca9ce9a017e215d33b9b09d8477b5b292263e4da46ded3ecf5afc0d9472d7690d24d07eaa35644cfd30b3b530f527b4dab5df72947af1a08264abaccc588cee00be666e987de5f0d84bdfac563879916b912a3ba625e16ec3458c08ba116d8411408a9a9044fcb2fb39b2db31bf446b840fa196a6b61134619643116b85d14fea5389b2b0aea25cae45197e14844e8c4b33bd73b85799832cdbb3b5fb031bba251182ad85492a071bb4bcc5476f3a9a5f4c6fd740b640fc87379daa2da4e0819e983da6095257a6cdbb2e4a59055d0251480ce14983e598c5c4f362e49f992cee925fcaf504020134f9d26bda51f88006a0e4df6c4229ce87c19139220bf4f27ad189d9c6b2fd3f3387e344632e497f0f9086752318615850a51730732009afdd4fcce3226645fc26a98de7dfdaeac5de30fb7c676035ac267ec29303b6855a458682baa9b6ae49911ebd981f14ec358857f34a3e396fb6c4cf83911029ff15f23ebd105fe6178adec98efce9e5bf79478a278fe128c7521a81c529fc8544d5c9344d16aefdf7a4da73f4155737238c3d0bf820e1ce3e26e1b5f26e6dc0bbfa0e910988d98c655e1dcc1dcbc4c434b2d2b9420f98323e19e2214ec7e470848adc7c77a9317ad64d4a4b05aa4f72dbb269c4d30c98b9e7a39787f7f77b519afcf42541fd9e2fcc228efeec98bd4a021cd03d5c3526cbaf28a2c075fd83e6c47017cc1837a936f3b1a477b4c955df76d40bc4c9e3165c672fc617b941743fc1d596ac2000bef5a4eeeef54db3922c27755c5c58bfa0e3f2a97b475345793aaf44f371dddbb8c0ba11dd2fb4c6c38d1eeba05d4a1224d59174a0fdce7c85cc57c913a47c1de5bdf883810f833d9eb441e2b9164fa00e84261b67f56c4cda52dc863396f9a7302093bd657cd0c7349309acae2e7ce7b40deeee285552e3c31976917774052dc8c0b80fea4d1c0382825d5f3ff1911c5667b5d9e727b1fb5ef17f2040ba56397d4d8f1bc4fb445a054a39b40145e3457597739d6bd8e5d194e3e6800504c9ebd25129bf575bd8a859a16c056c9bd2e2c8d0d9c0d5d9ad81c47f0f6be82bfe80cd60fb158297942a0ed963ec522c0e5f58a5e7065c113336d55370f006003986832844e940f160682e2f69dbf6edb9d4b6268a087ba28663cd002152bb20f659107c7fcf337e37ad086a5c072bc632414886d328d7fbe79d7785404b550f99510c7f24c3b6f455d3a12a820f26d6b2259d7bd0a0981af26ed4494f66bcdf4171fb2be6bfd9dc1e7a183e499a068a1791d398beeba47af660724656406f3a581ed42bca59ed18bdee126cf8520ad6e7a3c7f37d929f8a35abe5b46177ad34dccc4addc2fb354b0dc266f8a1966510a68a82c7571498fd4a59dfb0004a3bcf9d88c7ef458733577ae764d90e29dbcfcdff40cdbaa1f8963125bca7011c4aaa6246be182651d97937933e1cc74927bc67791764bb20d1a04805ab073f00a9a5c6e74f35e45101fc31e8571757d06df9109283152a2348764329724ac053aa5f1a2a885fb745ce92914790955436b9d4cb59d922e1c4e07525fbde26ce9cf4619cc83888f3790fbfffd1932ca4d6a1fbec63d72a899ed0897090ff253dc371175b8c1db02ae0ac8438cda23c5533a113af068fd34d2b23eb52a30118308a85b6c851d3ceabf8eac3c6e2c54cde101580681b90eaac4e099e9eb35c49e80ec4b08c1f6adb547ffd0618ac7300fc2c032fe82ce1a7dfc7679ef0c0db03b494e48ca8ad2251311761b0839cd3d576980461e4faf81cf27ae1d13e1c3886be97c6da2ccb43339048c2706aacaa160d28771325e90a94025faf4bf4cb7445f318960308bb59fb756eece70cdb134c7171eae241915712b7e3ce2f373cb2ac3d26435c13034b21948f9a462f1eeca57a9a34c4a7b270b9aa8eed19212d0bfefacd8c8011c2ac38e4a4599baa799a9f06f9dcfa1518e04f246296d85cdbcd341156615fab90d9713ddc433f73cc595916bae88ba9a9c411f506b9ed5d66dce3ef9f350d51baa6a11ecf502edd6a2e49df6c25c77c0c814ba99abe4df7208dc80f948408b4af3289379f1ad6cdbdb4165c683aa3428d83cd091cad7aa9d59dd8 +result: fail +shared_secret: + +# Private key not reduced +private_key: 58c5e3bc1a5f349cfe23ada8c99bc5178a736854b211c6b4e29eb498ff88755843e306c1527c87ac5393c98c7766aaf9299c660b0cde67453de33cc839dfc0e2d561e556d0f89951f7543a43ed891d846f348ade2fd956e39d72d8be565be798d4af95321cca8209aa439b53757dfda08792d6d8e4fe4bd399af743ddf58a8f5d5be98be9c5c806d8dd7abbbcec5caa715136378abf2d73ede519649c34c56ab5b7a831894447dc30d5ce6b226490d738282e63882edb164feeb4828d83cfc7594bd68eb7c8711bbd6563e64382a87a693f67957485d05eed5f5b0135bbd0aedbe01594b3a134761e3a7efb567c4554b0d4b6ddabcc50c036145beb88484a19ab8a94e168cff72d330647dee43b673664a024d7334883cbd6379a62aec7b755d28d8d9224e6edfddfca326c8faf5fb4495b991335d2533876837e6f283675ae96ef53eb98b9fedda78ef35d7ef5ead9ffdfa471e9e5575ff339117fc9d8b50baed6bda1d55395958bcaeea399c8ae9fbf884154cb7d59aa36a4d05b5887a2396236da057257e7f8e5859f53c85059760857882ab38fd8cb7a35e4d2745867fb348b5feab4e9cdf210f61e68474dd45394dfdec1e5ad7799ca7dbfb5b3d5ec7c26ddedc768bc389499427955868c21bd3a94c3694d588700da5641b34fedc25ff1c1c90e3ecadcb04b8512342a87df7c98a6af97ad958f775abd890fa586d81497014ed62af9aa7e77340188d7d89076a102bc46924b854e3f477beb6ac2cc923fdafefc6c90c78e4a28e9e96c4f9992be2518e7a9187755805956d28a7ccdbd43469896e3f6df5477699ca89081cb44cc492ebc667204ed8f0795cde24f2d3fa8d00af5e3e6d40300b462f57986b355d80cef454bac56d66aca29f40c70445c166cda05a8d5a0763034387b50c32df573e61d9f1cca5b26ef3d95b0739cb7cab1756a097b4c5a24555bc4a84681772b1ecca530a41c7ebef2c49c2aadadee363ca9a29b1040a5c31d6d8c235543d36abc90a36d92edbadf3b10bff67f6dbe1ebc7c0234e75d2e8fa0df8485a7a754319952db5df485639385e7fd413f93593db4709d8a9489011b93a0e9a3d999b3d144e6be914a4d9b4e96ae573d73a4bf1099dc4ce9dcd2b6cad5999a71a7e267e7729495597997113ff3f38d54808cbdb87cf558c83bc5a39db0debf6a9493abfac76eadf5fbc8889294e7f5c3aea1e34a355343a45c430992fcd83bc55362a7b8ef5f1fd8e6bff2fafc057e96f87b9ec9d927017f3d47eedc5a53e90aed8e5064a9183aaa35fae2024b33ad93ad1c967976d3a8538c7f1a3af213df4cf1fcb4035e92744bafa338f326ce0e1544e18b9f509639bb62c4372ebc39965cab1de31809ebf1b46a4523bbca018526cd681a318fcdeccce960c6d2e5b317e2568b2f4a25a8cbd1844b1dcfc32c026df130ef7f0caa3e6e37d95db68deebccde353d7cdcf2e204bd8c0e6f9ecebca5c8439a4cce98ebbfaf5ee1a8776b09bc325599cdaf2dc35474dfaee43c08aeee08348a17e75f483a3751237f1eb9a43a49702654a4a10fed3d6b591d3b4add7c3320e8d83d2f3e899d80ab6b364118cdd1e4f03828fce07bcd7aebfdeb2531a2536d212646022760484dcf54bc513d9e8058ca527b48b0ec1c6d6cd4549b6ce8d50a477b8dcde6e87efbeef84b7e869d46b47f54465b9669e1ec5ed195d5bd8c49bec69abfefa2c69c684ebf70e5a7a69846738f3af416148098174c038964c8149f56097caf8840fdaf6d4f47a68d333761ebf10947f778f56aa10d3f402b3238bd79f3a8ac031a41eee5dc218673b05a5758df9196a653a47b689bcf5a290dc79dbfdbbecdfec6b430456435df3b7d81089cc986bdb256e93cdea153796ca60eda9d2a8c249edcf8467517085ef79b7bdfa7ba0c2be80b93e2fcad999f87c8bde5e8b5654075a5dcd27861ad55724766664d8a3468b8e3930ecfc9a48fd0dd839dd4eb0e6e798ef6e80bf33335c78faa7a6e1b4ef6262eba7fd79a5bbd854c7aff14265e429fe23258e7cba46ee849713fbac9bd1ea8df5e376bddfc35f45e21f642732cc132745c5edecd1e45a31b5c9abc66d55a95e0f5fa71eb56c89d7685ceb4afe3255c734a59ddcfb5aaaeddb6ebbeaf5be10bead270fb568c3c6a5923dfe649dd12e4c27fd191ab43b4aa8a66c4326e681cbe1207bc2d5aac1ac59ef0a8aac0c8b91f7c23ac35abf566c75ad3b01d6b1dfbc29db4a334b44c10fc25808f9b8acdb4a2ba67528fba8ee942a895d5544857473459763e92174dc640bf284908023146fb553b1b8b1e99a7446c5320ca17eb6bc497a330ded7b1016a1c28d23964f24f2188b2d7ebb2bbe954c9d9271baa7e429c02dab991dffa49410ba6ab20829ec41b03b8ba8756b5cffc640e928b24361f0f007226f2b5315a8bdf8a10aa88581ce5a140588b69b531f5112610c5306fe41d4c018302dac1dbf69863b6bf99d892072591a0168decc69f89823999095f256c52c6336acb063bd741551bb855678c4e8bf90191a38c2fc641957312ee758e73d88d8c8937b9c6912c59ca13854a4209924db71fd8b547a076a340560155122298e91328a71773e1cf117920e5faa8fbd847fdd027f734c06bec0bf479b97cc11d626122d1049e96c7643a6b323aa93e10521460c7193d7c85a1a8969dd0b0835b64ade28df777a1c70646b8e55578ba9da6d82a96b5bbca1b2e9346775d24b987535882468b3e9263a1c74288695722142d9ba23fd747383832b2a3b6720b21cfb5f00a178c51a878992d666872685cb1f346c77b86a0174ac955b06df96ba094101330958452074c57377f520bf0766881752d70c0a778415f9bd3b5d276100f00ad563735cce0952354260c153c3ba227181a21b9f8166dc0aa42acc241f6051624b88d1659a2a81f9cf92ce82c76dadc27bc3b018f953a5af66ee21401c02a4e3b8b4188a36be3818ccb82686cc21d50614f1f000721f8445323b4920b3d929c1362d91ef948371b531096186034d61f0401c09679c54c5a993ce85137f15f50466bace29512e260f990764c31648d6649d23c800750a08f759fa84258515c4625b856eb368d917c36768a8a1471a376ab367aab46295707e94080bce47dd4633c2b50ce0b19bf47d4a68c3519da21c205b0c9128606ef8a7405ac525a12b0c613c7ae96aca34743ca9679bf078d5d016405f336f6088a9652204154648e4b3f6872929f02670c7962f4b08bdda9beb2a33a2babcef40cc4de288460d0188fc29ca85b212eb40f7b158aa4a38710e0608eb150fa5252860058ccd822618961cf5c18a01bcb2eb92dda84597fe9b345e06d14a597917a4748949ce5f29e60a7ab29740242166c5a651501010bbbc73926a7c4d0dc6aa415240e0c0769774055f9882aa4330dac1d8500747bd5264bb7625c2ab58e7917cd122858135ec09a3f0128837669bb37911903854d57da6957d70407c752a20951535503847b17c536a69ac09a84ca64633a4fb9c26221296190b27c03781729456f6653639fc036fe17c4b66b390b2204a1361555323dd307572b2caf24148dfea74eef05880205c164da71980974240b2167b3c3200745ce778a4cab786a0cbb132188158c3111707058884358db6ef3d04480d7ba058c7e52e4052c1898e2918d98590716a80bd9a3a4c3d53cd8111005709e708b04c6d18bb1577219a39d26a496582384f1126fe491a2dab7b8adb4a07563c687c4a6056455113c6fe9b7bd30cb7fbed2839a93a584c76af5c1422dca809cc623079ab65cb146a3011c38c1a6f3db134b72583ab9331d418c7ab513d77b91a612053f217d406babaf4170607a1979ea637f8875154561f69870fb1682a62052fa36a21bf94fb4f24ea54c1658d8bea4e2813707981366a8d9655400db440db8c27af57ebdaa8ed897c7594712e6881c81f5b79557834e53c9b537ab69942830fa60a0c8bc7518192e52396ee15d945b9f8df019f8f32513817117834a9af58ff761a1830798edd48fb571be338b43140c44d17b272db6aeebb0cab160342b49cbe2b47a6a5006b5cac09d763f168c6a5f329b7d1b87dde69542a4437b8c426890b4a5487ab43a98ef94667efc881a943b33b42c776b3f8af853fd59c2d3031fbcf541247100d22219e67094ba89791186bc8b7b536fb6438aba5275d234adc5a9ff129fa7d1b5c5757483f02980fa40882aa0c72c0ef233b0c2931f1e15cb7d528b471c50903256e54a87f8c16f02b3bb904133bf60136d603bc57c503420a8b6701aea4a3b4052334f75bf820c2ed9890bcb812b20d9031c269af9598acdeb8a52bfa7cb804627acfa20285753264f3df670dc445647c881e112b71095f109342b8799c6382723886f5b8371ee58a35fbb48022d9c107ba6fb6dc5fdbd4ff573fd5a08f656a6eb8cd20679930a31caa6a6331c4b133a6838c223ef9f769f6246 +ciphertext: ae2c5cb63dd84bdbf16f45be0e0c322955c2c3cfa3fea74aa30c6706a28e5861a92e2692df21654f0722901fc86576d0378f662afb915da4ef65df72c0d9032f43de8b69eb9e37abc502442fc3be17a539a4958350e42ee2a83adfa66d393d94356b2f81706483a2da094284b7c39d4c7ccb4c3c6b48552fb4a6df7d2fbf5fbb473ee164680217a54fef6d1a8da22faedb6ddf9683adbe5685c61e5410ca24619dbc0b9cb728fed6207f75095b73b4f2733401182320dafd1574b815ac1d92bf61fcc50baa791b540d25083786b221070b9b5ec97c69a2ab709a2dd82224d50c7223bc620a4f142ccba7f138ae06a9839b17f31b5a78cfff773595c34a7092c5c2a67df0392985afc227f171a22283e3fc5c12cccfd8bc98a1adec1ec8e610008dea6bda2067624a7bf003ccddb8b1fccaf84650a4175fbfe299f56191a3251fa0ec63aa6198b7b9f13490dbe41b23dd44c5015f82299f2e873a576b7e44a3769d5b1886b2114b31a5b2359affbaf2d9156e5ca200c36be07c3837e5a35be36eeae315d888da4cb2e5911ec897d28ff484f4a13ea45bb5e645383e93f39b90c600bd6ee8899c5436f18eb9cdc9f7670cd66c42dd182edcd9a1e03c7c7e6cd22bdea33cede3fe43aa7e9bbcee5bbf6334e516e4228112e3165a50acd9c00da196d83f1e71f97fff99912807d5b174377c81b5dbc734175085a1df2535323d821601b42bb08cfc508eba25b75eb878a175e69b9704d31d8d4c626705622821b0fc787d741da974a99c873b11c10157dd73728fa96d979bd825265c5c2fa198cd18db467e391ca1b8a1cd83a3363e763bd0dd1eace13455553f0d0a8b594d2f82443a377ca830540522e1a9ad2fbbc9e974e63dab823d347e93d90c18190a7bb4366e3fd0c81d4e10534056e80c483b998c645fbde1267a0a7e94a5950942aa114615d38ad0b8336b13289d8ab76ff03d49f419de79d309e515d668ba644aa43ab75919f1be4360c0eef3cc0544a80d8a46d6cd9f5bc7e50bf3d22cfa338fcfb015af7459dcd63b066077198fbf468a75ff1d4277c04c6dad16866fe79ad52873165078d3d8ad1ffc1453b6dafc3171235acef1a16912ae4aa7eb4e31e5a3664b19f01bfbb75172605d237c23d22a2251dcb9bac2cff63e54f5a8145fd2bbf63b76edcfd5e87400e50bf239a83693387780a182f4066d624b7ea1feb629329f80a0c9f07369a6a70a710bbbd80a189e92c9de920a4dc1fe1c90e2bcaac35e2b0e76841ea451dba128c0317442de8c7f95dba18fc667d9b4561302e17114597d9bb1882e35515e8a2ee995af7796b8d88215addc8d41daf201ad155e2dfce73610219477b8b0c2adefa24b27534d5ec7c35d0a2586a14b1a796721c532aa269f3859e50e2fe4008a2aa39f86d82bb99ef6162a7fc6a3818d05b69c4af85d2d16e4edfa291af1a9babfb7d460747770cfa5ff0b20bc4d6fc2ebe88f527f054178b1daad883f910d67f36787029cff7837bb147179c0869d2c87395988bb925dedb34a4b8221735131a558ecf6a4c5718b01dee25147cf12a11039ef6de8001bec3423b54c75db145894a412e282146f59ae7bc1d88f7586d29ad802e8ba080fa6bd38db67e09d8c3018836a6e2f48eabf60d2181651968733272db494aa086306f274e02292df35db37ec2cc15b2866617e9e4fb34144420bcd31ef50fdd42106547fbfb2453f9d7fcab4e3f25d56b502f04f0d51d9c725698576bf32b7a67e168877cfd8aad057bc4891f7d493a07b626c43be7610b5388ec6751568b153051dde7922b4003b6c34f3af807d17e9630cc452a49ae14f6d34b4934b81896f4daaded277c1757067c12f143c552a83495226cd6805a73d11724328533e087b980db0a6d22816da01ba0b8f06d4afebc893d1b6bf8dfa5039ef729d48bc274f3a8fdffa73054d8a562b2683c6f758f9cafb7a2b31dc596f628d081b659fdf08151a85a9b3575eed8978085dad4625832f803dbb7cc90f82b3186708a7f4cc5853ca3e1fe958cffeecd27b685d8b7bc3a6707446ac2a29865cf56d1958438bc09a4e8d11abb0d53e1e8f61e8bf044c6541415569815295a9ead015913dd9979dfdbb7e3cfc8fe520a79e8191881e617d78ba0b9ff588a55698b9deff3046009783e9d9ad99fd270ed0e3a4467486303024fabd673dc2322190f74ac36f2c5c0a3dc36b4f +result: fail +shared_secret: + +# Private key not reduced +private_key: 4ccb897e94e627f45dbaa7b00b77dc7cbe7786a89a4294d47a35f7c9464308cfb1d417ff358ad9e07fa768b752e8794218f94bf07a6d2895d7fbdd4381be3e397c80ce956e3e96a604d668531bf0759438a83b35219a6cf39a44d2cb697463f65cad47856debd41d560e7cb694ad6944dcfec10ce301e5a106bf39d024a41ad5d103335c170684cafd37271858595d6ba29c8d8c19a150bcc6d8dacc1054bd7ab4c054d390ff8484861c8c4c8f3d3c4be1e31cb2e4dbbc769fca95e983aee58ef4b6ca6227a2d024ba7b383b3fa752d6c9be8cd9ee6905619fae7c0a2bf4d2586e91e590bb5ec1672442bc9c7af0e6bece484a3b96a4d76467bfe4b19aeff646fb86c74864b39a60d8ec41e7b5adc89ec1fc563ff3ee4ccc9ff8f1944cbf1aa2f4258d6fbc5ea7c46283eed9b8a87cfdfc576d84f63be3c8674eea2ecbead66f8e14975ea8da31b87ff24543d788c340e1ced94ad8c2a2aeba14663d75ade3752f35bbbb6045733e7e75e9cd1c8594eebaad83a50003b73a0dbd69e6cdaee53db7a7684afa3b4566375b693c151daab378d15f1f517dbd4b3eb6b824767724ec7718b4d3e5f7e78d1ee90c289811c7e6c79a846143f43ff383ede452f15b7913fdb764cd8de9dda2c08b67b3c4ef39b63bc7bb7602adac80cd3dd4a656dfc89179c34f05976be42896ffb4975a3fff259895dd433ed73b4e77b7e5127a3876849e1b039cb8b7eba5ffcc640b93986974a47ce5974b7ef3b3745c3893b63f784869dac2dc44b6ed32592bfaccbd55f2d336accd62a1fae1388432ab2a7e402a62a4bceac65d3ffbca57f35d5a952cdef3bfbfd36ac5e5adae117ce89aaa95202cc281ed8dfde77952bc65675e3878d4d77bd45fdb87520488d7360e818e2f713258f0ea038f79059c872aeb1a6f5fb60a9e7d8d6dbc444fa836ec164dc890e3e5b1cafbc4857445a539af555d6cf7e0aac7b9dc15a14adebb357bf3222efc6c63da63a9ae1d1b59dacc92e909eafa9d509e7a66de4ecdedeb8252d692e3dac47db872ec36bc4513741f3ea65376abe99a6d82f6e10e2a5ad06dee3b785088b4f98649e4466dc6d07c3c39c9364ca56dae67eac0be3bd805cfa29d54e94d3494ffcce82fe837edea8366ed734aae163481ebffce8519bfbd6aaa1b29ad09f8705e8582aeef77426ea2f48bd3b2c995eedbd2472fb287e84500369ce1b7ec77483d1d3d653a7657f953b0513e92c985f8b4e9f856696d256bba012bcfdbd8c3256c996a8e9268d4d944b9d1585dcfc255411c19614757d7446d9356e7ca801cf6366e5338be383267bb339934c3f68dda85bb582c7bd723ef614ebb22fe4aa1bf5df46bcf1c6b42b1db5b605ce7f0eddf6b23c85a4cd54d7ddf9d4dc21d28e0f6699bb97fd146a4c2466cab87be659323f90dace82ead555f4e7009b3ae20f6cf20bef8d873d7ca75c0047cf69e0fe00c98342f39af8d0d918f93550c668f9e6c4423f559360e85494c5663ab81bcf7f91a6febaab8e681ee9e38154c4e18d9e65ce84a9396e1dc813de849d13a7d6a2fcb42bf346dac86f06996f8b7ed40dd9b44ca60233c922985d263e88c10264694ac305c7390e2b63d8076863875d47d9dd88894916b54756278c6facd730f4abacc1f9843de610db66892d5f61606fdc4ef6f94fffb736ca9f44ce6d48f6f5f3f41514e6a8c554875dd94494ae3521eafa6d45cf1f58a7177b242fa9e9b185eec54659c887005c7d2db26a05cf53dcfac617944fabbc7d7ea449912e9d21cdc5716bb469f0dbaecf754cea89b36eb6b1c23df5d439b4ae9d3f09752effa555f28ffb1c578855a44d409d58479ae465eb61d44d48ff53d911a51c547999af5aa776ddff4b843502d43fb583e5fc5af9c7358505d65f1e465a794490a2af96bc8bd43c647e4b3f83b24c4ba43d1b40c462dccf0f28bbb18cea0706a5fa094f68298899f1adfa4d36c74a5ffbdca323bb3adda17944ce5898cadf7d876a458dd66819ab43e3fa9a05bfee3378c23e6cbd25bb2b317767866406d374bd03f7b1045cb96f656faf8f282a5e56def6dc287def493f2972668c5c746deb4b57b47d40e9aa732c79a249ff7723576f09ffe95a6c80f6e51f75f3fe6db352dda9f806e3a370eb6d627e9a21c3696e4c9f815d0fd9e8d96f73135fa51010a83491b407571126d85002a60cccceb5393b459cb39b4dcf175b2134cf515c06b38cb0ea33d8c34a7283b99b6d0c9e90825159cbf4bc2a1c0f131580557f243184bbc7498b39266f669fc161150482de480ab196ba61dc526f8a46a2ae3336a7abca9e2743fd654e965b3b33ca0b9cbc8c96095d78a971a7277496a8c123967e8c204765a864890b762d34e83570a8dec5cd25333276555e7644eeb5ccf8004579c357481000ae9a930a7313468d3a8b6d5b4da4a558a7c1318da670dec758c98c5048144843096c2b781d73a9f215c2ca0481ea5aca259997c8479256841507717b7dd01cfe1755f8ac2bf1008c2c61b7bd13810787185cdf16a17c2cf00bab7eab737a641cc12ea6d8bc802e0661730628194c40a7865a3587cc2f5b0ac1d328307c55388970b96c4969a533e04b425e528c713d41821ca6cf1f5bc74e64859c49b914563ad193c626c6dc520143a755132260d5940c76e20a7f07987fa7c1a4d1283bd700c9759871f973fa6d94fd88015cffb046555b36559420bcb98ce617169465770135b15612a9884586d0232d44606632c50a9d5beb3697669c9940e1739508c360505248f501dbbbabf70e7cffb24652b782de5f4a310a7767826bc73886e60e51230068dcfdb2b3ef246f7701d65813e54d78ddbc34cc9bca025914883364c60576a5e0c5a863a17a9872b818c070647170cc46f44880d4ff46d68c4694442433c823c0ab39656b715e0443e8eab14a990c42a031ebefa6cfd54c32fe4521e218396d53c5554c60b93cf2f1cbb0062c6101686e5738896621e44b32449c297d968b16c80ac7491279dab0f84749842195aa3dabbaddc2457fc8b854752d33cb1a5499dd53725bf34bf34a68457e57e4b270fe0f07323275fb99b78aa90af27480b6440217b01867a1b7a5a5885fbcb931c524395cb11a406a492c4251f9c09e14a45e2b86a98c72f1532664879a2d5557fe9db6bcb2ab6197892e5686b2e1ab35a3434a77a65ebb6189aa00e19fbb045a03fb767866184c5c2e2b155f465bc7a135ab25cc5415b0a42aa17595a32e2a370317414913278c18837f346c3a54be5722520315332b2b43ed4089b427cc8e24f10f17610e40882b4c724c48b6315aa6f0c64a4032e4be75bb6b0702a2cb7a11cc6aa14bccfe91af25642513425ca475fd7e7c387214294a36fff09bb1388a5322910b9906491bc923a2644259086bc5131e5d67794d91f65b24a0da06ceeb63239456e6c3b1cf4fa04165879b5858bf60664aaeb45b3a238b1a926489a2d395473d3a5173fb37a51fcb5ba0c9cc3eb01debc383260b4f5033bee258f66a504e64a74fafcbd1a46076ea00a02246eae52ba6591a8ced21b58971f289847c508768dbba5ab1921c14982c9525ab4b64285723954d33c8a35396db137c0db48a39432da0abc3857c5369b236bc03ef562a8a5e4211986a385b8ab4d1745742411a9712256636e62976f99a72d75c654f8574737b6ad34c129a2eac22fe166b2682840f7043d4339bf699b68d51ecc32974c161136272f9012219bac6bfa8950c6016207dc6566d20b916974743290f0a52b8be51c9f3c239e8b6842278417a05dc789bc43fa1ee0671a51ba3301246ba780ab71295cbd20ada7a07e5593a3933604ef972a711349a0678a60d2af2434b17ee940c067bd89496c90d4b9903b9d146a49c36138dabaa405499ecdc02f791562a5d446fb358702b2a5eaec93b7f4756762b3c17b0e8d48ceb5d5244965168fd9c3e6495d1fd578ba2c168805897cd351202059b5a4b96687465741b077677583ca7411c4331583308da00ab5045ec5943beb2800b30978c31031675a84dbfcbe6d7b27b2da65152c692fb8727a485b9641888b1b36a25491ac76045792278125b0a3735f3e759901507ca4a2aa12dcbccf3c35c68873518a4fc778201f0b960c7b551f038c6201378ee101948629dae0364e38ad079320d2cc35bfbc8ae7cc446526447d60b19a36519daa8331a45f1e4308d564979a5179073130594cc5fc07a1fb6b5966277511544611e018f3f8b76567add2c94a0da8502063c66c54c3a50644e43b81a93c7cf0409b505c77f5d06d34432bec389a137b6fb9f18da05426d03477ff0b8185327c37f449c8f6398680c78ef7d26c51bba9665cf58b72cdfb115bcc2a0715b5b4f40dd01c7a0585bbae739590cca5e4b82099b66c7175c5f858851eaca730fd0c55edf9ae451e07bd366d20a7237801f470fcc2bd9fd7bea8322859b850f7882d362947432913dd068c01 +ciphertext: 3d0c67db088b150e110e9a395a143a94c0bf6fd9dab5ff681c38e1ac6f34156cdba2b28bdfcb62ad002b1763e31bcf6316df977e6533e12536bfa9933780de5cffeaed2969902df53f34b1026543523dad947decfaa8ac43b223a5bbc59dd5c7647fe3a17ec79a84e89e820bc0ccaa56016540d3c821ae453dec695b4a2232a896264e475cdc16cbd476fe8778d57e5a31e6b3e6e9dcdc96c69ca0d25da24b2a8ae65e6f8a9eb723594f8e989dc10078e20f058ef8e765c96093e9faea1a5919c27e69396b53c5e87213373ed900a8a763b9cfab262637f40038826fb7355e8f0cb8672eb3f478e577956fc339ec67de582e6d9b5cd578874d3db3d774869b291c5ef0b2a3393fc4dab94510401ae107eb65560d9685c14b06a788fa8ad177f76b176007ceeeef6da8913c82744ee66813004ddb6591a02e745a960a53a06e824a28cbdb197591dcc02658d4f7bdd401bb829a9f3ad2b3cb3093bfab0d8acfa0a66b6dea77e9c905f7fc3b0063f3cc12c190ea6e574b9b606fc5243ae567e88383b2d936e89c2e12c23850470d09c219568a9a8de66bd77612a4f13718da6f0b4cc20d9bf0e437c859ceb6468713159ff61ba9c26f9393fac3fbef93c6718d400ac9b5816c96e5258416df120614024bcb5e7eca61449af540993e27a067203237acdaaf8b0e7381e3413de5f4eaed01e7092d40b522e4508c3ae928996a960e4866f78a0b5b42a7bf43298b4d05169e815e82802e9afaa2bad286ed0fa4a1efffaa1e3854aaa9bf12121ca7c6711f6b4c838eeec2a9b5da3e4ff080d513e18b71e4a71bf9fcd544ea44d5438d4f56bc269c63fb2b4f4de5ef9551a52b7cd781d4a6ecbcbbab8825e2fe6693b41f34f0c07690971aa6243046977c0c48713b9f2c320686e02bb01c789d9a6e46f9a3b8fb480f4d7c755bb5c093f4903a5f332ed9a805d024323635c4a51667394813f01a634c90f6a82a16b6bc1a2b3dc7e25b0947900051da0e5101900fe7c725324fd5a316057955ad4aed9e08b67405dae766aa628f599776b0f3dfa2b12c2e40e480d7c6cd4562f0bbb206eb4478125b5febe34c7c81924a3fdf70ee2f21ee2b3fd0823ea16edc4a5e07f2adb10422e4df4051725c6a99e4f5b8f463eed69d8921ce36e7ce5b6d14a2be719907d7c547a16ecfbb733868455aea386c52bf9adc93bb1792bf0d8b056386c6311015f47d6319c41be520128cf2ad3e1e0e8a568c4b3c07e2b10589f6498d01cac1f8c2a50d20ef7b3ffae9267d3cf3e66cd57d6d42a87865131d5eaf10f1345c1883d475f7b29c8f07f04533f39dcceef2904ff0c6d86b1ca1acae4f6a20a649a95bedcac1d7e87c17cd75ac8b1a636acc3187eca7586db053a6595d7c39ce1e57e839065793c2ec2072371cefdfb9e62c559c3d2ef9b736a61a72695d4349d933952fa9796bb4d39cb5a88709474472a19da3b7589cb01a11de4dbd79e0555f6a290ed047fe4e31a6ccc35a904f4d30d363f10421f5a9de22c059a6ed0e404ffb62b0626b0b0397c30c59d56ee18364c8371d095d1cdb0ad08dea67dbeba8e2883ab4762d4b2ca32485a6747893c03f137780b105870284d523cc92cdb85bb94602bbcc9736175a3958629fa45f26e6c8a84fb61f5a0619ce2cbf5d4178aab325b393dc1c201ea7f751c8916e5281db2eaf733417f12c3cbae76a2c891e7291f54b8aa7e91c05f4bef7f75d86e7827dbc8634f7b4c19c88371087a5c80fcb48aaa051329e8b474d0ac5b606b40323327cab61899c0f12ebe3142766f70da217c57534983041eea96206a27926e4b296267a6f555356f3ec387b2cc21d541560f932e716de3a67fe1afdc193027a90c8b5bf14dc60285ca131a643a1231a5552d624bc930e7b5965871c85c5ba055191c23934e651c03570819207df6e4b467bfa0f2048838ab9658f9abcc6a0a74d81058510d435ef7239a334437cd0254eb4ae2760b51cc84733f18730ba68f48c73cf3a211c9a8ba65d61afe39cd6d5e72c4589b7a9dc4a49a2f05f17afa14c89d4ecf1fbf5769cbda70a570d73851694e1c3acd74f80a25a063843664930f168cb3d679ec883b82c471ed634238b58d43bf732e71368839c64fe1a54e0d8d4c58e06f20848c823f49dfcc17517d60fa56bd5e496990bb973c52596eae1077227e33b04cbf67a30ad91c510bce5f9c480a273b205446e +result: fail +shared_secret: + +# Private key not reduced +private_key: ea9b6cf64ae8d0045a6aac4003a3dbd833a2109bc026caa6b9a38261ecb70f9992ee3a47bb4335ec8d314e699734098179cf5f924444714a9348b980ac7699111856623c9d9f2b4f7da5cfd47970a149c3bb98ff84146e7b8562a549ad16e447a8ce54b2eccb391fdb44d6e19ce9663d34a646d6c31dff96f5b65ccb055cada93c272ac019adfc1ec93c907bac9b7790cf6bfc129738e573c5d84734ae095801863b654b7410dfe6eeefd64c33de6266454d064adca3f428e6944c2a7951268f442df09cdba4837fd36a2ebbd35c71d97f8e47bf91f9e8658743e6dacd525d8df841c3acf335fbb47df0d28f38d37bf45c08ac1e9af8b75c5b29b8e0d3d6d87fdd58cea97aadc75f28bc92bff3614ecd4c8267e6f79b363ea7eec215974277c02277322c1471959ca699aab4662acc7fc6f120896b14a3a2526ef80e7741bdfae8e32a72f1bf67ffc7b2118d94e1378b179d93c007c077afe3e28b9249acc9b2acb5f8e7972ffa629a5b40fbc9773fafe354c3ebad947c46dd79da19fb5c4b7c094573d1eafd378c8708d98e5516eb938ec2feebbcb62a99b0c6a0539e345b83e788e6879de89d9756a8795839328f49849bcf7e53fd622a319e57c0aa8fa2e034be7587ef079e7a3193564d3f31590c74eae763844998a07d3c6a6647378f3e039a57153e535b0df21a1931177a4762fdf2be9f5f779e3c523be28fa54ea2ad4a202e96509afd661d6950437f13d463f175f691ab919e7fe18ce743441bf73217acb03ccd68ee6cf95f65b67c8ee56a4cd757c86047fec20dee7f6eaacfc55f0734f3abcca70834b550a4bc8228be40ccd8e723b37fe945f77de8b6f4808257607aa6e2f9577d6bd86fcb4ce49edcb7d9df8cb5fa63b72a41d42471a0f8b014f8315e1ab6a894b2dd7dc71f88fc00f5fc3f1534d46c83b3dfbbf5cdf58d9e9307e9470f9df7e6bf61bc36c3362ef99e1a990ac68b6a735c3cb39baf03af5c5fd6601a7a6c34d11fd56a975e90b0b675d33381e64fdd03dbcdcf684f782cbc2c8d791f0da0b289e3001796ed9baeac1d3be0efcddcccb0395b441e7f746b6ce34714d8530460b473466d6b8f69ac8518a3b26c9ca22d077a31a3640538cabbfc852e3e59fc26730fc5af89c5b5200a7636e56f74f99953886f80b77f6f3fd55e6ed48cc4e22be5f5710a4ec37f628cc5dce549342d3e4e81253e0dbfbe1d779b8256f0868f9bb2ccce7439de2018ba52decd090de0e097d254f4a73fc637d0f5c6d8f56ca376690265c4b7773bdbbadb0898dda2e8fe79c87402c38bd60a4c08ffe9ab3db3566b78ded736830ceebac43d033559e81364f9adcae5096244fe5b7bbc3bf7dcd620df921c1fa5feab37c8c4d2ff97718fbaeffe79e22a6588054edd9ba4555977b2cb5a97e14ac626fc4770fcc8c325b4e03472f8f6fae7c37918a48f6edbe5c1bdeaea2da84b4b7113a74bbd39bd3318c23624d1f2ce5fb95875ffc55bce76c77c3563d40fa2794b92dd9ddcf9f38c5809c29b4b7e0e38c340e458bc0db44d8ae1594a87ca96bab676f77a7db569e5c21f574563da3dd139ccafbaf9f8a79578a7afb0a3dbe8f8914a17415ebcaf15de3f5b4d37aa6dc70884b43c066698cb4a004aa9e32a4b125da98c7d8e185a5b4cad9e4688f90d33c13c24e37a2b61e19495597e90d35afed82aa0f996eb04f5e344e4cb0ec6dbae6de0d635c4822dd6a23d470469f62e0f8fa6c383417ab81586ae5cdba77717ed687c99dc9ab4ae2e692e7d679e0c4dae4be243294146d6bc1bb4b8d6b6a3e8eaf4a27c62961ccef556359a9486db3642103cdc13aff4b3cd35792649934de0153ce503e7976369d5dc54fdb389acf6d3d219e3a25538ae1e696b74576fa7997177343914f459557f8499b3cc26c768a3d476ebe7e20b336baeb4c65c7fc8518357776c774cf48996d6ad206cd92c9791e55c727bac7e917afbbcf994c5f9c4330976b1743894ecd24dba7997e33efd944405844c01235d4308c09a75548b43555a8a6ea1efe2f5da6c8427862883e49cb6c3ce8ad7ea39af30e7a7505caf3086f798e84bc7e965ef96c51899341567c1324b6b07a984cbe7aa6b56cd538dffb106b1cddaa02e5d362deef7383d8e3e93a45cacda352dc4b81e67d9587a4c2e88b6ca993b37800c878b5adbbaef794f4f24abfeaa40eb1c5763fa55b7369e5be8754beba6be9319cc3a482a53ba93c417bc9a5a3030cb2a247177eb11b63a672e0039fe71735ca9cea99168d1634df2737b45324034492e1d3c74f10239564b23e39585734c86d98118dbc944dec28869ca8be7e17b39bcb0b0e34e257bc9ba42cc782078945094eb1336e516c62b00871d12c6019700b478b5db43ac419b2c7a50442d9458ba4b853d5a29ca946d64b6a6e6cb3485439abd4a9cf34b5921242ddf3611289a72efac4101b208cb7598894a9ef1ec38e34a58b2c071b3e6738138bbaf416f246072ead83b354a0832b98b551b7210095fe9323e1f75bb99905e5bd961cd778d32c1be94512a7893c062f6a66553152d1c820b8825c25938c0348a3d2206897ab903e6472193b5c2aa3f1bfb22bce88bf3723eaa8292d5446546865218d5827a5ba0da5354e2f6c81eb96cf0f28efae54935138273447a953aadf9757319e03a6ad19d7e613c2cdc7f5a3aa1891368399ab5c5337881c782bec48f9161774686204027b6fd895ed1b800db68c2d9d529156b0a8db90f107964d8f5c860737db2a3375df20b7bbc7f1ea57ab6e2a2eb44b5f8e6980d5233a0791350f4ac23210a4bbaa928273294691b7c441edac04909472e8f6714e99bb7de1076a121576eeb1d419122d4366023bb2fd66937ed940566ab07d7b480b330937c341106c3bc01f3c26eb7388ce7404222bccd7cc42e8a56909239a2968f2da3cea3c6695cbc909ee481b4c619f1e7ae6750b4d8f691d70490134ba02cfc97327c9f14db4bbfca7b4589431e0b8fb8dc61658110dcb675dd1bb46db49605c66534ca53d918aee579557e82c733a3841a7338f9947d92d4379b3a2d47469166bbc20ecc4de2f7c768a0ba4dd788cebac30eccbdfa11ccbff61328f92739e12160b83369d8466421374380a1a2c8bfd701a869b49d09644266d300493badff092390e894102028768a4592e96306130550291ecdaab48c711e8a1822cd278b80357856a739174b3da66795fa8375333554fc92298dd92b3c962bad035424f418b9b626d32b5383005564b8cbad0915a977b1c95710ae490bfd158a2c780e14c85ef92a02a2601c3538c1297772d1045bc4811e4e7893310413b4121201eba6c4db8658378fa3a6b9b919c9247c40ef39a7d564bf13a6c8ec575fc3b58f42426ae1a4944cd638bcf8336504577c65a7b75b06649802bf898fc3337ea3f783bd58bc85e33c51c91412c09d99c310ab9802ddeb4e977a640eb05a6e01984186b62f3237230b33cc4721d984382d003a4472496c163a0c23aa7527a7a98b45260794c109c3ef645fd352b778f06c6de40ae1aac577698edc053e951931e88b75619a2e3a795d9d7a015fc39978ba6832da41dfc1aa36d53351321107d33d00d934ce079f53c1ad114b622ef09fdb70888a861e8b9334610a9c2a5614325b9265219dadfb7eec92b472c87c0f0181e73c580b9ca8564bc1e3b9b70528a30d0c54bbf48b3001c46b536c51e15c4d0844fe81bc035351d919212c699a455b7f0900121a77360f4aaf09443e9031ba9286c0ef18a72a0c6afb2b380452379fc14dde6a20cae7c703b8c367bbbf4ea43df773bd6a3a4c051caeeb66a236244f7bf5a837731655a73bf6e7a3413459cbac0dde329e59fc9521fc2009e480d82711496a5871f33d0378223243137486504a209d9012574b10561fc04deed84999baa3a936a9b1234ac4c4afe451042f828cf40c49e632c6153684448154a023684af08ce13b204ac025991c5e44b63201073f22a50c935b9bc1c488aa8a704bc178ab0a752595cfe050b341a295f9b851b67a3c09010ecf297791c746ba9247df2a1be5a82cc8f904e1553b31d53710b0b0b7372b8e9c0b7c15636097316d46587e07753ba05e03f7cb3c6c78870a7ab21ca99db30217245a29fccc3ed80364ec661ea93194d472813a3cb0203b223b909c5774f2dca50e8a9753e36c33d92c278a52122a72fe389f0f962ce5d3a1d9f5c07000919e4761a07282e016854579b1c2e7c608630c6b2a6a1bd96c71392b9ef15e04f7bcee414cf5d9a6ff701c4d2586506248f4bb6bd4ea4a45fa79fd92aecdecbf20d7ad8534673832a0d6ca13c561a446aaa23539624487767e4a195dce0e2bc6a3fd1a73e918f297aa031fcd8c14925529ed33b83ae8e7ab9b3999082be47443720bf6b573a95207d1eee1b3be613a1985b3d6f48dc648787b534537addaba4ecf14f02ab317d36cb9f0f50222ced7cf029dff8a0d3d2fd9 +ciphertext: 74696b4c1a221c93a233381becc649df53c59889beaaf8cc06879dfeabfaa190fc9d7a9b6995bf4d9571d3277188c4db8552bf90a4b51787bec3636efcf8628e199204f230241198f517345d76a105ac070cf81591bd22bc1e566205b7d01c16c2da03f1ad0682d1f32ddbb6a2ae8f35351cf5d5bacdc727d603c3ec4c5f51a9906a3f12bf064d27a5b573a1b91f652c4bac4155045d69669158e226676c7049a439fa3213ef20cc61c8f0b89c194f131e172ccc4c1f6c37567bd910eba09c21abbd3a8ab275ab15136f6fc92593766b930983539eabc66e7f63f572fac05348c7cd6ceabbd1c4865e346298b6df6959caee42fc1b60df6373ff46fc935e881b478a0983c1467c1a7fd343693996668ce1d8dd147193d85fa44277c5a21c57d1d420e1e5caefe51049285ec812dd0d4de6117ea2fbc9e9d74221c4e8340895ecaf684081fb845ed994279e1ab22ebc0ddaa9eb5066052aa9cd371894035d56d125f40bf836ff159a14dbfc99d397b703824b1a7b74ac15514905fdadb8034c09f018d3d87c4d2c2d520a2bb2a240050fdfa67a157bf1b17931106c859256b5f06da1ac1666337850dd9d4fb1ff879fab3a87b645c0e1d22b11599584e67e44eebe9d3d6864538d86df728300268f0c2fabd12b474c7fa2bde4dd04353cf54874663a029e2ca6017a6a59d6611a862e3826a1f1f18b20be5beada3bb1edabf9ef0c0ce83ef22674feb2147c769b7534c4f50f80f48cde1db0ab0934815e39f963430ef4f6b4204016363e105e258e733371c8d6a8c517150cc75cdbc6dc28c98359ff083306a0b5215ba1bc17e660dcde16add252177d931b6d8bacc181dcc5dd285825e083abef17438904b46d21b2c3914543f34e3d958e41e8089f89f5aa1af040fb1258ddc663925b55fb486dab814a45210f0ebdaaf4bbf2115b0784862c640677fcfdfba3d05c47e2c5ded2f6c03b42bcc9f87fae722e895bd4f91ed91207f8bdbd4f849c73e3b53e8a5ac14b500ad19fa5e9675592595250c8e54795e829443d9c3b924efa8d64a3751e34212205ea88061071b7b4fb8309e0dbc0bddd329a55e30d4eeb3369e9bdc2d949565f6c4ac214530f926b7dbc5b6bb9a645635b3ad1056d36606c0bc34089f50646f0bb948e3ad50cec750de11a3b4436c572c10608502d8ee43dacd12b20183006070aca57dfff0c39edb760b29a8d1e2790825961f8d3d2b27e4be8d06ba613f80422e40d77de5b44793262fb2e5c5d613f4d66f8d6e29f5aa312dbb80eca37d9faf6b98ba63b0dac2622ca7eb1a53ecf7ad39a78d34dd787ebd686c155041adc742d8c13480b36dd8c50856f2fac0c8fe532260b6e5e8f79d4836033bec19a96b5c272ec3505b800b555a763bc7d673a876a9ecd4f1e64fdbb6bc4710066b5c1f943a53f3e934b1f9d30e8edfc2aac8c775bacf9a447626838aefa0200df587b4a4bb930341342d9bf4af28e196abfcc98fe8c98ff3ef9a318304680ca5221fb7f8f408e6f5e56ba69a9286afbabf3d733ef1b958cca8bf57c2b7e23c1209ca90d6e3e8f10ddb54ff29243fc340f28b97013f15cc21a92299e4cc45bc007ba13c69f3ba4af497aa17b289b3379f553b3ff92318d7f5f3fd55691a094761ff55015be61a7ac24128f29f552ac8faa5ed8ba3a8654c035fb08180f1a72ede79cb6c549475cb1da0de23e42fb887a30ff16732131bad9014c58364c5e91bc12988ca31a8d9ea5dda91411f7cd5e8f4ca503ec1df40ef53bf0893265241aef66fa85fc15c07726439e741ace97300bf89fc57ec746e34c40d9e6561f69ec2871ab520723fbfc72213d7dab6df13cb96311b502423dd0109659a93b5bf692eac025369a9f2ed7fa6a30a824d29aff97a5299c91280c4f9256677d872ec35df835a20d621b6e407df36ae67d769a30899d1f3ee148b7a8b2b05ebb3fbff4046a08b9691b5036d8176d72dcb6227416f68ce7de42d9afe1a7b20cfcfaa6803e043a0b11d614473b46c09751538cb9acff02767b957efbb3834e282f439565d3d144d5823653701c19a1ea7bc0a204d72ca7641377f241df87cc98e0e355877fa1ae26f91b23dd2113412bb7c03ec8f27da2612e26ea61a911a276cade74d287f57c292b4991808a66c8c25afc3f1ac370333fa9c9261db06e9c6dae2446026ac9b95641c60ba622f5547653ab4b654daf578458b0 +result: fail +shared_secret: + +# Private key not reduced +private_key: 09e4c3ac7c3e706ac8eb1a3c09ecc4c26a683a4bd141298052f8e871e8f0ba3ea79e4a329265d098c93be9bcdd9539641825928d8398c1d5d8265d489e1aa671b936bfac883e23ce84bf4123af8b20b5908b4c5d65e4c8322bcae55755892c8896d9ad6c4b78f1e6e6aa37c61f4be17ca77643fc65d74746b22edc6a0c6abed7e31f79c62a5b90d6daf1139682165ac044dd63b0d4644edcbc9746c498a55d2cdce121996cd82769c9f388e2c37e7ea3b5e4e76da12c4121bbeaa40a5b8a045e5ef767ba2bfda22847434d49e73ac213f7333a9664b836abb08650e147dd4e3693898a802896300b0ae5ed3b62c8156f76f6c5573946754c95e248e36f3370990dc589c38e76d76d946581c554aa5e6d8d614bf756963a3c05e3d823afd6d4afd428601a1c5c7de8c58d47f7b8bbcd7b7d4b2b33b161536affc498e5d6ae2d1c9a3fa8f3dbc3f664d36242185c6ead3c11fb5e229d5dd374641b569ba4e3d96ac5833fbad641e4dded086973a49413d8596ea97c76f4838c37824db6c8b54ed3126decfde747b423dc9179f7fdef6777f7978f3ada3c89c93439ca7f1de21c6bf074f775acfc423abd458038c90e7eb45f83899c8bf0be9eb1c697a12eb958f26e8a2b8c5bf1a8b1fc765c7346b53f2c8dd41ecbb8985d93f9e84dd73ecb6d36b1a73abb38505754d0136dc2201f3fba5dcc550563c2f5f40a09f3c5caa5dfeaeafa84b23ae8420a6dace82f4954ecd80025e3ed63a4896c96f468f4504341f8b8b84dbf979947a923e3883eeb3ce3fd6ff38a72485d4c8e1c6ad1cde4847dd1e137d5534847a676b2c824c04e7e467a58cecfa97672069df0376db9cf3d150dce63fea0c4af58b763a58077a1fb0e510b8d71dd939ac1183e3cff2f880b5102878b1317a67a874d8f3eeaec3a3addafe272e756ec16b4695cfe398798f2ca8d7a668ac527e1329b304848f8f42bfefdb9823a957d601381d2e86ab36df6810ed14d67887a99d337cfe8b2a4deb70f62f7ce593c6ddf46de8d2f18eb5a956ef6be81735d452d97e28f0de36b98302ebc3dac33780e36db6103ddb5d8ebc6a54fcb46fa6408d5506c79922893e889bd6d2fc16bade8b9b5f2749950bd5ac613aef6e0bf409be5e2f61d6e3e757f749a5efef79a5959d96b47686396e59a47ae22456257093f27455c402574fff7f5b59a7afe89b036e34e629d928d7db1605f5daeb69c72ad8f207eedc84748cf2e9fa38b89b07ae5f576885ea73a4f773932fae4823c40503dd4c056bbf6463269aea6192443dd06b92c8cb0d11bc9f10f9d6b4c9b453d4ced0f8c6e46ba3248b7f3aefa1854a1aa1ff9412d35f25e9535e53777a494e5da9ce12e95d7646ca2993b38d4d9f6cb3c9baa7f461bac9a877cda53ee1c5f44ade7351274bc69353437f4cc975ee11ab74e07a734b2fdbe390b3421a598ac9e770587af7f16cd043990d0d73af2e861b10fe7b53865d42c8e8e1baa52735f694f48f14b802056ed975cff79bbab13dd717dfd8d72c9a9f9fec60b5cd1362cb4c176f0b6ac560476e72888ee205ecbfb7cabc34f43236cedcc19394bdbe15ccfa2e6443527f7c446a3ac04c58dea3db5f19a9bdbb34c61c3c79a2ba4770e73cb55c51729d8aea5c1e696dca1898f51174c7f05de92e87d989a36db4d9db70fac0eb8bf13655ea8e9b46956b9b80a4e989e8623469d092fe4971b4b32c34c5bd9bc5d299eeff9762aadc8e935816e1532853952af0d7a6faff4849e69bff49494ce3a594faaa5c3fd9257c30bf36d5397dbef195dee68e9e185a5db768e950986cb8d92ca47e863b442db96b62877bbdb7e79d6ddd9aa6f6c6c8537a114ccb67ec714644bdc9449d17dbd9b45d78fe7ee862aa59d57630b0b3f0b17361a05aba7c9d6f3d66c2a1c52db0e35742c40502ae5f5bf69c66683038b4bcc9aa5fae69edbd765e8cc34c5c3ef0f66d08a04c137f9507096c1a173466a8b496e1c7165cb9632edb039ea8bfd55374d674a9d2ba84edf9cd30d600ff374ff1f8a8ee4ab3c8f4126ec3450367784d936f09f7e4339cd050cd23d57341ac63530c8808ff734531c5e812e61bbad697bb9b8f2545e37bfe55958af41d4bc96ef7a8ed5bc5a24386fb73ce97b628da7feec87d3575c598b7a95f36c89586474ce4e3396886aea374a0c4886e4185a5ad8ca7f1a7df73c6af1282397a6a9b94c95c8284a0d65c3e614cc73159fd71bbd699006d1b97da241c470aa28113a24eef9856ecbc3619bbdbc25bf1691a241414cc3a816433c6d9466037cca4dcce8851aa9a182fa9e7ecc47e42713e9f81189cb5b68b52389095544427321ac5bb12000371a1e1cd96b585223eaa02218543c6f32a777d79c3de28d13dba32818ce41d13e2eabbc3c1223eae799057c43a2977ecff4a5966a7e52d0554a8907cc39495fa80339160fce96742fe5679cd4c4648910ae0715a9899530723be9b551e404b88a1c272e72b1b3e56144a4974df799eeb20170862305e647951645de729da99bb4fe579309d4abeac03ea4d029990b3fa8464f82e4472125bfb98837e275508d161dde593b490461e6508276b344bb18b93cc3c965e084df68a68af14e6bf37b4dca585d0621a4f32263abab1684ce0b1a5fef971e8fe18928d38477572e55596e35ab6270880c2e6abd0ee9080e75850155273aa38c0bf588e02006f5837c01063360773ff79376a72380d9e123b199b561007f1873a4ddb715abc93d95c7a8549407ec94cd0b928b30e3cdb15804cad99ab2202005675e68ec6f71f70082139b42e5bf02abcd4a4988ee0a16415a095ec8b94d2431070a710d72a596e30ed4588fde91670f3ab70f35a5f0870e86927d68f641faa10f962941e0026908ea7d27084261d190cb62b4354a1c8f06ab864031341637929b1274a1c97bd62208e681f3a96333871c41916b03e668d7559fc0a67deceb0d2f818f45d82a9e4a679d76436bcbc45f1c971e966a6cfbb4e1948f2e4b0620a28d633b78951812fa15c4696a7bb17a9ddec0329e927aa1294e5b7974bbc7008a977e0e13500337cd62b281bf73920f02b19c357eb57b3c575265f1e73a16b455af856826f29be11049a7005d9aa401aff512e8f8210f296fe64ba0ee77b1734bae34000b85c609d8bcb39260690ca9b82e105746acc35fc49ba6d1461a748206361ec179990c1b2ec71387b51c1c7ed344b816008c384eba96432ed66fe4e7225c0047e2b2979bc359a891b258a2cd40ba3694086489088b42452682518ec4c1bf8b56b91519c8d02395e726ad48696d5a2809d7f3021539bbdb38bb11e823cbea2e7273742c87776457a1804b89d524acfcb39e19fa454753908813815349a872e131a5fc91c51579b3a50e9142955ac575a8a528ffb35a77a6347f119ae0fab07701cd4166a0144963ad69268bacbfdca7bb18305efd006e44f812d063b0b7e8b1fd75b5b1662a49e26324f89415a51fbea41b75485c53b661c97ab2b9e193d6f1067f518e8522a73447aa1be8af9cd722eb8653e1837279c5194eb21bc9127f1eba895f9924a254c6b38caa0907018197a771d531a506713d3434c23a3a2b996b7e11c83b97058af811e974819da2147a473686869f4d04bfcb9786a0f9723dc67e70e4ac0f565b85f4bb30ebce82b21950838a2102805550c9fc1607ab93a7e42a0c9e79611fa7829beb0254050ee730792e73975a7b38bb718ac65064ed7090471658657123e7823631e802142aa563771bc6975ce2722f0e012f555c3f021a7fedf78f51020935d01a92362dff154daafbc4ab6c8d32d2a11525a474757c690b21274b443b58458b83766df851d95214dd04bc0af73679249cde1055e1977559d26b3bb60bb306503879b7fbf0b2eb2508aef52049f43adf6275d4db027b6477d6479cfbba91ae0abf1dc8126fc962ce9921da1b0005a09c30b6894ef6b3ff79a0c088bd2d6074988ca824aa18b887073a10c7f21982f802204c220756c0bdf59ba855a63a026125bd5c677db08368b475b52c3559c3031ea56040b9590f859f6c2560f9170f5fa759068678b9e22888671cb0a693e825bafbda853c0b56b79a63aa198710b6246a4aa58b226086416d3ed82c412b282cf38c71348b40eab105ba23b2f3720ebaa6f21c9f7b23c4e324c4c3a821de7957c21183fb48c4c127732ab169f822c3003a803aaba857c6b92bb22d8c10251ee1a6838b18c650cd5b8304f886240e16c8cf4a74f14938a21a8f3e87bca0351daca3a8d5c014037ca5665a2589eb7ec6f29d18d891c0cac822792b3408617166b55cb1182341a309f86f99f86b4e7c54e6c2bcd15b15b091274f185cbf5aa7a7a8ce437adc43de798498003691147635e787ee4e145d000a02fc34e2891d2047f787ad49b9adede43fc52fba6803172487e191f48a9254dd40b117941fa35a66bb50296327b725525deef70e128ca8045ec451 +ciphertext: 41f7f6acd3a13f0f0e91c0565efad496157e3214fe0389a827ef01e586b395079a7e4149d29973233be333f2ec98af0833a079fc604df34cc4b979237327d7bfbfc5601a3145dee46b7c2bff3b415d6c133430a849f9d2899262c0b5878a7b81b7023bdce506753692f82f7ebbe11b9ab07f090ab5b5c25723bd3b41f7984f95aaf9492f12f1901c5eff906515aa974b0bc342e1474aa6a0e838b79ffbc0cbd9af44684a29aac1fb249194c3b81f37699d959602a4870bd1cf6cf8a56c05a10c0f1d3e3f61735876e9d20660ff520a42632c19ab533f38409fd85e8b3005577fc86e06c36d6a059742a3a915a67d04094bd32606201b48aeb2d2e986a15688a598dd618f3f8d530a855167f911a5121bfa08da8afc95ae3c80ce7f9b9250b0cd7dfc44ef05cec340edfa9b34ec510f1b48aaa1f5442540b506be68a5e1afe2d8333238f7e7bc5c1ec0cb469d820c1d4d1e385064bef6424df8e4c1184fb62f92aeeab255b5514c18de635cfafbc5c2af129733fad7fff2d30c6734c04d49951148faa8864c4e4e854c841ad05e3f1482e23eebc714aa95acba233fbc6f562478548160be934935970de913e3d448915f696fd2cd36eef9f13e529bd04e993d632e2d65e3b589891d0d1a4885724a3802e8513ec68360f03fb1b273bc7715c3d675226793313768d4b1937cd5703eff763a77b66bddd49b77482305b3574f0c8adee13e35d1177b9ce29ae279ac4bbe11f27f59261351f26dafb041788d9e57d9aef53ef156635e5bb12522ea4454a52217d8e20961b39765f3a689b9827245d0653dd4a23e628ad08d19812639b62f4c278b5733a618debca4ea65ce7e4ebdd2775ee90db0f5ab96f57be14691758f5cb8ca89b656d1a3a591e9ecad9b9cea665c2c58cf111935a2e50d61ed981340e77f89a12039fa8b9fa6f226a01238f5ad3bb87b7c83506265785a3799fa58baf5ca23780956d4727eb907e327ee3d575899fdfccd80e909b64dd70a63848a5bf36c79d539145c137e860e714617bc32e9297d16c199bed73b06a431c4a974c621e9ccf438e56fdd4ccf89f1b6073ada4b3f586cbf574d91a76c5581cce76ebb3a54f5a60c464b25aa0b43f5521d104a0cab9eee9ba3c4582115dfe9fddc113b3064e57cb95a59e32e7a2fb22fd19f86771fd3c5a5ff430d223442a797f018c6903461242b7cac41ffe9fd4932f25901fda592e52ad42b03c258092b7b9a28d531ca802defecf7f934a04e6bc0a736b136e1df01cc6db426c80871b9dc2e8bb2d76eb258182a3160700d3ca0c72a1251337200bca137147a6e901d79c49fe663a7a43a0d056d4f9634d563a1f3650ecaaaa20e520eeacc863f204420eabc2573eb85d76a32b894697bcc246aa1d9bc7cf5293f405d22eb21411e6b9b3bc3efddc5213a0ef74e32845626092ac8d2dab463bbbc31c8697c265a5b005363a3631aaf6a12459c451c1196c783c0bc8b76454c1034c79a79cd6bd54ded518de741c3df1846532b3ff540c6dced5dbaf4b18583b7b214d9123a94571e10944736dc8bdb7bd747c509d4d33dd3066bf78b07f440ce1626046e16ee05cbd09750340b1ce080bd0bbf13fdab443117a21f5928c27ea58fd7760a812aeebf3ed3fa601ea0fd92f217edfb3423966a13deb3755ca26002142f7d624034206e022a0b230e5e0a84e38c60332b79497fe7a73982581b14e2676cfc5746b6771f0df2139c49a0e06fa7ad0182ce6f197c90b59784eb18a83baf25c1628d1b3e92e4a52a26c97956341416433d94be539add37e4de168f87e9eeed8038df0d649a1c50f6185fd0f144df1c1a7d08a59f6a2fe6e3767a0556f322a1b5f0235e1cbf61a4f567c95a84f564d17ffbf5adeb01a5a2d81f5501764aaff6009b00103dc287eb5ad4ee6d04b8cdfd178e38f9f31d175fe86e22887fdb97d47538f0aa4118f84bd56362d08f9fdeca3110df7b766dd5e3b92f1afb29e583358d1997713aeb3bf88af40585462194cc4ce6a60c570e1401eb93ef70d0c5b4ee09e4bfe4b39ae03d6f179dd5e5e861d4f26e3bf7a03f03fa83c1e0d1ba095cd2168a32e74cb834cc6707905d57c3771fa85ee2c44b54008d660068280f94bde10839ff502f0530fb245f9472fe9ae5f9e252e0d861724fedc5df4dc7b6a0c62113339bdb1405bb039adb2e2d5246383e17197ef89025d9028c05a18526 +result: fail +shared_secret: + +# Private key not reduced +private_key: 0b57a478859c311d4a9dac5c9c5be5ad6afc3dd362b50c7ecf4b4f596eb60c9774994752af9d5563ade9400fb53fc3cefdc6864b9845186aeb99745ce72fdf6df5898e8682d2484fd819e06caad1293f51569a67fd8692ff3df99539db6c54cde2166a8926a96864c2f2efd9da93d833dd52762dea889ea5fa7b42feed6d7119d02d68d701ec45777a5cef2a961316f44f64dcfb5ef0aa146269d8b9178c34b009d96895cf4376c10176621138ad1216bb1e1ae09c0cc4db4e67a5fbc7497a6663a5cc2853b3489dee550eb2846b7ca0233ccc78b2b7acdda57ae85469618065fa05a3cbd024668e593a65143de0a969acba37d3da4e834375f564379988e21aab89f3ffe0934c5a5529ca122cd15474afc1c8d5114ff6899967c616c48256ffb588bd8f9d606e54d046a3593f4bc1fda596067532f44d469bac9e762f6b328c49151eb941ef7d196c872d3630e5a396bb47b38a256f6b376509eeb6f09fc15915469d2b781a9cd9bb5382be765af57d35a58bdbc96ef0d02df00f98844d5edd3c077e0bf7703bdd90fe58a7763c77881761fe75ef1b8ca7003a99d7f4b9466db0b61ef4202dfe93476dcdd937331b6a4163e7df973c2a33c98d835c19b78f548b314bc5933484e32f89876dafd4e33fea6108ee150d83df2aba9a674b098e56c99a71f14674b2daa435a85c4dafcdf5af588858cdeeffd51628ee3537b1bc0d60b448a306c691e93aae4534d800b390e87e63f25b8ca78a7869cdb738a671f3a78171a931ff164b5b0ad68d58eaae6f45757bc47f4fd38ac95508878070bb6061069e2a1ae369c45daeaaa04b9766b21c354ff3e635189c4516694fbafc72fcc8d15c9162ebc7bbb98b07f5fc296a4087ea7eb8adac1233ab108c360377dd3b15ac539e57366e39c4ece9c5ab85c31c9b3ef491196e41a09fea8d7afa1929f5bb76aba02d3a2e34e874bf64eea8d268fe50b9b9b836e88fbfbb79c50cff738ba031d8b51439834d96c75e7de7f4e4d4a004ee088e986e7c72a99af702143265be53b94bd5b08b414b3feeafa3a733b8ccaac737cdc6497edd7b1725f5730978d02bd222a54450334778af658ca37bbb6dafe909896f57f17f45652c2be670c54098b962e49493239b62b17365b4aee1221db3f3f3b6df83d08cbf38fc0f9e47cd6e489bf8e0d599efeef2d345dc75ce68e79592de7c31f443b84815ec8b8bc159e3d1c323ac44ff4c9e064570de9b73aec238ef5f8123d47befdb687cf54195db42d9d56c68c9a95c341306ed8b7e3dee849732a3db72fdcd65a3dcdab8e6fd2db8db2aa1313df418f94116efb654aad1db9e835256d7cfa78f798fe9a4c88ec0c391398f42a0be6962bfa8f7bf98b25bf503254d660d74646fd30119c5c1ae53b7ecf04227a6424e7669139abc8d83f065fcd3af4e3cac82899773bb77becf49aa6faa95cc33dc9ecdedcb7d94d54f69c4e9823dde7f5344bffd2c999dccd11d466eaf987eb4074a0045997cde8da12e3d5805afc727845903e251c6c81a8b54a3a656252fa4133f66d66bb47a1ba3089a583f5e7f92d3386407a4d9849fd6197581b43c3cfdaf002fb14c9f5954459e0348ab52c5e20e24d069faef47c97d3cc9a865f56a01beb6829dba332aea73dd6b22847af0248a224f4e8c08426e3c5f40ca61a27d5fc36c3a228332c26f6ff9478c349fd59126c9af2de278fa968ff7c3acc43b326b9d0f7baf4f979baf64fbb7dd476aad5139e358161fe0d8ccf6accfd9a4ee7e5b6c85a5d5861906c943c3a25bd4ebaa39f157ba5e1998addf38b6d01cc4be39c91e8348b1b38fd93f4cf423e25badc6c0df749ff43c8edc33e4a68b0ee9c6d5ca31b6e3c2f6af61dcd8d4d90a3cdf09a1798ea69705fb9efbfd81f48ef29e408fb9e5f6ac9602fe9bd454fea75cfd9a5d5a25b36f841dd236a73de7d776b6e57f7baa41258af61f0d8fa4f574f809ddd9865671bf80d2cad2ba647d2eb6c7e8beb679f85c03597764a59e51caa147c63a4d9ab99815cb716593fbc898bfa9ce15f68d938ca77ba537f02fe5bf26d5543d6279dc539dff395d0d437496de812b70350ae5a2aa711eeac5e666ac51096c531da3b744681944a5877b917f6cbb7c68e23c6372d88be2566ed5cd773c86249ff866a24a4fa758bae8ba96bfc11884b9304cc16b669550cc08a2828dc34e704534fcc057a45b25ca8ab600372cf6f60bfd530b1e67309d5004361acacd392d104c9d3bf66075d5949ad75815bc9517f13208068ad5250595d76caebc3b188a268312353e232cbbec0830c45b44e315b4e037f66722f2c8c58d37228a7b3c81a8914de52757947eddb3a99ad35bcf1bbe82d9249d228a15009bc2521162d28f91b70ce3c05c4f027cf638053776511fd4c24e660023720370042c6bdcbee2cc853e1345268235e1e31d41106b1c359c8c4844274a42059724b1ba455e01ac4b800d79d4050c4260b862ca9e30a3cb876852997298609c19479b7ea35691ec5de9a16b09382cad755cd1a008c06b3a5d347b75a06825d4a8077cc6a61543a6e4c362e979a6824dcb494b7f510c1a3557664b8ea3d681702932ba284deaec19e83bb4eb0b4e916670c185b8effbcba3252959714462809d54049561baa71f13ae08d25fc587a01c853b32681cf1fc906fe00c2cc58971f8863b803d9752310a18303298ac6c188b46ac03e3a24486b6bab54306fb1942b908635028238622198882989f712ed3a30ef5970528bb477ee6a670d031e5dac2557655acb2c10923441a77959923bd8fe07745988efdf48bf794659bd34cd8941733f97d85178021e8b20b185e0cc47973173c15a681f4a0ab52c5c4c6f3a2364465d3c727928853a5a55998743e58695feeeb9f06c2cfaa70679c00cc6ea329c16bb4943418d90017beeb03852400b7e87d6eb8be948303e31306a4116fea8ba59d30ab6f0a5060c2aa89329306065290466508c17eaf7687c551100a18cdde6600b9e467e3fa7b10dcba2a722347349c2ed9443c401b6749225f38195c04838ce8b96ab66cc2d7235c8b0316eb7e1ab1ca956c5780fa491a7720b073beeb48b98dc41a1b276020256ae6d85aa3cb2d60e6375b44aeb6e34503fb0a73426cf999af33e89f1f2934c3438f47814d76413b87a264ffc67263e3cadbda0366f13b82d9a789d55f05a30868c6a9b7bc7ca7e69184051d9f2abff4ebcf0e26290e69c0bad83ce3ba19d71133a0d8b347e1adeebb8a8b915247689311e5378d256ffa867fba904217339976b4af06bc3e5a9093e8e45cd615cbacf65bf1b0899da61790883ebec896a095959af55d0d7b39a9611e439a26caf8c71cb05a57ca071c719a281625c2e4615cd4b74826323b163cf161bf6a0424eeb2381df549b050bfb9628461210461a9a35863bc0103c8290244c6ea5ba381c421421c91c010645ca365549c7aa09520257634442b83e5806d2a274df4b8888bca68accbb5350743443d8dcb471e25ae4b748338a922b7e11f761b059bd5848eaa441c812951729d6e7013fa98340ae9a142b84b6a98c6577369053652b3b505d4d8607737b49fe06c5ce8b40ec680838a182e34296c317df67826f4ea16f4547b4fb9cd0778b2e5c66e1e5382db0c0c432770d82a1e20f59ce1eb1cba29a1b9d8a5e2dcba6b04022bb72923591e79dc4f0616b2d4637be08558a212166a97588e128c08579859d1012088a7ef26355fb4b83849aa3ab06b886aa45b9a1824a74b05f090baa7cf2969368e6a82750160ceb0107811543ad0bd25031a285c4186719d9a30270fe1c73ac8bb64d912dff5bc324441df18ae94d03c82b63cdc9085d073063da296627a5cc754973cf296f11aae6bc102e940740c853fdf2576c24b3816e60483448d9a28c3e1b295a4e6bb36283f4706290882b52f7babe54b95772a174a4a0a3767c2f6aa992f5904350071ece661d94c868df7396c1a1588f80f78f82babe28531d97617335cb098cc530c5234dbb4db98269d60b271376a52621fa40a464bfc620cbc08b2ab0198e2bcf6912752b39caff4938b842b1519455bca30c8b15f6e2942b1c6798b584d89382abb26af5be574fe12838737091611adf21507e6803a88570d19e34331f07766d39d57f80ceaababb0ac5a29991a1189a6c9364b93a53e73c13d91c656de3038302279de8a0d45d46715d78a8c9aaa5414540d9cc6553cc910b24cc941769ca5b8c576ae8e559969720d8048291c9374913ba79ee9cc3cc217c5f1a590a7ad9bf27b365881366c2a529a85ef8b34d64792bf786964831da9a38dbd81a573b74a8247b040f60404a038846bc2a3117bbd025b0f7a7de41806de885d79e49a5eee5db12a57b1a7da55ccb00b5b706781da8dd5f11267492109ea905a77270a67315eea1f5c223aa9378bfb8116e6c45c7fc62329b13c8d29844405db8ff6860de474bf727ecd19e54e6e1a141b +ciphertext: 32381a661b39fcf9ed796acf47b145bbfb95995255370e072dc8690b72a0430b316712f2fbfa1c70d95a3ff4a81a054280b50a7366972b7fb7e3342006a84979323b1ed528969e2d4a1288542ddec0df9ff963abbfb483b204324a26e1c21a9e1c6089962612915de3824f034653eb664c837c7db70b35462fdda46e1fcdbc57d4b5a611e7391c669183ca58ca8a7dc015a3f7c4647d5fcfecf87df2534b0517da8d8a1e3585e918ae72822b37c25633b773c2837eb28d8c527ee211987427bfdd7e93909bbd43783433b587c6ec5ed0b9e75f673884fe22a63a16e8e5c1945905afa2bd194a2a16062523cc0a5c873b02583ec65e6999a20ccf4ba76031773ce2efd50d95e841860a727055de7247c24eb610aad0c65d4c40b90c10452b663538ab81e96879d5757af125c719ec3e6489556d20be9bb28e6c894ead6fa96b9bd8b1f15524dfb1d6c959724b3b46bcea58805a0045b9722b1930a3bf5916b4d8a8712f9af1c40589def2ad4d8aa99a415a897eec81c5da5b0c933ec04f1f9d02c0907da1b41e6bf043a8f85fe5f4ba76c29ce2c8c6503e975efce053aeed389035bbad720d05bd081f72b395890109250dccbb4ce195c9ea46d55c2f44a7baa3e89fd04e909a81d19a964539b58c1b7e034b74babc73f35a34ae87a0d6b44498d4168c65a29841adbcce73e3820674fff1a8f45b0757d206b1595371f0b394e1e70783269fa75623aad43461c8ce8fbdc0592d0f1df8188c66df2c217037391666c2b95e59254137f26682f9c19a2e665dfdea3d79e8e8ec2c0cf9de2559cab184f3acdf0135cc8867615c9e2a7ef4a8861d33f62e89aba5b831add345d0348811324c0c934600993cc6a3e628d28c18c8d416b8b9960d621e5c4062668b60204467a5ed85c857dcdd057350c9af0d6046108943a10f8cbe9da835aa0bb0a803a9ef69e880b0cfb61540d161ee4aafd3a60fe8ef6404b1e06041eb9b6a91bf32f1b6be7857558bf240cb16532cfc8cf5d1e41f18531404e9209f99ad2d2134b07117f49d9d2fa6e7463697593fa55caa39b3dee39c2f377fda9543d90f591b5716cf2f8105f8179cd3995674af5ffb1b91e4d65aae0fdbe8b473349905d4f31bd864e65728ce2e0251389bcf8bb41ddc476f0f4ff5dccf8c35dc66a05f3f85d470c01fd2fa37ad39d187159981276ac684ea7d767a2f07b68063e7cf984cb2c9de7ce3aa98cf2ea1cb1b6b3ea1f42db3ff887653410c5b6109f1f29a272e590bd99145754d238c5fabb1c588c0af8b6e95b698a0349a7a218292f0360b5a32457fe8fc6eda0fa51781694947f97762b1b08704fcb6beefeae1f1af76a5acb12323ca14b92629e323447e4d3852e1177ca219c29e3d68216f19b470c57c9e57388dea6eac11a9c512a3cfe9ebec129e6dc298fae802a13b22b21372097cf60fc0db70be35324152afaea7e4f42bcc30adbf67005104fceda73238eb042b5e42f5f99cb802044edbb0aeeb564cabccb0f356d7e090b175a4175d44f3c06f5796d0cb5054e2a6a73b71a5a0fa4528e9b49acac5cef1a90070d07b0a45c95e4fc046321f903defe1e08b102b5821f53c09ac4d9f1de76b93e6fae303a2b695706c025993e396279b15e29df2aad1e046157bfda3d61e11b7136c82dcbbf6c115b6d8578eeb0f3a326287c64ba47a01ab8f680300324edac1cc84a147121c30700e345509d6d18ab26febd02b9b8760167aefcb05f92f128919f6b2c3e39f39d2404139df30e4176f3d297ed2cf24ec2a310900ca356a6099cab367a9677f110e4e2fd7d8d7734eb4d6d0c9ba07b96248f05793d3ceff900dd3f03ae5e16a95b420dce402be568faa24e6e3470194d7adbdb9762a832e74c788cb97e9c6161837074267ee67c83660af6bb845947f248a88c9e1ed8d3f6bb63799de261f77ca70ac129b60f6dc1cf22360d5e132db7e1b7198d8de3791cd4044573b65f82f013aaa642bf8a93e55b5d9334bfebd549665e20f4e496b25281816ac761f4f4f2064b8c0fd31f281bfe5fbc67d60a079fc7d024657e58475916031f962792cc7fc457cdac76f73d0698af97e218e4aa175411e0d1ffd0188e0e89b45c0948efccc3d9631d0a15db4d55bce5ade1506a52e7656c7dd3da4122a4392061942d694d46a20189559bb03a9436f2cf3e47106428043563ab0d0a2f967173d63084558e20ee065 +result: fail +shared_secret: + +# Private key not reduced +private_key: 455c59bac459203a7beb868c8477cf5ce391d994f619abc685ea791c1c905cda7d92a4cb066dc022bca55c78ca6079d4ce666b79366eb3ad6fcd75f5f6075f80a5c23e86f1975f92549775e935de8f7b6f903adf5ac93ca9fab1c843b0f71652cce35f8a5dcb88a8eb5eacf0b6c639d2486dbd08f4641836e453b4f3b3732965b8b9f64ef8cd897225cd495c8d394d6b3b48da71cdb499788cb22b5c6859c2569dbdffd578396372c47cab58effa033e3b23966e2c2b6f84f49fe69b7bff77474b0654bbd7eab6346002bfc11f446819cd41656d50d06e36e037cd4cb8a69206a7bcffc6e4dda92b68a1e7caba00a6a7065eabdcaccb618b35a3e96026b6499735bbc8b9551938680978804b1735f2dab7bcdbcc3c4cc15a83d53dccea7ae967ec07386323fda8f742c343a0b48851edb6ef97e6d18f7bbdbc674cf24b6290d6a7a9577745ebca38859d5a7c7d1e54cc18983d9a9530911ae0ca8aae777336cc147c93a6f2bb433ae125484d35e8ca45c001efd04bb7faccb4f88d49e103a9a9f3db703584451a3fa02dc46eaf3e3f563d5e5a9dcfb7766060df68b643d6fada7a4337c51b3cfb44665b94efa2d77d9c0b08a172db7ea65edb2c35fa87dfa08d1aa9126986e78a910b95fa12278b1df95baec4e966decaf6798ef097a5f7d9bd13c83b7c87aa29f4d69a376668f730e1d85f693742cad56a122494f926944db6c82714d7eeb7b0e4ffda5626e948baa86f2e8dad47d3d19854e5e475223476d2da9b146953142fa1c769f577e7d35f144ab29a76f76e803c1f5046e33eb33dcfb194ce38bff8cf35ee1d7e90dacf31bd5bcf66dd3595b4601e05eaba1f32f745c8182c921d937ba8f6a75ae5f4ae1a84aec6ea1bd4647e7a3f443e5445f7bd6dc4f7c03d9fa6f7e5cc1354bb3a66052a7665e53c8218b4afa57b91e9576dbb562efca279bd4707d8760ab7379936dea89be0071cfed6fa545ba8a43c3d6d326abf705448880fa5883ce9848ac8c2397e42a7f260dcecbf6b66cba994a038f785cd5acedf5cf4e99f70aed86e777d3b0449aea69d8567dad3ec609243d086a5d2f245845c43bff69b83e1ec790bffb610f7cf09c3456c9ed23dcaa497277fd44733fc836572b7674438daae6efa9468fc0a6caef93cd2b81c646583ce8233e83bd4303a84ef6c85fb8604be7b8b7a0903ae91836d39bbb1b9fb864a86636977b1ca84fa99d949818b535db3ae8aa4618bd7d2cc5ae7675eead6fb993008a0b8ab46a0bbba574dd6b0fc82c6be667fba4775fe76cbd667068c7a5dcdd5603ff9025b3c99b890c1cb6758ce4e748358d91cd40f44a6dbfdd25fb8f0c6dd37d48c31e11892ec496833e4ee1d0ff7c19341fbab7fccca4b121e60122755f35c43cbb7506356fe3eee6a4629e39fde78f78686b369d009153c18de42e44e75d1b4c1d2d476c0ba4f907e5f0ec862138bc70a7a919237c2344ab8aa8ee46b0e3864ac61293e5590c671b1e6c1fc3f9df16d52f88fa06a5aefd8a66eda148d04fd4ecf878a13f5dd667e67db2c57710f78fdde813884657caba453dba3970d5f5194961944fe83c6d1eb1b85de358617663656bbd06abcf9443c4ab0696c498f4db145ebf9dcac02f32fb56ed5151c936c48642429758979b108acd697ed39e8b4cdce179ed2b457e65b3f9d65afbaa5885a377582af814feeb049ced20a9e8fda1b7e2fc4368b5f5626b6d1b72e503a0bde3f883b95dea41089c89c9cec8198dfbdc3e2e72983a38471a8d797b67e9799a8c8482c9a9abd7240438c0146ea157aebec17619b6d535a745670ebd6b8c33b84de7f9134d76409bf923d595e23f2137c3deb17b6da088fe26db83466f4a67ef331dfd42b98b13c7cfc829e772cc37623353d4edfa9e3ae56a30a7ad2c3461f6548d938f116aeb115e8e293cce5598ebfb49c5d16da815ce4ae5c97eabd6f828535cd8c4a98fd0430711b50d468715368a1578da6e0a78d088660e0364a3f279266fe556c7a711493b666f5b20bf3d890cbbebbc4f9b5c84f3f6a7cf6085ea05ee656c657728d6c69db98169bf7905d6ce4d385b95468b1e94f6b0b6dfbf77ea7c8b924d8e44963d161c6eb1d0a3885af3c90069837a386cb06b4caf3a5bd16d8d7b33dee7af5aa8efdb33e961d73cd6d3b572626cbb144988961cd4a5b3797911772787768b796a5157c180a1264c1bc6ad588139028f9f28b3d8866b8964a5253b79ae86064b5979a0b468f87ce0ae843f34765982114bf327ff08c801a3a99af0c27c72cac48614620d373b23c01d1ebbb3331c4f0ab6cf7a03804545427547acc2a467e895d75486f23cc23c779a390026e41b56cfb04b1e22190894a3c1ee16f19017d7cd75151047618b49921c8990a580a03e1656f841e95101eacc1106f0cb94dc2789bb1a2b3591134b05e7d983736f83cdd985d160a9caa210de0813ee78b411c813fb3008742f793e337a699b3a1180c5a48e12d92b9709525858a70ced2d2c81efa2401283fbca4c4b4f1904e75ad66a894aa57cf240118c73643af435f024013d6664543888f7f30327bc65e3631a4da4b6629131ec5067ec5a8c354f94aa207b587f139fd3583b3cb51e6f7926b9a914c15928738a75c9b618b250ffdecc61061618a8038b3c65841ab3d5bf203c122723b087d4ae2604f5bb6c9013c4f38903f65248c9783db79b98b9a827d528444c26c8fe408d785530d90123d30371cf46307e1c6a81097ab96280ee058d598207e666ca0dc213fa48892c3b7d5f49bdcc894f2a8659fe882201b4eace22e1713c06d74156a6a04d84c0b29f6b53fb61773d19f5cf9394dc03ba90923d33055b5c089f43961ce810a27f0878f4a77e9d60a2a1842a0450ab7208d24cc865a6393a9820b62f96abadcc0650b171b473db3e91906720cf7ea3730435f639c1ae9fac889d76bca6602ba96b0eb98aa44136cc3a978b747acba054032d36509a7ae9dc30855b2b1699628601793062c5705c5b103344c3a77947992a2071c35f6393942dba3b8545eb9a58ded8a5407a270b676061dea1c5d490f25a05c0f82750ae6151de2bf028a28657269789733f1e4c279203e2fb837e6ab1f30c04daedb3ac2809791e8ce988a4c1754c8fdfa8be0fb8c94a240ae3b1e73ecca729b4ab04044be1b97972a1a27bb10bde4240d49a568114b938bcc050b26145598905735ba2a3198e3a375b752d8f5a84004890e25916871a34469a8cdc8b1077482f785ac3e497574aca642d74a3625ca37dac98565ab6f4c95a289a434c9ce9fe61d129c073b5cb755306d47873fb186bcb86ac00be265c320c70788bca0f462fbca6db8805986425a6437304ce48d59588489561d37b60d1f171f03ea8ab817c93ea7c3afc06447eb823e630acb4213b50793457aa8f0b9b484d5830399bc2c98a7fa452fc30713fc85ad9a7707e8343e2ed113ec436625172cd4162cb7730e5f327e9566a01df27d06b460d155c8717469a365acd5ea80b935445a6610efd3062ca954276c70a8085c42aa7f82628655f97a06c098aa7ba8a1783060fb819de027dae9256e8ccc9a72539985144830c23ddbb3a1860147bcc0edb69a0ba03bf9626c1f35a611f686cb71801e130e0cf363b795bdd9c32e82978f53083262a703f85398d0587c2cca06ce1c83ffd614d1a85d437784623814d804cc00778978e0cd3e2704d34563fc23494d84b6a4482401b009b601582bf48d7521676023439ae2c48e5b54bae0c592b64d038883a1ca9a4a843c100a58d19270f8484da82ac633c3550a1634d0a7cb8bacaa19d4500af0ae14499ebad63ca1d2afea753e762246a0834942643050b151cc9aaecb587808754e2aac15d5b2c074667766181309b113211320603499d9b2a5aca065d8c088b24482200c0eb26c3f7de8751ef56850ac8097581852873b396b05ea4c12347309c7814dc89929ea6c3f09d9bfa92bbfdd0680591a69dd855269fb77e8184ddb4aa0d3b2a7013ba06d447598e95222774badd3544b6c80c229392b0caf13a94eb3bc920fdc0ad3aaaab352554a15ad0aca4d7038c208eba4f4b181e8194e21575687e55b5af0c2551acd36824c73c950b1d9a8a76264adc88e6e220396bb1aeb6ac835f2cb3167c7f4db6bf0b6552db314bb91584b86c0d7762041075a432583f8f357a77731edc1a7ea932dfd40a8ac9c09d3a687dd530ff1ab95c4e56537dc6e82210c0d3c582049a180030acfc3790fa1b437e91e1f67262e03cb59a87485658182d1a518822f678c266ad70fc1622c5b206ab7c61510f1c920db37ee852276f1961e64614ec8167fda7091988c176e893ab163e034a7e92d569882badf4976ba648396ee00e3af7f5bdb9a417e243a93c5dc84bb3afe84c380645fad6886c5614a8735a6f718acc565905e35325a3407f591791a5db4578b5972093a95bec3b8e70c1d542c9b5c9789729f8922 +ciphertext: 1f4d4173d751f63ede8c9347d3bdb775f629eecfc284a185d9c633ce212e168f1a1716096e7b86ac9d637bd9e31a82582104b08375b5a4804e67ef72e1aa69f5860477c11aa0bbe3395934912120cd65d178e83f4eacd7d68243545874b3e88b670768d7e73b8b2a3844abfa49f1c3996ed490d19513d93576e212c357e9a1d38de0b59fa52e86da6e519d4918d09bf673430f59cd61c7f31754d1c56c0f0be72abd97e744d859bd39c6269f12a1e8e54fbb546ec4fb24a1ab867a8d33ba986366685b43eb5682aaea735361e65dcd7375a20a6f1511e5f2c1815569e93631839d3d443c7ce279cadc2766db0611d5ca845466c4332a5f0ce96c68d4c34e58b8ff81b1b11c2b824215440c25dae0f1d6c3c81f702a06444412c307f6db4765d1c0adb5c890b4655f0bbcde0fcd031297ba9d05e1796264cfdf138f259cf503a2410f87866be23624e2aa7292aa5082e263793e6d20801d238eec7e9180412bd118a6b9423dbee8f313aca37328454ae381a71afc476b993b3c7a2e738981dec9d6c005db2d04138d1b116a71df068d2e146c31aefcebf381f077b276c4e2693da745d90657a38a39311e875737b6938a58d0ec6a3b43d00b86ce3a64240d27c96f1b2edc705632b5035640e7164adf3bd698434c63af5f03e3b62ceb05903c82005800c2e8a5128754d5d74171096ccba35130fd7f7ebb8f1e9413b2380d1c40ec05e724fd24ce8a9f01792e624ef9f77fa1cccc8477f6bb87dad3b13ec15220d408bc6d98fab7bc7a46c16efae45f60377fd2086957dfa9f3837237e7545ecd0a0779686a5c3ff7f842e2480667c8a8c07131f54a1bdfd820fa5067e699459c942019e2acdef021393e8538ee32bab41813b64437609df35ea1b775a5c69e94fb34059ed4a3395abe419e2534cf450bb053f0f227b32969d47ef9d80ea2f68d27817d9de83aedf06fc19aaf3e1e1f61f15ea41ca2886d6c43235d47376c02bc9c061cd4b556486d502a724a05786745f0f39760ccb3c3cab55297696936a835f4415deeede9139504c483402577730ec1ac7878635e1ef482d441f25beb2b0ce79af6691ee0b41f8c56cc20de0e85da79f750e087ac1eb1684ab2b3884ff126b5cfc21fc322475ef1c3a111fcd98ba40ae5a7cefc8be88e192a60089247064a3a705108ac38c3a0d9044a74e6247477233e90175d83b10e4d49881196f0c50096d6750dbe10f11ee263420d63de467109f98d3a3aaa0e577e07c83c0e2b6281a50cf3c33286306601c637dacc6915fb23af9151395ec5719a692e60ba8ac123d16684c968ff534bd91d4ea0144c13ce513f962d055a4320fd31eb096655888bb4a834b2a828645d66c72d7825c8e995a2d68d9b59ef21f447298fec25221e5b3274be0d73bef1633c57323a745d426192c6b6fc8d195c4be182ee95e2555b07597d76cc8755b58eddfc92d08117a262d0c80297defa70bed167c7b4fc03729cb91f063ec0c85b3ea34e11d5835219516422e0b653f1a4b6c6d85bb19238e16b5405491f482dd517412b00d67596587dc6d84093bf681ad17cc293a5c70800419366796d6403259a62ff5cc10c02fde2abe8bbeec6e1135f54579d58f0cb8c560a15d90f11d289966f081586f3fd0476e90a214ccf66b55404400f4ab2e41b9b2ec1d1bbeeb61c27bf8d6593ab65ea06b5628289d0abb1296d37b17f17da5ef89cb180a1b82b73aed5469864e3b751c9bb45285c2caaaa904b1f756d3e053be1fa86f5fddc691b76714170b8be35a9c6e8f180965fb84a430a62f939eeb4c3902211e9e602c205f57cf91607b459696136486dade5099a9a2a0c20508e0b4d08c35f7922fe548a4313b246f902dd7384f5d8677c150b9b4c3ba3c985306450cb0267d34bede536e010fc8dfd792861f8f34890b29b92e7e6840cd05a41a746a3ca877f6a1ba79808b91b21e9ded72342565e651232307f6afea7601433b92ede5d4e80cefaddb313a8c6e08a3baef45e675773cf201e6b86050a85c6f3b602b9b47edcb75d35511e2a4079d1584c18329a43be1a37b55a548b6e8504c0d3818950070d6880856c5f7e5ef35e62b3f8c1d8f4328d522ce7be164a27ff263cd09e8c8e365b92ed898927bc18a534cce4984f36a8b42b4eb2ba7dd26b660147ce5933753a2959b4071826f1caa12b13aae83544863c2a46260592d0479e9b807dc5 +result: fail +shared_secret: + +# Private key not reduced +private_key: 63efe0ecf64cdf77865c4dc9b663c2d30a39bc89e6c4d7beb52dc29dac6e3a8aefdcbcfc69bee7967cfbf5efaec3a7895cd83f0f4f6cf826c8d689d55773798b748253f34a8748f4b11e53566499460bbf16c4e502e97bd7a4cdeaf4dab2f4372c755bb0b6f4a32db774345d3ecbf35e06afbea95669e75dcf78502f68439a485e734f7346ee7a856ed9d816c3bee592ad8fc7b289d2e43b31b556de37a43a16fbc98075e25109c9afffc8f1ccbc99ea57188e595fcbf7b9ff6f62c995b0ed82e46caca99f9e5c48510f05b1c7af8ba6cdc652ecdff7ffda5a3c8d1979ef0a29be46246eed49b66d2398379beb3583656cfcc1f1cba0423bfa5e474c5f78547256d7cee3955f1d8b93585c3794cebaeb8f6e5cf4b653988a84708e3bc9649394f52fc25bd88ef774aa17f8bf9cfe9aa64cbeb4d343eeebdbfbcc8b0743d334278aa8adef8b88e0a1e49a3449bbad23cd188fea53ad3dae18f2a4333c6896a304cf63570d8aa03c9f9414b47d8e37bee6922f09e70ca84d9a1ae1e444528004ad471598737699ebdd95c4a9ef99257981a7668de6dd97ebae270e9073657409bcb8909c3247bc7973b798830d9aec8deeb82bb6b568bffa379ffdff35470e43ab7a4624f797eb3f4e16c675717fbc0e5c95166acb3f9b30ffdb46b5c7f0bcb55209d96f4db4dfab0fef2b9b5015dd49936469a63940704947e577d310178c65f9c7ba44a6a6eb5581bde74b43595933b19eab8c4d978d29bb8e7ff4b380aeba4dd9af62daa5ad879836849b88678bd3549239ef674963770a657c1389b023b75e8b7f62e8c97a94444fcccc63f3e4c17db97c623eb72166ed28146521f3afa60bb75b0491ea0ff7370e7f7c2587e8e64a8cf4b2d0c5c2dd53322429d38e239c806db10c66905917c2c7267303d565fb4de69914e59b8afe348cb64188f599787d7c63be7a536890dcc858f7a43b7d80bd3593f6eaef4c5454e745cb4defac2b5d51e815fa3616b9dabcbac6b5c43fc3c290ed505ab8f3fe3f4d7afdc1909cf720b37cffdb58c7f8f2a48b7052748a9a6d43c31364ab3b997466df64fddd7e16e84bed485cd649374632ffeb64ed749e1bead52ba4c0aa7fc679ebe87a345e8c055fee5cf8df4537795aca7b7dfa243b774a9e46f659f26f73991beb88544ac439e53c2f16d952bc5fdc3648e8b850526837b2744d0e83f3a97598e01690e04c63d92891c64b9b1ca6f541755cdd96e390dab893b3adbdcd4d53fdae194bf7fc948305e5787ccfc27efa77c7b6823fb7d0eba383c97ae19d453036faf966988acb289a325ad2272a75acd3a4551562ca894bb63c6d38b671109d537eedd7b807bdc017ea88537624876d58ecca8adf7757c9acde58dbcbc96ca3d338f014b6db5f51d9578ded5aba69c7d47f88a8c75860cb75fc744571591369a69ac0129fd9a71bfa0689dbaff6c3605e5811e45b9b94a9d9b4add0c898038cf988858eb15bafe5a88439f67cfd537a317da1304d394cd86afffa967b2d6a5ac7fafedc52acc6add22ca1e1bd816e7f9d68d67bf1b387eaf43461a5cd28ec6fb70ccea58f8a9dd6f37f04681ab4cd3e9c69138b48459769e07a3f6ca684c299bf3cc95df9656df5968ce5bc91c87487a71df36bc64ca998e797c6f6b098e903a899f945716fb3fd9567e1f289328c66c518539dcf9b83f34e347c2ef10e4a3dcffe516cfeff9cf5e4c49fd0d8757220c3dca95b7682fbe6f7b3d5f668db4a764c2357dbf159846e656f62da82b8db482807f54608320f5860d038f1dcc6e415249779d4941a06bb88c64fb14b8fba049961dfe18cc9473f66ab577a953e283732c689506b4b4c95a4ad1d5aa418a145bf90128d876ab4e28424baa807354f1f631473b8e06cd0d0e5d5ce454bd425a0a1443aaaf92ff2237bc0f7458eb7fb673fa2b8b760e377ce48ea5a60e8c4dafcd6712dfc4c747493ff8f81069cd1d64345553f8cac531f23b6567de0f79b623ac6a8fbfbb68176c41d46d9e73c65c20d6de058d4a10ff32433a2d1834dc818f8fb06c098565297c8e5899e61a59cdd187454b62aea2986ad7e07a6eeff7fb56f627799fbd22d51a1cf63e6f94cfd388e1f3fac4df3d8ed0bd80ec6ddcb5887fe7ca44ba4a39ba7bfb363c98c0db60a4c7781a4dbb69998032c5f6a930c1f65420b0c2bbab954ae55ca8282b1da2a61f1b111df231df1151504e9031b7b28e793109ed49d46702d25b37f58fa812f68508fe2b9efc319a1976064a648bf7a251a948b74ca3f1985c5f114033e1240bf3691238b507bf28956a52204459eae072bbe10431a56af24ac15f8b546a62c03740c16ecc8afc58871537c485ca93617a324f72991273a0549b377ac040aa12a46d366462ff7b76a429bb781922f7a5397385421424a24b366651b72c5f8870c21835e0b2949f61eb3571cdcb780db683c95e23b708889303a4b9f2b862b68a4e2614eb2d8169ecc1349d9b71b5206973487660b6e4cf544baa688202b0e8df9ae88d85115f9a183fc95265608661993839914d9926cbac8993013c59e979aa8444a54972b99257542e4adb869cf56dcb305455bfec5bcf64137b72b2a6c9b0dcc6c386ed616d6a25259ea612e89c21a170b64e379458b0abd725dc8f53a55e57604282dd474c4ab30c4218a32b4183f0df24475d01fc9f8550b0aae3990bd414561463a023445bd23c7c321dc80eff509a6155cd6b2059fca448ce05d1f0062f3c21849e38a7a90bfbf15b192265f11b5bef91a6bcd0823e2e1b414750e057583401b3a5f140ed7bbcb87bba4b1aaa1aa75a911dac26298a7b9a1830a48332f139f7a4a12a528b9486197999b5717cb8552b38f7f759becd04970eb64bb4826a5cb47bcfba7cc46ca17039f1da30dea436de4b6ab76f43c06d1a1db65a9001a1e0f510d7b4755137bb4c08a710e9a9d7fd8cb32d64152c0b85f40b9cb433ed1d7bea1821c6881309642053f993739e3bcd38951433b291ea26f0948cb2dbbacc3088d58d42de008ab581b0b3a9341ac18c28b131fd4e49964d72d65658c684472550a06e68391f8d34bc09a2f25161745c74d68681c3b333ea58c412f68b44d066e33cb7ed17253fa655603dca0de7a13c7c0c78c9630f5c57ae925ac97a823102c423d0b7a3af864c7a95885e574d570895540a3793b3cd0c73b5a21660b64577d6b146e888a113bc44d78c175aa7ee72760f3b62ed7c971ae62a3e8f08ca4ab7daa43c51a18cb72158de398326589241f07a9e78bbe0c4cbc5dc388b03a7c131c885fb63841445469c42501d198d114c31da36418985ca5d95196fa12b59599f90750e4567a76a767547baea91c6580a628c3c052c3c8bef8755238c2b31d52621ea5579b649f6328695af62aa8d28402a554941b11baf7b54ffab7bd21918a0a6d6a368516b4a04354b6a922901fb8a0e9bc9f7713b977226bd8477d5c7088b8b90afabb61d0b32de98529aaec904aeab8d0240bcf114c5e3a2a44f0043b628f03fa04addac64c918916a3031d6808104539275901c8d8cbf17741a6e185250c7eb9379de46176d0b6cb02621f97c083b8fc1dabc9a0cafa9585aa848606c9cbc58b96da5a8f414bc9a6ab4d9811cd3b3b512925bb5b352cb67f76c810b3fc79113685e85595d4c62d41633fa092c31fd3102102960a0024d1f460be791bdb0b19b6610604fa26d6423864e93493066f859b86b6c2693a899dbc36cf667ab5e4d8278371cc411abba846b780090c7023a09409cc4541b4d8784ba0f643aa62336551525b315d6fb7086ac604b2272333c071b23595ccabb5459b6307b59786731008b14ea142c89a066d5e5c502724bc384013b5544a99aa872d5b65e5100315f70091d9aae9d1aba29c18a5549d11aa195d7046ae51a864eb4d69192da8248300f985fb5742a8f0623859b2a7aa600fa835a0aa647efb62b9309ba89a9c4b7478a8a1086d6c955834223600b65a80342cdb6788f09b138456773aa8a2b175f477b800c2803867253b06b5c5296d8ca3a4c85496fd9b413383c0cbb95880545c168099926c175bb6008b1abd69505b8c782c9ee06877523802a936830c9e58145c6591c66bc56abe2804b1ac28394b9f0db695b15c560bf48ded5c54a47244daf089975065b8aabc77e4a6d1178ed5b503a4ca40c2584e878c5c15fb41307ac297da94a3ea7e204b8a4156489df3577d74186d5255156aae92f77512d0b54d1c1559b8866af41ec7db75cf658625f784ab26089a076ae52103ee3053acc22a21a2920c65c10ed64372380292293f494c2c663a87d7eab6ef126a4ef50002924497e70154426f8b9801b09ae930907e6284e384a1c6554b2bc594591397810b18d01bd3777534ec53d050d5a81c049eab8f93e7768c39323dd805f12c6553c204d58cbc47d8e8b9402bf02481ce4b27a52e87feb92c4399c7f2988d40e942e7496ad15ad2aa88 +ciphertext: 5dbbbbb0482e3df0ce0cc4bfeacacef5a8c408cc33fafb645ebe51452f7e1f4ab58c0066614ac8ed6e71a53200ed108c6bb6286b97618eea3aba554f72d4074edddb457e516a4507eef3f5615fc111a5a127f6b28b925fc0b73431c3eb24258e671338fdb6b5508a5940e8b17771e06f3988051549aab62c21180592f4a7d4ef8befdd0760d48284fc977387b2592fb31d638e4bfb0b8b40d00fd8a5ca33b1ebe235c3b35749c3ef9821d4d571a3f32212775dbf8f6ceca4f21ade85dfe5c7d06b11b93217aa165937ce8ab6d5fe513074bc7d05d846694be093dbaa95810984978911031a0313ee25452151d04b57cc8e1c72f88400f1ab93d6b929b2e70e5742b95bb6552e8b228954dfcccd4a009662b7074c2f2b116b1a091a88e5ee7f15bcc0736f00d8af3a430f75adf20eb30297c3928c7f33396facf62bdfb42ae261b95d6a0295906598f4f0e5f06acc2dd390b0e7fe466edebf06592b8a238397aa5c8807dd555003b676caa0de103ca3850109d42c053474e8d8cab1853229ee32c9f65895e73f64da4e485db143ad754a50d96f01b674b5390fa1a5a644eedf8fd3c84b4e764b3c4a8052d6a3cf45dbe98491dbcd95a173031b33a2928d50f3a71728b9b21ffaa4fbe87a8e54ee00a154690739fc1feec0ca8899f225a3e92e04121165b092669f4ba41b7564f65b158c401e8895a365bb1ffb9d63f59e1de277e387bd519f60c466114823180c75427863465cc9e8ce8713d76d531cf8ff75d66573071205d69ce83b5fbef5c6170f0bd0c84db9e2d18171b52eee79ea76e0f960f80e783cc5a73d3360abeb6a5fbb93798a8cd301ea9ffa1c0fbd93527e2ea37230b9349405edcef15862f8adc9c04d95c6d7d0a134fb5a16f8dab7db9d5da26c56829e90056929daf41de948d968338537c80ebda900be95ebed473025c20c1ca8a0a2602581d4c8b17f01060f767c461c7da84751bb75de30042e56919dcb6d429833ea0ad72aabef9174a0920ee3bbd1dc216e07b5333092cd67d4cdf5d7c306387aa6762ec4e285de7d2be4d26f15e775fe4f7cca27ebc4c3b3991540975298e83c922123d8e6e9994f3542703a84cffc681722ff3fa15862ddc062515a2be78b60c2522c4dff01b52dacaffe074c573bc360856b8e8ee656b609791c86f192d3362e7ff47f616d53d028cd3dec69e33eb1b4523f33bec0977a504626940f4491362fa46888f8729a6883061f530a5e587be29bb1569d41f2c593d7b5209342f59f118b79213fdab6fa145b4aee2ef4b6edb888afb59688bb3688e66a0366e5cb0379d679cf5743e184d7978ec9ec58496e9c09a209dca53181c8e07b8bf3b4b8048110e16fb4cb3573700acadea95e7ba624e293e8438512bc122dd2f71e41717ae965e56ffd8aecd15e8530fb5b40ae25ded10d6fc5c72596077dd918a328bacf4018896c8ee24e18613f149316f39ead53019c042c872097de18f282a4978149539df1ec47febe6c352916cc804fab02b84089948ad5c8c2e94626b7b7b9fef58453727f534e3cd5a3a30d7ae1a7be98220c77a04a447ee7b65b36890a4e974d20416449a6f48c8efc1924ca17f44d28bcc7d76d795049ef9a0eb65eba9006f8d487f5258af3647be025a0e60b8998b5914df9c1cbf987a32d928b410b028d45bae13a4b3e5d6ae0b0770b634da807e23b0e2cedf13adaa0f87cc1553f40fa81e51490dfd072c05c5f9f86d6838bd177cba78c36119413f7fef19af1170c90888ff9432992473677b4cfd3b87d227809282bead69d05ae6f005648bea7a80f405870ff3afcc12f87cc23e56fe31b200ff47497963e407ea244106d54b0578b9d411269dd7ddcd0e801bbe9fcc0accd43ab0c88f6ba1ae664c14c231b6762f1fa0a1eafe23d9663b85818dc8db52e35ecb420f8faf2120ac5d3e5d51cbf5fad360277311cc1e8be2c9150768ee3586cfae7ffeb8d376984b86b0b08d4f85c7688132eba1bc272dd6f1a6809cb925c2d27354a87a39f0e1ed129625ddb437d5aa798c674c17f671401434b93cf1b6f6e17f73f2a286800471cd7861f71cc9e15d09ff533b1a34f43bed647f55759e85f706935c3ac7c16f851648de50b238d648b0a7fb15bc9f258bf0033ee19fd6a8f3b2071800ab761d4c3c66f71b8c0813214f428129879cccec4e697bccd2b3d5eafd14bb48c2bd46d7bebfd2123 +result: fail +shared_secret: + +# Private key not reduced +private_key: 09deb85a3b6262a96eb593935cf9aa03bf738496441cef7303da5e8a5badb5cf3fd8cf873c28429c7778a304ed430786dcd9fe41e4eaba8df8fedea87924e90c3eda0b1d8c74c86598ff80af4e95b3aad0d7a35a210b80d16ceaa54945887634e7db73de2945366ff7b86970bebdabfb8baaadaebe8f4382e37cdc3bb972f68a5d7e089ed53dc977d4836e4ae8116584e1c860ca9f77c00b51e658dbd89dd4ad76dbd11dffbc5bd4eec53def499da12f741d96ba4277a2defeae2e3d9cc9cc3c77cf8bb00e80b03b4d585e572d2f53e6ed33114a81580b960059b6cda77a06d990d20af95d7694036b3c714acd7d8da6e8af8d8cbde075b65772e65843e679702879e4d77fa61a7018eaed14b6664c0e33506bae194da6f2ec8897eb72e22874ce275ec4b8edc27e4343e3ea0e99cbcd497dfe5376d8e3caf40683f759ef1fb85ef9a43588ed7d21196161b831b11fdc643845fcbf6101389ffc83c88eef9def6b550b683d375cf6883c4807c5ea242edef6b8c16ec95e0ecd3f7fb6a8ea09a83cc4a82ff4c7e417f71adcffb3943a3b1ae572dec060e8d97787dd0cce7ed94679381984ddd7460f88fa8a596646a49c48e59b099da99768740f1c66d58a7dd7f88f27dc4f42bf8db4ccf40adae8748ee10ed39871ccaae2a7f653db39441f793468f08a29ce6a676499bed0a5199ec74f853e4661248bdfd06da21804f5a693eeb248830064ff1f354863db3e32878759efefea35b06c7978795ea61eae786bc45008085e87eaa72623cb42af8200fddb4cb86e7705e1f55d7c6d4fe891d455842750e93396799dae10f9eb0eb5b23789ce5da58ee22db966efd76593df9d4d79a64848708a51d28f6ca44f5e0eb3e7281d7c2bdf8d1e9bda6569d94cd5c001cf71e70b98949359be4683085f6f683a32e06eaba19feefecf89aa273a9166abfb4abdb7cda66cd444f349c8c30e5ccf5cb3f72a561cc37bfd3edf8ee4b0b89873b685d6766383d279a2f2df8077f9ef6b4ac289d3bc3934766af53d2f238ea92f7e9faff6b4f7a8c47b8fc5874dd30c51a1e6e235bbb5ddc7b2261ea776359ee18842e5b8341ded45f6cc9ea7affa0bac7db014f17c1cf34c5fc53a33c03c9be991ff9fb38e6d7aaca9f633495fddaeefcee2f28db2d84db55065dd8fa56b9ee659420a3575ac40c4efd41f0ebe4e58824b2bc85685a5bfd7f894a4e75c8e626c7b88530bd031c68cae15a76d6ed311be61229cac449ba38809be3446734a94d80473c80a58c3e1a56ae4abfee90fa896c3c051e9fee2bc7dd9478e5954ab993dfa2403ce6bb3660f2dc4de2c54289963f2cbcb692349a8a7b66774e31069f3c6d3da557c958bee6c03d7817a96323079fca16cc8cde66a8b1ad1b0d63b58d76b7d76b078ebe351a3ef0c23673c275a9fa87fed1a758ba3d2d8e65567ca50855fb3068a9f3eccbf53f44ceae8e03c4bdd5efe6d605b7ff929643479fb2a9cd79be8659c05d8e8d59663f6e16bcd3b43f545294f7176a354431fe2fa2d8abbf933679c9c302c39fbf777becfec1a7d65fada38b9797586f6e327565e411e3cf5a8da32936b57bbd719a837d2a394382f30dafd3a9abcdc8cb6c5491c7ea47ebb1784dbc76b851d77488c3b4c21d9c510b49972fee874ba9c46e3af7b555163339b3c739e4359f91ea3ebb2c9cd86fc44f1ee911c08864cf3bb74b3484f0a7a347ca8fa335c59afac4687a33787c1b49b791d0f6c7d5beaddfe3b4c7a51e705c1af1e4e527690b37e3235dd89fc35b8810f7215784d27f5de6b5e3598ea7a47bbb574b3ed872c3549e3d7850b80e0ed4350c8e4a297340fec56662c7131d99ae573800d0669ba2b85711e9d6903dee12535cf05acd9e8b66215b6d2979ea7a64c25a4ec69d6e400b6faf414e2fbfbe8713e9b37bc75d939fe2e6a76659c87e22cbd01fab947fec855bca6d4dd52cf4f659c8c98d53674c848d0d1776279a494c456e7c38e631dc9a338545f140cec7b7b407944786f9cf5f69ab5e50c5d4d73e5505c5cf03bc23b454d2427501a13c813dce1cc76681cadf6422eaea8594bf087b474e8f1eb2dfc7014a7974f9a05d38a1a4b8e6ef850469ebee10a3a7fcae9c9e8e22c4c66503462b4ae4e991442582d3f76ca484fec606dae58a9ef9d944760059a381bd53c19d170642535f7c56a2f6bbea8b824a81339da5945f7175d08c69784e67d5e079fec9129ee799a1860ba58485ed631cabc19ad60934c192a27f9266bef098ce2d847407826afcb0ab43057008339c534b9e19c5a3542b40a3a88d41533b346754fc09fce920ed73b2fd7048e540bc9af49247122771fec129bf133c3c3711a679353a9a0ad47c4094471aee9619eb58a3831bc60257e07d09def864638498d3a731f24a814177801ae900b5fb6cf3374320a261d57c170dab6a473c86036733e85f290c9aa4cf7b56011c61723839b1e7c629c7cb5f4e4bcd1d6c9fec583d4b78670fa7a53f65b9fd0a91cc6620a5c1129339ce2a93a66618c1ec69e584a0e9c283993268fdb1c8ec25669439472d409447b6a04cfd699d167252c29af53eb27f6c3950b456861b7ad273887bcb3b41e75bdf2962b604ba62852a92f7b192cca7391accd0ad0bb65672e66317ab82bba06766917455f7fea8af660cbf6e3103f7a60b9736bf897b3a53c9be798ac0c493911b835b4514f3e095a49a474c0c907987867cd11ae24d22d20ea24ba028f02d1b295605270c00c732b1c19658af0424f2b01b7c4b8896e6706ed564b87f21afb1208f9f85e1b40244d622a5aa461c25b0319567b7cdac03d9bcbca028ab108837150a6426138b1073c348a1de7eca92acbbc0a95aa88864d734bb90cc8b8dbdcb91c4c333ae46dfd8353c27438abab8a60572d19c5bacf6b35a50b86e80a7b9b44bc74f74b050c2d6965298d33150c63c7a15150fb66082c851637568c2e5a9952e7ad62436e8401a0545c6415a948adf1449a51779005bb08bb75fd518c2dc02ed5c0b63dbb35a37612ec44b2a04a3d3c15414c0193ef5c09aac62d1cb212bbc7bc7b380bc88a37ab103d872605ba7883cc0bc83a20b2ce28a31a3b0bec216b7b1419bca5425e255b25a86ddb5ba95900c108f036a9ba2e941a1966b225b03cb7335901e6d32613b54806c0c737984da16284ab0b4594b0734fe5c6018c047d238fea777538d49992992d1a012f4a65008554405e3c0bf8d386c2eac5e07470d4d6015de45b3f99cc1b9b6f8e459e9987b773d69e3783b520d1282b177edd9c631bb4a76052c8eaa8aa1bd62269a2b2d7a6ba35b1670d27be1eab28d1571054a67e94ab3adcca05ec609b5171a1d4ac1b3a2876e33b7218c7b1a119812479c4974575208540a0831446a7be7ae0150859ad521a0d891b7a6cb9cde236b48868c30ed26391410548eb21756c3d9efa564df5780ff7b1b1f830bfbb70ce7181df82abccc941f1d79b6db3a012d5b7ce5b7ea9ca24b387cbfc34400d47200ba07d5f82c28991b289f56361f31330245f264149c9567feb569f4e2c21cd9b80a10a1ace3804b899410d912d42a9ab68b76c2b4197ec5aba066453fce1cf04d2a315961126cc04fb63361e137a258832679865cea937cab03534746918080b1b92cd099622ea137e4d6b0b30d18ba27582775398027bc54fa09d7a23655655c491f23181816d45437be2892eb73958b56899f25b3e48874434f12a0052518f3caf11215df0bc3265d648935a68806a75617506fce900de0cb07f7686223b9990719af5252ac61a6c44a7655f54585abb4d26e2ae5192c2381009b4796c87097c2657095ae03b924653bffaaab6b9035d176fb34184e58227a64059f54b44fe62a68c7a0e798362de1966db1a982ec3af25ec20f3824cafdb53cb526f055bcabe72a9e807079046b57eec2f681ac8ebcc0734a71ec65224e4a80244340ea1d339e44c7e2c5717208a034e9a6791888c9968987e710fde215207eab3f38aa49195190a885fe75074e17920ea64b6fa077336aab211fbb757880dbe36247299bb8f65c132e48c54d47eccc7aa124547c910831bd98b07bb1f435ab7c96a4cb9b46b36b6b667da4eb7cb2a12f1bbfa88b98f3c6c3704be3f000f65562d7d4c4977ac8c98ac44958c28f65280ae68466f6b7495650cde4aaac4c68e07767d09f44917b29df63352dcd76c1e393e0d5067c76855a989b04547a625762c730624835a6636191c83d3836bf74593839a83847aff3bcb3ab169f65000c6aab1df08994e161861498fa2e42d1203786300adb060a9c2429bc7325eca24279404ac3c934ebed4991502bd669309e7a76cf09507b31fbf659deb7bb881f5358d70595c01fbc7ae7183540b7883122d67bafbeea6f8085943992ed8b051cf758a8b8166c1a1e5f818f0deb30fa1fa06190424c3da70fe850e80aa818301d60c70f3038153866dcd5d179e22db59b8991bb4 +ciphertext: 9b957d47479a6dfd155260fbfb8752d27e19f551c55ba9b4b6629d8db47365a328ffe7d1bb1fa7ab7294c9ff449cacaafc8b4dedfa54339b5334301f1e17de9e27b5a5985420fcbe6b163d007830147ca38d9f9aa299ea2a4cda106304634ad47abeec58fc06528b5c245a90758a81ffb75648d115d39aa75856b64977ee1a7651c826a508174a7ab9c49a119bfcd973a4cddf2fdb4ef2186c9622c9d93fffb7e5581b4d28add151aee63e66f42eba9f3feb05b4f86f8410e80a33cf390721cababa5316c37b53e5afd955a90ccff287e121c64e3950d6d3e90e4cff61a638cb058648d19c2082a2802b92b10b91f4a0e00fbdb835c10f70f3b87c8b45dcf6615bafe6f059ad4a4d0b4ff94260b8fc421515bc0160d9b3c797df18f735054470934084c287e45ebb56d5464d2669015e2a072d48d46571bc7bd1eef75338d635c9f2bcab03c196d5d1aa5910f10e299f87988e1d44fb42b6ce5a8d49464c3e36f52af37ddee6d39a888f3121764342fa80de26763fa424ea3f3f961074688e200274cf047838027aa56091648793af6d7b0c5a27e308fd3ea090d531d5e1670e7b5b47c28e6751dcad317a5f8effc85dd4cf323653892d1c8126ef3247af8d250f4b541b446339131e90a9c307c93f7d98a17fc066d34e2457a6b3a6e3b4ad1c3b10649e69b11ea90d5b79a501d8ad68937dafcf660703df77375a59378fb3ef8d22250a848ef5f4801472ef39fa6e57e22adcbbc22c2e8730d1e23c4660e3780b6dfaff439a5aac5fb7e9ecf2db74c4ed16e487a68a08bff6918f5415c2f2f6b034428290a6555c6c12708a2883c121194b07f7e55ea70bebe1fd2bb577a8c52d91375fbb7d1561534215d1fe34d4931179c15e46b5e8bd7ddc045b82b09151f68800bcc3a612ef003f12f50df2c00aa2f4e371cebe4fceb0c9e7ba3200c07b04be526e71b859ab8e64b39b76d47bf2960083b66c1218aac27bf9d6b06cbaed870a0f379ea957857be103c3b2d254b72b01b049b11ce3a5c1d90ae13d4811e900cdbbe4d4ef1454bd744e798da49eedbd278483c9c8db68169951bd0063aab7166bb674cd78d5187f1cb5f2505a64687db7b54951ec6c064f625d6a74e86b5dd935b94077397cd434d28824387fab8413ff9b8295e274f869fdaa3786c543e8b1ce9dcb788687c158a80407dad0d4bab16e6dae51a4166f093c572787065954d4732deae996d58e6bd79ee17dc6d78f7721c23b8ee7f2779adeb3c7471cdf3006eb9b642fc9cda393374ced828e4fd4a8af9e99890f322286d08fd63a604a61d5144d9ba88276afbe84ee7c27ab956d253734d5f880974b592ed7174a0ba743fdac3c8c943bcfc93fa14e472c77b5a2ea1bfddeddae59895d43bf3e46c477c9023869beb1e07b7f80a7cf324684e2e0f67ca7843a10a30f7768bf838ff428efb22e4c71e177efd2181c9e4a78e3bc180736e9649e8e9663a76f01751150b74a48ae0bebbccfddaa449611884fb6fd7c335cfc0ca789a78ac1e1b465ca866e905aa971e6b346859b018316cd0bfdb7a3b8ac17ee08b044e71cac64e521c2d577dd5f4c6ac8aa97463334b9485f84b9a19e3cd99d99f911b7a5ae949545819fbd9bc5bc357c07c45801835d06aaa1760c09b450e77e547815d7e8a38c8c46b1c2442ceef1993827832bfc417a2780dcb788b75543b4edfda1d1629f7e21ebdb5b19e5cd72cd1cdd95cc9d6067921a7e23d68c26713e5db7443b392b7039b806973775643ad704376e8e51ba68e8d47af6924195421f98c134a016708312da306c275ad375b1605ff1fbc1a2cf8a6101c4ef45ba9085a6c28c5998b1e9130721e398dd3f4228791b0a09519072d46cc19ad5dfd824575aacdf9aea052c757cb95e7040028bb66002196a5cf9e632869c0fec3849314e6124a290dc4fd8a124a0a3219f106af488e135cb89dcbe41a33e33af79c84b0efa25f6d488ff56d49435b25cbb7f9d76c9ae7fd86f40773f8f250b59ab264eb60c702360813d20d9cd94526cbede732811475c8d7a3cf1b11d4565abaf8d996bcc023bb95601b88e316ffe8e3398b2a9f6e5f6fd80d66152f2f9669b74a4fb9221298ec7a7881ac8197466ae63a8642f641faa8bccb832f2b52b54d2dbd8248ca3760b912950128fee065b6ff2d9288fa9159239f0def0d06bc6dccbec5e5ffb967eafb5e4ffd8d1e53379 +result: fail +shared_secret: + +# Private key not reduced +private_key: 59985866133caf63e40a2d5b859b9783dcfcffb66f52973ff226822187c58234ae920a4cd64665e6f6dac668a79315feb07981fd99c65a2d90e2286f0d4d5308a7dddf93857e1c8f212e73aa886fb55cf42ee64167f9e88c797889deca756d4edf7af1f38a8787b5ca07b49a7c59ec250d50d8fbf34d99ea3f2fd165ccebdb28d0b7c3fc2559d0f9e36e40cb55b5dfb366d99f1c86304f6a970a4ebec4d48905b33fc44564fdccacd60993353af15daab12a93417e5ea3db6c9aa2adc9a7d7b4a2fae21cf483090bb855048cbb6c405124d7459e9e4bc651b60d7e8f3893c6ab6d745334919af407a75557ec6b2ebecbd819509958c255776158f4ab1be64e3e53eefe786c8ca4ead91936f1e37ee396b8609b4e088ece842c312b1ca70cb8d6907734565fed50f49402ae6fbf57e92ca7649e3989e0546a662a84e29d4d82133dd2fb83ceb959f33c3e9d46b69b1d7eb133be1297749386ba7cdbadefcd508256b12608d2139ae7a0488cccea64a0238384ba53aec7b343cf47257c5fcea471d71f3c942b312b48643845eac4b5306c6699bd868087348de9ff2f807e4ba3b74ba9b9c63b9d98e46cee38ffa4db9c5b9a8a9f663aff40bebdcd48caaf1b5f01574db18efa354f9a8779d6390ce58f984434ba7e35173f924a60de8df08d74443a2eae4805b03c77bc48bb7b3b0964e9c743d038d1b7b7f7025a79104c8eedfb80df6552f7038a383f83d7a38b6ce430dd8b46ce067d0b699ee28be690538542df8743bef5bd2bc801a660410492707abc717f5662fe6b9fbede7fcafda3df56962887c3befd2839d7220456ce8a82ec163a54c97f4b7a9393edd4a64731ca6b883c94a837ed539dc4ee36d9471dfe3c0cf343ad35dd06af6966898506ae61a6aed132d747fdad47b5489a32245868778a6814eb6b7870b083dafca761e75dd59e3ddf7a8948294991e6954e4804ef5f039072337aa6ffb3ec4bc2f20efface4ba3a7f30861773f06f8d3f1365445fadfcc7c1e925e0e22a4d0ad799c94a88967fe45f1372ab85baea9ed23458ad1bb9859b8deaf3dfe49813d58f435b4cce8e8b6fc68c355c8b8450dfdb345d47a2585382e13c7d2f9a8adafc4643f642d4a463abb34c2544e5468e6c16a5f7641a63d86cd180d74a0abd70b28fbf0a2eac8f59c5dc194ef8b93a0235cad649b781c58037f6e53128bca0699d0b9494db44407f5455cc0e3d1b9d73df8da129ed4cecbc639c64898e1fff3c0b514408c8035cbca60c4eaeeebc5e9873ef26e2891cda253a6c35fdcf9f9cc8afe657385f3cb83a90de4484720fce96956cdc98844807e44ac791fa44c0bf86de08bd54820ae543f7f506eeb2e4e73f6bb775c4bed72be6f452d7994066e01a63467da751168fe42de7d3aebb4bc57f3988c334f407ecaaaa8ecc764abfa43273eba82b46b53f3bdf59f88cd3eee3e49b52fc84dea0b5d26be88739aac301ef810389d27ca3b54684e3b348457816faa7cdefaa1e86bae66d3994cd42ce91cbffe2a546354c7bc22d169def7e32a8c53fb6dbc4e81ab5cff448f5e7acd9c5bdec7c61b14a8671e4530544ea4b94e67a8e38a485e5410db1424b4c2579a631ad968dfb7595d9fc4239fc5798b6ce4693c7566878ef725dbb5871d5efde8bf023ff8675eeed5c86c0a18740990cea2af6b4cdd5d84323ec232c59e6e48a21eceb8926b40375b6eadc7f11a8713e08c0a26ff0001469da3a84a8b8d2b2737e596bacaf674c29e7ffb1d463286cc3917bd64e076d53058a5f96e18506cd99e8372996a8e32a36cec3e163694bbada95e9c36f0295ed379a3522f638f737723f2b840663a60d2a8e25d49dfa6670b997b361394e9db653b269c352f5e35aecd08bb8fcbae431f654dc8ad9774c28edc1cd7b0e0a326758bc536cb94c0c4d3e5490b607e68c93a1b949e5ce7dbbc78631d9d8a34cbfc383dafe1a59859d5e306b5db8db1fc41467c6a89cb6e55d6d1db5e77b2b443c644777a74e96f65913589582a8c7abd99876f48efe64dcfca7a88bbbc7785cf815fa82d4fe7645fa632017c4004a58475d3c9be6f9850438d964892e1fd8b689d3ddfc5476f5d967a665b4c9dabe8795c8af34b2759826f9b1ab846d5f763007fc93108beefdc7a2876488b19554d4d3a9f08b82128a170837c0c51758a801316881c56d436839e5778e79553d97c6c48587bac980e17632f7c7af3de5a9b15ca6d33626254a9e83009442289274a4c860f42c86d8060b2821c873aa5cbccde4540a8e5a6784ac15e6b30cc71a8de57a83bc5924d0117bbfbace8ad5cdfeca785eb224baf8361eb64c81453fdeb54e4e86ab4a397ed6e84b9ba73a0c4b8b606318ccdace61b70df22c4518f463d8342ba6faa846eb55284995f36a7467385bc8b77689807ef511122d12066e12619e37c8ad0872d5710083a2b9dc7107c955623cb209139034c9b3c6cfb7b3133502621662a61bb63b9c3a4586c2201516ee6c3f2d25026f932fc13c5426d64093cbc768985fb8f70b6871755f8811c60a4317a21ed8b5a7e51c1784b562c2a244065451e22935ba9c3ca6a63dc945ca37489e317abbb02c9e87b6b7092b1b4049c603f087d3596169baa2c6e3a778e61ac5f04962b61aff07a70ea72800a0143e9c43f2972908a27e0f3b627bf14841693613711115bc19659c5b3db6bc19ab7be40c24d5887d93e6b7d31899771244c756790ee881fd605d1383409d608fc1a10d6f2511ce815361a66db6244bffe1b61a46a888a06f3260409239abbb9c717d76ac4d658e728977c9f09bae86105d796f0bfc4b87385efcc791aba5169c679dabe34e1ee44ea66ab3d58724c3e7099bd80a9d52cca8ba95f9699c3ad8c90199a3b9613cf9652a79cbb93c8c949dfb0a6a7a1fc5e4a6032247b7885b3843a7af4c7bd49068228875a002321530bc6b5076d0853be448a8a85a8be09b94e5d65d3bc2194a977396d71924bc5b420aa6283b7ed9ac822c27641c811777a8550168468892987e936488d71c9af0a8732b6ac23acc23c2bf8719be59b23aa96110ff02af63858b7405482d684848d83fbf3b317217be6bb750cae74df77a8dfd32539e8964b764a100688301ac20a95306163ca391d33052e7488cf27d4da5be786caf99e294ba1782d462c446613a15f97e9f5632c524cbc0430382e828560315e6bac00b35c084740dbf159809849f8e104eaa28abd5f6978f071d53279c4689c77c43c0b649b8aa042a9c8ca968f28c81c211f8bca19269a9d79985478707489caf7690b529b988471b12523405db659014138d9a6133171c68961a327099477759261c523f9ba6a008d3c14b0a02295902637912bf1230a8b763ae397f805c2cfb4228776443645274f5c01515986cdba31285f9c72fe7634c0b44a42150b1dc75d8cc512d503b3ef7487371b70d50b9650360f073936398356cc3419f1225a3946a61bb38b2e61f0ef85d1686a29e56192d8a26d42a22f274811dfa1c1c4cbfec8323880523288805ac98000944b667346e173611fcdc3d474b0c30b0620f69b3d45321d9c91a130cb6842659a6a0904ba598ab706336417e17607e865328ccb035bd0646b023c3545c2b437463cffa14dbd86ee12b8ec24375f5b4a3a0548eb9997030ac092a579bcb6a0a984c9f354312931c653242678e98502a519d15e64597fc224101cd9462ace9ba56c421b692668976b3a170d88c4501147e6c68ede8a29fd4951d32ac9dc06f700cbe9b536a476736b1eab14e2493c5a94a07f6ab5a323ec3e9b9f639258275523fd32071739b585b5d8657aa502262700998f0c5ba71974c35573f14c13a70842149c077624737e5a06d52863d63f815d57acb4f0142c9167d2784365ed78c9f6b235c7368f2b26dad962e05f2279ceb44784901dbe87e413a04f462b4395b5e2264784c2ba356935dc1ab3c104b6be09b08941a02512055a1d70ecdc281e09c78214a0e57f2ce035947229181b943c5380b7e6f804fbc815a1f3023e4aab03fb4b0e2c459f58c348249adc6b4a5474622c3262b11814acfa872bb6c79b3614e3ad2a1516a0b0dec98f863cac0b061670ccd8d0c6f7eeccdac933bad47cecedac3a5231ef1c040aef8bc53025e0dfbb3d5c6cb2ae96f11a05dcf8885aee9756a13ca0c1280c4d331d50b850b6c00999360dc585e1d849114b13f3849b361f7083b5b3db470796f5761f7641a89189c748b4f6b88822ec85b04228f04a669c495af4c091b54a3835b379201d9c7273557f73c1e357588b68baf3e2a5c88ab0e9e057cdae06ce672c84b2a04503372c0f370d114ae10f97052fb3ba450d323fd3bb1b887fc4da6dbfef06ba5a2d5344feede346d1f04ad60895ab5aaa698c34e1b3b6ef69049a883160c66533c8a65249aa35006f003d4eb4350a43afdb8a246a56ee71465591831c371f2eb87467b0559dedd776ba063ee6d2f93 +ciphertext: 3233f4cc3f6ec789ddfcfda18b29607feb86a95d113e2ad085bc8b00391c70ede55956a82cc4a693d9ce7f66d6955d281a33b19451e9998b28cedec33c45435e6a720ac19ce7ab900fd16d239ddba34bde4d0b4cd5d307b261f8ec893dcc93b635dd7d608586c71560075dfd15effa71782616fe8679197ebb9f98469f28950634a1c1a90f1cb80cc8d0314beccd8a8768e20eb715c2e5f6ca3908bb7b18c5242ce5b22287657caa8dd787c46cbc30f843a9dc0f0dd156ff016bb21701345dbb673fce26277bb49188102b49a52c2289f18429b4cde4c0455bc809a8e20b6d8c779b47cb585d5f9455b416c44b2a8519bd4159d5779b4302f1d632466620ac286ff8bdabbb37299ef5be3984759269af8cf2530ba8af630d4862bf4cd2e4a569e035590c316f9a9346a8a0ab271b7a6a8b7b1dd9d2bde91f4690ebfe7b759f9614412bc76364285cadfc7a4a7b688c08b2b769e7ea7a53e0196dfb7c1e26f447b1a9de9d587c032ba60fe7b7298d1a70dcc96617282cdadbcebe809affc49cfd635f273ac9f57ca1ffbb7f0c5bb0f47d180e562da14d33c9c2f7ce5849f1c68037c31c0906d7ad6adb228f3e9d68c3ccb51d2900c39a2176fc86e50b5c8faf857ff1bdc9a4d6d40982444469ce4b918d435e1878044ada54032855cff3fb9f0841a412336e6407cd8c142c137e81a113da062d061ab2f817104a179f2452ebf3b92612da3592a74054d01f17126b217c58a6023a7381a3d1b63d224fa552cb1087ed7734561fe699a11b073c7402a801326229675d6ce72706ba7b69b87f5316ea80cd5470c4ef45bbc4c0253c7b5d9b2cb51259f791fab2b9fc9821fc76b54107edfeaa2717ceeb9e8dff6cb2a4bbb22f012ff1f87cc4703f52653dde94db328dbbb35b9bb5da3bdbc01c3acf4b2601d9ac1f9a98d189fb1faa073b52af448a6e933781017c38aa87070b4b4c2ace0b5af9b0e5e6eea43e4f7681baab39cf40386fc503f291d45050fc6283eddc551010cdf583f8632d69444d95ccbd15464833c724bf9d2d82bd30ba3874174ac4c2fd6168f282a82795f60486c88bde20f67e645394dbba2670487f9748bf719fe5dbdad7b98cc8dff4a1a4b9bc62da1d7efeeedc0c37d5f95816ffffb78a77ea756e53e28ed69ad661287ad919af2de3f9b53f7a592402218527d8522e8b82cc235e3d5f41f2ac909e40a7a9295fb28d6cdce5a70eaa2fe905e8a1bb997d06ff9eb9b486184931f0f3e8a59ebcfcc814d31c69bcb6eaf5ee9c9a93b7feee0e336c8dd63bf5ead30f419ddc0360916d945609d30e008aa5f7a8b58ae7d2c7855131bb89935c59370341297c896c8278521c4c3eeb558a58114895d3da678249d0862f0ee3842379f59aa2eb4d12a78552e4b6f31e014cfe27b354484c53137630bcb56eb5d19320310b5d9c309bf2c4ef461d19adb919d7958a0821026c5107f5b028d6ce5069239e1fc9230bde296b2eda8fe7b723bd1f5ae93a24e62194438a9673c0becd91137dacdf9f6fb00da48e1417df117d21640dd92d98dc7dc139b6c445a5e275b74fc1e38c8550b3d822c2b2436db3ae0c1f3c5bb86f33f9d36e9af17114f52e7c9236b5b7d2e6da889d5572b8460bb002442d062506e66085e8b90c76c700f6a7b56977aebca7039e152579c4ee27b6c2a1f7aff87f6cee904f3e87c94fb271d074b66be181d11e15e15c4e101018b6ae70d63fbc42a2ae48994e4fed115ca3c84cff62a88898087b5a6b1874da7e14b39f4b09b8e2b10a7428f336d82a39e150dbc37bce6255e0a5e8fa2b74b5b24a8aa601a6c671df2dc52e13cccdbe32c4852e676e1a77468ae66ba1dc2ffcbde477041ec452dcb78d12e3c3c4057b51c74464c41e65718b25c8ecae2fe5c6e069d5163689d2671acf75002839305752512d0b5c977b9da6e981b344793b8b162e78398290425009f32441be21418fafecf2b2c7aacf0dde97896533c11ae8b94a698ab8cf8cb2cf3ebf19a358bc121dda105498fec665c760c7ae16de69f0098fc1c9481ccd817fe9cb5ea31947a35206d9c1f86b8bc8766373bf2aad13233a001e1e8cd865f8edc67974849ab0e98699fbaf73b57255afb0481cd55a032c533ecfa7219cf7f9987679a180a2644eb4d373278f1d45f8d69759319e1ed80eca491ea1df75c8cd98d694fd2480617170cca06cca20ca4650f02ee58c53 +result: fail +shared_secret: + +# Private key not reduced +private_key: a1ea441a0cd541cfdc73eeb094ec447843f5ba58a537cbfba389b1a9fee1fa85ac497e6073df345d789b2aaad751a5d6cba99aa60932f1bee2282531a51f3c99b8b4eba967f8c8fb9c8ec3b913b05c05eed96f81013eaa7938f42ce7b0aa4d4bc024f747be51eb4bd02d67ec07893507b7487063a4d59453ddaf93625cb45fc8464eecd322d3c9ee8b8c003cf27d97b3671ecc612d4af3d88352d6bd6c07c87b1365c8c58d3a2468d31d3be046d4065734780765e4b932d7bdbf3935aac04849b0498a7087c7dadbcebc167858c778e9ad913858eef7074afc688829a45312de6077e5a9e38744c25de59795a2822d6998943db63e559949ed3a0d7c2558ebd79c8c0fe55aa013397be3ab862d479297f577faeb3393cfee4c90b54f640f864bf16d5a7006d9657782a36cb78bb37d91748e1ccfbb388880a3b9ad78235ecbdf4b96ffc0f98da59775c90ca4681a4dddc0cb35ef0b6aafbaff9234bfd8fdbf425d7fe0166f7a4698ea9f373b6867705cfe7aea3344288d99cfff42888ee4da9ecd5eeaa089f53309a2a9483d2fef906518661e64482bb9cee4dc314034741fb7377728831664ad3a333106bf61ee87b1088fda5da79bb234cde3234364973237e8f5d9865770a7e5b71a4d7b78952406b56265b67576e1daafa48459f4a79adbbb4cf5ffab7f5b94c96a3a90569cc179fd6c884934b547a116938458e5bae70eb49754b3e0e48c87fe41dfd6f4edcd823ec6f15476911b4b9d13b93fcf2fd76573b995ac8984b5a0dc33826d3b87ef0a77c363bf3d6cf3266df1f97eff28eb50199d666b4486aa7fa3523bd7e2ce3beb539e741e67bd535593796d68d6547c89e3abc73d892fe43bcbfcc7ad5909ded3825f655eff8fba59e2c757c9671b8d0167da5de9ea5dba81113a69d15395c25b474de8e7d96fad79df4566d7989b3691fbff5b88137f3c683e9927e52e9b7d7228d83df9a0e1fa702f184d745b7dca658b07b4f495df7c15fb44f8dee99eab93dbaf6fe3d5406c09ad407b6d28945493db62aa9f4e756cf9b8be873f34ff7c637d9fcfa222b9ceed63bc73543a5729b93e6e8c09738957c8368d5da58e0ea7ba0bd06548b763a4b3891641e74dc89af573be0382055a9539b471c76e646047c10d5fc4d92febf32bc8963fb763656cfb19be7243dd4e7cab3053b901be62ff58ddd60e8c930fd0a41a4185fc554226d65dadcb01d546102d9debc4d496eac65ac73ba274d41bfb43db29b0038ac8c22e64fa8f6c20ab8dc4248dd87e7ec3d6c2bf974da48da31323b1b38678ab08db32f832e74fc31fa69a163b4a3a06f60fbfe2e8033378dec596b7f795196de2873bcd0dc21e8b5d766e9c31cbb1b1e339aadbf04d9e9b43cc4982b3405e8fbb0c97b2db47d231cf413418c91eab62e30b57b304a91568a8dd29506e656c6785bf4838d7960bc962e43fa7d8ce046690459f4f8d6f660e6adeb9c4885e739c59dffd754d583189c6c9f5eaad37328a1c605bc44136f34b3fb8fe24764743a4398309e2264e5c2f5d42ba6393d2159b8a9fc4188ea06d6c5745c5cc3c0ed886fe9ba1133cba89c260aaf6a45f4daac54d152b34d62399459cace7ddcaa2edee7794eab153387c64c5dbccf9bb98f5033ed46f9f7f6e7a4d85d5f99887ce3774a726096d37d6e343aabdab95720ac89bed9b7ec2aae4578e78c9a63eaf1f68faff9d9d4d80ce03e3609834bff34bfa775b4c3d78fcadcff49efc1d79674d13c9a0853f8aaebb9a87529d55548f3d3d51e8d04f539f61de7e3d858037f9de04dc54a2f8bba79a395efc823e085c93eaaa069c4a288fdc16047935efceea7dbec418a02cd9eee82a399997dfb29d855e67ec075445e2f53c8eb65f4a1884413fb6992cd98cdcd69ff55a84d484e436ec7a379655baed2fa461aaf74deea4603838b9e8e9d8f9b7a393ace7b97cc9c43d438855c77c284270f8e528a745a7b97098b55e7b2fd79159ec116e5494b39934143b194eee84be3b6f9fbc6d55db47b7589c1571a22f370cc98794ae3d1f0d8d57e955999cf22a97814a1caa5fe7c336ca331bd6f66dcb85d3ebcada0593c04bb91d3e55e84bfe0a8a57b563ff7a9f63b0c3e11c1e46fad4f9ef4c870a1e399f8e58915b7522477500a4eb2c66dcd7a390012e9f2ce082fee023e6c49fe0381cf056ac1bdc95895271f4e245bdc98ee3a87f651191832b224b3c5528562f9498979c4485c3206eee0a6f5cba8fdaa70dec105bedc40e4c6b667d1739c8580f2d246371f415411c803ae0b52f0b5a6cda5fc3340f1bfa10bb29accf402d6f06472c14cc52556e5a97b56c190eabe6817985cc346baa02c76afbb6b6dfe33f711c78896a529656b4abe25516e448bcb41dbabc340ef4b483b750b0180f68ec0020271a0e9b9f466a4728c19bdaa426fb82294ca00261cc0c3349b75d397674644ae5ca363774abe8a290240abe4039a7e124cc894657c9025e1534b91b896eefd3af2d559da9f8558fa7774708a7fd535580545bc68c9cc89ccdbcc78ed5203ffb653965e7b0920574b7907443b9931472cf19c17dd18ab87842c853462366646881592ec3f5cab67b7e768472a08a43681120f491bcde05a9805c6787b96ecccb05d7d944fc858b5ec3828859234da88d8d00542b104883e824e7b630267111e49b1bb5e4103ea9ac2b187e046b4cd109709fca26af813440f30318dbbc34598ee5dc2806794c4e0a8c6b9c2310c34636088da92147d6b32a7bb447f50b898c5a3e5cb43d6e3c147ad085652ab9edda72f25b7bf250ac84d1288fc188ba645d88333b65b1150722334b5616429b608a0c93d0d946c15576c82093e0b263bb521d9fda997a461f1ee47098861feeb8b557b4656cbac57dc61fa9510bc1c95726b561a1ca4000f28a5720c42eb932f1ca8fc9b647d3740117ebca3d5587816bb48cfc1cb4e9caeb7834e1814a7c478fa052640af253371242da9575c2a66bd01c5fca4b958ea437e6474301069d0ddb254bc4603d3ba5b7415a96e5327743662caa7e08f608be974341b70db77a850b2c11e3b4cc6525808238cb097611e77cc449f17c63da122966394e79518fb6022ec470e8c5082a945c73b52f05c38e2dc3419af4080e890a6e819bb1b301046057e548894f511989a40e854aafb62ace7e586793921e292cc8601181599977d9fa457aa2039b14488d5698a8f03df1b56479f9109ad105b028219b3c90adac962369ac1f0043373bc243286c24f599de3a28684524988198971c1f88419ca09b3e4f22b64a221df8d32afdb0572ba62c7387235ee2752903535c9c912ae30c9151a3b6c415d59a4969cc432d088196f22c518037044236eb441438acb6bb61ca45c947ab98a53b44c48119135f776f2aa4a8413a1142cc4eed8c2948f8ca5db39388dbcc15c12d13035763a57c523b99a1912d0fd29b952776eb03aeed697320c66c0f65b369e13c7eab1e98b281e7b17cc2cb9ceab725671bb5df0933eb5c70a3d39e0eb5a55cc20af912af87cc23e10ab77a9c9755201ec393b523f51d5307b176f05fea16a2dfcac794f834f60a712f13ac8d5174d3a7627ce66fb862497cb95e36da3f486c7432e5983c2cc8cc3a7582a6b22c5a7ab3bc5107c831af145fbcf74ef9523bc7f0ca5eb97b34a3872b9870eefa3fabf609475c46b1e736cff313f046b6050c13392571f2d252959aca2f8418f7489809ea51939a1e8192bea5719262208109b37bae2424ec3655ade90a9ca235f69c8a3be54793655a9e8c6e9c64354a842458067295f08b6ab3b938e6b188bc252d4569589282eb703f0cb237a67a779d8957c4602a9bd80f266303898acc60439a975c8e9d8342f6f1a7d6c92f11606435878739d3bd27460fb5e735a73cbd1cb6c657d0a6074633de38647035b54bd10986e4573e09820ef56fd8d71ee778822f72194237c0b5344cd8c888f12bb34fc86e6147161143365fd45960396bf45a8868176c7d0c440fbb71b8c6aca11b6ef3e33484f9bc22d090011918c3525cd0f0724423bd1e1c2b46a66552926a3a6a0389410a3e5c41d66b07c1b41c645787e8503c613343cc73066bc85b028025c3bb6901e33e242a0061e001ecbb7ac690837b02282a457ccae40dde98934bf37dbaa00dae287fa0a628c42a66a7e05a6645b244e909fccb6abf0075bcf0974b97099a7c67a2c71090c7bb016210d0ab69ff775dbc47206429b347e6749eeb3e23983759a583e08b1653cbb5ad4b677f9b9b365287c1b559c199c3945653a3bc7b0da8b41914be5b411268080396795f1b95ae14871397e14f8f3bc940f00d669886668c2dddebf98e5e270510db63b9982ef818d1253d74a644fd56900607545ef85499cb370a74dbc96de89daa52e6af0482648e3995fce28f7b7c0daca7b78f1a230e05b7114ff0395cc6634db1eae8258072d09c09f291e92d6620b177dc50d7 +ciphertext: f05495bf998983547ebf417fa81ee0e20f21bf5372e112eee88c6b10b7e92b488546cd524e4eb6a674f20d9c2b0c54245be13ae593a1b894690554bfafa7f5c4b51cf7778d52dd74226637f0d80635dca6f838cb29d04182acb82ced6873a63f7e35da73f6a1c80c12be044412a2c6fbdcad994727b8c613ca1f7c71aa730c195171e929777178188852f0238d30be6438548d5a58178895847e3ad3995fa45a4213062b9cfd0337dc726fff4a71077690015d9f59ea6e206b3fd06a59b792d20cb74c4a69e706daf0efb0e2002d194aabeca9bcebb2e6e99fb3b03f4c98ae7444af336222753c90d43c76c73e20cf4276b8ddfd81e1271ab0b6105f0390852970d90d2d662fdd6675a9a44b4d64fe8e19e43110a5707f0123993d698e46901e78a7b9c015464e387a62d2b07e32ec8137af4b323b6785ee7ebe0d9e95f438fa79389d661820227d1279782dd02bd0afd6d1056364e786322bc17679bb8626f13ffd3e00adec533e1f1bb563016f618a0482c3e8f8dedf903898dd9ceff7d7f4b0ad53e91441a383c557dc5b61af80daede143cdb67ac4976ed740b006deccc2a60b4bfa234e3b2594527ef2acc10edabbd8cce6b6d31f7a2375c147aea1517f4ed29a3fe73c525974c4b0c02917a12e417fde222770ea9f8ce374978b962e0e4ca5c5a2dded62f632bd5db71e80f91d1cda3ccb6861045b35fdd136de1106d5d7af3ace8b7af2af137b63e396fd74d81a804fa7ae1c0b244eb567318d4a446518baba13342bc4290ad6727fa0a1105dfb3cde778b47e8f3886c3a93e2877a41873de3301c745785dab0a31d6b3429abae65416fad5f4853810e9a73c1298e98a8b6b5c6ad48a2d461ff62f114f8adf3c26769f870216a52a186cbccf85beeb6e189e23df0cf457b75aa9744d489f4b703bcdd951f1e8501cca99f299efe177cbf05814b7329b6f3e70f019551f16640713f24786921e42535ba17c246c1a3bc30aa50101c3ba30325e8a14b6d9e943f789103c2498c41634e14ca58c4ae55332418969f146f1e3f3123690137d54533733e7b4c61a06ca59bb99cd2b02c55c6c83948c452e1780bb15f95e05329fdda527cae208c698408f6a4f1d3d081cde45e3e2226d74d280177a4eb64f1db5259ba1ca7f51322b414d199d994c0acadba583fa1528f57da7fdbea17523c3c2659219d735b0b7add995d074a7cf3401512df7bfd1594045e78c9366cf0bca693eca3c0882fcb736eb318f74c6fd122b74db92262d933ea95ba45765f4d68d4cd2a46cf3ea603d4409a709fd0cae87abdc1e07b0f591f6534545647693ef6b8441ded679254c11037380a0b049642e6b5f7fa3a53a84303e24abc20df6537b41eefdadf9052bad0894f467c158b2088cc397bad26dd1951017b9278fbd0de090f424ad58d5f576050f3d319ad6426ba0a6bf3e5df032320b0e7e0c1eaa2662b8c9ef163715cf44c2580a1b36d2442582aa9ee05b0e6c88533c4fb75d3aa37d9244f70af8dbb12df6945baf175a00846f851eec8e30963b0b9adc6fdec86d1f4327138c10f699becd1e346aaf5a18ca4b9f377edae3d0754907b5f62b589cacb24aa60f5569b1e9d80bec0231aea82576494d66f9e31a010416229480db8579e7f9c967c52ca8344a3b2e7161b1779477b83a4740a22c27d1524223c9701d2a410ceae55da373c3a6a84de254f73c917868c59d95dbd07a89a4c41bdeed5dbb18505ba1eaae4d97470768306afdf30b5de51ccf87e49eed389fc3f9dd571b1e29140d248032d8715c178ca2e2b6c1d0efbb59b53972dcbba6ebb8aae1b0f375152bc63dd5a67eadb83bead97c73bbc5b3f9705cc1a83f95a7a15d79a522c7e825388707d63fccc08242b4d62cddc5a3f5a0be9e27efe2528bf26bbe47726cdea7366834929cc06745d57d31699b0e4fd6aa09718654cdade02a79ee69278633e3b80327ad2e732e24980907caaa989130fb7364f313df57607d47d4be7caee53990a1e7ebae03044412b01d35caebab19d9809f6ed2bb60eefd6149d2cd4b45b0fd6c901154546b0cc4119e89e15e2a3e19d3722e46fd89b1692951607debf04eff35268cc6d5c54a5dfe000fc56b5439a3c34a2df49cca808fcafbfd7435ec6c70b9b48ddbb5ab27170314d61d41ef71fbc54d5b17d279c092e920a79cdda050ddb9c320c24e27344f8ece7eed184579363 +result: fail +shared_secret: + +# Private key not reduced +private_key: e8e7e11a4f790185ab64776746d835f4f3b4b8458eece8cf8aed8b7ae974bb84c5a63f5faa7958f93dbfc65a3f57b9bb3129f8d939b7bec454b15eb39a1d3aa8f871f3d87d240693a3eed58747ea40fab0a52a3c1319e710476a393a90a89b3ca8ec955f3b42288bf3b35e9cad3fa1b8ea619485fa3c1d83931adc425e59db5e967ba96299065159fe56d41e89c797c1513d6c2903b1fa4639252aba2e23eb3ee74917faf69ab4ecfced5915688b9e73780d46ba643f5601895aa064d23ce760347bada029e6087a700963aef293a40a0b3e4df6d259ada687e367489a684b2fb86f2faef5e5976989b09f1931d3e753a6265aeb677c0fb3629329c28c2d61bf3edb3c156b46c5364df8b74cc95b416341af5d80488b895e2c4e7005901f5397249a3fc1747baf1c8105eb433227c959b6ac8776f9bcd9e1eb77e68abfbb33d8b6a1cbaf90e8ece40ee3013e4dc0a53b41dac824fae17e25852f2339a33934278cca7edd797c7b55af75ae8f7aec35ff88c21f4dad0ead5399c1976d49e8569efab3d5caf9bba4f9fe15154d2b35f1d1ff45aa89788687817afcac1963e5befb50eb77bcfa487be2547e993d6fd9f9fbab57cc7945e68018c57036dc93e7e2e3058a843aa36e98e23815a8485eea3d4d78e336b2bd26472be6b8bec382898b57e12d48e63eb335894ccffbf4eefddf9a46a34ddc67f9f73bf5d98a87c5dfcc1e5694e7b3dab7d67f287dc665a13bc58661b531385de404bfe1a3574a7a59667abdf1f8458c7baabe9e0ae9f308fcdbdfdc6cab93bcecfd322e8dfe0c451734f26a7ee89b56d958a9bd12d87446b7b8dbf65ac7e9d8ff1c9fb7f9f7ec1679da95c4b43cc5a11937b3538446298cc7b55b188d78026af29be58a96ad727928bd347d901b28d543d7823363d186c3e55a88e62d3969bdd6b6a12d4a25066303c495fdc9c9df947959b79497b8d5a42ffc71e96efb7f8c6cafd42b39b4539ecc87895d4ac6fa2437c9aa7754b54a48cb34c1071bd8fe2cb2edb974ba633cc6c5413a8dca5183e60ca43cf783f0851ae2e50fa0c94881d3d5deb503e8628c4e0477bb4b1b962c25d81b2662d65c4ee1099c001835df7e6ac6b9f4d48dfdd2d6eacc2487852ae4ef06c36c79f5f9e671439e765e8f72bdbce1651ccf6848975d57323f599de68dcdfd99f209c7888b7bbcf6b65c1d3fb5a8e9885a29c16446369fd5ee4155b9d518ed9c74c2eb2c545c17f7806d8616e8d0e3dadff95a655c7e89c494e2556a8fdea48e080eb4d1e5e75d0dd98c8dd42b5678fa1e64ec5fd31067814ebdade7bf6c606bbf8cf596947980793ac48f7abee21a8550fdd551e98ce039734dbdf8c8d8a3169c9922dbc27368dfd5cbd3a865d8e024eeef13a37f8dce3563eba7c9d0599acdd38ece729c4f2bc6b898b47622f5b559e7cbc87af6ae6ea0edaacd3aa638889f96a64e3dddb78edf347879c4c325ec69e2bcc7710b65b59fe489aab9ab7c8ff9e6b8bfec9d5d6e967b1c77f88f3cdadad3a70cd5703740dbb4f1c30b8ac1894ce58845ce9a73b34fec662f8ea0d64c68d3c7a6533837b6967ae3e39b7d9acd95e7ddb693ecb75ce3db51b7235b35cdb296038a140737bf77ba7af9ec9c59f00e6f62a2d357ac49dc744bca28c9ca4e3fa2dd8b456715907b1b42e748ea606be6e5efa021e383f5dd51f859be8e83b39a2bbdb9987a384f3b68a7e8c72365dd5b65d27deb497d79567f4ea106602b6b4c2223b1439d7195855d653ce3ccff93407539127e4f82bcafc0fe78d52bae8b9447cef9745a7be8f53bb697bce57516c3123c526073cd7aeb35511f8b1243b95f178705accb7efa2fdf9c5ff9db4a6d2ce71aa7b6232e51375796b93c8f39c8f62d66e69f69ea8b3964eb2f8de777e0698698f24ae47f4fd6a874ef5c46b7574beeb13b84331d4fc785ee813c4005df5c2a05e3c5a47bd4b5da381f9d7b0b80ae65e145356ec304751a8ca143a57c6c1830ab67e7e396fb5007dc745b33210bb73b44d154c6e97f24f3f9ccb88feca122ef4e7a7dddc1bd47a37beb76697fa06395ca8769763443695852923572566abf8c5c7097f6425beec7e1185b1db5ab75a9856217ae82d6ec82265e1825ef831b65a5b435dae57a8abfad55c3cc0207e0cdc55901069a2e773b4f240d6d4ac24ad53108968ce43555fd4bc4e3ba3df7a1541e0764c6a387de455a564203faa38457376a3170360b5303be69450acc7ffdf638a90c7cf4031719eb27fad55e4c901cb7dc5fb828ae50730609b80d5a92a89ef1963d836a16685881028759d06c55b9505e84b1aedc5e07d5294a084c1201c0109699b3009b2c67603c055949f400ad487167c1ce048b49a98a8740abba9291618f7c395d77b0649cbec1a2c0e2d25c86c70320e92be7595e103013c4974b7a3b70d8100d61b89a1ff43c30f48c137511375ba781e74bcbf322be908d09fac8991b4213db7a298c2c29455b3a5092ec8610c0325187434239a8b651f0a164240ca4e827f7bb7345848e01b50e34162a359c2ef8c8c9e6e9b7a18bc371a20d2f086865a83a2ba3545943068e173941e4875600183fb19bcf8242fb576f908a8d805cb0909054de4cb6b84b179478a0bae353d8b10ecd278a310466fc0a00c68784ef246f1f0847ccf72894549806c2c9650c9430b02fdd5cb0b3a9608bc85f02dc32933811d87322dc4993d3d13177b7440822c62fc7a31ea174159814c59bb209356c5dd20620b40d08169df1a12d913105225cbacd9c6054f1499d6204cee06206389b05057e579a9e294b43243ab92e136265470786b256f615cd3540c5ca675c4bf68f7da4760105367ad3c6d71a2a4b209296daba2768223aa30845d4ce7d67c2906156bbc4c24410176652765e294a9e22c58cb031ba06a11b5a8ae035a37db36ce1771999061d722cc99de03e96ec3216543ef74447dad96bfbd386b3154b35e08dcccc88791677053a0001dacd8eb6c34cab6eea355a10c517c45164e9eb4c714091bf129186a6b3bf33a86049671652ceade8b55ad17472b49513a79f2b867bf3157d5dbc929974147903ac69a6618f67781a450637eca5d0950948ca8f3d7c41983b8942b03d6a04842a09a4896ba3cd345e7d72a16ba3c63d95a1e85ac4fbf42efb588b088749e2f66bd6f06d56bb80a818c2c56c5d1d1b5580863d1ef10ae2a97f5f83be12491c7fd629d112823d728a2aec939e163436259367473ea0b63ed37bac19934da906a21e5355a3a2277519c8f53c96b4f1a8704b8d79666c1224819590048f5b9a8b767ffda0a20697caa075ac25b5546ae32eb2959947b11fdd384aea2692f7952266267aa559c8ef9168a04cc57fd8ae46674b75e785535a2b1c0c779a553f4ce5c1bf6094541363bbda825fec4b42035325a3a2b1a8135dcbcbf1122b8fa1a37e925440e95c2e4c0ee1f69318d04282c0bb5fc8616e99c9ace80d27a79b64c843b08cb9fc7a27d20309726cb50735cb3450be54d86860d7708b11a615dc662ecb229997004f9670e27898e78a4b3732b4ae5cc459f28e78741f9355a8ef9b394cab001c912124a01d27232f060ca523d378a5d42e0022bef2d2700d7c6c14da09736679b2a0c33c035b3f0513bdb5b46fdbbf3a5b80d65c4be918511bc8631e35aa5459793f858f364c96f2010d8849229acc89e8a50360551afc8c1d481a1c21ebb100079cf3d45ab4159371c49b16cca69fda67aed5881f300c5864c03a9391ab1080b92601f23a417a0563c0c14b16b0255c36529f74a103036466fa9290744eca08cb16b94f30340c49581becea5b64088fa7498e02b439981cb4b4ac29ec4684152830ed82864ca833481323fd8a8f66ca34bd4abcef70c15c926fb8b6323c609efea710dcb6548c06bc13d6bbb41b40caea5745c68cc550873bb467f9dc6b3e720ff4649aad171bc5527b0633cc2709932f0869a0702da790a305761f9d146c1b24005f6c1c808b6dd5d97c647232e843cd61e39894902b76624b73739e3a1bbe4fb1b4b2348c836592a2d31dc9884394628ebae00112643bcda9a01f34a8bfa828333b32e8063acc5344a4b36667691c55c50b2e3098bb4c7069846283b57fee61089654a8ba06797c57c2e7e9bf1404077b80928f5a1bb6c6a753bb8a95bc46748c32e0e1c8f7aac1e2573a47d104ff9567daa2c0732c501bb9ac1315a211c11593fc1a38a69651347b6aa1250f3895a7844e1de2ae45ec66214a8b41da464baa5fc50100c5073bdaf5b4a88c70450256b6d65413ab3ed302ccbee864c578733d40a796981a8c3849f465cacaec79898cceaac424fcd9b57b426caf306d165d1e0ba6573a638fd7df6b3f824f240e7e0eaeee7d7a093875cfb4f6a03bb7707d37c80474f92c12748b37f448186584df115ee97c195d45a81100ced48add211a5c937b8d6079d8e271af3f949edc61f70e60453aef20dea9 +ciphertext: 26d223332fb3dbce267a1f4f233b61afa2daa02cacafe508d152b22f30478e423e7a2343c857a7f8deebbb048c4ec22a4ba846eabef5785a4c81a3001a2cdb984efaef5f9e3ac845252540b62b861695266e264600a8a284c048e3194fe84ef07b16f87bbb0194a85369c985f3f84e7f12b38d6d48233c930589af674b23fb36eaac8f07c9f60c8df3cba30aec93a7fb646d25e2fe31fb6746399461f3abc0965ee8eec0f5c86dba92cc394bd66116e4fef46be8a645b5d842eb097c6b8532f8c3be8ba1b1efc0d8915a2a3f10544f9fd10e3f35f7306482bba8e9e1e9e51444a871a26ee894dd35bc67439ac7e5695a32bd21f7645273f8363b6926eeeca3e916d3467e2b5ae16149d7d7e008728fb7956402818dbd1c7244b7ad61332ebd9e1ecf6f70e964ce9fc3f3ba70e9d48caec8f4513e7b78733a265a254c999928204f4c581cdc5865da6fad0e9e9df36a5d4e3c45ad4bf985536c21bee5cfe4f30b81cd966e30b3f09de1adc14ba9c9d39cf970455f4a64ed3abdf672ceff6de1b50459c8c84ad3d1f7fd63e529b6aeda25ca573ff9ef6b21bbdd0b9870f2a420b7dbba0a22b2e5a74d7378b6e560b605765f433fcef08f46e8d3be9582233d66336416853442194136e59968a8a93ff47d767d577258572b70c7d64924eda5722b476ebc44bc4db3f47eccfe4e124525ebad251f94843f5a0b81cd8a6082d15b49598638c1c0a87b8a6ee78cb2930388dbde1923a762eaee2b217c5543dc4ff32c0a5bbe4cf8b17dc2f0f1e6999c77253a770d6f8e1b0930613a50da18856ee2186230ba3c2e7cb13f0773fc995e4ce177438380a38e454dfa3152f0544ea5200004e1b23df4264087bc75e63acfc806e248fa11f32d5adf8f8b53df4ba9e074f2114e8d40fbfd2eee1c6edde3d4847161224bf76ab6dae50c9d277ef3d756fcbcbf693c5eec17d3128efdf95626e0a8ff831cdbff506fcccad8c10fee500d12cb9cd05aec3785a5e9290f580b8d69b4379e143f3b06befc67420975f8937af5573e3b35ed5956fc974a1108f94c991b5f20623c7d484af686e00f6860331ce47a75588d7cd2d5b0656a34ff38b5a0ad9bf69e7168fe6fadc9037b443aa72d2c5467fcaca05ec9fd3a634b37ae7cb2fd82cc329fa0786cd612cd795b776ea96aa5a4c2738e6a9c4bbad68c291cad54c40d566f72c1e4342eba719b50404b48b66e784f068309a1bb52eba27c9069a75816e572b983ae94c3a3589e5619862c38e591c8c02e7dd836a67c5483dee238e881e74be53bdd36fe710dd42e999680db458d4adf6b1495c8647950e2a27d1f3c77542675a80b7fd0d74e69a79b508b09de328a517c1d6b870f40f3b0e6a2599eca98112e97a7b72df92c46010ef119ad9faeb2f854f8680b86f8e84dc87d8ef1b78b483585e2208c4dcc1059a5f2973540d20b17101a22339de1cbbd5ac4509cdd4e6af81b4eaacae4a0778b3e8d4dd9c586370e67a2e74dca8a249ed86f0e402b1bbe60bc05cccb0c02486fb66dcbb8456f2c5f0b38dc4590088b2128c5a7e32a3980007a139f66001a8886778bacc6992108b27331ac25c18d137cc5df933ae5a8fd37e301c512c0a4663a6e1b446589ea649fd840099c9c0f6af432924d9b92bd7af6e4f3bc602831d5c1ebd62b3075a6cc6c2191c09c3545a676f3fef6bc80def9b1803479691311744f9b03d965ef39d696df935b5fc7838cd32baa57d2b7ddcabe2f9138ce1f8110562f524383e3d70c51bf06c231e76c37a68cbe5aca313fabd677f846b7be2e5d646844d5138d012f1189a1b4a43d1e624c4d20a319976c8db0c41c44a5e50c982a3447cf0a0723f4e2fbac00eccc6335e24fd77c16b9b1dcc25778cab0b6b3bbae720b471bc817d778d422ad01933271140d8cc9afa066a01cbaddf93259044f9e4cb0980cb2a90ca03e81e7a9e7444ecd64c6d230c80d12ec95bf3930775bed59af076c78c77e692f5cabb3b788dcaf7115a155bbb60aa9dc0b648df006cd5cda9b12ee2b9ffc37c9edf086f0cc78a303aac777fb7a7383385af51c1e53152d746712bf714ca05186f752533a17859f2926bc9571ebe88af6f8150366f89bf0632fd31773153f57a274fd1b5e3ec61ee6a4a372d4e6208e5491dff3205b5d298afb1dc9f2bf850b2f9a4bcb0127edb08ad68bf851b2056d3b2bbae51f32faca7ccf5892bce2 +result: fail +shared_secret: + +# Private key not reduced +private_key: cd85bacc99669cbe9f6403f896599fa909499edb70077dae7eacc07c89b4659cb7c3bab323f3761728c79ec675162df092be33e3536a214fd93eff4531874109eed10194338b16475f63e031fdd73bdd8e168976af77f43eab3596b9975b3af16f8e46a529f577975884dfe646dcf0c036577de7d9edda6abd44989e6a8e07c555474b3d152e5777193308d56fca4aa7e2378a9408deaeb4788f4c87b6477193d7a5d0bb6c4a4d7ae0bff2e7d34ca1abd46dbe4a37ebfcbe88e288584f5c386a2e9c4fae79a107cf8f27c49ca35dea0a375664e8850718e4f96c9048993300065037fcd6e1e692a97835c129b06707cd501c6c5dfe646e8f365a4fcae6fed4a5bb71fd04f618485c170f838939f44a49b194c76cfe2bad0e7587022e4cc6c938aefdc8e58efe0dee48576961f3c6e3537a843bcd72449f6a92b3f4add5fb6525fc6a6e3acc6336341a72f81d4ad72c540df4dc4bbb8612ad3ce937e680aa77bc8f7d7b06faa44bca142cdce0aefb8b47fa3213dac978da2b64ce9307f7001d6ba184736d67ecfc89f82cdae3dd0aa3aece4683ca9bcd89b72d7cc280963f2d37925d57693b947017e6eb7176f6e45a5c6fbf95ba0963f2b9d86615697688383ee8775228afcd86dc2b9dc85d18c3fe553edd7e9926bbdce6f4dd690a53b356f6c7ef8925b469eaeac11209c7b01ad3f12dcc25176fadaafad2b38fd17bd4758a5d379630f3c9cc2b18f4eaa882fca6b1351eea0f3d35b2ffcb19346304ae7837d3db610ef0f8795593035c6d335496734c491552ebf4a38fbedab203b1403f5a4e0ff2b9dbb7ec0eab00097846ce335f6349cf5dc15e64a02e644e0598d7c9b764badc44c70fe845d8db704f64b1a7ce8fa65657d75d5319807a9b5bc18bed76ca64ec93ee114ceb8e79b5a10cdc33efef839a64bd3ef723ee664b9ac5c39a3dd0d8961d53c6dd697a6c896b664a6c7c5a70de6addf2745a64cac12447b70b1ab16395b71dbb810d763fb08e7d42149b9928ef9b9835c8e947cdffd0a5a5aa573b44555ff6b26d7cf58968b48f9de46d952a93d7f7fcb157c4affd6dd9ca76f8f15f7043ef35f6dec1a91bc17808f98bfc37b2f53077dcdc7d4e4e59f57e78d5357f447871579b555fe9871e6c6cdffbe94d80422c9b983794af7d304e7dee2dfdae2906e82a65f9e8a4a14a89b064a3b142c4c90f5feb59a48471e4852c749b9dc4867c677e52e44363b5e31eb5642c54e5f5248ae4358a3fccd1bfbf568c93f1b81ebc3199814a2b9e9be56e267bf639fa920eefd4dd4e518b19b8a9ecdb5bb3f90b46fe9d17edd62cd41b4a809fc9ff0ddfb25bf94f058de299ab530ef7d4dcb6ca6a6e3439c4c288e7a0643ca3ad4fed930a99586c85ae0597b2c56f9a97de7cbf60e05eba7b6fbed6859d7159b56c3eed282b7e1bf85d82cef590ddee2b9be5e48f9bafb34aa91d36d05531d288a0efda810646fda9878b61a4b3ab78e3f27ab65bdb48105686ea3594fab5c2d83aa867055a243d52a5d57c751d86814b7e4ca39b688669d4688cfeaff03dadfdc1d9831d36524763f8c99bca41a7b0f54a7795f8c2a409e03066f6e4f3eb983c9fcb0748aaa856630a67399b37a30fd5186388dcdb740f8b8b00dade328958a92ea9f5e9a26d39c60a37b2a513b79c37930aa9ff381dba1f5744720fe85d2a77721fa4f5444d37db793d87c1c1e8b4cb37bef4dd6f8785ab65d8bac8cd7cb50d3fd4a9933d4ee7e347664e9fa18f13798008d75dcd31aeb8b1a99bf4666d31c3b57d3689496427ed706ee059ffea64bfd83fdc37ef1848379ab86b7c53eedc941d26e74553966415439f6944393660c72d9e59a8e662387a1f8f7b768787b8b46b685b8bb3c7f175a367af89b5f3953f4a636f9bb89b845e866a335a7eb4f2f9e9c795af4372c4dfd277a5ba3af531a4703f6d827f66facf95a8193991c8f4417109c059f9ec4fccf89233b081adaa8a4b3e02b35cb6afe6a9c37509b9e726aedcf9ceed6e7b985ba5c0d95d73a99b324d0583c7f8c73a0e847f4ec4525d48a7556a0ddfd671155064a9f6514c96e3535ef6194a38cea3ebfdf3a895edfd0bbf0efba98198dc19fb9d4e7cff80b4b8cc4d31b91d6ab6ab33b6a37b3f8b5d143f44894ac86929b4373b30f6bb4396cee914905ebe26c856fcce2c623156e43efd0433c19858c986436150968132591db37eaff112c1383238c0767316c0077a00a4714e49d694d802a510dc960c525bf601384b96b90141b846dca14f34159db490479205b30800137819406bc6e14786dc4079e0481d098ca4a3f15f593135ca64cd7c32c46b45b3bdea0d7fd70dee467020ab49d4360355146d7f00337a1cb452357bd01074234b464a134abebc14f7557597bb057c4972d2f012b59a0b83328e88d76bd257ca5aca8912c2a9f90672903cbca16b9746e135108638c388676cd189452325dafb4ddfe435e13908b177a5fc883bc233679df34e40a09fe384654e6a857e49c5f62aaa30e123ed71a4d79a65bab40eb2ba7e1c497ea28c069ce9898f3789fb1b03cc07a5789569496a5a6b84966dc3b601577b07b01e2bd6afc315cbe74b03cbb51bb68920362474819a02e5c60db441a3e0a2a7299ab0913a92e3228986c18639ab0b952a01c77907e6a0b59625c01b1c406a4b339c10b0c8947fdaf5c14f6721be5c11e3a62a7065a78b9b1176e64ad075150b67aaf70820b9a62848378c374a3aeae6c63cf620d0927971c0188768991734754368bdebcac2d6b899e5ecc20922059641566b4996be455e90ba9aeca1a40ce8cbd68a6ac0cc708458169c624ef80a25ccc7c931d938687ca4a12290711b1e72fb3793a760a5c29942896853e26dd1606fb48c22b53506b4413e8f5b3c20b446dfeb586532a09ad602e5c54d5e0c0149ec3526758f174ba49134c980ac109e711ff658b7cdf0178b8c861a71c700e90b1ddb9265e9bfbc07a253726fc9c54419bcc39932555024af651a277302bf383cb67dd2a929037fb4109c69347876751f4f83955a4768fb94622390790796084215b6108c72e10217fc9134b7872ac6ea3d07b989bc70a23a826676718f31338c68a5b1f9ecba4b18bc47d3161419530b67041b3864686224d0171dbd248a48527950f2c4c857aac6f7a3394662afd84f79d5854ea77c26e7c57fd8a3aad0399ccba0ae4780ecd2481ae065e3597cf1868c327c14baf36d9711a3a8647d26ea52a4f9139ba835f380ce9cc599f6f11586f158f941520d143f75d00125a3806c56108de46c5ad093872ba5f927bb2a4a88e668c40af5b4fe9b17f80ca75ab58224ba1b485a9e1c3a6e82b814a1b23bb0d61ae14a9ca4e95d03746a564087f9c53a343ab7595572cf2542d7a9cc90060e6e99cb2d18880f082d3ac91fbe00c5ab141c6385895c626d9c143ccd94042a27509ff67c802098415a49bfe163ca01a20a45add4916aa512467db549e7b0c898656cb4265df3987998c8737f3c79bedba48b9c6b8967a9bfaa0b22e6858307977903001867282cd38a01798d3b71bed21459ed4c4ca6e185d55525baa096c1897c55789b9e19a6b303af32f493cee717bad70cedd67c3dd89bed6926a0f20b1798bb46d173452a31d7543530311734422f3cc9561d5360b665ad87a19da71a7270998b87d62d5e7b0a5ca969120b4c610848fdc6afc0e631fb2abc21096347221971a08b94b0ca4116c2f5a8188cd982f3e647ada99eeadb3ac25310dea91fa724cf3e1017c0c86c2a979791d30192bc3163ecaf73c819dcfc113535bb3a40b252c8bc269884cf7407fcda465c2aaeb19681dde0c99a3853a861ac81f77e1319afc6f67b2fe52dba6b38523147f4e589ee716172650c7cb44e0b760174691217093ed4421dd5a38f2ca2c41604c592366a89c4c70adba149ac63de1b5e21e78788f33d9e135890e61d69529dd9f658b340848623b17447998bacbf1c315b1fc5bdf8fc357e89448fe7a40217205c64961cd643ac6bc3486c5efc003011e80c4f4494cba123c2ac45f7d9019cbc7018669921fa76db3cb5436763b48a8046fa71d186b57c942f6529930d23737c49698c15404de20f8f357d5da523ee3a117fd8b69ab80335e388fcc661a0c8b583f94a8c7869e464a0544c84d160a828f1770d97be7bc43cdfa8566791727b7884e99a5d9fc549369a4ec5195ef1285860cb263085740cd466bc24835ae33bdd1499ce941f8041571ab638bcf896201cbf0b7324ec22c6d3c00f60ac6e6f0317efe14efb13440330b50cf86227fcc7bedac20f9364e2593adb7599b5142174d6b999c725f7d119814642f79de48f28d8b47d06bfec41fd06e2da9ae905005ad241ba55ab42a993df755120179b32e6faf885f946898d545245757425d719681b0b2ba24d49340f931cf87a3cc8aa3239d4c52ce4c95afdeff6efbfacac10d294edc0e7cf4535059bfdba +ciphertext: a047e3dce5d5e4c323b3b4076f1d4d188e291151696de7dff52f9e2391919e077021eedfdc8750cfc16d8bc28e56faf53ca3bf0a00f80ec7740d7d32cdef30faa00b1d074d70ec64a154101e9be710969bb91f168d25079d67a861664bd4605546296cc4e6e708aa043f2fb2dacf8071215f80c9c710a8b0e2dff75e42b767ceeb643208c909646f8880d83b5168c07fd36cf9502c3eb170e81f9df2686108e001bd15f11b7a2f99b1ec6ca9dd0206401df24160a975ae0ea179da5b3c9756ace0ce3e9b42f32045ecf6ff10ab387cffc357518560905ee8f31c5c577111d0c50b4a7c131aa18628cd1fb61ad7484b43310e252437cb20dcccb807a5777cba2404ff76e54f10638cc66a925eca98f9340c7839c12ed1dcb23d39b4f99b1f731be3cc5738ed2f115a0cad0cfa0ee7f9aeef3ca7485cd221a61848922642de62d248e18743b060c42ae934b0a5e7ebca43e266e0a58f7d951fc5696275807916d552a372eca27c535525933630f0a5f3369be348021a338e7074292115fc8a786ae736cf5203537088f97e68c78271424a67a1f2632c1539d34b7f90bb11051d9825e911b42056f60ad0d28cb70a4a20a13009887b8d12f8fb07dae59e2fc621d76be8f8b28c6d31b4116e81ade5f973f44e4c819ed374f45db6e68e264ce5d4973b666cc0214ad7a51b1e8fda04a41ff465f1603a427c92c01813fbf54bd5253c53022652f78a3f6b88331192f0cd8c1ba24958495c98fe29696391dfa56357607936b9889123c5222c92c09f9e69c6b2a0e6b389113924a1940e5d82ac13091e47b76970d0a06a682c5441fc20114f1246e69f486b3030d42bf0e5b8480304eb49e8b4c2f1c5d5a11f77d8a25a0ed106c665610c2a62df65026845ef99d2d43d7d3a503fbb702c4806255cb5f0a458c2673d9de010ed4e78dd8fd1af0bea91b8ef35246833117dc3517bdbd8e897ea83f6ba5442fdc41e661082157ed9be5da8d8f911f8982e976812f5d157c83f7dc9249c4e32a7b0c6b08c653a014caa4a8e9903027c7ae748edd7e026f7f3a934fd7b62799b4e45cb9b14c4b3fc95e3df7382462931335dc7e7beb1bd806077e1d36fb231c76659a85da15d87fdb582adae063b3d3584af6416a153272a2f27fe5205d827fa24693fd62848bd2eee681e8d539028a6c81c4753786c4b1c991bf6730bed5e14a9e4f34bc80b8b598fc75cc7466b986aa92f976c3322113ddd84913b3e1b364dcf01731d6537f56b2b4eaa45a4063d23e61dbcedbd00435b4ed3b5b79de52363e1d40f2aa6450493875c6ad3660bb9ad68d4aac0ca4e5797f6f1151223840feb154f9e6c749ad66b8f0a0bcac22859e1cf3eea7aab96db9aab863168d36958381c5c95884dfdb8e4fb69c5c1f079c7271e3687db754d2a8a9a9597ee633c18255326ef63a50ac58fcf188f729e718a959fc0320568d36ade385e67a148152d1ba4ff009b056ab843471bd94c7a832fb2b706cfaadbbbd8aa42de9fe7298e53b11d4056c9ed043bc514d3e7da9f7da6726f267d584cb185d777dc58ffb0e44141bd24ddbafd1509387e9bf9aa532f6dd5f1bc83b6fcbd4eee3e9ef49a692818b644209030d944208182a394c10aa61c1869c7824f028ffea498bcb87c0c6fc5df46447f3607b2fdcdcdd3ca9bf885792d418563f404c39acc8f7855599f0943fe507e5c02cc947762d3390ddab882c46a604278359655b399985cfb3aa434a04f0716d2d94ad8c9f5a5b0dc448c0f85751ead9f22ba0052810f66205cbc7d7b8440441a892bbe6487da07d482bce368372ffac7db844daec7d5364d650f70113f86346886c93b948985a4187226793ce3febe4372ec6394201011d6e66c342a304576f33ab5de2428bc4abe940dc78d90c3a4238f7f06189fb440ab3cf8fa36fe19a0b03a2c2a119d2ec5812b999a277be469bc9ad6614472ecf1a70ccde3a4dc5fe647574b4827b2aba6e1d65a0f37a696b9a73e0cf3a9cd3293e36369363d637fa22d484b3c9d451bf96d993402f442591079c0293275216ff5b46e4170b9459ae31a9a7f4397112f0f9e1c778b79520aad1245b611e920010e12ff14bcab2a090767803fb30478d813d4cde9858befa2930572c45dc2e1fbb117ce98e81734806d1106ff3d256cf58d7a3a6efddd9ca2b1d87de57113eaa7ff1e34ab7fb98514abe99a268c8d87307fbdc9 +result: fail +shared_secret: + +# Private key not reduced +private_key: 6b4bee9e6771d2b6946533c210a8bbfe297df569cdfc56b501c54ecaffedbac3ca24335438b7ec456842ce4653ec9b4ed5ba80ebe665b40597241fe3f58951104c7ca10ff6eb535fad8c5724189b49138c22f4478b19492403c2c41c45218da2625654beab411ee59f1f47feffdc5dd38fa5b4244a8d8adadf3d386a13a354de516ca38991948497a4ca83cb9f65f5aa1a6ac85dfa634263d68b2b43a1ac8c42fe56e0acaf4f05505edc57a1a6bb1a99dc15d35967b86e85fe6d2b1d56916c8f90db83b57f75b28ca3f0adbd4f18b9caa5b480f8d566cb3951e6d6887777c2c3bcc88640a7cec826ea51b169c8bc1ea7f52bd84c0df56f93990f6fac701efb89fbd25b5962e9a6bf36564ee9b483896bfecdd669952eabe9cab8820771e22e719a2f315de86780bef14e43f379caa11133a500af3dbba75c659e308fefd1c248e2db0a8d006c9ca9e7606c63f557c8555dcedd61a4f84c8ef75ca84eaac5de5057dfc9e8c2954b70ecd96dde69376176e8bb9eb1fa8583366d5c162972495c4846b46b693e477dc565885ec0169a5ba0c733863555f62c5c1bc5c83bcabbdcfe438617412bebbfb67d5623cf58a40ecaa76a4561099c3ae34ea5fde4f89431cfb957c6a930315b7a001955310caab13d76440594f7a66c1385637b79e35ae5ddf1934a1bc754eec983dcf351b306a14fba9ea5b6a416fba9b46a40c99b640048aed0e4ce7487e704a3b3a7d9d009c964e8bd55f4753bf16f349a368aec34f3bd7af78fdcb3dafdc81ef551a12ffa72175e76d5970fbaa44ff8399fec7498e59dcd685a6c4d38b3b5bf47dbbce204ad99b8945bd3afaa237af16a81db1ce5a906364e1733428bf8040539d32832cc5a7f0cfcf82ee9d2dfaadaf38ecf14256da8873317fa5f6f9e49a2d6ab544c97697683032455591c75eb3adbb4aa5eec1c3499b64b797f9b6cb7553f1653be4e81224cadce6fab80f5af7478b909a4ad9ececf97f6d8234b48b2d9b005a5ceb80ccafae85e432af58c77601dc3764833e77ea7dab5763b154447de89cb2c6cb11ef5e195f59977f983c26f9dfc74d026a8c36c9d9d4aaa9f9e0b64224da35d2a5fe503a07b9ddc62cb4bb7c6334c056501de4337dc984c7730fb37891ba737f2a65546bf943cdffa509934583fa1129bbe22e88b987aa1c8e339353f3006eac14f03a9970cafd6ec587d15544ed9950d5a851c63898c4bf33129fe0fd6f0937c30a5e8b56355319ccac8094ca137cf37941372b17ac5367aac78269658f4b40d04b33e84961733a353baa9d5f4b2dc69609ce6a00ee6af8de4f5d3bd4bca94e411473070d7a1f414fa8167cdcd1386356e9bd78c5c386eeb54b3857a897f170ad3de663854196418b4b23ee8d008b6af535bf8b20dd37dbb41ebcbb83c9cb0f018dd5e9c8e80a83d121add679c9b3eec7d4f94c9046832d947a622f7509e4eae899ed7f5fc7539dcd054ae365dfdd5ca06f8f8185cd1355d4ae65639ce8510b93eeb87642cdc87fdb858c4a997bded963f6b3a1318c206635289aaaf73a33cc7d76977e3570aaa98c515436ea39cde485342a4503da9eab2e374ef2ca8e32ec7194db8772ddaeecabd485f33a51ef2f293f19304dcf29ac1ff7ec1ebee767ea470f3e580089ac09cce737fa3449b4b9912dee41926e4599a8b8f1fd60517c57fae3baec5ac77b34b7bffec2c9646fb6b6f9a0a378786d509e3cd9b0fd1f8cab9daa5a4bd7a9c816b4fd7d3c0906af3482e5f5fddee40d6d5dee7debf57fb1ca4cb694f72dcc75fc17a3a151cd6b06eca0573ac03473c395bb35b34bdb0e3f97a5c472aae4345546124377897cee976cf6118d79970c761296dfd474b8828b3b01a9bbad637f8b8593a254734ae2d8f2a8fffaf4d9d7f178b4a0937e86542538fd1a7e4c14547b59a4d8552a5fcc76ef8533c4207bbd47287af05e9bc5ffdb110e4ce977660cec3adf16fa155cf4cc86494bf6bff3f24f4f42a7309edd57f14ec0785f8040e82295a67c284f2b06e80a31ede4cc478444b595dad65b8b5dde1c775174bbe870a874beb8649e8fc07a68341165c11abad1fb5b7beffbda26ee5441d815857ed94c3b59bde99c868bb68ffe0a724909b9452dfde68597f47977a70da79b3750c39f319b44198a5dcfd47cf6e8c212bacc3413ae8c00a2b78cc3b0c7958e349211bc64f036a70aa16067882330a36aa4cb183497c0251b2b942964a922c25525ee9e3834504a085540b36971963e09106fc14125659bae0c96e6663a479a381a915fda7b8a404061c90b814c3146a549b517a3735760244ea8959eb2d98bc37e2f7309e09749c4c689f6b640d28a7a0b8524fb9bc0b544eb219683be91e79baa327b5c0d2f2713b78341c9682f6941327959f853195aa36b919e07c1d5723d6528269b360984857df1636f2a80cf1383a775c230a9991f8602d074b5f0bb42c13ca1eaf4b3c7336a4fe61a8310c9c27f37454f9af3ff0bbb2232689c63ce4b7cbb880886b36681414902bf77a2623ae5f0c359c038f82433413d2cfa88373bbd17bf1d5503774939e916c415c8b929b5c2303234501ba642b75ef2823e42b71647014044a9450a55cedc0592da6554cf74693429d2d526d34851fda24a64450c785510111988982914fcba3addbd0963c3bce55f41b3cc71c0300ba32b02fac76158d673ab1ec7a23b30afd2a53d5aba3c3c87e0fa54408864037511dc3ec113153681d28c45b2a25e7256b6fa90df8b8ba8435b2f90727d4394eaf49981b397916c1642abb68f5006fbb2ba6c2c53b6dc5795a261ba674778ffa7e9daa65ac93366954710419c99fb21a46b029242158294107dfa28c53554aa3d79878b53506ea03846a9041664bab6056f7211a337910f77a2f37b993324927d64aa0d5085840475039c04acaf0ce5721b1f182b53e96928927961b8a04500118a453738c78b8a796ceebd960473b2fd2c9c825593ff4a95f3f659ef00b251449a253332171bbcb051699b100501f84bbc64c4e7f9c7db1190c4621664fb33c624910078155c1f2035d1755f7b10112e4521d58cb9c89575a3a2fa6caae5dba470a9b4d3fdc9b7ca6ac28e0570cc92647d382d04a5091d8a1ef749067848cda293a47d772372820f25245ff457580857eadc0bda0a059ecf1a3adfbc6d7e87184337e94231e8e3774c9854ef1c6b4c872bea6f939845942ff2732aed903a23b72cbb5122c43c8ed303ae0d33a7a704001890f0b378039ca271205d052fb594c526e7c761ad6b0cf14bb251225c7ff42b4b5f651ed55143ecc05cdb21962157e28d7be4fc4b5aebb6cfce5396fa51af1bc85fda50b00fa63ed800d60a5761dea715258bcf597a434e48b23202d8a415831c0417c6c43a659036df10772e796a2d70515939823575cb5c01d35155f7399bfe1b3ca9bfa47ebd69f5c8cc8879b87ae34a7dc32568817aa3f923df22c92be454e99d83023d3caa2e80e0ecb8818414b0241a6315ab20b63c422b6be8572b5e7f249fa3802fa647febc89c8ccc22583c144c191b91187257235d857b9bba3b13db06be10a35d712c540e7bcc62373d76e5828be049b6462d8da931f24a6827d314f5c0ad266a3529fa9b47cb6eec425b326ab0bfa032b6809d82c1cc3e2427787a413daa7d3976aaf83ac08d87b34da219a92a631784bce31cc66693c75aa58c7c87a9e3a926b5229a4f008b85090f351694f66743dae3a59a86299b43c20522cd82f96284623ee20b521794114d1459fdf70739558123f18ff8304730fbc63f198a2eb992e7115e07f509dc58b1e2a00c314714b5162334861ec20acac85664d14057d2788207c01a7ae383c93971d850102d60ac0d042c648c100ed660ef8a2cad375ae1a21b11998264e86ae0561e19d971689183968a98be064486b8abc3634021f770e2581b4383aa3c938bf3aca4aa2a337ec06647aa47428bc027339f2802b9f135820f3a8bea06846beac4c1a2702c502e50d338fb80a590a564f48a6606a10b51e839a4034f2b906ea34b4d3c875f1ff6bb57797b076638e4b576fe8c5a490806bfd178b4569a69626001c8a5fa1582bf4bb7bd586296f9ae74724d7b6c9c38d25273e114fed525ab008b887b9e5871172cc393938902914a3ace06a41cf92f6da963e4217f6b1363f7273cbf4a342865a761371f24285113e74f7a770079157c0ba0700e6bb9ca99ae10b83299ca9445b8024e450cb6152fceb79c0c433753c0b88b21c71bcb38c643ae5e16502fd14c0aa8939219005a15180446a166e74933f46f41a68675692e25816e7a227808764e20c98d33d6c3ef3801d21cb37d2872fe76749aeb09976580ccd4feadcea0b16f00970f92acb21c560501728ffd648a3b658ce84640d17ad1564189385fe895b25cd30d122a90decaa0583b908f1481d7cab000e33fa07de8dc9627a85e76fabb4428a3376e66300cf12a0787 +ciphertext: 7444dc5528743f695af09c910e1a574f43aba4282a54f050174a3d219c33694c05e6cffb95c7b43ac76e56e244b079759e8202b6425d6c3a124750fcd90eceb029bcfefd2d7ab513f5bb298aff940365f5064d68ce6c485b2f99c76cfe75917280d66c349b9d16eaad19b0814a8ee783e52ec7a964a66e2515dbfb50877f5fbd3781ba5593cd8ca22ce1531b4638c2624129c2a557764ca86fbf735cfeba58ce6b0bff7f039dae5a00f8faa86c463cb1176985ebfdf9aa6856d05b7b657760d5905a735e1cca3f033225da99a8fb631a6c710792ce7f83d8e4bdbd713c072f2e6ca08f80887c9631c325b8b853161843810f4a82e1cb49711e875a6328167170d796c365a6754bcb6a39237642a3a25121759523ef3224a74acd8c182e114a709552478c942adb7ba0133944490d7458fc4ef364b34fe1cc94f8215207a939c92921778ad986510247255b0def4baf40810ff5a148c46984f70b67608991b93125688af498f53a40a9e80424ef660c6cca5e7c3ff1024691f67659a31ec331e3b95a9a54f31c84257c12665e684cc49f4dfb13dafc414fbdd7148d9c9b21d84cc58eae523fa9b1b55aad27c95fb35696020fa7becad60973177788670c785a029567198a5240ece3e80133bd446080e29a749c7e6eef6eea00ee547428961353bb063a175426ca066ec2aa5c35c6ac6ba77a2b16974de8767d7ea028a83dc127f05a9ac0e46ab6784bfefc2a0e9d2db662ac0fa63403dfb787c63d57d1e3c51bba51233415af6ce6c3b6cfcfed555fee4a90f9368a5db2d9aa2a847efa6a25b198b69046314c5d43778ec30dcfe00c62e04c55051071de02976dda6a7f3c7495b98b62b0005850748d5b5e4d413f6bcf2f7a9095836790781d946b399b3dfa087ba6b02726e3a7dfbcb3b50e828b747a2eadd904a14a85dd136f074b76b17fee0d68e62591b8bcee55a3305ad469c28f6372e75c698ac8b5038c700e920fdaf2e02b8f87f91ba8b4b8ac1fa95513567a35ca4328649baa1fc68cf975f9ce53bca91f3d536f9d3dc85968fe18726009036403b9fec674a8aa4d3ada1396fecd59212e2dfdf7b185e5cd90e8749891f11a4ee5f515c7ee2f2d259e397be82ec63eae4935e9c43920c3563b98b17f1a29bd765da90a8cbbe902ef9b467c161dccae224f1b5f263cb6f5dd1ed070e045279f5114180169ea9f2c34a2d62535ea22ae6eeca384c9d9862d618d2accc856e2d5295709d4a66dda98588cbc1637e9dd5288129b92ba287833eff7353f57ae273fe0b664973058b88d1dfeea2c1a14485f61ec761169cb73d10b04dcbb39648f970ede927463f0ba35c6e5885c6257516d87a32e4e7e7a7ef58df4e03a5b8850e3113bc3c22de934b1c5a13c6ebc64d1c0adeb1d80851ca12adb496551b662bad4be6acb3059f5efb927f69b711bbd77429547ed21fb14d9c14e87f364fc7f5335ab0ed3312ea8670a92a58d42106f6969688ed106d2028c0b0393f2b2d4810d574eb76ca14062c7cf0fa284b393553de48b98a237679651535d1a8c20dc04676937a6a35ab0d90ad1ddd5f3056508d6e4dab52709a4bdc50ebad3c549973a278f920119e7731ea497d31428c96eadad8cb0f918e7dbd965287e7aaa60f6fed80d3ca2d4a0228893ddf8a36ec02354f02d7ab8f8490a6be91eff2f5d50013fbecaea945a7859296109eb200e3a406b96bad84846ad7fba8c519a25d224022b1b21d1b42ec28ebd8a280970027270ceada0a98107eecdc6bf3a63c5bd59d739d6024ee83d18abab1d27dfae98ec8c270caffb87904b2abe8aae05224ae346a4b1cab500aebce199c675792a4185ea761f1ae81b43dfc0530e6ec253cdbec633befa4f18b35c01ad3fc359e7ba70bd857f5afe83d6fba06578b6147a454e12bb9a559ef838163e906fdd089b5f4d302ab3c8449350243f48e09abdae9b4b499e709e03b34a2aae069a9011a73199c90e719b3f9993b256542c55d0bed6a7fd3e0e857bd7211b8303fe2d4c38a9755c546ea391783d960c1fce230bc59e3cf151acd24cdf85c785a6f27364567f200d18efe9bfd222a160924a16f198846d8636a44aa6f0c5027663c5aa6a76fbb6b077d2aa98c541109d82e4a8fb0d76f43af57a26a4d642396174d15dc9a10d15f01fad78b9ddb2c9709205f20c2ba1807608d25af4b0418bf2b657e2808efb341fccaa2d +result: fail +shared_secret: + +# Private key not reduced +private_key: 42cfe693eab3711e385259ee389e739eb8b3ba69a2c264fa85b4c536d840d4c9d800a7a6062b7c9809f1feceeba7cdf62a647dee2570f52fcce4b7673c5e670ced694083c23ffb380035f79c849a92de47ac85a3eee4c8acf5ec315bf1393dd9845bbc56c9a967a5bf26debd769d8ccd0a5b87fe4106998b27b4ea38c365130a420569975eae3bdb3d555385dbc5b9402bc38646857bb50a97d016749cf7394dc35ba1f69c18bd80a6a6e2045e4eb36fd189b846d9597d3e443b0178d28943bbff8db1d0e4a32306e42445faae686b1aeb914dd33745da83f955eedeee359a73da4c79b4e9aa7cbc464b1f49f3ea8e65508d922e06d5465740938a9484137077533f4f7c37941f306c7af6bbeed8cc16c59cc7f9fa6ca21ffbf3660eff3f3fc75b95cf930ebcdedfd46f93893eceee361d3303478f6a76ee4747c854696d70bddb47f3b18f3f469e3b93132f5b1a877eda6bff17699ef4bbb5054961e2a7c445f7dc1bccbe6613a4f43fb3800bf2565c809fd593e7076c42b9b891da451384fe45fc4e60934583f888f399b4a4bdd54bdc3639b73f756b94edb5401fa66212dfbf7d7e4f527c48854a73ead89940eeb3a96ed48aa638b2a5538848912f6672440f73e838f0044a6d6a6b4b80ea6a12baebecf8b64739fa2e3f8878dedd657d6de00a677f0399e30b8842633e2256e09b4d7466fd96a1e4b9f156d5387494e3f3cc803dde4398b2c234575f1ffbce0961b0a8686537cad6054a81fc83b6167c7a855d54e662aa29358cce92a19f5d01de5a4634453a494c96758aa687476a8be5085d45684b51a93ff5a66fc2d2cf8b36ccce25668ced9ccd0cc58522d36ebb7cd368f67104f6c8a34db976c59ef5b46c633f3cfe74bb95a55c8ee3b934253de20ea1193fcc91d685cece599eae7362763abc4a63a1ce3cbb3ef3b76b391e2d592c8799bf96d54203307d87dbc87696457962dfb39fa988a95463f6728e8f6d7438ccf3c044599486e6b781933a4579fe1fc79fad5a7d8fd8bde635ac05c631aded40f383b9e5aa69bf49f43d8ee45506d6ddbcd5ef9d5aecb6c971bb85c1ecbcb695810b7e3fbee75d7146fe5b67773235f8bc54a77b6a979ed7c48f9f70ada7824814957563585334998fd6ac4566bb22da8cb18a425bdab55e6ea1b94f7ab1c8e7e8853ef10fcf00389dc36a8e739c601bf9d7d749b4165ca166e6a42253c897b6e12d2994a0f492126e81081356ab447787d3c8d399a807d48860668dfa2aa8890ca8a81f8cd38cbff5eb5e6fc5a46d9d3eff075ab70a36b85958dcaffca927ff53c7f02744cf1155fbdee486d44b3920636bd7a6fc372f633324a2bb5b82fe4ff5a0d83b9ffa6b434be9b4aae1db3ae9a7a5587553a4832a4dd35ef502a575660bbdc1d9a23fc6ac2f7d47ee9941ed3b99e7a5ec81d6473b54d417ae83339e4d97b7c6897bb248876ad757c74d83950a5ec0d157f4d99caf73de7463edd6e5edd64d24d57a3ce488c79faf4cc08114c9eb2c6ea79ff0d64735cc06d4bab7e8bbee7d130457846de9e7e943a43347f7c3f53e85dbca07eed1fda63e9ec7deb97e281fd9aa4fa9512b635f5c704f93d64a9d9c7d2ed7986bcb7efea191366f80ec694c179bceadf9f62880c70d61637d78b2e3f7753ee69e45ae35f999184de59c0d5f50daf57ef3b1194b46daf4f5b9d67e179fc9f1c94da299a19aeab00f45c62449af52d8e6344d3e2bc77ed685deb92ce7365eea32a9bd469df9d32ce673c86db6eb6c74adf1bf25d8ea97b903ae4bbe298f686f58d936dc9f83d5d6eef4844fd6953f941ad759f3488d3a2c927793add8bbd8bceb6524f8b6f61d3c2abcd69d0c46f8d3e4d1c77a86b6d5db2a773aeb8b44ec8d12477970167ce70ab3a459f76a75403149f7e71f39e23c79bb36daacf4c7de036cdd5a55a45a8a7b898fd9cfd9c6f643b53dfb16187a8794fb34fd5750dda4198a7ecf7b46282b8344ebaad63ab34a75fc236fe562ffc74a68c485f4cf22735cce2d3a8265ad5fae73ae4b8fb0cb4ca979ce33557bb1ade0767acc4b98ef24fb94cc0ad18b1fde3cab56cba5c3c6c87d4bb6a2448a94c55bba200681d88878564bd5454ccc727ea42abcc5456494844e8bfaa6c3b1e568b35e962a75853b66348735f9d31b32fa1cf9f81037775c727839696adb115a704f10199031d9ba3d3433ecb50702068392ac97a2db354cb311dc39aaf9719c4f5a7c0401282ba4697ca8c70ebc4e179893135179cbf02820d6bb7263708b2339f777c242f4c34155ac2452cc21904580b381a964c281d750c15c42d8477e7708c45c61bbefc6928f191260409ac31a61400350e928a3b24c313a71020fd186f6e9afab17bb065132588c115c31ca8c630275b4baab7a98a778b97a680adb4611e6471683352b6928b7f0378105383b5f981923e800ff11ce6b64904ad3835c270cad0cb0a6e1b8879cbe152221e6e0994fea9bfeb9cf4f582e4f429170295a8419c984283d79b882bb420876588ae6403f207b3798d89ddc1bc90d7c91d7d07aeeb2bc0e491269281cfe93129c5283a03630542a1312ba5c896b969ac0aba14a289c0672b964a6cb1c4a11c3617ab30e4beb8b8864285087a15c574c833166c759741f493438a535918c0ab0e46926d195802a5cca3078fcf3770ea9644a69c730314f3d91b5e04150b670b23448008ee55f841c148a699387d919dcdc63a23966a43b2927fcaf47f2cb36935d65622214403256753ef3dcaf73d183c79384e7914bfe597363684355f25ac1042505361a04798e377791b5553c449927efdb48606a272c029a2da819a48749bd66a32091946a2a7a0649095da1193c1650aef47099456861519bc8701477bb5b01359c4772269735485b829835861496e437a063838a0419ae6877d0c493b5c3aa56777f3a727e0ee5825dc83ae9f4a51e612002748a5d1a21c1f870f5886b39a23e0cfa14b6151053580a8d8a306af04a7418c88bb5c398c6cd8f6529edfbcd601c049872c11381ab10c0267c0c8c2f614b16d92800dd0989fb2a23887ccf46401b864552105dc79bb0def57eb8b6974723a9164c2737abbdb793bfbf00a860a185d3a81a2257ca91e09f547c6acaf35ac5833fdd9a1f38a5b4f5e227b3fc692677766bb81f85e34de5b200dd077573f0796175140fa9c920522d68040518c5aa8f84b1ccacbe5be03e0a0789372c338a1b24b47a8bfb0941aaa8601a7937d5577fdab4a6d3094aee7c073a7632f417b63383bd035a351c3656b0a52c6e435d6d6699946585b6ea9e8568307c18c025a80e9074629dd70dae6bbdba296e0897c8ea895fc6b5b446d1000e4c880747798cd42c860c3bda63607b69a6c4fb88082593c1d965ac6cc71125cc56a72b60d1297605787819749d43be46431959ac29a01c3ebaab30d9a18c1c7998d9e29415ba0cd72c0d933086dcc1c20c537a6f296d88f29b5d2a21fe314999cb6037d539081120d60206eef1b1e1a498eb65268e94366cd8912d269b2d12a3f1b99572e6138bc29fa5520c8a6cb23f90859ea0a494c17fe7ac09beb658f260cbf3a5cdf9933ca1659f2a0551b881055406cc6b72baeaccbbc4b6964751afe07754da9a8b0b151f02972df2bc1465929c0be64e38e6c55ed237f182151d1a91e4253c42d05badb82cf3457e01cb59a96730b5007ae0fc37a3a322115c8560f0a2a1395a88464728c18a16bb249c168accc3165305a6584939105b594af244c2bb41405163e5bb50fde104e7dc604a592b9e22649c0686be9a8860794cee458a73796ed877b18e034f2f50b8441609cf53280f9c095fd67749871245a4c2bc9cb008ea3e44f424dbd56a7c734b1a322de366541c732fd5f74a0663a61f277301723579158ecd08bd014c5cfdb7610b61789d8b84da23a58e571a72981cf63cc49c59ccf045acbd3cbfed4571f6daaab9b23bf26091bc581cbe301674972ee4420e7e0740bed617a3c94c3ca3be7125c7d6242185163398458311937adad8462b0cb3d5900994f5906121c20f6731ac81a32a864ec383bd8310bd64a30f3d575d936426e721228b93c0c482c1be106f4ce41c5e0057116b30cbf44aa2a217b08b690ff891657188d3b6702ffa9d8ed7b62cf78f6831a13b410679e60fbf9a3221906b5885404a7326589681c1549b9459745455bae21ca799796065925ff980aaa68c206b17aad1cb9511201e53dca34d439167d55924018e7e513fa919a4573b5500a91c8ab61f17cb5bcc282939172217365ef694c98a440b09c883cccc114769b84ce736c5c9c52b050ea16a0e4b8c58465438b7aa11c2c98ecf4aea6284cd00c4229cb6fe2f90dbbc05eb935c85f1ca2afde0d54307949544b08a2ea8e2ff6fa677e3c2ba136c16dffd11094ad7f4ed4c5e7c11e3898a284ee2f8d320ac3cb0c52efdc753282f092bc39baf4a18783a48ea031a191865eb78 +ciphertext: 11c6b00acaa538f146d7c8dd2f0a44e1bab24875544ffbcb24857ceeae31d7f44bf05624541b6bdac79eea7d55d5063c65c5d003a8977ab872d53c77ebcb8d9d6ab8a17cd7e1969667c1600af54a52c49881fa22c15d8bc5131438b3165dfb158a2b8757539c2b5331f18aebcab7ad3e90c8207aebd1729905973272ac4d24bf86ad39a4b38801b449d202aa338332a0c5d284e5b62d1115eab7cfc5b415edae163c0374b7fa53c91a0eff51d32a2e76f21b208f1af7537de5fb4fcc35e770e84e75cf7547cbf23ebfafd7479897e8c30c9419689a267cd1931cdc7044fce50d9ad606f90f5f5096751ee2e2e7ef03bbaf9caf7481f2ff7432eb5b40f90d23453289e47db76a4219aea192d66c09dcbb9b37b5286f9c3d138fbc712b10c1b8d553c222e2b93ba268cdda88386fcec1a209f384ff6da9837f62aa0bac05cfe490492e96a7ed8377592252d04bac953f2ee24d48a0208364f5543a8389f19ccb7b54597fe03dd32f019bcca2c5307732b7658d04b0524e3656d0d5c71766ba0f11700070399d023842f4f7f90186016248ac1deb3d0c5c07e7116422b2ffb18a87575516143d6b12ec66571e6a0a3bcb0a482b45230901e17dc5db38347b7a7efb0d6adb9165dfc85376918cd78e93ff0c3702c1e37ad7a03430a5f076c9cb770736003991a558770cc06971dfbd61d52b1e46a89dff239c1d41879b4c80fbb74506cc7c5e48785cab3260b4962419e997b9c869d9006f7ca166f63d2876ff06c6316571c06e9042968419cbfdfad551087c824b0511487d2d696b25a8b11ce78b06e9bdeb48521c7afbfa4645209a7e74053e313b65902e11962febc482a093b10d24a0d1c13548332dfd7871524aa269b2d70303a277465d7a1cebcaa796398772b48473f5b6159994351abac4cced4d2203f7846c8802023e8939b197a16cf1c839494f9adcad03a4d3193d159bf09efb4588c9d9aa53890553d2cd5acf533922da4184ed80a17c1fa916e049a530e2fe330e470f8bd4feb429a537a006c6f759b1e98e73084a58dc05af1efc0fde60ca440a5ee8f094d10f52b64bd825f5c0ef8dc89463f13ed9c36ee30cfb72f2046ad58198cf374c2d039684debe17b34d9c82e73cd6483d5a9da9993eef118308f88285d8e99d132f5af9bfc6df2986c99b9dfb4b1f512a61f28a2ce8a948e292d027b5d9c320692332de93cfb794adbbad8747c598d401d2b7dde4f37434148268a36d4400e953bf61115de643552bfadd1ee65ebd13c87f2a5ff62a8e4622d3b093fffcddf5a897e2dfca8cd94aa1c2ed67595241b3b8a81a6ab46d950f17a4d5798a74294ffa1fc044736bd3050d586ec4c3a80ac2fad1f0260707d97dd3fcafea1c5653e51fec2b5e7e681b5168b2077b65d8935d2aa497f6abeababef6cfc250ae6281d6ca1cb61bcb26d62d40b01440049628c902e67c9514c7b2e6da7f46f4554ae4aab9bd2336548b3d325ef734855fd1543f714401c12e9c58e5f755201aa1ccee4ed0173dfa3aba864760104a671967c21ad30a7479bf513627e7cd21e91e7d0107822e9a1d4dbcece8ebeff33c0fcbf7a08c81a5f69c09abb48728167528d37368da4726f538696796ed01af351c4401649f0813344f8a04cdec44f0483bb69158dd89d3808af0bac71ee3e000a1bd7b0d47359c4896c99d1fdf6ebef54bf57b1631d62cabe02fd0c02515974ab09fa243364f36b2ead8add458c840f3e037a13bb678fa061cdeb302010838e5d92545fcf2310264ce64c00593e0462c62a0c1b35cb3baa017bafe03225c91f2d55ea4f6657fe8772bc8f438c83e4827f444ddbdb6abc05fdf282bae61353f239c72ca3027a573432e002745382b024bd7d3fcd7b6195929c24d3cbeb9edc90c9f61ea9da77f9d63a148d85d77569d721e6cb7415e75fe1377ba54b1e971f2683554a845fcd41567757a6ce6439ae3a4fbdf2695a654c4d83cb6fcca6251ff2e05923745ec6e746dc21ecf273906e4992e5c7f0c300e09422e0b15ef2f85789296afd12ae927161ba51c648a0fa8c56614d732a51667a5041c814c4ed7e4058b727b2e12ece2e6f3cfd43cffe4aca871b9b8eed8fea56eb64e2f30b0a99382d7bfbfc67fb4a571ad991919a07b7a67834bd31f23c0ade5276df2ead3c39f375c8402a83b4e2c405f405ff34b689b29a5c8de61577dd77503314cfce43660 +result: fail +shared_secret: + +# Private key not reduced +private_key: 79949cd3da852b8381b94853cdc981b7497187abd555d5b51d5ac57707a8d44dc2070c93962e4d3a7cdafbfda675f45f4fc779a744321957e570d43bb73caa4ca5d1f3bff000bedb60695b049b8543dbdaa94884bf5ff76588c4a31e908dc979a039fa9b3c891ddfc59e39bc11c7f5d66ccccdcc9d36ad3d390ad0656bafd8f9a7793ffc8fa753f4d78bb189fe8764fc8fb3b71043607d77672b1a6a7f7840eb953d339dcdbfb78ab1535aec0544bb6a6398466eb28eef9dfdec43dfaea90cf65d694bf5ddfb7e1cb6764bf74807b1802aae3a3a95e57c78002493faea627bf5bacb17a3b1085baea7802958c9bdb3983786f9b8c8c03057497bd542ea4c6b29cfcf0c03e7ce9fdc6cfcde2ceef1665cf52b0b570826ad1759d36333fd731b4f16b68291c78c3caf52002fdbd766f25cb8fb39efb65d9979bd2b7ea0c3dd8356ef6e19f19bffce1309cd99a87de718cd46f4dc0926d3cb67fe6de993e015ef84b55db3ea6c7a64b9c67bce6c3c6a0c0dfdecf39e94de49ea38b585d77bea7f6e662860dab465959588ca2f5303c8b4ed935dee4f72119674801d4f03ce7cdf45f0f2435ca0f963d9ab8755fe3b22fae57d1cd61ca65d8a363c8d4f78512888f07ee1619ce8bf8fe03df3f4cde4cf17ff6f6a94f1af6eaa867b3854d54e0163811a3843a7984e816af6a135ca44df49d17c9d93f8a742037db4d95b2fe33fa3eaddb12b7247d665f7488ba34ac500becdd1fef3e91fb6854739bfa740793bda5048d37c59991aab615f937caf9b89e4b9742a9fc5534939e20353c8573d9ee399280984b446a851868775a7a0db7f9d8c594a5f65e8f078ee22069327cee46e2fe3fab35b0d9eed990b529f7c7f7e1e645da77ca1fd81ad69f291cafa0e15a88093fed8fd2fc719d8366485a966fcc45888c23d4aefaf6e9ba961bbb53c89f79265a962f2d7fb39f9cb441e8a22abaa91e96fbffec42e6334aa258ceb739bb18af4afcfa8f59b972cc7910647cb1ca86031ea4b80c97308697cc404e5f7575154e5ece8c9bc9309c92c1e3da37ae915934a64cbb35825edc38e86c707eceb6d3c74fec5aba4a6db0e7f11be6053d77cc92751bdf8c5932db5eb574e205ea374f337d673f13d3756f9096b6ba4f1a79fa4820943576ac2a20f46207aafdeb8acf6dc32b9a6cab3feae21dab2a678a309ee38299aed957e51b5743d8eca936973f71fae5d5195304d268d87ba70e2cea9dfedfef5eafe077cc8a576b4347e6c41a8d8bb187c9ffcf37193fa0946d525b49d89c84f85dec10f1a7514077d155e5ea649e8a76577f1957cb0cc393f8ef2c097b51039869765342aeab810639800ded9e004d4226bfdf37c3d71f93c78763abb49bf23e7a1c4ae695986824a54aeda43b3f7dba478097cba0e9390187a6d9b8d9b684ad169ace7feb0fdc9e84fdbe5b0f7f4fa17b986576b3f5986a5fc603b466d242d94403bd571b8f864367dfdde7a53c3c74ae4ac0455af20abd5381e74312679ee5a8d1a43f6b80f46642631a479bbe51bb7368e549f7957747b87030ac019b454522b31cfa9cfcb85e8deb670bfb4b62cc964109c6773b885692be99259412f49b00c5ba719db71638e9e20984373175170f7a16df4fef887de55a6bb6d98748faade6ede335e2669764bc2754c7223b8a23986b5c7d49d3ea4a552a4f2a98c7b4efef05465b358aec8fc188eb0c4797f847602cba59b2da4a294fbc05a4dfac46b1469be6c434e6ffbd17ceecd216f47b684fedd1e41f9b54fa00a8f757887a5dd4d0fe892db899354e73442265251c3dcaa18496bbff8074f5f0eae93f4a3fbd057c8c8ad6ebbc3cf384fd5ddead4efab885e1f396b09c1df636dd5d5c7220ed4c94ae8b62f7ad0e3339d44b804b65a6d6f8f71fb5aba0da8aba9e7c94a51540a7b2f9badb405853ea8f3d30a80aba6e3556555b42734879f7427a4fe7a6caa1b7f7dfc69d89f64da2beb9802d9ef324668f78a9e453ec62566d3c6fe5642f6da0dd843f8fc6110fed2716333132ed5bedbbf161b77d0bbcba23f96967a68c14aa99a6765718ba3782b3835f7571187f12e0763a5cca4492b94ae59616f9b583924eaf31a774fd3ffeefda3409cf1115d948c24a722a48ca79e3b333d5e7b5e94b8ee87bc255f3618532075355227748594cc5ac52decbb390cb6a9b8f989c7048017f52231125d91c51ea6174ef4a37b7cb505b4a029f44079e14b957ffa2f8f325e7334bcfb5b023b4801f5f576333c54ef0440b4f7c8f6b3afec2524e31943fd6323d8f2300ba1b8095309e41c1ea6016de8f6ce4af647db19467e492c1cc12b5b5426b8339ea122473d1b84c603babba7b32534587145b360474a8483be8b06a6086bc5666a9b5af8b4eda929fb60606b85305c89cbd26a4be8a6b4866808fc2120649a60a3da2c64330a94dabbdc4cab2b956b2a5b7dc9e7cbdac88a71d5c06df3b192c5cc5dc6b7d10b07846026a3f5cf0e5b2c5d1c80bde5c3ca231ac908bdb7054190e77d54d40b9e7534dff0b36eb92652449aa4305967e57c9e358f8114544e0a5b8ff2c490c4a3267a405e38653449b617f26c6a3a74033ac483c074d5d0029d882f3507a7936845a6ab4d33bb4dda806759852488a06731222681326e9c6691077a35a7791734bc6b8e2511ab961bb1f17ee411ae86ebabf1b4968da61faf667b507450fff1a3392425457ba4625086ab1a871c8386982a322b82b7cf198ad639060eecc1c2e40bed7462ce4c6792764509e5cb9cc28b5a71a26d52658c0b5b951180f903bad708ca9bf7995e4595b8a009c614406c669468c1b4fa3740a9e91c64c03ce4a3adecd19a716a82530a508970cf16fca38aa10baf9810a8c3334c7b4a29904b7f72bea3e61505107e641c2be03ccd6c0546d2698c110caf2f194789c616ada3103b5c7f015991d473837e9451c9cbc9dd02333636bbbc825dd0da77a6731fbc3a831348cf1a3550166b72b4d0c59a5bb31de1829cc77c235b73bbdba937e5b45a456198b218b641be8c05ccdff9746bd64fd5a759a4886d3022cb63167aa3f37655a55e9acb9671262aeeb99f6d5618212419b1a41b7c260213b86ad9c995294b9e96e77ba66a40f9b5243bb38e6b7a7311d7c29c9272f98308a5f68c58cb111e33964b797a151588ee515fc0f032b054c7dd35ce5c734b8887465b0b4bb58c491f9953b1133561977f0c25401e6b577cc1cbd555bb8ba7760fb972a6b2344d2222c0fa575717501b3191ecc598bc93bd145800d9924c06c36d0360aab9678e93138d266572b305b7ea69a6ac8ca3ed647137090cec1227169754b49324f029776ad3c6c3e33e14170265296c1a7056282074a64690450555945a87ba57b54eb3595df82e81c1552f19c415c6cfdc0cb5fb32c3db060dcc208b6beac782668eddf9986e0a1bb5a0941a3745ee0b73ca0a5f98f5928bd7189ac6b20205555050846edb51a75573e9011f2d7738bb8c58bcd16795805f03a42aff1b854d3981002614b39b90c6f8bef32bc0cdc085466c8f55c7935b96157a624665404468783478d4b121d6b6a026818dc04515d0b98f9a1634977d3521316839253b7a847224c3819802d6b84482988122a7c87d069a13315fbaf56c9047c03641b4b008070bd885f1e3252f16918cf03af8634a8f7291e7b64df4e14feab909c10c7fbed446bdf2557d8a96e2cc17cbeb91515a2ff0b78bf0a21abcea847deb7311e2a782a567a6b1a57bf105a4513de2c378b1c0186909838a01abc000a829a9503d8c12f374c0d48a32c6f539a2ab28ad12bc49507e230c9a3881153113c1ddd446ab513608a567aea199624c98845a3adf90a5a89a3098091f207b46f28a5659f54c75a01347e18a11db75f9247749c03c7ccc6b9ed722da1b118d3c2760216c792b7f2f406397bc9a7f18343812a09e97a0f6c3c3b87179888a6d69b01b9d8c4b8cd215af5b76f7249747aba3537044f7991bc30854eb68c2f6f8b404257cfd6043a3a327d457651f0b600415a977d1cb30904bb853b4dc380ba4802b28f7c479fa7705b3a6cdf8a99ce2604af2670ab6a751236e08321d61d92a27412febca600fe30850f3c86c647746a65b1a9210adf34003a39c16ea69a626c73929567f1b001923b4f0726337f90124b74e500007ee8938cebb15e1f993e1ea0726d04a5e3b52579c625ef79ebf66485083ade6b1bbd0c9a953092fa80755f1471ff7f063a2f0013f429f155609142a685039c0aa540b3e410654803c7f281ce44b9cae5842f7347b29336b5125586d151117f3afe13669bcd7991068bdc68676a7f30708906db24033fc5822b8cbe33012f5e916c80ec7dfb3661e433431ccb796ba70c5a1ee85d63dc27bb236759e3a2af7553c03894124a6bdd3e3c87def1f1bf3e01fac4709aa9b393308641a9a4647f230201e1389624a296b55192a9819fcb19ab77c25f95445 +ciphertext: b102d7ab71da57485f6d6fdc4fc78c8bb17afb69c4f5f266e402c18a619367c1ed5a5b59825162633e1bf5ea82ed986c309361cae4def129f3226230b611ee9c81d19cb1dd83f8c762e3366cbc1ab58222f5889258cbcb1ab9b47886eed1c843b39aeb6ecdb1d1135756ba2d30acfd553ab558bfe6eab9a1596dba1d3265d711f6388a0bfaea56c87bab7e88fdd6ce8111241f7ac973ec4b689b88140f237cba5a2ed5270cccdf73b599e2740e2f05139bab15a6a0083e5edefbde36558a17dd50145d32e7573cdc74751cb15859d103baa9340c4b784d92170d230bb46a2b04a5a20bf6db3bf8b7be88b5a7823fd6c0ed36881c3e630e5dfea590e712ea81f7c242cd09c0f51f3c73772a92e8f95586b5c10abd53cc9a2bb2a90a6d083b7af422e36d0b1c6b97e3eac3036fcc4ee7402f003473bd10592914e007cb0f2921a219a5cb0cb3f756d5d28bf9280d55664c6b5436b3349ab07fc15ace7ec83831b1a54b5bcff901e47dbb49fc68d1deb5f3c254d1e4fa2f6ac962362df8277a274dbcd58ce920961a4b6d15e7edd85e5315bfe6233aab84bc73866f2d5e06744b855ee34667890dc35cd1c8bdaff4b159e4e6e5a3f53c333ef9ce8301512cb5df60928fe7d72a0e8723897c5ca57e6eddc4dca47084b7dc830b88862898f56f14f29ee286c9e65ca856431b16cbfcada1a53ca163e506d1ede9d42ec3c6fedb23de6da3c74a69eafef6bca75fa5bb33974633017f455403c6f09e9474c61e234edd8ce301fd0c53530b54a5007e2ae6e0b8afb7e23d045a974b0191a5640728170b344cdb4aba753dcc5f86292d1b3437cfcec6bf22471f8086098fd4e94ff9e6521e6a326684df5c8204c9405bc7b5ce79c9bece25a9da57e1ad7e076ada0372fab1948c0a9fe326b53c905015bc90873517f436d26761866666109b977b6f1c12aef71ddcfc35075dccc3863566aa39f1f568f7c70572d5b8e45e358be7473630327901407b53520b483efdf37ff810912529334e4a5d44c2cd568c2310c14a1236fcf82a8a1c0eea577d4609483334dcac7aaaa39bbf3491e3ce0f9a975dc15512c028932d9d83e1e6263ded536e2892605516d1b37aff7ea624f1db3588c6e82ae7d591cdaa1ce70b261e61541bff6f9ca6a426277dcd33431c119ed6e36fe8b1c5d04edee4850138fb0d968bff73cc6a8ff4ed1b081403680428b6033e3b01e1a197912666e881e630d3d675c3c8f3d2b3bfe80370dbb2c4a48917796f24eb89b50d0f8ed19be24c44f6c109bac0f8f93f8acd596412566e98104c0b68acc2142aa486249717b427128a0a16efb7ffe7c2cdc06af88fb4213188e610de29a116d792360f9eddd06fe560a948bf87511e5bc76fea7d5ea57d42f7dc1486c6cd79b90a0ab66a1a4f6c3e1ecb0fec8ed361c9f952efa6a09a635d18f1cc5b113e1646a348e34c1e3f3b0472d4a5c50fd1d9830d00a3455a25c73347196111b6999ee332d66a26087f7d3b36ca5c946157039dc06909acba5a9e458f7e487f36c2d41d9fae232208c7f345e8f6909b0de4932ba55614b6611e369de0beb2f9c574336fff0228665698069120edf08cfe00b10f13ebd12ae0c52e4de8b8e62b659fedf834d9d8f14a5d53ceb47f076472981f9a89c208399e583e86b73247a0a44ebd3bf84dbd397d0d66b86619cf5d60d5b9aca7b7f2b5ff84dcb833b757ee0b0a38d7262926f315a315b1eb0419146c242195f5b4e5f25dc8f4f4418b855694f9c1f6ce65c4d48d6d0a1800d3e494437180a1770a4d41f3f5651742336918ef49248762b537c948ecc94fcbe6663a749c0cc67eafe7631c183da90d0cfa69a0c4be70761538722a6d45e4ce53fc31c78e15e5a5bb62f73c802cd8b1d102fb27ae9403fbd2fc7fabf5a59c5054dd699d49fa873aabc070c33045e084ed1b7f863882bd12bc874e9ecb080c00b47a4b322be1793c06672b11238085df22202ac1eed8d139c83ca5cec9887fd9f2f7e7da073d42f4ba5cb9400be47cf30aff2c60f1b38ff13e4e2c95a233a3a6c295767c3e59f86b895850b44eea221acef869ebfed4689cffd6d33f88f62ea125d00c990e505bd984985565093075bd4d5eb0beb8b6a0fa5e378d2a9ea5453dabab99657a74472750574cf1782fa3369eaa34daadb6d986df2e9848b4b4e24350ff61e92b1237fb5714c1b2003219b849c70624a1 +result: fail +shared_secret: + +# Private key not reduced +private_key: 01ac7584aed1854fafbf29af226cac76c6bcc3ff56e0454802a968d79b90ebf3f52fc57781a5fa00ff83ec0c7b11ec71a6868963335826dddcedd8d89e9ffe857d978d74c75806654ed5bf178ab7f1a658441bdd28996b50df3cc51d4f811882a21f9fbfacbd29bbff278ca869cad722544f0d28c87afdb16565f5169a723a09bf15cab7d4aece845f94ae77c3d55c7537478660cb696025cb0db431fb4f349ef5f66d5c41d92c64544a6a79e9d99623b51329d947bf4bb37d7259eb40ad59510496bd4eac68baace4058665a465578e2bcf28068f54b47c957a7a1e2dd4649bf333bee3c86bd262fe474718c95b95553e083b50b69d455764c77e8fc286348c187fb0f8cdbc8a7c37db679ff4ed853769edcd3063baedbc2e5f045ad25ce98767e7a52fbcb44a9c67b65f9e3f9b995374de525471511336d993b6e84ebd9e8cc943bef1a0ef3835384ac0f990f1646e487aae455d65cc0bedee5790342b4d9594687bd53b872bfef34c6199a4d93f368049a6a484ddd7bb1e5af85c9770af87888d5be0ce58f64b50de04ab3c8fba0276f1ae36fd25c4bef55776fe7ccfb165f4130e71e806bd4143d0089490d233c010efd78373de2bbc5a662ad700dde182cd559ed5712e0949c82dcf2b15b77634db7535b76a237e37a86b81f6b59d54e8c4bdd62416655aee80e18acb91157c716cd03074d522eaa523d76f074ae279b570eb08b14bb697c93345c3da33b6d65f5ba668c80477141cf2a577d0feaabd7309d337c54754f377695b83a7d5ba8ea4cd9934cc83a3c7abecb928eecb1ed4d5b58a7c4b1edd3effa9b49cf13d0b63dfdbe5347dfd276e4c08995c561a3bdb4933a6ca3defe340e53af0e3894e8bb95657e8ae363b928b3648ec266193d44c11cafe48ef656d54c3a13558510c9a739c7f857b586f13a5efcc403ad347eec8623a3b41f8447302eebb512766ec8d3fc156dd0598dd837fc4b39ad3895cff42bec4f08a416cfd6b35a5d70e98576823fbed0dc05f5ccfefca9a195ec9b52dd11015ec9787f9b7d3446eebfec2edf821de89fc6476b6aba6e19df1e61ddfe90fde8c48b75daa6d8eefc0456345caf6d309589baacf89c6dc664328b500ffd610a5b2b05ed53f2ec8b58c7872ca332a8b6d12e75f739a6bfda88e8579dcb35c5953cea239dfb82cbdf16a44a9c1d346188ccd3365b0f0e66007c6d6e04ba1d9cfc08cb6a901f491ae6c44434e7a86da9d715e812066a652ccc179cdbe52c3d4dfa4b6092b8d5e8486d59e8321b6537f883661cb8ea4596c804c6534d4d404f9928423d9f37fcb61ba90d7a439de2d4d9d7369533d87fa38e8dd56a7132f7d970df7f10cee4a4bf72475beb2cda398189fd49fb0112ccaec57d4b7983c10da4b1735ad78cbab8144b486ffb721193b1a9654eb734dfd2b42b60d78db163b68ce92f014becf74847bf47f19e5a70eb6b28b7e7ca908a944ac6575f43d048950016b69bfb86e22fde2e15435ce0ce2e5b6813ad37942bb64685fb82ef9c76f99a77b17d7a8338a7528c01a8eb2b19cc64cefade4e384aec67774aefe0dc9c8c5d431c099abc663bec1f640515e7acfb8584333e69ca4ed1dba6c0be940df049e7bdaae4416e4e9c389a68e7e558ddb181da24477e46e1f4a12c9dfcd18a964a8ca0b8883ab26916ec339d49e33981570976d83dbea80397e6d6a574a048ed477bc7776f7338c435c50ff7ea3c4fc3167d0d327757c9fe11759502649fe8526ae12d5eb2785f499dcd2fadaf68594bedfd3637d78abe703b4a47564f7d78f887f6e6ab45e814493e91d3aa0255c26cabdd24fe20565787856dafd0d5bba5f482d77ff8f9c419638fd5568d85857a83bd43ca768d5557898d49a9afb4e4d6d2ab3165d6cb2879ff86f8982588b63ffa429ffe516c47757e36a1dfdf36daad74ddf928c043066ca3a3358b6d8065d8ac8458ce374ad7ec0f6c6415faa870b86dadfde6690dd9f00edf650dc75b436f28d23b57a2d4843dcda2d9e70b1155d7e445f93788308c3e6b90bfd3b3c6ee8adf6eb06e2505bc91a476baaf65bccf860921eddd14b7457efa2ae9bdcf7e655ff35e515f6627f0eb1279bb0ed74dd266c4b97986480be7c09dce8402e70e9d8709f537cb6e7911ddcaf969c438c55623b89b0387d8303a595bc577a703b4201253367762bdc7a8d14e60784e5bf04ac62f5cba8327c781122427a83800c9b342792ad6e93bdca2491720894dde616a9a9674e771439b8704ea57d70e9095e05a03f3155c3007b1ae0467b7c7bcfd67a5dc679c8f6ba53b44c110560359c65ef6425f667b5ebf967497119fc3b0bd0600c93fa269f349bec1397c4b23bd851a0824b80b664070622860aeb98f2b2c9349c8e0cc824f5b0386348a77857c277496cf10046dfd59765dc9d00b013c3002060737e668cb6440aaed4f3220f789826b579359a3338b91f6584b27dfa7324f61859370795568de4cb39c4b1b015fb693f42c09e981c7c5658d1cab448a947f3a0caa999625131c9118258ab7635d78caeb86ac5c100b30a57216f586901d1863e27262ebc2e3ffc09ac4b6ae45c968fa81aac089a04e7393409799e853499888dcdb29690c12a7e512891421f111a2189cabc1d00a2fb9878c0057144bcca25c9a3f1a2c3b92c61261a3557177628a252347355bee55dcec7be730639fac28e0536c0636bbadbe97674d83b6c209442b34e37d9a43d508e849b3c21369149a7270e56646d984effa143c87777083bc54270b146291d8b4cbafc6ab7e72a871469abf3018ecdbc0753b94ba98140e4956c80913efffb22ad687921560055f466b1744e9bc851e12648899b7665a18a71130c1e4a47c26cc8f1a4972512186fb89a740cbebc6553ac3c088b01b21bd9c47cd5578cc58fc4697a0c756e7f860f91086aefb4cd02d184d294acf1f2872191851f585d96d3b98a755bdce648e8d7ab5e8bbbe8ba0b752973fab007e5390bcb6ab750f8aab5c907042ab8f49acdc47271d6b2a2ee148f13518243809fb5651f6da4379225bd864597aa65343b21b8f8753ab2994d981961cea24b7f780643b5674520b7fd11793b1a4ff110aac7516c1861ad54296b917c72e281692797af7a594e50c35d958436816036d13348f81851bc5332f6e1b55aa575af0c0035432b10abc89ca5cf19170d9537c413d1c7674992467323ded94c4c6b694558cd3ed45447bc5fd3979a68427916a9297904b02d48918d914ad9e88c99b5c28a6ac037248be9d3054adcb0f3746acc2c0a6711cbb1401c6d08d07a947d3bc35eb7b477ce19068fcc744772a126f98789d349fb7c58d9c91cb1ec4830ca54e2e44dcd27b45c48ae07e84c045487b2252178075cda577b26704803a94f9b07acc6e815a75696fc927c1cac2c5be290855247a4546288a383c15b05714c1eef845e9bd70ef5d3284d5800df8ab0a6522372893618d6a28a922152b1adc2e93f60813025d2b15667947788b93ddc34f05374c9997a0ab8b72023ce47a50c86ba00c86a37e33b7516437a23d37d6dab5197a88e823a5129d656af31b755a89c4df21b520b3cbda5581200c9695b497ac2b0f582a42ba28b537a7024d30c127907bcc1667547b79ae655b4143723dca5ec494d851b3e3eb763f4809cb045ca69407627cb49aa59099b050c26151b4d89cc55e762c1e358f1679b7f30a8cdc531b80580beb1b8495487d2d0ac3a9a240ac1acc457b53f6aa6a580b79d9cb953240e9bf90e54644253dbc79b2b3028e26ac8641042f7715d97190e64ca4e13624530a882bc53b2c724f68511021641ce277d0ae32d329b9ff554502ce25a294a3829c770e9565512d52f08211b7fa583ca675491533d14813ddbb96ba4f05fd9b95cca052b7cf098000882be1c2ad9865e4b9b0834189f91d5444791a561ec7baae5c82b09893a900920d6bf6df1391cf1a2506acb25d79f6d441a17bc5eb4d133f5059ae52565014939aaf208882631a531582b486bbd72850a0724dd52a225c40fa2a33f312c16a426a3162993cb7370d23c300e2a5d2a70102e9aaee23b715c11860386c4be5080283a4727954f2c5197e6125bc2c28757a63d46c0b322299e5f483edb10caef28c44cdcca5a9bc9505199e7da28286815757a63ff83c7149bc0152a674404b3c2c06949950f7b073f537728514b20c676c53176002a8c7af2865ebcfa57f1226fada60eeae67fa5417ea4b863d82c3871c4269974bb76e3338328c00530122e38c138e42df370cb51830980f9a6b4829af71a7149a28379a251530306d0719d0d6794f89750ce06c27a913832a9595b9a9c1728bbdc4515cf1afe1dcac211a3135eeecae628aac9538ef2fa7dac989ebf18207def1330f4828e22a13ca5031217a3d8e6f8ed708a7026e1a96d8ebc4fd2f54b5051eac9d531a532770837a854b4f5531f6e0c8d6c10183b30d3435498c2dd142951 +ciphertext: fa50afdd558e08fa0991d99c7420f9788265d682145abdf4d579799783c509f63c6bb3bd9fff32fdcd0aa4528f7461154bb30fd2bf34d5af56d3e097e64330db512bd8fa8912cb54e2af9998e625270a63feb2483b0bcce294384e0d213360db0b6f9968c61f23fec7e417795bff16d8ffd89ea6a4f08f9c9eb49f95094b1219c1388efa157a885c12ad226d93d2e1df960b113e43f8c95e478f30d65a59ff9e6dd70fbb5cbbc523c5070557c7d268201c974ff1b28ba585e95b8e6bef88fa0319c99d8d18bc5f1363eb26fa36aa0619ba7a73d023acff3dabb02358e16f271f5d5034b15480b15d8e108bd2ce74b3e6cae83d683fd5ab321f30eba9aa098a28523f2d91defa57ad07d2fe89330b4ba2f95b7823fbf6c920c38f001cbef83d27330a0d646cf8705b3a3b44ccdcf7d16af8b0e227fbb8fee4cae2ca5a69acfb01a5ada1ebff06b58199e4efd713bd915be7cc1216c7510fd6f1400c46e6805b8c812090e47828fdc0565b1a4b1be10101722d788658669998ee3fe6b019c84cb8620ec0678c03e44bd67218312924355e61bb71b7398970cdbb0017da227b68f7c2861f19edc80a8c4f6fd2f6770f3049ad7982ca5ff8920c934d6ba6bfc5114d44517b9d49ae2e21b4545ac386dab5018a04d32e11df835e6d13ba7904fa269049b5b54db5e47b9db426b6b0bbe7a1109c3c968d3d1810c94154e3ba163f3865039e43f74b925ad9e3a847da0bc21d8ddb3e928e5107b68fc0b317a33777315f0ba2b00c202ce78797fd7f95d3712e70bf742c9e8343a6d00f24c922f0179399d16f7cecc79ec8930c8c0226bc057633cbe5829880ea52513d7adb29d330819151c1ad81be030e4e0f48b732efdd315657ca4ddb8018b79ecd5e13bfbd1e1357bc33324cbb95052da6d7570de804646eefb932f39e3b694da67731c96531e9a080ac0ed2cea4dbef51372f4c2b4810cb95e157ceeb06dde752b4786d837af8e1dc2741f0816be444bffd29943c535a15bf38a33375a5ba97636dea4c93883fe772a0c459aee9fd452e115278feccf1b07887143c5c6d5d22a4fda4563b178b795a3d686b2bccc04455fbae584f9d0ab687e6cdc32c849e8b7bd0826d9ad7fa94f95a788c5900e9af7c6d9d36763d76841e186434cab559f8347c6b5ae3a12f995df15be97d8e7dc52c1c0e51677c0aea08ce2cfd8e3b14c970fb1e0e48c139c41aaac31796ae220a19c2e7ce341c2d2ee6555988ca1996834197bee7132221e2864404c662df7e1c942b516c7339ddd143e48899b5b3bba4975d049816978e9fcdf84f76f46482fec4444cb65c97946c8eafbca4ac386fca82879e3ce2d3592bf18357b98335cd411b9bb60a26ccabc081726610d9d30bf03cf95b9976672cc61cf34930acf1725fc4ea57e503c42d2bd4aa110e5a636c34d5a26e2cbb91ec68ccb10bed5f16a685dda63083a786f2ed583873a7983739f19824772e1ef8a95fdd9b30cf4fd92c33abefede7d5c7ab5bc723c800696a6067958b3f33eb785ea33fb7ef1c1c79cb69b1d78d34d29a4f2e938140c306b3061d9d6b342560cae88a0579136f7322e9cfa01c57c7895637afcbe3509c57277a5035790085bfa881a78ee06f34e9d7ab771d1337b4d5804f09caa90f61c1bb0fba34b353592fe1763786db69ac381483b48088c2a29fa7144b81948a9128bd569a35e83871af70dace9bca084e6933c350703ab4be1047f6a583a509a8b6b42279b416fd74564b8143498a639d4ba9e3ab0a7d0ccdfc4066b3986aa18d0cafac9a6bdbd49762e351d7fbf5f75eae5a4f8e9a68d1ee21d1694c3a9011f9baefab8dd4479a0e76ddacf3adee7d9764c0078b0b1d720be9a0462c96046a6096cb00877afb8a360f221d25ed5dc148925be426f2bcc99dcd9a6cee6ff4f5db923d0ebcd312957be9d9d1c3ac7073b15316d46b8490cc131ab6bf7e32109af1f33edc9eeb14a124f9179e34a1e8ccf8805263d57cba6212895a3f89212c3ae2dca1616de55c3978cc0e550a06cb0f257205f99447aca459405e0e5b1575f48d589a90651cec6d9e36bf0374ecc6825947945d11c3c770ed4e950d7ffb789f9630286335276b6187775eb92c8b2b009d98fe4bf744c4b24b6dcc920101f4a4e190ec599535b3e0ae28b7169e2ac190b27ba5823103a61fd403776c0c9f9739454e9b6ec20dc26cef817f1780 +result: fail +shared_secret: + +# Private key not reduced +private_key: e747a3e56b5da1fcdb2859be85084ecfc6d144b5ad600a4bd503efe866b72ceee0f72ee6541f4f695b75dbca4a5aea5c18cf37d3e5748d94f8300afd87454960bb6652f5b0108332f04df4a2346e5c9ab71d4466331cf761f7cbfa29bfbc5e931a7db3a3aee79b1e39a1ef3e46c6fdac796eaad3fb4225c7bba9638fd4f8d3d4b691f5f63c3c586d8abb56b3e3bdc69dff3f3bfa237f28bd46967cd7491f8ea32c9f0b44d15e6c3bc8578dee1465f63c92e3ee97e5efab2a76a9a41bb57b97903808472255b2f98bb24fdb4e8657ca5fddcdd176931c934b33ccd8f97646f6e7ab9ac565b8cd4f27eefc452f8e378f4838c84b2e0bdc5dc6e26b1b546155f1c55455aebfd02203b12954652c84b3ed36e63c7dc8cd5c76986d75c03f3d1f7984e2ccba310af7fbf8fa61895504abb81d76dda8943bf7cf9f16c7fe59965813dcf18a8635390d44d40bcbcc7f8d9c37c375a975e619524e5ce0d7a73fd8d4d0694ac396b384699bae099cd7ba1483c834aeb40ef32d753758f34590afb579f3a157dda27554a27c9e92ea97fad9a83d138aeef1f3445458761348ab704da0b92fef25f56fd9e7cb583e8169768b46e7ec7d4e914de73838fc4adbeacf5f7778adc5cef5764f41b8b5b1eeaaaa594eae08b84f2bffa8caa94eb46e2468b09093ff9afcb4b543a61a5b572eefb79967c03d97cdfb6cdcde5e66de2fef8e1552780667377783c8ee4f23bcfa4f2a3de89735caed95dafbc72fa8351c05f13b7c9e96ebff5926320d8aba5a2750ec76684073e9871ed1d86b92d40bd1f0fc75d8e3b344573d70449fa2fba847d399eea8f540ba92a8149c24d4e1d5ae3154ca92ab5a8a2cef942d45370a1a56e3ab715dcb7864b9956f2aceeec963d34cc3ea33cc9af7d0b59cd9541eeadcad8c115574a377a71bfcd17c79c12ca7a9362c6e4049edbf3ac98746f569dc34d21ad7b043d6cf7577cea4d78f0ef3207bc05e55a0d1d6368ef85874caf1a019d825d7f0467a891f2ed6a5dff9456d86bd7e937904b53488de41bd7d36175c81d8f87dac48fe7fc37946b98a9ca8155ded1dcb5a243cad534d543234c00dce46b9ebbcc0dc57f5f963255366e54f4cc595a1f8ffb9a0667930ed835e97390c97a43b5fc39676af8cef393cb8fd64039e6ae6a6ffd5b5839e5b23ebef308ceb18d9d086263a9ea5a87d5470b1584c10ff72e6cc3e1c3b59b895b048db369bca70a4eff26348322636fa7f15b96ec3e6dd7fe78b5faf191da7fd35767a2fec78083acb8ca1f0f6c395acf35ee9d1e32366364d87162c3c878f8c7b6b86892fdeba05e0560ee2950ba79093a3c30f9deeada007b73241e3d024d897bb66a0653386bdb344d10c90e53f49d10ad948fdca918a414484656d5cdc246350be57f2b43343a2f3e0ec985476fb754ca3f56a93f1d9369fc63e495b263a441cedb25b975d0a74d6b6cae1686a63b64a20edc51433ce5b886c34d9a44afc76143f45b40fa2784d3ebd46889e4b845866e5d658fa4b0b5d528790e40538d57ef646a690f0e7a451fcaff648583fc7d25fbfd3864dacaddfb30429a550c980257e88cea490e535ffdd0481d0b9837ce69e03d4798cdbcb25867b9e794ddc945d96489625bae6ae4e50a925aacd254a6af3d986aad1829ec9e6f9411a6b375bcc9cf829f5c57b99bec9f921ab932aa87c3e68c50017df5568757b2b8e86035f717b88b3735ae76fadd2334184e6cbd2bbd26b8a9d420effb42fafc154a0b21330ca5ea4bf5c54959a515896adeeb73c42d94218d4621addece056bf78fb88902ba686b440c20f6bfda645571da1fb0d8d45cf8bf22796204850f1fef41098e6e39b3c55c7ccee889effe88588bda12a6cdb2b4de52e98c612c6eb96cdca8fb3b203dc850ffc7f876f75c7c851b67333f2c37a6b5b999b686fd6ec67ba67c9b1aede95f84a5e9a826e16e723afd6d94b98927c418cea516604444978c24dbbe9f0c63536076e9a0841873338767b3d935cb527cd4c2ac5d15fbaaee2b5f3cc07e64353b5282c7d9af78f55a73857ac5a71ad3a584a8f1b0bb762f9c7265b40404888527de6f78d8bb3b3b7d0553e2877726ea63312f3afd494b5c1c6dfc4b6bb6c8a68fddea6cfbb9266bedfa4c4bb76b8b47d0bb34f99b612a595aab9edde62c02cbc473601b03f5547f1b4a8078aa079c4cf39c56f88925a9383b9a0f57b58741760c58d2629c5d70074df007e715a3f9344755ba908a4a310de73150a79a9ee3957a730687f4b2e7df025c1d699c254af6642bfab84809ea9a3b35410c7688b296a3da82c6cf6790b48fa3f66f5b651912e7939ab76b0935f49c1e0a25422365974698c9532ad00120bd2ab10a8d1a78ecb392e6892624a3f96b2758a423246d67933eabe6ba2bc019a031431338ab546b3154a80945a9b31bb5f9c4071a4b0ac4b1b85b3a11ae1371db39771259936a27ebec742e7d6282f19c4b6ec1a70085ec6cc23186c8a29f4c3a1d3ade8912e3e238f024cbd30e61b1ff2312c91a2eef9cdab68446bcb64ae505c32f0ca5d02547c3b2343962df8d384bac81d15fa3bd2a116b4d9aba31041428ab688f950809c94404b5c35f303d9852a0f029e609126110b64e310c81d634117e3b3e1994ee2a2799600aa38966e00aa9450f24657a39b4901764c3a267f2018363950256a69d5b0240f368bfb238fc3abae22dc2f3fa6c9e7f055a8712cec654adc039c49aa1d303158e05b0ee4f1ccc0e07cae74047b603671b9704e70646cdc0b1d1423bf3c4fca6612360269a26b9731524a2117a2b686131708470ab6c1ecec857465cfdcaa5b1506abdcb6a5e379bb4e358462f802c2a81b26d0091a9a281a891c06737fda60afd65ab7c7bc4d97667220ea69896a46f20200b0333546713d9e685d8230487bc39b68b170105231839417fa92aca1cc38246b3d0da638aa28c907c823a1fc779b7626a1146645db0582e23115c64ca6468bc21a480385b27fcc28c0e6b8430a270c5061012a619da7138ca97da7832807aa4f338a3983170b62145f36a35241d21c13c61a1044b5bbd2232f5c16f106ad476818f83920f650a87dd80c3213680cc1572b0625391a92dd423e53dcc0ef58ca376b18a46b8ba4506878f38c88d814bba280575235b23107bae8c1f443a5e9c1058c904a09366b50e7b531451f8416342267352fcc7fb21c05bad69bac0967778c0c2d48a60980ab5b7901b84b54f1a53b6bb09b37d48dea04838193657cc7b47b436d4dd36cf9bb4bcc552700f98a88a850dc009b00bc41c9f552e5b346416024065634f4d768cf49bba831758af42e408668aa712f93f43658c48b80a72bfecc0258ac6fb10c51ba665e8f25537116ae53336a8f3a0d2101b705642c5891b4500ac61d023398b35a21e37ec6c9821eb46c348c594590941fa0cb5d88ad32c3165cbc3569e15960dab8f53c16d02320b7c8394971c14c5633ac5023d572608c60a726d50b22dc3696e7c352fa6faa0c8e73127ece085562bb8a86ab6628149292a750588aa90d268f5fa618b559a4f8468218985db9f4cdc1f65b4644cf585a1a8057431985058476cfda6ca0dedb2fd77917fda88d799709c169c01e90c5528a9ffa144636334d8cb3a1cb27b81df55c9205aa1cb43f04ec29beb19539992846db361de4bea0a7b045749609571639933e6c105221782033885385c5036153ab3ee68156f0abcebcc67c9163fd09cf2a50910c8a5e50ebbaecc030ff38b041c3513da677f78b253d7c5d9bec993f85aab56a21502b1ee66922ce9995eb83376ed309b1f66c9e9b46436399364496a51851d48ca06e342fd40a6c64748d6db5a9bf18893d65a9fc3b227401c9410888287100482438e604cbac435abe040598f5cb7f07aecc23b6b38a95f9cc8ebbcb4f5cfb17a8443f89ea8eb592456da09fe9a36bb31a98e9e5372d4bc83f9a7509da4ad87036581b27844b79a9753bad9a476ef64661ca2a5e49797fe161159aca36f017d947b66d87833383c9eb593313054e00867a81e0aa6b1a8493a082305a387f8c50024a9f682c69ca0aa180eb8dcdbaac44f4a3fa830bb056352095c2b8b65eef62775a470638c252f40c8137d05cad7c9508c3c34a6b29e6c6431b34882a3526ced7143da2bb9733c2ef816e28d3a1372b418ca595ba593b18789b7c6a411e27acec3b4246e8659a2330c628436d21722536858548a280588cadab316411b5edebb50ddaae15c32ecd74af476b3d4d834c1047376001cecac303f5c1bf7afc7b63e8372c97a8fb68837064294527799a8874684a81f6145ad7ebac7a5cbccb696472ca98fd95b9ba4db7d8729965aeb56b8ee101d0b32b6b80a772fa80e70598b17e84fa2a35c723556eb2782c7cf77ee75f8928f8038ee66db41346741fbd6aa1daf2b43fc3d8392cb53f36ed647364a04e37278a0e0a45b720f4a75c580c9920eba98d +ciphertext: d2f9087631c7583df5f541588ac0a0696e83c45765f3eca327740dbde9197ba2ca9d072aa0089db2f79746b0535fc8a77bcae1500e3fedfc3d911d97c8ec22fbc1f61a5bd6305d736d68061072982438c4f673ea82023e56b42e1385ebe4e85d5296e28ae0352d5546cecc6f29cf4e25368a6a794f6b0b33fb1c568dab46ca7a1353228ab01184be7c0fc603f5460fc1cec63c240dc96ed5e346ca6ad214b00c9e0679619ac924254f5e75c8f96a8f8d6228d3910a662c24003960011e93360c27179f826393cea762a09549950cdba847ab8f676530d832dc16d4e479c4207ad6f9de68a0d4decf15d46d98da375b5730a6a8322a1126b6ecd8d42772b76318708a9366b8da5c7eee8fa928ba2e9959a1889f4eb63cc5b4c1dbc06c728ee16e93b8276ba862e5ec1b8cae91582bb1c90893e96871689edd35c1cb12ae33c55a69d4c5e5bb6d553980e0ed3c131d2d87b52cc3fd176b92425bf6a90fe5f5cb88fe69bf5dcf827bfc20b3c6a4145d400e4ea80e9b519df58fc3eeb0e9579d147505c5eaeca51f0894f5f1050c07d53bb715671799c13486b8ae5d26216306a974b4efd27d8f7b534dfe1e25831cf74693f7469c64d09f63432a1b369a1b122b1f4c0020b30c1bc781f5824aa91a4d70db70b8f121e3615faaeb7ace2b53de58a56fb44cc47e5b70172d0849957f5a1ba90aba44504249a5f8fbd9af379f0cd256a8dbd728131cb2b09274bfa9d7c67275fc502c531a02879eb7715b00f2bb794c2cb357917ab53f6e6a85648056904641ade5a0f88c2fd00f4933c34e9edaf34050f97863c36466741a5ca0dd7d9425278a1079bc9351cc6c45a1e80d3953fa60c502da6533188fe91057feb940fc926feabeefce97441becde7782f365610e1565b6a5660d22d34298df8bb679442bb821941743ad5e8390789f3c262c6f90b4685a0b7381762a9aa21142e7fe80735832918330967fa9949e44c30eb06eaa729a108116f533d72c3d20eac2f1e8fcf5c39e86d7b453894ef01681f0b46aff3ebad2927d3af51476543afde23040abbfc167cd5a9c1bcd980f2d2c8fb09bb0b81f4c778a6fb4e114c874f6bf0a115ae64cdf82bd3aaaac90b004c407aae67371ac62d9235fefb47de6488627e3c997fa0b5b76289d0166cfc4308a4b9bfc674ecf643ebaf66c2932a792a360ecf2bd4fbf4c675daa7df02eeb54e2a2f0a5979c33474832d509c94895c61a93873c4e699a130b1fe3dcce9603d56755b501440167b09b6acb9e115ef4133963cd702f9097f6ff44887bb0e230f80e97c41d1028f36e6344c7c1e4a19792b9c8cf838bbefd4fbca05e1edce7eb9bc9188d89d784305b3ef71a3e097a7ca675a775656fbe3f2219941a0a70a777260645fc2198536b585d8ab161084f78fcfe04dae0e1816f0bad71581eee3d663536680b1aadb31a6711832a7d3547d97e7e1fc9bdea77acb15d7d82bacff5769da9e7ab730c8db6db6a9b51e2c419756159ba73b6a4ccaa8cab4f86e483237f8c6ba850155d5e0894f9f3105bd11a33ba4c07338bb03e67d59dfac122dceedb28d349aa26c61cf95ed6ff2f7056b5af9947f563fd016d046c9c2e9497f665702643d42f5a277e3e4b8f905db9ed6caada50941473e3caa26f70a9b68284c09159380e02b64d7a4da9070ea4b91514041a18036e7284407456bbd8a5718a9125828183dcc65fb0807d2a53eff3e8b010ddaf62e0496b23fc21ca0996a0a625839793774a3c5e0597e00fb4cfc6fbca08d94e809969710d091a45156c1b883935c94b1c8c514fb8fbf6d0dbc00fc4038d05f92362e5ce0080353c61b65f201f079ab708d86feb9f6e25e0289abcf52ede8e241daacd90a6669c17d1f1e257569a4832cfdb2917a64619e95a8e6682e83ce07b01dbe1e261ba31115e05b2405809e123215ea11c067f059c10851cdb00fbe8ae6c9508ea8dd9df624eba5eff018880dcef0171ddaf375724028fcb2b92a8aa1d6418162fe994d1b7b2bfadb2c9d72529ef51711745fdd43da7675ee19ac6b6b2833c69fbb7dc00c4572bde53014877cb5aed967a7f9477417a396f77302330ef0423937e5d4893d06662e2237e5952911627aacac06f37eb7d38239d2623235efb3df0a1d630de19afa599b66f41db7381acae5664deb979604274253b7ee8fd840e2a324e3db89a711ebdb5799c4c31f45482c5a7 +result: fail +shared_secret: + +# Private key not reduced +private_key: c35b3d0a5e4951ecf32b4bf61cc77a4b23b033a57012277498f66299f98b2e58a618cc8b68caf1d1f86cee4b72227eeb8e0d3010c870a4f8510198a7f496f79a168ac82aa70744cdf876fce35b65ac836895255089ca97e4c6ec1b5fb7b6dcf4b434b25bf5e815dd9b441fa1150931d627685917b8535bc52afceeae1338bcb6c087bc419d3a30f625812bd73fd3e3c798e6ebe67b30d0d34e34434878f53102437db096cdeff6c79a9f337f2ef2902c803e58c56d0878c5e891fe47441f95390fab44d716978a0c4af218863ba783a8c7b5b9f74ae77e6850af84e1399e3ca469acf757f6dc3b6306a2b35ed05214554a7430dd976470cf6f4b45ceb9ee3fe47bcd2a2bdea558caed29be60baa18048d8e58dfeb6f46d93dec36c5aa8a0ef7346c56d17c5fca4394ea573d2265e922923b6c5d364781dfd92a88041399f33b9d2a039f56328fa48145bb389ee0eb45708b4e32fb768850c83ca5e7d26be954939c8584eecc95ae68756aef37f764cf63cca1bea95ac4bde2cfc531769ce89419edbab9614c620583af07f5eefda51bc16b51a3f41b996d73764c4503b7b497a9d77587443b5fff488d3bc4d43295fa1e4f6a7f10bdb473d4da84a85523bba9aed6b304583bbbdbaacdc98db48643a9e6bd3eb4fa77d6c8f26682e7f8be9b8ffb96c6f83aec7414c5fe645b833ab30b515a446e54e5389a972e6f22bee4209d9634af7bce363a0dc4ff2378968eb589f9ccfa5032c37af18a9dd8ff11b5858585e47aeca713d2e6dd4c748696ea16d9a56305c812564d3be295de819b8eff7da1abef01e7740240aa2a18e739946606f7786a6a745b79f9e70f552b8af8f49a9dc83fee4360b63cf739712dc647fe8a03b9a8ec6afb4f8d3d10cf7eca964a1a89c61729c3c18bcb8891bc2f98dc9314ea5ffb9600e184df7ad7ba52838123ace350de199d5507e88f0acefbb4f9b67012a4419934d13db839d36aa6de939feecae90cc35965e64d9d9c8a078909d4cb22016854c37f9634bff2899302f356522fd427cdc7907b4529155c87177914906d7ba29aa0d9586ee05baa1c78d12b9807ca995d49ef2c43b9672be6fd03436fa97e43805c71c4656c29b8da8c3f93b44be0a0bb873647f7ab9f562e470647fe10388c9f15962cb2499541f8a53f3d9999e8ad547dff42d81f4053d13f741d036c36fa47e8a97b15c647272b5fad956f0c4ba7adfedf59333d67f8b5612fcbe0aaba35d6999339cbff36dfea693b44606f7fa05b5f3c9dc746fa38d0a710b3fa1e696e4b1d6346928fbaba57bed2a462e879b7a27fbde9ca930d85b393a797e339d4116c3bdaecfcb26f05ad5c0e68488a21fc34c66b4d617b856ac8c66aaa98ca458ed5fe9a747930f3394c56f3a7e5dfb567d69ab5f4eedada6f65a82a2c95aa816723bafcdfa94e107bd336b6e3420994580b94b336ea15799cde04ca3a758884be349567f5828ce5433ee94f624921c674ed10877cc5d78d2bf9a52694fad7fcc2aa435549cc3434f906fdecc12f5f3d6fadce55cb8a0acf2cf68da76a8909d3c3cd749bbdae9c0601e7114f4b5ad58533e5edf8c3de0fb9cf5fc1acd38c69dbb5d803b3d662159e4cf9a8ab056a479afe97dd5d78317f764a69d8b988798aaae3f2ceb2a268312bcaffe2539414ee033c64d21ceaeb61ed29f873a6afbed249945a99781975ebbc86b96cb0537e7f8dc0e48fdfa3f606bd58ca4efec0143fcc66cec00c3ec34588d1c1dcc177bfffbbbaf2fa95545f5ef0d7445cd0e7c4e3e78fd38c9d96ef3040a702003af65b749050f87548f5c7f7c6843b3bfc91fd535fb68892f7f6b03fad62d3eaf8b8a399d716e563578e795ed566d44bd71859be336165544ec566acb361a8b8564796b8934c8ce253c409677c2d456923d6301a58da9cafd06fdc847684e960590f1a5c60217c5ac9d5cc8a95e9cdf63029dfba9257370b73e63d647f02cca6d58907eae759cd5c20f7a8762e56c1e09b95c1b99f2bcab69a3ef03b7d7bbad580a896c022a53c3c846e5dd551f6afd6f6b4d22ba779c0e7fb36546440f92da5dc10ef4f862c749bda5e04f133253be5771db7d3ff4a7cd4ed0379d365014eb416d9d6aace6e40ba12e6c390a388b95a5db1df9facc7e396e5adfb799dbd8eef3d81da5d0c53790651f609447f0b18434e5b31f2b2a3d1233205c11e5841daccc2017203be9c26db2ea7de30a6671f79c1c424052a784e727c36a3b9dd1d71ba80a542dd42b17c85eebd81406dc394ec556acb00932fa9a8ae610646a973de42f9fe29c92b35c04884be2a5bd3f68b2083945f8ec525d651877d924482b024847938eaac5690cb33f0a878927bdb4a84ad627092f046a2968437bf9a675d91e25e89a3f246b38461f002c3d78206539968d9b7a83745869ea8accb72ab1dab78ff0183c2ffa338c819dcfc1178ad8b928c68abc98209819ad705a3fc264bde3047fd2065c3e1806a9318d75a39c6e4541dfb86433bbaabd12762f521c842a2381dc78fb312b1a6a318c5201bed68ae518be985746b863ccec279836d6810178c54902619301467bc986a735a9e93678b1f433bcb7af36da821dec7546a4957e413d30a4b1d75ba216da71af7a7b17a932c224bfda459681893ec103a4b56c10805a24543741ed0b1f5bf84daa018f94c07434758d32d80a3d8c6b54774da822451b12aa086782f9c0622c2b8ac9776639084a19a509124b5de6d77a83bb6e123b8eb1019a2b203f87896f23018568da081df72e460a1d8a2815794966aac55fa07cb7007ac3743a0f2ed5b6f377286a7c2aa4b9655237b3f1635dc25527357bc4714c3a47285c9ae3a5a84886c7302d22ba2d3c15580be7b1627c81fa1b0942e85a3a075845e47dc0674f4ec2c1ed9ca031ac1cd934a01c022d26b6ce5c038fbd541dcd4ab4a9bc17c06842d7645935b57587559c11b99af337bc629a45ec37a3a20b1fe905510971b6e0926126e815625c5d79f677ebfc69b1489809172f34e075c29a6e9fb4b536f892b16c7aa97623168823d5b1afb439cd2603c9758904b942971d769826b169936ac108c6caedb98982098d5176c71cbcb11b22b96143433f6c083bf83f6005c5c8b93562e081c940903ae662a8f17fd0882fcb399161d2a2bd2b8d1af0731b0303e3c9beec81c5473384b7a04c1c841f60e27eca0977eab4c750930a2bcb3983daa99cd4c2e2414ab8f77857432036c1a9a65c493afc62ef80758830417375c697a2a7fd0782ac011014733e51f088bf32b7135b5db727b147936740e320c603365e280cbab502b64412abdc4d25fb9a96ccc96f166445f6a6c3a894a6c10ac7bc074fe7b5a1d2964ef0531e7bc445e0a402f45b0f29809a84795848812a1b935d220670c2cd0e3332abc68f57b98f24cb9e68f8b1663b4c793ac4212177f11c594671550e44794f84705fa4835d918b317a1d5aa39e65026d3888aaf40cc247023b74cc4e00fb1c011c6a266560949c626e08263891608713c12e75a229c5bc114bada81395b00a5b6e695096b2790e85c954028c5b288758c9ad634a3ae11b069790bff9428b425ab70c5c46c2150346235814e7af8576af3071c6e6d4b56b61412d7a5cabe21cdbd0aa69e53d4d223d72e4c77afb927958245cd57967428d9f6c81cc604fadb43dd56c8148664942e2085395b17a1c53646287fa14a9bb208aedb1a7e6f73828f0aaa5918a69c211bd765cc0f93615a57609b5aa91c502b851c4a9b24335d282348ba33a802170524ee3351b6c780a3a9b46cf472fbab34be9f508c32a64bc37b6e6b30f37a7a9f200c34811c2b8553ec3ec091091bb08ab02ca7680867244fd3c991508902e84bb5e177f7251057c38784c0905cbe7041f12bdb77c07842228ab569fb69700f9b3a058dc5791b600dc48855fb1cb938b2e2599c1f3411628b64094ac20eb6c50f5f5cfdfcc10471346de9429dd29953e7b139e2a46f04127d7225fd46723dfe19522a4a76389bfe6414450b885cb211ae680b59ef46177d50b0b3306820a9d57293ae6753e65097f8de97c898c465b07b6e89459f446a59c04145f2c30dee57368e0479468ae96bb2e8b0332bb7535104498ffabb2abd65a6b8a2358d467eb8376a795aab40108ed9b0967a710083acb476c28a01b46e68a3d64b12dbb49146df48f31e1531cfc3295e4cda083af7b3a17617286f60b5ca9d21858508f8f009878916473c85360e8cf6ae8360c80aad7a10f6cb7a707063ea9b2ac097155e6961388f87327d084baea61d5ba26e1d5bd9cc25ffdd46a24d81c40532697b4cc8f58643d41afb6d29b7c857837a1e385a9106e3bd9911c697c8709312db4ee1d9b023e39fb4a92d9d95ff01560d717ee34e223ead8139db400078cb308c3e1bceb046cd9d53f1a2abdf8f924d7e4b5d8021c486b9c3114d7cbbeb7cd49eba8a61bc2bcae1f1bef30a1daf76d +ciphertext: 8e1b874c5239db036b813ba1154ca84f8219a8a4bb785dc48912a04e5d60175821c3f7609567bd3a11ae75bf88025cf960768bec53b0350531fdce65e204065e23b58cd995efa449db59eae436e84b4e7cc80dc78cd4ef12bae5c5522c7e7e8a977270b9868acdf57df9f67128e5f26179e11451a81c45778fccbdca9e5894cace05e2e512b07270e97dc7258fdbf8b0f2d532683cf0578bf0821e5c96654d9b166c4aeff1899cac0d9a898cabfcd572892b151b48da4cea71222fbae06269d2ef9e564670ac80965b71e7263a0a14ce5a1411e29c043668bdb93af3b9d4c2f86a917118ce0b147c5c99562463cf9d907623b3b5c09bab327879c8e17bdc16f6a559aa855c5dc90adedb3ad4b642d8a84250ffb2a70a861c6ce71b24f8c6ec9199c060531e365f6bded0dce14f5a42a572f3b49a9f9696ac3da5a842640edfcef5cbccc85b3563107957183e1004443de9e416500e4254e3ca7ded5535c437b098c34f3e10a568b12f30f8d0ade71b9e2e666393e61fe757da50b9c3d2a7682ef24cd9aa296e1e92267d9d1fd686b11507b984f4f05d218d98bdd7bbf67ccd84bb4def89865a3cad879785c449c517e29699b0f3d09737558dd4ed27a41d065f88b7a07569d28616664bc6923ff77337ad3107efef86ec513b991fb5d9a58044bff3412cba0723a83fb30c465f9cf4a4c733be247281cc56e8ed00ef84cae631b2bbcf647227002cf7c7a400d465d467188c3402d7b9afb67c7fa7b2a1ecae21ec56124392be4f33df423bc6a29d1bb8641f230e5078d5642be440923fc761bdf2835fa99f505f2d9f3ddd90187ff278c2f55792c5ac147785a5420a72fe9b55bd7a69ebe877954807abe351f950de6b5766a516e5cdc0668513440c695b3e0a0c9ce68ec0e036e3e7efcf65c8af343c03802ed7b84d940b796b79c08f8fdf86cb956fd9ad3f6336a39f814d7cd68971074a9045373462f1eb03c216d5431584a7b77e67cf73f30d4fcd66ff55141859fbb48be45de1400cc66505411f91faf600999dbcb50937486c0e71722d8aa11d1146cf2ed009c1888da11e14787ecb008aeb71e5c2827135c930788bd964082c147d39da28d15382aa86763db13c0d48257d8a9253dca4d1a1ceaf5cddafd9ca74653f833ad22663a5b158fa142bde1980f14800714ef5222d4d97542cbc0750bcd24d26dcebd66edd7daf309dff500cd2dc924f651d5deb9142e81434ac9a2ce80c8155d1975fc5dd2a1d9bde9e40a85bc77942b916d4cab359579cecbfe32cbcc639cb8f6840405a4e2003a6587a229811556ea15982d193d5b84777517e757acce84f30f957c019533da3eed6f51fc3dd69ceff6bab3ecf918dd29eb0f741284cc4d4a17bd111d6e2f964360e6cfe86a95c58e0d3b3ee14b11d15d9f1354c3f364430913cec29728ee2b8cf391d012a8a48064731e51ad86399788deea1138de74476fe3a8da432aa9ff654ab7e71a9b33fb08a9f7e8d703ea3e831f575c13bb0cc592bd6e387f1c960ab82b04b29f03b94f0daf0b56477517d47aecd0d08efe6e61f8823b0621cb83a578bdb6a9976593bc825991e887a59caea6003b11fe23ac1e540d2a67262807e65422fa8f5b47e5c8b452ef29ccd60ae85448daeb744b337bc20ee87511312c2cf4aaa76f0080e166ac4d0cb02f3456777166ff968efadf6fe78dcbd93c8ba8aea5bc0f14f65262acf72052fe8d23933e4847a9eae488ba2049478b09ed9dcbbfc9ede10454744b5ee95b6381a30d838bb9060a67636b7cb75c7394e02b1e58ea3736443ad43dd540f52212f686544481504224d8d50b1e009c5ecee23882c8090fa0c7f0ae1b9f507dfa76329f788b0080f6e985c7e02886487b9379d1229b0a6aa23304a056cb9f893cd89addd87bf0928f42d4ebbb2d90e82f17d88cb1ffd34c0e90d6126cd8a8b29e2e6454c212034342b204b6ed5d462c3402fcf96c3ab79d4db0fca0ca1adf6ee0407c701105ad9884f178b979fc55ea74cc0a176a7be6f1f90f675c4f687b44b2d6923a6f8e1de0f5e6f76c4516fc1ccedb1c4c9bc51c72979270cb972385191c83e8278a4c8279a36c528a91446d9fdb06fc26ee7023beae01adb417a11176839e74e6766745c2cb8cd0b74e8cf020cce2648949e729626c129bb204789542f74bd1defe1984d43c9b046604d223b4a10511248daa39bfb88028b +result: fail +shared_secret: + +# Private key not reduced +private_key: ad3cc5e96674741ff00dd35f1e8d35098364871dce0755f591948a1c6a9debda4190ddad79da318004aee89acdd62c689f88a5a87fef7ef3b1f16c5bfd6ce7438b98f029906c276ef23dfd1f65d4bed6f4406d8438047e6625c825c9d2cf3fe4125fe45378f98d0c33ef857a45c872aa73308feee2726847df0fd12acf730768abd1d4da8dca501fb6eccc737d8fa497091ab5ea63fbc83dbb9633becdf9d398a391b4f6df5a5a31a46d529b1486530b98742780c79cf762cd9e655334be04b71d8b9b04a7b7daa7ac4d2a98e2ba49a55cfe920e6be56f418e73fa4f0f3bc6f8e62419f7c747d3fefdae2a1f787626c55f56e4c93731c9c679984738c96b5cf64c7f3919cd4e2e7f44e668e9fbaee063d949f63ac78e37c94eab926587b26ec56e2e8e360d885c8fbce07668ca95909389f507eca4828ad03d26cd033f4e352388fc86e97ec546d69db00f646de107681ae3fc708561546bccaf04894968f1f8d43a437cee4d9ccd9cefa5b56f32dd37485328c3ade9bb08e53947fbe6afbc6ac2bfb96b496f1a0bf60277bdbb0b6186c6eb88c8e24039f880d9cb9a43352546a5e906d1055e53ba033c3148a5aa78afaabfb7c8b86e4de7da0516a8a3e746e83ca8b929e04015650da3a6f7ab9869eec8e34bd39c9f79e478db5c2a382799d49f953fc28764a15fff00e9cac3ec794de5ade0b432d294a9c06941a814ab0f89bf88f7e9d18e520c1e4c9d9fef772a7a3b3ae6edccff1417f4e7ece64938e2345d7187e4b87fae3803bb8e2364ee177cecdbf38ed2bff5fca3f716974829a6b8403db3f587804eb8720f2df278d5c7a2668f158ec42aece37896d4d60c9ed1498bdda86a974dbc0c8e37f3d7ba18edbba38e67ff1c5e3eb86b6eb5c018ac766e25e93b8b4f65acaa3a3ce91d646f98fe9b200ba58888daafcbff1c68fde05ed5767cb93fa984c5b6cb73dbd301e9e83513582af59e04d9c5869cc99ed83677d5a0f54d5d166a97cecadd6e0b8692cb6ebe23df780f5a24264bf695eb2b5fb41ef989b9f890cdccc3867c3ae19c723885dbfb1eae52dc573e87554b5dd88e78ff15f9be504bd5e2b53fc55ee758854f5d79eac806ca00136a080fca538d3dca8c935d98c87fe476fa6da16a5de148bf40c026745c894d7eaee97bc7b2d89df56806efee554d3b95f9029349076fefa09bf9b6c7c27c6867677e68b796b5249bb442783970e7c443469c540aa9598834bbc4bf8ec97a191e9b496a56c3fac7e36f7b76ccc51fe6dedf764f68fcd32bdb7a1b64f4be15329a54c5389ed206ce5ca2ea34a656fcb3647dc7a38591cef0a9de41d92ea20349631e7c48050eebf9ab9ad59e7a27ba99ba0ff87f3a8afc059bac0d72ea3e31a1936f87c8356e3859fd97a89e17affe27d6943d9eb5ef9a769ab2ab48659f635acb4ac987fd8f1b186bb6b7da50a6cd4d3dfa10ccff1d24ab4338b2d9765ca263ce01295537dc56bcb3e5db1c652e95ddfab5f2cee677d2775f888d37e6ce7da2e6c7fb296927c64ce9256f8895ed31ba9658f5bd7bad636dcfbafb1c34952ede7fb8683bdcb3acbaa7274351b14a81ba0bdb4f3fd8d4dfd4e85cd0921cdc085ed9a824f6416bb805465e429641bdadd6b56c75ba1c75c5ac4113f95bce7843344749e969ba280fadf19d32af8339660690387f547365cdf835a5bcf69d3c14505b5472475c97acd88ec1ca4d53ddb1291d86a5bb3bed1cb3996f38385391a0e59523b5a16756af4e15b58a07426b574ec18d893294a60e1e48dd4e8c141f673f89951ec94e1ebe49365b33006ecb2bc372773f77eb97c5c8884ca85fef681b90b259f75e73e918aa57a7ba65b4e6f0cbb591323dec9a3c5e070ac7708fe4e1678540ee6c6058a9232adf5cf6933acd463d39d457fa47d0d949bd7362b6cdc22378f6e434e354cfae7833c31dcbd3e743fdbf47da637a8885cab1badea864b98bef6c81a27c93cd3d6a27b37bf7a4e90a3cb6d55bc581df95af6d87d05775fd9df19829eac504d1c25b39102a54820b5ed12e46d6fe9586a8c66126c87ceffb0e9c7857c3426b57d768676be8f7b827bec1dc486c9ee64d79c33372e33ad498df367e96ca95637d8d66815dd22885549d1a98021d9a96398f1b8c62480fd4ddc4350cf730892b53037b4a13665dbe0a4aa46bcc40862f1e3621f2596ba293466f7499d9954eb6a6251483b350072ce7a4910f008166e62476e383f0151fe706c23999b71dd2471af759b99239ec05996a94b7a3943e37f10dbffa1ba205b2ed836aef025221ca53ac612d41339770d80b03f0220fd1580b786353c9bf15909242494253684c8e2b5a28216501e1b4f1820d6312cac1bc02c122bc0ed71350a05457f4c40a29584e20b70a8739f1e733483b7e7f8ab62b664c9672229980536d747f3199a064ccbd66e7be173641808a93231aca8a7b54dbd0c593ba85df11c54bc2894c6a797bc0557df513734c74f3641a6d2c98fcd8c1ed356c2e199c28088ef495a54fc1019b736f2fb8895eea391c67c895041f97805bfd2354ba1c3dd8e98467d302366a616d280bdb4747fb5a000bc5781bd8c1cf2b563db206e6e512248319d2122f5ee77802d88466a61f5006239c5001975b00dd634377705274629f16a92f13b37049698b12c39bb1c3579d693970736fd72c8d8654943e5868c53a51324abdc57b330ed30145e92ab82c91d975244288833ff3a2d9d92aa1f53d99b11d191c99e06434196318e04087d9aabd03d7ae1cd2887cb2197ec4b09f7699861193d8eb77da9c9e33749e4a0c5bab3bb64adc4436b7a6d84b9463c4887e4642d490052093399b2cb52a73b5904920a601c327e2937ac439fcf3b78ee830b4ecb795376dd263a3cec91c6a6b60e48001a0f739e217b5b3c4ab0a676131514bb62c9fa1801bc80b6c8c7ac70110b4860cbf221543f2aa61e0683bee500f98ba4fa93c2865a28ba4820aecc3a6c7b56081869c701b1bf741152c0ca0a753a211c3562ca26a15395a630a4a92729ed9a3092d23bea5433447139ac0518f75d11af6113b8368cc72891a5de08dd7689b2592256a8ccfa524a2344921a0e887627bcf7965a1875c1ea5c255c36978da7c4f184a1cbaf24a2df142ef80c07750b87269419721c48d8014f4ec8b4ee23d95ab1ed9f8b5ee9943669007d48ac1657454afd466e8765c877a54466171b649188a7c205bc3073791b832b6a752625809919db9258ef1b7a15d2c54c6c02f57fa65751438f4186a8b576d7c561d649a7a60d1928e013df7d69f4dd7035485107a7062bf3ca84a93a5a0197ea00b7522dc769ed45596bc5e712954e1eb37ffd69d63ea2ce5e33df8088545e3a738b864bb61b916d29e45ebb39d8a7a6fb3cb3901b9880ab0547107c9073b19258e4e290156f54ae3d44d19d8abc5fb334ad757c7e24986a26a31d458edd45c69b9b8d87b0622166e66c76afc49a23e1c1abbf357b7328781aa9a054b24aa2645d691639f141981c30a7203623d550c31e2bd4bb95b2e7b518b44512dfa6a5387afd6c7ce162a434a6b9ed937cd79222134310a2420934b357e72e009ea8413a9148698240aef2732836b5659566d21111331fa9bb0b762c948247cba816e313109270eebe826ed722322f9841f33a935209e0df273f4e2237a59b27cf85fb3773998a295a37714ba074d1093b0f096b2eb5133bb273e50e17de75b45300c0c862354344336fd028a4a631da22b285d4435082667ffc21fa01b79625c019e71cd0ad86032fbaa79326630692b9d02be55315543d83c0b84297945406c339699b1093e4b188511aec19b3c9069bdb8799a2e077af4308c401982e96819c7f17f6bca98054688c30a75dacb90ad342acaa9ba227a7f6784100428cda9d6890396cc19cb90a81153bed281cbcb1036113250206b59208d8c75839b76ab8425211961967396c696f05d913598259334c742915dd183f32c5a4e957013868634459f038340aa7761ecb628fbbb435ba642e21c538b907d8710413ac10d7f0a7965b03cb8c36d39336543193d0d768bceb00af79069e7c85b09114e77e6063aca18f27376beb9ac4a0b976ce745fa7972e9fa74d0055ef490cf40e11e6cd785510bc4bc1231d88abbc9b22fc1e2577608580e26635070702fea437f8a13f6fb37343b488c1c0b2560027bda77fc6a97222319b66a86528061f21019aa73674519420bfa26ac5616efd714cd46b7b7751922175a1dcb22831609eb40b4d16107c8438f33e203cdbb85be910b78a99d766499d4541b91567fd8c7a85d983080b91c9254ce3c2a9feddb8c8ba948f0986a90d02681341fac1cd19451956432b83b79d115d32a3d4f86f902f2f6b0c95ad7f4bd49566debcfc9a4f48f6f60ad57731445a7861bb9c371e4ee4407b35df5a730f36db2dca81e3f5f748d23c9d356a2209f6b2d60247b2e45c9808de497f64f124643 +ciphertext: 2c5bdd1856863d324e1ae5352968c7d4d39beb7f06ce366afa1a831eeafeec2bcb99cdaf79355b2eb34dfcbac2705f30a84ceec1c23d2c42418c888c7a76aecf36c2c924576a87fde0c4ee2754e39dd6813abcc06f24790fc34a9b80a6fcf712886f5600e0444e675b8787a9ac8b0871e00d2cdbdc031b95dffc25c3537b5a3718ffc8ee03944e46b30dd986ea6207eafab87fb4bd9890a230b26a777f62bd7bef4264c52ba5a38cbd7bd795ed352777aca856a195784f9d433ffa2549383bd60468a604c069370031f787b743e087bf0c544a1ce2be61f9d19a5f780c9c9d135ca083e6b315c693e214e5408685bcb24a17886751d1e0d5233df90d1cadb41165473b2b9e2778fd88ada34b0ea9ffb1c623090c221da8063569d8c2943a0938598486c6ae9d4e4c7cc2b0a505ff8e3a1fe057dd34419de75381cdb15d4e0ac372c92b2434b6970e5501792e632af78bcd3853a380719b7497f669f5bbc03aa2b04c624abd6f881630bd765283ebcf64d80e1500767d3d28666b407d41628c5aa47649705cd5672eac55fde509601ac6194edbac2a0a7519d01407c435391cd1518f11839a908f6276cd9252a6eb401c61cc1c2c3105736723d47390bdb74847aacb3bf7275c1c4a2383eae54d0bd38dbedba95a3dd32c1023129161164aa29049d3d898448f1bc6a64895e01271924e9d57dc804ba8ff7162f0f55b4a6f9a71fbac28f1b5cf5e269a3ae8dee58e7af29f4105a862db54325dca76509682f8ada8a427a902cb9c98f8a0fb6859142bba23007e9be5ec038b4bdca79bfdc0917b35506235348b7b1018f90e2ad5d5b3530ec9980d059b4dfa136f3dbfce5e3eda2caf6124c5db8f59dd2b505fcbf9b4a5037894a2461145468b52e7fbdeff9b1701ce67a14dec2d9df763f56be36e5d8ab4c5c4f2b37ec7fc8c7923f30799b7a4f472b1f7f8be36c312c4619196407eb2aa526d07a8871e37cf8022f54109e3cf49ed1a8ba013f16998f5823732c28cef54518ccc758c2fb3798ecf5ec0d1ea918588b6a0002f1bc8514e4b71bca70863226978716a0a5c79ade76a939b998f9582312dfc840f226fab3759f2bfa76819205149a6fd938df2cc2da48d44136e69885882f131cebb748307c837d3b24e5707d464403de00d890868a413fcc737b30d96d4a01c51e8494434ad0f4df1757fa07c4e044f3f6170db50c302cfe8664e400d59deaaa2100167009b8f55c0bf1b447bcce8a470375cd54d2a88f103a4558d4ff4dc5be27483d2425eed2fd223529187029846b0426224b895a9dd34197205b8e5be922cedd0102b03b0ae5ce282db67bc6a9c643a27d4790f9ff1ed5cac1380504bf356d08369fa115a49af41ae5425ca9d60da1ea123ca3d86805e539657a49e001ae17b7cc89ca66c71406d46c9318f4fad897f241629a81b7ca44139fd59f187824f98265f227ebb3b40e9673659e56c35a56a298ed40a68e10f5aa94599d2375b47007df883cb56a47610cceb5c99b1f97b1066c6bcfe50899c70bb8f06a030e85c42db7e18a743a2ba87e2b0f81355838e48d604ad884b469463cc4b02cc75a79677978b3e665d03d2a38cbf9f907a0d1f3674b195f46f792a9667b62a0564a6385b962f97ff0f8ecb5c38158bf68c410b00277e07671229a27e81613eb88c60f1540e615f15c2e7e14d134ec83b6d9a8e1f45d190f8dde5bf2c2681d186df1f24dd27b5019c63b2c05e4797a52d792d9ddb2bff9e4991082dccb007a269c64eecba2043c621965668266d0f1f366ce4a8a1c2315c470a5c638f3b45553bc74582e4c1036be0f1db44db4a1fcda54aa4fb8388ce2b59c9bf90abbfd76706d50a354c2ef55403ae1039e79a6298e5d542cff9aab37132fa5f8b60f5376cb976aa58f4962ad445bec45a0ffd828292eb9e92b15d47b650628beb48ceb6777807c0212ca943b6177bb42db90de28dc20d76031d5e69caf18bce7046c562b522eff42ebaefec52d139da4086ea9c8612ca1562d7fc15bfb42b62cbaa507127f0e780a3ceadacd74b2e5f23e96751e8a78539e88ecc7058ff72cd4f4670a8297877d91c8a34fde5ece933c2e5bfb002f6b7edcfe1edae249062a444247d2d24abe422277631a36666b53e8cd3446cf1388297fa61aaf0f9cc86ace67c86e47d1021b965e393b54282eda8eeee5f592b53e39fcb04e1f1fb5910f92f3046 +result: fail +shared_secret: + +# Private key not reduced +private_key: a11ccbcf239bdf7642937b7d38cdb33ecd667f06b13d8ae6697dcb3c696c94ed38b324f76a135cbbc672f93d585a46c31ddd9c621bbad1f4c611f3349104857a5be117f47142d36fa8f7383436dfdc337d7427aa0fe9db564658743dcbfa5a56f304fe222ff6c6b6f7085b86cdd73c05838f4679fbe1de5a7d59b9c2f8d39417d8956f93adc5c339af9913c489ee1396df0e62588b644955f25aaf43d52fa92dacaf5ed9a88a2ea3760dcb0c1d31467c494b4cf07acb6d4fb444cafbc9dd364933a3488ee654b7fa866dac82a53acc8c15464a29cacefa9432256934c7790e1b99c85c599e3c5c0feee310ecfea6e8e3b505a6feb4626048bb70fdca8a1c418bb4512008a94d863a6f7b359e0fe2f16e584f44d43ab6f8ac8dc46017f57283a6b515fe8967a56e96f30d9b58acd6e25416d64f03b6b25a5f9b7d6aef68e2790566308ca35b19b3c6a7a2450a56b164bdd29f78de85a5779e86e7c67ea9dcb7e2b8f23774ca6639d368f67ef6494d2bf541208ee4e7e930b7a99beb84bc69494e757ee27fda4d6edc4959c375b6d8b4822e31210da6dd05e1504a84557ddf885f3d7117ee14adb676fa681428c31d7cc0d259fbc7c94c7c4f30931e3dbb2be23a3936c1de846057b2970a37d1caa6e53988bc0565843be43d0ff17bff316718d257a3397a5e41318562a024ed1f7b59f78e69fd1afd7c959af20997197de23e5b30464a74106fe4aceb6b322b4cdcbcbc28285aa2746090a8595d4371508735eb64f3b94a54f6bb8aa30e9b76bb76b26ceddf4fb56d13819123be6ed3bc3d26b1de5e5122af68d3d3381ad4432713868e7d59a076d9864671fd9a6a1777803e4b46d9ba6d4515dfb2d8df88f450a3b655843872f727a68aaa66c758a8317a3e2aaa55beeda97deaf9a244615ea33469cc5ff82a6c2e0982935c9737943b45c77c3355900ee3f785f59fcbde4b937ce708baa6b5686b953bd7684ce252c99d8a59f72b053faf69ac090a8c0e3adf639544ca196c00975f77667bd64f89445cb62367bd7aaf906843e9dbfebe3cc89a5e1d506afff1b885d75f7e62b12b320373debdaca13bd6768cd9ab497fa7ff54ac4baa49c378de372b9c7e35e24f6a9c62c498adfbbe9b9da79fdae9fa358368afb5a24b821866402e43b93dbc3cce1467245a42caf4feb72e7cb757d159af4fa225467dfd962b399741c4743fbff22f265a45e7a94ae8d0735ad50635aeba1470233498553d5c59276565f3fdfaebe7b3183723bec44af4c28953df6ab53b416ca239c4d9fd1584a799ecdb77b742b3fe55875d9b2da92f877dde6662a1cd513fcbd875973925ce6dd283ad5ccbe8dfcc37fcff89157e3a04ecd5146a7d5399adbe57b60e7dd3a81a3f9f5559450483d51e6dbbed470e15ba3f73f3adab47b04df52da7bc45e38759ba99877a6422fd4232b35cd3b372c0d3ded32c64b0d74fa70c7e6095d48c76c2e7e9b1bdc8b0341fef770dbe3135b78559ecfe48932f3da89f34729d1ef588374fb23d7c819ff8db07d5f9a8c0eb8a98765a8e4c2bd592dfe2d5aac9f9593a1418afb84bbb931349b2bebdd9eedbcdb66e7ea7f99a5bec2387df8ffc8a09ad39208f6b5068f40d345fffb4ac4c03483b74626d049f7fb5f694be8b548ecec5be3dd1478c5a1fa3400d9f0d533bfe67e05755392ee76df7dbab0db56fbd2733487b511804bd63ec767464c110eff817d79aa89d9472be4c1e0445723af40918c2ce8f9d3c6c4ba82cdb6493b9d0dc3910cad48e5e5f2f4ee6142c5540df30d21dcd71b449f72e6fff68839d93d96638348b4fa5edfd986d6fbf9315d68ceb799daeb7b98f6a8fdaa131d6b873eeafde468aff285aa818c8ca08dc9ecbf730f770fd143d81c8681acff3d4059ec5a39f18ab538624f464195264fd2f9b577105658ddd8da1c7fcfd82bc8c658bd0c3d986f836eb03973844acddb626f07676b9ffb36a986c3350b698289367ca28cb404ca0c1e436f0f9e898a4ed72e7c1bfffa9aef3305fc4c73d7acf8305f58766a95f9a5b97185ed14c7508d7c8f7ca571a534bf4b8431457992348e8e0a65e0b7d65ae5678412af5d966e0dc09e9485e3bfe14abbd9430104ff619fbcb0b03857ffe340de5510156579b5fada87deeeda662b62be6678cfc81f998869a9e3773a7c7942e279471a233a05d77899c2a18f35ac98a3243fa6767f076976529b75b75b070a341dfc95bb85c4bfa1394081141fe1b1b31365e3c2302c8a0296b9769de04024da48c2d7a3e5b29ae58659384fbcb4ba2ace58c4ceca5baa5131bdd465797664276aa44e8331e2f1328aa6910f68a6a73210e575ccbbdc689199559f094bb62380f436a925a7305fdeba6c53a9193069873e724cb1b67fb8820e75c27d175bd5f5b5db020c91eda2439383b579c14da0173e1704a318a03de6691ecbc600097b41a7a9a429ca1a4d8a34dfc6c85e034e8a17629181fe7c993ab018d135a73861405186763b0f70c80d09706c9af971313e47bb917761a0e3a39f7b96702c288254675f6a07771768f3939b7bec979cbbb8bca011124f08347b7bc7c70833197b192fb26589098e48834e8fc8551a1c1fc52a1701323d98c4bbe7779b867b813a5a2a5040d8e8845d4a2b03efbcdbbb3083831b1ffaaa9e21c7a3ad77053793b1f7b7475b021e2c1ae25f194856b1594228e938a29b832930d5bad3667c854366f83b48cd3501768f086b68007ead71b2f046f630196b8237967c940d4727d388800dfebb3b152cf57b33068803c1d55c59fba14e31c323e820265c8826ec3b6018c8f60445a11268da9b44f8dcc512b860212f408d3baac60cc6ca42211d2ca3a41271f745bc46fa70a9a8a3999ca83e8635e7a4843ea3b861194bf00909e4250ad1ddb3006f86daad2b8fa720d969a7d87dc97ae214ab3769eac0261076092250133726265eb7987bd4bc01ec004e71bb8f7b06ab339ac9c0849fcb23c4bf35b11955c52d30fa0eb56dc7cbfac95704e51969ea45ab01c10e59c691dc3908c083263c3565766a34b216f55f8284f219dbc158cff247e2296c86ba69c922161ed753fdc1471834270095a85a5fabb1db91fe203113139526961bb40b41e8f913a36461ece86b37fb809779005c4312727f68923187203d001a378c0073a240190a144962bfaa89b1c384083178a1b44461926a9ed135abae505c93177f263996de9780fc573619b63f741091ed57657404644194a25b6cd1e5aab45e9021d9a8839546a9913752621bd79730685397d93ec49d86910c46a28142928a054599ba18cc3964cc4db8bb7a87543e8a53fa23a95bb5b6713478f4b0b5ca6248018a729469a3794a8ed04a315f3783e667c0cd2ac80c68a40c35d64c90e5e8a3135ca15cfea69d4a1a2e9b562dac51409c6485e026001eb1196a487606404b6519974b386abfc9cf4a0305aab4a627b6c22a994dfe46035447f0cc09d1bac0397a68fd647b0b13630d1439e63fc8fca2b01cbe66bfdb4315230b06a9797b34a57a5db208061195813073c7a10ac95b8755aa79b2033bf90386115066f177ea1421ab0267672b91830a26c20b4a8ab9011668cc46b49a2d824067102c95dc842b4f423feabbd774b4a4be351bcd8cf2c486ca70a5eb502ab5ffb8d77c2bf00fb7887fb960c089210d673679a0c71428b5ae348ff293602833b6927add5b18f22acc4ce01517c65c848680d59931175954ace9689fb6881ce17073e113cbcd53547bacb3946067a1a46cf6b4969065c98c17304d53ab5804501711c153a1b13d7cb442221ee311466469ba1225cbb312708c7b5e0055e3b476264b2244fe9590a557f088c9d4fb47a3d598a998a1b5f821d19909220a229ff020bc11143cdfaaa90e00b71d6c8b7622f24584508ab4d036792135b750eb9ae091b4baa96a27dfb1aeaf605122060e5268bc4e9c08d1bbcd451a22e44a2d6201c6de52baf940f14956aac311b5c3782e64377c645b35d210e1ae043ad6142bf6c05aab07d3915500b67989709b7477432b947239a9c7abbe747b2238ade292448836b87938e804a4029f24182941cae500d85aa7ab9556ca98c7808d90558e771d8709446bb1069541dec34b69834c857215822f773871c4401da04c70503cee82491b07e8597480b6bae6245084a4b92f9b015a158295f237a6376118868486d9c1a8389baed937b392ab840d4bf67e31df2c073a4a8c691896b6d6b623b95670cf404dd499773a54210975d1ea72667439e0fd8c112f33470789f2899a64217400e4b51fc501362ec98a45620ff6ba180a211ce5c154bb62a1904cc13a64fb6f445b48ef88ccad56919a0deed94a2ab2d4b6442a71c288753f1dc41ef5389e394976ac9cb9123b99fcd75201ada0fd5daf1a51f1d069822d795f8e736abb8d1fcd6aba5068af837be962f439f233593d193ce5e08f7d66efb3389885927b89d2523 +ciphertext: 80b2121c5ffe5e10fbe5244fb9d79f6c1a5cc82a850a9a347e439f9e8d95b827f59c74bd2e92338b7edb992e8e1bae6872f51b0fda5e14cfcae8e789428753e97f4ade4213b9f1d88d932bd829ac8fc47952f455ec61a75f7c42334eb17bfe2e1991b3a97e3da5f3756f538e36845d7da303d1c41254c1ee9655d0eeb9f93036fa50495bb1dba1ffd7f879c095ca6c62d9a7e28a19538c1fdda0abee14156a298d8473dfd64d90813e4e760d1dccd97475719c15a973aec286a46f9c4176cf816d1495a031bd971ac9ab58591e6f1039c73835fb2cc82ea9f48f8aaac3e5efd3062d3dd1a349eaba7b792d1ae4ffe41c11a2dda1b1e66d40c38e4d960b963ec220b16b7c3e2cda012ebf1016f616c78b64098592e061b533c09e4437f41e2c9800641cb74704ba141bf656da410cb886e9a4344e3e0d7c442bc810322762d052a818677ee4003e0780fbbefb32b9d791f782485bbe0b25d0cdcdade1ca5f046f5778402fe555575d3ca829712e1d264db9ba1986460043e654ff6683a1f59676922c008dfe4903408f80f6e3604f50716f83b9b7ccd711d03a0167690eb705f8f79ea3a56ebbb0099c71e475599f490beef33da232f35ea5e7509c25c76040637d6a50110e8ece957371c4600d382372b89db1427c97d8af57c5ab9b1f2ddfd1ce7c6fdef2083996da61e00676a79cd0db2a6436939c33086f752bcb0b343551f6a29c258053b7e17ce1b09f54ec15cac7333dfda71e9b4fbcf740107e76ebd8d5207da82fa7b41d8bdc2d9a284dfb8e4c2032e7913d5703743c436535f3bd0df97f961587dce17a2403bb6bc3bac6a97c45a0e32573c81e919e0117457af4d693eaf239f0958cd9a2d44640ebe107ca0f34a6eb7703153c07b5568c143d211e9d31f1665fecae3c51269e472160a89c48af0a74123a9f743c1c0bc964bb3787646d307b1508c1cc31eb2ba4f6271c5522e81cc3442315945a94f89ed18aa5c3bbe2c552d55429cae27b946664a33d35085dcadecb1484a3e25e5bb409c8a238cd634bb03c80f66c7f539eb41513e06d2c7da5418d9ead72477117e7ef732734d6f90424a5d98a444ae95d3b09237b022a25d09b9de4c47a9a1b1ec5474a19a9e4f53a9f0c330d71651f8071f39b0e806a1dc1646ce155a0b4708076238f9e269802f707f0f5071b1a3f97bd63c9c89501612960a16fb6a2b74c183ad073c6bd59123e72608eafb1423fad10df3d3c2108de8f38cbd283c220288e34019bc96330745070a65410c523e5423eca7fe43c09edf732ec3ab8439782ff69bd27771f4e88a4c9a6447df87f222b3af22975189fe9e0741626b0b9ba7a9e81db8a4f887964fd8cd94e90d6806648140a39f2dbd76169c3fcc743ad776b50f89e9fc4a6ba71698fc35aaae3c9eb0d98de8e29efa0f4d07b59451b62600af56dd95a8e5b461e57ef5ee0ea3b32b5d8208b9c7c7e68938d86fb9e2500dfbfbec2b5f309512d4f1d145751f5ed00b73f38e9980056e6b8a6b02d4eed3b6158a61b6505086d5b1900e9b168e9dab5bcfb63a0018facd763fa6f53de39adddd9cd1a6069f0ea28ddd9d7ff2f37e6ee73d31cb7526c1435ec97eb6671f7e7908871a6570a5a8641c93cb774d87b18d435cf3eeaff0155c309286a5ef54b2a068029911820896facf98d1fee9d6880db48a3158be42f3243ea88af5df7ae3b9cfb2bde9bd6430006c8685ab59579104cd32ef74f6a57341b7bfd9bd89d4b697c496859e307a830e225c67ab66817386f617e4672f7a91039a7dce039ec5badf05d23c4f9f64744744cdd3c03832bbc99f7c19e60acabcfef41258cacd781f5979017745b10a10ba824606a10e2648ac4f97ae7af9fffb80e3801106ce9e1b264fa86e3b3294420564a65b5e02fb4a79f078a4fe4903c26cf6c9902999cd9b3a3b0667172a30d205b94998356d4ddced92c0bd2ac68afa9984c271f6446d66fc9526f064b90e9645b5b8ecfffe179e492ade63b51fb77f7d0b84ef059f077f135761c7f9c07b0a4f429812593dbb16155489a1a55be6eedd541dad3003f9e853aed5625c6124d345e71fa7330868fe85debb7a0354e81a6fd5417ffc120a9a4c757ec424b96fc6729cbaa654c89a479dd9e453c48cc16e5321441a9378dd5164ea34a34b0ba92faca01903083c0b21c46670bf25de670056792534bd0c9c7f10141f6425c4af049 +result: fail +shared_secret: + +# Private key not reduced +private_key: 161bee369b620e7891965a391bb99d9933bddd1b407a647dacaf89f1fe650904efb62576b3ccb404744d2b6998924ddb119cb1bcbb97c19dab419ec1d15454cd0bff0e28eeb67779714eb47069680b9f9f85eaf52b34b571467b564ba72256867aba61d9be4561b7a6c6dcdbd84ff7a3f5c841df64ca45cbb4d6c52a3f9f012bf235b83fb8158a3966643c5664e4b4d28b784aa3f84c2e2ea6abcc5f0bbb51613f69649f9fb3296b3c65502a34c409ca9ce0fac5376ea77a6ab85339364f0a999e3ee47958b01276c31454c1451d989186496a5aa52a2f3cc1d460a729a5d527dfbcd3c743bf67d5c6aad204715473dcb859f55647fe928cdff59de5b52fe966c742731cf23ba3ac0d9553e803d53c84a19cd4d657167a766d3a2e467699eee7e0e96beb199ebef57ad25b91be9bbbc314999a9d68d4f56316cd5cf6a7f7f7ceb09038ce4e3ba307fcce081669c7f666934a9feef4465346691546dc926da57388eb0be59f23e8e7922bb94548d2518b52250b5bfb1631f173f7eb3d552ddf6725d94718ed98e9c4d55aeefdb67680f52aa19dfeeef22641d214b1d14689263df7e68bae8f4ad034189c255fa89b9de1b10ff9c2f4c6c575ae8ab49d9ba5eb7f534c5c1cd2b95cfeb2def0fbc6cab49eac02e7eb3b6eaedc75f11324e29ce950f4f8f531ff97f1d6b8b9fb6f0d4f3ddfa842f5f6667109caf5ac5db26af6ff46a771cbe731b855e909604dc4426d1598ba26b94fab7188ca788c1b473ccddf7433fd787fc196e3be43dfdad9a9eb156d661c85a90285952a5565b939dd500cf921a84eb80680c5efd4981851882565e20455e707d115289033de792ee5475c499c8bb7d1bc094cde789b7647536ceb7471db9e4fb5eb1b0a97d2d94f740f4e83077dac6facfa13f89197cd5e9df901e34230d47cd5b469d30fad64e98f612cc287af67d17596bdae634094ca34ed9b9fabb5ca27d9218d4a3f68f33fdfca6246fcdbb4f4124f75c1faddf1183c343d3efa559bcb7d6fc78be6478dd58708b5a97c6f18acbabd1eed90bf30ed66f65c6cd13bda6defe9fe77cdab04fb8b1e07580743f5c8d6d465678537bb5ff489f3b39a800cf39eb5686b653c9423594fd739d745d566acef735dfb4e9f7454eecc53b60be2be4d7d37e49a3155cc366ecfbf8f50dd2d7d3fa4ffcaf3cfe62f3104df475d0aca6809ccce5b8d70c7aebd053f4c94bd2b66c9e1eb68b7b6989f6babff68ff86dd8b3926c0fef7ad5ef6ecffa8fb6906899974e2514f84e65bbe781f3180f78efcddec41b8f62fef6765d39e955dda1a27ce4b147ef6ef5d314c69aa86353f9a3933b73ea23ebd7f0efa79b863ba43ef151f386f87336b9d718da6c9275f49cdf5e8c39ba4e6ab83ab53c2d2c846f53d41c4855d9309993addbbf897f2d873bdcf5bbd745e9d8e05d355c7a18c0bd5197e47ed7d6fce576ce9fe392863db4336fcaf6e8f09d434fcff9fb548dadd29c3a7a9f613733fa83da17e059c67297598f44fe28b4c50bd4ff17bcc7f3c8e516b557beaf8fb08fa71f8e34f3d82bd7497995bb2e09cb398254a13edbdfab5a1f3234853d3d67903a64bdffe528963eecbcedc68e49deaae0975e85b2cf588c4d6691d371925f016e833aa5e84da5be0958c78b2d4ae2dad74678ddf62fc687fca4779c5d0ab9d4a0d95c93464717b4cf1e58b9e4c133d793ca5660348ac0e98a81937a9fdd0225b87284779238e3b9f79325f788bd91fdf0538d1fc079f3e6d4b3ec830d2a4d7aaacf169bef2434b751085804207b2916fb343fb904273e9998a98411f32f4ddca1b475d1575de7e9a42f498a7995c4bdcb893d09531832a4fd12c8874e4c3c76dd5d7cf7a1037f5a91e3d2ec9663b5df55fd4caba3f8b232d737f13aacb4646b49f811eb3ca733d7f8a9e95261d7be84a5cceecebb9e3e3f7b99d619cbafeecab89bdeba78c688166a6711be2a57f4b2c76e351574d7b1ba6b9265948d5a573bfc74a8fbb6f8546b8684cfb79e6caded93caec20509fbff8dceeebd43a04b67468335d28a8eb34d6c7279d700f7f4d773b40f4875c31bd56f9d4ab688888195655e1fdddaac5d1c3dd32a9b65501b51ba036ba2d48e5fd75b5c2a4d8b65766bb7a341247ee92fe961f4dcd29fc6c126a3ff9f488d467212b3141c2441f96a053ec568c7d2b7e1229fdb620d905119a05690cbc9564bc9cad3a66e05f641302a38ada62e07380ba315acb5a3af9f02aba7811726a3ac94723d6e66428ec8576718c4da712846d450cb428571b1786267487b353b37d984cadc2f51aa6fa58c48b011360c5b1989e104b99671ce2985a174aebf31cb5f803d29d93133d2ac1c9851031b21e8da4021b44b4064ad7415786022bdb27a187495908ddb6109489ca2a67dea269493986565e33941c1012e5504f4e5abe662235bca3a144c149d970ef3815079e2bbfc26066a7c8dc5591871e83731139951a262f9f7a2630c0e0fe635cff95b792a6b9d490f0ed14b125b652de35cff994ef341a15bf57978211ca4149fc389c60f915edc45610b9c5883080e96d77267268a37b4338ccca90490cac44a61f2795f943a25147a8943dc545c0805e5d39b70139bef006df10c695cab9cdde3b7c3a2afe823c709936d7c3818584abce96950c06b248b858859bc2231622426078e480074bfb011baa6b11336206425211c71b48d134b7b0b1c960c9429829ac5191f8f8aac1ed70bcfa4342a362c68a35591db506f2b69bff31033f5ca4654421f48afdd736e25d810add97f750530c443618e674a6691229c3a17f3b19e9d3740ae4a6aa6b77254b27374b246381483e52624a473035fda0eac427cf0f7244b3b8fcf4c835df23cc5b729bcb1285ac49529c1241977741ab15c2984343f5139e1219d65992ff75637fa3a486232c1069cb49269305057080b535d4a624bdbb78ac18407fa8b48caec62459b80cdac45013403adf41038fc0b97fbb3b9450e9953718cd82b4e951b3628c7c1fa39f5629dbd074548d156437253ffd92f7de9b292b00d1812cad1ea7c26a295e373bf80fa6f173b68e7149ec6a454db833d00fc462472ac51a208341a39fa8ba8f7c8243987cafc65a48eb30e729a033cd8929a746ab6eaaba19388e9246ff28355bcec0249fab0e00b722b91bdee0b8fd80377509937f201880239ce9c9251a9d3b48d455884e98acd948f0aea095155b360620f29a279116ba08a5b5ccd6c86e0e57f4b33c5787c38b7f0b924d71d7c06c58f932d7c68422085c8e365c6787b8069d21f0fa5a414d44267b40a5f629b6cf82de5588b7e828868c5b6ab9438af030983c7c37c1032be605936002558e161ba0bb2b1b4c6b1fb5fec029ec389a375d563dde64eaf7b95e4a05e2cb7b1a4809e4e98893fbb2d79aacf0e7a0718a322ed8296323681ea398981512d04f56ad2bc10667187b2ecae2e9aa5e2922fdff22eb9651c37c75f6ca87aed6213e0048e36984e2b9b6936d61318da6b7db7c8b1538754b997dd325052c21d22328f03d5774e711a51ac6d3c333f0a529c1568840bc92ad42603b4a361197b36681722d45b497cd94f73d90fd48570b445c4b166a02c5a3c5928bff91545053166f0fca5f7b2229232a301484ddb25854d522f546c477f43072814668a734786b6810770b227487a21abaf17e79dfc365c3843363ec53af3686cce7429104740a327ce441bb8e3736af22448016b8e69784d3a2c92e0f1787e818139e19e95e2a9db2b62164221d9b77ab2ca91dc221ba5533322aa772459c6c5763f24a07c5b715197a20c7357cdbcc18840aa7af18c4684e275cb3220010386095259c4fa71f94662133622a2945d8cc6572b2311a7fc0e1091ce19d8c5d7913acc490e6c1751d5aa3e5c7218ebcaba43a8c0f6d78897c15a20a87a891bc2ca94779525499a2958a60b4878db537d9b148c01b7c2a642fedc0624e594cc318a0fcb52960526af556198fa028604a9f0181be16399edb84b38405e33b43c13d83e54483418467a57f8a796b4032d37a744fa6200b0aae04899c6865a66923eb173906b26c33231a90044c9c4d5215117ca1d50cbae1120471c0462eb1247f07a2197680856428ba494dc721bdb3760c1a97d2e59735bea6064650f55212117659380052550fa311599923dec097cb28d601cc4a117269822a2bb589ad165a8587893bec2b0e22030dd8736d387673a67151b249c49e7abf96960f5394fb255be8cd9927152211613c5242a45e87028745626de709542338e131678b871955582014f1074e2f8be14a634ae5c40dad64b78352febcb21bd987d7632c16e03261c4771bed2bac280f77da45501c2ef4d97f2faf650309211985bbee4c3a85865a7ea65e4729daac39a47c305ad3084af028e66f759e0e22469d0386c10bfc23a0f4dff8e56f68440836a072412a30d851ace2c7c6f02d60e7a8420001a63e6c6 +ciphertext: 7b73df5d74dc99937afc0d6f6a0ef62e563a69bbcea3a3fa5ef58518bd06c122995eb5c937494315af7b67c3630f29fecc06a73c54b951e159efe8d72118352879a6127f2a640c4ada847db224771e3cc45bb9516bc72a09102cd800ff110e6eb37e14f7a15a51d9362bb543dc8e783ed874198a312f9894ea60d707d0e9ad04727471f40a9c19bc4b9197d48d6663feb7b2cd9eed42eef4490961e6d90aef914bd5f48b449f4519659e12c4407ab61544da3d063271e4b1674e3f145aec8a9ccae7b458b05c3d53e0f99e8f138a3387459df53289cdf5dadaa3a3dd2ff6f190648fc43bbcc1fad38a6eaa013b7b09ad69d0c73188522ba07ed82e8a34ca49a04d056f484155e2850c978f8a5e4f026ffa7aaf387d1c14a489acdff0bf348c1116fab4411f2b0af7642f88e64778644411d218c31b55503bb9f3645ce3f6b213624a3a8e646e157edfdc2e30a764f71b8c23fd95330805d4b2ac13691dfe436fa58c3d3bd05765f2b501b9ca82d50c58ecaa1f0ef930b20919eb1b00ee2eed99ef61c85d22cf2f72324e50655efbad70a87a8c8208239da0151406f93d39ecf642f0ac388f6e7638642803883f8acbae1f54ce221675a4efc9f3a35df05488fb1def243bad65057646a5e5827fdcac36bae4ca16f66fd4a3130dfc358a8d07468a6b9843b56a02d9af6befc9fd0ce94f3db71769bfe19a3a0066519f967fa786bd397b33d3e930d464ad4a1034cee019fb86bc268e91c9d8c97bacf53940d906bd641b2b67e0de90452052bd0390c45a565fddd931deb1723edc2e1a486e32cc51a8442e8c027892c1e7f6fe6eb9757a1aad7daeee6a7cb834258d2f4453e367db1a4fc9d1eae40a24b97e8b29edf5aafa7ba86f4cf8ab25dbc32d8287cadf895ca3ee539cfecc09ca4cd8116cb6c0cfb62a6d9693e6c2bcde497129213bf13efc82b0ea9aff794e18409bfe09b7487083cef1e33a59054414dbc4e72d264f390fc945d3a54e926763dc866bc92b77a6fdd82a285e69c63cf4f634b6d4f97d088d3f7a8e53cdd8b8bdf21acdc23adae7feb36b3f14a638fa5b4c1289718172d11b5e8400549929fbf1dcd7c5d413111c4dc4857110a5e051d7c6250e2036b49583322e99edf2d9276fc4447a9581923a086a59e4ef59aef1d480117ab5fa76330797192ef0f281f3c0a80d1218ad485d68d5d36724418ca7d50a6c4936b692790884bebc9e1531af6e3eb74dadf702b31d54ee524bf50407fe425dd05fda0a4e9fb2ce40ecdc326688e5c77de894377868bd4c2e2139b474e37f2c81d5cb114aa7a011f4245c6db4ce78c723f24969c0dcfb8994185663fb1d2e48e337706a2194ea212e0e1ba32c8dffefcb10b4658167dfa163d4ed8eba694c7491d4640dc7dacdf23de8f7c7338616bd684f1e514308a1812e04e9568e857f3204170e67f105f0abf43459e9d07c1a0360031b7fdd3cf03e75a358453154e29f211f445b202de15e190801a1cd4a56e7f3c52d26423d1d92fbcb486d6580d8d2ebd0a3065d2b5c343247384804009768aae6be410ba31d0189c9490f738756eb4281b205ab8bb376a53b72c425492b71ef5bc181d79b540cbc3c6337e4b8705c3063e1ea4d326f14c22b4ac67e8f00d11702d02ce1f30045453af30efc07f53c13de8d1cc0197770e094bf8baaa637fdc544850b870d1bcedd4c56b88fd8e1dae9197a14665eaeb97e11025a21fd21e6c40ee5bfb3f6da5f6acd5b2b2e47e78fdd7c777a1538647a96896ca51c0f1dfe06d3e5f293ee25a289291b664736160d9d925f5d45073f4e6bdb39f891d07589d129fb7b6c77113aa3d3161d45f6bdbefdf494a8be0e03c4ab518ea334941ca62d4babe3f5c79c814c1abde6366154f1e82ddaae9dc970daf395bfb416f6b8e33b0a85d131ec429070737b1936121059cad2644c5d759ee1d1b646d53993d7381b84af391145e86084b1bda89b0c71171b8ebb3f2ceda08782f8a2dcca9176e651dc182f1d888cc196eb45b2e664d88a3562df9a0ebc24826de5b7bf674139c961af36a05aa71baf645aa353d439ddc81f4d18504f711a1be110c3ec4f134ee17cfeb3d60f85987c37e966f887cbb3dcb914070e1424e9232920cfcd48360c217416d9680a9e3c6f1009302fbdd7f49e12451da74794e80c623c5467b6625c474646e2c13d1539cd8d156f4852aa6b60f027922e3e +result: fail +shared_secret: + +# Private key not reduced +private_key: 42ae74fe5ac2466fad78e74c8e65930e7cbaca48950adf6ebd09a742548fd3c9d407bfb8a218bdbbe4a5223ce3dbe576d38cdd4edfdf3f4e6dba4b78459eab7a534d28c9dc722e589dbc55bc2e4af6475853b74a4c048885a6ceb5184535a5cffe6c3a1c43c305fac42dae7ca7f64a258ddc0048447154cf16df5636873d42cdb58829db2e0e78f12940f5eabec85a59fa0e79076abfc3e734973b4074d7f1a3e4eab31465392841ec5585818eeaafa93bc148fefa153f5bbcffab9ce7eb7872e9d3b7b6fa94c2faf0d964388be5e44c237772eec6a7f991d37a55985d78dddbb76499b6b87c974bab79ec65e3d839cec29f6ac9c5a7e45861e1bff6e7ffb00a95bd53ae7eeed93f574ce9724c593ed7749e64f287b6fae01a40217372434f469463764987e3464d8d290db5a03872cf6c70ce848b8dafc57f93543bf7a61434a48f53633815ebddbd92dea6690ff3b6ea99f612ab5473cdcb9e7987c3756548937e48afcfed69ad4444cf3534fbbd1b7d65fcd2903ee6507ba09dbee4e4cab4bcb736ed6ed9823bda5a0f70d3268de357bebf983171ade85dc8fb6c28cd4d7838d9af368c9a31576eb3554b43a8cb4cf376bd771664b5fafc50eb929eb768bb685812ec4853a33a4a5e9ab99ceff8d4cf38bfbf5b97c2e1afea0d769abe68c7e19a87b50a6a572f8f4fa4915c2e92d1f4f25a58b3d3fdca24ad5dec8bb5006f3e636c95fbbccbc5f86d49e447d11f4631f52fe575652f88fcc5e3a376bc868695868d17b254c797d8cbc543343804c7b5bfa731e03eef49cfdd0a3db19485531c678328ac647d2f60f616faf02cc2c1778833b6fb4d4dbbc095b286ef82b74eb75c5cbaff4ea0ebf88b3cf890b13b5b8b13f177754763454ef7a4d3b7affcb12fd13ae8e0cd6875759693b298a57e1d7b8b568778e6c493239719c73249545ccd15f0805ace115cdb7b936314a6af1f37bd3876322ad855877448e5ba7162cb7c7457c8d2a47d129bebc96d3a61dd6b044c7611239ea91cdcaecd9a4e8c4cb0ab386debfac15cf741bb7ccf7cd387e6966ed8f4691855cf748b690e34535397ed4f7df2149f270be5fe8e4d4713edacc858c52a5b435b6d9b8c8f76b4dec0486d2c77db5e4878adf7adeaa9b753bd350775ce1b9b590a9695c4cd5c2feda6f2064a363664df04e768c3bfac27fe1ba87e3d3845d21e9a3605fd394cc328d8ab249e460acd58b807fc4f8851048868216a9b13c7cc55177ce559553bdf8ebeffc927aca49cb9d143efcaef59c9d457387e8ec55739e77c665de9dfae21453f91b7663b3bef4304bbe02499f79db95bee8977bdde325ec570c479a6e5e2afecbe35afa2f2b7cfcc13f90a15ff01ad93966d91c237f9e67d44dc066f892799baef63dd957296865e0aafc15f4ddc4ddeb1d15d67fa1483c6e765c65e425efc7d5b15517be9e1179afb979fa1fae74ef4dbf785e561a51c498ffcc20f039e0ce74dc62c3a573d3774449662fe71487cc2cadcd71bc3b2cc54bee99332d655ab4e6b8b9a8351397a398c484ae23af9a4187c6f5690bc84ec23e9c2af19e6f8f4becd73dd481ed40295df321e930cdaa5fea74e3748492e7bfc589ab4af6ad11bbc8ccf878bba37d87214d8cc56bd83859e62ab95dad5c17da830111d933fcf7d190df418fcaa9fb5336bfb608cba4d0b59cbde5c8318dd9443f7aa641886201b62cc4bf33903ba98cca9a40ab8346cedd886bfdd87cf6fefc50bfe5bb0539ac2673d0ffd8e58bb34e3a831980933810ee135e38a0cf532cd47a45ed7cb95bb9420aa62f779345b6c851fabd9de8c79ee1a80726d763baadb26e74ebc3faa304f97413e928526e585a7bfb607fa4669cce51ad44bdd55d2f747070aa6cdd5e95c3fedcffd5c43456dd2ccec1784b397444e6eb397f35b5e4cb8aa04b7f07633ac1526bdcb9591494554d03557cf6d820335d08c4facad36ff8a16fe1beee7171ded99e8b3a1caad0226878099947a35e1f62a333b1b97f6be654a35c73f0c69fe9f531e3fa33cc5dbe67d41ae97de160e9a103dc35ecc8f33ea39af2d9d7f65c5937b5be1b8f192c8c335f35b36d6cbedfc953fbe40e29ec81aadca16fa8775d6719226ea3fbea509bd695e6e971cb9b4cb6eccb459b8fc3748d7c9596a93a88b535a5cd35cd8f09ec13054176c506d02a7258a84eb685d14c3352f0b0051757c30d4184ab6a37bb6058c4451e89106ad2c259bc6791de49ed9dc0bf62bab1201429035c8716b864552a26b0549b1832a2bb01cc8f8cb55630618a525f885cb6fb407f042610681428031399e5666d56a9656e1a530460ab4178c3e957d22244b1366750da084f572399a33bb452c7c73f3cbe9a7028cf3849b475606ea2c96958dbef17aa08b3f15c146edb65de9379f62c11226f9b4b85802694614eb229c8ed44198542685610f53885f5bbabdd95c5597f89d825b0f441b21aa476ba4970be900a2f40cb742402c2093803f27ca37d06347615131b81fe6ac6ac9249459c92d92133870111aa5176c6bb828a4198c865a1730a84961f3914379bbfbeb46411c1705bc86f8a38a5f817f1b4c34e99784773051764b3f55d38571e98d744043287a19dddba7d4eac3f0b98173d09f0cd10b22a0bc0417a056c66064c906b7559ab134b6c47baa7932540070811d3ab8f5f265822873b4c78af45514ffdb6d03d79c24a88531d4ae7230486977b612cb05b906ce19337ca1f0455718569e80c2c2c795b7a156e60c5c65fa19fdfb5e4fd96727947fd66abd94774a5bc45fda822146a12b67534ad93aabae123af9cba2b2a376608cc6335aaa99f759dc964aedd80e432c6f417a1a65c63f639b5312c35038faa9c45051ba31c66912538fb51a85189d846b799d8c2fedc439ec8685b547376be49a83fb60281accd733001d729e4156badffb3b7dd8cb40411ee7a3970a168357a89dcb75535ce341b5b47403308bd87bba01f5cef30634c9d27d56da4d4373234790acbfb5051ca2a8519a42e610269b4b32c64770a5db4caa1ca6670c432bd74745fbba2f22377c729446954a6e067454639c3771aeb626871e3558a0f141a37c2732b13b13532cd16462f7822ba2869a0b20717e3675a328625da796e12c4403d380cdb54930db78493994c0793fd67b0a91140758fb78d229051e696c8707cf5a1c40ef511123b7c6de51ba4b792eda810762cc114f716c66a79dd4f5b0865a1a2a1144da80c4106b72aabb0a8f8036bde19b204992dc600956ab076ccab601f4250ac4b2cef77c38d6b6ef8907feec307ab29502b269dbc063e337ad43958d893a36318c6c052549bd907313c2251744ad02c30f78d0b394635508951856d1160706cb042275ba20a4bb6a734f9856aeba164af669f43c5016f1305e8084389581bc146168c0914d1a65ae5188e19082d585af435c183df28179c6b2278491dde450e7b1bf64075e0a9a8301454b5e111e39b0cced002680e173c5db96de082c3c399e398210c974b6f47449dc9326c1a7a79f893f454834e6ec1bcf0a860d962a4e05a1f51825981b18dc4ab661abcc98d4313cb40baa402307895460139c75b6aa69e27c5e69273141487b849a42996a55788b3b42018da0ab1c315d10308f05c54176d727a04b656ce6859f69471a186a4ff6b17b877070924758c83dc681292bfc7618f2b75413c79eb9b945d1b2aef95a47cb21cc8982f405739c9064975b5ab875ae5ddac05a65a43cec4ed80acfeb15aae898b995e649f32b98613c77fb926879ec940bacbca0696cf6c6749604a1a59979a623477be871a2278d22134a95ecc1b116c48340c6c6981adbe742ede1426bb65b942302162b8164352f918679d53c06beab47f07c8a37aab0a7449d45e01cfdf9422a783e06f645353cb56b8c57e28840e074629bd58b5646cf1c96003181b915a71caa00a35fb4533df22b2367c9bef95ecc85359a236e23a425f9c975ef842ee20228c66673f1ea3be278b0fd43ad4c004655532654598f34a257bc7c81dc0999266c8c2f40a4d9364f602bac27145b5be7c4fb0759288761ccc586b9039d6ee57858a21a05676edb52c937f11c35fc091d3baefccc15bb953bf5c50b95b449b8db449810680fcc53169bc8403bc70a5b2e3dea7af89aa0fd662255197360b8c7325545b7f45f2dfcce05d939ee5556f5c63cef52cd68e8399ec25726a316269374eb94bc3884011c89890e828b5c726d149cc3446b8a12d76c35545eecc7aaaff17030a0cf9c993e53a88ca000116c2b206f0187f725acc696112b5c44976a22ab617a0c42a64d03b8ce88b7a8aa7cdba28a197a5d3bdc64cf089f922345dae5a7c6bd86d17444f21dd9b1a5c82b9fc906c4ad49e021cee8b1f3fe43508e7bb3b567d02568cc93c39c3cc347e2dae6e0144714d80cb28f7e7a15a005f92400ce33db073d49b53871594a88fc45e0f94207b5f0f2dc +ciphertext: 1db1afa16d8fb4e47ce58533e1022da2bc47db14d7c6e7afc7865fde201719c50f722cd79c2b0da234e075a3211009efb905d45fed0a83548746a9ee3159052015761baf021f52f9f9aa19f495db0dbedc911d357130420a5ea04516edc2ab8406be562181944b816458e815e0958653fecedd6a19193098c301a74352fc2de472ba7be44a513807096f7a0c42be557bf3f831d628ce208f33d5c797da2166c95c88ddeb42c7d78ecc54f0088f9e76f1721a4d7d088dc3b5bfdf8e39febfaa0e32c4fd4215c4816731bb515a96e6498846fdb6d58470a0148196ee81d3b7c8fe01f6b0ed7a20fc3f0910eae4656ac421448aa488a52c06b1385d4d1d73389e724d05720bf3cf5c7b863a0791b864b8d978f5fce0403263d73889aa0aa476d8a760d31494ee6a69bfec705b30a5bdbfa3dd74cce40c0ecaab83db1eb7172ae07689db456c33902175940c66c18ea93eb7ba50948cc27ec47100fd60404302d607b6d1a9374ffcd6cc8cd449455baf194cc71888463ea98ab3aa855546696c4d0b38c3058e97018cb27a7269d95c3835742de93d05fff40596a60c1408018d8d59d41c8295260ce51b09ed49ac79ba2115582309ffbe504e4ad56fcdedd57e544a0ba8e09638fc8da99948ea71d6cc75e2f03ff766b03c768c50cba64d8a3bd961161fa3466d5cefac84e7fd9157fa37a0920fc411bcaf0ff85eff2542556d02945b71198ec612908c02b14f9fa4905e1270dc709fec98841a5b3cb0a5b0108e2fcc0ee90403429110440f06ca40da8869ea802145f1cc2588b8d7f2cad465c3384ddaf4e0b7ceafab3b30e1d70d9eb812902562b360f33cf80546e1105f2bdd6496986324eff2c11f2e1ea54c66d1a082a8c19f705df7ddbe69f9cfa95431a5706850fd9a5a395571839ed73e2c19afadb4deef4dcbca3a75a63c83b22dc81466b09e4a4ac71c59bd69a6123f1a082e536bf1accc1afa6655e4cfe66e9a990e1a5b96a52b315fc08398b9958dd5965d5dfb4abafb3c63a7ce553c372d5c97e59aca1a6fe330db286ad684fe42c4a56d5729cd6b68b6b60bc924588f3cd09d95dd504773f61ebef4964199d183cfc04dd580132e1620b7a412a6e210074aaabc788381e98a9ff5f662bcf9214903681e255173c8db36a16388186456142fb49010978a984216a1d0f9afbe810cf811b01ab3784acf9ed2cb47452613ec2b154875de5af387c0ba3ccb0d725a0ccf2ef470f670d96bce6a5154a3cb7e78d786eb8a01bf066dc2f98c190273db023035ba3fa9217d366a6c5b421920e61ea44781715237b561f08471a2b98b58c4f0f45e30211a132006d089417f5272fd571de7520ce852e76f367ed4262e93b26e905ad8c21b92017dbf2bafa11b1a5fe15ed1162ab3392c23a930883ab50273aefea408dda64580f3665127f08b468bfbbcf702a0724b85f4a3242c13a16c15917f57a50fb63e0864975c0b10bd6e53e26cbd089fa7ad92172c2c03abc151c7a62a342963debf3ff960ba2beb2ca796135f3c54ab8441e823eb884360ea6ca9f81977b86be07feae2afc34c422c8c0aa76229d1ba7dea4ffae74149f9af18efe2cec31618abce5cb9ecba8243c7c116952d2439a3766f83ece57cb8f069fd5523b4bff071e844b7c3e0dad013dafb16575498d86663b2c8d8adb379eaf259c1c39953ed4b6b3a13e7e92db9a57a330e0628633040fbf324c1a86aa1e6bc9ffcc2a1b76e42fd71ca475997d16d385f02a860a001afac2e1ecb6d932a80e157704d6df6f3b3e9774132f9649ef81e4970e69b5bbfe8519d1afe7fdd03dd5d59646d88c3674221d1d2959b5806bde1339e88ecd181411b6776e1c2a8fc4055843232c9fbba7f26de53c163c6438e31ca5184e075510774b933f111f74a7931f95cda817c2c4575065d109263d24e9ab56941ca9ef136143e7f46f33b35c486efb2ef8d915544b8dd83b3a5dce577fa578fc90d7d01b6bd50f1a49bd245ebc3f062590be903b7a421610539cb53c8154e09eb4e26b6490f31efa406657ae5f37452d822acdea9040db94a1e20adc2f2e6ef68ba390cedca1d3df89556c6f4460528e04ed2cb4436312c50a428f096de7218633a8b1921924c96d64c32a841dd894da56302b56cfc00a7da32be9b28b94d7aac13a00c04c98cc440d449611fa0bff1d43d9281a52bf230d63ca2bb14dd5dd1d8646e66 +result: fail +shared_secret: + +# Private key not reduced +private_key: f1594ece355ed897f28004f3ecd4b02c1c9fd37e6ce375a9c02be72b3c735e59d8dc96c1a58945e718e3250a95c1d48f6cfe59abaf65da94edeeff3d0bd7e809c6bf16856a0e3e6f59955dbcee8a39175295d5899b4abaeeb6a7b309f77426b6191cef3c7372a0235a645bedcb577065a6a2e6dbe3108e50a8633ca8f388ff6935c2f3584508c0da3898e6aebe4245d6e71f982e9de79c4cc950aa35e03ef44bba78e3bf4176769c935ad20554aef4d43caf04f13ed5351b08f36968e4cc0ba1861af7032cdc9de66ca3675ecfbb3aea48496b2e79e71f4e755656f25efb05ffaad353c93dbd68911cdc7346f183063a243e83db38d175cd648c44f2361954bf9ee65148dad3975305bc6e09b9736faeed6c65d83f63347e2584e7af6bf43ddc7cb9c1d725f2fa87c684bcf08b8eb3f11f98ac3e5773dae0d8243f475d55d8489d5ce385e7c6c0b5cc741d05fc7f6fcaf745d9ccc8e4e9644f6c35bb394a4094745ba69b6b8f933b715581feaeabb0f8ac9fce5dee8d3a29ed57e4d87bd7b9c53af6b944bdde3f694810e3878e3359ac1d9246bf9a962ac32d2ad6697fa6874a4e3b7f35c5157250086d017ede2147f218859f818fd7e219e1827be533c851034d54452de4bbe6e8e75d56576aa6405ae499d9f68397feb0be52fb3ae720fd2f4f895f3a4b3d9becf2aa6f7c6095957f86b41395b98b947e471eae496844bb3d83ecaff8cd0f77ce2ec051fe81d79bcb914e6d4d5c5932f5643766a3de1f95cc38d5721b58a0596a371cc1eb69c987cfb230f4ab6905468ce77916d8e6df1b7668e6ac5bef429cf56a9fa6a7327892556c58ab6bf4be7a9beff69ac35ba63b1ec6dd15772c6dedfbbc6d1437cb2fef9c98779131a56a28258b8de6f37639f76894af0b46af6ed66c2c7f72fb3ba9b946d27b43de302db0814af40d27c7af1d778b1ad777ee7751f85f410c373a6376681dd7d8eb78a82e3a5ebb8a8aedfcca0fa62dae5f167d9fef9caf5a558168c9dfae5b5f3919f59184c20a0c37a0196a38cff32c34a32704301cfb56066ca60aa65a6a459689bab3291e4e731650cc79db805d814da97dd2495302fcb61ee375afa57eb16f47277ab8ab96355ac4fc887e4ec71fdfb6f95f06bdfe679abecf5d69356c70d24440216feeaeb6376bfd630edcbb1b655cee8a734d577353d95e3f93bb7e7d3a63a9d50f1fc1e41340807cc91e274971ff7d7ec86c0e7b63229da65e886b53fdf827795a8e3ba1adbffc80e5976556eb128543ae34965a2f876f2c418a47cdb457e6826dc12cbd3e94fab4001ff846ee5bc17985a38c7f3c6b6ac365adc1e8744b15334079bf0b18ed3e2a95731e950199f537cbdbe15f49661a5700bbb269fe53603aae095dcded06a4d7b548550797469e41beca50dd6d9111cfffbe6ea2ce84c4d437663cef7cee1b8f234b4e58bcb3d8b63295a5891fcea63a933420a33eed084626f83dccc8f002d844a593b69329df439e372dd6428c7b90bf9a97019b7b1f9bae23c87f152b6e514554cf6b97046d4cbb2c864c94a024d54b7f4af709ac878a9cfa9ea74c03f9a028ddb4974bd62a45340efbeb08baf237cdf1f9fc56767f37cca4e1ceed98aadc935f5f832d3a3101268ca57b566c28d4ee9831864bffabbb9497833c2e9d97805b3d125c96c2eb3bc37efdf31e829fc842ee6ca3770852beb38d48399a195cb91fab32e0b6752836cedf05345fec5144bf8a5defa2510548ca95666c579f36e477e67a6ae6275ad338e3a4f3795b7dfd24d6372fed39e50844cd1ddbe76d9cf388686c0bf06e775951a6a2636d95b2ade9181fe14bdd8193e7e4abd3f849a5a33858b1fa5eb0a0cee5f2f848171dcca8cbe4a10b54e8e364c57eae4e67d37c3baafd9ba276fea4bab8fc595f79ec0e403b2669dfd6b1735c5b7d85c5efb3a1ad9cde8e5de98ea4b4b8de427c39660c04635ce59619b5824d8db84164641ac452588e7c0dbd38b3047c30ec460298c75b73a2f8fdb82b6a658349ef58cad57a6581bada84b5978889ee5e956f952349961093354dfa34c1cd8972b7571fd99198be3aa9be9a7f79f0e5e4ef516e3a5c2a6036b79c0047e1404ea3146ab6d723518505e626f9b56456fad4d7df903d346cf7f82635783b9850ec9d65ce58a272193166834aa6b266f0964efa45c0469249c3fc0faeeb19d1508cb7c409b49a7e38299920c3433da3929b2552d5e9a1f092383e3b4d3d8a16ffd199f7d933eaa506062697c29b1fbf10292a4758d26ab61f085c31a0a3b85a19e956860f93a3ece8a0c22426b40bc8d0c1191754803d0204ff048c07f6c778fc685b2108b0327dba9361b00c071c8223aef0949ddb804075c3a0178f41bca68b676ec8469e417547617c8b8ebb6e19e83af1ba27e2db7d08e11f25805f959285add216c25a029684160a880fd2dc5753709ea3d81a59a91357205cf126c24f8858a3757be1c562c65166a0800047949c062bca79e03836d05aa6a91a30856a367b087b455169a7c3591091e72c96b7432397b6a257723508661349265c4c475ee7251e4cc26d739b33190cbb07a993e5b72288a55d5792cdd2c9177c9541f0a70bf066135e06a3ff1700af24247aa61e70f4727e6a9fdad70c470b671ca31a21d236bcfc508a833714182198c4c41bd1aee23b5acc9720a3e955adb119e9e06fb6c8a7ba5a37bea21565f77f7f037f0ad71d6ad13301a547fe8458c8363feb218a3ed5bf594c3bdc7a03003641da15479304810b5a0c949417b9a8473f76ae6c13144d7b3673074703da0389e82ad34165f0c258457367b5521128ec318df886eaa203e259bca111b68e13ae684b1f1b3781d8305193e094c20b1e91b473ac9992d1e77db85023cd043b147681fc9c2c9c2c1237c27f1e459b953ca0711a318a4b76d924baebf599d9eb852dca1dc5f80191b91281f8345d774a29053513f159164a705c954e53ea26b6927dc57a0fae5a19bd33bd67339e8eb925576a2eabda6b0a4743abe05545e080d5495402eb0629859671e130cd048235f254fff49a7d394f3b1c3de06a7847473119e218cf0944609958300b93046869c026cd93e21925a30da0389e24ba6f08d498748730e2b40d1c73452de8b7570027579c11a7417f2bbc67122c9286d1219d7230ee5b0c42d724d1b1cd4b031500958dc7124177a25651781657904fd1267f2bb69d5c929f8967cf216924d63696627c917f82bd2813563cc443705b0a1b279eab237326b4ce45504ec710ab95d01ad812559b2b8be763c1e9c55449a1366fa2cdb6d0106856b080a16d7e3700b0771a422423c806c62614b047820ad6876d7740b35fd674d99605fc61638d863ce5cc6a55d62f83a4a68aac10ac065657870b5c623970db1a40773500757178f29d54548aefe92eac306fa8f926e5f84b15f339f4fc388a554b79d87325c81f9e9989c690920f018fd4440afca405b1b667e489568121178cb7a18ee2c38e10ad4f5a09df64a76c0badfd08627861144f8a449df4089a08c48cf1b110b443d16386042b6f24730c921643a6f8b7aedb9a7036339f1b156c1c4de7f4a03acb57b1cca827146f4bbc30f17a32ded42949ca5340b0494cd29098260a87bc7b50440ded82befaa1a6c4c28bcebcbb16990978ea92a3709b817996f51a6e080578f2d060b924c5d9b93098725eea946ceb84a0a884c7fad252bfda7aaf374e5ff8703941a8483493a5143e0f9b6f5ef45f683c2ea2c4b5e8b92a46984064b97e28d339789a8654e27e38c84ed7e4cb204412a434bac227197528c6c6e1625dab98c25557e16cb5b8249ebc11caade0b5fb505527d45981864d4abc8e1060cd9a7467465064c9b8cce823b6bdb9c702a7a30415b4fc6979d2476b4511909c90559f70597375c050189ff2932852a51e74a21b32c834c734052c61137025c20708263e0aa71d87b20263bace0c0c98a58cdfca4889672e6b654c003a7e22465f97021ac7c11fc4d1c0525ccab768c6dbd124c8c533f49ba88629c71fd1cb6ebc4aaf09ab6db011348b2b0691bcf8eb1bea9588b640cf3fe97e35e92440284cc9607d49a3891283ac96c32a2a223d1c372b509b1d9401ba6bb13ebd5ccb6c44ba12e392b4d165c4940a714359ce122f6b34bc1344af802992c6fa2d85f1957045bdbda400b526b21bca1a0ce181531c8bc644799ee8477af16fbbfc33879868135a5adc748f88799d23476aab0643e5dab979f3658cb1cf19292ac6f30a486353275cae5fb941b2d49a0d0349e65917b4f4cddb9a976f322d8917b70278ab9cb16ef193cc33b312e1689170532f31b001350225180493d7966e2b216c709ac1bea73f1c624a081620b7981c1c95ae0387aea62fece8e4c1277c5b64512a4b2bb7cc80044f98e2b654e5bf0f4ea520caaae1f2efd8128601c28b1def8d393a0db283229f7c7383152a814e7cefe8ef9d9768c473 +ciphertext: 9014923a6bb3766cc008194257fdb5ef86a601ee1bef6189bad5f73394a590a44fdee7b3792b124f19ad9d5d468d9cde7defd8a741b25a84d9e2fdf4746fd47a7c6ef65e14adb90d0ee45bb269fd513c0326bcddccf1c785eb2b87ffcf12fe00172bc0346a1c19b8522feca6dd95e19f71d8dff6ebadc5eee0b40a74543937b7475874bd327237f6c2021b86e4da652bc6a9312b184ee80ae92a9e5758d2017376352c3cf3e60beeb18b2fa25798b13e88907bff06ac2e43562fe3bf658f0a48f39ecafc5f74265d61835c79d89793841d435ba1deba46d46bdbe95f24b539b0c860796f8b8537c8755e480b3bc14a0fae4928946607371b79ee10a19b49cd7ce8a34179bcc6d3c526c34db107dc24a29fbbd93900abeae40ec107fe3de3289b748794469d375e4f0f2e3546c40c73b4d4f7846fa37caf3d6afa1b0f6eee1b358aaedab8f41c1b74eb5d77bce45f2f3b70eaf15e95b49681569e5d29de8ff9a7afe7ac65916cff80b26aac57d8d88864c35a12ad1572a4f17c6c58304c4b4fce4fb37e51504f6fe2505fb142c7bf6c5b7837459c3ff55225736a263fc5e49dbbfd552efd7208d8f65e8ed58b48d9db43dcc13117bd2f80be9c78ee4162c0dceb49a974975aa0c978d40f2882a1f547ece2450cf69ec2d31dbf271b2606b45d2fb7ebaf324a7e37a57c122f3c397b0ab84ff860b1f8641ca5a957d3446b56ac074832b382cc8189a5d49c9a53a3161a8eeef4f275f290133bf6a3b401df3760fbc5c23c94678b3a552dd95a4b5e45d5a7c657e0e27d30d5bc3bd5e8b78025040d5314aaf1c18a27cfcb9fd19ab5bfa906659aa8550bd26c242d9f5af54a4605e4178689a9405f3a03f15715e0c4e8a9d0b69b7a005469b0707906ca70dcf9d2792aa22aa4a063d87f7d1dc69218c5553cbc0a2204e81b97541039bd834be57580d5938f7c5e170eea127cc10bfbaac51ff8fa2394bf36ae934c92f0869129a876c8a6ea5e8b1173885d6a632f7bf9a0864d8adc1cac3c39fc2ba3bbdac80b608c2d617ed136db694bd951656bc7899e94d69719bba791d028144d857c01aa8701b50c53bdd47a0ceceb58ca6a019b09755190f47466a10a95389b9799c3baf1a55e51e7ab7b070359abb607919899c84ec4c636d242cf3d86cbe8dc76488b6852d5e9695cf03bad089456848080a929ad490ebfc551c43c6294e956f15fb2737fc1cf90b3ee67c38b9b6b651f651adce59de4434bec6d805c7c2efc36fcaca87015d9e9f994de4a1e708dc028cffd7b512091e8cfe2d97b858fc30f077dbc8dee63595e9175d3bf37979587f29256cae0c84469e4c7db00ba7c61b09dbbb512a42935ca55ad40ccd0259a6400eead12d9734632bf78eaeaf9501a77ace2a6f45f247d3a30a80e95049705adeb482a884444a22772c535a19c3ef50c9d3040d47131112c2f71d25827f691e410cca40ed6ad581f8ab0e9cb7b78f95044cffb2d8bf43166b31caf0d4d5902a51239d13bf6d5be5dead1f4c62cc0f5fbb56d1131a73551d7cdbf930daa82c9df3e35cfb5a7dbe738ca215911e0f1229c22e07fdc1037148a478e537d490390a593fbdd921de127fb033b1631a52ac9a54ac072d49cfedc0bb1370d0101ad40cd98f4d1b2530d2f12b98b39fe5ff96ca58024902fb26aba400bbf32983e15ec43f1194d79292839034e161c7ea3c81c9b53e112d035c8c6321ba150308cbc934470fa625802992cbf5d2246da7af70b9e371ce112fc984052ba2fbe1be8884fa85692f343c5be53bc472a9a18c899b157b32bfddbd42f761fea66708ebc3481ec5afb6c7938bf4e3a3c8b6fff32475391193103c53015880b5c0232fffc8d605402240a48653f84a54bd6c0d366455f012d6ee2f0c3519632bb5a4f577668d1eb97d92787a26f86bca10a1eaa55f9e7c6c2a4981c0f7cfa4702fe1f72e4fe112ae248425bdb28d919d5c97ccb84007528d527135255dd8cd5f230d35e137fafcb10f26e2a8c57b941aa32b63796ce2eaa9e0180b6746dc3c1272a855a101026704dc55e8adc870ffb6c7fbc3f41120fa2e7be78c5f46b72a03eb5077a43f3b7811230b5fbf43753ed2d08052414826a715b08189b311850064da249f7bcdd9a179b946d391e6769fb44b7d32f2b44da31b557bfe940ecc1d9eb99a9c083085b62fbcdb4d5e0695f1d1c177acc57d86b68f1aa0ca5dd +result: fail +shared_secret: + +# Private key not reduced +private_key: 6cc4f7a837b55547f99e1a8836b9c79afab583679fcd65663b17a3019fd0d9035fdbe5db99449ff7de4d5e16e1c02ec652743d60268c8aedc75c5b44467d7215b3e593349a86a6d21afdcc07aafe3afff1060aa5dc198611a7d49f8e7f692ca55f3f8ab0d3fec8fc5cd25a83311bb49ec8929455330764885d7dc9d988a5dfabcb1366ac383be8bc866e5b93b780736559adafc068dc4af75f6b6c63f95a454f0bb1076f7a2294af460dfe949ce0766e8b90cde2295deb1fecfb66cdfb5204d552b86a1b235298b535b7a9dab75565f66568be06aea98a6a1e4744c27f8915eddcdf16cf3da4dada784e14eaa3330f6c2f3cb05a7793c4239d5638f81366e70b28eaa3ac98afa3e93cb6a9bb6a682eb5d73f1ec5fa7558c907e4b98a424ff86d84fcb5238b825807652a4eed3c6ff18abda440c4e94cde5344b5d44216a52496facd53f23c5e682df641ff3876521cc9373ce9ed0ee8d505b6e2bf6a33bac9b82ce3b3addf11d849a0843a44d3d61ddee1c34acedb3b98a49874f474fddbac92d969597a635d651d9ba5d55a20968b6517fba0bb4349046dc4cf5cbe154790d3353e68dc3855a7562e5aecd7b9c90daafaeef816135f810de1c088f4483c838d8e76bb58cae9a8e7f2dfa538d694481df1e3d87989f4b31e19539f1b60222df2a3a74df99fa08ecefb03f3d51d4b3ba9144927ce431a87cfd0f5702a8ae27dcd9b93ffa1d474b013cc9444fe37e0cbeaac8fead975c13bf69d6c6af726afb2ac88b80d7b8079c8e1e978caeb96a89f97781dd7c42256ed6b3d9add83cf83d563d2bb3d382aedd4147943f76011df92f77d3137eef7840c9c4b63fb86d46587eb54eb6e3e542645d1156f5b965c7739d5f90b3f5198f1a2be8961e6eacd8cdd40dd9df90b9a1bf993282b7de34aeed638cc9a26ffde57e972dfa5e946b70bccaf00fb76c02a520343b2501e73d5df7e2ac574e2def3e7d663bc054cc53fbf1eccb0ac775377c65bbc2f91c9695b56bff65f87323a7b63980aa0f1485776bf369ec3a3eb6adfd126860bde4db89f8a9618c684c779071dc119adaab2b3adceb88b278a3fceac58dfd8dbdaffc7a2d55b35c8ff18363a3e577737788dfcedc6d995b3da953a9bdcb46b1754e1ae87f97fc2af1bdbfd7d327646ca677892902dd5768ad91f7f7d6f287a694e99eb36a21b5a42d0c9775baafcf7dfba31ac7678dd75cacfd7107c79a863c4ef47aa72adce5b4d9d6de8b9549366273967a87de01a67c3aaca617d49960fd658bbeaa372ce72114bd17e1445fb2d96438d74867e42b077829259d9c709741238dd45a3d561b8dcc487f0234c94cd78fad4ce8572e5becb94e3b1868f7f3941e7256b0138d3317fd05653e911a638838e62eba4c7df9c4c5c537b9738643f7fb04f5cf80048a4cf37becb58a83dcd913ec58026b59136de5fe8a5d832daf7c1459cce17efeeba54106b89cef37bdbf9515f25bf9de37363e6eab6fdffb867bb860af095b3638f1d5310258548a7986bdd4a33a9745b7ec41e783a3b86bbae1f3a4b9971cf6755e7ea7df2a5481d9973c079ae790e747ff8b03043944ccb8b3dce32016856617dbab8ed5bd998f3221be7d8084dc77ab9ed4331df4495013e62c009b24735c736dcac1836b8603c7893cac54caffe50e64310196b08696b42fb8872bd991ae8d977aa3de42af5d6d9e8f2ccdf76b940a0ba85b06fc54a6bf60807c5e77ad62277a6d2a87e42e68e7f66b3c60936c207a57195cd0f4342be7557cca765094cb7d8dbdb04be34cdad578cb6e619d67f44b9a0c0843dafeddfefb3d0c8678ebe8642046c454a44f02b6e7bfce69128fd7c6987ccf0abeed7e7c7b603e2293b575517c8cd8fdf8e2643c626f69f6bc4abeae17fecd31b93588b888834fdc791fbf862abb733dc5691b670d14eb171788c39d5b62aab751b5361ddc4ba7a0a6691eff05c7cb2cbf65ffcfbd830383cbd134bb45e75760350f5f9a4b4f67390e671bdec8e3b6eaf35c79c4d7c72ffcee2aebcbc23cd74ae77b172e5b5dbd3374adbff031bb18c174b02755d8a53a8824596963d5d782e76273b5301edfd7fdfa272f9c7babb545a7ceaa35e72f21d96af5398c9d6c4590730ff05c74d8e308ae5315caf4b17fc738b3d718bdd46d16f7e4c8eb214830be3ea225e8161039550c3c320e6c57220e076224aa8fd48b4db59a30f71b2a2fbbeb05b3885819b672c48393c5fe1865a4c113b736505c1199b807c5e7669b7d2499931d899b21b8c1d9caa129761bfa3974c4a85677a0ea1a49c4ee022cf3048012a3b108b4380f10ad2c327a009717a64704a62cb31446c5c810a5a9928e1e4564f95b027ac251c464569344f0086106f7a4dfac13eb194abbd64a8e7db2352cc07ef52195de869bda087cf838fb42862f6346754f1744de8a414464ecaaa921bf76a4ee344e3055ce0fac32c15bc9ff3019c7b9205737426cc29239721ecf65ddc241f33dac59dba06db577514891f70d020f5b240b03493aba381f6716a16646a8a8343efc41394a90cfc896dc04c4fba8aad7cd66005e426a3113dd1a4be4a661eac59cc2742a229c6bab9ba26cfa9194ab41674e89a410bc7e8a25bc410bf95738f8420c64de5715ae624368322ec4a513647ca86a231e76b62e52753c939308f8460a7650a28d258b24c4662793e2ad4454b5756e1692c6e6822a8dbc070ea81f4a85d6a2a852c452235f63816a08d957cbab030c33b5535c87c5e7851c55503898f21138b61558b38b04ce78527658082308117978bca146f8f338c4b4b623177a0b1a51b5f134ba58c19b4db69182807f3bcb29838a0729cc2d34200379cba1f751b6764c27d471fcf7a0b3f9a404fd3bf98150150b540d79b1df00038ce770424838f58e10aecc304f29a9103177752520ae3d967ba33ac2526c85d9a7aee03845b911f9c0a516f10a06a018af24319385a81c153653fa81808a6bd74680f684a52b8a72ba5288b6e75bca97a0304f2c3d8e940dba7239869bf68c951ed8884dd32cdb254755098cef7abaadec1a47a7a0fa646b1ae78af8c608ee7535bc43371bf1206c8680634174426e062ad9c28f4474a01b6785df35df57014c3e8858c2a2ed9d911cda8303c318bbdb13370b07bad82acbad0bf04c3ad2c491328a20790c39292629152dc0e6a29199251b5bdc956a2c4272a4b894a87359a11803a8b67e236837d25a274c97eebb6a8a9e7ce73cca9dc91a1129236730786de0a22286b71afea28e01abdf69cbf460ba2d7d69143895630f526c5f2c6fe9a289a3a058d84b64228389c94984644bca5fa1f61004a3edcb94557093345991bcb9bdea45915a5bb95618f4d62cce22717a67c60042856fe8ab437066aaa733567694dcbd301307b4eb02cce11124bcde6a79819b95ea621f1b11492315e60f774bc5b207f42c178708b28a18c9883561cd66daf17bc0bc42e0050b2a8157354f7945828a488a941363b3393a1112c691e123c6b5699a5c945038b6b2dd6725e7e619bebf1c34c7c32245461d32525c5f49a763944cb64581cea3a178146dc759c29c995ca0793df62cb2153859a32905e785e8e6ba2b834918f2c2dc5cab10f8b95867467adc87111d7beaf69099400aa4e908fe0a299e8901ef5f9346fb07ba287235087a1aef51bc8933823d22b8a02c1fffa56ea5b1dfb143ec1426f32959a4103b9e343108c87aad2fc0bfc7384c0101afcb4740f01b57b483c0300baba66543adca822b4381e99870727a75c491a1129af47d768e4f59fdf05c6f491aaa5dc11b9ac7e20e541aaea11b6ec8b27e94189dc1be939cebfda109cd53f38fcbbee7aad3c65a3c51aa3970ccb31695bbfba3e3b10cdd0d37d848309ebeb3ed8601ca2d1479f3aa0f2766d24b0b0feb01d34bc5627ea8dcbd935a2303bd6aa6d01e7605d23217b98b2ce8564ce077032abc35aa6afa046254d9a63be6c4bdebb95e0020ab5fb89aa5b01238047a3c183188bcec1158c0cf901636b3a459a223a73986afb886787cf93a8aabcd9af1e4cc585cac6f6f424131a9e01fb49bfb38ea664ad31dc16b2dc3c701753a2870cf9c27114262167763902b58b2f03bd906aad3b0101b7898e2663bd458b5c4bb7c5f49c28fffb97bb4393ba3aada4c023e25427dd5016b089591277b13dd0c26ae3ccb06c088fac04b475477ddc1be06620cf3754548a6b2a551aa1b97df5faa296c6a6ecd052cda5903533c93445778755876136c193fb0e3c937bf71ab2968a25e8d1c9e49a9962ba0c78951f64882c826016f63b97e6f8ba0242a45d69276fe0ce06f14be7535859c87a9875904870890c5a620d8632f30f55d3cae33d1c6f5896e6b12354a75c7894d8905403ef5c4f316e67ab8b72581b6eb228a8f357b716164e0388d504a7f1aafbb06d48b6d75eac6c76ced1b0a025b40a55440712ad8424672e761e9bc400d63812006f +ciphertext: 0187e1b558e87cf7a8b1a050fac3953c8d3038758f8e909e57c479f1f52cff138a78e583ebc02aab45781641aedb6786e7daa2693fefa5a39cff0a2b5359e4c09fcb167e64736752bc3f30a9249ad439689d11dd325232ca64af152f16abf8f821d144d97ab82df93bf348c86ac75f28f00e7b259494dc4efa7b125782bbd9b88583248e49849c08854e08ad05cbdbd6cbd911bc3482dc234a6ae89f9d7b5cfc9ccc8b0c3b2f38b7ae14c067d4e0f45e0f531a26cd2f49c6ea2596cb1a7b148df8ab01b0a60e4150d41ccb9aee48cc05ade595033682b29b6156d1819f8419fea16efe54c1f742bc2848d4351f7012d52a064d5ddafb007bc36a37d1de88f6e7a19a3f293f9b18f4dbad2604cc77dfbcf26f409535497bc0f9e05c830d1ac52f43740554008f032126e8464cacbf305d482a00ebbd737ea201cdcdcce295199150082c3964682584d3ec1da02f9462b84f36f88e81b93df3bb13419da7eb30a60920899caab1153f888941d88ab042d99c4c7accc20593b95634becd3124aae533c258f7b466867d7401595533dcdb941a73a72aba52abc9f614e6361381b8b39c3028cf8d65e518e7e098d4afa39384db1ca6aebbdfc4ace6f88649ab1d91ab0418cf5df4f93ddaecd76448528b2ab715633af9c8563b9f01955c0e86fdffa0132b62af9cb6adfc47f804cc66ec62562c51bb62203326cf812299c4d0818ed5eeadaf737c354164da0972a34cd35fc891d81603ee4698bbb7b87a6083ba2bcc6a52a574a5fc909d6bf3967ca3860e2f6e589201fc874e246052cae6e9d6cf9348231f7f30415a2703ad119758aa8a7d6a88b3ac897b25f7216dae443808ca1d76857f7faff60ca0d0855703f3726efbf91cfff5bbf11019f43ca3efb3851d324dd5b344ec0a7307b02ff76b92f8497a5e86ae94bf89f0956cd7ad30cd2a58f37af5452f356f53aa606c7c6ec7da7562e995ce3f9bf9e76c7f957085766eaff21ed335180c5e0c01c05b011ab76f2474234305038f7e6761b82ec6bbf19eb19127c01f1ff1a1772867350838eb666eb39ec6221488e7bc2dd3350e57a842aef984e7d00390d056962908fa2d3ed3555cafb639e5538dc0bfe712dc75e8f19a54d3c96866f0b40aaf200daddea384e4f736d41a7488121ec88b3d3e17768c5c1c1e089fb4c61c2da5bdbbf04e341567689b6162015d4203b221a0c32b336753dc49b7cbd2d61c2f044ec6b911c8f5adcd6c4ce68949d3c16a81371c5bfefb8e75654963cf2cd5b65ca9a08426102df9f8bd9c95a3bd0994f29c92bf978d82cbb6e7457967d4753f88522560fd64cecd04dbe4cf1a1b89cee7a34be93fb89dead659d73c881aeafd709da98fff4d5b7834b2a76d7943664fbc5c9641e11884d89b66b6c54015a8b2bd883d7c65f83d219e658b20f1321c95de44ff46bdc8aa6ca0a33bcb79841384673d5cd0a2cdd77d46121512c1b22f0f42d87481b8877fab7d26d2231631c69c4d296274527c5072069173ec72017f8c9ce6a83f944b64e9b1b55d2b714926f71e7e7795c5665c6b931e72044bf2c070df1ec4b42c530ee5e8b8a8b5323a82ea79f7d6f301a0babbf9a69542008ad7731fb985e5b8148275c92969a8a543945ce880cd22141ed171bb00ea3b396040664451e14833b894e4ee1c301bbca9540c3658b15a60da505f6f1fa625ce7107352247fa70bebc22eed0a0e073c70479ec126c6d1b7479a5d2e5159a25548448ca3edaf620f4d6fde071fb77621ac03196138e212b0c161daec7f12ba17fe5a57e6edf4ac4e2a8e491cef82f86f0437ba48289871684d354577e391743267722540e1bfea234b0caf5af9f4a3947dc8deb2d4d6b64b68f54adc2c06ba24046f23b40e07267bab085482aceb644351e255971c82fc73c792fa4420ee7e1bf42b2dcd5aad71f66954e91d4367c8505e1cc4fbd2705dbab906b56447bbfc73296f1e4131e60273f33cff963bef087c4f11f8077a500b3dc082e1bf6eaad76f301d7d72aef47816f0ede7c2c5f48305719076d4e62c49ec6f7535eb9ade87ee094ee3d81c0a983b38e15b1da0545d3957687ed5dfa834e0a3c1061d13d7c06a27a1899eed333e7895e7b451331268e5d661165b0a4b6623d8e5192468375327081558f15252bb8c3feabfcd480a802f3e671cbe98f78b870a89e8360cfb62b67cabf971c59c2fecd55fb54e4 +result: fail +shared_secret: + +# Private key not reduced +private_key: 343cf896a97cd8d63c255d462ace55597daa710aeab668a559efbcee667a6c6e463dc465484e9dc8c458b24b5f463ca8399337783bd2df87d4e53bc2f2d49f2ddbac73dc3c857f8739af9e6f1a906229a05bfc4673c87a2d3bd894a67c549b6631b9f5c67ff58eebf58534e52b88e6aa4edd99883f4a583df4e582ff16acd9846b04a957bc54665f86c237bcb092b5d5fb089a8f76b866ce30c10e529ab53fa3c6ef45376561a781c6ec75d19edccdf44dcc0d55bd7dbf98f9940c1dd2132e5040dcd8b31b90a395acf41fa9fea3adfbfca17e3d9ee85bf5bbdd86ef669986c4bbf1aa6f694bb74a86dcd235650e69f7184ba6e4f9e8a1fac4831d9768eff89ece6277468ba27d31772868eb6749175c9a2755c18d67a0f6658fb6b5a27374ba2914680d83d372f7f5181a6292ebdd1d7e9501257b0f33a152ecd77188673fbace2ae568bc1a890feae74edb4a1d1db825b85a79bf6563b9429fc7caab1e6bf5e8d8428cdbff488ea625d17ce73008e9cea01747b73733e91ccdfb5c88611a94642b661d1a41a943bf065733fe2449ee68b4537cbc8697ee1268cca564b5ea6fe88f9daae25988f79bb7077d6aadf4fadd3ceb2a5eb84d14de097b85d78c3c5c1dc595879784c7e639bfc70c49dad308a311a337414af0858af16e4ee34e34f9cef7fbe2268cc38ac8617b7d46df651e0cd7c4bec1d0c44531f5523b7d7d091ff51576ac2d6a91b463a68348a2674aff74cc7c20a79b73cbe916637830d9ee701bb200166d2a63a21b5b8e52c7acda296d80d6c897c86334d8424f44677f9f46ffb3fc5c1754b73f692af6bffd05458d23ec41275161cc50a51ab2570746048b45553dd53193b6f2cdae02f83ecf364e50a6694285523c5372a84b6345f484d1bfc8157cd5e9f3c6b76ebf1cdc557318f313c5c05c648be94b7b83b68ada4de9b8469dc93a51e9f47a533ae5d924dbb56878984877311a8c303b7c2cb9b62cb34c207dcddf8fc9d9e76c5037c46f6e96904bea372860110a721fbbc844963f2889d9e3ed93c4b8935826dbd6ca892b95a910565fb67b640b8d3a4eb7c08109cbd235b77309edf54842352b4a7677bc310563e5fa320fdab95517c61a5fb5687379c7fff9f5df96bec53cfaf346d015dea64650400ae2d6fd4e997932ba3dea117b3d552bb85326ede6f6ae5669ae9cfbb36d0dba5415fe5b8dd71398b0f1858ee5e3a6740a7b93a453b09e550e7cae362532d59490d70ccfc9997da45e96394dfbe6ddecbdfcac7c3fa984049426acc6802ff83598588d68a46c27f0445b6602e4b60efd864ad376099f403b575e622fd864fd3d0d67551103d02a8386b1abcbd2b6307c4fa62103a6ea7dcc0b1fee5fd54b659b6c0fb8641c6c74c12873f5348c3feae8ee264af78e316bfdc55dcfbc91d767344c7047cd455b36b67369e942b6f2fe2fffd75d5ffb4a3fe62bdb0cfebf0c539efdaba1adaebaa254a78808f2503bd6db85ff703ce5227c4a600cdabb28c3d2165c9527ec20ea6e8526cace2cf39da3705844c860c35d6dea477bae339813a9f2d755a22be4372462152eabf6d5aae62c591bf7fa8f8e7603d942a35c9e7a49ebac5e4e89ceb54d9830ef7c490654f87594c834d898a51cff6e18575454733e4dce0c0fd133babb661c84d914da12e4881e9947bb5df3b0eaa86f9984f4158d825bcdbd888e7af6d84e4bff49498fcfbedf1db637c92f87e6f8cd553caf40b7bb00236450243eb7349958286f380bc456c7f08a2fa5d8887a075acc0c29b231d5ecf9839e1fac91e4dd631b865bcffe68e71a4a54afec5cd9aa768e75c8b94a2ceeaf094c5a5d5e8ba3c7ad0a0cc1061f6218fd4a49c674b7fc3e6a9bae73778c034fd513dead3b8bf50869ddd544b03d3cf1d0549eb6ae46d87c3897a5525df8735079970afc8b5804eabab8b3b513844ddd8165af882518ceb79abf6ae8cce66e8afbbff8db659a6bee6b82e351ed4646f2a3cbe1bcedc0b6a0838532a1bfaead86dac43a7eaa39dd992ae72e5aefe1e860bdd5db51e58d1837fa942a9045358faf279a916663cdb431c08ecb30777cf105a0331d8769475f84c74b20668a991b53541a45071f36c33fcc85a56292ea7d471bd0b5cef8e45586e163ec02f364ceeb86e5cfffe6d4a049399c70ec588f847ca3ea21787531444355e26000209110be1b6994c3003332b95b6aa30f8a0d047cb6a2d9cfae2977e08962b656255637405057c233388e018753fec08442a6603878a6d4f8cbb2574b9dca1c32dc0964e82606739ddeb92402619649bc143950b753993e48da443b1bbc8c3a0e2edaa2710a541ea6ae48022ae1f48af844c2b32707733916c259ab588241ee58aca3538a0bd79fbf3589eda9ab08906d77778649f0a2b2a7898a651bae7013f8b863112c4ae2830a43ac421434236151b2aa7a5b3be77d4c85c89e3140f52804ca470aa2b929e8e8bf9b4278be1657ce321572d2196c4bb158ea891e627861dbc811525cb5f07a3377be081b4651eba3c311bb1c0357bf7a7923a524f003b02ebc030400b4b1e1711ef633b8921c101bcabce37655e8c651cc9458110e68566d0871659c3072c509538c5a6174063469a25c4134baa4f136e71464179b004fd361cb2b19d955376d137284039a6820211aa578189765f15a47e4b52d4af9447c4a8343f84edfe7ae76901d871b0a0d72414c4b01f35a38fe35a268848e663263439b4dfb9b3435537f54bb1e2b132528fa5942da8563554276d466e97a25cea6c7841729cac824dc3ccefa91c7d0a377f45b10b8f8cf78d00657f90e114363644869612bca78e402c8e2a6ee1910e07b72ad43b44edac06ec2cb3c448b506cb0a09746ccd84b3b993213b7a76dd681d6e7b7e9916276172d15538209b01ba5149bb0aaa55cbb04ac89674700544ec7079a8277a3dbc298034e08716849c0542dc42b7e32319b0b7efb43cb57f951b4912af0141965fa6e1701cc53d08c1887bb31fc93399823f1371712785ce6cb549b91099a2245dfd350c374943ee6826cd3c9bed72e7012028b938bd304ba0f5255ca664389335962f35bdf253e2b3933689070145462f245696e4b1d852bab0c817193679229ec684979c8f17965f4411fc1382309c28e98c095f663b587e967ef6320a84a474ed415e64381ff341daf491a9bd872a019a112a2ceea76661015b54181b8c325977b50993a5c26a7d992cf519d64f0a013f517664268d415a9c7f178c047a684495464332fd89071da200c2d70ba68c68425b815772b349cf4ace5dc1437bbb21e3283d2623cb58680fb1084e50685b99224f8c91d167590d4b03fd9a62d54695345217fb08658f1f6c25d0652cbc8cdd858ac9ad44616a8be03e06e14288c1ab27e4d3c15b156732d246ef8492efd508b41e6438c1c899b339874792f2bfaa1b8e55dc2740b02d23e8da9c0a1b91c61db66c92cb8bb3c64cc68bf4af341892441085a96f3aaa1a2217bf6c005a3938c2c61a15a701e090c84d93628e7cb6bb0e49c170079df1c0e364a4ad3622033b762593586549c79b764710b2107bd0c0acf106c7f7ba9accccc6ddb15d2b68a9fe7a2e8820ee9acbfdef8c139bc8b5ef47fd18626285409a59479d517714637b9d75aabae29cbf3418bd56154fae5195372299942271b0c90f0bb7f0c2537df6a433a2350127a24aa144d30b95faafb39f566651cc1bf205814027477c46b7ff1b66837c657af9cb0e7f46a42b4a74a69c36e716e2e993ad3c574aaec31a8fa5a950a8ce7823a7e032cb4930c95d8483aa102d1b20926a6a324b9062b29192431bcd61aa56488be8b9491ea373fdd276bf986ac01e6a9683785d3384acce6297da89657c005ac086687161bc21a18d6d325fef6059ff711a60782263a5dd87552f3b6691708a60459a81321caebba42faaa5593982ad4e0956aa42bb03867664470c8459a511026c2b8791a37278faa906b288dac6a1b7aa9588ae9062a31823076864800b08396aa90ab0a48a9798a146a8e77b104125ab1f1b5448cafbdc749ff085f06b02a2c25174f587f6c2583cb0384c521990b6c15cd926b40712bc503471d4b807f85b7baa361138312f1c62d62431297a451957375607bceb0009d09ba904a864be363bd220cab37d13a77daa42454b867307ed7c2a956d41a62b996e0e78c34b4ac0e7aaff8d8164b4a11f8aa4379fbbb34f14e9fe13a7f4ab0025586f130914c6183719a941b0338e1e11aa3f167a421bfa38c9142e02316d1ba4e64c60320c0a190cec011304f0bc58af38e492937bbd0ad3a5a904fb39ce365a13dc902166c864a972082fd9e2ea5548a3b6c7d885a3ca6ae2e12efc2ea3ee4ca0b0b171ee93a198b42191fc1297d126ae957ec70b3e5cc940f2649f5a8cee53a1feb5e68e08aeadddc273b38bddc18488024ec90e62a4110129a42a16d2a93c45439888e76008604c6 +ciphertext: 513b90e91123157cbcfea4a884bc01e7126867dad5849630204d7659363db9741b75bf90a60fb1454a58a6b9218ea88480a9c3784ff905ec79dc457c1bdbf42949c892d62050c4a3a5b1934d9efdba27709c1448f561cabd43ebd07992fe9a3eeaa93d2f85a58c78501ede9066448fafd52334e63e32e257b857434f1ff9d2bf2126f73fcf7a4f4d5fb1a9d3ebe75553e6f663ed451cee5c3d427fba5b362a554f3e25655de48f690b6d9028425b00598988fdd3fb41bc3cf7be9861b82b9a1bfcdfddd4da0166408498a88eb2e9e52ed8b0bf1685dc6862f14b59f9f9017459aed302a242f24f833f03042541a553340a99c26288d4d80257b867eb75ee67b949a09261c5c3575f688240595f90e95c5f4aab0d924ce0f9b2a4d6f7b21f1254caa24b0498271cc57f83323dd40d0f1b566cb72e435ae8cee0f502a6900651ba29064ad72bd0d2373dbbcb96938f110577cc08a90f8ddae8c897169262d3475ecf8ce5976a27a84ae6840077a21334bbec3bdb120323e01733e4125dce4413487cae5d26cc1439b07fb3c2bbe2321c12f7a9bfa3cd37f282f8909656470f8dc01aff581be3b2b5daf242fe8075e3f2dc7cb1cf640dd07709faaa95f2a210e3680675ca6583dcd36c15cf4d5b1234d76729a3e181409a60aeb6c3443eb828ea034cd97c7b1917d80cc3f4b6b94d0623f502ecd1095d2aaf6357a15c008ef838487131e9c0eefff80d64b961c56e400d9a0987d6002d787a733669b8a14f68022a47a7f1a7d5b0cc2982cfca20ce49b9910f656c8493431220381da944da3195acd40cd3cefdafab652acad95d1b33c45d69dad1349c314f7e0a5df35931489e3f0ea1bba8931c0ac5a9ff1900ab0b3319b7b32323d8540e6693b394765178366c2783a02de21196ef15b562bb0ddf92ea35f37659ab026b56c1d74c6e5ea282106b8e0d3910f0611ffbc00d4a2bebae4229375be72aa985211041b6be3afd316a7b237af61d591bf19b7d66e7b2141518c36394458d38397f8619f0939de57c53e116aa3989fb875cfd60d7c2c8f9f95a9b03a8293735d76caa4bee486f56e127af5319e02e8a6511fe1f4732b707198884a461f8af105658808551b3cb59bee524a8122badcea5a014855fb0ae4f66543bc1de0023432db13ba03b161da4971c9a647a9e944f04291d40416d01ae8d9e8789fa84456deb8e74b8deac4a4adfb91bae56ee88cc3e44d9227d356901351ef3b2ecf4d4957425f5744c09e57244ce56ad2aefd84a6f62c79fb22d6c165b969f9a2856388fcee1683265467b5e56d2b55e01d907293f5b441cb38d753cf85eda74e0a33a30f22c12f99f0f79d6a431f6d749eaa62c13b56e1e327ce0531d6495f043b6c77a697ed0127618e8b864e53b7155a63f76d210a5977a3432ac64dfcf93eba99e5308aa9cae3a2fc2692a7aa05018e66f1347e2131f3cbafafc14f6f1d6b1e2ab5ff905dbe8c0e0602ed774360c4557679d4b58adb444388e396e30d59ea092043e4d9bf9c4a07837dc6d30134428e827278dc13d8059563c6210f2192cffa0443743a829679fd840a6d2ac535caa5384a0002e2467f6b1aa0fd92c53531d8d885e947d1573f248d9f2dad6b009c511964f2eefed5e1fe6b37e5472e917373be0b2d1c9e30844f39a03b6a2fc3bcab6753ebf5c59ed4acc740fb56fd14b3a5b41050fa63ca3eb8c68a2742890bfe9f840323366e0fd40bce50578e5030359befd7cb00341d35257e959651e50afd875f2f59769392163ad2bde60d0e2964caa6634d6b2baba36286f6afb652d8b497ca74ff24b7b106f21116c67133ffcb55c2443ebe91b2f34c37fb0168b1ce69316c79afddc9095b2dc271e81088ab56442c87f1e7ca7fb7a38f69c184c4dbab3d98dd058e6f3f253d4e5f943df7b6e0d720771ab50dcbaf26d180bcdd6859ffbfaf447598b36fdbacbcd85f596f8d0faa0e5453aeda7270a88149b2513265a99cd2d12d465ba7ed2f2c2917e78d0bed73fbe3cf0e368585e58444038a443ba92f56f14034b03f1a3be51a15ffbb216ebd23eb533a0dba7e84029ec4f24f686ac968b7d77bd6c4e869e0f8a80905fb88ac04db1035ec0c7bfa8effe39f9a4146e6a4fae014e7fed997ef0a58e4957f81429ef52f08eb2c5e62d2cca021e79de0453381bf40e1ab17b8f88ff25a4b0a023d3542fa58aaa19653d99d65085 +result: fail +shared_secret: + +# Private key not reduced +private_key: e6e5ef1ff8939b5f842f19fd10a9cd020aec795de47f3a5417da6994e7663b536d253b627094b87da5e583d6eb8ed8a152a5f76df7b080d7ea6b2a4fb94bf9512977f02c7f8dc36eeb2644f4db64a60ba2083b984b1ede0029616295835118ce049fe4480ecfe9d5a02bea7fc8ba9ea074c15cba8f2a87d6237db9818ab99d856e3c5ce04a66441eca4d7fc74b148a37a5eb71040df2c955826048a1ab6a4c3619c1a2884fbf4495b1469e3377ec845a40314ca87c4bc87e8c8bab04a1babf37423f42a83cc41517c11e5db7124a730d7b54a78f82e2cbbaecad896b2453569cf2b3e779899a5e895d4250afb68af95381cc5ade59b54d7aebf3feb16ee59375b3e4f91ea716239085a77bc5ef9506589a420a6c0adff06dceaa98ffaad03657eb967c1ab8bb73a87a4863d35d87f85c29c788885bf21d8fafc5e7e5ccef13f89cd5ca97d71ce2b5f64b8837646633d43a0f6d73a3aa9e1eb03ecffe542cf8e33cf2a2976b245d8717379ded0989e2345cb6fdc7d9c97a81cad9515bdd27598554189f7e8b6e977a5d3588c979aac19ef6dc4f64ce5ce73b438cdc1e1e577d539afa4e58b946918085c689dcb227e7f240a843b2bc4979f5cfdc2791eec3bd168593ba8beeb06b829844b9861387af68b466498c84e8aa31fa39488cc67607f9ee1d6aa9e36846adf8ff04fb004f8320498fc283b8ce96dfd2ddfad2cda7d0e9fd61b6aad7deb939bbd396983693353f245d7335ac5fce277df06559dd3a6961cc43247cb0f9f7f69c438ab5ee4ebc0ac2907bb1289741b31ecf41ae5ded58b8d18c4948294b774c6edb047114a9e981fb612c6ae96354bb81afbf6efb713aeb72d5f434f9c46d14dc461507ae5bacc7c04789c1dcace99d4cae0f401ada5348aad4fb2e40d1864c76fb91777bb9901bd10d7a6f2d09868504823d83c5e98eaa7b5b408f144e02ffa83effe2a7e3e88c845539bc6b062cff72b5c771f8b7377c678ce473debf5b345e8cfcc7ea18455acecdfce73433961a98d94dc6bf844014c7c89cca5ea58a629149eff7dde35f1e911b6895567e93dfb84a97e4b8f1ebae016947a70b8b08e5c57869ef0874c6a2b7b900a490d34dad36bc745d1e3778ec3777d3f20dbe9fb49634cc3ddfb1f67e5decafd95ed0544c86ee79c000169cd908a884344ed204d962558819458d5f87c4f47e4fe19f55390dd3a7d454c2f438a3c751a1fbb13f77c85d7efe17cdcb989f49518b82b85586df793db403ca567d9e1f6d30366d48b458a492ec56e1bd8c661c5ba04b805cc631b12a741216448f2fa22dc4d6c04935f7c6cba45cf13968a5fb6ca9066c88f719d0411a43e875e641197fcef47470299c51473f168e75e2e7857716ba8005d2e156525dedbd05cb3327673385095d144562dc5bd06c89b0c6aaa2e21ccc7acda7f4bdaae87e42a447454b65694c6a5eaf3a7761b860189846a97efb89fa5ed67e5c8ec3d4299dc52326af5edb7de3b578dccc61283474bb8966b187acebb9bce1ad8031e66cec0bc57fa368af2574e7397a1177828d53f6a66a80944e5872537099d77eb83b9cbc5e6f41df35c093eb3ff663d3f3a9db7cdcb61d6c905cb55ebd721e45a7ebb676dffe37a585ccf4a3d02055536c3ab49a17a68793f90fc9366923654f4edb18cf551816a9196497ef6fade57bf4a2c4f1ce48a583d46f329fbc09493ed485d2b75580bf0ecc94cb4893f32fd6266fdaf865f5fe6572de8c8e1a30145ee13d5c6b5916ecd41f4683748f5d2d426288c7bdf8ccd3efeacbfcd9621ef83534cd4974978c1e7bec7dbcb5fc557d5b7482d6f6a49da1106dde65f8af72b3779068b24228c37907477017327026324fe3c607a86ef7fc453af88c2dba51114cc6803fbb46e58cb7995d4ad3ef9b1cf049bd5012189e7366ffd2baac0cc4795e55b5058b9a747a5c34c63439ff767e3f35501fa0ba546c76f38cb54ca63203f2eb39ab052894264741609ecd0748e90fefdb150eaa0b1c4765674df3e47756bef427afa30786ddd9d39c2f87f8dfdfe3b2559cd31f8181e74426595082ecd066afaa132c72b798aedde6a7c2ccd3cb0539ed6ebbcca78e5116d0faab6828ac6a60f58b6bc894d177e2b34892fddcbb695c36eb9c3169543c61969c22f95b6eb5fbdbabfed0947b8b21912d062783fb94b458013f34480ba83178c87d9ca4575ac9014ab22a7cb92b1bf41ecf098f735b3401e31bc02a43c447220da64ce22b17408ac536135641100d1ea581a14818eaa4c77b229b31511e0a403229889fcba0a2d4d3c845868816b79f56d6265d678c9138b716213fcfd7acb2c68f4fac7914d140cd2a7487b34146708115689407a9bfd24216f563a6fd220893c1c5e2c657031b43a29b19471b084485b7f739af017459ae50423518460266cf449b524406b9a2b80a77093afb1344bc1521e0220c5a113cc0c4a4321a77204521e3c758927c83398aa1f4bc43ac61487e7158ab4053fce98a74b14632054d3d3aaf018cbaad771326b7160247cc10a114434087faf515c7a39b0705bc374b7af73c5b60741e037bc69b10949db1739ad74a240c2191b3201a020f43890cb16390d6c27c39d40af0043b57e8a0f978627fe1b36c6c83fc97b49ae9268618b2c96a7a3612002b2673bc1ac762a37e07fc6ef3749009876399862d67b5b48571caf8b326a4a80b4544c03ba811b3501518d5caa107be696cbdaae79caa0191f5678fbe14934609aeb501bdb0a525ada654d77cb3042159686381e3677edbab5f7dd87fe1c4566dd7382f03c2acbccb14182b9a65afc0aac41f4c3095675a316159b0b7271f0284e160190de000fe4076b6e3073d302a51c7a6f6486c52c97446b506dd7c76ebf08a5f8c70e6e8479735c2ae79a6d4a99444a347ba838c43a1ace485a005a7531916c45181157c955817c488ccab9aa4d55dd79a5e243504a74405a8a4ac01cb1b9f2917fdab3b2909ca609739859383d631b65965affb4490d5b9be84a2902cb34cc50b5c49cbce43f8351a68b3476387bf87a16b9784a0e801e1eb39ee33b8b9ca82bef596605b59f33035a05a012d8549f0b68c93b784c7a309dd71425d3175ba50107d28aa8dd42369bcc68a8aa074020b4b21c3d537ca25b82a50dc875ab76b35a982b0792fd84b60e7db48fa0b80cdb90e1a95038842404a78c17d6c73e42951ecf2160db816cb7323cfc0b8b0057e6e66a36a856eaa60735433bc1680636d137b8da85f19334bd0ec9617d8b484986af31bbaf7e81a050c5b4dd9356563bd2f874b6b82a6e8b088b2ca59ef3866fdd4217efbc5dd66c72b66137ae65e7dc5c541c42a5c4cc1c1f1b678b7941d37ab5bd7292c665ea89b9679c5a6f8248f9fc61c2af282ec048bea74cccefc2077f370d3979b83e2a65d64be85742bb9b66308fcafc84038e72950e968b33fd98da2750484f1138aacc0e5e8607e352804316b26111c5a242c09901339fcb7d304c749d9205f169d2663a03bbc82658a0ca3025ec4d0a1e445be8fe3a72c672333188abc3010b6a98ec0f01d698b87f195b2e398ca6f8038ef0739af347b22076a58391c46573b0f782444464d9ea0645b4cc6f7136927c34e51fba618b082f826b29fabb8bce80bb0f05524348104eb4732e0ab4f4040e104b78ab9317b558330d4995168752ee23455eba2cc4cb679687be93860ccd1848bac42616893e6e710645b354a657e4f064e2d3266f89bacb8585e6d927259723e7d321aadbcbf9638b1bcf917e3c203fd06145fec0be1059c4a52ad751986d0f0bbb46bcccd365ad6b614dfb87dd7f97ccd731f4f9b280cd321d7d7679743833823aa5a05b1b3d0263858cb2ec27677da6928b26d3459573e25b0ca4964d6798cf250860d055418761d7ff0189223a1d3eb6ddab21572b58f0f5ab03a1bc047d7928c060844160e169b2ce072a89fca5b384b81b89b24741674ff5223d4116ada77797234ad3cbb1f6a78cc33e27b03ebb0d5a18427f625a4311a9599ae8723bacf392b7c915aa731c943f49c24f189055143502cb35318432c8b89bd2b9243f35c4b443ad48126207559a2314a77bc67c4d79a3e010fa1686761509e6774bc2df86eec6c5e3cd547f9a5457fb4a984590e57ccbbef3b38e441235d90bb60a24a691425cd65bb43b5868d128e3428b446409804a25333a7ad1f5c6d712169f660798de5a448aa393b5c496db978934c6eb001112440784db13825167a33206f76b05eaaab0b89966150238748c492379b387ec863fda621ada4296fe16593358ca0ab83c15225dd26691da0b00554c2398a2c44f171bfe63d48db72ee6cf36f47dd054b8f7bec5a4bbb6b0d62bcd24a3b8a6d32c53a51bfb7c57ecf5fb124740e9315cedb69ebbc969314e2b7469c2d2e2bdf2698af4bd116f0d12da3729672816f3eba84c9638a79676eeac0f22c8a48e0c5d50a26ff0844c66b99 +ciphertext: befe323a205445d0b526d8169b8499bb6d5e557381bd3dbd8fccb9705743ab4df3d5bf1e83f78312a87d74389813f2ea4249e1c56d6727cb6e1d6cadb74c331652284c68d81087a237662da796bffcd14239e03d2e097987476f62c3757334a724d9b9518dbf2a82d06bfc12bb1efb86a1d68e638ca37cda0ab9fe2b0bc0e54111b11bba4ac4023decedcea63cd038a9c0a1ea66968a9600943b68270e653a38bf08536dc6f8a7f67fcdc4580c08ffd0eda430761bff7030795107a83ac82754748eef53621cdd138128d6773c411ddbc635e4851a11f4f01a172ee11ddc79a525f2de9f2831f34e55b679a21fe5cc96095837d863d515b257f76ce9d588dfa6267c93711b98b37d9d2a4222b250b7a452102b2f3a33462b828608531eae54b2b3688a68443a77088b93fc16cb7e59cc86705b371689790fdd47ed4699d959e82cbe3c90209a54830c56b0acf1c20b2685eea9c2237d2ef573d8739bab9d4f3deeb7cb4320ca1856e1ec8759c23bd361c18046fc43216b46269a076bd8b02f1847e54fb6faf7dfc73536a2a06c9817c022814a61dabb29d6222af5dc508c08999136c3631e33a09c485bf6ee6ce8a89ae9b89ae5ce5f7052291f32c7d18e1e082f1a5f208e049157cf7c3d5c007068fbc74bde86631089f232a176c03cd596732a00e720900ceb6e48bbdb4221fc7fc414c81e699064f97129aed58229ba7e1ca800c759c1b5a16e18e6744b327990d087346d70f535582659c77ec633756b999075bce6e996ea47a0e6b5a889173e9af7ef022a626d1037e8e8a6a4ccf10cd84440419a95d0fdad3a3058c3d308f3c47a2d79285c97ffd67138e6b44b3ef332cfc5874764dddebecef283ebd31be660ecfd8d5a4a5f540b6e297cf7c296ff88790e64886938f28b203317dca7e870f7f5c115910e250c66530bc9e127c3c6efb5fdbaed54d25c2c5f8e07f4b21edf148ff413066d2fa44aca9efc06609914b1dead69a60db93a3dae76ca9a588be28af1a5700afc4abfff20ed9f6757c5b23856e91b103daef0b5416d7e31450a0f85470b5954848b7e21e982fc083cf7eb181336bc2d91a0fb7109bd14a30e076ff633cd6a539b0fff5103e5bc3ee814d9365cbe0c8915e5d7fc6a85af830840c0246cb348e7bef496482bf3127b04ad2cb151994bf0f3051ce41bf7734cd555bf1b41ef517a1918931e2c2a1118aa0ce30475d081a8e36b2928cb83e86c7ccc3ab9231fb1fcc227338229f16cef4f6ae922d2310e35b34d1be490ebd8e91c03beccbc38d264f9a62cf8f0dfcd539ccd43469d4c8e6e088a8815c14d49a69e3b28ef990f319113b5d39d2b3388a2c6b8daa788482b78ca6b24a6d64cc7b0def3a3aeef1d2dbb8692dbd82a124638cfdba641f0d9c7d7c45a2593a4b46cec98184fa3067970c190e34b135d07328c785e489724ba1576e5768c6d1e2148e44168dd1e91647b8613233fbe9c9d4021194ed8936fc6d3327cda69c02c3cfed6b40da3a9784f4ecb8561f34179a3518aa6228d37a9209f502bf518f641daf5147377cd65e20152346151d553e748a02c498417cb2920c429d3251ff6f87eb6460cc5a70866b52084ccd68b4446032efbffd3d87c6ee663a85de4c6221413efbd940fb2722aecaac71394f245c5e29973526124bb1dff567d3eb734789ec4f49c5c4b96142f0de143792f15df1bdfb358eec7a5916c9bf22aade6bf7961c6cf4cfb33bca6e0975311e75d3d90a1923ea440911664ea2bcde517be31be414312ade1604b96d443bc4807af3c75e431668a95a03320d19785c8ec3f05413dd52cc18d01983c70e9654abb28fe90b795e8f14dcdd44d0212de2e6f9b3bc21f5ebcd50ff4bb5daad6fece570719d0acc62f033304495abd5cc6dbb47a08b1e94480ad4e009ce4401a10a997c981689f3041f8ac66d75fb26548a4bffd65ddc42f3eea2af680512bfeecb605aefb4d210014682984dca65c87567193c580db8f9e74574985eb71f8db1172515d25089dbc92a90ea463622ba1ae32d9146d59372e353948495c3dd09b526218834a064ca56a041bcc4d2f6284d3d87c73243ffb436cb3abc12e36a8805d15ae524a3c49de249190f4d245d67804344dcd052aa05ea1cc9534e4f8b9efbaf1144272fd82196cc6222622425e202a104e6cfefb6cea45cb7936aef4cb46c0c0fcff6e3d0544fc2ece9524f5 +result: fail +shared_secret: + +# Private key not reduced +private_key: 412fd8d9cdddd15e5a1f8cf3013c9a8d58d62f38e437b3e2e94c7a76055580b894cf66a7796ce82d889a1aa4dea054e12a265dee346d902758ef7b3501bdff8d0d9e3d8d3aa0efa39e9553981ff510ed5da8a85fdc2ccf54cce7b64d947e38d277ad84de678fecb73a5d1bc9867e8c09ab5bd87675736bcc8eb858cccf46fecd7f0a7b3dbd1656f04c7bfa3854b60fa71ecee1fe2c36a269e0d37a5c357ba06684e7560d71fd1bdc4f0cda4b37b67d36f734eaa64794c5e0d66d0ed96a5d7c7f3865ca8579b89c2b7349c3e34e43a67778d414fbfd88587c7329fa11f5d88d673e65fbee88fbcefd8aa72c7d4521749a384588a70d9b3f4ecd83a3e3ee0db5b5ae4236835055a875ada5674a1959e2746e3a38a1cbc7bc0cf6a2c9ab95c145f87bab8b7e1fbd8dbc79d2e6b36f0542ec73bd66f6949f0dda75f74ec803ed0cca8545cf5a431c8e43a9c0c99545a18ca7c6ff8d4f0e73c55d5c5c4ba94e1b87a3b4b0eec5759bdbb22163dffdd9d48527e02f7d745fbd9079f376914b643ecb3fdefdb68d384e2fc7f7bac38148d897554cc8eee5a986fcdc218ea2d583b73db69bff054134ee8e0e7b52e9e9c5c1ed88a99895baa375f6bf7256feb64b38b96c9eb08afb5b3647e802559f240ac4bd4f34d8da75b6839ecd9ff721a466e0f7a2937f3286f38646e396e7aa3dc9239c3e7fefe71afeb14c37139b878285435c78fb9b5489903bba677a963509c5bb5eff8165bba039d84344445f2ebfb153ff98bf7b3387f52e0efa208c71c42ae0955c79c6b6507c1d67dddb8e143e897854897b6ba01f79ba706f73cbe540621cf7d83ea86719903fdb5534bbbd9b9f75881ed3d9bba74b694595188460c8d491fdf69dc678fcfdcab19e8c59958ec297bff5e6572c3e33660936689a393ac36f638883d5a95e1d78c6460c69214da9a28895fed8d8ceac9590aa855248fb31a489ef167429e63c7387b79465fcdaa7fd4dd3aa41835bf2a3e5bb095b95d4539b76d08887ae15e66fe66e534fbc973f56f1c404ebb9498d0ea667637c5e563accb3bd429d68dcee038326a841338ef03b93607acc70666c50e34c6187dd3600043ccb4c7e19bee82ad39eb4acdbcd746833bead47bb92495df09197fba2b68d26cdb04064558f9453df6f8c4c983c1fcfd2fb7f4a9f373c003da76c37743a55fd8f765d83cf92469cf8c16c9b27af727df96b26673b191b3162a7da557caa648f7b5a2b631abaa861763664dd8b72c7e2ac53990a35b57f99b5b7d4ca3035a590ebf87e25e31a3e77f697e57ee74ae10b73e7ff4e8838c3df29c6d8b78ac6c7daa1faeb6467b6d53e9dbe98771ca752c9986006a687d19efe9e46374563a15ac3fc7c7db58b2ec9778e6192d36f04634fa0b46fd03dfb44e684008c62501fd9ddd6449718452413f982dc6550fff751846a250fc17503799e9a7d6873f6873a4593479b616ce3f91cbc3abc952bc4792ded4f7a37f922de3e35ceda204cfc06d65ddb9d3287887c29cccffbe4d59c6befc2c3b7787cdea2e49ad8afe36635982103473657ca2e4b32881b6ebe8c4e7c63594d34b34105e6689b7c671b4f40fbc7d9eeca6ce4d16bafd0cbb587410bf2ec94d30f6cbaa38fb9fc43651a6d94dd39bc64477399a9d41ffed55b373689589da7a6a23b0d7145bbf08bf56ea51c3d69efc3b4cc4f0db5e8f9089d4e0bf9c7f746f0b948a2955e26ebfb5ecb7c6ebf694db5ada7a7aa94aed9b2dd604c6afb654a4674b636cb9a5f668eff404b4edef5d5094befd76b627c3fc4c439e0b149dff03c30a5e79be634edfa39a2d9456c331c4404e7a159b8a89f1d588e3446c725ed7b03eb6ba3df0a4efb5d798dd71c45b2273f513c8279034483ca7010a9b3d597cfc7f699e649a99238b1283a935b199f57f6333c3ad8c553a9bb8c3810a3e9486a4a44e7ea5317ad4ecaa9b4548b86a9560969690e9bd2a38bbb628391eafa6d2eeb4a783c661f14b9754a8c2faab853dbc10793a61defb1ec7fc7e6be57890be985e7bccc89c0345da047c8e1c54738fbaef19744ce5166a48834e2c6898fe9037b827d99779968eacce26193ea6c0a5f308431d99d4cb9d4a1bc8b79f0fad13a5d88a5377936cf6906093a35edbd61199a9b9ad6512bf12744dc9d0e69962ad8e3658e3c8607f9775ea3b57a481ca307a36b36780efd410873f9067ef06a6f75b2f695620c9753f97b167df14f4b59a66ee953aea71abe866ff3e34cae61b53f5842a9ac3c811abc36798059db5a51bb1a003b5687dc73e279236e69477cd03c5143b6e22bbde999379ad131215c9c46e37376402d434a58f4ca4c5249c537b15937c38282d2759a45243ce36d24eb234c5bb875b2594ac89e51564e43d2869edc93cb2143d3f72c6d8672df16a08cf94031612199c224e25bb223fb646ac5997b806adc1bcbd49a7833409515c05238aa2c3445a290eb4e4cda6fe1e61fefd58084db9ed675b608ea1bf660195c226a6b70cef5a114ec584903aa427a34c4f75b7d0dbb4564c72c2b252ea9b99173659ab3639d3476332c74aebe0b6656e3cc3f99206406718e5718e76bbc2dfb8b409780263851db783979fc5ea3e4a18d6383762c6d5f782e7333876c10414dfb4548296d33947590534a01c399a3731ddd4c882012bd0b1448e066c528f28c52d3c34f1ca1e2da234f571ae9921084179a9673091555b9d671aeb33a3c41c22adfaa8ca800b92e9401fe31b35c311d7820284fc534c928bfd575881e5678fe81803ed08041475b0f4a36c7644441a067cb35a633a2afe385ce1a1b5c4f9c4a1580003d1aacc548a4d5e7c94c6a4799cb843fd4c6e6209e1eb1a71be32b501b004ad9c0d7a6b44c2970140a021416483dd835e7987b779041aac46806a1a538152e3b716beab69a86e5291b431b1eb68105380df09758871335be0735b4a22de2c4593da03679622c2af78f4d888fb178098486602b743d72f25a57b3533623b57cb905ab499835093b1c4b9d40d361fec791cf82a17417981ec713514ba50b46608c1307b7939ad5f9b1ae47ac2f0c76162161cf0677aeca801504512433918aab949c078d46399d873b0a6e9987e9aa71e52c5691232b8bc68c55508c9bec555d17a6293525d297be94559671c0209561c6bf7859c3469772c25e0863c16c9c4aa453862e52ab3ca942d887c959850cf4fb2afa3420fe55660c22516bf8c940ebcb1ddab9a36a341cc144a646321037c07231424e040ad92c706d254e56f48012601e0de8402221711102be85f54d3bc513481c1e2ae6c50a022d056967c6b032c99ba89070847bd5aceb4669619c71f2b7581736726dc800a3148bd2871d8bf60708da4cd13b8822209bc09cc2a88a43defabe6a24986d697fef253aa91525b3a3cc9f102c9ea158c699745b03af77d41d4df72be7fcb6b7130f308bbeef6ac699388976a574ee1a74e84b48649bb32ec763227584ee24c0248b7f5096c72ca172d2b81982f676dfe44a896618c77393475521eb6a6fb8ec6e153c72d7f8c9067a765cc4149fc58777974f96411739168deb8a6b0e905997563d7f13590ab30173bb23f7b7440fcb6db8f910b12958e0b62fb6f84fa5aa931b118ab4f1ad6374a34721c053224b04cb07982988fa3a569ae9342953165b012f31728960f89d589613d07a2b16c71e0ec942a812a72cf90ec9b23118a59c6bf7c273c6163a8470b18c8c2ee76f4d2975e7d79df7e80e759a52e6b689ebb7bbc7abbf6609560081aac3aba2b43aba545951427cc35dac5cbafc7d394bbd57a2854e84b5f0f3059a94b35f3b0f1ad3344cc2a40fb89a87e091c9c0125c0052e8b28cfff0c3e0390967e1364a4ba8c0b77a7fe83a65b76255422ba7a128fd4b3c8ef85fcfc16f80ba5701c9a48ca230e455b02b28641b98a67a851f31621733c0a779170ebd690111f395e7461127481fd8e1057d35b6c20b1f68322e72e92a2363825566445544995dfc08ccc492f6e19072e398bafc32eff92c7e229f87d1327bb1884cd04849569c415860df59646ec59ed052bade3a0ea6bbb8e9d924e6c43aea22cd4969528d50af83b977d4f8681fa52ae6f5a60ec1cedbac91b14b70d46c5ea18551f288690c3aad6428939426326c54a80b1c6281d51b3d47462f18c6c5931c60395a1e74826f6c258f5622f689c4b5470976a961934104b41100142854bbf75d40d09bfd9a0e64575a7546bec19108770c19a7cb48208780e1c657863163022c910f071c59f239a23cc9f1697cf5177f88e7580df8c925b2c405a3360d0a80a6ea1486136faa9c48aa3801ee87b7cc5c638d67be57548c03711f9b2b31ab319d45c578e5acfa30dc426ac3b194230a4bb5ee07f4c5b86efedfe663032fd6ec053e7ae81ee85ae4b3f808156cd357c2b36db2f7fae03ff73e02a217659f53d8c47556bf3d8c94040f630d63605e2d0f923579370c +ciphertext: 47587ab04e0e551845e526234cf731036de9817d48ec4510a84cb183e70900d2ce322c999a9d08e654d466beb2ffe46ecd746a91882bd73176f6077ec0fbc4f51117805b7541fcd988faa8d02ce31eddb953410252ae9caa86e2a5d3079ba87e986caedc21c12944c88401435ba434bf0770446a6c4ab115f22095592487f89f38b6d659e9c800c3c901c140b6e027a5dc357ba6ff5489b20e3fe72ac7ba203b1655942c663cc98a31e7a745ba46ab052fca73acdf9f898101e8eb8f4d08a8f6352911e90f072a537d29f512ecb10b6fee65b2e4d8e529190df6ae31d5989c62ec4863513f28444f470abe04f95f2c0e79891710002572b43ea8de4841f13d72e97eae417254511bb4c69bec2040887b01e2f4991c52cf5e165fd922692bd3efe666af3a5e3f3ea046d160dbbd10e2859499e6ec260dd4db9b4b706e889a699c511ed02ff2a4cd562ff56039d4876573a6a380e77d87fa880d5d8bd7c8f8a42e97df4c80135f8d57d300736d9bd9ca9e8e9849e8d8d7e48a6e89ca52a6859615b6ceb2b412bbbe4ed6ee4c9f5c21c1574003261714a4ab95bb2086c88c441cd3425b6141a016d582269c2cf6fcc40f5fce13b7a882c978119e0c839c7a0129550155312c90e363c7ba4276114200a230da3f2ea0bd3b8363a73abb07d3b31f28100da8899809e529ddd346c78a9f017408656c943bd7a028322ada4240d47d33c84a0ef2bacfa1adcb71bc142d0e6c652b1549271c9dbdc4330ebc71581c1d36274f893429d08cd966e4ddceeda95e3e8b2e79c4760342dfb8620db4632fd20b885e96d07af21d603781fc4b39c7ff245b0e8c29dfd0b77e108a1ce8f42b5ba5564968d7cb77fcf3f5bc7ade80e6fd1d6676edcf06516193e481d3df21e36fc612e984c63a1c44d2a7614760f7b07aeb9be403912f8071b1a8c2b13d1bbce9e67ac29896cbeb5dae6f87431b39c55253c1b929f837d74d053be5a46d56880d96f4047a271861e418f870efd8cd26b351a4c15d7f9633706ba8fb5af7e967715a8a94916af9a015aca2331c77b95546f48ad8c8ec3ec00c048fcb61ea5af8191e617294e92e5ceb7a19b17f7af42fe9972e0166395c812328e59042f3f2790fc85106cb87ad2b318e201ee9a597f0cf982cf313196e02a5145a83ea1a0fc8054b42ee6d32468528232240fb914e0178544d6d200c1172feab5722290195444af68462057799dccf6c5b2b6a5add344d66d8c100b9c3ad1654ba1fa424c0a23772dcb1b60d64c624292b24efda70875ad9fad1210c80f6ff7478d9a14926da1875bf614eaa412c14d01cdd9e790d9c8488edfd005c9d3e1a034030eca417fc99b91a199cd3dfb4b52deffb565d4de0c569d92605276111693045fd8b3b3a84cae2a4616c6f249a06c3776e9cb4a59bf40e64207f180a4807220115e139c23ad7a3573f3012c05177a4511dfecfee943b650ceb60e4000bed6acf2ebbe270198306d079c9b6e5e5fb1199dbcc01e888943e808f414ff3704169c1d5870f5d0001ab5e844d10a8f0562103b79947f244e4eb9cc03fd261d9dddd5fedbe4592dfa5cba8a642195ec97b991bb52c129ab66d428d23a2e9070968604772783c2a4f215169f7fdf3fb38df8434e28f02b96c61cd6b86cf37aae45f637b1ef2aa07ad59899720833bd64eff30c485a8629a6a416e577ebbf9e770bf3ba067c00ab935a98ba543bbbb3cfc1e8e1cb51be7b62d1c8d0a5fd56fbef29a23815e053e16b5324312d060d4b1985ca0d855ec1dcc61a755633524c0a3d685b147c5a5209317a8caf4d6c22f549ab539ff79e32ea1f04e0a7ddbfc6fdfd0fe4188241f576c6e818e2156d64188a64548d5b19559702bcff4bad39f5af66723358804567bcc9709d0d4ffb402b48b4ebdb79c10400d43ff175df89f60051d5c1b608d87671a616c9589e76bb6156f6561cceb30babc2231147c7e7d3ca1756d02a401fb6412117b0b6e9a9e0f6dfe9982fb4c736b9996c16c390c6a0ae174deb550f5486dab3b4c2bf54c02e7ff67e9f3f00627d1e9b4762ad6cd629e765af4b026d470bcc8cc7d55834527ad061a034bff65afa62ca6b8e9a9961721533f318050e1ff4a67091fc298c9a685b74e035b2aec08ab44bb2f4c4e30cf788ab3ad83e488a517862cbd9e62c20890533af39c006f140cd24b5e0258e7a7649cad69a86c0bd0e5378dd65a +result: fail +shared_secret: + +# Private key not reduced +private_key: 76a86ace9756dfb462fdce3e1d0e409b79a49c256d8a75a9a317e2f5f9e3e48f40f46fdc11344f4329c3372ace02ce979b75c641dc5f10afc2ff1a8055dc61deed933169e0e13fced52f48ebdd82e9b355a0cce7cf349b2659555d5844d953e0633b9098f3ad6353a4ff7e809ee99d05c5a055a68e83a35b614361d4ab7e4b03db80cca2edcb692c25bb35d7d2854c55939b88e12da329cc35f607d3c94740a614390d6c89b20afd324681ce4b600d87b0add9eaef5d6b5004d740259928cef0df4a3a2a3ce412eea1992dfb8fbd3fc1569b83daa50a7687e1f8b7e3ee6b5d13ba399d5ceb285a585e3532aba8a235c4f9566d1bdbc64be56e4b088e76854868377665cc922dbda402ce41433d8e895eacf4ec8484177eadae6ab5164a37f8bd12f4b514eba7ff555ed444e5eea7a4b7b4ccb1ad8d507992adf4d1af6a60426972d5f8a19e7fcc2409584c4473f4e8d88e34b3775d4345cf42c6d7e63ce6ca351b3b41afae3b7c45a96ac3c40e36c98dbfce4e66014736e0d575d72c9c2c1f78db53e26ca5fb393c47b55e52b2c7c59253b9b8d97e1a8e8a9c0d7fae17765cc6dc683fd14c6562aa57f3c5a33ef648f1dd9464ca298b72c68e812e3613953e8aefb0d3a4b18357d30015cdc1a6716d8a534c5d31a5367c70184d7daa93533b46ef97a573fba6b7c39c9a7eb1538cc1b708b921196e97c7a3658ca9f0de670b1b79356df897fdfe180be001b7a8b9c8e322a5eca267e4db9dbacb9f4c5623fbc9ad9b5229fde647f6d40e86146b8b2c233f08acb4619fb5ca654c14d9fb6aeeca9478e2fd4bdfe56ac13739bd2fe99c3d6fc46ad3b39c5fe4a3e8f20e67a719ae6901ca82d5acd8bcc7cf2b6a3abdf995ec7a38c078d1b1afceb88937a316442426e403fb63a0bfad6947a7153ca7bb8f90f099a7d6d8322458e27adba4e26c5972ac4ebc95905f7e48023bb74dce3684267123f57243368f0c24ece1bd5f29b6e866f99a16afa85437cf651ca4ee7e8e5787a0872c536f96e9901ef5087bc898bbbb47acedc0cf3231db78d47b61edb37f3b03981bbe5cb80e81fc3b9a1366c9f98acfbb3b6e1cab49b52edeee3cc87edfac8d97f0f48633d1aedc2eab7ea10bea7d3431c8bebecd3dea22ddfb2e4b5c9e85c5a966db2105b99c7b7b121842a89e79057b6642976ef5e650aec633b1bfb3dd14ca2d1fd6746595113c7a241443aaad52152eb21bd7f38ca77691c76be86365ce2dbe3d1c8af7c559333b5f94a344c299e467a742be4a457064ae50ed355f39e0a235f269d6da2de7f3d6cf42a055ce74bfc29e0efb629ca382e6789cc95f0aa44bb2ee7107add56e5d7392c9c004fb907adf7a6695b762e8db6533a8114b6691845d7f9fccf189bdc4d3ff06e986b2e8f706f4781908d8032ba5dce871f355433dfd5ae859d37fb6455c0caba5a5ed4dd7757593fc4425cdfcd7d536f741b1a4a1ec47b600d430df473f2ada9314ffaa9ba7fe7e68c2a2c84d7cabe7bdbc9aaa44685994e2c9dc325e3b9d8c545b81ee3767373ed61c9ad5c531f6c391f293ab71a5f37e4afd78ff685d5db2aaed9afc18c18678b97143bbd538f3218a60a87b71f42e429a5b7ce32a48d5b3a4578a9eaa45aa66e6444d534f4ed46acedc33325333bb986028ddcb05d93e659a6dd6ad9f409fddb9be751ac3fc46473b4284499c5e65196871eac3730c16fbe358fae8d969a8ab5cf4eef34859bea98476942439e228dada967e4cc3d3f8d884ffeeea4998af1b3be113a9878b9f90f1e846d3ec68a21c8c4026ca25844ed1464074b84b3c5e351dd5a7de685ba338387ec6f77f9de8091cb7b0fd44964db896fa3a64cfbc9034a3d99990b0c34d91d464063c4d7fcd8dce0a4930a6e49955b5e06773d89dc618a881e91ba94d276e034497b433a65d393b3b764201583a3b57c9cfdaf0e35f6e477d725bc346b143d880d4a4ae34881395643a8fea3d1a5b797e622378cf73554e0d33905e86569695e0e5cff74e79f35fc63e0ef78745f99237cf7d33e676a626c7a679588ac7998e2332b9eda39ca33d5d099b087cc967bedc4005fb8ce89b905586a96cec6c35f11375e6db69ac7e439e000a97031b7378b99d221fad69a5ce78c46cc2c6a9efcc85fc3932a956ad313536f3a5b9810ac8bd8557528725705c2bd05331fbc20f5560259fa82d438392c7299463710357160f985555dbb2ae4438310e3879982b55f03018c17101c2556ec377b15fe6507488052cd2360b52b8cbc7856c8894cea237e76214da481ef0363c877294399cca9e38c249392d61a2772fa4bffd98165d24760bb90ce22614e892a9c7f350706427ba2257ea7a1304029a6ea715bda9b2fd682c6aec65f70018c26c3a41a30f53976ad8b83aff7268f6d9b3124a15b94528024a179dd24b8c56cc8605914ca89815f943c1c568f255b757220ac606d06a1701457b057ca323ddb65ef076cda0044cac79455798b501463d38d24cb9c65faae94410f79995d917c49319e898aad54c620291491f96362d4792bc3639b6551e5a8b7030e9870896ccf461b65fd82ed0f69dad10bb60805c553a1a195336435303c1c8834c3a25c2832bf7b62e1b50c603951c12ab6b74eb72f4b15abb5455d9f681a0d5a290c0bf0ae79b03973e3ca80d9ed283272592fd0a64938c26803441dda5907be52aab1b9ae14b62f9db044cc0c2f5f48f0b8348a6b26631433dfb00b180b721910b8fb533cfe4a8be1d250d75a9cd492ca059fa115132ae5463577de070c87944bc48695f3b4b04014e9dc29185446e4683ae2cf5b9b3ac399fb6c6541925075b7bca7b7326861dc105b3b57ab55a8117ef69b33cf79665663d3355819dbbb235f9693d7c0062e5293c0a32d7342c18648500f8cb3ae925c530b6507418da33a819e57897849bf3f36f6bd68287f7cf8b5281e9e5af40bb5f76c63d4a14cfbdb8235c6a95415c4aa157568c34ca9f58b3991a756bf5ab9b658d9464ae207206d9d2049d9145b7cc59261860267806a23aa513f3c39cd7aee8e71ae4b3a4a6ccc570f179148c2aa50bcdd612bd81f8206fd1334389b9a726208db920944530ca839f316161b89a59350b2220a4b6c67caaa2425d78da2a3b454e396386c5500f7726aa38530b881640a6870d2e5100ec0c25d5a39bca206ea5652b55a8a31cebc84fa62f2ab6a57a2658240a0f14841e48340cf158bfc639149921632047ace0cc2aee5a3e0f647fc0c671f648c689002d98910f78b34e80c523f9073e4e4c9e6e102818e996d3a30886e7bcf18b69d2a16fba1181610b6bd248035cb90d8d440f6d4729031b21a4e1237d710bddc5040047745b231a22246e517a76d76a0ee7985ebc794fc5a51c17d9a9e9acc471f89cbe260df5c4676d870b8713bca53a400cb9b4fa6c36df97a023ac03b08c621e7329635c2e9828719203852970c2fd557348f5365cc917fd3ccf71d38d5d96336026c7d33b885526632860044237b4a6b09ad392414b068144ac67972b3ce7a25753f631eb1a03b4fa2e9f553302a22eb9c721e9f2bf74a06673fcce5bdb77eb4b525d63906ab2c4e8518322d3065121a20546a8a4eb45f85881ce25721b0058c2334ffcf2946c7b9d6ac05806fa778b2041bad1c1250883873a95e3d5b76a3480d8da8b48683c5db2757eab9193750649e74440dc58a56b3ccc27b2a8177bc638b61e0136a215c8079666c77857018784f38bcdda0c56639c03196b54cbc80b49b0aba6f6a9df352cd09c5cc6e05f62e835f7a125845bba2fcaae4bf61bc55ac98bd67763ec0214cc1b7cf91632960c9ec01e0f27a97f909d7fc2486d0cabfa146b72baa14371041a5336c71305e6e68a43577bc1665c0d66c76a239095e13921c00c4ad11cdb69050f7857c3a1b70e2a2152ebcd0961a936f6146d6a58305086e934061ae32bad1b894cc27949f280320401188775aa5078b1497315639288aa2f1f826b48465613a73c5301383b69181cf14ab3a05035a79de39973ec5c1fc5869af11320350c3c4208cc68db8943a017215b72b3353b77003fb0d513bf677b81f66085e8205c17cdd6b603ac98310c9a967a7b99b8d3af10b66821612333e50d72faaabcf93612210572e6710e482702b17bed5abb5e4a57baf365c39b59dc7cbad13601de6b40f5370a49e5b48c9580a0c26195013e6b6889b99b7ee5d93fc8b795cc62a37ccc5e3de2692ad66e903c74bcc45ed6f16a68ab17d8e5094680c428a242d2fa247985a0b7d7a300f70e844765dc30437d032f216a8d99dcc54da34c0a4c25a8a120b3c32f45a3777467b1e639bcff1bb9839b6b45c7895bcf62307460df309eb4e61aa9cc8941418677001064ac161a607e24e15109d06641e916a660b3e7f849f08b9dcc32c47e4a7df2d5d4a374d3e5718a459f684fb055ece19459eb464e91e126a7a6e3ed11ccee0046da234d964c985110 +ciphertext: 86bd45c7f9fd03921c702aeca836925f7f4b3357a938b39e06cf93ca6bc8fb51b72546182fe2108eaa9a3e2b3e182797e9b2cd3199bf716a8d797a4362cdbe2135197e5348a916f1071ba69b6034a81f145f242d8011b303b872f3a65ddf91d244722d6487694e0834c59bd1262eed11131f44f7f7725527b662f9d6fc872a290d2887486f920d55ee53c68e764324a9141b1e51d83f51fc41f775f28102bcd79e6ee8a6cb7c5ae4a4d9ebb81d8128bffaa3089d3c8a28b47387c3d128feda9e3bea9782557c62890364f1dba9a9f40f3151bf2ef0614aa3c21d20219304b4ba0033f1da2d7ef2a986682aebb48cc2e414e87372b7eb6395e12219b9787ea6337a866cd1b57bc1f92b3ed07b95af0949ed4fcd5a68cac94cab44d41d8dde50b4b952641f9972519943a9e676ae8326b244d9ceba9a777f133fd61e48ee6091181f0eed4fef74ea084d7ea18e1a5dee64c2fb45f7a79a173a661ab047a965e5fddcd09bebed7997aaccddb5a428050ffea4a71ab65a812afe9216adcc0ff0bb452ce4e05350499bec8bccd91d29d99831077bf544f45d2b47ed0528e9a8c70c75a6172d8a356ab9916328076ca9838c9088a70af666bca5a43a854b0ac6aa3d1ad17d44ff57d75f3536b55b30f0db350b4147609a0b7697ede10b73d1769173dc618cab1ecfe6b42bd0d4417165b00008f7a1057516bccf53e22a911d6f025ebed8fb25358e4df02c8d7dff9969f8e0cd317db8c97cea03bbea44a3e54ceef4cfac42fa7787e993ed1168d63766323ab1846bbf80231ca255c47c69e102a5ee0d46c76cbf440edaf8dbde36c5d1977a692ed34428e73a4b5229b73696189194c813819724d60ebb1484a805455e938b74790651a9a4b823a6fc1205c1e96e306c4ed46b16e19db187145fdbf22c37ffac2f754ea752b816645848965a5afcd4b51aecab597f959cf7584b919f795f921dd5fd4eab2adf52f4582dc8849eb5a37f171920413dbd6a114cb5fdae452b0e16353dd06716f4b24b82deba79fe3af51fc98c7d417ac5e735ce3b19add258fd6e0ceaf98830e82e273335aea870e9744505713a083655c1295cb6bfa26c07fa2b8dd8dc97e65955e2001a64006c62392b97ec5df62c88e3c2debe1735c0dec98253e7ceee437ca1541f3a73209b356fa4b2e38c3569cb268afb062319f05a8f2853c9f081c5185386d5f5d8336016802d805c536a72e13d54c13aa3c1e1bb79e2f0dba1c143bf4d903b18cfa956c2b5276def5bb0bb4b5f89c834bd19e8badedefa2f0274e83df07fa989537ba8b8cb8af458f7a02bf44b269d6556dfa91ecd76636e56730e35b07c45a9143afa4cea876258caf6e724d7fe0ae0386b9eb3f2c45fcfa31e8f9343e771e8cedb9771fc864f0a728854e3b9fc4b04c30f8c8adeb13c6489b66c5f68aa5cccfb25771b666340747d0002bd70f76ea5aa52446f20894af51a9469f49e16723ac9e0602f1ab9297f072daaffa8b4104264ae578c1e3789fb405f01b44c46548944a46c87b3da0ac08493fc6e0239d86568b1132c2ad430ac0d76bd2046bdf31e98b3bfa83eb29ff895c05cebf28edb792e7678ac7379578c1b6738ff0ae271e9de818f7071ab22798fbffe9a94e728abbcffa249be1f0aa11bb428740f2ee39bf24858bc583b1aac546c1ca09fbc87a5b46df572be14e6fa9f6abc4cbe3bd41bc100e8a4d2e73e60f5251c931cf133d2883de857dba56c945b6b80a8872ba0f505e889f9033915912642c5cd6be706fb39100f3954b93498f19c6c880215f179a331859af35da03b3de56f3c18fe2f2bd84ac483aa86fca3698f82ea27c15fa6c844e225aca5647abfc0747fdc5570fff8209c288d01c7f405bbd4d2da146b79c4e394f999ca9ac92179680943a62fc5b7af0e4cc71fc15e639af6b70d4df4e2cb2c7382436cc62ed422186e5f88219571786bcf60f3efd119dc9e06d2cf0c9aec122072658525f86ebf99579e5733f4f8429bfcd75f0ac58bc9823eaef89deaf510503b51af131a81a58a7eca063c310cbaff194924e98c4402beccd0c7e83c1233bd87c6b32039db84d961508e60b108fde7ce1b5f74ecbf28362c1db18414d66a75742c5f2d6dc3069960cab26d2447d7fa3140b017bb3a4e06a0b8183873c4f79b54f9afe05c7885a3105e49b30dc6beda36118f074af630ef7766a34d2d14568eb02de6 +result: fail +shared_secret: + +# Private key not reduced +private_key: 26c5b889fbcfb609edd18d5ff87c89368c9cf82c43ab7dc6f5abd1e297bbbaf7b8c943f722cfbdcb15f6799fd4e7674eb1e975e3f6d9c82a97988787b8bb8daf49763bccdfbb9ffa3deae9509bac10396261134d051fd73deb6b64ea8e0e98a560afcd38be4c1e27cff4e64c52bacadd3e9d57246b007f45aeceed06ca87f2939478fbd94a06361d65aecc9be48b653ee3ce5dc618535903b2669fc4c344f4576e830f15638dae3583e387d92c6cc21ab77eb3cc13969322c8521809346a873ee9d9b888b695f695bba983645f2fb1a6b3dbc05baf1cb49a51dc9eeb5c9c7077495e78d0fdca87d4ae5ac0d8cc2f2bbfca26f6107b3c2a77d039fce2aed5d6e92d40d07fba510881a408595e2fc88c9c8d0806a079fc6f7fd3f996273a0496c61b2fb9c889f6aef37097c947eb587559a4d1d2aeeb175a770eadea453ca20af484e9735a27a7b4cd3b52a34d9a567a36990e818f2f314ab369c1fb93aaffa66904d38128bf3b9f9424d84ba9cdadf8cee1a46bedc653dbad947a4d29e52719d01c069e1b0b7c01ad5c3d5fd479ed5e49788e27e7e2aea9d29037c2e3fb4173dd594d69caceccd5c5d87a8bd9e66217ec3fdd7d85ffbd477454e4fb37478e51c0c346053a3adde76c9575386f63bf44ab4b23d3852e274cda84712a28777d69cea67463e563722d9da956057a922c72a69edb0e5895f09baefa9473937f5c431e89828eacf158e5ec3e6855066145063b7536da4c38eba96538073971ac59bc5ea863161a7c0aeca7675f6b9d6f7d7175f1aaf55173fb8eb83d8805b47c89b5f0404548a144589d15490477ac5eb56c62e441d728a809afca8dd74982efd5c128e3ea165e05b938cad77be35add171fcb2ec6c90f6f83aed35065e74a4da9d5713bcab4bee05297e62786cd7839537f186bc77e7f124fd54c58fba0765ab95cb2b4bc4e167d4f5818e08244bcc159d338ab97cc94a2a038e4ad54dd34bb7ffd753dd5535f6b8bef35bb446577f622a5f2e599dee2f3ae36a468c3c7c21716411cbdc4fb1ea3e2baa335ce49483a404f6ff0cea6926ac56dd1fa856db5ad60bb86f0a3cc731b8ac0c48ce98a90c7dfd617c8c142697425a7b6017555c81efb63769d6e8e7e0b9eded84cb437afcb9b2e67c8adbe998b9a42a435456975782d9fd0aad3d5d9d2e918f092ddc933665ae94d68d3384067be97c72ad7c53d7fe9baefa17436c41550a0337cf70c68aa3fddf095fad92853f70af6905b81c528bbec8f60bd1d654589475b1883b77a672f7bbfe8b9bcf5f8b2c53f994d975cf6ca8cddd9f9089cf806fc49037b3c815f448b65812124c82cfcf601268f0e998bc41854de6350f56b4c3e3eacd427910c8546931e32e88a8d1f9c573388cfa3bc93f57c634578f387a69d432db756f7546d5687dfc9586245b6bb08a9d78f63e68cf11363d1ac1ca2c09ae52323fc6cca56b7cd5c91d33c44bccc515ab429d9a812693eb1f3380e69be20fc81c76b57bc99498d5f784ef3650cdf96d6675c7ccb55b67a59cccd9d44d9499b6f43150d40f2f3dd1ff3aa0cf66c6569cfa7dfca8517a1d5c87fd1dd693f0fde8f2eba5a5afbebd77cf55698b2ad9b2d05bbf7d973c5f5792b165c35cce7f873a9dd95a6979f9d104ed6bd685fe83871ec99772ba3c21ab5f3852e381925f7cfe7646717c65cecffa2a9ac97f8e8625455c2877346b378a4653aaccbe644fd75762a9cebb5d0f0283013269f1ba7dc9e0e588a149c1d98f3ec2e4e76dab3966a622f8e5ffc2fa39e2cb7898b4245b8fe72557d51785f3888bef9bb9f1ff3312ad3fa0534e15bde897753325378ab94c5ddd527fcac3a453535af259ad5d57930c035a504ff6af358c5385e9ff54cde602bb8266abb0a1854524b5311d7488754b51c77ffa0b3312e356a60d6f203be678c34e439eff720963a0bb5ebb454ebd3246adb35e1ddde32abbb85c18ace9185907dd3e75dadcc978ec52f9e388ae5b4cb4acc4183c588a43e08986e4ca45770a5a40913ad353549c975fd60d540039fd40dee7af243614ee4cf046bfc10b6845d8a7704e4e73e5cc2b3a6439acb9b2efd901cdff9c46945c2b8ec7e7742fd96a71076e18e6e8154aabb8e7c9c46bf436f23fe3fd48fd5fcd4f857b24737c4ea6cf1905fc562345af7a1521ddb8ce3e91a2835a177988a4e856467f6ced236ada9bcce8ed885b19b862b952cc8a2269f35826a290a90c170b7f9195f816dd631b1ce66442469c42a420fad3970edec539f11826a4a917ab105123b4c14087f7b2455202a5455159e828cacd84767e5b9c024f4ae6d37596ca7570fabbe591082de627fe04a97f45409fe265054bbb57426b6cfe71825837b4be360ff7b48af3a7226525b77c450cdc4a483a17d77e723c8b1282bb40fb621731fb504277ab50f171bec369818bc3ec22126f6a47ca2937f907890c7815a1e115143f62f58550a0459ce7e04695bc7737787a972321578222f5622449010287ab844e624699a1ab50bd872cb29bfd534b401e538c51c12dd8c467a14c24f5c9856234da17ac5fa28870dfb70565ac954c440db457214016e301736520b5e15538e92d1cb205776f849cc0b23211e6a67ad5c9fceda1577e625bd271587f939fb3acee14135613592a7364534c77c2a1564151c12e1c6a219b878180001e2c94053ebb1282c5288a707ed7b245f15054d87b901c939373244f776ca51b3b9d00628c9a8165993974bac2c0b26715ab1a1b9706e8264a0d210a0e627ae60b59ba58a4abbb61e93f0cf31230a624591e0d1a368390205d6526889640651b7cb71c26807b11913056629914fbb1bc2545b55b2610f992e73812e82b73d10a541a7c8621a4690b2c00149b5b952e91d992c52e8426448e5936dd41ed7725ff1c5bb54803690e7b642805b168829ee5696b5d51a13560a36409a1ea41f03ccbf6bb86a1b205bec128ef81c2af9701752fa54cb3784081b5dec67bceea87a8864bae5bca2aeeab4eca30d460b4015870c0187b2519783fa030a3774277e018274775ea2ba027b8624c1dc569416a3117b57dc5b34a1056e4c9b1ea54b6e5f55bf1cd3c027cac8f5f9b9e4c921d98692a007ac22c6b044f6ac9ae5acc4aa3062a348eb2cad9e77189131bf56aba2d86612e01accc76b3222b01d30b079ff5250e0869545641213c175bca181eb738fc7e80e989b43a0c4c7ba0b41404abe955c3c01859dc17b35f48cc39e9c6ff84625923c1229e9b7c3c2ccfa760c8808b43225ce4fc96bf0c0affa26aa43341f7f14aa37ba5d48798c1661319b31325d04afa0759c35153ec77b07d5d88050f5a1f55262860c94990460341c6eaa32055a480547bb0829d5c3398208018b4c098ac686f1b18870864e2cb0777a798c221a659a0e7e9c5c2936afc4897a611c55086330ee1689f7817f44a6c127a53597576f37b35b4f74c535444abf5342dcf256d04800b04361adc83a207952fb81caa20cc8dd07a6fe8864e562844882b405b5b4b65c948b237b385974a9d4963068c3e5b18c51d42a7a9211d4f274ee5208e530907db49db956b8e10977e2357223523a58b511fbf7993bba3c38a95bc0b98062312a1c9449ddc4082601780ea65a6bfb1467a01d9e326cd10a8e202320d2a29e9b36ad09c44127820d6d024b3ce0c818234f55d7855b0b000462b198a669bf924bc81c99ae0b32a1c21f448ac6084c71a59a90fb43aaa73266e69a077d16a8d1443de4c2b61c3ccc731437ff744b7a7cc3a02a948da951d5763f078a991cb64ca7b049fa1b1eecb534509aafe04437e5f84e974261957ba746705eaf4528b4ba3764816f45045d40e807c14c3577a25f75f69ccaa136ce627742e33db588bdb5cc339ef916d7a9b108180a637586da55085eda466e3c7734f85e6a903ef0fc91ce793910231a8f46a7e084c595177a501b390eaa818c0a9fd37c9be78160c7a398f0e80d8e58966140639656890cd08f7fe92fe316cb1e1517ae7741445a47c8ec3ff8f54f476146f1095f9973062bc17f6723542b0a48e12b7e4dbab100f3bf6dbc219816a76a3109ebba8c823cbbd9176061d072d57726cf12908747bbc267c59fa71f6c719cc7827b91919ca3793d03a73604e1c2c98ca2e99877b6c2b93c97965c06b2dfd71cbbcbc7c81cb56b36587a174e899306acf88fd2689e345a78657c5c0b65b0f3f8206e405dae4738a7061d54db38bdb2ab87e8cb6dc93f2ba0c11b65712840b740ac90ac3404b69cba2123cd335004d8e363eb08148a627b66b4142f66b18e460b59d05091640587212f4dd60b84e61f0db00ac05b15e83a6e0ed3c2bd281161cc07676e12ef19a936d073d684c1491518bdbd426eb5a1463cea8b671c02b230ed109318ca7c1470f5a0ab154b74ee3990ff20ca8ccb835adfda4867f03a8abb0a5010f400ae5722a75bdf5a2f6d5b546b34d73857cb1bfc7e587aa7 +ciphertext: ab3bf275721fa888504426dbd58ac20a234331510daeed10186073ff9e2d7b156caccc8acac8278c19968e136956b745d6ea41832eee321f9ed5ffe78b15638b64f4e467c8b02b462baa3e1a39fb6ce67a53699dda3848bc4707ad980be6ef1dd837a3bee0f2b5c1741fc83c6dff1fe486f5aff17f19596b5cfa50c48661285c395c5e74191f37dc4eb0d47bfd5224015e7b3443e2f41365b338d7806366059cf7cc8041d63c7867bf425b1468f2844b7c37e4a2a95f6be3f971002edfb5d9cd697a4e04ac19e00cb1bec5549a25ea22d581b2f7dd9fa57dfa570ecbdb6eaf15e96507a1f8eabdb5a56c93ec3b2d935180a26ce884e69e550edccffb8d5511a2a67ea30aec2c689f9209e11607ffcb3d3e59eb43e10864e45ceef642c74e065e671cf008efea88b0a6aee56e3208611e05b3251ebcb23f75ce7dcd75dbd3f393deb4a6cc4cf593f3c19515739d4f8fc3f567bb73fe27261c600608715e599e43f2f0fc408578b2ff7bf13dedbb9607e9fea6462cf1490396db33d1e86f002dd0ffd8c04c6364f422ce22c6a36cb379f6a8f75ef6af6cbb771b9a45f5093b3f0891a1c28c90577c3ca9c7e72bacee041ccbcb8504dc94d0e61c707c2bc25ac907fca7e32323f9b8056ae7b655587e77e3101dd9c7901f81472086851b78b083cda5932ecfa518547f23702ac75e09fbc45dac81c94817908ac1ec29aaafc197b9f743b87cbba8f5733730dec689648da1dfb24685b79b4a4b78cf9b3bb844fbbe52db29e96e71d0c2dcadf6a9a02fe25181e87ae45686cc857de917a7b60d6dcbb3abaacb2a6c6f8d59e1a052a9120a85da873132ab45dea2cc5fdc593513e172e970af99e73b9717e2e2e85e25081ad945ef3397d7338254a60d9549ce995518d371c0c672331405bcf88d6b3122eb55f876753520166622e6176436a9105655a1b21468608070a683bce0d9a959553a348591138c414f40ca3b7260737d70d79f5ff67327cd0811f695143f48c2fe55ecbeb7b66823251f97e7ee1689578548430cd832eee8701855c9a15aa932290fa9e19c688be321c4136c2dfa9fde8d7ad97bd1fe0a1829066616f312b473c0c996b50fdabdeea8fec2e88df7d7c8532a493baf9df9846292803fc682bc89104dc1f83540f3e621d0d8c348f0ff85f11a2d0d0d702857d1a68124ae30ddcdc38d38bc351873ae574f1c7032c524c87b7c38609840444f73c048a23abeee5bfd4027a26d2afe6a51460ad081a8ae98e881272c39036a07dd34b839076484b4bcde7ea5a0c4beceaf0d0c7e491375c5c8f796e64643195960243816a25f6f7e5fa1ec23f5b42c0b76ce60e581b53dc8933288486c400eb837f660be01982b8621aede8d15ab7570b6abdc9a357b338c681b208ba9ce8ec3fbf70994d5d6050686604dab7f87a27dc041acca71bc9376495ef033135ea27b9e3542c2cb980e6f6b75ea5740b1e049bff28b4f33f486bf8bb952762994df7c12b2907457208d700b485da9cec56362525562f7b967725a506d0926487f2994cbfee7f4c945dfd228894dd9c4dc30985bceb0fb4aebb36d8a6c0f1977593beca4834fa25b24102dd56623e725e40cfacd5b058dd7583fec862b5dc44ce3ed116e24191d342aac3e012285e511d4987f0183d032b37d24c19f54f35944a6c131f0558aa4df636ccc1283224aecf4c3f5b77b7a5db6405a51e060c960c87ec15cdaf5e080a089dfddc90ba709f6769c28a2be186bed959ae4b6a217b51c607f212213b1230e7015ef77a893e5816fdb1811317e321be94f2fa0bf398b8a52acdeb9059c37b65fb6ec48074eb376c522abbbe9f91d1e5661681bff86fa11d1130ff8e03ea5cd826bab22facc03ace0c7d66e0439f58f90790f1de4ced6a69b21af46c09116fdc8cc439c8e64d83d400326202921fd5300a3fc4688b9bd2fcb193d91e460dba2757a7e6f8d98aff772845df9041ce5ba2bb3e820b7af7a77ba40d0330bba2d48fe5d7ae02e3bbd01be2acec545f003d02e7601ac1ad0cc7b696905e420202ba9cf8afa16fb199a920aa8f95115ecbbef6bf031baa16b02ca8f390aaba0a9c13f9742b3b7ae7e9200307b76b79108022798a4a9dda95bfc45992575bfa04f2c69d1d887e95486438b6b19c51480afedcb28712b2ca165c942af6d08b8051222e24ae7b22dec5be1843529866fc2a9ee3af64b27a30f +result: fail +shared_secret: + +# Private key not reduced +private_key: dcbb8186f46c07bb4d372d3fb6c89a5a487a0d16c2aa674a1b7a4724176d0a3a3efa4c42a258c7566b39ef2e72b36b8102c9d0327b5c97876d2eff33951c6ce26366c264b42035d8fb4b37fab78977c76cb927d7c32b41af9e6709ced8c2d3d3c5958c3f8a84c0b44ed504af57f3ebaa86487197e583a98c446da8b467ab79de671596de502eff4ce4a204ee54e79cf9af4d35f6a6b3df33a0118b6a70d5af8d9a95c65a6c223398bf64e87945e9445e5db63a4c9707f6527ecd45c34c804cd2668c73397c4adcc7874b2346ab7ef3bc09d60d2f942fe7605606b745e6b375b35ef4b3be364353428abe7b29a9ca3d72e24b6af89d4d882f4b4b877a214e80ddd63281e7f11c17b8dc2ab00b5c71cf086e79b99cf1f7834e85b7c8f4d3b6ed9c1514ff5248c665b6b85bf84169ede65ab990eedad36f9ffbf6499f47c6e6236eb29f44644c88f00a09bfadb8d8a8db9349779570fdf6aaf342cd768d8f68ab2eccb64d67710995ca46fbe0ee5b54d069f501a5e04066d6633538e45c91cf5c8d285a42eec3cba225d9356cca48633e41bf6ae5689e51b6e8b9bf481b88df071451d6c641921e83184748185aa629c3e6139bbb8b666b9d165a2438dbcf695b0d7a539a7950b1fe33737e416196d5c7d8311ec5c61d153baebe4117b5d2f353570c15ea7975cf3f0d31389ab13409a699ab4b881ec5b5188d71e4e95ff54a3587b8a975f80326afce6d9e7b133da87ab115e6396364ee512a6a4966c9ba569f43f68877e9c7659a7f761eee5c9757d6bcf3782b957913fa2d83848f2966a6fdd7465cef276ed589269acd08de2874daae1fe42d1cd2379fd3c80ca9d6274a66083b1a5fd0df05473a056b20449d68d5af4ae6e7699ce126666276d38368ab87b114e58e1cd25dd5b7f8835e9757929c75814179943f05467eb6984bf4600bbc99cd8df2fe0feb174bcf7d25d4a69ac7694ce75dcebb3aa93dcc2cd599b73b1fe8cb3daa93cfd63dbb3e5a5bd84d5e13b59dfe5b86539037565b4e753ba075c9e0bd496935f5a015428f07b8ad5b3ec2ba89a479e6161e5b647cbdc9787d406ee09fd4fa3d7dd500ff3ac29e883c2683c6f45144ef98ecd57f63c9bef9294d7a7ad0a2737475d46e0927cc2a4ce72f5affda6d470bc4ca50db3b6ad5902508bb7538b7f9a9a42a3fe04403a0d22bad7f46d33d9eb6acecd3205ca686ee44c08ff78efbcea55c7fbedb3799fdc2ac2969e4a9c742e643550da9beb5c2a7874d971a36a278aac36ee3f48faaeb0877a234efc4bd89e929b806e7f6140d7924c65c737eed244bd0554a864367ce39ae842797cc5e4f70f297647f1a4bd97f36de55c6f4de343e26708b6f3b8a03c3d3043055457a574c9b7b7ad13e6de18a8f8c99a33d3fd7e5be7cc72e27cc8b0a397b95a79fc5b78bd5e79cfece4407eb5d699ba35af71ca6740adee5bc67b6a789dd395df6246ac0d5fcc0d0f5b92bdfcdfe9c5b3dab52f07590ea07ca292cbfd2c44321c4687c385760988c063fc3dc237a9fcdac139783d5caa0ebc76d0c25a8c2adbf1e1ca106466548558291df683bd69ca29671117fc6dd5b95040a5b434b81930bdd7b0496f9334cc875f8cf04b77e3451ae69dcbf3cdc562e9ee24ed989bafffe7b3bfbfd9deeef4a86b765fdc9d45919c2c70965f68eab16b9dafbdabd47efeedb9b3710c392f108e25eeef3784fe016e9633459ebf6b4a5f76e797f9f92665ec006dc5a5db6512dd9e5430de8bd1976068386435a52f6684a0ccf57ecdd86a07fa5a269a46e5aa609dea551d8e92a7349885b95b3cc38d3de34442c69eb0655d989fee8d3518cd7841b0563198a9f5526b926dfa02a5b3e7ea358cbdba5b2efff9416915d0afe9c399fcdecef70a99e0c534bcc35382f1b4b4283cfd4575a3fbedba05c77f316acd1a7459ec4da6639781154f5e084d676e483c9ac833f98e5244f7335796405f3a0a52c8eadb395303f8a0f5ba2468a59500ddcd67392288fb0210a3d97b546e4d3333b8ed440a6f57a6de6e9dc57a7e4815268a06273cfc08661276d5110163d6efee7b65ec986ac4614df4aaefbd209db97bb734da4bbdc9eafadfe2ad58b88b2e64ee118279443eae85abf3a814b6a111f5c7c2a7b268646594dccede3e9810dd88629ead43dc36f161381cbb8ff776b4299a36c893aea783b541b50b2c253c088683aaab40ed421eb113add58b322fccacbc9aa91b74fb0657e7a2706ad9c7c7f7813be9008cb07980c310f47c764b4ea496af60e8e6a534cb49852a2c17b4c7bf096c52c72264b7855b7a5552aa93d9aeb47f5ac34e340a094d411cb2cb962b90588a1b32dd68b662060ffa2ae2999525424114ecb4905a19a1284928ed8c42a2c5461520437f93d3cb76502201412a65983dcbe4c70b9f9320418421962005b39ac65703442002d52d18a83b08574895c0eeef19bfeebcfcc7c308f960090e9be93a01c36044220858f671bbc04f1a7557897df2a51adf85a0f7b25f1480089855f1a150bd8207edd0c63db7b99497aa03eb33a8068067d43a24957a20fdb6e11942559087c3ff343a2f5503b33756d55c9b9f29f6fe83d80cc3cbe9a00e8a31d0b986d1ef7635cfc1cde434f6c826ba5445a5933845d1cb8047a8e2f263e1a86b4f58433c5318e6b86942ca92cae767e2cca9111bbcd8b582a81aa5d22aa29dcc21f374a96e55302b837aab8709202141324386ff7f9c7d2ea068b057cf6954e6a433a5502785bf43ec8854ee7982002c703a0d6c35ee79a316a1fe3148b0d933fcd450829746c70e26d5b7b4792c40ee5c51b80cbba439c212f1c66cd619408d654aacc9c1de097a9d03478351e9a377e08710263728c08a71ab3db7f4a50774f0b99c8306f7d39c1aabc4b4bd64356476f85d6945a404df00b2da8988bc9f6b34579447dc3bda9d1a686e2c8ba67666f179f77217daa8cbe47a40b154c16a773627ab06c66b5c291b8616bd675c0351db13938c0a22c874b33d7cc128113642ad1321e5520a636681ae188f962a793b072badc69316b96fb591a99f53ce160c1c9e56384925afcf5c2dd74069f89580b3c18bc15ab0c91578686cf801b25c56c3e37847be52b5869c2b3f03b9b5b6ab0d2b5043e56bddb1c793d2c0fe47544e61c12ac0771a48c8249b3649d77ad9a4bb5d20c3ccb0ac05b51a0d1e29cc791677693b2d96b83c0d599e46b238063c50c7c101f3b3bcba18fc4da9d71b23dc133148417c2f4369b0c92855e538245f44496413c741282f5d7b1482167d90536b89165226aafd7e8aee821b22f69b963a87e4bea84d5ca3040464e7293b1bab723dd393ee3606ca2940431502f56183cdad305ea19cc3f3974236310d05220f233b383c5bc97ec1544a8528c1c74a6a48e9b9b31097477efa632baa4bc6a8abd6ceab5d774bf988b7d708926275227be2c416dc90fca4720437425ae9b4769443472e2b54ad8924935bc0f65a4740699f2051c1e53153cc354527450c8909366f696c8a323a300a28388bdbbec532afc1580faa1f7821c5a6988d8386265bb9dc1043c5ec2a1c51a35ec910d80a1a4c41755fa669a89e05de79b331bf13ecf88bff92ca340d5b961f446eca336af53a95173cbddeb643d4831c2f563950736fb912bbe370daff28cddc319ebe86958fb1794a97001a14df90b01b3aa0c6e952e79c7af072905f552487bf255e1f61536dc93824c7709492bd133516ae71c1b057cbce6a4a3d48b0744a5ceb1604e41a378e53a9afbac28c3cf97b1b03b31797c40654fc23666c34f77207639faabce69c1e98262ae22ca956bc043fb6748f54310379e975958584579fba4bd50e04b739020df78849aba007a4a23da8a18d449194073903d1a3ea4f43e0e76b299c233c5fc8534d831e69475ab6b611ab02da3251fdfe6b92475041f7814be839fc39bb06912799c553b4647a7073482980090c2c9a96b2866d6d8b65db1172bc062f3490b708b239fcc8a39e8175924c930825916386b463b645b4832bcc399b69a812a992d09d260cfc964eef5c883027a2d44743fd538d05b3417a26974bb639f494131803b10678c725a389aa6abeaf83bc947c6a3d031487488c72b1700b76f25f42ffff6595d87426b67258fb6b993508189e9b37f16c2efe87e3de705ff794b0a50cb7d8bba4059ae2e3ab4297429a3122c3e0568a64b64a401aca8ba2edd807dc0c0656b60b027290d23bcad4ba71de7f9989cd85ff43a1fd519b7eb40352d85b940208f9f8596f1946dc2366736a345d9c7501511101e81928380591c19868128a921e56383d12f19446577783e0b1665396c56cc9046c4c7c08a569d8edf0b76096e3c0643e13acf3d522c782871a1f0b31cf8e5a656d13cdb067db3640acd507a2fdc583369ee08e235663a202af6720934c3a59b3bd23b49a95bc1fad20070fec930b6060bd827d742b077092e422268e15d +ciphertext: 43caeabbb0780353630265f7ec031e271d21eb33a99193e5103482cbbb2be9eedaca422f46f1467f31f75e4add80f18ba0bf5ba8baf7f2e1f3f53a10a49a8744fbb5dcbf31fd72b8e2f43a3ccb1297495d690dd23c0cb128a080321ec598f9b10633d3b00fa818d199dadd8234dcd421fee4720e44b5b090a844fc95e37bc7e561507ebaea139fc9c2e137d6fc7dad05532bfd714a50afed3e10d6ee30ea4b53be87a81a2edc6f41545f1a4c4e74226371b513ba31a0a05123882c8709885170d8b52bde2488ef13627d3168af330a914219cc1c869b83a531e573025839676125100b376d6c7e19f0a8c39a84b7942a8f493803ecca439b8b0d6aa984092e1dbb44552bef183812235bf7c1771883e56ec1064166083fb23be4a7a5ddbfa743109a692c282e0be159447fd648417801281944a32bb68e39dd18081b9c2bfdc2828fab3089023acbe74ddcdcad8ccafe75030dddef45a3b323eabf4b5aa07ea14a814fb80ee16e8208fea7a21ff0ccfe155b5547fdb330c90aeae7a9fc63090e784d894b4dc25396dd989e3a0ce8fac844472170db804106f76c360f666860d50e4d9d2e44b32adaebbb84a276fd41c50067bfc7f158391ae6df38cbc70712d6f185558bc295135fe35781a73ad1ea611f33f465feb4201336338e37bbe146f966818902db5d9a8073ed3306b5946e08bf593352f9edc6e545d477834c77ae2239fb89b88650e1c3d7918426ddaef8445b7a32d6ea77dd761ec980b5167a3fa3613d5c7edb02227fb57d7981290ad7891ab98c1d127b75f5ebeccad787c9f6d2d7b3fe5db6ae2838bcd9ee58cf4ace6de6febaeb2062b1029751357733ca4946fe95c17ffc65c5ebcfc0a4049e55a9cd6ad190572fb5ab0d36244d01fe2a76ed4cf1fc6e709d8ceae012e613f81befc46810dc9b745f918d0587238d304840f7068c2c6f646f569eb5aa6c628a2ac4a77f270e337c3e7e809d83ed3075b9ef199fade755fb0ade87d4458305cb06a1fdcc77888fc772efff4ca7588499615e18aeaa17aeac591bb93f2bbf3d8b363fec4f7f62363ec2bbe9707664f5a18c6ff1d1198dcc42740324183a530b401b3c480f10531c2eb23b2b2fc9b4fa5891fe3c38ce751258c58e2d36eafa05b434b78018a91a7f010d0c8aec5460aa4ea0c474d888a7719c8fed5a1a171bea5b7783403435855b66f0054018271002342cd8927afadf5901500ac05f86c53f245210f54d4396053b5e4cfb140c9d850889f022447e947e039462f169dbfc6f58ce8a8aea3eafbb0bc57c5c34bebba106411e6606fd23a31e468e34677db5c4e9fa3897b05a4e9594dffd4c3c8f3957fec8fca9d6820aacd586d280fdb364cc83b001d5f4a167444fa461e9c37a131bac23fff2c500bfc4779bfb9e6f07548012df8af569f743aad0349c1ac04bcc61f949324284db3f9c84dc37e19508d5d9e4afa3c1781ea5bfbdbaa0d40f54e53a8146ef1bd01ca96fc77ef2f06b622dd645bfede60e92533b15d5eb753142cd2f845afbf41c3e309bb610b9dcd7642cbc64e9554b5dc09e3cec0cceb778d66891f6edec41e67aa4229fec60ae15f7bd3bc5960e5a6a8dcad120505c4071a722fdbf28fdaa344b132fa97f601743151eacb3bb04d071f4c566ddacaa02f226347a9368545c6f821293e6ff3dc6ee11c203e8e02055072e0cee63f0b062faaae446e595041561d57b5c74c6457b58e747fd63d7b1e9fdb12a1ea7c7c59a5d9df42de4c61c0fbeb55d946351ca5d78f41f5d569ad82766a6c386010d6e93bbc3b50cbbd06658bd416ae16bb3147a16131892ce84acd8871111c7e058f28f401518ea00abd0037d6be24195d0844e17dc72509aab8d39d2bd47cb43605ba4dfd475e603ebfa243ebd56a1f6544e705e59899ec3982140d8b783e523d54e2998bdc59f6f7e76a729184f09d780c8235456a595327298c07a146d4a52ab9f24da8c3bdfa6e77f0dc216762884adaff8c582a300daf4e3c8a532817a3b6c015328e6af6f948e239c257593c61da28d00b834c1b23ebe44a61c032b96b435d5a1648d2796e500600450ab459a1611b9dcdd78afaa382cf31f1adafeb6c49eb3ca4af14878d22f9ce1a567b1e502127d5f4ca85afc070e5f59aadadd86b14ac6e6076d247b5807e14b935d7b05c3686e47edf3f9c03f0aabe274232953e2199073d78ad827e77739da +result: fail +shared_secret: + +# Private key not reduced +private_key: 7d1f448f6c47d923c2aceea0d605f69c0db5b0f84304fa9192c5ae32fc6e7d0c6d2defe62f2fec4e3dfa02ddc471f7a959f3941fe5665508d9c139b4728f7d24d97464993bb77b69a46bd380a6668758d4de793a2ac3ed759d70bf174ddc9ae13c5dc8d21d37dcec6ea71a7a37e84e133551495afcfb0ebfbad6dea379eb614efae77d7883c74fe70954565abdaced7364db5c760afbfecf34c63b39fbb597efaf5faaecd7d326bc079e8b201630ccde66e935cf713373bffe749f0a579b77c185a9855e444a354ad804065c375de14d29b25e96ca34e8912454a2c9d39f364ed3ac17b7d384f222f6d5b60d43e06350e655bda46760e6073b081d69117fb5278ea81557930fea99f2ce3ae618930466305cd56e7879c456fec7f24dbb37dcb56d8d7956ad84a7866b3858a7847f487a565da243c7c328c355cbee22df5c499bcf2df8ffb77349d81fa365b395d4aea82d43326d464cabcba97d634fa0f542270f9d5773d4ab16f29bf59be0a3be83c4a927157db10743b9cb4070896e7abe7484bd7d185aa097c790b1c8e690edaa02f47966feea1f63587cc5e2d66bfcf418dd8bf8d609edaec5d98a788e3492e57db95cf0b3b4a29a1f466c2b693b2464dd8f48757b808a3e727b7f70feecd6d86339886a90ec6adcd5a66462646f66a9bfa959a5c89daf13b777f31bb0d1a5fe1c1af41aa743b54bc2cd4a3583d735a0774a65a57a1db99fde48381b456b2e4e5ba066ce94c8ce2f144efdd7e465f3aa19bbc8aa2cafc86adfdb06a784a48fb617bf3b7847ba1d37ce83fd10dbfcb92331c49dd3dc87647025e46adccd2a3761284cf2209dab668e6107d69d5b58e26a0d9f43facad5e5f830f53df75be72c4ec1aa693e2bb9a2a1bbac5a46fa9c29df142b71ee7fe429b58e89bd5851668bb0193df47d402a8c6dc19591d94d90a879b0c297c2b45fbc74bb6a91a598997cb8a7bb3ad9553b9fcee4e4b44e31ef698e83a38134be232995a66644e2adc309cde4e1dc5dfd7ec580e6eacc478dba4d52341ce0933973172df23f3efcd7ac3e7be983cb75b0a9145fc3ad58ead5f88a584ca034f58a596bdb2a64b42a471a2c40bfbff2cad464790d7cfa8eae7b179f1864a76d0b6d3cc3324735bc2c7474a7c9778777b01cc85c67fb68f577ea74479b6a1e37a006d0d563e014ab4261dcc4c89cd7ff298eba2d9d3234637f1b8bb0bb506d68f467247fe6286ea885612b0648aa593f5436873646406cdd3e65a549e71da6513ef1c0c84ad16c7da90f6b2d47334553967f749cae2d421cefc67efe3225d694a4f84faf99c61953a5199a556b8b6e86ac9dfde4f23fd3adb386f3d5a6c8a39fca4a048a7b7fb7cde58f61fff7efcc5290f5c55e85f7496d813faf94971f3adf577d22dc57175af5188ba951a7d597359c33bf4032ff64fd84941227f7c7b4940ff4cf12f4ce8bed74273adce97d304af5b274e44eb34c8aef4761919e7b0194bb76af3be748c15a69525aaba908baafe6f67b424dbcc9f8670b16a84ea855d686e0ec1a6cebc7ca15534bd84dbde128e6616de09415dfc8c58a48f4b87f98cda98e569d03be5ebea4418b86f93aa5f18a9e2873418d5bc9cb849aadcbd48849e4d4139560cd72b27ce7b02f7e7e3bb41c666c8caf69e5d6c9d15ae3b458cc7e7b37918dd3e5ad89f2a4ef4ed3b3b7f7caed6dba21389571fde4622d88db43d9592f54e7a4667cd3755f4b3e536ab68f36459ffd4c1fcfe0e27f59007f4ab9eed52a7cd3351a829b0fa0f9267e706f912b188627e9d7d11a85237ac296e362925e516e495e69c9bf93677bb168f900d5c3ee554d9e59ebc1a7f239c96d17937b094795e688db84f7baf963d95f9d9c11b9dc2e8d3a3d8af65a9894d9b76988f9b54edd33d5cf46111dd87987a1f82af028ad36138c42e0fd656e4338bc7e7b0db9f2e677b1d6447565f5cdf30fac9f7f32c2b9626277f9c1f683696f900b3f688ad6d716286edea3f086df37756eff610881b64bee34b77b25f3dc757f969b8bff50bd3a4fc46218ada563bf7345eb8039cff1619e3bf658478d089a88eb9e07b559d268be07ec3e9f9a752f8ce10633821fdafee9dc3b94e9a190759c6c4ca9aaa5547c1c86d714ccbed6c41ab53d3379bbe8ce89bd1860df788fd55f8281fb1c51f687aa1438a329b100805f99f016d9119d2d06c1a6978569e7c40cab47ce5cacc4d35aadd89047a3bf7175cd8833540b8a028c27461d334b3f8680daf57313d7713a35075ce971cac3cfeac02774c3589c21232d5a73d959705be77c3ca0884f8a1c3a89a1059972f115257bc0ce9f13271fd73e7293bf944b82865986a5d56e6c9c825c83271f42908c0953fea66de4ebb820013fe9aa9522ab4ed66334de641f8e66766bfc47a7a5156c182c0bb3628b81b59461b05e3a11d945b36a3923b12abf8f698d1234593d0c784633cdaf09cf8f4148f6320b15c48aa81b1fc3e79fa4055599935e1076c8c1780b1910af4ac9652249b0c64c94137132a12ab62dd265334cc46a3444437a74b076039f39bdcbe2016d8402081949c8e6066f09839cc0adfb5215590aab10c51bb03b68701b0692d1c5c47c58d214b139b83562728b3a771f25cb7638077c4b6b2f83b11df2369ebe9b4e51f36be72bb04e1b591852aea0cc31d1a774768940d73801b8ba23f71c542c8c01559862af4950b7e21f5d4abc3a1104251574e5597076f971b46c370fb1858a1cba35353d29a23db9e756c57a115539824f5375080990b3835023f448a2314d08c6897da5ae35325f9a6107ad4ca05d653ba78c5769e51b368c200543c2a2884a2d504a73827009d166218a981189b5556b38df395ae007772c1222c3e2778c34774c87ae0931bd116c82ae33b3454808e07cc5c6d16c5108c155a451e046260067c6fb0181ae084588017fdbb7ae63e96321290bdb4b3867074e6e684b700b7d5b1074641c5702e287d257b8a54597667c1ccc702f735c30bbaa84bf405123602572962ed89c2d7a3817ac4879d1392f9199c003e63666f1cfc6f91cfc9386b18615bd36913f010270e8a4a9a99e772cbb994b4ca926bf8a04cc1c20c885d2683301cd8c7b381190b0e3dca0d6c33fdd49465fd265781a16fbb546e9b6c6ce0462c604b9fff09cc2d4608259284b8a83a877b9fb18415cd60c37b0b3d6a48c803a61b0a5c9675018f64a013062440f0c40c62055cca7bb6cb9a293193485fc529922478e4c620a73144a57833d3b5b9bb222f2f4b452447cc06638fac1b4404402449a3cd60bcb2fbccdaea42086682ad7f972008276e4e5449217088b485ce6757eb3410c62796d0e7a643a3c72c612ab165475f6e51456d498e858aff563c1f7781035fcab3c85cfa2f207d1e4703d3015e14689fa0c9b1f57984b678baa10cace44a2fb23bc1f317d5304552306183435c62012b2ccdaa9a744575f959b57b9ccc2c28e1a94959a812da6f259d11479fbbc97f54a57a986be61f49ec42124da687221aa3eb3b2c0298249746b20cba291f1633e784608d5897da13a20ea377df6b95198132a7fd526d065250f97525d809bf9cc7270c7b723cc95dc9c8ddf5113ec4c8b3cdca07a7242034741a3cc684a998514fbccc435a8a2d92675e6c3f252a7019a74818689574c6ad907080954557cc12e1d47ca23240b78c2301f39c78127180c268b76289132aab01f457adfa649a4324a08e0bb5345cc2ef90fe6e33588d6adb499b04daa642fc01f5777bef8a7af04179630619d13ba0991cb36e8c23f16baab09a72e7388c93385331f7b5bdf420f1e75c7ad28c54df96df3f1086fe4120843af7c7878b4483956b022ae05112253b97e6a61780ccf4047589ea04000d57593622983e8187a6232deeb59f5e147ef1628a9f692b8bccea069cee6f49533b7301728a3ffc85d7db98398ccb38523254f843dd79bb58b4796a1fc6d68095b8faa7ff9381d01d61bd6694f2c225c46086031a86105661033948c29278e422b304dac9817401af89540a29a1cd6093c86a3878c226fcae156b85038f4ac53579143f2f5854f825b0d45bb974b724368814a9487a60a6e41261470935a90ebcf45b53279c67d92330556e99606dc22a2419021896b2eb750b2479aae7a706b1bbdd9514173f23dd3066161a0af8a6a9ef6aa7efcfb1306b9c421f63be2e376f747731a233a45a8309ba8182d24cf6598c26d65c89da9c9e9e6b9579a4817552a8d355ede798e09781b387c9935333b15d92998a4c736d266dfc2ab61708fcac7b821c01044492f7f4bb8f37b5026790f3a437cfa63af88341b95a8899ad31b37491ce3e42fd9b3701a63d537569b75a6b4b362c14f1b4ba66ab7914c9900187f105744df0b816ba22f5d471848886dd490d5c76169a14af42c03b0b56a7e26aa7ac4e99c0e7b82be89bc3c1eaee6680aa4efd394e40c2b3f30523c8117f7c26a8969 +ciphertext: 61571d32369b0173448b4bbab36ed34c32b4ffec1ba3370a0d7f9d7bed5e5ad086e8bdedc51267f09f4c9e442e42a8cac476db901c5cb6d9e599f64aab780b6b7fc119dd1ba42bff5b16f54e9379886baf6cf4966d99948f0392ff96fb1e027af8f750487b4bef68a50e6d383e927991b6932eb9c0435895c4823e9dc1f3ddd167309180e82da6a309be4debb3dd34b86bb545a24d20971f850c6ee2d21ed70dca709b78e43bf011ae7a00bd916b0e5fa520622614b5c4d0b8852a72f1231bd63cf5e1b72ecc8b13a26a9af8092852db8a3ef4f9ccc31248a5732a6744835a9554f6a14f8778ca9727ab30efe3cff4f66ac0510262d476380239f9aa249b50aa6297e5efab9e2f407559990c60e3816410912b0cc3d480d54c28af0b81c921d9f2b79fd3d22a33c566930b4f70cfcb23196a9e14b9bb3593a3f995bee0e9bc64c415ef3d9b532d531c9639e233fff5c5360b7ebb8ea11616f88e1dbd36b6c3d9037df99f265861b62ae4634b66baf884c1b72f581e4b2d5f1fca24385a76a998b42b5b9a094bbac9ffef15b795fa007d0840d4755a7bba1417c2e09095c5fe5cee4ecdb2548eb73b8d6296a2e4303e79ce65ef9187b7e7ff9aa087e52eff322f7e4ab56fcb8f0732f336318d2dbc2e485a358e36d70f91ad7149f6d7c80401216397f32f10928a0572896583c0e0e2ab0b33906cdc8b59a41ccb83e4ce9e1ff09598e45c05965b3548f5233b8ce34456a373f7ac51547a1bfbf91ee1947fb2bea228e76a46cb1b6370247adfc245fca831a0ecee168e16e71f87faf6c43f3107a2183d4e5b59052707f4bc2075730986d7e637ba5561feef9cd68951e45898b3d6bd107f236442cae0bd583904f53008ab5d291167f6f53f1e4e4040332938fb59d8b71a48b7274280c0fd00591b2140650b06b3a71efdadc63bd8a6b0113cc763fcc97f367f6c57e3e4456953b667f6b2f98adbcbf85d1815a6a7491a252b6c63c40674fc8529a263f64218b7f88f86fdf5e770e78743ccf29ddce1c499224b0263d080b7ff5174f332041f94972a927adb8c6b9bbda97852bd077b8958e83629530ed15eb82f46751d0c8a01a41efb9bc6c3d989eecbb66719746e218a9ea7c988efedc9b9d9cb42595fc3e836b902a1281a823cec78d6bcd9bcb8fa2f3e0ed6139f007e65c9b380f635187c66d80ea2d1ba706c7678517192bca307ab3bd796eb48a58e22f5caa6c2dd22adeb8a52f0e176d54a3361d0f71bcd46c6e10bad4892abb4b9bae96ced17e64bbf8f99f7ee31d18f635d2e775c554a6c5f0a7545d9071b99e35d0b3e6a943d1f42d977ece6303ebdc53f4f168ffed2ef618ec69967e376a111c39102e9a72c79ddab5fcf5f41eebfe9d6558a5d1e1fdeb7902a56cf436b1449e1b8fa89d5e2c0ab0d3343a84346ff7a9255088fefe8a04718c4a7a010732418694cab282592804dd6b808fa66c869624edc3bf66ef4fc81b3271e6d20ffa7b17e3c7df0c1d5c7f7324176770f8bf89b8f127308fea0bf4f42f363eaa11fe83e790b493117da73032446cca8bbe3ecea86e08ba7bd64f09f48ba3106a7a8c30ea9962d2bb950bbfc4ab12e0b7aa098c763973b7ebace2a7541fecb7b380b84c6ed706f0db059d952f0b3b25c650b974ccc2afa8f53ce2c746afc6e51e482f8d38c7d51ba2f304e89e4b7f5d3ab0784d891aa20ad7fdb03e718f5a092984a82b6bfc8f94c3ad1959d59fa163deae47091768e923f2aa072c8705f19e3de919598e85f13ed240540e329faa942d60f489141e55a01c49f69ff1aaa6961b867ae13b77325ca8c4fcf9a85aa1fdcc2f35c94ab7765f3db7c1502ffe33b73046238d7a38a66a8a21cab1af9ed6d46c39c8d2806ed98949e60be6864a277da88d93fb3ea64983c8d492552bf108b6d02ae15d295b3e071ea002517aaf1484bfe02f20f9ea52a4761d7bfbf220620ff5ff5a5728251f31f46efbc5526f04afb170766c06c856a355e831ec6bf4506812711314c96ec4ee7a25243d96c768048b5b2a527d970519809abfd2f0ae56e0e4b20dce86f28aadf9eff31caadcc7b4b52c0f285bdd59ac272e7a8a900e346612e2745f51700ca7694e4c85b13e25fa4380d6b4f21ffebaaa63aa12e3796be74ae4569ab7a19f7ca8adc75a4deb44281cad9baf579ab7e1848a30b734f85b9a2e335101f6227c9545e438e84305a50 +result: fail +shared_secret: + +# Private key not reduced +private_key: a9a6320957db02c598d426b6068ff56c3a610ef7de66efdbffac56f547ed8a6f55fb79ac3934b43c78ccb0cb8ca428c976edbe2fadec8509fa50bbfe2f3db75953656e87c5108beae1cdf75c0ab1e0b9d19b3681e0c9d9ffebcb467447ea7c8a4328c7fd485f4a6c6aeb6c73101dceb68c3a3974bb5c2a37f3c588e6f9d58dd458f478b702467155d9a2b1df8b5e6dbebbfae6925cf2efa742f5ace0ff235f3fad5c51b7f1ab75550207b3a6f36e34683e7cd5e2732dd1603dd82ef4aea2cf73ab3ceadcbf35ba69df038df8313b9fcaf656e4747d056e422efc56527657783df23f96d0f9c3739e185c98669cc76af82ab8a663285afab5b1b406818c19508f99c9f36ad1144a36fb8a68f135e6b7fbd9eed336bb0440a013bf79ce9ca10ee357db7751e5b54033a74fb5ac25dd7fe2a547a0f9882b83570fdf9e2af4d3ee09e2c48f7cce4a3b926b4c5fc579486836cd9c78cb53736adf70798aa6a67d7a29afb48a93302f4ba79c8882e33f56a335bd7674612749383e8399c87e5bf53945e589f7c2abfd0458ee43e8a91d58511d975bef95a305ff53fa0f7d2948431db7eb93cd319ba5e2b5cb7dc79d8a9fab80d1ff5f192d7fa13f3c7a5eba437fc05354dd0b9a81fc84708643b1a298dc737fa9cd0d34246430cd396d4e2e34fc1477ab0f61ad5595a384cf19a6c37be499274b870dffe120033092f7da38175388645c8679fc5f2e3a29d9e0333f70c89d376a19a3d11742376c797e55628adb813aa4ac11df659b4fa3fd7aa13c9c67ccb9fd0cfda380dd93a3267892bca285c93c45ec65d5eda63c3bba900d51f35a939f1ce1b0356c161be4921b4aff79a127b35b5a27c43135fabda5a570c48327fb7204d7ba38a79f35ae5ae6af750e27a3e62acf8fd87329b78e427aebf929d1191af9fe9fdc7656969ae737055fd7c8137d8eac5edab4eb607bf57a53af4d0acca2266619fd81d743ce9803c1ecff9afe1cf4ac83bf3ebca2bdd35b98355260d3e819d7c4ca9c5550a7fb34ea388ed6fa04cb6d07fd83b06c48518e4b1b4b65e3a3ee2037c4d89ba1314ca2c47b7dd8ad6f1125dbc5188178584f836fd5b693cbce5e612c13385c98b57168b0c4f9a488b8ed31a3429968310496a665446fa6a988b7647b95ab582193543906b274cc73935d73c55532d7e9af4066998eecf08aacc5a1ef3431255f1cacbfb48d335046cdb04e6417c8dfab2bcc834bb9a377709069a330f654929c39a0aa95126cbf26fc320dc34fa8eb706234878c5e6ba9854d2265acfe5ca3ee0ccf5b4e3b884a97586d84545e6a524565346bd2915fe003f7eef74ef66b1fe4893d3a56998505cb4021bec38c859f33e9e4ab97a0bbee3f621ad9108d382be3a40efa723bf42fa10aab975e485f8c6d3a96f1a863723bc4ae286f7c18287d0cedeb839381920dcbcd28b4173c35b0d874dbbb4e7e3793f16785743cf82e69db4b4960c95d3152a8ddde8b5cac7e86fce546a874fe7a43a0e939c17b25c8f7ca3b168e4ebd9ecc2149f0bd35848d8b412d0f69fbd59f7448fa282d6f2886b33ffc71cb896f235e70cc83de0719f031f6dcab064be5fdd5b09f428b8bb522237413f7fb18949cb06588dc3fc5b53570a93796dfdf6a22ec8e27b9a042795901b97507789905d4f1b4fef60263ab7059f5c7d8ce3393ce05ae9486559eea554ec40361010b73544c590157f56cc5de7da4de9dd859ac8647f41854837d941a53bc4e1f6f060e52ae557f15756563ddf67d26c1db53e3e5ec6e0f76a2085a77b0ffc1ec5cc4d6299591bace03c5f7f3fa71d9786dec5c9c1547c9e1665d707b565bdc93f1adc88ae3aa5b0d975d136a64a375f05b9e4efcb85775627619a0410db1ce5e8dc88543638e9ca583c71f4c6cbf6f4d848af6517766736dea71e3717f249b5a7582584be8f006530feb7d688555930f6cf6f52f374dab3313fe7e6d9fb8d3cfcbfe5d3acbd691e478d528af617de4bab3c15ff5cac8c774142c9433d6bd192676cc4b7230b66ba55a50427cea47ea6118b4913b46ba408ff55689416cc47caeeb470f8372de2eaaf34687bbe5a66d5df762b64b96b4fa3bb47d14554c8dd4c31d4c7c1d8d71050a41dfaae377d6457c44ef6f1538fc84f4768e640b5d5f86ee51f1775885d7b655a15b77118695a2bfe69365a4474cc5f1bd3bc30beca40fa5ab05198b708d58110aba64fa4a8e5f955bfd935530b95f16ea816074ac23f8435eb22e85b7621481444b699278082693f073d623c99764c759aa0d6d3211fea1a61b048519e142eef86ec20430812c26aa3812c42471cc8799b80915222111c96b09ea063518c42786569101f81eafe3229fd85900da5abac8a84a688bd58a03213ac8019929e089a24ff8c712a1751856722fc7af3c57bbf95c77c38c85d3e481916c75ffa371d2a0c583b03d301538cf49c744f429d2c80e1ab13c5e126ab6d3ccd733177e469e6a30cbe0c3212215b66f57bedbca118be24c4a3267a1e65c8f924588e9b10ce22157650e64314b7643136e87bc141c9a01dc7b746556a1ea01f5aa8d22671be3177bcbeb605093a225e1a847c6ab78ca89c4d3a4a618932025aab56646a974b088429e182308dbda27fe6a0a7f5a6b36d681cbd94ec205a018319a89345ca5715ef79266d1f67dff2a1867366d14bb60625b9883740f4b3627ac385fa728a51c162401d86c4f2385bb9661ca891562523a7a66111195bacec69abd4c35ba6959397664ab56a621a25b00c5aa2c0793487a8b1b5847a29844d6e8cac42ba2aa3586ce117b010aaa324236855771cc999929f0b948c671b4a7ced082358fc94147f86fb01c3b1210bfdfe266d1f60a72baab460aa7ce7083d4b913635332cf559b121a26fa643fbb7553781847787c8d78e9662cb82941627bc863bc79799d4681830d3b41d156384f157e3ad27192b92e47c106ab6c1304a3b56723162e933cc28b220f45cbb9615cc90aa3483cbb9b510e7aecbd80b28ba3a51e1264b6c6023c30843462f33faf090e43555635c674a80679fbc88270ab53ccc83b79673e296a1394dba0bc2b421b02a0d4213890d0093c19384298b039b5b8f4f61a2ce286bf11b9a6c164bb5a269427999d707c3e62ce88d66fa283218ef393a4ec7a35e2a927b92866e5976e1b95122236c2800d2b4989e0759ab8bc1f37da21288ab22fc4a13bf8068a9abac80c814d150885762275c638087b643b60b4673408869156d52ca257ba50ff1354f4164b4d29069a99c7805527c7674c2dbbcf26656d110823f082bc88405299e093195038f7562b11daaec75668b71244fa6769a18b2d4643930704199f0105082ba91ff44f7b6bb339f243b524979ac51fc92c6b75711193fa29f898141a6c444e2850f03353fc6ca27f0023b9c88f6c0b8aafc9cb9981c460e2b17d594c7a60b6e3451c9675c923a7b1645c4d3fb28b1e42ae1f93090b86659e1a7d46183d26f380a2c046d9028e9906cbdf1ab605367be6a5609e79cb8dc349c739b7d4f74007fa69b9b50c94223e214509b2e057272476b1653d90740b0c059b1d2845ea9a57cad384a2c7cc2b926979f60fde47bfa01a217cd3c43bc01aae86642b84b79ce58296700427c78b7f32116823ba964379f1374e4b164eac108234b12139d580ec4bc11be3b62442445409204e1a9459ab3d7d33815e76589ca4009b27ca2e6ca470b61504569d0e70155d988b80988cda1c9ec0da673ac2497d6a2fe1cb8539f5262bba5104a4cf7659a616755cbd6a1cfd42a9ee1c115158a66af0bbceb149dba4af4ed2a128a988d8aa5c97164be56483e1816e52402b908b12429c505d0a3a4b2366a7bb38169497e7ac0e3ca8ad8f9636a54cb4b4d667d91752d6658a08416d552c3ebee80a613c41de4478611598bd05b34a66853b079481885225941beb4b67218013a3772a60e55aaa25ad44575f45a3178d37af2786a76e20a5a8719d84e693f693507aab4cb43c55a64339359b8075a643b7a696c373144a743288c37ffe36c454a45444c2a48c3c7d0415c125d133670ca1709c7f80897751fc8d07f30ba0a3b10f7110b03863e5b040b7942c6a527008f7952b89cff921280296955261ca76f50d1dc0a0d2b8b682d8459fec291c27c1e281bbf5a17dff0c0c75a3bb4c987f30b175c293931fc444728ab8590c6095c60542e6bbd2a39e324b96af61328ecbc54da1a44ca7a175c61a131610bad5144b702380d45b5df1622f3b2a4e640457ac830c8cc05ef95b4429b599983bab346a47443575087e975a57ab91601ee65966b51838108117934a5f334979349e3fdb9b49ca49252a4214b6e298c3b12e5f6e85ddfa7edc01a03b27468684972318831ae360d6a628c3b1b5dc926153f22a88c7b953085255edd2a72799bda15e49dffa9c35d165453e5fcdc6f9df64526d9de698f2bd3e6bac6c7fdd86601b9ba5f4a5 +ciphertext: df7c965dedf9efaf8469f3a6b7a1a1031590bc2bf82f05c498d073a2a4c604ee164ae8a135f351723714a757517c138457e6272f7b7666e59a5ee0bfd374bd364d8deea94caf7d807776ff1af1210612c5a95a8a8deffdafe4a5b6e1aa85d79808c94f32aba7b9874961e64639b52a790fb5a24537e70b6a0070065d51b7684425558c34b044a598724c226a7d1f45c8a0f4fc1c07e7ba45107820524272915b31a1ea3c18b890d3057028af0018e0d8f50214a78fd8c666e567b65555b91a7167c8c3e738444377a109742129cb53ae56dfd923d3b1aa40e4bd0c9f35f1346d622355b23bb69f4fc09f28adc5101ff08ccccb9ff384a40f1810fc009608ae901913f8f7e3386d63298ae6c34bfdf4c17e8069d72a8b490988c9808401c7de5b804733ddadbcc97d9f94328931d168380182d823cbca3542439ff2e82bea058ffa5085edfcb9fbecac507f50922fe1fac0854edaaf5b003f921ac0f95b710c924377742ef3aa4494a2a65c561754145914050df0d8ea009366b6a75a40034fc992f59ffa93921e4b8db5e46116e04f25b648118f7a5e226675c1e25abaecb5c2492dd4092bd2334fa5a4a14c067350cb64f566c4997af1f4f6901d70c2f9c4a3cc0c6eafb6efd830487a339c5f63a51788b13be38c3ba4fac0a64fe7e1bf513853b785e98283763ff23b730168d1debfd411a6d529f30a93b482150995abafbb8fc3a712f32127dfd040459e947bcba53814bc9b512e857b94c6d1450d26fe17674b7db6cb33afba1717ec003642769380553bec6003eac872b8c3b3cafffdb3d7c0601d493f10bf5e6792e9a49e86fa7393a3c8bea7bf9d12afe864e7201e2887053b67ee445486646981e0bf3e6d93eeb178f6f5a7a10a3b596168ae1ba4c1f093acbfa879331f4483657e43f9200c5aae4b0557a94cb01bd9e2dbd6cc0ec6707b36565c0faf3619ce98f4ad0866f9f7314aa5996383d04fdb08340a889f3478dce0d0a3c0fac862270469a535ae52a1a06a95a58ba396e1c8cc4d7da22fd5f68c240653ec20c39f705c998bb37ab0e173207c49970d6cbe68d74da764e70a0432907cba6d91a307d5e57124d405c1928b429d2ca5d6e2d0082dd0548fb0b5c41dc65968d129328935b169c7b8d401d29588c3dfae5419c4afcccdc9a3bcae8853fd47226867b9f864dad3cacff59cbe536be7e5f1ed1a705798874db514c8230483c4dee889acceade05970292e7b649ea429420bbe0cf166d4d022cafaee141fa08baa7af787cf1daaeae2edaa53f764e6d233e89f770c647473823b0db4bfa8403655d1734b276d09f58104b5892180c7c6b8f818d9a924900ab3c6cd6945d5cae4b6d876ca609839a416843d202d585ef7983181df3bf7040962f266a2f09f85479fb8f67acf20c306cc1bd191bd956bb99058461e9361812b14562207ebc7adb0fbee7dbbe7f9adc9bae7cf759835c780caa24c69db6d7922aaf0d9174f62d10ab7d42bcb152991b0673756b522e95a0a83231797dba4c9f486da9667506e37cbcc5aa42d54a6009cec6da6830154a8ca40aee3d4e2fbc4d813036500fdf5b2dae8af33cd86726e8b344a2043684f3cf7bc991d86cff533c6687df082b595d4d6e705c1b0aa28645a1077569343aca38f19149267f8e8be8a862cc6dc9370528c544bc9aa31898906e5f64b2db77e3128f5b59adc526f6f076ea70942eb44a2d2e6151db00c3431b39bafba841d40a2f686155f588e41fb1dcaea9156498b1ca82f1c68c6660abf20c6deda010290cdcacc2990132483b2e4d90de9ba0608438638c459038773ea3f1432c4fbaea491d5513b633a04423b60b3ee6f920ceff200fe71a8798adfb11d5607c57dd6e53e7aa8fe80375e2a76f82c8d73775d1dad6080a9f15eb51e2014a912eed3216695270bee882eb0559141c47ed66f8646fd3259297e1daa6e1b6e93ec7d170d4c818bc53b01744f4fa613c4484f1abc0ea225d7c15a93ab1401346e72baeb992b049bcbccc641a142ec39c6cbfd554f9bb3acfa38c5077a63dc7b2912a1eaca455fa295f9377c993237f44263c425bbf8ef5dedba0daa909f662cdeccfe2c67be4d03ba13d3090796db0461cf12256bf65e849e07a808d0577c5ebef283f9000a0b136f50e1dc35f29b01584b2285e82b1862779d76c59a8ec6200fd4901996d18932916c9dea3ac8ccae015136f9 +result: fail +shared_secret: + +# Private key not reduced +private_key: e793e320d38dd66f9ccd557808a8b26383d777d379caa64e1db5ecd9cfbaf8ab930118770cca3dbd1e825c867af55fec8764ec5a6788bb93b560948dc8555c8caa659754ee1a73e3ac5a8ecc7adacc25cdacbfc59b49352cc589f23f69ca48d94d3af02abd70e989b0a3de5332ba43658bf3f278b1a253c4251bf211bd905b4737f678a83db4dca296bab356eb59def74cadce79e5562733f42bcecd86839e32e4302e84b42ceee8fc54e5b71c92e149cdabfd6dd12837a6cd3aa41b60179ce51823dac4d7d17d78c5afe9f2e83ac2bcc3c3d94b6d8dd8d62cd54649339ec4b75c4a7d4d2e5c86aaf48295de9e4d28c12fe45cc56898c73da253ed9e707e8c36d7ecf9b38d38a3a9731c4f700f528107c745277842bf9d7b93bbc4b5c860147777f79745faf2962748579e5d06944582055b3184ef291c66df5c4a2f0935141ea6d56a8572aa6240b4fbe53fa5e4d98cf239e95feda72f6c67cb4a9c48a9932d36cf701643649882715d3573e43e2b83dd88f94d243e5b6848549525e0442dc26e93f06ad5c33ac98c922b6bc0c961ef36d7abcff3a4fabd82dc7670fc99926399171f440d93a2e3eaa8e65961d54ea8548762c84754fc4880db9faed37fe876294d1c086efbbb52cd35fe2f14853f7afb7d0bc9e20ed5ba7d3a27779733049013eae812257bb8db3857075b665c8e772fccfb1d667de3ba4698d8fba7b6ddb9d2a1337af7ec59e4aabee16c8017674114dcc2a067e731ce4a9d07485658f28ff8528c155f6266b79b3c76a8cafed133401d6bc56394785089abc368b9d05b4a116591246dbf87fb6ef6f7985908e9725ea31437904398c997d3d092daf1c43996815f45905add90ba86593d9be2b4306266888f5564b73ecb250569afce886059352bf770e1137f5297d58ba784645f3c5afe4d1846b7e1764ab03fe0a58990fed7528bbbf42ffdf94953946a2ffdd0ff3f921b3a0746b44f64a7aa08f099954ad88b67568ce20b29eabde6c7d54aab5ce7bc87a6de2fef618e24746f24c03b153dc988b0d48efc43efde152533bcc9e4588a32ffccfc44c4d45f07ab79ea5627045f46ceed63dfa3bbf97e57e8c27439418bf8d0a667bcd35435b687db8223ace5284371f5b0d8a3daa93b8a3889984c8d65f408bafd0c5d5d03ddd3e5911d9845c9f687981ae609198dde43a52ee970868cdaddccf114e5fd91073d6ca5e56f7c95a40a575fed7229cffbdacbdb177f9b2266b13fcf9bbd7d486e1361237d54120fbaf04a96b259d0b06dcdaaecaa1bfd7459f554b53b7806a65465fa8ed6cfbf65e3f410caa887b9d527c8fa9697738cd7ea1926478bd4cbd80d67a50479058bbaebcd5699be530a1774c0f45001ec718e15d53ebeff251e5acdd76bffa8d94f8bcb45a6de635377077b6d9225d221c87b60994bd783fe24c34b55bcefe76d450af46b3397a0c1c577a31bffe2cf63545cd2528fe64f7c5620b5658d34455757c9210ffa9217f9265ae59c2d658a75496c6bb48fb9d90d88be51f754988ab5cc774d527aec2746ecf3bbe73326886fcdd53b18fee9279c27b4f8d6f7cbf9fbcc15ac4989de3dced43e0055e67d33b0aac4c11c383cce2df5bceec83bf5c43ab6836328959ce979c49e45110f7122bdd062fefd1d93eefa13dcddf9aba24754bf556a99f6510993fef12ca41ed9342309c24e8ad9cfc93647c6cfbae5cc262764aa64ab4923fda03a6e7424c56ba49bcbdf7affdca4b88584b75cd6242f4541c8f419e563db5b90ac4d787f94f5e4b38bbc5739192f4c4d83e49bab4dbbe350641ff9a71fbacd5bd81dad5eb95a62c50453695a65763461586c8de2934d31093297fae384d3c2f208e2bc75c96023769375f388ae3f6a6f9a3fe6f53529f7a9658bd51f5c723e77959aa82ef3771c03b5bd68d5b7d56f00d86fecc7aa29a7637cf3bbea377ee7b9b1f94836197a718b097f510c81595ade1148ef01584a884e9f51f49c120b89514754dd85a6be48ad947b816a9dd1f1af56f8b9fd0aaea04acd376d236a1afe9bcf53ea90f94b028475c128d7d14c5562e5747f1b8db6bd72028df3bab895a084e5deb89cb3cb8a9115b63216bd69243187adeae33bf4402b88bd18cd04cff16d24928ec8fe385684bc143e0d5745893bd826f89f9fa8a931596bd912527e2c965ce3344b4621190c106f5084836006296c37949aca196c426f4783b65221b9c50827c85b7067a9872a6d9277828ea9385f9b512a8a3e897628d1aa36a5206b35fb219ae26269126b75590b2d1067419b27fa6852a3552d6ce48c9193c96a3131397166d47c53eebbb68b949a5bc3c7d585027961aab89b38f5295ce7c60d3d9009508769ee37a48de0685b9228d998b883d871985108b49c908390cb68147e8bc561df29cde02b1ed5236ed77b23b3f32e687b859dd63439890d8735640f5c073bc05cda79603cfb37fc5ccd28e98b4eb169271408a1cba57d21afb87c97e2044766b38280b6911b95725d5a77327764832603fe771aed89baa1c8b2ff49b741081884c6326fa0693fe64551402301a0552f49035a262e9d047d8a2075fdf6636c726f8b6098fb2b8f01c89e87478dc1112c37f1b857fb13cec53673e297b8aa9612d26a4cd0c6168c9dea407133acb939d06a7c660581a877f046b9b1138f6fa6156be2a5bfb23d04954fe32b1272d73e39c79094864cc9e36e46e9c8f1db330c17a0ecbb332e385769c4c0ace7c0b0d49fb89503cbc13ff3a1b19f421b80855fcb947cb651ccc0a7b55b5100c09aab9201c4ff8c56a2d90bac255a3665a731d07b8ad829f7a7b556ac12acbc1073a40b7c36059edccd97a50c493359c8ba390e3716921a69998b9b111c4dd283456f7b61ccf97c1dbc362e2760e2928227405e449c126d7526516298f6315302288043085808195ea587118d731543f09479a2adb96884b3a620d4c86123818cf848b295eb0035211bf614b077871db1d8c779d61e90257730e47bba178ac5e28b8e47794517727e4049dc759ed5a69cf7c66de05c0a5a00c366a87f7f2914e1e059bd1921eef61da9cc201f016f1cdabca2d2cd99e1884c114100ec5fd0f415d6fc6222981d8e4582dd138d71a368bd5590645359cf767146f2cf5f7a58e0e1becadcb1da0c87fd385c4ad15e02836d866025d0d815af61b564e803f0f0bda9a1ad0a3b86dd9a79b29792a713c78f00c55668aa2a0962b4a9be8bd9cb6966a054f0ac39182ca4d54fffe197891b964933aa8d60a87ab0af08c139a8e79b7a5773cf189caa615f64b973eb273edefb27be439ddff2a1fdba7f2cc3c65dfb0d0cb177b7ac49ad1b4da0725a3f3a2741fb2c82347dac329657c9bbaeaa948102295c1828b01c22ae45cb0e0b46a68837ca5c8639ab483eec5b4dc9caf028a7bee18accc402ec6aa57a93a1c53a145e923194341bde96296857890fa616d1bca0cadbbba3e4302e55286c58a283ca8d1626515e6a84881aa692c662a3567cc294a23059392887ce7a835f8b8030f5c1060518c71e0c5621812d54d50043b73182fa67de92768c63c4a2c562ac151342fab8fc9181be82301404792a94258b98411ed093a9121699ea13fc822bb5a317b55c1167ac12bd8c3ccd9bc743a634ed6a0961e13ad91a779a242dd0b9b4b41a5da11cbea085032ee2382c4b8ce088524075cdfe7b7c06cb6f2ae128f4f7a6c5d58011b42b8cd39a8a0aaaba14a0ea8c9a72f322693410cac54c3ee5487d726acde02f9cd0b027844ea1c018e2744571c3a2c36b4e0da088f09ab939152e30696cfd3473a085be3eccb53eb406b66c95ef8b1cfcfa1df8c8238b8c129abc9176e0864415852cc8ce13970fe8a76ecfe246800997c56668af974605e748e3054700d7b75fa182278309e41cbe5b4a17696c843fb4ad72471bac747faf30c99d2433665433ef29b64870ae8a3593845ac211ca4af0e5aeb9b8afa5b4419559502e834f993543353835596985e31529c1482d0fcb9c11a1c79a704db1d531bd0774f91b6810b98766a83387387c0682584c94793fa771ab8b4216455f7a117c65e5a481e01b5bd8bd0a9263635815f3c13c7c6740d2d1778ab47d56c9a37ed4a660249b8a4a02cbd716f6a09a646456c4b54cad68c86f8b998855379560692cfa68b5176309162a7a506b28e042c25850a7e6357ebcce387146b94a09fa82ad2cda8123477f926757d552929ea72e379a9bb997bab0d1aeb5f02568e7715d959168129cd58048ab1299eec754b9080e7337084ddc37c4695b75488effdc370edb65655231ef1091d762b8ec53a3283b3f7bb5114429c788a2cbdce1c0454466882448990d0c963c4dc08e6955a7aa5238a6347a0d168a1ab143347ab4c4e4ad5295a60c2d41e0b7a7bc92148855ebedb4f2b77da0c706a1bafd6429d55fe6141a25f7ab9f875f79e0a82d6ea5cde5a017ab637d5fdb7c42646a1d71df +ciphertext: fab59e039993ccd4f50ccbe8c886407e46508fc6d007172a747786974d2eed73538e8c47ffd4e3d961be7d83ced37f11f3db879752f36cdb659ce2b77c1c3096a6406c3af929526157cc49ab365f9f5fe8b60c1b67ae8db2aa260485538ae844c06a121606c3422910dc3afbb4119bedd73a800ce1cf1ae6a4955367a7dc994fcc653b4f94652bea15f60323e6f2dcfc6fccd1f79085a8b846a0ec0f334db86482b15738f011398bfca13570f97c2e5801b60a5264072a7011b98b9e1de2651f78905842fb8b22da803f03211ce0e4b39c6ef8c7c73e611aa8e5b20c9295334e9319c73f5f78956e28a008e0e681a193ff229f375ddcb2a9b9a750bd97e055f6749af2ff6a601133fc7a069c4f72f5ad4c930b5d37e91b208b4e36970087ef4200972d204e5a3fcad1f033035e39202dabc309263834e8ee8c45f6d3a8ce7861e8c639a61b0a12b950525bfdb6b45d813797bf73952b7d6be33c489a4be615bb892b171c3b831d609cc7a5326409a80b755d08634ba177a98ebd56fb89b87678d8be5bf508dc131ffb01500dcaa087e75226a6367ca24d0f7f2f9d4a8218e50f30d9d4a8eae36bda94660c194eb4fa91881632d2e8f2211dc28b7fa24766793eb3c9a969fe08c7ab94f655a7f7ebc5599a766ad576da9f0c9bf04df04118e6511ca541512f9826aadbc59c431fcac0dcc1421cabd3ec85ce5fbe31fee445ae4a418462555a22ea3900f29ad77b231e2ff51cb4d3713d83ae0d5581c8db197bcde4ca4e42be102b3bd240694c82143b683778a868d574204a1d02e34f2fe91130f283ac40ccc2efe76bd100c780914af245efc5483ef94965dd8e166ebba97883cd7f1ddd5cd623e5598509c858f4249f4673bf6a21e037b6e804b7e2508dc8ed0cfcde042b5f307c2faeb68801ff7e90738643af5fc46ff1118661341caad34d327e1ea28c8bd350bb78c277403129ffa723e6839f0caf93e9abcf672f8f4a074ba3fdf216f040fda8458a7d9581f9321cdb541cb61c7956a3d75f279c1a832b0c656b9de198ec59ad87ffe29f31224819a7c57c178e52c7209110fb9c0e63d2b99b8257dfa6a1bcc6edcc64d7a64f3840fc2b343175bedebe7db7aabcfca4bcf744c7a0ea8d2bfbeb451453597ad97f76d553bb2bbdd523462cce707cfb3f2d0d4bbd9ebafe0bbaa2116b2f00d6d543678575a1a86da89566974324f6fedcee53702d341aa57e4653757d291867c2e63c8e1ba98942193f60d6da8b7232b672835318e9ad102eac0ab89dc06cd4dcdc74f19848dfe0ea55b4d9d59e8dbc1a53f0d230e76524c658f2e12c01bfb4ddca8ed4f6c21b2204caec44a80b5a5768bbbeb65b36107f34f3e786152d6e0d33b11be83e255b541cdd1ae99dffcff273c55b665fa09d7a89de5bea528e6569e525f683c32a9f01f4a8349b91eae519efb2d5da8c111886de94111dc6898527ec85181e974fa77130ba19e251118d9dff1149610bce6c8e5507a4b266859c2e71cdeed75437efeb9db9b6e7a201f7a32cd5d0ef378588cc6cea5387d3a89d38c93fb3f2cf990796a23bc73d07f427e90173f173dbdc97ebc03a557daea271d2ea56cbdc5f19af6683e749a4e25b52d876fcb2f05a4ab8b616ce7dac1dce610afeec8e5fe12c6a703698049a32fc3532ebe1520d95bb3dab1c89e430d6a4b87e7520aeba06cc7dd15ccf6767a9ef0bf331f6869625c877b6986157f39788b4c06e96f5a380f352f28cb62f911a72b5eadec6ccde6adc51f5d18e56629c831972b3beb4438b8cb5e4f64c05e841f199459c5557d7b3a78ae92eca093f417131f237e4a27c0f9154030e451a9a587d95e6971183e059ab37ecb9ca97d8ba4a945dc35c9a21a97fb7c2ac30646e8c1e7fc1b2a7d594dbf45b6060073bbdf3874d7f627e599491bdb11f33fb0475dd07aefc14909e78ddd87f68d085880e8bddc6b39bb7621cbc686803821e34abf5f82b9077724652defedb728f963a957ebe369256c18a09992de7ac7647d14f7c094bd72b4baa651937da84c137d1f407147d335957a1ebb86e1a25eb962a50159b6637dfd25d5d3ecb417b4c19568af0f6c00fdea172fb7061580363434d08fab0c04c6f3867bda85851ec12558bad21ecea88361575c76e423fbb1ef837bf35b1937bae52eaf838df96106468b8e16742080d4afc19965d4f2ff36de956e77a9c7cdedd7c +result: fail +shared_secret: + +# Private key not reduced +private_key: 27dbd6cadca3f6235b6b59c5a5e7499ea5e30ab431fc7c4745dead414393f5acbd05de5b23c8867dd88ae7cccff8ad3122b44de4a4becddff51744c5180ee7b413a18e6e4d5bc371df9534eb76b5fdbe3485f6d3050df525e37a653c76e18d72aea5f7e449783cfa72fae68c27e4abcd59ab364b49e6045d764581a9738e3f6443239e96478ca62abf8dfb5e9400149a1433b716564dc0959956c87e67f8e79b46b1b1b4b9b60a52641971fc9e372e6550af2c4e1be88e545ed8c069f17c4d714948d7e3986d182cbe461d47fb5df1e264ccdfd89c5468d8593fc7e157676a649e4533a91904ab61e875bb8e80d8639c836ffa211787b4a490fcd587d93a7ce9ed8dd0094fdf07d9bf23c35e1b904ea56ce14a9bc537fab935a69e36cbb15ac1afae865b87e0aa7475717d4627aa79a1075d8adc4d008d45926b8b55ece2624b6e66f4ce361fe50badbfc71f543065dd595b6627f9ad22243a12aa70b55977095d9f9edd9f5bdf3a4a876fb35ea4700e3f06be884aab7260fe786a4892543cfc0b33e50bd6cc3b25427f4b76375e93d008a0757e5b06f7e3a4f7ee3819776b078390c8d42e4ef716bf8f1d44a4d64dabfdb9a2b3b7660b8ed1b41d30dabb52a05b7f81a488a5f3d6157af68fd7396d4394a43534d9c4beb209e7870e4ee0d7c103733fdb2fdb62ba668f0955db0c596365d9110fb4afa9f9394d75d6575938468f9567e397f8a2f227b57c8599ebcf586c7f902c698800c78f4b1b99b7284aac64ffef2f9f33af5312f85469f9bf8c8eaac654dd4edf6d39ddd1f2e6f5d21577d0ca557016405df6d3b8ff6dc7199b301be20a1cf78a1475b266354bdb961f5a54a5edcd71ad5e23d7a59debb4145ee1906a9f6f5b66715df6cf033b98d6e7fd5f8b114d60b867308359dd6c238ed1c943a217533475b5e8dddc871c812935e6763b3936d3b99c78d695139e6534335bf499aa6abbe10acaa6afa75f659babaea744eff8935ae29beb65159ad4b52c99971fc6a8f6d2afd53214add6f386ad51b6e8702769ece33229187e0f6470285fd418d560329abb658aaff3a358c5577115f437f5acd6d503b154f380c56efd66364c0dffdb5f0a75646f6d9f36f0f1afd8adc7eb3e9ec94b1dc4ec29aaf99fb8d0a9ee7f699bddda9c2cd8b96de4661674b400f780fc6d921008ccddaeece7ef9a771cb308e86415f4b641d33bbe0746fca69e2b1dd15f9932af23772abc68abdc5ddae66e84e3826e3cba0b7f34df3868fbaa8b2a0cddac953be237eca2da5cc674569dc6fa2bc5c5447966a0553eb4af58e0ad5ad763850c0ab1725ad1f3efb4a2f3640398bd0b8bbe8af79adc3ccdebf775f2a545a7e8a8685ca73d4c5bf0d788d7bfeff00fc241b34f8085ff897df49966ada88992768fc0f60642b14fb95eda965c8873ff8e91967b3acc13457e17d8326d96cc5db856c35a7c19ac64a85a03f9b81e9a756046b901dc9491947c078ad5e5d9986cfc3dccad9d02055cae5a47a6969653bd56035453c97571138561e28b3b0e0e60db4f8c9104810ca69c76de5ce67be26a27b96654c6e3ada464decd4775458964be2e5a3bec68fe38b64c8bb68777ce5bc39e9d5ea9f59a68c5c8f4fc38bfb4a7bd351c18a09d2378f054d3a04aaa7a6ba6589b63062bdeec8d442ada851bcbb5b0aebe84d688b315d64763dfcac5af0f9bf75f036ab0d3549a1f65fe1e90d7f5468fc3578e15723214aba66b855b0b5ba20bf8c9beb7dd37790a8c77120a6c18797b5bafd450f8714497fd83e8afec5a72df7a61b50655f518e38a2f5235389bf15444c91ceb332b5395796a186bef9e8e6ac1b69fd1457e1ce4b1d717ee1956ae938f645b8458cbb8c3f68eee3064a4d05488104848a846aff5dde44534edb51b81549ab0033d621c8c69a0be3c94679f805e879ccf676973c7418b6d14d9963426819768631abba1db17d321b3fc0edc95b36cf0637f9470fe34b0bfd93efc76b299f7a948bc4f1931e2afcbcdee8ce9c93c8c0f9b1339e234e76b0055fbb3f7860ed98ca00afb02ae673537fb09c4c0a1bd8904f5654a1ea93709f47818926c03cdb0a98b167b6434a96fe74796ac2337176f59275355825e6ec42e7382f6e710a9e003f8ef2e0b8d13a8f1f3bc631edcae24cc4583a8abd7e9bfebe65e89997ce4e680ce385c8eeb2862175fbdc9b25dc7724f641ca14b1675e13465d634915593a228c35432b316d295dcfcac909b9aaeba2e93f6028be9045610ba38c763c08308a1d6b9b8667b500c649b94cfa703432f8695377462ec6159313a184f7349be26512759a112223af1b12127f5566da94c8bb19765849f9e849a4f235c9df3783627b3e548242fe2cf506ac1fd09cd5067422789ca6bd3ceb0e516a2e88d0406abe03b65b0f064d7600ddc227ca460cc784652fc1168e8ea53f825851a222eab10bb9c8598e6930a2abb627ec5640d4a3c6eeb225561ae19f20eb6d0536ceb93145c7616fcb46c04b2076b9d8a4013a4bc527848a8972b0b6577c50f63194e6357bb2084fae54c592577d6c7a61b79475fe1c43e70980762132806a7d25482ec2a0e19778aec2685ac19490c303cbee96e2992b836305b58270553d07184507b12c06510437b5c78b3f5cb1b57627da57611dd3361772a213e033dd5519666d18bccb13b3f751901d601ae131ff3c061af87839692967cb88199f1770ad0ae196388ed6b9746fc6e536443afe04a3b92352acc4ea04173d00ab9e3eb9c1cc137b2d6b14fe36dff9591b5300853a349dc23799d8209e811965ac84090f34d36382020ba31531a0dc909b9ed725ef6120929228f48a94a5e04d03314993fc8b306572a4d5a7063110c051011c1b09ee2d09315196f09192c329565cc5a64405c3acdc234acbc0a78e81b3c9523c43a2fb961873eb207464a302d8349ab50167ca33cde091be57801b6e850dda6c5baf498ce1897b247bc7e1a84c6b141fb00286fe864a9f27db6475ed24371cf0c19586750cf72ac1cab46ce08860090a0c1322aba42cd902b6c05f4c4bab667b54b0d5a04332335731544675f80a2ade66dbc075d7a9b4ed924417677b6e195b902842fbd4390597c28a1504e161175d259ae7c44333e742471b58756c0666900cb94d87f73043e940a5733f89ae3e8cf037b83a51b4768a19dd1a96729216c7e317bcbf60b3b07cd82784d964754a440ce297b40e3f8811834885ae76a9605a249958f02d9bf2ef0a195d3603261560593a636b15dddc681ab9bb19ab7ae95d32ea474388d81585e49b463b47033f81964481f46c229f751a930f6a632e8aba8981cca880511164b8f09a8bd9ab8c07bc8a28636d0d32bed77b2cd032b18090928f01e192943e028af329b4b812238a3362b5e2a61cd7b3691d06148703d692080a6c755c560490cd5b47606ac9cd9bdb927b6e3b26d9060921757a0f85a2f82b618bba9008b7073f24a88fdfa922eacbd6631c32157b36150be06d3ce2c4b64410543ccf280143c1de73917b816c86b1a04204a8f3fd7cadbd20b41831c8229788aba219ba59af78388c2b9865eb3000089c6c05c850e91021a5328149cb2a1a27e075a3ec8630d8f515cb77903fb5531f6e05ce984296669b0bfe8af8ae59438b834d4110ba0606ee426799c313233ca9487ea35071871420c6825889c07da0f87f1188d75650e36ad21a265d4b44c01361c0653b55f409ff3c290d2c2c212319297d5aef2bb87164b7535b7518ca14469fabee91c81384025f6914c19018a0775598ad4bbada98e06c87c9af309c73903ae1b84fa9a3c3f668042883a8195cea1fa5bdca59c203178eeb18041aa2e9af770d180be044bab1c8c36044a70e50281540501ad6b165c021e53b86a5f368728e2aeed1520a09a48c1ea0e9419b313d7c6a9e59f17121c8ad47410abb73e008c1ecc16c32b4a46f39712648cd06196ceb8a076f5c7048a3aad37393973b8679c55393137e6b6ba2dea4d50f65e1ef12116598de49260112055f4b0acda503395e242b990398943c18c01cdca993b3c9a74e19ac6768581ccc9a0331c005ce873b241b3e5e497493ab134e18569e80a6d12a04616911f9072fae6a30e529cea1bbdbaecc7cc64a7d655a730335e8a22b4f4250e2c54976c69a161694aba04456bc14e2bf8c13b1ba2a5ac1a6b557bb061805c903d1d1aa3367922fe0c51dbc35da6cc8593b8b3cdf741220126eea9cc5b9c0632f75c7aa3aad60a46afca4a6d166f2b2ac858c2a572e4cdc2d65bca199cd73367b83909fb324855c4899d920a32b3107ec56789d63c25036c35d30be5d28d54d725f1eb3f924bb991cc4c5ec2e36585c0133b82099b8234cb459a9fd8aca37c4249a3b02025a466c0b64a911e75243db16841847a8ac72dd835486e96a168b2f9fec46f3011eafeca9e810796c34e8cfce9d59342884456007b01ddd12edce6d10ed87e4c +ciphertext: 7c00e16d0e64a68ff48151fd02eca316fdb77ed8e12cc3cd318b692e43db05fdeef4ea363e297d9c32f8c079977dd3915db9892dd78cb2b2fad8bceb72a953b03ecf93afb749d6486b15bf456e83d554a45c0cd8d981494a0f40a511a259d1d6890babea2f1c770900c03d66d26331c9fc126eb32bb5135ad7b3b51c70c64923b8b60db51d96f87cb2626626282b8bbf018047e5f3798041f4598bf7f6ca93e0dfd8f7caaa104ded188bb13ebd5fdf6cb21fb9cc9225e63d0ea3017805ad509e7d23e76f1351fdc02584f65ca06687c3db9964151d6964c6799165775f60d4a91b5e8b41c920c2394e4bc587733bda3107aa33a7eed8d62997634591ebb7d69ea547cb2d74ed7a7f6f0d036681e4e7d0d5079e544cb657493ecc0fdcc8942f93df4a8f404a9ee4f41c44ba99ce3f236ec1a62068bfa6fb93a1e20dc2740cf9abd91f31d9caca34f4c288be80492cb589e4b12e4bd73b664c4cc33ed3559325af26dc8de7b0548d4a26cb0bd8fd587e871475318581056c95256fc4e95a84ebccbe9382ee1c095a4581005713bb77d2d19a8c1ceb5a1bfb4005849f0365d2503f7ed6d849f377ef66888402df896ed571de6b06793da6bef4f6ea029bc014065a7784f7a83c92e21cd1c7001770b7781e894b46aba2e6fa40918a805937a9b1ea25efd59cdc26918921b0093001b36877a010209fdd9b4f5c61d4e7b9d43a2f91e72d4b24281151950b73de9de304a6c1cfa8e33cb5034d1031a6ab4d3dbf771c585654663bf592ecde6ad53a5fce007119b5b73a4103134662cfed595a02677b220cedb31b78c3063470b17a56af64024ba3cba30eac461a12b79a9ddc2b439ba2eb649defec5b2669830d6aaa8865a4ad999d8520edcabd5c23de6faf4d390afc3e9978f127d087f14d2abf2951cae4c62d7ab91cb634800c7db777306403c5023e97b3a0fe0aca6466b6d8b58f6f07acf1f2578dc30d283ea883fc3508679806febcee954a9a285830a39fba3781fd179f5068b9a7061cbddbfb466734334bc6a7deee3bb569244782bbd3c78347ebaa66c84d628a0c9b26b6af95a116ccefc57595f786b17967e2a21695fad4e76a51c1f697e8069efaa15bc10bb0c28b468d61c492bc4e037fd612486d746fc2217093fa025c80d87cecc99679887b50e31fa553ea319075ab8a2e27e87a5b7be0d9b0c750674c440235c2ddb8f6c496bd20569b52fd84eb264c67baed5ca95c0dfe125b06f4e68f6354c15cb41514a45a2cc62aa9e2e4a18cadaef473c983b0f952fdbc00cc3d5a960d7644484ba38e3428dba2c81e8c76db05fa606788fe32b95b453bdeec8cc778bb3221a082d453da84fbe4d4c7996fb2c98d2b06ddaf26c759106626728e6db392efa97f0c9707827f7976554d6479413ca8ea2e764d5992cdb7dcd64bb5c0bc7b213cd08d15af938c6ddbd1f2d5a0cfb0240fafdf31c0e9857098de9bb7883b8ae7e78187ced571a9fe90edbc6ca0a250d842b8a2b83adcd32354c66861784d7355c1a93b8b26fb67ce63be71ff7700352f3c5eed0cff007107a47847322f70d785b260f74afad72c98cfa9b495de53ce8b0bfc3bff0d88717ba8c47569e1f85ef2a87302976fdb5d866cb156152aaad33fca306839dffd063386303c568425ef47613a0de42023b1a076961c27d29d258c24246212883803d09e96ae41e6aff74812b7d55d00d6b83575aae548395f9572c90bfafd6370cda88b222a869c117c1d4d8276c176c44fd9c2533fec2d41e0ce343f60aeb7a8560c2241a4c97c1c86ecbb26b487c5be4ae37d69d465635db14037833000389b89fa9721b7fe14a3099e2dea671c1e63452478227c81575eb229234c469dd52494607b004d9380bb003f94c98290020569c244958716e584ec0eb7b4000f9223eead95e371323033a6d7d966e55fc5b38fb3881ee162d0e04a40c448a42587c99724b408a89f1db02c57cc8c0074b117298f9fa7eef5cee82d256b85ae755dbaa5838cecfe2e7da59956b0333478e46c409b493b3760c8cf57a8fa6521132c9dbb1ee36ff60ea6dc7a9e1af615f1dc6b81bdf00425d24e4a1431d1e35698b0267eb73bc6a512eec505f69becb384367a1d3dd7720f1cd8ccb582b39f3a66e5a0090ca722b8a7f9ee59651091d241a623aaf4588c8945c1c8dde04d2d7a48023c6dc3f3b764fbdc23609f0a9933909def +result: fail +shared_secret: + +# Private key not reduced +private_key: 0be83a886381009553ef0faa63cee3eb8f9ae09b3cf11b62d31d91f21e5cf548388f7eabb533e5ca69a4d1e6d1a29fa4e7b494b1e3e2773dcec313c15c9cbc91693376ae776c5ea08b56b31f38783af9c052b34b7c0cbaa4eac4618aca24dbc8444fffbc666f0737fa587c5c54b778aa446b349b88f34e6557bafbb9e3bc74979f3ddf87645435d2ab30acfdb6e094446e95536d0bddbafaa2e887d6739be92e07f2eecefd6d9a3dc376f14e9752a4e8b0ac3ca5a69944ff0aa86eeaab62ca34b8fc7d74bc6eaec56612267725ad38a47982fd6ab6cd7f6ea1ed96529476329843ebe484fc7f63b4e97fc2f68eb89a65ab8750ce193da03e76bd876b69f9a826a64dad2e86af796eed9469aa79660c295121367906478940099e51bc36ab67a72558425e153821ec43a66d558d59b136255f656ce61e7f9d7d2eca29b7db7b0bec5ba66c0a2f947dca55d854863213d64c5f896e3a412a9a5afef93fda86d1adc46fdc4aed2576ddf46437debccbcfdc78a0e9d2350dd83b496d5b586a9f8b36988b33ed8fc8782ab744b3355fc934544b656ed93eaa36734cc4d217d680ea85476fa98d3b5dc86b5af589e85249b9a7ae0eaa4a0afef396c5fda437546debb2c6e4acb5bc716ae13c48fb6667457bd3de79e58b41b7511f1ee9669fdf2fd6c5280caa7a35c13eba576555d1d6d3f6eeaf5b7a96ad0236c663e7df9b46cc798cb2a4d335f6c68181c49d6699466737412866f6b078401928c467cec51a2fc4a62553141a86e418ff671e98b07539a57f83afae8c0cda348385f01473a8d40fe2b187dac0dab8252468303b909d0785250edcc3d495907d37f93db96c64c7f3a89586f3f54ad8f3f8a4911a878c93a4d06439e52c7f60bccc60d56d4d1226a87cf434e49e58db5557c897f07f1aa4bc9b3fbe97f1dd4c96e294c2b68ec78ab3997e84da877d7888b6929db848ee38bfb75ee111deb5dca49dc51d9f6286f126d9a7d2e46400755513eca554665556d3ad2c047f021d76e4fab77579c3f905e6500c7ec9747ee5b56f840994d2eb91d13c523cbcb5070de2e35dc23cf4f43795b4e83a8f503f308007610e23c64f38aab3aa9ac0d3d3edc77443afa29ba6bfb46343e32c549d043371ab941c5982feaa30334531f61877e25e544979ddc4c6a94de7cb3739c43a53a8a04eac3afdab917ffd41b48f69567c9ba5c12814e426cc367bcdfec5c3b082936dee1e8a50c7933de5a5fc5ea07f04ae121ef123857bce06df5f7da51f1d9383de7fb1d461a157c6b10b7eee63af1b04d726b6ec2f94af7ca3d41676705fec9db577d777a462de3659a20ca8ed5ed60168c06ff9f5cf294cd2175e769e6005afd18ee7dcdb9f66a787f103fa43c59ef9a1235ab1348bc6bf96024da46063eace9cd1e7ce36d69751f623c29ccdcad86d743dcd401188f7911e5bcf9f6202575fddb867ddea38095fb2420a7555994f925f5d4a5ab5291983d87abc234d73266e8b04b4ff901eb203a33353245f0653f779cfb3eafd8e309f34778bd0493364ee48cd5c256f15e6fe03b5fe5e5fa84add42a94f39d65ad8f86a7a20334c77e332d7f886620461f1cda8639fc1528d903a9da68dfdfd4dda33f8d34cf003a4af8da161af7edbbb300b693f02ae51d1363cc247b41c66b3ebef5bdc76609d2bcc604f9540543d1ecdec811e37a9abedf325b88225bdf5e8d2c84771df545f807adfa8f85779f5631aef5d262b37fa5fb7bca6f9129ffab4f98bd65c97212d8f6b0953b1e6fe51937997b480497cc65644eb2fea7b812c3db41e784c7ae77913f1c1cc5021543ad7d54946e7ed58cfa518cee87054725f7d40cc55d6df1fd8513366c024e16fa4444ccd6cf6fffe50a993ddf89f19bae4937443ce2676fb8e7ede59f8f81394d08fb9c06f9f8d33b7ec0c6b3a35c6aefdce658dbd837655c2297833a8c150d45611bde1b68ff4ce3b5b47e8b2895c95c24745d1e44b0dff6eee87ef916d89c0c864e0fe5da9e6c53d6f371de987513dc534daa8be57e9fb9aedbedfaa136e7e4dd3b9e7d4d9078e7398b4fdbe3384fc4a4caecd98647ba4c0035774baed9fb85cd6d9695098f7153e818a8dad32e4c493ea358f863854efae8be6ba9c978fe45b37a09daadc4b59a4d9fcff8f88a3073f320fea27c546b8f148cfc133aa807fd7c233c7b5a5c3f6b8da210ef7dc5c1a834fd1559cb2439406895223991a4e682554c63ac3a117d840aa4848b1b3864edac960c656046e3bc6d3b681e1e6b49bb0259f1aa2a4329b2598b932e26c00fdae2cf4686803ca7af8bf0f1243e64544d51794583349f9854dae778894438805793b085373d09a185cda5489d74274eb7bfee433b63a56e14b95941440924cad32935440b46235a8576d11b8d65a2e8198b64b510fc1f942bd9b0f8e077fe33c559cd987615263e9b66c38c5683893c3e10965f18aa755e1bea6d1789913cf2cb21b41b23c4eecab25798ad13a26321c59e35b0517a78743c4469a4435970bbc2b9c15498b1f17cb0fccb446f67c2f437415abe98cdeb3346413539961b3dfc1c40e243296695f27152b7f7a32ff4b185ea437b275c6f617523ada8f7d2a594e277b9318019abc0051aa399642cc0a478ac7466e0729848a516c9e86bc8ad85be985b395e3b28ad89f71e3b584d857bbc1915a47a2fdaab586b7916d9a87a56235db0c683b9bbd5f000e6a218e54464043ea1e882bb906c917cd4449fdd5acadf5b017983c87b4a8b0fc9ded7a1e2e7ba359240009b06701b5cb29fa3b9250715ea31bd8784dd1d91d26764f32b9a49f934c8cf61b4d4a8f36f81d3ee33023959427d889e4a3c796d284a1fb0895184ba4351034a0280f34af119004e9b06fb1e69050fa2db039a9abc6ab00484b9a2694980197b69b9730da0b8455bf591b2eb4f9cef37a06e7c107bd56c3f7ab10ebdbc60de87bdc8c22f62c2e4db973140c5fff95631839264aabac5dd4873e44b8b2f7106c083dfff8b6403322f467a91e52cdd359293540a45134b97a39aefb6252c9c928adcb231eac0d790422a9e3bda366762e2514758badb2a2114a9ac924553d42e05d3769350e4ca047d4219f1b6fa953b60cc67b07a71dda85649af0076ec5c55ef46e73ab06613a84b2422c1bf039564a6873a9385fb18c4ab92ca7a1b205e8ad57728ccaa10b13268ca519c2a0da39be15918bc724f7760e826ab9d47cc288918b60aa87e037a60809b230562ce18c1d76bc457107c8bf80574a2cbd0f945c59d4371af14737983fc089a425d1ae74993451055ec21435a8114060baa6d774bb6ca82efec1a40df1877011163108a2b20190135900a98a337192088d8c66e9e774b02c6d55819dafd9bf3ca886d39165d1c4cf29b1abd6b185dee9671eb941ac598e1b0240d92ca7bfa119cca15a643ac29b30afeddba1acacca8b83a123102ff20b1bb94ccc16fbaefaea4fbaa36f3d46b7f5706a7ef60e04125228900261271c9ab11b04971ca5315e6f3c9eac795687da91eec532476bc66b2ba7a5650eeee119ea13c91bd94b19c31fdbd80842d25dbff62f928550b1f6183ab64443e6b0d9653c5379158af74a6436ce3a1150ea31367aacc7558c201124573235a5997773064a621869707ac661a29238421c9ce88cc38e733c75539443613d8d81c60da70e46035b343577a1660e08a67849558901d539ed84cadaecce4da36c4b9940e106011b872d1b9748cb08c2e3db4880638767bb67c74311021b6c46698a21aba391c65b9aab238d93a4ba80be911c3ba8319bc866cac3e67fee11b773ebbbb8639891809d555258dc9445fcd815af355ce2cb38552c5be069b6c7d0ba83f8495f1230f50bb57a8c4d82ea8912608cef0ca6cfe408052b736d9c6fbca2ca08e76300d150dba48080421c5a6b13f74b8f705b4eccf9c1a336a0e7a47263d30b5d1675df4a2abec7522868ba4c6139a8d22c23608c40a8bb5e8c65661b94e008ba442b9dd9883e8953029d7c4e7b46206880b48214a84cea0b34560f29054756f427d185241d946efbda04956a3972f974be20be202314d9c58dfa3543acf894d65b6f22047032e408636440024452f6c2cbb5d698730907c3271774da95b09421e499b17f670caf8585e2330394302aac52b0c1d2b2ad16656cb79257b143f555757b989c79a49730354e42299f28a166ece2a03e1a6dea08b01b9323d9958d9e320f3055c9500625b731bef77c3f30fb2960974815243f7edba28b64a58bf5afebd76b53675dbfa62b05b89f85f945c00b3de4f8ad2507121bab1a86224a9db9afe8c26513219ccc9b19156268d159097ad048f7fc245fcb93edce592a8d415d4a38502632973ed98b6f97f986dbff7e53ac28332ea3f161cf5dbc077e44f725b05ff0ac4abf95f60c5713aef1bfef4d11136e2681df2ef881b51a092a9badbe72c9772c169808521c47149578621e28 +ciphertext: b6aa20edc9f8ef7fd2fc2dc864289f6c98db6c4e7be0afa4539a83ac0bb55256356abb022d1497988bf0a664f8c2465b15f867aaaa9af528943000e9318bd733aeafc681a9d79e1a1466bba45d5bff19a5f4120f35b1c3c47aac4aee81f61119dc3926bb6c5cc1543cdc914e515b1258a22f07a23a6051e29894bc11019029af844a442f926d27b280f20ec61c4b633edd12c37542d93bb6deb907cbc3ad5ccb72a13763a1a91da7dea74966dc53081d789b6040f65d08c2dec770dcb3b5d37cb8387a7dd953df41f06b097aa7e866b08cbdb1b226477a7502846881b1bf22813f9e4bbe40d80ed0cbedbef9651a93701cbfa15384819df097306f7a8236c7ccedf62504303160515b72f08653ede849d19732335d5c4037252968566c78331afdd1dcfbc1336374e10cf679bc4b01289c46536da48c485ef54c6cf2f40b85cf272cb2d379a1ffa239b3870d488d8d2a18ba80d40d282a0b23073ce5303fa7266c329c03df33565c4178e99e2e0aea2290c846e5eb37fa293e4b7c7ab2965a67d76cc233f418e4711aab7326ebeb2f3efcdb2b79cf12654ad1cc22a748d4160fd13db4fd9b0e32a0cf6a5e2d03a88439ad1c3ec2d190cadf463e03cfd434c0a351e44950ae3f0c52f1987d69a8b6b7da85c445a0149e60c94258ab92cba1ba4d0f43da93ba87a4e1bd0bc62aa1d3faddbbbb6dcff737ce8bff4d108a31aff8ed870b0cd7d06fcb2a34bb9ef25f18f8bbc3848de931456437fabf9402d1d9b9932aaeb890fee4eb4b60c1d61cd7345d7a7a80d091566c9270a8e24a77bc26133a8964527e9b5b1fc8b376d5b65c9fb5bfc9d36dc6538ae8174c42a54940276a74a2a4d1aa99d721a113e65eaba503b604ccaf41ab0a867470244a08655211cf86a684292c2d3170e9dc2207a1edd0fff62c81108437354b1edffd0abf96c3a577820e7f4659561e11e57177564b1745cd240743eca37b0f827af298d25f5c352ad29082aa5a9030b69896d47e4460c210ca9f3ef1981fdce6fdf13a54bc77ca902bf35e31100b06f336690bf2f9a12fa1e9ae2b2a7d7caceb65cbbfccfa52c69cdee200ba34da38334356b7ec4d7765c3ad88cd6f4b3af13827240dd43c9f47b7f7b1fd918fb828aa6a8af0e8f7d3ff8710124dda6e6cfa923ecbd60e007ee6f2b4865937a411fb4859d40feb7974c9dfd27b41880056e35427063a1bf21f1a9ef1a7f05f49e41c74813452ca3265ad710a43be1afc528682e256d24d5b39fe2cfa57c9bf7f728e2aca3b36df31a9618647e4291f603b87a5a82850a0ea288a926812232e5c1cfc3b2ede5b9888a4a039a612158315bb55f2fe481e47dda46caa0f5f1db4fb78299ddfafb43bb55edf77b1402a3d61c4b9d84fa2cd3f9827b1e73a200888aa7ea2b4589400ee0bf389c3fe530e0227dfd7c7f9b4fb5d3f8d127a49b7fb33f3edaf19a1f546444811f5fb83e4126ac5062ef352319abfd9a34a8961ad1061d3577a3ecaa9220713b11bd6311ec7524a687dd46bd067cd8fed06e63d364f4bf4082d8b41cba87a5bc713fb1de4ef661ca05fdc40a098c56184e4e8e63ac7b06a9dd2bf6da4c5820d4f5a8b476f930801b9fc4767a98c0c597c4ef5a3cee795598c7df3911ba71153141b3f74e68eb3afde37c40bfb6a6da19e73cfa3fa4f8f9d622f9f9b7e027e686f872698ce1c415b4ea07d19c20cf40df424d01848e65093e52b049ffb8389626956965a1fa19f3ac8943ef2457a6c31cbbae469846b29a3b92ed5f6d37fd3192caf8fcca888e0fcc45612f0c8103eed3ce543d4e4f2165ab64100c2d1b86fe2c140faee78887df0c34e8520d40a7dddd8c6d423121df5688c91ec5186184dc4bf5db4aa1dcf071c0446f33f3fd37e14ea8ca77752bc73c4ddf515bf04026b68ae127efb7e63958494a13a0a0319f46ee9cbf92c36ba8f15e16ae46c5e9b8ae654f332e36713236368734d83c9eebac4a67c6d142ba20dcc83060c37733e6b9d98a75f7e367c905fca0f8b3bd9b53968d0f7ac129afc6a1ab68642bd5db00b4cb443797a239f291e77d75ae8a8854cfcd916b71cc53a135a96da844e75cabc2a455e7a17257a94ce917a2f92d408f74a09adce0705606394bb3e11db5554bd5ad035b28e754048d832eaf932172d942fe144ee7b310c2db9a6385ebb2ac085baff10b1dcae517a7ea7158dc00c3fa34ba0950f +result: fail +shared_secret: + +# Private key not reduced +private_key: 974b92e8755220caff34234c9c59c29df4ec7b9967d54334aa259f05a73e43285e4a6ab005a36528153c5599b79fb680f2e8f559b68bd3a46b159c3f2e28c960d6cbf9ded3ab2d5fdd885bccefc48723b789766038678d1507ffcb96afbd44dd4a17ad153a8f32aec6b008fa1f6b5a1a4979197ba6cae9dc27ef5f6424cd1e856c0fb5ac337ad1c7e5c472c575ae15a5274f63d308fd11b8e11ad7a88d536884c664c4b5fd4adb85f1a3567f48cfe068c038f5c10813a99ec6c606afdcd58ea6d7edba5409a65d6e68f3d5a34e4bef00df6bc66ffd796e44140dc5511ffef3235c85f5a1fdb6b7c484fa4245ee957666a66aa918d959a50ede24533abb73e96f44426f19302b4cd651779c690ca0a108710f4a8fa10ea25f76e9a49768416886c5d34dc8ec3eb4a89825ed4e67cbc87dcc392d74d04b5386f40796c72cd17e133cd7853f2965f89d7a52d7388dffa436ad1363c049d2b26ef8285341218ad833fd94bc37733826c13c0886e123a49084eee0859923ec825d26aa4a3ba5c094728f83956596a1501fb4b0958fe01bca0cf557265a5b5f367917d3841e4ce6b1dba445038cb95542f7276f916e36e7f76c32faf3d88e83acc4bbd4067e08e3379ca47c2f37a4afbeb2c4f4d23b9bf41993bfce59fab70bf7950b4ac8c5bb1f7bc209957d73afa87d0b37e0d74c08268bd828f2d437ff6048997e9449579b4f972bbbdf2af083f499977f5c68693eacd63d98f3bae3fba88dac46eba99ed324c5ba45f3c5398df6035dfdc8fe48a49acc15b823e5ed812cafa9ea7041cbed6b848cc5cecb0bc67ef6a7a6dacde3f3356f354bedc5c5934fe48309a3d0a90dc82d85e3d8286e64d5b8798fc03c0bed982bf613d59820afd26f46403296e36ff4d27294eeae68c34e56363226cfaf0c7fb4a64fd094a7cb4beb8dfc7bb0cf552bf98ec7e8967b46c70e5cdeb649a8f0464613dd8b69b7fb5a89820f2cefd9ee9a565f6f592a79dc1a475d26d99fce33b21c973dade60d68cf4ee7f820a6f65d09fab44bdb265982b4a78a733e7cd603c0a07db623be4c31f52f68a6572d749b60c9fbcf4a7f3c539da10c8c3c3c4131ec88496ff5955b63fe96e7703c49a0afd1bdb583d07cc0077347e29bd276af6cf2f6d0122b73d9cffbfe17cb4a58e8331ea4c7a83f811fd04dea91bc2863b6c9d86dd7a8965795392cbc188739702ca7ee84c85c867fc45431a7579dad1bcdf526fd876499b039571174c44d679a7475a156ea73c25ee3ab2d6223f9da63c8b450369a89fa59fb65ac7fcece8e93db84a9a330e63f7f494a32867f6b8e5547eed0fec948287e871376ccd5aa649293c5790d792275349baba658a3f7dd883053f59d13695c41ea73c8b832a66febc234a73bf668c80c7665a9aa99cd560da4a6e9ccb0cd7c77ef39670a83ea53a85607aeeb900866a9df72abf56f31dca4d15c7ad19c8d4bc3ed9e545c84687fb50757f54ba51d283dafa480c2aacd8d1fd6877948e1c8f15088ab3c1bd19ec4f957bdde00e875dd4594175ca709164fea5adb408e9e4dd57ef5efd16e799e5d645e8a57f67b07e5c98d80d83f9a8f075af91fb3c7acbfa0dbb477b93b789b76ce445c58b9b977a681e7cff730e35a8295ef40649a333ebd80aea19ff859ad2bd07b3d413087c0b98a31ca4f3753f3c2feec9edddecd2fd7a9300cd9e91ecf4986fd7935e3719b370b7c809de37bbd53879b533fee6f95e43e8a03cc94c108edcb563afbc7fbf6643c9b8dc333134c8734360dfb4f002bf7f58b625cd5de20acabf8fee65d1af2bd96ac403440ec9dfe5fda4d0653491979b332fdce326a836538eb18ec83bd33319bc7e49c29febf3dfc6e3cfad6a3e3c12bc1c0b56599c9dbf07da8e70b60b72570bb49c2085f4850e8a7b549bc07b660e6df6ea8d94a5d1a59a9c8ab17196000c97f49efb3f16dc8b2236f6cd6df6fed9d019cc6328d9c91da3ecb2544cb4f37f38af0c2b8f397e3be1f0cb7af6c693b994c8c9ee537f9d07ded88f0fa4c032d3b9e08388b186e3cfee094ffe8c8c3763ea8e0c986de26d6c90c74d0c349cf22069b86dca993f36a303436166bbac8ebecbaefa37c155f0f678dac5fabeedad48b28e3d63b42b2a986ae296e400f7854393dcf57d04a4fce611b9a82a54098c5377fa74b86746684a02b2cc8694852594b62cc0dec3c240c49b1cba8235b2b7220cca57aa380ca7f6ff96688b70299a0a52e34805ada0144632ceb704b0f08a3ad9c78dea9a9f1f556bb830cb0345ab9f2503342aee2944879ac0103caa1cfb1932062a04cf473ff372d72d500574660435b756a99635a9626f9f085faa880f8c332f674a76ab0196a3326b0e88ac19547b6e8a4cce3a3a60a9590d524e61501a41262cc67a3cf036e08e947e11c33d34895a2d4b7ed348ea8329f8e8775453a65ec242ddc6b33e6374acd4064cd8c765bb3079550c05e0054dc11b4032b33c4e9371630aff59986b95b7c729402d61c7ca3bccbadba94ecb5151bc60330379e24eb3fc36358cb83c55f18789c37c541e93b3b781d42904ed910aba5f6a4168336dc351aee66761cd17617db2962547d77fa238bc415a6f441c0f50fc2cc88dcc7049fc58c3bf3a3091458278087ab81569b607c66c6b6e4f677b4e0c3b4188dc3d3741ecb585ca68a72d0b18f18739e0194448a1da0d436f2a71fd08218283c416a0a580588932fab5903c289bce9a1b53328c70bb943660ce98773ad14a51783486268c270808cddf713160068cc8c8682ba11d4a21a3408b181625bca33491522949fe6a3ae6a2f046619114a0318fc69a3d58bc048c45ed4ac3a610ad1987629b2bd66200bc0e7b083b1b26cca00f576a2d2b8ad3c5212d956a5ee0985cc4023e9a99031f3a903934f2ec24e2ca46f06a26efc2a19fd28236e9097420337ddd61bc2b7c15fe9949acc7c279708a7365ca87b72b635aea5d67541853530f66be8da1730815852cb3c62024be50288c7ab08a3a2c442307667c8bdcbd940c0a6b91ee1657be599f13722f1d21848d189b8b389741a5ec86560f1b862eb63669753558190516964c610696e9b24a955d07bf388ca0cc4bd0861b388e5a9f1c78014da35ca594f9f1b766494b7ab4377eae61bfd8cbb5e775a4e627e2dc80c17128bb5c314be217033668c29198ce8bb27bebc79b1b4c5fd81578eb32709ac6badc3cfb7c414584bc3a38ba2ca1c9eeca55db9bc295791ba22ab54f9d22cadbc83efb58e243517abd4a93a11bd083950ec71536bc49b39c53d17b8a301a17ec0b90188c800cf2400312b76fd85a26557022909866f5591eb8017440364868c459f9039ff053e6e829ac73b2aeb81c9dfa78703c7af8efc6ee88c929183351f752a47e608638c7016026a031c289b936e06f46889e827a1e0c99ec431c763ae80e72b8e8cb87c3b7b74159596a9cc5a6c67253738e6889f5259a0ec87555e975ee50c82cd44428182827faa7b81a0abcd009a05685813e3000f9623e1c4536443811c98148fab9c8941163a57b8c7377d55a994d6ca310ad58012f51f94bcc9fae366a0591adb9a7a78e78478d1076d65c8f029867d69be153cc7f7b7c3f7f6b5f1832bea256f3f9b7f1165978eca35728115a115500677c1bd232fdf7145ed07810ea4651985a3ad7b5edb37bc21e33115d4c8c8b5094419780831c65b88a7d934bef0b9a52ca4299adb84a6d9053eb4999a92c92b353d9823896d3759c3daa69879782785017747c102e7afc0a330ae96bc2e7a4e6c4b5a637b2d85ebafc4e6c4cc676f78e29e6eb5b8a4bb942a797d78cc708ad3cd2f04217f18bb3677318d3a917db689599c009d3897d95b586e899e5855253cf54974ec4f6fe8be5a4c6804c99dbcd7c3e7407fa99b90a5586e9f180aa559a81978adba7b770a4c601980ad940ccd42eb70010254848b8c4a2886a1d835abcb9097253e2fb817425525cbd37c1b8b3a2ef47e8a15147a6a441be37e7b2579e5f74641c4731ccbaee47b1f5bd744a15284239179a70a70bb8217b1371f928b275e14c83554788687ace377888321c87eb5403cf3c93cd4c9e302b63533591d96af9aa5c47353c03171caee118bd868a6fe29575f5881c5a5bc7f67a2dd5457efd71329473364d509b02914d543843cc3b36e213e27facd6f0369f165adcbb314f9c4c8930564b9f5aaf21c82860035e9f729dfd30584b8cd6735aafff819f9d244cf8bcf9ec15770903a3cfbbfaa385cb960692923b88364100ff67a2dca71154700e0594dfd66ae557ccc6ff36519a2252adba29881b7dd1283d3b621b40acdb3bc22fae51c5a64488a3993ab8fdefb1682784edd39f0fd80883fa378cde6eff656f57119177c56a90b6cae64de81b6f1395296905389da76ca7c5435e1c4b2d93cc5c303d31bc0536ceb14f7662be0c42779459f69a145c0e2ce9f0bd9a0cd1bf32ed5694cc9ae32 +ciphertext: cda962ed9823fd85e1279d4c2855e9e16b01e1228905d7a7c243f94adca4f22a33ddb85ef0cf052b8968e3963757c19d104fb566b9188006da9ce5b5c57ea9c30858aab0776459ed0272a0492705c5643dbd7110ca2c2e6a4dfa8a00512f9b2cb730d5b94cb816587fe6714ad7f69bccc08f45e78170be9cce0414d096d961ffb1a180442f510fd65c5fa8ad49afefb8d96a8d85077dca9ab501aa4bbb91b121927ceb461c6c7b907aec1b6e874db0ec7171522122824975b1eae1f4319ca046edc531055034a1fcdfd37b05248ce9a1fd240e44dee1264989e1380a5970e533e10a41498792de3390dfbebe2ef26470276046867194bde9858589c8da307b3093f9fbbed633b628973e9073a9a2e204d436bf4b5509555e0e06d5bc8efd56f2e3ac2e2265987811b396eed0dbe7421d01a09dc97b90cf3df6dd959edaffec7d0bc17e01ecf78025dbb35b6cebc555f89e87e68e272e260fdca9f7c0b886f85d23b7b38fdc565270c52395b136b8f1ac289b8d37358fbdcb9c516eb4bd0d9e75afdad371c1a2bc693c3dc6f89a5c731666dd5d93c9dcf59be90a8fe8c48a41b40285fc43d6ed2a9112f43d7f46f79788642518039f9e1e51e8c21ea7e0c6246fd8395177b271d9dc6e3c5daeec361d2f168d3f50288f4078de91eda0b1396809f9dfbbfa54e6803894e802396d50accf38dac484237f1ec851d93605655d4ce0ce900982618baaf24b3e7521838b9b4b1ec656684d82b3a2f82fc06d1d29d3f00c83fcb4c579dfce129156b809410074fac770227de7a1263a8c9b619781929083b05918faddb75a73ff32ac0925f7cc336dddb1c03ffa6e7d4449053e3d9452b971bcaf7a914a28b16ca4615e76ea00f3c15507df347254a10f4957a560ca28e518a5569d1d153fdd625b538b4065c6375d8cfad5aba472ed15537c22aa8febcaf408bda07bdb83f737440dfdc28da8ce43bfa5edb7798921e0c70dc6341117e70c825f7bc9b83b8c5c036bf3889eba5725b7e1af2fbc6aadd190d3ab68f94f80bd71a4b79aac2186fba726d0be379f1669ab4a91e38c680e38f1495b96fb45533d73d62685621092eba9068eae3ea1ad1c27d094fc6c3d5f52c958391bd58aa00eb55c329452dce85199414e61abcf3608133dd72651c01cc7a7c0a1ad3593fd227d714025bd57920e92b1a3eefde9cda50456aa257ffb85668064c5b3e22c1b0d27dc0e41a8b68d9709615b5138e6272d4f8b7fb26ef147dafab88cae1027f0ae026a413f1f130fbde445df7dc517471223e5b0a5fd96fec3294c66fff3799597689e1e7c84c8913bb9fddf91bf77b339c8cf4412e8ff8d496c6f6d97ba772ab8b1c44779eaf1339e87bb16799c1291ad46dd9776d4d3b15de11931c508a6eba012182784e374a381c671d26ebbc2c744247438e5fbef7021001c233542d13e17fcc4438c4be9310f5fbbf9ab2cebb2aa2097d5f2d30c0471512e8b022b43f8025408ba09c31a246a8ebd9fe904ddb03dda3f1a7a74f64befc83f89375628e7ffb587dbcf904b8d7a5ce52407eed130d42dc4554771c2a10b11c09373160463e775dc2ae642fd76e43441fb544ecadae0b5d6221f4b65b458f02378ab217b4e3e980b0d0ce70f548e5b0b312133dd6c5ab74fd947109d5753168d395b6620d4c9134d6640f216dc86453360aa47e0be2ca5a4431631acdedbcc50e8bfdbbdcfdc9fcdd9695561716ca01f2a872dbe7704ccac7fa6d57bff833335dacdd3b3da12c5eb03556271355881dd2a7d47bf45e1dd87a3a7253357af6a4a92016c5da1816c089be187895f3a576c23226192ee5b66fac243fde774f645552d87e6a50d75ea560cedb453730b7b4be30c5420e2103db839ba14e6c35815020046730762ce2bad97b004db9632c5368fe4a613030eb6830767ff15bc01243158c4ea0033b8989b18f4ed2e5885313044b81d03a0ddb47404b815830c50922a79882e0fdb75ea99428435e776add924ea6921a01bf5fef8995904d09a898b095d5aaef5d46d253ca3a36b4a89d4c34d3a4d6b56465210d4668d4a201d0415dbce1170dd3a52c5c9179aa1ccd90619613ce8a09d09a44a8f042c652eb1c4836cbc1f8d5f4849e4f25ea5bc313aa79e48fdcad067386d8d1216273f7476da2c64cae20c0bfac4c2c4c3e2d05b080ea5c2b14d83d3f199b310f956c4a9345c57265e0a50ff +result: fail +shared_secret: + +# Private key not reduced +private_key: b3d43c1965522268cac63edff79934c25fdc1413de9da56e03ef6afda978259d4fdf3ae07a37baef774ca7a87031be662b97cf678bc3bcf7586d88f85bc44a9bbc546a8bef4859ef31ff939d1e516ee6cced064d0647950f0d4cf976d45b97e093cb8a42b9c903c5802bacc2aab484d35b319b1df5c44df08923f20c2a8033c4e52eb39b08fbbd468c754dfb47cdf790a40dbe562cd04047826a03a176cf85b5ca718919a119fb80f1f43e6ccddefbd44c1d67c854dee8604cbf2ba8dcf41fcaf81793568d50ffa5bb3643cd86788c6f5734cf75feca45301ea97283f6c52da4adcbb7eed5eeacd3499188d555082aa43fac55e8e45bae1cd2391ee33edcb2a5665bfb88f9620ba4e21c746bcfc1e46c4000d93af973810a98ec174d562426424647752f26fd2e65bba71fd143ab7fc2486401b3df36e3a8114db4442382609ad2c413ecdd6a956a2f9fee9c87e668a77e9bce3537d4b93fd136f3439c37c05d9e7eee0578cb2c689b9d7e2b2544d26444b2fda11c0c34b2cbd807ad72e39c6953ef8a095e5dfddc80e1a4e3a2a3ae7419fd35cfcd71e770dfbecdb2ee5a498addef06b14b6cafd066713f44a77755a7909bb4e913d1a995c280a8f24a7e4a72773494fd60f6175a5106eb351df2e7aef5716661d235b5ad1f4dc48ea15fb356dddb3623c53fce0bd966de8c0a5bef0297d4d513e3dd0bc80f674d563588eab3712a5c4904ff7c4a9a3440443c32cfbf520ff0a9e6417a5479c2b5be1a34fff9ab5da17ef4f754417245611558ee854eaeb7a8a0202e8e286b9b52d5618dddb05fc99a03af4420a359c3a7a09beca4099e5d4ffbaaa4865f3777df8744548b5bb8ceb9bf1deb799dad6483e5f1e44b63c9e485bb75c8e32c42247b5fdcce37856cbce035cec7ee323caad4aa154585f8a9a7cd8dccd7f0a379dd629fca6e63990a5a9c7e05ea808c68819a663958f9025543bd3a82407f9b98175b5e2576bf55760905d3135f4691f7b6bbe9ea878adb297c7fac05da67059e30bf3caffef093bcf30505a4d8d8963dcd527746ec371b4a50cc63898fb068883de6d69ef69da33a384deff6b61809ea9099734e7b9c951b831813da9cd9f496ebde03e738e0a64d1d24afe6274e5e58b364bbe6260be98b9eb35eda4156c483831cff613e38a76d310cb39dfc59de510b88b5ac4aca0d6e6888b33ba9fb8343c71085ad441e356cd5563e03c75517c99e9bb59188abd898d55addb8fa39d274dc6fa70bc97fc552f4a76b902af12f0364c584717a39a6e66568bceda277f9bffe8355072c75d6c4cfc7ec7bb644b8932b41d29ea059ffcfda77cb3e876d00ad4b3c8daa7e1b83b13ea4e3f891ff747b1788ff6343f4aff6afb58975cbdcde14fbc9f90584c52bd49f6e70b08fdcc36c9ace8dd2aba933b685b34c665e90b4f19d77f1a71b79402acb2e53480865b62dc97432e8d0be255e7565b5f7ba6ca39c6fa443ceb7a3d8ecacf527a799cc7553518fbfb4b5f46e08d36e09f6ded7e64bdba472db791abe7458f83386764b84e83e52ffdb41346d424c65b7949a9db6ab7abd91f3a980449cdd253c36ea8d8d586c6e55e669c40bb9634ae56733c76ab7d9b4bc9a8787e7b5bc4b0ce9eef76cd2731e9370b8401d8e5c129836ef785faf0bf6ec78718804da90f986961c5e785b9e6627913f8bf1644d8a7f99329314305c0b330b0bdfe5759016c4f32e06b627b84f6c5e843e34425dfbfbb9fed566f9eb37a3657c2ca240f577125fd094134c934f936c4a76582686dcadd16367f3c63795451537831460d0c4e40fd8e1ca977fa2eb7bab8a597a26f33689d697ec94ee684dfdf649e327cf62ae5f2b6f62a41dec5a44face47b3956f6439c3e3faffe382987ecfa533d09c6a48abfff84c63c0f5b4c3f8895e2f83cd59305cb7f48c7bf93beeb4b317ee5cba90597d6a1ea9add7fcafa2d5db86dae0e3a951a5fab5a10e5ef0a9d1b36b4f4065d87a5361ace4a1d2acbce00ed590ee7bd84b6c4ecd5bdf4c453d18c6250a8ecb69b3da26cadde7711c15f0a59ac94ee57b77a6aa13db76bfd4dafa0e61e3634459c3f63bef33178796148b59237e4090fd6b5fdde2f6cd82e107510907bb36e330d5c9bdd1245242e7f4a6d438085a30705662efff5fb465a9aa584ee5bc009432c97a66bea57133df41cd6d6095a69192226c8a1c6a0416dc13bcd39cee2867e991102ab5c7ee37ab23d33e113b3e7766b7c652cd0fe03fdcf38653149139b532ac46b7e80229c2576c44834080b75d9f2490d79a23e6d6cba707458c90c7bb758e3c7049d5868b32e2c50441b280bb1fe7528924181051a9b35c6ac779645e6554b5deb21959754f3a47454837b9512820d04722a884b10e01b5acec05aecc2a778091bdab81f0091ed67a7c7d062085866df21734959206733257294a4c82a7295a739638141aa3821c764891fdbb64dbc6aebb67a8c82caf86f7248afbbce556055405ada63ac9f6423de12447d89746fea494662a69a021733592a0fed82749e73d4c2c9d192c994a535f126700a6c4cee988945353c9e9d2240828bb674bc98f22a298fb6750da5ee76345ee1b2dfda01862d2116e6607d3c251ade46ef82974ebd2a14502684be1cc3eea46cf3c2b3c4c14178a79fb495a44275cfbdb5a23ac7b8a911d7ee2ac0672b997cca5d4442a5d80be02c149c0c333caea0090937df91491f3e03ca3f8c85357001e4b0c1c9a73be64abbd7c68776179d4696fa138834325715e115584c368b720ac8eaa45aa4176e9860200cb56c41143985a6bae63aa16733464acb2cc948a949528bf6a91156a3a6bfb55bbe1980d499543720cfd435289c880ad10a4e990cfa2548f17bab1fa31a45eec41361198daf50f22a271c7f1acb7f70463b9b4c82b71228644b3421325b09de2946b829b31e56b0c95727c762b5b5d078c1bb46ff2596b4db6863987c69b26225bb9595d612a5a464d84b6bc775701fa5559d5c8cb55bb30e2e3bad532125ce9c790774dafacb19f4c9dea8abb25b26a6c6a51e27205b0d2031938a9f1700d353c2997e935461b121149a16f7a133af9a103b34e2d3180516a5421243769eabc81952a407486e2111238d99bee90554c32aa12e774dd9b17a5d98cd68029f1bc8671a9015591cfee86bfb8712a5948b9455caa51074db3771f89e74695524fe030aecf998b6eeb301d865f67b9bf4718476026ab3161c77f677fe77a301f357caefac5e579bbd0b34b51b8b58eb71c44c52dc669b9341670bb653ca363096d691680c95a0086601448c619050486b6c244eacaa0198f77d987c5083853b0b9b5531a716a10e7517484a36e38e465e4c855164b2091c8a23e5b2f220524285c739d8b519f55ab1d6c4505ca6a00f6cb6de0a16e1355c1c8824ea571611b8a3925c4fc64a5de44a2a1bb189d48aafefa13ace52290a615b5b4339008181d428f3d33267cc135a2649eb113c023432132a0b93bf08203b40ef0e6465c1ba8a1fa517c37c3d363b80d25c70248c52010cd995a866c8004eba1ae03e56e4783453e52609d6c84264c836857a24f2955fa955041a44c6157bd2e627124fb102ea2bf87b1ac628a393fe09968d707c0f27105b491e19c34dccc207367ae309cc1a0f0cb0072781c63642823623b2239335a73db76bd449b401cf5636114a22863b50ee32bd4804006f13dd66b44058b43be960e9a3a5adc3437298b05c7b314d3fb9d4c7020b64b6488f70a73811d934bc0a81677d1664bb497949b757b02e074e76c8a2e65410158973e30a2a9b6b034c0baaa22cd62a421bc25c7bfda61d0578c1436b808540cbb608cfcb78c8af6a43188bc26f637ab479a1ce86242766d9daaccd93c13d1885c7c994acb657fab0a75de17037f637076f2099560799520182b8265f9ea8440ba9e07b084efa2a6cb244d7db1a39b10297eda34bdc82bcb6a2ee871bf13c1cb8ee602c0b3818335895e754ebe75476ee1786d4ccb52c7164c33a76a3b3e2b57b170c34d37295d22e2351be21a95b6495432a1a5e8489edabe9b71a4459a4ea08b8dd65c4fbeb66a5058cfe7706d8e09381979b608230c7430879bbbc30a6150af273cc4d52c5f1c43e723a036530eddf0cbbfb6ba091b0861f1c751530ce52c947743a59595c15e529104a892e089b912975c7c598b1de528983b5a66a7a66c459610f63e95a7b1198b4e42710d69ea7a8fc3880c0876da82ce872952120a666aaccd5b1001b6b99877610071249db481117cd69f6a252ccaf1a64b45c84c2004eea971ade4659e3508e7b623fd9658f1ac8789297a8dfb3de7b385d927b522126a05aaf40635372f59af9ed4e64cd55048057d8b30c04fe6c876b8a67009f33aa451c6ad54d556d60210a23da8fb68662c39a1e08d893e1d1e784fb71702faeb2ef44d2f608621e831187ce79b2d2f4a20f1568bbe76b0d3d5af36111714 +ciphertext: df6932fbd48242f30e3b1ea4ada5d8bb84e27babdadab801a1ed8d36f93d123cedddf0da50035531fe9d7abede9969acdeb76d9f26648a1d0c2f4a03d78e7cb7321adac80135603cf52b48e6b9e577b167c8b4227a325bb9eaa7bcf517eee62c0a30206b140ac27023ffc1c0ed126002e5c54a146f29f615cb320b7d19e1d32704717bd271264852d8e154fd4739b54ea3fbae78eee7c6297dd59489bbb35d29994353caa7ae27850b3722f56ef241d6e2479fb8423f9507a0e232cbb0554af598ef5460e151e2f69f04e8508ddd1e86dde600d645906b5800ef8cd70f5a11b9c9db74f65b03b0c57b5d9d3ff821690ce41ecfd9e2f80593591b48ab8fff0671ff47f58f2ba533d9e11f6251384c3b3d7ab0176e1509a274af00df564cbd89d5145b9640249a80aade7e6c6695ec3628e1a035216bf49b7e4f034029399d3ca4d60455d20e460005a21393c5ab7ae4ba564cb4067ffe1f51bcdd7032e339db7875f3bbb99ea2893fcf2e055d4226e566260646a09d66c6942fc24f3a06c8fdbe46e95db21400a75501a6c10fe94d5fd1de7d110115525428d641a695f79fafa86a0fc6d2bb01060b9edf55f2efa42ee9a3473bfa966c98a2091f01d8b85b48331a727ab9573da40b55d15e5f68d227c7d8dc803fcebaf3fb171b32bfb30b82d812ddcdfde1c1833043664db97729967431194ab78e254886c404a2aba5d2de25e8e5c6d98f797490e8b135ef54c40b77967a58cd733850adc1b56fc39a5d1429ec6ca0158c2b4b5aad303834e148aac021472b10e4e4696dd73c49a7e2d8e6ca56674cf267a116cb76cddffce8ab6f44500d0dd66a0ae460571199d17b87d3dbaa3832e90f0e26263ae301ab6df79a461b91bd149a1e99187c09d259baae83cfa3c9f33d4bc700285f25a423d05c0e9a50e2bc3efd291c8f74f21c5a2b7e35f13d3e13d5e78c84e2cfb449dbc02ff4f1fd5e98164c4ac30f6663e2ce79ba97997370637437277bff8b2b08b1a8183e4b1c340bce2a85dbeddb2cdcff31152829c294355204fefa07e75fdbbfd48985ede759049de9f1625d43cc83c895e6b0e806874bd74c75f1088a48b2f0eb4e37f70cf38d6496abed79ded46ec7c6ed709161f2996a8fc337bcd8457f155252c0d2b5dd21937259c11e769d507c713b558ab492bb055d2cabeb8f5206eed3d75daa508a1533aaf3a44307d542e7c25fa8ac6a38df6ae99148a746f440687fa5822c02dc6c2cc625f90ab9ebe52162d2382b851b14badf23737e5e94ef61c8401025dae044d3f6033b257fd5a8f8b8ef1be2b03a4045f9da7fb9bd0efcc0f81dbd526c9c4cdf810bcfb3ebe0ed96e0bf69b0d1c311152e715e542ff959ca7ef7bfa072ccca22a864bf3c4514aa23867f1822be589e1776849d1b681832f41f4ea2109aff5926abf92a2d5f546206bc81b40305f2f2891acee0f32443d8e709c27efa376522d8deac407202f258afe4810fbda7868e916a683a6170bd2a221f33890d37db1a9deb131285549c13bbcf858953298b0c2c1a2a39eda9e7ba0c4d550709f17492fbd138df32c5e3d99d7553a3d5ad82f4c81e97560c1f0df2abaf489ca7dc841f12adfcedeb8005d1d90afea3c6b44e646b2774976074262364341f447a34b0b2ad77048d426b8502c3a0a66564ce93f75ffbc7589d774ab33e56a5a2e96c060f60396b7e6016031826c1bc0eae28f3694ffc582d63e1a7ea78c9abee8b8372f7acf672efe98e383d06ac56f03de79aae74c3a9b82a9cfb63e083dfebf2df0a50745c4f41b11e894d192a9fdc272df804a0cd577a7dca7b9b17bab29d537396de43a4554f2b4ecff541d3fb544fb12785c3d200d8c5d75c9113ea2a2a8a0e8f6bdf31f2428de88bc71ba028e06654d1e4aa78745c1e9dd9e5530c3037578bfe6f5b3f081ba5276b49e33992f2ad4494101ebfcce435943ec8c948eaf0cc109f82d0fcad7372fc9791fe4d99c4ba1cb4bb76072e98f76ff1c080ffdbb1790f886c9769c4011a36e9d88f33594e90222e1bc14ed23f53014a0a2f26344c7b4af10cf4b5dc14d7f3a3a9ea3674bfd295c6a78343fb64270824b10d79dee3d8152366f7c4bc99336d69b5fe117dd526744ad5e3dbeb255bf4edb49670daadfc69373ca1e70ba7a3a0839b95afdac0d293f39865013f9746c8eb4295aa6f5a40bf85300266fad6ce396124e71ed5583d +result: fail +shared_secret: + +# Private key not reduced +private_key: d246b3612b31d93efa89f347bc74e1c7f73e79ef3a18fa3972a98dcd857166cd70dfbbc8f72e97e22b40e31fed5cbe38496fc61a6380e14fb3714695c515c5a984abfedb94a09ec0ae23c4eda48a276c9cc9e6911fbb4b217fd8761f7704ebce55db5300ea34a1c76de7ad9c7933a1740552763afd1d07541a3de9793ad68a4f574037b94993dc222e639e73d44abebfce0f970ea8887f4ba1cf278d81abe4f9b58be74566846c742bee50a70380fd0ab9ce2557b2349890969af0bba2fa05335c28b2b125806c637ff4c7d095f66e42ce36ae3b400323cb059d9c035b3c6aa4c5676590ab448c0e6aad6f246a6c59938ac3a56a0adf4e2384432d741c93507c445a9efc53c7f6f98305c5dc6f3d6469c15a4bc598deaf24a532aa935aacba42da1831b8fcc344088b091aeb0813ebb2364e2923afa448a6a7a56c45b9d1825f7776b7d85873efe304acdbd37036c83f976991ce8aa99d2f52b73c6e54ca89440e832d1f9dfa45b59b0f3ee56ff9cb8b3e358d5b4d4590e857bcba55ee9b7cd09abb9a93ae9b62ffb8153f586078d93403d947b5895a53db843969b24cb6dd1c66900569088897821aa059cfc814f3b7a1be4893f96fb35ed2924ec90f63954719e87186538b36c4c44536513d56d84d536e9fe22379f5df8c7a5a19ab01d7da520d759ff5b46aa5c78a8833dc58f88bb432b2e741d1746f109ef45a8f395c39ae716bb35eab66552aef3c59b873487097d8748a285fdd1a6fbb963e3dc4f07169f5703ef1ae7fe6df07628ad6d7c1faa3e7be58c6cfe8cae892cf457dfc29acf3ef4bc377fd58fde4f4143d301a3e01ef76f0066178ccd8d66cb163157fa534c96e3d4e48abf2ecf8d509e8437e23b5572e7c42b64be26a3f9a445dc93d746b47c011ba941c1e8965f52f45eef6e5087c81368b43feb73195cecde34239ff300e9d99388fff3d2c999daab1b395851db4cdf425ffb699c7794977d81998812d836a185f62a57e1ed656166ccf2705d582d5e7d8dd9b66fdaf0675efb25d52aa65813b4bebd1c33bdab745daafa2d7373e9d6b8445e9a35f17a8e47c79fd768be8f37dbe19a686ec6887e5e0f9ffe817aff82557458678c6d8d9dcf22d8c857d798f4799b6cfc63e0c350b56d91b1a40286c7ad955ac7935965d944baf0ba45beed512c698d4c6a117ba3133ed6813eedd147d8285948bbaaa728d2b74e71fa5a1f3545fa937a11496ade9d8ca3f849d577b2b8ee5b4b47e67e543fb36a809d6cc36aaecb3ba357e43fb93276b3a09d3433b81fe546aa47a322b58e2d4955bac7365f4e33e777d68e69f8119baaa867740068351d07db75e2998b6e77ee1e8d409d6b2d97c973296ecd9acc05b2aefaff8a944537eb57bd6c3d5f0365bb40588dd130e6baf76ebce454e6da89507267aa0fcc880078729eefec0e6b364d6de6d589e50b7371a66caad36fb72aadd35bd8f0798951cedc7d6798aa99670da1d6a197dd1b93ba13756ec0d3b8da7aee94f0a9ffbda4418ccfe97076b8ae3a4fd8dd531d5d2febbbfc776e31dd4b00556e51bb8d4ef08998ed9346c596d804473c54ab8d6f64ae654890a54a3cec9f01a74816d086fa23ed34a6661a30f95bdca444b1c64c9b77e235cadb5cd8d75b5c0306f40120857854fbd45bf615d3869f95f6fc607eb08b4a1e2398b81e86fdf3b89a3453569a66e52d5bbbdd670f173529e3d950bbeb91678f1e8538e00cf4960ddc268baa07f6fe2fd4e385ccda902d85f602d93601c77b43bb865559cab77b4e6d89b5a8ada6d069e5ff839a786d3ee4ab29a43ec6f9b64ab6f6755f6e648a9f003a556c31d345f33c2300c3504f33fc57c32ec196b1a9a353f14d20cbe6818136d32737dd4d9ff7b4656a83580ff053ad4d6a13ea364431ab1f3d8ac206edd40af5d8c43d84b1dba42b5d9430af3ef5fdbc7d656492952e157a689c73cf8d45487293b0c8c4245c4e0848670d66ca54a3a3e016b36fd2ff7ffcb63ba4edb8dd73bfb4d5b3da64c69a64174ce5000f88dced5d07e58bb05b8e673fdf4157ef829cb7e25637a77c49d434a44f4874bb5ff7b3584cf85b3c73e2b9e0cafa92b977e9c194585bd4c3e8c37d9b7404e77802c05b50b3acce5b46e54c7354087321b58f2cbbe48137459124caa95197546f8b65e8ca56e95a1b844147c6011e93057b8d35b6d6052ca045cc1d8444c1b603ff211fc67653a03cf7d3930373206d4ac62090712be287eb6404843c5c1208b0b993c028a445be50550e2b5625e3124bc58b256eb0886e74ec7f0c4d082a143139222b80037b61649e1b4f3079c3f12cd9742486de788ac1a987c158f5d20296742af5953617a5608b5b965ce1cc261139655a09936f555ad8882f3d7b823c400fb7056abd05bc4cc18636141a3f0c0688b5cc04455b768be41096eb7676315f808953c8aa95656e4686c89078e36290fb0b01697c56e41a0bdb7c9c6c6ab8f50eaadae889fb9e0a41d757ec6756bb6e690819b95bd02386398817e1c9ad7db807a842e75017f5bc6b46fa6cd1580993c1238aa197931c9b55d333e953420dec916dcb00b657b5c6fb538468a855e830f1afb9eb356098e12226a7a0718919dfee4ce6e275211804079bca97f291355790aeff36f7baa99c79ca6a4fb1979331494407b33cc6fef3663fa018e28d76e49eb1b5fa828fd7aa270f917e143a9a7938bd9a05d9e483a2d7725061a88588c3df6935ed6c411a149c634d0376decc87d2988954671c8e9249f517ea3d939af8a71d505a628958c634221f11ba962aaab9fc91565fb647973633a4946976b379199105eaa8e8721a12ef43325f08fe6e173bac2243ef74f92074d7e96124d70b3327839806876a6d6b982219bbce5499bc56df2b45af9cb67e3eb878d02b881a5ce9ec55b98808c48a2c963d8854f0172083c9bd2f55b15f6ac7ad7156af33fed0a5b6b668d654b602cbc3e3f9b81b3eb3c476b5bab8b6c886528ae4699e3768b51cc7f48ea9304d77cc8a708ed08321e97228ecb97aec4ba224baf4e684fcf62753985c8ea07c86f501433f40c21f6903cc8166a7332c0b6a8a9c121c41c35690413e98a1a0fc672fb1cad48d74044811f5c7363d7b03fafe2a6a3634d850cb4fb505547b72daa710babe7165b50ba090338f6001d8744041b5b3db9dc2bef60c5b73928889975f51548ab72b4b88a85cbe2457810115a9121f72a3d8dd6bd0c0b2476b2bb9e69a7e613a83d820670596353944a26a16115fca33c505a4dbc5c1136ae3a981da1d1a4b2c25ca0d5474916675ec8817a969e78812414053a4d0245d86119e1072c8dca8c211b9bf3c91fee350f2a0a392c4017c5705655f26657c5090206270140bb93718c37918b4ce79918a9356161b00f09a43aea259ff94d0dbc95a6b83eda5326397750c68cc6b498ce974235484aa453334e05c8232dba3dd1a182ba4543b4a944a5220c46d56812e125c06bba360ba7759cca24a1cc02b13ee9fb75ce8459df3c601da31ad552c153f789905a105929a223e3101f32431f346bcec3a128b0a3c3d4290d270b34e643e17bb5d53b6d248455502c71edd01654d028525576e3422bdf69571e9c10cf3c3c30227c89e2ce0c62911e5014b78b0cdabab060579ebf1a517414bbe5343bf33311c0ab1f659b3d30727184ec1aa8f1c3a3db45fbe215aca961fcd8ce98429d381995280ca0e5e78cde55442518476e0b404a2668424719abe71d64083ff8b63f285396f5989dd4aa9332426eece567d8098951e141ec43747c17cd9b1805f9245e0819ae416c61f3c60818ea448d397211e8b97e755494f0403a133abcd0882ab907e55a130528a5ac535ade736081d1cabd62980355cf85f84559ea36d6d3855030c341babcf65a20c9bb67ed4901f8b2617c7b9c8466976da39c6780003b71a74f6a16339082e6a62458835d30f1b32041bf9ed21c65ec59db3044dae0654e743a5e65836a4b9c5d2c9c4de859b1a6755ae7860fa6053de71aca0a61cdaa34eea773867a7ce66654380219c7b756d117a81e1c1f81156c6d5cccfbdb285c831317e5cfb8fc50b673600bb46469bb3c7c6072d87cc3b17bbb65b95e81875548b63e3024a24a329a4bb1404ff862ef10bcbe6a997c847650b5402b888e0d71c900d4a4a4cc429d717d3860a6615869f734244a0b25cd463371b189a243733469bb5dd97cb3e856cdf2ae64fcb519d9be1a75aa8794542f51bd67878e9a1b8f6d70a650b05b6a609ca9f477579264b127230966a289295719158b63931a3c0cb764e4847c9ac8bb91598b905a650a0123c7c0fb939f7e3943a2f3bafa20a221f37dc17933cf5e868b958e4e7cea4cfd021ef0ba63ff7a7250d21513171d5ecba1f135207bd2ab61bf7718dc6825848e742ad56f9f8099bd43905ebd9d6ba7a2985c1c4d203778597947d710dec806e36b0cd949fe460ef141213bfc525e5b +ciphertext: 266487d97a7e78c94cc702e1869784dee13c887088707aab4bfb065bb5ca21efe01033215c2ea740d838bfa46fe849f697786ed81bd42ada9fd509065daedba4738c5299b3fd20b9805bacca7fb67777b05e2d1f25b56335b2176b59fd4e6cdfe568edfe76fb17d9ec39474983f44752e59eb2e18d8aa659f7a0dd9ed701ff05f94576f9ce83c4f04e2d47c13a2b3c407c6083a486d299c7e335bde88ff84b6677938b2ba4f6d307275c5e883b06ab66de74b5613257cd17e58409a8ea521a81b43653f652ac178c3bd19204addb4d6d66e9fd34363c7a9359094600212baddd2bc5b7780b222c5acf0e866e16adba183f12410c7cf91a9512d567bbe8bba633b363ecdff1fa198abb376b1ab479fde329ea207d0c665a0cae43350c871a20bf99f3b867bcfcf26e144c64b38131558cca0cddd3afc9c095621bfbcf789af1db138a58c5a2e97dedbe0c05d1d2d9bfb3ab3b1d87770d61882ccda744f67e89cfb89385e989e48595b975ee51d3631187f67d35640aae07eda8f0ed815b3fc2bc952b075db1856c84d8e20dabb7b1ff3f3fd8aafee26ba1cd69ec1c37073f27cbca57f1e493a1833d57702baa80aebcbbc1475ea314135f1598dc69737f325dccd2c817746ffe03302546ee6a8dd0e66d2487fe0400eb0278513940dc453e95b1c732bfa691459e96d864e342d532f39fd1099d2d19f81349c92aaedb560d2ae2b97859b430bdb4662f1546056ec29f80f582af1ca3bff28aadc309e3e22f63ff8944fc2a2ee0e88935a6239a68704eab53e737583977a66798436acfd373eaf5ef04870ceb6ad0077075287892c01a914408dc1703eb332bb66c4f721264c2a582297bf4853a4d402193dd48fd80401e1994685f600bc1a1e4e6c1419fb944e642ae4aac3f3b28ed5ae13a0fe822a019174e4aba84fd0f84f5623d54ba6ab820859827ca997039018fae104fbb95756e4a308314dbef967add842940023487d5100c1d146d5f5fa270b1ae998e08c8370b21d4fdc3b7e56ba64adf9f8f7c4af431a0ab53611941fe5be38abd05ec13456e30c48f80ec39e111676dcc831d9f41c1a3861ba29ebb24784686a2fab5a50ca72c8d7600b2b833683e7bfe2bdf9b63eba575620cae84c87d7e9e0393d4f146ba6c8f4fbd3276567a0b45377f55c5bea463862721be3a02b7da77671e48891551c753520b52962c2d1ef4ae3fa1133f7c065328db517868003a28c59562d40d8cfda5327fca66fc54134fa303b506e7fd55ddc0263f72a9579edc9a8491ac33145338b81e1960fa395f808ae09420734fe952056fcf038af61ef94983750bd56c72ffd1dc13ef624bc3ce95239a71e2fdf9e403897cf45e581ce8af63a245223adca6a3a31132dbd21d55482871aa606345b27966e2e07f175ee4be7cf0efe4d84ab6fb979e365b26ed749eefdbbf2148eedfec6871420bcda1467d8e5ac88c3d023585d8dc980cb6d0423f016eee54ff9f93a62cbe758559207e9cde870ba5382563867973491735e0c2b745eb79b88f1852d585e90f572cf3e00c6dd2987a066ba1f742dd7f58555f5f9f3973334ec91700cd21bda10628acf624a31f9395a468bf6ff78d4484ff60e44c13af103a81d8d0ef5e26efce7530983527e95fa7a5f6a4280768bf91f0ea21efb607c73843a6d2f80cf77656f01608c3102e1bba81f2d72b37fe34cf35bd7150de20d30da1049499d775107c306f88067977231a06181b3700d602489ae9327581cd431a1e83fd3dbd92bfdcb787743fcfb066bf1446fea699f75f9eb3906cf829e31497d74b92c7bbdfaf798d2f54b91f35bf2eefffe1865abbe4e399e27a78d9e32c683590bb77fcd2dccf1ce27523adabcb3edc0805fe5439409f9ed2b90537ecb2066d7560226d352a8e67e54161ce51c380b8ffb176852d132d0604685b5b267d01be16fcc2934b325bdbcdbad79cde7d4ba07a3c63a2e645fc143d62827730ad34118eb6ce61ca2cdf890abba3f9169e287417c97d0719da6b9f1a45c179b1641dd0357ffee577aef94efd5b498868d91d19a780e2b65dffcfb23d01f6536d91bd49fc0e634b79449bbab49f612d41afb45060b448830643a0f246ab5019ce2b1e08f871eda66bf23ccdda8a421985b58199dc3d7e42207bf830b2b12fd859578aa2b153bfb93e65ea210a5c0f024925d77fb096b50c1ca77758fc67118559dd7f +result: fail +shared_secret: + +# Private key not reduced +private_key: ffa253d9738c7f3cc8d3d9645bfa7b3dfcc72227dccf53f00ed962315c4a4898f756588b0ff85656bc8329c33d81dac016a5b049af5204396268ea3e16b63aff88a6c1bd3450beafb0f530ff4bf858954ebbf8e55c287b3d0f44f3ba7aa06ceba3c7bec896ea1506f2d52d653a44354415a152b774e31cc0d3ab9b08486ae87a406f17b063cff4b75c81d4febb1678aeceb9da9aa5df86ec8fa357984e697d21d8fb71ad933dd34e289fe89fe64f953f5bc4dd68f9a56328f6cd0fc93e7456f640998cacaaa7d4bae7496c4fa14e4f56efa5601b3651934cb566594027a9ba5a77b37f9165b5ecd457907a25786d55e0a6ef81c2dc3ed52fa40cdf3a36494d4825a32caaaa244685734a543c8c65b6bcc11db390c24c57e49feca3bff9052846fefe55a786cae0c3474c58c4cf6a4fc4fdcb414da699198fd4f9519fc9533724b9d5a5c76e8c5f39df8f034cce991dd86467d4ad2b5e2f985657047554b389cbcf53e51a862eba7491aa76528ff4d8df47eaf35fce78b0ce3c8ef14c901e3ef2e364449967446437416e15fb8fa6671a04a173559f470e5fbeee6c11657c7f759242ec69515f3be14c8e403aecbf973c91ac94e004c00bf5e3ffe9dc189d71c6bd5fd20a3db77f7b913f55920ad7b33de04988916d558817a734395beca7c95f2ead93003feafa8aca0d1ebffcebf43e986b34c7fd66647d05173ffb7fed0a29ee6e69cf7dd33c252a8267e5db57babe73cc84972665db7343edecf926dbbc17f44e81fff9ba494743c6f01a0693f418ebc71f4bc37d67f0a566ee95b455f6cf414c6621536f1486fff9beb3644fadaa6c381656bf2fcafd973d4f895b6b0beca0e70cd3603671d2b9e6a2b571cf17b060994c0d296089e3804ddeb76db57d9a23640bccb4adc34baa7db9fe23e427538dc80c41b299ec0a0db2c16a42018696490c4dd323f9577542e0b5677838ef05379cebe49f7276ac28dcd082bbf3fb983811daa72ca4db8ac9e2aab4ed3ec895d215bd4335f68bce37ed7bb980ad9f5c7aaeea47b822ec676184d809a9b5857dae5ba7dd6bfc37c319f2512e8bfe248e235860027db8c0b3444527947ad5e5211b9b2d65328e13cb33f4e3847cbad815412ef36c7e7a42a7fd97b0193af3cbdc6049becc3d51d61ae0ba1c6cf4b9cd1058388627ffb35f7d85daf714fac6a745feae8d50819bb08bbd50b65f5e2a093ce296a0dd8ade79faca7b2d9e08fcc4366ac22bf63393eb32285a5dfd2e98c0f3ae7f389d4283ad23e86a2e7972e6e4b22fcb7c5cf543546ddd690f88be0d4a60df8a281cd9acd35dcd245051545b46598524bbf18df38044f52f048f81b43fb2d77edd7fccb9f35e73b48c8a2b18b3dda8c3b0abc4abff8ff2b4a6acdd85b6d8722caad2ccdb96a0dc90922691f96769e2d9800cf5818b23c2f913dc929c3f11995c68d5d4c91b753496cf7b4bd0e46a78babc61043780ebfb9f037668e3c5d39663c8cc39edb5f5a4e345fdb5079387e5855d74b84045b1ecc7b0372ad48f484c6595d2c344b6bfee9e370c78b213f60f6732ea55a0479453b4684454588c90e49d0a29ff2644d04e3f62931eef1d53b0af7ebb8284379e9f5fc139b58104d3a938dddf3da9f5847fadb7d582a7af03d7ed0a8a31482e9f986c329be6d079f38f22e99dac8cbf4ba67ad78bd819334136edd888f476985441de439df0c8e673e3f74db4faa895ec34ba304b4674424d555959e662443d51f9ff51ad56d4fac1ed2357f015d3f538dda64cd5609f3cda36916bb5ef36ee3cb17476a879bf88c4d6dcf5eca85475b7447c0cd6c46ecbd722a8cf8e8f50fbec5bbcb5b9b654f38178e51ad9ad156c7e0edeabeda37e8e6eea34b447195a897568b080aad2b52d7aa8fce2b2ba73d64bb97a5f3290aec5c1a8d1cebf37ffa23115a774592c5f644bc60fe3b5b97ae689b9dcd1d6abfa9a50bb53dae796364cd99d8f6f61830f82204a8dc81cccc40b67b92d67fbc38faefbd68ac7fecf3a6af5259093bd6b2dea6665b7901ffb6c2a243a3d2b423565f935d3f3abbd7769aac9ba0a8c3813c5378ddca93f3ed76f954adc5bf91ec4d09434d0046566363775f4965f6f6346b6bc1c5d655efdecc74fb7f984c926ceeb554fc827ecf8a004c38ee59d74dcddac334bdffb649aca864c32b4f082ab455c94e6fac7ac1c6c46943e0d4b811e48a80f18a22130589937a1f4e4097dfb8c3342aab55648486701ec3c36ed167dac427c7dd54a6ef844468a481595b933701a2db33235439d702967ac1b77f47391e6700596d52b534b6ef33357322ca6f1c6a6917b1d8d9cc7f83028437c125912b4e8d33db0d00b6d475452f41a5088a9e5d169d1faa564b220c3aba1d6c27a5b87aef7f4afb75442c0565cb78c7b81144aa3c209f9a808d43132c75399293400ef70551b51292ba501fb613998011a35153046787183580e485bbf5b81bb9fc690ecd0cb7449615a0b0134f559b6e1062d9209ca62aa10279e2c7475e48837e70a2ddecc66d1ba5dac35760a5a5de0764136618b78516a0c711c3c4440c1f0117d617cd64b55482c952e7617176443c802c8046012e9b774d0312a68c49c85a44d430984ec510212316d43ecc3d6fbcf9736cd3e712d0d3011b645107a22b9d8f51e8dbc30eba66e98624473880c3378b8bf933d6577cc31d0105e19565f848290059604f9b71b755e123b7401f204356120c769cccc2b1660e03e688a75fb370ca4088b46d955cb24b7073c8540ecb2a537a66980332df62196d8c6e5584b7ba8a4c8739eac585a812aabb33a5f591b428e50c7291415012467d49b232989c34711009806249580a557048dd3dc0d2d6599cd556ac325a5c00b8820f0c9dfd3336bfa5f61d6baa5e26b848b39ca02cc542c1dbe90ad8d355cec4c9f3548868e9052618c86fb729998cb4cd610c8fbd86429621e34d11c4943402c2598b80aa98f395a85a180ad402587111de30cbb41e0c5f6044219d6a243860fa8da94f2fb878c8625b8e8243731aaf5b511fe7b3c34ac3fafc68df6d4be563727f705ad41245fde8048d184337e662aeb85135df92d4c1a3b36f1c984079d50248f88523483cac2dfe959162a79353708d09b399e6534aa88aa5bb3cf3eb59eec6a5c8309c6980bb2e4681bc47b7dc2939ffd5439ec4473606166da1053e9467c50854712490b583ac02a657c61812336b47a5e2912cbfb4a1acc84991116b9cb1497f199ab41b98bb54343d188ae54a269c89c36a61be71898006bb9ec531d6006325a47a13995492f41498790bdae9a9e41c0cef6fc78f8e027380cae57c2372308a1b0c2321f8ba17867a1358c5c13095617c2b276aa3c0b36588a9c62683104db5c94643c69c1330db1fa9a66c107c62567f2898419008b9465355af511afc923415c545ea44f15e7b98dd09ec0d79da5893125d6125aca7adf78a32f918af2a41cc6377c04a627fbb28ad5bb65bcb16e3f32622f45b5600cc367348379894c65f494f79948e6e1941c10afc4cc00ed871e529c8573b36debc7c80364b01ea874f345271517b6c399a6277b80bfc1a9996a3748a0bbba5a24abf84d6a714695202ab7779637f85774c27a51446e72fcb59ee684873ba60315a84988b5936674833a93f06b283c6cc1eca1bbc36a02c8197480c24e17e2316eeb58b81a3f5a063b1dc4b20239818c8aa67fd96cf6ab52017979bd82431c862837a1b796d0744a27559e748db8da63676369795ba92d48bb11f9bfa5393c522403b6379b0d2c82beb17ef29b37fbebb387aa695d54c241d51fc3d5bc7f8316100021fd805d76a601862473ae3996b2840ec274bfc37bbf5119668dd0bb0e909fc2a28f3b3c469a9b279bc4810c040b70781f3d67c584a965a94ac1bc088cd2b61c54f301f5dbb82f110c20d51a6c882cfd3c2ad1e6311fe4041eb6cefd7681e75a72d7b0cf39742394e33328374e5ee5b0fb3b0e2c709365780ed3191e56008280188baba9c745fa5a8958c0ef28c1fb641e4ec13dd77404dcb031ff3b670a2092edf848900818c7104b3e457d4189cac8082b55c55573c2021fd32e4b331eb515092843c323b02228737b2c8915beb2718d63b8020c2b3a957fa5029638846abcda5c3c0cb2aef55d05c38cdc1755328735901ba53d685b939b168b9cc55aa0ae05fcb8815400a9dc36a58a1f4f90b3eda3060a4490751413d9c1453ec8cb64dbb679fc69073c9e839c40e8ba4cac38124c3697528404bcc6435c9c21a5b89cd05516686b4df7da8ed3bbbb9afc428a842a90bc09666804988c7386b794b460105fc5035dc3018dd494d421ae46f978b305738d5f40faa6dd68ee73df57c41f89935528e64270c9759d496204f118f77224920bf4ff7c69db5ebe12eacdc6012d57e2ccb3d690db251204dce3ce7683f8a03d3cf04e46970ff7d6a12494ae12558346dfc8fd9370bf944a0102 +ciphertext: 6b0bf99e0b0ff75905ca7bbfa272c50e2603e7c2c8d0d7a28aeffa277c279baa6eac0dae07dbaade7b9e47f863555ff913e0c55410e5eebd974cb98e3aa0f73bd7d7bd52c451acea0137df60c19ac883f92bf27fe16d086457c46820ab90192cd4f1bcfcf62d7904f8af6a028e4ea5e490f404e88596d0af72f3b2e1da4674e20e7a437f921f036aedbc3619fc9f0a700eb103146fc8ced979319283b7b32d58996c7d430fa89db2ac9e717b51dae25147d92e8ad5f01d738b3eb308087a4204377ef5bb35f8d02c707bd407a2b706e7832582b288a082b238c3bbcba73604537956c3d12614645539ee1aa5449b721776fcd829209e2961478d154f122af4e4e42a9a88a02579e2e60af3df04d56189d89ccf236c5b51d5dff985c1abc0c18cc85d1e01d8f0a95e88df078c296f50ea8efd6d792ddcd8d694fcd935206850f423240f860d94b9843822a8818d9e24589ea80be4ee48341b5fecb9064e863f33840e7f48d2f2ecdf64330ed811c3e9301ad48cbf5a8969470d12cefd1a927636f8f34d78fc1427f9e3876ea2ad0979aa967f70630a2c0347118b8f2fb54ce3e61a2538b57a941d3c8b14e8c7c10af9bfcabc00af5a5eda911bb1a489b45f95ae1e621a58d4c1a287feb55a8deb01adaf0321f2c0979faffecad7fc5474f62503056582157d7e920522adb236dd7a27b1d5d61f2b13924b78ae8fbd8c4187be30bd181cd57e138518d4914893c6ab475d23191b25ca3ed1ad74c0a519d19b3e269f0e9408608a898df75cc8253dd36641f280369365d532dddefbdaa9253e732f767641616c2d2232b0e3a7afd1b46acdba3f1ab7af1e422bf2c4c9b8e6d1585a50b900888dab0e2d7f421d213d8842ca007b9f5fe7f76c2ddc963671cbc896f5569a9531b5c22bc085f944edb6c95cfb6797586c8d8eeb40055aa002ca3110e9254e1af1a54abe82a0418bbab6b2325ecedb6056b7e0bdb9108f2f8443ae8279e0fc3db874cc2c0026c2b265c2bc9b406049c015da6c8d86a3d5b23de546a63b8d8d98d9e3cf0a621590e443d8147640621addae6d5c1cf2bbfe3427ab820ac18c2a0d6309c29568e064bebf72ba372b3ea006260b3b1b84363e1478fdcb8e727fcbb80fe0daee1cb4d0b47f3fc5690e8885c9e76e299ea74edf30610cd418437128bd48991ed47010b3f7a1536292da3dcf44b9ababbb2914f53d35f2a1c2e5a3ca48d96ceecc2e92089101e8ee50c9d0ecf93e9f4a68450a3fb23b34377aad47381188517d8d0c6a185a07d1de4a30ac45b328c8104b5fc35eddbcfac173e4b668d603ab703abf600d3043d6b64c0494fc757e530fc99b13296200c2016089472168c9230029ac155aa5d6ae83da44880a86483ac0a8384862747947e585f502e1b1e3aecf4c9c4ac62f8cf348b23e0e015665d97ab654f51f624e5b54efe23b83daf84df2812eb434393193d0ca8f8c7f60f354508d5e46c97c775417cb82b66a4d9a683c2d9397e3136ba9264ff9cd7676995932d9f803c6ebd2d446990bf5313cd4677fa10ea6d9c5d5f3bbc00667fca3009b69b953f22c33fcc800b4e9a96627c838966cf00e2b5647725ab18950de4fdda622b8d19d94c3b3f188068b4e538c1d8dc8f69d32d8708efe5bbeab6a9a3fd9bd58f2bdb4691bc72d933dd6b303e586987e57a212af80bbb763d43b9adf32ebdb28113a6f3911d95a1b75656efc36c4b950f4b523bff785cb5eb1ade5878d53c74e113a1f6f97abed9bcaee8d5a012d9453720cb4217a359d5b800569626e63b74fe4439df428f380aa00ee9563bfd8fded9d364ba45ef5477a4f27f6ee637435bd5b7c970e181733bdad678dda5e11969bd2d15504f705e4a3fe34ce6d6457dadc0300f6640a8d6c53fbbfc993c42f2c26a9dfecc04ce2bc6e63e1258868f1c787287e03dd4698d2d400bc5857a56ea37d8f02a38a7fb02c98f0c084aef51a83e8c4853043f71fe70bd1e6d758e673260aac5b305028091fcc44ccf993fbb232462dbdd6694fec69487fd6338b4a7f0aa0c3c4286223566cee9c4facc6faa84fdf7fd41dd1072353c51f9e5d99b7a15b9a7fcd960bb747a8a4a0980b99c847db7e6793b65cdab1abe753fde758c55d6ef85bc81df59cacaeac2368c255374fe9d1f94a2c482f40855f7cae9dddc131268ffee6a5616312893b819e285390ca57d814c9e3790989a29f9460 +result: fail +shared_secret: + +# Private key not reduced +private_key: 3724c5ebbc753f55535fc5ac0069c238d8b7c21ebb7efad8b59999349bb352cc5c18f9926bf676b54ae5c75996502d5a323aec89eeb4267cfd6b4ee3852e6ee6e4625c15414b77849716f92fd79753163975a4be5ba4e0f4df61e1a3ec934380263740d3af666d96e010036251f7d61f04a6e8f8acab39d7eebecf0109d7bba7fb53f79df07b3ae368411913976e73360b077772be6489e83818b6a1772f3098ef39753fc9fb4bb014bfc8fcdf815298b0214b97cf8b740aa4bd89067ced36be138a3d096bc5206d6d386541872dd83d7e968fb4e00963d931da393aea3ad975423839f33bdb9b0095c2421a3db1e9e4e60fc4aeef9c408c84258afa1b3ae00839600a659026e6362cefacc789a1293fce5d87653396fc0e2d844f9d3516448449cda600b6c7cc9efa3857d37c0cddffbaa582c9d28528b5268dc956d4383e2de55dd58bb84bba99cbae99055575cdfaea64828f5cf8b9adc19b5dd9d6e6c58c76ebea9a84f7ef73b9d5dd9b8d48ab144f1699e2ca1c5efbf87997bac38353d0960aa1599ce5222aea0de795f9385fadca44cb036972a8c37dcbb61c793d862fe4a80eb3f23645a166bf1a1fa827934a32a58fba6abfb41a4ed243ece1dd83794e7f43ce76403a9ca5eca3047dca2d5f3e7a294c7f9a7cf87b941ea47b1a9f8fea095ae52d38217b3fa0b54caecb60ba03a8a99745982835b0cde935eebd4c53ff3f4cd41e96c08c8836e267a30b8883997749b66d47d28f758a683123b9ef71ed8b1c5fe21b666c27d4c902939cc90442c29d79e53b87b834baa609413aa3698d365e5be7eb247a7f0e5fe84b166cffd532b079e563c7874e9392fb1c9c528387ef3648d72cc063546cf23bf3b6e68c341af3895a657308e030e3ccbeee4f56aab4fba5505314605d63e1ee89a7eb5cadc85f3716885b425dbc083e8902657ad20e594c24c7339dd4a29cb8caa4a3f49ceaaf8cf89a063a6ed690f736f5c6ebc7c10bc500b8a0f5f8d7656be470a4802fa6c3d90bdceee3386858328ef97e0b94518a455c5c6a3020b7da9468cd784a38bce99492cba4be53624925c3f74c533aa681a858ffbba5c15c0f6462956fb4269bfbd3591ae338244f5ee57398dc0cef7f3a53fdc6b031267e5afdc82bb4b7ceca3ceebf3cbd29af7c797867493046c3de1274e41535315c24a03f08c8127e6da71d72658fd3a0cecdf489595e17ff717a67487b842a6c8b2cb33eea5fdec64f8ffa6b85a84ee014595f409ba93e9be0100ac45bda836b6ffc01c78fa8c9d4be5ffef17a93d1767f32cdfb764dac4ebc3cc70f5884ac9fb0ec996e537608695b84c350f0ff7a16ffb83d76b1622789f65e57bf7f74b73378994a997d564b81955238a9e8b88ec19317cf85b7fdfe66bf8c44b0333edb9395ae35f9ce62edd2a2e4a0d608f4698698a0d475e6e9dbaf596b84df628b5b34567d680a13b56c27a9a2d7be01ec655da3c1c93886d15b6b6f28404c85b37b09701aea3c51ae46be8bb93c1dc65ba6f48b0fbaced8e6444c911b8ddf7adce6497c536ebffba6995f89985f5aedbb5a16984b0d5f2c64584ffa868da78d33b44b1afb5a25f85c083ccf6db93a5a8fdaadccbf25a8f28bcc6da0676fedafe0958d548f5fea619cdf0b5e9750d846d58e8f5d1a625b877c64e9ccb639aa69186b70775bdd76e2c86d7ae6149f52d447aabf946af664b493805de93e9a4846b734c09478f2e04e5c446455cd037fece9302eea5a867fd8c1a3bca48c35e88cb32affcdd6f56a1b89cb8ab972150d93f2686a2c0aefe17ac413ba6f3f83723bcbcd933947389476ec07ed676a3c327c9725048dcf5ddf791c9eae184aa96ce93e94d40cda88f1a497a2c9d201c95248abaad0c8848e7f80be076ea7b4ad3cfd83656948ca5f417ad3bdd298f1c9d9fe5909dc568fbfbeeb560469aace1bee7dd53d29f59f12b767356ad79088de1a7e6b589ce50603bf378d464f15aab48d9ef34db1769f88ed7e9b64f7a184b890060ad066b4e924ff5ad87b55ae89a1222b4bdbeaee0773ed95d7d4f6866b1f9994f94681c21b41c3d7972cdcfb842759754ca826e433497b358c17ef306a464d4bdf7a5db55043d49115f9a6e476cce974488443562cc11ede3f45bbe926859952b67fdf277ad3cb8966cea31e4205e8fa992213c49059a409aaa3ac72b85837cddde4c4ac42a9a35ac7fb80ad2d8c1eae7019276b1f3f3a6761602a01d99d4d050c23892427d6267efa092b587a5d2376012cb755627b9e63a2a04432260aa1abb2698ebb6075620ff11b01e4d049de698966fb49bdfab73675586583c744b5bafbe9692b6c6c1448899ab72a8821b52b4bc061910fcc70beaef424afeca7d3737f4c7c6711b38dea919e1a13c78160c1c652a81210c010c48908b13101b04334e6534aa0986ec01a86b30d41cba67e573ab6b0cc1a2c973c0041bd26721b508a667bc28e010265b762a223128e092eb512bb9d6150af6840581514470212d0e5c1f4696e45ab102a91a0848497e8a7a52ef20c85d7067e6a1f99e1c0de84473b735bfb001e860c3194029d5a06484920bb0e371114ab2f3bd775248a9449d2c19de5023876931de00dfd609c95c98c133bcbeeb52c0f713a19176dc90b5143a6876ab45b7f717865d4b8f0b8a2e6a45f123b85c8fb584cd3c042676ead069cf9c23682aaa05c1010e122473907547d79b0f8b61180014b1b3a56b88b3b4fd97eebb21eaab37883889a37676c61061d41b40b49dc5e68f64ed979bbd3da4a7824b32fc0bab9985a94251fcb740bd2b103f9c21c25bb055043c895531e68b17a3cf3190683969d6299c850b7d11a6b7a183b4b3a3daccc41d3321f5c088035102ab68b2938975ff180890153135e284155f971ca624c19f15ae4a3023f20cda6d404406c39cc26ac4df1665a3c19107a99bb289176a09e4a7c197ba72d6131980264a907b605c1e1791305974d49b604c81a9c8501ecd0cdd32a5f94dc3f64481164323736435d1043b09fd1ba63ab6956e4216ce47f719bc10f0c2b2830c17886965188534205c3f8818369aa638d5902cedc28b56c9723aa4eee8485151a270d3c1d963404bc265b912c6e52099df9ea72910674bbb8493f670620645fba16c0e6c73ffa20a99d6378433c6c55ab20f0a40c74ba37ddda39d2ba4d7f34c705a4117c618ad91408ba3bcce9fa9900d2650fb109fe2221f0f6219c226b74e7968f5aa0b3e3575be051446b1b76b8a7785a43c824c73688ce495681fe723d97b249e5a65a961abd0d61527d4b18027b00dfa49f4d213253e80ff2a556c48ace2b6a5122b42c2d15622e158e2613b23e62c6398838aa821cb05a4424817f0f9291f4ccbe6578941070b22b9c36bbe89ecad318e4251451a80202a70e1b2274854809e770677ab76c9e9c5cf4e8621e4338a279169ab46a6e5344ca391b80eb12f9b8a582105380384f2fe845b7298e52803989211498b42537b8b1cd22a59085bc00941f190a66fe77a1a6745e8af09762751c63656a26692bf1870df08cb861abba73b50ac6b03f880844a2c6811a031eb412501c79201e686ae528c84b7606aac09bc42265e77b56fde93022a71374693f9ff5787fa0855c79321d147831ca28e7880dfe1c15c66bbccdb93c0e7113a5eb9b97285ae8717bb87c1f071c284c0089fbb5a7b5121770950d255aabfcf54f1c18c8d9b2bc4aa253d5ba49bd2944a8c440d01343f0770f690743dd952f4f6692a60bc3360588f9575636748e3d321050c42c11d75b69d316cab62c681ab48f1880a9d787449440d1f1cfa0386613c2b3d25494e7c17d3e4b1f5a5780a9f088f00a9d6a79c6b1bc0e1d501fdb398421a19e316489bf1105d9f79c74433c82b87a775ca358965e8b1248134a94179c20011121aff04b95130f2ea20a0deb2d3ad8a0f6086481d8297a10374602661ce031b99012be53c70110b53d28966d8009ce6857f778006a304fb402769065c04d25b2f3aa1bae18a692d7552bc9805897c9b65a930ba11c6f3487801284d85579a912664118075b7237e66183c66510202188dc8abc1aba9524e0450b7a29b4d6b5076769b7e419fa4a63521619d1f76cefd0a7de67c7f5491724d063a13bc27bd20e9d486fd5158d3b7c04a97b95bb06895206058f94050dd8c262eb70a73746cf279350125807c52ae8a29db743099f259c9748318f391e524c9d8b46932157c94a8179e02897f33226ef1964f4cc92c7323df35a7700daa10170082f0664e4b8a221da0b5da84f43b79584194aa8c18724a6452760365c316c1f36212811a8e1936578653878b2372fe58505e7957a3e0e0f1ac0d822a80287d204eb6a446a74afae0ccd1859a2544aedfd8678b1f242830fb21f34f7beb20a96ebbbd6181890cee3bdcab29697c5aefd707f7054814869cf7625e45647bc1547aff288dbb90699b2ad84893f3b755d9722 +ciphertext: d93e928dc35a487d9008fdcaace3165118ed7938a9a119b07fc9a2110843cb1f43a8353b000f2ac5b46f989a23991c018f9d43e53c586322fbb7bf31cf3d28d93eda34863ef22f6b51001879614bd8abdeb10d9728183d0f2e6c4c64f9f1ad6790e5f27a6fd601620526f0e5380778bb087e2dd437ea330340444af5a65eff203fbe231b0fd1649218fe4592bffe22f6d4427d053f22cba52c25559c5536b262ffc21c1c384bdfed79a974429f9e7158eb23802b3b4d6131817a65efb093629d3ec4a0cce7c5e8428954489a7c9f10d9efeeb9ab60cfa1785fb0cce23cd7ec12882a840a56e106e4f2251ead429cabcb92a1de08c9e79776ea090e195a80b755d3807ce234e7ca665b3dffdc34f6f30ed2a67e246f8008ddb9dd29aee41495151549c6f86d8233da909dd49fe814c8f3213197bb3300e5cf5ae564e55b0b71c4016067d416d3fb94cd4be0f200d403edfd964da3372e7cbc1fedf96ef3bf3f4f2038877343ea9ea1092cc40249aa46e5a307945c639f9c653b44957c8f121dc4c84cca6a7a2c240f13ea6d9020233f4f75074501f100bb53dd3b7f9a905c7534edf518efb4090c47bd52f09cf98190308eae80b12957f42562d2038c85d1f1712fee26c66fc959577cae0d1e699f00aff7ad2911d6826879161c9b9b12cab1412e11b8a42502acd2baf888b82b8f2e06b03c6cd96d8a2b44a9625d029439d2e0b8f7723bc252e6edd566c394a9ef0f5496ac59e04f34eb0eb7cce7c446ed2b0aeae5ec63d27d7f2a257ca71763af1a5e85fdf33afcfc1ae8f7c7b992b22bf57a8f62b86e7da0aa00f2b2fac92aea4598b270284640a285db6a5a37eb74300f7b2814278e5813a213d89ba2e3c8ee000164d5e14cbdfdc869fcaeefe3a5d4763e5a21c2b27023f26067f2612a5f4f2603dab06a9e885b86aa76d920ecc59c77e9c26b21e5ee02cd31cd740732032c9bc29c1e21b442435db3554edf0dcb8df0c67c0bd2c1c9a822caf88fbfa10ef7bd4bf7423433c5b24cd61f8fb6c527ed516d64890f4a376604b9eb126a83b435ea7e8592252ebceb331e94be13bc4a7a3521f9f6ffee6068312a9ee6f97a9be5b86a8f6e4ab6a9174ae67b05151383bb79781a532f6b6e3101c48612ea76e98de53e13f3a7a58005e3333ec353499ce107dbac10dfdc83671fb506378febc6debaaed17c71069e9b9a51189d76a8504950682305c05a9d53b32c1ff29d7d8ab2b79a5f97a304696c5de3076504d0118d85d0e02c1c961774de4412ae6016108506e038dbf7deae8201243f252bb6c9969ecd50dc198cdb7c48535c1d86fbf56b8e138cae78d1baf6d76001d668e93600032374c1646f19e89e73318e74e90404b3091626767a7fc610771e9cc7babd9407c1de14d54ec1ea0440a320d0a050fc547309d5e65b6be2ca147f56140750e36273b7a0b36d689f90c9c8f7beedd56eecd931c5ad003a7e7f892d029eb5752e19464c273084490bb693677d448a797e2edd6e60eaa484e807a5207b6c0e5959aebf4830de62bf03a955acd692ad37fec58d531ecf49c75582a77369af12502dea9c051237e882dd7399ac9c6293c98cee53895c16efd7447cf15eb50d67469e9f34d444a049d5ad57116454b322c75f67f36da417393341fcff60d5b46bc6dd4a14bb53d7b9b2a70faa788c8da1146ae4964ff5edfc3b239a435c4c49a3a3313bee21295240eb2c2781626b96b99215e356be5f56c4570ad59812ac2944465015fd5f1e098a6969233e0a5910aab8096e75903023f3d11aa37086bf41760d010da3789b157175a4d255631f37212bfbb5a35c0e914db64d31e5cff36dcbe9304115d4f0299599b6b067ebb541986495584181b5f02a10d8e51f20795f2a2ae9e6da72e9682f0c39e70a5331f34a3e11c0f184548f7775c1ee7aa1759a9d7f8af4d876d0c94db0db580f720d0477e48ba4a74430b14635be23632eb1ea40cb7264d786e3d474753a8b8b6c009af2c6a2600d0fde3e03d108ec237508b3daa6bae725f8f9398b8f61c17510d135a80fb939411606080b9f972cac3fd4b1b0cdee99752f42f41daebf3608a70a66e569fd37d849fc469ded909c8cbc41b2c598b3e5e1e301308f2765eb68f1544565f1e1b950b26d16a127601c0e94f61920806cccb9d97f6293271a11cc0de7551ae996c6abbe317bb7f64ddc6bdf63df09fab9fc83 +result: fail +shared_secret: + +# Private key not reduced +private_key: 081ace5135f462bb622ed578c65c864bf5f10bdecbe55b6288a8cc23df97eebdaaf549bc240963f0c65368cbccfec732a7345f43d563315442aa97acaffed36c58a4fb85f984ac6e85c4b74405e87cba665fffe54b5c6c3c0455b4cc602d9c411186ccaf6cea1ed5e558fc5eb27e3229faf13f36ea24acf25566c5d9333b9a579a918de6406b709b8c97a1eff70bada11f7fac52eea5192545c75e5154ee93ebaa7985cbf3a57e38bfdb6f96e47e8bda4042cbcd993948ffb7ca2673c4a3773e9ce5a97c34c543faf4eed7537ba8a5604ca316aa38b1bd4becaffc9d6faf8f1eda8ef9b22ad9ffbb7a6036edc842c3caac0efd90c7d6cac75f6868b26b8ab652476d520662faa46ecca9da4ebe66263ce95228e7b3b8fdc3b8b671caf1dc5bd6f325d209f890be83788267dbc86d3c490f6c454e5ed948e46c57b36c46eb7c1bde04bc81f63f494a198afa7ff08e0785ec26d1b57967bba750d4a34bed69c1c5bf982b97a1fc49b4e7e970317d87930b32a44ca7fa4c4bcf5a91e1b86a2d8c60e40e9b7cf98f634aba74c84911ac4b159636a4d49d63bc81fc3fe0fdc4dbf4bfa467dbe01c43c68483d46cc4b6b84ebebe7eb27a56ae4df7d288d74e6eabb2faaeb33404f84e7369b86e8b323e6f5565f88ea88310b97ad7c4f5d15fb21fc4f48743ecdaccc4398bc0a67b4a28a77a2396327a95cc6cd98b54058428d9a9d7a45f83ea5e1cdf6222d6dcc3f77e0cc874498369418e5279ecb6510ec5bb4a59987e848f1da64d8c4ac30b57c6638fb11bb1351bed5fa341548d4556266fc8e7da4b66d67718c47899a134e36a1815a7927dda14f43c9b2d65ff786aaec7a7c467e546ba339dbc41bd98c462a85e5c7fcdd07c5af9979f74d3fb2e6def05a57d5d659958b78f26853500dd47f0cb8ae6cd8db6a6a97c23e2ae4cf0bb34c4c4afa9177cbc1b25fc2f9940937433b44e4067093375fc6bdf44b8738b4ada5f61e74371ea2cb2eeae3b57579cd2a939f7c9a9950a32ad07baf64cd2603a626d9c7edc89817fedfbbb376dc2d5f3b9a84e45dc811d736789647c5c39eaaa9a3d026eeb9237a56e36e30445a4486962ef8682f724e2104b7ffec39b11fc713a234ae3087182afce5a2a3e7bec354e39f1806b7c99c57c8f5bab84a83dd76be6147ab62a49d64b63d462f4dd38c4971c18bf39f469d35ce2dce7707ae6ecee073c70cdcf6bef59ce16890c35f8a499b98ad8f712b8aee82f5b78fcd1a19bbf579f366e7375917330166e6c38f3d924044c2f65ecfe2c90755362c34abb53c59fdf8a50c1e392af8ada739a5626246e655991c41c9a002fee2d2ecdde5f428015617483d6fdac5b54cc4e76543e3aadde491cb24fe353b45b38de47cb3e05693ca5f5f88b4887ee514574f31caa5f33d776cdba9d6ce8323f8cd2ffa3e0c82f7a38ce72392a85f4cf34f73c52ecf48a3385c310554c0458ed28b59185b8cdd08d437b14d87a88f0e94b95e41e89f2eb4a02e4cb13e683971b9d9eaefd2c369489bed37b468ca98d61b1a96bb8acb2a21bc54c5dfcf84798019dd6caeb9266b9783bb8e4830dff19eae85aac95e23365977f479e0fc0e1b4e8862f30f28a3faabaae8c058a995cb843d98e048499f735de1c4dc53248d917fb8157ddb5ce338fb6256e3185fba16aad5b9c7e1027e88de86e51aed9586cbc5a9e6993b5f26c13332bea339716a228dbfc6b9db48554da98d6cba8c5592b79f763f853f56c35949bd861ed87a15a78a134c3585cb035fe35a2b79d2ffc73db89b6562ff53893cd2aa937ebaead25ddaab41e845becac9f15b7ec1b6a51aac4aa45c337b44644499cd464cd707e7473ad8cedb8570c97e4d088a2cd2ec4efdacf8cc59c2df9e76424eacb26851cc5844857f8fb1f90a90338468aaf944c943beb9d7295cc510d54615ab7714f3f8203fae3d3b751d7d589c693009d7c1634b5c43ba5b795ad3873ada60669836ad34e6e439f3a897d1fea0586e6fa2ed87bc6f6ebb5a9e6d63e896371af4e92c93471b66ac0554e31ec38d74cc6a12b4364fe46fc2fc68f359a7313ac5d744989bc33b1847afb0db449f85af73738c9f2d98e6bda993de5e4f17aa047e8b72f4e3bae7495f0b58b38c7ed85a8cfc2fe83eaea4cc38ea5ba6a876e7f33108bebeac2871f16b152d08e74e28a250999db0a6db7036711a24370401ab844cd39b124b8d42e8a15b2bdc85fe3b11c9caa30ee666f260ab0f0e230a5901229b974446428a9e24680a884208a2dfd3899ff1a4920b798ab275d5a10b01503d000c23db72ccbb3a91ab0186fa7850de3055e4531439bfa9cdce3ac888066d17469dce07f76d0397bd46a59c29a4a776c8b7310021128dd248beec9296c7c5e95d13aae21303127778b653131babc17494f0aa63c18260130315bcca7a8c8521e7b9c9544c1260bd201ef23974957a6a4d3658d96a7fd4cb7daebb11e5acec216042cac64af05c8a7db570ceb09393c7a24f5ae305280b1c22b9d68b02a0c521dd6393c20cb3eb798db457ccbd869748aa2cdc8336a58162e56528c3ac7a7bb41e2db1a35257b6135247c7802024ca258f03de2ea93e2f6c42e539617d27fc62510ea016deaf787a2b3b930165ff1fc8e20413b90ebc827581b74988937a018f612ac4098514480212781c4ea128680448b58a5a296b35020c6668acc7a39ec329f3c5eb00c44f43c9ddd612c0860031669c911e0b4d5d20f45ec1b6c5b6be399c2bde785757215be7617aa6a57eb6b797c8c5cf774274b2463d0c85e1343554ba052fd9b36da139e13e04ff18427b418282a5642429825d15636da6c45834375d543714e80530deaae0b006488eca46974642c8307aa5297d34619dc39863f276189a20b75673744fb934420a138506fb04b0eb2e22108c1923784523e767dc70ca546fb820de07bb9663333e623889279bc596b2f559f5699c272c3040602a0ea98c878d2af1d7aa697aa83f1dc10e54017e2e586b220804588473c4b9d05aaae6ff9c038d00f953547ec748e62ba3426001c3f669941596c6184b353d3919e591df898831eb11aaedbc49b88c8187cc13eb79eb09c7e07545be6041a9bd0a70519b17b5479aef79d105b83d74c08c719843a94bd1f76baf7e3bbd6795e05830184c53f42061f4b6b0321e2561b4c474865a0c825c96f9269e12742771c4c9b20b9380540772a24b43c2ab3051b88ec4760f794c17aaa55199e39eaab54c53aef32bfd339c824501972eb5ed299908ff0ab3da01460f106919b450bf00678967e45c18531d112b481918fb7023efa1617da59ff391b84b03ac199a1ab31208b918777a2c8a9706cc8359d09e4a817386ce09757c44350d10c4edf02625ed06dd3db07514639f67828c5077f0eb722f39587830c506c4bbb4bdc60a1b256bb157ed4770e603211d508165edccdb2d6cf37f039578176032c2158eb3c9d48921cb387339267bb728eccf97bf31309d08611b91271ec698d8920ca3bf334fd8765b0170608726a6220a3ecc14023f02aa4f31446b22da93597e4a46d451cada3965ef2148a832221c4d8a7d12157d9b3bc69fac8626b2dd1c44aea272cc2125dc79a4f90b56ea75144037a4f0060c33c5b6eca4572142310ce956fd6f31d23c6c9f6235057362b884a014fb5867b2c1976127a5a287ee371b7430caec5d35b63789b31d176d2553f82c8407f585c32511e3f0cba0ba60537780edc6ca22d1422ec8c3357eb203ee68c8fa135b0ac2836e027fe3161769c6838e98cd449c14ef2b07afc714cf02d91d387a27472217c9ea6bc5cd1249bba38842cf1b28701a6074ccfb7316dcf345acd84660d02381040cbe8109c5d423921b84771a1cba981c5fb08c5de08ae6cdb38fd5b9489357df11565d48a7797a6af82553225d73cebb362abb1ce335358c6776d9fbba731883ae7cc517e0a0a3bb5b970e4cda95a98aba47d9e2397abd7757218c5d7bc4ca59b70be5aa4d7b62afb54048ffb0c64919afb746120b383958b715d110e5e6ba666940328ab4510fa25e9b43537e566ef760d2cc52b07e5bc089b8ea9e166c513bacbccc332f36d6afc379e1a838ac24ea35c1260726d029651088996631c55e846adcf36c792c21011320b2287973a770d2636470c080b2893a09bcc8705306c5b364837b7cc89a9ad1fd9c1edcca9a0b4b81846c8e088b36fe361539060cc08c911c9058bbb0839183b0c59302171826dfc7b6fb1c623dba3f0f9b30768346a7714481b741bd0bb7ca32ed73a00a6a1874d8b7369f695efe75e00f03be6cac1476815ad889c69ec6bf7fb38ce9609c174b902b6047ead37da33285d1009b83c39ff67773cc46f7b4b2cee35e8e95100c31dc59eb9d604833a540d9922a7dba53d67a38de1634cddee1b169b45bb9eb3646e55fc0dd82c2f1bf2e6aebde5660fa73356982e12999d8fdafbb3cb186341d0386dead0 +ciphertext: edd9d2379c9063a3b97781b2f9bb06055ee94cb8182157eba71b983ccd18f237d8f9449c156ece2064d19ae1dc32861784c7e5829217397b27df13a61ce333f9d48677f1e4e6cab1763128d2b94aa9ac7f5785314289441fab4da9d6d021fe9fd21a53b0d18b58c8ee916232aa19e08da9f7521d4f959f85f32f3bbbbe741b021c915d5702a97028019c7dab562b9fe01bc3fa954e71bde099de02c842ca8304f0214c77741c901c0add89d96a78b1245875fe0a1523d1d03b7a6637c2fd6dc919e45d4ef10ba5e01996a43169dc5cc91293e382edffa16db90011f2aaf64c3a3533628f5739a2887c56af3dbed3486c2eabcd3c1d2c19667cceacc21b2384a2f38ef0de2969884619bd282af2cbf2091a959af8f26a15471b1637deec3885ec81995fb516e63c7908eb189bca27aa7ce70e7ee6e289c8aeb2ea4f79b9fc5bf0155c3cd09430f8bab8c70033afb42261b957ae60636204ef70d401678e14cb08767b22b8e22edc120515d9203abf4af7fd12a8f3dd908c7ecaed10e3cfadb3408401b6e96ceb58f71c69492a3956fc1d442ba092477e98696cd544f52410614622296c6aa73557878dedb5c5ac21801648cbd5be2972252774a54cd44b801e9cbe9ed13f73f3ff472d3f36751f7cfc5a81b93c0dd7bd825267ae0613a4c26b2d677712c2f78068e61ebbdcf955e44edc66910160d0981b992ed92c91a21fdf985d2934bab8e864b34fd125f85972e36802a0fc32fb2cbac4074526d8341a9098c9b0a91ec9d6371331791af6f6fc90fa5fbcaf3086377cfc141e0d972df44568adafa6bcdd9bd3792eeba068d8f07903a9fcdb2e6b29c5e56bd748aea8c06d502bfad55f28f750d0331e24c96d3760f796f12c4e6b97c5ed58b56836899c81ab3ac0f28907709e8304c95f6f67c80bbcacf1c94aef29ceb353a55005cb3fa48c9b39973dfe495cff4d483b1c1ba3976eded81e31c5325c7b6e177131d0a72315763731bb905cbeb9ab31ce7d1bcadc0e8cc9d82d5ce127901578bc742cb04075622bd5ccc85bdda27326e5f114295c2b31033b01094001634aa55b9187c5fb4a1e3be6b71f361325a54bff9fe3380488e0f09b407e3e53f2266133b8bc80bd96f7c2842430e653e7461bfcc5a21a29838103b8dc509cf01bb1984beaf43d0e5a45092413d396d9ce7f2d96762be56e45b530bdc7ee477337fc4318929097a60bb4bb88df9b4bb01b6cba86c148f841121cfdc369083fc0accc80d4e33d582427c84c34e134d06ca2023c09708d848a7c5cc6dbdf280c1eaaeab8d2806b53a28194b9a95a1e2509f8fb40333564cdddde4bc34e6d2c81ffdd07bdb5546a34af69347803c14e19558c82fed568f5d3da003618c6b570f59c1913a44c281e65295119219ae5427fd7683913402e41d60775d27089ae706bd00dc94bff715a2fbbafd9932645f90da872167c95ea89ab446828230b0be29b93e214caaac2b49ab88e420732d954ff24d0c6b0d07b60c34d9a25e5237cfc2950f01c10755631a30166e6fe742a316c3c952bb9af53782a255aa58fb817107de7bbdbf589a8aa1f1e48c7ee493117a3c76ebd891185ce21250378a39a495c3977e5a14ba6c1ab47ec71e5a8f3266046e50009e09d7544945d71a423cf320cf7e18d8759df9a027aeb38799a1590d74fdad410e39ac9e1f654d69ef624a1b9ba1639d1af179930ab071501f0df65be8a65327cd97cf028983077757f693bfc4fab29fbff36fcc9cbdfe23a84551f9da0c93c9905b31ada24dea830932525402db03ff3dbfcfa562ec028495c5fc1325a2fa5ca9251ad3853cd2d2a21051afd4b14f6677dc897dce4471adef042f067802b4f60559c0b592f18c33d6ce638dc2a56ea16479835e447a77956aec7b933060ca8ae1d5a79a9e5a8eae8631076de019ed933ede4339f6bcc01eca00845028001653f6c61dfb9a9089e4a84482ce83f1188f84498df81aa890e361a1ef0d226e6553ee3c079e796f7be70651b2eccbb38c7fbe22cad04f777e4f73d11569e3cdcef469e703070c4a195a499af2e41488f201d9d91d1162054bd9cae3949d7054056d487f8fdfeb1c6389ccdf76f26233d3635c4e1c4b7c831fff636b1b63e9d683b4e06added2541b5c40bd2d455bd50e2867840add364897c25daec0ffa4b065d78c6f9945868408a65dd78bfbd3d4710e6cbc5693b501570d +result: fail +shared_secret: + +# Private key not reduced +private_key: 18264c57aab774faeba3555c7895e1bbc7bec9dd72c953579d7b85594f5124ad57f94bc5670c85b11b81963731fd7eebf85e973b2ed5c7138d9c8ca76a559d21df5c79b64b70b9e224f8e1106f3da7097668cbeea3ae7d8c0851292f5af35d6c405fa1f68de1f849cece6d53417f4aa418ca6a96f050bdfb0e0bd202e4b2d6f34a2817643ba335628f7b3eb9ffe037dfbfe89c3f84438c4397ebe8a735a77cb8597ad73b95d27db329d491bb6f4661bdeedd634acaf45303133128feeb4a3b958056f0a7c6b1f84bbd916744d18487a5d9a54697716a965b7a9530dcc4d6ff9bf76787ac9e846cd037a0095f662a6b73e976807615bca2dddc1554ad038fb544daab0533b1aeacee7116edc18a79486c7ffafd771b8e38f93983134c5cf123955e748ce224ce925883c3565910088fac9393d423ad55ba3faeade2faa77957d88573b7f1f47fb2e3fb977df3df731e6090dbecf03bdc1ea68cd23cc593f7e5a6a53493759f17af6a5c5745798ee5abaf33ed3d5b65b846c775bf36a754c8d563e25ab9e778ed589632131b8596b36a4fea7382938e121c38d5bfb218c9dd4d7df354a3bce5b58c494ec8da06f08573b7b1e46f39ffd3bdfda0d0a8e576a45216ffc7339a6fe91839d899b995b839b9b465aaa4ff9959e3b906698b9a31531bdd4f096de5aa3e885c6ad9468e1e674fcabfacd26c4a20ea536303fe746adaf4fd37adac5351fd7c5dae7739af43a29564465f906028848679e3d634e3cb6f8aebff48885b7517033584ed5ccd55ac272b8cf24fbcdf0bcea1a9c271e747c95d7fa6bb89b2fd34540dbddda4bf13c4ddd323c861ff37d9ffb14e03cf02f9f3990bb8bbfe3fbfd355cc3cb46bbb41b3ff65a403c58e54d306c7ca5b1ecf2265562898b2ec28b5c6d396a1c668fd95b02e3451622afd731f793e19f1324450d70ea19c975d877c84a91aa4b1e381d409f66c14f8c338d9858becce8b7ba51fa3f7d4b3135954177865677c451a1f94646f41609c533d548dd5f8e31be776734d68a69f42c1263e55abc515e4b3536c6cc836a14016fe11dbb43ef9831b1efb8c34714467906b78a5ed8a8e525f58ddc6abbb1ae10b6451544b78d85cb0dd78894d9ac491a7a5f19ee4833bb9c86f8dd416e610944fd3b9f205d7be722a8f2b5ea07d75ca671ed7254c88653a79a8d79811543dbab5f05c39da506e5df5af4e7b8de2166dd6dba7e5cc07e3fd65876013a6c60efd273ce12db75e0c29834793f8066496c34bcd7647d3e12fd76f85564719a4b477b8fc93845e3dba64164b280ad35cdbd77a457f029b367decd01b8cbed87eb391857666ab88672b4bb5e4b653b8d35225708b897fefd950f8d9614f4edef1b65942d53ba146e1fbff59f1bdfc1cc357c36870b8b747fe1c66a5097ff4a6d7008cdf52a74017d798dae4e7cc3d8ba9bd381f79f081d5efda6bf1cc5a471f63f1d31f8f0867714b24ea37d983f42fe054934b320aa2b044ac971870e1bfa6d25ff7c785504d44ee3d09dd586b5c66243b01c4ff6686afc0c8b6a2faa636e39a0c65da806eac5af769e2573cea2a8da6b8adfb03b12c74b331cdf042e8c2931f39c45641ed1899376c7939d5ec09ae5e23493c9b8a6396c44bba04f22b05cea4668a2e95ec56ba56aceee411ffeb7cfe8347dbd20c33429c15b6668f48dc85f24189cf5c53b920068c856bf4fa8d9cfdf8c61bc9662ea8ed8dd896c8b99ee667cef1a4cdb3fe4df05435efecc3d974cabdb8edc28e92bfb39ccd144787bb3a615eb06c1d82f2b75eee1dc4db0e32d27c4fdd854b306bd2c67ad4dd5d407e7e60f1d54929f9ea6b0d8d0a28cfe109be1877474435dc69aa7ee7bc41944597311c87438441cb59b082a5348f4efb30d66f936585f356c06d86eecb04b48349d82f1542e3f3cd885aad7056a02d075aa825a3b99848c3efba518aa4e676f198fa871f744bff97351f6e3cf2e7505e3ee5be9a738678d301cea985b39e0eb3769f73576eeaa28ed8c0f3b76ab5acb302877bce254fcf3636b4f6c4e0089d5a3d5d608e9be4f380d679e86a34f14eabf477334c26df39119d7240ca8f7e27f0dc8abd39efb88246be2a55c72f7cedb394d370836f93a9f893b98f4209e9077879593dba5afd9650986e5197a4dd239f99e7b5f8ca36bdd81e5969c6e2f8a58829a9b7697b6b36983e896e82b40738740fa2e6b657616b0b4cc0b15c2292eb5b42550f812673194b944b830051e4206670bce9734f53232b408a6cbe7542712352c453cac39741b5b940151580482b4752d16f58a1c090b101cf985034299840a186a1061e59eaa300b66fec19a3abac920a1a12e1e4070aa37893923067614f9e53c0d859917626c6d6658a0324419d0b0d16a647ed57c3cee638400875cb0436671a0c9f472eede423125a95c86c60d2301c85660807f43f35208716905ab4153b6510c128e038920a3a13e957e2e209afb46c7e0c9e92fabbb80063b93c0a963b1aa2d49f48174f86c761d923259ee04c65f4b85dc110cb04ad4e26c369682e213ac4114824a526b2e6a21705174110b538e3562bd93cb251962e71782d89e562482a51949707ac8337b78627d489b193600636fc44c44898b2dc7c87332f3dd9c7579a68e0c01211fc1957c43d781473fd3bb17ce14456e62d93c236bd9656f5ea8088339668658ed8cc1e909a026fb76f0ec747d5a570ab88aeb44750710c0d10ac86caf73f8e2238b7e51da8722317973bd544834fa31571f48744b6a7cac95e1d3375949038588cb1d5d50476629432ca9e43076bd260b1a6a3472be2cd780177c4750b4080c09c820bf9f1ce2de695478ba26a216ba2b032cb7729770514f71700864ab0e3780cf94cb7e94c88dd673dd03b8690ac65b8e0c597fa8098111d36ea9fc4b166d9e6bd4935993dbc8f21acb9f53a20ee118a721541425a31705a5d67a6196c91a96dec2b2b48536e118afbd5c8fe46455aeb282a7a6e73b734001b6d3a997ff1d50ac7d3c97eeb4338f13f8eac05cb0b6f7f60908c0b1ed89682192a6ca384c7ded2170674c353d9aeb8696648cb83ac986dff669e23f49c47e9208df49187c1155bb1c876d1242098bb7951454e677c67042dcde2af77e8090935b5bada59c4252c6889b16765a033d98452f25632710ca5553559d76358c162c70c1b5624abc090b59960c65889351529bdae24170751a45a566ad858444ff61cfeb7003b08605f3b2558577f0e12b31a447d377294e7e4060ec12a5ecbb9770bb8707240c1237b08c744e70057d0e68e2fca1cced27a1997389bdaada271054f72b849329e9a2321aeb03a940c44239844e94181b627876838671bdb3e9b4061fedc74741b4b5e9c4b421167bf420cc8077c5bf02721076c1c5462d7624f8350af75c50eb7267a96359004166c84145e72b731d5a82d43469c98b00a0c2352b7806313c60c04dc5f5c8b39d50376a9461f2a8773fe06973e852a04025ba6592f632bcfc3ea0ae572a50023c684a4a7a0db573ad1494458990938c624e5928c028ec48a9a26492420781071d13a85a332dbd8abb8f318a31596a38c7efeec28bbc1aa38198aa66ca68d811cf5700d9e093e34f38d0cc74a989459ab0b200a8caaf6d40ab5e5cd651c05fcf68e14a1ae602560186a10aa452328218e41c49b7e5154c67099ec790e88ab641ae03dd6acb82c33a6d4034a775515c52859bfe354b2e881c7c577bd5663b19b124948739be90addb36348912710cc12102553765c580512b22ea35141ea4ffe681045497fca77ad2e35c1a5b31baec2a8279c783d28241c923040607d38463a9b615be08ab87acc5e31b84ed8376d75f31dda47c869f82ce14022acc6c70429ba854b58e942635a12209240bae3137ec8a40e716655a0a82bd02003f20428d15806594435de6c39b746298aa9a693577783c71154cb31b7b31283f46733d199ae627ddb7947c4f4aaf1172858a97ef6140f56477b80450536396399a14a984caea756b1b5c09ed1f43c4e1754f40ad0bfc8c5f153346e0113930a3c9ad215f11c4ece2875c41516b0a8452e948f3f3cc45960bdd8b23f14eac17927142eb4a72ef6c3585899efc128f53b022015b2bbb9642b5675be352b9d442194d54d5b40a17c236e8a275dc2358fb31471a3f521b444040d983e64976b50f71441982f29fc690c41a954512f82a3abf85235847a28982009e3303239454ce0c7a2c3840cce031ad37516e6a3ba59b79ba4478afdeaa8ee8ac4731ccbb34125d0a7c6504a8d7e285171a464129b714d8521c69b8d952b4623aa8967f644c8c08bdef96117198e56c12602501201e036804129d528d717640ea33c9fb4885d61fa43860dafed4282b108cac59b140df7d3285c832994e7a4ff5491c786281fdbd6f43a4c3902d4eac0d28b2809fd40008be70a6b184981101724bc3d5ec5e1956b510b82fd5ad0668a5a +ciphertext: 3804e49185cee41c6861a7a0941d454024e2310333f1103d73334739510be6a09619c5229bd73c4199399f0bc7e43ab79b06bb836cf443912d2142f98a5dd284c457740a4da361946ea3138a9be5e4c46a7f0550b7a807627ccac5e0c658a0a57f70633758f77f555fbcbafdbdf5a19f2e0efbb7e932b262998f179f7aeee18652d5d572d5d71d0af89e58a1fcd401287e046b1429f504a4759b56fc90735b91dc640c55ce2f736f1ed491cfd3fa25c17c2ef4afea940de20ebadd1ac456c5c184b660e3a2791df78e4a4716fb09a78a3ed4aff107717b8ee823f689c31c1b7bcdade58567a8941a64033738345c6e7f11378b6c3b680b94b15c12e9d291ab54ac66def4f97616bcf996a840b93c960e24e5729a92da64ceb8608afc9ecddd9190a188fe142e7796dfde0b44b83d37b4f3103dcdbe37f0db2c404517be707b0671673e2f53c59da7dcea24fdf2ceb22a711e1081ffa529df068e8e2285b17e81c45d43d672f02d49e04df68f784be77625131e702f12d907e010b1c05fe379e42048620f533c9e17e0ca8b7aaa003695d085bdfc2c74f98dfdc9d7290f03dc00d89c2d94ad8b390ac3fd88e4c255242e7420c9566fdd6693f94f86b3317d7901305e209794d0ed5f0038a5e5f988b2497a5732d05b0372fc27862b339d3dbb6cecddeb0fa5da20e80edfa5d8677301eab7ed43159a1cc62b25f10a4a2e1c3f1d08884177ea74c2110f8a496e73d732f02f4d4a0c091aea4b4715e78bf1738279006a4f8e3397743998f334db9f91005333776a6521b8931fec72e2231efee7043517070ef977cc6fab6bda27de97ce4ce13554dd35668ff0f753606f2687ba5b1a12b2b42607e0a767ff95e962144e7e67065efbac277cc1695ac1e12f1a82072f9ba15e24af37e36b345fb50cf7bed32803b63343ba5593de883aeffdd75d92cb42e15efd70b944b8330826b31b1d69453aabcc803b3f1f390548bee070b84a38eac4fb244247ae4c5a26024a8634bfbd9c7eb94fc84a65599805e9c150e215e2978064d7dc5bbc4bcec8e16adc6f55190fc11496028afec6e41881e0a0094bc17632249613b6e95cd210f7763d2ee99a56087938f721abbfd09a72abaab9cb7aac78ee1202f3406c0dff5a4f31e70760c7bf2f7cd4f27fb6f7d6e9e9eebd737f30c080c0ea8bc5bd6d7c58cace07bc82f55c65788624e7e17faf3f4d54b0e5845b8da07cd51b589409b2ee4865b908367d1887111c8817ffda5fa7ef26a5db54cbd2b51777865240284aeec8f7c40966e9589f071d875858133b1496e1e5b9ad7447156b60067fb0e61441015ab474d1539745386ef550becb1345341a8bfdc2051041aef1458da87fd8ac4016b9b8ad24f9afe3f5acd1858639068512af6fcaf9e9522b98027dad0f6ba914ad2c35b99528f6a812257cb21b6ddacec678c2bb44398104b373c984f72dac502cde60d2576d3def63438697d50bc6e912a8f6310bac01ebf890200904318b7efb9616485539c472220735873ce9885e6651a244c56b296c1badef19af9dc6ae5ba8015efa52ce5af25768dc10b32ee36b637c4048ad832316e20e5a929d0dfa8d4dec7d5e195e0b59f52a4e39c05a4fd2f23962c945f04876bfe5f0d2cb1b66b7c7ee3107c823b4c60d98521a24a7f82f39e0363e411c9a5a3c0cd3959029a5f86844e08d13997cecbb483f24060bf1ed28892a99352ec3c538877ae85339c1d05523b483f676dfb26b3e3d154ffc3d33c46d06b089c6a7fa18266afaff1552266f5bab7ba6cd9ac64a1a81ecfbf5f654428a697ef439cb6ebe8c005f7685df5a0a9f475500339ffd92e0103c78549b3d4984268288501968f0e21c815a7c3f6e6f50960f5de64ca611c584e53d7c21c0d002b699fe330456ef42840bfb8b475f56deaf67cdb656a7938d0b7484687ce5eb0261cd67607d9c822e9b3e4991c32ba9145c6d33ec1fa4746c27c4e0d38c000495a8934283ce88e7460e4e6ae32b16814703cea8b0f5d34610b401677117bb3b78659d2402590b2161791c10a7c975e2892e316d49cab8f54ca1b4cb98d2f1ad9ebb8f91e57240367e1ef5831d77769e73c3876361356243c120c224ad8462504a1ae0904a707348aea1e29d1c6eb2a9c60e1f2bc0ea4a9e0558ec177030aa14c394cb946fb23f1cb0c2c6472c13fa3405a60434956e9cf7a686fe47a08f5d8d5a +result: fail +shared_secret: + +# Private key not reduced +private_key: 6a45c4d75d7cd4abc9be8cc42a75bb672dd7f8bb7c8b4d8e51fc9b63fb8575683e3ac77aa696ff8095f982afe9d8639f0c36eca5afc20224f6b54ce9eb7c6dcb554f39a5fc0f4940fabb4c049d3c5cdf592fe4e78a68601a8c4b4fe598b3b874dce5581063351683a6737ef905be7bcb9e5ff26ec26aa8a27c3efa775db0858736c1e7d25a987c9127ee4465702007b4bdad5fef15e86106b895d6fc42f33aaf449ea0d4982c56f76069a971ed4e8c58ce53356f18a99c7e2a8b1aa7e4a64aacb42338a3ed5f377b969d8f95899ea9c335ce1faf4865fae440d99038e8f035cab7d11e508b9dfda9c5ea0029f344ab9a38a59a2c2d3b448639b89a80b3cfb3f6163562dbfa0105f7c09ef181ac466c65d13ca4e9027fc087afcafbb3e530ff47b9aef0efcbee957a336169f4c35cd260034a9163c3da3bfafa53d2595c4170953864a9da95146dc03db379f343b3ff36c03bb4851775da2a50f9b4d12107e17d184d410975ed743fdb674b179c396b33c809beaf0f7e7eba6dd0b635f6598879fb5b972b54668c6f306dcfc19608e213c7ff6e5bd433b442522fecb7b872c54656a9ffe1b30b57c18af9fbd9ede1a8943fbfa0ec7cb04b4b3d4d057c1228e6855e9da9eaf71f8e89c8b6e720aed8740482da39c8da064f5d2745ea95857036d1514afc5c23f2fc95a7ef15ad1c4353720d80ccf396f30dd7335480ac1932408bd48f7fc0ac24a10615ee7737a1e11ab0905ab82a4d4b5e37bca2ec9f9bdcb370b684048750620ed45978a3c7f79630fde5aa5cd19465cbf37c929848c335e9cec839f18e159030ed45e6d43c845b99a8878ef7a73238fa87cf0c58dcc3913ddbf92399f8d948c94bd54029d9651b25401e64a29df9a04c15bdf047a3ae857d74a5a22b383069fcf4bfdc3e0d85aa892c6e6975ea07eb61ccc4dea2ddbf625ae7c4b849fae348f8a8c326f875dae8e227465689bf64df9fa195635a690b3d6126989af58cb7ffd5cc8f53ae8472e2e9b2c8e7e1fea534bb4ec1090ffdef18f9f1bb4372d7a76dc4901f07aa413395998734391cd7bf8dca1dc6cf088be100bf80f94b86c15eb50585fd27ac9ff0af9fc849c7730eb9074e90659fb54cc595e1dc71738a67855eaeb9d4a30b0bf876435eb3d990f94d5623856abc7980b0a4c65e4dabbb6f78fa4c7b3ecbb71828dfb42f5b597acfc7e43caae9413fe858359334499a921c4fe6a044d3672b6b1a2dc6f39b8ecdba69d87ca5264fcb0898477587aaac8369f6e39ac86d9c437456290434b10fb2c303fc05d4ec208f7accf461dc159fb7caa9856438fc33fa5b4545c25c66a9af5c1f34deaabaf6402fcf5fa86506c5efff385affe9eb6ad8bb599633264c3ce786670af7d266f898a58d40639ccf344e88774c90b08b99e2ad7be3244d7bb3e91477e1fab9f1b647c7227b6caab7d1538de562e8ebd2deccefdfe8ea967bdff454fb176f6ed5d4d7285779c3866763cff23cad65a8d3b41448c0ef53e49ea21c67b89a1ec06e7c78b7bfac56f737ab0f7cb708e0ccdd89806d781767980b99f66e44fe80c97bc2336be308a7ce393a229836f775d86a77d9191878570c6919e8f5e7cfa8f3fb9b4699d79cb8e4759a8234b5c49c19623ed637859b991335672e168b7b3eb788667cb088c4da1a6431a8f4f31dfbe6d942c3e4891b13fcdd34736145fffe4df2f79de7195ee0518de7243c689074f5c893d93ca944eb1e8b20b3de05f740fb86c9684fcab3cd86c53d9fc53760e77a8500fc6830ab9fab96be00b3e96169d5336ed3113956e233728a8c8755789f0b0b5f616eb321fdc32184e5edb6e7d33758fda34c0adcd7c4c46a7c457ffb2ab6962397e1349325b9ddbfedaaa5977047549f28873e034aa770064fcd4dc069166061b5ad66277320e989712a30a8969883ef75b27dd46bd8d077dca73c3d7d71979c5583e741f9e6658aea471d4d511b7bc8378b833350be93c3015b68a8c651ba7df38853a294853d206da32e0e6722cf5a3064f3684f6fe3bffb45945a4d7ee17dac71cc04a9ddb9b86a5b4b25569a05ae9d28778e70df7ca9763db9e4b40a773b1fd53dc0466ca2086a561969d94f310e5bc14c0cf3fd3a5b4a969801ed36e47c9f07b3aaab0e81cd8cb43c1e534e267751337bfecb7ac19093bdf18070e37b3ab06ade8b14de2b34ca99763f575e8d75177c72522c6c4eced8ad20ac6bfc4aa329e765f986579c373a3a333d6167c2c7440e8f4131ec305188c989140b63b65019f2949c81c36cbc45939c026a42a1554f2385a738a229534cc6552d5e76076087c9e5b260baf8724973b9152b3941fcbe19227bb7987d74856d3636049715beec638db8e3b1d4e3ba2a440b46445369b60e0ad3c9c07c3203e2716ffa51eb5005d1a797079089f6e14d86d988d7f960f0dcc553a83f7433be60a463b04423a6977599b7c1f7730265807b3f7b2bb8a625e0b0a0f3f1171d6c4e7a9a6cb5803b4871501453ac19b576364c3bd7e01f1bf475a9e71d557171e4d33bd3d14823672f27e356c89395c1476e0fa065dd168478bb710394116de27cc3b0617ef5b74ac718e8b8c152c052a4d57828824af38807d91295a0da9b49dcbda052317f5576e52b51eca732d8d260d08832918094de65ab48d3351b1327568574dcc82e3e8a222044984649271b3b45861ab6f5250a770b59071309d118adb32322739cad7227ad2b3460d156c065713f29a05ec48bb21ac7261aa6a0f3f19d05f0aa577cc8cad6a7fbd25826a3cc6ee225c1b183d8e124055414c54469e4e410828bce94a5cd95e22c7ca3770ec5a023f0656447621006929174850c786fd6357f36188a4884cadc108485277890a0114b4c565747c4165196e3e90cfa659662d992c33bb2582970ceb60582a691d66174952841ac5a64e53b31566671054486ee20437e245e234176ebc696a55a53308abf020b40b944cbf382155ba02fb9ec298aac3c2b81278772c9e0c730ab13c6f374ba8c886300831adcf9ccdcc566e2456bef479f4ed08ef803ca8719c382dcc667a21897db1f81b41521790ee233020f3301bc9910dce2202bf4329f632542f820bcabbd2bf38962e6810bfaaa5377a83b10a62495029e99c4becba9f0b3a54f70788f97ae54f01781b8505c27c23b810ee9c7452952af9339c4ab88aedaab3b9f951cecd828daea0888a3481ab39207a6851c0285226136ee392996c41b7d93221df711d44531c8818bf3b71aa65aa0a3b5055634699b007a47210e9583928ea984c413598868bfbd021cff817c426caeb3a77c9067b04dd3cdaf2b840af6a44e5a5ec3956b21697cddcaa035c46159262524e55f9923a5c44c1c747a1e35889b20ac2ecf5883577c0722316d6a82a88b21c8334ba25a442101b6828b10b1d9280f13f867e10c88ff3cce3af457a4ba82ccc4c231ca991b79c66be0c56666c80656845789b45f0606539149cb12b0917b297fa683031413d3e89d3e38544ec40cbf288320bc3b812311ef69125e641232322e3f1ba325b668174179e38868bd50233c78b0cd8721acb23b0b065a13f36a2b8b8245095cc785c64997add4a33b45e9a602b10edb318830a046d8f700b2e76094228a14a251e8f48403914cfdcb9e3ac0795f907cc592ae18d322ebb882a1473ff2fc666b7a829189a4910c60f8b1193d59515280bc5a9169ca6433c4e560db8ac756944fd9ea1dd1a0c9f9f57a474c32b94730460046251aa7d27a9a3f2c617816386207449d8c18f04537084a3f464b737c1a49e59c9042876e0556b92139225fa3aadad3b5f18752dd614c1fc200923c0e0b4804fc5b26f7c6cdcc684da00289ce344518c7a480936e46ec4c01b36a7f2645074b26d0414fcfc46d2ada8fbdf1c50c128ec5d2abe11ac78205310ac8aea724a117f00246046c4360662101b191228628383cd9047a28025cf8d6a47dc161af353e9067ae4433803c48b3cde24466d00aaf68be2eb1a209e8b1f6264fb14873edac70f834c710acc18fa4c6d16a627b03406fc7501ef71e62963e01869c80787af2d96a4ef8c72d273a3318c2826b8bb513bb2f6739648666af720fbb4b7785c853bc1aa4cca2c9d5852706b7bdde4c06c78c960265ce1887b5e13275f42377447751ac0bc811e26c2f65bb19e058d573a64959bc0d74727a4b5ae8ba23f2179ffdfc171563712eb028d9524af43c6143277bbd537f1155b04c0006b66036161472a199764ef7283e044c62a7244593564b15436b435da9e995fc803964f631f8332fc8887e49a87c5812860cf96747ec5891a9ada1e769af720e946c9727731449cc7179f73e867c8a63b210d73ca9f8d4eb44b5da3b57dfed46bd22ab85b9bd9155568513eaa3de494e114c2700ed07ffc1c2f8ef741765e8a42579da4946ae0a201cc95fa08ed106ce84660e8a4c90bd2b22634e40769aa0090a101c5dddad45edc5 +ciphertext: 02c2554bfae2f207dda53c0c9957f1002311f18d7adc29263a5cd54ddbb844871d65fc88128c8e0d7a569d0557d352dfa0443980fd4b675e8ddfd43cc330f23f0c8ed0a344060dacb235cf748ef5652b2f91472751c950613ddc48696ad0268f1e49989ea267e4fed6e5df8701704abdaaa36d965e5e94eebdeba377091d9a6d8174e2362bbb17d4d4033ec53ca3fa57887ad7190892867e736f55c07226cda68d4dc6b518e4910d8a1eed5658a5e007c9ade97b270bdd9b9f18d8a98cb235e3a19e808cc015d3f90639e6c6a6c33e1dfc21bc09f7e7ce8d490d746f7f0d08e22bb6ea9863f8365a1c1b60ee660112b3528c6106772fdf0b2c795f637c35a3c77c63bbdd6e905c49b8ccad39b7b1339933bf9174f0f753195e67c1fdecfd1e3264d277a07c7a67da8665fc992620bb34ba73b33ac373a7a8de1ad27ad22de16433d3d43323f5690ac1144f0cf20ae1e94af27e7fe23c0f0b822b739bb473039a50138390f1d3fd99ce2e598cd13177a5877256e092f25436eb6254b82c213d0c1ef35e1a141c29ae4ee1dfe8c39f2e70121a852938167e930cf41d22fb9e22d3698b105b3e62bd4aa3bfb1087e5406349b2dc9f4101c3cc5a7104d8d4403afbe4f896b640e03a194c30c401fbb2c73a54fa8ef1c2519ddc21d8d5c0634056d749eb10c41394eae0d6d4b73c6fabc27fc2e346390e2c771276f0551d27a20f98089dd6557efa1cbf4f020797c5524590191901e52ca66cb74173a2da456bdcec454d3ffd45691dff6a70dde3437b30794776290782a265bbe3a1c07688d4fb3ba1fad312399d30c7fa9d3d43a855e0cdb0e02b1a76dc3fd8c3e53b3c814f98fe7d24493bd6e854336a77732747f809c0782a926aa275637c29c041f284170b870352aff1e0bf77c0776b33e051eb539b864c3d9800a2f082899db3b22d37607080b29486485c0e6c92c1b00df67ca5be95fce1b262b32ffff00f04b17435d7cae7be5f9af0d673e4536b383bf912d68cb1592a01cd25df2039f826ad43a137c81ed2ce0928b1315c144ea3a1fc9c12aa13bc9564be273a58427b467936773b6555e05682cffc87dc8685889853237fb0e3c5cd0c3a4537a9577fe47a8aec0421f023628c941994dcfa7e699fb7828e125ff08a58e24e3e63801837c801cdf5e2fd9ce710040753da43d02d383acc82abd9291c47ab4b870c046af3ddc9bb68697b8e89ab550b9cf0c6c98cf3d3781ce0a655c6bbd8dbdbf9db669eae8d3610d23c03fb0f364f489f02bff1d42e610fb3bf94157d1ad8fa6a7063b02e910c145e3d9582b1efd64d6f745a733afa5c8b38cec2f748768bfe9432b612c73b2e7887fb8a06aed687b3619f56fa3c750fbfc35fb5481a0c21aac19733071e1cce965fdd5198c12649c7d5c8eb3d519980717665786aab878bdbe6240f58d913ebb9993c3779b5e51c6ebd3f95532c42df3a8025ea1cd73aacf40ca79b1a6f8e280b97d9c2d9b15f96ad265c6382c4f915b705068710b02136b98d0415adcbe79228f5b7a06dc97ba2b35dc76d37fe4216d5a896472b2f60a86759e596fcbffad1910304d3ce37675a4e6b34dbd75e52465d3f71aa7a8e366fa915a4c2544060e67ccfb4c839945d5dd9548fe8d63e2381055dcbd9cbc8a2cd483716ccf3902c78130419d2971367304e0f25097b2c0bca79017f6c12b428c3f47b649c6c41f1a8e6b17ec7852debfbaebe46906a9c0d8019a3db8ab0ae6e02af82cce0acdfdaa01e66f8fccf3b0600a256aa1e7c0a70e49fe22e1ef12a00b7bfc3b37b8f8fc65a382a873d29b85756ee84d0b9dfe2a20e062422b99163dacf5f96bdb34aaa88377495abb000b5fd84c75a9976cffc3732f5f989b40c4353275212a740206e575565de708f9892144bd2323da14806b6c8d590b1bc845541848c990c56ed334de9a59cfd5e7ca775644ff9ee3969ed606f0f48565fb566f205dbb4633b62d731e0498614a5fe9ad277e49557ea1eeac5e9601b205525a09d3ccf146f856e766406f256e2cf44fbff3f911c4f34dd94cea64a143d23fc6ca01abdb42db6fa0b426ba8fdf846629d32748f8981828e64332fc6488cca38faa48c36cb212bdcd6b969df4008f55389dfcce4ce12b83d5e80b1d62912f3daa79958381c0edc39479b1f525a17271faff55e9d8c476d17b7d33556da787d1c4e47a89dfed6f265396e05ee70b +result: fail +shared_secret: + +# Private key not reduced +private_key: 1783c5f7f498d7d8c421436701176e6349c025a7df41744b369852a7cfcfabd9d96f48706b8dfd3af6fd6a2c79e078e43f45ae3d57f180c432d6ac68976339838d6c885f6ee2f837deb5f1fdc3c3a473a6d84d5c2cdcbd1da9e42d097ec5ac782cc8d909b9c47b8ae73a2fccec5fc926f4b5c904c5f44fc460356c7285ebaf37ea496ba3dee9e2e79edb8f498e79be94a02643b855aab4a6c7df2938a0ead01c56eb538f9cda688aea5cf1ccc478c059f3406acf8a7b72f5c5fcb19eca66d769fddbfd2d0ff1c3eaa73db7888cb37ebe54ed82ddb53b04e359433923aec6df67d62c3ad10bc3c190e7c19167f07d1b607ee33469334b3ee4500bda58a1785b2c247410573d6e7d3d832e49a5ab5a4f9ee516b69d76f3a80fe8b84fb8ac7f3568cfd69521036541e975e6cd9f649d5e5715319859f1face59cc2964542bdb5596d270ac7796fdc26a3b9fbb6d3c277de322ba61ac86722b7933eeedec69af92c783a56d55c0254439e936af5b9970241c73a9244a271a43d0fe87baf4def9cc6d48ff3f3b68cb4bcd8180537b16daaa329345f28ed2bff856891ac52e25bae2e95ec2ebb21b9330077d91cd8bda963588ea8ddb89fc4ea40aa6c5afc8b63568663b8c2ec9ac281ac3d58dd98f559f49966e01b9e632ff63b834a19ae5b3d7de5050a8e5684c300cd483c3fc475c3f4c8873bf5dcde609b58bf573cce0034b1a4f5edca86c598aa4da9bc4ad2cc78545917df6962ba4ca07bdbbdc4fffe40d984e16b982773a0c2aebba55a14f575150484f2cfeeccdf97846a33aa868dc22aa647c7d89a73831651c506045a05e785c1d78fa0af364b4dbefd704b1c306523d6a7394bbeabc34719a0c97f49cbe6ce9519f9bd3556cc9c72c613f5e3aaa78d7423d456f2ac4786fe8f8aec35fed7f229a7d59994f6c9d9c382ad386cfa6d1bc8d7b6da1a113442de3cd785b767933dca6d49d18ffc7fc0bf0c2f7e21f2db87cbcf818ef6854c392dcef5b31753db9c5923879777364530c4551c28a3a5d83c9642dd8572cff889889e8c835eca3ce30f8ec03cab74b3b5b198458f008eddfd6ce88e7cb7907d5c0159b8334523264ecf4cad4a2cfc2a929c3687996d25ab65fd9a93cc6590846a861c5b72ce4640b47673e5a883d54e6309e4a319ae63b5c33c37a6330f34b29cffaa639978598c3c6ac93d91ec60d0330ac6ddd41f950e51c9fdf1e561a0df3f9e88f799fba4143d018da30704fbcbc8cacecabcdb0f5d85bb687fc14c55ba8630d09fd3a2b7867e951f3bbe2f8caf417b7df766c60cddc85a11fb60e368f7c75a6102684f0be4d21a6ef233ec03955f0eb8e3eea69465a8a8582e89beb3aabb9c4ffbee8bbd5addca62f47a42f837d58c9c8bda9e6df46178862253c7bb02d81d8ddf367956a7a68554debac141c634058d53e7df645a88549b94c95e9d7ac2cd2058c66fd5b89432f331a5fc4e214ab143ea3b2a83dcbd8c74753e5660f6ffb33ee9835961919c659f734c665636196aaaf8f7bbe2c30f736384f74cec5ccc3df7ff879f6afd2adc4735d9f956db07f5f4bdc65cf605a36ee35cd6267403ce9eb8ad8376c77dc3be6b4eb4fc3cd46b275b9394dc4ee0b38964256ed443ba0163b7d764df43caeea65af7560e3956f18744a673606089fd71ec9b5d4b6e9a5c0927632b269d56da5f35ed5a04904351284d5cb164d8b0540bbddb706a431fe077d2e385e4b64beb3a8527c29f1d119c6676bb4e59937e17ddc08fd925d665a9b643e034478def83188f4caa30764394a3fb0c3b9f5dff43b0a53f9bfccc5d96ebb0478201cbc7e165fefb565ea149bed93edf5dc4df16531461af8c6f7d8a7686f622ded327a88f9a8f23c9abcc8effb5ef78766ed75ae4aa4183dc3d50783718dc49566e4e898f6ef4a8dcffab0bdf6e5683e50a7f36ebac7bb4c793dbdaae1f2e765bbfcbae6dfad2239ab9a2548eb2dc47458b3a998533df6b3900997780e53c73955d30d656314b90bd49d6d9540740fa67813a62ab3b63e6eb9a3195effcc87d6ca43d0ff78bcc65ee0cbd6c3eaf96b1e7b3cc86c79ef9c33748c0d293e244cf5898bf00f4bfd7a5b962168f2d41d805a35a3326e5c5927f709baa171d947d2cefe2c2699fb56db82199930ad9d539d69c50e38f24cb4cc9a64734c470128056a7b5d374435c099752edca129091770d6af831ac7805a7dd5657bcbbcc9d751b140283a2ec533c17ba38a392bb98421a4f0731390c30a8701c1396a4c17cece6cbce99949d0279119e8790722b0e2c748348a8a5a7c760826bbc0d395313b893a796b9d572c10432b2f5363b9682a89d1174f822bfe38b05ddc5b68ba3ad62497c3ab8ea6d13b11a6a69ddb1f1340b41f013952da1ee1e759d2d5459a01cece819e5de09b8d707c7d59519369660306c4174505a51846d5476d41d00393979293c1325a1b6673f16c32550529b21121e95f99f503cea88530e2c72b038aa641327181673e301dde28b0ba76b2b88453d1812499681cddf932370c864bc6205b6cb13684455fcc5e008bcdc16597ed661b3732a60e329df82820af51b1ba4647a7944c4dcc7a8f1bce390c44a9a7221e0c0943cb4ff6f048e2362f89f4113fd3636b97919e41acf042189e02a83b580e5d4a996fec6d6b7b33d690825f366d89f8952898152b3671685a22d8898bd62c83c32a1e3076aeeae845900ab2cfab51ea76c3022b52dc702d05b17a76609c88e69d12d7694edc3e91420737b17bb6844a1a28c0c756038a8c6c6a74906232b50d74cf532b5266d32d01034c56aa898d624727e5363e0bb300203e792b3afd39b5376998142acf52f6933a594c9a5872ab619a8a4317e86a91d419a78d47245b1780bef14abedb77ccb97d550ac223e5001e0b64a61b8fa0526331b409505a512b4b6ba7e3b4b630a112920b431292db5962b577af8d546b7465673a8641ab5807443085a9f0849b914a31393c1dab0fa30b3b1c1261bdc9a8ca69cc0f0432e91c1d42b6a8346cb6fd9cb49b189d125c8be422a690dc90ed4a87c70ca8e35caa16a35a3120b9716bae021c861267aea4244219c60fb1c788ce8264c0241156340daa3b1ae7725c6552cdadd4c244079cce22aa083a1a2c0810fc7ac55d77bb6ef934fb73a8e8f4cc299b28c42c5d26f36518ba4cd3b320ec3158b8b36108bb6d4f6427dc46653ec24927a833853b4b0af5723d8a3c5f37c17b3476d86161c57579cd020167a70c1c310325c6707fc82270f0c73d552363e2343b371fc1448b2770bfae474707305a9b32a6aa77c7fc7715cb35826bfa1696d67ec48cc0c9554691d186dd025ead64a9e39657be0292f39829ef696d3584b99c7367a00034395252f2443ef4692c163a5ff1863be79273a93192d10b661b9051d57572d5caa817338c52374ddb282d4722b1efac7339f1ce852867e4ba2a4d368ccfa58fda097fc59244fae273aa7c63f891bbbce875624800dca2b5d65b5a2d414a81c7525583c0160a006be08a68776223aa97525a1e97b241f59c0dacb50ec89b90bbd58e8f27c9f19729782b2c06bbb91725c3b6ca991e75bdc7850a0107674fabab38e28ac5b9b717ca7542ebb563d078e4c856447a0ac85c9240d77210e4ce850570ab693aca497819b5210e2cc957fa9b4542070171c56a2c1253e006cf12162e9168673a08d82b90812c8cb989394ca862aedb1ad9885598d39a42b3ac25bc914fc15eda2501d7c8c51aca0c257cb8b0c16de89900b2b12a875116cfc967553829e59510a00998440b93d8371a0b294aab2b4697196d397a9ccedbcb2f5414dc8c764189cbf720834327a9557cb44a90286277c54aa424d080822814626b753cb281b9f2fca8680c2e197bab18643c9b0aacf8445618a45814389466f67a5c557aeccabcf083cbdff5569e39cae20584ef46bb56456386f3c7ef5a5c196c51646b69154393bc7a6a6d0869e06c3f8ababbd7aa070f974e682398508a356c78c74be8108b42c6b53744c3742f16c84e5bc6750546739acbada819a2af9c5bbae2ca34f6215df82c10ac8a5873a2a8c04ced887730988c14f00a33821994503f9e3555f790715414095f05bc7d5c20dd9313acf98b10daa4053c90f3d2c0dcc676dba1cc0ec92427d4bbf61425935314494c3e65b266f16411a1250667954388fc5b750270e00a8bde873d3d58c627c6b31d8610597174366c8052f21e429c185bbc4c080122b4b25d00a982101b4b44c18bae64b7aad2a2bf646e39bb241df17d8c5b42db08ca0d6571097250072420ddea731357154e861809fcc1ceb7ad01d843ea928dcad3c1370b6b517f5473b94bd6351e282f01bf82a24c3ef05658b9e66735007b45f5b008a7bd627d8e894a4fd9228571ecb1041a11f23220b1b83a46d7ec32691ec9bdceac14e15274a8e2bc08fe818b117ba28c5dfae74d54fcdf6f20052f79be333edc8dde +ciphertext: acc839c2bc7a7d56a8472ece2cc56b8cd74eeaa4b37d366f3fb119226553304fe6673e37db7fc7a0735ab3ae10f6cc38151b7f3ece0a8dcb646c571aea0656bf0a6ec1c90023300ab33169845b8a64ffa012b890e06d691d82be4b5741e13d4920079b3d939215f3e7d73d4b9404c28c0bfa50cce06e6288ffd58c73326b77f7b6606ea5d742a32c54cbcded3f92f8c210b44242df2ab8ac2ac906860f632058e90d2ff90251efd91c9bcc9fdd0180cbf824f4487cc0fa6a812e2392eddd62d08c4ef62633b1a914f410ccd7bfb1d66240c035bc97211ce567070ea112a17b0ce6cbbc02587626b266caa1b06852661c5be631b24fc5ba4717e14be2f5ce7f5903c89fc56a46d7f31d840e3efad03c29869ec8475c9844404ff71380b4238c6da7c22cd500e6902fc962684b5d3900c23bd871ade2c7ac0cc004a3ab60d70f946ffe660f3d731a831190a03c20d66483d99cce14133f3a3e7f42a07b985579e0e77bbf338dfafcb0a850794f37f677c61df96de1fce1ff240775339eb9c97a92df37d7983bc27977dd2e54eb22729c495d345968fafabb96fc4592f89c89ee022bb477ec8d48d810e3b1fafd37526303a0430092ab6d43b253a7e0200cf45b037063ce753af83469911634aca0f890d3d9bb7671f5a6a171fd2af27d94155bb4c7e7d5e18c788864ae4c0e3057f6f6dbcffb659ca48113797b66b26e46449b197b72f7f5af1d698b654f0de61136e99bbce7462b823d86f4dd5e7bef7dba147a5a9a6dfd7aa70cee2fc7d558f0a25d5f111134f2777fad92840f2a969da17de0de10a5f74a665a7eed83382857c0f9e3ac4e686b712fea2d99eee8422508056cbf988b33e1bb1cc685a556607ee1876f53bf548ae9deda1fb4f1e0c4e724e4ad1ea9ce3da9af39d5fc7a6fbe8f76c89f7bfc22aeb08708ac6ca7bdf730b7334ed58dfd2dbb82d56d085a553ab8fcc9a3fb865fe9dd3743f33b0c008b48f3c1212ce04a2066bc1e916470bfbf0225745e695798c6dfe308f433c5c9c8eb6aebdffe47ef0b8df31f702f1a7fefd6b6ead7b69b22d55223e8a7ad096e588f941763b744ad565282ce29ec6161d5934e5dea1780c940033f0089d762eec127663d9b4fd5c5d39498f6d01c0687733426db733c9e6eb15798530db3fe5b6915b7945b80aaa0780d8800d9bc6ad02281a25a33450abde1942c0726c807ab3d46d9c91c03140444642d9fa3c2c436287d1abf1350d45154a38594b1d881be08437f27ae1763607e4f7836f562749c399a74bb7e8101875e47f3f4c6cd06b715e6e4cf3a8d7ec0215706ccf5b627c763df70aeb3516cf45976a42fa302faaf4aa0db5c1ea75dd0399449ce029f3b766f9b58a0217e97f58cd10bc4e79d228e2424d57cc423a09a5f55a4934384a0fb2b3414fbd93a4d1289096f8dd2154d919b1894ab0b38f484fc69fd9674504c829116d4cfc8e544cff6c74b44086498a0266cd9d4ad9c6b9e863e0ad7738ddb22fcbfe642b5d30760fdc3142f31e27aebf763926909a720465ecb22f1f7b9676d41f85a5cc407f6c52bd849891e16000ab5c5b3a369f71b1abcf6cd302809cf2cde77465fd823fa85c6050c9d5fc83cbe0d9de966646b679bb9af2c1d89fb4da1bcdad86e2bcd2b7430e1b33183c3192697ee2c902d3a68ba250d633ed6ca044b0c0b5e3776ce445342c1859a9159737304187e14f608b091ac6946fb817b9cc4afad0d7dac61b653620aa1f695bddc40113dc884d762e399f0df4fb6637f1dbfe3ebc32c5e37fa915a1105a01fbd341070c771dd8b3247c99d935157c5e17218aac87bfa024f3d344e9c33ddfc0a0d5d8f39ed4cd2ae97c5d40097548cd79ac398ad1200dc7762e0273dca642462e76a91f242da10c8c38cbbdcf44fa45e00eaa1fac8bcbb67fb138bb5dccab1012b881bd8148049c6aedcf4203b9191ee1b181f34f73ba8107e0fb5d3c93698dc80a70e6f3a23b4e080f0ccacf162e318149da1c1cdd3e64e8de6e5394c29c312272c0110a1c29e2b74baeb0988600bca03912131528d24595841d4fc442d9dda00570f86927dea5447efe93d60be3fa106bc50339d81bcf0df550e317acf652b286b8511d9b75ce32ec55ad5dfb5bc574ca3cdaeb83f975be3a852149528db62b127cccf15784d482f271ed0b70e78ccd779a8be7ec03fe8f734091fefa5eab7cc6154a0ecbb2d +result: fail +shared_secret: + +# Private key not reduced +private_key: 214a365e155f2468311aa7feae496d188b7d7def81b8dc49d326c29368f9653bea8e936030ccbee7989dce4d7dc74a5da47b7387674310c37da59cdb9474a7dc5a5f97763211c6f08ff9b7ad343b0c0b58b5c3b2ea6fe0a2844c6c0e3d5c46e0f82dd6e8d8d6bd6ea9017ebdddab9dd214cfc9f6501f6570305b5f03c38fcdd9516e73b76f5b6bf2b7665d7dc31d763a182e628f7349050fc8a18ca4c804fd8a95b81f1fe9fc0c66dc2f763707c44e555924fa385bbfe2d4c643e605e3357f8b47c37e68ffbc559c92b5b6f48e9cbb8f197dc05ff1e8fb938a4881c22841077cfc2ca6b5798b59926f3160148a8de9c4c7667fc4bbfd30b8917314d11015400654d79be43f61fd7b860e957a53a0acc6952097e013aca31fd4b3bc246f5f4ddd8e84340927a64563fb251945a9dad2499fb0bab4769f7cf7f4a7f06d1598259aa0f2d649d66dc083cefcb1d851d757cc39eeabd7a6c38a947b36e95579eaf9a25765f2d85d5f6de6e0d9ed25c6a7cac3cb4e5d4bf7046b7c3f646cbab6a3eb8fc1ea63017cdcdd74cf63b8c86b89d660c94110e4c6119736af99a75ffc2f98c7cb0ac653cc9dcf69978e0859c61046fb25be4c309476c53b5dd058c4075c59c2c753aa76b7e055f0f235d319e4ec6d6e839224d9908b6df6fc8e7d27f96aaad8272debe755dab3babea3d5f0b6735ea8d545949988baa98f7a2684f3b3c62e058b399af1a505d83177798d1c44ee5c94ffc5643587e8b7fa59e696e0aa08fa4efbd61a6dfcda583f0a744d8a03be0a6c9d6f756070dbba4ef85ad98eebd79eb489a3a2343fa6e766c79eab5644f4f378cad5b9bbdeb6d790ae65c2dbe3620c26783b9ae1ff59850fae82e6258b533f833b4538eab3306023b2ec0eb2ea15757189ed0d37c6d7acfcaf26d1528b6fc27dded3db72e54e482215eb469b8b0ea6fd95ce672f3e8797edcd17fc5df12bc1e7f6b91c5a344ace6efffad6999bc5345ce9b5d36467de8f5dbc56d7065a924b4f128639ee5acc2e37c02c5332e39e9c1cfdee79acf7e18bbfb84d4c6299b2335b6b410c4cf28474eb6ca8a4859f0a4a587ff6b3560ced340d41c72765fbebed2bb779ac384c53f77124faa4747e6048efe59a43f6799bdd39cdc77c4568d655da0aabc9780aa2b335fcd3da838094a867ab89e12c342953a3a0ab33bf7bf7d5ad758c248ddaffb0865cd8d1083e3213e283d979ae8e70a0ef466e8be5c7cc4429bb4d97bf733aec85eefac63306f7edd8cc651e45736d8408e6e4e4cda1474cd46fc5405f46bd229b3065a5d5094a312c27da0d2eb33628a221af81637b3909e4e8268bcbbd746df44c5e94dc5ae6db45313bd5f7c99985b3423755c17f9acbd7d831f5c3aed7f33284745f0aedcbd0f4b841fb84fbb6cd1a0d72773388a334cfbd05a45468cdaa249ab02c4395cf64c276be8dae64873c5d4e035b043c86d9ad9d0aaa3e7f983a9ce3e08f56ba545847ed27c29a1a84bc1e310e55682128ec4cb79b4abbaf3d1f3053f9c92dae5f6d3f6e2fe67f25bfdae584bdfe763db45ac37ca8a2239394cc86ba1ad976b7cb41b63d4cf6fbf3a5b845658df3783e882bbce7ba34ecee78b740ab91a4be3b716634cd55c4faf9c80da43b44ee3e770a90a9743f151958a267a8a77ffbc57aa51ec356caa8d34f836f6716840ff98dd29da6bc5d9d011fe1ad9dfc80bc3b28fcf0c84d7cb898980f0ef6b0fa34a898e2550477dd267d37495930cba3f9e43f920a42ddb34eb7c7f801fcad310daaddb473210436e62edefc05f891c9593607bfc6a440a8043ccdd9965099a200c7a4aa93944bf7ac5523fefc367aaa358eab14fa6b0ae35e19759f469ee064e47c58adc98991d09f693708c75534a13f1f5b9a0540e423aa29059103c7708eebecf626a95e2ac9e34b96953f5e9c9546e7fc566b0e3129cfae932690447a552c2bab22df49cc6590a10bd6ad0cb90edb8b7074bd7d27fb1977581dcd840f1a69cc0abfbb1d91927ba9cf88f1aaf3f95ceca3c21cd18c3590c425ec10de395899d195e761fb0c5bf9decaa0b57087997e8495c430373362b7edcf77de0c2ed8ada374e0cd8b58adab687a7d5c8e72319cde4fe868fd68a7da773dca08a71a49a4ca1b45ee4bf23b785f2e7bddd195ce7aaecb3685eb60c06a2db222a10a620d78b129042477537aef90b5f0f20a58b6005ed0234f3168ee927d726733c3221035f21dc2a95471fc5aff57381741c9ddda97273909ec4c68d4b2a22019cc2d58b0f40860cf429c20757c91269979a17e5d01aedfc21d3706369c3294617628bb97c2655656301772007414aed6a9113ca543f9b027b2aaf0f122d1747a800a49da48239eca99fd4443566348a3f8142c6ca511e769cee83d0513444e7778018211f3a683ceda1ba2881a37f92586a54806858058b37aad546d48b4a5f3e6289c237a041814c0531b27045b8716c1ab1566ae22bb1eea845340791e2899020c8ac1d6724a0b8b432222b204b0b2ac55d924b4afa5083426c716ca2de71c99687748b56342ed726694ba5e63e42911f66f8f8b3111261ec39bb3dbcb9ed5c729b401a23aa26015d31bdf8c8301f61abe695066eccdee028b11322aa437c26a785899817893cb321e0b72e7a7131410772799500a116f612838d7601f66f29567e8a0f0b7477114281df703ca76326b8aba041457004156854c1b81092ffa869eb46807e6a1108ceb06f65453800b72ebb4613e2c363b6190eae29735d48e537a717e335c9f7b456c923c42a31b8f4b4dbba96f59362743d516a01400b8f1b3ea71954f85b0ccfa751d3428fecc2663d509c8b9a211c011313b5cc8e8930b223d08c95e5eeb47127a4bc5482b0e871a758893e9b64bdf4162332b8da6d7b29152a914f5c748a404fd865dc1224e0b64cf782b7c866833dc8773b20c6eb28ac57cf5166895cee2e78d41f97b5eea14400c1d329363915094bd5650377924c15c86ec833b0ea0b3e476aa91398c108a6e99e7ab64990513e061ca52756cf29238564cf0cab366f8753aba1fd3e9ab70621a0cf161b398c413a39280a268c1d28172d6501d313ed15284d12250e6b75704d1950bdc5af1959bc3e93156346dd3b47450f758d3e9796cba90598224740b33b239b97c45c696323a05cb15ea44ca4fd98ee589a2f5aa1d1ee00a476533d5baa58027aaceec151c9c5eda23b14367b8bf7571e7c75d197a55ed3a349de636bf84ad6d446e2c3ba5657c683622b136384be3b89c7eba095a89697b4c8ed9215d1e5544f3d957e51a86efc098fbf272a6140a17530ef6e703f272792371b7c5e36a83c61c7ec18e6bfa7752c095639420968b91aee627c3ec575d74b49fe13f2a216c711508a4ab1fe84a20bfb019aae1b8b3c8750edcbc30cb47ab0b567720421359a0c8c08295ccb705222141b74b8361004d9c484061aef8c19de9f8c809b90050f3345d65531070cd36d5b2e50047b97b61cdea5c3b896dc0a22f6ac2a2585295ae0993be023a498cbabd6b37d56c2f8db63804d0ca52a169f5d003efe695b6eaa2c530773cc4347d4b9e0e46a822a980a9f4c8900070c67437576c572160ac7b297bdd074c9eec3a368297f0a34772b8292d0b7a29faaccf7bafd2dcc6999b0766d106e04a76bc9118b7875c187b1f8cbb00b3c882f3bc6bc65b294443610c65b19aa72f90c7086ec18f228c36d63808b0aa253052c1a44a6842568d82b43a994b5b6c69555a449ffd0c3959870f3b679e4643842083b20a40401c51898e138a092ba393bbaca9fc6f37f28d88560a7992c5b95c228b3388a622a6f2839da96b121dda0c75c0b36ef162bd7981ec294ba7f91a97b34c69bca54c2b7e91548fa7c396f3d783255a79b3fc579cb62eed83b430c45377857190d06e5a26576d92af1b79941f922bb234a68b21309db9aede9765c78c486da51e400cb46cb586c33c46db9ba99b983b94815fc5b52b7feabe42b4253df9cbca4037819a47f8541bd5747ccb34ca74158318664b243c81b85484bf050ed3aa81ff37725f29b962f901f5f44b4768cd9db394fc7370d0ca72e1607f83a0cd82793ec3a23d3510ae6ef3375c3265dd8268b3f31bcefa83f8e5aa3d1077cc62a8ed858e6ed4639447aa3d705a1dfc4cbe7c4b74d67183a5875d24552ae74e546ab15376ac54f0582f3a92a1e1075cfb682a16b6a46ba93f31165f32654838c9e14b46476465cfe45bec653d2c0a1cef96cf01e123f1a3116c93b1d5e54730dcc5f9d618b53a7917a71abbcc312cacb170c10e454c41869717afd8aa4a86113ceb654d582af443a0b6a74173f963d99c8d44e5520ae278370855c0e9e01df9b37d13e35124e6c2590e9a231a219c07ef6c49cec726e5bc6c6280269fb608e754d097ae818b16b386bc895af3bb9f5f2a4481c38c2cb5cfafac81b96a810ab749b61806b6d54c9f8cf4bf1be0192423288f +ciphertext: 940def77ca2ceb3a5493b53f9f11b03d8714dc86580ad78129deb2f2f402c99f49d8a37eaf9841e9f7ec3485eb2b830298487de09d7387cc32db2d89ccf1341d5a58f41288115b8a9950e3771d7ef4b722565ecf49c40838848262c72cf630dd23a29175a30d589bb271d0059f038ce32fe941da9a687b76496d4dd1b040e013d129abba459d7320a43ad9f5454d22058c137273c167e4bcca4c491d73322cae90e30bd1c5d2e672da993b7ca42137e33e80d51ce3e6f07a0e2d641dcd7bf1ee96861b9d05c99304d3cea4e06df0ecacce42121cc86566764c30c2ffc5e53fb9c3a38c346018953028b0958a41cb7d22640115bc576859c458fbfaf66a916d01384a335bd3e5470944eaa3bd3f00a4d1311a3b1e2b9db547e20298b5145a302ea0a7eb9373822eea0facaa85d58133bbe1d5ad4fcb32d60da6db4ba4d5b0744f7b85413d551406a93bfbcbdeac128f20b5b268089ba063d6fc3c4700f5a1c36dfe179e71ec20a628f453768a2bb70ac71c69b1beea25199613f6d8fdf24d1192228145313d4c6c405071fdd41c61b63b91daa197dddb02806d131365b8dd7db229a47a84d6768ba308ca5f26115c723b68c4e040aced7dc5ec5662ad73fbf958ff04aac4d749e2931a9613e869dd50169bbdbfcf03b4d594e2ec327ea1936f64ff1589b258fb7cd1aa31bff2d0561bc91a6c945f81adb345836b6a028ea7216ff18264bf67e68bdf9e586d07fb6876dab46825aea47415d3ef91a3af677ce277c4d5744c2dc686afbcc30b5eab9ab02280f6ee99c181430ef7305781e42a874d8e5591a6090a740a7c5c5a0bd3b960e0458d270a641c7583b00ceedb6dd7b3dcc16ca1605f46bf799928e5a80f7ec445ced534b02c9ebc3aaec035d3a24adc4cb6617ef8469e98352aea0929d3287ca56ac8b7925074702570920be595df7717f3addc22e842a1d72e2864e32bbbe97d8717ceee02581496e92bcf75158868de27cf0b4b6c5508a9abed542f49e01bdd849ffff94056b8612e955d2e430cae6e34e8e45c655ce37e1fa49bd3fab70ac5c84f14e31622d079088e972555ab850d8608161dab959300d64d6a9e963661a0eb615bd1cf87252c64ba41740fb9682695e4fe11e7318539ebdcc0d29d42c2ae0b764da06425f0be9d9343a43fe1afd763d93b2af27cfbc6adae24f52a87b57453778fdf8178280f4f05cd59b31833af437fafa11ef5c7d3851e0010b83379986f531090e62e36222fac7a8e94440d7bd101264c5b3400224fc700fc0fe9600d90b2d6b1552e66cf6cd14a3dea3b806b830bcda236d93a3d4164db43a96db6266b4e25df70747b421f6e8cc19c37fd3c903e4fe7c22c3bd1e56e60acf7f635a792209e06cb34f5ffa2a882e4e1a4abf4fa1805fc06a72cf23481badfce075a6774430d68d98504d75b87bd3c154e3363c7975f1363fac01a04f0f3ad92e081495cbcdd027ae81a3a8adb35d3cf13a09c04513ffd66544ea4bce399e2ad4c243148dcf41ca01b0f6fe528f598d21704d4f8ccf850d852883b81cc1914fe50cd09d4fe795cfec90652a9dea7bae10244ae0d870b75549bf90087a6aedba5f92bcecb15f770cc14018ad150461b73d3a4fcefd70e1ec8eebb428eeb78a665f4e180b312d0d7f5d88a9e5a17f6fd48cb92147b4a2bb2f9332d8af37e667776b4e82f850dc58f1173f3dd56c5ffca7ce5b5b516d77621ff3a78df6fe7a88479aa1c3b8bb0d40466528e4483d2a6a60be6cf32ece2e91bc090a36708c1b7f29f3318189bb6a05f9acf730d2d6cd20e1fe3739d9179e639ea34eb7eeb35daf32b78d94cb31da90dae7668fdf6d06b6ecdb331415272d9496d2a78b4054f9d59054a07f74cab7697b83ef03501d1bb1ab250ca9caecc8861d8f2b56090e2cf7dc32526f249034891a54b2a8f4187957c374567d741b3d2ab260663da07330621925b35d020c9ef6b354c646891ced14e0f9f4172b2eb9cfea714b7a296b4559a99a6b5393b343e59a00190cad70247d670b0c22599119a545d3140b240e486dbe7fe3532f4e0c23975fbda2bbb8824e93af3f9d2d76484bd0c1f130ebe1a61bf20be7f667fe55b8cec87ed597f8ad2402a0f0786d0cf5141a6e11c4d1eee404aa252baceb67a323a8b091a704dd774ac79be50999466d12caeb95bfaf9324cbd0610b0a4dcc630bd654e9f63a9ca6e72cbb940cd +result: fail +shared_secret: + +# Private key not reduced +private_key: c73842b1f8a1f7cb343c67dbfb8de270595100a58799df35bad4ae8ac7376607675de7cddbbe432f6bd4fb1d45af6af644fc431d6d4a2c794d58becce958707f5d8c0f08dfcd6cd01439456b75d91bb75daf5e8b9dd5a28fc8c549e4450ed9b92a6c77c584983605fcada4e43877fe06786cf26f33fbbccb192b5c07a9a2eceba3967e778b665df3bdc35a2d6cbb34b33f2e5d1f99d0c0cebf6dfc694a0f57e2a533430a79522957d1677a1a5f6a44e4bdac44358ddf83e60376b90f6a0d3899133f4b1f37ab4293e56b9e3783df6d7696827fd55a2d636afd5fe73f86b0373fd91e489d55f74db20c846b1cf7e8cec0ea97f9b97ca5fff5f970ee80aa2a5728f7befd4fdbbaf64c0e5555b1f35bfa2d3ee22478138ef2aeeb4a3d983fef6fe9dad3b4dc5e97ad079be38d3491238bc0ddd3e3fffe2ff98f0e1bf389c83c7b3da870e63ab55ad94b27adc04de527dd444acef83c1ff54bbfd74badfe67b978c1ba92ae0e4c7a15c2f678bf3d1342fe588e4d7b8b674b9b92699d8c4effe0a64c0eaea7d94ce6f59e7a97fd3e3ccfee400b3142be7f90d58a853445efd63e607cbb05036ed82dc784fe87aa897cd538fd640ce29da7882cdf8dbd4fccd4ce982e1ac0b4bae497dca5f774f17a068acb73af404a5c8daa35268484676e99d786eb1b9dff5334bd1bb4b05c65d1bf1c4a1b23a35e3341e86f3f181546fd3cd69f63554a67c0d85a479123680849a17fce890ac6e6de357f17de4b3a75326e13ccecc690eb66af0216921043c31a2c8a44688b671ad60006afddc6cd13898dda8fe4f405a24ea5990e06b55c278cc77ee5f8655d4d8381eb55a0655655966b3f2ca433d3c78fe4adaa0f6e96ce4b355425ae81434c27e47b73cb6e034d65fe2bbabee99ccb8459e1ec8bf77d303243dd403bf155765097f650691e35a60c6fa2aa74cc1490de2f525a7a65ab85357a0f6750bb5fbc645ab3c796bc798dcc09f8663c9ce92e34b9536a9ef38d54fc421f964d4d2dca8d5b9a5795bf1cbec3857954d92cf71415f8fffec366eb41d78bbdc773b58c8e420ff36ddeb3349375bf1a3933c7a865e3ee6cbffcdcd93567b0abe8c7dfc9dbef500c8be9e42c62327af79cd75cd7aca7eabd8c08b8e0881eff76ef78a38ec9c58fc149473cf5f8965acc8db1b74a216ed3a89686bfcc65d40576dab5c33a7dd69db6c390138647b53014486280debdbf68abc6979a03f47652ae3c098386c665ea89fb9ea39696a828fd390388b22d70d4e378b71ce3a4f6af1fb860b8fea42cdec83738394336d9043ff4cfeb9ee18e4e5ca4b57af39f84d53a4f9a7a3124f1c9dc7e412ce02d2d7a35dfe61d7d99e9cc39d69d8ded696abf3fa97b9af97c28b86889f30559da6a1f91f5e73ca8163e5baae7e8e4e7b3fe4aec0e7a2757653b6b92aaa73aff638cb65eff1508b9c7aac9439787f288304376daad7f94aef5694d3f94c157edfc49be5326e1ec7863fc5cff58d7e41418b286cfd9f6738e46dd9f5956b44e7ed6ed04b59174f87efbaa28a63cd80c59636896114f61c10ca8c2c8603fcafb53c531cf7a8da7e3abadb8e507487c28b9bb07477e034ec958584e6047ba1119783e6fc4cac3c4563c628a65d3236c7a997377ad53b9a4cae53645933856671aacca85d55adb8fc39e9ff80eed7101eecace49a6dd09c22f3ceda1077b9dd437d56bdd7b6978447ae9ac1d6ce195f9609cfed283c9806689b16f4dd01dc6a866594835daf84e82da0f3895a577c5eb880359a046ca7a15297b3bc3ad227972bb9dd6167da7c10bb26cd87f05736a4934d5b4267fdaaaab816fa5b10bb65ac597d8c5a5e123a0f34fae257dc1f0d8829dd73fbecb53076aa093b73e68e35a3bb649ce56f1bbdb7c95ccddcf997b84cda65cffd15a5465fd1f73b599c7085ff0786c306f57e7fb5d936ccff418bff47dfaeaef7689562fcfa9cfdcbd9c344047984e9b679863d7e8f64a168e3cec89b8b004c1d61a884c3f7badac95a15afd2bfea7a5b5ca6e47f2d25dcb4be7a37647fbeb7a99dc94654f75f7815eea43f6e9c0643d266a8b1aab98218db1b9aa52e007b1eb6b76b3147b14785652b5cd11586f6904ce3a9554f7459480ff7e88efc6addfd5d7689d918d68618d533886d0c6aa9ba285738b9372c75c9083566b23acc2e981457fab1306b04340969dd1081f074a2a33bb85b892750bd34336a68362e00302712410eb8fc8f37da6530a408b17fddb0fd602c2e40a7dc4c94ea843226ca79b167b180f3024a273c57f91cd69629c970617720497c4308e10f03a038544fff13a3afb83fb2291dbf177a003b0197037a3c9283de78dc911beacf30e6c4c6740300266c6ab69893aa9e112b67903df849a4bd59ba106030b62b61bc293fef997a8851d06c956631c266ad533791124a4e09bdb06c0ffa681cf2c6d43670e2a017b9a40c13e85bc1c24ad914003aa69439d401ba605d013a2baa0e0b010363574b71242745e9d709a3ff3b0a2ac7f374684bce9bcf0200db5a09b5d0c92cdc7bbfb3c24a79a8a4a0a9a64376a0793c1252362af170856046471b1a60eb33f23c59122d0aaeda79caef27df971ac8764986cfb2617fc3bb71355a56867c29795f46668f8166970b06c6ca91d8651ccdcbc23fc1b2f0a75c45fb3321151953315036d52322c9b6408152bbb595129f41a8b8570f02b8ccba66de5fc36d892457673a9a096c556c9afd11b06e1ca9cc8b3a9e9765e38e711d039612c4bb296061771e42efd68c9acc8ca61012f295251ccb33252e8b0e6486c5a5bc28683347571b8f0a42aec4873cd3549324ab728324030196035b29ad3043ab9008da6b924bd376cfb103fcbab9450b44c299b4e27165303786944009418cbc66fd9a570468dd85ab652d86402501d61f5272cd880056521f72a362170580675bddd505840378d96334a704282934527f70a499ae99db81516b1d1426d233dcf9855880022d72100e14858c0a226325338b33ab5ecc5a86e0ac4e8504e168c5e1a4788177878bd569d49dc60b1484f43134e2bd39efb207430aa564ab7a88cd40ecc00a10e4b6c663b61a6054323429c0722b2e4464ec0d43374234b4884bb8ddc0a28852600369635531ff943194cf91937b43afd418f8f964cf9c9cc66988407bcc7b5247a2372980035c8f8357bc3db948c0c4b391ab47636024dcb79f094c62ccb64893c0c45c1bc88cb00ba85248253606735547d424797b0bb302c5eb9631ac98060bc47341e69379bba5b5e44980970c699187f62731f2b1a4bb4c7a33f8a20758335bc8a3c4c4c0900b3c2cfe35356a58aae233b066466b34c814a4cb6b9f916581b0361e78a2971bbfc014a7476ab2f7c291ba688d5f75153c4ad7ba4c664a8002058c9eb195a3ca7ab70638bb114c3618bac3ab383dbf292705a478a35c31f06a1823b545366cb6900c59c036b063727504a55c2ac940606c7bcc74643644bde915d83c395023c8fbd069f9ec50e1fdbc8edb0387ad1074b11bfdf220edd7486082a4842d6c737c6a1ed5b98bb78cd6de1153480b3bf095b04a7cbccc19102964e34693a6e492fae134c9d726e49532236018dc517bd94232d717a408af43fd5c837a21cca33ecc2a3859eaf8a74b63c36fa70168f241e2ff52f7197a615d04357a7acca269e47848375bab1f82ac686903d44786d540a496e29642f71061ee76054b5aa6ae67cfa01704b386a657a6773b8509cc1b4e16bbb92cb204b5bc6638cc5dd868db40358dcc4c258915d1e93771a12aa7ca4b3bcd854ea2a111c09afbc60cc91f5abd63ca5ccd11ef2c1b06a38925eb9a4bb569d8c4b859ad278ceb006a3d44328636809a31c377c58957aa5408b488445bf1fc4ca378c733e410e3814c4300850fffb052df767743468c6a91d81dc3c4c34b4b5a06dfab7cb6a741c91107758859f2e1c2d06881612e05cd7444abf23c104b6a068988fb794306e90aa1ad2ccf76482f0fa7067467dc105c27ea7192d0c6fc50b4042934e81876e121c6c295a5432219345bab9ca566f0dfb6b9d4728ab7187f311ba22d55b4047b9b3a17632925ec31bb2322257dfea3d1c1b4331467904eb2bc1f7a4369aab9912531a6835358b016889ac910a7c398c18a1636976e04c7227cc9fe13d61a848eeb60d56635064ba07359730a0c269ed6cb25ca2908f524ae3c9bc860a062192421cdba741dca98f98ae0d955c78d141fedb59bee95957e035d5b05155f5792e88ce43342f410ac92eaa68cd055fe28c4a217b9c2da4ba64d4a6605565d41a00acf377eaf80881d9a5305766747cb076149866504db6b96ee4cc9d4bb977165f0b04d3c03c1f8150a265215387c7983d37463a3136a1b7c694b79d85075e5a897a948edceafc78b87b7fbb43b11f82831299a9ee660b3d40c06c5bef7b6508409daf847a64c8d30d0974fd3ba7476dc76c46b458a036d884 +ciphertext: 0512de1ce921b93fb6e5bc9b3c41ee032b2dd86806cc50d2529bb8a79fa67177246fe90c67b3303bc92b853f645968a3d196b869145c83acc953228cab2ec6171c7bea6bd89376f7f20accd881a38e498f8e01cff9e6b291d3ca3e478ea2b710a3305c812c467303d84332ede16cf30ce7ced5cd1a1b3467e727313777e04f7e6c66acc22dd3d079b2fcb0b519f5f86be0d201027e93f4b1757ff2b23ced963b2b01eeb967b71498e33b47ddf1ccca9de66c13c733f126606907bf717e08d4c6adc879f6a59db879986e5e3fc01340c3b1122ac08beaba9e4cfdc912c738ce91fe440d706eae8233260082a97710df67622e7e5da4653f52c76571f4d707469b2de6ab29f568c68b750fc55cb11a69385b1ccf86f3058f9521a1587f87dd7fe581b7419a75066c58713b3b350d01659045d3f66da70a8a48fa42fae43311028b0b61bc49e756e55cde70befefade922d01b943f9f3ce870dc6f6adb1adf53134758804f2e20919913529bfaa187b37f4115a06b0ae8ad84a28c5237c070599eec2064e4905d584cc6bd5216b193286392977eab85fbf357b565e6071b744476c9f9ac7c76d8a8f36e238d75fc69d8464537230b18d73a3a0ae41ea6c12796978d2deb5cbdc6305a6287541d4e443483577a1c1baadea774c5c87e5dd3489bd7e9ec4dbeab1ec4b3dba80c28d599d2992209f5e89b057d742a68e3586f11839579f34dc314264ba9538550aa6a8141370f4090078be5cc3d06d9b355b478d0b16ed945a51a25a6b8ede93f40412005a20fd40eef736cd1fe8e08fb564479be00e59e1ec273c82f92a8a816868b45a4a40b965cae14115668afe9c2d5848cc0e5717b05fc8431a9cd4ccb1208d35230840e32bc8cdbcb4513914714a203890bdec25c72f89af01ceb2c2f9073232c5464e7ff2dbc3687c798ba88d72fe9a1a47fd91a0f17a8fed16aeeb3a1b5d13df78c2580635f0e2af0e439fa35b1e7091ea821a77bdbc7b219172ecad5bf43db870d21ac01e0954fc4092ea8e85e1fab1c8eaf5322e6dae64b224df3b7c2b7f31f4d6101a82bf17e74b64bbee7256dacc3ece2ab95d0ae162118c5c7c6a1fa94a9015fcf76cdcb97a5af486139f23fd48ea62d4ad5c84125ff7044756016a84654b2ac4c2c0ba6915991575dda35570fb23f1a50ff61dfd88c1e9b14ccdbc48015b49f773ca2426122c323eb2dd2a972b64fc2718608a16162c6f38570d30c1d39dba3bee7367daf206594f6d2eb19dd72799c2b9351e5825d5ff453c5b650e0906bfa5a48f6a12b8d1534c60d75b40b48c1e457da5c9bb7281e503270c5ff5e247471fb14c1af2012d52ea24f48855d51daace8c4e8a615f825e8e24203613ece54deee01a0aba1d0fde8e5ce495c382382de6e95fb640483ca7405d02fff7c4d3799e9931ad3e6d64230d6c9d99afb39a049ed44ec2ddbd7c793202168ea54c60f7758c1da23f6c2a9165b6b5581fbce1ee7c41eb3830ce978b20af2eb4108edf93e27db402ad68256c1f53f4066902461fe8c9dcc92e553f679bcf19b8da57ac0d15e3e2b4f6d57dc9d5a870fe2dc252ed58171f585168c4823320daf7c25af7be123382d6d45998b53f6fe29a2fdc7e6851ffb53f63c8a2e0ab0866d7a680d65c54547d6f610207dca369db3b1ac44858ba5793c1270d8a2bd41400272dd6a19ca3fcd8917a52f65cdcede7aea00731f6786e16362e836c197a9e2b3c6228e9884ac942d66b67bcef075d85ae394a9b6b7c2c4ce43e8d940a0e888947d041fdf98c879f550705e2a7ea4c33af64c56af512ea79b94b865d4eaecf93cb6e03d454146ff5ef8ffe21bcf36db1cefa6ccbefece8d3e9cae9e03f259bcea9d65b23fd395b66c9981d6102d938913d6997772c2582b8ee09f2ff1675c116d04669224b6f867d0cab6699be7b03568c953901e75b67a1da01248c02ee2ee4d1bc7c3282c7b55f511e0242ab59b69a90300c5cfe3c80f8c382d9259a3ea1804211d02a95d166c17cf3e0319b47c4ad1425dc0a9338e6eac2eb91ad3250b6e69fd6dc5b193609c049342531aae7179f3fff718f62d6c1752b5c2e465fb6c625a299364a964e56a9ea758af79b3958a5b016442c76a9554cbbea5833c921e356d6fc6a688a55b2d37b29fe8ca97d2c1926f3e9da8ccfbfe2df9286c821b13e28f39a9ffe42f41075f93e3dfbffa4d3fab09a8ce3bd +result: fail +shared_secret: + +# Private key not reduced +private_key: 2955db559ea0266aa9fd363954b83ffb586f34256d0ccc64372f5516953bd1a8faef5ff4545abea8d68e9edf4b0f354f83978d0eedc5639acd6cdda3c37f89d20c9d55e56013aca5dbc7d45d748077f4b9bc967dc2259cc79aa29a5a7cbe66b9484ca64914feee3b440bdb3f6475a0306ea85b2b373c9e338a4da2883fe3913ab6088b319d2b509ab46cd19aa45458dd966dc0829af4b695cbb166471cedea3be4d6bcbdd4e1dfef969675bf0884adaf9f248cf9fa5d97927490b5b3b72d3db59dda7d2b6a54694aead6bcd33794cd0a4ebe1c38998b488091a860a69c5e82248b5a4e851d8553f2159782dc7c2767c09b93671fcfc90684a4d4bf7b6a88be09d5dedc55b92916561788d3461b4f312a6f4abc5ed1c97a6384356c549e081fd0245c6e39eac4267a77217f93fed95fef3cf9f3d93d2f1c6a60acd7a3b8624bbc8da6cf538c25affefb815dcd675d88ba2c86f9618a8e47b98433acb57c0b8e6499c44d4ee288c34d8566becbbce5afc9a5a3d7c4a0ff5892a7a758b77e764dac9f6eab0128cf301769dc65bd8364fee5bf87849c75d64ed2ae85d149dd839425a4b20f43656397c17bd5a969e8180ee8e79f3d63584eb6efc84baffd9f89b554579f9d5f6e6ac6e2a096a2287dd40a564649244ab8da3f066a4f0cd6906d83ca49ebae1fc49b00a5c36776c6f1aee2237dff7f2799fd4de88294e5d8cfac0b98e16dba3d0e1c62db0e365f3fbd1127d9fb8cd7d09d5e061db9da4a61d7254d9a9c92cfab50039f695488eae87bdd8876dc94e6591188c629a39e2d1748f2b44eb0a6ec7a58d768e63d066db6580fc4d89fe93b7c9a8a8d7729a3ca0c5c737e15506fe79913bd5f25767fc53b772ea5fb6caddef2b535beab49b6acdb958a42fd47b28dba99787f91994598a64586cb86c8a99ae2cd2d322d2cb1a98e9caf36bbcc387265b57819e496cca38b5c1bdb6f86c3b2e7f2d4eb3db4d97bf5baffe1bfe2f8f9b14e39495abb305b4dc0c7ea77c315a2eee5ffc31a75ff2f4bf08749ab8b7a5858860de3d4f966d8988abad00dbc0daa7f03b57bfee8d503b366aeaf38313ae55d398e2659eabf1c5b11efff8ee568d6f8867256684b15d0d02a77070b8d54cb35056dda1935577cfb46123f77943e55d089c457df8f28aaaf076ea4a60486c4f7ba720f53f753af6d75cd7b265f3365b2213878bce6c9f806c9df63fce2a5a657dd72e77f38e0c74978395552eb88a0b9b49c4fd5c41b3027e4db1a8e84c67a8d5d43d3d25987e9598de984a2f2eb69da7b843d6f77ca144c2cbcebabe34f119abeb5d6c1f688dd54cb511b2795aa1e8b469574978fcce46f5cf7e85a00c8ff59ab33185cff6b6559085ae550675f72795e6ad74b22d57b903678ec4bc07ebeda05bdc0cec9fa5f2f4661c9688e3ae41d0c73b05f8826f65a330ca36a1bf20bcc8021bcc1fce4d8fdfadb2e7d9bfd368fdf1992f4df841256647e2d77f2a39c587da11ef945823c55616cb00df3adae6478cafcdea15e71aeb86eed4fbb56c53ce37f62a5db7e9aca343c036d8a7ca15def3ab913e2c94ffe541773ace463a048d1c3c44a7aa397240fda2a6c86c4fdc7b316865c5da13b84485eba71bebf420bf351e21ba1b1169bfa4e4ce0fef35cc6d2447e450d9849ce8997e716bdb26ee19399884069bf964337dad8f91c47abe45ec9156f6ced0654e8afcd6579de3fc67b3cedaf745dc0d09ab978eaf07db5cc83adfd6f47d5f8b672385cd743e8ea0eed871ac4a7fbc7bf1224a2f7efb1cfe9df37e75f62ae7f7fc9ad14b35ac0f79e6567a0209cdbf049a6245662054decd268f511fec19eef45b25394c8fae405f7afd7b3f5bad6dc9307d1f78bf58ba5b7177958fc8664e5f4fd170dbba29b63b27d46882af8dde4742dd7b8ef476f50186ab287a9f7ce732186da243faf66fe36cd675b63695bbcc86082bed365aabfca0d8db29bd123534acc645f2918d5d8b9bdf0636935bdb955555476b760495dca5b3350d20b9269a3898fd45b162be65248830bd952b92a4c138feb67e7f4336c327a46753dea31a5c440f86c94176dbc4f7fba523e3d8294fff2fde75aa3c682a973f096e905fa995487df83265f800d94750ee9b18ea24f9492d7d7408e0fee010d87b9e8cb88d5437c59835586a5b224aaa6428374da6bbed37b0f67c3b5352a5ec2bc072247d20c7e83d83ec162a3dd00b44c070577ebb614c97b06e15d7a41ccb6a45fb2205bb57ba4dac40a12ac5f6bb522ed863daf67379d230badf71844256cfc596d28957bae0c050b9182668857951a38628b83e2082659317ffdfa0e279644fed9877d6775e131682b998adb000ace652f13fb0b9aa57b9022b792bc4bae5ab5f07372bcf131ab93523ff42e5a328fe465520bc57d62f222e0a3623ad8b034f164b1800926ca8a850277d0054f34b941e6388349a87eb853375055caa0305309a06fc2016ba8a3c9bb06bbe7581946755e6c726e9767330d639ad4ca467ff670414a65eacba93d2b33aa628f9eb2949054c82e62774cc13f013998cf29465e8b83dce66928b2c9e1f4cebbb91e2d8b2278879073411358910ef23c66c3115af8ca4ed0b595c8a49ae8eb955a86a2549132cd65a2f6a44eece7b43a40629ef172b068aab1c2126fe058ad02183dea6994abc7daa71414666c57b4c40a17781ac4784e6ab2ecbb8fb2101fa1530a00032b5d1b51b57ac1537076faa54b3b9bbfd9dcac565209cc681b73d5a3c7138156b258321c05a494345c9aa72197c9d3a9552e437e891c437ba16c00c76f0a6252c8e4cebed86398957088596ce28c5880db1b90306958c12a45b5a14e1b05c161c5a3aa78099154a557a58e6c2c7758653e3209edb90110e40e037732a7e44d7a60736437c7a3e872c82b20478083b2592ea7418b75b002f1da834df8624f665df2677e0ae98c62636f603bc1d796935a11bd18fb851e8076c7e4c58b41abc71481608281ee4c572b612c08b8cadcd6b7dc83130f161edb26b1335662a5161478eb5d5a8c61faa175f54166ea2741d27c0496292380e93f6b77577b494c463c9ce8960bcec25f43f198f0552da73819bd7131cec101fe6448f7ba3fb03637b351af9e284da6677b53b71ffde41ee41518b18c39813a82ca041f2466321ba9531ad4b576cb8825978b565580d5f000b9a56a943c2cedec578f728785487abc0a8f2d28af8aa3237022125fab084cd19565816d15f8bc6936959eea23f8279c74946a8ba37d2eec75622c4f911c24839b78cbc8812fa55e19e10ede4931f5d16bba8aa44943bf9720395a8b1328648b887b28a98423e4322a69a752d1d2121d447c2f05bc91e52635d06bb1e05daab02f02b6ba9ea8944d9344ef68c23af10144b93a40c456da0857acdcacebf1782d63a0648497c91916a50b3d0688800b968f1e2200fceb4538f7520becb0fb86368ada208c0602e1ba5d2ca85da8d36ab8782a80436d69f65622279d8145aa5ed9671a28699ac9990d738c3b67ba500a731cda82965a01b4c16144383bfbf3334d159c31831f94301d6a0320a4c7a340aab3a18825516b819a285dbb82a28f164091516c2519b9b534ab8d116cf61303dfa4091fab8669a417a9862f90491d251277d4b7b0523b7c4e345ebb090e5ee581f1933e7168567a857dfaf916f7747550409889bcbfb7e32840537ecb7c050b18552fe5aabb6794b27505f3b721c0b96b738c844f816160d3c4349c4463f12d248a6605b52bb9f8b370e958db55b9ee0663454104c47781e8e0a6eceb2a2632acf0082c4e1806c0927a25e7ba8f1a395f1a352e72ccf72093a9587299e5bc23933395836bcc97832360a992b040a7b67d4e2caa3d227f60d4c8ae293070b1878c63c8e106267a8ac7bcc850dabb5904769fc487b4f417388ce6755058470a3a7fae41b56f009b01c74af2c0a7d252b30302a7b3585864c84c8aa4ac42e82b1ab44215191284799c40d5ac80079d30625dd09562e555167391a370fb6841a98ff2b85713b75ff58b984efaa29393540fcb20e3c1cdb1887be3a30fd3861d62999f2c376704983f969197c9165f19b498bc169966269e3af2300847c908a4738c8655f476238fba9bdb05c3e4f1c3aadc7432960603c36f759c69e4ba048c76561ab4831b40341ed5c05c7b8a853169f2d75713c97a883419457193b9889724d3a108c1c3d083404d93a25a98babfe33d36fccf4f6623b9e378fc5c731b0a20df7b5c28a0c86c065017d37a65d89e8e127acb630f4304739f19bb2a596bf950c996805f73d79ec0aa09dbb0561c3a3bdb13009f672b9f2c907c468d916c305d530fe5910a3c029a722a9e1e6048ef23454bb64b1c9eb2d1c1fb4c57d68f592a778a0b3bedd71c5d4f75c2e46b6088ca12a0a5e9596d5999259f13ff4f797c007e4061f95c7d56cfc7ee5c49e849dde3fea8f25e7876df2a18515c34 +ciphertext: 9ea5dcbbe778444d92c1162b8842a4a2fc33f2e4de75c1e5dc23569c80479384067bc22205b47bba218bb0c8f54475d71141a2e66dab38320476b00695a09735ff5037008e16ebb9f5d5865a479fefd25cc29e9661569237ef9b1a0f3f857328d857c1052490b533f46b50653e95b7159cb7373ed0a06b86229d0cdabda69738c45e9ce6339c58a5206ec77b73e71f29c55dda3b396ecea3f5dbd533f8e5892608c204518174fe2abf933b4d1a734cf0f0b3e53b566e00ddc9551164577ec0b9b698a35bf949fedbab9ba066b0bccc5611cc57ddac6cec3307a51e9af5ccc4aaab97551d005a68c968c5ad29ac12681672910919f4f3708c839f68ba43ab6ed9b3fd5ab913c156daca0c79d4ce04604d49494ffe53e204bfb04810cc179d830b22b36563674fda54c8369e412160d3d5f1e5494ec76e1714f70b5d41312802dc615f06a22159e762f825052d1de9d1a43bb476c43ab6071a53dcfd1575beeb415a58902a22b9018d1fe86b664d8676b2cb145a3b86756dd1dc7c0c8cd64777064e95f3e47c54544a0e192116b54ee581444e8a809f6b4e790888560842609c2115b6851cb388eb3d441c28ad517eeccdcc7fc0f5a487bb38995143fa2f0f99d0ab708df86ce26756adbf7b75844c8e94b628ec2b117e07180b7ef46bcb04f9473903e75cfe8c34eaa3fbc44a9da3568b06ab5b8a2196b09cc53c0d47d28a118c1ae014ebefb782a4927500a57c8a4f44a9051eea6cbfb00a20f3b62d1101ee1d0a9f7a706774b9aeeecd91daaa82ce8ca7adcaa2727cfc2ae37c1d05ac515e37108678272226d1dd0a7a4a7aee2be99831ff18864cc3d438427897f22043cb5e193b27465b3627fd9d7a0976268f2c2934050701783e25b73537aae506b6dd8de3a03381b96c9af1e0cb477bb1da66683b832402c829dcf20e872ab79f5f4a658af4f7d53430b415d0cb50ed334acd4ae8693bb27a0b36b5f2769674758585d03121c3636ebe4d4a55f23e0fdf7463385fac3fbe4827a6cef0e814823dc6aa558c1e9f18ece63a62820bfb338a5929cbbcbd496c601892a9f6b4a34fa43d3ddf9fcac8e0069a733e4a9cf976427979bd829c0d394ca2b09ae53a4a3e7582e8035d22b42f0f66549ccaeaa5809afd1c18b22d5570e4bd6a872dc534b4a1c404e4f9985aad35422a27af913f8f8f39ba3535ba4339710e2869aa150fdadd00ed2ddcdb85404bf6623ae56f8279b5f86f7e3b28643c8588d7900397b567cbbd62bf9399aaaa1f608b2be7f0caa251b451b6186fe58b49d4b7e061193ee591da5bcdafe08fe03e3ff0bcd7b5327817e8d155859e77bb84ef616897e15ac38b516bc53421230cb0c256fa5aeb72455300983d2114b64d61c9b2f2f08e5c1f3af7a00f47eeaa36c9de5fe9487533fb893281607bef7b7c940216abbec21befdf21ab4e5078ce57dacb96b9b46281a483a11d05df9933a1e09385e6cea10a26fbad604cfdb56e82e6e7fe146d34d935946e19dcb87dd0dce2d2110614027e7ec6208bc2ef5d0a1f9554124abc026233d41958d683667a20829811d224f978d5a3fca48340dbf8b6bf0953d90eff929431b8c312335ab4c5a8538d6b07dd53fa214974183f2c0f8b2969f59881c5a7a90605a8ac2d47001a9177391a66cbe2f26664b5b446e03df736fd43ad9dd80d753e0c7cc9c86c0fa36fc0edd2e5515683d88d30f16c0a89fe72f855bc47c0cb676b2be16be3f93476df3128d49e8107a05b8128bf69a8d4ef13ab3805d78c2dd2d27b771daef67c3958117901d0f23f4432bf07a45cfc0ee2345363bc713c3e34980c6b0266f990e33fa25cf7a6ea84fdb6eb43761d3117d99a1e44c4996787d286ee5776381557ae949499ed5ffb3834aa30585aa8f782aee707e02aab97a4749fdf26aaab56068b35ccbcd148db9b87e07174600338942ed289afe3cbf81df1636dea87a53a15e87456cee2c8693d2f727035e52d89f4919575c7843485e147c36e9efd0831c1ceb9aa70bc6f0dbea7398e924ca07fc682dbb2b9c419e693267c37255397ae89f3c76c6ce634d7113eaad6474dccfb0bc914b4d11371f4730b228dfe89a4b0db7753239a9959a3b250ccf43be6207a12e588529019e72c0b4f432e377abc4f29449c45e987bfa765a45ca0fa39d96014dc447de4ccd3b0a6e07def8afff4cae12af7673935771be3aaba37060d +result: fail +shared_secret: + +# Private key not reduced +private_key: 39eeea53967018af5d662fc53add5bb58667842bf7c88c5f684597c79950739b4b3e15976bdb84df8f9fab2a74e888a65a336b5c05ef57c3c86e6caa9d9a4e7eaa69f9b53a729d31a1dd78f2257522ccd83184bffc57790ba35cac0333f279f5e87696c7749cc21f9bf1e4e1fbea5049fa56242fe7feacd73e59cd389c7b90cdf40f568dc815459bde32ba3f956288c3d93aa36d26f7ecfe947d7d7a7f19c9d637b4d4b7e2e9c6e4456d4ea28eecf08a91bb2ef087143b8893abc4db933fe973c65cb1c76ef519b38e7385a15974d7dd4850aaea36f9d4cc7564fe96578b733dbd785d40d7cd3ef4b5b79416d63c75b863b5e488d395c43f62a72f68c2eeed53c3e5820b5190a94c889faa24f651974d61acb4f12f55fe7566b21418a9c7d8407506dae7456f06ace05cc4eed9f638fb4e7e73f55f4d0ebb554cd85b3740a3bccd2cb76fe57bef1b4892b86fc2ad3c6eae18f531b5b50e265ce6fed4e8479087639369cd91d3ffd87b1db5d509fdadba3c1b64dbbf7945dadd4982ac5bbaa342ac68e7b3a982e98a5e9aaf49566fd5d827b5e3348b31dc34af06b84de5fbc6d771acdb3b77b4eaaaa5eb7fb5f61d56bad24932531c35820943b1bf984afbca425d6c4b3481f98e7c295e36c7185d8aa4a22f48920719b4d525ba8148e142e8b179bdd19313bea53ec7ecdc7aec54662f69ebe66b74d95d70c698e7bd0ec50e248b347c6eb3a97a70da43f51aca3efecbe23e6f93d5df4e0f424578c6d284d74e13accc57bbb93ffd87db597e6c880cd794a94597fbbedfb409d2218f44c788afaf18502e3b7fed1e351057dd39db48352a7332bf4a3fee5f986364a0f4faac36bd6b8fb78c8d3571f632a0a49e6a97ea9fce7dcca396c1d57a49ec5b46a981f6ba316f28e721c4df17266121cdbf64a9a1da1e6e301d4a0728bdfd54570eaf46c61fc102d964c3c84328399010ff6910a9f309aa78aeda610cda4cf12aabd3dc7a97bec26337c1e2fc858db6be464fede76aca80f4e7c85ed283634b3f6e3d6594b87499e7b60333a1268e6f943746377ca9c5ab429adb6f37b845cf5a8b0bc52e25cdeca953e089b9d787a739aeecb70fdabc3b85c415b1d0a3630115aa4a7ff7a5d9bbe4a67ff06cfc8bbf909005fb9ad33a06dcbcff047245ee70a9fb9fa7298b073e3b80d4b1ca0a61d163eefffce2c784d5e198d540cdaa1a13f9c01e39cfaaa8645ed04a5ae1c56ea5ab48d36fd777affcdfc8965ef29e44f008ef40065fb23986dae3569dbb5feaa79b4c867be5a536dc9379d0365b00f9ede1ab9a981ed11cfcd722cf905fad49fd3fef39a7a80bbee114e69e7bcb3822b3c61a46386c19941429e8ece7d6847dba638770fd2831dc758496056d15b8fc6f0e96c25f592b2e6749fbd2d2099309573fb9298e6d1cbda57898ca8788f0df80934b4b60f4d584c365633bc7fd19edb45a644936be33953d4675c2fcdf70ecc8fb3e65dd2df36eb6eeef7f77f6d82f861468cc2e93da11d4e9647cf8e5cdbedca6f7a0cc83ab9b9d4e3b320cebe8c4165c3c3fae62ad5aa0869778b5edf37b9c135d45c689972425fc7ba7a6536b3d9f9fac2c63c29189813f55b5919861f38cb6d30845ce353dd1ee99503785ed6b43ac6dc0b6233b64265c7a794ca19838776a65ee97935cd4a6397ff99297c15b7ae7bc9ecf0ad393972b8680ceedc2ef4ec8ffd5a439f5ad337874c3f63b8dd8e6487ed09ce4a8b7a973f6a341ffaf81fa76691c6343577e8b83399fcea356b78d1f9fccbfa54cb79a31115eeee92e61578c6a07d5746734710ee8a65f69780c16bf600737be4b48c7c977cecfa3a67693023f8f7af7f38f297f16a897cb3b76850e544b974007c64be23eb45d454a25bfeaf854d79273ed78fb3ac537e12db6f22bbdae4759dc8247c847b5aa980dc05f7abf8f084cdf97c2bcdee414aab6ae26a276145cab54e2418d8d1d3d69847ba4a288a0192fc9aae799dc44328a749042bcd6a49e30c523f35f2567a34b52868e99fe59758338d10ccb7d8df3e1220335b4a555342633e5ea60b0b599e483787d34e77a0f82012adb35de3152bdf581d939423c364a0a34908e412d07738299cc7ceefd42de642d3b861c76e338a3568a956ec7a4b5d855733626b5164c8c2fffa56897a656180d96474d83a849634866a5cb0e6e00b8cb964067060df339cb2ea05fbc6021057978ff3baf47ccca15d90147473e8bab23693b6b70872b27b4a4c0730c5374a260e7cbbe9a094ab50e6fab80c32875c2032a5eaa8f2347c313409ca19302a0437cdea621da1ca0082157ea362ef7907fdc5826f067ac4a4a1e4b997d240c7d3df9ae6db528159402d1943fad6743e6e18b345ca2c0494d9bc956888ac85c021153b65388f04c456608e41361a6d3525a1143f610c21b2a9a7f5a2e1a461552904e341ab427028e567741d9906982e4b563d980b68871eef012f2c3639a244cd300cd0030bcf4a2b1db5101c1d66ee28bc3bc276b7e9922d0253904f30bb676777a36a897d35d381292915a82f9b2b7705380277916e16a137030198032b865c823e80a58c12ab39639488d65b0c80a391102cbcb4811911c60f618323c13a0e967bac6561483026c32348502927f70cb2f780bb571f861cdd5394296436e37737a8ac6cbdc42a0f9b96941907be3abb5e7740e193d590c862130283f0711665a85fff5158c968578781a7b766cead81633b6a2560b0a740752d83253a04c7f17b90b63860c19f38b78866edbb79482d8af6cb858c8a38fcf1c423f10cbbd9131ed87116b611a75bc109ee57eeacb6b2e1201e488c785b87f384c86587844a921701205979c1ba17dbc1519dc0908c656d7734a5a354e05606acf7901f0c7590e3a324c30a905b2462da7cfe478a4697601618bc74070a9e30707219c53b48c14c01a8fc745098a27b799868166c26f51a12a9a24c9faa336f92692c141961ba4444dcba2a370a63f533f87ca2b1b9537987b7b71043d5fd090300a7d4673a38cb781f833897e94955bba19d428cb7f71710e98901b3597467795a84487bcc5a1180482fea1205a0a854481719c12b11054ad3c85175a04c27011c29c387d0e571084f625a6f73cb5986945cccaaaac7d9eaa305c31535877cadf213d5bd25801438717dbb5051532f5f135f2f79fbd093864439507446b36f349ce4748fe614463917864eb90f3f36742f026ecf32e82f1cb90017099ec78380b5aca2c7e82657557eb66c2fb633aca3d99962ef8927a3f3c9d8da538b89525310664dc2889410465e90b4d078c7dc8f030729555756c807fe228623a37a2b248ba55516caca65256bbffaa6cf6457dba32336a71221659358f955416074ad0131dc4d186bcca317d193a91d12900c477a00490cc464a119214df01882576b41ad7b6f29b34dbb3b03a5c77b2d4162d985530c908b186b7e168c2ad69830302283cca078f5816a9c79add9bbbca9b3fee02447dca3ccb82bac0ccc385538208e49742da9616a28bb3c20568838de02140eee3a7e5a94a82563a90720c62ba2f32f05ddea552f565b4e2597b17c3b8c24168d4484deff79a25b82ee1253049e619829508b01a7891a10db5c5a532f4880c169a38c7a0c99715a2a696bf66b678a0349ef02c7002a5e5ec3db2c3647b960fe9a343b540069a6c228e024719e269853535f5e841f78922dd85c3052188a2db0b2a453b5119311747386352a437d0a0e2fa474aec0bdf1090ec169cf473b9cd153c2131b2e7e001d3525957a487a38c726d710a6bf6a1f0027432c53a56a96c3a1a100ea69103fbcca441a3f43002dd47714d397f7a3a02d0137a0dc060ea0669530161c67334b8965faba455b81a6dcb37c8d2ba97c9496c3e3bc984c44a7b2611b51794ee2347cc489c07b4a89e8c5c620221b9c98c08eb5b245819a92cadeb684b82757e00039079e550a7c7a14bc856e0d347d28861921277bf18932183cb9c40cb07d67202a7838b500df71b1ebaa87202a0943d982aedf41260b38c67e25173dbc67be8b33d10724b08611857c13870bff8c0324acb67f498b599db59515ca863bb1016e87d07b747efe8c903f50b3f7468053587555163e7f5165740204b78ccf2bb11dc32ad1cea844073b7d4667fb55b93bdb4a708db296f3bbbc511119db4479737578859075c320e55b0a5185552cb9426a69b0bd11b4dff716d5cc208e3fb46c3c4456cd63ef1d598bd675d55b1adc177790da6509dea49aa958d2ce9a9e6ecb19fe96548a88f7b489433147dde00139007b6bdca9b3c6c0eff0a1832c10a257599fa50200b167829bb34ee72551bbf3a650c7a34ae6ed516d401d89486d438a0515a537077561ec79e1a3963ab873d11d816550a4c1b14b584703531dd7cf0d97269125dbef3d73e443d017f57e32d432b4f9f751bde0496c580a181ffed762aa35454a02d3f1f47ee0394c89c +ciphertext: e93751ffa496e521eb17c23e50a0f6760223fd2846317d2e479e6f78088daf421843d2da3581c95bf51904b3a1716bb0c0f47095622b02ed4d8a7ae681d50b91606b597fac2c506380b94600919c4d3bafbfcda50717f13cd2d149f6992e48390333fa9016604aee7a8680b6e20003f62d265c5db1248774abf9a37b47cb63057486cbe378767f4f43a1280b8abf9678a86ad0195f915d880b0ddb336924c3fcc135a7a34517713d5c43a1ad0775530dc1429b55dba7b95dc1ca7809b5e84e905dc12b47bd82289af59ef73ccaa232b34e68a2e1cf445f657fa9ba97dd8164e39937f19e5d3c185098683aa7a5ffa27077a2f2f898c91d0dd71f8a11c6fbec90bbb3777da4e6184b24d8aa84280d02ebc034e884d53cd00f1d7cdf5d1da8e0139d0bb23e02d82aa50c65067366478176bb3997e0ac5ee7d499aefdffbb93d5a809e68c2d36dafe9ddb1fde88b9aa682fd32bfd10994e4636005aa3444f5d69434ce963faa32092f0fb99e980b1b3e9c20d322c8dc3be47365823084740da3358ec916d9f73e4e7d14ed93b8af46636564e34302906c2056eec89a6d5b80f464fe052348715f341e4463d6be386f6a00c9f2195e8528f7874e802ef1a67eeda9f2d88ccb798afee08312f50831c7464d8eb9477d215ff6197dd0c527388ad39f285fbee3b7e7b3577e5ad8c9a3296a3336e20d0e488a136a12d216f956f431098d4851bf0d5a39a6c9816b793e02f3a0caa80b12d75a6d3b30dfa8ef2c5df0b7ceae707589b11ba925c389b91335b7108c54baf166b458493037091b9b03d4464e30938f40963c535ecbc15911506a392f8c810faffb3935d9d8ba7cfa7f9bdee26dc7c8adf4cf456455aa4a9fbc9923752d9da4373b3e4964ae8fc35d47db83884017105d83b403e265e707e08904ce12ef68be7fa4ebb2e394cea40f59d149e4c4c36517b4ca97715811d263f75f3f0fead99bb8237c1ddd87f0c97abec768b6778ad9d7766b59110031675a710e2ca58adbed88f60ab224f438d66803c824a597f4788f04d363b01993fd1d781fade7473d9642436a6903a4f90fe2c657210543ad430f380192f3fec2cde08ffcc8ddf6f06b2ec6ded6df90cecad837d216b8a2430fa202096a874a8ad599ac981851b3d2473e34cfeebaf6c80c83dce157e1d48dc55fa93486df68761a68cd4ac25598e7aa592176cb2c129afb0bd1605785f677ffec08ea09687aca6862ca2553ff6ab3b06efd9d95d9e85b9762f7d6c69765f12f88f5c53fd27eb2f01e4befa14cb806ae36f3e03279e63f9654fc6117939c821e95cd395233278f13a9383ce09098d908ea7cbf40601f69643a6570eca6fec04a20eb27c621edd89fe1cdb8e5a92ecd5a79f9195832126e3bf6a50d5fa01d9b6b421497d847507cf1f09f292becdf91857b8e5b3be40400095dc02624bdb895dc54c59294806919a370433cef927d816cb8f4bf1fd8d86e1b997176bdccf4faa3cc2015612d08003a1a20fd0af157192fa4e5242da1375ca707fac2eab67c9f9c8d7dd0cdd555e3ec7dd475655f6d5a02c5956c3168ad4c0c7b2b661ac2f02898594fe539e09c2d484bd179f4d58a3c2dbf64deadce93d6c5941a14b68caec2d6599bd323ae520c9e388dae37c28ddaa92ec49c725ada348b867014b72f9e18a3020dac6438bd35b0a5850fb9f60f2fdac1a7d4c7a1755c898969666778fb16f13621fa171efd844d89eb7c687d429e3e35eb353acc6aa2d85948527f4f704c4bc7f96ee8ee8c6110859cd798c12610ac35035ff371ef30e20622339805b8a09c8a10b45f32e1f67372bcf47c3b5c1c3f4786a01fa6dfd40a75859e60ad6e74b1bfa906c5f72c0631661943aa2d7ef701ba54546b5bdf6a057e4b4354442a8188fa6b2b4d316a59c3f7512266e145976ba4a0be6b65b6a70da0c31a14810f27ed51dd30ebd9032583e65c3f6e7efe5f6ef9b311e2984c94e88007d4e810c387135175bd7389ea96ca37b041bb0e1d6143b3f4df77e43ffa3a5e2b07c3534b774c2eee8ee2ea2b2f672a7fc40c73f8fff21b7feaeedd7ec5e34047cd6665a58eae2e42f9ee1b52429328c961449b1b712c2d8f3a637878acb02801ebbd15158c1c86ea656db183e583b297fbfb6a2f64ba68eddcb2dc61eab4cc180b0efdcee90dfab0feb0f49f833cb029f8a901cabf2ea1f7de4b8aafb630fd56001cd +result: fail +shared_secret: + +# Private key not reduced +private_key: 5cca6a37c37872ed4cfaa6fd1726d88fb9df4ade76be5d77881b53d70fdea20f7284e94a28058a0e249da3c36c5ad6af6056c4f8774af6343b1aadcf5f3a4c594489a653d5d3196e71e390538e41a735544b9ba54cf64523c39797153ae27fd087264a5bd8d4cb864c9288eac4756c4b2e6d6d14eee6369436dcabd1b3a33fcbffac37a995fff51ab9e12c28ade186e151947314134ef05679638e9ad9e47f56e7724ffb8967ebe92dbc50e0358d4ed578db4b88f76578196799341af1686c747b4763ba4dfeb4d5648cc83f7558762776ea26a8d1001e662af7e3a03b7ef1ece918493885f8e11649d2c7a8c5cd5ec639c5750c13abc126431dd85d9706c945fb5d747ff4c5456d6da493652be48eed81618ee6437a9c45e6614f76a5c76dfb66aeba5b3e318893bba3b68e3cdc368066dd23cfb33745a4acb3a8af56452c8fd1cc4fa0301c9a418483163eff60bb7d6cf7c8647cc7acf68b81959a8a6a91dfaaa41f3a679ede36d50d46d7846f170bcba2648e08185a6ab380246e58452f998988e4923e96bd649a8b735d124e35aa466804fabca31d84c28844c00dcd18d6c8dd0b48a006e239458f0809e3dd28c4b4b6b012f6cef86e740d97cc8144ec8029da0659380dad4934e3b4426c7a22255815646affde65f78e86db1fd6afcdb8428f8cd323dc5903fa5ac8d614ed7a85b599bfa444364a569496d75bbd7815c74b4729a9281c6afef55fe7737f632ef8e18a355bb89c3938e7c348aecec895da29e25af968bd1b496834da026bd51c496505a4e10e96547d1da127148ac26fbaf46f5094cf6577174586ecc30f4f34b9c6f6c593f8614bf1bd4a8fbaca56ae9c9b943a7d2d89f30f0ecaa6d6e35a0db33ee8925ceba22ee6b660ad9056e539e72bf0c58e5b448c70ba87f302b9cd6e7546e756a85c4ec40916f348c334c6ec74c23da13a146757b8b566d33d7b19e8ecec6acac9c579e5cc7e3a33c5da79d86a36b0e9b6ce2bf2cdd696e1e793f71d9da575e37e2b66674ef25143a9c8b95d8d4af1c467c1dd3cdce774a45006abea578845ed9f8ba8ff0ebb53436cd941bc7cd8df7e8336cddd8332d62c320696f3bf18944643634e8e4af239a12e3aa0dbbdf7a834e297fba5bdb4deb773dd1c2a4acfb7529963aa208dceba0eb716adf0ba1dc252bac2110a6da65732ae359ae4edd32494885c6a44874735d843cf2ac6a5e5f5a625069c0a49a66d8f70b8e5a00eaef93f0664f64594d7493f5399a3ec7afc4f4a31be6d4b04449c1c2e5dfc2f7f43778d9fe33f52e9c68755f926e46a508c8a2d7a448af4539c05b4c06efb973de7782cde157686b748cb77b36a95c459cf6de1da0c88f58a518a3fb5f7eaac68af7d89b6d884d8a9f37f9509db5cb76cc6f6236ddd19e1d9d4ef536d86f4af4e0e26d192577b8ad9eebc0860f7ac88426ec6b62b87301f9cb80be2d56ccfe8b9adbec54ffd23b02e57e284dbcf508c6a1a2ff13ff754f1ece95f97b0bd798d8ae8b44114c4dfdadf76e479d39c4a19ac674465f0ebfac92cd3d0fd6fa9464eb3460edc0f79c519c576c2037998564eb25d6e6c9ec8f606cac8f9b0d79f7ab0e885b57d4ac54cb14c6794a05d6000ec9e0685a9684b648b9dfcd8b5c8ce8f860566b2d6f6de2144f9882ab51efbccbbf33f4f8adcf57b6ccb9af7d95936a888e4e6e8dc466fc7a753c0a8ed3b3685891e77338034713b7c8da5dd97281753e558f8cea5ec60279a729376ea9eaac62dec6de3ae87c4ad3f4c75dde5e7978bcaa4e85deb15c10ff7d1720d67d26cfda778b4018c500c7368e58c550ab5825ffac4d58b87e745bf10e8e18a787a5c5694bc099b38d89ac7f890d25497a8f5f1c95d5e65a5d6e0c65678279bc3daa95b8fc807fd4219944c5e03d9315c69bc753d5059d003dffe8eb89a65c93ac11669247d59559fcb626a8b5b64c291f77f256583c0efa2372cbe80ac5705afbbf4fdbd0a55e5cd23e814c6aafd39934adbab22ec388967fb423b643bd56cdd3ba2b9cfde98bc8afcc33d78c9bb8e466047a6eb03e3ef94b783ef8da75075d4ed3a723094c461dd7adbc7b4ce258f917fc687e6346c95dedefa4d370dcd616c6e8138ce6c3854a955f393b9f66d2e41b1e6fd421eadf9833e2f2ba9bf4f89db53e7cbce69cbf017d8e336efbb596130b73268680be4885255aa6353a39f04740be2c3910a9ba91700687088aeca7fd4a37feca45bf29a27824babb327c49f18539ed20c1755983e6b1e03f98f8610227362c9e12246d2176ddaf48dac31955e59a7d69a8dfa582f8c66b14db7259e6c4c63bb88c995a71fc44bf964b1650746ff672fc2716528741dd8174aa2326e21f025367a0f243ac63728bc6ab95dc22a9632e18cff13cc6e38a1f4a0a542259d41db0c1dc640e8735dfbaca58c3c7f18e39c74641d477099ff1ac96c924e366b16ae423de8bc9610c855eb686e8d9301f2c08e96e3a2776523ffb93cfa3726c1d03d0c2c634f1cbae6dbb4cb987be8eb464190056cdc29a7651c79773b1686269c1646a65786f667986e7a552278713fe5c5a4f9c23633c467b8b63b408c4229cea5f5a0664852729a7474695137c0961783656df45277092226e232d5eb929c8bb57781cded3b7d5266bf5c2ccfa992bb9d8b59746319e6b5803d00a84e2a99989c08bc9726783389fd506074606a0945c7e3e22500d58fe3a647213b19beb6174c72833dec8ecd036499e53b0a18a1d6e471712a1d64a903b1f3634ceaace56a906a1336c9d9708768a6bcb9cfc036ac22607810457e8560561a38c5cd84c6ca021a98c15aadc47e874778a81423d669ab411a72aa4a661deb2b8f4a06600baac967617bfc5dc8d12d44d9a7f80b46d9a40b91a66e3cfa0bfb5523c04922db21c4120717b436c6dc81030d13b867e707b9a3891791c756800adb41cc9a29260d98202472b733611037a98b454b6b5af423df236dc079941b160ff1c0b8ed1b14e787898da354cf79ca4fe506d5742b58141dcf624964397274737e4ed1aacb76a92bba8966ab24741163893587c94cbd4581bd0a110937946051c572f2232a149667794812039ba9e6525a298531e7479a161123da95b83ee746dcfa1d880130af080fd71480a4d51a48c48abcb62d4c7b44b712bc0ecc4eb53a929a1167f3c49be7b019002679123348af5b7ab18a36f86a23b309154c5307b003966c8755047718b32649945c7865f123ee60198af51dd591934ee02ef7ec218569129d03b76e9729dacc17e4407eeaa4820e238deb307d819528b932bbdd74ac25c0476c037cd8200ee9231533676f3e1b11a6fa2511a3160f10b26f2cba2966572450516be1a39ed8bf651b961e58be810bbe83957037f1671c128f91f302dfe1103d624b97b4c331db624fb354178047ad4b909ba93211908e35014d896144356c250df2248c5487ea11b329214b4c3b2342e64244d684ba914e020228e0d9b5b0283b5c96a22b510f31974843b21df48878652721bfea1b38054ba1b39ebd0a03746ab5d07ba3d80b5be050af1282bf1ef87629ea0e2f9a272bac24b7d3b464c182a8032dc2acc0b7ba3482c5cd7c0b5199522634f61d553534020671baca3534193b2a9585f47394aca1c8aff24c05a7a8b0f59745e56e12321fa1a7b38db38de3485f017626eea474e3e3c1a6bb5242f26de2529e517928e547423b79cec6452f14c17ac403c0a6e23d25d334ad07aabd8c60310082bb4a194d656b2e2b64ff3475fcc9226a526867ca7dd03c75351ab921eb35e445b144f4a7e743acca85372a03c4cad754f1d788a1c919efc198aef95baf7768dbc94f36d5a37db440ee403b9b8a339bcc50c0469f51681fcbb294a042147f895d9121701071a6ae8b85b3ca4a7f197f06cc5ed4e40c5bd1ba18f76a8010857bb0c3f8c15ef8f89fcf22afd560445c8576b8a46297f1cbf5896232040727eb40b78c97099a09eae192803bcdb153b7c9918b8c66a3e8ccb0a928b2505b3034886b452bc9f7719246d62ad183a292a75f4d6715a42153b8f8656b2c397428803725bd66239587506e9ad5694ee0592918a14346cdb0a9117b7969345bb11be07b82dc4361b580fabc4a91d919fc97251ad1a69938b507e066cfa6a251d98927f2bf2a9806163c07d1a96627265776105126e5ca5872c61e4bba95220ed45124e76b334df40fe0cc4f193baf6ce69581313616c0a9de56824f007d65692d0f675aafe086b6e2621bfba18ce1adc4337553c81b92ca4a9a2c9712416a168a7a9fd06450589641e952a96b122b4c4bb63721d6e76201f96e7403a908819bb61864f9225185678741da30f96e7973a83811b94c50bae593d1da6d3b306bf50669e590eee255b703fe0b2aebdd29f6ceb606f15213da5f478ed4605a212f52358e2046d5b05aeda108ea4d6c6bc0fb958286850422bc357ca67b83c986048e0d0087fa11ec +ciphertext: 3e9c6cfffce759668c9ba24ab80658675c29e84e998e85c476cd6854af0964756021a73b731c075391093a652e118d97f33128fe1fc8af0184a7db5a9c9ce619133154b530b34a32e1bae01226994aabfd137ec3ce15f3f83b80c78dced99d36b689e94c39e740b30c3b60f9df1980d0ceba60a721c171030034c8b686b8ffb86e14cab112da3b734d6e7f402540377546d9f46c90b52693986293ba3e96e570ec9bccac78fd3399c1a7ec2bf01492da9a54df0d106b311014af8ebff9607ad85341f31f8f389f0f780a24a84bedd3e62e5ad282c5520a7a58508f32241817ed1d673c344fa35e2949b50e5812cf2029921d4e673703d056b5a99650feee6d77ce424003fed4b0583a0b9e7331613d566399c244b2d497885cc4cf7f067cfeadcdb1702ba29d1407ac4986a0e29db84866f003f1d3f56c01a42837167ceccda9b6afc39b8ea1859d587a092202003fb06da60bc4928ba839544954c1c9bcae5b93dc808d7f312ce500ca22c7272dfc7a75182c020b5004dbe76283bf5561bb5c0bec93de1675f2e299d977433cf601b46fb52c4f7629b2a85a687a465c16bbea40c06b36bafbe2bc16bb7bddd9be6b4b710fdd63bad9bd37637f46b3d4503655cd517327ec5e32af5faa3cdbc0a83ee5fde307547b80a5da0a047945542b768add53f4d159004dc826b7469d944e802461d2a9f04857ea16b29121fdbb84ea84b1cbbb5c3accbdf7b756be7e01d25530a315848d7c5fce23e96054a5c253d4ed5a3c218825b707f97e9ce17a6e5d6c7771085eec55068f2c19591aa2324d0ba0b2cefb03fbd8d26c7e9a37cb9aa7ad69b782405606f32b80c47e54a563a960d2e75352d7b4eb4946b5e744621d62e80602902380aca323b31e52c013af38e3ecd9bd47fc632c2dbedf7948aab5a10bf492362a94eb8bcd4997899e7e6a888befb98d618327dcab4c69b25a7cba0c8cd1b9b675bbf0c051bf1b8bc1e88785b10fcc67b6bf0f690df552c2720c78767b79b02355a19c56751a007c36480e3cb90b9d91277feeb13b437b35b4ab6325113317d0129d85a386533dc8d53dd3bcd38d93cc6815abb1f30c1a3d38544e8ce0d08db592c5688598ee73eb89402b2966d736e728b75e6ff5702454b31f5c4b68c60cfb64bcec551b92d922b9a418c12b021e847021dcde19401ea9e277b136f9ebc4e066935c45280f546c806ee6a2e5d38a43f64bd467ff41aea502ca82a5cca6d26a9c688e23c0543632513279be831a342b9c00b2518657059e0992beb4267aa2a441bf252b01a92e65269288cadf6bec7f17927f01cb88d8b785baeb4678c16e20aab4de33a458356ed74471507c15dd95c97377a08485f8ad20eaa450c65e6620c40cb569f429dbbccf46d5ada1ea1ff01dd0a4cf1aa1c9b94490c0a216e1e6df250620fbf705b706856bb03a645709d82cf3fcf6f840f98b3fb4b8161c06b8a1ee5ff8360423bfa725641fa779d3f24f40c8b348f68563dbae52e3ccada99cce8ad681213c046582875ac027e6ddc210636fdd68d3f6b250ad9f9c789b76329c01859917f8b0f10b5ce451c821f9ac8c060fac028077aca46fdab43ca273d98a004acb81976ff47a50afd625d5122c7cfca554048183ddf5e34342796b17b9848071359e5722a5e4bec026733a57b1fe3ca8f5af95f3b7674d38110bee4d2c0ae39418c2b6484ac676cffce8781904cf3202d9e1767599fe870d1856bd52ba4bb1d34bf623cddcc67b9f967289b02b09ac41b55cf3a66b1e5c4a972bbea1494a4377cb0aa1b51596c5fd0f874bf8b2acbb5a0c0dd6c7c41b8ca66def9b190db9afb1fc24eb91208ecd17b8cc6e4f563c7f7d81c6188384f09ad34f8c3a6e1f1a592390780df959e0b7ab7cb255bc8ee1df237b361c88001fd1606bccc88942cf7810201bc62a9963f8bb8d2ce4592e0159950451a4d5aacfc1aca2cce03c54bb1fab96cf1f79ce3195181daaef8c527d504f5ed6bb29efdecea74202c3a7b9bb8582abe579720226df3c953a8d4d19e680aebe1536efab43379f36c215527dca12c395f71a0efcd74c6f2be3979b45234e3e16abae1a1f559470ebd9217050e6d635dfdfc410962e611917832575e1700ae85e6c79db04ffde6e7bfdbec672e5620f70d4ad86bd0b12c65de71b4dea5dc97d00e0c51d3c7707360106da1f7949fb7d706a97594224c473b77c699a +result: fail +shared_secret: + +# Private key not reduced +private_key: ae7abea38c394ed6eb08f8b73b4fafe3acd510a45e50a3c3565941c54332e613c5687c6b7f1ac590c7a2472597e43ea2404ef2e1befa8688a9da75eaec23e981aa6c623aabff1b682ebf525543afdb53b461853aabcb955445e78d9939c3ef62554978b998aacc07728f29a6ee7c54f34738db084c81b6cee59e4b0706ae0ded56eed5c9795ea0c96ea9204f938678ba9383b4a8ecd5157fcd39dfc85de9747e9dce0e46bb059688cd2cc9083ee87f56bbb695c43d6e651bac876367fd78b4d14eb4e06aa9e6ff378cab25e8801455693e75aa75af0619a6eef774f25568dd35cbe41fb80ebf9ab007ba079e82a0369d8025ca8fca341dfb99cdbd44b1ecaa19979958ffd01b0ef7e01e59f13648bfcfa71ac53a8cdc957b83ec09d84249ec7a53b3507327b1fe36bb79a7668dacc9f898698cff96bb078d6136d3347ed9dc29664635b9fce33005d7d4eb45e2df2c4ab3e633881f6146a56c01ad49555e6e386b554eccc45a848c8ab79513e9a7e2ed692315714b39f091bf81678b70af0847d43eeb97f89cae5daeeff5660bb6f03037f4eb34d3d5cda8de0e5e747fd77e0944da2b5afbffba08687c25e491192659e483631446d0ca16441a678c7fc4da77cd8761ded22486d6f6eef8dc1ae3a8a86f7597f5d52d5f1a2393a7479af603a2f173c842bf7b5109d933363b87e8e34b9d4dcbca542f76caeedbb57f7352302f7f72056390939c11df8b52b8f4ee7fed861c808076d4730deb3d79fb190fa7bceb5cacdefdbdd649724ff7bf9a53f90e420c14f1cb48c3214755917ab0777d9232af7dca46a2a603649caeaed077960e5ba1d44bb3f2bcfc0536b8dee5be0b7c68295e553eadf939a775d564b38aeadfabe4f9e105aba00433527b3ea6f847ee8ce66769df96fb7c502d83c2d540582bc79dfc3e8829d5b9ce6b5ccdc5c5c468819ffcea44dc960d6d80b475d0485c1539880e5f98ff2de8fa4df723d5b3e655e5851364e8269a6bd8f4c66fa29d9de806289d82389945a4974d16865889bc05e4ff57ca85a6499ff0e5534b9cb8041cc0d503dfa83ad4746b51d834f319d980d284e02b997b70688f640e4f2b473f14b344d9dcbb08d4d0355a53b923b7a5539b2d4eca08b3e556d3fc683d3449bd88a9ac95005c74385baea7bff7cd535be3b58e97aca21ce97f89e6c635de75274b737c74a8feecb38bb587778bf7ca47fee6c44592bcff556e8e77eaa6f11342df7dad66ead80ff75d557b5e052bc4e6e9614f1bf3c2b9a13e64d637444585b8ea5f9db2c1178881ca41a5863c4504f6653dde7f9b82222430e8be85ffaea5338afbeb4bcd059cad0c2e41feee3060ac4c2bb4b87ccbaddbacb43ea9bcd15a32e02ab9446c7086f64653f45fcb9e90b0037fb5eca9acb9c28b757f177a9ef74bb4ab8cc527dfb4074b99ef4b6b3fc85cbb34383409fa497ad43a037e7e4ceeb723f3f5cb62a57b3b7cf64d63acfcae9f623adae95a43b684058f3437e3eb76ed78a59ba2b57fdd7a64d2643add5738dfa57e576ae1bcb956d628c85d16d51109740b7d6fb659f03eb7daeeb4cc08eecbdecf645e36e3b6f9dd5b1fb0b9b8ecba4e52b106cb4d25830af5b76de6ed98bbb9a6d5cac0de3fe0be39aa0f86379c5aa87faf1d1d812db5fb582437b654366505f3aa7ab8ecf57e5854f9cb74abff84b9281b8fe0fa540f64f59a5f9506edbdd117a3550bb1fedff5a35da8781ba42d45a481e74de5598f4153650a4c85a005901a149c47fca69f1b8ed039884c74b3968fcbea46b3116e627368bbcd0c4de55a593077d274b6bb33a737c9b376144b81c16b9b2339ff2d15cc8a3aada3cb7475c3425f8334fbd474a71a83ed957954fac29db49983c8a82b04f0dc0e88152c5d20c6a9ad9bbb8f88693636ae00c4a61fbfbe93f95a9654ea9d7bce5b39ea56e9f640c4a22c1f51ebe36379954fa4a6d5216756b8dd7944ae76707af0f01362b975d1dee8e0ccd7d9f54aa87459e1812cfce4e6490d6bb5bffac3f077f78755bc8d57f68a8fdad0f98801c6f55bb399ec48f72bd5daeda5d291d47ed97cc0cace542944afb7d3e3565c414e1893463faea253dc2c4aa9603eae44c4fe713387ba046aef6fa3dd54e6d004d81ae6541efc7f827d995e376c41b57b729fc712a9be8945cc28753a4f3771a68a9000944d726479e1a79d88675fa13795fc086d79f82ea5dc7e2da5ac939a42728963bfc3659d50345694373b877b0504a864247addc746e98126cdc71d0e3b0c7f457c046ac8b8c1458ee70c82905ff5183d890845b21c66953c6402cba2e329886ad51a92f7c673995fe255bf9462b2edcc899125b1820125590024b6928fa0c79476ccc407312664b83c9c59a806989c3252683b139799561708732f57804a96c0b58c88cb4a83a1271a05a9a58a4c187b45cc893b9621e8c5543a02221efa2617b0a42bca1880959e70496cd1452d36191dea226b49f76418b1a44079c2d6392c37a319ca007b65f57743598f2c40a68dcbb603f11cd32c368a0688343a25f6a348c0b260b1946abbf15b3c9ba0ad1cb302b918e4285870c9444118598ad60dd6030c45f33239abc79a04a05a2cb8e62128a3a9ccb61248f1021c7ba5751dc60d50919862332bdd0bc371e4037063879fb5bb22290328c9194aa83716316b7747a5130a984a249e2e124ea0eb67396a3197fb80bd672c6e6cab6de2cca2e3ad70d5866fc878dab1cd654729ecf9ceb733a1b81890cf51c2ac112a52b6a4122c27b86cca81089afa1361c4015abe68c62d9a11bb10358459882f58461761a7ecd3b9b3b17e32a682a389c4328bbc4aab01f44ca93f150e72678160243130555ac9e964c784c33943b5ecd07aa8097be421b796305f05e196ae166559ca5c59a445bc98092be1182f8000d5c39b7c074e016433235aca94d7162b853e45367d42e1604b10702cea82d9004259d130ad5117ca24c6ed411d5929c3f7a6bb35cbcb2ca6bf08c06d1a1cb63aa54d4164a838173b82b45523e00559994e8ff5a9cab63c6fc3266998ca8bd5820e7b16f8f86ce149c355e49451c89624b4b1f2fa7f09c5a15bbbaeb6a641d561830ba25ea470c9d7c397499c9747994bb8818bef9c1ef7802fd6963dbafb6e6dc5a3ce1509510578b96983d08c53c9384e45e6a5bea7c943d11c5c46cef5d0566c4c1f99d00079b0641636bc31913034a134e7a4b0cb959ea4662be55157fe89a7eae1a976f30517ba7e019820984115e5ec2e7d00267240695f600b2eb4181adcad96c7605d5c750154a41124c6f23696845b9b5539ae30b1564bdb2b41c09feb96b31b0796fed8503028af11b02e68f342e3210845525a52268a1b0b4f7648600b455c5c824c49e2972371808bf572017331cc8bc0e11147bc10793e096144a4187b196abde288b134bc54c5b3b85312e7a9bb90135dca9bc7396615ac979de9800c26057ae3064090174437209ede210cb2c733302c4ae9c1ac1462024d54006835ac3f23611d1bcfc945a58401c6a6da42242983f4e712a5080bdd13633b1c98f32835f179a3d011aaa46b9b2fb810dee9495cb4451fe0ba20f71992a445e0c16486d06382c8cc4051647739762257a00d80956475b4521493df79a28319c2c1338c9cb3791980785c2a1ec4a11844b608a7c7c92b81015534a03904cd5a4777fd587ad8004b61ec40bc9aa7a4268ef445900522759cc5057baa2a5729bcfb3a0666126a90d56b7527c32800960d9586e93579eed18189f0a762518125a4317649a3c1883c6ed8b047b5444667b4d53ab5d5b952b10ca1b8aa4ca5e438ee3c2e79c2132bcc257d8585abb609ff870d25826a67075fc38c32cd1c6d78e56a4f18cb59c756979331f1786820ba297f4c26ce251c93686506b26805286cf5919ab660092e6c1825d746c8c9478b408aca024376233ab8c287d709d02f7b8c6d80b4430917fe546ba774482b9b77c20bccad85355f562152a1593cf2bbb02014df47b29d1ca5c1d300445cb4835b45bd59b92caa1cadfab9986869f5a7875967981f1267e615180bf7952a27ab3527a60b130d69e155ff88410b1a10a705b14df248cca801e3b7610baac9d92c75e4c759cf7c8f644b610a350a9a9b5b59eb798a1cbf42d02f211a27aaf05ab8e19baa600f3babca5d82c9388466c5aba81c32a7dabc9775e73a77432f9b96225db1698a2c7a6c9b6949c59d7796758d24c41872802a63bc9723b17f703903c84e425383051abb07e94a1f19a258a61c66b56f46cccf68fa4ad62c528cc1bba2d579913ab754268eadc4204b887bb764096783301fd30ef9d972acacc01977d137525d619df951b0f9a5008bd9cb4524c5ae7cec747696489a8fc0ef65c68e808974e356659cf3d88474ae8af1480f2c4bf5f053b0a8c211d43921f735e63f8ffda3565c2424c89b20974b748a65a5aba75133fcb3156dfb6626a83bab +ciphertext: 6b45b47d66751eaf9909cd0edbd820b9990a7fe19e758d8391c34f5839c9d883ffa86690b4429fd944b2ea3242fc374b007779138a8148c80349b13d098bab8ba58e7c06fa8c7f06e681402dfc890421cc926b7b6e1798eb43ad3e65802b9b997a85985ce8abec4643de68dfe0aa48abaae4f1a91df524608cb6552019cb45a5c42bdacec25bbcde3fbf357258dc908d513d9868a5b8057b12a68086c13aa259c5b53079bb6790b52f7fb8f0e5b220f8960e337f1d60f72819551c9280910e340d3a60c653f384d9dfad692c84d86c3921f427b396a8de54c846274005115119ad5dde417ae74c49dbed1fe8b34eae4091f2d5b8316f7015b74ca8f18be3ad970a99860da876a68fba30375e095fb96fd31d770b290bac3289692831b813261d357e176d39c4e95aefc2d476c2bd03c85e47893e6d730c57f463ceddf1b519f73c56ad3fe2e8966dcf9df718d0589b4d6c78f74c06d0f6b0e3a5d411b00026e950822f90dd1bb91bcbbe81b18f694eb115ea5b529aaae5837a3203cc788b1f25f5712ee61503a2e433cbe61b5242f97c8b9b6ac3e9ff3d50f6240b486f7b127d4ef67fd7db5fbd37d6954ca43764bc9e93e6895455b3b97787b867d47c3fe58e9cbfd916bde745aa799f6c624e66b9ce6409343844cef89a72d50885019be04deb1b5fb94cd74e3fc04163ec07d3ae68e6109543693e6ebcda3fa2921128e53f13536398b0a233c82b31c66ca4ea913eb54402628a1174bcd3212eb460006b872fc5955a998e20d05fd8861e296ae371e84fb3641caf9a64159b9e40b140d9e676c5fdd40f1f6b8050cf2c96a530b2e7752a6587144ed01b585f8c6da4802a4ccb0444fa9849f49f5bd02acf084063639bbf440e14da90f0ec5ccb0bc3a343a6edcc5416907a78ba52ed607747d431b1ab2aa2a166c75af9773be3c10e30c0354596cdf55036de3705c541a0e776e5c06079fa77790da400608823ff5732da88a5e0f04daea35c2ee37b2e852defd3ac53cd0bd411206eb6172ab133d3864170a2185bfa97daf434b1a944501e278bf9696cfe7d5331ab222fcde6237c765336d38d1791bc6f94364699e1fb040ca99633d107998152a78b918e58925fa510174cca3eac4db336ea9eee5fcdc4bc637273e221d6a6a23acbcf63b90b2f12f776cf1aa7449365695d487a7d9d1c84238556bc5a1aacb169f0be9ad07d796c7e0065497c0dc4eb75b00afc7aad3c14b145bc1119feb43a54c00a79455d92bfeb5637f55507f6fabc9643872423a71c791568eb5cd4de77bd5dc3bbbf3fa866f1481d87866232a30f8d826dbbfe440505a2d72cb314d15a8831c21ed690e51ac7f78b2c8ac79e4c1b0b8df49c1b35799d1f9f67a7d0603dc7b7247de7db7c9b3f1fab9555a8b45369aba7111a3cceda4ccde002b225b2b9eb02a0291672fcba505e0e2c7dda86a41fccd3ea865460c734778683cf73cbb420e0bb0a6507195c45691367442a823d0c74c36ad52e45cfe3e458b098b5a535dff6b90d74247ae425f22c4148ab53085ac3165c63c689e7d09d0c5e242b41adab8d295c7a01bf343221b831cb7915d2127b076c96f161949096424790e2614b73e6d7b107d6628d012c8c6f7de8c4577a8b8c67c50099595c104a13012c33de38cf7db732dade0f1cc6da14e785b104ba024920222a00b183f1957ee8a11b121aa624fef83d80e112da47e80476bbd73a03e579b4fd821525ec0768d84cf9f1e75f09852eeb3b13df721b58d174fd06e8f0bbdcbf8dd194d2a5393f22fc7249448050f29b9b74c044bdb8aec832ca049146e3c4fa06c0b4e699f5ed8a3a0f630ce91f1091c827dc7d790db09d2e93768957be071e6c9dceb41a26916b6110586e85d75fb45691cecc84022e0d49da6cfe5d178e798ab353541bfa947a2ace7765163615947c1f4d6b06d8287194d08be3b5708697cbbab8e2a875f3f362c20ad3a92260a80d1a24e72a0392766b5cd759e246bb8150b397479d43e5a4b0b568786dc50ff13f5acd640e975a89be58dff8be1197e33d7d0a0e10922878c7377d09402e888ba06fc11e0e0cbf5034b5638a7b043c097d90898272ce306aaec09610cd2cb0ee870bbde1d92b6d9cb5c46dae7e5e2ccd08565f6556fb2a442fa74b898c18705d82f011a50e0dcf96d14d7dfaa7602d56dc53b54f907b6b1feef5845a5b27c2cce78ba138ff +result: fail +shared_secret: + +# Private key not reduced +private_key: 533d9729384894d97de3098b746aef88166013ec7422c3eed4ab74e69c3b7b094dfea8fa7db3cdc5d4aaf9e468d057eeaa8c8aa3148cc3a49cb1eb4e4e5fdb497b73573a839824d32f655f87245dc6acafba7df7756dd91946ebeeb7b9fd4688fb8f38c9dee1705e970394c39354a3931fb95098e5df0aff884e6269c88def88a639dbeb366dbae168be8249e8afd8af8e4fc3ad9b43ce33428b7be9d4038cd13e69c06c773beef95fe5c06ad97b17ec93cd639732faa7b99df9ed26d652a3d5967e9e5c7344210f8d60d6e80263c9c7db51a2bc5d53bf32d0279ef9e7761c1a4579bfb2c21778cb8d6deffe8f9c8778f0c5f04d76e425d3d23c55ede208d7c67436fd2b7e2f0fd9023abb81f87667dee7a78b696d65630b1334ef853934a39d9d959ac8a9db674534268de2796352b0b4e309bee0508fa09df85aca35e37d597a34cd88fa4fc496998a368ad8473a49adbfbd39df7b7bcfefe80959f3bcbcd0488c5bd4c42938e55ce5a91eaeb437539a33a34ca0dbec4d1795418e6f0d063664b599fe195ddc777ea8836cf6dfdf8ab34e3c8c6026e58e8b13fc6c8fd324a882a66efd502880b4dfa3df38cf5da7c5fef955524b451d5c7ff24c926d0382536cdecfea73b4e736a25957c84d844493f4fbe462fb0c656b074ee596abffaa67b79fb770e734f56c53a97bc84613dfa6ab726ef7d97a49a64f098aa3c763953dd1c79991323fda4785eef3ac3cd739f38c77ef5f05ebac99e01b87fceb1ee44e4695116df103f7da68bd8dd968b218189346a3d37f653c845579e25c5be3196e180447210c97a9b7f4863588d5f38d20a8c5123a6b2aa549d50a8b03dab4536bc658c8b9d8c782b4fdf321d9d525e56d3ea8cdf91a7340c88c8e9d426414469adac2279fe4434cf3cc078a12c5bfd3bbd79db8ab632fcf6f47c005fb84775ac60b6d6e1b56d87ade9de06e92941e3b80598e87658a0268f4888541c2246f9397d271c767f8dd99e81ff7ba7d91d0d4c72b1f48e47c80b9abfd817fcfc065fbb833f0a6bcd0f14f32c85d50afc9df4295c98cdcd9414b40288fa0ed168d32cfcf923f88e67f45c8ab998d99b16caf6314dd5d51ee56170adf3baea330ff717ac486ae7fbfa679a5a64ad47983af1b6544c94d5a4513af233bd0907c935f3b452619b91ba35c6f6f97d5f4abba8ea6654b425f7efb431359c5b861189a6ecdb978ae3b980484dc7ecff013b39da72d99d397659d847e7c6a9121a9edb5abc317c8f87f2c9f07d4bfd9c3780e29441865458df968187763b9eaa8c3c99c22976d7786df31b5c36a9e7249a78875ffc2277e446d289f996ba3905f35152c366bda9d50f66235484df4f6b0b9ff43776bb09a7958668b77faeea5384f8395457873d6be96868ee474c83d969d44edbfd6976e9a75c79094574595aec70afeea49d202dcb289f7823a35ca7973f343c96e917ad97e83e4f0ddd27a9d47c3b6d8b638f9d2669fa7fda95f594533e9e0ce6594e9b8e86444bc6826541f3c834a08e3a39afd8a87c8128837f68c93dc49b6658e3511fc64cafa56e324556b38d3e575d3db153ecec99d274c889227bfe8a6b4ceaa578ad37684984a6de966b0f9cb884dc7c533f29313daec6c4829cf9152bcffe0bf9ee8d7f1731d5365b465d1bcc2c3ad726989539794ff2a839467e49a422657d0fd6e242dca5687c52dea39470a8b2b84710fcd5bb7cce0e7f3542d4a9e5e2a377dde5d8189a4523be07c866ebc4b7777f6d2fa4a46981339879534a92b679be67de86fb2b1dd7a3bee44353fdd74acdd3a556295757c748af48a4bfe172a9f7ea35f647cfc2bc3615bbee0ffefce89df4ba8eeff10df4d209a6fc44995ddf957ebd8d014c4c904947a5c7a58a503be4d18a9451ce0a4c9de93b780d17c70746f3296d6fa3feaa30b14e4e1c8566d65b95a7c98890b36691333623dcb5adcae604d518325cf2328680d9c3e430bbb2b03f854235a4787f80c934d34cfbc571a637b965583678b838d779ad6a2ad9a65d849419de930327b5b00ebba96ece40a3d8803898240aaeb9b19c8085a3bcabfe783c5eab266a996b5e2c4ebb551cdc871f58332839ccc0fa6b25d9a89f43a54e3d2c865463cceff5d87c1f0989322c48fe29f7aeb2df9e748593995a8595e4bfab5cf19743430a247522566196826be35c3ba55053ed8c8ac04211931a38d5a100c7097059bc058d551672542a8f1a7ffe81e0c43b1636572f4608dfadc72f9a786c4c2b2d27c576d29461ad56369b7300d3b0a7890ca3d8407a8a1a90f796558843202152a7131919d9417065360440ab8516909087b2f4ea408baba0cd5c0af2a85634e88693b8c121dc8121d462650f2b417a0c44a5018bc2a70e68a590b757b4c0ac70bca25923049fda10856f62ca42701ab9a75d9991fe3d99856138112ba4f52da1166f410e3f15baf7c3062563dbf0626f76c4ce98ccb1f238a8870201654a6e551a5de9cc24fb36dff2334f2f7bcf51b8b6f8c2d07b4892a657e58637011624076040c02ec59924916f5e49956534b0b7a746b16663f33cef4440f2eb5be9fe4034db153d296a86d83bee3b08ae5341223193a7febabc53956049bc1e14819391c5be5e216377438b0fb56ad770335a97c8e574c015c66d99c59325a2edafc7a6b4ba77fb51050a2c400d754d71c0fac84781af78c03c094bd800fe25b7f7060bfb4252643d97ccc6002a1568d4af181e992b1ffa8cc17bb835f0b2e6b72026478729275b002636cb49c9edbf4373912961da0b913e6cfc1959b80e711cea276c10158dc43b6887042d8d58402cc54a671275fb49a7920c35651aa4d81aebdc772112420db0162b94648ccc519e369958ce40adc90413d9802e621b6e8ccac13d846151c19c6813259c5998f40710f3162d006c5d3a9b2d18861789aa7854831a0314eb74a03b84921ed73ae13db7298288ccec07eaef97716d14a8a296bc3d0b95e4a78e1fa2467c6ac961a73ce63085ca1a4b101adb7f2a4059a97a24bc2dfdb6115386de5e95486a46e6697a17a88510c97a0602205e008088d269082b2c1790c02912a9f03383a94d2127ce1a0d7f558434a6300513a14e2c4f6b33d8a159a06d09983688f75265a84637f07846f0c47441bc6a6a8e48142b39b4891bb5c321c8bd307dcb6326dbb960b532d88f08f8a299d914824e46189378c635cf2088ed8382fbb4164d01c867c1f1c4973116c3629b3cddcb40b1832a0f06b6d04ec8edc46205da3b28f50bd1730bbc04c5f927209a4369b878596a2e149767139e4a06493ea42034062ab1ab037728908c07f9bdc820495916c9114f7e95683c945c19354dc06c5b7888244ec179bf88ed4e68bd10483918bcea652446b7333e71a403e97446564361b5253d0b225d4155682123725f61ed5d4655bdb7891c6572758977f0b4e8de021e832ce6314c25e82392cbca5c794cd20241b87ec87a85a017774bc3da18e77e0b53a521b2eb0a7006b35edf5b0a85b44d3d78dfbb476861997714330c9c5ae5e0027d7298a64b62f2523670c618051629c9577abc2f456eb0ca33fc86e94d910d186144be3a886230cf3566cc09c2ccc76719bc349cfb70c35b24ea6b4bf1c0394527a529641a2b45b60da3a976d70012e48b5df60a7d8382ab149760cb5579f0673f78a52c01c8efd1a667d86635bf15035ac32805b56cc9a1cff506ca38b3df7a3b860985fed84b2b4f1c7f3a88122630f438c565660362a90887a9cb55090cc448c9088c6783aa890cb51ccc3c8cc7c097d59808f06675e1e826869abbc0644a612d471d5c106214abcc1115b106ab3405b1de14c664a773e6e5667d8177ed736a967710edda390f0b105f9c5ba3a2a61912a2414397030022035c533de16c634a799f2b72fc3112071e7aaebd1636a3603971020e2f90fb8113387ca17171b39104595e5500b50c99c37aba1fad50fed567d5eecc00db3ac14624675c76846b42327b9510ddb882b24be90c9661f5c46eb5b1991d25920c78f35807ec55ac2827776a54ac4ee272b469ac65aabc6ba199dbe33724e5866e24a8058d5908e30bf54325745907752d324490b766f6672c4c8443ff7647dec597276135a4789dbab39355175bf3a63ca6a359a879d648c0b388270680781d3e732efa5c85f1c020e4384875954b50403a4987ce54a6f24c83e541491b7d144012544b96b00b933c51704bcfc2b20ada6c481ab32d555898174526a266f70b7939054a88256a59c95a0ec2501cbd45f0ff2ad418b82ecb514f7ebc3fc33647f5c43c5026fb547a33bf2642c9279dc39ac6012a770267d6c947324c6d45b65393421bf4bd7068abb93ab3a36081a303cf37b90037749a046d478b6481b87d7f462e656db85d6046534ae44d82b1cb737a0194eaac814c7b85493fda268813efab5204efa60f78bf81d320d01ac09ac06244f7afbd2d80fd356d9 +ciphertext: b194cfcd01263bba40476580d27f88b07b884d31221bf0e63c7951ff897d292c0fff18238fb1c563280953dd81591e55830ec1430dbae2c77a8b116679a80cf79d651e7ee9e820ca0551511f525df28319be43fbacc67e58e3617852e7fc9933d49826837b88f18474a71710e58a5d0ace606d58e596d63843762964e98c56861c20cac9deb2f4e8ebbf5d522e6d059721d628ec00e988043587b4472d630dc65a73ca4f218e0bb8045688409185183a6c7263c6cf90e00b1016c70a70ffaa02fa3ee39ed539387c67b92a48d5c829aba6906b82f322db0b632b1e557f9af22adb324fa555a44caccef691a57fca147707d973dc9f4fa73ade6bcaed8c7ccb789162a632fa1c9014b91950788d6d6c3019d2143c376ce025726c3cb7451f506784ced9baefca8dcbbb3a52151611d8a08ff87fdb67d9b5e59e78df8cf674cee8bbe5e4c513089f6a91441dadfbb12c869be7c805a650b62407dedcaa5e4bbe7f25cc654e75335016f53e5d73046358f82e457c2e28ac678ca8eb67c25b87e47bfe02bf16aee67d99f6670560ee4a4a6ecbb0c85695c3d89b6448e02b47aedb9901ba5406711f7583d3a9ea1ce672a06a243763855cf17f900136b90b478c4b4f3ee0028b5608fe2ae58083cd079dcc47e4fbceff2340bf87310278a4eec7ef794b576447b87d991d2164815d05b93b7d4b1f1aed5b536dd57a374312b801b3dbfa9822d9e381ccc160653c72b1c129ce6c61d94bc2e647cd86defe3210ca3c31501ad31aa38ae48c0743360edd1b88d6dd6981657283a4f745fe69949e1b402903efab49cb71072280e75b1ab271aa84f9ae18532e90eb21279a8c11a4e3539b0ac7e5cbe6c1eafba4969a65ace86c355c8d0d2e884eab80f3073e6c26c8454a6ec77961b02018739fad9ca01e4963532450e5f477685c82244af62d58bc3d932b2c34bd30772a0d0ea939f7a6f609034cbf27aa308cf90efd2b3baac238b01bdaab0b5f6970bb0ce8cb0154461d8ec9239c4db6cab7b109d48695120d9ef3e75977205c7746d1c2bbe5a4bc4799e62ced8b5e4d2c924aece66c7e3c93859619c4791b10adb6e6f19cf0437c86cea08e3fd1d8dd35200598f5740461ce79d75f72b6e1ebbbc2ef5534eb2a76f6410c9fc338ee0ed87427df9efcd06df7cd29f4cd4273f68c6bb6d22c9d511575f25ada1ddf2b497537fb2a5fc7b7370c741a355b5cc6c19267d2d14b75b3fc6797268bff49c5e791cd085abb53e309f1f68cf25a6c10c53c2b7522739f763c2efb08c9bad5ea5c4ad37dec829fce7e0c1838c1fdbad2cdf2e9ca493f78429e2b1cc23cda79ebc3a559c06c771264fa69b42985bb6b51408ad7ee0a5f5f97514ce8505b1e9f442d3a48038d7d258a98fc64a2ad5973dd69b88939bf3fe7760aacecbaccb546dd7fb0630194a4456e214d931b9d12174a9f386807ec46683e424dadec6f86e9becce6ff2627ddf9b65098a26844cfccc30b9a822201d90448d81189547e9d6383e392f661a61b9bce01d765cecbe8ff6f31b9daa9a83141c7b02f993244c45b8262eab127f94d6304a375406c31de7cd51209e64e3172caa871db3af0dc3f7c806665407790c18f533d7dd742f43961e55a646f6661936eee04d489e9adc7c241597683814d222c5addae355666deb5f118387b4a5c4d496c856b001243113e9ad3d099bdd50fd177d72c86c1ca9a039941dc845b6355a05489ba51b7c0d7169883bbdd89d2a3afd97d932f6417d14c7d48f1f3dae337d070ac8d297ac3dd4886c3149de9e1a3a082f1890e01ee224bf8cf49e0fa01d5cb9b81cc4b1763e02b8fcc27231601a6768a55490a6ca280d78999b5b482fff4b78c5cf2c20512bb02ba980b50d138bd6fcfb42e055b7f93b814b3cad013c38282c25a9beff303963c33d91a699be48b6754087f80d39c7cc5d1fe3e5b0a0878d94494bc933119c0f5562ebbc1fe7b6d68df2ad51ea2f055c045b048932cf6df144db0dd8b04f9787932a13e91ec19871239a2d650055e8ce262c2aa3caef9a7f487bd7c53d47f899b7dce9e99c12a3d4276e7988950d72e7a7eb099f954311b0a357ea77df6e8650dfb872fbd64dffd5426485b9b60058af70396298ebe82f0cf8f2cf7b4fe82b0be28888339b09a13b9dfefb41af339ffe33f37c539c67f9d15047acc6de9ee6b71eb41d2bd7e04fe8e1704714f0512 +result: fail +shared_secret: + +# Private key not reduced +private_key: ebdd8feb35582827eb57c7a2c83f8d0a736fc5b548309af2b877fc19d8f01a2f97e486fa8bea6c048a33c0248677ffbf0b8393b34667de1abaec665a886ac36a4fdce3188f66d6482ccbe84ca6b189d7dc531661e10784f4c5e16bb5d00d1bd67153f0d8c7fea896f1094ad338e5b628f441959f521a4d6517e36d14096b2c05f96f6981f8885efc1ca4075bfd5f0be28eba8f1e7aa83dc8ac1aa9bad3b5cd257465bedc943fdc9a899e5aa573a2ff63bbc3ef9abe33cd919bcd725bb24486b848ffcdcdf36fdeebc79d1f3152bdfa7f4a42852cdc57ed8cb5b6cd353d9200f8de9344a22a9e7dc533ee1618e1607ef0ddfe77da2bbffcd8a38aed623d8ebaf62a3033f99ac10f7540c93d217e380d5ac60d894b86de8b210febab5e51657b34d6cef5557832febd9dd1c5bedb2bcce9d3c71e84f923ea341b1657ac89d8ae474cb744dd309e7513958ef6fc9bc4997a9b9e66240da610868840c7b868bcd756eda3c16a9b8f2343c33d8e5e256ec7d6d8129ff545fbf0c3c8d77ae771bd53e3208584551cc2463691ab1ab4d6dee2fea5ebc0b9c02e867377dbcf421e4d155391250dd0663d8457ce31474eadf2038a8625b6311c3b0f98aa1ae37caf188f4448a6b5a78b747adbcfcaeea30e6d34059a3dc34fefe9f61d63d8b5ed3c567789592fbc9654e741865ddf787545c8dc519f59265976f187833969f29cfaa95765a41837b21076ea1e16e37014b08039c88cef7b9d39fac3969bb9ac396fbcbcd46f6f3ebc78fbd6462e673c00ce6d490b7def8fde5723dacb2aeedd9c4e65afaaa209f511d489c9fad0b68a7d30d347724d59487b8f838cebb517d261bf52174fcef747c602398902e33c612faffa2ea25ea4e95508e616af45f6e7e7d048a3081fd055e988d86db142ef3a16f767260877b765ee9bd8d8296f6829f94e20d4d20aaaf689eee68ca5c3a9f752644ae7237ba623b79f145ae18f5cb41f466a27cca78b2d8815538290b8ac4b086cf626932869b43e4b5477834606d9bf8f3ef95e6f84d0cc72e64875d05f6b8c48d73198ddd01cf0fc2a314a6f74b94aa87ad54de79aac54995c952ae371ead9770b8446baee41becbcb57ba5f446fe01f60e9bca676dc3dbaaf4c5f99cc300b7b08c9abf72dbb03e75d0a5b872bc79cde65df8b243940737cedce36918b61ad0ae77553a006edc2fb3e90a895c2ef4a53009ea75a879cb0e9855f38f6ad7a96085796079d4412bf5ab46c61822d3756a93c7a9ba7c2d3b862889fbd153a394791d3c481fb64aabae3e4c7d637dc43bff1a6ba7c13e699ff45c39f94a533700145a905be7fa03d85319da0f68574b2b4a095033258efd5a4e59af68db362a5be3c13e1accffe665c9559ff9ef456cb3aca8d3a149a021e8f7ce93d87ba57a814cb7e7c84dbd6e4fc36e4ebe6892e6d37df49446d135a6ddd5d224786d79ac87417626d93e134b95d129a42bc4663ef19e84c53c50dcc9d2dca8efd9ef54aa76a8e8370bb03ca7d4de24d6cf24759dc03488484dce10cabe233e482899ca444fda4b44a6fa073ac87f8f688763ad72bcae0db87b1a5a62adf7f8bafb11793b47d8faf1486c97f4eb7ab3d8e1a23af4b68be5c8496262f4aaa0cafcfc3a21ba49e3cae68d175e2a5968d5d1ff2696649d7674332f884f41f59cf9b477d1445ebce7c4c1eafd2fbb6a68aaece5a47ad5d31e5457d32dcfa601b6b91257b64ea7c30b6b32ef7b949893a3bae4ca1dea153c5dbbb6d398cd4d90a9390f714541f34bb4c93a81f734809cc86b8fab6be5539c9f6a968fcf07eb577b27ee6169565b87cf1561936a467a435b88081f7e925576350cc964f5b37fd73c421e7a0777d3fc308947cc5a3f3ffed328b8c23f3ffc8f5c04faa6d72395fc7c8b2d8fa72c6f35c9e9ef71ac34c0daf685b5c5571f7b9b9245133c58b3cfe55e6668316dd899bbcd5e0bdb8671f41f22772dd39dbd973d87cb94c9fa464788b8a87c637f327ccbe3ea34328cb58b5c7f95aafa05eaa5bccf850bf6b40cc438843a6ad4ec82886a2236734dce8e584d8ce18184b91cffe62296acf4e91efe679d4e5fc1245ee3e4ebb2e8e5035e6f380c45bf088d25d5ae2885ac092057b009d6c3105ac4974ece0edc48bd4ea6f14c0a503e523ec378fbfd98b48557665cd15516d767a980e05ba44d761fe17355c0aa302f3826dd25da4ca4d044c299dab608da967c1e253ba77108df51914a15541763f737a89fef62be1f7b4e1b8b77eb719a84377be0081f7d71a6e881e15578603867855d87ec04b5f1f133368e43ec6282fe5eb16935a04ec9916caa90031e40d98b0a8ced98979fa7742a20dcbe84c67223eb6925d7b1b12e07a47677b56e9916029204e91408635eba66a6a844de5ccff6aa63fe15190030b8771101b456288b170bb117584c996c8515262c684a4718f8b369011865c756827d3038d62355f4c994a539815f4d6b6dc9455f4d7ba24501029170cf1aa3b0944574f6642c446a3f121cd08c7bb67e7239da147e0e9c9b5c57b8f2182e00488341994f620c99978c818aba5e4516efe23690636cabf607c438cc288e944b3446b41a264b88c6e0371a08a1c02703c21a0bc5d73e6b95e7b5fb87c6cd43415aeb26f92abac0371b9a7a70ea51c88e12bbcdef7c3cd3a4bcbfa3bb83606b25c85984021122400272a616fc4071db20560654a7ca099a6d0754c43687d9657b1b816a04b8d4cb63d0e3765e228890e0907accb4734cc557fc96ef7fb6b463cc2fa5b73b7fc231f230028201483e66efdd4570365865c08028f96609377703a2300f7e1b9f4939475541e0cda2527b28aca7374d1827206426637965870e9b86cbc115d9a04c0e73e8b7a866c277da3c58e0d2094fa285e2d05af7ef64f8ea6146ec4321395b7f30a6e52171ba28984b1e49726b48ed259638f6bacbfc5c2a4baa3cc391f0be917f7ba3a05dc911642a63db03fce58bc6ff92af7616569d04415a26eff8c271f9921ddd302787959f5397b70d7a388f7569e010cf26b67fb2c3a2a52714f5666b9726cb775c28a79a41531213e4766c9442fa06498f6d5a1816b7338f9afb779a40f2670221bc5ef319786762fc78b1a25fc9db8e362f11c9f374b04204940877bc209b25ae7f461c40a0193f66a95ab7dcc80afed9402ab725dab23c1abeacad633c461a26790865c21a960d338a7e485cb2b42a8b0963b8689c9d4287643b8685a341333dcbbd7637fa2671c1048638a547815f07b255ac115c8bc32b61a369128c60076c3464fdbe2c7c0bc5ef1e383ddd2ae8b0457410c19ba1c486b702a9048049e85cd1e7569eac6b3be8287ec9c195c3bb0b4f28952823832c55257d05ebd8a8bff9c372095be66359c9ba7384080a7acd9567db7905c50c36734cec7519e8e57195247b48a65a1e34cb942d741d88b429d226a4097beed271dcbc8a035606e056a89a8487197039adde30f78bb17148a4f0bc84bf1dc0d9057c97b028296b9260e601ed1a675bca781c53bcbd6866b4ae108d059ada7c6b8615195336c2df2e71ce97528378b2fdc4b6501f2443fd4b6248429b67a4624769236e32c12e3116ef66ae2554f55c7be15319e803b8ce0089d3c04b65ec8340c483b2ae4c2b8ec7daa91b39270ab7ec04fee436e1c008f61c46fa854363287573c50c63c3b1f94d52feeba13aec5c926257592904b00ca8615469df5539e8f4c627b11be02e96d17189a80f37da5d08db81baeb7c34b5c58ab3ccb25af3c29cec9364175b6bb4a04b5958079e18d5440bf24538598c1c548327980297efe531d4c14a9360b8dcc173f6536b760b2a6fd59bae262087989269c884a966c658017ce65d14519a2c61266b344f6648abc0a657580130c6fa0f6565d8100f0532011945c3fa296de184750aa931582a90e6bb9080971cdd6b470f68db4e529ed61bf97f62bfac5cb534c1570db606cf0351e1866d7e199dc329d70316d7fd849d5c296d76a8db20306bbab609e7a9ac05c7896b150d6962d2466158f8697e532901e421d5ec00671344640623891a9221ea17ebcf6b290dc54359814a86658e2c0159c2374e1dc5f94dcb30ce01f3633129274585e304f0436396d66660f81c4cd273b94a3740f9c2fdd081bc309602a2cadd82aad35a46684547d01c74c38547176113a697b49e6c98c1c017b25f817e19c2a0302d083dc5c74c4c38b6706e94c10d178369b375df9c118130824fe99ac49f24a682ac23de429f8c7a6d1a89c36f82f0a47379e7aafadc744e1f20b9186c67784c3e6b823306896fca303baf61309cb498a216431862f00198c26ab6938487dacfaeec6906ae45303ec7dbc2889a8eefa511b82609b980dad54ebb3e7091e9d42a9b1d5b6521a7a4527116aa7c38f6ddf99acd4a7b9837317d99f83732bb7caae77e0f9f21eabd8c0c6eea7767f4e10fde5c2d79b8400bf96b19014b457ec21 +ciphertext: 2dc32e31aec258d6463c8b3a5b9464fad89f1399b6464d5194a8704edbe2fd1abd7044fcc1fb2781c4ee362beaa35ae6a1f8b37ba5d58610092cc908ed65ea0aea8b393781be6277d0842fa27f9fb97b61b33eda5e50c1254b0410fdf9dd42306694b158bbf9a2acc025ba0018448e4adf4a1c9f71c7086750217ed7afcd3a2a2651797944e8cbfcbeb6e9b67d2ed65dbbaafaf3bdaccbb12e17d90e91e8cc1e0c96e3ad6387d95e2ce0b74ce9238c400c75723e8100af62a9fe53732f256d410f16de8c88eb484e45062c60d39fed5a780af738d320097139d4f26f9f39b8b1e777d5d0eba2bdf08d7950ba817522ed34c4774976ee6210f61393cc3c3d34da2ae3ac491db3c2de20b223bd73ce0c45e4743996e3ddcf286d7ac5e2c9b42f23afca77956e39c7fe65246863465de548f754fa5c07ed6bddaf138b22fae3b316dc5571b9a452c65fc01d9680cd4a6f04e69cfc885f80d1850994d85d4cd13afcd51ce1470c4c467442f845b5904b54f53b6b9150689fa40670f00b78f1a40735a2a8c4075520e1593fa8f2624b1dfa86b60c37ef09d97cfc4ef03002a3cd104f7399204c5849a860bd2685091364aed298b73e44f414eb62d093317b710da0e3380167aea5a87c071495a57243542f1a8b1a2aa433b25a9778f3224d75a8e5b913feacb83ec1ce53e9de2d53f6ccd326c463c0b82bc41f1532cb74d95b820a2cb1ddeff87393d219ca1c58a6bb742fde0787708cddb57fcccbe523c90674857074b2875cd961e8144aa6c2eb4f33972e695441f659b0c066bb7bba5925d26811c794d4a2c2c9c5f167cc92d8bef403151cc1f27fd0addd2a1297a07c5f47f9f8fbf72d0eb08158993efd5985970de5938382f4b504dac300ba12f6e733fd8f3d5fb26ae306164fe0ad0df2ec13ee8958ef7667a88d36ef9b7a521d840c69e208eb7df5f862de630c74c1ab65909d0fcc6093022d7f475a2d095801c1b12884b9f97643f714865d9752e25111a5c29ea974ce2532301bc0920de36d35abb364cadc0b3941034ddf459bde80f28c1178df12f50047b73a7370d380a858430e0eb7a3589bbbf578559c94035a6aa69b5dbccf09d2ad755311c97e80b75086462fa35027d72f6205e0a4b8ad20c5b56f91dcde31aeb8937d23939115ae4b76833dd5265e1019f8126069fd0da3059e96df4209efc730d4cca140076418c1f1fbac6b6a5422d56cd2d9eb16fb23d798021aa03292f34a6d302e119e4b3aa104e4856689dc10685c71ee038d02b8a0b965691c46b014184e20497f05d46e6f955b20a67ddac8f6d0cacc5f1e0ac6e826338026b58de71b2292ffa6d1ce333d124f17735fe21009f46fd2009829fedb8ee018e6d773a0bede891cd7ff9acbbbe9ea5a772850d38b89d3f423b0eb53458f28bdfd57184f6aa830307dbe8f8e9acb86dde8649115e0752dcbb4ef99437c488ca7dee225ee999ccf8176e1cd8a735817b927baf1e4d602c37815a086f74f27d318ba91c0bba5d6c52a4fd3a481373575345e660db150505466e9513224a540c33d9713b755c82a67dc3482e6ecce3a46dbc189d9a71a7f5feb091ea1e8b395d599cf0ae5c4ed6dfde8fa12bfc93de992e19d75434ecf158be6a3a22607b4a54b702e5822575c28ddb1a51500c5894f3d01d6bfbdc895bae212e8ce78ae75a38ad93123fab702a2c3e64db8bf44d05143aa87ca54c66fab032142b9569dd21f74d67148f54d513c991362097ed325953f0c621c42968806460763c211b4d8b383a724a2d53b7b7ba72bca0fda2ccc816bc74935d66b408e174994d856a20cab75fc8a0ace390f47c4f26c8a513c21fd3e8ea5d0ab19fe2547fe4f1981ea9133c2d9aa06580369ac4ce8b95c78d57043dbf444daa14c0841d84c2dbf7298e3df9e21d771265c4471778d0522ae99ca9c86e4cf568c8e18075bd6c6348455b53816a673d56f6fcb63238f653cd8dad471721b272585b6713f223afc43d05409a1e032642f8f653304696f758832db360d754666e1bee5a33c6c52027fbcdfe51abd5e4b3c165d219ade2a527ebe6d77096de845e09316c9099c7605953a31dd68b936bc96144c8120e00dc00300667fb8471dcbe770f72a5e3fbffceaf6edebfb8d786f7830f7aaf48e1cab9372ab7442176e8e9eb8d71df0001d5fd4afa3f4b1179d4f50fd338c2f15bbc27c3419a931ade3aa +result: fail +shared_secret: + +# Private key too short +private_key: b19f329ac73c63553826a883ca9d6770c5a3a83b3fa56e8377798783b9a5b7c697e587ee823d60b09e536a4b623c4f361c2307526972f885f41a13eaabb5c0760f075c4b09760272118d5fab168078ba4a1a277a6a9e07fc3c8fd0831af6a28ddc842ca2c99f8abe73b57ba7134d298c1ab340c1ede59296208652b48139db71c07c75d8ca838ae0c2c51834840935199964125b1817fcc1eb9b597cc1611498679d03963cc5bf822485fa7a1fa11645cd85159e895ab0cacb9ee28d63f6a55a7babed6734f95b29f0a2313c4a9d1709b1f91987435718538a08c901af737c6e4ab11d23512a449c023b100d65c2b7329cab11c2a0ec180816ca6994f208ee5b983e54284c754bd751101fea2fbdd33352e26013623012418144b4c259943089db43a064a6e6d334a66446b395b2e2808b287398ddc49b82476e71164d2b301463aa61978826f98b4d50bb7130e9c47f195bc4bb171b5c25d377bc739302b74c526562591e643156bccd1f213bf3e89e58da547d3c66dc479bed1c26e5d12e61b537724c55830a4e45f34d8e55cc41a82600450436a61d0771b9a99a93437ac5fe12516c0bbf8b218c97831a85c45c0e93b8e7c27e654b2ae1f93ec0cc909fb5072c1b88ddeb58a820b071b60ba9cc5099f6654f2c8e625748ff12c4e24051e348331b1ac58576aae3708742140715c03d8b30b68c15064b7798444947e32033e239be8491899cb4c67df515c7f78e96405d3b7c46065a08c1c70107ac3776b73364c7a48434475f408b42b699d9ab870d155c6a030a7e29b090f1958feccd2bf338f66926308a1d80f8b9c12a954cec06bb5b2df8a7a6efb9b9c4b86215ea14abc279d6bb870ed25e1f0caa6400596b96b8fd19ba03b924b433c58c50a4b823b365bb1b229badf509796bd80d9860b980e064ff099f632713d9f57d9a12c04511cc09c0cc634806f3019ce8471d831b5662a986b8905f6a0703798c97d2736ee4192f50137ce12755a28c9961cb5c6a827ceb8965a11c3139cb74a3a21b1ef09eacda5a1843387835155e3c510cc0cd3d8bbf58348943d2b499a870202958199a7d7e0b6070f097f7b6976af8126ca40e65b9590d12b4c335cea7d81350cc569a2736668822fa4b861a66ac9e6c25499c1bea9a020d390d4232769b4ba3c730798cc0445c566c5e33ac877574af21c71819a1f523a628c657d7a39b416c8e668c73a173b3ee604ab4c32986a3bafda3c29f2a30be524c51c6050d22b976734d0c411cf1a6924de6c17348789b1870afba1c18c843b873bd3796c48afa484567459ee77558ac6fd950214e99b237e8c02bf1258ee18667e34c4b4388bf1960fb8557486934f18b9b454813cfd3775033cc9830c8f7538fdfb3861fdb20496964b3a35bd2ea7efa9a6795f2266a8879316905fbdc81f27b4c79a8cc49fb5c7c10493e267f3858bbf1f63c25799615034d9c43cac1b1caad475b4443c35651ce06e7b7fce59448219624d97453f5876e941794fcc7984796a72ab2e3809297c0a1943b55a5e329f44556f09c17fe07702d354e07a415236cae20e242e9b43c3e129440c181be428f4228c3a9fa26940962ada931cd49b662b351a416444af75609d9c586a3449b1c8a542c27f8452903fa1191c182864113edb90a452c9ab892c6df01440df64022e536dde3adc0c336475864cb010de9d295aea5531186b2cadc62635247a5387454858c9045cdebf09ab4bc71e87b25bc7b7f5c324431679e5db38b30b459d353acce182069ac6fa0b19dc5daa797205bfb3210432c0ac6291fbe87c3da0c452956ab99b0073a30adc3ab0c78f449150586910942804790ad0562979283ab7c805e694611426df0b108eed8722487108ffcc2eb9782449bcb6bb010f4740b1799b245114113c604f16087cd5c3ab8527102280b3b066026268412640b463a624a0850e028be3f763bfbf876d0a43566438614fca947c09c13aaa2b5d38801b73a84d7538b7bc42bb86a1caabbed952ed0b165d7107e2ad84b3f21039458b9f9a9 +ciphertext: d4363612d9efe201ef8fc93120bcc8f1bcce1c527960035ef975397ee879e371a14cb9d5cd9eea54aa8f21c30e546cee783e2df2082e10a507f0ed1edf8d28583e3a0b011f1657eb8613e6fa96387fb6bbbbf3f0d09c08814ba75a14760c2fd180f055833abf0e5da080ab039d081c17466058f3551f8a69f01d453c8a5ff495d5fa4c0c1bc885ee3f93cdde2797007f9b9fad2a81fadf548fe9df9656bd00ec34df3e868651e27443abdf006900cc7243ee25f4bd7cc9a28b8cfad32376a8f77c94d14511b4fd9046e2e0cae96123d2d1823dda2564b4d307bc7e9cab9a6c5b2cd5d0828e3be267106509c15a1ae6c73ddded5a1f40a70774db576bdd991618c20eb3b67402fa4935ff2604a19631dc99d0f7ba50fed9a9144a79426ad3af36eeac06a4f9c340ead21279434c53a709c4e4fc66e7fa9c9d2634668e96d17f8c8abe04387c125e521adc3fb803a8415801291e6f0680fe27bd4f9bd31afafae03dd84b3f03c288d401869c4f98effab99aa8b509715fec7df1bf04551373131fd52a3066e0eb7a295509ed5ea2ad8aaa85981b235328f40886a0a51c81c1a86fe1411602cd27763727589155e3a963c8a48030d144ab95cf7ea2f6faae7b3b336ca71e0bff934238514f3af87efa3c5eddf64c6daeb56a2dff54d96631cac90edc0fdec799e0ed1ac9a7a35f38881cbc06c17920279d02fc36d10f53094f36995192b7d13caa9fb1e7b295fd8eb6149f441a0d2d99cddf43b815ce945f5aa54ab2d9a4966769b3647532d42587f4ab51d992dde4578b65e9626d383b8f2f7fb2e5629baae5d41ea598f7f43ab83e27cf7dea88deb0854614fe8be70b0741a503944e559852c9ba3b1dad1a722a035218b9c4cc51916827bb1211382fcd8313fc3fec47d2fcaae867e534a04270794cdeb5affc8610da2535827eadcd72b73e44e07531d00109f963fbf6ae0cc0fbea06f06f65f31f9c686cf0dbec27cee3e5dfd5828a8b5deeeb9631e0e0a74d79561a241fb5b0ce4c1e2ce8580a7c7a7a9c0a02283ad98b79cbb925a68c954d4a060c893b5c41cc727bdb0cb31f470a8c41b675d28af27251b4d0c932fa8026a200bded34768bf38ba93ff51ffe7140363165210f08b9406da51cbdaea3051cb9b63cb7f2da3343ff0b61d1ddb8748090c788e1f590f653dc27f9e912f13130ac1ad5e0673ec8d0b9e5e1133794977e552c7d2ddc96f36f37fad1a44c04a1132cbe496a5f959e7530b0b86b15aba009b662704469d3eb438cb13f2905d96962b48b4bf2a0c086e4a228bef1ed393ff6fe14c282ae099b27c1226847d716d98a6d09f1107bac8f60f5e26b8706d16874b5a40489976d7131c4dce1a011cd67a0c396fb164d701b01e2df2993f69365924e95d6e16ca3f7c6c541a6249a62f54b0989d2bfa73aca2d4160cfd26712aa3b9998b9bf6ef252997c7f6b8233fe5de8bf4038bf7f43013a7729dfc0cb38735d9360bebe47d98347eb96b4ff9ac536258ad6de41f7821583b7fc1fdb24e00899b69a8fa959685a7c1922c5f5ed31f14e75ffe29c702fc36233ad32e308faacbb28c0885f1d84b91b794ada9fe00545760636c29fc23a6140185f42da41f5ba9dce00f3e3b3569b9ddc88afb0757bfb75580efecb1d0cdcc24e84c5016585d160167b3038c2ac9f61e19ac9635f2c699cfecd3e19f7e622814663231d3966667efb8fcc0533fbb3eadc7dbb0b0b2f15b33e17bebae81e408536ee5d87f4de84856bb04d584b6713f845b705e4cce1b90c8c754ec4974b8ee72493ac8e2d1bbf7fd90e4500062b0641f7d608ad1398cfd446818ddf8c7f4775bf4ef28b2f6d732e81900bce16fc2935f6c7a430cb91aa61f16c0ae7e4594704c77be0bc3731a4838754e0ddf2922679c94f85450bc6705f9e7902f9247058ca5847c61b0583aca6380a1c9016c0eb3d663ccf2ac3b541877df22f6179385da98cff4e3e1ef20e4acbbe94bd85dcf83705b221f5cc248d51b64b0798a035eb7a968247ccd9c0d804a122b37b08495cfda09e89f4d9d71bbde8e72c89913ebbc9f2bd303a842bf86402cd115b351a56df3ab25b399b046da18cb792e7724a7fd6e34207a8610d46bb35aec6afe568edff184efeada49c90887fb4671b8105ac5f851b180aaf247d2d8923a9d8fbfdb3d9c62887ef9bf0849fc134c541d0a3f9c3f67f945d36e649ffbf9aee +result: fail +shared_secret: + +# Private key too short +private_key: 77017693dde1a9b8f1085510567d894e0c66811d8635a33a07cebbb5fdc12adcc0180df572b33923374870d766419f8b506069568cb9cf923a54fec8248b864b33f42259131e9e69be06c279db8c23e90931d2ab54485c9179d0032259b0bf87bd634410c1199488ac5b7c9939eee01148591a10210fccf5272708a53a113f3b14868986a97fb32dd2e20c178757eaea02c3e730270720ead6a343d6913e6c5bb6221661ec7a9582478b37600cc5cfe6fc75b5218829b185911c521b59733ce2a04f03155ec4cae209b750d235ec447d6088794522960931a0997416ca2b84afa4737ad604d65c416c162752510e35eb44b40698eaba40dfe68af4ac5e6463849fd63584eaba6f1aa8e89a1b8059c627e74ac2806d9d7976f4757856158839f6200d2ca2d126120a06aa9e91af7ab429f965015dcb6bc2e63998 +ciphertext: 6ce8e8cc3d0f1907bb7fab518f2ba8105a796543681960412bdcc953d1efda97b5c7c83bcc2bf9b0e35b5b4dc3ab79cbbfb25963f856f55c6ee34cf07531ed3896b32d6bd67bcc5455a563313e9455c4ee66fa81b2c271eb2f4b3cdb95428b9585ab271ef4d67abc6baf80ae42f2eea78c447df9e80f4c5525c797ec3f1e5e2603c8e28021df6533331159976a6cf7d89b7548dfe2398cb6327ff1aa1936536fa9aa6a2a01954cb9d503e03b0a4383687cf57d2b9184609db7ed2521ec074e033e983ea8ce175da80ca22c2c13e397ab6ca73f7adc7b335013ced5eaf49b8b440e4604b5c97fc0e7202af4e23855f4fff1f69ed63d5acf78b6806c89f090a36fa92a64fc9837f521f8ea289f83b44892086c1a544967573a53f74aa8ed36e314bc78d8f127fad6725ef6c53373fa82b3a2991c876ddc9828438dbc65ceaa937d6d1ca9f57c2b030bc8ddef72fc7be67bfa99c71e683e2a5e1e34438c8e3109be2ea909e4a2c46daa07f76c1e7f47334036ceb4fc24081b637e334e1570a0aed00063a5730ae8c48a0d08ccabb63eca3b3c9747d024847cd18bebc5be1e8b2dbb89b2c0e1c308fb3de2e8f4a39fb813b6a1724e0b5f9763085dc1b1e2c98e6cb7bba6857aa7f8881daa10fbf30b7c62cce883eb6d7bea8669b12fd7d1af6f9c5d9dadcde398911fc3c185c0631b81d8ecdc73de21daf45c8d7b5ddca8e0e8ddcafb861d9d58bb52663340b7d43c60550b4a32e8e3e30549ab7ddcba8074319f5a1663a38e12af43ed179153e3c25fb610a3b4bf510478a2934453a58926c4697e87c9c9b2560fa8dd5a1a9c745ebf112727b6c56682c14d10ce19e45314c8295428b442c7172bd7c7f3bcf7c9875abc3005d88fb1cf92e74b00519ff28e3a7bb460b26c350808f3b9b5105581ccab546e95c4250b1b05eea4a2cdcda2807b0997eed074b292954bb75d14191649b92b03b43d9a2111cc8e694a31663be2ade36112d002925d36b4d8ee1794705dd049a20dd2899af72ecf6a3c211ae76dc8111a7c25e36d277d3776746a66f1eadf30a5a99d2ba43b3ba9b0bc736df8fdfae0c36d9ab0ddc856edb0e561dfb32afc978e4015755af4f4a462ef657e1c979d9782de474576cd1f7ed7dc9ff9e308713032bbd000d92e976ed2c70549cafd868e53c78f0a904281e8a3ff435ecb154368f30ee87556299b7d8e4d2da7b8f6013c0c1ffb59827363d5f1bf8d7ab09bcfc3a6e980611feada0fca68f3a4403e479d3cdea726af333ef3ebc4b28781ebbfabaa1a65c4a2762923f9694b621e029de211d451b46cd724924e8099d5d518710386c2e141be891f30cc7cbb066ab879f077a34cfddd258c9e6e955a0f4235a71a96bffd615e9eee72a52e2636cf55c00191a5c19b625359c8ffd8e3352809348372f3775568895d0491c20c3ed7b500506e2731941636c2047f32d42384d85020f7be3065400d25b19560e2a78a112863a6ccf1e3f4781654d978b632787f0aa0ac80fc5388e3294c301358b66a1c6fa905670f724784b0aacdc4ca27718e8772b48d9442efad7d69654ad5aa05203af56700849d63096c3ac798d4f2861426b0600db423139c964af20366ca99757e1cde0377d3d67dc8a0589e112b3772119d084d331e64f13902a664b021e683805f78deca0ee79c0f42e28b98e84b51eb6acb25d365a8cf3345d936898f6613f9ce3cbcbf23cc7cc5521eccb816b5ef1ccdcf304a1c873c950326486950ea1234aec4273314efcb096d14bd519a789396fc9c2e51e2f27cbc889ea81cc20b146887c3d3bf4c813e4bc4a1cb03e0f253ece53a417c7ea03d60031c8105ce7be5d53eb74e1211d87381c7b420e4f0ac3efd08aea1726f36f27a5e6d5a170ae97661da274aa91ec0f5e2284bfb68945ac900f77e045130b4e0d97041bcf728050629b754fe83280c6b398b6b064acda5943670878deefa3fe9d8a3f0565354498313a766c58eebcab4cc678f75828eab8baac41d249c56b9c228c9a8367e8212b565f5598aa9cbdea892bf5a447a5db81d1ebe294d0651268249a0422d9ae3e1889682f89ec184d5bcc85c5c7f822a488ef7b2c976652daffab4dd68bbf38a7f45d0d98d66314a5598008fdae35cdf95beac6dcac386c9bc42d10b0e74ef606a39dc78054ae61ee538ff563aae1d4d5c13577a3c7b1c2c14fc658ebf97e2e2b4482825b7 +result: fail +shared_secret: + +# Private key too short +private_key: cb0f1386cceecb1cc089871325b38ef5359638af6c38ca8320b682549c42889daa8b149ff1588849a730b3958e8a9adbac837ba88761065661f680fa012951112406f992b4090a7520bff2447deb387ce04bcfa18a380e95a258e9c4c0e19c1ce3b4476435a7dc10d3942e3905673eb2939b7a742f344f8a226c50b78dc2818fe5e69bba8160b4c57f5ea97116e06eac61214555b8562462b2108be6fa0dc5268781a86b235256152a57363bae7e492d729676294c60ec633908869b2e529dd267c20f54924cf5acfa0031e6679cc82c3ca383692df45a9ec2661aa856e585239bc59ccaf3a7bf128aa468542ab58e784a55f510879a28b515c05d42f19c6b7a16a34511fa9b294c712a4f643710c0848846c9d5284b24b88425154cd3764e2e21ca98aca653fccd4984cff861bcf436c4485c0175f34d28d34775d8a23b16aab9d5638923ce03c30733c03c0959355ab046f7ba121a67674bd1ab4485c46dab36dcb7773e106a89c1bd51b16d7a2063e73a7bf99547502132b1b5646d0acc07678a3c559232827169597f3b50486ee598879caf0fa713bfdc748beaa1f085b5a964458d6c75de0368b3d88659f0a59dfa11f90543247068360792ed0a18b1cc528a6573a7165d13bab8c0142ec3e2133be68f963b29562c7465799028e7cea13949b4a9032d035a33c6761ed888fb28adffdacd4fa83ab3456635229546c7c550530cfa4b397f32a7671330a4bbade5d37fb67982204148fed926ad8b9a012952fce6019d943b91fa6685fc948bac2bca6519e25b25b68bc576073463f0797b43739707149bf1bcb5533e59113001834330dc30d9234048d106c0ec740a0676770b8a26ab3ee8f62d76e701d32bc15442b023ccbadce591a3623ffbc0114ba267e2a48358c071eb1c1c9448cdbc2630720662b4c1aff9d3576ba66a52a22fbc680ef663805f9b34119543b5576d8e50ba6f7614b9ec9789a657bfcc099737618a38aecd3c78944575eff5386ff4beab1390edf6cf2291094d771e10c7b60cc4b92926cd815b8a90d3ce5e714b53f4cc071b989ab06b1b141104362f00b103478970de698752ecc46490cbbff312c0663054d7699b4a129aeaa2a74a0bc5c8707133b539a9b14f32c1c4c2c5c1fcc6f9a8351af51f46f28aa5b69274716106c4b3b29cbdecb5cbfc1cb5e047547a8167c4bcabf43ba00f57952c422ef9167e26bb585bb20be505b03e0012a13042f492acce77c0dfc22a062b636f9bad83d19d07eb2ce26ba67a1a44c84534ea4a48247b27e880796f41cfdb945b8cf921f11b2ff77a1e6978afaee49f305578f1678f3847c1309ca527a5aabc4019f361adc4f18dca513c6b3a2240b403a22cad5597a6eb09ca0384c0bf1031e7d82c59230f1b73bc72f82378c5c64ae4b986628141c31fd1faa585e4c132843759a90cfab1577f7965ca5a5cdd1788461012c7ec716eab372fd88b2d1aa3ae023d04c99ef8f395dacbbbe7d03de492a30af8365c74ab87043620977cdb69914072c80b08ac98b015ee9771 +ciphertext: 15ca4879064b75eff9f417e62c00077cd116de80f8b85944dd3b075d651b8236c18b96305e1592687da8ad98f80be47754c17f5cf0a8f02f0fe2677aa82bb4fd5b8f6939c3d79b8ecd4047a258dd1b3ace46492176817655c7b2ba7affd6a8453f6ad8eb947ac6a46bdb79a5bf66eff779209ac460bc5a73a8a8ed6dc249982906947e990f6fe36b72e4d98ba336daeeed949a3e4dc50445b71cc0f5fcd5be01bc4ae193c2cc87e78516ece0880d9f9398aa7931dde958bb2adea30965ab283415f54e1a24fc9d5af6df9ce654c381860a56046d2c4dc5f9abe070df32abe8e3546145967fe21d676a461c351d5215b24d09d89cfcefef9fdc9a2ea3775f9273d312eafe825ac0c1f15445e5eaede5e9ab0bd559f8481e34cfdb892e82199b96d32a0fb7e877bb54246b57c535829478aa12c9fc503205429673591929878f0b4acdc2d9311e1c9511bc33c0c28564b56258f5ec3fe2a82ddb05e3d54eba3154ac8760d0434311b8535b3ff90cbd2465f35206a78c01d0f1fa3b9036dccea423f7c1e839928d2813378c0126e3d4f632f05af7bf2b59f543b315c5a71e803480527819461785ec8c9097938014c663abe5054893a478d6be9ecfd4edfaa621827b5f6a498e34acd6b7e9a799647755392f826ecdac90c41f59b210816db991296b7a0ecb9c0f7459a16693d7c2a73de1d4ee6b9b74a0361c2b0dd07802859ff3e0924d57ea5cb1e8bfae6ccaaa280b5afd954f84017f6f168adc6fb8c50f8e68dca3581409216a1e1d7b71c5995701c685623b7c0c29fd0d98f4d2d4ee186045f7ea9f0425c31efd74ed16ebd3f83b9daacf1b5d6ac19bae22e2f19d165c6b0aa53fd61e3e9495dbb9f33ff8501ef71394eb2010747bfaca27bf6fc5040fc30369375bd320062597c5299541677081e8e2014b3e318daa6e53a0634de4ff8229c56fceef128457bc9ecb7bbb45f25129db1239c2f1b99dbb04d286103b3d7a9ea8d93938131f85d0154307d1e6dedb00c0cb9b689c84b4f1a16f7705d5cdde01cd408a980a6ae1e84e8d7680e443b1eb528ddae0ae8d5e34328292764f792e80fd0ddac949899823aa722a9946d11e48374e915faa7be61840cd9bb69f4573b83935d20584a7bb61a6b003e07275818ce4cb5371231432830800fe5e363291f015c0bf8cb7ea267c369b932399901a20044419292023c6faf5634573a4421019f68a7d2336038c3164f7468219e055aa41b06a7431e5bbca40b9f7c59b95e07dedcc54bf965ca07710ba4b641585896a0ecec6aec0f6e878611f2f01525dac28fcc7742025a4b1abf578ceb9356bf7b94eb6904f03ff2a7ee8f6da6812c15833b07e30d5a3397fc5bda3fb60adcbd1686cee19f2b08289623aa87d31ca7651a9a2d8e8b98e090b0c58ed6ac89b1d3ab597fb7a447bd2a591f68658c1bb1c3ff0abea1f300465dad87e4e4fb2ff61d816e577d87e7eef5afe9bee51d777430cd366045678ba1a463fb23f2edbceb3d38d83cd64de418c45c632d2aee8487cdd7eee5b5b9b5da5abe883b4af138dc0d75cad3026dd0e16bcff2f13140728be0ade7bb95365f44a0f20e419254172160fdea0cdeb52675342a0d104e4719912f11157f241e62f3287219670f1b9cb45a08eb8d019f020d00f034b19e06a0be5f80332115c25454c782b50768a2d8a2b08495f7bd3b450e788e3ebd28400a789eb711bfaea56180a8800b03a2d3a398e9ba6dac14e87088f4e52202a02b3f2812878a006f6aa79c2e5f3c855a252f07c6e0ad01f98d954d74a9dd42748814a64c24e232ded9f0bc9e2d539b8e5593aad6d876e9be9f082ab53ac1650f160a48f668e1f7e2b0109b6421fc2538a8783cf8a6dc9d0fa1b72ec590e841f870efca6639eee38df11ca4c482fcebc81decb2cf706a77253fb4b6e9f4d78e86e5d81dd645b8b81739c812f60369048bef65a4ccbcd7568aae7faf7c2cb5f527f6c466cbbd4d31f461af2c7076780e1f85568e3fa09fd3f2d1adb602fef6bf7b1ef7114354b94feaf4a1ded87e88f09d60ec2b3c3b3425f129d56eab8ed62391ab9c6c3c67197c272cbd4bb4cccc7253c481c61a0b4e3bf5288fc2399daf7cb97d9930dfcd1dec7a7cca539311bb09dc47eb2236535d7b0ff8586c5e1b84551e3b7212cafcac2270bf8c6de06851acf09c159071983b0b3524601df7a8304d63d7f7dbf4c4c +result: fail +shared_secret: + +# Private key too short +private_key: 4baa406d5baa51b3a808594f3d3acc114858859c19e393ba6e62ad7ae4b572d73d14790bd17671d31212d1ea386d874d75260b53d2070f47b49172612f487312713a8c858fd2ea43029832328c73ec397826a870a8d8969b3a65f69867b51cc7099164f8d793e72909c443824956ced629345002133ed3c52d034dd1197e2359ad12d10d619926ed8bbf69b6b2ab33087004c3da804bac569c2216a139869d2c2aa9159399f5a313833b53ea2c5cdfca0632236c698944a562c8a03979e4f39f779a82724183902c203408cd038378359330542065fc1c49124b6c4c8a4051fc5ca66723482c81b259a1dae78871635e4e48bfcc17196bf24643243a +ciphertext: 552e5cb796053682dbddbd46aebb81c4c102fc52c2b461bb397e597df85c7c51b7525292367e4375a5bd49586a51df280a5a66e2c0f183680b46a479fba0bf65d8755e1fc010dcb6ea429db65eb4b9cff73d38d8308db99f5449dec4ba570d37a8834cd030ecb0080e83acfaf9886880a6f6eba806d2c564a85998e2d08c9e08982d4d82c34b4a1020d9f6c4aa6a611f7662f88d570766f432e5790ada98fdff0abc05df840cd714a1b5584f104dd4ca7806782fa67bb7690dfcd7a87524bfd96d95cd5e3b191e017345618c8be2f141a35748e2ac96fa103103a485c7f950e045e26da5e8827b640ab5dc2a832c60e3b985266037ba2dfaab92efb2b239fb963262e572dd04b087d1225edce1279a8583f8cdebb8e36ffc8036a648eb123ea046498e871021fd97cc9950db4b475e719703aa433d4636425677c1bb67d8fa8b783af89a7a4f6a7bce420df22e4884baf3b961581fc1e73c7b0ea2c121b1fbc04a07bdd9220ea9cf8a914e189a8a9afdfac79bf64035cdf63656ec0c226dc7d843b9230c9b371e942153991d00aff2af78a4051203ec0e10344861425e108e1adbd211af000a9b0881869665b9e0da4bdbceb6911f301d9b5f46fe78ac3b63562bc48896f3b06cfb56050e88cef6444f64550126230bab6122ec673178c9d9040c0bf0e6feb7d2db91b8b7c0ded913e3916e10d7ff32d109819cd0a51f262b69cb61fe6ddc7d126670ff6e4071af2095e688cbd72e13ec6ef27e6c3a6a22bf95abb7dac11ad0b71a72498d6714342843869a3aa7d33b4f70460385e844c8792cd009b97254843ceb97826c305f4cc0b87aea70d0078b2a84736ce020396fd1f3c5426a9dd157bd6d26f8012dbe96e7d407376170f3c68b0e03f843f0ba0c892de2d3dc5b7e27612cdc971a4b1bd85aeb77f410dfdb731d107ae17379b3d8489dc694fbdda084b891a051edee04460393d4172992057b329f17b4e14ce62b6fe681437b165830655ed996e289aaabd30ee451011c6573cdd8e37c02df5acd0c9fffbdbcce3e1659180bf6ae668dd160f988724055340cafda4cd481f8a88cb9793016aaa89bf2f3f57600eb230474b998f3a3c873eb204241d4337b42537af0cf389d4aafbc025b44c3e57742ddc43f80a8242201c4fea8f5079f18ca472963ff7d748c25926d792a329d94e81c490a85915448c050765e9290b23d7cb479cddd3460f5134ff71a19fa1dc27eb04f0e30def293f17dfb0be6bac8d4ab161c4af6e46d38832eb67c486d50fb05cec0cf6376fe845d6b1443760285ee615c802c5d364e04df7a1d3d7da962b38631036cd62530a7c54f8e5f19f26887647a8b13957f49aafdd54fa992ec25ce2428ee6c9b03289269933d89f9c453ba073b326ff3c001f246d137b2d37b12aa4101815e1074a16c610b9540047af89bd6d0ae4f976e55ebe8f15971e1f8b58d938b15567080a0e28a1dda875471b58282f764974f0d39f4143355844d8eeba0cdb187f76176fc4a91ed67b45edced33fe1dfc29e00a70152a9d66e15aa13910ea1cac58873a6b7cf9dc617f8bea013d344c660c1b2124b5fa16b400dd6441fb71cef8c724fb0f3fc31a0eb85194a64426745259c4293e054025c77d7c8e3e787a0f8f36efb2ef7ef4751db9d6164f422078e4d6315fb86d5cb1f7c997afd21945a197e67a6630302e7ea8fb4c0f5bb7dd355e5a646cd71d61dd573d804b8beef5e0ea9a3e94abd649f861665ecb5b61dc4461ef6278258d2b68a90804da0cdf5ec33eb624ca3f68432e72aaf24ad020d37c5615c018926e567078c3c107e4324dea0a20302ddd2d71b61f7b010f020b4468fd619bf6b38d2d9f2903a6d131396586896732db61ba6105cc1eb1bfbf711295ef2e30b8964ccaaf326f8dcd332d3a1aaefe017b677b617f1ff67d23a145d60dc5df523922a99f3501a6d0f8d444f9f6fdf167909cbb2092243cf7cca5d0b374c4e9a0dc1bf0d1fab22e2e654748c6c7f600e4490c8f21f82b0b0ac3a6cbd821c5f524d315b072af90c4469d23dfc91b183819e9648a5b3aa3d92489300a51ab155f3a7a2aaeb9e2e8b554133fba3d899ed03a782426b74cc232085445e94464be415d1c7b5dd9d807e3806cd99a903dc45eac9aef0d9f3a26fe510a246fc5cb81b3cecdedacd5a175c8d8ddf38afc8fd3c9d1116dfc865a63b936bf2e4acb8b8bc7fa +result: fail +shared_secret: + +# Private key too short +private_key: 1abeb7b25254985f0a3098c11d8cbca61ab61250343393e4b42aa75ebd4440219161949c844f919d1438a3b655b47a5ace4a47b0b0f44f59346ae1c2820612b8fe2398810ba962b95c7423a64ec122b2492fde768107bc739033b012d36fa27cbd6df9168f3b86d9505d2a75a97f93 +ciphertext: a03c51acb217497dfabc7839876370ee7aba6139e328d61be329fb05a2a91c42f0581ef1cfa8542017c5934d28dc6a3fb47987670174b216606a30b8b38638df5b87b0c4316bedf85a662ad9ad3ec76871622cee9e9bbce95d027184c6052a98b3833da48b873f54ad307f88dc5563838d51d6069bf63270be14a673efd4f29648393da3f03d01eb269686dac9a4cbf33e4dbcf4237e1d957827d18f692c99564fb5041395ff6f6951c43364bb7d61bcd06bd1843ade3bac7ee311689a169d0133cd4e709f0afe81171014e5cbce813cdebc0f6745c63a3bdc489f695d7b2b6913f3d3caf188cefbb569a209baa8ccef2a2e8d430a1f92ede589fe20302c07853c5cf98c9191c5e46b7f21b74114adabf494eaf5339fa8f7673faaf50b38aea119aa498b331a101659f9cdbe9c40969f196a176f6edd5ce434d7c5decd80cfcedd6ad8eff0115e08b61609509f9f41f22f6b27d0ab6742a5fea491096968a37c10fd4a9e8dd6f98f700702cbe78f38b92633bd6b4fed71ba138a4ec909b3d88f83f09a16700211096e237fdd430cf62a711fed8b3b2897fe4c3bf3bfd235befda78539bdc6f920ecffe02c1bb6ee436e21a2ce986747e37e25ec1fb18077b93f9ffbfd93b5eb610c8b4127c561688e7567274b31c55d105e0780b2f4b8f7e5d78b4cf7dca14de411ea01424438b72c4ece7c42121dff9c75d5741f88fda6be56b059fab2498d13d54854909daa4621f15af08b3b913937520823af4c80ef4e5c7d7b0e593348e62441348f02562c18945f20ced7596d6554ff6b21e295606f435edd1d030a910c4a63e7aefb7605911cc08a9d4308d9a5b2b1ce23d40e155c556889feca6ca3f251f314116292253ad027960eb78744d53aeb700e463fde4466fdd2b321ee9916d0d86a2c51a66b3f24eac1096c0d0cd0376be366a4f86e5ddfbf13d42491648c21f11bd750d5f2fb5103e6301ab34792c458b230878bb5b7a64b018c7ebe438805d08dfb1f921547c0afdef6e5592a2d93f616a1bb347dd9e6d84ad869a88dcd59f2b1060e13d58d2fbf66c43caddc9a97bb166b7aad3146c9c6761c9a0448eb53988adc5d07010b97ac8b5b514f0ccae70397e0c8d93628f16f3f7c99aa1fb6548fb9e380f733e3d497a9b7f66e4fe86f3911de1f559a25a20a8609d3e785198b8cad9ee3b7015c2e8d73ccd4149012fe3f2ae5d45e24e504cff0db5e36e881ad36165e458deb3da96374ebd430bfe0780693dfddb3315dd27998a5133f59a24ea14ec097c07c5ad5f179d15c9acb6ecf759133be9d345288cb222394d1abf8a8cbc837e9de5fc090a16297b5fbf20edd51126f728d85586f69feedb4a343118d0019b9495b91c514bcc5b7ccf1aa7e7f6defc3f7eaf9a5f3e983171cbfa7c1873d86d323a74af2ea4815f557ac1da14478bbbfed41b970a95583468467d603cc80248291b7983e9a26ce52dea8c0e4eeca5a19e730f4428eca568dfa4b08d9ef09c4fa0e7673e02a624a93e2914652f9f4486a3d47abe6424d3762dd7c55683bf04dd7fc13a325a8a238c65b9d18c68d12cf6ac876a5c556c70e5aae0311fc3c4aabc0af8f5964c743849527fc2713e870f886be880b6f68c5c764585238282dfce9dd7ce5b85ca12b423b639394d8d3e252682a46c192ecf2859cef44231514a993fe48948b5d1ab23560bb48ba1ca79d8bcfa77be1e4eb6847217284f82b6b29c1978548a83e4e2eb739dffb3798215d88f07e40dc3cc15716b0d20646d9122f0de177b08bb1a2634281e099b722362f677785b7c05c57517d7cc0e8d22f65e95042c008ada5045b219df1417df09c2c073d2da24f2f292ff8f44558ff6c882e4ef9a863cabe982b05e7dbd6f0e185574f2ca2db6b0695a585dfff237f9d281fa1219a3698d8b46538e78114688de68b68e53f629e5f40cae7ee7f93d34c842c139e2c3d9b5830a4c5b755fdd1fe1cb7a0ebeb66075c61934818b6048c38c89e6c975dd414c67a6c96087f082efa7188db5991850a9c65b1dc76273c304ec772c626c31a6ec8072d4094160311e2c2c7946ab0b240ac1241d510ad4807f79e72a87c900bc5b8967d6bb82912049bf05f282edc8d2f755a038362014920cc7931b546eb80befb91ec712c74dffd9e19f5b5398cc00c99826571e4684ac1ece2efa33e2c67dde4f05e2a297c6200651dbfcef248241018b3 +result: fail +shared_secret: + +# Private key too short +private_key: 200486 +ciphertext: 85d45d88132e803e21f4ac300e3b30e64af9567337c2e157c45aabc946fb2edff08ce54a594d9d2a59ce79cef48610678107c51bc1c6dc6c06335f64c3f57a5594a4e8e4808d54adfc66cf64e8e8f5770b9d2ba1a747e525c0aaa6ac3a60cc7b4c1d5bd821f43551dae9caa2530f6823424b735a49683bbe9ec55d6fd02dad2b341f63fc46692636c16c2bbe0a80cce636b773e4cc52ff53963024b9420e5ebb5fc8b514c07edb1d1c9b765b1a356ea85bec514fed8008af999ec666e7d1908e40f0951acd09fa08d7463ed8d162ad0b5a941d2a59a32fec3795c19de06ef4ad1ae7b5176ae96aa906538d76d808d821a01c933e8c74d91d5666e479cb6ec956910e1638d5728536641faa81ed4d56e44200a8400eb35734e0cb0794b542c1be64e936a98d28e1675f6be05260c15ea7e05568f3ad59de8587284870948ea62d6192213f0c9d590d39e26731535c8708860b5119c3bc5b66562a1dac5f78d8d6261fe49370e7f4196f38cb161fd8934478fdbd20f66a57253a45dc5d44012cda1f9604586c25b6bf43bf87ce9728d300083a20f6fd1117aa1edfa790bbd39f8c48980e1cf362f9bfb6b22d8f84a700e899f754997034a06a5df580edf12692704e39a69f7b3d1a553a44b616c5dce6cad13d9c4fef4596841207afd9e3432b795a2bec777311442cb405e955ba34869af82d644dd1a5414b71af6b56852ec051dae0c92ad0a86b0c4e03be656feaf52510c1a3f3fc949baa8e8ef0b60e237513ca8361e189f7feb6eef922b0f85ec971edd81f3baf8fe9cdec84b79e864461189003aa0be9ca4a241ee9c49468fcb68d0d8019075d6e1aaf09b49b3495733b5b0026dab0828244bfeac8542f415f9ea1b00e4c42f456bcfbfa23743af8ea98018e6f54b28d6addcdc0263e0f8c926ae7ab10275954461e3dcff08c843a38fbb4fd41b2dbfeafc564b5fdd58bbd0c3fa11d99766a23af371c6a88907a930495c3898e72e4cd09ab556e923b24fdb527d75d5629d9392c63954713cd62c4358a6c584da0cfaa5bfd201c3bd9c52a323a705a4d2feaef4df4a124e5a0f6404d16c25463dd396e454c2a7cfba47dc4fc2f8de712db8cf512a169029ea91c878a9f9eb1f1cb2bf67f06c67c84c3737a7c8267ca00a70ca8d3b357db9cfa3f4b56d1107112b49c98190435426eca9333c5805a848e83834e9c2b3eb975a07f85d3018200c654c9db3c589b36d421893639cd0e3fe30869b594c663e4dd1680f362806abb263db8bb961a64305a75a15c7b13fd5237f3c8d040e0586596a5f177f078c4d9f3296b90857db7bee12ce9177703f29e0e2833907a58d760e73b5a158fef535dfa12a3d0c30a2c58ddb8efb5e347746272cb3ff918750fbdf5e7834bf0cf3a9c01dc89fe7a7c47b66256e0a73019e51478a167d9b48248b8fe4e3b6a4dbcb8f25a23cf0f5093b98d2a60e535b0d2e0bb3d0e6abd2149a20ebf783c19184e1dc4d58818591703e3453ce6660aeae26154bad7df5b70fbf9365084d8a1526d3446ade928ee4bb72cc32529dc5739758737d14591c1c7beaa86e71442e6ee8a243f0dd924834b5775fe3279416e62b4213a51a40b60f3873c52db2d6056f4f81ffc816f65ea18f35f4fb0cc50b671d5a29abf68f49f49d6477f8e2ff93a81e9473a80747d27031b6818cf62cba6353b6c48fbce6528c36149ca8bd60c72e55a5fb6a2ac4c511bdee4c65b146c1c89b68628ea6b51181916b187c3cbd5971eefdea3abbfd51e1c7e2a7a85ec7ac5c8eaf01ab17837ba585fb8d8a13fb7b91b56ab913dad8c48a328bdc0d86131fda65a3684ec710fb8ce301e3d54abf4f2b534e896d33f4abbd831540559dfec2f956227d3574516477b54dafa697a29457cbfee84fd545742759cc4bc04346b356fc36d57cf33f8b0c14c26f68b4260692ce7a47d76e680b855b1e6658ac28cb6280a06892152bf3c9193946d59926f51fd477a30665baf08f2e19a3cabe106d572b3e73b3483428fb1273f6c80e0458edd140ffc415b1c909d397705b8f7cfbc5609a45b28f79af96f2a9a5ab9577c45d1f25903d8da70be540e537759a37500f7a46c8025431a72fb24ecfffdd0ea4ad831af2725907c0d22f3137e772a421a02c3de29d477d3991cad1fbc458f8a600731ed0467009f59b56d6761416d852c967029746d2ab8b5ae8da21e3f385ee8d48c32 +result: fail +shared_secret: + +# Private key too short +private_key: 42bb8f194cfd802a772c073b251eb67a8179106c37ca242b0334e269400ecc5a356237489645072bbf34d0797a612fe437991b22884239a42db97e84108b886297dce7bac4eb610c68861b7bc418e766f22bc73812c28b2c1b5a550d9974a3a3e53a8a4676703363b2444b54e20cb930c86691c99533ae9ae4c5f7460b4c9b98089ca7dd82ad379c28a3ba44dc67cf9bf52f7ce44c31285894e35f8d09c856d109062c45fa26b002d08ea11bc925a33bdee15fcf185875fc99cb360dbd602d95089b2422593ba7affd138047b966cbd80dc1d04da19bb8d135330a666989cc13930a503f888b9b9b7e3dd9247b7318ada93aeae3b3 +ciphertext: f5708ed5b8ffa420f0d65cabc437cded9d4eb099df8aca508410cd89528ce4451f587b74850f1634e2f3efa3a15668cf66b5bb47ff497edbad2023f9b0d1f4c21725a0ac3f9b3003cdaf6d0b8be831eb2c0dccf466398241701f5348036cf8c1b2fbf0aea67120e41581d236785b1346abbf5f1d4b761349768f288291649c4afb7914ad1223331d247e1dd4db58c9a5b52e8299fa37776fa99284a7503d3ab8d5463cbf1badbd05873d7182b1a12ce272fb55edfdfedbc216499323f23c5705ba6718f030abe31a3132ed080d62c82b581917c28cf31bc486a6f446eb8a212165585129be4547c8660aad725184b1fa22992c4f0f89316bf5cda7c20677d3cd4e4f23b008c65434b5bcbd188652f661fbdaada750dac202414a49ab23d3f11e3585c86a978dcd1088d3a3426b6148dfbe4961b6b7bf0cca81689787aa8744119535fe6e9ff5c58a70c50d7bf10fd5a318881a4dc3af09dd25f71452cf8f8f0f71b0312f1e504176c8ab4e22b8b963fac543f0b54687cfad8d05b3808be9deb3258f94e0b6c7ff6b96e374a09e9bc29d0698df305116073efca195d0167f2637e1d4c92e14f2298f3f856ad135bdf8c55f1d6b7520a484c793fe07c2aa180df0874d6f59a013c6cff6d1bb4e2a999a04f5309a068d03e43a4fbd46e5cf6d6900db3bb739527ed27e05354f2fd0949667b90ba8b099ae24c0cdf22bef1ef2d81cf368ecdbb924db0a9610a6e9edfee73964d9b1a9af47a551a96c9a38688ecf01aaac04e7f56748e2bff8aa9beee6b64fb0d6a7273cffb4c45218d75e314f00fb6bdd17d8b9fca00f7cb59f9a2514309f5d2cd854abd947a91abee5136e0be22658adb8f07a3d1b2d6127f25eb6e74a6b9368efd696cbc3a01be1aa655502a3bd46038279aae2b584032c11ce3102e80b015d299a2964536639ea4126fc894831e986fd1bd2267600b9635a0bec6e4505f8945736417a8765fe57bd4abd84686c716de32e2ae96588a1352d641a299122efc2b443b63843d3942516a016c4c931df4531651319b675cd48919dba8324d03eecde3a32c2b8155925dc3118779aeac3ba4da0519d4e10a5549665e518ead9e9dc7f97024c113e4b5dee7b9251a6c97e287ed9b8ea99b97b51de0f77e364056a4bc4c2b3ea934ca0bd8d316f5137a4445aa15aeb7fb906254f777a8725baebc18281e3c80362806718363e97c8532c5edb6dd13e4c99b7999a1146da94427619a579f32a217dbc99d874036a148b8c9d2db2acdb8a7cfaa14ee4b3d0e6c1f7166aefead0346635a045755c761fb9e989b75ebb0d0cc7378bb846dac71b22c12f9f676972fa47fdebb61b3e58f5a86ab564be0ac7ae25920f76772b74b03130544801a8e9398142b59cba5581c2f268497a4048e227d67d7cb04d88e7e72eca2c5ba1363bc4f3e8bb0949672cf969505446e481a389c61073f1c77e8a97964d64fa46788a7e079a829ab64e981b0cc34b2461f5b862ed8cfc7e838e7cf69fc02d8c78f7b11808cd0327e234c3831486007e1f63a72a482704c7d8ec804e96f2bf850e9fadf7c09f2119738ece8c73a12990cbd34899edf3966278a4a410e74d217ed582869a3808a079261fac2b1642aa3f285c4e7179a1a9871e2c0dd5b38e75b8b3cd12fb4f2120137c1d57f49a88caff4f4453070013852cce37e93e29642819a4f25afe842a8e712f3f5720c66bfee08f4a2b49a300aabaca212cfabd8558dcc4cf431388478b717ae51d93b852c2f1d54eb7ad82598800d19aeedbe0a0dd919d1b9f5a5be46065061012c5021c975e501510b09b14dad90725b7a899933c7510ce09060c5cce698a1fb9f9565d10c784ca440b0c370786e648751b0c6172e1daf43e7e85ec560f21290e5cf904337ca8a0d3da950c01a858f9597d0ebc189190388b52d642690d993ae9e7daaca8db1e5bebd4de60f8d6ab351cd872e56ae2316de3349634f3ebe550eea2305da477a986d0b49fd4b584e2ca9de39276014c119d7493661fd075a3f5ed00b42ba4597587fef183527b6db92eded63977eeac23365e0cffccc85afbbe63c3a86f4eee94587f06d9b630f1ff3e086dcece458ba9c410b7445cc0dea7a8dc6fd31bd40449022c99840e20032e43e872493a0f56a2635c376bf242dd423284d6ec24e9326f5bdade5204ef5a98efe31107e841e1d2b9928b0b5eb441d6e171c04023 +result: fail +shared_secret: + +# Private key too short +private_key: acde6d0092 +ciphertext: 35badddea137b4f2f121e6d1c4bd8eae148e61b3a050282e12e03cddc3203b81cf89e1c58cf5aea241062256609321f41e4e82393e2f5493316f36df913b80f6476b964f7f645436c86a14e522a6e5b49377051918c6bf1cf9ef2dcc33b3907933b62a1dd0e1fc304fd284f7c5c8377142695898751dad4b0460b7e7c1604307dea01a0e10b3c40a5f7a80b9960ec91b6ce1dd749568b561dc1683c9d88bbaa73c40dbc9863e7d33e783ad2d0b63176c561dd497690c36ce1089ff0ecf59e51a96026964418ba0b4bae40f9d6c14efbc5f238cb406bfc3f62fe8db44a874e698e57066f1c9bea23062eef3c5a62bf3c8f863f6540977bc603442f1bf7cfbf3d976c3e09e3afa06e5ec98f836f326b685a1667741b7a0422dc485c0424917649eb8017185fa070594909d09c0a1032dc225e557f75248b1d567dbcf765af711d75a2b984c7d4293f4555420b171c3a25ffe07c16baf1c444a643719f8652d621631c1d5c46c8cf536c46d90d96ea648827c29942e2441e245f3e61c5c521bd8b12d1c6600268b81366c947f23a88fa5249ad0a5b79b32ccea6dc7ae93c0c9cd1a6eecf1e8274ebff756cff294bd7bb6a78d004e103cc7ef740fbb8cb14e4f7c53f269d4161ef7715472f7421892ec5b3b511de7bf461c8d581da02d6282f3b4cd3c5b587a983c4e4052fb975d29972c9ede504a1f881fd540241e66f318dad44de7a3b1025fdec664dc8bce4f08daa8cb83a2486cefdc48d03fc2622431eb2bb52397496109c0d4af80c3731952eb34f38258826c4aad54bc6a77567955e84e4061549d7a1db32d4de6796694f41cf3df881747779cf522089fa30f54b259bc02a851f372852da97ff049c6ba9fd5d8b8ab0d30f78d97810e30514a5fc70e34add5b74c5f68764f04955970916d07d61fd508e80d37b612845075efa4e01100f3cb6d57aae9b409c3cef38e0014aa07c053db578cb1db65dc925478e10ed33cedcde9e41d59f2511d4a30d98b56c21d484f39d7746c9800fe34dd4e05cfe573206a16168a6c507450d4a4be208e9022f55b4292c72ae42b4fe4acfcde9088ff4c43556b9c1ad047b9bf40d30667830de924caaaf2613c72293ddbe0c24a86ecdc586a9198ad3a987a36e4c9cdfc16235f9141145b401679c82fe98fb6d8c431e558b9177617e30139dd1ff2b3145c5eb9118c88f88de770281e7518b41f94b500959a2b688268b272cbac253f3b7d2c9a195356266be2175e2887cf8e25e2e5131994b773ec3270cdd585de041e5f3b7a63a7865a752e2b82fc4106a26ae5bb8b279d6984066c975d901f143f5d56b0b576c6e1e8e1fe3921190b06c17aa64fb7cf5db0ef301e413d5849db714b64305ffa301281784c4e479c3368320e1b77690a6cf95e736da5e3a881746218bccb913bc16c57b5b0d08f0039e8a4686ad0c3c3632b48fe40a2000d85a8e9e3549b4b1bba78a55eab3226a3f7b8c2dfc8841a08ff3f964ab03169c84e4ce5d49a7191f642a86da457b4260d7edd7ec08d9cbcb403b3dc37c6945d1fc75f358e253f20715b769abb5f022ec70da9a552c79886e5164e812796d9241f9bf61a5e509ed77ca57e0caaf81b3d11eec8a4a7da4899fb1adde712bf455d77ab0d4af43b387dce7c9fe92f36fe42a12a50e3ec744a5f8b568efd16731e240c5aa0ce2393d5ff48553db5383509c1b7503b466c138fbc029b877e83ae1e58c893eedc75f918d0aff7d9fe9c480b6acc76875a44117c20695ac61403bf26dc7267d9d69e9afe30c147c1d447026f5cd3c2cdbfaac79b30e9c1eda5e07ec4d8e57412b679caa3238b7f1194d4b4b661dd0a99fedd5efc3f3fd2ed4fda18f1a596bb1c98a0ff82bfd7f07b3e55a929c10c346b9fc754d8a8e2d4a0e66f847bb63e6cb166817c6ac6619aa3400ef6d0db6deeeaea64335ca4719a30645e542e5447e9853a8d64c64ff06f58b5c642195575fc079d13cb055c7679f817b3ff05c644a295f304b55e182c70d8f740732ca26a404e103bc2772dca716a458c394facc9c03ee9ae92cbdd546f4abfb3aba9bf1cdf1230b8da8ce84537e54007e65e8d23a7551eb7b8f81e6cb99ee128543800b765194da6e92bf08c4236d9a0cfb782ed109f107056d29b352b4277ace2af529cd85bc1fa5e8fa76758a0a3e6215fad8a7b64e0a9ca8fcb4784ef9ca83af889572600da1a87bca8 +result: fail +shared_secret: + +# Private key too short +private_key: 854d758ddc1a57b44cb0f39b0d91f2cba355946ec07a456166af892b435cb0a1f34c9342135d7a1888151fbca80fba4792a88288da2794b2b89a1a67b55c2504f0956e1b71cdfb478fe74473cd6badb901ae1e1abf56cabece0b7aba96a8502100ef3738a8746f0b762a309c3e81852fb185c078c633a6fc264b1a8f55fa7d4d14013da3477879c9f2a03d9b869b7862ceb84a163ea00f53f47147260d53a44185f0ad972269be8a85f8080d031c150eaa2d2cc5684e0aa83fa0ac479b6d3fe118995a6983d9a5166809176c1b3ed614d1752ff94c4918b189237bac5632 +ciphertext: 2e87cfa58e20b4b86f3bb3075ffa8bff67c087b0fa15a845b17ad77b62d99a52748e9f410c9ae221c108ee50f00eb88272208da1ca2b19fe9c04951c58b417edd5d358448652468c4de59c1c03ef5279441e47a2318890058babedbef90433c82c0b3026a4dfb2cde737bd156b4bf099c715986106775197a64e9ea47e0b56e434dc08e4bfc8fa40670ad0d85c97034d0b8783850e52913472482676aacf436c27ffa86e7b8454442e5d4f9e948773395461b6dbafc1133fc4f271d0bd741bd833f5d96b56e3a2ace9bdd6461f3c0be2e15731e62a97e24f744419e942037a991ea3f832e27acd1c00d3367d26bf2552059032e14903dd5e04345a52da6cfeb8c6757be2af1b9a2956bc584e83333b8ef0481d18f1b2c1df9a850d368aba59b5ab53f8b5a09f1f6aa9f801da2b210f3d33f435b0376d058672a6a618fb6c9110311d8e6249bad19e7ec1947f038ea9a315667ca485f1d786dc9417d9057a1a0f1eec83f364d6f72ae57a5200d54e70fbe4661b97c6db3648f33cd8f3e8ddb8199305a4aa4f111c879dc274eb24786bf4e14ff4c0cf3cf5232d4eb3bad45f320fbbae76944c7d48230f57ce567e8749bbdc06cd39250ad4b2a4658646cc1d5cfde359c091cc71461f7fd45b512419a4c5509ba03a2fe17c098842d31327aa42651352c1acd86a055f9222ff6024d0abc44148b0d913a55fb03fc9ca57efaedb3a5be323dba66d829105f0dd8ffbd530cd9c9c64fedca4b0da54ccf44d3ad6b3c3d9af85d068a5ba30216d05a1afec314983812508dafc4908330b6164034255b73bb34f5364e25ea8ac13bdd1a604b55c5aaa080b69225f36df2b9cd1eec8d19907eb29369b5ee44be5a958d0edcce82e336aa1452e9a3f11cb1d83eb05cbd129894d183dbaceb93e627652595226739438a59de1386b4064a27e7381df04c0fe2e0979a915e55ac77a84b67dbab7bfe5e831a770ffd2a70dce2b435882e54284b626b110efa39bde7028043824363a7bb1c3d139961a0b0ff7b5151cd1854396f1d95710ec4e80d7a17ac451cc6b9971d94c7542e76291d0966aa8e824b467ccdbcd4744633d0216ce486bfff14e8364022ce73853335a2f57b7efebfd874b16c0b98566b001665adecf57c60121b4db4b4daad1db27f9de346b7c707d73c50764d1fabc8deed424d679c38f3ead2dfe219505acea7348ca503d5badcdaa45eef1db45f1166e065456374f9b6b7872722ac5fb36ecf8ddd7b472c7c2544e30cb1fb67dfbe0177ced284e1ed22b8b7a328ed707e9932da82e9fc8088029aea71af51d5a81dbd1b6e221c0eb6c9d6204130373f89a3b9a7f67fd62be22431d0db9146ef02aacad312785e836f1ab765e0845ba6fc5240b596e63465f49d62897544ddd0bb8f98fb8831ea8f43541ef356a9ed7e598cc7d98b8e03e68abdce9047e1eaaf312993ff0694e6f909d7e93b168cd006beb05fbe67ef6db1a3ce479f9ea3f32cef37ed88f157930b06156a371aea6b7e967bc205f466f66e5498b5117e32537e86a9c165b9231d4dadf5b874ce6af7b6ebab423bdcdf2dc3b7414617b651ccde9fe3a2e45055d124f91ebf4cf5637987d37fcb2a6933f33aadf30b804d56b5af140c5e1d4eb70ded2a52ebb72e7b685c7fac7f385560e5f2df285096138c4bfc6f7c2174ac4ab7a65205e27ab22ea10736663d32c757f4c538ea1385590be4e1424ce02c124aa7339d135b97712b853cce703bc7643c2f64eec06c4f0f18fbfc837c545b31c6b4773b93006542112730bfab2351d11e0c9287fde265477c2368d04e81488d20c8c0becfb249361d489a832b51b6ba1bae557a412af3f7aa9bdb85451968f106e2540aae813cc33800da3a5c60f641b89780427c8ae23e4aac3e5e4b9192275b4190f3fbfd1b0fb33b5c6c953c98527fe06260e9ba66f0600a85fcb999730b29bd94a58213c19c3fd0148be59cf67a965e013d3fd6ca53c0ef3714748baffb4f52750c58906e7d03fead22e3013c90bb32b2816a15d7aaa11c887d1dd1b61e906e2129c67baa7ff9f3cd30bf5fd47a29e2133721c4b062de465d1e6db8d0d03267677180383526d963cba399b4274f32243de160a99dc07a5d92a874f2a45422f3334dd0a205d92a654d30b986645fe36586dac0c9cb4511a7eba9440a5e22368716d6525cdae619da10c0f3bacb5444cdde3492f2f8de0 +result: fail +shared_secret: + +# Private key too short +private_key: 3c5d5405a7a63bab8b51710e1a63704187163c7549cbb5d2227220c06b82c236f6582215c63d3fac46e82ab1a7b11533db83435b1c5c35a2db58570b75488ae844f78378c9f6c59c248f86c5246382954752959b8399e1255943588bc3f40f760720e2d375d581b0711c6a0b703946d94dd96b3b1ba77a85b6b5602c272e74a23a912e5aa78d1867ae5d4c4383593cd838ce4766c488a524ed96b6fd5832dfd35645e5385bf97ce6c148bcdc60ef8718fa8ac63dc23038330e53074690f728655011e0a666d3b15dae632b04dc2c09c74fca06ce38f093f4529e6b728feb896957c10014d702b6b7915a651f0d3a02a46c1d200ca8278c1750ac6f53596eb2619f2f70555732cde1c1baa3b6354e943c0e1b621d9acf1730107b965847c6af3614402f9c06529b6b399082ba693dae7b7286b67c9e902d997301a7d5ca5fac7408190d5d8082940c89c7661b07ca03e031cfdf6bc8a4d41a68daa6dd197ecfe32797e336252620cf22752ae63c64d94167e83914a8b4d5239b172c85f7d0229f00a5818543b6645d47b70416ea036463c711e4539a34810672c945f56e3e3367dafb087586725e964d57519ecdd3672e79c9467b255bf90343554b86cb16dc96c99afa562b516815680a70bc0977517f0c3447d3256f4914a132506cd447c8780bb846950239722c4a4a3864a92a75ba60c9db88684aa92e9426dc633c87c68d069502d0f851559b4224189e1b40c364f59e9a3bb1dfeb7d42d46f93827e2a5c305bc98f71a5c269895232db2d6fd01672270741416f6f677432ba6e52a4c35136127ff733896ac9efd7b386409f0d071e3e44cf0c8a5b8e66c3ddc2864315bc7260b02b2a0c5a215a45f9624bac0e5075c8d6327fc907c76a2405a3c96372402e0c221fef662828999a5679142d05ad9240ba96f645b5a022a6b86ead58c7bf3a2f1b30b4146701a4b703b77b75bb746c004c811eea59824cb46b92995394c6fe057393c01c3024463c09aa7a250c52141943b5bde8807a870b1fa5a64693e48c2ad43fe5166e4bc1141d6c62404669f6325fa90cbb9d34 +ciphertext: 59d2a996428a6ea00ecca56f866b924d5cc36ba3f1d6dc03bbb02340776e14d4f7c748cffbf3384bef25ff4ec356fffbb1411381752e860320b0412bf5e8b397a877481a5cc318d89e64ec2bccba10547e2d0f6bd7f65c22804066b04478a661c12ad97f1f1fd5c047112218b3288d1833ac89375e1127374631e210fbe6c6db8a154f4a47d21b08cdd1c2182f5cc00ce6437f91075e952791486efc5d8d7478defb1582fb8eef016b7aa3960588e1e898898aed4ad9126737047cbb6549ae3a0bf08260d5c38fc45de6e1813c3af63ea3258164bfa8825752ffeced7ddcfed28823b1bcd3df2d1a50b1d4206591b3af4c0cd85d3ada783d30e370ec7d39a878e8c823a0b4900120624a338140bfea5d672296077815b16f1e8adadb42a14864fa23d29bb3b2e43c529e3e36c05a240957afdac1b68efaea68b8e499970daeb642dc9a1aa11ca0c18320b17de1ad0637697af7c310f807df3d95e3ef43bb74c5f92dd0df89272d62bcb46f424ab115c8edbf4a493c21785b7349278b3f2f7a9204e51829a405636804756d294c629c977ebd271018b10307ffe2137a5bc768e66565eda91a13783c4e2c9277b508f5772be1a0df02c22e2cad9ef3ff1dd1a9df88b3488710ce0229a3d275535758be9ed4263b1a8db327f5706a537f46c8ad36eff5547e898c3fa00e29fe9d5fe50d60c82ca17967f1a541ac7cad294527bd69e9adeed6e779ed8308a72d8fbb5579c06172adead047042012457420cd882439ce866529e1437aa46dd0f4e5d25d15ce2b523ab831cf8488906ad74a6734fb8122c25929370aa76f5372e5abca9df8279f67f040bdb382149efced34bb83b521a8b2bc0ef45ddcd4b25baf9cd3a759c26b8b062e6d5267251903bcf8889a08f7a949a5a92cf406288b9aa471d039c0486c456de6e33489ed8280540a817aaa70146224492230c9bcc5e8dda70f623b94f97ebbf90d6d61bfd6ee3ce994b16be9ba390d6181d34d3e8dd50de413e51c13fe4f0fe41b96abebb5d07be8141971aa1f357dd9878ab17527d77385f5e098e08433dacc6e5d1a377364e8036b3b59b9a890b7bce0695f9d86dc8e830b274e5e28459ccf5d5de97c3a06c0b92c690fc44dbc353c93dbad4d796e678f6ae5b1a5ba006e4a97621e0c80407dffdbf28f2a07e3f8a26dbdf4214e4a1a2b3f9a886219c59b20a1238d2cf5fc7dc4bb5b51e2279f5f5f517177a7132a3fe88a3a11b68ec8071cc12a28ad183c5e55e2ff8dd6f4cb5203bc44a3684e9193e1273727914f3094c243fea95b4065c4a1f2ec77dba52b9d99b54b822ef85aafe8b1ba39f89bd556896e886b00c4387316db23d45b459cb33680ea97363258b023fabc5bffcb7059c82512d5455585998a0bd937b7889014bb213dd9fb58610b16c0b058e9c9472c4e6ede771c1cb93b880069e625564c56e2f172e8a66d94ff0ebed29425c34817bc76b5feb778f76902cacc1c948f6ae93b11cec8c2da420d18ef673f89a5952631feabd8fad8c2700d3e25befe67fe8df7205be2f8e54fcf9c5f13d98801c53dc4224895d2ab94d78f73491390b73e52d363f18dd91671f00561d5e184c25034afedcd577c1e10d9552e1d4a59d8a935c94dde058cac23bb470f7f37f17ed0a47ed4a1ebf1e7dcddde1cc95b3be4f9fca120a104fec91048e0044e7c6284ee4435e37f661bfeea8555a3eaf724763d2a0ecbebbb9aa3566bc4684293c289ce81381ab971da1e4d006f521a88ea8cb54323b67da5610fbcac8fbfe0304a5122c2136ff96c6522b04ea866102f908081cd8833bd32a8cc64c65ab7f1d093c5bb3d843519bdffbeaa62fe4e3ddb1ea7e8a338964fb9f677d50787a099fc26137bdbceed1a3228e2f42a2f3fc86241e7f7e14812d35f6aacbeea43ad65e33c9dcc9305d6c32c7886edf40b600f168783bfbf7a81b49743c80e767db7c5fc3e893b761017b4580ee9b5184557efa26d590ec5f6aa7e8b4a54506838bd2edbb2930f312fb7f1f1061d71c1ce22b681531d2e9122f63d0ae33fcc334890f8d714d860a1124aefcdb98bfea081bb0c4855ad5962c1643ff6adc9e1c07160cab5b3effbb4ac8d93a71d464cdadf23b28dcd65ee27534cb7bbeee9071f8747366a0342a3c462d62db29f8c41fe2c0558174106c3bfc72fc7c217705d4ebb322474d09790f79de44090ae8c6723c1412542f0 +result: fail +shared_secret: + +# Ciphertext too short +private_key: 627201e8163d7ef175d3da079bdb38ee548d2aa248acba193fe742ab647bc12bc27e6399fd580ca4611df1036a880418d74764024cb660b3a8d12ba8d42ccfc8170e27890f6a9c8c29212ba0e55e6eb8bf219cc6b23b676cb9ad12fa6c0531c6e1ab26492935e4457a505a646c84c9e6b245d4a99e5404a85a488ff6aa395645104272402ee37159446d99471cf39ab002133da920a1aa0196b9264b1765880cf2afac369aac3314196a0ab3673dc1918e3ae6520242ad113722fb53b6cd540ccaa12c2dba9299fc3bda66438a358f35b822d3d84654a387d7b48b70217304f361a16b858b424ff9743eca658edd307b76da8f43366db90045eb2b6dce0b1befd0a46cfa54e4e4c6aae944721155b1749bda5084627926541590ca19a0814ba21a4a851ce9b08132083a08835e438279934629319ccae577d2533c5605cfc4461a5e590b432c1608599ec1f3290d25c18611a10c98bc4e287786265736460b6746a96a4228bf13722050b3bf822a4eeb114bb96a9329cb04060bcb4a4823a59ad26143a8bbcfd43b15cfa758e911263ce9c92a20c6b7530a1c74462513bd6f36099d9118369248355880580364bf1ca630581fcfcb1847282a0f7954efe074497b09da719b57a4432e35b0365611392032e5837b78a52fe9521dbc06928df56f91eb703ec6c24362c69c47678db3ad4efa593fa6974298c7ea9c369517b1cc38905014792482608de1cab3ac249219a52eb0b9fe13385ed7bd9b7c5aa22b24b0892a8e19a061a6141d2047068a2f680b58a7e5cd74c3bc306b63e9603e835112b5fc067e522686451c3260759ab157aa9059da01bf7e7656eeeb7f16d9a65d77c5faac0e49a4bc44e9cf4b3794bebcbd464a768929a0ff808ed659b3fc0c6b319c416e009deaa3a9e8e6a608ea1b44e26f6ac7a032333ebdd57c743967087204eed6753a3a9e19a41020d274fc68c442135da75557c9ec31e4b4208264867477c5ae47b4f207c86746a8846557b4f69251a11d64e38fdd998e025a2d1b0923f65a5d3f222ffce046e1831baec73a5504a4df80aafc68c4a24677696662a44aa23a31a9ab4061f6b16902539fa07210aa778a1e3451b301afa9e848c0111f78b3094b9964e66ba4d2d8c67ff88c227775c29a93d28c74f13b7c29ca47974178027c3badc6a35bbc031024093eb74c87c28de568bab5674da06b9029555bfd296517815ea8fc5e91566f8ba7694ad844a6702510039651b40ac651b2c75169ad5002e0b66b6e0a1d56fb0d1ad0aa7f83554ed036543641d942b574c261c767517d54a66a402c45d173009c3a1a0873b9b87918a2408f14be87e734eb8b178d27191a5037934ba9c1096a0cfa247f236c9b62a61d2c6973b489d210c3e23b77bcfb3d15480fa883ac593b560c83781ce453962b0310868c20bb01726986680270940701d07294dc792854c20af37b4941fbb5213c3c6a6abe3c5139e3734ad6181cd3d258a2925e9675941ce08215d03fe0e713ad152bbc654631692b489babd19c1368a9af95e6c7b2158d67e9250959103ae9cc9f899fae56b3b5097fd47a438f806092b3cdb97133aa359a22f6b5ca615d74c3582b646cebc64455770d39f9b66c0a79dbaa1f7ba71deacb1d6b970d658c2884ca19fff3c9c8153eaeba34cf530b7f68573de31a602ab3932ccc3fa17e0822649adc6490447d3d6733ee090f0d64ab8eb6492d1c811cdab32b07c8b68b99ce5caa97d05b8c40cf3c179fd1b46fb3123539454b914ba492f97396f0bf0b54b4b5255db954cd78d9cbe83c57dfb3252d6a7a35d316be7582556c83b592cff2eab56b0bcc3c73376f353493627fa9f21d56e7c108ca3c0a56442235b3f9c1768992392680a6317296edb52e32c84a34a135d8f883581b53d1ec70c656cb23fa7de956890371091502b210852443da1501662f50570e063bc9f2b002790a14b01c7fbc268876b33a87214dc4aa467c171950c65010e6cb5d8baf61b537d7862c2591654782b7a4674076a82f21f54aaf3b9492201fcae9a05aa3cec05040e1d2cfa1f808834091609a7021d65ff649ad3e1cce0253353bc31d5f021f0b02373ff4139503160ea5534599cfc6ba46089705ea05168c4c8d82f72d12ba1323017ded550680ac29dea0698e7026283a1a71f796611c17acccb3053b80505721435aa137264eceb182ec3cb550a1b75fc09748750952fc555231112b005ae62c3c39805d5a7829fbe1992c029c4c59530386343682b9a286bcdd423e5f96ca0a7cc31f367cc7f724aeaab5e8cb4554bcac023c5b98b2631aaa42dd4960fcb977b7915998153483c169421b5a6bc0bc2f543cea7a960960b2bc23c32eea6d72448afd74ba67853e4f0c5adf3b0b40f303b35080e2b22817355082774d9e25ba60c79f737b8e0f0c97b8a44c9049881e2c824288cc85a4a898061442e6a4186637e00734d77b94bf1aaef534c3baf5c90c3a114adca667002208349994040f6a621e77c4346ed290097354d4c8b9e67bad3bb85ace57726e3125c020ab25d4bab906ce7a2a4cf3f16af6701bd0fb9f03674830111a0989203a363b53fc939a30a7dcc558d943a2bca611b48625c761c08578114326b258095dbd893f6dc79c03b6ac74511de9736a604a9bce7897d7bc79c1eb62b8f56c2aa50a2de4845449536c400157a20f604a13bab6ca5c717199a559294710461290a8b7a618720375983718cc9fe1866ccc38a1a7891b462ca678bc62d29671ca378880a59d81b721fa47a8380b9b1631854aba722a20c982e65c3bf269eab89fe164817db4adc974c63e260d7a957774285be4e3bd595443137071af7029ccc324036c3ecc2234d56622f7749b8ed9986972350fea0dcaec15412bce16d2bd7dc83954d75fc023c19d30a33c784542f0bb4c137456c68dc6b51350b0c5d8527a6c691813a216f85a1219d74e88955c03686f5b784950295723522a4f958dd913000a2c48c9d984b26a632944721750be22d0b4cd06c78dc7c27c160aa3d5bb13234dafaa9ad713207551468797846d997f4ffc4ed8e32d5d6916d8a29a7c768244295464b3bc459c8411fb08acb4818a591ab2508675eb692a3824ec460d553262be110d14968e129c6086326b82124a07e8538fcb73f8dc7a3ce909e28c9897432dc401be350a687aeca6b1094216bbb0ccaab18e41b1e6193536e902e93a30f43b6118d4ae70b3788370a1b9606bc0742b085a5768f593b0144c2dcc7a05d41f4fa132d224a41852c0c3b6b75da2000987509c32124cb0058ce35671bbc4cb915fee96768d06c6ec680842fc8865b03b0456c4d5918381562b2b2a5c5e309551ababf6f18ce6b3b431a60d43ecbf0bf0672464868b301e554119a41429d65a3e23578355d6719aeb6d4bf0cf98b6952a007bc8408566d65e4d503badec4db7d6b9de8a2c8efc1674144f28b02da7771ba161c3b08791435092b35c67ac95c58df12dd0c3c5197c343105bef13ba6e4e00fbe1b6d359c61180245141b5ebc4ba3370759f1c42af6f56bc332ac3d148f99138083d2c53f021e1d115256a33d8761a03a032cc6b10b13c28ad23c303b13b5cf48375bb1810c3888ebfc084904aa52d69ace006438350f053c53b68c3473ab0a7385c4e6943d9d00b8fd18afbbfbc2eadca7bab71319153d59917fe7512254820cf55b95efa031a61210cfba42353a84ab6393a88066bd299f2099705090b84f73be16bacf9f4cb752414274e87689fa4e73435a402c700d258456ebc4ac4b5926866010b59c136341eb6988d9e00c8e6171705510bd5a0e1ac51732c25a04663d2c995f2847994aea3a8b55af886a6dc8f20aac8652533264e3691a3e07c06eb70e4838429491764ed001e3198727d21352e7112d561393fc51955b48a6b1b9beb0cf4c58014d56239e209e9aacb6cd3253cd419b4dd28cc6763f0b23224bf40bed6a32ffb48fcb778954945acf66b67c96bada679214831b2cd40fa898a541ea63e6260f10f76cf2e502dd49664da631915b4581d1a628231d1a0509e0ec5cda574d4e1955844707d9e12071e8c98fcc6036d540f0694378a01f83b0c16abc80da311e3c2ac3eaf88d5b2ba090855b8fb272aed60eb2f678d33ac06368656c9a4af042c0a381a79fe38f51c5329df1494fb850d55c93b2d751f37061fbf25112f5741d2cbdcf5cbb60f54f42ac95b934cf74247e10c56fa7d39e7e15730389ab71d8345de7bbdc38b2ff50c9a871bcc11a547519a6e742bcb449bbd9d9a0757a9a0f962ed76b106de91f26c7be377c722de73050b562bdb80091ac71c2f8b8b1fac255f8465dfbbbc22693d357852657597328322b25cb36d3ec6b98e976248f6e46d2b26348b301fb9ccda8fc23adc5c9bfd80d880c0fd263b61a8d0968b625b6ca1d01d44211b30dc46366bff023894a96e3dd0454b89de274dba12f0e5905d517cc68f553ccfc +ciphertext: 37c154290fe2176cb062128655b31132c99c585416e1b5687704f8ea4baee5923e3d188e43fa0a64865886ea36f3ed6540fa4e5941b834a9eb13b89c56dc71a2ea17ebc619e2177f4650a8062ff201688f11f89cbfe02c55be2d22f33ce034e617cf39aeac825658f93e0d1dacce2da0edee71ce0f5398401f0a9bc2b137b012a1b2a96e7697ed0220fe54b8b019d6fe584ea0a4aef2d7ece0bf31286a11c99406e1533ade3d971ed90b6243b17abcddeaa5c4e12c28d1e9fc2064fdcf66491fcf226eba5f3a3e345b26804d01558872e7236eebf97ce7d31088ceb72d466d1597f4ac61134c9e7ccc835e977091a77ab1be40f9417ccc8545619d6e1ab94fa5d24b3080b4f7367d772f1ab2aa33d8fc8db514ebe2d072a11abc9dd953bc3eb6d385f01e023decf7e731ea22ec7ec35152a2b808370efd1764727bbf40c2d3d2d288a1857dde89750f1844dfc7ff777ffe67f1663555d3c1ecb734b49dc02553c9d4f7cde6cd653fa7602db8a0d0759e0dd4a03f3f122af3b38b499e9e687975ed8d037c73 +result: fail +shared_secret: + +# Ciphertext too short +private_key: fcec9a9b4b26d0ab9e46362248567ea3251d3e9c25da408b271138605b47b343270bf396ce052092ab89579c97d72bc627651f3f17b8d42c43cbc7c73a7a7fea6b9b44b902e25445a1d781d3d223f82a19dfc87d1fca20379360af7120f10306d1508c6fa8b530dcbc996543570678590152d9ba081cccb59b3c10ee74551034a52d755a69d54073a277b04c9004f0c65bac6a22d2428555cf030a7f85c3183ffa6ef16809497776a6348cd1255d1f9bce497951655789aee1568f789689e73633eb29f0948a28062fc08858c924b7e51462152219a6972ccd828f7e7b6de6d7b2c117b83a0692e3906c53047145d818ac6b3a133a0ed9433c4713cd069780bd86c9a9f579c1981d08d892bd52004104001085b5b7e1029a86bf88bc90fa59cfee6a412351a5b882b43baa755dd3a874d9aaf0676a68f2285aac96a8306d4a2861788973216a96ccaa590edc92c054284cc3a1574859a271bd38d18b9478bae42bc31204b20918a2ba775342e0b662b252943325e666c6de6b4e7c25532296a1c88c299df6a1ea28277248224b473a2df57693c785d918af86428f791a49bbca515f61149fcb061ea378a21b8ca2e932011a4784b34e69d8088fcb06b61b21b0bcb458e2a0ebb04ece60c2f114bebedcb9d94104ab732212cb3db5d090cdaa259e90960072c7d2285a1e85961830c06077158a111a7403938bf01794d13d33544fe5fbc03e7a941ce1bbf832a7329193d095a442435d6f3a60db859a68e51f4ef458707b9777c0231d5c6e265180e7fc8435538b45985f663780e70946fc33b37ca90b347c5595525f30b18824265185f3ad408cc30a73ac1d86c779e913fa06b12b1737896591123ab445928746a9b728a8554c1a79d95cc10bf62a070a38ea5680b9d82cd9561fb95b24b05b095c9a4265146186f512d7c328a5a7b491d42f4292c9c87abcb4282068b424557397b914b7b83342f385a854505c5fdb4ee59341eb94a357a567c085b60d49ad1676abc13c64b1a73fd308989676b102829b66235b686600016aa9c6155261d43884143ab2466cae572f4c74b9a7c490fac5ada1846096666837a902fa045debf40c9bf4a51c59b37b3977a0084471827f7f6151eb57509de6a201fa6cdf577379b04be687a06d4504f08ccc41f6c02d928441321fe7b65b91555f25a9754bd481771c87203b1b95569168e9c029d8b5fc1841cada758151a3ad53a9f2052238593b71cc083a236f6a8831d41094079a0607d58320a5be8e71c264f668fa6059f0c3c9828a186ba6bed51c050fd8a4f0a72ff67675a267506eeb09c8d8243b2a7e79a6cc39e466d674b4d7546e126cad6ae83ea8f00fe9873758f4a0270b5d0b3935bb709a723320192730520b7256157d17276e6ca81e2e30cc5653ce247917f2e4335513598d0306a674a8b8ba10d290697c0ba2f4b11917882977d03f48d17ec605c85fea2a559320697acb4d7648f7151e6e2ac8009706b4a78dddf8a5ebc40af0338d2fe515fb119c7ec23154f033c08571a28a8b6408589cb46a21359eb4e091b79b9e208272c5b1c0122a332291450cf6089fe8141ee222dd14b37c71bc49d7b035221f950978ae329889145b8cb72aa8536cb8d95d9e74a7da1478e5e93a015456d7b93d44458710b5a5a8a048adfb8b9cd165b0687377da4cb0d91408c8ae8ff48b45155455da393c882777963ebc2c37e1d29a67ac6acfb7c23978b9646847dc671841a5756ae4a0076a3217e16f11d68e13131468394489b7784ed692609a51ed13a159364f34f1c63b2091ad52c686a680b182744a55bd15c2a080fcbdb25475a89b394efcbe359654b6c8870c22b168664769f1315c299f32b34f46d1cd851aa85dd88dfad5c75f431dbcca3136a50611d6013776b899d234df2133e9e2486cb59095608bd5a2285d7103ff733a51111a5557433383a8cb2c80df9a2e298983d7f0871fe71b3f9495cafa3881dc8a09d371b8c33bb600cd6c664d74aa4c1e100f0bb56703949a34c7a118b11d3f4b7c5e902c73e351ecd8515608090c2cb3d42822a98b03d85135a6017a1dcb123accafa3c126d4dc6d341128664921fa415d1f554739b0bfe5678ecfc6a477019fc3eb7ce3a46889311354ec27c8427a48c046eae6932957a989dca5a30296efe84f0780b257796b3387180af812ff7c14c952a52419a095a34d90960cec450cedd8763db4c745aa6135c30a1865745c4b0825a51e09a82e2b3697f7ec6fb1c372be69794ddbbaf2abba81d9020159a7094cbe454c85df7b4c1317bf6c4a84c3cc90bf9cc40e42c940d87e80144ed9240af350c80650cdfd3412a13594009c314daa213c23be6fdc15b8c2271d94284f86ce3fd61ac6a35b6de92de46620d9181f279c5477534eeecaa436d4be6b6522495c29395bc8dedab47967932518ad4790926d413139ccb75c4b0d7f225309838136b57f8bd247ea0597ea72a9243c06c1b67db166a663783259d137d881b59bdacdf98c6c0d536af7b5a70760c4d3132c61b6c943b87e5e381ceb4013713803224853c653b30b978e65a9cea8843951eb8e9d9170b2747778aa531fd3c3c149092a043d083a9840f253a630063875c6f7b13d67d51390e883d73957c5b1778ef9b4738ba5c36b5e8ae49f5cf170afe84f71777a73b3b9c194cb44c8111a02350fc45fcaa138f72bb227696bb1ea7eb68b1c42e9632fe898c1d27272c1ae131b5c3df711905052d9872716666048525290f5a71db093abf8452807bc71e74f0948572a16476cc15296f263335ab3495b8e384890a80a3312da5f3ad94840db92ef30ba214ca6e8600a24299ae5502de5fc0ad68c1255c6a4f0e16aa1a46f97dcb252329ff995c30d7461f1aa2ad0a99d2ec80f0a78743e063445d613406914d7753d3ab74e5135b70ef9abd61565ca1cca9551b37a63ce1e418348f50786110211e20a7c685b37f79b5073cba1f1bc0d2ab6cc346b1a51526a9894b994af8f4614d60826876b90dbf26a7a999430558723b1551990735d022b935a750bd81292409ca8168619dc41c899477f7ba88d4394c0da21ce8770394322c5915d861a4b41e34dc3e17fd938a7a96768c372161b457c981ace700aa72f49ae11ea14fe7288101393362c54e7116c57a181873a92a7baa7688b8f3a5ac7a4facdbce37c23e7b923a4b7fe1a23039a1ef0fa4c0bc0ae5e980c306b951387277e2b9110854c8d76409c65026ea6ab8f3c345eabaf060355b2e9422ba867599ababc77a1282387d838bed6198a2d3a9f0b7c97162a914936a17a1679e8e51b093cae56f32ee990191e24cf64e0088481b68343331432989831bb60aa558c9796906c51e99945384c575064364d9b95060c4c2910471c697e352737e98c78910258ae6cc9c3a882e717a01bba6f00982204812c5eb4c3b0a56f8fd67fc922069e5253a47c9fe04cbf16700e6ad91dc856a3da5650af2851428a3a7a6b24b425b069266344427e66e75aa775c35d086e89991c8fb74ed0332d29974ab32a3eb1775a139b66bb695194e54d73733cee195b79a2988bba978d3a7398d5ca65e925328a1c860173c5850c32f2209a89046f7703c71808fe35a6bb3068e1d77faf0b8ae2a5a2cfd7b99c664778e9595699080b284756423b48b23f81a56a025ba984502ada4a235f4b366f9140fa5760d23b1a66409fdc312579751c0f5cbe6c40c67d1482a55a93727874da18967c982d62c4b5dda3b0a4ea0b68dbbf7dd03b3cc402bfe88550dca816904490548dde930e73242317750d83e32893dbab3e292979399bed70798b3825aa0ab4e9412abc59838af7ce4b599850f02956918e578a5fe17669bbc9b12fd513e9ba2c982637a81b1f98e26957f127a7f344bf230ee3e5160d537ee8f818e1d677941483c8ac34d09461c9142e8142ca35f980a622536813ce01f91e5c1178ee26b3f51180b529731a742ec44b46ec9c6776b410c6660e9e315022115353d308bdd92605205ae514b6ae992026ea2b7999bfb4fa3f15c0a5b5ac60ecab535f7636dac585bdcc38ab450f1a02c230903c1f5c0266599aef937864d25047fb777f944f4c8bc2906c4934d27668b99f4f58a2f54143530abd4af28d2d083597069f71c48a66051ba511c5ff927ec41603cd33432b628f3c46c1b5c158fc4205c41889fd14bcc7031bc6c9a1cde66f663a3706e542d20b5c9d74c1640b5154386c9f399f26c206a9c74de2b048e0f27618768dd6581b2831c0d6224950e289b68ab8e5692cfe6bbb5b50a5896a877f591be413bc6b37988e752d62e90d85848959874fefd970f98159fb04c4bc91ac6b87ce09e1ece908f5031400ef3536470b56981a91efd4e75dfc4281eefede2ff626361207b60ff2882a22901ad1b44090b75408f4fa2e07410ded432c32bda7158909f042e07c6c5e97efe3d1400ad36df29c2476901db09b00b25d4540d6b8 +ciphertext: 96399aa522ce704eb002aff9785ce09c0781b40ddc3747505f8bab19c4191bbd118e48c75efe9e032e741d0449036216ad3f4e7d4f2dfc7b03d0823aa6701dda322d85e38570718658caf753be84a7ae7a6295effd20f10c4973c8 +result: fail +shared_secret: + +# Ciphertext too short +private_key: 75ac8dc1683a7c154456d4368dc2ab9380c6233517091414abd735eca30895ab43a6037e16d63aca79c9e4021b8815664df433025020b73224126b634ea524ea2074fbb6b6f7e76195022e2cc462a0023113610cb6a27b0d9c15b10b99841b002e74c758e6b28cf26d19b60a8e0a3aa075a03077ae7a21151398438080c4f71b3ee46a4af482ce59a8aaef888358fa0b22f26455e5178ab3c3bcb4580be2666db9a02c6058c823082069576191643910b39a262c58822ef1a8280be410e60b0af16898efbb61af91646642053cf50043423de58b781eb70450b9c270bc7d49c6c316202b5ae70e989ca780a3380dd6776ea07ada974bfa4105d1bcc1c753b7f2e245b90018a8061f39cc7af6ec03b277aed8423e8d61a1fb7459d14b6d02620f4575b62fe0a773b4002709671d197f7e8b3cf1aa9927dc93f9ba2fb8b408ccb3727e193184fb9f6068605aba10877594c61badf30657d9cab8eb3282d0311510d0c09e4499d59879c29b410a81af3cb37f974a5b7f27bd1c9c30446628bd2b6c79d6a580439cc82caf3367403b2c6499d1607db14c42e15851c9236b5113474380b2d961bcb80e5ac875902762fe993d8362560877202c8c4f77452cc260169c766c064a714647311989cf9952391445492862c5a5320ead18c21687ac6b735895f211f39ba84ca9089c05221249bc2f414e7a262b9b309edf84940c125f8a53a46d1aaa161c6ea36b3e3db6a919b664c12928b50163a3528955132f9fecb4f221128f89aa3809267f5ab43aa8ad5f31b8ed049c9c24bc7b2154ba7b9df4b42ff2359c1337750bf31dd5a7262f353730f987bd226208c51b751a412003be33521c3cd30af8a29b8ad1157fa1cd9f26592d0165429597e93c8765fc4bd46207f0b2bbe1f6c56f0463691135054809f44cba6f3acc0540cbd91a806dfc99cb193aabe7acd03b7804c08e374c9800279ca6c821ed076ec30b8c6691268b8a4dbd0c080b031e1851c18b289defd1416fc5b1073887bcb5b9e1ab7ee9231295b348ce462051a8427b0824381cc17c66a4e965adc5e112db2681e2a6511ff058d974bec74584249ac9d2329d3e3121cf01087853c812418e6a707032e0bb2545b6c4cb489c017b55355823595a7d1232b325c09195bf693723e8275a188552af5b6ba8e39f8a82ccae666c32984adf0a53687abfab6931141a14b83536903b40439981cef0b1b4ecbf5cf87c8856453fcc1513b90f84dc88396ac8e0d32e15628573300f78013ce6a06c80324ad251b08344a30b0107ceeb56d171b14e3539aa190b14ba4bfa912475272674e78598f7880b51440df6bdde277b4f8b36d9d3bfd8a48550714aef8c003895476139136882b1c2f8054641047e24cb11278b6661a888293a0447b22114ce53b1385dfb30ca87c46896cce628364c74743c14b1dcf2aeb25914977791c633acdfdc5b20444763b47d1df7cfea0b481ff91448f11d1959764e2c6f36bb4339c354b49a6ce58371e0aa994ca4681816a12b0bb10e8c9d34dacc36f2513ad357c7b985ea8488a2485b857a05cff6ce46db31fbd58cca182e5d8704e0e45eaf9a4055479f0ef148bfbb232377a631d82836203da4aa7cad47c5d8524844d8701dc19462c2265cf975a7e2908a09616d03593b93417c916251c63b1bd5662932c0a2a7be42a868b45c7de11154599bacaaf84f57c08414f15c107158c8a8a9235c0d210a4a7468b6cd3734a4bb48cd037a9c382b9a300265543e96646e2aa3c191d779a3360af4d1069bf2972d9b09f3ec48913b3852b64d9fd2a2923317cd626e902302561b0de3e97387dba8b978cb421932135c3f5c67373408af0b5300ac834d9de57c4e75b856a7b56be7ab2f8a513cf49b4c6a6a4499c91a3b8fcb133368db90911a07acf05986799b68f182ee7493336b89a6fcb2e17589686c2f56f04cc5e26759d651efcbc779d94be9a74f55d3308dfa7ee5da4a971b37320a101915831051767b4140c4217e63e17eb4b923cf36bce4e43478aa33d7fb4bee3ca879d150bf827ff807992cfbc0b76c1ed7bb94d2d8295f6c73bcb923c064a2037a92b7244a92e17eaad43fb7d260fdfaaa6920ba7594c402b2923a0365135c3724c53e79cb605ca37a75812edae253b337ba20c33bbd225caea500d1ba93f799654bf8bb9ca9c0097539f2e4a624aa0bf442c02134a73e2a611f436d88a231236b36359aae9e49a5eff76e39748954f7abf8343724063afdc63d837990c4984f7a5254562a6827746322d504c3ea0b094291a25643fe338d92b5c9eb65031797046e448332567a4962cccfb32f5777b296bb67d9a7b8c2229be1ca514a1810f915a23cbca7e4e0bbd284848483961677b87d054a14da154e499ef8321fc5699d31e120e3e680e62cb773b04826c84008d6439b7c567ba95a07f3775fea14397175c1b40516247b3ffb020c3a409b005f2249b2f183416f9c355e7bae2b6a10eff7b901b832633bbc5d64034f24b7f7c98110b4720a627f1bf170a1028a0b70456f8a486aca1b80d0013a4b7a198c0eecd21d91809b6e92748ea24128db0409c5228b7719658c9a445ab54b213efc6a59e79a8f00318a505a781a496ca337950e5b8af8e26ecdba3c21ca880ef48e40b5b2d83753bf7a08fa43a24422029ec2135d846555d2c041d0634e0538b8b176548293a6b5c6a6489dd21a87c6e202f60472eb4b6550d37f291527b79c6461198d49009121b4282fbb58f730b9645bc447fb4f129980fbc4a8aeb6a6296b9f86710dc7c6bdfdc08b3824b0c87502ac724ecff9bbcb034af69c25e678c61c823a47e86f8e9b876e48209c40567d25bd98a8175c85c07876c20b872bb11668b0583483080c63c3764b612601a4b5a8a4c6f2baa18c3701c1164aba40aa32b12abc07b8d31887ad672ef58b9c1ff3b2d8ba77935c035c0cbe705561b8b25762c982aa2487f8e71343e4818b9684644394aa24c746e8c96a599dbdb700be05232bc393d96b8898496bd5037bc5e6b7a99289c44c5ab2f8cd27ea1d6597b99e128240ac1d585bad477a650e4a2d64c32f7953a73644b08a632d1ec73a1ed683a38971a66211c3127078108e81323ed817b0e28664c575166fd532c45546d781355ff2764d05885b554f84803d4fb128a018644c1402c96586e7180555d2660a795077b3cb9b48195ddca2cdd213f1e4c051194e4d1b9b387a8e00728b5d903778713cccab84029144935613e2e5580bd231081a2da44b591fc13cd7860ad480c575a0830a5006c0372b49c9139f0b9570d3cc556aaef9910abfa225f2138a87412c5fb264bde590a6d68558ea82a4933bbbc54be3e70a3624cbb85cbeae35935ec0044643beb148c9dda4006d8b8cbec71fdc78baab4b26e44c5bb9d70306587dd0f0b4ca2284364c9eb2557f89299399153ceda23786b391c8d2137b3bc5acb522b3e71c16e1c577154aefba3206bcaf390b656cea35c766a8c78a7a993c64db763c2282445e7cbed5a5368b54859387c985a46b32fb0ac654a1ac1c6c87454160796d221800dbb11e8c78a0efab2ef5647ca7fb8cffd38fbf5455c9027b5c88400718baaddb6fc1133df7f449062c2667c04d0b678fa4db3d2fd3603ec39f531489dc65968273b15ab60ea0e25c53f204f7b8a9fd18a45e24c75e9b78c91cc1963ab06f024312903e40a5201750a70274c9b614a4518b357a9b2eabd4b61e1bcfbb179240829ab7e7400b94722aa6b15424b8f5f303a6c148834348abe5a798f77e754c00dfc4c359739fa403a0386964addaa967c5a7b598370d420ca634219ac200bfe4c6941441596b6c500b93f537b21ca5220e47b50dd58ef4ba4bb7d379ee854fa0f8b55bfa8825229a63e0427e10b4ffdcbd928862f44733214610edc0cb2de3538ad692eba23a4aa848dcf80aef7cab4e39b1cf9050424b4d3217ac2cd432f0d87cc8a524e66a09d9023fe630cd3e68abb57c22b82c5908b6490916850442bad23801282bc2aa396dd5595d5af55ec5a660dc8c55af2b2ecef1aa4434935bb98a509279f123a1fe47ce81ba61170c90b22303bd92c0a96b44566908c8a8cbf2b81c90429e988aaff47378a48116c2aa1a4676aaea19489b08800bdb5fe245a7b8998d3d1344f47ab5f1b53f73055c5d5889a774b1a7778bd2ba000607622898a78162a74dba4a80a8aef00acdbf682cb0d26564e707cb196af1a089c7ac58e306cdbccab351d4920b6ca16f8ac9ebf883882488c68a614e173b3ec94f33b724b1c63a6a375aa7f71554889ff8894a51428eba739b15c44c0cdc37ffba1fc117775ff38332a265426c04c9dc86259b9283f54176bbbaa4de5d7886bee1c914af49dff046aa232bd7f0cb95089a3b323f0bcee8f45293c7bb50e4cfc80e641d7d53450763624f9c26d211f582c0556ea7067e0fff7e3ce04ba9af9c9f1d6fe561eab828f8ebd1227ded55 +ciphertext: ef13857bb1236d85f5fe0b4ebb7bc742fba5e95593e6e4c6e0319e +result: fail +shared_secret: + +# Ciphertext too short +private_key: 0e54b0966b4797916a5b6c5f931b1a51498cdfd7786d059dfeea9a784573db09a401858c5456955e584271287620826f2f9ca5e0f708897702a850bb5cf27f4020cb61c32d0329cb611a58fba74d5a89b15e408922990140b7bda9fa06371208182bbb5c7969e2d2ceb1b61c46534631c3b2b4e54dc0cbcde21c1f49287f0f417c975a5ee2140c34809cd6723a6f1b224245a99dfa7a1f13c20864c1d8f15289943f0bd84a616b36a0c2844543cb03b5c8bed2766e731b3f670f88868423e95e2f2a24f2c2571323ccd7f37d342349582c25993510eb438699505305334466048073fc2b5a7007764350cb610fb2f12a2f7b7e94b65c653a7e2e442dc4c2b67f85c65aca2a1deca3b837bfcd77aef409cd6168300684541b88a747e982be237aa38c5d5806af49c9a39215c6f260bfb53544fb296dc0ea93d4e1b51928ce6004a2199b3f9992446e6111aac097638758689943c8296d1f0548cfbc803f5a310da6c57c93bb3ab446c7f8bc0cc88afd3aa14720b03e972338c44ea50676ec414f5e2b2aee04746b3950d9d53b9ee553b18657e4606e9760725f433936c57b0fbb1b9b0a8ddab26b8c787db203aeefa6111e242001924f90b82862f1674f2071d081cc2c4301afa606df3290158b55c7f73cd5f867228060baf51a945334a116a3cb4c08bd9b96aa1922e345cf83ac1ac6d30f20b6ba64943f6a8b1c6b89ba26048f3789980c035c3960756f7c745dc95a871420a01b6d37148adff2ac46dac3b8e90362579cc1e1b8aa467556bcb0e24955ea1a0ec28a6408744db9b5b6805b29b43a2374057e07314a1748447cf9cbbc0147ea520a72e29de76b2df493174582a62c76c9b95b1bb95364d0a063b3a98f42069ac0149cce8c8da1e8ab961475743b1b39bc93b0bac5f9862a61452b9afb57cc0622643b1ec2541a3b21c272167c85f3481c30818fa53844837a01b443cb179be1fb04d1519391369fad1b4dc7800da02196d3bcaf45e289117067eac870b52308b5d9a7fb3aa200b080a59b7b64ccb235d5a196165a26c90fcec89748006b1cfc34a526675846c5ed9297ebd2b3b28b8840846066194f61fb5d39d32e12301128b701c990685c747f4f29571b03099ba97161e62557ac7d68d3a20a056abf5808c05699eed34c049741c0459da4f71755e988448c10a8f9c99c9b7fd54bbd4345169ee1677db02b3585b866773ae0922dfdf48df7e337cab83f76b752668b6790fa6260435a7bd43fe7824f534cb95ca97a2d48b3e4cb18c879247f02915a6b8196476e2b8672876660f39248a547bca2d5171e0197dc111e84d48708040386c9a267b94734e34bc5255de470c2f91c51519bb41292419b236b22871fd8c00024c457ec671e3ed23e546599bdb1712ba4143b5189043b0236114690375bced2a4177625b2cb8c73115c24c5c29e1aada459c6f0a76f9dd20a9b02b411679b9ab0459275bae2d35060f91f47c2b3b8c010a4c1bc61dca21a896e46b1694515a6633349c46a5345b6c191243563b5a3cec99aef9aaebe194e73bb24af7ab6028a9026b93cb0e263ebb003f3168ba024be2cf50d16ec7bfda8617dba04e236023f54037a54954e01b702c3c585c80ade2b9ffebc7a91c209d6267052a90a523083ad6b98c783ae8aca34b437319cd02adaac3704b85cceb3338ba7551293ba7220b89e820d475bbd9b29cc3c29491070451deb6fe664cc8c21c6597928376b8b3f7c045fe996608a76ea068d8db577899924b35c5786c98773e3b83826891272215c83c4000c431f356f6366aae7ec745804809f754ac6673704831e8caa465b0981db1b552a0313a208671282346f710ec1f4c96d976d2792cba8750c05b61711346ba74ac87e4378a121b46299aa22d04d7a70c3b230cdce2727260bcdb2cc415193c0d68011ac20cbc7451deb4562b9e2298624a37fbb195b1b3459063b04e79d1be53f29e2042b0abdf2f33b04877fa35b2057ecbfa4c44ed39a8041d17c3e1a5f08057941341fb3235d6979a1c0743935615015d0416d145f532b2361d84d6f13635ce403b39037bebac7fa83b26ea292d75a3522fc7432142f6b06685539551da4bd5028197bc1261632aae81066d34b26f7a69b9c44a2f4f57db0b453f6504cffb7119722bb177301296c58cb6b13776543fedc98656764b317711fec3d3110bc2d6658ba7bb0f342a695a61d1542c205a40d8d27ca66d3aecd8b0e089487dc68975f02b25b6bbcf4a90e30b59201e2b5594004d90b82bde57f15a3632eb32141a60cf1647c24c755b4c90d5ae45788b43ebec09a550532657001df664d46126794326ae5820981693fd74c7fb2d73fc912825fb4184f0613492b626fd11ab481aa71683c200b73649985467a135df90a183020e2f624d9ec690483bb740b7d09aa6e10a7b2b05a1f02575228ccc31114424e1a83bdf35f4e337381271748123d0bd79bae393a3a820325a871a071b88ef18bb7229807961e8d829d117261d1140c584a636de539db20be63e17e81f41883d508f5d219cbf98e42c86fad0a3d0697449d83ac403355cb555a62bb3113463a559b5e6130a11c08061ba15c08d6963230afafccc56fccbdba34b606a1bb9de0b9c7b030af8a201a913998f249b8205806e3b0d15b1093072c8a2c2c0350449114509e17b397232367a59b9d6a4a4a1957b2607a1f992e967c497cfc75f05b217e1ab072f885c923b9b96119edc89416c22b5336300831bc365484604742018b0d0c84250e2c1e4ef50a78f9bfeae8af3252075024397f7985fc6b894cd34073c8ccdf6574a3f82fff23bf1323a740e6bf6289b6867c4d5c3a28720330f177298fb9b00de8077147ca94f141a49371d843ab1e48456e596b39f89505b182da7ab9dc9aa707d61cc1c38be0aabd95c433c6b77162a5a30f91b0c84287b5036af2d906001cca3ab9abda2b91b2862bcfd60cd6c7cf86627b577337f9875dc0502d4dac265a64c412fbaae2da37bdb64542e0054c4c769b155a185785d153a2dfb9bf5df118d2b5764b9c1464fb758304714da6a72415003247a867396624822fbae31776214a3a9647fc06a96ab16ce54a351a5b80a19ab4f0a34f670b08e114a632303e04d43823f62a63921873d2befc33aa9aa7bdbc395ca88035795004ea6957b00a10c296881d9776cdb738f9bc1245999e0269805e5bb37ab547035299e8fb6318d3251f59344354983424c5adf44118a44812fb781d6c8268d158c30543b249bf72d249e38aaf85947c965cbd5d20367809bb4549cde3d70cbaf191d3cc0095e723a26c2afc255171a014d92a521aec7130f017f56044f2d993320b0e4be06518325747822edf1c0d5de10961471942cc9fac344895eb2d7d013c61f409ca15a8bfc9752a307774033919294e7a6532207430ae34cdc12b7c0d7a91de9b34ed75a6e07753c0006f42a96744ac8f72f0c4be25031e27114fc4b25c968d6754c7d5815902b551c9f9285f507faee61761f4ae1fa0464669bd811c5d29499a8e2a21877c4f5db39050cace896038f77a8e8de15e3d4a35fb338a362451bb37cb973349aef97862d31662c63c418a000b10bdcc1b20aee83fe98c8363bb8b66d6cc65186fe371cbe6c374d279829f0003341c9a97b1a24730819f1150fe244fb6a594f7ec032345be3322cb0635cdcafc4d3a138670b760fc911ddce75eeb73b6e4b634cea7190756acad737a865a652c011e8a81017f1cb974c41f9889a09e24804a842014d7949c2c26f478694573bcd1d04d944084f780b4ced2cc277624575144a82c3b91db1581fc00dc854578fbc36ec993c44cb43b14c09cf4ad3e214c32d97262e61579b874e662cc742362f630797cb237e8cc7613a434cf0933b06aa1bc960553c671c5e486ccaa18b8a45e1edcc0c7059c6022b686351fb2d5ca4a155be7b4bca38cbb134829e7e39759e05d2427785b5a40c69caaa743b513f16e6153bf00811238e3407a1953d91615a7c38b4d791f56d81903c7caf939a795268f9d3a763391450e687cf65a01817a527bb6a8143a662a5587490752bb03438dea2c83711dfbe0702d9b0f2d3b644665687946b0229c46dc59b3d3c3a7c06c4286328c8be3466a7bac03d4a55b38495b97a8c7650e9d91c42fcc3def6132321212f6416596d9ae3d75aa2d3316100a9406303429fa56c629172778997b1ab65e8667a13080170b87835b2996080674278d409027898538044b35ddb45798451cc920a557e82d0b2694c80a13c0f5847e8944587ccc0f455f801b6aeefa80db454d8e707e3f7ba0627a821a1633db76435ef45b1dd190ad5540f9a7b0ecdb8d09fda5381b83f70390c0218c280823858b4a1255871173f7a60875105dfeed4bf8b4df1b53c4b202a60e6b0be4c4429022c19bb91bdaa936a2c34450d6bb83006b2c9f8df1358c20f9ff0b576b6fab3f5eeb729f9061b42c85ed +ciphertext: d8e6a4501282f7e2435bbe634270dc0b86af64c797cf0d442f156662bf1a54c6900e4a3e922678e9908b416299e45fabdaa0b681dd904160779beae7c572a9dce71b7ba1521371d8b826edeee6 +result: fail +shared_secret: + +# Ciphertext too short +private_key: 2246b0d795bcaf64acae2a6be1c2b0396866e801a4310c2347c34d630519ac8a5db2a6b7e9daaa5b447e36590f52a040cf554c703269e816a1e29872d315cfda110400b12294bc716e5b8fd6d998d7062e1ed07f5a707c39e6afec586b6f12304fe963997795a7643741d0a48174096f9cc64d977cb77a5e95e16bea650f44d5c052c5235c4346aea1079f5b966cd71efa4b1880a5cddcd67ed81c133acb290a6a26ecb1932db9ae32a70488c350f8b48a41ea389b71af28286ec9740a3bf9a94298a74c606376e3972c2bb13d695a504635815a4c9b94ac74cb5f3fc045ae85319e042fe52aa261c502b0f18843736a66a481200857ccb70399639104862ec7f385a41a68bf463e9bdc973e465beba56370d0bbeb6c28dfd98cd62405228575b4f1baaaf5b1d43152505879ca117b169576ab3230bbeb6e16838712e24a18e174e0f397fd53bad5914d11d4a1662b14601cbbc3f1a27ae5a176aab0ad2b7f964930eb385f980772e8b7be7da3a595825d25885a47422d68a5668f922bb5d3a5b6a531cd927bb3201f1567a610217d1b3a9edfc591d1f29aeadc25cc93746d8204a3cc57184c37420a5da5014944e44595904560338488d249d9ca378f262b7441bf2a612dee114cebea9e6006cc5e3c08619738935b659726a6df03655ccbb70a559182f70292dbb3b3a1141df496c8e8c69599b9bde35730188820650656a53ab744b1d19585a69ab0bd7002ce1c6c2724aa77d033178a6bdee5c639b60945695f2ac169fc720571053736389eb7414d71d3cda18682d551861783b314a62a0a1065d074afc8cbb2e60898bdd9891f39644bc0b68192b310e25d67c23b8f0c47737a4d0353b8ab992e8345695e4949ce912ae1c69e1977cda9d17a80456f57347ba97165ef68c7e30a95df8b552918738334ce0d309551854e9735cd946896ddf86258f8483b8382b22b4d38f456e0ca42286803a7014d0a475ffe342945169920f46850961ac50bb371558ce0b31b6d180b9668088b057fb66816ba134577b8ab5a95be5d365751765a3708c1de126950d68608d55f89bcb73a411c87633361e156b10c21d8066f15096153c135bd25768dc533e07b1a4fb76e4e258b4660bfeb0c4263fb3d9142c16a15880d161f77b8769060889bc85ea0c953ab029fedc48845f990e9eb6bc6a22210cac286d9786f362afdbc08800c7da7f1affe0080b54574218407a28bbf0c0a9ceef795e818b408ba231047ca62d304b9ea33323195f6f144edc6754a2a1766e4b4b4f522383a288d061a54ecb110893d49a04207f897c29712852671c6d2366791337e9352e6b8a9aae0c1ba283cd7434de5193cb9b6ab9e562d47fb23543143f2405072c4753cc318587bc43a52538f12592dd949adb8481f9c7dbdec99e303c24ec20a99697aa47157f9b738d6c03ec48a06fdbc7ab4530d92250fc9c2a2e78b84980aaf3b104cf81078aaa9122f4c6a76e984f53189b45588ee3ba821230c7a9c94d9133776e206711877ee06a343d9168f144231bb16649a00c52c750016c4af495cbba3a46751bd729574cc0b584da61a4dc8c9f51b7adb75072bf65bff23877be1b5721bc2591329d8e705bbb55322730cd396ad0ce21d6d6aa2c971991519b52bb325675453b437804c552841d37aff8755968b605e64a8c7b732816b006fd87f0b5b40b2e932666c4e565388daa78b5ca14cea53594ee664f932696c587bb52465a3d10d75f7b39c9cb21cd702c7064361d9c7d588820db283a4124b4c4a1504c78df018857f593375284d4910756303c4267b11da83457fac9fa6db02f9f4c28bc594df9b70bc4178d11711b680b01e670ef868c642faa73f78bb1eb87662a8379d732d5b216049e1a2ca19868d39bb85a71ffc8107cc7ac3c418a166ecc2fe4cc563c19d67417bf1d065438539fd582301241095b783ef139ec44c3f1fe2bc83c5a0199b13c6f3aff1d50d0ee61b4ed2a55a15681994649e837a54317b37c635359a4587da26eca0be77b0b80f4ca6d40888f298ce8d519fb20c4445136fab3c8001356b58fabe5c6c95deb9b19aa8b091a16648bb6616347612745efa7a936e85757536b6d2b6223fd117771344e423b6e0385746ca1e08788ae9b4738f16a3ea98a79ca06398a2460ee448b28c3a1bb28719d2b59fd980b50077779962bd55ab828157d59a6d9de8164457cac691a984418e8ff8a92ae9567ac55fca9922c65b342ea6558e625271fba756c3568f4972a381bd50e7508a64c395b8316a37ad9d7683c6b909c8fb09dfd01b83786637d71fc7318b114431d5e9b061abb41e03136b333d9abbcd5782a7c5e6963bf90a80580cdbc77dc3bc22d76bb38b60117b27a74e8320853a21f5d53eef9919c53a460737a65e252e60d1943ed133debb3343705c9ea770d1b686f2daab12100146b3142a74301409a93aea90213cb3c0956f5fb786ac8960dabb685588570a80063c5bb2df2a0e7f0957f6c71e5579c511a5b74355bd00ca8f976a1fdc61675780ce4fe12bb5588d18352ceba8865f8a77e90bc338e8028d038b4ac9cb259201678754f30198a33826d8e442e58c131b7b528b0203bfac2552b40eebd739e012015aac19508c89b78c118b1b32e634c157f1031f28ca64ba8ae44631a1207073f505a2782500ba4c3134145c2c82f7862b0bf9b161f775530618d2612471f6704c677b64b61227e5452d8196db91c032158e6d1c1c144a250cf58e0b8584360b0483f55964c54173e43e91705ca8761538306685a280329690f5c573b97c88717734a4c69bdcab8df84120965962f6143b590378ebe99371fb6d6bd406db6b3735a5b31d624b5f0a557d3acb049723432152d881a088d230bbe714bba31027d7387ff4b8c2aa504e0bb801691e2263918d82a59f26bdebf2a3e2037c9c58169666046b00378990c7fcf203a1e92984544a64338c43928512521a268846fe3ac46a777663802cbb48bf90433c6bc03c8571612cc36c852478da106ee3b7321d87a70310b3c2039b6596138dd511c33c259924c24d2aa03939bb4747901d17073f6a5541e498c5999c4cc51999e491bc71258e330bd0c772d12008757540a7f143c87779b1635562c2936a70403e66aeb6d93389264a00e850a6390fe642508d4610984150f8c7170e82b126285ed804318f5249a862335fdb72d03acd8211cbb75ab9c11360f1782e3fb712cfc17baf4416d2771238dc02f2a2897e030696283a2cc5cfab6cb55087a1999682671740c81974e64c8781f0b020e5a07a647b00c8409875b65e7886c50449962c902961cf75548a3b05ca574c824897c1304a06188771be447b21097750da2635c097513c7ce9fcc3e25613900113a3da64dbc36457c8434da48a23e2845be8289de29dfd6621ecbba68a328749d4be0a89007bdbb9f02ab3395213d9f02983ec90de9ac138243f46d65e2a11a57d7193b595c6fdf1c60d4c60bf906f2576c3c6481e46fbbdaada37ed037493b5cd0c7767b042509576743b76a96dcaa9c13c21cf461655b32408733c35475bd6527d8f23282afa4ff5fca4bfcac0cf406b9c586c9dbb006ceb804fb5c53e76a8b2b64f1949985c398e0d9484bcb6499da2a6d6880a29b99a04e3713bb177bf479a22c8cc3e9192abd190e76b875fb2521448acb7a565d6ec4316aa8878d0bf55a05a98e7373e234f1b902253c8c1ba201ed3877fa6f49783da98b088c5396a69bbe367e59aa21923379628439520b4aff11ec54930de0c6a8a94950f72bd678b93eac7a3b7b46c4a994eb4a5c0170bc3bd4497d5f809db0a9e4e020e7a94b403a6894ce1a361a9acd1d586d7d83b8b6aaaae98ba20177fa555514c686178ba8a4cb650441366ab1c3e3c16b48125a892b024570a83df625cd2a174a03a8cb88a111958a7a5403993006aef8c68dd25cf3705ace230caff7375dc8c4055e23337a5a477e2ce67952086dc6ac085301785b2f349153937af02929bba8b0aae9866dae9737f3a11ee884128840f5db57545600222d7a5111865830831b500a42266110e022f6f11b1fee7b113da4d84693615cab9b59cb8815991fde46dc9eb26f0925302b9bc2249c5bc5754ea6125e22ba505535c2c86a55f2a37689278f98499dbbb3975326e76e473aba05374fa6b8282cad88cc3de9135c4b16ccdc7a77516a60e0948a7c75af5310ce15765cd28b86f2a23da736ba5546730641261710ec59479768868c34691e154243d877f1eea216c3529c3d01cc13b60cd9caccd33bdbdbb4468e5a8e4f88f85a83c9bc2058a6937b8289e8167482be19891e43e3b42178f89a33bcc040d33fedf7e101fad421543f8a6c439429fb5b6b6cc83f47a5670141f7fd00bee588ae0c11622c86618e4af257be7e470cfe1ea44baf69df2106a0ef5aa580d702bed12b9b57202dc7616a14eb242d580135f1166d7bd00d152f6bcb38ce0b0d8 +ciphertext: 68fe12f93ec2e365d7a84c8dd6c12520bf01404da17616a2383bc0449fef87e4d5bdec482266325a3a5102739e15e552b1c04067a17424869ae90873bfc8db117dfe08b7bc8530c76ae8d09b18a791055e050737dff63ea84eefc8203bf4c3c24fc10c1f2494521628491bd9be553e03999f59d19c510dd221886f915f744a6bd998195b51cfa926c818f752ab8eecf6e9ce07c25cd9381127e3acd984c43a250dbafa52da708b7f02beb89eed47ddb5e3b3cd02f82a83c0f1fee3f26b76054aa5ec466ca91910d8c847ec8ca047e892ccb673d48ac5fc8dc183e22e7e4570f32c87b7902187a33a9146cb9a686ae995a4b68d9ad554a9e5b54a095800502bcafb962c6022fbe8c2ff0c09e816b3881ea5e90063b00c9fc3344b0f7874e3b27deae84dd2e741e42731a89466027d8539e5d791b249c594ddb6294d8b10a2ec72fcdc93999788cb92179207969d2d666025c096e18a4da232966f70c976a20acbcce0de8519e011d0d30e8b1cc61a4ca94a73d7a035f452050544a88ca5293441d0f4a8c4f96c32c1dadfe8a8fea7febb393073f2b481bc +result: fail +shared_secret: + +# Ciphertext too short +private_key: a6a36ce6066098cb030d1bbbe3da58da50821c23c7162165f6733466948d5f31b2dd6c217e745ac0b934c202c3400107fe224d11fcb542c3a0af65c5d66656e6610985c18056d1b7928396d3e46c85f20d2791b5bae1b41bb07398452edee20a8f2a8760c33ed35c38b8057b1f14405c0708dad1a4efc8426dbc148095ba2e5c62d6d80dec7a5c84a49880480cc91713f5e06d50709add744c16cc3682d510805c2bb5564d40e38e1c60610a127233fc93062b4770faa617ab7e822022f3b951e0cab958922fc64bc6a3c2cbf7c50828b55945095df374b7ebb237c2998b7796ce58851768825c393678b5a19d538654f294881bbc1a45945f0bd716d9949c4e0a681b657447373a4ed12a833b4b28e81eeaa1b128681ff6ec01db5632aad9368395179d5a6ec8aa1d3bbc106c13a165481498b1552c9065a234c2abfbae46672798db74281a818b879b7703509c7776a93c4ddb9a49da398e87634c2bcc1c340cc12649bd1d463c71385fee3208a27b40b6c21ff69a09e9c69dedc58ba7b10737a4795d64176fc71f75735b6c332fd4c81a6339cf84f29e25b927ec8b77aac19c2d5808c5b16470e0c9f9d81781d2cf3338b8613ccef624c5e41a70d4fb6679c875ba3990e5819eb67642b19bc4a2d1859074c4e2a4892f1110e1e188b4a57b1a4b3eeba50f6d9998ad53184a476465515a1440aee39a723637602a548228c00f6e8405c68381e86030ac648db6d8c42f3b21f50c19d01722121bc6f33067faa05e905b4a0b3285c29812e604260df41022f519b400ccca02a5225896fe8498ac94bdddeb9f89210a08e37c5c9955103c1fad902e85e4674aa4b539935e2869525ba43595d7bb838a4d38373e04f102074c6a08d31a11bbb33c79a5431c1bcd6b363bbb80e924bb99e13c929b202aabbeb89768bee984d5d905b51c42dcfb6d83e54f3f04aaf4d672d193a1c246af116a228b63c755ea6a6f3b70e4d86980dbc041a8b5136686379033b9678865ccce46fac4eb651488e070300133b2982eb0a5b988975d1ca079f8fc9144cbb2508a85e332a35c0b1b67ea3fb1f9134ae7b4bb448af5576d60a175cb6040bb315d50ab7ea2e44ecbec45bd2767b5dcb4e6452d7b96399447a166d33f553087c8a274645a2bfd390d1608b93f568b5a652c19c1b709087c25b7bd1737baac2c020d07ab59ac896bc59d1e8c8033b70087e3c41ee49343e25449cb872b1c049efcc503d01ed4ab4c4e555187158cc6f0957ff51db019203c79b6b99a8c3ae13efde4b76a3055eb65382e9a6f708a51e13a3c41dcbd75848f3bc69535d6514d281f817bb50252c306026a820950e436578a61530d1cb2fc6476a96b120da1b39d53c8a1671eed52c8ffe55025658cb552afe52c94d2f889c9fa0bdcbc594cec2ee326c75b102af3bc361b6b6442e960365401cbf0bf3c5a91073c14961932d4d545d74aa40a62666b2c0823119ca167202cf612f6589cfa647e2e719e14e48055f3878024a791a6b2e2f564afdc1939a952baeb381e4011a681beb6958e3c1a4df184780fa70694ab3bb166524ca08f701141987a1ca08ba5cc1613c5242d77b020061123b33733954b67fe31cfd9e582a7d15576fb1186532cf987b405983ddfa4b1cdc71559981e73725b202b9f34883dffab0cba8abd97607a8b97b72f3490033bc3da149f2810aeeefa3385c1a563a07b9d58b731577621552272199cbe787806792ac34c862b14a913863cbd10461c294e962ab1caf569a093234db8b360b564a4355bf2106a89a8921e75a4067971ae42622f9b063c1b81dc57122a1b382294b5e25a8469074e1db8cf4d4acde37c353c9434c6e0a39b4a672e800eeec722a5d958f178a59840b2715578f6e3cf613a126482a3fd216eabf52389410a266710276c1fc6192c3a673df35c959176259b1697d4376b6a96b3263278a5d17e67f29d66e1cb68682c1d6180813c81877634e6d3a8f935a9605caab122130af199c1d3a591a2c67402a6ca9c15f0a172975a7ebd891f6b39244dea31c07921d3fa9494a386932b0b9cf2877acc114fdc4224059eb6e8bea2189fc8b21199f30775e44d44e2653b8115fdb94ce05b0cba66b464036f03cb6d07a89b0b8742b24085d60c76392c7dbbc529a3bc3e6bf8bbade4803b356aba6082f38683e1421b0ee117c13034aaa4a768c54257f1426ef4c16ac8423c0503bf50853718c2ba8ba1c247c263d70794d8b23fe0bba6703c4c704952035ce6ea4f2d5971728a53208ba22ac481e10590a926398433bc53c5c4a2999950ca9dbfb94aeddb8081535b1491b3e9a36962aa20bc09b8445396707422c3db620af1a11dc679bd11c4de05a9c0928f61c828216ca7fe2aa4aa4c5914d9161acc431929b2690048aabb715660bc2ca15e05d82117e6953f95696b4ba5eb40bdd01c213827859ea280c1f0cd4f22705a698f5b5687bcb45a318186db27a966b6bfb9d56ec05223b6251d33bba83666911054c660477bc3474309408f7b060a6b1bbe7b1467cbb45b3de32342158b04bb3321eb5bc6f188ac9a9b59382896bacc5df7379f5511725564c25c74ed7a6ccd9800bfb57b831269e3d55719cb3b3311565d725a894c0e0b954ee26580c1d35ec99a42232b7a52b5b2aab1a45b095147526ef3e95f9c57974f15c984f48824a25b9280b84ab04efce7166cb83d1f9a7807b7cf2314bbdba367d6ba115224b1534341cda3999cf52c0332584f972d21059ce859c264e251a2a79c4a2232d8295c406249b4a98d3e643953731408a79869e554e28295adb44b95b5b75ff15d52b54588f347a8142250004bd7e0bd79e1ca321905b4a6aa85e69ef8a10e553c2f2ab9097f947492a3287b675923accd6278523346ad1ff777ac554d3f71973036849d411e1580283d437beac1ac35dbca1450180f3779f4d2298a837c796b1f9afc8b9fe9450caca6cdc1a733bb5efb78a7139abbfdb68fbc096f2f4c2e78e926cc5b590ba65c292aace1700b11399b3408bce04976ef90b6489432af01b5ca488c6afa8d30a6432a7a88dc56748333cea06b7cdbfb9b9d4873c18881f6ec4bf03b353409c914a99fde4763a1e22d00e244e31bb7f07b26ec83b28f94bb16e106874a2e66e86e525257f973a8bad10e326aa560db8473c917fc1084daabcb9b66c1efb85c88c855ec071f9b78cc53e8bf37070c7b326cc110b84b591e64427563f83aaff78c42ba380aa5a1f405902f9ca46ffc2e89f59479720272dc8f91a23917b01d504a6cb2facbe709184c9511aa319fe1bcbafa25625ab622d8692ec61aba631a1b754a1b5c924fa09a8f4f33c064f9ba841aa7a9f54239a5749f2c437c26b37ce3c882c1076746943734cadc71b56fe19728b10d0f21c0b68402d8106cc0ab5fe942c2758040ddf559d345355a14b6b0cb2e541836cd3a9dccd930ec46a91ebb50a7a62ed8967c4fc48ccf19005c782ba4d92febd69168a87e3f87653bc0b999201097b968a20a8df371089e95bf416b43a5e0239a3868d1b1bff3782cd5e23ba5e42398b8985762afab52ccc38b40ec25502a8c0a038a727653839cec593a6a016eb51f2eeb543cc84600b99cb7d0ab32ba8a2a822ee5786087885fac618a0079824fd7912f9646014ba886f75426e0b0356497c9d87f276c1293c25bfda94641e9c568e670ba15305fb75955d40e78d32c125aa07d948b69064e16b6a07cc173001c0ebcc0c6bea48a63d88814736c1089c90e60b81c2047f477378572678c78cf614301d92436cb56229f798f1cfc1a82a30e8806b747188f7e0cbb28d87012dc51bd70a0a8e5cce7b67204569eeada78e57274bd4226f7950c1835817408c2b1a7c581d655ba0304a9d387e7030a24f4a0373caab3a48694f776899a4a6ddb80a7052726876a747800672a041d4ac8b808334a394ff085c17be06162fbbd27da2f39f27d4ee55e45264033c27029eb03d816974c0221ee479e5ac04b294b927bc04bd078b7736849d9052eff623b725129c462bc91a98ba6f396b87a0c487cbf91391deb30879f1b38efd666c9e759c9360abed64467bc89eeb07405501b115a219e63aae66ab006c480c71bb0c2fc32ee5242e8f4ba37b4a23bc09516220f834426c3f995d9f88b311708ed64a63d667b7055ccaeb188100390517bc856283542845f7d2484da832387761d89042e8c0763096cc407e8825ae6ca28ec8fdb62983d70b167c66b8d8408acc29d65d4ad3b2cb2de127856f0a718ea6c9ee5be6672c086333d90888c5cfb34d4d740cabb6291e964fe57205f8a9d9f0ac2ee558cde756381127bac216df3c222885e81f27af7d6b70dc623d7474f0493474f7206651c5bb3f7d9c49f527beef61995f5b1f986bd57f650214461c69e1f46931b84f60e9d134a4d24e3795e1f3eeea3d752a428e28ef80a37a3827bacb1d89f7743bc213ff1f45ad14a855296c2 +ciphertext: 06b26621490d1c2fdc9f4cc5824925b1aea3ec88cde1192e826794959ea86421e504fd82cd08dad8dd0c1dd47d9054dca3cfb660623bb7b5a243b0e88b332a6a754a908df5d4f8dff0ebad0d5df620534fd6e65c66ed0e9a63 +result: fail +shared_secret: + +# Ciphertext too short +private_key: c8128f68d6906646a6ad026def611720d5bb29605a4c470063b19c98ab8b43fb7a88daa661579f4e1c80a49139a9e623993a4610050fd091019792bb86a7a263c848211c76cd0a354190bd970818a7e8144d6b661a362e29a72f80f7a960b406bea5bb91213088a764d72724dbe6b920048248a36b09dbac561a81cffc5bb1a30273207f5648445a7cabc005265f273d3de82a68a3b2905793cf31b1aa39710e228db8c801e99909a7a1c8b1398504dbb4210491620525f36c295f405ec0e51f31b2451f99356f338456060f17c29545129e4e11558453a04657b78e875e5f774cd1dca36e405d6edb1c7b659c0897158bd4867c656af86774fa8b6911a9475470a9989c25f122c06c82a59a1671ff304353b99ea81b75a2aa5b8a678020a903913b48c3a65c06a8c078591d0ed515ab5306669cbd9167b3a7f06b8e626aa78c301fd8499ce22d310a8ee54b123d1a8fbe5b1f77c807ba550b38a85c2662349b841243467e6acab783fc9e6190b9b328b9b22c1affe779a244168fc60f302274a6a37cf876a5f669c2f208480cf98eb79841a042bda7d659350498593a817044a400579d5e545726005f5e51c254806a41c2c3c838a868a72d74533101e6a7f44268028120241008132c988ea55795ebb6022c29259265009c5db18111d5565b54a912b88399af4a7ca88a9b250862e6367165f7c067171c65ca660bd61280e039517c1686b2c1d6e580e0822ea1e215a19cbf605bb7bcf34f7d6231dec93df58b2465e0b319b70772523940957482a03a31a36b29874c06228595a5176bac9caeec694de81b16524fa37aad247b616abc700ff3592898623d951cc569662c1a3edda1bfe827607ef7343c778b80dc79d2ea57823b6d196c9c440411c712343032bda8c94927ec710c79bdf9cb5e1f0c881b26a37bc772575acf05b780e11456cae286bcb10983b360afb1b866db3ae5082c64a37720c837a1468623fb5dd293a8e920669543551467805d794e6c474e2a4451e87013ca9898dac888e0b17279f4b661d35fab802f41d05ce9928ef0a619eb2339983cacb56c5e3cc47dedd83399a0554c4614491c515925283564809a3b8d9359504b364e64e107c08bcf1a36090a2c11a9657fd6ac459c137c18e481f0789586a83fec08cef288c4e3eb6aa8123b6778285044558e3b18a9c49673921b97c8ad940a477bf31802808a03d356abc41a7f33ce0086a98712521a062447b527079a49ff382d74f2cab6f7a636d19539197341288568a160bcf14fc32c8be72bb4e82594f8c5994838b843440272b9a0633498f5c4a320c3c5b4860287c3bb0b751e0255c1689cc351b44c511576b5673c3d98008e867735d23d62f222e8b411aac79efe44119c398383902b2793c59ce24235964caa2240c7c22c141281b7aa1dcb5877d719cb4bc44a626891edf98c2e228d23a88cc9390b724cc0877371fecc59c4c5a3ae97b7dbe0bd23c8236f16b5798c6ba8344c3936a8276821634cabb9b80e4a522aa19378bcac9f37fba78ea06eccb8971244ca94932f95fc46485597956133cf9071e3bb68ff71803b98a9145b63e4c12416c63cee337187427ee5c56dd7b558fadb5a3d8869c9624f6a355c4214a609da72435b4f1d0b724f224dc0c5181d483d37752bfefc252b1711ec182771d349cae6c2cbb125c38a4b6634be0f35c7aae7651dc1172f41074139cac09a25bfb8ace8187ce22a64c1ebcd27256750c23e40bc9c641c09dc468b985723ef83c1c746ab17c2cafe973249516b87508a05155cec26957690af76cab6f37797176496ae8aa436a19a8dd0b0198362bf035d5807533376287dc8175e9a6e7ed12d3b6a679a910e0fc39181ac3462796759513e11f46edee10ca753b44477adc86840020b7f58820c225c304b54bcc0f948959ab5750bbb38cb4ac4373d77a2b26e5c45f8831012b645caa58d1b3b8ae0599dc6663dee186f80f56486e2b52f227e3920af48a431fff3b4a2f257f412cfcf75a235722e24d8471329342e85c0f0b143ffa11eec3c0b7b168807772f24a045a1e6105420365c39c9edcab2d02bb8d56612e04c7af509654ac322739c079f56980679c1a3b9b39d5b188d014a01dc238fb7c11c5bb919112718a97e650c5537e70e1ba9198ff8a102b8762996189239b1196ab81c369810d79e81b293e6761ce3348c23e535af0bb10fa2c179b6988de5002f983457e10ea6d2a7f10842cc3490e7506c7f56120b88925f7b53bf392dbc48ae75538d03c4b9ee054a54734ac6b2269ebb67f7686528590296fbbfd2ca16a3ec62553197f0345ce0f05cca02b1a097064962a83249853529224d78ab43227564239195f25e5670634f9c29caa53a2e57706e33ba4e8379f23a28253cbf59f8665ff7aa9f2a6d1ad35e4eaac2892a1fedfa8db755af3e50802d23c25d71286fa28d5df5ad05f40f1cc91b9cb3a6eeac7db3f63c6a448793705f34883b2e1caa5dfb47b45955a02299fce18c9189b89f060fae8370c99a8b8257654e9a3be3013537b83c507901855692cc0c7d4f263851147db75c4b48ab4998c981f532787e1ba509697110a9141200c2d408198d2b53c9a01f3630171c8c914eaab5de93692fa073a4434d1f806480186ea44370e56b51d10a8325083f361520599bbef3d4c78cf90e08e83b5927cd51f48d83f1c87010198f425d0009535aa88d2f832db655673c985ea45a567b5b3c0ce8246769a0fce64351062a59f05e0faa0d4be76d21f46cde1cbcda4539e8ca3ad13b39fa30abfa437a266c047bb652a639145e4120d994650208b56f62924223b86e67483f6b1402ec29046765d40b830c6bcf18442dcd830419577514655c862811c9295b134946ac19bfe9c70e90b154dfd49557c27f2e86052d582158d712d34986e9054ead6c322efc9f5760bbd47a17f8d35cfa23c3c182b14a61cf8a7286eb618cc9e4adfd628d59d7583b658ebefc169239ab02b1690ec7321e08b08595bdf91787459094ba999c0ec97a52c5ce5dc2a23748a9ac5564055318ceb9a2f5e7ccfab734275770a7fb9db559b6a6f7a5223b9c60a801965159bafbb23fdc5828071bc9c18efe3b7bb8554b68517a42b11a6c5337c22b34fee9aeaa77694a879587ca627f8224aa876ab23980ff95aef873bb706a161318882ed30a0fab2ce775794269bf58b202af9b8c3429852f27c2b605afe6e9579de573bbdb1037ab56f6b275a5e68c8d332ba28b8ee02909d8270428006e9c330196db230f6287c74472bb8829233a5552f1aede3047980066615848d67703795736dc5c69b900bb05545a11724de26174857049b613b5e7d70736f8142d6b898e86a434c4b7e66b13fec4adf98361c0fa53989c6c66a5ab997c3d02a291bfd3ab85452daa83c2b9367c358ace92d87aa0197d3fd49a81c87a6d1c0c31dc51dae223e5c363de845e499202ce437c27dbc01cf15bbb635749476c93f99dc65605a0d25170db7937e72988c94fc66c9630b53aa2639748058474b184f8843266374d57646f49139ede093135aa0ad44b391d6703a3e89b26ba91e5ca9d53c5407bb88bf5769a8f2553ccf426835cbc62d79fe4306ca1bb42b57aab9b58a2647b6ab88551eef1835fd51ca8314a837752f2cc217554552eac6191261a76579017ba216f12226eea3487e928179a38d274182671452f7b8f0eda3b6409a494189d34aaa5d469a80cac5c62d652128ba18a99225ee7cf1f4124880a9c001457d661ae076827518a0885325715258d1ea706597b88e46439c80c8d1f8902c650c986725bbf129a169319a20b4f054b397f61b4f7ca8e17b3042e857f7b7723e59aa67f1c5fe1736623611794792fd36772e8d236256232a8dab178498b0d17063114c7234826f6c31bdffc7118c4bb008746444c34f4754a9c22b7abeb9a47706a20d20273d05661789eacc8c73bca9a1d9999c4476f5f849c700a17b06274184acfd919122edb2590029715a513a90162a4b18ea7a866ec223dfa5041917a837ec27460b2525c4248e3d06cac301a3fc4a930657d463bcbcc537a99755b2cfc9725a9872e48b3a1d02227b38aa5e73d6ba7194c8a6fc0571ae614c005670ee9ac8f3075aa37691a2fc1460565ce56446f17c0ce027367d4d3ca499b12d60c6cb63505bd00c2f8960c22b6583e82cedbd392ca0859237b6d3d540c11d022a863963320c23147c05ce67c23a8c97a681f80b53b34d9065ab27c65765999a597b8e432ff0497ea3786d0ebcc40f9581bf3cb1ab06798ba471d358c82106f6c2b89621c9af2057578a82f3f825da500a3e6719e54d237b5e55a6db8ffd5d45de67e06ed0aaf4c93e6455f5cca516ba3494c811a5664530b14474b80c2742b0787938e0dfe710c97b81081181bc3b9fd6086ad66ddae0947ddd9344e5843fb890171a89dad5e95ff78148496f44957fb917fff1c1d6e615bd586 +ciphertext: fbfe3df8e27e6c6410cd11525746907de540b9a5fd9edd77ede1026fc40c5f2fd81091cbd770df33d1951265ea41dd1e5c7d30dc80c133062fcfe7804f541ada8dfc490c46a2ed96c40494754f63d809873bc6c3a1d00b1cafa0d1e5a1e913404c86da206c28a4c9772d653525e4b8a8924052d520d002a0d7c7bd5c029650c686c37482e554319dc477 +result: fail +shared_secret: + +# Ciphertext too short +private_key: ab5237d4a41e84777ba4f50349735fc3434811f90608a372292abf81cc01f9334b3fb6b08ffb80524436ff63c03f3b332804ad505c99d1b4b19af423bb584a8b91820b1ace39bc8c71943060f78cc7943cba6abd9fe507635302d2b062488bc318fb89b520377dc286e60439024a2c0129260a474500793f9fc9464c799efb7029692858a2d2cdcd9c1352104d9cca4496c7039719513bd8c94b138c178c792cb2a7cfc3c36c2c7fed35a8e5113ab027ba5a8181e0e143160790ec27cf01217b609c772ecc24a4ec1a2bc66f9d946d019bbb286a384d7ba1e92453b5b7747de067a62c5cb8364816eb03e8b335df5c0b1a4189aadac54d24a886ea3403047eb71b7f47da10f12b4bd463addcf6745131b9ffca214874ab89d834575931eddcb2f67495ac6082dd2572bc3c32fc692f57a15cbfa68146108490fa2ec4db28ff841128063b61ac93b83502db266151d97a2e2337376b7267530061073a3a53249a3975f1266adbb37d9753a237eaab75bc2bee9180845abab1b132d0e8cc09305ff8c137fe48621fb02f3ae44705da1b4c41953cc73bea66b90149afd17c2f513b39a4fa34ac1aa8fcbcac68955936a35f7c07452760616c19aeff130c2fdc87ec9b0425378ba9fa238d081c8d9bbecdf708344972027322795058194c5f3132c966a4a27881685345abf70c43b6cb3fea813fcd6520fa5195f499321292a0d3921975585e4b654728eab8ac6803105352e8298af0d88589458476c5b54c6ab1c41741dbeb244a6b7a5ff4744097be08b0a974581d32f4268325bd23f37e6a304cdbc89b23c90c66158200b4853bf9cfe25376e746b99db15a7616b3b2623440215010aa04f2915b5bcb08feb5b6387abee385b9df7208b04c4398a742e53b503d2684e77a669dec2deca17aa89aa7d48725eb24156a68b73a2881397a905adb5cccb145cb6229bd68834e3c1a687b05f55bc50bca273dd93c422359a0a7903d51935f586597850cb039b641171826b68e835446f58741af0415a05aaceed2069a4b01e6d16da2110240835f257c0fe1fab0d5f4160c348b85e07605e1566f229404d178e73ac2c038ae468b82f45a223c78485145941430c42e468e3c543ba85aaa9688b142db6bc42210ea198edc4c959a376dbec6680f97b41270553e047525510832c2629ce3b00a3966af5b56f47542cc0521a9480ba21b4a06841f6deb369ef77e00dd4b5d792376e2118ce80c58471e422168f57c0621e15963307691d4436fab749ac5a7f273c673a40202db7bf23b91e124501d484e12190233181263e82bae1b7be71344e25b4db553af91589ca29c80744b6953c5bd115042c9739ff2421b09492d619c56667a4021489527b23edf2361719632ff14a76d97a6152c3dcd367b711b1089bac694737880234e8b6c93249285353591a2490fd2685bc38b16685472f2a5c718802e91ca4008575d116527aa89421f1b947cb71796a452959a234a24a0d659949d325c5d11b91e4093951324b6953ce8ac0815e0b7a5a51f518b4f4db79c52c65bdfcb8b83309e7b0622b806c8aaf58bdb1a0db615a987ba64e15a3ea1748f2e3a7922095fa6b10ff1fc997ed23eac12837a713eead413ac927a0dd882d0eb5e4407b0a6fa6232235aec70cd33a72bb8c17fca119ecab37822e6acb11c44c0d891eb310cf870a8aaca887e2b6783026492694ea912928e93b2eb611624197c60caaa5054970c034c9383187b4a7303695b9b24828c49cf2d5577dfe0ab5e06516c4acc87d79f96c40ab300c4bc6c1bfce5a22c36a99a025787c58ccb2c8dfc52cb4b8044e4a5291a42a17967767f957a03692315b2917b920ba382200b6831d5c4090452259d5c5d15939d2b7c7e94a71a95d56e8bb968c10490f201b9b044500b16c1ca945489b24186a94c55305058545c1708275470b27ac44174e440e66a404f845b223325a70c0ae044c8a1d45c5bc0973f7a58f3147f433c8da561247019a6e5d3c5975553a9822411142bd8b0ab36f2c8c8784a56f444a0d95cf64225b681a2223b65a190863054514a63291072cf19ca6433044b084ba3bcd974bfc05e1c824c8f6770ce25068fe4a3df942bfef395bd21362b314b49630c7bb98770105362a6a528f6bfbd0a9a0a5622f37a60d5064c4780822d477ffdc0c84f48158204c41d779459e17d6149264721ac2000a289b544b0e970c6e59c63db870a4a7313533c4f94bd7dc389873455ccc8aff709a087b94be8cca8bb6c5f36199182b7769bc9c3e1422680d704187c0fbea6155afb91becc3731bc9920c48172080518141843a792b5908d2f54b67f5607bc7b17ff6b33fbbb4cc40c10d088c4ccf421d016770d2bcc27943e3aa7524ce5496ae7c6690bce08339a4859ca15b072d6183a4eb4b9481c592838ce965c9a6a8356fe84b6db7433e1020dafa8803ba9b2c8fc0ac9923a07540d8a4c0dc274bae9332023618aea750b2d4a254cf7729bd49dd54c9171ec491a239ab14953ceb33e87996ade72160e20cee7e3152569b6d3fb8b639b27a7b805b79138fe29a5d7492b706391d7012d907c41e9809bbcd53beb4ab26b32abb3bb71c6b95750f01a2bd3b7acbb287347892a1123381c7f29d35d01b7a1206cb48b8a310f80853fa29bb17b6339b4bacad75c8ecc74d6e8af6f7a26f506364aa401765599fe99b0952c78ef3c4efde43e915b8688b9abd63a7f98c4aa5b211ad48c5fd039916e564d45b04ad09389b8246c51ab87d26c9dd149b1595b6970d2b417faa080a65eba108f1cbaab5e8517d0294dbf27314b1887ea23b503dc4e9758962ab1410cd8a8d099071d4815549c7ae2e6ba5e0789df893bffb67b2f68a280e9a7da2491eda7587803cd7e6c5fe3d4ba38927026b57364e00bd26b21900015d03915416aa4dcdbca12a38b82e3c80bd53d15c4bc95a0104d23303d7564368cc41932013d15817e025a8dc04a22e170bf190f12476884060cdd0b9614751453878af0d3017fc7350db3bc75e745ac00426cecb29e728658260ac9a78868023e64945d3b1150a4b607ca10065fd9478dcb6115648dd3db7d03a85d2b21c06f65acf4c17b128891a1d669144aa83c952c17922e6a8b40219a085aa267bad48f0d047151c64bb4b69ae5d719af9517e4b8a936388ffaa0381ce43835f608a8110d76b39501aac2e921086997abcd692909b871432491b9662bc5c7ca791836130761dbba9af1887ddcc97329868b013a6cfb5cac49c86f5ef303c6c621869802ac4a7d7bd3666c227b3843c05b3c07a543bff49802fbd42f8cbb76296229502a956b80c7f61042ba698913cb5f9d893791c78e0f2ac8b0e578385cb2883024166475904c0dee0a3f9177105e88b040ec566cc8b5d45c0141031f7e9720221921738a6111bb979b96850d50aab6582a76f05f194b18637c4dbca4a380e9a84a2cac5922c51e93c46c337db43992f5976016bb27780b59d5d2763cd56c7e4743cb0573602624c5b8ad4c487d53800495d36256693c46e768a61c763b6482f141ceddb28089b558743848f8c83890d5cbd78722d7816d55e8962047141f59bbb5d1700508993b9a725922b4df678939c70ab1e3968079b9b9340cd4e22c6692568d6a329d74b7ee787cc5e7a28e770e4935a8d677bc82bb4c81647a71798c26ca86cc5c087bd68a81c1adf9744d70c41268c7170d394425166de9c62ecccc2e80c00b4890825f242e47a395630904d8e55542bbb50aec8b95181374b39ff313aa3a75980704059fdc2cbbebb096cc0235e537bdd0b221a74259e0c71a4cb2a6fa9611365bcf9022a3028f16c2386553801aa2029e951237ca0a5e72926862c3bae62fc13082eb1c28fd5b7551876fd2846617416b46a5489c1b1e8960b38b8c96e981ae24ac8bb1d33194f2874b6008fcc5436d2cb6ec10c3e23787924ac9cc72cb5f8aca184a4b4783a875715ed0f03fe5e318d9ca7438ac9a0835b7dd506fd0a15affd0a0bd9069f151952d384490e41d5601971abcc7d8c38478f51a1287a7860caec49a72364a25e88a3f7219bb0a04ba9d1cc95608be4de663d77c1a85dc1c782672c20c15913c5dda478ff5704a5e0ba9cd204eaec09420251166b27352cb77c2296e6438bc692488a614bf28d15f0fa80cb0441491fa403e118b77fb405d2a4bbcd8af88a26851202901bb7e0084bdaee69d0130a852c2bd353c3d21b872ad4a1f07961fe6aa59150b62a4e915132aaa6768666896aec6c9367b48aeca8490b1ea2f418c61d148717a334df548c601e12bcad97d13bc67dce3028e525b31da8284677c18fc9d7b8982eb47b1314a9e6e11457343d057eba5f6d695d9b3a77b7d909e3710fa5adc954a5199ae3b8379efabefbe6b087584645f2f146628eae5671e9baebdffbbd27ddcaddff6ae578e469b87a6af65766c839d85ec62d0bbc39d319e412fa073b1a4b9e9efa0591802 +ciphertext: 414b841a6ea25953cca97bf591e27039690948e1b047be79cdf3502d5c689a00ec0b84b0dc349373d421b80e4d11b78732592137a068ac552d36818a79a5f3dc8c5bf5e01bad4f028ee983bf0edb77bc11d5ba897fa2b1539536afc1eae08a14960721b77976b4ab65331200106bee235af897c1f934887ac6c15b39428880beeed95e29cceaf146939c71881cbc3abf4714ce608e5dfae063eb3704f741827ab62cca4357e41624f15ea342a2c801ba05396b97ff5ed2a4f0b50bc778cbc8310ca94d66977bc1192d7c090d84313e206fdd79c63df697ace6fa4753191e50008609fc5bb39717f25860d4d1dfde0e3478d6bb7debf51efb6102fb00c49212accec3b2e601b632d19849f44d6947903192a64175dc9bf07ce9d0fce2f2f1266e9d +result: fail +shared_secret: + +# Ciphertext too short +private_key: 450454e404055bda77b1496c032885dde1a36e72ad4b296469a1a9dad20a7253ab6ab78020acc9a39a645e09ad4f5c2f618c8799b23ab0c1babdb437f9ec4f0a0634c66348b3863ab6132b0e1a4ba71b2455ecb11bb992e6e11387cb8bb0c6b3f6928bc5a96f61385e59186cf8200b483a5bb5e58682277fae778295d59d6e1b94a5b18bda523d8bb8ab08c9c3f48c07f6084128a9bf57d06325054ba5d696e38b652d8116dafa730cbaae950833e5ea59d18666fef2b47dc781e2b131eb89b989130a5bebaa8f64529d6a029a242e38176ceeba096a107321f900e461c8156197ecc0141e05cb1467c74389c05e19bbbf001efa6a4ade4461bff9a73db7154fd7a36b517c8c2b633b958216a10182bb999a1c5f8b6a25f091b94b04b4e3a9c3a0a8aca3ca7b39b803ca4bc933336b5ad38390e124c9584be6bb860ad2592a789f907681a2831e267a686e698b831c8603239284cc3a2d78a327566193f31f0e99a0ed019ebd4378c5781803eab7c1d4291f439b39aa4abfe25377d9a0d3b216b0924ceb346323d613f0574fa3f1273be11ec1173fcc361597d4a7df3a6e8bb2860d891aa5ac9136876191652659728e851bc0a24511d7070977095263b7afe302a0ac3376ed48b16b141e0f8115b5366383c06d80a64e21655f441b79b042ab4c5358ae97b4a7d6317aa77fd09537176c9d2866ce716a582de73b073102515796615c384c90ba26646f3044a3f1d82e10781ebcf4905ed88949e454e3d45ded4468e17c8336b58f9c8a7cde5b66b55296e4f7323ae0c39a564859c417aabab031443fb9686788039cd271a0e3727048fb7e8cb205ed220c033ca38958a60858ae91f1b007988a2b2c48bf695bf0ea2ca02c3c913386cf6712309bcf058c1e6b365e03d7cf0503274dc99c99d788c10c8aec6a714dc66abfa66e71a91fe505919ef651ab42082e484899e8870ea8067246a78a6ac834cbb80ca72ff73040afb8c411076367180af32754c23c993b13924db3b6e5a041dd6b4596b20368f9ae55410f0b0001634bb04b739840969d39b61d58f2a8e61706f6424897a53790c6a90f042a7e32ab6a3221e5cbac70000768fb2532809d1ca5b653652450e511109a57dce443eb2b7b735529316b6e5feb0a683a29e5113de918849ecb4b5d9667073b85d1b029e2d9360001ae83422c1501a6d5304fff3a2576a84416d63d06ea34aea6bf18dc2e26a1af590b8e30838977c1aa5a7bb88d148761fabd871c794f17195664c2b731a347b3c6443bbc299901920a631956484ffa5fbaf1a2e93b45d66636bc756dd7fb8c15b25b413cc9661c82128938dc627af58153f54b1e3694290a7a5fbd0272397182c159bcb4b9064bdc93c71a296a19a3dad0ca006a9f9fb18196fa74912270fe3abd44c685c817b8a23bc195894f299052b0642382460505e0a456c45b7a693c041757b0958c1af85be2ec0d87ab7d18131e2e7894095220b360bbd8995fea9b67b32abd73167ffb28b3b71baf7edc4ca5da8d17b25272ac5f449a0a263231b8a8a92595cd25f24fb21c296f6cade3852a8f5c697e1a760a293cb663a48b817fe76b0c2ef12c59fc039541942bb41b5103c22b166d4f511fa61a738a0305967a28babc2ee0c01e8f72c3fd912eb85022eff8902ee046dc282c459400cd31a98af5ac06269dbfbc881a677e92c94854401e3c4c6f1df895b0301ab0013210308bacf118ec19b47f341c29fa07825b22ad23c9efc796ab557e7e7784d6481c884728a1fa67433815d749a69af6098741c105930c91e37cd96aa69f7ac908063140bac0710c27d3178b967a6059db9513931ce8747564ba9f2e660f8b1a108657895f6c303452047f3a81bedbbb424514f3e91e0a61bae615352d303fce3c35a6370b6290cc1251cea9830307202e80b09f197b435a64008128b9dc09c81027007d474e28308d40c9c86cba01bda43f8af97a5ec6b61cc2a2bae228d186c937874017331403c2b870e3b5bfab6b197227470cbff6fa2ddc32870f9c4af7522afef4a00f386980595bdf165bd29cc466fc313e6c761f468b9c482a3bb1b1c3c208fe9476b6e5c8ecd562e6e35af89714205632171c98e1fa6839ccc12c280eb982cef9ba3adbf4bea37c759744396be213ce5922017a310df39ea52776bea87f0a791dee6b66f9ba815d1b90014a61f36469f0066b49dc99497521d0b33c99bac52e735b37e00b4dca7ac498acec443ad189412cd478a0564ea067ab79acae66872177819299fb14feba9308fb54abd35061972e705461d3a66cd974a57b57bc3e71cae1b1382a658456d7bbee1c688d614fc9ab8913a230978b74b74b913a7bcec0444c116c5a222b98ead35eeb586f78ab7f64a8966dc87539303c37b353a0f14bd59c4a410432c5a312be7ccc3cb880d4ec0ce57c1836785660d38033670041d5463baba4c491812d147b5ad40db135c14a4084cd4bb4c04516096c30c2945d2e0c84364acf86e2367fe5c88a8a75469b2a6a027c27e529e6067a4f05cd99e17dc046718cd467a6589111d9847084167a3745c8453433b668a921c7b41c093f69cc18a0bf8169cce6a3c9192276052750deb61cc6270ab05b77bc40319dc4cb99c73d2c1499180a1b23429c2c565527d66d0e4c2d340417d196c51bba56e989ac5b379dc51506c557c34243b509f96b0af03b71a341614c8fe67715802381fa85cedcc1907d9b29ac4ca8f67510d2012e83602b6f29bd11692859180b9d59bae7e42b59512d68e47e8a9c85c25bbc1f961b12c52f44a0ad0ad0c9683c6037701eb9f265df803dee5704fdd9a4b9c475d6745512ec6ca7d83011374edf70aabcb626c38551a95936b9ca1262f6b28bfc8a802a2a1bc55b7feca41c76ac047a5e9b38b82391a5906c2877e08764188c244b7ee9a02eb0806186e7adbcfa9e9eba3edb70a5db21a200cac3db4cb3fe109c30829ea8574bdfe9b3049323f2d427c34931a03595fe50ae9f9678850b70f827b5f0f02203f9769983aed5287749ac93b2dc2bae0b6992cb7f8a78835b9031e5933e15279f6786873722aef00b21412a60acaa2a91f98f6cfc41a8ac6d4c703ee743322bf7b51c3aa542687dbcc2b9ba882de9c40eef8265e24622de76531524519479cedce610e8098965cc75a288545e725eaf391a03f7499c15c8980a03728401e7121cdb39a2c83325c47726a7659f4066b78d9139336a7460a82e2c062c26212c9bb10a8d623852d8b8e2dca3bc210a44d699829b8aa59069d6a406ab857a7c56b50a576f15e23719578a5e2233c7336ef7c69427a21462309e588790a5f37b129662a2ca056c822faaf573b23c77991bcb8a1446009a30a4056a487bb875f4992b1728ae9a8ece54bfa2294312ecb599a3182048b77bc4534175bc6c487d70964746b965a5077176aac34cd608e8b692d6b606ac8244f3fbc4c78cac0a1b4e9ddc721759262c918a11084768e95bfe542f83f79bbeba658fea5c3cf0bd7af1b9ab049e6b188c721c386327070262c4f0433740442f9f126a2eca47b530aabd857a11ba0705536c667213bd0b4adcc2a89e5a5cabd59deb905f29e1b7a52b15036aa07b971c5b49c3488c42dbb60e65d1306fb3549524c59774742eb606df669d88a00d8ed83c4ee960c3fa409beb4e1b557e6477c0c15bbe191c07720a8aa401b1cbb5004ce44462d92396d776bc473495586c409482dd2a25c958a31e9cc21c142d5a0b4eab46a1077436a6683c8f805636d8953a664085e14bd24b2538c90124b51ca5e38bd809b2a9063cf06a9d7b480e84042e1a5c14567606c8662375baba963a5436b481d8368e17122180f83b3df5a4e95a12469983785470e16ba9a6b1aaee5ca7417b9ec65b29ade15f0b988602f60786d83de057a57693b87d335f9e39c9e3a045694a3390a59d89b56e3efa724e167bacd3a0c3a0be53f8b81689897c3c980ac58cbb3a5d69e065143619473a6dfbc568de73257f6a4381757c1b6036cf0c3115a35466f6867ce06be843a990e50e77740bb1c21de36513349a0fe33091154266cdd6297213b926f4b155aa4df5b79447fa6e40d51db46032206571ea3564f28349dc1a3275ca6349b5515a121b0f071c2d49c9503855467bc44d0259e2ba078c170145937e0895a8853136e58c5a78056aa4ab9ad13a4095bb5b73e7c56934139cc56f00f5469cc63cdbb8a471144e3e134090c4721ebb8dc4bc17dacb252e325482a4423cf7885b411bfcc5c94ff070788262068916d9d61a1e424d0fb272a4d1cb73e38a60a3a97b698e4a266234c20ec6facffcf38198e3ba40cb4ee1e397927b254bb549010a57a328d0da93d0fabf5647c7308c43d278051faaefec9d088573a9e17a4adb4c0e3fe566f8717dfba97b48c27cbad9733b99cf815cef8e70547ac52a6117876dcbf5b32373ce3ee2dec1b03181f96b5021e606e0d0f5147d +ciphertext: 827a7490354edb1e9e3cc45ae3a5099d9e05190b4328a35a6acf6472e2328bfecaf22c8b527cb2a6e9651f162d7669b5ff537fb246f897097e413cf1b6a3bfb95197ea039ee20ce05009ad346e30d68e1ad590b6318ea9c99d1aee20eac0b149bef60d78052ca20f1a8eb623ac39ea521127c78a3dfc82f6a80156eb4cdc087c98c7815d19f046a02c3a8db667c2900eb79681c831acc36344ad49824ac5f1b7e7fce6a28114376d87368361f1973134745a51891a6ae31c5f9a4db306477596748c7f96b713ca9d3538f9bf7474b38294f64dba891e4a71090a919d9ef9d016f989e0476053ac9064d93f6f79a0738d32b7d4c07e3e399d7da9e347e2852c9fd41525d8c8aacc081ae1d54c096a2ffe16fe163ca92611f35617fafbc34ae528f0abc799965a1cf0a5e2507b54a5e3fed4bd075949dbe077342acc9a81745f8fbcfc98e02f9c57ba34afa6852c97b0406cb0daa1a2ee698fa2ce24c14f365e97f70a87af8585e27c749bbec6964e477fb7b125086af87c6261d40bb5c5a13d7e1eccd0997dd0ac1c6610e39aed2f860665061bfcfeeb098ad27a1df689bd1d8f35f7c605a378203671d9f89bedf8c81ae1cd2f92221b10ea7e4b11df0ee651768b2fc9090e487661291f8cd5aa8235e715e703115622cbdef995470c7949f840019b21963e6ccaf0809d0ab0e062f266f73e8f07663e0aa03f3985221ce329ccf450bde333b68e092bec32bfbdb77370f0538b680037101e29913d64901825e128f261710769e0f7cf8a712efd3874aea36a0e31ab80edd68364500ec4a239e19ca3adabf6dc3a6cd89c588ce94111c346af3f011400c449318a83c5903eda64e751fb708ac9f6a715a3edee84aadcfd4a032b8ffd6fc883dd39f47477c8c7bbc50ec8249375b9ba931bd89fe571e57999df1e3b06143e98812bc3974e88252b47ab839e9d04884de236d0e83d6c469812e48faedaccc56725496c1abf7a346446090c639123405867e594577b85551db57347042d1dccb265c53c9da864f610cee100bcae79de2bd6d34cffa220784fe5cb295d2ace2599f6be8c712e7b07ea53f07ba8bed5733ddc067963fedc7b89acb37f96bcccd92fdd75f223f359317216e78ceb483fcb0a5a4512525fe28b01a64109d4adff56cf94e10bcd3ae4717089b4d9391a1f2647d5799f0f9f4aea3538fcf772cb52416d395ff7500c4bb151185f253fc9ff062075e1671edef5e23d41e42217d4a771ca04bfd51d5a04ee5e20981c0231fe2752db32a6e276a585530f40b07c59b925f6b15babacf55e42da068aee256707503afed1893841d0 +result: fail +shared_secret: + +# Ciphertext too short +private_key: e90713d249370b932ca66661f28003062754f603035c2a7b54a116e479c3c83ccb4681c26d7a975c0a757be243325b3450cb9f9994679d0a9628e6421554a1df4c5934439098804be1c56819b0bb1b84acdf85a82a37079448a015c9b8d35bca28d77a2c50a05ba4266dfa475985af70a24098e630f4d49ffa2b4a0ef667b2a762c622beaa456f17263d07f5b6ff2a1cfe5112c834c88b2793c7b49146860e187711edc2312b09cb17262a12161a2b5758c3177dadb1144bd40531c71ec0d19524a310f509b8f9a180574ba128b00267e02d5a2812cb55c965015054d4545f16328eec7316e77af6c888428737e6a37582dbb5f628b4c602b1e1abb4c094694c31939b9a09e31a6999201e33ba4c8af3740bcc3bf5c657ca46c6137b932cf12df9f8cc492b490bd01919fc0f63b485fb72b709c81e66681a039bad63a261655161a603cf63c57c2db7cda558bbc73c2aac75b00c530e42f7809b0c8de56c928aea3831671933623c5839c7a40b1b14cba1762b65b87b249da750f183b12e400fe03531d9d1b1889bc1d97b5ae686718d5c5776b0094f671266535147206e65f7b7efa6174878c37c05b9633c84dd48212cfb0518fa77c3db1021e6588f96588934b149674912016abc7193ac779d6f98c3e0a49547bb2646570b69b26872f772c3bc502a8643f2f24124f76f2c22aaa3cb6c95060694a9ba1708515851c09c72c5fea1cefce61551d62e2697425a0c14cc529a30105856eb6ce83a19f50c7c2382c104563c455522e1b9a79fa1163482be374b84142b903453cbe7b2748a1887442499a7a58836194a67c7342b20949a97c4a3d9b8962572d5aa797f34c51fe72335eb824966c8a8bcb7a07709ace0b54d6b267063ac9de07a5880090670bfe33c33110877feb1ab0e28450640a171966fc66b7c0d43c20dc614b10aa3e54cbeaf7946e70927a4235f85c4832a9a2f26e25b40c5a332e3ca9e71430d29889f8a04341b983b4792f856a2c9e6b8cc08a3c3657a83fa630f53af09c2a460f93f5ea2572eb960453ba19201378f30240f99897a08a2cd5349bef47f4f176f3658b226ec5631a26ec95285d159593b06b37d7b0af2d61e7a566097c25acf23373d862c8fe965b1fb7d12d162054c299487782d1a8ed5490813d943634b5a0e16ae8ecc419deacc4189be3b4b20054589cbd669fde39ebbb0c8747b064e1b39daa6bd8694b429cc830fa85faa7883f41c2bdf801b09e332325ac37984ac53e06e80566be8b209a137905da10485596f63e8ba9124ade520b9d9194a5be81669528384728429a4b0a4b6a6c75169a0d88f6003840fca6976db470d214881ba7b23dc5e08c56b519674123c2a94f25910c18147400ecfbc9d16cb07c35714c2f7321968062e626d1e6aa384324a20783603c1b9ec098e46f1c052db7b679c1f83c4050cf906f7a8b80a4951173339ac304833081b23c242b752b835ca745f800b1c181a9751909680c9e96690f5b91c8ea32a2c6133b6238cdfd50530f25c52995666e595385b9c97877bd0958bf86253476cc5ae0c2806ab1ed74335b01b8839037164c4aaf428681a309c22bb61db498f1edbc7e7da9b5ab7ca5331707411c36de9551ad9a18ef44d6df79ebf2a71b1b7415e6428c7992508d2b3a16bbb02aac0783092aee4803172b08cb4cc05311cc3f85544476e93639df8f361efe28969b93d4059a304a177be781dbd8c30dc998f9a539f751bcf163b13f9cbcd96c5b7d38b81b002889f82b0e18c379ed59fd20584ac6b231341c632fc6c8b58769e878950ac6742087d2cd4ce46b21443d49fd62260bfd534e126b1d9b9439d389e996a8f8592291bc2bfdaa3346ac2bbfca781efd64d6deb5106f11d61754701c4364f082a29fb6208d36b6f7b7c2eb61de12262ccc363f777c0a6b0177bb32a30a65b61c25b88b4a57683caa42b2fb756a875d8b6ca522ecfc21d3c47b5c09ac2de2024ad5183299a80ee072bffe2af3a445ca2a815ded349b421c1765217df2388129663a5722a6f4317452982e806519127b6a8a38604e5cfb4513f4ad523b077199ffc304d9b306d9015382016dde712fe5c755835c327e561f4dab890887ca4452437492062024ad3020e9aa6aff26532b2615da2982213fa4659d606ee1bc71ae8424b7802d046899049c98779c28e338de6b1884f2b451e0b62ff2cb761ec920ec77d1c63024c98ba73a19db44ac56756296bfa19daf34bd5610aee727c8d53af99a5c1045465118b00be96387bb3825c5b524b59b0731462e1c0a0c0507927500055b291d38a37def47d15db22dc1bb4dab12963d0146215b0911a04a9f0829931578d6ca26b512637f158d1377153a7352a06ca1cc7bd6d3b25fbd4bced49a2f453ca21d703e1150c957b0b4ac0a621c518cfcb3cdcab11866848aad3a7f9f3853c854c89d591c72bbbdfba6072f811d0492f14b654ede6817963984e2411bd741c89e6ce50910c5955c3de70794141b33e3a5bc28c543b08a146a470c22025e3ab314dc29c960300c8621fd54ccc84b19c2b73be425cc91d92538f803ea5e6a23f2c8f0f74cd0d216a2cb807e62316770820fcf43464264b7e497cb555005cdcb1a723adfa846786107c08538617bbcafe4214c5d186b09c7c9939204c10cd967319f7e098540084174c75f9cace9a799a1d46b7747b9192999fd727622a537725fc25322640b0338c63c31002a3b9c05c188bb202929b9b20691886079a37c2015a811952a377f55098141bb31e11b03ba8761440257d29567c190ba461ae55611a7ddb1adec91cc81a4ec12473d4775a693bb3f50b8ff533c924748b9b24a8f8f3cd5ec230ad1a7ded8a3b8bbb0140636ee25a6ebf97bed34399012323fce09348a6bf6b016d90b46a3e06afd817798181995f21720e37cd49bbbd458caa5cac23d653357090c1cdc7a5d005c513a23b8fb1b9e3b7ae6ecbc1bb53a961b51d83844a52220935246e43643bd46c63e885873bba8920b57561b97233760b7540c36d4376386704bceb93e7f50eb47cc51d260d6c79111039506c6cba79914e5da5ccb593b0ce4c1e3bc55c19ea2cb4d240355745b9c09715310afab1a6afb84809ba81169a6a5fe7235dc1517ee5505be92b6a8201521371e44280c4473900f1cb402b4b3907719c92cdeda70ff7a481ddf82c76fc7cce18bc07510917dc8192f4011c7945dd81a6c0c3bcb646101b756adae42c34bbb912a78b9403072279081b91752892a9f39b02d22853aadcc09c2273cc429411048bfdcbb03f92001e353ec427c939c5c04519c7a2a58f4535c62f832463898012d8374f2571fb558652a591fe1034f3bb4462e5095f0b69a3855b63d6bafe749389e196e05766814839882a3e66a16e0d713ce1a6cc9aacb7bee8b73d47178677301562a41b907f4b451859500bc951a252693d485a7fcb7c0a520554eb96c4a27308d0b31205b54803699f8bf4a106c4a0fef64407c530f9d183fd233ab3e4057aa80dc2ba89e632611262cfca8c9004e0656d56a0fb1696eaa381ddc39fa89bafe6e51de20b8fab65cd51265927b371b718a6e9212e992b5c3bb56326d0224f3c8f01e22254d12b3c9a068dc111ba327c0fc93cbca46d69785398cc7a89a19df267b64345ca61ccb27fd57c60bc2ed5550645749a9b797cf11a3572767ff41b99e58001ed664ddb781deb1417bee8957b8603b6c495097b03fb67bf522531d1b2c2a1fa924445be56034b4982782d357f278973f2d8cc0aa7419c018cec6c7400e563c6bc3eabe61df8d9907414398ca99a2f76c4fdba4413f25f928b416a83bfc6203401278ccac628e009af98a2b7e7dc11367461f4bcc53a5b08603c0bbfbbab0b94720123499ef63b8aca26bff9c88b595f3e7b9a5eabc209c2a511b464e53105f6ba3f489c1988c83f03f76f5f06a1cd9bcee1a2381ceb85e9976596e83d5d8c72c9d7321477362f483ff831040934c764a2a8292c05c8466e7fe8c505d48a38758523997c7c973c90da8c1b798c99a03362f8234e7b697249404295b4e9e69b4b8b9523f5b952657085eabf5d731c2365b2259c660b99bdb166a48bdcad43551e0ed67340b039843a0b9a241c2cd8a242115ac07acb5e67533230c97d33084a6cbbbc99bc8dc232d1b709faba1cbcc49ef41979e8d13e49535a44f57b17153c1dd889aa279fcfd635a53b76728ac32288ae42626b6ee11889ca6c20f58b08f1a013865d760a8efaf43d79c9107a14676fe7745a3a0c802b8605a7262f7bb900f0531e108fc9d54b687c4dd6fa5f8d18a2e3640603710fed63cd49d5362fc12608551940095e6c4268b83907fab590bbb39e34eb28e9ad780f5858859cec4141d017298f34c298ba2fba41ccc6d1448cd27a87b73a9984be0f80989f17f1fb6deca2c84aa6c23c51d269302dd1fea96ba10d11e6c284a3d11781d83178f96cda7fa1ef64a13e +ciphertext: 4f935dafb35b25cbf6a89fe7d8e60abf189e5b949e049961937d518018ef08c2fc3f46e76c8c8bf679f1d42aed17c596839d1780aa244ade22d72314617e6a64593ad3f44356fb3959404c260480951b3434936102325fbc2c8f229513727f9748fa92cd23dd3778e52c6aeb38b33e0c20c7286077917edac56fe8918ffedbc5e70b51d752917b4e079d599c49e1eaa2de73e2b19da0068b82f7512aa3bb805ece9c5d597ad5a7fd1167803d9dcd4cd1a699bd36903227a2cca8ad71739f39e71ab2d13024fa1f76442b864f45c8485551d151ab410a739e96670aacf04b1e744e1abc5faaf88c6157316c6c7f3f5466630ab876880d6ecdeb5797ff70569dfa2bb1054e3b7b97119e8891cee427e538b14adfae51bee876b9f91a1398309306f752cc1363235697ffddf688f77b84e827554d319579f632d58932bea1da87c82f98f278dde755e6680d2458a9f756796904f248c68407012f26df16f1ad20599baf57e9d414a4f43c34c9f4fcaa3193df821981889f0daf11c79edd4593365e45b82e6dd3cf83c806ee4fb0b4a9264f85ba2511aa88c3abc45e82f514c4cc09e073a2c81394cce0cceab36aeb27551bcd304ba1663bdc96f83c390b5e2c0f29276c93c5deef1cd95a754c3f490bc09bb26528d51b5dd36a7f45161cb455029e13306f52aeef77c0d9b1666ab88d0c04cfebcd350e3e96ea5cfd05833c86efa20a063f911d473dc09976aff3e288dc785e6e0fa7025fedccc12d60700ec4d5adf9d43a37ce9a8bdf48f59d745f1555c8a529bf8a13ae16bcdce7bc637ad5ea9b14b5563768a1cc1b9795b1b0892628f0415129d8633ebd9dca07269fbe1f5664828b913060d6921b488a8b25fe91c9245ebccf879b948c843b824524ce7c5f8b2df748c393940653671b8e0b02803fea5e672861b69cadbf2d991610d132f5f20aacc8adf9b9bafc2625ce5e3082027ef23b97370d9b0ca1a973d9a026f866093fd566ef52f6083dd59724a3eb6d4b31ea5ae55e4bcda519b98007c41c0627a227ea7bb427900aa7c358ef385794022bf72d2dac2837706592ff44b334d03fdf8d6eaff688342ae037c699b6ad7a96a17e7b3436713ea5007b59c2bb98531ae0b232a89c23d4d9a4d9013dd8a17f44e0cffd59c623c5a360d00e25838cbc6b923b78f3e2fa0b24209cfdeb1df726aa7205f93fd4a7ba35251e007b6b15c87beeb552342d656765e96cab65216ed4d23c2cfc8d252afef383e208c379dd29e9f7d541994773500d9243e50f026e03f6619e2fee33369a4064c113ddf2e5ef16de65c08332ff39baa1658a4762875ec4b1ef1d6ad32e8069ad7ee49a979042c071ba69fb491db5476e2f22af5d19ec9fccba0bee5a0f6e11f660f87c9922f245a5d3f87a27eed6f7cb25cd4e07e9fb95961fce65c233b864854a1a5cfff01e2cb90532067b7b3ad20bde7d7a7b4e14 +result: fail +shared_secret: + +# Private key too long +private_key: 943c606225a2c34aa11c1987da884c20e0627adc75fac81895e1ae64bb0658cbc2b3946b15584f21147308eb2a54aa8cf4f714147c4bb85323d7b6a13353546492732576734ad5891cf28186a2137f453d748a30ce6546a33073cab0789efb1f0df53dddeb26f35304d6c621514830a7103883c4b0b4c41a382bac86b5007ca40a908620f686b656706131967a62f25eb3042b9f482ff200ac85712e06c3a158d032ac40493882785fa428aa81bc3ca62157276b506b6916f2207df3c36624060490a48a1615d2002dd9b0a7c8a748804415b7dc80fca8102d213cfe30bef5fa62fe371fa11b6a28bac85b55c7af82395b3992845b0d056a7d9c16b908b42787c43832640cdd4414f1d871c545511b36c95168ad6c722fd55a4f39381276563840abb49b822a486c3fdae695f7fb1014528bb9d5b13af278d2c7b38b6466094b6a27aa87bf865970e674556484f2464485117de3e0215eb91dc4bac5a18745983c4409427a49304c479136cd95076969902a172a0b4405ba00016351c4a5722078bca61470cd68a4571cfa4d203b3301c777273b8bf8c153d2eb1f90fc28ca4832d5268f9d8576a9dc6b4a7c7f8c742ab11b7d980c04ef6caf88b9b990d718fae8a46e3979fd2ca95d25306138263e348faa64a507850330b09e4e95c96e62570bc88b758b78b86401e7d8930e2abc345b75220563bcba985d14c477342b9ff1bebb6529171149be78c8eeb5cf0a32214586ba683501f4c10e09733a4503b2e40a9fb319163abba3984a03d514bb420a932816c0dd748059f9bda8c735d996bc5dd8480cd92361c58b341aa7006c2986a5a08b7cb8cc6a6db5f83acefc206f63ca81ba669994a303f8155b48ca0944556b034d8b030cd648773aec4ceff499c802c9068a7144c5a8fff563c88635f1396127f62f093b7e12745566441f7f02079721892f62b9424bc59a06acb61060a688c1b005821a5516d51a1dc0149f4212b6a5101843fbcc4da1b8a1b13da7625a337613195a43e6c704d422a428a3b6734a0c7034219692898b3a82cb8047f864ad604cbed0ecbea1f0338ca4055f95a3ced36c2e28877a572e1e09179433cafcdabc13a9b7c487c9ed383aff0b52bd96541e65305fabbd07db88437ab3227763dba16ea41025060a9fd17362c212084c17994963b394086c253c7b74e082178b8092304b5582630cb8b30dd8cf93a762d3520a6366ad32430b6482cdffdb627c37066db12244d8573be747c3a59fb8103d9e013a5b2ac9c593331602130f838f99e08c9cbb524996570e93a7f1cb7acf671014b87f14720ae8ca8f56b8c5a5bc50d7169c309b71d5bb5661e45eeb8b5697a28b684003eee83821a32aa7a9996b848f7f81a8109847323513296ac682c93893e4005e4a6b5d8346dc0a079b425d914b68e7c3670628c529277a496aba4c3ab9e422805037306114245f425567dba6f6006687f96d8c868d30b9aeef46c1d19b5c1b60c5569b9c3e14520a38135de72693942afb2aaf369673eed59b1e3087565721f7949f2d78b31322b9345765f2710ade81c34d20b68d5a43f43996ad911f63391e46225dfef009240625f4f8aace8a9996004a28327267d920991476ef606b514b5a202cc3eb5966e8c7cbd8058de666462b8621f172655280866e3a0839340b9b558335b40de38ac4c413b998d65f85ac0b481530dbb79a09c884641502df00082f9529ec15a09871044e1ccf83f271df934e4f130396089500b4959cf1541c359707a15bc54b29026a53fe03a9529077e4385dba1724c78795dbc26ab4e488004a442261af66d6b0dfe58d86eb4460fcbcc37a982b75cf01719054d058133a14d078a9592ca811548e7245c19eaa2bd5b519bcdcaae3a5afc579248196181384bdc8d88929faa9b825ae1665b1ad269387f5c0c49c00b0632761006c58a6672611cae6e5050ea50b996a3d9dd405ccb12a202351ede91796976daacc5bd1443d0f130af6362f93c43c80180a50cc8ebeb6a26d212714e1cf41623e2e06b5c126b8433119d828617e78b159dc48bdc79d6ff631175a0cc8ba5e9e2818ea5a8b82a16c577a41eea50b81899fae49ada6239f32669cfd77af377b1898da85e4eb9a65c7c29fc486d8b27a4b96473759514ee45831888a24157db777c740965912f2abb917626f3081ccf2c98977ac2fd6c5a0fb51ca1a92e6398595da255b61903011bec91287de905099c6941459b4ab75af8f07a39f0076a87a138495916a93197aebb0442521abcb8649a4765041b10a850b8b708d8f8b3e4e2aa1b0b29077a3144b4c77cfb8b835b260ff03784e80063b6773742a0534c55860010939698738b3917eac3719a3b786098fcea8b5d0526db1f28db3e5435a4a83418a29fafc0a5d5912e6095cb80b4d94f92cfaf4c604b246bc2ab495046de02b1719c4c4a3296bd37bc09278bacd60ce4bd62d6ae123169a5b7f370deb1424bff8bc47f62730861288eb6eed6b8839f1b05a3961b18964a2042c1f393a0832b4b48973f5d4505f417219fbacd6bb5ce3415552c12c2b1561275638cfb9c80e08129f9336888090e7d99a09f6cf48a0a5ebd16a04ea814ddbaef22b2ed5522885f64f46340aebb58e81f694a3655655855fe92c0a140bbab9a33caf7c7eec148bbb484e46819be3b56b11b757e552164322c15834930b12bd34348c312c43847c9046dc8d11b045fee778a3eaa6b94228b40378b4d8c4b4181aeaf257fbf884fa288e42e230f767ca1ffc5631906fba06a0a2d150d3a5cbb952c1b965b5b3532291c93d500390f91a62766cc56929210a453c245ca0aa305a9df652c1b21ac9b249625656b0378027618a66230351bb9e524b91b5d6a6a2448e38b3bae321acc20669ba40165c20379674368d51741af77b6cb53c1fb5ced27aa56b026664d79d75ab7c45b5a9c222bfd14421140ab5b4c93a533cbc91e4264feac2a21555486c05b0165791a51840c4427d140a3d5a536b077e5c7569ebe7863640540f5c7efa1a9977c9c1346807f233897f525d09bc741d6c08ecdb9aa1c60f632cce037514254595b7991d1a89ba6ed8836ac9664ebb2af0f3a7a55a42342a8e2de751b2775a18778dd483347d6986169c2ebf313d15634178ac2c73c09c9af147f2e40e8f97baab58ab507452812211c7ecbc9b5446589976f8c385e92bbfa3caac83b24f42d5c1c2c66648040bd6d68f36160ec8d65aa2977edc22b8e1264f477511d571688ae1a4d17389c98cac151a97d5656e0004bf5ac01483d17061955a59c1ae35c4bf59081f9e7214a42015c241ad3dd677008099349595f7b0bbcd5baa04f126f105b1c6082d161c36fa307810b414ed02b0d71880cdd5ab8354749545b549db1979e63ddd5978e4e660dcdb966db650e0b7b70ed89b641869f2639011aac6f3501d1216251e41aa481689da24117fdc2585bc183407bfb043c0f1624b79f2b922ebb7e47916928403f5a71ca55cb50bfbbdff94512355cc78d208299847dd4c353f1886dce25293ba8f58a58773f062c5c8ad937c2f747cc015f2bce8a255e0d2303160b6c4c274f3ac0ec3493c1173262358bebd17668ccb586502140b399f89d70d53b0a2eb09c55a64618038989bbca8b6a79efc8b60b410c3e6256f5c529fbde92e0029807ebb4b0f4999852315676b0cdc579f9da4a3c71012c0140a50a4c2fe8cb0e73cb1d7393f65b63666759864000578cb5fd8557b658bcde1aa67fd495d4bc16f4cc78d657627e83618b8f78c838b17391c321c25cf9ac24dff5c67f81067acc082587449e41053580c5e44819e9c580ca8b4943093cb39418713f5aff88a2f4e1c1e81c271be9436a23111e63a6e79654b0d82b71ba2bb84393aa395084e60bcaea947c033c421e1166ac41d40a80d2f2251e1c5162d49707b5702298b41f0d641379c7092fb904bb5a10df4750113aa2090aca89517b42071f7b471dcc9445d6b149740282f0113443b810533351d529616002b71843ec973aa0486b0d5d888f1d170d046b82d65c2dba60886f01cf0b3797b817c435cae649064eea8107f0c7836260fb2f7c9a461ce2ca16100370246011c8bcc5c00592554f6404dd89c2afb0c8c0707ded591e2282cee3aa802cc76765a6e29ea2d8cec8265908155d43bd3d3bff1089606a9c63cd98720fb9a0dda0176383c02b9ab9504b6ce7a5917654f9b5333c6cb435c1708d05c2921710d7f288cc01b4140c369a1a291a5a380837166f2ab2f17bbad71b67f891b7d14c18f03c6045ca0083f6c00b75b9e5c32c4216a0b1eb22134d8418b885e6e157d99c89e6243935d4b14da8a5ab998c96453d0afb7ca5cd4b1849023bdc021d8b6ab4d33ae99841c5bfed631dde8e3187afa61b8bac7a2e866555ef933b778675f1221d329d19728c2217917f9f21dcebeae089207ec643b5dafa02a2f21657873a39d4c291fee35c09153ef8a081e5a5deb19265e00d4c1a12ed39f08e2cd612d +ciphertext: b6ec6b1a529ee870502df40aadaa48ae39d52048b16bd3f9b17541df33bc9d0037966b05bbda1a78f7ba73c3ca2d54646dee58f9aee6e33de9daf5f72c5fb36e154ab263cac50412ff27088ad5985723bcae5d942883569fc2ed01ee52922021380ead6fcba80547804756e339cfb7521f565aa1f584f63a40933e00271536b3e23dfaf0298110009fb3e61e9dc6fad251a0794f3457978aa8eae06ff33c43e985ec0ebd5137c93dd47b4e9f1fb8f25eb1b2ae27faf9a7945301b4dbbbc9e3c4e62e9c72b59647ff8f6c46f78ebcf259046afa4bb38d91f09c812bb7bfca60e3a36f692f6e598211dbda5ca12988267d6b80895ee443e63701e63cf04f9c11b9b9c79ac6dc8df00dfe8caa6c1904eb16be612a3b66aa213c73e422ae260b901fd6e5ffd5749ec6585d5a8427a901d5783461487a717834347c251540a65a7e539b42afde0274772aada766b9f2aa0cca424320aa447bc8170957dd395a1922fc4ebfd048bea4f18ebc302ddfeda5b0d084c1fbc3e8988cfee0d1dfbb6e43c75508ded1e42a6a842104f4aed51c025a25954455faf376e9ff53386ed6577436cc16ef8b844e72f123ce08d41daf6e8fdc3eb53b37e26412f2ccccceb91d0e0064d1201ebffe7d2087d03436d4f12c5e85f39aea08bc497fd7c85c37f3134ba893e91182f39f93deeb312230391be7aa5c83bbd6bc186edb84135b14af24a4eec618c4f9eef4e053bcfb7918046482a91c3a14be0028f27cdbda0156240d4883a69590396328bf0caca5cd6f1331275b36a7a6921fcf3b4c6f78025d00ff82cbf73154dfa1540fb829b5100414e6c7d71fde1fcd55870112db1dec2c9910f7cc9618497c2eca607d1202749019f37c99445f881b906377535e138c91f5491f05ba2ccee00c23d2d21a1fe354c3722fb6e1ad5c659cb36e691b13b9d5f041a9264ffd32055dd1cecb5cad46c11da51d6f9630ca4e447159c84bc457431c8b8a90b72589c023f4fab1543855311fa7c3690d2fc0c51238d6c606ebb13f52e59f515312926404ba60e11b684ecf0fd721fcec0a21fa596ee4f35690be2097bc03179830e70ace36297c244ea68fd9473b97f29784c96f1271185666e195fed281557a4aa53de909fd89912aa493891fb67ee0af077c2e4b08c390d79ab13944ef617cf1556a69e2eb20575af535c5e34f378f205023b07b34c9476a245eaaa4b6dcd9cf4ec481f4badf1ce698324e27f6d42117a6879715188b7a7d354fb96e3a2198146fe95446a843b3773cb7c62b693523a88c500377ef47530ec3f538a06cb450000db51811e356f87e4cf25d181ab6701f614cafa23142b677720c5c1184873cb7ea850bbeff3a0a8cc0df7e80d4f0eae1fb16a1137411cb521a66827bb05e6e20a25da05cb0f54d3d8e2fcc1abcd5ad2614c289ed731df60cce1095229af1d726185c03e1fb03b11a4feb017252f6a9093ca3f6f5fd15503ef8e2cb8e43c2a62f33e642751deb32759a490b562b576a25c00d838afa64b1d9a1102cb42b02ad7a75d9aa3c2415d5b8c2ceb989c67148e470af603a9d61033baab4a0f302f033e266a125f1d8f3a62a3397aa026b957e4d2544e7f7eb156d148688ce1a90f94afd4713d34945b42e2497bf8ff9894b28686b60997ef17c41d00e47f8b12365fa254625e80a4138c668e765d01939af2503725c5b88d81ab99c41e6bd7739e5ffcb0ce25a371dcd45f6602425b8dd7a461f59071846e18ca18f2af9604c04c728cb4d245746f0e2011bdd468b7daa0eed790b656c7bc8f5ac9bd1cf968fdedbeb9d4c747edd71b79800966e6447784ee353a792fb7824d9505ea773e4090f80464cedcdcf495acb59da7b455a2c5d213d0780f07af9d13a4ede3959847800c7869e3bb21e6c393197fdf4b6ddd58b827ac524f614f7f3a953bf78c92171d6aa4dccfc0b3a05545444451f59589c988c7ddd5333df733a0beccf4688ac5f1d6064214af15a56dcf0af758ecb49b53496bd34bb3988569e87a06fa8e790bcbadb0411f89f20fc1083523949683dd9224ee60d3db68bb94518ccb03f3fdfd078a61d950b563ab095d642b8567c2943ed310768e5b469165fe7b811fb7a856790efbeed015025bc3db7f9c18266a3e1bff18cdfce700298d4fccd8bc6ab21008536bd1aab19887566844ce615f590b73a4f49b409b6ed8489aead97701a6ee2469535 +result: fail +shared_secret: + +# Private key too long +private_key: 291195d04bafae2c10b0671c38a5a9e37800750b8f550c0962b1607a63c5d1e2a01e03570585840c7433be75000c7c024ff8c1a4580c98dc2aeddb140c578447f3150aa02d311a2de8acc5de2255d0369bc5298fb3805ae6e5473a408d623353ba1586d891a3c4a483d8588ac7900842c294e8a97e6a015b672493b0f74adc7bbd4493a944c419a88b418fd813b73a3c3dbc6bac0bacb2aa88a85b4dcea947da74112708b6b9f85c9307446269c67582b21d889111bab7c73c772b862464890f155b2af00c9238b129261144dd7c627e6c12d7539bde5453b7994a286b730e212c24fc25950115610b83a8139de0306b9ea1955df7b2e964a8beb548419878c714b273a2cd1d586608c2750b5ac26623bfad6b4d0c311a15019cef4c30053384f457727886bc971550b19304250a019cb1866086b6c9ec1e63c273602659b7c146b3656dae9953a0478a9d283488ac220529cdbc9432a482c3386c284b26032f0b0148dc0ad4aa7064a4ca75f073d75ac202b0484a80543f646a5afb1ca335b8d677770cd5a3b1d58b5a4ba074028541d1a7bc5c095f636f040344e8a8c03f838f58e705bb417cde963769eaa785f3ac2a732bd7f59d058a41a26a4a2f16ab9bab98fc45ac49eb0fc8d76c27a4ae190413873789eff846ec116e2471be5b128675483087358331256c44d53661826a73b388f2c269bc7c17e9c496229ac111db20fed085e3b3a5cf234ebc0c0b81d8c4be625c0c676d44f14a81b55272780991181b3db767160a55dbc05104a09da0a4988de2c4f585c7a4393fa1d36471691a01b38302310467b83ab15721ec028f3133bc1f81764d14b38ee748e7eb5dd9b703e29cab8e40083db09dcbc6c23dcc4626a2c436803b82ea5a52e694c9b41505b7cc507c223ff307a6e7a5b5e4c9f30546a0bc20ecc0665ba9a35b79855b994b137691d568c9b847cf4daa8a02f6382e0c9d0430a992651436583ebfe2af9f83a450555507910f18bbc3e3d90460307d573b55fe7b5b1aa70b7e717f679c39dfb669ca5313e204629047975ce26620966cc0c97b7cd52aba6a368ee696b730a1d4e714e8a1b54f4a741a91ceb107b649d13931384d5a180ee6166314887d49760c521c050a81c50e4020d3046ca8b79e6e839de268245144a78da484a3a41f8c996e73eac33ba167f048a63ee075eec501c2752416a7b3ad5568a207cd7682c1f191a1c748b82e9860b3d48814e57d20fb5893ba5ab335c70bf4cc6d33c335f4cc87d27f521a5568445e0ad775acd474442427e5357e079bc7ad283fd544808b385f2ea717aa41abbd7c4028d97941b78d096bb6624c6307167f04204bff703e3a24736b5cc482f5ba6b9322bc5b33e7119c6e3c9253236ba71c7bb1b04b6c305c18dc9042fc7a55e110057254bb143249ac44ca5b7e6a8380f91194466aafd729673a8438ceeb59c7abc955a2bec748af98124372038178274b78b963d9b7ccf7bb431cf8a6e9901194ab3f40e78ab15ca50ed146a9f9782913637c2612e1e522eea605afa72514c801e9b8a3aa354284b0236c12b8f049130b33601b93467131132fda720d01a54300348c9001bc36afb8b03593b63b33141cd4c12bb46a89d3254ea3dc10b3902260911325bcc4b56c3585ea4c5c7cc469aa8c1723669cc2430e482210e73560c83e94944aa7f507b9526db60caad2d008d5ac7d1edb218f9a1ab55bb17099a23bb32d7f61a8254012f8bc3cda9bce3302c9d0612b15b02e809b18f640c4b888834928984bcbb6b4c17c56208c64b1bc747152ceb8581f87641e86babf2634fd708224e082a0d36b812c4633405c72ec8aae55350ed377c423b2d8d866cb2a09b75b15f17b49f4e0791b4b06e11018744204dcd0ab3573a71e4860b51c0dd1782ef706c0388c24e0f6a4d41b787505c330546c9b60bda0486c9596c265a934f094098017020163033ff97c697231d90a5c361b077d9c7da9c83d4e926589a76f057ba325c02ad04ccf1f4a54e01745c794083bba49b29c0ff7053a22248ebcb0af5446a71e59cadec30627f7880358c7a92bac7d7919cefaaef5f742ddacc2bf92344800678153706c188767958727796d8b8368f6436b42d9b11eec0972443a7bcb36640561ff2c0fff8228608119d6484a1551291f6b2822d094dc739b087bb440d76ecc654791c396b1d59c3bd31cb4a420ffb16db2fb794b0ac443e9b562f8257f6c4a699b46d5fc02ea88267b7a023b290d11618b27826f1f5161c2fc9dcedc80d6b4cf907061870048ed0540764577bac81cc18446eb0a3e94cb2bb9621f7e242a567367c3bca2383bcb3f584de7dbc3012a06520a2bc2c27e7fc31b661b9a56060024d42ff6c3a779729f309b63acf07289a678ada6b2c864c1b8211fb20b4598033c4182ab8c778c79c4c1eec7209d141b901b3481637e696c4886b54c1887553db9014267a968c671d4617bff858aaa34cc10467470d2c96912135c6a0c69e323aa787b30918267734d3aa387b0531c7a8b8dccd7539b8b115e791e11742434e193496498bc98c18bcb288ae768c0571d93102dbd974624087b84f9c35f4623e52881601cba333651856bac46466e6728c8dda601d8a6c8ac96b16b6aa2ccb374ca2328506b92a1d46ef9861aab6034cdd4b338c2bd901c4197f50eadea5f6d103d26c00dedc88f851406c0b666fa2970eaa43ffcb98b233ca0a3e96ee2fa7498bb80830024debca6097b500c234c7bb3587e4b486cd34dc2944d2473056bb8641d327731a5170e827e2947ae3389a0f65b2205349987e06f83fb3bfcc643eb67c5d074babf72ac1cec481c7533f60bccfd6b707a33a838f4249603ba77c6b70fe3cd4b2b5ed4542462fa2611d75add27b1cf453978318a79d3941b112c7189a9a5f4a73ec99a179a2763c804fb28ca69c2314bb02287d533a7b4193e192d7d431972009b10c838eff366f2c13d1295c2c3b4295280615ff5303c3975ce79c3fa54c6a7e0b6621608cfd4c8d1a999b94a5939d53e46d668b8e89034b09db0e2642e513744f71433760ed5703bc0d991468a0753b9a7f0f1cefec60e4416c59bb17d064a98a1b4896de23eb249b118794536387b8a9946f7f787c17585c9515fe2098c0ae585f5d69d5afbcbd9c62d1d2b2cf7877a71f78ba7e44bea89c045a392a4d701e2363baf25bc41a403b82c1026bc39add450c4448c6c6a9b40625272d2ae561946870c3289299dce9b9a3e3722b3c0257ba7075ca4840079a43c0658c47c40a6d6947b122965d081e3c22eadb621d8b309a36b3a4722ceebf09cdb606d4246c009409382b98ff65a4f9253324fa448ea332383cac40a57cb4959bab6dbac2ee18b6c1958fab67c679771b70001c2fb4c5a18c3e8d2c47a91b37c525cc1e4caf1e2795ff6a4bd62a47bfc4f6ddab0e5c5826f172d1b151e54782e0ee25a7a795101f0ca20eab827582fcae193596c5178a110101a0dee9a001476a223d75602c73b38f910d0536456c1123ae05dde3a6b06582d0ec183bb4577cd74b684a449d479b057660ba42a05ac1cc39cd50e15ebb4ab3534cf2c662a7986896b74ee038935fb240daac5f0032f2e00a6f35087aba77fa1001acad070dbf47359fc9c081ca6ad0a2e2117446b9ca099ea07e403659686965f4ca7e4711c5a716593d65433ea559d1797b6b3aebf9c313f9b1f34b8002f307047792a4589313b9b91c5bbbf9f85797bc08f317243775b4683c976b89b662a6310e2ac7edb88ce01665f177a8d3353a98c920b7d1745d4c681ef977ceca15c8c740e8faaaf6bd9906653c5ada163c0803e8b9c612140992dc3a0d5ea1e4adcbe16a9051c6a2abdd37807b9475292382f03a6b815c15eb403d105667c585fa6e1679df44983741995a2875bb01c62aa4713c7697fd7491a2918051010cc34ca9533362720cf4126415467919d0865f2a4c5f4d3365ba15e9e2c3745f6a4fa399d0823031fc7c14b1abcab1213c1080aff7cc82b4a74c857a0dedc76553345750bbdc51596da708931dc2fb4833b8cbb1be90143c5180f7556582be6cd959c0133d641042c387d334978685afdb58004d0b8640b3c7f4ba5d0223e8baa7a7a16503d83723c45a2e6b36290802c4e04c81c7649a32c6f7c100c8f782eb2039f2de8a7c6634c6429248cabb4ae7972c7d336be7290a66a253a562c9b3a5a5ed04f5ffacef243b9cbc4275ff6ad8a810dda0a4ba9a93a44e02dbdf58f45913502a8629767b3494ca39f693b7c4685ea328de5322f0ff0771d9c08243883ac2898a859c48be89cc03b3053a3077b05a5639a8a1a83b87b15987932a5f7906cb12f495cfd5a5a78748ac5c06d7bb4f6e48ef2cc74191e34c42f33d9c31a638b8f2efb488e478fe06e84b2fff41d89f53ed68b927137466982fe3ef9eb880245de1cba1e527720db5504dd7457f8346a1ca7786c7e146e58d831eb8227b5d9ce0c5b3e21d6a3e14a27c30a92f3a49b720c5aedf1b73d139d54e504854f73af +ciphertext: e650f128a267bbb58a5b49b1e7d15e006c38a214e44d4960ceadb116fe5a2512e0175a7924d1ccde7e667dd394f0f1102be9a37da2efa9b7fab4eb350dd0623e9e42b28951cf1cffabaa8a85bb53c7aa6d7f51d3177d229f172fc60821aa7abc9d07872f996ec805502d79537d747694a1734f719f3feeb38fc4a9ad90333ee572fe47cfb2d2e2dab7c0af28a00d7e69110f51c94e7d09e1ae05ed31de5a0bab408ab7691a40c50f9e8c7bf2e4e78325a2cc7cdb020f78e6c1a88bae9e961cbd0f78973b3cf8a37d530eec62238757a834cf03cfa298d25364fec8f5954ff8b98bf273dad246e081e644f8fba63b7089ab1e90d28e6cb3090388e8df9bdb6c34bbf2ae1a4f6f3c24628397d369d7d21789452562d9bd4a60e591e83df8be2f92db029228a38b2e94eabcf4a0680899f3f4b3d7dc7e14861bce90350dcc840e6e4fb051cbc443809a24adc8e2fe6e77cc99ae12d0a615164b6adc7bfb26526a535564b2bab8f43c407ed4b28ea60d855a4a49e1e699aafa416aec315725df01ad230f0309c29e431d3abf21e24a1c1d000c78d57c039bc04a2173f9fae5db98e8a94e5bf3f8b65701479821e2ffbaf3bfbddb0e0f9d22eb69becdf25a5b55b060db1dab8acafa7a5de0c7dc87f362bdcf8e15a431ced32499807729a9294f54c87b011e6953ffeca6ff11e5574831b752624927456716705dc1fa905dbf0ba17303cc681b0666a5788a9c46cb0ffa143a1c5a4a3508c1683accb999bd2914ad3ef298d97adae48ea3650494f829ff250549a21828f52f751082c75604051ea749fc063ce96d3011d95e7ba74a0a901c74823d601685eac697ddf8d202513117a528a433b7572ae463824f7fd0fd58b742948f4d2d1693a17609397f4fd2327480951bd8f11cd199faf0750de0b54f8693fe3c2291d675426d2f02552ee8ee3b15b3a073c9bbcdaa313ece42c2d3c1f5b9dcc3d272ec1ef1ade73e5a4aad0da88bc8fcba43ed2c9065cbcc542f732e41c65e147d6805cfba1a3af7d9cce504d0db08331fdc98296d20698c79646665a30db153a8a0430252059c831f5855b8a97ffb3a59049b4337f1b7565e6387e4c9c55e5c4a837711cc050c4f08e86ca9243f05be643f1001ed259e4bd8c1c6b7a538565a11264eb446e4c0bde9efc64b46dc8e3cc8a15650485a3db63ecbc535b0047742b7b0eb0424fb2ed4a8fcca53d47c1c87593ea8cbdc9827ff3b3f2f50b045449220a6e06d772ca63f08044e69da097bf082b423f393141a3b193d0d6439c79a183cf86e66e5488a7aa07d1e0089caaa12de61650182886c128e8e5eb950e9e818eeb4ecadc9d253946624149829877db04bb651bec655cf5004b3d9ad5e48c94b6a99a7425fad69da35a521933650197d055b3c1af142738b684c4e6956b6fd3504c894e40af278a5eab5b7cf340c0912bce74f6bb56a5fc27f1d4c812e1d91be11b871d23fa44a3ca916a11f27bd04e6c9f911e4e771069672a5aa5749f0db6f97c75383d2bb41f624b5c18ddfedcf6cdf9944420d9863c90b76589f1e8a66e4d4db57c7e277cb3dbe6ba185ae9c60d506006e7b28c589a10e3559d0ed3e9aa1a8ca4291450d6ece3dc83b25202ee51d856b9eb112d804bce345dbd9e26dd16936f59c4a2f82189622a6732c797af57cc98efc302dbb62ca1fa63f76dd2a22f5b8b1c69788188edeb0d0012cd9dde80058b1628e2fe021303a82d65f29dced70c0b75ca87afbdd813f27589bf8108ea77adae498882e0653d53b6355f5446ce67fd03b7a979b2542fa23e562834915e7be090c1ec228acc1ae7200976b0d2d3028e9eba3dd29a290aa7c25342558ee079b865e5418552f58084893461beb566feee04ffd95342a32c4fe096fa5ce6b22fe5fce61eade9cfa590ade9ad28c75290d9779784ee1c43cf1c7c0bb60bca6722ee58657bed58d70a7f5f265f7e54e11cf7b3131bf68e19aa711b377657e42c75b60f71100cd42ead732535e9008980e6964e4818704d48b579ce5f28f7643774aed60d41d6a481435ac79d0360ef1d1d4a42aff2de58d44d4ba5d2642fe13fc941a6a6d2a3f04e64e687fe6874320233587fc8a59e2c5e89fe49776855bccaa81e1658330eb4210ff38ccec2ae4e43237bac3b5212075a2e61822a8373fb05d6da352ce4a3ef485caa0b3a5e8d401745375d08150229ba0ca1797e84c12 +result: fail +shared_secret: + +# Private key too long +private_key: 3484b7386458206b9dda1b51f6b73bc7e42fc61300b92133ac58a6f6c27dba5533d7b826066ca6805a67ab30877e4a9f6d035872b96464a4c26d34a74fa64642196d204c76f24885633a1abbe73fd5702e590c80b1b7c6e7bbc94d720ceb4965e8374c6f861abec92fbb4193ba829a2968aba643875d25977bf1c58b3416663acf646acae073cb70b704bdd468e2c44f475274ff8c66a1d28201466b607ca5550703bb2c22b58a20144037c7442941177644f230fa25ba0d18c3c77a4c4125cb5086b698007dafc82d5008af2cd6b2bed11c5f6aba8b322ef819a74d06674d468ced928dfea08114b193908aacca86b95c475e3b15098b5aabadf113760bbbc04a35e7b36376b10fd3acabbdc74fbc87b28094508897392d55768071912529682964210a9003556146d327b477bc5f97eb53c02394b6240a383a960df8c36cf48a1799c2c4d30a4bf84d20386f8bb515b3d9a904543d9ee69111618ff6e66f9e1256c1305224a74b72a170836857d0b44da9a05d31843f26b2b1ecf3103b643299eba5ff4073d9a6a22b225cb2033a4f356d1ec6a7f6fcaf3636683ad77526081c1bf6892410034f5a8fdfe9987982c10a689870c00a2876be979479325bba43ca972f58147ebb23e174c151f47a147585b595afb3c30a7ada88eb1acb0e0558b39abf948591cca1cb436070afb46fa0e8003d1134835b0ecb7599828a194c6a1b9dac81a7bc1a905c8c9f1c1340b6105dca213d41c3128803aeeb5c72f0c02f39401d05063b64b9083544f8e5088b716200769cd2093ea1b9ce23f1a4536129cdb912fdd191c32a38bb212461acb8512562e9e215034a1cf8862530c3bbacd0b60495ad8af6a3723c88c53bcd6a843fab762b711abef779ab45a96a13bb67a88609ce4a10aa190f531b7ffcc94a22a9a0f161975ad5145c08706d197e19b328c3b13cde572e898c3cc2c637feca354126344d4204e766a1382633ffdb4928e3a24dd158325a500b56af947074468493381423f3a75a4e9505fed382fa850592f460b8738f7631596623666f6a595de718da247a7e411cc79707810a48eac713e33a4c62e83378a540d8c7aa12074a21ec38bb928652f3a933b62853c3002b439cb8f0248e6cca81054c21e0624081be63e2713399c0c4f570922c01c3a303e415090015c63000c4c5f7c6cc7b3ebce47d7281ba6de6470c5b61ce9195b9a3afc74347cb5b517e8396dda9884c508e551a1d2a057b1b00abd402cbb8928610b88eb00a5adf784a17ba647a7c7741485a6e6569b3e9882991b17443a89402b924504a7609c54a5787ecfa03dfecb0be1904890384dc9cca6a1b61d2dc08a1964aa46467a1d59e0c77b26f810215d44a3b984bf3d7c358610de69cc3c6111733a4a6dce2907c3a3e9d9a992f9a744ed7aecdd05c7604cee3874c1e39c6fd27c680f9175cba109aa1b3a065b3547197b5e973b70c3eb68126229757c9f74d5304025ab3b657c408d406cf7ae364592593a539b75c34bdc822c508e850d7e974c1f21f02292b1ff1c13f06566c425f21b02b8421a6a3d170c2ea3f9db8184b461d1bf41df8e5342ca4112c7940d3432770996d99c4ce18fa21f0b0590538bcb2d81c4d15444224995888c655a8c6e9acc5a8d43b62c986cf77567518728c8b8643d6cc0dbaadfbb87fc9fa310e5244f46a78a9658a54568df076317c69083f988673549c48137fbccb48dde487a59932fc333a79f376c0c93510e30b9cf6446af16f64869f27933193872c9af6997987afa3216d93d96618e1a1d3527f3891473f6963fa39cf757841936b6154ec223e892019fa6fca40b11a80cc9543997b9023d337a00b948f1dd44bd40ab1be0b62795c49f246642f3ccf053c1b91c5b7d97480a1c18d891baa5f87915a950b01a3b272a87cb6cb06327b95e6575584e4aa9579521ed95fecea6ab6a47dcc34c6afa20974d1407de24ec578c85074476d292c5e57331c02a7afa72f4c64a2022962732538d288cc187aa6fc70700978c51d18ac4104ad36724853805f67e5b63bc7b284229c2011b7dcc35da048891c90c29ac84695413404cc6231084e8ad87554d055e9568d338a786e4c86bd029ed57584f050abf56b6cf573a2e23b793e31536ba618db208d6b120960c3819ad07e32043512615a47f83cd8c948599b52412754ff68689d131e31c439a6ec270e79ccd69ac34c274aafc2497bc61d42e589f20751c607627b630454e2b5f5bcc1e9e9278c87cd27d13cd2c6b04d393e62c61c5f866ebd36c2a5e5cdd6520e68375df0e5c55b8269858a87452b4f6b9b02de074493909a21d35cb0e4cc9c4335a6509b720b7e4459bd94648389a76a117010d9e410b44c9425d51c15502291362c6417ba84110703354ad2f1a86f671de4102e6d549399f325d48cabc0f68951c0b991722444515487f44b7016c5d2cc34ab970de0e57fab18b29c22b439a55f76932aca7b2e9d56189481617b75bfda5336ce87a2e53a09da17003dd94d5adcbbbd0837aa6a4ea597b0dab4b14d4c34c21c61ce67246b2576e775447087493d3683e7da7d11e5c57aa30dd460b617cb7bbf154ecd1701dc4600618c8101e335605c4a1df2a93c460eb5cccf7c16826f076e772681d16441e64cc62e0a424d8237d25c883904a020dc015310cad8383fd28c4776c4b04231858631989287bdc6a47dc7c26768c98292b5930b7c8868fb187db66ae25899b6d96b24da11571997e3b39dc4326f1e366c9ad05783fa1201619dd02a7b1c6ac90133060caa1dc06cc2c1379c1d44a9cff2b4c4a2846d3a4b71fb2e5b0c3a246ca304c533453961a5378c1ed303be477c8a7b381305be4d2961a96ba664102bc8398f4d7b69d4ca788e4b65a35a1470a12590ec075fa941d1cc754af8bee8b137bed9bb4ef3c8c44265ab49883b39718a97732e93816cd78fb706a9ab860e0e1370fe82a7877b9412ab563269b4090c37aadb06329b47f3865d233c1b655b0b9061a833e81e0c219731ab9ee8c10ade2794aabc0c3e3746764305c6d6335248459c09ba50a5aa39d9b0f8817ecb1b146bfabb5ca7831cac7119546a556baa9e50861107284253b5862716359919c9c6b26aca8b33a94b1964367f4ab2cf6bb5ee0a5063784b42467b6a4433ced777bbb2bff25203aa4a4027498fe091467ffb6a31e9b33b27b8b0b976df2554ded151b5598a5314106e128e1ef99eb303a0390a2a8c23abbc6c4c2cc37f6adb0a4654b723da2490742500f92b40b17e830c7a6ca6cbbbd415a442751ad0a2c634b6f8b9136baa5e3188528452b8abf32d1e42742c3a83eccb4304a0c61a13cf4614c355d350c3aa498a21bf56a3a8f929a89bd028e0b8641f5a92644c2a0e50cb6ae865b9f3380db0ab9e8c77af75839a41aff8bc3283885e1dc10a8f204122bc45e795a50c3619adf8933969aff8aabb994a3fd929c7dbbc474960ca9ce20afad68d26669037433c3579760630bc37539827c7c3a9708ea2643d6ac7cd9ab85a8f82c870436c499888b1e3918264c68bd42f522840c4463b8089bb1e90982ed20db1137564f26c5496c88ad60970e350166622dc49c8039c791ab78c7b39b9d5930d79c25481fc1fd1521b8dc43d67f9b592473ff8b35b3f20b62adac1245969bdd3b0b9a05a10aa4db446713eecb110bb3eef90c1558228424637478373d463008c58142eb38f57c47a8aeaba55b5c2cecc36a05a8a88d420c1eb609c418e5368c362681a63e7b03dd84779445806a7a5c91a11c22a7cf60055313635b584b0d59ab8dd877a415c3035f3589769b1b83cad8a2b9bac7a97ee7607aba69635fc8a645584b02a0da4c63fab9387380c971bc2c3958cb4a2b57ec4c1b2b5a307777156d4f81875b82475bba863845b89357b33b99125193bdd6a341b58c5ace564ab0b21411729b9cca319ecc82f78302e6a95f8b8cd67240b5c95cc23a7521ce90ca8f44630661ebd611726f4b23c0998c63b528e3919ab17402be117f8425e7881bbc6063f883aa10043b70d78add80b1cd33b2ec3c12928f351e70982aeb2746ce41aa2575daafa5a3100125b8c19bb663857288f05956dba3b3bbd632e4e17ad6ed5b24c462e78a47a45b94634c44d93221cb7e6b73df7bf624656c3f841e90c7a7057400a46cd3038696ed6372ff91de8895527b08fe5760634a82ca6ea770acbc89aa302ec1330ebe93314924f1504953b16cf8706226b8686062ac4f6834e3f8b69b8f293ed287710cb5553c81696a582980b38ddc55643ca17f558aba8323a99939cfad5544ad91113905823e166d6959c7a8969660525e7ba311f905a4515ae2fd01f2238292a2e9f5d23e282588477235f344346d7e83e275ac972423cd1ae276c382d65074d4cdb9e84c62a5f7614f84b07fc5ec5eae80da892ba7f234b72b610864f4488e38bfa35bb0068f332254b941fb5692078d2d9316a9620085b730cb3cd2661f351f2ac8d69bbecf54cf850ddd2d69ad908f9 +ciphertext: 11e867c8cd67c870fc65eafeace62566ae056566719d5b199c08bf552a647a8ec4018196a4762131573f62d1d74ca9a94f2e2b029b7ebf067a44ff1481480ac2e9ce27fd9203f8d394a1daf4d7c6f504e20536b23a8cded27992175d0f2e3c0eda16bfb7f65710556545ef42dc8fcc7cabb4482fb869d9a7bc1e971f9f17ff75081ee469e62c52b1e13441189627abdff3d1fe964d41406cf0e06ff95242e1940bb740716aeb2527bdd8b994819daa3b51d89b32083bdadc37f9194feb5630eef0c31e61cf814cf6b033ddcfd04d21cf1f753dc8a1b62dcd2f800d80c9f550dbad3eeee978f359331658495465d9831b6989b4298ce0fe122b5f20b7a04085f0548b68d9cd7686089a6fc35beb626896d44af3149251e282d7a991e66d6b359720c2bf93903539554626bf2fface45dd543e1a320acdc134e4476f0bb86f9634d1e587cba4882126a4df8573ec82ef6bd0a622010723f1e744cf03d548c8e9fb9e6652952c5a54a6bcca42147914019a3d7f5896d3c7aee584f61ec32779752bf68bc5d5847c37ece981b9720c90698e9f09b5038c9327533f74c5748216188fad541ea10f4ab37b03fbbe832648a99f26c4c511425cbb22eda9181d9eaf212a076158c4d9a09d56f35a00ddedcb40e6cdc03386b4b034d5f1d9d5c2cede7694e8e6ba379a1d22a6b9d6a8bf16cbfb3551139f0ac99263fb7ddf30ad99483910f2e29d7103487685d90dbf5fe7cee254410c93e133edc880a49c8b1cf9890f3b0fd61d774947f5f5ec1bde0d4fb15caf27e0a580b443904f7cee5a45bbc982e0c70b38c6748144321c6c034eb77454a26fc350c7f842bab4ed1f0b1166fd76ea408f100c86c5a3b9a624a55bb387aa88713b78a11e0b724ee205e3d817aea8c92a9de69cc86dc2cea422dc19a745dc48ea5ad9abd586a6ee8f96f37a8228e38a914fd74a377d46adaaf11aed08dc6c571f17586b900d6cc63615cef2c1cce944eb62e313ec0c970d3bc986e5d6f25021d1394e32677ab88c6636dece8c3d9024870faafcaf9450cceb727a83c5fca75fc6db96843f15b02f31d21a9b8a9e17b898fc223ad4b7e04b24a7954ca350f2b922ca497041cdc3f5b83a4855d2cbeadbb1169a3a122efcfc572d9f7a73cabecd315e7eb4c6b7c2c9e3e38fa5b363406394cde05b66fca1d0a01bde6cb882d415caa3c6bd47e7447f692e2917356ae84fe153c9b886ace30f9b007bed974a6a9a63b39930ac9db8a636275cb105a61f4d97ac88f5eb2177821d067dd19c4083a5a247288fb18c273f5d9185287bdf77293b1453e8ec6fed821d26cef42997e8783659b3d6032dbcb5b11994827a1e76c0d9a565834c8b6e3e73d5bfc05330fd45ba401821a45daecd04cee244a4204437af1fb90867c606a423736534e129c92fac1e0962e52856822f22b7684c5d142223cd35022f9c88c0483cbd13ea4d3b530e5ffe4959cc250d482c07307712628e549928fed460570420da7ff20727a0753e457d51c1ac8ded69f396f603461b2a0de7b1efb887cbacd433200de393d202f33c90ee5c03afd7910bd20f06bb1b097706a4eea7247e4a18b513f910345207311c49d850ba32a0c438886b44f4312ee0bcb7eddde728918988dc062f968b54a26aa06c5e3fbf61bdd37df34c0fffd11fe80f49ac70a4557fbda48aa8801bc5c467099922a0429ed59b63655f274ac28a093d90f6737b7a5a998b20fd0b82f51180122ae5b6e0b009fa95b9e512027f4fab1629a25b0d72c30524356ec3ed4423feb3e9bb42a26a0c35310bf0b1a2cb8f62b6509fa43a6812d1438c31cd566a34d80ed9fbe2645f02085f655effbad4c0d59d93a8fb116d5f69a978043b36a0b5b5b7f1ee0049016f72d5ded211b1e911ee666f4565c8628ad57c96ddf8db4bccecbc080a423356c312510a25bb240dce478087656fe6929725a72696961cd74e59b552e648f80660de997bcb0229013914768f0984b512a6157ef857e04c3ba2ef9c410a03a5cc08af63373354b2fb9de337c53fc6e10892c3dad276e8d73dd2591fdd87be87506c497cb5d646dc847b952d4606300656608c88f6e1fa7fef73d42a46e48a9d12544dc43051f276fb77d8f303f639d8c748f7c5802b75260e244b1e1101c1bce9c355cd8fa36195aabe9509dddcaa768b73b0deaa5627b26e7b9ca2006c20d89ce986f5439cd7dd75 +result: fail +shared_secret: + +# Private key too long +private_key: 32686edca224739014bf554165d0b8b3392339a7467446795c540a98ca68d6202157f07668b01f02f8512c8843944a74961ba0f6174f3143b1b262b62a268720a38166418b8da6a74674b2c3f341d713842e44072b817b1c00a0660b49ecb0c72a693d60bacf06385bddc80a8dc6c1c1982d9f1b2bd8a222a8c94b7b902f3e20289b991b63e9a1e06a35cc322182eb8345b8acbef0b0471779f82a1762e50f8567bf2d75228e081d585722c9e401a68806296bbbfc98b3878b1b95dac230ccaa8177870d52ca37506c29f7685ff051590b2bea400c4dcb86bcd9b24f8502d671a1211a7b0db73a0ad93cbc7b59763259cdab602b8c46c647b484a91beaba80c3aa8937038f07da07b80ac4c9371b8e66183a7810e1893319e8760b6570e7a00059020e431a34b6a86d00e83ffd7c66108490880b7e407bc421d34fdce543c8f15cd76339d8d43176a408d3a32eb503a35eca422b4467db74b840fac5bb75557bc1785a4c3afda76be4667bec7207411774f1f61e8efc589e517896792e2b52aacc4b6720834bebb09961435e548bbfdd60799e8c43f81ca58e07533d763802a16f17249580364f8369cd407ab821599e82f130f6d90d5f0c5e8141693ae11ff0c24f9de7b952699d75886302696582425dc683b000a4c5149416ec1b6dd9c142594001678a60af07706ea52404e23d48e65ca9cb9ef9f98f492a42f2da8896e5c835f404e1621ce0952725102acbda68ac40a5813225dc472d78626e7ed008fee74b4cfc2d202b8e01c4356a9794ace66e9a37532a80982722186ff118f2a762e8a149775903b131bbe2c39db61b8b5c8bc583d21a7760352b4816c254b2d27457188103616b2f5e43bf9a7b0643b026b7729e1bc55a955bc297b730e10a19f7b83a0542a8de10577c710c647b415a10a882999ae303979dc9afceb30f81d12f2a9c0ed8a15426ab3707438681f3c175866019984465469fe7da2f2e2b3ff2762d910c3bb123035e5342bd788d346737599c54c19c2d721cbd8847362b64a4e9f5bddf39b3364478929a823cd429d62cb12c468a50e116f695a4bafa8ba4db46e6aa44d09a944120480b0620216b08c753c921705576d472534c5b78504c05ca30541ab790c9a0eebb83d682660bca92116b49287b6a7fbb6998476b8552a1c765c217b84923a055afac72e3b1a3bf730fa1828e9605b9efa61b7fab522ef66783334ea2301b83d0afd8a189bc75870931c75af3acc15855f0d8ae54a485b215379d92c339d6b850b7581236b2d9d4aa5ddb6c9c39b2e5f9c26068731972709a329bc70b1bd859379e5cb4bf9902648169ff546c0d9c29dd10ac89d43b351238818a0e09c18fc59a20cadc668bf14a1c18b98b2974d65799fc4a37ae438006dc0d2a43243611a776b117e1e725232505a4206354fa46a4e174482061f97c618bd479cd596bd6cc5ec523017bf59fb92351ddc676f7615ce103be3a4053ec1ab1af481a039788fa31397ba6868a1c8d6eeac861833f14f6a4e1db09aa299da34b15c90bcc66d7a6940c2d192003c3f35a65f639a2169362720d15f3cc5f58abf692cf50532298aa4a62953dc72babbc761cfe94bdfdf4ae96928a0f39a3b80ac5d363193aebaaf39a3662397d449872e3e3a647c705f5ac60640819019a8344e4b407c70e9fd43e3eb1bac993209ec30ac1c798bbc56c489ba902fb7779228bc314c0ac83bf6c22710e42b1473a29dcc9c3a4f3c52e994ef7f7c8af1a531c303ae602ab253b54e404320e5827f804a47ce4b30dd32d259a58cb6747ad2b7a65b32793411edc35cbc49a2b3ecb9617ec792589adcc636084f99565bc063294962426250e101eacc721b35141fa214120627b1b43051538aa78801363d08ffd54cfe8c0096fc86a89b8ac0d252b3077c98d9a2b55d16eae57b65553188461bcc721862ad3c5c7ab341f6380398c6dae85778938bb7347b8960b6082772e6126797c74671842cf9bac6a61880e272a8101661d1a82af83c8c30dd32b01d2c97bf74cefa3786db1c17edc6ed1876483db558a834a8b379e55e5a766eb1a5b7c0dd0ca65db0a9392ab166aa91c065bc26508a2a54a9ec9ccaebdb5115bf17e36b76dd04b2c54780f2ffa08c4c32811031f2a9362f5c7274f84545bb528641705500c9f4a8289d7411b401637c52451ca76476928c4ca672a7ef8447e320db2743c8d88a0c2d74816177bed86079ad8141ad264264b6b0857b067d229f6b2892163ab81405c1f177bc319928cc85b5801111500b3bf55c7f5436888fa4fb57bbd5751083a2319aa674d5e1b8fa6534fa466468af739d5aa2bf1bac103bab8f6f546022847dd2443cb99c139744c2b52383b47add9c63350e90a88a2a3a418a62d7b6c980792e3f9b1336292aec40ec37110cd94429824c797d334aa9844a0770ec5001dfbcb5e59a717ce29a19ffb4134289d3a437b3da75d3e5a0a1e9135d7258efdb3b78fd984ca704d880308cdb202558305eda26ff9e172a5767a0d93a33cfa9a03544678482d0c268789ec31324c2885d95e9521754e6ca513d75c228b887f3b1264d9c79aa60c56e9a05f844f829106f8b585e6ec674cda1af8136ce4b5c30098357491a9f0027451cc8ac2981206907c203ac700fd81317735cc6380fa40ac8d4579b6a04fc73233be3a27b124bb47dc951ebcbdb2c9c4b2451c2204c6f8b2a543cc362e189a0e7692fda13f47d739779b4c0f56ba04d84e78c06d6d076956002482d3b0646bb318665ea3634f17d621119b3763c13fc4e07ac54583cba67292bc68ad8a81e1078fd4fa4cae92acdf91994c32c3b5f58880048c3fba052a260dfcaa922357af83065d203c8e97a0528a63318edb1fa8724a10b3794eab6c77738e2d196e2e2cc65742399c584601660c524c54a297793b02360380628de00c1f4ba4b3d2871d59b46a4c00c64a9c3ab773a26c97cfd87a354a7125dc6fc98baa9c3c85ce8989d20502ddc3a8f702991ef93189a636603c8f9a75c8d82518bcbba55770c4a81103c0fa34d7581aae052528321cc3c497b09b06b15b3e8fb3000ca20cfee5057fb5949f1c77c1a79f55618c2e299a27829c73e1bbff4a4d45105c5d1c3975e06719e32d5f915225a28252f519180bbefb274a764c292ff103ae18a68abb08952c7e2ca9bdd017576e976c74507dcba24557c6b58c8664a1da685b0602d8d44c6e7a3b0b27ceb775763573a8fa33a2ea5c826124cbd0213d7879c61581a20503a91e23a41f46a453852e010276b4d287050b67b44bb63b0ca4f29c9ee827ae73397ca1e75dcc78ccce5bad4b6a4fc7eca29afa647be7ba39503256a47855b030de2069fcaacf91170710e27213b1a208066c5e087c699a81372ba4d3507baed3989d46cbca9aae669c4a2bcbb668850b1196230c1bc6b1d77463f64290ccc9e86b56da72aae797517c0b5ef5c5567d118085896c67b41179310d7b48505cc76c1bd9885ce42dd2b81321e35692fa744670a443fc43420a5242933b81c3bdac6290bff69dbc479b52d30f1d0a1f97089ce4106fee3c4383776ac375c4d401a984e6c6fa98a485bbc01d3baef513b0f4b33d147c49586893e22a36b992b90f936c2fe7133d93a2ad93a741c791b65cab53b92ee0228ca2c0169abc2e39788e269918fc5c00dc869436c2b20d908498e5ae2591829e58038b9301e6c9a089299e551a3a3ea53aa56c469e79896c60bc3e718508d17477602f9d801b3733bcfcaaa5e6dc70d4b91c823343e89077dde1544a40a597982e46959614224ba897a769b03024d68ae1911eb2819e2a3c4c91856752a4b1502038fc459b506c69ad9b2d3b635cdee751c2885ffc1b0a9a27272ca2ac0a026cadcaa0e26b35ef85137fe81ab731ac1cdb9bb0b0bd402800cb3b401557afd42c257fa0b769485ef4003fab7966c0305addc97a20a75ab4619c8ecb5d51c98429f387d899874e754d3f9470031bc9f2501c63f67e7ac0a0a24c3f29e8c4f43871913018f4bc0c772b54477bab94fb4d9413cbbaa3bec270564e8a1a7d39291e94a416a0b05b9963ccb851b0723b1d1b6ba9535bc94b6c6ce65c235021e6bb88f766bc6590afc4a0b1e624ba54d8a2dffb0911e61fd5865a7eb4b00f1c4420326d87a4417c905ccd9b1a95a6b3047756cc0894b4b60a3e1bb06951a83ae40165b04579bab91fe1b5a8876f75cb6c7e80381e8867d4c72930369d8402c7c7465f48d13c24e72dddb8b3ad872e0948cd5e5983a98c4b4c35427a83c35cea70ff595dc8065cc82c9c39e4771a29658c676b08ab2597e30e3c774b2a99931f020976909f28623266ac2876c34f097837e643ce4a535971257239ee1e8c5d60b8b700831d71cb3bdd4f6ed05bc0fab17a4f1b297e9acad645ae4d021d04e1895edb6712565c778c907c27f5062a87af6a54da295920e852bdf3a5e7ca2c079038db94473104aff30d1a868228d95c167019524f2e63e94840f9a9143d203321 +ciphertext: 1480b136c48d326e161726fc880a3b46eabd298b679fdc298605c36f25624ef332b2c9298df2b2415f6db8817c52937be7aa9193a04870889f7b24d54600b64f941a5da03727c6dea98b70156861beb83b2bd688caaee863c19deddbdc686db6ffdc7ea5bd4c86a4a1bf4c833cf652fbbbdcb0b7e548b997fee0213a8ef9e541a660b5b780023719228e4560f6c239a43ebd4d01966545445f828efcfae6caf25938d1eff8d3e150e898a34743c2f6a87ca50ec00655d5eb03d7d0a4c65f3d87ca5739ec2468763f4251bdea55ca93e490ffeb4c2718de2c6c5aa942992de6af0ef084581071b880a3a8022eb1b17f9f7a9ad31952ad26ab000b03ee421c3a00dbc7e407d4a04e75e2c9a669c5ca0c46506674e1e0bce3292b220979013c84fd91bc4cb968eb31fef47703eb8afb0d91b3f569e96f3dae4cc5041944122bc73b5a032ff29ff7e2a26bd48db9fba3f72d4f8cbd97bb07efe4cae7e8b851dab7634c498ffda99797fb2b9c733cb24fce9d6a41cd4179ab8bff5dc0a42048034de221971d22704ade995c14a26923ba5212b8f63abb57127eaf1de7c98a5342b3c34cf6b85220363f5b0e36d42fe525865b31d60bcda0f030b9afc48437b92a1e29a49089fa41b3f54716127dccb4719c01d74dd676e194d0df7fda9ef218e1b5ebe21543f60d4257743b332a9205208265cbc8045b3a4816db599ac64520c9c59dcbb67f85e575a775f1cd78b38bf942d142041387d040a1df5f4e265424c13cec8bd158004a9a219789ba9c67bec9018d0584985e0094ad7ce376525a8875bb56260faaa376c7796e36c1732fb7a8f634a91445f94248cfa51b816a4f1169dff864e677424185cca5ed33684145573053fa5b1cd01b9a0981ac6e42f584e5a8051872ca13654a71b3ebd4ce4918bcb7b05e0369b4f77cfc7372abfe1c98230f9e069404b30dfa8f23475dd26084be6ba217115034a56ff90fcb5752162c9ecd93762fe9b37384bfe2c1d00eab8b36a5d1313d9a336eecd11c9c4b874e8f66634342480bd7cbf17aaeda11c7f80642a7dcf888813c4bf05ba1292adbe8edc84c26fcbc07c22cfdcddea49fe0eaf6541c6dc7bed5ac9e4d92f98447ce599e2e843982c202b90f731fa9fedc7de92592c567ffcb67fde2793e043a6b7b5022817f9af748f404018dcb06ec20f895055a66b817fddd4cf72c7bbc8cfb2addf2d2011bde9690de9459cd1c7117d0dcf91125b0b4ec12fbd972bc0d96eae358b29c743f33ae49c816f9b511b1f1dcddd42ad5c4abfa62b774035dc22b13478a9daa5dd2c41b5283cdb46b3b561e52fe79a2324be991be509bc98f504032a36fb0f35df0bb16bd32ffa69519051b3a03f6d2bfb6ee883aae23bd2393b634bdd4904a1023ad08c4869f1a5f2a1b12a47525fad816c713934dd6aedae098b8035b9f0b9f55a9c66cf3fb1bbc95d223cf604fe22a1a775a08421d987e9db3d66542d2c950b40c23824f571a6f1053fe71f465c42f34792b67c61b67bfafcbfa39f1b78a3a549d10bc0e07e493c2a6e6321ea420a3bdb0e083d52052458447e9917bb7026b350974f0b44160fe9c64e01dd08097f133e812897034af0d233cafa29b87d623b6e8be55c3a33922ae4dea493125ea7dc1500af9ab5607746ab95edce2c02606fd0d3ab4ccf1642ead61115116affe13f63b94315a1e86bf28d1bbb26a53696d1c7b8d1adb9fbc10089236d14a30e0e9d4a8abfbb0f1780f7899dc78ed41ee08630dd92d2b148b9bcd326234f18d20180e126e06a6d71777abb02ff4f49f3f89ae96c5ea7f4255168111988f00728a175c097877232c0d5a589b163de76e63f0302ba9dd0160ad9cff9754c2332a3f2a7855284c0b246a8fd231e283bdbea7960fc7f87823b16d9e49800e93a6e0121a4b6bc2e25d9e9d57244591a76f5c64024f603b622f8f650b577e86dfeea4ce121fbddf08e87a7d0c38af7ced583bcf14394496d1e08d580aa7e9a509522d12f19ba71c9ac1eb60a7d7a4fcc9639ec1c90633b46fd57ca67b3a57d042ad82d51a7aa4e92cc6e728489535c939463f19de0271c1ce1fbb4f3e84c582ff2e399742e9bd2f7d719efeb2d5b95defa163c1b4371d4e90a16ec80418ea722bdf256799d1e71cd50d5e8bc4b240d9d567016b2c728840f068282684f97866a8887dcf801e682240af8a3732cbc450772a63889882 +result: fail +shared_secret: + +# Private key too long +private_key: 4596b574c15fc86c891fd59215658c32607a79a54f630c9582163180f7691c6c01b5962b672c18cf3479b96453b4756cb4931e1bfc32f3ca4310b387806213084bb11412bb355585d2d5a8a0ba0d17fc2514d050d5d877ea3526f6914fc0c01779789ebd0641dc66cb6696ac3093a24d00976f73c6a7505bdab009f2a08b6fe751e80413460b1930842771ec3faf527e983c3c0220aeaccab99cb276b0dc4a3405488e4140f8a10927875ba2e39979583b3f5b94ff0c53a19656e0a5363e438f0ca197b601b266b2172483c535340b43ba7aa16527eac2c7cdc04b0777a3bd7b6cdc07168cca95b88480f514ac75c61174271b1db53eff4708b2a53ab4a32ca13cc9192397fb930a78d491c857033c383329da9bb5715012f5746a18907cb6b1aa2a16fd66a21a925995975319039c1dd65514992dffe330e2e84d5089ca3b83ce39558de340984ca7350815bf0133b6b8db3623a5477a4bc77796969aea4de206151f688cdad67972faad9f08124e43480b9a2a4ec806044114b031886f992869020397a1caed883b5565aff3309752a76cf9a0a8cfc00103a39989f5b64d109502fba9641b2acea6bb86e80c05858d34d025f35712704637d3d65074e9235cf93b90ca4f1110a34c0b31798244971bce0f95b1c7e0ce5f56c7b15839f8e55c59bb64f2aa9819349c3ac0207bdb0945e585fd838975a62e0a3850d3505faab03eaef6ac4386c80ad1a3cad189aab0866d5a61962a251f398efe49a714fc791a5696a7b19b7fec00323b2e6e9462c3ca5c94488556390f7b83751b1ca543410829a5c1ced84cd0316940e8603aa93a9e5b42417483f739ba63943d405a1de18196259c72b0ec9e8a0472d88c97bfa37a984ab76293bccf3043bad774d3f0ce80530c20f669c7b08841f2990775cae0702b3ed8c73f8b8a8c362c3a35410768649b1cb5c4640eec76b797d630443930bc1bc7755b0a632c7543b41cdad1221a501a188805d1a0b09df69dd4d7c7da203e8c583838e8b7233c5f07b2a51fa47686a46c05414eb8154850d14796d7c92fec582d2429a440144de657b706c7c202cf338937a293485a08218e3996c4a4183ea341f787bbb5071334f2750a5c86444a26bdb87368225b3769498476c261686eacfaaddca99be705c0ad3acffbf3297a5aacd7333406b54203d3029f830c9eca7185c28bd9b531a02b85761a76c0013c500388d85b5f7b66892c14306d053a1a3445c0729f9d672cc8cacf48d0cae0e11888820d069564fe2922c49301b1621320f428104232a6c03843876daeec76a9839acdeaa1427c1dba8c4c2a07ba0b7a4b1a53207ad968ab081fe26b7adccb014831a652e6c668d96ba62b14e8f04c2e5a69b23c886e899f73743fe2b51017d57540a621a3c25e5e3117c939b0dad38e69a042848cb7f106b589e03bfce7bb8c9908546bccf15c8c63aa06657a37fbd17be361458df87a05caba3bb90ffdb11a8c41149f9a14af6cb24c507e88b07287d1a49898c4d0f1070c67a81fa2ca68d356f4a201e2d78f6ed58e84967dd88445172cc6b449af0d0c0e2b470e999b0d4f6a0f21c54c24c5b309b387a973c4f971708921756d23522407d03e01abccc53c6116684d9799e4b9cb1ca9a60a982dab96166e154a25862b13891b3fcb6a47a37f1175a9978b6df8745806f889f2621b3445854861ab0af6a7364bc46dc966e2c5ac570c9aa641127f9b140cb357b4e1ac7a19af1d4274276b1399e369b31c76f0cc0abf8292fb60088cd7619f492847427f1b9c5e9d90790b3a40ece3a7d7b0bd4f233de0c43ce2e003f20325a3986bcc0bc33e58004f1158256996b2670693e77ef90a20248a9ba80358a9da24a0162e76f8657642798119a97e93b2a518743f217e8a9145fa6bcc9735a9aadb070115b9e1b8a0bf381757e98a27ec9cc0457c63ca4354b612be9c4e303a2cacf776dd91a6b445660a76a1c2a5aaad90344fd9012851a598a2400cd8906294bab62195b3e4b0c1b7c0f609d084dbb14b885b2b75020f958a0d02b57d74002fb87bd97c800c199333ec31b04c6f42b9adfad626dad4a9c26ac3784312834a467059b56b520dbff3a44b256e8ff7cc692c8371561c3510a5aeb903b3c7bc942038d0657d5b0687aa4449923b8f77a8329493c9f874c46f09c45b65ba09092f0f753cb1f19654798588981127723dbb7aca68811a0a808a943bb39c433e4eda35bccc73ad3127e833c131e6c79218177285105302501dd40caf00548efcbe130c935137cfc32a80632798f066af15170306d61c0ce60cac483b49836066f7c0fa019d5d2400616729c830a4ff356e46a6c1d1ab4f17789a3dd93c04d0cc5ca24ebeb31d26416907d65da7477e4988493550b1ce0773cda82c52db1e772857b79673bad41599cabc74285dcb275988a2a745646311209c6e262e3e6821becc86a008c25445668774598f894ffd3b0eae7976abea9fab58bd0fbb109cfc7954696e0bd8276159cc2d7c41d80c5ec4045b9e4b097aa237205b6e53a23a3baaa355ecaf85ec299df566180a43e7270d5717b92ef62895a2c64e481ce3c9232b7975e2a63925c8786ec469e6254d38a692a877a47fba9009906fbce70e12322322152da96a023ad563b0d08f5f3aa2746c05c9365bd5acb258511136057825207de1f8576123c7020a16521a503b45b4a42a75cc495b877a5d7b0b71a2da1f400651c74705959348099ba38b721a07679ce5c773ce0c245532b5fbf015ded01062203918e7bf58985895971d0009410fbc54b1e92ed2365596135fcb756623eab8d757791d4921709b0afc469fbccb836cf84a8747c34dab0bdfc952fcda4426085d02f7b6eb1b54aca4ae1dcb970d89bd73a112dfa58fdeb7c07291483b345722d125abab92338634606a403b25276b2b47fa83725dcc21d3b2614bdb563b9982e67447623590e62b1fbca84acb4a9caec0214975cf19aa5be5d377e8d41dd88147b034ae44f17d1fbcb7499899940b84003ab3347c170d096dc9998ccfc61828e524739520a014b731e28d5617404dd0458fa538b7200f99bb810a449d4e956771e7428985cc077b04b5eb082e877095d8c6ac6caf1cc69953cac6e63072819b1818d84b7a6572fcac4103eb6fcdbb585c61287fe5b782971d5a3bb226a975b477a9ad74b08213661295273e795cf330c40b18078a4ab614dc7f55706fc6734c123176d86713a7baae38a9a1ec75a6494212d8b0c062e27d01123799b69be918a768e03194a28d9cba80e65b2a3cd12b7f025ca46a9ebcb0313019a7f7382c4de2996651a741219c7272b5fe080ebbf5748e1196879c147cd73ba74a277bf7699ae9c19911a07889179414717692a28147a83af73e8231531822651da566c7272fb9c295ef4c268bb33ff143c258435072d145a66cb67bc45255f6617cd4a6397830c1157f248c816f76c47f8870a4874cb129c63c705d67dc0023e1c7f3e284753563fce64be87761b8b60299008a2b135d3b89b6ce3ca89f2204a3d97ed6596f7c530aa26b1f07d58d23544afc480a4ecc6d92db5a4ad851dcf1146b7ca47a7ac36133b4b6926baa266a16965431db799ecbb147d5b163453042bb2700a26d51b1197d20048e135c5b555ada003d1ec2434f3b7c3996b962744b57c31cc71c3778370d2409bb1dea86fdcb602ba25be2e1bd3a768ef1401d41778e08b4baabab0e85e701e88115559831a873ba5d369111297131f74fa0cc6297291e29335a9f3c91fb9569301b5b5ecc36a1e8148d957f41e56973da6d21070e3d05695af19f640926bba553d5fc0e6cc3232d47839a96b9cff128e7426fd4208e7d7ac2c7e51d3e502b5413534f334706bc31457a8d3ae56762f551e1350daa2acdd6168885d9ae5b055e28022fb3938a06dcb0fe75603ae598ff068acc038d1e938624eb59cab1b2af33256dcb34418659f11c3abb9007d752c8a93b0b1ff5c2fae348abea538b577dd28b3a54106ca6509fdf8ccc78a914f2f88192273bfe285a01b1a83b2a72ceb5718ac89e7df042f86b0c7a3a217f5c0f642b535ac243a9f31d126c223224a4ec5994c751b0410123984056cd927710faca14c02c6dd0960e7a9eb0501dd241cdf83176ae638c38645b2146579671938428cc9d7269f36bb77f26b0c60283dda8aca9a6448cf64ede024f304b4af6f287e1b988086730939cbabeeb24f924605a298d14399d70976886b991e957665d644f9cb5a44ab6509a8b13589b1743ab844c622e557671f771a1de72794029956743c4774913dc946499a36a210b3519e39e54f086e0092f56b9214aabbdab0cc3f0a93a12b1201f82714a62917f906973ab2ee93f3d56549636d3e201c1a8d7bf879a8c891e27fa8ba89c73819f29e9c842e47fceecd5bc09d53d514b82a70405225366e7519d72edf8d0d00bdede9f96ceded974d68dd4eb87b94a37867f8f1a28d062560593d36cc5883bff028785171ee20ba45d +ciphertext: d3ec04a79d779faadca46ca4570086e04bbe30142e906730206a1f8b9626ca41593891305c097c2cf94ae0d379619d74f1dab585bf9c1fe907d8b020e03d3b5c13db26029f9672d9c54c6c012b537c1801cb4d91b68fcba888f78bd634a1d854bd09a2f2faf3cfecaa7af769bed4cb8407af0922fc95d9f85dab45c8166db1b7afc5127c04e3b362ca44ed6d92468f7b6b52870093513b2488e6b86749f42b9387a4e046fafea3a9f14fbc9c817b3d241d3c4c6c7d07c78fbc22a934ac6ebab5231b581bec07b9d5c5aec745666e95e5e9ccf9902aa7ed0ff5a6c7d297869a65199efea83082d287397a3a52cdddc5119c0cc5b913e5a53ff6fd6e132be1933e32d377f2bf0d6d984e2693036f5db1d3b0fcb1dd4b78c7f832808e0d6db38e3427c9496c6294330238728d4a278bdcac8f1a5ebe57def89f56d50c7bef994a3e36df3734674379a89f75cabec45c333c6c08e0f53b27485c5e85a847e6ebdd50b241f5939e89cbd472dde2935ec56e3bc96e6d0e59e1afb1e6cc73db5fe6d4bc2e3d5484191ab6f7e9b1dca82a445bf2a3ac6bbfbecb162ca869c33ac82441d9dfdcaf68e0d481ea63670fcdda0e503b198431d04e797d8682731209c8ea2eb1cd7d7e91c6b213292c92195c5e7885a9007a331fd3c35a18124a53145aa9f09c2c047e35500e9a76be7a70823711cc3469590fe602b7c92527a215d4279fafa52888f7a55f6b281cf3f146b1c1bd20a173d508d045b1b5bb08861a230e3b75be425aa16c1f74efe2c1d20648a3a02cd0a5408948d35d3153384ac822aba0f90ede799a667d909a3146783afad82b993fb98da36c3a937440668142143012fe9afffeb3edb68e78829ba6cac4d161e66e14c6749835d0c6a420186a9075fba5b9340fc822552930906f994dba37a3ffdf23390ca0477b403c592ab600a0a44783d315b9ab1c20ef4f9a4eb54cd2f70304c50bd178d1289c7654feabecd1da6fdc73494cf3b98ca6515019c8c71fad9edeb71989008809d23239a0a5d5c4646c48f676bb667c85dd921cd77e767b2e31540efd003b5001f54c1a08e64b9997c2917a8d16db490bec3f72ea978a15f53717e25e7be08fc93bacf88d5712c55db6edbf81ffaf3dfc856ea53cbc2514ac512edeb56013fb374d2e047d9ac1837c924d9011c790ef7a8a684d34a5a5a64049cf09bc2af7fdac5efc12d22d5977bd668eaf33fd213a0db8a1d4e84ffdeb004e7e31d79ff227a5de6212488636a59bd1573a5ee39b32bda5c0a2a0249718e69ff6b1a48d4efb29593161d839094bcdf0b3f85e6bab1b145fd6edd9dbd12ccfbb4f66930dd5e1877dc8ffafb9f2a6c0b072c6ac3d6fccf9b568038059dbbc551a3ec0944b8be6a2bbb08eba930126cf8426087252dd373cb278ef5230d8d4baa40acebbe1412efb6fea8a17432737ab2d4cb77cdc4557bf86613995cc248db4b99c94f030e3687ba0397a84b8c364d48eb46c4b4f3dd167f1f718224f3bfccdb026599ebec634176477e459a2ecc7023f0051203a39c3031dcfe0a665b75e7efa20551262b13cfc5a791889ac2b970d509217bc67cbde45899dfc585a2427c63a91e4cc7c84b99b8ed4120aab11bf35611b9788e8ce3e84049b71f1f445425f8bb6335c3f739eccae8d7b599d3564f89b8b145c1d1d829adf649642fc457a785dd553f33f463ac6e85a65d2da1db66d342c0d034970ac461e75147330f073a4fbe8f90b7b1bb543282aa9cff773f56725f9a882d534d4a23488b83e54538b01331645ea3d08adc8da1091ffc2107d1becc9bbf8fffb13b925e8282ab9ab7a71e9a309131b8f9fe3d7e249cf9bc1e3b106e2241962de2b1f3e45c7fe2edae645904ff84787d80ac0cd62bbad0ca3594c51033e8b5ebdd504aaa5b103241b2cff92f45451dd93857a289687694998c388be0a493fda0910f652e535345bc594cf8be3cf77a9a483716a49e42bc427f78a1249d20c2ce34afc45a1dd0cf38aae9530c215e8bc52851317f8e4be5a050a10e2dca4f96972b4efc81f38f97374c92bfeb3c7ebc104a3b5675f5b4ec2e3b66eb642081610c36c29fea5e15a07124ca3bf59c6f8cbbdd4107ac441f553a8ba06d1ace05a5817e2b74a11b7b533004b88e590426ce9c578ca045b15493afa45385ae5c767c3dd0a17f6b297ca79f6e07da0a03b24f4f6ed5282d2951e3a03ae324eb1 +result: fail +shared_secret: + +# Private key too long +private_key: 08f35840387e1ee901a0e1bc4ba481bf0039bf2213446c7eb4d07230dbad5d1748a0bc489e818257919d63e1cc645a5e84042d51eba55a881d625863f9186352a13cb83a98fddb077e5b4257fb11feb513fa403e67e10c053c39a249c48d688ebd3566b841bb41721671c51961dbcab9148c2eb3a232a39177d81147b766d872405e9b4156d66b9ee68257c895c8281f5609c53c268b0b14b794a2a3ff08365918146a1337d8a67993a53c80059feb396af593526ff366f10a7737f68b7a675eabc01d46667cf73981642c53cc2b7de37885e7ab8da932af5e07cfbad75f0a9c51bb999fdaf0c38c34604f01573c153384064f0e05214025158e6c7959dc15b3408eddd82842db5ab6535c148842ff2b3a28fbc3b04aac28fc084e654cb0f2190873b8f2d277c58165097a45e2dc75cf664b470622209c4d76086ab12c561bd793c85a3d62158374a94c5749bd2d425579294bbb7163efe409060c0d143428b5b764ed5813c80560c8282c9ac81bba2c8ae194a338990118c12b0aa18b37d4c337218de5732a05f3848ee3be018b364b7746b7295de9019ba3e3518f742a95142d75536664e0779459b1ca8c97d597b6c5d8b47ee46f22fb59b8976e9fdc808740174f0bced5c55617a4492a828cb74a0c00176aa1e370631622b06a45f0e23c7841bd56cc058840bf86d67f3051367a7501bdd5904f2a71824a1479b501d6e183c3ea35028604203c358e5a2221c6b9101c3d6e13bd482055354a234e137251c822419a00225a358a235cf76a681bdb7b7641176ee3a12071a35704cb22a79cb5dba464f5cf26db2a499968fb2077978a9723536187715a839bcbff3333f4669d92b44cd2d80294998ef31397d5f19fcb2877be559fc82185af733a995747506c2a49920b258189ff0c2d67495039c7779dd878e538aa674640aae7906c88896b849ff2dcb50ea6999fe45d84ab90e4675e800b3c645c811be13951d6889eb4cc13194a8d87aa4b0129cb969609a232df19676355028ea12b2e8832cb08725398ace96681be9c2317d7487f212ef0ca647e667ac3ac5cbae0994d18a2a4211a0e5b1afc01771dd23742c57c13bc554dd0495e8114c8668ea3b667ab4005fbf8286eb3ca61bacc919c93e6f4a4fdf70496b5c0ac84c9757b81de7c93e3c52100a8091bac1b501b230803c9106a38f87573749bacc0928c9d338bd959a4b1902495f731558a09408885d09a5e7e592603b18a98516f97d4ab0121066d0b5449368b400cb0acd17634b2977316abaeba8ec6b52f33b167ef455480c35551c30cdcfb9d00323155bb3bb2e94a64931c64b56267893a19f5326fa5969370840f3b89320b938c21bffe077e40b168aba753c3bccd9f224f47a12f0f999c36c2191946639febb9bbf72a9ecc4f035169e5a5636144a9496a0df02076bc61c9a3350eaa43467826c6da39bf906bc3043523d3fc953d2a4570ec3b829515f6a43bbaf743c491225a9277039751c136beabe44e95d982c393ba85c14ed01539d922068ed82082627ac716441999bd7c873934b59b61724523230e95c280b1fcbdfb6b73017980c471a6f9e08c80711542787a0728bd86f2b00d04a714b16c111314dd72943d466830781e5c74a80460cc7430aef758aad98053a52c727a49c51e89250b09187101098452213366cb0b15c30736a3bf49693da898c61a67b0444fa7c2b1719b28ef371f0769c13f4b9f796a26328b2a9c378c1dc49053b8c190fc1d322bc6ea1a15d1983ae76c7f42982a6c36622fa85e1e1301f186774c9340cdc056ab598bd03cb224ec62894c8528737042723c2e02c181f6923962a53f2c039208400c1cb8ba6a71e7e21fea602cf303a0f6ec7a17850433a792b1162602b4192953bdd770887218018a833d8e615db8661726a46aa8b5b324038cc398cfb705b996faa4fc3ba057d76aa3ccc5fad98157a99532255c4ae41ec0743cdf69b4bea239e022966a3cc444a699012b0c685c6dbfd3070328c1b96649002b0b90501b5b2b0f7713b8595773f2f101f95b297a8192997735aecb4168e1ae56c6507b056e899c2d40759806e0a99800204c300d137541ccc9b2c5869ea271209e1bb60963a28b35531b368dcbe9b7db69266094566df542ca164a09804aaff62b253b32b31b486be30d0a5476cccb19fa9b451fbb21519c77757b3586435e0288bd7af50bf27209bc832ae088a9ca736755969fe675a7fd5a2597c11b007c640ae822f36b356a2b88432678c40a06d65a55eaf8c39b26a2b211b9d57badb820c9c11318b003c855a80688b8638c05cd64490cb7bc698ec657746b1b0ce24241bc6372205fa25148da47543b643961d2a479dba82999aa03d743af5057414481c20b0d5e36b2d2531c3b237445f2cc97d5148430666cf85a799276125592e7f88130512f84a96967c661612b2d393315815346799967a9981b12811e9d139891c89b57ba5514f9a065da2515441ab7198291575ba9c76c4a71206cb306a6b1157a46aaba83c419d012492ca69bfc9ce2682c05c06f877965209217d6db66bc347defeaa1a8052a641119385ccf3d404b98fc745bb8183b30b77d382c60154cdba5780c98633f2106012936d3e893a2c67ad9513da4a65642447da2c74906b7a914c9426ef615297b6428e77d80e93ab714adbe998e4ad454c6acb61472ac66955b627a0cdbb50ca2b19d11a36e33aa5a9d63742d085e3b8773df4873060a9126597b05282077d37dda98910d066da64a6c4f3c6b393a7a85cc6ba5e0731b116651281142c47536471c5860b97ab6cc0836c6ac01131cf46cc9333bcee384f92405233c6834c075a27618c5c37ee0201dc73b8df9f8c300f45e90445782a22d56f932f9c54789bc4438f88275c3103ae957202c3b71a4247bbcb9e8327d1bf62d066c3df57922fe207eda052c1369b19e0125e6e71cd8866803763fc68546f5d9135d6c3e97403eab249cde45cc3af4cd0caaac5688275edc81faf05b2a59579e222c4bf746572a0329e7a6af800b63a6a68b67664858aa3cb7832e392d26746781334302e03d3c4877dfb09fc791c3aca91693e02dc65bbdb2c85b9df234df8087ea415ffa4c2d1f5864ac8645c7296e3671abd360b9c78b9260c95909089f1b8c823d7a12a390cfe4072da52522b1a329483b10dc132205dc2a380c203bd3308de40e10b058e5627c54107cb6248222bc8d0e686058f5a61fb63e1d5736c5f60d2995a35c92af73797c716954e97ab68a4aab9ee299a93094ada0648798cb74f80b45736872a137baa1787083329ff818d2d22f925302e3b2bf8855080d13215b40738598b8aceb404df03b02c492dd5925058c6646417bba03b3d6d44ad07b0029daaaa3c637482a4375ac7ed0e5943cdc5d5372128838405cb22ce44858f309c99e282c4f23b189579b04a6cef5825dcd8caf76c9136268427b40984ab194dc4a9b5e0579b6eab49c6b907376c32a1b56bd951649a3167c25b3aa9746257b6d190bcf1d317f44a920ffd5a462eb623ee9650c75018a8198e9e227c96c50f2981399475ac240b983b559716835ca07c32762b08fc65971629b77c1af45059e889432be0106f04a63bfa096bbe86c69a3addee27f56b8c16de576f39c0d00c421f13300f95a7c39398b4355b1c3964ec4a25170595191f80663520beb583423678f36f6c422079404541c036bc9d1356faad9265b9127a70acb2203387d437d58fccde1092c8a608ac131ac9de077dd0822ff314f15c2b035a2730b53b23a629154f60effcb7b5c67a3833c9098865dc0e76ba3284c01e65b0a3b7fc43803c2e87d76e3afcfd9679307ad3a689351831c85732daa48ce06d163d5a25e4409a601d788b7b053d155a2c2b1004112af8e457b057a67755c3d94e11c9d3668371657db067319aa1ccdf33dc5b6b711a692985c9662e789ae8a960c21158a057b5ae07fa3b555f26aa251623d16730268837df6014dc27845b9c8066da53a39047cfcd57d7da3a547411d76651da9e67923f1cc22824b059147264462a05a856fcc9ff1f9a26afb46e261139804ac98906e46d423cfcb83498871be317c3791a89ceb1382340fe4c9504cb66ad22834b820a1b3031c4db732a4949d4ac561a44c1fcec321724674fe1835e63232dcf2b65a235dba0a3281324223228383f68865a48f78882470b7550e9640a8121214027699089f4d395f6ec3c48aba6821324c2b39af5ce1c818821f7c5909bb59a12e67c3f2338cbd722a121a83bec0723037a5da652788b139d9e92fcd603fec89901a2614deb75d52894d0b546c59266ab64005de5015817741bd4bedff0c7298c31137e14035c9f03fa05af979ee98f495dba47edd1e8b447a894d7c24b374efdd298b33636e85b70e24f50d532f7d5e4c56fbc1f00b0ae32d683079ce6b2931771963de19ae21252c701921d88a0d35327c39c4e75667eeb1627653c38e1c01da7598db717af222cfdbe72505f03229 +ciphertext: fe7e7ee8fb5830bdad351714ab2b4fbc1eea56a56a868ced58cbbc3d13de074da11102bf7d2e2e2f1991a19a937a7a10b66d5d71228fa6635ff88cf858c70d5f9c0bda3f16e767b5092c5c3d187c4f95d402c189e29dcb94456c387d3ae6d5024ddb822e718356978eb7f9d306c1a7bb420c2dda12c0f4dea1b00f46021fa190aeb60a72a178904bc791ba48db3e5a20b6f5b78b4d0b2f526097bef7fda67abf336d7d220b68a5812f827e08e3b37f79cd56ef0ccbfaac62d9a2289eb3f6287b8db0381a6285af08cc92ff81622695fe4051f1bc91b5f66ee067831cf34976de67c7f573a3f9645dc10fc1cf714b3da7c278c6870e9b201f8ee80ae6471e71a52a479832398ceda6362fb43a76ad958eb6f65d2c7e528f502cfc21b337f8dcee87754ea13ac032c39b9a27335837513e2b4a7e6602e329e5ffc8cba614530017302b6581cedeb9c43fedd3eefbf8aa0bd37a2416bd6c99ae542d4f19eb57e8b4406051975e06aa5a95023405369915f0b1ea59f6eeca91eb2bb9126271e01cac6431bd290bdc5ee3805cc2af4b7c93a9a752fd464d92bcba72b2f1d488f7d0923a4ffdaf94da848f81a1be89305ab9bf95ad4ef9dab542448d4940a98d0e5016907d40946cb4fc335dc043a036b33b4c15c4e886132220b6675d0c0d2ab5d0414dcfd639267ee31aeb79f8c7e338d3e075b2cc061f019a42b42e5d9b057ac2025f1424c56e4ee4ad48ae71863255a2609915cb29236f487913c4661335f688b202d2004eac200b44e3fb0e402fcc8946adc25e02dcc9c973274b65a12e56e32355a54a997b742d05a9e655d11c5e42328710e08df268f0fa01047c816516cf3f691f68cc78d48d15e16806c0ae3d969497521bbadb71f943ed540327b395f93f7fc1129e1dcecaca0db21dd504d4b35951701c92b131851b128fa3b48b728ea36bab98bf4f6c62bbdb31e10a99d1638dca8956c5b79baa8c7f81c3281aa465b8708cb0386c56debcf386fd4de23cc32dfd0a4b30057947b18f0a2f57534c99102b2ff1adc2dcb373c7b6015f61be511c68baf4701f03f666fddf668543328f79164038686b64af2f91e037c4348c8799e6253dcfe65512c0efaff2d0450f81e8b4166fdd7769b7225135a1116eb62195ed5584b7d3ee3977d7ec1d7df8e8418e0d8f6862a28901f44cc9581a20063808ef1c9ad80c04eab0fd5a4d20cc289b5aa382434b913ca8192f13ded0a8eb00d5e524723643592e95ecad20a8b81b2b06dc1b2fdb1043c685b1c992906c15d6c9fadd39a33ed7ff666e9a5e430be51a064b3ad0d0265b37d5931d85e92abd6572234b3583ebd251eae8d66e309940b4b6148b68bcd1784edc2ebc1fc0981fdde9f8015d353970442814559be3903429bfa844247d506029cf9da933fcff85a69d9aabd8a1e00e2a78cc5ecb50d20455bd925375a6bb70fa1b188aee36705132c9d2cffd3b0091c530063ba298696e58d8aca43667b7fa39a40bd1337b561b6d21526dfb1e4039ebddd8b143cacc6b087183c5538014890b6e54c22f963d7503637af2b9f535849561d9a6f939ec56457837e66ce03d95adf7161407b33d24a44aeec1dfc4a1ec67785f27c2a9d3de418b62dd6b7575e2e9e33d6a7b97785e5aa05efc85957f711da1d8e1c0d413fb4e7918e964c0d29f9a5d77dab1b74db798f88d4d8f0ca723b5c73dfdf5e74a45bfa98d5ff022049c1525b0cfa12484a354e1ac3e2a09be200061974f0c4c3a5eac458ec47b63e9b4a10dc5cfbbbc479e65781adcc0fbef9b73a4f6c82a2f34289ba120ec55faa9484080446ac6fe632d8f6f727287f4faac9e616e8349ace9fedb5ce15287b067103312c213f7e5e3d218a81d1d930ba618db0ddcf33aada1f8842e08218649e27975e70ad011445e88738380dcfeef1a54fe6467196c8d28d0a24c1453ec20e5abdcb7d50f3b17ff5eafbbca3d9610723571d5c0900ddb73ee714de87913a0347cfa1033d83f25275426f17d6b66bae280dd9de959ff1e97ba0c51d9506b09b1a4e6e241cadc7a028b3ac4300074063c6c5b1d2916cb0849b348177b6f13e9ec5c6db4051ccea5f068f64d7266d9c42ee167028ff3f5376e74607562536594eaacdeed7fcf91712a8dab9491283a10cebc6aa2e83450f7cc7b52342df46c78dd30701a514cce6f50a505eedf14bc57f33cbaefef2808abc931f1a4 +result: fail +shared_secret: + +# Private key too long +private_key: b9da48a7e0727e862d9ca102046b7b6d43acc7234150d30d3bc539c12274854c83408647f71ab01183b46bc581b1ecba38b3bc02522078db1e12149f79f4c209069285187f19a61fe58b673bfc574a9329c5098f765c93da654f4dfa9ac4ab0156f1161983b896076631a794d28bb2974687fa2c411ee180ac7056ae8504063b30cc050b146336c6814075b0714ac942b6a425eda59855f57817fa99cdb9611246bf18cb799a86c9056bb696e8ba152569559b2caf517bafca71085c26a1255b76a751d27b41a9b9684388a2bd562e6f021f873199cbd03fb36a65dd5c486c7b1c46e9132fb9987ba23661b31fcbb96e6a9277e294c6d0e66d2f52ac4d9358c2a07b0a3cc6672c8537b05e7eb166c245ad787c429cb8362ce1924c3516aeb79c89960966ec1cc1707f55a32a11a15043cba7ffa96aaf93a54b477e12720290611aef710006d180ff6c56a05b45156392f039ad200a61c716cf3f339b0a098715c84f9f5bce5dd2cf1ff58218a70b641777e7894a9580a17ddccc971a358048229b7b162454beb4690edf6492f1a200bb009840492166a15b6403af006371b1d31cc56b5c04f15f615a8240f705a8f621f24129e6a9659c4793a74c44cac8cefaa20b1cdba3c6e95cf49b4979315cf148bc085640cc9ca462f2c4946c070314b3bbd46e6d50353d322292495e1c5948bbf7b76bfc5c67240199a77bb5829720d95e3052c9256880e6623d2b307d1b6b6bfd57b81f04ccc3287a27f5b3c5746433e89b00f57e2e33089e944a28f396ab24c862e1c85e2768ae63ad860661c5664249facf9aac3936c119648a1664d080b06caa07e71922d9c9355cb2bb405d2ed8480cd9b27d11a506698e79429af992855bba084db6bb9c96b9efc677c929bb122360502201d7410e4a78100a7ab03413260962296fd96e736928d2e54e26b51675f4389616511378407d455771fa73a487791db7ab1de16fbda16613d7a9c4e8bc11811e36ac77f96969d79539b11b71b0e5c0bf7a901045a678d03abf7118733388a3e3000f7610a4b77161ca143966b2b04cc7f2924e5de101d8989673138a1ae75e986614ca2c68cf8165504b22e76b71f318957f469859f437b5bc63424759541a87ac883859767319317c259718ffdca77299c342579a5704b1613b021e94058974c45d9293f9ac9b5c296b12779f22166c39535b0538466a29a28969c4ff90b6fd11c2bad943df40c9bddc27b7a8b5a17648e5c16412d2c51fa93ce1983719f6ba3c85b2f8515852a0bab2e47fea35c5624176e4a83955578471c51128cb49fe279df7fc89cda82f43e7988f31888e1906b4b9192c0886738c187bc4496feb10e66c0e8e6b30978866aa09852a2874af9b45ac4c16954059e92b2efdda1e54f8680dba69b8e6b54a680321282d54221ef26a79f49a91f80712fe9899638778ccab3039d6a0eaf2117a5589adda526037686ca1bd4f35731475880b09543d5454cc916578a3aca400c4ad17b42b83502828222b9323326b4931107f56c455d6ba401146b8d241b773172b3fd09d353c35553c2fb9b24239b94d409cbdf6140518d401545805b9a94a01513da73148c516c8de492081505ec85834d7b0539bf64edaa026bb00207b2c39b14656e274c385258e7d185840922c7741b117f48a4d22895e801f32f6258d3329e8361b790c1e70912b38714d7284af3d9a1bc5f9c1ad12c7c6f5798c5c487a182f85fc0435cc3563473d263acf2ccbaa33d751c1531a069bc6dde929ba50488ebb54b7e47eb834be1e638815e057bf653bcb2c82f768195798c5b122c7b0d1cb2257098fb84b80a9b902764f08eca1b0b717f5a98d4ebbcda80475f19c673d524ac6f74aa90ca07203c6026a6e8cd36ad746b5728643865a230dbaafb3e277cd99322a8bc437c1727d23763395a241d88308e26eaf80a31802cc79a9195db31f7934477ec62991e44579fb92684240fa346976483f74d421816900936423e780cedfa578b81578c024cc13a182ddc1af6a8bc61e52b0223156b3233cb0d81e2f2817b04497f7f0056855546a9a87acd5313bca1cd8cc23128a759f32a0597582d77b1d1dfa7a63b31fee316bc5c6c0e8829c3f55410e2312fb0530a38b16fa3534dd733188b9c243eb84e69950166a681ac50e7d3c9ee422213148cd69ea182b21bd656a9b4025465592b50fa0bea65c607705848bd55cd828561b024160d9aa8158a9e4432db011961cacc03b835a9decb91f32cb2409b02a6618b4180159dc79c29607cbc12089a4893a1c1093b5432aca9b8ed96fd7f423d86893168000716338c3e7ccd340ab420a91993a1a8a7c63573a5043b1448b376d5a6b2240baac55964b3d051c67d99f69801c97902cdc256108859d07759f4b71701794b36a9a9fafd7ab28e25050595d992a9f0b116e78499aca05a900a04299f864e345b5813442df21c12212b1cbab54bf600674573e7634294d6909cad43b3e874fdd661b5b4b5a7a69405b23ad2a484c89e5b616eb232bc706c780b4ab240c7ddc78f193310a57237ae91d97176b7140b57fc1756d066fde868d2ea246b74b13b474491ab6537b40a45afc4dd62047868b695487bbd9251f1a1565917382e085aea32268fc110e7a6332b6cc77f9e5b78818c1d3cb42dac50ac9342643b25667f085d853a867f903b03563c407123784a850e913fcd33e1847796b83b5e2ab02c09cc31d2291eed845113817e556783e59c8fcdc3c44c8086e7b8ef85cc35ec943f971a82559b4fe59a6efc725d9c91ff396611df739e2791932dc3398c837e22c95fc0bb40a9b5fa726131db71aedbc3a0c53a3615ac97149c377fc6d444b5b22729ca9a442a4614f4b24cc68c4c7888c46e9c5a6c13080b4d04c5813685d02bd426200088193273a2a185c6c8d8cb80cc788e3d8806ef17548b1a60c86300567b24cea18ee3acdc351412117caea8625a62283f32836532756c26772038c89b37068e6dc2c10436a4436c0ebb3be2df914f3aaaa2c77538994a9ba984611dba548789904d72580a1688678588388a9718c7e02ea664d472b24f62a50e945b03c6c15471bcb414e1620816c08aef6c1962c4ba16cf641daa6c595812e21d3c47cbc21b97c2b3d9746eac997ff98032d10b1ba61b8842a868ea0765397b2de806c12ca266f80843020a453591c35614d6ba3c60fb6836ba6778964148fccad592068d11109b5974f6417497b8ba35414b0a385ae7b76499e7b74f8d569a20cbd28db186a2c218b24a167155aefd237a204029a1b288bfa68f5b8ab88b785512cabea82a944100a18285a60034fca013e73a99dc69c67e5e89bc8c2bcba101591ccb8dea1b94ed296568acac07a2cb7c30d1f98a475b22a7a298b348c0585418a94373b64807c82b6873863243a6810c40bc2d909c4ee49c7d30057cc1948c2a254d97186a7a6b9d3c3bcaac058cb4939e8083a18ab93df0234980a4c302328e59a8c9d3177fd6c7fa85c7666f8272dac2fe2076a768197c5d732f39caf927ac608064992fb0b0d5689abf564238c494024383199b8d97776f228219a504c8093a8e6aa6758ea672f212a011aa2d40b6c51347f267336a795789baa06bc4c09f0929aa2a24ba42a917a823961568b28ea7bc311321fa023ce02b2b8868a82fc0bb8355b35ecb756a3388ebba3933454206a0172cb6c61d81a2bf2a148914c99f0ad699b19f5663166e630f3369289bb61f6b63f5df05f5f420099c765de195bd95849d21b5e7155907f2877a6ea340b9885bd18a5c145bf57f4764e812f0e6a6eb3b13c8b6806e3b9c995c337ff365a0f33208acb9e0a337f57286ed389a97c19744e2a679d11782e019171670874298329db2f84728a5790867c51c8ca12baaf4156e12576bd51a2a30160f3b20cc5ebac439419c869876daac4104b35d3684f47c0cf0026111c31002146cad2d47fa1ca37030945fe725c56714cfbc96ee7c4ba8c3ccdf2903b98c08d87084b60a18c28860c152bc6bdd800af5a89ff730f4b5c18c9640ab4d929cde9be47c21b20cc48302b0961bacff7ca9abd218eddea14f64c26e804637737b5cc4301ab38ca427ac053128097c30cffb9191c2350cc34425b7a12f355382f0266da3a3072dc259d407e7a9187e06c00832c8109c15e4efc15203c3e7fe3502b979593d745d35a997dc3cf7caa033b0b0bc40a4cc1737486bbb25ad5a3984a0d51f290646352c61a5bda92894334415d3644042733fd53496f8b68d774015f37975e58a5d4634b14e89574d439ca3042c0b955e0002ea4b93eb16b43df342230b565f274adba4a179c52865f9932c5fff269c6904a5bd9b50712f8a08044a5e4930c26e5ae7e1beeef85ceb2109fe2abfee0e82be23875d8757dac790ee63ed48ebe1ae941e02196134aa4cff9af76a5bc2acc97524d9ee1966f71bca094f7de4a5d6562baa8f72e0d63ab82a06f16b3f4cd +ciphertext: 735379a4c54eec4916d33c3bcc77de587d62cd4d27f6a3b6b666a2bd34fcb348c79d5b12bc621b8c5ccae22d20cafab6500ccab21d1f5e968d465a7695008f55d60a1f33b73a1ef4e8c096e021425b1e65dfce918661b578682db2f0529772def4a5a8dfde1e4cddd91c347a57537afe6b92a3faf890e7ecf2420213ff2826465ba682ad17b9e55441fa7a088984e12ec639e5df42b3d3cca47e4422e6024fb044d9f0164f9caeca887b061b5d18efb72ca6a42579a0a70098fae8463454b1019d933c4886389dd90a724fadbecbea872ea4cdf905e86a6a85d18936d4d06043da21c1c50613a4413ca5c6ff49233f2d0a8705db55f00b515705f5f053101ecbfa4176427c06d77308d5273a1d407f54736d612ec902fde6d0b3f09a4361e61d79641989bad2434b7523591ae331cf9a07a0f16c106e986b47fb1dffd33eca39a9c3ed2e9e3a7134d8cf7b9f7bab0a20fbb3b9039b1f47a489884e505fa87ec223692f59a1dcbf2acd05c67a61fb1a1d126dffa0aa4b8fc911fd0f449139391e9e2a5d6ca008a73aaebc10309ac2ab3e99c7a7c6d8198f578fc198d56043b9bafc61160fc5707492902752c3e214b8c7c7b34a639617a2f699f9b66f6f0699ca850b0b8cef70c0bdaff0b201fb1c6be476c625feef93d527fee34625561ae95f357fe86064af32f5b3e1fb24fece9b0059758164121eae56867d8f9f22f6f335cfc954b0e6ea51e28f42f9ed04fee00ef676d5cfbe36b4c4f820dc8241e532306be889aad4987c269051361fffd4260a7df11e10de5d0596bee6401b8d41f7993668c02cac70554527ba03ae3132ed7caee33763ff172a5650ef42f0ee482c7244787f79dce097dff035cfb7706746f088fe8a0b723fc25606bf2eefc8e683cd4300a17f7fb241b48b3b3c07999ce4cd5995d1eeb93db59441c70d0eebbf1cb53c90169226f0669d6fdacdef5a8b28cb115daf6bf36502abef561172ac09c31464cfabd804e63b63f2fd2be248fea4c32cd5b1452cae59b5d9c20f4bcaccab15d22a32723295fecef7dce606dc3926914d08a398ea1972412955764123142decf288294749b1bfa2f880b703317a425c8de9e6c3fbc562c647d142a1174d8704a385e9610f60c922889ec7f35d10fb3b05ba534f43858c7fa647ba4c95719c7b28bafdb974871332a9a491156566b5e7488dfb0d7f19b4ca978643cd2475eb31caaa65841fedc9ecd72a863b8b4e7dcccf649b7cc541646f1d08b3498c78118f9ffd8827d7a4be92ea5a9122a2959c8ab3b297873cdf5b540bb63f150fb051e6821ecc85e456bef57311237e39b0c3a5b77d0145e0a120fa18aadfa7baf05bb88420f3ed0692748f800dfbe68091124af952271b7695b2e7f5045b47ec25dffae7da51257c569467e1e61becd76c7db093ec122b6011daa6241bee4789a81f42737183b439cc8db019e43e1c23f1c53e8e14d0331cd5195ff76c4d65021590e3d74210c46c66fc9f87b41c2acc775a98d990a5633523a0042423bceafba09a0b02b0713ff3eb8f19dfb935286d511564ff745932403486c07c8d303a394613c71b014b863aaf27a58c4d12a2e7ce5b985feb9f8c51d765add06548d56c1d320c3adeb6160d77caf94e7cca02c09a6df6a88af79b7953850f8439393c7092a8e5fb2937b5a3a089930bf93621cd34fcf98cf5c3e9215e224257ce0f814ab7c75c89f784d3e6a21c991d5bb4ec062af36e2975505078f231c62481d813953a72e5420e345aa676f81a747a316e5cf728d0b0a94e8e48f34e19d9701bf63be3d57aa173308a915135695b5f2befa104d3f834b99384ac18640f9a5976518e6aaf47380e79ccdf4348f199288db3c3ca1faa2fb04ce66ea13a09fe3312494af03e57076766ac8a06134241d1f487248893d4cea39036bb3d7f806d9fcfbe9d7fe11dec883ed6dd3642d0923486131c038822296b8aed98445a621d307378e345590956361d7bfaba1ed4dcd54f9963023f32d903c01db6f8a86b21cf4666a7fadaf7de10ebd42c56895c4ce6946b528ea350fb95869082b02af6c855533beb5fb2a902d2b0efd595fcc7266eee77ca156b6710fe514e957605bf4171a812782867b14c8a247b7570005463fb208a18e66a5cdfce39313367c55020ffe76d33c87c1b1d665830275682f82876aa9f65420a932cc91c33c766cc665dda2443c01f5499 +result: fail +shared_secret: + +# Private key too long +private_key: b0cc83331b1fbf300bd4bb069bec445e6882eec64cbcec9237076f36010d01836f3d907f51e3afccba56197c6486d387c3d76c678c195475330edb761004cee7ba634e2096acdc0dfe8108462a04c4f7097aca68ec890d1b599d8e11b5be1c70d1ab22ef1012638516e9959e316b1e657709e8919cb3e28c452b8aae2b3ed3bc25670a9e849acb9b8374d70b2011f867cbd7a4e425925cfa9d0f0b485e290e3ca625d6dc92cd6718792c2af6566c1b8cc6c1b39259686715a4a94312cf7288246a0766d98501f8f10fb7379fd9f72a919c12f89a3e0d7a7163862e57c785dfb6b3e3812402e1ae56a9cc3dd60dc81072e5eca94922b80e541622f54e5f5a1ea5993e57c27f1f92b1f0184eff361f80b8409ed07568128b580a8624fa1d1d350127eb269305ca0d73ca6a9a45a0f990f7ea5dfb128e75d09b12c74b760a049d34883fdb2e451077f28739a903827cc5c4fc46b9085a832d801a0198cc6331b00150228a9499481bbd47428edda59c864178924b853dac3003995e860ca2bdca0a4dd171215323c5ea6fb9f45140ebc6202a1094e56542ec4eb7854d8db1a54f5c3f5649232c7720a672a8a9f360ed78b23c1065bab317f625240a95123c85af192aa04f33157707342d6543f8702267c3c1fe4048f9ea36414b93187c76b2787de1444baf66841700b4dc347ace299e482ab0a931693240048cc17de765a7fe35ca7d5462f780a3437196fb848803f0cdcad1c1920275e3f74eed578e0cd38c8e9b7145909d024acfed89cc91f13e943261cb1128e7ea0e606a7cb891512818b916984552214bebb3c6b200c8ea02ac68206550ec6c3f523ec3e535dfa3c375229aa86a98d1a43c97315b06e4b8889548628b044e5b828a66b0937064df3611456b95e7ca9dd4c490e12b28202306a46c69fb255a85ab1ce3e03c250bc68a485dd3a44ab2d877dfd2042a3b99a3eab71ea1807f96a5b9623956791fab13c76a5a6dcdaaa64d2091507045be2c440c595077a247149b4c8ba47324431443b47f7986c413320f73fa407e629cef9aacf6921746aa193b336cd77a438fcb1f14c478db834756b63907a101e6f0487d30acb47671d849ccf2d401e2362c1ac4646a1a2119f26bb113ab2ea509c4da58f094638192cd951668d59402e0ec382175538381511a515af1d0a6846c919c229989208b40204202c5493f779ffff04498088a44934ce0aa488f120ea12779a9380a87d56981c4a561718c758967f8c98e7a6724faea96a9b33ab7f000d68b81c09cc97cb278b71324c613c4b03928d6db001ce95ba15972306066b9d9929e5a88ae49509c9b984172c0ecbc1671ca21536c041ee2128daa26f4c059bfe73901a208a18a272ea276005cc411cb6455911bab71bdf60c5fcfa07c19e45561591a1111b64dfc7112e550b7bb8c90f232d7a77fbca276cd89677dc2af6b9123d5b841ccd96b9c21a3750518fd197d8a6c8e589862b34b00acc5188005b96b94954a713e3cfb70fa6a398b5b179a82adcc0bcfce25057fc3b44fd56e48f70d10703b26e18a3d9a991ff99e507723ec092accfc79bc0294fc024ca2b20815710144a72fca130e4c57319a67698a885a5c55ce8db79577724a2926bf52a65d95b569f0ec3276f9bb5bda92a7857082d2b5f7db5425d5cb08833497174fe9c51fe953c06357c201d03ed67a9617a4514cd47bd16724b5c99a59139b1a1c3747ea3a56d02850691a95d015a9818b1a6c3d43a6c504618af5e88872cabfe2832e6c725ae1f2ba43548eb32c1933e516b653bcefeab2fe0abce337be29890ee68aa164243b2a00c594dcb5f2da3c142c6471a24dd1316153c2cd621b8e3bb4a55ac7178a5750066ba2cd3c00485508b67b293feab48196c37f817026d1337fbcbaad662fe2e14016b851d8c63339e95b922b3572a50c1d88ce13d33ab4a1a2c243a75640473bd8133e717d101992faccc390230a3cccb865964b99067fa2c59eb4377b21d33cf979c846546bedeb079f08b755a71a81427698c363f83b91582a9300dc49f4e7750497624c75b8f294979572203b84af97972afc426f06920c3eca3918d93b1107c512d49c722a9b66300bb9ba71e0db2dc0c203c9296a3acbb46a1a9a6a47a7e998222ed348325754ba4b4a6311ccd3b890a9267840e31e9b8ba2ba029e09058af0e2102041a8ad0148450749d6c4378277b7c482aea3683214bb470519b51feac481cba2c82560ca07080250c0a256116bcb98a33b24441c7f97db9445d746da049de2d5be5e9c7025565e48b914b5e92792e486c7da9e6e88a2d83448cf4b3e9a597958e841fe5aa37523bc8748431814c96cdc6c35237a2ebccaf0680b2f1a1a95237da73bc6ccb96e3089cadf36793ceaacececa0c3a226ead3c293075931213992473323d67b59d67a6572402cacba7b1ccca9e4b488622d342ca864d102c24627ce415852a593bb257b80816c35a593403987394c091bb86a40441a0eac2aa8d01df2a2a29de15db27c501319be59e7ad0d158e43145da40a2069d458b007817a741deef8ce926bb38519506dea01d6523841066e76817e63a8c38a57c5491c6624fc3c59c98015a38d53ca6444c84436612d3b77c8fbc58f89ca73d47c78ad63a5305685788a92fbc0969582833fc9395cfb6cb6a60cd4616b376b1c306cb88c0212c8fa6643d02f4836622b82806958610fb377a1d3551a213731b101695369598c48c91422e7d151b83c73edc59c5fd25890490b02ca8879b17a4b0425cfd8af21d95d2c72814a18abd2e1c6b6aac96dc4bb766614362532ad18c985c88d1770ac7ab2c5f1f50db2dc37ec1732124ac46c593e1d9c319406027c9b60398063fb450033e33fb9d71b3afab86156b0ffd18fcd0baafd7446c51292b49b8440690f76e71e78946bf1464bc1e28a565517234201b0188768d8adefe7cbf11116dc6bb49e96b28e845bd30215b4ebc06fc7abd67c6a3e5248d266b0b62c0c196366f540c5f6998a8e9a182cd38e8e613bf1c01b56009d0155a408e1cfc258215c9801f1ab05ea1bb583b03130190bfad261ffca3ff0a121c97404e69922d0e774ade86ebca83a536c6903f68a7e0157eac45434369dbd045523c3ad664b2393f3442cba91d2e412097b9a1cdc70560a303e38c376c86fec577d04581de7ea1e13f79843a529f23c8c45958369d4c7d4377e38c478e7d84ca24a58170273c4c23e0766cbf2337b7b37c1dbf85f37745b01649fbee0066c4273c57cb24c6328b0e022e3435869a21ed034c5c9abc007b7b61ae626d6744081ca5dc4c72e857510eb57b2722917dea76b7a34789e037dd1719339a41c77851023eb59f81ac2035964a8e6afb67a5531fabf39079b5ee2542a2c0e088396ace67b3b847d14f31d8958571257802d33581c5849d48c6a323412b7a4baa3b6522ae8c1fa9208c2d748a6083953d4a31fac3aec6047fe520112b13721db964463a545543d4f49beb52c9862c904590448d386b24a07b7f6089fecca41f61c2419f695b576301a78224dcb15e754a433ec0985181b853a897fb9a4e603c20163925eb6256739022855ce9b53c0b5d6ab30545e56bb4305c553cb659195b875cba681ae682a46e056fa37931242405c76b2678b7b1ef22a9a39660307c1aad896e8f3798ed3498a1c7924d6afc4b206f8859a44157c0948225e132d4b438b330ab964ea5469276a53672e8fc61d191c36e01512503636c8e5451eccbdb45bb2fc208c4ed2135bc6c6a1d96f3d76c7b5cac9b9277f84d86e047a8222cb7bba6275784b14669c106e16aafcc138967183dd3aa60d02586ce57d980c8d325811a6382d1b0112f2c5be854c9548a71b8e840d47916de05914f80aa5a8ca743234b27a2872d2e49266f08ce5e5ca977b728a8016c7a19b331bbe5516952dcb7705d775814aa79fe27c4484c32b7c32efd5407e5a2d2e785e1bd4340a684355aa4d17184ad02c6d139041d0198da447233cd58c01738743ab6a18a3180cf61dd9dc7738f4c0e7294ddf1309452a0ba2b9aa032b5ae33382a67c237d5612de8c603c13b6690999c391948a2026680216f74946c85acdbd8827e78825784187ebc6882bbb395f4a626a4b4b0ea0121e2317308a98c723894d5719241a75a8b631193c99f3ba87c5297b70b4a47fa0bd0c864da9ea54dcf05f9f1986acf13a87092e3b35ce274b100c4613a0ba8d82b8232c20b892e119530b811673cba1e9c1865c7981309df26a118f06b7744c16a1e53ab3ab3a78f76d48223d7f6c86b5fb15db37706f86abe9d82dc8264150808bd466288f0469922137dc46769f3c66ca86110a3214f0c6d9656f6fc7b601a8b37feecfb55f8bd5f2b182ff57b959781e48b118b7b55fbc18227458f0ffcefb46c96954494abdb892efad0ac9895ba811e094196be1890d380a5708875a68d5ee470bf3d46f0c983ed0d8430408bb7c79a8db6343d4bd6ac5d25ad5 +ciphertext: 0a15ddfcf8d37c696823da464c53645d4e571a8ac0194f200a00131c64fb3c01b8d1a04c2d465c78c0aca06fc5d78165a16b82336cb06dda813b82ea359a775ae91cbf1d0563e582ba14f97b952c8a8693020dc4b7840b5c69f9dda3f8e3b70700ecf515ece2419e4f2097fec66484812877012bdb1fea423ac151d5c1958d60a1a7fffa5e7cd40e0c22b6b4a99f3635cd1a0b0044ec5a824ca6eac9118d0ef9ce9ededf83fd602d7dfbacbf7172b84162f217827d39c5c119da2e87f1bb96bc893ee7a556f40528627f4137000bfcd17f0779593b587bf60479426377890028ebdd4fdb0cd77fd82b9804e1694acf19f9ee01e4185013fc9f23a326d0619ff2175117ad0ad16399b510388856a6a8ca031e5bc507a7feeb39b322f3cf38712e681d129b5fc54ccd934b9abe30e7395591a73cd7e58364c4a0e8dc6ee921f911fe107c5f40a84880ec396fa156a81f1223bb898a030c5711260f69d2f4a220755660b4fad91200bcaa89e9e5daeae9458450dd6c10540fc5eda95333b19cbb666b829d6b437ec6651a430641cd4c202a7ba1ada0a9f4d8801be452d4b43b999d07857fa39afd6f0f42202ba169a79cbfd56b686c596b4874dd1c23ccb46294d9f61414716c2994ce104cb46e430ee37b5a26f813f950d2015620b43c780004857ba323d7c98632165b21720ad4a0669fe0ff16dd2fb5bd5169ae502503c0c2eb6fe2dc45cc0f906bb52388bce746d2c015144b1084dbed42a5251b4b6df899946a66a670180c2afe4713634a96893adf4cc07190bf3b63418871c08db6d74ab05a8db57a0f2a0f2680f1e0d5d83285a25d27efca268220619dce257d0625067a8c45c00f717d0db2276932107fb2c454d83b5119bba0fba221d4628e2798a5fb3dcafba93040e7bf78d7a43392b22d70313427e9c27d103d68a68ce72008ccb221b4604b73a219a67fe91cb90957d99bc049dfaa50bd632765125082bfb6824a3425c5a18cf0c5fae4840644bc4e394655917aa7e5eb7cd01b1a7d913ae528c589fea66994f78ca4c0eb4049a1729d3fd9a2e4c09adc54defa5239d370737d6d2bdc676478bca0c7ce8fc82f1ded9e3528a3cbdb2f7c559da14db8afa137e6d5002e011c4e230c3881c8b98669dd9283cdd16b8fe7db43e276d69ff3e352927d7a9fae6a4b4f2f936536114277ca491233b51c218b47eeb12173b994dd9c1b75334641b11822b88718a3c9965c03cccc349bb28951848ba2cc607b042b287c54a95359d6dab1c93a8485c0184e9c6db4a22de243d5e424fe6961ac9ab3a252011b5db9c12d149092f048b65f63dbb18ebd81033dcdced0b57fca1bc7f2800a5df19055c48096c77f2a421ef7e0e460bdbba81521b1f1e971d54d7108c897d8ef16855093e59bb5ad396b6f36bdc957932b4a66e884e537e8f0f66fa056da0f35e2b6a0da79ec907405f6d031e04aab166365899b734ddd3e6e27259170cdd0af5c0f8719c88e6dc78bdff86ea8115e9f9c38d62ff12ec35eb3a95c5a928c32488521e0ef8243910324fabaa1609742d13e31e27784754903f66140e6a82ace7826cc07f220fc4044deef1a900ef227053683cd6e04e153a52ee06ac04d50ab6bf4b0cc9c9582c98ddcc2e36bc0435c464e0a5a351744e4c1f24c8744aff6760f10676b5a303ed785501bd7a1a089ce788cc7447e950d29cf20f861880b24199258cbd60b5e4bc1241512a042a8f61d18bb2b1e785ee1e6529aceb4156c5dae291d01c8ad84a60d614ec53520b5acbb4e460fef83652b29037fbb61e5d5e50970863f28842395c9b2386c64395f8c099274fe5ea1d4750016b5f86d5eb727f90fbdf4f41572431a440071b6f15f95d4e94014add1e5c5565dbb56d0daf84dadd1505ce739de1dbec458ea0bf84562f2247e6f6fdb5447c1dd66f52f1ddc3f20ce7f4b540f62f22492dbaa04cebee16866a9a5dd0a2078ad5e31c2efd6f120d2bf1a3b8d970a441921315fc4d56d4b5b30e5730c72e2cf19dce1bc6d7d71c24a0798bf963d69338e8d1f9fd77708188ea3e28891be584a4c8e0effd64c3cb09b7edb0a8a3e1359ef36b2f29d9a615fbd3990d1293ccccf9b32553056c8e56c5eb964354f17ab6e06f5d9e82a9caf9c4f48e49611fcfd73339aa169f21dc090d5537bf7392e7d7e6163dd6e3b4603ba2267c899c5380db400f770c10874a1403318 +result: fail +shared_secret: + +# Private key too long +private_key: cc9a587c12cff00856a3574df09885679807281bb8ff1a88f3d98f94505cf9b951fd89aa7ba18f6d91268e1524e336c3db3c2211e7b0f6f627abd46d750ccc25f02450fba651aa00a1d54a8be2a715c22cf6756d7cecb36f982158c7392bcbc786a664b7005dc708732592233eb880e3c77decea557366949dd3b8dcb248f6e7864e69295d3ac7816066438504803b0799c7605feb28fa64066af42bef112414271fb43a174417b6ac34685a1839f847bc66a9236f671921b0ccbb471a5b2b69e3e131a66785afc8cc4ae060e9a2ad32e77dc03b435f29bf72920186296a1b2ca5e19b76b7c5a67ee42b4adcbcedd49a2581279b045a2eb7393c63c75497696de09e70f17c52a60876f651bc870550146834657c238b3a0d99b32d07d0aac9aa6ac16d1da02938a204a2550db4e1b0abb0b3f421b736b755d32b674996cf3d115bd9304c33248f055672f665965c0b3d19949b90c922a5c61ba8c4521ed81a4d06023bd572fcc73b7bf8aab21a25cf6032713c541189bd57ecb9a2502f02ac99f07570f26001bda362824c65ae59bd00fa63cc96532cab64f63cab85b208f98a3292176a53f1870628512d4944983036ebe8bd84a8114c683a87481d1a91a16f129ac3f3832fbcc9a1826119a1067cfa859cc86f752c920419a3e1a21e95e869afd7595664cf57f2cc1abbcb20865c6a36bf906532c348c8d89272ce3a994cfa035229059a3170337c0b46a28c93826a056b241ebb6fbcf00d6d264d65aa82caf57970ba56b7846f340b459326258514b25df93a4dc9c688820b582226e5f4511438560dacb318151481e714cc5578b3c0a919f4a34a9aaea1ea66b4d309e4c963b6d84b06b029c16063f0c759d18c2b58572e0a111e17ec5b3506213d8cb7c87ca647a9692eec6d7d8252c20bccdc72a9e113415ae74f1a4718ce1c47a9c7cbba98a09e31bd4ae9208927214b448b38248183a37d7b9a7973575f7cb1044c5203dd541724892fc0347ea08a12bcf6a353a381856b700e12a9d6c83f02626bdf73ae1d6867b349a067b507a32aa953b6ad3a793bb7ba30a1b045a4e3501ae22540450a17a84c7814b2cea04315490ce812251d7acb76a9c990baca1bf3b8220aa08976162871a531e8995d700448549bd48787b59269fbb06bacb4cc2ea918377731ec24a6aaf80c7fcc182a9267c9e89aa0c6b939631bb077b01e1a4b6c106759985814c09ea1b9727ca56231d13f9e27a2d966abfc99946ac043fc4b3757db5454e0025fd79c577754a26404fa255acc89bff1246e9e2972196201173214e338535d512b1672685647312b09aa81ba128f675c2f4a42e14845c70796f576733b861d2fe560f665665c77b868e9b8263b669eda1b95667ff043408c26b0648b12dcfc6617b5b6110b421d8cb76a2c8423208cec85a20efb066ff3079aa18f4bec9a85419d2dbba4397662f92a25ca4741c8963c6a3258105a5def58b1e9607399f292b9377b7817408f59c458f3bd726c8df3831778bc83d8fb076e36918fdca7d2224612657cec2a29f05a3b0634cee64c3b652962568c739a3b4c08f4ca0ef22a12d55e4363a6969ccb09552586710bfc16675d33271196cc03752dc146433d941635c56ae0e5b84bf124bea402f851bcec849e565185bc61be9a60028ff51613cacc261509905a363f82cfc9f8275ff6557b38369604a4fc4406fd8145fc94865eb65df02169f4632a4c986bb17a3b1eac1a393349e8228cfcab943a1ccdce155a7fd29f699766a3f8978808780a0ac8c62929f7e4210f8a95f58cafedda6fba222ff8bb84c7bc1c4accc354272281c30a4234bc4a732a0ffa0d1702b1fd1a23b1a6c93e749cacaaae5818a0cc50455279053f7b9179d80235124cbdd48a000c86559ca37447275827ad80b45eaee855c9eaaa31d15ccd48c7cea51467c1a906446861d483ab1264a35a6fb128691392808e8ab9a2079dda4a26dd192597435d6868a8e533c8ed1560a877b20e7a831f5854ed3186203c7b3fd474de356ab7552894cc7ad262268925ab256b1232b8320819252c255451522a97fb59f07252ceb55bef19c3c9e07921dac64d5576f6ebc43ac9aad94c398a3a8de269c77d9719f95b7c02d89850747d05b596d3443d6567c0da8a0424a545ded104f7ea16a08a1c576bbfe33bc69b556dc3ccaab33c4adaaa9142d8988b6ba494a48f3f3cc5a80aa5caeb98e273a46cc58e5f1b34ab3c65a6a99f20087b44e871b619341d72379a86296d4210b65a916c950fb1aca50337b9147a9c058331efa01d37b77e04176aa2e9a5a4a58aac8a2a9634765da4ab7d0a310d081a73404b7e0b3493d470f5c27addb53f1244c5e55484421c88f06c9ea7e6baa1d60d36e79573b54f24396b4601cc15514d4008c74b7923aa4a11c31a7eb571191b9374b5cb5907354cda5778e7015297470076b870f049633a69683c7c453eda7a37d13e01d48c4fc3c51c577614aa73160a0e4907bb01b310837c215367668f808269ba3499c00b46621d1ba1977a68b9d9f453acdc33b9778be6e63c19366461ac769c789b7e925443221d5f568ef0b83edf84b93124c89d1a28c9e83d8fb33b1aa60cb16b4c8b04348c674cbaa0bfb447439efc18050b016ad36f26acc981a272e4a224de6b35307a7951c948b3b0c60fd47e8f6c80681387ce66a5c9a9c3f145ca3113a1eb1b801a9489094851805c791a215d19957eb2c7a4939c566ba8313520cd414c4b217311b6742cda8ba7668b38b5c1ced565c0fbf51db05a221a636ec2f65199962aaf74372bd860fdb42222c63945429b57c147a14b342c0b5d4d181b70801de3f93c5e91c42c9199b1cac12464404d678eac06218b62cbf5e978fb2b5a460b86c1ca932bb618cc1c930f3499b9b7b7aa5417ae461e4129a5699a50dc095279327fa0186ae9e7367ba885a9bb49fc196205002928a1bb1f4765e36b31f1ca0995da2acc26bcb432b0b223224da981db31619a99aac4b08bd40a545e097cacc73a2cb3815468b3faa987dec64458dc0c28e732ea18001072cbae440d2aabb5324a257c9b7f4712c6442103dcd036940b802071be877bc759d688851071b52ab1416a8eaaf19066659d3a53b4c1339be1a60f60f56602744749b063bfc73d1856433f861068744434153a6a539b31b63416e3b6e717227dd268e2f51a75c4352f7b1b92e84e5dda8c752245d8f21e2dc096722313201b6498d95b9fb019ce7b7fe9f50ad9990a72d1b7be40b349774ab0431ad05c7cf4f42809acc0d4285a7c8564985734267b97a061a84361968a47a800d16edb6b894a362eba0c160c3a1231f1cb2930a8eb9ab73b5cc336d63a6bb6acaee4ce103989a0691f2093c7c7d14c391c0dddba7309d9868a84a4963c10f497564b74250f74cb630b1a8ab5a3b0b06d9502ae9e0961584670f29abfda627c98f7ba45dc37feb10fd4b869fbc2c5d2f8505ec71b0e4665e7f71bdb605584d96105fc2f23665d58d49284d5b485bc5f996567658a5d5ef9a01ae33d161247cc3a0c2bc53e237b542774879884b603eb8e48e7083077af643b1feb6a4379b6a031c0a4c1226afe4a530f912808f8b9f78901f1aa075c10832c673389bb3b775c7fbd641dcb7470569ba557697855a8709671675bf85c817971d8a42012604e9053732125658642be9a018a27960867a58069dca4f4ecbfe73802bf35ac0efc54dc5286de9b2ca8d91793f0abeb29284e792a3a850cd45794ddc88f1794c713e18ecad2b7ec1b0ad7c173eaf8bf7dabae8a05ca2251c3f9e5aac0c178b6b269b724162376a1d3aaca0a223fc794b877b88ed1f45d0a68013ee2af6e6ac3829ac2c6227aa4ec35f54c6e38f129735100d76a4547a8c30d0a7cfc9b40512c245817cc3fc4755dac08f6d578f7b82f38a325d0471d9e62039814ae4c3c746a184e5fa6c53b41abaf638939267f07129687c16dea790b3f7363bdd04a61820f09f29f862029ddf5740c609a1db2cb553c3908cc6cd821c2dba46b55b8cc6ddba42cb69462649461686c6a365396e41827611821dac663fb7b3942b74e106148931e0baa2b9f66548dfa7aba596d70d8186b9cbd2dda54c346aa11880f8fd76dd2b71919f080754b2299652064d429340a694e9a480a392314a07c3e7097cd2a58eb356013129f46da2f8c1400455ac02d14696211be121b34b6b56f158952ebd1821662b66ba1182a377c2b5c367f0647e9588e91cc915f52938c581a56677ea8b2b03735b4d0e42b7a528d155530420aa520f066fd6b1e4d950c3b91bad24a3bd68b2a139a9daba10d294a8588e451a585500e903cb24ea4db6b11ea641e04e0b902513ba47e0df3a725e66085860e6d014a4ca8f938a76353f8d7bc53b93d85f76551d5d65740f742c7a31577f5aa910a2cbffd9bba925a230df8c3aa6e7e32eed5fa7ba8676702aec7444f11126dbce2cc5c3301484e4148a6e5e157bbfd3a4bb924 +ciphertext: 2b3125a0c94677e1b5fd39c10cf469db488fe1a5b69abe530d403747d7e4f462b5558fea90c52522d6e35f316392868a5234d6095a576eee8b4d3ee01d1103ae0a56d471e789e9c587d2468a456e100d89bc5f51ad624413d7a1a08bbf3086289fb788e7e1efad34e5bfeaebb06b9197b20e133ff5d551e6385d30ec38f1de0d4915dea13ec0c6590ee318aae9dc465fd8792c827bedfac4f40f6a004de6eed825e876cb6eaa20bbb4ea4301bca034805e5f58b2f679022a4f93700a9d16e551c2742e49ab708571a5b6d8cc725690484802ded34fe7e1f3b24d37aa7da191df6fc3f32d991687d0d3e3585563231bc57e3376a95c1fe15c33a7a626c5d7feadb6d71cf667085ff2dc7982f1b554fc6b1082df7e4f591795205c342ef0d2d228c9ced71a1c96fd91c846b4a8ab5bb511865656782620d67c3f2d1820b9dc749a8ff0582e0fa6cbf3263323cc9ee3d271448de5cafd97ea567c522bd37396554368816823470a1caac8eedf4cf6e18294890a820be5cfb53a741434b5e4c5392f37b61f658fe7b9d36a1f7c98490f3b319c4e0f0f26c4c1b8c89b66be83b03497287994d8e88bc9a1bba38268b917d4540a928be3fdd0320627e9953be313aef559fe5b82835133f502866d4b3ff31be510ae1c97cfdaacd28b381afa11d65f25e8c26fb689610ebd05a7be347a6ad6653cf2be6016bccfd2063e8db4f277cc27c52d10aa3905fb5d043241f341ae2c81f89aa2e829c1068e912084ede81bed49ec293e4915267555789cae27c5fcfbf9f153fc8971932bfeee7c26594dcbb752e30f2b238c0d270936e958a554c8b0baef454bf61cfddd97b7d7cdda03da9b0169ee2d26455f82206f77aea61c93bc726d2eaab1445c5448938f84bc57d82739d18c8b365bb8a5523c35b6d481fc1cbde6a417670fd59d28485cd5a6a16cb09904f06a82ea581fdcad06501da6bb0a67b31c379476ce16874b6f0e64d1ef2d822fcc318636481a85b58ee51e20300e8273008970dbe2ba2aa1f0d702e64054380799d7c14c569ef88668b057f8efc9b3572e53c19b34d60debe2b58e156ba99532015b8e20721e29fcb58e16ddb1ac4c64a108e4e501f5145888ce76f7f6735745d71e7fd1db035b9927c0c21799e9c4a215d042eec1b21c8321d9d56006082e7eec931b0adee985f1cb2add03881fdc7f5df382cc83adf9b59ac224abf3a8046b001e64d1d956f9c85881b7238ebe810b5f1f151df3f8437b8e2daf64ff1137064b7135f2b9106ad7e1d4444cb4041805a9777f6ffa44d4a5e50988210bf019aed179b6a56109ea17147d837f836ab262fd55725396168e0fb1b6b0378937e545587c2d053f77749c46d1e3d9919c116b25face7a1cf9554b695ce4076355e091723771c6a9268b155b44e04ecd411f4855aea9f6c611f750a8092ea28e8f5aeb0c6ccb62e93bbc7871f894b1561a1f3e1bde8bea8d130770e4a1175a0cae506752c9d50688263980f80a595006e4c3c53d1e0738ff7bd3fa51aeaa121442b9f3cf75aeed7553bb8d7a8ff58e1cb5c175f62f2e15fb17deea1d9975c685a64276ee441040b0a378fa74d2a4e0b6c61979538b9d04ff54aecf6493b11c4a1eac79a187adc122e4366449d36be90c19a8e9443f3c556125f344fc7624439147e08484ce043bc723c0f0ecc4b862688d985b782116988121dcc37637242dd37769cc0091e1eb7466d2dc3596d51d078400bd0b3e9a36009ccfd15d23385e296ecbd58f95e9decdc3e24dd962187ace83fb0da481632682b83bd79d5f83936ee1eb61253b4d412d1f34762d80888bb628304211d69de598884961f197120f4a3c7e396ad3b5cb9b6db3978cf02419d318afc38dc0e1601f0de1cf8e471c70de0833582e3f75e9ede0dec8ac8d65a6d9aefc776e34bef9266c4ce1687f7c3a6e708dab6ddaefc311a9b68363632fd1945d2e9e91bae0da815cc9b7e95dddc54477ea572dc37166111a4d6058afb7d557e846a86600ffd905e79339b73ce535fc065cd44a0e802854e4047fc702fc86fa38c4f29c3172b5b07588c326fb4645311f72d79af95cc6575c5605df80aa540eba5fd2a5d8720334104454525ae778b5e5d84310770dae0a21d34c736c1f6e7abb2b04a7e2d1bec65b20aa4b16865ccbfe4f2c1a0dfd8f54561d37a061e18324613a2370c2f6ef4bcaedc7933b1a03597762 +result: fail +shared_secret: + +# Private key too long +private_key: edf7a3dfe4a4f304b90ac7182a2b7bdfa5ae5a048f31ec4f94224381a1a66bb6ad93360ecbf36df6f04e4a4c971ca84048cc99f32684cfa56cb2fc0ec19cc499e671d24951b6081c9c446ad1588018bb236e2b34f4b87b0609545bc62b5e6873fc6958cc00c916715a772247c03ab807ea4ee958be40197259c93792fb07b4171ce7913755630c17142aa01c9382924148b63da39658ec052076a422c7938a1a26876a562761e05b3f959c587847cbd3726f6798b91b94e079baba9a63315a3a682935711b0d08611c2bd3a63e80ca50ac4a76275a8a6a2a932575785304aa56a2642986a4348b59058e50c29dd27922ba8c049f2004ba062383ab228763a0e7a7a300c42bccf2a0f9b64cce234559bac183e760619a1a9f38a5cfd9780df87b634007fb904995034a4f96bca8ba74fd652642f7230d82c44b36acb3a02ecc7bc55672ae89123f1a626374c34d746b8640b22deba36251f68273128ce6d5b6189c13e803ce0ae0417c96418545af1e954db626bc3995a640f970d7ac1239930d2edbab045b7459f8c06b9902922c319c2836a99620b0c04c3c841c3c306ee64024ca87207e671d4d72b2dc9c42f3f8652911c9105769661b9c82523bb1938711f1c9b8c92ce77615ffe42dde007f7e76c748c602e9a6a8b2416477999daa3694960cc50a0a6736d0723f61a392b768b3576dc4f8ac04a600a860a4b7a91900c19f2e6a1be0195a097037d282353645cff6226cb0fa9d8cdb4d6d2b7f8d54582f862d00990170a93aec255000667eb7ba11ffa837b16a40e713527f72cbfd24c92b506428a210daa8563e235bc7d95a7510c5767578ad7a8e2c9a82cb6519adc8b4792a5d74249ee06263f439c87c16222ff5b649b0a4b53634984436fae322a7255fd6595bc9fb251e34a1517528828497bb618842f3c5290bc8cf83a2a858818477389299a0e17cbe1d013a49fa6ddd2a2157d6a69f78101fd9c0afe1142a8aa3ead4336942cb86ba0f9fd43243c07ec82884df0b0ad6bc47d65502c03529e92c9f52d45375e0b07a3c8cff95cb9248c09f919ceb1c0c4d452291fc6529497939a2ba46096c137761af3cc577c868da065be1017bc8da235ef21d32701a69630256c0940b9c5668033df48040f6e23e99e2c947aba54f3595cc17bc28a18352c8a20c4c2110a7289dfc2d74e4602f884573ba7e95818eacd995e1eab3a21907e6f19de1e1cfae911d7a1aa27c90a93a2ca8df35a2d2c801166156c43580821b099e52430e1b17f3f8b6dd493f85dc1029d72ccb9414a0b2c94d8c176e1b6d4499a97c073671235e26c3bb363aa390aab93351be1c05ac672ab0bdb113c1aa000d329aab912b9ba1a74ff70319e5b8cb7c5569234a92b96b24d6981ccb4111f5b3bd38c518c17802b6c5ce0c1676f539837710659823da9cb915cbae2079b75eb06fb0c71c554c5b0c4790ef19303c2491f8fc9659952dfc572981d392f69bb70cd412867a1c4669409855a315c41cef1417883cb33deb877163471e501e17f8c2c536b718e46444d621249399c5fa5431a12bb7b6c059820fe25891016ac15da972caa22b987117b313916394978a4569c2603eb6e480a0324839626c7fa2a822900a86041a99f189aa401a193754376b2b0dd994a8f208fae127adc6242b34281bd55a8f4373e41c182a382b8b87ab38cb484b04a2ffe96b46748b88b63b820b4a327324a48442eb959276227726f89baaa2c2d684832a2c69caf2b8ee9267ac588dabc6805844191a7c2abc24b50ce16a16715000994017982ef2639231d0a986b415e8bab84c5169c6d8af3bb70576237da9d13797fac37705774adb81a8eb86313c14266c6d0a231334c8add5207af9b91ce05c4bc7366375bb812e77a5a276164cb96b678bafb7028d84a19ca9f2c633150cf6b5b9cb7025f59b6001466ad7c8bb6b75aad142b2a995c483dcac96f85872738febd28d5ea8279b26763012c4c56262d60ac5f981113c5988b6ec4911102b31a81c7a5a40d896bfe12c6c65aa455a86977d46036224b17c7ccae7e746823081bc174b9a20c257bbbf3eb2ab83c4488f0c6b28a74f5db9aa01f250436990624acac4c79f788c2f1ed5b81299447fd4ca300c7170db6e7d06014ee263a88c106fa5847e41c76f435e45ab889d88c46c512ca7364b95243c2e765e41b90caad8032fbc381e99b979f4c63c219b93149dd9d42de2a83c5bb43887eca9b4996c69a42cc9723063031947721314a3346bb80ee1d72b3c869e4c442583a5371ee47377a0498df022f71114e1d70f0e7b79eb96a847368b0007b8f4b395cccca5db2504d77b28f5f519f912c59ba06b00575ce286037fdc87138a3a1de58054a9c54ac463b844bec4ac0734d72eefa0c58e2096937ab817093713c4047302bdc303ae30a7312236041331a547f2c2d633160928bf824c3539f6972b0501dd2b8d14c86fa7960d9fea6ad9b6c0518bc9a9c02b098471196469e8448d8873a7538623c825973c12bad8c7864c572676e35254a0cafa719f0621a698b67436958e2c493ea21099c4b6ced6395e1245bdb5c9c13402206b02bcb985bf0ff89625e2353e346892726db8eb3047c152ffc6c3893059c4ba4383b48a0c1c79e4a3042796b72ef659f2f47b1f2140039c89b7ca335235b811c18c8c0ac2e7260018728ba9ca28f8ca5f64c508600a52081ba061e6a1d3e27870bb2eba5c9e48574187662a79147787e473ee694671ac783fc5bde9b1bd57580671890583b82138e9b152871e9981133c0153c4c6729685293fdbb987c22131003c32b68f2e664402f49ba46c2a95673e96052fcc8788a261426e55843bf9aa36161cef0357d2d31bb9f8bdab15a33d56b8c05a1e40099330731717507b40ab787ad611c58c1d09dcc8eef04b68a44f3164cbd4b2639d9c12a3435fedd9470b429676b5aa630c65b92a3a0586b18953521d0ba5ad838a0abcc6fd61b2a614bf8247ba3d3aa0cf6c764e3605793a2c682762413123b83c7f99b499db188e31c5c3425065aaa00ad1b7126e3628a6cc244e5606d979a601a021f7f9cd29db5dff1357a1e2744bd396ed1b4875b68df08c30a24c8f65d23571472a623c7ac6a2b9e02320cfa611e9ea395d9441c0835103218c859a0bda310b70f3432bc362c9c10bb2f251941b4e49688189709953b6679458aa72c5832822a76547177bc883347ab2614bb81f5754b7ca8e04754e4a7ab76ffa5a9207b1f95219ad5247a93b28cf46adcb081ff9dc08e5400adc194e15c613d1833f3ed1ce4a2813c8750e5fa5998b0c0efb9ccc00e479c7ecbd85596da57c6c47f6c73553929701440e28bd0a639964d5c7f8a1ca8bc0b436b371f0fc3ada10aa7d048ebcf6c091470ac86b74dc4b14fe441fe6d6672fc1744f6b4f2f26c58d0b1b942c5530a20b9b988a96d104115a461b02771c144d82b36e0f788d13177a6caa3ef5b310ea110d0bdaa1a44b9a26bb8800279c168642aa719280414c32c7836c8894c8e701b06266c50a445bc36b87c0c4f6f2223000a36eb1891ccaa454bc51bd38b845d8a28ae761542ac8c15216e18ca4c52900c8531d1ff28692e848ba05be32593a810144bff265a69a08814415a72cc2cab5c7514a79d5457632c56f6efb4713daa1aee19366ec441d884eb621c098f8825a426aead2acb63a2db0c37bf3b79c08d919462c84a874c0cbdb8d50949e06da61ffcaab578723cacb59897542e23c3ed04832da786d1e4557b3c51cc9a967eca35d2c3848d9ca42918396efd780d3811f674260075b5403b945c3a9a1bee6c01a905c55b41c357018480937da60cae86984f28778f5987693acc992a9309887ba9b49024ab60d548583055c3782214deca8ac192b55004703180aa19fe08b873198ea480fd974a95816af3dd72bc9c54b51113b8a15b7227595a658176a80c4d5407f39e6236268b79a220513314f47f1cfc3a9ac3b5c0a6ab6af8c1b8e0ae554e0f79e63ca4e856823088113810545847ccbcf0669f3140a53b83f35d185735a2de68b9426a687f4cb73495c39bb8353e6536779dbb4d1c15af1d30b8ca751a5f25375315e41b120066b7e39a4b5e5f70143d85236332809d187004119f044cb92407e8ca4c211a7a0962107636ccd7e486be83398ddd368b5ca3265751a01525d6ab66c164641debb34f8794ccbd27975f89bef0c5bf41a321917ca72fc0ea5f1491b921be8b5be76190162a22f844c7e25ac14984b9f6f4c23417a4d6d6b53b37aa607eb092c945c3111bf9e3a19e0309e4c25513feb242795395e84a5a1850bcdcb12194678245c6e5ab48534f39db3aa9eac7c26a289fe0194196fcc65c3340cd94b7f10bc82158ab07f702e7b546b6c7cbee2c8e0f683d3e6f1cf89e9e06d977fb045e1cae9dbb568dea707961b5c805719d1a31d4f0b7fbfc1ea7aaf7b35495e5eff57b9286a2b814770c621e8d8b09408eccdcb18ac735c00 +ciphertext: ecad29e402099da49faa446258bcf3317548d93bfb61f019d5200356387f410a483733a44f2a9d1e157fd0e97949045d2a13d9e67c2b4047ecf2d0b1174de98c35e903687cdd48d216318b4f3d998ff7d3ea63675d3433d8541ea673ce3d97105f8e61d614e1b4b4178981fc60cc9ab780a6eeffab94bc85530bf3fdff9bbface393fe0517786479e4e8e59a91391f1ea648c5721bb409db352821ecfc3ad30cac979006a9bfff87eaf137d39b9896eb78559eeed7402dff1fbc34c3d3305b9fc29c7597e32a8eeed7857c31ac0c8ef470bedf60d2adbd1586bcd3e66063016da306e35c120608fc85a08cf43b4b455005dcf0e2f3ee43bc537738e70ee8c01fd1425cc9692de0a4ae1d2a93c2d0b89e46c9af94b3ef99f8ef7a62f8c1cc72c987b15b67956b9f4e18b3636d1fdec2f86125c0eeaa12be10305797cb7db0348cf13191cc5bfd271f6553a20bb81d4e4fa6310255b6f13cc37be8004652acf3c19101d7a5f494b995e5e304cd07c5e7b703ef7b394f006f48eeee0d9eb28ac43142806a29c06d0cc99271fa63de7be57e3d2b2ecef016dde89a700284fa8e87c7f60a7ec3ca59e828c07eaa68b45a0bb0ff73bc2dbdddc280be549b9583bb4efb15fd52830ecaeb9d9525f30bf05b86ddfb88d29d4d74fc002bb851ef2775570a1d81974172383aa8fae8c21cb0202693feeb4918804022dab0e602611f703afa0ce73c29a637b5e2b6798d2791ad68c37f068e57493d5faa9b74ab8134e1baf5d9c0d8c647ac0f63d39f301b0d200bb88cf6a734b7411aa12e05724d5abb98d9f3fe45e9c79526c8244de90c5b0809aacdd5a8ec88426eff2040bb01482eb5a2097b33dec0b37fd989a6301605c21310cfa7c0ff6c24d6dffa8e857f9b28736fad612f479a52d5e5219ded0b7b1ccae53c6770bfbd28bd65eceb72b75baf4d8d82d341f4bdcb0f6fc40cd6f282e4721f034ffb41fbc8cb8cf8107a35d4ed2060d65877c6de7357a609a4211805dab3e7288904abf010e0078fc305f793f8a79a2bc68fc8a1a366d70df1fc1902523825ad5845f8fbe159b83cdcae5466474f678d47a59da85674bd5fa7aff70ba769e8f0f6e7e2037d528f2428bef23047fd48020a70f59902d6272155176694662e8898a61e607dabee413e2a31ab632da000ce5ffe91ac22722dba24125042fbecd270b8ba9c20bd80ba8df9c946fe67baf2a91155c80c8f76a21d4cbea506998df788e7ee87fb395e56bc97d7eb8dea869ceab13339d1c4e528b323fc19e76e7fbf263137e36412c0e6ea3329e50f6a913b277685c44c9bfb3dac640c1272d66ddc85e6e046134ab4df5bb038a58143cfd81a3bda0de5c6e8b09b3995d6b67d931c5876bff2164aec1348f561c22fbfe6745efce20c3a2db89da0bff15ded262f061c170045a2b9ac86df8d59f2aadffe5ddd3c64f706b3d10e1682e32d062e5c98be70e7b5246fb64e2972deb6d606c3247d1a6805fd3a563da99a97b1c57dfcb4f0929a1959d82e18db9c3b584ed80a5ec04587d3727e9f282bb879da287d1b9ee87d72753028ee71a7e3cd5ef38ccdc38c1281ccc6e1223964183bb2d8f0b2420ef0db864e14d5cad81324839155b678ca9f48809552e91676adb1d7d7c030db9c1f1df39c6ccc8e01f67a49c52a0a6d283ae1efaa5c3b34da7e1b5478d67cf5eaf7df0da1b6da598fcb289fd828943760e11024fa76d33797cbd438697dc089e862643a5f781f0a81a3a2ba34cf10b67805e9b4bc58c1b675a0413dee14b2dfec729b6d2a6470d4bf1314594ab66bae5dfeab5f958f2a60b173c40960509032265a81c93edf9331e2b9c1472dc08d392a9d0cb177d3be2cbd4e007314504e72b2a50c89657422deb3644bae123f339753a144dd50fa8e4e1c301a1abf5f18270f4ffb61380c2af8206961606445ff9c4060dfae5769e969d1a927564023ae3ebd940f9748f5d2795355f3510859c0978f87c36926c974878b5c58f695f97dc0cf54e464c3e263134c23d31a1ac346dd9cf4271cad17f2be81011ba35d9f1593a979fd5fa04c3f90700c228026a2f3b88f5168305f99c7b152edb221254702d794171983228fb6d8e3da0cf58658c0bc4e7c08930eac7842d6db069958ffc8e1feb50f0d78b59fd049a8f8dbbc105ea35d2ed895671407fb38a2c3605bd778206861292337f097b57fdf8880243d7e0e +result: fail +shared_secret: + +# Ciphertext too long +private_key: b4e974f19338a8963d1fdb0acfbb3a4185b84ba266d7d2a2143c7f036207c85966776b6ba4188cee975500a9be2b908fd00bbed9cbb83b0b07ed85a08a926356eb8b693943a721512db29c2d6a8805849b6719727aa647b9b450d09c14281ca400cd4938cc90109b1df3546dc3485d2104485560583ff13f4297ca64ca5e469156e20052cc5b94f70133d9c48561d2ac1664644537cb5063b437e07522275b4a22c949904b53a23030864c0bf93032da0eb52b75beb78354d012925361cdf79d0731a7f3ea15972046e7a0ab6ba8464bf06773c69c5a2a2aa778366ef9731f5c0242392e45548392bc916371ca4dd40cf0b7866fb43931723454961240c5cd1ff98d14a964f7d8b1d3b979f0a6abbb1a871a3206927a02607273bdb9a86488a5164550f823b5b11c6305d44b57609de301284f291146e540cce672a02847dbbb03d8a0113d34875e3420d126a2da9458d2555649c8cef12410de77a184ec68c2bc1b6cc33acab227f65b17bee8b25bac8667c389651089e8688855f1487ccb8876b194c8695d3b63cfe1114093177a8ce2ce23303ba285caeb710e00925919a22fbfe96517e34cd0093cfb1c36831679f7dbcb8e07c38e1c55296c52350b30915135c4544a79f707f11b1eabc315331b4fbccc58528660c1a69353bc874329b74e1a2f70cc5e54c13853d801b20066ee11b17d07b79eeb6b885b2cba674ab03b973e14c220bb8e769159cf7311a616ae25821ac98b11db97755cf247e5ebcfeab1421f2cca39a06385742b2b90b48ae4af96260f9c0ca4b04092f5e7ceef280ab309176a3248e9ac01074bc7504b18b4fc92c6714bc71c794d12308a7a98d5108d5c6a3f4b086698197fa5a7ba8e7ccd86641608d8bf0954aba20a768b0351984556eb955e2b191c1e32603d7bc4f717902d26ca92f9549e611bccd7bb13ec25042b57b3121bfc401ffe7b0c36771537c25ea9dc7000a0532a399829180097c6519aeacbf10c3d197276521bba31b230d77480e2eb142f06698c385617e6af8d3636274c8686b957d8f68a1c1a6fd3bb4c32fb43dcc23b41e6006852ce6f323b046bce0ac0854242640d649b53d2141f66cfb0f2023f80556aaa380455a4a70a9a6750317379a831fa1433eacb544c962ae52584691bd9118e01a6430d1180d433562349bc4e4c10c49a61a751c138ca489da73a0e538c3b0657b183b578aaaa91930949f6561be9b609d261551a18a9748241da75f7598ed9c028ce85b8ac7996f7846cabac7d5ab2bc75b3b123a2a26df834db703afeacba977567ff761f920a92377737c678884698c96a4811bf4a8486ac0c4816515b90959ab5cb3a5bcf94e82a1bf7185414348e1821680623c001d09f037dcfb26cd8d3261e85618557bec59853eb5a1aed115832c76a52b18e65698c107634b9d590fb331c8ba01b59a10bb4940854c1c0bee8b8ce1033892a805e5a727240082f325780fa6227b3bf22d071c13322a202aec8c2822de5664f0873786323cc9527fa85034d877274f24ab9c2be2aa554565ba7447267a15a27f67b8b16a4cf42a914439a14b47cc724f59cb4d0c747914f2ff2a2100771199b13f3c027eb83b84c8c6b30188dca3633fc882ae890897393b1951442a3a040d62a48127c3de1f4593587c8d75848df55052b674bd89cc8f53104533907b30cb25185821856645b91501633281e565ca527ac13546c6f4402bc446a1369adcdb5997c45639d212233b33bbcaa617211556990ade1d17c83a25199b0ab72d54b8961b52b3455805b761d0517ec5cacd5118754185b11f42122394cff880f9c653723fb71f876bf5433add7348063a88dac705726501470a2671d996f85e995f500159e3a26d249688afb6e71c999aef1be4cc745b1f30b8f0c1a4dca15a6846a9376676c628d174270f43278c0602ec577426a86ce6d091ab4d795311573a347bc34a747d0532ee0656f3d539077327b5c4b72fb22caaee090e6c921748ba94b22318ae798755bb69cd8241f01caa68248f2f3848f30893d8ab004647129e58a36457d312b476258675b30a0a88a24e2116a8ccc0f5120cae8903021724d3b999e7022c607b50bdf6abf2e048ddcf55cf6e51eb0c34f65740a93d2afa8ab405e2c71a72b3460b393beb1349ea227eddb4f04b73efab969a0929dd5a298902b37d5ab6e989a19451c26e0b13f44409098d8af7ec4496f03c5d28003b72c5d8b421b37211c1c1a1b6c40bca49a376e6b436ef439c4b4143e59b88bba5a9d72a0c25583cc581430cb38f5a320d08251a6808684d53e77951937f6cac0492cc2b0598818ad7a9a835d520b2619b28ae1a26f727615d4483ec85c7fa03a108b80e776b0be5411c9da0744090c9075375183669a557b0e4b952c760f4646151002ccb44c7534f91f02c4910c6c7e2b19835135b906a4a731db0a7173c2085480c4fa86156c3dbabc5df86b97dc19014b66910ac77634a905e9c04c01699d153075c8a0544bd390ab2710988c829da01613eacfc265998ea4925b3a98a2ca1426790e6de625532a0e8c1a53938b56772ac7cb395083f757119442797196d8a53587ca7addb5a33857661873b8da530e01f20942281ef8721227c75bc9e69e1c85b5051b40b07cb345d7a642c0cfcecc17178130ecd02d1a52cd4ab66cad528f2ab693084060ec2027e3760bd9886b5f19a921f7b2513726b9740f41335a5da112a1b461faa84e8a7407caf8c1e588aae1bc6c3fd40df32346814c068aa219645818802aa0cb23074a8bb669f74b8dac5201b41aadbb09c640a078b539b7f841d8044dc6dbbe7e805bef5870e9587cf24230df21c11a9649c57c427fec4247cbad6f25418ef92d0cca5d0deb7007e1bba9f841cc613ba93721ece4ae26813fde24486d79ba19145fdeb20ea5297e98ab9774066808722dd2db98d101272fd56ff7d37606ec8902dc369d77b379b40392f16ff0245d05ab392ce3afc5352907bc5abcd150a1e456b3ab6013cc5d8dfb8f46fc891a814ebcc67ace51bfed4abf2cc926d382336527b420a2ba74da46e4b295a6abb4f45c070ab90c1b6bc1d9fa1354373e6a4b2927d38c3ffc9406bc91d23441d98a548bcbba84f515dc0b108ac9b407625ee9b2bd9d0436792a3c626b060d220d49b80137d17a0b68464152626e9b3a2bccc1ce887023b620950444f91809c165cf00d21bca4a81b1266d39419faca162f1a0b64a1bbbb83992d03c7f4853b5fea37a513376281c1aeb75a4d879a2088b4451941fef34100056a7a11056cb9a5125563341e7730c56940df06c71d3637d23436eb5cf6692c575202a06c25568f71de72a7321599239398da6bac6a94c324b757c6f4a61ce625ba49caf180b57f62735fd1b0c32f22e388cac5e534c111a148200847ca45c31b197460a9530494d0d882b4254cda8c69dff9787ae44790380197e6ab2eac79eba46444c88b0f20c5834ab6e7842b7cad070605ab14aa3472a93374cc7c26406500815bded77b79626b093fa759806a021c97789ab6c33aa0c69d36b85230640a37b73ab1d9584723b1c36485ba946a17d86588062e979b80b2eb815c941b480461a318538208237c579cc5cda21862fd9c47dbb6278d823b46c1bb107a12d2285cd4994a3c652a064a156142c3bd68f3d5855257407d7915fc06b499b7a24e9126c9aeb5b3001a1e7c97a68fb19f1a5b1502691baab04524726fd589e488b7c5f52ccca295650f223d5fc28a2f98118a1287020681927c92dd40226b00f39365c2a20a2919976b8289506d2a86998066f939965f20dc44810c998522b2064b3553a90b958208492bdea63442884b5f85d41369df6bccaa9081343140cea638fe4694e2a9b4acde985cba4c3b0c946aa539f69d77d19a9c060262ebf8a96c1079152478bbe387744eb7e78a7977066415746a2f352b123c07ace5a89fc13aca08134c671a768a5536a149c18e9262d8ac7bf4aad3d4255af01c2c376939c19c55093262fd15085b60237b0782b45c815376f50d38716542b26d5b2624a312d364ec64aa1c87127d0232d4c29677e2497ac3054f43024a1636b21f83943db2f4438a7abb54179f4b0261b8b9fb420e714a16deb58a421b198c1bf41d5754c1606f7b6a2a875a0e94aaa4cc7693235084ea407c661cc68a6379f8a3e9b80a0151c549927abb3083a36926d251171c1a5a28668af35d971e7006c02b30c40181300498a6cb15b0f78933d879668777d93972fe1e085be8b0e2c9a814776b22c172e178c21fe5655092203ead695f62981dafc14a4626c3cd520d3701cdb8a2dcc4b48f3c36a4b3b559db1acea4b9d0f05d97a766de74d15a7dbca71494f4f49305e227959262ad6d8f89f1b9d11470516578e5b301573e0dc81402d7096b3abb2f1a1ad2e678886d7bcf7a64ea8a598bef7c445bb1342674d2ef66a84e9190eb1ac4e31e50426f63cbb50e7 +ciphertext: 5884eb5cc60cab6397538a3832677576a02ebd67e2686be5cf6583c0730fac5df47d3b034027cdb7f4aea7647e6ac7171d29b2fc27fa5a4d94053a2db9434c198dbfad446de934d896c7dfec7708d41e38e779231316851503c1cf6889edd6d35835c4e160421185c723e0386d85d1539984dbb7afa64921b72f02e1c731fcf2a82fc48d9f9066dacb271ef8508709525ea059d6c78024a8ecc0a1c9c810abe28e432fd8166056b5a4aeafb90a843fbff0e5718f327f8a1f14e8136cc8265a0b9a9a29cbd4c81301de8a9dfe747e4baf9a4c178efc899276c792d639f6658bd612c9feb7bcc8d4a40456f32bd292bdb6b509a2bcf6b2c9e731a0cdaf30dd4a42c55c1c61ec202e450cfe8e209bd2248e8f9f7ede36efea06be06edd983f8d19a95c7676539bad8e1f846dcb4e533ef72b295fdbb7ded89962241fb435bf83d44309ea6df348ebfa1ae929ccb7499342bb30184ed1ee852ce39e21754ac574b429347235549da8b97515f40ea783442b8c3aac86a6834e68a3254ffb6e33274489dc64cc5dc2567edd9eb9ea97391df2d8a1a44d1f276bc3c9a71eca58c546f0e77849258f3a1d33271b61e48fbb54dc2faf23cd1eccf7d63855965a664472e3a74327115ad2b2ed135b4ef5fbfa03c57884530f8acdb5b8261a1697fda62228e2be9ea1acf7c8753c863bc9873915d2d56d87426bc4e78b9a0836d974a673866e966641a9b77c22ed4d81ed1a4401fabef27eeca2cc7f1dd7bbc97bdd8b5851f356a3965e1a5daa0e96845757c721b52b10cef4a9c911cc8a51910984e143f7ec3ff77aef6689578dee49b6f458f89e72eceac2088b6645b412c9a76b47ff56a8704e14cb8759ffcfcbd80d8bef0f8be911c1a4ac16453c15690b241147a571e45d6a722de01ca9c31afba801decde145f73c33174f9986a8872c96091d7f7da2006dba3503703c76a31c03a1aca0c0764ca66e2e43e97ed898b5f7388e9ee7dff99e647474ce6464db92c4f3380698bc59f5b6cc110b9f9820730cf64db4d0ac280d263e88916cd363dac278b9c5f6b24fd226e812df22b508a01d768c702ed4db92a34bef06d200a808450f77545a8884625572ed9fa6890557fe437409b92010ae76fe8eb4c38d4afab9997c2563c88a52c7b19be768e3242570877198fa5ed540292979e9fbc629b60f6dc2b787a03a4bfbf1eb3df31941e260bbb87ab36f39404a23c3886098ce7740e3a0edcd857f3ef146f346fcaeb0df8e5e031e21e7104e5e8f5f2c194b10a467cfb8d89bf0c030a674ea818a5a948ef20180e2b3ff003216cbd5aaa7790e15fedac7b44eff8b5bc563d5667ea0361b5710376ab72e18cd2483e5bc8bb17897e4c590f4cddd51a8507a8cf523a6ee43c030f6968275a46470c5369ab16bcd52e17c9460a5c4dc5e06df1472ab282d1f3fd80269b5efe0a9d8b026fad1e922e362ae236a06eb48a00e8f9c81524ddf4303abdd3f60f46a1450b00d0befd79220265b3be0360bf8607dd35026766471e28cc24b7b640e8feb5ef00fee900c283e99ccd1c896a081058149bbe006a5c0983d4697dc02ede35e2e96b4ab1daa73ce3ff58fcb72c86c42740d0cd7bc8ca97847b3d1b0b763f5a120637406af758964685acd7a3d1cc8c426c543298b88086a7d9b446e880d60d0391f23388d39ff5666fdba013946765054902e056999d2eeacb8e7d5768db45933da4d0ae60cbe95f93490959923b2c51b43d89191e248fbd8fe8ec16e570120489c3daa8a12f22ff8f3a28f22641a2b1fae0b68f4ac57960b9582d9b01bf7286d7fc34c90d9757784046981f6624b1fa195baa8bd45aa30f2fc60462edfd08176ee54ccfb19614af30176b9937b797bbe7d758ad77a8518cad8ffa230bf4f4c403f7bcc685c62c7c7e598bc9e3ffaff08bd7001ec65a8df4730b8f37bb72aecc34a64f0a845971ec19394a50f8a94eac8fe6e8e3b4dc567bf30ecff795d1c208d7f7911ec56d36a06e2753678b11f651f66f2a13553172e52af9b4680f0685f677b1f0b1b496fac146e98f3bdfbba6a7b2e979ef52d20f5efbccb5940b7435221be8b5b63b50e0c0b1e652f98ffe3de8e59d0a2169395c6b691ca1e7929beed5b4fb72d4eca1ec8f8fdafe95a44c2d2b93de569160c10c2269ee48191f8c31f698b471599a38cb405a54eba360f2c7d8c252565a9a4a4b33c5543df27a65cc924ddad2e72e642f184d5df441010ece20c32ec4 +result: fail +shared_secret: + +# Ciphertext too long +private_key: 91060e33058f75969b03139b38cc683711a605e0b3e33c691d3110f01017e9a5c6c0130ce23222dde1abd0f49ac304a97ab6ca97d8c2ff30a465eba4774206cd2308bcd41c4e545aeb764e6fb43607aa91511b1f104791f504aabab6133e41bda7e90b4565473a2b5c5fc04486a53f38a791cda4b7e110c60f8033717abe11eaa4d23b869295145e9225b94871d7264251a82b6ea1ae1e088b39e6bae703658f11c2e798153f9b706c4ba1521a5daeb7b7eab659af231275d89c4dd764c351be634967de3a1de168317cd347397cbf33e133e6b8152f096858b025c9602e8d353252705bd4a1c136d657616ab6862907006097ed1a4119c2372b20c850616d37b2107d48a1ce057aff508bfbe221b696cba24b76862322d0748e6f5b11e439996104b2147b7ba2d815802860984769fca816f82738926bbd04d6a22d393487563066b988b8d434edcc2eee674a02d8a6378123d100321f188efc4492f8c98ba91074d5e4902f9ba52332a7e893c88bb930480a53e513afa1404824c33359fc8abfcc3da689256bfca7a20cb7bf65815d378bad7779f07c55308a71ac4532ac300b5775484060736f673afdb64600d2ac410a259292bd2cb62a8ffa363ae4cd5c0903059b039df40377db51e3abad06cbb6f6598bc3835e9f5b1538e76276794ea951b65015a408c05453c51b4ad5954ca7bade2c2a84e5746f126998f214e884c09f47a5d79047ae830de2b25974c407cbfa0d7b5479b5b43fb5d6cbab5816b1c372e3f6204e3ccec6270f0ce945656c47e716baf9b66aff382a4a6529ef2b9250b90eef3c18da897493c898f27610a3d267fba5216d130f24139acc870c5e270274f920cdd820cd014457183d873308616671c69265086aca2603b7857c8caee45471841104baaa5517c70d637fc8b2719dd3c6dd641a96a401e3438e139494582b26bd67abe9e3752fab8db0a1abba747ed3f127d1b7b7b6792652337280d2c5e7969a0a89c6d1d9bd49f170d8fc09884923142058f7c2c616b14ce10cccc1c11cf7883bae26bda4435dc676bb8de48149b02a4121a384982a3c42253682c8df75728588694072be2a9c1532464a2daa78e201752c052806f63fc735b5cde09570a59560d1504c63836fc67e6c35576550687e98175f234cbab2413f87a7fc2c87bac0694aa43639f11933f55b8afcb137962fd4738efe5a6cb8ab8be97a44f4c0955093a53c64781b9233560384a1f584bbca2905d2cf3d21b4a509bfcd3c56b0e82f4bb82c9928287feb93a38171c9ca6fc090cff4881e2feb1da51019847a03c33946fc1b42859cba50c10a28bb1588b60ad858c6df621490767f6124bf07dc51cf064d1bd04e7b9ab101d1a24987cf55e8938765abe2e59f6ad392eb690f3ae15fd72b5caab78bdb04590861b63f7636b358aa0e5378a35b06adc2808b38af701491f15198f1684cc277a6ee259f626614c5840c68dc0a352316a0c80cafb268ab9769e48704b2a61c447b227e1486a1860785854827b575f779397229020e8c141c20424105142c0cc2610c8827b62f2937469217cb4ff9042ad81000159663c726d1d723fa73279da650b08cb88d4189c6b453d343c380a04f9c5169e5a87754f44a941bc56c3174c6d622d5ba3162a31603328cdeb39cf72b22869cc728c817b2037e1896910cb445ecc190e60418cc3b41a48c97925938a47b7b340348c970545ffa579a40995230a4d724bfdf989e44443120971ced72894f852d09a3517a24be3a3b18b8e002c12330b913bc91693f3275652905a02060b5772aa5b5dc439f377fcb898fca2753a94c902ca4a8808459fb18b9e067743263b1dd03204e184a2e9995efb0313542087905c48de819caf8a669dbab9fe89cc7e87b7ff52a7e340cae17b32db39faf44c230435b853c798535c6b93c99ff75579a573a8842833ba37d8b1774e59616b9c174b4a0703eebbab5098a45446a93034ba66088e7c4b75e17bcf3d2560f3843d3279752f6cf40b97f10eb0226d59227e55e78e31b12b31b2f897797270d0cb35147b815f8ab81d9f1a59b2334d4346fd507393aca6e6fe2a0bc24afdf07c622c929076b747f975f13c2b3509a78cdacca90ab957a2bcc8edbcc98d17cc550708375bb7d2995d9e99214dc92fc9364e0e5566f73487c2b6dff96632392a94191c5f17c803166a918488d4aaa301026a7beb797bf3077313975e9c3c37eec97666312d22b8444fc11ba042f26251bc8f92116e750f352c5eb440e0ee49e92690fa1c1a70e70b40b2044fc629d356a98353818dcd6b379176538e40d734b5f398375757888b1773693ebc10f0013b2f20fc61a0bef53b3b08c707e4849ae385240a9626e2652f3c0898bfc847b384a458a84bf99c147fb1f46443a64d149b671a65d8017ab259887e000a4273b380a9abe7413289b2a456516720c4df68c99e0d0a7aa756d715a7899471f83eb1c81558de2a3ba310889a5c0ccf898431ca753656c9625b14a61d7b8da5b120941364b5aa76cc9206754c91372a2ebd955b957755b008153c8c7ea851e08f6a36f9916e5dbc18dabced6f3aaf9cb99083065fdb561cb657ffab3301f6c19db974873f60093458b4db75f9bb442625c3653339281b8bc1224a98a05b7ec942a7d03b4523bb9677308da763c6152baa22786a057868cc2306da44e5c0cbea1347a5e261e206c6d95b6cac7bca61f95cd91ccae9513795fd31cf6a582cdeb6ad0282094988f48791923b6807528423c20219fa951f841cdabb30534579b6e7c38471105b64244f8e74a3d2174c25c0225a69068bc593aa3b5b3c758e6e699b05c3331ab452c9aaedf487414b414a42c1d32f1315ba1cede5148c2fb3bb52819e507913f92c4c73a2431b24f03931a622b7e1ea0a068cab2efb66ffa6ab5c560a9a4091b74284cfe1537687bbbec11ac5149918b143cbc4715132ab956e8bb05fa8639c346a12b796d970813e5cc14fb4e066c88a35105b5a63a12142549ba95fba613b1f51073e617787b55323752efbc4e58d25ff20c68f7cc178cd5cf2fe3bba34983218134f930281c00b2d7025178f661cbb0b403bbbb9ed477c6f7353a96b595e8c0221a443f3b1cb2eb1e9d01a281976cb65c462145b1198c31d8f8624857b1e0f441b5b7438a9ac3817b3a5e372b61ab1a9341148d42a9b3c59dfb3c8e4e6887bb1361de4b9824c78e579721bb2c8aa758204493c050ca6aa1d305a143150250b9e61201e207050da7aa8ce3cf2d3618b022527536a5a37833dffb395755bdd5043c06fb83d5935009189c6061b1c96a304bf3847c6c19591c918813312f41041566acef3884f9f6c2bdac25741584bd365131c08c92eb6578576db4623b77962d7af1cbdc8c4a52683497c7068d964f7563c2f883113e6c249d6436455a50e533a4403110801ba73c169c9a65cbdfc87962523f10bc4a1a241739c7772ab243a5175363c0635f16bc4057492a53149acb9c04a495422b0c66e4bbef8a90494b37db4a4e0937bd7b4a9e7a6b3cb6258ab58a38d1878b25777e80e019ad0305aa97c2af40b161c332fc0307384a9681f540ac3aa35fe4316c7b1486fa11a5f4699264a0eae75167595099072d2d9792003824e44295020a9f6e80665886a1ce446b20bb825c5cc139cabdbae4614cbc2a775ca2e91718b7e07ecf3a72c858af88758f1e12273d2bc6a1d50cac6bb37b1ca0ddd6af6938126224311fd9b9542a4abd6ccca224875cd1837464406332115390c7b02a4b54798020471483a5c5fca0974a58327bf839eacc2f421a58c41876d9a582b5ec57a3244d594c85e8e4a609cacced900aaea811419a3e948b0aadf0a543e63ec0a34854f56a70f37845ea1615486e069a960a17bfc163ad4573c954e65fa0d1cb4da8537d42b6f8839611a40a664a73e19913dcf21a815c10b599b8ca246e6ce98c6db61df7ab775c335002d7bcd395694f9a1c21527c52c40e18872cbc982ad8ab11e6610da1b107fc0c1c87cb4f3551817efcc2e99b8db8e722623b022e4b108a84b77d335debb3ca83327c3523354b8b0c8b439321a8b4feb4492ec749d1fc817789b928b27bf5e3c411860006cc656db027502cbcf519c7456256cefb1680532f1cd93e93396e9154b0e969c0045786d50ccfd323c1601585728c0c737ab5465a3dbbe1a30c0a9d9ee2182ef18bd9c07368b8a6b97697fd5188bf885931f1ac64532361e172797a60f9a4043a7a9d0c9ccdf1b348703a6dec5b073b08623568af8f998d3884190c549250538890daacb0163540d01bd8503c71b34c3a52137c5ba8ce661619241c730a8aa12832d3733aff6f7f2e3f6ba886b0366e3ffa438692da3064bb249ffd5c0a502b4db714b010725832b04f44889dd1689020f4f9053e8209c635bf85df27f82874001079cc74168084e8c4f9fd5d88d4bf1771a7a2941e7d291089980acda69eb101e4 +ciphertext: 229e98f084f616e19c5fc106984d25b29288b0fb9a8445dcdcb9161599c114487ee0cca0961575ace0ec2db778d7c113373e64bf2d942b907d51426689ae77f9d2fef05837b484e5f433cc3a6458323e07635f56a1c01d66fb7432fff24c5dcf48e46f288de946c96fc6fe7038599eaf15df2df17dcd38edf7f2898bbc4ed572a90c95b73e8131fb1f154232699fb1ce28275e77e72f6eef439691e4f845a68ea002b248160f3dd8c6935529a348e230e0bcb1f33d2992987c23e5aeb555296098cd759e031d370bac6c217f18c3b3f7580ef073fae428c7ff42098ae4b8388e1c130b6007b7ea0582b71c95a11b1e1684b48a59e0a7e6cf723e17eddbbfb36f4a1c4245fecd3cb480bf54586bc81b154e9525683ace2fc05b3364347ee749defa238862e96d8aa4444e18261183fc2713e132a36b4b8b79b1ae07050b1bc11bd67dd344230e41991927e1fc225868fc906f85332c48a43f0f5fadbc1c322da4c8a66efee530e8bebee43f14a4707c895955e584d3bcc460f357ffc08f7e72b1744009ee7c67180fbf7a27f9791ae2ab1436d82463d3cf63846630ca5fad6e1c169bfd970fd189b4cec3367ebffcf9195b1a940ca1b91d64b9e3c01ca3020a5610c7821cc5e6fdadbc6f522c72fa6882e89d96ffd68a939edd31a199c105f9305d14b34f16706a1a17cbf16a85426ed3f53cd7f09dcf8bb3d7732d40aec1c4e860139bb865cc91638e8f03cef55bf54c451650b7cd13fb15640011db203b601c80b562eed03186b5e23e31255853b1a40ec6fa40e17320cdfc874761a26ac6dcdee0eaabf71802973e707c7902be5bfd23cfc8614e667c595f00c6017aa3e4f77d7920f6f4e6e121fd8b80dcd76fe79df9ff53192de8674c53470d9e1d8d86e15e7449f65f462418ce6ca6024e310879467b856c98cd1302780da5e06fbbc6e8f4e0013f841a1f79f4d1baccf2ac1f1244f042c97c20892e802168f9dbca921bdf290a99ee11b05b80177be97d39810b25a3fc42d3008b4b5fe6a194301cbc1d6546dc358801f68eaba5af70defffa4306aa98be6c8827668e8e0483a108f9096aadeb07505338cda9a6e99ff15310516c4dc8b127ea38e88272c17504d47af6a7dc8a320f3031bf83a33636aafbadc630e69e521ccea754878e717ff011ad27148bd2ec0688cfff7daf2b2bcc96f571d03ab614948655fc0fcb0f177daa91ee78b04762df611811e64e34eecc62ff0a79c8c06c5d69d31ac1f7d51cd9992a6401a074469f1504cac944ebafd5cc777eb88d07a831c3fd0ff1b83f2396f62130ab49732e90423cecd9648912c9c9da8179d2858aeded411cb309465f3f25bb18895f9f04914f714a530628ba6aecbead4bd59527fe7d1d9d75b6ece79407a9282f76be9dcc981cdae7089d117159383abb4fe2551d1c4c6a060a22db9cc980bf7915d769a2502074b5b13b75c593f0551b0faa32cbc58732a6f62a7f79e4eb315a20002e8b16365aa3d984cf161c7e5f53342d5aa2285d7d3c8d0e7ed06476676226f93aa5da4607f38f68de9fd7b64112d19a3be49b70cf39d759908e13712c1f271a63fddf30a37fd034b4af2086487e21056e341f0408b60693d8994fcbbd236e8961ad28201cc870690b5028ec89560105a22734de95b4b9e363136f05a100ab594dd2738bf02dd8b879a2eb3a3fdf6f83bcd7bc7e62988c6134061944bb10abdaf3f2f053819be77b21074d67c1e7208750969a50b50f3eab2c474c6a65b26b7d64eb71d44b426c11c90fed7d28977262bdab2ff829bde4063034053d69d7996e0e4c3fac6b508e3168bdb40d55a92b8958004de843eb4e70feb4aeb0b68580af940edeccb091ba0199480ed346f07e855fd27ad3ef397ea42b2fc8a759342035f6259999d107e3d39ffe68a51fcaddb097b0f5ae1c679550eb0bfb5b731052377fa6089933ad50d4fc476d6395a94fa22ba54f81905ad8c6d90820e2759b4c1a073201785f18c84830bf915ad2381d0906b205dd12d5c91ad0e9710970a54fa4f2410115b2b127c179c8b35e3e9bb4075380e83a93012101da93b8c762404aacd9addfa3cf570ff7ab974fcd8d4e8d8baeab08cfedb2bee948f2e25fc8f1ab687e99a3f980ae0e6b5ef542dc2fd3facc3853afc01195d9eaca6efcf6917736cb33579206904f40ed2279725ff26a6a0b58403e1b3f44063f77b5fecf469b61b5e906769f39b3974fd2deb4b667c2ebf428385307ce5629eb1e +result: fail +shared_secret: + +# Ciphertext too long +private_key: f340a0afe4613b8341c58acb10ec6bf1f90c4b4b5fbe050370d715c73b7206825d73e898fef8425e91972efacdd90a63000acd77628b257b7e3aeb8d8dd44d235a5a6532a70130a51cd719648c2eaf9608606a7ed9eb87bd1c7cf6605fb2c024a3b24a77c12c4aa091bdb74ff107c07c01b6c4a72e2bb6838d7c8026995f63f6309b86a67462bce6b101b1c62a24706b17c8122e884fc084bf9d0c42b4fa87bd2bcafe56afa6171b2c537710d07b1d9662b1b81c82c9461b223537b3a8b4b203608a941978bf1ea6c951199a6f9c92c9b4693bac8dee632aa46b6122013e94e143d7e8b76fd871e558b80a0560dcfa77226aaeda825c79cc06f869654e8147ecfa5ab6540d1c986141d9682f7a3342ca16aea29e0b583cfcbb439c4312a5cbbaa213784c786f49487e61b811abc667c6a2229ab01bc0a63ff58942f330aedf9330e9bab2a5d08bedb22e94a4679e82a6fda0be63026ec33ba92927189d4546804651b09869c3891f534200f616317f2653e9c360c8ea754c9710d5c036824ab591363f6b716345ba269f704352e820545cb862368cf67211b96854df91374c52a95c4b23a8ab3fe992ae0cf58606710c03bac429a5c16262c7ab910a4da635c9678cdb7341be3c444d98a6c59716926131b2b4179a0a720f2c99d0dca2a7664fff7467b6423d5a2a0502996834fb878641c4bfbac902733cf65a19d4833b5796cfa673ab2b65a0e9243e70c04b72884a4f3c815272518d99c295e554d87a089cf83a5e423972fc1ec14b016f803ff3627152491a239b883da2c04bb3a4b0e817d5c3260e021de0b1c831678bae3447f7f6a540d7c756475e423b92f9a39d3134174f954a7e087593910fb40307702bceb9e127963c742243b5b61aaffd64cf561792da35c82e046a646405dffc8ba95078f0025c20158d7cb49ec73289b74190240857b906b94710bc4a4b8141f51fdf9893a8d166cd7c4bc0d487d7823f34f1bbd651b3c3559a523b6e35c894e879902c4b4f6e16283ff4307e1c6a18daba2a20b1e45c93cee02ba2ec34ba00766a408022b78e469734a7c68fee8cb284b34f622a997e3ace67731b057a8bfe0b4da989a2fdb44778d000cdbb4371ea1d1731860361754120504007211f385b5775a0648178ffe39347329bc9f841d1ea497031aa5e6c3a95a8565e986836b4c731a711adb86ddbf822dd0429f304c7a55c6a99f3319190cd3a5a50bbd050bdc0922be1757662066a056a91fb9edbb7c28c946e2c9b534d53134431c78f74046fd771e51c6043ec6bce51a3f21aa49a5b6355059935d8392c05cd0318a6fcd511651baf4966785391067d2948fc394ad4c56b701b65ad4901c29bc329a77556219a4336608c8c4d1bc0686fd95138082ead62aca3ba15e40302b24209cdb94bfef55c25f3a0b7e280b0eb169505005a39b3b9d33659e86bc0239f57e5a2e3b62f010782b6c0546817b47ea136842334b865479ae175bc55b101c1b3a804a758253f58c5a3268c4aa1e37d5917a5ba89ccf1a592e2720e43a7b92401cf1b006786d2ad65914e29b2949d08744f879e1df75b8c3138590202d2d01f16527a42f58138c47064912b9f703998ab4d8e0984918520c0345a858c2ca8313f48d95e147790c4c794ac6845ada9a6e4f4c48870089395520491bae25491e5a487fd317a8c64a7e2d63e70d3969d3a5fa6daaf999662b444cba11b594ff66ce7a9655aec35b854c9071369bb35429f705ef224a3b00a1ab2ca4fc043875a951afe7860e4e601f47cb4e6301f3f003621b729cec0a5fb070e7d382327e0b66e6a3dcaea3702395f474b6fe25a4b5b461b762089688a6344191f94b941506a95fbb26ac4a2ade4a3871ab92a14913eea4290bca5442ae994e0fb148325c02443be90baad3e239046b76c73eb872da77d6022773737863540bfe33a67af55100ef8693a08393bc44a0474ca5e956c92a4017729897c659e9d0b70ce3b86d2aa4f9e004403838895a7640a24654628c4576539f5990bc774cfa08b5b69672933213012e028be4396e2618393084374508b2cf217863c8bfb2c3dc3ac1ce6c6cbc8c89d6689ac2cdb314ec6605fa060abc0272a29076eea0fb22498547ba600c2acdc895a61f70266955efd272e0db94e3082404f4178dfd56e03705ec5bb1efebcacc0589ec97279a0b7b831e6949585208f3827136220c11c9712cb32b9249161e3312f95b55b246671966c2af7a4044b7bb9186e3482090fb818e71cc7a15ac8f664881a0abb9bf726d596432124ba84908d802b1ff4d769ccec3bff602cef2b6a38a649d3c997d6743866625368747fc689622e55970b079ee4ba2ebddb7df331856e3a49663a058b978ac7b865322587e51525400b624855153357aa61bc04cec356c3f26168c37dd0e80eeef92480f116bc82a8ea662090ec4244235f9692b3350b67f31ac4c33ba9b5b52a41f3a0206485978498a27179170b859402bad6721e06d77f3fc5408389ca4194198815b8aae06b6fc69381d219ba7c8db10898d8255503d0661a761a3622871a8456d386aded050413024b324aaf3dcc0fea223e3ef84ed4514841fb8d0aa41e232728212193778983a5d4c1b7a0767439b8eb8c899f3ca782a395a8a9054e0a864d37b03b556b75920fc0007c10b527f39a7180085ae5a02964f20ccabc38f139ba903c4c8110410e257f3390c645b69e1a0498ba363eb8c34a0a7aaf52b3384f5c61a03a39a8d4717d758dbde318c3c3212214380cea542eab46a4acb7bcc04d3710395d111b0ed53578d88044a52afb8040a4b049cf5c79d4a41254534bb81a2d6d3abe5b18bdc61504ba8c7e2e46c0f00aacbd3c0e8fda50c7f0321dd95377a59eba9926ddf347afc644841a7d45d48eff3729415ca1a012445c183105fbb7165c6182e11b65072ac825787b0442a0687eea885541bb4e14382600ab4ff1ccb7ac14cfa7ba596efc8733aa20c0202cda6383918690ffb657e7c5b05412abc7a7ad5190a0afe11b2dfbab36bbc0b8f05d32b32ac387116f545d36aa8f37022d2c228191193ea698329c26cca3667bd128cd7840a1358322a853c8549884d9a193416c9ebb328b064b1ecc2257f998982b4709f6e020c55c8aed36125d7acf1a94bb2f592f07812fce1509e1f408493339d1827f39b5041526c37fa996d6f2a8a67a1660b01ce70c48ccd814d7009f0cb8087824607f506cca143efec577a38572ea6262b11a966215add7c0be1cb058565475c02a62ceb6a9376b92d76b1051224dc1013b3291c6723c155489966ecc93674a06ced2ad8dd1cad5cc50b08264efb4946ce1028bd1b486d546c3249a1139643afaa2a5441bdf9b85290a0bc3f830822b8778879ae8197d1114be7610830efac9114632d09669eaecb1e8e82da35943894065196ab67083059cda9b545838f8556141e363a0d73bb52b8539a7c518a10887e5359bab741b59a64a441a0cd88b3c4655844244c54b2dc59535ba617f1c0b4eebec87786306adb790ce827368873233d7688ae15652b8669dc91e7d64174435b8199a0012596b8b1c022e39ac46d67978909c8b6145ade0390b80180989319886c6a3817be6fb3cec660e026096d0b3777e30b29269227f7891e2e99886b0269e0b20c562add0a664255bb0c684217b1998e6459d55b9c503e8ad9d932cf1fa1076c6a07fb17d61958e10b37d8d87632469cee72b88c3202a2b6769caf43b9dd5c37e34a87964a8dac425f2ba61edc12c20f81cddf3c3b1aca87fb08191f96199142a30505ac5d417c40aaaf3e72c38467f63a8432d352eb61c05c63b8501d289655401de848a6545543ae690a0b1a9b97c828da66eb16386ad0784f2989033fa82c6d130e753c5588a7928760fc2c675a01628f558455c157fc2d07cf9289264816221dc7a09f8b91efbcc85013980dc131c2166e446be7558abc4763d39c78d6ce64516dabc00e092c3a1364dea46211045f4ac734a400d47ccad611277f03842526194583ac5cca154e5c18d54911b5cb8590a8ab48d1a9248977fd70c92aaf32fb2dc92c5a44c8d34733c289b99492137e340e89c09100ab374b2840950501eb934eeb8460a017267c6b1b78755ba46a4bc28a74d870af60bb41700cdbf20266053c88ee686698c78f328242a8b22b08b9e15875e75a968a4e7b6f663c0a9750fa0a9067f55a0bdc52bcde14b227ac63ed1500f97125afa0dff88b7d727c1ebfa5472a61fba905362f1caf40677c9f72007468a3538541c08b67479b30354cf21d608c3292b25c9b3cd70466e6baedda28cf27c0711453b139302ac1a3ad4689929557601d5b95d7e188283b21bd5c465e99f5e47e6a9816b3b7099a10c1270eff15c8ed01837ac6f22b1c58ee59e4c7cbe02f3624a23d3993b09e234fbea9f31442ceb19fa2cc61d85b3883547ca863f3d7c4081ac6cd13109b30f5aa1ac8acef5c413 +ciphertext: 4f19d49369dfad406fd772df298efdee51bf15adf72d4e773d851ab7d07a06bf5856f5da77843f0c3db926ffb63edc0836b593b12d7b5f72b938fc363fe2021339d5f3b61dd866c9745ebf0596335c92b0d901993db87dd565690460e2ef74440327be7428d311d65532935b266a02416cb0a167405c7e69d247eecbb4b8cbe74f234e8bc721074a51e564c612bb66b0f95764d5b74a60bcca3ac7948d8a106c6d11b764dd789ec874f35ff161cf1c9fedd2d3181a05ee0883b624cde0eab9078728260f49b003164887f8e03110ad74fe97cf66248b1642ba2adb5214e6d8b34332ac09db6fafa0ba19a4a40056f9b469962b57f4513081258e14238e4a5f91742488fe7cd07b7edb6b4f46a31284a41b4f797845db1709f2db3ee4454c2af3fe39c23f56eb4701019a14cbacd6b387804a34008d0867275322a5c661e7d9f3b5f953189202c67b61b065212e4da00763d9a15fd3ede0f0063362df7b25bdb5ebe33f9230ccc3da073820524557cb3a917f3aa809ae4d22bc0f87166d83a141716f0a138793a045bb1f0119eea8efc3cc4baf565671c730d3d5faac9f7dd2abcde8046b10075df11f191c2a936fdfa1838d68e4f1f138b663652af452e1c8e2309ab6e001e41c85950073de84f7304edd09e435ae34317d451eb4396efdf09920fa9cd5725915f6220121c8c01c4b7abf41685b34d8f3a849936188efc4ed26b15a8124f39d200f513e1f78d647c0daae5dea9152bccfc10203b2c7f93cefa940bf6478cf29cc845074df56b21b50884d47f81aa6269cea1a7501c04686f920af4cd76ca1f74e6ad172ccb83e869b77b459abc21264b76b6c8f739d30834d0802f9bc208de6148c26af646a3dddedee27343b8273f91da8749ea596f4e810fab0a052e9d4046d57ab77e5db342098891d176ed7d90d6a6b9610aa849331543cfab461da067c3d16ebecdcff00405df086157139bf625ad663c3b86795c783e0f3fc791423fc7cb57cedffba416621f5f3ef9a1818498dc855b6fd4aeaf5ed6fb65d5a656df77b731721861e4b7d58708d3d5ddbb9165f12768b3159d466c24f76dd2330668fe6677c776fc3a3905aa8336fd23e0dc4b4428bed5aa48778ea544a3712b98cd6a0f400780e6acfdc0b17c74939c8a990ab23da5214964fd175fcbe7ee8e4117ec22ca78c18cbf127c229f34351928d786d174c1a1fb4386f4cef4739f7496839b9ea47a6f988282ea1038cc844fc01d1e84036c8acf1fe4b21441ffbacf2e12ea5421c841dc2f19e3e27f7cbaa9103502b1066b79be9e51be2cea2a11fe09d5b4b119374a9981efaacf5dceb8af1a59aada3e3f7b33ba07303dd666f7e07e374f61c802f4b5ae77ead6a52e08fe711a38915b4e74fedf5597892204142f9291cb2e14d19480cf630c59214b6ccbd556aa2766670556346e3e49f7e979042c26c560713c5b4aa393b37ff7d3cac9eb6f40a3ee188457447913de0e7021f7b6c9d2d3c279af2ced577a30b2de153ad3cb9e295c6fd614623b968a5569c7e7bc89199b69996d3809551e9d402e9745489bdbea7fa0cfc80690c73d6e81cdf859dd4acd1c43b848eceac521d59c4b46a507dbb18f38d35ca2cf808c3579918a28a485f7d2ca9d094e00ccc1491b57f05de6b9dad6d038246718cfc57bf317c3ccaa1bc46aff87a4cb007f52cfeeb037a72299e4b5d903a1c25c04e2dfa41838437779ca97516f5163e5d26a794ecf2ce09a316d24029011c50e914eca01e21885a574e6eadae590fa0be1543f5b6d467a54bf8d1d49f03fbf99b2b16d8118aaec1126f809100d9f487b36365975950ba0b5ab538f616eebc82c3e335c5450949a6bbe653b6447ed86712d6a47b81de3655b7188028e262f9566efd5d9707c2df0d83f44a84087973e64f0d488d6b2eaf988d704bbb3b4806eed4c654aa1f565e66797511a5f79cd15cf347ce77630632512b5eb04e7e76eadb4e2d537ea3824ba34aa8f137dda9219ccdabb4d91d5db685be41242612c92890cb0208dac075a874c65b1e9c4a50ba878a81c726348de4ae9f99fe4579ce8ab2cd0932665bbbf5208e804a47d9583b1ef6ecd9e424066fee1b43319ed97e60c5e2438ab924883cb6e3b79e9b7c5af7dfd5bf1a871daafcefedac2c9a028112b47300139f8caf35dbf46b0c5b4bda607441ab6df4cff7b1f67c4d46019d8cf44ce21e3f1e66abe0e4bd853394698de620530e29d182beddca821194529f7c7a +result: fail +shared_secret: + +# Ciphertext too long +private_key: 35a864584430e520c9098125fd91084af53a56a02f5f225e63a1ae59f601642257549449a211852ed83ee611c7e7306a36760d4908bc6d6524053503446357092439ef566eebb949ad83554a2c6621b9b8c1b07a02f666ea25986aab7d4da39e823b06f62ca9fac440445b0e89c93a88413cb7e6483ad731e649279a5647fd0c86bde189077a66841925eb37c0b1f068ea0b519e91514560b7f230b4d8b31053e3cd931ba6516caa21696313726c67fb34e6f1777431809f970595b0c811935310931a4efa7574fb79d0babaf213cbb732c1c0a6199d5086edc606eaba3065da1ed8e73aae413b5f29ac24825e5cd43538d63f0fec982031759723b7f988c498152f52d9b01bc7917db705bce6c1340240b94c7428acc517b73574c610bb5614cca582ee315ed8294074e1b21170447de03a38e09a95167c5a94307c527dbf3c5773ab105cccc2789047023195260c4a677217cf27ae8433cdb111865a019b1907c915ac041ed5b91a54c9a02597eb2b0466eb204a381e2fd3072c44467e6192a465acd7849d13ec72b769132bb78e7915a8015b5f2f4b5a8b64cbfffa133822bf1e670193eba854e7cc9115c259967545896862baa2491156d2ba5cf00b4bb7787ec54084d8ecbcacfb23292402110a7c24a58d65d06da152a443e545a7d56fe0cb53d0e6189bab948c22b5f02859de96c240bcad241020b73c45cef2638b69a9b1d2af758b059d9a9488873b9a91028a627fac9ca8078a54dd3152d4b96ab8cb29e6859881f959f6cb250ae390c8eb0870712ec0c98ad1e217a29ab6258c235914275fec07f8a74660f5a6f7080d8bea704f30330556b7d2c17ef917a99a18cea6686767733875b696a3e419f42a5996c1112c23ae72023ac2ba6c7e6250b8e4acad2505c9c902777726f4965e2a4bb685e7aa0d66353dbb7780da2178881643049272e94f52109ef0d211dd8b164d1053f6c15ec2939a3aa04ca1693117d94f2fdc011d943a0f10227fe46883c22b929cbf2ffc4f87e42445dc7d7e89592ce29084f2a8f8b3227bd765f6c2774a96890f6750680b8b93a967dcf42982ab46051721b1703c73a738e64044f400a2d53c57dda4359f093d953007329952f3327321d05a2ef445c3f57a29f437841bc2930a80c494c95bc2c3b27cac7055a1e93b5f70b515128636d532a82a6a8ec7a5b7249a80952a6577abc91f923434b503f8dbc0c15b7324c6ca5f60c1d69231dc8b8b608b8e5ad2470ecabeb5087ccb8151b00b242ec2140fec182676c0ee6c981e172f3638b501356db4fa9276788dfc7aa328763c2c1839213cc0335c92961972d0a908c4116034663585ec614f97cb45c3c336c07637f23ee1c44deb5b2ea20b9530c3308017ab38a9b1d4731600a4a26ce7074221a89ce33bbf32877623b2814b1532bbb1747020e5aa3b89c1bb977c5b837a8354f6156890a6e9cc8fd2aba9fd0a6db946ad0203b0e6da2f2b5031b2acb38fecab06833edf3c93102469893cc23c749447f6bb36b448c848561cb53d738a9956e74f4291b14a89537ef78f9b4cb7d85a6405147c660a2e5a92786c0b1575304e545c12be3220eafc423d384bea461b1263bebe4bbafcf08ee46c48a7812ac34a9dc3725c03a007a3f95ccc8157973b811f4714d3db5764881da6103c741b6d4b071b0836a93cd5c903847683007d67b9992f787d548c5ae9297c30908661995afa053438447313c081fa5517aeb4647dc46e9dd70e118c97606ac3f5a760dd742cb9f50dd0d17c03089ddc0b421444c17381bd2292bbff1c936bb03040d0b94650846b4541efc695598bcbcfa30b2a6cc81fda3fbcaa19340b4639291c1a60a22ce1cb0aa514e0ec7a0da23249644059c742837641689c703763379074a9a6fa60ed2c6cca9870020514d695c89ee5a30166a6fe19907ce39d5331c675062c4d166800cd8696c7418975462e689573046805a628ef833a4050b93dc3bbdc85430130680fe53770a590874ab18a98919ecc850ccc97d96b931d45b4619a00188cbcb4035031842b810c51be270f514c20be6c6328010af5f82eb4ba8aab652a05132807b298343319352805043aa190f61c0bc59afcf5ca5752b95961b3a46a1f15b38b25277d01463d16c850915c6f40f004d8389d26035d84f36ac0824cacc911566687cf1c8275b6a0fe7372811a7ccd1484edf8c298fa95a42663eff70e2b54bee412337b13257425130b73ac4d306c4d8076d8a1019cb56e4b390ab5a7939b885ed16cbb0f94171b7aa4b4986a0bb47045f163f1635ecc6a255af46e03058ce2db308bd705e0f84551e839e938490522351c9b904e76c4c632bd0581312ef1c1fc44a35c345a55fbce416bcbc0655d15e66eef3418883a490fd922c5192dde070cb101253de20fb73151ba007ee1876e9f9b249772b021e53eede94462a59c61ea633f262fe32a222a36c8103826b7127187386ba6604074030c10a0861fe7c7a674a04752aaa1505c04c27514a2a06811707796a8a116c651757404d54a3c78b0376533a12c0c1647b5c9b3735331cb1ee13c716bc2b911b86a3ca5211124c2bb0a8c4c8ca3867493670490208fc3e90860b350b8c029f99849b608269d058538985f7e40928f4287f6d18d1e42acd4a9541a4511154c5c6d274bd387877142c3f0e33182ba6df5621a7d373656a3484913bf0ba07a8c570055483233e189d743c2edd3473fbc1ecce17f97f102c97a4d26e270f18b30b6fcc9b925032383291a1a2e5ed0185af22cc3696b5c2231eceb6e553b7d4bb16e7543c8e2520350a430610913574227db246393bc0b87c98ec9795a0cbbb3d9e876e2441560161d0931c57333a644376aaf3c2c3b07844c919dd678a8ce08bea680073870aec47ca05f534a11bbabd3458b15634306107eb0551f25f78f068cc7146005bca9a5c5d28cf38b263eb37eea506c4968b635254a34947dfb444bf6c970f6414f0d14b4df3c0118578ec205737d550e9f5b1ec6d1ba6a2517e41692e00c97a9a83aebf10f0584749ae4ca5bf467637075530b51e8c7807223c82b9488a08c1986c7b5cd659de882ca70b99b5545c5d6a439430bb459d48dc82cb88c98596e6a4d0aba8788c9b91a6c17e6d4b561a8909bb91136b94c598aa18f068d80e96a1ee1af1f7018572a4cc8b2a8cd3a2d2b1a9b3155ad4d7b2979d800a6f64044e86fd0f77d24daa9982706df0b71c1f5a7ae8749195961c5a457602a79a2499e1b97bf13200ead439b009bbd19713a5ef674fea65200548d1df487a728ca21db3911d76cc9e30e69f09280285244bc5a4166cd537943f8587b181175e2118034d5bd984b35c4e828efc82f2af2c82aa0898787924ff34fc4718a9aa9284bfc9912b57277c956a2c44262e7069d2a7472b49d7879cd1c0c35b643bbe1d52226190e45180c44686af51a88caf7484f02812c45aaa6bc9203c19bd09462445968df8236d300191b651ba72715eea97e1d91a11a681a0fe19e9f24c62b65679d96392d960e2ee3c71658a133e9405cc9c884420de294acd0b8ca6d7bb14b892b0ce4257589a003202154a400533bb848dca299f4a670509047a886d390351ef32952a7779c833057b0049aa0b9dbc8cb9e657c3a42cf48bb92dad276343113a1161b154292967596de6886e0a0766869376a721ded479778e281cd281b268222c0d10472c5b710335d21300c27e1ce61c0b114702a9193c44337128e213f38eb9144b4159ee737335ba2c74849c49a6f4de929ffdabfd9db16196a0b81cc85dbfa0683705924e04f7194c5915a605ff26a700cba2161ac1720a6cef8333af2adb78c8a57f5be2ae41846b3b123bb74d9ca6aaf8a023be38df17cc530bb429dba718f41aafd771f2e15c102f31bd4e713be7bcc8a0b34d3b151a1340698b8331776b2207a4a7868264c8244d08893b7ac04288a04189502ac06095dfa2b6d245c6fc5493a0463d99956b9cac9b9da828a467e4bc17bfd348cf26144142a8e6513b8b032ce81e23b5b5b5a855192eb1342b68a4316899fa7e0947f46aea611ad35966faa5a914e3b5f1da5514dc258bfa8025e79a524fc831c17018ae043a74603f8bb64f31512bd120a2879c713489d12b2aebb4283312966e27780eb091df2e4220187977fe54c2086403d059bc2b1a90a5235dd1374b564816d621a79b8bc2e39bd792b5032e36100e46e610795a845665f119ca1cc82c1b52203564b30701e598a4518f3295ed66ba7718998c41e76987e856cc5e310ce7f89a1b5e8b06464ce4658291eb0838b3a0127f054533cc75385b4de0c0f82d76221c69b7ac687f67b75d9a56f21e8a9ed756e5b3532f16b1e26f65550bd0502d3fd313cb9ddc6df4b783980fe3f5d09622c2f2040e4dccde4f1bd0417926fe92ec3bce95e68215520dd1f969ef07cc420b6164d801e28d6c5705a895afc84a00ebe074cb5b7b3895ae6 +ciphertext: 20369b4c45829dfa00e7750ce14d559660419d37b57d0ac1537e0a3950758f218fff19145047d46c07d9b03172d5c70dc0549bb5fe731c5a70e45ff742de183fcda935e9cf42e75dccdeebdbfb8e7636dafdd70d3184b29e8f779cfd00eaee9a1a5b9cba50c37576baf2b8038a99d53b9b4e74e7ee60cbea2198332b35e8812dde7482568022e4050565f8fc44dff7987c76d232fafc209ceaecb6fcd9f94c886196f8a17a6fb2f0b781371c83db71ee482d41e04dff1666139f8c4cb5c5f5dc9ae3a4991bc906649bd11d0bbb02ccf54098819f39e443f6de68de935eb8168c903eaf6424ebdfa531f2210ee4497a245657c96391a91278733e3ad1d055c6272bc4239998d9db21b3935e152bf01e5f9208df66280aa68ac1ec19bf21a602f229fa1a3550dc79a09b7d3069cba34b8b6116a56c897fc2ba95579070c80908292c9053c7b8bb17207b59972da9dcbc967aa10c95f64ef2321826a6cfa691a429bfeccd299bb3f3cb27de9808c55cd150ee5ffd31231c894f25b737b568c0c08e4f5ba9f3f27c59bf5b9c6161229ad5a659449a3e563133df544ef788706fa97213697eded9fb037ab4567abe600ef9e0ef1b966b033e85f76cd0c31be0a4c427fbba320f3534c79d8be66a0206c588d387f0f6f5a68f9096e5fdb990e833911f1a69be4dad021f1c427912a862086ad3fc27c4018bf714b038d1c63775375b7a0d82e73a795f12485f65d294a64d98c6f06e9de2187b056896c60fe1dc72ad78e871e094b48cf5c90eddc51ae7847ed87da43ee3283afa88b1cdfa36b905ac7379b8dffdfd1dad32120e998e562a203fa2a5d5d22e88e4c5e72a57354dbe8b6ac19ef044ffce9cf84b3d19a434928316355027d987102dcdda032885b0304bb7f371ae9014e771c5eac0237fecd6fc6ed523ab2dd589739a7e8f8e11f46e23ef99504e17373bca6d9a225b321c597ebf43a4fcb0203b2a90d85deaa5932fe2d34ca60ecb74a07a566fea8962f37c3b7db7dcab47bf56c0332a3ec520348a2dab314d127e3b225b31bdf5b00ee18ccb5532382b37a6f0f34a8da5b0463ff31ff930fb5707bbd923767829799ab9eb0ab594e0ed5046975a1163a42ea665180eac3c6698e62cabe5290a517b37d47bca31fbc4c9fe19a73a31f8f07b0af953956149024c598b638d07220abee3b1f7658145ec8a5f376b8e5f433a84055a5a752ba47b8fb1572091933975d825518e116b1b5cffd3745e0c9c25864e7bdff744b3def4619a92ead4151ac2dcf589a9107862c79287c335efc4dd1634d2ba89dda9451fea471ca9947168039b7d41d127d69da615f1695f269ef43e1f36421d6871c28d1ae97be689137f202d6b65d7a1ca4d6e2fed802b9a9530f11b4596d42f6b442c454b2704c2a82f7f21ef4b89ae06f6d94e0db0b268fd0217d8c51e9e0129399ac8e6c2f4b2a8ef60d6b7c21d201a143fed50eef6f7f00f64853fca8569b368350fe4fbc71d2f094f52f274de8eaf0da07855fe78127134740d3fa80c479a92d4e47af37d2a9c4509629d9f9e69b0c3aee1a044bb6a19e98aca8c5c8f91d2615ad3c198e793be0d1307be4ee04652a2a7056888f473893d33a710726045761db8a72bf814f0dcfd7a53bf46b6bc73e45d5e1617c85a3a04dffdbb0bd873638f429a33f53128566f6b667c9ff6d2d5a78a43789294e9d0b363f3b535c0348fe584fedcb9a9709f02a46518b0fd0538b58f7db4f7d29dc2a35814583537dc37e2a453880f6e2d446d1932011be16734f1aec5e2d6f312c7ae5c3e3082fb754918de18099162f88acabb95a5656a9e64799ae548a78e8087d9fdb6e4001004dfec9f6f2db9140841059254ce5da8fef1ab9a34040127e37196c8719004571cfd8c1af574c69eb57fc566cdb12cff50313f86b1879f7a19510a84e0740f8efc4ce1940d6df83e584b90c73915f43f4c3d383e191e2d47d4335712de3e405dba8e9e4c270a69a5226875a6c8a62e00790e5aad63d1d95a2e42dd3c29e75dc9a8f660ecf6113a50750258bf6fb96f7e93bdeb0dae7e8fdf54214c6e434fc9da517761c41dd360d27964b317d27743df07fcc3fad1064959a1e475e246beebb431243b86e019088f42a4d51dca9f82d6e2b39dba4d2b92b5733088ed43d69f5fc31fff3af196cfe58cc63243d0177174dc6d963c085833b9d77d7b8e546d9906a42655735a5e +result: fail +shared_secret: + +# Ciphertext too long +private_key: 2d1c97a7140f3cec635243b0c7f81fabe71d5e014350193eecd26e8f70169e80473337667fa91544346de422a6b132bb7e9871aa729540771e6a48ab5feb1b1c60b65f05296f1070aa059697e29371d3bb97a3c2abeab996f670f7660b5bd32bd28310d09062ca963f09ac5320266565a3b2065a5a027c7686b5bb6e682e98ab737decabe1d36353d08588b8c51f51c9945653a9b768f4d9390e9cb3ad9183baf334dbe7a8d3d137ec4cbff30b5e59b894d04283b33071e59a1b514779f502abf92814ce2044f21ab535e08720f39c1193871c024ff46897a48562a5ca32f7c01dcad51cd946716c788012ac889a9c6f28419ef7a9408553a733933a9a9ca81ebb9817f8ced3c30aca058e4a7c9755d9680cd852a13521eeeb441c83333e625869802be6d19134a4be4ab14adf270b2484a3d6603cc574b4402ac0639971f6a949112298c05728ddd60a62cb9bd40855de611b7df7776ac9182870b57b28934f3969c40006282a5c042b0fbb640d8fa093a3a09833f52b01e4cf3c2bc0138ac9428b6b0578a901f9a623f4c799a881a54a7c02c448496600cf0b2903953882a77c47147fc78c2046e970c592ba5b50a94113149377ad3a1188959c8192d2bfa5767b4ccb3fec47182090b058770ef15877cca7206c9b0dc1232d28e005404a29d473002db16dbb17485ca14818686734014103990306e9643d7b769a9bbbf5c3816cb0b0a8d644b0dc37090cbc0d9c74bcab8dfc536cbab3bf485a12535383ff9cc7108bc3976414c5660b402864e6423070717fd70c8dc9912c7799a99226c75bfca0f3f2c279342bf881b8f30131f9977f21650b584711cec22dc30b15d6ab15684c54f854304982ad929332959a11b15ba237698b55f1c5b6bcc40ee050700479d87b395dfb60e56c9f107598fde64330d1c29e962506465602f816685254a5e4197ba89690253314b33ed2b41744d7220bb825ab5613fd0c44763bbeb2e55cac9cad21f901a113a730144abae646f378ab031119627198bb108e61f40eee268c67ea71dea7c4f578575ecb4eb971957a497f1e465fe1534a3788cfc0b60bf541763ac2a2e364a1a3f87a1315028d51c663148259115b7f544c6fc71420833f8a6c9ba1f874515a50118c3ccbd239bad169ad267179207e15a1330cb28569473544f764a81565bff99b6247101b5c7465eb4f69c3240ae7a6c4404e67516ee4174d84f49e278c36f9f268a87964e4ba837c078912f59d04e6565a23c85ff901136397e8ac3ac5e23f4dfc1f395a85bca9378e382c93307fa119359e086b1f2124db4bc3e66904c62939d1a67e9e8334d1f611446438194351a195856c9b4a84671dde306b06f5a9b1d17b2ac8277d77c916c101e4b80e00eb1d7a4114e9d02b92e56edb018b681526fd0126e0d604ea6c091a1b20d4ec201d177a48dc12737b5b1395c275b4319e0345121a96b6c26a94a8c038868cdab684bc270e9b886d70b30ba0415a9a091473161f88a2ab150a057c597928857830164c3c260dd2d318af968ea42c89e9f7083415be01f76368d623e24740e1cb5195e508b0f928401b5b85081f66d2660e8325c8f8b17e50417646c0b69c1cd2da4dcb464b759b2bbea16bfbf0809e8b21f795676f272f9dc747a65853dd56a7589260dc6c69fe12b4ff83739ff85de5f263b285520770021a254c4e9781a13851a47243f398b522c51e108250946a3a8b47820b36af316560b8ec42b4101b2e60c367c69956ba5e4b31ba8e3c93dce7c01014908e57c4d5d2113709069bfc80de593fdea8c13102b105030915f7c698047142dc437e9378555569d274647c630f74109b07e57ebe08a4a891be36017df76969ef371ec6218e39370f358a2ac1275083d07c5df10b95aaa06f8411e432538cf660f4ccbc3d6328000733e6c60571f979062b421684c0327647ed361c552a365087a931f2ad1082262cb255a2f33e101368cb6b1ef2d3284899a1b41c56bea56c73b6add13c0c6ae6300008cfee9c98f7491034d88f7ad40e54db92f9b7868d7243ee33517fe37904b71ae9696882792d67b91f74c4cd66d5104e722614655dce1c7df7c0b2f8b47ed9462d7cca4398578b38e7883767a306878d74f291ab8175494b0917ba92bf438901b39892b91324787c82a88feb031c4b2bc276588ab7255967a3b34e1bb80c16a97c2b36bf7215936867571b7ed2f92ff4f313aa376dfa766ee08383dbc047604cc564d016cf956e2fc7360178a05a8212fc2b9c792a80ebc426aae828b95b306e13776a79a8bf403c11b62ff10a1c0a51469560898640b99fe578d9f259d82a273ffa789f694a075b5f3684817ce0bacd62649463a135b40b0ffaa07178710af61f053c50eef240a5b955297b946621c7abd472111c1e61808a00c071da27cb56473cf9036e8f3c790b4c0c023306ee40075341549fe4a298e59c1587aebfe6c06796b520b645b532c625b4b865f8711a4839e87a68bce984fc352c75a60528cc8a82b440f328c771e789f2ca9cc6944b2f501950db1b6ab19cacf5adaf91b0206bab98cbad635c31cb1c1b6f570ad14c3908275e227747a1d84a01fb1faa775870a0b561f8abdb0823ea449f69b218d2969f74934a73983bfa4852537262b1d4a71de30597bc08799a7f6caa94a5cc2d8f1223cce3982393909d599284c44f41378df02652c23767a0a33ecc0ac09d527a3e6b35b5427a0bc66d5924b97232aa64dc8ee18c62f6e0b8601626d759b45415ba43a9bde0d83e09269fc4f07814ea7c4d4359b1193af2c90bee7b9ae4157b5a3962b0821b2df8c569113fe7a4913a4c6b121921438c9fb922ca8443a638579addd927b5c3562d1200b57b8ad5255d3634c0b5a78d5dab02b7e6cee2937c46d492c458abf3842c16246bbea5c66d3c25b1dc0c68b64e3ed762c92c42746b7e16b726ac879ac6a98ce825c99bb0bcdb658a0539b89ec2b53c15c765e84864711b79c495276564d98b76c0360ec0349731faca0773a9484a16b9f615ef20b44d5a5e7975cfaf4a8ff5361289383c39e944e8da31d3445d41e6bb97724f7c6b159a6ac8be151dbc4800645abb2be0936417c5d2327f64c76fd08293a3c6442514102f3663eba4097e7127dc39437a43cedd45a27f98b016489ee6b903d22b3a75e503d525ae0ea71ea33737bcfb109a7b0c9b817208a1cf92c14d956a7e424515bb6551044a54aceb9d27f6c37500b6c62c939eb96f84f98f50b33a69f9861b9255f352021596a53d8609c1440e02196d05f83b1de359b98693de7b4cc92301f8b88f01eb7bab8b486994a0f3583a29d0198bb64c2d39b986532c6101705d91374c576f95e6041d39657c9c459126aec83209691c092b403fcf371a3c324e80d650d2d932f36c7528080c32406121ba5f965528e0cc2236a39a6587548a150f49186d4c7c3ae32881b2647f09a06da6185d28f2b84ab3a9b1e26def276548f29b62192325a8147f42644345819f79c57e8ab4f3656ad38340c34593ac99072b5b173d86c089cc5781959905d65443f378c4d231b2389eb8baa9884c3dc8437abbb2b1cd097fc114272bdb21f37133ccc79a2c243328ea2fe208cc5f459bc0f2281ca656e72babb6b3599f83a97151056cac8570c8aa04d58b8e175e7c785786cbc404784e6d3419e0119deca16a4b9901f7d46342dba69d0375cbb68919f7110e374ba13641f27b88c6daa3059a9f29e139387a06828ba5025033c99780764a10ecd9bdc02258aa7b8e15a62004d48c575424cc879419368c87886587c676056619aebb497bba4f8406531e312d20773a3170a0b5b4b6d3b6ce9ac9704ce824dcb664ee586b69a57856c43a8a8825e5ea717912c2b143b91aec0507c448982089d5fb9407656e04eb82cd952aaf917b2478c09c236daceabca276a49c462e78a9c50645951df845c9d01cd863a78a870d74a535f6b6501932530ae635447bbd386c9802011ecc38611f802741c91dec976dee73b68df3c5717ba1f913b0f2d65dda20936044c3ba661ebda64795dc791e9a2741c8b4663c42725c19947866fb20139e84ac2d051aa8d788345607bda09ab76399ee0c7be24387dda0a2a3f07d78a0a8341202625ca593451bdfe4a1d81a141bb14e2eaca61c9066267b6acad89661fc88f934545065a14524c27f19598c64abd6dc5d0340912755ca92ba3414e88a7e066e64a27615973cc1534d141636e3d8c6eba63ef18752194b5ae093b90f3cba411c07bb523097703eade213f41a3699b908b44b82416539e724a4e07b9aeda3595fc97f4448706f3076e5d6ca49cb82f048311812928ab0adfcf8cfa700e58ca1e1855ecc8363c49a2d105d321f481e41766614d86ecb74cde0a0f78a6b5a2d90bfad6d4b8e7219dc388f7cd713c31c23f99147d08bd7889576b74dcc18080711a4b39cf52e72c617eacd918c35618d87fb5fb9c949d85a58 +ciphertext: 2d18c331c8e5598a431870f7b0457c77e3b7f636636704689fcef6a9c71a7af0dedec8cfc52fd3f7083e05bfe8d4517e3585ca6c65d13d0e0cf64d264a90ae40b517751573da6a795cdbda29f60401623439fc08bb9dd83d960dabc19b260855e86057b0962af41446ff0d6d782e04b87f7a69a40274c960e0a42df11ee44d0c62e06cdac3973c4d37b5b9684091a67a09eb6ced8ce18bcf6e7a38001026ae245b11942732c6847738b1ccec96f565890f27f9bc5db44fcc55051502017c55777bc4f136853491fd7925db4a657fdb4120f38aecf7f0b05e016246af5e0c7d03af434421bd2b29f66d400de67f13ae7cb5eeb31971184c40c67a25ce3e987a401f45727cab7c555a4c780c934861ec3715a328c59def0966a23ac95f2ad3970028fac06649019a30d46367d8db351888dbeb99c45abaaadf5a97cf605efe18b1c8407112dcd8535f66822c34034a3f63ab96248d3fda9ac13baa1fd5d4f99813f18e6e7fd088b2dc6aa3c781b3694b688e41f98d71991504e3a8984e189b17e7078aa0f22fe2eab068372c2a177814d86be892cd594df4c0cc29e13dee4a6e80154db854fc49c8a623ad685c3102d81ddfb706d20bed8b348916bd06caff1765ad203faa38c434f148b6fc16c05610fa50ab7b44dde4d297c9e05b6b4414f34496833b70e0f7326be868050b22e97d16a67ade6a811e0066c39484069d46fcafead50dc618b3795246ec17f0d84685a04bd5d314c4d18c6aea37cfb4f8c0b8529857056c9c3695f0e4cbbdb3a63355808a0ca78d956f095a8a0fb118d282bc6a5d8db77ffe6ab17ab174f9b3b7139207856c5c00e65ceead1ae910e890a9fc82c9d3da9924a3d7b135c81f1e46f90224c94100fc09f02cb5f32b71e5843527adb80273916aaa1d9c6c239b3b651965e0641e6ad4b82b9bbd63ad0b5932e8ffab0772879a789b50bf9a28af9e2dbeac11d959f7ac38b801ea550d9d8ddd3ef65036be35e57b64bdd4a39a09bb836056c2219974b9974d0c3d1a1d7e511333511f326280e3b55b47fac7221553fae83e5611212b06ece0d9bdc4f4a7b5e3c3a391117c09fe6377d58ac598d226af52d24127a0ce957536f5c622b84e7c2f43f4b10efc946be52d8190f30bc5b739d670d082e22982a39ff1f3ecbba585f7932999c5a45a66637dd963dc1601cf269e3aefc21e5b0f0ede12eb7568c1ec16992476dc92635b3a637048063d2c50a08cd692be18b3546324f325b35b7a039785431fe563e969b0234933d6ffc8fc29c8082ba8b0dbd68a4320b841dfc9cf4d8cfd631086abbc76315854864bb717edf10671e9f84119b6e3e4a43a5594723eb4f721f890291bcaa22ceaaf621491cc853373079ae4d1ac78e5b9258eeafeac60029cd8696af3e62134dbccb8b2dfc3071ccf0741a5a09db25aea2b13719515822180eef347f69b3983ea07cf4aabb1de3a4fa0a5069fd4f5998046af69c726aa25c7e3aee3475690783fbe353bcdfbbee17e645ddf1c678a5644a9eca5b6606969cf72159a0875727cad6c0051c1ef5f6df8a379989f736712d14e4e045b1639fefc5d815e573ee8e99965040ef85bfc34ab50c2bae38e04fdc74bccf25059a0b63bf270ebf1503e96bbc1125d6aa233576162392074e86f2307aa1f3582f104415d08b2359ee6c6e4507a9b64bb11a895ad14b9e81636ba62305b3ef568bf717ecafb030ca7f85b2b0c48d6dc4a0af177b7c7afeba45564533467f767d017aefb2cb96057abe53ab69db61b97202aca86af2e1dda83fb7227bbc3d183f7f5c2222bec32faeda904b437037273aeee936918d8eda40022da624c1237b89fbffb2b1f67a64c37d5e25d06dc401c3bbc61d0a2b25e863129d7e433e002d5d06936cd65f74b847f9e9130731c1a706922d8700b96fda457db36d369deb6472e5344a863f072e7ba727da3269a0e4a7d6c5dc635ec5617dd3bafa0886ce4574fc6defc8db9cc47de36d49e7f676aab98fa222aaaae53eb9db6a92b70fbda8a973107b664b168557272d00cb8348cf4293f3716245ffa74aa97a04582626d50e2617d003e41a22e80573085c648157527c74aaacefa522af1ca609949ed309a5db82ccf062accf05edddb59149b453115be32265bed2f6cf5beab3f91198c604e6eda4d9c2d99b2d4222567599c45746c861c818adc2788b11d9893e7539f60aef2bf41624c1ab62e07103f0f9eac6b62336af81312e81a +result: fail +shared_secret: + +# Ciphertext too long +private_key: ca1a38b3b2827fc21b87409be70093f2bc967b656073bc40a1dac7f4fa8178c2a4b7a53a07b381cdfc63e4a66b9077405c00356fda5d44144eb917040af52fd461501638b915669632e40e86e664ca4711dcc72326aa305c90b1037157e67ca0e4410d771ca1dbc560ee39cb5c8a26f58bb69e1479ae7c3d018a1829d3c1f91824233b5b1efb37f3c016b19605707849c9d80f24634646f317fa603ee203a34b111fac7546a0008c24e956f659ce1fe56c64eabf9b408ce8a26a0f06b0e22a90d2a479f4fb7def12877762c7faf41da7f1675227110fa82d2af3450c64b51922a10812bcb5959097aba1ace94b434a4dc15a27b9e77d49954da44bb21f3430c61cb0b1343875c94283233c8c20b659376fddb35da70826d1281f943714d4f5b71487b44d8046376a8759732ae40c5ad97b68239a9c62ca6b551872dd15525b30474ac644543b246d055d79458176847db4a4283d2a8598706a5928812c92bce510c7492300c11c723df763bef940f66abb50f5b5f89b8ecb8816d40c55fc1c184008ac994984c6a76740366ca6d08cf3c488b8e54bd4d33286d110654889607c171cbccfde81799533ca6909092136b1f75407fd5713cc31cc379b6379a88888d3b727412e7aa7b5ab812c09445f2f57a6c2549db2a631a8b816f8787fe5538860d2c3cca8949b7c7843a918612c17c91aa94a53bba92647d0b4a37c9aa87b62960f9222415255df15779574b86b46cf96b0800474ca87e378816a9facf7191d9721ef1522c3416f34048f627cc7c0f1c8686aa90fb9cdfb2447be2c7082861520ea889770a6d8430ed0393f7e244cf6f667b5207e019c9e1e4134cb2518b987a4a5bbacc3f13bae0c78272166803c2a04aaccee337667101cca856625d07b80c493c4db3bd6135242e895f236488f868d319109dae9165ee297419912f26c1662902f1decce788842b5035f93720c636b1d59003070ac3c0733b58e59b980c0463fc221a1955a41a54d95376ba762bfaab329ab63bd56e55486c79d279181aaea0047823ea738910aeacdfab489a419cbacf9557e198f138a7522d0c5a1240091ccc69796774e55250ef65846ab80e84893a9f8425f86a4f86a74f3521638fc8db135b5c0b481c31a29ca63163de48e3eeb44bd643911808fee880237674dff7b14a9b49feac0a69640ab1e7622bb9b2b22b8027d339a1a30758ba5b084431f81972581ba7f017168ea5494cf75ab233705efa0b9f6c5840ae587933240b2480151dbc809614b7f93b0221771d1698ce8a9b2cbc4751d509e446500fd37675ec60a3fe3c06036522ec1a848f417b9d144dc9707ef211c71d4ad594284fba268ce07b3796932357c1a848329a23263b9d75fba1176ed6c54fec6c758b7393b7963a0798803f28fc5e81042609a6800bd411a3226da32c19a6173d10fe42673ca2c477676c05a638a68172492599fab493fc2b182f0f334f26bb42837516aacc49651244aa57362134c2e4ca5043a7683c33c565ab9d9e514d2c1977294193df3866d78b9365a163e8c9da14752c5e81ff6887e721596b2a0951d786f4c397fbcc489365442629b7f1b7584075b2ea14481a488957b276fa526529095008c65106a0871bccc6c5aaa238d8455c6b5baeaa79d8af11145692167663da3b1bd7103105ce16606ea789e95bdbb09b1fb9664931960e0f17eaa5234f51a56f9c62b63335595169d145a1e299156e083825e96b709e93afd32cbee1c996c3b97dd0c76839b4c8f0c09c3c485bdab0782d6541f9416285c37dfc57248e96db2d4a807057ebec164e5da3f55287ab480aedd4c54f9f9852ca427baa64658b49602349ff7b8c10b326af2b2761c683b2e791bba6280476436bc50a7a029565df504b4d42762053578c08c108cbe0f9300f850b899f6adc8f23fd1a93a7aa068f08134500a98563bb07fd263b71485e23099951a3d69d7266b02a331e2c5be7289d1d09b74d19a7f267a06b3bbe4b102ef94cac9933e5499ad5f8cc12a1b83c2327e65e741ee56bb9f4a7a665718ead702c7b435dda737f179279c7b0372f73b58f26c764b8d4c986e3dd38711f9c09ec4cc7fa0479a88414727277e642ab629290e5b232dd80f61217487546ab448aa1a487c3f370523e42dd7a77482a5c3d46b4477d32db3665ee5c23004953b7e8c2065616df3a7aa6ee08f3761142285020d359e55496fbf33912f0305d225451e611264cc02cf303043744e82a10e8d4c10482a6f51c6ccd07b87213026cc37a91887b761789cbf439e967817768b9c45c549df703dfe14b65474012b1268e105452d9c5c91bc55e652017b060a2f39c0da174bfa3ac907b7ba1894a8ca264015a2a986f42d2f9a6770f930c448ce7a29916490738bf34f7663b501c0466e725c5d455b5299ad2b777154475511b00bc2381de50ad0f635000c3a4406828e29a7846aa086878578b370c686a62d061b079e431ead21a01510b2b325868f952a0f793decba5a7d8c6315ea8f940238deaca39f7597c5a6b31855881db4923192305f716b68dbcff7a8551a6c6d4e53a2ee4a31b5763ab05679a5f539575b386c7c1362f791b313a76c9762d86a9ec80a4edd252f066249a0d73a556086fa98922202657bc41b5c615f55dc283ef1569d1c8478d24099b670f332811b9c453b650c3214692b9361e1b6a1ad8a45e960c045a87cf7a2cb306c6bdca36aae89b87840c311cb277dc5b7a058788f7129a9bcadc75ac2e0a92b3fa021fea23499017bc2d713f7bbce02bb85a5eaad9b1991ac9b9163830e5aea80a2388ea80553332c5c0bf177724089d2603aae5128a8a404e400a4a355ba55a691f0096aff4a2acf798c5509a27a61194503be57487b39c39ad03639bcc17e0f775e396c5e72ac126d08b69cf66ea6d525f10a06ccd6ab601b0a62d0679ff86b4b8048d7b61378310d3a072525c21f2df1822aa38949213c001456833c58754cb39b2778f4b558b56cb74a91a5ded48e980bb9124a4f59f8785b629e8a14acd21ac77612c276706a93b90b766a8857f3405376a0dcb684c8647c51f08885cab2f122c6e50925090703602383a8b129a9548e47158a1dbb20017bba411aaa2d122ef186aa432008a3492364e1a17c895a329cb4ab01a09503a05b3b380aa2602dd2266a0acb63baaee9a74d5992bcfe01ba39a4bf32e2a546c848323b15afb4263d981497752a094c6854753997a5a40abc32534c95a7f32acf5c4eb74956cd97942d7561bffa685ba882370a703ce2936b8c8469a5305c517c141c63e4f0ac39f76674851a321b5e5a128566fbb2ff555f31bc63c56a7110db71d3638e6600beff19231dd67cb81c97f3a21df099928a47b7d4431e14d45a0a802852eb2f8656122c128260dc63aec0805232af52f41258e282bfc335efc3a22c996be5d773a61463ce3303e45106804ab68a544568781a1d8642aa701ff8c761176c5ebfca2e05647f95d4414f04b11f7cc9875810f1636da98a433fc964e1748c1e55c75766a73b849248ac01ef019a0a3974cd7708f81394a25a2e5568bd311a74e3e33ed6ba5817530c768706786b7380a87d36b23679daa59b9369faf9a16f69bad08713d0b45200db4f83c5ad8e821256e44de1d8bf60929549314b12554454219e0590abee6655615a622411826c45ceeb47123d786484b502a987782943bb0f2154a944b038307608da2170d00570378f0b5985bc01b226591ec68132f35262a30920544c8dc996b3f074ac48ec5b90607c24e0ad17d6ad5f1cbcb39a65fea6ccd7578e5f4b4d4de6232641ad69db4842a302d1187628cc166ad1a7cda24645f0123eb39247e3ad056515598a384bba1fc445276dd08ac77b650335b22b717849020b3923b03b95867ecc463317cf359016446c7a41a306524b05b98746e6b230d7c3018c83bf474a43964a6c118574bfe55c1d8ac2b921b719cb48c4f6a97510b67a247837ab8c04fb4541f9043dd104cb1c4c63f39eb54679f97766e78424b56301c066552ae28d42e90de016527bf4784e278e4a1124dcf7613683059588356416c05779c2ab3c5e97264032384c40014f1306c12b543aa0f65c4dca536e830bff1bae3bf82d2653b441e4541fba6c03a8144e17966b738ea429a8d39701f51088bbe9bf496509c29782c024930d3862046335f9f59f3be7078f43178de074793960ce96bd53db70912594f8da6f39c32b8b168ae317b6aca135ff221027bb824bc4ae5e5c8ccea3c55afb43877a7c5617cc98f3c1188a33e3537ff9c160c8c9bcbcfc4f6534894ea5447d210e9ef75021dac231c42e1be22506f35f793791a0c2c43b789616bb3af0886fb39e172e0d3e2cb14d4c6846208691880d6b9037755c84f7f777d56f6a4ccfcff1ab98b748f706f2c1d43d31a0e93fa57783b01661e1829575aa3f26903e24c57e74925f4704df7e8ad1a08ba5cc444072e7d040 +ciphertext: d95fe87159673198b4cd1dcd14958da70578d4292b25acc888209e01127bf3e031d875ab987408153691709f3595cc6757774a8227131bb32e483680f95e172357c2038826d6949019477eb1d81951ebc87c0ae944505aafaa39562b00a7932251850788b0c6cae96b76dbc829a9bc88bcb2b21c35ca87da3aeb90fdb4e82ee12a628d116b56a75cb173de1388c58ea0612107c020733b9c94d3a862c9d4b636aa7840182a1125c10861a478d90521f55d9bd169c82fb06825b37542428c883d4f2252c3dba804ca83699c6cd2ebb1298e313c48bc8f66915cfab083b25092392fe4e925add085e574585cf166e57e88cecee9e0b4ecc7563094bde9c8df073e4a389d7f61fc35a3e4155ca2f9498b64a3d994f6fbfb3020a6764db1bb692d5e310be55369795430d4742ebb302ed6349f5b91d3967323dd2fd25ebef038217564f1757ec3606ff6444c8dfea0315f155306358a1ea55f4360c17d254422b125f6b466de31d35a43fe95fc960c6cb2d990286426e3848998392d11590b42ac583475fd54356463512e5410cf82cc0393e4d3568d386f918455558d8e8f46e8b2e5ca25021139ad172c1218eee83ca884d51412e0de018a4ee3882c10e413a9016ed597dcf124a549e2f02eaddbc9e67ec83e33b6eb2bfb195753aef8cfe4ff896eb2e6633fe25f17c03fca87d97bac0533af769e5a31d51494ec2710fa5b9a5312e578b13a198e123a2307b89a1e9d9adc3f2ed2172d7c14d70e5289740fbf030ff60042d998999ffac979423eff068ff12bd9f48363692516cbc15a171e6cfe22e970a8606b5a2fb4210854c2251e2318572f0fb405df64b120b8fc0eb3476f7c0db9cd53155c3ddc8dc3cf1a69feb75ced6f5f1831063325e2de9525275b5ce1cf9bd51edf094d4b381007d4c2e800e88328acc01ad873b3ecb127ad5ce2d63ef7ddf1dac4e395b5a3015290615ab9cca145351e98b6378bfcbcf75a1a5074215e34775c9bb1ae258288d57a682f525190e719fc31f4715f7bfcaeaa60da40f62b798ed07f151014ee2fe4f2b0bfe6f9ecd1b7619abdb9a64318c3ce347de032a3ebcb49f2c1c4f2998bf0e1bd970f5867a806656f114145c9705d7d2a83b1ef71a30db19c5a4663a19687c56b4af18cedfb36a7b620f2dac6cb6a113178d2f979732a4d51cd6b8f619cb8bb4938df413257428e70c5ed0a911329ddfded3ba29b8f5340977836f4dacd54c7aae3ccd487262cfbbb35f5d75f540dcb4a0872e437c8d5f422965654f07b90e2902c79cc57e0fba71beb6e4778f0d918d3c04a3fcdec88e4aa788365ef385f74554cfd8822c00908f1ef4df01dd1dbee66e9781fa373ecfe594f6aa9df5b1ac12500309f391ccc8d2368190ea9baf00032c66b4878d770050ed317b50db34089d176acc3be3478ac765e5a13f290958c1a4bfc7dc279c2831f5fb3b541e2016666c8092b013a72609426cc8ac7e6e0c5824f6444eadad5640864df3d7a3d958270112f27c4133258ffeeb05b218aef5d4d7241fca58930c871f4879e8e1fb9b9b80730ac09d40f257b7c22ba954ad29a9a4b86047f2bec11185420972ab87e6a5a736a2eefcfc16a8a2b0233f450811061a59e1a73a0b11709dc5e95e57153a8f7cfed1a62fb267f8345448943c74fc00782045c0a08cc59ee5487a86a26cda7e278feaabc29351e2252de1aac675b15fe1ae5cf61a348c91730c101081291fd29da7d102d743110999078e3af2f27654a6faebf4360dbe08d1bfb5aaaa91f8be43748192c0b2fc375115b16dbde2befa20bdabc021b99d9213c6957b8135e32d7960de4c09ecf8085ee36d5bcaa31f7f1b117baeac21b1d4075be0a9d7b6c4afab8866d8f6df33dfc48465c0fb668cdbb303c6650ff7d40c4d817d9aca9a2a50dbc99b7e6c5138ee7f2862ada9d86727c87aa3e3ddc34f00693f618af8bb6ae8bd1aa95c53217a97c9d745ac745c29a697afe9b01fe4b8e365169986c57de63f06db8cba19c612d3e7c1eac2a7a3d453df80be0d35e1c91173b8d258f9331271359c6287981a7df914dce3f013ed990f5ca8a5eb501d0492d09e16d7d652be4f6219e0dcd7ae4be1135d69566dbca3c4b6c53b14c67785601a758258f7e3856441bc425b96222a45c00e77901681069073acfefcdb2ee4238e7a192f5d8268884df6990e78811bb12c3ea1499085064f39dffc476a4 +result: fail +shared_secret: + +# Ciphertext too long +private_key: b8c2a6476b00475b7cd1043fe4837ac1abc1db362e2aaa9b6f5c81a53c61c8e04ec320bf28e63fc4a6c0e1917fc1905a51bbce57bcc85151643fe0ac61c0be75149d1d19b10838bc32a6a5967b6359a99202937e4b950f5028ac58ab7e0023a25c406fd1e632a8a8052ddb57ea40a80e16c40429627463a3ede1a0a992b660911cffc08a215ca6ec02cf0d895df4752be6392fef47cd93853a13a564be2404bf53882c1386ef7b154e88897857487d4a31c26745908a62bf97675359c83ac89bbad66ad86cad27dc05a2130fe69bb3ced7b174d825c9208ed2d4a5545b15e9325340ab2ef5ba48ec60276e748d5134aa1692551447569052486fb0074c11071b386935661025831844f3a78bd391e9a3a466e218da19b974eb234a942b8da74602d06ca33258deccab7b3695d8239d4c5b6bea766c5e4592c5ec0532b1642eea6a6e07127b395e34436923074a78b834d1c03be296097fd7a6d61392bb0a9153c087c33a8949524bd1132595597f6fac8329f67a43b37d1fd62ca7479cc7e89935f5b8d040218008452fcc0c0f8b6297555d0d349eda5503ef9c137f492c9168c6b6b97f6c1066d9b97931d3ae815c145115864d0b642201674e328bcd924f8db26f9e5572bf8c2ebfc4231944641792a527a465da094b86167b63e596ebf755b0c56af2c20bccf72fc5e3095ef16a3df70810342feabca827f5861cd950c4d09f4229a51453cd7a2c93f77bc95913bfcabab4a6f25b0d0227e1121abffbab706b845cf677be089bd1da3f6de7029a98801134c358f0493000b1009331a008b29af24338e55bf276cf22329b62b8620ec117ced77c73960aac559b49e91c5a5953f3995b9d5393bb205455644bb7056aacb870f0128d386c92ccebaa0163a29060c6d2f2bdb6f187bc991254d7c86165ce055896fd0c547e607ecf92931af7a69474082b958d9a2866efb075f6e4ce0df19e96fc9f3439c5a7e17ed785aa0d8368943a79bb9477f3b913447b3975d383aed7505c069cbb6cc2ae79c85377c78adb378bb3c717900038403164c23532598da3e344e59735c777b97955ceadd39b76f614273191e65ca243294284966aed6a1b57684ab692330e91b442580adad83664b9a84cd61227118abdb94c5b128e55a847bb359a3b245898d7b529878cfc3b9772031c4602b272857d929c5068d248d30300e5917ebefaa3265c609585b3a90c4b39865c51b42fd3626694bc1da69648e9466a6948adcfa9670ebc51d724267d7019c48183aac63816a9097d228ec8a667e852b5aae866e24b173971b2484031cee095ab39c8bbb2acf1a631199c258870a6c64270fd8a0806478077b97ab0bb255df83f08d257b7178f5d704bb063144d2b68c40b3706e6377271765dd81e4c20bd3c6216fb5465f466789c0283bab6cd1fd05fdfa880213a889fd14a50f331a0079bd5c94817d3a47ae80bdf722c0f57a088cc59be89c754f59e7db545107977bb3572b08a4a4386aa9d7b40907628b3b34705fc6ea67baa2912b6227139217c484260b2db039ec17b8edab435f75128f412c77636b5b3c72a425514711058e9d78e48b6534b8c91ea3c3d3c898a3e759cb51310ae9c560a03a558822285986658b9397691635d99794b7624b3e2521cba7a1fe4b7687b169db514599b81214c3c1872adb3a2a69fd48bd8c513a06530930b2305101a0529078835874c3c8701aa1c7a5b7136e89e50c6ca4bca06a544a2e441a7a0e1b9fe70346b961d2099bd1a2939f23875281070fb4190030b87e8f08f44c541681a8c9ae2789dfc5b2b03a228191462804f5d3c2981a9ab519497ef8a99616618333c3651f54102898c72a806f8254dbf124712bcb96eb218fdf80231d04f0659419d101a15e04def709ab061217ffcc9321c791d009d81d4c09fcc393a4b2c3c169846c8171567074b53bce49b05cfb85b3af77a30d20ca6823eda8049c5da9d2228c868541d701030413117f01966809763e7805be5e8211f806f7181561455b8eae14c35a156cd7b9e2a9b8225f788c9643f1128af9e28b456535238fa3440913824d16a31b3b6533a91e2c3748f0289ed3b66b0377b63c4ba33a1c8d484c603436e4dc685e5db2a61c640c29655a675603e01b631620ef8f26c0ef1773e137847c414fefbc336d669a8f02f5e86b9f3ebcfd7da95922b3fd5740522a86431cca86083622145c9269929b8e607d9b18b99307e09b091a54174beb8c471708c0d086082f124d28210c1f3657e8876d255888d975bc11569abf14daa38b519f041b8016d18363bebd29fabab8b4ce75e0d9b08b6e1c398d3766355674aa9a813a794890627ad4615baecc80dc06927571a2cd82c03aa065e80bac89c8d49767dbe989feebab843c86eadf82b7b792b8190033b227f1b8ac6ee6761e10145d3f49d51d277d8e55401c4bb29a35f57b51217764b81111ffbb73e53714321106a27baaea4d957bc80888510bb5f3c71af443d6ec32db61803dc302652446faed94bcf1c2b7872ce7f84a9cc8598208a49890206bfc25cd92c570a670cabd700563a5884a1484de61632c334cb72a19db7a0c90c9047ca9e5cc9c748943e440c5150b945ed2801d090c07ba211f53122266683f689c07bd3cd8136c644d9a31909b10255b8cdd58fc16a4548e0736ed974c3349393d2b5948c7aaacb371f8824a2157f6ca7a3672c04dba2cea4e255648907cba6ba0f938ab111431c022d42e2488034b5a8ac63c27c6cc2b951d3b994cc058641f6a7794150ae93aef24c7ba0108dc3e850ce7c7771449ef5255592b20736599385324a4de37a6cc10706c36803e13e837a033628378b63093ea1b8a9273c45eb561a17c6d852b9f36089f87bc6867c64c4390192d8b68d24806a0373a7d658f5379a4b0b3e8e7a681723c2c12c741c6a359577c33da673f8011f764983be8300f3101a9af0bda89bc6c021620c07ad284646c9914382f26ef2082d79a967f8a52b98d90a42f54c48cc4d537b79ddd3bd339c9ddb86210a97b0d55238ac95335a483bcbb543dbc14751f89c6fc8137b97c019618b7a2692f1c02c68d1cca59abb5e45b879398f417abc9da635376a2794a729b15bcf67456cfa6805ebf49e37fcc2aef5329dd291ebc14e76908074bb0e66b9ccb2d279d34200006a44adf2a6cce87801d51ca5969a1827a799f22d52a68a2d2597bac42b38da016df93171c20f122ab62ee736af591d1ccb1212e9b93aa3a776560ed2e38fea46443bd4c48326114bc82306e445ffd53a5f3b406cfc281ee66afb774d5b351dd1612e537c72dbe472f714af55b6c7b35c5ff74805c7ba0c7a7b3f0bfb94e423cc9cf52d7f619d87d560e259ab41f94dadd50e32d8000b126368c023b2dc492dc51c186a952672caf1c8896933270ca2676ef7be967095ab99b7a0828402a3241a962b496a5d0ef58eb5d29fe8e63baff34ecf220b88b6cd7708576dc70a6b69cfb2b822bea81f78cb32cf238ea2d6cd6c7a813e174046067169da3d756b899cda6fd6f7a8b5c75ee8499e4545cf7e282e0e5a40609351892677c910a6abd9733d2231a50c87f3a446f5fa7aa74320419cc92c479251b83d385818e02b9830925e5ac844e0fcb581db5d3f25394c55ceab7c41385a0d7fc73ee6e59c6c623ee1974547f2a8dc090dc7663985a7c726e66a66aa3bd3b61901529208e3b34bcc29dfb61f4b59878083abc1ecae70958b6098999b9c48a5251849728f4de8554678366caa4151795596997a2ed23a6e9498f8c40df84733ef35bb5071b5e1c909baa0bf71a55340e06454d40f361c54e04c09409baedd2b3dec5b72521a0c11969a42e8b0271a736646b57363aeca6c83f583ae93faa8ea55ceef8385ab48c418303c40ca4a66a481904248464aca29e02d6920694c2cbcd5456ed5979d01d94939e158ad12ba9555597918591c1c9cd6151f47a68b62569138964964fb2ddd6b4c16542aceab5c638bc73c849ae546cd5b50241d52addcc72bcfe42356e8b24f0888f059b1186aaf602b3d30b6b6009d9f638c872e90bb994ac7012678f7204e4ed06ebcf14da89a434d699b4c143d6415b04e5aac5626c1625a81f2751e47625131a62864763cd0bb044df22d2a53a3f4e8c9bd918ac3854ac0385d2249545e29a9484cb2946b09a9673b9887710be36f4fd822fcc4a5f18960e1bcbd8411c7b5c146c97cba7b877242e186ef0563324c03ebf9074b337da0e60831b185d192b05bdbab4e71552ef63c41d55749a7cfe7047759d03314d912b7e2a9fed3ae4ce1b587e33ad81270e1cbb48c4118ed3a588f8283e6c916a1fcaa3ad12a2968ba937d340a6566b8ecc4a465a82be650f48b46284ad2964574d7c9664e7c8e4b3971be3e5ea8de28c9a44c9d33d3eef3a1ffdbbe12aef3c333d44728d0846398dd74c974e6cabc0a993d1ae16deb913b6abf90681701b83649c6e3e2e6ac +ciphertext: acbfd09647ae0cd78750316a0d305881f3940fa858eb621eee8bb3d39524cb28a332eb75332d3510108744383715ad7bf3fda28f05583a3fa1741c660e27c16a60ce6fb3149fcc1411ea40502d2f6332fb91eae5e90ffbd5dc9ab71f4735a4250e20d159260b081f902dd2358a3c962f4ed07863be05de9cf229975af415a539b77e5855aa8fb487cb56d6e153fa54b3cca0c18a188896ed9a484f6a62280f4504da9e2418443298f6a886c7538030313edb91bbfbeed7e37226e2b6f6a2e6ec694ca9e2175e0ce1bafd519e1b5b5a3d8fc107f5cffba3ee0bb063617ff36bde74147aef830e5627fff87c0f5f51c939333fac1d256aed10d9bbfee57a51767d364c29bee53a196cf998f68c4169826efd0509eb7b0d426038f33ac2f8d01686ee4a5804b189431bf45efde265c33b2de0364ee98b841a8a93db233394383c85439d07a9bf9eec4af3d032f6845a00b0fcbd75cb05e504a88f3b869a30b31e771553c6d219e6384207856d5a64f2a6361f11924ec0cfe74245968545c30075d3b1e45ebd4a4937935d06ba8c3d6b5544b5e30b583566f0bf46a38e30d2250b22178befe5f5e3b8b3d765c378cdeee388be662c635c53ca83ef2032db71512ca859c1b144ef984ecde0fc78d7d4a57850f114815fee517114456f1fb3ffe8cbe3dae122a51e973cac8ba9c0b5f7dbcf463b4640b4c170c9b58a77ca0dbb4254f2bc936c432567f66f8705ee2ed0612f1b27e92a6dbb366e25928125cd042ec1190043c94f02f106716607a9ad4a0d1cab2059dd7250c42015908b2d6f1553c1860aee4c23f8bd82e7a76c4bfa2805cba8c4c3faa70283917b2cea010f035909428bf617f75fc2a08586a9f93ee9431c7b466a5950e8275bf4f653fb8acd8b43a3f85c4897fce34315936c09f3670aa886fed03e23d8d7e80d0e52f3ca9f3ffd315712a4b821b6891b0f7765e3d96f6548eca92103e3e0d3032eae83564520bd93b3555bc9ec60e2c3a0b6ffc7cf4b6a9f92901feaa875fbd4eebaf382dca1fa555174f686bc197723d532b0317059e83e05c827f203f7087da9e64aecb8461a6645a27c7a255dce428d1917842a794d7f4754e84f7312e73087e170f5062c3669cc2ca2e7ebca89c79f55793634eb9185c04281a750c59bda918f27c790af5fa91dbb2e6aaf7c8f9c2418401d98c37db708b1f3df91cc1f44ddaff568046cba431705829acc73783750ca0710d94d03bbf62fdc90c48abd61490958f428fef5a9ab322479b2c4f1dcfed4087c00bfac3d4f27b0f015b0db27f8c6997031efd1cb16c8a735266cc4b565cd418466723130a61fdaef5fefab408432fc21a9dd785646eda9a95bcfe8544b8d3ca6469073546d0451adcd7304e6e500f105c1a431b405efbe1dea7ffea17125f7f21d5acfe4475fc3109f9aaffa584da678c8b187ee7f8e4b580c68f5a1c2ba20afcb3c8bcf4f0237dbbf9772e275024f78c5fd4d7e91c479a144584c764328b63774e4d1813253ea1a3f0028db07d0c35f68704ded687e3d475018f611384d5c7db0c80856e1cd779aca1854c30ea2ef194b0ab0cf69788a458d2d31b1d0a9d6aa864b6f31be76854d5ae74c27774f41b597daae00b3f00a69994a77b061093912ab2d569ced7c68f3f010b52f1643eccaf8402a8fb9ee5d16a944d2f94972e282d9a00c88ce2686dec4e35ebe4e275fd8a64092ed6a242627412b1ea66dcb61be48ac03417adde1e7df42f6a368c1af13d32fb4e69a9b84a7361363da196be530572bb306a1dff199a213ce0bc40b0c6083633c68278faf3acbe4f702c1dfef932ead77634e42e25e98a06185c0ff1120623d0b9f3a0efa37287710702d98d87f49b0e8a171b9af390417c3d2ab23728c49fb334e225c8fe6500b0189ee4dc7d159a4093289714818ca98da66c1875b467cb981cdc84591fc14d89674c5a47a38952c8c0f30173443e6c140b51d8cde98e7999ed78cb428fdaec3094b5a66bbd4858567643e3e46eb8352c4dce195688b00e3014989c67942d75c719f69c1c053afdcc34313a25bd6e4b6bb84511071a932aceac256a59c01bbfaaf791bcbad8cddfc48569f3dea570fae83e7584e4b44c97b1ba80cad0207f2f161345f560e2d7012eeee364c4eec941f0b97bcd1187e0705548df7a8d93092bb2cc726842bb1a28c1d0e5b1e18b1c7d8c21c9d51f2047b43be0d833c2b6c7c3480be9e3390224405cbea20b135bfefc391aa4d31683bd3fc84 +result: fail +shared_secret: + +# Ciphertext too long +private_key: 02faa0c561b03e23301489390cc5697f915e430b4dc8ca50cb0253a85117e801cbd8c56b0b08c7fda03daa9a96c8244a213c2084952b38d80232534f1dc87705f0a91d54201e465b06e59f090a722119a1eb8a06537897621b096138406ec20c28f67ab974889e7a1a640ca617a085ab86cf7fda7b783310a48a7d2bc81935ea44b49a7220359fa0b884c6f1b8b9599c23182e1c19b0fae59e51766c965617345c1b5f69336f46a743f0046239433aa35c1e1b4d1142662f131d3b63be6e876ff28420269566c321c9c2d5810b36a1fe23ced46c79b95c506af4c6ab735b914c6c95b08847c5219c4c49947bc0cfb3b4105a1eff4b0180a8cae5673fe9a60c3e0cc558c050212b4f5486b145a237323ca8fb532a5884b52008cfcd1915e702a5697b010ceab3c43951d7120b3c00211ad30ae781409c30c643b139284872104105037135a3784aa98164e53a1b91b2c2fd4a79c015a42c3377bc860560db41251bc8b251c4d3b32a89b2c4936c864167bbf22589561bbf4cb5b10ee95baef82d3b4bac7e3cc004219b9125051946ab372912717409cb09901c86ba0521b9b8a4aad8954e84ab52f5826b4171cea3c594ce04533c190b77d9cd73b1538f17274df3745161a381e4b42c841f63787c1584cb563308b19b3e2aa0c3eab2a35e39240207caa7e68de298cea4173b18942ff1e98eb5f947bd635dd0aa1102ec12723a867e573ebfa56d80a5b5aa842a05083c93e2340a308cb7643fba3577d554926eb462bfb7072e7057a1481570dcbc925bb0fcb84b0c5905a0a9c2e3f872b349226cd463b7f193652b1de8bb82bd6797ad453cf7a64544683d5b51ca6a4322ac7379df745ae07c6c7d6bca0201788d47bdd927372dd4a604694baac2b88d51b87cf9ab475b952ee72450e9a453ea2f99b68747dc6e77c5288bb10985607083d945124b80a0b97d4c322a33ec7d13eba9b9f469bcb96bdc745fd008377d59b9606129ad2708858866fe79118d2abfce48c21d0c73e3e6aa89f67a36b523a384cc2bc549abfa96aa74107f656eb096829a7992a9d45d77f01ef8057e2383355f3631b82a04e7d7bfcb612ce57710ed5c26fb2caf6b125123ebb2fe78bf99b654aca1aff6e3575fe8ccf5e05e17a85419e86c02243ecadbba8d8055608627cd6b2001361a65828a5bc967b7eb3095fb6f3d939be4b3c2b32a3d75b082a5a141c6c526af712d9ec57e05bc86a4b1731bd026ab84b556c8c988f07449b2c960d69f76c55b7b3797bb84ce31c038eca53ea900443f8088c3c8a54a2a5bb2c43a0ce7b496b1291cf482bc2931327229af790895c53d3fc3bb37103d3aa877cbbb2b76a6426e5230f1d45f1e96681398cd90997814a300f69cb77a234b2be39623e13f335974e21badb416b94342c9bbb3a068a919a47ccc2a828bf3835b7e8740519c11f55611e646b34eb012d3553e8f4742baf3c036c9980f9524aab147d6b5760cb092e3f7c0c2bcb6fda0753087380f7407ebf89e9c633ef8a3a0d5088e6fc742be8b6b015ac910b6cce37900bab1ca86dcc998b73165a80cacd119107b61f27aa8d4f65548f7462089ce6eb51275446e9804b659404c4391900ca00a9891715f028715723e995cb508ecc727d291d747a283845086a0cbf898c306f9a087e0b1b0f5b8a91bc020a55fa3e463f0da23e3003e44774524c403e096b136528647999b65a06cf176132e42b5b501843525b5ed3385208c089c2565212108616459e7d0a9bb9b891999b5dc557749b02c092b93aec552d4c9b06f851437a4ca4aa91580698943b91cc9ab204d5c8ce2bcae7ac0727c439deaa22b4264758c74308a6773ad53688bbc34aa6c855f3aa6a3e22fda949dc5f05c75fa70602153fe519d8c203dc247c95396512b2bbeb5a8575f6b5d29da2b05db8ff086264cb8699de03e2b9145ce71bccb80bce96b5f6a3636172567cb9b8fb505260f7a49d94b6736f410af422a2a04cbacca3de3855f68106c51da2079b215b14a1b709763e6b79d6a6a618fd39742ca80eae1573b10307c4398e04ca81d556c32647b4cac1d6b1b9bc3d44e1f8971d9eb4606e7397f08cb06f517e1d7cf899ba6d89c73562b317cb40e5004777686137db008f3d985d75764f2a79fcae6b37da83ea2ca907333c9c3a5956261c9290411a214008aeb24f57357c319476e2594b0fc253da92a744657ac8a66c081ce67443a173ab06d379f3360bd6457ae7bd6757fa224af42714733b2faf6635878131142cf2667097caa1f32d645a3f74b3472987819040954c8f023ae6bc504aa939a05066d962a37594b561d6b0759cb02c3f3be4219b28f4c30751442f12c508b0c5d09017b203b023533383a15484e2a615fa98a8cea34c110303ddc4555d5308f1b9ec474a7c25535b44b3704ba29146bbc8ad2a60bd40063a9c6b42267c0b58ae826aa9b6078476a1766776a8425672a91cffb9497a2c17789d97747643117420a01fbcd0f9252cf46693ae999c9b4a137f9c87ddac4412256b37a5d77f511c0c8bbbc377d25b0355dc8168418a0f8876243e4b0ed316ab0a0667d4210eaf21ab52a76d061649d9885c2313efda5bc8b1b56d3ab546b4bb9d847456941a58872a74c4b7e5ce27d31951e75a65f329b5128485137863a9ec216f6513ea2d05de81c8321f82cd782085c1a7b51717b04952e0c151582c279e1cabc9bb55a91966eb943209c153afb24c19bba2d6a38537182419fa195e0706f18e9bd2b23615e276b5551cf1ac8c4cc246d416bb17db1b335db0dc67853ed866295916924e5bd41d56e96177c1b69753a55829772808f000cee04152712808eb8220d86570728888c258d465ca40076c9de4330e76842ee432ded122d57c42d5ea7be9a7b2f2af7ab377c5c3dc0194cf1938c559291e9845bb765b5230e4a872e59241811830d24e35fbdbc2a3a019715032c1b038f8cf15ff5330cad984234406e82998f16930171a42a62c5bd6ea61b1aa8a8f0bb321069b501d39ca3ea551b7caa1b602bb44bc353008b71f421cdfb1ae0b5442c2a7a3d78b3d1aa45a96009f18b7fab3770bb9518b6620b501854ffab32a7c65e21c7405216cc6529421892bc16189eb9806764c2abe6562daf71a95a509391a768b1b69cb09367bd476060c5b3702a7b41751ec4caa3e786605839b014767ce6c6cfdc469d6327472dab5f0b077ddd4b7c1f7c36c708ab27f91860a9554e6b41bcab4e629775b82bbbff83594396054fc5904595a7d9b82139f6787ed6bc2745083d96779a7b4cb18aaee0458ff293071d64adca68cf8972b6e15ca446a621ce851f7d63a78b81730d26b599c39a08f1495bb66785e33e02dcc0c6086739d287c2da14d6d5673803a11f5a451024c79cb13a91d08ab791b005fa3ff18b0a4919017c40acb89276d7c72be25ab3a1c70d2359bf54eb9e93b74133806ebc99cdc2fa047b5c179276a983690a3a073a7eb013b612ac5ea7bcfe1c42ab489011319c1712a7d3f442853c291ba2a9273a060118cfa0bcca963a9749e935ceecb370913f02089b06530bb59a0d2b0a585ef1261502bec930bdf1098f8461c277404758a43f3d563d83f43ce878ace5c2cd73d30c940c3586db9b8547cd183a60da1385f1309cd0ebb6343a2134f10fd2bc3e311818f3b74ba8ec4433054773c165eb81b5da68ae34e4beabf23e44d181fce77808d9b79523693b77388193a2f33387287980ce372622a31359007475910d3b9126e988974e1156c5b53f274693862c710134680c134960396d33fcc61982ae77d82ea3cab93f90a8e566b82cb260c4e95530e963977b4f26349ea96994190c53560722f20c3c3468a33b534e2807be61020adf6735b418b04328103192100be9945ee99b640482fba270467750f3983c0da8809297361c9b3758e27485bbc63f399c7a90bc2da027a113a23ce180d6622d90519fbf4869a871687b5c8e00b388eb2353d8847a243b949848a5a24c8c9f39143712b991e040de02723deb8877040984b0bad1000bb9533d3a31479676cad813c3150202f3f4ad6fd71ca2ec4dfcc966a1068423c5bfd9e30e14e4b6a886b99ec8269c013f50d398bef3660033a97aab4ea4c003784b32fac26862ab4cca5c973c07c3b46b197e8a9964650dbc07974eb52ec3eb6c14a56c32f91fac3188ac193af0bc465481810f618522f236cea595e788712bb60ec766374af88ea711cb77fc5ecd203492c90054d394c5dcb64060032250a53c8a3252a3505bd57c9852ccb403ce38b3a0ce27bdf1c15b0e77a6eff0c87e586542382cbe0917850bb3d50b0b66348ea666043a7868b7c852a9461814f0daa635108b3315ae9e359cb345b4adeec9b9ca089a59605d2fe8038488001bf97a824fffc99d408e83c878cb8f644a011f861ecfb4eb95acedb8352e0a76f802515e77843ed6fc68d2c7a0ab2d940b6dcfbda574965e2f47 +ciphertext: 5269e11a7220b4f3c6e9f86588e00f37b5d4025bf98de1cc7d56edce93fc7a3004ea2b96d40e34ab664acda415f63a62d247dd797da1230fc0b0829f4faa364b99da7dd08b26e4c0e3907f6a956f372daa0787cdd56d91b854e3e2d51bfbc2f69117bf43099fec0c304075b62f538dc79b6bfcaa23252d4bfa30ac25d340ce2577de463b432b18ab04c3e251c39c9861c49147c5f093dd56af95888d4935a6f625f29d1e04fbb1d1d8db81b60949bf8838c097932663e232d6e848df633e0dee4588cf4bb2e1c18802d5b32109b0e8ae9655e73866bca22969a60bf4a2f97d577133557e9c656474e5b4ea714fec22dfb4698fba81808c0e770667fc18f0525dd07a7d07443e9c73fd068ca75729d0c29062809cb4b54bb99d0c1b5e9867c815db329de3baaf1091e1c9710603e25c3b83195858dae8645cb4c5b76c0811865bc7ce6823378381ffe44f606bca4f1b5d3109109d673f62006f09c2e565d0d98bdd005a73d5962fd26d34a446d791886a1100f2902668b4e89c02a91f907a82cd25dbf32b465151cc4b31a76a7f89c4cb6b64e4b868372a0d5c1cdc9dc1157b87daf378fad74216f54f6197f0140beed0f622be0d0896b281a8792c94fea4448473d34b18e614f6b052cb4ceda5a00d12e1a3afed03e8647bead76f4c8b0e2f22ab7e3a64432ae4b8a14cbf4bb5f4dd7f10ac7e382c0e053be40408d66648eb6a939ec278d5ab73da42e71c0e0985232b77b11a23460610a76c13d489b69518402cc001ec3d556a40abded32196d29a31b8f00b0c623e623fcb54ad3b486d407a7e5e326f5ebb5e9c298a38373cba4fd9dd9a6f5071255b8de2706755fc4b2d2de9dfbe0d3d67fe340595dda8a4022296ad1b04b71acf8b9c35c958423fa81d51105b886d830f4cf03c3c61f0f193ef64fe6a49ee6bdff3998a41e85733856ffc61383fa3671872b8fa830232b50bfbf7264aa9a967645879456c8c350e0b99d36daa531b7e3628502e5edd94f8f6eedc5a21b24695ccf193daf7eb4a984af5071465022a2ae03f685c93104f9d7136d55184b23d9654021a742f52a443756f0d779c2219a03b0bca5ac00f136cc297bed45d7096dc42070e0428896adf6ce879d502c93f727aaffac9fa291b391f381509d7e2de37d9d9098270ab672d719bed9abc8fb4e3cbad84eb6374aa64c0d1fbfe9691b3a229e225dee148bc512586d6b360d911e4eefa92dc5b310168f7e4294d837b4559c1f9addb38eee0b3c1c5a18892e555d5fd6d5741f5d6ff44d4a3aa3070e47e1b179a9fd69eddcb3c1abcc41171432142d7f13ecfebbcf8bebebc8870d2223a145631d1b05f5c7179b18d25b2416a465af0a54a95448c1202c0facecf47848e728a04de4a0921253656221a99b846a768b9fccad29507998b87c5aa70c9e8f18d991b30f717df48703e11ccd0fd704fbd94b5f7be58c4a2b0d6c852428a3e7db897d6cb58b1cc01cb1199e88739fb4433ccf9a0067ed63a0928f28a825f8179d2e15c09b38c84551420b2e89d269ce79ec909fe574158292559e88a35957bde237db97093dece432f9581b397e4046a97aa8a77b6fff8b363bd73c7aace2009f2b2500ab910cc87824f474295ec8cc241edd8d21a60b2bb3b96a4189f66b73a063fe0ec03c021b6afe3fb85c84c8995657942e374ba68f23b99803bc73dffdb2b390191de4231f75e14996703ad3efdb36a45d6d6c873ff20a089d3f0a6d5a5c48330a7064b6937638a877b9e1241245e61061c140bbe5d43130c7becf55e2ca33d3c9db00033b37bcdc0fbf3b6b30d32994da59e14710bc489b242399ee653c72ef593f571afea5306be7df38e802cd6bf5eba87a814cb7bb77ba931cab19b5bcb7dcac609f187239c9b3ec50e19eee0d39bf4a3f73f4f0eec00a4c909c24674f2162cef5122a1ab616ee9efd621fa915cc772b755b9777933388f72d999fb3d44a8b18ef4e693a5fb141c5d6bf800bdc695cfe7130b2d45a5dfdf582b0ec5b749aac1888d366f2b1f3c44f6630b06cd9eb75583199e711f64cb1d5eac595808c674be95d0a285c6cbf9d1638c44dc7fa761801933ee83c394457aab6f6ae354f1c6ffe0534861a2c648870f5803c90563aeffd1ca08a84ee3576db4f42d3f90aca0fd30637faefe58ef9ec150f86d66f78524987f84d8f1af6e09f9c4fd207f084306ef1d0796bac82b78bdea3313a069b1bfe2e3e8ac +result: fail +shared_secret: + +# Ciphertext too long +private_key: d694a4d8b9237ddbbb0f0b93e7c0c77bd09b2dba1f342594e8b6be67e1c4371241c27b378188cb4e63a041f1a679c92b6693797c5b5ad990b29b255f0a9b873290c53b044b81e02540fa1c6c176d00e85183c97e7fd7ac5f3ccee5d26a114929cdf991927a003720be7a4377c0ab726c1acbedb9910709ba290354aacb483b32aa064142aa3c77bcb167a9513acf5197c0d7a2c023bda7597ce1fab02e008318331798e86c614cb934ec4a54f783643411a57a080835454998caf824b5dd651a4b0c7d0cdb3562fc82c32033c4909c60c301c821c793307c17bc664dea3a48fbb0e8f1be1ccb76483aa32cc80bd08b5712437deb26031758853392a78d45bb748392d1321d6769ac5ea1681f4a97a812cb00cc725bda371e7a3cf8b968fd37916b9688d5b342c9a704bdb8c19e112a8704678785491b82437a53451d1a5d01849672e61fd809bb54614d72808a0be77fba7929f2f87b78397c14d33660d14612e1a711d2b6db0a54ab2671c2f28a1ad66d28c2647357cafa859198185d7424686ad25f4ebc2501da5b702c7177c45331f027330b5fac9c79390637f73b747bb84854506d1ea07893e9c38f630f755cab27021347c868c313b31383c8e10ca0bcd280c8f392932b273ad01278b1255d9b85d1ccb55a902f989741ffe57007672dfefa1019ea4322d62935f86b67ca3aec310f685a3ef0abb5d46ac4da2b02f977820e31c489b40462d342b5a3927478909ce38b1730515a861359a947cee8a846c18cb8077ebf047fe7ab76a9db8fa19c86dada938198856554c6ab69873ca878c687b30a917d11ca2a09687ed6fb7432d2427ca78935bb74cab1c5f04324b7d85e4bf06994b4351303242d858b27b7aa6a8cbe3986cf78c2c7cb9b279be856bc6c24b37831a91ace78070193ac69df5b4b3801cb8904537f112654cacf08796bedd2824ed4b85a561b7769765f85af1647199e5351b7a9902914a5225a92d2d376d5696dafb08bd4f7b561ac3a0e161e0c818b2375ad81a228be295e2de597220349a9f5783cd1bb2bcb82cdc8b2da4c1cb8a08263220bdd501a0d45bc74ca1621794c33473fbcb84008e7514f617f0a0171150aab207a1ddd1c3213870e0a6a26bac78305d6a094423deb02af5796cb7a21a3d693c4e69a423af6b440a99508b430b38cb1ac4a86b0a351e44608e357ca6a448a3d44691d9c6f66304f44825f305501960b61c34c3fcca727113664611b456b005e9ceb4faa154e77bc9c82d75006969d1bc76ae78231b4f70afb1283f02305fc35ac61449b5956ba280100846041c6f06fd641a1cca62092a513d152753e09a1f4fab7d4e13b8035b263a54cf1504c8f728f5d995e263bac54c986e380cd8b99067cfa635db47d2b150b68424fa1c76af45636ed841fd4d92007b35c970bd0caf02e08884f12719ed36961f248c7ce91a9b34496552c4a2bfcbb2ce530cfea056ef46fdffc07ea2aaefe915e33bc4a5c789f22063bf0d9549536c65ee10e4470396c3b2bc0babd86f607d79ca11b949aae418fa607b0c1c1163cc34355d4999fbb920a26397b09a01a4ca8c1677d6540ccc103a79ad147931ccb100baf31b90dc1505c2b776abb917606b9a7eb15aabdd8b56954ce65e3947c51422b6864421272d8651289f5286eb15bd68436c0a6306e049e82c3622956887785b9ec6111942336cd535fc6404d11e0bcf0e92ed79623f2c8580015a286a97b1cb805f59b5d068330f3da3127b09a8debadc4d7353ac4077f47a38971c3585743dbc8b66d6c6694dbad272c2320e40107c4130d86cdbd6416490b61cec7744d424d0385212d92ce32394f110872eeaa9fca5874313cb379093ed48a02a616abba38105ea5b17260ae4f814014fba7b8f47890537be54196b33376a76b1193c23e9ad9211b47553524827755c2f2c79a60f2192fc32a64363a9d5b4290c7915a8aac04d763b4d4660d31cb0bc83534c9a16d14c088ea11d1935402679be18536339287e22381e6fb6a17329c833710065ca665e7875af8bda412b4210b26ec2045d4bb2156e71d0665c7bce89b83f276c6d818e129b68c7734cb1b2f580c8d7a7c1b9dd66d346871e6b37bd604214e4b1623c15927f875e75c2c86269800b2273ed800f2f863156bc2bfe14802ccc264052c0c6c6216727113204716ac6863687c36ecb59268630e62199c436ecc9a13619a34eef569c527aa366480a4a31e82d78df0235cf2478b20f934ab768164b93487a5074116c6dda2adea141b719c8668893097938c914329abc9a7113a0912f961c789b78dc683da2ca0d42c2ebcc86e4e317d29a1731fec97a93111de7424431587f89486c8a0c7316c9e548607c97c18c6c7255597159f343a70aaa4e1f9c1b2b09f83d5400ae43ea9fc5e86b9752c2c373b75b93c4b071f26cd2bec5ef7c6338afc20404186d3a264ea3a8a86858c5847ae75424ec398cef0306b9ad4722e71a0b92a84a12891b85ab7590242cc84705b8cc412e3b6d51c649371a29dc40b5014b05213a0cad1b625a0612e319e01e071f0011eca5467bfa15dce071d158716f8b1a7bb1847c2d6afc6497f2d2b5eee08a7c65b539d606940cc0fe849c59ccc993535bc0e0c9270a18766991c192b668f5c237e39410f5a9e1a043cf60c93d55809fc23cb8dd82602584e02b07bb7f43dd4bc8739129426566c9dcb25f18b020506321336941f880fb2005f3de3b6357864a40984456c520265394490a885e920980c2fde86ab6a03453fea5261fc43de7a7cae42336e438d805a40ce678e3ee55dcbec0d65f18ac097758b55683b7078dbfb7ff3d43277e59ad800bc7adc12908a48f66b754a50baccf2b65a7bc2902730c5a643b96845a1f40ab6a44489d3c7bdc1002ac166bc82843ee45637671c2e631db80cce26b737aa76bc6d7616b97c20015c6f8c5245f920ba9359c99105974cd33437d335edab40157236ead61eb01c876d173fb1458f80c272f0775bd5c14ae5574293b638b15a1fd43472259915a0056f48a0a6cff8015624af63242b5f751a9101737299872334af8ed7bc3f146de88329f40191d8dba8184351b5d4737e654821e07cf046751272bfcab81f9059233b1c0260268a94839085ecc719eb51f8f2206597042640bff801a41178b6ad0836fe896b79726a4111b422f53129eb966457573e2027054a010a78b08e0222a2a78addc5b220cc13782c2100dc43a7e9addb2b38b6971a4f7349a933bf8a520173914ce333b22dc0755b39531492b16d3058571a573f29c215ba4911458166928cf3e42bd4d6a94143882bb2215c751bf0d3354ef66128503ad3b18db2e199fce7cb2f44bcf59bc9fc94afa941158318645bc8bb7b754ade749888265c310969d679950420219e642d75733b1a979f4dca04ab04c25bb6b7aec7230f3c6f4daa895153182cf41a5c0286c5d1c2af989858c440e550967d05c831270af731193e02ba83cccace61c529d2b991a43a68824c4e245355b1bc55789c5e9702c031936c3427e75b4325f32d92537f6ae58f9aa2bf01d380343347da168e50e334f3454c367151a33a7ed5a4852d623e3c39aba7557e57b97702667116b602a263b3b08245e96a5c949b12d8826611434f53da03c2eab5c2ea15a492bd677675fd82795b23cc3c1395cae1697e13b9f1bc7dde121c0a679cf0e20792501d309155cdbc3ce1504ecabc278d3c2b7c223cdc181a72f3b7c6c38d5ab09c64c1702e4b2918b22bad068c1fa98ab9d81d1df5b3ec9256afbab44155812a8650fbe6a37464bc12d8ad6f29c80f16a5938355d6078c3bca9b87c7529c5031b1f60a29866703a9b9c7181f95e7288d4a8eead892afd42ca009733fd372e9459aec9550f88a91ed4b7b3b677df8742cb177c4e7a90d183a0681dc84c0095c3e81c069e0589251079fdbccd3552dcd30a00bf57fc1635301e79d5b07a91b79a6e7d2a3244b6ec4d27e4152c9cb5024b1047687fc654c197b5d63bb3da2372767145ee29be1f8b83b3611a2316134617077d5bf66353f5e70c77725ab8e37653c2b90acfbb69e343061661e526ab12a3a51e1a16298dc5296591acc805b7c3aaff450cb550aa09e022b0d8912da9857ecf8cb65e3a6c2c171e865a472c8693a22307414a16b341f21f4059438cc8de79c657485efcaa1da14295a20cf33433be7f6be80ec13e38a93bf1b5298ccca644687e945b142d01b09dc94bfb91babb13127cc9694d88b15988472587f30b12d1df72220222643db5b2728af29ab247c713abb1b2040b20119ebbc991aa47825a8729c3bcfd38aedeb7cc260408f23556d17a69d334544016d9aaac488b2cbd2a0ea8d2694cd06b7d81c6a71703630a11a973b643e8ac197d041821d8354714f05c001c1948fdc135d26100d7bd32f8ad48dbe90c652c9d9704a0a3f00f4c2d3a74f679a0f6f18c3a039ec2a6fc1f0f8e066232d5e84 +ciphertext: 93f420ff58ce1cc3dc37d095f83b6dcb5107ccdaf3c82056ca5e81f3f2a6a8c8ee1d12da3d530afbe18d3683e07d476bd2ece42bbd8a6ffd52f4cde038656ce4b88665ecd19388d5b8a5568ea7dca934ec6e852c1abff0e513c51b0d983b3a5a6863d61eff3dda87f883557125fde434d3c36202b16ce837aacbda09c5ebb72b04bd1bab9dcd94f4df01fa67c0370cab939627b705b63a0746d483000f37ca008f8059198d3035bb41aa8929c0ffde911170152bba155d88da169badb62646614f9e07585a4ae20fb31ab98dc77c74c3f959a1f2520906ee38dccec958f4ae179135bb45019aca98652c4653682bf939112529047a00af1afa3948224b2f98940914f1777a9b5d1ec58ce7d33f2f1c8cadad9eb4ac4e5d59ab93ef0948dcec6ef4d1194de754f96ba40d39928ca62bd24c2fd5b31eda9bcdf9ada1a7e4d87c5e1fd974e1fe36db2f06c8d8ce0131d1dc4b076cfbdf6ae91f27e3c712aac49e0305cdf050f2b8bbfcbfdeebe6e3306a75791a238a2197260d8386e9973a0c0b1131263c0ffff1bba0ac2439b2dc5057941f0121ee0b4734eed77e23218ce7646676c6eb4f7e602f74ecb4dd183dec5892207302d8d3f839b6bff5b913af2078da57b74993dffab269b02ac3c0ac043f538b26329de1c9111cefe938b5adbd975c4bd6b5208f585f66c26cc62cba6f78452e18708df192cc2252dab39b897f582a0fd1a1ababe8935824fbd9119e2c6e2c163568e48582f58c3ed6557f4708cbd81cd9c9bc34e1317f1e3043ba21827d8d203acc126afe768c155f3d3f187b03e5a0d4dc40d781b733860941212d15418c3ea9462210f31494d6b94e631496a5ae9842de52c8accf0e59d56b42956949634aace4e0f4ac2b632bc88bef7d5a2f970a364e06715da61809af0d65896c36af4a59352ff7e0007f9d9316d67ebc5f1d3a77655d1714ddf724f90c37959ed2fc08791c29a5f5a0b41f2f66d22478af2e08595750c004acb688bfaeeaad41fb401d519cda9d5e9189f5412ee31724daf94cbad65545c7451df365ee2c91538f3cfdcba39958dcecb1a3302019ed970f04ba6c4bc27f32522c77ede3d6626916838250285e506179bd1444e0ec5923ddcaf7170f9759f000624b9111601080bd517a59adfbeebc610da858d39ac4f8b5b0a568c2faf821870fdced16f07857f30ac6e62fbb6258f7ed0ab27c4d22a795b5b9bc12e583c8310b9a9851236361ec1acf9e9a23d60006cc2c76b209bbed02e0638c437610dd1b23f45bc80a03399855349a0404667c5f680c41d6d2d8674b8bba4422fdf7a3636ac41f1a6e63665648c510e274a654de344ce55e48bc68a2fa346f9357a44a17447b137f3adbe35686ca9be9d8c3a04861ac4fa794523c9ddaf8246567affbc2d5175a18efa015416aa9385f2dc8133c154cf9b282a628a16008e4e747721726e4d6ffabf1a4204609d20c71341ea4401696ee9528b64cd69a0b30e21ee1f9eb4f587ed3e1ba003cd5105f55a7e4434fdb2741abdf6a62847c510d9d1984b94ed1dd1316bf4fd0ddfa86962698e2f0490cb8d512a1a31ffc034c45dcb1be51cab1cd6680782eee618b13b7389f3b40bf6232a9d7b254270a08c6a2a28c0229072cfb57a0c24eeb5d6d5fb7d4653bac5d47f3aa72f5c00c5a459ebc658868c60ecf8b5a1024f668ee54462ee20851c9fb8e521ce918a8b03e5e3699d591ef36dce81daa9360a25ab541e8db124d6cc901d67ec001fda05a924bfba8d17e62a7859aea0ff279a45218670a5cfd9bb6947f893fe7586ddf427f3229c30dff0dab112c4727f12d0a36599667b4452b6a2b0dba050fd05cd27a5af365af8a2b96ff1e6a3c055b84d017326415c39790b322b17f04ab703b250d064eb3a3ff80b7f0030eaf05c92cc26094f83737b3e9ba772f95d716697890455c670c08050d1fdb6a70b3506056a13b5e01e2fb30b94b5882f3c96450ca7f940f8c547e4969f0906462d48d1df182f6d4461e72ad44f72f5edfaa133d8ab98970c679599a233909cf535c46855cd82bf769d26c293f08c0d4e86acb4a78f7169597c97071ad2b1d3e7eed30fad0db8837d3c29e92f7b55a3e7efd396f4113b3af30a7d70d17b2b2bd2adb519705ad4401dbfb0a2b4ff279beea43c6e8077dbb34e59286c6c38e080c2f511882ab269307f35b01ed2edc9c6f0e8f9d0d0d2f72404d2107a5e142e4c0b3553c3fb12bdc33dd9a37cd +result: fail +shared_secret: + +# Ciphertext too long +private_key: 14857e70115e1c1b8797858fb5406ce5d35380dc7c9a440cbc60745888b71e5c1965a28c72d2bfd11578509ab79ad123ce243971e227f685a1168678e7e76076424d9f044ee72074a077ac2679a1d792b1fad4cda5ab8b2a786b686b1484d71e247a6ba84c06a6e307c4f348ab4ca2fe0b044e6bc6d2ac21ecb4bb42c94fc72ab033335129455a13d6348d822fa1005afc6a9ce2abc50bc3acd2c70b971093d699283693a431d76103a70ace102a381838eb0221d95933dbb6189010b17776862bb09465261c58455f41a96163d46a462aba1902901972c1e8110373855845098e78c196b2247e6586657fe39dc45c7d5d698045e79deb39bdf5942fe9511132e8a458b081063b79d9fa79ffbc660f939fd3b4617396003b4b0a0558619a53875eb2095df801920372bbb17c7212341b6b3da2e4a19cf075abe029a1563c83f8140fd38c57f999e8c25d3642bc534b454c515372579340f4a42d627c89f38a1196a821c7997d1c4accb7127b8a090d3ccb7e779d56e71f10cc6c4ba162e894936104bbbf913c6471303f5c82b0c098d96927c7eb232d41a70b130a1b761d98c620c8d81116b4a6590459a6f7a252422053672b1a870ac41784fda15a86b656fbe76108a1147452491df1659b4a886e1b5112022388f79c9424cd057c576da1bc11caa24663a1c191571ab271259653f7a2a28d818a5afa0c631c668ff3442a137811b83840633616856471aa11419b3409d19bb76013a3f9299d4c42e647cea58605b27a68fcdc064073b493e0307718b037681ba9ca6fef1ab92797493ea1a4237235d14b43c777900f11932470b31da2ce82a01dff8b5193144b82ba7588418509f8710ebc984572718334bdf960889c5391380a82dc7759dc4b9cc102aa865b51eb086de7e51298a7a8b4522cf0d6891005b7021bb84aac462477177688b17a066a1715b3feac357e5437f9c145c9d0b25a36313d0892e0990d28ab344ef00231623697e46c4d4aa8cab318fd634e82982d04607824b3b363321f5a4898bdc35238501434805296606fe993151ce52c1fd287a6c88658a968e73702dc143605b67a8a13303e2ac8df77607106c3bbbb3c512865cbd38676a4cb8e9418f6d95fe896290a165bd1a18164875db4026832ca14ee79aa8d6c51f74982ec2b52e586724d4184bfe234acc51be3403fa26031f36a3b79f33a394ca79db3809310c791932bb20330f955507f864f06c97dd834a98e745f36656f339ab3ea2c4c69a271a9749546648c9bb70e58674417765a32a61ab5e6937e9919aca80abac075957674b1648abef42ddf46c95ca87e59fc9356578a03358251e014507512b578aaba1c8ccbd20183a742ff4259e1f05db9738204423f8f5840cfb97ea776797e8b08bb76390240bbcaf7167846a4d1f003add1bcb4b16fc3921e983b9396357e24071d991c673629149f52c21eec7851e24fa64c705c08abaa391f745879c67242f5e96f123c5014fccc55b36751c8cddf64718f13ab7550648735a1ed641c5449c87d889711d80e4351789bd60846085a6036910c20591693bfe03a46fd1c669745a0d705655a46c06059b967f4153cc589bfa5b4b5a6238f93c1a19c91e4a433a9c9a4e3676884cc564684797344ba0f1ab133539164c5a2da622377d5620acb2d568192f6f98454837681f40843f02313d7750c30832f7777600014cf7971eb43b5892a29f66072cd13bc34f205d325136ccbb7e578c614b76f74d4a194b72e1c9aa1a6ab0a8fec47a458cfb58948cff1094a40892e6060f0ea194d153dec67a46b882f2da3b1e450baed178e4cd21c4fa2be65823911176887fc2ac609b6ffdcc5d8d787bda4956db218b0c45c4a6ca7dbb05f93684cbf67c76fb627113b858a9c7ef2627e5107cef5511e42178249b2073a3cadc7bab10821c2a9167739f1112a887ab1fabb94dc091082b03f1b8fa7e62d8dcc30ac67bfb429a01a61233f2b1a284b5bf1fb5b3903b50142643e932c4779574989cc2db574679701c1f3c7f90b996688515781a7ced170ee0576fb78393afa9da0738f11128299953b78870b8cdba0d6a1519e5a0039912d12c595ba346e9e1507f0dc048fc479177b50935b1edbf4c94ce76cd65821e95ac41e8a9da4d3046cbc63caf5420128847688892d7215507a0ce8598a56a78ac2d0a2439bbaa9c588c4f0681ec54c8a4ab13cfb369560932d3062427c5bc47c451e523f6d16058e06978b22ca150ab7c5e788d5f64735c09d56d6805b613a8e622187f8a9e72aae4e7cc6a2d62f77715541d8904051679bc913586c11893a11a980b5de08282fa164e0c66f89a269f0d15ce931ab71f11e52a9af0872a79c716578bcaf2fd588b9336347cab96f6c3e64f8aca37293a7c738dd766124fc9b172ac1dea1427d343cd3dc08fc4bc1620340c8037b47725013baa539ec4138d0426ed02eaaf4186feb4da614aadabcc74ba6adc6f7352d0c3ab5c38288063d4ae7b12ca725b5139ec75c9371d7989d6367a50b07620a00cf0b513476057f67ac8bab36837c5c86aa30d4172cb8519e54d91621057f09d9abeaa51de26c00bf5381dbe40888760b624624fbda9f4dd7a1f900c02a93aa8553c8866ba47ba61723612bd06841fc422cebd26ba9f7810fb8b14daa9ac2676da6c78ab33844c27029cd0107804b53b2285a4092ca313326a2b269df5097ffc4411b158291371fb6d299ce58616591624b260d200b6fb59850b18c7cf0d39b83166ed0fb46668c09e1161f537972e9a12d09a95155576ab16a2934dccee062b22963cec6529fbc521f0a8745a9e361a2d07b75f69bbe24c1907678cff29607774b7f5146d20986d95653fc193317c9540549ae74ca2b1d269044f77f22c796b442613268467615887c5822b651306848baab7c5cbe5a7feaf516955426a74bae7e773c0da03cdc2365c9cc8885e3a037c67d66b56c532b6317b4b9e5c6bc95e9399ab12a62f296ec759b9ac32a3d4a11a19cbf69928c7d01771a7c792bf0ca136130f82c7a437334e32402e869cc3e2c6bfa43abe4ec707be527e8e39e9903b9600abb2cb542b55c66595ca68317027c9c577ff30552e59e5b20bc44d1604302544863a054c48b1395ab03405c85fa241e7c151d60c0e57007ec54b7f1873f5eb365ab319b1a04672494243a7c792451a0bb1360ae38884e7b33002a38cfa56f70fa465fa00ef420b55397c0eb6b4a3d0929b138b43c9c08fd55652341b3414662e78468ab893b3240a09da149064801f7358b8fa60b5b84590b126350726ccc168176d85b6d90bdd843b676e961e8d4509d27cdc84aaee8d95ef34b7d77f909d7c83a2c115c52865cbcb38199f9ba3abb852eab4b87e4084ac6cb6a9b031215ca1f2a3e3a2024b0490e72279a79d03c46d474389cbb66043b5f60cc1553651c9c79339c317363036c296e2a66119e19b983d56118a93d0bc5a56f63c0bc54a2cb26418f37bf440320e343a868057e02307550ec19caeca76a9499553bc39bfc06685399f41c45f861abe8576a59a4a9dba7cb6c0408cae2515ce0379b6154786b006ca9b3c02979c068bff605605981706044b0c4cb6e8d639f6f89566dfc0945f64a1ad10d59d75686f31bd924a3b1083387b82111180c8789ae9ba7297919c779590228fa45911b55630a33985957676b49672c9ef2bc0687696e1119b23f7acb45a9078bc9026f89021134aae6501a3cc365885518fc0375ace11ff9b81026175329067ac1705310e61e142a6c7cf6c12da4af06806a34805cf7083dc63b91bbb5278711b973ab20f4d26af66c32a1ab77f0f4ca6ff24aecb42362ca3595b5a05d38984bfc5d2f8645dc5967995a2e063240ae764d5797074735904d5b8b7c5839a265a94aa21738095b70db4669e57193e6375d84cb4ae8ac5e596ab1501754b992eada39265b3c9eb302a9511a53698814d7ce463130695a1e44218e1d528dc8bb34be80277fc706f4629b7a332c4328628e562029dbceda348e4abb7c61979473cb93f5c92877a1a8d498355a5bb5ca11808476b89a30320667069cd2461f4999bb69bada819df5bbaac8c51896b64567eb3f4c5452c12415e318ce4866829df68a1833a76d66511e69545b231a11dc51181cbdec94be2ada35b3c8bfe94050c9ba143ef2325ef185e845b728488103d6173e80811641b03d1a9d60d05a36da81978997d3a93dd3bb6b62512b8afc868117bac511bd02799f3f4569e4b93ec0518b76fc7aabb72a3bb961dda820b4356c22f9a7cdb63876c57cece79141a32abb3b59d5a7139f8424b44732b47a6b8f105640558e90cc5db3f8548709fab584fe00ca423798c0f088f816c5674662619a46f7f4ef57e39d5add1c086c21a29761e82b7b821d0f6402414bb3a3bbf329d2fb00c790a2437fe133be92d0379d7d0561f44665b60252a3fe45c495fdf1f0f88f7b3c93d00fcc553dfc +ciphertext: 68fa356265ad575e5c46d426563eacdea82337ee5b83084d0b82f64e6943af7ac8c71c5928ef219748ca2e97af11f552737e06e8bc05edebeace9b1a941f1ccd3d605f4d7564563864d2f7d338adbe3801b35fcb0276452bd3cfa4fa174e86870b71e1a219ddb33ee88c6260550826c21313a85cf78989949038cfe9c799bb434ce160af6eb02b46cb7a0b3b005e5f27cbea0eded34f310ee10a33a73bb0404c16dd3e18e6d483c981c038a3bd117cec45fc5621bdf70c9a58749db761d65261c51b5264cfd8c766c9d8b6acb81ae1d8ffd643b19eb01fefdf58da5a21beeebb2fd7c08472e8a86c7716bf78b109ac558ceaf9b6e7930d5e3fd30618bf54754d51154f7bbcd3d49e1d67fe6178bacb88083698228c068c5801815270b4296209b51055215d2b97b6449298edb4726f80b3eb15a5a418e3bd6429e014bd5b4d969f4b332962be557142129bcd9416f41ed3d5c99fd044e02ecc929737c5bcab2e0c1e4741869581773fb3210d91e35c8c70ce05bdfe3e84e8d2bc8823256d555ccf9abfe4c58a55b18a76e3e4f14b6f6839b40a00697ab2c561056546f57501046f585a31077db1a6e9c2321c2917a30b8be26cf720abd1dbeb0666f801e0a4e19281f448c35e875c288e5b3ccf92d7f142e219f6d96133c88c4f38b8b57edda786402631845e9d16d86e76fc19d131e219cdaad829e17d3f1f64c637373a3438cee8c4e9728520d13bc91a1594dea5f2ad7ccb072a2ada834487cd21c5c6044c4dbc5b1d99c90d383cb3593dc5ceb838d0312db4db2a8ee0a68ba83c30fa0eb9ec0417e42ba9c0d83ce405b00cdae188afc9561ff76051e49a610b88cb9be546588e12efaf527e59ece674a29f80f5d753d575c2c0a2563c8505c3665c0a87921284a97e2ab3127aa97b2e666b52a22e1d364936b51863696162d8d6d89135eaba4d9a89e0b37f6ae1205fcdf3585117f9caf89133da22314b2955b9473a576a1127fe40192bb09e08666a32e96736c3ac479b27337ffb183382cc5436f25746f5863ebdc95302afb0d520ab9f7e046b2ba6d5d69233ab636724c60852a1a618e64d829450b44b9df917088b2c851c1686ee1e8bfafe38ecde54754e39bfe7923babaf95d3432359afd61cd0ccbf88739d6dc86c66d466c007454986fba80cff81e9e70106c0637c903f3ccdbb7f913a7c41057203d0656d34d35cc193d05a1696a0fa609339035d80d0166a72b87282651b7b0672aeb42ff1d3858e0e7ab7cceaf5b92a30046607f5edf963f73d9565c4ca5abfe4c48193cbe7adec8df98060cfaf993e46aa49a434e2ba1fa27841cc30ee3cb0ddcecca965faa0f4fc9b6b4db318e32c3c68cbe6b54450211575b0d5e1554e986ce33982e07510b6814956f62eeaa437d1d5ef3c949b8dc68eb881393486a20986049273d1f8c5317ba37f5f86128039751b76701ba6b9df6aa54edcd9147ea86d1b0560a1e4af8dae5b16a79667d65706f0a17aa132e8b4b9c64d3ade47c3693abeaa57e0bb6194dd4f18f3748b7cc69b74eeede42293f14bd56ad8e7038b5de7128461a631de0aecb9e710caf97fd3cee7bb7e9ef3bc03ae7c00505fb96686e5ce795cc3088c8993a8199cb9584576ce2cac6440a0c87e5186fb01050fa22b38f20ecae87bbfb442e5dee3e825202003f45c8f9873f59179c5a568c3c5cbd618290f74f7049dcdb0603050c5d2a0b8078ee68ca395c6df80d3e3a49ed02834696d99af04fcc0c8bf840240db45ded36638dbb0e3a92a314c0ed0774f401aadc91d53ab198af9bd1d4dbc1c8b1524a88bac33674f81969a350564a99d005658a49a767911169dfdbb24de8dcee6476fe95b74d6e3547e48b63a3bcd14d4d9d1a635d95e1e9f22eef897a74a5748b271f216f5c2785a957543476d05d89c736fbc678abedf0f75f3893fb9b8102fe25344731edd9cba796ed11617b6bf3df1e7905fd3d0bf8a0443dbe7607b8ca96718a7511994334e2ba6fb81723f5abc5649a09fccafd6586ac1d627682c3f048ad9edf320eb3a303b5eb0e45cf15e4ac33a7d21c60431ac7fcf9455f3faecae1ff9c963b0926bcee4c9427b521803fc1333600eec18882e75c3f74b1d15e362efc22302644dae6c5b75de88d29dc387bee6d95806c36fa0020e0756e3205ddefaf8da69efde24103df6bd010f9d88c323d07f241df5fb37b311f4c41a00d9014118f3939e3df6533e4694d2292663bf80c69272c8be61f4b9c2d70de7f9 +result: fail +shared_secret: + +# Zero secret and error +private_key: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a60e1a95e846cdcac4c779702db2e7d39055c815cffa89c71595bf461924ef29e29f750f394807ec879386317ee41abbe06c10bb51bfcabe2f194f9687c46d211536217ef54eccc82ada15ed86ba2003e177f270bb5aeee52f9436e31a379d2 +ciphertext: 30a0fa10e8c0f94f9e11093a8416c0c21c8d76f192b2c5bb48149a874efa1dd6ae457ab33900dfa4e04b117396c5b8cfacda8d01bec1eb08e83c11280b885b8d883344df96cc32edd098b05d3ee2a30081fcea4cb7f6bfa4658a0f3cd3299be05ed2ffaa90d6791469d383bb2f07d61e25d5739de0652980a072fb5803c361d81413004161390926457e7384a6d7c37a7b0b6ee33fe95b6078b3bf085a1b080ca03ed6d7729750117d41880c8ef0e402bc15bd81b3cf4272cb84db3f48682968f683ef7bd5c07fa0f85b6787e83b9c6d9e665befc7d0843a0b911893c9699d99c36c8a95f1f61edfce6803eef39fb2d555503809289877a78ddd41b7f271b8d8ca6f01bb6a2262cc6b459488677c67fc2035c47fd20e33bdd9a81d279fb7f1ff9b5b8d3e000c02c68d590e637fbfc899c9fdc7a10fe7348e2bcf4f1f731ced7f5741175ea484c85f8304c37f1949980a0ec0101935f7ca9bbdbbb4fdbeed3a56238344419655dcd2dc0bf0a2abdd81fabfe56440f44c615992d1c1b9478334c199c40d4b62494be60d0d18a2cb1515060d884fd39e4856cc2c8b4030b46a00c33804d3d2d9b6408ab6a258d4ba55c52f9eb7c864f2511899d28b91fe9c1e328d867f404f7dc523c89ea66dbf934f2d231b63d5b4329a8f09a336554da77bd22c506823a69341af85a0561015c84cd1a52391ecbad57667a2a0a99cc7bd0e6a18dcaacab1b6c7f9173fc1b7bf247bd8e2564f74fa9d0e6a8a7cfcc5597e27d06962ef3f78d182e21a7eaf77c8f783f916b170ca79e3f1032f2ebfee0b9676806fb5ad881a6db806bfff8bb077bd1e0e988de526469e3ed6970254781bf0d3f1729958bf73f59da6b7ece2e7e3b7c3b558bb63825111422d7320086a34e459c9681bad81cc89db23a376bd620588eb381839a5f819dd826b13c060b48488cc857298b614dfe1e61b8684efc110fdaf72fe0c79d0d1d4de979a75a5f58a783fc074a1b0f3e5251cac2b0a798a31bf9b8e5c2f84ddcf2ba8a7d81878aae9c53ad2bdefa5cab9c2f1637ffb2299af62f382e4dc843c0e6c989c6a983d86675531e3b297ebc8254250f052addf07df3ea7a104bea20052cb7037e68b52bdf205cc8b77bb90c6fe671182fab394eb62bf39733db9fc1a18f307a788038d3a58a18e6661a74b4a2e55c24d42cb2824856138c1898630e059087837409612cfc8a7635a1e6c985506711c737ea7aeee42851c9edfce69500b34d15357b14867fcafd459e2de311b826d8c3819eff5ec2f16c6f6c59bfdbb4d9c63997c1e0b461170326cca23cda09f0c0f978ff75800ee67916d521b87ac96e09d8230a9df27626420d17842aac5e20aad404c07e1c1bb32f4fae720bda3ebb8652c5ac9259e9bde7b0430176ed477977116cdf18948d2e117be3a5bc996ea9738c4709b2ff9f625d34128801d696f6b5d0730ed935907b170d9b1d0099a4a221e7c488aa1b341a212a12bfb44f89f13fd33af275816b2c8a56b8a2ba19893efab7809efbe92453d339046e6cf08fd6104d8a487b385975eee673955e059bb997ebdad498bf4c2825355e5d4732e78d4d9288c247a5c4d2e53d5d1d6dcdfb19a82a610614abfaf61e982f9d17bc10221c3ea5033679407b7cfe22fcbbf9e1a7e8900b29b9cca73a8d3461586f78733dde42d12e9bf39d14735dd4c1382b3613c9bcb057feabaf0e90de42c9c16fe87c704c0b03cf324b4316653a9c1257affe86d5bba7f17d4973ac798e5a4ecbd6227b2da17f4eaa462faaaf6cf17adaa4b3564c0a012422480cf3bdac498dc9750a486ff54662135f72e23addecba2b49d85a254259dfbf2579a1be48a93a3a31045046936bdd268c2aa54cee82c4148ad281bccb8bf3677e3ede6dde20ffd2b61836fcd80e106c92d72a35b57d4ea17366f92743ac36b77339077882491a1288c8744a435cdcf21dce1eb4196e076b269d2652152500aa9bc2b1238e910400820801040002184000000010000400801840042080000100008018000020821041000002184104208000400420001800040002084004200008010420821001000002100004000200410400021040042082180100008010410400000801002080000000008008410000020040002080084104008000010020801001040000000104008210410020820040040000180100200008410400021800042000184 +result: pass +shared_secret: c5aa00b1b6e55e6aeecc23499baced296d8576f3674ba6a9da68bb14101194ce + +# Zero error +private_key: 76da327e31334a81297ac41a07b9c1d4e04ef3fb8b06e9bc13071c98f6a80523801d0c6e5e7848d143a5dc011eab319ce6308bde406c4ca459fd3c20c5c76dab11c3eff0a060f52d6c677242b6019ea40c0709d071f587c06557d0cc36f7c428383834b69b877308c55e8c816d8195f614336e50357da66fb3f03de7c3742fb23c2398c7868690648122afe321a0b2b55abb99306265b8e9c4be1771b7727775a25adb2108a8d62bf5c18571267e6c1b5dfc547019c331532a40550579e79426304b52c88cb722da72d63a8da549731d5625a6e28db6ec22f3d1733df7775d5771857382bbca11dd271fc35b4854f58b6ffb25fd42286823790b1bbccb40c105e38092f5a744e19d7b758ce2a5379fcb1f401aa4db967fee4bcfd73811b214516a098d1cc726ba418118e14970aaab00293bdd9b18de001075e2a1d25183bca677db703b010a7f3166b7a4bc374b913394c504463a42cbac84ea799d70db4ac0db6dc3da8c78149bae1cc5e4b65f701bca315866d6a67e9bebbea36ca91fa694929cba572c60a1d1006c95941a640d472bc2b30cbb635087170381a4328cbd462964c80692f224ca17575fd7cce32425d6fb19a363cd114524d8c4106cb628253bca70377aa242751b626447fc43de18333dc21c841c236eb0b2073a2a8f9a268c931669daa4c9036228394fc8a0a2cf809a1a2929a5ccc98f924a9b7282f922c5ecd96cd1436b5b21692610a44747a2435807c50581dad25268d737fee3834a54967e76c3e7f537023b57f6a7b58c191427a12282e06421289448c97f7cb042ca66927a417e6747b3dd501d119cbd4dc43d18174aac099ef85839c7d9425d87a17cd77ccd568bbf4bb0fa8ca4e5005f9ae815a307471219a9aaf60bea631e07162a1818c3c5da6c29385fbeaa76ff4804beca79d1f842c46b9fb29c81fc4875afa0b178564d26b26cb21aaad891822ecb471b76a869b83838388b9f5839e0c344a7eab55c392c99019a0841b20dd14f36875853c6150fa46c2572828f51b9636b00bad5940912923252be3c49190577c928d5bcd6983bccf00875db487287ada1849d3339069195380c1a3ea34703792251e5c7877523c1b6278f9e40cfb1614a04c01d966c41bea36a10492edba56a90e370c1995de2203aff43002446a30f3771af65924b8354e0dc2fb4aab0295925a23576e4e9770740845ba541eb23610125c782c6c82af506d9a25d148373f5f48537d7b0df7c9e72f10938f9cd66aa6b2dea9322412eb01cb04de39797f78efa29186af03d90588d8488914f94033b644663269435e2c26b47297af4a324526301f2cea3446c2507717e83c29c8a53f277cb739851bfc94db3db6c6d2a35df897ad06420452281d1659e7aa89e3062abd2a1a7113cb373e6856b7acc402abd86418c554858eecbc2b38b8b9920cc0fa091b891c8a4248cbec13d52984c6512a025ca69b34477dda65e12b7839128427c42832a1c5f31e5c3ec09497667ca7e0059c5f43889460344fb6985441afee726b58172e2ba2312aa10639737325cb82e2947299b94aa8bb021857232878b45b03f9f0ba5b0ab75c1773c471ab51e666231c3c37f1bc4630628a9b1272fb9af6268b734e27627797582803cfe6006230901d074c72fd0755e011d676a8e69d41459c31fa5aa5de74814d0eccb67d6151dfab3d83927623242d78367f20249ee924c2b582d9d775a1cec0155a64f058aa6741867c7e491f6b53f1f8267832b7a6a8494dd249680a5b147579503425a55914580810673d507a2b0cf003cad1ca3809f6a06706ba72034ab8e79340d6232eef9815e761f6343a3bae63004c57bfe876b8d4a6a8b1550db541b359aa0f192a3fc2937078875ef55aaedc2115201c721db56b170239582cdb5c72ac4c7c94508210ab0bfbd1ac7cdf891fb370522ebb8a087709b3803069843dcd8bb4ce28663019cb470413e78097d933b44621b1f3a0930839807a13325900d0536a8f280225afaafd1d76c0e7aad8fa3af38884440d5b3a9f56922720d6854979b835c4ff69af290aa94d662fef6be4c46760b200333992f4df215425296f8d50876a94753024dd176991ea8a4b4256fa25a7ad7429303172bc7c06382316a61c0b2746252d2d7b1f501b2f9d6457e09955e29542a2b8a9b681139477ce641c0e766a4573c65fdd08b74038ac64021fa53ab9e2801743c9cf730b0609985059bc12ac92c61d86ee425b5811c6e4b144f0ba3599d7bcc83ccc4462c0aa17c7dc9d55598aca3a48b6ab4479eb4f4584796c64d2c74c360a34c901f08d00d4e4cc7e70c7b816bb0fbd323ce96416102580ae89095d4cb5ae93cd9b105d1065402a4a2681255d0821a21953ff851c23648a849ba27b267c0e70558d54146031482653116570a0fb6e7a63fd5b0ea9212a920c43467740642cfcb53130cb77a2a3bc678572235920191973075fcc1e769480895bc7cfa3c4c8068c3907c8da657e656bd8572a54f80847683639991952ad7b978e49d0022c17adb021030c54ed691e7b0b738c0b7078442651b979c46b0786b45ae446f73b56ce1b64042f5b27bc470efaa8ace21afff35487aeaa8d635bc607908e3f00236c74017dc0b515863ae690984f56c5156a70fe97f72e913ba74a7d04cae8b14364e2baea90695b5e36344107835ccc4335552f228c32e861f21357bb345663a1b9d70ac37ad9b4a937c304fd887048b8364744536a443540b7b5e572522a8c969b8a45068622982ad161c5ca1b69f9084657bcbc36025a82cd416beb15f037c045371617a81bc9bda545628804e4cb0b9ab7a6bc959ed6616465323f9b861521cb493da674c579b6799584af793459a2d1513345e67c06c1b268930c6d4dc0cc56c93e7f01bbafc589e178491f6206f9c89816622b8d5c19795c7c3404b54404629933fb6bcc03f99ad2155c332eb4181da3d07c35c048920f35a7bac1b465545018b899a5248b53f354cbbe01a004602dfac254efb3bb42130f55520921a712b20cd250bbb0d7949db4a05f5a64797417158241ca40c49dc83186cc236be4774e51856da828a5143588d32cf17c7a8d44aaa7be6aa96c794773b656a622609ac22b7b302dc88ce0d317c8a18877db8168621485edb278a0561d7abbbe33560b2eac30cb6b05f850418e1293d8566b5c370cadc2b80c10c9a84a47bc217bd645df4d627d9b28bc898701d87a07560918ba0a657589660972a7d636df533c58c02cdf960a6083c5a1452ab54673dffd2769dd8b95fc761b152181e2484be9c5e7412a994b81478a863e32489ad294cd7f60e2648a42f8890c740220cf4564725b290355cb86834b08182b54ccad880a4fe3617d0e04dd651334c00ab396c42829a45e149b3bf584f25e1aa674293e132a2a75b5e5ee4c6977a2b1df64220683326fa3a7b3888e42a51f712c944f9cd5aa6cd992c7f60b0858a638862b178080c5ccbe45ab9e07b35d37c34397cd2c6280226402784c04bb6c1d8492d5c021969108c13c7b2d1e605711a71256a3216557687f69a8ce38e8e3c74c12798e7547653418ac2b41133b3172a734d3c632930e2638750cab4d0883261598df19f1ebcb5c1baac516a4167f3c14e271d6348bc92ec1da704996bf9c53177855028335b834bd0340123a67632598afe146298177668c967fc4461ae3237a38a1be079a460a7a5d7d6cab0345ba945708d604b2a037198aa7209a9356270010cfb96f663b35601c92dfcb202d027e753a662e060ddd90360bbb38f4301111c509d624abc4752ae1898cc5732a518061c4ba4aba3ab5b9a66d9e8a679ca31136aa709e14cd35a129e693436990836c0648aeb5815e34a91e0ca3ad6838e859b2169b6e482492ed42bf2026b0508b733e437f1c6cdee0654c73b98b740474e2b9a19d08878855564893059904623711c42b62e34733e583424a9d25fec3b20b6345b28801d3db830cd503aabaa5120a040ab31513af89fbd0b8e11034abe120be9f99756bb26a9952615527ba4a1c0cc562cf565635fba5d2894b846b19907aca15e1979136c79b737821ed74839584de5b7493121c7cea71e6b744e42fa278690a6c9f434c0d51e28f5ad045c6d88969bc1e7b68b1b13a1d1a01e0a913e187eb861023a8268061692c7db71cc1272b63094e4c28163ac636fdb5a9422757744032b329e0891232a60cf1d5b71b2090bed7807a2d09ca1192541290ce65605e4197951e87c85ab3a41aa7e76d4b9e4d691c3d54aa27595a86a218b396fdd99642515bd4dc38dd7861b17e30eaac2c3e139381e2ba17056b7a7a07f7c9626f716c454e66c0a60e1a95e846cdcac4c779702db2e7d39055c815cffa89c71595bf461924ef224f69e9f571543a7fdc1819f44df00286533560a2d7c8e23d8d8c811bbe9f90d11536217ef54eccc82ada15ed86ba2003e177f270bb5aeee52f9436e31a379d2 +ciphertext: 8702ea652463d333c0695063d67f213d9e150f2e3aebe2d2bc992677e4492bb95fb116e17e8c5caf5067ce0c9c2d8c81369ec85fb7dcfb0ba32dc924a67eee3f92e13251bf1ffef5b1e3f98f25f7a8446a0305296e097e51bd157e97d476258ab146f7160413416a86f4b2a860971c1169d3b01a82201929cf2dd258c693e2becc839ceeb97c9b570e26a54cc1915ef8f17c47fa0b1d0b6bc9f25379514fd234425d02ef22cbc151fc2cbdf4549bef807afa1ec7e5caece5a8f4b62f2b388c210357c998e61fb205dc975c8fb5814345671bb8a614f911bd4de6eefb458a74d95093ca17549940c65101d62bfddfd4aae3c9a7adee294ad409ef778b1c25811cca3ece5928dfd6f3bd8a4da41a81b7973d5df2b1c25d0610ccd9b61e477785908d70b23a6ca9ec11a9c63ef6f52b624d66243925d2f5c2f90538540304bd3a11c76344c2aa90a12d8aedd1c6517732a15948fd3bb6a2e736b33bf68e816f19905b1a96156e2431da5525147d35d6b903708add85dd102658ab1972aa19cee456b7ba1c7847cd6b4f132068833a70cebc4b23a63771f4afe8f2aeb077572c76132033b2575c1dcfd12521d1249a5e38a8ad06979601f18e156518157a7c8e6526b957f657f8489e2224cfb73b2d1736837507fecddddac860a587122a98a08c137108e5fe9f9b2feef6b52e712e3493f66c98ea9cfa08aec95b27220f5b219689216b8e0aba6ee8a7e758730108652776d100680e800d6613aee85f831c3d92fea5123136d204f8983a7aaaca63d812234da3ff596ccd4970467f24217565b6069b6bebf58ed984a2f0476cde2319aaa792e46eb6b84f4c3c20ca27183f1e3e2be347b5d1250a666a81c5936b8d0f569db64aec4c2bb1099e6c5aa6b726a1617026c2c8eb5e72925d030759677863cae4f09018377636b69f2aad335200934ad4bd622fee2780b11bf1373000491724b37fe82d8d26a869bfb4d003dc0f85961dec623dbac4c55e7a9c439eb91ea01960d3103b7c0aa052e81acdaf1286620229f5a2973e8b0a72eb423cf068fac5c26190bc90afc16938eedbb5ddb3c9b5bdc8a595ac12f9c80dcb9abefda4268b8d74c7462104f105cf3437bd2cbd337dc5d71b552936e9df0e47eaed472f1162e2bb1b94ca19d449f7d1fcaf0e737a07075352aa6a45318981f9e67a6b23c2d03b3655147fb0d2b07462d64277b6cd11f4ffe969929a20774a885831ca24abddf752cc6133f8211edb3b5229218c9a61fb3683be29c7a2beab256efed36c6537614c77089ce44a6402a07c54cbcc105c4c1d7f35d2390ea2248fea06f472ed018548b1377738e62c081345659121a3948afd758c3fc764291c17f1274f6025c802f42ef00c6d692311c27035d7ed2ffd32d82671aa31429ba471b605993770e093a9ae706d523accf9684fb12a7b6e6da228e9e781a8c28f6cb6da9a6876f0e5dfe2fea4b6da856dc981ad8323dadb1768aee416471b87819d3685564ffb3bfb3ef1dc93289416b540f3a2f46f29bbdf9fe05155ed8d12adf5f85f372999b113d780e3034715f6e143c256cb2c50e86b044cb5449d09576e776520f8206ec7f9deeba0db6a4a131f0fc99e8bc794ed12e45bfdc9ad5e40a7f6825ce57f3f396f20afd968574b6ad34f3c150dd65ee11b7e0e396067e7d3931b493089ac078a812fdb2e6a56b04058a53d0c8fa9d0e6497cd89b0f35abaa09b3c8cfe7c89caa9325bac5440e971bc0ddaccc7390456b7ae38e51862522193e90d0d6452d19c2501edeb37567a0c6a9f9aa9b6dab2058bd08b3ed4f90e823ec4fc4c003e137004e0bda32bb843defc50ac4d0e6c21e1c8456963db80c3798319336723f4cad669696cc3ba07c98f986a9b7559bada4540b10fc50ea11d4eabb00baa323f4a8f4b93bed5561aa3dd36a0c8c9f56a684b65f08c7e725f60bab7f786b26921f9a638f7046fcd25ca266a4cdf774f29fd683d97750b7a9f551e99b04b3e6345f831cff027bae6919beab52eedcd93a2295f54cf4b14b010500d18493f99439a6f528212681d240adf2cc4556daf03ed57e19689f09f29a06b618fbe8428bbce371514c8b15cd9c34da0009fb854a8299b7d02f1c8b0350628c901427274f6e5c7f34c2097a56e0251eb14e5ea5d5ac0b12c778476d1eb4a85513387ecad05510f64bf10d1325a91f670ff6fed9c4a8421ac98c0d06 +result: pass +shared_secret: 4aff47d4682e6b414067b3020720ed442d0e2fb4a2b15c38df29723b8bab7b85 + +# Zero secret +private_key: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076da327e31334a81297ac41a07b9c1d4e04ef3fb8b06e9bc13071c98f6a80523801d0c6e5e7848d143a5dc011eab319ce6308bde406c4ca459fd3c20c5c76dab11c3eff0a060f52d6c677242b6019ea40c0709d071f587c06557d0cc36f7c428383834b69b877308c55e8c816d8195f614336e50357da66fb3f03de7c3742fb23c2398c7868690648122afe321a0b2b55abb99306265b8e9c4be1771b7727775a25adb2108a8d62bf5c18571267e6c1b5dfc547019c331532a40550579e79426304b52c88cb722da72d63a8da549731d5625a6e28db6ec22f3d1733df7775d5771857382bbca11dd271fc35b4854f58b6ffb25fd42286823790b1bbccb40c105e38092f5a744e19d7b758ce2a5379fcb1f401aa4db967fee4bcfd73811b214516a098d1cc726ba418118e14970aaab00293bdd9b18de001075e2a1d25183bca677db703b010a7f3166b7a4bc374b913394c504463a42cbac84ea799d70db4ac0db6dc3da8c78149bae1cc5e4b65f701bca315866d6a67e9bebbea36ca91fa694929cba572c60a1d1006c95941a640d472bc2b30cbb635087170381a4328cbd462964c80692f224ca17575fd7cce32425d6fb19a363cd114524d8c4106cb628253bca70377aa242751b626447fc43de18333dc21c841c236eb0b2073a2a8f9a268c931669daa4c9036228394fc8a0a2cf809a1a2929a5ccc98f924a9b7282f922c5ecd96cd1436b5b21692610a44747a2435807c50581dad25268d737fee3834a54967e76c3e7f537023b57f6a7b58c191427a12282e06421289448c97f7cb042ca66927a417e6747b3dd501d119cbd4dc43d18174aac099ef85839c7d9425d87a17cd77ccd568bbf4bb0fa8ca4e5005f9ae815a307471219a9aaf60bea631e07162a1818c3c5da6c29385fbeaa76ff4804beca79d1f842c46b9fb29c81fc4875afa0b178564d26b26cb21aaad891822ecb471b76a869b83838388b9f5839e0c344a7eab55c392c99019a0841b20dd14f36875853c6150fa46c2572828f51b9636b00bad5940912923252be3c49190577c928d5bcd6983bccf00875db487287ada1849d3339069195380c1a3ea34703792251e5c7877523c1b6278f9e40cfb1614a04c01d966c41bea36a10492edba56a90e370c1995de2203aff43002446a30f3771af65924b8354e0dc2fb4aab0295925a23576e4e9770740845ba541eb23610125c782c6c82af506d9a25d148373f5f48537d7b0df7c9e72f10938f9cd66aa6b2dea9322412eb01cb04de39797f78efa29186af03d90588d8488914f94033b644663269435e2c26b47297af4a324526301f2cea3446c2507717e83c29c8a53f277cb739851bfc94db3db6c6d2a35df897ad06420452281d1659e7aa89e3062abd2a1a7113cb373e6856b7acc402abd86418c554858eecbc2b38b8b9920cc0fa091b891c8a4248cbec13d52984c6512a025ca69b34477dda65e12b7839128427c42832a1c5f31e5c3ec09497667ca7e0059c5f43889460344fb6985441afee726b58172e2ba2312aa10639737325cb82e2947299b94aa8bb021857232878b45b03f9f0ba5b0ab75c1773c471ab51e666231c3c37f1bc4630628a9b1272fb9af6268b734e27627797582803cfe6006230901d074c72fd0755e011d676a8e69d41459c31fa5aa5de74814d0eccb67d6151dfab3d83927623242d78367f20249ee924c2b582d9d775a1cec0155a64f058aa6741867c7e491f6b53f1f8267832b7a6a8494dd249680a5b147579503425a55914580810673d507a2b0cf003cad1ca3809f6a06706ba72034ab8e79340d6232eef9815e761f6343a3bae63004c57bfe876b8d4a6a8b1550db541b359aa0f192a3fc2937078875ef55aaedc2115201c721db56b170239582cdb5c72ac4c7c94508210ab0bfbd1ac7cdf891fb370522ebb8a087709b3803069843dcd8bb4ce28663019cb470413e78097d933b44621b1f3a0930839807a13325900d0536a8f280225afaafd1d76c0e7aad8fa3af38884440d5b3a9f56922720d6854979b835c4ff69af290aa94d662fef6be4c46760b200333992f4df215425296f8d50876a94753024dd176991ea8a4b4256fa25a7ad7429303172bc7c06382316a61c0b2746252d2d7b1f501b2f9d6457e09955e29540a60e1a95e846cdcac4c779702db2e7d39055c815cffa89c71595bf461924ef2390505f8fe5464cda5ff3108cabeaf9343650b2c810ac7885a566a0e966dcc7911536217ef54eccc82ada15ed86ba2003e177f270bb5aeee52f9436e31a379d2 +ciphertext: f0e103c8bf553c2dd0a1043aa1c6eda544ac9ebefb081b1724be5cc4bf4167e8f59c53e11c2d2005310f3ac9e470759f8297971fbe8c08e7edcf5501164ded5e40e0cc9883ce1a8a574579cc7f675780e1f130ebfd2a83fc6fb276da2e6baaaa80b9b27cd19268ed6db19ed2e5f8467e831e5b19d6afd169ca9789c58b887214fe589a0fa5ecbcd88866dd2f574c39813b4bca5de8ee9577af32ca11bc6e17ca841d7c565a630c145855dc974b9584ca24c9979f46516440c2f5d35f148283cbd41db73bfddffb5a36420cb3c0d15e81f1d6e0c5e99b4693a7c83a51ecf91d7833cfea740e2e53f294c767bae0982a46532c35737fb5a23fcdd46d530b7b0cad6127a66ad052ee518006c6024bc2b2944d9b7536d47287dedf8a1bf6dfcd8373444a379fd1756d1189ea101e7c26f579b32525973eec803b074764b13d96d60f68a279e34c04f3e43bec799fb0fcd25da9eb14c4ae21d10a1dd7cea23b2ed5724f3ffa5d37766a34bb9d3aa8330a923a41925a7aaf071593ba163913aeba546c75d889750492ac376acf12e841cfc53f28a82a1ce65d29289a57218731c0b7ff814ce4ea7cdc087bab5cd2d57f0f1a45d9ad7096323edb3ef3558649f8aa2fe49a146244991f1d0cbf2c2e74e50038d6c47d80479e04f6cac03e667dad2c8865d6c8cef96cab4d3361e3def6e0b45a2dc81a4993e05177f2fcf013d992a943cb0b11b6a75861bfc8ad534065aa832915b254fddffa898c69c24514ee452ee1f7d8e052bcf3f6f598fa69db0ce6b3397994cd1f139e665d87ddc69ff6a4b7368ec4e5d026fbb16c44a62a33c2644a93128cb76397516dc88f664261bd09409b2d0187cb73e3744854ced4d6cb1099c56fb325dc93232ba353e421c3e318669f821df71c6d8bc68cacd45958442575b9960b0d903406c2d6c8577bb1a3ca8e24f47c7bcd2fd6a4ab83a3caa554c6695b286b115df21699a78269b25ad7013978daa30290d541f3060b01e9c3fa0d703322700227d84101c9d50dbddd00c92f57154ec9cff10a3dbfe6c2d4b5a0e0099dbc9b4883dbe2d1ad748fa6b5136d8759b9ed314d330a8822ecd74df76cb605087875150b205ecc1b73023bc185b8bb44c8c3c32d76948bde1249730aaa1f52e11754b2037d2cbad433c9beba44b6c8cf19b15e688360dd2cb7d9832926ae72b5533cda8ef08a0f92c5c1c5c287caa02b79eeb8073492e46cc4183fa2d4623a36e0a968ccc6ac29ee9ee3582182c261c7c0960f163b290f2ef893da422ad03fcf3926942570c186e7a90bba86ff792472911cb04bf72a8067190d4d87331d52d4505618c60de95142db27f784c012e209addd58bbcda062c590296be66722e175ac6536c58bd10a68b6d75513c78853d4d1f796bf477cf380c7f533f741460c9c5c2d1ad851db4b761b9c5eab3fd9d291e7921039150f8d2b81f86f1f997214660ef4cc63eca4b6c76bb5742fa9920d6e2db3480ae82380fcfb8caf51abe21094736f58cd7e6706b5d10c4b33f021bce59d288bb41faace2411a0ac5c766fc7d87c5d6a4f0cf2fe16cce09dc7ddf8d968366ac293ddbe9c0c709a4c0b28eaf2e23b4212c1191112fb9a316aea3334ff9f4645245420006c406724cd7f254a46097daf669c2b137560a25432030a6c7d6f4732594f21a277b610b870222b4ff561a6401f10b35cc5045020cad9479bb449322d37df22c9522c8b7c5c0c4897b1175f0dd40038a477c46e10f10f4289a81477a07b8ea223007e25f5b871d246e585083240c56c3d80d4425ff7821f17acc96121ca9ca50b95ea46ef8116734d015ce88021c620b57fe83b5022ebd980856d5102e4e80d7b176bb79209809cc32a7d246df9df5b0375bac96547962c413f516f4f0c24c8921d148f0a168ed5e0434b72538b9e5cdbc00b7e7984c243872fe44baba62b917a3f0601b81cb1e6cd89de2f38d0fafc2eade0b00a573d59d290586f1040082080104000218c000000010000400801840042080000100008c18700020821041000002184104208c003004600018020400020840042100080304208210011000021f8004000200410400021041fc207618010000801041040004080f0010800f8000008c083300000200ce001080084104008000030020801f80f40000000104008210410020820040044000180100200008410400061880042004184 +result: pass +shared_secret: 71a637ef1645d00719e56ef39217bb4d8b2cbc71db826affc2529589830148cb + +# Random ciphertext +private_key: ca72833ad0c1cd646e55e3b7f1b9576bc10849239af513bf9a6b254b5739f79bb926492b40acc649dba29735635e595da7d562e8fc30b45c052c91643a663fbd3196e94a65e08071c42508ee1347edeb541674399665b0019194acc73f10e5c021448336ea636c66119b8b120f2c8b19bc922d32065e6938b0b6864a19ba69cc3cd9904fea7b88dab232fea39640577346b8ccffd18d364a56b41c4ebea4973a03c942150782576447baa6f7dc6c6370c63b81407d149bea345fe6d56e47a66435e603450b9bd8e7a55c0488d5fbb1c5c9bc9b378c84379cb68994f334b6646965438708174a1fe1c9b6bc8597c2e359f20b8041dc2d013aa3f4eb6f62d72c64596dbd0927557a1a75249f6d51144d23113857766ef315a2d0b6953c92db8b60e79b98115389536a5a2aa048f345156faa0c6554bc8c225a3d0bb961a494b33c8e046b141f52a0fdbb846137bcdba04c0c04b15144ccddf4311d490bed914ca73a31c172c5c04a90a3184b27e75f91c1c635da8287c73f7ce4633c988c60f62fc8a59a8361319d7a1b4e2ac837a94bd1da72a053a2ae814a30908c69c0419ffc969f7348bcecbac059cef80cc3d19b0a9107ab17d661646688b1d6395a4840fde60b775237a7012029b55c2440ade5f065f72190b6524372b61795eb3a4f7249817180f2620de2071d6b0b80f6f8108473a70cfa51be705adf2ab2da7530d82a20cd038079a96b8ea3371fd6721a74cf1698085e322b7215a445791360638c0dab2bedb94d8939395da399710815b821a07bf6adea2948bf622e0ed899a8068277fc264bc883c1675fcf6b115f93278e4b77dac9a4c7b5abb336c20baac2ae68a72a3b94e811b90876687a77a383b881cfc59e1fe8992c0973aa63a7fe7264d866b39358c50ae650796baead09cdce0745146491b44c88070b25a5c0a11157b469518a82d372a652545a537377941c38e3aabb1b427d0a87a42b78842377deeab8a40a70133993dd77097ee727ab791f6f577faaea177fc435a9631edfa32a25a41891c03854454918c692176458ca50a32da910c5c39c3ce474c05662699875a246b7501a90dc9ac029e59f2f94c4c1509f7be3cd43e12263a995d7f293fd9759f7218118eb1be64248bfd273204a09a7c61aa0f6bdf562802d42a034a539b2a72c1a661d7e7b061b0b331d6a26aba04518f495b800383bc63b0df260f33692b7545d315c9c58179a2af67e82c1627f73285c3a5cfc807d830ccf84484ea78c863178a96f2bba07d9684bf712b9d55bf939745e0a2f9b4ab4a61b313b35149c5b48e50911dd15b5ef3b59bee9735c70328e35352886123a107f54e00d20655b498032dbf182c631b3f1b6917bb772001949510459f94040386149a4803bc0c1b1d187b354d61668514fa0087b8a6c7e6ab2b3e0661c42e70d9a4c777b601fee41aca9632fb09b0c81a9883c885bc095a66db2635384bb4b8abaccb86f374a37e6ba760d7b1fb3112b236029ff4aa6e1c52d3f3c0d69a25991d6cdab2c75092aa34c2726fc476577121f4630a8c42062c9f363a4d1c8ed73867a886276959c98b07942f39036e9a026974cf6a9b2bd109395f6afc8a7220d5878ecd311b03ac44047c61c99653a97b41fe8b66172064a7356551b78b5c94e30d82d6bc495d4449a9d3b0ebe6668eda08d3a6b971e6597c6a1a30218107ea425743bcdc0488626fc5a6dc8374a64a295802c657791b68b5d55923c727a9ac2d16b6f410387061fbbc8738b708ed21a6d75275478b22d96691c9075ce7ab356094599253391660838f5ca8294ba9e90b5663b26896fc57a8cdbb1efe35b5d3c14175126c537a71ec568f315c33d26028c837ae8face3aba73a28371edb84262084ff98b566be3785c915ca3132fcf496b51274ced320e99053a3773ba31d9458fa67354c2aebad442c9e29aec4722b50c60612661270c6cfe8207b6e91f474636ee892fa4d2346d20681ef03dbef75184dac971b135823b6212771e10c28c48400e6fa96c4fcb9563d553b6a3cd96066074147a28994034920e93335c35a2ad1c22bffae124edb6a6b79c36bf87b9ac45c0838b1d0bdb1b383b62534357ea798aeb2104213a8d62b28b895b4009f0cbfb874708b1317698366f2c4593581602f0379f04752394b72fc53aa1ab2d11ab37a1d1b40cc17074ecb9f70a89643a4b455c9f7c12854141a4fff5c03a099a4c8baddeb9aaeb36a6897712d7a5ad8970279f531666d8b66a8431aa24031f74cb754c76a3d67d8ba469994bb9262762ed072f72ebca9f6837a3962bd3733618f81bcd61358399afb4c441d22c8725cc3a66798907c52c4a14be4c851a6a9a1166119c5a3799ea60088c1a2d4aa71ad828a072f51e8f54410436799a051a5e38b207334d9ba442ad27ab39a739d3046b7d73aa94babb6108981b89aa8225c81377498e437de0a762a7798227bc17cc54a090dab0c7d548d85c6c38e2ac5798538e630bc12b00f2859defbc6c24380f28ab5bd4aa8b50c4103dd9b97f87ac57b1501e1771eb49c493e13b7719582eec85dde51eb17b5df97c50797a6325e5b22fa5bf7cc08d3555ae4123c99c6041a97692fb7278358ab69152226cbc1c4b73798c23af8738c2ff7514cbb82a004157a2857542877c5c886179fa091b23513fc1403860c3f469797c050fdf19ba8e8a9ebb2076e469309cc449d23a7320721b2727c9b29341bf04c436336d7ca34d78b8b441fcac0f10793c2bb7de5942e5fb271435824421699e67bb647bac6be1b2369b0d26e31f83e725cb0b0c43ec96a31c67e5493cc7831e9716900b726a8d1abf04b4353308be3fea5d57a99ab8300dfe55b90b1811719a18a30307f291591d8a05567bc9632a6336b688df55ab5e7375927863af652c2b1c80e0db1b8b4972b781685f9934065919abc07205ca40d3d7b96be486f0a82a4ae16b928083f333121ceb441b3c5fe76aabaf6915d7044969d2af27304c7caa2554618309884ee10b3e56f0c4013a263e27b0c6236cabc990baf5c3bd837c8f379135c1964108393bba113c208d0660b5a4065b32aa6bb95a511b93672c42af364b0ef4259b1be16c3e4c29e84c9e1da39910eb7395228227cc06c539b2017acfb69c24672b4040bc4abdd04301f54d432c8f94d2c57f087dcc0ccf3d81a6b560a463e988312841b52995f6192a142493efc16222f2cd6374b75c43cd024ca3d28c39a0ab2dae961a3fc8214b963d2ba1aa959a05fb453558251e1978b30d46a4739363e324357ad64a7ee25a96c43b1a08599192ce3ea7976f01cc643aa5f2db4772b64b662845f41a1ae3681ee451349b6502d68b261cf87ddcaa4fea2c37fed526d8db96c04c11ab852473e87e9c52b8f2db29fca4484a116829c6915f1365176110a2d5bf2155262ef79e81191c408b222e5967403b7bcfc296194a01fa179665c391d52c90ac8c9131931f7eb630c6c134fe74190e864d5e705090d687bcd8910ec1406559ad6dc7a10dc9270973b0987a1ae38603317c362993499c052546ab5e24acca143a8b8f529bc8f733e24479eee9c44647b04b6b2b7dd969f9d33236696b60d4bb88783cc16600ad1936b6599b716440b35c077c82734ba26c8302b9741044a805ba9ff21b38f3a2e7c48a2ca740373138917cb29460964108a8f83572c9b6c4979c8a084c858f47b0ad19b344d8a7ead606359770ddba420d7a9b35cc2a034865ccbb7c91839da6e29082d64a18bb3368e7a7802468ce05b75c355e9df954e579833db4a3c8019e10059c66ca91ffe31c01693bbfa5cfb32071bb26773e8378f5796e0ac082d7f3c7674b956845897739453288cc58d482f37cc45fa6ceb803a4edcac3c1211989ea89d82833b664133968cf18b6aed7b457025b2936387b81179f402479c2169787eca14ea6bb4aaa7daa4a94e825a332ca0054e8a37fd58a9e503ff44ba943d458ac3b9798cb72ac670f41e09cbd93cb6f916d94e089d6c449d3daa9be3c946d68c7df58be34f203256753242807225b9211291439847a899b4337ea1b865557bfa98c51f2072c034cbb512cc0f6a781b185d5a51c4b344a60f5244b009c49340ad713bf03ca7c22082fa8fac90f619e6732275db86b5bf54568d7348c7145d4dccc396209ec8c2c90d20308f6789877a7e31797a80b9653ecb2a4db65def895180263ca8ab72542cdf4c46af4a22e0ef4b1f61180ae04504a7848ef0b40dcac8fefd28a12d712e19968b294c9f1a1756e4c6212e9925efb7a0a777853442e941ca1aa114cf8228b0748941fdbcaa9a496a12386ce9031dafc2221885e0da28798572b038f43b89a816abba900ac97f01a31dcc630b3435f8660c89fa5e78de9aed81c3aac96a00b99111d03d3062cad579c1fd0190c242b27bf4074986b0a5be204501674047e7e7a1649482e1d9b0de92455cd14d0049bdcb7cea4b867ace5c8922b +ciphertext: 542acf1e3c7dd990f1879ef5b5aebd32055618c4e5b958995f0b22a78f9e2bdd8dd0cda23893c56f48a20d4df878e1cdbd39f50310f2ac0cd502e761329da00d49e7b8721f53af649ef7edfe74f259ffefd492f13b1ac396eb65916e02b3348560ca426e9b93beccad58bcf0c5804f0a10532635fcb74e45c1f8eaa83d56e78d8a7ee5aadcb7e06eddef900b484632bf1bdb0e1a4ef8b6fe34789934d9baa887ec5a39dbc6416f66008751aa193a9c313ef8a57a515bfe046953fa6a1329a770e9e1bfdc33f3a68dbd5cec1c2a55a0e41093583230ac35386645e6dcd166f25706efc779fec0cc4299e8e7501b93a857378713475782cb0b31ab645940f4c875548345ca0138372719c3cf9022034f17c28bb90f6090d4b8be957ec63c297a0ba95dc02f8761c18e7a948c1c20158230e2f9ff809cfd01b9d020b7164f8a3c54a143594d7d35b8e1ad6cb25d96c11c1b7f47f62a8d90c0e2b3d1460b86a463579e7b44ff74b6a29f30521588a26887797c60d86235e0bf4c2bc7166bbeb275996e1f50cfc36641710a52fe08fb5dda30f6129d3a304e336ff0d8698515b2cc450cffb45cceea7ef51a989d036c71367a4d26cd6025479d2f7ae58e700928e176c59b3040b054a09312d9fe529ce784a71513b44c1cd4073209a93a4df73b7097da88cea0b31c3e77e70abcb4b2ba5edd8db8f47ce844750158ddc5609dde43eac393eb5909d9415ee4698d923d8ebc28612f8b0676565010360b9406091ddc881fb6a992b70645b6898d13a8e3e449be589cf17bf9312e5cc58b03d3c181f7f176b67bea210337d6c52913f8cfe145da9426434c1fad0da7911bdb35e68b86b5bc6717dccee9222c4842c28fb13115278f1249b213498791082bab15d32f59481b29b9512945602eeba8af490af99fbb841bd1aead2b4f6f57f19dc970e83bd3928ea2d33ca3c3e50cd5d68e6ef516371cbaecb6b73f57fd5ae5b38a74f20759dcf217066081fee51f0fe8a93aabeab4717f05395e304e86bedbe11d462c1cb9d4e32e75b35fb707e7b509e43b450d6025b2d3e84e00f3d92b717578e820a33788013b2bda42f2701a9c6044ac2082e0387e141bc97a60bac45e0c1f4787bb5b892cb190e4b6776f5139082850494bc5ac56a6f759a0505ed4757009c35a4d36bad276185f1fc75399043168b22cc668a4b1202e03407b9fbb6a0799ba6a396ea78e137f7c68996f18f1636037179c4b920ef68526fc9008aecbfc0a2b02432e2b15832b35a61f438e06ce977c4d447612c13eebd0549edf316f64f5e7f3ccb0b46d19b79d103c1ab8f1551b6b3d22ab75a85660af2a9eab9c734875fef1d526da819829b66d65c8459a1aa404ec83842aa97a595e0271630644ade4df047f06778fe1bd1466bd413279940f15b9b848fae294bf4964286629682abed221e1ede635f315273854d57f68872bd9cb503545ef7b949b36df853eb7a4f47805406555d361aeeec6b77a0b6030b5a124f34cc121a927740aeaa6a381083f4e645b0d460220a8a5961be7ef69f60d3ed3c49c3348db4924373a706d7f16a4a4c16b0e3f4cdce663d224c20cce901801c4b29f9f9ada5ea9e5facb5e9cc0621b297f94d3cc828b33c530656cdf66ba0ed27a4988eb019065c508991bfdd8af7678449353506c0202b288d4f6d5693ef3f8447e7724c9b31f7e50f54c2f0933c5d4d6b4691010f285bf58b5a6b254f2dd12936f0aa6789351c7e61f046fcff0770df8cbbf0cfe6565700bf1dfd4d7ad1dee9368e2756c6e0f7de2d0ecb0d986b2b7631ababf3c6ae3e6f4c891cdff84f7f9aab7f3ea7ddececa4608e2574904fee752f4eebe442940a688efe390dd97e576349569f83d02d4627dfc23d65a8e4b9cb6bb66070e0fdf1ced446bf9cff064f1b113bbda51c62f278226254d15f44005fa271fb9fe3613f640253206279ebff909986aec32af0bc00663e10fda8b419f766eca892763bd3c4cc349369ee97dfedf76845fdc3ef7a884531edf2cd0ac840423688feb8a0519343266c2168b3c93c17e754dc4afb47dba4ef6f31ebdabe58b10168b0857f9899f48f61b08e809809014ebad6c1336e671b9abd3c8317942589ff517c3460cf81d4f103e111c15d09b878263ab2d4b4810898d3a654123fa96b1c694ba7b212712709c9173aa34ad098f9f3dd1c075af8d47c72952bfac2a196c +result: pass +shared_secret: 66e9331f3ed7e258aea053740f4b38f7bb53eb1221eafc8c59f5216491aeff93 + +# Random ciphertext +private_key: ede7009cb4410c259bd9f949554cc34bf0880fc3ad34abb9dcc0715ff2b5efe5553425cd24d6a464da33f55027e8e90b979203ec258dbffb002b468acc658757e3cf0cc9c3517b44c6f7171682384b36abf5b6b8094b000e8100f22c3883350de95333bc2b05bc0657ab322be9a2a17c5b0965b34579d0caece5b5c6b3ace0a874ebb0b9db4464ffaa9ad360ca40e2c6280b9844085b6f0c3531d2bae7aa4399a25988d26b89d08c3ea08a1fcc6b3d95c5e16b9f1b16b257772cb0e975835c3bfb81a28d9b0401b7c96ef37abbea4ef5d72ceb5a718993b06c45a8b729c8dd07310a71c2bcec3fbee75345c4549193b663eacd085603bba278ef7275c760051d2b61a1da0093f72837330bd9ca3de04b9dea5801a5140bbd979a4ef2a74c6c236a7875d4848083d633525b6ab31c33f5640467f43e8964ae5c982dd1d48deed96cc659baac961e8e62a569943b68c1c86f379f6a6b57c4d81015cb7bfc4c4930f6a080ca874d67520df38c58d878e51a81fe910d75e0c0b5400f42e412b4770ba645308b3a83ab9230ed69b172a3145c1560f3c521d3f4571aea01c5972c6f417cd1e9028de932a54c3debe549d8013c5c452870d4a1f615b237aa426eba5c39bc2151dbc45f0b3ff6f90352fc685ca87a77a9728ca69df4112b0994a646202f6e56188be631ac9b0db44a42b87cbbf8076b2cb73c22f509bdaa2f7bc03e7a2a124646b1a517cda2961a27a7840ff42f584316eb26abb2fc5416b95c430c1dd8d100c6829f19ca1077489e7ec48ccac18058d0039529c1d77c43bcf4cf68c026aac00920a04cc87c87f2a0caf6173cc8336cf6871501949f2a947d6f3717ba4952dce6c418ab562de7a4e358293a420c4f57bc6716ceb6b985d2eba89054b3c8c035ae334dcec8241072c2225484d85ccc6a726cc02a12b962ca3fe74f6eb6815b054170e20ce844ce5e716ee4f29b13623f6f05c2b273c3c1a70b9461cfe85a0f97c8340e182a3e741ae27b2c44c033553b4b2794aa3e5995f22758e5717e57a3ac9754217e433b46f19a755325698a5e2f2772f9a07920191188131446539422450b0e185aeb261e9ad6ce8c0b2b1563677e3885469219b2428cd5faca05080b97ac849d8035f7d34e19f850d97522aff3a811d1ba3023022cd317840ac868577a5274b3abdb5775f95579fa126686473c2b8038681f90f0539fdca0a9b6bcbd04ae285526ad226961bb81f586c26226a269a042747a290e4722e88853f2856160266347e99797b89a2868b4bce493522a7795f6cabcc237b4d467f763a58bfc719f764ae183b1c5a477bcb31106e7895c17a9a5d554d4067282f78932c9648c463881931bb2ac11ff6298c81c760954a8418c05f6c6031bd48f8522cf8c22730bc7b397c5cd43c3b6ec45537d494057cc09ae654d7473469bea1d0ab8c930caa8359a7834798e50935804367b8a319dcba7903853798485982353083a5b94ac0a63c393a2ecb3304b2640d5599e8b923eee3641e39824b86527a697344bc2b91d0a6be5c59e6a2b290bd215db41cc54208edc564898a956d824aee52448ee459df88c4899d52d2e95131f4c4d0f02a452336556120bba28917f780173bc6febba156337cb4801990917b4342238ca949a30cb3a8618ac167b15d5874a4d7100d3999e49f8ab111b6945493a6db44ada619299b25680119a8a0592c198148fbc125e80644d0c894f491c496c20eb871163a04a7c358027a218232203ca0bb5e6bb52a9dc34d380ae6b98025723c0a73abbdeb5ab68e0768f862053c4a75f74a0471c6a37a2c2658a41e91ca35ea97774d1cfa74a939dc1370f12aa02090ec1db0dbaf03a2b03d0dd050dd1e59001dbcc42728c69d43ed8072a85a035e6d70a3b827b02b54764968cd82c2e4341a996379e25e9a65087a08a973a9f43b328974b0ceb9f2d0274dd7c9d4598be1c12638813170ea9a79327916d52b84a747ff3f9b5ab6c044ecc63630443bf59ba1a6b0597030c7aa0ba347b1464c2ba1882714b725922966a9f924a0ac5928e83668a355cfa4c9fbb14c3d9e137abe9163a651e6ada1b8d5a58c94862d616aef9f4cb46241b10520f4c1719c601b88481711311055f860763ca78979822a1433cdd4098afd36ad0b99fac09cf25d8643109303939cbb1ecb1f8f99740942e15e1c385b70b8612c2149b58f42a688c766f6dfa81ca471ed551636aeb85cd505ad62954770c97aa7c1e7f48800cc65a5f2118e1ac48c9e72095c641c97a092ec20f4d5acb8cd9341a6c800e6a44a16060a3735e16c57fcf182f89c42347340c4334198a03ab7c410900b014b1c3cfe9c4bee733965474393144bc6d0632c114ce40b2262544999ef99ffd67aea9f39d77e29553e16165ca5ad486540ceb7916a1bbef23c80a544436ab70d479c1cf7a4d7f881436224914c24dcd8b818861bf3b0a4e83f0be13c043109079382073cd80836f96bf7a4c35259869bdf634ebf93a7778c2f271c487e187ee9051a43a586979a18e55c2b667c388f9c6fa392eac955f793987e79494e488402fd5b402636423299c8ba12921e51182493e752988bb9714945ca6d9c08be54c49f7d415253c2e00c7b61af09464f4a61829389b499738238bd87c64e5810bd1d9b1a762b67c1198684acf078a7c2f7bb832f13f4a4139cdb16a9878090ff15b3a479f58da73f591543f70b2b78c64f25cb2eedac51f4aa3fafb1e79739589b75c7e78924a57b5a9d04ab5da84968a1e07630f9cd15a8f55365ab782c3c9ac8a8b4e03ca87931838ce71bdc0991c03f725cf16800a3cc01e5556cd137ee2f730e5006dbda0c8d1c3708093289c6446ad71528962c59e824537e40427fb358168987cb79b8812561f3529c3098853ab581f145da29c8fb4521160acb4fe8c3500d3cd0963b76ab171b181aa887c51aa65c7fa202d74192af868601cb5c2d1c20fcbe09a429852295c7197a61b12211417b8ad2d75aa85e281cedb6dff285910e07a10936cc82288dfd7067a4c77dea3b6b852c357332cb7f1afdb0a7ebb943bb17380e13728a6ea90deac2c9708bd1e598d82bcbd7332ae1e6079485528e0504b59412a226bc63c927b8c0c69e493462398c28c433a40886055364a2c6c24ac1bbaf17b823d1b60ca68c92f67433ee28881957b8a657e879637653175c18aade5647a2ee74cdd123c103187b518731bd902e428bceaaa0e94f4c16813621f9466b45a59f8e046543c2fe18bc7d2b601d3daa15f882e426a1666073de34ca9efc5beb9260fde214b2ed818a716ae54d4af1640c62a836b09b43c44fac96e0c6969ca78d00b40d026c0875242d0392e5e29998b7c034aaa05b7f191e936338049afa2324885775575dc1c7ebc745de5887dd5af06f3751fc79c5050981ab211114705d16587beb9940ed98c5438c9da6cc2e6d743a3b4090ae67b5a14c6ea123b855775b7b781f6b238aa2bbb83a6a126cb997a892b1790c49a023dd0d2636cc13ed63b7a1f338821b60dfa5748c5e93abf452429ec76ab43b77313485019beea5b6f2cc98a36323919a3c432d12914f211900654dad94315a2599ec55c93a8865dfc68eb32c9f7708daf448408c635c085332e3248aa7c07ffb77fe0002686b62b0bd6bbeba1ad2ba9237f524c7697a5e89cc670577977d6b85894ce25301889f1016bda5e0e282ddd516b61ec4fb274051c6c07cf15bd6294364e9a33564b15176996717104b408377ee34a5bba60a2647a9c8b401fe694890c08ca9c12f1884fe3617bcf3c880dd088a3f6a3a5aa27232a4ae8c874b978c010c776fe842ee170227cd5aa334b41ea52047215a0a491cc3ad954495817097ca9ceda0849546f6e0032f7cc8e9e584b959909acf439cbe87e9c0323cc32663136c51abc26079c758df38e2c2729b58a63f90c17076c662f9c8d1098a08811a0356a9ade6b0ad8f220e1cca870a949ff8a3cf860725595a02d58a6341b222dc48c56c0834a8498970160bb7527f1024dee02769325a8fca95369fac27bbc7ea43658c7f891a949ca9ce6cb7b029d595618e7837c2923c8f2f95e81600b26f5320c0a3616dc9e3ff150b1250c1b52c53332b7dc7aa8aabccffb275ce4b1bd3e0c3152d841b7bb28326660c955618ff43a749734527951e417cb780a7226c1135ca4359f674840c30030ca16d2483cd7a51a283884d4eb5b9a752dc10a24c064a6aff9c19cbc4ecbd7b3b0b642e4bb615fd61265e7c60f81b341a9a50f5136827619d91bb3d958b6c3a5b5d7bb93c207aa298b61ef6bb68ac54fa59c37d6c9440b714faa326c78b43d59f533bd80a7104a709d61f95cc5bb37a8ba3f7d376880d805bfa9759431a938417a89572a98236d17de7035e342777ca92df03b8bf0623a03c84c33fc01b963e2065a78003fe5e675f05d03bad55a85a8927878585d61357b744c4f64f21440f301a8d449a30d5a18 +ciphertext: de374fc747d2eea9c6b5760d2c4c8949a641279c50f1bb01673742a582ef761ad6f527948a32e77a10f731adad289e30a81106c0fd4bef81217c4cbfde4bfd43889c016b13d4fc3c20472261b635a40a77b9507e19598a1846544580cf9e25845378cc5148395cb564a4ddd5270233fd3a8f11c788715fced0ac06ee790c68b89f3ee8efddef02f2c880ebd2f94039a94d25a4642103cc94ca522ddb443ee589f7967d2cd52dd5546723356b74f8ddc270291b5619f15a2fe2502e099927c935fb44cbfa2960d035cd809abd70dcc136de631c812a65d0f7fb9652f9c72c0ae61d45b894d04d56a668f828d4fe223e62761eff354811e3c24ce8d88cf466a8e0a1743c8fd8f4f4b9ce2130a41db05e0fc62b68bba453a1fe846bf90e45babd053aaf6d0548b2a97534c1eae8611bc3b15e1cf6edf719adc5e9cad4ed50fa9a9ceefe7b1ae9b7e562eeba6c1d82e9d80128d2dab6d18d037edb13e185d74b9180761d881fc21030546fd2a189ab857c55a2fe3afc768ea009894a5319075465c679685fa926e24e5ed8e35db073c43ad636f8d039c6441d48b6f7bc31ada9b2955b4f5d64ca819c2e9d5026e235f9efb3e32a98fe0d8dbff1150661148d72dbcb8693b381df3ff6677cecbfe0e6d1c18d415b1822fcd1887ebe0f24f04c07d5e35d36e18b840da79cafa3e48c7043ce3f20610d0602a009b7fc4ecd1b43b72cfee6ffabddf251c6db036ea72a15663867ba9c465ba864e7e52e4905c69665ce12dd54da53a07f2c779c1fe306a453d3ff3cd428623d16b2d4349dad5b325135a42f5ddfd6112aafee724e9bdba9dbfc2cfec3ab08c45593e65f9d33742b980852cc063484afb3f5209ef8ad7a441b51d35fafccf3d15e9ae77f0a3019c742412063985b1725774106d6b47ab1b176cf7f029f7435c1dbd7c1beb53c3fa7d028f3ece13d86584b03a680b81538513cfe206c6fb42bb2f73dc0491f85455aea06478ef49ecdcf7177960f31ca5bfa9ad56a0d6d7005fca9c477868b90969c2aa02d1ed92eee16ed7ec38dbd0264028a66859f6a6a7826cb879ce653c3397a1ddb4c7cc985c11f6b9c8bc842e4fe424b3d32e638a218b17d7c6eea35bf8ef40d6a81f4023d9437b1724ac25591eebaf8a54811a70d4424c9e44b88a30c27f8338399666c381165ca715e965f87bc764f98d897beec42d2df9f72bd118de555a9dc18593687ee79127f0748601bba7638289b9bd5e74e5e217dba7181a78f6a6bf2536a867e3976b5e12bb3917631655fbc268b2693cd2e8c556a1f94e4799331eec89e46cf17f1fef00f49a67af9114cc3a55347dbb522d9d5e0498437561511e2ab533ddf58adbcaf94c48e5135652d2ef9071666e415d57449c2ddd4bc228579b3ba07453ebf80e4a74ee867b8e1c5f15e88880b830d62218abfa4571d0caad89cf0a609663c1eeb433d71692d7aaf370b83c4a9b99782382cc0ee86b03fd1962f79d1058e9cbcb99a3fab011e40ad4315d1d221ed8b1aff92d0c01291c56d00ff1266d50abeb188c47cd405dfe4a8d01e72b5f4f4ce31afc7685225457e9927ccd8e152869ee0eee5fdb10ff7d5265246ff6feb543210a880812dc3bcb80b7d26457b0250d4fbb341539b8f1fb97c38a0ffaa3ac3cc9fe2fe4d7c62ba2a09593734ee849dda1a0fdf61431c52f1d611fea3f6089057b2b0f6c8fc792ef8caafe567d12107dcfee6ad6b0b67c9117d6a5ded0b7bb7dda5b0e6ca13b7e7176e04782496833689e72112c2870939e5972fc1df47d7e3eff50228a2bd753037308f6db0101bc08f18f531de2313abdcdad635fa1f773cf1948cfd9ce01218ddc876451c350c391efcc8b4d42b3897207d49c6d101977166ba7f75f3ce2879bb31e0f5dd7990d7878bd13d8d791151dc3934ed3d93924a02c6cea0a045d270eef832206917c920439551dc94224208ad6570fb09ab27c5cd862f954437f223c8ad3aa3924e7159e267f7793d84fe3f5b5d5309d6d5cf74a82d40424ed2dc318c6868470798f75d9d60d48cc7716f1bf7c3d3fccd637b4284fefa787e3d894278576132dd6eebfd103090471fc89e5a8a0b368a7238484ed9da1aee5b16d33ca19b8285a2c6ee50581345f4067f6419e56cf97c0d00088333adab0601f2b11e2f8e09acb37f17c85bbeaa0582ba586cec37e961f9424f699f55355ec300a363706bf59b +result: pass +shared_secret: 8f9adf2155235711d47199027291eb4cb2b2cfebb1970d0d436a2378b85486f2 + +# Random ciphertext +private_key: d4a1812bba91b358b3bce85ed4c2145808318f664df0b9767c1949c11b346ee753049bccf5187732e3c964602a73f05b997844feeacc0dd084abf37fbf15a53db3b846e09a466bcad57b3bde344722b13d375677cf4cc47f750e0df340a5b669e235cd2e007cff8a9aa7691c60b3c1c3d98f4c27b068bacc1a341f8cd4672d0b9483b580de142df7553a77096a974c252d789110cb2d213770037b5746a8aee5f2331d8b10c0da84a2192575203f9623827969cf89e05dac178987d0796755ac34782f7ad0430e61374b4b7a6956cb088907eca39d6edbcf0a386f9bac0d9ff563d90bc0fcd45c42b8811abaab4308332cc2c4e838b6d064724fa32bb3a6107491a960832862097763b5bc0e29cbd8f823572a73a4033114136a202671594223870c21fd158d69a78d47437bd67a8160e15562260b4f8c368c61335e504fdfec42ef5285106817d8c52e441aad20bc79a087cf74069421b71030763a5754abadfa3358da0573410bd74761f280b72014cc471704c760b14a1a2933a16de2648cea094bc8d8a2cda1a25282cd137961d7439a67464df1955458270f2a5775c0f2a971b509d4cb454f64a12cf70a0261b93d737a172a06d89b40ac69cde3c80156fb14225250b3b79c9de834fba14bef33bd5e289ac2499b9cb926a4079d3d030b9211aae6d4bf23bbbbba25a3ce643f374caaedfc4ac29b8e263a3710e76b1950ae3339b937f20d61e996107a9ab56501c1962831d99b8f31670cb5609c321cdbb353ab123059a32711fb5407d859d8222b95f7b3e0a5c8039164280640a0338df3e870799c737750545c352dd90ac1e92c19b95583266216bb3733581c150033997cb76e4c41105679702f289b5ea19d6225434727807231c6fb1b4552173ce34351c0359e2fa5ac5f4c57d77c2ac1771905d73e2b36a2b4b34f68b75b2521773e93b98a2a50f1a1c5d4865cfae1114a93453059c78226053984bfdce2c8d44a57113a552f4609bd246533267b4e376f4cf26d0217683af72f2cbb426f5a2290560c583ab54da17866e53a594a6f40d36fffe89ba580aac588c9315bb76432128fa66d8db61631e1aae47a5eb2b8bdbdf74fa75617203155ea98218836502605011da5aeed012939c61ff46574f28731b3e428f8f4ad87dbab98734878d2c11dfb6c4fc06ca0aca525b796c310af246685403211bddaab6300b70c001bef580ae0d63315e8170c1295adb02706156645416c1f1710c334cf2d4c0c5b259a68304a0267294465b337bca695158f3e79cb403730000646bf34b55ce998298722e801ca0fcc0ed227c1427ccd5da22e5dd723682942fb90cd79c12a9c1abb651b8dc12b0502e292a3445f5804bf1325262090b4fd8590ec0660b2392f1876060bf283f771309b567cfcb18d8595bb45aa70de45290ff57883e867bb24c41a19cb3a424d70dbbb9b0856e3286c3bfa72fd5a54943294b5e4aa8afcba95185c64d97c97ebbe1385475647316ae067cf59a1bb6a649159aa2b2124b82c8167d6ada9f85402a46db6bb736e47503afa45e3c830078220428c7c756b996dec165833ad3f7064e0ec084a38a23c02cee6d1135128bf59ac4773d036ad6529943c8c8361517e1b4b2bbc4e57c482b3951e0df04b7c3b66a512584e9408ce9c63654b92b68a4b606c42ef629e3b332d67082ec2c89cc3b24227e88ce2500e2034c8944294c6e47c3dc0a50ca47b62d12546960aabf8852d4711bf177474e37786867a23a69746dc59677766ccd49df4f3718d214bbe8a6aa42c5ac1d21bb723681bca9788da2f903c71da5c55e98b5240c5a8eb826313271e0a3aadea6a390d23248a29402de7611ee87b73b269bc75359c8195c125b57f472756969c297a1db38113d0281a70f51b28a86f951b2ac72c0242256edc92cf84f2270cf8828ec73269d7633845c477ba2097c132fb19c77ed1c5a0d1749fda13a69571b6f2356990c916402604d9169f146a9369ba8cf92a5c6760d69b67797791c9c23037b433e1559029cc7cf5a177d353a06b20245f92089f696ac8dbb5d2fa6a3838533fb49c62a2c33d463d02f7a658c648936a1e09394d5e8cb0b79650cc472cec977c44c70b597c596f889b00a85aa9757a2cfc3eeacc55b762c59b0453e990600a970bc4a9244042603c58594455a06d27bddfdba3ee9b0a9b97251b450ac7e08f1b6b832453a04243a1ef15ce62a7af72f90ea03485fc5c38b3425dba526bfd412321507ee149088ab1150aa1c2be1944e22aa8abc092ec925e35226c3ea25045922cdfba17b9db21a3114cb65c63f271776dc1246db2af97ec4cde9a7acc8622276538d653a984e86e007b2ef3535900988208423b3ed3108811a31cb8442b92a693660da1a92012373e0816189c9bbed67c70f993c22ae1807a093cafd1b4009ac6c3b169d14308564c9e752a29d4d15097d82456d78426286c2c938e183b291eb90d9e86852208ccbbb52a9f22c1238a98e3481bb9703b93055d67e58396350484026ddf7b2df89a5ba41705d378cf0e9881bd5896076a0451497baa3a94bbc594eeb20ba3b4144ad90981193bb57745893a5897487bb6a03c2f427f9284093f710c93a91bb47269339a8b4d2c0056984a653a96beb630a97b4e38e697f543af9278ad90f7846537b5e8a83599970f5d49af36a61014e6c8e0bb900c8218f6a9ad69a397b3f33a4e470d0d8b761576cf417c24a6a83192744853672bd2c2c4504b4ac4ab488f5816c46912fbc546694209ce293a6e0774132c2a7b195ab75c45ff4c6307390ce5109f36019c31363103799b2324a479f8415b546bd22832793837dea9647c7b320bb76d2c5ccd606c250087515feababbfb9b3ee5b3f6816554278b90850f34d7831638c7c4d669cfd9c07f4367055c384db80a3a0b9636697dae9a30ff384e947293feea9ccb673a573170dfc258c8c456f5b188de355050b524fe3c6a6aa20a876b729231a6e8b9ca1fb5769fe7cb5f0881009b8187f97c6933a2c9e5b89aa66f44f5aa3a5092ad0368230c75ceb187b8a449d6e8b43c56918ee36a27aaaa5edc94150b536edb1cda742969783d0418758c9a2eb97415eaf2b283248b3962ad60470540986fb787a02a954e68bb4b064301d6303fd8532fd355bab2a6948c24cbef679b7d401459257291032c47e4107c79c67273b4ac1a042978bd18574c24a99056014a706c8bac74285b2920ec5533dbdc853aa14ca66503a966a4aadcc8e26278f69291c8f53655e9a55c139cb3f95b6e215437c400646a94f15a3b09f2baf544872c594dbd1c6973c8a11de945cc870900249a57d10492c0bf81d684e71a80ca429408044d9ca0425ea039388b69139a3a06f2ab7c808d3883cc341a5651a38e398216928cceb003abd9fb69995c06e4c8c9af05946cbbc8f9f23e01862f8e92435e4038c1bbcf21ab66cde656e4968f2d95a0035923ff845afbe2bb8174447607cf91409edb05b252f5290d84c087411d5619130d2aa15ed5a55d83b804f78687456a67d0c07bfbb04438365d7b194448c46f4b2273c06fc87acff6657da0024474b21aa45255a156c8ab2220714bb5de0c0a026caf2af24b6b80c431404bd7d18615ac94ff3090b63739f455a56be783ea4cbc4d320909e80cf17933e9d5958a9a76cb057e51d5208dab988eda5b04647996453663f6c07f516ca8fc7986c15486e663d966b7261c2fe319957e8c67605c5b71a88476d5bd6d09a76e937b5dc12a0d048d0c7ac7584abdfb7297f9e956e4941653b417bd59832177874fc49f8a5c908b2b7f038bb0e9f55ade47997cd805a5c79bd1b582e82b0138c4cdbdd27251a9192705aeefcb57cc31023a9981089a2b005a616b4346c5458fb2604bbbb43787b289e676310a308fb1e434d1c4cd22e9cd56777f1780a1e8989217055b9409949d542dbff25bc3b1c024d6bc54f24aeb5a74e68449003628e7f001a19c00e6b52c8055ae59f37cf7e412153893e22489069a5491d27bb9ca4d26358e731308fe94343ac369ee759fcda279c5e58e979cc59b2b523d466b3a8157c6276e118885be34c67f8cbd2633129e97345f266aae38bd695943bb70b61bebbe138274da36c3abf6a73a0630998512f18b0c43d53954e33f80d46cc2b49dd39396cb8566ba184504a6c85aa91643e42e12981aee5308d866c3cfb35e08514b323328bee0153f74b9eed01205241c49a1a100701087e9a369b80926a26743ecb25d9237fdbc8d8e267b02815e3df7a80618435d13448f3b9d49379bc4d5a6f4599c235645c15c98e53902ff92595ea2ca327b8ca8166b580c0a306630d0d9290bc92736f62473eaf53df22da16a1ccdaf3eec880f5be87d5ca3aafabaf4aa1c25c103cd98489100870050737de707a2489119f9229f914211fdd9634c7049968d7ae4cd80c10e320bb6c694880425a513d1eb1d5e90a608e55e6a3674e31d50 +ciphertext: 4ea41466fb90c96542c58668800024d8ef0c1321ab1b6a2716fd06883354ba9331d75f3e02953e60725c42b601981e822833dfcf6bf2566e42a617cef05404eee8f6d0040501b54d519449017f985c9fc79994b9fa0c98ae9b953531dceac563bc4089476fa6fc8a6372427092b975e016fa32a3e0fe3935c394155c7eba7db71a06e26d9a0e9677f2e800bb00a9de6e1a5184a2fbb528493de19453ffb92624844243f6976eb47f5581b827ec07b5f667b54eb0029d7f6375e64e1afe9d21f81bce8ff1198c8380d68773bcf0fbb5bece87dc76f4beb583eddb9f55326b409bae7a1b81259a1d6cb8dc980ddd0a84f543f02a65f1475b4be47a103a7fb80aaf1a112251435a445e4413fef3a2f9beaecb947828011c4c5343874c475e107aeda38e77576b8c43778469a8c9ec1a2f1cf3a64d20a1049875158728930077e5197928e2745ecc62b7f874af8e2872a70bb6c8fccbecf020f28f448f25900be52410f66f7d9e16e1b36f9f57324b9a4517c4f5d58b4db4b57e75859f94a94ae53a09403d9aee91d41e349a7c8fa096094bc5cde588b6fdcce903922c49bae5c197f9b918b3578c706868a0d945b74ec58baa3181a0d7868ab7c68e8496ddc77d0de0e1886ea51e37411d2078578f14ec95180d6bfb7099f565b60125cd8db15d0abf8e3282ec78bd37aaac9c3ceb4ee36f41ad73be416fa61eaddaedb2a1cb82ee165e619f433b4539bc60f95549bd3689b40022af7eaae687738b72d2072cc095b61594ec905a0a5cf76b8ce803e9f598e2b0373610040e172640afc60a431c04aa376601a3c4aef9f460213bc7c82ca3c1017b657b0539ab635348df5f4f20888e29e6e7be70c89a60ace9b9834374adcb7780e12896deabab24c02b4afb19af2b4e309f3ada06f9a4a5200ba0134d26c752cda1cc15337ddfb7eeeac7c2ad2984a792ad24c1e653b13c52e937e2672d33a01ad257799150fc815d2352fea62cf1630cfd01f70e2b90f295dacd3ef9f1efd7a0055c7346004c7dd25b3d3a8bd5b9297bf73d3babc9efbacba6de8cac65856690bfcd270411e6eabb8c921e3ae797d05cfdc73929e42aabc28fdb193865462f8dbf7b455f5f9467a542afa534ba03cb9fe3c4c0dc7400a38d2cc03db897a978315f0b8261575a9e5912a42436b77fe42d7d05bdfb78fca4790a6fbbbc6058967c48300fe45a573944bd1d2d25b0d4025fe95201d774ab92cdd243e1b934d67bce29c750537aef96ee63b624ae4b87425254cd7f42380d7dab440042992db8b966c2971cb7517b6fc833f296f6939036c72ddd86c1c0d7ab6c54213a0e103b179bad5fa2f0d3d15313e96ca2623bf9c91ae30cda87bc181a7d6ce272aa1774cde9b544a7f1b4f519356616229fc62e6b7397751a2ee4e45a880584cde5fff47ecc52e8ab8e030c408c484bdaac223b76fdb5285626ef0874297d0ea4ae3f9c034e0387f7ff53a8771eca821cb3ef544712d1b8e144a1d6737f0b119fc692fa72b4e423cf17b5ce5f7aeed53a3ab97504d61eb48a85aa723d4e15aff062d272d9fb6ab7d54eeecdc23abb4a018d76d9b029c29230428638d32e47e44fb544a68d9fa20e8b3d41fa1425443cbe30fa48189b5c6b1828d6e77acb8943189d9f5e9cf72e22f17836cf7c77127a0329414d230c23edeb8f7bcd33612f64c755dbb6bcec3ac1adec2c56aaddf27b88f40c42a964291caf2428b0ca9a451fd496e6389aa244953c38600cde263878a23b947ff1a4920e2ff29c422ac455e7ee36f47e8aa9275384c60c34a62d859752fc6b630bac5c69a252a78da4f318754a179b77fb782ca109c215fbf4d7b040cd5fe78e6e129be318a449678557830cfc2d001cf79c4083117d41de49b4664baa77e472043d342f5ebc456e493104c66973cceda3ef07f1f1ef4b8ec69bdd565ee373dc758cb88f0f3aa9d83471ef95cfefcddfcffdbb9f907ab7d59b006e9b2e07b02cf6689b838c6272ec0cc0b33b79f2fa7b8b97c100ff5a41581b1a448dc897023d497b165e72e3967021bcb9c490b6a258fb5eea351b590c4c053726dafd8213d1d98878b07bc460469e313b5289d0d1dd07086ea6b1772143124f681fc448d2c3d2ccaeeac9d4646f1b64932cab2e90e5980b86364a4d7195c298c0db16afc2b9b434de3195302a355756fe59123cdc5d6084ff0c4a514abbb5055a9d9ebff9 +result: pass +shared_secret: f3ba1d5a1d96a4a59e87131ce0ac876b5e190641efdb4a709e72a5b772d68459 + +# Random ciphertext +private_key: 9e456a22e0a2d50662a61ba014690196265e1f154c1513bfc5b32f19fbac78fccd42b36bd9f539d4b5a7a2512a7927681c3a1af0c3107f7437b17c6b25542ec541c098f202ec3093e1e7139eb7896c611575962fc4d0984ef73429d25972c52bb8873be758643e367a7ff61513f8845c7b4c268c95e4366452d918f3d1b2a23c24ca6953cfacb221648e997a1ce3eba7be41a9fdb3c63fe39e3ff95905a88457ca199b669a58191b427218c39613eb094218d4bbafb96a6f6b1f9ca32796d52d1e01729cb389a1053d66f211410575ca3a9291959e99dcbb9c615a63fb3611b4145452612603cd924c4db5b97db3524e5ae1a05769b25b067bd1a9a1599515aa72a4108628a74c28e8e001d06088b94c1d60b360ed46455de44429854fc8c48cccb87269a13a31e12127c335ecb3152c97a1efca7e0acbc19f44b9a09a170e1cc9d8956315b145278a7edb7232813681d194a47204addbfa246af5ad8f896a7db17633f2353552a97c475231b91034b05cb7e01d951321e73b25c59a78efe6bff82241b3913bce05a94a67018cb88281075048a91d8b40b2e32791d14b5e47cb43a4ab7fd1ac0507872455164b4816ab6e38a284da2efae81034316681c590a60a6d94ec142bd4b87fc884c7989551cc23d4ecbf96d6603e41a3a61a99c9575d05a05b6914b0cdb399b3b235c7f9b129427ca5dab283943721db117a5ba3aafc9200f11dcc3325e885a46576461642314cb2a9b36c2160c1427f07c3f731b2ec2b4a1de0b9a384c61f466f805143ab81b7abd8b43001cbf1e61cd5e119b0701c82f75f9e251783cc38c95318b7e946b6586d9ecb459eec03c168047957999dc055c0a2b38e0382f10b0e41495ec1b6976dd05e44356522053eed725506cb996ffbbd9c3a9b337c7fa07190c1dcb2dbb96ff9840b8a7828b709887ae6050101a725597dcf1246c217579d176857557e64923f829870d897333ea9c686ea58bcd3071fac7d37eb99b37b6840ac03242b51a5971587a46ffa53bd611c5c1d8083e96bbfe923a3f042b96051846c698674e8389c1a32a5a45e1cb0928a28653f2a6b94bc31fe5b8e864935a2666487470d42c0bac84876557c857e1a4116d6c7132840d223a7c4e3c88474aa10621bb4166edc24bf3df5ae47a876f66662b8c3700438a31f060410115f850000a91688759330284482d77053ca8a44d097185e569c0e3119c6e5b33234186e52aa93b9bb0f4bbc22acb32969b853da37a70588adf68a599a471daca73e913ad3d9bf64882985933aa5895ca7a307af58522102ce872c91d6814bc3b1c78eabcb2c739c06c54d82508a158227cef9750698292269449bd011c8ea4fa40a5e436acf935c776e555c5e953d12c15a61a6716b61a280731344f2c3689b6d44b5ba74984cdc241dea70a99147be3167b0f9f3a35a442fdd44c47fc386274323914a608732865e60a00e34230af7acb842797b4219930bb640a5bb0f1a38e9c566a1530f0da4cf76a391d7073425c21458259691b01d02244e1d656e91677c78125fdd89436a0a5af9baa22150cef9f796d25ac5fdba048dc0886fb5a2872187163157afd1bf3b6bab48d9899ad7bf741bc13ae58579b6963d3251e0f478929b836c043719eb3e9fda1c9d954c0d35647e948e94614c6bc0c91bd009f4887b80e88ae6c79f038c9507b21573700f38f93fc7f07b07b944cb71345df68cd86a224524bd75836408f87cc9077ad6d94f59dab0e50b36081c33fe92cdf5eac9f66b5ffd6588388b0711a5cbdf0430dc429d197c974b9c76a9317850e7c3f4f8c8086bb1b3fb9a5e3452432ba2789240b68224d3c854b29196deeb7cefa112ade466befc5c9d601bd0f687a7499a86b44f2ec86435f78feb4a68d167cb53caa78a8b89b9147f10a93f76e1bc69eb4cb09320bddb20d913163dd0176b54bf29c7af57a5b3b632bc27427d7501493576b342c10f81057cf11a1895e0cb96e415a1673058ec52ecb0c129968e9b5cb17cd19fb293173ab28c7be969677c9e309776aec124b4b8ae48740dcdb154add851f158379754198aaa4c19b4925fe9747155a9f1572133b688d333c401bc68aa7290928b2190a00649b9ad3eb9710fe78bcc978192140059a1729612a653b79e3d099ee0b0ad021432b81c530ea6882083045653822ffa8147d02a40b594cb18a44867571786b14aa690e1344324ac43a0b16672972f477441b3c47ae06b0259c0243c48c872b41fb5197deac49b9b0334aedc02ee9aa8f7127ffaa50c69e0b8af91b36e3b3954f8c2791abc0e175aae399777b83db0208c0fbb0ff95a998a1a0b8e9949456b7c81c4c9234080956576c1b94a01a676f75b3a95accacdf283ea4b88b3e99e98e139490b856cb351df70be59b1069c56a5089c0f71617fa9265d11f3465b502e03b100f7406d5203822a53a81d5b0b2aba815227c92232a776d6480d5c7b53c34b61636a283977adc9bd710885f6702b14f808bbd691d22167fb72b4b830a2992c9cc167ce09b518daa453531233e766be36a1ab46cc17f0e0a7f53791e8ec8471894e83a878e0b2501f462fe519076fcb2aa8669caa271961e156b523acdb566cb45c49ff656e61d49e4417819ce69e7e2a224c6043483b4728509901b410dac08bfca59ccb693322acbafc7b25944b1ff514cf9389470612bf6ed73a7bf61eb2004b7ccc6b07b9b7b2180d4271c03524ca5752050700c40bfc545bf8c01e4b1bfb3b1c90314c5b4a9916e0a19b234f6e878e04da4b627b0d63c5836e587423367cba885de0a9915d4367e76467fac6b936596135f09c07a077cd2774e8e879e48b76a7ccc8a0a066b8a9c4c7905052f0c43ff6c80630b1eb488f96e1731162a38950c77b7509252ac7dad64c44a34c0c8814446001f950503ef84b64408dec65c2d4478177dc4519798695d17b4ccb61e204bcb0896ae94c36aa3a594fe67ee5008b84c879463babf49a8f67ac13a28b4a02e81cdfe8a7b96a88ff560d3de53d45fc8af799ce21d80d978b4efca00e0d25af7ee41d847b9a365c516279a6e38957f341a474dc7d2297c97f65288dc569412a1d91226a4e569bb3bba427c5ca71ca655b9c3b99cb14eb306e4c4646d9173b234c8ea1a342c526b39e356fd76b419090348e1cbac34a5acc37096b936e89d09566887136c71712a69184135a9aaa26028c306ed923ed171536f1bd35559aceac0169113e57173c2c4b233156c41da276f02c8a177565066a2fb6a662a2d4881b78c457b50f5c12732ae86ae14703708184db2719ed425c4ff9aafca826e456a1057b71e1e2cd5cc7544bc6c255fa6b5b482025296210b76e4554431afc2589747d411481ab40c0cbb33086065fd070983b7061aa8a289ea5c23cd9ad3ae3553528931cc6bd2fa5063e0b29d7d64d15616477972d15f19ec0d371e382561ee4583ec4839b243309c00776179eb2fc0f064252595644587cbc93131faf9ab7fca924b0e343e12b5c43112025639c11fccd50718f15b77fa72aabe4009d0e878aa5834971540342dbc7f5c4a495d913e013bd1b3577d2fb11d471234535c4c4c95d49f8b6952742ff66a2de694b6d9a4b0350cbc0d6cc0a031e6e66c696bc24f7836c0672964a1c80520c1ee18778975682ebd72c69576c7906740e425c0603571139249e784dbaea2725d01199f8bcb185b6da15901ad6726971183266b5ada07c15a44c48570227f116f7648ee2c977938342cb09a75e1a402c11857797452f36bb7c776e7480a28f211ce80523bd8c7a26b232a57023faf28d607cc772e788258bc5ace87c4d50729ec9ad09c54c3bf94abb66ad25e9b12d862b981a1529904cbea775aeca2ae7341a96361cb1f1000ff9c143a6b07aea1a2ecb0aad87c4d5abba008673a153c3b0ec9b8c100f8bc789dfeb9e09da6be89b2d56f71f92b811b0110b7ff12f160c9d68ec5de40312ad9299c126c0ac52985f698886822f3beb4237259ec8f70f0d29c4d19a4162a40d16e047caf02680a54b229021ec890dc437479c94a7ccc3547e1cb95417641bf3a9e2c375b01636de564ff81739a4f1acaa210413b4592452b52edca0bd925c998b63ba4b680dbb0496d65ef8044aa20893373310f6b84d8de6578828693af0c46ab0aa9a19241f725c7c9c26a0f1a8292bba7246bcf81b2d9e45027b673ec17776f053a763d619020200a450a0d9c0b079ac85adba15e13a0e2eb95c217c4ac4b951769160ab55b9c7c942a333642d888c165aa30d49c038429fbcb55780480504e6184e046daa36560d9ace91732119887f93526c34a6601d580bf31933a0318df8615180db802a8c2c418c318b9d8b66b979807791404cf8ca6d09584627f1a500c43c3709a113d8627dc02533a4ff283e345bf8fbc6891495a364baeb892fcf8ff1f4768f1185f4d6be77f0f8e564e18f5c43fe41d6235ec7768e33ee28be943c5e0b +ciphertext: be1c42f1169ab5cef58b12b7c674613030a5f8012d2d49cd11dff0037d19bd9d7f308a4b9672171fb0735e7eb36b3275cbe3dde4c5b7a03f01d97ea48ce9e8fd97d5af0abde80a82cd8d2b1d3c6b60d7f606e65c207a530a7a4d034286c02ac7b51a7e53eaab6a79a69596fa6455e1db2e011a64ba3a83ef73d6198028181af4352846e2813f8eb2a911eea61d2d98cd2a68a5b6f87e0d70f0abe7a553985715157d641de7ce14261d2a0380d72688280a3f7d09eaec352dc4b5f0c12ecbba73bccf18636e85328c99510e762f91633be24641b95c485ab0b26544fbc185a3d3b49f74432b95e0858d230bf86b649fa7ed34587bd77a297e64f8f78f346287a567a2564a895f6ab3adbad948b83d3f8fea56c7a7c78035cb791d9aa987983aad848380e0dc2421150d122d59b080eddba90ef249db71d6ff2b198bc8fbffd31b1571c9e6659ab4d784ff6e0e3fc491a65c7bb461d51d78c1b6d27f141e7d62c988db570caa5e4cbbc5e5b4fb95b0a95e1496d8ccd838ed352ad6b6cb69da18bb75b0d2c7f6e8c46bcee21e08a5105ff634c584da39c0479e1292f7cc699d321c030987825b0e68fc4a8985935b1337ef9a1643008b194fb69a80f1f97528cf00774bb95160b5e70e4792081d81d4d9548e74ebd67725e4f97f0660a59e86cd9a13f0e1e39939c12f596e191ff40a824ce3680c80e68e1445a8dd5684fe4853568e84ce7052d0cb8ed38fef633a05f4aea017eb35d8864891b01778a8f70af45ea9b288baeda6407fba5a6a726634fa2fd15c41a25fb82b21f15f6afe64abe4d62040c35204cc740036aedf1d13c53c4288fdd1be324bd464e7f2731c7828509171ca4b3759d9b9f54de869a575b812675867af98237944f3aa451b072806b581935af8611206db9018a17e334598cc7f12f8a769e034614e094afe0485244a474d2a61c0edf84a1eb3d360413f070e970c4c45f75096fc2e7b1ace59ada18b2cef19c05e96279dd89709d97471d1b6a1e88b8fc1d881e43a4d86cce5f5addd0d00cc9b522fcaab0aeef4b727e1aa132bfcb6428a3d58a34ce60d511718d564a89b0431abbe8e9fd6cf2b993bbb6ba5f0ed6cc399bb8312c8c2c60274bd70550ee18fd4b7bb0a8597cadd2075d1b7babc66c20d1b54ca44b5d687bd8d16917d08e63fa1bc0fb6478d090bccca83e87602e668dd3f056a8116218f2b08365f86ba481379905bb6018b54c5e6f9e160495f54ebae84a86bcd5468ece17aae829f83c3d5b532bdde929b7e152396f84f0a6e32111b262fc8dd968f7459094c25a89b37ae1ed4d91ab62ead3ac3b339acf0b9111d450e0bf380efcd6717679270c90bdd07f0b9efeab6fc74b19a86cbf4777220a9c6f85e23de592195962aaa2412c3be4ab3daab3808bf917a4dfdcb9cad03ce757efdccbacdcaa6f4c54f849378f12574773dad111d80f503fe477506982b3b26bceea9921b5bdfdbd22328172ba15256fbac74efd8ba037030994a70aedacf49a5326d30c10003a4e93ef334dc83d607631442421a45336deb2b344a6fae1e9011fbb150a4dea94376e4b47924a109bc20e62e8571afc012b6a3b2acc80e30480341a7bfd88209775ae77bd199a44801573be788525000aa77735865adedf0090f9da80a8e76114e8219f289e5d95bc56718548c31794784225a15a4a3e8820c1aa73b8be2117590082b89e904a5dd8c37e07fabdb1e1aa1f83bd1301705a82be70ba0cce458eb9a240153bd8775104fa3085da878c5b329e829c1fc5e344a61437610eb75a48e7b6072c207f2cd909d9c8bfb9c6dc565c9242e8d9cd1fcc9f31bceb77aca0fe1adb723870761f80a47d77b1126882c278145da3e1212a3caa4dfe7724b1d3001ea1c9db9d40b367661052ded65a60b1b5cae2b5b9088684f30d707b49f4212e5810d2d1e00a5eaa67c6acdfdd35e3959b68219bcedf4453b228f02da0df6d9ecc2f60a2e23b6dbf3f83798cfb16c611980dbca7ca713a042b27e435d35b56112efdde5a0bb49db415b0474b8f577937944d555d1fcf9bc628252c69e0371943dfa8ee6ad2e2155efbd0eb7c05aaac93445271eac4a52cb48aab9407f2f727b24e4edf3a98996ea0e245159f1133d9193bb50ca177015e198ddc577a219441fb4fc0552fa50fd962c0805979475ca5a352d467c5a63d74ae7cb028623096121184ada1598ac5a56 +result: pass +shared_secret: 0875b7ef9a48d579171055f3551abd33943150d6590d4abb1766b7e1f40a58fd + +# Random ciphertext +private_key: 20589c2d3489a2f199c844cf2ea7b2a4d08e2b331fabf98d201562c5373cb6a60a5eb9a077cb973d89371f348216f22332ca915f784176963699e11ab0ec12fc0a088df3058c704235280a735a4d325a0886e118fb966f52e39d47c674561bc0c196b7922364ba4c42b22c9fb392288bf07779e5a0842b703f02b5a4ac35b842bec6f5cb3b2b31e95675420363c7d6836c5aa67ca20684bba573416592b6b85583568e24213575c5a9d372ada5507d1910dc7127507c3be01ccbf8ab1709eaa75d293df436800d27b93c2025613b9536201c09c45f01c4ca949c8a7512a2025025560511a2c25769093b07fc5fc610b958426e32b88e3f875ca4354a46a8cc674b94b96bb03ee118a72b6a76706e56519e842b3593e86cd6606c3fcb87cbc4cb36d5728f57863de50bf5880bc55345d8025033f83a7e0730e4443fcf83bdea9030c3a9554dca5aa46b29709a797de35b2e8b946f0bc2f07154fd3b2eaab27b4d9437e483bf26950691017f2d819d8bc09f5892405671be7fa51cf45b31766020f00a7ead1848ae79b0f1170871461b58cc1e0ae9c829920365c38f7fbb9f87508ba5007a12518191a2cb4ef46f90d05b69dab6cc4a10b5e49f50845f1e65142b0b7b9f52c40e17314b7a97d6e803732203e5542b4c202a7e0b69e6028796eb078c1062dbe8c2861608b35c02b2ea252eac899f554200b291ea80744e73509535a945214264527535451b43b11261d7bb9a6363a9c1aa8e2a9e3a472a2ed726eed983c37075b299a6c94a229423add0c30f23faca65676290548608789d2e279dd68b531d3a7dba63494318a7420a4ba199352f911877db34d1c2060c76a58bc8841dc039ca1932699c3c335b65444b62fa9c4aad62822e7345cda26f163c44b5c6055f019db2f653a708ab8da0443ba5997a2a16bcb7a01f446847daa63804a7193728758814176071dbc17a01d03d611244bf14c1ef1306fca4a66f68938fd816e27a00c8d77484d3ce87c69bf84783c6a9acbf851de7240622da79d09060f1b5003042096db562bbbba370971c0779645db9b6ee74266b85831408bf7aa931fb42450224420af925ed5abe21106620cb9bd1789960784f47158cd52c04f578cd91bcbb1d855d55f0345f3576a7b83100560d2b877d30c84bca1893040a24fde58eec2c7d990a658d42762743027db8634d6b7e84d795f74b7e91b205d7a73f2b1b081f970335265837da3956371c6c941652aa66407337f5406b6eb46effcc6876119210789a033510296685f71970319a045d7a5c6dd863943b066e49cbc81641b6428be5c180c0470d5edc650a9433edb25e69251697f19f3e84578fe68fb67974ba2034a997b9223805d4793ebd75ca386493d2e42fb012223a729ad142a017688ab5678c46767b26e53b3ba76d39738b5ac8a95687c95edac4751846db27571c1596b3566e4018aeeaa6644df9a3dbd4521be87cfc0291f9bc8cf2331e8b85997e90587c90795743bac7c567d7485f17442377a313ff176a0b0128f8a517c3c349acd8b08b69711d628650eacf4636a541e57247f8ced9f862406455eb86482791a822080c63b054f770ca34881c4568334c2037c73418fb1329b2ab9ff2602e4e8ca170e5b9c3d8c0fcd0b2e0670912950b639737261882b8491bab1609dd35a17313c0429329a73842f33301eb519927c09197331a11b747fe610b7895772a2bc38aca483784b411a858dc5cc68c8b0f469c10e8c2a25412cee792c326917e0d512910f46de3116a38c59370bc19e8d23b29a84135f52360ab5c633a814c837c95f18762921c83506508a57ffcb78153a5a9db25c0cce280ce358313529b5adb457de499313996ad59abbb41429703b577c74044c426cf1c629ad882116222a6238556768fe490c79b355b87873377660281fa9614c81740655f5f370d06d94d93bb35e6ab64a8f94f1ba1174fd80f89d21b23dba09ca241b8041bfa2c56f447acd1e0332e143eca498cfdaa68e8d25869aa408fdba1dee198e9688927f55713913d40ca7731158026c32d19105d283b6ed20c01b38b75d96275ccd9456b2ca76b5accbb4a706fb5197bb6cd3e889834f4c083a10b5acca792527e9010267bd319ccba3aea4cc090f2c08a31b7eb2b8a7d1aaef7b44acf00cdd6a26c13d24c2be965f48c1b8e3590353a1c7d7a3559d11fe796385e2b15f612af390a6f723ab00a1c5fbc5482d5941dc2f999c02c6476c30c9d462b8543a6f129bd9249bc9953162e9c14960032d8e0cc6c566b1f121fce609312c73514db586ea9c9f0a0c51529168c520d5596a2849a759175640266a384c7c704171d47636c90ac52b24165d0949c8ec22f411a14aeb31e59bc11bb1c66da50aa8bf1a32bb39e4c799e1b7c364c89bcf8873ad31062ac203a99a65d74d840d8a4a13536bf71361679f3a4f29b2e46a292c4c1b35cd52c361643561ba83aac496de75fd689a909b9751775a3afbc959d409f35f058f1bb5d4492a42d1759f5663427c76eb9e8472541a88b0c3077d05baa5313a9d965abe0c23f5734aaf77167a475ad0797fe4c47b0849cffc263d42c1caaa17f1f1b8970cb95f5e157b0265ebbe1122b16404bb9c573b349f0c3143a1c7e4a46c174b9be442122eff58c16955441f069e3c0c8d99b249aca4a82993086ba297d3c7ec32a75c856258b4a9b42ea5ae3c4a0ef56825689a79af39881a6710666764f6bacaa430bbf159afa3b72b4308544177516598171737f06912033744c735b275b8b8122867dfcf1883bb0a612f7a824c28d773c51f282459e48a25e601f5af28cfb611b7b95441e1ca0e4d80dc822c65e73c32f7393250b479a854f7d386ec840675b639d3e2587cd5509fa202e6bac2893c9c49d6094376866dee7b7a8c19ff9ec810e7c775e99485f6b7d436b7298666c56ca9e5883b3ea3614d555133e2abff147bccea6b79f6c50e74c80dce780b2264d92004848f249fb46a130f6c48e3c5993d120b183cf2432c08fc9a754e22dccb40933653eeaf4b463869cfc7511155cc415486c5074bf3ee577f2bb93c64c06b3b9cdd7fb832b23b011b1483e3b40f6c857be1ba5149ac130571fd327c8679942851141bde28eb9085ec563b2d8353bd7a2ae49f52bb4243b81cc5be62877224b794c0c3888121f80d1bd7a1baf2d17057a8585e7e829d0ebc57d51a409033c29ac8c8c2c4d516a3075e8afee4797bdc6009457a4e3d703344a5b6075281ed2a31b24b30aa70ab29c1b87a8085b49533250372aa41c09b68842e6707fb4b6bf41b12f21080ed22e3fd845726644d28338ef2b1e0208c410ac135a573c3bc73552422117a65c1efa9349b19fb764a7d1182ca2540c9716441a591160f78f8883c192d8324e572a7dbb8ef99c9d50998d24512eeaeb220e0c55e4d536025c1263db71085ac3ebec715cda12afb6342b176dd7139828ea910b40b2aeeb3f54c69e8c03bb4f7c8b9b679de051994d8260e3d3a83bf23c90a1a9418c8f66b0777a2192628475592b7cf73bc3bf537e1ae7483998c805172003148c4d8c8ee472a1f4a34655b782d2cbad0b2830a236cefc497b5120cbcab0b2fb72186275c090d49438cc9594a21408489685ac8ad427182ea78f7169790e6b28d1862d5541348904b9c93b5a47c81e9b6989f71a6c95f12331c4c6fdca6ad7e0ae0c7279416066d78b0c614a601c84003711106fc88f1e0400fedcc078a9145e709dbab50432c79dcae3c798d78d05f1ade7ec4f84e6a358a2608bac44d8b43df4837d6f581dafac79cba80eac255032b749d50a532fd2906d5030bc1754dec9c9cd68104134ce5e55436c119a706c9675e21c9bc8c98ebb65218578ed1a998c2bb60322abe99bb5d751c3e4e43e91cc9b6e895efacaa904c94268937662b596832189252833bb481609212b10d512fe1412c0343920f1cbe47c7c0f85278d031a309002ee95badebb79ade79d64409451364b0c037c53f836579c7ee46b8e856c4c0bea6ea34c77c8caccba6241d99975c0259cd7854b334a6785447994ebaa8307c1317a340b14cce8b61b24210d15fbc57e50139b93765a4246cc521a45ac58aed41ed8084f5fb0acbe133da8987a77d4b044f22a77d71159674a92d8cd45ba28eac18d3b44267527cf11273d4fc3b5bdba021a1aa926c15e6ff9b9bba4104a0cb59a7b4790a114467ab8d9297d0d4326f794acbf11bb918abe81208e5205579c04256c18697dd79341e58442bbad9b293d69328b37064845414ce1fa5476cb207ce424bef547fde91670e974dd42cd33cac02144b23240c622d342bee26ea5990588b4842cd82de47cb654e472b9cc3fb5baf589cb4bfcf1808549ba453239ff55c7a9d8af4f81db38a89b53008a6b993cbf81bd9e1ee2297113f533206539563b6fa2ce48586fa62598b97386dadedb70ad269694ced2046f66569a2c53b620d2402ade1ccbbd +ciphertext: 59efebc7d7b940016f2401fb3f873cba05f7eff8d95c6050908d2e2820a9dbaa02db475f4fafc8a76417a789299cf1e79a8e63b1906dff632da4ba07e04a9dfcc0fe0ea6bd6c45ab0cc6dcfff5d9b3c392e3f448f7b34be47b56b80c39635e8b0ea072a0d5b5d45bae005ddd20b68b6589b2dfeb9087267a25d3b77cd8e351d9cdcf9583b2f4e1a8f3abe347bf1561c64afc9598e29e4f0a945ebe605056f821e25c3fdf9f44b4cc7c3fa23583f331db2fac4130992c97ca4c19b7c9408047c69e9e6e577fa1b110941de1696b9218b76610016a2fd949726bfa9aa970bc107d26c1e2e788804ce6f204a56feb8007c641287f00a5d2891373512c4cceda5768a405de8466fa8ea66c855a236a95df1c31a4e99308e1db049057a22dea64f01e51129d8c2d722ae91923ca4ecda2148fc9ff717c47f77a6fa011eb3875bf2a6bbee576fa81d638e6681faefc169c04e287209eca0bc2324e03feb243fd744324c257d510ae6985f62c50edaf5b34618aa562ae04e79a151d0ae26fb90d0ca280e9c105aedd1ac538188950719fb5206eb241308bbdeaf877b39066557c461aff0fb1d94b5050e18fcf9c34c8f065f9db2e1e33bd2ed5ced24b744575f7c423a1c1a01581085053cb8fb91f0bb33b8d928dd0f5d8e9f3d2bad4c2d317c3015f0e396ed1a6c34ee570577484412490733c52852deb0f32e8acbd22300854cf02d77c63468b45de0ba1a7062586b2a53f991c5dbdf7541efd7bcc8869685a49bdf84061568c2c2b3a47d28a66bdf5acd92a72694595aad03c87b17e8ccb2413c5bb047b907ff60653b175c8f9cec9352bbd5aae3d30535549b68f2a682b5cceb4039a4e1235219afceea0dfc5767a9098f81b5c11f8291eab9b7edd7dd095c97de7c1df956c675bb9f7095b5cabdcee54ea95554fbfc1642905de35af5bfc1dc3df81e7167d4dcfed0bdbee6af3ae676d99bd50983729bc1698f28e89cda3f67dc56103fe96f056e4aef8be628a3ab2cf7917b816b3e3f6965dbd96edbd1f4d1f047de3cca5df7c1753c14abb0592a68fe5a7ca54834c947671712fdd56fc85370e46bbef9a8f827513f47b6b296689ce515571375a217c7499a510ce6780d74f8a197597b35ac0e10dd815531f2b80df12623a60761566adc7b2966fe8a149a89fcdbd392241b0a9bf1a737941550b5eef8d758a0b96a34226573555b05631e13b8abfd4c6a8f20bb0640f0d1c82e0a534400277a71eae9e815c1162fd42ad6a3e174f399a729c25b2466f3555d39fb3a4a33869146614a1532ffb595880ab1a692f88dc24b80f57bab4c09ed3c277f63966a21599367f37a1f5b04fe4c38f27fe0fc3e6ba2da173d9123e459f8a6886ec6d65f3127ec35e91ef89f4a6e0643ba625431bd27842220d8ce23325ad9432c58de26d7214e9f06bddcd8dbf0f6d578820115c3e631b15d30d153d9a8742459039de2acdd98b15f424c765e3fe2f219ac89734ec3f8a52231aeff0c0dbf1d3e4cb78ee1510b38b5973d3b1e687e625fcebc2d7bf678f8ba3b4da39014dc84d1e7acc883cf0f0534d2cb5a1da64293b84ecb70b4fa6580a3589764caf6e7ae8a97d82d7391066ffdf47ee71688022c4b06cc0abe5031499ab22f5e15a2ca67329dd872ff7609e3ca2fcc95f9a61a8aa919ef48bb6520b8c0f0356e94aae616c86786ddf7113483a1014ab5c7ae8cdae8483230941a37859a29551fc345f4a747f88b892f52f175394312efe1a5d7147ee62c82af8fdaf10312ab182be1fe37cf3294c1483487aa1687f9251fa5497c1741d689b0bf2f326e63db23952a9bae084cafe368da6a83fbef0fc5c8701300d7c199e62e16842380bdb37284e7296492693dd33c6c5f6ef218ced8e7ca4cd82d46a2bd9fcd63901695784b8afa04f604cce41f2424d59a09336a67222b6d24d3ac2286617c726d5b62920f984b2b6a1c1beccaf6c141fd2a64d63f3fa18a745f76c505107ab0d74df63041eda039929bbd31528eebd5037a15188186fa0c0ff7f9cb2b2857879a8043f22e7cc2167354104f17b2e54fe22d762eb035b30e71acff8331c1f99d1eb8004caea2d8954aa90e9deeb66089eb1975687a6124e1725d458ac71db6f39e5ff3a5ffebb29476722f3d719471a8e4e57b50c36e934f2393c22d53bc5e8173e0adc56f8089263f6a69e369683514c2d501b622085443bc103 +result: pass +shared_secret: d7be239ac10fc094ef55cc8c2f9ba566e2ef81618abb075c2b2604d8392e5e8d + +# Random ciphertext +private_key: 8f44604dc0b3e08b5a092bc488601632fa1ebf008f7e3897f5287003d149cbd49b90ac7a5c013016321e233b9ccd69142c875806157d7619604b88239aa0c2075b2d1a2ca40fa75642d6131f22c20fda022d5663d5a01b2a683059e8bcbc682177d4b52e15632a553d84d949346bc4f3e54050f99d155c5f1aeb7100582ceb514d3b2a1435d1b1160a3ab52a29b1c3cc81800a9f32b9e1c56f4e7a0d02474b8d49cdff1caf34534a2a5c813c24087db57ab1ba7b29b48075aca1d59b995c5b1877f17e3f995cb8ca085a010e35479302baa30eb3af95e95b99e581a3429ec02a08fb4aa61b035b28fb59d7811725aa38179bbebc00a820a457d2f55e625c8aa16036d8f3b353c45486e5b58c9082a7b8a32318acbdc39eb59a8e3cc926231a864979817c6a78f7354f99451d35dbce5ce7c094cb2c7c1a8313328ce9a3110b862c1f3640db13b2cca7bb77b54e5ec6b56182305fc3c40c18684d09843661503f69c391b4363db564e5f2b24cbc37058991c67676da4c609478252aab922160631ec72f879b9e912b71d7776ef62ccaef990e03696de831967539b5c0774f901a4b421c4ea1206ad0ebbc2c511c617a03379523e2cb98b0a6a0f5a388c2b02f30407653e0b1d0c712be836dfcec63971240898aa5068b6d614b9083b16502e74800b4cbcf93147d438e24388cdbe65b84a5234150b186362fb1924a7b66658eeb914e976e17e2b414973743558faa6470f366a05eab7fbb41cc91f655798abda006266ceb279da9761416338b121116a07efa2918e3f845e6d51ca9c718b150a026687c2b562f5787335fe2b08c0345745394ede2cc2e74b6d5b4150ce34cdcabc4bf3b00fef4a82089aff1b9a79b1c53759bcaf1281fb92383d2b36d995613529b1443c98c9615c55501863a89793d7408c3c44f2e07c8f823366ca28f7a4a36c291afe378769f071140745f5971987c45bb29d0cf18c84bc1c8535760233b20bbc5c6709df3176dc6140a4702653c42ca68495b1b5c9184679b932cc665b6f5a941e169261bb773802ba9bdc50a1654308ca123954b5cba88ce76538a8f94bea8f90a002455b1da5da73ab247758cc8b40af3508192d6922bd40843e9cc1bab310023ab43e37bfe481e0db8bee372801af1687d47bd91d25a4ff760f61a395ed05414c966c3c26ed7f75067fc0b2695a68835b6ad6cb2ba1b77aa928514ba7645cc49aaa30065881efb700a71286146f1a0773585164082967a2d1d772f9811c0b0505e80e07af0621b12a740f70403a7cc42c9699b8a9b4c4dfaa7bd50a8e48a78dcc866c56b17699069c23135e5924f42d39996c1a6ddd52da59a2805a86f3f761687296435606a1f048bc6747008b21b98c1638fb493ec7551304a845b279e70060841856e7eca8a2d831d4d1a59a8e1ca66e45df56a07380a557149202db2becf40a0e0fc372c83bfda3b9023e850aa4a51d707b37955bdda14646bf64b4b385496eac02cf597b63854816a9aaf89b0cb1a00932329e88c113b79cf9800598d0c5a8456b7b640b540694e76e63805c2859d7c6bad42522392bed42813382257ba940abc147d52437671859a57b6090776a687e54565bc7b64b59d3286c978c08a75375106c179ff38481d1988c962619f3594e0c1a613498279744bce80005be4a5a6c43d22157f9853bd02fb0a30716c8af48a717a15253455b55341747a09691b6d47c0b9a5b770db9566a308413c82b12bbaa51e752a8903a9bc295e49239ed778a1f3c65705188888b98119151f9e4069a434c25ce6992d6a5e97dc88cf24760c1aaf3f1462d2ec35f860401672447256c25e265e0c940b5067c96cb7aed00b246296949867814277afaf3b73adc972e7291f601bc7960570c822ce84463267eac351f0379112764a73cecc41350b60ceedb41998e1b99b775949f841e0c4c5a62437c499a543449e993457bf3ac09c9ac18268200e39547efa8de1412233a9b2a788c48fcb4071f6407a228c57796014fa4d7efc6ab5996fe15378326bcb2ad93e75164d787c3558a566d2578b23d5487cd499b177a6f7d00feca43ad9b118a2e14bf93b387326046d85b2d054847a8353ffe3b321f61d37626cddd65c3e40c84fb27175ecce87523069ec4e44c284bdc5352ec9693767ca96946db4e902f1b25d87320268d9002db248a9796b38732909aa1c24e9079e0a63de338ec451415dc6203aa1c3d4f08d7fea0d29e11b23a91aec395d8e7b0db5e119515403f453ce1258a45cd5cb49e86ebe2545faa514f9b853c3f29035903b74373b4919ada72059ebc615a3386bec048c6f5462df5506fe5422a91c3716b1a3a532bde8e91eda38cd4cc83166e6c0c1d386eafa27ebb4aa0678a036162f5acc5e96e062fc9286c026ccbac9568a5754da124e67489132849805e19240406dace49dd8746b8e10978399c6654cc0fb7401f5266e7cc81cdea6c2c0517e26eb798fe33f00c0729206c1bd011ce9942803a9af2c5319f3c760a200a8b2d231f798c013794e98bb815a100d7a5bb9f9abb3b3446f9535419d72561b7084bcd131f2e4ba13c483917b793698aa36a40eea3378e6a74e26f0502be47d701949d6064ef31a64d4d64e44315378c361837402ea33251cb88f1c080a8a169b9e3aba41d21d8259a130883af57abd294ab3ad377a379788d127bbbe9041af629e4a0272c6796fff76951c71852f724c14d29d9840849ae45cf559553c756f3b8acf3bb4a1be9ab5456b501b1a790ce2c1bd7991f6ccb66e0143947c9613d045ff260ba80266a5315ccc7896eb88481b938f8459c2bfa0656af2906cb2398fa65ea659307f9073fc9b8f89a61476a059a52b7b495890f93882e567248f715255f656c2f941b4535c07a2859837335fda5cc1ebc2bd3671fb570cf556076e7cc18d7622c243b2c2bc96c5d07cbb371a31726b7b307cea9cb82eeb49bd5c11cfa1197f529f33d18aa7da13f4f87b4b48affd1a8f1fca33d8858b80328513f886802262ccb11a41f6af0460140fdc21ba5c5143418cc4a701d8d2b11952301bd7cb1082946a4859b782b1dfd0663cdab90d16ba818727c53baa09b1458481299ffa641a37a4d063c3e48caab5951ac112412932a0f98188ad7389baa40d75054cd0724dabe78e736cb32a6b35b4899137468f48bb11f5170ce20051b9e7a86bd6062532796c07bf8fca5cd723be6b4c7f22e8c699d1481b25554e88ce676a55a6f9be21888a76cc5d9725cffba2b2d72481ef9401c9f930d7b84e5c329028d7ab64562a174c3212f63d2264973964278d55a7dfb4cdeea434b711cc6ae4a041f871b9b67dbcd05627058dbc6356550923c19337d5c5c77689359002cec25cc440d643c0b0b7d49787e301117f05926ae7195d173797383895615287ec430de2621b477e2cda648466c2999c7abaa5254c699fb922390326ab7187a795a04bd8aa3424b87fff884b67509836061069f13cefbc9b719c877d603a448a280fe255483854c2005046b778f4242060d42790406a523b0da76c5d837249cdb1ceb4438dd6931820b493a63b1d1fb12ebf4a7b8c41460a5626711b5a9b634bfae619360008492882ffc4c73a476b14e9ce7d57b0cb95b5ecc1006db88079b2129a44bf0c8402f50269bb295ccbe855b8452838e9bfb3bb8b3e7b4b5d3b403c5c671ebc6475c43d6785765340bafd308886c734b12258d28b6cb7230b59187d11433bd9511460b232f0fc2c3cb806befa4f9ab3765752111192adf3a1cbf9dac23ae7945a0ac3a3660d96197b8b0749efa5cefef5556d28315f6480fe702e0bd3864df5662b48481862686deb057e421f9f35ccafdc5e3aeab354d39b05024672e02b97a5979a3434ecd2a04ee8c22e8505c5820b11571b1c6a26ad5893d7c37ab459b98215908c920d29ab4e386b24f67912b50a1fd6f672ccd250fdf1938735accd2aa2efd9b894f96e682a37156a269e998282a53c5ae287bd0552d2f4020c19952b3246fb94400710b4b9b3381fa26f15c56358dc3afd876cb820095d00014b054f304b7f9697a41c6797b4a7ba0bc9be4b4342aa792bfd449a4c3a1e117b343d655488e521fba104806059d6274628d94fcf8c082d5cab60ba33086b61663048bb9305c8f67d0bb59992e7477499c5fc4843a95998d59c6e6503bbdca66fd82a3f7322823abb5f6ce3265528b41da7927059486381b72ea2585f729e2b788dbc7bce924baf65f25520e56735d906c0406595b9a960a281f442a8376c2326e1a20a2699285b514972cefeeba2362847ba92a2f3b30a124449a6109b8b192743c7173b0b4cb9952dccb27d4b43c8ab931deb50530330c0b7196b0621a9ccf15a2c2fee764b86e93af8c536acaf13874597504d06f194af8ff69703f283710f0229471e575df808cdd343be54ab9003e1db3c098492bf78b0deccd7811e0fb321faf0851f0061818e5b571a +ciphertext: aebbf3376082b5c3f1f82df785281328bd869bbb7194e0fcd0db3a3969e26131f8b10ee217cacf0fa6fd36c3655990fffd96af4905a9e2914aab741ceedddb079d61b6b148425cd93a20ddd15dbec759aadd354379bf65326b255351102ee69c3a99eb2da32f3a338faba2702e2f90b10646596b0ea932d4c595f176f44029a14359cf50f274f876d278574adcbee63b89de977f5ec9ba9f76132ee96b4c532a42500f798c1e518bf31af7cf76357d448fe2c943ef46168b2633f15efb23dcab65a4b3c2d0695cdc490126d5821f7de2234c9329d9afe38321bfcde966a0bc12d0c5a8e808d2375d8b32434f579a3476fb0f0f35a4461b615de2fdeae8b72034d2f24e5e78d52df851b65b4e9825dbe408367ba2847d82c9c74c62218d8f64f82d6a14102e99255309f74020d4688936318f11ebe217313cdb28cb1ff31eaaa71add125ecf643b86f9985efca8ea63438af460472cb794142912b87b2b33d4c7cce01731562f110fbe3f9a65b65b8279f4adc01730f1042e4eb34bc476c534e870d1f9516781f5c0b406d570b00a86c718e6f0ff1ac28087b09934a709b166d867b3ce5c4161702a13534ebe81a0ed13a7f62c29d4997f42b2d8bc0160af93fa7f2e7128bf38470577715a2e4ee6dcf431ce0de7ef517e1edb722fe75a784bacf33c18314e079addeaa1e8811ba3ea57ccca8c4d9e4e73e03b786c9a95ba65554fe0caa3d92d32f881ada6e184c44ca1a17216c1318e9fe3d08883646d89a912bc97b34b80088c308dbc89628e5926505a7415c57b247275a0ef62ed558b14eea6666668f533c4ac98e401b99f24e81407b7412eeaa61a5596f95900c80e7e6ad8d4a1ad7061073eb8c6100ee8cd1d410863fc1bc3f92fcf3f40428a9ebd32d9014f33e67ccd66a476529734aac311dd83db025c1e89e9a15724ef2ae3989643cbcd1fd51144c21811deddb92a7c01c7b4b023b1a5c63191652e670faa96aa5e6170a7aeb8a0f6727c135628ecd5c1f50b2420288422b2a7c9850a0d358e30803e98db3870428bab2b9fd9fdf1aeda73e8989f2c0c850a78511e480b0ee403d63969a47afdcb9da21b824d984fcc4a03642447adde98228be4dfbef1a08dc7ad1ee145099f3344d1fafe438087cf0782c424dc90d66bb0b70650981b525241b072082192f3d2bf75587f3303b14a41a69813e67d2f9447022eae6c8143231093e51f197c8992e7e9e39ce129b236b119de21f2c08967e048f16c2244b8ed033f21b2d64906cb3932b3aabe7c419460f44c003a6a6e78cf013d543cba56958ccb0a6da8515a3274bb237758278caf3136efcf29b62597e0d4bf6cd278b4bf2b2d27bd184f80a35ac66c8cb1d488229a90d5eeec65ffde3cf2acf373fddebabc43b05dd16bd9589fad47f92e6ef8d201f66d2e6eaa969b7c5e861c08cc935fa1a9df956581e527fbc2940bcc65efb38c1ccbd56ff744108bab3891ecf7173037fe0fcc7c3ad7eab8ffb3eb16abe51d378c02e9153ada8df8fa13fce73cbd710e55daf869054d6b40499900d5a3df099bbe5e9928e9e287b8f3cffac86f56a5619f535dfcdd333c2d948a54578f92fe2d60d10425167c1bc2d7416770bda4d449ae74b441ef204501e2ea0fcce8d7bde18d4426db0d0e3f3b05de49ba57472162e8d062aa3fcc781706f205218fd34419659ab3b03bd16e86569b5b12bfa32c44d3dfe7a493030d53b9239064f3b1492ec1eeb961f8f9f36915e2c5e3d2148a04d0c55da4e83712adcfe8747b44c35ec17c9da5e938eded9abed64745d6d991a27b512ac514fe7e809031189e3bff9d1bde83769d528b24f38ac52c1d29aa34dc07dc8dfa6701ee20f0f0346b4896ee4587dba6e7f5e95e57d4b3a75ac388fe92b5a94e5dd823dd21e196b5294b480de0ddf60309f6ad48f0ae2f1c349cda2dc9ad94a7c7638ad1a7336317f71b68bba82adfc3269e42d3418c77931f74d85295caa1aa6f9d525dbcf71632730ca3dcbb212a3f7101c240daaa891c85d89bd22450f9b246e1ce927a306160f21ede002ed442a4653ce8552f120e10b2b04e2a441a4c56216def1163655969a7ff09ead197936d46b743130f8cedc78e86e326d96fc658ce6d8241fd24b3e8a199b07f87acec1779695a2079f55b54a175fc3c79f8da180e64bfe8425f2982ace1a1957465057ec54b5a1bf0605e1ed59885d6acbc +result: pass +shared_secret: 09571d6c8ef610abfcf8bd96cfa87ddb363b9e4b1c25376eab6e4bdc58bff9fa + +# Random ciphertext +private_key: 765095c0bc56c8610830fb4fe74182b54ab334939c0ce2515b6c9fcde365b85c41bac197c3a313f75928178758156382a10512b5d918562a7a6ddabb3112b3fcbc745423ab00721434b0591c5bcbd2e168dd05ac150bac8f069670c5ab332aa72cd491e86b5ce8b0bb247ac4edf57dc17043fa83be85e98f1a3c99c30aac57857f3f1cb337479a488422a26cbc65878594288bc0e81fbb6cc00293838896326017c1566586a6c769ccf91786bc16f92170b6c5612944995d46b4759b4e047a3ab1da01f0ca4b494c510b94cd1f97bedd9576d5e5719d842372c56755184d726c644a4a7c5ff53a98c320bff526c1f0a933a1a46ab98df10a3d93769823d88302f15efd7600208bcfe4e2777068ccec877de76bb335847d9e5778bd284099386c050bb64c3bcac551719608739f8040da6aa2db180539c349dff190536c003a4b020d1cbf4deb3bf9018931503d42211f0d32ba19f6c439fc722d43cb9687065e981856caa40533583e3bbe994600d391105d31abf2922d582437e51576932acf0d432a2be98b39c4adfee2185ffc48fbd380df383717d5514bb7b6eeb284e2689cd7c716b50bbc79874700ad610af33b36b2a9b5a91ce7979236ec92bfc68fbbecc966c998420a4841a8b6c08a3caf102009b5a51591c85d7528c0617f222548b45823521469aa37b33f3705dae71ac2a28ac4a848068a931a3a7e7136b22c1b0167f66a42fb5b57b92d09617af07aa9ea609877cb09d2228680c88668ac97def4641a9bb02746bdd7465cdef084ebca61f72b0321406983e995eae77ebe068cdbe18acada95b4a7100787891060c78a8b094052b40ee201c6b91b50a6a4a1b5245c3a08bd168612c3ba36682fcde027454b30f9e22b9aa9a9eb3868e9b34a9ca37bb65023f1f3a4f2445c1519051e133e868ac4e04c2bb977c016db2323e45abdab821d12c3f0fb7a00d571644a477dd8a7e8a2a25a033f11020ee701ce70f16134b20829c5b41de6b3cf5c052f123021587f5bbc94f9b8383149baece56baa093514f7aa0f15ab04d881e0f05a8ed34bf7b1c2fe694e4cdc2371f6a3182bbbe5e1274129cc346157e2b31fa12469b930439f96093234c9d2cc82a4a4a867abc117e159926a7f436cb8a8eb4a238b4d78dc20c9538e538c44afe410114770deba08a91b66ee52be3567522f5c8f2817c46d3865a73108736b0b78f88c73a32f31821e7084834506a8615cb09d40793ec941e425475e9831d041295ba77a05a551a68b81ca5b4df3f8255f6244efb8c849714f3271c77db30eee369df1a0108133c669d86987901e3053cdcc6a8da14050306377798773b342457443bc268b6f4217441e26c21eba60036b8a7bf1208a16c9f1a14f97c37501465c46d52d835022fa676d32fc59901ca8c6e300f6c5c8d8cc390e2a1232cc85ab48c0403c6396eac363ba043ab7726828136799c8aa793cf0a6487452a3280ba2ce0a6a41a5b90cc161fc441a99e33c0375c0a945505b839d3d7b8fc8905a903925c6a58f690b41048baf2aa797073ab1bea6c14ba3aa0b575bcecb05eecab23636b97838cdabe23818770ff07ca9d12534d2300c8b8cb5ea2311375c56ab673f9d591c5fb38f45f717855a8e9c4a3dafb9a2f4d82f44591ccf7c0651b8b6f37a9419694734a21b88836dab867f7775cec5e844ced6c9f7f5015f1bbb82c82d70a12497573728e17c1d6b300ceb5aec8657df093c0fb27cc540299d711762f0ac4755479ada28142c0d74764fa75cafd2468c304060719323251c7209922f01b537600c1042bb302068a8e3904dc678c50f65ad29c4a19dc20bfce44c05a395b6d2cb69e88507f058df8729316047b02944a0f23f96699cff713b5a69b126a35313ea01071207678877bcaa0d77d4cac4e10a28678f7c567cab0496b39983c1379ce6a5cf1c0075c6d01af4d0837c074979242f08da97f15897eb4c6debfcc30942a8af347b73b08c907bc6b0b2958e5ccb22c44290b56565a31c9ce6480a02cfc431ad7ba4671c04c7ebd55290531b985c17fee42edcb285aa5947656c31edd77d3793705c575101506353a3528038674d3411c7c80bb683240bd69b40fc2a35a8c11f65cf12881d59097b395a357301780c04811506ca181342a87b2493dcce40969d29882d4c596a29561651587297ec26a8982f60f41b523cc77c98b4d3c61496e614fe0b1e0ee067c173b8b63b548026a090c72f65b4c675637771ab0f11a86c62666b453363658c2c4724379136a85ab74e76176f711a4904f0ab124111b226b525820f83f29306029dd0e5b9e5d28f4aa1255180323435373fa757e28a9b874653a18aaebb62bc0f00ab542c44815b74f3e09e0123736889a252e2ad3cc065deb03089b743b7b2a47695c12d0a425794bd0139bbbac9531e75cbe7d1221ce161c2b05c2f014f21a264fd0103cb6a4831bb091ae1a382255116440e3d958f87871b53a74e4e6756f206104babc645c371e7058c6fb03368c53cd6d1b0ef9578bb22079a6518ef7736f643259ee181f3e4a6ad151c8ffc55a5b89a7a23968a585f936a6e79da376f4368ea86c128b698cd10b7797a0387d94ddfab3022ccbefcea86aefb10e3217bb84705de981086824c47743bb00a7637a259bceba365e64df6c7080b3215c6a41119db106884ad19f9a11657794e1a0c956a431a42cedd31071da2b695e15a47db49bd0a47d0b4aef616c7f7453acd41206ba124238aa186c4a1c559cfc670a09b4165e2b978f4432413fcacbe91baf116842181611182c2976164f343ad7e949025067cc95b7c42602bc2b74dc9843749a7b483d94354104da9055a75e6c2e91abc19b6722e347a3eb58f46201b7d191223d72eb932c683ac44887c70a359012bb840c89c5b3802484a97968981479980465f9b274b593d6d4837939267ad80c4bbf64f53697ca565a78af35bd6548804d42fdce5bff2a58af7e33f71c9a2aacc76f964ae28b7a85e37a878d4bbe374b0e8bac18f769920038c5cf3436a99a8798cb2d6d877fb1071cd3652aac229f1a78e83e2c7c11873c4e0b0246c80c8a9b862a471a98c847d7a00d0a207c4594433d98c3aca992a672b1232b8f36a8744a707000351889244f413ced1b0ab3299c587aa72d4796c47f7119dda927eb3bfdd3060f2cb08a746c6eeca6ffb25c811301dadf3c5bc2b885f5b3d09d7924d8493db7a2ad8080a1994a6a8c742ccca8f9217b8d02055368b7945c4c3af61cfbcc202c0d99edb210d24c66509d5b5c5f19a7a8139be4a0b20101d95f31ae9f74272538ec5278c5bca3161d4a1ed277200e638dbd1a75462548cec5e7203972032bf7e13c746316fe1f843033b836f74998e1c5ab5961a90014b7455776a3a0af1e7883fa4afb20b838aeb753fe1cf0f7a5b78f0378d934c11778cbd4311ea78a0293a0e65316ef28c2baee7486c9401a087c51b5bc43840cae2b43e072c1c9b95575139a0151074333b1273612973180a9457886eeb0e0303496a7832b896455ad85b30f7a54507c8d3021324c3220ec2a2146a91919a4606a4ca4ec9a3056a107bbb289f036474b803323b3f6858ca5596119f8856a331892f5329b06796cbab9a79a76831d207cf407076a9be01e128a73a3724da1a2c7a3958471dda50399be78406e342ba06a2c9199524b081333761c0cb94b48a6d125b222bb0a1d5e2597967073027adcd848c55e077edc44b19c904c8f7473c782ae6fcb2a5a5a9113a649d4a3808c1025d58203e5b3bbe72605e222a3fe3ac694758e6c92e042786d26bc762da6de5375d48bc5cdf0385cda0215a1750dbf54bd6196707a067924b1d8edc0d5b527cfcb313aed687c271cbc27ca8d41515a32301e28289af0b4c2e5723e5c0b0d60145bc53acce16804a461dcff187ceb7c2462776dbf89451f64d8a66a021a717f5d3300e69b792594e3c033e081c7cad48398b76792d40cbd731095e14836bc843a3b93eb420602f9c2658ca55edb5a88bd8cd92f1bcee4508495bacf7b4cfb966483d1a309e80bcd457ab4f43a39b060694d49f2e535289a30ff50a6684b3bb87d7466fb0b22cd1c791da8035809d737a98bc1298cb714677d1117105534da41cae939ffde60621cc9ace66571221aa1c82ce9438c3a3691395d508b8b81e08d77621d170a59a2ee4011a14f5870ad196c3b34050d643e409c68c660903a82242335ba9369416a95cef931e0b4a39bb194ec7e9c000bba7e4f2a002ec37ad00c61bf34d202b7c6c678f607975d0d518b02718d6369a5acc356f72a5c059c8a7b997a8c78517a1aa6b723e832a46b64b940f39311b895482d8615df65bea66f8bb8314a487e3074725e621907fc4d0b93a4f87d68f3a8115e0c1bf0cfd540ca291a975cdf4264c4e9eecc1e41053be3417714684ba57cdca1a9cfbc7ec67e2f9a2746003558aa47307399416cbadee27fd0db35bc7a549 +ciphertext: 9c0a52bf981835dfc163939bea10728635e3e519077d1ff0d74913bcfd729d349624c04426e62da4810aafa074a53faf63c6ade5dc72d993e0ab07760f68555125295192c1b58f17ebee6d54a0f5811e1f07a8b764ad64cfa33d23c5e1ed4cc9162c871986230288f1b382352a4abb491a9dcf4b4e65e0d8946c49ef1967f3d5850f33a6030fb19e697a049231f32d0d7bf9e9ddb8bca3ed7854dfe79122052ea026e69834bc94d20f8446351dcc6ac7d752928416a90773faef9a1b64bbaac3ab43e144f8084883992f7105ad79517d7e700d35d06950a9b8877803a797d97b8bab85885fa9329de6bc3705dba53b24add6122f4d01a574438ac243abcb6c2eebeebecd7337f585b080217607e42f26174ecb3df54e87c43c13658f04d6684dbb40f40c7bf98b2759aa5fd31d720574424352640e195e3532549c7bfb5acd26234a16c57e9ac4441cbb59ab52fe3e6c2ce9afc46343568a1ad18c4758b37da1b5edd68508409aec1524bdc3c8380cf3559438dee92a68746e2c5241972dd6572a357f9b5d2d5e855fd522f5cced52f25eb4fa039e8fed919a9e8692266f7c1b2385e24d7385819df1774e5d32fd7595b153300f04f0d2fc9fb3730a52ad49d38961d856ad8378a2eb16fe7c8002ae6fc11e076d50aa55ab432952968a3738aa6371485da0093ebb359f9b4b2027dc1a4728fc866e2f66f1ab8a437a223b2629e1df8cff41fcc23a6af4e71aa61a3198ff798193a960df229cc1e61727e075084384b535c956879535139113bcb6f8d2ff83ce4948b6d2ae41436f6acf2660b55c47c8d5dcdcd457da821e378ff72ee42657f2f416132e5321b2839c218c2ea21db244ff5d2ce38f0c7f8cb628377930338d1cce8a788f4f2d9a4c9ae4485cb156f0701de2132f1ef3b05fff1c972a105ed5073ffd1f51520a6de361716bce86389915b7460d23c4399dd0e6d30dd9f775e312d6aa5db008525ce9ef3065682e5b3d809e21578a8821de7d559e28eef0dbc085824031a762e241b75879672000a0b115d6d1d600c1a6c537e94e3a7d8ac8a6a570d48a86505e51210b98b00ba06d79986ab9e4254574bac1fb32916169c4c7349197c8fc731a8dfcef31046c2608508080ed5c9ab64c832468d517879860f62d65f52b19c3e877c08b5857c64ddc0af4b378e0ac65a745fa9e7d79e646132b64753bf70c7cf3c0d5b0deea99e27ba3c2393fab254bbae7729ad8c9047a063721dd062e3993c1567a0a7890612b5dc7f08b5f54dc5cf934aa410e94000d6508ba22c099115a53e6c64c95e15becfc5560ba96c1068ee52f194b7fd2a605f6ede452e8d99c660ec633d33ee5d851bd1a495848554b1c2a107c7072609ef1d88c10fa0542586c2423e40b8547bff339b8fc92db0902551f26dcd1ba8a8708f5717006b72723a8dc0b3b1733bdfa6ea2db0e8699682675a5ee8214fb259d33f6c56c7c648dbf503d3cb744ca7a58fc8e85257a1e3e4bf1e4b39bb2d97a3f80af7000a3b6512e436af6b5de59fb5c57a0911544a8def9e1d92944fc1b9b057695ff60c62c4d853282d33c189bb4454a0558665e4dff3389fc5841131af71e82338877c87491c1d89369726b7fd1d0c389105b419825b8b29033a72034d01f521b2ad8432eec596013b403a023f0925f211783899aa8deb471034ed8c8a1a94e706bc1b6a04ecd9396e63a3f7e9fe3fda8e0dbab0c571febc7ba0e890015480af94a89677ac8de00447424cbbcc0222450999fc7c6f21bfdcd740163b8adb16360fb53f65c87616f93d1a342ac828cc6996e2303a6585e8e44b87bdd5375a4dbc44cce72ec05371aa0f00e8901590df6ba8cc86b54f887f1cef2ea7f96eb11d04ef5bf831d88e62b78158cf4f7f1d42fd3973753c7b59a8555ee5b2a756b0afa60cdb44e34bea6731a6826bf120627660f1783f8f646d0456df101373ca12b8f393b66dbd33f73c3db0ac80fea3fcc84cc3719ea80994e1593d8987d558656ba76a30999870d1fc2b2d6c78be7a25322e68fa424a1e5ff23142b6401b44c13c844207ea16962f80e23b2b4733ab32bd95be7f7fb487528ad3b342c619a5a71d0244332e95b53fc33b466f18fcbbfeeb370b3dccc6056d2d2efe8c4fcb671c38a8c051c985ad0c11df594f422110d57234c60bc30a47a8c8dc3da893a36869dd8bd72b029a01a4157c82847f45fe09705 +result: pass +shared_secret: d9526adbec8118a81c14215fceb333fa396f954c8f98984160adce1e86c933d7 + +# Random ciphertext +private_key: 920b10ba5a84a1706c9fc264016a334c9902329207906360b3a76d12c15227c298c7e702ba5939ec53223e22bbc75a2460912f9e23958be23f5ba70d8a9c8e52980e106126feb064bc4546f1e7c4bd71beff28574394902656c59e664ad6499bf3fb03b4413fcc2c42f38b5c8504a619d994e2b05cf3964e52a69ac1e588ca03945dd3913d6ac7ce971f4729459bc760e6782b5c40743e63bd0262b938a88f7aa70893425ceeeb31b80a5ccb232504f47902b56442814607881efc684b8cfa3fc2d6c7b8fb5053da58fac84801434c2c55c25d98b16c661b38e942bbf12a772443f8e0be3e81c9778b4389861eb204aac0528546f1a838e8b4a021695c177a5e8774f6bbb87b68a651db6f5ea57717292fd761995b335e71a7625bd535f57a0410341e9e345a7ff0904cb20b599a1777683ab70659088c3cf705c2851cc4fda0b3daf55e9bd70fa8f6b7cbd64bc6ec17ac7918e9d8be5fa300d9a86dbb3279d1408471a5102dc54e0ec7a905f35aa4c89e3e2856eea9c90b75adc23937fc5c0546cb18df3972fff5c7b2b5784a0185a26c1c8b0bbb0d512e4ad0cfb6c1b5fd72826dd74d7e8617362668ef2b00c3c64e08d020a0f487199b59421a4491843806568a3e8b490d461d0f3cb208a7c5ca0a14d3a25e74fc17d50c28db4aa20ac00d6a4c643e26a1af6a1f082735004764be6983803917a0ea694a0497e7f68d2c124dd3e70188e68ca135a16560af75754db2557d6e4c5bbeec7bba4a1fe704464d3a319ee82b719735dfe5bfb06649ba238a76049fb7383d0bb2004bc433db2713cb7c6080113e20d4c58e5b4ef8cb490f6801d0f26f9e845c1903780f4346855a73aebb69f8849226406db4f1320979c456f128cfd31d9d8caec6754e5800a3814c10d630164077505c856230cb9eac6ca8e7e6a0659b8ffca34fcb691923c380428301ec7a7a34ac9c61c1acea44c13068785f5b18f2cb73177718eee1a1e3760e0af4b69843041e14c73a0c20a4e0ab9ec3075bf077550051925a624b1b0e3e5c2092ec1c92b7750e9324656044315460290445e6e937224b96b190649058ad43314b3862678b8829004c9195a234325375e6f428f9b18999c75e96a5c76a9aa62e772939f79a87d69e20c84535ec744c50c8fc767bb7bb232d514bced06f505b4dbf1427d1b28a14d497c9dc0ad9e5bada1cbefec68f5d2b5b4fb9c975bb26f11b94e42c3d8fe26c34b72bbaa36dbf6632f1f76f9a506f335c919e063e1e033b23f7a09430581f81b731c333f535c9080b3e46aa5aa633a5a7088bb49017b771be754b6393a3cbff904d318b84dbb42f9ea98fe775b6d7615b2de62ce5718e1b0193cf638b301160f1f7019347b5b240200641903a11325e8623bf578d2e2a0d42b3b70ffb7a681867e2f93bc45181a21993d2eb46eef799f0ab87e0da3890ccbf75ec02e142cdd6410aaebbb9bcd877018a6459873035b3a3421b4915414ea5444e9d7a4d67b8a63928557f284968127127aa5f91039ddc4b3e6f1a61e3f88b2fc6b5447c11a9a281d33c8d38a3aaede94a5cca7d34b5540dfc5741f3bb712baa07243ef730257924c7e7d743e176c6b728ca61ea57893c863c68987e685276f2347c93aebfaa6a5c5c58e1b12842e82b064890f3ca3d67431449a07261bc7b1fa5588cc48670727c7486258f41150efc8f6e3cb480f7557d9c0704ab4d23c2a9d8d67986eb2544505b9382ce1e649428b84ddd3c6053522ab5b5663ef21b3a66914a840d6f94a63674711504069f3410abd3153738094c723b847c1e24c8830746abfa009e940997f432b7af6928756959a7728fd673389a795a0d9ba7b02a04967627d58602988a3760154264746bb219274c1331fd7c83f91256d96b829a73a078553218c769005a33b30ca64020c41b2a6b1635b7f5d615a2274551e8a0622a1789f9018ce35c2862557e6ba132d0a64ad5966031343ff985031906f966a56412c4aca82a25e69fd4b092871a858978c219bb0958c93847f47eb72473fc5a417c304e68623e1c694d7df36a7c160d2de01194a409dcc9305689ab4aa26d647773d1507c5043a21c19305e86cb042921c3f83f392178605183487c3d28ec219c43adcfb76f5ed53a879b93fea05e91d4ab65339af3040efb1c63bdda1be9ab8d4700347b22332eab0d5f68443c36af6db174bc0a3fc5c0a915c86cf340b5493305e4b759120015f75262f3251a8b7ac534b0afd1677bba37ad5ff1a6d8e873c69671a477ad90a68b2770aa3fb91e7f865ff2fb2e28040b1c4034488b30c68455c35125d1ec7b89027b1c943ed5c9bc837a481fa494a5da51c0f43fcfb015671b197fb632b903bb0d49256e88100264a4c0f56a9ad8c28198b4e0850f1ae1c034952ae07245b7789cdc9a54eb5a16481934b23b0bc10b4f6eacc37c2c70f5101261602044229ec5024a616741cbe471ae8930fc4b57340c71bdfcc2ec5504cca29e85140c1c6cb49d10c2df38a960c731b305a79b63be21f5551c4b538c5915812086d4b54f99b43848fc96db5c486f40a54b640dd6084002761819c8a8d5dc8bded860297a89ab20713b16b03029a80ce7077948add0739beb85a394d1499c247f6768661c9799fbc1bf4c73ce2a57505cf885aea46e3259623d96acf85c454008afb306078304c0a0186c61642755b325a9e2c91283ab0cf4942d2bc898c1129138ca37bac653248f61b0976ac36b87f4c3d6614d411ac61f778ac898a2c1041fad24a9e6431860f3338ce844caa452e6331fe9b159cf687e17870194c63461a7a4a2b99f1e7a13ada920ee20a7adc8547d50640bf410adb0aff71c761ad22e2b045b61527d383788dd74ca70e514698521efa56b61324f844520d459c5202aa790314b8ed7b7aa00240e600793e9a142d985d2b217a51b0c77343e400b7f8bd15352459360082afb2b7a20e898dd0ca235915e7ffa3c6008059c7a1f5a453c821b24cac48a4afc3b84b0469cfb79ce131ea1444e00960b9bbca3cd2aae8b221dd4f0028f89784743b151eb75ddc3cac0364e7a960dfd449edce56f8d71adf1f4bd3239bf031aa8b675a20c2850f6c3436165a83ff89900605eeaea9b2fe22ec86088c07b24d4586d2cd860f238a7e5c14f3af54171c13ec970cdd672769e490543050dae95a795e6994eb64ee3cc561c62667257a010a13deb6164fa2b192dba170026a208688d885b415856ac8b790f2660ab56a64ae3e8a5548a3a22f5aef5c02b7143aa44bc2027ec485ad0103e2479d4fca180e67dda64cd1b61888c5a8177094d26ca4cfa2b5d58c1c8eed9613b707d8db87f100626a7e72e20b13ee82cc31e4c7aac6bc9cd806e7b316e4659477600ba14f8a77ea2720fb96219f50766b24f18b31f70603534c0be8614146126173ba09103f02808dc00b105b1c8793d2157b2fb9581c322615422205f83a9f77168199b694cfabb57db0075453c436888ebb524b7ba2009e677464447f6985488b020a1f1168eb8787a0399c9252242358ff6c67659a7131c39c908e20eb18922a6ea7b2c2c2679a2abd47736666c37894a347fb51e081b8775537c1651a1251c5f52069f32e10678d739f7522b40a529cfc31f95e62efba31da40221e5819cfc406edcc9225799582333238dc00d04270468b303d1791b06d83198c406ecf69d60c359e879b7b70797db907db37143a739272688027b945e9cf497e8cb80316170b51631cc69a48b114e7393339ebb41b31929f63296a63706e49a2aba6a0aba8b7071c8b3bfe5bdbbc71077932b14b4605f36ba940766fe69c998d829d73674eb909473b14191a459a15b1cac34b1d0209d0bba3035e7aa718ba13ad5cbf0993b5fa3824aeb10edc72d101c346df069a12a4b490586a374ca6e7abe16b4c138a5548c0c89d9a91da9751c71b580e12480b9c406053c87c61c4a6060bc3e922b9ba9b178a52438fab5aec097a29ba9b6f4c9f7142324193e0c330d1af425ba114528c82e273babebc81ea4ea76b47016ddf6351d602cd986885e04782177ce54b02b948070793017bed85ca397654020382b293f568707e30a4e6809a3b9d9c652d05378c773647253d0fa0676744c15a26b08662b70dbc72ff34af7f3c2d30319849a1062d33f31ab0d2a8191a381c7e467585caa7442d6b1ea486bd38a15222bce2f4947c842a7b824735f3b5e912a8278a0627ba347b69524d3321567b650525222465391ebf28f970687e48c8ed5b754bd902dc5b63729cbcd4f1b6b76b2989be04445384aeb0a354bdb01719cccccb392d45abaccccc4fa946cda991c20b13ce4cc0a321b81703601a6bce819c74d71a726ac5db7f69578235845a8ddd39718c0925c2d3a4ba4d39cd01ceee7e96ccedf4b8a86eacf6023ff749289b61f1fb89500c0cf6d25874b4d817d97fb451d12454502026570e72bb5febbaf60623be8151e301c5e57d26832 +ciphertext: 98a00b988bed0cbc9a9358c8e62c0c1ccdab06dead794726b4f744632dc36a76f878b6f932261ba2bc1481b0d3cf5fed40e083c44c3f73ee1851cbb660d2b41ded9a2baf8f2ac4fad4f6fd91428a8be6d2e5dde3e4346408b753d3a786ff6dc78650337d8a5f97e496df7435c2e890c4b8024ffe17a8fe799cb29b2c24af81b7ef8ed5f6a83927fdb99c2d45fa57a5843133206d9df90ee0e01b0b81e6c6a581873c260a38df508968f6220b0f367992216a9ae4aaba009284c44641434d76b9a193f4b16b50914ee593b8e25c19a98195bb9c5a2c528755ae4e3b6180bdee40ec26db6a3bfa406dd080f79eed68e447cf36d64fcecad23cd26e6880cd8c41670d2361417726da084d2effa5ab470227439a3c9c5065ec1d6e5d0bcd03ee5fc51c9318cbbdd57654f93109577339840eeccd2366487f495e9f8229b559d74f0bff8761cc55fe85d6f622f36e1dd42e3b775f26555d5b22e550706c4d1c7751a41b56715daeda1342ec3e47dc83d5ae563ec0988ba626dc2dc95d676322e6b35a89b8d51734e48a686a73aaac53db01d6d01951cf2e0ed9594c23f93dfe840ba17735f6c161440aceeec4c011e07a35edc5c9172d620403f797468fa62499b0e4a065956cc1261d08affcc754f2a93d638d821d76b307a154cef647c99663955c02349280f7f9a55d06945566bda40a541df9d9241201e07251f54c3e7f6250f9fac64eade774e6005e8200a9351add42b4ff0d0ef98039790949e6ce8983a7728ef8ab7f8c955d79c81745ba249300665571ce18ff81f21b7485e3032b7e752eabd6b6813426f19895c23736b49674ec152bf214fd5d759bdaec98b7fd46239f071fd91bb48fec7ba700ae25d8780664630b6f5cd8c3ae0fcd6164ee11254b487ed5f90a1bb1b23df5d5d02dfc032f0073b144d18f0eca02fe04bafd235cd42c7d7d0bbb8dddbd5c986035846ce9314b51c670e3ed8978d9ff8307ba73141ec99de955ac0f76e54f5f29f372e8f2737ddf420d96207ed9d022936e11685e16e9a081e3f3c38128446fe2a33934a16e02f7605b98eecbfb110aa0e9e8f1ec000936513809aba982ab3f143e641a6aaf5169c929e8370585f1dfb2b6432327a52a4f61e5b807dca10e6ee7c9e7244baa32388754e7b69c4684731723fd3f913a14b57091b0889bcabc79781cbbc387484e18742f6bb67116f54b42c7b78e7ab8fc2dc52bfd3aa6d6b534cd06ada4ad8b79c24374f5db79340cd654f46753070866cb0ead62eee4fdfe551f7b612e97ca3941eee1dae9493b4970e405c7ca082568fd9c1d8cd1da761d5b3353dddfd114969369ea1544ee8be4d1ce48edb61447be73b286cab5872499e1138d6ecf62d53cb2fa6689c2ec1b8e893aec65dfdbb951ddf15eea93958e74a2e48bec0cbea9b6c5a1b75039bd09ada8c2a324f434f1aaf3b741171b1b972657e6e50126af9af8702e961c543459bedc4d4ca3b257bcb55ec055099f5f47982f2283ea3313949da27c516d7ff52e42aece66dc57dfc544d5785559b7cfa49ecabf8f8b43d1099768f96d4e6507dae943faefb7f85205ef7d12ff508b2d43072169c6f8ba4913dc7874724185d4efe8ef3a6b65b6acda0416d569bc4f96de3583d3a2f1969bd7fe30351d9ccb3ff39bd3f7c55a2125012f0493e9e84f323f4f918c8a490ca45ff1339215814c26e0caf9b431d339199aa2c47ff5417b461feebf15df0dcc94863bce27bb0e2a82e6e693b0ce21235e4261a926b29866184ddc3162ffac3a4e3d7090c4c857937b3287ccfce4f9a12fa88da5495e67834026d1d573f047eba7e16e75aa9641f26ec24e288603e7164c52daa913359782ae0fc5785795aa17a75d568f8b9772f3aa8d54fb210dce8429dacedcd53f4e6b7da5d6d06f846eb7cfbc2645a16417a38e1cb0e5df68b03987e32fe7e2e78b1a41f9dcb138e68c41956d97755f4e12f6933ab43e0460b4feda7b350ab20094237f839392507911bda1cc26829e176625e7c8731e665eaa5e7ccfb4cfe97efc548a1d587d864057cd682134fc03f302f4da29e38c98e6c8dc385731766c1dd34ebb8a25356ba76c717e69ea7fd766e0ead57cedbf6c1946a37a005b5e92fdfd913adb5c63387ae68e361a00c2963dfe80016b7ea70ed6c4e85d234b5bf00ba6bb68b73acffb1bc84206d62260ce4841590100078bccbae7b2c52698 +result: pass +shared_secret: cad9040e83b00790eab32604fa0ef20dbc6c2184f10135253ca02839bfeb59f3 + +# Random ciphertext +private_key: 5cd91bc4472f2a32805731021271146eb2bae328a87da2ae89e4b4d1d498b9b87b6c34c54f24685e2a822e35b7d552376873909789ceef7949b7e550ae2294406070bb22a12da296a57a2df24455c731c3afc0c4cecca64eb80cec1ac59e7166186c4e69e0b98bc547c45496c1a37775f80680822a6ab047cbf0a16c89822657416fb19808242eca388b00884aceb5136a9591a30894a115061005380616ce6e1c8ffe38c338e966b07b3c16a91013557e8303aaba23254848c387222736d39f17aa4f6f6aa8ea68941220cbdc5a62cd6663d5acc38d844d7ef2c3e0561e6fba45bcf36a5d0a6cd3b5aa344201cd2c1770c497ae845f1879583a9a89ec5acd055ca692848a16db49a6a8a415710ee065715aaa9fa4305982b81c5ad84ea4d965dbe57280fa7fd4279093953e4ef3c6bf23aea3acc1d3c260632c7e91b39ef02b42ef695cc81bcc709a62667ab2d75996b25ac368198bbe157bd5f43adceaa81ec5a22f3c06307a3c366771adf4107c002d26bb74b36236e1680bcc7b5324c99e538a32fd438fb0fca447741f34417831cc1483610501c566cb5266d5219ceed67da9d5b870d4b704b2c2c3092af330c058d45de22183c7a12543a62c57853e797b344bea8b291979df51b094b7885188a8b1144ac62b10ce4b9f3754a82ea301df6034e4518c0df43be77602c9972a61794b84897c5b4203cb46c145f03337cc3bf758958f5ab5a88a2d06a2c289a127fcd6a40d562ae7d2a30141898dd24ad83974ee08a4d8359b3fa534253813a2657f796bca9a2b4f653373070482f2ca2ad1c4103ab3a94fd37ac2e218b9c47471e49ba1f8c34163208e18819734ade6c791f6ac7d5a8994ea225f84697c916b26bd2935202ccaacb733c8076b7eb9927a0058234ac2dd906f277b211e28bcb241ce9d651907999c4f1ba6c7eac50e8a0c5ee50504761a57306f54b18c4e7037c7b351d5fa183fb96caba5a4d74ac7c5e7812474279e5b8f2cca59f6d0a9163a4eb765a8164239e8550ab5262a2b850c6dcac2a3f9a317ccafd63951804a7ed53c4081da8982f6846860845d4098323693c86c94f38aa2aa4a1c3ae9c6024c3d01e78b746b5d21c25b19b92019e1b64dc82f8c2577db3abb364024ffbb25351c66ec369bd29a4e24744545a4308a676b989663f5e730e2c90edddac140f978ee577c857924778c83ee95750d2666e4a1cc0b56c87e42112f12ba5341cd9178aeca76917c201825c40578e67d5c516f75288ce5f695f8dcc999452d84c05d6062577f158cf8351bdf768b4c95c7e76c0cdab08e0e83a0458b0b32d5621c688d675051dd4c0d94d5cd3a7a64ebf437aa483437313d3fb2c451972ea9072fe3ea7ec6652299a04f04f97f18993a1f426395b9331687aa033b2a244385a9bb928a02a93756c7db86c679a34016d86a16e5c396ac31ec92a5db94529884697700721ef9629c703b3cf33a9732bb2419168f3349b11b8040f898a73b4f94283129051c110817bad7782c4228f874a169c65078b48b6134cb09e8375c085f7b93659da92f35e4c68dc3b1aa05a0795c91b8072d04c96036928a01884e58013f3b7205a33bc5c7ba4e7b240f278850c17a0e4fc3805bc319afe8564ba6387ba476c6f81f7bfb0bc840738538773668ac02e880b588330a81c1aff09003ac6ae4d739e09017ac49b3fb9a0e43370bcb917b1007c720918738db4cdc68c41ff13a83981f1751273fb32eb8c091f629ab449438c8c515c451552b45a8ec316d5a88060e8ac7e54ca1326c2974e40590179908099d262a8f7187125ed951dc3abb50a46a0565c91f8c769d8c949a43275e094c8ae805a7caae05d32d135709d5c4474e031c6ffcaa701a4994c77a2dc2c95e113d0137a1e0b70f41a4c9497814b887cb0898a6bca0849240835c8c83f5a72724e320899a09fbbc790f3a4596f6bab0499d3893b316010bc13399aef463b6d02043aab6113529089b195964920493acde5009fca59a152b4048d7ca2dfbb00b67ceaf51309d3b0d8ab043a7f3a395aabcc8c8cf3794164f5c6b329223b5e426c0cc4dbb050acc749b4d2b5b5758b05bf01227529d40eba0d60141d6e7753965cae367489de61cc846ae6e700f75d69eed69b00c4782971a1bb6cb21ed0745fd972e8c3c411c81c2049a1a55b48d0b3078bf916e45f719e23a835c83c537248fef084627897e5a3c9c1ee5ba9c7aa230514194b50a8ba857bb87052da59ed675b275b02ee4645de605302bb80c5d4a9b2299cb82a608f5d88e6ba3b70287333b839835618174639edf688ec1e5cfaf62a9940c84dbecc2f6b02d0a8888ce9ba70c660597eb9f33a43b89893b1bc62748f711e93347934c85b57c80cc2c413028a67f3b22fab904155a3f94671519a746a9a43fca8c0b07fa14c887a334191af3112f56724c8964afd27a248d99a4187725b1940aa40784825b059626b8faea80cb2714cb6092a9bbcd1f32aca763246b309a259196542583e722b35b3a9991e7adfec40d0571a9626215478256fa16c556b146749794c4da623c73804b41119eda69166c2748402c0355c897a71a59882e9ceac50e4c293437b472c48ba0f57273782b0f862f7b8668a6a2aacfa16bb5572ff1c55904b27630ecbca6212ce4b96e674a7d403285b326121497625dc80a08852c8488c1f66c364c93bbe5739e1be198a6dc0fd2fb7909c275fc819fad2c4cc31a597dd56012110c09bca1724b91ba2717b5d71de79450c80b98cdd8cef96b963483b80db768553acec36bce7fda4593e28b15ea7a62a476aad799edf6c6b718ab1043c09847c5ddc983f745bf6c198932800389ec3b58d59b26ea9638847d4dd12925b376268364c4e77fd8ec8c988045f17405a2d6cb652a920c3bcd6e4999cffa8e1e205f0ce58ea445811199c384c1c7dbe2c740a62da6436a13bb7df12202d4e95cc8d96a4356a0ab8a44f6f872b55598007d0c3ccacb630b5d3baabf76f58c076510bac26e69a7142817a85dc4862ba09474443ac9999e8d380c89c605c4eb0129a4abdb662aa48caa90f9aebdf84d860b7883d42c0b20cb7333526a3844b0f40f02c185aae7a4c5bac72f473548b40e6e906a4ea799a5616c06cbb5167b27bcd41105b1113d04b685f933d408291511bef2a390bcb094f4638c87d15392e235efa8432c1a3f0b66a23b190b12d15f32b952e8d2c5135a1e02b63830939033581ec3e422f7f4a63003b446067659ec569569039da5914a7534f26219102bbfbef6923ffa89ccf044ef7bb904f5794fe22db8cb1dfa025e48845e0d179b19d2cc631c74119a52b0557f90064c181a0ed54754bc84439e200208125ccf73103c6449e10073c0913453192a7efb1a822220309338b1a2077e9985d5741ab69ab7c91a35c6e15f10308f46715ef082b2dd87845dd00ae81b6d17f5202357302b0630f036256047c40fea5e8627395d7877d9db952469386a1949012165d419152508a5ec67c88601494292679963629edb7f6e1a66b454cdd704a32e572b68da7e7d2c394bfbcab32c89ec8838566135714c0069465fab654cc4b7bb5745b4577b4303300e84a0aad9fac533286a01d13c4da4a67627420dd97e511173ac63125f5a8e9fa0af12938ef6b29183d254f8099f44549bab850709bcab80c35507467986a55244522fe1ac4b7e13b9f3879b815384c7475fe1f24973132a0c78af34d45b29f91b61a55da4916d4a987afacc942eeba991766717e888e9d63420e54519942ebee62d25a0c05a148cefe31a8c5764c022948a123e0e8b44d5547da39c3969649b27c6299614a01fb03843c4cd040a51596c9d473524bb5815e341c8bb02c9d9a5c4a88a60262785844a8d72b33b34e03ac60104a80c03b422abda9a0c51984ef9ca27c2d29d39d8b567bc2091954cc1da3cc57827e0251741058a44026fd3ca7e59931e1039bdb06a8eb45322bc3ab0995b0d526751453a52662b008da82b090206b55b90e464cb874b343b711d50529c375a8e5b04d082a8a317c602e244200e00541fa7ae69e54922eb5791b58492197d31f970eb90619c7a746976649e27030b033b6d0950bde99a1b45a383946cad7286982b86f66976a6904b2c53b7720069b0d4615a8890325933f8e6b9196cbd08ba52ccc31a3bb3627c1606ece546992cc9ec401080811298ec7b723670193a3fd83180970b8629ab786ec21509fbc2c87656d6654740398762c3963d9b56fef269803003d13c9b7b54bb5a90c2cd7c100ce95d2360bad76320589611f3bc71de31c838b291e1d7994e9c583d127748e944b3a3a94ca2a9160b05ad993cef1d503c812772b46e9dfbcacb8b8fcf35edc09b2bf68a31cd5ec9796882db23b2c26194545ffed2e92401f84476174dfdec31c7e94afab71739109b4cc9032731975033db7b90529245319e6a1ff86b93ba4d8f19340c8ffac92a2d96f315e3 +ciphertext: 2e42fa5e35bd7727f039f5b4e3935e65b0e9133e1088aa52945f5c723b8cf0faa5991a5a29dc788042beb590a8aa6f8199e2fe6537cbfc668abfb79f7c7ee5a0983d3a5a5719567663defc772c9dfa6558a4aefec285dc2ffe4410c7de2956fe8a8fffae852710d540a819e2a886cb39bec77d5eae6f0863dc3760d038b205c21068f4e5d4214bbccd66b14ecabdf7236933c642f122fd4bb88e5a25338c5f4f78aaad683d21d453840d26bff234f8701f261f5d2e328c048946755b002f2ae5df6d86a07e823d0f43b808841fd0c04229f314541c5178e6f1e96d3a6c2a2f48ae5c2d15b45f31baa2ed0c42e81145ef7fbb9b345a29fff02e2914ec20a1ebaf6799cad5ccad08efe7c976cd37e3a4e3bd98b5b17d61d655feb7f364fac60083ea60c40e16377bc4b1bea1b1b190b07944017ad2f79821f0dd881cd81ec73da0d29c0c412923a9f52153a7cf71ad290ff670edac81dc837119784748383807696f2bd20d853d6da34a95979229d8fafa6cf3f3af15eaae61f8fcc83554a291f914fb2b7470c9417d7909432cca8b32b7f5195cdddce046cf9aa150fcc441c303fbe4d8c9b134543ff85ddb1bf6ad32e486e6415d083b102513960906b250c17f1ef1838c77ba085139b20e7b2139a06c1cb8c395f6bce7246ad76fee25fcb7c1974a4017af4f53e369f2e9f7545614fe0525e7f3d9518e330f83e9dbeaf4cd5653e5d466307a85f85deff93f3718445b684eb5d0044f4c6469d722c5a186e31c09aafcfbb0c6139ab10973d613251ccb33def17a6f3e3b125b5c1da885461b0d723efd1d9c4af7a70096ac7cee96d12e941821f8dc4ffdf25e36829111f678c46a342614b1071ffc366d2a2dd78761fc91e0386756a8adf38baa30997becb8a910db18b014e164a0af795898ee7049f8e943cc474b17b752311c97426a90fef44f9cec08c840d824d6e5479ea6c57e4c5dc602f71eb2c845e44b4df36e139d048b8f54211ac12f430501adf2664e71a48bfe9d2ba0883228e0d1b171699176af81d9171b49bb61ef87ec31a64a1a0b5f10e01f2df6fa036ae153c609a4ec34e443571cc345843f6429f0da9676db7d1c885da4383304fcd21f01989cc6b3ebc40911853888dfcc6eb246df23a660ace311cabcc5805f010dfb3a5fe5d7c6aa1a3456f20fc391d35ff25b9b9870b0b9e22a4a533c2e6cb685fa3c9e24f08591ed554cf67f7df403066ab56a10f0b8ac5c9a1396a4212717f16b222b44cadf3d43337d0251c8e457611927e2756f42a3991cc1e388ce29e4eef7d20da8db77b014f3428476ae5ab1e5af36c5e13cad8740cc2fc96776fa8fc2a861e04ad129d9c2c521100755bdd8797f98f2323f16a7930d945306c66c902339757539048cc50256d85335a7861b350b740ad730c71d9aeb17832be247b3896489169c3e866c081c7b108e8c6298eb76522bf2250ae328fa9bb7f6bc29142e323ae9d30a794347de4ba00666e721630949c63e9d5ae5cac6c195a8480e5e3c992d801b5f264fa1c148dcb094587e9ce37564bf15097b2fc649d840727a4a11233fe8067f820ad697400269e98aef3d286da3c06e6a454a93d0b18c709235e2ce361f93384c0fdc91a68b7406f503a1871ec38966b0ba4470c0513a573e958a843b0574c7656083e5152972c02bd1e6f8ea1c6037019399b68fd47bb0a8a0abf0bd1332f258aa5ba8670c34990d4ee6151c0b536d111dff02a435eab7e30864619835817fd5c2b43c89d3a376cb7c58bbe5c979e694ea97a16aac06df07078799c8f288e5884f32bbe5c3afac72e1d57d5638908e97b41e7000ff1f89cdc2797e021f8a929746ce8e8fa73d53bfd3b5896685e8db897f5c3a23b14105730025407972196dd7f7d9cfce6a0b7c502c2b1f5535f25bfd7b8082325bfec6d440ca1b91b128281eec35d80612765ad49e43ee136179988ba9412040290b828c7cdfc7a82b70862797f80646fffe1ff2938ef2475e5837fb208d99f1e635ad1af8d9edecbf5a8505782acc71cfb84b54b2cd03c6bfd8bca2f0ef77bb59a814e8aa784a1af0475b8caa31b57635c9537416268145009500f4469ed2b1051bc2a91f205f7b598b9cbe64b4306ffbae88971e6163b451fce9f132bbb1d626d446e018dde7f60cb6540ab66c51c416a22cdd0543a1428b5225a7d41749bae89eb09678e14aec7c8bc6dd2d0a +result: pass +shared_secret: 269df7273fae3797f0d5b5853f563e955f4139acc34f938bb51019d5229c551f + +# Random ciphertext +private_key: ff3c6e4d98687fb91bca421a8c689b998cb83108cdc0c484fc750659365a0b9383f9624b69cb496d405231fccd4fa41bfa55a0d7b82ee3466b0e5b5bdab679da52c1f68c8000371593d78a20445eb89c6cc65bc79a41461f0bacd5374404968b12335f6dd70b9a147bd0f3235b9b7b75a63c70e9ad0bc371fae05db0ab04c7c5cfa5845482866b0ed86bd8218f24c921c9524fd68760d640be7e785b96e42ced37ceb02bac90521ff557223e4cbda2bb853703c95cd44a0e4061365c7a801954be6c611694be9ba46b5bd0599dcc8d30954e36b5c606b8045be4bdeb3987cb06a818b3b8344b5736ba1878fc5bc3063a70c275be4a73055155b9f43d77f71f7b9ab8c04207143825876116e1c49123c59bdc25c6c88123a22995924a454bb3678ea856cab454ab0834895320b9954ca105bfaf9463a6669fafc9859f6952ca753e5bc19f9a7536e8036d44fc0c9f4130c9c227ad9c616888bbd2164174092a25b816c69c94e646071c562230418c0fda3703b215d6c505dd2557052296e2e575c5b460323352dad6b099e91a83639777377ff96513bbb3ba7b8575c83c4fee7940de00a8a840c74d424e2d0b9785ba68c35b7b53a89639299194a03bebf2ab7b70bf55f635b9e92d7f36a68531cb469211aca573de657969a60883dca80adb0348010878370f1cc4010b5b3fa76a8d460c7e6b60acb0079b293726968b000f032880751533f13cb35858e39b0d2e89a1cac51a2068477ea11532a6c5e01c0923d180d4e0502206797ed66f9255cb40919feb376eeb9450e43491a9854376cab82fb0636f512ce7c6966d00c990f22e804c506f60af05d91777a01505465b0d4c7b770968b94a242cfc8867a12baa557f3415504bfc341d116bc46bb738753252785570471442919101188b460a7e7accce13249230648011410aabc653c0266455fcb47ab3057b99956783333d7216fc64baa5278bc8ecc38cdc097519b8301caa69f9778af6384f3945108bc1ecc9321fa14f73d38f01cccc346b7b21da1c45380e113212dcb06f7f182fcd5427a304b823e402b6717e686a24570a72f2a03f66951d232145e004243f6690388b0e1d77ccc07954d88cb4b47770a6753b6cf060135753a5ba57d96a1d2f8143e5b6a3170514f2e6cf111803e6ea3bd61ba1599b8201941e56d64aee377b85d36166dc9b29d26ebf807194d6692e9607d14c2fe24878d48c7ae284a4c5634edaa034ca0acacc82a3844216d308a9ee3856d4469792a74fae237e096b6662195f210a6273e05ad3151562bac496ebb3e5c6969a240dcdd7250257af1ec18a9276c8b02909f62ca0f940c1599a4fb9e9320bd7053e6627af6987011110549b7a71400d6f0bc891f220b4c76a12d827d08b897b5c144fdc7818d0b9f000474f814c65842788c5631ee32ae9c22f99483ec7a7037fc56ebd91160b8371e0d27179cc566f449649fa6682d2a3825b500819b16e57b1fbb117b0ba2f0c6b8d3fdc9431dc1dfc808a008b5d5018a784d6a18a15af0ed16a35d8c2286748408b5b87435c61855312739e4f54bbec18433e4370d2d9b9b00a5a5c05b883b41d6cdc487f51638911902a131a0d80b04b4a13418589f7744e9dca7b7c184da01450cef83bb1a0bd20aa3d5de77d056c9d6dd57d6bf45f953c78aed93610928a97a84e74559e1ba322fcc496c2aaaf11209bd6226ea3c1c6eda19d509ab25bfb2e5ebc1d67d3a858ca418e0b0eae56263c3c958a159f279167bb412b188cbaa2b749e72117642b474af0a42bb82901d43ae3eba4841b59e594521a252dd661cf9dc87be7108b1941be6a0c6fe0eb74dbea4d9741b9dc17376f333e7f4575a28b2459c840a311ae1df48c7c33c238434d4df7c8bde28221d655e6237e067cb2448ca1b212c590346d3afb6624d07db5fb2b73675eb775336b33bc622336cc2bb82a972fbe28c40f232d6cb9b014d65713aa9b83925837f9aeffc1cda26c9ebdf3a97717c1d5a3ab2b740bc697a6bd5b11ef380ce0a0497e1b0bbdd959896b8090b217352a9d7fd00e86c47342c23fb932616a8c7906e362e64a1dfaf6836fba76c383775db18f746a25111539753a4ea91c82213cad3a4b85e8c38034e00c7a183032847bb9f9cc8f20a596b66259e339cd949b48c9c13472c3cce20dee452358319477226a37fa9170860ce5cbb28434cd9650bf264b45f989845ba06f0d2cb947c74d5683139866449bf54177081960455940ca457f2ac9c3411791034b75591a7a2668010053075379920963fc49c3144b86e3227307d425dbb41e559a3ff4c85f566cc777005f39e7ceb4731ac054ca8595783990ca11a61f39e36f3592c520989214eb54c026198c785b3f8b779e28cbf99c111cb88447659d6336ca6826a91f22c7462487caf39032f056ad835c8b2237e499a81a5ac825a68f2751876171b736594ff6851ec34031ead097bcd14059ac1748e206cef80ed9a652fef316f0e7b009978afd058ebcd831a972293cb04657650ec829438aa2079187283da751a1856f1e8c67330b1351d1b506c55fdb81a3af41112a262c18da2e96246dfc785fc0e853b1d243808822aa77034d9a848792a23edb5e9df0ce885454b19a6155aa7edd8235c9a86a4844856e8947976a5d3250107411968683a00b370348685e87a92ca39c7620411727f26e6eda9611107fc354375fab54ebb28fb081883e224053e967765469427b13b94a7d64ca26a4a610d0628b855178a6199bf78128c26249ae1335eaab9ee7ca58e859cccb81b6e019151c697558f160d5e55c0a8ca0d772cde8f7298ba056bf7558129cc9b5ec9d578a3c9452cb3f942fbf4924ce4588494202c87cc37681cdf5c7a85470bcc088c5159ac53026a4cf515ed894c531f434dd08895b8bba07c3c6af50b8ba2316a346b175b65687a50d9647399fd1c17768a125b5cd0a5ccdcd0986c53bc5ef16ae95833ab7948559d7062bf51b13fc5dafc976cf7a87ad419ac380cdb875767600940b3a3a602a289d1636ab2ac574baa0ef50ad4d6c7256153c8326bc5b2029110b60c583ba4bc81997bb17535c151c00b98d4c631a00aba3eb24982b9ae0f694a76c22159337b020c2a7796ca4dbb8b497606f7ab3e8f4768a73017b054adbb96eeadc0236d3c49aaa3430bb0d4e9150bc6b9cc3211c65eb33abe87de3c576ebe84cb6fa03fb4426579c7c65ec16b041478ea0a03c30267f369819367b9eb7348a48c42161bc584a719e1644da3caacbd55b92f3836da9584aba92f689611db22ad9faa5f122735e3794f6bb1ede97120ea49cf2f4c7b4bc85098a62807a7b5264623a97c0e862c655a2258ac55055b5abe52c7d16693051392642f5179be0689840120f58ce83e28ce840a67894c06a323ac3cc8d4f2221727422550cb30895703fd97131a60145218d3a049d20f75a1b383c74a96af4ec6ff596be8c7607e4f17b9e1222a0c3535bc17171822a3d4c8cda4127d98abd3312adb410cfbb34584cd820df4a8a979413536b7e0fb9ad9fb2a83e8929e1952f0a113416eba445b1c945142fe98905adc5247cf63d15d554ce563f9053b2564567ef623849fa79eaf996b0f78eeb14c372d69fefc008886a887a447e8c49bb57f69572e883d085105498b8ac73bda46b208a24885a96a2dfe1b9f1d0886f8cc35f3a067d7c16e67c55c4308a03f6570cc6893cb4cfb84277875c8528da8d444ca6de631bd361bed30ca66b79194c8c54e2489416714a0b1cb0a099992b242dbdd80862226a17820e82378c1b9a197184c3ea0c4c3b535be0a075d01b150db1253ac4bec0a69497092decc6c294c4226b38ca3a04c76a8c53563439a26a77b2b102b3186483ec9bf602295ee7a28969c308431f0d34c8f6e614bee9983728a741392c7ab133e541ca978c30bd40b0bda37029b05a25288a97d3b807d11ff8c2c3bd0509954ac526759bf34b38e30923e5528cf5b61bbe534079e5c8e712765e64118adc7009a8a994a9c871767cbdba458027a218c862bd90aa118829edb4b884218a9f596503a13fcab8b78f097ffdac44460605416723e3c95b86b218dbca0e733c19fc77ccb46601c1484b78bac62c054b60f26361e6c514d2cac56b580e93c2d749c48d2347951877c5d139d6840fa61126f4e4b9181131dba6a1b26ca1af2a363f813d13aa523901b8b1f89ad8e51b0da3611144a7dffab981d4958d327956728fdb1c5f72dc907c236392a93953fa13d4360d73699bafcc6d7ce14f68ba860e7275558c2f32248fe0dc14cd0116c6fc1563b53cf7aacfe54715dbf9366e9bb668e99b53376fb22b0cf2e84e94eefebd0ee35b822e89ee8542c4088ab2c6cbaae08b4edb1dd62a8a76bc0c242c8df739d7f1013370f13c2607d125413285f63a8b49486260e0d48e1b42413bc6df948595b0c240e25a7dc10938304c07f2af0a990aacf12167d7fb646ba36d +ciphertext: af041736d23d1daceb0069cf227fb0ec2a27e13707f194ceff556f3b593a9070b830e0fd9a3e3a1745863be6981c204ff5ec896d87ab64a75f25d78c9566a62e98d659af4291ef9218a8cbbced4835dd937f9e9340d6222ebe20d2d50b28cf557c619e0d889715a4f7f9d00da90b1a5797173a3753a0fc7e81caff030a8cc2bc81cfa868869454c3d748dc2b94de61af2d115d2e662c4f5d593cd66f4e74f8b3d6b38dd5670d3eec06285239d54bd80f9b029b20deb0bbb982a55e218a656c55ce64192cb5a492848e8c447532bf252e4645ded1b42b90badafe30d1d2f65a5e147bd53488e0acb4b2cbf7323c87deff83e8c897deb5abe5645ae490a6d90d64343e8c89cd5fc2eb7d70f3a78a0233edd6aeaf3ca519a7ccc2a1958731a37d74bc582e53165499b77f9807a40d55f871a91b48ef302a90288e5587699647f3bb93961060bd8b3cadd218a3f25da63ca175bda7e23f90f2ab40a803f7b71055abeda7c2b30b5732ad861a764bd7cbd942e4af691fc3a000d028cde477f976c58ab35ab137f5489502d1cfe2678f5467965bd15f8c5fe0a18fa4dad2be45e7b08b29f73919225d5de877f89d6d353171ca84a3ee34ef5aadee4557134748c5a9e78b3979be2a8f24ba625c800b87bf49690baafc40656625f700699e61c68c0578f4177339c9cb66a0996298b5c110e26114017d57685c24b0c39832adcfe267be5445ede68e2235a49f8f99fcdb793e33e806db3292139476b9240b131cddb10496e24583a1ba633deed5dad9d3a42801b5c747db0a8ac59f65bf663397d22432711524f65328c9c76dd63560d23e2894c0f2f5867c9d1d0e44bfd727fb984187c362fa9a386a998b08bc349075dbb0f1ff603d34d4368c71f936ab2ec8ba0dbc814d33e4ad57e00316e2b255f2c7189dd9c4fa90fe9ed7c5f11ff2f81c81627d6a178ee323678a5ff3edea16adfa74d431a3056815a573c1158d06a1e305bb8262d050c26b774406cac0a591bffc4572a27c6b5be9b16e6efa2ec43a942aac05d42835e8a29491ada39011fd648e2d75247da22e220f019d39de2dc0b2980f925172826d44eb1d49f3e002f3fb9b5a69245b96f097744dc84746141b4ec97ad77e4ea0ca7d68f039809e956ddd689ef077a981fcf4c824dcb66d68551cfac6ed3befe40160ccb1d87141479c5357c090d7d476a1608c89644dd5e4a96745ed64f1a927fb2f922d5878b68987877c5d5a30c6df18b263bc4f6ec54c20071c17cd5669ae25974158e4f734ca99bda40bc2e4d8a76c55a5d7135b9679f1ee82aea90d7b2177ed13c958021ae54ebdd5f38d48cef6d575dd2d81727734d940fed2c9d89f4aa8134a99524a9e526821ebcdec8331e80cf62a2dcef71dc888f5b79b1cc61a382130de2a9c53c2e7655059c80e0e24836c36fba9be265498a24650200e09fc81d079deff57039ab7eed350c59cdd4984bc2f7572287e610666fecaff9a39c245c35439291847816ac2488d8c01586f88a6f99640b303c7bbe7d4290cf454d5e546c94e86ad860388f1553491fecacd3c73839437a1c3d1f51e195ca391cf8eef2b89ba960082f280201dd03a2689ad3a7522b1b79c61887ab37da51e978e943333cc18cb56b8888868c332350068ba5913473a666fd10e4478e7778f784b76d352ee7b07e4c93fb4f430a900ffa3361fd0ec5f27afc38db91534655f735743ac857b6bfe2c107fe458e6483191890ff4e344f2866a52a0ecc6461718bae135528ddc77dceec6f956505378b6470edc2377991d4c00553449efbf32111ba18a7c53ce71dc72f8228ecda82221fcf21964d58907ed680b1d7adb4213f2fd8e37fa18845c8c02a065c85d360777d722f91943a6164977ca03d70c867fd95519b4f1f88351bff895d90aef8e9d9ac4a87335adad1527a9e526890942f881f8776e474867a1a3d8a30a6bfeefd182a1db762182f60612bb2c462dafc1b5bc2f797e56db04294e19c7dc2671ed1510647bd47ecadd5754e9bd6ef9bc19153115d31ebcfb8e11a9c07b19797109ff95e37f912a07da55da65586db800fcfafbd6a9c18e427af47f1ab42aa33385fa91255f6a5ed3c9ca7ddc9fec0fbd2e4e14406897bc0d405b3006f66638ff34e31bacf13bab665404d231b4a7e345a55294d7c7efdc844e7ac557b94ecbb2f75bf73fb327e1b8e65294c15e6b6c6a257f033c +result: pass +shared_secret: 69ab30770f491dacea2e37f3c737b2f49cfaa211f5726436ef4bb49959625f24 + +# Bit flipped ciphertext +private_key: 88095924fba467b661da9b9a24882b49ccc21509a04fe9321d3c6524760d05599ad3b306774b9cd4a4cb402632a7229caf081b6d1120e9f042ec691d2e63c80cd2b64a457d1fa38ecc5097c41a22dc48c9b4c7b7f5ac4020000f26b6bb92e72c3d34293f60ca3ab91d1f7aa83b2ac6c9f20471168d267824c810186de4be6ec0ca47e30985108663815666624b3ac355605c77e93a7c6cb05968418734c9ceb4480474c5226c4504a9909fdbdacd49eb3db7d7529aba4733c6c3966481a745455382c7beb3bb73470c91cc5342474d933a06aac1372aa018f2a940836cb4121b5b889abf62b40f25a8a41337b1115617d02883383bcf5511b8fad3032169a35f14be15537a29d64a87763991826271e250af391533886a1b9a632fe6a8ae63186a62c573e01871190167382fed922b4e6550557a1b9be3a473aca18ba96430988476113a7c25238e6c34d03cb1db883f10a68082a23f31f3b24675607fe45a04236451ab15d0b6b01a184dd4e467c18445c5d04079071efcf1753a6707e7fa5ed0484a67cbbc6275c7d121516bc320d1c955ee2c62a93bcff324718ff94552619310d90b43bca2b1dcb84886bb91981be7008e14843e1b63073708bfaa1b974996940bf10d8f188c17c5c58744799dc6ad4085cd1f09aebb4603f9cb761aa140ae2875f83b9574b658b23c18ac8a1ce50413b0116417eb8c072975213b7e09509b9c3706d6f2511984a2e5692560a0c868d01c7895c0ee3a2409bc4e9471baaca69fb2d4441cfb87ff4394514233d32a049051416d79a96373b97363602f7a84baf880d0b50910611d81e7b5066544f6d17cabd479200b3d070b4496f01f18b0af16410317f31d61d5a1f44938eb5683ab55366490ae072084fe7294237b034546a1148c6576878426807046b44012a120905c6d627ca85318c0aa6649785329cdc841c96aaf459649ea5423c5126bef27afffe80c2833461345937b94343c20793d0946f0518b4e9b606ba1067c7038a0263ee99105bd88790829c0ff6142837b7fb055c5d846b792b723ae747503123616981aadac9db2f14e7cc5179879644febb9c5ea148fe44b5370be9df10960209dc49931635416d3ac3df8ba2ef3f63a553c39fc964f0b964fce21781c5c4b3d6aafeaf5a73ae5726b191709712c44d037126143bd16c2b76c2f092c4fc41768f0480a1ff32649029a4864786fe9b3629b95fabc40c5630a8d4a6d20c73a8114036cd1a2ed10895530165886351f75bc8afc35513a4a534018a1029f13f260a3d8cca101c431551b00b3134834477d31263a32373b1464cffc0b5cac21534c45fdf28ccdcb5cd39617c82a627e2cc7f2d4bff8581e5f02a6a602b04bdabb27ba489f45bf60730ce2d638c727142954b48c327515b539f0e895bf3596a9ca043da98e47da9b323a5a6c77b9a72c4f291537eb4cbf83dc561fa183dee9b612f975f57844cee064f0d039c8120c33616bc2d0ba14088eb99ba807dc404d18b27c741189ab7dddc157aba5768af10c79b1a4db4b59459cac6f241e0ce8026bc206e06ab267ba82f33b5d3bd83c0bd2bbf55cae189b6cb1ab60e68911fdf81065a90c2679a6f5f899c9f6c078153922d5761d35ca05d889357230e62c625d410d3fc63f355146f26c3d98d16808b5539fc71d52382d49b09e5925720060242f3a7043479b806410b5b957a7e75454ea6b938711b920194ed81ed4e65e7cb866d48a66ad0c3d4442ce887c9addcc87bfda49e78a3a196bb8aef891f47524a97008e32a5408f0675f1b1c26fc2e8d94ace86ac52b58afcf2c3a12d254eeb481fafbb53ec677e6873b5813cfa644c5f227bf70c96130ca095294b859e928ae21ccb4e848869a1d74a3509ce37c713257ed9209bdc84e7ab240ed03090556766972b48a8abcba8c4509390b415a67056754ca82791a845d9bc261d2e3035730ce6b12c678bc9dc30a063a5c0d088c3009f666700b9de0f6a8d5f78bca7346248243bf27bd1e31516edc3bb5002b3d05c47a23a1f166978400c49666c7f55a79b770aee6ea7ad31a61ed9ab31fca586a161d6f2960618c1d50885058d926c89c4ab69685e9c76105e765dcd4c55f52b49fba5a11167627fa0628a78477fbb483c16fef5bc129d16d59f157bffc62ca9b83c4848923b5602ff123909091465b22fb849286f8b56c2b39392aa9cb28229e2228806a46cf60608f15663c2a9556629ebe5accd7242535aac686648253cb72fc96914c6518e2fb7456f54e94e1b0e2b87ae2f125596a2998b60e30a769e557820ec95f9c25482f8a7f8415ae7aabaa1a923385abcb27474a71881ff3e307c2718b96daaab8fa482fd8ac2ce569ebc913db164dd288c25039366afb9dfe200ed130cb71913b23623780c47a3f79aec955440c18ac6604756e2b55c112c33a7883c4954e15f723e2587989c741ac95399b7b2537fb686cb51dfbd49c4489c2241861c24ba239801d9cf03c68776019718fbcdb12fec59b2b17c33715a2a223a260841bbe5164daf32e1a15be2be706dac1541bb23b1c09044d9520662b6a7932941ac24d169893bbe16ae7928f16e442db688072e95163253185398397847a831463e98073d81c081f71950b265f9349cec3b004080061c6d1c4d8f63b460b187aa032c77a0ca49085b66493e4f5387d3896de774232f56f70c39c25d0b91b59994f01b96c410db7eb40f18733bf60a6db5630730910dfd28c5eec71f19111c3a2227d2b2ddf3947f6c020bd632d3b3c8c3f4018a939269a1b6628b2ab18270b27925f60bb6b8db3cf30b8b6635a10460aab7064b99aa0acf119605fb854c48070897b6d8f2b433ab8c0279061753aa93c9506d8aa2bc8a96e293999a4eaa4f759245e8600a989c6c4936e60d2c7fd5654872aa9dceb6726645b2b788849477d22f59a71039962b2b7bfca6fc8528b0ee856cfa22238736afa4131ab2627328b9f89f0adb6390017766b17b70bdc749140b7313bac637567c827bb1516b43e09174653649a82e28e72b9344b656f051cc0d895cb28e989a86bcfea69610c435eadea28c926c55c794b013700fcd49ab2206a6b3c0df7c35827648124c845844c0c61e01da13a5730253392785bf53849c090cc5b0c0395f337831bba250550e81b3ae0498397836abbe2898c56685cd692d0b65519f9cafea6af2e02adec075e31297a3010317ab2829e1a8ce73a9ee80b4602c70b3172cff37b172d1237997146cdc14aefb25876ca10d3f5a11dc70d3545cbd48c72b2a61dd8a9c750e50fae3c219d5316483415c1119b08d358a11830a5320aa4143e8429404a3899ec5763c1780b1dd96eedf2b600674c57500984129cd3485238c83eddd95df2d21cade9928e06a864c2c834661bebcc9506962fb3925dcdaab40f0a702f660ad404a84d3a37284987bb05ca79f56a06a417ea2a35ea9588018cae15d50a82ea5d68f200cbd16636c899c287c4fac98725f699fa7b25b9373642ec32a7d0701e92c3d3859452d65539c5b959e18d7710cdee248ffcf7636d96a87e28695aeb60cf61b7b5dc3a66956cc9562742386249370a6cc6be1fa7b6b1e432a78c95116abc2ac9a770a22313f1a0dacb602ae936b5808a2c403cd016abdd7800a39b48a8a1ace44bcc2c82ccbc891f98d1a9b77712250b9a51facbc797a00a0a5c72557cdd3a2760d62cdfd441f4a009beeb21895a6ffd7b5375632fc59b71788068883698f8b64c1cb55feaf30606407b353742094934bc5274e89685ce3152c1fc038aaa43d409003f523dcff56f8848133e93baa87a7236f93a11052d8cbc1fda46221608bda5e3bc3600ac851a755c57643875b720946e26967e8b60508f41a95fca91cb74c7ce2620cfeabe10da2094273907d5b2450a43a0d53befa77ccfa749f6c9033244c1d9b07d4dd019a0447efee477a57839d31b7d8cea940471bc95814148d7cc8aa8993f8b715fc2021d6c6cc7108a2b3a0c5d18c9e473c5a184c4caa49f4d3151ca145089f34f96b1761a95bf38693b8e911fa6bb01d4499d8878961d8670b6a5b50ed525b5e622ab266df45cce22389570999c6090695931b57c0b96c2a7cf00c69b851228c82ab3d2062895053d9687117eb17e7c4c55ebd3aac6f80730e335964b8d999b1217f1a8a0ca44dd3278e416ab36597ed61cc29a87c050da01b359b96d47bedda8313e0bae62a240f4b42ba1fc01fbcc55df53a2cc32b05c9c44c0729b753a079340ba2d9b660ccab43d2442458931e5db37b3533d3ba863c25b3681f1709f81a13d3c07b29950c82b8368a435e7628f4729b51c87932a57839f26a3333535323b7aa84b8378b3af7d38995d1cf44626a2ec90630f5c83684042b6adea9e1f7a3cf5872e5b211e0ce7d0cf37b1571acdccb2a4bf39d2e783ae850afc9dc2c7fef0627add21d6172ed739d3c57117969dabc1e3e9b90ceb39f0a5ec2c12f1fb +ciphertext: 9e012af9b504459c483a15f606183a7a6ae7c90fecb5d09166a0f7128e5c7ce147536ceeb76871c678172e80f08bf2f5ac23c09732459b82e7df9a7fac8f0c201bc9ebfc814642debac4a8db9d4200b1f7599613d7ed5cd96db9aacec63d2ee68b3e997d9c083609eefda47ec8b232b4f17e85c999407d0af9b5196d033ae27433671c0c8013cdc57fa61245dcdd7737c7934f4c471f16cc8b47641ed59f4c2f63f8498227d97e2b2f824b644136438a47a8d48b9a460fd151a30854bf8ee8e1a95a5e1886438421c4211e62b880964925ea1d92ac969b43a4f58e6f30e06eeee17321c8a2ffc16e7bd029375604b03295082b1cf181772a9456b77fea677201ee74efd5a4d7b19d36854ac96e0a9fd5c452fe2a81b526e7f529198a5a31f33ba81a2a0a32c05164def01968b01cba6f385fe5090d5402d276fcc0c6ef2e39889f2d30fd423edcdab0a649559b102d5f1fb6f8f5ba317dbe1ab0e8adee21cdf0e84c03111f5a885254ae7e20ce70d13fce3ccad6282eb152ccc9872534a77d4212c064c3a6a69fa7778b05eeaa07fa7704458e52ece113fb5301c120b787400b8374aa180965ff9f92cb5063a60f0323b1b67234068a06b11747322ab7934c4b8a34daef4f4304a49fd390dfc6700c5c61bdab40f6824ae01c642aa2cc797c2ff16ed39e76a97db34dce1b09940c845ed1551adbe3584526545a09e052113f0b3a5cf918011c569191c5153420731c638b3b792207eb44e22783fc814e2930c7fe4fae1e2b2f2c4900f5b0584af3f1f8c44074cf6aa8ffd71c500ca0215d78e8f786b280703256780397a71404ce8d05561d4ca6d7fdc79b1cce6236ffd20cc95b24c891574fb7868cd6fa9eadde20806a0c5d66261de7c6d237c445ff686b4f43fee3f0da184069c46a179104c26f834709ccb1bb701c889c1d93c888ad64710d330c00cc5fb3823ff3cfc7360b71ec59a6b791cb5ae0b38b9bea1c3091a15cbdd2173e5405da827a335274a8629972a5598719eff4d53ac1792496e3731f0c3f9d04ac727e525013936bc21f883144cf6dc77a4a84ef34acddcf58531afa75bf34e0dc9fc3b922fd9d224c508a5fa5fc9ac424a12cf4f29449ad7370aa553c51b08c5b671fb425c2e43dbf48916488afa2476619c9d618310f862732a15448844d0d6f3812a97600885c3d9c234be832af4533d321745b40b402c22910a89811a091451c8467a6a778ff44742c8f237b1e6a90572db32141ae9bd5d48668c89a3a31c8d2853d21b7a9af646052515f65e2da138305e0e0203e8047651c9df3b0dc92fd5d61e537fc823404cbadf883350328b39f31b21482fd3d0b73b4cfa4d7e3b27b069ce798fe7c54857e63a2fd65fdd002e65cc540075b3e6ac48dc8f9bf2db1f72ca79795ac38f9bce58a25c62348db615c5f9f27ab3859271eecdd5f34016b601b8d4c977de3f5cc3f5012257099dd198df80baee5d5165b3c4bf580ff48f4a3984cbf0094c5579b3a1736e9cf7c120c6b80a5e70710a510e5e1338dce4aead2d818dbd88932b7a7a5f893d5ffd6b8d96a8343ad5a71cdd608de86da194d9fb125a0316e57aff5d31df6467f82b594831f3d8677c691e1bc7578b4ffd60a3bced67ed37b696270b686cf74c3b0117bacfdf39bde759d689773699b7b78b0b2e9a3b3577d80d464941cc0bb1f048cc321aaee797e2e02f516750c32cfd739ae4c392ea6fe308bfdb7bd8f773eef82b3b135fdc6acd8d807c5bcaa8b15f63fab2078788c3da8a4528fe55b341e03f241bfed883be65538b66ec2d96f7bdb9425c0ee66af050d35e89c9d67e439f4f4a0d02fd8db5d3d064304f07472b28d3f426975bcc53fe8545b090739db7db17cdc1e6d9a90b8bd58f23bf8017ee6f2a6cbb7890cdf82e35d1c991ad1e6caf414533707949e50425b0d95d4de9a2bba43a954eddee274cd0891fe84ac242539d5a9e36329b0099655fa34b2f5a17f6d66f568a9b0c2d3ca8082ee59ae5707137fc5a232dac6fd86f1bf897f77162ed08f7f2a3ffe425df099a698c138fb3b171908c7e36e3ccad55545c0c496f0fca5fe1c5659d527f3dcc7766e7e58e2ec83c3b6fe9c850fa095f5e863eb3fcb6bc44f0beda8bbda43d93117d5592ccb9bd323f385ae06c5ccf5e7f088a66dad360d33053c8d73c71d44d35ddd5aa5470bbd00281e919b4cdf374ab11fc5199f98 +result: pass +shared_secret: b13b4044850f8e5ab79bf49362b52419ccbcec3d3ae02522436e09fc63692f74 + +# Bit flipped ciphertext +private_key: 32342a7c3040761c93b33c1c25299bdcf01548f08cc19166f622a137b7419f62362184ab6c6a7dae16bc9f7b01307a6396e58953a3935627b4560ab1fc99cd7672318396450b64a54f99b1004286122a339d40acca4442af2940428a4e08498e0acb60a189196efabd8a73784b0b8ee1518dac2acc50a4adf43c825232bba2f3cb0614af48199b1e58743c55c0fae676f2c83beb7cafe2a927d35452310a2291a7be214c8ab5761708a496b2a235c6e44e1e482adf8a0a400c6499cb97a06c2c9ea1c946cb0361b27e733582208a3430d11f75a5a29b3110a7517d3272c96a5c88d230cf48730f5e804a52d5308b47bc6d9cc71356017ef08d837805672b3f7d833ba977610b70c041102df11a7ce4654789c154ecf813ff4c9beb16767a993a4041bd3b82304cd80415d2b25f858f12022d27338d128c8dd2785c25b4b9014b73a72541d927360d85387dfa30ee46cd5f0178f5b998f92bb157db7599c5c4ca580a4a039ccb409bb5336db8d35bd5ea07243c45c3d33d495015a3b08fdff990b9a17c67c00c901842e70c08083c99737584189c49c42a497b55cd900c158e80b46c8a6f01aa219c96682e809ac047adf6b863ed4614cd580d90330abdb27a4e4c4e4d30043f234947f68ea8d7a3d6e7ae930363605720d8a12e7ef685dc5272c43b91ded5a6ffcc93fc39005a94132015c93cb48025088628d6811bca4bf54947e3e5b6b617b4ba442b274b1837ab90222b512441c38c06b1b7db92064677e2c4143643a1c5dabe51ec279498caa8d84f23172062497052075618e34bfac88eb5c0157e950da6e75e24472c4b593395920eda041afb9389c33b82096b9c7b169ca6c6aa93032ca86aace05aa3b81166b1117607c05802bc56fb55942f747b35f0c70bc3a9c92bbaf31988833401a6cabbd4b53e65acb84500c97b0b6c4524cfd84b1bcf3631b3859052dc68b8e07c2bd533fe418d8f9314728b327ec09dd55379b3b15da6da6d0d6394edd38304ebcd35461344e31728214e450a162dcb2289bacab88601d390551960115186c51d931203939ca002b477ec2590db72f6a085aa902bb848a72c42251987aae43368cd9ac3733b2d891aa087f15a55b96b5a167e8ab629e985738cd2c45efc66299428006dac5a70bb88e13e5516b5dc4a17490036d06a83ef544195cc5ef4d32c451909b61712cacac164664d80a2cc742a724eb68dfae5a5a52c6b05229931b98c36da17f12622604090b9901a46b444ed7624f50ba679c28c74c9b40795823526276f3a7507c93c0b20b998164d264b5bcca9ceec67ca74721e0c080b2a3043ef21af6036079d458747668ad1c36c76b912b587a1540280e299966c022fdd60bb42e785e1d8c3000480d6eac150ba400f5332b63ccaa5c64bd6d49d582602e8372893d7b37696b55f214e41c82eaacc885fc197608548d52649eac1514096373bb182f7d24ef4d6c7c8207164506ad522b3eee75f820702dee0949a8749e48025fcd38b2d82224ae743430a8210e364c445268df27f64f0b0fa3a036c829eb2c3590dbc7dbe563fa68b698f302fb6a9ad91212b14a3b7b7aaa279370d24d0ce24023941704ad9a54efa2523b66cb36ae33c8dd1a68e42b48028bb564b87e0e31d4258126c6999f9d8b54a42157ce0caa5b17cdefc41c5a74de9230513389833db2e7ed7825c6a839a79acf38590f389ce0e577896b901dcea4765d992cdc024354096983099e3452c68c1bccf0186c9e917485b178ac6a8e2f0c97551431c10842e3a873fe4b34a46b74123b3a4f9c8a12a1e87f01ebe39bf7782ca4ac4a8d73822629cbb932a233edc3e3804b62d30342c995c33f14378c4be45737a84fc99ffa032e2f55c08314793f67c3c5547bdf95b6b8c84e5ba3c377321d817033401b19dfa9ffc8a1f9f5cabdc61679185a9f78066cf11be164b7ccb92918be800c8f5186db843499a9496b31bbf21c0b3809732868a3f19c4c4fc58f701927840c24b0bbe7018a56a3859234c027c165e303ab8d975addacc84e220722d970b0b56747a8c2ab154622db357dd88088a237cb5d3c7a6b2999b17973208318a92992099266ea5356c077718024e0d3943e5b10766f82c8eea170cbc7b9c679f8d930305208ec165982c3a5f54592524b4cbe5b850ca4572a36a605ad1c0db477ee265b47ab5337a523a6b571945a7a440500ef50bae9f5a4433d407d0d459ce2bbd1835b6adc224d5c0899a00c29905896bc7c155f96306d77bf5a4558d2aaf7583c516881e683758197814d6b86ccae268f901b78b3a08c41c35a5a33796f9a633c3cb84261333a829180a94c114662042a1a5b50e0ce6847705205105846f2084c6b35fbf5abb53b434253408a42a30de4108b8839f84c0a46758ada38abae594a9e9f3b673426f8e7c8fb8390668d60c172a7f4f4b32b27215c0b391fbec6738a04900e0aff2d75741a4155d5817f58313d06c84a9bc00d71b919f59a7e186112d39403d92261135ca1409b1fb1b1763a17ad31a40441372b016880df362300b90b263c60552ac9ef828b635cbd6686235031003b6b4ae770893a4965c03c3505a81ccabc86211cc703359b89ab6d5035fc08c4f28511ec220872e4761c7a79623b523e7f076bf354317899145498bf2cb371ae8a3fe671dbd6a95492a3bc6aa967de1190e3648ed388d28d92dc50064758c73eaf665e0c81325a918b589ccb2641e2c278345bb3ab4a7cf6f435045c2a70c7683065823b3b958f9714d7ab4b124870a4fc2686f714f9fb38eb4c08b0fd3c534d41271db05a90b72a9793ab1c10eeb298485843114cc062e6016a114a8f25b9ae1830ab90ba766532dffa3ac7f74335dd65efd963d879756f0f0aa44805cea852ddd211ab8798b289ba88a335389ba5b8510cc34c69a293592f6081664553a4f93be4d36067db6aac6881b426bb8cd35a0e14109f54c967b3c96b4f01d1c7ca18f1596af9a13f361754ccb5bbf04adf6058e7087ba2fa83349987416eb3c01f19ce91394c1578a328022b44c131d8b51a758ca6101b7d997266c62ce41652f8941ad331a191f33074b5539738c02e5fa63ea340f9dc44e7fa1c9d1a51d91d9a372e1796f02205bf864ec05c9c8d41df432c1aa173f9e16ce593a63a65abab97a86ea81aee832534728a92f9cbdae5b9bc7b298c0e4c75cf39c745b78f6ea0b1ee78a12cb0a3e4848aed93d8e06bf9ea451c54ac7f1eac4399b14705cc0562347de91a59d76135bd08ca6514dded91741b745fa93b899cc12f5cb280a61679e885259c7c581f6c17fa9925a4489b2a00f64297e2ea3499a7a07e53c3a57f29e01fa13b2677d1d85c73a4525a2d4c4a8e092dd9b71a0384fd8d4be009c3bb12244e93117f6d9c2286c55aca4b7c4f7728987a349055b46f55d9a2507c274b1394390269183a1274c09e0a234f94e0ee143d6c2a269178ed881cc0a05c132b91020bacfd8805da3c7bfa57847c79846ceb73368cc579bf39fdd245ce32657a3349d5126bb476587b1e4804c7691d4dba90373b8d86c3d6c74925991192504acdfd00a70d4ad465ab1b35828fab328b25c61480128d6c84057ab520bd6614d253a5a25ce924296dbc888eabc9b119b878956be68a26ea3823ccc01c3d4b83d13f600a8c1756e692d1d7050d153c8ecb72aefc832d6a0a6c3520651b7207a590c49d071b9bc9c3285b147ac2b9cd43f2bc07097e02310a5c61014c4f36843a2317f1e1a4bc7a80367f54dcab99d8036c16e90cd33e3348ae751a9b734d00494287a3630f1157c48962107b5fc6053684518e7c7ab2948b5a28c8dfe411dece153175b3b9a6ab1f29aa80161a460a925ca99a85d650156b65c9b57bf6005c1de41cef231b753b1603fc54db7a2ade10a487a0bad57ba432860a1cf8a821c9756d27c325e262f0e469da066aba86b736e326de0a9c0f263b95736592b8a5f45e940d0465365557d2d044887439c0e7a5950176b714b91a8574d0b10b89fc36ffb934b04b604d4d1a1a4f13550186b2ea63f4b00199ba31b33d687e6b199d7691de03422ea1873b65cbb3fa54c3b5b9bdc95a5a6b787b043316f44cf7792342fb999a2511dc0230298842189b6228ac0bc26e7554d3a57bb30bfd0c790a9c6197d521091a80ba4998022790040b9aeb9750e71996bb381ae7ee027201a0a8148939c7a9ede95bf11e7375a783e391a6d9c78124aa5a9346146a1988179ac59fb770f624920d863b04f55576438783e945caf150d22b253190a6d01db591ecba6bb927fef8b1bd6169c15e7ad412abdd56c41c5baca3672a3ca1925ea3a0445331a8e0b17806f4cdb4945cc9d04706c93c777f7772f98d581811fa980a4fce9814bdae05bdd2287feeda174b341234f512fc83e85ae1acb6bc7a4839dd85e923d3115d4467ae25f3807690fba44222483bd2abd7edde3d6241c9f8485680f96a71c9cf252 +ciphertext: 03560995b8aa3a6fa5c2c86a0b86875bc980f8405116faf9e003d056a7e1a5091bdf598f4c2a8ffb1067dec155a8d4f81d2e4cc43361d236a763c4d730c4c7f4e077fcf17a48f76c4c2c896255bec47b67c25dbcb45f1870923fe1ada6e5ca79fa1aa8347435f9a14677c0746491df025b1bacd7fba8db4a7861d78d9f21cd0fcc77106447da9f6efc89a0977b698b12c006a3ab43f7c4512c49d53a97b34bf2a0adaf3a76ac6f4f889e441848006aedb633485eea5989fc68288964b86fa26754d40ee784bf749aa199d23f5ea87a156c020579d421fbaf87d16da83e982f56f3a0c5375067d10541a737a471a95d5dbaa5935b6e2bacb5d09a89e16fa52c42c4cf457c1a9a08c4a04cca14b24104ed1d25a298eae865c0cb7f2af46ce4cdf028cdb50262d17cd8d9ff6106e0710ee1b810fdd6330f63ccb07ff1b338cb0596547aad73c4f61b34d1aec7b8a2bdb904c2e83b494df2386e8e75ff4338ea5302d88b06bce1aa9069d39eb959ba084d800ac99cb1e743f2585755e075f7c9325d9cd7ba095895447501e99022e09e6461707200a097c6daee4f73356ea87c20e7f2e2e3e0612dab5a555ad471b2c0fb87138433e743aca91e16af40f13aaa670ef42f1961bc3217af9f7a3a5f2befa5821331cb54c7d98815bf80e7511b82b36a50dbec594aab0bc8cee24cf1c792ce2c97216ad7a6a9211fb2e9d2ba7a77445b84c53e530e821fb3e7b171601911095984306f03233119fec5cf80a72a37c93f5717c40c645d87c58d5ac79a0ee8b37e6849efd1b335c70b362277853cb5321dc7d8bfcb3164576a8b77fc15d9f9402304c86437e9a585ccba78ea210036ecb20014899945c4b8a730f1a5c894d652ea30bc48e7d9602a236fd7e9d91bb639557bcf06b950a688457613b337860e73eed1a31fb697483de88be8a29ec862fa670b463429615052d379db7234bdf472461b11c9e04b94079b1b0cacf976c0d2c56b6d2b9b7371b2b65e31b3320426aa421bdcabba90e2ad7a18dd4e10c000f1042e1cf73f3a650b9610ea7aa9072f03d115a4466d070293e2a575037d02b663172337c2b1319e4948d968d7d480218d17762af5ead1b44b04bf15c3b6b16440241d6778f8ac8a443994caf2f17be168db9283b68b2de2a2f12b786b911621c9da488f00b5a15c327da80c2d32c14b3561b843032ac7844d91a63c4c01d4e98417c60526c081f3de77dbcc28aa8cad1c2390c2ee1c71ea75dd3d1f4e88fe911a4acf1daa3cfc31c3836a2367c78f1a794a2a133de7a83507a3ee88a0995b5d9d9cf5252eb0192e5ad4ee50d4c7140b9fec54f8279007608482d8edb81d8cbd09048565c6dfd62d12b81b9f67c8cb657479f281a779f60c12b3c09feac9501ae9b5f404f7fe6e64f2dff6787d7fa5c4384f3e91a108bba28d9d893347b5adea973bffdaad4bea7231ca9fb4e94e9546f21a0f0c2e9f452f53b1118c17a5a2105874088d69a252dac061a1f015301e666b60bb82f271c22f7f70c3a130e5afe6ddefef8e50d3db015b4091c250f18d311456227a2baa734e1ec7420d3167201c292a7882949f7a1f293beb6ca064a4b87d550d05e19a2942ad2b13d1530a3ba82916df9a09eeeeff237e26e536d1c0effdc59ff27e479144865f1848e2b289c85b00503a9fcc868332336023afb63136ab05ca05c2f4cf768ef765230b99e9ccc4ea90f30b270a5bf3064269dd21732d1be53c665d17cfb9a015a2e9914925582091d6c7b059fd418b3c7b674e61620bbb2609dc95072a357771a2782eeec51cf82b5d167f685a6f24efaa9f8ceed2a64f0bbc5aff2a83104b43745994418e0357afd70b65816a85e72e30c3f5aab75ccbd2ed92371d8e67f9d867cdbd28d0c51244700ca212cb3fe201df6cef5b0b19e53515e55e0bacf0ebd617e78c2e2cebec7cac14bc76f62068f58e8168ab21b357160d10f26fb2929aa8fcbe27ff1c2638e6490e1c2cfd596427a2dbd0f112ea5f1c2b8dcee1c1739963b93b48c577fa354e98a33835ca444669b1b5c3fe35b55b7bbfc2e8c998d4ede6c3e76cd9b09f68226c80fb5ab7bd7aea3e5800ce0b089910b1e0a950f9721a2517abd6d5d28389bbcbcff898cb8a3162f129d3bb259c8d930d6ba993745bc6a2c07da0d49fba8c0afeea337aac7d6bca6d54e34d848da035cac2ce378c50ec69e9e2efeb8519791c +result: pass +shared_secret: e46036340b63624c69495d40138b330089c9b7db54db94cd339780c6456c1801 + +# Bit flipped ciphertext +private_key: a1010218302d91186ba5bba9800a2252975464d280c9e8b123392f5541bd703396e2469133801e8cd684dc1735e889788beb892ed101d66b0b97072bce27aff6637cc575245fd510c42374988570fd097557a0830ed10b00946c2954bb46dccd365461f4b40a70054f02b2345e663a697765dc11630bc66d86fbc21d65218342621f1a4e2978562f8102d8d52e14338f2b5844a4f2acf6c39b266b1766a5cc4ef815749328763706f1c94bd2173f3f5ac17cf2cf928548277c27723bada3c1ab03d375bf418563b16106f434bac87e45d567a73b0cb39c3d9051a597dc0d4625068f07521be5aa8f284117a68b47668b212a6435126d3e853036c45fe8266d4ada2ceac45f78415c28026cfee8352f51702d64cc0b8573bee42a392b2ba5a5b7f5855b267689626854694571fa01d01f384c6ae0a907f84933e87e86c3bacb42c5d89530e78131b968792547bdf63a1ad0bb0ccc6a4cc16831ae22b023ea52ed2660fc3bbad895c74478b272b5bc4bd52a1ad3cd6e3aa99b80cf447a3a3227542f723967214854a86f1c28cba555514b452e92ba504d70c5ea5a7b8482bf50d338af84ae626a8c33e38443039f545339bac42998a6122f4a4ef878cff7dba252ab861f08b710867c1a476bcd576a69730bd1313a1ca88c50085ae711bc9310a45f77885fd1c7e2528455989b79d01857411292ba24a7b62642f23c73fc0936fac1ed5286ce458ebd941a6e2c98840a288e0b31b91716f0f138b3e26ad4bcbb3c82708da272f74392dc905a02202ab7c662b1085f48b4cde23a396a385beb73867b882dcfbac5c7938cb6c01237721628134bfcbc157870342e6201860608afb5309f6a20d51b41f720c580677b9359b6f41697b4615ff2559fd7da8cc18742a1268d15e3628052cb7ea4a9874caade54500fc10d9d2c3465a07d2ad143ad19a05d28a666e378b0402e234506d039625291cdf4849950f82ba2d42aaf9247044070ec1c7e78a0a8663c28e4a991da8638617b075bf186435b6e511bc458175eea1b45afd781e2c9acbca654c3748f6f612493fc61ca46851c9a8785027c2a9161d7da71f773b6b8fc30789aa0cb262fac68aeb2e169c7c698de0a5d2fbcb346aabff7611a48b09fec98182f1a9dd99729fda72f741a4a8f9839649aaea8bc5258ec5d31a2769dac007ad23085e62535762bd4cbc27ee829f90a8d36a37450099a9a647b5ec93051e46f6e3a5262d3a6818a47d61297f5ab8bdfd0895c5c7ba4828de05b0e64660791b7bb2c1877c2c87dc07b704eb2aa3b83267f631755a4c5e205b8ddec83054a2b09a34d1a9852693399261898e8db93d7620f11aa3e6f9619cdc63cfc83ba2f365d2ed7a7f44683613c737eb9590a3047e3b53351761bb95074a5488ffeb267f9557fd30627bd70c9100736c9da8e382723d6a07926993e3fc285404277d9a60f94b46bc708803c35cae71156fd3c1a9bdab2eb498c0571b1eb700f7f4534420b1671733b52540925b9513ef6443628a92bda6aa29c7e95511408165a969b2dac25bf50e899e6cc47416098fbf0b23c738786b24aafb3c968c952c4386e51dbc03cd4afa52c53a1089d404ccd01d67adc458e94a3157309585f624b5b728ccfe52ecf17949bd93a18e6c14119664344c9c4baa218544c63b3ad8245cbde0975e86baa2fa83677014410fb2403283f736a3cbf521d574412258553f7a02452e00c23fb98f7cc353d5863c4d1a5b9ba441ef7b60a86ae2e74b2d0ca61e0e23917a26ef9ac9e552762254089cd6540510cc4d1310fcdc4541f19ceb17928038511692c943609ce0925ba48037edaf81895442cd4d1432b148d8ab2874eb134acf7071e10b01c8a892f10941e323a0e7bb5aea62414a502ec5024917983c5b0632d25be7a2bc2c0b88893045625fabf2155b67d75c8118b813eba5b25f172f7589cb16ca4d845664e9377bd77c3d212ac06b7b04023822169c0a4ac5c285b11f4220293193f2b31bf8bdbada803790ba339f4f5c94afc4aac928a8d3873d707bc897a1c73017b3a03793e38216974304d421286b3ceab7a9958a17e7a5cb01ec8218325b2e6a0940e2219d4174cb8c35a4b3a5689d0ab13e04a34e96b805b75aa449f59f68cbdb32404190b30c6aebb1765cab921f205a83787b93c947b26572713b00bb4aa94f99c255bd1cfe4430531214dc1c98cb6d6382c55090b0664bdaa73f302cabee71151e86558673d0bac3d188c2b9649c644fcafb2510af4667ca76706ac37292dc9a75a2c9946b5cfc0d91398b50bd17c8a34b45981e28c468654493c5411bc8190d4c343ba9ee3932bb7304bf414369ebc51d8b59cdbb0770c457b49e85e694476a1b25145962f06154096b697f1861f7b43bdaa7598f003a5c10a1961a8aed1460401fb25ea7a8e4a5203f7b15a7697ae6e10515e221af41ccb715276ad7a4a26f67ee973699d96be8df59744e71df147ab2944b7319acc27c29deb57b0f2e3b3554181ae9517dc965da8ca5deaf889c9e39b9f134c5d6519d7897df633037397778166c5f86764946aa58aa0ca03930122637f06e1021101c93b6760f5b0b2eabc67c2ac0a57a97939803af384486c7390ca7c1c341c34d737b689725bbd8c7f6aec4a7314134582ca8c786c6ec275e2d3c70120b57068175c595961409f17fba84e9277f2d2c8aba827b0ea21f2c602c538c684245f1fd14cb0277ed60b61900573a554af67c6bc77b6c6ebac042c2a3afc5c36d702218a05253db27f4b1a69447c9a9e79502c6a9cdb194236fc828a353402753df9fcba675b98be6777ae5b2c11dbaf596328463c67c738226b61b0a1c88ac8924f38c58accf36b62e212dc6136bc31ad75145ec2d694184b21ef09bd668a98bcf2cbfbc5a7d095745ba0b4457098da335b3c4287d72755306589fb12670ec59664587cfe567143110f4885a5bbc911aa590181612d8059a1939007e4e0944c70412b754b92052ee36a4f3230a58bb2bdd7e7c1d8cc6d8658796fe56e090928d4611fe69237df5b3eb7361ef46cc7ef7a6aca1c3648e0c27dec25b2bc22ce8b545f7278eacb9939ab997421459d92c0d0ec32b4e83eb1abc82d662e425c446205050c59027fc64c580b3c4c5cbb3a79140ee77fa26144b981b0ca2397d5a38457823e9735768a412ddbc84d75c6991dd2714a435ea6514a997b404249a58e960672d45ac51b9a534744327abc03a0446615ba6db047a895a804238a32ab273bc71ad264763dd2b98a345360698f48e29b7ee913496758f5d669825b743a3499f20273b6b32aacc477c2113fa7d10afe48062f3887147880c2b0442ca20201ac655e9c7d500c8e2522a9ece7c4d3ab259b526b698a7832d943df4b6141f45d21b98bf1214607c04451ca7c90a6167d7c6de018205a4104f375392d035ae95b1b81e448f90356d3c7a2927836c7c26a8b73326dd739f812304592b03167787605258dd416dc1c6587f16d0bfa4cf4a9bd1057472a068505c503b1195111d39484722964c6b366d199347bca5074720dc7c80f43506e201816357f903a5e6ff8489e896310100bf9847ff841c675f51fa5b48036999fb300214fbbc7af49caedd40b0f01433833965fd5763c9455f2cb28c930b606d254cbb5cde7d2008b644ac5521d4af85d949740f9da28de0c00fbf79fba778c40a474ebd6abef11651995542f247650a07f0eb5a4fa4c2d5acc96bb8c4d556a898ad70f379a31117ccd089684198800b047c06fa62eb8e3c1a4281805609a34501f14809c1e13ab57015f8e610bf355c997e0aff29a4d783683dff1a06a6388207cb77b104cf8c10f66524ef26a7f1605cc98db56499b0dbc042de35a6357892b0a826d9a583f5d567519c2b68e692b6a0b4600a72f3ed0a305298b03d64edf46a570673c6f6549d6871f81557ce271b873bc7e93da7f5d429bd1e1bd4bd9677f95a7dbf393caeb57c8e0be479ca48ea7a70b5036aec10ede2a1aed91cf5357bce5082fbc221cfc14a3d8fa200732560c6b1ae7e92535087e96e9946a9c3f28c844482223ca08647d84804b61a1d15013ba1060a2c2cbeac3a2f0e2307380a018fa8ba9e73a63a4a443bc5f72d72649748215031b70734b524a96b5e4000487622520bbda43cc0ff004fa3145a860789ea65868c06d896b3d77172336068eb4fb6b20e21405d8449fb3711583cfccf15297d75e4511939ef75f38552c623630109c399d6646ccb514349671f17c24568b33c2484ef4984135d2585db51eeb901b78fb49c87218433b0f5632ab6b74597d2893fdc36ef7c1b425a68ec59397c6c4724ebcbc93c476f070c486759430465ebff9bd19376aa6ff377653604a993e5fabd2f07171c850155ddc942c2d34c4a8cc1a24291472bb881cb9644047e1ea64d4cab3be749e9709d20d392fdd31e91c40e7a05707edc935426bfc2db0d6d353a71cbaf96d365b1b43cc +ciphertext: 481d9c9b751a784534a2f427bd749abbf998569c861841ee080f3e0bbf9a383cb208f8b6b9773ab81a03f0464c4286fd0e1642f2eb4dee38843283c9a7265ca2331069121bb8159684395a0d4713c7f176a34bfd268a047898a5633e4e665d4d59e5cd1c114cdf5006518a9cd4e4edaa585c037c32100c1586682c974f629d8671a9f0eda0e574038607e1dd3f0c2f7f3c319f14f4f53663c545a0e5ff31b1afd8c787c0642139e070cb6dd3cba6a423f5605947b8d222091514672aa6dcddbec0bb5c8267d901deedefa16a392369e8454b1c2ed9e2c1a0790d1310e3ec7b6f5c9f8520d394133018deef2d1a1fef0dfeb82da813aac6e6d623a4b3c9fa6e2af8a038b49c4eee10fae146130f8aa9e901126f0ff2167d9cd84aff669d67eb0302dd24849a641ca2624d2851b1f6b2fd7da61384f67af43d641f71ec7dc2bfa616af3a47b38813edfea5859c20d7aa819b819382be89d11e834edf2d6b259588359afd94570f98681bcead6777a51327dc2679612ebaed72b18222dcd3ddaae98d0047136f3a8fe53d021044aeb29f67951617159e04fe0c79598a88e651dfd23e889b6183644d476ff61c9f372fc173d4b9c42385a5ecf31fa34a90278fcf91830bc283df6b26c4ec8fba5ddee2ce55900631b6735eae33e6bd19715d6cf99c45b60bb9b6a6821f8669b94b539ed69b90882ca22ad2a3e36d9d7a7b8c89938f366e0778e50a47eef1aa246028487e5a6dcb77260167df9750c0beb6bd8de6de1dd52a49435963297c26ba63000b1c40f5dd2233539ae1dd2ce5775b10ab2ec2f3796c65a14529251f40a7ece0cf21cecc0c70e9dd5a3b1559963fcb74e75c0fb4ce1217c05ca820a53e53fd2c939c9703ce351290947a93aaff8df11f3a717e963ffae0677737d7950ecacaccae24574504bb765336c1b0f7252b726c1a3f306a9f11c05a1790e8ba6bd6ace9795e90486e3ed26db1b59a95ba9e25d7f4b8024f2bd4e69cd08f6d0ff4eec075ab5eb32c7c278717e2eb8fbc4b3ea1aaadf9c1c402b3b6e6f9b235e5656668f1b454bd5e69c276adcea8fc4dabe78d71341de1af4e40048e3ef5ac76342d49ea8fe63e63c3c95193c2c159c2c9f7a4b3f94f302dc5900ab8a74b99cb61df6da4cd79072395ccc0ef758675caa1b7e020afc09ddae0b6ef7c79561ffb799acfe8248318ff8f5bb99dab5a06dbb93d5bec20629f1059263e5e1c501382841fb46cceab4c27a0d5203783190633a99cdd248b9a02818c357e4a7e400daf53a4b2db01bb8ab468d05133d78cefb41c92fe1e6e59051326620d31d0eadd0755447eaff0cef1a6a2b202050679cc11f4fa89916a3737e4bc2a4911ab07b5bdb105efb9e8a85f2d3ec14a38b557359f05bef7e75dc1fc37ef70ebdb6dd233cc24316293a4b10ad1568324c2931c14f7e106f35e2827e921c478fdeb445075d501e83481c9e399f86470a93b5798c47c5cfb6abad353c3232bdb42d7d0948768dc7c3269c57c1d98a2c613a8a73d2ac1fd66094f8bcb6b1d235ae8938a59aed154128485149f389424e98b94371167e48b8ab4c28314227e92f9913be2cb0a29db4cf2ddc40d3f0b79fd2f34fbf8d1e02188f8eeabcc17be8116469df1f7f0badbeecd32b2990632cf56155465ad0b95ebc755a428e3398953c7e543837022ae5111bf5d31d2d9f4b613c06cbf10d73fc9af99eb2bb241d8bc09c9a0432b6f0a998cbe84692d5a559ddfb2fec6c2f01e74f9a3bb52248b0583eb06439ea498a3ad01f6b89a4fbe55343a9c2c248c0f2ecf71dceb0a8430a0fb86dc0bdfe47e0f81b0ec285516bb9fa7f38a3b8574a3954927e5d870e7ef9fcf6e829d9deb5e7b977a8c44a35a2989ea1477a8281bd41f03f6caeb37fbe6e35589e77f4de2660ecc86370524b224a325640464a0b2327ba917add4540328d04cf6ef5587e3eb884df86189e50333eea3f08cb7f6e5b918a09e85b8340e6a0b0d707e65e076a262386a4664eb49e7ca4391c1ddf46f9f0c841ac597c85511b0d8eeff9547bb827ab927516ba04a8a5c11f0fc746600a5d211cc515c2b966c205c53cd3d27589cc26cfd95044c6532f5d921b2101318397752cb048e7b213881168d66314ebfd8fe42846796df24be63b014db99f383e3757ecd3f161f225e53cb7a0ad9efbdd29cfbe8ad28fc7ac62d115463061723f77deb67b4573f58b9 +result: pass +shared_secret: 676a8af45f8a92287eeaba78d0a5270cd56cbeb52ea51458eb1496b7f128ef62 + +# Bit flipped ciphertext +private_key: 23853a2105199c289a24b976ebe08a929bafabb374fb0459e136b87ac75ee19acdd45a4672b904b5911bfd637ee8c451c96a29bd57bd1cc04e62b55a0c61b1cce5568d219e9bb6185151142ae5aeb9f49c70850f1d66844d736a7c5a10b373b299374034948d600c115deac3f29ca175291679b94bfa832532da5289e25abca6417e188864443fcc864f0f589946b69175ea32e391bc35b588dcba1dfc4248b993b90136ae57373432a23e691700e414b8a6b408732aa085b91bfb05ce4e449ee0838a1ac953c5f87a64a663b1f628e6710a1e5c80d1c515bed73e692190626c07a213c82428147944871d0c808c28036ca9037f378944897257b121f0d0a073d07e9c9c92a297aa4da0390b78c5e32b21b2e72ba917c5eee7c3d1333d9d53923e7b6f6b264909ebafde47b131aa65c56078bf0802e8613ef068c73c71278f623d31227462f3c700227b3cbb89300a880587786ae279c88383ac2409c284581c8433a64591d63964a7b9b653561fe7e238c72bcdf9b66b39d39af2bb2bdec4bc22c9162ae394d8b60d2c874d81c14370d5206ad22ea283c2a838962b445990595075893e9489c7d41b174a90cc91e6baabec85e86707de80b89844a03ab0186df3abbc40baa86426fed11e2b1c453dd8befac51423b5a548261f2a52c7b53c4eb93a49cb8384ece1b973031b4743869286a88156879b098a17c56d95b59e102b6737b41943a14aa7886067009c1d7b5e27800f59329c4adb1ed993bda4846b4cd47749221a573c0369607163e2addd10825b8421f987587ddbbc94b999de2c1474fc2d0ee55b18c28fcf626a4569849480bc730a4391fb6e0a0467f03b066932318129b460e908df5bc1f4498aed60ab19f9208a6c281207628252bceba5ce7f09725cb82355311abb37ae32330bbdec1bb7a06ca315490a478e7e589e524a7759d60bc1043c72eb29f3337d9ebc0ba095027f753de5763486bc6aa336b3b5b18c5cc3563879b66f625836b21540cc0e52599ade443e6a0bb63617c572ca6313b56e3e4a10f99b441b54717beb735a69c8b276ae3270865ca8540078481415b682b25a7786bfd1a40996d849669195b0f5c1546b239180ad0905055fa11c871a8f4b4a120ea13a35da212261a4e92903b2a1817c821025cb704c00cbbd078502ba42f6c0439bb42bc110ae5b0b864b6a2def642a66f4a82f729c50d5738a8793b76166c0d94ca42bcaeb8c2760f47aa43ba206104de6c517c8e4a02d755eefb4c6307c20dc475f2b0042e7610ab65426edaa6251c9c9a367ca55c44747b41e730b979e8968cd43bf142775a55075724cbfc30910c05cc13c273d310aca4562800b47069d0b155df6a15a3bc9df54c9e074857c3257742c02c70482770acea8f0c27006a093d65747854650c6a5a6b81c68db6781034cedfc29c0287b050329edc56fdd5040975b7d96768b7d54846f0490c2473e89b5209b5226ebc69d9c6124aaea80d265378a383586e09bfddb846586106f115416539604212adc11a55e4809c4abb36207a0351506a6c912ff1b8948777a85f70016819968344e30bc093204823c9b41814354c5561614f29f44424cd5984bef6c0efc1bb6a60b07836a16a72033907a3ba0605a89c2460f6c6104698dd5a4197cb58d59c222b3f88cdb5009b0dc42e2411df8e7a05cd01a3dc98c6c7437d2f900f154742d5b08e33b7789271b9475b16e03598e0517ad8a14e0743ec21c0e056c328245a56ee66f98b9873a8926ef857a12365c17480210e39038b32d9863a4694081491a9a4d4c815dc534adf74784e1bb7c14c81026adbb9ca168fa6a4c96a8d0da7a7f2b8148831bce1ccc388068571797a1788d51a9405038879c239adad1924ebb753044b71ca03973a8cc1712bdf766c1875a8a5d6a062bba709ac47a4c829166455c76b0025415b49e418023d075fa40a6056abfff7c0136251517b7bbcc666a082c74ff2aab702c74b59c716cd092e9ca001883619b95cbf60666f3911086c79b4a601282712e15064401d34f20ab985ed26c2e711e6c703810746c91420f9eca3a7c178172e52f1387a84381a6b1dc69eff189fae08697027316148ef86a0cbe8130c0a9b01689bdec821d8602997bbc16e6b323eb3b33ab5c1e0de27ebaa4a12db1a16ecb870e075635565149ec91187810f203a40620a91603ab8654b1c92b50c6f01d5ea855b6f159f0824e60f06b430653fa0b6d7435aa4f42bad6ac0c0a664ab509b0d10253d17221933a101f4a0fe451a20f18158793228f17abbcd27d32a1271f858bf3867c3b93c5dd84cc2acc8b8561af04452e271192c5c745e873b92e1acbf06530fe954b09043c7ab5885a7b4807650f250b4358f92dd6c44aafc5bdf45b255ee94deb028cc96348ffe22f2439ce7c584d1f277c3ae2ab8f284c178b0c63b43ebe29abbb1a8dcea86a19b474c3c695b1301223723a1eb09b6220561c629647dc7206a664d77551c030880c224d5798970aabb94eecb494253e668c78d15b3a994813dde010c2d3c42e4caec0453b5b2364e9215efe82b38a040412602caefb0891f49e7a9468808359c40abdcae4ce42ca13b0e8854f8b1596335e1a202a4a259770969c4274bde15811205b8847cb6a7f10a8c6a484d8a3688a535eb2e4804ebb2d4e9815a8e7136d996bfc127abc609534029d4370c3c2113a780a23507a86c4bc4d1dc6121dcbcda584230f259f28f58ac9dc5e4333a5f63b2cdd4ccb44797b359ac669e71ab964c60ed186d790ab3b926d2dd45f4c46cdfcb227bf8c6dee8a85e63188e289979d848d4a9198a480a203a95541e4b0f11c1aff76a93755b8355249560b7606a66cb63743f34c3279fb42c6656ed2f1117811cdf68c51fa51b2fa8a76c5b3afff9b7c15ab01fa99b6f2d36051c2c215f2a3ea799630d0aca6b8c9e8e2715290bf339534dd3103f35bc2747c45428c4456ea2e6d072e6d2935d294737bc97692f2aa4f335deafc00820a6967ea4286c889dc958d8331736b81388c07b32d9cb507a74c88cb82ac2717b877ba15b93768042aaeb132742a3f52351b48140a7042296212c10813c510302d4d5471e760bb3fd14899b09c616c24e0d543575947eab449bd413bc7d34051567047783dcd633479d77f7a833add96ab8c4c74be337c3c9c42e33845bd09623e976580579935d41e53bc6557a91e0c79cc8759805d4554ee7a1c218576f29a7279a459ff5b802ce52497902d6ba2bd3a12814b02c26e80b76cc4512748b728f77e74a534cab5194432552da0cfb0aac4c8e68fdb559281206821e698b7b10960310f9bbcc7a8aa9bfd2c61fc25c91243a90da5cb20221c5279cb34884833a2224d814f911b525b4a15807022067100289a9ae947313f891be4acc4f2bb4131b3551697c9635785abe215e2193e207a1d9dc29333d5391a252de35cb65b124f073c36656ccfaa5a5ba373c05eb74cf7895b2d6c51cd9b161ed629fa08a77a04ca40f6b92a6a06c5b92c82b339b9c781da1b0702a9c040f5632ceb1e0bb3a5a7b72dc8a13c67e2c9f90293ea5a3450d473d73cb9ded37c0dd4cac7e76419ea28b1e7282820ce7145af61e3767bf2c3551a73ae2b2fb65a123d85490d7352908a5eabf0c6a7c848bc01b13104777c77646f44ce35c491ebf6843ffc6d5aa4617565147c989ae8da7e1cb442fe1838e5507e332a1997877976689290c0a33afccdb38c4cb7e4b069381bcee860d84b59cbf037a0b95fba9245ffb7613d2c4927a7a8713a6c26e828a05508e9b1afe85b93c996503c86387dfc482f071e95820978705cfb481a8d8b9ac7a8bc0db6c8165966d6c66d08731a2d11c032c33a974605d5ab0e32fccd0cd32a8877ac79bc42a293bff8487db488b95576ca5b3678c148aa108b39858861d8c3978cc845f3a7a5d4e6ad356739052296c5aba4f85816077b0beb4a2703daaf7a2c007a10ba00abb013ca96b7c1621f31b1dd284ffc0c5574ea2f995c41e415675cac68d3c0a8eb4879fd30cc5e548fe413c7df97ae491200c6808af4acb63bab0ab80859723a289104bec8354aa4b68af9c34f8ce20d9aa41d6d448d871560ea0444a3aa66eda7505511900bf455a35b41b07823dfe6433b128d636a5ef9e0b8df1c015636088d4c4d257cc9412301d6478ba2e9aeaaca0ace665594ca413e0701f784042063a25a55126774472fabc14d99558f9a426e21cd87b4255651af06e50a4e8050b61920675293ae9c194e921e4be5352719a95e04497f72cf5ca484c4f47cabc8ac76187f1018379da37e64e464be68aedfea2f2ae7bf5cc6991f37acef86986d3b738bfe7cb40c8db725d5e357c7990aec5bbcd5b43bd13886f4617c895eb1bb45b47bf2df6f054550ff6293e3c4358a84354afcd4ebbf9144552d5eb0ebf8645b82bee5d2ab2ef7c57e89453d5768c5123b28517b07c071736a33544c79fd704d41 +ciphertext: c8eda20f121ffa3d9ed45031be465226e71c0d4c2f06ca346d86f7f8eba39d9e454a4d399d2638e897262c727c8061218b72c2edc224dbe73b6aab0419b5a1d50fb4606ed3633c2bbc9006e7257ff73d84c6cc692cdc08aa365f61e8b24c3b14af162333dc993b657e8dd85f87a6301219c7c5e1312c15229eed3e3559d79c0ee2a8ad5deab23f67130bcc162debd65c50915ce93e4a0c31d078cbca6df5ea19f4251bfb15393d9d61030e04f7b14f85fdd877b43f2fcc897396cd80a261a1c300e7fa738ebe484faa2acf12b2fe9c65bb45328a1254dc175ed9b55780e5846b1dab18c58076ac43167c2bb8341e343f41fd6e6f4b3dd5fd32adf04008036150dc674f7527de8dbfb1150e732716d8565543195c49fe14a5f8177de3318d477fa2e56f88b325e5be1333fcd8fcef8147166d92cdfb11199e0534bea93cf7df402a769e2e42e5bdcf67971991296f7cb9ac75f60ee6e3732a93c12ab06b948cc5aa4fcb86185f4bb22027978be42e969517aa0e5683b7fa91ec089ede4d0ae45f47a6cbea7087bf79c3776879090d33d74aa7445cb66cfddf5b871cf29b166acd2ea31ba8ec4f5f51904e69ebf6147afb37ca15995dd9d8a09ec10c650c3a6a4866dca01fbdc8b5e3dba02b86053c903c3e5129871edc26ccc519c769b5b4834d78dc7fcfd869c2bd781cd87dd1a36927075467605c99c108ba6a4a856695041e06e2206a8e0045d3ba364da44abab87de584d664f53bde51eff82f721aa181700eb7798fef397fce51e8684d1e138a654b4419228e0a3765b22f37d1c9e6f966877d86e74a656dec461f9764e8bf295ccda847890027aa43193b0f4e098a3804a9b1aa8957995f1e4418efb57c1e2daeb7cced47cbe2be0c18441a8dcbe1cf455a7480f3bbf0a9f2635eb668d67f7ca13ba38439f9687dc655b119c465930299c2cdedb136cfce88219a26459e0a79edbc881018a28229121a90bc5a5d70b2390f1833631fc4a4331d1a8e7a75334d8f7098884f2626785ad9adf9f42b2cb9640b82a9772805242ad42d07a37ffbbc01b402e1b8644ce5ff5c3b1d2b222a6439b78a5479d71530579158d1b75fbe31fc9335edd98f5791077f2fac78c5767ae1667b552a0190d9cb4aa91f13ab7691d5562efd86b5412f7461b35b7d9959dd60feca4986076577f607bf3052f04face29a67384fb9abe9db3cf5ed1162f9bdffeb40b6266305f1b7f379fc572c9fa830b051db41c1509d47a34a1e7a23c83cf33237a5e10c751984a91701ab81c0767a057540d916eae6eb76dfa51cf9b4b680328ab330572c05ffe753719638e3a4d753bbdbae72368a57de42490487e81ecc5e8dd738956e36247c26f32a0250697e2f32c007902060e9d2a04f5d23c948058f14647f336c39953ea3138731c719070edf046f98b84c5f80ba449320299500a4fd187dabc03fd4a14975b36bc00efd777eddbe28e04cc9caaf6019119de157c73db58804a9502d67da69ea957cfcf15c540d4de9880b77a9f28b24bf000797f4e6fb0a815988bb2fd1def22422d579ef213633d88e8586b9d6e59d8b2faa93d78e5e6786c11c8e1e35a98e89004a0e8ed44622d8dda6a36fb9fc19d2ad43246ca1b55b9322365aa7f69e6b7be51bffe96ce31976e9b3b1844888aece006815d1773722497169fc91b175e87dfb1b803bd266b92d6aff6033b6be5760da8f167800f128626ee578fb52cb28bb30e83fc8fa90724840c1d94b46fb3899dc66059789f3813014acb7fbb322e9c37ed1efed124aa75fd5c17f8797049ef62ee7cf01d538e75e6d694b2cdd63ac28209bebdb2b32e94d6b1c555617e3a0982e97d0179f629e97c137d5a09c3072cb984f9d287f598697409a2f84bf9269c2aab1f4df01e9194a3d7a8ab2122a2e5dc54f2f048ff27dd0f2b55661ad0766596126ba1a5f05a4499a788a7d6c5c0473653936566980cbf30c850eea56e1698e95a7922fa10fed7e49dcbf4381906b7a79d81ceb966294b6dab42d254d31f6a52a463497f4e05174caedd8cf45dc1164ce062e08a187358b37428c531fba063f551783dac35f12be43cb316ad88a8ec50e89195fa30defa5fcda3db7448c4aa39893a767d21e6429bafdf220cab6c63d8bc608c10c303314e8855db60fe21822a09e17f0c5af74b818b69b9d5200b5ef02cb7ae81b87d865748344915c69f5bbb1987a +result: pass +shared_secret: 34258512defa3d63f65100f185d469472c8b96d47077e59f6873466378c69679 + +# Bit flipped ciphertext +private_key: 65d8b77974c5ec3cc4761558ffac6f2346cdec812488865ba054319d4c27c7c8c599945f9650bdda73133735040d676e8b0949e41c5b264bc68736ae0b4149f6515b52375330661f3c2360609254d6b09e091924fdd40cf0a520c445656db8af02dc188519880ef0b8a9296fc6c9bc12a622360077e042870186c7f82b3884a02a65f08e22b57abaf0cc75c9bf1d112eb79b5c625b467f1ba16637738014c0ea84c5b0765db2f98d1cb6cd74657c22ac1d3d5507997cb0fe1b1ef2f78ea271171631a3f1e560130405095c012de528d339c88b8a826c173c25e95ace86bce3b05415a8375b1cb80a539e3e4027f0e7ad79e71799e7173e59a9c078b13ac70ba3498afab0b3fa099b3e29644dea5a731c0803c2cdd5988ea5d37eca50b18330855a24af669b11ffa1817d36796d6b1822e99cbad2477df0633967708391c7cbf567ed1a7f0bc37c2d333a1a52a2370814198450cfb23327098c27f19d9afaa3a61877f98a0c82c461e4b63170c80ce2418334cb713b21939dac4405528b08718ab2ac2b86b59c54879170e48063ca686de99f41584d395c5cd94651c0aa5f8b0b49fd604df9f487fc4ac5f72266c6e526dcc80955474b53574bb76a2b28663bdca606142a94bbd28cedb62c8b551116956b7ce228f4f7be6d39500ea550833680842ab62c384b72d2a8eda3b15d246cf5e5afd68a0375f1a46ee08339f093a12ba072d897100c380c071a57b92abb34c32050825dc627c25966e20a30c4ec571a6079ba39a1e381b4efd50761506347a6ced95c7a3e7c3d5ca01ff40354f249607f703deda19ac7f6617ba93ee88734fdc795cf413c03363def64c0b92c4290cb3f3e621f05f66db6005e23bb18872cb70ef328a1829c85241eab872b80047d9735be2f368d724471024434a6f60bc1083bb441b1bbbc65a7667bbaa670960aad6e55b23953849798cea432978136a742749a56867345b54531343b15a32c00c0514ed6c23c8471ad94034970a0418c3d4cd96835567f8f4a0469290f029548bf97797ea0cc7b84417c316151acaff725bdb5f8b942780f29d3b006a2b8729747bba953ecc6a8fd796acbf720f61b95d717c4788612ae3b68927b3298c53f76ab2582b3c2d379aa351102fbb04e0d81a1b2ac251e18cef25aad0617cf85272dcf7cc5383b2c67c12185272fa986c342ba7ff5a84ee1a6956d839c938cce7e512e96721e22f02d5223ca7d2a8ce4e1c15fbba18905011d572e4160423c5cc347c16ddaa2bc0195192183c2609a1bf42a67efd5185731ca9c46434430c1df05cc5ba490ffd729871c8e7ec10d1aa35f7e3b8056093997abc3dd1c25af33c51668b8148b3cf2d3bfdf662d8fb235358c897a944201a5614a796226701bc32903f7912eee299a156792afa321862c3012377be7a666b111323fc77f68d6c62c2b5fc3491743da561696693d310834f65721bb0cca31af3f882f05fa7764e66feef88b8d871282b992b324ae5ca31c05839df9a279b63078aa35787d467bf33b7d41985506b4cf2846c8132b4292b17b51e888dda2790172c371a4790a451ff1511ab704c5ebb5272966011f07704f9322a5040f415347033bc05904bd012569f6f1362b2c75eab4aab71b134f92056a2bc027b311052757d4fa3f756184d29a59b41c670af66e6ab07b1fbab3edfc22c57440f3084978aac854593303989d491714e69775c302b5db2a36b68bcef8cac3d5757706d3c10e60030bab9767a1021cb9863743559f4990b3d9bb4c94b70e314fd4303817a3651d35173428ccce4b73ad157ef6f25131fbbea0bc38b159c9a33aa014197ee5e4c3c8fb203d39cd3d272cc59887db06890c45a851bb2db3aa07e40461aea9b0fd33908bf326516253a0173bcf4836106c0de175b30f20761f449791b9bf162537d6b31ebdb54cf29414f23691e6e178a81c0923bac118440f43160677fc4ee84827d240c4efc416289aabc3fa938161bfaf981b624222f0642b48a60b4ef4965404ac2e83540bd426795523e5d39c0a002e8c7c444f1aa3d37c71635caa3d8a4adbd68ec957acce19b929b85fe522a07134022803378caa46c1eab7d44615f80b213b258177d3c7f3cb1dccd60675d65ec5dc81d90ba40146442c3a0d277b9aa493c6530007c21839e1f22289079e173580a97941bcd8717a9c24c6976da0085ab02cbe31d1cd58639094651467bbbc480c081ab62135b5a50620b76c3345c7710a65571646c64493976f721488c12333352043a65680f8c215905594dd55bd51166dc15463b9a9135420cf2230b9cac4a30991cd18b49d885bbda8a5ac23b2baa078bd5799cd7bf599dff15b1f13cb8615ad89404899153729047f6be91f18a1b80276c197118e8a31a3d99b546f888c2b87cae1b5afac94c4cc03b57829b57117346f580490fc7451f6479599411d5586bd78a420811a34854f7ee3896d2146b6c87a54452dcf51b057e7bda7e909edf3aff344c518501d68b21cc4b05a85f70790915b03a652b9105223b7977641addab52afde214368b509dea861600c716866467a510d0c073dbb20d8013ba23881bce4cacac6a8a10d97e6af51948211e8be0508b3bae419b67789456eb84c615f482b77060a6ba9f19184aa526a776b89d3333b7a6e53edba16cb02271852ca32321be754606f05252582214dba7496d8bb9cb42492659a3507a6aaf8927ce52884e178425e5aa4fca73e2f0a2dee3181b0c855cb320adf1af28266cc7388c66a99ab877cc8d3434b4c3911387967e3151357b1efb0b76b6051859377e40901603031aed015d6efc7a0d5267bd486c0d7b4d91c1afb58349af8020bc94941a92c44479678f648a71284d3da29b31a725abc1bca0531a40733aded83b1bd4bf7b756f8d53ab736c91c0935a5e3ab801e3c913f188ec80c0812a2460b93a83eb40f223a46a0c02f2088b93c702c4477c3033901998caa5f8ac2cd59427ba11bdc12987743e8238236b9735562ca1897bca039caa6c0c9630707f5ca7b72e095e4ab5aef89ca64f089d13b9c0ed0c889b491524f62093fba66f058b0594570a8a3e061a64a170cbe9b13cf4b31d49229b900653345b8a714cb8f9e84e1a897b37a7929f6c4081c860a1878ce3230600984aff3508a65246488ba6f3b726357b4fe6e6a66d20042ca331d67923be51c741416e994386fd21004023bf0351899b094271e78669b4b6a753c958571fc7c4746366780aca3fe288a004a8113704bee0ba1734043b47b0c013676b56a58a7aa4bfbfe372f6fa1e6baa01e007209637cb7e90753ec69fbc378ce7f8b79cac28f40b09c3104018d579333c9d65600b3326bfa6a8672134a5d8a919457a96329b7df31493be404d622a548f63958f0c175d9c6516f5622bd61cc62345bc16a4f924b663410da8ca53f46558db74971659a908db22f3f04fbc668507b24d4be299a364727e941dd34cb9a134aec13c8efae1b6d5f93254a52056384c7e09d0b2136262c2bd2f748b171672d6e9cd5ecc47f7f78f574c5e2c1764c01a56ee34ade1919bf6090b669760ad2a4977bb1fa9a83ce3d60df1bcb6ab683a432235cb6974806b8f201830586996f984bc0078bc3b1624bd8689ee668443d37cbe2794e73b6ad921274037a8c7c17eb947257f17aeee7b8d72540d8c00b1996546f3569910c4952a861ebef27f677cb029a53a27140d1f2b5026c601bba9c4f6293f37a68260319995da07df28b929d52eb29848b207b95395890e631a2cd0c01a345726a2c522044a3f464ad69ab99d5683e36103e705c6bf2cb7d6c42e5e5187be6a5890790efb165d339ca243e6689cd16d5b0b89a9d3392c39a1a5901e0d66c425339645a25af12929c82718b5c5857cd3a0c603c3b74359b87324e8c58b425b9f697315e4d26c6cd0c4318ba961b98c802537cc753b0c13cdcc527d446b109f724ad850b0cb342b7d9914df608ad3157cea6189797c98ccb54bc9b96bb483aeb6d975cf61b8ab0448bc27966a585f6ec835f555aa4e16aa624b28d246c3989966f3ab01b736281c3797b4f652bfd753e793a21fcb26bc7b247dd195ad365621c8c2d4e606c714b63502832553989a16328e58231ea77308da8dc06912a8656250c89f9d550917456b39c4ce394709bee3c106f58c17887442c51273b1ca31032daadb54ce25522149613ff6ada435a05758bc7fd06c7a1659f63cc1b3c95390d1c973d6cf9a545380c122887aa8c6d53154d22566966722f181893a64432a64493716520351d0f62b91b44273b56de3d7ad5b689dde495913ab54d968b4fc405e4591b6a2553c365073df84a2b528c01eaf93b953e55ea41963bbb5b7de39ef8d658a75616478e935e4b04317afb99bfdb926ae573fedae42da3b5eee0083749e8c8796983fad927d27427358bd43ae980f6619f7bed4e826e71ced90764e09dabcf43639665f67f4a1e2272e6d3767 +ciphertext: 45be14dd0f9469a90e8c33777a41bfd99784465d582789f2e3d50e8ecdbda6be55c3131bf5135e93827d4810fa3634c385b2712634e22f4d39d1773fd56b56ce99911ec4d94f5ca8ec92ecf7b4651b634ee983cf4eba0f9c3b8fb6954cad2257d27cd38214a2e27484f09fb5d4b7a19d1873d588de92e126c86a42049941588e4b15afa545c1a767d90dbb89e0194a78b6061202fa9a7a1a53678887524082608977452146f3130f1e97646a068048815150c63465354befaa02b854306faac23a47db6828bceb4e81c24d729f13e98b85bfc80e32a527ec50d2ede9b1274533e94e39741c993a7c135c323980bfec2a4a292eec138ca8dc11c500844e95c8ade659ed7808524f51f4b500c6919bd374b66abe1e9ef16d33c355eb31fb8fcfe7474bd2706c9fabc7a7f6e682fc26c9135a5d1be33510100d1917e48bb158143e838cd34336e7d992852261f0612474dbec1a6231224b6e4644a871094b355d78664b535bfd18f4b970db4d50408dc3c42d1605cbd0047a25219e1bce983d6a3fdac7c93b84f0c2a3a1237f2da313f981b3df2519575eef61a4b324cf684e25c0a14b60fd4890cd1c8e41495ff0b426f69a676c7218b2291f3726939da93445d0b221045f3a22676d4a5e4fad59b513656eb66dff218804c3c6ae357ee461f8a0ebb2850691b99b18869597e8bdab5eb80b324bd04166991d0869804d4cc3a817df1268606919b611c81b98f93480e24a4ec8f0babdf9e3795c080b1a9d2fc5475808e5dc459b5cbc09ba52d5c6aae34e9ffe200c319135634c8267d1c0899e94868925eb732ebac4cff9cdb2e101fe83ec5101c0656df62c0b09204e117866635bbdd7e8b98ad6f510444e3e85a926eb7b4054fd04e7f5798c9cf0c4351c5d9e93aaeb81b96c300a8a29934553ce1af893a49c03e13262c496d67e60a99d9dcddf26631d5ba56416e3f10036bffdd9ff80a6820704d1ce2425a3740f1ba4e23c2bf3207944669a5731e21efe937855adab4c1d30a4c4f04ab2cf28f821e7f630ee1b6b6fc3c627144ecd03ba9f89f484643276f70e421baa4d36ad219dccb0f93a0e9a02f8adcb03c5925465f4a27a4fba34f7540aa0cd8861cf7f75d113dd38d4a318f09cd2298d405fca07f5698ea08d7b2437a05ef3294fedcfc958c371daacb4744b7441ccbd8f2c4646e7b819c5b200977bd23d5ba90dedee501f5183d9c47129ee28e5f2e81cd69623cab46205aea6020a65c95db71aefd7f0f1bdfa65138aa191a42263450320c4011dace1dc71a6974a17f6ead9cb224f4f139acbe6283ced68f64e28acf918b54af931d3999490672c99e1cb019d0ba172785a896fd219636b2b2635d4a0171284577d27901c80ed1fe37fe19dbcc2b6647ed2bb46fab32ebe7cd71b146f43e73c9105f7644fc266af635188ab450db51fcac0c73e0dab233e796cd096f22d5758f954938e3912f05bd8654cafe6b6b4c4cd797d1e4583ec7e831ba7996fea3fdc591cca16509de8eb131de2cf35b64c4e90353bbf8e4df13b6e8feede27798fe0c6551b7666b5ff5ca9e4325fa0018416fccd9f581e60d2916df7f4b13b788e52795ca6238bad0919de169ebc48bcfec7371cd954268ec3879290cb42bf43b0060047decbed6f2ee01389a4b19496d4d2d70ba8986714779bb9d02c381ede9bc1cb950bb8e90dde343041c6994e6cba290c69651e95eb140b9c59461a28296961a786d1da515db22a4ceca82d8bab5aaed7c597ec9008250e9aebb4c162f932f76fe832ba7b0fc9edceac02759d1bda6fedf4a09fffcae25750860b9a69c4187d61f96bfb7021a6a40cca3e78044f1b6dbdafb9ba6df3b2defdb7c288035d787de44859395e413afff49c003807ba15af07958dec24867c9077dad5a6c1d00bb7dcb03607caf61651c3fcdc4c61ed14b82a2be698157d35c70b426e54018c73c6bbadc5c9588f01484dd53bd7301456baa03041846e551f71433927cb6fa07b5455772df03326daa43185f2a0c6d114ab6a3d555b69266e4e603a6338c3a89b9c881d5bcf01079f00db02ea8f34dc355706fb610983c92e6f2251640db640a71144974e6ee9b3735f56af8f2b6f629d380b9925b442a585fb992ef8dc044f8aa256db349795aaa790abd9c14cb2a810e2913c3e1982d7a22a2cb826c13c610271135d8b721153b3e8887eceec6a6656b806b3b7ba +result: pass +shared_secret: 16ea6f00b342ed5a56030a39c84d7074d85d07f8ddff70342a387da864eea180 + +# Bit flipped ciphertext +private_key: 024b71c111860a64324ff37f8567981cd5285be1c93a0c5bf6a3036a223c8aa6ab0aa08d80a024df1434b2e99ed21cbfdec421339c829624b6d5e46f19591439c7201daca16f45cb70285eebb7b51352a3c14b05f48b059dbb9a90573f1ebcad1744aada02bb663a0f0f8abfef8bcbdbe53d5733051a46079bc1a084996d1fe622f32c2572aa2f651940a4418f6502cd14696acc95a2003c72a84323186cbd5c836e04732ec71528e567b7b3f46da918bdca51ab123b9728d626234685106b9dfad561efb708c27a054bc41bbf4a34f891139d27488ccaafd5503506bc1cbd8c55564300b8f82856d3b07b0077ffdb7a681501b9a8bfb8e969fad4b6d7434007ab55fb939a39b8c7d6c37ba90baa0f4c693d9755341067a0e2470f44bf120a9c2f9bb502b4befb277c5be346c6ba2be47ab93e74783ff95975a2c6efb9ad3912522de612597bcfa3b90629d7a9fe71696d774097fb38ae6b0606f7529e5aa51095022d1b2ec3f5017b3c037a04b7fc152d954899f672967de2502907bddf2610165108938aaeccf21434ca7537e896651a66d518a77a242a010b3b7f178cec270335e804e4f26401678e6465ab7e1a6b446a17359b70cce761e350849cd684f75987c96244d35046c27a3a773412f360601b583fdb88ab1edc3c732423eccb79a720ae3b4b706e04ad3c12359531cc8fd486279701c25a160956ad1fa97b9c061cd601692e4c0818b760c2cc4cc8f86b8a4a56502a596e720ba80a0a12ab25c9540e4a2b05687c564af63a9718cb2954ac01902d432653321650d00b0021927c28e3763e211a295b2fe82365a4d380daa180e33349bcd452c5596608e81654044763111b94378e9da17b9556969581648b6cc4390580c5260f17a88a210cbd72b1a3ecb9c7cb853ab30a179f6224962477a0f220662b1985945381434304d3c3bc83730431949b52a46faccc5a58afd5d29cd7b35826b2b1398c243d2a2b1354b654808c1c14a8c96c537b779e0117cc59c11bc3106c34f47d7c28bd6f573484b0904a267550eb5822244c0c954e61c4483a09d0083b256e834ec1cb88fbfca1e1245a7b87258a612e10a5784f4b815826b68bdb49cc0077bc776a174bad0c5a2a9fe80cbbc2a279635f63854a02e6bf8d687764928e32f42af2da32089aacf99314d990a2bf44c9b482848075438d2a3d04973a2f70c31b0bb7640384e4ac5e8fd87159e9ae8f3c4163b18481fa8888562a03a381490b288f3cb3f9884412775da402a68e7685a04233a97b85d0142abab5173d117273d37c28b339d7eabcff45119cc5b9ac24cbd04423081a32e107a2a212c209b8c0552270a13869f2476d06671941870df462cff92c9d2d6573a0a1a0c12c0914c08e7ce26a66e92001016b78880c14209426a9bba97ba871086ecbb40eff0265ce5ab51172c5fa4799f8888f7a4527866936d0162a00169cf2844b43a44c743b13b9caa44fd47ed693cef95b23c1d6898893bce6764fa82b51d272a7e4b13550236951185549d810e0968bc0a0a370257b64a898c26a219ffa131f7028d04cc119db06f607ce9b4b0f832377b223650612758cdb942ae4bcd43cb1f88b1253d9582039c18b026211f171a8a720528c27e6842c3f662a1b7c5ae8d4a26827212a25c87176c61bdac01fd9499db6b7c7700ce0d2878254214c4b9caba4b930b84406c07fd94c8061463036c40a80f322d1d66e12a239cb31cdaaa9c95b76b6f6a03519da4807724d9d9a368bd59ff50920888ba54520a764351def98850d857a12a40d5be157593529af28b2e87ac77576491c37b3c7abc26991762d0c22845328750abbca153cf4d7688d6659282aada9a54044c21ef0292b0a6cb9d0a3ad51659a146c08bf66343a78960e37c76ed3606bdc9c2fc48ec83aa81e1bc0e0ca956380c8630a756709565396cacbf015fb130932b94194b7007ce344bc6473acb16135f646296bc996062526258e0c5407f3dc47613221a4d45e3aaa274cd91d72b553152a8b4e102a64299d138468b0fb89d0b98e4896ceff0a1a2e20271f139147967ea2568d9b90129e3219ddd2884823702519acb3cc9d91a112718ba91b8411777c74606c5050187bf107a83cc6a64a51ba8a5580099bcf07c7a645039765995d4df27266f6a7806c06574c7e3138a76897b344596447453b822243d1b43d25026159145282d4893968ba8168bb4b3974a1a6b63cc567cb7c212efc084155b41f957f85881795f1a8297c125532bd29452755870a189a4b98677cb3092756615cf4686c8eda1c19282848ebc736993353b14497d02c5c27049e500746e2bea6009f3ed36a830cc555c76000986cb41a94af965446d5915910b3142c926f703658f6c1197ac72325632d5775ed76be9cfa419994a4955138cf57a9f7142fb109ce06948b28f804dd7c5eb3408d8f86b83ea5391270c8014907d2508a63a4842bb4c8f6e98dbc2766fcd02ec72a7fbaf386d660b865165eae06b6730323d2593e4fd7426cc09af4e14595a3152fbc4271371491533aa8059497dc90293bcc9aa9689db40321a66a34361d9900ac6dd5398c35cecaaab613689d18b89c637a6778dabcd428237e8b0e77c5314d07544e878a50e4cbd2bca07c0c4a8ae1c885da16ee214dd20b0903e7ba3229a8674457077447a867769e0a359487b69fba5c14db922b2973b79a98e1b6280cc59a7c20317fa4290a1b74b8864222765bf2f844bfc8196c4128cd4a6a49601cb985b34780aa3cab0723b4810e61831a1a4582526e46b5ba9074054aec0283e89e4d68227b69bd1b23af80470aebe38f712b8fb1fa0d72e8032a107207c747056b94f235a664d6b2887ca709967d6cc61eec47c2a5f55ed84b48d84049bf9852a4251841b81340008e7b70ce486b6085f7a666f2b7a956c9f393557d535faba8b6de77b3db477901b8183655025c8311c7687564e8420df0917bd27070837f64b85e23a0c43f8848abc42e2590137e2a1c8eb8bc3b5ac54d0a6924742c705ab5ed64393ae4beab2687f941a443b90296c902fa1b52f74c336ca40ffdf27ca1da0ccf3337a90b38e035263b731afe61105229c149f78758eb840559b68038c398a920ccd20a8e38308c559c1550357df4ae9724925e190fe55909f38914b128849bba7e8e61130454744c9a12490b7a50733791e3086865abcf7b5df8c0a20ef54d738034972367f1f0723c57c074f1c1df881f073235a496431e865ab5555c789243e3011e4fd0349a282b582cca1aec85255976cfc6b576708b90136132022c52747facfa1def718c28878629a86da0cbc7f60b68002da2f0cbbc21448e724559b7ea3be7365c03167bbd2c0c2ab5a5771c88212a4505a5ca8daa3910922cd0233786b43fedb091b754480669b23cb388b751bc56f2594fa57f836b9cd87a1de0697b000a269a4b7a0e59386ca22685370a1d42852dd78d55b8b1ec68241e5a18e08941f8790681b96943f758dd82c032a786757b680c5a1222e1a0f7416e7ad185cf46c46a20a24402975f62086f082fe29765e45c9760e53528588412e4191e49bde2b66ff37232310793eb21849e92854c66974f2a099958ccb51815c7f47eda295122007448d771b995347ad1948203a70de40b570ab4b535bca8a721ec833c36cab579585409d79156d279af994b9b3676b4cca4372965b59377788547822319f4c698f3419cf4434653829510a91df64b05cb3a21d0d7560d271abf2884bcb57c468b2b0b4a64b738b3e2b5b9f7f10c94f0b9a8379c09b695cd3519bad934ee70ae99a1ccec52a005a601dee3957ea66c5b41ad16312acca2ad1061a98692b5a13534f26936fc255692003f285899fe560c8aecbceae657eaab75dbaa2c036a7c9f3295b0d966613a8c26c5be6e47492cbcb85ee55120d865b851963ae2aaa8d47937f2849e311b46cb4bac114b7bcc1e4fc70bf06b7effb958393bcecf049ad6a73f3c9742a36ab9ebba211d37b002fa375c81674013bb1a3307f5bc7733761e97184e6a9a6d65251ec303581af6a15181018f32b1107c619d25035013081496c49915b90b0b2f4db395b3f00e212cae0d5203a2e97f0e8479ecc6c70513499a67770b633eade88d86a7b538db8e812b6e8a7b0474022ddfd99819475b3491a5a5e9a95923cb7b49cf3aeb98ca8154f6394aa734a229cb15db973c191a7f9e6290847a185c0a9b2325729644c0e74b7a3ff4b58f482ee2605395ea7f650cc04d673e68320438bb6d4abc04c3931844c77cd9b92bf3ccc95bec3bea2b0b6ef6c23e694db9a8adb9bb087403a311f197597870f4d40213b91fd6e66403282508e9bd7aa6b6d33c20ef1c1ff1850f565c299eb23c88d352bbcc339de0b3986741bc7590a57a3c150586c59f6aab7c38691828aa406e3014db8bb8897eb3adeb205bc764cc05febdd7476d0239075876271f3da24193c5224290c391b7 +ciphertext: 3ea40be7b4de855ca9f88f691b9d379381d7d7c0384269672e1251f701397ab5aa4d077e70fac30c6a3ffef7701a1a6261a795912ff23436340b3b1288f54754f34af4a06e87b24b96402a90307587e7ff855bc4489afd38b0fa848f11fb9b958a334de85832ab39239fa7ecb1c4785d211f50406d7e949bba8f0717dff21e97d115a52620050050a52235ce3704863a2acb541360f8e1c1db82aec2380df56ef2fbec1369414d654f73b181d45fa2c26a316aba8ecae7e9650fc2171e85281c6cb2efcaead593d247ab0c1d5b5dc882f2ea4d2ba76814ce57ce1593b0357b51c847760fc254bd22b5c1a8be1c7f2f82a68f37b2c28fc6a88b7daecedc7f50953c4c63f8333c0f7a046f0c9ea7a02ebd9e484ae1bc24b2015f1c4a5e6080b7f8c13ae8e077017343e639f135639ed20845d98137b39f42703db8d4ed27de589f60fd8a1513a842e9786c5f4b3680f3505200c2bb2e3fd6728b8386f0f2760e51e3612e6be280356aa4155f1b936e3a13e189d09643d2a0d1f74760a17fa76fb2142a66f20bd57f21c6876b2a4b7402970e314d2148e67c3034bf92739969ba3fbf3a3bf4920b293c4efb016377412fead775e1f0b88716384d0c4dbde057b5520419ec5959d7253b354be5524cbdf4ffa26e0b42d97160453d362f17e9c1ce8ef199f7f6b9e0590925e2961e0d717281d4032f1ac5451661179f05ffdbde73c6f8cc72b619239f05ee6b53109ab7cb7b7a672d1ae8e1a0bb83e716b8691c64b85d6a21611083ea7567363456d7987748afd8bb92bc46ee55208be977ed73898f8312497d65e46e107cbeae6520ddd8b487977935b75353b1bf769a5f06208a445939ae27bbd7270cca7b23b50fdd4550dae89d35a9871d75ddcc6074e8659049e36a7a005117d87bc8a6613492395798050d86b1b93da151651ccfb45ba4ce6c6d8297d26dad5e8274ea18a2a716742499ef849b183962bd6d27511805b7505ba8a2b40c8ad06b54ed6584678ea46b73bf502d4372484916676fece771576c7154cc217738a4fad3a7148d433d9ab3d5a514da3e014b36556de1847f5628ad6ccf313bf45e51a13ae96c0ec1fd3c3e91dd08dd5114fc21850aba1310374dd48dd4651d16bcce2816cb958ad698d0ba1ff0d5dfbf6c180a49102ba3feee1d683dbe0fd57ef3b8ccbedb49721fdca79ad5e32d80779171f29eea35cae409ded2bc0725057fd401b8b1a243c54bb0d499e313629254b0cb1d828b464807e6792c94b92b7343aaf7b6cffbd2191e1def9a5df5f6b4cc87042491a2f48b656121281cb70a70deebc1d9240f128d98209e1ad3c5ef7cea152ae187d74b505671460398e63ac684458b5cdb02cc60906e23fa3caf48ee21e12ab20e63ccb93324b3771caaacb5a62c8a74c5bd15a9ea22538c49c6ae51f7418116dfe136584a4b30547ef2357c44f8f08d0655639234bb6e2c8d15c85e96d733bd9a51045c040c3789cbdbbc826f31f4838ca4b55ffb4e08ac625b3c2df69ce050cc778cefe2913a3f5aba12419ca92e04cdfc85c6cfb392612e0ed9a52a05dea96713b9310fef7912758614d1dc925b338244ac768cd17a9c1e95d4a28dca29bd876250976e82b0a570a1fb5cc880cc21d8b41d562d521635c497e899e055966f57446dd1ad63aac04e198ac532bb08dbb2522fae4d58fdb90f36e6d0ca457b26dde2b631acbc0163a28565c6332eb56d5eb6051768883a1a128c271f8f40ffac1f103cbc9720bdb15ff315b7230c6b89e4168345f905270c78c8e2fbd44a656e70e45796e0d25bb810c07e3319edd8a4c5c288707a6cda661933700659cd080726683ae8b77ef3e14f727543e71df6d6f51d5a4754298e4368cabaad20c44cb6dd0ade6bc3d8bbd4502ccd2b11967fe3f0b8c15c5dbcc72943de87c34a86ab0597d6d8aea46369d4354c7debae40d8bdbfa499d7c696fc8d56267176e3dec277dfc20680fc081c62a65df8df6575277e0b2af71972a11e4fcb396f00c15c2ed317ac56a2a73c8e962be7215bb1869458d026889467ea8648db7254d06bc8ffcdb9a7a7722f5f89f01dfdec4426ed51267dc22e430f1845ea372d1ca262817ab0c4f3e80faf4dffebaa8b1f27f39f772f1cf1528b12642fc467b0a76e57b9defd96f11fed6f4a969174decbb2ddec13caa0b0045f80a16a1143ebb15c0f05ccbc738c51028e8da1a868 +result: pass +shared_secret: 60a4628136ad673ff18dbdc57d04f5ec2bb90309205f7da63cba018001ec8f28 + +# Bit flipped ciphertext +private_key: f53092aa0c974dd37915b12d13747ee5ba65b74507d334a657415717446c0bc63f8532c43d7cae65e222e3453bf1bc50975433d76515ac893a05e28d9396c06bd3ac56d03e4f3707fdd32f98d99b19940203780b91c50a94b8a24a264115f5c3a42c58493aa6cc42505ac175c2111401208185e180a1c6c1fb0328f4c9a541f1c9b3fc30cb08a6125809e289155a2c48bf73a47fca353579054123bf00a37e50c616ec9517e9820928b68bfffcc6b319a95ef0613eda21820b2a39897fefab640b105c40106273205d96278c588885e3f94be75899106a8a64496e4747079c248f161c4594557825e673dff86a7da4080aa079e0135c0159589b65adfee218fe3567f0567dcf67aa02308c007027934832960b71b088432d357477a6b837b86fd93a7779496754cc498a2a90a5e430a693879ccb7f3ba2214e96c49ed264c23c10c3383785f0c450060424a54f3d19b5608561394c49c368bc543c8565aba08d4706d07125289248de9c40ea52cff22a4472cb7095c91b1af3205a72282a5214ff148cf4814b725c88a092392a288f73776af3c026fadc821132c4c348a89bf63488639e557b6853702ed503b7290891ec3a6b0f8a7f5af100a818a34f104f14331a9090a6a262434c134a80b3133d360e5195940874188571145d983f0de818d07804fabb3a06d26ab227824cfa99ffa9c21e129710d1429f01ac67e39a83b2953faa9116207cb5c228beac1b6b6bb624c75141eacb8a3c106808906d56c298b62eeaf374ccc930b0c1ccfc54a7b953c6c741477795872c03180dd18f6bfb55c33738d2d54849db67a7c6ace4e9b9fc6a330dc1cab626acef2841ce71832a7143c722955d33c2baf906b314b37f5aba5d7c3acd5b705481b80b81b48fc9187ce3aa3dd7683c987ee00964e622000eb9ccded809db6b2d40e1af876bb237d8915a4c48d58b2e0ec76159ac03da5641ae29615bf20b502a42f68b38913baf18fa1fc1b112854b229db36bd3685560360452d72ed1c1bacf403426d5518b8876a2944496bbb64ce5788c958f4327b20060313c75059198c6ff5c85cc8c37de738d1339a2c665b939222edf64a87ea26956389ba5a5016f776944c70193bc000bca2420c2227ad171f4a5a23733c3dff1638b3695f2db870213c3e1d4b922502e0a74bce9347aec06620948b640105879d599d550b6c00907a7707b35a673daec1d7846b8ec3a0507c02512380a59b1531153a150d510d2069ed177257dd6b206901d12b8bb95b5aa9e34016bb462eba973efc2c0c5d08c7f8b1b2b30c2ad458e76524f36a62763f11a61928fb1747e4e277060c98648315ae2f3c8d6527d5ce62169041603733e7166adf27c43a5a03c7271a8c765c852c652eb1139f6836669e5af9667070e4a26fd737670620f33e49ffa105f07d0bbb1f3aa30764422072cb139a5808131188391627969f1d39d861045831a9555e3817707b26835781afb3c19bc6d78c91d2d7963136371ac0c071d5c44329b0bd26c81ed3a3c4d5b8540d81a2c5c66d935751a248c2ff0560da49cafd63ce5d49ef80b37ba34517452c9d1552865f0c24a8930e4b625a412283b2b8da87880aa40969f1a99935bacc633c1c9f28ffa17676eda2c3e7969f138ca12c84d087883e47371bb5b464c635412696f21b565c53113d0cb75710111c06b6ff2bcc62f0c651ca05614e5694d4295337834dd84341d59b8e3d6548595829487a098cb8cd4761899fc588c50867b8ac79aabb012660decc16bb3b23074d54152e045e426ccdb7b5290b9175f332906c86a9df92ad4222fbad929181537e3d49565d09bb72167b958c7608945fc21abb4b2b51e300627281d9e8b4a303aca387983e15b1ddd17a0f9d63b26fc1e3630458e1cb63e035608c58a395283d44b2da7c345aaabbe81d26137bc710c62b5224445627cc5486c95b83945626b7eb891299c7a75ba53492a97063351bf371a60c1e32b9d267b1d569b1931a1f83b3da875a50f6300c9e9b76c438f6a60cef99b7f2e14b224672d00655a16c6742ac70aa5a5215189855fa98166079f9c5245915437eff029e538cd01f3994550c7b4652d81620420e60c9f897c48b345cfe8586f144aa319c39b726846a89817f5a306196a9c6707ca9bc4f5c6b053218c2c4a5d7b9ac0cc4521bb63b6707350ab086569278d50fca71a0a9d9fa829e4130175e17b182ac8a060b10c1ca935838f08391a7208c853392ba13293f0101e75596816b24c3b3a433bb823d32bba17887cbda7b20761035df39931a182238009d5f836be528258dcc46f1cb7b7e628556704dc688f45d48a7d894b88c81bcd3a144422c70253338b933f2b2702fd41639a702469387d61420ee5bcaa569324db3b1946b10ab6ca6a73f02c128b81c2bc7f9f8685bda4858e074723c38378003288b8b5a35cbd9343afaa96cdedeaadacdbc6d1533f17230a3ab142dbf156adf3c9dbd955575b3fdb19c80f4562b852518da721e00b678e17621f619c9258172b4181004a3d690085cd4864158a23bb5a23e9e49b2422377e59a97c640a56225ee6ba99e711b25214174f91793c8c0d15f280367b0d711730f0d73e04949c86300fe1c526b3b04588221990d60fde89b559397b69535b1e00ba32c611f9561724717fb3b8aa46212e291770293a44baf75eabd012849182237c772fb4cdd70593dde42954bbc2fbc26f5fbcae029917b0529083fc226da55379f54dc7d3a45188bcdeb726912ca8c1b1376fc6221ac4c97fe5c32dc472f2660cf35c72df2382c0e13bba2989c736148a17bfbdacce1420049b0b8d10555f42985996419cd95166bca79fd8363b9731273e7961d34446fb348e0010c41ed420b58724a1992096636623e8a4d8972cb3041d0a0395d0941c03234447f567a819b763e6a44e69cb0864b424747b8b67ceb8169697351e1bbb81c3f534bd5a87fd781b2b3c3267f9808f753e71c419762583b58b242b332239e34bfe186894a410341881d9f25fa55bacc21172a59c42d19988a5911b1650622929a280f1bb3f4b272fdb542fb23da9d5088c3a69f4d5117ef744c48c64a2a9c5b1d47d080394fc90244f94c01933af9e0cb7fa73a2f945aa538bb4d5100c160c901e9833b96314c7e50bec969303bc61c4331728a7b04ce0173b3639fa76ad29958247754491354601cb6622bb80f0b864ac36c4b744a6c89880dcfc4040c761a0d5bf1cc4ac431041f148a93f640cd3273b43bb27fa799fc514572ad6245c754dec0c8a5b7c7a933ba04821a747f89e7c29273c4508aacb9e4be00836a929feeb2c2fc96e79317c82c55162948302f18784c6cdd58b74d556272274072b2c9413f77507fac1cd040102a22c76b7b11a2b0e78d313110283cc29c52067b20e54a0409779f56126176381e983523f794d95284244177e8fe9342be9957c50616ba4bb63a858fce835f8e28543883894f40b171301a3009fd4299feb2649e2531960280f9660b0525b1dcde99fa7a19421385fc24bc0ab208e40ec73aad03625c447a0a7c25bd175ae8a1dec4230e06273bf48448db28cad2bcce7357daf5509222b04b344c22c853502c368c3163f24aa2f85390f712b4c2bb5c118887d5af8a1b6b5c235005c13bbc6398c778a2871bed7b2b1c40706c3c2ce484602a74f8b7091f0fc023ed59789fba6eb07291b270be7312cccd25933f09b37802add109f8f139bd8f7387ec94ee1c87b48159ce4fcbef8741f06d875ad51884017bf5d64a68b230f2aac5f24708362ca5018aa898dc6adcff568b22254fd2b0c94ba5308c536ed838918d7386565b13f9094f02a2442fc9cb7d0cd587264d02750d0c9a7a5525cda939b1a4186914b525889bbbcea970438018bf83603e6c74d967481e14288687f9762aa54885af431c32619170cb1772579c15965c5c7accd16811675515cc78283b56ab031c0b619376c93857b77ba3f54e5708ca0628c13012de515d3eca4c753b02dc60c8b193b04575a5f535b758120138229bbaa76840b8afd9c3ff3e11bc6845c00a04a63c9a4055c513453ced8f71b05103bfb15bf3ccc38d4d62b58f3201845ceaf02ba93fa88f8d8712af290eefa83f5835a69bbcd19d38fef977b7d2766db933dd3dc733fbb3170357a708a90b97c45fe311f8bb7ae2ab3967b697b8d8459e3a709cb392d12027dd2325a372b72c1c2629ee776b9e067feea6868ec77a4e1bb62d39099259efac63a7a2149b9fab582a15473065d7af18e96133bef6221db398f7b39c63e0b7812a1653247033bdab5e56c6b6c513439b2321a7439492994060ba46b63cc01eb70e3da27d8019b089badd5cb8c018689847179dfc75e9719dbfaa0be77afff58f873ab1374758b06e0d8fcccd1796175706da8cf303fff0f9c76b5d09a71fcc1ee57bcc8d7d66ac6eb6f840e8dc361042af2b5380b7a10ca11a8a4b34f457109e02abc16 +ciphertext: c9db278199428cdcf3b8d175d610d3376c2a24e19c196ee5292a9747830e4d5cf06f1d340799e95838d9adecb23ad3c24f15fceb48118e98d55ca419a4021ba73037f707cc23b8e3dce2d14053af739dbb7b738d4b4f5e837bc19039f72685217a987276d78c15d2790a601a014c42cf66254120338fe7cc912180ead70852ca5d0ef2629c1e8e94cb49c91e99e81030655325bbf7e6f7174ebaccb9d333fbd22d9e6f1dc6258f12b9f042822331be41a52499b820a11a8a652dcde657e03e395c33f26c75990c9884f7d4c1f44d51a134dfa3f5d6019f019742f5521723ac2280ba3e6dec584ab758d424344481b16151f7a5dfba772055357f735c27d1c7c20e790d28599d422b4559b4a40af8a0814ee5ea905105937c480ff6ecf26c50025420681f6f4e660075467737c07a73691e247c740495564eb1542c4d5b5e5e7d69ecec034e7e57d5513fc7b6333d84224bd333be86eb7ac5a223c70fed53e8289ff6cfccaf637804b459bfca5fd92909c0ec804ca66c0b1bf12a7d19db5da234a930412a1660491aa685147b2e853c0a27dcb86360c684369152ac624890e81e55db583b7ef160684564c6617a904555ff969a1737305a26dc918b25230fbbe1e8617e969e913a1f77f3b7e693fd697f3d6cb00453ba4e729b762fb2bbed94cfb5c1385f9b9b79b4133734b002c9d1c15785a3e8a2dc9420880481c35ef4c333999e55a93ce3ab5cffd86808cd2b5d40100522a238010dd029d0ac6ae0baf3c28a9f3a3783c85c96913b31eecdfd0a0928f5af51cdbd9d6cdaeb9b1dca8b27b59a58c6ccee22c25779389326585e9353fa136b3d5e8900dca57b23d16bab1522ff076d049d5451faf2c1eb734a6aab09aeb924653559e5edc84fc80cfe2bdae5300ff6ccf39c7fa26e3c61fb58921d0a49e484bc135a93e87bb89870f4d71a305fc08a1a85ba6b0684ec953911898ffc9ed0674c5cc4916af88b89955dfde52c2f23bb6a2f1c26087a81ffe8ce63715c8d411838114d056a5b73e0a15de43f3aac5363f81fbe51cb64fe1f8ea625a1a9763a35c6ab0cef149cf35176db963b621c4920093488a7ab747b5ae66c09b5c6f9177a0c6ddf27e3986def2a169b784c0e7c81dd5385e0898e43b0c25e78a67b18cea1b9df5e5e492ac092066f23d3ed0fa09c26dc323d1c19c6e486de451de0cb8583c1063dca2483e4dc11612107063516533e9f323e6dddcc065bdbe693cf5cce72f42d8a46ffc78bf9ffd88ca670d3087d91cecc6a6e6d4f227eb44afc2bedeb4cce20ef00db93a340369a386a15601270b8439a19e9278f265d1dbfe01a3f0b3123d309d91d97bfbbd8307e245cc19ab457b34ed410cf4b44714877cea2a0019e975aac83d02fb0d454afdc54f3ca7ecd8e1c787bf15f278b6480c80bac3fc4802815e4017e190c565d4563e4e313d8fdfe55f41d5c3aaeeea508b0883061fa11ad9769f9144090b778ff2f1fbc46fc3fff159963e11bcab0a0022de7eff562bc46d39943cda429818cb927185336e5aa1eddf3e55225e8a7ea365e4cf4deb1b0bdab2c6702c329209175b5b4934e91397e746193a086a304f90954691696be3e0dd433e005185c783163a197fcac78e26743ae4ac6b6de0c834e40727a1f849de2ef442293b906b44af37a015eab65ccc7951cc0ac3eb34acce2af4256b09ce9397fdf56f5321103ecea96515736cf5971d2e86c0bd2b0b8ff0dff29aa6dc74f02a2f1f51f9ecb1853a7c1cc097778a2768abacae3b9a7be72fdf0af539cc22592a0bbb5aa4b4d77c6f39405c7d5776410314cc97db1fea6fa6266a8b64be59c6587ed2431ce64e5c2c4de477df7fdbe4bed22b51ace0ff862214be6e8387a5e176be0042c3361e8774ff387cf0815bab1390e656cd36714d7743302581ea5ef7a141d9d6fd0747970ea9402e6557df8ae8164d33e29c8fec3cd1c59be99b729cdb181554f427c4db211dee7f3d71e924ebf759564fefd3882d418941bd2c3d98f73e0ffdf25c14b38482b49184f3a4308bbd30fdb83e3d57f841dac6052df16b343d808eaceaef82fdad1793381bd67c532b7d865352c3133725716e2313e48faa4b9eceaf4c13d7b2af93951da7718011108cb9eb960700d2954cefd2e699cffb3997b1fb5a75868a5f034b1398497d0297ba9025fd02b64e20f5ef525697c0925e6acf6a1aab01f5bbe83c1 +result: pass +shared_secret: 51fad159d6afe93e47d7a326629756b974f26e752c6ff0d078d23e7e30171bf6 + +# Bit flipped ciphertext +private_key: 7313735134aa7c548e7180116ffc344c783859f47261c98347519d51891b7d441255f8bdf45542705b0cb13911f1538f75258903e16fc89a4bc7cbb87e530f359a4355fa900bc625b51750ba71108ffac9a6e4063a716bc988428fd4aa69db5a43b08b4971693e741d82b79053083ba927a1f25609d194c32735360f795dfca859608845f4144566a5135bcc0c4304988479a47fa1b877e0ae866016dd437b13fb7e0c26bd11aa8c1c358d8c8146f2f716cfb10432422c0fd5cdacda365518ac4fe5449d3b538c6058f1633f2c7145d6361fc1f27af09a7e87c75436969ff431b0cd153d4011710908b276d62b2fd93e93f5b2a9796be4923a5b13b464297c208c20c577b869782f4d562275d41957b4bbb9e9866ca2719ad6776c457d176439e7dc5cead63438aa6fb4b5711107852b96738719707260044c2bcd1d8c1af01702a565b3e3d1a5db432ba05c88e93008066c2074e16a96eb29cd02b539e7756ea6bfdbe99822d294e5d0a78bcc0b7bc90fa8e4b1971c3b02799160da6acf1262f7941557b8c661f20eb915109850ab959b3fad261c8008a5e666ac02d19f7ba99d5937c53a51036ce15133b8bf5c4340d543baec841ed8e6ceb3366953bbc6530893c0c0c9e6763453d7c06e96bc73961631c456bf981b9d8a884cd87fc827a95f16c8131849a231cdd76a69f4f2423ba43c95515cae623423e242f3b08caf80362a2b9e8cc4a99df53d71a8c569156a5587ce8671bce68721615b57e41927ef270395f493ff4ab6ad44703af6a52d4a277f56be69ba2dea59964181acbfb450bdb17255726802ea99d064536470c98cd0ae3150b14e4789eba9940ffc4da0e39fa13bbed1785f761a9cbcb50a366141dd0bcaae7090b05b72a4eb8bae03c0a7707a66463f046445ea302cf58346763336cfc2a47a275106c818c6b10f4f41987004670a6a11ec7083fec99f209b8188222596d65e07bac975f90f34573e08c6c5fe92382bd4628923a4a3e9735253be20495fde4436e1e71428d424c283c77c6c261dc62010d8103deb1ca2334d37230d814a159ee48a37d02fdf0c8c01313bf7b8bba66392ef061225c70a7c71091ce90d05a1ac4594b3d5428416082003a810aa6b34e6d2afdbba4d322a2c5d608a80616737a98c1933b9afb20a7b1b33eb496f0a651bcde97df276b7e1a92c7429b85f3388b28467c063a67f5960436c2b0642031b01bbac058b08a8a2b9ac5f16f6a3a3914ccd170003362392a7aa67c7c04b8695449324eae0aa74bcbb60d984e7dc44aba6a49ca1c41977a8ae5b1899727c98b4ce7eb14141eb8bd2d01a641574ff809764d7317a2070fef0cbbd5c1535556fade5ca9597b95e785a34f72f74d8162dd17f4c4a4fa3d1410c112916f64a1f7abd674b6523f77c3ad9142bab3481cc9c639109b8cb1b5429b40f221ade5acc1d66202150c9d55638ff83871a6c0ea4606a437ba6ecc543e3f6b2601012c692b380fa3d905a683b400426b890334a9c0c6b1124a71654e3681b0697c3a2caa3e1539abc3a078b15952a25aa275e5c25372a302d1cba6a980b70b5c8587a65ca0a1ca51c0abe17521a112a4ca374cab554b594824e489064df525c9d71a13b37a33f0414d710917fe40166dc37a8e233148819351996aa1ca064b07bee4b38f5417c5b4b03a8b27bba5b6ad4037adc51c38392371da5a33ed119206656ee7a5e87b8a6d8a2bd06b637994305204b2c229002cddc751364b783742c82ba0d5edc9ac471cf2c5877bc833aeb1ca95c5a8074b33592524ab609bedeb98e11abc5fa489f807aaf8c89c109c0831ae50aff4c054b6a48a64b9f1f952cc4a4121c37566e31849d6c619ac36307151d1c163a4f886502479259332418f1082d5b9c2aacbefa2ab655f02390c083be2877a4615d1de5a1dfd1b34ff32a15d121a9877ad68a1e839582df283f78d8b1d5f5a83b8681c026cd7d793e20d96f32c3acc1511bc0fa810fd98ae2e586de2312a845a61c0a99759560945c72880b59618153139b3ccb23a6f7c0835e60ad34757d48fba8fcb758b37489074202ba441747b1a3082834904322d782703e38b5ac1b7b79c1bf1faaa8431702b794ce9204008b3679b1c518ced18dfbab91e69555fed681fc2bace453b1c3c6039113ce9583100f875035056a7562c3d7864b620558f95bbc7f4cb0268932d12b3f917ac57e954e9a201e5b20a682a9935dc6a3a3469940250023655cacec865f38cde6a32191d7a04e484909b105771a2a6f817a1728ba9b9151fe63a07f077669a87b7d08a20c64cb5ce560b3660906a3357ee94ad90519043b5514fa6e830b658b9b298fb59ef964bc11986ca60c47b5b8a7558b6a3861492fc8aa030539dd6669959576e725ae7f580220a43a38933bc26a82d9d632ca708d3ec29d92453757315c10860709c690e1ca3fdc0701c6d90906215b905b6bad831100c6648f5126080a0d74719aaff13c51ac64d40147be1b21ed2237a337cfcadc4960f29c62135fe996c04f497b697b1155b2bdbe4b002c7c0bfd509c6dc390b6021cd266930dc256ba127d4e0377f3417cbd5a4f94cc092f6c0c0d22add2086c5651843d14043e733fc3e4c8d75c21c8eb3b5fa767c88a2ee3f91cc1b8a8cb99caa44b79f4f906e2f15c85669e69dc6de20591415338c2393d9b855c38974434175d9ceb6253f20a5128ac4ef4b2b294806da296c5f85ac5d54b2dc40f8877a2adb8412a17319d19af9f50c4fee3b527065f5e528072e1c2d3852f4b294058674ae8673fb08a4df6e757edfc1b86548f2c4104457b0fc3d4c7b71a43caf628d562634974a7a4ca3620a8b98e328105116da61a4d2d7733216725b6611eafcc74a7f6c168f2874e56c18913427f122b44788b322c5def07b4e8a94f1c269be05252270128cf7792e56a45d1e1160b042ce4a88f1388cdc72a00057594b2378bec0899742b1c5db9861c703bcb3ab69c2a4e13248846062b5f997aa1cb09ad878c660a31b13bb482419f37a87b10b20fbfc5080d5bc8a94055e2c84da54171e5eb50ac68c3f6431d6d173283203371dcb188e9bb03fa3a3bcbb975229e5d4523085872f75797d04542434351b743b535f06bbbdc8349e0bbf2364b62324513cab79c8c59d611b6afa694cbf4576d2b7a05fc363482a2a61776fd2c2273f063563c99338b7d019cb70c715ee5176e39f58ba704cd46a65a592866da66968b2b7973488e16a517dfc42efb19c08676b102536d4bb3cc75e2936fc76fee9853c881144949b373b3717bb9cccb6c43e26b50f2d6c4d44a8932d2c9eb4bbba2f9caac975170d821d61ca133c376df30740e185469f998fa488b3523b029b1a45f753ec80b1c7373cb3911244792a8c80a9594767d1154c5920136134c5c6af81799e96765503a8a95ae990474abd36ecf434d639115d7ac78ea249ef3e41231f1cd86e805c7436c19f92903b9631e3c0401a6499bf243cd4648a5cb319be9189d2c19cd40c637db76a5e9bbaeb42c47263cfaf6cb523c568d89a8418730d346170e5463a38027d56b35b8c45196534059a3029cb4bafc32877c562f2c8c784f924166d85abaeaa421e572a944ce376093d21189bfbb689a9a246a4524428c615caa41cee7aa30aa69f5a52ac551b09ce0373f139e2885be2d52afadb85e26a967502a120afccf06274bfe7273d65bc525d7b280898e46e68777927aefd217adf4834ba388f4f9901aaac200289c098317f4d460fed38f61a69f15d146ea070195864fd22502d8551cdfe83153c316153249fa71304879201bf0481943cb8a1138cc206ede4515d4433a4267b6c771c9bd9abcf5f93959abc757e9b8b5b018f08842bcec4b67441c3220abd3326d5ffb61f3ec867e7878c8aba01326a3f212671c03a086b836cc893407f33b82853bb0e803a61775b18990860c060e1b7d73b0573613a6fe936a0b54b27904bf9469b81db5a4e98731db89cea23932fef72fd482b2d5831e7483174c7c87c9740fd513188d3b7f36304882212a20f57bbf99244bd51f8d94b9d7948ca74914afa1c6d01869ea420d5cf618d8bc00e2e05ff5306bb62103c284868aa8b6ae68ca95b9cf1134546e0187fa139ca550510ad43bbc07241967ca26ea97deb9aceef05015e42acb4c1d4a4c72fb9a74b8b2976fd0cdfcec54c918bc44e07e90b26a11725a3c4607bbaabd642b014d7b1aac35c88cf9839bbc872d488bb816ac79230e35b5a2f5aa31126b3b90d89f4ad684f26ab5728763b52258f20bcd26566d83740014b657e7751dbae71525205380159318c1a2816508f64385d39852b6ab4b423abf1fcead78a7f4ea79d557a785751ca09105a45dac6292afe405b9dac9715dafd031f235a2cbb90e47ef873a381dba1fb05ac7f3872fdb83da0a7de9d1f7a13bd8d2048407bb7f55a1ad1c2d427a500589c54c269e7ac90345cbd419bbb73599dc +ciphertext: 836b728e21da1d7da5bc5aac17c020a4c3762ce51e23b962b859331142ffa7a26ea47e3aba3232e0a62d5140fea056ce4f9afcd9692801975b639dbafe09e801e509f7516189ac997de8ca87a26b0752a1fc1f77a484be1c7661003d64e2f7304c77b04dfcffbae242e63ad0eb15e08e0779133731062751446084f156ca32c6f16da398abf07020658bdb226e46953fe45eea177805b783cff4654d78b67deb224d779297288b7874d8cfc4bc04fd21a0452d75b5e776f3444041110765ef26782b03a0d15460c300956d31778e717c8b6e81d477c2901be596e3857a0ef981a067770f0aff1259b9da6a7d7cfc740dcbfb41df9d4035302f32bc9a433cefa4592fc4681a0a2342d23110239e90c584406ef17dff97ad970ae77994d1b15471ee7c1d20d523ffbfc5d04e10aede8d46353b95052e9916d341c1997a05d319e976c6da858053a0dd90a9d5535dc93097165ef3670d76ed62fc252b2a4e4c9d6d5129c35128832a6ba64a744355e3af1e09132fb85b681b941afc68f0b8bf57333f1f8828f8c4f477c34171542e7522952f938a249a22b6313fc2e88aea073fa6cfe86b978e08e62ccfe023e16b71d45e378a9dd73446e400ac602d1fb4e367685d7c94ee076f7aa9321580db171384dc7320918f9c4c9c44bcc5ba7fa3b72a63eae8ad5110b1a0cc8a75e811de3dfe92dd12c86d302dbaddddfebda4c93fb0395665b219d13da974455c0fcbb7f52432d30da3bd2f13f16fdfe26fcc86ebed83bff43c617308beebd6088f0ffe2fe57c911bc36c9514ef6d702b7daabc743cf021913975671cd03e9df0159467e66764eed5c8f8020a01b75b2b15d3f118252585d2d2968fa3e9626fe8dee2b74ae36ccf7a3dc3fcaa13799cd4536392747d0c36d4061c8b6d9e87e01fe322d51ef68998ea96c15ac3d5f058066238f9897903ed890a6f793ca68757e918e531d9567aecda4e98d40490bc0bc769823252220d18dcb9e16db1596bf631b459009fe1fe0cfbd8cc9c8b2b52f178f343089382c0b9a70ad1c15f1e05bb6e1a75be29d5a34725181c7eae35d8ae453bd245467c7d2c6e0eb60f0603a140268d574dd6ef53ff1ea4c6abe9a57695c93aaae464d4df3c5de7c7005c07e767cb4e08880646beb3d08f1087545fe1d75b0393791b5ebba3b9e83df5852bb9ddde2946af31de5a019b6ac872001ee9dc0eed32682763c2ddf22698b87d94d2df33d193a1b3e4aa1996bb0e9b4804889e051f111df2cc1635aa9f1cd38a36c8a127f95b51b74520dc5a41fa0f0ec59fa6a41887e08183b4625b8943f1f7d23f5ff2c150e4cb9a0e7479664792eb62c24e06746a35e385de0694fc7a34430fe4a095432e976ead49595511b60c62c73f6b48c311c886049ff6d7972e4942405c5abebcaabd97e6d941b6158e0ec5cf7f8ce25459a522ff4284b75a5d22fc5ff299e5ae0d45238131137f23aa2aad4bc4fbccebe01f0bcda2cbe31a19bd316d70619ebc16e099287c8cc291b2b1805eb22a2b72e072014be16ae4a891b20e196cb6337c1ed6028be361ae82fe58ebe2f14733a09cad9302162bb3d2b1a211d88c3d468ac08812ce48db9d1eb6005bc7db84f29e8f11f188afec2bc45d1a0f1a5b120ba1adab5ab51cd7e6bc10f7d289d019f489308437488026981e5db6ce7a42bbc6a4ea20ec0b22004f3e8fa08cac4964cd69e13610e2549b99da4f6c30da4996113f730c8918a1a0c4b0c5a3939304c9e546fc278ae7178a321a4f92e14d55d46747094fdb0cd9aa49b1b807b315c81727e3d5391ff607b84b6f486c705d9518e646f5aa0da9e239299e74d1d5d533f0348c8c1496a575535d500922d11d6de7bb342e63a1ffbf9d87d25fe0fb28a5b8b30a37aa578a3ada690eddc141ed5674b80cc7decd8e070a7dc660b4f7b82283ff911ba56cc8c8212e903b5e1ef7db5b457a0cb917433bc5ccaa5f2aeeaddfce9de0fca5e2a97d773ebf7218b6195b7b07413e064ddace42e3821392910696a5a3af9c85d73da860e4937e012147c85548d058ce53ff952e1b4f6dbf5791be4bc2a37928ba61f4677e8fdbbc71009649e424063d2b7fc88a72569820763f25ad05b27a76ed0a08f7d6032021c4f3bc38be599dffd6210bedb57ce26e41142f1e2054864dc891008e1fc4471187fcabadec12d20168c078ecb299489581d8aeea354e7977b25a74 +result: pass +shared_secret: 93613598b6bb7f77e5f1b23bf1cf7716bfdee8e9debbf9c395dd23f7ed7666e4 + +# Bit flipped ciphertext +private_key: f2ec7f1e23898e7b8b1aab76775332ea28a61e49594696141524b0a1595f84c92c32ac49f381331e7751ab3aa7c58bc0ef1ab3977a078dd1781367c4cacc359889425c4a9381f30a22ec126895b4a5366c206c40e1d4585550860b7432857c0beb6b567e9b7fcac7490a4890eb035025152d2df14365fbcdd2d6b3fbd1737350340ed02d06dc81a21832a94c5292c602df76c8b71b29de0b73245c9a8604325076a5590b244f6b2f10662e1930bd949c1d70d3ac6ee6a3ed3612207c0e13451d032bc7a0f37e55a4bf2bd5314c386496294221aa8960ba4f8ce190bb12c32721bc11078d0ec1140109d0037aca39a431892b5f7d566c2ea05eb9448cb1b134f2d460e04823ad59b95d10bdc480a57cca36d7ac2b81a4446461b534f2c893015a898280e701bcedf3409be426b3521695d29d56292470976c33bccfb4700170534197034fef8b8ce26a371830a7e841a902e10ea3e44675054771d3c879cc3555f280e94b2b36f538f1372ece4a2536e1a4ad2918801b7f324c8d93106ecdeb944d8c8d9c54c96d4b7980c9ca73e365f88ab0402612d5cb5985019bbdaa3b37dbc902da062cf1b8d0b8637e1b60e9a48e0d9c2c303b37c6b24fc4b918965881a5e1359d4917cec9485591ce4666c83d6533dafc063cf2cc72933c2239ca57287cb941ade9b8c474e030af495ef384556232623d0b67cac41f39fa42b5600dfb7a13828b1882661b660470c0e6a2d222672185872751978697b9c72352b016c719707412c145769157fc1314d043a82f1b65ca265edc7a641908c7a839875975ad696c16dd054fddbac19ad29850664449dc803c0449b4512a0b9a3fbd098c3cf97a2e0410be72b7cafa18c129a878781c987c989f896cf7862d9290b5a2c8464a835a8cd74af575cf45d0ae904606d5cb92b1744fa34cae78b1989ba75d9b87b834b3265b3122d6b9c457e54559477f7e61712801c434d052ff55518611b88039cae3711cfc7263b4791127b6baa988c3a5337db970c5245a0d1f051a924643712277231a524c743b4809422fac9aab6287a816a4ac34c476c64de4b25ad329948002a5ac363398265a447477946b7dc9abb4e8b72ef802130015c4d6a026c253543611a540dba35c7cae11709de2e78ec7c0b819aca40af19f4bd0cb733a5187390655d46c882b9e7e8235e7e189cf93824ba6a53df14ab4249a85b480cc7575aca92b0bb7cdd8359cb1a90c5f9b6f58818595d7b237949f40755015f117e24683ef4773c97b3d0e285d2230043d393af99abbd73868c5752a41dcc5de0016fcb7949f7a76e2e07c8fe519532b8204c2c5694735a0b2aad0a2386480709ad50f4c5039457c8332e6ca51170bc6422eb6e27152307d24a7c15ba57ae4260350132e1cf484708754a7957e68a4b941a299819464144b1aa1274fccc3189e4a2525a26890f70785418d1a30bbd4b833d1dc05454b2e953116a0985d1c3000e5fa7c11c48abd2406fab98de9fc0006f49a27333a09e088aeba9f82e3578ea95bf67836a91742168c335b908fdd06a9df168a3f3588488abc175c188fbb738c3b849da47adb8613ca28c9cc103f08f83f0072c4f7cc49ebb12022991b62871c15103834592ff238842b496570d252c2bb39cd8cae6d72262ab0aff3140e0a10a61404b23fd464e0977807775279f7c980069f98b73413007c548973bae47ecdc9b3c0a6772d63ac832a7728040e978b12827a6b236c757c811c6c132d7a07084e066f79368a311270572223c24b605737b7623a1173e612e385a666b92f3c043508ac184e096a5ca72afdd88f73aa6f008d57bf451053d86e26231878731e91d5ca55a5cbae9c289f670578624b9cc303bcb983007322405b555b659311aa292d76cf86f31ad0018e10a4a45bdb466ae4b988f102912907b26304c6718ac6200cc7dcba292514917238fe58738eca1cb0c832e53359e09c1df4bbb41c79372f233db8fb2742762db7ab5600e8ce6bb5c59b7b56ec548263d917915929ec85c8e2e938da91496c116a24db19f9ca677ef48dea1754bb2c318a6a5c201b9f81b1937e7097fbe39a80da7d3cc94d17d02b4ca5249279221061c030ab4b008b5091527f9c05766fd75e4e58649af1ab45c21bce2a1e5d5108f8901357194bff83137a127ff60490e8db7cc0161304a16608f9398a5b7339f3cbe25c155d1867000b29125478b6d9367adaaa94e6450e956e80102c55d73b3d03024ce42ee6f3487af83b5ea3781e143386144c0c755f09f57cf1a32da0d1b0b1367832f492bd144441367e114ca67af5afd4c7385b64c857c29a649687ab429d15ccb38620c49bf94f12634dc3067812d6c2c3b0c20f558d75e15c6ac0b362a6557f930a33f579ee98ca72d4adf4758ec510874ba964a9568008a585e832a7716142cc6719b88343381abee8576a885c40d4d7a3624a214dfa4f52b31af68b80d705bbedc25cddb9b95236b3efb63feea5b9286374c4a22f4a567298813760a9ca7df2b7e4115507d61d0677a581419e4801bee86b6c313307c327ce61652d7141ae3a366cc0c0af15baaae0c39a9d27682c1bc7879a659b09913972847775af415688547bc7adcc078ffa4702698196eaae5f04843e3217651a596247692f034a8d975512435eb6180a0807518d737c31855362d2332cd197fd910511bb92676677095464c84707cb64b97c6408d0b7a6b5e20a8aeb439b70cc83140459e582575a29ff2987a1ba632c2687312c3b976aaa7e004e4f292184e87c31cb5e0f540898d32202088e84a6c10b9b336e9caad406866d947439db90c3681812e719b62b46aaf145d1356eca898d02f95f7de3658ff3532736c30bf591d688054e520b4d83c8364b2005bca22f8771ce95b02fa221e18a28fa473da0e28e958a0c5d0bcd838161d2947b66a70f76a453eb34405b166b16e28a8223caf3d9644a3011ac23685479b9cadb5d654bb540100d9f3035ebb55bdef8c6aba353eeb516b8b38880168b2888c82654bfdc881a5e818c1aa1381064881ef5985c6b4711354772246be8b53838a68b04e47e26b3a008ca93425015f84c7079c2ce82c495a2d58845732fcc3956b3213349c128d33c8d3d0c06affc9eb0c92b3544794463029ae9ce07b45b857523965382c6a569e6357f024a840f99012cb0536d5b317d97c85a051bda1acf47ac655b96bdbdb203e9fb7b582b65eb86b790f6c50d5198e2a2097ea78955e3990d80a0bb3ccbbd583a0b5bb21b5482b0270b19d6803a773c15820f374b3e1942279407c4a742b0ed986156e5648f36390ca870eb9aa0edeaca45c51908625bf2a9a5311c6b80d9ce876748ea9cb8d4a6ac1ac5ce494130acc2584f1b122526089e96ab1942a91881c433fc13924a58df88770c2ab0c6605ea11269e3257e019635c9977f8a7526563181bc3b5aded062216b5ccbd5c190157157452445407177d90a383b0fd4d90892d4b92c9630fe3bc754b5cd76466d747621e8d6c8a2a68339d73339946d79a3864d7659c9a4bd304945161b8feae8558da68284d44b89a25023274abf4a272cc6369f7b9ea4278e96d35ed2364c8e6bab29b56885c8bd6137ae643141d9d4c970872171d6ba34ac01fabc700392393c91aa7f284fa217565f7a00f3a2a0bc687724212bcdba2349212d96e3617cf9833d4b3ed54ba1c0b3ae1096518cd76f46d696c47331ffdc2229b37ced101fe9e97ececb07a177167f97c5850b39c88363ca6879e3e0b802ec22488652e9b290c7556d2117a1ab459be1e3a2fa88b56edb7f48869ac0d91266660e21c7a7a7e89667fcc7668c3b66cb7cf0206c28e044d0204cdc149b246c2ee2a243a7824ac8d56ca5fc10e8369299c36ef0d02cd3fc37bfd7b509e53ac1e973873a3a03c053c9ea59967667748963fcdb6bf0299c5177a823c5278d6243b85ba19850092b061c21223a900570a9d27ff5840ab4ebc04bea1aff85b93eb1c4ca76ab58204df20637fb3acfdcd8aeb3030dab6c41e723040dc0554928c0dc11383216a2840c9b2b6c6cf0786e88bb78d5d4861a7a7efb32b87c95992cf40c20c0aee26c6fd86aa687e110b98020edf71ef44c1f4dfa0b52f66932215c11b9c4d98414fb1486b85b3b9bfa3a6972a7d28184c5b6a0c2c82f875c1a17baae9b20cdd700b68980606c8778284c2465e80f15565e69c2c45732afa8029ab52a5f69e7aa927a1b1ab10fab12ad12c89349d7af0c1c731eb1b74a11a842b832f58038ed45cedf9c96a2bb3decf77b6e21aed44c0739e6ba4351a1b1dc18d26ccd1c920bcc136d90e2a62e6a620c46b15147a5b540aa86052fb4852aef698f624186f87c2b33e72c8d444ff0fd73cc16c909264dccfa2290f93b867634185248c6b6941e82278998324f40130eeddcfe5282ef19429819cf5da3ca3bd41b952304c77b495b6a6aa6ed8f4b3ab341c46abd79b73108ed336f90 +ciphertext: a0e8a0827bc1e2cef90177b7b0e2e9b6aba88635a691bb6d13575695ca5e74198ac6b45d6c1bce9fd6c7b10d334bafcef6f61bba11a957e3a80aca4a2690aade86573c5a5056ab7715dafbd93de0429d3867fcf2ccdc047c43ff0e1268242c8d84901e58d6ead84ea7910089c9cbe778691292a1c7e4cfa8b63f8ebf98385e54eddc7295aee9a26b8b69e3f0e373834587fdd2486cd871e7223fa27431683a439919fff595753dbde3c8d49bc65839958c9502fbd0126a0eb575acfb071b3bc4300987742316d3448612a3bf9550a4f35959e00a30e2614b52069e18ff187f27dcdc600bb48cc20cadd18844737edfff0b541c0acac18b43f02153c4f87a7e1720903c2a25414bb0396a1fef200e4c5b1775b85bcc17441bcb9eb76dad5fdd8731944555697dcd9323e9bb117ce4e6dc9bcd62e3e899daeeef00d0f3e34a864eb123f25ee8be5342a334cb4e06446d9c5f76744b494f8bb70d70449f30819e38c461c5fae4838d0f161190a61c965bbdf7f0626f11c37b5bd89efdab1cc8a24a0cb9aa8ae79b746461ad517002ac58b4f35db8bedba0d82c5bd53d2e81346b8f7e05057679453cc08d6f60bb4aec8257c0929e7ebb17f4fe5858b4f2fc67b9d80b5e5555b98962370da859bdb9200c095ee4690b8550a26d4c0dd17bb264451339fc24fd52f910cd5decea55d6a44571208c049fd498751dccec8c314e5edc74ea2af4aaa585d888764d53b4b98f84f33486c3b554c11f937796884ff12f82086035a44e4b3e32213e48f90ad88b17f3963be3516575e0da39a7d2421a4a6929789fdac5e98afeb31d1bccf47f15b2115964e102be8a3f164dddf8377aba62788cd272dcf8c522a5b1d6c6ee1d5e4ff47fbf191efb86804495b950cd5587e4b9fe76e7e58370dbd1202919777abe74db35b8951a200e3f74eaaa20bbf05d55aa511553921992a447a098ba994a42d7ed957eb9191f0fd77eaeac5c99e8d1d4fe2b760c26a9eb593631445cad83f222e6caf2f867497ac60469d0da32b7209812c8204a5dd7699889f5f9049d8d63c4727a910091a4a04d55517c4d7e5bc2a4b85281645415d90dd4c5c3849f3c14a8bfc30bd6c80f45196abcad9d33976051f8efe549d99f97bc1155c7c112f6d47e972966fd27c1b7f4b0a923560c49a099d98210c5b7021813ebaec76de6ab1cc5e60f72989bcdc989059e1179b499f835ef41440f751f70409ec133f4a46d73024367b7416977b5e448b79f1135455eb08bf1ef0a4e8dc657011597d20c410885056ded1f215f56cad6eb0f86e7831b16ea105a0836ffffe6ab1cc68b923047db754745626184bab0f2285f3dff5bae197b3ffed7d0cca67416ca828d034cc055bfebbf600f5f95c73d37152b27953163041155e436d84adab997816b030e7779454b11774418a16126b48c187a74a2f97213414e6844ed50127e993d4cd0dd04a2bd75099ddd20df31ad1aa2d071443cc4cb7e3632599f59e217504a83b6836e6d0e6232fcc514c39589001e7f60893107a275fdc7f63e72ea2b9ab4db7270e4275cdacb95a677a6d28b7921a5afc646111ece83c444c7da4b4491871617daa9eaf9340fe417e4def34c7ab0605b2fa019d6c2343c1a708d7a6889fc2c81a712d938815fd5d2d4c6ef684d6fb381383280b2c882ced64d0023c033fd5fc5f7144e536974f660df15ee92918ad463ac89cc66d9013ccc1bacfcceb9b1c70e033125ec826a356e0a2ca875c8bfd04f0e65989201116d9ccbaa4ae7f80e66ef1f91877612b4e3821513880ef650879e543d787d3b312193c8f19cfbc0e9e1edd9e28c0a8d8da84e5d26fad828afb32dc0ec1ee73220241ab90f8c6e4476838180489ad01288916a0999b2ff3276653e3b5f81167ff901cd08583c049e648f32e0d98a9943cebf7c50916714f07733b8fcd58195ede97cb40fe1d8138ea50714977332dd52641d719a9826fb514b642c86a42fae0d008808eee5af5ce04302deb5361153b828752f643aa22920de61e4238e4468958ddd96054424a75884a834c71eba64a1bdc655016cb1bcab722d9a3c4ef370f067def2f26982f1bfbf14128e9a92ecbe81bfd9e6a29f7bf0020037ef17bb424bd2ed68765ccb882e9c5474c1d2456028e27c00d65a5bdcca43e2c25698774a75d8203ca83ad35a02e4b7cec67755872ac83c9b278b1360491dbe80a79d71 +result: pass +shared_secret: b1b70b3ce3ffa1cdf13404a7056665c8e88d198cc6f5dfd28b71b39de3a95d10 + +# Bit flipped ciphertext +private_key: 1c377ffe329415136d1ddaa140b865f5f313977b292fbc33cf15bb650574b5fa168936a290f00b7ea74f12484352f778eef31267d5c6e66abdd3953f39015aa81c04c1771998186525b9cd97624d3a18beb1f822130063fbd89852782b4012bf47484c7186a001b20a1e2821fd700d32a4867282b824b258141ca21373ba7c765fb71682a8c3c78b955df6123f2ca6b7e7422c5beaa96bd49ca39ba1e0d4cd6dc883d9dabaa1a90b2efc99d767ae8cac84fd2c2c38b89a98b976cbd8a5fe0627553cbec0db138c272eccd1021b42724829656d5a402e05a3e82492f915094657c5958b93c48719194659ecf00ed0f2981449a7b88391e082699a80384aac446d73b67f670378e07283811a5cdb6129c64639709f38c9774414316d134b602bc39eb7a132825984b750b516b89672b245841a3eeacb8ea60dd1c80ee802abe6bc466ffa9b2f3b9acf83b8e085097c261b52d290d3bb48348c1bcbdca446c01552b13551c4415c460b0ec8208e2392234724336b14eb5bb704134ccfbca61035b20d567c27733cf834a334f6135f4387e4b12d3293bf15d303d1e656c01a9dcf5494ae5952ed72626ae6adfa6c8ddfe95f6f037e41e2afc5c20934765363a212afa2b1165a81166043f0691bba71658a386b1bdc5bfcc71dfdc9308bcb806f94456e4cb1c66c921f17705582b1c6e86b95796cffbb35a2b5c0b07137e8605bd7d186f6f5a27876a796e206b2eb19dc1122bc76c3dd460bbfc862bc3c441b0c5c5e41b1d442c132b3c949378124c014cb675eb8451f3b72601fc272749833f842ced8537e04a2913ac771e879358d84a5b655a0fe064546a582249c5054b61628b356c47465f3d738525419f768366959227a245ea6451e1a534376497625131a5fd1affd9a87d4fc12cd43521d64460ce97b868687f877aa397c5e4820bcb6e2a2d5c9a725693170a8768f348750e5af086b32edc23dce391065054af7b8ac1fa3a81db15ee0db9e8ac7c93a60a86aa36ce0b25919506f5bfc6457a0c1d5552f41e7533d152fcce480d959cc72e6cceeb68530b9a725b927fd57c2c1014c7740cf18284d6fb452e0eca00da8bb4be38d64511ddaacbaec8981181aa720003c770abb66b5a26f78ab667b49ebb453812720c1f313a0d319f012950679aae7535a06c616ac12b5f0f65c0b5b142fc50e37346b6ca0c0b1925d5e854dc9c23ce362a454845b81b0cc7f37b5f0047c559a228b8008f08a9610981ecae8cbccf36df8db147fec4fd7464f02933bd451108b26400e0115e3977f90542492a17b90400202e2100497b6eb7898d1138e15e8ac68f5bad3732454cc73d9ea469ee12b9cc5c000677e3dc70e767c5cfca0b26b8979c7d994deb74d256c1fb3c283ba2bc0a76bbaca4a531e9844a216487f2b006be6cb4941911bc28cc7668328026a88954708f72de52b1f42c512c88cb8268016101ab30440cb628c7532b51b47d61caf5590cd795f7fc1c787b04090ab0e05a52c263a3030801e1da009e285c38b825d2fc8bcfad79b8b5a73489aa8fb7891fcab4fba78108ee88e871923836784b2337a025cc29db05e0e0b512700c908355502b270a30b5e704a02faa1668af0554d797fa88c9d24f6733531c66a02ae4c08525f75658acc03be68c597f9a20088748796b5922908ee95699d436825eacd6b5141c7387c2da71f1ad86a935c700c6b86d6bc344186473883ca16282644c94ff6191cf0d36a53559700d7ae6496459ec46c65c711c0949a217c616df47370d6cae329b52dd5a90a99cf42e1346e526962e1a399aca9f3ac398ab479bb4594be91aff5e8534197358044b2222a6e47fbc297776f96412a57287aefe9193a21023f92b9ebc30cc4b7765daba83e5412546686745acf1211c41a4c7d92037ef3072047a359388639fab2c58534228ce091cc8717ea6910421c2bc0672b98481414f08c25a2b6aa58a8c1f769ea229a85ea7bedc154042ab2e412ac25b3b34698789d1533953935d531ad77e82cd6c289f28843f84a1268503f8064a09e8b59b56a6b72030ed07cbc7a646de1b8ad4bf0235ca49e1421babfe44274a7122f9204c29b5adf504302a075ed18738ce8902d610e118b0f537aa4309604d0075f6d848b7ca98554cab054778aa82ac8a2ba02f4ea8da78b682a690fbdd187122982dcc1173ba3b9965c93cfc11ca05ca64ea77449325118d6a3bf507b4a845497b3294c0904f82b63fa779f758b947c21356b220c48c4b552f8b03d97333b3ba12c8012cbc9c848a89c52b2b12d757582f81923466dc31990dad36eab98267d2595a8c5785d88a854c065ea2645e2dc04f30009150316b2a77cff8b820eba64cd48bb3c891dceb8b6af7475c1b34778b1ae485cad2c6999513bb2405b9931d9932574467da038e1a340fbb573e1a157747c186385717b8659f19429dba03a36b2c779593f71455cae77132d2a4ccb2099a43494f8376bbcd2afed81c64f187ddbf8c29c2c0cadc65bc4e82a2868b02e3c17a07888ae937311ea9fd2abba601799b537b1eb9871f8955cbe120c5d78788099a3fea38a9a75bb9894b3bf189fbdf473d2a57f351116cf671122e0359b753266f686c7dc5e2329109c375e45c846c40b811ef683a1ac10a5980a77d97cda5773bb9168bf478f37c3084fd7ccada9733311595124100e7354bdc8bdbcb84508d52769b09e7d68be8f1a1f09041cff704d1f4a305c24536a3049baf770c157324fb064be5901ae479da69269a409584cc0cb47833bd2e0bcbbe92300e57d55432cab113bdeeb080e50c9599a6845c91478738de6b9c16a9827da9085be2bc8c690af5a028fed1b33c4e8c1fb1c9fc3a33e944c10e1f938a15b019581751577758e0c07ab0bbb0f6519d77519cbd20736e516954964f80b0f90b469cc72504e946b091604287c69abf33e9d987753a67bdc6b14ffbc27e2c9903b5447aa1c5d6b0988129177c6f81a7bc81b842bb80325cf14f018308cbdf7d33537d39ee211ab7cb6bdf8d4ca9969b7fcbc171041551471b22c003351da46492161aebabfd21684f1a29cb905b76b436b23caa25b47298325cae5f2cf4930b7abf3b079067be4cc0ca4a14777a756ca047d9276949ffc1ec6f008d1d1b266f4cde4994988089683782326338a6751307f7453bce6a23118541246b86219a9c8818cb64285dacb69b33a91cfa8566dc9aa2d933886f38be9f1813404ccf5a8288736bb43fa0788eb2184f488fc0636bebb7c96f564d7f538b15119c451a3da384f8a35b4a345c79354353af8092003025327b319ca599f5a045ff7904c11425d85bcd3a1ab1b574b4f18585d7b6b15b1865c346078114ce618bd36bc2e09f834e58c4e165547ad15caf6c01218784abaca1cb63b9669f8b70d539e8d8a1496383bfc4c580629938d7604cec76352545bc9a61353d3092ca21019201674f325124a98650196b6214a89bb2a67a64d60d645224862d03c37382acc88801f13ca2b1a0a1f0a706ab2f16aaaab6b187b5ab8d820b253cc43e37c3d7572ff0316b5cc93cb3674b7933dd82c8d3b0c00de589f03d3604b1831fbb9b0ce00ae4cac3c385a9f7b8633d1743b649a64f9ba57768473aaf50f68b987c1982456356a792677a9918e52e6473ae72aebe4990caa415269aeb3d4989dc1653f290779c389749b9422d510bd99148c56469d303282b19d3e719519278ac4768ee958adf8476f08f4c02fc86cfe0b2ded04a3a76111eb0255e48837226c1f3561638eb3a5b4c62b6fbbb347b405c4aa5283295dd2d854e69895707c55cb2837dc74997394148dc20ee9450a5a00afce74983be7914205c3dfbc4cb8f27b3c0bca60f845a45c0f77ac47bdc0b8f412409b953d1d850074fb97805aa03769082817773ffb111235c3e1ec87d59c12c9fb4d78668a4b76633e106f1a22905e4b77d9908162b979b36cc924a1a155a01728629ddcdbc3a644a43c073c4a1575446595ede5291d4b455da5075fb3a5e3935334cb4118641d10f6b73fc09b02013127bc483389b811921c2cd9228600969bd3aa9d417c4d9c430b50b39618af3d908983556411231d98aca4e9eb124456cd118742f60365dc47b0f3890b7bd28044f2211b9c07b0044589d4ad48275da5c1b09f391b27607f0ce1949fb80faf7cb23e15a1d2ba56e36bb7475436a00670236308943c28855caf9261ac4a3793c233420e404fe74c9da47c45ec57905b7193b0ab6561e818d1636d1cf877263c7163783b193c2e103b349621260321b30c20021f1a05a3253ddbd27878d4441c51073377488d656fdc374ab629b99dc012eb547f2617540b785d57d29a100aefb763442c3cc39d8869649dcba4f35e9ed9e8799be9cec296be40ec89487d0ac6898b1688ca74eb83a6718a03576178e8349309adb63c7280f70a4862347269642db215780f05c4a6b61089a2a52b35a21bb69d998e7998 +ciphertext: dcf4fcab6a4896e42289dc0e1ea356e2c4be4cf09323b28f9a5b364bc3a3077835b50ec2a18321b5e5df656d048ef6a716965b9ad3576e78508c6a05f91f65e18d00c0e460d7da622a3ba56357ca359ace7aab76547eea5d2cd9f9dc81988c6a7648ade5f378b03c1de96cbef0abb98cf75b7ddb597b0a0193cb0e2ab9feafb7823535b84610d6a98e35eabc5a71b4cf371f843d2b8865f11e5ddf5b2a93bce2727a2bf23c1b0d7ea700f31bd907452f82db7b8281d7a46059b27ff7860e2af5cfc942e12af96d1e16da005fee1b1ff560746f9d0ba04179d5dd2d10b2f7be64bf4d74a8a598fbf50da7979a0cf5fa88140927d45b03011fc5266e3896f36c11fca6fd9b889f90bb26d8b8d76f7911dc3946ab1eb002a128ce57f20d5226b15fdcc8acda559766803dbaa15c4d8f09db6c6c37f16820c3699dc196e8c5047463ab0c768c0c1c9e7b91b8a05578ea1ab8dd0527f846e57b91fdfc7c3e38b0df9775ee7c25c02a9e3adaf92e1f83795f5484626c519b15334618e8b89b515bb6a96c7999297b5f73832da6abdbf624177ab994098e37f7167d9bf8bea88bb39454007f10d0e0aa66fdb59aa02eb937a6408d61899bc5188c61a539abcb60f8fde9515932bc3c823e752907a2afaa3fb96473d2f92b2ad7709f9ee5aca26aeff7c8b45e25daf67d469cafbbee12061a93839e5ace55f9ce2476ef1182b5a6d66aa9af21b862a58013b31cfe666851ce092c386b5932d93bea949993a06e0888c7132f8e578961d5d7862af7f302288ac967528541983f98d3bee1790f456cc90dbe3defa87af8165db165c3a10bd339a7220541c514641ec9a2b079b91e53f09b6cf4c9c1a154a398bbc54b205245a3d5d5bb03feb049e6301b18eba5fe69ee22a4c3a873e16e9944447e4212a591d1d1ebb68cd9e86e3c31835b698ab665761a2ccd1bb660c9375c32c8a360b65e68e4846424315a76d80b4bc54867e90aea83db54f51a24f533b960c96a28fec70fc2e43b63f322a84c156b565aad7912890bf89d8aaa8fb56b2adff230a543f2d69a61b3b1aeb224f0053ee8063a67e63edb8f1e3e31c1a80bd8599299251a6033a30c230243e72ffa22ea219f322177c763a41519bfb42041e19c3b15fa9080d7e552150c1b751852f46feeb7dd57602ea716077a8986e1fc513dd4e4816657ad9024c122a5f5a00a382b271394606e616265cfb68e9f70a931a21b2f560c90c30dcc86c250e6279c91ac6616422e7a7ac3c0dc161e32d98fb4582f99be3a69dfbdfb5ae94ceb954215e4f7d385a33c7d0d9318afe2c30493c1f1ad92ee5360207c125ff7173a9049104c91c4e86d410a3773e79a3a54252dd2eb9d11e864e39cea7824b6400367a227213389bd283ba5e1060c635dda373f2ffdc6903940d1e903aa43131fbb02e64c7b3b04a5d943eb01ad494833abf7cc4132fa2ce70ea511481058610cfe280c220051443844b6a1c1937f2346a0fe16c335d4cdb0226b5b0df3c107462bcae635ed8747d317eb35a2e88d9283e4c7c6af08ed786197eae77177712f015405b93d0760554eccf0a4ceb8505e0ef0ffb013baaa01ba34bb4346e67548d473096ff16482da2462a72d47c14581189bd608dc52a43c92438f951edd3c0b4d59d835bbee430adaae0822d06c17067ae6cefc770d4917d80f01282c36edf00802d6b11f1dcc1917e37019d8b2aa27c3bd97e9d49c99c0dc0ce6edae4fa908247d1eb62b4b279eba878882319931dc3c435d75f731b9be36abca7ad290ea5efd16b117732b7abe4786cc70ec062686a736fe4fb8e4375eea34c37c95b2ff523fc8fe3a9718a73abe3de1511460dafb61e09e9108a754bd1b6337bab557ab2766359881473b75485dbce6afe15eaed18027b2e07ed707edd15797d7854c14a777a140913d5125ffe8dc88aab4eb25eec478d339f206991831b44d91c1aa858bd0f675b45598f03cdf9e0b4b62259ab2d11e30c27f595b398fb2d6a1723cbe2bac5d712cb5a3e6d878cd77ce60e6cb32052afc7a5069f866ac065cd2b9cf9995ab5e911aec00965297b8cf026f30c061ed5390fc4b0400b77cc085431f174a34180c86cc33081d617ee6d51f8db9d95b45fda164e291b1444fd7f57468d6eaaa6ebb22da5654c04a24199123c26f6b1227bf7eec1d9c1bc623aed646b78cfc1e627dd7ca58e6be0247b92d795948 +result: pass +shared_secret: 2606dd10e825351bd0bc999e7f1a033812174cc74328d190e6841b4998e2576d + +# message all 0xff +private_key: 88d69a6168a4e014c6f1f3a44fb4bff122738176020026324c543df0038008968cf0c494eb593d0dc686f05ab67f04b30a458a43c40f7c154fafb177d601918ca7168cf174e2f09f64d3a11aeba33eabce106b1f3c682f4d521956966be5da08e2886603a990ab3cb3828898534a737cb8bafe321592c5ca27a3023a876655318c4255064dc528e8f43d70ca6905f8561d1cc5158967bc8c398d0c5c0a59af004751ee49c8c8472a83046fcd19cf9181055a49cc1c106e4a118011781bf2613c696a2229979bb0a04ef2c6b8075b77b8806f4ed528dc5120bb81a0dfb8b45b08119f3c9815601ed251188bc722f941028ba07eb3921163b97aeef22cb23b673f09b51d167274871979312dc47594f6165aaa26bd907c7bf5b81aea010a0e834360f8b5d7e0a38aaa88ce1bcaa132bbb109a412b75811331e62d83d1beba0c72956e8dc8ec1707242aca395254ff1d1b83657a42cbaaac660b5fe5a1bf84c4f99008a89b95f2a88bcd76778ffb9af1da30d9fab938c06b27f60497084c2295abe41eac5ec747469a0a2b6c90f3b89bc9212891212c8a37b578f064d5da750b7415db3a63d9c78241aa89b08725239f95a588a915f59b3999a7d4b9c6975f4b154330a9ce91f91f54df9c33627fa17138c982c622e8875b822e523fa93230b6b25495a3f0c3a0ba32bc438e97ac1f6c9cf0145d1086711829dec59a4bb9390921394ba1760306c1f718cb3f69369ac67b0e9080477b889842a4ad4a977c1b7ce9060516fb3b3cc178bfafc2efebb7eb68896d2e494ce9a3b137b780e351a00707321e32bd9ca44c799401e9c5ec390b83bf72be17903a2ca0a6c057bfe8994b9a96ee905571056543fc8c4db0478c54a4b96ea4309431402841fc18b86711ba40ca8645053059ec853b8f8a5315234deb2a7b3e162815b6d73e0a7c83b367c0b1c5a1b0b6cbbb2ffa63bb5f4bc029c5aac61c06f378355a5c842585b95d87c26458efe43666f99340c08cbd67c9dde421ba2b6aee8e25c59868e4e43679723067ae95f8b910defcb71c7ea5e1dfbaa8da9a6ae319924411ddb7572da8178ddc0959f353f173c9b8cb178eff663e3f74a85055f834961de78b160cc94142a7710545e013079aea48e458b0b9f66133001307d70137361b4c6581ba2952176650a49c336a80bcbe5d1afb577bf996908a2bb324ca184000c7f37d323e4018fd3d089e13a9736863cbf238d97e594e63b17ca949e34c69d128a228668017d40392d5b3a03847f49e30e0bb232b4a34855b8685f6046ed54b122d254940230cf3b4b2caa26f6039e3372531097578749a35a39873f2c1fe3883d9f0a6cb14512943530ce3ca87bcc77281b6735c1689069c7d69baa3fe07fd803cfab86c5bee2a0676b7cca07a7904714561340ef975626d90abff99007d28fe303014528a3283a2e72364a4f400e350a3d64f928a9f00b3c7b654c17acef845bde08528e09595e4bb2f1911628e3be9193ae26c08fb14953ddb18af142227fb7882744b903f5861ddc98194a8af763c2a763156136646bba8ca491308d8969e6b2af25922b0afb53c653a2d14b8ff7d158bf8245a4663814520eca7608bc404e58515e4128910b1936a7b28a4b3261eb6ba511ababd33515c4410dd67492e3da3811aaa1dca011b5909cde5c1a02f960cc6142485b12c8b8a721b073f2882a043cae7a9a57357a52ed07aa8cc94b968629d8ac4a896c0d4f2a6e34c973095c3b1b932775ba5a25c41292a4bf0b996035f9cedf4cb8e5e45e6eaa17665c77427791073879e2d08186b33b5d8a773661604591236fa00bd5f1c679a2a2b67c274786b5cde29bc6214f9ce3ca04e3cfb0876b857b5d91e537ce3c63ef4498ff4c90a280a6ea1b3b227983df9c5d6723696b2243cd27ca2d1413cfd871ac64b083e11dc9114872fc3378b0478c3c489162b6e947b3f8010ec554428cca4b17c09924f5501a380d11818b4e00c9892c87cc765285b72eefbc44ff355a09b65f34c51c48b81d2eba1435f40401e36e473c6221c64e70b91cdba7525cd401ac1785aca80f2a1438ea8906a0458c543c45e0348baf6a6e4d24b127370f89b016e2a433c787ae131b56846b4a687ba905c644a993430d857c15b93e1f1b1db8f4881a1a47e437689f77392a730bac213146352319bbb254017eeed01a004d44d0ab4064f255a8791a7fd6c7f5aa8aeea26bff6b258b240108d852ed11a2922b08e7aba53a714b0a3bafee78236768666d851d567aaa5f61a773f5cc4fd4812be2989ad06af4a17899f9ca247a88b7021f94448a10142b1c1c851abc833ec5671ba92665081490aac3866669b4457c29227f62525b4df59b92f91fc429b652228ec5b409ef1878e1a4505884bfc199b1bc95b940f802a20319b221787a10c07239336756bb237b3cb0cab9b5467afc947d625c50751418479aa7e3418896644279db440ff20639d65f88b257f114891d11b7d6bb8c0971a0e2ca48bd95c087a57f9b0223b749286f4b1d95b49cacf65068b6b4b8c2497a4c7cad84274504c60743badf4ac452a8bf6191421ecb8b799234dca8499508b9c10427c6ba0adca91905821db7443ef612b8adfb8106486fa6942d4a1117fdea898dd1b93b46c3d56cc6c8ec7a807b776f832e8bfb24f4ea41d98a28eb7746e7708078c46479d752ca863922aa5e847355c7349e27f61dc02915d15389345c297cc91a955037c3c2313be35244d8c2534c22d9450fb5231ffec6654ec278604b364daa2a81c0baea553f047b85b3410aab6a7208b1baa6b0a261d7480a90abdb429145041386d080770a0200410fe4b868b93c7eecc033920a556b9bc3049aafc7da6a1002bbc7e89c5921b2a2811bcc91c2a1521a2c817764c7c3bfec9113415567ecca7fb317196aabbf8a34b77b8b94a131e042219f199b3e38c32a3c3edc7c093ffcb93f73860a0a3df05b30eee01f06454f38ba0a4d68299c5b8a5c6a3a207cb81ce1c3740681d1339680526600cc18996c4a1a545373d1201cd561c183c841a36a5aa0659df1c3dfb89b996c3e65b102b69a58f40123a955aacc616a010c6e9b54585ab95eeae1cae99161c5cb6cf5c1b39d0742fb862dba3b8f2b2629f9d077eb8a74843a119143aeb990b0f181c090eca10c214b59874bb2b32e4c29514acc041a6ca3b29b4d9c36bbb1ab35156abcc489cb55571f9e4771bd1084b841982ce574297b53e7f312cbc59d1a9717a2eb0901b32e088ba3fc624e741932b15654c7e9183ae6042a93151a9684dd1220365c8bf57640a5b52e1956056422ccd63ac3c3c72e994371c698bb4d14147345a2f876cc71069c582b41ad4c554b10a22e85318a319f5437be413255862b836835916a632c7a6a9f5b236a0e7c9567faa75ed2a5f69bc1f4754eeeb9b834da0c4d25b365922023b526f3ab8686d412d8334f85e2b0e10a9b2eca859c019e8b683628a14028f2b40ab918794c9b20a81b85964e0d583ab6054c45272a3ec849371232a82b4960f9661d92b03c00b42bd39cdcb22e202641a555457ba7558d6c60c471baa3d5681079689153a0f51a6f3bf5a417444dc3734499f943b2977e4e4429763b6fdf7c500741ce13b8c7c1db833380931a3ac6061039f94690dbd05b0f92389604b79542ba42b73864bc8e31c50455190b7bf191875456ec4379abe0c72034194ad5cdbb1a3aa2337e41b116c20209c7c33083914015031d320c86c3962ed0bc3ca6c44e6c1b0b43f67322e61b8204835780c8e9082f1ba5bfa4433c94eaa4fdc043fe2390c8d17718684e3c5c393df54a3a8a8f118c30c7a3198ce96bdf917de4584ceb2b886072016c958b47f530ddd1031e85b044e523895c332ff006b0776a6820c199043152d96c4ddb277b281194c763f4c78c8e782d673c7fec6b08856868c6015b02a0976154be400849364c262f2c4bcab386d81cb65904016895711aa79cd3604cb940acf8635b131555a26c23bdf13d62f10e293ccdf96c56d8e63c3e28320aa93020e2276b35555baa25895caefd86cf458506cbabbca430b1803b3b42e4ca0edc8ac7e52ba9843e5356c870657afa990dcf20718db61c1e63ba8966cfbc4c19ab925264265e1b26a6cd065530c19658600cfac17a57a3039a4a2ea602cc72e885ce3b1a6d53af66fc1d3c1cbe80420a3fb16aa509cf0ca406d50c1f746c941ff262cd5c420d57902e985231cb2675e3364e116eaba3987d940c6a089e8173772f007caddc8ae91ca2d5b23eb5e7cb936a417ec028df7308ffa00dbcd6066a0612291389733bcee83ca5cb8c47941c70ab155b48b394c3a49171da4a0be3b1a2495e8afea17b07b5bd953d85e6c118eceea4458f5d18ef7c0f64bf902b0a6c59462f53c64dcaaa7af1fac8f7cdd452889680dfe41254c03f94cfaf3e9849f9bdeeef3d88f92e6d31c6745adcd2a1ef162fef80fdbe3666449a003d7e +ciphertext: f3512e7c3acd19c1a329a41cf1ac19fc7780b19f479568321c1caba505aa4f5e07ce3ddac083dc18450edf53a3d3d2f1e79d7301b9148fe17ef5d48950b895bfba33d475a1f2d646e3ca384f0a0fec4f9310fbec9e6c22deb2f5b1843de09f93317b75ce37dc705fe2549cec2fc0028160adbcb7b36d9542af5522e4a599df41baac1553180ba2c8a0386565a902ba69e03c8121967b92b7c70b77cfab0b2ab6c49a6b942471e26ba28b1d49e97de823bf56ef979b3afe807a460d3feb93e13816f54cdd01a301ea1579dbea7b4b30cdaf0b3731d7e9fe732b94a59a871a2954ff70fc34925ad2bb2e450698d03c2b13297ea0018dbadf72f1d36ff21d79e950774f11ed585b6075f7a1f2b187d4a269a339a04df9503c3327f7c64118773d9985e6ddbabb32404d225a31765b7b1a0853bb865a3dab6350c0a7022d39160da0ea0dd0ad3dcf3ad78f21fdb077069be7e211d0921f82c907dc9279e14dc84e67f4d74eccddbf4c2babdb8ba03a44bf869b24ff9b73d1abbd94eb7aa6ff0c113d10ca62562d493c975fed8ff10e5e143fb4c1dabcf749fc6a03542614b689dc90fdb33b2ce95a41ba53e79dd9e1aae42d376f0c4910822cdb3ec4ed5d55abf6f4a299fa0dc05856fb210fab7b9830716e9bf08d5dbc272d4a78866dd1fe34ff34e7c6bc0c6a9fdfc51ac7fd2e102b41e133ac437a0e1523aa3e6e65a3ba5ee909d2dc7e6aa10e02cfcdaf37e5bc5738ba25cae24fcd98aae3415449dcefe2068fa406eb6b336740ff04e1c708ef5b2e71eaa4d43ece8108bab6c5e0ef3d51a91844471f90e1177ce54a3ee68a1c26c0f495f0a4d5bd034b72820bbc9df9c7af3eb16ae8201634a9a42e63a9d770ee021363c6ee4f8b0008f32a1cdae4ad7a0bf1bef6b6519bafb8528e525b1478ea0927952dbc23c522c117bab6d30dfb9998fc08358456732d80410649d5942b6d091193023e51b9643efa51d8b4338d1820dfea791afa783c123bda35a6c692a15dfa034a13e4d51edd365f9f86ea511056b0b639722975c4f62d965444cb3da0cf06343445b4078bf39e3c47584593d41183b07932b184d6a2b583eaec4e24e9f668b0d7c51d8a3c1b6acfbf1976286cf202595ee376e4c5afa261416b6cdd4fa0c1df5bec1e823eea9c002d61f992cd375358f5b44dc99c7436fd29af0c1eead703b0f221ff9de7d52e5385400c02b62be4779942aa1c4a58cbd4fdce5cc6dbc15b8e2e4ae7a990780e79ef522ea7777b076b4704bebc27aa191040b48205f699ae9d7fed04d0324e5f9fbd8d6576eb0c79ae72f88d20cb263364d1a482bfab87b56fe7faccb32c06f633b24632b974937425732922dc5db0332db6f809aa71b4200576c55d5cf172fdb72f0b6eb53a85c3ec3a34bbce334dd74bf6096fbaeb12f89e390868634bf60e5a6418851b8b0f8d6a45a75f158bb956026ba829fefb911bdd2e7ec609a6b4f420d49b78750420010f56459f77d53e4ef7a72aee31c3b72aac04e41ea03ad553408ebf8f4ae5feaa5b8548ef3fbf798df6d58642ca0a27c46b48034adbf1080d2d590b1e6f8677af09280304106b3ed7d25462b8fed4edb5e26766f15a01c8a65c3f59bd0aaf38e838f19aa39257ce9f16da72dffd1d94a99ab5f980b4a80e26292664b5b4e8881c691930ffd12ea7e45b0e2869fa13989e971a580e7ba78580c7df4ec93565ef949b653a5eaad144535d281dda9d08ce60107a3228506fd1ba8ae42a5ecea63f2bf6b66494ec4ebe9715fb7ad84b7dbafcacc86d5e43f20fb339841d0d9a0757b2cbeaf99e756fe9ea815b82c550b430a2a0a0ba3eefc11bb836297284bae7f7a772c01c8d374d588b9031bff480b48f84ba197dadcbfd0f44f58b7e5f8bf28b42bb6b1126bbfbcfcbfc4f0a77aeb909c02e4685eefda041307e4566587db39eaaff80427f4797c5568a505c6e1b13c531ad82344f3dd2a7b3365ffd8c722fcb09687d0ce4450f464270eed6ce03a6e65a9b4f4e07a73314a8581a6f62c3ad0f1732eb8f41a9864eb6628a281b3c18b01852207686e3e73ed17b524af35dd2b65b62a12a335d467921bac0f37cc9b53c29046f9eacb0dad609a151e6962c5d1282330afa2dc45011fa9c65e1b4b501ab90e010d3170164d5e7f8e331667ee5591a11f814aa9d16cf18d9d02a60b6926154f49d5e27220216c0d22c5ab0168474c2 +result: pass +shared_secret: 414aff36017c23c167de6447ea65b81b3df13532cc54a0426ff1c00c2fbef371 + +# ciphertext secret and error zero +private_key: 88d69a6168a4e014c6f1f3a44fb4bff122738176020026324c543df0038008968cf0c494eb593d0dc686f05ab67f04b30a458a43c40f7c154fafb177d601918ca7168cf174e2f09f64d3a11aeba33eabce106b1f3c682f4d521956966be5da08e2886603a990ab3cb3828898534a737cb8bafe321592c5ca27a3023a876655318c4255064dc528e8f43d70ca6905f8561d1cc5158967bc8c398d0c5c0a59af004751ee49c8c8472a83046fcd19cf9181055a49cc1c106e4a118011781bf2613c696a2229979bb0a04ef2c6b8075b77b8806f4ed528dc5120bb81a0dfb8b45b08119f3c9815601ed251188bc722f941028ba07eb3921163b97aeef22cb23b673f09b51d167274871979312dc47594f6165aaa26bd907c7bf5b81aea010a0e834360f8b5d7e0a38aaa88ce1bcaa132bbb109a412b75811331e62d83d1beba0c72956e8dc8ec1707242aca395254ff1d1b83657a42cbaaac660b5fe5a1bf84c4f99008a89b95f2a88bcd76778ffb9af1da30d9fab938c06b27f60497084c2295abe41eac5ec747469a0a2b6c90f3b89bc9212891212c8a37b578f064d5da750b7415db3a63d9c78241aa89b08725239f95a588a915f59b3999a7d4b9c6975f4b154330a9ce91f91f54df9c33627fa17138c982c622e8875b822e523fa93230b6b25495a3f0c3a0ba32bc438e97ac1f6c9cf0145d1086711829dec59a4bb9390921394ba1760306c1f718cb3f69369ac67b0e9080477b889842a4ad4a977c1b7ce9060516fb3b3cc178bfafc2efebb7eb68896d2e494ce9a3b137b780e351a00707321e32bd9ca44c799401e9c5ec390b83bf72be17903a2ca0a6c057bfe8994b9a96ee905571056543fc8c4db0478c54a4b96ea4309431402841fc18b86711ba40ca8645053059ec853b8f8a5315234deb2a7b3e162815b6d73e0a7c83b367c0b1c5a1b0b6cbbb2ffa63bb5f4bc029c5aac61c06f378355a5c842585b95d87c26458efe43666f99340c08cbd67c9dde421ba2b6aee8e25c59868e4e43679723067ae95f8b910defcb71c7ea5e1dfbaa8da9a6ae319924411ddb7572da8178ddc0959f353f173c9b8cb178eff663e3f74a85055f834961de78b160cc94142a7710545e013079aea48e458b0b9f66133001307d70137361b4c6581ba2952176650a49c336a80bcbe5d1afb577bf996908a2bb324ca184000c7f37d323e4018fd3d089e13a9736863cbf238d97e594e63b17ca949e34c69d128a228668017d40392d5b3a03847f49e30e0bb232b4a34855b8685f6046ed54b122d254940230cf3b4b2caa26f6039e3372531097578749a35a39873f2c1fe3883d9f0a6cb14512943530ce3ca87bcc77281b6735c1689069c7d69baa3fe07fd803cfab86c5bee2a0676b7cca07a7904714561340ef975626d90abff99007d28fe303014528a3283a2e72364a4f400e350a3d64f928a9f00b3c7b654c17acef845bde08528e09595e4bb2f1911628e3be9193ae26c08fb14953ddb18af142227fb7882744b903f5861ddc98194a8af763c2a763156136646bba8ca491308d8969e6b2af25922b0afb53c653a2d14b8ff7d158bf8245a4663814520eca7608bc404e58515e4128910b1936a7b28a4b3261eb6ba511ababd33515c4410dd67492e3da3811aaa1dca011b5909cde5c1a02f960cc6142485b12c8b8a721b073f2882a043cae7a9a57357a52ed07aa8cc94b968629d8ac4a896c0d4f2a6e34c973095c3b1b932775ba5a25c41292a4bf0b996035f9cedf4cb8e5e45e6eaa17665c77427791073879e2d08186b33b5d8a773661604591236fa00bd5f1c679a2a2b67c274786b5cde29bc6214f9ce3ca04e3cfb0876b857b5d91e537ce3c63ef4498ff4c90a280a6ea1b3b227983df9c5d6723696b2243cd27ca2d1413cfd871ac64b083e11dc9114872fc3378b0478c3c489162b6e947b3f8010ec554428cca4b17c09924f5501a380d11818b4e00c9892c87cc765285b72eefbc44ff355a09b65f34c51c48b81d2eba1435f40401e36e473c6221c64e70b91cdba7525cd401ac1785aca80f2a1438ea8906a0458c543c45e0348baf6a6e4d24b127370f89b016e2a433c787ae131b56846b4a687ba905c644a993430d857c15b93e1f1b1db8f4881a1a47e437689f77392a730bac213146352319bbb254017eeed01a004d44d0ab4064f255a8791a7fd6c7f5aa8aeea26bff6b258b240108d852ed11a2922b08e7aba53a714b0a3bafee78236768666d851d567aaa5f61a773f5cc4fd4812be2989ad06af4a17899f9ca247a88b7021f94448a10142b1c1c851abc833ec5671ba92665081490aac3866669b4457c29227f62525b4df59b92f91fc429b652228ec5b409ef1878e1a4505884bfc199b1bc95b940f802a20319b221787a10c07239336756bb237b3cb0cab9b5467afc947d625c50751418479aa7e3418896644279db440ff20639d65f88b257f114891d11b7d6bb8c0971a0e2ca48bd95c087a57f9b0223b749286f4b1d95b49cacf65068b6b4b8c2497a4c7cad84274504c60743badf4ac452a8bf6191421ecb8b799234dca8499508b9c10427c6ba0adca91905821db7443ef612b8adfb8106486fa6942d4a1117fdea898dd1b93b46c3d56cc6c8ec7a807b776f832e8bfb24f4ea41d98a28eb7746e7708078c46479d752ca863922aa5e847355c7349e27f61dc02915d15389345c297cc91a955037c3c2313be35244d8c2534c22d9450fb5231ffec6654ec278604b364daa2a81c0baea553f047b85b3410aab6a7208b1baa6b0a261d7480a90abdb429145041386d080770a0200410fe4b868b93c7eecc033920a556b9bc3049aafc7da6a1002bbc7e89c5921b2a2811bcc91c2a1521a2c817764c7c3bfec9113415567ecca7fb317196aabbf8a34b77b8b94a131e042219f199b3e38c32a3c3edc7c093ffcb93f73860a0a3df05b30eee01f06454f38ba0a4d68299c5b8a5c6a3a207cb81ce1c3740681d1339680526600cc18996c4a1a545373d1201cd561c183c841a36a5aa0659df1c3dfb89b996c3e65b102b69a58f40123a955aacc616a010c6e9b54585ab95eeae1cae99161c5cb6cf5c1b39d0742fb862dba3b8f2b2629f9d077eb8a74843a119143aeb990b0f181c090eca10c214b59874bb2b32e4c29514acc041a6ca3b29b4d9c36bbb1ab35156abcc489cb55571f9e4771bd1084b841982ce574297b53e7f312cbc59d1a9717a2eb0901b32e088ba3fc624e741932b15654c7e9183ae6042a93151a9684dd1220365c8bf57640a5b52e1956056422ccd63ac3c3c72e994371c698bb4d14147345a2f876cc71069c582b41ad4c554b10a22e85318a319f5437be413255862b836835916a632c7a6a9f5b236a0e7c9567faa75ed2a5f69bc1f4754eeeb9b834da0c4d25b365922023b526f3ab8686d412d8334f85e2b0e10a9b2eca859c019e8b683628a14028f2b40ab918794c9b20a81b85964e0d583ab6054c45272a3ec849371232a82b4960f9661d92b03c00b42bd39cdcb22e202641a555457ba7558d6c60c471baa3d5681079689153a0f51a6f3bf5a417444dc3734499f943b2977e4e4429763b6fdf7c500741ce13b8c7c1db833380931a3ac6061039f94690dbd05b0f92389604b79542ba42b73864bc8e31c50455190b7bf191875456ec4379abe0c72034194ad5cdbb1a3aa2337e41b116c20209c7c33083914015031d320c86c3962ed0bc3ca6c44e6c1b0b43f67322e61b8204835780c8e9082f1ba5bfa4433c94eaa4fdc043fe2390c8d17718684e3c5c393df54a3a8a8f118c30c7a3198ce96bdf917de4584ceb2b886072016c958b47f530ddd1031e85b044e523895c332ff006b0776a6820c199043152d96c4ddb277b281194c763f4c78c8e782d673c7fec6b08856868c6015b02a0976154be400849364c262f2c4bcab386d81cb65904016895711aa79cd3604cb940acf8635b131555a26c23bdf13d62f10e293ccdf96c56d8e63c3e28320aa93020e2276b35555baa25895caefd86cf458506cbabbca430b1803b3b42e4ca0edc8ac7e52ba9843e5356c870657afa990dcf20718db61c1e63ba8966cfbc4c19ab925264265e1b26a6cd065530c19658600cfac17a57a3039a4a2ea602cc72e885ce3b1a6d53af66fc1d3c1cbe80420a3fb16aa509cf0ca406d50c1f746c941ff262cd5c420d57902e985231cb2675e3364e116eaba3987d940c6a089e8173772f007caddc8ae91ca2d5b23eb5e7cb936a417ec028df7308ffa00dbcd6066a0612291389733bcee83ca5cb8c47941c70ab155b48b394c3a49171da4a0be3b1a2495e8afea17b07b5bd953d85e6c118eceea4458f5d18ef7c0f64bf902b0a6c59462f53c64dcaaa7af1fac8f7cdd452889680dfe41254c03f94cfaf3e9849f9bdeeef3d88f92e6d31c6745adcd2a1ef162fef80fdbe3666449a003d7e +ciphertext: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010020001001002002084004200000400400820040002002080104008018400000801040002080180000208010010420000801040082184104200208010020020801002002000004200018010400020041002000100004000210000420020000002002000004000210000020000801040082100104208018010020020041040002000104000218000000021801000080000000200208010400001040042080104 +result: pass +shared_secret: a935f71eae79fc9629cf51d8f873054e4329afc1486047270f23739a80fd8c63 + +# Rho leads to frequent rejection on matrix expansion +private_key: 00208080e8b3938b09aab715a0b7a09314c3d2aa03e900528a209c655886bf0180a0775a1ee133e543c17d7c24407131f0b813a9287c5c9939d43ba2c1f064015c1babc910d1024bfb46a3fbb1ae13dc5d8bb4576787a592495786a53d4c172cbd3b2cac6a2f5ab68fcfeb2a67a997d809800615c043e4bcc0985de9d671e6e0c8b071a20264c457c13b1f4734f234142e86c23170821d068210b29358694d8ff27e89c59264a315b6591d97d90ede633b68fbc36ca96b823a4bc66144b541cc118b0d60a66c89124d9080ae30f44b9f4793cfac65ab8b8cd65ac81cd95de566ca2c19906a955a04047052a699e8a132e2e48aab916278c49ccd1ca0076b5254784a23f7a8c164229bdb9b46e1c7bd4c74639053cad5226c598918687fbc50323f086238366c4ad9172346626b54ce142053de67ce8867cf599587d0a47aff0a7fc113140c18c40bb31e2340822cac294aeb3a02652b424ac9f1008a592ccf70170246e689edeab03dc0249ba59fcc6477fb668038443bf9a743255310df11b4c90a97bd212a74d5142bc6461a135ce7376995372a1bf919e3db20f22c683f488395a95e31ab13aa707c59f22e85d892830bb550395633f6c87df28401865106b5cffb75729391767522ac236072250c6f4dda196a90bbdfa183113c5fe2e31ba1187b4f682399f3c6c0288977904ab445c0c1b9caca030aa639b35029657c1608e3a654cbc39f8f096414d278059a6f56c8c838b1879b00ceff668190213eb15184a57706bd8c9111667f52a656d161bcb5e7cb8ef5beb6756371ba4297397eb6d0c850aac1e01025001b71a874a25e3ac16450228dc33691b3112de319f69ac29f2a1cdf02a0cd77319931003910331a6268f42669f4a90e79bb820e5c98aa252dcbd056318a050ab71f5d60028fc41594688cea4a95b32529c39c582ae828016644faf4b7b1fa6fd9c305807c43dbba54d44273669bcf956c197ea3462a30be3aabb1a6654dc4a72bbae53982ebb986e249d9438d66b65fa15b723267ce1fc1200bc26656d7c4e1839e02927a96304460a34a9c0a22ccf15c7390afed4a612ef236f9d00c22d04cc1dc362c08afd0a16536985f69f6a15d6585c410ac7a39599c683b9e67a33ee299a5000c7e4acde611bd6c817b1aeb1373835a245b916620be6ce8093f88635cfb619a963c99785cc5c354e5d025f954071e380876408fc5ac7fbbeb4c532b1f1be67ebfacac4cf907be9485c6da8da380809ee102af0c98beebb088c13d29830e7fca4dab8c1e8cc87a3b4198c50686c82626c41414d50878f403c10ac905f39a901405b93366a575338ed7d66c0a27c9dbc4af2d217688dc3909db8878000af307a989234174363f3cc35c25a42d7361ccadeca25a484a01967be2a65bf4998d57943759528d54e498ab18514a5665b87c98339c3fc01baaa2953abc1aba78778b26d54bdb2ab69dd705d6953dea404adf8c82d29b932e144f48a2661dc2129e6a2a1bc5242552374a504e0d135e6cfc9fb91a492e443c608c6e5342361aa8205ac744ecf974b667a6528938b6085492298e97ea827d5a4274ca359a1811c71a574dc986f4262b2e29256c4b52c9a22c3f168988ccca62e0b7d8cc8d1d861dd052bd9bb622cd8b769551c2307c82aedc92accc3d2c67c3ecf8341290af6c93a295fc027895809a081aaaf3cd0131174c8605c7fc29ece47036866f7fc326f7c947f70852356410e22700b5480897f288dba24c494685ecfbb624bc189dca10d9307595969145b21ef4ca1c435b3d39555434e133f8ec8c00dc49f02788041a6deae40ad5c9a3198804fde6230dc25b7f86a86bc00b43da73b5b40e3943096fa4540a019817881b4421961e293250056300e273f3d87153765ec237a79a16ba89a960fe42aa887c65fae65719766c44b2b8a0e54e97aab5febb1c194939e11928258cbcad6281cd37ad6033b1c9982df721200e36cb70326403422519f3afc3451af15969c2b26957c452fb136db18357516617892214c758cd9b556a827434c9510a5f6094bd32c8633966eb113f9e4902b6306c87732b96542979159ab49a170fe71a23093c1aca70202287d8288fc2f56072ec7aefa293015b6a58a2899ed79d4a09701ba42d26c599d8a2164204563fb90ff7372e1ef7040c4b37bda74af8a45652510df4d67b7c618279d2844b10815913914c392a4119911d2b40da79b882534a6daa1b3b8679eeca4ef2b57bd48507b994a950b98865103cbda9b6fd38ac82b64859863864ea023fa6990f0898a8d3ba8a947fe859934ab06ad545133f57a3c692c19058a07fdab3f0daba0bb7846ef3222ad4bf62d995a7bc4801e5114b5c131130c58f76bb858abd1303003461442d64762cd5ce3421b52f492ed5660a4d632af3d24b9b5a1af291323429896fda2e21494e5630502aacc91bacc2902880c99890f259c1b9fa01e7a716a0a3a0707581acc347622369a4e610a1336047f3429ec16e7cc97607a11ff59473b5191e04586c1b32cf82da6816e47c72d7344e84a0d6cc42099781e5837eb6ba878e489172c41b4e2c3d0370874c0bb939c485a05851cf351652f82f1ba0a50fb235a6f10f98655cf2cbbf1c21acf999ad24f77ebed4297425b59072ccd1b6aa6467874eb014b3c911a0a9430cc86cca1aba84cbc709824a5f3abdf7f927d8f9a8c5d6cb955661fc7bafdec7cffd720fedf95353b01743613faff9b4c94c80472894c2322f641240b0d60549e4a405e9a20c0b794151a63a598e26eb021e1717723bbba58302096b563ea4217a8863350a7a729b0c1f8486a8faa7379a41515103f59b773be06a6b3b01ebdc67cff93147279f861114f97c3b9e7abebda5a51ed4518c6a20e679cf2a48b8bb354095b3ba14d07f3a61c18964cfad11b6b814b50c07bd2c6aa38c6c4b20d47778aa5c82fc575bf02b8967ac79fb9c1354bb1df83af95a839015c32f8b4387795038720c53f1780c6a5a42d828ea42264e55594732419e450afe13ba956581465a686a1659bdb21bb2083424d19fb0682687ab005f1111c4a43205db0633d301665c635dc016ba2762360474e728362ba46b52b54475140fbdbbc491ec5141e7947ba42053c4b63dd1032d8b8d3fa2c593322e5509c01a1584759892a910581fe6bc16b935a5931627b67e77247df0d3c77b94190920aea31c093a1a9146f75e51f07d45a607c7f4c38a5a23a3198cbaea7baabac8e70721b80596c015285f20ce45c9bc86d67a1942c139c9acac70bcfb7a1f0b993c7d145b4a03be0a86ba201647d7831c6d960420fb517ae68f3dcab3c5651f49d221037283aa4711bc3973ecdcb7c030c24b084ccb850f91d35e78e381970a948e376d4bd7b670086542a61be4c670aab7257fc58dad24a3afa727dff967cab9088587385ca15209c18e06b68ab8c66db7d680fe40677f8a0d6edb9d34b4b1901ba729338a7bb90f98ccc61676934d8b87d7ba15170017e9247a6445236512aaf23a6ccc629e2a2a7d748b0a67b2c64cb61aa549b7befbaef6ba45e0b6c3a72270de5497f6ea95059238d0d28aebf1cb4f209c24c8b83f19368c495ee05638f45b7002c12a23013f24721501d6aaa6c337af9185d8b733464229a8aab8eeb50f8fc5b4d9880897d3128387aae8ba6e2c116a63b5434be0503b77903f98a7efa5b919c4a86f39671a477c4569acaa07b316d8402a1580df17736056acb05379cbc1228aebb671f7ceb2a977e4f04ba363538c4c28f5a585d712453556b4cc74894740b73c5882bab36f96c27dca7caa815331ad4425cbc732ee3a56db445dec2cb7b3c5444e95bf796b3e69999867307af7c716aabca5854a2118eb78e92c9e1da4209ae0c7d61a0920e58f50f62aa4321d541a8ce7d74f456abf09b293f7da5d1549ab0d34044a624cd51c5ff3774101fc4e77cc76a0f3a1224c3ca2d42f92ac6a23862dc2539dadcb396dfc41e73996497879d8c396c3657c379acfac04a652fc4c32aac57e0368ef606bab471e52495369d7c616d3a3d01b668c7a0f0c305efea09a2d01b602c4a2ee47027b0c5f18994c3e369c7b985832a48372fa6af929605b0c1806539a0dbb2b1eaa674ab8720b9381688b18e5136330e303f0b4a9d6b5138a07cc372431c8958260c91c655551b35538860acac1f047905cbec0623bf9c33968583355822dd563af7b71a39113b3024074f865ba8073b412672eececcf8af0669413655c318bc5684e7a655e370840c59666ed8a6884c05060072fd2c0bde6f39c22c1348200855a66aac2155cc13233538aae893abbc3cb4bd2c87ca6f78c49691829a6cf40d7000000000000000000000000000000000000000000000000000000ceb5bdac24ea7f4ad6d89754c2feebb5ef0ac07688d8dd5ce8d9a2c87b213f0011536217ef54eccc82ada15ed86ba2003e177f270bb5aeee52f9436e31a379d2 +ciphertext: 3c14f18e865f367b72dddbccd6c535fc2945bab3799b9edf5dd5da57f28a74aec23c5113f792f0a92e096f9c7af548e96c6a4157de843eaa0a0089e25b8f85ff44187a662845fb8cab374c143f4f96c6482ce7cb7cbf8f27e06dc50e0783568652043c45767295f860e63093d53213c808692d0bdfd10392bab65bac43979fbc5aaf04c824df2383154bdc30362c28d0fdc353f4f18bec2620a906426f744d717f04cf108aa91c82028ae847bdd5e66eea3ec0e719cd1a3f0d36965a8e2a1a03bf4233edfc4b5cfc7fdd8ec969037b3f02404e3bc3933ee3c2e910d86476d9b7667772ac75ea46e181e95b9a3157c3420ccffb064de3ffb32c1c855040eac8cbc15c9ae7ca1aef4c442eb54c3e574c9155474e93a14a5295f66e9ff6292dea202b9bb4738d7280128057586e0a9635459119df84bbfb083f0545d4d8387ce9a502f2c3addf0a7968fad11284277478dea0b29c96b364ea62ae83825011f1ccc6cd7a58026a4250e76696b836bc06f83e74e528d216f474dee938e78534fe21423cea6f843a70096f83e144208700d156261c091782fe8787b32848ab55390e1968370203e59a9a53b1c48a6a449a55ae997d5f222712f4f674991e8a4cbb62b67479b56933c290f701483d2dff855797323f19c06e692940fa32c9c2964f700b4147e23dba5313ac247ee26ca05d147e469b6e870651878328c79fe28158e29a6c41ec48356de5c2374c2d7ca435330264fba31bd9c1c85be3afcd456b3345a669577c996062026108891b8cdd099d91e3c662fcd1a2f28abf1567b519ffeb46e9580ad17a5b13c9c52c544fad1648495b77394232ebaf7e26c57fedc43bffd6021fa165e526627a80761207ea3ef172e8a26bd65bf51ae6ab9071c61c17b19d02e66ed12fdb851adccfb9ce73ea98839f96ce0eb6e1bdcceb752d7c5ac5d6c4bf6c56258048a21208fa289dd517511a5849899ac33d50e1e94fddbcca5987324230ecaf242497be400d80541101793f8fa5bd896bccec92e425bc63500305d69a226a165d070545fc2277a9faf16c5b004aa8c7e8c3147890cd2ab0847afffd4026ca76cc6b5d6c9aefec6fb1b21794e37c56aaece2cee1881ce64c9941f904c6e0143f0332c5b0b9ef7fa394070b73a62b2f811ad53524fbf9a038f185daa3546715acfd63c95594a7f18924c3da980d8996885b04cf7944477b2b9b1d939e81d14f84b129f76046a6d78482ff8debf21315f412c234cb776f529829e07ddd89806e343112d82ae23b90657ebadbb1fb7999c868b52f907b7f8aa131dd334a5332b4b2d8fa664e18edbd89b4596e34eb631cec9e81dfb44fded66b9f236add78150415c3feea074e34b43284765274defae58471f27a889c641069b436ecaeace548b03e95cbea4a424611b79c0a26502808b8e35a1b285163db948692afb29d94367eb43ae5df88467e4cbfa92f0f4b5388a975026c5cf0ad2b8d10c53f3eb5d6d94e5082302e8780e5a7dbe4eeb7061c02f4a46d6611f6599fdf2121bafb38789cc789f2e1730ba6be17caf12d5deed32f731126b3a75f33b86498e1c739db09c3fa2a97fd77a16ce0d6947e5c69120e1490b75cecf695390255938c9f884cb0248082b36ba19580130dbd292b34bed650c4eeadcdf15685ed27b6c23edf7d218bf7d98dfb3018fd7e14e68242554250886dcb6a0496220f8b4c4aed6c87dbdcf62b47bd8c07f6347773937e0bd0680e7e0d62720947ce2a2bdead1919ea3859bb01e341b814dd13615711afb12320cd914dbc97f6767c5d0d69f0e38b46e4bf3b132466bcd89ba1ae98144874c28bf476702975d3afc17fe4bb1dec671b85111e5f1e359c15d6b0421935e26a5d4eac269b64d122f9419a9fa0fd5d239fb20fa31192ba2acfac52c92cf5f339aa80c3e5a2a4ece0b077d5114df54349cc8f2b6daff625d347f5fa60a37913a1402bbf9790eed6ae5b67b87e076479ed1abb258d6a7e91ba07786d819ee869f5ac216341535995799e492911a9b077be49ab3538d3a52fe14e19b6a0d6af2a7df2cb1e5904a3941b079489f574e066f6c565828d2a312573fb6e90ea67a7747c8b55b1f117482c77022b38ccee1a397d82f272166b66af0ab67b631b2dc891e2ce4404e6446563489077873674ef477e9da7d37926489ef60b5a028e8b6ddc871bf5c224be846b9299f02b82c8dbead01d +result: pass +shared_secret: deafeb0bf0d0634e5acaa34966e58df8b9bb63b376e3409db49b4b117643fdc9 + +# Rho leads to frequent rejection on matrix expansion +private_key: c5f6c739c640b093956cfb9d54272b3c704d3b364ff1c68510b875c8c29f30051b5f60b53f6341082252746b8d4eb52b3f77c818d42ac776ad393072d458a28b186da2b61cf64bc6d8b424afb49a3b2528d4863c876aac69b7c7fa95314dd36ab5f021ba8c575ca458c469409b71b31f3a8e371937405067951c084b6a832ab321642c82f33395b0701e5a677c3c783a47d7a6e474af454c1b31b174ce5285e90608e1932493e44bf48b921d6a58b1b86ec2a38b8ba2a1fe884c0fd608af3986270391d1a42843637d75194722d31bc81b2b507ccc0fdb309e59549a874d09239bec5a41c4e9bb48d6968152ac9d431cc3b290371296b8056ed56898b272b948e556926478291cb0eb1bac50b6718e98b74a1777e685b7b6d7cd6b22bb5846c69149b4e7b292a4153763b768cd5a67b65c3d059464ccc123ac086f9f41c3395a56ff3152fe149d76ac2fee2079653326bdd82dd6f66b6687a7fbe00d9832b09135756c5819b1f66dc44c7b32c2496f63cf077ab51b8626d0918030134b8384c565f0715167b21fab697e84c6838a71176748f12334078c27dda3133bd44abd69bf631badb5f2664f2857c033102ce8284e4b2beb9095cbb40587bbbf457054f4d11bf938af207c1cdc5217b0e9797bf9ac88f3943873c8b66883d2ba5ec7e6696d50a69ba55457853bc526819f1a6fe09973fbd19832312b554653b8441e5eb01884e94a355732e3da645eb849f520bb2bb4327d560612852152f8cba2f77db8d21922da08e60bb9e3b39b9b85bbeb9b1715982d292b8f1017cd3e60447278cc0257898575a0eab1408122bb3fba17b62a31902a567a0821d42086aa6417c259a1dbc93b25003fcdec9f6a5507b4b732a43c444c5825a05119cd089fb2e569f70b4d5e6919faf15d6eea641f5a2875763f42b3991f7c89fe473cc057c148ac58b6c88dce537da8632c10ac851f8916fb7b6ce89ba5053b8d95d29ea5d36c91981042c4aa1330aa098a6ab256ade08592a05c95021606adea0ab637824214009c2b915be450a1f7434ea2c7f562a4fe21139c2652ca8785af3208f4927abae698dd435e90e7474556af9b907f6d73c4ee64897dc74c6a876eba1b598e784b8094232dc62bf1119ef764bd1a3bb2d4fc7de069273a223abe5269a1403873087906db164b58435ef41d7d78b36087062419123c8b1d54da918f34920d3302ddaa300797b32c1c81b82798e421ab2589964334714a75cc84548031d5810fd87890a1932c98bad37c860bb15663cc0e91880af1947b8a26be9183b648b714f763b81652786682c210301852776aa673a1fde470afb56eb0b0114895638c609d8d55585d68c165f7aad64c1406a165788c3364667f0a3c65aa300fc4585e959abbc5e1b316aa108a1cbf703965a74475147a2d323b7295d185571000e43b9120b76fb0105ee7a385965026e8f8309d4badef88b433a59090f88bc4eb4ee2f6c1f0d880057b477e628bc35b023a4c9ab682822556afeb32b6c9088e35c107e2a43506c43a986a0420f5164167519c4029b47bc81e93c1ec149e6083b13589bd2a9c64fc6247ec323b8cb73cb9f9ccfb8bcf25617a87a3c2d8b5158ac8661dfc789e92cc8cb39ba3237b6f13c80ef947630578d2d213f1914f94c61429bcaea77c646f1b99d35ac8009907ccf604c1211ddaeccc2f1001b49776df94560e5ac35e0a7ee3f39377e252d83558d6e57651b0b3c0365e6a133dbe3002270a0bfdc524e5d298b42c1408e17d155c82d69c256f78a69937843491153ec2117ac40370934d28783a69d0a02526afaa8600d289c27e9481cb737cdc4b9ddf53caf313b3c4b862b08045dc38428b126622d77ff3864fa93919427b049786042d234429e9858ce7b1d57a2fe92979851b9d4ca23fa7a80aa4738c9b777020b857b8fa2e442522423608d51b78c574569b9746e441bed403ac21391fe327818dc81355bcb2f5758320965e10946cda9a7c1d329f7c1720857c8751e57b87186e8dc21199e3b7ffc1c4c5607cc3c258a30163131c5db5d96e2e8c2f209419d5a03dfc618a53b1799cf102348b89ba289fab2b206f61688fd974023619fa5187b8cb28be778b666294bf029d7fa9abe3ea739f131930a13629bb6fa7221a788591f595911d3c8a6625a032f393adec83a1bc0379bc0fc42015610c1e8fec7878cbaf623959a22008ebc81ccd02b0847a7318b414f1ac47ab2b0dd88049c1047e4331767f3847bef0750ac4623696bed9c2162d2b84e0b4b606180a6d2b6dbb5190bc3c6a51780de86071ce2a0f05758e199983ffe8349c036d6667870296c76930b34260af449b2a6795b4fbeb3309f017e9f820c145716a91569057a22b44bc38b368fbe221e1f92d0d5430913580f534b8373aa760d47a0ebb6bcda55b5cb62797b819cd185ea798a1b9e21391381173d2a416eb98db74895085ce31c868f52a2f7654b3779a0a324126c1b3aeb73c073deb19e7925126aac8d87bb09ca69b68dc4fb17bafe16a4315677d57d0c36e9479fb03a30609b7456aa8e8b76c97100728c46ac8f39588f7062c1b27fbd12f4c9bcf95f24f1a698da0e78ff1f4481691068ca7070d341dd519c63815a2fe3286155c741e20a3bd8c89ee6bb069bb89b7aa1b1c4b4ac85699ca2c786d8305cf1c4527979442fb4f3823c7dc887abaf866fd1b20a9933707c23036e653ed99476c242c791744cba152f45040f6bc3414a13dd8670327d50e446a22b07a42bc056a95c94d911356e276cc95d585aeb25f061b87da78550805af57414cec34083be60f6e7b0ddd1a9c60f5725681bb70db9390014df9dbc5e022b4c24563efbc2b32604aa41225d9993f924cceea9c0196a8065237cb47035142b0693d090e6ef48ce85aa33b57c9bbd4c1dcf4b8314162e0f9b44e01732d6cb7876559096620e974cdfc263adfa1c8d94ab6080cbd42fc1a585009662640eed3353117017e754db4cc0901f3c18e6452667312386b8bc27c32cdd9c11c14403d390f80f121c02500a1d03942c0aaf56a83f3f062ebc708003d7deac3a47f33ce9463381b19818cb97c8d61c320da588105651f5496b2d38615a5929e50234a54393814311b52b678ea8b50e3ac47c30ab2f99998a481602b4aa701384ed347878b85b8bc108eb90bda44423e620613e223ea6a03708493b7013be2b926daf33fe3d81fbd9795a885accd8b4ce3ba33ea57bf04530afae5643bbb4b22981ff5b097e68c5615b70b4213b3feb020e968734ed33b6ed87cbf5468c5f055a1dacdbb9b19d2a057a6fc371d389ff6084fecfcab2f0bb66d0931ce29afd098ccc4020af50275fd5600f3b31c063174cf5a63363752cf5612f121bcf549993132c71dc5c4835c396f2436a70092244c82b5497209b779786b3a399237e0a7237e550e0d784f1258c540ea91bb99c915f052fc8164b6c1b88058242f7b13a98cbbe1646274105f330ad0377ac65e6acf89987979d44bcff381620335ef93b9f7698527f2c55a39a4858812e9cc8c99aba640c7915bb1475ae172bbd2251fb2695b842d27f688e1e23f607905bd347c83db7376706f68ccb72c94519e426840b412944c7181f72f98a56c0c5ba302ec728b31a43d6418984c47dc0276bc3cb6c2817e658ba9acfaaa1017659d10beeee7a399e6049dc62f5795558c082f273949d9f82cab2c3977359f510394720cb9815c240ed64ad4f4c4b27057da3abc1486942d01c5852658a267ac18e886c410031bd9aff0950165b53e53cb28b21172b1866d2dd16f9cb59c9bfc8aac8606bfbc2a0861a9c7f62d3d41074e56a73615085b9053fd2ca533470c06970c4c6a097d0b4661c2b001e9bad5238392b811a1276ed0a65493080e94b7813d9baa3c05c9f7820f77e4af8891170a6ab302e23287932b82364fbf5abdb4f2716e5b74705b0756eb6e3b1ab9f96707ffa05d3afb29dff48a004b86bcc784ea003727a49c072cb3cc6cbc4473c40965b5f76670d8cc1a9fd3c4982662b8fc2d9e982debac25d891217dd24f798346b2ec770c427f49ba4452a1c8d49b9089e751931bccb07557db36bbc13225590cc94586058c3c1ba406633e650f703a44aef3c305f652a4f4c785b02eeb40cab763731a7c20d062125a24b2bc58ae6c4a0aa4e4c5a330cfff7a46bac4ca58a33127a8bea7d5598b29c49366cd11cb4d60d71c0d08cad7145216a8878d6c346a32a948b52300c8448d55a532877daffa805320bba26a9f6197a08f71b4f9210cdd9c3416263f5b921191084b87236649a02e9f0a20f09004bee065485088430924326353ad90077ff0a10fd3c077111e909e000000000000000000000000000000000000000000000000000000685787f0aef0813a97602f4a313fcf54eb7464005d6b50ede43e1b99eece8efd2e8541047591efe1847559704339d0ddba611d0ff8017cdc84e61184715c93e2 +ciphertext: bf6a1a4a5905e3b6bf5d5fff91790e56f6152e31289585d4209cc364cfda745e4da6ab9baf213a75f7f6ae50b4570298035dd17a7108ccb8a5f511a0377562eb37eedc3426e5ceeb793eeceeb5f3ca4935c68d352c6b1ae2bff892c04de562dc2197cec88133bd7384679a1c7cdf80a43aec446e60c8690c50207e54d1d6771bd41ca54654b835cec7bab1efdd6c0417d06cd74ee851c4b0cbff894dd245ea33bfe28adffbd0ec8cf6b34148c6a8126b988f83f5517125b998859abfbf4e9eec1afba438faf25238657d0b9a370df6445dd9527e85502ceffb25e13fe6cd8108475f56252a148ca7d11dff8e83c760a239da62f994dfe5a4d409feba83005402252491e87b5d585168dbe6c4f9b257bbdf7797526a208dd05687e2d8176655848e9f171d6fa63791b02e6508a58f70f461c5de34ca3713c1c0b0b280db1d493ee5103e768ae38482a38692425f05d91b496b47743f28a12d34cf26a7ce164bea186549cd4eb1e0e9558902aa1b63fe90b3b5a1ae952676d37395e64c873f042022c7c9fffe06e875a7828af940e0c4bd0ecff75d8154be5bb5d3dca963f35b0d5d45020c4e793c4f895983a71a1f48d8a6a03cd58f570f56eb3affe3514f89e46dc9a91cc466da782e976aaee83773a481788cf872ce552fc56399fbc8f802303a5e8a0215fa3822d21393d268a15e617edbb9de328ad2d92633fbac21f5efee93588b8f8789aee93019e61602374bf84e004174aec2a98939d3fa29462db61e3cc1acf68606802fe312336e72ecf9faa23177235d7fb3b00b5c8639ef16af505f42943c3c3b8bf0b1118ee78dc8143fc74d178b4db2e4eed82cb21930e67d5fe265e2c095aba86991fd378f5bee637e0a6e283440d57b11cd6e44dbc55e06a574fe959d946b54619091a4a0ea394e5d00c707bb11595773241b23731cc741bbe253369555934daacb06492991e8e5238344e75c7b3b6d85cff5683a75995216228922bbc0e5932bdde90486569d60decd6dda4cb4e8961a1beb45e8e0dda5fe91c2ac9e709f4585f4ccb56d89979767cabfe7ad88094bc975388840c55c8379ead9374b5b368ac51fa7ea08fed2519209ba78dba663a6c2d352bb9aea6bd24131178c52d4a0e161496c758fb8a451001292b56f69180c18aa5afd1a6c0bc1c141aa68fbb9b74a75f893036f3ee4b65eac6a9a67694d8473db851fe78d0ed544e2927c9cdaa0e8187389cc0a15612b1ac53c59ca1deac4cfd6a3944b7df446a0121dc81fa7ada3660e27f6c2f65311f9e2e9a1f97545a8b3c6e226ce547a3d9d283cf37338c07e2f426e7017a6a513fd104b88cb8b9a92cef6a1aee3f12f258a5d059318830a6d842563134e896d577adcd229548396e5b1d3a1bf80b49c064cbc20f22eac0a2f3da972c580a92b293d99b820888ac9b3c50f0c16ca80147e5e73694da824b0e1e1cfc771773727744822e933d2631b1376bdd88f37d124bb6776b83c5918ec63c48c8b339b62d1e487cefccbc8e9f3276d1c29f448c5c37b33a2442f096286e64b90dee751a6de0f50197805a6db4bf77a845df7770dd34a44ad0344caf560c77e7edc655604a4d42e591842022d64c1ae605c749479ba401a31867b4a11b978ad690b4c2a7cb6d0ea262e15ddae9025b522312e08bbad67038b4c2e272bacd18ecc2317410901ed69b6b9f03a6d5575efe5a9c08463ccee314a522fb24163630f888c9eef18539e5a088e80f4604612515dff0e0bce97e9788d70d148431e8eb9cd49f52a42e21e36c392dab9aa3f3c80e6e8f812d18be435a1b073f9c346856446dc5144f5e6776704342cc877b6bbbdb01cae23a579f5238241988a9ddf5cc7f2bf64265b465fe34d911c10265cf7d2208e526d51467de5fc1dff6228d771b643f4e31ac9edd95929eb89c98a3849a34a8672660f8464c42d6566d5ced7639c2f2165d505c7eefe844649a605a3622e60569676a41cd7db48ac0fc624c1cdfbd8e1f07ec14519023b068dd1e58e720d53e61560b1d00f7a1b0f59c20139874c4d0c35004b5477cf5b3880a95864eed75de14c8be43a52cd46d6e4e510058e58d80096a243e191471abdf0f2ed4d7d61ec97ca4b7d2658294a15cbd40414ff3e185a809522ace539bcb806881019930bdab728fa2f2d773f7997db7aae3927500a4a9b9508d199fc622bf62f445fb0c0df9e50e34a833c0a +result: pass +shared_secret: 5a9c3568ee557530a57078310ff6452b09049f55f30df0704f9607674971e033 + +# Rho leads to frequent rejection on matrix expansion +private_key: ea53a046a53b7e3298d588b38c403e67b5620c5c73a438ab7357660362ab3822b5e774a9dae973c83a96db79b550dc176f9b0182d37f12118bc96a4982249a352219a110704e4a0ddbe545e4f55cfc2c50d54cac33ecb6fcbb3ac2a7bd4e41282476797a3c24f4ac4f60c33da281cb1313035c9c804d755267894d867469dbfac7be52a34f55c0dc642354e52967b043a0e0167c806581b51519e04af675147578c79f492da3ac0748352c6e5c7ff462008cb42e9817155444b214c3b93ff3ae7d44b5c2b659627a833cc18ccfab4fe6d6513dfa67cec499cd7a0d052a5f9ba378bff75033e69ad053c04b74c8cd756c7cc0bd494129e069cfb4358324066415bc2a4d1cb8401867c9954aa8a33f929ca279696cd515bff0abcb6c8692aa9cc076861e2bf27ec360983f775e9f166964d0c43c380366f19d3f868a7e038752d30e389c0c057b6d93a9ae64746d5b3a146d31269b94c7a753412be68d09d820be6890e5db1ec3eab1acb14cee8a317ee7ba0eb6027f13a540b07c12cb1164bc7d295c16eef4c8d9773bd2d32ead764f58fa48abc2a5491bbe00e07965017ebf40c973343704112bc90849d219c70b028ff3769e720c4599098d172674358bcaa8947ba6b874e3d94e623122ffb3984a0b571632be1c540cc5da45ed1c57da1054abbc4456678249a2589544c3dfdb6330ab35416ca49c8046c9446150660b45e05b720722bf390e307445dd8a3e23253cbf633c8ccb098976a68e481ee86b86a32865d9caaf385842cdd071b0974e807710e2b44c598a4a36bb2af048b0fd30bb6c64a539513ed2a5a9c6cb16129cb88d6bc62389b4846a2a0afc532eeb0f055aa85ce7b43f8099cbf194e664c59e683e535ca809d40f72d4a3d5e287b5ca3880d4af1f1523b60c8f811a17b2881602ec0393d54988d63a1620a48ab25a5336b25ca25d5b21425ee54673062020f065693665c68399691748ed8c2b6ea47b89391e7dbcbb3e4bb8bc0972916aa0ee5b90292b23618c5e9a68bff8476fec1c7e382b1cddd45069263a507c44b97663a9c8b4bc690c89d25893c4caca0caa7633bc66f449bc06603fb747843b0a8ce11d46ca100b3243a8617904a2ae48db08ba24bacd5b946cc96b834491a246850c44a0f049bb3e099b3353b28c3889bd4520ce75749b745e65e6442d970e917362cafcc9cd1a6194d9ba41f29feab98320e10234c1b0fa367f7c3a420052a9ace9a0787bbc420832db814e8f86804fb74090146f899a624ee9739ed55c40b3716724b8a8164b8b976130d89e15dc24e2078f24a953b2781b7d36a12334356a6998870a0128ab5152a89ddc84aca3475f8cf849bd762ea7b23bd2d743a9d3a9a2c2ae4723b5c1a3b5349a2d4bd2907d89ab8fe80624838130697bb1d45f873a3416164f862630e96075fbc5192be26755eaa1f33026a1f201a05b6b57ccc83fe9c191b13016a921532c4558b44ff0a26c864c3102ca921c299b38199f7162938387c3598362e5f616756bb5aad68c68e0a34ce96684597712341f391ca6696538582ab0dbd532c7757b5b24b0413145395123f0c4668cd538782b0f65ecc30b687efa78183de47f53b73831210c513c54febca584a4780ea352e9dc85393457e71ca62e85abb2322aa45c4fb3d29b15d55a027b8a74186000b9a05550b2a343a3ac21b0f7a2b2aaf736a1ca49df5b61fa749266b0696ad7b6c48b0dc82803b10a4b64d6caebb33a13c60effd699ad44c1985c9e3f8ab21a0cbd728ab52e07c4bc5ab3f6c698ea307f435bb7b5545c44758fee3b9077b5a318c2b584012cc9b57560236be789bc4b026d1f26a857365b2d1a6e809a9f71e140ec56c4db3829b74539a90345841483daf6840141100c66cbe057261fc346ab8c36b03cc2b2ac838835cd373836bca05d9f57ce2231980ea1bd9908111e79b602572ab37495e9f6025269713f4318dc472d06b473268bcc7c5cb956b5a1ebf419aa18b9d6f184849240470607fdf6325ed561c270b095079734fb61e04c531be893c2621c5ba48bc897868126b995e75777c8ceb100c67556484b71404be802ded5299cc41a83b0c7a99c8d36d55f7fdb4697c446904c2420d667f5e58e0837778ea960bb6605890b8437f24f7d35acbccc41acfcbf2e35270ab36880d67fba099be5882ff1e53ff300bbde74cafa260a124624df72a7f73449b253525e75b658656556422e26352900a0b1ab258dacb5cc3ca0ae9da2826f15b8aec76676920168492ad2b9b56714b3881103634c1cf299403864cfbbda1546d1031e022ed172960171bf94894dd48331f5973bb509d068a32a60f56377b911f5226fc77ab27ba0295ecc70275a0b311284eab09825c14ec7826779039f3319877fe39d8f938068b9916fc60a7359737a918286b2c943801713b78a8d14a558994fccb48ca20065a013318f099917bc930d0ccfc54b6aa0a7791af5c0443c96c17a5a59666f73c395139268024a49bc7285aa7634ce461814592e74081c04a99c84a2205420a5a9777a24b11717011d897c2ceb02cdb79b94d26862df47cd793645b6288f4e7a1f5d18a1bf732dae8850f289307ab82ed5ca025c1553b5d40c6a776946016016ab5913845958904b53fbce279979dc36a0c6b2c483864b33178998e090d0e01d263c84daabca5258027f57bbb99c00d817749b14bfe4902ccb65258d50559d6678206ba44f3c0160dac0434a1e2d25bc16b407b0209b1b08122c68b75a6a4f22e50387f13a3f590ddbca358fc60e8802a25b31bc4ff327c1da127b20132f0036df997b0c7a1d43f8758b4330452ba985c9241b1879c0995247569bd1a1c927b52bf318695e73102e892f9588a527c68196b625ae412b4fb35ebc3c147a4c3860348a414875b60233f8061c38000401452957fc7223303930e653051535e647943b1a50d324108189955e589d837b1ad3fb331ca7b0993c0d5275b2f9254fbdc87ecdc8b28378553719b1de9297bb65abe703294d11aa41f7a5832a7247c100002b2c3afca68bc729f0f2432ecca03b83b6c748cbdc457e1906ae03f25ac5e37ab0880cade4c8aa6904862484e985a88f54c0ac75712ca9706d9c6e130376a14549a1a7a9d2bb155e797c98a22076e00343a55f1d488941a6527e808a65f3b79a73b46c3523f71455c0bb33d26690bf657900d549988cb96069cec0822b1127cd9456c975cccc86486ea3686f46e0ac92b35ff2cb881106c1803823df12163d004ebaa45919dc7a2c304868885badfc4baa43bc386500b1f8acbb0734183b674b338cba409684f993d8a6068d466d4ac82dd5e42f336badb7c78aa41ab2d0eabc90d9a6ce033f1dd9755939a8854498c7415af65b52934246ba521fac2780b0e1586e351dd6266e93ba9e3955c753841373dc89504c7361081034f02e18311fb2297fdbf79d004ba49cc916836209965c6ddc2c4a55b667eb1c08d405b01bc6204250159fd55485d29c48da37dba05a6cec2f856943f383a6a5ea09c947c4c7ca849881aa6f407a1e86be6954b221acaede360ecae49ca9222284695f93480ec710365c68847e7b839aa81d84c6bca8c7a71127a750e078cde65bdc649b17a0a928c8cac51a9e5a40608f21b3254b3e38f81aedf4c69bd49aeecc32089634450c42999357d432a82a0b96a789c3001c7b9a5b55501a7f360616ba7a648648866228bea7520fdb11c70d549fb958c673825f98923469fac9af62c702bab67f29815b331a136b34b29bc54302bf7f35721e722a01cb7a327b078f590864841926214a3f068fddfb8cb196c7a8d8c78358488723bf508a27729085ec4c9bb7337834212b2ab082ee1339a8c64e267517db35ca687826d4b62d40b60aff89c720ac62fa2c3091eb87c3eb1f33272585a6c91d8c669b1a69c9211c098105a0c58960137b3563cb16da942cc90e47c95bb0f9895af845024692bdd99e87269c15f82468454791c7682c8962bb8b85430bb6ff067df8bccd78a476779b075876350b3668fce84af7e5b6a90911f973144740046aa7bab4a1bf2e6961540990d159ac6884c85b28309336ba18ec9e2455cda24a1c25246375dabb21f0c252b4319452719c84756d730a33a90502b4749d36a2ed80b755a931148c8074065487504b5a7c2db6f648adf92d8c8258d2689f921123ae5495feb095b5c4981a860df6478340bac21b700601d324c9d0a1951353fabaa885f00b3622b59d31cfa2eb524b3a5f33e520c6074382ac30cd9636f9c3693f17595a4942f2bbb5b168649fc35a3ad63d11179e64c0a7cb258692087f665620dd0125e5a8901eb8468cd2007020d53b720000000000000000000000000000000000000000000000000000000a8dd5506bfad75f5a719996c4d3372ebc7315ff25049b350b6d52dede10546d5ea63afb095b03165e6f3b9488778fdd771036713df7b893ab8777554eb05f64 +ciphertext: 516f535f15a891e51513c4f47d87634dadaee540c8d5c4970f199679cd8faf38eab3c2369df56d5b31722036fada3011eaaafdf4f83acb5141e2054095ba0f31ad2b89532ce8a55908c9349fa23ee04b551853012e712538f02c7c6cb9bf3ca670b8a3319aabaa5f857586bf1cfba6226144b9b40bb90a706635c1a4d252b8f3bdbb3eaceee7c0dda061b9da7a3166c1464f970dadfd92cdf2f6589dd8c07db7d8e7071978c7cfc432e668eda06826facab576af7213713abb2c3538291f9d09e59f956b6f2946d67815956d3b9a492bc2bb1a2942e869245ffed653be70f0e39ff06ac55d7f8282b331404bfaa3ba7213c17f7939238f7f00931e39fb5e97bae2d4f392f59ccdcec0881d75da5933c31f20d66b60c9383d36aa12b1a975fae04bf808f6ba0099a838382b844df1bcf1366e96c462e2219ae96c3d25d10792c775a2d488b27026e17dad61745fdfd44772116092743bc74ac5bd519dfa22a39f90f4bf38160daa52caaf71778f1c2030c8715674c2aa7191c988b6a5ecb02bb68126816db952393e8c52e91249f14e920003a6f803b09543342360857b2de0b227feb86187bff55245d6ea004d54527ecc6196155d0a32fb1f97908c2e61ee1528ba98d039096eaf8d4bff977f05a9a0b53436b55d2b9322cf1b0f6891b0573d44eff7515f5005f0a12b7066180436c24bde5ddb183652b1f41245f812981fe0e97ccbcde1c2f3ef7423d1bb5e744c05ff49dce1af51392851a716834b4f059fe179f1cd31860ed8ecdcf440f62333c86a6cb7c21409fe20afafb972cc3ef584cb76b85208c56c676f21eb27bb490263fafaa2e23e8f3379023df3250678d0287badd7cf425c04632c1b688ec438dc6b3963a26e69e093fba5ed940e672bc8ae109bc78dff824a04b90dcd5a5a453fecf60c33596b4a89bf683e1ee5a3cadcb0a6c1371cf21ff75335f16d94b67c0b774c38c592a498a9d7ace89c5cccd998a339c84d3ad90e2fc96c0d1d4caa6cba13c5a11a9e04936f3610e16b36c2c37bbfb73517ac10ed3bafd6b9424c2dae97600458553a243e124c85ce66b414129f3f08cd48b33af0a633befa2515a5b7eff8b6ba70710538926d05ba1fe341426278efb17b2b3769069cae9c051168b5e5deb437550e1eb7c0bf88c2514fd51d8d511b7ec90c233b846a103c0fc516e8dd0805c5a2b0880b9a5e293e0511926802b252b7781332fd73be09f02a7ef234cd1cb1effe32cdd7e3a37c8668884cb8e6cc10033f42786c3ceae1754dd4b7b9e69fbc8273e27f977b0e1c3b320d2dde5f9edbc751b742ab24cfd776a67f3a5d52409911d1fc1dfdc1d35771f5ad35d19c36401b2688118efaf1c71f333528ec6140dd2196946d69c6f1b6f53428904dafa316bd4a28ab7fbc9380928abece9ad7ff6c6a9c26fc581550900b7e6e4db71118da5d5db5c504d0d45b310abf0057523d573f868aa04a99be48cc694e194737a1502c2a379ad39ee8d6448867aa2c970c84f00c446236ab4908d791d304f69089968ec5412a807501f5a11ddb06bfa598ac07ec27776415da98efc38326973d6908c1b8cacb95cf2a04811ca39bf1ffce699e4c6d8bd35e51e4e02b89a3545391354a8f4d46beaf9864794524bd6c975b15ae0dceb2c4623096d75bd1ac8991880b3cddeced70fd3b27af44b2d36147c2e0d34048e4f30de879618e7208529d30122fcb179f754d2745169afea6e91d5538d67c54648faf2b61ee1e75154db58d17160dc5a5a36fab0a8dc86e421c4d99f963e6822802adc7b261357bf34fb4ef076d1d617e3ace0b8936139b52bf6ad4ad26205dc206756ca54c972bf932d4d0646df0eaae7a7bd2962b26df4aa54f4e9cc353896163c8b48355c7df687941949ed03b3434102708f881cd9a114163fba2263e29f992eacc807c2a96dae2cfa5701122f8426feaaf2d739802b29f1d70cd6a46d1a8e15bbda052c2ea8d1f41d4a5d856c44ebf9c7fa22005eebb61c0f0012e4e36b2ac1926db6938790e1319b9bd66de5ba35674bbf22317731a8133eb3c45cde4f328275592472ede408060462ce06623926426e5c2fdcbf725d5bac2b34e0c887e668e0be3c1cc7ffb97dd030295f8739c9813bb429c4ad0d381bf8958d76780beca5b9f559deb25905c618fabdd3bba6a80085b2e5b048a93ee2673447a70a58a09f06a30298ee8d4170fcd +result: pass +shared_secret: 2b5d1e7837bc6877b4bad1c4b7e04276d96f318dd248017846f71328d85e2eda + +# Rho leads to frequent rejection on matrix expansion +private_key: a7d40e120206cecb9458a1464b96c447db086780708c7435e40bafe1ab8cf26caced91b888711b8b95414e080c2be24d7a622c2e0410fb9c795a25a50554abe8b9049f9890e29531cca88e4284a5bcec559f939061b003510c8a23991cf474ba6676b0599c86dcc0976f3b61cb624954d3914bf28e109193ef1b9efdacace8574dceda34905485e1a79d51c8ba06722150d8a243d69f671c18b1c2a77c990699b72ef5b1c4aaa121a8e5a6cc971178127024166f2593893bf3b9e0db273040b0821051cab28af5196b8937538a680b39251b08051502c2a3d5504f78b767dce91e2116280c3532e9426b93d8cae3e9abc5aa4832c6bfb02a71559bb689f82c22835fb314a5e6d44bc4085eb39ab41555103033a0f4b6aabfc5246c93c07840254989301f88776c06c9f808369e18445058b4d940783d57b7d7901b0d63a6e6512b31a63ce0704028d936462c18eb4bb78accc3dc56884d9837d8632a258c4e998cc536248aacc62f7b9b65191a28a27a1cf44a0d512875ad5112e034c0adbcc67edb84eb000bf3621e7c1c5cad1cbd06f848c5d8c3601b07463b5c0e33cd260a2ec99a972c47cda74229f6292221391f37d20903aa76eb6966195acac6373a41db78b8f7515a473ba04397c2e94a26a6acd8f2cccdc572d4b60e56880fd0295152e18bc79699feb1a0b6f6c7ee19545f4124eeda5755a85d79fc2dddd2848216576e9ab4d07b7ecf77a74937cc1605602c62003dd5abaf601b55ab0cdb37bb3110290f829a742c5607ab24a50000f3191f435427b5345ef884b91811bc44fc4c6de32bdb0a73edf80c8783a5a6b6a2d06657b16104cd62ad847206ec1b87729260e91b2afde6b0f13a87025c10bafa88e1fb1a66b98a5308a2c4f10874324179a2729df786627271ac5a945072beadf878035169c543c0b07acc49241b7feb406f524b71c787ed757a3d48c233bb75d97c42e03b9973cc680169520e400b00879cf2bc9119325586719f22e1b2de163184b2c43735b2c1a8654c92138b90c458421f681136e0d6c417b20a5f8c126d3672a4073942855b127a87ce96c7e34861923b3ea9bc9f0aa277746927f0777814862b0845c3bdc12309241f387cc6f4ba4a9688b947ec8b5603ce88ccac5c35756d0031ab4a5e32f6ca97184df2acb38f724fee64a6a688c69f6b913576af98ea2487db097d7c81dbc2a29a381b2345495160c348e8207e313929dc08412304f6a01c90f6889e23b7974bbd6f081f52dba8baa716b53769e6f71b962156cd44a3f50563efb3b65741aa26e42a3720ce737c7a7ad5c875663bfe36bde03b106647ba1ef098569bc10a0940cd300d58571dd354ca5ef714733bafa4308b3c4b7528862664a8656d16c9c3837355e39072db20af20025306390ef32931e793e33333cfd893c6227215027ab7ba9cc0212ebc749abbc62be483b3e2406a5ca10d7fc534166646473c27979053928aa5445c4c1c26cde40777aca39f5a64161c322135fa176d44b694341a0d3a05de662ef0e1aced53c4ea2762c1333da3f987fac65ea63a17b55c3f681c568d648966eccd095928f2e32af2fcb0674ba3a50350e282c99af149ab1b3f52d3b9f838b1aa8cc5dc9ba816e19d8a177de33a855960b7c464cfd51a7279a48c80091ec357b9fd118e12f00736036fa8268079754a4d565773f2a5d5c913109a4606a276d07372eb96474c7722d85a17a50a956b3ca8132415b2c404a0288aadb44fbb00217c0005ee36137768c3d4169d300ab2876c1b2a92c0cf119fef5018bf7acfd2031929b9671898c64388898fb74a483a100ce2ae67275e53b00d94c2888f831a286631450308aea2580fc5cdbae53b7108a9d3cba88a437a5c0917dfa3bd7fb2266f2b2f57f52724b67e58cc2781a95191f60a34d74199102b5fe941874a4433034ae6c9aff9e2bf16f01781d72424508835e3a587903eefeb0b0d218e11183cc7293c81c09cb5fc4eaba4cdf22284206b23b87566da704665527c6c587aa3070b01e79094747a87ebb2b9e5296a2405528c224ef45ee6fcaf0c537fa2e2479d579d71a3400793188d895323f274077416f94c4e68811ad9c73598d7ccd53bcd18f8b1cca8bb5591298132258f4210d36722217c2fc5925330d03d1c037cc7d520f52b7774187555c00026e85418aa30f84bc81607376ac9c2e64a98a4c024c7165610027967228cf5f85dc88ccf5df023a8cc0e76723c97b99934766caaa3bfae25afacd39eaae56cf36023c6e368cbf38f27a268ca24845c48a85f2198a6c1744c73c62c830c34b8248b52b62f847c3ef87b6458235fd25cbe2abe57aa62709452ca6412c0932c3a10bce9181628631db6a7b525d1c7e5231e33f65470a31371023444926a19f80a67495a9fd1043efb44adf3789c576577f5ae6d136b3268606fdabe081509fe1c4c05077a6805b22eea9f965666e82866a47444721a3e7647250ccbc69df06b3e3c3895c30f6d275ab624913173952d630aa72240bc4b979ee55ce8505f42f1b7ae797f53f4b23616a00df2153fe89c94391a35074946764275e064abaa01487830839616df9485423029b470401cf010fea769d6f237cb00bc2e8c13f6c49f740c9544aa6519e93dd824ca395076c184b2b2078e4a51622401be47f089d2668260b1b8817052d0c407a76009a0b61abb0a0b3c481d86d4c4fe19b910d1b34fd4408098ae5a599e7eaa04321c44da53297f788d9c2a0707f8788780343a80cfe6119bccba711424cd8c453649870280568347ab5bed10b57222c213e55c703ba7f154939898c89e43643635ce47534f770c44dc839f295b1361a9a6bfd494baa2b8a3264bddd204f1f063887192a0f1849e2b0b3fb6293c2cabf6fab1aada5ab9c35a6ecab7b4c605d6178b26203ea82a76a9fbb7d95c8cf0230dc2cc57128493d0b47324d333ace21d3b3750ce6584cf193a0aaa25f8f865d93495598109d5b07450bc9c590905e9a19934e28bb5bbb149f2b68965056b989338240d1fc52e87446d3ad6617927cdbd268249b785695311458909c62a724db618fc28114a904053ca89d127150d930d583ac664ec1ba08949a027bc86c403d0865b9d3781b0d4a034067fc558033760672639697d649f8bc4cd2a90ccf2435fcbd98b3dec0367f02889991aff7709bb0503a2c732c3869b4f969a75f797f32a323d546a5c47ae6e3292872ba85414c7cfb28078d67afbc42894a92172ec2270974a259680f659a03147661ce4ce94d608b62a660c0099ee1460b71b4c091110ad6ac5e5c5978ec04a203686f1385573663956e8c77a5c29ef06235b671ecff82e49d68f8e0054409c68858954d25162f0177fb08b29f5d9afcd4cc512d8b0f42877a60197837717887849ee127d5f76871276b9a285307e96890fd3569c9ba5c58664cc20744c9609bfb859f72c85363a34a721bcfbf2b9c48c1ff8d813ca596430d62370f91b342516e650173c711196a50396e43b46d6661087c4adfb8639c0cb17183dae91b95e1832ac14554909390e087e3bc09e9ea5ad53670eb93c4fc653a6798428be514d6d00509ea1310ba84fe56b2eea2006817b31bf661dcaa3b26592898bba2ea0379aeaab254b9b62c4421a06254798b892272095a989513a2199c8d90afd753b574ca7f17c2c96334f32a703dfe4735bc2965db62a5c995e349bb1d6c63736874180b044dfec8c83527731781dc193b68c997b4f8637a7c86a8c38172e42cf4ea46dd43abed5b0b386508a00bb0203d6a8a0ab5edf228a85aa8f9152b48bf1bb92240c92059b531b4206abaf3478c41d0c1c054422a7fcc405f7bbf453cd9e133208e2475738a03e1ac2f18088cfcb51c8ba447514aa59fb54066c979de9c38c43cde0162f30023c3a1026a2a2a18cc6c0cfc390b7336548a06239d287b6709ba92869a8673448e142f74848bb38b1ded527b0a69370910fcffc53cb875b008d7505428ec11b3f93c7ba27664ea1099f6dbb3cc1ea7d84e1807f3b5cb1b2bac0053c8097094ea73aa033221c853f88672e3ea335a5499502037dbfa227aa458d5ea59d80fa4a2eb72fdf514f4fe22763d227c9a69a5769b63168c4b4fa9403e3a1ef54b39e6568479796c591afbbe1a911f92df63aaa698a2f5309a92617242999176239bc01b8ad26b02b6d7446d8067a52d40c424b99bd353de13a6defc9a92855763fbbce9f648715aab80342beaca6928a036c08361643f669365105fc6853db1a44ac0b574a842e58a74905c9c437fa375fb22d7b113ec4e91319926168516618139d8edb60574774bd808f88457609127617c85394c65f2e3d78ca47000000000000000000000000000000000000000000000000000000007aa0d0036620b783edcee3438127f41dcc173ca5c8a67d52254a308b80bdc28bac5e523fc2f73973b46b1727891a6077329e10e94acd027c9dfa38ef4e21e4 +ciphertext: e831dc3e5f67734ce3520b52763f64d8f40199c8dd2e723441f9d9fe9b33a1ad8ec79fce3745bc53ddf45990ee1f86fe0191cd5515093eebf6357409891e4822b543373ff83f3c0f73b67bf1e15cbe8b95b0e3dbbb20f10fcad2bd05778ae106e8ab813a131469bbc6da7c2ac3b991c6e070fdc7781cce3cca56fb572ca822b8a52592d24141f089a4dbb842a4318a223b947aa7684be12273592e0d4b6fb65071f9292293a85eadee0cd22b6b893a683d504906923abf3b25e0e7024e7b499b281c965fdea72de1f02fcebf0bdbbf6e3ca02bd05089f79f641ad199300cecc03d88d41360cc895e77ffec06f835c5cba89e8e3d17906bad950b85542bcc551588c32f0376631f554cef3de448afccf8efeefbab031f1c95e569c8b90bda0038082185370403ec340ca345c7cfb1e82a2c5c47bbcfde132e798f53da8c33adabc610272e7ff2037a009e3d3df4f521e8c9b5f3ed7cf28bed5d25145926edc4ce783b11896be3ed184e3d9b92b29dae5510fbec4386e89bcfc033704d05ba91bc6bb09320bf017ad7c567f8eedc273f992fb6d6dbdc9fcebff8007088afd5c9eeb3b14b152185a01b8fb537530b7369b30ed437a280f71597d09b07c1477d8680ede31997c8b125267777437316c44c3b1a1251f608ebf5b37416b5a2914edda779653010685c0d391f888073bac0d4f9b197fa009bc0bcffbcdf0fe2335d6062edbe8f25f87abe8f75b80e9f9cb6709057271ed6690c9b6bc6044c218d65c88b8aba768350567374b66e0489803a9932f77008faee9a83402269803ca5c90592491c686bb25b627dc997a3a8c6db9e5233e02ddb4e5fafc182bf996f741f6f34933d7ced8eb86da62e2739f8a0b956ea7bd854b1c6328671adcb0e233ab192e6f77594a2a3a11dc534a21b5e49bfa45122e24d878c4614180b230836e95a9b3dc8ceb7c826e83a66bed645bdbdc0c4257cac60406306bdfa30a8b8f5a4480db8c75b68b31604cb3eae19b3893d3600932523d0c55a4ed3bf8f86404764187dd4214de1d9bdbdadc7c9fecf06a823d3b3ae16561b3b1890fe1b9689d92e478120e9c38262d312b3ae2eb3d773d946ec99f018a6963b261fa65de5887801882c64f5598003aa4dba947022112cb33febaf8b224fcd3ed10cd2f6b4396c966b5a9709e69c7b7eef4a926171762ad9707af6ee93d4c17b04af42fad670cb7099393d8182045a22e1a7bb8e02da5d4e1fe2bf8c8bdabf7f7e2a3e1fb5db003cf8078635dcbb3cd2b49cb3b8d84e6ed64944c2d75cd6f557deb1b51029df2320ddbdee99f41153cfd7ba46d44c63c90772c3d60531f60e7e761913dcabedd57bfeab2fd0d8bf7df560d8fe30763e7d45c22459991ef1583e6e937edaab7e9f1e8a68552336993460c3dfde7f3a3c5b8b44d6afd57f04d62feb97290b488286426c48c4c87fcaddef7c06a534b671698718fa326549ef5e8e724cb11c21f7b362b967caaafd8205a3eec0a52bcb0d6ed6a1d0c4f433cada99e021047536782581584ef2677b3f3bf75983630e70d57f90b13c369bd4103fd643953190a536b05ea60b47da77bd0f6fabd0ded8f608a08d807234b54830aca2fe82a181626a9b9a219246b039036d1cb04748a2f84094770a12de1411e4510f11b5d090e79d8185cd8718649d88000e6f9571bdf78623a85c42afda73e637bde0b5a5e73aa2ebe2cd0897ebc09ad6974d825a5540627b1cb0e7df03a73b91270ea6402927bc4698cc061cbbec9245024e0515bc27a52714e2189ff3a17caf5b3530b781f70786f074d5c01b5a108cf7d13c2363cc54c73ce71b4b33eb354dc377dab5807a7d05808833c270d5735fb1e75727f66d3ca1ba467545590f3c2fc1218d94bb264ae313930ff8485d616cfd5a64080837ca618344559b46ca89c8b29f83e9a2bb62db57cab70be4042e01f68ef54d3a915d0eb51f21ff89b729ba4d63c6b2fb1b14e5e397f13f0c277dd81705581de763d3a3b8e2115156b4766d40e8bdc0d68bf76e14233d8be21a68d881ca6f5a11a1ceb0393f73a9276eb78bbd740e4a94128e6f5eb00aa10974cf41c6a4cd22ead82816a402a50b306b5312ba196ea4df4c5386668079ccc95a75893b834415254b2feb5b25f0c7529d6954a3657fcef64a8eff497b95ffbbf20bf7023cc62f2119e2f06b3e5fd22b39feef1acec8bac4962bf52b90ed35 +result: pass +shared_secret: cce58b5d736b86aad09ef4782fe87a0a4555c7f0a4b190de6246cfb21308b103 + +# Rho leads to frequent rejection on matrix expansion +private_key: 610c36a286cca4815c657bc2f28b854aa8602890bd6ec2700d64b495b50d049c5963b8294752942d11c1d0182ba6704e54c003b828bc58b6ca3ee0823607c3c00bd0471b4df571c51db3003e4cbe6166c0caeb747f79573f5b8b80d12ca78bc1d3e01a318bac91fc863198afb70cb9256a330faa06639caa7ffcc1248b367bb6b0bd905ab0098b79b85ac5dc083ed43ed8b248dbb72e5ad962b3201c92b132b2961d9867b48208896c11afdd929be2792839674b18e4c1e99a7df714ab7ecb58570281ca80a92f148bc492797564682b560f1bfa42b2f7734047cfd6375d3dc05846da1d3511cb3c8221d38226f29ca52b07471a41764f86ac3418a96aab70fc8454d6823f8b7c6211d216d08c67eec474a3cbad8f3587e22670ae5a9938651f3b48011341b6140ba393621accdc3f606b080579197c48967f1c8d11026d8f90b0697869ea49cb9db086ef687227b2549ac689b564326a2280d8384698185afb25941ba0365b0c1939148ed6e1bf0ef5c764832178d47a01c3573aa268e168b740194a9b36ac2580a7bbe1625900befef3adc6fcb356100ddeac4393d388fe647c3d623d1e6a56a96073bec59f5fa39581245e31aa33cfb865bbc28e9f2498bad34a5bc65c517bb8cae19b6d1864fd7a0c48aabc78d0373a84c168f33ff13a9586aa349a185e3528003e804c8cacbccf0073da46567f7c3ee6a55eba856851234b4f3725e1bb3609e50cd4c9c96ff947c4b048dd7c64b3498d23c234e9bc45230b8b0c797946d0980dfc7bbc5773620b8330262ab6247fca5684c9fb8c2e692c3f654099a7a93d0aae62d24eb594544a81431f295bbca7b15dab7bcf728e3dc61f6354a459a120c371030f3b622569a78762b1cb08248a455e0f0847e1531d194acb0507bb53e9c0e13c8b2f45ab06362be3d9bb58ab6d90825a15211f81f4987000cf74355a28ba08443b3fd9d26b70039955773f9f840207f696d0e7a4989c4b38cb23df626e53b7ccf7c1bd96bc3f68c20ba180a482799d2cf975e0a39d5fe863df954665509b3eb63c257b8c9e39050bc4a739468e716cc289a79053453a28906d003535536439d418736a95763ae222c8870b66f1b5a9978c29d238658a3e773063dab55125e851983706c3ec68d7fb1d595b55292885f758a8df752fd3d97a8dfc33a228c896a44bc039ce1a2069810b1304d44522b1a5e43756cb843b5ef515d89c310f442f585259e5d460dcd578cc51ab49e63a7cdc2566d77e6959a7d24150cf0b413d335efa65385ae13b482b9b4db4ad2518b71704098d7481d2233e2ab201dcb4a1b3604149710de3cb247f29ce8ccb2ec062b014708f397482dae5936bec37663c849c9baa9d3cc88146b88cf970e574694af03fb78205e205435221b32e5513989047e62775f1ba5aa89a10c9d35cb566328eaa5748e9c5057446f96cc691d80208940cfea984df8817d4507aff0a0a96b8c6729329775c8d75935d7624cc0a06ab7a950f2b73ce4d90239706403c0651dda56544ea59bb06a99f00bd698a8c3f127fb4a3759317a05ac244a07342f9a47257e5649dec2c7050188ea669a97c137f707f4e5b4c57945f82c1b0b2040476d73acb54724cba00dfa8bb9d8c58e33260020a33fc04021baba0f6375ddee4a6023846a2dc73eb69758edc915ab2446b1c59fed89bbb86a9be2242c117cb719274873c8b0a2857e4076b3a792965011675c23deb8bc0cf7b2e3ee38493461f8a2068bcd899f1822dfbe8444a612f9fbacbf87a0d45f98a541c5141b230be12763a3563f5d47e369b65c10254e5f63934a05c8ab3409d7b4207dc423d537abd4404a9ec6afb1cbb529619bee740a4c71efc952b3b871043c24c0c919f74f508bc23a9c1ea8b76ac449e28379af42bb6140d376c9a4ec76b34042c7d711efb559c8c87170662788b4cc907e4882d4332d90c43175cc56eb943d589a30a5ac1ae312aeb8432a1d7b2f7448fe0f48ad069989e908d28616530246f8e817aecf6ae638acd7030a596d5be06964eeada35f6175bc0d20c26636943f1609eba3b8852531f083a576231c9b222a9f96ab1fb79aa0149155881fae91adf26c4f1e463f6f603511311351c6c1d1832f482306d66a4a2e585b7e223bd539fc45c5b29558e3110cc268356edf4bdfc2177e50618c73948527b9073c885ce0873dc47350eb3a421f59b4cf27438ca36d3f271b4467f61a2bfde259cd4a67674c4a1827a7e23e24e023b08aabac3c8855d4c737f0e73600f368a8614529aa4217f198e1eb69696f2bbb829835ffaa069f31b1c9c5100ca1ea6781b47c3bd788ac8a3831a56b08093fa64f70a1d3402b17b184e96dbae2b84aa75c2116dc1ba6183c6ce5a3cf1e1c65807245fa3211e9a49703498451916a8a04325bcbf34140539b89acb550565525f99aac5cff44d25c163d30aa6d9f36edd44a3b2c6ba5b54ad0b0b28a5e0991fb41b909067c1300fa6d174dea315f33434b6f79016b5be65d87333e606b2243ff524a01a754adc354ae2b444271a1ca5d4c0f06761300715ddf58cf16a41a83892ab379348b778d1a62cb4b806f03c3f219b8419c746b1b127f5cb8a853955626ba6a5130b19022845cbbb250759bea234592cb294fb7c97777855236659f48b59a21c99ec9130baad818536ff238b33234c718a45de873a69d693db31157a86c9a123b5ee11b715b90a409308efe93db1e3512b012435f26e260527681bb939216ff5409002dc4dd8ac83f41c745509a82036ac3ae524cff190e07998b2e93bac316932fc0a56f98f27a7189ed4449b875f97a2950366754d85a299a422e7b7405b629542007ba5c93e372ab3d6b2ca26db5a9107cddb34408d0b075e209239c2c52e041c2889a625b86282ab8232e10cb14c04ecea6037759f8a6057d4c2037527bae813982128205e535a855710e077cf4b3c94db0683d462365f40043a328cc0991b84e8066e44bc2cd020722157111a76970a521f85a24708565c38babc003b1f84739ff5c7896bb3b9515cea8074f2eb18592b2c9af9b67d4b3f831093bc49993cab27f4b8a47c4364c2855d9cb2cc7e5c7f9d6b70076057e3b989fd314e1c16161a4b1e83713c1fec8cf29a60271808c03814e7252c52c1440d933c363b9878b198ad3641c92c53e5d4bb240b03fb81086662041c03189e43c7afea6cc036a12af28b051792fca44dbec68839d3ce6de4340e88bb4289105e162e8021c169c81aa462866cf20eca2206f7745685abba5636897a8c8ba1292ec1106d623b0e2769244f702a3c295dae415602a2b313da54184aa3c32992bf3c7a846b30fb046c816ca123854481ca1a6d1076ba261f0f969003a37a83e822b668006aac6d5ea3be1f91c5f2300c53372668d3059ba8b8f6f020d2c5ae135811c395138f4a3c17f86f20f2bf704705f7b7acb1c617367bced496cb3ee5bb23e34eac352d60459704ab39b7b2b98bd2c7d5f809382331c3f29bef5aa25b18adcd821dc4d0854638be88fa55b1d00babf77ac42b6e256a1fc3030870a8c612dc2dcc686ffba99093b13889da8631a60b150946cf85188e15826f22866168600c3629494063f1a16ff5b90d6db24cb08c6b6d0257730970942ace54f0a0316b0518c1810c860b276b510424163e6826dffb02fa1572b96a857af935ac8423fb9179452cbea55c3fa490148793c42a0450dfc286ae68b782847eabc30e3652bd7d998324b6b87f7b308a947b1bc74683c02f73f2b130219529950bbfbb6b103645685c8461216e8d51bb2c1266b449657e63625af83743b584e325866ad14b0d5361975c01462739139c8ced3c356a21080d5649753a5ac4849c7ea42820d712490a174243cb744b75cad06f4231ad132321c6f91469024a29d7ab8dcac97a91aa8a08adf39638c1053082c3cc4e38adc7950e280c17ff4781600a95692a76f0c53456eb697d30a354f738cee78b5ab7ca72f99b8c224e44d3337851143c46907dd7cc6be50f6f3ac6f8d8537ff4bd12618b79881148a9791bfa77fd062d65c3a5e9f806770664a050570ca2858175867731c2e2e49ec3a88015b96498806ad52580dca82a37d34b39fb5401e45aa7f8ceaff25e6cf94b0db972d1c21f601041ab309cb7e757b2d65578b252585bb6c9456f35a89024306cba79886cb05af6cb230f56025d6c31c325bd64ac6cef327e66f6b4bb80aeee82043468914a7b0b5481ae7b954789836e59dab088b54467a85fc042a26d0581a1d6059bab0f5d0050a61ca1ef1c705f4bb9fee243b8452ab7ba022bd6a3838baacd8725e7b37bb09580e371813ab53ce7746c7ae67fe6cd89411d000000000000000000000000000000000000000000000000000000438256d8a53ce5b5b7f8a459eaa59843deae0326fcf80a66f567d501988ab521e42ed33e0da5856106580e02aacd0aa1546d3df0571d17452d22f186d011981a +ciphertext: 04825db8d0ffc522482a8464e01d1da34eb0984cee438850ca8e3b8fa37ccf842aa33ac29ccd52eca6f187be197907e7f84ef4bfccb1af2ca91e7fa3cc6cda0dd3df2efed4c3980d9fb011ed301a2117176d5a94c1d9983fde14e4f2e45f28932df2ef001341e57053462edbf03f4f6133918787ba1d62619eb818655091c7660dd4162a1caa675b125ba8461b137a55296b968d1851c96c455809c1d9151403e2530b18ac186ca769cce801f4cdfd181ce90515dc1cd8c1c66596248099de2ffb8ee5486d7674ef326338dd55b2fec7798e34f57351cfe5258a52a6723c147e9908d05132636795ca6f0bd682a10b100688e4d9f9d619e2e8de507caa684208bf8bf9e3b63d473b51ada0ec4424021181128f55595c2fcde65667e5221bd895eb9560944f7262ec89d9070c19b45393a69502a602d753b97e8fee4f1ba1762c21e87d04d3a86c3368b15043d36906472bbaf160130a31ee3ae005e1711d68e07b176349a50647da3746f42862d1dd394b75f4a4baa3061544477cbdd03a37e34a2c57992cbb022df33f4525ca3589b295967976d8f46c931c047b9912de175f2afffa428ef4e68f2594aa88ba839e9c278b23af1b0d1d7094ceeece58ad15d92524baf693c0aebec574c10d67596dc5d835880cc3c79263e5ea520e6d3dbb32ca894f6b37c07b7077e4f807b1f931fe37324d237be301f92798c1279b73e1f57de6825588f5a1eba171b85cde0e4b137c84967af4f12f26f340f0269868184c4b2e01648f68db166ebb134b67e135d3f510f16c450024968106fc8fdc6d49043a1206f89a8ebb7a59a69d354440ce2f6ee4617df5acd396e3739639094efbfd93ea89c436a776c910dae04317c3c9c9af5b265d8e8fc3934a5527125bbe8b72ea8f9c7ed3e760107b313e4855c799e8013a4f29dd69d7922cb76a5cbc6b2d3a6468d74ef015da8c9c3f3c47da81ed7f1491fbdd67c800aacab404e88df2c7fa383ad3d07a1139881db4e99cad396769148d143be6ec5832fe8574310b9b89644865bb206b1f75704dc883c3913ce8f4a3bb0c24dee01548727957d85e42139c16b5e9dec16df089bc07f7466ca38a421709e4cd86ad111d7ed7a317764d13ef73fa4e65722d955d97e8f37341bc511f9596f2c46c356e5366162ac33dd643011777fee6beb5e8b03ded3948e165db06fa89a1e576d1e52f7785b6fb1133ee82a283766cc81948879815e8fa05cf29c727b8820b39a4ad80ef57e919b71d83657331c8daf6cfb1cf7f883ad31fed93df35abb12ad6781b19c0f4223303d39957798d516d09dc00d8dc52fb60464e55b8db1ba5e23236873c1c4001bcea552f5f633ab42ff3124aa5d62592a9405dc1277e24a9fe610de9f3b2321774ef6b6dbd91f1030561ccd890a99df2a039264c74a3cc5bf97ce8572a4ac1a34745e55f9d31bdebddc04882fb27283d63cea4fbe6e5f5c660a8ab5a535c44c56c39664206e63b11ab9f7127579e9e7bf02ca8e249c2d21639f6e09c5e4b73ea45351d0841f87aca886cf4b171981289096858f59a0796d04d2b0e1dd8721ff246cf53f46b6d6fa2240907440319e0fadded6877a1cd9be7347a2b757a11e0563b6df98bb12c79c6fa60803bed991bae7524f7610e77026d5e75843ec50e684bbabd0b37b1c1e2b1b58c88022bc874e401828d20a013dd67f1e26a27b440b3a85292a65c39ef0ef17d26178fabbcc21a64e4b90daeec7a763402105f42a819fb9096da9a52fc3e918259fecf4aec6f54f167ffb795264ba7ca86e7f9ad67df0f79ba29a83534354a66b7c9c32dd386809e3245b3d7b4d353c3ccce2df45d30a37a9bb5d197d1ef74a31b0e9c9022298ef0fad317ea3990af27d9b2c80c1a123d773aacf759dca2042046014b7e228c963977cbf7ab81cfb7870e9d26049428b2eb88d1e4e1def593f087adc169e46a36869ee73ce1f5b3ce962636a75b1d14d1423fcae3332d2cd6ef6bff1b8cb7221c04b7a27e5dd7adda864826444c94f4247601004091548f8e3fe14db0e3cca9528e76e2db9d5686fdd51442f799e41d7f63f93a17628b65233e9882b82916e02a0f84e5b0592ab1b8719a0aac9428e2eab67c95738c82e4b0a2c1135bbbb9d243acf146b2ee88aa84ac00af15cada505528c1eeb3c7bb23dea16992c489febb1e242a67dbfb454c95b42740baf31df72eba9351e1c1 +result: pass +shared_secret: 536cdb35f0c8ba05ae954b77f6b04849704359e9e7cdc7ff879f4b70dde3fbd2 + +# Rho leads to frequent rejection on matrix expansion +private_key: cc389888219463a7a5f6c2ca3014accb3bc26f2318f593876de6a49822b6c1e694b7e5aa9140a0765b6334ec762c8bb018d28a99004081256159c836f4f800d0c9aa4a7136fcd89ba7cc1d6a32b23ed181b3fc118ecc60096a4ce8261ea2c0a6ca49baa28b75d1b40215367e6a33a1c177937bf43a70c3889f6aa239e20e499bc7a836694a0bc2912cc7cf211ba20c12d5ec312da2815ef20c8565712b22a927451271040cf4daa44d79705b97993584424e7b3224a5583e5b8eaf640e85015676517113f53a415220fde3638b9c0a38115e668545305ab298b9923bc16de5b9137b30a39a2c8b5fb75e4d1168593a8eb0e067bb9343f1a030e5228bf0b3a49169393cd14f73c2b8221b1267627d80b97d30544b02a4c7bf06099194b2d646596aa439d82a214e6cb9c5ea1ded727c8143755cf881415b6357661a90d5ae759475baa6076eb478a5826f86f9868afc47ac3a02a0e84579a25466a63d933b071213c886790c320416d9422d280745758779635ba6f848440b2489144866e8e018200cb8305b3060926d7e7213089a06d044176b053f3bfbcecac7840dd7844ec29eb17bb2caf321a5b17848c16a678552727a3d70c34f024164b3c4856b0a4ecbc78d345187c6e09f055273bb775078b43ecc534a40e66592b607b56b5f9304aeb048375ac71c30464e979a656f1728a7b700e3b33e5026bf40198b94455d2be37cd65867522b20bddb5ecb7a010191254b8a403f37c4577a613ea30678daab55508b16d6020f074504f928dddac1e8367faf6199715048c96a8fd6bb225715accdcb012cc856a76057b6b72b09a4aeff5b8ba278c54a750596e82bda45be19014e8ff52df181435ed9ac8c402147b539ffd984c291535b7bc8b26c5036352520730195fbaf40033fac450843e808b9ccbf03b40a9ed657f6ac4af8b65b4e389280633d79799e0226b28b356fc2e39f10a80452dc934caac7c3c521f0c5544e7821a403688f08378c3086d3ab8f7e4036ad516778da606204aed3ca1ae8c42e11038a64ec78a5fc5dcd0475429124b5d665e4acbeccca3a296a8e878b917b886ec7f029491c661bba684ac4229cd71373c829055b602db0518a481230345a34a709010a03e4b197273510a0a24465288c327c10c75434d9473208a7964db7792ea81c5fe0c4bd967c3f0c98765ba7d3faa4e6097f09e9bf10638fb900a764e4a0bdba2f19165bd69832681310a7a2585bf06322a3238dd26a4807af44faad999397d4aa14e76c2cad5326ce573d7ca04c03db769dd01a65583ecbbb991e7a31b59238f8741845f1adb5992607184dfa19a9e8840ed9e1622ab93031e2b448860d411a3d239277052cc8ea71046a0b1ada191a020c322d776c6655ae71964d86314a86a47b6a367b8ac5a4aec75677226de0c1864492c88fb70a53187cb76835d5477346646a9da97301156a3ffcc231f9a0da760dac142674e5cea882364dd74fab66901dbb7eaf037008c52073054cc2f94ec845444054058402515bd206d496bfa02c442c746ff3e662b899c34c40900902c4f8ca146458522c6a7af772b2df483f9d840fe07464b0c66fe1036c070c6f70278e9506342663b07529247b1697c6b844a5959672b08796868e7107108ca4c30a58be4ff7b37b0402697aca2dc4839dc51a8811c34c8183442711a8d055b640cd73d2caff9357bdd9ad36835ae9d55d1a291e040652d020a905027a616b3b5c63c0be2c1068e9cb0a9b4abbf346590237f96422308ba86b055872e156470b53e35b2a604bcbd2b97849446684149a86d9980c5182f1a020c32b14de18c03cd0633e303bf9f8a24ff0c95d5a65c031c18550b7d7d5b8ec672c3953bb3be0c3f13925200394aabb26090a3b9a12bde30418b997abf310c1724a88b9782418d09552a63e2855b7af2196d422761f5c8a877426976c90552bc203f5657f5370258b936c3706f074c11b3b2586391f4c4bcdd959615a819aacfb48d2c799a9abb182c7a9fda6a80ee50c4a827c9f50835b1859033629a9601b5b8b357913b6de142a501974a0c191a071a95cb8c45fa857736a93400141cc325d1b4518d3ea58a94c14f9b261759281b00213f91652b1e52bbc0c488bc0990a136e8e3b5e20f41d9f218646d43745245ca4c277709903c06b2d1ac8bfd7d00164a4122e50441742702ae38c2d422f6d956a214375485443b11c3a1d705a03728ba53b9cfdea8c83550ef17b9779220885b993df38bd50d12933d3a4918c92813490aa5792659206569b7514a413db3506c28095ca4840f964312ea8862bdc932bea84fc19749c026d0e3c620de5942006b47083514f141f2fa81713bb95523ba5df235a78f52aca7a8b86256c64933baa18342c1a3de1d3a0697809f6762290b0474e205253bbc80064a8d60ab8844324e20c1b249624bdd5434efcb46f52a1d3881cbf0055c390a91b286bf0dc67a95a4acf40cd858427f805b057d85a5d121a7888626341a7e475a512476d8f15993f58918a22b92c23908bc528dca6c3239794b802335174b2e2246d579b5de3a17d7f1aadfe69906601730f4b6d6717ad98d6371628b062750459fc9cc1640b8a584a92d10d4adc136c8c7bfe76748a91af2d644ba95690a34114ea574495f967f4b951cb487f4369858f79c111e8671a250dc0c053d857b3d02566e2254df7c1be3d1651bdf29d96829a5f41c691f4c1e4d8a5dc5b4fc9dc772e4411c442bbcb767508b7585116232b8b4210bb01f7bb24f54820b29a494a07a4456b785b90b29fb89e265985133828e8819f3c8437449748c7cc7b5c40ad0fe193ed6b1f0b0ba71339adccc7020b9334107c32ef765da84564f8ca0efc213e91219a11c495a44b905acabf18720f8396c4dfaa78a5258e980c6011712188bcbf10d9cec3028bfc85a2be9b7fc879cb86175900a66df3128843c53ce2417be898073b362b98942bd52183fc0b54e5b84570d59cdb6282ceeb3ee9226c5a5806c4646056b4aed3a09dcf4821deaa9e2b7623b0193d2ffc25abcacdbd6a39615102818b9ffb6a6ca89911aaba7f1ab6cc1601bb056061fd4417161b9a1678be6f5558d2870af1d18219a031e685c66cb74ebe7a2f177b59038656ffc56801c839445c61035bc54ef2b2aa451ce494acb9574c8fb4a6e6399f07ecc2ad5054bb23cbad267a9ef4c350a2403c06bbce5bb71f2865d905624fc0c84868a3a7f52cbaf45f9ef27a9a0a3e83da93721464a910b9f0399fa1b856bee051ab84ad33113d7001af17926b70e758f8001a790968178c1b9e679e877591fd177384519da0c94157001bdb6b112a74241a447b4fb31126ac94e993711c4658f20b81a7526a55e9945f53878dd64a09a481023b385de41b763ca371a3cb5c927549b112fd73cbf2012a5b334f446962111907c4b04a0c06ad9c69b85a722be0a33860997ed58312bc0b1958c4a016650eed626661785ca1e8766efc09732a7c3f8044d18564e2dc8ad9c62563a01433d8145b13968835111073cb134a9b0dc80f195ab12732514cba1a66929065e3159c4a6e7d40b182f420ba56aa6d4446eb7bbf49db265cd22c189139b50b2ad4ba1fe8a130e4d9427cfabef8a946a51a5defe3642842365608b0af110116dc3bb1db7b2ab137c6c3a9c04253d60c72e696610dfb62ee841d7d427842b032a254c3647b0812f20175575ec1f1c0ea14824aa687c4c52f6d224c289862e015634a815dadfb1ec495c4cc968ad6e983c829490f1905b55a1d4a08b50d3114ef6cb4c780cab2ea702b8762c89492a29c452ee35e00c366a7e932a916977c7aaec8908219466864f8b0c5f8a3c46c745aa96550a710203055e90916b190872c186efa16172399240e0801b3166810360db1c7788a33be47062aa3310b57c1220b9001491512be0366bcc67ed80640fbfc7fa5199d261a3b9204cc085baf653635c77c80c39a080dd61b3b095c9ea24c8cd270a722bc16ec5011e2b6494b0560f8b126b943b0b56fd0f82be5fb615d724c74002f8aa85aa91cabe3d79e39753252b847843aaefcf56e08a919b7bb7bb5e404770a46e6bcaf4d278924f85a49a496aecb6ef2ab692590877f2710cb642f312231310926eaf8a96b4ac13224439decce0bc614e8050d698b015d318f284109e2103d1e877a4f43bda014291377172c6c8e1bd7c80aebb3ec3578cde5ac745335b6408d7cb5150e26bf95641441dc06d9454ce9e75bd6eb19b4a49c0b70adec9695c6a5366e69146aea0a6f27c53f19c4c718cd21d1601a8a1bd2c26f9b5aa984abc34c4bc9b0e212e1b84b2e41547883378681045145b341cd0933ae00000000000000000000000000000000000000000000000000000069d5efec0bac9641295efca3f5b6600f3067c8f4d8492e698ff0dff4983a8dcbc975767ff083234b2979bb109a24a27bca17d170abd8d9e6ad3c3ba19e306bce +ciphertext: 8d6c45548a028fe38093d0ed1c1f89f921d823750a65a0f4b55eec20b6144a6632427f53b6a56e7419f89286e0b958d63d1b5ddc633edc0b08414794b6e80265b426bda64347c7e6e8071a7076823bcbc9c96ed247d85386dea5de7eb551fcc92d86f05c121d16fe669afa879faba422c460c1998d150fd0f2a27b9928b66c022f879f153f604d6372c173afa6e3bcb8b9792db362f0b3ca28c7cc4e128019cdeefaff98cf247f3db5a35b59027124d440fe7c3f523e36e48c343bd10acbb4faf3859e7012469779ecd010c6a94ec63021be2c22290ab1e4bc92dae6dccc71263172172a0c527dd379453e053050b79aba7100854473abeac7c0f7d29fb9f72059e5b64f83cf8a7be5c2524e0d87e7b9b1851851291534bddb128d69cb025416433d006c7ae4e1e9ba95ea63dc614a8677ab1472cd8ca7d9fde895a658e0fd4755dc340e46847265454d16e561ef12af68e4be6db09c58d91221cdaa5a2188fa05258b0089c1d66ac890d8c7b9149ee9e27bf16cf78a323c831c5f3cc063a2aa48f8306bdd296efd061305b1da2a696bd80fe90d2a873bc9384231a6edcfc6a83bbea524eab04af929d6d489ecf5480e67722f5e67ebf463d36a6b26131e9284e40083b90e0fba3db9e347b7470405cb4486ac1ecd87c4ae8893d65dd191466863d4d98226c6790cb8a176b53978e726b5494397d7a7e522ef31cd40e600f4156384a2e605be4be6be73b57aa1120b05700cf7bcfab4aaaa439cb152da52f4129b78c50f5d7994591b37fd444a907981d029298d590f4d7ac3bbde8d852e65d85a0402ef680f348146edcfca9886509e8017354daa6634a4880ddb3db205aa23b7f1934a35464105fe852911c7729fdd5ae11b8ffbd3e329c7781bf9a19e8a25d2f15787178cfa6addb4f6d739d611dac67d64f01647ccea0a02f2f03ab1dbf0e45c95dacca0395b3b2241a2a4ff3d82d8fb02218dce04d2e00ec60208a9835daed88c91b75a94d80a5c10054491d48574766c40d8b2aa96836f9965117310574168eb234ea516df470ec12ae167c4b618162b6b7d751b9e8f7ec84262c8a3d442577456023d2abaf2f8f666c7e7c2b230474597e344fad49eee580f429a65e40abad25eb45b3cd9df1cd42aca2693be05af75241638df4a8b400e2df9342c35f450b359c1b0cfb5190453863d412061361ac6fb7828044e55302bcc6134cfcfe6247034a65e7fb89da7ea05beb35a386950957aafd29c4d60770d6d150a3c97e50ab9e6430bec496b9255aa054383d1858956f86d600ca56f05db5546af09b81a3a9b473d9b8b5d83de010a6c4dd27bdc1e699e998cd2b2412c732d21908441e7e9d43b571da361108518223b1a3e8f7c9f36599e4f933c9208a0716487c89050b473a1d027b31044ebaa81f8e62f4766c3887fe15282e84dfe303ed273f96fc70b6f4402a5d97a59058d016f3f6e9dff119edec4654aeda2cc011cf005ba3d6cb562c23d8ab2aa1cc1bd362ecb80f3e0b2261ef518b77664f58e90747f273fb19386d3602164e1c126b754269a6b5da31f965c36023fb2eb454e6fe0ea83c83c2033b49cf54056119660369a499da230a4a6d528729809dce197ea36b27ae6324197ba3dedd5044069ecc9f5ea8a02ec29089dd9e991fb828b87f3c573a0bd7b9490f5437d18f98526b4fb66ccbf2f58bb8b27441fd5a8b54e23861115bddb1ef115075541d6187aa3083e156a61c4ba69613251e2c0800df9ebdde17ae7643c3d6032680ed73b44711570a8b269649b33360a92206b4c4ec4529287376d3b0596d9dc94a5a25a75596fb3efb449fdae50f3446592d9a0fea2e9c68de91e21a09f85a3889635927414d88a5f413578d2c2e79858ab9a2a75f9606eb8d3a4fb582429bc5527f5e56da5f0e24cb3afab72925b3a9cd2443304dcc1cd96d0c496ccfe6941f870c230bd3831e7d6c25ac1132cae6fd7d874192514e7f812630e0919aa735b5a7f8fb04fade34f1a478b3b2617f0fbb6aaa1392adca2102518b4518e40919ae5f7770be298c467de4663cccf5349ed38056ae429fe00d332447e12237394b8549fd8655b31db77bf72388e58369248e9682fd2b306178bb7bf4aa3bec18da1ec50f5004f6fc8a92f56b4b87ce71e6709a15bf5f1442ec7a0b55c70507d3ff42ce190eecb930a2191fe764ad8c3e1ed2118effa9d8806bb091b8557 +result: pass +shared_secret: 7fa8518febf294de03c48fd26404aa1736aee3eaf19d5a55311fc4d367d56447 + +# Rho leads to frequent rejection on matrix expansion +private_key: 078bc69561af0cc77acc291fcb063e1d7c82bdd7cc31d5b44d1aa746e261f2a592d4aa9165c2c3755aa457b886cdd55840767f4fa0b19e45410872cb1db3b8b5829c4ce9b2a8969330cb5bba2397119310fa072b7053b35fb135d04977b9ab4766c4c1ecd9695957473f10c679d71d2f6b57db2ab0726022bfeb10b61807d35447a141255bf5b3d0e3bbf5cc3ae74932d87268e172978d78b99daabcb16b44bd578f6dac130c2528fbc89ffa94b48e6785293023e2605a8533a5ac17c15f34b1e30501729a78d3b8ac6e4a329e1006e0c0735c737283856d7cc7663cdaa1610b1045b7423ca8ccb59ca6b1c482dc02ba117c17588809ef8506f09a7162720142e397c6ac0f8fdb02e4c1c557050af941ae8165ae01d9228f767ef1ac3d72f27cf9a2282a6c379a669d01cc0a6c560b21169557b88771008dad62641f435e0780234e86c1ead05f14c0ad68b6b1041492a166bc4a278b0d352129556d55f37ef8969b596c5e41f8597878c8c6c83de675019c022314215eac667a7b559146478a4a5634ff193f6b83673072643efa59c27650fec168ff17109577083bfa8493f38301528f27681405693345e523ea4398055606d4ccad9df967fe59428ca7502f046506756a6b9a78182383db4baf05014fbb20afaf148456126fa393abfc480edc92465d93aaa158c2a8493882b24c564b607cccb2c8f6cbb43abd722c74c2c63230946acc091c48b865cdb33edb712c670648b07c06691687685218ba48648fa3054ae7a6a663aca6aa4e66506516100c8f2caf9c0645f2554c10c480e798b9c96756e42cc8a7f626c2759d21555342548e0490420df3a8124b0566b1804933b68225359cf66caa599c55573b70d488d16185496216cc09090de382d570795efa569aa5bfa8f4a60665cd30d63bb36cc5ac050310ba9bbe4b3af2f9400296bd344cb72bb623c757366ef1369c968578eba52a092dfef34aadf552a63b1495a5b78168cf6e58b218a3ae64310d16734d5e72b2036bcc001ca07533085548809bf114a092225aec9cce6950a953773ee37ad3467bd5ea0b4cc4c6b0695a774781ce17004cd48e36116776db19565367c92a94488ccbf4ca3c3960524d1b13d6f77399ac625de5a2d09954cf867011f79bb4c3682cd40f133a9d67778a24d7cf1a5b71b7b81dfe335d0fc392a8b12b234950ab79cac94776ad1b713e99b0f394aedce739a15334f19042f4861e739c839ce07da145808260b159625b5a742258779440953c743c591659b9d982aa7da028c7eac4390b47b243ba23e8ae4fd9c98042a0c2d25a6688c9ec774cd7e95899fb7f081035b0c4217c2903688ca7e4466e66ac4e3ca938fd58b4d6bb732a36aa8e097fd75976d1200d61a5c988c12702698b1cfcbd93157d3d1c6e76d316b00b4e462588bbf3c480d8374df3cf66a16f9dd2ab721954e02a9f8eea4380c381da230f10c2c7dec02b057177e157cbd5304ab1d8160a323fd5892fe1649c2e270dbd3777035912dc0802f4d18a56356b52946f30c516838028f7f39cc22466ed277a5adb6864972e1063b1af0709dfd60136b16a3d6c863a68895677c488eb1d879a69a5341a695212066ab848609cbe331704aa56092a4204a2293e77935390cb1d2b2924e0bb27d4aa471474fed2b6982b71a1c14b2cd3ae12b12d5d12919235caeb8aa3827c844bda40f5f57e5f59c75c86b645224b3a861eb9d9773b01cbba45122bfb1e4a60ada0fc10f133c546563661064adbf4a89117657366789cfc282f9bbdd0547029c92aced02963f8cf462326db19bdc980149ee0823ecb1d9e22a5effc6cb588b17da70789d813b749be180457e82a5c958b069551748e12bae79cbc0dfb5ecccc85f565c22eea1836b52435b023959b4f4fc12956a09f38d58836891c4c2b0b4502b012b868fb9bc0455c12e83c182f1637c05469708279b1f4af2c275e174ca5ed0a12b39849f49535b8ca73089acd5067b6b57297327c4cdddc7d5c752a5d2cb04c659d04f803c72507f5832e7bd528e903863b932d80c51e8b2833684a084c7100728ca33a4304c85b8cf7b61412e76373566c34a75ca88004cab21a3274bca1ebcbf34222e351a3df4b557f09904173065b460d54210511f4515180b3bc0a87f9125a0a91252c11464dd98b98b790d85379e8434858571ed2261eda1ac35943b4361abf24b92af0723874601a9dc98a6c872801c54e55981024887f9dca26f6531952055f0ea90ffa859e6c39aafdb8621ba078dcb4884de4bbbb0b96ef167d5332c00cf79f93d30807a44e60e68dcab05e3167315f5b71bd2844017b417af2ce61e2a2d2713b7945cf20a39a0cbc92a07348cfbca566d04fa6983c3e37b2bac33627abaa656c873da54a46399ae61117086b7798259a11315dcf411eb7b4a32f375596485dcac61494978e3ce6626b8194211bb134aa82d3b28997d25637f4a9bcf828f7a17d04bc15eeaa809d582297da9f5afccdad46b71983a5f40763d709c2d7038abbca9dffc530ef293a78a43aa2979f53d3a4ff184d2aac5cfe7ac114d378c7a4a46212a3c56c7443d5b4ed309d7d356e169270196159ab428b6dfc5441004fbc019de1f5aa0aeab64c850d1e9acc000a9628d849bdfc7d8a4b29664b65a66aa4ece6a72ad5136a7ab61f8c85eaf798ad7752b1c5908f931699c35fe2c19a7eac2c73f512e4a368e221381281c6f3688965d55969309ccda49bc38a558b605e38bb593c2bae94cca262b37408fcab7cbc29dd0466b7e7ab4a6013bcc7a3d9b87045f7609285aaaea16ccd1cafefa5a22b33043d47ccc0b0c9a0487691f93f92ec0c9ac47756e3cc91b3331866afcab93966c2a1d1490238c79c61d757e5c383a691b2a241c6c19bbd5c99655c4c632d95b9368688ed9294a4865c602c70b40ab6b1cc6c6b039206bc560c302394e46c428a82979b2288b30bcb813e6c35c35565b67bfc1dc4804ec8462d54709a4ce181d46abfd6554afce4204eaacee5092828321e1d3132d7d0b4f2444136117ba1dc843b440e2b644ce6b5cd1cea7ba6fbb1adbb0a4d9417cccb68add346446172ac0232727a6fba3cb59c38057b2b8be26b56d974483d31019fb33d94449226608adbf1b1571c34f5f920565b4a791b78836aa50687ba6ba49b4e280bf037b6901770db351af99bafa9dc0cab14b406561c101478b4b20d4f765d70f072f1d6676c43a8ee432426f2238d37c11a280adb094458fa6ebd2269da310438503e15b22da42a7a24566881d3cfd41bcefb34cff01328a16a01459259e5406451d831f9430ef7e94d4022714c007de3fc0fd637c16cd14489f178f54aaa72529816f3158c601027dba98093712b54aca5d33954077e3b856e4588432c510342e5c99e90995fe7604524a3d066196dd63e98a3b325d2a8669013c9b10cfed68b24b0973f0c286e59605bc3c0d34094ea667b780288e323b334463dd31c7c64b10f6479430406d04b4756fa685aa30a61bac24ed5451a63ca3299606491644e76c765b8ec2dac478192a685210a4af4397f7646309d17b1c1543346ccb884c28418858a5fc9866dc46f5bec91f2a73c02a1585e620b7f9045ced60827f58123274649048477c70f4b57ab8e8189ee8560ce4b84b2d57eac13270f00cac1e0a11a394ab4fbb0fc8890af29111cb87905c09c3d3170806a80063258a6625a24b230c502460f5c44a6c27457e43412a7671cd24911b23f38013ea1d7771f6b4ce483803778be0e5c447b457900133f4fb882d2b9224f2997a532360e573fa626543e856f6b8760107110cfa28815e71b0b1430f02bb857005193875caf86693c1a0748d3a4d3469be2eca0db34b10f692ec1b12d84453fc067cdbdea8bf59a2b00b083a34a5e3061327263be41ab8012e8283f1b86238a077cd02c79845fb71744a0b2306c29a541d6bf2467a483a03324d87cfd00135f8a9bc3aa97ccd68d0fe98bd7bc260976344cd9af0e6c911f3589a09695064769f5b92ee1165ee7f10031d5811274075ed14069d391b09b3b0fb80280767fd04b47e755a1eb3cc3bc9084db2b79e5b506a4022662909c135083b5a12a59c6328f6ca9856b0befb52e84624af1d81b52068ffb80c58b837134f49990632354799ee166461a916b170a5ea397c319b0a492f566257a3672101038a88be2e4ac5781bb829423ca2429b8238150743dcd43025da8121298b8557c410993828c316265bac2f6c2b0e3340ca5dc4c01045c14731d7525158ca89e35e21121256d08b8ad6c850aaff8ae7b97cb1e8683befab96678b6c0c564b2d41d92d24460d75461c91b42b62112ae783c1d0000000000000000000000000000000000000000000000000000005a5da723bc2449073c0a117f8b3f083e4aec897237ff8f85dd3504f47a4cf42cd48790195fff2c19f221b7cd8637576cec18c29a4a51cd07c82eed4974c36e8c +ciphertext: 182bc48cfb7ef59210e250816725e59be1f4175faec6003c718d88e5d802c96d95e024e9cae147f6cebb2fdf3a98b796a1cddbc680095fe1c4a3ee780b61dff0d5a208532a836a90c919b32e23ba0539fa28ad99c3200469258e444c55237ad4f25651ed888a9ba538c90a94f601d0db2a8e0ca91b655c7abf7a4c5e2578a6de7eeb68dc681dbfd4fb042c6c36dba421a81dfba5c2d8ed9649193905692db183a946dfb819ecfbbd94494c36331b1d65e6468c76b28e35af3b5fc6503b1a7407fef9c493d8f3b86ea00900c5928e857744ecae5d8b486f755b6ef655a1fed4261daf062b62352f88e8f41b4d3a656a5b8ce0b3c7d44ccf4f9e901c9a77b84240e6ac45d941cb2d9305e9e78ae39213e825381e2cab3abde4447b2742677fd271d0e53fb1b6eacb6eebc24cb44444a58488fb8e114f4a771e16e96c350518ac2eef03e1c116034e7a5f82dab805994b791af74c9af4e0e80cb1d543779ed0edd752294652869d83f43a26c9198b375b621d8ddb9897f9b2440505372aac898adcae00762e5d46f189903e1e3d21d5036a3eb74c1a833e377050dba79bc2fe909b1f4df99ee85265ba379b83ea67ee9b7386dab1ea2dbf2918c066fea055b7024f60e9e431619d2282cd207a06fe2d926f96f6d6d92906c71c5a9cd64451abb4e9d4eb4d02cd394740a0b6c3d43befd2c4edfa6539b1f7e165fcdfecb8e0a5e52744b050b5252df3fc3a39badff486164c1b238e315362bbc9de3e34d9e10f44931fcfb45c47d368d922c56695ae3bff0d809b620f28ae16916432f7627c2849ba943556fbac4bab79c8b939c12b78eba9ee62c256d378ee912b124f6f7c56be139b9a5b85f6b98aeec516d1086cbfe06dd54c4bb2910a28206554d312f907c7462f6791f07841d9bc88a96870719dd548197f3b92d22b8789656e41cdf629beab410d8a7a5c65453949256892392d9ea67730007cee5482f6beffbf49dfcbec6f76539474f34d9b803b759780dcea2ff8a307998ecaae255cb0bc464c4fc4a236d3989a82b6e86de2d1b9df441fef56524cba6cf996ccdbe18e7dc433a938fd0017a912c44177341a42cca0e2104094658b1a2822cb0d2bcddcf37770efd18e41c6d3c9eeefd57f7d350104b569cf270681f2656f8c561c901a17c5453ae0a8ee6bc7751d8ce737166d2978ee8f38c9ee07bc785dd59ca6956f850dac891e1ccb25989dd3d347a0194a1d44d8c8fe9418be7e0ee631a80798c2003bb4bd5bc76269fff164ccf95eeea8c0c2867bd5ed4838251768f910f9b58f21478509bec110926cb886ac03f6809de328311c7f66636b46fb04e2b54ba2b09cdd06c0b6ccf1f0d744f699f281e8aa1fbe90ea035924777adbfe3fd28d21935ac911be0c8de9e2393632d07f140ccccb46c4d625821b08f55335a95c2dffef96e1feb13091d257313eaae7d911e5e120f2192c29450e32a101738fb6a73104d9ec0a2f995b7b134f3f748efb82e012d63448bc417f54e3f354ebf584b26e4dbb85c75b28fd9ae25885170ad64113e8d5b47d54767ca184d579edd0b0bb30bfcd5d1e44838df5431235079163075ecbf30ba6d5ccb737e732aa16624abcb42f1c63f91862471c3d8a14697ab74a28b4d1c7a7426732e7d323c2518d82968d7237c76493fd3dd169614a756f7f931f29bdc89055688c142cd71dff82a33f4494e36a64fdfb377613c92d58644c5828997849e19ca5de4dfbfa1ad860644c60d794f0cacd1d8b059d9a126d56b41ac2f03d8c0cbdfe04573481b5d7cff7ce84d757b3544ac5162c600808a331fa671629a6d140c49f4685727f087202a8ca5186d2315d47270cd61ed96ef6eae844194dbd3eae320aee0338beb0d163fb668b22451b3d5a8fb2b4c961a9615a6b1bae6d257bc5baf216022f6d2bce09adf8001c9f8e9c9eaab2d9c5af0e81dab1ca14199646e854bc7b33419490b91c01914705f5b4d094f1b71c8557958f01430040eaf2e06f427135e439f780ce8184e64b339537ec933c8a896716738a0986491771d4d4e6e98d4d33e2633ef2b9dc3c0fd83dbdc48a2c8aa53c70aab81bfb13c0cf11f1d5adc9aee2b1301b6e3a7e644deefc7f1ca260bd26abe04797f7b87f32b792a68db6d7136ab6c4a29207ffbab0aceadf8dafb1c7cd28a484049e91bb900d01a10db39398f6943969f82c82788ee1568ab6adb1c6e2 +result: pass +shared_secret: cd7069783053ed075b29b8bb8f86ba6e723df5d0a8e813c585874f5b39ca2d0a + +# Rho leads to frequent rejection on matrix expansion +private_key: cc4a14e75a6b1bf87f11a240424645dee23657db9819ac274780c2d7d8ac64f2cb82530b40a078791a2ae70aba868253bdc3045b6254c4e29024894cd13723edc7461a37403609b48f79b8e8b1018981bca9f68031dcaf87528a6b065d8cb83c142ba20d68a728a3866ca88e6836cab209ab49bb234312916e432fa51152c763a62cc53da61480691b07a073be74aa6c2b88468bca8302a23d1d6405ddf4aec2f88ab055b18e2b1873862af6539ca83b1c270b6a563cbc7a220cdc8106e6e5595d63a26c0cb86ff11b48066721634b43b361b57a5b4ddb2967d232d34cb750026b362cbd20188260c6a856e9493ae09c462bc4c8663c7903112488b06b2a996dc6668e382e9cdc93e52a1a368b07d8388c9531afff0cc4c07ab423bac717dcc888e213e3a75d69a633f49745bab10f62592f59d53ef19b6a62f0b24216aaed9c91203b7ee65b9d097cc1e2676deeeb576ceb4fa4a867ab7310076a912a41292c658e8f75a98603612558352a5b7beb404fd2bb6de18c7ac838464b6399182536509624e1e25a7821b71edc57c35541cd115ec52c13a739c3de231ada741274272383cc78bc9869d37282f5980209543c92b76ddf99c3d45cb7409b5e44599b75412d8bd122460905c250a94dd4052c0b0a91c9a906aa3652180fba9212046b4f7ad14f7c304780d553f19487b8b7413de732ba1296b41a2d94983d4be93e540a4a4137a030629e97fa640c21ba5b7b5537a03a2a958ec3a888590a5c14a904dd74c83631264644cc6689a245f833530124f7d10e2596a8be227f270941faa75300bd731c145f781cce52247418595ef67c94a170676cda269e51c7ddbc63b6765b010aa061cc576696c84345c35c491d3e4626efc8b73dfcb481c11bbf8c79c6a3aa4e54c43a44141f5c35932486320567ce37adaf5241bfd8c44ec140d30823b58223b02742f3e2bf5864756d528ea36348c1c2293d8ca050b6307d71a20a036e0060697b58a0ada53eee5a6990a9cfe283436cd36a02dcb1a2b7200a267c3f133ea6423bc001baeca953515214e2766f066cae531212dd3551e22bbb1c705f21753ab60a70f364bf1949901d9a0415a36567614c1aba2dacf2c5435b4ee66193c5e461596719790aa792d5a09ac474343509ee36ca048751bd4b0c644b2b039b1320b2294df814b419c3ac55541be5cf4b93593aa4c099142de9e13699a40709d70070aba9227b6c14f216d434c9bc16112b8b4237f838340a5c317a618a91170709bae6a7c13cf96851f72a8761736c452df27758afa4b02fd55b3493b1bbf96dfc45ac743718978b7de8a017eca45dea633dbc417f856781c856c87516429127c6a3d335f162ace0982235ac79ba0ba68edbc1eafb9ed7a3597ca7a612a9bf3ef2b0d1d7c238e98714a434b8b08b35e3885e007501f9bc06e841921521d47999db3ac3937468a54b95b57a2bbe34aeb48ba57f0744021bc684456a8ed413b9192057eb77a5502dbc89c5964c0383b4c9034396da209279199ab5830abe9386b2e811c222a6ccb0cb23732a95676fd5c0376505943ef8bd67a95defe0af7cac395a743bdc3119b1a74771343bad21c53ec80cafd7548ae310293027d62960116a338d74bbaeac359ab3728e268abf75a8d30b118141bbc56670dc0c5b2d05c9c2f03952338170754e20287c99177c66b810f009002c244f213891c5b980aaa23d15f413d4a80160d24e692c450b68c8c43ac60256ad748ab6aa85aeac5c623d199928f88b04ac7bad2c1249c18fe1b867a02a353a112ef71368eee3210f7082f8b216c975070e9a1a27dc265698bfe4849611716d0fa1b1f9047e8b0905d184b1fdd863377353fae732a5d0388c3c6606a773360734c9ba915d49aa7d358263d7abce563afaf382976b2ca2e1328d4aacdfd78851eb143a1b81c21713442421bb1abf77ba25d4355dd10602ce06754dd9a77aca0e25b1260e994d0fe1b83088a5d385251ad5c6a54c45d93a7d1b25cfddc1612b8b30e753814b505524a5b0b26747645c9b636543ac7a871b6a7cd3865f1d8636cb5210ae9157b567b2ebd17fe3f59b73379d086348c9806848ac3ccc1547e8964f6a1c4b532787dc8620050b7e628274683b79e133969ae154da157bbbab159941484cda4108c84aeef56a453578e606159c2c0c8d25857a72912297b678d44e0b328bf0d05a1b096d302c6edf39934ea185d1577207264f0ad6c098f6ae59759ad045726a03c0735080c6b1a7f39ba84c27b41ae555f3e93133620c81674a8d9b29501b8bc19ba9fbd375875843524194858a88a57ba69f719c11b534b5055ac821216d2a54be9771fae1bba5448e39a1c6ab667ea0fa6df038a1843675aa5ab1ea132f797490c3da86b0d58474db11417645e4cc68d0294839513b36db91bf3ab32b2aba77655c407240226bc0baecba66c40dc24469ee617f06f739d7d2249a5802f69285053c74c98cbfc134706e535a34fa03f0a697d3db3e3d2240958ca40ea9545369bed2d44e75592154967b71956d35031b8b425972544b63b8bec1743608c2ae16444eace5395689a02d0999b189065342166984a1799bbc00b7b1cfc33bc210433fe86464093d69b83e095b74d46b8786e71732c6088b4753933b77d40c32570879525b20b2b006febb8d0195a6eac5aa310a38b2fb1506d0bac2857e65ea29a210bdd3ca526d59a259f7cc6ac20c078aaefc8537a69516a8081a0e6313288cca716869ec4a47b7b1afa40a59f9f1b79a2307582a2537330dcaa4167cd848bd51725ef478fe98c6ab616f71a43f24f323f536c6fcf67fbd517ed2d61efa9acc8b9966d25848cb416df944a7f8f900c395884062ce1553518abb314b446a85a0a58f78b8d9a8cb7f027ec87470e9fa05cecc07328a6fd03b8960582e47e97272960802013be71974e83573a0fcce793160949826f376492e3c4bbc376f60ab1362273a918bca4fa64c13c290af3c59e7b0279f410a14d5b1d53c1123dc1e6515619da1405844b5047831e4e0c2c0eb890ed5660d7b98f01019cc98c513ba29ff89101479bec1f37e81f84b23d907728665dbe96f4c2469105c3f3261cc4972b030c58746258eb14494b39381c8c022b4010f6758a0ae85c10776ca67c8225ea9006d8798cc90ceecea408d896ba957291166a189619447ba3940379308fc303900a409b333c9c5cc54a8829a4b36241ca9bf319c2442093c1c22dc111b64e783511c7b38e7481977a56f5baf2ee28e15fc5f46a0a83a26b3edcabbd8602938b2c320f0a384228f1d1c86c0a41c2d238af906c79c5ba65e66a2e76626ff50bf3acbc24b5891e0f4370d764b6c503997b98c9c4656ef1c6ccc89a6794b5913d829e87194088b183bc64eb55c85342a3d12a08c0518a69b4c711348291df114c8da5adac6661197373aebb3ed6b8f9940a127527f43b0857d9c4888082802acb374824791d9c3684c2fa05cc965b9481f1cb1956b4cf3c84fd92083f371835c087371ab840d90b93bb3a0dee11307c66a22c6c18d86a3ffe89434d5322cb17666454482f06d608a8a0f1509562435b10bc3432331891c6c759b4a8517247bd8ae4f950f09638dc5206e39db7528e63d15cbb7484c2f68183dfb234cb393b193e134a470adda3a497d6049b4d712edb380b278b79a065f0bac8ceb654c0607a387a689713a5553755b6121012b614910543bad77c21ad8770cf78ac789c6124369a5766a65e89a8921520febb92fb85e561140a4eaabdaf4809052434ea4a9f5298c3eb4c8a7a98c4c5811b4519402c55102f6973cd13e503ba847874c76754ed8cb92b1ab398661367a3b21f2d0ba969347821cae1f475567700c8a0b911d45b3ee10cccd2544990a6a29d0140685a1de7696abfba58f1577cd84713dd947b9d14d83901c19436dee843021e75951e6474146b355422a80d6a67e4c4ad1fca2d8e607e28032a7d0ba4ef916989a47059922be992381691e0580b5b5192a210acf95285a9f156d14fb3ba7b8090a6946b2345123477e96c373814b26f12b40f0b302cac522f3c07763b82b53d36abf2c74dd29b8edf0c9bb5c749af9ad86542ae6c555930a7a95d31e9bd13ff6971ef6a62cedb4779dd008ff5b165d4b4c4e10ce512932ef890bbd5331f445ac68d045babc39f1f528d73210d0f526fd575af6e80945c92f95448972dab108089931e99958f28ac08567cad714a4c737e8a37629d64deb5c8dd8b313d10a662906bb8e958a60a7427cf2b0c226452463c1cb716bcd9b93d0ca0f3e2a12c5389e38983d11e7534d77525fc6aa32e4a91d552e3cc5049ee74ff2bb98ba8b60c134000000000000000000000000000000000000000000000000000000ee98b001ce87113fbd028ed9f6c1bb51a7fe0f6273a1159702261ce2cfdfb5b3a9e4a0d3487b6714e18bcc9d1daeb3127164328a19d5cf60822f3fd37a24bbed +ciphertext: f47ebf9c54267c3ca90048612dfd843904470288652f4177601e6db651ac45682f0885eca62d9c71a2526068d57bb05d65188f5265c5d8c6ea66eae04070de6be319e67e08ebd76c77261c7d6a684711166b62198a4b7f2cb77f5646af2f0bc24212b2c6155b1181b75d449930b97c7fa700f151e7f679b75692d4da04a47864b307ec54b1288550f4759b25a34df63dd1c8db38b9374c6a9964abd7e143df3083832e0ee46521a715c2f5c7770904715feed7c927eb1e424f5a27984be052d36bde159795e0f5c909c7f7f5fc5f71e4fcd09c1a24e377af273fb9f469c7374e769d49a71ee13faeed93253fd3346e0b695741870b8bfe1046572f9a64bf52dc535a2ef548f932c8cf574e456705bab088768336e5422c6827d18fa0aca54de0b788876c48010249db3e874b448032390f384fb67af94653bd1fcb64655cf467545c2939ad167e37951a39200ac7270c6d7101930c05d417e7407e8003cf428f8e0f4a516fddae3ad998843f73d96d97fa84d37829c0072b75f2ea0c61472a23cf99928511ac3ee0031c61af06b9849541c3e87fd7b11bb1fe7afd49e0a07f01e721dc975ba4440262b96c90f5f4a12fc2e2d0ca6b7969c24a81cbc8d87e3086339959c7af99b690240740709bbc09e41f318c977c5a9431a977decc1cc2808b529d40d8a823f8d2428da165dc21026b73dd9e60f48d1900807ffde3b903b667ed20f71e71790d2de970a13913c69d2dc72041152f44be8c78735ab1c7cc473bd598d7e0a671105e5e26da1492bf0031d7051698d46f36c3b389048bb9147518efb3bd57e85ff5fdb2b606c1504d15eab114fb7c144b35c60d5874b3a6adbe1193f38113fbb78416ad9ea7e896ae57b41881b91e54552e3e7d17891759802e0f49307880eb3dea4657059bb144929d484b6a573ef854b466225a3b7e33f09b4a7bcc04c7ed3bd8efc704812cdf33e450b1a497f99d6c5b7267f0ba5cb250d0e62cfe4d18ee03a11132c222877f3d3dc4a12d89b9bb805bf66629a2c14fde7c7baae60e7634a61e9207dd9ae6ed80da7869ab911e0c8e3ab90e3135de34f548a12ba5a20faec23212ec4014ab1b624f516cf95b1fe42aa33e136a524d8e1955ea964a738bc3d7fb66d92e3926653587f69d421657c1765707ab8e67ec50ba954907d03dd1a5ec5c5a78f044c9393b028417e2919664003a96c7ddf2aa997b5ef1e1f3d9f333380ccad84df867c22eaa6fc2fa3defe362cbd6d068166935c67d6b498c853fec2ec699203f0c1b5ac93d4e1369d8b9776fd86d8de47d8cb813538d613742c6de64e854b9230e427f0a2982d69563bbf7237c9a88b06e67a73baedafd7f7043c9ac7bf3b2d3ff2f9961d62fc0d6a0196ad15b0cbc2f34b1cfcb1b77164a8f8fae684bca6507a1cec731820c920bab97327908736fd552ccfe0f1d075cf15b58970cc41e9f86f28702f4bff59b88f2e478ce69a2f8746673e25cc38971713d018f7b4dde544b05d02921a6ea43ec5992bc3e9b2585cceebfa3adf5503f0d8c2b63de7230221f0e53d61dea4f9e153e3e2db14498a5be638b3177c14d4bd9ae54ddf24aeca14bf1a5a146ee880e181cc8eae9e61e514905fb80f5fa812ffde64918727f2c00541f7ad40d8f2bd2e58b28e1bc21f075eb185af9186a4875f99738a095066f5d2c3b13dceb5935c48b1946d7c45536a122ac99638262eec4cb395cacd6458f6a2970fe400df59d890a3b7dc63cdac7a8f74e4546354c830d45e18f1acc03da15f01dde2bf31669e8d4479921196c826338c18afbb553bf5ef3ad5492dc7e0d4530590a5a09a17629d50dcc941b6a31df1aca559ff490a197e912cd01a4e6385e25513237ae611328b07ffacf6760be6465a00cde8cb8ed630b27cf36cecafe59e9a32c68d28dcb853d346ce4ae872b97abdf85ad6aaf05694eec608cd38799f9106d0f48fea705c0abbf8421418d4a511230c73340461f3a0de4f69b141d00569f61403303542da36953c26def5b2b322e70a101d5fb53aa9b9ff1a940056212e30eac32d3b7cc161ff70e74c0c4a73bf2cc722cfb9c30fd1c90276a8383dd2fc625e1c8d728e16306019ab61066f25ebb9bcbda68322fcbece63328501581e71fc71b7e31e0b57d2c4280100838c439e48d6358c370a9ca5301953d9b4d00e806ee3a4d0fbdbbc0da4ad72833aed64390e03a818bc307 +result: pass +shared_secret: 19a85075ee44b34ff0b11d12655036af401478f0e66d354ec9d17a6c197a69c3 + +# Rho leads to frequent rejection on matrix expansion +private_key: cca22002e0b84e0c0fa98c902c2a30f0d9303a411db91a26576834d4f1645c181bba750c42ab6bcf401739f83fe2a4a3aa1a3f5917418003aed863875fc044dbc99c70b27758389fdd3cce51d5a13b21afe1219f0bab5dc3b15952591e6f80068b30870ed644de082476e7b32d3a531ff8631914c7a5c106a5acbf8672ab4a304afb71b1672cb281438f0fdb1db0f52948e8b0a1422ba10ac5e0a480e87bb844072e7a134dcce36f27274775fc6a8bc611b2a33cf85a4820e18b47b24188030fcaaba998d84a68424c07f4503abb553ec33b4be2af3557aae2797649da014dd0264d00ce74431e46f8969276b24b359c6750c5bc15a6318c2d06898ec5f473380a68302a91eb562fe4f10596012e5efa83f4c55a19912978a6583e4a884e36af1b9367e69ab0566c3cd8c34eaea615f49c094bcbc63d52a21d74c02462cb0bb7c77cbaa03df988b60cba880771a7c179315a9f6ebc6e9b8c90bbf17f737508b1691ef1952363e9499b5007a9c84838c2a149478e4be76c0368a8220b9a3ac68ef6560dba6b3f68257b6719551d83c38f73654fb392af0c1c2517851fc160c343cf826aca2c5614726c774c758e1abaa9ac04ae0742799060970909cbc2f78ca739c71bf6528f0695ea6175a4ac13555c3bcb9920bca3a37d363ba622666e54a4e779cad5059612792d610257a689975fd664dc5081d5ac4586c60e99b9a2a17ac612e5a794ca4dc097a71f72bce02b4907d69d801a22fd7b88f9e4ab284076037a0f6ac803bd7b243b835e51873919d3b77de041bbdb9c2917338f0c42a54ba6f5539d60e827387a9e7c156155d693b85701b53278139b29858785cb59788ed981d77556d27390285bc3f9408cbdc717895815d31641d0c31f2d911515f36743c40f4f3517432c620892149b518fecc80cd2d14c99730e0c940dec155930dcb5ef861b7c80b55c2223f7066b625c9fe5f0cb04f0bcb880119de142ce511affc01d483ac8db8b73e504b242315533d9c02cb64d15445fe32bb0c8e19383f82854981a9ea465b05c77cfd66d97a2b262bb37398cb4654a0fc8146c00b7608f061a216b9becec17f686b93d88309a7ac04c2447030b41ebc6a95fc52466d36dfd461bb046172f3b83fd10bf79c281202a60aed8467748a986100b97742c8d70c8de523c1d700489c391096c1b92654064cb7e35d7b25f29818ff39fa523c88bd69b8cf41689a414288c492f2a83f7b34a4d95770e6144b7731057c73a077a471e7b378fa48464c426ce5a6566e7c862131ebd5a1b3df013641a878fd702d167ae3f369361666514d98f325679c22aaddb56406e148e744960ee1395866acbe095542a6836571959a80238d037260fa053a52cbbc2cbc035e78fa9c306ebcb61ce33422584009271835ac3845524794f18bd7e1b4c034832fe68ba24a162815404f65c0af0944c9789b1d92767268c801a0444fff50399b3a192131e965523bbc2c75c286c96450c3f0733458bad7831205b1b4841a617626b4bee232cd1f220edf53b59bc213a055d956591fc3518a1974582f79a66dc8892ba71ccf7a5fae1c01841428525c32dd2b433445118559cb5447e3c851a0cb498cf99c2d359999fa3969fec41d1311ed2545f5281a09df223bc4918e55551ec060dbfeb41c777c79acb7375215002d9afa37b5a126625f7445c3fb51233650037e070648c924586bf7013c203e907332901ff722c35c1991acb2da41cacad4b709ee242a9e71eeb0ca1d05595fcea8d175553ce689ba595b8f98707a68a4d20f8a1fca8c34c3482e88c8b043a9d42e4a9e55a6cdd867e106b271031355bdc71c85c80713c0ef7c3ba3bbb9ad4e32615a2b104e52dc5e7481e258351385f9c8932a074529e327e6c0949756b57ef47094e184517819d459bbe35ac6154a70d004490b03803e58c9bbcdcbcd8451c2b0373656373be77a59beb2d47410d8a8631745653a02956dd0a0fe99ca87d78c273230667f25bddf3a65a216921a12844b8c98c197026e14638a97fa5144b44189621f00c75857fca20342a09ac44a4aa6c336d9ae58a15972f22555139e2b3e00ac0bf67b15d64ca8ae77a79b44e5b47a72ea06930aa9695b96987aa0dfbe63d83a352c9370247f6b21f225e096480b17333009bb7858246413061f4c42b57b1625ba25249b9697b09985dcb92d155c4a7db3b2e77464ef901af38b930e0b5fb67cd7a4cad52ab9297b383dbfb7e7cb32bf674b24f92c6f13ba50afb2164173282031b584828f8fc835a094bb4631193258f8bb1aea8949a7cb4abd1279ae3373ac36108eb290b1bbb205bf81f907873de0466179787394a48c72bc100192d8a0a46f76aa35a2c4ba8430ff976caa5d2888b7bc054bc07ec8a0374a5276dc01c34918b37795369b66493ac0e3c1362a4f3217d240ad438b7472172474a377b715eb0702e3b1652c3e35873904ee3b139896245c0a05133e873b5183d5ce54b758075478874cbcb00aec3a5f82c03f6ca9783ba3f7a6a1c05a41b0fd30f24f8c47309950282b7aa9ca84dfa20c8a9c5b9b3665ea59b2bf035159a20eab110a862c4112cb697c923311387b99a15066c569c300772eb44eed03e25903e88a84cc5f3b6b982086563a36f21b3f9c434f3200b0b9b5852a2aa75eb54426049c264b73891a28d9412b9c3bc5b87cdfa6b07242a4c1aba32b229b374071d4aa33580b52dc09093d9c40d95801246561cc70136c389ae1667bb0ff600fb82321c509121694c4298c67b36a21264201ea1c97aaa757e5c975195067416964a3a250151337bd489a4e943c03bce82a7b447b134f25940b345166c5b498b6431c159c829434067562f7a331b051854b32b7000c42a122974beccb36016459c61a97517c80c763964c64f6f72cfe69bb2c87c63bf610dce640702e99affc20d1ce934cf1c70683090367673c7422e57389394e7c2aecc13b23733076c6a50631c69106792492a6dfcbc7963998d219f5be767b180568b76658573410ed41796a9affdbcb5a9991ae48572f1d2a78da29a6eb85cbc50329e24c56b41a4b9b313a85abdab851886fb45f643b6774c7792b89dabca1d54b1c728b38dbba6887b028d51715e131cac8ca22eded549b54c39733309efdc2b5a5b3e45968afd13392c29a519328c57e259e7aab48d730175d61479b044fa019cf86681ffb7a43770c7b3e22efe3aa45c61246c368e920b8183b7446475c32f739ae4774c4430c5265a3aae3104629c31218c7b424c3ca25a4e9bc8cb5067a38ea4cd6f704c5cf895bb676489e8995d15954422495e82caf1484fa64264173c5bbe8138b6132cf45b8f6c1b2a99d42fadf494f90730ca9286fc9aab08f3b006622a9837149f30275bcca354136d876a728634c6ccf48be4034bb937bce815b291d9236da83700b494082900d435151ca37258d39c816704f8bc1373aa2f6f1a916e21c983fc590473072ea0039630b016b963fb8bc95f21959538854e9c5fad4212d80ab30eca4661d1aa6184a8d7a872ca6682a85773c6ea9006a64ba1b44205facee36c93b962cd01d700ac7a088c7c43fcf8bd07d413a0022fb43883f9351ac675508cd89c50f06eeda01830c42a864515fc88c9693026e785ba2a163dbc819541a61d98a64e95e62937795290440769c1049592499ea0726c18b943040fc9d533ed38655d05264cb0531d23bec531c6726c9dcc132e34704752ba240b4c4ee506bc15150932c9038e164aa22925152c52cd59ad3c68bf6ac9789c01b7a87b8a5314354f36038a3b2bde93cb73b596f830bf84f024458641504cc450d510791c43b9db3ce60127f081c8d7f61840eb75522590ef57391c3a4189771ac293770aeac4ea031707d6c38a2334d44817db05cfa54aaa5540c3334291145970903160f85cb814905b493bb995ab3ac79bb62e3cbda3d4a0cd388517547cb3b5a6c2ba9ca5646473dba10104a2bac7b4a8f79cede97d48a94d0080ad5782819d8c4b19f8860b711285ab3082784420863487863e182a09d30c8dd8198a8876829f1c336e583d27e4a06b091c4627022da33f06a201cdf43120e1a6b396bf26324d32c73cdf531488650b3b899c1ada8bccaac08c3c6617649233501839628e53c1ac7ae51ec19b1468039ae88140feacc9027c5f9370985a0932422c0b24b849be7a9bc497cbd3d317f48c50009a676161901494a52045afe3b6c516b18d31aabcfb27b2024505f758c91f441b8139889bc6ae3440208f34508df8a25bb4b3fed3929da0572a5a804b086ceb74020894b534bccbdf485fa769aac8e9577e477caed5b029c86b4682a7e74cba8c930ff80d00000000000000000000000000000000000000000000000000000049805cf685e4bb4bff7412194d13b4e36665e21e561c596fb7b7c099dd9d978e53f53a49ff45b0ae588d417a63a599670cd391c5e9885c972593d09350bd7523 +ciphertext: 6d12517b654513bfc072c7567a03257db9f6b093bb84737dd5cb2861952e1936bc84892a5b7c5f70c5349b4af1ab9e8b65a2107232f26100b4ed9fa413bf04bd9cf7598763fa3c40b7a2b2593a4bd51167a64d6228dc5bd20d0cd431cdccba3dd5b97a56b12b422f666fb817c1a5fdf9d1fdf8d69640826aa94ad87bccaf8bbe4f1772efa2604d14006b45836addb7f2935697c445b4fa69452e74290115a623e8758803000e0f4261ec8d3a68f4e82df31c8da1a59d74aa956a4227ef6b59b430345e4aabd96fb0c336b9be15ec550cd964bc15f2de060b2144648d71e7ceec4881bffab6540591f3837f935b4ab48c3241c95edbe3b7be6de17f62b6a141048b6663d6316ed3c1e8320f3ec5b818eb890985225a33eecae76a813f08b9deed452d34546b8f806f8ea57e6315ed7e305c420d037c2fd2359022a92dd3b0645e00551207f578158f2d853f41f09680fb226b08344af892ae470b1f281b58b2129b302f2da1b8292bc851b0f274365ac410ee178594fca317d55df1a63491b92d8d1c5be3b2814c40ce082702b9f6a6e6eb9807325aac5ad656523e69732feed01e4a085372b72c604a201730f785059709a6be4589f8e523d254abf8004bdb615d6b45dae3e7609b94be0878532e1dc124e92b24b677276c66d62fa6f097a3a3ba029c56cd7b3af092abc02ae18ace1109e47beaf478a84f34ac8bec69e67f71e9e8713b2e04460de25503c8355f26bbd9a84e8f136c15e93d17c8da50e0ef1f529283a574f81de5ec885b3e114f4b26a5ce46c6d94540981c8e8c38fa5d6a2dc1a78d4655a255a915903e88bee5f30bbe9e730d9d47084500cfc4a5cf5979696508cbb3a20ad11870b0871ba7c579846e67c5d504edb07bb742f58684c7af5b247c5b1459fcf04fbd3f1b2f7caf32a73325244d1febc8bb93488e73679e1171208597d50bff5f2a0b1b0e38004f93facc8daef9865d35a779ed93f4e9e65413733b01e2c4aa7f649ad4774a92422b47b1610fc003fb25b62ccae811e8bdd91fbc65c1b2505a8226ee96e275ac3de93bf8539ab14ebb5f3eaa536a96ef7042a4158af84c80e7b5f161172ad08438fe518d32411c9e9fb2213515617f418477ea1b69d767ebfbbd99fc7ff164da7a43f0f1804f7e928531283445ea517a9e1e715bda558807d2df4a636dc5a0cc59353a33b4179a0c431802b11f676d46fb3a7700b08558c409ae96af58ada7af081d42d6d0db42371baf3d12078f61b88bd09cb9e37f51e512d8ed1f44eed6113600f705f7514f5d14a91b1089d7b441ff4166f728ebd4072bc77530bb85ae0c6b0233d47f9d474466d7b5d852c20f6c5ff936efb6842fd94a4618ed11086ad6ca4dbf9bd6eabff8c230421c486a3c68b440f2e9a28c580cd438ab8da399f8ec2e7e0a38aa95ba39acc9ca8bc928479779c0165cbcbe292690015ae10db2edb418fbb148925eab905a3093bef13fefdb1774bdcfa7b907caa321a5b9fd149240a0ceff340ad906fe103f6bb111eaa53761cdd971dd61d463ae503e96df8c457e71065a86ea58fc345d73646f5c9261701a7264f119c29faa19322af0097a3f889cd40f0eb7884c2b2716342634a640f6c6388a68822cf38d93f159f67048baa8cfbcf5ab5f8b45d8786206a7ba497fc935d2be5644fe5d90e551fae7ae2bc0f237dd03352f511f61bf873b33d4974e1936260536ca88e0dfed5bb80700b3300f781439530b4569084297e38deb96976b66922a11fe56e5a14a5bb01654f485e1f87bd204433dd15871e7b9f4ebce48775e117f29cdab877d65d601c2657b407c26b33778491ebe4944056efc8bf547fa7bf534b56c363d4a165210feea4888078320636e50b08c46168953db0caec119f38188666dff40c056b1f70b4cd956ee8db8309c406563ac9d4353b36f51ebd760670250c556d9f0f2556aa153c0b8416b26fd723429ab0357e32725b2ef106b3bda98afba709692ba91a2ae2708d9d67a79cf615f8304cb4301e8120ea00f1372e429d873b0c7161beadf87fc12f06269784aecc7f6545345753a5a55799269c9276125633252501f0d313ca9f8e06e4e2777e6ef21e78efc716992ecd979fd3ba00b4c3115b194f3b84f515fbb0b4f31b279f3e776273715c05aa9adbed7e12b6f2522a397cc6acc96b25dc115835ee824a22a21319fdc4514f87b4c5d48bc7e83c2 +result: pass +shared_secret: feaca519e19182ed57d07e8661103ba82976d8a079ae871951bc678c73a81379 + +# Rho leads to frequent rejection on matrix expansion +private_key: 16997ff80976d1506b23c012e387ac6ca0a792f7481ac3c9775317ee3ca5267bc7180ca884d28bad6b5a05b045f33a9b975c6c98908d670550b874ca70a77424e48bf097256434b9d9b96c8b8149f02ba5bde9b813eb2b60f20da4440b4cfb05716bbfd86255a1e82941d2816caa7253e7368a4bbf4bf546f40b1bafc65bb994c34f7337e82818021797a431cfc664699bc22b92561fe3d1cd6306b89a36380920abbb466477549d1bf14364221c10f51fc3f7240de4c99b3bb3eeb9ac1fe12bb7c97888e8386da4a341a0be8f78a7b7c49f2184376c3c3784289a6bd9b6a03a110c228f72939b86c7a87dab3e093c0ade693a0e5331c48b761b070476f55cc45ba1dda14dfde01a011776143a4d29d48b47b0c6cd2111bf18360a7438f384a28d772177f648773b961a86637c946d7981a6b9f571a4c29aad07220fe081f1f18700f3c99ef28e76819f8d7c4c43d754cea21180c43357f3430bcbce1fe8952c691cfe9a7483026386a479eee4025a838df5c563b9f5a1882a2d7209a68d231ee82260a7eb4fc157936deab52618cba32772fa1440fb675220f4610d749a5b3b142f31b404d94d2bd816cc4773ec83aa1445a37b361e52b10960827e94171dce3c12cec80a1ec65aa6f117fe937673a78cd7767dadd3cebe0217f13c903ca25d6a681116b206acb46949b18f671a63fd2581a6c0978738460cc51df3711dc1215dcf75525d30559ab6bc52e16fa513753454888189348f045aee8a32e98cb2dfd708e7d42818115e5c61711a0c43e85a13657aadc24b5b30a04a43cb97bafa433204c18536337758c0db6154d4fac670fa3af148b52f24aa731c31f98464ca9bc975e97fd665710ee2c56b024fb8d7c7f4a20cc9d510f8eac38f96129c97b17c890417a21465d05abca02754ac3614e964f1a24393d05ccf5cb9500852cc9231656ca899f3538df30984475209f84ae8b99983e844b06ba4cd8a9640a513cee439ae13ad57d3846aea4fa165b68c6c03c05c835bcc5a63d45cc5568aef94ae7798bf29aa7f38e275c902236e63872a274e4776cf1928c492036166d04eed9ca64aa16ebb4b11fc3ba802c6b249e4b53f90112b587d36c6bfb0733a2ee3003419026a10a4c54c2be294b2031a48fe895c2c9920b3772f127338a865a82c3262dabac113c235d433b90d401f5557bb1bc68359020f75742c2008c2bc8862416910f53772a55376ef05a5eca853eb1ba5ef841f243b8d98b11e94483ad7e72fd7360a3641159e481ca50971a6e8aee73a0d4f24b25430ccc0997c631308fe2aaefcf79af5d2045932043d95933919b21ef87865b8550742a513d67af756c5958465f582983a777e9032ac43164e552358861a0ebc458e55865fc3545fd01b0e7565877ed3229f8267369c319abbb017a87ca662c635519ff418682af39ba387aa38ec37396b4d6ab505219314f4448d0f572f4330cf33fa1369872649c922bcd228c294b3213a216e59752072b8e026700ea63061855be3d6037c0cabe0c21f5be948ee4b18dd935ad358a5885a0331db2e496995bd47c3ff2b679e0abafc02804b6117271a2b00e33bc06250fb30ae2036716d30a50aa07e45f244e1f0100d74933a0cba383545cf629d357aa8927a7bd4f6575059485fd455be7198fc01a509920f6c0b8c5a565b4b86c084a60bd9b9b6037727df67b83ae06c5e47aba5d263ce83808f40a378aa43b4ec5458b33a0eac8c816abf5bf76a1220a99205258cc4a9236b4dc252cbbe8884e8ebc1fe921ed408582182b273a199d121153ec38b7f183174754f66332ca98b87a31672720815ff7bcd0cdac810db905ea76e6496742d26b2989b201fbc2936f5a6cd60c35e757f8c33b75277560ab948bab2962df9c38c91b44f08090e5585d852c4b729c52de88fd8c54722162f2d7696946c7b710079500136a28b9abf9a5c0294a5b265865cb04f9796b648f85858f8982f15c2bf31626b236b2c3a6493910be2cc8610829d96693cce3686b8a63b91439118fa661729462ce58e5e28b764aa39911569d1ca5c1b33885400a16f169858930c7f135ab6a95d08ccc70d057f9e73a4c8ca2da7185df37c8a6f727893bb6db74329cccc4692589128867cbaf28694fa747e86cf98619e99b221db88a81afa73b348586f87a12c4aa441f688b2c0cd16a89e315b3553a16179db0e01d01e19bc1574c75a13987b2600ba2ca68cba5c1d0ea69ac5fcae7862ab218b1a94b22030b40f0b3b16bee7c6d6e58700e150d7217bd7721afa7702023786f365a43a60226068c5ef3323c8f85488e77c106a243e96ba538264749539f5874d55929b72a695ebc3366589b04880721180258eaa095a950ea13319c0302245d86219b79a1dc61caa658fff790f99d2c3f25c11eb34aef2e66234e2116274ce54e5ae335260fe3ca3e0673128d064a39c82a3a9ce3be0a2c501aaa53175478b847f9cb17ceba19e120144534dc1a9b38afc864913a8dad5a7ba6bc9ada898c60b63deac87092275685820131001911b98af683248b50f1e2650bd299c9628678ae542e3e7a526620d1f78aaff445ba75b47d0ea0af4a3a3e7447851377f40c248053a88f5706dc119712a5001b8f035436c7d9eb1269b845156e60c5a714026cb330eda7f4ff1980fca10f5b87666d5600f468b11d81140b27498a10715147167fba6c8c58680824b21e97bc982b61aa43f2dc4866641b9bf6200e7a8afc3c1b3c70226e2a320c603797330c952050c90508a4b36580fb5c83e7c9be912891e7849db960f83b134543a3ea1c40d7f0029118a855a926f8b6a2777172ad5452fd0a38753a94bf3f6023fd631c3e9a49be1194df4c7fee149698a2cd7b54c5fb33b306ca72b6b7b4280cc5db4c452bb8abe365a3d16c5c02122be27bff2f1623294bb6217c201714e9868b991229df1569d7dbc9ad957379bd58a41c990fde349d50a3a2102637b18be9f4b10cfec0fd3fa2cf4868bac98a268891d9bb208f489c1163a16c4d68a13156ff31a0129839a6ba4436ff735ad69161d551cd0933a25728360a7668f166516a69ace60b8283878cb22394fe8beaf153632999d60554725c041f5b089dc205d4a3759a7044caa82c78bf50d63fb3d72172622f71c31fa66460882a603d02b798470b24409b019a6f4b85f571c5122b872997aa4c389fea1195ac349014660e619888a50142ebb173f95011a716f1b031a7b860d1986a3c43a65bf5654dc8376d2dbc8d25ab90d139a18167fb73b758331ca69274a2d340e59bb6091975407b4039bfa9e2a4480ddfbbc8b26c0d1457f39a38f1b8626186c469b48007fe0cd2472a3b4369d425518988741507912bdb12901fc19c49932cb1b1558862291a63ad878cb6afc2dd57a1593e80e720a0766a031cea2528daa3fa866543fb5a2ed8a1c111593db955c36143ea38a43d73024de9446ca2c69923ba88d2c5b4444cdd94a3c380156dbb0346a02271237cc488c89d050035db74022c7c924921abfd86f71646221ea2c61b123224a1b34fc5f02c6849678313fd86a7da11f3ee681ae5560ad42cb3a86bfaae100478b0677d23dacdc9005b17af54515863159f6072937ac882212cdb3e82f3f811737b81928b605a6142a9195211fb73142c96e2cd309b22a8191166e33d39dc5a26148179521a4ce69d4c55988966ee2b278bc2564c62007e75da8b1ae169595a9dc58dbf47da2e0c192a915a59765abc62e375588d8ea3b72850bd0c584614305218c729628a663399dcbca2d30fcbb6e99921f5c22d1e06f6dd99442a27c1342afdd2705041acf8df78bc4e835d8e400cb6419c52148f676354421c5e7268c84501fe82b851bd87bae738ef5c67032c746356010ac03caec13b212060890a38ebd28285c990021a76cf3a417d538167b782b65a56cefcc2ec6015ddfa7ad8f2876a9b3bc0d9649827abc33d7ab21d5b20e4a84577311ac7b381741c8238955e630795c7a3072d23dccf4ac689a781fd783fea7592d0a629449b44142b56f440ed00b19bbb976234439da01238640890353b8e14b7a0d964819101110da435c9b68e73b033c78b1efeb9d44e27acb225fa1e07bb56299d54a779cd5379b7c02fad52f3c1a2cefea9636d850c6e05ddc14b4bea669505a94fff87acb2ba0321541b2d78d2c58abe48b62d4d828c8ac0f881baadec1bb30d347772729a73390bdb85f0e1c9b93123f7e44a541740c5d0598015c1433c96eaf97b5e0d39c27e60b9ba6cbcf8a2dbbab8259e44d006da65869c75b711939cb38a3ea83dd3c8ae97b4e272a07403c40d127956e969f8ff3bedeeb23c406a20e73a2d589000000000000000000000000000000000000000000000000000000948eff25ea7ec304cb65bf7722f1f355eb12e712dc8469da9b8df5df12e0da9be366c059f5f26e6dfba8db203c5b27beca8fedd3de2664f6bd5c3e2ac9fb3891 +ciphertext: 16160deb06f8324dca1eb3093b3fc501dad316edb4d5f8b2ec591eff7b65a048b3333532ebd3d961e363157ebbcac231aead8e255abb462fba12955310c6c925b530ad2f4a761d2efa5a3b9a8aaf1929d3630a6244e9ee1ff5839198fc9b4ef47e450d4026b5044120c13eeba48e8fd9fcbb02523814c44874ad950a83bfc21b1ec778c1d5b5efa0f2a9e028b13622fc0c2c08d7acfdc45788e0805aaff92b51532139416982f0fc9931f3fb12ebcda2f72bd9048621208a4a91d42b56f7d810e89bf6e4e7d5171c82f09402d2906b692bdae3088df4b686b9c1925143e07212e13f4a3732f84bdde9074ebf3a549f0d90aa152671d88d88af39364d33e8e14cd0c71e979c045002c3c40f897bbff857f1dd82141c719ac5cdcbc944f6d38978e8f39ab0ea2dd9e8d19e6cc95e0bfab01f8bb1f8330e6241c3a937c70c40280cff3bb6a34b5b247fa970e50361447bc5b163143091f766387d15033cbaf8b9cd208a2548f42f00dee7ab81838ec03aff5d4ac446a55100934866163e3f53931e1f4b86ddc021f39f2305f59c95d336bd070d089526af38416e61cc73f94baefadc73794da7a7c9eb06b1cacef4b37626ef7d1dd381952ef67d8a2959021ca85f4f904f912187294acce58fe364f57e113e1bb4cbfd2913095ba6039677046645cf84e4069bf5f4c0996539eb1d036cd4c8f8e1c2c8e0d775f11d0eab393d9474220186fc3459db73bb864716418cbb90f55abbf9ac57096f566702bdfc668314d98ba91677bf74d91547c7b5302c725b890b4f3f2a8b95f65521a9199a4bb429b31e7537733dee03f7f2f135dfe88e38d1c301ed65a3d5788dd593531c639eecd3b947dc557253b993321d76a61ad4ea37ef2bc43b5d410c7837aa3b706a28051d3c1ade2216cfcd719ceb9ea9aab4d373d535a13da4c9c27c5612b38badaf16ae3a584cb7c057f1c2f4a24a477cfa4a1d834b3ea4f9254ac3f89223bb1c8b9eb514460028ac47b0b38d0b4dec9aa4c2b4ab16e66780ae8589860006ad4ab72bd42cbe4275942f8476928046134b89922b39e3e527dc48f7f5433620dae3ac140747053789149cc1434053923ace9f5205dd3d1d7057dff6b316535fdf508bb91b4eec6503db29bebfef73302300822fc4ec4e39f5a5813bed54837468c739e43a421b2d6478f12ea5a5f37e26bbfdd57ccb11900bbc3054687edfe96f88b59af5856e87e90e594b5555c03add6fdc0b62ff3c48577b3a9ac720a3bba2d10958d79651c3d5e7db9bd701e072a25799197e615f4f4258b7c0cc7982b8ea89033304a0c2c23eaa24d26b56f84d82b139f990698906209ef8df440144941b435c891f6a2ea0276df6f9e9fd36ba636284574d49eae6c09e82e4c0a147bbdb2a636392bb1671862f8c8ffc0929e4f59da3dc02d7461777ba48acbd062c933e1a61857124bed102865fb4a8bcda191894ce19953aa6f922a351702c570cca0e6d95cc4757ca61fc76507b82481ab538f418ad6b225abafb0fb824d0b8f1baa9597e5e095d5deb5a70d7390e1ec308e2e3a15a62ce03a73ee6a827e50d68b173a7e1ca2133c26f2a0b922b06c72383410b75c8911203a7c00a2920ea891c0940d33939e0d5098b42cc31d6bb6c0dd8c03e8aa2465aa01597ceb533acb3059763273ec053c5fe1b72f9db066a1a5fe216004b1d8577849b6d5cac89101ec453bbfd8d571fc08087d0353c0413b02fb8956522fa871db4f4d734e0677339cac50199d070d8f592b66503be23ff44104d5e02ea81f17234cdf33db122b5f5540432610b4700ddc6183d4528288d692f119bfaa81a33e89ecef970b514355bfb0f4bee9800c8227217db2514ba6396106bf603296b17b3b5e9c6512694de41c99c1959398800fd9f0c0cd0975a2df0c477b45d2f433fa28ff3c7bcc6c543428490e9c2f6169edf583775595f265f969dc11d5f1679a8cdda1738e64e2d250dc8b769b08742002f22106d7f752cdfb1af97e4236cf11589f82816b065ca8d1b159f49c9ea06a7b5153cffc0d703a94ed67dd58859311b72b4f032ab50d4b10556ab415c8a6b2bdffe62deb01c654af6f8c1f29a4b91d9cb1c6663485965c0acad445cade15282833c0ba20e821fc443945eb783d4d22b0283522e59ac6b8fce4b00f5a7837bb7943417288442c286f2c869f99cf41c9b91e70307d2424b4b831f0cb78729c7 +result: pass +shared_secret: a2b9e1dc08b711d8744a6533f3c9ad42097526e8e7bdd375b95ada3e20af11d9 + +# Rho leads to matrix containing zeroes +private_key: 00208080e8b3938b09aab715a0b7a09314c3d2aa03e900528a209c655886bf0180a0775a1ee133e543c17d7c24407131f0b813a9287c5c9939d43ba2c1f064015c1babc910d1024bfb46a3fbb1ae13dc5d8bb4576787a592495786a53d4c172cbd3b2cac6a2f5ab68fcfeb2a67a997d809800615c043e4bcc0985de9d671e6e0c8b071a20264c457c13b1f4734f234142e86c23170821d068210b29358694d8ff27e89c59264a315b6591d97d90ede633b68fbc36ca96b823a4bc66144b541cc118b0d60a66c89124d9080ae30f44b9f4793cfac65ab8b8cd65ac81cd95de566ca2c19906a955a04047052a699e8a132e2e48aab916278c49ccd1ca0076b5254784a23f7a8c164229bdb9b46e1c7bd4c74639053cad5226c598918687fbc50323f086238366c4ad9172346626b54ce142053de67ce8867cf599587d0a47aff0a7fc113140c18c40bb31e2340822cac294aeb3a02652b424ac9f1008a592ccf70170246e689edeab03dc0249ba59fcc6477fb668038443bf9a743255310df11b4c90a97bd212a74d5142bc6461a135ce7376995372a1bf919e3db20f22c683f488395a95e31ab13aa707c59f22e85d892830bb550395633f6c87df28401865106b5cffb75729391767522ac236072250c6f4dda196a90bbdfa183113c5fe2e31ba1187b4f682399f3c6c0288977904ab445c0c1b9caca030aa639b35029657c1608e3a654cbc39f8f096414d278059a6f56c8c838b1879b00ceff668190213eb15184a57706bd8c9111667f52a656d161bcb5e7cb8ef5beb6756371ba4297397eb6d0c850aac1e01025001b71a874a25e3ac16450228dc33691b3112de319f69ac29f2a1cdf02a0cd77319931003910331a6268f42669f4a90e79bb820e5c98aa252dcbd056318a050ab71f5d60028fc41594688cea4a95b32529c39c582ae828016644faf4b7b1fa6fd9c305807c43dbba54d44273669bcf956c197ea3462a30be3aabb1a6654dc4a72bbae53982ebb986e249d9438d66b65fa15b723267ce1fc1200bc26656d7c4e1839e02927a96304460a34a9c0a22ccf15c7390afed4a612ef236f9d00c22d04cc1dc362c08afd0a16536985f69f6a15d6585c410ac7a39599c683b9e67a33ee299a5000c7e4acde611bd6c817b1aeb1373835a245b916620be6ce8093f88635cfb619a963c99785cc5c354e5d025f954071e380876408fc5ac7fbbeb4c532b1f1be67ebfacac4cf907be9485c6da8da380809ee102af0c98beebb088c13d29830e7fca4dab8c1e8cc87a3b4198c50686c82626c41414d50878f403c10ac905f39a901405b93366a575338ed7d66c0a27c9dbc4af2d217688dc3909db8878000af307a989234174363f3cc35c25a42d7361ccadeca25a484a01967be2a65bf4998d57943759528d54e498ab18514a5665b87c98339c3fc01baaa2953abc1aba78778b26d54bdb2ab69dd705d6953dea404adf8c82d29b932e144f48a2661dc2129e6a2a1bc5242552374a504e0d135e6cfc9fb91a492e443c608c6e5342361aa8205ac744ecf974b667a6528938b6085492298e97ea827d5a4274ca359a1811c71a574dc986f4262b2e29256c4b52c9a22c3f168988ccca62e0b7d8cc8d1d861dd052bd9bb622cd8b769551c2307c82aedc92accc3d2c67c3ecf8341290af6c93a295fc027895809a081aaaf3cd0131174c8605c7fc29ece47036866f7fc326f7c947f70852356410e22700b5480897f288dba24c494685ecfbb624bc189dca10d9307595969145b21ef4ca1c435b3d39555434e133f8ec8c00dc49f02788041a6deae40ad5c9a3198804fde6230dc25b7f86a86bc00b43da73b5b40e3943096fa4540a019817881b4421961e293250056300e273f3d87153765ec237a79a16ba89a960fe42aa887c65fae65719766c44b2b8a0e54e97aab5febb1c194939e11928258cbcad6281cd37ad6033b1c9982df721200e36cb70326403422519f3afc3451af15969c2b26957c452fb136db18357516617892214c758cd9b556a827434c9510a5f6094bd32c8633966eb113f9e4902b6306c87732b96542979159ab49a170fe71a23093c1aca70202287d8288fc2f56072ec7aefa293015b6a58a2899ed79d4a09701ba42d26c599d8a2164204563fb90ff7372ea1626b61157361758af813446a455edf8346004c8f1d8882c6833b7d6bcbd86abe3e448006f0598a288c813790256b0c5f0332e06ba2f7f61fa405752f509550f86a18bb5483800a7329486f310228e9b467353957291eefc5ba630715ca177ec73602b1cbaa4956b37f1c6cc8714702b882686bbb8d1a19bffabf06068f72563437d37b33b38c476366404a4a6d17232e437c7bd4b56656b80eb7180e29613dbb4dc4b45f9d6909b07bc479126a4ed1b60d276962c060f725406a6641a29c7b87d17e29209c5473a595f93f6f0b6c4473afe95b2d0cf13710b12e4cc094f71b8f6c3cada16370fa4037cf721d56f1c5efdbaf1c395fa77175abe6c9fdf3a1a0b88f608580c1024dc319cea9836cb3f70e0d7101117a3d8e8841a92990d30cae17b676287795dd9c0a451450b7b75017881a210175af8a6ed69900070192df3195d27756c303bc82bb93a19bb805820177a07c75c5c1c04a8e61566ae62a357d6016e313181a260d678cb646a3cac063caac952ad4830deaa1b2bc4161b7c23c31356442e2c851ba64f1e99abdaa55b3b9a2fab0c172a3b9b26918c0f6933ab74fafc700255a59f3871628d291ff56b8f9241587f5a8681aae851b73b0a26363f2263035a271e883c5fc8bcc653c910924c202b103b4131325273e6246579939dfca8c6e78bc47e686841b629c93cd7dd16339d5b40cd8b34a289de9394c40d63409cc97b87860ce54c647929d2fc84850443a42a74a5dd67cd14b715c7535b28b01dbb3c0c3793b438b6e56f60347bc4220e695459c402c94aca43b9382a47091b0569601ccd7a74b75b868b035a39b9617a10953e468558d5850acc0a7d83532c9a6c5929ca3c9bb8fa16775457c2d9b320dda73bea9d2047a0c8f62f78f5e52ad9188a851860d1015c15f89395cd86822faae4fd2354610a608b36607247956e68bd4c252d7d68a4d58c3107465748a31de880be3230ac6714a33b4c62dbc711f5c0af44a36e6ec7ae6eab7ab954dc1f420a569b53966141df1566c73290a530d4174c198e5c5f427838f1884a2108c85688a16436270002207d58e75412de7255a1544c7d8b43f60bb2b93f45bacd80f2900cb324ac271c98a95f3917008ac3940853c13a516140fdd0064f646aad67b5bf1b966b68a6c795b2f6742a9d68228f86a60cc210aba894ed84859d990c10cba5671161caeb59c497c1b2ac52df6913a819168f8b8343654120a459ce5846a6fa777e82702fc8987368c05a503b57ef7304f862c55b9848a461af1e4383537154da27866a8ca4ab4af01ea4c30dcc59ecc0c9215a141996ecfe34aea6542b3b8c917c98ef574b1ed006977fc7b755b87c6eab128f6bd4b089359aa74eef351302335561303d26c24fb327319b8974c165e77277db30035c84a36534495ca260f7f76bd96396dfca983c89a8b99735486a78d34c9580b691108f63846183659854fe8f1168cfb9d1f5a05ac8106743bb74c1b72cbfc0e8ef6be184751fa449795bb1d0b7ca37dfa8f3979bbbc09a13d4c47163a69b04cc013795d41b0033549c3d84b00c01b1a9d7104a9d37751d08cf0e8132eea86b2462f37d660df4a3a095910b5ca2ca0da78163bb79a181e76dc619283b6cc670ccf2b1f3862c57e69c2b5cc293b87578b190710533bd4fba426f3389848919619c5b41cc5244a368adc40ea2647e4413dc9114e22749684923fddf2192036b83cb870eefb9afaac2961e3869ff0554077caf6d1aea720ccc59734c0a5465b7768170b323ab8c65a2a82f1267db4555565833d9f19ca10400d513bacb055c956c622cd7c0e5c54b33073be531c6586802cc11b75e8b0542f80b99639021d89caea41644029a81084129ffa66a66238c65c0f5562bd74b861293549a1c7cb70b6b3ce25286558a43f318d24052a196639c8b247bae6c59cd27d0768492b6b6ddd2011134cb9d9964ead020fe8da84a1f910aae304a9c3756112331e62ad8650544b5111a0977325c6c9ba242271ecb0c1a3c753543413685e46a31312c68bf9175a8b110a6816b6aec9562b8322b0d932f9692b1f29c6e3424d45686272f00f22db854fb8157594ca7c7b018b01c1f1a23028a4663c6b258af445f83c97f652954d619d7c68bf5e10046e7079f44b05b9c74591988f328443c1df34905200000000000000000000000000000000000000000000000000000072207a6317bb50769a4b1b8fab5169bb689d3c5defdb61fc74b2792eadd54cc011536217ef54eccc82ada15ed86ba2003e177f270bb5aeee52f9436e31a379d2 +ciphertext: 1b5fa7222ee14e61e4532b01189d576a2f0c0019705a424c3a68c27da592c2ad20802204e58a40e5c4b88b34410e000dedfeb719c7541cea51bd176de9fce964a96006c7ac87219b0114d171d89a261a2c08220ebe532c48ce9db09c791824b7373e1237e82a6ed491d71dc997baed4622b5d4e87e5124267a3b87cdef166d6d1109e2258f5deca3390e750f92bec1795f84f33ed51e071cec46baf3704afbd37be4603bb4fae6795589228be43598b1b055cd696377481e6e4c5b0e9ca39358312a27fc1526814d2acfa9f4a2a4820294dbd422715ad3957cc3b30cbf97a4453d9d6e2b340b8a6822963b19b5213cd9707420cbe5183ebf969d9a1d7c02ad9b02e7c0f8e15903891a506ac9182b424e4025c56b8f8adddece1c62a9593c1a1b83e01239f3582b3e97fb55a639b29bd7501c7008801dfb67716540cd9fe51ab5340f6277a57eba60f3fa755b141eca72b5cd33d1f51f32c32f15459a60dcc0cde1ec97cd3574a70fb835a8080ae180b76c6894c01dbc81429ab00fe1840b4ff75887efa840fc89f3baa828bf860c6c394577edd9490f14d9bb25adf5fe7c81f2e1d5ba110e3271ebef0d42a158aa51afe9343036d86273dfcc01a414d2c89a05576545466c1d2e5f238ad901d2b1d042476c71f8a3889202b25a8b73bab3209d168812f2d495849ba309ad8a51195c32a8f9bb35287a2c2d3d75976748d3660db6c398d88fd84693c83312823f886d839dfc7e56d93ccef2c8b8b64045347870489c3a7e95383429dc78978038649742755304daf1289c74eafe56675cf8d7aba5b737c4d8476748d31b2c02fb8851bf719fc36bc45a42dec0a36c0d9b0cc12a8baad50b539ee36db0052942c1a59081f0463a57792e954f609bc14316f674877eca906f3bbd25607a4c076c9fd0e85eec2a02a767478745c563fce06833144074de383ef1c50d1a135d51fbc499267b2f224fddb0c8d392fea01764e38eddf6ead2ae01f30cce05fd7d62543e3dcce21c76524c52afb252eac36e10d8f9aeb3ddd450fe18bce8034e154d4b0c5d5639bf745e2c8e5435c9ba7db121a780be2df8ca2fc98d41348f2830fc5e182e5c88dff7c88429762b0459ca7977d977b14cce7c84ba39c8cd012a3b15f4695338cb3d6ed991ebd20c853328bd81e037f75e82d85695d56e10973c88b33c88d70b321818e62ed15f697c3eb949d1d70e91fb8cfc3cfaba12dd57beb2ec6a2ee80cff28e54ca18e1686b2674156bbe57a9a8a1152b3298c56174550818fff9beea0c2d6ce74785a0cac87c7ce8a11c0a8eebb5070ad79332e15961bf2413a793beb17ddcf0cf805de33ba04b48ec1e3abc05b7c81aa3277f39d40a1509232be61fa8dd5428300d60efa05329162b46fe3f6973ea3adfc6c11440240099a3d65dbc1fb0996fb75677bca40dc764caeba053106f74f2222482ef6f7617ab0ea0f97bcabfcaa8442657419eba2970aa5031245760b0047ddb8868997edb5a5b443277d00f8af3ef9b024ec3e0ef2ec199685d44ab4e06cddbe4dfabbf336488fb82f64edb55d8f7e52f9b21b2f984507170bd4b8881566ce5308401b6a06e06f2217f1160f5550555527b71774b47e619a83d2c129beb5601ab34810fbd16f7cbe6597de399e4bdac009c6d5e891b4e1b776ad16192437ee0b3d98f528a6e65d17797debdf367a202a9cd017332f6e36c4a6a83481bb859ca6613e0d2b34dfbbae2c583e4936dac99f45956b966452a9c68bf1dc3a326d6d38a6a6da2b6975fbecbde9cde0cd6af3e1cc8a0efc7cfab8d4ec0b74288bc319df5c4754c77c5071a68056f9019aa1d51d6ed28a99d7fe9125d04df0d7839810f2d6f129ca61d117169b0f272af6eaf080924c42c52acd3f28abad80c8bf0d2fdb79ec2e22c6967c044432f381eef520d0f99916fcaa184c81e820d894f9c668261d78daa3a62d11f6a82a2a803166b98cb4568f4cf8845fa78322fd07b0692790a80889e0f54c042b61737aa721b62c8b1f1cb5f01b6d41861b1c614d2f42ab82fd0c878f2212271429383de3496757158b50c451542751ecc49b7b7d3bdf697d66b042e47c33cdcb9a084c275fba27a94c349565532da680efd1caf40a4dda1014279d4b6a530206bd90bea3c14c1039b570e351b13da4a1af2612fe67c3ea4ce4c623fc4026005384addb19be959dcc24857de3af02d5652f9770 +result: pass +shared_secret: decadad640367b73f7c6a9e5d1f9e6dd576350f841e9d8eabd8d525fa8b0e1d6 + +# Rho leads to matrix containing zeroes +private_key: c5f6c739c640b093956cfb9d54272b3c704d3b364ff1c68510b875c8c29f30051b5f60b53f6341082252746b8d4eb52b3f77c818d42ac776ad393072d458a28b186da2b61cf64bc6d8b424afb49a3b2528d4863c876aac69b7c7fa95314dd36ab5f021ba8c575ca458c469409b71b31f3a8e371937405067951c084b6a832ab321642c82f33395b0701e5a677c3c783a47d7a6e474af454c1b31b174ce5285e90608e1932493e44bf48b921d6a58b1b86ec2a38b8ba2a1fe884c0fd608af3986270391d1a42843637d75194722d31bc81b2b507ccc0fdb309e59549a874d09239bec5a41c4e9bb48d6968152ac9d431cc3b290371296b8056ed56898b272b948e556926478291cb0eb1bac50b6718e98b74a1777e685b7b6d7cd6b22bb5846c69149b4e7b292a4153763b768cd5a67b65c3d059464ccc123ac086f9f41c3395a56ff3152fe149d76ac2fee2079653326bdd82dd6f66b6687a7fbe00d9832b09135756c5819b1f66dc44c7b32c2496f63cf077ab51b8626d0918030134b8384c565f0715167b21fab697e84c6838a71176748f12334078c27dda3133bd44abd69bf631badb5f2664f2857c033102ce8284e4b2beb9095cbb40587bbbf457054f4d11bf938af207c1cdc5217b0e9797bf9ac88f3943873c8b66883d2ba5ec7e6696d50a69ba55457853bc526819f1a6fe09973fbd19832312b554653b8441e5eb01884e94a355732e3da645eb849f520bb2bb4327d560612852152f8cba2f77db8d21922da08e60bb9e3b39b9b85bbeb9b1715982d292b8f1017cd3e60447278cc0257898575a0eab1408122bb3fba17b62a31902a567a0821d42086aa6417c259a1dbc93b25003fcdec9f6a5507b4b732a43c444c5825a05119cd089fb2e569f70b4d5e6919faf15d6eea641f5a2875763f42b3991f7c89fe473cc057c148ac58b6c88dce537da8632c10ac851f8916fb7b6ce89ba5053b8d95d29ea5d36c91981042c4aa1330aa098a6ab256ade08592a05c95021606adea0ab637824214009c2b915be450a1f7434ea2c7f562a4fe21139c2652ca8785af3208f4927abae698dd435e90e7474556af9b907f6d73c4ee64897dc74c6a876eba1b598e784b8094232dc62bf1119ef764bd1a3bb2d4fc7de069273a223abe5269a1403873087906db164b58435ef41d7d78b36087062419123c8b1d54da918f34920d3302ddaa300797b32c1c81b82798e421ab2589964334714a75cc84548031d5810fd87890a1932c98bad37c860bb15663cc0e91880af1947b8a26be9183b648b714f763b81652786682c210301852776aa673a1fde470afb56eb0b0114895638c609d8d55585d68c165f7aad64c1406a165788c3364667f0a3c65aa300fc4585e959abbc5e1b316aa108a1cbf703965a74475147a2d323b7295d185571000e43b9120b76fb0105ee7a385965026e8f8309d4badef88b433a59090f88bc4eb4ee2f6c1f0d880057b477e628bc35b023a4c9ab682822556afeb32b6c9088e35c107e2a43506c43a986a0420f5164167519c4029b47bc81e93c1ec149e6083b13589bd2a9c64fc6247ec323b8cb73cb9f9ccfb8bcf25617a87a3c2d8b5158ac8661dfc789e92cc8cb39ba3237b6f13c80ef947630578d2d213f1914f94c61429bcaea77c646f1b99d35ac8009907ccf604c1211ddaeccc2f1001b49776df94560e5ac35e0a7ee3f39377e252d83558d6e57651b0b3c0365e6a133dbe3002270a0bfdc524e5d298b42c1408e17d155c82d69c256f78a69937843491153ec2117ac40370934d28783a69d0a02526afaa8600d289c27e9481cb737cdc4b9ddf53caf313b3c4b862b08045dc38428b126622d77ff3864fa93919427b049786042d234429e9858ce7b1d57a2fe92979851b9d4ca23fa7a80aa4738c9b777020b857b8fa2e442522423608d51b78c574569b9746e441bed403ac21391fe327818dc81355bcb2f5758320965e10946cda9a7c1d329f7c1720857c8751e57b87186e8dc21199e3b7ffc1c4c5607cc3c258a30163131c5db5d96e2e8c2f209419d5a03dfc618a53b1799cf102348b89ba289fab2b206f61688fd974023619fa5187b8cb28be778b666294bf029d7fa9abe3ea739f131930a13629bb6fa7221a788591f595911d3c8a6625a0b69847be058806d916fa0a458891821a0099f3618274091336ea37fca742ffa5bf85a845bc772ec2abc4c9b05aa7e51e8291aeef2a05cc185aa2f438d56026fa0ab0a0e8ce682294bb41238d358dcc1016bcb97ea4e01918a516cfd658ae753f4e7756f08b247edb899ac8b2b11862cbf92a5966b68e4cc6fdf66f0f14a135753ae0f5472a3614a46715fdc7cf69bb465c66ca82e65bd263c5bbbcada701844104ca821a6b5a914301948bc20987229c81d2128754122c1cd3c43e2b4b6aa880d0c203cd9490b7796c02109c2875ae7bd284dec49ecd22949539a2f7c792d351bff0c26f8721a86e1948e08a0fcb2135ff7ba42e352ad3c3a4d1930a26034ee75b355cb299f2dc375f7462f3801c1a636a87d71fd0e528191c8b1d6c4a1aca21edb82825056f8623975c54b1aab806ec623ee50c3c9f954b29212662b7530793c4e3308fb5610429519ab35906834923b053b595f19d6be33c5ba4624dc72fc5488a98e0c7cc9835a161ba97e72bd08485b2c59fe2e56cf1c5a091f389f555c7049c9a74b57af3b1af1263c7720880e5d9c3270b338488279a27c9acc04409d612aa8b195dc5c15bca57a4d24d8d10ce661509054a23c0a0b7839c7ca0f77b0524721b06a8f92570aa62091de06d06783562ec9a0a795100c28fdaa06928dc6a9fd106ff05c2c4d4c3d193898661a4a39583eaa9b62cc282c04c872e145b42058de4467e3f22cdf293723299565d452219c3740bb65bab60387a3321bb2b5ebe585e85e4a2a5882c72919caadc9b46495d100081c88964c87521ac22127e891e1b9709954326b45cb35f5778420b08773b926bb79173130d43aa2c586689effb567fd165334b82ae4c6c98f93b64d99a44815877f5476583ce363196d0257ea472a9bd630f2fa64585b9ccfa1a2012822f6a004cd5959d5793adfdbbc5596887b5088bfc5c5af9aa35e5b9205686069c55aa7437026e75ac370bbd40421df7c21350da1a5b13b651159db592bde2078e2d8cc374d6833cc91bdfcc1f19d9676e060f2baca39cda1dee758ccd096545e21fe2cc082c00374d593968fa8eebdc309698020a29910f3910a1679129791c02f94cdd8aafc8c007c96411835280e148c4109743c8d168ea645ade7c23b5bc26d4bb083d0a4833f87e6d5b218dd73b76810216f9658a9547dad241d408bdca43cf792bc2a6438df858ba77d01c34c54ee9a31c83e472d5f945fa504f054443851a9c0d59734f175795a86ee2847d7981654d89633f47a420b5bf65920b9810c5512a4d8e19aebbcb13ed0a87980891799650a88b8dd4eb7985506a581110439a0f5afc8e998a7477e8c4b54872b9479b36f2378a4cc97b3208be2457326988e4a13b02812616d5add646cf0f5a8f5458b8960839f93581db651ccc5238df417b4ec6a445127e29e44563a7b49eb403c10a6edb624395c58738762009a073d1949149ac8e69e8014478a6701cbe140411d2f1b95376afac6988737a1b9278a2ee5b7fa4c1cd89b69f56f2686bbb59a54c676eb357a0602e8f8a8a914c745703bb7542c313461d1075beda6cb685832fea735d0c573fe744c16bb52b8e7a7c8d049ae34891ef0ba338614f300033969403ab4677f2179c8224bb2031b8e891a8d0806819abce1356cb2c906fa2a17d4f3c4ed0b8cca831376f67487847475a5b27206a18dec19d29f6a8d49737e7b14f2034209b0497474a3b0e94b6ba190d2793c945cb7866b3959f7b2721537b77a45ba6a259c0153889141a1f9171e4503a503802b4e856f90433063b37ff00b4fc3347b99539efe3cf29b515dd7b700b37871d926f699499d6699831e18cafc00619b35e58555a40034c22bb430fa23854c81ebe12823b92c0bb05b2eef1cef35a75ba6564db9122ec125952260149cbb8e524391aa92b82d13de624c0368a9df175c5ba9b99703b5bd1b918eacb53d78c86b362729a01c2ce905c4d5120e690911255be11b39dae9b8a9b60191790b59ac5421473237508ab327811ebe955e8acb15ae72019426573e314cd775f4041658e85b3261c3f04c32d04e58b3393a81c7b4f6b2542b2e27b042027f9a0b40947a919fc80e87a8182508d2b4264fdc9ce9786ae8ad3cb041274b9fcc575291d74c3b95afc31acc280297841fd5549083120a2fe78991e000000000000000000000000000000000000000000000000000000bbdd2fface390c0376fbaa97281a683c4dd79d3ef4d3421f88849415c2c37af12e8541047591efe1847559704339d0ddba611d0ff8017cdc84e61184715c93e2 +ciphertext: a9560cc3bd566af9beeb59a300ddad8de5a70be9cbec8777b625f9df541f3b7e3432edbbae58624ca393a7c8466654ad4e616f302946f2b4e848aad0b16d6ea8d19faeff99df0577f422b17638ae8fc1c23b90de0d3b0aab0e7f77d81d4411af93fe1fb038fcbe8b5dca3aab65b63b767360ff8d314dfd9adc924dd5315a591946d7e3bb9a8d7605d4168255e2c0eb5e5fa2483505cc5e7e25203728ff51504c580ed157bbb7ea59702fff5f39c67334332d5ee17ae551449ad402b9d299d7519a9d60efa56a1bc39c1a3e12936ad533457fabbaeb5f4016c39deeb95bde3d8b62db69aefe698e9ad4597762589f20771171623c3fae08176cc6b9904fdcdcba42b1ce7ac5a4403ba3f38542160bd235f2b1a9d2c8735e86ee7af2e749508252a34a4c36bfc82573b856ad0408a95b7fbbfee254191f744e0f36d698dbdb0e9905e2a5e4efebe76dd2af71578e5dd28974f393afaa581e755030a137ff7a912648e6c1c9cad9a11c2fb22a028cbecb24909ecd07a53b5094d035664ed822561daeb8bc09c3be6f351dbff20f0bd69c6dbd8495460e55710e2e26ca39a1a90f05bb44e74cc0fd932296443a39b968717b5d7bba52b4313005a7e917a7eef4561e340e42c9d4730a8ea2500db48da0aa4c8086a038c00a5698b1675b398cbdc8223bf2ab069503e574873ed015338cdfabd2c4c8b349c6889732dc737501f9f4804c67d693722f3723fdfa21130fe621e1e091dd6dd63cee53f643f105ec486fcd4bfcafa03bf7662b2b31f0b428ba30636e2672b4114c381e2ceb631ee4b59604a656de5b13f556ac60747f00362ec577381cb6263c7511d1b4b6b5d55dfda1861bd8ce2437e47fe8661ce3af193a8ecd2e3fb249a7b82c9ca905f38f3072b25262b50ab205d7c210ac62783f332254ecbb013e0ad36ec963d62e69e085aa6356e1d2027b6831cc7ead70301bed933823d1fa5d157573d9828700668593dcc60e1c8adb12f14d61496d90d38b9be0fc78654762c4cb32ec66fba75063f1d8f7e83a3e78c33a5fab61c80e73af520b6d013daeb5d48b0308a5c30f86aa19e64743d1bca73ad7336b7cf2b9a309e3d86ab39882bb6d3f4c2c2533fa3a4c650463d3992ad0ea1732b2371b62d4c8c98dade19edd0eb1462c830e67ff7413d890d30d2437deb5abbab57d24411fcf49a2cdf997263721f1a36fd7e32ef383c3ba460a983c61b2463279330f24b75abf6d2ca977727696f336220192a827d13d74d833d038647dc6720769cb316ed38e9e60ad35b00f21eb4c9076b16c79f8f3bbbed9fcbcf1f0bd70a4745a697f3a7497996953604f29e4ef850cb96735153fa3f2416229cbb4c36e85ef8f68a607d77c48f4a14e00a080c62bc2094dab53d39c7a75403f35c9f58aeb25b075c9258c2fb23afe18cea496ec56b3f17cad7eff23bfde253eac130494c0715e5dbf5a565bab2998d8d0dfcdd278b863a2776e1c97c8deade022f3cbc190517d0ea91d0e8b224e3eb802795f730fc90284b86c265ff0d9b7a5de627859be4c7c8288d22c19a638fc80836aa30b948617b3d4f086f337443db0eb6f1dde7e854525ce5028d3fa8d45bdec7aea94fd2c4586ede8a23cee74e42024c8875df7c2d22a10dad2ab7c677242bb80d21a52ba9fa299c046111838c5a0555f8d11880d35e6434bd66433dd9500febab247e9c220b2d97d523199e99597d0e83ad6c11846c42fd04b2831b4688b4b338519037e90b68055c4d10722d933b0c90197979be263b884e7ff11d527b532fb17e1f8ea94e0a177308c6e626d6deb681b2083f9960b6d9845069b6bce1512a001a8ed694b16a191023cde941a525b94f225b55d12ec40bf92db4c04c957798be6eec2c1f377be77499739f48c9561e83a01c49012f134b5eada3d662e02127ddddc7569c07499fff9f8f341adf25ce79bc46315c4dc08b65ddec14275df0c38ced826ec2e21e3acac3ba78860bf829b5775da4ec61ed0dafd17b79b671629c0f10a497ddc3734586e8c6689d087ebbd63c9ca5d2edf349469ebcc31e81c2d6d58f2c2ddef32b4b9986bb64ef8816986758a616ca4c4155d126d357f0571b172fbe6b7308e357436945bbbdc70c831f60243dd96a7c617d040a6276e4d9ce07c880cd4feca2537127eb0eecc6febd22c3c92a3110eb4c4080e88923e56bea4e5fcb76c450442b89a5cbc230f +result: pass +shared_secret: d31df13dfb22d68333814c817ad444cfef6378fcba2edc372ac44ace59e4e9d7 + +# Rho leads to matrix containing zeroes +private_key: ea53a046a53b7e3298d588b38c403e67b5620c5c73a438ab7357660362ab3822b5e774a9dae973c83a96db79b550dc176f9b0182d37f12118bc96a4982249a352219a110704e4a0ddbe545e4f55cfc2c50d54cac33ecb6fcbb3ac2a7bd4e41282476797a3c24f4ac4f60c33da281cb1313035c9c804d755267894d867469dbfac7be52a34f55c0dc642354e52967b043a0e0167c806581b51519e04af675147578c79f492da3ac0748352c6e5c7ff462008cb42e9817155444b214c3b93ff3ae7d44b5c2b659627a833cc18ccfab4fe6d6513dfa67cec499cd7a0d052a5f9ba378bff75033e69ad053c04b74c8cd756c7cc0bd494129e069cfb4358324066415bc2a4d1cb8401867c9954aa8a33f929ca279696cd515bff0abcb6c8692aa9cc076861e2bf27ec360983f775e9f166964d0c43c380366f19d3f868a7e038752d30e389c0c057b6d93a9ae64746d5b3a146d31269b94c7a753412be68d09d820be6890e5db1ec3eab1acb14cee8a317ee7ba0eb6027f13a540b07c12cb1164bc7d295c16eef4c8d9773bd2d32ead764f58fa48abc2a5491bbe00e07965017ebf40c973343704112bc90849d219c70b028ff3769e720c4599098d172674358bcaa8947ba6b874e3d94e623122ffb3984a0b571632be1c540cc5da45ed1c57da1054abbc4456678249a2589544c3dfdb6330ab35416ca49c8046c9446150660b45e05b720722bf390e307445dd8a3e23253cbf633c8ccb098976a68e481ee86b86a32865d9caaf385842cdd071b0974e807710e2b44c598a4a36bb2af048b0fd30bb6c64a539513ed2a5a9c6cb16129cb88d6bc62389b4846a2a0afc532eeb0f055aa85ce7b43f8099cbf194e664c59e683e535ca809d40f72d4a3d5e287b5ca3880d4af1f1523b60c8f811a17b2881602ec0393d54988d63a1620a48ab25a5336b25ca25d5b21425ee54673062020f065693665c68399691748ed8c2b6ea47b89391e7dbcbb3e4bb8bc0972916aa0ee5b90292b23618c5e9a68bff8476fec1c7e382b1cddd45069263a507c44b97663a9c8b4bc690c89d25893c4caca0caa7633bc66f449bc06603fb747843b0a8ce11d46ca100b3243a8617904a2ae48db08ba24bacd5b946cc96b834491a246850c44a0f049bb3e099b3353b28c3889bd4520ce75749b745e65e6442d970e917362cafcc9cd1a6194d9ba41f29feab98320e10234c1b0fa367f7c3a420052a9ace9a0787bbc420832db814e8f86804fb74090146f899a624ee9739ed55c40b3716724b8a8164b8b976130d89e15dc24e2078f24a953b2781b7d36a12334356a6998870a0128ab5152a89ddc84aca3475f8cf849bd762ea7b23bd2d743a9d3a9a2c2ae4723b5c1a3b5349a2d4bd2907d89ab8fe80624838130697bb1d45f873a3416164f862630e96075fbc5192be26755eaa1f33026a1f201a05b6b57ccc83fe9c191b13016a921532c4558b44ff0a26c864c3102ca921c299b38199f7162938387c3598362e5f616756bb5aad68c68e0a34ce96684597712341f391ca6696538582ab0dbd532c7757b5b24b0413145395123f0c4668cd538782b0f65ecc30b687efa78183de47f53b73831210c513c54febca584a4780ea352e9dc85393457e71ca62e85abb2322aa45c4fb3d29b15d55a027b8a74186000b9a05550b2a343a3ac21b0f7a2b2aaf736a1ca49df5b61fa749266b0696ad7b6c48b0dc82803b10a4b64d6caebb33a13c60effd699ad44c1985c9e3f8ab21a0cbd728ab52e07c4bc5ab3f6c698ea307f435bb7b5545c44758fee3b9077b5a318c2b584012cc9b57560236be789bc4b026d1f26a857365b2d1a6e809a9f71e140ec56c4db3829b74539a90345841483daf6840141100c66cbe057261fc346ab8c36b03cc2b2ac838835cd373836bca05d9f57ce2231980ea1bd9908111e79b602572ab37495e9f6025269713f4318dc472d06b473268bcc7c5cb956b5a1ebf419aa18b9d6f184849240470607fdf6325ed561c270b095079734fb61e04c531be893c2621c5ba48bc897868126b995e75777c8ceb100c67556484b71404be802ded5299cc41a83b0c7a99c8d36d55f7fdb4697c446904c2420d667f5e58e0837778ea960bb6605890b8437f24f7d35acbccc41acfcbf2e35270ab368424b6ee6089ef75bae678c685b685315456ec584a93ab25f67427be85bba701c0566544f8133952936a203923e07d5aadea1130d906daaa1a4d9939ce1e147cd874ca0f777f9023d156070f8998a9607940d15af47a4919c52b831748af51b41712077bb4836d383a33d802c80a133a388bcf0f3cfac305a7fcc3199ea880d271242a3a6adfbaa5a894ceab055a6594436818ce10bc8113c8ce0613fca2533088a9f35c4a161e0035d690e48b4677273ace7d2c70e378047e7b9b7c49b729a612f5abc7551756aa91239cb16aec08e2ee53659954cfe1a5ba8b47f36c47d6ea2885b8332baa61b71a9bccdca58e2f0cd25e9b40d38867f69574f98ceb03c3d18b9b6d5c2ace4a8b1bdea7e5e678f1662932c267f117005be498dda33b97b0c520b1375c75829d8e7cf268524f74656d033bb986977296b4997fca693281896681022dc138fb24d9fa5270626b1dc4375a72c42955529922cb683c225cc76ad1b25c3082b9d2c47491bfc8b83767d274b0473fa753b16b117546b8a755e94b6b6f7048079985632b33664aa50eb072b47a338ec12b3501b3413e6c94488546f2bb142d851fab8260665aa88a75856d1ac719341ba190e941b8d6bf53f76b968fedc28d0a524d7e366efd50c8929cd9362cf4ad9366713c2dcd4b91c45b6fe654fcb87a6674c2f3c9447cc546aa645a04cc3b57d8b1265d91028c3756d216bd671560e29467805a2ddfacfa651a2fe32731ddc74ccdc243ce97ebb7b2ffc7056b334a0fe7813cf5825997690b91073b7f9563749b8eaf46cd8b93161c21543592c21855f577290b9a6616e2c80134a3713f04e6c2cacfafb3daf78b9ab671337931ef7eb58a48a73a96b6739850f2af60ca0917e301610c5731b032ca6cd77554b7a7d7783c26b2cb43ff1c1fc3716fcec4455e516d164c561776a03c77275d52d1ff426d76240b8b5a47c498fe836736a09cba0b32983387f595593800a4e37b3764f054bab91731c748021818e4d149db358ce8b2ca2af45c6e070ab06fbb3a3485698bb955681b95e8932aa30b9d8242bff3618120038b3ec776dc3b635963ab24b8e5f9761162737b04a59fb38ba1b3685b3512133e25e7810c4cb26a25be67b314924728528dbdcc87ec53cade88b1e55c7a9ea43b647655c697331db555e7881e240cce208ab189265db243cc97508889a2fa201a0d1066c5d2a7370eb8137d04fe035c8510b9f21e6bd152872ce6c7cdbba87ec85341c9c23bbea14f9caaccf56cd41c60931a1970867a38fca93fe6a789f5b1cf99ab23fbba5abbbc881aa154df05e9dfb5c92679cb56b0f156c3b67e918de09c5eaf4288885c91fa5366f0854e320451e14a48261cba3cc671ab590ccea69693a25ba90accdb715241754f2f5adb67a6e6491703c0b803d8c55f6364cf64c3f117206013ca309f5c7b4b40774f98ee7738f70b5b9bb19737855bae9958f6b24b22d643753515f79b884c223cb9a734c634306ba20cffa79a5c5fa46e1501aac245523e2b1e42a44a953964727b13fa01b65eaac6188a1c9ab974c613cb5971bc8680e90181b3ae927b3b325a22389c204470e4c6a97e404437858910c61897cad27f00e2f7556639635e3775f7ea351921051684cc6ac224df9ea98bde524863683175447d25aaed72c68b15955dd1639dd978318a8347316690c24bea1d3c64f031aaa2a3b48593a7593b2047a8c29c317c9766bea878cfe5ab947f12d5fdbaa267a18ffe966ce629c25ac16b68aca3ca000e5081faf0b07c7b914dac266dd08109ad52408c0cc06524ed424638d1b7d3175bd977b982b26450b7b3111625d2f64a6055a59168c9ad1cc13773a8f4a2c79d92c08de3567387a2bcfac1186960d3c939f2a601bfa96bf9416022385b2d1aa2dfd570fe54cbf4cfa325bf4a87e734b2bc4ab576387c63590ec3171b41a5b621109ff0a7617030e02962224903d40c5c396413d8793c2d2044949659a92b4480e8123a8738f3cc12e45504dbd40a3a497623e70600378bb32d66dbce08eaa28303e896aa887186ef9107b023b69c49c0ff802fc504431ca0aae2008fbf39c268cce17f1a75dd8c880a34467963cc2ab4d60d78e96dbbc5e5611d955658de04b13d5ce6cd3af9e2bb3caca8e6a088afc7ba31f951b920318ee4f3c26cc000000000000000000000000000000000000000000000000000000c9f4f8131164a4f1f11c42ec9d4f305390b09294a7ecbdebe3659c77e737a1975ea63afb095b03165e6f3b9488778fdd771036713df7b893ab8777554eb05f64 +ciphertext: cb24ab9d59fb286f3ecd5908e34b4e5860bbd08ac3939825156f619e0c005de948e8698deb7a34462c5fb7730ef3ddc05b017b58edd91e6fd6d4df125128d20ff619e3e593364eee7e532f3d962108b31f77216f71bc9d5163acedbdfa48f94f2f587bd5c16e11b5480237e88f1260f7c2fb25d044d5108d199e1bae51f8f14dc5614b75996ecc3d067ad3cc6b294ad60fb9fa21750c7bfb53874c2ee99f73a494d0df220f054a845f2fbf85d1a5727c087a65436433b73013b9a6f26f08c1ab443ebffaa03a7f8f185f33b07b99400f6b03ab985711fb4ea97d058a8e9a948101359b610a6d428a3d10594aea5ad602bd83b05ef6b6aaa2f56b655dffd3db5ad2ba51d8d3138d355f2550f29b40bfecbc43f1a3dc7448640b5b3006b87a23f6b71554d8a54fe0d4db52732e8260c915407286bb3074d2dc56e4cc50bb14313a4117e78e29d83c3b5dbd93ede35d2a47b46a0ed51fe72cc7b86f96a3d9367949abcddbd9988639f8a8555534e23fad9f35fb132396a13f3abed73fed757363207043a84bf5fa6cc2bd862ca46dfb9a124fc0a2958a09f1f35fdb5095bf48b859255cf49eea771f10ee78ee460599342bd76ecc8ea35077c4adfc3e05c37abe4b45cc00ab74247ce6568b0395ec681de4f96af9fe4f053d08ab465ae580bf2e4bb54884bc90c75758a6c9fdff87fe56990cd3d0aa691f97e03d46b5e25bb6a8d2acdd458bdd60aa803f4a2e7652cd9901a385525eb1f2c619fc2ac3bfc655a40102e0721cb842bd1516894e31d972adf9570365c2d3acd23e998c9aa620bbd0f98b07cfc103389df202660a9a66e819e8ad4872cac9d11667ba07e49d0095b1470d793b0520d492b4524521f470c1ad11a917545c3e90c0d09c57153b9f01021dd9af03ca73f0d833a0f7d6d8cfc132c95bdf9713b055acd993f8070095cde23f5782bf1502268ebbbe18e0a2c2579f4277d2487173fdc03f787e960b351c0b0c8b676e6a9a1b2cbb8b88ed59ca6fa351141711349e70f13175f5e1e6c40b495c283f7f10eecd35fe77330b52b1dd5c198c1ab5aa82547b822b59f2eb18d3f70c2fe6d78a5eb960abaae74fc69c573948212efb77b7b58ac24f23e39ed35a0c52f00885c24bfda0336ae6ad827b83a0520710d9a039bbd2c9653d8b3ec38133f06c4bccd714087f5291a37b1ccbb4fa71aa04b6ddda1cfa0e4af9d531c053b4d3b4546894693e32feff3de7df191517c89d34bb3bfa4215d98f5c72bcccfecb97144f1abf05fdb21e2a4017e9423019a26eb70022c74d49926654e986781d9acea4d8008dabd068ded76190b76a6dea78e2aa33b33e5c68b43946c0f83cd3c162dc23392d47e6dff8ae4dc9ba44ede5ed59d6bd399110c513e52a71bed8073d3b791aba2dd34ae5fe07bc9f0b8efd5a275b10477773ed26687be2df6afca51aaadf3df873b7b87b221ed25e053de30b529aa920b14ea96d955ed4452bcc4f40389a9b8dbd8bf25bc02a99d0c1fa92e8d1f39013210268f766c5d9a8f080756791e2b9ecb7c81b10ff643262da8e63870b6e910c26e10c20643ee740bdb73c3ecdae5bfbec98940ae2cd3936c8dceab8c6156840463786e20770d7c2b89546a41b7bf5dc1a441dd8089d03b69942f3ae9823a29aaead42fe77763fe0b51803cfff169b5303594823ee70e56b4aa0d8d77a7a39181169d4c9910280edc3aa6841e54427b962846df3fc73b71ef19cd6f24b74f88740347ffed1c6b299ca9aabe8f17c9425da19518f490ce73b1418a41d7f5d60a14f74a51dfbe6170b4df1c908af859392a4df8e27168a35091c20b2a3ecab2e0713e26f97d7d571dbb2931db0d36997cba78a929f06480326a8ded29b0bf1199b654cf6cee8e982ce057a55ecd2be458bc8f55156be7db5a39dd5b5e62c0b178c0b500d79bbca5330cd21c4e213bfcb2584e2fde2e7f19629710776affb99fb442dfd517d49305d1980069447b09fdb411e3ff2df0fd2e76b35ed65b6abd6771e6e05977ae1a86145a24ccf8b8ea28758921a0f202cbdb629254059ea8f9b5f6f4cb4f69853e7de7cffe70c05c5588ff5e77755852b6782f2565644e6489f62318a7e2a29370f5ea90c6628bfff320d948f715ea88958974a0ff700b08b3712100e73ba7d134f107c304ee0c00c65dca2853e739ff2842beed8e5df18fb4bb3e7edd7ab8d7d6fc0f2afd92f5d15 +result: pass +shared_secret: 751052356086210d8df27a08a945497eab163ac925b059000c89b6e82b2c6bef + +# Rho leads to matrix containing zeroes +private_key: a7d40e120206cecb9458a1464b96c447db086780708c7435e40bafe1ab8cf26caced91b888711b8b95414e080c2be24d7a622c2e0410fb9c795a25a50554abe8b9049f9890e29531cca88e4284a5bcec559f939061b003510c8a23991cf474ba6676b0599c86dcc0976f3b61cb624954d3914bf28e109193ef1b9efdacace8574dceda34905485e1a79d51c8ba06722150d8a243d69f671c18b1c2a77c990699b72ef5b1c4aaa121a8e5a6cc971178127024166f2593893bf3b9e0db273040b0821051cab28af5196b8937538a680b39251b08051502c2a3d5504f78b767dce91e2116280c3532e9426b93d8cae3e9abc5aa4832c6bfb02a71559bb689f82c22835fb314a5e6d44bc4085eb39ab41555103033a0f4b6aabfc5246c93c07840254989301f88776c06c9f808369e18445058b4d940783d57b7d7901b0d63a6e6512b31a63ce0704028d936462c18eb4bb78accc3dc56884d9837d8632a258c4e998cc536248aacc62f7b9b65191a28a27a1cf44a0d512875ad5112e034c0adbcc67edb84eb000bf3621e7c1c5cad1cbd06f848c5d8c3601b07463b5c0e33cd260a2ec99a972c47cda74229f6292221391f37d20903aa76eb6966195acac6373a41db78b8f7515a473ba04397c2e94a26a6acd8f2cccdc572d4b60e56880fd0295152e18bc79699feb1a0b6f6c7ee19545f4124eeda5755a85d79fc2dddd2848216576e9ab4d07b7ecf77a74937cc1605602c62003dd5abaf601b55ab0cdb37bb3110290f829a742c5607ab24a50000f3191f435427b5345ef884b91811bc44fc4c6de32bdb0a73edf80c8783a5a6b6a2d06657b16104cd62ad847206ec1b87729260e91b2afde6b0f13a87025c10bafa88e1fb1a66b98a5308a2c4f10874324179a2729df786627271ac5a945072beadf878035169c543c0b07acc49241b7feb406f524b71c787ed757a3d48c233bb75d97c42e03b9973cc680169520e400b00879cf2bc9119325586719f22e1b2de163184b2c43735b2c1a8654c92138b90c458421f681136e0d6c417b20a5f8c126d3672a4073942855b127a87ce96c7e34861923b3ea9bc9f0aa277746927f0777814862b0845c3bdc12309241f387cc6f4ba4a9688b947ec8b5603ce88ccac5c35756d0031ab4a5e32f6ca97184df2acb38f724fee64a6a688c69f6b913576af98ea2487db097d7c81dbc2a29a381b2345495160c348e8207e313929dc08412304f6a01c90f6889e23b7974bbd6f081f52dba8baa716b53769e6f71b962156cd44a3f50563efb3b65741aa26e42a3720ce737c7a7ad5c875663bfe36bde03b106647ba1ef098569bc10a0940cd300d58571dd354ca5ef714733bafa4308b3c4b7528862664a8656d16c9c3837355e39072db20af20025306390ef32931e793e33333cfd893c6227215027ab7ba9cc0212ebc749abbc62be483b3e2406a5ca10d7fc534166646473c27979053928aa5445c4c1c26cde40777aca39f5a64161c322135fa176d44b694341a0d3a05de662ef0e1aced53c4ea2762c1333da3f987fac65ea63a17b55c3f681c568d648966eccd095928f2e32af2fcb0674ba3a50350e282c99af149ab1b3f52d3b9f838b1aa8cc5dc9ba816e19d8a177de33a855960b7c464cfd51a7279a48c80091ec357b9fd118e12f00736036fa8268079754a4d565773f2a5d5c913109a4606a276d07372eb96474c7722d85a17a50a956b3ca8132415b2c404a0288aadb44fbb00217c0005ee36137768c3d4169d300ab2876c1b2a92c0cf119fef5018bf7acfd2031929b9671898c64388898fb74a483a100ce2ae67275e53b00d94c2888f831a286631450308aea2580fc5cdbae53b7108a9d3cba88a437a5c0917dfa3bd7fb2266f2b2f57f52724b67e58cc2781a95191f60a34d74199102b5fe941874a4433034ae6c9aff9e2bf16f01781d72424508835e3a587903eefeb0b0d218e11183cc7293c81c09cb5fc4eaba4cdf22284206b23b87566da704665527c6c587aa3070b01e79094747a87ebb2b9e5296a2405528c224ef45ee6fcaf0c537fa2e2479d579d71a3400793188d895323f274077416f94c4e68811ad9c73598d7ccd53bcd18f8b1cca8bb5591298132258f4210d36722217c2fc5925330d03d1c037cc7d520f52b7752f8b3b253b655f962e9475e8cf792f5f99b5c4b440a166e0d18c79de23173d690cfb697f1d072f269b94a78bfd6196ceb655354c31f356806ab5c42bcb9030c6c61e3c3a023327fe813362bb69ed9e783b086a94581c41cc49c03489ed53b585febabaa951bcb642674b74a4ce35db92894c6db484ad10b0dd84b3e1b9f88960f4d7a9b36e580473692930a83a5233dd07a027c8cab7b4165c860cae41b950d970831105902b90805d066da6552b839607880a1bbac123145375115c647d10671e84b85f94206d534cf44bf59416f01994b8b125a0e098a842c4ad6ea108fe5bcdea005a1e3985f656e34c431d456cdf9f624a7d221c2c242cae4c9720a048c760cd2927591db67c951905c67bb42900c44f67b99e508d5b38839a0b31443ac8c241ff7b9ca0a06ad744813eb37142939248c7163262216a4438b7f3aa5eb1c9ae329c0d0bc63b2665d90b17e7a27308449bdce8a861fc08c982266ec83c9aa1422135a9e9be99c0a098df9a5568960aa2c727a18c15e7713c289e502bfa9170788c6a2d01711fc9b4177a491226c4d6a05b03baeec202b98e3af0c7612d474c6b7b912cbb38990f29fa5f15fb12c4a5c417bfe30a8ad88aad5395287376fb3b18b234199273625fc23c79a775586d87dd9466f1cb816466807e5079a270954e8fc8851738dc316369f8344bd1019f6b6624bd50f0cca851eb57c48b126aaa3a97d8044d3800bf344c4579361e3096ca29506b4b125143b2d625c21bf0a001aba2e17aa6075d8177d55324a08cca923339bf5c7c00b5717e7007cc94b61f3207dea1e3bf24b79a09ef07a37c4476e47f79a674693fe00b78d372b6ca76614ec604a86b64106cb61d4324e99873b241a56e063960b5fce306640bac5d46c88c85678c508452a806de60966006663845692129123d2846fff3225529475f51521e3f027d537877797b511043497706f3bc3b77ab6823a112597567e6b4848acea62fb09181fcc556beb8216c76ca6782e2d1234bb8521ec40a0f6d511bf8774d335b9a764a89aea93cc9b21ad62635c1b8fb6a4a4130572e41bc13ec627ea2c631d33a81ab1b6c77078c564957b39b0f9f04cc91b1b9ed89240b03a1c787347505fe4675af30a09d6ba13074431fdd045c44b4754e5682e7c5d49492e0ff2bc7585b631f3cedf98bf774427df7ac847954a139545d3643b1aaac31b49571cb7ac65554356d8aa555a67faea89396aa810a9b1cc8312be7333003d8e1f854a7e35ca0d75b06c499b0ed2a35699114d287bca9571e93948bef4c32de6bbb952a5fee5ac42a14c4ada7ceb5c8bdaa873076b0f7ba4881bd2118ae67ea671482312a35c7c13b1d7af2c9291a8408c3ce985a6311a2c702cbf306c9a7b4eb3ba169992831899c6870a8fd3302079748a835b04791720cc4737c5b7684ff612abcb477c7032a88262a37845f2c46f9f0066d19238689b1b53dcaed0544c06755399da2ff4fb570b299290497937126672a41ee9fa594d40551246cebbca8ab1f5c30ad6bba9b0aff0f06b0dc060e6b58a70cabe5ebb464b3562f1a10990d12e5da525c43040d66461cc396ace7c90c0f1aba06c94dfe7426b922c91744310ebb4e33251f1c47e2a415b95a895666333aed434edcb69dc69a513194ee2013a19164d49a519e0cb3771247e65664dfbc69c46dbbb6ab2193bc5b56abc9034790ff43909e6563c42545bd6ca31045c2228dbb5601895cd397dfd73473b0609bd720f9475482697636df216beba0d1a85b396e6ccb3e41fb8d52b1341b08504bb00a5740a80228118adde4c7d0bfbbb0fe0b8b815bc07885e496324c9806f9d07762f123ddc558aeb387b9858b2117714886bcb2b18b182b6ad2f8a21acd50388959f3b70a258a025c80a0b89d6321f222913484990549fcb98c5c8c88c2832075be378410b70c9b9494a6c1a40e5aebc88ae3d186d0b3896d309710c17ab96c93e629166980325bdc946e022ab80c47f61e01421c780ff336d7ad11a3c28721b09a03a5337dfa6cbb76acdb1846b62225578d17fdf062839878196d1819abb7f09dca6a1d225e2e0bd89a5578730adc5d53d19623203e24597c1a2015accd07a6f83938810bcbf2dc94a99f5b47082336fd11a45ba478c750f3e638d064144818a17f1586d6806353409000000000000000000000000000000000000000000000000000000a0128d824477a674d6f8e08f3b9cbde943c99d33bfc5a722b3e426ea18389e408bac5e523fc2f73973b46b1727891a6077329e10e94acd027c9dfa38ef4e21e4 +ciphertext: 6fef277df2e04e66e489b1e04fa87580157cf1c84f0b3bd8137afd87cfb0d726e39d9706f177f605e9aaccf3a52e841e4c3c4b5d54935c5a9eacb0e6d8a2cf17ca416bf7ad3cea42c3533706c54779d62a0c8a44d0c0f920db72b7d072738ecc07fe16a8e257452e1197604054866dba1d12cf4745a2808a435bf31aa64db6af2dc4a3af697911adcf9022936fb5d40a9c553774f4a589192d98bf8289c09ea803807c448ee3e99c26799ac051a50ce5edcb57f3e13a13fa1af41befeeadb7c33e513ee8cd9364025ea0b4efc5ff8f095db6f0a9783acc57b2ed7573cde2ae2a8e7b211ec9eb6eeb34bd358d5cb009184c76bd7d1bdb4a920464d1da993787cd284ab05b8d5d3ca474847e64e1e728ac4ae3522cfa3a642eae5c47a94783700a2b758b2342d5dd261715db4f3156a5be96fe219dc8038f2d7afc74fb60e6cbcad3ddb6befd0625c4b2de1cc9039c9486c5c18aa8a796169a93cf8e626ac47e82b752f2e6537287580acfc1b6460bf5db3f71fb1a4f57e67e0d914587dfba55ee5bfbd5841bc04d041526a46053af4de2347fefb071465a7f9b00396b66c49efda179f13f07dfd0278464239436d8bd39dfd048329c89c2c8fcfa54c24ee67d124dd0b2f411772e480dc2a8b40a6792d0cae8ae9c6c883908a0d33e931053dab157d49e11e76ea3a9bde1c24eefff37379b265a52a4a26b507b5a4eed6f60a84595b1b747c96e8656e7759392924662fb43a40f8154b642dad2d8a0624b413a15545da8bc3dd5a5f8d304eaf23299d5a4574ffef0bd5b3d5977daceb80d67df682979abe36cd7d74c063a0b7214336c75c6d047f2bb52a0a5124658b9b53ac5a67a27b001aeed0c6dedadb3c818ca99e52b18dc0a9adba7f88eaf4bcd269132be2462be1a42ed102811b376276780e7a4b399f02e6c00605f1806987a6c1b3d4cc8f9cdb85b2c833702735ec6a61b9fd2c9ba220b108451d1fb8ddc5a07baa2537f71bd82f1f06d7f27e4a374336743c40466e11de367ad4a256e860e6e5f62a38cd2911bfce65b1b29274989dd1016ee6fae7790bdac6a3e1ee05fd4ea743c5609c3e4f1a65953421be132220b1792404d80d68db00ac5a94feb238325ffa44b376a9b6bb3a84928b065995cc7882673f1de566a78bb80b61beaacbe138a5a7e2cb5e3e276057520db7424405c69f719534983fac6ff483b884c932f6b72fd1878ec2ed1edf741159b973e5ae846fbf59ae1aca97fb855c72dfc5181b09a5a52a1f8012629218a8b00968a5c4ca733a07893cdb1ada1380db4b6f4f211996bf9fff20227f7d73aa552d8f9fbb6ed0d4dd278aab1214fce37dd76ad2ddb90e7ec49c4c4bfa61602988bde7f498d5feb0540cc0d6f2ae75018115695482a4264d513780a87bedf78e256f99ad0ad37f910215795fdfbb375d66ad20d1a731003a1ed52014b6183906fc6a0ee544f1b238563cb6eb407875714ba9d2fb48e667962b45127deb0180e317af9d2fefed19ee929b75c97088ba9cf525ad7264680d3a9fda47a6b5168a846a1bd63695f4b3342ffc828f8fd1d5614fb4adf9d64447984605a8846c094f813e991abfcf01c0ec330cff0aa9c8680d424196f173f63e2d0ae359e5e1968fdb6fc72721c23c239e88957f107eb296d7967701d4e9dcdddbc5962085616cb641c17c86d8f33d73bef887a160065f48f5d7b456153c4d2898f092f6a870c49ef615fd22833131b55fb46f73fb399b046248723cdd15d37c46e0460a81840dfec3879a49eef63e3b331cf53c8bc5b10570a7fa23e3228ffcc20cef18ebf8ced22dd37b50f79aea827dc37cee62a849110db97287b366afe64b4b9379586ebe34b313e260e84be654d83dd3fe4f31d622132c06875ddbc70629197f54b400a97180b81b2cc5aa430e3dc6ec4d9aa37dbf811ba2932aebbb9990f0048b4f04930e147b38f3f22c4f026b806d9dbdbfd69914346440d9b37e7ffdb8bec0761e49762f4f87485e2ba5beeaf306253b97cfca2637e7f7cfa175e5565e9df8741b94aa8d808515086a12606cf207878080b7cadbd318ad5667b50ebae48bc923b4b7a7c7f7145f7f223f2afb9536584caf2e8df28bf693c2d4d2ca71e38361f3db5108e28ba11aace9bfb85bd872be837916bb53ea66a22a605683cc112220f894a8dcb16098607ee5e2ae33b4b93dca707fe7f96f91defd1a6105022 +result: pass +shared_secret: cf115ea5c334c9374daa083543cd805b8070de6688c552b82b256628573d668d + +# Rho leads to matrix containing zeroes +private_key: 610c36a286cca4815c657bc2f28b854aa8602890bd6ec2700d64b495b50d049c5963b8294752942d11c1d0182ba6704e54c003b828bc58b6ca3ee0823607c3c00bd0471b4df571c51db3003e4cbe6166c0caeb747f79573f5b8b80d12ca78bc1d3e01a318bac91fc863198afb70cb9256a330faa06639caa7ffcc1248b367bb6b0bd905ab0098b79b85ac5dc083ed43ed8b248dbb72e5ad962b3201c92b132b2961d9867b48208896c11afdd929be2792839674b18e4c1e99a7df714ab7ecb58570281ca80a92f148bc492797564682b560f1bfa42b2f7734047cfd6375d3dc05846da1d3511cb3c8221d38226f29ca52b07471a41764f86ac3418a96aab70fc8454d6823f8b7c6211d216d08c67eec474a3cbad8f3587e22670ae5a9938651f3b48011341b6140ba393621accdc3f606b080579197c48967f1c8d11026d8f90b0697869ea49cb9db086ef687227b2549ac689b564326a2280d8384698185afb25941ba0365b0c1939148ed6e1bf0ef5c764832178d47a01c3573aa268e168b740194a9b36ac2580a7bbe1625900befef3adc6fcb356100ddeac4393d388fe647c3d623d1e6a56a96073bec59f5fa39581245e31aa33cfb865bbc28e9f2498bad34a5bc65c517bb8cae19b6d1864fd7a0c48aabc78d0373a84c168f33ff13a9586aa349a185e3528003e804c8cacbccf0073da46567f7c3ee6a55eba856851234b4f3725e1bb3609e50cd4c9c96ff947c4b048dd7c64b3498d23c234e9bc45230b8b0c797946d0980dfc7bbc5773620b8330262ab6247fca5684c9fb8c2e692c3f654099a7a93d0aae62d24eb594544a81431f295bbca7b15dab7bcf728e3dc61f6354a459a120c371030f3b622569a78762b1cb08248a455e0f0847e1531d194acb0507bb53e9c0e13c8b2f45ab06362be3d9bb58ab6d90825a15211f81f4987000cf74355a28ba08443b3fd9d26b70039955773f9f840207f696d0e7a4989c4b38cb23df626e53b7ccf7c1bd96bc3f68c20ba180a482799d2cf975e0a39d5fe863df954665509b3eb63c257b8c9e39050bc4a739468e716cc289a79053453a28906d003535536439d418736a95763ae222c8870b66f1b5a9978c29d238658a3e773063dab55125e851983706c3ec68d7fb1d595b55292885f758a8df752fd3d97a8dfc33a228c896a44bc039ce1a2069810b1304d44522b1a5e43756cb843b5ef515d89c310f442f585259e5d460dcd578cc51ab49e63a7cdc2566d77e6959a7d24150cf0b413d335efa65385ae13b482b9b4db4ad2518b71704098d7481d2233e2ab201dcb4a1b3604149710de3cb247f29ce8ccb2ec062b014708f397482dae5936bec37663c849c9baa9d3cc88146b88cf970e574694af03fb78205e205435221b32e5513989047e62775f1ba5aa89a10c9d35cb566328eaa5748e9c5057446f96cc691d80208940cfea984df8817d4507aff0a0a96b8c6729329775c8d75935d7624cc0a06ab7a950f2b73ce4d90239706403c0651dda56544ea59bb06a99f00bd698a8c3f127fb4a3759317a05ac244a07342f9a47257e5649dec2c7050188ea669a97c137f707f4e5b4c57945f82c1b0b2040476d73acb54724cba00dfa8bb9d8c58e33260020a33fc04021baba0f6375ddee4a6023846a2dc73eb69758edc915ab2446b1c59fed89bbb86a9be2242c117cb719274873c8b0a2857e4076b3a792965011675c23deb8bc0cf7b2e3ee38493461f8a2068bcd899f1822dfbe8444a612f9fbacbf87a0d45f98a541c5141b230be12763a3563f5d47e369b65c10254e5f63934a05c8ab3409d7b4207dc423d537abd4404a9ec6afb1cbb529619bee740a4c71efc952b3b871043c24c0c919f74f508bc23a9c1ea8b76ac449e28379af42bb6140d376c9a4ec76b34042c7d711efb559c8c87170662788b4cc907e4882d4332d90c43175cc56eb943d589a30a5ac1ae312aeb8432a1d7b2f7448fe0f48ad069989e908d28616530246f8e817aecf6ae638acd7030a596d5be06964eeada35f6175bc0d20c26636943f1609eba3b8852531f083a576231c9b222a9f96ab1fb79aa0149155881fae91adf26c4f1e463f6f603511311351c6c1d1832f482306d66a4a2e585b7e223bd539fc45c5b29558e3110cc268356edf4bd5be7aeb3f7b944d964d1a7cf0e1a686e02b0b30195ee2bc6d5c78a8d73caa7726a8bf2cd62f33ec676a2a0c997541a386ebcb3a5d845c0a9b970f35ae0602a4282136a0cc832f34de426a08f05bb89f05c4f23a1d7bbbc81628040fba50077569d99cd7b5c7f19b4cd5ac618a4c489cc08cd55f567a203106be784f6824f276c5b4407cafc0836a69c8d90047803c598db03491110688029885ca112ba18026a339ba7e47a4dbc2386710e87fc74495935b6c408ee077138476b8fe10cab556bd1613bbe8ba72a345f157641873651b314534a7c4bf2979fcc062593c652441340e481a76df717b21061620c946e1250e781661bd10914556552ca3204d44d64972038a68a60358126305dfc2bad91289ea150162333bbe98874930abfb3b13922b2be9fe6bd40c9caba8b9412f85ef64348b6b46695184b212b9e35586df10375f0c0781b6245e2d8c580196a025022388a8b1422a847d388b1cc17f785772d5ccf342c01ac667ca866c49272af0127b8076570ab309fdd096b007843a2dc167837977b459000a8378fa4aaec320874804698524e4111bd1525be985a959ad3c8ee8373511726e88c71f2a839067c4a5a4235ac4a977c444b482087c612752ef0359d1041d3740ce4db971071c0947319a8a2c314dba1bfb118fd093f323c4e41d618f0cb73d6023e7380bd68b9351a825fdb952f13f48b64d99bda8701d040b6da27061ccb36f982611b851cf2e795f02161f58ccb973c6c3b0880915c31b7d59e3ab05d14d7697ba59245043bab406d0286b71f72006a51aba92c8f53e39333cbb273fb7814162c4d87244933ceef702d17db03eee50b48eca264026d19191800e47d1bbc7ef57a4fa0880338922f75484759e2a926391d1f993ace7756fd03c13002950c33cd4a882d90131d5ac4c436bbca02e22c608a3537d21971672b49963a1f867fde42c4b464b8b1e557be884862a68cfe361600f39d38886f8fd97479a0797ccc95c66289a489a66aa9955d1985d518b7c3dca884db56a6bc01d1d21818fc25f43a1b378286eeb18da2706393026dd8295e4e20a103ba97ec7618b119154543875f43bc08d76dd51730672321bce866ae2ac6a6450215439c9510174c90b58a416375e935092bb7469624337a5130c30e27905b0121678480b75d206888c706699b555084a6cf21237b102107bca8cfd4809e3513886b271c45cb162a189568ccf9389ec8017355db91ef79afb172cdc60929d071c6ef927f641a82937a146d85ba668701f14183a5136df8d6b27a87c215363016a21b8ed0bb27173d067349b170911c0607c065b173a429f244199db3affda480d7e3919ee616aba4165cf1040544739b3b2669817ad6f3335c96b731ccb2f0765552a71ab3a32e6509c7d53233b229bbff40c8898544a8a26db655275500bbb265acc4f8cfadecb77465c5c1989680fb37b554b9e5199c53759f27409df229034d9247fc965d453a206197cd840c42b495483faa1d62571b27190aac9c56bf5b992b8019ffac1366925d2b65230e2a88cb3c209ea13a1f273c9c512918637d5e40b92b9546970b341ac0c69a264b90a414a43270e442665b59608919cb8ee7234d113bf6d14c89a7a1a1f489420bcdcd96123349c65984aa9ff083a73c8294a282fecb16179c494ffb33506947c9b59e39990b9b516a3751aae6cb5499d196f6402f7c2a88459639e6c2105bd565380184b3e48691b11598b5473c02917558911afc73bada907ee1c124a1086a949fcd45c0f0c37df0863f45d70125d02ceada9c797a80b1692ce7e7c180079023826f0acb5c80a44a47f724b27b652c10bbe4f6258014a03dd7cd84ea2fe0ccb4c0744b76fb01f0f42d3c5862327c6d2980751f835a9dd741cab5042e685b52f45ae95cafb6229b044b4a3e056c242ac7a44587abe55f8de5b2fe0a9cb8f9aca9baab8b423a2b7c6afed694f275c5ae2157288751e95c2ee45c03935a45a130156a739906f104dd931a6498960fe27aa15a0679d1bc68c9850c930140b6a45bd2c2b5cac0a168aa644760f3c8af61b8bb184cb7dfb784e0f0c5ce739fd881c1856815cecba44a3c4214f7825ac44e77e97c8b8b32c405292d508d2f8709428a39e9b60016908b1ce6847f84b14b555250451be218c2bed841584b3627fd0000000000000000000000000000000000000000000000000000005c9554bc05cb53962ad1017e802d691c6c2f5efb5acd53736737ced8f6063c29e42ed33e0da5856106580e02aacd0aa1546d3df0571d17452d22f186d011981a +ciphertext: 3fbe35bddba843a88d1401fb50ebc9a3ba2b42cbc5795ef3f29f3c641287536a4999325b99f6b5e9c2a36f8127e2c09a7fc6140a9bd68300e40e6ffbfdf112e9a50a21d16a256dc2b9b94b2e45d249c40810a6978963b186d543e2154590b9007afcaf9d1791f4b0ad69283ce711467f001e8580693bc7a59928f7b1c228dec882e3a37f6f6ca83efa2a3c2b2aa919328a4b4174c00c9ab4af6d16de60859d3b4cce874366fa93c26457d029d20c186034ad8c4c30a51a2a5547e90456ea1d43ddd1b882681e58fb8e2db2c0ff36201e0becbe530be3cc8c6ebc80b9f7904e8a1009c1aa33fe35649ee91c558882f84c885183a6f226db7dca9af61babd423d2f749e98133744d5cdcb36b541a6486a43a5c39f92e0949c6204237ea64ac25faa8129af4a10f9aba6a0b647e1bc99b19187d3a2a941df726e7f8872e2e4064702ab7bda5756d7ec0afde524bad03e5f80a4bd76790a46bcd2556c31aef335daaa780c2533c1aa5fb2109a597326fa9a88be25f28c0b9577fef5521761802236e274c790891b4966030d08319894e6904745065e417e91d8f06722b159f21e4395143a875b2b6f48fc614fc06aab25f676c665ab98971fd28a7a9674ab15012517860b2a532fe543f50a4b467b2246efd85e32bee86dd067963edac95b2adda65a7255b7e83be377f2831c0e1a2cdf491bfc255bc417661a581ced672ff02e61c097e8103966b7ebd851a63d5d5b5266d2604bc350711df665fd82152a47c723cdd0d43b226145aae4462a233b2a8f91975c498d50a6f4f368e8501b709c0df403ae23b4f559cd57c2597f6e30b1f6047be7630b90f94f8b13b26421386b62ea16fbbfe926b7cc08aff6a216ce84b850d4b3fd2646824a3a95d26480aca8a36dfa1925578eeda4dba9bfd90fc72419c648223d259886d72e728d90cae21cf204f230c57d00be1444a891d4da82a9c9009db64c8fbfa922c205e2d51b50f4cca46ef3c19034be588d305b21d4b91dc2c806b12bfcefac96c6f5294d1d43c5c33365a0d5d21f5067c4b525e1fa20742502441b8d7595a309c7ef52f4bc96d3a4dc09e4480a67aa9ca10cbe640197bd824099448cb7a2cc6d8ed1a036c3dfed788fe64905a0d6b850002b932503eabcc1dab4695b33b48f0fbcddae3b8235333d29080ea2c1b58309c014b13dcdc2335dacffc003e98e2bb2259fef78ca1d136ee25805d9fb757a292175b0c9edd0452effb49cf3cd43aa50009e55a4919d2e1031e17ef2ca0d6d2eb660c159580b1ec821b0dc9af97603bc27611adab6fec6ddeb233ea4c5d068d1936f5e2d0632052512bfbba15e8601f5cb8534f543997d268146799abcde181ae13fe13d1b17a4785012e902f3bf43599b0e287ad3abfab70c2eb79a60d9c7c9e3856d5205b27272e16dfe157f36befeab28785309ff0c2743a36ee66b7b036c6df71c116fb4ba983f80b07817982e084700a24245f377eff62536645699e1ba3072caaffc45a7a3668c4ece26d7eeef7d7e32be0e218b89e88aabfb7a2979c0ba030ce36c47b6c0e4609315fe12b25f66f33de60cc9334a0198e00a81da412c9ad39a036e5e3f9d39b4a5b81543a7001caf176fb1964cbb1bbcdf7e096d762302baa502f0c172ae4f22bd92a969381ea476ff67ff3c96e9be48950b51fd01f3160b5156b66103b40d3274f041640e14d6579870a6bb51c5c27ef6a3f0f5260cb29982becda5fb21114533b5686df14885c36b07907e33b2462c17717f85a700d8c209fde740af48652663d4a67eb09f22322006a63a54fe50a9310cedd9d69b6ba52c1c991b8b43913d97cbe5150ba103951462140bbf02da88709af263eabd1a6db3a1036d2ed6bfb3b035c108b5df06a9b0e64f16891e11460e71707c6e0d5eff6796ae7d054a9026ae1a9daf1fd6e6f6ba780c852b7dd164711167f0fa71ede289aa7e77aab847e9b8852bca0be1e0b22201158f8ef8ed7615ef65f5bfdc3cf3b8dfe33d94a0b4976e621df81f699d0b7b61b3a1881698595a06a46fabbfa2d41ebbd7467fef258b6676fa8e89fab9103cb1505b9a4a2a532ca2c146dca4da88586ebe6b9116e7abf83f0042ba7a8393ce1d7f6ef50d443579eff34a4bd08642441f98ffa908a4adc4893a5a4cda1bd08e271a317950421be1af54ebce11f3928dba1d5c72897f896a9f11266062b5abfe3ca98be59a854 +result: pass +shared_secret: a0cd6965a9282d1db07120d6ca59cbc6939fc4c64c6f980db9ef85b07c047e95 + +# Rho leads to matrix containing zeroes +private_key: cc389888219463a7a5f6c2ca3014accb3bc26f2318f593876de6a49822b6c1e694b7e5aa9140a0765b6334ec762c8bb018d28a99004081256159c836f4f800d0c9aa4a7136fcd89ba7cc1d6a32b23ed181b3fc118ecc60096a4ce8261ea2c0a6ca49baa28b75d1b40215367e6a33a1c177937bf43a70c3889f6aa239e20e499bc7a836694a0bc2912cc7cf211ba20c12d5ec312da2815ef20c8565712b22a927451271040cf4daa44d79705b97993584424e7b3224a5583e5b8eaf640e85015676517113f53a415220fde3638b9c0a38115e668545305ab298b9923bc16de5b9137b30a39a2c8b5fb75e4d1168593a8eb0e067bb9343f1a030e5228bf0b3a49169393cd14f73c2b8221b1267627d80b97d30544b02a4c7bf06099194b2d646596aa439d82a214e6cb9c5ea1ded727c8143755cf881415b6357661a90d5ae759475baa6076eb478a5826f86f9868afc47ac3a02a0e84579a25466a63d933b071213c886790c320416d9422d280745758779635ba6f848440b2489144866e8e018200cb8305b3060926d7e7213089a06d044176b053f3bfbcecac7840dd7844ec29eb17bb2caf321a5b17848c16a678552727a3d70c34f024164b3c4856b0a4ecbc78d345187c6e09f055273bb775078b43ecc534a40e66592b607b56b5f9304aeb048375ac71c30464e979a656f1728a7b700e3b33e5026bf40198b94455d2be37cd65867522b20bddb5ecb7a010191254b8a403f37c4577a613ea30678daab55508b16d6020f074504f928dddac1e8367faf6199715048c96a8fd6bb225715accdcb012cc856a76057b6b72b09a4aeff5b8ba278c54a750596e82bda45be19014e8ff52df181435ed9ac8c402147b539ffd984c291535b7bc8b26c5036352520730195fbaf40033fac450843e808b9ccbf03b40a9ed657f6ac4af8b65b4e389280633d79799e0226b28b356fc2e39f10a80452dc934caac7c3c521f0c5544e7821a403688f08378c3086d3ab8f7e4036ad516778da606204aed3ca1ae8c42e11038a64ec78a5fc5dcd0475429124b5d665e4acbeccca3a296a8e878b917b886ec7f029491c661bba684ac4229cd71373c829055b602db0518a481230345a34a709010a03e4b197273510a0a24465288c327c10c75434d9473208a7964db7792ea81c5fe0c4bd967c3f0c98765ba7d3faa4e6097f09e9bf10638fb900a764e4a0bdba2f19165bd69832681310a7a2585bf06322a3238dd26a4807af44faad999397d4aa14e76c2cad5326ce573d7ca04c03db769dd01a65583ecbbb991e7a31b59238f8741845f1adb5992607184dfa19a9e8840ed9e1622ab93031e2b448860d411a3d239277052cc8ea71046a0b1ada191a020c322d776c6655ae71964d86314a86a47b6a367b8ac5a4aec75677226de0c1864492c88fb70a53187cb76835d5477346646a9da97301156a3ffcc231f9a0da760dac142674e5cea882364dd74fab66901dbb7eaf037008c52073054cc2f94ec845444054058402515bd206d496bfa02c442c746ff3e662b899c34c40900902c4f8ca146458522c6a7af772b2df483f9d840fe07464b0c66fe1036c070c6f70278e9506342663b07529247b1697c6b844a5959672b08796868e7107108ca4c30a58be4ff7b37b0402697aca2dc4839dc51a8811c34c8183442711a8d055b640cd73d2caff9357bdd9ad36835ae9d55d1a291e040652d020a905027a616b3b5c63c0be2c1068e9cb0a9b4abbf346590237f96422308ba86b055872e156470b53e35b2a604bcbd2b97849446684149a86d9980c5182f1a020c32b14de18c03cd0633e303bf9f8a24ff0c95d5a65c031c18550b7d7d5b8ec672c3953bb3be0c3f13925200394aabb26090a3b9a12bde30418b997abf310c1724a88b9782418d09552a63e2855b7af2196d422761f5c8a877426976c90552bc203f5657f5370258b936c3706f074c11b3b2586391f4c4bcdd959615a819aacfb48d2c799a9abb182c7a9fda6a80ee50c4a827c9f50835b1859033629a9601b5b8b357913b6de142a501974a0c191a071a95cb8c45fa857736a93400141cc325d1b4518d3ea58a94c14f9b261759281b00213f91652b1e52bbc0c488bc0990a136e8e3b5e20f41d9f218646d43745245ca4c27770990375a9865fd5889a51a706c80945812c122ca0ee71178b4ba808bb7a28ec91ddf13affcbce77c1111f692e50f8b6f54b2694266f10c5cf411096c36aba5a292335592d975036db69a823b5ba1d003b98acaa0f6929701653058627e444b63777b6047957bcb749c889b1426b34a10783507bc5e3fa7bd75abf62fc236edb83d65061c2a7671703758b04d0ec738e1841b8256b58ac448285f1cc0495928c78166ec0a5ab8471d8d59606e375935c0211535ee2a47f051b310de23a153451f39179105997841857f7e277918b682de60ea5d70419b0a2de9c6ad708091148514e94249d45c8cb60215996abce1c86c31a780246b0bb937f26313e6fe1ccc963952352c717d303254b5c373752be849c027cb6d3c616fb52375492a4848732756247397a238cb63a6d50b9317bb939fa594c881497f92f5783951e03a3b1496cdff20e22256319405d44c9553f91018197510db2956baaab22009ab153370b25a98ec2c2645661e748ac85976872a47d9716ae7f865ed112c4c522c1825213e68978f0c1654812868c00050c7acc412aabb4a9683ca9c673e129d018a05da0105060931dba7eaee888a2b233cc567d722a447dcb880a46c640592837891d6a4770a46c267f104811ba47b19031bec2a7510933295752d2b28de55326dc71c4caa543b70372938087843bb63d74953453057a3877d2343663c058e218412db1829ed9aaf8574681bb2ff9e217e7d44b2c260b90c18a1b20c5842225a66c9afce760956b118069a4a8ba057eb204e03a85ea1701b85c71fa6ab590345140f58280121c58b42fe74922a99b8c2be04dc76c1173016b7673bf870889ce6520ec537d356c9b55d7680324517ce3066d8551f84c7ba9d70fd9f3ce485b6d1e38b5cf055b38e2b83730ca439a14b7fb7a043a390fc652f74940ec2b906a41b5304140cb5b5412f996cddb40f8ab85b087a42e6ca00a275975495678890ea6a51b6d874235b48295495e951007142b703463c934d10cc88145886c5e7b6a04dfa9b435e27c6c729941802b9b682a6587907254c5b93694de13aec3d93043e4c095e4937e9506867266ddcc601ab9a2649822824aa12846563350caec702f1b493cfce645e2a0758bd5a9e29bc3c72ba74305577c10266099bf884477ef111c6982826ad7b658e8aae4ac69a2025fca407f6b5275ec6572b0a86a16a787a413cf919a39f65074273c54d8fc548b2abd1a7c9fff406c84191a8d4c2e9916b37e652e5e83c879942a559024fc9008e8d008dd39768116b50bf4c94031cdf45cc932210711a443b4d5b1b40875924576e864335f130f2f51348333c0b6538a7efabfc8075306669e7b47cfe5758f7387526e666e93d16777895201f555ca916c5907c80cb003f6b31daa94851d0199493242a2d4ac3ebace84d04b7663a7f922bc277562d984244ab894bebabc8d8b43110b4b1b0ac3f4858be1585a94c46b24252d3bda105521b0c625979b6b251726ce2848b327d36ce3e8502ebb9e67c102c3e6250bc605d71a93e96472c9370dcc3626bac07334954bbbf280c2e84dc2e61b7ebc0035897516d75cb6cb6994a06bde802d0bf986633c0ea0f3a4854059d3e251283bbc3a19ad83902938e2b976c10611b62441f7c8d147023fa88c1803a8f4b5a8915b3454a85e66345218f6c27dec0444d4bf28a024e8d82a86cc40edda2751db4bae70045af8a450c46b49ea7ea01b70424810a5187e2057aa7ca2a36ba56cc94917535c06a827a704d3088a344125215d0b5944e5a91830a663f8a8c4f8e20c6072759290946f153422a62cefb33ab80b037b145dc4f5c49426770c103fd91539b42b52ae74a6b50c50f60650142b39cf595eb520592c0a4be0c16d4f766c29eab0edc03a9b864c19102d08458b1b94292c1915a4f191f6674723285caf177e339c7c8ec7c6b0a502e96a74db0c5102eb519814acc3a6698be62f97e82bb57535ad82cc4a8b90c2c46827ac0adb013954e959364c28e51284252466be14c2141231caeb2bcd975492e500e6c518d22a2b5cd667700bbc741c155ec81481687e4dc98a6f5b5efb9188c028c01b2c94bf858852603ba35924e1ba3fe08c50020b7d142a8bea70aa5ef57eee5ab904b4a5d1b251e93ba6d9fb955fc33e5c961289ac040f2b4af6ec2e27fd000000000000000000000000000000000000000000000000000000dc19745c0fcdbca71ddf4771a35bb3455b0f83c36c9207fa7f3c94e8a3a861fec975767ff083234b2979bb109a24a27bca17d170abd8d9e6ad3c3ba19e306bce +ciphertext: d7e07ceb0c6e77b3c5adf2682470e7a7b874f6de85bf8a43a6b08a5c9a538058b8c3bdcea97479c5ba6d7aa64a243d739c22bed27507968dbc74427bca924f61d6fb5825c5f74592dc09eabc65508ed637b8908d058790bb97f05a1636f42714e7d829177b49c8b464d0491ee9f00412c38f0a67504499d119acd85a3df5835302ac2ada18cded22f36e7a97f18643c1181bc71fc636827f9b45639744b6dd5d121c2c5651faf11e7752be2a91488fc684419d394d13fb8d8b566a2f4e72f86f6ea22b45aad8f52e2a4e0b9e4b02e216a1c2d924dcd258f84430047c2a999c7b6548edf5ff36bb14ff79534dd18c89d187dbf261db5abe5e9a4a98af5d1d8633690a18ee5ba00b8b606fafa63c9b5a4e58fc32f32f6917436f8aecffa64f70bdfac2d9e5963f0c841a9a2a40bde295a7ee21d5f84f88ad2dfb60482f5224a1ca6f4d0bfc3ff133795478f8d58dfd086ad5bd93571070865723e0cc1171e8ae93c13d565194ef6cbd40f5930c88a2e433120a1b773a9dc93daf21ee0f201fdc24752693df11c0d86115b68e31f4edf4cc672c2c1c75f45e534107317c5e353dc575ece35ae6069993999c2fd5a0ad534682edf567e1c0a960013c7abb691dee608eb269825a71de35bb3441fc422e4604ee2635f73fd3fe18c59b04b30954f81d4e8b6e63a12287dabc50c26dea93a5aee7fc00815af233c9fd510a21be7c9c0fd7276c7edb2130545c9e732980a1402aa639dc713a540fcba2d7d0c2f7058cca6d503c1d2a062ea636e78cfced18a17914394b340f7cf3d5cfdec1caad629133939f0fa0d7eb093ca8bce074716e9b5a8fa39893e1841a14294506b921e34b7680ea79fbf88328dc55b56803411e54a172585e4d119c6b42e089744fdeb34d5c3e0da9a61ff73dc9d41d5483fb7fa90f31aaae4ee2e9068f00e2fa0ed7c37722963639160ec4aef8fc076c4224745310f3514ff50fb36611eeda4b14034c84ea774f3f864dc8d43656648c514ffbb59969b573af2daaf209ce7b99d6b2ea076acd3be5ade1832b8f074e6c721218b99d64c499a26c1b33f2b293900c9d8a5b0b6380610d49ff6a55c6fb9e06640db1e0181fc39a070fb1573acb86ec8cafc0239a913727f8b1f4f58bbdd522f9106afa5ece1be2fbd5259201783c0444a95a4d04aad6fbfc3c514a4c5959191a8baee6459bf086f31204d624d7a8821ee7da353dd95179eb6dfdf95ca7571830f7459f4ce6a5237f4fdfc13e2455a3e94996c2fd08136fd44dfb23d15e9bac5ea07c270f62402cda12df927bac95647d969591b7ec8deaaedfe34f8b4731e578b1b7ad8d0386885552934f6a8f00ef304128a369e78ec7100f9118f0ffe8ad237d2851eda280b3cd2b7f46d62ee0ed52487e951592606f8cd0a2f463781bf3fd1503218d4872a18ece06c18463c075418dd4bbc514ff4013b6a49b4f3676a1654c74552dee3faf897f3695db1d3b75e3336146b78371fbbd5fc135c63bbcbe019b5faf910ea1709c24c0819e34a54f03c27f87b040e07d0f418a04d1d1a9508b70d6f0b4315f37d0daaa0839405f4b781606801b4a5b0d3b2087965e194d513ca64c310ea65192da9179a483adcd1dcbb21f389b1a515160391c1becb9d7ac34f75386c9ba4ef487b4edaebca3545a40cd3bcff1362d5d27a38993eb843bdd2c7de9e81ee87bace1bb4ac6d88a524db65289cf69c9c7be3c1882a39b8fb038ebf531ccb1538985e51b9b494b113933b1b436427bd1dde4540ffe8ab7c4c426a384fe0d9a824ed21d645cff1afe2bab0511e6dd3b0554843931ed277e378d8fa56e8454b8318447712eab10c102588ebb12b481fe8a613bc1a5def7883d0681ed90ec5f3004d04020700848885f1b5fc542fa9085641a5ac2d8b42cc9ca6a484d8c0efe93850d6896dd7a2bb15e3b36b8edffcbb9810cdcf510344070a264d32166ec55ce3764822a8da2377d50749b415077112a1353327bbf38d89a0611cf7e95d0a1a5cc6173555d3b76c13456e7e042dbe22b1123f32528953d2969a966aa37affc93472fad39949ea8db080d58a4460d6bedf80ce4b83a8eb4fe3e29cf72da59d354055a364dbf013d4ad0133fea1c690d8b68e9eb3c01b7a14bf1bf619f8f5fe2d2b3001d3a14eb07e9fba744c4ea8e4700492070bb2792c8a753251eab737267840e4f8b65a8f533aaee2de1bc20a4a2 +result: pass +shared_secret: c6a7a9d970bbe63973359c7c72f190080a27a02b95abd0f588fc163eba9f82bf + +# Rho leads to matrix containing zeroes +private_key: 078bc69561af0cc77acc291fcb063e1d7c82bdd7cc31d5b44d1aa746e261f2a592d4aa9165c2c3755aa457b886cdd55840767f4fa0b19e45410872cb1db3b8b5829c4ce9b2a8969330cb5bba2397119310fa072b7053b35fb135d04977b9ab4766c4c1ecd9695957473f10c679d71d2f6b57db2ab0726022bfeb10b61807d35447a141255bf5b3d0e3bbf5cc3ae74932d87268e172978d78b99daabcb16b44bd578f6dac130c2528fbc89ffa94b48e6785293023e2605a8533a5ac17c15f34b1e30501729a78d3b8ac6e4a329e1006e0c0735c737283856d7cc7663cdaa1610b1045b7423ca8ccb59ca6b1c482dc02ba117c17588809ef8506f09a7162720142e397c6ac0f8fdb02e4c1c557050af941ae8165ae01d9228f767ef1ac3d72f27cf9a2282a6c379a669d01cc0a6c560b21169557b88771008dad62641f435e0780234e86c1ead05f14c0ad68b6b1041492a166bc4a278b0d352129556d55f37ef8969b596c5e41f8597878c8c6c83de675019c022314215eac667a7b559146478a4a5634ff193f6b83673072643efa59c27650fec168ff17109577083bfa8493f38301528f27681405693345e523ea4398055606d4ccad9df967fe59428ca7502f046506756a6b9a78182383db4baf05014fbb20afaf148456126fa393abfc480edc92465d93aaa158c2a8493882b24c564b607cccb2c8f6cbb43abd722c74c2c63230946acc091c48b865cdb33edb712c670648b07c06691687685218ba48648fa3054ae7a6a663aca6aa4e66506516100c8f2caf9c0645f2554c10c480e798b9c96756e42cc8a7f626c2759d21555342548e0490420df3a8124b0566b1804933b68225359cf66caa599c55573b70d488d16185496216cc09090de382d570795efa569aa5bfa8f4a60665cd30d63bb36cc5ac050310ba9bbe4b3af2f9400296bd344cb72bb623c757366ef1369c968578eba52a092dfef34aadf552a63b1495a5b78168cf6e58b218a3ae64310d16734d5e72b2036bcc001ca07533085548809bf114a092225aec9cce6950a953773ee37ad3467bd5ea0b4cc4c6b0695a774781ce17004cd48e36116776db19565367c92a94488ccbf4ca3c3960524d1b13d6f77399ac625de5a2d09954cf867011f79bb4c3682cd40f133a9d67778a24d7cf1a5b71b7b81dfe335d0fc392a8b12b234950ab79cac94776ad1b713e99b0f394aedce739a15334f19042f4861e739c839ce07da145808260b159625b5a742258779440953c743c591659b9d982aa7da028c7eac4390b47b243ba23e8ae4fd9c98042a0c2d25a6688c9ec774cd7e95899fb7f081035b0c4217c2903688ca7e4466e66ac4e3ca938fd58b4d6bb732a36aa8e097fd75976d1200d61a5c988c12702698b1cfcbd93157d3d1c6e76d316b00b4e462588bbf3c480d8374df3cf66a16f9dd2ab721954e02a9f8eea4380c381da230f10c2c7dec02b057177e157cbd5304ab1d8160a323fd5892fe1649c2e270dbd3777035912dc0802f4d18a56356b52946f30c516838028f7f39cc22466ed277a5adb6864972e1063b1af0709dfd60136b16a3d6c863a68895677c488eb1d879a69a5341a695212066ab848609cbe331704aa56092a4204a2293e77935390cb1d2b2924e0bb27d4aa471474fed2b6982b71a1c14b2cd3ae12b12d5d12919235caeb8aa3827c844bda40f5f57e5f59c75c86b645224b3a861eb9d9773b01cbba45122bfb1e4a60ada0fc10f133c546563661064adbf4a89117657366789cfc282f9bbdd0547029c92aced02963f8cf462326db19bdc980149ee0823ecb1d9e22a5effc6cb588b17da70789d813b749be180457e82a5c958b069551748e12bae79cbc0dfb5ecccc85f565c22eea1836b52435b023959b4f4fc12956a09f38d58836891c4c2b0b4502b012b868fb9bc0455c12e83c182f1637c05469708279b1f4af2c275e174ca5ed0a12b39849f49535b8ca73089acd5067b6b57297327c4cdddc7d5c752a5d2cb04c659d04f803c72507f5832e7bd528e903863b932d80c51e8b2833684a084c7100728ca33a4304c85b8cf7b61412e76373566c34a75ca88004cab21a3274bca1ebcbf34222e351a3df4b557f09904173065b460d54210511f4515180b3bc0a87f9125a0a91252c114654532140ab6140d7a6265c3c55223229f1520da71b88cbbaa7dc7b6f79cd6ea1062f9ca88c47b70fd5b78d5a38ea594de590b49ba0ac7b5cc2b324bfc4d26dec413467950eb7dac40f5a60f054662bb9607f8bca39fab368526ee9980498180afc1b6954cc242cb04aa8a01a37c16a805792872b2b1ec63bb4b6bec174cc28631c37953241399edae60e66074dfd9b019fe97e00ccbf5537baacfb6bed8b6d3d4cc9c3b54e006c70ec2269e5081e8bf17371757b9dd40a8f1a388d68226d46bbe0b661a2b4521d143b77e2cb2e567fce825ee9338c12f425466716e67508f7e4882229a85766079194834df17440d0a4533cbfe24b05b503c75dfc9dd4e7a067ec9901b504b5a08a9d340f9ea4b036b218ff6353d8732d08d74cbb4cc19d6123cc237e31768845c628ad754ad9f484f3c3c0587a1b9883b0abb2845fcb7a57b42493d60eb5793926acc86b1a21ffa1a790183e1ca56aac8256c98546c69523819790fd3764ea0670836078dc5105ffc04fa83c50d1e933682c54911348c8627cb6f776d6c79f4415ac0a91c46bdc68711c10b0e34770c4b2d39194f95b2215a9bd453828871789a45164e57215fd4096d9ec05054bc55e2a49206a69e4f998cfc68656840065d242ae067195a5c421db21db766b27c29fcfe530c5e311408328d1b69eb415bc4b30917f957c52c14bc1c01d3f0588dcd58565f500569c539fc67e1381ce86904bddb978467c24352032b975045747235c8932f42276e9a36ff89335d6a042699827fafa84ab12b17db956b0b55c38a1281f5a5f2d9c9104cc5af03a918a5b26fc5585f25cc8ab750c47684623dba4f609827abaa9ad668427b63e1b347f00957041b6b62509259a35542ecb99002c5d388c98e86b7697f41398a3a30aa69158171a63e3397526b6fa4c72008288bcc1c2f7d4572e449d228ba05646a946b512260b6eea7218e47642cada5a9561b867648e41c368b1796e2df7273a7208f26444871756e4d52fed089019fcb727189718f02122853c6ef21d6b3403e50c0cfd447229b3457d7cc63737c6b72c384c8ccd4fb451d82a1b49e88c90c7be28311c25e3be7160bbfc42865b9003d84c1734d44adc8b590465986089bd59f1503d888f7ac2064e03447896074a947487c2b08247328c933cc31a9d9ac828962cc0b7807554f661a7d64ac90009bce5bf00b19c579995df27401fe4bf0dcc459a8c2dac1c55e50bbf0e877abe5b658d128b7f434936e273268442e725116f946738d810119531637b65e14c9d3ef26fba358df92319598c092b936e368a3e0d8a53f438708eb47de814bc90f49c83c87a282640fc02a2f30b56f659717f6234b611b4465347bd990be4ca01e550524a164c6b97a2d64cba75c3aa35924e31d92f008b42c2f701b0d99addb39a045a8cf7ebb868822250db42408c0c0a60785c182231002b0bd9884fc89a0ad60af9699e5d0661b514291b824639517bbf267decf078e8c35dfab769845a2cac1ba4c0e513454151d942a8d4163ced994d166c144ba81b41b1b64b74220b34cd5185086a797b7738a4a6e48100ed5077c1cb4401ad5f173ae4d047da4b5977f3bed56c6c318bb2c11883aa3870b760bef4a71ebcec54b49430ef0b792ffa503947187cd382c49c130dd32797740f335703ddd9703ae163b069cc76d50aac06ab01710785fa5429f79d8cd0c6f4f8711e766796d054b8a99c7c800b4f5c4f75a329c147649a7485cb61c19c0a453a9774585856e65bc9b3d30a20094be3d2767fe0431ce85e21eb9b35d48ed5fb2c2b1c17b13a4c67b09431d7180dc04fe087c827b6a572c446dd5caf68f0b2a1d973fad4352f3a5b22ab45eae32d17a993b24200125720a1255f607a1bf79c3928230dd3443343694bf62b996c3273323997972076fa49c48f094d2e122382b36503e95729e41be8f19eb4d962828959eb56491115bbb5d279a110330b818cb4a139f2290c4771399bc041b5905531b76bf817cc283331e860ab5566b5e7023d3c6a28f0d7151d175dfb9c1c8cc01a45522d0ca6374b8718d04b77a03635ed23c4001145f586a4f252a10bccb3cde193fba4329867926ef0b1a47b8bc130431a563ca97bae83111d309167caf354cbec2e51977094bbc6cec068d339833ca9c7b6492043450792740000000000000000000000000000000000000000000000000000006d8b5ab5e1cfc312b1e6d63c84e3d91a0a378d5b924e94bf13f06c2e9f9b6dc2d48790195fff2c19f221b7cd8637576cec18c29a4a51cd07c82eed4974c36e8c +ciphertext: 21c66edfc81eada5da6f03b40842bc67acc6653a816c35c9279cc4b1e956c94cbeda12013dbcf99a31c8579eb911171bf6f02b95e9a75ebbd255f2bee1e78fbb1524cf32afb999b4f39e3084e15b6bd4f6aca7f8cc2228ae48362e3c069426b260e0c5efab5f260f7ace2f1d29d0d9344c56b0a2232c7ad3d0dc963dd6d6bb24d956c47f8ff0dd7c5ad88bfd888de6f81cfae46096dc35739adfba6521fee79b4d74c4e3673ef9d91d26278404af9afbf26a8d8663dd722653c993ef20fb8fcb22057539f0a756d20a4a53710b3076aa90cd7c9f6deb6cd5fdf50b320685a6fde64b3e0580edeb49b63fc0038433088deeacbdba4bde5e07a1952dad8a822e4659ef39c6e32cf5f674591b939cb17db95cd73a18f3d7b4e2305d890d3d8134e78550a06b16eb84d7214748a50297dc409e7b60638878cb6c051621277c47648dd6aae6829b23f5bd6df5925d435fb5a4eb852f2bff1701c68d451760f254ec59f7fe900839afc085adb69b6d640a98c10c49d24d75046b4fe7a945248df6be5331285c42c4d714fde6fbb83cb7cc2c435b5691abee38030da34cffd895cc8231a8b39940e55437bd2856e3adbf2e48807aec2c90452e02d51731eb5eabc223d9eb47fff0fd59480648ead1b14a380bc1a0433a14ca0d815cba125b21b00e54d60aa912ceb7f4976d2a69865377a5b884e259001626303a33c302e4878fdc75be458f1ae041213e85316836f2574394002d248159b74e127012085b3043ac53637ef55ad9941802446d5c165b336a1bdf83736358ef62efca6c3f82bf0ece3ef5a69c6817748091826fee0677995584995e2b73bcd7c185e1bc88c4fb9953f61fc8c3bf3127bb3787da572dd9d99950557120ca64a09a1855d651bb6aed9cf9f791fdcbf92a742bbafedad28112787482810ac3bf3c6c14755c9bd75ad285076e50a30a232c3f6f0d7c4efd1857c239b59552819524690f8b3b3d3ab415eb36418470565248bd10657ef4b46d2b42dd769e386275fbb4ca289fd095d33a86fcaf88cbf5a374e272221b2e771b2e7f5546dade7e11616a722d5ae62d87b9ef777039977d1448e84d385eef27ad070b39a96a610c238945b530f0b1e2ec2aaad1de6c669b60aa1afa4616659de42dcfd2b7437a5952c7601e803de19fdea2564765cdef8b10d300d4df126fd8be3b0e75dcc935352b0e942723bd302f7f74b434618941b02d7872b17be9814549e72326b6b098f7dc15b4dea4806f9c713523a6c9c4166e689fc09bce2e61eab4dfcd82d0ffc0bbac3c419b56a16739d68afbeeeeee17b561c8ed1d26c4abf375e8fbefafc9f9a039bb28e4146a2a6d7a80743c92ce938c3fedf05f2addea12a470379d152eaa1be0d997797d880cda4335d325c2a8b1f4d04afd1ce667ba24c6bb66cb361b0eb97034d6a26bf02a1fbcc8f02e865299ed5cad65dcb1a3fc71966bac09633955f4834b0d9b3222176013aeeb0030b2623bafa7c2011777a6236633a719ebd6c5aa6347c9c8545dc8110668fc5f4bcb9cf070e4da0d60933f8b064271a4b70dc03e813329e421b84ef778ad98b59dedad9b1ef3e1115343100604fcb7f95b1e448639a6a35d2c0a49eafaf18a19f5d6f3c528b6a9cc14f091b19bb57643eebe1deabedcd4a20faa1f308eb88132774091dfb4a7b17c012dc9521ba4d5a0023f284abad7570645aeb798dd23863a66d02c68a91b87ad060fe813dd9894f56511ba7b40436ee063fd67109209b3d6724e4b1dbdb445c02324474399bf144302b9bd49e73f1801304a68870ddeadbee49ba227f7edd5fd288a0b936a7ac25290aa1cc57a0b90120b8eb89bf423511564b764991750a5ecf42938e854b1e4b768c61ecc871ad4eccc18d3196e15ddf3afe4bfa59a01344289a8d19133ac3b63d4e700591a3ad63b3253f6e25705585c56fad7b965732de47fa92ecdca4f0914dc1d78caecd85b6f9a71d057493cbe9cf27fa0923f642dc94b917b7ac52184f75530951fb84d9bb189c879cd75c93895ea9a8f53ee91358351a68eb4af66a07bab5e838dba00ba447642eb3568dc472a89190a2e8204c715a0475353d177f32775b7626cc2f3430dc488a4175d1a574f7be8a7f3a5c89e6ee97a73a5797907ed8c239ac3d93e299e74d01af7651cf3cc2cc9d92000edb5b91f77abf3f5da6500e04ad76ad016371779740b9cf845581ef5 +result: pass +shared_secret: 784ac74e14797b27f5d98bed3d61d66a017ee9ee37a5b53038820b55b130a2af + +# Rho leads to matrix containing zeroes +private_key: cc4a14e75a6b1bf87f11a240424645dee23657db9819ac274780c2d7d8ac64f2cb82530b40a078791a2ae70aba868253bdc3045b6254c4e29024894cd13723edc7461a37403609b48f79b8e8b1018981bca9f68031dcaf87528a6b065d8cb83c142ba20d68a728a3866ca88e6836cab209ab49bb234312916e432fa51152c763a62cc53da61480691b07a073be74aa6c2b88468bca8302a23d1d6405ddf4aec2f88ab055b18e2b1873862af6539ca83b1c270b6a563cbc7a220cdc8106e6e5595d63a26c0cb86ff11b48066721634b43b361b57a5b4ddb2967d232d34cb750026b362cbd20188260c6a856e9493ae09c462bc4c8663c7903112488b06b2a996dc6668e382e9cdc93e52a1a368b07d8388c9531afff0cc4c07ab423bac717dcc888e213e3a75d69a633f49745bab10f62592f59d53ef19b6a62f0b24216aaed9c91203b7ee65b9d097cc1e2676deeeb576ceb4fa4a867ab7310076a912a41292c658e8f75a98603612558352a5b7beb404fd2bb6de18c7ac838464b6399182536509624e1e25a7821b71edc57c35541cd115ec52c13a739c3de231ada741274272383cc78bc9869d37282f5980209543c92b76ddf99c3d45cb7409b5e44599b75412d8bd122460905c250a94dd4052c0b0a91c9a906aa3652180fba9212046b4f7ad14f7c304780d553f19487b8b7413de732ba1296b41a2d94983d4be93e540a4a4137a030629e97fa640c21ba5b7b5537a03a2a958ec3a888590a5c14a904dd74c83631264644cc6689a245f833530124f7d10e2596a8be227f270941faa75300bd731c145f781cce52247418595ef67c94a170676cda269e51c7ddbc63b6765b010aa061cc576696c84345c35c491d3e4626efc8b73dfcb481c11bbf8c79c6a3aa4e54c43a44141f5c35932486320567ce37adaf5241bfd8c44ec140d30823b58223b02742f3e2bf5864756d528ea36348c1c2293d8ca050b6307d71a20a036e0060697b58a0ada53eee5a6990a9cfe283436cd36a02dcb1a2b7200a267c3f133ea6423bc001baeca953515214e2766f066cae531212dd3551e22bbb1c705f21753ab60a70f364bf1949901d9a0415a36567614c1aba2dacf2c5435b4ee66193c5e461596719790aa792d5a09ac474343509ee36ca048751bd4b0c644b2b039b1320b2294df814b419c3ac55541be5cf4b93593aa4c099142de9e13699a40709d70070aba9227b6c14f216d434c9bc16112b8b4237f838340a5c317a618a91170709bae6a7c13cf96851f72a8761736c452df27758afa4b02fd55b3493b1bbf96dfc45ac743718978b7de8a017eca45dea633dbc417f856781c856c87516429127c6a3d335f162ace0982235ac79ba0ba68edbc1eafb9ed7a3597ca7a612a9bf3ef2b0d1d7c238e98714a434b8b08b35e3885e007501f9bc06e841921521d47999db3ac3937468a54b95b57a2bbe34aeb48ba57f0744021bc684456a8ed413b9192057eb77a5502dbc89c5964c0383b4c9034396da209279199ab5830abe9386b2e811c222a6ccb0cb23732a95676fd5c0376505943ef8bd67a95defe0af7cac395a743bdc3119b1a74771343bad21c53ec80cafd7548ae310293027d62960116a338d74bbaeac359ab3728e268abf75a8d30b118141bbc56670dc0c5b2d05c9c2f03952338170754e20287c99177c66b810f009002c244f213891c5b980aaa23d15f413d4a80160d24e692c450b68c8c43ac60256ad748ab6aa85aeac5c623d199928f88b04ac7bad2c1249c18fe1b867a02a353a112ef71368eee3210f7082f8b216c975070e9a1a27dc265698bfe4849611716d0fa1b1f9047e8b0905d184b1fdd863377353fae732a5d0388c3c6606a773360734c9ba915d49aa7d358263d7abce563afaf382976b2ca2e1328d4aacdfd78851eb143a1b81c21713442421bb1abf77ba25d4355dd10602ce06754dd9a77aca0e25b1260e994d0fe1b83088a5d385251ad5c6a54c45d93a7d1b25cfddc1612b8b30e753814b505524a5b0b26747645c9b636543ac7a871b6a7cd3865f1d8636cb5210ae9157b567b2ebd17fe3f59b73379d086348c9806848ac3ccc1547e8964f6a1c4b532787dc8620050b7e628274683b79e133969ae154da157bbbab159941484cda4108c84aeef56afb0a389191c8b5857fae399094ca8c9af399152a87ba77181926b78f2b462c92b788ac988303cb8d2a9855497543fc09c7a49055554b9a9b6d868a31fd4922907275ca978fd0a6c3790a72b438c4203641fe2bc4f5f45f492c0abfc9267fc6660f2c4581e53d6f8b57b0d89b2cc29d97aa315fc7c9ae419f38f425c45271a29a9aa3f28f5162a92e317312f218adc92b3c46b8ab8a4c598a78da54107df7720b734f58d63064088766b06fef11a95e76b2b702b3eb0aadd0a23b66429572677304b024f34a0c07c4cc02d51186e406085a90a7352cf9ab502dcb65b24881c6a86d39c49c37f77a15b1b10bda2fba45b5c6c0025452bba0233040c11103084e95c8a51b7743fcd984594208deaa223278c12d191a060ba269eb0083c00b60daa0b8169188ec35c589652bc21da1c3c21ce5b7d6fc5eba8bbbe13216497884f09a1ef04b529805a80da578d8fb3724ecc9b861a3fb457fb47678c0809eb9e24da241900903a71ff446ec4baf09305b03ca1ea1034686f533813921d7137848e962e32563c9f80cf6f564f12999b25c4826699f06fba88234b1d51b77d5583af18868ff1c78a502b414c49319461749b91398832863821381fbcb62b589fd665b78e81297d34df7b44117464dcefc863f850ab12ab338c359ec9383e4957cdbb810e7d4c73c173c23f65ddd8bbd31305d868a496a63aea62014fe21c8ed2c80e8ba56f606a6412a9a34a98c3c0219cf054755b44515d805dbe4879c0347bad7c7cbbc08380aa297623cad5029634b025141b58169c8865c206cf7232c260cf88aa91855a581b750a1ac168fe960e5ca283a1245e0b31abdaa58031b3bd51ac295850772dc0b819cbb07c66e734597f6387ced79392594723cf39c67763e3a3c2c6a009853e510bbf91c4f4b5828a91328073683120919eca166095c7bb4bba5f13b43bc8b7a991ef855399c6019e5a7a83057982e43b099016537760956304479a4a73b57bb76153f58f51d47dc7706542b64e73e00513cd838bbc9800d6b90ca304b06a31bc493035cb1d116ae17c164f8c758f5c7be580997d155b2494e3701137ac69119e47a2f145eba891839f0baa084af96d916a9a64752d4b4586c0626836f549317e4b6bdcce1196a09761928a968a4b74b611960ea2eb34bb18a964c18fb10a15319fb9468134395fef8a40a1b144fc31aa536a473ec9f809c8fa1f74f90262fbeb0b1d980be7a2970563cac92565d6af60be699ae8e692c311692d8852c0fe0426624cd9a0a1a18961a1be613b4a9a03d275e4248809f0226179410fd190c858a41abf5446b2cc3fc1815e08149d5c81c924664e2455fabc46f108259073520446b98b697c36da1602ec8135bd053cc034ee5db4b7b58ae8b59256d93a80b69c6911b14fbb68527da6a3a29a8d1c61f4d7c21f0dab9a5b266c875610437365e2a2a4e38a2e1a8835cf7237fe1483ee01ead6aaf2fb072f9200514a9709d6b4ca51019e782aa590552fec8b5ebe40a0c99ba17c57a7a460abf5ac9a4869f11c7c1bfe8b8eb0b7618895acc88b91ce273df7353b3d083cd72501d0163abab80120a317e870c0a1751600162d633a4a4373fc988ced65b6501844da162c6a4132d8e690246898e3d2a6915ecb013661fbd763a624c8c7c1672f88347d6d28ff622427b669332aa34dc590b3244029912694721551727cc36725861959ddac230b5781ce2f9b5147bbd3b70a499c0bb34c955a1245e7cb16287f357f464aa11e44eb433b6745aad46551e90935be4c5b2ed211e818480e4b32c2af84c61aaa6c01a7e16a08761d80b221772d234c68c97a3355637e3535ffec5bad36b5214a22bed5331b5ccc55e48c4a2a76d0f68759442ca54075ae0accab8f3c9746b129a152343993bc7db74a7e027a523bad3b7cae347328d64180ad396897007a098a590d98a8fc5816aa5ba805035cbc24c685441d5c754efd879c327b56a7194b5391696f0167c0677c48bc8d3701447e052829b3de6c840ce0b7b8d95b5f46695b85037232a7356c296e854842be0a48a758d34fc0d7cc2808d7908667c77a2630ae8a52c06da9215653cf41799eeb5c517f65f6d26152a656d03a685109a955811bf05b6199be9ae97fa62ee2ac65a6354200856c6538646d47f9f974289f0ad6978cb5dea00000000000000000000000000000000000000000000000000000004248de593a7bde030c902d7afab9d96bf9675f28b7f3d93067ffd368d6a7a84a9e4a0d3487b6714e18bcc9d1daeb3127164328a19d5cf60822f3fd37a24bbed +ciphertext: bada76528c6a07c80d5f8363c32338250d6ea541cf8d1177bfecbc469dfb47c28ffc75e102b25b880bdf0c8e9977f41592b24b1ccabc2e2de5f38283aa30ac51fe3b4960ab8810ae05a823b52e76f267358a56124a54fe3f8cff35dc8ef24895c83e90773733dbbbda50df879fec084be456a1250980f4ef12c78ff2b59231a944d4c4449956c635d443c92845bc747854ec6e92b0d9339684326c5adc6a07737b27a6fe207639046dbc623f531217a7d6fee0f5c8d6397d05dadcf53e43823daa7a0afceb87b718dfb46e4818f11d2c935c628ff152a0361fde8458e76475682541919b517ddcaf0eddb918c16539a8a04f81ff07827a47b5d72c92b566f4d7afd4db362c855e75dff1c0bd83bb6543332218d33e8f9e6fd38d021f961ac98525371183dbcbbd4875861d5d9cc65da0550279b8055b4bd099109e193a32b862d14faaf1534e29a4d9963e2c71eeee21b0fdf66bcca905c691cad611e4b55329a9bf8aeb55a1445fa2f6ed7782a6b3450f6aa7aaad82dd5a552f5f3d333c49f1677fb34cedcf4243cae779143fa555690402302bc47bc8d386ef9969426cb5909dc7d180a02374614b2bb46fc61988984bcb91a307c40848f7c8fb058ef2712c2bb5aa42c1027cc85f22e3ea91e59ab33cd9bdcd80de2c8ba1879ffe9a79a17948c0a27e4dea267609e96e5c84195d5b0c41178f35266df867a7d32149dedf2beee8a3f7dfa9fd91865e2a1b9e738378304884979f667055f755444c73ee53c36c21c2c9638ec9c0eb4f761a9658a494cf2213b70e9c19e5ae51a3750a34f3c78487a7736623e57e320e63162fb6f41cbe19af57aac75506d59350488368b443269b98300652412bfcf66a37ee5911d9ab94e402abc78515e5e0abe59ce7396ee77c7dfd28382494f96defd6c2d00ddc19d40f256e8656c7eee808e01dda0e04d1e13f3bcb943339934fe9ef9dc3b4a6b2d89ef7f42f9ac7a9dd446715ea4b25d14d37894ec6ed5fb8ea97a101e2a6e324989dacfc10d0634198aa65d65cd7f4e8d60021f288124a4a33bf9cf4a8e3a44c8fd44f6ff7d4fd69c645b37c5860c1f86d87c16e05e16e3e8fc84d4948f19cc8e8cce3012d94b6ee94bae5ee701d585a9af4b48c70055988235861279bbfc1663299dd6ed22a61d2542bac802ea9b0857b5afabf44008a8fd2a46d5b5f6d27be8ae9b13e4522c609f8244bf9b3049a8b49ae60445db69d72be3fa1b5d7756ba8a1fede16dc223cbe27e2d36dcf275e3e42be48a7a4a9674b71a4483d6c6b8d2dab1eb7851e089fb94fd3b18a37243828fc1f40658024200b1284c82d9e5dbbff6974d68db1c4e95532441a4deab8c2904cd5bf210dc3ba1e35073ddeb346976904062ae052c6f5edd46bcbbbae8e4197fbf8a638576618d77aa80c8d83c2365426fedbcb2c5781e08138d700ee544d07267d392b081a281408e5dfdc303dc7940c61e64aec119e0a3b1a78f7c703896d2f1d53ce7fd13245ef67d57963cb4c9231aad8464d2ca36bfa42f282234461b4023a842220c838b1fe7157223d254e0405b81536cc06a3a9f8a6f175054d31b67223fb59ca0df92c84473291e87c9b74bc5207a7fdc966dfc36e503cde19ffe7b284430a865334968c2ad1c1fbdb2951d44d18c898a26ae480f31d55b97190481d48f395e34b4571e2fa5bf83ad9b16d185f34a5b55d65ed5679775f39e63085e67217849b98b54d251b128e5c232fb3fc355a87caa3ba457cb49ee1f0ba692c875079d1cea754f6ca91d28bba83392b420135423420cb680dbeb047c45f4f7bf998c9084900448e8bcfcfcfc87a81d2b586ed4c38931175442595ffb4088ae657e66636c07fb47bf2abd0e32b3d979b1f32c2b3516b9831a57136e4783dfc081dcf8e3666544f2e3f9af6d85b2588811f3335c1260092af225572ac7722ec3a3c00f987b4ded3d1a9d278cc6151ba936fa02d66ff76ea12913db49830283890ce5b87ecb6270d71418d9c213206db87b116eb58eab2530a1bb97ff7d57546d83b32e4b351e3da6c619670974722b6d006e3c288b3a6f684b1db98938bc864433506e67de883749a3c052165720a833dbc412556ea35c437a582588d94eab42f5f7cf9f841f839c7cad07017634e70940453213638d9efed5503def0076eac37c82ecb46b194bd22c6e7db7bff4d5d75e188518d6479fcd34dda34eb70252f +result: pass +shared_secret: fa3ccb03eda9e8299be919496cb2581d3127472eb062a8f2447241f6b4a66d02 + +# Rho leads to matrix containing zeroes +private_key: cca22002e0b84e0c0fa98c902c2a30f0d9303a411db91a26576834d4f1645c181bba750c42ab6bcf401739f83fe2a4a3aa1a3f5917418003aed863875fc044dbc99c70b27758389fdd3cce51d5a13b21afe1219f0bab5dc3b15952591e6f80068b30870ed644de082476e7b32d3a531ff8631914c7a5c106a5acbf8672ab4a304afb71b1672cb281438f0fdb1db0f52948e8b0a1422ba10ac5e0a480e87bb844072e7a134dcce36f27274775fc6a8bc611b2a33cf85a4820e18b47b24188030fcaaba998d84a68424c07f4503abb553ec33b4be2af3557aae2797649da014dd0264d00ce74431e46f8969276b24b359c6750c5bc15a6318c2d06898ec5f473380a68302a91eb562fe4f10596012e5efa83f4c55a19912978a6583e4a884e36af1b9367e69ab0566c3cd8c34eaea615f49c094bcbc63d52a21d74c02462cb0bb7c77cbaa03df988b60cba880771a7c179315a9f6ebc6e9b8c90bbf17f737508b1691ef1952363e9499b5007a9c84838c2a149478e4be76c0368a8220b9a3ac68ef6560dba6b3f68257b6719551d83c38f73654fb392af0c1c2517851fc160c343cf826aca2c5614726c774c758e1abaa9ac04ae0742799060970909cbc2f78ca739c71bf6528f0695ea6175a4ac13555c3bcb9920bca3a37d363ba622666e54a4e779cad5059612792d610257a689975fd664dc5081d5ac4586c60e99b9a2a17ac612e5a794ca4dc097a71f72bce02b4907d69d801a22fd7b88f9e4ab284076037a0f6ac803bd7b243b835e51873919d3b77de041bbdb9c2917338f0c42a54ba6f5539d60e827387a9e7c156155d693b85701b53278139b29858785cb59788ed981d77556d27390285bc3f9408cbdc717895815d31641d0c31f2d911515f36743c40f4f3517432c620892149b518fecc80cd2d14c99730e0c940dec155930dcb5ef861b7c80b55c2223f7066b625c9fe5f0cb04f0bcb880119de142ce511affc01d483ac8db8b73e504b242315533d9c02cb64d15445fe32bb0c8e19383f82854981a9ea465b05c77cfd66d97a2b262bb37398cb4654a0fc8146c00b7608f061a216b9becec17f686b93d88309a7ac04c2447030b41ebc6a95fc52466d36dfd461bb046172f3b83fd10bf79c281202a60aed8467748a986100b97742c8d70c8de523c1d700489c391096c1b92654064cb7e35d7b25f29818ff39fa523c88bd69b8cf41689a414288c492f2a83f7b34a4d95770e6144b7731057c73a077a471e7b378fa48464c426ce5a6566e7c862131ebd5a1b3df013641a878fd702d167ae3f369361666514d98f325679c22aaddb56406e148e744960ee1395866acbe095542a6836571959a80238d037260fa053a52cbbc2cbc035e78fa9c306ebcb61ce33422584009271835ac3845524794f18bd7e1b4c034832fe68ba24a162815404f65c0af0944c9789b1d92767268c801a0444fff50399b3a192131e965523bbc2c75c286c96450c3f0733458bad7831205b1b4841a617626b4bee232cd1f220edf53b59bc213a055d956591fc3518a1974582f79a66dc8892ba71ccf7a5fae1c01841428525c32dd2b433445118559cb5447e3c851a0cb498cf99c2d359999fa3969fec41d1311ed2545f5281a09df223bc4918e55551ec060dbfeb41c777c79acb7375215002d9afa37b5a126625f7445c3fb51233650037e070648c924586bf7013c203e907332901ff722c35c1991acb2da41cacad4b709ee242a9e71eeb0ca1d05595fcea8d175553ce689ba595b8f98707a68a4d20f8a1fca8c34c3482e88c8b043a9d42e4a9e55a6cdd867e106b271031355bdc71c85c80713c0ef7c3ba3bbb9ad4e32615a2b104e52dc5e7481e258351385f9c8932a074529e327e6c0949756b57ef47094e184517819d459bbe35ac6154a70d004490b03803e58c9bbcdcbcd8451c2b0373656373be77a59beb2d47410d8a8631745653a02956dd0a0fe99ca87d78c273230667f25bddf3a65a216921a12844b8c98c197026e14638a97fa5144b44189621f00c75857fca20342a09ac44a4aa6c336d9ae58a15972f22555139e2b3e00ac0bf67b15d64ca8ae77a79b44e5b47a72ea06930aa9695b96987aa0dfbe63d83a352c9370247f6b21f225e096480b17333009bb785824641306126c5792a30b2ce4856623898d79ba97c3076e54100eb7029df333b5190cb28a8207a557cf78cb88c11b241da951ea96dbeccc90029845c7c8071f584095923266964179910a64c835045922fd520535b35869a147616970424835e913ad8382faae3b756aa51d65306c6b6760cc3aaeb7958b531293e6a6daf0382db834fc7e16811643692ba162db4266e3b2af1dc9227aa7edb2a545b8785e425bbd982cbec02514924844da57e3740881ae68d9c104afc33a8c27782c658bbbff5ab1da73ae2ba267326ad3ad61183e792075033b448a36ab3bd8e8429f9cabd5e3a57f45464487871a02bca6752311d607701b89aac021649f37ccac9a455017495129a45a6b24f07726c0b633c7a333a2c589967c85e7376929205d6291a74335a89381a4b851bf758cfc069be95847da5d6258123bdbae08fe0b39d55c11044d1c8a6d70421333ebd91bec10b73532a6c00e090027b3480e796e69209bfea7f3945350747af2534234fb0801ce11c73b934391b0f7c6574d8c8c8086151f8817bb2082724c733d44837fc7c24355c463bdc0365b8a0a2b15f63ab15f42c6635a40c6d8a502d5000a6b7158a16cbca964363a4c7f9da5d51c2289d7342d885bcfca1123c324e36273fce5c4be83c343e84914ac382fff92869dc11fe80824de3b745e68f55bbc979a0759a35cd91a75a7c649bbf7999d8726134d75691dc7d25b23cb5d16f0d505e6e145f84a4644536827ff982b5b9326324132edb30e02a611aecb749685069baade2545d758aba6c5220bb244e08d01235faa1fd5a0cc4612139466d6ab26093a22c428252bf8491a6794728ecaf421286c2ac5f4117b16d145977c4232f8564fcc5996de99b71f896b5d828105c593fa43ebaa2cd74712d769814d490aa7e2140f942b6e86b734c32bc79187f6275b9da3bc621ab152c8a6148a9327a549727ba02a9a1465b3b9a32d7cf6984c610691061e9c8a55badc65503158bb637ca4c55775649caac535c345a443b27e88e3b0c435dc33aebd5087635be061a37f3a0715c37b0b351681614bae36460c5a34eb7e763af22955167b85542519700511c843e56476f0a977a5a720aef292e0ff94d726a958a63cca8665fc9a943d235a569da3e2a4b5964d457df1243771504fd26527b94aba0e8b547207861b8cfb79bc6abe3054184922d477840a4c221b420af50608a265eb508a651dacdbad403484b59ef9a819466c66c458d172622609065a424024811b26b61b74b8c0adb179d2dbb7cf4e336677132052b1b7a6c6eadf63a15b484a3240c7bb1c9e1160dd6832c727044c012936ea43eee4ba721c489d6b8a6fcc2bcd3c3ac8121455c845978364148bbc9498542ac093a4d1b7a6a666d0276adb218315afb4683d6956459833915862e18056f7c02f9a492388a1fc65c5211e7742cc656bf2a82cc727fe3516288986da5e4b74ed8abda8084aa90285a86a275f8a18fa99934e73f88f42aa6ea3428b6a9d936af53438e51423a9222b81ce7b27d7b015ff06ef98ac62843703b9828f4a0c71a603b591888df2339c8c5b8922a2ba8ea1a85a6163d5205824056176b2cb150bb544667635788338919c21578faf64ca0c980e5a554f1935410b36b5f29b110121c35424cf52cbceb53134f7569594b0677db53f97b570f842a1d27c3e0971343baa872bb2453799b1e5b433a2361d2f1931c185f13cbc0a0e1ab1fb310f4664d8a49289d15433742aa439483d8789a25c2ae77a3689a17807fd544ff4c7d022c42ec9049e683472b490bc7dc8c9766983e32a2620a611da65583479fdb7670d329c33d51af50dc3234e63bfc1306913c66c587b9e3a23143824e84227505b0b34a3399746554bc6037f87b84b0a7a41da3b366578fd6d79cc9a03d34a227e8095b9bca636ae01988dc2dd67722a5db934c7009f812a985598e7e309cd7015d24a5b36cab65e8f91c233474e1473fef76828f2b245231605d079b308a732553600b549314784690d5ab5830c36d824b68881d6a440696d3938f328bd755cb833a8af037a4bf8241c5d9aba41540a015aa0b110410a05e104881f5e41471e70029a9c42ed2aa4e3a5012a7aca6db06b7a847ae624ff7e941ee18bcfce68c58a8c47db56bcbf60701858e26943cffa53661c180a3ba0bfb25524bd60000000000000000000000000000000000000000000000000000006f9b4142950d620669a33b7668565a96eca6eb4d6e843758c2afc1371df63bca53f53a49ff45b0ae588d417a63a599670cd391c5e9885c972593d09350bd7523 +ciphertext: ef250a35ec80dbfe58ffbc7f7f0a97ee1e77dbbb601ef38a8599fe1c50621a7fafb3c2f42b8dc17058d2c5cbf965d1dc6e45fe0f033b1e42326d024ec27eddd00f4af75ae389b6e2b95076862e11c63136698eaae4a9735ddad9613af997976cfae920dc0a08b9bdbcfe7fb168d5712c7d372fa29a656adeefb3cdf8775cbf38ae0134bc024dcbff32ff2575911a98bc19e7ba3b8fa7e5a1df85bbb4bda21427195206a07a1f8ca8b2550fbb9724df204be3cd5f3231da0211d79900cea59a6e394915d208eadba3feb264964e269bbcae99bf7d8caeefc00976687ed7ba1a693008aca00f0e9641293f75fff8e7169e6e149e6695003c544b946898f466a0cfe7a2ec2b531e771094787c75c05712b6b27e55f1fd3ee3bf4230c05059d83eaaa2ddbd4e9fbdc8fd4e694f17a5a634daaae4c125e1373e8103a1feb119a5a6bbbe7d722427182e867e6bf051653d28ba59f68d52271a29bd109b4b55bef30940bdffe931cca17e2add03a2e808c4c2b09cc4978cd89c078abbd1b3a0919421c0e86f1294f07f5c9ae8c6f66369702aece6f1a368dac179a64aac92d445c9a606103b48e2778237178e407de8d576e5931d123caba6f99bbe158ad4878c5dc78bce1c519f5690b12b5421607d5819d36c5bded5a23c46578e564b1c341e47953b80db58830ccbf40edfebd6bd92b99cda2c62c0d3117f5e84f9f7b8dd6871d045c4cb287e689e865a9d1d1f0b0feeab1ff86adcd1952261d94a994869d33cd083e28f158b918f22f0b8a1fc4cc79d800c38ed0d9f746c3b506e6ccd58224886083cee785b1b1ab19eba46e706e8e89abfa36ded66bb7a180250202dea8366b4695434c81f02e0ab5c4cd40451cf5242fe95af132191a89d653550cb76505cf5792efa6c8f074801ee54ae10a36d75160891fc2a670f1f7f1cd628645980376999d86aec88d3ab55a06d987ee62ab7feffee85f8dd7bb925e3a60c8b4c63dea64777e3dfd19eff0c42371820aa81e451b50e6183e762798270a20e94f11efa43ae958f283e05d20faea378d9e94f57c32c47755c400c4a6f17a94e28ccc0455726e309d1b65d920b185ec129088071f557cbaa3372c9bc56d16ad33fb592d8af9076920ede91e6ce659f76b6f8dee15b1ca5a5ef9e5b20e7a136db652c095c883a5cc638a79fe5dea351a485ca8ac83373dea459073528d138da4eb895cd201d88b8c1dafd0d344a430495632e82044b4bfa73237857b5bb2e260a6bb2c7583fb49826ec08cbdf60128677ff1f0c44aa55901b5b9c4eaa6defabd1f6633ecab01cc0a79229ebc22c7451d81846844d229fa74c0f9da3bbd8135630f2311341929c146e7221af95c8f569858f113f32773a8d3cd10f71bb962364279a023518daf7e9a53778c228dcbdab239917a4f963dd221b00a940dc1a1aab798820aba5005b7d80cc84c18e91b6087c7c966015cbb22c30ba409e5fd93d4bd843b35572a8a629e9e2713659ce0b893f1c995f1e61d502b50a62f166f2f3bbefbb534ac139580fd56acfbd232dc507065830377cfecd3bbb377b72450fb615c7971acf1548a2abc79fce191d1be1acc15a8102b50923a8e596537eafdae404d546a90e444e47e04aa6a7d529ce6c74710ea4f8140b3bf7fd8a468aa8b96445b413c9bb19d057bde4ceb98a537f736c9deebcdedfc58c9d5ebdbcdd975b762a20d6264016cfb8bcb57ffc4bad83a5b997ba6263ff34270c10eaf932f85f5cf10cc2ddeb3344ba5dd654eebd67008c3161e4c9f79680c375b2e8b031bbd1293e22323abea7bb04f9eae988c8a9a9d9e7f27cb1f87eeeb5151566e8d22db6389119d33cfae07f1bbaf14a48f0c082e325f2e8d397bcf3a676666e7c2edc85727da4729c1d15b4b820853ef49434372ec50c8d207ff252cefe875f5971a6b102b661d150a782e55019d9761728b752e208bd740fd148e9ed06d872ebfde0489315c46a62ebc6c0a5ff5cd57eadec362a2d8cf87492f557abce463e100e6df8981573e54358c3996209b8758dffea3847eccb6aeeb5c3c5471167e1aeaf6f9a660cd281ed06ff4fa11cc88e04b162e72222c4fac1081a9f991be6c4ca4b1ae02de3b514692b8c144ddf40720c1e1394b38c879c382861bb2285a28975c26a6c1fb4e542794a8e654faf918f79ebba577c5cedf72431ba7d18cdb0da6e90edc2cdb85175fffe80dbe7 +result: pass +shared_secret: cc0c70663e64be7264620b5682f2506f2084b66faf8e8d3916c8b77fafa924dd + +# Rho leads to matrix containing zeroes +private_key: 16997ff80976d1506b23c012e387ac6ca0a792f7481ac3c9775317ee3ca5267bc7180ca884d28bad6b5a05b045f33a9b975c6c98908d670550b874ca70a77424e48bf097256434b9d9b96c8b8149f02ba5bde9b813eb2b60f20da4440b4cfb05716bbfd86255a1e82941d2816caa7253e7368a4bbf4bf546f40b1bafc65bb994c34f7337e82818021797a431cfc664699bc22b92561fe3d1cd6306b89a36380920abbb466477549d1bf14364221c10f51fc3f7240de4c99b3bb3eeb9ac1fe12bb7c97888e8386da4a341a0be8f78a7b7c49f2184376c3c3784289a6bd9b6a03a110c228f72939b86c7a87dab3e093c0ade693a0e5331c48b761b070476f55cc45ba1dda14dfde01a011776143a4d29d48b47b0c6cd2111bf18360a7438f384a28d772177f648773b961a86637c946d7981a6b9f571a4c29aad07220fe081f1f18700f3c99ef28e76819f8d7c4c43d754cea21180c43357f3430bcbce1fe8952c691cfe9a7483026386a479eee4025a838df5c563b9f5a1882a2d7209a68d231ee82260a7eb4fc157936deab52618cba32772fa1440fb675220f4610d749a5b3b142f31b404d94d2bd816cc4773ec83aa1445a37b361e52b10960827e94171dce3c12cec80a1ec65aa6f117fe937673a78cd7767dadd3cebe0217f13c903ca25d6a681116b206acb46949b18f671a63fd2581a6c0978738460cc51df3711dc1215dcf75525d30559ab6bc52e16fa513753454888189348f045aee8a32e98cb2dfd708e7d42818115e5c61711a0c43e85a13657aadc24b5b30a04a43cb97bafa433204c18536337758c0db6154d4fac670fa3af148b52f24aa731c31f98464ca9bc975e97fd665710ee2c56b024fb8d7c7f4a20cc9d510f8eac38f96129c97b17c890417a21465d05abca02754ac3614e964f1a24393d05ccf5cb9500852cc9231656ca899f3538df30984475209f84ae8b99983e844b06ba4cd8a9640a513cee439ae13ad57d3846aea4fa165b68c6c03c05c835bcc5a63d45cc5568aef94ae7798bf29aa7f38e275c902236e63872a274e4776cf1928c492036166d04eed9ca64aa16ebb4b11fc3ba802c6b249e4b53f90112b587d36c6bfb0733a2ee3003419026a10a4c54c2be294b2031a48fe895c2c9920b3772f127338a865a82c3262dabac113c235d433b90d401f5557bb1bc68359020f75742c2008c2bc8862416910f53772a55376ef05a5eca853eb1ba5ef841f243b8d98b11e94483ad7e72fd7360a3641159e481ca50971a6e8aee73a0d4f24b25430ccc0997c631308fe2aaefcf79af5d2045932043d95933919b21ef87865b8550742a513d67af756c5958465f582983a777e9032ac43164e552358861a0ebc458e55865fc3545fd01b0e7565877ed3229f8267369c319abbb017a87ca662c635519ff418682af39ba387aa38ec37396b4d6ab505219314f4448d0f572f4330cf33fa1369872649c922bcd228c294b3213a216e59752072b8e026700ea63061855be3d6037c0cabe0c21f5be948ee4b18dd935ad358a5885a0331db2e496995bd47c3ff2b679e0abafc02804b6117271a2b00e33bc06250fb30ae2036716d30a50aa07e45f244e1f0100d74933a0cba383545cf629d357aa8927a7bd4f6575059485fd455be7198fc01a509920f6c0b8c5a565b4b86c084a60bd9b9b6037727df67b83ae06c5e47aba5d263ce83808f40a378aa43b4ec5458b33a0eac8c816abf5bf76a1220a99205258cc4a9236b4dc252cbbe8884e8ebc1fe921ed408582182b273a199d121153ec38b7f183174754f66332ca98b87a31672720815ff7bcd0cdac810db905ea76e6496742d26b2989b201fbc2936f5a6cd60c35e757f8c33b75277560ab948bab2962df9c38c91b44f08090e5585d852c4b729c52de88fd8c54722162f2d7696946c7b710079500136a28b9abf9a5c0294a5b265865cb04f9796b648f85858f8982f15c2bf31626b236b2c3a6493910be2cc8610829d96693cce3686b8a63b91439118fa661729462ce58e5e28b764aa39911569d1ca5c1b33885400a16f169858930c7f135ab6a95d08ccc70d057f9e73a4c8ca2da7185df37c8a6f727893bb6db74329cccc4692589128867cbaf28694fa747e86cf98619e99b221db88a81afa73b348582fb1b863185bc7a3bd95b15f041c8e3aab5b08d6c32cac121cf003161c05c64b1d90074090605731b5c6c465675ad846cd99cf3fa08f7aa45448fb2fc802529bd69e95d1a21e98242c66266290bfbbb2ba58fb320d660e297ac416b2b0d1c5968b53a95172450598ba30b96472d14522513caf0332c8eb8f846bba02870ac989594f9141d56813a68aa5cc43666202038c29621eb658911027663aa0155262cd86798079a257621ab73a8489fc531f41c1483582a1c92cbc6b329fd09913b1a6c5fa0b3f7116a9866290d4b321cb639f544b0db81a6177212b798f911b0786849b17259232ea74a9963a85d90aa8636a9f4746f7b8ce423a374039907591a54a503f9298b486e907f2d93d1a2868a1d47608a6aad83c1ce7d216dc0283ad56426d7b5cdfba794ffbc3654235501c960b8c9613eb6126d1929c55c1e7cb8cffb180e0d942e199b4bd51721465ba8de1cabb081f1f55218a86cbf6b7ae038421b5278f2d8086041480ea9898880a84ad25ba631b83e953598bc76ec9b36b92a76359fa1e44209139272fb0c9c5c5f0af6a0cac4d4529d18b8070e76b8b173085c12d84bb2bc4eab464a161f5ea69e0318d3719249d112cabf827ef4a4a7c813d384b62c02c608c0b49dfdbb6f34c4ca8db3dd19142e5c53e3d17010f931d0f9c8657551deeb53516149b459238657295cb5c66dd6466f9c1ab7b711ad985a93a46b94f2aa2030405f0b013e12bbd380a6ed98840c1f484ed5c5ef9401880f646f424c052f20278139fecc3a3dfeb7c3cf99979f8b8c6c77eb4d20d9deabcb0648fd07bce67738800a2415f3722595c4267f7a743f5562b1a26ac168602a84b6864bfdc770ebd792543455055a6055117cdbbb6cbec340b69493c7f0648ece7119b8bcadc3282e5a8b0a21b1898fb20781c298ccb750eab8bc9abb3330276639bafc2d9c00315c690593c67896b83d63356e81cd4624c4f39591cac40ac49425af7a5058a651eb4800094b0a32778ebc025910b0e69450cd0657c296c986fc9559b1c3d0a605754b266f0f28a8d5470155906331693e425896a7644d6f340b0ecb4cd2268b536b54a38431e69852d7c443ef97db319879d1b7147411db40a0d7ce7cd358463d8c5be972ba5add85b4f6a47b6e59b58312dc0500457a1a578c93ca9356354834599c41a2853c53d6739be379b9c669e7ff7460a29a2e5126e90902b22a29446b3275dec3d891852c3d3175d8bb3526466a662a163095b8c3587fac94dfb78cf1f3968ba9888f790cd8d7338b2c0b55c12a91a32381fb2427227aa66935cb0a07575c726ba16c92275370fb849aa548967a1077cd2801b858111761230544184883ce385541acb0033f0a5bfbc6779506f7f0063fd5b3136232302b46fbef8c94cf384fe50a97d24a67608bab6299d1de88189b612a43b897c612e9f44a0451588ce9c319b9107fa3c1188986869fa0fa43c248c91c4ba5ca3bbe31c3fe4a5c3147914234aca96b0a58c52288b174aaa5c9b156bff3ace0604aab391411204714ed067e03b38b6654dff57354a311653c40e70017df6b3bb2813a19bd2b128a5001a38a7698386e7f5ba1eac57e183034133cc83a152bbf0b321dc5a4cab8cad524eec35783e93956cd59e1755773f321ae6427b53c33cc91c920448bd7734b57672c9744164b22c9bd0c6258dcbc5fe22b947f6bce1b156967b65b1910c0c57b3076148a627a74f5a42342cca8d757cbf227adba4cb954a562ecc9557c45b76e83a88f9472ba8a4c6a0b670952f173c85e0d033ed74a48445670830c493c8c89b321b26a1c87db34707e5a21bc7644bfac385690fbbb63db72b2de6f684c68b494a461d62f19d0580bca25a878e5077e8617f69c446da1ca1ca81adbc8a6a4055b0bbd2138be99617c9463c873b7a0a8d13f8c228663730171c19462fdf02a164ccce14e53c8cf3baac96af911b328eea6e89d91bfdac72fbb1846e6b071bf7929d486363bb66cdc24e5fc93965e3ccc6f5ac2692087eeb884ed6206c924c0b1952da48a84d919805a7bbbdfc578dfc08020b0ef5e4a49d013a66ab449ed91c3f8390b2f2a7461123ee3b6cbf965e71b824c808ce142995fbfb6f9b0213b0b83c330281a26cac93f94f32c30bc22a13ea8337497b408a0ba3aabbb1c7c48225cc0000000000000000000000000000000000000000000000000000008003f87b0144661a918f149e2341343a53918b5bae7c9ca7ce36d3ebd0d4e1cce366c059f5f26e6dfba8db203c5b27beca8fedd3de2664f6bd5c3e2ac9fb3891 +ciphertext: b9cc6d4403baa088e562753c1a21c66f1e9ec19efde0365ee8e696bcf2d1e68ff6acde8394205be0269f2cb9bdb974660c8041dea23912b0a154dbd31792e2495b4cfdd1c772b12398b279ae755af3c525c700620e8a30d9bd54a062d8f64b029dfeea3d13ef53f820b71c911eada200b3f90d019a6430d382c187228cd85dd229ec0dc125b0643709486535907d69d11ecfa15b9be98674e3e49c25510b889052d0f53dc225def026fd7ea783093f16463ae4b4f0e1ddac026cd9e00db7b168fe0b9e3a87db01185ff52443ee1cd51a89ffdee88f476de7641b31e44446d8db73991a6b491017ccf55bcef6d6d2b6be1f69f789c545fe233e09da0d5137727b4e7b437c57a12dcfd26fdbe8ded090630ad6be805aba4c4230daedc645616cce15662491117feab609c89d61e0d7bdca2660d7f36dac259e4a100efc4130870f0c2bcf64137b43b7695a1a8790b365aa3ced0738c9e1d170860dfd3229145818ce8cc786e60b1d3b159fdb9dd8af4a2c8002b24c30be007233eb5fffce3ece5f8fef18286851f89b0d741cc2bcb4f8099e5d7c31034d7a3634eb7503b93fc9135c2774127ea1d30261037bb18061fa97fd44adb8fe69ba85e520f3930ce991d74ab849d0af667b6984b398e6b392648b0272045889df3f1f47a17361ef2afa15fc15acab23d4541519f0a8de6d9a82dc3daebcb242706dba34408e4fef0fb03ac7be98b331c9969e738e2e4b4ede9ce70f59ebebd3b9afa9224623aed04721688f8332b1a214c2c8f39f76ba631591f9fb162d867cca0c65041ab7d4ad9355210084813d8beec36783a2f0456074e35d43014d44d8254970f8e279b5e2d7762e7a51937f32b50eb140ad9ceb23bd8101e0e9edc34c579249bff46251139eb54ce0e533ea720c4bf3ff7a73793d83d94c4e2fb17745c18df2ef1109ab6561dc91669600d046dd1e9d6ee68b6fa5b16fb2bff887f4aff76e5bfa6f2352da18312080b62f09322211b54e7ac1a382ab2de1b6e2b2bc0bf15ed700415ef319405fc5946bbece863dcb0728ffbbebba11ca578293f0a1886f53460685e778abe01bf1df7d8babe44bd48b0cc6f69e1d4389e77049694221008b73a8da2761ed862d0127d8ba8f6e4f7d3057c3e32059ab1bb762038ffca50fcf2693d78127b2a65c335905e1fd6deaa5bbd14b350b8afe18c00cc0d4a4271401fe78cda6b89c6381e566c69bc5922bb6a43c10968d754703b5602c93e6f21b1b7432170ea5e62eb4e0c0abe6f6a3317b19e19b5763f8bfbf74f4a910e5d271062fa79fa9682baa5fd0b9db3a5f2a069fdd10aade60a618dffe2ffb2a89bab137cfb73e92a774f57606a30080cb1bdcba5dc6536e70b745161017639187a7a495e93fdc48bc24bc565f603484127ccf13f74130b8466973548b1157709c9d6ddf672efbee69a4223f164f8309cee7d9660a323f834bead26a7cf668fc3e033b68c7abf3ed0e4109ec9e263efd07b3b1bb0ab26899067971158d0cd9ff7f91eedea7c4b7e88728a1177087653bd6517d11c490d9dffefa52d4f09284921edc23b5230c109d3697c881121db8b85e1fb7c2b9cd2fb48db52f18a51374b7e4a6220e8a50d82809c6666b5ae854c2848bf5881cf834ee44171d26b0c0296477b4299b38af261f9ca6620b57fcf276ec790e47b778cadf00fede43d03e70d6518cfbd6581fcf84e81aeb3bba3bc7ab26e562b65e1599d4e8ee7a23992c5039d612855c90dba4c90cd3231d01ed150b8226a95cb87867a2358f11890914a2016c78ffbd31e7ddfb1dd97f2e0e01e3010d6633952d7c16c1755594868702215cd917b315a54f35f92f52bad10b3a7e54df657dd7e168eb8119b28507cac71867180e0914d39b8441b3c5c20ac22ffcb0ca2b201e4b350debd73a0c08b37fcd13a3957d96476d31d26153e7b4bfbb826f7ddd5b2a7d29183a579f05fb36d459026963ed9a694fbbd9b3ac3c5e2be41336b48ff5af60d9c6030dc13981585426d3a0a946b5008ff5cb3fbaae3bc491f536dd80e747f5df92270ba40502409d9b24307d775f4ef7c9c06dca69cb5dfb4d0fb890a816a7b50bebd1ae9e55ced79dc36bcfe04ab83fb2f94e10910f0086e0b5bcac717c5bc73f5e03f09ec94c3bfe05d732fcfe0d6baef66064cdb02b49eb5d938d2b9bb077b5426905865b170590f8ae3a50f823c9f56fd3b390fea9 +result: pass +shared_secret: 5772134d07e1befd82268588f722bcbc7c131d7bac8921fd55d7bf5201074bf3 + +# Rho leads to non invertable matrix +private_key: 00208080e8b3938b09aab715a0b7a09314c3d2aa03e900528a209c655886bf0180a0775a1ee133e543c17d7c24407131f0b813a9287c5c9939d43ba2c1f064015c1babc910d1024bfb46a3fbb1ae13dc5d8bb4576787a592495786a53d4c172cbd3b2cac6a2f5ab68fcfeb2a67a997d809800615c043e4bcc0985de9d671e6e0c8b071a20264c457c13b1f4734f234142e86c23170821d068210b29358694d8ff27e89c59264a315b6591d97d90ede633b68fbc36ca96b823a4bc66144b541cc118b0d60a66c89124d9080ae30f44b9f4793cfac65ab8b8cd65ac81cd95de566ca2c19906a955a04047052a699e8a132e2e48aab916278c49ccd1ca0076b5254784a23f7a8c164229bdb9b46e1c7bd4c74639053cad5226c598918687fbc50323f086238366c4ad9172346626b54ce142053de67ce8867cf599587d0a47aff0a7fc113140c18c40bb31e2340822cac294aeb3a02652b424ac9f1008a592ccf70170246e689edeab03dc0249ba59fcc6477fb668038443bf9a743255310df11b4c90a97bd212a74d5142bc6461a135ce7376995372a1bf919e3db20f22c683f488395a95e31ab13aa707c59f22e85d892830bb550395633f6c87df28401865106b5cffb75729391767522ac236072250c6f4dda196a90bbdfa183113c5fe2e31ba1187b4f682399f3c6c0288977904ab445c0c1b9caca030aa639b35029657c1608e3a654cbc39f8f096414d278059a6f56c8c838b1879b00ceff668190213eb15184a57706bd8c9111667f52a656d161bcb5e7cb8ef5beb6756371ba4297397eb6d0c850aac1e01025001b71a874a25e3ac16450228dc33691b3112de319f69ac29f2a1cdf02a0cd77319931003910331a6268f42669f4a90e79bb820e5c98aa252dcbd056318a050ab71f5d60028fc41594688cea4a95b32529c39c582ae828016644faf4b7b1fa6fd9c305807c43dbba54d44273669bcf956c197ea3462a30be3aabb1a6654dc4a72bbae53982ebb986e249d9438d66b65fa15b723267ce1fc1200bc26656d7c4e1839e02927a96304460a34a9c0a22ccf15c7390afed4a612ef236f9d00c22d04cc1dc362c08afd0a16536985f69f6a15d6585c410ac7a39599c683b9e67a33ee299a5000c7e4acde611bd6c817b1aeb1373835a245b916620be6ce8093f88635cfb619a963c99785cc5c354e5d025f954071e380876408fc5ac7fbbeb4c532b1f1be67ebfacac4cf907be9485c6da8da380809ee102af0c98beebb088c13d29830e7fca4dab8c1e8cc87a3b4198c50686c82626c41414d50878f403c10ac905f39a901405b93366a575338ed7d66c0a27c9dbc4af2d217688dc3909db8878000af307a989234174363f3cc35c25a42d7361ccadeca25a484a01967be2a65bf4998d57943759528d54e498ab18514a5665b87c98339c3fc01baaa2953abc1aba78778b26d54bdb2ab69dd705d6953dea404adf8c82d29b932e144f48a2661dc2129e6a2a1bc5242552374a504e0d135e6cfc9fb91a492e443c608c6e5342361aa8205ac744ecf974b667a6528938b6085492298e97ea827d5a4274ca359a1811c71a574dc986f4262b2e29256c4b52c9a22c3f168988ccca62e0b7d8cc8d1d861dd052bd9bb622cd8b769551c2307c82aedc92accc3d2c67c3ecf8341290af6c93a295fc027895809a081aaaf3cd0131174c8605c7fc29ece47036866f7fc326f7c947f70852356410e22700b5480897f288dba24c494685ecfbb624bc189dca10d9307595969145b21ef4ca1c435b3d39555434e133f8ec8c00dc49f02788041a6deae40ad5c9a3198804fde6230dc25b7f86a86bc00b43da73b5b40e3943096fa4540a019817881b4421961e293250056300e273f3d87153765ec237a79a16ba89a960fe42aa887c65fae65719766c44b2b8a0e54e97aab5febb1c194939e11928258cbcad6281cd37ad6033b1c9982df721200e36cb70326403422519f3afc3451af15969c2b26957c452fb136db18357516617892214c758cd9b556a827434c9510a5f6094bd32c8633966eb113f9e4902b6306c87732b96542979159ab49a170fe71a23093c1aca70202287d8288fc2f56072ec7aefa293015b6a58a2899ed79d4a09701ba42d26c599d8a2164204563fb90ff7372e86d0a6739947e5cb25b2b10d9573429894601c1891ba3c78f2814e1273c8d2098f19172853b3b590487397692ecd3b6e37f58875b60167fc208e6b813e0b26e1b42b7af60a64aabfc156346c78a225738983a03253d679437504740b872128949d971c619031b51090f54abf0ba2cec479a671d43ddb33c430c8056fa37768f8551ffac4682cbc4755267f7736c3c97002356edd676e0f26c2c0f80bbb04c26a09bc337bcdeb68bf25d183dacc4d17cc68cb8b967b31692b2b6a035c69460bb202937d7ca92cd87651bd7804a1d24826c3be2232310db3cb08ba900ebc4f5bc4052dea72e272596f6373b97aab10e8b9ef713550d9cfd3610432b6710130ab394830bdd4129e0232263bcddccb1dcf9a4f023865f24bad1080c207e02af3b56f2eb1356ae45466a61905807a5156958782b02ee86f69dc3ae5e2b23b8a01e6e30471a7c85eb18216d751645a893ea169f661230d1887e77256a4944004b8415a3bb554e436ed2004f30a19c6099a573ba752f2527e59b00ff8943cc65caf4ac07721c702e05d5ab2970ae55ba7f8a1335aafd7542630f933dc7420cd054bbae009645231a1362c74252e649844f413ac83e544578903c310af5660cbf3e4c4e1b4917eb2a0a8bac4be184341629d0c9b3b1cf38b936828abc520a3c13333c0c2c1c35185028bf1f791fc24a1ba12c49b252ce82c16085623984368269b6dce933410f5b6bf61c13388bfdd87c0b547690d3cb2910b05707865f9ac3c1872a7cde62d2ca43fc391af8328bb5c853c1f1cc06c165394874405734746874a84b2261b5032bf586fe9939a0ccc980724759582669f646406097270e2cc1371b0b6d81e575b5170760004f593a0c377c59b1705bba52eac083cc597a2d03510e8a0bee8c5e39546f193cd8e4083a3683602cb1ddae257b1c1bfc409942d2abac0586e63f3721b4bb921e135759b1efff0306105a71275388ad69c75c5056fdb443e3c708a8a107ba0cae4955e2ae7a310d97a6063690e5c8ba84891e0a9c62eb983578ac0c6a56b710a2d63305d931293ed42887284904c3cc4e1418a9c77b8158916bd028f1272518c0917b7f4b457fb09a31b63bcc9278b529cc98c4351436e02e30b639562c14131f4e7903136157269235508a7aba15519f911fe061d9bdb7b63dc91539428bf1c72861305deb39ee8e226cff39e448a9cd7e50589f85430655d0d027405d991cf1c2aefa28d83d5c7ec8994cdf39ed49b5cef917c55f0136a1a9d8cb38715cc0785d5cf5f9c5db452798348c70c52b5fd89a7fab54b75d22c6958af84bacb21621694d492fb90b71c787e9fac0ac9e3c710739d67598b8dd6428bc2ae26218eedcc4d9015363f8acd9ff043d0f7105bc7c75eb9c376da757f1b9aa2378da73a7a6e4571eda670b8287f4a333412a9c94ca39bba9759bca1c2e4649bae51b1cc10913e0cafc8575629ac866a729674772a16660c1aa53a77f002e4136455da31ec28121a7577150cb3fa0ca2c0d8b6985543d7f90eabf2bf4b85a3efeac5d0b28f70e93dd08073a5529b41ba4e2c736fe3e0192794b00fba1d429498560b2eddb788ac274c06f43ba9da341fc52cb2f5755ce3c1af65027c143f106b587a1b6f18201d9c3b0f19e4b005076834d7830911c449aa913dc6a3ef31c208d014b41ca6ef1b12a796be561b006630c14c03504f87c600ddc20c6477b5b02c5bd337f56a9423f516812a594fd4b2e794442bc8057899aae012c320b64eccda7681274adb72101ec41f99d63648763158323c753b0acec97d96cac9dd35924ba1c0555b09a3ea95d513b138a444bee8608c7ac1e64240d15028cae552855c47beb0c9f6f10cb4a3b9f68c3552a301b6a8cfb9487c241964c4e167e2c1b158a6b1a7c303c0e38fa7e0c53b376b5ee5222cb574d72734e7e90b531aa4ec656160f5a23f6b3bb2e3c72a453f73ac96ebdb128dbb8442b5c7ea842fba805799c811afebaa4bda82b559c624322aabf5a3910a152d5b8402f33ca0176fa5600b8d358d6f5956fe6171cb841ccde5bc76a27550878b5e065364139cb891065467c630d8a8ec6a002626c25c8aa00bba4be3c2305f0b1b18e79dd1a8475d2001324c898c0a43075a7c06697c2ec6baa4d78258e60297081869503b7084aa73756b74776af98b0000000000000000000000000000000000000000000000000000008956b47f0597a8f2c9a115f32c5a1177f8ead69dfddf58fcae3c35bb7d71181211536217ef54eccc82ada15ed86ba2003e177f270bb5aeee52f9436e31a379d2 +ciphertext: a64e4169d49c70374a2c237a33ac42503c6ddc7239c53aed99ed033992435ad443153362ad3c9cbdb576fea6b87ae15bac3f70c457f5e84bd387f358dde9c5a904db99386d2f5cfdb29454c978a89083c9095b2a2ea1fbe220ed78cf34747528e7559c6b6f6eb168e878046afb0526bef2f966fc80a863ed6e138d6ef2272ff9dd49201d746f82db8122247a3921a058fa62a03f259284177d518538972fb8e3d83c4644c8ca3377801c719f55277894e1d2170719782c6b136b7612eace3f903cd5c5a98f001b2c8e351b0a3f24d48df4b3f639b749c3771d38dfb69c586c44477195853255fd8d36cdcb867c8d4033e5d48a9bae96ce2d839311a5620af3dc42d35126f222b9552e1c36ab21c461cbc7ecfc6eecab244cad16ed8b48cc056ae98b4a0b93c1db5b5976a40a4b5bf58ab01c2a32e045f3db5c5ac00d3d04718c796895a2690b126120222a786520de726b43fa40eaed49f7e86dbae56c7c1d782254277f438db81e56236535b36a1c02c54dfb3974d1ac1f6c814e2fb890fb3c1364d1544e87aef84e3ee3e47e6ee32160393f9610c5ab33ab9e1b49aee4bc8c91bdcf79fd831fb651dd80bd0cd9cc439c811b736337b5ac64d61e6eb1abda5dc67e694f2350a92422faeb7774755fb8bafd5c091b634d229ebae35e3bf93c6f1d79f54c7cb6cb249a589a6dad72a4551b32e1463dce1f50e636b60b70648b81ea9febcf79a3fc8ff35ccafedb3bfd48fccef6e6fa5bfcb44a2fda45ce7df150b9639a9615a936ba1c2fe0c6f2f660cc820b414da22a3dbf9e8139ab3a0c5c0946dbba66a02e2c5febc88d46e6f79d0e669e60fc8f6df1d346aa9caf90c16505886b48a0c6fb41883c93b6e8d307b97f1ae01e5e4af5b9be506dc4a8bea249f50141accce764e85e9121a7cd087b26f5d248113ac7b97517d575bb505fe6048df915fb5e0cf304d636d4767042c609ac823d9d2812b9cdf4207bfb3bd477ec047c1987162e250d2bb57791d1b84b4341bf55f0f93afd75abbc90cbb23e47dde24583d1acb6720e1722231f9b103b0a7d454182b6eec57eb1e4a64fe7c92133302c22d941a0b17e86adc350b47650cc7a1a953b78fb1a80aa44735b3623d2da25ed5691065a467ef15a3dda917d80c1d47f2542a0afc383e75b0e955ca530d61df1aac8da5f1ed8297a6b5fcf950f6cff8521a7096ec2391669742087139cb5665cdf525c7c8f157af19779156beb2fd39c34ac614d2b0a91d87b050f64aeaff74bd894d3a68c1a52da47a42ba04d06debc14d9d82e9bd94aeede4a35b6bee9732bae0f76e9d07f742a430441b9d8af5edfc290a6f30050841c5921084d7df1ecbf8b70637090cfa784d5214839977eba9ca94f3432f47bbc4d60c465edfc7a931e7f569da5e6b4dda05913f7fb67263cd939b15d7a8f7c0d15b2c9c50dfee128ab50821b3fb9b724b643a9464b0ca38d51c751d8d4fe5e378339c9f68d51a245fc0ae76ba14d9539a90e3174199f503231d7bbed22f977b37a34596cc8a3207b852d6b09e254d7aea868b29c6506881644f493eb41875d6c51218b7d79f7f1202c0ae747694403da054128aaab773e092c04a2c34f4a73fba19d99df3a81e4e60c1635f0b34b0a5fd7d0e5a5a236033fea303e819da88131223fee2064e5981d596d30ccd7b744e183bbbb58bbc7c84d4ca59cbe1f52e2739fac45fcd0a706a1123584167946169c3494ac911a02deeea2b487f5d57c4429210cf812f90eacadb7d51ac65a6dc49f9e51ac3b4650bda7966eec378df60e5c98723bcf7cd63d65a93569be54d17a54df9502f9b6b9f6deb46acc37da4451883f7ca49d4075d045296012b6f2584c972c087bf948fe7d9f0fb561dfd91c3e64f8190ba77202331e5988aa9d5df9499eee4119fadbe2b5530233d6873bac60c5da33f4f0de0262eea35b2041c3864731c3a3fcd9aadadd6eadfa55249dbb5a8b63d4c6f69ecfaa9dcdd293b7e85a3062b53e7350141ff7f6d622a1f4978ffbe22bad117aeaa425568cea246d0da900568c70a412fcca2fecd427d14d59ed0867b6905adff8cb33bbf33743378d4a2d0ccbf79e721d22d4c1a9921e296640639a5dcecd93a1ef94a06b25af0628a32647127c10c504f77ea6ecd31c2a035e8baf3fbb1434c59d28d25221c6d71cd063e3d6000130ba62163566e2f8ace8e2031a530787c4c9b25856 +result: pass +shared_secret: bb7c4b5d4fe3d2e310f176eda060f614672dd307e94766a8043b914e9f3e5c25 + +# Rho leads to non invertable matrix +private_key: c5f6c739c640b093956cfb9d54272b3c704d3b364ff1c68510b875c8c29f30051b5f60b53f6341082252746b8d4eb52b3f77c818d42ac776ad393072d458a28b186da2b61cf64bc6d8b424afb49a3b2528d4863c876aac69b7c7fa95314dd36ab5f021ba8c575ca458c469409b71b31f3a8e371937405067951c084b6a832ab321642c82f33395b0701e5a677c3c783a47d7a6e474af454c1b31b174ce5285e90608e1932493e44bf48b921d6a58b1b86ec2a38b8ba2a1fe884c0fd608af3986270391d1a42843637d75194722d31bc81b2b507ccc0fdb309e59549a874d09239bec5a41c4e9bb48d6968152ac9d431cc3b290371296b8056ed56898b272b948e556926478291cb0eb1bac50b6718e98b74a1777e685b7b6d7cd6b22bb5846c69149b4e7b292a4153763b768cd5a67b65c3d059464ccc123ac086f9f41c3395a56ff3152fe149d76ac2fee2079653326bdd82dd6f66b6687a7fbe00d9832b09135756c5819b1f66dc44c7b32c2496f63cf077ab51b8626d0918030134b8384c565f0715167b21fab697e84c6838a71176748f12334078c27dda3133bd44abd69bf631badb5f2664f2857c033102ce8284e4b2beb9095cbb40587bbbf457054f4d11bf938af207c1cdc5217b0e9797bf9ac88f3943873c8b66883d2ba5ec7e6696d50a69ba55457853bc526819f1a6fe09973fbd19832312b554653b8441e5eb01884e94a355732e3da645eb849f520bb2bb4327d560612852152f8cba2f77db8d21922da08e60bb9e3b39b9b85bbeb9b1715982d292b8f1017cd3e60447278cc0257898575a0eab1408122bb3fba17b62a31902a567a0821d42086aa6417c259a1dbc93b25003fcdec9f6a5507b4b732a43c444c5825a05119cd089fb2e569f70b4d5e6919faf15d6eea641f5a2875763f42b3991f7c89fe473cc057c148ac58b6c88dce537da8632c10ac851f8916fb7b6ce89ba5053b8d95d29ea5d36c91981042c4aa1330aa098a6ab256ade08592a05c95021606adea0ab637824214009c2b915be450a1f7434ea2c7f562a4fe21139c2652ca8785af3208f4927abae698dd435e90e7474556af9b907f6d73c4ee64897dc74c6a876eba1b598e784b8094232dc62bf1119ef764bd1a3bb2d4fc7de069273a223abe5269a1403873087906db164b58435ef41d7d78b36087062419123c8b1d54da918f34920d3302ddaa300797b32c1c81b82798e421ab2589964334714a75cc84548031d5810fd87890a1932c98bad37c860bb15663cc0e91880af1947b8a26be9183b648b714f763b81652786682c210301852776aa673a1fde470afb56eb0b0114895638c609d8d55585d68c165f7aad64c1406a165788c3364667f0a3c65aa300fc4585e959abbc5e1b316aa108a1cbf703965a74475147a2d323b7295d185571000e43b9120b76fb0105ee7a385965026e8f8309d4badef88b433a59090f88bc4eb4ee2f6c1f0d880057b477e628bc35b023a4c9ab682822556afeb32b6c9088e35c107e2a43506c43a986a0420f5164167519c4029b47bc81e93c1ec149e6083b13589bd2a9c64fc6247ec323b8cb73cb9f9ccfb8bcf25617a87a3c2d8b5158ac8661dfc789e92cc8cb39ba3237b6f13c80ef947630578d2d213f1914f94c61429bcaea77c646f1b99d35ac8009907ccf604c1211ddaeccc2f1001b49776df94560e5ac35e0a7ee3f39377e252d83558d6e57651b0b3c0365e6a133dbe3002270a0bfdc524e5d298b42c1408e17d155c82d69c256f78a69937843491153ec2117ac40370934d28783a69d0a02526afaa8600d289c27e9481cb737cdc4b9ddf53caf313b3c4b862b08045dc38428b126622d77ff3864fa93919427b049786042d234429e9858ce7b1d57a2fe92979851b9d4ca23fa7a80aa4738c9b777020b857b8fa2e442522423608d51b78c574569b9746e441bed403ac21391fe327818dc81355bcb2f5758320965e10946cda9a7c1d329f7c1720857c8751e57b87186e8dc21199e3b7ffc1c4c5607cc3c258a30163131c5db5d96e2e8c2f209419d5a03dfc618a53b1799cf102348b89ba289fab2b206f61688fd974023619fa5187b8cb28be778b666294bf029d7fa9abe3ea739f131930a13629bb6fa7221a788591f595911d3c8a6625a08eb82cca6371fcf0392e359ee7d96badf47a3a46aca01aa9ee8816ed4939a8da1c7a6cc0c78a2c74dcc482aa9b0f27234d1a418b994fcdd4864ec208e423b97c98ad541878794770730c4e1662ac60a1140a6aa9fe425fcf9098cf9592725712fd995a952a73b0f8c4c312a1ba498d3bd9c742cb7f011216bc816e6cb13324c17a060361b01551692a7456a46c76c994ed067d102947f674b918e5c924c86a5e6172b0f1ad8e7336409cbe7b16afbc48aadfc4a77bc22ea467a2cdc9350313af150a9eea3775a78b45d743afbb33bf2ae2bebb19b800eb18e59a74d79197d8e36f74790645e77d2ec46a5df081bff73ecd31c0cbab6275710206fab518230aa749cd4f5099a304017e937a264010620b80f1d0c7244480736ccc623c8a2d7938de85411d7acb1ea00cc8298d85a5443ee058505b5aa3d88ffb3900567a31a9b25a3082035f5c037e571aa832672a74961e51290cfb0b55843229d11213d18feec5a35ff2160480887ff03c16c5a35e367fb6f5561ea266e973928e3b1304d13b3924be68855cebdc8bd0c3511503ab8e50c828b04ef2934c41207c725c8f1d589956e259a9f3120d6392851469b7fa49b8452389eb2de3497586ab043448c14a13310ab5b352a740bd486e31f0655dd472dc3b3208d06a79cb0dceca7c2efc8cee019c023232342810e3448b5d019859da0ee25526b81422f884438547386c3c38dd707e9ae18b27838556d2398b827dcbac8344c7cea904640f9608c82b4b86d27b3f4ca4882c6da694bc78bbaa08c900abb62379eb00f2ba692b167264802d47d74ab3671620194555b8249857996a25bf8b44892914cce1433685ab210f92253e00a355b96d6716af32e6629cb26771f57c4ea7cc80476d3af5a851f191f35ab646961780e35d6ff449e3b258b57375c8a43718f05262c274344c95ad251ae8619cc6714efa12ac9999b085390fb684c03028615063ae5f472962d49dbe7a65e248152bc73476026cab06733fb57182c9c539553b223b31adc966c8e41cb0e9847236c38ca67c13966c915a9b04088c72d15ad221950e65309a2bad8a58693168b5e7d7be403137f4130f8e911aed444c84e469f98228a55a2c2c22c0061861d866aacad343ba3590145424ae886b52c862cd0036eebb6fd1e33cdc957e2370ae8b42c2c7eab508540a72698810533bdd7a1739e88255e86c8752974986bf36d889fc172d9c434ef3d079697204b778117f1acb520c63462c07679347c4604c78f5acc99cc58c245490250c811bcec2d2184cac261263581769044a232dce38c6802c359e154119c4874fd95bcaa5a67eb4c8c3a5104f15962a725e5ac34e0dd363f5aa667a22268afc4c382a7968017331f4cafa6b76999640283ab672985a27dca0d39c4b7ab102fef1863b06b67d9bc01b8040e1156468960f1213b365d2ab2a877468851fb627b1ed7154c6b83e7f62ccd65ac410e8c97adcc6e37c3b5d7893efd6b2a0b995aaa9171391292aba405b051f5125c8978a15fc479a55ac296d7c278ce5a3724535c91209e1e90cb113423d27845c95aa1258afc49a43532ab873f2a6d967796421a8da73cb2acb14c3981bcab14d1c7647735b25de0ba346bb61acdb8be7f513ce561adea73d19c34d41d12499e8a843943bd21610e3749cddb25d0fe0959f8c0559f774d5ba347c30430684b7535302e4daa90535840cfc9263fb126d23cbe85a43404050eae4badd99a0a1c24e1a2b4df41c8a8593a6763b31a4642830e797541b3ffac28bd7b7a496053fb1e0b4002433dfd705251900a636b7cbe3858874bb9585715bbcbb74dc992f4a5636fa62c2a56989529f7de46bf10845e9e9c03d282261715c7b7c97b4786387411cfe36565c2159903959444c68a0726fbc5a13468714b92cc3f953966fc3bdc3cb1f606a5548e4bbabe2755c56a35664394fec77d9f0646ac5736903a537d29bc6e905bfb5650cea3a5ae0145605c0d81191fba11da630b5c6c866cd09681ff16950b495b9aa6843141236b079ec67cca7c554fba14e534bca50590c1bf40ad5403a1c12578337b55a684038d4046f2c8d4be864c2025cf182592871909e824c24815fe1e206e37001022ab475481c56464a1d258997887c49a052b43108f6b7b8b50271eba002c3d881b4025cdd3b000000000000000000000000000000000000000000000000000000aeda4ee0487346c360ba29019b2937a8010621827eba9d49bc43daa9d25a94552e8541047591efe1847559704339d0ddba611d0ff8017cdc84e61184715c93e2 +ciphertext: 2c2a21b05890062fab5c11d3d55b8e032fbb07ff61ba147998ad1a4d200fd8fb17defce7723b268150ba8ce7a4d9a3548538e2606377e91658440e10b048c8c4e42289a17f398a664986dbe522ba68f42b14f40f25be762aea2049c9444dfbddfe416c04ca7139471f185a441a515e0d08fa24991e9f02d37520749499266d2d5980f35356c86dab927c39d9276aa745f4f9d1cb33c386faaf84ab03a67e42fccc7eee3818254b7799bf445a491b1f4bc64de499ac4171def329cc94f0c4b0ffcd6ccf9b140c776993ce1a0241d8113c67d852c24a0e4e070ccdbada47e953cf65146087476d1b0dc53c039427f1ad7b466304a4f4b2757f661bae492960f667ac439e3d8d4595d7da06367e69015df630a7292b0dbfcbe2629808ca08e3ade11185ded915fb0f5c599417d2d2c9fe742db9535ce90e49d2e70cb83b29490de8db042530e16d3d35b488ab1693ab4d9642740394fcf6b34d74ed47a16cd2e6dfa80a94eb1261ee6391687ba0bd60ec124cb1c3785c2143b48b6ae5c2a109169a974599daf0c682e1bd74c7fe7b3b76fbd5347750755195f73af0a5ddc35c7415302f34f331fd976a84426c3f1b0bdbbd0fca925e7b2e9f78e77571c761f896ed51b66bd9d8d4dcdb5a8d28c382f322dca57bbf1bd6a4131f162f4d8c0983a0140a3bca10d947efd93774edb8b4d0cab98e83ca40a327d68c8cf5fe4b48583d04612bf65e61f00a4a56a63fadeb321a033ad5f7b65540d74ffd144495ccfdfcd4afa7739811590e4d7357a9f80732cd0ca6355c31eba16fc0671de573de5c73d43999477bf383e35387db6b9e236850cc5a286d5a93e9906b6c53bbb822a43a59a3b47676d30d4c8c4665d73fb275ca0dd493afb80aae9e503518ad8c7cd5486ac10ee2ed63913fa20c4e3ad6231b39ce07256f0e8ab72a8281db22ff9f8c2c655209ccddaccc1752f63b1967b218a872a36f84f5fa46064173f44f4a0133771abf6183923eb11b7676ef55726f62689b4695fa39130718c21145dbb8979566dcde5197bc3ed8381e4bdbbb881998a60a772811c50babd1f7811def20ce5fe1937a28ca433116d6c85d5e8046c7b7640ce5b7ce5e3c11e13c2afcf6c20a633abf9e4b3d6323b71acae281ba73d00d9da20292fd6e6042dcfe154f22b308e78ac3decac8afec89ff500534e6e789459b42358221b37e180d3e0aad911d35d381732682c2b5a50f29d41e7b21f7958ace59f56fc1ae6de40bc26a78ab022b5998c324340e95aa424677d2cfec90ec8785339d20859687272bdb581b29ed49a5463be54770a17ab25214806e9acdcd650d9007f4075659271c3b288c9a6a8a7e8291103d2b750c7c088637a733fbddc39cf0f0a9dd6d9dfa6102d12c5dedefd12ca43e43e807635993be1495c18be1c90f3a620074b86655c40b904c1bd97526d7b70364a2af22ae002844c6741ea35263f08d6be51a6f1c039b52dc08c89b45db2c4091c55b3ea13f28494dc0c131aefda9d3b111cbd1df48eb51f68db738d31e73b03799a57bbbff09a0018ee684b6502422edbb80022498ef6e26065bf5ac7e4992766fef1548bbe43ee1cf9335fdd154a6731cddb9d50165d28a62774f23a8f4cfb381a71e488cebb6eb4f23d97a6f6e3dadfd0ab3e146d0873738f1e3f9ac9f6ac38ad1566dd5d33e263cae86e9162bfaf0de296cbd8508ce6e1d553ec6d8915e69ecd0d460a9d839f66aca1481bb17938c25e6c1839ccfa09e5660452b4de60ba32d3492d2e321236fa62e00f56f9284c1cd2c994e503a69aafadf18e631f5d36890cacf5950364dc8d4f564352df1da0ef6d7749108c27d63f4de76e0805db07b70f35adc2be0cca552bf5211cff3cce4ed17fdbff7351577c14344fc4aea63a3e659d615f80388b2c7d1b75ee007138f76a42a82f8bd948a06cb6d8c2f9d0999063e5dee458e0d18b861c4e298c8a61bdc11d54a3c2a3b50da518bcc39db9252f4298c878d2882248cef7b7b600c455efc13bb3f0f0d16380c86272db86f988465611f208f7d1b3e2987bf60a432428a0fb810d29c1c7ab3ffab55819cd168454603c7292efc59fd7164ba2c53f9bfced9c3da9a4dc9a9f48def429489a5742147c79a3b7f2be6d20a2db79dc808e0f56a721c31b1df888bd19acd89b273f169984109b381a1e449778d768aca994bf8e9740b0dbfc1654e2a7c14e95fe5 +result: pass +shared_secret: fe71e2b85d231f4abf082d4f7ca86f042ba259b24a14a934d79cace53cc10b89 + +# Rho leads to non invertable matrix +private_key: ea53a046a53b7e3298d588b38c403e67b5620c5c73a438ab7357660362ab3822b5e774a9dae973c83a96db79b550dc176f9b0182d37f12118bc96a4982249a352219a110704e4a0ddbe545e4f55cfc2c50d54cac33ecb6fcbb3ac2a7bd4e41282476797a3c24f4ac4f60c33da281cb1313035c9c804d755267894d867469dbfac7be52a34f55c0dc642354e52967b043a0e0167c806581b51519e04af675147578c79f492da3ac0748352c6e5c7ff462008cb42e9817155444b214c3b93ff3ae7d44b5c2b659627a833cc18ccfab4fe6d6513dfa67cec499cd7a0d052a5f9ba378bff75033e69ad053c04b74c8cd756c7cc0bd494129e069cfb4358324066415bc2a4d1cb8401867c9954aa8a33f929ca279696cd515bff0abcb6c8692aa9cc076861e2bf27ec360983f775e9f166964d0c43c380366f19d3f868a7e038752d30e389c0c057b6d93a9ae64746d5b3a146d31269b94c7a753412be68d09d820be6890e5db1ec3eab1acb14cee8a317ee7ba0eb6027f13a540b07c12cb1164bc7d295c16eef4c8d9773bd2d32ead764f58fa48abc2a5491bbe00e07965017ebf40c973343704112bc90849d219c70b028ff3769e720c4599098d172674358bcaa8947ba6b874e3d94e623122ffb3984a0b571632be1c540cc5da45ed1c57da1054abbc4456678249a2589544c3dfdb6330ab35416ca49c8046c9446150660b45e05b720722bf390e307445dd8a3e23253cbf633c8ccb098976a68e481ee86b86a32865d9caaf385842cdd071b0974e807710e2b44c598a4a36bb2af048b0fd30bb6c64a539513ed2a5a9c6cb16129cb88d6bc62389b4846a2a0afc532eeb0f055aa85ce7b43f8099cbf194e664c59e683e535ca809d40f72d4a3d5e287b5ca3880d4af1f1523b60c8f811a17b2881602ec0393d54988d63a1620a48ab25a5336b25ca25d5b21425ee54673062020f065693665c68399691748ed8c2b6ea47b89391e7dbcbb3e4bb8bc0972916aa0ee5b90292b23618c5e9a68bff8476fec1c7e382b1cddd45069263a507c44b97663a9c8b4bc690c89d25893c4caca0caa7633bc66f449bc06603fb747843b0a8ce11d46ca100b3243a8617904a2ae48db08ba24bacd5b946cc96b834491a246850c44a0f049bb3e099b3353b28c3889bd4520ce75749b745e65e6442d970e917362cafcc9cd1a6194d9ba41f29feab98320e10234c1b0fa367f7c3a420052a9ace9a0787bbc420832db814e8f86804fb74090146f899a624ee9739ed55c40b3716724b8a8164b8b976130d89e15dc24e2078f24a953b2781b7d36a12334356a6998870a0128ab5152a89ddc84aca3475f8cf849bd762ea7b23bd2d743a9d3a9a2c2ae4723b5c1a3b5349a2d4bd2907d89ab8fe80624838130697bb1d45f873a3416164f862630e96075fbc5192be26755eaa1f33026a1f201a05b6b57ccc83fe9c191b13016a921532c4558b44ff0a26c864c3102ca921c299b38199f7162938387c3598362e5f616756bb5aad68c68e0a34ce96684597712341f391ca6696538582ab0dbd532c7757b5b24b0413145395123f0c4668cd538782b0f65ecc30b687efa78183de47f53b73831210c513c54febca584a4780ea352e9dc85393457e71ca62e85abb2322aa45c4fb3d29b15d55a027b8a74186000b9a05550b2a343a3ac21b0f7a2b2aaf736a1ca49df5b61fa749266b0696ad7b6c48b0dc82803b10a4b64d6caebb33a13c60effd699ad44c1985c9e3f8ab21a0cbd728ab52e07c4bc5ab3f6c698ea307f435bb7b5545c44758fee3b9077b5a318c2b584012cc9b57560236be789bc4b026d1f26a857365b2d1a6e809a9f71e140ec56c4db3829b74539a90345841483daf6840141100c66cbe057261fc346ab8c36b03cc2b2ac838835cd373836bca05d9f57ce2231980ea1bd9908111e79b602572ab37495e9f6025269713f4318dc472d06b473268bcc7c5cb956b5a1ebf419aa18b9d6f184849240470607fdf6325ed561c270b095079734fb61e04c531be893c2621c5ba48bc897868126b995e75777c8ceb100c67556484b71404be802ded5299cc41a83b0c7a99c8d36d55f7fdb4697c446904c2420d667f5e58e0837778ea960bb6605890b8437f24f7d35acbccc41acfcbf2e35270ab368480813ee095bdea49d18f360a690b145d96b0ac56ad8007ffecb7cd198a9f6178add5535e863471cd5198c565b62d912fd3a9040828ac9834ea753c0d77b5f23637e5891a92fe7508b672deaf212c2711137915249b50ed9bbc2f7e804536b382d3a29b6132337e68d363903aa84b08a989f2482c56418b59dd351c54b0b89ba5266d354b91b2fdbf26812b19c79a12224b723bf0b0e6967bb1413cd439789058091ef95c62852075e464f717ab84db9b28b23934f625f08d0a05541a5866343a04216dfe83ea37abac6e273ebf649f7e391df2829ad2aa45e634dfee00fb465bc2b7658b36556e7c813d2e4a92eac6c2b84c8b3ac8d13bc4dec0615199b63860ba29172bd8ee51080071553489e850b1d8026a898c0941ac62fcea1cc83bc02fcaa3b5e76938ff96c3c682fef30c320d3a325d633f16888613550c120b9631235281c6f531b19f8ac1958eb531d11a857843c02e37347c13d8a216c1456a9405111d7e00d0ec2bba81b0a4062908883a3f7e088ffa10118352646964be2ca3ba2f6a4843b836d538c042c693ba928fa1651521894a7f83311476faf50add5952aecf663686a07ac302d5ca15e16baab85230e077acc0ef4b36de2613a1c210fa7c7c37188f1685f067403d4babd15925c470b8559e8abd4db4cf965b845f22156515ce54643f9ec9645c53c5c830344f6c7c537c87f2b6c70938c58139fa6e2237b03aff94b48abb8441d8b0d4c108bd6f4114f98c22c412b0d559a25c0845a68bf6266b7b9e17d80dc6c3631ab0620c0582b0705cc686bd267e8309ad1e33ab0bba9fcb21b13e7c455887d07a83d34d836cec3907026911d799653ac0298fc1bcba7c941823fcc88bdb39541cf989bcf08a0468451bef079a627cd31855667e97e3eeca47e2839ae32bf112b71af0003a42523390bbddb71cb1531264113b990ca286f689a3c660496f68c5d68247677262eb36b7b26ce6807459d7c7dc5e4782964122bd96d1b5b8ed9105ad2e72050d874ca1b09b7bbaec0107c1abc025a557206446745ec8d462a83e6a53c5ec6c0b8133054745762b5b4bd142a1e2c2471a81ee35cbad7d6200924cc367c3a3c55032631418cb6a3124200209a782e2a0036ab9723f511fae105049579bf1051b9b41d388609cbb81dd1191b857699d04486e018779a4011471a241fa9401f9009c90a14ac6a5b691bca69c3c5df7b45a7e77267f1082f0418a8d14bcdc29bbf48758af83cc9331e3fb34a49a2570f75562d0bb7213c230a549498751b2cf0bee4561546907f2aa436f6060bd74c3b06a7812fcbc63523a451b90b4c7386cb5614a97a146637c38cfb77ee1316d0ab981b4874a9d263185908fbfb1aaf9b9939fa2d3d552bfd577de94264740ba291ca4c0f732263617dd8d7bdfbe80797c68932664e414c8ced3a48f5287dddb04655b76cac5ab725763264cbc95dbc2ad7976eb5508482389e6bebb358097c79f2b3f5f6a0249881fa6b932e6906816038f239992fa23e3f1814003c48cbe3542825ac45a00d1c104d76424fac824478471c0349cc7fe5ceeb21c5bcd1c262154fda607fa811aec08856b444544366a62a57860e71b742b61de0f129009924af08a92799213b933739a3a81e7a65002596da271bb19675c02302a0a2cb2d928318c365cef3b828a362166b9a6eda5bb7e610a5e22afdd390c6c5a0e6f955d1740e8fb41347a62abe59752ee6ab13f78b4a3c3fc0f70de4a46d276333d5b51f139cce889ab9e18643f9a18be7349a319913ec923233311d1473b37f39185d872a9547b1702cb096526a8596127411bd1e611d51816198b95bff68bac6538149163330814d4d34a84cf2c174c96b21787348c037ca48aed72b22ebb24afa3924dbe43a36f50f55f3bc5ef41125d400eaac4376daacd71398dee37e84fc007f93b245ab0842015cd26671ab840f74831954d9886e2513c8d752ba15943945109b601f051146824181f258417cb393e8761fed36c5fe36590a589ad52675a9b2c05a1565cf54453c7781d01709ac331e5fc454bf222d4f70517f80afe7d90038987df37990a0a42095a517979a0fbd994fac3a42568687b20c8d4857321edb8c320682638c55c4a352d2e843b52278f78953a617b08b271b4fec05109278ffa5b74856188cdb6e30e800000000000000000000000000000000000000000000000000000049ed9ddc17d39eaa0ccc036cfbc33590cc2879b83448a701412909421ff0eee75ea63afb095b03165e6f3b9488778fdd771036713df7b893ab8777554eb05f64 +ciphertext: ad2de30126428ed97dc602f7d15fa00dbee9bdeace6b9fd7579ecd9c015fae9d9d752b0a56fdbc997528f554879ae42c40259eb4f0d289ad7898ce21b45d0f84981eba7a48df5be7b6c3b07675d5f4c241c04281781e80a9baaf183570f47eda8e535a39f8e8dc562b28c1cf2b24118d87f5c528ba93cd5f4757e23a2a9ded44295ee1e706444e62a94e04df3fe4d2e6e77f77ec87de4527f20f93c62939e08b0bea1a8862f01f7a884de4f77f7f32b6ea6fab67635699f2b19eac1d1c4902432e1f2851bb35fb1e3a1ab79bf2d2589d34eaa4294c4305090b12e3625ee42c8f2e6a6a0ff86eb4439b4fb3371ef04b61f5b7d75217ddd16dea7977ee763f07da3cc3eff2ecea8d4734b8cf67e4f95874fa14ae397854810ab1b593f7eaec2e87650b11079d5eba756ba7282f1bc735e9dda89ab226148552a0a6bf67436149a2d79e1212da11ef87da910ba69e1499314f3cf90fbb4c04730cea5fb1e5d35eb1f522e09590522d6294f212c223249f8f7ff82f3707875e66621235c464a7564df4e0a825311cd915e6ebb0834f6f8a709636ca137a32d405550d97f9dc1e8b970394003fddccaaa1e98185d3dd354f3f390a5e6ef9d293e45ceed7be1583c983eaa6f9489a994ace30441b252c375cd448ff4c7059f6db14d1c65d14c4a6b1696381144bfed51a55827db14584f54eac1073031d7b282fc5a48eca5b164429d9bbf46803cb079924c971aacb0bacf3e58637b813b15794029740f06fef8d80ab7013041f3b11e04df8c6737bbe842c8271d584e5c84fa01870c9ff001864176c967d8aa39d6f3585ab0b0959e37ac8e9cb06e3bea1083c2053cae238c6cf55e9b6052592ac075900eca92404af4a174a2cdb94e202c31807cb5bee36fa4e6e6f67ad4eb5d60a2edaa101408a8e16df3f3ca8cd6e2239b079d70b5dba53a42cc594d595160a3ffae9f16121383ba5b778397518095a4a92d26eadce6840acad84610db923b5583024a5fa682a3e224c5b081a75d9903a870642151329befb6c7f83d5ff8c0001303e7349fdedc44067f894023dbf61557394bae481cd25bb48ae7785db5457a90fb1644f16b9aec60baf5095d4182b10eb12f680b37b779619f59108b055c7e7d0e33f2ef4a8911ac876dead82cba65def0c3015274d14891d1f726f3397f0ddec9929189f7d5498b41799f6a4cb8289744a9ef7d9c620b28ef6cbe88188111a5ca0c5a320c47bf7c12fc1cec6a3dad012f073966ab62ef5fd71a7dd05d774c322c8163b18a6461fb321d77fb26ea2afcc9a7b30bacf3d6bdea1daf3312192632b9a5a5f3938d42f3e7b5b48b4b58d915fd8bc63eb5135e5a617a333a21839e47d7f61e6d206ad88332c1fb55b71369e63d76e9bbf8e7cccee4307db753533b61b7fa2edd1a2fd434ae1ef841c87f6250dfe40d8c045e47f9b93abedea1c4ffafbd0d61499652e3b636e0b6dc559bd3db9b764e4d46c35f2434f23ff3628e9b4c30a65d485d29a57f5a400aac8df42593b33833fd138408e63fcd8f4f1fbd189c05d651065473a88c9e259029f752848d07f80954af01e8cb70ba019e902260a612c24bd8af1e484b280449f335bce1a32878a0af01641bab8901ce362ddf2dc31a2ce8aad03e8931a427b07fa2688114feee300302d193b05db582ea6c1c68c7c4e405e72607dd4df28c905ee38f5dbb6b0eee1864712a1489c974764bf7e79d5520d2695025a04173049057b54c23a3d2b9e4367f6ffc7be4bb3642b7fcbc639614c3e479bf755c343bbb925c7e7336d567eb051479521319be75831191c8321a5a887611fd8353463f245f91c396fb0b5e495dde71b124c875dcae8fb4d597bb84f9045c17949692963aef558be7260973589ca0760fa7980c85498946f90c719adeda096e111ac8b3a215084af549f4d61f8253f4acae2894c7e880111c1bf01124bfcf829ecf809b67b08bfc3fd9c8afc04c330fd67df9a07f2b92f19b56bdd5c621b62ff1b55d7dd0ba5235e72d5e88014c16016178975c14d4b105909e547dfa6486043025e55bcea08dce175cc10bca8c56abbfa688984504f5176a12d975a99d49c30ddc265f1f251bde72ae16b36d9ec61640c4728415521872967a6521acd50faef7d198e78e33e0585a14280ecb2a9f8a75744491d90616ee35b34f50ddf9800dd80bb39fa9e7b523bb03760550ede1a90aaa775 +result: pass +shared_secret: 365bb81ed68c6ebaaa58a3633b096874485c19fccd8661cb2ba8c2634efd0fca + +# Rho leads to non invertable matrix +private_key: a7d40e120206cecb9458a1464b96c447db086780708c7435e40bafe1ab8cf26caced91b888711b8b95414e080c2be24d7a622c2e0410fb9c795a25a50554abe8b9049f9890e29531cca88e4284a5bcec559f939061b003510c8a23991cf474ba6676b0599c86dcc0976f3b61cb624954d3914bf28e109193ef1b9efdacace8574dceda34905485e1a79d51c8ba06722150d8a243d69f671c18b1c2a77c990699b72ef5b1c4aaa121a8e5a6cc971178127024166f2593893bf3b9e0db273040b0821051cab28af5196b8937538a680b39251b08051502c2a3d5504f78b767dce91e2116280c3532e9426b93d8cae3e9abc5aa4832c6bfb02a71559bb689f82c22835fb314a5e6d44bc4085eb39ab41555103033a0f4b6aabfc5246c93c07840254989301f88776c06c9f808369e18445058b4d940783d57b7d7901b0d63a6e6512b31a63ce0704028d936462c18eb4bb78accc3dc56884d9837d8632a258c4e998cc536248aacc62f7b9b65191a28a27a1cf44a0d512875ad5112e034c0adbcc67edb84eb000bf3621e7c1c5cad1cbd06f848c5d8c3601b07463b5c0e33cd260a2ec99a972c47cda74229f6292221391f37d20903aa76eb6966195acac6373a41db78b8f7515a473ba04397c2e94a26a6acd8f2cccdc572d4b60e56880fd0295152e18bc79699feb1a0b6f6c7ee19545f4124eeda5755a85d79fc2dddd2848216576e9ab4d07b7ecf77a74937cc1605602c62003dd5abaf601b55ab0cdb37bb3110290f829a742c5607ab24a50000f3191f435427b5345ef884b91811bc44fc4c6de32bdb0a73edf80c8783a5a6b6a2d06657b16104cd62ad847206ec1b87729260e91b2afde6b0f13a87025c10bafa88e1fb1a66b98a5308a2c4f10874324179a2729df786627271ac5a945072beadf878035169c543c0b07acc49241b7feb406f524b71c787ed757a3d48c233bb75d97c42e03b9973cc680169520e400b00879cf2bc9119325586719f22e1b2de163184b2c43735b2c1a8654c92138b90c458421f681136e0d6c417b20a5f8c126d3672a4073942855b127a87ce96c7e34861923b3ea9bc9f0aa277746927f0777814862b0845c3bdc12309241f387cc6f4ba4a9688b947ec8b5603ce88ccac5c35756d0031ab4a5e32f6ca97184df2acb38f724fee64a6a688c69f6b913576af98ea2487db097d7c81dbc2a29a381b2345495160c348e8207e313929dc08412304f6a01c90f6889e23b7974bbd6f081f52dba8baa716b53769e6f71b962156cd44a3f50563efb3b65741aa26e42a3720ce737c7a7ad5c875663bfe36bde03b106647ba1ef098569bc10a0940cd300d58571dd354ca5ef714733bafa4308b3c4b7528862664a8656d16c9c3837355e39072db20af20025306390ef32931e793e33333cfd893c6227215027ab7ba9cc0212ebc749abbc62be483b3e2406a5ca10d7fc534166646473c27979053928aa5445c4c1c26cde40777aca39f5a64161c322135fa176d44b694341a0d3a05de662ef0e1aced53c4ea2762c1333da3f987fac65ea63a17b55c3f681c568d648966eccd095928f2e32af2fcb0674ba3a50350e282c99af149ab1b3f52d3b9f838b1aa8cc5dc9ba816e19d8a177de33a855960b7c464cfd51a7279a48c80091ec357b9fd118e12f00736036fa8268079754a4d565773f2a5d5c913109a4606a276d07372eb96474c7722d85a17a50a956b3ca8132415b2c404a0288aadb44fbb00217c0005ee36137768c3d4169d300ab2876c1b2a92c0cf119fef5018bf7acfd2031929b9671898c64388898fb74a483a100ce2ae67275e53b00d94c2888f831a286631450308aea2580fc5cdbae53b7108a9d3cba88a437a5c0917dfa3bd7fb2266f2b2f57f52724b67e58cc2781a95191f60a34d74199102b5fe941874a4433034ae6c9aff9e2bf16f01781d72424508835e3a587903eefeb0b0d218e11183cc7293c81c09cb5fc4eaba4cdf22284206b23b87566da704665527c6c587aa3070b01e79094747a87ebb2b9e5296a2405528c224ef45ee6fcaf0c537fa2e2479d579d71a3400793188d895323f274077416f94c4e68811ad9c73598d7ccd53bcd18f8b1cca8bb5591298132258f4210d36722217c2fc5925330d03d1c037cc7d520f52b770231538782738a75b631f992d3d74842714f03c31164843609092942715aa4227254a57fa5325e39e2763ca679ce680c528b162d18a3b60c6485e4aff926895b4982a64c40b28484a32979d849b380ba867d355ad55a148f811625bc1427c917379239203cb59230460c880754234453779eb7032ffb3b98071546e3300a63f39cf4ec0dba9018c4470c63e920ee79c000f57fdbf504bdf709b70c82ccf3c7f351b2b35a9b94582f61455b8f24bd43f1148b91a123076562e53b23fac78dc4ac6d257b3e882842382b30437e5c208fc7dc15a0eb4948e902a8f13192d401887c4f01a4924248af31db0892ba9dddd6704b6c696870bb87257a0e357d0c908995b0789079c414a0424855c47dd73becca7b13b029afeab7a7860220e4cefb361edc19c961fc2b24d4311803727e5c0669aa5228e907f6394768e7a3af5068b1b7a0bba9a2aa195ae052233e92ba6382548dc201a5d1c9bcc70f1f50694f56277703138787b34f63b407125d402369eae548d12353220b50e36583d9b0b6b33b8f38a8b7c0f20a4c7561d6c80ddca37d2e709263a54b4abb4577800705f068f21b8a4b44cbf4e3c4dabb1e78865c1fea7064f6534b1c1e7d088dfb37c4b5d362f6d19d90db7b9804cc0b5b02a3f091cd073722c82d0113bb64ab2762411cfd91353a8838ff39c2b1da1fc41353d4f02a66dc28930b9aa96088489c6a83822664679457f9868a0ab58f34bc16cc6fc8672e1f35a21891246bb201dff207148b08f02c7bb707a150084b93c44c021ca3d56735744070d0b26d3958c87218accaa424ba20c3522a6e17b5b99a26650c410d6042cefe6493c660c954484a6fab528d034da0d5a92200ab2c36262f074ba54432dd7054d348ce54fbca9e88043d3b63f8193ce57b770f05079c3946f9c33c2c9285422756b3653b4a876618773de5c7b0f2b019dd7c23f39759cec53e95aa0b87609f0ac794632849e5bc76c1619be9688067d93cb87b1f51337f45bc9ae8386d7c98b88cb0b96c583b010656e7f017e972c812635115335af17c2c3518346407c94e25c628002652e2cb88fb0779427fad957d394999c0c369447b06c095381bc909d93a5e0e0c087d71965e296a489ca5a542a41a99529592167e2bc1dda7bda1c5026ea15cdb4bae4b7500f0b1aaac059f0ff8381897c4f3a144728a2ff12453feda091503bf603b16e406288dd89be4884e4f86baf722269475c874b1133de17ce1d51b694c7df5b9a87f19c2648170de3552c7990f68ca7e16a913b6697b5f848c6c2a92a9967d7bd180b74839e233389bd334c80c7772071d84460c509c092462cc1e4072f8a3297558784b68c7359c0adfac975ee4798d26c719e25c16e47850d11569866e3d610c0de0c68e2886e2675f7f59791f4568eb60583a28ac8ff2430bab6e5fc07f1637a59be1cb9b33c93b3ca98674492203a9e9514ef5da006854037b4b4c2a1ac6ea6587d208b505d206f04c7a8df119774657eb549992002bfa75b480fb576d3a0484d695f6fc56dde369154c5509f346c501c12a699354c14478ba95601239a2c48217219013fc51eaba658d4a5662e469b6547f74eb29c10c296d1172d1b0c75df4b2459cae31b33d7e9164025478c75586e25730550216c549ad05c3660459a2653397d60c27b342a5b51836fb1a33bb8bc9cd622af6632245e49c5b129307942eff7c3157b2180112843a61376dec7f6294029a441683a996fa538bcd07a35585558ee09123b7c3f6291ff04cbfb5d9a85607cb086bcd36f3c0a8854bd0f58cfcd5a1f4c51bcb41bf0138c8c7e29d7c43a1b4538f318532b8f30351967efc26a7a683967d770f3c21ad3dc85b7da94c64ec6e66d83f01490ad6ac3567c81b55941ed45a6ed4b2c87f473f900891b5c69d5092087559407cfb5e9c2aa18b491d6ec7424aec12675aa6230303521bab27303244ca2716e83b212783cab442c909c8760ac2d341a24df63315ea42726912fcbc0187d520d70022eb6872c8b1158a804ac86893ac7741e2118bf721c5225853a8e056c0d963dc0b2500147b0f632fbd27594656866167c5bb28994833ac2031bf4998597f6c1da7a0a3d70c3d3b01cfe6a87ab57419491140ae9c4eec0b4bd91a1946233f3cf88a1ae27acc03cb551294ae5ab7606431923b000000000000000000000000000000000000000000000000000000bca466cad40e9531e154b5f4cc77b7b4a5557f7e36b9863c0ca186d8785119a58bac5e523fc2f73973b46b1727891a6077329e10e94acd027c9dfa38ef4e21e4 +ciphertext: 5afa8807bc581062978485432085e6af37c06780538bd96f798f641949ba3793cb496b51fc455413e47586d44e379daa9058a4bbd2e329e7083db3c99074287a3958682fe1c94c88d175296b78e880eeb27bdd5b550bad0577e9b24ea5f3148ad58ab81a1bd1b63a24c0ebd31f2198cbbb819eae7d30eb8ab49b08451b4eb4c16d1dbdbbc1da5933c284c2b1cf37d9d92af41ff4ebc78f4418c6b9077a4888a3b516fafdad71a517df1b8818c29accb9536f9b0998c3a973b91c87a57a04d48d5f8332a67720f92c8692e8b2eec3fd62dec973b815a18a33e721617110e636301b737ac3268252920c578e18c50b8517c34b38117fbcd282392c14a61dfd30b5e15e10f05fff96f15359a73b8c29ffc44233ae49856da73426bc84305f83e540ecce3eb1c386572fdf2bbc18163c2dff137c05754a43e50d5103c0d7b4cde47457d64dd2cf1b1edf208e225fccd89a47831a7aeb0d1ea313d2dcffcb730532fe151a2ff28c1dcd8212a10dfaa0a6668e3c66c67e20290b285411f9c9ca55c36369b11548048687282e6bd9abe13f4b621a2545d50f530544602626d524306a97be439004d670414bf69f07cde6d82576533fd01fc9e8d8d40eba682f88f228151d5a87097a8ae33ab845d523f709eab85835278d8c9ff1ba2fa639f61726267b033bdc355c5e4b844fce265936e7cc009a99caaa3c76c4d73ce84264b15d1eb3359ff7e8ea4752bf3cd2c9365ec3f5b8fade92e7c1768814b0566bf3a2633b0f8ddbae1da24af6b42bc80a28e9bc1b601ae1addb0d1ed1666fcc9bb3e9fa8ca2dcfa7bd53c96ff0732a00bb1fbafd01b239796d658437c5a42297c2ef395edcf90a521a2ac2a852d329c95e9c9dac1be1948777f794c8e5c5728d4ec2c95036bd7b8aa5a272add19f5c10fc8171fb027956cd3c9e1039795bf6514310d4c2dec7e363320e481a33179ba5930fb20fb351ba3f4c6b72985f12a43d133530a8122e4bf9774e62e064eacf8266803769fb991cce898cf03457241d2bd7f7d104ea07615d8be80f3c2e86b015be16a7e0d0015f69ce1841ebe279233d661209495a728dbc6949650168148227ac08f88a57f3b3b45b7f99552467076ddcddea388994b2d9e4ad91a384ef053b2f7b5f0815d23c3a5c1de5751173353f88b9b4d8f2cd6335f736a646e370ca66fb911525299a5ee382dd49c2b34b654ae7f5b4ac07ba6af9f3b903407eba86dcbda9113fcd00ec8edc4873ddfc54adede668df06968ce5f63335f3834d6172d40d0a7086c9d3e68dac3efd25bd08d4a72b0e19455696c45f1a8f5ae0356cc86e0712aaf8c32393161ba47e519c8fadc19db8f4db41651c1fa90b800172b41fcb88f8bf6843c0503a1451177303f5269e804a73b5ec0b45e46522fe1f939c2f1b4b0fb6568206524990809edfd450e9412e76498109b7b349379aebd5cd6cc9a3c57c7eab0f57ad011f2599ee74f75ba208a1cdfe7a52a67b9a1af206013d28d01f8b4a5680735c8c6adbc3af20063441d5c4a6a6395da2e97151e92da944494c639638d6c2f1d5849ade57c75138a462d3a97adaa4599db5cea3f03a89e4f6c02a874f09768c5c38cce9e8dbc7c4ec5fd6de36f7a06267199ade0e03a2b9c8fe1bb38e4aaea819d9bc2d9a2023372d264231bee7da2f6b853f3441348e9875aa784162c9def07ac747135f445b7645e713e3467856f35fb4179b01ebf0baaf840f4b56681a537afeaf1c9a6f86fe6a9ba6a3f4300d222b9811d4d61f03a8edd7d2a4c1554587bf1e82f97a25dd5b3fa145ca4d92660023734ba7242470b7d784284002e3e4ff3b1fa12a50c159cafc3446747f57c860c7d1755273f9ba906f8568a650a9dd4cc2a31502be833fbaea86bfd4c13a2bc8b713d68c6cd0d6b0ae7ef14dd58fc68c558cdd337318365289c7e5da57bb63422e431d86b5e7e47b71a3d2340c619f0598f5af80e97a0be519d38b03c826ba8f87fcc4b13f8827baa22c46598861351595f8274688919c972b884882026ab739692f9758d12e5597b8e3f5da9cb5a7d903bd8030dc468b2c4b66416dc56ff18c20c78f018d7102bdbbdc9189cba86f9eb1f57b6211f9569cd34737478f6946a2fc2f34da0573db8968690d9ed0dbb2cb6bffaab6d8b28eecd6220c067e1ae1c5e4c8eb2ba179dd4c56860f6f38f5ed3f0fcbf7e7e67f5c92bb9db439b4dffbc +result: pass +shared_secret: ad8e3f1d0b1d2640a6f879f697c81f353f8e5fe17d0d09bd5d21c068b0720147 + +# Rho leads to non invertable matrix +private_key: 610c36a286cca4815c657bc2f28b854aa8602890bd6ec2700d64b495b50d049c5963b8294752942d11c1d0182ba6704e54c003b828bc58b6ca3ee0823607c3c00bd0471b4df571c51db3003e4cbe6166c0caeb747f79573f5b8b80d12ca78bc1d3e01a318bac91fc863198afb70cb9256a330faa06639caa7ffcc1248b367bb6b0bd905ab0098b79b85ac5dc083ed43ed8b248dbb72e5ad962b3201c92b132b2961d9867b48208896c11afdd929be2792839674b18e4c1e99a7df714ab7ecb58570281ca80a92f148bc492797564682b560f1bfa42b2f7734047cfd6375d3dc05846da1d3511cb3c8221d38226f29ca52b07471a41764f86ac3418a96aab70fc8454d6823f8b7c6211d216d08c67eec474a3cbad8f3587e22670ae5a9938651f3b48011341b6140ba393621accdc3f606b080579197c48967f1c8d11026d8f90b0697869ea49cb9db086ef687227b2549ac689b564326a2280d8384698185afb25941ba0365b0c1939148ed6e1bf0ef5c764832178d47a01c3573aa268e168b740194a9b36ac2580a7bbe1625900befef3adc6fcb356100ddeac4393d388fe647c3d623d1e6a56a96073bec59f5fa39581245e31aa33cfb865bbc28e9f2498bad34a5bc65c517bb8cae19b6d1864fd7a0c48aabc78d0373a84c168f33ff13a9586aa349a185e3528003e804c8cacbccf0073da46567f7c3ee6a55eba856851234b4f3725e1bb3609e50cd4c9c96ff947c4b048dd7c64b3498d23c234e9bc45230b8b0c797946d0980dfc7bbc5773620b8330262ab6247fca5684c9fb8c2e692c3f654099a7a93d0aae62d24eb594544a81431f295bbca7b15dab7bcf728e3dc61f6354a459a120c371030f3b622569a78762b1cb08248a455e0f0847e1531d194acb0507bb53e9c0e13c8b2f45ab06362be3d9bb58ab6d90825a15211f81f4987000cf74355a28ba08443b3fd9d26b70039955773f9f840207f696d0e7a4989c4b38cb23df626e53b7ccf7c1bd96bc3f68c20ba180a482799d2cf975e0a39d5fe863df954665509b3eb63c257b8c9e39050bc4a739468e716cc289a79053453a28906d003535536439d418736a95763ae222c8870b66f1b5a9978c29d238658a3e773063dab55125e851983706c3ec68d7fb1d595b55292885f758a8df752fd3d97a8dfc33a228c896a44bc039ce1a2069810b1304d44522b1a5e43756cb843b5ef515d89c310f442f585259e5d460dcd578cc51ab49e63a7cdc2566d77e6959a7d24150cf0b413d335efa65385ae13b482b9b4db4ad2518b71704098d7481d2233e2ab201dcb4a1b3604149710de3cb247f29ce8ccb2ec062b014708f397482dae5936bec37663c849c9baa9d3cc88146b88cf970e574694af03fb78205e205435221b32e5513989047e62775f1ba5aa89a10c9d35cb566328eaa5748e9c5057446f96cc691d80208940cfea984df8817d4507aff0a0a96b8c6729329775c8d75935d7624cc0a06ab7a950f2b73ce4d90239706403c0651dda56544ea59bb06a99f00bd698a8c3f127fb4a3759317a05ac244a07342f9a47257e5649dec2c7050188ea669a97c137f707f4e5b4c57945f82c1b0b2040476d73acb54724cba00dfa8bb9d8c58e33260020a33fc04021baba0f6375ddee4a6023846a2dc73eb69758edc915ab2446b1c59fed89bbb86a9be2242c117cb719274873c8b0a2857e4076b3a792965011675c23deb8bc0cf7b2e3ee38493461f8a2068bcd899f1822dfbe8444a612f9fbacbf87a0d45f98a541c5141b230be12763a3563f5d47e369b65c10254e5f63934a05c8ab3409d7b4207dc423d537abd4404a9ec6afb1cbb529619bee740a4c71efc952b3b871043c24c0c919f74f508bc23a9c1ea8b76ac449e28379af42bb6140d376c9a4ec76b34042c7d711efb559c8c87170662788b4cc907e4882d4332d90c43175cc56eb943d589a30a5ac1ae312aeb8432a1d7b2f7448fe0f48ad069989e908d28616530246f8e817aecf6ae638acd7030a596d5be06964eeada35f6175bc0d20c26636943f1609eba3b8852531f083a576231c9b222a9f96ab1fb79aa0149155881fae91adf26c4f1e463f6f603511311351c6c1d1832f482306d66a4a2e585b7e223bd539fc45c5b29558e3110cc268356edf4bd0bb7ab955a1d1ea4113173c05093259a84c8f055148d301f1c72c9eb2ac6e03b8ec47b955fa429b138ab9762705ef19cc3d4019947c53eb361b8a6798ef219ecd086464641a642660bc0086bf97691e81d178007731511bc632097e08453fa02e8a2cbe9e858a20835b8090f56119bbc000c69f0ce0fe49c4e80b41e040f3f3c84388c6eb5ccac37b19420139e19f88b0b99214d06ce660b844b0604b49222e46136539c7084260ad0786a9b790d76c5132068ad6d1763c0207392760de1631783d21c2459c8189c3099245de001aef30a5bea95609759141e8458c3e660aeea2a3f721d15302e46e1a92d213d1ed16168f71e9b21b5fbd62355fc8e696c71eab7cbeee9258dfa4c1b876583f56c6bf37f770aa7c3e317f50ab01a7bc9f7a31d8babb0c9d2083821343d6990e50a06a33985af449c29340b89a59192b37a2a7aa3fad830725aae61c52b5932a2d9eccc98612997a2b76cb70094e62f4c97279c2044eb5b624097c4f2d6a6232b526b582c9897a9ac734096d88639fc4adf548bc9f8905a4a4d13aca80e952aca037cf71151042429a6f30e3f67802055b217900f748844ddfc987623b27e21c869c16396a57da38938625b9298d66d1da767810860df4768f9c26cffd4b0fe4693cbeb321ea69243fc0e0da0948e5c9ad676c058826b9c263c4587b104350e29fbbc9dd91e876b40396a67fe874177dc5013a18c9c1195cf92436c03b0e06b86c7773b0ec37aadaa7bab6214bd296ee820b86d4026a5b13bb0d79df7497d1d27194f3450bf38b9ae7a18aae876de5b74fac93afd26750b9817df000b89c113ae700102fcaecbb2a0f52035c6753be93ccb6e51c6627ac06a121d55845199a69e9b8b14f4f878d7fa9d3bd901fef7b250ac713ea823eef11cfa041bee03abee508f45a828dee681c077c8bf89433ac4c58035a755b27b495678fb051282299f8658bcc5567429798407192e8ee59693853a37f54893974c4fe64bdffcb6d2c660f88c8f489c4ffe716e27d3a157a539a8a6c1c5045fa93b7ba5f0b426d628ab6a1efd92662f802d9287570dd962f44c4a8ff37825444031ac27e26669fa15a90733ac0352819722724419642875cb1a143b5b2a2dc8e31cb4aa171798181feb539ca8407e06120ebbb2aa5a3bcc4600ef64577ed0bf315a05bf4513e3739282732c94997ebf91ab6293b909d935de20a8939071168c10f1a2792b4911bb212914e5781e3ab5b0d1c7c1363bda387118a2b130e07bcf4768c0fbc43cda2d58f44fcce9910deac4b2d11cf89285b1a604b2d6b6832ab2449c35fab65b9f1b6a22872858dc8fa6923450975f55bc7099e355416768af41c657352eee743d51da6133231cdc5c2db54b59ba6b092b63362ee2bf3ffa10f1897b75e329040c31bb3b76440ccc0b6098930072a1a95c70d0b5bec7786c3ac69dca40ffc687efb75325a5b0f9b67b642007ced66b31745828aa89526006be500edc94c69d9351e9139d3d826a3da4177757b100460f0cf223c23680bc233de3ea7950d0b21a3949e3e278a3c058f9eb7751a2ca35e35f88f121646774960574dec686452732d2ab00c863ccda19698456a08de7b4e129a9f2fca3615001720406d3dc90e94665d501246e446cc6225ffe44c8dedc908d7b28fa1437c95323630cba8944c0cbdbc7f1729919795c5b52aa1974647c43297efb030a99a6b0d5a0a9d3679c20c28067786f580506318bfcdaa3417366cc9c93e34488dde73652a6b9ac562747da8109481260502fab5c1bc4636c9d6b555f96462e940cf0b58202d049aac1a3c87b5d950b6701846e948550bb8199831c461e7436a3713c77c0662ed009df341d5de0b697770f12082f04449fb2868a69c68ad14c941130967f0b06b2bc91c0b840c43c20e837147775853d3baf7094c51ec86051b1ac73753f032374e76cc5eed8a0be466c9fcc1ee9a80c04b566decc5a448753c2535fc9c0b3083716d5b049f89c9f191a807b933c2ab912b7127b4ba04c85386372f6bc5db69b972821d54867f440c4697220a12cb5769cb7495a37acf99fb0451f6ac7807087ae83a0b564924e84428cc94538fb0357a7e222f8606ef0404cd7e29d2a4ccdbb22a45f9a7a51499f9764a063788c070a93bc0766923297fe438c6fea2971b887fb4c00000000000000000000000000000000000000000000000000000089f2311ece0e5169b8ae5c1c3567ead089c11f1d703bb293bc1e32d67e3f3093e42ed33e0da5856106580e02aacd0aa1546d3df0571d17452d22f186d011981a +ciphertext: 20327e06aef57e606fc94d91141d35db28ab5fb1a7a1c0ea51eb1230a4d8b7b0439722c9b08528ac3c63e93c1f1932e2602e96bb51d8d34930df8198269997430826c455c1feaee04e96bc91c5d19d5ae236a2e90cc23cbb802d4075aa7ceba81689bdf1907ca524a7582f7f6945812fb8f0e07b0a6b5bf1a7e879f4cb725d8c2a11df68aab2447374c9721a13225e23ab561301d3e1627f9973a0e37f76a3b4c3f824fc26f249f8b4cbc9d9f5ad11b93a29167d6f6df17b47c1144c0ee807d296c49e36e78805decd1143ad46b29c310b9228c8d66639de571542806115d8e55143139f976095b88903831a5b40f12772a7aed5cce13ff46c97606abe1ae98f5d43ea40d48d8ae94e89851c4b39d4d426b8a1d5622d1bf03d56739a9f81eb4c62fe026dc51edb57874572d04eb5d3b43e4e17e8d1554444a98145e3bbf65c900a7f378e5d9cc71169e5fbd59259f7a57b1b4c608e863bb6dc0cbe45c402acd789cedfdd3200e2c4e9ca77054e391b457f011486bc58708c44166bac944ab915ffe993591341a5d07bc0b66ca063c5294c3de876d4a57b8a9651e9a5159b1e12b9005bc44e757cb141cc665a2a03158308e7203bcb43a5b913add9e7c1f2a33319bd25e8101e9bf21a4a58de0653b106f22249a05f43c61780f9574ec4180a0d05947b0107bfe5bf368e3b3f9c7a7e9bca0d848d7b76ca57bf0876be4a0a97995d00f7cb65ccdb708e992efac5f1ffb990e107c854c5f15b8540db4573cc52aedf1bf5e4350c4418be50c9664c4bcf113e8d78bfa116a287e5f174770e7f9cda3ee4f9cc4f3e2aaedf97f576e0e71282479ec1fd4801e222893ef7d34919872ab79315547bc687da4ab3fa5e8d330a4ebb79be2a2866788f0e24fd946b689998c5226c0c241d24e3c6dde149fac94311031377dadf8fb263b9d8e055824fff8fff07820fafae7aa9477e42fbf42ea1332eeb572c0070b48ddae20822b45d491c819756afb5fd6f9564d3f71c043229cd9588d0292aecaec74d537339ee37cb9d2d365ea41bac6a811c41b9946dc1963bb6302c6ec01627dde1c2024d5dc9f9978cb963dda825a3bbbdd75dbaf04ff70f8b905abb70bf4bb4db15467de1f37e7a22109395f7b9cc60861888c41c8efdff5942ac6758e8466029cb6378eb4b79ae5c47b8c13dd9176d64010c98ac111e9b9ea8391a1695a7597ad38c016d3d28d44a22847c551159ef9a473bdb98179efb294e85d7819e0a100fd2ef92a0ccaafa07e5320527dc798886a4e49911afeff40e45768f18fbcd79f6204f17bc19cfd6b86f0405e0dd55ce4ff9e092825f0d83cf3a7767c49106dc3b996d011535c316ec78433810173b1cc8e280a7e23d2bf2bb615f3ea576bc8ab9c7ff5cc7d79cd093cc031a58fc7d8b98e7dd127d67696ada28f14082a779398ea6c722331783e77b26a2a496d484ba8986c497d5a038542e192a82d1a1c5f02ed3afa81ebd6348c06a897567163377bfc9bcb41fc3b0a037565871ca9693b1023fb0aabf770571be26e847f9ef822681ecb407c467309b118c24243ce1b64b060d48ee545c094d66d032c9249f877a1b034e9072e5aa63d05a9ae2e7ae037b70b68e0851ad8d99f3a6b6edca98f24a4070f89c92b786db50802cc8bb5d7362e8a17de3a4137b01269d53368836ba7b7e9651f3073f32140a5c86d88ea06d8fb488e20d721a198d43fb530d83f9f67977997bd24af8bbd6469f377e8fe6d4021204869813e11407a310ae89381f05b30257c608d3b6c395428fbef8c5d28a4169c07885c3858de23196e2e3e67819e50fb0bf45734d1ee5e61520cbead2f716f58fb7695b00cc7de362a149eb34ce562b93806c78efb67a62c7abfc5f2a7722f48c496ef6d641a710fb5dbdc0db58398dd401828a6e5ea1387386e9d67fec705df55ab466e3498b1e7ae78fce4626e440117dc16a5d3b849a60a3b6e0030b483ee04c7513c0effee19e63ea7f148cb8f4de75c0ff450bccc5cb85a3187881f3b396e4cedc685894d5ce799320f01b7aff4788af6e90ce97165f3cf7e9eef7f8f86283a99de3864843c6177a8cdf90c50c77d1f81e11cb42da9fbd3b495e7528453844f315b18a3a0be78f3fe0801b1a8f89dfd5d7eae27a8eb608831eefe5cfd0ad9631dd8be45add9da2f73cdb57f062fe46be28462d09c5ee38feafef94269344d765203047b8 +result: pass +shared_secret: 957ed68960e9527bb32460505e0a8b69ac6dc0225501d87f46fa810d98f2e31c + +# Rho leads to non invertable matrix +private_key: cc389888219463a7a5f6c2ca3014accb3bc26f2318f593876de6a49822b6c1e694b7e5aa9140a0765b6334ec762c8bb018d28a99004081256159c836f4f800d0c9aa4a7136fcd89ba7cc1d6a32b23ed181b3fc118ecc60096a4ce8261ea2c0a6ca49baa28b75d1b40215367e6a33a1c177937bf43a70c3889f6aa239e20e499bc7a836694a0bc2912cc7cf211ba20c12d5ec312da2815ef20c8565712b22a927451271040cf4daa44d79705b97993584424e7b3224a5583e5b8eaf640e85015676517113f53a415220fde3638b9c0a38115e668545305ab298b9923bc16de5b9137b30a39a2c8b5fb75e4d1168593a8eb0e067bb9343f1a030e5228bf0b3a49169393cd14f73c2b8221b1267627d80b97d30544b02a4c7bf06099194b2d646596aa439d82a214e6cb9c5ea1ded727c8143755cf881415b6357661a90d5ae759475baa6076eb478a5826f86f9868afc47ac3a02a0e84579a25466a63d933b071213c886790c320416d9422d280745758779635ba6f848440b2489144866e8e018200cb8305b3060926d7e7213089a06d044176b053f3bfbcecac7840dd7844ec29eb17bb2caf321a5b17848c16a678552727a3d70c34f024164b3c4856b0a4ecbc78d345187c6e09f055273bb775078b43ecc534a40e66592b607b56b5f9304aeb048375ac71c30464e979a656f1728a7b700e3b33e5026bf40198b94455d2be37cd65867522b20bddb5ecb7a010191254b8a403f37c4577a613ea30678daab55508b16d6020f074504f928dddac1e8367faf6199715048c96a8fd6bb225715accdcb012cc856a76057b6b72b09a4aeff5b8ba278c54a750596e82bda45be19014e8ff52df181435ed9ac8c402147b539ffd984c291535b7bc8b26c5036352520730195fbaf40033fac450843e808b9ccbf03b40a9ed657f6ac4af8b65b4e389280633d79799e0226b28b356fc2e39f10a80452dc934caac7c3c521f0c5544e7821a403688f08378c3086d3ab8f7e4036ad516778da606204aed3ca1ae8c42e11038a64ec78a5fc5dcd0475429124b5d665e4acbeccca3a296a8e878b917b886ec7f029491c661bba684ac4229cd71373c829055b602db0518a481230345a34a709010a03e4b197273510a0a24465288c327c10c75434d9473208a7964db7792ea81c5fe0c4bd967c3f0c98765ba7d3faa4e6097f09e9bf10638fb900a764e4a0bdba2f19165bd69832681310a7a2585bf06322a3238dd26a4807af44faad999397d4aa14e76c2cad5326ce573d7ca04c03db769dd01a65583ecbbb991e7a31b59238f8741845f1adb5992607184dfa19a9e8840ed9e1622ab93031e2b448860d411a3d239277052cc8ea71046a0b1ada191a020c322d776c6655ae71964d86314a86a47b6a367b8ac5a4aec75677226de0c1864492c88fb70a53187cb76835d5477346646a9da97301156a3ffcc231f9a0da760dac142674e5cea882364dd74fab66901dbb7eaf037008c52073054cc2f94ec845444054058402515bd206d496bfa02c442c746ff3e662b899c34c40900902c4f8ca146458522c6a7af772b2df483f9d840fe07464b0c66fe1036c070c6f70278e9506342663b07529247b1697c6b844a5959672b08796868e7107108ca4c30a58be4ff7b37b0402697aca2dc4839dc51a8811c34c8183442711a8d055b640cd73d2caff9357bdd9ad36835ae9d55d1a291e040652d020a905027a616b3b5c63c0be2c1068e9cb0a9b4abbf346590237f96422308ba86b055872e156470b53e35b2a604bcbd2b97849446684149a86d9980c5182f1a020c32b14de18c03cd0633e303bf9f8a24ff0c95d5a65c031c18550b7d7d5b8ec672c3953bb3be0c3f13925200394aabb26090a3b9a12bde30418b997abf310c1724a88b9782418d09552a63e2855b7af2196d422761f5c8a877426976c90552bc203f5657f5370258b936c3706f074c11b3b2586391f4c4bcdd959615a819aacfb48d2c799a9abb182c7a9fda6a80ee50c4a827c9f50835b1859033629a9601b5b8b357913b6de142a501974a0c191a071a95cb8c45fa857736a93400141cc325d1b4518d3ea58a94c14f9b261759281b00213f91652b1e52bbc0c488bc0990a136e8e3b5e20f41d9f218646d43745245ca4c2777099039eca02981ac7be932e01087b615a60afe87ff8d93d807589e1d351a5033aea9b032ae80fdada8fc4ea6a72b82929339f23870e620b836634a0594906f5acabf563c97abc1da988aa4344bdedc707e4636d65ba034a7c2a29090e30f677439247f753ca9ff93303a52a9ffb605c7b8fc142b576f14226c2c20828a258bba28bc0b680e60f43c08417946b77d29ed1ea968aa3a268e54b71531e680c09f5b08c01500956a86edcc05633dcb13e173e28e8c983fa75207b537dc37c9356b8ebac5d401a28a6d937f9ac49c3fb267d9a0ad9386f9ad4397442b05f191314356b431892f590290e488f12bac3faf94ec0389ca3d88924671262845bc022ab0856242cdb5fcaec474565caea58395a34c709aa270955104493832d2805a8e05d62437df6993a0f6cbd35040580871aba994eac37955f73ac8b057060426eb068114dfcbf20441405a2322156a5fd491f24402f8b73ab88f2498b04148cc2835901604674867947c3fa24a2d821963ec5180cbc00bba371fa3879be800bf309c0ce9b6ae90c99bd4b9eed787a539c90b31cc4ac3bcd1d2bad5fea1abfd7383a7497483b089297722d27ca0b325bb09272e4ea1182da4a75cb0daf7a6647b15ff0e1cf4a55a061921e55d6c8b5131d88da828dc800eaf4216c283af147939f1cad02351ac8ba79515167d1d2b582292776c300230a9cdfda2ecda65c1456884a5aaf3ed23c8242a3577913cfda45e3bc2adec6aa281051d0d94ed0320397b7ac724b8679aa29a85b838ef9a3c53021b0946c9933a5c5669b65b789e349055404b134671ccd105b453066fcc9949927798670bb011bc76834c37f3b98d2f992fa493fc3850fc64a92c6c17be8ec3ec5c46c4cb415de2c1a7f42700e415825c4376998522bc05f7a61c77f47651dc8a4df012d1aaa85ca5899f67994303c5e870b38557c05eb2a09069397c638674cb868b028b96e4249d2d935abd80278d35fb9668ac0d9999df99a78da32eae376cef69546fc71e3e2975221c49ab03baf048e1823bb8199049443433eb6b42a32ced9f15a9f4a3503598a43582070fc7492d6c1a05ac47f4a8dd3802af68c4aacd778d7693ffbdcb3f5b77f81a1951cb43597f5bdce907671d43bd4f92f70fb7c2a9a09402cbf0b8798f662550e2413992a8419d6a98e709c2c2caf9fac14fbe558b0597979810d62854205530f9b558ca4488470a39c88a37a152b6572c2c57d337a4b7ab261520729132afd067e08035924a14f28d32f6a258dd59472b5db2c6cdc53b9d766dcc030bf54b62a100cd0dbc9b99760df12ccd1e61df0b624b593b004f6712a13aac6934ba8339fcaa64f5d45c05a2a6f970400020380c320adf23377c6f5691dc96cdcd4864cc8254c929c080232a01b1dd9e7808e076d6e729926e81ef57970447c46f6ab942b90505afbb98edc344c47a3510c358bc63b76ca0ade7589cbaa3800e9278eb16a691a54de7cbaedb384ad97bc04a7666c4bb10cfc6ea85855b1c4c18005cf4939130b3a4d55a954805616678671a6353d45bb23fe847dc992cfef322484f7b90b3a45180a214491505ba24572d596cb6a48dd21748b770ae5a8559b287c76c29f3c5636b4400175b8aab65b91bdb09d43db7cc5805673c5a3c509ce77184f4d5ac4f674c0a602363d984e2bd8336d7877b436b6c0a8b68084a7cab956d300c498a86d49965172a78972844f37b5ab703731451854d7558f8f307d74a967282bae40806597ea5984899b54d31d85d159ee245a85ba7181c5bb051c49f2391acf60cc7c211f88d11617bb4a62446c635cbc09165fc590926cc7c4b67acbdca1804abc519af0c7268c0a3ab92123f15ec9f148517162e6d2a1083919570834cdbb7d7c23556a1cc11a55760b0470e6466e595a43a25b27565524618a6f0853781808bc14a97257b6ad9ca5cae8c294fa26053dca2c5fb300e0982df766882d80b33af645688c7a57b5b1a27526184083af969aa4aa5f52d9874a09b8dfa21cf5376b8db101b2b218412a400e02aae7a186f3b226fc018701533ae10c37b3836bcb829c7137a6252c9fd73723ab7169667b8c8ed4401724b36c71c2c8e56dc3785379a55219e63b4f7159dea9225c8b51cb4c8e435c3e19b7413345b12fa3a0f3cc6146860acf104ebe31a52aeaba9a28000000000000000000000000000000000000000000000000000000bb4a30f46e22141ea3a31265e632fb940c98d0609e8306ca0c00b3d2ebb259c2c975767ff083234b2979bb109a24a27bca17d170abd8d9e6ad3c3ba19e306bce +ciphertext: bc99921d5e80c1f9d343ff32fb4a40a3706f750c4f7b0ccd7656ab6111f1ab8dad341e30e9a18c570d4abc4195927cc24fbfc57b1467d82d2d0cc1b7a192d769190a29d0e0ff672d6771910ecc08b2e8559c8677cb8c5d2109c07c67c639db57d9f83e0e67e2347bfc266bbdaea1436afc2ffac8c753c33a8c464c2652fd6bdbb7b78de3c851d98c5903a26d253eec7af773f7060eeb34f721178f8f6b4fb48ed18e0a614be5b35d9059ff8f096796d1c750fbfde317cb9bc95b14a25fb919a9df07d19aafcd52dea0a9b37d3d4d5fad67bce77f25358bcf3f90c09d08ca0afe83501bdcbe63160b7c8fdd8afaa7ef023f6ddc2c966118602cbe64a5450f1cf3d62d7cba4cb2627ab954f65f628843fa661b55a9e3f0d8a1c710b068625985405b29ab4472a4161183795032966e27080a8c3042d616807b49a68f9df5a8f466845b0948b1ef85695a631bbc503f8113318ce81e436e4fa69749bf38fd1a598e6f15f0412519363b76a6559fe068946925da95d5d00707ba0da8bebe3121f859fcbafe80796109a067c4e1ecf970bdce85946830b783e9223dda9ebd84ca91ef9ef096e3174785db6d4aef47043476128313195cc9fb3c009c41a2b859046f9494d37e057dc0723b17d7c1ed99c9ccdfa0349229151b584081bf921cd7bdef7215125d5ac2d2764e1d0c5671845164a77bfc91be29a476da8bbd5bfea6d102890fcea3757d9b323d12aa050a4653a93f5a29f2cdfb30e7df5d36f8dac610dc401b0f6ec0f63a022865f10e119b68c017d083ae4dde05598e02cb22f2db9c69372e23cef10e92536e11fd69baf27e41b578864c7f1a552b739b3369e2fbfdc7a7b6c38a1961cd717c4c8a4ad0d3da4e147766ee94857d0914aa7d18879ec6c5ee0cf747094ef3d681699decb917280bb76874e90c5b70e8f2c3739a22874dedfa8d8b1c5ef0cb72e67a55165abe7c3513ff34286ab8dc690b95b914acde3f63bafeffc2a6672e280acad66e757bcdf9f6650dbf39035c2a0ba75c100aeebfb8d0763074b191e6d6ad86d50f945400568f61a4e8b400a41a336e1179934ca181798f159278146dbd5f6a49481be03dd9538539dda5cce2eb4c149f9f7ef0f1ef5488c4fae38fd49c07a07976ed93e57a8f978e7704a1b316e4dc3482e6eea6181ace8e6fcd37cea7357740b9ac7a3c6c4cc3b1b7f27f25ba500f7b430079ace631bdda634e421b457fb9a951616ad2a15e7fb7af4a9d05473d94bda20fa5b97cdb6bd54d028ec81b09757036bdca2eb2fae32a00a50b21cbf7b2c9e0206ec617870bd18e8e5c05c4d93ebb88f4376f0d4d8629f5e03acfc6c5903564a3fd45529ddf45448174d2b9a36dac4876e601a26b0830546d3232cca2c2a4a5f6f62fa9f9c6c8a88ba83417487c2f838dee3657f4501f46f99467a738ba552ccb69ce20fc576722a5736d30cd2d6f3fa2e6731db14f4db0ec60fa134d2cdaceca19aaed29ed3c9905e98031470e8f06e5a95e25ea98e712b16028fb0641fe92ddd6012b05d3a2910e885135ee75fb9de08ac97fba4b42886bfbfdbd9c831996ea58d3eaa0cd712602d65ff8798b80001a5deb51a4823216d85f8d79eb85bfcea1805571a048f0ebb6944b8b32988014601b161894f736ecbd4ca149b8ca8297f8bdb4d4467b776e96df55df1ff8c192d7632fba09959e18edb38256f13519ca331e61a11c43a1f83f0fc668a62a467d3aa5da3b2875fb0befdb947f57e90f9fd9330d6a8b691038afdee461737f4a1b21f3409c71a09f8e5a26f4b82e7995872c13b023e2afd497eb4c95b949594138d4c52edd4cb446974e26740327d9ce438d3c7ea4e786e74c9981fdbe6a8a63fbb814e17fdf517775ba6946f9e4f802e39d03c829b87a68abfcf25b6b5e20f2b6b2ce53d99eef19b44bff5f76f5a055897a9695d6f83e7c16cc395211a672639134f960f986c75fbdaa7355bbfc1f79da427ef0037d4ce4cc52e972c03886ea3e1e9e66ed98033ee579f951b46839d3546608820bbb1e4361144214c27907f000c5e7866eb2ab5c3902395845c5b3bf14186eafa490d74dac8f1be75904f56a385c102ab9413022ab6da58d2d170dbad5c2a7c935a9c0190bb730448fd3e50dcba8aaed162a4aca6d4d2ecd8c9879765f87d6630a204c05772ca873fd78a7bedd4b6217d3731c0c51998cdc630e5a256200395053d0 +result: pass +shared_secret: 713597a2ec9a4e0cbad958bc8e4929877ae01d034c78947399b9cb1a383ad7a7 + +# Rho leads to non invertable matrix +private_key: 078bc69561af0cc77acc291fcb063e1d7c82bdd7cc31d5b44d1aa746e261f2a592d4aa9165c2c3755aa457b886cdd55840767f4fa0b19e45410872cb1db3b8b5829c4ce9b2a8969330cb5bba2397119310fa072b7053b35fb135d04977b9ab4766c4c1ecd9695957473f10c679d71d2f6b57db2ab0726022bfeb10b61807d35447a141255bf5b3d0e3bbf5cc3ae74932d87268e172978d78b99daabcb16b44bd578f6dac130c2528fbc89ffa94b48e6785293023e2605a8533a5ac17c15f34b1e30501729a78d3b8ac6e4a329e1006e0c0735c737283856d7cc7663cdaa1610b1045b7423ca8ccb59ca6b1c482dc02ba117c17588809ef8506f09a7162720142e397c6ac0f8fdb02e4c1c557050af941ae8165ae01d9228f767ef1ac3d72f27cf9a2282a6c379a669d01cc0a6c560b21169557b88771008dad62641f435e0780234e86c1ead05f14c0ad68b6b1041492a166bc4a278b0d352129556d55f37ef8969b596c5e41f8597878c8c6c83de675019c022314215eac667a7b559146478a4a5634ff193f6b83673072643efa59c27650fec168ff17109577083bfa8493f38301528f27681405693345e523ea4398055606d4ccad9df967fe59428ca7502f046506756a6b9a78182383db4baf05014fbb20afaf148456126fa393abfc480edc92465d93aaa158c2a8493882b24c564b607cccb2c8f6cbb43abd722c74c2c63230946acc091c48b865cdb33edb712c670648b07c06691687685218ba48648fa3054ae7a6a663aca6aa4e66506516100c8f2caf9c0645f2554c10c480e798b9c96756e42cc8a7f626c2759d21555342548e0490420df3a8124b0566b1804933b68225359cf66caa599c55573b70d488d16185496216cc09090de382d570795efa569aa5bfa8f4a60665cd30d63bb36cc5ac050310ba9bbe4b3af2f9400296bd344cb72bb623c757366ef1369c968578eba52a092dfef34aadf552a63b1495a5b78168cf6e58b218a3ae64310d16734d5e72b2036bcc001ca07533085548809bf114a092225aec9cce6950a953773ee37ad3467bd5ea0b4cc4c6b0695a774781ce17004cd48e36116776db19565367c92a94488ccbf4ca3c3960524d1b13d6f77399ac625de5a2d09954cf867011f79bb4c3682cd40f133a9d67778a24d7cf1a5b71b7b81dfe335d0fc392a8b12b234950ab79cac94776ad1b713e99b0f394aedce739a15334f19042f4861e739c839ce07da145808260b159625b5a742258779440953c743c591659b9d982aa7da028c7eac4390b47b243ba23e8ae4fd9c98042a0c2d25a6688c9ec774cd7e95899fb7f081035b0c4217c2903688ca7e4466e66ac4e3ca938fd58b4d6bb732a36aa8e097fd75976d1200d61a5c988c12702698b1cfcbd93157d3d1c6e76d316b00b4e462588bbf3c480d8374df3cf66a16f9dd2ab721954e02a9f8eea4380c381da230f10c2c7dec02b057177e157cbd5304ab1d8160a323fd5892fe1649c2e270dbd3777035912dc0802f4d18a56356b52946f30c516838028f7f39cc22466ed277a5adb6864972e1063b1af0709dfd60136b16a3d6c863a68895677c488eb1d879a69a5341a695212066ab848609cbe331704aa56092a4204a2293e77935390cb1d2b2924e0bb27d4aa471474fed2b6982b71a1c14b2cd3ae12b12d5d12919235caeb8aa3827c844bda40f5f57e5f59c75c86b645224b3a861eb9d9773b01cbba45122bfb1e4a60ada0fc10f133c546563661064adbf4a89117657366789cfc282f9bbdd0547029c92aced02963f8cf462326db19bdc980149ee0823ecb1d9e22a5effc6cb588b17da70789d813b749be180457e82a5c958b069551748e12bae79cbc0dfb5ecccc85f565c22eea1836b52435b023959b4f4fc12956a09f38d58836891c4c2b0b4502b012b868fb9bc0455c12e83c182f1637c05469708279b1f4af2c275e174ca5ed0a12b39849f49535b8ca73089acd5067b6b57297327c4cdddc7d5c752a5d2cb04c659d04f803c72507f5832e7bd528e903863b932d80c51e8b2833684a084c7100728ca33a4304c85b8cf7b61412e76373566c34a75ca88004cab21a3274bca1ebcbf34222e351a3df4b557f09904173065b460d54210511f4515180b3bc0a87f9125a0a91252c11461582ac34c94dc4828091253944b84b01b12106432fc87321a15688d6114c5486aa6d90338d3260de15633028a9a2c501e3e7a88747a03bc4c41f748778fc06adfbb70dd01d706789c49b847b12a2e369341c7b5610f2336730cf1c1bb07df6c1e9a035c6da4f01ac38570256ea0bbe73832f2ef968635765e7b9c823fa326b57b1608c50cb552c5c4b6b509abf2ad9452b76660e69abf2f172a117359b40cb7e972790f4b9bc05b0e866474ce6c2e37a36d74b49d400ab37486e47597afe6a08cacac56a654b1c56cc2dbb944cb6ab12338444d15f0de20265b57f3f7331ce56b374d13d4c89213117a15ef15ed6356778a6a6579356378cabf268be41466fb82c20845bb5811a2ac3609f3d556002148dbda989d8668ed8c26563595da887c657c915bc83923b46034af134a6a71e09992182310b061840afe058556738526469f76b91ed6081bce143e5e223e9a425bd645689d37fc867006092a7305a44537b06c60b168d039751e6b015c7c7d652ce121289920bbb1fd30304124819121af20600c4f0b261ec014153604140a5b8a97ea49c6c065429e08781c7377b73d06eeb909e9222007a7436a8e8a28edb7ff9e78c76683234092b6c97b256f2942eb01bca52a5f192ce1b890bcf0052ee905d66bcbb7ff44462e5c2a92a58313807b884a719cb07a2d8a3a0f5c2bad57cfa692a3d01345807213a2b5cf6a1234278256965464b48bf96fb6d3d0980d2c89dc3171093e80b6fb7391f203fd0e77475b8c8b8e913abc7066b5cceedda8e97acbcf3c6a1b5a590ddb0265b2abd5df28c8d7cb1c6553049d65808a0021d671622f45a5e834ba8498f97a10a15f1c8882b8c28e31b1187207bf5b6577053c5f7af3839bb2997bdfd761154fbc683c68259eb2e2367b2832a0c26a53b6abb06968a05ccf236dd8aaf3422c427368400dab1683832b9c73af3f63827ea16c1bc832f115ff3d00eac20cd353687507cc6d8f97ba12941bcfc714c735b45aa33dd3451ec56c4bbd6c363b3b8f65097d6e0ce03b29fd5039fa0f2a8342514278aad9d4807c1b25fdf035596f8548ca85f2291207694b949b42b00fac43cc6394ab85c0a01c583717d900035463acafed05f6717057e577fc30a92567a080fd942816157146a70ef3427a71478f404c4f613266f95a552578af3b4a7bb8383b1f20a6e47157277a7277086b0c38dffcaa911a1725fd34b04d545cbd924adabba3ef705c6e44c885526dbbb55bfc8a772453397902ea9a2b279e379f65151fc3450a1f471355a97ac0abd0af32a4694cbac06c32069c41fb6af17d684aa05a84689565ec05292d61aa374044485a507ca3478973b11008bcae4cb0a2975c2a471db196dab32bd71397e87240043b1305362a62fa6843010a25fca317993660b705f2637988494b94aa9352510b0bdc352394ab627e5937892aea86ac0e7eb1c5a2b2eb403994df5bb8cf144f3043dfad619e0627c2e661b70d1c4bdb30401ccbba87c1e8e0c1a83802abb5910625344174b6813f89191d23b61f3aa4c458a1886233aa29d6473be06f0906b75b1f16b1e5ef34dcc88007cea76130a70f6d1aae5028ff71ba38e047f02fa1956e7439ce37d13ecb555635e3644cd8c51b53db31a8254b2698a76b96300f7a14847c9ac372820ab779498b15f965831965c158fc196f56aa9dd37b0972c834eb0705b266def50b62636546b96a87ff666b1d5aec3e52679d4ccdd5c9b0dd50a7d916bada24eb6bc0ad94b9ffc986a4899303fb95107a90313fcc3fc0374e0c53c8160567f577402515624d84b15a9b4f18625c7d732aed4c64ad4766945155657b93a81283172850ea5417bf877e5eb95d739079377913529657dca52c756779876954f864b7251a255dc58b723b5fdea551aa299ebb8af0bdc2f9ef1b78cb42401ba62fc1992c5ab95e6288b584bcca263912c25a72a69a3d895aafafb38904a7ea64983637773dac77f0752909161833d3185c5d2824319aed09b0d27eac30bf5ab3849cc9041c7c8bc92e0c0b3bd657e2074963f79a4ccc42ec823c8b0d302d85371c4e928e5cc9d11d0889834622041bc971ac40e00871b27cf052647fab656401782a0685a800850100526cef363fd550cc491225e4c4a0ee319afd39ff2e2b581f728cff590a5a60dd5e4000000000000000000000000000000000000000000000000000000b097441d1eadf6b43e80f795ad83255273dd5995bfb1218e563d457264bd7b43d48790195fff2c19f221b7cd8637576cec18c29a4a51cd07c82eed4974c36e8c +ciphertext: 51256f7e688d03d9c716d923b01f95c6266ec20da79ba4dec7268f51319e8bf0b37db4c07ebca73a80a06c25458e7861dab9e675c67ca9ab940dabb117a7e2426a7a81be3dc6ceddd27f073c2daafdb9162b4409ba741c6f16ac6892d7d8b06972d39f22e38c6f2cbec7f0506a5f86c5fc708a1d9a36391019c6ed9281c986103b6099f87ac956b59cad12f69db134f05d9f8f641678da42b276e754a31a77db16b5e85110235c4a4dd8ad1f6be34527d01115b072b82e007abb4e8bfbef65919c4309b8417c4bcfab963ee1110614e57b85195359f48c5c471e24fe3609a5314b5854b695efe31aab0a07d29ec29a8030c2a7a005e3d7ce06a23bd240feeefe6320b7c994fec0134bcd88b2fb91ec37b0ad802e45003049024133f90ccf375abafc7e742542576b026f71dd8f00e8f790178de9912fa850d6c24830354c4927d711a3314bb389fd01341c270eb1cf2626bc19042955196358421c559a107d4274c9bfe232328e9571192f2209035c425224a240f6a9b3dde07b6fbd18eccbcd7b00a6904a801b0ee93011644d64d0c3d58c0f9699af2d4e7f9578aabeaddbf8257e41c2512a5e566577ebe94699e00953126ce91674a772108a433c82b05524c1ac742ae513087f69e67543b93f03f8bec5e5d8dff5251f4bb4d17e721fdd7b9f6c06121eb53bc06a730d482aeff1b09cb6824eb52838d85af90a685e4178e76441ffbe7aa6fcc3126fde29193aaa25cc850cc0e8df7c9699584fedc15ed5e0e7d49f89efb61ae381e3adefe8eae1c6d6f71ecdb418ea36a357f20ebb4faea2ec2826b756daf9a4655102064d036e745932fc63a0fcba1d0ffb99815d03dcaeb5c156f4229ae0b07375cc4d8a9cd22a583c16114aa613dc38ebdb8c06721d32a6293aea51dd7d31ed3a101ff727a938bc70d78f08e3847145c02f4f0f8635be2bdd8958c4265bb27fe915a9206e70e9cf9979f9b47823708102ac1cf12863ac7dad149134824d3f23a621446ad907549b082ab099815e1fff844959bda476ef642299652f2bc801a26b9d4e5c212cbc1c1f23f23aa334300cbb73bcb9d43344cc9b6bc2aeacbf90fafefcd483b791fc3e310643f910de193c788c702f359cf97ca07341dd6f088db0c435bb300f23d90ad23264f9c394d56bdccc23665ca8f802e2907d08e7c825dac31520282c1713701ca29a3175157d7060bb9244f4a54ce1ec2b736e73aed3ff4dfe979e89e241b578197a0a8f37f0d811f429b5b1246ac2205b657e7ea051890bd62ab11c34e1373e8e48d449ffe08dc36e978e4b0530411d9249cbd5e38182e9a7922ab0e51f7feed86201fffd39af6dba54d3129a7ec700145f819499d4bc2d95a47e09e3429a5803f0b2f35d9467671336e3289eeea89d233f9c2a3562e277a81af46d00417106b1d7257b1ebc20cbf7c09f8a5c4f035a314be27fed58571d77ed229662c946b233feebab9e14891fe6e8295c945502c114e6f2117de50fbf7c116e5e151b12aafa3432a2532f66301292ee764cd9dc76fe93dc395c110d400e8d337541e94ea1afda991ac7309de1149dc78ac843317fb95eef99e72df29a0a88f788eab75ea8ad1dd0c2b1d0ac644cf180d022ea8e0b7d7ca12f65d0c1647b2267b971ae1a7d45b3f5c6ae5b5c239bf3b59260005f24cca25a883245d714ffd87e357d987a49ed565ea729b0c9424aa4116eae2e8ebd62c69fe7efe6dee622d83d620ab2a53b24c82ba9aa0406a9be7139092cf97db8fb4c5647bc14e3b3890d482960c7e8b0422e4757feaf66426985d07a0cc39f51faf3269fbf2d8db382cc35f5845e7dd13df13455f4b3ffde636acd70c60e3f3a814173ae1167a69d7af59d61ef0bb800a371e79b60681c20882fe80fd3e6f5cc21b03b0b70686e8b62e5efa48f46b48e349f20b3f0b4212e8eb1d7b2120c0a0fb8f11852dbd144ad22c549914ae1aeeb990a317a6c942ddd07b023352cbd33209326a6ce4d751988a4c7ceb6e7f718df7e9edf6e2b2675429798b013d321da1f0e0c2f50b2db93d9d451209b4411dd6eae8b74a63342785dd492103e9ada05d797ee2027c9ed0837a0f4e9175b6b508cedfc44e00c944a771e40fe4de1e609965a08e2434a4ff5ea969a43274105b631375c4e3b38a7f40c26f4aa202771ae2a9179141ef005aa18a64d6e97ecc1270be6cbb9d5bcbed815b983ff8c2c99 +result: pass +shared_secret: f1b9f6c6304614a31639f9e63a019e699257c5e60ecd5cc9fc950355e0981772 + +# Rho leads to non invertable matrix +private_key: cc4a14e75a6b1bf87f11a240424645dee23657db9819ac274780c2d7d8ac64f2cb82530b40a078791a2ae70aba868253bdc3045b6254c4e29024894cd13723edc7461a37403609b48f79b8e8b1018981bca9f68031dcaf87528a6b065d8cb83c142ba20d68a728a3866ca88e6836cab209ab49bb234312916e432fa51152c763a62cc53da61480691b07a073be74aa6c2b88468bca8302a23d1d6405ddf4aec2f88ab055b18e2b1873862af6539ca83b1c270b6a563cbc7a220cdc8106e6e5595d63a26c0cb86ff11b48066721634b43b361b57a5b4ddb2967d232d34cb750026b362cbd20188260c6a856e9493ae09c462bc4c8663c7903112488b06b2a996dc6668e382e9cdc93e52a1a368b07d8388c9531afff0cc4c07ab423bac717dcc888e213e3a75d69a633f49745bab10f62592f59d53ef19b6a62f0b24216aaed9c91203b7ee65b9d097cc1e2676deeeb576ceb4fa4a867ab7310076a912a41292c658e8f75a98603612558352a5b7beb404fd2bb6de18c7ac838464b6399182536509624e1e25a7821b71edc57c35541cd115ec52c13a739c3de231ada741274272383cc78bc9869d37282f5980209543c92b76ddf99c3d45cb7409b5e44599b75412d8bd122460905c250a94dd4052c0b0a91c9a906aa3652180fba9212046b4f7ad14f7c304780d553f19487b8b7413de732ba1296b41a2d94983d4be93e540a4a4137a030629e97fa640c21ba5b7b5537a03a2a958ec3a888590a5c14a904dd74c83631264644cc6689a245f833530124f7d10e2596a8be227f270941faa75300bd731c145f781cce52247418595ef67c94a170676cda269e51c7ddbc63b6765b010aa061cc576696c84345c35c491d3e4626efc8b73dfcb481c11bbf8c79c6a3aa4e54c43a44141f5c35932486320567ce37adaf5241bfd8c44ec140d30823b58223b02742f3e2bf5864756d528ea36348c1c2293d8ca050b6307d71a20a036e0060697b58a0ada53eee5a6990a9cfe283436cd36a02dcb1a2b7200a267c3f133ea6423bc001baeca953515214e2766f066cae531212dd3551e22bbb1c705f21753ab60a70f364bf1949901d9a0415a36567614c1aba2dacf2c5435b4ee66193c5e461596719790aa792d5a09ac474343509ee36ca048751bd4b0c644b2b039b1320b2294df814b419c3ac55541be5cf4b93593aa4c099142de9e13699a40709d70070aba9227b6c14f216d434c9bc16112b8b4237f838340a5c317a618a91170709bae6a7c13cf96851f72a8761736c452df27758afa4b02fd55b3493b1bbf96dfc45ac743718978b7de8a017eca45dea633dbc417f856781c856c87516429127c6a3d335f162ace0982235ac79ba0ba68edbc1eafb9ed7a3597ca7a612a9bf3ef2b0d1d7c238e98714a434b8b08b35e3885e007501f9bc06e841921521d47999db3ac3937468a54b95b57a2bbe34aeb48ba57f0744021bc684456a8ed413b9192057eb77a5502dbc89c5964c0383b4c9034396da209279199ab5830abe9386b2e811c222a6ccb0cb23732a95676fd5c0376505943ef8bd67a95defe0af7cac395a743bdc3119b1a74771343bad21c53ec80cafd7548ae310293027d62960116a338d74bbaeac359ab3728e268abf75a8d30b118141bbc56670dc0c5b2d05c9c2f03952338170754e20287c99177c66b810f009002c244f213891c5b980aaa23d15f413d4a80160d24e692c450b68c8c43ac60256ad748ab6aa85aeac5c623d199928f88b04ac7bad2c1249c18fe1b867a02a353a112ef71368eee3210f7082f8b216c975070e9a1a27dc265698bfe4849611716d0fa1b1f9047e8b0905d184b1fdd863377353fae732a5d0388c3c6606a773360734c9ba915d49aa7d358263d7abce563afaf382976b2ca2e1328d4aacdfd78851eb143a1b81c21713442421bb1abf77ba25d4355dd10602ce06754dd9a77aca0e25b1260e994d0fe1b83088a5d385251ad5c6a54c45d93a7d1b25cfddc1612b8b30e753814b505524a5b0b26747645c9b636543ac7a871b6a7cd3865f1d8636cb5210ae9157b567b2ebd17fe3f59b73379d086348c9806848ac3ccc1547e8964f6a1c4b532787dc8620050b7e628274683b79e133969ae154da157bbbab159941484cda4108c84aeef56a54c26e3a0776f2db61ae55ca140c1056156469333834633d88c59aa9207774343fb3c0bec2aa0c60f25a1761337e9c3823a3965028951e114003dc86e1cb701b3112ea048672e5be40c6b319d88d62731a02290ed9d7429b71afa05964a5f775b855a271759945532eee7a1e49c1518d0b3466d2c5513bc84a69a0770b8f506c5203336691a8189ff8672efc68163b895d7a77b4a50668ca1ebc4bb703756e15605ea9e9c7dbd398aed773040ab89639aa4d005638a839a1e47e113564a33889d72682794cc68304d0a21858def7c8e5d20cce503909bb2064b7775db64c8a87a9e3ec79580a4493a0a845db33afbac74880888dd3070dab2ace759f777c03d0194d23a3b655713932570fb3686eebe97747713050868f72f6537b1b1e80e0a84d24c4a9a888f5b7c3bfd9380362ab98806812d07403463c9438069eebc541e8a8afcb93a18285d0f1a319e2768cf1427123ab458a71f3a44002b93cb84b72856a6688b99be6f2c764f81af231c87b7bbb1f3002705ac905f9be3d4aa584b98927902261f2c8bca677a2a77e8821a1afbc2b227603a75c1bc98aaefcb22fca6908ca2a8b28c813702c64c8fcca8af5c29e3893a1d696e3609312e0286c47bfbd2a562692a8fa28b17865aca8a7b00bc1356c489c4a9c11781c5f465c7c547b1cc464b5e56a84fe104501399a5ddc47c8b3ab0914584bb54f3c7107dbf0a3b8404e35fa22f3474aaf6b24ab562d65654e3889723c201d68f0ca9074769c15613319beb2449b4c2cac246b4f4687b09205c239fa839314a1d90a71c0aa9c74423873b08904a263adf2101b02aa222c2d06e42819094a60fcceba022dd9f50dbf00a96a76528785830fe453d539c2f61b0c999cb90a2bbd3db831cccb813ff1a7a70ace99976bf4308e2894cb4232441c0a094dc78334e2be9e6a830eb9c6458887217a1e6a7cc679838ea84b41e5b45066b32c69731ecbcc4d73f68f964958fcfa6a64b8b05171be99a78c31340486174566f4bd108433dde695762328f0570fda1cb79d60c67b510b7b34b0c341ab8cf8bb70146e0cb2036799368ee78b330a9288625c366b0b0d9a1eadf917b2f7159f25c31d34b422ca5d70d93de8e31b7a6736677c93952807314a2e58b685fd926b4555146ba41bc4f223b42821bdb22a99527699a7c85eb52288a3a4c56296bf20c2be811830fa689633887b8512723c598d8b1f9e88671fe77d9ae923f1b85973eb6ccd7cb5ee15b34022ce5078ce171837472101bde6915c97150b3b712f05435cf975b24b51e2395ad667c7f38a8fb3abae833a939b1a86f4545b3b55119c10a19983b089276ed7ba25c910a726ea3ba02344d33cc666a280bdcc2f99e3991d2491861c3b295668cc0a5c465b1e00c2be482a57b9c4475b3c11d9850e6684768091480e4a1dd0d71e88c17456ca0049d209d1e1a92ba4331dfa7382e2852c98390d4393f4016a98d59ecbb829a0f4b7261b12ce796844458fd393ac69f050317b66f7208afef2113e682552e81d99b3bd8bd30648b1a0bb153864bb7293233230f0b164c1a60d834c2a4a41bca495b57c02113281cf484937745b4ee90a55662860306df33368d7f2390c2b600b0a0314d1741c1a1cfb0940b39070fc1001142a27ff752ba7fc83e296cf62bb76f8a3b06359705ef1759702ae9623b6d365344ba2578ff4c00a4cb48db88e9c5acc8cfc033210857abbcd6132140eb372b9c3c1b69c9fed366efb33b518f99c23d7bceca7cb6b427623286f14b55b6fac869e8a229bc342c96727917a94bf29549c145fe9d95d35e518aa5776ca3678460a49bcf22035d981a4217b6044af11c9710a26466be948f177820d26957573b1575a09c3a87a13552f16234db5152dd2fbc764c88525e3226e2b5ff5571890db75458363bd8791dbca67ae112858908a4ebb7d0d847ecb610541c0791ac73f2432775207a73544491b7a5c03199ce3010a05f764a09cb9afa27023f72d9bb0b3252673ab714b792a35a78b0cc1593f4c5582406b4d44f6c67fb06972fc7a30e937d8c7964359376d896e9d54c05eb6864e583539a348e6d3abc256ad6443013926831513896cb5636aa1062f95bdf5b0acdb49a72581b6d9369c02234ab3dc5e3b4419f27318ecc3c7dcc60ce888b787a3458c342cad1c0000000000000000000000000000000000000000000000000000002abee8bec42254848914dcd794b5a37de56f09de31c30871707a6233f826f46fa9e4a0d3487b6714e18bcc9d1daeb3127164328a19d5cf60822f3fd37a24bbed +ciphertext: 6d7218616fcb7c0a8a0ebbc738afeb35b63c00897f8557500d34dc984338ba4d4e9a4228063774f6b19d60e68d67f14a63a0777c4af4b9a0387c8165f368cfc8d603ed70f6df210e9f540cf9d240006bbabe17821d46700b8fc755c5074d4e558d80230b50c298b4a813f6652f6ac92427c168bfc6b63df821d1566b56dcbc48e96e6e9de8c011a3f94e8cb3b11e9928a125b2acdcc5323da857ffc0211dfaa59653a14b408635bf1d1a1ac1f614a6946c98d9ef55e8d5f6c66b980241a0f65c14e5e6fc1c116ae9af9961a7afe535332c5f922f49521672e84d5e28974f8df7e77e7e07e4931f827d94c7576dc16b6f8e0409d4eed15ca747112ea1c9c16602799dc37f31a438f7809db67ec184fbeaf917a72e8ce7d0b68c4eb69b3e4285f0dc3d5494b6ad0e6c9649b75f58808b8cc54258837eda14de7e2f900e8dce47e35df2b529409ab78952779a1006f81e32726d9a6d5a83e541ddb249054956c3a0ab4520b4315b8cae764e42c97af4876ece118e0392b6063a8b38c89dbf8c4e1f7de17aaffdcc9ae30bc71ab4b25b26e0a2526ecce67cae66c6eff9b9a11e8bcaffa5cfb21cd5c576275b5603a852aa08ff1382cb047b1bd6519a6fb1e505fa4fdd06338bc9567d78cf1deae827587006e220777b34fad307a61e955673bb539abeab976bfb545c3e002d5af5581819aa9c932bd2ae210ca29dbdeb33269439f1553f86d44287726d74690e279aebaa526653bc24ee5a94fe70a83c46378d4b2aea5f4da0ac4ce75aa7d21072746a7bd5a4aac231c977e9365488410ed78cc357c9cf36c71c8608b2e233e37ae1f169b15b9b5d5de5c225b60c3ea32eca29501da353218b593c6793829f38a852ee3c575e468734733f8d87f677b5e425a2f96553d554dc52a8ca96b1d711406e04b2d12c0f089ac1001b00e3ab5ca951091876813a1a7fcf4fae9859991f8abcf40bd2430326a0f0ee7582a19416bce4a95f486b146283641091135c7d71e89ae8f44daebd43c7d179be2db238ee7f7723ae782eb4d0da34d35dcb4b8831617f1c82b10dbc8682beb97d0c58d4fafc5fbb8720cfc7718df0883473867433bf7a851a225d60c9e76dd7a7efecd15534dd0e3d14d64f86c4d9a696c61dc520fb79c2c8cb081e72aee2119a3ef76c4f49e9616ef6a85f9b779f99177e0ef427d9a6ba6465f230e63d9700855065b4eeb5ef471698ead0dcf7a55fb1ea54073bdd1d67dea4de22469c317984f21fc421171fea81ac872c779c62bd4e4e8f1ba4faee4e701458a2e21222e9b45b3ba2789d1ddc34bd48f16ef6e4625b1a73aef185f62c73b79dfd40ae3d6d838484b3d9a6825a2a4b9870d87fac0a4b2c8af548b47766e3c92f7821484c406b74bc4b4b88c4d7ac536767fa72dbe413e5ee4ff8d4ca83cef9de71590e02d07d9e830ed7f315d542ccd1d0820374c19967f2ec7b73089a4438e5a94c6580d689bd9cc25bd900c275ce9aa450a5d13fa143e2ed6d2bffd5a1ed96e4c1073ed92f48d575cceadfcde1f0a82941dcf4daaa5399b3775469dc75f150ab41b446e2e3e17cb8c89b54be85dfdfaf1769d022332c3f819536ab3abd1d89f9de0b25399ef5872130255cb0572da109496b44c5abc4b8fc5ce2a9515ba12c38c4e6ee83f4d447badfbf5842757aab335b62c89665a1c42f829a40ca8c470bf79c65e29ab71358063594e21af5bfb2f6b53d2c55a2a1f05652ec8773b437d68ba897c035b781b266b90ae3addcd603febb3f0ad2afa0904cac6b9c04ecfc1547bbb0278c024dfea4c7ec8df54d24c4b7e9f614cd8ad0307cccbf298092ef27add01be5f4631d4e1d7afa0d8bc34d0dfd4922abaf5952062bf86916831d2864404d565ec557ba7753480ada5eecd37e21808cb7e92bdd34b7bdbcc0c93f39e9a4f515ba7bd6071c2b9c7d513b98802111c2ac67bf004f211e4daa201ab61bcf174dd83aa5d98ea1b55b19391ec50b299a56899f51cd476021fba5f5f997a0103049a71cb20da170d38bdec4964acff514b0c4fc77c90e8ae331099f6863b551bb980ae547fa41c12c31c324765bdb09f6d9eb734708b6c0eddba22154b3dce0acf3210ffa58fda8ff718f949da8eb7c7fa4a67775834c1fc9e74c5f7f765920f2647572e9158f6bac6e1240850decbc4772cbf54ac754af22d16ab0abcc3ed51bed9af0a936b82158c310ac457d5c +result: pass +shared_secret: f72431bd4d76ce666c68f35918a601983e117a666e5009b4802e904d0b32d9e1 + +# Rho leads to non invertable matrix +private_key: cca22002e0b84e0c0fa98c902c2a30f0d9303a411db91a26576834d4f1645c181bba750c42ab6bcf401739f83fe2a4a3aa1a3f5917418003aed863875fc044dbc99c70b27758389fdd3cce51d5a13b21afe1219f0bab5dc3b15952591e6f80068b30870ed644de082476e7b32d3a531ff8631914c7a5c106a5acbf8672ab4a304afb71b1672cb281438f0fdb1db0f52948e8b0a1422ba10ac5e0a480e87bb844072e7a134dcce36f27274775fc6a8bc611b2a33cf85a4820e18b47b24188030fcaaba998d84a68424c07f4503abb553ec33b4be2af3557aae2797649da014dd0264d00ce74431e46f8969276b24b359c6750c5bc15a6318c2d06898ec5f473380a68302a91eb562fe4f10596012e5efa83f4c55a19912978a6583e4a884e36af1b9367e69ab0566c3cd8c34eaea615f49c094bcbc63d52a21d74c02462cb0bb7c77cbaa03df988b60cba880771a7c179315a9f6ebc6e9b8c90bbf17f737508b1691ef1952363e9499b5007a9c84838c2a149478e4be76c0368a8220b9a3ac68ef6560dba6b3f68257b6719551d83c38f73654fb392af0c1c2517851fc160c343cf826aca2c5614726c774c758e1abaa9ac04ae0742799060970909cbc2f78ca739c71bf6528f0695ea6175a4ac13555c3bcb9920bca3a37d363ba622666e54a4e779cad5059612792d610257a689975fd664dc5081d5ac4586c60e99b9a2a17ac612e5a794ca4dc097a71f72bce02b4907d69d801a22fd7b88f9e4ab284076037a0f6ac803bd7b243b835e51873919d3b77de041bbdb9c2917338f0c42a54ba6f5539d60e827387a9e7c156155d693b85701b53278139b29858785cb59788ed981d77556d27390285bc3f9408cbdc717895815d31641d0c31f2d911515f36743c40f4f3517432c620892149b518fecc80cd2d14c99730e0c940dec155930dcb5ef861b7c80b55c2223f7066b625c9fe5f0cb04f0bcb880119de142ce511affc01d483ac8db8b73e504b242315533d9c02cb64d15445fe32bb0c8e19383f82854981a9ea465b05c77cfd66d97a2b262bb37398cb4654a0fc8146c00b7608f061a216b9becec17f686b93d88309a7ac04c2447030b41ebc6a95fc52466d36dfd461bb046172f3b83fd10bf79c281202a60aed8467748a986100b97742c8d70c8de523c1d700489c391096c1b92654064cb7e35d7b25f29818ff39fa523c88bd69b8cf41689a414288c492f2a83f7b34a4d95770e6144b7731057c73a077a471e7b378fa48464c426ce5a6566e7c862131ebd5a1b3df013641a878fd702d167ae3f369361666514d98f325679c22aaddb56406e148e744960ee1395866acbe095542a6836571959a80238d037260fa053a52cbbc2cbc035e78fa9c306ebcb61ce33422584009271835ac3845524794f18bd7e1b4c034832fe68ba24a162815404f65c0af0944c9789b1d92767268c801a0444fff50399b3a192131e965523bbc2c75c286c96450c3f0733458bad7831205b1b4841a617626b4bee232cd1f220edf53b59bc213a055d956591fc3518a1974582f79a66dc8892ba71ccf7a5fae1c01841428525c32dd2b433445118559cb5447e3c851a0cb498cf99c2d359999fa3969fec41d1311ed2545f5281a09df223bc4918e55551ec060dbfeb41c777c79acb7375215002d9afa37b5a126625f7445c3fb51233650037e070648c924586bf7013c203e907332901ff722c35c1991acb2da41cacad4b709ee242a9e71eeb0ca1d05595fcea8d175553ce689ba595b8f98707a68a4d20f8a1fca8c34c3482e88c8b043a9d42e4a9e55a6cdd867e106b271031355bdc71c85c80713c0ef7c3ba3bbb9ad4e32615a2b104e52dc5e7481e258351385f9c8932a074529e327e6c0949756b57ef47094e184517819d459bbe35ac6154a70d004490b03803e58c9bbcdcbcd8451c2b0373656373be77a59beb2d47410d8a8631745653a02956dd0a0fe99ca87d78c273230667f25bddf3a65a216921a12844b8c98c197026e14638a97fa5144b44189621f00c75857fca20342a09ac44a4aa6c336d9ae58a15972f22555139e2b3e00ac0bf67b15d64ca8ae77a79b44e5b47a72ea06930aa9695b96987aa0dfbe63d83a352c9370247f6b21f225e096480b17333009bb7858246413061f4e8aa57f60972f4421bfa448cb92525f41ade71a35261551547b97eaac35ec9607a061483874b19714ca7f443abf4bd34d2729891383cc0a52006a4bffa743cd910d4927fbf792c20e07e9228b56247c2440a3eacc0c231ec949ee7809ae4aa00c46a56aba6db5218c588bc9285261b278b1efc62e52556b130a61659cf09648b57c79647b54ee9658913caa76eeb5c8a6b6eab8a7cf9f2707dd4195fb3939e91bdc5856372b5cd571983c9709c1d854ffa56cdaa34b3c2a51bd0d304570a591f45c2f1e4cc35fb5a00923d71a5acce485b210b39de54a8adf82fd8682fac45430ad513aca5022611038769b29c1a3f3ad751eaf5b058370927e36049d1b0970650db914249d7a2997446e1b746f47b5fe6057bd55801c8c0af94857776d0b60be8a66f46440ba766046a1e08948944525e6d078f1177a60fa3acc2832121c7a428d5cb3ce316a986118d006ad5aa7e54c4c5ab5492e894b484e594b14b8f65752da0239c6a0784e415bcdee96ca0546f81368d8899bf7c372789f62a3182bfc990c9da414e0ff346a4c1025ee1bbbfe99099fa29cb5b744d860e6630c132e521a65a2e00d1561c98afbd434be0f92da317c89926a87dd674afdc8baaf99661c9572ab800e14280b3b08f5df826dcc051a647b96009159ca26f5aa2ccb770b8636b432b564b4183a50ee32a80318c646c7b29d083c718c27ed989535861c385bbaa44b836dbbe49432f63b29bf66923dde69c6d742aa2fb28524abd22433ceb87a4eea71a4180a370305173a8a597aa00bb364bfc167461e33cf4e764d4437e5ea445b7334a31db333fc2b3754bbfa6bab6bec208d68274a4103d16f9069a9c9f6b0901c2281112bca50b475b4d6cb612ecaacf8827b55b6fa8c1821a8a9f602c66cb719c97337c4364450ec2a8ca6b01fcf2420e0b0d27c0bd82a721c74bbe62c5ceeeb906d555ca90fc12450bd0522ca52f4598f3701a50710fa2e53561562e8cfc58f4596cb9c8b8df540fff63359b24b1cfba7ad559a583b04626d03bca5247be964b457bc71e324ffdb758ebbc695b919517e045f6e1162c333c30526bdda31e5f4a6eacab3d97c27025f32e695703bbe7ccc18a87b8e347b7c678f2607e24c888b85454fc738ee0a74720ba03a7651d84c4223b32277b5231bdd1b4e61361a451420891c1a0dba6fc4508119237fe113aa087772659b64c122382bc9aec39bfd2b2a88b32199d38728ca98b259b85df75ca4ee5a671130ac11ccfe19a1fa34954387035c8721e2bec713e635290eaa70660b5b79660334a5d56544aeed1044d6a3f0b88a1c900cc362151a3e0b46cf5a64a5bc38578bad6d0c467028df742be58c3c4c0096c20ac9f5799aeff295f3939ce61a92148ea2313195525cb3da93b30698ab893964d23e72eba952f058c2f74a00081814497a0306a51aee0ac1cfef00b7accad91448f49c8530ecbca5c5cafd66b1b03515a5d6a0ff5a10eceb67493506c8a514b72babd2036674d1a493b598a2850342a52a163226f07568c846a4bf35c502255b9ef4c95c87aa6088226a8033af1f6bd93e642fa8a5ae1263de5e53de8b419ae066ac3d28f159613cc63a163a41b95589249f0747c6a179ac9830cb5c14bc88efa708100aa7a5d2c7fedf0c550a5097f764d948a9e4e821a4c64a125d9c54677848b806debfc2cc5b9c8187b52cff197341904cb21b9061acc7c12aafab320e2f468244852c3720a0ec554d1219561e954752495c423635b92975ce327c18c346b026753a60c5159a33c584a2d297a499a294ef9c1c8b5081f859443f53625d6113ba1a90db33d7b5a32fe399eb0e84e0804adb0e29f4f063892484110121fc6c618a0235a22014dad868ccc55875c37af10062fc8a029a0c458dd80578680757194a75c4350de14100c73c40b616becf89637508074baab38acc741139b31d70bf0568ed5302f3e356dffa01f6da50011313b78016134e4cc15e65206f1ba865180d3f7736076c682566defe87bd676bdd149c76c136d549049990b482860a36e321426e79ecdf4c9d4b0b4953073fd8472268929b8694f07bb7c20f2900db8055893607428b1586c65b4ec7e195a431249a9d1480400d0825c4a655e257ca20175ca47ce081938e724c138592946f344d9eba69db96899f5afc8ec000000000000000000000000000000000000000000000000000000fa011a76273f6f5108afd91aacba2767649faaeafeb78456b5e10131e2e533a053f53a49ff45b0ae588d417a63a599670cd391c5e9885c972593d09350bd7523 +ciphertext: c22bae19c43331e5c52e16ee59188c1fff71f15af20de57409add7604fe7c7a9426ed876726ffeb416a2bc7c698584155935d02338aae28a12625d39b8410b232da09e83c1c5e4b12cdf2a6c540575f232d5e5bbabfc299b9e36f3cd658dc38873fb3d5e9b3c8c292e28b7367299a12dab435bf2eff2602643e13cfaaaf96be846785b3b712a1f7de9f3fc1c340f32d069ead5b68ae6adb183c5d7589bec7e2eb96715ed3f15a336c63b3955fd6329281d069a041a76e7d4bf6d758dab0f5eeb27e74a318c1dcb3a645155c62c5d7710bf019fb0667d88da8d41a226bd45e4b6015166631fcc9f559d405145d49291123baa069febc3b720c2edd2dfbc29145c6665b0a4bd75e95d8118ab1367175464fb7a9a6cdc0aa7818466721f44e6622b40fbbc18947652a1940f885d3977f9a177caa17634bcc528d71ea678b387284f9a33f549052c331ec81398dc9f15bc3f3eff791d31f80324e21e86317e1ceff20791c8c8bd590d8ad3f64b3efdf432efc0e374506697728c84711f84b0f1c1c386f8607a20cfe3177029824df54caff1c525f3b1f8780490439a53a3b0daec32289201c81e4358f8549bf9ddcf2b2991dbc54ee9bb3ec0f7344100ab900a48d0a350546953a52a42d108de591cda14cf5471fc38ca8babad6693b518fc8774f351bb29ea8da5e2eb05f3190a97cb819ef91927e6f1288872a8179a99b0c071c429c5dcc8250d5e9c5afa505666d8b95712605cf9fa557c6c26c574f8fede993ca03ecabaa144911468f8eb0549a5c0f9b7aeeb94ee26d097d6b7bb76360d4d5091feff29843f256507f4bd743a5d2a50cfb0d0d439197802a44f53e74bef67695bd08f242f51d842ecb3c24a05788c75315a54e1f7035b86171b3258dbf49427cc2b871b3664babdd7db14f4d9baae20171ca7798594819f5e2ffb31c2589c169dacfd15b4c890441f0f87a8e503c2135037eb62988aa1fa610c6ceea56ae48017b8a9ad2ff5a86bd1a9d17e5e9a82fee0fa21b7722535b2eeee10573f9dee78d7b6667484f09c8353e6099c09ffab08994d2a6a20344de0c359e8adf05732fd6862a978ad9614986a2ad87cbd87015b2925d6a23a9f02f27fc7507f852cb06539e00ac560461154005a9ac3dc5ffd521abf8d584a1df85cfd64922e0d1e9e4fc731b0728a50c02e184e404b3c5e4fb8fad63a460e45370211bf60e7737df85b373fbee014b11706c9d8b09b1433a96ce62c5c0c08c484cf8be95b7426fcf4878a4eb15e668786af45712c82849f9146a2ecc3380bb473a0d619dd0295401ff9d1f57f2fd5a84bff5fa6e1786466b60169c1ed7e4083cf1816e116e8d0bae7ad6bbfab7625a47eb6d20fc1fb2b91c84adc23c6c14cae79f4fc3f3ca90c3c15315720fbd15d1a70298cae1b6b03dff6a1afaec2018016616dd7c890066e1a36562e55773f8c5fd22ad1f4f1b2fae4e8ceef92c681fb40cc279edc2a834eecb1e49efed02766b9547bd679634940f247eec42b790afc45a77f5e4f6fafa9eb1323fa73fd40727ffb6998cc5c8ceed32252e5c26e57290f336f5831689d54b8797de208f0ca2c75bb6d7f9dbca88946c1192fcc99fbf906c592090d3cd183eccf714c52c39f63cce1044a7e15cd574aca2cc7d6a76a56e945f108d53c51fe67e8212abb7849e7df5ced062bab608b445ffd9422e608ce096791a1cfd3f2b2f61d4e5c800e33fa3a8a38114cfa02385833d435551f2cdd5fadd3afb949437f0c19d7566a5659770441c7dc09768782f574caf781855621099d7602a6eb1935317d25dfc813d12cdabc3897d0493b88ab2eda981c407e0bc4a62f6d18c96bc497c6c9bbb5401b77a77413f154fcd309eb6c4b711e41ea4ec1c7e2f4c503086be4d96394d5b420a813cdb5798b00831139eb57678b790a90aa731ecacaefcff840e0d721dddbe5cc1c3deb03620615f79760b92384fea781c8971820f9636d776bb2c32d596104fb30e0295769acfc39a3101db88a4b5b38a75e9ca10f4071660ae869063cccb409fe921dc1596a517391184894b45a561621eb7c1184f5e69051845eed47021da5073e078e0f872566cff985ed3b866f273b80ef57d88cc1e2f91b72c69b1c1a766b4f8db2e8ec653a618f046fda32cee1f06a6e8b5895b578b3989a4e86dcff4cda1d0b573ec52b0b53dcb1024ba58d10253330fe3fb7c19c6bf30d +result: pass +shared_secret: 0b6ec01df36ce91c82f78ed1b85ab731581e50597253c08745f0f2891a97f942 + +# Rho leads to non invertable matrix +private_key: 16997ff80976d1506b23c012e387ac6ca0a792f7481ac3c9775317ee3ca5267bc7180ca884d28bad6b5a05b045f33a9b975c6c98908d670550b874ca70a77424e48bf097256434b9d9b96c8b8149f02ba5bde9b813eb2b60f20da4440b4cfb05716bbfd86255a1e82941d2816caa7253e7368a4bbf4bf546f40b1bafc65bb994c34f7337e82818021797a431cfc664699bc22b92561fe3d1cd6306b89a36380920abbb466477549d1bf14364221c10f51fc3f7240de4c99b3bb3eeb9ac1fe12bb7c97888e8386da4a341a0be8f78a7b7c49f2184376c3c3784289a6bd9b6a03a110c228f72939b86c7a87dab3e093c0ade693a0e5331c48b761b070476f55cc45ba1dda14dfde01a011776143a4d29d48b47b0c6cd2111bf18360a7438f384a28d772177f648773b961a86637c946d7981a6b9f571a4c29aad07220fe081f1f18700f3c99ef28e76819f8d7c4c43d754cea21180c43357f3430bcbce1fe8952c691cfe9a7483026386a479eee4025a838df5c563b9f5a1882a2d7209a68d231ee82260a7eb4fc157936deab52618cba32772fa1440fb675220f4610d749a5b3b142f31b404d94d2bd816cc4773ec83aa1445a37b361e52b10960827e94171dce3c12cec80a1ec65aa6f117fe937673a78cd7767dadd3cebe0217f13c903ca25d6a681116b206acb46949b18f671a63fd2581a6c0978738460cc51df3711dc1215dcf75525d30559ab6bc52e16fa513753454888189348f045aee8a32e98cb2dfd708e7d42818115e5c61711a0c43e85a13657aadc24b5b30a04a43cb97bafa433204c18536337758c0db6154d4fac670fa3af148b52f24aa731c31f98464ca9bc975e97fd665710ee2c56b024fb8d7c7f4a20cc9d510f8eac38f96129c97b17c890417a21465d05abca02754ac3614e964f1a24393d05ccf5cb9500852cc9231656ca899f3538df30984475209f84ae8b99983e844b06ba4cd8a9640a513cee439ae13ad57d3846aea4fa165b68c6c03c05c835bcc5a63d45cc5568aef94ae7798bf29aa7f38e275c902236e63872a274e4776cf1928c492036166d04eed9ca64aa16ebb4b11fc3ba802c6b249e4b53f90112b587d36c6bfb0733a2ee3003419026a10a4c54c2be294b2031a48fe895c2c9920b3772f127338a865a82c3262dabac113c235d433b90d401f5557bb1bc68359020f75742c2008c2bc8862416910f53772a55376ef05a5eca853eb1ba5ef841f243b8d98b11e94483ad7e72fd7360a3641159e481ca50971a6e8aee73a0d4f24b25430ccc0997c631308fe2aaefcf79af5d2045932043d95933919b21ef87865b8550742a513d67af756c5958465f582983a777e9032ac43164e552358861a0ebc458e55865fc3545fd01b0e7565877ed3229f8267369c319abbb017a87ca662c635519ff418682af39ba387aa38ec37396b4d6ab505219314f4448d0f572f4330cf33fa1369872649c922bcd228c294b3213a216e59752072b8e026700ea63061855be3d6037c0cabe0c21f5be948ee4b18dd935ad358a5885a0331db2e496995bd47c3ff2b679e0abafc02804b6117271a2b00e33bc06250fb30ae2036716d30a50aa07e45f244e1f0100d74933a0cba383545cf629d357aa8927a7bd4f6575059485fd455be7198fc01a509920f6c0b8c5a565b4b86c084a60bd9b9b6037727df67b83ae06c5e47aba5d263ce83808f40a378aa43b4ec5458b33a0eac8c816abf5bf76a1220a99205258cc4a9236b4dc252cbbe8884e8ebc1fe921ed408582182b273a199d121153ec38b7f183174754f66332ca98b87a31672720815ff7bcd0cdac810db905ea76e6496742d26b2989b201fbc2936f5a6cd60c35e757f8c33b75277560ab948bab2962df9c38c91b44f08090e5585d852c4b729c52de88fd8c54722162f2d7696946c7b710079500136a28b9abf9a5c0294a5b265865cb04f9796b648f85858f8982f15c2bf31626b236b2c3a6493910be2cc8610829d96693cce3686b8a63b91439118fa661729462ce58e5e28b764aa39911569d1ca5c1b33885400a16f169858930c7f135ab6a95d08ccc70d057f9e73a4c8ca2da7185df37c8a6f727893bb6db74329cccc4692589128867cbaf28694fa747e86cf98619e99b221db88a81afa73b348581cfa5addb505d4b3155f44c292f958f02c32de979b3b042f85ac3354fa3190993040a01ad5450680026d7e17a0732a54c09329373009a1c3087e8c892ac0aac4793fff2b98cb96a3d0671f998749d716a78c4cb6738879d76307a3a35738a886606a236c92accbc09ac502c03b41ba0a768edf06a2c6162467581eba5083fce8488414068ba06158a9128ff5361ebc06fbd492d69c185d0b5568c1973bcc1604a4c0916a1c03aa9e82c98cb3f107ebf239ab50213db93136013dc11c44f2e55871c7bc34fc76a4383477410f73902f57d229e6851aa182880e767e1386082fc77f20c7a3fad8677f9ac611dc40494ca66917a6a227b9e6e71a325a3a4925640ae59c96d9bc33c919be595aea76a47bd64fc291948d51409d99008073b2f3356a040cb8a27706eb5ac08d8aa71c716f4f9420b5974078f235bca67f2c8161319824eeb892e56a3b7097068be52eea909805863057f1163b1bbfe98b1963e83e1edcc65e88411836a6735b50f8256d54dc11fceb52ea771930a3987a85b2a73a6e36fc946a3716277943aa935953141c167a8fba5545089345ce8a8682672ae718c87dd63511f81ef1185db0c173159928722202b0b161f5b3a1224766ea1264166c2bc83229fe273824014adb8c6630cc3fc8b19e4bbabf24bc9bc3c3adc5e3774c11a134eb1cf491550c9cac68ec89e281b88709ca688597679a2ed6f73160fcbb0b9cc696da6060864c2e0108cf225323129af8958cb5436604ac0e184a68d22110afc91384cc7735d546e6db898e163cdc62a3e8dc4c20652a947396d5973ff8f0b1141bb361530011604f8f85b911302064c69493529869c5284ecb64bbf00612b259b859717f89bad2bb71be41781fc011cd26c93c7028ea35389817bcfa09b727c66f86ec9497ec90dc0a89402611b71ca6a513cd4e568cb02a7f9ab84135f7c1b43aca898780d150636af51b8e78c754067f872438ac7a6270fa9ba3ac47dfd13de72202740ca297f284acd317282733f652ccfb805d628887b1ac6b22fc0ee4748995a685a151aef80cacfa6497f23156805269bc346eab122cc8a16883fb42ebc19dc2c81065a773444617d0fc0cd150c3afda64aac933823864197cc28a672893f926b562cfdfdb7fa62bcab40157f26b0dc0fc805de81719759c9af0abbb998559759b35a58daabb243fc2477caa289fd194c171be2ae5b66b84ca5c480be10887948aaf86149c5f47b137eb3d2a6ba5738c1ed6688ee6eb7a3c8bb022d19165964ffb2746c5e81b39ab7e6f5b3ad8c65b0bb3b7315484cfb62a96f76cdbd715beb261574bad950660f1f155d6a62d29449cafc43e9b0a4b7a747aa65a825b26282a164976d557fa8a135ee58e9cb1bc0e8bb38e7b931e528c7e6a2139b2061d605909375934fb3fd7273cdd7ab28d17b892102149f6cdfad1772f0b18ecfbb9c2583568551bfb33a1eb0cb91cd5609db35379f71a88e1035d875942d646783a8f11e4314d6c97934595165b23df05c1ab8bcf51783b81f435c4c74d652b44e077c7685908abe138755763974367f0ac2a63f5cac37039ad7919d3c98e88f89397a401d7ea1b06c08a717b582238191f17b9ecc1782976ba3737526e4bc152d86f3d4407549a079fb15dee5232f01a05300a72c073be6147053d712887fa909aa787c401b7b08c1e8395809876bd6d423c3e489e152696c12603f0d27ec9e4caed1bb9563a19547400efe30502d99430bb378ec397dab2a553330a34243839876b5ed532fd469a7df044ffe90354205303009cf7f252dd6b0aecba8da45a8c683413577c787ec8ace7d17a277561a7f271283895b380cd294974520556e072a7ada4024a2842e3f20c38cc5da139a1cc496fa583a1b1410a15038002f1a17352972347ca22215739d53b27e53dca17cbd2bc616a804d314373cfcc1d72c0736fcc3f041455443c443e72875f968d095b18a7f111c1ccbbc0c1a5d8485fb207223057b8d4b754076a919f96cab4db533e2c48dc134c190b478fe6635d053c476959ee4b7ff2754bb4e7c8b9675791d1a84845491902c7cc99a300d4a1196a9f43c816d7013794e1b3402622afd8ba997cb9aab2ca302b8f3af098dbc62d44bb3c9e35871554c6d30840ab3c7127a030e19b4c1e382228b5bf481b0759fbf1adff00000000000000000000000000000000000000000000000000000077ff9fc5bb5dc787ddbba2b73876efd905154fd9ec65b71a6253c625d94f53aee366c059f5f26e6dfba8db203c5b27beca8fedd3de2664f6bd5c3e2ac9fb3891 +ciphertext: 6e78c7085b62594c22b881c61e63674892e8b15be6b3137030cf91834ac0126295c6893f0c386b7670821cbbcafac5d4211cfad5c1f75deb8e7df047b950fa504c189fcef6806e16c7a447187a7877ff91d5aa1f89d9f4c2f8c726dd7cbc688e247c929117e01c8cf93e62440ac3f9affd27ecfd76d525dde13ec8b3a6686e25cea8e46fdb3a264b4e1692bcb1cbfbf6e750a1faf99d8864c1a9beabe0d436b7ec5566c92be999b165ff4f30d6ba43347c326edf4a41ecf2d35cb825bafe62184cfc28b30419f509b631f9affdca2b3b78771fdfb006f5b6cca6d0f5522308543b4a1fc65463d8b0ef14fb3fdc160178692d598e59d71110447fec3d02a58556bd1d17d212bd09d4dcda359fc4ee60dd2f0c73db72ee684a28b550f6b17e7dc8e2bd1867076222033023851676c0a55956e14f2c67874217e5349918243011ace52437a127c1a743a52c7c6fd8a0a007d5d020ec1bfb9f98b0ae36561eadbb5e23b7202d909c7d5fad270542c2e57dd0a54fe7179050b7ca81d72fc8c4f07f45fb2ac905e209a3ced970bcf5334daf441a0ea8f250d41be94cc33d96a42a067654f43047cc500214d0a54920f61728b6e95a014926f03faa1b27f6f5cb4397347dd0744c09ad92608ed7cbc0bae29092d6846fbe0fa14a38529e00c165a7ba098c16e532d43a8e4bff1490c45e0a33bc02738b4a1958cebeb39fd30ed7026b3a015863c2e4a2ca00635475678132e7fc114fc8e891711241942b787384ee22352b2811cfe1a22fb7e8f2e173df93e59cfc98a677a136ec29bbd47bc66070a7a8fa3a709aed2123ce55bf27ff2d23eb87b9762659d16ced5e24b7e825e0b4c2e8a6b6cd1596e4fafc06c9e90a8f0137ad182662f54288da8b590d42c6fbf9bb14cc8f23fff1abcc5885ecccb580d93846b2ebec01bd528547765fa2c231dc1b5ec3b3263617d136a102f6e02458444b158162b80e9acd39ce90db232582ecfd679029c6ed4d5a17f28b4ef2a120455b5933b51d3751728ad07e9d1ae3dc52d690d5838cbfc8c8d5bd7284dca1b753be3cc485aff60a120eff28891e902af0ec3358785a0ac87f99f18f268d73c05ba725de2cbc82d2918f1694c3f6c813d02f341c9f40a7c75bcc5984d5ecc1cc308eb16a9c1971d4f8e6a8d5ba59e855656543c0c7e5b7e49a360bc31c9411da0642bb815703bb64fb550f19fbb0bb993453ab8f15ca9ebddae7ef5acf2910f130f95fe1e4ca602f7e09d605a4dddacdd3cf5c2830a7bd1fafa1d63f7cf4ad511303ce42fb6348397df469a813c822527b933747f8f419177caad0787b63570cdb807a35a190a46f2150fd19c18db91c9435908d79449b23430c1d26a7354b6b9d1d21f31d160e767681580c770bb264dcc24567e88a8bc6512831fba35cf6aa4fcac1040b200df1c60b88a3d7e1550f0a27e8232dd88a9c751624198f811ddbf1c2a833c58b91bab501e7cfccb5374c21482808be44877ed51389234f3bda65c44ab5781da9ee3269a0cd4a3f13f50ec1445c859fc164774cac725a3b561bd63a97170823fdc07bd6ecb46bcfcd76384e7baa0ec3c1f4c89215e26b580962502a4c06aa26068c041ff1354ee9ec07da71b163901784ef525c65bd00c403a9445ade4b0bddfc30e04d278b4873dbd1f18f4587cedf870d958b16be02ecdf3a5cc435b49e0e56775521579530013aea6a081aed4a5774bf72918526eb290a5bc1ef3f0ed9440863c1133a70b1481d46b6f0adb352b3cd4e50bba138570b8e5617e3a10b6382970ace312b95d87f5e8a6baea10d2ea19546acb5fcbac0d20e964b7c0bd0d1825d3955971bd657c316710066d81ccc421c786f7d21df4e748b47111732f1851dc992322d5b50cfcb66321b46588b39184c503666435d620eb03a3535b9611e7aac801e9cf90ecf7671f70eeec6103d6e00a2ca5a6a8424e645d4fa89b058b5f77441437e40bba596d705ba522fae5fb1240d9f9e25c9bcae741b514b9ff33d0132db5f06a73964f05dce8b41a568413bd7f4fc78a4c7dbd2f5815f3dff8f25b2e82a508f5f2fb02087bd23927707bc729574777e01ed0c93557867956d8493c1cd9dc86ef3c1e48986be905101578c8e7a11ea96709929e5dbb1560bd4d9f9acb7957355e09fad7c97712e890234b335fd950e25cf59a4ccc6cd461e6ffbbc43026faa7dcc6df33a8bc5f1dae7e5 +result: pass +shared_secret: 8918cd0c3eabdb8267e24b79272ab6b67c9ea6418cab15e2e3070f6c747b4dc4 + +# Rho leads to a matrix with unusally large entries +private_key: 00208080e8b3938b09aab715a0b7a09314c3d2aa03e900528a209c655886bf0180a0775a1ee133e543c17d7c24407131f0b813a9287c5c9939d43ba2c1f064015c1babc910d1024bfb46a3fbb1ae13dc5d8bb4576787a592495786a53d4c172cbd3b2cac6a2f5ab68fcfeb2a67a997d809800615c043e4bcc0985de9d671e6e0c8b071a20264c457c13b1f4734f234142e86c23170821d068210b29358694d8ff27e89c59264a315b6591d97d90ede633b68fbc36ca96b823a4bc66144b541cc118b0d60a66c89124d9080ae30f44b9f4793cfac65ab8b8cd65ac81cd95de566ca2c19906a955a04047052a699e8a132e2e48aab916278c49ccd1ca0076b5254784a23f7a8c164229bdb9b46e1c7bd4c74639053cad5226c598918687fbc50323f086238366c4ad9172346626b54ce142053de67ce8867cf599587d0a47aff0a7fc113140c18c40bb31e2340822cac294aeb3a02652b424ac9f1008a592ccf70170246e689edeab03dc0249ba59fcc6477fb668038443bf9a743255310df11b4c90a97bd212a74d5142bc6461a135ce7376995372a1bf919e3db20f22c683f488395a95e31ab13aa707c59f22e85d892830bb550395633f6c87df28401865106b5cffb75729391767522ac236072250c6f4dda196a90bbdfa183113c5fe2e31ba1187b4f682399f3c6c0288977904ab445c0c1b9caca030aa639b35029657c1608e3a654cbc39f8f096414d278059a6f56c8c838b1879b00ceff668190213eb15184a57706bd8c9111667f52a656d161bcb5e7cb8ef5beb6756371ba4297397eb6d0c850aac1e01025001b71a874a25e3ac16450228dc33691b3112de319f69ac29f2a1cdf02a0cd77319931003910331a6268f42669f4a90e79bb820e5c98aa252dcbd056318a050ab71f5d60028fc41594688cea4a95b32529c39c582ae828016644faf4b7b1fa6fd9c305807c43dbba54d44273669bcf956c197ea3462a30be3aabb1a6654dc4a72bbae53982ebb986e249d9438d66b65fa15b723267ce1fc1200bc26656d7c4e1839e02927a96304460a34a9c0a22ccf15c7390afed4a612ef236f9d00c22d04cc1dc362c08afd0a16536985f69f6a15d6585c410ac7a39599c683b9e67a33ee299a5000c7e4acde611bd6c817b1aeb1373835a245b916620be6ce8093f88635cfb619a963c99785cc5c354e5d025f954071e380876408fc5ac7fbbeb4c532b1f1be67ebfacac4cf907be9485c6da8da380809ee102af0c98beebb088c13d29830e7fca4dab8c1e8cc87a3b4198c50686c82626c41414d50878f403c10ac905f39a901405b93366a575338ed7d66c0a27c9dbc4af2d217688dc3909db8878000af307a989234174363f3cc35c25a42d7361ccadeca25a484a01967be2a65bf4998d57943759528d54e498ab18514a5665b87c98339c3fc01baaa2953abc1aba78778b26d54bdb2ab69dd705d6953dea404adf8c82d29b932e144f48a2661dc2129e6a2a1bc5242552374a504e0d135e6cfc9fb91a492e443c608c6e5342361aa8205ac744ecf974b667a6528938b6085492298e97ea827d5a4274ca359a1811c71a574dc986f4262b2e29256c4b52c9a22c3f168988ccca62e0b7d8cc8d1d861dd052bd9bb622cd8b769551c2307c82aedc92accc3d2c67c3ecf8341290af6c93a295fc027895809a081aaaf3cd0131174c8605c7fc29ece47036866f7fc326f7c947f70852356410e22700b5480897f288dba24c494685ecfbb624bc189dca10d9307595969145b21ef4ca1c435b3d39555434e133f8ec8c00dc49f02788041a6deae40ad5c9a3198804fde6230dc25b7f86a86bc00b43da73b5b40e3943096fa4540a019817881b4421961e293250056300e273f3d87153765ec237a79a16ba89a960fe42aa887c65fae65719766c44b2b8a0e54e97aab5febb1c194939e11928258cbcad6281cd37ad6033b1c9982df721200e36cb70326403422519f3afc3451af15969c2b26957c452fb136db18357516617892214c758cd9b556a827434c9510a5f6094bd32c8633966eb113f9e4902b6306c87732b96542979159ab49a170fe71a23093c1aca70202287d8288fc2f56072ec7aefa293015b6a58a2899ed79d4a09701ba42d26c599d8a2164204563fb90ff7372e9d76798256925e67ccd5ccac6d69a85343825b6a20793095e1a29d1b526e183611bad90cf6440bd3e79f847c6b912aa1919a9e7d9357b414cfccb206180067469b294b2c4233960a40e17800ab0ce483c40b653392488df837689fd72da0daae74575da747527b2a116984b2adccba04000ab72402f09c749341be42c79a5c8198488124fe750f66b82cf272826747c68a946d2629a48ce0a777b4a9673ba9c3a2a402305506f4b65b65b327e62de16c696bca3d0b8ca44013cc88d9444a83549af17a3f8270565359b168ca721027479a6e60a28f11b33d88da4faa084b576ba5bea09c2fa8a68c0aa8a309c96119aa52443bae570abbd942d193cc8ccab6e5643d0e362049f1ad00f98d173849afb1248ee2a67873950ec849e9b7042b94222b60bd50720b94d7317053cc86758cfc0bae9c9856c0c4411e74730fb65d8b7b838426123bf68b9804473469c6d8717dff450fcfa208b8f53e2cd8987919a5defbcda5a422ed82b495c67b46264106a613ec138097f05a2f2c5efc2076b9e2475ee162a5e7242cea1598088f8146bc8ea65909723fb7a60b1db157a4f43158457d2d157a1f980925a396401450b670728b2c7ca3aba3e7d4b4fd34b24caa87d45846bc2104e95a1d9a5676b734736fb00f7b3241160c2299b50e5517bd4faa859b79c8590c4322115a7c724f0767c056620bd006c01b5b87d80091bc483e5d341d14149095045d0648acabb46053e78c84045a9606bf82f6124fa9a8a9104ebaa734e3720eb6921553e353e66152f2e96adf34534a06aeeb677fc4f901bea148d28411f1f856b4d2cd261526e3a8139788796690413a50251dc1763703a42ee708f932cdeb9b7ecfb2c7d99002bb93cc248a133b9a4c8e910a045669ef5bc75113ce12f7963d665d6662246d383767f74317dbaaa3d0b855bb0274815442f0b66821cda6aab15672192d20c6aa8537432699ca8a22392a855323ad70f75979b56b392c29caf9c072885710c33967120aeef0bcfca1293df8181ce50dae21577701b1fa216dadf19fee4c35e0d435ffc83de3f92c2b276461b66398c75c98d92628b32a2ac3b571853c4a142bd5e81a8770c9d9359c91ac41aa2b4b063a9bcaf4592cb6626c213bc89c6eee3b75c59a21d6d748825b336f4052c6bb79f4ea13f51b672d1abb32887f1977505a75c13f0b66db14b56956050550ab0d85a814640dd3a36a825682c9cc6d6f13cf132780f5fcce87355007f9021ab5a5a3a69369c7876a5158654bc9f9400a1de60e71e34a370372f24cbc84166ee68b6433b6911a76bd78fa249e850bab6aa96ad820e0dcb438fbcfd9ea81f5f3c0d5d53653ba288815029202807aebb27402660e4b3cdb609bb7145dbc055fa146466b121e673359a8465073d99b63e799cafca95733938dfc2ad7d6007a36a8da027ad396618f1647b1287094737fe518b779f238b1ec0c9351b3c408b8f66b27f5262693826b24842a9153a9d205a7593665fc172c7c835354daaf90574686a8ca7fe5824ab94f29d6a5ac87cc40b999e5e7ade2744e1fe7048e38c804472579d93309986c28962b06e80d0952ab10d1cf1d945b99432ef5074dea9c6f4ed97959fc904e23a3834cc30de35f5350656d027a1e6620925a6840a337d14a82dd524c2077302fd6b72e97a959001d3d81768ccb7937f4aa07f00eef0aaeca877999e5598d30a81e920e2e8489970a31fdeb7d921474500835a01530e0177a44852cba38c3b0c297a0c5bc73db986d24cb0b323402d5355b543468f948976284dbcaa1c87c8b27cc62ce2b8306da3a5e08b0991403e7b0381adb0c897c7a994997a69ac1f5092f8edc480e77a82ae9bdedc724883b5eb3da56648979fd2337fb42aed861859aa6165a800d4c9b964e70195927359378073a84b80219613873a164324a04144c4a5b551937c23ac75e3a664a773966b512a01f3a7a60ec1ee06a068933a8ab0844511488f058b2c5bbc1c8dc07e32b267aeac8285543300bc66f8514ed6aac59cbb9be835b3ec68987a5cff5791643c60841da8c172c1ffc07110c77a43ab34621c474a60a385d153d79831922638740657030481146ca6843f6043cec1de4b0b307c52b288b98905b918bf3af0e698b4ea261db5895f7d02ea0fc59156090609764d09b4a7ed5000000000000000000000000000000000000000000000000000000ab115291ae8961b14e3b7681e82897a566fae64d7340c19370d028ed1b71881f11536217ef54eccc82ada15ed86ba2003e177f270bb5aeee52f9436e31a379d2 +ciphertext: 02c49972f757b82c1f5e7ff048b375cf05adac485075ca5a1eeadb615de1306d6712f0cfc452db395c57039fec57708d0a35b7bb238d1e4fd58301473cc4737d72ceab2b097d513ccd17a7f54d1fd145bc28aeaefd2157f2a8dbea391cffecfc2e1fb86c909b45e97a39b30ff59f176b2359a92cab56cf8d04ca42a08c70051c8d9405fa9aa2aaf5724d8b2a00528b7818671af4129c527bffa74702f02172bf51cb8e5b7c07438c785329807bd022fcb5aad5286642b1fbaf976af9816d3f0a3fdb79c2787f6abc1dd20fbb2995bc2a4b2408f5900c68a60f38f78037c3ddee01a3861433a7d9eeb5e7a41a56d2b2a11615d8ef8751d19cf7bc5e5e46b0944dfa61cee6dc16c490f5c7b62ebb6bd9bdca7dee23c3bf1529a4bf40977b307e945efb6451d4ae1c1aa507e30f653ef476c64610edb39201492434dcf36053f668b43746cda8fefd4316425c92f97e1900c62a91004405349c69497438aeecb876ab534220a4563138ceeb3d4edb0d70330ad031aa82dd62e19d17f62bf83dc3d4e2c3850d47efd50edbab06c9661d1ef274e856d8ae58564909625de2acf771334ffc3a3d7a0b1a382e8a17c1a1dc0f29401d9a3dd198a4ad70a740700301da40b468fc4232ae841489a1169170d5131d9b0a036149eedc23f2abba55883ffbfe4788c887e3248bc1de1b3677f286f1269d110d574d01199524d93263517afb76759bcc2728ac595b004508946618b55b0ca734431e85496f07e153f9707d876b6342cc99be864d9d603c645bb9731890d497d85d955e2d80e2e660c93968873eeca1a51157ceca558c0544040db61fb4ac4e20effdccdf950feb214971dde984cff17a75973b8d3a8cd27c92a8686fb93564def326e3cb617411892469be218d663a009c37e2d573b59beb4c5f62206f3a0df818608583e73d12366fcb1d685650d72ca4f533b928c0b4772ae645f0b0ad71bb8313a601723b8f90ffcc53dfcda9d092f8931ef168ca2f53d4600677833b9443fdc05db07f80c03bcf6e364fd4d85c89fab6a08cc9399b10afcb908cc4b6b6a3f6a4725bcf8de94e6515345e333a8324765ca69ddf9c61539d36c67e91ced0396ab2adc022ae9fa8e41d5a00168cd8c9ad0291f653af63e67b90ff2d448fdbb058702c551d323f5916ed90f6b87e354944e167887c5ea4b37703c8b0a94edf20d188ea989999deafe0a6de995434275b18d17a33b100032f2796749a385d972542dbc9989311068e84f3629bbb797f7c6f1057d99185009b5ac0d43d7b944b2e5f528cdb26ca14d995671e72eb725bf2de60289da1f06d78b137a79ebfb75425446c20b4310700053cf3ad58ce01cfb4d97325a27e5b5eda3cfe1009cdd186313ec3d16f005be47c8f38051cf2108b85ec43aa0d527b8d3bdae4e0a7a711c6fa69998bc26a9a8d2f7433f24f79c0dfc74a56083b42de7860b22c45f0c6e31422080c7a21c8d672fba60ce7652a90a3134f54594eb0fafe5a953e4f179ab06ea6b9795bc31a4f6a7f18bd5f1800a5263c48da4ad48ceca613fadea7741dff9d90f6400aa31519bef0b01e3312a5042ac35362df5e61c8e04eb52bf5bce0505ea7233b516321a08185fbdb9ff8434b4c6a88f880f594d100f46924a26f468c754d6af07f4868cbd7aff2caa53e5146df4afde9f7753484fa8be36baf89ebd4741b7260ff1ea398d59e503f5fd6c5c543ae1d318dc1894a48025c76e872fdc3026bf33a91b4618d1618554393eef6f7816b7de65c4bfbb55353cef9a53ad35340049ec65ad5af27db6fa597eae6499a3e5a192ed731915f6ffac811e35555ba5ffcb6628f812bf71a268620c161fe2a571921f5bceb4d0cdca776c7e52f68140845f455d247cad416c4de040bc37f5421e2b8bd6a049db84f0b3c807c3bb9d47cc7ac3ae9599ce82cebce8243306c0f3de6af1526475387c76751b7412a227571450599120570cf3cda19264136e0a93b4d25a160dee03d3d812dbf172618f58d09645becacb5c287b3b01ce4d1121272747648c50112c44728f66d86bd421390f2b36ed7e18b09a985a306ec52f240c0bc0957335483439f146b6c340f7e062a6059b1d47750c11cda575f8a2aea78ee09af0e06dbc2b2ac2b2bbef17fa108681dc90a7b970306522e521aa987e3ab6dfe2e1b3c6d9fa68897efc9e998afe55620cdbe9ddbbac8a0e22395d5628a +result: pass +shared_secret: 6e63c5ca8af98628c02c8f1d520615a1a2c4824d5d155a6e51d181e8eb44c7fa + +# Rho leads to a matrix with unusally large entries +private_key: c5f6c739c640b093956cfb9d54272b3c704d3b364ff1c68510b875c8c29f30051b5f60b53f6341082252746b8d4eb52b3f77c818d42ac776ad393072d458a28b186da2b61cf64bc6d8b424afb49a3b2528d4863c876aac69b7c7fa95314dd36ab5f021ba8c575ca458c469409b71b31f3a8e371937405067951c084b6a832ab321642c82f33395b0701e5a677c3c783a47d7a6e474af454c1b31b174ce5285e90608e1932493e44bf48b921d6a58b1b86ec2a38b8ba2a1fe884c0fd608af3986270391d1a42843637d75194722d31bc81b2b507ccc0fdb309e59549a874d09239bec5a41c4e9bb48d6968152ac9d431cc3b290371296b8056ed56898b272b948e556926478291cb0eb1bac50b6718e98b74a1777e685b7b6d7cd6b22bb5846c69149b4e7b292a4153763b768cd5a67b65c3d059464ccc123ac086f9f41c3395a56ff3152fe149d76ac2fee2079653326bdd82dd6f66b6687a7fbe00d9832b09135756c5819b1f66dc44c7b32c2496f63cf077ab51b8626d0918030134b8384c565f0715167b21fab697e84c6838a71176748f12334078c27dda3133bd44abd69bf631badb5f2664f2857c033102ce8284e4b2beb9095cbb40587bbbf457054f4d11bf938af207c1cdc5217b0e9797bf9ac88f3943873c8b66883d2ba5ec7e6696d50a69ba55457853bc526819f1a6fe09973fbd19832312b554653b8441e5eb01884e94a355732e3da645eb849f520bb2bb4327d560612852152f8cba2f77db8d21922da08e60bb9e3b39b9b85bbeb9b1715982d292b8f1017cd3e60447278cc0257898575a0eab1408122bb3fba17b62a31902a567a0821d42086aa6417c259a1dbc93b25003fcdec9f6a5507b4b732a43c444c5825a05119cd089fb2e569f70b4d5e6919faf15d6eea641f5a2875763f42b3991f7c89fe473cc057c148ac58b6c88dce537da8632c10ac851f8916fb7b6ce89ba5053b8d95d29ea5d36c91981042c4aa1330aa098a6ab256ade08592a05c95021606adea0ab637824214009c2b915be450a1f7434ea2c7f562a4fe21139c2652ca8785af3208f4927abae698dd435e90e7474556af9b907f6d73c4ee64897dc74c6a876eba1b598e784b8094232dc62bf1119ef764bd1a3bb2d4fc7de069273a223abe5269a1403873087906db164b58435ef41d7d78b36087062419123c8b1d54da918f34920d3302ddaa300797b32c1c81b82798e421ab2589964334714a75cc84548031d5810fd87890a1932c98bad37c860bb15663cc0e91880af1947b8a26be9183b648b714f763b81652786682c210301852776aa673a1fde470afb56eb0b0114895638c609d8d55585d68c165f7aad64c1406a165788c3364667f0a3c65aa300fc4585e959abbc5e1b316aa108a1cbf703965a74475147a2d323b7295d185571000e43b9120b76fb0105ee7a385965026e8f8309d4badef88b433a59090f88bc4eb4ee2f6c1f0d880057b477e628bc35b023a4c9ab682822556afeb32b6c9088e35c107e2a43506c43a986a0420f5164167519c4029b47bc81e93c1ec149e6083b13589bd2a9c64fc6247ec323b8cb73cb9f9ccfb8bcf25617a87a3c2d8b5158ac8661dfc789e92cc8cb39ba3237b6f13c80ef947630578d2d213f1914f94c61429bcaea77c646f1b99d35ac8009907ccf604c1211ddaeccc2f1001b49776df94560e5ac35e0a7ee3f39377e252d83558d6e57651b0b3c0365e6a133dbe3002270a0bfdc524e5d298b42c1408e17d155c82d69c256f78a69937843491153ec2117ac40370934d28783a69d0a02526afaa8600d289c27e9481cb737cdc4b9ddf53caf313b3c4b862b08045dc38428b126622d77ff3864fa93919427b049786042d234429e9858ce7b1d57a2fe92979851b9d4ca23fa7a80aa4738c9b777020b857b8fa2e442522423608d51b78c574569b9746e441bed403ac21391fe327818dc81355bcb2f5758320965e10946cda9a7c1d329f7c1720857c8751e57b87186e8dc21199e3b7ffc1c4c5607cc3c258a30163131c5db5d96e2e8c2f209419d5a03dfc618a53b1799cf102348b89ba289fab2b206f61688fd974023619fa5187b8cb28be778b666294bf029d7fa9abe3ea739f131930a13629bb6fa7221a788591f595911d3c8a6625a0452bab83196c047889f7eb13897b3d73db6ecf5c9687c3a97d5b3fca3071a29cb82902c7a4e673f56842129c4e27254d50c2a9741abedcd925a62796d9a98733262e45366a5d7b81cf7c9b3c42a6b2f70626d0adde9311239061dd893669404058da8d209ba6a6825e796c84e765b348414447246f57acad8c933dcaf752ef268bd6246f6b57377cf82607a522dd7028b572319263c9a9805aa6501ca4ec2a182a25cb751ad6f0a0a23955986155e0a1b0957bb9afb35320da2b20e29210b2605122791db13adb91a0fed0b36bca7d6f03b0ca6c8597b56a189c10ee887b4429b0cda99d83728aa6f57a03d182685b2266ac1f70645b123c0ddf352520332fb5ea06e716b010f82c62858c0408446afb0ffe23ae9241be953b3d05a9087f8738143c3c66b5b3c61ba1240b99c2f50b620038d775706aa58cb0f7094d52c755b992e008c2419b3b4bd85a41f65bf633136867caf5872d551340f377c06546495b8882e4e14df8a958a501161c547146fa2132160fce98c830a5b42784cfec7410bfe87f185657a29508bf339c7871ab9de91423d23e90ca2bdddbacf7f4af0f616e9626a3ed4a87b9b900b2412b0b5328104479d33046f54a06cd88a3d0c9780af5807e3517e0c72d45b17106a136e68a49521364e8661636f250fb679d3fb649a0491d349a6bcb49a4e06552ec60b33f947e37fa11b6742ca9119f0c6953f8175deac4576292165f42110c99467b008f53e25308e560fc845df84b28eff321687c45d6d09d96533f1d0078af998a9db59cc51b1ed4ec6c13695fd33a768af521bc9c39bbf6c27c6266ba271e5d8cb89982077f553b1dfb5341b5caccb856a7608cfee57ad3dcbd782ababf70c4f825cbe1279b304c2cf134beb0268655951cd76079b06410737cc10550c16cb9848612b6b7652d4ca9bb5be64f08236b69a097cbd10014e561469b7a68723160d91632d67f4908622876a29c59682579b34a298cd01597887c1b4d100ea724ba3fc8960356b499825c5223585024a478d34561a98d0c23930473ad6da637666b454c7882f0a98254f41caee03e03067b3a001f303c651489c1d00a825537c2412826a73959f085c5d6a836836582d938b9d999b591019219c906f6712fdb52b13bb8708d0c570a00bc40f1168b80b9c11a4e72430943c2544e2bb910ca5c4f0b245f4bccf0f0c3a284757bc6c535c6a205b34cddc15abcd92dcee9717b413568b461e2b9035756a312414e2644422112b49a3a23eed98e07884c80a6291df38d5bb039df15b7d89b5021d691f1a165eab9242b34146f6b223195bff19c6c6197a5e424c59572502f69c7a8b633534786e4d8c1e280680361b8ab5657b74336d72571bcd12af7089d4a23c09a167d0a3bcc540b8be036b24664bdb3a13b62c11eee93c4ff5bc0bcd92f186741eaf56a5f6111f161b9158bae9691b8c99cbae21c9534da07d11930b96751e3c29a804195a18781e016b6af45bd23e8297759a1d1487c6212add88675cc3b92de46c09b4315c9a0cf6a5a20e7fa9ed5d594aa95cfa3681e42a3543429b9ec551e1e74ba46b79234b8c69c0b5f9553aa12455edd971ac29199c04a40d702128cb77f63d50f11184d2d0b66befa6adf7c2bed427c82a632a81497c3831e38256784802fb7195e40b571c26a925de84f6366b3d9aa2ecbe57ac61283f5ea3648b652f0c742b9d7c2a8c00ab5b611fd36458ec71f1c49579f96c1a774a3b4179ea63b4fd1e3b172b39eed1bbbf0d27aabd1befa0232440b336b53230bd60b88da4c116ac47b971de59a214a0752e75888172386ab2ba525ea50492a59467a57713985475108501cce687bca50b6c8840b03bf2a5072e8585f33625a9a8c17160fd7d630ba54c2dce9bc0ab2cae4965ddb9110ad612c65c8203e7b462ff86ba28abedb808f70818f022413ed5a9a3b0ba6aa24685fa91d5938a69693862e31aef5054af2f9849d3b1d22e121fec251c8f358a0d320efb9299df6194cf6cc5cf0c11363114abb8069e57634ba173ae199b080c1d935558c16696c97a5f316a4b8565c20b266802c60d4272e49c2a5ff794bbc914240f81317558a8cc862d9783630d90d99f6a68738219c44b9ad5c07b7242e85d71f2a958398e25047f494e7f6acfe339f98cc2d65c114a537b1259e000000000000000000000000000000000000000000000000000000db721a7dfb02556d4951dc5f3410ec6a5b8b78df5ec7b511533cae60713fb9dc2e8541047591efe1847559704339d0ddba611d0ff8017cdc84e61184715c93e2 +ciphertext: 841dcaa46434e75228b0bc10733771ae67fdcbef99433463b2aaf2da88a98e1bbc748e1d14239a3a91bd2b6752b83302265c58d36f176b15988a3cdcc0f65cd72eb5486913269eb31b42bd0ccec456b72ff18f3801a1ad44c3ae6eebfaca59f2ee8308bd6c4c05a7262a01f168662dd42153bcf885ca7e84adfbaf6429bfacfde0ba36426b17dec09cee0591eca54dce505b6f23d2b674fba0a9dffdf7e77ee007e7570b31c71723047c3e8a271d6876261fc1766e1e468bbaec2a42960c2f0a3ebb7dc5d5d6d75a24245a375d160bfafb01cfa2c08831b1ccc67bf9d05df3a14d8f4b170e145311a793a92b1d59602e45328e58c5842dfa6d7021e1c65a900e0b04a79b17edec62c5d1c2bb8679174b45da0cfa336f7a0973923b8812d7b2015e73c42e1219900cfc3cdc93824b55724acaff2158d38732c429883b4d461b74a858cd167ba9e47f8157834f2e758cfc1c8f0fc5e762d56ead723cac0759cfe5233473b9706be8d909c1bfb2cdecbe7eb15b74b181e8fb949aba6b82e2c7c1d40bfc43cdc758051d1ad428a43bc7708ea9b46ea3f202974abf44644c7614769c9fb39de6ba9fb3009cff125fae0ebf0ecf5c9dea4ef2b9a8f26fc5d27d875e068ce3d319f816000f1dd560d03cccf97c5485ce65a77a326ed0fb2ece5cd5a55661c7b41f4b08486770cdc510f03b2b85c73b95d0d77b0aa75f677682d0a383a6e69ece0d5bd62568f2f50dd64ce3cd9e51556043323729b165e4c6726dc77c78025faef0653e54c6474834b9e2b51c66bfc8fe90e6e48fa217add307120ee0c00e8ac8988e5765e66dd0dfd92c80a3b19eaefb46585f0078f5f2de0b9c83ee10996b27b7c64d0f7b4d3be78ae18030bcd792e83bbf99529d1e7917bc053846268ded779a622e83f5d2fcfb0c15bdb1a2621188037acb8999ccae846ab2664792b043903c3e6b59c2645ca44e2b19cb21122035f7f3b222bf382800df1d1d8926eada144f880ecc739bb5644986f0a3c1b7cabcf3c9cbc7938802274ba459c1b870ddc516b5ea871fa6bd87b8cc5e47541f1dab3b9fd63865bb514b85155c41780b6ae24a02a06804a319d3f8d81383e7c8167853f3e24b35e220c105dfe14c33441f928c6dcf63a606500539b602f3b3f547a49545fa43f3fa6bbbd6049d9769ae5ac0964d00d68409abac87369f9608f2d244935aefce11e009fdc9a94c4a803eff45f989affe68c4dabbb291de0e7251a82bd5e5d19bc165fafa25465066e23dd905dd456e0d02ec3cf229c330d404b5f214a37363bd997979fd171584a296cab6e37928940f6bde0d1ed593903d86524449ad42248572680f1b573ede4ae27237e56755485657a5f542577700680308cea4a0d249e48138743017078e668e9ee556c7ef5a83cca9f96ca22beb7e30e2df1a793c6e2f402f109770ce7763eeb057f65bc0fec1fde8ccbeef1441dc98d059d1589564debb2a993ce21031c67d4d8c61ec53160be67aee11ff4b901bfd7c91f6e1faf7aa525aa8d15c3212ebdf0e3a5adc57690d446fcc9435caa5b1ed174b96d4da42851545ce1764bcae48c5fa580802eec2d1b83e4307c1da0dbb2a0fa414d2db8d6335f898fec5e391d0d7c2098e35dcd68afa8adc29d5eee9a9cc6a517ed310897e69eb23ce83e5ef0535c0f64d4f8d62a962e8af80f47a7f76cf735ae4ab09db0b806a9c4b2fa9ee493d69e73af045e6a1eb07b5bbd3241ccce8b5196080c2953cbc50a2052126ad754dc971050150d7ad4b319fd85cec8c4be05b55ddcd5ec7e804083278495b1601792464202969dbe01488f876d1655e0a3f4879ba41712c9136ba0f99d4bbf3145f34bd6f4edad036e6db0ba2532e35c6c097820d1fb069f9d69c259fb17b94970f2cc8284e5fd80f4e6070b4389bcb49ca99f207d002e44f6f0c9046fd89c0ddb1d86b01007c02920acafdf28e49d3c209e3bca054b67398b6c6c2561004c129947d87d33390d28489855074a6777dbf72816f0e1bf9488009bb0a247784c8a9b8f13a163d86a614edda8d205058071c12845b21e82ead309ede45872c379417c536ba446272ffb63d924d0055a92c320739d364e3eafcea6d10ee09a58a70c6c9a88550327070d6de72034b8140976856895147e2a1ab4ad062c7d299228a50b605872e3d20daea3e918f2dda9f8182aed61c93b4a47c5796478e182ba54c87fe +result: pass +shared_secret: d0ffac51bd8b7e6192ac5954b26a5c64f4d0ea746b08d9f73602062aa8aaf7cd + +# Rho leads to a matrix with unusally large entries +private_key: ea53a046a53b7e3298d588b38c403e67b5620c5c73a438ab7357660362ab3822b5e774a9dae973c83a96db79b550dc176f9b0182d37f12118bc96a4982249a352219a110704e4a0ddbe545e4f55cfc2c50d54cac33ecb6fcbb3ac2a7bd4e41282476797a3c24f4ac4f60c33da281cb1313035c9c804d755267894d867469dbfac7be52a34f55c0dc642354e52967b043a0e0167c806581b51519e04af675147578c79f492da3ac0748352c6e5c7ff462008cb42e9817155444b214c3b93ff3ae7d44b5c2b659627a833cc18ccfab4fe6d6513dfa67cec499cd7a0d052a5f9ba378bff75033e69ad053c04b74c8cd756c7cc0bd494129e069cfb4358324066415bc2a4d1cb8401867c9954aa8a33f929ca279696cd515bff0abcb6c8692aa9cc076861e2bf27ec360983f775e9f166964d0c43c380366f19d3f868a7e038752d30e389c0c057b6d93a9ae64746d5b3a146d31269b94c7a753412be68d09d820be6890e5db1ec3eab1acb14cee8a317ee7ba0eb6027f13a540b07c12cb1164bc7d295c16eef4c8d9773bd2d32ead764f58fa48abc2a5491bbe00e07965017ebf40c973343704112bc90849d219c70b028ff3769e720c4599098d172674358bcaa8947ba6b874e3d94e623122ffb3984a0b571632be1c540cc5da45ed1c57da1054abbc4456678249a2589544c3dfdb6330ab35416ca49c8046c9446150660b45e05b720722bf390e307445dd8a3e23253cbf633c8ccb098976a68e481ee86b86a32865d9caaf385842cdd071b0974e807710e2b44c598a4a36bb2af048b0fd30bb6c64a539513ed2a5a9c6cb16129cb88d6bc62389b4846a2a0afc532eeb0f055aa85ce7b43f8099cbf194e664c59e683e535ca809d40f72d4a3d5e287b5ca3880d4af1f1523b60c8f811a17b2881602ec0393d54988d63a1620a48ab25a5336b25ca25d5b21425ee54673062020f065693665c68399691748ed8c2b6ea47b89391e7dbcbb3e4bb8bc0972916aa0ee5b90292b23618c5e9a68bff8476fec1c7e382b1cddd45069263a507c44b97663a9c8b4bc690c89d25893c4caca0caa7633bc66f449bc06603fb747843b0a8ce11d46ca100b3243a8617904a2ae48db08ba24bacd5b946cc96b834491a246850c44a0f049bb3e099b3353b28c3889bd4520ce75749b745e65e6442d970e917362cafcc9cd1a6194d9ba41f29feab98320e10234c1b0fa367f7c3a420052a9ace9a0787bbc420832db814e8f86804fb74090146f899a624ee9739ed55c40b3716724b8a8164b8b976130d89e15dc24e2078f24a953b2781b7d36a12334356a6998870a0128ab5152a89ddc84aca3475f8cf849bd762ea7b23bd2d743a9d3a9a2c2ae4723b5c1a3b5349a2d4bd2907d89ab8fe80624838130697bb1d45f873a3416164f862630e96075fbc5192be26755eaa1f33026a1f201a05b6b57ccc83fe9c191b13016a921532c4558b44ff0a26c864c3102ca921c299b38199f7162938387c3598362e5f616756bb5aad68c68e0a34ce96684597712341f391ca6696538582ab0dbd532c7757b5b24b0413145395123f0c4668cd538782b0f65ecc30b687efa78183de47f53b73831210c513c54febca584a4780ea352e9dc85393457e71ca62e85abb2322aa45c4fb3d29b15d55a027b8a74186000b9a05550b2a343a3ac21b0f7a2b2aaf736a1ca49df5b61fa749266b0696ad7b6c48b0dc82803b10a4b64d6caebb33a13c60effd699ad44c1985c9e3f8ab21a0cbd728ab52e07c4bc5ab3f6c698ea307f435bb7b5545c44758fee3b9077b5a318c2b584012cc9b57560236be789bc4b026d1f26a857365b2d1a6e809a9f71e140ec56c4db3829b74539a90345841483daf6840141100c66cbe057261fc346ab8c36b03cc2b2ac838835cd373836bca05d9f57ce2231980ea1bd9908111e79b602572ab37495e9f6025269713f4318dc472d06b473268bcc7c5cb956b5a1ebf419aa18b9d6f184849240470607fdf6325ed561c270b095079734fb61e04c531be893c2621c5ba48bc897868126b995e75777c8ceb100c67556484b71404be802ded5299cc41a83b0c7a99c8d36d55f7fdb4697c446904c2420d667f5e58e0837778ea960bb6605890b8437f24f7d35acbccc41acfcbf2e35270ab36804db6353d04f4a88b97b6aa5a6a42a101a535da323cae6c7dd757de67c24fc0c1dd894ba24c26c873172bf2c1ce63c56cb98189d60587cd76c2ff70cbea93a0d0767ff347a071333986226a8812677e2b5e18a15fc5b2d23bc03786b2faf8a9d2705bcb6276d2c140509f67a123a34a98bc879386b5a596b4fe77f0caa5145d766e05834658961a4aa3d5a90bf9da5a53ddac964e62216d0a6e39934f00c6ab988cfe6334a69480bfecbc7b100b621d471ab51725008a21f404142e489cc30cb1aec8dbf99038c8989ae8c477c198cefba1f3420951b660026c820fb406d19fb0878677cbb852bf5978d99d33f6fd7c3aad87585e68e5dd5a444a8369749ac03902b91000c0d986b26029005ac6daab8b0888a75b75bb667469525a70278945e2847cfcf242b420a10af98cdcab58417400b9d58b68f3670aec0ade93996a8e16d63337444d0b7de449f3ee63b30aabc9ac2b77d5bb13d672ce9db86770b9c21e11ca3f42c2117654c657da94c451c319e1139088d008179707eccd6a47d68677c692c9bc7790a6311dfc244d1c67eeb3420109404a86ba668e24c09b6308f3b09e546cb20db4117c74b4124946735ae70ec8147bb2e24784c3b4a24eec5ba8de3269054399a623f0050b5d0c10b5f5139b0786353504216850c85677bb596b2ac6a5fd4c224bf61ced0fb031411a887066d7a5455afeb8309058485386a023b6c58b5b967557a5b291698d488a131826b958df717caf472118d96a3b6882c1e95240909886895a0f5946aad1c690b7a904121688f5685ae775738307786c5a6915baee72b3d71103a96860afd696bc70b880c019e6dc77c38e33817db195ffc2f7cc37b4a6450a2e787d2e65c55748be376af57251974ccbd8b398858971eb5ac62f7156e9f2b43d6c54a51c40c55156971804e21869933771b3ef64d16e48ec5195018425d32b56dcce1844f33600bf366b9237f6ba451fef0816d17a00542433dd7312c474f2c1abe2e3a1a12b303f9d42891b12954473f6eb41ce2014bc083732e7a4a7808831ae478bf2865934437d4874b6e5132ee99c727798aac4b99c7494fb555a594d21bc99a014001b7d06612c2b3a8c7170e99e037a2d50f33e61156c519a1a15dc78a60afd1c2c159375ed570878c319db912c1745b90321ddaa48bfb80411197b2fa146315bcaeb292714ab7576d946b3927a280319395dcc4a0c431692c7848d10a36dbaf5d78af33f62c25e5c4fb009be83a5b93e054e587393c48ac1c65a524a0cb4e6637fdd90e43346fc9a45a720898d05b4d3743a0e2e40f4cc77237e8913ac0557db49eadd7cf00c3695379b06602c332f57da6409b3b888e7c06898fc4412444c677482003c73fdf07ba45ec968591c3445b14053a8077e664b9964956fba6faa50d680352a4c8378d208940722bda766910403970e3b50d863d28400512d7adfb372052f1cfd3b24ff4e46695533449dc232a14604a08b00da1ad81e31232412e72d180826b968513a2dcc724085a3ff0d5c3a7361f861a3e02b0308b897ed9d35b14a4159cf646336ab8c0e273a6915a14297abd937afeaa3f62005a001417d91699e4166740764cee25b91fc2c44753a3bcc2a8144174cea18546fc513028018aca8cff714d6eea7515db543a192d8695b1923642228394dfb428cf167201bcbd1e217ed1e2391c616db739b09c9a0996c5bab53bb5e1bb3aa547937dfc49223897034bcfedd55599e15641bbcd1b0072e11ca24ce7a828776fd0c94bce2738eaf13075aa7340d51b30fa0caf857f1c5b7808048917e7490ab0739147b7cf229953a633f080ac80c495f5b03355bcca47a94b60e95d72a29147f2b677c6a106f905f5349933b0b7600358fb009bace2c229246aaa51a95842cee212c11a205711125c4ea14d68a833c2892e8bd265bfab3e7b16cc2d34adeac46aa6e92598d45d972577fd76a9a7b954ad1bba6ed63132a375aa29b9eaa42366e2aa8da0374a19b16389a1b36c025168584a91a4328071de904ff9162a06a8bb9b9030f4571b1166133bd11f9fb9a2214c3f838a0a6106359e778fa7f504c6e719ed9c2ac66479eb1b662c8571d7e398f80941bf2ca0b8791bfb51693fa95894f25f2ba53882e450eaeb0b3ca706a936bf22f6056588144c1c3219f0eab96c000000000000000000000000000000000000000000000000000000209ba491e8a9350c68a6cb643fe16e7cea65ea4cd099b14c90e7a0f627f502f45ea63afb095b03165e6f3b9488778fdd771036713df7b893ab8777554eb05f64 +ciphertext: 8106cd6746bff4925c2620882d571c50b36b066a5ea43fa6528351d97dda7dff1d9e9ee6ddc640ddb88851844c388727c918152c41c814be39f274183e116432a61f9a7c1885f07bf118e4ba631598fa9b1e01e72a68ec43dba62235587c9b9dd1c8e806174ad612a2ffd477e8d0edc2ebaf4036393283b55144b9c83cbb31d1674565abf29a56980dc4a3803a389a20dbf78c78a907a5d651649c27c9771ef436c189d1922564397f5b5594d7efa951ba7d05962df80c49c1f73029c3d7899852d8a1fe03d1245a228028cf713f4403abc64a9093d782cd1a6dfe12a79098e07f40904ad146dbbdfa919058149b051bea097a60aa0373cf9c0803e8da99c03a6b83813f99adea8c87e6da09013947cbbbde8edc3b7ca29f3180882cb11bec706f4048a20c5938560ea83380be5cd75f48d77bf3360fc131509317dd72b9340bab91fc6bf7ce099bfa58d6c5a413fd2801a15ce7ac6f6f2c0447cba39987a37695468cd0fdc982631d9b0354205194323e74d41c54e0a026c4e67467b5595aae7c8346d1bc5538ad0acdd56fcda32f95dd7830b65b2d98c05355a3ad9c84cb43c23ef9845250888ecb6f992da17f769a13bb7bfd621571f98b42a9aaf19d0626d7d59355d9730371b29a3868b97afd7013142866e0b2f1c54841de47c47775940c58475c96a4881bc69c6de346e05f55cab15d497392fbefd2309a834c733eb3ec8df4ae65ccaf690af492e39d0b5c91d09b39966b31b47ddf6751b481966f19758dbbc373debf284640015cb197e53120e0a36ab02203e0992f35b4c8347021f8c4663c996597a466b416cf271e04a20045639635b904b63250817c29451dd2ada5f3011500f705c2f0982d236ee1cd02944e35cfc6704f0e8fa30d8d2d595340b4245d3f3d5246d368062b53f06ad365dbf12c0fe7f492690fbf3389d234e76a618e63f785af41b2f4af70be0bf0a917df6a5f34683d931604c6df9288cb9e38b8d8396ab2e21a1c9a54f4dca2a4985c3c4aaf20af5e6fdd126860df422a894dff4a857f2a8aa54c4bebb70d44a4ad15d47497be7e0b7487003ecd6f92cec84bf4c459eb5f480dc20bb6db735cfaade1ce33782aaffa6a39e4f2ce9e7df44347b91d75bbe71b824d6302608dedab325d00163cb9e0a274ce49717bd6ddf4b9c02fb6986a8f765ed565f48c10dc90f39b93aba1a69a832e41f2b0dc2113fee500c99471ab67e3ab5a1cccc0f92273739eae4747de461ca3ce6161b558577b56af9e695a978970473dc671efcddda2bbd8d15fa6eb8ec0ec9f479bd9b8d3dd4865460846733856fd57664760bbd5ed354696ce6c8b44c6ebbcb07920cb6c3cf769c005503add472c7374b8875d714d25c74e2d4390ea455e00208763f56e475b630a30875bafc70f87f541bfd0a28839d441ce567db3be7a20e2773f08ae73f9686b95623fcfa7b1b3052d64448756f9a7481b1d9c6022898e79afd4c2290a9ed2e0658c6178826ce94e0ab460798a88cc54558c51239bbcc5347d59ac87fb6580f84aae6492e1ca700093438889fd50eb7028153e8b4675fd272667fa022b17029808b88df427ac048d8b410f60a56ac39220f8b509ca93c34c7dd62934f62a7e29aa3b0918299fd5c56b3c3158775a3b3d5c78aaf2f656257fdaaaa5b7daf83294b5fc48d08922ea6f5487d647c30b1c11a30d2b1690958fd90107a0d6cc689441a36d04039bea83c447e79b04bdbcbab04427949855aa1a32790075438ca6ae6f7897581b4489ea1dbc4c025fa1ebe698959a8145e8f11aa1cb6f742d1be789cba73fdea457eb0abf1e814c931922f451a7d59514c3e2526b1378be1ba8ce317ec3fe2e3d983edb346874f5251d197ea02c7b16fef2b7ba8cd3b0179b1f935d4aa4d463bda2d5dadd6ba96c0ad630f1eff86e34dee3f2eafb9cc5f5ed13dac2149a583e2af8db3a789c39f751e645acb58743646c6f65bb12564b8f26697e80b8d9636b0833d71433a0465dd501eb313158275608390568c7130ae5f998d3819ad7f3855d26ddc9f4ec07a36d191450dd6502a28665eaf8235a3f10b90aba654c70974038cdc9b3335d9b865da8a07be70d53f6a5edc7c4a5f4b5220c8e7fc01f5740360db072a4f8d7e80246dced5c75ad642ef1b41841f43e6e422f4f9131c1b3f505197f18571b057ed1cf2dab2f37dcb88082f8d8291d13eb7abdbb14 +result: pass +shared_secret: ab923efab9857dba5a68f9198c4318f54a42aec38d194133eb7f5dc172478e79 + +# Rho leads to a matrix with unusally large entries +private_key: a7d40e120206cecb9458a1464b96c447db086780708c7435e40bafe1ab8cf26caced91b888711b8b95414e080c2be24d7a622c2e0410fb9c795a25a50554abe8b9049f9890e29531cca88e4284a5bcec559f939061b003510c8a23991cf474ba6676b0599c86dcc0976f3b61cb624954d3914bf28e109193ef1b9efdacace8574dceda34905485e1a79d51c8ba06722150d8a243d69f671c18b1c2a77c990699b72ef5b1c4aaa121a8e5a6cc971178127024166f2593893bf3b9e0db273040b0821051cab28af5196b8937538a680b39251b08051502c2a3d5504f78b767dce91e2116280c3532e9426b93d8cae3e9abc5aa4832c6bfb02a71559bb689f82c22835fb314a5e6d44bc4085eb39ab41555103033a0f4b6aabfc5246c93c07840254989301f88776c06c9f808369e18445058b4d940783d57b7d7901b0d63a6e6512b31a63ce0704028d936462c18eb4bb78accc3dc56884d9837d8632a258c4e998cc536248aacc62f7b9b65191a28a27a1cf44a0d512875ad5112e034c0adbcc67edb84eb000bf3621e7c1c5cad1cbd06f848c5d8c3601b07463b5c0e33cd260a2ec99a972c47cda74229f6292221391f37d20903aa76eb6966195acac6373a41db78b8f7515a473ba04397c2e94a26a6acd8f2cccdc572d4b60e56880fd0295152e18bc79699feb1a0b6f6c7ee19545f4124eeda5755a85d79fc2dddd2848216576e9ab4d07b7ecf77a74937cc1605602c62003dd5abaf601b55ab0cdb37bb3110290f829a742c5607ab24a50000f3191f435427b5345ef884b91811bc44fc4c6de32bdb0a73edf80c8783a5a6b6a2d06657b16104cd62ad847206ec1b87729260e91b2afde6b0f13a87025c10bafa88e1fb1a66b98a5308a2c4f10874324179a2729df786627271ac5a945072beadf878035169c543c0b07acc49241b7feb406f524b71c787ed757a3d48c233bb75d97c42e03b9973cc680169520e400b00879cf2bc9119325586719f22e1b2de163184b2c43735b2c1a8654c92138b90c458421f681136e0d6c417b20a5f8c126d3672a4073942855b127a87ce96c7e34861923b3ea9bc9f0aa277746927f0777814862b0845c3bdc12309241f387cc6f4ba4a9688b947ec8b5603ce88ccac5c35756d0031ab4a5e32f6ca97184df2acb38f724fee64a6a688c69f6b913576af98ea2487db097d7c81dbc2a29a381b2345495160c348e8207e313929dc08412304f6a01c90f6889e23b7974bbd6f081f52dba8baa716b53769e6f71b962156cd44a3f50563efb3b65741aa26e42a3720ce737c7a7ad5c875663bfe36bde03b106647ba1ef098569bc10a0940cd300d58571dd354ca5ef714733bafa4308b3c4b7528862664a8656d16c9c3837355e39072db20af20025306390ef32931e793e33333cfd893c6227215027ab7ba9cc0212ebc749abbc62be483b3e2406a5ca10d7fc534166646473c27979053928aa5445c4c1c26cde40777aca39f5a64161c322135fa176d44b694341a0d3a05de662ef0e1aced53c4ea2762c1333da3f987fac65ea63a17b55c3f681c568d648966eccd095928f2e32af2fcb0674ba3a50350e282c99af149ab1b3f52d3b9f838b1aa8cc5dc9ba816e19d8a177de33a855960b7c464cfd51a7279a48c80091ec357b9fd118e12f00736036fa8268079754a4d565773f2a5d5c913109a4606a276d07372eb96474c7722d85a17a50a956b3ca8132415b2c404a0288aadb44fbb00217c0005ee36137768c3d4169d300ab2876c1b2a92c0cf119fef5018bf7acfd2031929b9671898c64388898fb74a483a100ce2ae67275e53b00d94c2888f831a286631450308aea2580fc5cdbae53b7108a9d3cba88a437a5c0917dfa3bd7fb2266f2b2f57f52724b67e58cc2781a95191f60a34d74199102b5fe941874a4433034ae6c9aff9e2bf16f01781d72424508835e3a587903eefeb0b0d218e11183cc7293c81c09cb5fc4eaba4cdf22284206b23b87566da704665527c6c587aa3070b01e79094747a87ebb2b9e5296a2405528c224ef45ee6fcaf0c537fa2e2479d579d71a3400793188d895323f274077416f94c4e68811ad9c73598d7ccd53bcd18f8b1cca8bb5591298132258f4210d36722217c2fc5925330d03d1c037cc7d520f52b7761e61727c66c5cdab43ea53041e25b36b56a323a12f70c99eea25fb4d387c1aa2d871244021a45ab27a0709583e0c8652db31167da21ca46b84002ab009a8659656876a037e844b6c027545cc66d783713a79b1bb5021e7a2c5deaa900e595503cb1bfc394cf65707c78a97ee522be49c2c08de89336b4b50270ce189bc81fb6a464a853262791c748714aea70e79a6967e62566492157b4bff737804b014c69f41eedeb07e47cac957b4ca937cf4c907189606a9187c700a7b6756c5694b285ea6171625038f1c729a7897e5cf853aae66104fa1e6c66b86b643b1e37838f85bea35132a4176afefb2e6254433af76d5eb455b11a0624fcb63f7310b0c9b171d62134fcc361c2a58b12b2c53530fb658b83107e76006e43ca74d9093fe0ec4127f5866c306b791b5d033cc834652e6ba485efc76b5289304b3c774e88ce0173012e0203eda7a71eea170517114ef93f739501c6f9c9a4d56b77494f82c06753a996f33721a56a003167bc773c44d685a2aa45b61744058a1a097a14299d7a5257e27f8efa796776249878854f458d7e4b70db914e888567e5aa9cf238ac4187bd783570daa77c3a9854c11c80bee12374267da446cb1a3b5177c112a3945a92596093f77c3ea9bc2f95452b89879bb6c0028b653cb6c804d2680da39cb99233067c7b9124a27c4c6558a641718588709ac86d5c57ac7a1f1aac68c9c027cd2c0433a139f17b2972a5a81fc8763ad92391e818a8b77c43fa7e71930ab5934d58301c723825f9079ee9ebcc8096a1c4eaabfb5b73f070b43c3112af289c09d908fb8a2ab48786db29c2dfa82a16c6c8a8b34f83583a6fe3a630b639631742adc422a71798974727e2a80b139872df5420c60954a453633bb99dd40098be6952930cb35cda52a33c4728eb31fc7048ee5176ce947b194885395163af5aa5f2f53fe8c9246bf6143d199d2a797dd62b0fe67042fd455acebaaab2bb61ff778ffdac5edaf8778879c5517911a468a583286bb4d11a7f852ce921cec823647226c96110063d02a2708364e585c5ddb3914a27123a8c6ac89c6f98260009f172f644b10a27201a73812de28eb9f04cd0e4a19080001d082189b7b85c788e02324b2f4b07dcd4aa298b44b0f49efca0b9c0811b57729ec7ab7f0a6a7bd14c220394a2609832a26b3b8c29139af994a5c96bdcf13d8fe21c225b5e5f5aa2e0c7a21ec3a8017c885ab5a694aaad999c6ed14b77dba90fc666c0ef88336d79b3093719df8179e25bb59301a67548cf74122954e34fc5e94fc70b931a3669314605d609cf06f25f74f76fddc056cfa4654094b724636f49fbc3964a5ccd79580cc8a15eb07eb4061d528a32de192413d388b051660d43507c49720ec67ae41461b5ac87cbf91dcf42af4d38680f450acb9c6cec903807153b71613f02900117ccaa11e2cbd2885187a49089b63c3f1106fd5a3070a38b25c9757bb9b40c80c6fc4611334c4463e1aca784af6bc38584a72ca4db482361314fa1b18da660f440ab6c9167a4c18afe6395cbdc5320fca49aea990e12ad6863a0725863dc1009de81abf3d56ed4c70258096f6647cd3c5b1033512a742984af1a08617aa63e1b754ec93e77eb1f379532cebb7d4421a58bd133b9ec264ffb252bb8b546961e2f602aa45c5c20756f51c0ac29983ed95036758b05f6d90aaadc464e914004ea81eb74162d8a1e4bf986120c1e9d13cebc774677577f86c10addfba2b9486f9123458fb20e73c32c8a36a60f457074ba640309a7c9b744413a5622f43ef3785da0b77739e00f1268b50e04056b0c2071f8ab5451cc0d2861310806a4f180867310b03c0fd0d9781b3315c0da53d30b5a84f27962326084b4cf8e88a2087b420a9299c34a517c088e12ab2f54f35bc4542b85d455f6e9307c949cfd617dee8153a46c99fdaa1c00795296e9816e557369e34bb25b1555199dbe0a089cf83cfe019e5d013c6507294ce27e51ca5e805b894c13655ae6a0f9da6051706d46dacc69ec3898fc58ddd5c75e82345fd8137cb606a7707b4d3bb801f77b615527705399c8448f95d3c292662957e48bae0004acb52e55385f0cac2a9c76c471e2654968113c98be84c89e0a49040ef23751521558e677e32089a6969beb0897f74a52aefa2a087c454ef26efd08a555d6000000000000000000000000000000000000000000000000000000d2c662773707380b77713c51b59f8f1c67e6541a410027312c5dea82f0ba5c1f8bac5e523fc2f73973b46b1727891a6077329e10e94acd027c9dfa38ef4e21e4 +ciphertext: c60d4aa71649960bedcfd1ba225807739b82f912425f50d32153167826926e51f8ed961b5439fcc7a3804d55ff46d5b873e13a0c8ee7606fbb21c5e121fb8e60377ec46ead034bea9c44a685e7a588875e5bc2dff98e5529cff460ef5fd1ede8d4cf2b02e9a537887028150d0d79ee6a0ef2f0d5507c42ad1d788a75899d0b7243f7179af88cd6b7fa41849f1f49f782eb0bb727a9b0fd51ebe3f05ae80fe7259aac42c8b0a70b7b74da297c03dc1f06c44edf72773958e5a0d38aa91c35e71b27155e875f3378ad6a2d064d6d7cd56689b1a42dc4a26ce2cfc8012e147940980403bb6bc164f3a0f9055867efd0bdd3ff4c36ad8165aaba00c8365d217d4bf208312f3ce9fbd7bde30d6e4d3f1a98b0a20f947d03b45f3a25ad481fd1dc271a0cafdcc04f02d314ce3da2e1aeb00c7d3a88ea3ea2783b75e16768f0aa122db015492b0ac9bab3d3f85fe6d8e32cfd66fab8e3138402f690bfd3a5fcf09ca27cfaffca96181b8a906a67d93303069ff91c2e3e6cb26c5608bb04e05ddeab18ad3ff916bded7e9e27c99492b7525f95e02833ae827c48b1f4ef06b77633a66ef85520768b64641c5b1b3bf319c390006a026b3a77331c530aa5a86d0e329d4c7bd729992e3c574876ad9a29d79b09018e850e2e63d51f75861af33e6acbdabb722d41312294a9b302aba8e3f04ab1f04688e373f86e3753d84070bda2feabf6b94617cccae0fd427f90f43d3b686fd772292fe1c93f355fffd2683eb8dbdf171b69bb6a5c929b7109744f542a21539e04151ac7e46f5d4b8b151981d4860a366d3500c3422a2bb5c24fced0221e1b84b9e5b587e9bcb87220dd92c127be67a396ac18cfd3470e715ebd320fa07097122f696ff81923e4c2d3c0310bb8b70690dabee4e17efe6d871b32eeaeebb448f7d65fd60e7a3f32cd07e61948be330179dfdab4d748d01694d64edabfa95647a21ceafd5261cca24a0548a135ca1f7c262952bee7a291857062d3546dea97cd745050121c82a73ec9c0095847e0563229ec36046ee1564ef3747b49812eb2bd015025f077b56d63500bfe523689a6be7b886fd8aebbff18cfb6e4ca18c2d0dcbdcff8fb7a9e852f81ffb39245abc6ebb9f58a28beb15942cfd5f797dc867f7a855a3e6ecbdd9a8123ecdc30c7240d44dffcbdca05bb17d524a791ea32d60c65dcb6ae3ae3b724ae7da36b88d3563a63f4c059fc83c97ad79602cd7701749f92c02bd65f505f407b64ab3f8417d3de5631804eeae565af62d7fbf95bfe25126aa2494368bab7afabc23825d6cb03151222bec05b09a3fabd5937b7a0ff17246564e163d049e0724456576f250045d13d99aa07a5f298cd76ac73f69c3547ec9a344998dea3448a96480ece462922f76f1fab68d030796bcf570298013001414ee238a8ac4d7047514ebd5c3e55e051846403acbd3d7a581c1d53084eef20edce56c2f50443440ad0fc77a955c1e5c4d610cb45f43435b1a66bcec638ce88126ad88bd1b0d10cc5aa23789d5c8f4d9c63cf796e1ee6f7fb309855f332a648c731775edbcb4968592f1f633a3fc74bc5fbfe9c0e74d8379fc56f869e63d8db3b9ffa92e9b470e668e10acc1c7606839f2ec0abd02629007e3b1300e558e5afd136f949eb1e6ae56b5a8c21d15ec4b62b22af89618501c1af9992a3f002242288fe01140e2476ff900afe32685afac7baee893bcfaa54c1bcae65b2c9db04b1e17dec3821145daa041150f3282a500ca46c535ee47ec02b1a1639713354bc4ff7217ec169a63bbf26a26b2c712b02c76b56a8ed0535e3ee1c3f118f2a68f9c699ed8702f3eb30328118922b15b8399a3fca410dae21e7d762e6e45c8de7ff023a75211e42d1acf1d8f506223cb281fb9615b2de1848ad674236e768a0f315041daab6f491195453081535f9235f6d215e5750226ae7eef4df26469cea1d0541e7932ad917fb360f4a9d5601126b1c76bdd1696e6d59749635b844c9d416a12d0eff4c4a9e7f40860b047ffad7bce7439ef0fef50cccbdcc848b02f66bf67f2d3cd795242896c5f2cff82864b1d1f00974c9142d0b0ef2a8d00289238e822d352a924c689ab15e6e5b201ee7ebca1253b9964a04efb4d7af21c6ecdc03365b4275d72502523d562209a316a88163ca33ea279702309f8c2373514d459a5298ce6999571072852d996fa8421fa594069645f034d3 +result: pass +shared_secret: a6ac9ae3077504c8a7b1e5558a0fb1e7d60cd2bc3e59d615e68d5165e4903d07 + +# Rho leads to a matrix with unusally large entries +private_key: 610c36a286cca4815c657bc2f28b854aa8602890bd6ec2700d64b495b50d049c5963b8294752942d11c1d0182ba6704e54c003b828bc58b6ca3ee0823607c3c00bd0471b4df571c51db3003e4cbe6166c0caeb747f79573f5b8b80d12ca78bc1d3e01a318bac91fc863198afb70cb9256a330faa06639caa7ffcc1248b367bb6b0bd905ab0098b79b85ac5dc083ed43ed8b248dbb72e5ad962b3201c92b132b2961d9867b48208896c11afdd929be2792839674b18e4c1e99a7df714ab7ecb58570281ca80a92f148bc492797564682b560f1bfa42b2f7734047cfd6375d3dc05846da1d3511cb3c8221d38226f29ca52b07471a41764f86ac3418a96aab70fc8454d6823f8b7c6211d216d08c67eec474a3cbad8f3587e22670ae5a9938651f3b48011341b6140ba393621accdc3f606b080579197c48967f1c8d11026d8f90b0697869ea49cb9db086ef687227b2549ac689b564326a2280d8384698185afb25941ba0365b0c1939148ed6e1bf0ef5c764832178d47a01c3573aa268e168b740194a9b36ac2580a7bbe1625900befef3adc6fcb356100ddeac4393d388fe647c3d623d1e6a56a96073bec59f5fa39581245e31aa33cfb865bbc28e9f2498bad34a5bc65c517bb8cae19b6d1864fd7a0c48aabc78d0373a84c168f33ff13a9586aa349a185e3528003e804c8cacbccf0073da46567f7c3ee6a55eba856851234b4f3725e1bb3609e50cd4c9c96ff947c4b048dd7c64b3498d23c234e9bc45230b8b0c797946d0980dfc7bbc5773620b8330262ab6247fca5684c9fb8c2e692c3f654099a7a93d0aae62d24eb594544a81431f295bbca7b15dab7bcf728e3dc61f6354a459a120c371030f3b622569a78762b1cb08248a455e0f0847e1531d194acb0507bb53e9c0e13c8b2f45ab06362be3d9bb58ab6d90825a15211f81f4987000cf74355a28ba08443b3fd9d26b70039955773f9f840207f696d0e7a4989c4b38cb23df626e53b7ccf7c1bd96bc3f68c20ba180a482799d2cf975e0a39d5fe863df954665509b3eb63c257b8c9e39050bc4a739468e716cc289a79053453a28906d003535536439d418736a95763ae222c8870b66f1b5a9978c29d238658a3e773063dab55125e851983706c3ec68d7fb1d595b55292885f758a8df752fd3d97a8dfc33a228c896a44bc039ce1a2069810b1304d44522b1a5e43756cb843b5ef515d89c310f442f585259e5d460dcd578cc51ab49e63a7cdc2566d77e6959a7d24150cf0b413d335efa65385ae13b482b9b4db4ad2518b71704098d7481d2233e2ab201dcb4a1b3604149710de3cb247f29ce8ccb2ec062b014708f397482dae5936bec37663c849c9baa9d3cc88146b88cf970e574694af03fb78205e205435221b32e5513989047e62775f1ba5aa89a10c9d35cb566328eaa5748e9c5057446f96cc691d80208940cfea984df8817d4507aff0a0a96b8c6729329775c8d75935d7624cc0a06ab7a950f2b73ce4d90239706403c0651dda56544ea59bb06a99f00bd698a8c3f127fb4a3759317a05ac244a07342f9a47257e5649dec2c7050188ea669a97c137f707f4e5b4c57945f82c1b0b2040476d73acb54724cba00dfa8bb9d8c58e33260020a33fc04021baba0f6375ddee4a6023846a2dc73eb69758edc915ab2446b1c59fed89bbb86a9be2242c117cb719274873c8b0a2857e4076b3a792965011675c23deb8bc0cf7b2e3ee38493461f8a2068bcd899f1822dfbe8444a612f9fbacbf87a0d45f98a541c5141b230be12763a3563f5d47e369b65c10254e5f63934a05c8ab3409d7b4207dc423d537abd4404a9ec6afb1cbb529619bee740a4c71efc952b3b871043c24c0c919f74f508bc23a9c1ea8b76ac449e28379af42bb6140d376c9a4ec76b34042c7d711efb559c8c87170662788b4cc907e4882d4332d90c43175cc56eb943d589a30a5ac1ae312aeb8432a1d7b2f7448fe0f48ad069989e908d28616530246f8e817aecf6ae638acd7030a596d5be06964eeada35f6175bc0d20c26636943f1609eba3b8852531f083a576231c9b222a9f96ab1fb79aa0149155881fae91adf26c4f1e463f6f603511311351c6c1d1832f482306d66a4a2e585b7e223bd539fc45c5b29558e3110cc268356edf4bd6328240b1a7286c71c5cc17284fb5058410381c74456c1ae3ad93735b6c7d0e13621c924a67a44937039df4b4da608ab49978109f077c961c2e6d02cb0f429fb04bf7b32afd9e0748a50162bf49ab17602717b25800ca3c762145636adeeec6543c43dd20a2a194211030971f16139ab86a22fe07664b425e47240ee1101cd171bd681a681804d38bc4cd562b7675a1a4fb113ab476fb7e67009c8ad5edcb053e77e99d10a348851f266919d29204f5bbe27e8672ed92e7777aae4141a8e81a39cd83a30005127289092929a41b42db3ea2c3b9b4e14a02a45906e871b5ed4c5067180aa97a6967642a5ea52639f27665a78aa24511ec6bb8ec7c3ca2fd34fafd5b5397c75c8144894b56d61e57ef77725ed8909afc703c6cb858fa1c600556babf3cf4fbc089595606f450753c727b42c7e8a8c470ae99e40e518d73684f2810e1ccb187441873fe14cce8628efb360083029fad17c1a9809daa08df859a0626365e0f1ba97ab9bb0d09e3b2632812152ec6361cdc65307f916b1782eee7873c2313089f3bd0c5ba938b80f1b43c7fc6c3f801444a34ab9c167629076442b1cb34c9b02941368c6377098a7618ae352d7cb1ed9419d56158f9222c644f58c3efa5209317a165434b86350c1a94d21fbb065854534120e665bb73266b6a392a60fda82b096701cb100aff65b44a40a4d8c83f8c63621f44a6de22f9b4817a2772085a95597c309b6423b9710cf72720598064717b52a336a0d3d9b6092e9a445a3c507e37ea9ca126b1b8f4f702d55959faa7b80322045508b2025ba64575049738699e2e1a42630c80615724dca7e98acb40f6415f6907e3649962c451f31164e88601cc2c37a65c636b6c146cdc24e5ce6976bc3457277a588118712cbabd8dc273fd0c8c3835fdeb500fe035116f6beaf437354c39e9152c3c9999f5f98281096a0f1cbafbef24e87bbce8f88377a0a3541eb128e31a0d77c247dd32180b97bf6f8bb2f611e7a7927f7ca25706cbc7b52598b4865ed8b520aa53e6199a96a0bc79a09002e07bcdf78473b273028b34e7a7c9f71ac38bd6327ea4c9acba59a07b59433908a3b8a4cc5a01d704773621b4c750389e8557498747ebb3b8b41b99105756205b2b578f668de8c293ef989a934cd1c80b18d700f7666986fc445854c9a6bbb8c9ae050c6316bafda5e98aba4ca0b92e3c3a43c504e214193b43c9c9ccacdf4ba85a57c6da6d1a8b310c4f0b7390c7001e8004beb92bf55cc8eaf37ae07738a090018e843288a965d4e8bbbf9a18730106c52758367361f558272f3887762ea91c35a23a708394b8a3b505098f7ab8ba505bbd1763a0339084f3ccdb2e68ce8b032bc217d51110c6cca10f277142a844ce5e7c8800b5bc857613deb0e5e59b4acc72f0fa1bdb0f016ace9b02a43a49e83c207e8ab82e98fa1144a47809a5dbc5be622b1bb364e8000cfa2c203f247706b3b3dc520bb308a62bd893c3bd890102bcdfa1b6ea91cb5f86758d5339396184b2ad4b36d6c875675261658615e55c85839cb10ac8c789959cc675a976c4b88146179d38820344f319b1621248577294d4550a33e723d65f11f3f654f11f206a7b4c4b909a4b1490f41d68752aa4af2723ba9c092d371c0e2459c9361230cea1772ac0990b6626a9914b20769c51b2df3996639fab765164a7b61280049ba14d55a98537e85ca0d8259b14ea4151c787d49c9b2d291c9e2b005c13a3d93a88840f9a19d30c346b14b413c150818850bb8585ef0263b515a74e79032b3c561ea543d652076a38fb4f769318378510a8e277334c148bbf38868d74ab56adb16f75a6c4ecbca6e1ba200874567fa5d1bb42527f123faa69bf2c45e4e79022799a717c21260e3585d6a86b7582a1f166dee7015abe11b42a961d60750e2e40ffc82588448b515bb4afe246c875297ef87740a775fcbe0bd902c67b9830c6d318523e422b0060bcc5a5a5f7b267f5b53e111c7121b86a6025a0fc2716fc11025c857ae1926fa7066ab527045d8244c75bf13a1a3c6688811d35ad23c1435b4cd536c6f14f78bb5d34b4bb34548a375b93234c63645d7ab59580567f9517604837fa6f98b2b4911d9946a54d0ad2cf0747b4081b904a2d6f953c70065b0c4b698e556daa27cee3b40070326f43c3d93a7cfc649000000000000000000000000000000000000000000000000000000bbd7982687ffd48dc0a8badfdd4788bce9b1b4242f5ae1d14b1ba97c0642a6b4e42ed33e0da5856106580e02aacd0aa1546d3df0571d17452d22f186d011981a +ciphertext: b0ea35919c0560ba7caf9fb6352b36bba962cd45d3d2b7f6bd97ebb2a3ba6df22e018390330f75cb4eaef8c9ee9bde4a1f25110dadf363df31f3f8702a3c14d5d2da303bbaf0fb199384a2702f7089fcc63acfb29d5e53571102566866898055258241e5ec4f1a325175cf3a64a84ec50b4e8e511ec24dfdaf0ca79911b1d84b5a0872fb1618edf364ea06d7287c6ac39e842c56d6630ef38f4c812a8d1fcad73f2d4ecf8f7033c1f5ab982c5b6b8c5545237c4a3ba8d5ece30dc93d1d4f4e89d3bba0b8149ee5c2df793c8779d45de92630b292714582387e60769209ea7d00e2f1173f8817567f52fe53d908d11e8e77375e7d2f73f44a01ee3c87c8f4163c579c40ce70dbc006ad2426667650c35d80ced3df0f3f626fb52f57d874625d414aeaa658a220a4ee6350900dd7b1b9e165661b41cd0c96c3b665d789a297f6b7b4f261e6dda3f6b027ed8a308f1168627f71656bb0ad456ed2b197c672d88ea6bd61fde6dc3df7e4d8b505afcaa35fc1d9b5df57b69679811ab5b738d62a5800555fe282dd4d06d5ab25a3847b4f22725a2360d8b47c69458b55f485a1ee75918cefbac2b4945c20a7356d1b7c69f1c047ba355496e21eaa2123b5b545e86c23d4cf27011e68611290161366d6c12b340292113d3973efb312b1474807f8cf735b76bb3a722aeaca7b865530fba177f9016d1ad1a7bd86da6f657c32d6662e57cc691f5acad0faf4f21027fd761ae23456b599333c9af918166927c6253dabe508c7d931d50cc824c589881b39087e02b52276b9d4252c08199dd4943d72b4fc14e603c9e901d0038da715973b0d168b13edc26b20e2649f37d27c9cacc7a8508ab340a1c3ed8d26099171bfaebd39b0b9fedb3c195a381b55c13365139063e5525400127cc963d9659c964ef3415b31c3a2a923ed3b96ffd327d6eb4929ce1d0d26232b46da119e5e38e71a2dc97bb953567bb5dde9c2d19bbd208c85b135bdc885121b5f7195904d2a9141bf5222e98f95ead571db8fe2df9a93501b8fb9a06a3ce0338a37920fc4268e26e71f94cc218d6fad6c2cfdbf0a5855b186ccdf10f66f01f884f22503c530b3c5ecd96d9b55651b1eeb3af62cb7a4cf4cd185d98afd1b942e8f7eff849ce843e113e82c3a875fb996161e0d0185aa99e21e7c99c9636cedf0dc9aeb55a37eb1f744841f5d8fb3eeb5eef76039a40a5c643957cc81dba3fe556234acc512efa07f3a140ef28a93ed9cdd2088456e3bfad0e8377e69fbb3dc67f3864ab36f8f8422837e067c20787b80d77a30995e5d78f84804cd7c897d0ffa5fe1e7b92f17575d94512b6a4b5888a3cfa6e03be3a50b8797f43a87477982fb241f24af59f13acf60ecc4c11e558b1a4feb81f69acd5a67f56bd698888c9f00430dd8f8309629f7c29e96d2951fcd8b521265c368e13e22fefa30bdecd51407387c77259e64a62e5d705d3d46be5b6f710ad86e844e509a3c5c1dce0efe4b1427bcbe56758432301a14d8b882a70cb5c587e1636ecf96c61998bec7a9b6b98eab92be2e30b30174c87bb8bd66d13282dc4d1b67757435807a90a0b268a9f760054c219bef6c8811476a56a14994c760e21a1b786efda3fcda5acd859967b9874eb049a9690b0acd97c907c1ec6b1bc9790b1fa6c8f15518b9c18b3f0cf672d26496be193602d909efc2562bf72e83a3d8244eea1942c6b6708f006963ed1005615abfdb57cff11b985134ef3ca90116a7ae35299d1627fc05cd40cb32a83c9f9e19570ab0b4e079ae34402641e47e1f0bb20b63e551dc7c090421bb1916e970b33a6cee4be985f28ea66cbcbaa21279b45a4d3927eff26dd1d171f18ba8c5e78644d6027e7ace96ab62bc862d8cd69bdc9c07a4d8d66ce2a08601783e6d40665fdc637aa813a447361ccd9d843bfa05f5e88f1f74a4d6fd1bdeddb1c50523d731cf6cb4686018e8518525a83c2aab2fc5ff97ea1562c7cc7347482c96675b0b249f99428d68f180d6590c67025e41c80468a3edcf147368f3612456e9d73bc4d6e0a70364036f75cb6657ea99c8fa365c165d7fc912bc583f0f4e57ba0f531544282e21dc42e00f00fc59273d272a711748bf62760377e5c30c1776542936a10fdfa8acca0b4b5e5c9cabf461ed5caa9124c59a4e867859401c158080970ada9cf76ab49e250411a61ec5e83c781c269b75ed1c193bf8134d7b0dea +result: pass +shared_secret: be6aaee5bf0744e7ca1ca0e545171f3075aba9b4d10a71ae00848c8398e3c52c + +# Rho leads to a matrix with unusally large entries +private_key: cc389888219463a7a5f6c2ca3014accb3bc26f2318f593876de6a49822b6c1e694b7e5aa9140a0765b6334ec762c8bb018d28a99004081256159c836f4f800d0c9aa4a7136fcd89ba7cc1d6a32b23ed181b3fc118ecc60096a4ce8261ea2c0a6ca49baa28b75d1b40215367e6a33a1c177937bf43a70c3889f6aa239e20e499bc7a836694a0bc2912cc7cf211ba20c12d5ec312da2815ef20c8565712b22a927451271040cf4daa44d79705b97993584424e7b3224a5583e5b8eaf640e85015676517113f53a415220fde3638b9c0a38115e668545305ab298b9923bc16de5b9137b30a39a2c8b5fb75e4d1168593a8eb0e067bb9343f1a030e5228bf0b3a49169393cd14f73c2b8221b1267627d80b97d30544b02a4c7bf06099194b2d646596aa439d82a214e6cb9c5ea1ded727c8143755cf881415b6357661a90d5ae759475baa6076eb478a5826f86f9868afc47ac3a02a0e84579a25466a63d933b071213c886790c320416d9422d280745758779635ba6f848440b2489144866e8e018200cb8305b3060926d7e7213089a06d044176b053f3bfbcecac7840dd7844ec29eb17bb2caf321a5b17848c16a678552727a3d70c34f024164b3c4856b0a4ecbc78d345187c6e09f055273bb775078b43ecc534a40e66592b607b56b5f9304aeb048375ac71c30464e979a656f1728a7b700e3b33e5026bf40198b94455d2be37cd65867522b20bddb5ecb7a010191254b8a403f37c4577a613ea30678daab55508b16d6020f074504f928dddac1e8367faf6199715048c96a8fd6bb225715accdcb012cc856a76057b6b72b09a4aeff5b8ba278c54a750596e82bda45be19014e8ff52df181435ed9ac8c402147b539ffd984c291535b7bc8b26c5036352520730195fbaf40033fac450843e808b9ccbf03b40a9ed657f6ac4af8b65b4e389280633d79799e0226b28b356fc2e39f10a80452dc934caac7c3c521f0c5544e7821a403688f08378c3086d3ab8f7e4036ad516778da606204aed3ca1ae8c42e11038a64ec78a5fc5dcd0475429124b5d665e4acbeccca3a296a8e878b917b886ec7f029491c661bba684ac4229cd71373c829055b602db0518a481230345a34a709010a03e4b197273510a0a24465288c327c10c75434d9473208a7964db7792ea81c5fe0c4bd967c3f0c98765ba7d3faa4e6097f09e9bf10638fb900a764e4a0bdba2f19165bd69832681310a7a2585bf06322a3238dd26a4807af44faad999397d4aa14e76c2cad5326ce573d7ca04c03db769dd01a65583ecbbb991e7a31b59238f8741845f1adb5992607184dfa19a9e8840ed9e1622ab93031e2b448860d411a3d239277052cc8ea71046a0b1ada191a020c322d776c6655ae71964d86314a86a47b6a367b8ac5a4aec75677226de0c1864492c88fb70a53187cb76835d5477346646a9da97301156a3ffcc231f9a0da760dac142674e5cea882364dd74fab66901dbb7eaf037008c52073054cc2f94ec845444054058402515bd206d496bfa02c442c746ff3e662b899c34c40900902c4f8ca146458522c6a7af772b2df483f9d840fe07464b0c66fe1036c070c6f70278e9506342663b07529247b1697c6b844a5959672b08796868e7107108ca4c30a58be4ff7b37b0402697aca2dc4839dc51a8811c34c8183442711a8d055b640cd73d2caff9357bdd9ad36835ae9d55d1a291e040652d020a905027a616b3b5c63c0be2c1068e9cb0a9b4abbf346590237f96422308ba86b055872e156470b53e35b2a604bcbd2b97849446684149a86d9980c5182f1a020c32b14de18c03cd0633e303bf9f8a24ff0c95d5a65c031c18550b7d7d5b8ec672c3953bb3be0c3f13925200394aabb26090a3b9a12bde30418b997abf310c1724a88b9782418d09552a63e2855b7af2196d422761f5c8a877426976c90552bc203f5657f5370258b936c3706f074c11b3b2586391f4c4bcdd959615a819aacfb48d2c799a9abb182c7a9fda6a80ee50c4a827c9f50835b1859033629a9601b5b8b357913b6de142a501974a0c191a071a95cb8c45fa857736a93400141cc325d1b4518d3ea58a94c14f9b261759281b00213f91652b1e52bbc0c488bc0990a136e8e3b5e20f41d9f218646d43745245ca4c2777099032b1a5060745e8525bc617900d53b414dc995772543cc58a6bb7c4868f8999509428a3244db4081ac6b3f3c685865814c318032a678ce19866754c0774b31cc47a6a8e3cc90d6a15e54c7370c0360c38409b126c06d4b06b7d652318cc810c774f0e66e7e547305d03109030fded56940d472ee123438551d6885922ee91889f97ae31954703952f4a3951e8003ca2836fce071e382373c36a27b947ec8766bcafb1a3105aa2b082802b9bca0e4c50b80cf9a4033b44ba4b8a2cd6d480a315b08e7774d68f8ca8778894bebc2ab431d63c931e61c5366699b65ea448c127b82ea493034616fc1b6be01243bc84dc92bcb50aa4c7a417f1b5268e93b35ced9cd6263227c849dc8b107b10120f9f690706cb0ddec8fe2b20a26da422604c9135c58f0b06aa5180ccb55adcce07e51f885998398c4f16162c33b89bb37a09b84dd0a9d0e8c90a71c2851e33b3e9cc5531a76f81992344161a837608872355d57111df72412e58c5ff85b97ab2016b41487f56a9fbb48d2e498c2e12d3972c677caae5e439c598b67520a7ff6ac9c2424482988153b145d6b40973a1582b90a5bb76716c9878dee223046f746f08323ac3a5390a6148d767c3054524b7247c26c9339c0642632710b8a4fe0502dcbc32c35ec2e1e22510ea4abc7c74980ab25f9fa58caf4a70eec2d22c1957f162f5f1c5e5ad0a0fda4c342885081d3070d773cc972928eaab2ed604503257bfe448ef2a9c9c933055e633a339792d24a44769b95123c1f9588c8759a469c049a75bcad2e6087559c8afa5b6415a8825567aa44f63ce5b49ba4fabaea311918b804c7fa2d1742945f39bc9e8256b537128a9735a0939a1150c10418551723154cf4c027a5355e1751a9866bf558672fc68324438f12d83551ea49b358cf873772ae7853b53c9627ec75479c746a116c5e66b20ce0478c490946a0af4a3a3138534c2c94a44bca955e84513f548840b929f4b4ae51d53d52225a21b320d0d8b075358b019720c325814303170b627fd6856a149214eb192659d21001d5ba6953288e5a62d141ad5ff31c413418f332947f1441b8663f95b1a8ea35576e725a83177126719889651e8f20a8fc2392cdf55976651f1c177c5d8bb035993b0f2ca020a8b22b27080c4161cb86abda574deb0c858d14ab4261b1b8718ac12c56db9071a5acb00c4b1fcc9b9880917f53cc12bdfc77103a45ce8a2f4875c7e3711b659b967c5c26497c6e2903198f36b01c56ac5d054672d6914498643ae6b5bdc2447300737883306e4250ec445b543bb06b6113db5369da2b02dde3a11b2c080732979676040ddb2941956068557e65e0c4ae9c2834671f9ff65c246b31dbfb82720c8f014aa35d343b8eb762219b0eb802637574724595ac1c92b85e9a416089a2366ac9002d01af606ee9b21868e72ba96c6d5adb51f97c778cb8653e30a253b333ae5bb600a2b064cc387b38bbc0379c77dc45f7fc45fd060c60bcac60bbc794d18a5a8ab680a0ae202c97c3f153d07058017bc0b74458959c2a358b6c3733c60374a2ad540c75785ec95cb0bc125df1e8359af2bff55026d18348d0eca6672a87671925a8568060c09913993fc6f89e2523023544938a573ad208761e3ba85354cec6d999ee1c5f909bb973e0780c84101cd3cb42319b0d5614b9d103be8477ee9713cf943e038a04259c0958376c1013445731b0a5224402845499f30449f0800de86b614718bbe333b4b8245fc1a8e0c43eadd61f11f532ddb7551686cb8b054b2e90a19c889ccf68394cd501fb92a7211b9b599b2a2b637dd4246a7b8a5f713acfdeba03fb513f998177dd8cb216aa12c27ac3a5b84491738e5a745cbe7a3b5006bae6a08b0cd79a2b27af3da8ab021893e7727192e28787a052df8b434abb0f3a5866368991aba8ae3c891a0870327c3967eac16e8bd725bde990ef882bd6e5663d50b7adf75048d3202b39b44606ba1ac33fbb7a866a59a8c70988705974ec413abf660d5e98b6d9c60454a8825874953d778ac527578769aede871242b04561ea2d6e5c8aa04ba44228125bdb4beb90ca152705716cadd283ca2fd83ed9087ac5b2c7cba9334fe936c69586e3399fa46a174170aa8db62bd7095736012b49111e73bbcbbc89391bf70af7bc3581777c54d74ac2fd37b45300000000000000000000000000000000000000000000000000000057407f828b076da9179f40805f8392d4baaea0bac363dfbac88cfda8ce1ed279c975767ff083234b2979bb109a24a27bca17d170abd8d9e6ad3c3ba19e306bce +ciphertext: 1feb4f1d63f08052045012a21c33c2951b16c4b5ec02c00093d54ded6f94309e44d558787273bf593ac4bd77a56fe4dc30a54eb68a2f473c31c239ba18c9ca489cd50611fcd3be42f6f5069facdbcb7166a64ba7c06ba953142e5914ce20ec69038895c9860e69ce6cc3dac6c1b28d30fe83487d40591995f091d4ea116ad2675e32bb83325b7f379449dcded935027120d01ee43b2208deba910ca7ee635c5b928e5f6167307c813c8e7034096878a2915ed2d20898d8412ae61a72378a4eaee2f227ad5467d04ab884340cbfde2400cbdbca7e07a2f14016fa9e403a2b0ed27ad1dbb3cc492f584a6b5a7525baa628303039f69cf1c1e4db920ef7882de21eda5d2bad76231c88a061fbb2829fe93149c69204e2e783009beb4188fb876a6f869eb11b1c32c2ef15f9aef62f699f9692a502a4d87e5a497097ca73f8fddacbc03dd40a53abf267f749f9ac0f7b4ce9417a0f5eafa91fef75441ff7c887dc2eab2336fd257d4cda373121af864d4707fd20965e063fae456f0bef8f587bb385f8e5c96592c9b7d6c284197ca1706e1961dadf16a2264f74be425ce117a95dc9466474c856adb20931cc920177dc3f8c93d2bb3ad5f7c5517f0b7d141b87a8c287207e64158934766c8845ff0a480da124716b11d0e257206f68f2d4334e8e260895ab83e218e032a35f8d792be7b413b2679f8044e1c0ff67c474ef4c9b7e0dfd3d9bc4252fa81922cb146417dcadae7d7a7ee96e13bd480c96a4314f31fea83eef588bbf1435528c51eaf05cee2f193c3fc234d695ba32546ec77a16b1ea8047498125f2bf78dc9510812be57fe0ec77bfb3e28f42a4d15c2a2f0b54aae023ada92395cf384a1524a24e36ee2e69128fd2ab78b5af77d28c2e9ccd6c706315d46887db0c0c4f28666da7437489e3b245a19fcee97f187327a5806d35889e63940b19249d627165727f66f50aee62dd9496d6493c1f01ed0091e985048c2aa85a3b25a4f90f6e9f9cf67d6961ca246d763d3437ad64e7bc5c58b10117a66c40be088c58a27be4bc1360d114e61d002e271c4806b872f5ef7127217d5af6092e4aedf8b5c40198f266f9e10c560d4873668d58c912ec7ec18d27249f5be604a82d50421d436a3230780419bdefd10f049f404184b3530361c5c0644c3205c32fd451f6c6919487aefb12a75c821cfddeaa14c2abe20db3ac57ae0ee8ac4567db2d1e2d0920fa036351e8bcadbc14ab73d0868df6ab06e675ee193722f93f64a5344bd70593c23647152a81acb4d1a08b62b5f0b2669210d5d7845248d95fe9ccd796d73e34af955d1c94edcd2bba91be211cacb0884a90eab8a0125130ae65318f5419810f4df129c8504def662df4879e2a8df02d881e9990148065942c0d52865425f3239c4a4af51eeb85e1baeaf647e794b9fc04ea16eb328b8b1d0550e5dad8bf6248782b530735f8f5da40cf21241a2d62951cc9e894a339491f64b78d436c635eccb855d3a1f7d64f63f23023620408df6b3d190e7965d219a0cabc0933f7d50d9854e4d4aa7a5cf67b37e0475241a5af8e5000d117ebcea40b526c5a669dea1760d7fc30519148649fb00ca434f2cd84862a2755a99531854cdc847b7d5af3ede653ad6959f49c921d4a8675f7f3f51416c39e026488c297d844a8429caab43671093cc3ebf8730a18bae06f10ff8047cafb8d80edd7630c95d008cefca78f2b08ccb330d36eb33b18cf47bfbbcd0e2f81daa87160f421603d10409b8eab53f1561623f5167dafccda4f9a4e6504a0b5e67ab5dcfae98672f4cf62e4f152d09f2c64dd81e3476839aef8538a86f3b616ce55adf1dfe9451ca48acbe210c32ea1cc574730b37d4747b580c66820caf475858b4b6ad0eb7c06ed56b8f16f83595ee3466bdb8aaba3bbf35a177fd6645610b9dc238571e81b27b94757c9004a4c512cbad25730bc6f85255ffdcd052447766219e667095d4058e5f0045e16c0fcae1aed8dcb7c25fbcaf29a71a8abf72c398a61b1a57bec4b11a8c746bcce3ef0f82b9b2bd702d92a7fabc1efe0065e662270e1ab664cb1197f00983f1d265ff738f63b93d5d95aa4ddef2ea3f473440ce7ca1558b28fd68ee09c7b97e9d4c2052fb1dd657ecf09a2f664de0902f23bacab5d64bd449a0ddab34d4c0695c67ff5f6e11044a0db15d2d19a9ce2aeb818f0ecaf8c1522276521b0193f76e2 +result: pass +shared_secret: ff81d45deb69b6890f147710945d1b750cf17e876cd4e694158efcaf4fa2cb15 + +# Rho leads to a matrix with unusally large entries +private_key: 078bc69561af0cc77acc291fcb063e1d7c82bdd7cc31d5b44d1aa746e261f2a592d4aa9165c2c3755aa457b886cdd55840767f4fa0b19e45410872cb1db3b8b5829c4ce9b2a8969330cb5bba2397119310fa072b7053b35fb135d04977b9ab4766c4c1ecd9695957473f10c679d71d2f6b57db2ab0726022bfeb10b61807d35447a141255bf5b3d0e3bbf5cc3ae74932d87268e172978d78b99daabcb16b44bd578f6dac130c2528fbc89ffa94b48e6785293023e2605a8533a5ac17c15f34b1e30501729a78d3b8ac6e4a329e1006e0c0735c737283856d7cc7663cdaa1610b1045b7423ca8ccb59ca6b1c482dc02ba117c17588809ef8506f09a7162720142e397c6ac0f8fdb02e4c1c557050af941ae8165ae01d9228f767ef1ac3d72f27cf9a2282a6c379a669d01cc0a6c560b21169557b88771008dad62641f435e0780234e86c1ead05f14c0ad68b6b1041492a166bc4a278b0d352129556d55f37ef8969b596c5e41f8597878c8c6c83de675019c022314215eac667a7b559146478a4a5634ff193f6b83673072643efa59c27650fec168ff17109577083bfa8493f38301528f27681405693345e523ea4398055606d4ccad9df967fe59428ca7502f046506756a6b9a78182383db4baf05014fbb20afaf148456126fa393abfc480edc92465d93aaa158c2a8493882b24c564b607cccb2c8f6cbb43abd722c74c2c63230946acc091c48b865cdb33edb712c670648b07c06691687685218ba48648fa3054ae7a6a663aca6aa4e66506516100c8f2caf9c0645f2554c10c480e798b9c96756e42cc8a7f626c2759d21555342548e0490420df3a8124b0566b1804933b68225359cf66caa599c55573b70d488d16185496216cc09090de382d570795efa569aa5bfa8f4a60665cd30d63bb36cc5ac050310ba9bbe4b3af2f9400296bd344cb72bb623c757366ef1369c968578eba52a092dfef34aadf552a63b1495a5b78168cf6e58b218a3ae64310d16734d5e72b2036bcc001ca07533085548809bf114a092225aec9cce6950a953773ee37ad3467bd5ea0b4cc4c6b0695a774781ce17004cd48e36116776db19565367c92a94488ccbf4ca3c3960524d1b13d6f77399ac625de5a2d09954cf867011f79bb4c3682cd40f133a9d67778a24d7cf1a5b71b7b81dfe335d0fc392a8b12b234950ab79cac94776ad1b713e99b0f394aedce739a15334f19042f4861e739c839ce07da145808260b159625b5a742258779440953c743c591659b9d982aa7da028c7eac4390b47b243ba23e8ae4fd9c98042a0c2d25a6688c9ec774cd7e95899fb7f081035b0c4217c2903688ca7e4466e66ac4e3ca938fd58b4d6bb732a36aa8e097fd75976d1200d61a5c988c12702698b1cfcbd93157d3d1c6e76d316b00b4e462588bbf3c480d8374df3cf66a16f9dd2ab721954e02a9f8eea4380c381da230f10c2c7dec02b057177e157cbd5304ab1d8160a323fd5892fe1649c2e270dbd3777035912dc0802f4d18a56356b52946f30c516838028f7f39cc22466ed277a5adb6864972e1063b1af0709dfd60136b16a3d6c863a68895677c488eb1d879a69a5341a695212066ab848609cbe331704aa56092a4204a2293e77935390cb1d2b2924e0bb27d4aa471474fed2b6982b71a1c14b2cd3ae12b12d5d12919235caeb8aa3827c844bda40f5f57e5f59c75c86b645224b3a861eb9d9773b01cbba45122bfb1e4a60ada0fc10f133c546563661064adbf4a89117657366789cfc282f9bbdd0547029c92aced02963f8cf462326db19bdc980149ee0823ecb1d9e22a5effc6cb588b17da70789d813b749be180457e82a5c958b069551748e12bae79cbc0dfb5ecccc85f565c22eea1836b52435b023959b4f4fc12956a09f38d58836891c4c2b0b4502b012b868fb9bc0455c12e83c182f1637c05469708279b1f4af2c275e174ca5ed0a12b39849f49535b8ca73089acd5067b6b57297327c4cdddc7d5c752a5d2cb04c659d04f803c72507f5832e7bd528e903863b932d80c51e8b2833684a084c7100728ca33a4304c85b8cf7b61412e76373566c34a75ca88004cab21a3274bca1ebcbf34222e351a3df4b557f09904173065b460d54210511f4515180b3bc0a87f9125a0a91252c1146101738f8f11e10897f9b1b16cc7c57ddfb3e4f6b01ad6239982baa07c56c05827e838c1b4bc99f9cc40608e74ed2d123757aca9d8030a0857ee2676db47bbcb1e10badb32508b87aac4c066fc747ad09a52177b378fc1446ea5aefcc30b0d744d2240e5e94c6f12254945223aa93abd8e71fe926a4fafa2a49273d618a0a5921cbde9c6f9648c6c12bad96d080e39ba128464d8f496b7cb020ebb03fbb2850a7118a7edb1bdc438565ca33850c1b1bfa6be29b88bcbcbb3e6675924550a7427035f60000841603c2b4c9f22040f9205c9386cd1b457046b4fb1521e4fcc47c1a0e7fe072bda26946762167d8bddba8c6d04470a2705fc05a6b00c4cc54409499a4859c4148b2a7596c8c7b2e597f0912742794495491117fec96486035f270363fb88511f756238ac9faf98251ecc06e1495337529b209031c0008e4250f550c3d476352ab82c8ef41c4b8203caab3b81335613016cb71b6a1f2c9b71158526cda75d9057c7597099789782b05164d338593b0a9b5ec85e0e6263c6a54d5a06ab4caa6c8db5b40e099f0ec7c00628373c3189e6c129b76827d160783f183ee14151b3b92e72bc4c65a06296a88b9f75948a18d50f53381f59360a19daba36939c3af104362d725c62f51b72ba1c8526c0be6a36930e19de18c2b1e470136cb7f92d246dc45992879b3762c92da6b97c10a552ff7a8b56788985814d2f9c5cd316dde3b2c7329b42f7492917c9174552219719575196844144a04a0b6718158cefc7833a421016b5193a5b965eb7b689698d14a41c03a408f8713aa46a077eac06a6106796c64b67117acd1bc0220125f4408222159503864eaa8824626c5651959d0f4c250c0002ec513c0817a47927ed99467c1eb6091f91773495d70084a7c344f41e0967925734ad846d360bc2a73c96f754b065112f1f472fcfb331eb8a286bc69cc1486d58b2d4932086f40c90ec601035c3016985962da0ca3571f5f36791a466861527a1ea52dc5a6254303971ce841d165985e2c02ec5b6a92278106117fcb377ad2c6c48bb24899a519626c74da9a3b026623417156aeebadabd418a0a8bc0bec5b43316ba7d7c4145016ca515ae19932a50819ce609b9ee9997c29a9af03a05ae9aaa89aa03b4ac5ca887b7b05a14d283a42da27ed7187369b0108165ef403550c99cad5c3cf7e28bef8a83ac8867341b331c9c02176520e0555af9b8047b3753e1928c849a13900545ba7a5c16bb9b6c689102aeb73eac0c5aa093a1f92810472c29642cd2a549a32bb9029961f6c4a20876ba8f4ab5212539f543c9d247355a300467b5a0a9d130613549d17a185fd045495f06820684c86aaa18a89317ea34eb0923d5600146497729fca9a66e9a544a55c1aa6841c556cdfe7ac0959635281c54e044c025c5b466442f15655474928c617a646c7178bf5b679062ceada6c6d702c22d339e0d3a9563a252e36287fc7975725bbc1a68122f4579a34c9c84318b13a76254c6be35a1ac3b26a8c2b373c6378cc20a7de414924a38ae7e8423fa1a66367a14b198f9980aeef068f346b208aecb13d827b3b5ac088878548171451109ce1535eb0a18ed1c1c677f9ca7f60501e1986ac19764849633c408d476540d6290738633a2e711eddc883ecb5111ce01bdbaa3df0f381facb31389249e261786f79aab0a80992b9a74002c9a7432fe88243f4276599389ce8119b846a75dcaa8eb300a7cfe266bbcb3742bc1e4dca77b986be341a03a75644dda25805bc50818a05a8495fb351c0709a5c37a07759dc0c3a253a3c56740aa8095d402bc65554880c2919dc6375451be6186d18da30c2f35ee4f1abfdbc594ea6ac5799c1d9912fb173044ad995d675751294489be7674d84181f4aaeacd9951dd0be79b919e585560d0b090b750f2f667e2ea21e283577e3aa4f6b11ad2560212f8309fad233ef87c6fa37480217a7b3933147daa29d2642cd582a3ac96ce5026135d5376a586f4604a8d511bcf5d09dd3e895fc3cb7d90a2535a1c31da1b1df5562e1b2a86a116212ab10a6328d2b80921c3c04ca9a4a9424bcc3a75e649ab34481561eb0a0920b71c245c1789770df5a7fc9136d4b573b227614dee4b23276af4b6c3537bcca67b59afa0119e668c910060e04e7c94a1a7fe0e191fe22cc727d12dc6d0000000000000000000000000000000000000000000000000000002d1ca62c220d1a0581d585ab445c7e001ad9056b3d6a44c8f563f136088de171d48790195fff2c19f221b7cd8637576cec18c29a4a51cd07c82eed4974c36e8c +ciphertext: d4952da07911c8ceb643e6b3254f7fcc22242a88df735c9aa9a91fc692f32544b7f30fefed3311dc8a927930c50b17577573f858b778294929b123b180498c22c1ddc92a11cda9c0da3cf300664feda28bff6f1873a682451d24e2c2a5991fa8aa29718a43c2b379ebc7387fad5dc9e3681d233641d1b805b167ae52631b3b6ebb0aaaa6507d4a87a808a1c3b62c97da49c02dfa2c729693de194a1bb1643fff14e0fd8d3749ad33936e8b4f8f6f3106c08a8098c6b903d1cb70c2636571253564fb7dbe54b96b1f999749d0c81c698934756b455bc6ec918ec267b5e54a0a812c62de971d8ccd93e4c1d6752afe3d5308c5257abed2b1c01d0489bc1d5fb5b2f4b199cfec784b2bf92dc85904cf78a9a6c0fc3a9c5c1640f905fb8fee2e08b3c0d5fa029062a5d41c82c512ab0645e7a1d728e7fdbcd95ec59d121fe876b1e6d624dba73cf68f35b23bfff7a435a5afc81947587b60d588c54ba0c999242830e568c3269bc96e001a99edb6ccef086abec634d0febbbaf72d872eae8c5606e86d9bbe279395c5370647f245351ae41358cc26f5447c37f959396dbb03e484c80dfcfdf93701e849e081232e85eb15e034b5421dc63c62190ea54a83ae06c89f395f7cef8eaa41517345a3a0aae4705529d3c2c13f71418817287c860f062c6d0c5ee918c50e613164dfd241533dd08928fc695f3b3c45cd75c740f76f6a896cceaafc9afd64deb69db89cdbd589fd6987b1f5da8b5b9115d675d3ab6cabcd0f793f00418c97b673fa31b851c1209140f76492359f3580c0e4de09d2a3efb2b3dd4afd4abde0e97180b7b24a45063f07f82771991fd2da92e12de7a868e6e84dca6a318dd8ef3a1ae6420d63051306d0582b058b7a96f25766aa0d863059483e9c7a17748a268e896f0d02173606e4381b639b480fbf0b3541a7c1790e66810e064cdc9d4e176cadf3d64ac27648467cd0b8643ad1255347cb6b086788f6c4dcfb3363cfef54c3ba5c13562ce884b53b09e6f149a60e1fbb35b65261406ec04f4146b2de7c61c2fdcf0f714981308774af933b710d1d4f315feefa97a581a98dd083a4d31749e5d0af2ccc2109cb739f8bfe85e4e7844dc3907959ff3c04ab9edebf3317f354c5e0aabe4de2e0711ee771b8dd70a3008eb9936f8b6924ec0dc9897a801e00f6738ec7f31cef0db9608d2c3d3683e97befb02f0ecff93068a46e57c97201608756dc45ca8bad93e0f562f5d74790c87d4ffaa67613b89c22339115d7499a2fd038bc4533e46bfb5eef28b06b8fe9a3182c6a8b18286edd1b57adeb55bacebf7c842d527ff5024c0ffabbf78eeb956a5127555894ca8459d99df31fc0fd1e1c5f7050d2cfb427dbb2f67530e049e23f8310b88c39d25dacbd6c7dccb9e382b0b471980d54974adcdb082825a9d6325cbaf90030a58193d5ef0a4e1e8fc885f04329253408b4de1d25acd097ff10e0afb4ff344063edde277e49b18996cfa57a7617b395a54731052a95a3cced450d38a31f19811ba278c60097aa1e3c91e87c57486b23ccb07d687c48fbaef4e814f9500b1e6f679a749614c86197239936be1f7ad2290b9a421c4f2fdbd4178a75cbb9cb1f7eddaad9d369f79c0e383fc9ccbbfd5e4cb93b211c477cac2786395e92385a4c0815d0ff6849e961395eba07c86e698d5f62466492efdbc326ff7c955840ed2877919d1cf95cdf5f557ad069363caa905c97471c85c5d0e65cea1ca90df82a0f8ef5660f68191c1aa19a180d18ef4a7b0dde8250ff3ff0a97dd4d65c3faf1e3a426f6c4b64f1f2d65ce9c5e5921ac20197a00f2331e810acf4f6b71878f1b785a28970d844ab4b6d1a604824db09f15e96bb711389114a4680b1c8b19be73aa5b039116c7a7cb7d2c2b026f5847afd6d2ac804f4ca24554f5ab27db900a159579efd23d78cf5542a038744cd6bdd64a3b59d233b878b383bc0ef38a0a2a8ab60869b64634df1cfdf3b53a367d3bfbbfb741badc819cb01823a8e8e16f6b4a35c380f99cd45af0edabf9de4fe2e5b0e6c34f7dce2c8d9a4be2b2b8951c27080aa965ae3afc422ddbefe0da8f766c8c63823050d1ba055e42352d305385ab932f99c0309dfa8d6362ec1c07e33909ac63200787f5963653db6ba2994cf308c9763a153b6ba824fb8ee94bd6a38f2a12047f7e0b01d090aaa41b4acce8396c18aece73cce364a7e6d9d +result: pass +shared_secret: bd452a700448a4542a31dcddcd0bf285610aca6570d8bc85e20e163a13db5663 + +# Rho leads to a matrix with unusally large entries +private_key: cc4a14e75a6b1bf87f11a240424645dee23657db9819ac274780c2d7d8ac64f2cb82530b40a078791a2ae70aba868253bdc3045b6254c4e29024894cd13723edc7461a37403609b48f79b8e8b1018981bca9f68031dcaf87528a6b065d8cb83c142ba20d68a728a3866ca88e6836cab209ab49bb234312916e432fa51152c763a62cc53da61480691b07a073be74aa6c2b88468bca8302a23d1d6405ddf4aec2f88ab055b18e2b1873862af6539ca83b1c270b6a563cbc7a220cdc8106e6e5595d63a26c0cb86ff11b48066721634b43b361b57a5b4ddb2967d232d34cb750026b362cbd20188260c6a856e9493ae09c462bc4c8663c7903112488b06b2a996dc6668e382e9cdc93e52a1a368b07d8388c9531afff0cc4c07ab423bac717dcc888e213e3a75d69a633f49745bab10f62592f59d53ef19b6a62f0b24216aaed9c91203b7ee65b9d097cc1e2676deeeb576ceb4fa4a867ab7310076a912a41292c658e8f75a98603612558352a5b7beb404fd2bb6de18c7ac838464b6399182536509624e1e25a7821b71edc57c35541cd115ec52c13a739c3de231ada741274272383cc78bc9869d37282f5980209543c92b76ddf99c3d45cb7409b5e44599b75412d8bd122460905c250a94dd4052c0b0a91c9a906aa3652180fba9212046b4f7ad14f7c304780d553f19487b8b7413de732ba1296b41a2d94983d4be93e540a4a4137a030629e97fa640c21ba5b7b5537a03a2a958ec3a888590a5c14a904dd74c83631264644cc6689a245f833530124f7d10e2596a8be227f270941faa75300bd731c145f781cce52247418595ef67c94a170676cda269e51c7ddbc63b6765b010aa061cc576696c84345c35c491d3e4626efc8b73dfcb481c11bbf8c79c6a3aa4e54c43a44141f5c35932486320567ce37adaf5241bfd8c44ec140d30823b58223b02742f3e2bf5864756d528ea36348c1c2293d8ca050b6307d71a20a036e0060697b58a0ada53eee5a6990a9cfe283436cd36a02dcb1a2b7200a267c3f133ea6423bc001baeca953515214e2766f066cae531212dd3551e22bbb1c705f21753ab60a70f364bf1949901d9a0415a36567614c1aba2dacf2c5435b4ee66193c5e461596719790aa792d5a09ac474343509ee36ca048751bd4b0c644b2b039b1320b2294df814b419c3ac55541be5cf4b93593aa4c099142de9e13699a40709d70070aba9227b6c14f216d434c9bc16112b8b4237f838340a5c317a618a91170709bae6a7c13cf96851f72a8761736c452df27758afa4b02fd55b3493b1bbf96dfc45ac743718978b7de8a017eca45dea633dbc417f856781c856c87516429127c6a3d335f162ace0982235ac79ba0ba68edbc1eafb9ed7a3597ca7a612a9bf3ef2b0d1d7c238e98714a434b8b08b35e3885e007501f9bc06e841921521d47999db3ac3937468a54b95b57a2bbe34aeb48ba57f0744021bc684456a8ed413b9192057eb77a5502dbc89c5964c0383b4c9034396da209279199ab5830abe9386b2e811c222a6ccb0cb23732a95676fd5c0376505943ef8bd67a95defe0af7cac395a743bdc3119b1a74771343bad21c53ec80cafd7548ae310293027d62960116a338d74bbaeac359ab3728e268abf75a8d30b118141bbc56670dc0c5b2d05c9c2f03952338170754e20287c99177c66b810f009002c244f213891c5b980aaa23d15f413d4a80160d24e692c450b68c8c43ac60256ad748ab6aa85aeac5c623d199928f88b04ac7bad2c1249c18fe1b867a02a353a112ef71368eee3210f7082f8b216c975070e9a1a27dc265698bfe4849611716d0fa1b1f9047e8b0905d184b1fdd863377353fae732a5d0388c3c6606a773360734c9ba915d49aa7d358263d7abce563afaf382976b2ca2e1328d4aacdfd78851eb143a1b81c21713442421bb1abf77ba25d4355dd10602ce06754dd9a77aca0e25b1260e994d0fe1b83088a5d385251ad5c6a54c45d93a7d1b25cfddc1612b8b30e753814b505524a5b0b26747645c9b636543ac7a871b6a7cd3865f1d8636cb5210ae9157b567b2ebd17fe3f59b73379d086348c9806848ac3ccc1547e8964f6a1c4b532787dc8620050b7e628274683b79e133969ae154da157bbbab159941484cda4108c84aeef56af6036a8efa3d74327dac2417e6fb05e2f1c178023b70214296c3ce65151248533f43a4b50826b181bcb51fbc54279397a6e50113635faca0cf7439be90867a4c548a9af0704da13d12c7549ebcbe5b279afc266fd83b9c4222b717b86fd4724cd0a35238abc2c3390695ab975bd38e0681b67bf86f36cc91af700277998ad3d700e6419105dbc952144561137711a0acaad546e76c66ab5722bae1cc110abdff7044b662beb6acac276317a7799f7ec6bc1282c87cb284006b3e74c361e5c6c8b899ad122880a1219102404fad458170f8aa3576750a9682c830c7c8796daef63042f3607c5c059ff98b7a093ebda2947b861f497202510a6a2cdbad3d7ba3b8da61f02671be3410549aaa9c3140635334f6b4385cf4105ce791db08b73f3ccebac9ad93f1c7abf6289721568d601c2cf5ae2e4690ae0c77b66134f3e1c33bf82771491da4d228ebbb7077312babb47e1262009457a3caf60f0e47145e29a3ec3b37a67b9b418625142937278c50344c05a0a606fe43c229749415064556a55dac28321be77a256637fe2b8dedbcbb02a29ae505c641b004f970b051e028d047cd152477db673875148b71434a80221166698c3cc589374634c06110320b0f249a3ec4856ffeb478979533be7a333eb144550939b00164b6b1b545905612dc24775ac2e4bbb531c6763f934121a8a8d804951b05c8f9c9237046245b422272288e333970f7469a78d543132055c8781ee308382398a7bff70f62b7357bb8093624a3ebe3169e957f3a33019fb0296ea1cebbb484e87b04eec76a3e29cb38b451816a8feba195dfe79e820591d7e73c50139e2beb847ef43e42ecad64b533ee3857dcb35413066c7eb19e8c1bcc42c9959c13ccc4bab6ac81b44346261ebc74af482e34f855e08916e0c1bf33861fb6d706c3a5c03bc62c6d97cba4174b2441a32ce47db7b8703452bc4693be69a4c539c6a6b744211598cb644209e84a711a05b9116574c7a222bf459305f10a68d4c48eb72ea16526ff7619e8391032685e244693ec24b30a257511e00ada5a69b6cb75c2983d53157fbd708fa1e54057757bfe6067d242cee6492a51098913a6b2bf888ccb280dd3cc48c6a95ceaa5a844338cf4985978929e9ed153819b97dbb944e18c0d7530a09cd420aa7ac5f5910325d02368c602d531289db188d30c6fba407f32c41e80133cea869b52e8091f701c3d7a7d4b317e9b0291f05a652165695130c6cb783b18ab1ffeba0f72d2c21cd9844f8ac2826267081a4315927d9ab6123fdb0193f723a3cc3738794f735b1a145b83189b71c597bd8248ba511b9463b9262c80790a09167720473fb77b1da2af8632ad793c10d1916868b99d2d23a06875769d7151c9a524aad51eb4f20bc58b4c572cab2642769fe444362533a04c7350b3c5eb418785e13e05b5459ca2c856b1b4e1b266e9677a27d29f6dca61a2776c92dc9290c04d77d7bc7cfaa8a31a581a623cd1c046a488080ffa8c13f66f4d262aba53cfcad64313c5c2fd838f88e903fd3c7da0942fbb3c84f4581457252e8248a75e185d4b5b64e0634b2ec5c5a088a6251c9c8c76837c95c066a565f9fcaf0cc76a79e1a20fb05a5bc1bcdef32deae76105c581319bad317b7991d062ba1761cf1accc2b969ece35274d7b6a3c8c79142c43b14772ad96fe2f296eca5c9aa4b68cf14c584792b1e4ba1132aab4de7788dd642e307a6b2476caaca69a1f7a3946404a440764e4446c20c216da5965c88bb9e09c165b93845c68a5674105884c46c601d35737649815de052cabbb31b39f95531286e08e64772213280ba64b6467d03ec43c5911854498656a831a366cbc256813d451153a3610e6979671ba7bb7ba41dc832a81885589974f8ebc2e57a1709eab2ae9931a09bc97d486839d6a16b29b7de642aaf1861c31b6ebe82891896b4e75b2360a776678aab892b81c5e2175eb588885b980ca02e9ae7bde1dc6346a13a5964c4391b4a3cc776d9311f0a9706c2c04584d05b58624906417eabc95738407ba197b2a14c6e4655396575b585f7c2a8b262cfc7c7d6f3a1fcbbb4356195b502ca7b278133614379176f3f4aaa49a040c7672cfada79ed5a2400dab4d050560d8a30c3e57ec6411988e941622c64b934833f9225daf42885a5b1f7909d65b5000000000000000000000000000000000000000000000000000000ab6452d0cdf5872a6a7d3c97f59f7d2be589eb4ccf832936a00151b5443fc707a9e4a0d3487b6714e18bcc9d1daeb3127164328a19d5cf60822f3fd37a24bbed +ciphertext: 021a27d9ee3c76b205152ced9c68003eedb09245954d50316a14a3e1d877bd9d6480d479265cf7a693e77b8761f11a09c1c30d2fa5f50497ae6a4d2afa3e61b0b7fb4b3504024763ac6c10fc2e6bc77dda7fd837ce115b84b1d0c749e8e4a961d3e7de1bf6b36741be282f9df710b46410df07191c3207dd9e74e8c4d43e3c75607966a1894e86caa95cba51a9c3289b00ad0fe59c034099b822654caec138a1b06635d1de59fd469ca3e928deb7873cc3dc2fe03aa4b5729f91b940f01ce83ae5aedac13d0a961cd9420584346346955780974ef21ccbe3208cb019f050fac0b80076b48ac6c0f3c2aa2dc3a13b914ce5343c7a140186728bb335a47515d361466c2d78f3fc6250f13a4d4fe6c8a587512700fd5272c9de73eb698045708e18b86d6b6692e3afa1b73e5ed55614dce4b8e71ba9dab03a246b1469c617f5bbf3e502632b060c7c17145ba7df290ec310661480de58a56cdab7a2e5a8e298746eb1b7b8703c5c650456c567056451e209148059a59af315540e448c0c6a7f48df9e22f373aca8be4df3bc9bda80e94a92634a612afdbfced39194e124c07748328698cc21f39de459b4cb08c6c73e80fcb6d0d86adbea470a207b0575f180ddc0d658d7ae66b2166cdecdee265a02e56bc4880797f0fe09c081788f5bb507db2406f37a2743a3c22ee0caa51ab62ceccaeaa9e189ae412f8dece857b0faaf61f81f2bd968d0f6c9048fca287f74d954e48ecf05806a695d06bfc66ed8b5297899dd4b3942424cec559c33ef0da1ca083e7eea98585f89003ae0ba98fb3f51becb80094ba0091f97b3a32c635a12308851e070f4a94502be51fc6f4e11bb7803cfbee43135c82bdd3bc82d58383636eee387d2c13c1866982d7c4f15f0be3bf5f87c8fa5d43daba703c73135ff3aafe4cec43abf9c1bcd16e56d6df85fc38dca4d09245677ed75b585722a9b20fd5ffe9d0436b3fb592ca6982ec2b96a8af589296b0b0ffcae14ec9027d4815bb9b933470a357d0afe5aba5010eb0d93a0fab2c28f84d7091e607505ecada258a551238a2ff68621bdf5ee1246c27d6e8673f1b785f7abc9b88310e3c1ca5e266f2c974d1c88a31e27a102330f924fb3713adccfd09c4415c1773c8da37e4e18ef274b00d462970873b54ad108f588c8bee6a7b4cce157109aa04ba0daefc9b5119b3ff9f70d4728574cb9f57573f41760248a8a8cdbbf7492083cfbf585c844f03ee2e08da4a08d04717b6244b63bbf80d0f4f0477f94de7ae6b2883388ba05b27ffe8a497541f012f16bd9ec50f64cd0d14e1a6c2be8c77ffd39d1d19ef402b46c0c41718ac406acb1b71fc044b1f93a4fe98fa8a0bbf09caf9dcfcbd8e8ecba42e4bbac9bb5de40f089b86ef71003b92a3fe385bfe603b098185d05f43819f8686b4f4e14a75463f2026baa66789edc52610ca8d3d5b11f10672c70c80effd7ba0352b2079de6910221ed21c487a7367cff076e84e1cd3ec625065d7a9b8ce4eed9d91c8a72b16a4a50d96b8a00921695a00167b53471e79aa445c656fc0d41da64d836ac21a34be767c514d1571e500fcea435d1a1d59a6d07140ee4d1a4014cfa8a6f0be9c334ebdea053c842a06124dfd165232c1a2ce63babadd8a56fd78ffbed64b63bac3b49e5af81c746253bcfdfd045deec785e0e272ef8c7151bcefdad6fa2bea962d621abd97f9b5cbf1eab792139d16b51e1f732326a5e02926817ed0bc4c6c4680e42e7d5847d6e0195c402e59290ce8a8f040a70980eac1a0bcd3867ddc0f2de9b204514011491c8dd63a371d331b2edb870e76e7ec5b27146a0097b969a6b157d00f66ce53b71598b71869063b9a29b23f3623837385571962ac29ac868301e2ec0643bf639b074c8a28f0a66acbd0ad77e5c86d01cabd8fddd77a4fce6185768566a6d98e679986aaf9978c49189a2ef1a218977f4d2c34c5027188d816cc918061ad13421be77fb910ee5aef5e159fb74169d7763b446e523470409c4fc4e76aa6d98f120013d4af284bb0a8e9eecff71b8544f9d3815062173ad6d4e9c4727cd6395bd3da54237501c73390cc5c48683d780efec478d2a15a40a5ffa3455f52c092993859fc8ff9c1ebb308ed03b5b88f6de341c3be3ddc96f695d68c1562b85806e162f1b07c5f10a1213f8d85f6b7d92e06d664cda2ddba47b93e2922d30c3bb110405fc7dd9213812 +result: pass +shared_secret: 8d99392e447dbb7f7eefd329325bd71d1d984cfb01fd609c3283a84fdd0f0138 + +# Rho leads to a matrix with unusally large entries +private_key: cca22002e0b84e0c0fa98c902c2a30f0d9303a411db91a26576834d4f1645c181bba750c42ab6bcf401739f83fe2a4a3aa1a3f5917418003aed863875fc044dbc99c70b27758389fdd3cce51d5a13b21afe1219f0bab5dc3b15952591e6f80068b30870ed644de082476e7b32d3a531ff8631914c7a5c106a5acbf8672ab4a304afb71b1672cb281438f0fdb1db0f52948e8b0a1422ba10ac5e0a480e87bb844072e7a134dcce36f27274775fc6a8bc611b2a33cf85a4820e18b47b24188030fcaaba998d84a68424c07f4503abb553ec33b4be2af3557aae2797649da014dd0264d00ce74431e46f8969276b24b359c6750c5bc15a6318c2d06898ec5f473380a68302a91eb562fe4f10596012e5efa83f4c55a19912978a6583e4a884e36af1b9367e69ab0566c3cd8c34eaea615f49c094bcbc63d52a21d74c02462cb0bb7c77cbaa03df988b60cba880771a7c179315a9f6ebc6e9b8c90bbf17f737508b1691ef1952363e9499b5007a9c84838c2a149478e4be76c0368a8220b9a3ac68ef6560dba6b3f68257b6719551d83c38f73654fb392af0c1c2517851fc160c343cf826aca2c5614726c774c758e1abaa9ac04ae0742799060970909cbc2f78ca739c71bf6528f0695ea6175a4ac13555c3bcb9920bca3a37d363ba622666e54a4e779cad5059612792d610257a689975fd664dc5081d5ac4586c60e99b9a2a17ac612e5a794ca4dc097a71f72bce02b4907d69d801a22fd7b88f9e4ab284076037a0f6ac803bd7b243b835e51873919d3b77de041bbdb9c2917338f0c42a54ba6f5539d60e827387a9e7c156155d693b85701b53278139b29858785cb59788ed981d77556d27390285bc3f9408cbdc717895815d31641d0c31f2d911515f36743c40f4f3517432c620892149b518fecc80cd2d14c99730e0c940dec155930dcb5ef861b7c80b55c2223f7066b625c9fe5f0cb04f0bcb880119de142ce511affc01d483ac8db8b73e504b242315533d9c02cb64d15445fe32bb0c8e19383f82854981a9ea465b05c77cfd66d97a2b262bb37398cb4654a0fc8146c00b7608f061a216b9becec17f686b93d88309a7ac04c2447030b41ebc6a95fc52466d36dfd461bb046172f3b83fd10bf79c281202a60aed8467748a986100b97742c8d70c8de523c1d700489c391096c1b92654064cb7e35d7b25f29818ff39fa523c88bd69b8cf41689a414288c492f2a83f7b34a4d95770e6144b7731057c73a077a471e7b378fa48464c426ce5a6566e7c862131ebd5a1b3df013641a878fd702d167ae3f369361666514d98f325679c22aaddb56406e148e744960ee1395866acbe095542a6836571959a80238d037260fa053a52cbbc2cbc035e78fa9c306ebcb61ce33422584009271835ac3845524794f18bd7e1b4c034832fe68ba24a162815404f65c0af0944c9789b1d92767268c801a0444fff50399b3a192131e965523bbc2c75c286c96450c3f0733458bad7831205b1b4841a617626b4bee232cd1f220edf53b59bc213a055d956591fc3518a1974582f79a66dc8892ba71ccf7a5fae1c01841428525c32dd2b433445118559cb5447e3c851a0cb498cf99c2d359999fa3969fec41d1311ed2545f5281a09df223bc4918e55551ec060dbfeb41c777c79acb7375215002d9afa37b5a126625f7445c3fb51233650037e070648c924586bf7013c203e907332901ff722c35c1991acb2da41cacad4b709ee242a9e71eeb0ca1d05595fcea8d175553ce689ba595b8f98707a68a4d20f8a1fca8c34c3482e88c8b043a9d42e4a9e55a6cdd867e106b271031355bdc71c85c80713c0ef7c3ba3bbb9ad4e32615a2b104e52dc5e7481e258351385f9c8932a074529e327e6c0949756b57ef47094e184517819d459bbe35ac6154a70d004490b03803e58c9bbcdcbcd8451c2b0373656373be77a59beb2d47410d8a8631745653a02956dd0a0fe99ca87d78c273230667f25bddf3a65a216921a12844b8c98c197026e14638a97fa5144b44189621f00c75857fca20342a09ac44a4aa6c336d9ae58a15972f22555139e2b3e00ac0bf67b15d64ca8ae77a79b44e5b47a72ea06930aa9695b96987aa0dfbe63d83a352c9370247f6b21f225e096480b17333009bb78582464130612970cafb137f0e7c060db72de03a46d8a860b0cb2a45b462e5530eb566bcddda2315a633ae5054957cb74df537c30777a547b0c6e486787c74c3d242ee34158b212f4fe4107885b2d3da2224803e73bb282cdc8ca0365eb70751c3263531b31dae5a29561316003b2d781790cdc2ca09b65ed19995765263f06c8a1f3378d46c19b1b46a43932952a37e4c828e99f95404075b013b7471070422fc65f9c9965a1c0cd0141472fc7004f6319b548c19929f792ca0d588208ba4628cf2bbf7377ddac05a058308b7fb92cf55584a381204523a460310bba06a88d4b69cf62fe2a71097461a8c3b5eb212337887a34fcb278c59931f28a0000227d9cb9b1b3753dafa63e893c9783764bd01b7f668b83cea1e7fd94913a405babb301ffb6b57b2845cb7cd929c0acc7540e1bcb196679380822c7bb67f732a3c9ca778b60451fb03755ba151e6b0bacd1129df5174ebca123805beb8e91b840b70643713272ccbcc2b80008a46b3a818ccfa6ece2c3364f373fc8c10ef4b4c95955052f99202362bc3020cc2528486784784095fbe10b4a44732a2c6c0b2b50d199a93c544a00980baa2f5cbcc6a3456eab71c2798d04c9a85827b8b654c962b7e4125cfc0f82a59632462d656b9b96188cc89373a6165c287bc890d5ed9500ed08ec1f2822d718bb94525ce81cb48b4999e288b5c90bb7e3647ab26a7f5479199f9198fc950948605b9aa0c8d0b133851abe4d77aed7455b70410b54a00bdaa166f0b4712e3916a70846840c8f3f9c80c8a95c912bfef188782974eb372795d96cccfb6c9209cc2cbec64bcd064e238608ea46f841ac02d6aba8ba9bb251a381777b50570a5c79257a964190e56aba3b27c708803a2e6909a6920f546c509a7524d138a9c2c839f34a6a814b10ba4642b7214e447844d553532804154b36f688715b203cd576274445c98abc60192f603d970c988b42d6cc250b4349f2d91b50c123875c608c932a7f85bae2cd54b6de80be13914f2606cdd9b03ed83219ae5623748972a657e0ccc41579b745b3abf6b04b50b945f2f2963504bae804a261254ceedb767e252c64908abeb94669a94cf511b992c475d99939095ab9b19f74f75d30efd58beec598352108e1ca648b5f31bc7071c86aa97c5fcb60bba8884a3c72414916bf68a277a82b78857de531611ab7c7a111a632a64704458dac97dee2442b4b05a378baa74f34154bc8c191591eb2196a4d3174c3848b5f02f2351211f605b2608c9fd8a101b658599b87c65a3c2c7a266c02b3b8beab84feb0071c25a50b23ec8acb1daa290cca2ad6fbc8280c5cadac42993c083a25338150231cd134548661d645c678bcbc0e7815da41a14e8eb123c482e2831a1ab0399ce02cfa1a39a41c714bd8c9206d6c8c922043a235cae2bb6dd1ac430e22947444ded7447e00a51c13308365aaaf4da9dec03495c73295aa9259d4529eafb67dce58b374066796983f06c91d034226aa75afed116c886927e135564e4000cd86016346b56d9864c7abc6211a72cdbcd32fa869cab01f1da8f6bcb84cf1441781c6baa263ea684cf96a1277e2459ea07c6071b06093985b047b791ab6e6593be230099308a79376bbbcd71492a4a4de83a4d70c290aa05b74a8c80fdfb9293317d10e07615acc85d762ae35b187c55060c912d9a2a09e995afeadb874a5526cef75fa4701e9e0a5c082b92ed3b8887f0bcca362b492369881373ab878d00054027c4cef0c07cae57b30fc51e744653316591b5845c0a47492378764769cf3846b263ca6e086835cf0197b5025b2a960097e57597327f28d4b2fbc6bb241863a2c96d3242a031171042fb40afe8a75cc2976903a603b96019f4c7420b77625470b62287e03239e5008c1297888f5322937457b9467e52937996157e50764537ca495ac75fbff53dc1e8cb77002aa7988604b0829976c8e49649f7446495a7548227ce61d963da3bbd2705a8dfc73f091c20e72b77f6640a14aaa30134a1b3fa7083a50cbc720bc9a802a4208568e2a2ab065db245628ef2a138ca1d71fb3f66d6a8aee513f1c80b64a0bf38f01f4979a975054dfca823c4165aeb1876a7a81fd6920974b516d6b3a1aa71776a264a32447240855b84ba0fa1d35f07a8c11361040da933c4c44e88417b585c1a1605c68ce4000000000000000000000000000000000000000000000000000000c07898c8f447decd9bbfef0871a28f3bcaa4eb22ae145d00ea63a463ed3333c253f53a49ff45b0ae588d417a63a599670cd391c5e9885c972593d09350bd7523 +ciphertext: 6899d650581d8ddd73d6e7095d24e2962ac573877204768c66a78047649ffd373d4e0cac20e0b98675e6f50962871c33957b5a7ba2af2ab800ad728c2d0e70877cc3f459ba53d432d45f4c9ff4c951c35f14185e01a1fbd735fc3ed84063b579e69c230f41af67c9cd7481fea81ed64bf248c63f56f81115ad8255a172fc99d87d8fdd6db00ee407618c7877a2486b6fac3b8eb7bea62c24bb5c5655e47388f2108ac36d5e55c5511d72bbba65706ffdf297cd0788b4c34ead564e86e78c605359b6b344380a4ec73a4f64b7866a2eaf36a494c76adba39158a3d1d3b41973cad055780ce211982fee596ba61e5e5f7e44cdd8b1d6f866c708d20403760b9fd4abf31a0573afa130aab5bf7493b2365ef5437b7824366fb3ec967016e2da547eb61276be7c5509c2bd5e16d8812c034f6b4c5a7f5f489137385ad5697c4312042303a5d7f62e398bf5fcc758ec1475e7ba671c656911bcc32ddedfdb07252ecd0eeea696046e3fc9e564b2ffca11562191c4a1e4b31d9494961fb66ad44f24c4b0d8d7422df106663600ba380baf53007b6146c923412228936d7324a87050e62b185bf3700959e262fc64bc4f2b55402d57c63539c57272240f4725ea23d389b17d6af64e864ce3429c9c0514c9b384d79b830a9c6fe12f8781755d53b8af9bf81e4784d9780ba6ba0ae36f89a99289307481bb3955075057648129349f1e0ce4e750be53372f82c92230127280f0f393150c89715a43eaac8abf538a031155661b489b066e915505d59ba40cc0b5a4b8de7e731533fd06dda44e65f22b7931c4b8e34a72331d32798aee1c16d81e06eeef892e7858ed2e9c27d21a3030567e40a369e21c925a26712e1ad6344474bf8e9539027040eb4b0cf65b627623ddf81253c6cf002f837673d2389cd296f9abfcd38a36c6976b03432c9100c7ce9bc862d2c98a6dc2f931f62e471369bbfab644f8ae37deb65784e6f5414bf88cba9e6836d3fa3c0ab7ceddd81d31e94c612224270fe79048688b6d8d46acc7d656a647888a469fdfb6ef8c8daf78a2270c5058e9b87d2fc0e4f8a098c1cebf96e06ff1edb382e545387b2314b2f7d4a669dff20122a0165c285258a39e2a1d27c5eac3d79ce0cdc64dff98a8633882db588a34b93a1403f6a739bd056cd2d6531af36a2701acf47617024cd1cd4b9b60a02cdfcc6f34e4693eba3bfb32780c573b4482a5f6bf109c7ee51792252dc119a5e41a4ea8f25557b64e500a83a6d8a839c456775a9ccb906a733391605bc487bbd6ea7272325df31cce2093649fa8a379f4977801240ea2be8b1e6a5ac95ba613bb2798bfd1cedfc34c39e1c43cc094f8bff34607f8419bc3ef2fc0c37075dc49280656304d2f642c5ffe86d5cdea4fe96cc8b4451954e5d898f6cdf7e7ec5af447dbda66a254b964df9e8dd565d46cdf04dd2d19ea1c7400925be2105e45343baa9855c5236dd70e042d0153c904d30fe45d087b0f0863ec603ad74baf1836b18c91d98455f3e6477936dba7379a6072744be6d4c64bca89ac3334ba727e0763f0ea52faff3daa52de9fad1f27e566e7a6e85914a02bdec5f7a8509f80a616f6ed66848d4ce8920757fb7611ee7c70366ce847fcb62a94452dd2523daa21c759f36cd31337afe1a5c8e8ce8799c6f03873f58bac3649e0d0fe6adea0199ef6eed64dd1e2fe0bc606b97ec8ed1e0b567baec2816273b7280ac91b05fb25e7467e934bf79025f5b4060a813c221291cb307f7783d5877987124ecab1d9d8c8e36c10608871a92e8878220f593cbd4ba61c35d2805500cdc0b145cd6ad2cd614481edbc913733e3a5104b0006dd26e871df58f32047701b2420d93bdc2d0a2474f7d9927e7f196993d9792e30cdff67ae89bc6a27236a6f0ce0439d4b04788765943c2be5c9fbc0f139135ded84ce79d876eeb37f30371194c8eba42659c185a10c8941f9fe9fcc722183ba7e22a7885a66d8cd10f214f4534171e0836d86368cd04d87737923da8801166afb398bb345b5bee89eb512cbae07f192aa50a932a5d92e909e65443f4004fca49de5eb19abedbf57d066d134e096e7c63defe4430f8e1886bdd3cfb8077f7196584398589ced5670c7be91d715a20f51603db8ef35724805eb1c270cf16b282ce7c79111e4577a0a1a27a435c070d6b3e89dce1bdb53826fe9a05d86e586ecd950d27247ceec6d +result: pass +shared_secret: 71e358b21b3b98d915b70e9b877e94159aabe9df32737c71c50c2f99d7a074e3 + +# Rho leads to a matrix with unusally large entries +private_key: 16997ff80976d1506b23c012e387ac6ca0a792f7481ac3c9775317ee3ca5267bc7180ca884d28bad6b5a05b045f33a9b975c6c98908d670550b874ca70a77424e48bf097256434b9d9b96c8b8149f02ba5bde9b813eb2b60f20da4440b4cfb05716bbfd86255a1e82941d2816caa7253e7368a4bbf4bf546f40b1bafc65bb994c34f7337e82818021797a431cfc664699bc22b92561fe3d1cd6306b89a36380920abbb466477549d1bf14364221c10f51fc3f7240de4c99b3bb3eeb9ac1fe12bb7c97888e8386da4a341a0be8f78a7b7c49f2184376c3c3784289a6bd9b6a03a110c228f72939b86c7a87dab3e093c0ade693a0e5331c48b761b070476f55cc45ba1dda14dfde01a011776143a4d29d48b47b0c6cd2111bf18360a7438f384a28d772177f648773b961a86637c946d7981a6b9f571a4c29aad07220fe081f1f18700f3c99ef28e76819f8d7c4c43d754cea21180c43357f3430bcbce1fe8952c691cfe9a7483026386a479eee4025a838df5c563b9f5a1882a2d7209a68d231ee82260a7eb4fc157936deab52618cba32772fa1440fb675220f4610d749a5b3b142f31b404d94d2bd816cc4773ec83aa1445a37b361e52b10960827e94171dce3c12cec80a1ec65aa6f117fe937673a78cd7767dadd3cebe0217f13c903ca25d6a681116b206acb46949b18f671a63fd2581a6c0978738460cc51df3711dc1215dcf75525d30559ab6bc52e16fa513753454888189348f045aee8a32e98cb2dfd708e7d42818115e5c61711a0c43e85a13657aadc24b5b30a04a43cb97bafa433204c18536337758c0db6154d4fac670fa3af148b52f24aa731c31f98464ca9bc975e97fd665710ee2c56b024fb8d7c7f4a20cc9d510f8eac38f96129c97b17c890417a21465d05abca02754ac3614e964f1a24393d05ccf5cb9500852cc9231656ca899f3538df30984475209f84ae8b99983e844b06ba4cd8a9640a513cee439ae13ad57d3846aea4fa165b68c6c03c05c835bcc5a63d45cc5568aef94ae7798bf29aa7f38e275c902236e63872a274e4776cf1928c492036166d04eed9ca64aa16ebb4b11fc3ba802c6b249e4b53f90112b587d36c6bfb0733a2ee3003419026a10a4c54c2be294b2031a48fe895c2c9920b3772f127338a865a82c3262dabac113c235d433b90d401f5557bb1bc68359020f75742c2008c2bc8862416910f53772a55376ef05a5eca853eb1ba5ef841f243b8d98b11e94483ad7e72fd7360a3641159e481ca50971a6e8aee73a0d4f24b25430ccc0997c631308fe2aaefcf79af5d2045932043d95933919b21ef87865b8550742a513d67af756c5958465f582983a777e9032ac43164e552358861a0ebc458e55865fc3545fd01b0e7565877ed3229f8267369c319abbb017a87ca662c635519ff418682af39ba387aa38ec37396b4d6ab505219314f4448d0f572f4330cf33fa1369872649c922bcd228c294b3213a216e59752072b8e026700ea63061855be3d6037c0cabe0c21f5be948ee4b18dd935ad358a5885a0331db2e496995bd47c3ff2b679e0abafc02804b6117271a2b00e33bc06250fb30ae2036716d30a50aa07e45f244e1f0100d74933a0cba383545cf629d357aa8927a7bd4f6575059485fd455be7198fc01a509920f6c0b8c5a565b4b86c084a60bd9b9b6037727df67b83ae06c5e47aba5d263ce83808f40a378aa43b4ec5458b33a0eac8c816abf5bf76a1220a99205258cc4a9236b4dc252cbbe8884e8ebc1fe921ed408582182b273a199d121153ec38b7f183174754f66332ca98b87a31672720815ff7bcd0cdac810db905ea76e6496742d26b2989b201fbc2936f5a6cd60c35e757f8c33b75277560ab948bab2962df9c38c91b44f08090e5585d852c4b729c52de88fd8c54722162f2d7696946c7b710079500136a28b9abf9a5c0294a5b265865cb04f9796b648f85858f8982f15c2bf31626b236b2c3a6493910be2cc8610829d96693cce3686b8a63b91439118fa661729462ce58e5e28b764aa39911569d1ca5c1b33885400a16f169858930c7f135ab6a95d08ccc70d057f9e73a4c8ca2da7185df37c8a6f727893bb6db74329cccc4692589128867cbaf28694fa747e86cf98619e99b221db88a81afa73b3485846e77cf311b99822a8fde459d7d01210db0ce68054199939e8156f8f7c33adf5bd5f2c54c6bc70054a5b8e305d526c1322e49f57c47264091e39eb0c72a596ad5575434c4de07c0bbac32f7ed30a0930221bba0aa75140b0c97a6e1775e1211740c23390f0094d144632169e4a0c2534479b85546a7fa65694610b2fc19488a5833aa7bd0ecbc6dee36997a900fad18b1c13b7cd381b1ca598038c2a4e40ac374615ffab46b3cc992df777eb0781aec573783b75cb426283ea01bdcbbdf8f8b30ce92f46cc7d4ce407bacbab2bfa27fd7792f43ac0ba74b58b332bb915be649a573eb22c12b6037b4a8cc109cb4495a337e42ac82c48dac2099684bd01700b7da007dd8039bd6b09900776cc783ca114358ada02cf5443c9bc6c181a6c86daa79371bf6e6c5cb68b7255d592796bb7b38c5f8c655b2e480cec127a2dd4aae4b23c44d4367de78e74797b64b0ce07a36e73613ddee8a61c5c32f865119f1a60b44ab5a28374af3324e68604bfb33962fc1f06d661119c0a081c45dea91190c4cad6b6253ce560d4e7855a64c58bc950bac88ce61b76691a93be4b81c202768c984ba2d9122cab4880942c40d87022b91c5ad817dcb5037b835dffd916a2b35c09f782ecb72cf63239b6c33bd73c0efd115357b283bd6512c1eb3ede4730284328a86021fa805ddc55c96c1caa3832857cacbeb5353453638ee70669c4dcb6a10c723b18c71dfc44fb5600c0f8cbb35c6d0b075335f6bec7ba1306766591575b5d2b4eba76a84e326b1475b5ece6c3ccea5e555616d38c03fe630c3ce56d3ad73858539d1718b915fa703996ce39745831b3c93e4829cc5677e5a79d3b1794f81816dcc2c5babc859b0966c76c23a4e66f1031634c93b8a51550d7850d5407b4e2d00ddfb5862c1c570b778042986f66ec940c5039dddba773c9a6a3c10e370714d0a4a43300a7b06b01aea6b6a4b5c17e7482d59bb9e1fb16897cc0340c5b65b9239d973c06d41f6e7b9f351a22b8eba6ac1148d91bb4f8959395e6a6ab996fc79bc8f0f7309be14fdb65bfb0287771908244033a3975ce2ec096abb9c15fb40d33a074fa2c84bdf7b1ee94746c42044be55484a179ec5c7edfecce56f9845f29c7c535282759c2d0a2546a13bf56dccc6d4463376a46ed05ba7f54577f26c78e2aaefb0928c36820db23a999e4b399b9b4fc864444d665e58ab24577533aca26acc5c512970c3a84bdd6fa7c7fca6c60eb73a1ab79db779c208c61a2f5311a694dcb7ba37ef7c7db92587d4a77fe3665036531d12c1adcd29cd2ab733e1b2d3ca56a2c7c9f7e3b96d6355b73c4bc4061ce276308b449cc0660b0f9c30fa4a62005f836e182a77e0b74d2b86e3bb6a63fb58d362b9496025bc5485a086808d3779ee28038d1939c5e39b645db160059a04e1b8e0e532686f29d34467fedb02236f3bb0b699c68726961f49824d277c8495c9d804a61f5320e61bc57a85bef199700d18a69e25331c41646abc434e6033d4abb30f114c35377365c51f5173769c315edf076e58710449763af61cc316b5a3e75346bba705db322cc683d5258a249a22524db0e88059a423c9b55d173eca88ed47cc4711a2ae295b846fb113834ab688bc2a42435258b9b1be648c5889230dc153273903e06aa2590ba5d77a63a16853d304933157288e03af785bbce36067c296a18cca79a18aefa33855683becd7b19b3890de40a24d6d389460a4a66378da2b82980e61ff0b144bfd64d0ce294e9816b9105c20c2076ddaa1026c68e50982cf79ba879f630d4eb8df663390307902207950b8b9db571c306a033272ac8976133a641c585d43e730a4969d752072bc6f180180e0ca0fd9c27d7845be15cbdbdd44c7c525fd70b5479c18a24800833c9338a5635034704db0443307c616209ab2172a0bc42c239d87ced11779625315ec168c3716ae62a209ed7096ecb83d7939593e519fff06e99a6a09122c5bf20c5bdc09af2402a3a605318d68c2b31a284b33b1719a4b6c7a5fbe4500ce23f7d858456f47d135a8256c9b40f52c37d07c728da600f127738c027d131b19b0070cbf9322d1865fa515471d461d17c424626b305d68e34838d5d7a35fb91816b65a1f9403771fc3a8f22403ca8616f89995b52425d618a63a789a0dcbb9ac196bd6612fb69000000000000000000000000000000000000000000000000000000e07f23404b053d03c5dcbfc340f9406bd010d254685ac2e204a32e68c7ac5afee366c059f5f26e6dfba8db203c5b27beca8fedd3de2664f6bd5c3e2ac9fb3891 +ciphertext: 09ada15058fa9bf500eddb096fcd572a056beffdfce251252d0e9a8ae0300272e289f4f8868c1f4909b0502fba470989aefee80303e817862fb74080dbd7e872c05bd63162ada055a9f5dc88e9504ac344a517e613113f670c16415e2ebf5ecec2056620d4fd9b905a14a92d4a6af2d34a4aeb21ed9a98d498c25155559fc1b3046a5ea8c519bf320a8e2c0ebfe02cf28bfacb9a6a04c54130d93f1aa33af643d2620060bf578f525b1ece5464114e56c5d21692cb5243f763129a44deb9835f4851cbef64e0f97cc4ffb322c2f3863b26526153db89dca3f55d6727252de17c2021d3da9c1f9e3521f03844a066b047b318baa867c3201a1943c3a8245182f1d3a36b5e4beead76120470b2ef02b85ba13a1dcede19b5e4a7adf09d13e4f873fc5756a37f1ff240f6554683098437a9c374721088c0e0a390c435d8196d94ce94d988510fca6ead810a5da834f86f7bec0e41d83d35d1acae4205dc00a7a9b05779d41c893371bd000e308f70badf03e2f9066540fe2ad85f312db74fb48d054061c869f80bbf9f2c6c28fa691eaf8df27c7e13e076d8a793d7ef70d6cbb3afb059ba176888f569e73426765e4b866148729151dcd89753a68a2e1b76be36559dea6c7e4f8aac70a417698ac9d546f228ea36b01622cfb4405563a43e75c6baf2c626ff14b098ee33b1e9200d7b7fcd2cde35198b3332a3292f32bd1959132fa1510d8f1a43956b1d93820fb9dd88aa04597f65f86166033abd9ffdf9ce1ad4d8ad60d05f298c11f2816a0d375a9f8095aff0725905f508d20b11dd59b7145a101810ee140f86644827f31c64b2a7401048a8a5654934d6e5eb41d43a4957db61f341f5a214d2d09d4fa6fd2cf709264c4a755aeb0aa171a8286e94a354425d795780049f097b3c20ddb6cac39a78f8205f11c4744972263c1a495ab1fd563524f9822deb74a70df9ef5486ccf54e737fba48e3ee8d1c69ecd1c843fc38f4986f8fecfa42be99b056f24a2156a14d10998b4edb501f7edcb9df12bf1f235068b2961455f3513facfaac92d7d5093f00af6834d3e33c5f0271feb31edfa94bb3dcbd1221fe29095d6832f5a5155951dee6ba7a379f73854cf10ef5ad39b1730bb01e315a3c642321a52f4ea7efbd4519ba2192d974d445d6894feb9356a4c4b7512a0b1973568a04d7a45d7a4b0c73cc9df8147a2d0e31d2729c6091bd7a1c1985649795f2cb3b40f4df43e3bd7069683a737347bbca94239bd1e20badcbb702aefb93391c852108708db4949579eb495ada6840755a40fde96a009ed6acb54e98e0f4a084924ef15b25a917d497d25d9032a895a6ecae037af1d6e9f36ba56efc69fb893506a311f1f80b746c8ba0b8e08cb6c980c476a5982ce622e8d7394ddb0f6ba2c6dba68b7c5cd8aff2454dfc92362e82594123d9c200609d2372a7ce4df6e1b7ffa68df7b681c1d5174b3de4eec7d6f1321b13fbf4986b0c73ec6b9583229798801aae096bc5f972e1b3b07b0a40e1280070b2977d6e31aa8f4894d6dbc967a4d0b29c736ab33db11c172d9b771ffe84a8a803306a1b59d7fddf4975e6aef83375299d97d364a7629cf69ed856c689b09dde89fce7ff9e273bb72e768fd7d671d6591c6497f3da0eaee46feb58783f9d0495a62eaeca8e054038efbff4cc599529a9443b9496d1b0734eaa278121ce64d2a59c352b0ade0ffa907846a0ae8bdf02426f270293f1fc40f2b645089d621c18d11fac3d073afa27f20925039258e9d5530137f848d8e3e56f970d523544485cecd847dbc7fd8033f89c04a542f23a12e8e4bac7b9ecd76be797d8195b8f6f4e57b1b779ef41f03739175f1ac5e336fac71cab07f7dc760e4de2a3296c5acdb01dc5096f3f2de463980ab26e6d84b8a0754578de9b0a022281d6d1ae1a4ee40b781f49ed605a387b5176d685d1a29d3581eee4b1bcb050c2567e4f997330105e67f128c28577eee5ba1d170365cb81dafd7b218c8ad0207bcf00a38ea63ea404e3482a110fe16d0ddc8700e185670fc1df89ccc8a712df0c4f69c4db77390f72bb12dd627ba0159afa309e17e3538c313716f7d03a07998f941a7d4b8280975b2c353495747d1e115b770951ce5c924a8adc73eba6bf4146aec3dd27f828266fc3e1fc23f3b5c501404ec19c8030ad8b07d26aff71aef4bd7228728442325c5b880120e1c4492c1166cb27 +result: pass +shared_secret: a2334b0bf4b86c60c4bd971e673427352bf08c60e7730fcd94edb8c34339028c diff --git a/regress/lib/libcrypto/mlkem/mlkem1024_encap_tests.txt b/regress/lib/libcrypto/mlkem/mlkem1024_encap_tests.txt new file mode 100644 index 000000000..8b7fd485a --- /dev/null +++ b/regress/lib/libcrypto/mlkem/mlkem1024_encap_tests.txt @@ -0,0 +1,1840 @@ +# Official test vector 0, seed: "061550234d158c5ec95595fe04ef7a25767f2e24cc2bc479d09d86dc9abcfde7056a8c266f9ef97ed08541dbd2e1ffa1" +entropy: 147c03f7a5bebba406c8fae1874d7f13c80efe79a3a9a874cc09fe76f6997615 +public_key = 537911957c125148a87f41589cb222d0d19229e2cb55e1a044791e7ca61192a46460c3183d2bcd6de08a5e7651603acc349ca16cba18abb23a3e8c330d7421598a6278ec7ebfabca0ef488b2290554753499c0452e453815309955b8150fa1a1e393386dc12fdb27b38c6745f2944016ec457f39b18d604a07a1abe07bc844050ffa8a06fa154a49d88fac775452d6a7c0e589bfb5c370c2c4b6201dda80c9ab2076ecc08b44522fda3326f033806dd2693f319739f40c4f42b24aca7098fb8ff5f9ac20292d02b56ac746801acccc84863dee32878497b69438bf991776286650482c8d9d9587bc6a55b85c4d7fa74d02656b421c9e23e03a48d4b74425c26e4a20dd9562a4da0793f3a352ccc0f18217d868c7f5002abe768b1fc73f05744e7cc28f10344062c10e08eccced3c1f7d392c01d979dd718d8398374665a16a9870585c39d5589a50e133389c9b9a276c024260d9fc7711c81b6337b57da3c376d0cd74e14c73727b276656b9d8a4eb71896ff589d4b893e7110f3bb948ece291dd86c0b7468a678c746980c12aa6b95e2b0cbe4331bb24a33a270153aa472c47312382ca365c5f35259d025746fc6595fe636c767510a69c1e8a176b7949958f2697399497a2fc7364a12c8198295239c826cb5082086077282ed628651fc04c639b438522a9de309b14b086d6e923c551623bd72a733cb0dabc54a9416a99e72c9fda1cb3fb9ba06b8adb2422d68cadc553c98202a17656478ac044ef3456378abce9991e0141ba79094fa8f77a300805d2d32ffc62bf0ca4554c330c2bb7042db35102f68b1a0062583865381c74dd913af70b26cf0923d0c4cb971692222552a8f4b788b4afd1341a9df415cf203900f5ccf7f65988949a75580d049639853100854b21f4018003502bb1ba95f556a5d67c7eb52410eba288a6d0635ca8a4f6d696d0a020c826938d34943c3808c79cc007768533216bc1b29da6c812eff3340baa8d2e65344f09bd47894f5a3a4118715b3c5020679327f9189f7e10856b238bb9b0ab4ca85abf4b21f5c76bccd71850b22e045928276a0f2e951db0707c6a116dc19113fa762dc5f20bd5d2ab5be71744dc9cbdb51ea757963aac56a90a0d8023bed1f5cae8a64da047279b353a096a835b0b2b023b6aa048989233079aeb467e522fa27a5822921e5c551b4f537536e46f3a6a97e72c3b063104e09a040598940d872f6d871f5ef9b4355073b54769e45454e6a0819599408621ab4413b35507b0df578ce2d511d52058d5749df38b29d6cc58870caf92f69a75161406e71c5ff92451a77522b8b2967a2d58a49a81661aa65ac09b08c9fe45abc3851f99c730c45003aca2bf0f8424a19b7408a537d541c16f5682bfe3a7faea564f1298611a7f5f60922ba19de73b1917f1853273555199a649318b50773345c997460856972acb43fc81ab6321b1c33c2bb5098bd489d696a0f70679c1213873d08bdad42844927216047205633212310ee9a06cb10016c805503c341a36d87e56072eabe23731e34af7e2328f85cdb370ccaf00515b64c9c54bc837578447aacfaed5969aa351e7da4efa7b115c4c51f4a699779850295ca72d781ad41bc680532b89e710e2189eb3c50817ba255c7474c95ca9110cc43b8ba8e682c7fb7b0fdc265c0483a65ca4514ee4b832aac5800c3b08e74f563951c1fbb210353efa1aa866856bc1e034733b0485dab1d020c6bf765ff60b3b801984a90c2fe970bf1de97004a6cf44b4984ab58258b4af71221cd17530a700c32959c9436344b5316f09ccca7029a230d639dcb022d8ba79ba91cd6ab12ae1579c50c7bb10e30301a65cae3101d40c7ba927bb553148d1647024d4a06c8166d0b0b81269b7d5f4b34fb022f69152f514004a7c685368552343bb60360fbb9945edf446d345bdcaa7455c74ba0a551e184620fef97688773d50b6433ca7a7ac5cb6b7f671a15376e5a6747a623fa7bc6630373f5b1b512690a661377870a60a7a189683f9b0cf0466e1f750762631c4ab09f505c42dd28633569472735442851e321616d4009810777b6bd46fa7224461a5cc27405dfbac0d39b002cab33433f2a86eb8ce91c134a6386f860a1994eb4b6875a46d195581d173854b53d2293df3e9a822756cd8f212b325ca29b4f9f8cfbadf2e41869abfbad10738ad04cc752bc20c394746850e0c4847db +result: pass +ciphertext: c9bead6b0c1114389bd4761c73ab9095b5809daac9f659bb564af226173052a4a3e7f2e5fd47d2b02aaeb5189e06b9f4ae98b619cb63efbdf3989a94b36e8ea0d700633b950a0ae2a78ed92e85c85c70e13e626fb263fac9681521c3ab22fdab29173c9616a2b037083ff7b2e019b5bcde068fac257ef8f12798411693c1bdcc65420997a513a8a69502620be8e4ce7362e412a76cf51c1f2433f1ab64ce0e5d2f56d7c9ade994d0e35d0aeef3ac515b482437664d8c1d25e5a5507cf80f970d3ea7226aacdc457cbf88a0560aa35bb2c5c455867e2159910a35810befe3aa10eb04d8d57147cb8f66d2b070bac43d1f1ffdd57a9399951f64965727bcb9f66ad42309dafc799c1c540af1af93eff68a86d61f5115db662dee7ac9a362677762b6a164a0fa0a4d859e4b8c8dbdb4e183f5e6808fc52229650caf7cf3e16de3d895d148c35448ab8c2753c9831b24bd4921497eaa192565cabfd83c0c68dfe7d392abf5e5e6f84bb9f5af4b7118c0b558105f9c10c9b6d70682e1de6e0689d7106a6374bd34aed7229e6cb356f2ea65e680ce7b1e2c3704e116a38542826e8a001141baf2e34de37a03040986d4c0cd5d57f0701ce930986fd9525b58e2e59f45b8dd04c0f35b0f47970cc67079618eb9e6d91e9b0f8c6d2e165cf448a2c1ebf71b6537e0f375185dfafef698b6239bb35580b315bcb5ed408c357f192def89bc1b75cdd6aae8b5faf0c3e13803f6bdfa76fb407fcbda790c329b3ee42fd3d3b03bd5003f0bc432f7ba39631112452dfd12140433ff8980eb6a526ba85ef99477378b4dc76635a5cd5040e43b8c1fe4ee5e158e423bfc0c893c1d5613bed08da719c9073184eeb36fd357380fb1873d8cbd36e2255e985b1b76819743a6584a9b3a580996c9c2eed9bbbfff78a6204b5e5eeae5f4efd2660078b37f0754ab5da862e666b145b5f23f3d0977799929dfa2aedda53d152eda1d0d0e4ea43f6ed889bb965eefe0a7c685bb36770eaa874242c0e229cf6ce56defa5aeae64d0c40dda8aa26eaeb31458f070a3bc72e1619ee9b5f642291c56df5b7e43db6c802fc74f4f3f9b5c0d355c3aae520aa31229d12f3e7cc5d48e691191a36b283765f4133f0ff1fe2f01c6648b2798a74eb5d842a248f524a7e7f8974211297b44f0dd19f386e86be6ba782de77fde887226f37a1c77bc5eddeee5bf46b67fb7478d559865f262caa84d64a8ce59e4df0818e14861526acd3483600f3dae7959d35d8181ca6a81ce791be00752da7759446a2cfbe00b8248b93491debd520220b755416d2fc6b7c8af2ff75e5bcbb8e7537380a5721c77484957a69271d8bafce0f166735ff869232de5d381afbf0e44d69172b79a35191949de09703b94222b13c385c6081e6d2ede1e57fe184ef8f60196b9a3a7b7eff7497191ca8741b5a01e79cb69a61142e6f5d080fbb3e566f79e146f75c8a1097860841b4747df604dba954e4a8d9e0dccc1f609d05cf8d31219ecd60c312de684552f09227cb829291c645732c5f5d4d711639f42a23080aa34fe1420f219bd6bcf4e3b29b9d02293b2da81383e0a51d2bb186c7b0a211a0cd63acbfc0210401e985d436b3803d5601c24136afd1562522e45b457cb439178be4a87cce40346d34ae0f3c39103c8a3ebc9c86c8db8fc5561eb0f3a143d4e9fe93a5cba6f6fcae5650d3f43d2668a5956c922893b816647ded0afc052a6c3d9d01a3d3af0f1ba807ff10491e131dc15e165cfd0650a1f2c313d7956141edcc61cb90e9e7abf2fe35fc9dc1bde88939fa11f7bbe3eb4d8ffa643b074d74f45113586e9bb12060003d71941f2da098dc0e96cad3255cf328ea2d3308c1f4585e89c613c426b7e798e1ec4e98fe6c71e7491f5eca0cd05115861bd160e3fe73a58a026ba538e0e256b92f1d7a2497570594856860ffd06b601ac575592f4ac612b5de7866042123ebc60c55768e3a7600a3260551f2bea22bbf6b6c8246e80f9125c4bb9db354dd64ae695c15f5071f4abb9639207cac7331b310f69a05f54b995de529a023f033b055db95287a14ba30a7cc526bb724c417fba290636a996f286e3e9e939e4fe1c398b5c6599959d0b4445a327ec469a1653cfaea7552cecec085ccaa68938ae4ac3c424f7e480439ebd2c992b5f6f95ec244b657dbdeaa9ae110aaf4d68bf4e27410d43ceef3e88e9c717dd44c9ee +shared_secret: 489dd1e9c2be4af3482bdb35bb26ce760e6e414da6ecbe489985748a825f1cd6 + +# Official test vector 1, seed: "d81c4d8d734fcbfbeade3d3f8a039faa2a2c9957e835ad55b22e75bf57bb556ac81adde6aeeb4a5a875c3bfcadfa958f" +entropy: cde797df8ce67231f6c5d15811843e01eb2ab84c7490931240822adbddd72046 +public_key = 938a454364cf10a4c719113a23b242bc013962f13421ec0686e32ccb80840749643eb4b5cc4182cee2366717cf77f97da296a185440113770b6f755bc596cbbce021e94306b1e4ae437ab7dbc29527142a9223a8a7cb269391cad8f70c6cf666118830485ccaebba1bda242176559904713c6722c413d5c2b9c2669d58138ed5b23506a71c6182af6939dd40c51d678639238c8c071384c1256ee6a307475bb72bc93976c8976bb89c736d8fb19580cacb1f335b97d16943c0706f78095408cdad77a9fe967c4bca738960b3a3c171680426528a21578b79b226bda19a9bf132998a2149c463932d630b0f131e8096be462080e6d17107704f3b0cc90c3908cd645268375056e6072425b51a46c27a48b9c0db67b025a58ee37b44794430f3ae6cc74e1673c2b1d4b29db5370f590eaf6165e5806376f6a7d4825c74038792683f38893464103d82426593f366f96b023008be21956e6be8a4bd612d4f85239d62ab6c39069aa210b47b37ca85394c19327e5303cc9c54a5c63aeb104dacf67a1c1c3142710dcf682edac82471ba98c81a552ad2541b7338b2a0ce41354ccab879f549cfa58995eb8c64a8b30b6f384ec2e04dc1a11ae04c967f744024d70da780516777a1b1715f22cb1eb3511f5c4c99ce577836489a0f813a99a622390b52e4757843c772f6e75f470305259833b3993919f3aca66563f3eb7375f5883cfca72398b049170ebf0997ff277e44501fb0e83d0c5ca6c701048180ac68d857e0dc5d24b1628433c737b8808c290839d42c6a322250e0c22b81b4c018260d288c47976bcb84bcd0856c40448ca40b723b8144837965ad46b521ec4b405c28589b8536621a10678a75233e2cd59bc6e03f49d93925c5bcc133bea39a7e21907a19840c80225f1f154c270a4bf0206a16c241bf42cbd351055adc8519d38fc9d3b976e2144909053c5843c36b7b247a6ecd04c9d792a6fae968cbe11713592b287cc8b07b73c334bdbcb91d05c7ae4e86aa7547b4cc6403504acaef4c6e5b758f4e261c7624337000c187648325f36ac8854d4a8a1c2c732a0811b39439340e23c33af0ce5090ce800070306834321b5af9e4be13b22ea6655da11427f995a115dc86cda737aa99078407b9f78b914e831a6bec2c85f922f972bdda971b66761045813a852a0fd990136840835f8b5a72c5c8e8a65ce8d3ce957b06698261160031597a29e3388a4f5a5f0b96b70481a2e5738d3a50189496c75a856643899947c955be8871e808030a5757d6b46079454b54d51557cca964379bca5a8191698275dc51cb164f8e508fdaf480031a28afb1c9ccc65da9ac1cdec625131c6630188ffffbcb726133ca563da640c76a6c24105502ea3c24b918c5b818121cc68e2f1b62112a41594a6359876b91d058fd66861b7633d73cc7226b8debebcf90fcc390f761360554acf013ad03911b49b641c73687f4a73f8c290a2890c02c56e2a6567fb03826353d87ea41369673e1f9b920b36203cc9aa464192d01b6d859307927a629a24b34132cbceca487a0cb3c7442aba47c4a077fbe7442c2a4221a200a93e726518830b11b690f0497ac0851a5b27ea20253065a9ae7e6567fc26500edb11346955aeb2d9c6c228f1644f21b34e3694c05016284bcaf746ab6344a10eec87cd0f76a611ab64ec86288c339294aa15233abfb680036d2155fe77363530c3ee0c4b8b74a54e9a2453ca081d01f9626867632870b178d25b831fd133a2ac0596e688652c1772e2979305c5e2a10949bf35bdc08cecd6771b7f659b61960a45054998472163c21d31024c0c24972d5b145608c1044718f60894bf5875a453d4a7c4569c63a2b38c2db6a4fb8dc9289610ef12754f37cb4dad3b66e135d1f75759622cd7fa03c4ba81d71ac9938c9a97839a12d7a4622943c381a048edb26c64926b3a807b644aebc9110c54b06d4ea1cbf6462a55b31c7f5202cca8b7c698d9559276a1a3963cc56dd26ce3c051167f299d80c3a8ee894f134567cea1032c845d79ccd95313f04d6459d1ba72e00cc604365a9c5c5185005f17a0397a559a0b28f31b41a5e0948c81501e902b9cc253f6eba88172bbb92024984fa99c5bab08dc01504556aabe8c81bc99c56fc771ddc85d37b7c50182345e189267934564aa9dd80bcdc25b127f1244763644004e5eaf06b095b892bae095e0ba7f9d2700a50 +result: pass +ciphertext: d0f902d86e1ac0a000f40e508ecb36f575902e319cf05ebb6de2ce63e02b912f9cfea50f513a4167a6f8973a656720aba76c83fc8caf1b9b922233e0356c9bc2b0f6fd5f083aac09b965c01208019d4d0f458f321a07197461eb3f71a136ab7fec0d7c1c6c868d6b2c890f09019f5159fa21642f44b8c1b89b9dbc49a0a9d294fe670ba0915a78c4a5a234af77b925e582eeb1437cebdfd3a86c98abd5723bd2fdf6b54fd79ed0dd867c5ff16fcbfc30bd1b739a912aa87c70e7213a3e42218db247422423089ead4e87ba998da1f354a1d1a65bd8c481c67c7aded64ceecbc1a9bf413e343433ba93fb79350187825e984f6e23f5dfde9b56ae1fa50ebd1e6c6b0141e3b9be3a5d1502dc21656d26dbce6eac70a596f23824d512ba86069a2a28182bf71275cad1639e947666a7c71f04d72bcba3036e774a23e95216af23b19d7af41f8db3f725d937915c72591fec65e902b486f9ef294608624d93da1096370c56a7f340629485cf0684e9ac76609b1f3d8f3b89bd20b87ff3805af4f2c62014a4b3f7e25c3cd12f505048464c490363b40ef68da9da2f25ad691df7bd4402c9e2a210a4ac9c2e1eb9f5f787b876e88ddab57ceae57741c9eb633280995ceb65a6871b767bca78b6569aefa1059d16c90a6afea36f5bce1d6928de55c9241c3b0f225ac7cd55b8ebf663b7c298f41c23fa8ccd279845a48e6614d500c6669cdc232b92178e7fd1fcf5b0b1a9c03f9bfaae1a8bdd856d91616e913f82a124bedb501dfb68d91f106b06acb3f9b6d473d8815ea27bb839856be5e5f26430615b97978f6113b042dad56475304aacb6d0ad777e63b4e8bf53a0c51c8e8b911147ea7404ce6d1a70770662b439fbd3d4e4c2788aef534ed19012b9387ebb9be3323daec6ebe149264c0253912f4f0eccce2d4cf5a7790e035c3a52c6a1541a5ac5be90526a5f031403227ee76d0836efc37a449bba10165ffe58f111dee2dfa288d3da3ac84894ae676f265b02bfa2a809fc622c3b8b4201ad59439d170e7022488e4e6cfd0fb5efe962a704905bc389001ae16ec46af47ff3a0ebf900a21fec6ccb754a89450134ef6945be8fb68960174342121c36cfad95025e336cfb15262caed34b3605ff9b305d98e53a0e1eea5f4f35ad7588b4f5ea0875f7a3c35ebd13863b299a05ffa14662ccc10cb949a56573a419bbab7424f7c13e537d497f002689fc6190d5a079019deeb265a238c1cebb9fccff0a3203783b03da50d589daf28ec573bab47207adeeaff281e180dc499d62c346b2485be4776f163361edb2fa9613537adaa4838396e32a91badc75487be6a1345ad93351bf4ba3b46084a2ba9421f0bdd9ef47be8fc22857cd0c5dc6b83e6a7ae7d0026bc61ca0361aff37b0d878400a1637a522a06fecb7be0e62b60fae2df2c7a1e68ec2992cdb505a5fd1ca7c1f53f0a8ea4162639af6ab32414b33cdf10b8aa579dd827c30b8c1780b3cd9d67320a11704057e0a77e998e1e4c12f3e5d8a13185ae6830911f88e7dc5cac7004abbc512c6ca69006b7dba74f147dc49785a1847a919a620c892d5a8ff3bd4b664bb73271d8d069ea19bf0e924e2869688cf0f26c1349abc29ce6b7fdccc1174f1a4b4fd26158b094808fee9d0ddbd996f785e6a1caddbc3293a1114feff09a19fa71f286f48721e810693ca9095d7b3c0b9736dfab4364dc1c0075e3face4dfe2eb1c815f713028312f1d106184c1bde874900591731dd75fa8f1505d816d51780f53b9b759b295cf5616acc7aa02ebe6b90252956275844bff4865637eea40969fef0ca595979b9215edfccaa44e09e67d8419928e09be7eee4d240d24f70db6bee802729b4244c619f38df99d0635a3125e2cc7c65bbe41caf795fc6d474ccb000f54f6c4daae2b62e62e2211f1258985e55fc5942d8c738c7df8a184ad34308dc798f4933031095ffd01997150899cfac81c533e6b1d92002640babf3ae3b73371964dd6dac95d8927ac33c4bab3e7a7d115fd1722b8c625da2c967d29764ef85240cec35bff4f507e3d0a02ec6d26a7ab90b8c50f392b8160ec34ddbd389a15bd47558b5b890cb45aee2e7c9f516201ad9e603c71fb631d0b930147a8bdba49e1dd0ca6fa3a8a089b520726dc78ac914d0c41d5ffd5875f798eafa2554c1ffed8b4e03f316a195c95c9a7c1351a06231ac84ad6269280ecf63a73 +shared_secret: 425ada67204ff5b30a9d1cb545bcb4a6dbbd923cb3ca284911a1c5fe491ffb39 + +# Official test vector 2, seed: "64335bf29e5de62842c941766ba129b0643b5e7121ca26cfc190ec7dc3543830557fdd5c03cf123a456d48efea43c868" +entropy: f43f68fbd694f0a6d307297110ecd4739876489fdf07eb9b03364e2ed0ff96e9 +public_key = a1a341b578b4765c4649e6bfaf5c8b2ad80de5200e4dd30da0b693f5ebbfcfba9f0ad2ad46576a7a06b65de6bcdc432b6a753f3a6326a27073436483aef170b8649e2ca022497329d071af4c25968cb0521a118aec41cbeab013786a1c2984cb2c649da0fc94fdd880fd3a05239b84ac053ca0f822e4c94ebfe1b6d6898da03b02e455467af6c89db7225ad653a5ac0c8e165f3b9b68b01270ef0ba7cc56322d5c671805b7d333b899abbac120c010033f3064647e4a387649c272a32c2dcc2fd62793d8689cf59619f43c87fdeaaebcd4c3f21483863563ce8442a7f581009410b3c506146390fcd44d0f918b2903940a321c66700ca4e205d4501ecec23a4d17157ce4a0bac562533273fb8071ddf960217696ccd98a59e6c39dac5cd185a0793a9190e25a0460837d07d020d72b5c5ba9840b0940832fa3a483aec99d0d629cfd67a1ce77766a23b2349947968c238d0126f6ab9422b97d6dec5657a20a683544ba07971bc773a5da90bf471eaf12310283944c723eb1e0600eeb2464bc71de7233ebfb7be64202ee21088222a48ba200f04b6bf6a1c7f6404295764e6fd857d747cd985b07f4d83f8b13a901ccbff7b01e21b8789c05b635bcc14c8128c379bdd52029efd660468a34512bb78da224fff9a223371e457333ad464c6fdba4f6c5451b585583655182691f6ee817cf81ce6e7a5cc6b9cacee275c473ae1c58aa38e43de50796f22475fca44270e3a46fb5b8bdda74e3e05b88210f54f36e79fb05becc76805b716154a6e2346b0f4cac241748fde93f325b4f82f3b681136aff8056bc7304ef22652f1679c816032bc35db68b64b2848351da88df89166707b194cb4759e6761032aca4b7a54e8064f5755d36288fc5061072da1ec35a8491396c9406446060347361bed860b028b57250f0187f45a204fba678f587ae031ac38480cf4c3fff90188d925bd4c7c6bd0b758698bcde97ce3958697610ce05e4abfca60eac13b666732e8262b36b7447c0c93f91362c519337052865927a9862d2c1ed186b411554275a24dc9738751a4ba243bcfe46109212b711aa453a35b09ba20ab405b6f0f3457321b24017261b49923225b3620678c4f474515396113880df463138abc3e820c65415c593d74c01e5136150b02f1ccc55a6c1e7e9b121588362d784c3e85658532331bb596682377c752e7c259608b629e74a5a470bad77d3c0672b23831a217c1ac82b94a82437643807681cc1684098b86de031440a79378a229bd902f2996f326a0df16354778a4cd5375c756a34890ccf0c92ba07a61546387bf54c2cb0c8548d4780aa72b667c0a1fe400b30f194465cc97ff42511e75457d1a8a9712a6ea971d797baa894b0348561df068a3455a89afc3684081ddfc0a90fd8acbdc217c83398380267776051cf3491542534b1a74b409b69a8a142c1b437b5a8561fb064ecb591b7334afc482af678cfa4e11e970a48bdf822a0b45e1c591d07792884e4bd057a15eecc5cdf66c994cca765daab1af377a14b98bcd8918fe3546fa4438ba5322da1ba75543be245b12e228d07c1cf1091499a2c57dd42c9f6ba3240c053165ca3fd669b4c3944a7d003d016a0fca826b5e615846c48873cb7f222cc12462023e38f14d98fa0486eae480f81a7376eb6380a42a1a2a6123d8a4efb102ee7b900cbe7a9238b59006abddf2ab25565815947b3bf6b14eed43be91a5687b339e6bb6614387583c585f1456372aa68b17449c2a1c6269a05f8659da97585f52421ab74b9d705ba13ac139f15be9f41971e0a6e04ba167be9b681d294c706d0477a22d64565e71979009a18c8086059f3964ed327288aaa0c8a2b2d976d5fbb50b842bcdf3c9d25656ed7224f3435c9bc9b59b17727b46a546eb8553dab54ecc6842cba94fb24592ed077fc56bd5dd2cd798715fe0c513377361d263c6348340a5018b0e9b43e112bb6ba60503ca954f2bb25fc585c021b57fb3d1acc80a3b20ff4555ebfa223f90762e2008ce920a420b48cd8fa9606ec5834051d0904847466564294cdaddb25cab5cc68008f96971b2711ae8d73b754cc8ab2bc13e07708e7b555ac681c0af0961a19105bf62b93267b8c47c73526b8c2d08bb13867be10211347656c0108aa3825234847519a52b6a4599ccac59e10e945eb7bd579e0c98d12aa9905ed85271887a974ab8f04a783747caab69d +result: pass +ciphertext: cc16437e7453409e7e200c26909b67a5b0da26997f8660fea78caec9503c6d1a0faf70f017ba882f42d9f8b72335b4a3a30ca14339fb6f0f291ab81d13f2a18d4197f1d5f72fea47cad6c1d3dcaa6e4f43933abf3be44d98083d4a4e34e46b9844560006b42259963945e99ea39af5e56d6299e4e18b555729a12d16779359375d74ceec3b24ab394a86186fafc84a4dfe20dc024527450bbc57f2b1b0fa88d4a46cd21341c7efaffd5a05da3e35260ebe19d79509fa7067b3a498c439f5de384b0416a437eecb7cbea64a6f4076fb94f7f8dde4ccb3743d1b3dc11f7c866e637ab75bf8099599c0233929519a5297a298c95a1b6a3cc3fbab718f1807065106bb290be1d61d5dcd5f228f8355b47058095f599f9b34a3710464b7e367c58f34ac6cfea3462491c78667cddc66faeb43ca86fc1c082cdcdf9139ea8246b871fb5f18d82776ae4c6d73104d2e4a1a6bb11cb59fd39ef66f69a99dc3ece762f9f4bc2303591b0cf8cde08512ba2f47bffafae181ecb64c4818a64640a4bcca3c13e075e82d7f3604a0714439297243d204d0c99f77c804bc3eceb1197e389122021abece24f1f68b531e3f56d46153ede5a3a9ce28e172ba71b30ae0cc5ed2857286e4d8cd977f6a939af4948db5c89dc19513a21ab4feab4246e42bb61ad21de0d23bd9bc2eb04233a27a81f5e5e487335dd4525eb230fc827c573456e0fe77acc292e5c5efbf38313899d691b21e627d699f50089f987c7227b4a4d308ab2842b52aad8b020f045b437e35d9de9a7c273276af986af87023bd3eb59d34d6216c4e54a143b3a678f5ab5a466a323ae973c9231d595b8cf7285d32653739192f7f9c0583301f87d675384068102b05ab76f59d45d6155b678cb2776115b44b5209bf7cbee2b98bc55fd8cc5049e419b35fc9bf23c118a5f30e017817d9c5c8c8e1fb1af2e40f5087b182cc2d313a9a7defd25ad69fb8d9a4f3b6d0c5f65da88925d0794c99b9f272645e88ee81d20b4381750fe8a5a53d766da8d054b4110bc979f2524bbbec13cfda3dc0aa8417bf599128c4dd8db36eae44ffdf6102d3e1aa56276b31cd8ac90480fd658035190f781c91ea9e4eafb6f39a24cf72096f48530542c4ac137ad4e7c4a207c82905ee55b698c42a84c6f5838938457d577dd6e3640bacc4bbda63cb0a2b8299a3a06b49ca7b91c448bd6b2926b139e3202c94108b0ac240fed20a3d268280d845bb635288a07f65b019a22df9f31b5b4f228be8bc92539f284c7a94c5e7d75933f557000b75cf2f256d2a32e4c53c33419a5a2d71b635257bce405111a95592ad424edbf7c5a5d175cfedb0f51550cbeb07ce2dc5b148e3889b3bc3cb15f6630c2cbb6641f10faa58a945414cacdde1dc9d5c578d526f3cb2e23491d69271fac2deca3d78cd21f53607ffaa9a9deae490f84a110002cffab17a12c88e07935fc95fbdda51fdeb372014016081500c927c227542d6282cc8dd7d708b3e834bd3b73137e11ee50759a4f83b6d311046f9cc198b2b618dfd5debbba8bde77eb6636985238faddd7ab039cf3e7bf1d2bd21596cf6c7ffc8d0a8cbc0b14524fcbc6f3b240293dd1c75d4a7c9f241f933e630111c68483f9bce89e1a7068952411d6811dd8a0b00cf4664518f6695107ecf569a741950cf278d416c8d200d434f6d17ffe98e7eba8ede594b9ce64c3f4763f2dff7ac81290dc18d6d5a5107995bb7569b053c7c643846d5379e71044ebe486ef49e48af47ba5c520af0422a6ab0c82677f62ee6e9c1430571bac6898d3b78d026a04513d036b855ed51d13047ef6193beb15490babe0567b7375df71b2311a501a14a57ff376bc465e1082cb6f2b9bb1b6ae778130ccb7d93db187d6c79fc6a506d8b2e1ed2a33af3901bb5da0cc2bbd04fa0d10c8f3b5c2f1ff2e790766fcdee2b62be2265a40d6687214dfb225ccbe572f586d54b2b145b0b960c6436d3abfc7c3360df6525d10ba48bc5d6fd8b066b61fc151634689b20d20cf958d187532e1208179c563b9f3b81eb915a0efd8663477095a01274b54a899a37d0ff662e8a3149edb0d8e59eb85a95f3ba34afa14c9cb849466472e4c6b6931e9863923b525d40df418a424618ccb46c8ced0010011f1ebedb5e669cd5655da2bf518be53a42d3ac480be0d8b6cfa7665f54547d129aa88ef6ddbd5ca682735fb075623557ce79b8f1 +shared_secret: 2bd0703c81210c5d9bdf59f8cbb7c32e30e042c20743c96c74db89545eba4fa2 + +# Official test vector 3, seed: "225d5ce2ceac61930a07503fb59f7c2f936a3e075481da3ca299a80f8c5df9223a073e7b90e02ebf98ca2227eba38c1a" +entropy: ea74fbc3c546500ed684bed6fe3c496d3b86d2d6dfaf223969b942e9a8c95e85 +public_key = c8016eeae46e2610a5fd252102a480cac2bc6e7860620259e41c64591584f1e6ce8e3312dc8862dd806cc2181a18bb91fb184dcf045b030807a5023c4b3779f14a162e0938743b78c71493beda7826022e78ac100e7892fc104d48e25ce92610c072a3e9e8208c93cc225c916a2941c13838eda382f311a809c19b9ca60f188910a1a1bede4710b6b72127e48a5454a457c8037439572c558378cc784554171f6a0c78c676db8bb8aa380357fcc1f61859b0ec72730c10f8c3932975c70e6329aad34a56797a03c0297fb4aa6b97a63be19f5ca6318d0b2c8b4c6d9ef808ebe364d0a41a82dc768be47f44f300bc9b2e4cca1050e21a9919a9b65a07a6c8bc1ca5622a441117a1749211571c462a40c94c3301081867b3a8957ff45c1c3f7c00097a35af93438d74c78c061c2d645e7f6c3be5fa6da749085dd12461fc517e0c28baf93418978772e4c723c071908915a1a5807050c57d2a3d56597b1e1bae4b437632a2522f314b39fa6ab7a047e12b6502027e334b715b5b0b17bb76ae608acc0250d91a859c8c448b27bf4c44b092350e260b65c20c82588c8c1ef25affaaaf150479e80801c82cbea73a37dd1a7df6d268a9b0c4fc753158c39ea4e90960c20460804329f58bd460a37357ae6515bcd505c7cda55b2669017bec3d51816e7001b0a64837f9e07ea26735e830092a648f828cb3093228b98a0c92656c1a14cb3a306929c6207751cebe31aea4c0372cd5c06cc637dd9b6894f00dcb3796d09ca87884412726a25bfa9bf6eb613e1a2a19a196e1e1634e1ca0347a9bcc96816923092961b69dc0c013c191f7ba4fb0b13ce5555e8c1b07d8568722155287264b5fa990e92603aed71df778832ee3bf9a767fa9e650420a14f5ac227df497efab89511302d231a521c5353bd425306a14b7d2a566ab3b32aacf353c2b04a148e4c93c3e470605067dc7590722c452245b3d750205d2c0aad03b0e2ec535bc6cc3956132e329a980c8495d765ed1eb071c58680a11859c3cc0b1e986486a5b543949643b83452c307df477685a4d0a70a7528a55a997bea46780b26252af157fe5d874cf5c420b5b1a324a932ba52291428a39672bb359abc4b54bbfac608a0135cc99a38e102da3e088e4ec5c47984a636c7cb99a6b6304cb0350052618471f716be06b899087aa38053111e35a95965c04a7c42bda2319598819aa0aeb5c39181079f41982e05223c8e89abbc32fc1487f3cb99a167ba694b0668a5525a88472439c89179147ef831022b45f6b8553c8150e32b5421f75291c830a8698a916406807f201141a0ea1cb28255a9ed709502ec7851a56a86cd3b7f05726ed6a6e50fc52706104e829b02f7b61a1856c9b44b8d1214768851ac190b46b61c053c371a333a95b7806eed16c033790c1563fb823204e26ce3af87750ca639e605cd435024336751ca0bdab99ce5b45cefa04caa29ba33b4998da0aa832ec22551821bac055961acefa077de544bbb80211878c6109b512b6b4850b5a8d0bd9bea6978a0f920c1fe8601e1123a98aa23cfa30090817ee849e654a0387a185171a43047758a578a02ebb557904106eb3096d3c1f92092f02891f1d3b0659f284188b7119c14896688ef2bcc8086c604fc140a8fa24c9595d020269b0355ad9a44cbd803b59010a1b85b12fc785ef0a0789c10b3a30925cf155ae8682859a8f8164cf62fc08df577eab2071db87b029a16ec90303f5b97117761c5f20033110b1bdf7388895b30aca862f22adde6930430821dccb2b1ba4cb923652309b4f16600fc9fbcfaa8553cb45bbb53035cd28526ea8449844ac68b87aa61047b94244f126bfe2323af5f30bba9c1b96a426a1d84c2da35fbc001e20a517d458b4291cb36394cd9a074e51d8a45ce623484a3aa7d575977242aed535d46b74d8645aed246692ac1b8b055d717ccbd59769ff9617bcc3aa7bb9366ba51a736b2ce79b971e0c204ac62fd09755b4e4b233e94a9cd3490f4049ce6cc96c7c0fa1254c4eb67748b337c41c473fab4a944364531a6fe18652856797787c804ce1c59462b8d145cae4b97232440ba99cc3a66c1e019b53fdb272d000c85ad63d686a907a31700fd4a29e5936a53a4f2d2486751851edd1b70115adab07a29b15594566221b329076a5a116676d3534044965014daa0d13da178581619dc06df40a02750beb995480eee9 +result: pass +ciphertext: b0175b6f547277d58f329d3b7182bc9a1d18dbbebfa3a5e24dfb783ca9842ccb7c3b26782f6162d9f60971e78af2dfa1a7d40b181ff92872dbb387a1e9d4b962703c7e42778552093cd622686c4b12842b5edaae5265d802e5c2bfb4f4031609661183a55027b4b4ac735a0c3d4d9a8faacaeaef4e0fe7964b3112877d7d9b1cd8923f30fad9f70b5cf480c83970b0aea28107fda48bc67cc0cd00268037004d053392a2522a0b2b9a08bbb678167c2717d9252f19d9c5c6c5f48068ea0b7bb9f0db9b4801eaa168d398b37cc0032401f808b20c8414e9d4ebbf573b1a86e304cec6f10980942c56e18b1e390d43ad4149fe646e0ff8d15fe8f41f7edfe56211e2e08bae7956015b961ff065c06ec846e1ddbf37e77b7dccd34ae270aaa5f01fd92530da96ba73e2c001c8b2ff8a59cc1c26380f796a417959d18c1c97668fd77bc82fbcbbcf1a71f95ebe53265b477f9eff4bd91dfed2cc4b3696f1d6139ccd74d13973acb599debcb81dc3723931987c969da37d90d196ff052c5a6d223be15ae7dc4a90b289a7e46e964ae3035d73d0f958f9c4955c9d4ab38b085291891995b0f8e3239f1408540a8575acca7f0da5d3afa4359a7a403f7c4e636d7fd1a95b7571e430c9e44c14acc516f3eccaff00e2e2fbe91abbfd0e96dbf74f36675735ad70f3c97d515d5d413780f96fe8da72399382e433c76b6deb0bcd215e5ff4ca04968fd7cc0470c10e5d22e00800069944f2bc6ac4988f6eebd35995862d530f3b8478f4c13b8e2dc11128258901af0e4888b97601dca5da385e9a787341c9d74ea1ba2d28b098a9ce395d1992c5ada71b9a6c1b15e20f57da963a9307a3f1b9073a2d9a990832f16ca3aa50ecb5306bb75713c25798a8cce4c529adfc3377e44cf9f10262c3295b01c5d3a4079bcf7ec873524ee7dcae5f2a8a42f5b43205624463ecde93330410c410dabc0eece6bc480a61f6f52b10ee14c8dcacd6daae06c4eed37e3989432490363282a10d276c484cb1013ded7bd58f204c63e78b45e1889b685fb5b37110b5af73ecd51eaa4eed3525adbca8f6d9bbfc19239ec367854342bf02fcadda8d668a30f709299f184c89865038b445ed2079d675648c73e40d90425d787d44e539cfb229bf7dd039dace2f8eacac46c410a2277a93ddd34de171c93e504f1bc3e45cb468cc855228eaf4963a63d6f8f747ada4928b0423c69adc0f88b5277a2decd0eb1fa44440138388073f6ed52309fea034bde1d1e08851cc11a82fffb6b8f34eec75eec9c6237570861a44d679c16594e4031fe6337ca398272ef43176a082958b3b677f1416a55692ecc6f16a6ed4f9b5a51cf2cc5cb50666121ba01fb9bfb89d1744403700faa063f67006b28d579a685f16a81a5b2e87efe0614094f737c9c6e341470cf4ec51580f1023a14420fdc45f83356b4d5d80ff53c85d32067a40d582ffc87792b5b34da52510629185b2480e841f8714ccc7b5b00259913936b097e0dcb6ef2bfe42b084359d68cdc80acdb206afbf419a5718eb1776bef7aca6950519f3ee39f4021af387c8f251d3913683d1d0cfd89ed5ed44d38ff47009220a5b7966a760ac78012e5bc1f6e5684bf39cd0c45c28e0a884db323d647bb7cc202a16a12484b226680ff2abe1b26f8a74f697e4fd7c2132bb0318dd082d3c7cfd7fe279d1940a4f20854bb280498d0a3c76ac7d9f10b9a13205d278d6bd1252df84e75c914916bdf1e5352ebcda297e77aacc782ea4717f07a1f521086cf4debff71ee155ec96a22fe759aba9c0f282a707a8483a11a37df4a947749dfd434359884b17eaa6616fa80dfed1b62f5492a51bc572392ca7cd0708d37a8fb0185202cf7a850fd1954e4cbe7f2973a2874ebc2a2bc4d1821e2600685c0667a97baf5bed4b7a222e9cdc556668da7703da0f03b7b904f0ae942aa02fd0f22dea1337e98b763917c6fec9b030225fae085e050a5b834054fc69d63f72702b7b6aed8467ab29734a7b9f89ad70028b19a25f6ee6233b1876314c7bddf805f55e8a79edbd392620e1ba20cdf6f78f75d5bbdda5ca4215b312cd4ddce4e5c986c7f03b99fe0c835db9e199493b0d54bed56f5dd1e52afda6821a2e6df36f6d032ce33075088b5d6aa9f9c07090dadb5350408804cfe5b704c3e1f8dd9525e7fcda26c0c79562b670cc1158925552f28be8483310f4ea53df0d +shared_secret: f6baf98028ce4f75cc14f6a75dd50502c4adc4d1377d72671c9396d4c26fac69 + +# Official test vector 4, seed: "edc76e7c1523e3862552133fea4d2ab05c69fb54a9354f0846456a2a407e071df4650ec0e0a5666a52cd09462dbc51f9" +entropy: 64efa87a12cb96f98b9b81a7e5128a959c74e5332aaab0444fca7b4a5e5e0216 +public_key = 2f7a733c9c0d0a05b6ae91776032105bfa99d149062746ac1fd2ca81db9224518a39629a36d043e6a398444a055a2cc28ac785e22b9ada469d2e3491174a4e16e11824d32c33326f7cc2b73d417a7151496fbb6805a79d5d974b12f3c0125b5d7bfc7c6f244b68e2c1ca8613e891322261b4789898a1f858f5991b2b1b177769aca1453c57c43140548452f3053d3b55fd2c3062a0b11939a3c14a81c59432616a5700c775fe98c6fb88c1eb8277c469be42f541dbb79808479e0cdb11856cb7c1cb6a5b865469bba549d73cfe581bee85494dea28d6e96a5f04cd65e561ef66a2482c806e39257b9ba9581421708663bf0b45b4131eef3384eb53b8733c4957937161c3ccacea5cbf91429e87b8b2b6a0aa44cab94bcd02d14cc3932c3ee58b483b1d11e5243fea0d34912b8d45bdf48c1358db3fc163ac081c23ca6c43919a649c33911c5802e2407e9fea350c3b64f302c5489005ec87650de428e60b790489a17e96b9e1fa91b33bce5f4b8d8dfa1610b39fd2858c25b898c1386c6dc021bd3414bf213719867f8cdccbb4d2bdf12207860a638bd41a05b9697a3bc901e9ad0075c080243cc0cbb3d389977c522230a42125b08d41839986a60acae28bda183aacc32dd5cb149af2bbfc60b0d5ba8ad89b1acc0863ceb24faea37ef3f60168cc96d766642f07a116225873e651ef693f2bb97339acbcba301e975405661b2aa523168e06c86f9bcbb42b5f12d79c3c379afcc37dc4995b11a4afc3578a30a13ff57ab87f022fd5c3ac5dacc3462c7e7edab63b889c22e90d685733a1a79ec336c50c18a5fe4408c2c122e34a60ef56a78bc16b78c3c98ed689e0c9276697cdd8aba667109cd911b77e6930c4f58cef1240c1f7005a7a2b17390988924cb0604b4f897d19c5b0e4a557a6a23470bc71db15bc99248d42d9bed4117652690124b1bebb438473619c4919c6c0e4071ca990b9d005eb287b15126e5c3477a98669f0856242dc073bb2673c7c1b1485799c300a0648a83142b95a2377d7e2b1d994209184309934c914308b7371a307a3bfc825958a98a12524b847ba5b61e5a279eb9f7cab5ce030c45ffcbcf919a6ce1059dd7c6aa077c2d2437408315db32a800c2099a92ab682fac6461896d583007b97af2336b1e6d061643c62f0b5122d48a230225128c52863c9aa7837ab4f254f92863efbb3b379f87e40071cb6c8b74ac79af4ec11da6c028f1caf9545a7d0a984bf6ac8d4067a7ff29325daacd3f9470d529f02b00183586011da8a0295b678b18d7572cd4f081317b92c21803f613bb959170ad3a4cf465645d3e5a1dbf672013bb935bccdcea51393bcbe7c975d30a9823667bbb155bdccd14ad3d8b453b30ec2b0cbd703485975cc571530b4cc521693a9965139fca21a90d57397f34c46822ea0e0ca0f56668b8692127bc93322389046c63fd08ff82b67f9778964054b49ab0dabe24628e771627ccf34f46c6c820e9d890b15f396a291a98eb14a23575952abbe46374c74b812aac6b9ced932c078ad3f2a05c821b720305773d070b8c86d7686c53b81ce241586f5f752fb4a2774152638f04156a0b24b3061141878d5759d12f8bad4e98aa5d41895b91e122074b31aaadc30a1dff707c32aa0dbfb2fe0a519b4289942e99754034d65d7b9eb5c0087225048b5a293038969a944725a23475b0681ca2177c5bee023bb7e0abe99a630b5babb5f8a67c8117fecf20c1187c338a97b72c1674aa302c3005037631ccfd51a5b10ce837911d8d8372b9760c0498b8ad8218f832fd8519476ea5673d6659b558895796e14cb5a55e7a3d0b91cf5a6228a3c93175a2ccb06c26bb00d5224a402f119a3a42356a37cfd82162c65953b798d9d96cf4353805ddca537a9504b708d16424a3c6209c2d738e25c357256833dd14375a65e1e32868bc4c4e5e062fb636e27f4c746eaac0f641330d235d909a128c890e531be3e0cc307e632baab0ef7684cc687bac9b966efecb85ed1030a1b1e15b71be5a263fc64c320b145cab657a14c2749dcc9961952ad5489c6485f208933fff0203f3c31eb6a389f072cc3573166b9349ada4d7dc66bb12c18a7d96a86f93883f83822ec0094b24751388a51166da6b24a0b526935817e1ad73b4403aa3b10b5d1822daf198aa848a73c9f9a866b634f939c2179ce55edfaa1d5d48cb3127f0fea3acc7b163d +result: pass +ciphertext: f3637bafcce8675a7f2491e7970c65625bce13ca85362c62a0fb24cafa33b0b388b68b12962765da682203c46e6997d4c9c74f13eeba96273d3fd105352e92fcd8f0a4455e23444811c519dfb9aa9174dc6719a76bb6150aeb243e2166d9a63c6bdb9c42ca73604ad748b20ee8d4bb2e414f7a33337bf500a8a354b56211497c6eab1040580215f002f97371a383cb546b509653ee598798b1a9c2b2391d066dc45c69af2eb07d7eb89c43f26c4e553afe4964e0633c3dcb5a6acac36ce88638c17d83cb6bb90f24434c0aae0f302d7154fad1e698a1769d82ae7f90231cf5ae0fd5d7d02503505b6e12bc27ce6a6283f751481a6219d2b01f2e00fd04341ee96a4bd957d682c6b413d2c53c81f6ecea90aadf4482631a65d393e6a80199477b5f808e83be7eaa7b4439c41ec87ea6c69e9a6ee28fc9dec477d7a66744f71ea35cef0d86fb90534a26368055840320e1cfc54ab65fa7462475b541f19b259c79114da9589c8caf1578e2d179efe5a398936058995701308ea61ba4942bd35b36fc60371888a8663ea8eb456f654fbc51a0f701e3a318b64700bc8545685e5fcbb01034b717b691914fc7de9d1c229e16a759b3d25220ceaf72c9c7b5dba5283154098295a08b95efa11b02d7f65ebc6a3ce97b9929456bdaa60854481c6c3d4b851d88beed43b56b0d65533d55d19bf79ae57bfbb0567d4dcaab2b6cda028dfb140c797fab973f5345a55b8c3d5b10b6a94442e1ced434d1c37ae2ec797acadf124330c9a04977b29b0e76672f104e918b2242e0e4a05691bc3ca663b0327a38bdef7ed38c082927acf9d9dafe917d1f3c1c6b6e590206d12c4b0ad7efae9d4e28897da9811bd1210c19e384d9ea2a0b93605c75430edcfc66782421771774072843f8d4231e3dfbe61c5dfd99ae12d3fef73117d9cdf6e7707f7560c212fafe1104edbfb36c4130941b9d6f5a4d067255db6e6bb3559d50a3cee2ec3b57b8a379b93ec32ccb743e7588a3f6dc75f334750e4705a03eb7d75ad766db7a1a88ceb2e5047342a37937cec465ef93bffed2fc238284d367ff320b466673a01fd485ec23e7e21a814c471fc60aad2de49858673d8a5071d00e4b26f4709461b7ef5a74e8c52534bdb6e80bd4dfe09f2c491b20600235743d61787e93ec601d33de9a1a36786827584cc2f33f04c6acff0637b5eb845ed6ca36bc66a2edfe989d2b668268b78e1ffdb1fe9b737cb576385f2be449fe9fd176736955661a330a6fcfba361dd4935715128227b443518e6a27c421eb653168fcc21cc6c4c268b84da4c1ea3162ff85a3754064f4354026f8d99de2a76c99c52daa051e032e766ebd889d4af961edc0e497ee31021f3a38fc5ad1d4ad465d81ebb281f54b1a8c22040ce0099bbf55c9a3ac7c766d65c8cf0765e850404de6184bf81399795d2cab89cd2b73d747903c52140a90e2ecbd3de04c1bfd82c8ed5786b2a409c608568bd7b773dd6086021e53287b46ab5c26f9c04a3157912b079686b29e527bf65922e3b7498f7781978b12da9b938e4f83f005555a716c494277b1d1af716724d35e72ba387efc5e633d2e8ef015a02218b11be67e7e7bd491c7e9c198f18450db3254934756b8965d8b6c60b65b18c12ebe260202c044a40650714309d39c7f5b7d28997cd9f77469fcb1a7a5bd237693e16e6e4e2c645fdc77e859d2ee580ec4c4ddf475bccd6e31092643e62998dd523366d2b28bf4dd3ef54e023544156f0fc6a86d8e749551098ce1e288a62baffd642be9a2499b62c5858250d87913c1709a9a8578a430abe8819622b1d9e800875c6408356b597c3d9a89e164419b6ec3edb03d93aaec5644d3b24b26c1558775ce5e1773e644bb21412e43092136e3cab817fcf89bea3b9439026e625ca19018dd34028afac0665c135b1f2a5c2e8d2e3e34b5eb7cf947c8aef9d03cc20d6d22075eecdc9a44df411c0ccc3d0fc0f32277251c38466cfaf28ca47824194d9befeac21b68ca89c79c672b21bcc4a676ae015676bcb5a93f6b2f22ea25f4422e2a4ae637217f33345ff381d1f8241c251ef3e4be839cd4531855413e775e81d1c0a2774a68a15730d4149b1749471bbacd68ad66bd50feb37e2d97b73e001776b8b46583e9cb581e7095af3a1ffeed83798ba211ab22bdc4bd80f7e5026a373984cc20af678b9ffaad3be3d515a914c501155257d3 +shared_secret: 52b1d99af018531b8f3b6226d7ae23843ca7b84d8f9cef28ead85ab3840906d5 + +# Official test vector 5, seed: "aa93649193c2c5985acf8f9e6ac50c36ae16a2526d7c684f7a3bb4abcd7b6ff790e82badce89bc7380d66251f97aaaaa" +entropy: 8a95d71228acaa5f9ae6f9d9ca8ae55fde296463b41083a39e833e37c4c90f88 +public_key = 69bc82661a9e822624d2a644e1767de906658569ba68922aa5c18996c58b3325685bf3564518afdbb99aa67acabca017283bcec3cca9075cbcef02cbe57ccfc73581784bc6fc1b8b7623b9255c20f7430887c87a5f6873b8789de3810ee4841447d826706bbe47d6c4bb13380a03a532d240adbb8240847e6ed68eb5abb3452584b949b8889bb77d2bc87a11c4580919931509e8fb931b50957fb00b972c8f17c8be0e0565bd95b16799606b825e462059a701412ac2704cdba91ea269271519421574f807206d8a65f8b67f44117b4c742e7bf4209668cb013975a9317ee847bb09db3c44d8029e01c4ff4954d5ac7557941b4c12c60520785867cef3f77214805c96d8497b508629713064cbb04d0b9abe21afabb10f33eb38b6b3bfb34908ebf048ccb239701944fe64792b8a909cba14bbf50d03b858bf4a318b9860e58141b7f114b38616533c96c4eb25115724e6672ec20937fab6164aa4a9818acf072c90ea4a5ba34cc95270a330e2874d76a5e0fb085f1aba5917a6e6c3a50ae59659d95703d0a1e9c76c0f0055605ac839f70f6868bf0727496f38c4fd042226fb261ce27bcfab89daa192044462cba31297a660b191bf4440305c5235ec225018cc92480c19bccb480d03d08c470ab20c88c7a1b2a9f37dd7b911cae469de0c7f6e08aa9d427a8eb90af2649aa28ccf1bc19c0fd84842e5748f686278631659a5a874377347ea3894b035a5c139ec8cc0aa63a960535f8e3113f668bbfa9a67a82ccb03253461d3354eb81d0d112fd667a1f133c054730f28ab50f54c5416f65ef60b6ce8c86f6608456c819a7e10ba9232322e4bc73d8370874846643275622b3da6dbcaf9fac7001cce6d34565cbc6f34a1bc9ae904c5229320a3755c4a439f035b5f8a099c70a6a57b5e3e15001bfc19710878c5db0930b21f28603ea4087e0b30a2cba02118fa644331a81312a22ca0721ff266620bc91fe318897b77d3c9b7f9986861879a3a9c349e16c72a9b2bd645915fb05a94ba4c57aa72e93c3decc55597e664ae3a683274267f486452e089aaa8679234c2fde99327a60a81e687cf4491de4b90528492b6c46eeb7725d876a91987025af06895279635e98183bb0ef7267c6449913ed09ae1ba77bba0010b03b900863119011b1dd02aa969ba41b6b684fc3976c416342891cbd0588b5c6a480c04d7798820da67c9142fc07a906f2517a9217398c9611b0749f5556821d93368014d9d01cf2976af6bf492e2e59b66d3671e814e466388e2039037313ac690c3dc534ba77281613560b0fc9bc5a298c87b879835b386c6b0e1580830b689e7b005ae950d309c2e264556685c54c606aab7c0318b2c66d4513a707b8b5800ad2ecc1567807f28122525b69b7e1cc0d1646efcc1673a156429a205e4016887464c39a6543e722f0980b81f524203b45deb45184d35351be963d3906e7b0a98b49167a2e0bac9c7a50db62657c4cadf6985d753c33f90bb1a275be17a7342859415f7855384975775cb557a2eb92801bceb7f63cb97a40837ac159a37c2935157160d518bde11c1fbe18c32923d3049b50b50c2ae0a325281c7a4bc32022aa7835630198103b25398d613631860b70a6536bbc66ef6fc9ab856771652689527c5f5db1d1b4243e3f06460eba75c363715378c99019d213732804b31e30cbe3e93c6f83a7ec239560abbbd48d96684f17ed61c9dafcb55cb168e2ba1778ecb0166e7664e9412f4ec7353092fdba5cca4585d173023f1856836619e57b0052b07141ba9507b042c5d5b89ab429b3f237f0d80c5d4126cb4c59d9d19bf0bfa9e3eb42894228d13a05125b36d1daa647661905cb471b08405207469ebb35ba5375a40b923e6b0cdb3f1070bb6728a389ca4b89079467732ec3cd7a27d746850bd4908e401134b650419e639fba07d88eb2bbb755b2a7ac2bc6947ab8907c80a3b5610a771782daf790874563b65a1236baba0b6fac1e5f242919bb4519b637464565467456600882532457e1249e692bb82e16c7f21c370a29453a95600a069a54b0b62087f09ea7ab3da48348257877864cb080f7a39603e284063da75ec0b9219e515021ba46ca8c573b306e814245d45cee5f55d0e5c7e36a31166634e7805a413a062a7b5a7ae75783f97c505daa8f9113507a98a3e8ce6ff046df83fd23815de42eb44b586845b55b2d39aa000ad +result: pass +ciphertext: 12cf783cb284a6655af46ee13c23e89b13e8cacac077ffc171c51c3ab7ecbd38853da0344d2d2cae3137bd41af52c1978fb85143bab78f9595971c2366f4d6935124f9d78ac2b1246d12c51858b51379782d2a7d0d7f04bd476bcae1453535cd4e0c3a19023861955290626473fe8d1b60f077c9c79360c71e64ddd5c39fc56bfe4b85b4f565a6ba165cb418838eda6668db441839f81b0b8ecc56825cd5e64ddcc69ebb9241283281866916020d18cbbb5abf1395841c96d81bc7d4bb89fc62e6c3d9dd8acad7ed67f6ad572a3f8ab67c182acac4d2267e46d8577afe2d9b04dcb5d11e33a909439c444c694bd86873bbe6fd6ebc3c293cedff1fe356aa4715993bd716f614e91f44b19f718a467d8c8d345e9759544c3a5ac885b296ced708bffc6c0bfabe31db65f659502cf859114b3394999406656d903ad8dbb543288edc97b5c5c89a58545e3f650030abea8dafb360b15f95e88d44e7f5010ae2f9b111daa6023e4496055371ddba9a83db233104348472056c4c6f50daf5564ccbdb33ac8f02a176e9fc74336f6c0d0eb0f7f78d55f052dad641cf97f4681baedc52611db70a0065ab680586e4dc6827f4e5a913ecae5627ff7b2cd69f253b1d6587f9961e61e75754f3cde176107fed8769898337c84d446ce33dd1767afe323d930e82784ceb7b1c38ab00192738d9bda2b21cb1a14b71a2aff00fc778200d2bc5487d56e88278ab4d6059d8501ed5cf53079826c66af26d59a9ebf8f102164942709736e203a745fe7784a03abc0a776b18ffd23a81f79d26e434a2e99e65b25c407c2d1891809527412e384523a47f3990bf4fe3f9580c0dce5c3994e5c299bb0214516b73e39062f9054f743541fe824840bdd3631df12fbbbae6e1ddd98dc320b9f3d0645ba2f7a32eba11ec9049cd63cc90d9164ed92b945b459200a9fbc2c1e346c88b975e4299cc5a811f88f9ce9633695144495fc98ad1bc1689b6d0fb5b4b9e90a7a5a7ebe2c6c6455f8c4945e34ee2b70e82503f4d3161e517e09ac115f5c0398fd043b2c8eb18a5aae2d2891e0009c5bd9c18c63a8914ef64e4d9de132ac55ff9bf24648361d3339ed8541d3b4543b754893532fcf648f49532382a78fb037d218756c012e2aa99da5a77328c13fa1588c9842c7ceb2318f7c15607d10625f78dbf378ee1789d6885adb50f5c334a768f45406d15ae898621355b16dce505877864802f532ffac78e8cbfa920bab7f1061cf11c5326372506ebf554987db1f59413611c9c0373345be3e612b3581adfcd328e283c1f8881ad1c09cef665d1e668047ac2274ae2fda0c7045019040875de7208ebdf48fa4fcfe533fbb80abd5db7b06fb00702fc440dab58bc46a5627823c55e39a5a3178e72df204f8346c9fcc7b212e81d47d8c571fcfa257a63f75faa6f50f3957836d1e0b41e7d2daa533a8852f1d4bd56afa2c189d4dcac7df6440911f87891371ef9603d9df1fc3859d549a2eb94ac3365acc0265fc9c2686a2e36fca53073ee1b65bec258f4dfc9d5e341cd09a88de63c15ab953ccaa12714488e23b6ac383e8b1bb84a9c7e1920d080f0912dd8cf222ac1b9acbc31a04374ea494ef68283ff906d0ba6c1f63071a86dde361f66bd4f773d43f3825f20c666899dd954043dca2997533dac459ee0fd602a1c564637b1eb7f6f726806a6d1c9e22039b85ec37d2119a31046487e21395182345175755e5b3ca698d5e1f114d66a67353e232bce7a0f9407909b0fd87f7e0ccebbec2a51368bb3bfa5bca5e2227b3abf6e7d0690f732d708da63dc58b208ba34c91bd7800e30a5cd653b09b6103d141f4862e41a3fa88df43083935d50b85fbf4708c96bdddaa5c0df9b63aa4517f5ff87e86f5e31ea9b3ec0d3fc4bb79910da9605d032090787c34be9613d68bbe65dff2acfc4f89259fc61ddcf41aea46106de8e312f1432c838d1acdc98874fddb34610168332bbbc9da4fa8d9f8f41f9d64d384cb7f1ca844197952b5cf69c3f6aa3a981418b9b41571b1a60ba7a14311c5beef82f7faae76fe3c6c9ac342264d3261772ea71d785189d3a9d8bf07efbb3f01d84da2498fcd3e5f62d8ba41d5ac481719200002de59cef1b41439715d5b7e84f37fff645e067a32db5164311f69e1d177e42893aee3d7478f52470f5a62b37fab65d6b960651db061d05b3969f82531c697011e4438f910d +shared_secret: 392242412070b869a67b7ab071fd796e83b4e3b5af669ed7a8c4fd1d8d3ecfe2 + +# Official test vector 6, seed: "2e014dc7c2696b9f6d4af555cba4b931b34863ff60e2341d4fdfe472fef2fe2c33e0813fc5cafde4e30277fe522a9049" +entropy: 90d79d75d0bbb8921cf70d46bab497022a8e750efdc99e5f1bae653275441c7b +public_key = 55f39e77f0722a726811358dc0f0b76aa90aab8c2dfdd3a4f3e31cdd076947d2b503c73b8805b26d6780d75b86d5f3b50ba899bef229beea7d18fa9016878f3aa8ba392a4b42ec4f92f42ad08ccbe58a18bbc7c8639c04016b9c663ca32ebc31fc82a138970c0cd238b6d1b2f2645fa407504183a125b1abeb622245886b9dccb9f2793147a63227236c9cda173c0546739bca51ab24cf3287cf935a8d870719a62b71728fc5e262662296f9984e485101860679caaa02fa1209e7703e0a5678c496a401cc5c1b834ae8c02d2a61b8c40694c634c80290a2f5b4a63f865ed6689a54201589a3384acc299c054d1cfa25be6ab278530b93616efa35cbd0ac8fd367923bd89cfa828f1e8a10a6d027ef2417422a491ac1bdd2702d688809b7455824ac902a70b06d54c92d73b2047567a25336fc74a6d8613d6af0a51c0645ed30c19f3231c147ad98e0276654b9277b16e100a2bc1327ed41043b61900d48c1f51c70725133ae31190b90b43da26335a323c13652a04a2e084827f190915548acd4d96323b573aeb2633be0b3061544cb6b80176337adeb4c5eab7c55bb612e9390419a7598dba6a79523f5764ec7fcbcd31b85c41548e1db0cf1aac1dea8031b0c3b9e629b6b9c06ef29628afc979d303355fc4d1a480fcfd0bdd9c04168e772880a4a53d4182ad30b760c89b2787691b40eb56165f321691f3c4880b20a81d08834c9b2d7b2aeb0e537f5ebcaada992ac0a3402e81e18aa1fd1391f00fbb333d46c7ae50373eba628685d15cb1867b952ed05bcaa8a7efce7c825ec58054b2c84d5c69dc22c219cc71d5a92230b9f40f633029c30bc6b266b37bc5e994e14f96d4c568d83db3491e38ae1b4a320d831cdd5a8e582a1e8a43153c347a3c91919ba60d18490baf18ab8a530066a9c35cb7e05915d208294059b161b09a0b8b446c322c9bd6160d7413974a1b11d0b643364432a1a2bacb1c0d70c642b68811b39a69d44974b125655a64075b35cf9cc0d632493ec46307aba8abbc1033eac4e7ad3329c246a08294f3cb141fad16f10b6804f70597dd6ac34b2b40190c36e17325742a4e9386c08b69cf1e0124bdcc2cea6ce77b310262a71ff7017fa1b70deca96dec183f2981975036117656955a5c4f1c674b09c1624c0c48ad2c2584968f511ba5d070ead9c7889e79b1e123c488349a1f5216f351070bc459f3c8cc8314e16b97266d37675b809fe962914d924d0827cf9b41c9fa169612b70ade609bec43e04345e5b97c330d9216a5a7e42632f09e95469e9b3422041c3119de5e845d6e02795806aba9203da928201905e2fa82c6c7229ef074a230a05401cc9e22076e1c372e742c8eeda0fe7aba76ce5baff468cfc93482a1ab5957cbcdb2295ba074038e539be24986cb8297a536fd479b42c8973b7d03d71d74346625f96234b32323b17c3769564a1a82378dd5c4d23a551024c3468e50ad5b97ca5641272711ff4464d62b9619d130de8491430b5ccdbc928b7e411fef80fb942ab322323da20cdc42b5d17a9406e3612b7970b648817e060030d338689665d3aa7cf2b97314f8237afc890b10097d8f304a26b9664844784ac8d00932ed8b32438a28e5b078484b5324d976422324fd0f217314102ea587d6de84b482992d9e6a6cdb3112599942fd76434390c060321d326bc702376d466683ad546b3bc2e47e4b891f3b7d584375dd3859ed58fe94255fe421bbfc7214e3abe265a1465e58c1067bbbf214db3a94c54876725fa0fdd048764921d5b6ba00c3382d5064baf295b30029bf27a88f8f630d5558d595549b65201793229ca2647621648297a66e92917e409cccdf5cb1378b906c3ba731355d57cad41f6148f7a706f850e99e7610d2c78d45b9f699926a4e01527a1a49886ba5fd25ca21c325e21034246c45785127f4859c0a67cc7b76259410b2f408f4e1569c73c54a4da92a40476402573a2973963406290549f4a41a2226131251c5d59d85e1d5123d527576f7c794842974d884e79927f7bf6b09b752cbbfc442934ba461429a3ea921aba995ef12c21116cfe66b132402bdaf690ed95483aec9785e6989e934e7858bd13498f4e994619ea9cd55a9504e40b4d0ccbe8f8cca1f72dbf74caa3975595623c12f22c120c022b59b2cf3748b17199c44cd37f8ea61ba5d8c1bbe50789ce915df9fce1b4cf3c5acd7ce52dfd +result: pass +ciphertext: 1a2fcfde856f6d8e741237c5e0d0fcd7b58c9886503131c09a9f5db0f76c91349fba53dc31df528f684063909218140888d39923b52ea6b06e55590ddeba2b8173a2945e40c08e965780b225caac8d2b9a66eacb554bde430120b066c6c57ed75b0fc43c08fb4491ea446daf15661ebf4843a22a81059a049fc4fe3d66fcc103b7aad3780f9e21479b75a4f5038a07879ef64d7d12604db56b1f10cbe6ed755e1016e803cf83a0fc5d41354d68bfbf55d65d6c2ef32dfa88541a9cc13cb2beca4786be168e6043afde254a060056259afb94c0e858b59fed243393b7c10c5453852207daa69891bf3054b3af65449bf7a17a2222dd348a06db881cc12c29ac972e347eb8ae56c6008d0ca4927ce7bd482157f123634941db84bba10c7552552362b1d8d08e552f92897f5a75636f649609d25c2a83541b6e3115dffdace94c947036866e22f79b59b7b246e5622e21c4f0914352e09a5866b8dbb113c97c0921ae3e1a1ea0bf726805b4606d15298df0e32eaa974584909ea709b57f8ea6047d908b95a6db05a47b26de1470fc8fecb7b7e53851f732f55b0e4b1c8a1c993bba9a7d22f125849511f124478d468e6b8ebb50f8d11e0ae7f6217e19ebdd57125c04b3df9c1ee65f2940a8b8e24b0a52c012e5c9e2c09103d97477ecb033d7dec5d59fede37c6f95283ef76806926371562cd537c19d6c6fae9bc88d57ea5eb1c8fda0bb8803791fe072bb22f83b9eea89e5fe25e5ece6ddd7764e2aa8cd293b5fa1acf2a831e4bd24e4f91ad27687515f90fdb378c4959fea17ad2ac14721734aebdb0558fb65e88154d11487c89d9880041968a963aa9da09e64521260132f82e39ee1d44f8bacc3c6589af7e049996494790f6f9f5bc6e2fd5518c145dfac55fc339b279552843afa411f6c1d48a940f0c5ceebfb9440b46b8bca9e5a9a7373dc1d003a9bc7e0346e93d440a1ec63ea44ef732b0bdd62febdcc4f7a1acdaf487855e55e8372f6f3bdca58d3c8bff9279e9bde009f1cd6fed525daa609436c55048c06cfd32b5aa0d5d85a607c28047f1f79c74571bf8fcebf00ada66195f0118975f99878fe53bab4e80fd4888788401a5660cf2c8137c553108e1529e4e19932c9d373e72898f5f3a5b4167156834ab1f125a443feba98e898f5336c45027c41d5027e7b319418a6b96fc697450d60a4d8ca418687fb513d53343bebd575b590b1b608b262b1e0cf2e4412e4d659271198c6d5e33231a9d5ac9009b3b275da170470950656844e6e4f7cc0582c9e43c9144b4910048e90a0ecaa92d6b2698914b91c5fd652b1ed6bd624341046c5106e6ee7b4a13abf3e80692af298e0346a383dcb833f615ad69f87fbd1b4f72cd626d78f5bf37b8bdcf76ac984a09ae1a78de07f0e387e455f6e16f37e3ae00a815d997832a86eac07d54767b35e1c426c0fa4cb4df76272045f1169d1748411fc6d79a45bccc476b3e8967981fa9128141b1c85f591bbc239fa68514e65ffc56973028dc9661f1a69e67736ce870eafd4c87c5e2cd3f914e93e5262e8a7e8489b0fe0fae1f238fff41f71574d115be7cacdf1bde432a1e58f2d333860a6605469b5328ef8222ddb9224e1333b260e30d90b75a03dce7c3e4edd4272c3cbef31250c04544fa97ee7a399058a6f230b381215186281edcd6f40ccd84aa9e9c7abc0808dad707bcb93b6cda47d227aeb88930bf68f5723aef9e32e960015dddc944503c131e541771f131a2fef3cb9ceb1896ea98573e2a9f7613c7665758bd3aae087bc574411db82b3a4f7bb71e869ca72a024bac17f41abb843551a28cde20598abf81a82d20d4067b9ddf14208073444755c8bae9420d9f4c1b72777410cf6c10cd7944a158bc636eda4a206ba4a18d3f149af59c5371872c786f7b89cb6b8ca1515250202303887217d7c41ed5ecc66a5528a072b1112165c6339ad27c4ad7ec35e04dcf925903e0ed6bc2a3608c846908cfd0e5ef3c7b2a2fd66d1c19bd79f8ee3ebb1910d010879ade3dabb9cb531247c9c881b1869bfb82e291da45c7896bdcedf7ac87aa72e6270f39951261d5fef37aeb39a8c94f62c78a7cbc0b2a0aafb2046eec47e5012ae49bfd41f46e5428cc90284cf0600a9b9cfd0968650903137ac5091da2aff756e1e39ef133ea7dde4d8ed9943acbeabd396730cb96e3f41e3ad13a94cb56ebf13d3e39597d65af9 +shared_secret: 0472c7777196fbf335dcbec891e291c5666791991a332ea676778e01b7379e72 + +# Official test vector 7, seed: "aefb28fdd34e0ab403a703b535296e3a545ca479c1d8148e2d501b3c8dd8b1034bd986f13f1a7b4671be769359fd2aab" +entropy: be8a32f97b9a8d596382c02fa2a0eeebc15c083e970ddaa4f2622b91d6718663 +public_key = 07f76c0d2245fe775fc5cb525824bf945b31bdbc0a86b88d8827ae7fc0a3db8bb9f534a21792637765081c4669832bb66485133f61bc22c55f03b109882b9ad7e75fbf12519873a18d9472087a6fb375244b313f6a81b608d88b0f79147282c9c37084b00138e8bc8cb3bbbd2bf9c5f95766040617962651f0556756bb9121a6bf09a515c6836b650c44e9db72cef47e08079945b8cf19d8bb25641186a8c8999103898492a904c5a7f2befc1614b4482931989ff7fc83ab40781ce54fb51866706cb04ec2c1c8813e963c70b0f15567b41ffdda8d02a94d00d1348911be52163f5c44188b6214856763a409040e8480c0f263d966a99ba7c7d5724f225ab99327a962d1497e9b265bd819c2959b1cd7995d138b4d71804fb122730b6133713d68c95d861a3c567c803adc403cc911186327e1726e2881bc9b4b1873091637c5532951c0c01a0999e7740fa77c1c1c847feb3dcd387ba3974e1ad0310f889d05e3508f02443491261c367c94e074009103e8bccf25520c4546c4bcca7aad34aac89892524219ba9b715c470c72c6c67811764926335f722c03b85c509105d6f43f65ea9908d4c61f7947cf70c4ecc08da31aaa6ac1887bd388720cb36e10521dd88d7b2a483fc5833f8694be9892bbf8bb19b6ceb08a133f037371f287956821014b58c6eb9351946303a3b7fa920e32a471f26a18a0b939ff137927c2a79c27a991040fa0d29b5a89124de37fced8109ff634f6313551140a873a6b76245a2538aeba7a234845cb4ef0c9707a4c56f8baee1329864591d09745fec24b1b392f86c47c38a62b613a8e6dc022ecf58d7d81c0f1e11a27296290ba0cb5bc04516a50fd1361c248ce450b54698c28a59274204427c53c68b5f73c739a62f9d57ffbd17f18c06994f0cc58f0979646a7273b9f0d3493db0a23df085524845418695edd526af36ac6b0b4c3346a2f61317ac8e93cf54351e12a752183c7adac04c3a943c463599adb1f4dd18a69d6a933a14447b73c2502374682c8209706cabba3a2c27b2a108ffa23a6b9732f5bd14ff2ec25e9a384a8bc83855c043a372687972112050901f12b9c0ba8ae7676b1446cfb376b1ddb89af260007abb736b5b223044e73dab7b3566c7e361c5eaa54978a6f3f72c31bf499c0854e272005ec603d3a50426b24a35721c0f1613d55e68e92682217401b9a21af9296989e75588143495907cae38c231c7521197258ecc60bf0409e4729ce5bd436749343a449a9450c5b2af817db83210f9738c0029ba26835c73c4a2b85255b42af98703d1d47106e2b3bf3f6c90c1b0c88e40f13e18f4870aa42555c08e00aad7760321c6fa8151768930cd7c12d1b6149fb679d35e981319b566108b56b98cf1efb9ecb9a3efbb6ac471c6f0f207569eb2022ea0fb0048207e96a7dc805d0d07de1541531848d670817463bbed673b5071227665a157bdb5509eb09873a00b8c98c48a3c131e029576b76f49b7d0152bceb0bb499ac6bece46f54f16b5d7414c8bc27dfdc9948077c090304acd20a4955b350f22253576780696aff4998daab028632ce4b3a372fca46b0bb33f23a52a93c31dcbba882a925c9c6c0c4546ac152a0eac489e9b27ce9c89aeab652920690b6b9944fc6b807d896cce9bf0a0908f05322e184bb7c5b2a4d7459ea75bc700424f884925a2a83cc95241e7701944ccd53271f8b1992afac3bd3f63af3228e9b84a5d1a9483d5502dac28f992531ece7ccec18b14bac48f1f62039861e90cb8ec0681d059788ed147d1e10115aaab25b6b41a66a5e1388557ad56eeee6571ef418a5f0b797352cc013a1176c3b131b499008319c121185a976c5831bd3258b7bd7b3852aa12fb77e9db085389c0a9e1033eb224835d4793c8603296c965bbc699f87b328db504b335fe83010432a4ef2a0b0a4300e29309e3370660f9b21bbd79382970dbf4750b3e142d5f7c381030901e7c09218636feb3062d43ec75a7ff9a640005c1f08669c50d6a41fa86790f2bb41e7cdb401c06c3c035fb812ae2013604422a7e3c1e6aa437ac4261f7834fa95be9e71001b65bd2e0417164142f2bc80366a8e5e1ace65108771b321da81100397a117f00515b6a2c934599416cad1d5091bd23708e45eb6f90a2fb5c47c8c77d6e395a6332a45f4178b0959466f648ec5c43422397d4e771f902db7b8d876a028f1708e233d +result: pass +ciphertext: 61ffa8da30b8111f68c0776905a752fcf8f1f80af8eabb1615649d627412682dd49d521db32e66c36ff89bc7ca88249eb8fda2ff7b70ccf84c79f851d0c7179d3f2ec1b53771c7ca92fb2f9ae2b11d10696a6fc3be2b07fe57b634611e7b3f5d940dc0c9d8aa9a8824b454166c71e50b391ddc109647b68d12e51271e24f64d2d58a6f0567d313781d2c240da9eb8354578c3288eb08ea63801d5364e2802179087c32bdaf8287246ab1a63ec11dab95eaf2a0a41c73a4b5cf3105909dacd0b2fc166f27a287a6aeab0dfb2447a707d880fcaa73f6db886a64e04e2d3a6a8e95a995ec17c39931abc21038efb704750c58db92a20d06136c5fe0295711efbe0cf67b9eb8c20825a77e840dfb7126a3957784e7a6bb17c1cf75fcddb167eb13103f51017240e5da251a498f34edcba91030439821767f969422ee72e27e83e64ba70bf74749ec86c7d6dedb95533e8e3f749650ccd1dbc2e13522fd2f8c70d8a8ea2bcf60b66043853f787d0bed1dfcb0191aedb50585e60b00332cdcc870b467ef5d5d233b2005affcfa5b38ecce4402c572e6b22d3d7535449c8073703d663cb68a91cedd532bbadfdb8a51400d478e33e5c8ff796977e56ecdf74918616a435c3df762f67c2d52c0c332d2498ab4505e2fb5ceefdd16ac5a49919d11be701f476be075e9edd9152539d08c842bff9d332c9c0e7c50c352c2fa96f2b3c50b85f61bd4c21069ce034f9bc460069e7498489322207ce5b5039243a454b9ac824a250fd9b897e1360b1a0cddfaa2544cc09248cbdc0e511bfd4b145e12c8c29b4ee81c3fb0d0c970116b1d0e773f463946ba0215e1afff098fe0c47d9e27439139c7210c419a8e33e0a13fda22604a72872d6dd55fc9be361c299cd32cf5e702967d7c7be8372f6144166bebb05e636268a728c1dc562bc2acaaf1194fc53913ee49be9e297274e690da76a1ce422bf60dc5569faeff4c134c6a72994e441f9ccbe2be5aac361b18ed89ca8ffbeedec74c3d6a3f47154896ec2d5194777d294e9b2d9c23a9b95d3d32800c2b53c166abe25e6949e20fcaa274a792ad6a798a3ef1ab454f708075c75352a6232c5943753f2d164c049de891ccf7e2f0e7331b63f55755566a31f8c8783b6d23c04865187e8a5be7d50c0ab3b1a08bc0b0c8563ddd763a27aa88b67430c5b96fb35e8230c77d0fc501266329c454b9af4c1717f30f145b32a576978ff8c177d738c02980bab45ba5d1932ab73dbec31ffc8dcc66b79b17e35d1a5ca26d10b7a95e859e4266cd8bfe57282f47ef22965e8dca78ca6e4d2f29b036b86692d425528c01f14298069ff40a423cd2011ce382b06d8f6a6b903fa2375a9c9e1123d6af61e7117c5af42907cd3fd04659b239c64e8034cdd351f0afd0de22f3b8108115f9ccb0e977c7fe72a62910bccea232d018b0619eba0871f3b0f63dbb70b852c51757c7da18d971406a86a023435e4fd726746f7da90cd78403410636ce370ff08f716985d7b61405783858d9a8a93f8c6c790b276379003dc2f731694958fdde91147f0dce55060d2bc82f12fd59679a4d5cc7624860aa953227b602316fb8a8e7f4ad7309740cb86866d8748ecc7d46acdb967ed1346ebf98724d5308128ab8dabb6e7a92da6b34654e9f5c7dbc56f2de6eb26a411ea831fdcef744cecf3d736bb607e4125bac94f6ca0d2fc777558be89c2b89cb99fbcc2d213ea8639f4c2d32904628825b3fc224f107b78e2ea7cb4a18e6d74a67d9dcc68012b52e89030b1e425d3c09860368278b27fc091f4bfb87a118916d82305314167c2dab043b3e24570e5a652c4aafaecbe625f7763a4642129b20862953633f8cfe5dabc9f83b8ea99de18aea3110d025e7ba3c8ba128940747fce99d0eb824a68f7724fdb51a721a167e8e791db9d9a1e10e5fea66f981d2e0f33dab616d1037635a1c36bf85248643e5144e36ab80b759e693d09c1cfadca3488eb5a6b141b55e46358414e8c0755f2b5edd91859b02fffc3f1ab9eb6569e076bbd5bcd0f2fa6d97a95b96b9cf21f31030b36dae0115cb6acb43ecf9a59cc53dc02627d31d5f17857061491bea48b0b01d2c73e5bf8eea1333cfcf247895347d7e473a551307c0f77b3065335592071dbb0b2a56fd5a52323651999cf68efed856860a5cbb84bf8783b790e6a5833f70aae68ea0bf8d220616e1c4b40fad5e1ea5 +shared_secret: 1518e22b08f28512506461e0c46e60d73f7211cbba08f2880fe612817ce9f933 + +# Official test vector 8, seed: "cbe5161e8de02dda7de204aeb0fbb4ca81344ba8c30fe357a4664e5d2988a03b64184d7dc69f8d367550e5fea0876d41" +entropy: da2cfaf69e25b2a89ff2557bbb6f69e01d8e2e7bb27a7a1ce7e40fead16f33b2 +public_key = e4f12b6f27cc55032582857549f3ba0d6bafeee47ca2e2cee04b023b066f53f75a5dfaa0aca416ed16cabdb510564738aa08134346757f92585ac112c25a6e0723958b7b23bed41a126617b4dc30de275bce903a1c6c2a28c5c58c49a5f0c447fb0c86f5b6a6e9d271383588ec398fe6928f04b67ead2633ee174564cb2115a55d8a53971e0c9fe2a209f9c8745467bb8d9944e6c1bbc8a54a5d28cf82e8815a3615dec5695d00c0e72b2f7c483f72d36d2f091cd169311a283a42d608d0d66e020172a6a799a66c10aa9b93a9dc5caefc805cd77d567390bf017693db8b33392bcf96011dc88287375bee828341e5a515a97c019895c8e68d41c0675723af42b6a50da91d04c9880d21a5af9929362411f5b36c75199211da655f454539aa399ec276af29011fc2b5e7f5534461220ec3ad3869178109a282e8a960b6119d0a4ce801d05150c636d20d70dbb092999bd2ab9597a0b1de56086c27ca8f5c22b86995e5aaa9f6514323a31750eb794adc1ea1247317f82eb443604ff254e99a895436060291afccaaa1fa26b20fbb9f48e462851513f7707a5c3461e3f4b3b4e72ba3089c53fb85b9c0576c06b2dc832fafb929c3b34de6974021378356fbc4e1282884d062b831b9adac1eece03f5be7c9c7e8b69b1a7a79304842231f0ba1107079416b388a074ccddae26b4d22693f95a8bbcb2f3445ccf74abb702428fd3a04bea9ce55b6c251c57b6ff10232a6a85832530835883336a10992cd30144b757ab6a6377389e36093e218bd09cca1504400a7a473e248ccd40567637183ccbab9bb2dde7198abf35df8f8c836e1bfe061448b133898fa6ce3abc79beb4ac8d9997c12588c908aa1002b2570a64654c8bb3c1914583748b95d13f9619659ab4c8687f872030df926ee04b6a74047b995625b1a9a929a7fad134f989c7cac25c42817bd9f45327725474a629df0944f5fd3bf06057355f2843e8157115361cd627ee6d548230a89ad49bf1b156e50cba74fc19a63ea2e01796b6ef4a37d4212897346da865f5c36cc49a6954a8a868ae195bc4625300716d3b3692e683a10d9192e2ac5d096c465126730a9b72bb3a729a7cf39922674e39900dbbf91b2785e301ad8a3843f875361b5c4ee0953ae34a583b36d0f54cc194800be6b0a6465479c51999d5029ff50117d5498e8c6a0c81bbdfc6c220b21a310993fd5e7691834732e358faaca460fa26ad20044dbb7177c47736c412bc9011f09a0ba4d22aefb485a524bbb8f74bddcf78358c8addec550b86895fc3141682c0c323210ed756864910c9446c7d9983cfa98ce9edc644967cc93b7008e3c9166ccbffad008cca6569ae913e7327c26032744758f2e82a70f8a399ac72657995ef2754e3184c263ab93ced1510bba1d0838a13aa2cb9d7a25c236a37ec37fc5c0093bb47dace9944d077f5c837d78c54e3fb1cb0e8a70c4a18b6e8b95f6b7be2b79b802055ad4ea5febe770c39757ac42a09feac48b6174bee79621bb3af7d0a0094895cc8b6aacf722eeb76abf6b6f0d66bdc545c68c845b22cb167f96a0448b0cf812c46793a28b55a600a1431374b570c93d6dd7b4f789101e578e29d96b2384a8e09115f9e1c8dd008d0047926c17285dd996690b4ee9957cde5ba56451bc2de46371738e65744fbbb558537b33581998dd0525ebb9c17d9777a701a676956a03bb4911070d83b603f5169f66838cb671627b899e9706be9460ccbda50135d504e2709ac31c48c4fa67eaa740bcba4173ec25fd7766bca198fe4122fe93be5b646b1a475c74ac276bca3904a7c119b057dd2bbade1701ff249f484a4bef04392122c416aaacd5726a273066fc510f394903b5f34860206d8c45a4cc340440179694223b8eb578c5bac2cdd183507946e3d02c0e219ae33008e19822d77acfe5c85bfee7a0b6aa0eada58ad1ca5ba1e12ac92063c326ac4140250be091b2095f568ac7b483acafd7045a229954b8583a33376ca7b19a948a10c4a45a5b80d403c89773b7c2c67ad1358bf2900e8a793dee71b91c978c389b4d8c824937e921a17914c6d1a4bdd6460a2c7cac50cbb2f006ce9c98c7a3342f9acfe11094b249870afc3e15800701d606471a7a0dfcc073c277bb74706e5571f81cae7331a7d1e36dfb437d7d52957526bda146bfa3530dfc93063fecb103ce58c30abb5bb70c6dbc92e5f3bf4060 +result: pass +ciphertext: 77f22646c2e9df7da84340db963c6c521ce4eaac3b2ee0b081f60f15ed977007439c1f2c1a434a753885d909ca9397c4676653626ef814145fe6316c30fdefef47778f3b98547003b3d3cca6351d35ca4eb5504710ed90fd32f0b91ca9947f8521b567419646e075202f8ce6c2d06e8e26700d7dfb2f29a2c1ab60b41aa56937417076a5788fc5cf1dbe371b20019ae99c33c557db0142443e3cb2587b51c8839e47060dab64d9f1ef45d2d6f49a7a586f9d1838efb3c2fd1d733995f87e2dbb324781e8086248024efd5a916ba0eddc2122d362328c4fda90a294722cb1b547a78ccfbebd6628cf16dfbd94c8fa743bafbb825b792823ddf247d72db72d9b600ffffa0df9e5a45bf62e42fd3f46d93d4d10ebbc39851dab8b2103a3c643440a2897f31cb12ef49dbddf9250c16c148d05eb51874b214bd400f959ccce73d41b3e0c1cf3696743d47724f40cbb1d6d2f1515a2df9d18859628fa4674c6b1401d03763f9b2ca9de2820f0ff5d65f25d3acae5fa0b2d2b970f50fecbbad74f91dff754543a7986666f123faf6d32295b1c1fe950d507bf95ecf966eca6a9abc98c9b08ae039f25ab5f7835e533ce17b4cd801880b17c9bf942796687fc3ac888578f3d21be15d3cbef45e196a81a19edf3d87c818102c696c230dd028f5d89bac044c02b0735877f78e6e84c6069bb6c6624c381f063fe3613ff2a1d2393c4517b8658d3a4ca568c79b6ab1a6c8e06a9fcdb3c8e15d679df23187452007dbfcddeb1dde7583293c98ffb87f83c4626833d941b2eee611696763d9779c31ee8acd31e8382f1aae2140972fa74f9aee07d9d83e6f2ba707401783342a8a133f57caf9cd88e41ff752df945997b7ee91c450758a73533e83ff15f6f3ecd72eb1f33abe1651cae93ecbf4c28fb7b4de4cdbf957385e84a19f0dae52ba23097230f4db6bef2cdf6939494a68042d821ef4ca2872c9a13ba4048e202ba5ec21a0eae5e46e20829dd889051910e5df7d78e7c0f24d62ea928ecf5c952098694e7828d59d3bbeb3394e51b634cdd39f4f6cef6f02a8d49dece71660445eab37573fea3c1bae06a9a42d42beefd39b9a6576fe290483150bba21255eded67cb351338e45906e80a055c21ecdd1e51b05164f01549af64978863ca3c5223a614a8d4268f3b515b680b9538d33490c1092d86af2aeb8e9cfe4a786d69dbb27ce746dc775c544fa4a05ffed255cc27926d6beb5e61b97c2711c7abb1c2dfc340b89d8a732fa6c06acd53bde442c97193cf60e1422bf32679d20417a0e56b110fbc6a6dbcfd4c56fa7c7f37acf042401a59f0ba1d8b87c0d3eba3c7f058a45be0b4743a18fa88dabdcc198ac263d9f449bee8aa06967d007be82844a9416d7c87ea940c1874fa99d2a83706da36713ba539211152dfe78169f39b0e74a8523e1211a102fece7b25e56da3bc708686e288415054d9562bc326cd54e564c57cc9bdf19462c1f7c7e04f6202d888837719192db89bd81f3ae7e5bf97e38ff27af9009361e6688b2316790a5062865d0e1763e7578fe78e02267055cd39dfb9e662791ba909039e7ba88cfaf04ac4a3efaaa0caf3c35049c6dddb2776633c4d2599c062dda533ae3efec032d91448b5e5afb27d623724bd03070ccabe02cfe605535bb95dee8777e02c28a96193d74abbcac8ce7ff28988ba448ffebb5910b414c1e9aca70f2e6f8b8d2405524eba4bc0b0620cdcca7fb794849f10be427a9910b5eb7f78ed9b2a7d682dac5fed4c79385e3521d69d8064d065a4fd796e1ede3d864b007517690074e6c07b8cf1da174e2d15fe638470e4c3d7486e6229d9cf57089bad78558612d4dd0d04c0701da389bd8204f1525ab377d5416b0153c07237f54376d35ad4afcf6f079c9bf9df8606b6c2dfa775e2cb55ec807303bd5ae3f5a368c1ea86ad311e697d199c8e4dee3e2969ab6c726a2791a517d6f705e96531e0cf06366b22013117917ec154ffc93596f56a9dc366f467f52ef12c15de01d744b42d1fbc0958c85d07003f2f3414fca21edb4a428619df21034d8babcfce9d4cdc48c55768430053e039f6f757911b6370971a673e435cd36cf1612bc7711f6b0246bdbdd3a179d6eb61b2057db48e96539ba542d4acdb1498e71e9ba15c6ecd960a4f33fc9247b9c20ec5cb01bc1029ade985cb196e44b7a5b787f94e4a3f88307ea98829bf7d36 +shared_secret: 31828b1321febce31e35e6843462b302d13162eed40f0f495fef0654e67faabb + +# Official test vector 9, seed: "b4663a7a9883386a2ae4cbd93787e247bf26087e3826d1b8dbeb679e49c0bb286e114f0e9f42f61f63dec42b4f974846" +entropy: 511c2ab40782322c06111e144e505328c4e5bfc890a5980a2bbc44aeda4c738b +public_key = 1e778910b9afed44842d78417cd027f819699af6b0ab475a18b7359817b50c306bba0728c5a9088e667dcb7944af6c10ba86300308165c1242cbe8708c8347c44ab77478304efc0a9e5328f203b90108418fd1b5b7c3b085e74cf500729e27719c2596feaa689a54ccb3a5a4a74acf36c652fb97ad49190cc6f08382017db7a910f816701957cdd8449ca075b9a3c18bd88469e3f51e0c967146413bdaa15c38284a726a8935b3987e774a182023cc0acc18a80b8b6909b52b8726881380b204cf1c069415a99556476b0218ebb4217ff33a0593be5f3cc47ef89c13397d68933721c5a6f1241b88f452654c249d35c1a8b16305469586435c1a6156f8520ad33938c8dba429c118154020205b0235262f233c36a89b384d82bbc49b6d6074517a631c5ed285f56585b286462872503da5c3df9c91340071eec625f8b29e4c416e93b46d37f95822ec35c2897417d7181dc9a7097aa74f3a02bf1420b1a568e1d7b1a743c0d07623e2296071912f7db25d67d751fb3b9ffa671403f29d162b635f0c7ae693578d2a752984914eb9036bca365a76861a05075b4b2a95077b6600a42e071d60e21618a689e3f7b5c9836b7451997ef80917f6351f814e2ef1786736a703012d3c9ab9db50b5b9f08bce69ba50a2c48f059dde2181f725cf39f426b39028402acac36bc0797c918d30a4a6d4bdea2927cd75364d167f34db97260039bfccb64b0003ab3532f77353fb6a0433a5a95570c2ccbc77f0e4bec1584cb1a88735f27acf58120d01265cd7236f18af3c00b4363cc372fab07ef3a87030b19b07af020320f1f747e32a8bd1f32e78f1a62960a43327307d8c212d1044689805be15c1c68682d0a8a24ea51267058dc4b15f36e12104ea83e425c248209a8d193911e2a2dfe3a47f485abb226f02919f9bba4014262ffe6b4607bbb511fb5fcc205134f8aae2310245b9c9e73957a2b5b4cfe0916dc1bf6ff891c645b28e63bab6c23e5077a8c3954fb5978ad8e07dac5c5c1fc4759912524566785df222d04435a6a24361178d917b53af57438b46aeeac546bb5207c186bd196bbb6277216d95ab6e545d78e04b82669d19093241b808aedc5db79a9e54762074a0aed86931497917969ca7f20942eee719287c887b3508f23b919418278be0236043acb3e4abac940c44c3aec3ab8c78bcabd84c1d373899369b515c2478c6085ced3b08f668224f950d3b82355468bff0534cc7660045e96ca40067de520091437309f7030f71a250c359f0c71c2f8819b62cb39646b19d63669f679ff9f48ac7a426e3fc1a1d358b675105f28586726304adb8109e104715b6c330f053961207eb96148a866c12c9349fb6aafd1b42f5f80a2d827094c3b4def6478212332d96359fb3450cfa6bee8327ea707b8cc61799105358521c6199607d9b769b38ad15e4b638d12d16aa90aa49cd90b9047696acf9c14cbee59f82b46de5bc644402400baa2e839ac801c70a368a3611cb11a1484dadf30185112f52421196d1797a3085f5d429d286343953ba8de676c381aebf394d0453bf1610905f3b6afdd5299a750f2333b3944067d9a9cc201922f9b5162cc41cbd35400a275717228050a97d05d0c1b303bad3405f36a1218c5c089c98467aa37905b334edb31f667a88c2129c1749784f49b83a329275e1b5fff4798d4b1c5779a5d433ce716bce5763572a29cbddf5b40b464f3e163cd5b554c5612c20726f57244735e2616f45356237263d69a1e1e03cc4d9ad57c83b3075cfaee45418282261d8bb531b685c766989c28ae9f991415907858308a1fa027156b6d3c8c0cf926553b570fd077b6fc419d8f4556655ce53f6802d406781b06463042304477bc8ea19757bb54f2cb54b9276fdd575d5a00c267b1222d4c25de11860dc14a1f3453423caef02bfe8720472c194dd234038f8aa0d3118286b530247b88a83318fda0a9c226cbcf22510f681db3880c2208b70f67c124437dd32ab9120894aa287c7040e06f6cdd0121ede209068238b57716db488335564c316111cdd90741a197646874922ec355a26a7e5ba4af5873f974b2626b40afbbb5c59501fceca0c9fc76fe9b8786ad1c5c76b071b6c054aac0eb8e0535bf8a4249a9256e4c1e8ec673fb5bcae20063a90b601e047e9bac3ba827acfba4a7e9b040776bd6f351e548ee005d759da86c9b2971f9d6d1cab8d +result: pass +ciphertext: 5aa2a84d580e3c22578c26b98e9ecfe5088d3af1fc9e3a81d24e25a30df69803be604b3fdfbd4709b7924d39ec03bc1384b0c5b9e601088f96d9ec6a34411126dcf855dd55a800052705656471c5f7e9247abaace66cc8746f5379cb31346a5e0007c52b186b50ee3eec28f8b39ade1a9d0c215d30cd4814bf79a0efc5e18c8de7d4116988f060cf5ae420706f19a88345bdefaa8a59066bcd0ae9586cc338140b77f3f33a2c074c59225f1e649aaf8ad20c39a1bcada26a6c3e4b2cce106dc82c14bc17fdd34f19e757b8436124e2382ae28f34be75d8dc98fea5b636957f7c9bea48237cfada97819af6c1a34dc91b14ab7d694e4f4a5c1e34ec42140f18327756f36594fe64f012b249f4c82291b8fe5bd3e1ed410d80deceabe5ba8a09fe819d8e6a3c191e2390fa0f3c7ce59197e7c070f308cde90cab5498c6dcd6916b44950a404c4405aa24f67859556e35966c7b80c61a794be0199a841adc8a2911d947669c44a38377bf884b2eb0215cb465781c3b81d35ffb677240c86ebb201309771835c422692a82b1e3bfeb4f7cbb64f99a2db5c8bee93759799409c422ae930937a387886612448df9b1b01aec237dbd0f9c4738bc421694c873914568733744cca7e892258168c2ebeb6b307ff5e35546f16dec0c99815210da6dfed3ede3323c9fe2c693dd31e3ebd003197cd497d7af3eef133d611355509af3b9a02aaeea73350472e06de207b12cba089f201866f2d57d27b056d5bbc2e4698412544f88b2a56af7f802b2d5982e4b31997492f8dd419b4ef3e8ba76b52e43e04f0d5bfe24c8854f335a47843d27b42cf7c1f462cc2e5f938d0b20a29942f2d83c232807e021223d8be33f00f1373ac1891f1612d45e26920486b4abcac66f4588accd7e178d2baedd8539b4d35232b0d121939bb664cf9ab70f5a87d4b4cc2d3daa4a37d064e4494174975bb92dfa3f965afbb76535df9cb5c0de541672821423780d102e9152900306752c2bdee5a32dcb375df2ee84cbe6a410a5249c292f5aba70598e4934be4295b9997251c28440f3f647946fbbd4dace8b2be424ad81114236f2fedc062d5abf4f2beb2b731647af6cf8b07646805c69e624906567da4c75968fdce86c9966090f2b117c153e3a5cfbc4c3d52a611a5936297a60171151ef3a97b153484ea0ab1efe8a4efe60ed47e0054978e152bd9c026372515a4188d02bc1b93ffa5a6b145539b6318d75a15a5521ae042c8756cd67c5fd611f8d9c44045b7efd5e6348fcf7a6b56adaec686eb5692549a33466080e5886c83c8453c9e4e44fbf0b293b45da5a3064f7abd6986bdf3bfb9000e8d24574f5f81991ece501d4f725218d6a2ea009f525c3619c8685c2c2b34fb2ce1b93764e07dcc1d3cce5d535533fd7dd28ed24ee4dea9f95fb2c0edfc347ec9cd9b49706f70f2884df179759d200487c1e6000a91cc9229c6439c32901be5d357382c9e37b7c6154dc06127d3ae93dcb4ed8fdb44dd109d1256123ad3b3030ddd37b7dec4a715f0bba2514ffc88876e9dd9d66974ba8b5637bd7b829ecfd423e0137685d3d72f534721082b65e644665f580d23599cbac81a283885e41a6e85116fad15e53dd301e38317e74b468fb3f1eb6d54184c5dfd1d8b9f82b36ccecfe689c39ff8dd6dc1d6138aff0057fc9246608440ee5fc70c095b837edc79e31fcf61ae2b07714fb3ef5b2d2a5c1b9ce794b207879f0c5395a6e880ac7e566fa9d695a5180d406f1b1ff96be6b4091d5cd378c6ed4efb3b23a84fc78f5a5566a170244fdaa6bd324fe6d567ee403fe93fe2e4e00cdf0eac1b16cc4ca2df1672f7907c6b240f8d9de657e8a2aaca0c5a9ca982ca0f9e97c92fc273545ace9875ddd46fea0997ad92998653cde6ee29d042422fc33a6107d47470ffc662b2d2dd149778f2170fb509a2bfea4d7dbc4c22635c16c70dba6c180e35a911b67c3f139b4359382690443c06f5dd7b75b78bc82c1e06de357c8f63bdc75bb10cee006b6e41dbfc24afb6d6d73a55e411d2ba2f4a45e635ba341605643554c7cc53510e8aa8520351a374e27265f2d62e0381ebc130561ad53c7e0a6d5e82d37b719162d5ac8580aca912ab9e48243572b52e6283d23f71c827c46b56fd0be4b27d7d1005420e83b65cacdc52f3bf3ec432c51c37af64fb8aa78c35c8728e7e6a7a68ad1060cd8a6fc22e5684b8f +shared_secret: 3c2d5cd46985e0e37e487c51af3850c5516673fa376d128fb32e63ae84d5de70 + +# Official test vector 10, seed: "980d0ba7c8f8b23d0e948a6029ff2659810ea1360064663a8994d0333c8543ee5ff5d6d5c9acf446e61dc464f792b9d3" +entropy: dca92dbec9b260dd97e8886f876862d6effc3b91fcf3fbc986cf56ab93ae79a2 +public_key = 1cb3c6a7f721c4039b10482990923aba0427e2da5bdd30bd55133989a5b43bc371d2105415e76ba18786237c7151548b26005961fb2a9e737e39bbaf97f612cacc3ebbd216f9f57873f97c503a95a49a1a113b0c454526a082203b1a27e2fb170ff1b59b0657861567d5565555f11ea31523c42898d6ea1ae260cd98b9cd69f9ae4d19a81365154d24c008bc15d1482665c313c3721cb701c3a407373e1bca5829cf45d484721357d5f83b5cb58b21987d9fb7b77224c03c017e183b31fb4c407ac23312aba708e8bf7f905d68b4895a48cd7a70af6ab9060d959f56a02d7e3672a90a6218fbbc6fb641163674bd736af2764c72c5bc85651be47350507ab81749bb2b6c744520b5b0a3b6633355c0991ce4e1a813615f2e8300366521040049b1054a7741b29af1c300e2c86977af90e820dcfcb8cd967c27102d49fb1683c63553289cc0c62de0e26f7555392187009e0cc5896acd8c3c9a4a7c637a107da325cb7a694e9a1107e889cdc6310671bb6c5b51a35a0169ff7b5158bc6469a71a3e8740e9281f5869180c91cec8e1169e2b377c8174669ca67418116c3cbd2ab61d8a874f9bb767de8973d8425cd118bc9a320453db9c64183248b22af3f489ae69159a056ad113833c2a9fbc56b10d013e911210bdb8cba68a0ff0f0729757bdcdf68b3fc7be480481ff64c4c09825ee52b274e85e544091c3d36f40444d28878d7c19122957348e3c27fbe74685fc1a3c21126064242616bc4aaa5284f5588435140956cf37bc72daf5a73ff6ce452ca689066fd6e118bcd4988660c7c8501c34dcbf1965c66fd95fdac910b9e48093fcb200564b4cfb36c72c3096c5579f736059534d57b7168813439b722d5230b255532d838598d615c1b641a9d5807f33653a1be96835f474d4f1955e3c5bb5c621497c3451003ca76275af98b25a962765e5bf2fe754330a77837288810aa53be9a2564451319405cc38b13401a7f7dc960b5b2096f45a94098a2fb39dcd654f846388cfb4b57b4b92abb321a16a83b3e6953a0724afb47902e581acdc278957100548c735fa5c04a4147e826a77030284615b82fa60bd3619b57bbca10872afea091fc6288ee434d8319f028125a0b5006cacaca8ca6eb95c7ad87c7e499a4ad81bbf79d144ab16ac9cb49743258cf0c83f2b006b1d0585efa0ac7dc722ed6c12170831f0964cae2b6d2f808afdc6223d11b510b949e76a0a4c262748148ce17b38c55cc7eac2bfdf468105bb89298c88c8806b124c7488d606b52b217c81a17ee5ae67cc27f6a3382d50705a9bbb1d3c59f68b8ba9a45ed1c97ea1eaab76903d1f2a1c71a07420f47695d1b68d06c5dc85114ae83204fb4bf16c09385934105c9e2fd803d83542f4aacc3af6b949a63e6d0b0c46ca8a6b4633926c0665bc09b69ca250945c14366d49705658f6cd76964e107497bb42290f4c1471a4ac29a60c3dfcb701770619cb45b0613068091a68b58c7b2a19ca9933cceb112e234014816b7db43beef660100a19377a4200a0806be78d30169c4b747e8208780a14aa53987065936ac4f06b7a710870fca3b1bacb04c2af5e3005a9208b3a03929b864d0e1011cec63b93220e96b480128c20b7675c9a87c1c8e2bab4a7422fe9c16d367928117765458a3803af02332d1bf654e782816b15a5bcc3bcf0213dcbe07c59a92d1b1baf1f217061e197c71223c12746cfc0b0aeb99fea7b29bb3a1300bc266f1692fd8641d6fc594b9894dfcb0c951b8351236087241f7cc3506ca74ccfb4c930fca1be940af6606ffc76bb92b53768294c30370b29b795de63caef451a18317384299168b77793e22fe0fc03e4c064cbb6979b38871eb11c5650587dbb31eec0cf7ce128f535b0545ba98af5ab4bc186ea1081ae15bedef5945410c800553d8a2211e8e16125d4a7cf25a91f13858e1cccb8e56481a5a3bbc3468bb624f282069425c8b5462725a813bbe53c1cb11bbfa242c2a1619763448af184958cc333c3aefd35c4a4861c5cfb2ee1b0c39b0c73314aa3d191b6406caa94d8280d8b01e1b73e56f5bdbba80fb3923a4b608543ac827395cad1b050530b5e908231c324132d782994753284927f3a379f71603036a172ef58018cfbb879f29a42a106bb32a384db6e033401fa46045b035ed2b3f277ee6bc7b69ea2a0946112498da4ee64a2be6ab49596c4e61553e1164d +result: pass +ciphertext: 72e827fd0a9213b7233fb4f586a9e7658e4d9af82f46552bbf29cbc288757c90fd64f98f0a9ded011ab822f9f9555cff8eef77867af89244230e81ea24a9a8bf3fe80459b1462c163b50708c7ad66bd1a2d0b543e0a1d731aac2cbae9094daf15d472a3e4e4e215c8ab38ebca960e4473214f7db59eb183ab71c72beda92eff09d995b4d6a94da0db0cb91658e0747c09d74561a1d5d1a7f983cb0a3672c1c342fb5bc8455261646195143f41e54e83a9efed0b3ddd7173640b2a8fd9b4adef0848d94129f45b09bbc88fe7267e4855b1058e6df5a73901d44f1099d48b560bb3fc5dfadf9124973ea5762183b952766a11fe1909342ccedb0b14d56571435e38a43995e19bc5d3771b0e28d87aa882d052155dc332acf2dbdc2fe6c4b21b719735fe77998c837e9b871d15f6863ba17d28e371e31ee2a066bf9d3f9dc25969c78936afb7533d8b611cccfe77203895340020822a82f732aaeab1263163d68680f8a229ae1e80bb4422dac4c4c4faaba84c054bad0d9e1aa0992c2013b1cdb7005939bad0e44241216d6580479f6ac6066cbda1a580caad53434c6f2a537121a549401cb990d4765812ac1eb27cbf666f5d2d96f3cd804b43052c1cf53d2b11a2b924ca1971bc5e30f2e9a8fb05e28e474fd34563836ec9b19ea492bac7422392336c2354a703ae054995ec347e563fe2c5ee48d0c2bd9968556dc41e5d3c939694675ae23112f64cc7ff1df4696a73ebe472fd76198998626409e8f8d6c6fdeb9bf589cc60e15253cb985be0ac507ac8076f606c11478e78a481fb749adb2420ee0f6546b518652b905f328c712305e80d8669c5dcdd863db97ddad05b86ad9d5dfc52b8a41cd2946df58b7d5032eea4efb6e8ca780b02ac58261bd3aaf04a88f482e242d698cc8c55d87a2e178c741f8b9a03f453d844d71011f5c7677541fc25d58a138348df949e4cad85367f817255281b49116c5d101dac5fb26e1896d97f67cb712dbcb5a573b146904af4e9b2a7a02018c6ad812d1b8b1bcc8a062c5a3fbb9cb9ede7db4bb39e31a8296d2b4d9c34ce6b06a88425c75a3b53f7398edef454b9b2bc24fc8c8dbbcc4ddfe2b0e52b7b9f6f695d5cf8e7706f0a67d0132a4234334376996e71c5a9bc41e6ed16d712a1fa83031d774ddd45d9701584dff472e31f2bbb5c09bbfadbeac285b313a8b32e5e78d10ec59658210bb346f0f7c50c233c7c1d018ac200ee64cd512f849aa8cdaf3a1d8cd23fcf974ebd05a5a29acc5b4bbb594fc967dd500a08020c10f4d1a613d55463d76ba4fd6e0230565ac45a5fe9b1c4477cd40db46b71c111b1f66bd072a28d8d1a43614e785e838d3217f52233883c73a1a7c4878290bcc97e47b4694df427f2ba787eae7c495b2455504f4168fc70189bc77f01bea35f4781d45c170bd7747d7d85438442ec70bc40549f30b1ced6e00d9f3bd1473f0df98527873e775df348061c9f4b16450a518e6ebcf6aa81086d1b9e9b355d405f431dfc585b1a82fd7436fc32f9f90171b0ee2db4431ad5090d61b8dc41f4c1f806f56119fa6bf4779c1dfb1dd9ff535ac662c7121fa5fd36c2f85895dfb4f63f32172c8fba3dea868b02cf2c23ed351a71c5cbfabbc4bb9504533a67d6c7af1ddc267ed430421dd15ef27ad4c30f4a384b6b72c4c4e3ebf5e254f67e61f84c0f7ed2061c92a504fd662a1e4a191afb56957c8e11ce0292f2eb49f71e106ff5e202add3025c0b15c9cf946bfa12d17761398223039e2c19d270c101a2303a276d7d7c81332a285ea94a28c4325fe4f323cc6ae72c306ed5c04c7592733522f1b16ab3e5ccf7e50c6ea926fc9601c3f27b66363bcaead3d9e2b66a436d2b77f982f7ea36d124c3ae3483a09d3be896f183ea041eecd11c8245151a17ef5daeb94e4c90a341b86cadd49b58357115d1a305d8e7950e1a7d6c604070b2384cfa7d05ff8a578d694041d7abe179b456de185c12e0bd4354e419231e5abb7542f814fa307e4d82e8194dcdada546d09173bede3da358d5c7c2c972e5bcd1487961d4023534b16b71ed1efc8c231df1c218c42dab650d4c6eebb5e0eee547b897b757a79530ca47054b9e42d1b6fb68c2fdca74099e218863818d11cba4fa40f32d3420a24643d32e387ae9e0c21119387817feab0ecf26bf68b32e3b2b34cbe08ef0c12a830ee0b9753ecf3da7a0995094ede649094 +shared_secret: 8916871d69a1d3eff8176775f01e75198ca74da4ef8d8f410706cadf9bfcbb91 + +# Official test vector 11, seed: "6c029462ca42ed520f10a579f52687101105e0b90c6e7bfa582a4c112b579d5ad0a0abd38f72abcfdcaaf5893a112bdc" +entropy: 57c170e691d7a914a901b9a11c62b8b569b3806427557a9dbac9faa720ec3641 +public_key = 78d90b2d2b06c3c74e60306d7e0514fbe0111a930a10627e5b2b11077ac78bc32c46d1406ee73acc41b518b2c1a8cbc93990b9c1d0964b1091b0871dfe594aeb6719400c71e96893a7524d082bb5b7b3711f586f9ecc4b65f66fdb2801495086969a6a49961d563391a24b1029a7a3c9e2399f605a37a4a05237570160976b658da00b57ced318b4c7025ceb071c269ec9db9d6a2944c973cc9b427d5573c2eb37c64e4624216c290c5645b36cbb3e82713de383daa5cb4029c6dfb14c43f4aeaa9c93843b784fdb63957b75f39088820694bd0706ca856864fa031b682031581673608dc9ea058dea014ab79eaef74928d4cb33308fcad06ed303a1ab8b6cbbdac332a24ce5474013c90c5b1b869bc9881323435a097d09e5910e39cae5a1bc148ab7d8aa12c84634864930c24ac4f375731cfb65d5992916302640a524a4a52c9a2281534956f946473541852d0884e6461614f9a1dd95cc923c6298998b21c2415518443f86949e6c390f9463b69a63f2f9b328053c01872ea2ea8fc45185ca3bbe74b713528cb3525a60f7639f770824686c1b2ad719fbda1d4c44c9dcd0b24f5277fb6720e686270b5349fd3b1215008c6b24c26aa943ae71146f063072f0c42ea114d3986ed1030260e88f2f2c34e7385491565168e1c18ad324fb13482f5b83b2f6020a6895f9d24b93805fd5556b4a048c2e3106eb02a53a774b169106a77bc166137e7dcc4b60569e77dbc6d5f9c276a011ef59bccd08793b695eb3a5bd3c1b64ca3bbfecd1adb5f97294d8909b31772929c693ac396d412549b1cf910aa3c60ca0250928ea4350b8c91df7d31474ea07cff56dbe417b16603c6af97329d53163343e0af3a84ed37cb91a349bf2af7ee84d8ee504f2a73e9dc3301480bc6f144a631bc3c160348773cb0b6a3b57fa1286e2107e950ec6a682edcac892926966e28ab2a482bd5991f8c6c6f5e231b0826191a8c8d3c2701984980146bbd1b8a629b548ce578f5df90b58305026aca96ef20c77610a2da79018b0047f5351858c2c99a035f2f339885521d09611a219895e987471a2c10ee576e07320b7f9b5d678221aa995afe550c0f72f1b647f3ef429d3720802d7b53ceb917feca63860337ea126fe41777b85980744025ef9418bb4c1983c8af0109d2a0a0ff47c121de1926ffb5b3d8bcac797a0f5309c8629605a757a6ae91beaa437cfe184bfd3b703052ffe8cb2d7e57b411719625a9f1e11473aa8a4814788c0280fd179596db23d3003461314896d38a9e8fa75e93b65cc76cdccf24a72b1294acc47b3e7843b2a322e82c98f906ba369b7e8b588d2dc8056b70e8588c4eb80ce8300630d265a8f6a74306374da0622eb125f51764c81c55b9966c27b562c5e930a30207f825b27711c3124fbb98d4a8351980a04041e99f7af63ac015d667232162db0e793eebc70dea04eba186d2c14381ae886f7c6b934f587710aa095b206621cbe4ca1bbb8752b5489626ac72290315fe9a967ef6980f9486462b74e7938800b020519c5c0a684adc1b82f0ccaa3988cb5a28264ccfcba1e8119add64a58da88bed5cb01f5b0410a3ee03c9105029ea789bf65bc9ec58b4b2b0c9aa9c7859a48cbf0c12cf9e78049528118d366d0345951d0aa9102b5c12b36c6022fa4c7b4554178a8800c1a968ec74569af3815acdc39bfe029807a8ffe1267a69073744a806161bb5ab59d5340b8218054a252560c188314c177c5f3300e86863eb97253e6778415b77f140d498aa104eb291b21bdc2c5693a39254cb01c8a3a9e8e14a965d107a6b98eb09a26c2851059a290b6e94ec10138289148086456047750a3f8aadb5b1693c9642a8ba89b89c6f45c18ba750656c151cb563ba7260ca09c780077b956e5275cf998c86748d2d332a9008f8625bc61939b18f0c063f171175338464c0d402915c6e54682fb6876c7338f654d1916655fb19e21f18e2c0629e0962457cb62bdf3c93cfba8a551c752642016f72b5479615da16c1622b21a105da72413df20b125c48b0a76001472780be292a98500321c007b1a0273108be097ba0e5972a2394861c5c9f8e0093dac8aed47a6467570299a5501c6b2f281283d0013260901a08531e737bb6baa0fc13895253ac4469519c483b591d28cb8a9a0ecd051937eb8d82bba18673a17339dee827be4156633d8a2c376d41fa4e7bd70d4e199 +result: pass +ciphertext: a8ea9ae69b53329b2bebd1fb1e3a67c0b693a15630c57550e31e59fe4f9b617dac6d5e16607b7433499cff0808d4bbff91b2ca7ed0f05fd3223e9300e4f251ce24b9667afe7f88c7fb6f4d7d921943fdc93d98fff7c4c7ca1c5f68cb44365682363296da5985dd5270007625dddffa50feb140412a6bd3a777b3b9a6b6fbf43d8cc90f6a1d24896c387e0487f03ef8c45bab4aecc0c90456688799f7a5417bf523deb8af083a75429e08c242587d01e6ae78f7b165b2dbc9e67a8e1fc61f95d1fafedc77e7827eb6e718941fe091138f9c4afffd53dc7b632403f4197d53c8658b67c7905a76abe466357f2690ef633d4b20d0dd73e489b0d046d2a684e21f95fe1d19569b076a6ec0e0e2ba05e8a838815683d5cb3b84be0fe3e363a7a3761521c2e04bcddcdad2c956f66542c23d7446984f6c169ac4c7846a9d8afe236d0c8ee7dc2afea49837549f91803142f889b2ae4a629f2ee67c2fde6032866339dd512896e8ad025d7afe1c797630c2bb4d01e4f5004ce288d1d879689331686fe6934b43f34f40210006a4418a54c3e3cbdd96a09ec364cfdb76b72dc12ea17e7061a3a1c16f04dbfab2cc69ccb244fb46975218d8e15a5eea8e85249d901a2379054182e2af17970328cbb58c99049afac91606aa090bad9aef751b76ab1430be40f62ae0a81f6219d98fce9f71afaaf5f68389d07a2da75df31a2bf58cbb4feaca21a775ff92917f8b32b72d0b880a77f9bec1074b1d1cf9be04912a8813f5579c911d46d06c66ae1c943329b246a0cb80bbdabdb22063754840da03c3c3d4a072f805902054327963dac5d17074f60db1a37a3d7b7be87b953324e964041964576e95cd9d7adec5a5f9386538912e7140b758d54aca9b5b6adb631fadf6db3cdbcc6a2f3e475bf669e0888f5c37967feff2c73fd4498a95ffba69a84d1bd2ce7524e4e5f8330a4c6c6b0714fd7201ed6efdee9f08fa2304e9999ec2dbe6a4756c67514e3664fde289c1d73bdfc65d24e1d5c6c1703d5c466df114a3017ec38510f44ea50cc7e883ad24e340f3196263c19a4d9fced324d0d1a3abdd5f3553b6e3c14ed46faa97fc18d0db7edb064fafc4fe2a018e2d1943301b734ed76729043f4a54d1fe75f0d7d52419b597e3c6a33638e9ab1d3d5fc971501cecad64f86b3ebd05e372d1f56ff635839914f4d202094942ecfd5a26dd59135f574d6924a7a64c6079dda2e30d843db9ab000bc67fb2aad73d0a142da2f56cda206845cd433dc53ea67b9ce78bb9a860f34f72770afe8bdb6d0bab4d2509be1dc2c435cfe59aa425cf607b550ee8e2c6e6ff885c4a95f659ff7f1556f8a02613f6b12e0693f285954a84e13996342f99b4f2dac6852f7d9caebc9a409121a86905c4f540f5d88b44b065cabbec28f1a48ccf635d20f4d0c7e3264888049a7983411a1bdd2d393b7246d5ed0b74e2ea568de1674a3339e864d8a54a32f65f2d19993655e04496f566b5c8e6f793fcba6bc2a583ffd61e7d23c3c986d178b8af86b8e4714bcd405be30dbbafcf5aeb6d3abdc9d81b73c7c219e460a8ea5b253dbc0aa97e967f2febfca583c2ea23810ed31f6a1062741f02656ebb9af490b43c3c935e008236b9be6cf7cb545726a59dafbb769d31555bc1dd747e9800ae5190a48eba0cdfd175ca609be6cb89e6b91ba78c761a53ece35edd41b9f61e0c521b848aab26c557603c120abfbc01d1d252a6bd31fb75ec8d17fa0c15727ae7d160581b3689a365854ef10605425e18e28562aa104c7bd1e7ae2e1dfc902928261833cb6da12da185ecc05cdffd69d3419b27b329819e49e41e8e64b0f9c222ff04249f9044d16a3660e3cf13e1769f9d4f33f8c39f9c491e2085b608c3b430d4ca662175da3d9c5a6dec274ba37e0bf2b0d034ec067d614afe9e7cd34565dff83bb1463a8c0b08d4198bf7b5495ea294478ffe57c994e1c99607a3e9a00d9ea4ca568c81aba09fc418427fcf343ec9d3ce37fdc1108ff017ee0f4a32d31a824a97a96ba6dd5f3fea36984931a433d774950800e6a8dbfd65431c348f14c7762d68277f9eaeaaed15543fa041c3ab72903370e947daa93db55c9dfb71270c5be4f74446afda6c63ea115ef40c3ed2f62c38dc73165d156d26514bb11af35a659a007673fc6acad7043c967e3370d8c5c37f0183ec064dc08f6e2b687b736fbb703f810d0414aa9c +shared_secret: 3ae3603ac2c25b00d16e4db451d8e13dc77a3c0fa4f775c74e028abafab70164 + +# Official test vector 12, seed: "db00120937570d62331f4c3f19a10465231eff46465cdee336a0d46aa1e7493df80f18617f9ffd0476cf7784a403ef4f" +entropy: 6b5a14e1473abf5a33d44975ca2088bd8fa6fddcb3f80e8fd5c45b9d90c24a5c +public_key = 81f27e76a1562bd2c206ba3087231983aa0bd65420e2b71b749605960c94319abeb1e80aebf274b27a9237740c07114614658c51d0c5118b9fe6d0064e9b47641ab189b2ce2086293dba6054a1437d00719b5c11351a9901b0a15e4c7efcfbbe9a3a7ac6ab157586c8d5b68b2d9b747b2461f2a2cc3179a70926423ea5aed845407846bb9c5c57534b66a6cb8b480c9a18453e047c58ef00cf652867b474c7b1b62fd7aa0d7b4c63d881b05f6a8d8549257d7b0b7153525d5b295e8bbbf3d36da46a5d425601e9fa8ee7402535d553bb60547bbccb7777b5e48373f2b38f3c566e7b98a85465590ee1c8cef16e4515ac3b4c69f99ca7f3495254c345b0405fcf975bb5cc26a1faa82fe109f8d670f17164f25878a9e8834b4271f75338dac56ca7b4bb3b56ae95444af369c20b582edc204928037434c3c5f8c372fc9449a773261ecbaa4ddb929f148bb6bc471d2a72706a1f621ca295eb8b44a83a4b99c6f3bb04002b2d6ed42fa5418bdca5a07f743754882e2ec966f44235fd3b48c1ba874d8765ee30156cbc0456e610c5b02c8fc3b6d305aa23a5528e77aebf2bc3696a37c438a2a1259054c3537ab8798ab9c16c2b9bec71a861a96ae2387955cb95fc4c984d2b936be897cd05ac3524b845a2aed4bb981dc47120fc9e4c6476e7847ea69755886a5c85cb059ad0cf05b0aac6609104e0449e36815efb9c0b232c7e5b9b80e386a8ab12be22a72e0a4efb447b253c65f619c2c85a878a54457d272d2e9a32d2668d9a02089a434a1bcc4cdec25f909640901ab4ea97128850335e63882f363eae699599a1bafea68c9987882751b545795ed6428162993b17e7a7fbccbd2115c9cdb83c9852912fc21baf53082fa41ae41723a8e6a8e6a3c008dc8b8b6250c7c740ad2a3b92676960db68318c3cf24b855b62b237b97df54c561b72b0bca0877925734d650c0824ab8081802f166d8a294ffe8328fde34b02436ea27086b870009545a71d56ccfda986d00ca3e6931b85a53cab3aa85a2184e55718a9988e11aa2f024076bfb36c0d222685977ec39702e4eb7045229e5256890ad87d84dc8de5c44f8e73c65970216c6312bc22920fac8e24a6b251103beaac8b4a911a1bf62870a33ad9986d81161a3e44b0f5c9508be97324a97107cb15b2a2b9f6f71b80fc7b59d199ff7b04652644f10156c2dbc33ee34cea079e6b718ff4e2ba10858a2b33827f7019bacbb952ca83a8f38d69422431fa722bf31683e3ad6e1784ef9ab210391ee600c2d0c690d739ac5a581c4f5660576bc743d79552cc833222b43e45201888a3ec82194dc2307a07b8549c838bf4a70f9c4f8cf5868710cadb4636bf12a257a57c344061b9f83dbe9324195651020c2f02574a2db4aa4ef527e5a66fd4758382f96e52d84472852a30b49ee7d60698f4b9b6e9003f475623e345e1db767b143bd30bb5273636ca7926f434863ce41813767082873ab5365dcc72a251c035da426fe6db4aa1f34ffa45c9277327a7125c866546bbe22b9c09c054e133b3d8b3fbf18832248e5a3198c89794c5ba4e6486574de79cd67626ef2953007431ad08895ae499cc17111f76c002322a6602b677a922fc450971fc90c0b8ce16dba195fa80196569fe8b87fe060311867e6c6abc87f2351f4b0da1f837eb7830b9319498f36ff707c80926158b84a934400f63911b5650c6d205686f7bb7d415ca9dcca9a94c5706945580f49eba773067eac6c989a8e1d84d2586c58e70793933367da73ef0509e27a97f03c28a10086d782a3ef2251d08793748357f411200b5803f0c76c886b35bfeaa68544aa038374f868c474f0a6df1061de88886a1241f090ac4c7c17f6a429f5ca400e8dc98554c56363c8fcd728a1fab7c0007c67915b7d793c0ec5514c8f6a394c8502ee3c63b73b26da015c370826278aea16ac479884ab77a2d3c0b147e93181167bc1980627b46b7d06509d7725cf1085850a53f442c226cfaa24c8721db0c137c7a72b5898cd2137839202db535cd8ae76e42219e49eaabe2fbbb643742ed91551cd54f1de16f63c953fbc7b5849ccda3167660fb28f2a6ad8327a6d6ab649eb22ccfca574733cf01663fbadb3be7c33a482c13e50027d76a134e114c54380c1e84255060944dd10321b29149922be789eb0a8fb7721fe98a1e0bee89476e7efd6ba100e4d6c896905fc524e7f985 +result: pass +ciphertext: bfc010052e4a98535398330db6929dc14274ec2eea49137079453747e20d8348d534940809227b777a2bc15714782c05453f524ca3fdcf0df3ef076133b33a8205c6efa7f0998f5af79e7ba4a60d09b82975c6bb4939202082da7ec4d36ace0474ff661f27c127f088948dc789263925c9e66366ddff38156a7f29e4966b14b8c97e7ec42a845528ca6b6b3184bca46a10df3f0cf97f205f3e200028655002e95ddc121e692967869914900253f021a2ac4f57ce80b877650ef17b255bf6ebe351177ca540991e5c9e1bd2f11d669ec68e9ddcd42acd87738aa5b6907f957ddb88972daac3ad492fc42b34bc942a54a8e95ae810114e91e56bf15f2925174d2a0ffcdc143f60f32ed7a78d1267f9fdffd8cbd7fb786ef9080849a96115cd5447a0b5d939b2cf7c72c109e3a1e001e8c0294c6cde41eb8cf94fa1984ff8a69753b5169d83dc7daeba17c044d1ac0b75a300d604819989e55334cfc159c10c10d57b0d4247bbe568831c8446fbd06e61d86b36cd6cb6928386993420e6e4cacc75c302ebd7fbf68c26e4e47ee9b95d55e6fdf84ca11a20109dea65610dfaf2409cece66b5459d5ccdab137785985826f1ce139ec6a85c14b7179028e189abb634ddd65e90e24d0956185e10478f655223a12c12a58bea556d1ca83442024590e7552ef3de5b507d4780d2df02a8d1df58ffb198e7ec90105260c3b4690fdc3aa3eeb29a7c35d70e17e95ee80dd29e28d3f983af8e56a8e5a4e342f7755dd63ac17d760112ae33b8ff4fabd99ea81d5bc055ba05b14bb2d1bc5df6535c669925f66bd28c36e3e138a43f5e52aa8e3bfcfeb6119c2bc2ce1f07ac342d376df5955dcc82c5e1ec98053617dd269f94218d7e04f60db5f6086b517caf7e378e4f997871002d13fb034d0431ce0ceac5790f9ef66fcbd576e483da676dc2656f39e13ef9e53b0f3af715ad68ed200c153c3d4faee4726e40281fd3a8645d5c44662ed4a0cb2b08a546e4465df1a99c96d6d8792a49073dd33b265bff415cff1870ffc10baa701d18acfac906b93ff266bb0eeff4f9e25ff31bac8c8d55255d5968b63376236434da60619240ede97dc9a8e465993cf6154ff9bf26b0c30b5b090742e80ce28146c41d24a1309826a50f1c0eae9a92741d87da56c4a3e5565a205667ae31e284158709d3c606e4019ec5a0faa3dceb1125f15f7366e03801974849d4393e8ccc539f1731c574a072e8e1f283d2a58ba2094c7e1e20aeb9bb7eb597a2af60a51de419ce403defa27b952aaa1ffbb7884099d47a1f7fafe2bef66c2217c39b2ddbd0bace0e6399680cdc3dc1584bee8803025723a9ce96861d5ac18cd3ac86f88e6cdf29bea502845850913bb4ee3cd5aba6d71be09a6e8baf9afe06a4de80a8dfeaaf6289f484d084a7c47a28235eebaec311feccde4f2564665f7d100fa728e608606b15f3a2f0933fb2ec3508a329f388e3c19fed26e4d5fabe83b36ef8441d0e6f96ce9cde8110cd3b208a24d15b71877d54a7b0a9cfa3724b05d8f438b1d70ed5811ea82609a7e3482af67d380e8467eca9d9b03a0168240f7634f1a7b976680f877c604775e877fd07231ff766f22cebbc7971cb545df0faa77d78c35d1ae13439b340f30436071064e18f97399422484b12116ac86a42132cb044f4757623d70f7508431e3f4fee1be9d13e77d2a98437067a18e0b6dfd3a99cb43aa6900382ee5d3441cd39749d7528df82e964e4b42cc0b10b1fb47ae4cb448a57304fa0501ea3c171d6c8f82c542e144a56d7081e31fb0ae0592d9e7f1f207d4465584996e100c3cb7760f95089f73c19113ba4c683174d8a1830f2e2f8f03db4b9c988b160aaf6b26e1b49bcd0b45b2ab61338bdeba09b7356a647b77d058e046752ceb67bf7edc94f0939eab75135dff909e164c96de4e4e8420f20396e04825cca4f09accf33cc2fc313d39bd65f9441b991ccb9bfba1c548f434bb75824ea31ba21e8a0ba90bac70f3ba7e59b0411fa4bda9f68db7f2df81ce7ffacc8ca1b7b39a2e408d471a3df57f39bc662d8ef050c1638441fa49d60bf74be7dda58cea679f90e91f8d7fdb400ef0e8dfd0fe2e9a6838f76101e2edf3fd83b3ed722b12ee03d0fe632814466806b882581b5638475f160e4f8f6eec6d302f8ebbb2e847aa5978909f7ab1dbd57170939a65e74c27b92235ecfe9dbb67051f763680a0 +shared_secret: 480307819049683defc30e7eb2f711a150d8c5503e52d93e95875754046004dc + +# Official test vector 13, seed: "bd26c0b9a33e3b9b4c5d7ea32d5bd1fc371015be163c86f584e49bfd5362c8d8341161cd1308115b2a03b7e5eaddd418" +entropy: 40e593754e6eddb7f9cf176ba2d5fd1087c90ad377556d0b0f686537b1a3165e +public_key = 33651904e40d7b863a34774ee1e401a9a24a960045d4537e5124921355cce831936f307c7cd807eb376ca1b640e7a76964c0195b6848b2cc9f832ac0c11c3c3c7290ee182c46bc1608c49e809b1c24a7c738845e9ae972d70c5ed346c46ccc73e0e251b1b57368b96dd71cbda55366585011ee659a2f081a7288c873c8a98964131c078aada0ad1662bb0d2b0a1555a3c84555c593231d167d378ba606257fd3958bc24b47e8380dc370c374a869413547d0703d28e4b5ec85cc0c897f14d5b03d6520937295183ccb1059821c2b866e755e24286634ec088522941516c592418a4fa872b2f911018843d7c877da76c1822246cbdcc046695a1e93aff063a577fc0eff56b27a2bbb56f76dba2b34b6a6765b78493f514661a4a83b58b42e4b96b471068682bb73f535e32c8fc7964a978b47be9b23cdc2b33ce980f66a033f8154bf24b73147152f544939377ba2ecb5a288276c712f2317ac69292eea9005a74a3fe336aacc4257e46395fa9a96a3fc9172b5229c393021e57265d017f6e7a5e92066b459199957cf4dc653ac222bf0b953c3c4ccd5f7463de539c024bfcc9475cb3437c22502fe16b909f73b6e733c6dfc6d87cba8a13220e823a46ed900c7649494006766a23cec36aa46756d3a7124bffb2af34c586847162735ca2d1b259f5c1eb0912afcf6846641984763266bc0add6d60fdf5b6fd87343a5d59c108cc663d8b700ab1dd5c0ab60fb66b764201722c9c2f5b2ce9a88162c3135d44ca9a735fc90b35058bbde332063820f3085cad54c4a8cd8708d43b871ca2b41d0cfbbc066ab45bae33cbf2700c67a5a62cbf1ca19c2431b6c52ac476fc2ec4c00ea9c14cbcee11b1232d523aae8af555958c3089c6c45b47ba58cf1f884e77893fd296ce80584a76abbf2330ab058c2af770e4468097cc20748a188b6620f128912126a899d7b0df24b067a73c4329314c3f6b0b9b83fb450414cf0a2ffac6fe2aac17359b20288a14272a952642958058f04b24a69b93492bc0dad67a7552b37f2417cf7e5b889e97b2d02980f7336f8e0198123c855dc1a40bbc5a93779c7c7be7089a8440214b3542341e56499ac1f6ee61b981705258c5ff6e74637fa0e48556bd3542ee342891ea4b4dd5a4982b0471ce63d61b3adcd1197dae05627c5993b502bf3025f6cb8792f32264184b362909be8ba74a1b6674e253f28b086189115129919821b867cc84341e3ab43b350a5c79d5af47b4cd228856189454538d362049c710953f33678c28f3cd9812d731aa9f95004b94425c60cff24186f644e749a6963b77760ba491744ccadb72e23653a3a08a1f7bba316a9c83e3113cb49022dd2be9a4a69c7db6145377289c921ea0292f3e4ad84e99ed72696dbbc97a3644478761d6083aeaa59004a9694d545835549ca3357cd9d63007cdbabd6e1a0b661113ceb370fac0da48b893b3c8635619e79f4ca14431cd9a1be2f34aaf3bc059de3a3d9b630b5542f38a5a1712c67327c893bd64883b7701636b0576223c4868f2195716c3499a4295b0387715c9ca4feb3b1bc08c6e09c1e809988e2f414f0b0cce5515f43b50c2dba028e9ac11e6368062c360370bb7f5655a3a75c2e7aa86ba9b892019db150bc7dc881c5e3b24e414780512bfefbce95c914cf060a76fa4c34359c634a1a11c40ab7b56af1d19e2732ba6f3cceb93cb31e08c93f2a9a33841d667079f1715a56013c0e68386b639e414540cf2b13650ca9378234b94c24bce9a9cee8c2adf4356f246dbec0bd9b371ddd296ee623603edbaf65e734504844aff0438d163b27c34d52163d736bcb42b0a1a67067a6e84bc8f849531a631fc55046da2b31e0b99b938d4f8b239384bc2ed54e46e17e9a8297c2a16775f77859ba69c759638fea8fc2057b5105952b34058b329ee7b2b08a69b00962c31a5106a281890ad6257daa8c6ad5854eec7e8a203cddb935ab5545e3e57ee5f78925b1531e5c4593a7afee319c5215645905b50cec48961b2b6c1727b4794ed382c66c11b67804b18c3c0000868ee4e3ce4e9790b681161b2cac3f8a1a419892608814aad65880e683fa75ce66335831a7bbcc236dd6f2b8c63560ff1939b2b56b97e87049eb4c65f42d640c0d8fd5841e48bcbd1815ef0c62da099f5478bb93198ef28d89ec6714b0f142ece80c6a6050d3aa936c25bbed1dbcfc99f39b4805782b +result: pass +ciphertext: 7cb3891440c7d6eeaf5300ec18a786e5179b97b2c15d1cce3d4e5ff49e6c4494c165bb4b5d822e1e0d0dab2cd477816452c21d8efc981549d4c6ab18683f19c29e3a938ac1d6c0eb18ad94b9e1e8831aa8e66455fd0b91df49384465d7ffdccc9e023584089e7e30676fbaa0762672babd2a360a8038da9bd50c0fca9a5dfbd0872d8777f829b3f17c757ccd44b22af73ff4fee09fadb5820c5404154ea71cff70fd5b3689c52c0cd76dc0d8a4c2f32d32d9a914453be5ad2a3e14e3f5d846c92d50c4d65330b1d15d88d7b8f466d31f3f51d23fec066ced6f751495d3737bfcdd87c27559b167597d0fcc90e66dbd5c5d92a9daea58d05ccf286e2c27b04ca589ff454a078c4b5b4e5110d9d5e3752e9e8025341e425099a08045cf7154c77a4204280feead5353780c65e6b799fd26eb26e1dd50181c9bf76e5e2984dfb0deb74a4ec89b9a7e12f6e124b2ecdd82fa6d34473b9ead35b28f6ccd9709ac1aa317821bf3e92d952f39d9bf98811328698fa2faed3d9dcee31e334f7838fa82c397999bf7372f825cefce367b800d3369cc20161da21ea5f49e9c1704e3e9e6e87210b684df8a038b2143c780e4cb7bbb072a2fb94463ec095816bd499f6b5445eea99646ef1dcf4c331671e0948f27bf8bdc92616ce200739c86a3901003002cdf4f6c353a0abfbaa8cf9c34a8720835e6b366be22933d7a965f97286f38e9e8d21620a20131be8b97e7a67a2ef535f893124a9d2580222db771badbedee98c79d716bb3dc091101caa5e17d83ce35bc364ea143cccefdecbc0c4bde06d47ccbf59f3190e174c738f10433db16355cbb1644ef2ea8f33ae8ac8456afa4f488ab1327885a635fa2bc0df50133f053882d66f5fd3e649905a3d1495e41df802c216d254cc519bb78c70cf0fb0d28092e7ef4329c36df72b98f37165c229722d5e643817ebad995c8a361b43b7a6ba60a645104ffb57e05f70b65153965f0be99f76f1f798f9043ee86acbbc8102aa01a304014f082425c86e88f975272fe2a97261ac233e5b2491f0113fed7d6f31582d51f5bd27ac0f2f6a66c5f584607a8845a88c57d3efc64e07bed4f31cdf73c63bdc387085e2a50b30c8d4b393e055609680a6e39e3c19c764d3e4f01a536e2c112f3ac35cf3fa0ac77bf2189299f0de958876b65db62ba3d1b6b55b3f11321aece3b41095d284c4c23a6f86ee0c68e7517536e5f7fe09c6b3d543f0356fb98a75c2e06a73eba011679e1173009c9a5a1b7944ce1749264a2879dfc797edc0616862f582acad6cbe3615f6096f5b99e5b339fd9109b56ceeee55752145e5a6660ca4c948f1ae4169b54563f3ba206202f548fbffde7e505bcc9fae4929162b550bf5fe34af98891d57109b19bf31c57630eb2b9532df07bff6097da78d5874f2e9b2e5e01a35f904218771c8dfd6d230b4d1780875b45a1f846854cd02c43b76774ca8a0d2a1f7afd7df4931c1762c3fd5ae6b401e12b91641e64f3203159cac0aa43930c8fb14f5a9c7658a28399e9c32a77e738694a900ba0c160d8837b587be3042f412181bf2103b94329e2e143916323dc8c18d00d6e35f6f7e2441def99273d36cfc9685f07a7d34366a92e1f447e463bd085982ce62304a5e3fb1830b59292e94f7a887fea83d7bc014c94b2896207836042394ce50c0e7e2c0c9de867641a22e3c421e5b60a58291862c91b59e7bd4f90fbe3b83240f4b28ed38cf3b8ea899df3e569730c8a7a4f2a9fbec8cca2c06661e9058c54be3541c73ea24daaa34a659a564c51aeb2234140a5f110dc40261ad594c2121780b956d039d23a8e3a1a12aa99e5fb88edd774d8e9d22b3700998f91d05ed60bd0a89a3224c322686f27932713dcb24e363955a548ec5c625b7e30b6dba231f64934a9431336e74b0e891d5e1866965531a84761a632e0eb007095b90e8f8c409e051d0f4843ddab0e84f2711e4038fd6e331f53ce194823f4444a77ec73b082f73160fa266c4037fa02e20a2d01d617aaf7639df69a8fc83c84cc350807dee143c089adac7e052384c2f1460e9b3f3209b53b3e89156953255eab169715845f458676ff656689f77ba16ceff3e5b285c70515a1a5074231a02a97ba8492e64c70971f522de003129c517aac123a4509ecac5385eebaad022c7c5ea1b29f1ba4f68e7c5b88528b7731d1b46528c579d5346b4741ef9980e588 +shared_secret: 8d0ebe7aafeba5ef991b1647872cf097d625a671203c53a05c4dd624c087855f + +# Official test vector 14, seed: "e2819ef86853bca1b9dee7ee1c1619988964f9a913e635aacf0d96ca6e0300d084329dabd8f149e24176d22757404260" +entropy: c152523abd8248bed40c3827bcf0f8e8127037a55c780695e2c28ea3e041a44c +public_key = 24e5249c820c83a86b66536c8fb371772408729447f8f2bd61fc63db224d868b70c8e8ac6685c8e3bc2375049c25f941169291c38a0eb0f3cf027bc8324398fcca99feb47059e87db1c2b723522d3f09cb8a19bf7b2b35db5516a652b837fb94a6ac6701c479686ac758c381fa242d8e67b1e7f6b0cb04cee5fcbe2bc5b266dcb55f1c72b091039596c4e4e50db8741763c35365931bb37a3552bb3223938c6a876e54121fa489c502e14943aacebe7a5e7747bddf5c6e916095bea36dfe8059cac7adc0dcb10a64bbc2812bbceb001e22cd5438183f9b3249a27566098af16782c6b503b987a6a5896c1bd82ef7d3c5c77b82cc797bd682849826981187a1530b4fc07173dda9ccb8c5248583503a8b974e8b1ca39b1beae9ab516087a170ba4d12ad5e555f77f27c55c519226cc6b3246ca1328db15648ed4394cc038245bb7d9ea48af2350f0961283f195bd51304af6653bd133e241729b5a62495c8c45583cd4c30bb1c538fa4f86afe799026f86e1de0024ff13ed5713a8806cb9eb6cec9c94c4fc4abb2569d9486507137733e681a5eeb479c8256ceac1ef823b34995c65cf43bafa250a874b743388cb6541d8346071f075b439620bce761cbf1848953200543177e0154c9343b47ba3f5ca025fad201bed145b7e8abec99a404621a11372c930713a013b0cf4b346ea6cb64620859d458d0e08b5d416bc86552c79b087f63539303c6fa96aef18c6a61dc37e1e8436fac43763c9acb9b5955157cbdc15d356936cbc603f6eca2e2a53163591b3d2257d67335caf60b4223b8c0cb7c54454e3b4812e5760848ec0babd9a0d7da9e83719bb0d7395418c44d86bfeff4c8a8548cee6780a5388e36eb4f5667ac2182c213a577fa2c4616814ebda8ce8a1c5851e0551d356471a8051d179de078c9f12163b0234fd729c9b02c302997c13974b47aec7573604d8278783bca1a5f184f77047f3b1861b7e1c2dfeba290e785d77ccc37e0ad03c199322c475191aaaf87300ea43f6a956b7d03b338b147cdfa14467b2850a73ba99c6b39d89ec6fa3052a9bfd0f6922f9b37ae6966c940370811aad1572039ba3365d089016c21fcb64fe3d924f805336d49683ed262410594f8205bb2649082642314fc7065cba9b8c4421f1bac52f69ea8f96093f89342b879eeb785756587a4027680119d41bb559c758197d360342bc3845237aed01aeb8104490b9bcb4ac158f154b347a49219ca5a401f90d1c1f4f7ba521bb33ae0610767207f3c9feb991e7ce444a42b33ee5a14710586523cc98aa53de01801bf383e33ebc03900678750734311c349cac283ba827fe39f976b3de28610113291f61325b870384280c58ac9c48bb65c5d8a672c86b218e8a706d3b87f2341b95199956886ee0ab068d927ddd109af491d23e991f4e8619e4aae99053c4db3514d380133105ad60885a9fa5fa80c144a3949cc8c33b591c776d5a7a6e9c8d12417b4c1661c867119f7006e6520462b63e1770aa6424dbec6b9a0c2cdb8c8945d653e62c790d7857681b479fda12c8894640aab041a044d897c565ce882aeeb8caf42630e10afd12293fbec9d7ef259bf881c92cc7706ac41626bbe1d17373e57b3a86a3ba62cb6084869b58c659371c110930b6c75626651971641a899645846f96081b00f6c29bcf8c646210676bf266467d90eb393b64a1593b4579adb0b549e6648da5c9e2eb3bddbc78c468912dc674b126acd4448bb40bab46ebc8620288253156d8d39ada1b639c6f69d34e9a25e6b6bf4241bc00b5968282bab963820fac7159001fa414dbe2b94a74158ab43c6a43519f9a34a716cc07908452e5a0a517138cf46220243bf2e27ae78835b73e0720222700861136b2a405a241e58f37f132c588a1102a5344b704619666900c73990c2145497565d09e984f2689e315ab204c59a360534a641228768a9f1581532ea9d7717b8d8069158605508a24ad1c71fee5760605bc2d619b177985ce89cbae0ea5ea335529a20225cf83744d807b886ccd5cbcbb8393d5bf144497a4c454a2ac7589b5315937345cc02372fde21bec80c0ac8912d28b3348df2a88c35b7f384809f24665600583530226b50a6429217ca211946ea66451c9092e7c42b309a922465561b307f8912f29a1ee687b1d96d8c201bdd75a34e09d954a4267f21490c0eb74ae98fad1b5a3b5d2b9f70e9 +result: pass +ciphertext: 98b43ce1b5e3f4f7627465e5147c9ae5a547f3c748a683be0c41c952bf9134ac4aea57db428e0c534c8df32bfde046a4bb694ceb92ff9368f22565c10965512103c00604141bb05572e4d9ce098ecaf9c610ef9f9f371991b3ee605fcc8562bfcb8ce12b559ae3736e617846b75449a1d8640d8cd81b10e0e1e16d37283fd693876bedf41f4ad3acfb2c7fbac12f81d45dda3db5a0bbe6c79ebcf83f7328e5a2a477dace62f9ac8e8a82211613d7a59a0ea5a25c92fc868f1f2853b030028a869e8035800bf110436828b851b91a9af639da94d6dcf5997b42978f02df5316dcb445caaa23b57eb05cfaa8cd70de8035cf76be6d812e4e48e3ee10d3d196f40478eb06b944f6696bc700953897498bc73020cb6d61f86dd8d0c32d86e875fd67b3d4a506db533ca7d49c996facfaac18009d8e5876cf108c9f64f14cdbe1803235ddd328b1de2eeda09e1b0f2d46137be0ec466b9be1790736d38c317c7db5291accfe7003aaef4bb4fd6c77ba7acb36c9a7da91917ec5989559516eda9556aaf4059a31ec6a4b119b80e35a1d974dcc1cb12378c97e7b98bd42fdf0d5f6e1612bdd81246fcec86ea81aa635d8c1e7475afcaaa0566ad8f1c2fe556c0399da36bcff131b5f5af6a93877d4f3a69e1d7b51667bf90c665c86018204d496fea4869116035efebd7b7ea505f77fdb6fa8e5b436ef053c6ff72d4f11a40f7569f46394a6fee11092e37fcff1b881148738ec0eff7004ab9bca6c3971b1514955d6436356510018b90c1954cab172ab8cc852c0aee45f2d44bf5e4e5ca48d0bcc683af70d9fb5e90598c81e70c4ef11ba0fcc3f3bc0979fcbc3555379400a858e2ab05509a207a8edd852c8ec0b64a616cebcd0c90605d10b451bc2ee1fa6c4320193002148f7e0eaf8fe480d9f1865777515905f5500447ed1dd9fb96b0da711bba70efef9ee86a3c1eb0a523ccea666d4dc8e6c6e00725cbaab126cc1d0562b4d6d3d08efab09a1e07ebed940d74240e12c171fccee0a22df8dfa768979e5b8bfbff75ec945c0d86b3c8bfc41be1bec09c1998e4d54bd9ff309b1b8a14123bb963c39902478fc70010e43dac70cc799f439b51fa0a56f53c0b792931695820ae1aeddc75dcc4b8b695409e4d5d91c5170dc8852a68c0def37a69e0e449bff582e1ca9452b9a3109800349d3d8f648ea219e22d79363bb1327f459bff8ab2a98325b3f2ce2a16d66165f3e3a353d82a254177baa883efeb8e2bb4195444f90aa595831d059988548535c0fbc70a3ceb954171000f300d7509f3c306207a92aa5b961891417e97ac706eb7be17bd21d144fe368449fb0104a0f84211b884314fd894b4e227c81440b37e66962b80723823b4f0ba3584ff8670d65e07ce18d1aab6058a1f42b33ff9e382eaaa8a6c3ef1bd8bb3ce9bc940b2e9593d54f1cb6b8ae23488c67ab4e14ce11592114373024ad4fa3f946a187edb673a28731787960e096a00b956acb5912378bc794179306763661a8ee183cdd786bff72d946d53207b409ed9f76881c2518163b0215a78a3a0b3120838ff4103192d2e78bfcbb5397911c0b3ad281762fe4b760f5c80f6bbdd55205032b60aa26781c23a18be4fccfcbcce7b4ea8ce9d285df0ea24507994826770387ba75fe9cf229a569970046f7c927aaae551e40e3c56b2c00be3e5ad6c364eee23cec1f4002e9678bdf12c52300e374be3cde9a434dc4c015c985d63e36327ecec520c0a7f7ce1c92dfe2b780a180b42b6495d1b49d83e6602f853462c83817dec59b9c67ba60582f20b7d7362c04b5f50574fa9bfc5221087e94b760b6a84788b4c563f5c8e77b173098197e2d23d060187cbd13e11fbc252c7afe39b3d84bfc8daa8fe7b208bcc694ef7050a6d47dc7de96f54b0d56017ad92f2344713486bd9719232ea99f9d049bd9b1f221b7dfe705fd5a29d12f1a08f4d02f4811683f3d7793ce079f5ea02d6a2b05e2f82348ed7f5e2b94cdbb3eb9558e9fa6c6a538919cd5fdf66d7c56358740c76ed0af28e7ea769a715d4e56367c9a2411759508a4f761bc4a76c468345009731f2584427f648e8971847ac724282a4d6017b4715de7645559218c3a0d9a96ef78cac19a05284d98b7e403e1845fbe5a2c9055bb779b6851d7321a2489090b2b1289298abe26e98fd1bff494f021485114a8a44efa64d6c1e1479a36912a6dcd1449b3 +shared_secret: fcd665fd50eafdf62b40f8eee25c6f38b5b4d110e329399460596d4f5c0bee30 + +# Official test vector 15, seed: "669c4ef8a051ce201da65fc4bc34d398ec1f806276fc5d987ad71d93bc12dc8f107b58be6e8422a0795c88cb9a0e7488" +entropy: ad6466dd59f26b762fb02b19eedf5f79964da68bce0459b91c3a6ee5a7e01183 +public_key = 6820166411abe7da1944fb933eb009de46ba60e249664722776b37ccf770b187269cb240004aaf74c37eb027c62536ae847b8ec48a6b2a9ac68307802db576b70226fa1b951da9cfe094a0bf4b0b306c5e030baaa25baa591b289fa24148c7ca16a19e0a0039eda555645bb65685a75a57028bb29456e4c16ab48c06d346ba9925db4184adf635e779522c2670dc5bc1ac86c662eb37975aa806a2b2e307904f6c6a0d094828aa1c07891cf098223ea78967e7af701273a8a1859adccac61bcd0c103f3c13aca18689397bab1ddcbdee2ab113ec6932c68622c513b0d66c60244cd77441c7aa964b5331ec11a088a5034e064a1d95b4b389c15c51426fc9a135464416881858511fc894bc2a3b0b742366dbca062f2c3eec28bc3c38c809eaab081c5dca65bfce171057ab8467eaab50987732b9c85bdcaee647342c3660950b9ca7c0bdfb3bab69268fc8486397b540f0831efb861ac11855dea4a588c4935847a644a470f055a923162f1dbc2b699020880cb08b80621de33a9f0aa83fa2b5541aa2cf41b98214a5fee14785661a63603f0492163b47829c71a7afb0b5efe94e8e225ea2c0179539772a510a5ab5456be4670a076ee1b25ff62687a96284166576e3e773adf2c061258bf2d28b1ba00fd485b8151076eac5be6ab7ccd81312a9ca938f256b6fbc8ab6d3c3a1da5c75e1806c5c4cd4202c0b20816e368bb2443684463ed43787a89236fec32fc99891166462852750a8c1445ac407924470a56b1cc75c7a378a2e40c00fb35c0d4f65bd12f49911fb923bec1b635baca8428ec7d13b36079732838459c669f7f0c26281717ad45eec972011c66d63a298b95566afe11baac79a67dbadc882815d014549cc294b658a8c00a2422c0d23f6a0be9bca232c8374e616e749623e8a99b0f96a08c95897e88900851076b1b470732ec2462bc9c943255bc475da70b44b134e0cafe8f3cef42972cc175e04fbbcbdf4cd151639155a0469651408c9292de9383e63c08c8bcd96a69a3ebaad9b2c1940a37f6c32b1d3b702d28acb908cb2c7b88b89a7ad4c87cfa6c53987e4721d2302bfb53ef3e9bf7319219926bb7884111fe2c4a9aa4c4c1c0f8be3bda890c0342b56f826a6e971c33f900408292c5820c92b66bc8432cf735388ddc35eb004506d8a671547b7f324741f609e2121a0592644e7e0cffce7280f77c34d05b930b96ec9c79838da4a78680da3b07c1485081d14b9d880bf3ec61d852114d738580918c72a270d7034412305ba10d6a5629a931747611554602f529f32356d9e0331de2232e65c695af1b597cc816d001ddca540a0fa3ae67313853b6a46606c1bd3b32d193bdcf2cdfc2c1f9006724365550632bae19bb3d60804d0c80f17681ee020c6cf3cb7c19a22b1d4acaa8abb40f308ec2cc6616164e106a06f700bc62266ccd40d4a414dfc818ef3ea39540247c0853309d45fb99b84fc3ba114c240915a19e96b742a234ca1e0183e60c8acb65ed2c8a7d239b408c33fc5e31ae83caaad17c24b99238b2a52181517a1202c87a17f22bca93e758ed95a895a6a97c163cba8a4c0d0b980e9871fa8f595a668adf927c4538374c7e65fd052196a64cbaa23969a1c07145352b6829aa9e93993c640e0f62b5bb0228ee37400619eab437434026df078bef452267841bcb72844e836ac95d25439567a76f69a3b2c6cfc1c4525f340b40c558007b4f76864e8367cba7c71edf2aa9ec56f25f606cdd66cedd0937451b95422a509b12553a8cebe7b95bd97b45564c98d20a9ce8c51add836d8c00af538b0d0528507bc3924a731ac05a688a1680e050b770c3a8f49c654138bde367f4269abdc4215175799a6112bbc186b23745fb0cc3f2bcbb6ba1670b1834e99e10b2fe25003243284c59ee4202ee28a6ec2086510697240d60961398c77b3b046a23a55b89151673e1ad8a9de959923974c540902716c973ea402b3576f5b664da2a104812a6101996980d68baedc34f9856effb6c457c8332487349ea3b8bc67acb7fc509c22a476c331af75374c57b4c010675d490da92c7c60ac69d89a25e0d67351aa5c9e9880bc1386b77019436abf526b319ce44cc759b009b93f8b9c3059bc7c63ab483a749e1a761e90587f13945674e85b7c896280d15d2d20bcea11db480755602348b4616400faeed3c143406ea9c1307e37e2642ee73c442a +result: pass +ciphertext: 5e0c732a103af159a069419ace2a1d915ad5c589beae24c7ce3b5330c10c59170511e4beeedfd369fc2001ae60466c3be35a244469b0260c39d59eb33dc744eae2691eaa75a34811054bce72dc3f5dc7cc57fe96913911e27e1dfb7a134b6845196175bbf4531d87ad6e8145950df2a98cc571b35d9d20f638a40a3cbda7d53ef3eafc890696cf511cc962fa48513534877fb63d69cbc4dbe1471d6489f5cdfd83222ae0c45abc143554e148eb3a0030e9bd687fe684a4218f2371640878b80dac9242aee40d7d80971baa2e34422cf0083e59ab6be20f3c8aea270b273952b8ea7fa0c0ddbcf55769e548d549f4cda9b161f0565b87c7cbbec7ec157b1c578e03bf84264c0d4d84b7660ad4ab5b009a3c85d995d4c663cc7eedda0f2aef0283143bbd10ca643b4eab50961c7df5a633860f735a52710bfaa27b3a3ac4dbe56a82632bcda5c5f70b20d241814e7f6e9e6b9b7f089c30294a0899e55ee74e366425849483138ec5ce41fe4760f94e630e9030a5add852d30f2ecdcfca1f431f943c82299f5032cc79f4baf2580d15881567957fa266c18efcee6b34085400ca89ba05f696e39f4cb552944f2d39b4a0bfe9d8df6b85f5547f16cc3ee8e0460ff7af9b4a236e463bc9922d99507e069ce84ac77bf56366bb1a6eb58d1cc7b560bcb47578661682aa24240a28208bef802e6df94b1478af7c103ff756bc661fbdeaff6a841af2c0b39f75df4e078a62e267fc1c2d491d589e0f9091e764568691f3fbef675d466def5098322e1313435b689005bb8af98865bad6de64083596137ff4b36091716445bd5ba416ee0fb961f65bfd243e841e5d2cf0d822678a1605e353a8dc0898d60dc3fe8d2f4ae980f8d135a6a74779f85e77770830417a6ae47cfb804d4b7cec8961ab44b12636d0a9522cce47bbadaf947fb91542dc71e059a669029dddf78947abc8940873b4f882dd3526bbecacb737f2af651c0ed0d9b01dd198328e31d2405d58dae57e755a8500ec058a36ec66885eba5bf5285a048d913df95c9872edb0f19ff783f1d832f9b24ba194b2ada14410c6aea961ea029e4179dbe05ccbf96b62d34ccf1148ea799c644201d6df9c14ea208a38b7783c69f0ce80131e46d5523f8ca82229652585002a66761b702a3565f62d4955124e21a29671e5e71d03059f341ffeeeb4959487b7d26a2da280c340583bcef0f719caa1817c785a1816fe68f32ab5f426c5a0b06694974151c7512e9137db5e2dfdd5d7a29775464ad44b98aae9e1a930d2b35cf0cf119ba74752bee665e65d6e968c286370eb0ad177777c8b6504c7551a57aa6875f18fe54538fba04a74a721f07c893d211723c8ca608670bec9be28e249c4632ef63e59dd790617e9ac0a8bf3c0eb419fb435c346803bdcf2112ad81edea320202e21718197e4bd995ae7f7396ad00b9f8bf11b0bdbee0061bf06a298eb1a837bc14b0da80395d676140fc7ab22bfdcd9e3c087b122c4fac6a9a9e05706c93084be7610b3a76902d846fc93b782d582a548b3bbf607b30bd72fad1781e765ace7861547188757ba4f63300eb08a19bf7597900048ac1731625b1db936b02f56225b5615850c97e507997eb402d9a26b6a6b25fc802e506537138481fed4151874929d70d8062af6f1d3ac6ea2120ae799b124b3c7cdcd639415382f0c9792efcbef2fef5c9c514266fb1cc704f1ae0966a05169d342fca180363d43b9a0f6366f3d8006fc748e1c5d29eb65feb99127b25ba8340efe4c7f3886edfa6c3e05b7f9075cc66a9e93e7db6b8f57bb42fe74de1b1b14c3836cff9b7273729a7a7281cfbb9cb11dc8479ccc3fa6344271bbf1c1f03648ba971100abde22267b7681d2e7fe6daafc539cf8fdda1ac18563297be8f48c4ecdf91eae21a0bfe5c095151891c69f01c74f71ba54d4bce13cb0268c87dd8335043b210a680219634d9fe00173aaeedc4ae6f86acdc0e85157006aa48bc20f4ddd6e90b3e1eeddbdb84af544055f7f908d5f31c559f8ccc592cacfd6c550ff92e1166eca53d170767656ac402dcd437d084433a60335e3a59093cd2b434f7fe182e68f7f4911463ea2bd23e01017140967fc045d377f81e1ca8c3c0fe2b649386dcbc20dd243448b2a0b0c7f9b776a6be6aba385e2e61341c4d3c59443552a99797171077317df925a6961398db170c14361a15043b256e972289e +shared_secret: b7928b922df5a82fc6217de5f086de8cfedf91cc521f1207f3d912b2274fcebb + +# Official test vector 16, seed: "9debccfe818f6b5204db4ea09c03ec9a19dcf1629c1527685b8a29776bb1daaec45f8abf8f0adc9a8c8bd6e2df6d8048" +entropy: 1a4d5dff5847cfb48333e33bb00ca7301b144aa89dcd412ff5a3b1081d775b7f +public_key = 60045ceea77d8303982ab9b039dc4c3fd0159d46c89e618304fb5d4cc53e9766138fbcb061b56ddbd61e33873a953590f628c122d049cf722737b54d4430c312342189b59364e14fdf8cb1edc540c39612f8e2bf88710c26425c09dc7affa63f52fa01db7794aa2c2abca69145e89c06d40189fa704dfc4b252811b939118f1b9928d0b0b6767a1685804f502a19254ff89a45d9539c9f968835013b69a362f634b269b911c4327520673049c00e0fc437448c2849089918ec93c2ea270bd0699c85898c0148f4a1095039a216a51143183f4d695aa456c32e8a35d351415120725ef995010409e1176806da6b6e08ccfb3093914c87c107cd14e11f937a9f138b928ea5580494c6eb643ae33b5600f7726e2004f52cc39ab24d0cc9c3f9e57a0b821fdfe8404e6532bbe01609a61def2b4f452a1fbff381692975e05121e2330c789055e5a4ad696678bbeb1a8d3247d2257ba246a2ef966c305a8f4fac73a6fc08f71ca500aa9d00962caab7a2780cb94c209b1cd43151f3248dd344bc9898b7780950a10211d73aa0ba20d89b01b36623ed8aae48845e1d7372f12b9a692b3d525263dfa12b3f312f91b5802d3b3380e58be6a92a70e77cd6134103496dc3e9236ff17cb0ebb04a1783379baa0a3c54cf1c5eb1b4afcd9a7042c50d6405b1b610a9429aafe61a5423055af9f61d3617be60bb59ee8019e72123069614e738a46703af5bf25d31ac4f1357832b1232cbb9325e522e79571a1d226397e407e4b08b44082e71e984e463747a230bed934127e892fba29b88857606983a60b9425008117ce17d20c82b6171165e940530254f2b0cb4e5c235dce373fe1450ee6457da59c331b17f8d4b5e0bab25aac789c04acffb957724783d00dd24eec3375f97ad838ac0c261789cd3afcd68b2d53c0c9bf944f094bf0875c0f08c161d3618c774304ab25563981974ca2e13b5bbdd210ec10ba39c64635c9025b9610b623c2f12a768e03163d75315c7097782b69c44b3a0c33a552228c6001c5ce194346a80824627b974d2c64fba994d2c62f8babac47c51dc100c54789f737c61b9b3420469b11d110dad9010c6c67ead2329d3b4c665ac528041bfd028612c608f87f3ab74b6b68309317e1c0ee5662f8dca46c26039e2dcb1fe8c42cff0057d4bb3e4ab3bce13c142e589592c0850e117cabb2cac88431461a5e6743695e096099a8249e22f4033c15e9266cb00a9a36103ac473123e95d373b0dc92cbdf6b2b173b07a3771456d283c758ab963811e5168694cc20e64e8a677e05e3915c4d93c8531b75d430b3709753f899b1c45434be196a3fbe5149dda2ac0912afac619b4a45f3df262f7d617322a9e8221a79f2319e6ac59034c80b3214953419a191b0e4a25247bfaa0defa001d5529b1cbb9e63ac03768404645bb8ac7ce25687be70796bdf516b76039f7b689ce6c3f569a04c52875ecdc9fbc97447e0160e75a89215aa263091e7cb5534a97660cc8515ed61d9b624950c089d9aa647f787a8ed7c89216694a83c56cf278fa94340d790015b914d09ba91e10ac5b7ba95792bfe779966ebc07ac6916fe1aa4bce56cbaf506563319c5a4c4344344b472226f59b7fbe7982c08afe9a60a80c446b8b341eac220fa8a664b6b1a0df72684b67bf2032d75f5aafff7cc724acf3f1051ec3cc4ce8768fa9ab51f960f3293a1fc527686570da34404b5681967258799fa26f22179e18221f4babc2b7c46601ab7ceca1a345027d44783e7d6c511615b108c4197bc0d9ee49c91621074a907ab292d4575abad75a19f10c2a493af902252bba57348dc33fdab3217778429680b4f352b52445eb662101dd22ddd211f314577cb23bc47c7176942c5cba072996c048408a5dd795907bb2e2f49acd0e75a93cc4f7938136d7c26da0691c08733e8138caed6c8cb116b900869f9fba9f5823b20626980ea86e6f487af758830c787bb1bbd8de024be9765dd04b969dc21589312e709cd6780c9a38a8207fbbe74f220c3c33e2a127588b64e3170999d3a77c8f67eec947cb69649dc64010a3119c9030e1fd0530cf5c3b73b631917719d0983ad0a06d2963741289a282a717d7487acb30354fc74b005ba01101a1c8b52c130a00339bff4f480a4e890030a709b28082d3c501b2aa2d14fbef9e429f8cfb50e84c327ba02edb7f6abdde459896eac77b5d8c7d7cabe +result: pass +ciphertext: aa9d348a26143a9b7645f5ca60b8164bec6c46f77160898d42692dce57ba70b1a76389cb3bc4565939d9a05b0d8c80b10981d94cf593e001ae86bc722eec3af8fc152737f283b23c1f87beb4750b9edca2f0832a902e91a3fbb3895f915c94244189c7e3ac05fbf3214d319744f8e62e1218d29b501fc210e5defc4356d38d18f20a2a456e770a2e50e452118155c57569d85b566960dce62cb650a6476145b5e26ac71d9db03300283d5ebfedaaa84424c3129e4ffbd10d5a995cc6801118a13cd9fe635695a01ce0befa9865e9f940d8ec5cd9b5aa4163a525a37bdd5aa2240c071c99e5a55593ce0b8aa1e46be7682175ed83cd369a4df3072fabc968dcab66361a650f8c3b9a85ce39db4351ba975dedd52825a2cb3392b2ac34cede2c17d9bbe8134705714832e55921fc91a5b7e126d0379004a1d2aae26af0b169da33ac8cb56352d51e474a078bd192e7388ce8bbbc1c03c7fd129cdc21bc529a3c6ae161b68765338d3473e8e5ae83a13aa4f279d72c836b7876e0eedf1cc9f956dd9ae68d016d6f64ff585739c0e6eb94f7b1e34433e4a52dc7653c9334a94b8d52cde4df49addc20e62bf8e682d762a94f539fbd059a9c47a13a6adbebb914eba693ab9862c5ef480389a4b7a6540a24f994d5d105415641190395edb0f9085017a1f1a4c399b45ef13054d9ab2c2b288695e82e9000ace60967501e0030144465edf4c843b82af76d4849aeb1e357c7863ca92287996b9fc794f5fb9593c5a31fb296443a89007f1ace1235e2553498c1e9cd67efd33502227ae657b31cc603c6be6067c34c99f338e08130404b1100bfa732fe449ae17ab8b3cc1a8e8c96404ae9675982dc6269a7dd2bcef77fdefd5e767ed3bf80288c8926060a0ebd6731962d3ec846ef0784a22900335ac90e68054afcfa4d0a373b1993a42df0a6eb1a4fe4f371d6dd1bf7c1c73fbebbc2bae4497b9391d9cb7c1293059f2f2e42e485c4a1a6cc7adf10da6559643a11a6184aa62ef65597d4b7266080518c646ace2a4863040934169034c1a1721ed73fdd2ebf704480c0f5aa885ec5be064b9889ea9566e72a5f32be32a9edae3d8bc8513f136fadaedd0efedec6c08e934f3addd073f8a6ed95015ba1c240f85de99d24053babf604e6466d3c61b8ea2b19d413a173d33663e36e8871cb4bb8df1f7c2a0eab6b1d985981aa61abe005cb835174556d53281699e1dbacf6ca1bc517540d942b55d0005cece29365d18720ca24f05e697da16be5e135fcd5df9ef9741da03f1c76a44fc31f7dcaf8949bddce95eb2634439c5cb59a07ca03ed199b6a79970724b731b6bcd34b20d83f097c47d56d87e629166c27a0a888cceac6273d67e8f6a62ae0e515d96552cd8e147a6e67c6fc4fb6bb1928ae70ac7271e583026d40d423da81b0621a948fa966616e2d5e5375421c715dc8c81fd58b3c280214ff5cc0db1bfd2311f7d126d33553e0fe2d195efe85c42f56f67cb9486d279ead1bb221a2b8d83da105c5733f2b9ea60d370f4c746e1063c1797c5e9971d913ab2708f15de5b78b26414d3b53ac858a901a4c1914c89e8c147e5f30e875938408cb3ce54eed5f7e6ad9966198ee24cb3be353bdaabd1592c1886948c17466adf039c20bcfe4db27a1020fadcbf34ac7cb36b2b6757d94187636ede4ba456de96416373bfeafde43ded757af3e01b6ad422a17d330f3ca8929a28a163e7d045f149baada7d7cae24b19a04f06490e3cbe658496980dda1d82b21d460eb1c46bb76ead1d13fcc52ce1a1a15063550669afb3b20d16b7184e68dce36e5f9f7df838e5ad160c6748105cfaec014f15714748c5a10fc377bc59a24d5d770031f82e0925f184de62890d9205ba132800731988122d161de63f0313ba563233debc9890752168a4a0fb24465a8d576772ad7434e1f3a1413244e397ab1d0b0607a429178d247d1e8910738c1ac1f4c7844a6352e95bdb57983fb36c318cea8577212f7d010f30a82f8e86fd0100d0c38204b99577465dd0c51c6a6a0801cd977149985f7fe6d71de1c0b130dfa4e127453c9adaec1e8e211f9acc662dd43d4bf755bdb651457dcd7370b9e88b84a38c7c4cc94ced8285f4ee8b0e2b646d5aa2682d84ee85a6505989c757857a71bef9d4bbda0f1593de4ae2858a1d64a9019b2f9b182f37cfb1435390991c3d0d93d2e05c2edacbe117fa7 +shared_secret: c653e05ceaae3783b2cd20961c12a4331f920ed695b6047ba6eaf5d256b8af1e + +# Official test vector 17, seed: "8098ae7a92c10f707d405f7dea02c2efbef44efa132ba8aefe81bd45e543ecec74f10920ae48a40b0653d63532517f2a" +entropy: 34f44ec2092eeaf686f2ea170591a98527cbb03a4fa9477a7aef6b41a54feeb2 +public_key = 944633d5f98af3845ca7c37f1be75a52410da5d2bf9d102305eace09009e6ea21b6c543a25032612492b58247f13f01c6ebb27fd469dcfc83ac93071d3368fa128a4c71475ac1817a8b1744c9a2085e54ebb8455bec286dee50cbce87ebb0bafc32341e877aba7a5ac10dc99b65687aa53cdf2585976a06bef586e8993953d5a3cfad8a7593349f9c31010e6becd32cf6ec70f4ef88b1ab955a5d6aac2a877323181668a2c731726236c4c1f77768ed06a7358744c91c690029c4c747603289874032fe6730d96392805e10b7a50a6b849985083caf8d64c1fc257747613b9e6c85e455ace3755ca9034089162d96346e3f0cdde0a81f6a7727babab5f1401dc1832bc175e3576b36747101ccac305d28ac5386ea92447f483408aea6ab22c1027b99b9f14a1b6a67a24fccfd5f52295dc11995b9503d76c7d0ba51abac76777b960c45ce8dcc24ff6031da9a99174be42a381654b5c9697b13188a38c278d94f801a2b94685acb0935074c06272e0ba87b6214f717c01d9508d77535e444b5a2b461d02acb855d7309b8ac6b7731bab6626921160e1a35d0bf14deeb922d770be063198d5a72de076216bb366a0889773bbcdef5872934a894c7664f568ac7f1cb5bc72587767025a271db13a0ce44697aa4c0dba80a730c0c1c2146b36a50d23926df520ab3460b18687921de988c2a7c97dabacc5aa849068ad76f10b361b9a2d1436bd88c962ec724dc15a6583ca8a41704f3946da465042b808f2513b65a5009da5b44125308142478ad82ac64940164c24a599c96eb69ee5e4bef1e45066e2cab719b57fbcc03c1985472cad16a2699e4939b2e2850c1b24e8049a41362b2b908e52e2a9f7808d06a6298e059bbe1c5a87a8610a06af0262bc61390f90d962ec95bcc907c850721778a947677a226c0482b5704e7e0176f1e28e27150ad84093ae862682b4a74e8a7d330c4c4e144c3a39c3a3da3c75873dbaca4880c2940ce30ed10c395805c0bc043cd2861b2e9c0da1b59474f8c492024cecdc7676d4b8c4b3311096270d29057d05cba6494b6aa07379b73bdfac9a561a8ffdd3a43c5877d85749db9c8379abb29f7567fa1cc57b09c35e7b6ff3f735cc18473049ba2d5837edd8176531b67e04a509ba811a9467c633b962e8392d065a03865658913f494501fe9c0a6a649dc8f3256b6274cb6235b0cb278132676d028a24e07595f56c4727a7b11830c1c9840c002db53b6198444e5b63be4c46be9548bf4e1598ea6371686c63da774270b82c95f0c9a12b5c8f9a591ec50971d897b3c1c4e0701da5e26be2760ac99b481151abd2a20ba343bf46eca8699487d14a9667565ca4e30eae468ac5e6cae54b4adcd5acd74812ebc3b4066021b0cc890099b911553b95c794643a97f99a512ce874f10a3c250a513c005a70605429f5943600cfb9e4b2c5e72c821149d9c2c554c43d9bdb271806ae8b58506571c061240b6e7967417542334773178424d46122c7212e0ba7b5bf4388e8f4a3f60caeff712c1e3773fe51b357584a917bc3e4fb950c442ae17abeffe262a4a6550576b6e8297ba723943ae3bf60971b9b86cf952c806fecbe937c7b15c91c9e438ebee95e51d209e60105bc43be345167ac92492bba9549807361a06f525380f5f19f7d1bb926cb1c2fa726cf371174caad5034037d07ae2f305f4ba52f9415b0c624398b936333d68625f533d7da20d62507768a73f579ae71b2193f52a214b30921dc121b6c94042b386f52a202794bab835a9391ccbdbab2ddd94b3b04acf71a12de67cd24d1a85e7330dd36bbb6b387acb6bad3a59c1d292fc24aa6045c8c34ea4771b8137537b644997eb45bc2ef2a1165b308d3c926a0d23d09e749a142493a99ab1c3a80a87c3003990956729ec1c6c60a47a16f495813cb75c995aeaa481875830f1e906fd6eb993a8b3365189d1b50627466161451a21ee45397971d8f56634d90cd0e136c9d82729f8a76c61298a1a240f611824173abfb52ac1aa4bed85b4b18939988895075e888ac0c519ec75ebf693d3903560445414ed3bb3d262074981524e361efe44945b14daccc62e2c335ec40bb4453cae2524229571eceb64a25026b3e1ca249c127aacc08cde4203ebbcb6fb427379097fd222b4e24cb9cd47381c6b780553dd196bfc6c356f031eeed6c85b57be19afc39dd1f929bbb2d627f5f19db +result: pass +ciphertext: 6d412e5c3964d81a28ae3bbb3d82723f10ca2f9db3fa6322598a429b9e108652885c174ad8bf1339d998b1c8cc2f17911a3653f252c6f68f4febb61279cce5a424cc46bbff959ede8b799828b2d2a7d224c9702b20b5fcf1a69788d470f5f8bd351a9dbd7e1654cc2883f9b261e2c73f40d3a97113b00673dd6da30a1e948cb1dc3e7a7611424cc648c2628614b1a047bd7cef9a069908b4a25daa193015f8d01a99dcec1256686aedf007c09870cde994f5f1b353b9349d57ecd449f5f6ca036f60bfb3f908e63c8fffff202f0132c8992d4d14a3f1c71dbbbbb1cea6746cf77bfabf8e0ef00202f3627b8e16ca61cc37afbfae596a496906ec3a4687e4ad72ce7781bcc9004badef6aeb2f72cbb2cef5b10efc9f39ba2cdc486b5d077592570ba3306b0ba79bf30c4486b313cb8a44162b3ceeb16390abc7762ec20b5e7a8270abd0468ee473bb3d1572d5df8e5d07066c4e30af725c74552d88d00627c32542fcbbb66af3eea4c495138e6c6a9922c96c587a51075197422d4a58d6acd810059747464569a4a50b24d82809576b19bf93df1f311b2224d4cb86886e2739c1b3f5f4edcf9fd3e6e4d1b9df3e2fdb2a10ad9bcaa1184d5131d546aaeb74c344f309db617bca6cf5adfb4b2bac58b6ad1d0fbb1cd6936461d32e58789c3b69f048c68121bcc1e00bcaf1a1a914caf9b56c9c72bcd9884bf1e763640a6a345534fcf0fbaebfcc5774550fad937240a84619ff34df18dcb909468212c6e68c3435d4989e1cecae914ebf5b0b14d0d512f3ea72b8989fbdac9feffac66ed5ecef1ecf41d453a7f2341207ebf6973cd2d6fcabebb815d5bbff4fc8ce850ef3541e77bfbc90d302abd12eb8cdf3d877e413d82aa2060668a6c9c7a88a3cd7c4ff3c3b53ddc2bb9631a3f36ea45180a6af6ebd040aa79e80492bae5cbf5ada46bb40f66f4b1b2b01fb22c94468469d96826ea4c120a1bd0040dfa49ba3bf4ef40d6b2b303d7542a3a021a9591849d7eea8aa29efeb8b591fdb86abee4dccb8b4006a509bc4f35782096aa330f973bebd99ae1225d74d07d7a9c1ccc1721a861900c0b0fdfa777a281f2cad68f70df6b1cbaee12350a666900c3ed1b0adcebbc4b9423f4f05469428f774519b84622078e4c23b73d0774ae055619355bef69c1c619986c13cda903aec68a851c5308f19ac98ca11384fe8c55d1ac5dddfa7c25081e0a1c8a8206ecc6b73bd33372fbc6bafa2764773a55a9b061847224ec50800ec2118de658b7bfafe47d3ab154b6ae12cbbb94464ca65edc616005e6b14e919a2c1d8bd1f5c4f3a1b9ec9d115d68c87d0293607a87d9c7a02123b71bf61e3d75196db377cafe14da53ff9c6d7f01eb3f18d43265eabc52ca49a8d00bcf7c226fb2bdf81d8edfeac40ccf3f88dc1aa74206990bfe44129e6b4d4b032ccfe30505d0e3d9b1ac0e9022698f9e010b77f47c7b37f3f272b39eaaf12fba68a4645f9622efd080342ae3c48a3a32b1d5914887c3667aa4028504f03ca99f13580caf672789f68427786513d23396455c01e5a0eeac158d1463f3a8ecec9a2bb94a027b065923e62ae458e42b62a0a53ad1cb83a4b8ce253000eadb124222e2ed5f5b9b86e807a427522a32e08d20ed45c6287c664a50bd48dcf4a9c67d30214a628cb5f6281b0091d4cc5e4305457c8162b475b7c10f93fc8c4753d5fee5b33ef22ca6f01940004b8b2f81751c4b01d4fbdb6453edb0bbeb4eae9cc5304556235fdb85a4f9bf011311ca85fc0114b5ecc8be9e59ee43750ed6b5e3d3a8a6896e91ef3e46877ee51d1561811f06058dda0705523b6fd20685f982ae9aa18b3b58a117563e2059abfe03c1bbc5a30220604c3184e51e6f626def6af264de64724adb2fc188ebde8f11a1a550afd6dd06a7b5847b42d5db0f165515c6793ea9138dd23dca2278c805cda53604b42cda8ad762cc5a5dbced461af33a9b83b4c1e085f1c4efe174b101a1a43c73efccc7bfb0b7a3a1b5fc20ba33f34037f25cb2b729af2dbe46e253919b0d70b474560eb4a7b3c9aba5575ee6f7b94de0a09f9e595c9ae67f566d1fc14ca01fc8f468411f642d37c3d521604ab26069fe9adc4a70a4c859502b1b717eafa31fd2a42f0d80f0f0804475de384a208deab52321b03f2bfeda30795c91ee7661d7883aa9d456885cc9169d4eb90903142e07def749d9a46c3b2ccca0d +shared_secret: 9fa99f495d5ec88b908a180594ea391556d73b5043fd53e60413cbdce7512ed6 + +# Official test vector 18, seed: "d5f23808871544e9c1d6eace2028362b48e225312f77663e9f78cafeb512b908cd9e25875d61a16ec615f4b8ff826856" +entropy: 6250c81126572eec2da330271db36ee591f060fc7e53eeefe2e1c476c675fa33 +public_key = 6d3b096a7383933c0cb6615824885499f79dc06b5e874203c3349b2c3b27b1f1012e52bce9968496c068b6e6c7244722621a1a44349314845b1d8831d9821eca386eb8fc254587be5dc529438485b3fac44af0613732509cf225f5c127a4056cd5e503eb742cf03154511969e7a743834708d71579e9ca4a4e281aeb177ef50cb0db826ddd17873e63a182e3b001f659ea3cc73cfaa5d7d7b5e7e9cdaae04c9944978dfb7ed34248d976190cdc0184930e25c6306312180a0b8758395d1febae95b22e0945c5fe265595a9ae91616cf9f35b588b7a02f66d8d49800c50017c7272bbebcffb10a16a5c8560130d96fb0c241a286ba949620ab83539b83d862ddce2507ec4b4bc4330c27517172b43bdf09a5e6a5fb684166800372663544859acbe07424705809587a08dc50fafabc1b2f9486ca6415266c502f7b998dcc947c7b5f5584cd34cc90a4c385f30a2cc051237c6a85d4a5571305a5182c970b9bc87268484f293464545f4c349e8b2ba3e5b4a5e7c42237c0e6e1b7722b04e3d02a27d0597d7169a49e340a778179a924a1d31c0c3d53bedb46868a62ae17847f130ad1478b8428b09fd71b028f1933803318af78103723ae7e1185801872f847753862f9f72323f980d6ba9744cb6c079341b02443b52e4becca891fffbc6084ab40bd17af7c6b2b21c09c170455c52c4c7093c44aabbb1a0c1d11b12070894f7649112f32a98d976c72291100a3bb4948f928771b063839a94a614227587d1a9bd25479bd8bd06e114894bca10814f0c516e1be41b81ccc6044a8f3654679df531c7220982760aa39a4e982ba3247b009d405c0b50969c694858889b4058089631c57dd1c5fe12acd5b27143d09a2d90c8abd8930d16769aa44a3927967b2975a329bce9599bfb170e02a7994fb90e0b1c7bc7db753c065cacf820b80c6c1d585624c93ff14a26afe6245ad8a6b2c082ec871dd1fb10c3acca1898520647b8ef8c0e45580c87f718eaf18ed4e97ea1516acca657bdfa16493115e6c90eb998cd31e6ca095066bc75057b2b71ac2a75711a7820984ae9306dea825c80f26a1ca6c686189c93550d931a1f73fc3ed0341ea703c033bb463c6260097c54bd17996a82abb0d32010cc53d81b7b7052b86abb6302b57d6a34895d09840b3b6a50c9962dc248edfcb328e94460d3c82819cbab49a79f742a86e85577ec995a025fde616fad52c4f092bd89286297d8a8912294faf7c959ca392cd40989c92b8229ad3ec91d352a6bb7d757d3709c5810b40157cc0fe006bfe843419b8a1d792d00c1505e0a63b39c7c2ca2c96f695426073ebd50283572bace67c01bb7b27b09be59e589bd60acca376a8630034cf87e9d49411648a1b05c329af92cb29942cb2369381c3ef761a02f8c905f963f0b08514a7c1302b4bac9f261fa37855b67250258c003e5bc9ad07035e667bcd6a537f35a0756bb2801a0aca56576d72f3a8c0c2f371e5aa036af3a987bb550ac06980bea73b938ce91715a4b19620a08be52695abcb3c833eca2824b60de483810857aba0a9292911c4167159b023989d061ba81c94df979917c72c8eaae518ab0e46ab8927b5b9db690bac6720667baf711a73952b033abaa59d5c4ccf676007044e26c2bb31b5aa2095f2da9724570cb04174e9ac174216c1390a687c60b6c396aa48ef849d19234f36886205b0b28250e7803502565523d0cc0bffb78efe64dc758cf3c93bef42103694b434c4819f82bbc42ab45ad827287a560ee43600b87443d8bc91ac5b15fab2701f05577c32678e06790808d4a6965c30a0915ac8fc7950b274c428a43650003beee2726bd31a09de14e892b54c2605269b8c22f146afe669dc9c4775d200aa9534af5612ea736b01543788b13c3fba608ae90aac0da9335e6c115fbb1d67938b86849d5087a87f3437ea29d7b899144fc3e739a4c079628597c618b554468f56cc6745ff6500d3118c55a8171e42b67ca43ca32135672b22286f78d0485b363d63a2ec737d2aa98ae602d3c485814d2c195db5d7bea8b3ae5470ff7a1e8225f82d565414c6b59379cc5b26155f682f6098795c52e3e8acfed87743737c1bee0ba875a95e9509d89f3667d741cb3aaa989378a2425a0e5f218c02763de4345a208c5bbe4949a506dcd5b01c5f8f4ec5f5bae6946c95ad7fa4e1e5f80354b5112d882796092029150d5d621 +result: pass +ciphertext: 29a04526a0c95d33c0ff721ccfea7e7c15c88040d8cbcc77759871674a074b97bd18ac3918db551fe069642f81f09945bf219c631d070369d50a317e95fa46599a058cc549b706584dae3d4c46e697876303bfedba4a19d83dc9bf2b9e0b6067303fa374b47548f70137324d1a3b0282af3e58909f5fd542bdbbc224cc54de3740e9e9f97f027e065e26c92e35c5ccecfdf6daed38b5901771eb81e6cd1ab7bb2e1e3bbb4293a64851faf9b0e9c9737710f5b38262ce26c6e01f5ab14d389bcf5b529d1fde7d8373ca6b9c073cea78836047c35f95e8abae2633c883069e77533db76dffb6a736fb2a64bc3189f9a82153787e03a79621c57fd4a110d262617264c94da4b7c3178f469790a7d2b0a6fe1126294f798aab1a41af2ae9e348afd7af13ed805228f378a4582810753c0faa9b7caec913a32275f5b9b67b3779e268bc93db076ab774c6a171ec6733a61373407707ddb539b8fde040ec617b841d41dad7bd094f3f3fe46a8953651e58ae11f0332c4ee155b9dd3330a910d7f188f12e823016f4dbe751608e8704e2508cdc0ceec8fb9ce26f792d0e2469e4b24d275d6f020cb39fec52f92672b6935e15a8a83a64ac080cc4f488343dc3d5fbafa73f26f44cd1608f96c799336d84e4a82c9c06f019e49ae3871ba14801d43dca78cc6a05978919c9dddc7e8371546ce205b9cef943e939586a07762feaa427effd373a0affb7feaa691b960edb8abdee3d62b6bebad516cba6d6533615eb25194c996255bf2c6b04c8ca1a7d425f1ecb11b28b2ba5af11d4135092de06313070d14efcf6794d3a200e05a398da25149c7635487d32e74bf69491d10d2a17b712316ce5629787b740bf77673e9cfe9d7459a4125d4e0ec93f69e0318f0a69c36e597a65ae21957a6cd659879b3a6a9d5348eaf378ef2b3efa893025b906f2b86bdfb1d52e00b64b26701d4f3a88a50c24a8a534d70c46c90cc1e27851c11e679bb95de1eed93b827dc9fcde8b7ffa43c98029877087d74e6f0af2dab01aa4c018c89ba3a4b0cf0bff09c1f7b0332d15c8f929dfadbfbb2d272f49fee30b68bcfbcecdf22b739d4fe9e9033b94e545c1772114e7cad746f14885a67f1ae72a94cbe4fd6087efa70b0f3851eb9561e8b737897022b3592b2562292e6fe82eba945fa2c55afee464753d3ffaaf43edd0b1342f9f8977fac2e2a00dfcc3954c3df9a0e482a89166224cdc26a29a682807aa24842db39d7c867fe2a59d062dd7e58174e6fafc0d0d9fe9dd1bf9df791feef3dab0d3e1e0f51daa5c2a007b3c2cab400d0da44c7c1339c403f4a0341fc73bef02339e9f1447f9de95129e3442ceed7adbaf470b795d902995541333a1c9ed5a3ad6ed4a6c7ca0bba221a45e7e640880185470b1b8ac00511d455670e55b84ccd8097687729c293f8932e608d279dc0bcecc77a986de4010290ceb2a28327fe93d7e191eb4f1274eede3ba1bde770fb6c7542cd9b3147a574ba092a05298299d6968a4585d727d0d5cbaa60d0c7e165f20ff50fdccd56996940f8173d9887b75aff72f16ed907fc5a95666f22ebb127c439375257b56adfc30f4c06585019f941636429d8ec9740cba71da5fd7c4d76d0a0e75d0b024a61b8ab66881ae9e48f063ec6191592040d896be263c4b7559d3d2d218d11dc8a3d4cd8c17b19e321ad796e9a91d69e2dc9c165be0e35825ccc3f83bc1390f2e1edad44e16ecee5eda90ce6c76a9275207469575b11c113cf045496941fcdb646ea8766e98214b8b2ae1a43ce2d7163df57600e6be191c60d65b36cd15363f55718fec02d3e61881aaf99b7c6fc4e3335c9ff93fd9a4072af723a0969f0be5458b29c5a2e7bab4274bd90ab0e66527d09fae43ddaee47a122b9610e39476c0921b84b7f3fadd309cf0e166eeee533dc99e7bf38f3a03c4eb8aa42240607488971f9d7283769a289c4531c37b90a2487aa9ff876cc2dbf22e340edcc0f71cafe5ccaab8628c024e4f3ebb2582e5c7f1483b6a3c0384bf9c75d0be7913430f876303649e14c43d9e2fbb83f85bab7f2198f8c6dd01f95c09bd876c853b041fceae938f138068ede7ed1f2f195161dc657fcc45c367cccf9cca84a1d5ebde17e33e5e225590bf0cc4407929ed5643765ed351efca55a5b834a49a482962d8988473165887bcd57f89078a3fc68d3ff12fa2ed354a23dfaf3d189cdd7831 +shared_secret: 9b93f91e8134042ed4915b713269a6a3239b08ed049def076439151344e508e8 + +# Official test vector 19, seed: "822cb47be2266e182f34546924d753a5e3369011047e6950b00bc392f8fec19ea87c26d8021d377df86dc76c24c5f827" +entropy: 35d470bcc5880872754810dfb3f2796da2fd7f397537146f6488c27804072b34 +public_key = cd22ca9cea98bcd401164c349b35c8b36424f294b11ec7c7d0a3953fec20dbb283ef99a3452496d9b86513e33633765c10b45c6612bfcf590f6036a711eb3dead00067649eedd14491716caed40a3db26d7b00c6e8396858c3916397166d24370b033ee54c3d3b85b5382b1f3f1220325aa2f804bba473cc70b15d443548491416bc1698a5a9c39dea2ba59171f35569ed6946621c1b3647598becbcbbc72a0781c77baa5ba128b1b7053b2de9c122b8790125c50e003a119964aa48392a96b01d7675af541b46b4369b10c38a2c68ee5425c5f6293c2255a19a7cc2607774d342af773a22c3943a9b411bd69a92e1c756993a1a392698a93d5f4772c374b549c15a0bd636be908641a7b8ed758e3c341292598b82a7976f45ae4fb0bc2af0352d92751a6a5e5015444d3b82cef064d32c3bef9b2292571092360e1806b5e5a892586029ab421ed247afff408f7fbc9b5cab930a6896b1250ab1c58ac4231fd6d0bd9b990b649028e4c28e435093b36462e28940fd2723e7bc20e59914e1c812bb3aa912318f15472a64b75c12ba361b2843751611183870a6028496195cd5d219698a89dbcb2c1c06ab2bd5937c1cb5a2da7774bc3facfaa028829f3c3c9bd6c584eec882ccf3ae1b00b1357692ed377f09712a30fbc73f17c0bc462a88e64de262c24e7a7f7c784dbc5b615ad57e58484db23363433a4680126c2eb5b9152c162e3277c0bc4da9693b22daac51a1c6107242b7428ac3f21f2c3968810435f9aabf3c65b7db7b37361218b49b9c76695b53c9a227963ccc1b60d447b3b7d15765bab6b3b73585f26c2f0862c927b6f23624f360a4f6c537b09563adf7a9616a4dba03732c707fed845c35c660b5317ef652055843cbc28ac501dcb493eb5d6bd5c322ea2f2a8b61418b9788482f51b8135f4c1f1173895057ad3218387d527133890fa3a9425d73ce03e1879b85a5b120285b823501487d5c555ed2b7bfac82762b9262d3d4b3b64736497899a768903750bff4a82e6a0097f3c230dba5bcb0ac95006852bf60480d039d1fca9fb758b5562a384160acd9c489a3b4bdbcd96989c57eb7a411ea3540ada882aa567fbb340b518477839925577c780953bafd0cbe2803626b89cf1c3b3056c4bd78c88818211fc836765fe813c7b18e5dc9725978ccd9ea8c7e1710ddeb883ad93e2cc987024b817c30908ab1ba7a658399dc931a4ba4fca5a10398289e9718e906336b148c328c2930b843cd4ca0d4735b633618e8c1c327b29596c24bab053867747883231f11005ed6987679544b51c45d42cc209b7061a91a0c82a92c943c85c149b79c1a190716c03f156d3c22ad27e7b8b87962c8c5421d3b01c7eb2220452b22d813d2180e7a38be15b6976aec7659d25b60d3c780fa75c3654d7f9b6de0d33c8c28c97b6b95bc8c2cb517b497f73a98c41a64f312fff48fcda7b07e86a8136c05720a8740d866bc024ca1e22d43f6470c8a38a7301b3ce74585e6ab8b899b13ea39c163ae79e764e0b846fcd57029a73708091f053212c6f93f1173a854b26d7e49bfae38046e43193b98460d171fb48283e736c7a1651deee6272387cf65ac876feb4292bbbc9200981299c9bff13690d6c2017bbd3e257700a111fefa33072ccc8e952263e4867590c79b558187e3441a930964aa3ec0441e91e7ad198cb6e8959a35051ddd972a43a020d0f968eaa8696b9686dab01b9f9b8095522a7b411d486444b16ac4fee7b245f50ba1a26d81457b802bba966ac8eb300cd92773ca26908a91a2e23b21b0116dfcaaa5f4a57514dc2ad736cc788904c29050389b80cafb0d71b131b567551f6a2e16390c55234e5ad50080ea6268047618b333a49795b4233bd07530a89c275bdabc4ec99d84a812d9e20e2c27072196138386ba42cc4998314905e070ecab69f2d12aa204a32ad28658da3fab69223521b81461312cf88700a49077914af3c28a2f544d608209e24cccfeb46ae13bb90e8b86a4bc85d5f41a9ada7a957ca8763acad6713623ec20e2f199b1270966432bf2b8cacec65776d8a63a471cb4a7c891a01bc92c8c28719c3ff9a8a7a350d9454729d2ce932982e94bbf30b298b3353ca6c459ee5017fcb724ff430a9348b9fb46abc86374b245668ac71096501a7f3313823c5749e01d0e40444111bebc0a6858891224b08cfc8e74c41084fd5c03c102480537 +result: pass +ciphertext: 63d6fa95398bbb5cc6252d3f85dd6b4237aa349b547e8e797ef542fb715f07e00e226a4531c7e73f37fe3e087a03ed41c2f0959aac4262b2abed8ba6c6fbec26040f0eb47abb84a3c6e88ef2f821cf78d4cc51751083006ebf5854086c9d3f0faef0debdbbc1010af6288b7aefd203ec88e2700da503101b6c470267e109e96717404e2eb97f499bbb6749bce23274c649b25ad90bc7829f1b63a4b2c26811fd9add3d29d1818f00969f73f1b6afdbb68cc8423dde3630c679a0d8c934410287719c7ffe1b6eabf4415d4f4e14746086a22bbecba104ea27f7efc10a40bb1a87872ca72a80669ab1f02956bfb0311f87173df960b2417381b34cdab574efd7f4c884d879606684d344431c57c1b46b07c8bac3243e4969f484b9446946c7c0af4e2e5e05ab87f527290ff9fae3edcf5b8fdcc0b3de2034f26a19f0844839fb26e790e38ee44e21c9a01d96f4bde5296e021ec68352d938c1ae66154b6efb60ac2f5c96eb0c269b0be10f4cdbcec80eb739e7d4c78fe410fbb427b95cb1c09b7eacc303993a25b38aaf91962f4046597da21956bd98f9575bf1e9fac24bd420ed299f8940d92988a2f44647691c616542f8d617b19363570510a643dccfc58dba36a7aca98b277626b56672d21e67ee3af62b26921e48c2b69b766dd6b30f942a7025762554c9bf05bfeb960e0696bb2c7b1fa05e388fc5e5f495c2a853137eb15387fee4455a54dc30aabbbef10018e4c135df1e6fbf2d5c2399478039eadff9151e9ad56f8f0cd96eeb6423224df09df74438176fd5dcaf7e6db01b89204ab099802b94755c0740975198a4104001a2724b9889a60411997040938895b9b7d6889b17d0f79b97cbf249fe33eec67c1d77b84694979ea0e4f7b5979486ec187ece4de8d017b01d4d65ac63fd0c04ae5d5c073b15fc182438acecec41bb9b277157a2d023a9a73394491d65b3f103e6f498982645da202a0c8978d4b06a406f8561b819a8f4305deba7a8fd67801f62e10445de38d45b487075ac0eb698525ead41e8a10047625922f197530cb6ae8a1714265d322f22fe4fc97f74e585452fcfbb49815c793e65585522847ed4cab843e416c777b19958346fd716378bc78ac25e6d2a9f8f81f504210918261cb8afaf27ee2a97b53a9e044a17a3bbff44b7e1cb843c01bfbfb7d3f3c014c430753308ee60ebed89cb10f55541560473b4481a4d7d414d6784f7a6eceb2f7b68eb8eee39d093b7f5c98243dbffe414965a5eec8b9c6eaa79885366ff8f414cdc290ef8a9a12f89dc48aad20325376e81ccc707fc90cde5a9d8deb4dadeb06a8867e3f0c9589798950be6373059772a3b9f68912c227a37266f34d5bff7119a1dba2fb43596d239c8367f5d3aeeae8c1f87dc2a84f629ea5cacee50bba554cb1a17ac7e8674ad6d9ab7ba149b621f3ed1889e904248f63a94214806a4fb634ef53d9ed39e18eadf6cdddfa7e88d897943226b7555ff9b0773ac7f538e377cea881c5561d88fd8346d21931ef7eba7f87e3da5582a7939cc47bb5817edeb8c369373bcca25ef3ac10aef2f404a70abce312a5c7443bc50f63d516e9b151380a8d57ec19a65c3926ff2e5e5e6be8455bc3b4bc543cb0cd7d057966ec422d67565be74fa0b6534f90b4271d2786c553839948b873b2dc6fb18b9e045a75cac00d98fcad5098d24014438c717174a5e62808d386eedc22cfc6ab5c94ebd00b164f0c86fe25de8981850ad8d965db545166eab7056d23944d0d1a25fe0a77c33df334ef7dcffe8ef353c724003db5cd42e1d80d2bfe0a2531faf2c5d8408608ba85e1535f4f5905770559a069167c1b5c90b4644e4420c3ca700a33114fd71dc2f956c958093436b77805781da06bac77019fa8bd04da156a4c595f33ae5de0e16d4435b227c9d2783ea3fe02a6a9d273201cdb9601da483e74d908ed10c67576dec23164e33b890fedff26cfe273e650c731df6ab11d010dcad78a92de3399f4dfdad418026460eb361b54cc4621d8bbed1d95de9ae21a0aca3d82c33848b84918ebe928024b2e37217c19ef27b80cfa368e439485886009317483c380dc822a3cdadac0e0f2f2fc0680ae72792a4907e70bb5a12b02ce1ce7c39af82880e6fcc0fb132cd07571aa16e94926e0efe2336018e01dc021fa99588d3c75fc31663e2a25abb66e05ee2034d642f4b2cacad9fa5ca1c15d7 +shared_secret: b616ad16ce3e737184ea0f5b25f8439ffe0bbe9647e0c2c725d23d4eb2f13464 + +# Official test vector 20, seed: "81401db81138d6874e91b7c11d59596e4ace543f5a3471b6fb00999221765fec3ca057abe20f03b2d59003375fd71fe8" +entropy: 8d667921c5db401a86fe1c35dfcf164a6bb2ab7400fd6a0b67eafd4a0ed11940 +public_key = 17a1c1ca6b5b6bdabfebac339a5c121792056c508ff99588d292cbcc1760f1eccbf105281116a623c600e87b4231c2a94689133ca16b6d99796700b917262f4d776d10709a26123a5af9af5ac7455882caa4d220437271aa5c9e30877a3cb263f9048a483a826774c806941939c44274287b629b2bcba56f19e7aab2b8c6a3f72bbdf5820c774c48a151c381a5a75c27337c60c406cc1ae36a3eeb25d91521918a780d75a69f94aa4005771a5c22ed4466811834fbb238e6351fb055a70c32994442297f273752db6f03f445804c0cdb380f838c484c50250bb2c849e308d8f608ed942442e85bae7cadf4c6c3a49cc1cc107ff32154e61a99df1244f8f956c678ac4192aba83b5485f284f1510b816c26d16922412738db9796cf6023e558741c7ca293eb35fdd71f9175b838377fff3050d447a35e208027881406446061686621fab300755a15921be9d24b721a50976884c76ba928405ea9e6b7b357baa68674bf412f66f54a454c03fc2a64b1c1142bc56cc535911efa578c5a097d8301836cc641e078bdf1245e5359a0d7ce3a87012d199880a3ab5d61753488782b9734c26947b6c925e4fa6ca38475905a9f45a88221db62b762b4c884344cfc7d81e55fa34293dbf49e4e8bce0bb95408b32bec404a245c153042a3ebcbbd8598a3f9537e1403319a5cc6a006a37db5a3fc4960ddc5381a1b0b85657d41d085309b47c9e21a0641700a14150a0b3e00823e76c6bad867c6f3e6568eb840b9a9c4f4f45d35e733ae56377b9c2e008b66f9436b59320f3107aa43dc123bc2a89637637dd3a26ab0abf355c0fef642632523611a196e2402ac16c38562a0f8c65b6a0485dee1492ce2494b7230422abb2d705333d4c3f4e10b28d3c4b3266949ca4b95062e3d600caacc77655236181208c0dc4487063ccc528961661dc0e474bdd88faceb2ec448c1ea8a6f14206a33195e30fa4efd463b7f438ecf4ace66090bc268b532b251d783bb380380e12a79ac044bd72c0d9478018d98b6e4e36f234142347b919601521365665ed05111f39698c43f5b62c047f1ba861a91a1e29f6bf1b8ba376280db89feda41195a9564d17c73f4305d73cc6a606530179029e192352a5aa9e58f4df6c0c9d8846da4518192bc360544f734340c9b072cf399806906784073f622ac18c766de49a65df56b6ff99a6e896245c7aa5585723d1c6981a0ad2fc09115b8b8321941961959a8e40b37c24a66125810223dcfbaa093510bf0b9c631e65021d64bae6bbe847c7576826506f73493d19da8d47f07898d179697aec0a1df3cad227cbc83c33c6b72b450731d943041f79136d34c7f039558468c3de1e3021e509a2d898ec1245fa9a966ba457e5894691899521362b7f2d607578b01f230365a84c7ae1ba12ba53c1e216933a34e53e75e252c52087c615fd5ad705743494b10042b033468af0016274df94f2e65048e9a4595a4b541b082bcd96e6d90a44af778077007c069ac9673cb4a559820a2a9992c4500da89f5acc48a6bc9ac1922be9c211f36c468986d0704121193ad5e2732d693c650d867234c9c261525325157fdf94d89eb2da1949a627338c0d07b1cb9cb45d95b64b38a22b029bcb87c928c7c97984d760bb11b9666271aa914d3cbefd723d40928ede94af17516ef7a72c1fa978584111f8b0903c544dd7c81d94a3b8502cc08b21cd89c8fafb94d9eb57f9061a51e9aa6f3860ca3da018dec14d46981062b8ffd542747e7c83cf815989117ac14ba1654be4a92b396b01fab274a082609ed9c685f125fdc4611cc8c00167a8be5f28f0867397da186ae68a29701b4c1885235faa006d45d30b990d13c479fa5b1b76ca2406a46a0c42f9c63cccdd187f5e93b16f20bb86b5251b00842d28e58c86dbca41ad708a62c28846d0c983dd60dc4f5b018017fb1276eaf839a2898a8caec69f11037498c5a621c05cdc5bfc9ac9dde250a7c4c1531b813b3f84e70a43baa43950a9cacf07c9dc6c8b8c4a660aee6ca67159a00010a3414c87fd94ad197856d9940ddb47ad0d8700f635e58408a5af8213fe4636fcc594ee677b3f205e3552202ca8087922402d24ac4f42fdf5c99ba1356f14cbff297192a40b48abb531912b8f853a07bd241b19aa1effa784e5746905449b1e7436a79a28e3f712507e5bc0d026037001723d3443145bd066cebaaa3d000c9f0ca +result: pass +ciphertext: f605d7f505e0fe8ef088c83ba4fff503ef6cf01cfd1ebc1de439deac5a95f4e38b9538d124635bce71eeffe55f70a3674eeff62ad618bfcda3cd2af15ada072885cbc36b5693deb6aa5e9391478e37f43a4993451a1d2ca8b1c7f305eec6f33cd473f5c0c32878f04697a215f721821adf39a35f1e6387cf545e34b2e6e7752e0c4059d659c93224110c42abd2d7661d1dcf8ff3c911b25eefda9878494336447ec650b15ce1fdaf1895b55b53ad7c67eb2ebfaf8a9851d0f6456b79486a2499b1cb0053d3fb4b0e2a71cee95ebf420cb0cff6fe121717899dff28bccd41e2a501e5667a502491cade70d225666e4a37a543a6336ee70b6a8d0a9fb63d4c5e463b54a0057e9b787b4c06707fdf6444d6fa1b3c93c31761b30b72d8c4d7367f97d50a466af778616748909ccd7e7728e4a4e572e45dfcbbd4527c11adac3717ec369d2cfec6dd81ae8242b82c35abaa7c960324bfad3f852b4e6a322b90e9dbd614c233cc58dc0fd676106990460187b69d33e572e638cfec27c025c507cd991d5282c83b48871ece91b7255e9675aed2fcaa4199a429a6bd8b83632119bc9771bfa14480f3b37cb7df7f80455df8f9367c216480c3289eeaadab9aaa845f5d078b756556b3cdaa03c00c984a32d3f3f06faf156981a26df5e3f6a02fded61977e366c589fc795baabb8858bd8bb371b12cf4ba2c0d432df56bd431d7a218067eb2373c1fa69e3a84b7d5678119c57ab67480931a543fb81bc087ce99224eb1a47f9d592a874d56eb0c4330554bff08da929f9e95112c1ee6ace229983014efb098b074df89dadb5eff8b6bdd415a1501d0611b6afb645a03d964ca2ed657e8140c45fe6e2dcd77c735b47c944867c42cc482376fb901aca1b16a2206a1a64987a321e7ae1b93f64750a3c3a2f409ad5415bf829c7721d39326fcdecee96ae1760e0586f38966e4950e7aa8ac7d7b9a376705cd7d00c7dd16f80b2f43e51494f23f4878a6fecfe78fc829fd434afd2a92926a00db7374bfd914393b649e1c83106741ba515c935ab17efd4cdf2f2f21266aee6895a863d4ec76e664ed6d4aafe4f6a93209d65bc4e07d1da5390931f67b258e815d7e690382fdc30ed24ed71a4ba493f414a1bd819e03954cee59536f246f491d041fe93eb6fb304c73efe1ff24c7d27b1cfb13434693591dd1c703253dfcba6d2f259856c57ca3fff6e3945944c11572e639aec5251d5bdcaa95cdbb42c32c46312cc8da6e4cfce716a39b507ef2edfd550a4d3ce610811b2908e7921c86edc26ab8ad7be77a218a5196a0f8f7747f82a1cd7190b3c5e2dc9ac9ccb41fbd4b285c549957392d305fb73a5a383fc1201488e979e15a96ccda773a0cc4eeccfb66e1a4c0682d7d5999a1a764ad7d0985e9232fb703c7621e7ed0c8ba06f772fd64e29e5f3972e49326052807179242ee5cf1d56120682c73c4ea48c135024a3c75a62bcbe17c44b6777d0c3069589bcbecc80c056bc5643664cc7e89ee9ce5df543b1592792a58528204bf6981a62eb5f19384a735d040dfc2febecdde5b7aca54031cec4e3919e54b2759d61d47d964b17c4744df220d86016a73a04189c6ea4be973191b65cb695d9de8d7445401fffc8653460cf4a21f55dd57c740756a8675660c71e5c47dae0d2063d68e355747bdc3b71c743dc4f8fc6e2296bde795bdfad9e7ef9be2cab791dc2862421716744594a1f5a92630a913779a0bbc2dc8c55daf05a7010a24f81faffadb2c5490f42ba265242d34698453aa40788a6def27a7dadbe839e4ccb23fcb72c10d7748a86422dc2ba55cfc2f79adec0363ee4b8d2eaca8a0b23ad4b6a26c8193b9172ae25eaf52fceeef855a4a61e4a0247abc5a642a435463f6ade5fd978328883966085aa2371899f39a84c18d70463dcb9c04f3459426f43d3e23e3246baf6693e4fd216835be3f5f9377de1d96c7d7062d0c62a700b24fef99c6bda9e8f818773ac4ca5dcce6880d30c9ca28191a43629a020e57a32c04b3e198006f47a8098ad93fa697548c33d02ddb81578504ddcacb3693afa604ad00edebad0391c3b73b4766c3ed02f9025aa39fd4c368ae961d44114f3f8f7c422117d494df0b7031349de637cf57245cb4a818d95ffcc488cd887b1824ae61d3a8511d95dcbf495d9003b7a3ce53465dc1ec6fab9f6c0590f76372a6e51e00b8d11135ecdfbdfe2d89 +shared_secret: 634ce1c824fa766f69c30548e34a772e828248e5ea4c4a7780ff38e2d7d3a4ea + +# Official test vector 21, seed: "30b5de5b73681ec08aaa03f6f2d2169525d25f4042a5e3695a20a52ca54927b85f8bb948fc21df7defc3910b28674994" +entropy: ec750b3939385a3f8df868119dc76f77ca845567ef068de6ada5478a56bc78b6 +public_key = 9ea32a494182483627849169e2006e9306448025229ed2c14ff825a43976935a8a14b8448d6c4db642a1726823a2053f4f75951b80b47056bdae61ab68402d4aea6ead635f2262082d71c4ff5c78e6a6345a72505e23064dd773118ac985e49e4d88c64dd894322b0d2a712f0cccbb506436c3f0bed765ad0b193ea520580be4c12cd65f2406cbe1fc9281d37bed1988d7488f3925244454b82982c49fb522a2f83a7d131d1cc65cfc7179f8a043da781959a815b5e45f6e0b37269c84237424fcabbf4dc16a722cb171984e48864ef70c0fe14c69ee385f15eb7191249bbe3a3888c50fcde9302ac5aac6105503589b3748938eab5614d626c6a301599b623ada44f432bb18e359c7b223414a34945786468628c6579f9b004185cb7590e22f94e83de26c6a9b69702f704041da3ffbc8ce5fc2367a3a97c4b997bb06a01b8964a8534e2f713c289a0dc8c072dfe4a42f305785a99c0dc898d3104e0dcc62c0e600253c218f0511fcd94bf78497b03a08efea8bf7fc0e45d3545df2c6d708435414bc00e64c76a523bc0ac823fb56da247da4643fd9063748b23128c6ce4316bdcad4bafbca77b8ea6c10e54ad063a1433333252311f68c676ebac53aca8fd70b9404c1cf3c979ca0c492198a2f92294ee5ab4a2ed15100f20e5eb948916ca7bac7b28fdc904ab1911afc19a454af45e6a265a726340291bac80cee679e009c02254a6c6130227464b2fbf2a95661bed8b348ae9c759fa53a4b429c0b536fd6bc85d5c96233f90ca3057839a47b068855283487c90a8088e271a3e33f5ae5695d044c4d14ae8440bf03b318549600e39cb9d9d58ea2d2a5e3d08a11484801b8167d4c5afc20c56bf970a230231da8372eab0f5266686b4a3da0ccc6b57cc81aa29053142cf0f35cf0c83282893c25983ca06606cf255cc1b41add5947ff9322a4c23bee47cc49656a8581ab5a99a3797798ea77a1db18c39acc97e6342b8770550212718856398878900d6cc9a5963a71432e5678a12ce86257b0b32ee751eb181fff62ad98443f7d79cc4f85bbc67190a68504a24a3166c588ac7b40fed53318b8b452d1a738e59a2c82442feb013f9b2429b6c603f71619f386118327eaf0c13ea30fd620222af064c61aa8d9801d53192c61575e3448b265ea9987bcc84ca825943a4d51a9cbb5e76e4fe88cb6d92215f60b0941c46b89a746cc96c74cba7b097bfcf27533a46fcd928f49d670f85179e6b598ec595cf39c3554eb5f93ab9707d4a559069d24a4005cf28bfeab0bead80363ac608965141e252de510562ccb5fdf94c30da1247ddc4c80554d879b62d0b49eb3b21ebad10a50794545577be4eab070d30365dc9c34eaad1163b251b223e8ba45dcb77dcbab0a07fa635d8b841179a354304e0d249dde2319d85cb724245877a549ccd8230fac8721d82e8a2182e5cb63285ca8a0d049cc7160d7116d5c1c0127a9ae5fc808eee88e340a57a80964b21a353b08bd35da0dc1d7020d6cbe43f49547686546391d94b9a2b2d63b23fb2fb8c30f7ac371b3a80aae0470d93b610ba1681af1be2871a49419a23610843bf940804483dea0ad8d609500d8aa2426cbf0ca5aa353668a7151bb54c7c4e4ae3354c598cbac6e90949cf6b79a941c541c652351306f810494dc0ae743cedba7904d34c2e0b32b603606e33156bc750bbc477313219a97e184d695c701b2009aab8806709b8d376b9cb6a24f3b6d0a4157398c740d08809328aed069a52fe77cd68b9dac62cebe3649cd1b139fa84f6a2333ab702a30414425f50e25e41bfe9a2e277869e17c035652237889c37e3c86cde41c7585776d14682f3c0309a09c1ed43609b5b82e03508869a7f6b627c3710c58198ebe9100f433ac0df22d03934c1eaa10aa98b88c879fee60596a3ab29739b613ab741ad4518e6ba5edec190678b20e6544f469791c64629657b9b1c51eff1616e29a1b3bc25a55cc9c481995bbe68abbc383dcc02e4c8208ccfb57e052ae86017dfebcbd2165810151538e7a9af3a4c5364c02208428d2b98890923b7bb92d66a2907b5376906a61115c979d4b34670a91339008bb466928b30e807cbecb307becd228657bae78f5869c3463d1b73e09aa7f6274c7fd2a3a9cdb4160da310254462eba30dcdbb5c30542463266d790d0fd79c3c76f5da348753312e4949ff2955212edc46dfcf9e6c37a +result: pass +ciphertext: 079c990481efd07ae4b9248272683087f09cff5301fd533ab46d3391764af358e5d1a0a656aae24c92bb6e6b95c3689ad3cdb2ff9a7f4377f9dfe6ac4a56b996d7e1516e5d2127eadfd3a4a02caf6ce2b3d7d0cf37604bffe3b44c759231e485a298ddfcbfc7ed7d7d9bc4628153f47c06410e5ea8d2dcbe4178eecf94af9315f446ce0526005556fcae18fbdf92200fcf0bf528f07b066e8dd7154cd1d9ff02fed80e7c23213ddfa05698843cb3ee4da7de296f7882aab57b39cd0bd77d4d2174ec9e609cc8d9910dae1339f5b3ff84ada38c897d79771258450f00653a4df57e61c653819926307db435c67877e3e9d0990f8ed65e6b72ea8aa4512ce96c98132890449569bc164df74b94e5542c1ed573e82b5eddee80a2843478d77cb4691297b4d31a4ad9c1130aa9a98216a4e20b286cd109871d929b63404ac069d065a40bbb6f48ed46d719549562cb70e0c97a2885686678d4b2f9debd38be8b8eec6b57d48ab39bbc0ca7d859c090d1a45ffff9889a2e0deaeb28f16b8bc5870976ebc16f2fa9738465943942f30eea8510f3ca526fbf3876330fe9acb5e3748e04fe20cc7f170a9bdc2b55fc95d489150c677402f6b894d084d2b80051f093f5c9a9e0dc0dd0fab7d4b46bf5e6bd304c6c1895a22fe9a8c3d6b5f8a7438e93d2aa50a2da9b9b42909a54603ddd942df723c7bb7de5cd0920569ab8f37c5aeb7cb03c24f2ae8f6227454e298219cfadd873b9077b2cf8368cbf0581698cf6706f1001407313821d1d1713c9eb465aeb6ebd83ae07e57cb1de96606afb1840bce415a775070586812045ec8d04149f84b032767632c3d29c6ed58c8d8d1d914fb3c66338764e44b1be25517dc39d20d7c0da787da0a700d6d49edc99944f9d37b5741601c248e5457c5772d6455079cf0eeb4981a7d33179f99fe8e2263db64fffad5d7f6b9e2ee0a0d2efad1d7432aaa93344059847697f3127cbfa062c8eef3203a21319c3bee0c21a2ab0615ed7dfff5aa1f8ad3b13b26c6f1df39d5b7bb80d29e0b4387faa2322ea89d7ce888061fdd267b75926e128e31c6aa0f8cb6bb2e3416652c6ab631fb5592e4c9526fabb948d53136bfd7cdfc292375826e55d11f2fa160676acef87bb052677ac22590d8c1fe8723434aaa2ddaf5c12897e5c8c5a241589146e3c0419eba3ce0fcb7c2cdd59b2b936a2ac1ec4e16221485bd4f8b477356a005305b987f179e690d6b853361692f605f826c46b28b5ac821d7bf394c477e976645727ff07642f1f45240775a766aa9cdc1883b0e211473165e6f7e8ff9f8b2b6b8b0675c13d1c6052190506cd583b02d961476f9f142a253908eef2642b882f866828e9acc655b931fd69f327aed8967356471e145e9e1a8a40694aac47a5f6b3aeb522ab90006ca85d41864c305531ed12312071ccc9b05e0e79adde137e636832a0640b3d0577f08ee9621b8154fec9ebffe7ae0b74925163a6f6fd1b069e8c0083b8bb6d0c9e741a0c59caef40af376bd1a3b9a7e71e322cd09a2bb4c218dbfae2fdb6c2f70a3c1a784ce9a0140e94695edb8f9fddce3636af525a0ef75da4be60124e8cea81417bbda781548e03f05609850e1719ba2bb4ddb545bd279cdf42d89c13829cbf730b5e74ca68438e2547bfaf9040451c045ae998e9a0937fa9913d0a7485a89cf8bfbc6f78920d788778f27f7eba2d316aab1923ebcfbd62dcf592a731c5626c89b6b76893b9c16c2d53b8f1ae0841bb2562311fa87436b1981d342d95513f309b77279caa06b14b76e4dd6c23e7f6c482644c3af40d3de7a76a2d0df8fe958c1eaf402da41b5ac87e173a8fa5753e35e30de6d106a02a0651886b24348444cbd8ee46900a946e66a0adea73f2ef9aa0c30fcf0f829348182c34bee6528a15ba4521b4386ddcb4dbf96a33710331d6ea0f9cddf04bf23eb0200ba87baa2bd9fd6195c8e017a420c10259f72d916d70724f3ca6a1d8f2de635b1a385835c4104a244a1c8a936247c90320ff646cf19682fa81e9cc63ef05245363dbf42c9fe51f20498c267fefe512388e00997e12edc50ff253178f3fb56293cea491820bbc84bcad68b7ae1fb914e6ca37ef626e04e7e2a65df199e4f5275245b25e2fe7fd86ebcfe582908ea88fac778bbc75f43afaa961104bde49580641fefaba4609fa2dd098e926181f04248e26c951a0d14ad3c65aef6f5c +shared_secret: ee1b62c612b20db1f35a37f94f3cdcf4d3c02f1a7e2ed944764ca65711cc7cdf + +# Official test vector 22, seed: "e335df8fc0d890588c3e305ac92c7160ff199e07c85760a828933750e3fed8c83b0dbe802234481ecf890a32d7a2884f" +entropy: 74f1d52af09b12c36eb062ea7528550cb4c18a3ce8e4f4ea9fac43ae383bc925 +public_key = a1f055f88cc36236016d4809e5d9096762571c15863924797872cdd77370917720776b8ea9b72189f237e9d710da6906ae25331b9c82ca0ca257dc980ccaa23ee61ce1e681ae09aecf967c33505f83078bda132d1ad623373252b72109f6e6b8f5481dbe89b6033558b90a70d3866930a3c78e024b268604c8b3beca583b8b531a4a6c094591bf173107025ba079c3062a607e30647308987084341925531076ba04e03c8dcbf551b56885c383a5929a54c207b39e162348f7a7fb375f38896e7c1c6641b56557f52f4da23320252aeb382082b8560cdb83c34614c40b8e4dc4ce54b4c009d9c3cd6884c11c616520ae0d220e2cd03a869147ffa894d5b02c75007bb09b51c8f59a53eac1af1a0195623217b578bf4c3bf59459fe3c9ca7b677155436336176a99653fe677d0d9bcb266b2e5484a72bf8a86f1b250b5666e40083bd24cf578c4f9386bce2f034d2e9347835632a1ab39726c2f467a864f5863c0b498491111221bb2e83386da51c764b8597e2b503a21eeedaa6350683aa82659fa276d9b8ad3875a019ea6a00b31193c9284832c581555d7c478f81e259150c41e8c23047eb0599647ca403a7f19273a765c439535efb20a6861a1b7fcba48927412af6c9364670e2e44c6c630a930b9437529f0afa7534a08b7606a512fb737a50b6a08c637087314da4bbd76c35a312c091fa3a863a3b8c7874501c8a9233212e592c828829800c9d174cca70761bf8188ff5585fe1d59905373420120848f22ce8d4bb8ea253d3499e0ae59b526555a2245eb0fb0ba2a38cda009a31f89bb46851a4277b808018e8f23148789b8ec69d8c622247e207d2e08491a3945a60aabdb7b5cbd260a348818c8493159199717bbe5305a5c785c4eeb26dad73c76a04bb28b740d2a761c8c02096e0b6dd297485725ec59b107086bc40e71f61b90ba596cc905b564cd33d76e2b1624bc3a2e75440474daa778b79f3819d237a41d08d9260226e63231b5494da150093566f31cc3a53f581880512c25826a7981241f4c90ee3b3eda1c277b5c157226342fb7e3622b0665109fb7342d13a96e3eab49c53074b76b3a2aa26c899bd86c8a26159ca278c034e323475a0b12f447df223aef827597eb5422bf26cd48b6a40b40200898430ccbe1a6b8ee1635c761623a956b270dac22e3a24fbbc8cb62710a197110491aaf8b89575d68b530530cb2380a5e65cdcc044b52a922b346e50005da16b8c2189525950a109f74b225213c28113bc793857e9c384914809cac7c8ec5667a34b007c7eec63ae9ec21a46497b6b836cac1c451b03814b7c47554a9e6039842418468fd5860ed6cb13311c638b86680ba1628ca09afc406d944cb0ac11b928899cf333ab54be5796a6e0db7cb2b2c8c9b9ae6f300a3d508eedd292c77c589c6682e2509b8d712c6b41669a5b5363fa06f6bbc0bd272abf0c423e0c719ba90cff3b0dc2c390e30b46b38281864b5d8bc2ab339c48bd9cc8fe70067358722cfabff6bc907a457f84b1bcbd6c765ada9b5c684d290c53614123a02660ffa22ffaf602111b7612862d2d204c65e82dc232798982652ea51a362743bea629a8324f76b693124b2c3772111c627e9db55c49fb7ae4204222d850311ca5d99213173416df4bbe68b6b6fb514dd4b821bda1b50f5587b7bb254a65a2d9e6a2c5baa0e71b0be88199096c516f84a20f38a9d32520a0064e955697008a9bccb6524ee56825bcbb776092c99a040b85c2e6e1669f08932f63635f1c37e989a4f8b2190c335e31a03aa06a755022c895485780bc90a969c834091f2cc64960d399ee65359ac245201b948bc2827943a06165255b0492a7236e7b69b66847824d8873a24b6267acadacf330f306652dc766df9269ef911068b50dcb199996a294b8f935df477f00b99882a5a5fa8147023737592a2d797358bda228bd62440fb0c3811b73ca1c8fe4e1c070498b11bc816da770bd895a96338fd9a6659ffb88df51719bf3a4b208647063cf9ec985ec087fa643608e0aa23ce7749ee3c7983783992961a409729a1c6f416a0a0a5659e8320f95277ccdd31de6fa3e41ac9de3293e3ab36971842d6f8b2ffa9a26de29b0c1a26815362a657a5571fc378425b23089bb94016ab2e180888226d1f7b448749280b978958198cbc626539abaa520f4c1ffed3ecd10dca6a4d6edfa0952d6e2785cbddb +result: pass +ciphertext: 5ead197f374db8ac3b0108c6b48be7d7a015a2f827d92c6686bb717bf55d48f1f350327627f184cecd044b6df9f775f53006d4e102f22053bff4fad33013d61b1b889a5e3e905ea297252e2ff8ee4d099430b7f0876e39a2202b3a2370253c00dff9cb62a1831dccdd4b95d60469828ead71c71047e90420e0b89460f9b5c5f0dd9c83e47c9551b227d7b54a0edeb79f129d150f8753e92f69ae75919fd82daf1eed6954c9429e39130265ccab4865b0ed1814406124cd9d1177361573267c2fcd41b793778cf3c4d23a41177eb8258b599f095082ef1e91d36bceb56a1c3a932e512c5a73b6f73255a74e76b7ce114002778a3f00e291592d76c3dfd33f4e5d3f409284f6a4fb654ad4855d5184a355d7e5a78aff17320536d83e3a33cd14f6cc2376e7697fb712bf0ad2c9b719edf9aeedf66ee481983fa551b973c3f7b17fc848a39606dd4fa254bd513bce300330adae0cb923a743730c83db40670d0c9a406bdbadf4a25cd11ba16b8b67ecc0aa3d632b4f8892b9d1571f0ef3cf09b29b4d956345be438a1f07444c5b83db5d34b2a7783f52039a27a771a2d114715e6778b6f970926626608423a91d485484dc14665b0cd31f7f38e017ea4408476345ec571eef240c9b04b023858b3e7bba470c21f1cc0883dae601d107a870e583a398198e41addc692491d11afa17a8f6041ed6990e0fb1ddb13ba2c0638288200c94512f0e74af90507fe23c69577ea17af0db97a32113abcee1c6fd15a0c524b72ae35d5b7fae7f9461373a0dce13d5372bd6dd3b9119406ad6837e1b3a05cfcda080ce1cfe8108c050764a2ad8d5ecdb5130bfae0d3564ba8f48742c3080c59c884c2fac31748966b2e003f14962803b4885625467306e0b0ac4009b377d6c46207a04fcf17e507a6fa4d37ae47bf7a646d202d378a387be5d4a9e2a25389204aadfdc4eaddd5fad5498ab1f908c36cd21e971812904bce453bba6287016fb5ed0e9266da7e7d5961555ead3fb8df66ac598889442746b75bdc9f5122037b4b6cee66aa613a239bd409ce747d53bccbf7ccb27d25067f28d851c590eae2a855999d5a201c79d83c63816b919bd22fc42f8a173fec47a71f5a9e42103738edeb4eb6e933cffa23cf6edfdff13bf7ba4494ec055b7779e0cb82a99fb739d0bac382eadbba1c8221983f11554997ea752a8069dbe7430d795350199299314aa476f5f22595d429663d66b340e0f58462f94d8809d7f798574dd7424bf21282fa8301c809d6efc94b5f9240a65504614ccf509295de40d8dcd1d6303e2e116de6b0dbddcc79a456054b4375f20969c58a98fe60e6ce828ebbc3ac91721abfa9148ee24a2e08c342c58dadb89926e864c3df8c16e92955b2ecdeba9ea53286eb27dd2348baa27a6115f216e2d7c7945d095514b31971028f7344757cefa9077a8a41064c52df9e2fecb7a963444597c98ff1c946e60607c3d3fff8df8723029769cdbd0f3e5a9a07917dd25974f1dcba2c86ebe31c129b553ee528f5ea636ba87ea6da7a170e7a4bdbc300e5bc1726044ca987bf24de6051e55289aec3881c16d59bec4c06043337b1b99fe2b6579947bd41d73bccb9509381a8f29d00a101397732f4e49b1753f464d1edbedbb278912de0cda6e11f4da9ba519302ced79e23e3e0b1a87157f4b7b8e1ecfbcd1230a2e1308a683c3be1865b58c79b01119f2df07cba766ff6ad23c0b2fbe2b664aa113067a19f221f81cfbad093e873c224cb34f3d34acb4d7a4b781edaa6042119924229718dfd348a72a7b1ab35a5d877a13b9feaf34745bd60839d13ef6c0cc1e7ac1897869fc2f3f7901f6a1e5625727dc19ac44c74b67f3d8d78bfabe83127a9b8f16345172632dc2698c299541cfd96ac5a99bce1eb768f52840d6b61052458bc072862ba936a9901008b7c7834111a04eed9e10604404da2c2758dae053ca3011d1bcb92088cbb8a4c521bbb9be7f81e424bf3d6ba6dbf8959a58207b6993570a6508420799795bba2e987483026cb94e16834b28715a7812d82e8155ddc69771e6bfbc43a0b1e1b11ecbe73a4e509d70ed055812831be7330fcec915f06920e89f0d6b6ec5a75f036ca9818d6145af671fe3f695aad955a3cee0e28dc66c41e2c0bf6575e51344e9110ff33125f445a5c2a9bef490fd0d14097ae84d09be325b603264c1933cef9d0956a51c61fd17e07f +shared_secret: 1554300d6dd3d2dbb7a1647991daceaac9bd28f6bc937cc8bd3246c48e219f65 + +# Official test vector 23, seed: "fbea1bc2c379f4f8fdcb0de260d31cdb064c9ea9b1d6dfbe91b3692add1d34dec9c9ffae7bf5e72ed2743ba3f9f2e43d" +entropy: 4b3a70d85f640d1a2a852fb6fe96704af56a7415a8ee4282e9207bc3a2dc116a +public_key = ada7c7f6a193f8174b99e5b0c249517ac47c4ababda18b523a665587579d884b7d98f778758c48d28c89c97441e7ba1ddcd020455c73a30377402c13c20bb8bcf9042066424a9081c9d44139e53f3afb7d9a687c3510a2f4f22fd5ab37bb778267053055f38158c3762694aaa89596ed824a0a10490c49619960b79db3174a227c7687ac0b4533197799969911a24bcf1e19a4d6224e2fea4c4da636483a09c39c0e63531e367b7b74c9734313bad6056228d00d90f8806b6a06dfb45e4366867c2175d692c66ca91083b5ad8566bfb4816b40da9971bb4855b44e13a04eac687af1a025863b8878827c1a06360e84c24e8940e404716e665e570a12b0532bc663001ae8cb94aa658a9394b60a6a1c8b008ec7bdf432002dd43f34fa04665278057cc5a0ec65b7315e831681e4d5ccc2f95588089122b18b4cb93df740b2910ccb49142942b563d2027c8552ba5bb595ef35943db0bc2c912d57f2cf166b2b9d219222a6a71bc55ccf7cb9c7c8c23398761aa58bd8a587013841a266000a375cc14018cec577260aa9d962799d9900a991873b175194720f50a90310c4b8b5248c0f08a0b609440eca877c708e1941a15af6407d5873fc62492bea381f431c8a727e5fa235b39434bdeb8e0918c4ab82a5d735b0f676aac18463f8e65cf2b30ee3a97969da994105d056d49e2245ac4fd1912a44b6f3647cb9c377df2c7f0a99016725bda1fb78670013fb25061e11c09fe1c92ec21a83da9a2ed2c95636598f63c264c972a4365e6580440b0327d3638628e06cbb7ba024bb2481f64bbd39a5e79c46b43abf0f405fee38076a600468f033b9c52aff5c3ffb6191ab8b37dbd8730ec63677e6b43afc74331631fa0c5263268b17bb0a77f2699e839e66489a8744230aac9c77ab765cc9094a8077c12c8e8dc6bcfe900e831c02cf01161c083b14677f01878655394f31296a33c612a18121cfba2f7a1358af8904b5e8c00028434ef812ac1a5d24bc2e09eaa5929c5e6e05683d292428324fe2a021e238b2717490f4731aeff426ad085574c9a1f7cab392d662fd25b4390a694946c6684c0a02d85da187769632b6a829cfc24999a317436d4b47473bbf8fd73f9576c6424acf65e88a4bb230aeec1f5e08c7c05a1c84aa3af9d44c25c81e4db436285a4b1a572f950437e277294de7c0ec087b8148607b30229bc97f7907076d9842f5a77fc5644177fc095e7245eaa7ba8f9c7840c99f852a109257b04bbb3679f80a617ba997f5b5b22c14d13807ab9bce20cc271c9b2cb5dcbf67e4a0df65a5adbc0f8634670c4718feb06880293d7c7184c52601c69c58f110cb1ef961aeaa95133483714b11b57b71cbb94e6a483444f65f293b7d349a02950079ecc18ce091ab09d647141065e037c2041c932ca092ac7b870e4a64caf14069fc9845cacd62549356c38fafba2a7f7133c5f7c630721fca36ad23767e4d86a2d1ec8c41da18355a9375659c9b7c04539864b1098b8c862dcebb94785370430498cecb064dc8aee2e385fd775749f47c1f38b6d6d08a6c3a5b2e148204d50048a3c8e5f13e2e3059e6a3554a636acca6b634aca6da71977e33a74f0a56e78cb856b816b73681a3a96f5a4328a1911a7e063eef31440fd21e5f281e9be9954113acbc3662529911cbd8221a7227e2d38e9bf798de61627d67b8e8f62f2e10bf66f24187d2ad2efa071f0b2210e53091e29be859857e801348092c572b91b59102e325104c6c1a49c7654c2bb4df431c12ab0f88e1132b63bf56c1616028994a304536564dbf18b54a16b50b9c75d3f347d8cac3f3bc2dc9827155c507294014c8c92e4121386c936f3bac661f4c4f8604a2b648053e88792f5ca9a48719bed781ad4a7bebd8306b5401dcba9a69a35128a7a89d22b97ffa5c2336cc5cc090a6cac001dc560aa25f8f65093f0c2fa5540b51f56862380996a4c48d90a68f8956ef49019ba809b84496118235e02535a37b1da0c95845f18342545ed12426a6e5ba1bcc7b348585669c003b02033eb024cdb70405f5c5e6077449d8c4e6e66d65a23b9bf51f40230bd241bac33b708ae7b2147809ba2a14005038d0d197c790491ffa5c74626d2f6c5e0ab2c69ba55ebc83195044cd7c4c00d84bc716d02f8bcccbb4f85d5e50c6efec71d667cc0338e6a6ca392e61bc1211681ce762516ade8bdad2f1ed78a9731a2634 +result: pass +ciphertext: 2814c86b427bab251a952ad9e541866a832001ed9859d12101dcd24f0d739e08a6b9a62d1aab7a2818c5f9dae38ef61423844427a2b64c90e1ce73a506b0302e531dba5617f739a4fd960602a9124848185aa176d57301803d2135c299d4be766607a219866d714055f6c6288d364db1e8bca2bca23f9f2a4e2af7915e556739f5137ebabead85315fb456f9499501b519283db6c67bea65bc915ca50ee1c77b9f035a15ca8d1ca5bedae4b5762e9acae10554d0eb6174938c786bfec3128bb65ea86a60379b477b88ca97df17539bfc142c67f0166be78a8cd3cacadd4af9f148354b869ce61bf39dfae8db4109b96a6da80f3c7b8316156234df427843874cb33bc4597fcc32cad20358ae650e82864fd407f06750b4c3015ca0d831e76cfa0b6fbcb5c920c9729fc729fbb1c404330bbe965848857966f50835b6f39a42d465563ee024343b0f81e7feb02baf0fa45cb866e51fd3153e79aab9866e91417df875341515952d5fceda11c76a6c3b4b885412cdd880becdf1613a05b3d48396e64b6446f0b39fb10ab170e5325bbb2e08a650c2065f85a7b4d5536d294e6aaf2350828a922f6f565ccec8cfb22bff15352b81dba6f97e929f7637000f46ce8279806b21ef3890b1e0e99228499507093dd808d4922d86d4dae2ae50a26a83fba367b50cafa044ff72efaa1ecaa9b759e630f254118b5aa10d88837c8add3aaf04da5f214765663fe46eebf244e22a3cc2ff30ca287b28a2cf6f96d8fabf68963ded2d72493db9dc71bed3eb4dbd6f9c2c73ef8d1f7250fa95d40dd27a689e0d020989b11d3818421101d6b850b6b3241f503e464acb922d2dbf587b69fc560f180566669b2ff16032a898d15bd79e4b0b68d8f9485eeb58c65c8e6b6d2e35d3c923fcae3c478f578beb54fda3dbbe59be441072b8e5b6ebf0f62d275d09169d02c161d458121358d3f5558318af0bc73547cf0fad3ae03b6fce3ee42907bacfc1656e3c1d0dd54e0c01914f4869fb9b05b890c6f71854f059903edebac8b51f7b68313b669adad1abc2c65d0d6a4c3aeeded37fc07770ee6604531d5aa3319ea94acc1755913e8b36d4733809460e26d3f3d99862853ee8f9576f911efeb47c6cda258f1926620375526cf86bcbd3fdd0eb0f848fba9834ce2499cf158cf772f56cf106c4d9d4221a5c47e1c387d39dfc0d80652005a0d4597f309bb39c305b02f73095510e016832014b6ed9210f96d4270d7da0591d1800f88d90639f4aeaa80bce27b46d18fe412c1d1293891278c2f4a0469439513622ad18824d8fbf924bd607f475ae2bdd27f1d867f427cb5205f856357dde8a1de80d497cb63f882fc316d9a6360462c12aaf05e08a96511fb06161b1107aaac9b5c2270ccee41ed68843fd279e31fca518e5829c3f01da85e8dee3c1c236732b5c945870257d6ee824884e4d949f4529515e74c26d4e5fbbd0c7639b4c9bc521d555b77d180cc770535a4d0f0963bca767994c5367d9bde70a966da321b3152b5a13bf928776ca66e14794b1a9b366b26eb955480cefd0048f3ed26405d2806d1200ec8a2541b1040741910a9f7c4dfdbae85a1b5a323b12984fb29bd254410662975f8976ce79bf511a418fe0cdcc48dc4228981e6f37f0dd4e0b2991baceff40111502205d77569bb9fb5487d03f22c7a852a0b6c620ea3f00b03fc13ea0220c01ef9dde592c99e8a01ae7604949a4cd9caeb936c7be6189cf8a332d9f01c66caaf7a6a17bde66d97342cb0f92cdc225400cbfd4b1c5743b65cc443cdb7aba62a951ed6a19f978ef15d0466ac128f51481f44e83c9b4445b8cc6851802ab5e0f244df4a231c5aac27b4ee4290375df1bb99b4a6ccce29bc0fb14d0ea5d1cf4083915d1448883fe4b6d081d01d5647d10338e2cd33b84f489d31029c4a9308bb6426443b79d27be8d0b11f058b7e214523cea5b443b783f54b29858336532bbf772991f0a4b0b67aa00def079fe2b5ea4a5f4a6e141346330b1776ecb7be83e2897d6ae40aa9c8cf0f5a8bda5a3a114c2f01d97c8795c0f93d396156f678473f80a3ae82db82dbbaab52a9c4a77ece6c8557463448e519ee72889f16eadc57c82afb28e4247443f0bc48278bb4cbaeadd6527e25b587425cf3710408f626b87344578990fadd2ad8bc2855302857ae91ebaf38d45eabd4ed4c67465f38f38235dfb7af77518e60a +shared_secret: 321f4ce476ad84c9f9d3b906a733b8bbd8aa0c3301d81d9cf7587345c098157c + +# Official test vector 24, seed: "7e87fb886bc3c7c9fc12569f465d2ecd12532e76cc27c65644c8d3dd603b0cb2d036c5974e675058f271d5c82ad7a813" +entropy: 26e38ac804fb5b4d59ddf747715e7e6041d875f99c7b638024b4af82d622da60 +public_key = 306c0e7e44a625f44880cb0d125bac36b650f8430c647c68e1ca6306e39c61142c2a5924cd0c9cd5a085f4eb5dc4815711e4aa7e3a26e521cac85c303e420a18a3393d996c1cb68dc9904588301385451788e57842305c064807421034ad845df2baaead84acee401fd912b191c89f51c436ff6bcf4b33b0b2120440e65777f4bff5dba7560148364046598acf3d46b70f7960eb9a7c5fe893c87c6dc5741cd84b080b7a4d0a596effa363b6441848d849b72a7cb9f1597c99b7eb6697bdc3181db25ce213c35725bcca20c840066dba39420763572f187758d05f6e43cbd41296f7c7a637cb49a57b00a2a9cfa7b2bd1745b5cb0255b1a68892431704f4bbf5c4844d0c1e9ca5bdefab042fe1ad30d4491427543cb39fd11717035690a77149e09a9173a433dde8a29c40744cd4a7d2ebae568a392981326fc8bdc2989869d6a56f6715ce65a51dc9a5e8f5c304ab6937f41964e80bcb259b9494bb713b6c882b94af5528a6b1bee6886f1da41d5a10b8cbb188aca7a820761e10b6797a8a5aaaf54b5f724c8fa9a41ad09bf9c9875df8ad40781ec93748b428cb0527c9257aa83d412ff1755d835343ae05be3211a447011944aa8952f2ca001153f10bacb18ac64619689ea6562f23c0fb5a33046c5dc5b7c37e2133d0987a44c207ae5abcb38ba68e13505fa5a05be45af5887606704b7b4a4e18e5b78f518e8680a4c3a678b5513cdfa3b18ddb285a562f00f29cad2c984f60c005f73d23e3cc617148d6a53177d10004981fb7e8a1cc362224e48d0cf69d28f213082b4425368c2757ac8493393e5495f35a41646225b3741e5dd1bd6e354681e8b47ae5c576b19d7c807feb4abc89ea94f2d150f946920a0a3d6bcc3d1799332304035515273c2c4e3764ca04e1653bdabdea77819e0490416211ba7877ab8028f8416fa08918c7a7791ceb4a65b567838283cea96997e3ce2564cfa0d41c43868bf6f6828dcc78f5c03afc4422675b9fe926c5d2cc197046c38a30cd5cecc076ba9bdb3c57a4fc806e835ef6b52b44070e4689baa7633458e0acbab3a781aa83158b31b1c949338b58ac034ff2c2c80d3bb54ef7c10c5281e0d5930f3817b9893032246f6aa82f7f6cb29a467395340c6b81347b2997f5514d90c95e7e84633813861c488ea27200ebe7cee795b560973effe3a19c32950e821ed1140b454c8d5da64453fccfee09565c7cac7192952c360232861eaba924780895ca022737ab9139645bcc7b6edc67050c5a90a4308c44764740279107f2799a455a8e4b2d384012d66956384b0cdfd108a1db088fb34cf0824f82ccc7da6a8824a90982a92ed3b46aea02837f57aa0ada783e8766887b538fba4c33b157c2138e9a9155795399cc99613bf9b707519f001241ab2336e96981aedbabd2f41f6673c4bf28929f777f2500cf0e382f8ca2182b9b8e4fc36be4ccc4a1293aa477a76625429a68178733380ce950d5871bd7a0695254cd4367a1d8a94bae95304f23622d07650a17341d401cc5133a772c8aba82a63feb19db78af7fd850c2104fd207579649b0b9eb38c9f2236f1669cc31a5a116474c9b66897c4f6d96cef6428974748bc066338a510621d9690e4345c1a3756dea7355148d45c89a16da8867e164ab538e01e35489c792f79a53a967277054297fdb4365fc7f9bc15068b70b6702a8d0aa9968a005a5422c30596dfc9c635c189f9d2ac1f9481167558992b21ab4dbb54f88742167164ff964c64201da9cabdce9b458dc8cd7489684d4c8ac7951a2147b7358098975837083723eb85a4889547c3847d7317cc88a1c5ea19294358941467fc48bc6bb38486ca05715058171c7b2a178cffc838de1ba0a02c02d4049960d477d9f79a0b1b17ba9345afaf641aaf80218d41a71b9063a5680579123992cc4efc596ddbc0e1d2c66f035963f7b11c7d74c35158ebaf6bc16d6798a24ce928274e125cf3d51419bc6926e69aaf11562f541446df6b77c625f9ec820587b68f1b50e590132d9c988b65c0a86b6c721384b9283cbea128904f5a8dbb6b6a5fb2ada47918ae3544c7978fbf9381f78468b0265290181b8f57ee043690023bc9dd4360fd13514c79cf9e3639b792aa1e70c763c52a43773fbe6732d262f9385716528200e37054237c04504a8169baff63f6fcbd8988928266537d344dd44533e2797aa03d8cb025e705a9f45 +result: pass +ciphertext: ff7ff6f6c8d57f4b3171c626be53e470c28f8686823d6af92427d22f30ef064312f00bb7daa97c68d5bfde9abcae3f34ad687f914976410d121ae4790852d0b8a0d607dc39f4deedb8921a58946de99ef1a5223db28cb3f2ba6ecdbbaff27bbb8bec11c90b7711b7b2fa139b18e49054623fe5b08b6f5e416018a6ff6bae5daee3b26bc0b46277b79e02645f16d84ca6dd362552ecbdaa6901ed7f4835662bd22cbab1405e8c301f6bc807a8c2f31741cd617a652767f3fe575d2b057f00b91503c457a60766924a2033d1a62c8e5fcb882e1cfa608f4ec15e74a893e170c5122a86a23187113a73478ebdc71b504a9890bc5056e973fb591e4f2e2f26c8143cd9c6568fc00296b0608eebfd14956afc65ef01a4a0feea97dfb7464d10646e1d18ad135b0f920fe274856dcaadac5d4f2dcd54b73181997b9d1f7521eb70c20edc40815d4a28965369a7af6e01663e163814d01e7500ec5143910758bafbc990bb4b9b34adbadaae3e46110aee4c3dcde08e51a9fee0c59e90c4a45409ef9226959e9ecda9d795dda6b2c3f3ccafe224167df3390e88b16f909b031250df56b821e0b1087a9512f72da732004770aeaa08f8738784f3da8b8f33eb73b3cb7430be7ed3ecb27f38261175e340a15090b29eb6a48470d434092cf937ea238b1537f5acd76cec471c2d4562040beb08b9b81715f5732c2c427cfb44aee961ac73cdedaa24b71bc937463a83503f251a03d6364fbb4604dddd584423a8012f9de10c91ec53852084a19ca71471c79fa158fa47458b198188f9f21ea5e5534f7fbbcb0d32bc5ac2ed288644945a5890f4a86c50609cd63e372ff1ce093056fc12010ed854c4aaf8cd2c1dc711cab1037cf36579274e42af5f21499781f9af2c3d1be65a6bdeb0d39ed227d556f36fabe8cd4dc33b94a1ec74029c2c47abbb3841aee0356e48baeb9e2d263572170d6349327e24836e55dc3f816d1b91301d134041c12798eaab3ab38796b10a17ce183b913af67e201e8875d8224468f2f0289cf9d8a3f196fe2d4051b8f5a9dac0fbfe9426f4521cbb622a8b3c46a5791283d6564f6f823d2b97f6bb58fef2b40e0afb8b6e3deedec06dcd4e55427ffef8538e18a95cf43c0543e7ef731fd6395fe0c42203f168f8c48b1f9dbb61e9958529ff8de9bd8c2dd8509c048c3e54bf8f1433c9d7585b3060b21b624b70d11632381f30174444346b3ef75956ede16485e2156ed2917ab9b020cc672b8ed2ecc6daffb7eed584705d405a515d16596c4701cb89557d9b46a5ec6302ef6eb43cdef5679b5618e376efe26254c1407b70334b7e3ea30b5def506191f4b2d7e148d94ab9e1d0cbb52284e90eba2461921d6fab64034c05d3dc80c92fc2965abf4a60d8d3f50cfbd13f3469fbde1737ea5f54911c590a4a008b3497a172cf0463d83fb20efc9cdc69e8910f5755287b9dcf6946bdb27b814813c6f515722d7e01abb9a137fa37a5e86f05695134c51a12b992e03c8689a91fcdc0ea6d9612f4d3098d415c199051b68c3df5f101af6929711c3487acac92391db09265034498a5514b647cfeda149cf5a0613e5ed29749470026fb622280e5d43f131bdc2e80eb1ef801a636ac13748dc60c770f471e514905dbfac4d554f020273d64b72dac4caed2d9ff446dd31e39d03d43a32188d6a03def8e22f60beb1e21a32b0d56c8eb19ee6c5ea6b249c73e2036afdcccdb0f945263df3cd25eebfb2f90c7c2804f7ae9ceef277c0cafb7881dfdd9b43f43510a78f36862484c70bf3587b981181c4340141379d50922fe43390c1433e5ffb9578f957f2aa0be393baed2cdf481ffa9d5914856ea4ef2f31ab5ac2cb574f1983da1796d8706d70b904e6962afc2a5270ed319734bc6aa48bb21d51a554b98dfc0d73f395e648ec0786e03c7a69011544e3d653338e8f272d56854c91bcb2ffa84a060cab98d5c4aec1cc80ffcab9c82cc551b461564d93aab81fa8457f2a12b80d26bab3f4519c01be31dec9c67b4aa00b2124ef81f25bc71f40af090297e8bfd9ce5da48c6c29318109927b54d7ee2463175cb134d8299aa645782b7bcf1efe4a7f00a19f688d0e0f63f262ddb7890be4a2b60fb51b00d8693d12d49bcd30efdff4a123574debb51ae0847fd40d1ae298afe11b3089b55c130aee7b128d07a90f0d4c27aec2565b59ec01e1754105c5bc95fc01fd3 +shared_secret: 3f9a0a1579989654c58a2d33470a0ab5b6587419be2e9cf4c5027ed252c48494 + +# Official test vector 25, seed: "ad1424e804f306c7ff513da4c1e8d445afca7bc942fac5c0b335733aaf70693712ecbde26ea726ee0f9fd9d52a83b1a4" +entropy: a319d2b8f114f1acd866478bcdeba6fd164dc4e37b0adfa8d8034afb3e197376 +public_key = fe3200f3e260b8bc589d0162aa2b1eabd229f9ab6f64e528e0f05b3c69b9c9f192964a3a6d2c96b8d525f0bbb32b848e5c244409904f1583c7d58209b91465b9e3a6f2a515ecf55a778119455bc57af5aa885b64100acbf9746787b9757a17c1416c4ee317b017348f5299661436c1fb5c8aef032929fba046a601804b7b4474461957c8eedcc19c609253c23ae1428674b5ba69264ec1ea74f825198ca71c3ad929465b2769338a6359132027aaf46173415b31ca0624d7e6c258a91388742b0f71917df814b75c38b06025fc9682876b597cd65cf21943cbcb4e77b1314c4b487aa46493fb7d5f734d0da891bc51cc8fd0454a7c9bfed5747daa43e2c95fea422165e02819882a535a7e3127396120a242412bbf7384bc91372f640202ea9ea5830002654d40f346c1f2025dd648befb332bf9ae0809810445a2c91a6c51c68ea19b01ca287e3e967139f58ee66b4632346cf4240634095c59492fc3b919be49c7f32b00da0a9b95625131e24a3b03c0b44c0cbcaa7fde1c7872645950818c69a62d864b251e54b10fb6820b9678026353fb3bc09fc90cc5842849252d2c6208dbc7754cd70904f15434a8840104b6a74814b555c69897b4b2d2a69407715f93ab337a7005007218b5536a89020332998a040599bc688f6497c520b73ebaa40b735f41d966caa24e655848fa66a2b473437d14c4f80357e449643cfb34e1759676b0b2b3733bfa6b2324357931a72866e99430454fb1b65797a90e5257037744c0f06415fed93540a68fd2bc5ae74247940c21a061923c603c4a89309f8a7d1ae48a29370908d9137db01ee84c3fb6d4bcde28ca63c34cf1012bdb060d830c2aa6da19ecc0c0a8fc0272e066a8d6225f3a2873a52992768ffef0bd9b109ced760dfd2c3ce7d17cc95095f95bc84f448ec51331066ab0126505df1273741220a869b518cb458b00b5e1e503f53c639bd2bf11d71c45e8866582c71c0663ccd19b0519330f36594f1385ef82199d76b4507318fde59b6ae4185f3811f15b873be902d80c44a9523351653365e369be2939f6f17f753c776fc3421dc75bd0ccae0fab9bcc2a8175408950fa32e983cb736075040a857501b2e543b043b617c16001cef203ae164effc243d4b1cba2f225f361a7d65949cabc32b3b3a782bb18d03627cd2507f1d122a46c3e35f91315ccaaea110709f648114220524b8fae55c8e6caa27a693c3a559496d30db2458674392575accea61c91cd3b9188b94654d15e7eebb383e19d114bc0720b7552ba0d42d85863e984a220bc4632bbd7d1c33f925836e117b209351ffb01c8923edbf4a54d500ce7dabda45021601a5b19d9b0b736c8b1e30896b285a633c647658622b30a9b476a8fcc251e0971f8938063550cf39718c86b6849c7b55319b7a4e817b4447d265bc5189614247026c82c557be5a4e1d302397865af7277646b442874a5b0d5ae60429e4dc5ab30c132052030d747715dba66c16316a7d10d180b6ea88a6e97601ae1131a2412b5e83039c75a1cdfd8c0764109d360094882725c627a8f9395cdfaa7bea40263c8479b3a3e1d68cfa5688cfa19322b833e0eb863171a3f48b9910e5289611c4d51554574cb239934cf870550a0f7a4e78b1ac50b59ac5b1de0f348f0315e627cc2e50707827b9f9c6b943010b46a2b752500526840a13d3123621462bf5486820594c40318b86731e1258de6215d76d68b58083149a041394114caf69198277a8a57082da4a440f799f78064310660350b0ab34970e6d9c9e53a2a24b2c95135971db128eec54cc21378b6067d648c85c8bc21bb9551a0648825719d5fcc67717083e9d677abc523340cc24da5b489933ad7d1c1d12b7004bc1a875244a7b9810b29c77826aac6daa1753681e2b9cefa4aa3a5c4cdd63a844166017f8aa79db97115b86c447bb7e66b7964a19d410149fbc475ec1bab8b06cf96ba0861062f89a621776507ae40849b82615f0b6d81ab82a92184ce9b8b07f69311fb295eb83cc5cc4545d89362c33c8dcc7453a70051f40a56691e212897746c17f5002d8c15bbb2b625ef267914d62759cc01da4c8437eb3facf336fa0bc0e83a9ff51c793dc44007a63432309460162257d191ed8872ead9a8a66296a7e55d30d86ddee023ccb84744bab7db9c015a60707cd7aa0ebe7b8cfb1d663d8b18c5bbf06da994e7eff9d64742e2 +result: pass +ciphertext: 404d2a66e2815b1dac12b2ac170bd54d035481a4df94a2773f03cfcf3d0100524e7fbfb8c41056b83d967ea669e174675b908d34dc4d1ba8f7e322ddebb1a35a38d3243e7d3b55a65915e2fa9dc43ab74648db1e10ae6b516c3e547343e85914db7f1433f7747c8519c8f3a4c60b579b6fad545e1c31b7f92032bce8b7862861c87dc8362bcdc54c1f4d57d0f54a2815edc2bf7dfbb2691a84dc970032901033166084de5b4513d3982d3a0324220e432bd8ab501934ddd9e02e9bc8a47cf54fb33dcbcd71a6d7eaa605683be12efef95aa8765a593a3210ff202cab70880dfb359c57dbdd4df350c5eaae4b19e665d5f14dd12661bebb33fa574aa76d118b058a7cdf2cedf0ffe46e10ffc0e0237ac9f26553cc6e576e0ad8b563a41519d7b7fe2d84710470992d36a26f29ad5edd385707df85f73de32ba0eb4da2877f8881ded4a46c8471c506be310b70ecefb3852459fba07b1c879f2f72ca960a7e3a09c02315a7fe5e66359ee2d10d7112b41987db9749a48ee25b30e2c8cd5b16b9b72970b4f632960e1365968dbe1de58cc7afe07e8354c9a80aa0fdf189cb47ad8d257cafd6e7272c3fb026db7fa0e114d04be0523b149eda1e1158fbff7d99db920dbe5c8460451f76e124146a8ebfae8aa27c0971ff4e2955fcf243775c9ddb08d88c250268e01aee185287681e1ac7790d8f6a21ad61cdce1a7cd4ecbe85bca908ba7ad56ab27008086d7d351a4d1eac429a76a8591ee4124507a73ce204d7bdfd1f36f36966847726e44a7202a9181a5714896350567eef85a7d19e62b210cdb90d43e8b54a1684fecc4941993e93063e096df50b911bfc6cfb6d1b56b06a2c45c0cad9229bbc4d0d44617fb869d17dd72a0aae77a9c04045c125432f48c092fcb641f8165ce30ac1e382909e7bc51e057957e65103f1d9c24b6243baf375e45381c7447479292d4762bfb7ff52ab0d6c2a108a1ed717dbd8029384b72d554b7bb178ee6f7685a27175a595a03dd65a5ea1995ffc30656a4bce5b7acb0709185795ac106204dd4230ee71e56a53389c7a634e1175ecddf88503f24ed7066ad1b5b523175b071f2f44aa3b198b6bab481e69cdf1199cee43dccfe7e6cedd1e371b147dacd1f572373e2d072e3c6612b7920a6b71186dc35070d98c614a9a82fc5da515148cb29b5f4c4af120fe1c5d1b8717960b6359af4ed0962c17c1e28137702176fec18311138927493231228859770c4eac31c18ece82cbf769a5357e792da69aacf714b41c138664902fb556649cd93ff0cc3b57c8eecb81be7377f4c8df23048d530009f16537c2135bafc07d6ad666b8dc24d7385c316a69df4e7769ef16814563f1989d7a7c593aa4a25f3b7b3cd9baf3659831a4b9871ab96d07e6c6f71bd5ca81aa66ead3aa21080f8ae78d8fe030466e931b50e9402511bc145caa0c30b0d1446e2a8ed36e60efc4f86371161a58d7259dd748185c30b445b49829e7baf11b9982a01e64378ae9b205787007029c8673cbe52d93206503039731b7943334a58682cae94ef5eb2c39c8fb91615fbb0c18a9452b478014d89a5714630316d66e775294ef96bd401a55fa8ce4d2894c1a1182d81c89950f366dce9c271c4be3dc0a71bf48b8f9068e798ff1ea2ac3a534dc65c591fd14d5f53d68ef39550515c3631877b9e953ea7690495e67d3abcf1e5c7ef3ea1ada99f3233fe47180a9ad000031113e4faa26823615b4b6f68325bc88ad783b6376c166a91bd753e5162b8f5f30c68c04d85291e119f14836100335d57f78033080d9cce8932ea6f81f546ef63e59f9d4d7ea4c2c459c69c7ee7b6f7481cd2d584f30e7d17cc9909bda2fd14247595953748537feb6e9007a5a7f58f916901164bc91a48f63c92fec8d2648c83102c4d1f0b10cd076320e64aca3e2501ff913106900fa96aaef968fb677f92325a16bea0be578fac616dd0da218b4bbe6bf1f1c296ceeda0c30bfa5321e5cecd626be7c4275c1bd9dafa8bf53d634cf36983b958b6af3aaeef9fb1499433737fec3f7bdbf5e49f59a456f529429eb6ef83b87a7a302e888aaeeabd73a80936103b7a256bdf8c01327147accf69c4428660902a5a0e4475b47d94041fcaad68b63cb417fa951599e1205b7f6c9663aad90bcc31f8a6cf3c4359fe2d68936d6fd7c567cfb0aa4786884e498eacd740a27045c3f1e683a1198032d +shared_secret: a28945631e9d080f64dea8dc345de2a4cb95048d5b78cc573afac0fd86ce57b3 + +# Official test vector 26, seed: "7c33ca0e987226c8524dd56c811fa4d1ccf9995b1e4e4dd5b1481974e88cfabfbf6787775c2611cefb27ed4403ea9b46" +entropy: ff646071b2509e6b75790917e08e4f0b0d9f0116ec6291c0b59eaa4b583ad830 +public_key = fcc42e1ada20b880b35f49a312180f66b866c4952d92f2bf38b08f6110850224909413938678c8f9585a0741b561a36b7680644947485b2462d984ae5ea115fd52202643014607067b9540457a3405e7127e841d004b86c094468a0743b82bc70569c3388338e0dbc6abd1456ca3afc4564ee9d361ca0a708e417aaca1af12151d5fc93db4b652eb990a0335c799a27b713172b6949be937b570384f3627102dd2bd784c97d46c8a2ff2a1d2a0c438f0281cf29971e3c58df77c33b83b5252cf0e72c4fb9448aca6a3abb06a22677c0206609598c544781598fa318bd58da2625ccaf7ae759b774147380f0304163b0786a9203a1169d943b54b9b92f7bc7be5fb17e87a37dfe73712c33fc0824ab448a9b2295a7364629956cac2cb6ed54ac085bc3693fbcd9cf7b44d4b318e248ad737aa1b821fa985bf7f219828b1cabfe66deb269a6be49dc3f74af594c820748fca60961fb04f22ac2cd4787b5a41a91195b8588b3a74a1a188f95e50ab047cf42fd5b63fb88ba57dd24528f90c2f966a1cc91ce39ba848fbb2ec4576df188350f587e59b0ac0848d71a93cfda63e3ef93745c6516cbb69a5505b1f900aa4f91094306c84f640050393f1c751a05872aa7b027f678b1aa2cd5f97ca25806a53016eae4412a7f23ebd8a7359e5a706a11415951ae2a45d60fc999b66a255cab76ef85601b2974c462ec4202f83b2ba85190aec7c6fd6263d72e19f7ef71b6fd37694ec1e56090290549d002c2da8b18beab345f969bf1b23144486c299104dc7dc367265902469c45d7788c5d23941c6a1608a12586692eb759eb4835c537429ef287b6709b87dc22653d7a92cc314a295a6a6c939e33b3a87394cc40cb284b17987a088fffc3f401c2b072cb72b467d59f930d82101ac725c79d54fba036aad5760a615cd5fa1a323a87fb63a4472228f124a3ef72a086ac74245cac6b7784249d17c7a19a126b28c7530c1ebd6a806097de35177a5070abe84bbe3b99ee7149c57224357c8624d08ce6467b144e598701987fb460b21e53957f57ce98343a564c63fc466f7e04bbbdaa63ce79448364ff1d9c05257219d03b2d90c9c0c299026d3c0aa4845050092fc7424f1ea03716a456bb2b935a2be5a5570b1eb467d54890493c4977300344887718bb54aa06bd890229359ae33395d7a7b08a71465297780f54cb0d2125ec1311d6bd31766470dc18810848706c0e79c8654c6c6cb35d4f62ee70541e92982ba570dbc289be8e842a31b7e7158660744992d6506e1d1c8bb512f98015270376158228319cbb7a2411253a98cbbca8a6d86c2710631e105c217b2ac05f813474727c1b089b3c8ab8779ce91619352d86b38c5a622c73d692814fd36800d5c009af0bf0eb6734eeb382f70412c2469d10698071c772e62c6243cca236c2676fb0258487430998ad99a1456d29d79977c810953b138642754c0bb993e8b9b7e3b3b7972359569c44bd6576fbfc212f78c0c33362011225d2596bfd2ec1a4b721a36259fb723c6413910219048596252225879bf301c20d305dd3bafb2e62ccfb1c3d300b5460ba561f3c61930662f3641b763b2f5b5b2682546cba9a15331b8afca63cf68b7a1fc2e49c5b4042a3a2b2148c427c9701727dcf3371bc7b13aa62878c8a358f391f02b1fd3d2ad663c4f71c36cbfe11581e1995d976ca37440ddf9c4de2b48ed9c492730a977e017a7065cbcc811bfd155d1935122e12325732505c6c568fa67bf7968ff6836f765c242b5b9966c333ea1161a336164d72cc5767e40939590f07b537788c46265fab1bc3078c470e98dc1b7a31cc53a83a0a7e95c4634754a069007341396371ab79f6343b601b50966c5999144cc46b6d06089a879871bd1bb9c2cbcef84cb8fb4a031786bf778703b164f6787c5cd63ac781424f8550e1ac992a6c04bf7953787047b043632de12698e80526c813e08f36dc1db592f48968395817566886bb2c7d3fcaddf331273ec7ecbdbb3e5d70c823323fa8a1a15e1371534cd0462cd052685950bb6b6833600243e35c7047bb20832f09e1d854739c5b425bb32bf86029e1159d79ba70293badaaa25385563cfb4babdf4bbbe341058d3817e9a7941e69adcc867559b822bf63d0034c15de1a9371945bfacb1caca4fad8590f723014cf5355228d850d99c57f85c67295a4afa0b9d8e1da6065ee0e9e43b6d +result: pass +ciphertext: c8940c3e69cf3837c2792ac9341408c5106afac1fc3985744f4d0289f745add955784e39e345526da04ebb3af35ba4b4a8cf8ab6fab0cd9c27b03266dee9d0c224f6a3e481e313af21e485df717fd89bb60ef6cd991896095eac6d37c20245223c5c2b62358a0d57f255e53ba44663667aad78d564c0c6b1a3cca8da1fc81ceec31d3f347d890b5d829f2c93b82d25b6642ed1b911ec82b7032ce5c0e56649dbe11582097ce456352f842095e8ea4a14dc3ed29958d548b960380f4c50dfaab65accb98d74862dba822c438dcc4a21ebcb3a99f89496aece9d7ab098e7deae6ff750f979e32f16d5796e5b4a68cc10a396d1894066c1a335b4a15069916b0e81ecbbc526192c904d857bfacb6434b061a94c55904d20e478a512474ecd6da3ae06fdbeb4d9db1d571dca82e43934160d0f36e52cbbd8f9f781c07067b4e82cfa9ff0ab971502d9c09a323c36ff304198af9dfe121311e207d9a949591f5e6e64accf451bd14c06e165a177dc4a47414528c85c1375ad952cf16fc1622d32513405d0959f333cc139a6c27a68976f06b21d55f4332680dffcf12d636f68142e13e5f05f2a8dd0ae56328f1b0e409eec89323c4b03f693276bfe99a5dc16071d034a33cc0bdb6a533af8d2b755d4e4f89521762705d0cf88a69238439f51a2c6982a82272616d34aa986db27404b60a43b18b565faca6263a888e506ddafb1e8898483ed24422ff52af414227c649aa280e7b1ecfcdfe6e9f852a52824572964d9a0309e0eef481852f344c727be41f136f5acefa62275b1eca25ece000949e5f93412deaba1f35d979281fe2e687b3ce49fa69bd2e70fac2dc72dc546ff68b2394d5066e7dc7e1e8e4461464235820b54a2672ea3d541f582e8ea28efd277e8cd22458962a3d9d8d1b3dbfd978402e20b0c25dbe8093632454498620f27646fbe1ca40b07fdf986399f4c742ed706b3e1c3add52e20a971a3bfd97e7b77b557da18fdbcaf8d1a53ae79a08dabeb69bfe5be215a74791a2686c8d13f49146cfee7eebac74e8b0b35d1e5d638b10732c2077594683425c11600bd90a61cb7deddc91cd16faa1b4d80b33e37cf89a73c5a2066831fbd00a6c838342adea2cf7ffb9eb9117024a03e10331d5faa00478d8c9826c2df0f44480ffcbffe3e4eec957c2e95c135c2ac2f1bfc9d9c241d1550869bde95c00616f067bc85cbf1a58b3d53ed57dda18e2668070f9524d22591717ca7426876977447bb4ab0598d52ae2145b389d5889f414c42236e8ce34677a3948214683e4083ff91d96562a72395d3a3b18262db82cd484a5351dda702a03431859e3832c4ddc46eae03250b186fc1ac8837a1407df20a3cea689d163067cb3915a067f8e32d1137d08fa382abed6912b0669c360b8bf42de50a596036ed45e5481dd6e42f984110a632ef441a92489444edcd716cb9df602755a60a94032dd528ad2627c0cef727f5b21efda54bd27459b3e1d8b311098f10a1534b30a34975c86110e3b8cf37dc1087e52097e5aea8e4cc49c62d3770b4d9d5aeefe42ced080a4c946c3ba70d5e601a18e0f0ab985eb0973ca252c65fa89308dd7c2ee239595f464a290f570046f31a9549efabcad5c33d6ce7794d08cb3a42f594f89489eef9486df572dc93259e412a9c310f878d785ec432c373801cc9319a008624a3d2619d74f0caf877322d52d091a0ee4e1e845637e6752f610870b8bd9c62e1d7b53a84a6d8ce169c7834f2239a20420d5724f1473dccb15eb74db3b6465b8dacac10d1507d403919b964df03eaf7be3d86b26e7defacf89ddac3c6a21f60673cd2fb9f4524992875f6c0f1e390b969389d6a79d06412851c5443ce70aaef5f6168d8ba1441036d197d4cbdab95b144044fe88ce36818f2ccec8b1769108eb7cde1d9ed6030e39e2be445e8573989f818d660bf94ac95f2db111e28a6ba839b94e6486dfb6d75ce48168b16feb3e6510a862ad777831ec3d2ae73eb15722a45ab65f921a2bd39c7013d39da9e75a80975c2c9281a6efa7c6d26bd80ab3de9980074d9a59dd41d1b56a4ec95a0b5a9f2aeb90aee83da8eea8ba2531f095b3f365aacc6f3321b624513e35fd3c9087ff0d32293ef2731d81d956667e0b2be7c8f44d3238931c69d022473059f5c014282932194bf30a392bc4f1f8e3290824ca56b0570af2cdc6a80028f88bd7641505abe9cc7 +shared_secret: 5a2913f3ed09c2f765977781f18823602437334e5a5c210a71f4cd734fd10b07 + +# Official test vector 27, seed: "54770ea1252ea2857d6635151194f5f520adea8a41e409ff498d40c271359858fe2b084d5b96bee087b8e8f4dd4e00c5" +entropy: 0584270ec26f3b9818e4af074d17b2d51037cc8dfdcbe3b140fa4fed5deebc54 +public_key = 3e074aaa7ac9f7703a87b72bd0aa050574b63fd80ef56c882109c9eab220e67041396a29d6977f9530c3628329a2e02a7850c77c73a4698145c837087f2241ae46a1b7b692fb5c81de38846a5bad7246b596a889eaf558d1d55bf1372057f1795b40076d53c0b81288fc9009757a9111ea26c3410d55217768378cdc94a3cb40af38f67b1b473b15205c58d876077b2c8005bf870588dd6318ac154dbd9aaaa6d48d1dc05118739fcc7c12327a68f8b5369a846b6aac56fd1043c5ca8675752c12549840d47b6563c703723d6b8791bdf14e0011c0605136a1521265c13874b9ba6064b85ea895180c634168774aa55e2df34ebd8132bac959dba90ffa656e7c61677d3b801ef3604814ac36d31657bcb05bf20c893a4a2d50644902133b9b16e81c1abb2b5521408f3799152ba14d51a6a7f4a231b5167b0273b22cfc606482cc6685bbe8e80f6aab99d7f55b50e093aa55b568c45aa3e4a0766a9228192e5e91378af608276308905826c6a24e7413aa98f57495dc2d5ed5bd6fb5c65f4b4ed7b9c4c7b504548b0306c892f547613516a9064417b1b96a95cbce5b502bc770356df5ad52b98adf01bd66175ab3747910c814e7b070205b60978aad90c43341ac6aee03cecf7cb8cd2b4842c3401ae1a3b60207af366fc7f78069e39fdda0ca53402ba455af5ebb21ef9a6d60501d6ecb1b5297312b280ab2023f2fcc42c2d66308f263b7d019af68144247c2dd93a05df57daa5a03e896a182b480f1f607ea668aea60b66964b2a3fb609ff547da9a51aa6848ce2a686406c7fcdb058595a807a6692f833cbe3166fffc73a2f30523c86db1b98ee7f477d7f1a8c7110076774d6147bb56a79aceb6804eb982a8d00356553a68ea8e91d8b86d676f394a776353bc830043cf209dead22480c08d5df25e80fb734bd6558f1b9080b09fab642808c458cdeb0d72e5b49305aa502321711131c7f848fd14811d718be5c805c8b254c8c556981ac8c1dab13cbc9e91708d99688e36599f3b7a23f7ab83f2a3b613b38287b2856aec5b4ee90c33e85b8d88cde3870759320b4c1c0d8d727c8e379f84da0221b2cdfef70270299bab0b7f9db8c69d7c9ea6d01df6107e04440bdcf945af329bc016892d8c01f071654ae3b19374946246027210cf9b1760aafb5e4a935c2d0b7c70db3721279e6fe43d712468fed532cad432ec30a1372554c97c3769c380c709018393364ca97f9dc37a0d393511990aabf398474965dc45ac2a37ad60163145bc3b73e7a6c2032f7d2216bc19b26b4cc55bc68ed996411bb00715473f4e0636282c203770a3bbdb26cc58aa7b4c69dcc01ee3e53ae514169859b632937cd8c355c560cef5c091f4080047929554c94d7115393fccc11fe397f2854564533fe9e66614da3afe15be92196268720f5fca36878797a2b045dadb2491fb3cdcfb7253f18750774d4108bd6c7c6545b801e8e368a1087e0f33c22a359907c1c75bd59db28268da457699337356436786b16bf6a25fc55141bca303faf566039991c700a227c01e6543bc173c06b9a8026fe07e032c30f5d4c86a950a3a7b32e6c67e51771d78c08cb5382bd4fa8068969926d352f7e5820ab19878197c25172e95d6ab6a05acbbe375ab955bc777977d2b926786c9143978113c490731438ea53c0db27bada4be961b38138b4c684a12d4b08b6f03ab28f6a260b01afd348b59684197002bc534836c8b735df139ff98c84ee03a58e02d0e6125f1e09bf7d7a91840226362a667627ae5f580ee50b594fa64892a508ff8bf80851abdc45486936e11e26beca14334454d66c0128663c52a8700b525950425a4ce7824b25b9e45ec6bfff8279d1503816ac76f498f8e18b2b626b285655ab40096ceeb229856457699b500b77f7af5c2bc8c545c4292a387583fd74dcd20c4bed85bec8c245c63608ea302d557199d9a70194a5e92acb24264532b02baa8f824052379395b3b4222536164823c379782837ff417b1583238721b8b6b4a5be982abfd35a90d07bade5c03c4c3170257bc0e88b41b242b146027baa2cc72474d00427b0c79cf294203df379628799452d3952d2ac709f20dcfe33b001022917a4678966f1d9065cad2bb9b6979817873e8d662d7ba8343d18729291c544c00fdeac5ead3c8dd2cf3e2ec7899253e7f980f9ab3230eb1a9a3688f94bd522ebe016e2980d72c +result: pass +ciphertext: 5740d7e2c1b500947e7aa2f01381407b5627047669bc3a89bb5040aed14f0be11c05a56d743b884f7f493184a108e2820a859bacf72be64709a6f57ac785d44070647596e7f23cdd66a2e0403371a0ae36bcc95212fcfd7b00af1dcd22efc5905c37501ede6abd9c7c7b366762a727e58ea82288ed7946fcfb6cb6f17cfab6c30622da11b4b6200fc8237beb65d50f2749c26c3c1b014782e8cf3bafab9c6efc12d674642101d5148e610d0b62ea6d024af6386f5ca7a15f1a2f793615e8b053ce0542ee0c622bdced6cb81c4ba9afb6d6b70cc07e7d42cd72556b8e2c87169a8fde513a8c53fa66e280a1b61e68a0a4a0103440826c430a4d0b55c8181f95c573582246c34b880fbeddc4e6e9ba0f3938004cd8d4b429f639ef3b214f78aad31074ea3b6344522ffc306ec466ec89c5919292d39d682ad3e62b398a2f7991ef3a1a64e94b72d7ecaa48e1ceb95ec88fff36dc28a8ad20485b5fae3694fadb942bd6817f79adaa43a9c747cf29fda10472797bd7736c0d92d56ef30e6d10dffbebc0ca4610279677fdd4b015fbb5f6785deea717282c4eaec871b8b5f6e93b197e37ac566348d4d80fa4dfbf9fdb33164f09eb687c5c445942813885714523166ae4d006e0a0204bd88a870df62a933a794a1dabb4646386c0a428aef1e4ce77fe2b41819ea313e3f475e69113d7db68bd0212de9ac74286f8f99ec35892a7ba5a2c6caaebf76683194ceee062243affdb66b8d31319ea1f72a04b29d96423fdabe01dc36feabe0c1f4e189d6704f7215903ca7e0a5c7d9e32347ac8eeed0430b634684636ca55cf3ee8f782afc18e76729bffe70a66ae2134a8d46bce987e54e407e5e2631b5838c461bc26366883b3a45a71e7e9a4559304bb9e0a0abc8594d8e4035dcfa5fd87b202222aa5692f8d6c682ff889c3f0137d88b56959f03e2b210151ca42af8f130777545e9ce51235cbf5e77a2c6dcbeecb42bd7ac91978c951f52e1e6fde74ce808de813bdd12fce935826a39426ea9a9485f3c11fa141ccde32ba5131f25fdedb7ec732e7716404c0c762c3b4b616eca02fd824bf28d3926d38817d0bcda5c2c3db0bee7b5075f140be211a310dc652130c271e65965ed2efecd53b2b119d531666dabd920da11861b68137ae03eecf96535ada14502c3dcfdbc6a224d94fb138e3ee8417f1547743dc618bb573f48984bffa721977fa26fc695f8053cc98c681f481b45321aee96dc9ac158473aa1cb4904dbc5614ab3b7856f0612f3b619f97094dbdae6da8a4af8fa0f302a85492e6fdbb15982b783eb1736f8667f84aa031ac5db11084db69d09e8caff7c52d89fb7a23e63c125ce4c39b1de1c1c5f8fb750bef864b57ab6483d49c99d403c47f1dcd5fab8e3e02bc80689ab7987a90c7bbe1a5f5caee65f16014d17a32eb9a6a963ece4fc691b4fd323384696af89e015a03b57638eede81d2e6716fe8ad838f1148cfb5175953846680c9ce86d8c786a1f6042ea39472a47e8ef3f81f07a35edb0378228cfa7760ade7da7a6849cf3b8a18ef60286d27f9ff341a4f1fd4f04633a277593ff38fc095208cc37628d980e8ec2e8b4d57c0529aab6752096968ca0a17d1abd1071d197930b846c1aae49b69cba4b3fdd2293592e6da36bca6cf38e03e666d30f33c581e54efca3115b69957ad66232643bca122dee5c7f1afaf155889cea07781fa92e1f221ebd9928fa4a4cda0d2d8b95529a153f965192421bef46603a9b89dadd13a29c56239813e3bc577373a7321e1df79f7b59b57d9e39ec44760b1e5fc72ad82771917ef756917489ea0f128211aaa31a50f9d380fa48933383bddb3b11e1b252e2d2180a9a7329ba501917b7efd21a7ba71e89b20f5633457792d08c20025b41a80d58d3f8ca1216d20f04f62d1d2742e3b7b6c77e2c6fbd1a4424534c72c914c0484304e8e789c83b7028fc0042fb16e5a30dcebf2eb01c4aea036e2edd975caeb8a32f6afa3466bb740e7735df8e1b7d1838c85b366b43dd97dcd1a66b7cde59de198d5e0d0f3c1d74ad06772fd41ccb2b568277f0106b0a41fa1afdfd58aea61ffad6de24dcda35c9f8e0e864d898670af25268b3a2ab0240e95a0c0c36821991631742529e5f8612bcc0f71602fbf5448aaab72e6e598e5004e454bbd056e76a54eb2cd7eaa92186744acaf865373345fc79d42c5cb08314ec7a08550 +shared_secret: 3084c8b9e79c5eea12b89c5acd1a5cc6d9835656138a1f5d68d27fbb56988d57 + +# Official test vector 28, seed: "cd6cfe94e9c0a1cc4ffdcd2d7876504be5f50f1d1ca5cf93482943465b268276056f2781f4de805c138976ca72621387" +entropy: 51e05c7b4ca3079781e8293f4eccebeeb2f8c8b4c59468eddb62a21bcb4ab8a3 +public_key = 10489b6e431f18744974e86c075394189349b00b1ffd5cac6072cc10217b0e3203e3f61e1d9281c2d208af83a7f071ba78546e273271ac1cc01a320f35e845f10c59bb8c97e1627603e51a06e532ee716eb83519c80a4833c7ab45e6951137c0f731964ed2197b033e17bcb5237a1128179a85d24f730a6b31ea0e52075ae2198b48106ad0e1225701313af1a7b675347bc0ca48d88c4ff054edcb1092e87ccf070e10dc093bcc9bd400490250b7dca3775b715f218448caa01a8d8c8c6577cc9f21a7e3e6208b2c42215794954aac57712a3845523c74960b57a97e0c310cf7b8798192eb9507fe65020f706be129774f10794f2296abd13587a78456b083a164bf23c801969a57591062d22bab23b61e7dd5b31bd54520f4080a4c6c01c6603f4b4b1aabb99681be0b9c671f496f8cba2a571502e0da35ffa9bd2c77a5e66809e4d54000b851b2226e23c1072253826f374842da312ff0931b7a85e6186f5e6a31276a2d40a81fbe135e2c86c328b896f07c2269f983b313cd92578882a321f0031fcb9a9e7d618fd3d543e34abcdddb98d4c4585cbcb67789283c442f8c5cc914427fb1a53f3e35b78c2110ba956defa035084c53cc9b6fa7946e11840087e8194db6607246c7b314ce7644b8e522cf494a6333dbcc23da197cea95c318797ef0a18c84bafbe968df375fd0c9981757aa8c878658722bfc2684e012af3b30a067ac996315b0cfb13ec45220c9447ad4374c78484ac652921328214ca33466f6024abb7a78cbb528c44a339638eef09d3ee370d3a1746053629e7a37eb2600f2f73eb9d572030598042315b093c0082456fab06ca2a4c9bbd4c651bb297b494fe7e38d5c8aa3c7cbb6f1189d4a2c02de0acdd0e2c7ffa22e83c63623a21dc137c00e07193bd28264ec0fee2259ff2362ebd1c252103d93645e92e398f46935109bc0cb50c619424db0461823d33fd8d271727554a4c86a5113a17de7bd17b47cf04bced6cabfa7e926993b57a6c0a693e251e3b90b7b17195ff037fd867b87109a8be90403060cb34b32688c263eb00194391ef6c978db4c83c8967a735895a70b6dced06016b3737015696f1a1945110a44f022472c0ffbd049c0925ab1d68ef3f775308c2a95e99865c04b17b34d28a1254c433313c972a7f51a48696db9d7ab71d4600c0563b36437fac1ba6ab9ad6e89630357485dac1485e2808de8869ae59fc6a952890c69695424e3bb9f27aac2199301dc6b36503699f2504ac5e35adfe08048f9842df3260abc3d209a1311d65c048b58111bc7fbd6953d21b56364a51d9c2419072dece82b9d93aeb99c3f0a5a6c3f276504c3697a7c19563abd84068e8a39373c1375d848400c663c44e6c968c3c61fb375eed10baa60cf6158aa7e39c99e609a8b0765e36a2fbca515e4581a0207ac3fd5b3b7a95f193a08511109f335cd1dccc09223129da93aeab93ebf397bb073bd6374634675b6386caa33f71e04b1b420a2036979acf22835fcc511186441e1f5858402af78ba99673125ce9331b6686821ac739fe41467ec22736463ac4415db238bdb9a32e1895e0445aeef16b12e818f33a435afa91f850549ed465fc026163f988582040274638eada37dc162bb2d2839ca934bfa44acaec450ab4436ee78a5e658134bf80f914052be1a605e69ba87005f4042a25569c29243157865c5bed6918da360c4b824c7ebc8157870962737d150ac5583907c0c0f0603b1dceca45e10467ecc3a4435355af8254aac26f411a37b2587f40cc023c1c497664de5d705fbd0c103e36875b168c1c732ab364e1a4726c1d8207e1830d73721dfcb55557352a6508469eabccca2ca706c1de5fab0a7647d2cf7b05e117998173c5b3958d483491f128f01889fdf00d0b668a857479030f0c16bb753794719e4e142f0c5a1a52445de8862cbe3377c383deae1817b8110e045321a16594fa7c1d1037fbcd2208158c625514f3464237d7c73b0dcc605fba342cb6fbcbc71391577ac3781adb39d4b1c2236a4c9579810d039c10fe556dd954d71e705c6fc9389f3be0089697dd6703d8bb8ff08c88bf6773082a56378b52bfb30182c9ae1512ae1c2b9f99b4f3d0b20f8593bc530c585d737540972bcea60e11441e07a9c6827031363990b383b6f42afebf55e5f20635ba731fa86c24d6908aed77e3a57b2138c0c83a5bc98ebd3a002c0a9c6 +result: pass +ciphertext: b55c52a5e679423c1ffd045386899ee3fd7a9e783eef9e46f2725ffffba09835961521a6891a76ad591526e27db7bc973b07bb6b4e768ee4dd4c8b49acab0389c95044b6c2021cf943beafb912b0a492a01aeb90960f09fde6f69a55356624d7482cdb2a6c4faf3c89aee8c745754ffaf34f69f4cf5423e752aff68d305a2dab756a20a37ad209ea7f9b4cc5e5d493771977bd8276c79c77c1ac529c1ba0972a127e0abdc345923802b8aed0c1fe0d34064f43bc57fcb56a54c29079da57ceea37c877bf5d888233d2d45dcaf897d729ef94d8ace2be06efcb785660bc14971f5474440299341ee1690f11f683515b35f30ada4a6944c1d379c74af9dcd1439a780edfa81f1167304467c5e5442031fd6b8aea5533e605f4904cd118bf7572d1526e6c4a18fbebdb268b1c695441deb5568eb417ce16713bba343dde15ba464064bb4a8e8f76eb78aa8cb15a2c568568eadffbfbbc248575a4a80cb58282fa6a0dfa766f542f844c6f282d9f5ff882ef41e65b84f684a2cbf4abe8ada244dba1a65830c1abccabcdd19a99f3d9a722ee10d59426400f39b92c385498f4f4677502683bb6e9e38f3ef1f33f275ae2a24cecf14faf4052a5f560ccc887045c74213cbf118e373c093372ee148b6b94e30bd7fbe1ebfc61d9161982db6eaff4f4eada119599f7bf111537c9d98f81063c3f2d78e447d4a142d1fffd144dc998a1b72387c64458c6ad9f585212e5fdecd3728f2491bdef0de8ae60aaaca1a774ba8062ee5383f818c2223bef3c9fbb39e2754c809e2d914c899a331688eec1ce36968be0d21acaef4be75a3bf5e1f7365dbcdc0c9dc0c9730ea1e9fa79357572ad04a8d2cfdeeac940de6268e24566729d34f2f257af4b7ce48a43d218ffd4fcc3beef82a114e79289a601218e2872dd9c1467849c4f6c386322508ac137e56949eb6e9577d4e418a3033654e1dfb8d0bc196b3fd3220a8e34c02b988bb84ff0e6c2413168d9a018669b602994384e84f16b3f90fcc174a9ed7ea15d091df8f29bae868e27ded0badc967be3706b1c6ae24a903c4913bbec392cc0cbc8344465cd133d6c682b6580c8dc16c7f0c2c277462479f9fb94b0fc2ce36f210dfcacd4e14abea15652e5c1f2ad582e0ca1f769600c04411411c63aa8311b59a0436cefd61e500481dabd7675332c94d03c158e15d052a061ae9de4f5154ef3adf4198b42e503b2ccd6208686c3d927c616a6d788cb938d435c599cf1f6b7b228a87dd557ec583740292da0065ea653ff9e5e45e0b7a2bb289a4f679ee1ec537ebe5be7b416e08a42ef6f2ade5c7ab864eb60db71af24d1282b222c7579fd9a083af417fc075bfea4b2fdf9a8403c4f3646f3d2c7535f6852f7ba49ae0dbdcc0e06fd5f5d5333bc70f971f1b8f45894fef181e65da15232065e30d3d9595e70eb276c0e58814d7f4455d19ebe868731c2e5a9ffe2cc268234c7e23f3ef61d72998e15ef32e410fd4124edaf55b2e40eafcd21f48430d87208aa4d40809d0e89599c48d99b1b905271563a3e2028a1051892e588e94dfe0d32f232c4995c3a781c95954433e1a9603241ac0c2d100a1805e06165aaa36bb70eaeb6b78dd0b8294b88dd8f1a1499c7b088660cf0d2219486664602711de0eb49424b1e46ef3c494b7549b5fb77270708c825a40f3844495d4ad240f6265a969ffeee75c2102ea4825244e547d4ce847a13d88b59229c4347e35bd35b0a22628ce51144f88913ddc94922cd930721b2091760c5e15886be1ddfd8fc7444dc8c16eda51fff288b2ba3fd37554672e953c38c96e4573e38a712fbb903e3d9193f7d89d8ad54c3d2d1556a664b7d49554161d98aa662bb78d71c147732b3e9d74b541ca4d5b7c8b383f2488168f5e3604c51a01e3684ff2257300013f50c88c9b7bdfbe1fd4ca5e2719e12db0b0a9a0798e74ce0a383853ca52ae166c719af930acaa48a7829267ff1f5b6954e6af6a6e7fafd23c9196e916ecc150d88093d1a495ec33b3b369471a0fce99178489e0e6bda2dc3ba9f73ac4ceda0981a92ba7895fe42fb85c0e8ff2dc822d8ee4dfb1766243323e158ddccf4d44c7e4fe3c1fb4429e28d14d6645ef477d5af242cd0e352e10dc9309172b82d4debe3331ae1e384c61b5972766a1c53d903b55085bed136096e573a56b8b349f88f3498d47046c7dffe1847a8aefcd1aa6bccded545 +shared_secret: 2c9aa133dc5aa592b7c73f23ddcb85faed4c69d249363f9cd7fdfadc7329ff86 + +# Official test vector 29, seed: "265eb2de7099e4bd5614e5de7f0c2a05c78ef3e8e2dd4ae4cb70f3e5e59c8d1d88248303f07de0c5508652da66b47222" +entropy: 9eca0fe36c80fc5eba171c3ae66a5b1c923faa50b4521bb055e7bf51005c93df +public_key = 0dc34b0fc991bea47b02a8cae2f81a10043ec8d655124b3ed56505296c5aa2227ce2ac04a0a31ca05575b2e55c01119d6588cfb529aa54e707155bb4f9a63966d9566bb65a95287591f715e6bc0d7fd1691129999552b1771b35a322c5145c7a40d79d6d9c3eadf941112c4f76d678cb0aab59b9a30bbb340e078bc2899951691f9bf84189a87f2af590f881027a489ea1bb89e3a8b65959ad503a5e051c5f398a654c708f9ea51bf75c6bfc25634145076a93aa6e6640e6b47158ecaeb621c606c065972c9f26a34736067161e6bd49fa2871631aee5b518ddab90f692929d5a7a6e76582e53dcd36acecb6a76dd9455358ba95eb8a70d3786c01960b367e15536b456408e4faccaaa139c8e9737ad6b8b0e380bbac446c73b7b388b319dc2047fb7338072a0f225b506253afa722c812419e9c739c90beed97ba8f684111900e7d1762a5c0903c390786e1445b615a1e054efb7b0b1daaab671a63cae7b55c8b6f13f10d55707650ea8d864c7e5217b572643e6c7480411489c9ab18400483a657185990bab58b6a734596a6123dfe5240b2f908fc8c3591490f89875e0ad3b06f6812ea973e6fb0a69886199b3b55b7d26a55501b43609b3d6a3981cab946049c10b5737daccfb2040e014a5f715b4c1f8b0406b3a3204602182450d10b019b388bfe31b5a5a9794b5863bcb34cf6f659b25cc95f0a42fa9305a0d647342845d5b28ff5c1727975bb48c5ad2c96b97ddc3bd4f0b40e9b6fe1138739f1a9ca3b969cf33ccb700fa9fba93ef565a8aa180cc3711974bda14ab85e3817ef4801c0c3b3f68403bc94cc7412ad044a220750b6ca963e3e052f310bb1474623f707157c8a7d67f95989492278ca5707ea6d106431fa5a3b88c39e3e360bc0288925932d44a2523b0980a221519ceaa65353a7483b7de6028744a2869bbc869a58bed2327b3c6a4aa7447a9a09bbbaf322d5914dc9d5a1ef8aac92b920524c6968289d7da06db2561eeea26fb764168c185ec20ccf2b57a89f2887720809e94c377b313cd5ebb7f71037bbf01bf85b675432b891850316f6b938231793aa3aab2972e979c7aa258735858434b6386cf0c5a9232f60a70624b4cbe9f10fc9e3a0d7605bcaa23ab49a222f66127a1a4b9f2bada03c8dcf330e1dd90131852b71cbcfcee91f528377d200433dc898c2118f7b6275f4e0b9a97028e759ae0c77477cfc26a1398cade7671ab89344140f5c3662c736107205a2cea71c3612c4eb063cac777b9d6b61cc0419fcab4908ac161674c6b4c58c53a5065c637d0a4c964e29729667aa949c39ea0797b6882951314354ac28d52c2096049df866bd028b1ac3b47cd2e648eb322134522ab2993db33491326a625e8739672551562b2829ca57ae6518dd4553146281fa57aa373412f22c2d0cd02b6141ba29f31612447deefbaf8f974aea75140db2b85de409db834c283440e377147b2b8204f09da14028f1960fd7c6b29ec1bdab0098ea22669d7123d36a52dcd634a447209bdccea731b47719745597955d3372cc533cc9b59712e770d7cbb63cf114cc02ac9933ab248617b9b284a8763a8856afea63c442ba7407905c6db13dde25a24062b7db428958e2b72117652535c1c24226266bcc7e87a721181ced66cd9dd1c8d86a1c28d0c335b66eaf7422c1bbb3a7dbc7f2a81c7a477a35717a23b486f307c766f1291be3afe8408026352d28a826a7e57819390f3341bfb8e258640213bb06b8aed87eb78b216971060b590f16d05d83801404ebc63b7304a0880062b4c1e235655b43c2b6062c28d4064a1a861a9844544776e8eaadc0ca66b2cbbb691460382b586e77856b8085a1d6795f82be8185c62ed79b2bb8a3ebf57150145892f99a27ec8d1701265cd16b5f5293955400a44192b0e47f399a0bbb9027f9d3aa1f5407465b8b28e2a87ab881be300fb72047f61a53b1282c13b65ec31045b1e0b779580017e1776e46a5018598799296f49c1447370af1227a7c000e327b40ed2965ebfc7a555803d4d34176e14bd6f9905c5c4e253062c1110dce0c22e74779f07846a6806eaf340bec965dcbcb1a2c40a5e6428d2bfb50ceab3a64cba6aed667edac0cbf03ccd8d8a56d73c70b122628f90e4c760ea21c485a0536f6f1632f900e1cb13208f442501c6cfd05027f5fae41abece025084a5e4598a766114b13b17dd16a4c99f255 +result: pass +ciphertext: 3a8bca083a1f082d72c5c05b6d3ec147cd1646564b8aa4915a4c5adee11141d3ec19deba2de14e8df899b62d842619a1e89b9bdbce4f556331143aa99fd8b244e439ece01179bb5dcc22d9b7296dbfa90225c218b7e37873a8df58578667ab8795e20e508b268f0075596d1586c8cf5ae079e6844c6bb0ba6e4335638894dbcb1a657cc96e432f04679709c508a05a6e4136cd79a1964385dc8effd835d7ebc71bc3f2e0d6ce09fbd2b9284c9d9126639e86d37139c974b7679b20b06a65a9f45b29c9d4cb88b42b8d0c3800b3589e5e3f6ecc43adea2a56d38ae6d4c5bb4398bfb3b67dc818c37baec8a888e57dfdeeb6675a9be7c99942337e3ef419e5beba7043689fc2e41d422faecef51107a624488ab2ea49eaf7b95aa1a526cea835fe8b6fffd2ce1c8eefc6297dd5ff418f925dae3a5dcbcf2fe937a97f9c07bcafacae582aac5fc3a1cbe041de2c8acb8f3d87ae31c678bdbc6e9d7473a0983d45f5096d45c803c0bea4686879c7b7fce5219748128b8af367b44a7d6aa7a9b7d1c3bbd6d677118e35f5cf69a9440253e494473cb86fbc1944874e8b358d8b1a92cf45fd0ca86cdbfbdcd4991915ab0b4985f96ee49e0771a6683cf301982f9ac9d8131b7d36ff527c5df10d2afce8bcde6a469db425d6c10dd08ffdf12e179a1d58a5e8ebec1176a70e614f06db5d1aaa93dce14257736b0d92689a1c7ed2c5614246c7a37db2013ecfa6dc94e8c43ffb382333d16c79d07100fd92bf0c7fd63ddaede55b4bff6f3130b5132ab6aecd2a8e25201496cfd7049eb3cf4b8fbcb4039666d5f1d7847e8e73bd5399567aee06035e4836a437fdc515a05101e0ac7caf2651a2ba2945f9128f5e979d05272701658d12dcd6d6351b235952237c541f0af1c35abffdb0b67d209375f4b0cd58f777ad29c42475c270514d4964bf2405b4a180b0ab400de1187bd5fd0b778273f3e87b5f43e72f3a916191446380133adfbdbc2a2befc11c787f8527f46f14880a9def0ac05583cd2fe0b44a67a1934698f3e10e63cff7e5b6ef1b2e380de905a29d237b1a5788a46fca785193f45f079b0f2288b860a606d332356fc758f6df5ff6b8f4e538bac5f04cf93b00834c9c96598994387ac9bac71b739a292173b974e1d96875985f3a74bd1fb65a60fe5f8d7c5a087f5e6b39c479ccc072d64b39c5d1b18cc909022edd5ad5407a588522fe019b5be8cb7e56071c5a4a510dde41a35916600714ba8a69487181da0b4af43f36ee3cd5a682cfef1b2872ffdeca351d3e126962737c8d8ea2e86a1ef248d5b95c39a58bf5d1b76d202010ae0a52965bf40e08120b7193de091996e0e1c51bbb6a66e4cb3cf6141b44afd07ebab50102dd90bda6f21674cb3a86069b1a3452c044279dab24c94fddc7e8a4e98718310bae45ed518d401e3e1b3aa76152103ef76329c949a0d51442f9214b1c09f8cc4180d877681f1ec8e7a0c6bc2ee9bd3365708937399bfc146482d0b78b445b74ed602cef450cf90f20e9890d4aa801cf451bbbe19211b3d8446ca5a1787d4e1c693eba82c51f62d85771d246cb1a4179084f6131aaa733016ee58bf9e0c71cdb00a8620dad38edd3be398ce030486cc504449b7ccc7c7ac70bd0eb60fa76d1ff7e4ec85902a70f10b3db794f432c95bc67cee8fb083d538c72c265e5c7eba29a14e79dee53a821de768d864fcce7ba524ceb3e85f66ae20fe7ac3e648b46b1c9cf5a1b1cb60dd9ec67eb9bc4e4ba8f30e08859a41240a0ffa0daa3ab1418f153afd8aed9b17f5a8eaee948b75b882d83719421ae259935a464c77189c808766a809522fff78fd92caed13670374e5933ad1a61b59de2b0ba82c6bb33b165ab6564cdb964ace0f5f8e3b4a42b5a463645581b3993bbb95847b2f92ebd01af96de01cf007cb0341d943f74af023f133fbe5c95eb885e9eaf06c71b468beff1de1c89a703b88d128308db5c9b717a190373d68774bb6351a108a3b2f29c2d168cfc11d62efa411efbd1ac8a93d85abc683b443f21a19b9bc3a1ccd94447e926e969503b239f73e5904635674e60dec54358e61b39780c00ab5341c6deaec0d21f4a785986298b5828951905a44d05affa48dc11d928dfcaf7364b8075e52127b5f89406b4e138537878fb81c8b04486e0f6f86d350d796e94263709390ac0566a9b5f666a7b4e0222ecfa3ef4afb50e7d420987 +shared_secret: cedbcc4a7eb422e8a50f22ff47da0bd8b6f2337cb2aea98fcd80288c14da7d92 + +# Official test vector 30, seed: "806bbd111f27c2668318387bd0830f65ec21a51af01985ef48d03d64e1958ff7ee5133a4ebf6dbf36329bcaaf65f40ea" +entropy: 0c5719261caab51ae66b8c32e21c34e6d86ee4aa127d1b0195663c066497b2e9 +public_key = ad4330bdc85f4699cccd373de5d7266e5530a73a42d10c9b327a57715539eb99030873689f47bf6871a00c6caa06e4b04a832c865b69293303cf838ac186b453d77088895db36163b1074a8e045911fa92db578cad284642bcbb44f844c6663f3f4c98cc8acfa1a96b6df57f5be10fc76477d306245670b2c796672331076f74480c2627a3a44421a01229509752a536e95ba97e85aebb920b4b1b1bc55bcb95fc76ed43b9805236cdb62861fba353f08409c91126661580123509c05208c8604389b2dd3b0f8fc94f432b41632c4ae1ca0bdac54ceabbcb743362725b839dc18add4b7795a025261139539641aa43a9c185621d13c33c579189244c884c047bab4187577c97639ca4abc631eba5e9b141e11b6aa8d562449c3ccd8757503a7ab358a24d2b36f2e1768fb24727801123354b6dc661f640883e0613c8886121b89336202eddc464204b1dc16b9fcd3906bb9a6cf8d6a176a43aa1b13200d67ad0e21f2f73186164a6fab968ea0427c82501c59c49488846489710d7976a5c812f78b5b7df2aaa6437054b0a03180c4a886b7d653149e8497b18b18e98e72f9815be90d252a4583f2de88c0d7bb10cea4d65ac1f59683db4ca4969a9b57ba65e06908f7e9267adc8c87e8b8d8d5651b234bc9ee1c65fe42a51368a041253e982100c25955bc39b70b36c67484f8df88c2066cd2a5339c471b60a1b81acc5922e274cea4a071eb71e788241ad1b7c41db1e972212e27c770e6720a7e67de941a1ca952bdbbc591ef78019c67dd184259bc873f045607d1440bee46f199a7d2274b4e40062c064368bf5c6d50046a198c89e1372950b7710b3b6376caa9bc32882a6b0aa9b7fae86cccad0574cd8b417047d30d41bfba0119b909142363d307a006265a3961c9c604a7b65384a5deb1c61f25f66fb3b7640b5c3e22b8ed488f08201a10c3b5a42b043965d4fba6f31b90c5a8a1d8b29a01d500be93225ab6acf77960afd2824f2283ce86288cb1a9b98c11b03dbbb0e0854731b22464331f6dc70e7e1771471236b5b26ce131649e77d46e7946b85593b2989bab4ce5d09ab8d745a64d53401bc0ca4855e54b20ca4811ae5d9192de398d9d65dd3a327499cc0ccaa9f9b2b547c5b53722b50b21c7bd2c3c7f67a15be8371e9d4583faabf2467a4d5365cf7d92b8de8a55de200b61185b89c83bdf817adcb67fc775a5bb19f1aa453b491cf1bfa8d51d0cc499331de7730877a2db14778052cba5d759e21a8cea550724f52bf25c2a31d7b117a4377f7a461ff92882e11a4a8c137ee5a4b7aa67f712838737a96faea898141a1b5165761401adbb650bbea1698267d324a3cb1d9933be8bc95d55aadc4a814f201ebf724fa024763563e2656b028053cbd16b32c20457349702702c4b453a277b318551c8b732378e3d7bc31a10b5ed975ab032fbff647c6340c2d5c91f68c1addb447fff01dfd4c0c9d925111948f001880b36588df16cd1b9bbe85973ce513662267214660340262273fb45f97f65da4e615dca4a6aa06c5e9ba0ff727775c84608611827c98c8b7717daa60004d2212dc28b4392a6e0333a77cb9400978b60a00a766f6264486c60af452fe92452156961f2467d013072f1c4cfbe08ea7885a74d0649517178412a1ac63261981adb7708dedc89b64e67dc2a8b25d98cb1ad74289372e48fabe360495b4a7472f3c8b7f877280ebcc6019648ef960ca23a1c49b684f947460e96f0e941408fa026c127900d84665768db52a8ec05696725b3dd82498226030b7189c9ae1c612e9a2c65c86c29426caf686d5b00ea0557466a1b04f8485a457bb83dc68c4b1cb01e7831e476453f084434151fc0c9ea3b7081ee00b4665048bcb8fab778eadf90c25f54d8f452381e252b2382d04028378e7cc7b3973cfb776249857cc611af8f91db8d5b9f5d90212b27d5fc9a794d53e3e002089a05a421a540b36aac5c803c8f5cd71012f176ca57a7a439db90bdc71ac65f0470d54188927bf3d2640e5a3a45d9021f876562fa7c6c2b37be9261393861c5f0336a47ac373e6874ec53fc9f90d856807675858ba1291c7134c4b8432f9782cf6855ae9d49226055d9c4b2f23c0238f20b516d6600fa72d8a5c2d06e1613dbb7fcdf9817cc299ef2614b6085517cca4006876de51659c317c7c9d15b2dfa3cfd29db64b6dee0f6e53b6bcee0ac31c086db16d +result: pass +ciphertext: cef4be98dc83da0b9570bccb0cd85d237536d29da6544e77e0ea894fb5a777f7966ce27f9baa0c2d13b2559906edd041641ef91758e5e33c09c0aa3657892b63b7450243e4c07d4ed5bead3239f6c3ed3c59fe3d302b1fa9360851a7f6057f3275899d48db6b713a9b221fea8f1830b45c2fdf9f08cc8a5bb390c9b31497bd35e6c659739eece6306ecd8d77610b2ebd9258f68de04671fcfb85199eb7c5593369fff6828c0412b666e9b969adbbb494702001ac8de879533cc2727260b7664edda4f06fecd7f775b9d4dfded03c9c3c309f16f91011d6240bf0f81eda6850f88e96ca462bc0c836e08408159f911f41b47a83cd8271bcabaf5111eaf3cbd36b5f7c6e61293fc1cb5a021f1438488f220b0bfd439c0b53d814a085ab07b8a1a751a9880dae73b97c5b45091ff63d1504298c7a0ca59f394f1d7a2064163cf8b4d59b432fee9c73492daadc5a3a9a6b132686b75db0805eb7745adbaf38d12637693a85cdc77fab26a48f39837d84a6be8734d28ebb50ad913f5ccd177ba3b632a0122345c1601c4582a0718254be614c8b619660a92ed1caf7f9b79fa0f0b2f1eea8c06962fa85d2d3699ba1e2cbeecaae9921754deac38225c9bfb23ddd4dba78a327638e1ca00697a4b93786f01b979c169a3509104fcb58ca1d7941f803263c2ae446b75081ac4df6c154b811ac394f87cecb719b6180772f9253e32f82dbe7ba2e5c4f1c8a8c5ac37075c3a129bf96cde8dc9834153ee49d17414826f4a4904b19f97f9f592ea2bdbebe51d72e112d600b795b788b1f742188c38a72d3e0d7e8f1a80bac86c56a8a6101bc3653fc22959580e543b0cd9eca89e077d9b1331e3d5aa096bdc2921fc5bba044e5f96c60d4088b54e5904ef842d8d160980b3bd11309ede2bce224cda218bb65a64bf5ec0f1fc6d4a5ebf01a01483ec968dddb1c1f56ac906853c69f90f9a5ed66bd13c13c0d5c8e74e39f6a3b7808a67d01b9edba03b391c8912ced938ebe7bc9c97f82a3efed9b5dd12dd83f92bb7a20e5f3d15b0341ac07fa3234b33dabfeb62bd399fc5921aee054dac42883990d7a6fb7e470ca11933ad82491983c119b86c35868276bf804ff5b39b1af66467a3f5ee835078ba96f2666acc015d9facb8153b3fea916985fa36b050bd3eb5f2b903768c390bbb917a85d14216c98f9a050d057dc4dccaf665b94a1d3a899474fff52cce5376b163c19c07cfd8046787f2714a14343b18b5bdb49c06e76d945418525cb46520a29d7c62421b81cb57188b4ce22e2402380e494a03744d2c6a4398e358efcf0ff62ac6d9479909be5e41f2a6e649835858168221f6ed1a857e3deb195a6e68917d8eb3e945f294ac6555facc46c558ef6260820575c3de0d896f53b9e864f76eea4cf2ad6243d9e4369ef7f22aecb1b349c342e428548f29e58e0096da1579c0f2d200fbfd205c4daa7d0420bd3a4b0dc7d5e6c9cae7ba37a7065705a213d4bb070e291158fa6a3b67bab4574a712e1aa9806a315b1b7c559385181ac322855d30c3c1aeac5b34be0f6b6a0a5d9ba07c02da1ed4eb279ca6ecbfe015869ce6faa62d32d32ffb190d9b3cf96c7ede8423bf33f3b124b2f9a2fc8990030fd1c5a3334d3feeb134c2b8b65b5f515f1d668be68753d5b980e4d37b20d14533c98974529bddd2198a1856f0c7555c1624942147946ea61dd511537a78b401970e493c9927a14f2f5dc26b397f3e0b28340693d95378c67af4fd4f04cc1fde17f01ac79a15c3da1bcd842e5f610cdc807970357c56e3d6eb66556054dcd8844323dcefa4281ede5e0657977ad4f277e3b72a326f7d9c448137e3b7c6bfb841116584f85b6b8970cc911829ab38719a0418490690344ae98e62d114965d8a9d154bc0c6b49ca0826b4909dd9c3c56348e34581b93570c7533e0dde9c0c5c5c28f4497c2d399151438b241af777b0a04e9317c48971e8e2a22c83e25b9ff9a170010b6487170ffa8d03e7cd1115caccce2fd41ccf6f44c1b25fb4ee4e105aa4e9c3418e6d998f8f738df1ae86372b0a383cd63c24971df937945646d4207a7b6042df82653450095d62154e115d13bf7992aec6e52cc20a9f430a0356436531ff985761467b8dbca0dbd15ed5760ef24c37d74c90a998ee3ae7c748d703411519b7004f38fcc48ad35cbe2f8218249c845d3a04a3b4f345421003200718c59a5c2a +shared_secret: cd0a41e85f2afaabcd7f00c2a9be9bacc6d6f79e0ae6b7ef64de31dcdfa02b91 + +# Official test vector 31, seed: "ad540a9ce816d6fb1661e5483c44f6fdd00c9e7bd1a8ceda4b4c4d3697d4f78ed0a56954996ccb7da96ecb8f5cb15809" +entropy: 0e59f6f9047c784c1f00b24454aa4f1bd32c92ae7e626549972f86fab90e7e89 +public_key = 2bf6a6fce45eb9d6a03f11858433994e304b2d379c43d4670be6c9d65a61e50c34ed26c67e716933cc5d9ea22d14f86e5cc54967ccc82e3506efb8cdf40c31f313135b597b3aa72fe83b01ec88a97e32464733107294270f82216e11688df6cefc2a9332243eb75059fcecad20a681aaa17402fb36c6e091728ab92efa891d141c251895f4c79fe2db4b2253114be24d22a38b9d14532ff80e384778c8b99a4303506d08303bab91d6e05c68a0c0affb5dea7344ef5ab21a559cdfbc3be395834b4b8d8d9c4af6a9ca37a34fbf05669f99af8bdb3237c98f98802ad76a26eb353c6612674e8b4f93a190f293c80da025da00aec20265cba37b0df43d78982e6ff49a9f464e7ff57680e7455f816f815c733bec25e4227ca3257336005d0559b647585379542eeaa8282d8a90b7a885b0360c4c9428951820d189b873e246e4d793fa94c0211630f54510f7f06d116acfa35c856f87913bf61cbdeb0554589dae65a2e25341e4b93916aa4b738714526653e798c11f24563b2200319c60343869579b74f2ba9ddb03c6f3479a0ef3a5e5f80183d69034968e25892c28c272dc501466621bc091c0fcfa09a2b56c9f8cca6cda208a523ea6a40a4907c1f390780d4a04624466206594ccdb1b19d2b9cc407bd172428316692e09229fc963710165970471e1b554f322c1548a118f84169dd9731bc8c49d1b0130287024c391ca027065591fd9755ffc2a68d36b7dcdac3a54e0ce67e432e35695a3987b1d4a1e5ea32934c1cbefac253da2ba9714ab6a4a46a07950b6477c303067e0e673fc6cc800a26fcfb59a01e397f944335eec26002889b08a26338947dcca758eac669929bb4c608f9861812e06aa61f5b8b56299efe95109d57c42c066ead511bd868c2b107522043da8356f617c26f7082b078234b435c478d48a53d5a369f7907ce2be8370c0ba7347707b7ffdb25e6bab2fa85b5922e0bba7269fb7a9799a158f9806bc3589268d8514134aab1dc83d415a235ef49586133de1ba59b8fa1ef5493cf9dacbeee04f4b9a94b3daae423575682311bc70c49e65090a87137cb327419a2f2d5481d6b10044c6a551eb711bfa828a3cbf22e026d2345dca2415b6d9b03e9479faf589ea02a12d1c03939935e8b225d7c18534a2cef060456bb58145337e81f7346e057bbb98a8c0a312f784351dcb11a1fca7984a2443b409ba903c3024b8da9a8b6aabca90b74a34b532bf01c7c1c1c7ce05bf08c5c65164a01f64c86797317dc03b2d69c263390f9e411df4f4508d7b03c7b473a7e195e8338cae5b89b85465779029c0ac711653b1c7a24bb3b9bff0c612887c12a39c2f5bb2920313cf3522396eb79065bb1e854a8956f7ac2143abb4136b0682bd01275506a765175c4b7648a0dbb875e2864d52aab697533512164be2659c57151c4af898d689a8619726406110faa69f61320e75d3a05cc27febf609e52026c10c01c30118ee3693a7293f4f7cc4d9f84ec37c5f38890a6a58afce1855d4d0ce1f0a577790423115c59228b96bd62d68d90f4bfac9f17a7597a492e5711b65d8626e568f0150a458201c6205a81fe74a591b547be842765723b57503c3b352478b304c39b22b147bf6b5bc489c2dccd44c9f206b7cf58fb3faa3c8891524faaa88479b0c4051deb63eab53822f84935566ab7978c1b9e5cc043767c109bb4663960a534a750cae177aa33315584138138d52648aaa5cefb09f5cd58d008d4c69a1c85a242dd63a997385b529a288758c427ba15b05642c230c8a0180938606c6e1465166f128a35ca3855657ac1b3677a0a15d094ec68caaf90cc1958ba0dbc22169f3853f3b7d56f4bde7bb2c1c71c8c4c95299d95873f89a17a4583bb9198e0279a45691a3107ba1294726a385ed95163f0bc3c609c01ee201c5900eb763518f212f14723314715e7bc84b75a611c481cdf858350de0495d1c020228b004624900c300cd018166fb4dd217cda3c792da49a87a3bcac52542f3b3243f689ce69c1946a134a97061c83134ac52c92d97a458b7b38dfb7f42476b6c5c272c71065e5159121484d4a541311c97fca3488d13b1de64610483cb3a9551cf4a3317d0c76766c777e526595539ad17bb6c184aff73b6c4eaccd5a14ed1b1b836975deeeb8909458146938505dba5dad77c1a3acdab128b36dc1e94a121c545e3515ed56687f8911eb5e172 +result: pass +ciphertext: 3a385d4faa2e13cc995be625819127959a2cdbf5030edfa42c129bf7efa22ecf8b2c50d0b2e6e7c3bbec34b609ddea036ede43e34ffc35a98661a78c3f29d07aaed7df7d8a04e53f2484d1c63b14644e134704dfd643e9f87a1a60e0a95591a6897f38924ae27812d9ea3baa5926a657dff1a5f2202e781270f8d37fa747c9b2f71767f265a86b3e9816d0545cff49ea6b0aa9297921637dd928ae528c90124b0d5786d6b0e77b1bb6f49fd8e0799b98bcdf6d39efed155c8b29ecc32547327ef733d644ae279b4ceda0ed406fa5a55f9cae0f5c97dc0bb12b112a4d2b4b24cf7d78ee1a2aee6aaf10c4c311278bf521b3431d9177be5c6bb414074870c56adb807331b640dcbf15d1f0e28beb419da866eee0581f25aa8567fc28dc7d8477cdff4fe27561519df585073a47e544708d80735e086c6f9cfce4531a5123d1b8071f34168349e4d35f7cbd235b92e9ee34bcf0e1f056dae77af055975f97f9a5a8880cdca6b1eb79407187f6954ad5c06fd5cad5ee2a5e4de17ae0d9a58a614a3dae0ba03bcf8990e47b548d94023a436d3066c34527af538aa01f62e8581c8f824b9c25e495f565fbaa7c11823f2f6b25b672a742626ec8f044814fec20afd555156ff2c16f1205cc4c5f0076db3f8f6a0b4c814371e96311c43c2e6fc3aa811d5bae3898d7497199c8ec0060546cd6facfb27138da4acad7129917d4affb94456c6e4842725b78b410b6b56a53b27f54792dcbbb9f32d7607e071f09e105fcdb8861bf5e452810f2917c73fddfcc8776cee79fd7a8711af303bd892d00d9b757a252c3c53dac6fc7223f6d480a277c38d6d836542761912a1181e9043ce70025ec14c79d01ca72f93d12a19a50a8021033ede24a361e3e152f97e9313fc3812a0787d61705365dfb3c115eff71154d1145bfbbf1185558aecba14e669b9a354d2fc9302904b13a69d1068465b3f969338bb7e5f9f819959eb1e779f04dca99f7a92cebbc668c5e8cc416d077ff12f4524e959cad611a8c175e4e9757a9ef9c42886c6851bd684e6bdf4e94d82e7b3c909b108174b8d0b1042a41028ca149caa29763ec56f2964fb3cf6bc4d8e3563a4ad320aab53c80aa41307e9942b45ec8dc17758750bc60d413806f65cf5a5ae12ba8f839eb8d4768c1fd86e64f1f11c5160b0cdc3ebebd8a4dfd19b8bf4f0325c2d23970fd25f1b6829d648a86bd035649a2b2084f26cc08506a7fe12f57628524d01d84be8b73f7bf6c8d030a617bad843866a430060b325b0cc5092fd6e98e5df5bffabda29bebd91c4bf1535275652cd7a7394ddfd0fe3ad8053a3db3dc4e820a77dcd81e71a7081d21563894234cb2f8759e1b239350bb9b2eddfafa555571b642780c8671587b86b64185ca9c3107e3beec412ed6029ab679903e356d449e4e8832b651318b7e6367462c0297a31159e9d1c0d2278280bb92a65ff6c946f6991dc73cf60fea144c6fa1026708ad9477831a2766db8bc80b1607bbd4193d7901e1a824785bc435fd8915d2d55c4397c2e0b6a9bab6f9665b27253e492b44fb96f604c16b3ef21da9d9c33c80e1b8e2fc11c53c37d7f465c44de890fb65a7194b8d1f348f3fa35a0df294ec9fe1639ef96c33633ebebb44c5e92b27d199d9a0a339ca893e3073b48e92813db2c7e572e0f5f52c1b5971d4ceae3a81cd420e2750e58b16f7b0914c2ee61cb239e1af94820a9a96c794170fd1397e04093792241d81f3df0827b8369277a1a139d723c5529bebcfd40a9d168dbbe9613fe08b28a8e98c317a6bb1392aa39e0203e1f7de6ef6181f96ec520b518375a362344b9e08a43c374cd2638e52a0c1dda322dc46b3bc9c1120d18793f96f0e911102312f6e2bf0b56cc3c6ab6aaa8c3bf7f61be3b1f9e410e540de3b0084f35ef7f8ce7426ed3713687bfe53172e7e7e80a409774fa1578bb6cdfe9499acdf29e0af32117bbaa40f7134d25c23bfa322b0279e1ec6632730d9768f27da21ff481f777a633a042c223505c263bbe5787388ae3cbd95ce29ea5ca08181383fcf77aa8ff293039670cca4a64afb79c786cd122dbdf960cd3b81b862a7473d72342b8f8d8c46d6b604245d48805640dcb423a417e619ec3ee38f4bc557a4c700f4e5df3a685ede647c90427724265e2473fde973b3cd3c0a2f79659ab360f3a051050ded822bd8ed4edc218a893cdbe10572745a93a6 +shared_secret: 1537e848472d0efdb11567f6ae943c8d16d37f91285fa7f77bf589ecc5e33d10 + +# Official test vector 32, seed: "288a5f2684d862a86d2790afddddbac6fda934ee7d2e6da1508bb550838609e8107312b28e00a6c01706374ccd3aefa7" +entropy: a3963ade17d69debbc358dda82c7bebe2c39d25b36813058e7a161542e3f8c2b +public_key = 26c68b1ba4659966cc95d79851f03e029a736c3b4809f9c366093967c53769b4796ee76b4f1277f1407b8c478fc1400de6415c2a231727303c86110af4b743aa85b73e38b41b819021b07d1ed5c6c171077e9c9b6a678d67b94958c66921e9cf0f573585bc3b47323f32979b91c411c9133b3b8b03199179c6f457f106be4201bcf2d142a4814c5e166c17680fdb2a1296890a89c802120585951a9051fccc4c42001346c9add97f93191c720466f95c5590b0cb8046a470cb50a3716a063135ea4a0219217b4d373efac8625ef44e5c0761bc0404f4ab87bd8abb068c07da5c832de7530be88532fbb5d8eb5c6023a5f0db1aee3a50d2864601a579e6dab597d6cd29208c48f075d42c6b27aa3c3cd837e224bdef354e20168c03172a16973224d50cc0ac7f60fc9b0afc7f399c29a9509f9bc3abe7298303db253dc04a69bc873e874a43dc28fba6339e4152e4399a3ef1055bd81099b33a5087b816ccc668a75bed05650d37966d058d6ebb2b3a819218036c2ba064ebac797c671ead151c121ab88f6c9395204e714310a8293c64bc9789864f93569ca043b856c8412ad985d8206b6e7485f1956d7e616104f720e76459bbb0c874e45479e67233137875c82dc6509cc124bc184a3dbec02cbb08b989103fb59c378670be58f0a96a694d71062e6af424b6745fd9130beac38d297a5f1ac783ef064084b84aa06ac9c2680e8db2487cf43bbe6b8574311a4bd99d733a1b6a751f68401938f4091d25837120664033770d476096e561a1b03e8cc878480a015225cdc1d0719be196b4aa94074c290590988e9b4a4ebbb4b3e5477483cfa6860219237924641cf9a2a7a1219a8a87bde9d08166f0c3081297eda4737d082ac5617cc7c36d428b9dbb7237c122676ce932fd01aac625b5db503a8042c0112714eb43370b5b5bb0d53378a5b6f738c874dc7a7f1c15987c28112857a4bb4310788375d9aa0e60c59958c7f0db809f688f7640805c334e9b1aaf78761d5107c12618b81ba12a1258c4b0123eeb570ccd9924084b7ae3473eccb429ae0c7fc059926f25542911a8738b0186c404f2f107716b5d2e228f91306e3bda12a9b281a598c52228330ef93962d085adeb6beb1076969844e1980295964f9f115840753c15674c86119909d111719182f880ad9ee9792bdc128a8c4df1da9b3cd43301037b192abdc694099bab87441113c77a7f7210764cfb463a96c4007108d4537f29d4859d305987930fd4d94c796cbd55452d10e9b8723a6165ccca8dd39741e94418812291facdcdb453529960d850a40745a022643cd1cb70ec330a6e190ed04963ee28cc774198914b5bfd7c43c6614007d49dda88c1d8b42e05a388f4db09ff1a394b01547155c79ff4933a28568e172133515eafab53b86a078a1a62b114b9977465342a61ada1a20c236d3778250eba35f8d36ac0d58c91198d4974610181bea1cca0724061976a7aaf161afa1b111f0b0e5b835ace9ac1fda361048a9b0008096b41bf7c619af3299c5abb04499c272211931f7b6528c17d5f52405097afe5e0c6ed2aa2cca7915fcc2543b4c8268256cf49936a858f7401117b80b18b081e08b45a0e828bf830c13fdc55fb468d99e8107b93616da437b90a5b52896330c53cf3e28bd3799f65f28bd5f0406638c18c8c9838c555a9b015dc99a61ac330fb11654831571fe667f208689d1c045517af836abaae37184ec603d01a918733362942632644b9b3826ed0967e6db05a6e3ca77cc1604174a2aab6ce72fb1eaa31480e235be79c1c25832ccef512e6c65261f2c485cbccf4062a81912abdbbb3c98c5a6912388a236161e7b8283965536908c0145bdc170bec33c5b2e437628b452aaba7f3ebc8fa730147469d63eb8294fc3cc9096781e58d0ba64d6dd6837812b530e9077a5c5648aa6cc024069150c5acf26d3cfa2d658ab18b86b1eeac4ae2422d41704b9982c8db14bc53e0721123a209d67999c9035ea07f3485ac50e35f85379396c620ddf159c3a4cd57fab15b53c8f2e6aee06c6f2ca02f0d99543368ab70b9bc3f655830d7cb47962d7c3789ddc893ab0a1ba3e1170590249a594445135aaf71a902d9aedd178d88d980345190d72b710ba08077fc868e86713be6bb45652a26c73ca91089040322801b9c68de70662248670f323f4233c1a3c0937dc86f0b6476d12f426868be1b +result: pass +ciphertext: 99ce600c4a66fb31f655570dca9daa4ad7c548a6617019fe7929426b3b0b0782c46bb60a9a618a41dc2adb77334e9e20b6fff08f9658767c818b415399c26a69d110f8a36406e1b9e4f18e79dbe98ef3c5be1c71bb9583e94a4bae18e786d892bec54bfecaf15d4ec112d034658d27ffe26cd690e5665ec07504934029eee4314f49ccd9c73747c089ca0744b2c43298a17ed480859ea7f3ce9ba577c3da53c84deb0d34d78b5581e76321b895697704dce1e36f30b3686b32cdb20c8f865b7788cb93459913bb3a623904e51a106785dbad7471e269c333ae69990e8bfce1a8f38ae3b2d5dd68875e5abbaddb4152178b84f62df313d6bf7e4c8dee49c84eb6571585b9b2b1aff78e5d5c2192ffb0600f3317d9a14217b45edfbd6af064e9468fd2838fd83a0ee27e4fe33df64462e5fde462c3ba7710b1439a96f4c93d14a97dca88a45151c4ad8bb7e400990f28a4b98bf6a4826058f87af51bd1901ab37e4a7067e01b7ba1bb65ad6efce8c79e35a7dbc707f64c7eed28a91976a7026a1037e353c2e17753571007ab7b49caf80b1f35958b0308aad971b0b36ff5b95a290c1a0e2ce9d299e8cb1be448de63dcfa467f5067736bb649988c020b1e2118633260e02d9aa0a6640fa15a85423c7319adfc43ed03ed4c0f7fb4a67ed3ed9ae0024acfb75c7f421af32f9559fe95e261d5cc1df7da8bded18b1f109325105a59a3ee04d1bc428abba2a3411f6220e51bec19056d0eb2da00f78ace86ce7e22a525ff0d8f0aab674174ad1a1975f5ed0edf8767733dae428d9018155de34665090952cdf1cf93297dd65aa50ea2e7804536f4037a819ef059423ec0d235cbf71b0c870c6729ac1241431c7a9a9300a9dc4386f6d9864e3324dbc4b0f7357b98b65d489fc05c32302d8b8f33cab4dd01e1426ee197c2fe4a2b79619fa9113d92d15ee3df01c31fc33a0caeb2d7448282bd56ea9675b56b34ed39072dfd1481ae524459b6bbf81d3acd8bec34a8fb3acf9100c5642b709dc8e6b8c90c5a85e975acb13e9ea501301bea7e9c2b87ae2c4217e4482c3ef609fb833b0258505aa7f0c65963b60f1a4500eaeeb1ba0f6b46a0c4b58d28b16d3b86073bb977f72a1aece3b05b4662448a41362517da77694802bcfb1c2b413321fc1fc992b7b09df003345ffc0a34f76963a3cadc10610ce18f7a89835216ba09dac2f0a2731f9846bab78a0edaa1ad9bd6f63d4a43143b31a846ce138ff97590f60ab7347fb272be1d9f35939221dfa49d9ea311536def8020bea5759af8a6fbd34947ff6c812076ecd9fb45ae16b69efaf9ace46c9ab1a162490f8552ac273abb174ac4888ec0db9957fe3db777a2936291762fcdbd52e0eb55f7787225ac8e0ce9dc89a124d975177404c6a557692bea069a87f220a23ed09d24001763b37c3d0e3fe7c981beda9c05a78d14d6fe23c6fd9b93b45274c13c286d8e4034696382f3517002a564f38577df0cdc2f80b323fdf0d0df3bafeba4ad6b012dfcdda8c61bc4d60f6f635fef5c3a74dd73c4fdbd2988f142e2cad4312c4431e2808e41ec844f736158c23e874bee4b2711be9614e8cf4541538186851696ecd991eaf3c26a2e88648e310b35918c27058303a6f9ffe23cbc189221841299178d54320aef48ee89e7ef580609a17dcf8d31d2e2b082ccd6cb374198e06239db17661614e551621219900a778019c8e69a21b0e0dfafe27bc2fa3f28dcb07697fd402fe0ee2414c8de7086b69e1135c6a8824ae48e33624add195ff04077d2afe4fb79b24155bcc28948e79ef03c7b5213a456765d7b7f3e204c33b73eeb70259aac4f92728eda87ae7676174233c3d7ab43b1c47e77506dfea9bec8b5acdf0dd6ef8fcc8a8ca8eed48db06c367f9be106065f75bc55c9bb7ff972551243148b41bc54ca633c1564721ba98e151883847ba11beaed5ca969ca174b3651d86e14fb765e9523201679b770aedbfbcfed91231eaeb3da9d76c52b2638f539e80df8036f5c0e4b14f01fff3cfe9562df159f22569ac29190800b514311d965c88ede61188ba079717e213254c6fbd3fb2ac9922fd923dc3543210506fc41abea6a6b26c62ab02c5112df3e3643a914c1ec0fb6e709713f5e697f8dde78619034bf0e52cda5b626d5f1f4ae6baf907e3a3ad9898eb13fb1fc5a251eec7d039ce105bec76332cc00dbb74b189b202721ba +shared_secret: 5aad40b5528d175e52ceeeb0e70f31d8eaebb691d69f87029c966f191c6e5a59 + +# Official test vector 33, seed: "4635dc5bb92ef98cdb6220df0dd717c7f8158375eaa2b78fc3f0b58e9c9653e92684cad3461d9158a481da3d14694c44" +entropy: 97beafabf2c8575586487c7a80e8af5fc50f94b6051c1bc66a5ae9f66be3cea7 +public_key = af6c50f1421cc8e1532bc6afdfe7acf2a43b34130fea7ca5b1409ab0f10dfaa5a5f0e7b9a62006f1c53e82b5c7ea427009c990bf31a939ea2705630164445715bc5c80b3906739c46a4c4cf1024776037bcfb0716d1ba00110637fc177fa1768e73cad8fa4777e13aac74338513c516715b645e3bed722382950b132418fee81639d448eabd55a94c66a34eab68ddcaf1c756a4907bc3f5115aeab5320f3b9bbe84e0d885fb784af7fd8c1eaccb37642cf39c8a24c4903a7e80578ac7e9f2a95cd806caa200e23873f751636cd606d819731cf1b812afa2ed24381a52b4f5fba658618a02e0418d6823e7f418294c81032936559a77f9c014d8a3b38df8bb17b7a8c3b45b53ad60b0d9929a21a4ae3039366f894b1082db5f3cf2f13381d53827b5a568fc5234e099d6b94bc1a013ddde944b4ea13eb52bfa880716b1a10d8827a033878986155b7f2944a63a2cc32bbd61907125475bc09b0ab76222cb4c9f2e80a00f9b71bf9705e3576b5a96f6229ba1ce06fa1b2079cf66c59f30dfb88c1f9412b0b2ac059dcab8782abe57209188bb938d08bda140a0eb08de0db3f8558c403c725a77aa1e0563a54a77f32aa30cb780f4e562716075763e9c5d470564ec12cdfab424ba970c51201081193741a5e358cc7d63064a7183d99b28ddc5b0f10374ea9710193385b855a259130bc490041f76a9d661483aa668aace51c616804b5e7c1bdb8762b73b39f17785af94b355b0fed72083c2b71efd1cd43c1a9704a93e0e5752e99a2ef115b6ecabc74cb03bc091038f5701659a0d4bc693805080d6a5c81a0273be9149861c461c47cf496cfb22526d3fb8ba5a3396dd19a8477611b814b76d5c8191ac1c8190ac3b12065ca4ccc879d5f34bc4479a5c8d4693d8771b434c4b8e8b8ae921e01a131e9410ed11c505d226722e011f2073b0db34d10c104afc2656dd053e43a8db7c00fe705b0ba520980dc71e834127c08077806cd8e82144d50448dd59a085776dab69e42db0e7e8ccfc010a140b50b50e09f233aacd3da972aa40f1d1241d718b54b6009d3daa090186cb167c1ab3979c8356397e598502422da2935edd9c8c44b90e8c50473119d26e99575c0c328307e2017b515f33d4d2821bf341480780b21d37fb6cc3049324eb12a42c9f7c9e086bd0f39a1949058f1d8c8f0739c23fb1dc542429933080ae732b750af73b05df6b46e0f27b678668f9450c193c861e7e38d65e5cb05a52f62b29d21b4b33d34771bca88b3149aceda8553c5813bfa6f8a99c656601fd6f4ca7e54cf80e48fa144bd996bcf41e49aec97734687a7d0da2c71231dd841c8fec9a8fb686a7cf81106b16735d6559424c1ae7a5a5f0515a8074bd879c1cbd6012a3b5a7079bbeb6229de7676a876c02f1620d04905341c95ce512d20c4ca11f7c08684473a31313640760d24b4946c0268c108a8b96f699634414b070444480800c6c3d4bbdf339c47e9b1660b9ea039bcc6836a6fda9489e76418047eb3e99d40aabbdbba140221333cf1cf2bc121318aab09022f95c31b12abbe67469bc34ccb88c8a0a965902e47494c7a0bd573910a97377b764ea7443e73346ef9bac0376711db236f89a025d9b09931aa473ad04b351a00c5d3b969134f03c1745f672138f52ba47a542942c1078892ca3b9509f435d8521a373810b12393c8eab18fe7b6f3f4ad7ea88b88b21db46338adac939040674be52e6c2948fd659935a86691f076c7f228bc5874fb8214ece1947f68b057411c218b776a332f5aa351b4d92560a42346180edb08bd57f5342773249fcb1f036955da0269695a712ed852a35a3de8662966c0b2c2038ea1ab7b4f9708c5849dbdc6a29e734ce8db1f447109b755af11976b73cb6c8594a5de221c44b61b9d425280007ef4ec4ce3b34beb733cc73a1a7f6857218476adb0200d96658c8456576666b6d7c06da03663191e649457d298b81b067789c285af151ff4b97239c35ab8688a8d6b4469fcc7e42201d5d57bf3cb98c883c5c9c88f05555674e7a1bdd59e3f327b69a74f0d4a250aa89fe1359e5724ca02c38784a14690c62d891364b752ada80402128c623d0839a0f09bd0e6a37b724070a4356641c538415f2a97701c5492d29a2f2823884496af9dd06703d8ac2c17c4ddf5561590b63ff78c4995a31a18d861a91c43c5dec3705c6112d81b81555f7a3b432f +result: pass +ciphertext: 6506597d34901eaeb07e2ba2d0a69f64a75006df37ae149cbae6232dccd9d62cdb088a2c55fa3cba76155241aa2827d1f98c5deb271240a165b0cf64d3b7584fb580cb93f4f717fe7b50c30e52fe8f9b1487baf0d745678455096949aaf46402b8bd5f8945251c0ec00458e6c347a123b47350f5b35a7c42f0d1a744637e7f2445134eb74949e95f877b9dd9c58c3ac30ffd248e72a8b568891d1e70e0d12a8ad0f50a8fd455ad503a901d82ffbf69fb75c629a9f6a689de28ba150eec51c66dd0d49dee6ef4e10d0bcc202420eba18a9884fd4261ae8537cc90a6d3d3cdfc39415151609e506f789d7430cdf4ac700a101b40e0b8142dec62a1c9cf29305030588d21a01fb51d6e91b848c198fb37f2489c7139882f032a116ab707d019330953bd8698ff5e54e34821a448a891e74fe2d6971a568d416295906a232dd1dbb5d7fadcbf2f765ac035c2df1298e46683be665cd8f8dcfa6e4b7034b468e0f53e01ec07b0622c1314d15df534fd27db47ce8b18c88ed6f04231db94cf59889483b29967c56a7fb98945cd3ec21ac881675f36593cda7f20433b1c7b2ce7e841b76878ae25883c0e579a6b4f848aacbaa55fe1478ad2a2e6f1893f7154b53f2ea3aa8fd05cfe05fc921852ef372ef28fc6f9a865c055705e4770b2f0e0af58bbf55c7b3c8fad039be3e9d77219cc9f1883a3307641aed538368f96b7f6c34324fd659e2981bb1ea35085c076853b31e8dcfe98099edc6f78f31a90930f12b7a02c655c07712d94470091e568b724dba0e53e8c726eac8018fbfd95ab92e5a8ecf14910bd306b6de6e6b4c95dae6257c0aa9fd8342fd62b96a58322d559146299e9cf70f193ad3dff5950455cfffc2cfbbf21f322ee48305aa55f81c1296fff5fd2cd8a4fd56b40a6cd17d2237880d08359ec9d1950dcdda8997db7ed75c3700d2b896bc84b6a52e0189d1f23df4d0b522c474d5962dde1c7a176fc3a3a2687d732bf7c4597aaf7258f40965d3adaeaf7846e3ec496f39ac1eb7e20f95ac719f22802ecd32e1487b9d8618238cc23ed2e3b9e0d76ee4272de5bafd3190e7d229efb57451270291ca11a82ad0512a93afa24827d8e6d7aeb86d9bb021df121273f424f37d4120872e3aa40974e1ab9cfb180b1d3795e35659cb77a6748e2c68c30f617f5e26b11d5c31ecf56d8365df6f6ca6b6eaff107339620b468e489c2eb03deba9fe98108777ef9397ea0ebdb7dad462df11c52456b0bf2f8f04c7c8d1d1831d99d9596d4e65dfe49446dd91503d909f04cd04251af58ce187027fb587bc9dcacc90145b7b0221a142aff0cf0273d45236f86d4bcf1615685f7cffdf96c29ca4a7ed8ed3dc0958cead9dcb5095fb96fc3afb7e950ed9f2fa342ee8335e32eefd5b932d3859f1408a6334b3266259c86640f8e0dc41f1c7bb05cc7a2f9d480c372a854270f21f13329f7b6e4c711627929c9df3381578acb54a29dffea14280cf4d85829d1289f4793daa4782538518dac82c44e36dc46dfa839ae7673c6388bde9842abe646177f92b4868441be5b82bdcd082a5f2cbfdca0c05ce14ae7689463ba62e773c1bc3d9614907dc86f2ae02fc2823b23000845177a0696a89a7a0b8f2ab01f2ed2518d9b20c73adebbd40708974bf59adfea03e0461ebba4210b31056885a88227e4b9e775339c2500b509e5a4c006115d368e3917cc539e855ab51c286fa71871a2f7c9d42ab8cbcc5a39976483f1fd7524250245318ed8edbaf4e07d8f7c7a5a0e34e0aa7f5d1cc2da7adee0ccbae93b3a723ee56657543f0a3642c01f13f84068856b331198ae9ad6badefe2238c7170cf884dfa96f4ab86a4c99903d285346575f19e8e8319a284a7f67d6f56ce78c5343e2bd1a25a52feb56769e2d1041679696fa45bb8d5da89e5f55844530d06ad5e1a2771eff0359386212d3e0d1109564c6c9176613f9bf2f994e7af4873b4179591b583eb3004d1c8e6082adcc155b3b916032b8a2a1e52907384f16af21b6ff4320c617187000be4b0f511c56116c25508e29fd0e76e6f062bce64c8786a3bb382835a970c2741be8566d1f7ae3489b8a79228f0897a85d60aff154596249143447db552577ebcd611a63e3d92dbb5ac57d87d9a6dc92cda84cd008d266c481b2ebc3affc084857ff44bd3e04d9c47e46ea8580ec2c0eec6f4f1b97bf4b020fcdf05e6cab506b9e93 +shared_secret: fdf3ed80a2b98a72be0cc079b8e1af0ee6491fee10520a1fa694fd692d70787e + +# Official test vector 34, seed: "5da2c51b4acf488c8bded5e985cc4702e4a7bcb248b5ac18aaba529f7f9cbf30efa776e99f76d5c1686e94f50fb57dae" +entropy: 75461decd34c50d6a094b4a64fb75e5e9479f8f9250d82bb7d729dedeb2d4b65 +public_key = 822a87a132c0b9e3c13bb45e2eb5bb47535099e37019b3c7ac3b81c6225dcc65476fc12e7a81cc80c9a508e507f201632be9c1bf27317fd97275cc3f481bc7c5c25a4b1462767a42cba43b152c276ffc8db55a96d418246e0bb7d5a15f0d883597e9579d675e816b8333097787c613cac29427b11739e650cea2ca8b198c0158caee9971894b67332baf761caf88c16bd11c9f1dcace7b83a6bec71f0ed9bc28f706c38b057231b7c330a4b99898037720cc88245f8982daea502ad30e315c2ca477a3f045084356cb81184ed90734e0cbc0d1553adaf5a94c2a6d8a51566997c735bc45fc408241357da2c38c8a0520fb5a33e1d5c06cc80c4e91314d08599763232517b501097e4bb09bf814a0cdba619c701d249c933d143bbd92c163724b523bc05568a410952380177ff6084c6416bc22c637b7e1ad586324103677101a74835c4255b89ea1935ec8b8382611bd4dd91931c436f9a909af4747dce811a2ecb63f046b411a201d1b4f12442e73d7703e22896a904736308453b946f248a6bd11800797886af555b0787d84daad7883c0e583a7b6530c7d0a8559906f0e423e9e6cb600b9917768777b7489dc173fc67551ad92a26b054ddf13c4f83b5805b9b7b9829513611e171b9ea358abf9054ddf02629a397489dc213705a9b86735577493b86c326e857eb816663dc1417cdac788900c8030803751bae22292af87cf8fda4f2991418948c0b4f54c19163dc4b195b76cc5def67b5288bad948cf214cc6a11c6e1ab1a5b9b1501baa75cec23530c091cadb8c9a02415e816ebe708422dbc2db224b74ba1b83327c8b25bda3cb7127f5c5b963cf3c9abfa15c952bdba2acc01c9d377a89eab6a96a65cfba3d722b6618262ea78770d5fbc556789ce4d13bfe02065f033362124b84560f462c64443b88f3135f585a3b29e450c1dcbaa7b9181133c915522a90f56e595ba11ec3327e6a83c7f1ba59951c4684995ea64edbb3451271a878e42be7d763b27cc430ab6b068173b973141e0a72cdb185b263071d20a8f5a37dd08ab6ea7a2639e0cac1790d5573053569addc1731a339488268873d89a1490b78ee404c2e8328004d44cb4521a68737f195634ab659b919a94e268131ca290e59756311b6273b5dfc2c3adb21534609cb2fc553906a14d8c079f487091587943df49a39d1b465952efae34d33fb9ade56cb6ca9cfa8221458d9940d4bb5f044297c4160a2284032458bf909c31e47a27c7aabdc9815f1ecccadc6288fdaa6c0316f2cdac38ce89fb31cb81b673f26e5709e08c474cc41f213b0fdbc5563851bbec682d9051a5d58148a72956721bb96224214d03e8b89021b98b9a0a87dbf15b491125bc07c6ab6353560d61814ea3cb2e72344104b06413f963091802413521441da171e6b6b039391842141c87c991a4157b428e35ce499a805e2c0954457582b6a8f52c4e102bb33cb01d1ba883ed4cb126c2137a75aadca26852223741c07b027a1883220ca9a65585a5e0c0847b9d0013f821bdad0902504785e927016328c99ca1f3d2bad906b3cef04a3598b2992b2c587100533bcccd15ba1aef877c3a565cb352b7b856880108fb828b42d3612473970044c6c4a057f18ec13deb2c398393c19383603c183b02a461bc9b8ac0969e04179e53c5a8f54a556f54218024041137448d08401fba8e4bcc09cf3b91cc28ed9bb700cc74523c251ad3a7c21f43398f85c7941387612c0c76a43db2a0a368101e88480aa1a5f1500b2a17b5704299d5639b477802fef34bcfd548274d26c476c50fff8851f29ba5ad66caf066ddfec2140dc97b83077a9e21bb4f87aa85a16a7107e3597a1bf4a5bdf008c14bba230cc95e6071bf0e6a25607566c9008d715223c483dfd6737e25a2dea490eb5606c6e32b8063128bcb6181166a93da7626c4273157c47b5a2adb1d88441e76ec9fb6efbda9fd084b496d5635794aa23a43a8c4650e05bcc2e415d775971922b1a446411f952b7e5540091a430882067c0f008211a705e4842789ccf653bb919e742b65339aaf4653e474c10583d9329cadc47a6ef20589572a2e6e4ad67d03abdf7ce1dc9015ba94ed9c69220d63b423cb5daf465d5e3a9d190a6c9d84fb28141f28990959250d48162c68b813460b04a78126e4b2c4514d83cda2735e3d3f1889578b626b002cd859ea9ba6fc856a8030f6010c780 +result: pass +ciphertext: 83fbe3b2e33a13730c0bd4e1dce1ef7c4adefc7d62d5bf91a540fef7010299009c7c2b603da43440fa34903d6b920aaecc99a68789b13ce11d43cc05b3b286589c2528480fa0db9bbccdc4a29a63a6482efc4c82612b3fc4152648a0c4a16f1d74fd2458240de7a72a878773c962fbbde1f83801c0a8044282185d20ade7882a67fb445440bc1072968af622305106ec5fd6884542474f7e28ad36101bdf31d3f5600ff4f865e68cf612d63868ca95083971c6aa06a93b5fddfb66a682874a28e5ce77d09953482ca7c917daff026ab259ae6a9580ed39cf94d345bced2ac41ee4bbf5c33648c4849e2a44acc344967a5f13367fa5fe3d014698040983ec41d09763f087496499086e8fd882eff48d7ff3655a9fcb87028795df440cb4dae831e45ffc80c2baed790819fab9ae70beb4f3b1a8abd7fc86304a95614e2fd59769ecfec62511d5ef0276bd4c7f75fdc8af140638db9e948fabd756ca0fd5f21959d6ba9f5c13a6981f83cb9808c660b3b67b76a6fbb5660a8997d362968134a92b0c14d255c81db897d7ceb9af1af1eacb8f42522fea9edb7587e46f50ba817350ff9cbf3789728d3ceb119642285a7a3d025488a3aaeca3a2960c7444f9c686530f1dbec6eb92dd7731e60c40c58c137e7bfaf027aed2a1bd28fcbfdf450a5448deda62d5cb5bc6a0cddf2453d34c7011e4924606727aadd0e29512f62fcd5f7f26a4be5681e2e598d281e0102ac16a5e87e60e9cf97980e8d0dbf8061c59132cf166872af741c08af8db9236cf3c0b6ddf926db9d620ec8f507e6b52bdd3a26b2bd39d1b06435b5696d388d8c7e287508c3aad29f8c49a580004090fbe1ee07a5821e4bba206a91472507a7a58aca5c54652d4950469bc060e498d38f0a5e27e7b1e47c5f1c4e9c5000b16899ae3fc31e0d0561f54fc3846fb9a618eacd102e39ddfed953bb5d7180dac7148a21c0832a2f9a9deac049fdf9a46fb5fb78cfadf42244ca05280302b70ff2c7c140d6b2ea6f0bb296f8231fad365b6561b2c0f7a6b8ba9e977b153f0f33bffa14a6f01c28a733d6a2829d407908797efe3cb345722271022311f1d2df6b8f0706f9ba5c423248e19a76fa65e9ac7df98a5286f172319e874324c92da7270cd97af76d43e277c59c92346cbc3f455b463101295de98109d344ca04049b4a3fed33587cffd19fe562fb146fa50483f471dc594b75e75d179e0d22cc294148ed3bbd1411496a2f7ae00fa964be786a97619ac789587fd34e6793a1ce0ab1b69b27e42fec77ebc88e5b081d5cb031cef71826a54c23ced97df258618f038d5c9aafeb0500a0f00fc3bd375486fdb1567b5595184040d951a925602a7cbca4ee8e39120f3358d8f6678887eb8aae4156536f23eb2c8e558be3b91ec30304066e84f0a7f77b659086f33a60b757c48e2766b4600a520a85823f80059ac237026852430901403a2ca29e3d464b59c65a910d54aac7484cb1ee04575562d19ccdc89e988a412e1fba496a7ae800b2e7c35cfa106e8c33a11841079cd824c17dc4c0cf0be4ec83d386c66dfd5660e00fd24cbb89e85df49b5694e8e985b2a3575adfb142baf10ccb255a3718d74c6e3f40afc0252e6c610509dcab44cf85c91dbe471f67753d65ea8c83eccbc4ebd8a0b31709a297633ea73e9f280eeb9aa4f49ee249ee028b17dc9d5041762bb6930cc94cddd248231df4da3e126e1f50c1df527f61622fa86de97fd8c6c21f8c22146666ce92ab682e0f7cab45b4901bdcdbb9b98830a97aef8bdf98b1573527b436850110a6139c5ade2e31b10ce7f1aa9d966bab3b7ddb49381efe266a94cc74aa38fb901f5161fe18e6476ad4fdc5d4943b82ae655eec0e155dd739fb84d2d64d72cfc2d6640f52206304fa90f05729ccbaed580cebe61a666e114a383b9f212dc83fe1e54294b1281518ce489eeff4b22cb450489bd8c9eff1d79f5fb3032463e61523a331fd92914dd83e50ca25417205b382b42421b4eee89ec3b1360ed68df782dfe84710fdbffa1bc6802ff8809205f144cca551554945695d447f5ca4ef8808fcf06cfec427babcd552ea0551823d12879f9ae5e322f1d91b8410371188dcbdd077cfba41b219a125accf3598c7ec40f866cf9c30ae13f704b800c19145ad5a2453261f02ef3afc8f94d85687a43c5712fe8ea3ebf7d5f377698a556435c90ef6213abbaf55f +shared_secret: fa205e16b79ab208250601b4ec37f6a13f6851b94d93a0899a395d623f543836 + +# Official test vector 35, seed: "4d2239e84b052109a78dbab6d80c51a86d38248105970476b74a0b78b9cfab6283e30d5a406fae1c7f54f8bae1110ee4" +entropy: 2607dcf4fd6ca1c614c21b5e37c24981c32b91c8c3e6955777da8a3f5d9c9335 +public_key = b9c82a0db31fb3c6458ef4c21b5663ef7795f4c36ae77a85ed8304a4066c48741323ebc5e5f50d50a704de206c4f6a5719b27b8fec3d95e77f545a7f78c57a9432a329741159808d255232d4288032d658bc483d4afc3d6ba94f8bf44b347a8fd4bb7e2e4000db9909c3720920a410a46905d3a34083c3484bd2448f232ed825658a8b25d99c995be0866a18c01274607ad6bc0154a4fdf70f42768a5ca86df321327b89094383648a236d8f74bd3e3854b110ad8d1403e428a73d9a13cf29a6240c30cc53532d60152ff560d1e3c3205ac557fc76bba0af547c69e9819d1ca412088a8665863f64cc98f3853e2ce115c4c3080e002542714efb10b8f51a59ab954885b313af6000fb8c0b23bc59ae73948e8b30213c84230098469200c8d3aa1f68160963b4dec95c20c8290783457c06b7ed61ab17077709591416a422e52a2afa2c61ec4932df188a4a0c056dc854acba8acd5298a6cb2de04c7c3bc7bc724157fa2b9d01c9bcb0624d79e52988a4b783e8a6d7c45115c548e0eb474368993d971e59e96d5c2a9341b40f461752dd73cbff7543031caf370130311c458684a80209565b754437926bb20840aac329392cbc4f7022eeb03580696b239b2993c9927f649aa838c4e88726f9633b8630977e85350bb25c130161b6c0298c03bcb387c38b4853ce8258166175623107f3d4c5a4b266c9978154e710f11337f05986e921b20d1c02d0667b42d1a4f09231d7d8993263a2cef7b3e5f153aa691a12b7ad28513eba123945f0651b83cd36099047b997ddc5128325213875ab7ac39b6e969693c4746f19a159b19b7911abf45a9215f5c9ebf60c46f254c27285e9491486773ca0f8848e23bc16d83155c302d0e42504762226701bb3a446316b9199860b824c1bb5bb2b4f535e74c493a80b3faa5b635d65364fc241a2e1366f3a2ae40ad07e6621ef64428ffb6c86a1883aa20d04b610ffea3b48e88e6073005e281e91d65cea99079e1846ce89c2fffc8cb38932c00783c9812d26f91937e6966dd2642bc1b494775f5acb46ddb3bfe70c62e2018cda8b16ff762ec3944909d034c27ccafd2803e4f392fedba006d672021a8eec76cd2c5b1f2bb65737a5369365c8ff6231b7866973201853d7538b27825592629c7812dda74b795ccc56fa684e8244a4b204c0b2bce93100a57c02dd13c5af5718084042e9d809eee01ef78166d5579fb0702deb07b6708c7ae2757a004d2ce31921030059c36a014df0178d59c7a7a7b1c3e04bfdca8ad4697bc2a36b5a213900249ce02a678009a4c9f8589bc24810e611a942ad468a2ae2d8af0b3b3a7d741fdaeba89f3b6c1fd302dae37f2d54ba53fb78e040991f4c468bc2b6f527cb985a9ae19797cf845c53803d13b267c8f31e4382791f0a7ed27a96ac609b40c8bedfb1a11d8c244cc85f4b692607d72f3cd05b070b5e8f4b7e0ba56657434296caaed3928f32d526cf0281a57960e5c55f6deb1636494e3d618d1e4431fce125adf544b91904cef045f1d088e159a6cff792ff5182386a87277953b4c4ba3714c20bc50e04c2b2b628b147d07291e24e18a6906b5300393180ed011b2c458d7e2a1f4604816a94b83c93c5160b740e3640707a4fe8f265ba351f4ff2c7fb75baf8980f136b2ba2e81cac3b27c2653c89b65ce236a3c0c28759b12275c4cddf5c14c7b69e951bb30459b150983fbc330db7dc3220420dd5e928ef5905a78a0b0e214bf1252765646f6c657aaec11fa775183c1ca3bb7261a2205e46d064239103203532556ca7fbf750d1f88ed6862ed02489bb30c976b4abfc0123583837a8db3f6a38bc5e9a44a990a471cb3e380b4508ac4162a4073f815507d33fffec823f9ccf17aa150a5bc7562a4e3f85995444c787d16901332989c15fdce4b43a215da66000525ab32f5b1d728846fea3ad2c092e271208b6f833e51c701da8854b867e0bd0234a3c9d98117c58ac1ac8b05f59f027b4a78e94771ee263792cb891e9d5abf0706f70f149482948eb6248bd811210765f93b4cd49daa19a17843e510409d6638dda571f680f02b17182e1c7eaa542e990275bd080bca0c793d3113d524598fc9dbc453a0560c556e7bfa3856570b570a1b43f82657458615be5080c89c0bc7e99a67a91bb9b8cb821e426b843f7542c5ce12ca13b5b7f6c716e63411681fef0ff85e8cd3fcde5abdbb9e4 +result: pass +ciphertext: ee3f98af1d174b594dc0ce0558e943a69ebdec0a31ef0b0c7fa26ba7d9c80a64208e66389bc232fb7847ce8f4c89e1f3b3d2a201ef4a055c07a82f6564d3f1baf47564d11d9274b4c69b30003d98aede74baf75c2d7d76f9d4a7af78031117732e4434dbde3ab4c302054dd8158e449de6759125718081658ce91de018cfe1c37577ea0e396244ed732c62d5471f7732c8826442a374c06ffb7bc6c7bdeaa70981e2caff21fbb2330d1013cbd5a37cc1651c3624d2b130475cdca8ceb4098045f63630c338c40f8bc07dfc5f97a363686b13b7a759163215a060f1f971968644ce362f99c4201b483d0bdbd7029ec1365efd2a621fa738438bb797aa2a030158a7fdbffb2a5f1b27cd4a356c7e1d7dcfbf1e8a8ff0ef52fb7f7088452d1d15f42545bcc78c1cd90ab4e4a75b10588d1303877e78d6937c009eb071493b27c27564899464288d4b65d2c3aeced1c7ce69e82935443e1f2560789e240ef213d4521fae62506ac96d3176093d79867dca89e5491cbe53fd78dc66e064b1ed8167fa6864de9f1c29cb81185bf00f6354a38bfae33d8f2306acca3131db5aef13bd0c3c55f02d1c069a21a663c0f754b9c4016239bfe691e50da24cccf54fb9588a280c89be25a48e77f9e4dfeecddb00a06911a33e9efd58ccfd170d19009ef16c3a54a986e55c39bce875a61786990a1d057bd9fe07d57e143969bb5553971d9025ce7bcc0e96d01a496491b0bb8fbf886d8d5527a765808f2a78590ad5c84b965b5535b82506857220fedb7a1bd86ee6622a31de73139fd143ea6b9845c22c215a890936af8765a58dcc24ae6ea2240d5a5667b268490dea3fb3252ba81e71953e4c25ada1da0191f26082d80e66e6d1469c01bbebbc096e2700d98c7b605593b0ad895962e183c7a0cf0ab101f65f2329eb160670dd86b215f27025ef96a72aa2666ad9873474844518adf83d7e6714951da83ad15c89882df4f27ddfbb8e270445e403213c7357c985a5ebeb1db03d1b34c971ae11c986089d1c7d4086954e7bb17bc1cf6d6c4b4df9190265e2bf8f0580fa9b5540ca0dbc635d1a6492cada9ce0ed26b029817e366a494bae2e7e5d618beb3e26f0b9d8985eb23bf20bf097a600d9a06103e20ecab5d5c933ad4e2c77d5e72775f9ca84c0e71d3400e0579882284be79bb3df2f9bee359b2172943b9f4c78e85843834fffc59ee297ef0fad3e03212123bb957f1e0475641f1b4e6771091871e05ff6f2d8313882453c0fc6ba7a2271cc2985835063c0fdcbd2947478b7c9c728f77154b731a1cdbf0d928c326caae6d3737cd478b3af92383b5610ae3109429487fe009411b3fa6eada1ccb2916b37f633e1bbe6af135e95b0f0e54f079fd86ad11129fc10103a0de8a9105480f0369d763161a366f78ce4e679f1a9ded37aa63353bc9f47a5f9b4c63f9fabb2a19e5003b703ecc93233637568d211eb291b3d03b5d0846a78b0f4c9aecf442f0976dd8abcb18a72b81fda3c8de270855587225539d117e2f2a7a135d6b879a3240673c2622fbb1db86fa0e5db9f19ded3215ce5c9ef0b8851109e0994dcd3521781f25891c6ac10b3a38b56eced9498662eb4ab65b8f3d3ce21837a7285a5a2d03c1f8806665b45357564cfa3035f2b8bd342a21ecf6b7897c8b3fd08afa925360c11825ff3e96133fd6cecf35151a95ec05b82e342f4657c297716131e65c3b346e6647de6c92085e6d2204496eea67c97f866fc1ca0e235ea457169de6e4d7a308e4d348ac34701bd8f990f8d15f3d7b5dd9cf3f50d41b9b2a10bfeac96b9438c75adcffd46a60b23f5037b8b2d0984be210bc58180669c7a12b2269538740e776f9716154a568df5dc7e6e3b329f77f69a7637cc78e128b991a4e1eff3d3d1409ce6b110b250cb8d3e092d48b9e33f3d2f258fabce5bd0957c35b47fbfc6ab6608253248c2cf3210b6261146bdb6818cec194f42ef1485ea6b467227a63d461eb7b617105ceb28126f99ae3eeed721ae0f1cfcd05206c207f895dc4183282478acdd1daad21dc0af197dd8763d943199042c4bbfdb84ca4781a3056ffb3031d3ee3d639683b01445a9d82e3a18a7c030da16375d7b69dcc5b533435acf8a3b08c56bfe07cad6795b5a1f794f73f94489579d70436a323ed5f10a9decd33f0d5baedbdb89d2d50b3aaddd515b9ab879e7e39e3e06efb9f9221de583c36b +shared_secret: 11e27d94d4dd5a8e8088e281608ed424a9384bfe96ffee3b6305d17cddf698fa + +# Official test vector 36, seed: "ee762f5c9021c36446706a88ef16312f4a12c725cd7afff1484337c91eda8e89f7007f3705747d29907b3fb7500e5074" +entropy: 38c89bbe7145c29e9a831c11431eb9929cb24fb4992db20737e4687d397fd732 +public_key = 35d29c0d6263d9020389240d058974e871ab8e433196680f50c7b88e6a3ec8764b4509c3764bb4db404a8e932413930dadbb5c5d60a01539763428cdffdcca2cd0554633367ad245e069bfdb397b803c68c8543583581bfcc9bb1147a2063262774706dab0a015e7c57e244b12406b0009024fc06181bc058b466ee12c3ecd1a983fe1bb030774db831ef1bb26539245caab4d9954bb01901c6bb66534b95cdcc92a1af075be8a949829558ce625ace38b1296a75058b9a3f90e74e04ff3880106869899e6844a6504b8a0cf99ba86c72cba26564739d0221fa20fb412828180a14bc570503a033eb379790a457f9277a221b75720537205cd19969149ab9d2b87a19250b595186454c99b46ab8f03365200424b4ef8cae2569ab4bc07b98acd2e50b0426032f967354c70b6c1f1a1df32406c296b0e9b8066904fa2184e0dd04ad5c27f9e952774bc82a923ae90888613144bbe376b38112a836b7d6b0606d25abdcec0b471a834fe20adbc78a68cdc5619089ae4f09b32947eaeda996adbcf131621bdb99173063f98f1380a324f84626212f8acca34205299399e62b321030191379b8bf96ccb336498d2a8bf573f44596d0db92792122026b61264693be3a3a7160a9e60fc1fc0897e5f602483d6c81f382e3e237d6709b82056976ce23d66b013ea48cb56d78d12c68dc2cc6fdc7aa1142548e1940e3d889c71e990fbb19d4fa0bf892b5cb873ced68516e544bcc4bac3734215201c617767757dd3ca2b0a5084002f175995abb6a7b88892d07b4ac68b974ca83f13722f028bad4aa9400f0b755fa3352c90673a44be327845d1dc1cada0996d57b62fab1032ccb6eb947646fa25d06495a6577a17d707b11c3e8fe82325d21dc2997d0ada9bf85b45d8e5431ce5ac571c253744108f91aba0b2868c7096c92b2f53fc5a0d996cd8414cf230cae4c58059177607040d871b8b1da28837c7ab177369fd2c05fe300da0d84e97497cf5f22a36b966b5872266202d207740d47c8b1fd118ab390cd5ba70bfd9a0bf8b59d14b165575a079d82bd0fb1cc015340a1c0a0c77c7f822cd2999c6f10b5aab063181775b7f42b2fbc813b2fabbfd76c0a5d4942df97c449cadac303ccf4790685438257a0093461f581c981bc61229c94a130372ad920d2cfa5cbec684f8986a7ecaa94275814cdc2d7fe403c933bc0038b18b28cc3eec9ccac49bd922c446267cd07b786de316012330ae70bc49216fcf6b4c7db2bbab55153e21089d04c3fde934955ba215d047398ac172c2b1a18c0597182e88a327d0f0968796ae0a03772adbb406a210f2e004810513f09712836c45cc11a0d8c8433b813e0e8aa380cb166fa93961a2b6765287aecace40cb4caa064f6b547f0084bcba7856898b221d362c9de766c7d447bc10925330ca87a8379ba944323c638f33b164e13731b0b92a134ee9d454684387790361b31b53c245328bb19185f9774e2764fd429e11e2a4851b222c4a9e504531fd962fc23852bfa3b4632aba9be4595cf5083d64522ac93b41c7409aba1b83ec51cb6a1c0bd0c24e35cbfff95088d7b6ec890cb5559c44553dc44822692a243d032ff75c7c08914d847551151052c6846e2f556201205dc130babd9483dc721d42f42cbabcacff1aa93d05a2ee54bd399186bfd4978a7a76d5d24008fc55ec40a6bdc899ea0a69ca22acdf8bbd14a5cfa2a06587728427865a3331c60e77b5782c37e79561cb622195656d8f9c0c8c2c560ac95cb0b986ffa0784ee17554cb2bd0d332645958bb68cde65b13d274ba9a655bcc8072d6681cf556c7931000b94a9436602f0a5a6fbf770a2b323612bc47190c9a88d4588d97c099ca04b3b7377867a6e68869fda2258083cdcaa41aaa798ea11ba7f6cc4838f2aaf9c5795f8137adbc4c17b491a59255e61ba078a9b4179cbc89cc3c9946c65efb9ca5ac5765f3570f673ac80c1d26b5af8f031266c65b4ef41f7923af49dc6eb3d0a0eac745aca402ed4b9b2de754bc3b7a6b54c2159baee1f560dc502e4ee6b3a3d6b4c1ac1e06dca9edb6775f5696cf91acbd9293be7a82244234de9869afb1b2696300331aae6c9332840145eb16b016f8714fc00020d429f75231f73b265272a936e404f0d57b79c6ca8c25cb7c8bb89284c4e7b0ba9eb33c0406a8c39eb0d5429fcae286a9c56be5839c10ad33e8a58374dff41feb +result: pass +ciphertext: e08924a91b398adb3daac6ee525b89bc18256d7c0ae328ee197c02c77442f97841b0ec33c6fb217d3bea65984c0225ab052b8fcfa3955809b56cc7565e97037664738cd195dfb3ec7e0a2ae1477664913a01d6d15362e847cf99cb88d3f8da414569b8cc5afc61490f2be47d4b54e57271f9ce5c8e592178f070d4feb22d003d0224551bb529628357cc896433a87a5cd7ed2c051bc8b0c4bce2256d04dd6f33df91c3af9820d4fc5f99a15669a0049f3dd2843b6ba5022cf0ee81f1e17601c1cb567ceca60d6092c100944c1e67eed0a6c9a7a11d697231594eaae2876077a47632c4714b4955a727ac32f2ecb48e23698b47583245cc7d830c29c408af82653fe37efa53d46f71d22cdbd477ab034386c8241f0bca25ab3a0182b7fd28acd4b1e633f9adedd58a069bf9f20582724f33eed04dbafb95553c145705bbab89796bc21ab9a0780a9cd392be274ad451447be7a195b23126bf18cbe75f12a12eebfc96d9b22fd19d57c342cb4bd3878cd69d21aaf0c093eb7b7a6f149e4d6c214814bf8f1690988b794c06a5b1111c415220cea0acc02b452c6f2678616e52c538dc71b10166067cb0682e6367a861dc6029cec249057484367b5be34f9b5593cc7f92c81cb80e00b1f7535237369b82208f5a8b697a6ef4caed276a16b1b2916cbd7888d18dcd22567e92de1d0acfe7ebc4a3f96014754b84fdd8d3d46203230a71104b3c825d71e4995948414283b636e98d447aef4e9e96d3240bc99607f1a9597408c8556dc37e9cd18bd1be56d6dc73a154576dbeaf710ac9e20afcd5a41db8efc363a7d26ba223a58e08fd1984073fa6f115a616b8a8e388165df7b1ff1bbfae32aacd893d0cf5c0b260f0d0d809ba9092823cd83e58848cb17de31bec1856360ff6a2568cbf27829998e741b9dde5d765e971cec53cd94d1faa6ce89a8a57821be0d7c7dd56f31c1de1f49c76520a324b5c978e075af190b620cf7315bc338a6b60ba6e896496f8afb86f6f67941ce00846a5ac726264b3b3fca4c201a30b867a36731058d67255ec0ef57222d51d5e915a79068e36a62b9b9ab84767ffa472100e21875e1dd288c4382654d1547d11a58be3911832be2a2779c84b8775bf1285eb7a86b98647f0533cc7b9fbc013d3f20b492e06228d4f5b4c859653caac26d2a9cc13ecaf229edb5761d094386ae4a111e56e4e13c992bc994d47aa9c45c0ba40f5afe8531a10a51f74e1b8a6c71ae55f4af1b43939f1d299e396b1e573a25304c5c8d700d95ed1bdc5d35c4e6776be305336b2b26fbc3c78d2a3336607e5fce6f1c6d7a41efbd0b1185ba60092e78e2414edbf5ed1d3785878a5c029ea06b3ab0a5a3cee467eb582064c9b7d29cf826c0cf7e828fd1963c39b2f3e40731f2bd6f2723aa94b16504156a405ad041c1ed04e4c00c5e34be37128f7b57efd9729c544f13e16b1eba33dcceeffb7d8547b0eec6703609b053a897c1cde85871fde1142dff09a55e068b30f694064035fed0889ca095afccbc8434d75456509cdc40e42021a4f196c339e0379b5804c7beb3963d941a3482c96a8f28d9ceffa3513ce752a38290765fdfc551b8b996e7581458659ae35549c9a3593eaf9b5d6705b085ded007fdcc454b35d84bbb583ed1ec2fb74a6aa26119cde1554aa2c6ebc6c74cb1ce3c06b978371c9103d638c37d3d1d1945cbbec11bd5cf736ada2fb8767bca80e88db70af0018aadb8e3e43f3d08ab5f017ebd5c7ea661ec1fab82b8446a8be2034d29fb42d6dfa3cef966c1a3b6107198291aeadb8f29cbd4117df8ef571f3ea2df5fa052e20eaa89c2c757be75aa657678f0ede06157903fc08dfa8280cde37ae23a313e1b501f3ad51f02629189f2d6924c2ed26e3c78c9c90ec6ea36cb0be8cdc0016c10eb728c03e8664901fc9ef25ba20fc8d058070aa17af214bf7175bc1ac736eb22948511c8cbcb4f0d98ef25a73eedb857b43039b4729faa9233b4191fd0700ea3a8b32d4afd55e92b8602a640b75da23902236ca97a92053a98a4ab78bad3bd5cf202b452b31afffa6393c8d28d5812fefa53455aafd8ce3f953701e24820c19f799746ea6aca59e38430edaf1ba46b750d8b2441538f59cf25b437b9c95e3ca3856470609e569d5fa08bda01aae9674e29f96c1c8e22cc5d7710de5eba022766492e265d5f24330ca833dfb3936f7cacba046c761 +shared_secret: 86d765b2917cb98458fc5f5d26cc9a28426655a73109ea65f61377532c83c280 + +# Official test vector 37, seed: "d882ba69ac8bbc88715f1c6387531f53273a5dab87e66faa8221a7f628d2bdeee1cbc59c0e08d0add84520a3a70c1389" +entropy: b2c35e33c72d90182791f0e12a0324f5b216efcab2c8da1bee025dfbe13f4152 +public_key = 349251ec123ce574a5dd6ca1d14a967e7177aae64d9678571d6b0b0769935a1a2a8dba53db6c5b7067210426c64f53542929b31d565bd25a480d9065d79852b0f05002964772465c3fca5f8307308055603039b1b56726eea02a8cc19c5af41309f145000d2aaed3038c17911677a2631242280c23e9816185c75e5dab43b4b04c8777a35721605aab1adab828f2640ec5b23173f6cf5d37ace602ce5af62108ecaa540ba46594181ac9869517502aa73ddedc4131ab152b53501dd4aabd79556476063da48c4978835f28500f810b77715257080d87247354302399485852314598fc6eb1f93feee6429eac96d37c8422dac30f473b56db0dcd2c64f1c18f91950e7984a88b63979b424c6d4a36220019881b5aaac715e426a6976a300ff171a29778c82a1520f42a2f0b10d26035613a1e0511720087be146ac9f0cba2c1929c0960bc16065748573d61eb195de53ab9ec802d247b210b747c70c45aebcf39229e4b938eff354fb9f65cc6b52ff0163494744848885ee577048b506a95112ed45466252783a4016f30e29b1928acbb448379723d51bc3b59a62df46ca75f64bae27aa2d9456c66e2997b48274f425004e6884e296e17912f7e387db452681cb32e7217566897287fe9c38622325a8c6716e5a767a626d98836cb779983c31d1802b0e0bca04bebbfa9e2cc02429f987a31f73274ce5320e1b0cff8154da331be8ee21cae8c5037a1baa4956b04833d4928a1c32147246002466716ea9c69f4032d33260c338cb13ea09e5e47957700c33bda9b147a3f3f64b46c933b7f4689d2797e4ad24df42c002a323ac0e781b7e8c8e679c949ca730826b3f6c28813ac24ce7ccb21136695c75b3d028fbf6ba94f5a06115c72bcb879d64cca29309502836edab5c7b2a79a1e1204161369c5e8b63dc513d0aac9fd366387f0aa2e736bc09b4dba05414659a6937264ba982b419342e8c063ec64b28663cbf4d12aa5a6ae5aa9056ae71c4f5643cff81ce6d7a8d29a250ac27be274afef453dd176c462791c249a817329142c00ba332851e50a01660a47e35bbf3890c23be173dec1a1d57a4837975c14269707384855e897cb44c4bef532a003409aea41d2fc889f572ab20c0409831ffb0222cc7246438a95fe4a6e32412688b2cc8c1963e38526201aa9d2b0963533b2fa42af59e61d53c4bac2bcc09e44c5f9c4963525a7c015244000749e811873a391f71315d1fa60c806390fb3aa80295e77e80158c665ead61283271a1997757e5c4dc6893ad71a63a1898fcda02165db76e252665153016c90bb9c8423cf8a1d371338feb40a382c2c3f99840ea96f99246044f4a5fa5cbb8d7473110b4a5238255e5c3d43463b055bbe46211d2e05812dc46bcd539c56a15199cabe5019220dccc1a828a5e0c37bf130a6df762e395915654b5bcb5c3eaa7142e1706697b9914a287513e407ed376354697144b33260eb966316c05dca8655a0436bf47967779d43cca5edccb932c023351542857268a57a74c4eb08b7809c289c5543cc3730594b3ea33de6e23a5600ae6a68cde3614cb1a80bd7c2379c1834c349c55fa73859c5a3ad45886286973f1363a5a536a0b08faf26a939179f873cac62281260868569372dcc744185a55feccb261fb0af1ee7a50dba2c49636e09687f4618667db136bb291f4b4c129fc7635182720521acf1d67c719a283c412bc9165d9f883db9049b98381a4412b6599316cb39986a9c3f8c069aedb9b5e13b82f3abc0c1cb70dbf0b5d1d66ea003676197c1be2c15bc6533a41804ce0c123fa55a87fa344d850af4f5b12fc0ae3610593e1bcaa1868571b2a618db9f1900c459376798341e4263c70cb94a9db42a04067f7a5310c606bd7ff661ef3508e6b6b6373c7ba0c872b8019676263bf912673c59a4c51372a2da860399222654518063c3e1f07cc6c93e91ac6b53f3c04516b76da65124325c59d4360091923d1883977a52b328c0d508d0f039696db843bc12c506b521ae34c9b9d145047293a6eb99686770dd587c92bc65aa3a4083b40e8fe2cf891c5152281744612b2598664e4368775572e4a03a9ff53e307caf081ca897dcb43061a404c689d934653769ad59d68475a8b0e7277bb280ac77ea7b1a1b6111c1574c6358dd6a472c49c264965f8cd9fab7d1fd2c5f4c3a4ffcd66e5b05a4879536aee3074b69c3d4e6b1 +result: pass +ciphertext: df97e2ea928ddbc0fee9eae81ad53728a6a3a953ecb6e3071ca382f9357facebc3cfef5cea739968c1b98081b008096cd4a4a6ca597ae85b46340abbb9d700add2b26b14f4f9cf68780815c4f38adba9b9929a0efa305be578c55c5a028cd3ba6ddf750546e49bd4748064afa4997f09254f33c68bed867ee934f8b0a5974894726446468eaeaa4129e05eba9d5d1cbc878be4d2d4a881a3a8d71c158db0005c30855059cdc29185c8512509dd9567a8605feb883994479426b637dd3c068d47c98e98f18b6f69273d2b168bdcafbfe90579af203ba597cc53ecf12eeed9b6ec7b177d665bdf90ebfd4a9fe18863a23348324e9b891b60d4c720e4f67241dc6ce5ef766edb36b3599701b2343f9406fe97e8b7b77a030a5eea4219f07775d41a4e613fa41d99fabede9779b9b957f8857b795538ca11fbdb670fe2d96131b0d7944f75944c99fa7d1ab90ac25cde6149dcb3b9e128fe2c46e79a26479008a57f6a1155291950d0963d5f702ec4c58ca46720987ede70518dac5f2b8921cd0f367f9e0950cb44d9016ba078e4e22609a849a2a34bcd8f4795a3c3acf8e02f25d187b554dc2edd9f5f68788a007e05abc44f5d3bf9126ed5060e08eab422da200783549c24103f412cb9da9beb8e09a96f83b73328347b6e2dbd951194197cfea6ec0bb2ef3469d50c991e0a348f34cfd1af87fa1548bb501bb34aaa69e81ae0dc314aa984144d87cfb9c973bd16ea7760c9816d1ac8cc745515aea51eb7f538b4c7abff9fb184b34d01fc94d82e1b3f2baf0e8c0a491b411fd570e1d02a98fdf9f0098da68c5d026b07e97672d4abeda9ef0ce886f83584bf212e4f46219e95fd33e6cb90521ff7026e57108e0eb73bcdfb1160875a99f95b3d955f444321fbeb431c8864f7d387ea52ee3c04088b731b53ad9529eedde950ac39ed114a92291c8cc7db0dbf1815d5066faec5c5c943657f562b43c0dfd6059d631e2bff45b440c3dc00cb032ff6c3ccd687620457910a72a83488ce93dc99204adde3d38dbd3e0db8996216b5d65a11215e0d5865ee6aa848d51464f28aaecf323d32e927f024abd06ec057403ae7c6e931c320c1eadf2cc66d30b5f854f52f238d20720f2020b1dca40405f38d3f89a19161d2cad8e85534ff5a2a046db25c804c53667d1239df5bb6052d21f8a43136f694f3590ab02bcfa13221fd80838e5da3ab0dd3c212a2ee094d1be5933f71fb62f74422d38a05bb842be8d82ef68830398d7bd1c822fbe6ceaf6361868f6a05754b1aa176c4b84da0f93e4564e1cf2e47d54ab5308ae66ff66b0eec00afe8da1773ffae4724822e90d52a12e174f5a72f5b6f18ddac08290cd4131c5b5b9a5a1f0cbaf71147c4139c45ab2f622d0d4a9fffaa258d6ab7d57185bba9837494c1ce264b8eec129510f761483875802dde735ccff53cf7de86ee3b14fc81432bfea8c98e8f2fbc680efb73dc3e14ed27400aef7a9e834518360060e0ccbbe151c72144507d389233b1cbff481e8d89754d59b213ccfffc657cb1d25fae45b28fe152d73e14c29e49f3eedc3823a7a75bf38e8f0d2e5872810af32e5ac4415b07d0379edfb869ce7306e8e74fea6953066f12cdece8cf01ca4723f5dab6d44a4a60e4bc79ea7b0d70492c10537fbe5d5bb3b61bc3a497c1c78333e2923f44e3fcfe0ea24f768093635a66d4278e5133626c2be5ced1e5fd6e1f07a47d2718f23e475a39c7bf9fe53cf26aa1d581e447d3df277951201a0f63d0ea7c27de1b51e472ab3668ca5884eed5561140db1e46d8442afa25343d968699df67b6ae7f17786c674d60579093988bfdcce853e48e1ce54a5930544fc6548daf3b7a8478014648e7b5625b87c68404b9a71fc3bb013c77d4ba91f75bffecabb32d0a9add7a13190718cf61e7e9903b3317e97df05b64f1e85ef0a164dc986b44ef94e250faed57c94dfca9991fb0dc3e044c9d8d13080955dbc6a988406a428e64398aef8a9977a0668edb140b38cd38e172aa192ffa82b0b45d3aa9edd568019b948aa10df147b1b60ab95bf9053e83d9881ae88ec0569fb7fb3cddb167025bf545083de9ad03a4dd7f67108ea4dab51ed24ab192087fa5816f057837e1c0c3fed094ccd52ca892e097e11e1ba9d2e827555d91d3fb1c19ef625ce6761c66a19eac07a3ee51445e5cd130cad23f5bfd247c443106d8b8f26acfa36d80 +shared_secret: 5f83d8b07d320694b387d4ac6084fea240a41f02e66a12a7280e5078ae0ce208 + +# Official test vector 38, seed: "6c3aff39f5d097096d882f24717718c8a702382dc4aaffd7629763fda73c163cf084807bbb0c9f600cd31a7135f48aec" +entropy: afb7d6dc2b7eb6d84acc080c1be63c98afe7b07786b5801f716444a3e8e64800 +public_key = 6a515110c076dcb486eafac9040ac0690b79f5278022f59bfc316494a782d92310489c9f93e61585b3bd292165f651a7017a994b2512f0a5bdc8e77e9bab7e5cccaa7bbc779d445e5f16b871989974d92d2c268bce10764c0146a683ae56c47c4644057ce8b4739031879bcc287b194cb36fab6916ff563248d04851c74a7fe87f4fea546a565eefd507457882cf288ed294783179577ee898bed18c97660bdb726867a2c9581cc13bdb263dbb414d695990ccb897fa31984734e3178e081856627b0a4bbc736a235b3e392b3996441198c41bf8cef5ec64d2f5c4b628490736cbbc076d8ebab4cd1ab4936935fa3aa40d941e85cb08774520bde23f24739400bd45b1b056d8a09ebb49a3e4b7209037c94a47084604697185bac8772122d1bcf22888f165546bb699b23b2262035135120cf677aa7f767ca049b869137999884e360518358852cbbca3f90643764cb30fa16cc009766c43b89e599203d6344b1081e97c863190ab57d42812d603ab56068283cd30e92e3f7a8989715479cc3735f3cb1ed9120e8b8c720ba35ab1178b426c413c5e89eb5483bb0fbed13a2fd0783ce4bdb1aca87d80000dd48caacb57c74b802c6b133817ab099c84f1c22383e57a759ac6eab76df67876e3591f32595a56a027f2087b63db7dc138cd820a84b09411da2284ac78445850ba820c31b1ca97f3e680e24201fe67154b935a36292b18857007953a848c49d0236406e7a320243fee64ac24b02952d0a02a57ac4fba19ce373e3382cff61160913ca55a091696d782f4134db83958ded48e681546ecf2be93c09a9bea7b3ff420c84a9107f4a75a2a1c40ba0f9e6060e936218f0c0904bb29add2305cd59e29d2b10fe667f9ea49cfd149d1d8bd62e549e08baa1ccc63b8cbc734a24017e4a099bc5a939828ffc8cac5fb5d388ac8613216f21942675cb714e32cfe666357413773ab5f6a2c405179995ef42635cc7db7238dd7c410ba529e7d7391556c5f604c38fa079a70fbc2e8b393306832fe2a8bca891d880209b9719eb4d2732581408a3896735143462a45f5e4267084bda97a9a5324a2e23a714c1322f4368be3ea5219c10f56cb560a78786c2a51db18c79f151f3743a7de67c43a35c63d1b70e17aaf4e4c48e300a73f9c07bfa776ee8797f803ca148aba782a2fab110a7c4440c5791354b25c1107106be979b2077d422a6d8edbc04225ac63c3705394c9fd5389c11855057572fb303ffa365cc2854a3bf620ce5203b21bcf7ad9c675427ca1294c7b001e37a02be18473d1b13d9c52b9d59bc267ecb1fdf3bb96c2b374e72e4bc0898441c47adac60c1955bd1a5096f371bfc709ef624078139feb979c9ef48bc0bb9100d0a97198b466bc5821978c87da85c4e4164ba61a010b5fd99435dd18129a6b379c3232f75c8789d486ee3b6c84e052b55066e81c409c182d4e84926a42abac49846fd7b6f7c305e234130026540a6571d2c241c2700ed4e073d0262bf196164c71a62b904938cab91cf12fc8d527a091c20a86b163aacaf2f25d1814bf2d435dc7881b0f0219bcf40f90f894e74392fea065fd1b69f2e959cd0a5850b002cfaa8e44d0867a16ba5b173711d77f355a71bdf7674299a91cc05f2c772a5280177f2551b6f4a986f3bf584a899e755464166c3220130e694616f76cc3722c999536b6d145dfa5a27aa591ee994332893fa87acc2df67113f8a9c438abfa667022b92842c73b15047d6db08e02930a6348a71472a5e04bcf856058e785c10d049af83736b2f78f8fa0b16b0b7e897cb695ec20d37c35190a079a57cb41ba5a0f010f4cb94b585466c9a802f0855946361237a0840d43487bf65bd9f000f2480afcfc03b3dbba6ff053aae4981fc619d82818251c0d00ddb269042902b4c28fe6578709374f2461b0fc1a00441b78582db2a76dee8729be071ea3c9957f5a3e75934628081eb8339ca5cb5ae83677d4c31d7b12b0463b57bf7aae0af3901a9795085b8aed0564d3755588a0829615785f322add179edf08204021b86bb3cf8f3528ad652437ba8b0c6901cdbb748ee8a2d854644cb694668b9ce322992dc43f2d8a7ee655be3b257a0974ad0649104b6b4e9a16bb8cb79a42968ceb1cbbbdfc6c3921ae35f6b22ac3c2f858184475b4f2a12db3158b3bbf2d64f07ee186fc57de21c26bfcf6b645f83cbd47cef72136aeb644 +result: pass +ciphertext: 80efccbe9e2d761ddac476b72e873a252a02782ae13d9b8f863e943ec06f26f8c080b9d34ffc22a8ef2cee0a4797d781da660eb80d6e5160d3d88f0ac65c68094abf9f9199d2f92c9fef5f8abe17e80237943a66eb26406d46ff8768233b9e8f059c61c8638ad84add34752ddb6fb9e85f784c8e33d2537712fd29592894cb1ceb1dc6f2aa9d26fff99aec7bf00763dc03ba44065848d60a8ee2536fd1761f209728bb62c2935bc1d28f4ec860df4f3f16605b31a2105e2819fc2cf0066938e3d54058587dfd4acc7d716a320c31ccdea328454a0e8b86e56da5f7da253955cc9558c270577ced143eba13ece0d597ebe3e0a04e48c704bff12ae19e7befe7d7fcc20ec3ad5736206c836afdba38ac4aab46f28d65edfda9599e69e1944d0ba65ec1807719cceae163c84bd3a5cfa1dfd2001da4c7ce8edac1b9c9ce15a22cd7cbd63c56eb27ea4c06907a896574f15fa98a1b65122fa94b720530b04509aad646b84e2620c8f511d9c8d2695c8aae14964a555d7e4b276d4d55667cf709ccba138b2dae4f6d796d8b146a920263b9664a99a9e88639030cc01602d0984c72a52b0ec87762480277dab8c3db42a19e9d8e183f50b777f7b2e2eb44fe34c8b3689edecfb3b94e7e7655487ba73e169c7066b81c18ddbae4bb949c329e299d37bdec28655ff7e1fab642c961e21e88442ea00648bf32b9330c31ae883bd5a359620f05f00d31b5f0585d6883d3f65e6644dffcf86342f9dc8a7ae2641fa3f7ea8bb72c1d9229bacc2a5730d77b04b2a6f54b0f935f2762dceb8ef229ccefa06fd885b022181fe5b29e90befc48b044d4636e649500b94741b3a4f7a4098514839015420dcd3aee122dc29b2216bf03a380e7dab2c56acc8c46bdd8d9f1b11a3df65933de2a419bb67ea3fb75cf6e56020a8075f15a58bb4da4bcc02182170c027e15402a2d5ab76b41d4a1b7ee34f7145fa1fd85f800d9635066675d4f91e5ae4bfae91dc172b19e36e17831c062b2fc0437bb14c3d1035f59762dde5df04cda8f16ab5cdb981dac9542be07a330836958c9c03795b08aff25c525f0f585abd0e9068c68aa205c1ba880ceacc9c8074711180bc790aa51fda9a7897a74539f79381ac7a1b0044a482db549ed4cb0328cc51e944fecdc1b956c5b63e177aadf3f857057b1e0d63117343dfb5c1fefc3934f64cf5af9a10bb8ae15b1c3266c49e05bce2f96d87be534bebdecd0b16dc534f95697fd4d6812bd098ef3e89fdade0ff4b1a93d77092d0d7324037c27f402dd0c434e55d8a61db3c2eaf103b6eaa851028b4191cb88e32afe42af49c6e878da887e7bb57ad417b1e1c190c434d79c3ca319d58bc6c10e9a16ff3bdf52b025023788e755e35806f52f7f6feb72c4b687aa72a1f2bdca1eaef6b496d68b361e56d552a0c8c5f8c2affc345a2f94ea62728eddcd207d5c3291eb455f0b67bb1fa96fa296de8e4f0053e47e2bccb90852dba79c7516354c7feb9b39e0eeabf64382cb4571cde7a4913e254b46e912350e2d4d7a01e825571b2804124943b025acc211224b06def37c8c537823dc24d26dcd28502dcc56559e08a160fcb4f03bd10fff9fa86e6bdd0327590b603b2064302e374abde67593c205d5f73e03aead35a9041442f7f0a2e1b534be07d0209c0f432939688f4e1fe0fffdaf2395a457ebdd59b7a5f05d79139eec13585607e6ed69a1ffec0f6d12b28d0988b8b09056c7ed48c8e234962a52948842ce7d53a6cf39eecfc533d40eaccc868d0699aff4b216a8f43b94a4b84534608e3f3a97ec7e84bf9dcd5a02dd7fe47d93134abcf78184ec182c63837cb16222282a499f9ace26d59d5de962e8b879b255540291017d8c3adde725727e7276959559d478d6edd243236f74ff49f8eeec7972af6dbb73839238068ac0a6c1937d63c1c8358161debba36f18e402e4045d6c5ebcc55d37fd2eb5e20ff13c2dd231237a049bf1cc6bac16f0444943ebfdbd139b521d0bec71d38ac891763b8ac87b093d9b540dcc326381aea049ef1ec5ec701df7c5e733c6f58291da9a53a611f7ce6acfb99d45f7374f5f536b3b0b9c80756c79944ab262f9c6536a80f51545d46277ecf7fa0b569721bb207b4ce8ca4f25c49a04dbfee807bff9c4008f5e017902294828e777131fd89b032e79648c08fd457010415e997c114cbfac1a6d496570b5cca27fbe192c +shared_secret: 070da4db5d59e004607fef8f49379692999d0d4cb63dab350cf8c546fd954ee1 + +# Official test vector 39, seed: "cf520b92a2e3677afd003ec1ec6ef136a709d78f828c9c0dd4946efbd451c5faabfc83ca66f9d3d17ee4220553b7a69f" +entropy: 28f5e9dbda122b2cf8f3754fe9e0c73a84ad4b0c093522e0b62cf815d60bbc3c +public_key = 81d55ab1318e2c501e7d462cea98864e291c2c727e6ef2349332680fb06b09767a2ca72cfc078163c140dc7151d869a9c785ac62c6ade5f7519e070a08269938c7796b54b482f027a0c63ac24a6a00f7a0e7c65843e1c1fd01bd11d24ecf3c8b90cb803626044d03a39fcca7e918ae418512631898f417c9c9618055340a05f67b6f1cb7cc44117af09922cc07e9522285d16c42a7b2f833b51e72ce1c28a3ff37ab697cbd90d96b3e460c56c1734f1b11280ac33f170b3447c07f99a68f9a6f1dac6083368555782f800bc7f4409abf76b0eccb6da8f0825cc0c696cb9119340f663317913a641ff369657207194b65fa6b1dbbba94d22b512b56877120a6edc10dafcb2f727349e5831a3dc8a539c0a55a517e65982eba97930020608094b93e481fca819058537bb2c051cb2c3f0e5a97e8365a14491fbbc03f603977273a035855c414812ece238d254ba7334cc5bce7256716077766cc21c617a9c378fac1786c1cadecd13948591198682cbcf0cb098c504dc4b16a8269d13a701731b29a71432205660005919721c994011ca3c0ba8c3178a6d80b2abcc9f6e6b7880811894cc6e62c0134011aafa69568a1b95bb43c815c1405b4351a7290b856c50e284eca0cc384a4551f455b503488313a341aa25f80aa02c97b9d3267492c31652b7654621a59f1aa64ae4410a1099ed7f14aeb10485f794e61157c1563ca5515684db66eb99b76836a2441139a0906b35553c9e3e317f5e2c08487697574464a9936aaba528fe2b0c0c6b058b791d94aac3bac180b0609ab36b27579864c5bc6d8288292387dc4931fc889a45fc8bad636ae2bd493a5ab401311084fb57c6fd88c2f0c504d5c463738ba7c5a97237c1681d8aad66307ef648748198f6ea0c8fd6ba7ec424052c8a9b070c571b136cfa86f199542b12cb2a77c6973494bd41a2f0b55cb0e4122d0958026b7c54bc42eddc040cea8470f738f9c9916c158a9ca6457d8d9a0649337a3ec7347475eea8c34e8127636b3897c547c0479a1e22bb2f7606afd97cabee179467880dc02c7b6f892ff3a7a29844476fa9843943d68ba4df2db6b8368394b62cfcd257beff5b8b54150407c5529349769824af105adfabcc53f936a8a492825d6a9b1108f1ea258c9dca2d739a600f68616b2094ad29207184607985e3bb784d7977c20dc0585233131f93fdfdc9ee151c6937c7bc7fa4af43b3b1dc4774ce6273ab04736308e89e21eacfb81845678a0c220309a3c9fe3104f61680f334227670f95f2b84c137a964a0a3a57525a4b99b231a8f22830d5bc588c0c705189b2e8a19c4362cb50186b99b5a783031300a26300280f279987ec058425817327b481cbfc789f659530d9c5d9c8432959adf71741c1f9353d9a84836a5a5487392d19b5073a72869ba4e454c14ea5a93751322b8592e8566236a86c6619648be1782cd03749d9b9604209ec66804c64913a143887212e7acb54d5d995d0cb17e3e27c6dac70904235f5c9bb29d908d8098b11739b16706541f31b53e3a384e594a7a640629543943a1262558530c193d18079426708117197a90b1c45e8b394125ac46238d2e22fb8750d1c190824828280565093999608f4113acc18370509201056d589041d748b2fc71da15490882805d3d3c0fa0a837400b73d25688c698cc8d78d144a80aba8372bf7c349b9c395bbb8adfb885906402eab1ea58b622ff45c4dc14c9d11708659596552b18a3c0a1af2cd7b558f15f461f0501c409a120b4468f2c09282ab7b25f9b028746fbc9ab77af4262691a64dc43d59139c21eac58e58a491e26e10974e6cbbb82af385c4f77e7312ccb5194902257d3c4a4fa1a9035a670b5db47ee67c1b07747b889a6c481490462829b26184be3c9b0d7a0f9f2bcb10c8176f03464772479e9b84dd28ce94199d31845dff0614d02841f4fc92f9221cff071551e82dc829c9cf991e42265f94f7b4dbe7b791c244e37c3ca4192f70c32cbe9366db59a9dd8582d6e69d849151cb7c6ab82ab8e7854c7b4c15b1557443cc2b1284b7fc7b16e415007427b5a9909b99f21c47956c45e14022374440b70415b896659178d3c98bc4f3bbe904a470e4838849bcccc2ceda8b9bb1e2af29169d5919145b3229fb8c9ee705cff4d91fb9729c6cb52725321f208f2d0b39ed53edaba2c350ecba69a4ee1f3159930f65c8baac80b2e0 +result: pass +ciphertext: 4583baab569c07628c4931763b142daa34f7bade4707b002a966dae6982ec9efdbb2ddf1b82f2f9fed20289dc4851dd6a6e6540f63ead0986171ff9aa92ac558be96585eb1b3ecac469f5878a9b271f2388fc213578eb7639d018850148ed9af6ac2ef136e48a148d0f8b018d00f2d229dd4b89587782e4d3308daa12b39fba3a8b82de3e5ce1e381fa8770067ef16551b352893e21098830c2c973c04bc24dfbaef894d3c01f4410f7c8dbd7321a4165f9040a2fed09497db369b406a159db7a642fc840547804dc77050fbefc8167bc17bef43022eb0ac7badd682775a8f6dade61f443ccdd1e649247f17abcf2453ebe21c4b3af4eff0996f7b5e6024c809a385503a189b984b021e650ac2d182b947d6f248104b8592ef66052d80c8d1bfb612ae1d58e79d17df364c23841c0a969e9139068fe1b3a51cb992c255c21008a08f21f661be10c4f5199a7bc1dbed99d253c34a98504d85954ba733217545807a7e85f2d65dc77a054365a275ed9d4c408c0d10d9651c99bfd789f00a29b95c4a91db3c479a7a759ab00eae24ee49712984a28888ff16534b59c33e160fbd8980ccac1fb6a4c9f20761d9c7030974ddf02346869d9a95631a9bd3c87c3973693a5e6c249278f3b85b7e8011285e6757b908a8842749e93d8568e8cc570dead4f2d86ae4fdef2852f156dc03204e32c1c6946b9b7aee25a96ad20e122c52e6fdea2e1e37aa92d8f50b62ccf4cb3f44001a1a7ce112bad5b9dd005235fdace0741ff622168204981514aa2643e3c2c4c03601e3bdcafa2ba76bd326a86fc8334d2a3192b4033316b9f02a7e9fab545fc5580680363779137be9c49329d1264279d6587f1efc8a1591021b13af1627c172c1279ec61b23d51191efb898d8a9214df1cf7f2b1737a0e97aa45e813549f42e828f90c1e914093066a0e94da503932f931ed491bc43f4a8a689f89ce5e819f0322464954eb154046d3f6ff3423d2a1dd928a1eea9b496e64c928d18f57953b009c74c9f3b83ed0b6b9fa99ccfbe79c47fde9b54e2df8e819488cc5534e8c61dd6127615f3442384a6770ec9268a9bff0db2920ffb63c8b0d375781a48d4a11d08854f14bae1d25902e54900568a46e3916290eb3e0d7b47ec6669c93ea516fb93e7228e3723630247cc061404bf2a8209dee902ed514efa1fee05dda7daa39667c3b06b9ad0522be960264d4c06efd899333d61e68964c3a1035d95f32a4135da95c720958016b5d17b6da0931e95921aaf48ddaf762069230dba7f8d570cf42a78e0bc82327258b71f073071b8cfd69b24f3de704173fc3157c05389bffe6105cf0e81602600e18a0e3be22e052b975661db56f3c500c1dd2a99258b203ee2ae7a8d5b1b91fbd5c5d7c9d6b07f64d860c8721dc51adaf24fa2e99ef8a80a5d41c850a255be2b686920a64a69914071be73a460e806eebadbdc5ec665a4f26065dbaf0b9721206f761376f5709bd4cb34af09208970bc1825e460419e223c960cd7f7fa20a582ef9ab90b946a3017b375763265f8118056c7cb929f1789fab3b10010267515dbd9e3b0e0ee4082afb9f780b740272037cf0b83df078d4827ecea5dede4352eab5f94edce1e88564311e91d2cb1893d4b5ecfe47415025fee66241ec51f0896872b298231a222409a9abfb447779c180898209df96a4639284bac56d8b94f3ad67996eb877f01cca0faf9be45d540e2b350c7ab293cc3d0c49711e2b7d7856f0a1e297e21fa89a474cf96e2a1028007f2d472f9ebb4bfbd3b3dafe8ddb17c574c09fb4d741b4480f2e525c75a712d6127af50d95ccb4622d344bd9c2163b9014be4a050cb6ad7fa065ff2464ef4575fd208f910445cb2e0771aa1c97873ddb95a9f0b33c9936b4134f06adb22cd00c3ce148ee21868d30e890b44a6c4cd1dc02d15a4e6d28e31cddc125cb3fcaea52a184aa041708c4bab098e387f6b4862c7569ffeafd128472096841596a6ddebd47d4f92719bde6e6d5651943b68c820b6bf4ec1394a259651d2ad460ff28f2a2b9063c686f3df62c6562e9f28ea02568058e27ea9f2519e7485ac9c4028be344ef015449ae79874d22b02d94c9d6fc5c57cd49e548edfc703fee0a68bf7039d8ce4d3b179c0df80270ba9efe440fdc1a31120aaa88992dce10110e6a7a845929b86c4aeae473c72ce6abffcdac33f104a817f86a8d470f0b8aee3 +shared_secret: 16d4d64c78114b5fecbb99dfeb59623cc33725e9fde5fbfe1f805c05ea7c6c4c + +# Official test vector 40, seed: "197e5d562de7e01bed4fc597db28dc6efdf0179f3a5bda5f94caa39d67bae730540534d59a7a06c8448f628da8b7859f" +entropy: b0d713cbef0bb1df70cbb425d1e9373e9f7790fdc7980cc96a240dfc53f1e8e2 +public_key = d4f7656b2b7819120a7cb68a80b91f2783979e1a329574272a3b154b52843bf80f88d947c79a58ae555e819674df71b13ea48741d103d345a8d4786eb43012fddb0b01c3baa6a0cf128b099972449ecb3de50020b025c486b4b5b115c78d927fe5e06bf8e29068d0b3d963c3b46cb9d1ba3256fba01f2185cb566556151ed2e1c993469190b75fa75259a5b1096d5a1647448013c21eca67a3aba096a4dc77f35c2447e81114f732148663a9439b1304b148b813f12c61654688d35318b8c0a8c33738a2f1bd2a1b6e8ea93eec771ec8c0094d4c6a45ba61579c72c2a41ffd468a6c679fc3d6b15d5a549b1614bc8874304bb6f01b775511ce5bcc7c055441ac72c34ca164f461990a57baaa98840439371c26134500377b39ad6d222feb0b67dff197c550541b63173e2b1b7031b30cc3772e97734ad3c5b6243b3269c48fe055a82c9f4d1c166c294b8077269304cecbc404ebf8bd82c041c911b09fd7c2cee33fee1bb754878d8143cc93b81c7e99323b5210e7a64c7a3b8d96c1594ff3ba50132484e663797246dc3238a1eb743c4a33c51c6587a224bec9bebcf5ceaf175dd37c3591ac7d82512e9ee7c4acba2cf5bb26d3a2188be321114a7724c797a2bb26cbe43b3fa03a8bc16dd5a49a68544e9feb51786c46794c9f5239b7584acff68a2f7561bb05e6b5505c249262b509a922e97c40b4736e8fc2af4017acce951cdacb3385f060cc1c55a4f79a60daaecc939036115d2f480f6f0315fed05387e99f9448b6155a51d66a6940519b361233b2b7b34c740f0cb64a7cf0bdc48677292b0d1ed5898ce928e9040308807cfc730be0d8c614d322735c1af2d2199ccca1dd80a96cb60247125cab18ce7a1c5e4f0c4b978581742c8550cc9c84b0632967654b968c01492557ba0630ec0caf04a443d9b2f616a9cb4ca13da38fd9d611a59bc697c20e8eaa0d2b96aa2db111bba3a05fb463bdf7a777cb91b1086adce17ded04be8b92254ec5442a6852134b5fde9b060fda258c18740b79970dc981cdb883cbe3297fa33ea988b07f9a581bd086d53507ce07536012a211c6b4de17b73a08153c3514daf12185416a81c61fe255a3e04b33e3c5a6a0188f6e09855ba504f838cb8417c2f0e97bbf5b937ff53848031274489b5366abeca2caa7636cdbe83f15980c02f207577b5efb947692fb40ae7b36dfa83b728478f0541511fa58aeb121c14056451654d0dc4421695864db64bc271a79ac0beff724b6bb2290cb64087b72297a6c3881765cd909aafbae72c9448b232093694ce522c72d2475f281ab1b633432175e3f78715de1082df66f74a351903b115d74489a32bb7a873aacf195f8f043922272cfec2798f52f65f4638302c62648199e7979f4740b30d38f7d794cad179ac960c838db4ad7038ab84955960b4822324c5d01c5985ac8f47138bab522db895af2f9a983494f360b061bc5120f385166a5ae9ab844c278008e47b655570430451cb606c24840b7a0e51268cba81998697a5653e33bbe47d43edc3249c32964e87bc8ccdb6d603c0f7387306b043fdb343e8500aaf0104683dc9488b0ad3d04a1c2657f11a99d46b040d0950d0937a4927012f4a78ee2405eabcac445845d7e88b54a8c57947b7ec0c12bf654059d93ba38ba2e50ca3fee8194053b2c9f10cae8c846710392733123b0eb0ad895216efac4931cc782e886fb2c87bed305cdcc690dabbeede21addf7468e4873919865b905b3149a4d686b7c96fcc014b578e1d36bc3b63449f467b09bc84a92b20b01bf70200e703a0ed084c860f40a336576274c7e5475835bcc8ec515050eb8215f397f6312c9b1db1ac1da29ff90a4ed58b8f8623d4b893e1ff94e3e48a0ddc5c221c0b34a798713897bbe16a4c298c5e9f44932b09806e554f76b76fdb8744cb38d00f24f5cccc75dbcb3f81233c454ce3664a807d82c68255c422866cec26ef6e428677b4db8f712abf50c1e11c9f014b9ad59077cf0475f925568300c49c08e4e17cb7a5581ddc17331eb3bd7bc04c933b646224d3386a3140cadd445b632268458f63942455ca1b164c9ccb2ae679ddb12524c34cf823b3626b224e466245cacbbcf57896b7acc6f6b702ce9000371473c622303db63b2744c7138363a832b2973bb3144bba8001999eef108e317890c4b63e857c6de99266629d3267db18fd97baa47b2da64fcd1 +result: pass +ciphertext: 930ffe1df39f897e44077f527157207b3bde1ab660a8ecf9d3ec21c73b991ce3f65539a874da5cb458bfab7925748164205723e059a080ec253a8cc03257a7f7ae9063d457578a4ae84527f7ec168496478289572405bf84a958214a776650db772fb8b4123abf91d396bbec103d0b5149ebd23148f2d97ff70d7979d9d0561181a0e8d866f8839238ad8281d601c9d855db0917e5f167b99c24033b44c598e0fdb0b1951d18238a2ab8c0281bbba81761ab4bd51ee9ce5e0913c76228985358c09587ce471014e21ac316828cf2e8664adacdf20ce6f7930e3f6dd9033b3b9f1a37d28f8905c21c8e8a826c9a9442ecddd9aaf5ebb47c5641d7de702811649b1aaa75b13ef896b296ce1f2af0a69b746cb8b5043a986b1320c241d42b6d1e61aa55aabc71206308a3735bef5879e9c34ec697233c2a7eedce55b012d9a1139bd3c03c4690f89fe825937a3d70d18fc14c1e067c9782018e62498d609424f34407b74dc3ce04b7e87ac33e877878c8b8ba19cb3da78bfb8457ab0c47a4e307be49fbfe8a12af06cfecf8784e028ffb00d181bb705059eb841d51af8c606cb241cb758c6ed3fe16bcb87a5534b4f805675dc03b47413856b67555af680f43f64b7b5b0094f70ac6555e0b517d0f661a0c9bb1d3e38730d434f7364c83adf7da670f1e2a26441c1c856a722764c0a6941823333f65e82bf77949e104daf3d9cdede1fdeab13e8a6a0142caf8da3c2d66cdb9c8726b8a85339f0f27b56bfb446d52e799de9bd0cb33ec0ef5848982c4c2dd9367e7108b174b8d3b3c3fb7913e55bd05b0d5afd3a035f24ab614698e94d2ea0ef5288a50fc98d521917e4be40aa038fd3eac0e7594f32aea68b4a4b046d89aad216adc9f9a824f0ee62ebba49e2a170694524d97736be4cde034b576590e3e955a946acf4df8c5d3c794132079dba476fea76b734e8224d6534a212efc7ad9af83c91128b8c7ab3861d31b2e6009c7d7bd0d1035b53f518e32d442583981ac415d9037901d222b5d20821c80964400534ab05f5068feef04256d01f30b28c66f5f83191765c54547a8c6242f55a0c3d5097593cda695dc83f646153ab958d8b0db0c4a5564399304b7227b0424863c57e8d8bc954df042050e8de966c2efd63a48ade9eca925137f3bb56b067ccdfdd44ff35a890ca7fdc1a8a86aac65a6fa5898a6f287f73219b43a0474c246d686d3654322e3f21de06ef63ba6bbdc85c168ffbd670f335dd9aef753407584ccf3fb0e96bee0031bcdabe0b2810836197489dbfaa17903afcc729e56012a85d74a2ab94abfbe89671e9c67eedbc91d7688c6e34e1473424e604961976efe2c7f3710016ab858e3bf1ab984910f9f79884c5817cd2052c19daa950f6ed873c9e52c0bc09e7cfac132e864aac204b0059474936eafa4b36a5a017383c6827f5b6b194df7b6bf8d7b420331175e35eb7ed7d028dc956920d4072c2d8a51cd306365e09145bb2c57c56aac1ec5e6147a73de749de38b3e635fae41402df3a0090a39ad95fade379a9fb3ae3cab24c04823f9e36b693ea722e65d53b7f5e6bd0c4a2f3fe760969e0b9f03317132812283f0a4b20b277101b2cf8b37e0e3d2a1c23aac41515348ddf0db3758244ed476cb6af9ec2db9b68ef1dd3196474c92cff905d794cb5f963ea78173263465f1781bcca7430e5e1776de8962db7ada24eb5c31ab574469dd5336c4b3efdea3c218259cf602b571c0cfb83f996fcbb6ae63ed4b7ce80f4813fae069bb8a6e296ad42b6ccb5f19da19db41aef3f10d7dbd23dcef7673ac2cd56216b794372e955c197d4e88734c11166f60d753341b76f866322835d226199e69bae5c40c45dcd20f8fa5f83438d760ac1d6fba0b8560c36a423ddd8980559e65ffda8d78c639eef3a36833f6bc9efa8d7b147156e6fda7cae1b30d98fc4871f4d71e3f52d0996b4ef746653ace05b60957ecaaa99deb58a979fb269e522606982cf00205c6a9217366fcb0a24d366f2861f8dc538255bcc24199626fbb4cfbe74b5163854501d5eccbd95a3aa37bb565d7d4e723732193069e558e72add81bafa75fcca810c57611c181a0619035a2ec73db33711f4a94d2507b1e0a0ea2eadd18d5ac25803ee01b4434eb7a4382455b00c3710f98d85281c1f27cdb212eaf82a865d0b454064b39790efa2d7c93b99a22605c618be3f126eb4408b9 +shared_secret: 7822319b0d51be73985bf8e42d01dba870be788b62f9fe8bac94a109cf202111 + +# Official test vector 41, seed: "f170583cb451d8a45d105457c02c01a33a40350616ed8515bd49067142f61efb00f07857e4fff3fe11e7164c648c76ed" +entropy: 32bdcdb7059fe27f6409901980c080308951ffd90deffa8317b4d213a5f04495 +public_key = 2829b04a621a204a4e63a2308d728b28c16652fa939d455181fa1b7b44447d1abc83e46f9d5c4133b104cbc1369812bbf9e83ae1e58f66f8b7c2e56d902cca69dc841f31372b783bc6421723ab0b2bc21cebc7cdac0cc3c55a3a088c0d21a4271264945766740af06ffa65275f9c00b44b1b3e6823d3c29c0a509bcaa2be1486972dc178821c40a203849a3abef402408ceb1e543c3bef193417bbc0c5679c13074063e83eff63af43464b3ce47e4b86953bf21583c2515f7b1025bc0e50454a08313e915882dbf556fe9b18ad27250030723db50e5dfb2380d8b74874c78862a1bc9083e1a8438e546ff9ca64c4a53bd17c1558067206056a0f222c8a4a00b2a92631179b6aac71fc711cb635b008f28cd69b51b5d7aa6839a1aca1a0da854faa39925cf606ae20612fc9c7573c73393a033cc8417d427db29bb6973546a967354fca3c43223a657713e150262e5621053bca46931248386114564cd4c0861d4ca648e789efc4221f7a075dd8b119ab7bb3f467abdc6cd3c808d1586199ea7be6e75c03916da4c012d8e81843f472c8504ff4239d3c0881e0e664f6e253bf2112beb301f19774e6998d4e8b68332346898087f1b7460b664d5d10b1ae199ba661cc460685d56808d6e66f3a78b6f5382ee3eb945482a1419a0a509a8909e8ab02990166c84905c7533159a9dc447f11f649e367486e2191a6c48b61331fb6137051b1410467cc440c8d0f9c9369b8803cfb33da7416dfc47db6726440028b23807c0f68804915a09ab16c47287d4eca5f19b98839030e9606815629b1e153a5cdb954f6e3281749040d91061df4afb67a5f8b19b30abbbe9b4b98b39182c4e48d514c35b515cdfb5bc61553c7ef047b17ac2ab3d10fe7d86a78386a0589072fc58983058a6959915b12a80ec79035c660afb04e9670cba471125e7a16d9fabea6ecbfe1d18904757b0bf6a459f0087dd193be490b4bf87bcaf772547b863eaa703ae18b58926aee14cca8015af2939a49e29d546b968ddb17eb62b9eaf9ce53949e7477c4e9893a40766a4a15cbc392c73b313a0ee3201431bf3d5555dcf73174f3299c2b88dfab4430c08c94183c27d1035c78769b143563a942047035a6c2373a03c0bcfc3973db4f8f25c002c46376d6a6fe103bc641608e98948d86bbe6e89d5405542587aa4821c30ac8756f07c593044570f536b4b07fb14b3236422d01789822aaa020e4acd92126809b2d47f49049875c15472a37b4b033fcc260fca04ab629474c9b82450ae6572d891a58629caac895bf2f52babeb6974be787397243b20a99f37b52ee77934ed2b6157ac3351b9c0f3405369885a54bc33b2c487200ba8a326b9d1674209924d3d50527517978eb040bf85ccc9569a6b3138f072084595825a994078a09bee86ed1e75ee9e759b31c491d9292fd2abbe3cba62661ad9440bbd392cb7d303cfab4bd6b0130af1c3336e2768907aff0633f18f9bba3706434b3bce7c75d6c40753b6bbeaf11c47773cff33b5067890fd5b8548e66c33d25906a066bc421617a909196a3986d362d3b80095e1077a5a087238054f2d89e0fd9a0d570c5ee2aacd3abc16111189aacb4d2e911abb7aa5099bb4a269d760174c324094fe944a4dc55d7708395f6aed8654831f7c3ecd85baf03c44390193634b16e1c91aee33979666edfb18d7713c547a90ff9514ba6469e0a6716ff4c0420427bf00b794775043e162e798871f710c87ff423d5580d873b7f624c96c7d63e23ea02b1c800914a5836fa73d7a748472b0b7af3099eb933f4a440ecd48262d4c9de4c044ee30cc51877352b53b0c1c14153c88b44931df12ee8520cd07117a1266815b74a431652d33074921c1d6dd6c0104aaa3f1a84e2f7cb24461290fb321d706113b172a2c7bdee921dcdc31640f9c749f4b27d024a7488728f605f8ae904571062ce9b36c009937f51722639782d56496fc056b06b8a4a6c3f402649e0c15eafa83e85a40eda43433c44b6d8f037487c9e1b66622c6798c94b9228c7a52bd18360e07ac4b057218469ac09b397477d7f5325ca47b901d0a5d0b6977194a12f71abfbabb3d910a8cbc52ca0dcb4f9f52d36c22b71b8513070c1c6c9a33397c79e4680862196cc1c3baea5bd04c58ab295b5da152a98a6ab3035b2c48478f30cdff392b47dc011e8fc82e0914e5ad3c8eaf0f76a57327c62bc9d4d +result: pass +ciphertext: b0ea256858a3db2e3e527bc33fd2d678666174c55219aedfab289dac80ffca03e3731f08f3499c6d0ac86b8ca457762ec1a49a8895eaa6a12e64314b43339e7b82b48930f148cb42208d507664f0c5e3d66f7ffa556a7370fdc4a1e07616d0ad0b482f624ec113d2743a4bbf2880bb9235ae5502c994ad277164d0bc7f4779cc1157dfcef551015d97cd77c8fe05c547be971f1aab0f0cb615af80fe622cf6188eec57bc3778ca72858ecc90a05ea89499a5b2a6e40b56b61cddcb49327920682919eee7abd4fd4be3b7e9d53ded77a9e5a543acb6f8abaa0d330fa8916d18a414c0dd4883b7b1aa3b1198e4339247aca326a757277463f2b414d46bdf5df3681763509e1c55ab13918c4b1a78516cc86403ba49950d1065a07f3cb124d059e5fd71d0617ea447360d6dab6524f9db46dedfbf4eda60b25274e14001e5413bfe7b7f0f3f503721715a03dc853fd7203b57c45237257a329d6c2479c63b4772bcae7761eae739dd12dc65d8d3786a8b28411b296633cacbe75395a10b5debbec79ebedb3993ff54ff04bf21cfecd4df1f1d791f5171ece67ab4b9d2a96fc8d233a778c9a597b294ccea9893bd9af82b4e2e10b1c159ee3cfc0f5eb867fb929ae518dba18831905ce0d9d3547ba1807dca5434edd9bce57cc1b83b8e02db852f63294247656269c5787b809a9358f96faaf07ec14731569e4778cb02ad894ca0383daff978a0ec1705bc12509cf33ef87dfb76a897f939cd9cd67685da6be0ee5de1eac34df23b287dd823bc13e1984ae9091ceebdfa0f404b617d1d973ecb8680886cc6bee5bd142b7b1d7dbc611afd3d54d14f8b2af838a862982ed0662b7c35d4566be24bc10d8d730949c372a5878e714f4750d276589e35d490ebc84444bfbe3eb3b9217bbc011703471b2cd518800b4d2de71f406cb304c11c3c33402864f81567b5a8d9ee510c7393726a8144ce5faf17ac318c117a9f8dcc18b44905534cf88894f9fbb9b6075821b306911a4470771bec3a1b3ec97376b4b62fd56a51a6a94cd74c75b731c53029a2cb1f3473ea2991d5d02ea7572b572381bb8d4acdd1844d1a9399cd3cf7b8fe1fd0fd3dbc4e9b15c92ea94f1174cf5ac0401bf24d9b2bc83aa3cb6e83d047e2b977ae3524b4c194b4a45a261743d055f73d39cbd0fb6fc80e65db7e738a42b470a075ed208aaba0fed3cfb695e8f5a1d4443db9a1a8c0084587657b8d557635abf0274a00fb8c9e2ef84efb8115547914aad99d18bc91286fd881dac92dd2a2edf1d5e6362b1f2b35a00bc22199b80ac5ad5ad75537466edae8c45e92f0238dda6a2481e0076a625f1dfc9df3ef76b2024252d612926105301f508c045d287e379391e86a24e49ea23ba017c4b771b7b77ed8a43f0cac5ed918ffcf5067ba2f59e449ac8bdee9cc855cee5fef36fa00bb9cd53aad816626b4f58d8342900ddd5133cc98a746d6888b86e420affad19b1a20b7ee43a30cd54398b6b9bcc7d2788907a2132c0832b032b46e189a1526ab44904275b7d1ec753964f739b9e9c2241a77978552e8c4c1417e9126ba10bfb854882a778b615456dfef1f5c50eefceedc61e4d685e1bafa09a1f38109eee2b047b7954cfa0937718c21c7ab4c389a57083ef935cb73179f4355906727cfd4e188e60e23c1b7c4800a783b93a8a22f780ef49f0b15aa58bd6a3307d6ab2aa2d801ec897834d431e23a54a832f515522ef77f608a222bddec7c545873c9412de81151489673a8ed28c7b914edf285f8afd4388bfaf257349686d840cd838b00dbd9c8d156768bf0f0c7815d6b4bee3f866aa79c07e978a58e5c9f739cd7508b1d050244a309d98155a711134f4f55aa1c324df55e0f39bf71e21171e2e540ed16ae2ba99f6ad2cf267a7f6f5770a5f1a33a4078c0e9873b17e23100f312939b92e70acf195a38495102f17ab500f8f02dcbe6fae0b02bfb9d290e1ff57956122dcf411f1e6a41e47a0289ff3aa76f94e565d86a0e13f0e49e534b9ad49bf538e53e4fddfdd9b9655482a5d935c38949f5d7f2885be3e80aa7050bce4e5b39eea1f966452afad6749d44f7524d0a6c8906acc07fcfc85fc92b5d1d5dabf514ced9984925356043b3091d05e8cb55753e699f3c1cc0a9edc1c0207c8ae13c1c29ab76ed3a46893879413007d84ee61de5f9b6acc654b25c994af6054d092a482057a8ac6adceb +shared_secret: 3f338dfaa091406b88dc39f5e82ec7582b90e4066882aca5ec4be352d4cff72d + +# Official test vector 42, seed: "44a6774b2cac02dff210ff861a090561a453db311f47b6fedb81811872d5d9489f5fc4103010139ae53fcaed209dc9be" +entropy: 4ed7c92d83bd03b2a25b567f17ae55542e2f6a4308ec0f3fe69f8ba5ae24331b +public_key = 68d31d58c83101c3626170b992c2ab3c181f3d58b554249aa9e73c9e691be2c6c402755ce0737ca2e2524ff59d3397b417965ed4c547f8dc97252c58f4367379f4bc9da75b64b4a40a329952623f0615117d28af7cfbb994b8ad70b2540978242ca0609a082dfd70aa5910778fb1cfe537c5c1aa5612029d9b972aec8235466098558c1bb4fa2b84e1cf9c16300035a57328b460b20facea43d5502958b968547b60a3c9255ea20faeba1f4e69cef343a6f3793d4b0418edec073909b6786a38fa3337c61c8f7af5a796f41a3731a4ca6096382423c941616452b6a5438977445ffff43d54e7b787cb9bc6c95c36003d87b9bf08934996f7301618c5a2a9b6d5d802d57c02018b44b0d95c5ac1c46b910dc518277be4c8960400b14c51eec975976975825b2d574965c338c121a056e2b9c9cd88ce4111c0eff01db722734b296540ab44a40214646c32713c87bba448d349cd5b160db48411a77593886c81ac1b59d10b51e8338a4178082ee858ff3987e58cb7e2a58cf23c28ccfc6141270c5ed0b883d01092c3095f0abafa2c43eaa7181136bd6e2b0c332b3e78ba665c73304df21d83cc3915f9c8073b7d6d907c13bc4a295432fb0a894958b98c9629d6a025e3368fa234399ad0aa5f8c8fb54b9af1d3a18d1a7ec1b22e7f5056c0d97595a801885202ff8c9ce2315ba340924d1c5e2efb2de7c1a468b684c8f7a363eb98dd4cce7ddab73447a5d263b2cfc4129be74174b50ae359c69f086153ab30038a13ae21ab5ef870c44490990806c4936eff553ccd9ac01d90b1e3d54bbf943b19236b935cafefeaa1059823b1d928cb77cbdc0ccff4024e79219852c0653ecaccc3d9292a18783c10cce69732dfc4585c8a45138ab94ef2c84de2aed22b98bee16bef556331e56eb43c3d92e55a7c1bbc0474251a70ac72d5cdb9b2a9ebb9be53c0cfc037c1678a1351cba5e91bcf7147002518b8c8933cca1c34f9da03d2b70e885059b259b499901b98345aedb9075aa1686e36a85c6337f01b4ea2f2ab29939eba618c68c5256eab4e6c1a1beb334f93e99bcf3cb31012b1252537f8d1a589430b46e487ad07cfc5c58a2865b0a92a621006248a46c837f095109a3de16b24b2339a509284c9055778816e9656c743a8929cb622f3e34f0141c820d231501c920581bc259c8be8b0928b58b6f1e2b34b628301230fb18c3904741a0f061cb613b560e972b406c44e154724f6af887a345acc63065481c4b468423742e742582386c00f2531c67835f3c679ebfa9aff871f0b006c461b760fb3171b99c9cc74a5378c3ac78c87c847a65f4bcb5043a551c223418114d58bbbf6aaa4422aabd4d70e7d78a61fb1af33882eb5bc886d154ee032b0cf300efbec2acc811ccd2c6968e90f6d146dbeb0932a569896f96a91ba3298c57c5ebb4aa130a7730a996054b9c058057fdb41825a2323799bb0a51fc0018428061ab3f3c12a6479c3367810acc4aa869867f5888a90a1ac51913292a194f1b3d8c976902221d3b0c607714f4fdc8196859c939b499e511f54e52d059a25449068c39081dd59624a6515e282935ea454cae482ca990a378a3b41e0b0adc6702a9533c0c479a4f6176be1a9a081a357f5bb98f835ed13ca29eb969f3a7c759b43464155ea78067752534d1044be2501c38387b31c662e6b9cfc4584e5dc43cea0805e273d9e56b71fc924204c8ad82ccb315207afe34efea97f72a21760cbb629d6391ac85fe28ac568b1b96ad8b888c9cceec93fc08825429614be352c55ab218383ccadf0bad13862778bca36285d67381164f5853340c0b9516ee3916700f4c3b8326e497ba7966456b6144b87f70c89cbc07a3a553c60b80e01c0c7e9297ec70e5a3017e906cf24593f86d3b6d1db26004b8ebd7047339468183c20df37055637995522a8322b04618b123bb3b1cbf765beb8cd17a302b88166fb84a9bf1728bfbc57853b7de3f113257359f6b7835e9953da123bfcf545e5e3541c8620f5f58872f1192b67424b5a9909d5324a342fc74caf906c69fbe3b2384a2a9bab153439241d6065e0f944ef67c4d6873635b3650bf4cc4a4b879cca63b6873c8e681982e4a183557e0465bb0f60a8b9d97625065d4727731e173977a95e7bc2ce3494b58071c1b89b1866c85ff814aa4843f7ab5bee6124c2166757943afa3df3d5f59581246cddf8777c228d +result: pass +ciphertext: dc5913055a1ecf9c95b554684a294b4a03cb3406842c86ee29ca36f740c42c0e5580dab3b289917c7e3378c630fe329bcecd5865f474a9470fdaadceb4dd94fe7dbe4e1f0cb8bf149710c96080d8752e5bafd195e916d5ab5a9af587645a3e982ade25373bd38a93a14b5a9f09d13ff95a2943229388a420e1592751b2adc2041091e265f940d619141cc1f358b91669b5018757a71bfceb76fd04700842a9b3a84a238e4677c1d15374a34c0302b0ab5d907e0ef4d43b576a839efb86df9e093dd25d9f4792a31a3bac22589bc68c500603afd6ec99044ce0f49b23afad853b45e1ebaf9f5c63ac00dc05d4c45cebf345146d1ef38640c8a3f641e21612203f503c181c31a43519ca123b3122897456a83124b4ac4ed88f822bfcf4fc2ba8df4aa9bc6cb6573b8585558775eff7e84b330f25a5c9c72d61b163f2e0448a2a5fdab6e3aeb4d97835a1aee23f56281618e6df02ea0094273728342f8b5651fdbb19e0858ec10c4d2e07535d3d09b7a2c91b786665aeb0b247ad1abf4bc3297d7de00d143674d84d2545c84ffb166d39b8a0664cae9abf621121cdd5009eaff969ca3d68a2f6864bf9aa13cc500a08d650914e36d22ba7e7b485c065432daf4791dfd606223cb66b6bcca6e90b3ef6603bcde3dff4cac572177bde955695f0d72bba2c0a06b65f22a622c9ea109fdf051411a06a295a34265ab8a733ba1af947984c8b6c3ee8aed5bcd25ff26ecc46b8e70528a38a86c1de5eeb6e5d37147fd8ce1f70999f5c59602418f16ff49622a3d0a5a02111f6ee16cef7207ecb3d651290434f962b2434e727a277cc45156e826d3f1d5cfb0b1508781c077c0199bb567d545312dfc0f9ab768e02db41e9c4830cf65d047ef6e24865f8a046748279ba29cbf078e05bf0c63eb24f0ee38de4efa3418f1ae1f925c848cfbe8fda802dff00516e48e5d77142f0861879d6f63292cbcc2eaaff23224ac5041a779a6911ceb196d4b747e74cf4b770e9103f0934d95009d5b196e7110532a489b78d6e6f084af9abc6612dc01addfe8387fd4cbfb826a816f6ae28d88a451db79f5164db33b82c0a4249005be545346cb91f33ef9e941faea2a64984f05d777c0a4b5e34400cfc8a181fb385a84099ffe714b91801bef493a914355602f07ae87f57bf07aed84b7bcdac762a670d6b6674b9cad3678b880005c515931fb4c930c3a4fe48e1d8ab7f35a352c6d6c63f122a01f6138b36fe0ba8d28203520481496cb6483005d9b00c6b828b320344bd9a2fec60525005cb1185b9cbf14b368a096c6a676a79869921b72078d21a3f00b154a467027663a1157c14138cd60a52f691e156c3407387575bb410301548042dd9208903ef2164522e32276ee0497a166624984747438f5ff6da89d7195c725fb80680bbe9ca6f98e2de2c791a966b216d4dc8096acc625193f550bd84000179de531221763e2fd5604b7a68b7df8e1ac43cd2dbdfe0046b040708010b7be729c6c6e705def69d7cee1465dbb7af3b4a3dec9340dbfb548b153d11e816fd9fa3f8356c0e96f9d1c11f72448b631b63ef1eeff4ffdf6f7d66163dd2f0ab41611addde395562d420cb16002516acc8ab40cf12f76f4982cae50c0685d70371b54a37716e5a950d6fce4f4de34a8523654e840396ca498ea90e044cc7fe019204133a55c902819496bd4818528cb364a5128ca1f13cdff549839669f3bf8f0001c0020dd1bbf91a204abd21eca71cb52167a058b21e35122b9015133a7fbe038cd2bb57cc46a06cee96de5b0f09ea26354553c6fdf4f00bbf750c16d452f20043dc5b58e8a3ea04a19905a39d7174cc8a7af304c8c69f3e3c7f92a6d450f8820dbb906c98842dfbc66964758bf1a60892657b445c9015f4b1f3b7a720c63454f61ad925a60ca5288c490f5f47de14a0b880b19fae871cf15e67e3d8fb7d7a11aeb91ef8fe0d957bfab406200a32d83f9ac31a4f79139005b8d3ff506e65556c1df42ed2a723df287890e11134c0cecbb80e44d3e7c1590258528e2cf2295acbbacb41a60c209e9e7d62fa70393dd3e16cc487f40e0425654fb451680fea99406974a01fbd4054b8d197b99c81c1d624aeb225a1c380aad745be460121886f7eaaff265a237c25566315fb8613a623a8de975393d58cb6af63f4243f12f1493a6558c33b383555076c1bbd0a93974ac38e1012e6cea25d54 +shared_secret: 59c094e831e466b4329ecc5f2f627c2bff4d0a1f1f3454f5b052fd1be7d6358e + +# Official test vector 43, seed: "49e1855588b6235df2a400c4a70aedf8ab17b6e5e2891aa745f132fa2e7ab0c8117c1df37c39f5d57624eb77c2b4a091" +entropy: 060ea5d2ed1dd88144a9885e79278590821c22917b55a48920f96b53ebe0e689 +public_key = b2c2247d98c617419adcbb5027b320e54205ec3b9c37fb528be1bcb29624f0851a9844b83c5788a2332c0148c6c982be4ba98be6d9a54623b8183a66dbb8456473ace4f18829a56d1523497e1731c524ba3545652be97aece915ec25cb8c18364ff961dad655e2d08e14293a77963e4154b5d52a6d424a3ff976b69fd6c073b7bd960cc397d7511f76aee624240cf6430d612385a21a33838d181c3f77197e530463e952662e512a538b81e72913eb32357577319d29599ea2ca2e088c91681ebb295c5fb3c4f11643be6686f62b259c737c4ed37b38901eb7a79d5facc426438f6ae228338439d136ab68ba7ecb760a3b45c77f186c177c2f79f47f7cbc2a43da4b94371e4ffc9f8d520a9c1749d5b63b01a2af5b7a10ee47505598ceba4ca724f22fc15626a5243895db48cd2bbee25c27b171c44fa09d9dac21a11803ce0a6492b72d16803dc793cabab535eaa44eaa14b2d81a4162c32e73cb38a7bc945d0c1d6e0022e2785093d66c29e31616ba7ea0f58def02339ad231c3806600ba8612080d6dfbb50353b0fcc98dcab2c07473b34e05a556d777cb1982bbe521b1cbc58c680606f352b1560e7e4589b905b50c299ae8d3328a3729ac0420c3d23eca06491c43ba8d72af0cab1a869002434476bd7527f27b751c9364670a3730c52d514454e03386c66406a4b4315c8201db561e9b79c2ca4c60b25044e6bc1253465b4d0206fbf695470b4b7b8bc068d391f5d0b7e9d8028f1591ed916da33157cdea92ff46ad98d18e1ce6c4b2f75854733e913c5ad2d13e23ba51b7f8c2d3cb0edea793b55acc3995c97d3c65c0981f12913c88b56f62623f41e85a84543d4e4520c884981a3531d200ccbaec0bf1096fa7ac429a9b3bc1a2b38de159c2139361dca3ea805d97e67f61d10c0911674fe148b33572797ace2138ab478a51057306f010661d569ddd9a4e55e73f67f25f0db09d61f1951279cb79d814d1a21a4ff311be441bbba97d81935b31bb4dd558544babb18175b893357504589fe79170199129e78874882aa89b87c20bb03591f321419a41c1a78f87016b4e551c6928a37fa7c60708afc03c8b5b17001aa3088dca6ac9ab93fe5665f1781e36d7813945471f6945198983815c2737713f9c53a8e717bed4d9a7a706ac41d339001c5d74548388a2439cb0142bb6bcf2e23442155adeb4269cb39432d31455f0191a25822f35c889f2962ff081f1c1b5c55b9af0b14a414b618c7366fef512d94077470440fed7c2d101b5c9ec7b79ba17cdc14653b6c3179261a9401a0b20bfd201bbe243b8cd1322fc872c4bc29889586a8e302ac26b043b605c13c1300a68c95f269b2ef49402786819668e964c921f765abf805477ea239d3b8b203c7db303afe5a8c70158874981c663f1b3f8a645991cbe42a2498beb4579b314918c85a8388f31e628010bca96858a09e49365725b31d0726c0379709529c38b47e15678ac9625b28a763b579af908cc1cc45a5ecb23e5a6ced504b9e3101cc562be9714bf4931cbab020fa3e10456d23d2d01af6dda8dc6e09ec6aca54a3253f5d905d4b34b66250f80324060b1609083028a63aed377a7cca6a929da786eb080db750cf906c98eb9a105f288a36427519c0087e300705524ac343b2c448ead7802404417cacb6ca5a398c7e9c2a7b2855fca298ab1bd0fa9c23af9c5079496dfb2996a3738d5ea37ccbc24f1744eb9f5c672d74968c872392480fba91daf0c60fe96b13828bbefc6156f860ca304970de5695553a631a10c799b29b2585652065f33c6b53179bac6473b4dc2b277284181c7a2a9491ea422c5087358ef8835bf5711df91b38ab90000d324e7b6ce841830bd952e18583eab6b6a922427b2d094ea633cda75c94bdaa1a3d928fd2376a876ac0306b1ee631fe38987e50421389cb224d4045e260a9d34508d1739f223765a3a8f2699a8919b30f80177d9e141d7d9630b46cf5dcc4ff85045e62a4f0f86bdbd6367c1471ac4b22210771eb636c2bbe564578266b8682817a9118d95ade51031def42e0d9cb273c03e3f93ac97395d9f09be36eb8b2c21a4c74796ae501758b222101634d1668656b02cd0026c9eda07c0f3bb7d99b7fac6a78793bcddb2a18cd4262039723f41223d336451eb31911219750098125d62110dfcb20e30c6d5cf75212b294eadf4ac273ecb8bb5beea59108851b4 +result: pass +ciphertext: b646b26612445d07ae9377b787af734d0f1bcb2ca61f9392d5b1d60cb66fd916a54da0cdb9aa35d59c7fed3a20728bbdf90d5f149600cc7bc4e36e577db66a69acebedba78142aa18ebf4c8e2dc5b1cb919d37d171ecf6a0972640e5ee2ec09d60f6c8574a4b626dce674cec73941c15bef59bd002a96a0d5c47e5c8149382c1149c85be6d96b0404858c1c5cabe68e22b85176d4443d491b0f320a63e6bee2c0459fea321b4fb70313fa63948e7391aeb9b9c28490d80b1376b852a33c7460a8227669c8ea6114665c91ea9bf6c90d7d92db6e8365d42f325be58a7094a40dee5050e53967481253a929966aa469ab11db9c3a388066284a5aeb6fb209a13c888c1abd2110d695acea81487cdc8620be72da3e8dc5548ad50e8da415238a96fcb0504568c161e9ae617b12409b25f27f2c6f3554136a429cdba75a051900e8100513c02cb87a360d38bf0ad7c636898fd98010d68ca8377c637562b42e7327e43cf6be833c1432155f86b28a0c5c7f70787fd021a2c5bd689f79f8062c94daaebcf499e89b73fd9217c4c428ae08db840738e8e3c12d13d2205b3b29ee6d4ba9c3593346d04c770d430cc3b016b6bb024174c5a912639f30f1252bb46b82c1cfe20c923b5bbf3ee18c072fafec4a3f332a80179adc86060b7ad3d5869a2ec5c88b10058f86f27cfc8d6bd3037c599ad60fa9ad7d922f788023bcd585046f82bcf162e741b1e7e2efc63afe4236c2dac92ef56508a7766cb6e3999ceb69a4379bb9f0768e21a2e49b145a028023863e202aae60f2c9bbdc34d65811ca1757a30ac7fae86678085a2b1c54acb0ada5b2ac82bb6ff15a4d08e3777f3fca2ee1b9ea69c4ac8eada9213aaaa0e3c49ee071ab9b7a337397a3f2d8c54df4ed13c242521b5e3bd80a2eb844e174a04803c68f8c45e0976e0042e85796346bf7e027f71d24b6ef4135ef05abffb64a2a8a92bbfeb01b733edc27c03a67d8f4c369080835d763a17f1f210b55d633a8f404d361c8de3c81da4118ebec9fb17b52a9d994e47b93bbe01a70b384ce738e08ce7b0b12f2fbf5a02d20d170dab8551467f00479d0a7ae184d385f6d74ae18f6329e149e8264f5f2e0b9abc6afa0d675af74c58468b45e4562deca3168a1e8d41865da855a25756adcb182c307c0c068cdb2ea292968109981d72e94871fadb275981a486dd9a658764fb01c8c53ec70fc52a90c4eab76cda5c3f5283c84324fedee0fdf9758e5094c00f81c7d9c239797abf10fbd53138f4ecdac12c382bba60fa766c7efd6482e4f1f66dd4348004e02209976b8934266d5360a85d73510fb3c40848f40f5eae1af28f85349510839eeab1beaaea9a5b197a60e8e130618e08a203d2d633bb88491bde3380271cafd119b84013d9ae0d373d2f6f5299f820d7aa29bc457d2ba102ecd9591e196ad1ffdf95fae9ebdb79ecb148b3deadcd0754bf9823a9a14a42611bcf20d77e8aad7d65bc912b2df657fe8ff43cee9a7bb34c1e119e8f69fa00d6a58c0543cefb0d35f970c1f349c7ccee8dc22a5c0fb653c394763695baec9c7ea42a8e7e7d3559bbf67ab7fb57707a48470fc54821de07bbc006b3ad877d7c660738283043952dab37b5bdb0c7f3e538f987396f9c65774efde07c0affe3f69360789a4ce7d681f0cde4d22361d07afa2b1b9906dc67c30a4b5da3d32274227768e8754d265139c54ae96207390067f97c0e1d791a413cf4e02f0cf9c65aaddc8d54dae6440786131ea9510649dbbc7aceb1a07be479cf6a7421c6ae1ae1733e3b19e19fbf3b6401dc6b4b27ccb1ef24f4525d88df1fda4f0b18d21ed6259a81572f8d4136c3d67a36f28e5cc16535afe95b1dcff21694c7a62b021bf56bde5a31eaaaff38e60ed4861282ca8d03cc5a869e0fd6e61b3275ee433784925f6bab1a9734949801dee45a9acd7bc074113ec9c248e4011646c34a321b0a8c566b88254449bb1db9a8a796ccf67f1937bc9624b7226e0c5e47edd520ea4cafcb0590b9b1129edb25c1f1ababc9738e7e7e0514618daede8c10f7ac4a26a402fb7fbe34b8c659c781d17e3305d7f29c43a4199d69de39c9dedb2183a037d576e985d1adb56ad3e7855e9dcbf48cf19c07a1fab67e3531d70c28e8a587fb3a73e2de6b0022e6ffe83c485e4d3cfaa7f480a419f23f0494abac17ee44dcc6caf8e196dd81634e1f07a18999b27cf6 +shared_secret: b2420d66a17633b60ca68b5c7adcf36ce7b39ea418b39e63bf68288a5af09112 + +# Official test vector 44, seed: "df0e41d2f6f86c1f79d31fd5878e7ab434fc0af3a0d5f47d2ab3fef31a42bd949b0e3629df9f575befbb62e829e51dae" +entropy: 10ef9426f8c4a13b52325c5bb4ead4596ecf2c6b5bd2d37d8350e90d4164fdd9 +public_key = 4e35c7f9aab819e1981647b85f7b73ac0b8ed44a9ebe203998771af684086e00a0ba098841e7979baa20d82b450bc35b88884eb935788dba47bc63247de5cf5cda3f069a02874598468c6651842e56464d9731cc027aa307da811c8c163d62cd057863a8c2764f81c889d718d10267200c8c2e7877d7d853a73287d8b1aef013c715f69083b29a589b8e2afbc72a76587032936899244d435f1df58a957091241728dbf57693f46accc214dcb89fa35ac97c77732d0768e11b15b6d5c915ac78d5aa17323bafa8262f75b66d06f55eb015a5774a3854d09bd130473295a946771652176dc0479cb862cc7b93494df1c815d754f86c290f44c1c828228d48a5573a574a2039dc9140ee8a55c6abba1986938a47b0e84859558399a42ca013450033c53b1e978d5a3ace10a87761d51a19bc349fd19f555042e0e2806c1aa76436bc32831f0935c51384b6698a432fd4a014157b8a9858cbc216fa784e66bc09f02258a9dbbc402422cf652a3e430301678283d19889c7b61226951bfab2814a7c7a2899f83670b1a396f4d260aa869feb409b0af63b0b2438fbc72baf0753fb2c7473d577618109a9d2c2a8448a0e756b4402c7c0e280fd1160f20b9b384224fa2ba06ed2274852b15e1b35851ab6e8a5bcb646ab45a85744141970f6c5af2720fedb56abdb65603588d73109630baa73f773f260c63d81c9137100b1322d7c21181285b773b7c552a4000cdb2830e28daa17ca1db9bfa0226e2c1ca720e7565e80bc08f1c742e453fb2230138bc430335c2965386323b269922e5713957057311ba3394320096075b492b641369236134095d728341db3aa13ec453eb4b9c986085e23453e878e42d20c9af4376d092da16c8a9afa9834cca64f16b2b1561a4068c0245c4b6e329fcb1c0a9b15660485672ce70f3f17b486586597e8aebf9987af18bb2ce3267722c549a8519527515f4129ba5c986327996c38babd95cedfc1305f4378fd2c8b6761a24334192d47596502c86080bb202946f34c08d7e201a3ac937844b181d739b9807ea3d6792cac7a7a1b4ba7fcb2c5833cb0101291523208e7bcd486737b982c1136381be16f75202757fbb86970194c4a32eed31b01ccc5a2f0534bda8ee61b0f4a2023ca58b415e59a8d9bbfa9964cf765b31fb0c565174bc7b006855c9747a66747e18e954444dbaa8272a15cae2b7749b08df9811e8cdc01fa46a362052f50aa06eb2249287abfda0aadb2e719f1e1afa3c29d7c855a6ca27aea661f40210c1c629f611343240b3968238746a245ace3994bf88b46893eff1a3a6096166e0bb7341900e73bcc36bb92d3e539e456bed44b84cc00bd836081704ab2e4065559896657ab31c60c3564981453b58bc7e238fc5b778cfb4aaba57417009a789a13bb075b6d9541692b85ab52961fe887c29289923797d18ab8c9d35230624b004457f749497267a2efd15fada244c1d35c44109add503328d063b7e8c0fb8c66bcb42c8b1c1eac421563c232e579431fd9ce4d572904577811e23af28109b2e419515260e0e1bf4a969d18a4378147c0334a5886046833ab8d06c78041c6b848a43810208a5fa0a202ec2320f4adb15bc299c6649c694f76311d8c0450ca829c3545ace79a33e0942f133c35e1e6be342c30fa9b8debe6820a3cad5a2995414bb7f0744a22194435ea8e5a534dcb8c754bc75444093af5d72490a3468bd06bfd1442870701896a4f1fc11fd5c8c50580cb06192ce7b90f81d920a3bcc52ed02fcf703428c22c8ae25fa56085f8033c972b47c61998db005b019032d7a83660803cd39014bb3165c94b9dba1c6e38abbf6567cd513283174c42bf4605b3809c29dabf149a650bc906a4cb1e33a469bff3820713040aa067701282cc1c6826008f8787cfd0796bcb568210e088f649349ad921b9349cd4998189b4b945d92ba6bbcc972155d26920e1a756bce6441748c41c6c7373723a9c00434e485216d92dd6884f6113068fc2b798790f41bb3104a513f0e413ced19303f396e5f7c72612c4f4112f41518ea77c850f7b8e64d1b6df73a40f87b2945b14b8275aba42b455253b9d522263e4bddd6c24222062ae68bfe5ba4193195ed026712e729d59c7a1f519a9c65c566a51504cb93355a33d83acb62a268e02874c67c89530f914761b751f03f3d2307ac9ede742f51bce4342afd3cb6ce2ab83fe +result: pass +ciphertext: 6a873bd2880d314bfcaf492967c54b83bde3ce79b864c718d15730d64eb990de99ccad48da0afa4e66c505c77656fe822218672b77d28e4b14f4b11aa9ee3731d6ec00c807104bb09aae7f2d53b91fa4fa9b651ece46b5d0199054f0d9b4646845d2fcddfea617f70c5ce3f40ff7b41bf181223ad2cc1f45a31e6bc9b822f7272cdd80fdb033b36f4f7db10b874c123d1fdbfc4fcdc167edd8fba63c519d66167bb44c70ecd648362d811f8897ec4873fecf69ec6881432df9e2d30f83a5bf24bb43314e0256065824746883cc13908add804632f501a0be1d6246f67c7fecece41fd4cd6670f2e12e238cace966f8b83e02cd8fad38b4e7ff7f6bc8b2f7c9c1ff7f6499305cedfc7d472e89df731739f2a9ea455bdf110899ea84b686b668a1f52c6ff2889f565fb55ae8874efcc985efe688d5a9f52da28ad4fbffa0c9d196637251e91de6d2d56b9809e5040fd0d43cf756cfb5cd14b40da7f2ed1e94aa9b384a2e59fa75f56e5f5d2c441ad4bad6ea25c76811b3ce8dbe2d7d17dc830d8dc57c2e9f110ad2a1aa99861cc7312b9f0bff661e12a15409cd6d5536d699bb099a26fc60d8e891578039c435fad1fed7bd0fd13acc016966456168b51e533166decb49912780a842778a5b35c638af3d4de8d35db9ec0461b2bbd585f756c8fd8b89898fae974358cd6bd74a31fa5e223d7925725b602d44483bc74ef47a32ab444f7108a7488a27c013af0dfa481cef8752e5e0084df001df2b1a8022428c9ba7b0289f4a3b8df3c4f4a6a98d215e1874abcc6b5094157707e015e79affb5bbfdc272e64736ebfecded3c18abd25da44a8df479489b3b9a9a5ef178715e1e132ab38d5a09bc66e68ae8dcf464ab675cca458c608a9323f346ebf6a5c0d9eddc61a71c1e13f85069a2c4586149702e03a9b263ea68964a7edbacb77e59c4873fb35fedbc0b78bb97a172a10148184efbfc0ae272e0372b69482871a2a1a04f7da28198e7cf8677bb7e9874842d50067e247a506ed9edbf3934546527345599f15d5dc8198b03ec44669bea78f489425357e2e9c5536ee9d79ab164ddbcd3d78c1b90dbcdfeea79815d3f004520ebccea33eed44e0a3898bad96f4ddf7eb7abda800cc2c11ffc71c30d8ce610d9a6e43e924d0f462d24c15728699105cd30aaf78f5ade69bbbf7ab2b10c78714121abb09918077eca882bc077c235395e76d78afd271a8b27899540cd4a8563d8c290d27f01534311441a0aea72f6b23761ed3745134e6a4a5df91d30d961ea410e18126983aaa9b380d3510afe914a56668bac76a439c5b610abbeec3a213033d642f2417aedf224a8ee0d96ee6d9a668f5611671ea4494cb9415f9bd11093b8befed7f38b53b4b7eb42d4610af8f02af8ae4704257323ba7cc4592c5e29810eab67f6ee85d14119a85a7302ecce88e7fe5a2ad747326fed534fcf0801ead1d00691b8df565c14d2e303583fc635b6aa70dc12ad8fb122b8cc7e991907966288150affdf1f507168dc8ec732256279ac77925679540a08228a74fdb8c8571796e0f6ac176691f20850624d5c4ce8276766d628d06d3eb40a96ec70a85701230cd39ed63a33ea9c6cb73e46c3dbb114d7294aa65836198a16e8742b1b4a4484d80c0d79e91d5330a067d1f2f7ea8e9ebdec57f88c38167c5ec7fc5f2e196fd5dcf02d99dc0e65811472feafc946decd6737fd7b101907fb6346e32ebdfde0d98a241cbb35a4b28b41f6abad162ced0c5a55ef8f634bd058d1f96b05dfe051a0075eda9fd77f119b861026b8af09725175943d3f2ea105fc143b962dba902de7c5fa959d1900f0eda2c5eda6b645c985fd49cf6e98f259a1474500445837797a6ba15b92abdfee1fa409494b277a68716d52e8a60aa4e80c9cdfbfa41e9d326d49997b74a081666eff4dff2cef7206957ea78486f3ed2e610431783145bc73753380a7f82b13088409871a5e4db16b4477e8a12517d05720e2e77646de5ce1c1a9e7f58b06b2ae24ddbf9f4fb281b5d0302cb8f7cc96a6703280e7468808911a28e93b99ea06d135c7decfe3c52c877b781f9ee49bc382f5af000d350ac4f4e12cb50241180e6c28832cb1aedb279be2507b6762773da39185da073d695d289b082d777c052a620bc3c3d41021f3516448f0533cda900e9b4cb05f66ac01fa657990a4f5f474981df918af572f01ffc3bbec1126 +shared_secret: a108c039dd241e403afae065b37d609b13afe12380471f5b398f5a66ccc78f66 + +# Official test vector 45, seed: "d3c9ebba6eb03ccb5c9b9d2c8d7f0cfbbf50841e24396cddf0e56525b38918c2fbe6c34cc1b93f7bcd4f4d5777e1a488" +entropy: a4bd30a64cbf29a4e290fa1cc1dfb99e68348713041e4409a1af23c5d80c15c4 +public_key = f39713c311077c359f42971b65463a8de1aed9879abd512cb55b6e44f5c690e0a3f60768a778cc9cac5ad6b897379507e3ccb994956284a7715970b0e3f6189f0c66d99c667119b82d87a6507141cfdba46fcbafa8a2a1352139b1024dbc64388a3275f34180ffdacc380132eff35eaf788364f3aafdd6af9c02cfa396592282cbfa110792f87b6182b2f36a0a895c0791276d789976cdf09d2c16a32aac669647219086bd36f6bf631392510c0e0970007a88378b647b52fc20ee9148cd4575bb8b31b06449994098bdf77680a48ab51b8e5732545d6b87112884e35a2302f60358f651f8a71c0789018dba79bf5298a9f6ad16bcbbecac4f0cc9888cf55bbeb38264c885ce098fa80463f63806a544bfc194b77895a76b22b81b1098a8c3819e035268d22f4ba0339067ab3bb30e65506a86e74fde52afee944df4e4c745f9393ad59117dacf74a407c236b8b5a2aa11b1c9f86163df31129e885ebf68040f822314c2bc4dd12751851864d743ea49b68a93212d392845ac46f95715796a488cb44072ecceca89878f37b51d662d783900b6341a65d894771476fb942ed058b15150bdc67a3b7f4cac93733f735b81f8dc4aa5eb1288d761b0b74238a5cd73c8bd2457bc195b785fd31804d654aae06eaf5b08a365a472503809b416904162c17942fd27671989c553ab5137488f385b7b9519a69cb496444a7a2db607adea5c3e128bcba31f586c5603f953f4fbbb4381cadcb88d6aa7784562c6ef302ed398cc2113abd257c9554818c8175db54baf20024978e167620b672b28bf24465d2cb4cfc6c08739fb9696bc84fdd76b136b39b85c7deb4c10ff59337b4112e32bb25a665e9cf624baa86aacb2a18ea3cb67462874117445f913558c32e5eb7e1329cfc2d99ca4d83007467b80d74d2ec9832a5785fc7293eb466d55cc8904874bca5714c776579b253f86b17187b9c19d702ae65aad9d7cc23afb041e593bc41308572825a76b4dfd51a2bafcaa10390a76e08458c384cd0089668955fcab00082759de9147bdf581aa4a81f8f82bbea84d255b43e30b6728fb7a705c0aa96b794c7ca28730c6a1b1b2c1040fa24a98ac862ed74453c03a3d842cb0bc87409a09456c739ea08717d7a1061041c424d13bbee299c1ab1bf328b42314263f186e5b198bd5b1712c04402bf849df6473b8e78c4009c944d05277c68d6eba8555ec48139560922a7a142632d4168dfbc6396d0046c53221d43b7bbe01bdffcc672f214217679853d3c0939acfa7b45ac81b145e5bc7d668a4466156faa6a44ae2b9cd6caa5d42cb1c2ac5aa847cc6501ce998b2896652e2c901483acdffa695cd1625b124a8a88490b12b72a5cbcb67a29aa955247fd17ef46606ab5b5fda6ac39edc0128e46310903b32435e2f02158f678462f2bb230246455b7d307b5bdb40375c6cc507987ef616816d3a97545bc0f6e44c025c961cca33a828beb6480494cb9049bb2e0c8734437ca0745b55174b67fca6abe743c7f9793219a19a88298211562e7ad85643b0b680c957eb6b740ac142276822900110f3998f2b043816c9216c416d64e482dc1053928722efda8c35bba98c563eb4fb280791a9a330968cd29360860737d3cabef87d158419cd8794d15771588cb049f393d3729fe3276590488e97f00e63b6cdb760c22fb853352c2eaaf7340b204d6bf8cd186cab5f786e7f967a4d147686a690ca7308173843dbc0bb17fa4ab2788436f43009827946265e86e782b97b2b27b87ee2c0ba9ff23d6d620ac02124189bb008d54da8f0118a081a70040b0c722a7b5a97194c5641078b22446d7ce9b66ab9332f2ab85d7320fc651eebf8b93b838421ac6818f87673872582360bcb903ab70972e8e589465660e6e4b9295675416547c277827d667102c99297f9909548c52621846f5978a5d6971ac97c6df5cf1a3a42717194f112093b73642cd757b541c6d5094931d97afa952ba80024b5d76caa088577f24b86208da3448dcce24769dcac3af496b4ec8e634294c7d323a85128d4e20dbe5b7bbafa8fbce12131f0663572a4c1a4885ac49cc607578042c0c68853b661b452662ae194512b208435a72ebad23519e07f96f59edfe2a5297c351bb38773478747732d9841b5c26091ce45559d7184e1ca01b7c388a8cb030a00f66b47988c2d7d195332662cfc7d90b279248de101f77e30 +result: pass +ciphertext: 5b094b6a42f9e8d31e0d9c28b18a5e323246ab6fb4a425fdbbd85e4fa833b4a589c910a3446ee9c2a3ff7964cc512f4623de3ad6fe3ad55f895c90d95149ebcf10a0654596fc8aba7caae1a59663ea958afee82518f78bb9839513d7199b10ca2c24f7b22169c17e7673eac8b858ad21d6aaca86017ef069af7170f5c825de5205994ff786ded53fe3352acbff1937181b2a29064e19dbfd316430a54b2369218365ce659e732dbb45721ececa352188d551ec1550938b7147cc5b2ae888146fe86b01750a85e8b4179e6c8a9c9adc0a881e5c5929299ed199964981e3c94b56a5e7720eb9ece6840d27861275e06d0be5a3057972604053d4835554d68e5a6f85ed8e2e101b2ddff770b8f4686668bd4ccab7a3fb58eb78e14e28f21443ab2e95717f8950e5b79de809c46cc434bbb592bed388d0c93ecd9144f41a7d053e312be740fb66f6be31538d663cc086cf23b66ef9771f3b2275067d553a0a1e6fa6b32673a1a2bf1dcffd602df83af95b5da97fb2a9df78a745f0fdde031fd21c0894234d9700889d825561c49c14134894b99a82c6f0c776db90773012faa4d7bee06877fd415fd407c7aa5effe897d70ba4088252fea08f56a5c16527c50283b1ee18db3e353196f8c031caba69ecaa877944125decc249842c140f30377c0c36525345dff045957be02ca335feaca4ebce4db5b5c3e7009eee36a4a9753bd2382d85082d01b954a0f207444e8a775582566a6928eadbf41ba235a1f0093eac2c7e27ea73af81849a66e2ecf8bf94a0532016ca6a43aed5f261dda9388de24e0e9b594b35259fbdbd46e5aa82bb52cf3d39574c46ed91257f1c49f93ecf6783d2b01ba5acee812a0b8469e5e4224821b17981b79670259a9977b54502bffaca22fd424a0f5566dffe1371ab30522184b533b9fefa5e6c6667f4e0b85ac805058a947ec77f61f50c447b2d27f4615684a3a914bd21b86a9ca58aa25526a4ae98ed34a78100a65a9124a1b2390333e96dc87460cb9e506331175fe9722f18761b1455688aafead26b76f13d852138d25f017279ad113f7b80b9f443973e13649dd12aecde5c7fcff30f89389fa138f6ce0e9e7bd5c383879398fccffa0505bb38e4f19cb6e65c21186484e9e10276fac9462f77b0fd7e251bbaa21ad855c8c56ee015ca8c973d31bb9440f98d9f7096bd2383720712eeacce4b8bdd025a9db914396139805b7d1ae8cccfd7491ca90526b8025176aa313904699babaaa0c76208ec9d3d5766b1844f8953f89b6fdbdba214dba86475633172fbf497c6f4343f78135db84c3e45e29211f517852cdad693d5882327f2529069fef977a7dea5aa0754597bb9793af511aefa511f678631ee1b94bb0ebb7e95bbf31381e499372241f0718fe2db2b8d4b30b7e4e9d7c9058967df46d8d2d160f6d241b8e05a4b70df811c43307f57f9a1f7d067994f6fc4e30d80a480842ba8ad0e245200efc31a0b8c6e3c39d01ea5d621ebec15a7a9ae5108ae12f8cca83f942053b31e4591401bd7e800a50d7c1389f1db1b771902e144d86bcf61de58b88dbcae5909431e81ab6d942d3af39c4518e1d4fa7f05b1a716006fe5e33d2c87603fb7de199a98252e28eddec620ab6df85137b8686ff0e2d4e76f4993825879c57c5d84e0cb4be1ec75f791e84df42ee7d7c3c77044f32996ee7b7d0f85c77d38f342fcd0e1be880c8bd2ef581278d4b75b3b80daa9d2c5c28a8ddd2758a3ed65fe42f7d4995f7122220f4ed660b7c2dd20916bdce54d2cd62b787f009993a51e0efc7aafa224fbadbeb6a719f8dadfccc0ade3fda88e7ffbc1efc061ef486625ad06ada94487874a7b3f7844918438729fcafa50a02cc7033266fbf052842fe95baae92db63899efe7330603b50f0de189e45e9600c822e1f5564c2fafbbc50abc2c4bca45ab2fb3425beaf4f3145e2dcda7e82da95b44b38ac19440963530ad99b6f732a2c06a98f12cfb8557b83dd515fc1284a762c8dbed28b21f52568295546b452c7b403096b78655c3d18927714e82380ca5c0593091acbd2e4ecf21891955bd78c17c90c58f27f575d1cd26c5f1be1e530b5072b95033ec174f1ab4c7fdedaf25d68fc7f4889d63d010250afa73bb30906610dc5ec4bc98e7f4afcf762e410a68f3e2bbceb37a1794c8b4396f5c6b06fce43c39194a042baa84bb49b78938fb97586732d4a1 +shared_secret: f37800ef70ba18d14be289229810194a8f3f6f8c3a8e71d85afc29d133663964 + +# Official test vector 46, seed: "6b3996e8bc6f52879f2b7be012c44ad555707cb7e5fd8abb3457a298336d6fdc9eb7853008ff13201d5969a315c7e493" +entropy: f4b66a7d3b65b896dfe100b2cad24b175a1168cfd2ae11fd704b835f6bcd311a +public_key = 2d661f371b1f9a3c88556374af9b603c8c1db100ac3e600c042672bcd971857232fbe70e3c1280f5ac45d0e819a8495d2da89ef5086b110773c7d1539ec94a44fc0cd6f4a39362731f527de3f06f4a78b0dfbb94e4977a564c765cf8ca68658fbe27937a7b15a8671cfc8b3e779533d1b5c092826b3038b213550421004012a4cb3f12478efb0c92bcbdca4259b153584bd4b65a6b8d66f578f6f408bfe246deb5304ce5487b7a95c6db5605818e26d2cf5fa6adabea9e3a48b6f889305c016055db7a02a34ba5e10573143ddb8659fbe25c7b621e3494aecef037effb36b2819a1816788a6b410918745c2a423285c7e0021cb8c8793b60b4c9061a39f97ff1212f02d387d224b0ec258268a374b6e27ac9c4598fb78c387a7daa439280d79a6218b3ceb0bfc2e685bad8801d92b5b1a42f64c8890709c58c95bd8ebc43568c33362a53b5a12c052489bfd806cad36dda117b2180b68cfbb317d4bcdf745c50324e19dc7b17ab7f31649a57bcce91fa720052afb0b0ba5e8b57a5e4296b1c390da9a4f76a869af0b9389c0ac381aeae0a779ba588ff415858b3300d71b99fc172de950a95c3a61c9072b6f2a7cd9245da690128b9c597c44903837b8a9443865c785ff6bc05854e1115b9e3d7a70c7c40216ca48b1c6497062d61fb8cb29c71e5800b8e752e70b9a8655baa8408742a511ede8409301620f3bbc2a27790dd7058841432cae4cae719740835571ce65027e74d85958db506a8e9601c1f5ba5728a6e710a3d3d93748a7a640c460167482dcd6cccfc238326171927c6a72ee7084ee97d3e7519744ab8df651b9b2b69d4ac7cdbd9437849114e29550ba3321202906e9331bc7ccbf4571da4c6ae1a0b2797ba4bcc75398e18505eb02dc760b00f687c76f2a35f707f609ca149b4be233b3ba4739e19e4462d78950138cd1b210904b10a83356156a63631d4a6193c68e78642e7c5c0daf403e8520cc2f7438ae950d4136ad32684f2881c50c1a508b0442bf6c92f030f82653578c79fb4eaab1cb60df4870d6966ca5bd8651400a5a6d424749c8cc6aa6fc90b6514a8274e633aaa74435542bd2eaa354d65a32591819b8233834abf1391470085c9144b8239390f97624fdbc645d3662f8a7a2b7ae412f8525884081b3282390f8c35e2379aa5d234dfe9c0c94098ecfab31dfc315413c62aa80fb8a9ad11d070d02cb192d18f3717c1375401c0713437b0868298205162a78f8b00fb46ca2ccc6dad2717185b72793b2aa009419a6330ec508c8c325110c53fa0512a713c500631b36ac410c5a966edf1656419740baaca6719639987bf5e17444b4122650c87c884069fc52ba082837158b9bb85b2c961268284b5d8636b2ed3bd1781296de78a1cca44502a779b2bacb6f86d676355d4d527bd050ca8d33a12d059e6d697f986177e1b95424ba97cda6b6ae0191ba70bcb75172c354541c7742556c5fbe591f33b9624452392412f3859953ac21c50d5a445a34d94d492afbb01a84c844fd582802391f4f4a5d012a8a62079e254363fba52c83a399bb3398f6807e6f03f74f68fc788187be6bcaa5491ff666c98e43c3f860470380768f70b4987c6ea10411ea60fc7e8cba0b1afd72a52713a41a2172804ecb9fb60315e37c544555a8aac8089081c6c2695af8011bd991e1ddc87c841cbe0c0357e04489785222930a5d75b81cde91e5804315bb30bc93294367a4623a0c4a0ec8ddc436c7992b157039879bacbcb590490c28ae7c9142267654291c06a75237b24b8895404cdf32a073c4922c202a087bce07aa5708816818564c68237136c0a98119c2a6244a59051071414425b9230a6113cab28b06a058e67b16b9b3287f001422c276c78aaf608820836c863a1555590bc802a70abda52e4c430c80992745945ebd343277c222836631c652dcc425e1fec6f22383eb78c9b47967e865c6382231b4ff42b94f281c4e9a849477706c339a48ac2c69416d1e51914c751dff0b74cc657a8d9b0d0e21cb2c3a72fa241338b11f529a0ea9cbb8bd310203b29775867f23b7a6ed35890f3014474b51a578110cb1e1d052d2cd03a19fa06f1750279476642752934201c0832b80b552c7a4b4eb1118e2466624588ac1d0148c1c0484352479ea604758012b5d49e885965bf6ec29407a0d9d3f1f08826007a5a3d32062d2a775728c35116642149c2d449 +result: pass +ciphertext: 5b726c1d492fbcff00124b62e2a5a166b83d928a64d0c68052b126d354bfc34e4f6b38edd661c6c407913602d55ce892fdaf631d96c4d94de045fdae852b5d7d88c73584663ade3e5432280d137af39c49aec6bd72caf308a6f3a8255b58997c8c189089c76a4d6c718ba0e01ba1b457d89e0413e89bc2b461b117c7fb011cc2206f027399c387bb3b8222eb56ccbe89c333ce3e46f2e507e3169a75f052d92c10eb3ffd04e5b59aea872c5a3df2bd23872aeb599fc0baa82c6fd2131357b0abd7638b9c8d9bdfd65a5dc9608dc0204cf88a9f2a5aa370f4fda768f7367ac51a5910f492cd4f2b9c05a993dd03f71b1dd1774c949d0e15f7f17831214fd0b33dd41ccd02aeb46fa66f63c17dd6cdd42b02ea18e1ad6183a2a0dcebd4da99dd49405be372047e4beacb32e237f37541e40e2daa91059ccdb8e956343fd009578e5d1b9601513ad916ebb324da5c3bcc5ea2162f507046477acccfae79d7ede561cc2837c0a95b32140bcd7e30c2645aa21a153d56358a8a767cf887f79e85fced38ef732b83a4c311ec77d67dfd164940d6263dcc00f0a76560102564913918741f88d22ad4f7aac99d560ac15b56be3b3e747ab5af9d9c87ffd2b5a7b964c2f8b3b87a13b64cf53a8731cb0d4e0535bb52ee97905435f1f7f0679fb55820160f200bbd6ac39c105387885a81f5c8e7f2d3ec3bdbd6604db8249408ea26f329e1faa5cfbb79f22f84da9095071673b56e003e026b373bcd97ff31ecdd4267ee8bd8e9865ab576e033a0094a96b391e9751dd988f340f06368edfca09403c2194a053a682e94524c955ed193b608a044af29357132ddc3d113f7bb680f9c0d2f8fcbae081bb211715177079e3e5d731c5f3e32f0703ec6c979d0601d628bcc9ef88bd70c020c05007cce62e1ce70d538b3109abd4c05e541b164d03ccf1d7b82fff255433a3357e71e4241354c40a5f6a6b83296e752697e34c77729ec0e6322f9f948f0764ab60842739debd37ee3791624ef110e2fbccd314286353d243b846b52ba87944ca8118da0e83ee94ae8e2e335016f57b704e379168102284b4e2fa4775c9949462863bac38393a7865a2bc5fb8593c856dd024daf88cfb786f98a63288429ba6b2963ca6d54f66fc49d5d61babace50df519ad4e24c7cfc246ec5a01f315a65ef60fbcd2f4d2cf0fe20a803834556d74b1a3fb0960b4bc7d9bf1494c6395c1ea7a24996b04b97f10a6907b66712931f1615c7b76d93e57c90b8aa57d70d2d8c578fc61cdabdd53b42e6cd59ae63b2beffc3e9414abc820191af70312d489f8841b66273eb164d9c3ef3a4d273eb11d708e3a562d113bd397707c1ad7fd7769d4e694270f250240a666c73295e541888cbbd10228b527fd78eacf305a5b7f609985bb869a97f642dad2b04c47310bbe6fca70ecd5957b7e12831c5c400c30d924eb99a1495de8f968135a5695cd9fb78e91345476ce1731443fa85ee0aa266ef0c2bfe720c3d27428255e01992e3b03a09d5c22a5f4a6edb203fad98ff5e0aa74535d6de951f68524f6c11f056897913a84296a3cafb5be71bd90038b8973ccfc2e58b868f61d95b659b16548e3f5a94d5651ff1921395dcceed2ca6afad67ef9ba1cfcadfe63533401ec05f246a453277beb31bc8636251b40310cdf38d743f3566f8aefd7b8d6834390c2035e7493e60bbc93a91258a5926424ed863f07282ccfcdf663aebc6586e129e1c89b049a78ba9c4916a5129a2727d5dc0a3dfb4ac9625096f27c476895e0cedf6fa75da79e08842e6b6df7cde91d4e090a94973c1d3c0da86e11c93adac0173070404bff955ca59822e7a3ffe600f58ed6c22207815d2c4e2ae4cf7df596eb99d50f731d5202232c6bc3609e071ad73cda4bb6f5d5fc027328f5ad44bc36aa9d938ab168f574966c493ddb7e989a04e1431803139965c296dd518bd5294385aff816c8bbf52136c18870ff530435a9e4c45855c6872babc041a2153d78151bcc7decb4bc80ca73c7b2724a1b9a934b3fbc2c5a310717677c939651f4252935dfcb2614d3223e4ee451ec0ffea2fec151ff43d5baacbc038629af6c684e401aa8bca7e385fd5a5d18b8b9c0f325109036fcebcee3483d2e6d0cf74c6d2ac07cca57261b6ed3ab8836e20c876a4a84499ef5e7e78b1465d2862a620efc7e21f45d91269458329d9e0b968183f720c947d25 +shared_secret: cfab6ccf400c22dd43b0094cf8161fb453e5291fefb299719ac2e7000325d1b8 + +# Official test vector 47, seed: "730b65ece22de27d573ce3aea7cb021c415df210d228808d91d4f380070ffcb0778b683c71d4853deb569c822765f2a3" +entropy: 1d7b03d3c5eefb8ae5799dc569aa668f1bcb8c86607b089d3530cf61d6380147 +public_key = 90c537fb848ea86c2ba929c7b97456ac4b5c5007b27631aadde902ae1917dba8cf2936427fa22504aa2bca42bdacb21ac9a497eb1cb8a4b096e69294620386abc48f389c7f14380b03b10c614c625427c8cb9962f3d75409d923a56717882169bdab15e4426dfdb26072952255eab0380a88277ccac1d24939c98900d0be4570b3df596aef0a1747b2b0106c31e9aa9164f7745de23bd1cb222178ba13f7c806c0b02ff9898774646417bb2fc3153167c1eb707655c548b63caaf3fb3f37771be2fc972d03bde5286586d406b00902dfa0897785481b95805ab79dac44233af99ed3f53bfd6cc36af1cc79006289563456fb71b54c6e5e894f47d715ba062e010841a9e67abdbacc31dc373ec88ce8eba2f96381edd02fd0b88b47888f5084ac264c755c62a663ca9e30bb2bb8c89dc2ba91ba652fb79008ad91090c0614d6c7c674139ba5d57d26dba05e7c47e2107aac4cc28405a7d0d415e2472f66c40d49e094add494c19175886474b5a6991e355738c66d9178c94bb4c05912bd9d709290a8b562a358814a14c50750d17054273c7587b7ad5e403f231964bb40014fa7121fdb74dc23875a148f0f021a8ceb3cbde6842714cdf1008d85b0af62e65ccda27d9fc2a12e415801bb22a865b861aab5cc3c9093c3164e6b436a3475e5359bb8c241b635c351ec3614f7a225d522f2a0b7b181a1f7a4ccc858014a2222ba5b19767154e27b2667e90aea352ae7d3c68e07b7c4d0482ec38aa226ac4f2b63a8da4be57842a4a65b6e04c2166327be09a30128bcc33c154031b94ee13aa5d60f7708347659b4d73bc500432bf2401861c183c732019576a672d0c10d5c18afe4364e9ccf67d670b29283d0f0b9f91130a0437d7450acb4d76af99aa4ea287a6bfc73fbaa3207f58fccc775a811a7e6a0b7a63bcd87f04f1eea0d57ab7735315324282b4818b8d4346b0ecbcea3ac9c0a7bbc17a955617570a511447a9b8475f7c602135f57255e2412cb6ddb0d22c30159b43b9dd58066d81d77f7a4e263603e193ebf671fa3283c69e71a4ac433297867da2b2b7eca19373a9b4d3897689031e58284ec8779fcc4cb742b8712b11a3d143b02645a99db61bfb19c26a5902f7b3d77302a9ab059350925d8e1a994b586ea777697c389f9cb6e25817e07c5716db9ab63f451dc89a852031bb3352e8ba53643c509ed8590694b6a07340ad0fb2f1788937a0c45cf9a441494ae447c44c6917f2d7b21bdc6b7d3853bd8e33bc7ea75e62535f95096a9d0930cbcc0a210c2f5b81090d20a5d7c0346bb43ebe6b77072859f13a6576c72c0553da80a4ca8f03292d86a98246151960e4b15b758b28e2ad2271c9ca70f92061c8a560be21a2d967c0ae1b0ca446a987bbfd888ce4ccb725b95050d03134f3441f853935255bce8473e88397d5eb4cb8d6acaa6bb8d5f5003a560b08c89ac890b77aa16304f5cc74822764d82823b317572c5bbee018eedab6cd93caa924279ca8932a8858079197d412b7283e084a7fb9dbef26d4530c1b6136619b06fbae495d207a3c326910a5c2ac9c7b919498bef5482532535d2551fee95154b2082a76c0d3b16ced88993697b344cf7be4742a3180c69f6fb589ac17fbd03489b13a0af951ec1d9776efa82cfd0276e58c553b2046b4594c9621e0aeb160d7923bbfa53f7c9c2a4a077d51a6f38473fb6d7a2b2b99c5414c5e646734fc48c56c18d30997d8073afcb822680b321c40696092a7a9f9072cd034523acb15154354d697f27a312348601d0d1170beb4759510330cb0adef4cf31ca82f7f15bc02310f22c92dcbbc059e34771725685955dd5490331e0bd99829692275598a77a310243a6225f392a9f83910afddc172d124cd295288a77ae051031f898b42d792ddfe8c0902944b68043bba48a25c27323f07d4f6a8c6ecc33f13948ad12463e834d23514af69954395a144d1a4df8f526c0331247d16d05e185ddf04a94a92047bcc976bc17f6b7488dd390eaac4b608390e9fac6c2829eed0903d544b3ff08b2c27a779198387a8112e374ce4f5b0f5f898101159462929c5417bf373420811b4ecbc034eb41aec0888a30976428e2a54463072f3c9b55341147c464dc88b55daa1fa7920c22fb6c8225b2ccf47692713ded1c4a76a479bb111e56cf782a6cafe938d47de49bb47e732223b0bd1bee7bf690d1857044eef2aaec +result: pass +ciphertext: 933b2c004331af9c0e4699fedc9fc3999fcb8213c308ecd4e33c3ff41ef3cdad8f02f0f0bfa8db24218e8c81f0934b98153497e7e36fb78d48322742c84870a8b470dca9ce9a017e215d33b9b09d8477b5b292263e4da46ded3ecf5afc0d9472d7690d24d07eaa35644cfd30b3b530f527b4dab5df72947af1a08264abaccc588cee00be666e987de5f0d84bdfac563879916b912a3ba625e16ec3458c08ba116d8411408a9a9044fcb2fb39b2db31bf446b840fa196a6b61134619643116b85d14fea5389b2b0aea25cae45197e14844e8c4b33bd73b85799832cdbb3b5fb031bba251182ad85492a071bb4bcc5476f3a9a5f4c6fd740b640fc87379daa2da4e0819e983da6095257a6cdbb2e4a59055d0251480ce14983e598c5c4f362e49f992cee925fcaf504020134f9d26bda51f88006a0e4df6c4229ce87c19139220bf4f27ad189d9c6b2fd3f3387e344632e497f0f9086752318615850a51730732009afdd4fcce3226645fc26a98de7dfdaeac5de30fb7c676035ac267ec29303b6855a458682baa9b6ae49911ebd981f14ec358857f34a3e396fb6c4cf83911029ff15f23ebd105fe6178adec98efce9e5bf79478a278fe128c7521a81c529fc8544d5c9344d16aefdf7a4da73f4155737238c3d0bf820e1ce3e26e1b5f26e6dc0bbfa0e910988d98c655e1dcc1dcbc4c434b2d2b9420f98323e19e2214ec7e470848adc7c77a9317ad64d4a4b05aa4f72dbb269c4d30c98b9e7a39787f7f77b519afcf42541fd9e2fcc228efeec98bd4a021cd03d5c3526cbaf28a2c075fd83e6c47017cc1837a936f3b1a477b4c955df76d40bc4c9e3165c672fc617b941743fc1d596ac2000bef5a4eeeef54db3922c27755c5c58bfa0e3f2a97b475345793aaf44f371dddbb8c0ba11dd2fb4c6c38d1eeba05d4a1224d59174a0fdce7c85cc57c913a47c1de5bdf883810f833d9eb441e2b9164fa00e84261b67f56c4cda52dc863396f9a7302093bd657cd0c7349309acae2e7ce7b40deeee285552e3c31976917774052dc8c0b80fea4d1c0382825d5f3ff1911c5667b5d9e727b1fb5ef17f2040ba56397d4d8f1bc4fb445a054a39b40145e3457597739d6bd8e5d194e3e6800504c9ebd25129bf575bd8a859a16c056c9bd2e2c8d0d9c0d5d9ad81c47f0f6be82bfe80cd60fb158297942a0ed963ec522c0e5f58a5e7065c113336d55370f006003986832844e940f160682e2f69dbf6edb9d4b6268a087ba28663cd002152bb20f659107c7fcf337e37ad086a5c072bc632414886d328d7fbe79d7785404b550f99510c7f24c3b6f455d3a12a820f26d6b2259d7bd0a0981af26ed4494f66bcdf4171fb2be6bfd9dc1e7a183e499a068a1791d398beeba47af660724656406f3a581ed42bca59ed18bdee126cf8520ad6e7a3c7f37d929f8a35abe5b46177ad34dccc4addc2fb354b0dc266f8a1966510a68a82c7571498fd4a59dfb0004a3bcf9d88c7ef458733577ae764d90e29dbcfcdff40cdbaa1f8963125bca7011c4aaa6246be182651d97937933e1cc74927bc67791764bb20d1a04805ab073f00a9a5c6e74f35e45101fc31e8571757d06df9109283152a2348764329724ac053aa5f1a2a885fb745ce92914790955436b9d4cb59d922e1c4e07525fbde26ce9cf4619cc83888f3790fbfffd1932ca4d6a1fbec63d72a899ed0897090ff253dc371175b8c1db02ae0ac8438cda23c5533a113af068fd34d2b23eb52a30118308a85b6c851d3ceabf8eac3c6e2c54cde101580681b90eaac4e099e9eb35c49e80ec4b08c1f6adb547ffd0618ac7300fc2c032fe82ce1a7dfc7679ef0c0db03b494e48ca8ad2251311761b0839cd3d576980461e4faf81cf27ae1d13e1c3886be97c6da2ccb43339048c2706aacaa160d28771325e90a94025faf4bf4cb7445f318960308bb59fb756eece70cdb134c7171eae241915712b7e3ce2f373cb2ac3d26435c13034b21948f9a462f1eeca57a9a34c4a7b270b9aa8eed19212d0bfefacd8c8011c2ac38e4a4599baa799a9f06f9dcfa1518e04f246296d85cdbcd341156615fab90d9713ddc433f73cc595916bae88ba9a9c411f506b9ed5d66dce3ef9f350d51baa6a11ecf502edd6a2e49df6c25c77c0c814ba99abe4df7208dc80f948408b4af3289379f1ad6cdbdb4165c683aa3428d83cd091cad7aa9d59dd8 +shared_secret: abdf30bf8e4ed92c05241b6f00895dc0d56759ac668245a88c7ffa59cdb48fdb + +# Official test vector 48, seed: "5522a5a891a9a9b5514f4556afd8df40b9cec63a01492f0cb8a1db073a285a963e4a9ff2376c88662f7d8d241f8acf17" +entropy: 554f3385b382f4a46314de37ee3885addfc5332bd4038785094e0a832e9e8c2c +public_key = 12e4c27fd191ab43b4aa8a66c4326e681cbe1207bc2d5aac1ac59ef0a8aac0c8b91f7c23ac35abf566c75ad3b01d6b1dfbc29db4a334b44c10fc25808f9b8acdb4a2ba67528fba8ee942a895d5544857473459763e92174dc640bf284908023146fb553b1b8b1e99a7446c5320ca17eb6bc497a330ded7b1016a1c28d23964f24f2188b2d7ebb2bbe954c9d9271baa7e429c02dab991dffa49410ba6ab20829ec41b03b8ba8756b5cffc640e928b24361f0f007226f2b5315a8bdf8a10aa88581ce5a140588b69b531f5112610c5306fe41d4c018302dac1dbf69863b6bf99d892072591a0168decc69f89823999095f256c52c6336acb063bd741551bb855678c4e8bf90191a38c2fc641957312ee758e73d88d8c8937b9c6912c59ca13854a4209924db71fd8b547a076a340560155122298e91328a71773e1cf117920e5faa8fbd847fdd027f734c06bec0bf479b97cc11d626122d1049e96c7643a6b323aa93e10521460c7193d7c85a1a8969dd0b0835b64ade28df777a1c70646b8e55578ba9da6d82a96b5bbca1b2e9346775d24b987535882468b3e9263a1c74288695722142d9ba23fd747383832b2a3b6720b21cfb5f00a178c51a878992d666872685cb1f346c77b86a0174ac955b06df96ba094101330958452074c57377f520bf0766881752d70c0a778415f9bd3b5d276100f00ad563735cce0952354260c153c3ba227181a21b9f8166dc0aa42acc241f6051624b88d1659a2a81f9cf92ce82c76dadc27bc3b018f953a5af66ee21401c02a4e3b8b4188a36be3818ccb82686cc21d50614f1f000721f8445323b4920b3d929c1362d91ef948371b531096186034d61f0401c09679c54c5a993ce85137f15f50466bace29512e260f990764c31648d6649d23c800750a08f759fa84258515c4625b856eb368d917c36768a8a1471a376ab367aab46295707e94080bce47dd4633c2b50ce0b19bf47d4a68c3519da21c205b0c9128606ef8a7405ac525a12b0c613c7ae96aca34743ca9679bf078d5d016405f336f6088a9652204154648e4b3f6872929f02670c7962f4b08bdda9beb2a33a2babcef40cc4de288460d0188fc29ca85b212eb40f7b158aa4a38710e0608eb150fa5252860058ccd822618961cf5c18a01bcb2eb92dda84597fe9b345e06d14a597917a4748949ce5f29e60a7ab29740242166c5a651501010bbbc73926a7c4d0dc6aa415240e0c0769774055f9882aa4330dac1d8500747bd5264bb7625c2ab58e7917cd122858135ec09a3f0128837669bb37911903854d57da6957d70407c752a20951535503847b17c536a69ac09a84ca64633a4fb9c26221296190b27c03781729456f6653639fc036fe17c4b66b390b2204a1361555323dd307572b2caf24148dfea74eef05880205c164da71980974240b2167b3c3200745ce778a4cab786a0cbb132188158c3111707058884358db6ef3d04480d7ba058c7e52e4052c1898e2918d98590716a80bd9a3a4c3d53cd8111005709e708b04c6d18bb1577219a39d26a496582384f1126fe491a2dab7b8adb4a07563c687c4a6056455113c6fe9b7bd30cb7fbed2839a93a584c76af5c1422dca809cc623079ab65cb146a3011c38c1a6f3db134b72583ab9331d418c7ab513d77b91a612053f217d406babaf4170607a1979ea637f8875154561f69870fb1682a62052fa36a21bf94fb4f24ea54c1658d8bea4e2813707981366a8d9655400db440db8c27af57ebdaa8ed897c7594712e6881c81f5b79557834e53c9b537ab69942830fa60a0c8bc7518192e52396ee15d945b9f8df019f8f32513817117834a9af58ff761a1830798edd48fb571be338b43140c44d17b272db6aeebb0cab160342b49cbe2b47a6a5006b5cac09d763f168c6a5f329b7d1b87dde69542a4437b8c426890b4a5487ab43a98ef94667efc881a943b33b42c776b3f8af853fd59c2d3031fbcf541247100d22219e67094ba89791186bc8b7b536fb6438aba5275d234adc5a9ff129fa7d1b5c5757483f02980fa40882aa0c72c0ef233b0c2931f1e15cb7d528b471c50903256e54a87f8c16f02b3bb904133bf60136d603bc57c503420a8b6701aea4a3b4052334f75bf820c2ed9890bcb812b20d9031c269af9598acdeb8a52bfa7cb804627acfa20285753264f3df670dc445647c881e112b71095f10934 +result: pass +ciphertext: ae2c5cb63dd84bdbf16f45be0e0c322955c2c3cfa3fea74aa30c6706a28e5861a92e2692df21654f0722901fc86576d0378f662afb915da4ef65df72c0d9032f43de8b69eb9e37abc502442fc3be17a539a4958350e42ee2a83adfa66d393d94356b2f81706483a2da094284b7c39d4c7ccb4c3c6b48552fb4a6df7d2fbf5fbb473ee164680217a54fef6d1a8da22faedb6ddf9683adbe5685c61e5410ca24619dbc0b9cb728fed6207f75095b73b4f2733401182320dafd1574b815ac1d92bf61fcc50baa791b540d25083786b221070b9b5ec97c69a2ab709a2dd82224d50c7223bc620a4f142ccba7f138ae06a9839b17f31b5a78cfff773595c34a7092c5c2a67df0392985afc227f171a22283e3fc5c12cccfd8bc98a1adec1ec8e610008dea6bda2067624a7bf003ccddb8b1fccaf84650a4175fbfe299f56191a3251fa0ec63aa6198b7b9f13490dbe41b23dd44c5015f82299f2e873a576b7e44a3769d5b1886b2114b31a5b2359affbaf2d9156e5ca200c36be07c3837e5a35be36eeae315d888da4cb2e5911ec897d28ff484f4a13ea45bb5e645383e93f39b90c600bd6ee8899c5436f18eb9cdc9f7670cd66c42dd182edcd9a1e03c7c7e6cd22bdea33cede3fe43aa7e9bbcee5bbf6334e516e4228112e3165a50acd9c00da196d83f1e71f97fff99912807d5b174377c81b5dbc734175085a1df2535323d821601b42bb08cfc508eba25b75eb878a175e69b9704d31d8d4c626705622821b0fc787d741da974a99c873b11c10157dd73728fa96d979bd825265c5c2fa198cd18db467e391ca1b8a1cd83a3363e763bd0dd1eace13455553f0d0a8b594d2f82443a377ca830540522e1a9ad2fbbc9e974e63dab823d347e93d90c18190a7bb4366e3fd0c81d4e10534056e80c483b998c645fbde1267a0a7e94a5950942aa114615d38ad0b8336b13289d8ab76ff03d49f419de79d309e515d668ba644aa43ab75919f1be4360c0eef3cc0544a80d8a46d6cd9f5bc7e50bf3d22cfa338fcfb015af7459dcd63b066077198fbf468a75ff1d4277c04c6dad16866fe79ad52873165078d3d8ad1ffc1453b6dafc3171235acef1a16912ae4aa7eb4e31e5a3664b19f01bfbb75172605d237c23d22a2251dcb9bac2cff63e54f5a8145fd2bbf63b76edcfd5e87400e50bf239a83693387780a182f4066d624b7ea1feb629329f80a0c9f07369a6a70a710bbbd80a189e92c9de920a4dc1fe1c90e2bcaac35e2b0e76841ea451dba128c0317442de8c7f95dba18fc667d9b4561302e17114597d9bb1882e35515e8a2ee995af7796b8d88215addc8d41daf201ad155e2dfce73610219477b8b0c2adefa24b27534d5ec7c35d0a2586a14b1a796721c532aa269f3859e50e2fe4008a2aa39f86d82bb99ef6162a7fc6a3818d05b69c4af85d2d16e4edfa291af1a9babfb7d460747770cfa5ff0b20bc4d6fc2ebe88f527f054178b1daad883f910d67f36787029cff7837bb147179c0869d2c87395988bb925dedb34a4b8221735131a558ecf6a4c5718b01dee25147cf12a11039ef6de8001bec3423b54c75db145894a412e282146f59ae7bc1d88f7586d29ad802e8ba080fa6bd38db67e09d8c3018836a6e2f48eabf60d2181651968733272db494aa086306f274e02292df35db37ec2cc15b2866617e9e4fb34144420bcd31ef50fdd42106547fbfb2453f9d7fcab4e3f25d56b502f04f0d51d9c725698576bf32b7a67e168877cfd8aad057bc4891f7d493a07b626c43be7610b5388ec6751568b153051dde7922b4003b6c34f3af807d17e9630cc452a49ae14f6d34b4934b81896f4daaded277c1757067c12f143c552a83495226cd6805a73d11724328533e087b980db0a6d22816da01ba0b8f06d4afebc893d1b6bf8dfa5039ef729d48bc274f3a8fdffa73054d8a562b2683c6f758f9cafb7a2b31dc596f628d081b659fdf08151a85a9b3575eed8978085dad4625832f803dbb7cc90f82b3186708a7f4cc5853ca3e1fe958cffeecd27b685d8b7bc3a6707446ac2a29865cf56d1958438bc09a4e8d11abb0d53e1e8f61e8bf044c6541415569815295a9ead015913dd9979dfdbb7e3cfc8fe520a79e8191881e617d78ba0b9ff588a55698b9deff3046009783e9d9ad99fd270ed0e3a4467486303024fabd673dc2322190f74ac36f2c5c0a3dc36b4f +shared_secret: 9ac4dcbe2ce4c1b26961fd95fbdc719296829c8107260b8a21cf3dedb292eb7c + +# Official test vector 49, seed: "1853e72329353b3f89ae6a1b1ef700da8ed3c10d19f9e61ee9252e28ebb0e15802ee43083a12a0b7527088832605e3ab" +entropy: 38bf0033b779edf5367d9ebc01c988af90904c560970815837380650e4749eea +public_key = 96f73135fa51010a83491b407571126d85002a60cccceb5393b459cb39b4dcf175b2134cf515c06b38cb0ea33d8c34a7283b99b6d0c9e90825159cbf4bc2a1c0f131580557f243184bbc7498b39266f669fc161150482de480ab196ba61dc526f8a46a2ae3336a7abca9e2743fd654e965b3b33ca0b9cbc8c96095d78a971a7277496a8c123967e8c204765a864890b762d34e83570a8dec5cd25333276555e7644eeb5ccf8004579c357481000ae9a930a7313468d3a8b6d5b4da4a558a7c1318da670dec758c98c5048144843096c2b781d73a9f215c2ca0481ea5aca259997c8479256841507717b7dd01cfe1755f8ac2bf1008c2c61b7bd13810787185cdf16a17c2cf00bab7eab737a641cc12ea6d8bc802e0661730628194c40a7865a3587cc2f5b0ac1d328307c55388970b96c4969a533e04b425e528c713d41821ca6cf1f5bc74e64859c49b914563ad193c626c6dc520143a755132260d5940c76e20a7f07987fa7c1a4d1283bd700c9759871f973fa6d94fd88015cffb046555b36559420bcb98ce617169465770135b15612a9884586d0232d44606632c50a9d5beb3697669c9940e1739508c360505248f501dbbbabf70e7cffb24652b782de5f4a310a7767826bc73886e60e51230068dcfdb2b3ef246f7701d65813e54d78ddbc34cc9bca025914883364c60576a5e0c5a863a17a9872b818c070647170cc46f44880d4ff46d68c4694442433c823c0ab39656b715e0443e8eab14a990c42a031ebefa6cfd54c32fe4521e218396d53c5554c60b93cf2f1cbb0062c6101686e5738896621e44b32449c297d968b16c80ac7491279dab0f84749842195aa3dabbaddc2457fc8b854752d33cb1a5499dd53725bf34bf34a68457e57e4b270fe0f07323275fb99b78aa90af27480b6440217b01867a1b7a5a5885fbcb931c524395cb11a406a492c4251f9c09e14a45e2b86a98c72f1532664879a2d5557fe9db6bcb2ab6197892e5686b2e1ab35a3434a77a65ebb6189aa00e19fbb045a03fb767866184c5c2e2b155f465bc7a135ab25cc5415b0a42aa17595a32e2a370317414913278c18837f346c3a54be5722520315332b2b43ed4089b427cc8e24f10f17610e40882b4c724c48b6315aa6f0c64a4032e4be75bb6b0702a2cb7a11cc6aa14bccfe91af25642513425ca475fd7e7c387214294a36fff09bb1388a5322910b9906491bc923a2644259086bc5131e5d67794d91f65b24a0da06ceeb63239456e6c3b1cf4fa04165879b5858bf60664aaeb45b3a238b1a926489a2d395473d3a5173fb37a51fcb5ba0c9cc3eb01debc383260b4f5033bee258f66a504e64a74fafcbd1a46076ea00a02246eae52ba6591a8ced21b58971f289847c508768dbba5ab1921c14982c9525ab4b64285723954d33c8a35396db137c0db48a39432da0abc3857c5369b236bc03ef562a8a5e4211986a385b8ab4d1745742411a9712256636e62976f99a72d75c654f8574737b6ad34c129a2eac22fe166b2682840f7043d4339bf699b68d51ecc32974c161136272f9012219bac6bfa8950c6016207dc6566d20b916974743290f0a52b8be51c9f3c239e8b6842278417a05dc789bc43fa1ee0671a51ba3301246ba780ab71295cbd20ada7a07e5593a3933604ef972a711349a0678a60d2af2434b17ee940c067bd89496c90d4b9903b9d146a49c36138dabaa405499ecdc02f791562a5d446fb358702b2a5eaec93b7f4756762b3c17b0e8d48ceb5d5244965168fd9c3e6495d1fd578ba2c168805897cd351202059b5a4b96687465741b077677583ca7411c4331583308da00ab5045ec5943beb2800b30978c31031675a84dbfcbe6d7b27b2da65152c692fb8727a485b9641888b1b36a25491ac76045792278125b0a3735f3e759901507ca4a2aa12dcbccf3c35c68873518a4fc778201f0b960c7b551f038c6201378ee101948629dae0364e38ad079320d2cc35bfbc8ae7cc446526447d60b19a36519daa8331a45f1e4308d564979a5179073130594cc5fc07a1fb6b5966277511544611e018f3f8b76567add2c94a0da8502063c66c54c3a50644e43b81a93c7cf0409b505c77f5d06d34432bec389a137b6fb9f18da05426d03477ff0b8185327c37f449c8f6398680c78ef7d26c51bba9665cf58b72cdfb115bcc2a0715b5b4f40dd01c7a0585bbae73 +result: pass +ciphertext: 3d0c67db088b150e110e9a395a143a94c0bf6fd9dab5ff681c38e1ac6f34156cdba2b28bdfcb62ad002b1763e31bcf6316df977e6533e12536bfa9933780de5cffeaed2969902df53f34b1026543523dad947decfaa8ac43b223a5bbc59dd5c7647fe3a17ec79a84e89e820bc0ccaa56016540d3c821ae453dec695b4a2232a896264e475cdc16cbd476fe8778d57e5a31e6b3e6e9dcdc96c69ca0d25da24b2a8ae65e6f8a9eb723594f8e989dc10078e20f058ef8e765c96093e9faea1a5919c27e69396b53c5e87213373ed900a8a763b9cfab262637f40038826fb7355e8f0cb8672eb3f478e577956fc339ec67de582e6d9b5cd578874d3db3d774869b291c5ef0b2a3393fc4dab94510401ae107eb65560d9685c14b06a788fa8ad177f76b176007ceeeef6da8913c82744ee66813004ddb6591a02e745a960a53a06e824a28cbdb197591dcc02658d4f7bdd401bb829a9f3ad2b3cb3093bfab0d8acfa0a66b6dea77e9c905f7fc3b0063f3cc12c190ea6e574b9b606fc5243ae567e88383b2d936e89c2e12c23850470d09c219568a9a8de66bd77612a4f13718da6f0b4cc20d9bf0e437c859ceb6468713159ff61ba9c26f9393fac3fbef93c6718d400ac9b5816c96e5258416df120614024bcb5e7eca61449af540993e27a067203237acdaaf8b0e7381e3413de5f4eaed01e7092d40b522e4508c3ae928996a960e4866f78a0b5b42a7bf43298b4d05169e815e82802e9afaa2bad286ed0fa4a1efffaa1e3854aaa9bf12121ca7c6711f6b4c838eeec2a9b5da3e4ff080d513e18b71e4a71bf9fcd544ea44d5438d4f56bc269c63fb2b4f4de5ef9551a52b7cd781d4a6ecbcbbab8825e2fe6693b41f34f0c07690971aa6243046977c0c48713b9f2c320686e02bb01c789d9a6e46f9a3b8fb480f4d7c755bb5c093f4903a5f332ed9a805d024323635c4a51667394813f01a634c90f6a82a16b6bc1a2b3dc7e25b0947900051da0e5101900fe7c725324fd5a316057955ad4aed9e08b67405dae766aa628f599776b0f3dfa2b12c2e40e480d7c6cd4562f0bbb206eb4478125b5febe34c7c81924a3fdf70ee2f21ee2b3fd0823ea16edc4a5e07f2adb10422e4df4051725c6a99e4f5b8f463eed69d8921ce36e7ce5b6d14a2be719907d7c547a16ecfbb733868455aea386c52bf9adc93bb1792bf0d8b056386c6311015f47d6319c41be520128cf2ad3e1e0e8a568c4b3c07e2b10589f6498d01cac1f8c2a50d20ef7b3ffae9267d3cf3e66cd57d6d42a87865131d5eaf10f1345c1883d475f7b29c8f07f04533f39dcceef2904ff0c6d86b1ca1acae4f6a20a649a95bedcac1d7e87c17cd75ac8b1a636acc3187eca7586db053a6595d7c39ce1e57e839065793c2ec2072371cefdfb9e62c559c3d2ef9b736a61a72695d4349d933952fa9796bb4d39cb5a88709474472a19da3b7589cb01a11de4dbd79e0555f6a290ed047fe4e31a6ccc35a904f4d30d363f10421f5a9de22c059a6ed0e404ffb62b0626b0b0397c30c59d56ee18364c8371d095d1cdb0ad08dea67dbeba8e2883ab4762d4b2ca32485a6747893c03f137780b105870284d523cc92cdb85bb94602bbcc9736175a3958629fa45f26e6c8a84fb61f5a0619ce2cbf5d4178aab325b393dc1c201ea7f751c8916e5281db2eaf733417f12c3cbae76a2c891e7291f54b8aa7e91c05f4bef7f75d86e7827dbc8634f7b4c19c88371087a5c80fcb48aaa051329e8b474d0ac5b606b40323327cab61899c0f12ebe3142766f70da217c57534983041eea96206a27926e4b296267a6f555356f3ec387b2cc21d541560f932e716de3a67fe1afdc193027a90c8b5bf14dc60285ca131a643a1231a5552d624bc930e7b5965871c85c5ba055191c23934e651c03570819207df6e4b467bfa0f2048838ab9658f9abcc6a0a74d81058510d435ef7239a334437cd0254eb4ae2760b51cc84733f18730ba68f48c73cf3a211c9a8ba65d61afe39cd6d5e72c4589b7a9dc4a49a2f05f17afa14c89d4ecf1fbf5769cbda70a570d73851694e1c3acd74f80a25a063843664930f168cb3d679ec883b82c471ed634238b58d43bf732e71368839c64fe1a54e0d8d4c58e06f20848c823f49dfcc17517d60fa56bd5e496990bb973c52596eae1077227e33b04cbf67a30ad91c510bce5f9c480a273b205446e +shared_secret: d1e8a626ea8c5fa1b89ae3c05f745517eae6a8710dc1173083209de32cc685b4 + +# Official test vector 50, seed: "027c3d5847ed4470931141104f25b19ae76117cbb64b224ee424ffb782e9a0e988839e0bded0df666fe8e5fcbb5dbc09" +entropy: 048ea516d0ebbd9f709b47eaac66f344c571cf50f0d01c9466aa061a50b66a24 +public_key = 3b37800c878b5adbbaef794f4f24abfeaa40eb1c5763fa55b7369e5be8754beba6be9319cc3a482a53ba93c417bc9a5a3030cb2a247177eb11b63a672e0039fe71735ca9cea99168d1634df2737b45324034492e1d3c74f10239564b23e39585734c86d98118dbc944dec28869ca8be7e17b39bcb0b0e34e257bc9ba42cc782078945094eb1336e516c62b00871d12c6019700b478b5db43ac419b2c7a50442d9458ba4b853d5a29ca946d64b6a6e6cb3485439abd4a9cf34b5921242ddf3611289a72efac4101b208cb7598894a9ef1ec38e34a58b2c071b3e6738138bbaf416f246072ead83b354a0832b98b551b7210095fe9323e1f75bb99905e5bd961cd778d32c1be94512a7893c062f6a66553152d1c820b8825c25938c0348a3d2206897ab903e6472193b5c2aa3f1bfb22bce88bf3723eaa8292d5446546865218d5827a5ba0da5354e2f6c81eb96cf0f28efae54935138273447a953aadf9757319e03a6ad19d7e613c2cdc7f5a3aa1891368399ab5c5337881c782bec48f9161774686204027b6fd895ed1b800db68c2d9d529156b0a8db90f107964d8f5c860737db2a3375df20b7bbc7f1ea57ab6e2a2eb44b5f8e6980d5233a0791350f4ac23210a4bbaa928273294691b7c441edac04909472e8f6714e99bb7de1076a121576eeb1d419122d4366023bb2fd66937ed940566ab07d7b480b330937c341106c3bc01f3c26eb7388ce7404222bccd7cc42e8a56909239a2968f2da3cea3c6695cbc909ee481b4c619f1e7ae6750b4d8f691d70490134ba02cfc97327c9f14db4bbfca7b4589431e0b8fb8dc61658110dcb675dd1bb46db49605c66534ca53d918aee579557e82c733a3841a7338f9947d92d4379b3a2d47469166bbc20ecc4de2f7c768a0ba4dd788cebac30eccbdfa11ccbff61328f92739e12160b83369d8466421374380a1a2c8bfd701a869b49d09644266d300493badff092390e894102028768a4592e96306130550291ecdaab48c711e8a1822cd278b80357856a739174b3da66795fa8375333554fc92298dd92b3c962bad035424f418b9b626d32b5383005564b8cbad0915a977b1c95710ae490bfd158a2c780e14c85ef92a02a2601c3538c1297772d1045bc4811e4e7893310413b4121201eba6c4db8658378fa3a6b9b919c9247c40ef39a7d564bf13a6c8ec575fc3b58f42426ae1a4944cd638bcf8336504577c65a7b75b06649802bf898fc3337ea3f783bd58bc85e33c51c91412c09d99c310ab9802ddeb4e977a640eb05a6e01984186b62f3237230b33cc4721d984382d003a4472496c163a0c23aa7527a7a98b45260794c109c3ef645fd352b778f06c6de40ae1aac577698edc053e951931e88b75619a2e3a795d9d7a015fc39978ba6832da41dfc1aa36d53351321107d33d00d934ce079f53c1ad114b622ef09fdb70888a861e8b9334610a9c2a5614325b9265219dadfb7eec92b472c87c0f0181e73c580b9ca8564bc1e3b9b70528a30d0c54bbf48b3001c46b536c51e15c4d0844fe81bc035351d919212c699a455b7f0900121a77360f4aaf09443e9031ba9286c0ef18a72a0c6afb2b380452379fc14dde6a20cae7c703b8c367bbbf4ea43df773bd6a3a4c051caeeb66a236244f7bf5a837731655a73bf6e7a3413459cbac0dde329e59fc9521fc2009e480d82711496a5871f33d0378223243137486504a209d9012574b10561fc04deed84999baa3a936a9b1234ac4c4afe451042f828cf40c49e632c6153684448154a023684af08ce13b204ac025991c5e44b63201073f22a50c935b9bc1c488aa8a704bc178ab0a752595cfe050b341a295f9b851b67a3c09010ecf297791c746ba9247df2a1be5a82cc8f904e1553b31d53710b0b0b7372b8e9c0b7c15636097316d46587e07753ba05e03f7cb3c6c78870a7ab21ca99db30217245a29fccc3ed80364ec661ea93194d472813a3cb0203b223b909c5774f2dca50e8a9753e36c33d92c278a52122a72fe389f0f962ce5d3a1d9f5c07000919e4761a07282e016854579b1c2e7c608630c6b2a6a1bd96c71392b9ef15e04f7bcee414cf5d9a6ff701c4d2586506248f4bb6bd4ea4a45fa79fd92aecdecbf20d7ad8534673832a0d6ca13c561a446aaa23539624487767e4a195dce0e2bc6a3fd1a73e918f297aa031fcd8c14925529ed33b83ae8e7ab +result: pass +ciphertext: 74696b4c1a221c93a233381becc649df53c59889beaaf8cc06879dfeabfaa190fc9d7a9b6995bf4d9571d3277188c4db8552bf90a4b51787bec3636efcf8628e199204f230241198f517345d76a105ac070cf81591bd22bc1e566205b7d01c16c2da03f1ad0682d1f32ddbb6a2ae8f35351cf5d5bacdc727d603c3ec4c5f51a9906a3f12bf064d27a5b573a1b91f652c4bac4155045d69669158e226676c7049a439fa3213ef20cc61c8f0b89c194f131e172ccc4c1f6c37567bd910eba09c21abbd3a8ab275ab15136f6fc92593766b930983539eabc66e7f63f572fac05348c7cd6ceabbd1c4865e346298b6df6959caee42fc1b60df6373ff46fc935e881b478a0983c1467c1a7fd343693996668ce1d8dd147193d85fa44277c5a21c57d1d420e1e5caefe51049285ec812dd0d4de6117ea2fbc9e9d74221c4e8340895ecaf684081fb845ed994279e1ab22ebc0ddaa9eb5066052aa9cd371894035d56d125f40bf836ff159a14dbfc99d397b703824b1a7b74ac15514905fdadb8034c09f018d3d87c4d2c2d520a2bb2a240050fdfa67a157bf1b17931106c859256b5f06da1ac1666337850dd9d4fb1ff879fab3a87b645c0e1d22b11599584e67e44eebe9d3d6864538d86df728300268f0c2fabd12b474c7fa2bde4dd04353cf54874663a029e2ca6017a6a59d6611a862e3826a1f1f18b20be5beada3bb1edabf9ef0c0ce83ef22674feb2147c769b7534c4f50f80f48cde1db0ab0934815e39f963430ef4f6b4204016363e105e258e733371c8d6a8c517150cc75cdbc6dc28c98359ff083306a0b5215ba1bc17e660dcde16add252177d931b6d8bacc181dcc5dd285825e083abef17438904b46d21b2c3914543f34e3d958e41e8089f89f5aa1af040fb1258ddc663925b55fb486dab814a45210f0ebdaaf4bbf2115b0784862c640677fcfdfba3d05c47e2c5ded2f6c03b42bcc9f87fae722e895bd4f91ed91207f8bdbd4f849c73e3b53e8a5ac14b500ad19fa5e9675592595250c8e54795e829443d9c3b924efa8d64a3751e34212205ea88061071b7b4fb8309e0dbc0bddd329a55e30d4eeb3369e9bdc2d949565f6c4ac214530f926b7dbc5b6bb9a645635b3ad1056d36606c0bc34089f50646f0bb948e3ad50cec750de11a3b4436c572c10608502d8ee43dacd12b20183006070aca57dfff0c39edb760b29a8d1e2790825961f8d3d2b27e4be8d06ba613f80422e40d77de5b44793262fb2e5c5d613f4d66f8d6e29f5aa312dbb80eca37d9faf6b98ba63b0dac2622ca7eb1a53ecf7ad39a78d34dd787ebd686c155041adc742d8c13480b36dd8c50856f2fac0c8fe532260b6e5e8f79d4836033bec19a96b5c272ec3505b800b555a763bc7d673a876a9ecd4f1e64fdbb6bc4710066b5c1f943a53f3e934b1f9d30e8edfc2aac8c775bacf9a447626838aefa0200df587b4a4bb930341342d9bf4af28e196abfcc98fe8c98ff3ef9a318304680ca5221fb7f8f408e6f5e56ba69a9286afbabf3d733ef1b958cca8bf57c2b7e23c1209ca90d6e3e8f10ddb54ff29243fc340f28b97013f15cc21a92299e4cc45bc007ba13c69f3ba4af497aa17b289b3379f553b3ff92318d7f5f3fd55691a094761ff55015be61a7ac24128f29f552ac8faa5ed8ba3a8654c035fb08180f1a72ede79cb6c549475cb1da0de23e42fb887a30ff16732131bad9014c58364c5e91bc12988ca31a8d9ea5dda91411f7cd5e8f4ca503ec1df40ef53bf0893265241aef66fa85fc15c07726439e741ace97300bf89fc57ec746e34c40d9e6561f69ec2871ab520723fbfc72213d7dab6df13cb96311b502423dd0109659a93b5bf692eac025369a9f2ed7fa6a30a824d29aff97a5299c91280c4f9256677d872ec35df835a20d621b6e407df36ae67d769a30899d1f3ee148b7a8b2b05ebb3fbff4046a08b9691b5036d8176d72dcb6227416f68ce7de42d9afe1a7b20cfcfaa6803e043a0b11d614473b46c09751538cb9acff02767b957efbb3834e282f439565d3d144d5823653701c19a1ea7bc0a204d72ca7641377f241df87cc98e0e355877fa1ae26f91b23dd2113412bb7c03ec8f27da2612e26ea61a911a276cade74d287f57c292b4991808a66c8c25afc3f1ac370333fa9c9261db06e9c6dae2446026ac9b95641c60ba622f5547653ab4b654daf578458b0 +shared_secret: a74e04b62bad015f2346f2d44395cf5e7c380cb5228c55e843ba8189ac2fd7be + +# Official test vector 51, seed: "450751d4401737459c6d93e6c5f2fbcc4a3af7cd7250ccf404bbb817a67bab7b4c9d0ef4570bfe25cf919da331c31d88" +entropy: 686c921c9db1263e78ae753b1c9c2e7936b8229dca48c0942c56c6bca4f10917 +public_key = 96886aea374a0c4886e4185a5ad8ca7f1a7df73c6af1282397a6a9b94c95c8284a0d65c3e614cc73159fd71bbd699006d1b97da241c470aa28113a24eef9856ecbc3619bbdbc25bf1691a241414cc3a816433c6d9466037cca4dcce8851aa9a182fa9e7ecc47e42713e9f81189cb5b68b52389095544427321ac5bb12000371a1e1cd96b585223eaa02218543c6f32a777d79c3de28d13dba32818ce41d13e2eabbc3c1223eae799057c43a2977ecff4a5966a7e52d0554a8907cc39495fa80339160fce96742fe5679cd4c4648910ae0715a9899530723be9b551e404b88a1c272e72b1b3e56144a4974df799eeb20170862305e647951645de729da99bb4fe579309d4abeac03ea4d029990b3fa8464f82e4472125bfb98837e275508d161dde593b490461e6508276b344bb18b93cc3c965e084df68a68af14e6bf37b4dca585d0621a4f32263abab1684ce0b1a5fef971e8fe18928d38477572e55596e35ab6270880c2e6abd0ee9080e75850155273aa38c0bf588e02006f5837c01063360773ff79376a72380d9e123b199b561007f1873a4ddb715abc93d95c7a8549407ec94cd0b928b30e3cdb15804cad99ab2202005675e68ec6f71f70082139b42e5bf02abcd4a4988ee0a16415a095ec8b94d2431070a710d72a596e30ed4588fde91670f3ab70f35a5f0870e86927d68f641faa10f962941e0026908ea7d27084261d190cb62b4354a1c8f06ab864031341637929b1274a1c97bd62208e681f3a96333871c41916b03e668d7559fc0a67deceb0d2f818f45d82a9e4a679d76436bcbc45f1c971e966a6cfbb4e1948f2e4b0620a28d633b78951812fa15c4696a7bb17a9ddec0329e927aa1294e5b7974bbc7008a977e0e13500337cd62b281bf73920f02b19c357eb57b3c575265f1e73a16b455af856826f29be11049a7005d9aa401aff512e8f8210f296fe64ba0ee77b1734bae34000b85c609d8bcb39260690ca9b82e105746acc35fc49ba6d1461a748206361ec179990c1b2ec71387b51c1c7ed344b816008c384eba96432ed66fe4e7225c0047e2b2979bc359a891b258a2cd40ba3694086489088b42452682518ec4c1bf8b56b91519c8d02395e726ad48696d5a2809d7f3021539bbdb38bb11e823cbea2e7273742c87776457a1804b89d524acfcb39e19fa454753908813815349a872e131a5fc91c51579b3a50e9142955ac575a8a528ffb35a77a6347f119ae0fab07701cd4166a0144963ad69268bacbfdca7bb18305efd006e44f812d063b0b7e8b1fd75b5b1662a49e26324f89415a51fbea41b75485c53b661c97ab2b9e193d6f1067f518e8522a73447aa1be8af9cd722eb8653e1837279c5194eb21bc9127f1eba895f9924a254c6b38caa0907018197a771d531a506713d3434c23a3a2b996b7e11c83b97058af811e974819da2147a473686869f4d04bfcb9786a0f9723dc67e70e4ac0f565b85f4bb30ebce82b21950838a2102805550c9fc1607ab93a7e42a0c9e79611fa7829beb0254050ee730792e73975a7b38bb718ac65064ed7090471658657123e7823631e802142aa563771bc6975ce2722f0e012f555c3f021a7fedf78f51020935d01a92362dff154daafbc4ab6c8d32d2a11525a474757c690b21274b443b58458b83766df851d95214dd04bc0af73679249cde1055e1977559d26b3bb60bb306503879b7fbf0b2eb2508aef52049f43adf6275d4db027b6477d6479cfbba91ae0abf1dc8126fc962ce9921da1b0005a09c30b6894ef6b3ff79a0c088bd2d6074988ca824aa18b887073a10c7f21982f802204c220756c0bdf59ba855a63a026125bd5c677db08368b475b52c3559c3031ea56040b9590f859f6c2560f9170f5fa759068678b9e22888671cb0a693e825bafbda853c0b56b79a63aa198710b6246a4aa58b226086416d3ed82c412b282cf38c71348b40eab105ba23b2f3720ebaa6f21c9f7b23c4e324c4c3a821de7957c21183fb48c4c127732ab169f822c3003a803aaba857c6b92bb22d8c10251ee1a6838b18c650cd5b8304f886240e16c8cf4a74f14938a21a8f3e87bca0351daca3a8d5c014037ca5665a2589eb7ec6f29d18d891c0cac822792b3408617166b55cb1182341a309f86f99f86b4e7c54e6c2bcd15b15b091274f185cbf5aa7a7a8ce437adc43de798498003691147635e787ee +result: pass +ciphertext: 41f7f6acd3a13f0f0e91c0565efad496157e3214fe0389a827ef01e586b395079a7e4149d29973233be333f2ec98af0833a079fc604df34cc4b979237327d7bfbfc5601a3145dee46b7c2bff3b415d6c133430a849f9d2899262c0b5878a7b81b7023bdce506753692f82f7ebbe11b9ab07f090ab5b5c25723bd3b41f7984f95aaf9492f12f1901c5eff906515aa974b0bc342e1474aa6a0e838b79ffbc0cbd9af44684a29aac1fb249194c3b81f37699d959602a4870bd1cf6cf8a56c05a10c0f1d3e3f61735876e9d20660ff520a42632c19ab533f38409fd85e8b3005577fc86e06c36d6a059742a3a915a67d04094bd32606201b48aeb2d2e986a15688a598dd618f3f8d530a855167f911a5121bfa08da8afc95ae3c80ce7f9b9250b0cd7dfc44ef05cec340edfa9b34ec510f1b48aaa1f5442540b506be68a5e1afe2d8333238f7e7bc5c1ec0cb469d820c1d4d1e385064bef6424df8e4c1184fb62f92aeeab255b5514c18de635cfafbc5c2af129733fad7fff2d30c6734c04d49951148faa8864c4e4e854c841ad05e3f1482e23eebc714aa95acba233fbc6f562478548160be934935970de913e3d448915f696fd2cd36eef9f13e529bd04e993d632e2d65e3b589891d0d1a4885724a3802e8513ec68360f03fb1b273bc7715c3d675226793313768d4b1937cd5703eff763a77b66bddd49b77482305b3574f0c8adee13e35d1177b9ce29ae279ac4bbe11f27f59261351f26dafb041788d9e57d9aef53ef156635e5bb12522ea4454a52217d8e20961b39765f3a689b9827245d0653dd4a23e628ad08d19812639b62f4c278b5733a618debca4ea65ce7e4ebdd2775ee90db0f5ab96f57be14691758f5cb8ca89b656d1a3a591e9ecad9b9cea665c2c58cf111935a2e50d61ed981340e77f89a12039fa8b9fa6f226a01238f5ad3bb87b7c83506265785a3799fa58baf5ca23780956d4727eb907e327ee3d575899fdfccd80e909b64dd70a63848a5bf36c79d539145c137e860e714617bc32e9297d16c199bed73b06a431c4a974c621e9ccf438e56fdd4ccf89f1b6073ada4b3f586cbf574d91a76c5581cce76ebb3a54f5a60c464b25aa0b43f5521d104a0cab9eee9ba3c4582115dfe9fddc113b3064e57cb95a59e32e7a2fb22fd19f86771fd3c5a5ff430d223442a797f018c6903461242b7cac41ffe9fd4932f25901fda592e52ad42b03c258092b7b9a28d531ca802defecf7f934a04e6bc0a736b136e1df01cc6db426c80871b9dc2e8bb2d76eb258182a3160700d3ca0c72a1251337200bca137147a6e901d79c49fe663a7a43a0d056d4f9634d563a1f3650ecaaaa20e520eeacc863f204420eabc2573eb85d76a32b894697bcc246aa1d9bc7cf5293f405d22eb21411e6b9b3bc3efddc5213a0ef74e32845626092ac8d2dab463bbbc31c8697c265a5b005363a3631aaf6a12459c451c1196c783c0bc8b76454c1034c79a79cd6bd54ded518de741c3df1846532b3ff540c6dced5dbaf4b18583b7b214d9123a94571e10944736dc8bdb7bd747c509d4d33dd3066bf78b07f440ce1626046e16ee05cbd09750340b1ce080bd0bbf13fdab443117a21f5928c27ea58fd7760a812aeebf3ed3fa601ea0fd92f217edfb3423966a13deb3755ca26002142f7d624034206e022a0b230e5e0a84e38c60332b79497fe7a73982581b14e2676cfc5746b6771f0df2139c49a0e06fa7ad0182ce6f197c90b59784eb18a83baf25c1628d1b3e92e4a52a26c97956341416433d94be539add37e4de168f87e9eeed8038df0d649a1c50f6185fd0f144df1c1a7d08a59f6a2fe6e3767a0556f322a1b5f0235e1cbf61a4f567c95a84f564d17ffbf5adeb01a5a2d81f5501764aaff6009b00103dc287eb5ad4ee6d04b8cdfd178e38f9f31d175fe86e22887fdb97d47538f0aa4118f84bd56362d08f9fdeca3110df7b766dd5e3b92f1afb29e583358d1997713aeb3bf88af40585462194cc4ce6a60c570e1401eb93ef70d0c5b4ee09e4bfe4b39ae03d6f179dd5e5e861d4f26e3bf7a03f03fa83c1e0d1ba095cd2168a32e74cb834cc6707905d57c3771fa85ee2c44b54008d660068280f94bde10839ff502f0530fb245f9472fe9ae5f9e252e0d861724fedc5df4dc7b6a0c62113339bdb1405bb039adb2e2d5246383e17197ef89025d9028c05a18526 +shared_secret: 8feaaacfb4827cfb8e45729780e72705d15cad0e7754231fc4c47260a740b051 + +# Official test vector 52, seed: "5de720f2d152bf4e1f96a61e7ae5f1bed6b8548e32638c2ccec9f43b87d1bb43dfcf334f0582984d27e440d519ab662f" +entropy: 2387772e50059cabda53cb93ba24b19ae529496c03b36584169451525c4a0e7e +public_key = ba96bfc11884b9304cc16b669550cc08a2828dc34e704534fcc057a45b25ca8ab600372cf6f60bfd530b1e67309d5004361acacd392d104c9d3bf66075d5949ad75815bc9517f13208068ad5250595d76caebc3b188a268312353e232cbbec0830c45b44e315b4e037f66722f2c8c58d37228a7b3c81a8914de52757947eddb3a99ad35bcf1bbe82d9249d228a15009bc2521162d28f91b70ce3c05c4f027cf638053776511fd4c24e660023720370042c6bdcbee2cc853e1345268235e1e31d41106b1c359c8c4844274a42059724b1ba455e01ac4b800d79d4050c4260b862ca9e30a3cb876852997298609c19479b7ea35691ec5de9a16b09382cad755cd1a008c06b3a5d347b75a06825d4a8077cc6a61543a6e4c362e979a6824dcb494b7f510c1a3557664b8ea3d681702932ba284deaec19e83bb4eb0b4e916670c185b8effbcba3252959714462809d54049561baa71f13ae08d25fc587a01c853b32681cf1fc906fe00c2cc58971f8863b803d9752310a18303298ac6c188b46ac03e3a24486b6bab54306fb1942b908635028238622198882989f712ed3a30ef5970528bb477ee6a670d031e5dac2557655acb2c10923441a77959923bd8fe07745988efdf48bf794659bd34cd8941733f97d85178021e8b20b185e0cc47973173c15a681f4a0ab52c5c4c6f3a2364465d3c727928853a5a55998743e58695feeeb9f06c2cfaa70679c00cc6ea329c16bb4943418d90017beeb03852400b7e87d6eb8be948303e31306a4116fea8ba59d30ab6f0a5060c2aa89329306065290466508c17eaf7687c551100a18cdde6600b9e467e3fa7b10dcba2a722347349c2ed9443c401b6749225f38195c04838ce8b96ab66cc2d7235c8b0316eb7e1ab1ca956c5780fa491a7720b073beeb48b98dc41a1b276020256ae6d85aa3cb2d60e6375b44aeb6e34503fb0a73426cf999af33e89f1f2934c3438f47814d76413b87a264ffc67263e3cadbda0366f13b82d9a789d55f05a30868c6a9b7bc7ca7e69184051d9f2abff4ebcf0e26290e69c0bad83ce3ba19d71133a0d8b347e1adeebb8a8b915247689311e5378d256ffa867fba904217339976b4af06bc3e5a9093e8e45cd615cbacf65bf1b0899da61790883ebec896a095959af55d0d7b39a9611e439a26caf8c71cb05a57ca071c719a281625c2e4615cd4b74826323b163cf161bf6a0424eeb2381df549b050bfb9628461210461a9a35863bc0103c8290244c6ea5ba381c421421c91c010645ca365549c7aa09520257634442b83e5806d2a274df4b8888bca68accbb5350743443d8dcb471e25ae4b748338a922b7e11f761b059bd5848eaa441c812951729d6e7013fa98340ae9a142b84b6a98c6577369053652b3b505d4d8607737b49fe06c5ce8b40ec680838a182e34296c317df67826f4ea16f4547b4fb9cd0778b2e5c66e1e5382db0c0c432770d82a1e20f59ce1eb1cba29a1b9d8a5e2dcba6b04022bb72923591e79dc4f0616b2d4637be08558a212166a97588e128c08579859d1012088a7ef26355fb4b83849aa3ab06b886aa45b9a1824a74b05f090baa7cf2969368e6a82750160ceb0107811543ad0bd25031a285c4186719d9a30270fe1c73ac8bb64d912dff5bc324441df18ae94d03c82b63cdc9085d073063da296627a5cc754973cf296f11aae6bc102e940740c853fdf2576c24b3816e60483448d9a28c3e1b295a4e6bb36283f4706290882b52f7babe54b95772a174a4a0a3767c2f6aa992f5904350071ece661d94c868df7396c1a1588f80f78f82babe28531d97617335cb098cc530c5234dbb4db98269d60b271376a52621fa40a464bfc620cbc08b2ab0198e2bcf6912752b39caff4938b842b1519455bca30c8b15f6e2942b1c6798b584d89382abb26af5be574fe12838737091611adf21507e6803a88570d19e34331f07766d39d57f80ceaababb0ac5a29991a1189a6c9364b93a53e73c13d91c656de3038302279de8a0d45d46715d78a8c9aaa5414540d9cc6553cc910b24cc941769ca5b8c576ae8e559969720d8048291c9374913ba79ee9cc3cc217c5f1a590a7ad9bf27b365881366c2a529a85ef8b34d64792bf786964831da9a38dbd81a573b74a8247b040f60404a038846bc2a3117bbd025b0f7a7de41806de885d79e49a5eee5db12a57b1a7da55ccb00b5b +result: pass +ciphertext: 32381a661b39fcf9ed796acf47b145bbfb95995255370e072dc8690b72a0430b316712f2fbfa1c70d95a3ff4a81a054280b50a7366972b7fb7e3342006a84979323b1ed528969e2d4a1288542ddec0df9ff963abbfb483b204324a26e1c21a9e1c6089962612915de3824f034653eb664c837c7db70b35462fdda46e1fcdbc57d4b5a611e7391c669183ca58ca8a7dc015a3f7c4647d5fcfecf87df2534b0517da8d8a1e3585e918ae72822b37c25633b773c2837eb28d8c527ee211987427bfdd7e93909bbd43783433b587c6ec5ed0b9e75f673884fe22a63a16e8e5c1945905afa2bd194a2a16062523cc0a5c873b02583ec65e6999a20ccf4ba76031773ce2efd50d95e841860a727055de7247c24eb610aad0c65d4c40b90c10452b663538ab81e96879d5757af125c719ec3e6489556d20be9bb28e6c894ead6fa96b9bd8b1f15524dfb1d6c959724b3b46bcea58805a0045b9722b1930a3bf5916b4d8a8712f9af1c40589def2ad4d8aa99a415a897eec81c5da5b0c933ec04f1f9d02c0907da1b41e6bf043a8f85fe5f4ba76c29ce2c8c6503e975efce053aeed389035bbad720d05bd081f72b395890109250dccbb4ce195c9ea46d55c2f44a7baa3e89fd04e909a81d19a964539b58c1b7e034b74babc73f35a34ae87a0d6b44498d4168c65a29841adbcce73e3820674fff1a8f45b0757d206b1595371f0b394e1e70783269fa75623aad43461c8ce8fbdc0592d0f1df8188c66df2c217037391666c2b95e59254137f26682f9c19a2e665dfdea3d79e8e8ec2c0cf9de2559cab184f3acdf0135cc8867615c9e2a7ef4a8861d33f62e89aba5b831add345d0348811324c0c934600993cc6a3e628d28c18c8d416b8b9960d621e5c4062668b60204467a5ed85c857dcdd057350c9af0d6046108943a10f8cbe9da835aa0bb0a803a9ef69e880b0cfb61540d161ee4aafd3a60fe8ef6404b1e06041eb9b6a91bf32f1b6be7857558bf240cb16532cfc8cf5d1e41f18531404e9209f99ad2d2134b07117f49d9d2fa6e7463697593fa55caa39b3dee39c2f377fda9543d90f591b5716cf2f8105f8179cd3995674af5ffb1b91e4d65aae0fdbe8b473349905d4f31bd864e65728ce2e0251389bcf8bb41ddc476f0f4ff5dccf8c35dc66a05f3f85d470c01fd2fa37ad39d187159981276ac684ea7d767a2f07b68063e7cf984cb2c9de7ce3aa98cf2ea1cb1b6b3ea1f42db3ff887653410c5b6109f1f29a272e590bd99145754d238c5fabb1c588c0af8b6e95b698a0349a7a218292f0360b5a32457fe8fc6eda0fa51781694947f97762b1b08704fcb6beefeae1f1af76a5acb12323ca14b92629e323447e4d3852e1177ca219c29e3d68216f19b470c57c9e57388dea6eac11a9c512a3cfe9ebec129e6dc298fae802a13b22b21372097cf60fc0db70be35324152afaea7e4f42bcc30adbf67005104fceda73238eb042b5e42f5f99cb802044edbb0aeeb564cabccb0f356d7e090b175a4175d44f3c06f5796d0cb5054e2a6a73b71a5a0fa4528e9b49acac5cef1a90070d07b0a45c95e4fc046321f903defe1e08b102b5821f53c09ac4d9f1de76b93e6fae303a2b695706c025993e396279b15e29df2aad1e046157bfda3d61e11b7136c82dcbbf6c115b6d8578eeb0f3a326287c64ba47a01ab8f680300324edac1cc84a147121c30700e345509d6d18ab26febd02b9b8760167aefcb05f92f128919f6b2c3e39f39d2404139df30e4176f3d297ed2cf24ec2a310900ca356a6099cab367a9677f110e4e2fd7d8d7734eb4d6d0c9ba07b96248f05793d3ceff900dd3f03ae5e16a95b420dce402be568faa24e6e3470194d7adbdb9762a832e74c788cb97e9c6161837074267ee67c83660af6bb845947f248a88c9e1ed8d3f6bb63799de261f77ca70ac129b60f6dc1cf22360d5e132db7e1b7198d8de3791cd4044573b65f82f013aaa642bf8a93e55b5d9334bfebd549665e20f4e496b25281816ac761f4f4f2064b8c0fd31f281bfe5fbc67d60a079fc7d024657e58475916031f962792cc7fc457cdac76f73d0698af97e218e4aa175411e0d1ffd0188e0e89b45c0948efccc3d9631d0a15db4d55bce5ade1506a52e7656c7dd3da4122a4392061942d694d46a20189559bb03a9436f2cf3e47106428043563ab0d0a2f967173d63084558e20ee065 +shared_secret: 7837d532d751ebb2d4e8debc55c324f951e2128559c9f7db17fdea6e39bda6eb + +# Official test vector 53, seed: "d71729dcbb27d7cb39e9e905025d3e55c8602efbcc483c9b866ebf82326157833169243c14550ad728bd1470f39c642e" +entropy: 155c29c5f0378df0cd0e847a80a07143cf7522fcd880c9229eb9feb1ce340cd2 +public_key = 2626cbb144988961cd4a5b3797911772787768b796a5157c180a1264c1bc6ad588139028f9f28b3d8866b8964a5253b79ae86064b5979a0b468f87ce0ae843f34765982114bf327ff08c801a3a99af0c27c72cac48614620d373b23c01d1ebbb3331c4f0ab6cf7a03804545427547acc2a467e895d75486f23cc23c779a390026e41b56cfb04b1e22190894a3c1ee16f19017d7cd75151047618b49921c8990a580a03e1656f841e95101eacc1106f0cb94dc2789bb1a2b3591134b05e7d983736f83cdd985d160a9caa210de0813ee78b411c813fb3008742f793e337a699b3a1180c5a48e12d92b9709525858a70ced2d2c81efa2401283fbca4c4b4f1904e75ad66a894aa57cf240118c73643af435f024013d6664543888f7f30327bc65e3631a4da4b6629131ec5067ec5a8c354f94aa207b587f139fd3583b3cb51e6f7926b9a914c15928738a75c9b618b250ffdecc61061618a8038b3c65841ab3d5bf203c122723b087d4ae2604f5bb6c9013c4f38903f65248c9783db79b98b9a827d528444c26c8fe408d785530d90123d30371cf46307e1c6a81097ab96280ee058d598207e666ca0dc213fa48892c3b7d5f49bdcc894f2a8659fe882201b4eace22e1713c06d74156a6a04d84c0b29f6b53fb61773d19f5cf9394dc03ba90923d33055b5c089f43961ce810a27f0878f4a77e9d60a2a1842a0450ab7208d24cc865a6393a9820b62f96abadcc0650b171b473db3e91906720cf7ea3730435f639c1ae9fac889d76bca6602ba96b0eb98aa44136cc3a978b747acba054032d36509a7ae9dc30855b2b1699628601793062c5705c5b103344c3a77947992a2071c35f6393942dba3b8545eb9a58ded8a5407a270b676061dea1c5d490f25a05c0f82750ae6151de2bf028a28657269789733f1e4c279203e2fb837e6ab1f30c04daedb3ac2809791e8ce988a4c1754c8fdfa8be0fb8c94a240ae3b1e73ecca729b4ab04044be1b97972a1a27bb10bde4240d49a568114b938bcc050b26145598905735ba2a3198e3a375b752d8f5a84004890e25916871a34469a8cdc8b1077482f785ac3e497574aca642d74a3625ca37dac98565ab6f4c95a289a434c9ce9fe61d129c073b5cb755306d47873fb186bcb86ac00be265c320c70788bca0f462fbca6db8805986425a6437304ce48d59588489561d37b60d1f171f03ea8ab817c93ea7c3afc06447eb823e630acb4213b50793457aa8f0b9b484d5830399bc2c98a7fa452fc30713fc85ad9a7707e8343e2ed113ec436625172cd4162cb7730e5f327e9566a01df27d06b460d155c8717469a365acd5ea80b935445a6610efd3062ca954276c70a8085c42aa7f82628655f97a06c098aa7ba8a1783060fb819de027dae9256e8ccc9a72539985144830c23ddbb3a1860147bcc0edb69a0ba03bf9626c1f35a611f686cb71801e130e0cf363b795bdd9c32e82978f53083262a703f85398d0587c2cca06ce1c83ffd614d1a85d437784623814d804cc00778978e0cd3e2704d34563fc23494d84b6a4482401b009b601582bf48d7521676023439ae2c48e5b54bae0c592b64d038883a1ca9a4a843c100a58d19270f8484da82ac633c3550a1634d0a7cb8bacaa19d4500af0ae14499ebad63ca1d2afea753e762246a0834942643050b151cc9aaecb587808754e2aac15d5b2c074667766181309b113211320603499d9b2a5aca065d8c088b24482200c0eb26c3f7de8751ef56850ac8097581852873b396b05ea4c12347309c7814dc89929ea6c3f09d9bfa92bbfdd0680591a69dd855269fb77e8184ddb4aa0d3b2a7013ba06d447598e95222774badd3544b6c80c229392b0caf13a94eb3bc920fdc0ad3aaaab352554a15ad0aca4d7038c208eba4f4b181e8194e21575687e55b5af0c2551acd36824c73c950b1d9a8a76264adc88e6e220396bb1aeb6ac835f2cb3167c7f4db6bf0b6552db314bb91584b86c0d7762041075a432583f8f357a77731edc1a7ea932dfd40a8ac9c09d3a687dd530ff1ab95c4e56537dc6e82210c0d3c582049a180030acfc3790fa1b437e91e1f67262e03cb59a87485658182d1a518822f678c266ad70fc1622c5b206ab7c61510f1c920db37ee852276f1961e64614ec8167fda7091988c176e893ab163e034a7e92d569882badf4976ba648396ee00e3af7f5bdb9a417e +result: pass +ciphertext: 1f4d4173d751f63ede8c9347d3bdb775f629eecfc284a185d9c633ce212e168f1a1716096e7b86ac9d637bd9e31a82582104b08375b5a4804e67ef72e1aa69f5860477c11aa0bbe3395934912120cd65d178e83f4eacd7d68243545874b3e88b670768d7e73b8b2a3844abfa49f1c3996ed490d19513d93576e212c357e9a1d38de0b59fa52e86da6e519d4918d09bf673430f59cd61c7f31754d1c56c0f0be72abd97e744d859bd39c6269f12a1e8e54fbb546ec4fb24a1ab867a8d33ba986366685b43eb5682aaea735361e65dcd7375a20a6f1511e5f2c1815569e93631839d3d443c7ce279cadc2766db0611d5ca845466c4332a5f0ce96c68d4c34e58b8ff81b1b11c2b824215440c25dae0f1d6c3c81f702a06444412c307f6db4765d1c0adb5c890b4655f0bbcde0fcd031297ba9d05e1796264cfdf138f259cf503a2410f87866be23624e2aa7292aa5082e263793e6d20801d238eec7e9180412bd118a6b9423dbee8f313aca37328454ae381a71afc476b993b3c7a2e738981dec9d6c005db2d04138d1b116a71df068d2e146c31aefcebf381f077b276c4e2693da745d90657a38a39311e875737b6938a58d0ec6a3b43d00b86ce3a64240d27c96f1b2edc705632b5035640e7164adf3bd698434c63af5f03e3b62ceb05903c82005800c2e8a5128754d5d74171096ccba35130fd7f7ebb8f1e9413b2380d1c40ec05e724fd24ce8a9f01792e624ef9f77fa1cccc8477f6bb87dad3b13ec15220d408bc6d98fab7bc7a46c16efae45f60377fd2086957dfa9f3837237e7545ecd0a0779686a5c3ff7f842e2480667c8a8c07131f54a1bdfd820fa5067e699459c942019e2acdef021393e8538ee32bab41813b64437609df35ea1b775a5c69e94fb34059ed4a3395abe419e2534cf450bb053f0f227b32969d47ef9d80ea2f68d27817d9de83aedf06fc19aaf3e1e1f61f15ea41ca2886d6c43235d47376c02bc9c061cd4b556486d502a724a05786745f0f39760ccb3c3cab55297696936a835f4415deeede9139504c483402577730ec1ac7878635e1ef482d441f25beb2b0ce79af6691ee0b41f8c56cc20de0e85da79f750e087ac1eb1684ab2b3884ff126b5cfc21fc322475ef1c3a111fcd98ba40ae5a7cefc8be88e192a60089247064a3a705108ac38c3a0d9044a74e6247477233e90175d83b10e4d49881196f0c50096d6750dbe10f11ee263420d63de467109f98d3a3aaa0e577e07c83c0e2b6281a50cf3c33286306601c637dacc6915fb23af9151395ec5719a692e60ba8ac123d16684c968ff534bd91d4ea0144c13ce513f962d055a4320fd31eb096655888bb4a834b2a828645d66c72d7825c8e995a2d68d9b59ef21f447298fec25221e5b3274be0d73bef1633c57323a745d426192c6b6fc8d195c4be182ee95e2555b07597d76cc8755b58eddfc92d08117a262d0c80297defa70bed167c7b4fc03729cb91f063ec0c85b3ea34e11d5835219516422e0b653f1a4b6c6d85bb19238e16b5405491f482dd517412b00d67596587dc6d84093bf681ad17cc293a5c70800419366796d6403259a62ff5cc10c02fde2abe8bbeec6e1135f54579d58f0cb8c560a15d90f11d289966f081586f3fd0476e90a214ccf66b55404400f4ab2e41b9b2ec1d1bbeeb61c27bf8d6593ab65ea06b5628289d0abb1296d37b17f17da5ef89cb180a1b82b73aed5469864e3b751c9bb45285c2caaaa904b1f756d3e053be1fa86f5fddc691b76714170b8be35a9c6e8f180965fb84a430a62f939eeb4c3902211e9e602c205f57cf91607b459696136486dade5099a9a2a0c20508e0b4d08c35f7922fe548a4313b246f902dd7384f5d8677c150b9b4c3ba3c985306450cb0267d34bede536e010fc8dfd792861f8f34890b29b92e7e6840cd05a41a746a3ca877f6a1ba79808b91b21e9ded72342565e651232307f6afea7601433b92ede5d4e80cefaddb313a8c6e08a3baef45e675773cf201e6b86050a85c6f3b602b9b47edcb75d35511e2a4079d1584c18329a43be1a37b55a548b6e8504c0d3818950070d6880856c5f7e5ef35e62b3f8c1d8f4328d522ce7be164a27ff263cd09e8c8e365b92ed898927bc18a534cce4984f36a8b42b4eb2ba7dd26b660147ce5933753a2959b4071826f1caa12b13aae83544863c2a46260592d0479e9b807dc5 +shared_secret: 5354347e316b6122fc62202a775657e779e82f6b292a11ffa2b9bb7dacc4f1f6 + +# Official test vector 54, seed: "a7c2c8edb3601396beb2df0657ec82fd5780a2723581a9e03dee1cdb018440439bb1142cab0487c5d136e9af46338ab7" +entropy: a9cb9a61a3324b1ea5afe693b32784e2871096b2ca14a11acc9577c52359a241 +public_key = 032c5f6a930c1f65420b0c2bbab954ae55ca8282b1da2a61f1b111df231df1151504e9031b7b28e793109ed49d46702d25b37f58fa812f68508fe2b9efc319a1976064a648bf7a251a948b74ca3f1985c5f114033e1240bf3691238b507bf28956a52204459eae072bbe10431a56af24ac15f8b546a62c03740c16ecc8afc58871537c485ca93617a324f72991273a0549b377ac040aa12a46d366462ff7b76a429bb781922f7a5397385421424a24b366651b72c5f8870c21835e0b2949f61eb3571cdcb780db683c95e23b708889303a4b9f2b862b68a4e2614eb2d8169ecc1349d9b71b5206973487660b6e4cf544baa688202b0e8df9ae88d85115f9a183fc95265608661993839914d9926cbac8993013c59e979aa8444a54972b99257542e4adb869cf56dcb305455bfec5bcf64137b72b2a6c9b0dcc6c386ed616d6a25259ea612e89c21a170b64e379458b0abd725dc8f53a55e57604282dd474c4ab30c4218a32b4183f0df24475d01fc9f8550b0aae3990bd414561463a023445bd23c7c321dc80eff509a6155cd6b2059fca448ce05d1f0062f3c21849e38a7a90bfbf15b192265f11b5bef91a6bcd0823e2e1b414750e057583401b3a5f140ed7bbcb87bba4b1aaa1aa75a911dac26298a7b9a1830a48332f139f7a4a12a528b9486197999b5717cb8552b38f7f759becd04970eb64bb4826a5cb47bcfba7cc46ca17039f1da30dea436de4b6ab76f43c06d1a1db65a9001a1e0f510d7b4755137bb4c08a710e9a9d7fd8cb32d64152c0b85f40b9cb433ed1d7bea1821c6881309642053f993739e3bcd38951433b291ea26f0948cb2dbbacc3088d58d42de008ab581b0b3a9341ac18c28b131fd4e49964d72d65658c684472550a06e68391f8d34bc09a2f25161745c74d68681c3b333ea58c412f68b44d066e33cb7ed17253fa655603dca0de7a13c7c0c78c9630f5c57ae925ac97a823102c423d0b7a3af864c7a95885e574d570895540a3793b3cd0c73b5a21660b64577d6b146e888a113bc44d78c175aa7ee72760f3b62ed7c971ae62a3e8f08ca4ab7daa43c51a18cb72158de398326589241f07a9e78bbe0c4cbc5dc388b03a7c131c885fb63841445469c42501d198d114c31da36418985ca5d95196fa12b59599f90750e4567a76a767547baea91c6580a628c3c052c3c8bef8755238c2b31d52621ea5579b649f6328695af62aa8d28402a554941b11baf7b54ffab7bd21918a0a6d6a368516b4a04354b6a922901fb8a0e9bc9f7713b977226bd8477d5c7088b8b90afabb61d0b32de98529aaec904aeab8d0240bcf114c5e3a2a44f0043b628f03fa04addac64c918916a3031d6808104539275901c8d8cbf17741a6e185250c7eb9379de46176d0b6cb02621f97c083b8fc1dabc9a0cafa9585aa848606c9cbc58b96da5a8f414bc9a6ab4d9811cd3b3b512925bb5b352cb67f76c810b3fc79113685e85595d4c62d41633fa092c31fd3102102960a0024d1f460be791bdb0b19b6610604fa26d6423864e93493066f859b86b6c2693a899dbc36cf667ab5e4d8278371cc411abba846b780090c7023a09409cc4541b4d8784ba0f643aa62336551525b315d6fb7086ac604b2272333c071b23595ccabb5459b6307b59786731008b14ea142c89a066d5e5c502724bc384013b5544a99aa872d5b65e5100315f70091d9aae9d1aba29c18a5549d11aa195d7046ae51a864eb4d69192da8248300f985fb5742a8f0623859b2a7aa600fa835a0aa647efb62b9309ba89a9c4b7478a8a1086d6c955834223600b65a80342cdb6788f09b138456773aa8a2b175f477b800c2803867253b06b5c5296d8ca3a4c85496fd9b413383c0cbb95880545c168099926c175bb6008b1abd69505b8c782c9ee06877523802a936830c9e58145c6591c66bc56abe2804b1ac28394b9f0db695b15c560bf48ded5c54a47244daf089975065b8aabc77e4a6d1178ed5b503a4ca40c2584e878c5c15fb41307ac297da94a3ea7e204b8a4156489df3577d74186d5255156aae92f77512d0b54d1c1559b8866af41ec7db75cf658625f784ab26089a076ae52103ee3053acc22a21a2920c65c10ed64372380292293f494c2c663a87d7eab6ef126a4ef50002924497e70154426f8b9801b09ae930907e6284e384a1c6554b2bc594591397810b18d01bd3777534 +result: pass +ciphertext: 5dbbbbb0482e3df0ce0cc4bfeacacef5a8c408cc33fafb645ebe51452f7e1f4ab58c0066614ac8ed6e71a53200ed108c6bb6286b97618eea3aba554f72d4074edddb457e516a4507eef3f5615fc111a5a127f6b28b925fc0b73431c3eb24258e671338fdb6b5508a5940e8b17771e06f3988051549aab62c21180592f4a7d4ef8befdd0760d48284fc977387b2592fb31d638e4bfb0b8b40d00fd8a5ca33b1ebe235c3b35749c3ef9821d4d571a3f32212775dbf8f6ceca4f21ade85dfe5c7d06b11b93217aa165937ce8ab6d5fe513074bc7d05d846694be093dbaa95810984978911031a0313ee25452151d04b57cc8e1c72f88400f1ab93d6b929b2e70e5742b95bb6552e8b228954dfcccd4a009662b7074c2f2b116b1a091a88e5ee7f15bcc0736f00d8af3a430f75adf20eb30297c3928c7f33396facf62bdfb42ae261b95d6a0295906598f4f0e5f06acc2dd390b0e7fe466edebf06592b8a238397aa5c8807dd555003b676caa0de103ca3850109d42c053474e8d8cab1853229ee32c9f65895e73f64da4e485db143ad754a50d96f01b674b5390fa1a5a644eedf8fd3c84b4e764b3c4a8052d6a3cf45dbe98491dbcd95a173031b33a2928d50f3a71728b9b21ffaa4fbe87a8e54ee00a154690739fc1feec0ca8899f225a3e92e04121165b092669f4ba41b7564f65b158c401e8895a365bb1ffb9d63f59e1de277e387bd519f60c466114823180c75427863465cc9e8ce8713d76d531cf8ff75d66573071205d69ce83b5fbef5c6170f0bd0c84db9e2d18171b52eee79ea76e0f960f80e783cc5a73d3360abeb6a5fbb93798a8cd301ea9ffa1c0fbd93527e2ea37230b9349405edcef15862f8adc9c04d95c6d7d0a134fb5a16f8dab7db9d5da26c56829e90056929daf41de948d968338537c80ebda900be95ebed473025c20c1ca8a0a2602581d4c8b17f01060f767c461c7da84751bb75de30042e56919dcb6d429833ea0ad72aabef9174a0920ee3bbd1dc216e07b5333092cd67d4cdf5d7c306387aa6762ec4e285de7d2be4d26f15e775fe4f7cca27ebc4c3b3991540975298e83c922123d8e6e9994f3542703a84cffc681722ff3fa15862ddc062515a2be78b60c2522c4dff01b52dacaffe074c573bc360856b8e8ee656b609791c86f192d3362e7ff47f616d53d028cd3dec69e33eb1b4523f33bec0977a504626940f4491362fa46888f8729a6883061f530a5e587be29bb1569d41f2c593d7b5209342f59f118b79213fdab6fa145b4aee2ef4b6edb888afb59688bb3688e66a0366e5cb0379d679cf5743e184d7978ec9ec58496e9c09a209dca53181c8e07b8bf3b4b8048110e16fb4cb3573700acadea95e7ba624e293e8438512bc122dd2f71e41717ae965e56ffd8aecd15e8530fb5b40ae25ded10d6fc5c72596077dd918a328bacf4018896c8ee24e18613f149316f39ead53019c042c872097de18f282a4978149539df1ec47febe6c352916cc804fab02b84089948ad5c8c2e94626b7b7b9fef58453727f534e3cd5a3a30d7ae1a7be98220c77a04a447ee7b65b36890a4e974d20416449a6f48c8efc1924ca17f44d28bcc7d76d795049ef9a0eb65eba9006f8d487f5258af3647be025a0e60b8998b5914df9c1cbf987a32d928b410b028d45bae13a4b3e5d6ae0b0770b634da807e23b0e2cedf13adaa0f87cc1553f40fa81e51490dfd072c05c5f9f86d6838bd177cba78c36119413f7fef19af1170c90888ff9432992473677b4cfd3b87d227809282bead69d05ae6f005648bea7a80f405870ff3afcc12f87cc23e56fe31b200ff47497963e407ea244106d54b0578b9d411269dd7ddcd0e801bbe9fcc0accd43ab0c88f6ba1ae664c14c231b6762f1fa0a1eafe23d9663b85818dc8db52e35ecb420f8faf2120ac5d3e5d51cbf5fad360277311cc1e8be2c9150768ee3586cfae7ffeb8d376984b86b0b08d4f85c7688132eba1bc272dd6f1a6809cb925c2d27354a87a39f0e1ed129625ddb437d5aa798c674c17f671401434b93cf1b6f6e17f73f2a286800471cd7861f71cc9e15d09ff533b1a34f43bed647f55759e85f706935c3ac7c16f851648de50b238d648b0a7fb15bc9f258bf0033ee19fd6a8f3b2071800ab761d4c3c66f71b8c0813214f428129879cccec4e697bccd2b3d5eafd14bb48c2bd46d7bebfd2123 +shared_secret: 634c1076627a11c878cb3a75e7026f50656e2a90614b6d76985998f51791ec27 + +# Official test vector 55, seed: "467f6158cb86b724039ff18c47950ae5c49170163c910fc9a9b30141f86e9c06ebcec91497bcd156d95758c9f0c6ef91" +entropy: e99fbae8a024ebbbdcef32ce213f6aa942e3eca925e5da4c09975d773b33a175 +public_key = 059a381bd53c19d170642535f7c56a2f6bbea8b824a81339da5945f7175d08c69784e67d5e079fec9129ee799a1860ba58485ed631cabc19ad60934c192a27f9266bef098ce2d847407826afcb0ab43057008339c534b9e19c5a3542b40a3a88d41533b346754fc09fce920ed73b2fd7048e540bc9af49247122771fec129bf133c3c3711a679353a9a0ad47c4094471aee9619eb58a3831bc60257e07d09def864638498d3a731f24a814177801ae900b5fb6cf3374320a261d57c170dab6a473c86036733e85f290c9aa4cf7b56011c61723839b1e7c629c7cb5f4e4bcd1d6c9fec583d4b78670fa7a53f65b9fd0a91cc6620a5c1129339ce2a93a66618c1ec69e584a0e9c283993268fdb1c8ec25669439472d409447b6a04cfd699d167252c29af53eb27f6c3950b456861b7ad273887bcb3b41e75bdf2962b604ba62852a92f7b192cca7391accd0ad0bb65672e66317ab82bba06766917455f7fea8af660cbf6e3103f7a60b9736bf897b3a53c9be798ac0c493911b835b4514f3e095a49a474c0c907987867cd11ae24d22d20ea24ba028f02d1b295605270c00c732b1c19658af0424f2b01b7c4b8896e6706ed564b87f21afb1208f9f85e1b40244d622a5aa461c25b0319567b7cdac03d9bcbca028ab108837150a6426138b1073c348a1de7eca92acbbc0a95aa88864d734bb90cc8b8dbdcb91c4c333ae46dfd8353c27438abab8a60572d19c5bacf6b35a50b86e80a7b9b44bc74f74b050c2d6965298d33150c63c7a15150fb66082c851637568c2e5a9952e7ad62436e8401a0545c6415a948adf1449a51779005bb08bb75fd518c2dc02ed5c0b63dbb35a37612ec44b2a04a3d3c15414c0193ef5c09aac62d1cb212bbc7bc7b380bc88a37ab103d872605ba7883cc0bc83a20b2ce28a31a3b0bec216b7b1419bca5425e255b25a86ddb5ba95900c108f036a9ba2e941a1966b225b03cb7335901e6d32613b54806c0c737984da16284ab0b4594b0734fe5c6018c047d238fea777538d49992992d1a012f4a65008554405e3c0bf8d386c2eac5e07470d4d6015de45b3f99cc1b9b6f8e459e9987b773d69e3783b520d1282b177edd9c631bb4a76052c8eaa8aa1bd62269a2b2d7a6ba35b1670d27be1eab28d1571054a67e94ab3adcca05ec609b5171a1d4ac1b3a2876e33b7218c7b1a119812479c4974575208540a0831446a7be7ae0150859ad521a0d891b7a6cb9cde236b48868c30ed26391410548eb21756c3d9efa564df5780ff7b1b1f830bfbb70ce7181df82abccc941f1d79b6db3a012d5b7ce5b7ea9ca24b387cbfc34400d47200ba07d5f82c28991b289f56361f31330245f264149c9567feb569f4e2c21cd9b80a10a1ace3804b899410d912d42a9ab68b76c2b4197ec5aba066453fce1cf04d2a315961126cc04fb63361e137a258832679865cea937cab03534746918080b1b92cd099622ea137e4d6b0b30d18ba27582775398027bc54fa09d7a23655655c491f23181816d45437be2892eb73958b56899f25b3e48874434f12a0052518f3caf11215df0bc3265d648935a68806a75617506fce900de0cb07f7686223b9990719af5252ac61a6c44a7655f54585abb4d26e2ae5192c2381009b4796c87097c2657095ae03b924653bffaaab6b9035d176fb34184e58227a64059f54b44fe62a68c7a0e798362de1966db1a982ec3af25ec20f3824cafdb53cb526f055bcabe72a9e807079046b57eec2f681ac8ebcc0734a71ec65224e4a80244340ea1d339e44c7e2c5717208a034e9a6791888c9968987e710fde215207eab3f38aa49195190a885fe75074e17920ea64b6fa077336aab211fbb757880dbe36247299bb8f65c132e48c54d47eccc7aa124547c910831bd98b07bb1f435ab7c96a4cb9b46b36b6b667da4eb7cb2a12f1bbfa88b98f3c6c3704be3f000f65562d7d4c4977ac8c98ac44958c28f65280ae68466f6b7495650cde4aaac4c68e07767d09f44917b29df63352dcd76c1e393e0d5067c76855a989b04547a625762c730624835a6636191c83d3836bf74593839a83847aff3bcb3ab169f65000c6aab1df08994e161861498fa2e42d1203786300adb060a9c2429bc7325eca24279404ac3c934ebed4991502bd669309e7a76cf09507b31fbf659deb7bb881f5358d70595c01fbc7ae7183540b7883122d67ba +result: pass +ciphertext: 9b957d47479a6dfd155260fbfb8752d27e19f551c55ba9b4b6629d8db47365a328ffe7d1bb1fa7ab7294c9ff449cacaafc8b4dedfa54339b5334301f1e17de9e27b5a5985420fcbe6b163d007830147ca38d9f9aa299ea2a4cda106304634ad47abeec58fc06528b5c245a90758a81ffb75648d115d39aa75856b64977ee1a7651c826a508174a7ab9c49a119bfcd973a4cddf2fdb4ef2186c9622c9d93fffb7e5581b4d28add151aee63e66f42eba9f3feb05b4f86f8410e80a33cf390721cababa5316c37b53e5afd955a90ccff287e121c64e3950d6d3e90e4cff61a638cb058648d19c2082a2802b92b10b91f4a0e00fbdb835c10f70f3b87c8b45dcf6615bafe6f059ad4a4d0b4ff94260b8fc421515bc0160d9b3c797df18f735054470934084c287e45ebb56d5464d2669015e2a072d48d46571bc7bd1eef75338d635c9f2bcab03c196d5d1aa5910f10e299f87988e1d44fb42b6ce5a8d49464c3e36f52af37ddee6d39a888f3121764342fa80de26763fa424ea3f3f961074688e200274cf047838027aa56091648793af6d7b0c5a27e308fd3ea090d531d5e1670e7b5b47c28e6751dcad317a5f8effc85dd4cf323653892d1c8126ef3247af8d250f4b541b446339131e90a9c307c93f7d98a17fc066d34e2457a6b3a6e3b4ad1c3b10649e69b11ea90d5b79a501d8ad68937dafcf660703df77375a59378fb3ef8d22250a848ef5f4801472ef39fa6e57e22adcbbc22c2e8730d1e23c4660e3780b6dfaff439a5aac5fb7e9ecf2db74c4ed16e487a68a08bff6918f5415c2f2f6b034428290a6555c6c12708a2883c121194b07f7e55ea70bebe1fd2bb577a8c52d91375fbb7d1561534215d1fe34d4931179c15e46b5e8bd7ddc045b82b09151f68800bcc3a612ef003f12f50df2c00aa2f4e371cebe4fceb0c9e7ba3200c07b04be526e71b859ab8e64b39b76d47bf2960083b66c1218aac27bf9d6b06cbaed870a0f379ea957857be103c3b2d254b72b01b049b11ce3a5c1d90ae13d4811e900cdbbe4d4ef1454bd744e798da49eedbd278483c9c8db68169951bd0063aab7166bb674cd78d5187f1cb5f2505a64687db7b54951ec6c064f625d6a74e86b5dd935b94077397cd434d28824387fab8413ff9b8295e274f869fdaa3786c543e8b1ce9dcb788687c158a80407dad0d4bab16e6dae51a4166f093c572787065954d4732deae996d58e6bd79ee17dc6d78f7721c23b8ee7f2779adeb3c7471cdf3006eb9b642fc9cda393374ced828e4fd4a8af9e99890f322286d08fd63a604a61d5144d9ba88276afbe84ee7c27ab956d253734d5f880974b592ed7174a0ba743fdac3c8c943bcfc93fa14e472c77b5a2ea1bfddeddae59895d43bf3e46c477c9023869beb1e07b7f80a7cf324684e2e0f67ca7843a10a30f7768bf838ff428efb22e4c71e177efd2181c9e4a78e3bc180736e9649e8e9663a76f01751150b74a48ae0bebbccfddaa449611884fb6fd7c335cfc0ca789a78ac1e1b465ca866e905aa971e6b346859b018316cd0bfdb7a3b8ac17ee08b044e71cac64e521c2d577dd5f4c6ac8aa97463334b9485f84b9a19e3cd99d99f911b7a5ae949545819fbd9bc5bc357c07c45801835d06aaa1760c09b450e77e547815d7e8a38c8c46b1c2442ceef1993827832bfc417a2780dcb788b75543b4edfda1d1629f7e21ebdb5b19e5cd72cd1cdd95cc9d6067921a7e23d68c26713e5db7443b392b7039b806973775643ad704376e8e51ba68e8d47af6924195421f98c134a016708312da306c275ad375b1605ff1fbc1a2cf8a6101c4ef45ba9085a6c28c5998b1e9130721e398dd3f4228791b0a09519072d46cc19ad5dfd824575aacdf9aea052c757cb95e7040028bb66002196a5cf9e632869c0fec3849314e6124a290dc4fd8a124a0a3219f106af488e135cb89dcbe41a33e33af79c84b0efa25f6d488ff56d49435b25cbb7f9d76c9ae7fd86f40773f8f250b59ab264eb60c702360813d20d9cd94526cbede732811475c8d7a3cf1b11d4565abaf8d996bcc023bb95601b88e316ffe8e3398b2a9f6e5f6fd80d66152f2f9669b74a4fb9221298ec7a7881ac8197466ae63a8642f641faa8bccb832f2b52b54d2dbd8248ca3760b912950128fee065b6ff2d9288fa9159239f0def0d06bc6dccbec5e5ffb967eafb5e4ffd8d1e53379 +shared_secret: 39be6e85e7c17bd9e17a0ecdeb3e60f75cd5fe7913e7556ccf166d24049b6abe + +# Official test vector 56, seed: "687c02de1041abac7b2c1e6ec2a7c3375552ed5edb10e3a8139c24cc76bda44d719d8121a81d47a0b762b4e9eeb85235" +entropy: 67a216f37d67f5e74f782f1badbce1cc8c80a6130aec305b421899a4faa0a6c3 +public_key = 128a170837c0c51758a801316881c56d436839e5778e79553d97c6c48587bac980e17632f7c7af3de5a9b15ca6d33626254a9e83009442289274a4c860f42c86d8060b2821c873aa5cbccde4540a8e5a6784ac15e6b30cc71a8de57a83bc5924d0117bbfbace8ad5cdfeca785eb224baf8361eb64c81453fdeb54e4e86ab4a397ed6e84b9ba73a0c4b8b606318ccdace61b70df22c4518f463d8342ba6faa846eb55284995f36a7467385bc8b77689807ef511122d12066e12619e37c8ad0872d5710083a2b9dc7107c955623cb209139034c9b3c6cfb7b3133502621662a61bb63b9c3a4586c2201516ee6c3f2d25026f932fc13c5426d64093cbc768985fb8f70b6871755f8811c60a4317a21ed8b5a7e51c1784b562c2a244065451e22935ba9c3ca6a63dc945ca37489e317abbb02c9e87b6b7092b1b4049c603f087d3596169baa2c6e3a778e61ac5f04962b61aff07a70ea72800a0143e9c43f2972908a27e0f3b627bf14841693613711115bc19659c5b3db6bc19ab7be40c24d5887d93e6b7d31899771244c756790ee881fd605d1383409d608fc1a10d6f2511ce815361a66db6244bffe1b61a46a888a06f3260409239abbb9c717d76ac4d658e728977c9f09bae86105d796f0bfc4b87385efcc791aba5169c679dabe34e1ee44ea66ab3d58724c3e7099bd80a9d52cca8ba95f9699c3ad8c90199a3b9613cf9652a79cbb93c8c949dfb0a6a7a1fc5e4a6032247b7885b3843a7af4c7bd49068228875a002321530bc6b5076d0853be448a8a85a8be09b94e5d65d3bc2194a977396d71924bc5b420aa6283b7ed9ac822c27641c811777a8550168468892987e936488d71c9af0a8732b6ac23acc23c2bf8719be59b23aa96110ff02af63858b7405482d684848d83fbf3b317217be6bb750cae74df77a8dfd32539e8964b764a100688301ac20a95306163ca391d33052e7488cf27d4da5be786caf99e294ba1782d462c446613a15f97e9f5632c524cbc0430382e828560315e6bac00b35c084740dbf159809849f8e104eaa28abd5f6978f071d53279c4689c77c43c0b649b8aa042a9c8ca968f28c81c211f8bca19269a9d79985478707489caf7690b529b988471b12523405db659014138d9a6133171c68961a327099477759261c523f9ba6a008d3c14b0a02295902637912bf1230a8b763ae397f805c2cfb4228776443645274f5c01515986cdba31285f9c72fe7634c0b44a42150b1dc75d8cc512d503b3ef7487371b70d50b9650360f073936398356cc3419f1225a3946a61bb38b2e61f0ef85d1686a29e56192d8a26d42a22f274811dfa1c1c4cbfec8323880523288805ac98000944b667346e173611fcdc3d474b0c30b0620f69b3d45321d9c91a130cb6842659a6a0904ba598ab706336417e17607e865328ccb035bd0646b023c3545c2b437463cffa14dbd86ee12b8ec24375f5b4a3a0548eb9997030ac092a579bcb6a0a984c9f354312931c653242678e98502a519d15e64597fc224101cd9462ace9ba56c421b692668976b3a170d88c4501147e6c68ede8a29fd4951d32ac9dc06f700cbe9b536a476736b1eab14e2493c5a94a07f6ab5a323ec3e9b9f639258275523fd32071739b585b5d8657aa502262700998f0c5ba71974c35573f14c13a70842149c077624737e5a06d52863d63f815d57acb4f0142c9167d2784365ed78c9f6b235c7368f2b26dad962e05f2279ceb44784901dbe87e413a04f462b4395b5e2264784c2ba356935dc1ab3c104b6be09b08941a02512055a1d70ecdc281e09c78214a0e57f2ce035947229181b943c5380b7e6f804fbc815a1f3023e4aab03fb4b0e2c459f58c348249adc6b4a5474622c3262b11814acfa872bb6c79b3614e3ad2a1516a0b0dec98f863cac0b061670ccd8d0c6f7eeccdac933bad47cecedac3a5231ef1c040aef8bc53025e0dfbb3d5c6cb2ae96f11a05dcf8885aee9756a13ca0c1280c4d331d50b850b6c00999360dc585e1d849114b13f3849b361f7083b5b3db470796f5761f7641a89189c748b4f6b88822ec85b04228f04a669c495af4c091b54a3835b379201d9c7273557f73c1e357588b68baf3e2a5c88ab0e9e057cdae06ce672c84b2a04503372c0f370d114ae10f97052fb3ba450d323fd3bb1b887fc4da6dbfef06ba5a2d5344feede346d1f04ad60895ab5 +result: pass +ciphertext: 3233f4cc3f6ec789ddfcfda18b29607feb86a95d113e2ad085bc8b00391c70ede55956a82cc4a693d9ce7f66d6955d281a33b19451e9998b28cedec33c45435e6a720ac19ce7ab900fd16d239ddba34bde4d0b4cd5d307b261f8ec893dcc93b635dd7d608586c71560075dfd15effa71782616fe8679197ebb9f98469f28950634a1c1a90f1cb80cc8d0314beccd8a8768e20eb715c2e5f6ca3908bb7b18c5242ce5b22287657caa8dd787c46cbc30f843a9dc0f0dd156ff016bb21701345dbb673fce26277bb49188102b49a52c2289f18429b4cde4c0455bc809a8e20b6d8c779b47cb585d5f9455b416c44b2a8519bd4159d5779b4302f1d632466620ac286ff8bdabbb37299ef5be3984759269af8cf2530ba8af630d4862bf4cd2e4a569e035590c316f9a9346a8a0ab271b7a6a8b7b1dd9d2bde91f4690ebfe7b759f9614412bc76364285cadfc7a4a7b688c08b2b769e7ea7a53e0196dfb7c1e26f447b1a9de9d587c032ba60fe7b7298d1a70dcc96617282cdadbcebe809affc49cfd635f273ac9f57ca1ffbb7f0c5bb0f47d180e562da14d33c9c2f7ce5849f1c68037c31c0906d7ad6adb228f3e9d68c3ccb51d2900c39a2176fc86e50b5c8faf857ff1bdc9a4d6d40982444469ce4b918d435e1878044ada54032855cff3fb9f0841a412336e6407cd8c142c137e81a113da062d061ab2f817104a179f2452ebf3b92612da3592a74054d01f17126b217c58a6023a7381a3d1b63d224fa552cb1087ed7734561fe699a11b073c7402a801326229675d6ce72706ba7b69b87f5316ea80cd5470c4ef45bbc4c0253c7b5d9b2cb51259f791fab2b9fc9821fc76b54107edfeaa2717ceeb9e8dff6cb2a4bbb22f012ff1f87cc4703f52653dde94db328dbbb35b9bb5da3bdbc01c3acf4b2601d9ac1f9a98d189fb1faa073b52af448a6e933781017c38aa87070b4b4c2ace0b5af9b0e5e6eea43e4f7681baab39cf40386fc503f291d45050fc6283eddc551010cdf583f8632d69444d95ccbd15464833c724bf9d2d82bd30ba3874174ac4c2fd6168f282a82795f60486c88bde20f67e645394dbba2670487f9748bf719fe5dbdad7b98cc8dff4a1a4b9bc62da1d7efeeedc0c37d5f95816ffffb78a77ea756e53e28ed69ad661287ad919af2de3f9b53f7a592402218527d8522e8b82cc235e3d5f41f2ac909e40a7a9295fb28d6cdce5a70eaa2fe905e8a1bb997d06ff9eb9b486184931f0f3e8a59ebcfcc814d31c69bcb6eaf5ee9c9a93b7feee0e336c8dd63bf5ead30f419ddc0360916d945609d30e008aa5f7a8b58ae7d2c7855131bb89935c59370341297c896c8278521c4c3eeb558a58114895d3da678249d0862f0ee3842379f59aa2eb4d12a78552e4b6f31e014cfe27b354484c53137630bcb56eb5d19320310b5d9c309bf2c4ef461d19adb919d7958a0821026c5107f5b028d6ce5069239e1fc9230bde296b2eda8fe7b723bd1f5ae93a24e62194438a9673c0becd91137dacdf9f6fb00da48e1417df117d21640dd92d98dc7dc139b6c445a5e275b74fc1e38c8550b3d822c2b2436db3ae0c1f3c5bb86f33f9d36e9af17114f52e7c9236b5b7d2e6da889d5572b8460bb002442d062506e66085e8b90c76c700f6a7b56977aebca7039e152579c4ee27b6c2a1f7aff87f6cee904f3e87c94fb271d074b66be181d11e15e15c4e101018b6ae70d63fbc42a2ae48994e4fed115ca3c84cff62a88898087b5a6b1874da7e14b39f4b09b8e2b10a7428f336d82a39e150dbc37bce6255e0a5e8fa2b74b5b24a8aa601a6c671df2dc52e13cccdbe32c4852e676e1a77468ae66ba1dc2ffcbde477041ec452dcb78d12e3c3c4057b51c74464c41e65718b25c8ecae2fe5c6e069d5163689d2671acf75002839305752512d0b5c977b9da6e981b344793b8b162e78398290425009f32441be21418fafecf2b2c7aacf0dde97896533c11ae8b94a698ab8cf8cb2cf3ebf19a358bc121dda105498fec665c760c7ae16de69f0098fc1c9481ccd817fe9cb5ea31947a35206d9c1f86b8bc8766373bf2aad13233a001e1e8cd865f8edc67974849ab0e98699fbaf73b57255afb0481cd55a032c533ecfa7219cf7f9987679a180a2644eb4d373278f1d45f8d69759319e1ed80eca491ea1df75c8cd98d694fd2480617170cca06cca20ca4650f02ee58c53 +shared_secret: 468a5377e8dfb3c0f0b79590876887667c470a1855c55d47ada807cee4fbb8d8 + +# Official test vector 57, seed: "4142237070c216bcbe245a39bd9220533c97651d84832b26727855ad994a0760c52b9319ad404693e4248b8c5ff324b3" +entropy: 52b19fea232c9154a3e431e9d69cda40013cf2d485c3cd027ad24e645420420b +public_key = 2ce082fee023e6c49fe0381cf056ac1bdc95895271f4e245bdc98ee3a87f651191832b224b3c5528562f9498979c4485c3206eee0a6f5cba8fdaa70dec105bedc40e4c6b667d1739c8580f2d246371f415411c803ae0b52f0b5a6cda5fc3340f1bfa10bb29accf402d6f06472c14cc52556e5a97b56c190eabe6817985cc346baa02c76afbb6b6dfe33f711c78896a529656b4abe25516e448bcb41dbabc340ef4b483b750b0180f68ec0020271a0e9b9f466a4728c19bdaa426fb82294ca00261cc0c3349b75d397674644ae5ca363774abe8a290240abe4039a7e124cc894657c9025e1534b91b896eefd3af2d559da9f8558fa7774708a7fd535580545bc68c9cc89ccdbcc78ed5203ffb653965e7b0920574b7907443b9931472cf19c17dd18ab87842c853462366646881592ec3f5cab67b7e768472a08a43681120f491bcde05a9805c6787b96ecccb05d7d944fc858b5ec3828859234da88d8d00542b104883e824e7b630267111e49b1bb5e4103ea9ac2b187e046b4cd109709fca26af813440f30318dbbc34598ee5dc2806794c4e0a8c6b9c2310c34636088da92147d6b32a7bb447f50b898c5a3e5cb43d6e3c147ad085652ab9edda72f25b7bf250ac84d1288fc188ba645d88333b65b1150722334b5616429b608a0c93d0d946c15576c82093e0b263bb521d9fda997a461f1ee47098861feeb8b557b4656cbac57dc61fa9510bc1c95726b561a1ca4000f28a5720c42eb932f1ca8fc9b647d3740117ebca3d5587816bb48cfc1cb4e9caeb7834e1814a7c478fa052640af253371242da9575c2a66bd01c5fca4b958ea437e6474301069d0ddb254bc4603d3ba5b7415a96e5327743662caa7e08f608be974341b70db77a850b2c11e3b4cc6525808238cb097611e77cc449f17c63da122966394e79518fb6022ec470e8c5082a945c73b52f05c38e2dc3419af4080e890a6e819bb1b301046057e548894f511989a40e854aafb62ace7e586793921e292cc8601181599977d9fa457aa2039b14488d5698a8f03df1b56479f9109ad105b028219b3c90adac962369ac1f0043373bc243286c24f599de3a28684524988198971c1f88419ca09b3e4f22b64a221df8d32afdb0572ba62c7387235ee2752903535c9c912ae30c9151a3b6c415d59a4969cc432d088196f22c518037044236eb441438acb6bb61ca45c947ab98a53b44c48119135f776f2aa4a8413a1142cc4eed8c2948f8ca5db39388dbcc15c12d13035763a57c523b99a1912d0fd29b952776eb03aeed697320c66c0f65b369e13c7eab1e98b281e7b17cc2cb9ceab725671bb5df0933eb5c70a3d39e0eb5a55cc20af912af87cc23e10ab77a9c9755201ec393b523f51d5307b176f05fea16a2dfcac794f834f60a712f13ac8d5174d3a7627ce66fb862497cb95e36da3f486c7432e5983c2cc8cc3a7582a6b22c5a7ab3bc5107c831af145fbcf74ef9523bc7f0ca5eb97b34a3872b9870eefa3fabf609475c46b1e736cff313f046b6050c13392571f2d252959aca2f8418f7489809ea51939a1e8192bea5719262208109b37bae2424ec3655ade90a9ca235f69c8a3be54793655a9e8c6e9c64354a842458067295f08b6ab3b938e6b188bc252d4569589282eb703f0cb237a67a779d8957c4602a9bd80f266303898acc60439a975c8e9d8342f6f1a7d6c92f11606435878739d3bd27460fb5e735a73cbd1cb6c657d0a6074633de38647035b54bd10986e4573e09820ef56fd8d71ee778822f72194237c0b5344cd8c888f12bb34fc86e6147161143365fd45960396bf45a8868176c7d0c440fbb71b8c6aca11b6ef3e33484f9bc22d090011918c3525cd0f0724423bd1e1c2b46a66552926a3a6a0389410a3e5c41d66b07c1b41c645787e8503c613343cc73066bc85b028025c3bb6901e33e242a0061e001ecbb7ac690837b02282a457ccae40dde98934bf37dbaa00dae287fa0a628c42a66a7e05a6645b244e909fccb6abf0075bcf0974b97099a7c67a2c71090c7bb016210d0ab69ff775dbc47206429b347e6749eeb3e23983759a583e08b1653cbb5ad4b677f9b9b365287c1b559c199c3945653a3bc7b0da8b41914be5b411268080396795f1b95ae14871397e14f8f3bc940f00d669886668c2dddebf98e5e270510db63b9982ef818d1253d74a644fd56900607545ef8 +result: pass +ciphertext: f05495bf998983547ebf417fa81ee0e20f21bf5372e112eee88c6b10b7e92b488546cd524e4eb6a674f20d9c2b0c54245be13ae593a1b894690554bfafa7f5c4b51cf7778d52dd74226637f0d80635dca6f838cb29d04182acb82ced6873a63f7e35da73f6a1c80c12be044412a2c6fbdcad994727b8c613ca1f7c71aa730c195171e929777178188852f0238d30be6438548d5a58178895847e3ad3995fa45a4213062b9cfd0337dc726fff4a71077690015d9f59ea6e206b3fd06a59b792d20cb74c4a69e706daf0efb0e2002d194aabeca9bcebb2e6e99fb3b03f4c98ae7444af336222753c90d43c76c73e20cf4276b8ddfd81e1271ab0b6105f0390852970d90d2d662fdd6675a9a44b4d64fe8e19e43110a5707f0123993d698e46901e78a7b9c015464e387a62d2b07e32ec8137af4b323b6785ee7ebe0d9e95f438fa79389d661820227d1279782dd02bd0afd6d1056364e786322bc17679bb8626f13ffd3e00adec533e1f1bb563016f618a0482c3e8f8dedf903898dd9ceff7d7f4b0ad53e91441a383c557dc5b61af80daede143cdb67ac4976ed740b006deccc2a60b4bfa234e3b2594527ef2acc10edabbd8cce6b6d31f7a2375c147aea1517f4ed29a3fe73c525974c4b0c02917a12e417fde222770ea9f8ce374978b962e0e4ca5c5a2dded62f632bd5db71e80f91d1cda3ccb6861045b35fdd136de1106d5d7af3ace8b7af2af137b63e396fd74d81a804fa7ae1c0b244eb567318d4a446518baba13342bc4290ad6727fa0a1105dfb3cde778b47e8f3886c3a93e2877a41873de3301c745785dab0a31d6b3429abae65416fad5f4853810e9a73c1298e98a8b6b5c6ad48a2d461ff62f114f8adf3c26769f870216a52a186cbccf85beeb6e189e23df0cf457b75aa9744d489f4b703bcdd951f1e8501cca99f299efe177cbf05814b7329b6f3e70f019551f16640713f24786921e42535ba17c246c1a3bc30aa50101c3ba30325e8a14b6d9e943f789103c2498c41634e14ca58c4ae55332418969f146f1e3f3123690137d54533733e7b4c61a06ca59bb99cd2b02c55c6c83948c452e1780bb15f95e05329fdda527cae208c698408f6a4f1d3d081cde45e3e2226d74d280177a4eb64f1db5259ba1ca7f51322b414d199d994c0acadba583fa1528f57da7fdbea17523c3c2659219d735b0b7add995d074a7cf3401512df7bfd1594045e78c9366cf0bca693eca3c0882fcb736eb318f74c6fd122b74db92262d933ea95ba45765f4d68d4cd2a46cf3ea603d4409a709fd0cae87abdc1e07b0f591f6534545647693ef6b8441ded679254c11037380a0b049642e6b5f7fa3a53a84303e24abc20df6537b41eefdadf9052bad0894f467c158b2088cc397bad26dd1951017b9278fbd0de090f424ad58d5f576050f3d319ad6426ba0a6bf3e5df032320b0e7e0c1eaa2662b8c9ef163715cf44c2580a1b36d2442582aa9ee05b0e6c88533c4fb75d3aa37d9244f70af8dbb12df6945baf175a00846f851eec8e30963b0b9adc6fdec86d1f4327138c10f699becd1e346aaf5a18ca4b9f377edae3d0754907b5f62b589cacb24aa60f5569b1e9d80bec0231aea82576494d66f9e31a010416229480db8579e7f9c967c52ca8344a3b2e7161b1779477b83a4740a22c27d1524223c9701d2a410ceae55da373c3a6a84de254f73c917868c59d95dbd07a89a4c41bdeed5dbb18505ba1eaae4d97470768306afdf30b5de51ccf87e49eed389fc3f9dd571b1e29140d248032d8715c178ca2e2b6c1d0efbb59b53972dcbba6ebb8aae1b0f375152bc63dd5a67eadb83bead97c73bbc5b3f9705cc1a83f95a7a15d79a522c7e825388707d63fccc08242b4d62cddc5a3f5a0be9e27efe2528bf26bbe47726cdea7366834929cc06745d57d31699b0e4fd6aa09718654cdade02a79ee69278633e3b80327ad2e732e24980907caaa989130fb7364f313df57607d47d4be7caee53990a1e7ebae03044412b01d35caebab19d9809f6ed2bb60eefd6149d2cd4b45b0fd6c901154546b0cc4119e89e15e2a3e19d3722e46fd89b1692951607debf04eff35268cc6d5c54a5dfe000fc56b5439a3c34a2df49cca808fcafbfd7435ec6c70b9b48ddbb5ab27170314d61d41ef71fbc54d5b17d279c092e920a79cdda050ddb9c320c24e27344f8ece7eed184579363 +shared_secret: fc48d9dd239e6fea212e83f63e1dec4bb5fdad92a33d06ec3b5dd53bddcb1d83 + +# Official test vector 58, seed: "bd334d7b7eb14e00e68863f2e5551a095f8af10681c28353fd19b9a7e70b8bfe266840860609008a567abc66316c77ce" +entropy: 64440adb05db3308b189bf999f9ee16e8ee3a6ccbe11eebf0d3ae4b172da7d2f +public_key = 4f240d6d4ac24ad53108968ce43555fd4bc4e3ba3df7a1541e0764c6a387de455a564203faa38457376a3170360b5303be69450acc7ffdf638a90c7cf4031719eb27fad55e4c901cb7dc5fb828ae50730609b80d5a92a89ef1963d836a16685881028759d06c55b9505e84b1aedc5e07d5294a084c1201c0109699b3009b2c67603c055949f400ad487167c1ce048b49a98a8740abba9291618f7c395d77b0649cbec1a2c0e2d25c86c70320e92be7595e103013c4974b7a3b70d8100d61b89a1ff43c30f48c137511375ba781e74bcbf322be908d09fac8991b4213db7a298c2c29455b3a5092ec8610c0325187434239a8b651f0a164240ca4e827f7bb7345848e01b50e34162a359c2ef8c8c9e6e9b7a18bc371a20d2f086865a83a2ba3545943068e173941e4875600183fb19bcf8242fb576f908a8d805cb0909054de4cb6b84b179478a0bae353d8b10ecd278a310466fc0a00c68784ef246f1f0847ccf72894549806c2c9650c9430b02fdd5cb0b3a9608bc85f02dc32933811d87322dc4993d3d13177b7440822c62fc7a31ea174159814c59bb209356c5dd20620b40d08169df1a12d913105225cbacd9c6054f1499d6204cee06206389b05057e579a9e294b43243ab92e136265470786b256f615cd3540c5ca675c4bf68f7da4760105367ad3c6d71a2a4b209296daba2768223aa30845d4ce7d67c2906156bbc4c24410176652765e294a9e22c58cb031ba06a11b5a8ae035a37db36ce1771999061d722cc99de03e96ec3216543ef74447dad96bfbd386b3154b35e08dcccc88791677053a0001dacd8eb6c34cab6eea355a10c517c45164e9eb4c714091bf129186a6b3bf33a86049671652ceade8b55ad17472b49513a79f2b867bf3157d5dbc929974147903ac69a6618f67781a450637eca5d0950948ca8f3d7c41983b8942b03d6a04842a09a4896ba3cd345e7d72a16ba3c63d95a1e85ac4fbf42efb588b088749e2f66bd6f06d56bb80a818c2c56c5d1d1b5580863d1ef10ae2a97f5f83be12491c7fd629d112823d728a2aec939e163436259367473ea0b63ed37bac19934da906a21e5355a3a2277519c8f53c96b4f1a8704b8d79666c1224819590048f5b9a8b767ffda0a20697caa075ac25b5546ae32eb2959947b11fdd384aea2692f7952266267aa559c8ef9168a04cc57fd8ae46674b75e785535a2b1c0c779a553f4ce5c1bf6094541363bbda825fec4b42035325a3a2b1a8135dcbcbf1122b8fa1a37e925440e95c2e4c0ee1f69318d04282c0bb5fc8616e99c9ace80d27a79b64c843b08cb9fc7a27d20309726cb50735cb3450be54d86860d7708b11a615dc662ecb229997004f9670e27898e78a4b3732b4ae5cc459f28e78741f9355a8ef9b394cab001c912124a01d27232f060ca523d378a5d42e0022bef2d2700d7c6c14da09736679b2a0c33c035b3f0513bdb5b46fdbbf3a5b80d65c4be918511bc8631e35aa5459793f858f364c96f2010d8849229acc89e8a50360551afc8c1d481a1c21ebb100079cf3d45ab4159371c49b16cca69fda67aed5881f300c5864c03a9391ab1080b92601f23a417a0563c0c14b16b0255c36529f74a103036466fa9290744eca08cb16b94f30340c49581becea5b64088fa7498e02b439981cb4b4ac29ec4684152830ed82864ca833481323fd8a8f66ca34bd4abcef70c15c926fb8b6323c609efea710dcb6548c06bc13d6bbb41b40caea5745c68cc550873bb467f9dc6b3e720ff4649aad171bc5527b0633cc2709932f0869a0702da790a305761f9d146c1b24005f6c1c808b6dd5d97c647232e843cd61e39894902b76624b73739e3a1bbe4fb1b4b2348c836592a2d31dc9884394628ebae00112643bcda9a01f34a8bfa828333b32e8063acc5344a4b36667691c55c50b2e3098bb4c7069846283b57fee61089654a8ba06797c57c2e7e9bf1404077b80928f5a1bb6c6a753bb8a95bc46748c32e0e1c8f7aac1e2573a47d104ff9567daa2c0732c501bb9ac1315a211c11593fc1a38a69651347b6aa1250f3895a7844e1de2ae45ec66214a8b41da464baa5fc50100c5073bdaf5b4a88c70450256b6d65413ab3ed302ccbee864c578733d40a796981a8c3849f465cacaec79898cceaac424fcd9b57b426caf306d165d1e0ba6573a638fd7df6b3f824f240e7e0eaeee7d7a093875 +result: pass +ciphertext: 26d223332fb3dbce267a1f4f233b61afa2daa02cacafe508d152b22f30478e423e7a2343c857a7f8deebbb048c4ec22a4ba846eabef5785a4c81a3001a2cdb984efaef5f9e3ac845252540b62b861695266e264600a8a284c048e3194fe84ef07b16f87bbb0194a85369c985f3f84e7f12b38d6d48233c930589af674b23fb36eaac8f07c9f60c8df3cba30aec93a7fb646d25e2fe31fb6746399461f3abc0965ee8eec0f5c86dba92cc394bd66116e4fef46be8a645b5d842eb097c6b8532f8c3be8ba1b1efc0d8915a2a3f10544f9fd10e3f35f7306482bba8e9e1e9e51444a871a26ee894dd35bc67439ac7e5695a32bd21f7645273f8363b6926eeeca3e916d3467e2b5ae16149d7d7e008728fb7956402818dbd1c7244b7ad61332ebd9e1ecf6f70e964ce9fc3f3ba70e9d48caec8f4513e7b78733a265a254c999928204f4c581cdc5865da6fad0e9e9df36a5d4e3c45ad4bf985536c21bee5cfe4f30b81cd966e30b3f09de1adc14ba9c9d39cf970455f4a64ed3abdf672ceff6de1b50459c8c84ad3d1f7fd63e529b6aeda25ca573ff9ef6b21bbdd0b9870f2a420b7dbba0a22b2e5a74d7378b6e560b605765f433fcef08f46e8d3be9582233d66336416853442194136e59968a8a93ff47d767d577258572b70c7d64924eda5722b476ebc44bc4db3f47eccfe4e124525ebad251f94843f5a0b81cd8a6082d15b49598638c1c0a87b8a6ee78cb2930388dbde1923a762eaee2b217c5543dc4ff32c0a5bbe4cf8b17dc2f0f1e6999c77253a770d6f8e1b0930613a50da18856ee2186230ba3c2e7cb13f0773fc995e4ce177438380a38e454dfa3152f0544ea5200004e1b23df4264087bc75e63acfc806e248fa11f32d5adf8f8b53df4ba9e074f2114e8d40fbfd2eee1c6edde3d4847161224bf76ab6dae50c9d277ef3d756fcbcbf693c5eec17d3128efdf95626e0a8ff831cdbff506fcccad8c10fee500d12cb9cd05aec3785a5e9290f580b8d69b4379e143f3b06befc67420975f8937af5573e3b35ed5956fc974a1108f94c991b5f20623c7d484af686e00f6860331ce47a75588d7cd2d5b0656a34ff38b5a0ad9bf69e7168fe6fadc9037b443aa72d2c5467fcaca05ec9fd3a634b37ae7cb2fd82cc329fa0786cd612cd795b776ea96aa5a4c2738e6a9c4bbad68c291cad54c40d566f72c1e4342eba719b50404b48b66e784f068309a1bb52eba27c9069a75816e572b983ae94c3a3589e5619862c38e591c8c02e7dd836a67c5483dee238e881e74be53bdd36fe710dd42e999680db458d4adf6b1495c8647950e2a27d1f3c77542675a80b7fd0d74e69a79b508b09de328a517c1d6b870f40f3b0e6a2599eca98112e97a7b72df92c46010ef119ad9faeb2f854f8680b86f8e84dc87d8ef1b78b483585e2208c4dcc1059a5f2973540d20b17101a22339de1cbbd5ac4509cdd4e6af81b4eaacae4a0778b3e8d4dd9c586370e67a2e74dca8a249ed86f0e402b1bbe60bc05cccb0c02486fb66dcbb8456f2c5f0b38dc4590088b2128c5a7e32a3980007a139f66001a8886778bacc6992108b27331ac25c18d137cc5df933ae5a8fd37e301c512c0a4663a6e1b446589ea649fd840099c9c0f6af432924d9b92bd7af6e4f3bc602831d5c1ebd62b3075a6cc6c2191c09c3545a676f3fef6bc80def9b1803479691311744f9b03d965ef39d696df935b5fc7838cd32baa57d2b7ddcabe2f9138ce1f8110562f524383e3d70c51bf06c231e76c37a68cbe5aca313fabd677f846b7be2e5d646844d5138d012f1189a1b4a43d1e624c4d20a319976c8db0c41c44a5e50c982a3447cf0a0723f4e2fbac00eccc6335e24fd77c16b9b1dcc25778cab0b6b3bbae720b471bc817d778d422ad01933271140d8cc9afa066a01cbaddf93259044f9e4cb0980cb2a90ca03e81e7a9e7444ecd64c6d230c80d12ec95bf3930775bed59af076c78c77e692f5cabb3b788dcaf7115a155bbb60aa9dc0b648df006cd5cda9b12ee2b9ffc37c9edf086f0cc78a303aac777fb7a7383385af51c1e53152d746712bf714ca05186f752533a17859f2926bc9571ebe88af6f8150366f89bf0632fd31773153f57a274fd1b5e3ec61ee6a4a372d4e6208e5491dff3205b5d298afb1dc9f2bf850b2f9a4bcb0127edb08ad68bf851b2056d3b2bbae51f32faca7ccf5892bce2 +shared_secret: 7f0ffa83f99901f27f121557ca2da03bcdee03d808e0e4421de3a07c86764d88 + +# Official test vector 59, seed: "a0264c58ab1f2cbcb212077fd378d340307accb31f1312137cf84e3d3135044d4eae8bd38bc3e540a0c14d46458f6179" +entropy: c8bb46b3a7344ad170c2052fb042b5a3b62e0590562ee82577b1081f6f114d16 +public_key = 14905ebe26c856fcce2c623156e43efd0433c19858c986436150968132591db37eaff112c1383238c0767316c0077a00a4714e49d694d802a510dc960c525bf601384b96b90141b846dca14f34159db490479205b30800137819406bc6e14786dc4079e0481d098ca4a3f15f593135ca64cd7c32c46b45b3bdea0d7fd70dee467020ab49d4360355146d7f00337a1cb452357bd01074234b464a134abebc14f7557597bb057c4972d2f012b59a0b83328e88d76bd257ca5aca8912c2a9f90672903cbca16b9746e135108638c388676cd189452325dafb4ddfe435e13908b177a5fc883bc233679df34e40a09fe384654e6a857e49c5f62aaa30e123ed71a4d79a65bab40eb2ba7e1c497ea28c069ce9898f3789fb1b03cc07a5789569496a5a6b84966dc3b601577b07b01e2bd6afc315cbe74b03cbb51bb68920362474819a02e5c60db441a3e0a2a7299ab0913a92e3228986c18639ab0b952a01c77907e6a0b59625c01b1c406a4b339c10b0c8947fdaf5c14f6721be5c11e3a62a7065a78b9b1176e64ad075150b67aaf70820b9a62848378c374a3aeae6c63cf620d0927971c0188768991734754368bdebcac2d6b899e5ecc20922059641566b4996be455e90ba9aeca1a40ce8cbd68a6ac0cc708458169c624ef80a25ccc7c931d938687ca4a12290711b1e72fb3793a760a5c29942896853e26dd1606fb48c22b53506b4413e8f5b3c20b446dfeb586532a09ad602e5c54d5e0c0149ec3526758f174ba49134c980ac109e711ff658b7cdf0178b8c861a71c700e90b1ddb9265e9bfbc07a253726fc9c54419bcc39932555024af651a277302bf383cb67dd2a929037fb4109c69347876751f4f83955a4768fb94622390790796084215b6108c72e10217fc9134b7872ac6ea3d07b989bc70a23a826676718f31338c68a5b1f9ecba4b18bc47d3161419530b67041b3864686224d0171dbd248a48527950f2c4c857aac6f7a3394662afd84f79d5854ea77c26e7c57fd8a3aad0399ccba0ae4780ecd2481ae065e3597cf1868c327c14baf36d9711a3a8647d26ea52a4f9139ba835f380ce9cc599f6f11586f158f941520d143f75d00125a3806c56108de46c5ad093872ba5f927bb2a4a88e668c40af5b4fe9b17f80ca75ab58224ba1b485a9e1c3a6e82b814a1b23bb0d61ae14a9ca4e95d03746a564087f9c53a343ab7595572cf2542d7a9cc90060e6e99cb2d18880f082d3ac91fbe00c5ab141c6385895c626d9c143ccd94042a27509ff67c802098415a49bfe163ca01a20a45add4916aa512467db549e7b0c898656cb4265df3987998c8737f3c79bedba48b9c6b8967a9bfaa0b22e6858307977903001867282cd38a01798d3b71bed21459ed4c4ca6e185d55525baa096c1897c55789b9e19a6b303af32f493cee717bad70cedd67c3dd89bed6926a0f20b1798bb46d173452a31d7543530311734422f3cc9561d5360b665ad87a19da71a7270998b87d62d5e7b0a5ca969120b4c610848fdc6afc0e631fb2abc21096347221971a08b94b0ca4116c2f5a8188cd982f3e647ada99eeadb3ac25310dea91fa724cf3e1017c0c86c2a979791d30192bc3163ecaf73c819dcfc113535bb3a40b252c8bc269884cf7407fcda465c2aaeb19681dde0c99a3853a861ac81f77e1319afc6f67b2fe52dba6b38523147f4e589ee716172650c7cb44e0b760174691217093ed4421dd5a38f2ca2c41604c592366a89c4c70adba149ac63de1b5e21e78788f33d9e135890e61d69529dd9f658b340848623b17447998bacbf1c315b1fc5bdf8fc357e89448fe7a40217205c64961cd643ac6bc3486c5efc003011e80c4f4494cba123c2ac45f7d9019cbc7018669921fa76db3cb5436763b48a8046fa71d186b57c942f6529930d23737c49698c15404de20f8f357d5da523ee3a117fd8b69ab80335e388fcc661a0c8b583f94a8c7869e464a0544c84d160a828f1770d97be7bc43cdfa8566791727b7884e99a5d9fc549369a4ec5195ef1285860cb263085740cd466bc24835ae33bdd1499ce941f8041571ab638bcf896201cbf0b7324ec22c6d3c00f60ac6e6f0317efe14efb13440330b50cf86227fcc7bedac20f9364e2593adb7599b5142174d6b999c725f7d119814642f79de48f28d8b47d06bfec41fd06e2da9ae905005ad241ba55ab42a993df7551 +result: pass +ciphertext: a047e3dce5d5e4c323b3b4076f1d4d188e291151696de7dff52f9e2391919e077021eedfdc8750cfc16d8bc28e56faf53ca3bf0a00f80ec7740d7d32cdef30faa00b1d074d70ec64a154101e9be710969bb91f168d25079d67a861664bd4605546296cc4e6e708aa043f2fb2dacf8071215f80c9c710a8b0e2dff75e42b767ceeb643208c909646f8880d83b5168c07fd36cf9502c3eb170e81f9df2686108e001bd15f11b7a2f99b1ec6ca9dd0206401df24160a975ae0ea179da5b3c9756ace0ce3e9b42f32045ecf6ff10ab387cffc357518560905ee8f31c5c577111d0c50b4a7c131aa18628cd1fb61ad7484b43310e252437cb20dcccb807a5777cba2404ff76e54f10638cc66a925eca98f9340c7839c12ed1dcb23d39b4f99b1f731be3cc5738ed2f115a0cad0cfa0ee7f9aeef3ca7485cd221a61848922642de62d248e18743b060c42ae934b0a5e7ebca43e266e0a58f7d951fc5696275807916d552a372eca27c535525933630f0a5f3369be348021a338e7074292115fc8a786ae736cf5203537088f97e68c78271424a67a1f2632c1539d34b7f90bb11051d9825e911b42056f60ad0d28cb70a4a20a13009887b8d12f8fb07dae59e2fc621d76be8f8b28c6d31b4116e81ade5f973f44e4c819ed374f45db6e68e264ce5d4973b666cc0214ad7a51b1e8fda04a41ff465f1603a427c92c01813fbf54bd5253c53022652f78a3f6b88331192f0cd8c1ba24958495c98fe29696391dfa56357607936b9889123c5222c92c09f9e69c6b2a0e6b389113924a1940e5d82ac13091e47b76970d0a06a682c5441fc20114f1246e69f486b3030d42bf0e5b8480304eb49e8b4c2f1c5d5a11f77d8a25a0ed106c665610c2a62df65026845ef99d2d43d7d3a503fbb702c4806255cb5f0a458c2673d9de010ed4e78dd8fd1af0bea91b8ef35246833117dc3517bdbd8e897ea83f6ba5442fdc41e661082157ed9be5da8d8f911f8982e976812f5d157c83f7dc9249c4e32a7b0c6b08c653a014caa4a8e9903027c7ae748edd7e026f7f3a934fd7b62799b4e45cb9b14c4b3fc95e3df7382462931335dc7e7beb1bd806077e1d36fb231c76659a85da15d87fdb582adae063b3d3584af6416a153272a2f27fe5205d827fa24693fd62848bd2eee681e8d539028a6c81c4753786c4b1c991bf6730bed5e14a9e4f34bc80b8b598fc75cc7466b986aa92f976c3322113ddd84913b3e1b364dcf01731d6537f56b2b4eaa45a4063d23e61dbcedbd00435b4ed3b5b79de52363e1d40f2aa6450493875c6ad3660bb9ad68d4aac0ca4e5797f6f1151223840feb154f9e6c749ad66b8f0a0bcac22859e1cf3eea7aab96db9aab863168d36958381c5c95884dfdb8e4fb69c5c1f079c7271e3687db754d2a8a9a9597ee633c18255326ef63a50ac58fcf188f729e718a959fc0320568d36ade385e67a148152d1ba4ff009b056ab843471bd94c7a832fb2b706cfaadbbbd8aa42de9fe7298e53b11d4056c9ed043bc514d3e7da9f7da6726f267d584cb185d777dc58ffb0e44141bd24ddbafd1509387e9bf9aa532f6dd5f1bc83b6fcbd4eee3e9ef49a692818b644209030d944208182a394c10aa61c1869c7824f028ffea498bcb87c0c6fc5df46447f3607b2fdcdcdd3ca9bf885792d418563f404c39acc8f7855599f0943fe507e5c02cc947762d3390ddab882c46a604278359655b399985cfb3aa434a04f0716d2d94ad8c9f5a5b0dc448c0f85751ead9f22ba0052810f66205cbc7d7b8440441a892bbe6487da07d482bce368372ffac7db844daec7d5364d650f70113f86346886c93b948985a4187226793ce3febe4372ec6394201011d6e66c342a304576f33ab5de2428bc4abe940dc78d90c3a4238f7f06189fb440ab3cf8fa36fe19a0b03a2c2a119d2ec5812b999a277be469bc9ad6614472ecf1a70ccde3a4dc5fe647574b4827b2aba6e1d65a0f37a696b9a73e0cf3a9cd3293e36369363d637fa22d484b3c9d451bf96d993402f442591079c0293275216ff5b46e4170b9459ae31a9a7f4397112f0f9e1c778b79520aad1245b611e920010e12ff14bcab2a090767803fb30478d813d4cde9858befa2930572c45dc2e1fbb117ce98e81734806d1106ff3d256cf58d7a3a6efddd9ca2b1d87de57113eaa7ff1e34ab7fb98514abe99a268c8d87307fbdc9 +shared_secret: 6674a584a85e1ef11565916b1779603295226e1eb7ce22a3e06ebf19dd468a51 + +# Official test vector 60, seed: "99a9cdbfc674ab3ff2c64cded7d697a6e27a767434a47aff7c3fbf3c6a22d6043d27868955286a13efe3de36d22ec48e" +entropy: 2e2b70609f3fe029a14d09d5d659871ac776ce2797a0355f16e2eb68f5613fd1 +public_key = 212bacc3413ae8c00a2b78cc3b0c7958e349211bc64f036a70aa16067882330a36aa4cb183497c0251b2b942964a922c25525ee9e3834504a085540b36971963e09106fc14125659bae0c96e6663a479a381a915fda7b8a404061c90b814c3146a549b517a3735760244ea8959eb2d98bc37e2f7309e09749c4c689f6b640d28a7a0b8524fb9bc0b544eb219683be91e79baa327b5c0d2f2713b78341c9682f6941327959f853195aa36b919e07c1d5723d6528269b360984857df1636f2a80cf1383a775c230a9991f8602d074b5f0bb42c13ca1eaf4b3c7336a4fe61a8310c9c27f37454f9af3ff0bbb2232689c63ce4b7cbb880886b36681414902bf77a2623ae5f0c359c038f82433413d2cfa88373bbd17bf1d5503774939e916c415c8b929b5c2303234501ba642b75ef2823e42b71647014044a9450a55cedc0592da6554cf74693429d2d526d34851fda24a64450c785510111988982914fcba3addbd0963c3bce55f41b3cc71c0300ba32b02fac76158d673ab1ec7a23b30afd2a53d5aba3c3c87e0fa54408864037511dc3ec113153681d28c45b2a25e7256b6fa90df8b8ba8435b2f90727d4394eaf49981b397916c1642abb68f5006fbb2ba6c2c53b6dc5795a261ba674778ffa7e9daa65ac93366954710419c99fb21a46b029242158294107dfa28c53554aa3d79878b53506ea03846a9041664bab6056f7211a337910f77a2f37b993324927d64aa0d5085840475039c04acaf0ce5721b1f182b53e96928927961b8a04500118a453738c78b8a796ceebd960473b2fd2c9c825593ff4a95f3f659ef00b251449a253332171bbcb051699b100501f84bbc64c4e7f9c7db1190c4621664fb33c624910078155c1f2035d1755f7b10112e4521d58cb9c89575a3a2fa6caae5dba470a9b4d3fdc9b7ca6ac28e0570cc92647d382d04a5091d8a1ef749067848cda293a47d772372820f25245ff457580857eadc0bda0a059ecf1a3adfbc6d7e87184337e94231e8e3774c9854ef1c6b4c872bea6f939845942ff2732aed903a23b72cbb5122c43c8ed303ae0d33a7a704001890f0b378039ca271205d052fb594c526e7c761ad6b0cf14bb251225c7ff42b4b5f651ed55143ecc05cdb21962157e28d7be4fc4b5aebb6cfce5396fa51af1bc85fda50b00fa63ed800d60a5761dea715258bcf597a434e48b23202d8a415831c0417c6c43a659036df10772e796a2d70515939823575cb5c01d35155f7399bfe1b3ca9bfa47ebd69f5c8cc8879b87ae34a7dc32568817aa3f923df22c92be454e99d83023d3caa2e80e0ecb8818414b0241a6315ab20b63c422b6be8572b5e7f249fa3802fa647febc89c8ccc22583c144c191b91187257235d857b9bba3b13db06be10a35d712c540e7bcc62373d76e5828be049b6462d8da931f24a6827d314f5c0ad266a3529fa9b47cb6eec425b326ab0bfa032b6809d82c1cc3e2427787a413daa7d3976aaf83ac08d87b34da219a92a631784bce31cc66693c75aa58c7c87a9e3a926b5229a4f008b85090f351694f66743dae3a59a86299b43c20522cd82f96284623ee20b521794114d1459fdf70739558123f18ff8304730fbc63f198a2eb992e7115e07f509dc58b1e2a00c314714b5162334861ec20acac85664d14057d2788207c01a7ae383c93971d850102d60ac0d042c648c100ed660ef8a2cad375ae1a21b11998264e86ae0561e19d971689183968a98be064486b8abc3634021f770e2581b4383aa3c938bf3aca4aa2a337ec06647aa47428bc027339f2802b9f135820f3a8bea06846beac4c1a2702c502e50d338fb80a590a564f48a6606a10b51e839a4034f2b906ea34b4d3c875f1ff6bb57797b076638e4b576fe8c5a490806bfd178b4569a69626001c8a5fa1582bf4bb7bd586296f9ae74724d7b6c9c38d25273e114fed525ab008b887b9e5871172cc393938902914a3ace06a41cf92f6da963e4217f6b1363f7273cbf4a342865a761371f24285113e74f7a770079157c0ba0700e6bb9ca99ae10b83299ca9445b8024e450cb6152fceb79c0c433753c0b88b21c71bcb38c643ae5e16502fd14c0aa8939219005a15180446a166e74933f46f41a68675692e25816e7a227808764e20c98d33d6c3ef3801d21cb37d2872fe76749aeb09976580ccd4feadcea0b16f00970f92acb21c560501728f +result: pass +ciphertext: 7444dc5528743f695af09c910e1a574f43aba4282a54f050174a3d219c33694c05e6cffb95c7b43ac76e56e244b079759e8202b6425d6c3a124750fcd90eceb029bcfefd2d7ab513f5bb298aff940365f5064d68ce6c485b2f99c76cfe75917280d66c349b9d16eaad19b0814a8ee783e52ec7a964a66e2515dbfb50877f5fbd3781ba5593cd8ca22ce1531b4638c2624129c2a557764ca86fbf735cfeba58ce6b0bff7f039dae5a00f8faa86c463cb1176985ebfdf9aa6856d05b7b657760d5905a735e1cca3f033225da99a8fb631a6c710792ce7f83d8e4bdbd713c072f2e6ca08f80887c9631c325b8b853161843810f4a82e1cb49711e875a6328167170d796c365a6754bcb6a39237642a3a25121759523ef3224a74acd8c182e114a709552478c942adb7ba0133944490d7458fc4ef364b34fe1cc94f8215207a939c92921778ad986510247255b0def4baf40810ff5a148c46984f70b67608991b93125688af498f53a40a9e80424ef660c6cca5e7c3ff1024691f67659a31ec331e3b95a9a54f31c84257c12665e684cc49f4dfb13dafc414fbdd7148d9c9b21d84cc58eae523fa9b1b55aad27c95fb35696020fa7becad60973177788670c785a029567198a5240ece3e80133bd446080e29a749c7e6eef6eea00ee547428961353bb063a175426ca066ec2aa5c35c6ac6ba77a2b16974de8767d7ea028a83dc127f05a9ac0e46ab6784bfefc2a0e9d2db662ac0fa63403dfb787c63d57d1e3c51bba51233415af6ce6c3b6cfcfed555fee4a90f9368a5db2d9aa2a847efa6a25b198b69046314c5d43778ec30dcfe00c62e04c55051071de02976dda6a7f3c7495b98b62b0005850748d5b5e4d413f6bcf2f7a9095836790781d946b399b3dfa087ba6b02726e3a7dfbcb3b50e828b747a2eadd904a14a85dd136f074b76b17fee0d68e62591b8bcee55a3305ad469c28f6372e75c698ac8b5038c700e920fdaf2e02b8f87f91ba8b4b8ac1fa95513567a35ca4328649baa1fc68cf975f9ce53bca91f3d536f9d3dc85968fe18726009036403b9fec674a8aa4d3ada1396fecd59212e2dfdf7b185e5cd90e8749891f11a4ee5f515c7ee2f2d259e397be82ec63eae4935e9c43920c3563b98b17f1a29bd765da90a8cbbe902ef9b467c161dccae224f1b5f263cb6f5dd1ed070e045279f5114180169ea9f2c34a2d62535ea22ae6eeca384c9d9862d618d2accc856e2d5295709d4a66dda98588cbc1637e9dd5288129b92ba287833eff7353f57ae273fe0b664973058b88d1dfeea2c1a14485f61ec761169cb73d10b04dcbb39648f970ede927463f0ba35c6e5885c6257516d87a32e4e7e7a7ef58df4e03a5b8850e3113bc3c22de934b1c5a13c6ebc64d1c0adeb1d80851ca12adb496551b662bad4be6acb3059f5efb927f69b711bbd77429547ed21fb14d9c14e87f364fc7f5335ab0ed3312ea8670a92a58d42106f6969688ed106d2028c0b0393f2b2d4810d574eb76ca14062c7cf0fa284b393553de48b98a237679651535d1a8c20dc04676937a6a35ab0d90ad1ddd5f3056508d6e4dab52709a4bdc50ebad3c549973a278f920119e7731ea497d31428c96eadad8cb0f918e7dbd965287e7aaa60f6fed80d3ca2d4a0228893ddf8a36ec02354f02d7ab8f8490a6be91eff2f5d50013fbecaea945a7859296109eb200e3a406b96bad84846ad7fba8c519a25d224022b1b21d1b42ec28ebd8a280970027270ceada0a98107eecdc6bf3a63c5bd59d739d6024ee83d18abab1d27dfae98ec8c270caffb87904b2abe8aae05224ae346a4b1cab500aebce199c675792a4185ea761f1ae81b43dfc0530e6ec253cdbec633befa4f18b35c01ad3fc359e7ba70bd857f5afe83d6fba06578b6147a454e12bb9a559ef838163e906fdd089b5f4d302ab3c8449350243f48e09abdae9b4b499e709e03b34a2aae069a9011a73199c90e719b3f9993b256542c55d0bed6a7fd3e0e857bd7211b8303fe2d4c38a9755c546ea391783d960c1fce230bc59e3cf151acd24cdf85c785a6f27364567f200d18efe9bfd222a160924a16f198846d8636a44aa6f0c5027663c5aa6a76fbb6b077d2aa98c541109d82e4a8fb0d76f43af57a26a4d642396174d15dc9a10d15f01fad78b9ddb2c9709205f20c2ba1807608d25af4b0418bf2b657e2808efb341fccaa2d +shared_secret: 6843c8212348defcf5017ec29c620642d127ebc33fb539c4d07cca88e5a3bd9a + +# Official test vector 61, seed: "c799d57b41f28c5c446dfc58a5ac6499c4bcf3c162afd2b09a16549826ec2a6f689e44bafc4acc82f5d6aec23f4a3993" +entropy: 4725dd8fb314bfd8ee23731c2341dbe114606d9abe6434c471b5573e7df193bb +public_key = f81037775c727839696adb115a704f10199031d9ba3d3433ecb50702068392ac97a2db354cb311dc39aaf9719c4f5a7c0401282ba4697ca8c70ebc4e179893135179cbf02820d6bb7263708b2339f777c242f4c34155ac2452cc21904580b381a964c281d750c15c42d8477e7708c45c61bbefc6928f191260409ac31a61400350e928a3b24c313a71020fd186f6e9afab17bb065132588c115c31ca8c630275b4baab7a98a778b97a680adb4611e6471683352b6928b7f0378105383b5f981923e800ff11ce6b64904ad3835c270cad0cb0a6e1b8879cbe152221e6e0994fea9bfeb9cf4f582e4f429170295a8419c984283d79b882bb420876588ae6403f207b3798d89ddc1bc90d7c91d7d07aeeb2bc0e491269281cfe93129c5283a03630542a1312ba5c896b969ac0aba14a289c0672b964a6cb1c4a11c3617ab30e4beb8b8864285087a15c574c833166c759741f493438a535918c0ab0e46926d195802a5cca3078fcf3770ea9644a69c730314f3d91b5e04150b670b23448008ee55f841c148a699387d919dcdc63a23966a43b2927fcaf47f2cb36935d65622214403256753ef3dcaf73d183c79384e7914bfe597363684355f25ac1042505361a04798e377791b5553c449927efdb48606a272c029a2da819a48749bd66a32091946a2a7a0649095da1193c1650aef47099456861519bc8701477bb5b01359c4772269735485b829835861496e437a063838a0419ae6877d0c493b5c3aa56777f3a727e0ee5825dc83ae9f4a51e612002748a5d1a21c1f870f5886b39a23e0cfa14b6151053580a8d8a306af04a7418c88bb5c398c6cd8f6529edfbcd601c049872c11381ab10c0267c0c8c2f614b16d92800dd0989fb2a23887ccf46401b864552105dc79bb0def57eb8b6974723a9164c2737abbdb793bfbf00a860a185d3a81a2257ca91e09f547c6acaf35ac5833fdd9a1f38a5b4f5e227b3fc692677766bb81f85e34de5b200dd077573f0796175140fa9c920522d68040518c5aa8f84b1ccacbe5be03e0a0789372c338a1b24b47a8bfb0941aaa8601a7937d5577fdab4a6d3094aee7c073a7632f417b63383bd035a351c3656b0a52c6e435d6d6699946585b6ea9e8568307c18c025a80e9074629dd70dae6bbdba296e0897c8ea895fc6b5b446d1000e4c880747798cd42c860c3bda63607b69a6c4fb88082593c1d965ac6cc71125cc56a72b60d1297605787819749d43be46431959ac29a01c3ebaab30d9a18c1c7998d9e29415ba0cd72c0d933086dcc1c20c537a6f296d88f29b5d2a21fe314999cb6037d539081120d60206eef1b1e1a498eb65268e94366cd8912d269b2d12a3f1b99572e6138bc29fa5520c8a6cb23f90859ea0a494c17fe7ac09beb658f260cbf3a5cdf9933ca1659f2a0551b881055406cc6b72baeaccbbc4b6964751afe07754da9a8b0b151f02972df2bc1465929c0be64e38e6c55ed237f182151d1a91e4253c42d05badb82cf3457e01cb59a96730b5007ae0fc37a3a322115c8560f0a2a1395a88464728c18a16bb249c168accc3165305a6584939105b594af244c2bb41405163e5bb50fde104e7dc604a592b9e22649c0686be9a8860794cee458a73796ed877b18e034f2f50b8441609cf53280f9c095fd67749871245a4c2bc9cb008ea3e44f424dbd56a7c734b1a322de366541c732fd5f74a0663a61f277301723579158ecd08bd014c5cfdb7610b61789d8b84da23a58e571a72981cf63cc49c59ccf045acbd3cbfed4571f6daaab9b23bf26091bc581cbe301674972ee4420e7e0740bed617a3c94c3ca3be7125c7d6242185163398458311937adad8462b0cb3d5900994f5906121c20f6731ac81a32a864ec383bd8310bd64a30f3d575d936426e721228b93c0c482c1be106f4ce41c5e0057116b30cbf44aa2a217b08b690ff891657188d3b6702ffa9d8ed7b62cf78f6831a13b410679e60fbf9a3221906b5885404a7326589681c1549b9459745455bae21ca799796065925ff980aaa68c206b17aad1cb9511201e53dca34d439167d55924018e7e513fa919a4573b5500a91c8ab61f17cb5bcc282939172217365ef694c98a440b09c883cccc114769b84ce736c5c9c52b050ea16a0e4b8c58465438b7aa11c2c98ecf4aea6284cd00c4229cb6fe2f90dbbc05eb935c85f1ca2afde0d54307949544 +result: pass +ciphertext: 11c6b00acaa538f146d7c8dd2f0a44e1bab24875544ffbcb24857ceeae31d7f44bf05624541b6bdac79eea7d55d5063c65c5d003a8977ab872d53c77ebcb8d9d6ab8a17cd7e1969667c1600af54a52c49881fa22c15d8bc5131438b3165dfb158a2b8757539c2b5331f18aebcab7ad3e90c8207aebd1729905973272ac4d24bf86ad39a4b38801b449d202aa338332a0c5d284e5b62d1115eab7cfc5b415edae163c0374b7fa53c91a0eff51d32a2e76f21b208f1af7537de5fb4fcc35e770e84e75cf7547cbf23ebfafd7479897e8c30c9419689a267cd1931cdc7044fce50d9ad606f90f5f5096751ee2e2e7ef03bbaf9caf7481f2ff7432eb5b40f90d23453289e47db76a4219aea192d66c09dcbb9b37b5286f9c3d138fbc712b10c1b8d553c222e2b93ba268cdda88386fcec1a209f384ff6da9837f62aa0bac05cfe490492e96a7ed8377592252d04bac953f2ee24d48a0208364f5543a8389f19ccb7b54597fe03dd32f019bcca2c5307732b7658d04b0524e3656d0d5c71766ba0f11700070399d023842f4f7f90186016248ac1deb3d0c5c07e7116422b2ffb18a87575516143d6b12ec66571e6a0a3bcb0a482b45230901e17dc5db38347b7a7efb0d6adb9165dfc85376918cd78e93ff0c3702c1e37ad7a03430a5f076c9cb770736003991a558770cc06971dfbd61d52b1e46a89dff239c1d41879b4c80fbb74506cc7c5e48785cab3260b4962419e997b9c869d9006f7ca166f63d2876ff06c6316571c06e9042968419cbfdfad551087c824b0511487d2d696b25a8b11ce78b06e9bdeb48521c7afbfa4645209a7e74053e313b65902e11962febc482a093b10d24a0d1c13548332dfd7871524aa269b2d70303a277465d7a1cebcaa796398772b48473f5b6159994351abac4cced4d2203f7846c8802023e8939b197a16cf1c839494f9adcad03a4d3193d159bf09efb4588c9d9aa53890553d2cd5acf533922da4184ed80a17c1fa916e049a530e2fe330e470f8bd4feb429a537a006c6f759b1e98e73084a58dc05af1efc0fde60ca440a5ee8f094d10f52b64bd825f5c0ef8dc89463f13ed9c36ee30cfb72f2046ad58198cf374c2d039684debe17b34d9c82e73cd6483d5a9da9993eef118308f88285d8e99d132f5af9bfc6df2986c99b9dfb4b1f512a61f28a2ce8a948e292d027b5d9c320692332de93cfb794adbbad8747c598d401d2b7dde4f37434148268a36d4400e953bf61115de643552bfadd1ee65ebd13c87f2a5ff62a8e4622d3b093fffcddf5a897e2dfca8cd94aa1c2ed67595241b3b8a81a6ab46d950f17a4d5798a74294ffa1fc044736bd3050d586ec4c3a80ac2fad1f0260707d97dd3fcafea1c5653e51fec2b5e7e681b5168b2077b65d8935d2aa497f6abeababef6cfc250ae6281d6ca1cb61bcb26d62d40b01440049628c902e67c9514c7b2e6da7f46f4554ae4aab9bd2336548b3d325ef734855fd1543f714401c12e9c58e5f755201aa1ccee4ed0173dfa3aba864760104a671967c21ad30a7479bf513627e7cd21e91e7d0107822e9a1d4dbcece8ebeff33c0fcbf7a08c81a5f69c09abb48728167528d37368da4726f538696796ed01af351c4401649f0813344f8a04cdec44f0483bb69158dd89d3808af0bac71ee3e000a1bd7b0d47359c4896c99d1fdf6ebef54bf57b1631d62cabe02fd0c02515974ab09fa243364f36b2ead8add458c840f3e037a13bb678fa061cdeb302010838e5d92545fcf2310264ce64c00593e0462c62a0c1b35cb3baa017bafe03225c91f2d55ea4f6657fe8772bc8f438c83e4827f444ddbdb6abc05fdf282bae61353f239c72ca3027a573432e002745382b024bd7d3fcd7b6195929c24d3cbeb9edc90c9f61ea9da77f9d63a148d85d77569d721e6cb7415e75fe1377ba54b1e971f2683554a845fcd41567757a6ce6439ae3a4fbdf2695a654c4d83cb6fcca6251ff2e05923745ec6e746dc21ecf273906e4992e5c7f0c300e09422e0b15ef2f85789296afd12ae927161ba51c648a0fa8c56614d732a51667a5041c814c4ed7e4058b727b2e12ece2e6f3cfd43cffe4aca871b9b8eed8fea56eb64e2f30b0a99382d7bfbfc67fb4a571ad991919a07b7a67834bd31f23c0ade5276df2ead3c39f375c8402a83b4e2c405f405ff34b689b29a5c8de61577dd77503314cfce43660 +shared_secret: f09ab02775dcc52cbdb2a5159181ab535d1ed680df8fe320856b547166c2abf0 + +# Official test vector 62, seed: "f7ae036a0176a9de9a036a542dd2840033277c44ae936d10b768566216de9d4395cd42b116873b69d9804ba6ccbc05d5" +entropy: 818d3bb8ebfb32bf464775f7139bac0a5bddce80ec5798595992f9403002cd5d +public_key = 5227748594cc5ac52decbb390cb6a9b8f989c7048017f52231125d91c51ea6174ef4a37b7cb505b4a029f44079e14b957ffa2f8f325e7334bcfb5b023b4801f5f576333c54ef0440b4f7c8f6b3afec2524e31943fd6323d8f2300ba1b8095309e41c1ea6016de8f6ce4af647db19467e492c1cc12b5b5426b8339ea122473d1b84c603babba7b32534587145b360474a8483be8b06a6086bc5666a9b5af8b4eda929fb60606b85305c89cbd26a4be8a6b4866808fc2120649a60a3da2c64330a94dabbdc4cab2b956b2a5b7dc9e7cbdac88a71d5c06df3b192c5cc5dc6b7d10b07846026a3f5cf0e5b2c5d1c80bde5c3ca231ac908bdb7054190e77d54d40b9e7534dff0b36eb92652449aa4305967e57c9e358f8114544e0a5b8ff2c490c4a3267a405e38653449b617f26c6a3a74033ac483c074d5d0029d882f3507a7936845a6ab4d33bb4dda806759852488a06731222681326e9c6691077a35a7791734bc6b8e2511ab961bb1f17ee411ae86ebabf1b4968da61faf667b507450fff1a3392425457ba4625086ab1a871c8386982a322b82b7cf198ad639060eecc1c2e40bed7462ce4c6792764509e5cb9cc28b5a71a26d52658c0b5b951180f903bad708ca9bf7995e4595b8a009c614406c669468c1b4fa3740a9e91c64c03ce4a3adecd19a716a82530a508970cf16fca38aa10baf9810a8c3334c7b4a29904b7f72bea3e61505107e641c2be03ccd6c0546d2698c110caf2f194789c616ada3103b5c7f015991d473837e9451c9cbc9dd02333636bbbc825dd0da77a6731fbc3a831348cf1a3550166b72b4d0c59a5bb31de1829cc77c235b73bbdba937e5b45a456198b218b641be8c05ccdff9746bd64fd5a759a4886d3022cb63167aa3f37655a55e9acb9671262aeeb99f6d5618212419b1a41b7c260213b86ad9c995294b9e96e77ba66a40f9b5243bb38e6b7a7311d7c29c9272f98308a5f68c58cb111e33964b797a151588ee515fc0f032b054c7dd35ce5c734b8887465b0b4bb58c491f9953b1133561977f0c25401e6b577cc1cbd555bb8ba7760fb972a6b2344d2222c0fa575717501b3191ecc598bc93bd145800d9924c06c36d0360aab9678e93138d266572b305b7ea69a6ac8ca3ed647137090cec1227169754b49324f029776ad3c6c3e33e14170265296c1a7056282074a64690450555945a87ba57b54eb3595df82e81c1552f19c415c6cfdc0cb5fb32c3db060dcc208b6beac782668eddf9986e0a1bb5a0941a3745ee0b73ca0a5f98f5928bd7189ac6b20205555050846edb51a75573e9011f2d7738bb8c58bcd16795805f03a42aff1b854d3981002614b39b90c6f8bef32bc0cdc085466c8f55c7935b96157a624665404468783478d4b121d6b6a026818dc04515d0b98f9a1634977d3521316839253b7a847224c3819802d6b84482988122a7c87d069a13315fbaf56c9047c03641b4b008070bd885f1e3252f16918cf03af8634a8f7291e7b64df4e14feab909c10c7fbed446bdf2557d8a96e2cc17cbeb91515a2ff0b78bf0a21abcea847deb7311e2a782a567a6b1a57bf105a4513de2c378b1c0186909838a01abc000a829a9503d8c12f374c0d48a32c6f539a2ab28ad12bc49507e230c9a3881153113c1ddd446ab513608a567aea199624c98845a3adf90a5a89a3098091f207b46f28a5659f54c75a01347e18a11db75f9247749c03c7ccc6b9ed722da1b118d3c2760216c792b7f2f406397bc9a7f18343812a09e97a0f6c3c3b87179888a6d69b01b9d8c4b8cd215af5b76f7249747aba3537044f7991bc30854eb68c2f6f8b404257cfd6043a3a327d457651f0b600415a977d1cb30904bb853b4dc380ba4802b28f7c479fa7705b3a6cdf8a99ce2604af2670ab6a751236e08321d61d92a27412febca600fe30850f3c86c647746a65b1a9210adf34003a39c16ea69a626c73929567f1b001923b4f0726337f90124b74e500007ee8938cebb15e1f993e1ea0726d04a5e3b52579c625ef79ebf66485083ade6b1bbd0c9a953092fa80755f1471ff7f063a2f0013f429f155609142a685039c0aa540b3e410654803c7f281ce44b9cae5842f7347b29336b5125586d151117f3afe13669bcd7991068bdc68676a7f30708906db24033fc5822b8cbe33012f5e916c80ec7dfb3661e433431ccb796ba70c5a1ee85d63d +result: pass +ciphertext: b102d7ab71da57485f6d6fdc4fc78c8bb17afb69c4f5f266e402c18a619367c1ed5a5b59825162633e1bf5ea82ed986c309361cae4def129f3226230b611ee9c81d19cb1dd83f8c762e3366cbc1ab58222f5889258cbcb1ab9b47886eed1c843b39aeb6ecdb1d1135756ba2d30acfd553ab558bfe6eab9a1596dba1d3265d711f6388a0bfaea56c87bab7e88fdd6ce8111241f7ac973ec4b689b88140f237cba5a2ed5270cccdf73b599e2740e2f05139bab15a6a0083e5edefbde36558a17dd50145d32e7573cdc74751cb15859d103baa9340c4b784d92170d230bb46a2b04a5a20bf6db3bf8b7be88b5a7823fd6c0ed36881c3e630e5dfea590e712ea81f7c242cd09c0f51f3c73772a92e8f95586b5c10abd53cc9a2bb2a90a6d083b7af422e36d0b1c6b97e3eac3036fcc4ee7402f003473bd10592914e007cb0f2921a219a5cb0cb3f756d5d28bf9280d55664c6b5436b3349ab07fc15ace7ec83831b1a54b5bcff901e47dbb49fc68d1deb5f3c254d1e4fa2f6ac962362df8277a274dbcd58ce920961a4b6d15e7edd85e5315bfe6233aab84bc73866f2d5e06744b855ee34667890dc35cd1c8bdaff4b159e4e6e5a3f53c333ef9ce8301512cb5df60928fe7d72a0e8723897c5ca57e6eddc4dca47084b7dc830b88862898f56f14f29ee286c9e65ca856431b16cbfcada1a53ca163e506d1ede9d42ec3c6fedb23de6da3c74a69eafef6bca75fa5bb33974633017f455403c6f09e9474c61e234edd8ce301fd0c53530b54a5007e2ae6e0b8afb7e23d045a974b0191a5640728170b344cdb4aba753dcc5f86292d1b3437cfcec6bf22471f8086098fd4e94ff9e6521e6a326684df5c8204c9405bc7b5ce79c9bece25a9da57e1ad7e076ada0372fab1948c0a9fe326b53c905015bc90873517f436d26761866666109b977b6f1c12aef71ddcfc35075dccc3863566aa39f1f568f7c70572d5b8e45e358be7473630327901407b53520b483efdf37ff810912529334e4a5d44c2cd568c2310c14a1236fcf82a8a1c0eea577d4609483334dcac7aaaa39bbf3491e3ce0f9a975dc15512c028932d9d83e1e6263ded536e2892605516d1b37aff7ea624f1db3588c6e82ae7d591cdaa1ce70b261e61541bff6f9ca6a426277dcd33431c119ed6e36fe8b1c5d04edee4850138fb0d968bff73cc6a8ff4ed1b081403680428b6033e3b01e1a197912666e881e630d3d675c3c8f3d2b3bfe80370dbb2c4a48917796f24eb89b50d0f8ed19be24c44f6c109bac0f8f93f8acd596412566e98104c0b68acc2142aa486249717b427128a0a16efb7ffe7c2cdc06af88fb4213188e610de29a116d792360f9eddd06fe560a948bf87511e5bc76fea7d5ea57d42f7dc1486c6cd79b90a0ab66a1a4f6c3e1ecb0fec8ed361c9f952efa6a09a635d18f1cc5b113e1646a348e34c1e3f3b0472d4a5c50fd1d9830d00a3455a25c73347196111b6999ee332d66a26087f7d3b36ca5c946157039dc06909acba5a9e458f7e487f36c2d41d9fae232208c7f345e8f6909b0de4932ba55614b6611e369de0beb2f9c574336fff0228665698069120edf08cfe00b10f13ebd12ae0c52e4de8b8e62b659fedf834d9d8f14a5d53ceb47f076472981f9a89c208399e583e86b73247a0a44ebd3bf84dbd397d0d66b86619cf5d60d5b9aca7b7f2b5ff84dcb833b757ee0b0a38d7262926f315a315b1eb0419146c242195f5b4e5f25dc8f4f4418b855694f9c1f6ce65c4d48d6d0a1800d3e494437180a1770a4d41f3f5651742336918ef49248762b537c948ecc94fcbe6663a749c0cc67eafe7631c183da90d0cfa69a0c4be70761538722a6d45e4ce53fc31c78e15e5a5bb62f73c802cd8b1d102fb27ae9403fbd2fc7fabf5a59c5054dd699d49fa873aabc070c33045e084ed1b7f863882bd12bc874e9ecb080c00b47a4b322be1793c06672b11238085df22202ac1eed8d139c83ca5cec9887fd9f2f7e7da073d42f4ba5cb9400be47cf30aff2c60f1b38ff13e4e2c95a233a3a6c295767c3e59f86b895850b44eea221acef869ebfed4689cffd6d33f88f62ea125d00c990e505bd984985565093075bd4d5eb0beb8b6a0fa5e378d2a9ea5453dabab99657a74472750574cf1782fa3369eaa34daadb6d986df2e9848b4b4e24350ff61e92b1237fb5714c1b2003219b849c70624a1 +shared_secret: 69c261cbedaf5dd46d3305a59efc0de94b0f31d8f993870b40bf5de2a99abffe + +# Official test vector 63, seed: "d995d38f934b6e1a7ca77c9522e3d037676cc939b0c8bd4b84394b3dc91a791f09d2d97199258c9943da955e7f7b26fc" +entropy: c92aa5fb91c980d9cade9ce99d4c75b2ffa7d6a6ff9bd59def1aa701f2a0992b +public_key = 03a595bc577a703b4201253367762bdc7a8d14e60784e5bf04ac62f5cba8327c781122427a83800c9b342792ad6e93bdca2491720894dde616a9a9674e771439b8704ea57d70e9095e05a03f3155c3007b1ae0467b7c7bcfd67a5dc679c8f6ba53b44c110560359c65ef6425f667b5ebf967497119fc3b0bd0600c93fa269f349bec1397c4b23bd851a0824b80b664070622860aeb98f2b2c9349c8e0cc824f5b0386348a77857c277496cf10046dfd59765dc9d00b013c3002060737e668cb6440aaed4f3220f789826b579359a3338b91f6584b27dfa7324f61859370795568de4cb39c4b1b015fb693f42c09e981c7c5658d1cab448a947f3a0caa999625131c9118258ab7635d78caeb86ac5c100b30a57216f586901d1863e27262ebc2e3ffc09ac4b6ae45c968fa81aac089a04e7393409799e853499888dcdb29690c12a7e512891421f111a2189cabc1d00a2fb9878c0057144bcca25c9a3f1a2c3b92c61261a3557177628a252347355bee55dcec7be730639fac28e0536c0636bbadbe97674d83b6c209442b34e37d9a43d508e849b3c21369149a7270e56646d984effa143c87777083bc54270b146291d8b4cbafc6ab7e72a871469abf3018ecdbc0753b94ba98140e4956c80913efffb22ad687921560055f466b1744e9bc851e12648899b7665a18a71130c1e4a47c26cc8f1a4972512186fb89a740cbebc6553ac3c088b01b21bd9c47cd5578cc58fc4697a0c756e7f860f91086aefb4cd02d184d294acf1f2872191851f585d96d3b98a755bdce648e8d7ab5e8bbbe8ba0b752973fab007e5390bcb6ab750f8aab5c907042ab8f49acdc47271d6b2a2ee148f13518243809fb5651f6da4379225bd864597aa65343b21b8f8753ab2994d981961cea24b7f780643b5674520b7fd11793b1a4ff110aac7516c1861ad54296b917c72e281692797af7a594e50c35d958436816036d13348f81851bc5332f6e1b55aa575af0c0035432b10abc89ca5cf19170d9537c413d1c7674992467323ded94c4c6b694558cd3ed45447bc5fd3979a68427916a9297904b02d48918d914ad9e88c99b5c28a6ac037248be9d3054adcb0f3746acc2c0a6711cbb1401c6d08d07a947d3bc35eb7b477ce19068fcc744772a126f98789d349fb7c58d9c91cb1ec4830ca54e2e44dcd27b45c48ae07e84c045487b2252178075cda577b26704803a94f9b07acc6e815a75696fc927c1cac2c5be290855247a4546288a383c15b05714c1eef845e9bd70ef5d3284d5800df8ab0a6522372893618d6a28a922152b1adc2e93f60813025d2b15667947788b93ddc34f05374c9997a0ab8b72023ce47a50c86ba00c86a37e33b7516437a23d37d6dab5197a88e823a5129d656af31b755a89c4df21b520b3cbda5581200c9695b497ac2b0f582a42ba28b537a7024d30c127907bcc1667547b79ae655b4143723dca5ec494d851b3e3eb763f4809cb045ca69407627cb49aa59099b050c26151b4d89cc55e762c1e358f1679b7f30a8cdc531b80580beb1b8495487d2d0ac3a9a240ac1acc457b53f6aa6a580b79d9cb953240e9bf90e54644253dbc79b2b3028e26ac8641042f7715d97190e64ca4e13624530a882bc53b2c724f68511021641ce277d0ae32d329b9ff554502ce25a294a3829c770e9565512d52f08211b7fa583ca675491533d14813ddbb96ba4f05fd9b95cca052b7cf098000882be1c2ad9865e4b9b0834189f91d5444791a561ec7baae5c82b09893a900920d6bf6df1391cf1a2506acb25d79f6d441a17bc5eb4d133f5059ae52565014939aaf208882631a531582b486bbd72850a0724dd52a225c40fa2a33f312c16a426a3162993cb7370d23c300e2a5d2a70102e9aaee23b715c11860386c4be5080283a4727954f2c5197e6125bc2c28757a63d46c0b322299e5f483edb10caef28c44cdcca5a9bc9505199e7da28286815757a63ff83c7149bc0152a674404b3c2c06949950f7b073f537728514b20c676c53176002a8c7af2865ebcfa57f1226fada60eeae67fa5417ea4b863d82c3871c4269974bb76e3338328c00530122e38c138e42df370cb51830980f9a6b4829af71a7149a28379a251530306d0719d0d6794f89750ce06c27a913832a9595b9a9c1728bbdc4515cf1afe1dcac211a3135eeecae628aac9538ef2fa7dac989ebf18207def +result: pass +ciphertext: fa50afdd558e08fa0991d99c7420f9788265d682145abdf4d579799783c509f63c6bb3bd9fff32fdcd0aa4528f7461154bb30fd2bf34d5af56d3e097e64330db512bd8fa8912cb54e2af9998e625270a63feb2483b0bcce294384e0d213360db0b6f9968c61f23fec7e417795bff16d8ffd89ea6a4f08f9c9eb49f95094b1219c1388efa157a885c12ad226d93d2e1df960b113e43f8c95e478f30d65a59ff9e6dd70fbb5cbbc523c5070557c7d268201c974ff1b28ba585e95b8e6bef88fa0319c99d8d18bc5f1363eb26fa36aa0619ba7a73d023acff3dabb02358e16f271f5d5034b15480b15d8e108bd2ce74b3e6cae83d683fd5ab321f30eba9aa098a28523f2d91defa57ad07d2fe89330b4ba2f95b7823fbf6c920c38f001cbef83d27330a0d646cf8705b3a3b44ccdcf7d16af8b0e227fbb8fee4cae2ca5a69acfb01a5ada1ebff06b58199e4efd713bd915be7cc1216c7510fd6f1400c46e6805b8c812090e47828fdc0565b1a4b1be10101722d788658669998ee3fe6b019c84cb8620ec0678c03e44bd67218312924355e61bb71b7398970cdbb0017da227b68f7c2861f19edc80a8c4f6fd2f6770f3049ad7982ca5ff8920c934d6ba6bfc5114d44517b9d49ae2e21b4545ac386dab5018a04d32e11df835e6d13ba7904fa269049b5b54db5e47b9db426b6b0bbe7a1109c3c968d3d1810c94154e3ba163f3865039e43f74b925ad9e3a847da0bc21d8ddb3e928e5107b68fc0b317a33777315f0ba2b00c202ce78797fd7f95d3712e70bf742c9e8343a6d00f24c922f0179399d16f7cecc79ec8930c8c0226bc057633cbe5829880ea52513d7adb29d330819151c1ad81be030e4e0f48b732efdd315657ca4ddb8018b79ecd5e13bfbd1e1357bc33324cbb95052da6d7570de804646eefb932f39e3b694da67731c96531e9a080ac0ed2cea4dbef51372f4c2b4810cb95e157ceeb06dde752b4786d837af8e1dc2741f0816be444bffd29943c535a15bf38a33375a5ba97636dea4c93883fe772a0c459aee9fd452e115278feccf1b07887143c5c6d5d22a4fda4563b178b795a3d686b2bccc04455fbae584f9d0ab687e6cdc32c849e8b7bd0826d9ad7fa94f95a788c5900e9af7c6d9d36763d76841e186434cab559f8347c6b5ae3a12f995df15be97d8e7dc52c1c0e51677c0aea08ce2cfd8e3b14c970fb1e0e48c139c41aaac31796ae220a19c2e7ce341c2d2ee6555988ca1996834197bee7132221e2864404c662df7e1c942b516c7339ddd143e48899b5b3bba4975d049816978e9fcdf84f76f46482fec4444cb65c97946c8eafbca4ac386fca82879e3ce2d3592bf18357b98335cd411b9bb60a26ccabc081726610d9d30bf03cf95b9976672cc61cf34930acf1725fc4ea57e503c42d2bd4aa110e5a636c34d5a26e2cbb91ec68ccb10bed5f16a685dda63083a786f2ed583873a7983739f19824772e1ef8a95fdd9b30cf4fd92c33abefede7d5c7ab5bc723c800696a6067958b3f33eb785ea33fb7ef1c1c79cb69b1d78d34d29a4f2e938140c306b3061d9d6b342560cae88a0579136f7322e9cfa01c57c7895637afcbe3509c57277a5035790085bfa881a78ee06f34e9d7ab771d1337b4d5804f09caa90f61c1bb0fba34b353592fe1763786db69ac381483b48088c2a29fa7144b81948a9128bd569a35e83871af70dace9bca084e6933c350703ab4be1047f6a583a509a8b6b42279b416fd74564b8143498a639d4ba9e3ab0a7d0ccdfc4066b3986aa18d0cafac9a6bdbd49762e351d7fbf5f75eae5a4f8e9a68d1ee21d1694c3a9011f9baefab8dd4479a0e76ddacf3adee7d9764c0078b0b1d720be9a0462c96046a6096cb00877afb8a360f221d25ed5dc148925be426f2bcc99dcd9a6cee6ff4f5db923d0ebcd312957be9d9d1c3ac7073b15316d46b8490cc131ab6bf7e32109af1f33edc9eeb14a124f9179e34a1e8ccf8805263d57cba6212895a3f89212c3ae2dca1616de55c3978cc0e550a06cb0f257205f99447aca459405e0e5b1575f48d589a90651cec6d9e36bf0374ecc6825947945d11c3c770ed4e950d7ffb789f9630286335276b6187775eb92c8b2b009d98fe4bf744c4b24b6dcc920101f4a4e190ec599535b3e0ae28b7169e2ac190b27ba5823103a61fd403776c0c9f9739454e9b6ec20dc26cef817f1780 +shared_secret: d66f47c870254f7eb7ac771dd6e7bafe94d0dfa62240da301a5cd05f2ad7cd4a + +# Official test vector 64, seed: "5929f02a271725cb40200de32d9d03d8bea53b53ac83186c42c7f565ccb1ca508305d470850cf86e9b2c61a5b8ca1c93" +entropy: 7e8086a01dc5b3bb9eda25bcc45d27f99874841b97237968495800e007696ac5 +public_key = de62c02cbc473601b03f5547f1b4a8078aa079c4cf39c56f88925a9383b9a0f57b58741760c58d2629c5d70074df007e715a3f9344755ba908a4a310de73150a79a9ee3957a730687f4b2e7df025c1d699c254af6642bfab84809ea9a3b35410c7688b296a3da82c6cf6790b48fa3f66f5b651912e7939ab76b0935f49c1e0a25422365974698c9532ad00120bd2ab10a8d1a78ecb392e6892624a3f96b2758a423246d67933eabe6ba2bc019a031431338ab546b3154a80945a9b31bb5f9c4071a4b0ac4b1b85b3a11ae1371db39771259936a27ebec742e7d6282f19c4b6ec1a70085ec6cc23186c8a29f4c3a1d3ade8912e3e238f024cbd30e61b1ff2312c91a2eef9cdab68446bcb64ae505c32f0ca5d02547c3b2343962df8d384bac81d15fa3bd2a116b4d9aba31041428ab688f950809c94404b5c35f303d9852a0f029e609126110b64e310c81d634117e3b3e1994ee2a2799600aa38966e00aa9450f24657a39b4901764c3a267f2018363950256a69d5b0240f368bfb238fc3abae22dc2f3fa6c9e7f055a8712cec654adc039c49aa1d303158e05b0ee4f1ccc0e07cae74047b603671b9704e70646cdc0b1d1423bf3c4fca6612360269a26b9731524a2117a2b686131708470ab6c1ecec857465cfdcaa5b1506abdcb6a5e379bb4e358462f802c2a81b26d0091a9a281a891c06737fda60afd65ab7c7bc4d97667220ea69896a46f20200b0333546713d9e685d8230487bc39b68b170105231839417fa92aca1cc38246b3d0da638aa28c907c823a1fc779b7626a1146645db0582e23115c64ca6468bc21a480385b27fcc28c0e6b8430a270c5061012a619da7138ca97da7832807aa4f338a3983170b62145f36a35241d21c13c61a1044b5bbd2232f5c16f106ad476818f83920f650a87dd80c3213680cc1572b0625391a92dd423e53dcc0ef58ca376b18a46b8ba4506878f38c88d814bba280575235b23107bae8c1f443a5e9c1058c904a09366b50e7b531451f8416342267352fcc7fb21c05bad69bac0967778c0c2d48a60980ab5b7901b84b54f1a53b6bb09b37d48dea04838193657cc7b47b436d4dd36cf9bb4bcc552700f98a88a850dc009b00bc41c9f552e5b346416024065634f4d768cf49bba831758af42e408668aa712f93f43658c48b80a72bfecc0258ac6fb10c51ba665e8f25537116ae53336a8f3a0d2101b705642c5891b4500ac61d023398b35a21e37ec6c9821eb46c348c594590941fa0cb5d88ad32c3165cbc3569e15960dab8f53c16d02320b7c8394971c14c5633ac5023d572608c60a726d50b22dc3696e7c352fa6faa0c8e73127ece085562bb8a86ab6628149292a750588aa90d268f5fa618b559a4f8468218985db9f4cdc1f65b4644cf585a1a8057431985058476cfda6ca0dedb2fd77917fda88d799709c169c01e90c5528a9ffa144636334d8cb3a1cb27b81df55c9205aa1cb43f04ec29beb19539992846db361de4bea0a7b045749609571639933e6c105221782033885385c5036153ab3ee68156f0abcebcc67c9163fd09cf2a50910c8a5e50ebbaecc030ff38b041c3513da677f78b253d7c5d9bec993f85aab56a21502b1ee66922ce9995eb83376ed309b1f66c9e9b46436399364496a51851d48ca06e342fd40a6c64748d6db5a9bf18893d65a9fc3b227401c9410888287100482438e604cbac435abe040598f5cb7f07aecc23b6b38a95f9cc8ebbcb4f5cfb17a8443f89ea8eb592456da09fe9a36bb31a98e9e5372d4bc83f9a7509da4ad87036581b27844b79a9753bad9a476ef64661ca2a5e49797fe161159aca36f017d947b66d87833383c9eb593313054e00867a81e0aa6b1a8493a082305a387f8c50024a9f682c69ca0aa180eb8dcdbaac44f4a3fa830bb056352095c2b8b65eef62775a470638c252f40c8137d05cad7c9508c3c34a6b29e6c6431b34882a3526ced7143da2bb9733c2ef816e28d3a1372b418ca595ba593b18789b7c6a411e27acec3b4246e8659a2330c628436d21722536858548a280588cadab316411b5edebb50ddaae15c32ecd74af476b3d4d834c1047376001cecac303f5c1bf7afc7b63e8372c97a8fb68837064294527799a8874684a81f6145ad7ebac7a5cbccb696472ca98fd95b9ba4db7d8729965aeb56b8ee101d0b32b6b80a772fa80e70598b17e84fa +result: pass +ciphertext: d2f9087631c7583df5f541588ac0a0696e83c45765f3eca327740dbde9197ba2ca9d072aa0089db2f79746b0535fc8a77bcae1500e3fedfc3d911d97c8ec22fbc1f61a5bd6305d736d68061072982438c4f673ea82023e56b42e1385ebe4e85d5296e28ae0352d5546cecc6f29cf4e25368a6a794f6b0b33fb1c568dab46ca7a1353228ab01184be7c0fc603f5460fc1cec63c240dc96ed5e346ca6ad214b00c9e0679619ac924254f5e75c8f96a8f8d6228d3910a662c24003960011e93360c27179f826393cea762a09549950cdba847ab8f676530d832dc16d4e479c4207ad6f9de68a0d4decf15d46d98da375b5730a6a8322a1126b6ecd8d42772b76318708a9366b8da5c7eee8fa928ba2e9959a1889f4eb63cc5b4c1dbc06c728ee16e93b8276ba862e5ec1b8cae91582bb1c90893e96871689edd35c1cb12ae33c55a69d4c5e5bb6d553980e0ed3c131d2d87b52cc3fd176b92425bf6a90fe5f5cb88fe69bf5dcf827bfc20b3c6a4145d400e4ea80e9b519df58fc3eeb0e9579d147505c5eaeca51f0894f5f1050c07d53bb715671799c13486b8ae5d26216306a974b4efd27d8f7b534dfe1e25831cf74693f7469c64d09f63432a1b369a1b122b1f4c0020b30c1bc781f5824aa91a4d70db70b8f121e3615faaeb7ace2b53de58a56fb44cc47e5b70172d0849957f5a1ba90aba44504249a5f8fbd9af379f0cd256a8dbd728131cb2b09274bfa9d7c67275fc502c531a02879eb7715b00f2bb794c2cb357917ab53f6e6a85648056904641ade5a0f88c2fd00f4933c34e9edaf34050f97863c36466741a5ca0dd7d9425278a1079bc9351cc6c45a1e80d3953fa60c502da6533188fe91057feb940fc926feabeefce97441becde7782f365610e1565b6a5660d22d34298df8bb679442bb821941743ad5e8390789f3c262c6f90b4685a0b7381762a9aa21142e7fe80735832918330967fa9949e44c30eb06eaa729a108116f533d72c3d20eac2f1e8fcf5c39e86d7b453894ef01681f0b46aff3ebad2927d3af51476543afde23040abbfc167cd5a9c1bcd980f2d2c8fb09bb0b81f4c778a6fb4e114c874f6bf0a115ae64cdf82bd3aaaac90b004c407aae67371ac62d9235fefb47de6488627e3c997fa0b5b76289d0166cfc4308a4b9bfc674ecf643ebaf66c2932a792a360ecf2bd4fbf4c675daa7df02eeb54e2a2f0a5979c33474832d509c94895c61a93873c4e699a130b1fe3dcce9603d56755b501440167b09b6acb9e115ef4133963cd702f9097f6ff44887bb0e230f80e97c41d1028f36e6344c7c1e4a19792b9c8cf838bbefd4fbca05e1edce7eb9bc9188d89d784305b3ef71a3e097a7ca675a775656fbe3f2219941a0a70a777260645fc2198536b585d8ab161084f78fcfe04dae0e1816f0bad71581eee3d663536680b1aadb31a6711832a7d3547d97e7e1fc9bdea77acb15d7d82bacff5769da9e7ab730c8db6db6a9b51e2c419756159ba73b6a4ccaa8cab4f86e483237f8c6ba850155d5e0894f9f3105bd11a33ba4c07338bb03e67d59dfac122dceedb28d349aa26c61cf95ed6ff2f7056b5af9947f563fd016d046c9c2e9497f665702643d42f5a277e3e4b8f905db9ed6caada50941473e3caa26f70a9b68284c09159380e02b64d7a4da9070ea4b91514041a18036e7284407456bbd8a5718a9125828183dcc65fb0807d2a53eff3e8b010ddaf62e0496b23fc21ca0996a0a625839793774a3c5e0597e00fb4cfc6fbca08d94e809969710d091a45156c1b883935c94b1c8c514fb8fbf6d0dbc00fc4038d05f92362e5ce0080353c61b65f201f079ab708d86feb9f6e25e0289abcf52ede8e241daacd90a6669c17d1f1e257569a4832cfdb2917a64619e95a8e6682e83ce07b01dbe1e261ba31115e05b2405809e123215ea11c067f059c10851cdb00fbe8ae6c9508ea8dd9df624eba5eff018880dcef0171ddaf375724028fcb2b92a8aa1d6418162fe994d1b7b2bfadb2c9d72529ef51711745fdd43da7675ee19ac6b6b2833c69fbb7dc00c4572bde53014877cb5aed967a7f9477417a396f77302330ef0423937e5d4893d06662e2237e5952911627aacac06f37eb7d38239d2623235efb3df0a1d630de19afa599b66f41db7381acae5664deb979604274253b7ee8fd840e2a324e3db89a711ebdb5799c4c31f45482c5a7 +shared_secret: 166b559e963a2f4c7236e90818442e9d9b2ca49f91d96d54f239b9682d00b5ce + +# Official test vector 65, seed: "905074033d7b75deb2d06a2f29144eb377b452534c5710632989f02d45312d156557e96d4486020826db200153bc4a8b" +entropy: bb321ef14d44d8698df879fd52450567657f52a2df8d111185dcd7d4f30a72d4 +public_key = d0c53790651f609447f0b18434e5b31f2b2a3d1233205c11e5841daccc2017203be9c26db2ea7de30a6671f79c1c424052a784e727c36a3b9dd1d71ba80a542dd42b17c85eebd81406dc394ec556acb00932fa9a8ae610646a973de42f9fe29c92b35c04884be2a5bd3f68b2083945f8ec525d651877d924482b024847938eaac5690cb33f0a878927bdb4a84ad627092f046a2968437bf9a675d91e25e89a3f246b38461f002c3d78206539968d9b7a83745869ea8accb72ab1dab78ff0183c2ffa338c819dcfc1178ad8b928c68abc98209819ad705a3fc264bde3047fd2065c3e1806a9318d75a39c6e4541dfb86433bbaabd12762f521c842a2381dc78fb312b1a6a318c5201bed68ae518be985746b863ccec279836d6810178c54902619301467bc986a735a9e93678b1f433bcb7af36da821dec7546a4957e413d30a4b1d75ba216da71af7a7b17a932c224bfda459681893ec103a4b56c10805a24543741ed0b1f5bf84daa018f94c07434758d32d80a3d8c6b54774da822451b12aa086782f9c0622c2b8ac9776639084a19a509124b5de6d77a83bb6e123b8eb1019a2b203f87896f23018568da081df72e460a1d8a2815794966aac55fa07cb7007ac3743a0f2ed5b6f377286a7c2aa4b9655237b3f1635dc25527357bc4714c3a47285c9ae3a5a84886c7302d22ba2d3c15580be7b1627c81fa1b0942e85a3a075845e47dc0674f4ec2c1ed9ca031ac1cd934a01c022d26b6ce5c038fbd541dcd4ab4a9bc17c06842d7645935b57587559c11b99af337bc629a45ec37a3a20b1fe905510971b6e0926126e815625c5d79f677ebfc69b1489809172f34e075c29a6e9fb4b536f892b16c7aa97623168823d5b1afb439cd2603c9758904b942971d769826b169936ac108c6caedb98982098d5176c71cbcb11b22b96143433f6c083bf83f6005c5c8b93562e081c940903ae662a8f17fd0882fcb399161d2a2bd2b8d1af0731b0303e3c9beec81c5473384b7a04c1c841f60e27eca0977eab4c750930a2bcb3983daa99cd4c2e2414ab8f77857432036c1a9a65c493afc62ef80758830417375c697a2a7fd0782ac011014733e51f088bf32b7135b5db727b147936740e320c603365e280cbab502b64412abdc4d25fb9a96ccc96f166445f6a6c3a894a6c10ac7bc074fe7b5a1d2964ef0531e7bc445e0a402f45b0f29809a84795848812a1b935d220670c2cd0e3332abc68f57b98f24cb9e68f8b1663b4c793ac4212177f11c594671550e44794f84705fa4835d918b317a1d5aa39e65026d3888aaf40cc247023b74cc4e00fb1c011c6a266560949c626e08263891608713c12e75a229c5bc114bada81395b00a5b6e695096b2790e85c954028c5b288758c9ad634a3ae11b069790bff9428b425ab70c5c46c2150346235814e7af8576af3071c6e6d4b56b61412d7a5cabe21cdbd0aa69e53d4d223d72e4c77afb927958245cd57967428d9f6c81cc604fadb43dd56c8148664942e2085395b17a1c53646287fa14a9bb208aedb1a7e6f73828f0aaa5918a69c211bd765cc0f93615a57609b5aa91c502b851c4a9b24335d282348ba33a802170524ee3351b6c780a3a9b46cf472fbab34be9f508c32a64bc37b6e6b30f37a7a9f200c34811c2b8553ec3ec091091bb08ab02ca7680867244fd3c991508902e84bb5e177f7251057c38784c0905cbe7041f12bdb77c07842228ab569fb69700f9b3a058dc5791b600dc48855fb1cb938b2e2599c1f3411628b64094ac20eb6c50f5f5cfdfcc10471346de9429dd29953e7b139e2a46f04127d7225fd46723dfe19522a4a76389bfe6414450b885cb211ae680b59ef46177d50b0b3306820a9d57293ae6753e65097f8de97c898c465b07b6e89459f446a59c04145f2c30dee57368e0479468ae96bb2e8b0332bb7535104498ffabb2abd65a6b8a2358d467eb8376a795aab40108ed9b0967a710083acb476c28a01b46e68a3d64b12dbb49146df48f31e1531cfc3295e4cda083af7b3a17617286f60b5ca9d21858508f8f009878916473c85360e8cf6ae8360c80aad7a10f6cb7a707063ea9b2ac097155e6961388f87327d084baea61d5ba26e1d5bd9cc25ffdd46a24d81c40532697b4cc8f58643d41afb6d29b7c857837a1e385a9106e3bd9911c697c8709312db4ee1d9b023e39fb4a92d9d95ff015 +result: pass +ciphertext: 8e1b874c5239db036b813ba1154ca84f8219a8a4bb785dc48912a04e5d60175821c3f7609567bd3a11ae75bf88025cf960768bec53b0350531fdce65e204065e23b58cd995efa449db59eae436e84b4e7cc80dc78cd4ef12bae5c5522c7e7e8a977270b9868acdf57df9f67128e5f26179e11451a81c45778fccbdca9e5894cace05e2e512b07270e97dc7258fdbf8b0f2d532683cf0578bf0821e5c96654d9b166c4aeff1899cac0d9a898cabfcd572892b151b48da4cea71222fbae06269d2ef9e564670ac80965b71e7263a0a14ce5a1411e29c043668bdb93af3b9d4c2f86a917118ce0b147c5c99562463cf9d907623b3b5c09bab327879c8e17bdc16f6a559aa855c5dc90adedb3ad4b642d8a84250ffb2a70a861c6ce71b24f8c6ec9199c060531e365f6bded0dce14f5a42a572f3b49a9f9696ac3da5a842640edfcef5cbccc85b3563107957183e1004443de9e416500e4254e3ca7ded5535c437b098c34f3e10a568b12f30f8d0ade71b9e2e666393e61fe757da50b9c3d2a7682ef24cd9aa296e1e92267d9d1fd686b11507b984f4f05d218d98bdd7bbf67ccd84bb4def89865a3cad879785c449c517e29699b0f3d09737558dd4ed27a41d065f88b7a07569d28616664bc6923ff77337ad3107efef86ec513b991fb5d9a58044bff3412cba0723a83fb30c465f9cf4a4c733be247281cc56e8ed00ef84cae631b2bbcf647227002cf7c7a400d465d467188c3402d7b9afb67c7fa7b2a1ecae21ec56124392be4f33df423bc6a29d1bb8641f230e5078d5642be440923fc761bdf2835fa99f505f2d9f3ddd90187ff278c2f55792c5ac147785a5420a72fe9b55bd7a69ebe877954807abe351f950de6b5766a516e5cdc0668513440c695b3e0a0c9ce68ec0e036e3e7efcf65c8af343c03802ed7b84d940b796b79c08f8fdf86cb956fd9ad3f6336a39f814d7cd68971074a9045373462f1eb03c216d5431584a7b77e67cf73f30d4fcd66ff55141859fbb48be45de1400cc66505411f91faf600999dbcb50937486c0e71722d8aa11d1146cf2ed009c1888da11e14787ecb008aeb71e5c2827135c930788bd964082c147d39da28d15382aa86763db13c0d48257d8a9253dca4d1a1ceaf5cddafd9ca74653f833ad22663a5b158fa142bde1980f14800714ef5222d4d97542cbc0750bcd24d26dcebd66edd7daf309dff500cd2dc924f651d5deb9142e81434ac9a2ce80c8155d1975fc5dd2a1d9bde9e40a85bc77942b916d4cab359579cecbfe32cbcc639cb8f6840405a4e2003a6587a229811556ea15982d193d5b84777517e757acce84f30f957c019533da3eed6f51fc3dd69ceff6bab3ecf918dd29eb0f741284cc4d4a17bd111d6e2f964360e6cfe86a95c58e0d3b3ee14b11d15d9f1354c3f364430913cec29728ee2b8cf391d012a8a48064731e51ad86399788deea1138de74476fe3a8da432aa9ff654ab7e71a9b33fb08a9f7e8d703ea3e831f575c13bb0cc592bd6e387f1c960ab82b04b29f03b94f0daf0b56477517d47aecd0d08efe6e61f8823b0621cb83a578bdb6a9976593bc825991e887a59caea6003b11fe23ac1e540d2a67262807e65422fa8f5b47e5c8b452ef29ccd60ae85448daeb744b337bc20ee87511312c2cf4aaa76f0080e166ac4d0cb02f3456777166ff968efadf6fe78dcbd93c8ba8aea5bc0f14f65262acf72052fe8d23933e4847a9eae488ba2049478b09ed9dcbbfc9ede10454744b5ee95b6381a30d838bb9060a67636b7cb75c7394e02b1e58ea3736443ad43dd540f52212f686544481504224d8d50b1e009c5ecee23882c8090fa0c7f0ae1b9f507dfa76329f788b0080f6e985c7e02886487b9379d1229b0a6aa23304a056cb9f893cd89addd87bf0928f42d4ebbb2d90e82f17d88cb1ffd34c0e90d6126cd8a8b29e2e6454c212034342b204b6ed5d462c3402fcf96c3ab79d4db0fca0ca1adf6ee0407c701105ad9884f178b979fc55ea74cc0a176a7be6f1f90f675c4f687b44b2d6923a6f8e1de0f5e6f76c4516fc1ccedb1c4c9bc51c72979270cb972385191c83e8278a4c8279a36c528a91446d9fdb06fc26ee7023beae01adb417a11176839e74e6766745c2cb8cd0b74e8cf020cce2648949e729626c129bb204789542f74bd1defe1984d43c9b046604d223b4a10511248daa39bfb88028b +shared_secret: c71845a26ce9635a0a37462bcae6dee1b2f6901e5986bbaef9660cdd5875243f + +# Official test vector 66, seed: "a3e2e511afa7bb560446bdadf67d2ee2e16ffc7baeae7efb8c5455068bbd4e91bf9be9d98b280072faba7712c75b26d4" +entropy: 210a423dadd899b810f011794b79aa7f860823ac1962370e791287d3a1afa384 +public_key = 13665dbe0a4aa46bcc40862f1e3621f2596ba293466f7499d9954eb6a6251483b350072ce7a4910f008166e62476e383f0151fe706c23999b71dd2471af759b99239ec05996a94b7a3943e37f10dbffa1ba205b2ed836aef025221ca53ac612d41339770d80b03f0220fd1580b786353c9bf15909242494253684c8e2b5a28216501e1b4f1820d6312cac1bc02c122bc0ed71350a05457f4c40a29584e20b70a8739f1e733483b7e7f8ab62b664c9672229980536d747f3199a064ccbd66e7be173641808a93231aca8a7b54dbd0c593ba85df11c54bc2894c6a797bc0557df513734c74f3641a6d2c98fcd8c1ed356c2e199c28088ef495a54fc1019b736f2fb8895eea391c67c895041f97805bfd2354ba1c3dd8e98467d302366a616d280bdb4747fb5a000bc5781bd8c1cf2b563db206e6e512248319d2122f5ee77802d88466a61f5006239c5001975b00dd634377705274629f16a92f13b37049698b12c39bb1c3579d693970736fd72c8d8654943e5868c53a51324abdc57b330ed30145e92ab82c91d975244288833ff3a2d9d92aa1f53d99b11d191c99e06434196318e04087d9aabd03d7ae1cd2887cb2197ec4b09f7699861193d8eb77da9c9e33749e4a0c5bab3bb64adc4436b7a6d84b9463c4887e4642d490052093399b2cb52a73b5904920a601c327e2937ac439fcf3b78ee830b4ecb795376dd263a3cec91c6a6b60e48001a0f739e217b5b3c4ab0a676131514bb62c9fa1801bc80b6c8c7ac70110b4860cbf221543f2aa61e0683bee500f98ba4fa93c2865a28ba4820aecc3a6c7b56081869c701b1bf741152c0ca0a753a211c3562ca26a15395a630a4a92729ed9a3092d23bea5433447139ac0518f75d11af6113b8368cc72891a5de08dd7689b2592256a8ccfa524a2344921a0e887627bcf7965a1875c1ea5c255c36978da7c4f184a1cbaf24a2df142ef80c07750b87269419721c48d8014f4ec8b4ee23d95ab1ed9f8b5ee9943669007d48ac1657454afd466e8765c877a54466171b649188a7c205bc3073791b832b6a752625809919db9258ef1b7a15d2c54c6c02f57fa65751438f4186a8b576d7c561d649a7a60d1928e013df7d69f4dd7035485107a7062bf3ca84a93a5a0197ea00b7522dc769ed45596bc5e712954e1eb37ffd69d63ea2ce5e33df8088545e3a738b864bb61b916d29e45ebb39d8a7a6fb3cb3901b9880ab0547107c9073b19258e4e290156f54ae3d44d19d8abc5fb334ad757c7e24986a26a31d458edd45c69b9b8d87b0622166e66c76afc49a23e1c1abbf357b7328781aa9a054b24aa2645d691639f141981c30a7203623d550c31e2bd4bb95b2e7b518b44512dfa6a5387afd6c7ce162a434a6b9ed937cd79222134310a2420934b357e72e009ea8413a9148698240aef2732836b5659566d21111331fa9bb0b762c948247cba816e313109270eebe826ed722322f9841f33a935209e0df273f4e2237a59b27cf85fb3773998a295a37714ba074d1093b0f096b2eb5133bb273e50e17de75b45300c0c862354344336fd028a4a631da22b285d4435082667ffc21fa01b79625c019e71cd0ad86032fbaa79326630692b9d02be55315543d83c0b84297945406c339699b1093e4b188511aec19b3c9069bdb8799a2e077af4308c401982e96819c7f17f6bca98054688c30a75dacb90ad342acaa9ba227a7f6784100428cda9d6890396cc19cb90a81153bed281cbcb1036113250206b59208d8c75839b76ab8425211961967396c696f05d913598259334c742915dd183f32c5a4e957013868634459f038340aa7761ecb628fbbb435ba642e21c538b907d8710413ac10d7f0a7965b03cb8c36d39336543193d0d768bceb00af79069e7c85b09114e77e6063aca18f27376beb9ac4a0b976ce745fa7972e9fa74d0055ef490cf40e11e6cd785510bc4bc1231d88abbc9b22fc1e2577608580e26635070702fea437f8a13f6fb37343b488c1c0b2560027bda77fc6a97222319b66a86528061f21019aa73674519420bfa26ac5616efd714cd46b7b7751922175a1dcb22831609eb40b4d16107c8438f33e203cdbb85be910b78a99d766499d4541b91567fd8c7a85d983080b91c9254ce3c2a9feddb8c8ba948f0986a90d02681341fac1cd19451956432b83b79d115d32a3d4f86f902f2f6b0c95ad7f4bd49 +result: pass +ciphertext: 2c5bdd1856863d324e1ae5352968c7d4d39beb7f06ce366afa1a831eeafeec2bcb99cdaf79355b2eb34dfcbac2705f30a84ceec1c23d2c42418c888c7a76aecf36c2c924576a87fde0c4ee2754e39dd6813abcc06f24790fc34a9b80a6fcf712886f5600e0444e675b8787a9ac8b0871e00d2cdbdc031b95dffc25c3537b5a3718ffc8ee03944e46b30dd986ea6207eafab87fb4bd9890a230b26a777f62bd7bef4264c52ba5a38cbd7bd795ed352777aca856a195784f9d433ffa2549383bd60468a604c069370031f787b743e087bf0c544a1ce2be61f9d19a5f780c9c9d135ca083e6b315c693e214e5408685bcb24a17886751d1e0d5233df90d1cadb41165473b2b9e2778fd88ada34b0ea9ffb1c623090c221da8063569d8c2943a0938598486c6ae9d4e4c7cc2b0a505ff8e3a1fe057dd34419de75381cdb15d4e0ac372c92b2434b6970e5501792e632af78bcd3853a380719b7497f669f5bbc03aa2b04c624abd6f881630bd765283ebcf64d80e1500767d3d28666b407d41628c5aa47649705cd5672eac55fde509601ac6194edbac2a0a7519d01407c435391cd1518f11839a908f6276cd9252a6eb401c61cc1c2c3105736723d47390bdb74847aacb3bf7275c1c4a2383eae54d0bd38dbedba95a3dd32c1023129161164aa29049d3d898448f1bc6a64895e01271924e9d57dc804ba8ff7162f0f55b4a6f9a71fbac28f1b5cf5e269a3ae8dee58e7af29f4105a862db54325dca76509682f8ada8a427a902cb9c98f8a0fb6859142bba23007e9be5ec038b4bdca79bfdc0917b35506235348b7b1018f90e2ad5d5b3530ec9980d059b4dfa136f3dbfce5e3eda2caf6124c5db8f59dd2b505fcbf9b4a5037894a2461145468b52e7fbdeff9b1701ce67a14dec2d9df763f56be36e5d8ab4c5c4f2b37ec7fc8c7923f30799b7a4f472b1f7f8be36c312c4619196407eb2aa526d07a8871e37cf8022f54109e3cf49ed1a8ba013f16998f5823732c28cef54518ccc758c2fb3798ecf5ec0d1ea918588b6a0002f1bc8514e4b71bca70863226978716a0a5c79ade76a939b998f9582312dfc840f226fab3759f2bfa76819205149a6fd938df2cc2da48d44136e69885882f131cebb748307c837d3b24e5707d464403de00d890868a413fcc737b30d96d4a01c51e8494434ad0f4df1757fa07c4e044f3f6170db50c302cfe8664e400d59deaaa2100167009b8f55c0bf1b447bcce8a470375cd54d2a88f103a4558d4ff4dc5be27483d2425eed2fd223529187029846b0426224b895a9dd34197205b8e5be922cedd0102b03b0ae5ce282db67bc6a9c643a27d4790f9ff1ed5cac1380504bf356d08369fa115a49af41ae5425ca9d60da1ea123ca3d86805e539657a49e001ae17b7cc89ca66c71406d46c9318f4fad897f241629a81b7ca44139fd59f187824f98265f227ebb3b40e9673659e56c35a56a298ed40a68e10f5aa94599d2375b47007df883cb56a47610cceb5c99b1f97b1066c6bcfe50899c70bb8f06a030e85c42db7e18a743a2ba87e2b0f81355838e48d604ad884b469463cc4b02cc75a79677978b3e665d03d2a38cbf9f907a0d1f3674b195f46f792a9667b62a0564a6385b962f97ff0f8ecb5c38158bf68c410b00277e07671229a27e81613eb88c60f1540e615f15c2e7e14d134ec83b6d9a8e1f45d190f8dde5bf2c2681d186df1f24dd27b5019c63b2c05e4797a52d792d9ddb2bff9e4991082dccb007a269c64eecba2043c621965668266d0f1f366ce4a8a1c2315c470a5c638f3b45553bc74582e4c1036be0f1db44db4a1fcda54aa4fb8388ce2b59c9bf90abbfd76706d50a354c2ef55403ae1039e79a6298e5d542cff9aab37132fa5f8b60f5376cb976aa58f4962ad445bec45a0ffd828292eb9e92b15d47b650628beb48ceb6777807c0212ca943b6177bb42db90de28dc20d76031d5e69caf18bce7046c562b522eff42ebaefec52d139da4086ea9c8612ca1562d7fc15bfb42b62cbaa507127f0e780a3ceadacd74b2e5f23e96751e8a78539e88ecc7058ff72cd4f4670a8297877d91c8a34fde5ece933c2e5bfb002f6b7edcfe1edae249062a444247d2d24abe422277631a36666b53e8cd3446cf1388297fa61aaf0f9cc86ace67c86e47d1021b965e393b54282eda8eeee5f592b53e39fcb04e1f1fb5910f92f3046 +shared_secret: 66624ae1204f311caaaa567dedcbf695f48afa8c869b468142d05da1dccb1d66 + +# Official test vector 67, seed: "074ab1a37ba5a0403d8f68d26fb787bc2c90f5ef88f2a6d286c3e6b168abd85d393d8225618608b8eeb301d26af53bc0" +entropy: bc856afe24213e3d14c3d6f9b89223bbcfb2c890722d770fa3492c1e46d1c302 +public_key = 869a9e3773a7c7942e279471a233a05d77899c2a18f35ac98a3243fa6767f076976529b75b75b070a341dfc95bb85c4bfa1394081141fe1b1b31365e3c2302c8a0296b9769de04024da48c2d7a3e5b29ae58659384fbcb4ba2ace58c4ceca5baa5131bdd465797664276aa44e8331e2f1328aa6910f68a6a73210e575ccbbdc689199559f094bb62380f436a925a7305fdeba6c53a9193069873e724cb1b67fb8820e75c27d175bd5f5b5db020c91eda2439383b579c14da0173e1704a318a03de6691ecbc600097b41a7a9a429ca1a4d8a34dfc6c85e034e8a17629181fe7c993ab018d135a73861405186763b0f70c80d09706c9af971313e47bb917761a0e3a39f7b96702c288254675f6a07771768f3939b7bec979cbbb8bca011124f08347b7bc7c70833197b192fb26589098e48834e8fc8551a1c1fc52a1701323d98c4bbe7779b867b813a5a2a5040d8e8845d4a2b03efbcdbbb3083831b1ffaaa9e21c7a3ad77053793b1f7b7475b021e2c1ae25f194856b1594228e938a29b832930d5bad3667c854366f83b48cd3501768f086b68007ead71b2f046f630196b8237967c940d4727d388800dfebb3b152cf57b33068803c1d55c59fba14e31c323e820265c8826ec3b6018c8f60445a11268da9b44f8dcc512b860212f408d3baac60cc6ca42211d2ca3a41271f745bc46fa70a9a8a3999ca83e8635e7a4843ea3b861194bf00909e4250ad1ddb3006f86daad2b8fa720d969a7d87dc97ae214ab3769eac0261076092250133726265eb7987bd4bc01ec004e71bb8f7b06ab339ac9c0849fcb23c4bf35b11955c52d30fa0eb56dc7cbfac95704e51969ea45ab01c10e59c691dc3908c083263c3565766a34b216f55f8284f219dbc158cff247e2296c86ba69c922161ed753fdc1471834270095a85a5fabb1db91fe203113139526961bb40b41e8f913a36461ece86b37fb809779005c4312727f68923187203d001a378c0073a240190a144962bfaa89b1c384083178a1b44461926a9ed135abae505c93177f263996de9780fc573619b63f741091ed57657404644194a25b6cd1e5aab45e9021d9a8839546a9913752621bd79730685397d93ec49d86910c46a28142928a054599ba18cc3964cc4db8bb7a87543e8a53fa23a95bb5b6713478f4b0b5ca6248018a729469a3794a8ed04a315f3783e667c0cd2ac80c68a40c35d64c90e5e8a3135ca15cfea69d4a1a2e9b562dac51409c6485e026001eb1196a487606404b6519974b386abfc9cf4a0305aab4a627b6c22a994dfe46035447f0cc09d1bac0397a68fd647b0b13630d1439e63fc8fca2b01cbe66bfdb4315230b06a9797b34a57a5db208061195813073c7a10ac95b8755aa79b2033bf90386115066f177ea1421ab0267672b91830a26c20b4a8ab9011668cc46b49a2d824067102c95dc842b4f423feabbd774b4a4be351bcd8cf2c486ca70a5eb502ab5ffb8d77c2bf00fb7887fb960c089210d673679a0c71428b5ae348ff293602833b6927add5b18f22acc4ce01517c65c848680d59931175954ace9689fb6881ce17073e113cbcd53547bacb3946067a1a46cf6b4969065c98c17304d53ab5804501711c153a1b13d7cb442221ee311466469ba1225cbb312708c7b5e0055e3b476264b2244fe9590a557f088c9d4fb47a3d598a998a1b5f821d19909220a229ff020bc11143cdfaaa90e00b71d6c8b7622f24584508ab4d036792135b750eb9ae091b4baa96a27dfb1aeaf605122060e5268bc4e9c08d1bbcd451a22e44a2d6201c6de52baf940f14956aac311b5c3782e64377c645b35d210e1ae043ad6142bf6c05aab07d3915500b67989709b7477432b947239a9c7abbe747b2238ade292448836b87938e804a4029f24182941cae500d85aa7ab9556ca98c7808d90558e771d8709446bb1069541dec34b69834c857215822f773871c4401da04c70503cee82491b07e8597480b6bae6245084a4b92f9b015a158295f237a6376118868486d9c1a8389baed937b392ab840d4bf67e31df2c073a4a8c691896b6d6b623b95670cf404dd499773a54210975d1ea72667439e0fd8c112f33470789f2899a64217400e4b51fc501362ec98a45620ff6ba180a211ce5c154bb62a1904cc13a64fb6f445b48ef88ccad56919a0deed94a2ab2d4b6442a71c288753f1dc41ef5389e39497 +result: pass +ciphertext: 80b2121c5ffe5e10fbe5244fb9d79f6c1a5cc82a850a9a347e439f9e8d95b827f59c74bd2e92338b7edb992e8e1bae6872f51b0fda5e14cfcae8e789428753e97f4ade4213b9f1d88d932bd829ac8fc47952f455ec61a75f7c42334eb17bfe2e1991b3a97e3da5f3756f538e36845d7da303d1c41254c1ee9655d0eeb9f93036fa50495bb1dba1ffd7f879c095ca6c62d9a7e28a19538c1fdda0abee14156a298d8473dfd64d90813e4e760d1dccd97475719c15a973aec286a46f9c4176cf816d1495a031bd971ac9ab58591e6f1039c73835fb2cc82ea9f48f8aaac3e5efd3062d3dd1a349eaba7b792d1ae4ffe41c11a2dda1b1e66d40c38e4d960b963ec220b16b7c3e2cda012ebf1016f616c78b64098592e061b533c09e4437f41e2c9800641cb74704ba141bf656da410cb886e9a4344e3e0d7c442bc810322762d052a818677ee4003e0780fbbefb32b9d791f782485bbe0b25d0cdcdade1ca5f046f5778402fe555575d3ca829712e1d264db9ba1986460043e654ff6683a1f59676922c008dfe4903408f80f6e3604f50716f83b9b7ccd711d03a0167690eb705f8f79ea3a56ebbb0099c71e475599f490beef33da232f35ea5e7509c25c76040637d6a50110e8ece957371c4600d382372b89db1427c97d8af57c5ab9b1f2ddfd1ce7c6fdef2083996da61e00676a79cd0db2a6436939c33086f752bcb0b343551f6a29c258053b7e17ce1b09f54ec15cac7333dfda71e9b4fbcf740107e76ebd8d5207da82fa7b41d8bdc2d9a284dfb8e4c2032e7913d5703743c436535f3bd0df97f961587dce17a2403bb6bc3bac6a97c45a0e32573c81e919e0117457af4d693eaf239f0958cd9a2d44640ebe107ca0f34a6eb7703153c07b5568c143d211e9d31f1665fecae3c51269e472160a89c48af0a74123a9f743c1c0bc964bb3787646d307b1508c1cc31eb2ba4f6271c5522e81cc3442315945a94f89ed18aa5c3bbe2c552d55429cae27b946664a33d35085dcadecb1484a3e25e5bb409c8a238cd634bb03c80f66c7f539eb41513e06d2c7da5418d9ead72477117e7ef732734d6f90424a5d98a444ae95d3b09237b022a25d09b9de4c47a9a1b1ec5474a19a9e4f53a9f0c330d71651f8071f39b0e806a1dc1646ce155a0b4708076238f9e269802f707f0f5071b1a3f97bd63c9c89501612960a16fb6a2b74c183ad073c6bd59123e72608eafb1423fad10df3d3c2108de8f38cbd283c220288e34019bc96330745070a65410c523e5423eca7fe43c09edf732ec3ab8439782ff69bd27771f4e88a4c9a6447df87f222b3af22975189fe9e0741626b0b9ba7a9e81db8a4f887964fd8cd94e90d6806648140a39f2dbd76169c3fcc743ad776b50f89e9fc4a6ba71698fc35aaae3c9eb0d98de8e29efa0f4d07b59451b62600af56dd95a8e5b461e57ef5ee0ea3b32b5d8208b9c7c7e68938d86fb9e2500dfbfbec2b5f309512d4f1d145751f5ed00b73f38e9980056e6b8a6b02d4eed3b6158a61b6505086d5b1900e9b168e9dab5bcfb63a0018facd763fa6f53de39adddd9cd1a6069f0ea28ddd9d7ff2f37e6ee73d31cb7526c1435ec97eb6671f7e7908871a6570a5a8641c93cb774d87b18d435cf3eeaff0155c309286a5ef54b2a068029911820896facf98d1fee9d6880db48a3158be42f3243ea88af5df7ae3b9cfb2bde9bd6430006c8685ab59579104cd32ef74f6a57341b7bfd9bd89d4b697c496859e307a830e225c67ab66817386f617e4672f7a91039a7dce039ec5badf05d23c4f9f64744744cdd3c03832bbc99f7c19e60acabcfef41258cacd781f5979017745b10a10ba824606a10e2648ac4f97ae7af9fffb80e3801106ce9e1b264fa86e3b3294420564a65b5e02fb4a79f078a4fe4903c26cf6c9902999cd9b3a3b0667172a30d205b94998356d4ddced92c0bd2ac68afa9984c271f6446d66fc9526f064b90e9645b5b8ecfffe179e492ade63b51fb77f7d0b84ef059f077f135761c7f9c07b0a4f429812593dbb16155489a1a55be6eedd541dad3003f9e853aed5625c6124d345e71fa7330868fe85debb7a0354e81a6fd5417ffc120a9a4c757ec424b96fc6729cbaa654c89a479dd9e453c48cc16e5321441a9378dd5164ea34a34b0ba92faca01903083c0b21c46670bf25de670056792534bd0c9c7f10141f6425c4af049 +shared_secret: 187e5b0a3b6f881c8c16f777d015d1e9e80917e49f39e4a5362539b7870bce77 + +# Official test vector 68, seed: "cc0c86cc0abf86fa21899be1953913c00e7c46e6b5f730c4e88b3c034012763981d7f14459d3081638080378348856ea" +entropy: 5fc00f89563e44b24cd67d0ce684effe5731619fd08e7d72e2406eb016afb66b +public_key = 12b3141c2441f96a053ec568c7d2b7e1229fdb620d905119a05690cbc9564bc9cad3a66e05f641302a38ada62e07380ba315acb5a3af9f02aba7811726a3ac94723d6e66428ec8576718c4da712846d450cb428571b1786267487b353b37d984cadc2f51aa6fa58c48b011360c5b1989e104b99671ce2985a174aebf31cb5f803d29d93133d2ac1c9851031b21e8da4021b44b4064ad7415786022bdb27a187495908ddb6109489ca2a67dea269493986565e33941c1012e5504f4e5abe662235bca3a144c149d970ef3815079e2bbfc26066a7c8dc5591871e83731139951a262f9f7a2630c0e0fe635cff95b792a6b9d490f0ed14b125b652de35cff994ef341a15bf57978211ca4149fc389c60f915edc45610b9c5883080e96d77267268a37b4338ccca90490cac44a61f2795f943a25147a8943dc545c0805e5d39b70139bef006df10c695cab9cdde3b7c3a2afe823c709936d7c3818584abce96950c06b248b858859bc2231622426078e480074bfb011baa6b11336206425211c71b48d134b7b0b1c960c9429829ac5191f8f8aac1ed70bcfa4342a362c68a35591db506f2b69bff31033f5ca4654421f48afdd736e25d810add97f750530c443618e674a6691229c3a17f3b19e9d3740ae4a6aa6b77254b27374b246381483e52624a473035fda0eac427cf0f7244b3b8fcf4c835df23cc5b729bcb1285ac49529c1241977741ab15c2984343f5139e1219d65992ff75637fa3a486232c1069cb49269305057080b535d4a624bdbb78ac18407fa8b48caec62459b80cdac45013403adf41038fc0b97fbb3b9450e9953718cd82b4e951b3628c7c1fa39f5629dbd074548d156437253ffd92f7de9b292b00d1812cad1ea7c26a295e373bf80fa6f173b68e7149ec6a454db833d00fc462472ac51a208341a39fa8ba8f7c8243987cafc65a48eb30e729a033cd8929a746ab6eaaba19388e9246ff28355bcec0249fab0e00b722b91bdee0b8fd80377509937f201880239ce9c9251a9d3b48d455884e98acd948f0aea095155b360620f29a279116ba08a5b5ccd6c86e0e57f4b33c5787c38b7f0b924d71d7c06c58f932d7c68422085c8e365c6787b8069d21f0fa5a414d44267b40a5f629b6cf82de5588b7e828868c5b6ab9438af030983c7c37c1032be605936002558e161ba0bb2b1b4c6b1fb5fec029ec389a375d563dde64eaf7b95e4a05e2cb7b1a4809e4e98893fbb2d79aacf0e7a0718a322ed8296323681ea398981512d04f56ad2bc10667187b2ecae2e9aa5e2922fdff22eb9651c37c75f6ca87aed6213e0048e36984e2b9b6936d61318da6b7db7c8b1538754b997dd325052c21d22328f03d5774e711a51ac6d3c333f0a529c1568840bc92ad42603b4a361197b36681722d45b497cd94f73d90fd48570b445c4b166a02c5a3c5928bff91545053166f0fca5f7b2229232a301484ddb25854d522f546c477f43072814668a734786b6810770b227487a21abaf17e79dfc365c3843363ec53af3686cce7429104740a327ce441bb8e3736af22448016b8e69784d3a2c92e0f1787e818139e19e95e2a9db2b62164221d9b77ab2ca91dc221ba5533322aa772459c6c5763f24a07c5b715197a20c7357cdbcc18840aa7af18c4684e275cb3220010386095259c4fa71f94662133622a2945d8cc6572b2311a7fc0e1091ce19d8c5d7913acc490e6c1751d5aa3e5c7218ebcaba43a8c0f6d78897c15a20a87a891bc2ca94779525499a2958a60b4878db537d9b148c01b7c2a642fedc0624e594cc318a0fcb52960526af556198fa028604a9f0181be16399edb84b38405e33b43c13d83e54483418467a57f8a796b4032d37a744fa6200b0aae04899c6865a66923eb173906b26c33231a90044c9c4d5215117ca1d50cbae1120471c0462eb1247f07a2197680856428ba494dc721bdb3760c1a97d2e59735bea6064650f55212117659380052550fa311599923dec097cb28d601cc4a117269822a2bb589ad165a8587893bec2b0e22030dd8736d387673a67151b249c49e7abf96960f5394fb255be8cd9927152211613c5242a45e87028745626de709542338e131678b871955582014f1074e2f8be14a634ae5c40dad64b78352febcb21bd987d7632c16e03261c4771bed2bac280f77da45501c2ef4d97f2faf650309211985bbee4c3a85865 +result: pass +ciphertext: 7b73df5d74dc99937afc0d6f6a0ef62e563a69bbcea3a3fa5ef58518bd06c122995eb5c937494315af7b67c3630f29fecc06a73c54b951e159efe8d72118352879a6127f2a640c4ada847db224771e3cc45bb9516bc72a09102cd800ff110e6eb37e14f7a15a51d9362bb543dc8e783ed874198a312f9894ea60d707d0e9ad04727471f40a9c19bc4b9197d48d6663feb7b2cd9eed42eef4490961e6d90aef914bd5f48b449f4519659e12c4407ab61544da3d063271e4b1674e3f145aec8a9ccae7b458b05c3d53e0f99e8f138a3387459df53289cdf5dadaa3a3dd2ff6f190648fc43bbcc1fad38a6eaa013b7b09ad69d0c73188522ba07ed82e8a34ca49a04d056f484155e2850c978f8a5e4f026ffa7aaf387d1c14a489acdff0bf348c1116fab4411f2b0af7642f88e64778644411d218c31b55503bb9f3645ce3f6b213624a3a8e646e157edfdc2e30a764f71b8c23fd95330805d4b2ac13691dfe436fa58c3d3bd05765f2b501b9ca82d50c58ecaa1f0ef930b20919eb1b00ee2eed99ef61c85d22cf2f72324e50655efbad70a87a8c8208239da0151406f93d39ecf642f0ac388f6e7638642803883f8acbae1f54ce221675a4efc9f3a35df05488fb1def243bad65057646a5e5827fdcac36bae4ca16f66fd4a3130dfc358a8d07468a6b9843b56a02d9af6befc9fd0ce94f3db71769bfe19a3a0066519f967fa786bd397b33d3e930d464ad4a1034cee019fb86bc268e91c9d8c97bacf53940d906bd641b2b67e0de90452052bd0390c45a565fddd931deb1723edc2e1a486e32cc51a8442e8c027892c1e7f6fe6eb9757a1aad7daeee6a7cb834258d2f4453e367db1a4fc9d1eae40a24b97e8b29edf5aafa7ba86f4cf8ab25dbc32d8287cadf895ca3ee539cfecc09ca4cd8116cb6c0cfb62a6d9693e6c2bcde497129213bf13efc82b0ea9aff794e18409bfe09b7487083cef1e33a59054414dbc4e72d264f390fc945d3a54e926763dc866bc92b77a6fdd82a285e69c63cf4f634b6d4f97d088d3f7a8e53cdd8b8bdf21acdc23adae7feb36b3f14a638fa5b4c1289718172d11b5e8400549929fbf1dcd7c5d413111c4dc4857110a5e051d7c6250e2036b49583322e99edf2d9276fc4447a9581923a086a59e4ef59aef1d480117ab5fa76330797192ef0f281f3c0a80d1218ad485d68d5d36724418ca7d50a6c4936b692790884bebc9e1531af6e3eb74dadf702b31d54ee524bf50407fe425dd05fda0a4e9fb2ce40ecdc326688e5c77de894377868bd4c2e2139b474e37f2c81d5cb114aa7a011f4245c6db4ce78c723f24969c0dcfb8994185663fb1d2e48e337706a2194ea212e0e1ba32c8dffefcb10b4658167dfa163d4ed8eba694c7491d4640dc7dacdf23de8f7c7338616bd684f1e514308a1812e04e9568e857f3204170e67f105f0abf43459e9d07c1a0360031b7fdd3cf03e75a358453154e29f211f445b202de15e190801a1cd4a56e7f3c52d26423d1d92fbcb486d6580d8d2ebd0a3065d2b5c343247384804009768aae6be410ba31d0189c9490f738756eb4281b205ab8bb376a53b72c425492b71ef5bc181d79b540cbc3c6337e4b8705c3063e1ea4d326f14c22b4ac67e8f00d11702d02ce1f30045453af30efc07f53c13de8d1cc0197770e094bf8baaa637fdc544850b870d1bcedd4c56b88fd8e1dae9197a14665eaeb97e11025a21fd21e6c40ee5bfb3f6da5f6acd5b2b2e47e78fdd7c777a1538647a96896ca51c0f1dfe06d3e5f293ee25a289291b664736160d9d925f5d45073f4e6bdb39f891d07589d129fb7b6c77113aa3d3161d45f6bdbefdf494a8be0e03c4ab518ea334941ca62d4babe3f5c79c814c1abde6366154f1e82ddaae9dc970daf395bfb416f6b8e33b0a85d131ec429070737b1936121059cad2644c5d759ee1d1b646d53993d7381b84af391145e86084b1bda89b0c71171b8ebb3f2ceda08782f8a2dcca9176e651dc182f1d888cc196eb45b2e664d88a3562df9a0ebc24826de5b7bf674139c961af36a05aa71baf645aa353d439ddc81f4d18504f711a1be110c3ec4f134ee17cfeb3d60f85987c37e966f887cbb3dcb914070e1424e9232920cfcd48360c217416d9680a9e3c6f1009302fbdd7f49e12451da74794e80c623c5467b6625c474646e2c13d1539cd8d156f4852aa6b60f027922e3e +shared_secret: 3c4902f19d2eed8fb7470fabe5171d9f4530208c50521e6df3e8c568f8a24f57 + +# Official test vector 69, seed: "6d5a7cc326ecf3983c4e7683f45263a37f692f3bcd2d920e1fd9584350119e74f9a3f905f70d3e20318c1413de2a0dea" +entropy: ea22a76065db4b565ee1807fbd813b43bde72b0e08407fb867c6a18995025e50 +public_key = 5cd35cd8f09ec13054176c506d02a7258a84eb685d14c3352f0b0051757c30d4184ab6a37bb6058c4451e89106ad2c259bc6791de49ed9dc0bf62bab1201429035c8716b864552a26b0549b1832a2bb01cc8f8cb55630618a525f885cb6fb407f042610681428031399e5666d56a9656e1a530460ab4178c3e957d22244b1366750da084f572399a33bb452c7c73f3cbe9a7028cf3849b475606ea2c96958dbef17aa08b3f15c146edb65de9379f62c11226f9b4b85802694614eb229c8ed44198542685610f53885f5bbabdd95c5597f89d825b0f441b21aa476ba4970be900a2f40cb742402c2093803f27ca37d06347615131b81fe6ac6ac9249459c92d92133870111aa5176c6bb828a4198c865a1730a84961f3914379bbfbeb46411c1705bc86f8a38a5f817f1b4c34e99784773051764b3f55d38571e98d744043287a19dddba7d4eac3f0b98173d09f0cd10b22a0bc0417a056c66064c906b7559ab134b6c47baa7932540070811d3ab8f5f265822873b4c78af45514ffdb6d03d79c24a88531d4ae7230486977b612cb05b906ce19337ca1f0455718569e80c2c2c795b7a156e60c5c65fa19fdfb5e4fd96727947fd66abd94774a5bc45fda822146a12b67534ad93aabae123af9cba2b2a376608cc6335aaa99f759dc964aedd80e432c6f417a1a65c63f639b5312c35038faa9c45051ba31c66912538fb51a85189d846b799d8c2fedc439ec8685b547376be49a83fb60281accd733001d729e4156badffb3b7dd8cb40411ee7a3970a168357a89dcb75535ce341b5b47403308bd87bba01f5cef30634c9d27d56da4d4373234790acbfb5051ca2a8519a42e610269b4b32c64770a5db4caa1ca6670c432bd74745fbba2f22377c729446954a6e067454639c3771aeb626871e3558a0f141a37c2732b13b13532cd16462f7822ba2869a0b20717e3675a328625da796e12c4403d380cdb54930db78493994c0793fd67b0a91140758fb78d229051e696c8707cf5a1c40ef511123b7c6de51ba4b792eda810762cc114f716c66a79dd4f5b0865a1a2a1144da80c4106b72aabb0a8f8036bde19b204992dc600956ab076ccab601f4250ac4b2cef77c38d6b6ef8907feec307ab29502b269dbc063e337ad43958d893a36318c6c052549bd907313c2251744ad02c30f78d0b394635508951856d1160706cb042275ba20a4bb6a734f9856aeba164af669f43c5016f1305e8084389581bc146168c0914d1a65ae5188e19082d585af435c183df28179c6b2278491dde450e7b1bf64075e0a9a8301454b5e111e39b0cced002680e173c5db96de082c3c399e398210c974b6f47449dc9326c1a7a79f893f454834e6ec1bcf0a860d962a4e05a1f51825981b18dc4ab661abcc98d4313cb40baa402307895460139c75b6aa69e27c5e69273141487b849a42996a55788b3b42018da0ab1c315d10308f05c54176d727a04b656ce6859f69471a186a4ff6b17b877070924758c83dc681292bfc7618f2b75413c79eb9b945d1b2aef95a47cb21cc8982f405739c9064975b5ab875ae5ddac05a65a43cec4ed80acfeb15aae898b995e649f32b98613c77fb926879ec940bacbca0696cf6c6749604a1a59979a623477be871a2278d22134a95ecc1b116c48340c6c6981adbe742ede1426bb65b942302162b8164352f918679d53c06beab47f07c8a37aab0a7449d45e01cfdf9422a783e06f645353cb56b8c57e28840e074629bd58b5646cf1c96003181b915a71caa00a35fb4533df22b2367c9bef95ecc85359a236e23a425f9c975ef842ee20228c66673f1ea3be278b0fd43ad4c004655532654598f34a257bc7c81dc0999266c8c2f40a4d9364f602bac27145b5be7c4fb0759288761ccc586b9039d6ee57858a21a05676edb52c937f11c35fc091d3baefccc15bb953bf5c50b95b449b8db449810680fcc53169bc8403bc70a5b2e3dea7af89aa0fd662255197360b8c7325545b7f45f2dfcce05d939ee5556f5c63cef52cd68e8399ec25726a316269374eb94bc3884011c89890e828b5c726d149cc3446b8a12d76c35545eecc7aaaff17030a0cf9c993e53a88ca000116c2b206f0187f725acc696112b5c44976a22ab617a0c42a64d03b8ce88b7a8aa7cdba28a197a5d3bdc64cf089f922345dae5a7c6bd86d17444f21dd9b1a5c82b9fc906c4ad49e0 +result: pass +ciphertext: 1db1afa16d8fb4e47ce58533e1022da2bc47db14d7c6e7afc7865fde201719c50f722cd79c2b0da234e075a3211009efb905d45fed0a83548746a9ee3159052015761baf021f52f9f9aa19f495db0dbedc911d357130420a5ea04516edc2ab8406be562181944b816458e815e0958653fecedd6a19193098c301a74352fc2de472ba7be44a513807096f7a0c42be557bf3f831d628ce208f33d5c797da2166c95c88ddeb42c7d78ecc54f0088f9e76f1721a4d7d088dc3b5bfdf8e39febfaa0e32c4fd4215c4816731bb515a96e6498846fdb6d58470a0148196ee81d3b7c8fe01f6b0ed7a20fc3f0910eae4656ac421448aa488a52c06b1385d4d1d73389e724d05720bf3cf5c7b863a0791b864b8d978f5fce0403263d73889aa0aa476d8a760d31494ee6a69bfec705b30a5bdbfa3dd74cce40c0ecaab83db1eb7172ae07689db456c33902175940c66c18ea93eb7ba50948cc27ec47100fd60404302d607b6d1a9374ffcd6cc8cd449455baf194cc71888463ea98ab3aa855546696c4d0b38c3058e97018cb27a7269d95c3835742de93d05fff40596a60c1408018d8d59d41c8295260ce51b09ed49ac79ba2115582309ffbe504e4ad56fcdedd57e544a0ba8e09638fc8da99948ea71d6cc75e2f03ff766b03c768c50cba64d8a3bd961161fa3466d5cefac84e7fd9157fa37a0920fc411bcaf0ff85eff2542556d02945b71198ec612908c02b14f9fa4905e1270dc709fec98841a5b3cb0a5b0108e2fcc0ee90403429110440f06ca40da8869ea802145f1cc2588b8d7f2cad465c3384ddaf4e0b7ceafab3b30e1d70d9eb812902562b360f33cf80546e1105f2bdd6496986324eff2c11f2e1ea54c66d1a082a8c19f705df7ddbe69f9cfa95431a5706850fd9a5a395571839ed73e2c19afadb4deef4dcbca3a75a63c83b22dc81466b09e4a4ac71c59bd69a6123f1a082e536bf1accc1afa6655e4cfe66e9a990e1a5b96a52b315fc08398b9958dd5965d5dfb4abafb3c63a7ce553c372d5c97e59aca1a6fe330db286ad684fe42c4a56d5729cd6b68b6b60bc924588f3cd09d95dd504773f61ebef4964199d183cfc04dd580132e1620b7a412a6e210074aaabc788381e98a9ff5f662bcf9214903681e255173c8db36a16388186456142fb49010978a984216a1d0f9afbe810cf811b01ab3784acf9ed2cb47452613ec2b154875de5af387c0ba3ccb0d725a0ccf2ef470f670d96bce6a5154a3cb7e78d786eb8a01bf066dc2f98c190273db023035ba3fa9217d366a6c5b421920e61ea44781715237b561f08471a2b98b58c4f0f45e30211a132006d089417f5272fd571de7520ce852e76f367ed4262e93b26e905ad8c21b92017dbf2bafa11b1a5fe15ed1162ab3392c23a930883ab50273aefea408dda64580f3665127f08b468bfbbcf702a0724b85f4a3242c13a16c15917f57a50fb63e0864975c0b10bd6e53e26cbd089fa7ad92172c2c03abc151c7a62a342963debf3ff960ba2beb2ca796135f3c54ab8441e823eb884360ea6ca9f81977b86be07feae2afc34c422c8c0aa76229d1ba7dea4ffae74149f9af18efe2cec31618abce5cb9ecba8243c7c116952d2439a3766f83ece57cb8f069fd5523b4bff071e844b7c3e0dad013dafb16575498d86663b2c8d8adb379eaf259c1c39953ed4b6b3a13e7e92db9a57a330e0628633040fbf324c1a86aa1e6bc9ffcc2a1b76e42fd71ca475997d16d385f02a860a001afac2e1ecb6d932a80e157704d6df6f3b3e9774132f9649ef81e4970e69b5bbfe8519d1afe7fdd03dd5d59646d88c3674221d1d2959b5806bde1339e88ecd181411b6776e1c2a8fc4055843232c9fbba7f26de53c163c6438e31ca5184e075510774b933f111f74a7931f95cda817c2c4575065d109263d24e9ab56941ca9ef136143e7f46f33b35c486efb2ef8d915544b8dd83b3a5dce577fa578fc90d7d01b6bd50f1a49bd245ebc3f062590be903b7a421610539cb53c8154e09eb4e26b6490f31efa406657ae5f37452d822acdea9040db94a1e20adc2f2e6ef68ba390cedca1d3df89556c6f4460528e04ed2cb4436312c50a428f096de7218633a8b1921924c96d64c32a841dd894da56302b56cfc00a7da32be9b28b94d7aac13a00c04c98cc440d449611fa0bff1d43d9281a52bf230d63ca2bb14dd5dd1d8646e66 +shared_secret: 2a9393a6e60be8ac438b247fd72c75c1f547dcae83c7ba7e791176523f4e5eb7 + +# Official test vector 70, seed: "f68fc0314dea88f66afaa76e6c9b6804b13d4876924410d1f526fac59a62e26c560b125b1d0f8b461f1fc2e351effb4f" +entropy: e9602b34fe73ad57f4bf6ead99743d645641553a5b9b9bf2e7016629e3e9bd76 +public_key = 66834aa6b266f0964efa45c0469249c3fc0faeeb19d1508cb7c409b49a7e38299920c3433da3929b2552d5e9a1f092383e3b4d3d8a16ffd199f7d933eaa506062697c29b1fbf10292a4758d26ab61f085c31a0a3b85a19e956860f93a3ece8a0c22426b40bc8d0c1191754803d0204ff048c07f6c778fc685b2108b0327dba9361b00c071c8223aef0949ddb804075c3a0178f41bca68b676ec8469e417547617c8b8ebb6e19e83af1ba27e2db7d08e11f25805f959285add216c25a029684160a880fd2dc5753709ea3d81a59a91357205cf126c24f8858a3757be1c562c65166a0800047949c062bca79e03836d05aa6a91a30856a367b087b455169a7c3591091e72c96b7432397b6a257723508661349265c4c475ee7251e4cc26d739b33190cbb07a993e5b72288a55d5792cdd2c9177c9541f0a70bf066135e06a3ff1700af24247aa61e70f4727e6a9fdad70c470b671ca31a21d236bcfc508a833714182198c4c41bd1aee23b5acc9720a3e955adb119e9e06fb6c8a7ba5a37bea21565f77f7f037f0ad71d6ad13301a547fe8458c8363feb218a3ed5bf594c3bdc7a03003641da15479304810b5a0c949417b9a8473f76ae6c13144d7b3673074703da0389e82ad34165f0c258457367b5521128ec318df886eaa203e259bca111b68e13ae684b1f1b3781d8305193e094c20b1e91b473ac9992d1e77db85023cd043b147681fc9c2c9c2c1237c27f1e459b953ca0711a318a4b76d924baebf599d9eb852dca1dc5f80191b91281f8345d774a29053513f159164a705c954e53ea26b6927dc57a0fae5a19bd33bd67339e8eb925576a2eabda6b0a4743abe05545e080d5495402eb0629859671e130cd048235f254fff49a7d394f3b1c3de06a7847473119e218cf0944609958300b93046869c026cd93e21925a30da0389e24ba6f08d498748730e2b40d1c73452de8b7570027579c11a7417f2bbc67122c9286d1219d7230ee5b0c42d724d1b1cd4b031500958dc7124177a25651781657904fd1267f2bb69d5c929f8967cf216924d63696627c917f82bd2813563cc443705b0a1b279eab237326b4ce45504ec710ab95d01ad812559b2b8be763c1e9c55449a1366fa2cdb6d0106856b080a16d7e3700b0771a422423c806c62614b047820ad6876d7740b35fd674d99605fc61638d863ce5cc6a55d62f83a4a68aac10ac065657870b5c623970db1a40773500757178f29d54548aefe92eac306fa8f926e5f84b15f339f4fc388a554b79d87325c81f9e9989c690920f018fd4440afca405b1b667e489568121178cb7a18ee2c38e10ad4f5a09df64a76c0badfd08627861144f8a449df4089a08c48cf1b110b443d16386042b6f24730c921643a6f8b7aedb9a7036339f1b156c1c4de7f4a03acb57b1cca827146f4bbc30f17a32ded42949ca5340b0494cd29098260a87bc7b50440ded82befaa1a6c4c28bcebcbb16990978ea92a3709b817996f51a6e080578f2d060b924c5d9b93098725eea946ceb84a0a884c7fad252bfda7aaf374e5ff8703941a8483493a5143e0f9b6f5ef45f683c2ea2c4b5e8b92a46984064b97e28d339789a8654e27e38c84ed7e4cb204412a434bac227197528c6c6e1625dab98c25557e16cb5b8249ebc11caade0b5fb505527d45981864d4abc8e1060cd9a7467465064c9b8cce823b6bdb9c702a7a30415b4fc6979d2476b4511909c90559f70597375c050189ff2932852a51e74a21b32c834c734052c61137025c20708263e0aa71d87b20263bace0c0c98a58cdfca4889672e6b654c003a7e22465f97021ac7c11fc4d1c0525ccab768c6dbd124c8c533f49ba88629c71fd1cb6ebc4aaf09ab6db011348b2b0691bcf8eb1bea9588b640cf3fe97e35e92440284cc9607d49a3891283ac96c32a2a223d1c372b509b1d9401ba6bb13ebd5ccb6c44ba12e392b4d165c4940a714359ce122f6b34bc1344af802992c6fa2d85f1957045bdbda400b526b21bca1a0ce181531c8bc644799ee8477af16fbbfc33879868135a5adc748f88799d23476aab0643e5dab979f3658cb1cf19292ac6f30a486353275cae5fb941b2d49a0d0349e65917b4f4cddb9a976f322d8917b70278ab9cb16ef193cc33b312e1689170532f31b001350225180493d7966e2b216c709ac1bea73f1c624a081620b7981c1c95ae0387aea62f +result: pass +ciphertext: 9014923a6bb3766cc008194257fdb5ef86a601ee1bef6189bad5f73394a590a44fdee7b3792b124f19ad9d5d468d9cde7defd8a741b25a84d9e2fdf4746fd47a7c6ef65e14adb90d0ee45bb269fd513c0326bcddccf1c785eb2b87ffcf12fe00172bc0346a1c19b8522feca6dd95e19f71d8dff6ebadc5eee0b40a74543937b7475874bd327237f6c2021b86e4da652bc6a9312b184ee80ae92a9e5758d2017376352c3cf3e60beeb18b2fa25798b13e88907bff06ac2e43562fe3bf658f0a48f39ecafc5f74265d61835c79d89793841d435ba1deba46d46bdbe95f24b539b0c860796f8b8537c8755e480b3bc14a0fae4928946607371b79ee10a19b49cd7ce8a34179bcc6d3c526c34db107dc24a29fbbd93900abeae40ec107fe3de3289b748794469d375e4f0f2e3546c40c73b4d4f7846fa37caf3d6afa1b0f6eee1b358aaedab8f41c1b74eb5d77bce45f2f3b70eaf15e95b49681569e5d29de8ff9a7afe7ac65916cff80b26aac57d8d88864c35a12ad1572a4f17c6c58304c4b4fce4fb37e51504f6fe2505fb142c7bf6c5b7837459c3ff55225736a263fc5e49dbbfd552efd7208d8f65e8ed58b48d9db43dcc13117bd2f80be9c78ee4162c0dceb49a974975aa0c978d40f2882a1f547ece2450cf69ec2d31dbf271b2606b45d2fb7ebaf324a7e37a57c122f3c397b0ab84ff860b1f8641ca5a957d3446b56ac074832b382cc8189a5d49c9a53a3161a8eeef4f275f290133bf6a3b401df3760fbc5c23c94678b3a552dd95a4b5e45d5a7c657e0e27d30d5bc3bd5e8b78025040d5314aaf1c18a27cfcb9fd19ab5bfa906659aa8550bd26c242d9f5af54a4605e4178689a9405f3a03f15715e0c4e8a9d0b69b7a005469b0707906ca70dcf9d2792aa22aa4a063d87f7d1dc69218c5553cbc0a2204e81b97541039bd834be57580d5938f7c5e170eea127cc10bfbaac51ff8fa2394bf36ae934c92f0869129a876c8a6ea5e8b1173885d6a632f7bf9a0864d8adc1cac3c39fc2ba3bbdac80b608c2d617ed136db694bd951656bc7899e94d69719bba791d028144d857c01aa8701b50c53bdd47a0ceceb58ca6a019b09755190f47466a10a95389b9799c3baf1a55e51e7ab7b070359abb607919899c84ec4c636d242cf3d86cbe8dc76488b6852d5e9695cf03bad089456848080a929ad490ebfc551c43c6294e956f15fb2737fc1cf90b3ee67c38b9b6b651f651adce59de4434bec6d805c7c2efc36fcaca87015d9e9f994de4a1e708dc028cffd7b512091e8cfe2d97b858fc30f077dbc8dee63595e9175d3bf37979587f29256cae0c84469e4c7db00ba7c61b09dbbb512a42935ca55ad40ccd0259a6400eead12d9734632bf78eaeaf9501a77ace2a6f45f247d3a30a80e95049705adeb482a884444a22772c535a19c3ef50c9d3040d47131112c2f71d25827f691e410cca40ed6ad581f8ab0e9cb7b78f95044cffb2d8bf43166b31caf0d4d5902a51239d13bf6d5be5dead1f4c62cc0f5fbb56d1131a73551d7cdbf930daa82c9df3e35cfb5a7dbe738ca215911e0f1229c22e07fdc1037148a478e537d490390a593fbdd921de127fb033b1631a52ac9a54ac072d49cfedc0bb1370d0101ad40cd98f4d1b2530d2f12b98b39fe5ff96ca58024902fb26aba400bbf32983e15ec43f1194d79292839034e161c7ea3c81c9b53e112d035c8c6321ba150308cbc934470fa625802992cbf5d2246da7af70b9e371ce112fc984052ba2fbe1be8884fa85692f343c5be53bc472a9a18c899b157b32bfddbd42f761fea66708ebc3481ec5afb6c7938bf4e3a3c8b6fff32475391193103c53015880b5c0232fffc8d605402240a48653f84a54bd6c0d366455f012d6ee2f0c3519632bb5a4f577668d1eb97d92787a26f86bca10a1eaa55f9e7c6c2a4981c0f7cfa4702fe1f72e4fe112ae248425bdb28d919d5c97ccb84007528d527135255dd8cd5f230d35e137fafcb10f26e2a8c57b941aa32b63796ce2eaa9e0180b6746dc3c1272a855a101026704dc55e8adc870ffb6c7fbc3f41120fa2e7be78c5f46b72a03eb5077a43f3b7811230b5fbf43753ed2d08052414826a715b08189b311850064da249f7bcdd9a179b946d391e6769fb44b7d32f2b44da31b557bfe940ecc1d9eb99a9c083085b62fbcdb4d5e0695f1d1c177acc57d86b68f1aa0ca5dd +shared_secret: 2d5b67aa0cf3c22c0cb58a11b2cbaeef150878a908f8d627457966ad96f2361a + +# Official test vector 71, seed: "a229218b0d51f58d915df549901548fb0722f352c7470900e7e4d8399205764a319bbddbd06c00e8c5932722ee5a404d" +entropy: f72b9080a6c051bbdb9b0abc1949034be0f89a9f73fe277ec4d4740c78d04a83 +public_key = 14830be3ea225e8161039550c3c320e6c57220e076224aa8fd48b4db59a30f71b2a2fbbeb05b3885819b672c48393c5fe1865a4c113b736505c1199b807c5e7669b7d2499931d899b21b8c1d9caa129761bfa3974c4a85677a0ea1a49c4ee022cf3048012a3b108b4380f10ad2c327a009717a64704a62cb31446c5c810a5a9928e1e4564f95b027ac251c464569344f0086106f7a4dfac13eb194abbd64a8e7db2352cc07ef52195de869bda087cf838fb42862f6346754f1744de8a414464ecaaa921bf76a4ee344e3055ce0fac32c15bc9ff3019c7b9205737426cc29239721ecf65ddc241f33dac59dba06db577514891f70d020f5b240b03493aba381f6716a16646a8a8343efc41394a90cfc896dc04c4fba8aad7cd66005e426a3113dd1a4be4a661eac59cc2742a229c6bab9ba26cfa9194ab41674e89a410bc7e8a25bc410bf95738f8420c64de5715ae624368322ec4a513647ca86a231e76b62e52753c939308f8460a7650a28d258b24c4662793e2ad4454b5756e1692c6e6822a8dbc070ea81f4a85d6a2a852c452235f63816a08d957cbab030c33b5535c87c5e7851c55503898f21138b61558b38b04ce78527658082308117978bca146f8f338c4b4b623177a0b1a51b5f134ba58c19b4db69182807f3bcb29838a0729cc2d34200379cba1f751b6764c27d471fcf7a0b3f9a404fd3bf98150150b540d79b1df00038ce770424838f58e10aecc304f29a9103177752520ae3d967ba33ac2526c85d9a7aee03845b911f9c0a516f10a06a018af24319385a81c153653fa81808a6bd74680f684a52b8a72ba5288b6e75bca97a0304f2c3d8e940dba7239869bf68c951ed8884dd32cdb254755098cef7abaadec1a47a7a0fa646b1ae78af8c608ee7535bc43371bf1206c8680634174426e062ad9c28f4474a01b6785df35df57014c3e8858c2a2ed9d911cda8303c318bbdb13370b07bad82acbad0bf04c3ad2c491328a20790c39292629152dc0e6a29199251b5bdc956a2c4272a4b894a87359a11803a8b67e236837d25a274c97eebb6a8a9e7ce73cca9dc91a1129236730786de0a22286b71afea28e01abdf69cbf460ba2d7d69143895630f526c5f2c6fe9a289a3a058d84b64228389c94984644bca5fa1f61004a3edcb94557093345991bcb9bdea45915a5bb95618f4d62cce22717a67c60042856fe8ab437066aaa733567694dcbd301307b4eb02cce11124bcde6a79819b95ea621f1b11492315e60f774bc5b207f42c178708b28a18c9883561cd66daf17bc0bc42e0050b2a8157354f7945828a488a941363b3393a1112c691e123c6b5699a5c945038b6b2dd6725e7e619bebf1c34c7c32245461d32525c5f49a763944cb64581cea3a178146dc759c29c995ca0793df62cb2153859a32905e785e8e6ba2b834918f2c2dc5cab10f8b95867467adc87111d7beaf69099400aa4e908fe0a299e8901ef5f9346fb07ba287235087a1aef51bc8933823d22b8a02c1fffa56ea5b1dfb143ec1426f32959a4103b9e343108c87aad2fc0bfc7384c0101afcb4740f01b57b483c0300baba66543adca822b4381e99870727a75c491a1129af47d768e4f59fdf05c6f491aaa5dc11b9ac7e20e541aaea11b6ec8b27e94189dc1be939cebfda109cd53f38fcbbee7aad3c65a3c51aa3970ccb31695bbfba3e3b10cdd0d37d848309ebeb3ed8601ca2d1479f3aa0f2766d24b0b0feb01d34bc5627ea8dcbd935a2303bd6aa6d01e7605d23217b98b2ce8564ce077032abc35aa6afa046254d9a63be6c4bdebb95e0020ab5fb89aa5b01238047a3c183188bcec1158c0cf901636b3a459a223a73986afb886787cf93a8aabcd9af1e4cc585cac6f6f424131a9e01fb49bfb38ea664ad31dc16b2dc3c701753a2870cf9c27114262167763902b58b2f03bd906aad3b0101b7898e2663bd458b5c4bb7c5f49c28fffb97bb4393ba3aada4c023e25427dd5016b089591277b13dd0c26ae3ccb06c088fac04b475477ddc1be06620cf3754548a6b2a551aa1b97df5faa296c6a6ecd052cda5903533c93445778755876136c193fb0e3c937bf71ab2968a25e8d1c9e49a9962ba0c78951f64882c826016f63b97e6f8ba0242a45d69276fe0ce06f14be7535859c87a9875904870890c5a620d8632f30f55d3cae33d1c6f5896e6b12354a75c7894d8905403 +result: pass +ciphertext: 0187e1b558e87cf7a8b1a050fac3953c8d3038758f8e909e57c479f1f52cff138a78e583ebc02aab45781641aedb6786e7daa2693fefa5a39cff0a2b5359e4c09fcb167e64736752bc3f30a9249ad439689d11dd325232ca64af152f16abf8f821d144d97ab82df93bf348c86ac75f28f00e7b259494dc4efa7b125782bbd9b88583248e49849c08854e08ad05cbdbd6cbd911bc3482dc234a6ae89f9d7b5cfc9ccc8b0c3b2f38b7ae14c067d4e0f45e0f531a26cd2f49c6ea2596cb1a7b148df8ab01b0a60e4150d41ccb9aee48cc05ade595033682b29b6156d1819f8419fea16efe54c1f742bc2848d4351f7012d52a064d5ddafb007bc36a37d1de88f6e7a19a3f293f9b18f4dbad2604cc77dfbcf26f409535497bc0f9e05c830d1ac52f43740554008f032126e8464cacbf305d482a00ebbd737ea201cdcdcce295199150082c3964682584d3ec1da02f9462b84f36f88e81b93df3bb13419da7eb30a60920899caab1153f888941d88ab042d99c4c7accc20593b95634becd3124aae533c258f7b466867d7401595533dcdb941a73a72aba52abc9f614e6361381b8b39c3028cf8d65e518e7e098d4afa39384db1ca6aebbdfc4ace6f88649ab1d91ab0418cf5df4f93ddaecd76448528b2ab715633af9c8563b9f01955c0e86fdffa0132b62af9cb6adfc47f804cc66ec62562c51bb62203326cf812299c4d0818ed5eeadaf737c354164da0972a34cd35fc891d81603ee4698bbb7b87a6083ba2bcc6a52a574a5fc909d6bf3967ca3860e2f6e589201fc874e246052cae6e9d6cf9348231f7f30415a2703ad119758aa8a7d6a88b3ac897b25f7216dae443808ca1d76857f7faff60ca0d0855703f3726efbf91cfff5bbf11019f43ca3efb3851d324dd5b344ec0a7307b02ff76b92f8497a5e86ae94bf89f0956cd7ad30cd2a58f37af5452f356f53aa606c7c6ec7da7562e995ce3f9bf9e76c7f957085766eaff21ed335180c5e0c01c05b011ab76f2474234305038f7e6761b82ec6bbf19eb19127c01f1ff1a1772867350838eb666eb39ec6221488e7bc2dd3350e57a842aef984e7d00390d056962908fa2d3ed3555cafb639e5538dc0bfe712dc75e8f19a54d3c96866f0b40aaf200daddea384e4f736d41a7488121ec88b3d3e17768c5c1c1e089fb4c61c2da5bdbbf04e341567689b6162015d4203b221a0c32b336753dc49b7cbd2d61c2f044ec6b911c8f5adcd6c4ce68949d3c16a81371c5bfefb8e75654963cf2cd5b65ca9a08426102df9f8bd9c95a3bd0994f29c92bf978d82cbb6e7457967d4753f88522560fd64cecd04dbe4cf1a1b89cee7a34be93fb89dead659d73c881aeafd709da98fff4d5b7834b2a76d7943664fbc5c9641e11884d89b66b6c54015a8b2bd883d7c65f83d219e658b20f1321c95de44ff46bdc8aa6ca0a33bcb79841384673d5cd0a2cdd77d46121512c1b22f0f42d87481b8877fab7d26d2231631c69c4d296274527c5072069173ec72017f8c9ce6a83f944b64e9b1b55d2b714926f71e7e7795c5665c6b931e72044bf2c070df1ec4b42c530ee5e8b8a8b5323a82ea79f7d6f301a0babbf9a69542008ad7731fb985e5b8148275c92969a8a543945ce880cd22141ed171bb00ea3b396040664451e14833b894e4ee1c301bbca9540c3658b15a60da505f6f1fa625ce7107352247fa70bebc22eed0a0e073c70479ec126c6d1b7479a5d2e5159a25548448ca3edaf620f4d6fde071fb77621ac03196138e212b0c161daec7f12ba17fe5a57e6edf4ac4e2a8e491cef82f86f0437ba48289871684d354577e391743267722540e1bfea234b0caf5af9f4a3947dc8deb2d4d6b64b68f54adc2c06ba24046f23b40e07267bab085482aceb644351e255971c82fc73c792fa4420ee7e1bf42b2dcd5aad71f66954e91d4367c8505e1cc4fbd2705dbab906b56447bbfc73296f1e4131e60273f33cff963bef087c4f11f8077a500b3dc082e1bf6eaad76f301d7d72aef47816f0ede7c2c5f48305719076d4e62c49ec6f7535eb9ade87ee094ee3d81c0a983b38e15b1da0545d3957687ed5dfa834e0a3c1061d13d7c06a27a1899eed333e7895e7b451331268e5d661165b0a4b6623d8e5192468375327081558f15252bb8c3feabfcd480a802f3e671cbe98f78b870a89e8360cfb62b67cabf971c59c2fecd55fb54e4 +shared_secret: 2dd5a204c2cc0e2e99265e4243221a99eb3c56c7bc25c442a1cb85ada77d40c6 + +# Official test vector 72, seed: "6960f21c7350dcf41b4770c551dc8692d8ba2c0b6e162c589166ff22e7a1ac0f94c2f48504a5f7eb0da094df427bc98a" +entropy: f1e5542190db8ecf4b8d617a04fd3783ad0df78bf8dab749afb57db8321d151b +public_key = 70ec588f847ca3ea21787531444355e26000209110be1b6994c3003332b95b6aa30f8a0d047cb6a2d9cfae2977e08962b656255637405057c233388e018753fec08442a6603878a6d4f8cbb2574b9dca1c32dc0964e82606739ddeb92402619649bc143950b753993e48da443b1bbc8c3a0e2edaa2710a541ea6ae48022ae1f48af844c2b32707733916c259ab588241ee58aca3538a0bd79fbf3589eda9ab08906d77778649f0a2b2a7898a651bae7013f8b863112c4ae2830a43ac421434236151b2aa7a5b3be77d4c85c89e3140f52804ca470aa2b929e8e8bf9b4278be1657ce321572d2196c4bb158ea891e627861dbc811525cb5f07a3377be081b4651eba3c311bb1c0357bf7a7923a524f003b02ebc030400b4b1e1711ef633b8921c101bcabce37655e8c651cc9458110e68566d0871659c3072c509538c5a6174063469a25c4134baa4f136e71464179b004fd361cb2b19d955376d137284039a6820211aa578189765f15a47e4b52d4af9447c4a8343f84edfe7ae76901d871b0a0d72414c4b01f35a38fe35a268848e663263439b4dfb9b3435537f54bb1e2b132528fa5942da8563554276d466e97a25cea6c7841729cac824dc3ccefa91c7d0a377f45b10b8f8cf78d00657f90e114363644869612bca78e402c8e2a6ee1910e07b72ad43b44edac06ec2cb3c448b506cb0a09746ccd84b3b993213b7a76dd681d6e7b7e9916276172d15538209b01ba5149bb0aaa55cbb04ac89674700544ec7079a8277a3dbc298034e08716849c0542dc42b7e32319b0b7efb43cb57f951b4912af0141965fa6e1701cc53d08c1887bb31fc93399823f1371712785ce6cb549b91099a2245dfd350c374943ee6826cd3c9bed72e7012028b938bd304ba0f5255ca664389335962f35bdf253e2b3933689070145462f245696e4b1d852bab0c817193679229ec684979c8f17965f4411fc1382309c28e98c095f663b587e967ef6320a84a474ed415e64381ff341daf491a9bd872a019a112a2ceea76661015b54181b8c325977b50993a5c26a7d992cf519d64f0a013f517664268d415a9c7f178c047a684495464332fd89071da200c2d70ba68c68425b815772b349cf4ace5dc1437bbb21e3283d2623cb58680fb1084e50685b99224f8c91d167590d4b03fd9a62d54695345217fb08658f1f6c25d0652cbc8cdd858ac9ad44616a8be03e06e14288c1ab27e4d3c15b156732d246ef8492efd508b41e6438c1c899b339874792f2bfaa1b8e55dc2740b02d23e8da9c0a1b91c61db66c92cb8bb3c64cc68bf4af341892441085a96f3aaa1a2217bf6c005a3938c2c61a15a701e090c84d93628e7cb6bb0e49c170079df1c0e364a4ad3622033b762593586549c79b764710b2107bd0c0acf106c7f7ba9accccc6ddb15d2b68a9fe7a2e8820ee9acbfdef8c139bc8b5ef47fd18626285409a59479d517714637b9d75aabae29cbf3418bd56154fae5195372299942271b0c90f0bb7f0c2537df6a433a2350127a24aa144d30b95faafb39f566651cc1bf205814027477c46b7ff1b66837c657af9cb0e7f46a42b4a74a69c36e716e2e993ad3c574aaec31a8fa5a950a8ce7823a7e032cb4930c95d8483aa102d1b20926a6a324b9062b29192431bcd61aa56488be8b9491ea373fdd276bf986ac01e6a9683785d3384acce6297da89657c005ac086687161bc21a18d6d325fef6059ff711a60782263a5dd87552f3b6691708a60459a81321caebba42faaa5593982ad4e0956aa42bb03867664470c8459a511026c2b8791a37278faa906b288dac6a1b7aa9588ae9062a31823076864800b08396aa90ab0a48a9798a146a8e77b104125ab1f1b5448cafbdc749ff085f06b02a2c25174f587f6c2583cb0384c521990b6c15cd926b40712bc503471d4b807f85b7baa361138312f1c62d62431297a451957375607bceb0009d09ba904a864be363bd220cab37d13a77daa42454b867307ed7c2a956d41a62b996e0e78c34b4ac0e7aaff8d8164b4a11f8aa4379fbbb34f14e9fe13a7f4ab0025586f130914c6183719a941b0338e1e11aa3f167a421bfa38c9142e02316d1ba4e64c60320c0a190cec011304f0bc58af38e492937bbd0ad3a5a904fb39ce365a13dc902166c864a972082fd9e2ea5548a3b6c7d885a3ca6ae2e12efc2ea3ee4ca0b0b171ee93a198b42 +result: pass +ciphertext: 513b90e91123157cbcfea4a884bc01e7126867dad5849630204d7659363db9741b75bf90a60fb1454a58a6b9218ea88480a9c3784ff905ec79dc457c1bdbf42949c892d62050c4a3a5b1934d9efdba27709c1448f561cabd43ebd07992fe9a3eeaa93d2f85a58c78501ede9066448fafd52334e63e32e257b857434f1ff9d2bf2126f73fcf7a4f4d5fb1a9d3ebe75553e6f663ed451cee5c3d427fba5b362a554f3e25655de48f690b6d9028425b00598988fdd3fb41bc3cf7be9861b82b9a1bfcdfddd4da0166408498a88eb2e9e52ed8b0bf1685dc6862f14b59f9f9017459aed302a242f24f833f03042541a553340a99c26288d4d80257b867eb75ee67b949a09261c5c3575f688240595f90e95c5f4aab0d924ce0f9b2a4d6f7b21f1254caa24b0498271cc57f83323dd40d0f1b566cb72e435ae8cee0f502a6900651ba29064ad72bd0d2373dbbcb96938f110577cc08a90f8ddae8c897169262d3475ecf8ce5976a27a84ae6840077a21334bbec3bdb120323e01733e4125dce4413487cae5d26cc1439b07fb3c2bbe2321c12f7a9bfa3cd37f282f8909656470f8dc01aff581be3b2b5daf242fe8075e3f2dc7cb1cf640dd07709faaa95f2a210e3680675ca6583dcd36c15cf4d5b1234d76729a3e181409a60aeb6c3443eb828ea034cd97c7b1917d80cc3f4b6b94d0623f502ecd1095d2aaf6357a15c008ef838487131e9c0eefff80d64b961c56e400d9a0987d6002d787a733669b8a14f68022a47a7f1a7d5b0cc2982cfca20ce49b9910f656c8493431220381da944da3195acd40cd3cefdafab652acad95d1b33c45d69dad1349c314f7e0a5df35931489e3f0ea1bba8931c0ac5a9ff1900ab0b3319b7b32323d8540e6693b394765178366c2783a02de21196ef15b562bb0ddf92ea35f37659ab026b56c1d74c6e5ea282106b8e0d3910f0611ffbc00d4a2bebae4229375be72aa985211041b6be3afd316a7b237af61d591bf19b7d66e7b2141518c36394458d38397f8619f0939de57c53e116aa3989fb875cfd60d7c2c8f9f95a9b03a8293735d76caa4bee486f56e127af5319e02e8a6511fe1f4732b707198884a461f8af105658808551b3cb59bee524a8122badcea5a014855fb0ae4f66543bc1de0023432db13ba03b161da4971c9a647a9e944f04291d40416d01ae8d9e8789fa84456deb8e74b8deac4a4adfb91bae56ee88cc3e44d9227d356901351ef3b2ecf4d4957425f5744c09e57244ce56ad2aefd84a6f62c79fb22d6c165b969f9a2856388fcee1683265467b5e56d2b55e01d907293f5b441cb38d753cf85eda74e0a33a30f22c12f99f0f79d6a431f6d749eaa62c13b56e1e327ce0531d6495f043b6c77a697ed0127618e8b864e53b7155a63f76d210a5977a3432ac64dfcf93eba99e5308aa9cae3a2fc2692a7aa05018e66f1347e2131f3cbafafc14f6f1d6b1e2ab5ff905dbe8c0e0602ed774360c4557679d4b58adb444388e396e30d59ea092043e4d9bf9c4a07837dc6d30134428e827278dc13d8059563c6210f2192cffa0443743a829679fd840a6d2ac535caa5384a0002e2467f6b1aa0fd92c53531d8d885e947d1573f248d9f2dad6b009c511964f2eefed5e1fe6b37e5472e917373be0b2d1c9e30844f39a03b6a2fc3bcab6753ebf5c59ed4acc740fb56fd14b3a5b41050fa63ca3eb8c68a2742890bfe9f840323366e0fd40bce50578e5030359befd7cb00341d35257e959651e50afd875f2f59769392163ad2bde60d0e2964caa6634d6b2baba36286f6afb652d8b497ca74ff24b7b106f21116c67133ffcb55c2443ebe91b2f34c37fb0168b1ce69316c79afddc9095b2dc271e81088ab56442c87f1e7ca7fb7a38f69c184c4dbab3d98dd058e6f3f253d4e5f943df7b6e0d720771ab50dcbaf26d180bcdd6859ffbfaf447598b36fdbacbcd85f596f8d0faa0e5453aeda7270a88149b2513265a99cd2d12d465ba7ed2f2c2917e78d0bed73fbe3cf0e368585e58444038a443ba92f56f14034b03f1a3be51a15ffbb216ebd23eb533a0dba7e84029ec4f24f686ac968b7d77bd6c4e869e0f8a80905fb88ac04db1035ec0c7bfa8effe39f9a4146e6a4fae014e7fed997ef0a58e4957f81429ef52f08eb2c5e62d2cca021e79de0453381bf40e1ab17b8f88ff25a4b0a023d3542fa58aaa19653d99d65085 +shared_secret: f672d4af4d2ac0dc3b671317cacb5334b45c985f53c0d6fb7c3a24e5f88ef643 + +# Official test vector 73, seed: "53df46012cad4a745b7a3c06e18ca95e0b839fd8161e3025749a0887549eb0ed6a44eeea08bd6060d6509dbf7e9dc864" +entropy: 74efa414ae171bf60b6f884cb7e5ce12028f49365daccfa23e845d551711660b +public_key = d0947b8b21912d062783fb94b458013f34480ba83178c87d9ca4575ac9014ab22a7cb92b1bf41ecf098f735b3401e31bc02a43c447220da64ce22b17408ac536135641100d1ea581a14818eaa4c77b229b31511e0a403229889fcba0a2d4d3c845868816b79f56d6265d678c9138b716213fcfd7acb2c68f4fac7914d140cd2a7487b34146708115689407a9bfd24216f563a6fd220893c1c5e2c657031b43a29b19471b084485b7f739af017459ae50423518460266cf449b524406b9a2b80a77093afb1344bc1521e0220c5a113cc0c4a4321a77204521e3c758927c83398aa1f4bc43ac61487e7158ab4053fce98a74b14632054d3d3aaf018cbaad771326b7160247cc10a114434087faf515c7a39b0705bc374b7af73c5b60741e037bc69b10949db1739ad74a240c2191b3201a020f43890cb16390d6c27c39d40af0043b57e8a0f978627fe1b36c6c83fc97b49ae9268618b2c96a7a3612002b2673bc1ac762a37e07fc6ef3749009876399862d67b5b48571caf8b326a4a80b4544c03ba811b3501518d5caa107be696cbdaae79caa0191f5678fbe14934609aeb501bdb0a525ada654d77cb3042159686381e3677edbab5f7dd87fe1c4566dd7382f03c2acbccb14182b9a65afc0aac41f4c3095675a316159b0b7271f0284e160190de000fe4076b6e3073d302a51c7a6f6486c52c97446b506dd7c76ebf08a5f8c70e6e8479735c2ae79a6d4a99444a347ba838c43a1ace485a005a7531916c45181157c955817c488ccab9aa4d55dd79a5e243504a74405a8a4ac01cb1b9f2917fdab3b2909ca609739859383d631b65965affb4490d5b9be84a2902cb34cc50b5c49cbce43f8351a68b3476387bf87a16b9784a0e801e1eb39ee33b8b9ca82bef596605b59f33035a05a012d8549f0b68c93b784c7a309dd71425d3175ba50107d28aa8dd42369bcc68a8aa074020b4b21c3d537ca25b82a50dc875ab76b35a982b0792fd84b60e7db48fa0b80cdb90e1a95038842404a78c17d6c73e42951ecf2160db816cb7323cfc0b8b0057e6e66a36a856eaa60735433bc1680636d137b8da85f19334bd0ec9617d8b484986af31bbaf7e81a050c5b4dd9356563bd2f874b6b82a6e8b088b2ca59ef3866fdd4217efbc5dd66c72b66137ae65e7dc5c541c42a5c4cc1c1f1b678b7941d37ab5bd7292c665ea89b9679c5a6f8248f9fc61c2af282ec048bea74cccefc2077f370d3979b83e2a65d64be85742bb9b66308fcafc84038e72950e968b33fd98da2750484f1138aacc0e5e8607e352804316b26111c5a242c09901339fcb7d304c749d9205f169d2663a03bbc82658a0ca3025ec4d0a1e445be8fe3a72c672333188abc3010b6a98ec0f01d698b87f195b2e398ca6f8038ef0739af347b22076a58391c46573b0f782444464d9ea0645b4cc6f7136927c34e51fba618b082f826b29fabb8bce80bb0f05524348104eb4732e0ab4f4040e104b78ab9317b558330d4995168752ee23455eba2cc4cb679687be93860ccd1848bac42616893e6e710645b354a657e4f064e2d3266f89bacb8585e6d927259723e7d321aadbcbf9638b1bcf917e3c203fd06145fec0be1059c4a52ad751986d0f0bbb46bcccd365ad6b614dfb87dd7f97ccd731f4f9b280cd321d7d7679743833823aa5a05b1b3d0263858cb2ec27677da6928b26d3459573e25b0ca4964d6798cf250860d055418761d7ff0189223a1d3eb6ddab21572b58f0f5ab03a1bc047d7928c060844160e169b2ce072a89fca5b384b81b89b24741674ff5223d4116ada77797234ad3cbb1f6a78cc33e27b03ebb0d5a18427f625a4311a9599ae8723bacf392b7c915aa731c943f49c24f189055143502cb35318432c8b89bd2b9243f35c4b443ad48126207559a2314a77bc67c4d79a3e010fa1686761509e6774bc2df86eec6c5e3cd547f9a5457fb4a984590e57ccbbef3b38e441235d90bb60a24a691425cd65bb43b5868d128e3428b446409804a25333a7ad1f5c6d712169f660798de5a448aa393b5c496db978934c6eb001112440784db13825167a33206f76b05eaaab0b89966150238748c492379b387ec863fda621ada4296fe16593358ca0ab83c15225dd26691da0b00554c2398a2c44f171bfe63d48db72ee6cf36f47dd054b8f7bec5a4bbb6b0d62bcd24a3b8a6d32c53a51bfb7c57ecf +result: pass +ciphertext: befe323a205445d0b526d8169b8499bb6d5e557381bd3dbd8fccb9705743ab4df3d5bf1e83f78312a87d74389813f2ea4249e1c56d6727cb6e1d6cadb74c331652284c68d81087a237662da796bffcd14239e03d2e097987476f62c3757334a724d9b9518dbf2a82d06bfc12bb1efb86a1d68e638ca37cda0ab9fe2b0bc0e54111b11bba4ac4023decedcea63cd038a9c0a1ea66968a9600943b68270e653a38bf08536dc6f8a7f67fcdc4580c08ffd0eda430761bff7030795107a83ac82754748eef53621cdd138128d6773c411ddbc635e4851a11f4f01a172ee11ddc79a525f2de9f2831f34e55b679a21fe5cc96095837d863d515b257f76ce9d588dfa6267c93711b98b37d9d2a4222b250b7a452102b2f3a33462b828608531eae54b2b3688a68443a77088b93fc16cb7e59cc86705b371689790fdd47ed4699d959e82cbe3c90209a54830c56b0acf1c20b2685eea9c2237d2ef573d8739bab9d4f3deeb7cb4320ca1856e1ec8759c23bd361c18046fc43216b46269a076bd8b02f1847e54fb6faf7dfc73536a2a06c9817c022814a61dabb29d6222af5dc508c08999136c3631e33a09c485bf6ee6ce8a89ae9b89ae5ce5f7052291f32c7d18e1e082f1a5f208e049157cf7c3d5c007068fbc74bde86631089f232a176c03cd596732a00e720900ceb6e48bbdb4221fc7fc414c81e699064f97129aed58229ba7e1ca800c759c1b5a16e18e6744b327990d087346d70f535582659c77ec633756b999075bce6e996ea47a0e6b5a889173e9af7ef022a626d1037e8e8a6a4ccf10cd84440419a95d0fdad3a3058c3d308f3c47a2d79285c97ffd67138e6b44b3ef332cfc5874764dddebecef283ebd31be660ecfd8d5a4a5f540b6e297cf7c296ff88790e64886938f28b203317dca7e870f7f5c115910e250c66530bc9e127c3c6efb5fdbaed54d25c2c5f8e07f4b21edf148ff413066d2fa44aca9efc06609914b1dead69a60db93a3dae76ca9a588be28af1a5700afc4abfff20ed9f6757c5b23856e91b103daef0b5416d7e31450a0f85470b5954848b7e21e982fc083cf7eb181336bc2d91a0fb7109bd14a30e076ff633cd6a539b0fff5103e5bc3ee814d9365cbe0c8915e5d7fc6a85af830840c0246cb348e7bef496482bf3127b04ad2cb151994bf0f3051ce41bf7734cd555bf1b41ef517a1918931e2c2a1118aa0ce30475d081a8e36b2928cb83e86c7ccc3ab9231fb1fcc227338229f16cef4f6ae922d2310e35b34d1be490ebd8e91c03beccbc38d264f9a62cf8f0dfcd539ccd43469d4c8e6e088a8815c14d49a69e3b28ef990f319113b5d39d2b3388a2c6b8daa788482b78ca6b24a6d64cc7b0def3a3aeef1d2dbb8692dbd82a124638cfdba641f0d9c7d7c45a2593a4b46cec98184fa3067970c190e34b135d07328c785e489724ba1576e5768c6d1e2148e44168dd1e91647b8613233fbe9c9d4021194ed8936fc6d3327cda69c02c3cfed6b40da3a9784f4ecb8561f34179a3518aa6228d37a9209f502bf518f641daf5147377cd65e20152346151d553e748a02c498417cb2920c429d3251ff6f87eb6460cc5a70866b52084ccd68b4446032efbffd3d87c6ee663a85de4c6221413efbd940fb2722aecaac71394f245c5e29973526124bb1dff567d3eb734789ec4f49c5c4b96142f0de143792f15df1bdfb358eec7a5916c9bf22aade6bf7961c6cf4cfb33bca6e0975311e75d3d90a1923ea440911664ea2bcde517be31be414312ade1604b96d443bc4807af3c75e431668a95a03320d19785c8ec3f05413dd52cc18d01983c70e9654abb28fe90b795e8f14dcdd44d0212de2e6f9b3bc21f5ebcd50ff4bb5daad6fece570719d0acc62f033304495abd5cc6dbb47a08b1e94480ad4e009ce4401a10a997c981689f3041f8ac66d75fb26548a4bffd65ddc42f3eea2af680512bfeecb605aefb4d210014682984dca65c87567193c580db8f9e74574985eb71f8db1172515d25089dbc92a90ea463622ba1ae32d9146d59372e353948495c3dd09b526218834a064ca56a041bcc4d2f6284d3d87c73243ffb436cb3abc12e36a8805d15ae524a3c49de249190f4d245d67804344dcd052aa05ea1cc9534e4f8b9efbaf1144272fd82196cc6222622425e202a104e6cfefb6cea45cb7936aef4cb46c0c0fcff6e3d0544fc2ece9524f5 +shared_secret: 25c89884be152d8641686c8334cd51a4477be723cc9c0cdd6092531dcdfa76a3 + +# Official test vector 74, seed: "deb963f8b1d8fbdf499d564ba8d2d47915bb402da02f17031b37b4039a842afb9b7e48f37200605992bd2429427a7a4e" +entropy: 0b4c3cffb2ba4380ead13dc0d8acad2356b448a810da1df29f264c44aab6d24f +public_key = e3658e3c8607f9775ea3b57a481ca307a36b36780efd410873f9067ef06a6f75b2f695620c9753f97b167df14f4b59a66ee953aea71abe866ff3e34cae61b53f5842a9ac3c811abc36798059db5a51bb1a003b5687dc73e279236e69477cd03c5143b6e22bbde999379ad131215c9c46e37376402d434a58f4ca4c5249c537b15937c38282d2759a45243ce36d24eb234c5bb875b2594ac89e51564e43d2869edc93cb2143d3f72c6d8672df16a08cf94031612199c224e25bb223fb646ac5997b806adc1bcbd49a7833409515c05238aa2c3445a290eb4e4cda6fe1e61fefd58084db9ed675b608ea1bf660195c226a6b70cef5a114ec584903aa427a34c4f75b7d0dbb4564c72c2b252ea9b99173659ab3639d3476332c74aebe0b6656e3cc3f99206406718e5718e76bbc2dfb8b409780263851db783979fc5ea3e4a18d6383762c6d5f782e7333876c10414dfb4548296d33947590534a01c399a3731ddd4c882012bd0b1448e066c528f28c52d3c34f1ca1e2da234f571ae9921084179a9673091555b9d671aeb33a3c41c22adfaa8ca800b92e9401fe31b35c311d7820284fc534c928bfd575881e5678fe81803ed08041475b0f4a36c7644441a067cb35a633a2afe385ce1a1b5c4f9c4a1580003d1aacc548a4d5e7c94c6a4799cb843fd4c6e6209e1eb1a71be32b501b004ad9c0d7a6b44c2970140a021416483dd835e7987b779041aac46806a1a538152e3b716beab69a86e5291b431b1eb68105380df09758871335be0735b4a22de2c4593da03679622c2af78f4d888fb178098486602b743d72f25a57b3533623b57cb905ab499835093b1c4b9d40d361fec791cf82a17417981ec713514ba50b46608c1307b7939ad5f9b1ae47ac2f0c76162161cf0677aeca801504512433918aab949c078d46399d873b0a6e9987e9aa71e52c5691232b8bc68c55508c9bec555d17a6293525d297be94559671c0209561c6bf7859c3469772c25e0863c16c9c4aa453862e52ab3ca942d887c959850cf4fb2afa3420fe55660c22516bf8c940ebcb1ddab9a36a341cc144a646321037c07231424e040ad92c706d254e56f48012601e0de8402221711102be85f54d3bc513481c1e2ae6c50a022d056967c6b032c99ba89070847bd5aceb4669619c71f2b7581736726dc800a3148bd2871d8bf60708da4cd13b8822209bc09cc2a88a43defabe6a24986d697fef253aa91525b3a3cc9f102c9ea158c699745b03af77d41d4df72be7fcb6b7130f308bbeef6ac699388976a574ee1a74e84b48649bb32ec763227584ee24c0248b7f5096c72ca172d2b81982f676dfe44a896618c77393475521eb6a6fb8ec6e153c72d7f8c9067a765cc4149fc58777974f96411739168deb8a6b0e905997563d7f13590ab30173bb23f7b7440fcb6db8f910b12958e0b62fb6f84fa5aa931b118ab4f1ad6374a34721c053224b04cb07982988fa3a569ae9342953165b012f31728960f89d589613d07a2b16c71e0ec942a812a72cf90ec9b23118a59c6bf7c273c6163a8470b18c8c2ee76f4d2975e7d79df7e80e759a52e6b689ebb7bbc7abbf6609560081aac3aba2b43aba545951427cc35dac5cbafc7d394bbd57a2854e84b5f0f3059a94b35f3b0f1ad3344cc2a40fb89a87e091c9c0125c0052e8b28cfff0c3e0390967e1364a4ba8c0b77a7fe83a65b76255422ba7a128fd4b3c8ef85fcfc16f80ba5701c9a48ca230e455b02b28641b98a67a851f31621733c0a779170ebd690111f395e7461127481fd8e1057d35b6c20b1f68322e72e92a2363825566445544995dfc08ccc492f6e19072e398bafc32eff92c7e229f87d1327bb1884cd04849569c415860df59646ec59ed052bade3a0ea6bbb8e9d924e6c43aea22cd4969528d50af83b977d4f8681fa52ae6f5a60ec1cedbac91b14b70d46c5ea18551f288690c3aad6428939426326c54a80b1c6281d51b3d47462f18c6c5931c60395a1e74826f6c258f5622f689c4b5470976a961934104b41100142854bbf75d40d09bfd9a0e64575a7546bec19108770c19a7cb48208780e1c657863163022c910f071c59f239a23cc9f1697cf5177f88e7580df8c925b2c405a3360d0a80a6ea1486136faa9c48aa3801ee87b7cc5c638d67be57548c03711f9b2b31ab319d45c578e5acfa30dc426ac3b194230a4bb5ee07f4 +result: pass +ciphertext: 47587ab04e0e551845e526234cf731036de9817d48ec4510a84cb183e70900d2ce322c999a9d08e654d466beb2ffe46ecd746a91882bd73176f6077ec0fbc4f51117805b7541fcd988faa8d02ce31eddb953410252ae9caa86e2a5d3079ba87e986caedc21c12944c88401435ba434bf0770446a6c4ab115f22095592487f89f38b6d659e9c800c3c901c140b6e027a5dc357ba6ff5489b20e3fe72ac7ba203b1655942c663cc98a31e7a745ba46ab052fca73acdf9f898101e8eb8f4d08a8f6352911e90f072a537d29f512ecb10b6fee65b2e4d8e529190df6ae31d5989c62ec4863513f28444f470abe04f95f2c0e79891710002572b43ea8de4841f13d72e97eae417254511bb4c69bec2040887b01e2f4991c52cf5e165fd922692bd3efe666af3a5e3f3ea046d160dbbd10e2859499e6ec260dd4db9b4b706e889a699c511ed02ff2a4cd562ff56039d4876573a6a380e77d87fa880d5d8bd7c8f8a42e97df4c80135f8d57d300736d9bd9ca9e8e9849e8d8d7e48a6e89ca52a6859615b6ceb2b412bbbe4ed6ee4c9f5c21c1574003261714a4ab95bb2086c88c441cd3425b6141a016d582269c2cf6fcc40f5fce13b7a882c978119e0c839c7a0129550155312c90e363c7ba4276114200a230da3f2ea0bd3b8363a73abb07d3b31f28100da8899809e529ddd346c78a9f017408656c943bd7a028322ada4240d47d33c84a0ef2bacfa1adcb71bc142d0e6c652b1549271c9dbdc4330ebc71581c1d36274f893429d08cd966e4ddceeda95e3e8b2e79c4760342dfb8620db4632fd20b885e96d07af21d603781fc4b39c7ff245b0e8c29dfd0b77e108a1ce8f42b5ba5564968d7cb77fcf3f5bc7ade80e6fd1d6676edcf06516193e481d3df21e36fc612e984c63a1c44d2a7614760f7b07aeb9be403912f8071b1a8c2b13d1bbce9e67ac29896cbeb5dae6f87431b39c55253c1b929f837d74d053be5a46d56880d96f4047a271861e418f870efd8cd26b351a4c15d7f9633706ba8fb5af7e967715a8a94916af9a015aca2331c77b95546f48ad8c8ec3ec00c048fcb61ea5af8191e617294e92e5ceb7a19b17f7af42fe9972e0166395c812328e59042f3f2790fc85106cb87ad2b318e201ee9a597f0cf982cf313196e02a5145a83ea1a0fc8054b42ee6d32468528232240fb914e0178544d6d200c1172feab5722290195444af68462057799dccf6c5b2b6a5add344d66d8c100b9c3ad1654ba1fa424c0a23772dcb1b60d64c624292b24efda70875ad9fad1210c80f6ff7478d9a14926da1875bf614eaa412c14d01cdd9e790d9c8488edfd005c9d3e1a034030eca417fc99b91a199cd3dfb4b52deffb565d4de0c569d92605276111693045fd8b3b3a84cae2a4616c6f249a06c3776e9cb4a59bf40e64207f180a4807220115e139c23ad7a3573f3012c05177a4511dfecfee943b650ceb60e4000bed6acf2ebbe270198306d079c9b6e5e5fb1199dbcc01e888943e808f414ff3704169c1d5870f5d0001ab5e844d10a8f0562103b79947f244e4eb9cc03fd261d9dddd5fedbe4592dfa5cba8a642195ec97b991bb52c129ab66d428d23a2e9070968604772783c2a4f215169f7fdf3fb38df8434e28f02b96c61cd6b86cf37aae45f637b1ef2aa07ad59899720833bd64eff30c485a8629a6a416e577ebbf9e770bf3ba067c00ab935a98ba543bbbb3cfc1e8e1cb51be7b62d1c8d0a5fd56fbef29a23815e053e16b5324312d060d4b1985ca0d855ec1dcc61a755633524c0a3d685b147c5a5209317a8caf4d6c22f549ab539ff79e32ea1f04e0a7ddbfc6fdfd0fe4188241f576c6e818e2156d64188a64548d5b19559702bcff4bad39f5af66723358804567bcc9709d0d4ffb402b48b4ebdb79c10400d43ff175df89f60051d5c1b608d87671a616c9589e76bb6156f6561cceb30babc2231147c7e7d3ca1756d02a401fb6412117b0b6e9a9e0f6dfe9982fb4c736b9996c16c390c6a0ae174deb550f5486dab3b4c2bf54c02e7ff67e9f3f00627d1e9b4762ad6cd629e765af4b026d470bcc8cc7d55834527ad061a034bff65afa62ca6b8e9a9961721533f318050e1ff4a67091fc298c9a685b74e035b2aec08ab44bb2f4c4e30cf788ab3ad83e488a517862cbd9e62c20890533af39c006f140cd24b5e0258e7a7649cad69a86c0bd0e5378dd65a +shared_secret: bdd73d5ebb59092071fd710a25275c1dc819f549b5cc34b6f8353d13be70189e + +# Official test vector 75, seed: "8e2995f1b3e43853b18916bb1212aceb05898e2b177a87abeb928ad7184e59695c56b2cccf5db80853c28a525e327d13" +entropy: 1c82471dcdfca3a6942061ab4f3d5bf0d197321437c706d9cccccce449447002 +public_key = bd8557528725705c2bd05331fbc20f5560259fa82d438392c7299463710357160f985555dbb2ae4438310e3879982b55f03018c17101c2556ec377b15fe6507488052cd2360b52b8cbc7856c8894cea237e76214da481ef0363c877294399cca9e38c249392d61a2772fa4bffd98165d24760bb90ce22614e892a9c7f350706427ba2257ea7a1304029a6ea715bda9b2fd682c6aec65f70018c26c3a41a30f53976ad8b83aff7268f6d9b3124a15b94528024a179dd24b8c56cc8605914ca89815f943c1c568f255b757220ac606d06a1701457b057ca323ddb65ef076cda0044cac79455798b501463d38d24cb9c65faae94410f79995d917c49319e898aad54c620291491f96362d4792bc3639b6551e5a8b7030e9870896ccf461b65fd82ed0f69dad10bb60805c553a1a195336435303c1c8834c3a25c2832bf7b62e1b50c603951c12ab6b74eb72f4b15abb5455d9f681a0d5a290c0bf0ae79b03973e3ca80d9ed283272592fd0a64938c26803441dda5907be52aab1b9ae14b62f9db044cc0c2f5f48f0b8348a6b26631433dfb00b180b721910b8fb533cfe4a8be1d250d75a9cd492ca059fa115132ae5463577de070c87944bc48695f3b4b04014e9dc29185446e4683ae2cf5b9b3ac399fb6c6541925075b7bca7b7326861dc105b3b57ab55a8117ef69b33cf79665663d3355819dbbb235f9693d7c0062e5293c0a32d7342c18648500f8cb3ae925c530b6507418da33a819e57897849bf3f36f6bd68287f7cf8b5281e9e5af40bb5f76c63d4a14cfbdb8235c6a95415c4aa157568c34ca9f58b3991a756bf5ab9b658d9464ae207206d9d2049d9145b7cc59261860267806a23aa513f3c39cd7aee8e71ae4b3a4a6ccc570f179148c2aa50bcdd612bd81f8206fd1334389b9a726208db920944530ca839f316161b89a59350b2220a4b6c67caaa2425d78da2a3b454e396386c5500f7726aa38530b881640a6870d2e5100ec0c25d5a39bca206ea5652b55a8a31cebc84fa62f2ab6a57a2658240a0f14841e48340cf158bfc639149921632047ace0cc2aee5a3e0f647fc0c671f648c689002d98910f78b34e80c523f9073e4e4c9e6e102818e996d3a30886e7bcf18b69d2a16fba1181610b6bd248035cb90d8d440f6d4729031b21a4e1237d710bddc5040047745b231a22246e517a76d76a0ee7985ebc794fc5a51c17d9a9e9acc471f89cbe260df5c4676d870b8713bca53a400cb9b4fa6c36df97a023ac03b08c621e7329635c2e9828719203852970c2fd557348f5365cc917fd3ccf71d38d5d96336026c7d33b885526632860044237b4a6b09ad392414b068144ac67972b3ce7a25753f631eb1a03b4fa2e9f553302a22eb9c721e9f2bf74a06673fcce5bdb77eb4b525d63906ab2c4e8518322d3065121a20546a8a4eb45f85881ce25721b0058c2334ffcf2946c7b9d6ac05806fa778b2041bad1c1250883873a95e3d5b76a3480d8da8b48683c5db2757eab9193750649e74440dc58a56b3ccc27b2a8177bc638b61e0136a215c8079666c77857018784f38bcdda0c56639c03196b54cbc80b49b0aba6f6a9df352cd09c5cc6e05f62e835f7a125845bba2fcaae4bf61bc55ac98bd67763ec0214cc1b7cf91632960c9ec01e0f27a97f909d7fc2486d0cabfa146b72baa14371041a5336c71305e6e68a43577bc1665c0d66c76a239095e13921c00c4ad11cdb69050f7857c3a1b70e2a2152ebcd0961a936f6146d6a58305086e934061ae32bad1b894cc27949f280320401188775aa5078b1497315639288aa2f1f826b48465613a73c5301383b69181cf14ab3a05035a79de39973ec5c1fc5869af11320350c3c4208cc68db8943a017215b72b3353b77003fb0d513bf677b81f66085e8205c17cdd6b603ac98310c9a967a7b99b8d3af10b66821612333e50d72faaabcf93612210572e6710e482702b17bed5abb5e4a57baf365c39b59dc7cbad13601de6b40f5370a49e5b48c9580a0c26195013e6b6889b99b7ee5d93fc8b795cc62a37ccc5e3de2692ad66e903c74bcc45ed6f16a68ab17d8e5094680c428a242d2fa247985a0b7d7a300f70e844765dc30437d032f216a8d99dcc54da34c0a4c25a8a120b3c32f45a3777467b1e639bcff1bb9839b6b45c7895bcf62307460df309eb4e61aa9cc8941418677001064ac161a607e24e1 +result: pass +ciphertext: 86bd45c7f9fd03921c702aeca836925f7f4b3357a938b39e06cf93ca6bc8fb51b72546182fe2108eaa9a3e2b3e182797e9b2cd3199bf716a8d797a4362cdbe2135197e5348a916f1071ba69b6034a81f145f242d8011b303b872f3a65ddf91d244722d6487694e0834c59bd1262eed11131f44f7f7725527b662f9d6fc872a290d2887486f920d55ee53c68e764324a9141b1e51d83f51fc41f775f28102bcd79e6ee8a6cb7c5ae4a4d9ebb81d8128bffaa3089d3c8a28b47387c3d128feda9e3bea9782557c62890364f1dba9a9f40f3151bf2ef0614aa3c21d20219304b4ba0033f1da2d7ef2a986682aebb48cc2e414e87372b7eb6395e12219b9787ea6337a866cd1b57bc1f92b3ed07b95af0949ed4fcd5a68cac94cab44d41d8dde50b4b952641f9972519943a9e676ae8326b244d9ceba9a777f133fd61e48ee6091181f0eed4fef74ea084d7ea18e1a5dee64c2fb45f7a79a173a661ab047a965e5fddcd09bebed7997aaccddb5a428050ffea4a71ab65a812afe9216adcc0ff0bb452ce4e05350499bec8bccd91d29d99831077bf544f45d2b47ed0528e9a8c70c75a6172d8a356ab9916328076ca9838c9088a70af666bca5a43a854b0ac6aa3d1ad17d44ff57d75f3536b55b30f0db350b4147609a0b7697ede10b73d1769173dc618cab1ecfe6b42bd0d4417165b00008f7a1057516bccf53e22a911d6f025ebed8fb25358e4df02c8d7dff9969f8e0cd317db8c97cea03bbea44a3e54ceef4cfac42fa7787e993ed1168d63766323ab1846bbf80231ca255c47c69e102a5ee0d46c76cbf440edaf8dbde36c5d1977a692ed34428e73a4b5229b73696189194c813819724d60ebb1484a805455e938b74790651a9a4b823a6fc1205c1e96e306c4ed46b16e19db187145fdbf22c37ffac2f754ea752b816645848965a5afcd4b51aecab597f959cf7584b919f795f921dd5fd4eab2adf52f4582dc8849eb5a37f171920413dbd6a114cb5fdae452b0e16353dd06716f4b24b82deba79fe3af51fc98c7d417ac5e735ce3b19add258fd6e0ceaf98830e82e273335aea870e9744505713a083655c1295cb6bfa26c07fa2b8dd8dc97e65955e2001a64006c62392b97ec5df62c88e3c2debe1735c0dec98253e7ceee437ca1541f3a73209b356fa4b2e38c3569cb268afb062319f05a8f2853c9f081c5185386d5f5d8336016802d805c536a72e13d54c13aa3c1e1bb79e2f0dba1c143bf4d903b18cfa956c2b5276def5bb0bb4b5f89c834bd19e8badedefa2f0274e83df07fa989537ba8b8cb8af458f7a02bf44b269d6556dfa91ecd76636e56730e35b07c45a9143afa4cea876258caf6e724d7fe0ae0386b9eb3f2c45fcfa31e8f9343e771e8cedb9771fc864f0a728854e3b9fc4b04c30f8c8adeb13c6489b66c5f68aa5cccfb25771b666340747d0002bd70f76ea5aa52446f20894af51a9469f49e16723ac9e0602f1ab9297f072daaffa8b4104264ae578c1e3789fb405f01b44c46548944a46c87b3da0ac08493fc6e0239d86568b1132c2ad430ac0d76bd2046bdf31e98b3bfa83eb29ff895c05cebf28edb792e7678ac7379578c1b6738ff0ae271e9de818f7071ab22798fbffe9a94e728abbcffa249be1f0aa11bb428740f2ee39bf24858bc583b1aac546c1ca09fbc87a5b46df572be14e6fa9f6abc4cbe3bd41bc100e8a4d2e73e60f5251c931cf133d2883de857dba56c945b6b80a8872ba0f505e889f9033915912642c5cd6be706fb39100f3954b93498f19c6c880215f179a331859af35da03b3de56f3c18fe2f2bd84ac483aa86fca3698f82ea27c15fa6c844e225aca5647abfc0747fdc5570fff8209c288d01c7f405bbd4d2da146b79c4e394f999ca9ac92179680943a62fc5b7af0e4cc71fc15e639af6b70d4df4e2cb2c7382436cc62ed422186e5f88219571786bcf60f3efd119dc9e06d2cf0c9aec122072658525f86ebf99579e5733f4f8429bfcd75f0ac58bc9823eaef89deaf510503b51af131a81a58a7eca063c310cbaff194924e98c4402beccd0c7e83c1233bd87c6b32039db84d961508e60b108fde7ce1b5f74ecbf28362c1db18414d66a75742c5f2d6dc3069960cab26d2447d7fa3140b017bb3a4e06a0b8183873c4f79b54f9afe05c7885a3105e49b30dc6beda36118f074af630ef7766a34d2d14568eb02de6 +shared_secret: cbd7e4a223241e16d0527cb926ff8a4c945f11314f238b121a387f9aae140632 + +# Official test vector 76, seed: "9218943c51fd2de47e509aac67eff176795102f37d7a2017e3afd768fcda7877af38739b00fcdf227c2fd62eb635942c" +entropy: 46fe60a18124125ab93e0c578f1c02f1bd1301595013001c7f3c2fa56cde294e +public_key = f7a1521ddb8ce3e91a2835a177988a4e856467f6ced236ada9bcce8ed885b19b862b952cc8a2269f35826a290a90c170b7f9195f816dd631b1ce66442469c42a420fad3970edec539f11826a4a917ab105123b4c14087f7b2455202a5455159e828cacd84767e5b9c024f4ae6d37596ca7570fabbe591082de627fe04a97f45409fe265054bbb57426b6cfe71825837b4be360ff7b48af3a7226525b77c450cdc4a483a17d77e723c8b1282bb40fb621731fb504277ab50f171bec369818bc3ec22126f6a47ca2937f907890c7815a1e115143f62f58550a0459ce7e04695bc7737787a972321578222f5622449010287ab844e624699a1ab50bd872cb29bfd534b401e538c51c12dd8c467a14c24f5c9856234da17ac5fa28870dfb70565ac954c440db457214016e301736520b5e15538e92d1cb205776f849cc0b23211e6a67ad5c9fceda1577e625bd271587f939fb3acee14135613592a7364534c77c2a1564151c12e1c6a219b878180001e2c94053ebb1282c5288a707ed7b245f15054d87b901c939373244f776ca51b3b9d00628c9a8165993974bac2c0b26715ab1a1b9706e8264a0d210a0e627ae60b59ba58a4abbb61e93f0cf31230a624591e0d1a368390205d6526889640651b7cb71c26807b11913056629914fbb1bc2545b55b2610f992e73812e82b73d10a541a7c8621a4690b2c00149b5b952e91d992c52e8426448e5936dd41ed7725ff1c5bb54803690e7b642805b168829ee5696b5d51a13560a36409a1ea41f03ccbf6bb86a1b205bec128ef81c2af9701752fa54cb3784081b5dec67bceea87a8864bae5bca2aeeab4eca30d460b4015870c0187b2519783fa030a3774277e018274775ea2ba027b8624c1dc569416a3117b57dc5b34a1056e4c9b1ea54b6e5f55bf1cd3c027cac8f5f9b9e4c921d98692a007ac22c6b044f6ac9ae5acc4aa3062a348eb2cad9e77189131bf56aba2d86612e01accc76b3222b01d30b079ff5250e0869545641213c175bca181eb738fc7e80e989b43a0c4c7ba0b41404abe955c3c01859dc17b35f48cc39e9c6ff84625923c1229e9b7c3c2ccfa760c8808b43225ce4fc96bf0c0affa26aa43341f7f14aa37ba5d48798c1661319b31325d04afa0759c35153ec77b07d5d88050f5a1f55262860c94990460341c6eaa32055a480547bb0829d5c3398208018b4c098ac686f1b18870864e2cb0777a798c221a659a0e7e9c5c2936afc4897a611c55086330ee1689f7817f44a6c127a53597576f37b35b4f74c535444abf5342dcf256d04800b04361adc83a207952fb81caa20cc8dd07a6fe8864e562844882b405b5b4b65c948b237b385974a9d4963068c3e5b18c51d42a7a9211d4f274ee5208e530907db49db956b8e10977e2357223523a58b511fbf7993bba3c38a95bc0b98062312a1c9449ddc4082601780ea65a6bfb1467a01d9e326cd10a8e202320d2a29e9b36ad09c44127820d6d024b3ce0c818234f55d7855b0b000462b198a669bf924bc81c99ae0b32a1c21f448ac6084c71a59a90fb43aaa73266e69a077d16a8d1443de4c2b61c3ccc731437ff744b7a7cc3a02a948da951d5763f078a991cb64ca7b049fa1b1eecb534509aafe04437e5f84e974261957ba746705eaf4528b4ba3764816f45045d40e807c14c3577a25f75f69ccaa136ce627742e33db588bdb5cc339ef916d7a9b108180a637586da55085eda466e3c7734f85e6a903ef0fc91ce793910231a8f46a7e084c595177a501b390eaa818c0a9fd37c9be78160c7a398f0e80d8e58966140639656890cd08f7fe92fe316cb1e1517ae7741445a47c8ec3ff8f54f476146f1095f9973062bc17f6723542b0a48e12b7e4dbab100f3bf6dbc219816a76a3109ebba8c823cbbd9176061d072d57726cf12908747bbc267c59fa71f6c719cc7827b91919ca3793d03a73604e1c2c98ca2e99877b6c2b93c97965c06b2dfd71cbbcbc7c81cb56b36587a174e899306acf88fd2689e345a78657c5c0b65b0f3f8206e405dae4738a7061d54db38bdb2ab87e8cb6dc93f2ba0c11b65712840b740ac90ac3404b69cba2123cd335004d8e363eb08148a627b66b4142f66b18e460b59d05091640587212f4dd60b84e61f0db00ac05b15e83a6e0ed3c2bd281161cc07676e12ef19a936d073d684c1491518bdbd426eb5a1463cea8b67 +result: pass +ciphertext: ab3bf275721fa888504426dbd58ac20a234331510daeed10186073ff9e2d7b156caccc8acac8278c19968e136956b745d6ea41832eee321f9ed5ffe78b15638b64f4e467c8b02b462baa3e1a39fb6ce67a53699dda3848bc4707ad980be6ef1dd837a3bee0f2b5c1741fc83c6dff1fe486f5aff17f19596b5cfa50c48661285c395c5e74191f37dc4eb0d47bfd5224015e7b3443e2f41365b338d7806366059cf7cc8041d63c7867bf425b1468f2844b7c37e4a2a95f6be3f971002edfb5d9cd697a4e04ac19e00cb1bec5549a25ea22d581b2f7dd9fa57dfa570ecbdb6eaf15e96507a1f8eabdb5a56c93ec3b2d935180a26ce884e69e550edccffb8d5511a2a67ea30aec2c689f9209e11607ffcb3d3e59eb43e10864e45ceef642c74e065e671cf008efea88b0a6aee56e3208611e05b3251ebcb23f75ce7dcd75dbd3f393deb4a6cc4cf593f3c19515739d4f8fc3f567bb73fe27261c600608715e599e43f2f0fc408578b2ff7bf13dedbb9607e9fea6462cf1490396db33d1e86f002dd0ffd8c04c6364f422ce22c6a36cb379f6a8f75ef6af6cbb771b9a45f5093b3f0891a1c28c90577c3ca9c7e72bacee041ccbcb8504dc94d0e61c707c2bc25ac907fca7e32323f9b8056ae7b655587e77e3101dd9c7901f81472086851b78b083cda5932ecfa518547f23702ac75e09fbc45dac81c94817908ac1ec29aaafc197b9f743b87cbba8f5733730dec689648da1dfb24685b79b4a4b78cf9b3bb844fbbe52db29e96e71d0c2dcadf6a9a02fe25181e87ae45686cc857de917a7b60d6dcbb3abaacb2a6c6f8d59e1a052a9120a85da873132ab45dea2cc5fdc593513e172e970af99e73b9717e2e2e85e25081ad945ef3397d7338254a60d9549ce995518d371c0c672331405bcf88d6b3122eb55f876753520166622e6176436a9105655a1b21468608070a683bce0d9a959553a348591138c414f40ca3b7260737d70d79f5ff67327cd0811f695143f48c2fe55ecbeb7b66823251f97e7ee1689578548430cd832eee8701855c9a15aa932290fa9e19c688be321c4136c2dfa9fde8d7ad97bd1fe0a1829066616f312b473c0c996b50fdabdeea8fec2e88df7d7c8532a493baf9df9846292803fc682bc89104dc1f83540f3e621d0d8c348f0ff85f11a2d0d0d702857d1a68124ae30ddcdc38d38bc351873ae574f1c7032c524c87b7c38609840444f73c048a23abeee5bfd4027a26d2afe6a51460ad081a8ae98e881272c39036a07dd34b839076484b4bcde7ea5a0c4beceaf0d0c7e491375c5c8f796e64643195960243816a25f6f7e5fa1ec23f5b42c0b76ce60e581b53dc8933288486c400eb837f660be01982b8621aede8d15ab7570b6abdc9a357b338c681b208ba9ce8ec3fbf70994d5d6050686604dab7f87a27dc041acca71bc9376495ef033135ea27b9e3542c2cb980e6f6b75ea5740b1e049bff28b4f33f486bf8bb952762994df7c12b2907457208d700b485da9cec56362525562f7b967725a506d0926487f2994cbfee7f4c945dfd228894dd9c4dc30985bceb0fb4aebb36d8a6c0f1977593beca4834fa25b24102dd56623e725e40cfacd5b058dd7583fec862b5dc44ce3ed116e24191d342aac3e012285e511d4987f0183d032b37d24c19f54f35944a6c131f0558aa4df636ccc1283224aecf4c3f5b77b7a5db6405a51e060c960c87ec15cdaf5e080a089dfddc90ba709f6769c28a2be186bed959ae4b6a217b51c607f212213b1230e7015ef77a893e5816fdb1811317e321be94f2fa0bf398b8a52acdeb9059c37b65fb6ec48074eb376c522abbbe9f91d1e5661681bff86fa11d1130ff8e03ea5cd826bab22facc03ace0c7d66e0439f58f90790f1de4ced6a69b21af46c09116fdc8cc439c8e64d83d400326202921fd5300a3fc4688b9bd2fcb193d91e460dba2757a7e6f8d98aff772845df9041ce5ba2bb3e820b7af7a77ba40d0330bba2d48fe5d7ae02e3bbd01be2acec545f003d02e7601ac1ad0cc7b696905e420202ba9cf8afa16fb199a920aa8f95115ecbbef6bf031baa16b02ca8f390aaba0a9c13f9742b3b7ae7e9200307b76b79108022798a4a9dda95bfc45992575bfa04f2c69d1d887e95486438b6b19c51480afedcb28712b2ca165c942af6d08b8051222e24ae7b22dec5be1843529866fc2a9ee3af64b27a30f +shared_secret: 7849697d9e1c731b82ee49f017fd67d6bcb906408a9b09213b075f6ecb658387 + +# Official test vector 77, seed: "542e20078add5296050af150360f057f6b9ab3ba835589dd56987de805f900b906505b5390a0d86cba28038992dfc59a" +entropy: 52fb7cb6a633fd2e83f2892bd9441b48fe59ecee6d026f5246fa7f2a5e55ee3b +public_key = 6f161381cbb8ff776b4299a36c893aea783b541b50b2c253c088683aaab40ed421eb113add58b322fccacbc9aa91b74fb0657e7a2706ad9c7c7f7813be9008cb07980c310f47c764b4ea496af60e8e6a534cb49852a2c17b4c7bf096c52c72264b7855b7a5552aa93d9aeb47f5ac34e340a094d411cb2cb962b90588a1b32dd68b662060ffa2ae2999525424114ecb4905a19a1284928ed8c42a2c5461520437f93d3cb76502201412a65983dcbe4c70b9f9320418421962005b39ac65703442002d52d18a83b08574895c0eeef19bfeebcfcc7c308f960090e9be93a01c36044220858f671bbc04f1a7557897df2a51adf85a0f7b25f1480089855f1a150bd8207edd0c63db7b99497aa03eb33a8068067d43a24957a20fdb6e11942559087c3ff343a2f5503b33756d55c9b9f29f6fe83d80cc3cbe9a00e8a31d0b986d1ef7635cfc1cde434f6c826ba5445a5933845d1cb8047a8e2f263e1a86b4f58433c5318e6b86942ca92cae767e2cca9111bbcd8b582a81aa5d22aa29dcc21f374a96e55302b837aab8709202141324386ff7f9c7d2ea068b057cf6954e6a433a5502785bf43ec8854ee7982002c703a0d6c35ee79a316a1fe3148b0d933fcd450829746c70e26d5b7b4792c40ee5c51b80cbba439c212f1c66cd619408d654aacc9c1de097a9d03478351e9a377e08710263728c08a71ab3db7f4a50774f0b99c8306f7d39c1aabc4b4bd64356476f85d6945a404df00b2da8988bc9f6b34579447dc3bda9d1a686e2c8ba67666f179f77217daa8cbe47a40b154c16a773627ab06c66b5c291b8616bd675c0351db13938c0a22c874b33d7cc128113642ad1321e5520a636681ae188f962a793b072badc69316b96fb591a99f53ce160c1c9e56384925afcf5c2dd74069f89580b3c18bc15ab0c91578686cf801b25c56c3e37847be52b5869c2b3f03b9b5b6ab0d2b5043e56bddb1c793d2c0fe47544e61c12ac0771a48c8249b3649d77ad9a4bb5d20c3ccb0ac05b51a0d1e29cc791677693b2d96b83c0d599e46b238063c50c7c101f3b3bcba18fc4da9d71b23dc133148417c2f4369b0c92855e538245f44496413c741282f5d7b1482167d90536b89165226aafd7e8aee821b22f69b963a87e4bea84d5ca3040464e7293b1bab723dd393ee3606ca2940431502f56183cdad305ea19cc3f3974236310d05220f233b383c5bc97ec1544a8528c1c74a6a48e9b9b31097477efa632baa4bc6a8abd6ceab5d774bf988b7d708926275227be2c416dc90fca4720437425ae9b4769443472e2b54ad8924935bc0f65a4740699f2051c1e53153cc354527450c8909366f696c8a323a300a28388bdbbec532afc1580faa1f7821c5a6988d8386265bb9dc1043c5ec2a1c51a35ec910d80a1a4c41755fa669a89e05de79b331bf13ecf88bff92ca340d5b961f446eca336af53a95173cbddeb643d4831c2f563950736fb912bbe370daff28cddc319ebe86958fb1794a97001a14df90b01b3aa0c6e952e79c7af072905f552487bf255e1f61536dc93824c7709492bd133516ae71c1b057cbce6a4a3d48b0744a5ceb1604e41a378e53a9afbac28c3cf97b1b03b31797c40654fc23666c34f77207639faabce69c1e98262ae22ca956bc043fb6748f54310379e975958584579fba4bd50e04b739020df78849aba007a4a23da8a18d449194073903d1a3ea4f43e0e76b299c233c5fc8534d831e69475ab6b611ab02da3251fdfe6b92475041f7814be839fc39bb06912799c553b4647a7073482980090c2c9a96b2866d6d8b65db1172bc062f3490b708b239fcc8a39e8175924c930825916386b463b645b4832bcc399b69a812a992d09d260cfc964eef5c883027a2d44743fd538d05b3417a26974bb639f494131803b10678c725a389aa6abeaf83bc947c6a3d031487488c72b1700b76f25f42ffff6595d87426b67258fb6b993508189e9b37f16c2efe87e3de705ff794b0a50cb7d8bba4059ae2e3ab4297429a3122c3e0568a64b64a401aca8ba2edd807dc0c0656b60b027290d23bcad4ba71de7f9989cd85ff43a1fd519b7eb40352d85b940208f9f8596f1946dc2366736a345d9c7501511101e81928380591c19868128a921e56383d12f19446577783e0b1665396c56cc9046c4c7c08a569d8edf0b76096e3c0643e13acf3d522c782871a1f0b31cf8 +result: pass +ciphertext: 43caeabbb0780353630265f7ec031e271d21eb33a99193e5103482cbbb2be9eedaca422f46f1467f31f75e4add80f18ba0bf5ba8baf7f2e1f3f53a10a49a8744fbb5dcbf31fd72b8e2f43a3ccb1297495d690dd23c0cb128a080321ec598f9b10633d3b00fa818d199dadd8234dcd421fee4720e44b5b090a844fc95e37bc7e561507ebaea139fc9c2e137d6fc7dad05532bfd714a50afed3e10d6ee30ea4b53be87a81a2edc6f41545f1a4c4e74226371b513ba31a0a05123882c8709885170d8b52bde2488ef13627d3168af330a914219cc1c869b83a531e573025839676125100b376d6c7e19f0a8c39a84b7942a8f493803ecca439b8b0d6aa984092e1dbb44552bef183812235bf7c1771883e56ec1064166083fb23be4a7a5ddbfa743109a692c282e0be159447fd648417801281944a32bb68e39dd18081b9c2bfdc2828fab3089023acbe74ddcdcad8ccafe75030dddef45a3b323eabf4b5aa07ea14a814fb80ee16e8208fea7a21ff0ccfe155b5547fdb330c90aeae7a9fc63090e784d894b4dc25396dd989e3a0ce8fac844472170db804106f76c360f666860d50e4d9d2e44b32adaebbb84a276fd41c50067bfc7f158391ae6df38cbc70712d6f185558bc295135fe35781a73ad1ea611f33f465feb4201336338e37bbe146f966818902db5d9a8073ed3306b5946e08bf593352f9edc6e545d477834c77ae2239fb89b88650e1c3d7918426ddaef8445b7a32d6ea77dd761ec980b5167a3fa3613d5c7edb02227fb57d7981290ad7891ab98c1d127b75f5ebeccad787c9f6d2d7b3fe5db6ae2838bcd9ee58cf4ace6de6febaeb2062b1029751357733ca4946fe95c17ffc65c5ebcfc0a4049e55a9cd6ad190572fb5ab0d36244d01fe2a76ed4cf1fc6e709d8ceae012e613f81befc46810dc9b745f918d0587238d304840f7068c2c6f646f569eb5aa6c628a2ac4a77f270e337c3e7e809d83ed3075b9ef199fade755fb0ade87d4458305cb06a1fdcc77888fc772efff4ca7588499615e18aeaa17aeac591bb93f2bbf3d8b363fec4f7f62363ec2bbe9707664f5a18c6ff1d1198dcc42740324183a530b401b3c480f10531c2eb23b2b2fc9b4fa5891fe3c38ce751258c58e2d36eafa05b434b78018a91a7f010d0c8aec5460aa4ea0c474d888a7719c8fed5a1a171bea5b7783403435855b66f0054018271002342cd8927afadf5901500ac05f86c53f245210f54d4396053b5e4cfb140c9d850889f022447e947e039462f169dbfc6f58ce8a8aea3eafbb0bc57c5c34bebba106411e6606fd23a31e468e34677db5c4e9fa3897b05a4e9594dffd4c3c8f3957fec8fca9d6820aacd586d280fdb364cc83b001d5f4a167444fa461e9c37a131bac23fff2c500bfc4779bfb9e6f07548012df8af569f743aad0349c1ac04bcc61f949324284db3f9c84dc37e19508d5d9e4afa3c1781ea5bfbdbaa0d40f54e53a8146ef1bd01ca96fc77ef2f06b622dd645bfede60e92533b15d5eb753142cd2f845afbf41c3e309bb610b9dcd7642cbc64e9554b5dc09e3cec0cceb778d66891f6edec41e67aa4229fec60ae15f7bd3bc5960e5a6a8dcad120505c4071a722fdbf28fdaa344b132fa97f601743151eacb3bb04d071f4c566ddacaa02f226347a9368545c6f821293e6ff3dc6ee11c203e8e02055072e0cee63f0b062faaae446e595041561d57b5c74c6457b58e747fd63d7b1e9fdb12a1ea7c7c59a5d9df42de4c61c0fbeb55d946351ca5d78f41f5d569ad82766a6c386010d6e93bbc3b50cbbd06658bd416ae16bb3147a16131892ce84acd8871111c7e058f28f401518ea00abd0037d6be24195d0844e17dc72509aab8d39d2bd47cb43605ba4dfd475e603ebfa243ebd56a1f6544e705e59899ec3982140d8b783e523d54e2998bdc59f6f7e76a729184f09d780c8235456a595327298c07a146d4a52ab9f24da8c3bdfa6e77f0dc216762884adaff8c582a300daf4e3c8a532817a3b6c015328e6af6f948e239c257593c61da28d00b834c1b23ebe44a61c032b96b435d5a1648d2796e500600450ab459a1611b9dcdd78afaa382cf31f1adafeb6c49eb3ca4af14878d22f9ce1a567b1e502127d5f4ca85afc070e5f59aadadd86b14ac6e6076d247b5807e14b935d7b05c3686e47edf3f9c03f0aabe274232953e2199073d78ad827e77739da +shared_secret: c543e8af9ae37877d6df73cb7c52819c2a252a85bbd12ca9ef1990d73aedf939 + +# Official test vector 78, seed: "6a85a61dd08c0733fcbc158abb49fe0b0d96a50dcca140a2e9f5a254f1901985844613b1c656c0cb0112620591b88ad0" +entropy: 0f81a5f97082121244403da3feeb734f6084b314b8d94beb11627aa6ad1914e9 +public_key = 81fb1c51f687aa1438a329b100805f99f016d9119d2d06c1a6978569e7c40cab47ce5cacc4d35aadd89047a3bf7175cd8833540b8a028c27461d334b3f8680daf57313d7713a35075ce971cac3cfeac02774c3589c21232d5a73d959705be77c3ca0884f8a1c3a89a1059972f115257bc0ce9f13271fd73e7293bf944b82865986a5d56e6c9c825c83271f42908c0953fea66de4ebb820013fe9aa9522ab4ed66334de641f8e66766bfc47a7a5156c182c0bb3628b81b59461b05e3a11d945b36a3923b12abf8f698d1234593d0c784633cdaf09cf8f4148f6320b15c48aa81b1fc3e79fa4055599935e1076c8c1780b1910af4ac9652249b0c64c94137132a12ab62dd265334cc46a3444437a74b076039f39bdcbe2016d8402081949c8e6066f09839cc0adfb5215590aab10c51bb03b68701b0692d1c5c47c58d214b139b83562728b3a771f25cb7638077c4b6b2f83b11df2369ebe9b4e51f36be72bb04e1b591852aea0cc31d1a774768940d73801b8ba23f71c542c8c01559862af4950b7e21f5d4abc3a1104251574e5597076f971b46c370fb1858a1cba35353d29a23db9e756c57a115539824f5375080990b3835023f448a2314d08c6897da5ae35325f9a6107ad4ca05d653ba78c5769e51b368c200543c2a2884a2d504a73827009d166218a981189b5556b38df395ae007772c1222c3e2778c34774c87ae0931bd116c82ae33b3454808e07cc5c6d16c5108c155a451e046260067c6fb0181ae084588017fdbb7ae63e96321290bdb4b3867074e6e684b700b7d5b1074641c5702e287d257b8a54597667c1ccc702f735c30bbaa84bf405123602572962ed89c2d7a3817ac4879d1392f9199c003e63666f1cfc6f91cfc9386b18615bd36913f010270e8a4a9a99e772cbb994b4ca926bf8a04cc1c20c885d2683301cd8c7b381190b0e3dca0d6c33fdd49465fd265781a16fbb546e9b6c6ce0462c604b9fff09cc2d4608259284b8a83a877b9fb18415cd60c37b0b3d6a48c803a61b0a5c9675018f64a013062440f0c40c62055cca7bb6cb9a293193485fc529922478e4c620a73144a57833d3b5b9bb222f2f4b452447cc06638fac1b4404402449a3cd60bcb2fbccdaea42086682ad7f972008276e4e5449217088b485ce6757eb3410c62796d0e7a643a3c72c612ab165475f6e51456d498e858aff563c1f7781035fcab3c85cfa2f207d1e4703d3015e14689fa0c9b1f57984b678baa10cace44a2fb23bc1f317d5304552306183435c62012b2ccdaa9a744575f959b57b9ccc2c28e1a94959a812da6f259d11479fbbc97f54a57a986be61f49ec42124da687221aa3eb3b2c0298249746b20cba291f1633e784608d5897da13a20ea377df6b95198132a7fd526d065250f97525d809bf9cc7270c7b723cc95dc9c8ddf5113ec4c8b3cdca07a7242034741a3cc684a998514fbccc435a8a2d92675e6c3f252a7019a74818689574c6ad907080954557cc12e1d47ca23240b78c2301f39c78127180c268b76289132aab01f457adfa649a4324a08e0bb5345cc2ef90fe6e33588d6adb499b04daa642fc01f5777bef8a7af04179630619d13ba0991cb36e8c23f16baab09a72e7388c93385331f7b5bdf420f1e75c7ad28c54df96df3f1086fe4120843af7c7878b4483956b022ae05112253b97e6a61780ccf4047589ea04000d57593622983e8187a6232deeb59f5e147ef1628a9f692b8bccea069cee6f49533b7301728a3ffc85d7db98398ccb38523254f843dd79bb58b4796a1fc6d68095b8faa7ff9381d01d61bd6694f2c225c46086031a86105661033948c29278e422b304dac9817401af89540a29a1cd6093c86a3878c226fcae156b85038f4ac53579143f2f5854f825b0d45bb974b724368814a9487a60a6e41261470935a90ebcf45b53279c67d92330556e99606dc22a2419021896b2eb750b2479aae7a706b1bbdd9514173f23dd3066161a0af8a6a9ef6aa7efcfb1306b9c421f63be2e376f747731a233a45a8309ba8182d24cf6598c26d65c89da9c9e9e6b9579a4817552a8d355ede798e09781b387c9935333b15d92998a4c736d266dfc2ab61708fcac7b821c01044492f7f4bb8f37b5026790f3a437cfa63af88341b95a8899ad31b37491ce3e42fd9b3701a63d537569b75a6b4b362c14f1b4ba66ab7914c9900187f1057 +result: pass +ciphertext: 61571d32369b0173448b4bbab36ed34c32b4ffec1ba3370a0d7f9d7bed5e5ad086e8bdedc51267f09f4c9e442e42a8cac476db901c5cb6d9e599f64aab780b6b7fc119dd1ba42bff5b16f54e9379886baf6cf4966d99948f0392ff96fb1e027af8f750487b4bef68a50e6d383e927991b6932eb9c0435895c4823e9dc1f3ddd167309180e82da6a309be4debb3dd34b86bb545a24d20971f850c6ee2d21ed70dca709b78e43bf011ae7a00bd916b0e5fa520622614b5c4d0b8852a72f1231bd63cf5e1b72ecc8b13a26a9af8092852db8a3ef4f9ccc31248a5732a6744835a9554f6a14f8778ca9727ab30efe3cff4f66ac0510262d476380239f9aa249b50aa6297e5efab9e2f407559990c60e3816410912b0cc3d480d54c28af0b81c921d9f2b79fd3d22a33c566930b4f70cfcb23196a9e14b9bb3593a3f995bee0e9bc64c415ef3d9b532d531c9639e233fff5c5360b7ebb8ea11616f88e1dbd36b6c3d9037df99f265861b62ae4634b66baf884c1b72f581e4b2d5f1fca24385a76a998b42b5b9a094bbac9ffef15b795fa007d0840d4755a7bba1417c2e09095c5fe5cee4ecdb2548eb73b8d6296a2e4303e79ce65ef9187b7e7ff9aa087e52eff322f7e4ab56fcb8f0732f336318d2dbc2e485a358e36d70f91ad7149f6d7c80401216397f32f10928a0572896583c0e0e2ab0b33906cdc8b59a41ccb83e4ce9e1ff09598e45c05965b3548f5233b8ce34456a373f7ac51547a1bfbf91ee1947fb2bea228e76a46cb1b6370247adfc245fca831a0ecee168e16e71f87faf6c43f3107a2183d4e5b59052707f4bc2075730986d7e637ba5561feef9cd68951e45898b3d6bd107f236442cae0bd583904f53008ab5d291167f6f53f1e4e4040332938fb59d8b71a48b7274280c0fd00591b2140650b06b3a71efdadc63bd8a6b0113cc763fcc97f367f6c57e3e4456953b667f6b2f98adbcbf85d1815a6a7491a252b6c63c40674fc8529a263f64218b7f88f86fdf5e770e78743ccf29ddce1c499224b0263d080b7ff5174f332041f94972a927adb8c6b9bbda97852bd077b8958e83629530ed15eb82f46751d0c8a01a41efb9bc6c3d989eecbb66719746e218a9ea7c988efedc9b9d9cb42595fc3e836b902a1281a823cec78d6bcd9bcb8fa2f3e0ed6139f007e65c9b380f635187c66d80ea2d1ba706c7678517192bca307ab3bd796eb48a58e22f5caa6c2dd22adeb8a52f0e176d54a3361d0f71bcd46c6e10bad4892abb4b9bae96ced17e64bbf8f99f7ee31d18f635d2e775c554a6c5f0a7545d9071b99e35d0b3e6a943d1f42d977ece6303ebdc53f4f168ffed2ef618ec69967e376a111c39102e9a72c79ddab5fcf5f41eebfe9d6558a5d1e1fdeb7902a56cf436b1449e1b8fa89d5e2c0ab0d3343a84346ff7a9255088fefe8a04718c4a7a010732418694cab282592804dd6b808fa66c869624edc3bf66ef4fc81b3271e6d20ffa7b17e3c7df0c1d5c7f7324176770f8bf89b8f127308fea0bf4f42f363eaa11fe83e790b493117da73032446cca8bbe3ecea86e08ba7bd64f09f48ba3106a7a8c30ea9962d2bb950bbfc4ab12e0b7aa098c763973b7ebace2a7541fecb7b380b84c6ed706f0db059d952f0b3b25c650b974ccc2afa8f53ce2c746afc6e51e482f8d38c7d51ba2f304e89e4b7f5d3ab0784d891aa20ad7fdb03e718f5a092984a82b6bfc8f94c3ad1959d59fa163deae47091768e923f2aa072c8705f19e3de919598e85f13ed240540e329faa942d60f489141e55a01c49f69ff1aaa6961b867ae13b77325ca8c4fcf9a85aa1fdcc2f35c94ab7765f3db7c1502ffe33b73046238d7a38a66a8a21cab1af9ed6d46c39c8d2806ed98949e60be6864a277da88d93fb3ea64983c8d492552bf108b6d02ae15d295b3e071ea002517aaf1484bfe02f20f9ea52a4761d7bfbf220620ff5ff5a5728251f31f46efbc5526f04afb170766c06c856a355e831ec6bf4506812711314c96ec4ee7a25243d96c768048b5b2a527d970519809abfd2f0ae56e0e4b20dce86f28aadf9eff31caadcc7b4b52c0f285bdd59ac272e7a8a900e346612e2745f51700ca7694e4c85b13e25fa4380d6b4f21ffebaaa63aa12e3796be74ae4569ab7a19f7ca8adc75a4deb44281cad9baf579ab7e1848a30b734f85b9a2e335101f6227c9545e438e84305a50 +shared_secret: e35bb159c5e2b555d89b163bbb2145638ac948d0b10efa8c4f1f385fed047f87 + +# Official test vector 79, seed: "7f4a56eda151e7b097cfb8ef980440fff707affba91867c89522ced6c5ff3bd7f5f00bb49ddd615d9361a7e4efa42851" +entropy: 31af9345365549ea0360169ed57daf98cc5444799d4c75d9f1f5d615e9df8a91 +public_key = 55a15b77118695a2bfe69365a4474cc5f1bd3bc30beca40fa5ab05198b708d58110aba64fa4a8e5f955bfd935530b95f16ea816074ac23f8435eb22e85b7621481444b699278082693f073d623c99764c759aa0d6d3211fea1a61b048519e142eef86ec20430812c26aa3812c42471cc8799b80915222111c96b09ea063518c42786569101f81eafe3229fd85900da5abac8a84a688bd58a03213ac8019929e089a24ff8c712a1751856722fc7af3c57bbf95c77c38c85d3e481916c75ffa371d2a0c583b03d301538cf49c744f429d2c80e1ab13c5e126ab6d3ccd733177e469e6a30cbe0c3212215b66f57bedbca118be24c4a3267a1e65c8f924588e9b10ce22157650e64314b7643136e87bc141c9a01dc7b746556a1ea01f5aa8d22671be3177bcbeb605093a225e1a847c6ab78ca89c4d3a4a618932025aab56646a974b088429e182308dbda27fe6a0a7f5a6b36d681cbd94ec205a018319a89345ca5715ef79266d1f67dff2a1867366d14bb60625b9883740f4b3627ac385fa728a51c162401d86c4f2385bb9661ca891562523a7a66111195bacec69abd4c35ba6959397664ab56a621a25b00c5aa2c0793487a8b1b5847a29844d6e8cac42ba2aa3586ce117b010aaa324236855771cc999929f0b948c671b4a7ced082358fc94147f86fb01c3b1210bfdfe266d1f60a72baab460aa7ce7083d4b913635332cf559b121a26fa643fbb7553781847787c8d78e9662cb82941627bc863bc79799d4681830d3b41d156384f157e3ad27192b92e47c106ab6c1304a3b56723162e933cc28b220f45cbb9615cc90aa3483cbb9b510e7aecbd80b28ba3a51e1264b6c6023c30843462f33faf090e43555635c674a80679fbc88270ab53ccc83b79673e296a1394dba0bc2b421b02a0d4213890d0093c19384298b039b5b8f4f61a2ce286bf11b9a6c164bb5a269427999d707c3e62ce88d66fa283218ef393a4ec7a35e2a927b92866e5976e1b95122236c2800d2b4989e0759ab8bc1f37da21288ab22fc4a13bf8068a9abac80c814d150885762275c638087b643b60b4673408869156d52ca257ba50ff1354f4164b4d29069a99c7805527c7674c2dbbcf26656d110823f082bc88405299e093195038f7562b11daaec75668b71244fa6769a18b2d4643930704199f0105082ba91ff44f7b6bb339f243b524979ac51fc92c6b75711193fa29f898141a6c444e2850f03353fc6ca27f0023b9c88f6c0b8aafc9cb9981c460e2b17d594c7a60b6e3451c9675c923a7b1645c4d3fb28b1e42ae1f93090b86659e1a7d46183d26f380a2c046d9028e9906cbdf1ab605367be6a5609e79cb8dc349c739b7d4f74007fa69b9b50c94223e214509b2e057272476b1653d90740b0c059b1d2845ea9a57cad384a2c7cc2b926979f60fde47bfa01a217cd3c43bc01aae86642b84b79ce58296700427c78b7f32116823ba964379f1374e4b164eac108234b12139d580ec4bc11be3b62442445409204e1a9459ab3d7d33815e76589ca4009b27ca2e6ca470b61504569d0e70155d988b80988cda1c9ec0da673ac2497d6a2fe1cb8539f5262bba5104a4cf7659a616755cbd6a1cfd42a9ee1c115158a66af0bbceb149dba4af4ed2a128a988d8aa5c97164be56483e1816e52402b908b12429c505d0a3a4b2366a7bb38169497e7ac0e3ca8ad8f9636a54cb4b4d667d91752d6658a08416d552c3ebee80a613c41de4478611598bd05b34a66853b079481885225941beb4b67218013a3772a60e55aaa25ad44575f45a3178d37af2786a76e20a5a8719d84e693f693507aab4cb43c55a64339359b8075a643b7a696c373144a743288c37ffe36c454a45444c2a48c3c7d0415c125d133670ca1709c7f80897751fc8d07f30ba0a3b10f7110b03863e5b040b7942c6a527008f7952b89cff921280296955261ca76f50d1dc0a0d2b8b682d8459fec291c27c1e281bbf5a17dff0c0c75a3bb4c987f30b175c293931fc444728ab8590c6095c60542e6bbd2a39e324b96af61328ecbc54da1a44ca7a175c61a131610bad5144b702380d45b5df1622f3b2a4e640457ac830c8cc05ef95b4429b599983bab346a47443575087e975a57ab91601ee65966b51838108117934a5f334979349e3fdb9b49ca49252a4214b6e298c3b12e5f6e85ddfa7edc01a03b27468684972318831a +result: pass +ciphertext: df7c965dedf9efaf8469f3a6b7a1a1031590bc2bf82f05c498d073a2a4c604ee164ae8a135f351723714a757517c138457e6272f7b7666e59a5ee0bfd374bd364d8deea94caf7d807776ff1af1210612c5a95a8a8deffdafe4a5b6e1aa85d79808c94f32aba7b9874961e64639b52a790fb5a24537e70b6a0070065d51b7684425558c34b044a598724c226a7d1f45c8a0f4fc1c07e7ba45107820524272915b31a1ea3c18b890d3057028af0018e0d8f50214a78fd8c666e567b65555b91a7167c8c3e738444377a109742129cb53ae56dfd923d3b1aa40e4bd0c9f35f1346d622355b23bb69f4fc09f28adc5101ff08ccccb9ff384a40f1810fc009608ae901913f8f7e3386d63298ae6c34bfdf4c17e8069d72a8b490988c9808401c7de5b804733ddadbcc97d9f94328931d168380182d823cbca3542439ff2e82bea058ffa5085edfcb9fbecac507f50922fe1fac0854edaaf5b003f921ac0f95b710c924377742ef3aa4494a2a65c561754145914050df0d8ea009366b6a75a40034fc992f59ffa93921e4b8db5e46116e04f25b648118f7a5e226675c1e25abaecb5c2492dd4092bd2334fa5a4a14c067350cb64f566c4997af1f4f6901d70c2f9c4a3cc0c6eafb6efd830487a339c5f63a51788b13be38c3ba4fac0a64fe7e1bf513853b785e98283763ff23b730168d1debfd411a6d529f30a93b482150995abafbb8fc3a712f32127dfd040459e947bcba53814bc9b512e857b94c6d1450d26fe17674b7db6cb33afba1717ec003642769380553bec6003eac872b8c3b3cafffdb3d7c0601d493f10bf5e6792e9a49e86fa7393a3c8bea7bf9d12afe864e7201e2887053b67ee445486646981e0bf3e6d93eeb178f6f5a7a10a3b596168ae1ba4c1f093acbfa879331f4483657e43f9200c5aae4b0557a94cb01bd9e2dbd6cc0ec6707b36565c0faf3619ce98f4ad0866f9f7314aa5996383d04fdb08340a889f3478dce0d0a3c0fac862270469a535ae52a1a06a95a58ba396e1c8cc4d7da22fd5f68c240653ec20c39f705c998bb37ab0e173207c49970d6cbe68d74da764e70a0432907cba6d91a307d5e57124d405c1928b429d2ca5d6e2d0082dd0548fb0b5c41dc65968d129328935b169c7b8d401d29588c3dfae5419c4afcccdc9a3bcae8853fd47226867b9f864dad3cacff59cbe536be7e5f1ed1a705798874db514c8230483c4dee889acceade05970292e7b649ea429420bbe0cf166d4d022cafaee141fa08baa7af787cf1daaeae2edaa53f764e6d233e89f770c647473823b0db4bfa8403655d1734b276d09f58104b5892180c7c6b8f818d9a924900ab3c6cd6945d5cae4b6d876ca609839a416843d202d585ef7983181df3bf7040962f266a2f09f85479fb8f67acf20c306cc1bd191bd956bb99058461e9361812b14562207ebc7adb0fbee7dbbe7f9adc9bae7cf759835c780caa24c69db6d7922aaf0d9174f62d10ab7d42bcb152991b0673756b522e95a0a83231797dba4c9f486da9667506e37cbcc5aa42d54a6009cec6da6830154a8ca40aee3d4e2fbc4d813036500fdf5b2dae8af33cd86726e8b344a2043684f3cf7bc991d86cff533c6687df082b595d4d6e705c1b0aa28645a1077569343aca38f19149267f8e8be8a862cc6dc9370528c544bc9aa31898906e5f64b2db77e3128f5b59adc526f6f076ea70942eb44a2d2e6151db00c3431b39bafba841d40a2f686155f588e41fb1dcaea9156498b1ca82f1c68c6660abf20c6deda010290cdcacc2990132483b2e4d90de9ba0608438638c459038773ea3f1432c4fbaea491d5513b633a04423b60b3ee6f920ceff200fe71a8798adfb11d5607c57dd6e53e7aa8fe80375e2a76f82c8d73775d1dad6080a9f15eb51e2014a912eed3216695270bee882eb0559141c47ed66f8646fd3259297e1daa6e1b6e93ec7d170d4c818bc53b01744f4fa613c4484f1abc0ea225d7c15a93ab1401346e72baeb992b049bcbccc641a142ec39c6cbfd554f9bb3acfa38c5077a63dc7b2912a1eaca455fa295f9377c993237f44263c425bbf8ef5dedba0daa909f662cdeccfe2c67be4d03ba13d3090796db0461cf12256bf65e849e07a808d0577c5ebef283f9000a0b136f50e1dc35f29b01584b2285e82b1862779d76c59a8ec6200fd4901996d18932916c9dea3ac8ccae015136f9 +shared_secret: c10f4e51bff1a6f49da4cf9504d8c0dd1832c0860090fa892d5de6be27102354 + +# Official test vector 80, seed: "09fc004519bcf85b20d25d314a0dfc79e00cb6262a7dddf9c52473641afb8cfa0f5dd5f53558184caae9ec34b459e98e" +entropy: 774ae54093d694ef40b63b62c73e6c98295f606feb8699807eda1d030ffb996d +public_key = 31596bd912527e2c965ce3344b4621190c106f5084836006296c37949aca196c426f4783b65221b9c50827c85b7067a9872a6d9277828ea9385f9b512a8a3e897628d1aa36a5206b35fb219ae26269126b75590b2d1067419b27fa6852a3552d6ce48c9193c96a3131397166d47c53eebbb68b949a5bc3c7d585027961aab89b38f5295ce7c60d3d9009508769ee37a48de0685b9228d998b883d871985108b49c908390cb68147e8bc561df29cde02b1ed5236ed77b23b3f32e687b859dd63439890d8735640f5c073bc05cda79603cfb37fc5ccd28e98b4eb169271408a1cba57d21afb87c97e2044766b38280b6911b95725d5a77327764832603fe771aed89baa1c8b2ff49b741081884c6326fa0693fe64551402301a0552f49035a262e9d047d8a2075fdf6636c726f8b6098fb2b8f01c89e87478dc1112c37f1b857fb13cec53673e297b8aa9612d26a4cd0c6168c9dea407133acb939d06a7c660581a877f046b9b1138f6fa6156be2a5bfb23d04954fe32b1272d73e39c79094864cc9e36e46e9c8f1db330c17a0ecbb332e385769c4c0ace7c0b0d49fb89503cbc13ff3a1b19f421b80855fcb947cb651ccc0a7b55b5100c09aab9201c4ff8c56a2d90bac255a3665a731d07b8ad829f7a7b556ac12acbc1073a40b7c36059edccd97a50c493359c8ba390e3716921a69998b9b111c4dd283456f7b61ccf97c1dbc362e2760e2928227405e449c126d7526516298f6315302288043085808195ea587118d731543f09479a2adb96884b3a620d4c86123818cf848b295eb0035211bf614b077871db1d8c779d61e90257730e47bba178ac5e28b8e47794517727e4049dc759ed5a69cf7c66de05c0a5a00c366a87f7f2914e1e059bd1921eef61da9cc201f016f1cdabca2d2cd99e1884c114100ec5fd0f415d6fc6222981d8e4582dd138d71a368bd5590645359cf767146f2cf5f7a58e0e1becadcb1da0c87fd385c4ad15e02836d866025d0d815af61b564e803f0f0bda9a1ad0a3b86dd9a79b29792a713c78f00c55668aa2a0962b4a9be8bd9cb6966a054f0ac39182ca4d54fffe197891b964933aa8d60a87ab0af08c139a8e79b7a5773cf189caa615f64b973eb273edefb27be439ddff2a1fdba7f2cc3c65dfb0d0cb177b7ac49ad1b4da0725a3f3a2741fb2c82347dac329657c9bbaeaa948102295c1828b01c22ae45cb0e0b46a68837ca5c8639ab483eec5b4dc9caf028a7bee18accc402ec6aa57a93a1c53a145e923194341bde96296857890fa616d1bca0cadbbba3e4302e55286c58a283ca8d1626515e6a84881aa692c662a3567cc294a23059392887ce7a835f8b8030f5c1060518c71e0c5621812d54d50043b73182fa67de92768c63c4a2c562ac151342fab8fc9181be82301404792a94258b98411ed093a9121699ea13fc822bb5a317b55c1167ac12bd8c3ccd9bc743a634ed6a0961e13ad91a779a242dd0b9b4b41a5da11cbea085032ee2382c4b8ce088524075cdfe7b7c06cb6f2ae128f4f7a6c5d58011b42b8cd39a8a0aaaba14a0ea8c9a72f322693410cac54c3ee5487d726acde02f9cd0b027844ea1c018e2744571c3a2c36b4e0da088f09ab939152e30696cfd3473a085be3eccb53eb406b66c95ef8b1cfcfa1df8c8238b8c129abc9176e0864415852cc8ce13970fe8a76ecfe246800997c56668af974605e748e3054700d7b75fa182278309e41cbe5b4a17696c843fb4ad72471bac747faf30c99d2433665433ef29b64870ae8a3593845ac211ca4af0e5aeb9b8afa5b4419559502e834f993543353835596985e31529c1482d0fcb9c11a1c79a704db1d531bd0774f91b6810b98766a83387387c0682584c94793fa771ab8b4216455f7a117c65e5a481e01b5bd8bd0a9263635815f3c13c7c6740d2d1778ab47d56c9a37ed4a660249b8a4a02cbd716f6a09a646456c4b54cad68c86f8b998855379560692cfa68b5176309162a7a506b28e042c25850a7e6357ebcce387146b94a09fa82ad2cda8123477f926757d552929ea72e379a9bb997bab0d1aeb5f02568e7715d959168129cd58048ab1299eec754b9080e7337084ddc37c4695b75488effdc370edb65655231ef1091d762b8ec53a3283b3f7bb5114429c788a2cbdce1c0454466882448990d0c963c4dc08e6955a7aa5238a6347a0d168a1ab143347ab4 +result: pass +ciphertext: fab59e039993ccd4f50ccbe8c886407e46508fc6d007172a747786974d2eed73538e8c47ffd4e3d961be7d83ced37f11f3db879752f36cdb659ce2b77c1c3096a6406c3af929526157cc49ab365f9f5fe8b60c1b67ae8db2aa260485538ae844c06a121606c3422910dc3afbb4119bedd73a800ce1cf1ae6a4955367a7dc994fcc653b4f94652bea15f60323e6f2dcfc6fccd1f79085a8b846a0ec0f334db86482b15738f011398bfca13570f97c2e5801b60a5264072a7011b98b9e1de2651f78905842fb8b22da803f03211ce0e4b39c6ef8c7c73e611aa8e5b20c9295334e9319c73f5f78956e28a008e0e681a193ff229f375ddcb2a9b9a750bd97e055f6749af2ff6a601133fc7a069c4f72f5ad4c930b5d37e91b208b4e36970087ef4200972d204e5a3fcad1f033035e39202dabc309263834e8ee8c45f6d3a8ce7861e8c639a61b0a12b950525bfdb6b45d813797bf73952b7d6be33c489a4be615bb892b171c3b831d609cc7a5326409a80b755d08634ba177a98ebd56fb89b87678d8be5bf508dc131ffb01500dcaa087e75226a6367ca24d0f7f2f9d4a8218e50f30d9d4a8eae36bda94660c194eb4fa91881632d2e8f2211dc28b7fa24766793eb3c9a969fe08c7ab94f655a7f7ebc5599a766ad576da9f0c9bf04df04118e6511ca541512f9826aadbc59c431fcac0dcc1421cabd3ec85ce5fbe31fee445ae4a418462555a22ea3900f29ad77b231e2ff51cb4d3713d83ae0d5581c8db197bcde4ca4e42be102b3bd240694c82143b683778a868d574204a1d02e34f2fe91130f283ac40ccc2efe76bd100c780914af245efc5483ef94965dd8e166ebba97883cd7f1ddd5cd623e5598509c858f4249f4673bf6a21e037b6e804b7e2508dc8ed0cfcde042b5f307c2faeb68801ff7e90738643af5fc46ff1118661341caad34d327e1ea28c8bd350bb78c277403129ffa723e6839f0caf93e9abcf672f8f4a074ba3fdf216f040fda8458a7d9581f9321cdb541cb61c7956a3d75f279c1a832b0c656b9de198ec59ad87ffe29f31224819a7c57c178e52c7209110fb9c0e63d2b99b8257dfa6a1bcc6edcc64d7a64f3840fc2b343175bedebe7db7aabcfca4bcf744c7a0ea8d2bfbeb451453597ad97f76d553bb2bbdd523462cce707cfb3f2d0d4bbd9ebafe0bbaa2116b2f00d6d543678575a1a86da89566974324f6fedcee53702d341aa57e4653757d291867c2e63c8e1ba98942193f60d6da8b7232b672835318e9ad102eac0ab89dc06cd4dcdc74f19848dfe0ea55b4d9d59e8dbc1a53f0d230e76524c658f2e12c01bfb4ddca8ed4f6c21b2204caec44a80b5a5768bbbeb65b36107f34f3e786152d6e0d33b11be83e255b541cdd1ae99dffcff273c55b665fa09d7a89de5bea528e6569e525f683c32a9f01f4a8349b91eae519efb2d5da8c111886de94111dc6898527ec85181e974fa77130ba19e251118d9dff1149610bce6c8e5507a4b266859c2e71cdeed75437efeb9db9b6e7a201f7a32cd5d0ef378588cc6cea5387d3a89d38c93fb3f2cf990796a23bc73d07f427e90173f173dbdc97ebc03a557daea271d2ea56cbdc5f19af6683e749a4e25b52d876fcb2f05a4ab8b616ce7dac1dce610afeec8e5fe12c6a703698049a32fc3532ebe1520d95bb3dab1c89e430d6a4b87e7520aeba06cc7dd15ccf6767a9ef0bf331f6869625c877b6986157f39788b4c06e96f5a380f352f28cb62f911a72b5eadec6ccde6adc51f5d18e56629c831972b3beb4438b8cb5e4f64c05e841f199459c5557d7b3a78ae92eca093f417131f237e4a27c0f9154030e451a9a587d95e6971183e059ab37ecb9ca97d8ba4a945dc35c9a21a97fb7c2ac30646e8c1e7fc1b2a7d594dbf45b6060073bbdf3874d7f627e599491bdb11f33fb0475dd07aefc14909e78ddd87f68d085880e8bddc6b39bb7621cbc686803821e34abf5f82b9077724652defedb728f963a957ebe369256c18a09992de7ac7647d14f7c094bd72b4baa651937da84c137d1f407147d335957a1ebb86e1a25eb962a50159b6637dfd25d5d3ecb417b4c19568af0f6c00fdea172fb7061580363434d08fab0c04c6f3867bda85851ec12558bad21ecea88361575c76e423fbb1ef837bf35b1937bae52eaf838df96106468b8e16742080d4afc19965d4f2ff36de956e77a9c7cdedd7c +shared_secret: b515a69280079b7c57997a183bdc160eaa0ecee319220fa690356aa42d0b59a8 + +# Official test vector 81, seed: "e3c41cca6f04cfe7732fd54de30cc5caac93e2f80e76aed7d24a962a3969c1b6a311459a3ec3e510e3e9b1e4291d4d7d" +entropy: 9f27a47604ab5146caaf0aafe6d149424f8d66e39ba3baf5e6c73b19221b7e21 +public_key = d7e9bfebe65e89997ce4e680ce385c8eeb2862175fbdc9b25dc7724f641ca14b1675e13465d634915593a228c35432b316d295dcfcac909b9aaeba2e93f6028be9045610ba38c763c08308a1d6b9b8667b500c649b94cfa703432f8695377462ec6159313a184f7349be26512759a112223af1b12127f5566da94c8bb19765849f9e849a4f235c9df3783627b3e548242fe2cf506ac1fd09cd5067422789ca6bd3ceb0e516a2e88d0406abe03b65b0f064d7600ddc227ca460cc784652fc1168e8ea53f825851a222eab10bb9c8598e6930a2abb627ec5640d4a3c6eeb225561ae19f20eb6d0536ceb93145c7616fcb46c04b2076b9d8a4013a4bc527848a8972b0b6577c50f63194e6357bb2084fae54c592577d6c7a61b79475fe1c43e70980762132806a7d25482ec2a0e19778aec2685ac19490c303cbee96e2992b836305b58270553d07184507b12c06510437b5c78b3f5cb1b57627da57611dd3361772a213e033dd5519666d18bccb13b3f751901d601ae131ff3c061af87839692967cb88199f1770ad0ae196388ed6b9746fc6e536443afe04a3b92352acc4ea04173d00ab9e3eb9c1cc137b2d6b14fe36dff9591b5300853a349dc23799d8209e811965ac84090f34d36382020ba31531a0dc909b9ed725ef6120929228f48a94a5e04d03314993fc8b306572a4d5a7063110c051011c1b09ee2d09315196f09192c329565cc5a64405c3acdc234acbc0a78e81b3c9523c43a2fb961873eb207464a302d8349ab50167ca33cde091be57801b6e850dda6c5baf498ce1897b247bc7e1a84c6b141fb00286fe864a9f27db6475ed24371cf0c19586750cf72ac1cab46ce08860090a0c1322aba42cd902b6c05f4c4bab667b54b0d5a04332335731544675f80a2ade66dbc075d7a9b4ed924417677b6e195b902842fbd4390597c28a1504e161175d259ae7c44333e742471b58756c0666900cb94d87f73043e940a5733f89ae3e8cf037b83a51b4768a19dd1a96729216c7e317bcbf60b3b07cd82784d964754a440ce297b40e3f8811834885ae76a9605a249958f02d9bf2ef0a195d3603261560593a636b15dddc681ab9bb19ab7ae95d32ea474388d81585e49b463b47033f81964481f46c229f751a930f6a632e8aba8981cca880511164b8f09a8bd9ab8c07bc8a28636d0d32bed77b2cd032b18090928f01e192943e028af329b4b812238a3362b5e2a61cd7b3691d06148703d692080a6c755c560490cd5b47606ac9cd9bdb927b6e3b26d9060921757a0f85a2f82b618bba9008b7073f24a88fdfa922eacbd6631c32157b36150be06d3ce2c4b64410543ccf280143c1de73917b816c86b1a04204a8f3fd7cadbd20b41831c8229788aba219ba59af78388c2b9865eb3000089c6c05c850e91021a5328149cb2a1a27e075a3ec8630d8f515cb77903fb5531f6e05ce984296669b0bfe8af8ae59438b834d4110ba0606ee426799c313233ca9487ea35071871420c6825889c07da0f87f1188d75650e36ad21a265d4b44c01361c0653b55f409ff3c290d2c2c212319297d5aef2bb87164b7535b7518ca14469fabee91c81384025f6914c19018a0775598ad4bbada98e06c87c9af309c73903ae1b84fa9a3c3f668042883a8195cea1fa5bdca59c203178eeb18041aa2e9af770d180be044bab1c8c36044a70e50281540501ad6b165c021e53b86a5f368728e2aeed1520a09a48c1ea0e9419b313d7c6a9e59f17121c8ad47410abb73e008c1ecc16c32b4a46f39712648cd06196ceb8a076f5c7048a3aad37393973b8679c55393137e6b6ba2dea4d50f65e1ef12116598de49260112055f4b0acda503395e242b990398943c18c01cdca993b3c9a74e19ac6768581ccc9a0331c005ce873b241b3e5e497493ab134e18569e80a6d12a04616911f9072fae6a30e529cea1bbdbaecc7cc64a7d655a730335e8a22b4f4250e2c54976c69a161694aba04456bc14e2bf8c13b1ba2a5ac1a6b557bb061805c903d1d1aa3367922fe0c51dbc35da6cc8593b8b3cdf741220126eea9cc5b9c0632f75c7aa3aad60a46afca4a6d166f2b2ac858c2a572e4cdc2d65bca199cd73367b83909fb324855c4899d920a32b3107ec56789d63c25036c35d30be5d28d54d725f1eb3f924bb991cc4c5ec2e36585c0133b82099b8234cb459a9fd8aca37c4249a3b020 +result: pass +ciphertext: 7c00e16d0e64a68ff48151fd02eca316fdb77ed8e12cc3cd318b692e43db05fdeef4ea363e297d9c32f8c079977dd3915db9892dd78cb2b2fad8bceb72a953b03ecf93afb749d6486b15bf456e83d554a45c0cd8d981494a0f40a511a259d1d6890babea2f1c770900c03d66d26331c9fc126eb32bb5135ad7b3b51c70c64923b8b60db51d96f87cb2626626282b8bbf018047e5f3798041f4598bf7f6ca93e0dfd8f7caaa104ded188bb13ebd5fdf6cb21fb9cc9225e63d0ea3017805ad509e7d23e76f1351fdc02584f65ca06687c3db9964151d6964c6799165775f60d4a91b5e8b41c920c2394e4bc587733bda3107aa33a7eed8d62997634591ebb7d69ea547cb2d74ed7a7f6f0d036681e4e7d0d5079e544cb657493ecc0fdcc8942f93df4a8f404a9ee4f41c44ba99ce3f236ec1a62068bfa6fb93a1e20dc2740cf9abd91f31d9caca34f4c288be80492cb589e4b12e4bd73b664c4cc33ed3559325af26dc8de7b0548d4a26cb0bd8fd587e871475318581056c95256fc4e95a84ebccbe9382ee1c095a4581005713bb77d2d19a8c1ceb5a1bfb4005849f0365d2503f7ed6d849f377ef66888402df896ed571de6b06793da6bef4f6ea029bc014065a7784f7a83c92e21cd1c7001770b7781e894b46aba2e6fa40918a805937a9b1ea25efd59cdc26918921b0093001b36877a010209fdd9b4f5c61d4e7b9d43a2f91e72d4b24281151950b73de9de304a6c1cfa8e33cb5034d1031a6ab4d3dbf771c585654663bf592ecde6ad53a5fce007119b5b73a4103134662cfed595a02677b220cedb31b78c3063470b17a56af64024ba3cba30eac461a12b79a9ddc2b439ba2eb649defec5b2669830d6aaa8865a4ad999d8520edcabd5c23de6faf4d390afc3e9978f127d087f14d2abf2951cae4c62d7ab91cb634800c7db777306403c5023e97b3a0fe0aca6466b6d8b58f6f07acf1f2578dc30d283ea883fc3508679806febcee954a9a285830a39fba3781fd179f5068b9a7061cbddbfb466734334bc6a7deee3bb569244782bbd3c78347ebaa66c84d628a0c9b26b6af95a116ccefc57595f786b17967e2a21695fad4e76a51c1f697e8069efaa15bc10bb0c28b468d61c492bc4e037fd612486d746fc2217093fa025c80d87cecc99679887b50e31fa553ea319075ab8a2e27e87a5b7be0d9b0c750674c440235c2ddb8f6c496bd20569b52fd84eb264c67baed5ca95c0dfe125b06f4e68f6354c15cb41514a45a2cc62aa9e2e4a18cadaef473c983b0f952fdbc00cc3d5a960d7644484ba38e3428dba2c81e8c76db05fa606788fe32b95b453bdeec8cc778bb3221a082d453da84fbe4d4c7996fb2c98d2b06ddaf26c759106626728e6db392efa97f0c9707827f7976554d6479413ca8ea2e764d5992cdb7dcd64bb5c0bc7b213cd08d15af938c6ddbd1f2d5a0cfb0240fafdf31c0e9857098de9bb7883b8ae7e78187ced571a9fe90edbc6ca0a250d842b8a2b83adcd32354c66861784d7355c1a93b8b26fb67ce63be71ff7700352f3c5eed0cff007107a47847322f70d785b260f74afad72c98cfa9b495de53ce8b0bfc3bff0d88717ba8c47569e1f85ef2a87302976fdb5d866cb156152aaad33fca306839dffd063386303c568425ef47613a0de42023b1a076961c27d29d258c24246212883803d09e96ae41e6aff74812b7d55d00d6b83575aae548395f9572c90bfafd6370cda88b222a869c117c1d4d8276c176c44fd9c2533fec2d41e0ce343f60aeb7a8560c2241a4c97c1c86ecbb26b487c5be4ae37d69d465635db14037833000389b89fa9721b7fe14a3099e2dea671c1e63452478227c81575eb229234c469dd52494607b004d9380bb003f94c98290020569c244958716e584ec0eb7b4000f9223eead95e371323033a6d7d966e55fc5b38fb3881ee162d0e04a40c448a42587c99724b408a89f1db02c57cc8c0074b117298f9fa7eef5cee82d256b85ae755dbaa5838cecfe2e7da59956b0333478e46c409b493b3760c8cf57a8fa6521132c9dbb1ee36ff60ea6dc7a9e1af615f1dc6b81bdf00425d24e4a1431d1e35698b0267eb73bc6a512eec505f69becb384367a1d3dd7720f1cd8ccb582b39f3a66e5a0090ca722b8a7f9ee59651091d241a623aaf4588c8945c1c8dde04d2d7a48023c6dc3f3b764fbdc23609f0a9933909def +shared_secret: cf55eba9c0e1be66a0023794be974825ce8f00444905499486176dfde1838c05 + +# Official test vector 82, seed: "373fdde922cfc416ed96b444e445bdd0962e8989f6c50adf9912a89937c57217d3600b06c95440448e3f601ae69ca5be" +entropy: 90044031b7597b5e60a4f946b713e8996d0426d2cb013243d9b7d8f8ef159a0f +public_key = 27c546b8f148cfc133aa807fd7c233c7b5a5c3f6b8da210ef7dc5c1a834fd1559cb2439406895223991a4e682554c63ac3a117d840aa4848b1b3864edac960c656046e3bc6d3b681e1e6b49bb0259f1aa2a4329b2598b932e26c00fdae2cf4686803ca7af8bf0f1243e64544d51794583349f9854dae778894438805793b085373d09a185cda5489d74274eb7bfee433b63a56e14b95941440924cad32935440b46235a8576d11b8d65a2e8198b64b510fc1f942bd9b0f8e077fe33c559cd987615263e9b66c38c5683893c3e10965f18aa755e1bea6d1789913cf2cb21b41b23c4eecab25798ad13a26321c59e35b0517a78743c4469a4435970bbc2b9c15498b1f17cb0fccb446f67c2f437415abe98cdeb3346413539961b3dfc1c40e243296695f27152b7f7a32ff4b185ea437b275c6f617523ada8f7d2a594e277b9318019abc0051aa399642cc0a478ac7466e0729848a516c9e86bc8ad85be985b395e3b28ad89f71e3b584d857bbc1915a47a2fdaab586b7916d9a87a56235db0c683b9bbd5f000e6a218e54464043ea1e882bb906c917cd4449fdd5acadf5b017983c87b4a8b0fc9ded7a1e2e7ba359240009b06701b5cb29fa3b9250715ea31bd8784dd1d91d26764f32b9a49f934c8cf61b4d4a8f36f81d3ee33023959427d889e4a3c796d284a1fb0895184ba4351034a0280f34af119004e9b06fb1e69050fa2db039a9abc6ab00484b9a2694980197b69b9730da0b8455bf591b2eb4f9cef37a06e7c107bd56c3f7ab10ebdbc60de87bdc8c22f62c2e4db973140c5fff95631839264aabac5dd4873e44b8b2f7106c083dfff8b6403322f467a91e52cdd359293540a45134b97a39aefb6252c9c928adcb231eac0d790422a9e3bda366762e2514758badb2a2114a9ac924553d42e05d3769350e4ca047d4219f1b6fa953b60cc67b07a71dda85649af0076ec5c55ef46e73ab06613a84b2422c1bf039564a6873a9385fb18c4ab92ca7a1b205e8ad57728ccaa10b13268ca519c2a0da39be15918bc724f7760e826ab9d47cc288918b60aa87e037a60809b230562ce18c1d76bc457107c8bf80574a2cbd0f945c59d4371af14737983fc089a425d1ae74993451055ec21435a8114060baa6d774bb6ca82efec1a40df1877011163108a2b20190135900a98a337192088d8c66e9e774b02c6d55819dafd9bf3ca886d39165d1c4cf29b1abd6b185dee9671eb941ac598e1b0240d92ca7bfa119cca15a643ac29b30afeddba1acacca8b83a123102ff20b1bb94ccc16fbaefaea4fbaa36f3d46b7f5706a7ef60e04125228900261271c9ab11b04971ca5315e6f3c9eac795687da91eec532476bc66b2ba7a5650eeee119ea13c91bd94b19c31fdbd80842d25dbff62f928550b1f6183ab64443e6b0d9653c5379158af74a6436ce3a1150ea31367aacc7558c201124573235a5997773064a621869707ac661a29238421c9ce88cc38e733c75539443613d8d81c60da70e46035b343577a1660e08a67849558901d539ed84cadaecce4da36c4b9940e106011b872d1b9748cb08c2e3db4880638767bb67c74311021b6c46698a21aba391c65b9aab238d93a4ba80be911c3ba8319bc866cac3e67fee11b773ebbbb8639891809d555258dc9445fcd815af355ce2cb38552c5be069b6c7d0ba83f8495f1230f50bb57a8c4d82ea8912608cef0ca6cfe408052b736d9c6fbca2ca08e76300d150dba48080421c5a6b13f74b8f705b4eccf9c1a336a0e7a47263d30b5d1675df4a2abec7522868ba4c6139a8d22c23608c40a8bb5e8c65661b94e008ba442b9dd9883e8953029d7c4e7b46206880b48214a84cea0b34560f29054756f427d185241d946efbda04956a3972f974be20be202314d9c58dfa3543acf894d65b6f22047032e408636440024452f6c2cbb5d698730907c3271774da95b09421e499b17f670caf8585e2330394302aac52b0c1d2b2ad16656cb79257b143f555757b989c79a49730354e42299f28a166ece2a03e1a6dea08b01b9323d9958d9e320f3055c9500625b731bef77c3f30fb2960974815243f7edba28b64a58bf5afebd76b53675dbfa62b05b89f85f945c00b3de4f8ad2507121bab1a86224a9db9afe8c26513219ccc9b19156268d159097ad048f7fc245fcb93edce592a8d415d4a38502632973ed98b6f97f986dbff7e +result: pass +ciphertext: b6aa20edc9f8ef7fd2fc2dc864289f6c98db6c4e7be0afa4539a83ac0bb55256356abb022d1497988bf0a664f8c2465b15f867aaaa9af528943000e9318bd733aeafc681a9d79e1a1466bba45d5bff19a5f4120f35b1c3c47aac4aee81f61119dc3926bb6c5cc1543cdc914e515b1258a22f07a23a6051e29894bc11019029af844a442f926d27b280f20ec61c4b633edd12c37542d93bb6deb907cbc3ad5ccb72a13763a1a91da7dea74966dc53081d789b6040f65d08c2dec770dcb3b5d37cb8387a7dd953df41f06b097aa7e866b08cbdb1b226477a7502846881b1bf22813f9e4bbe40d80ed0cbedbef9651a93701cbfa15384819df097306f7a8236c7ccedf62504303160515b72f08653ede849d19732335d5c4037252968566c78331afdd1dcfbc1336374e10cf679bc4b01289c46536da48c485ef54c6cf2f40b85cf272cb2d379a1ffa239b3870d488d8d2a18ba80d40d282a0b23073ce5303fa7266c329c03df33565c4178e99e2e0aea2290c846e5eb37fa293e4b7c7ab2965a67d76cc233f418e4711aab7326ebeb2f3efcdb2b79cf12654ad1cc22a748d4160fd13db4fd9b0e32a0cf6a5e2d03a88439ad1c3ec2d190cadf463e03cfd434c0a351e44950ae3f0c52f1987d69a8b6b7da85c445a0149e60c94258ab92cba1ba4d0f43da93ba87a4e1bd0bc62aa1d3faddbbbb6dcff737ce8bff4d108a31aff8ed870b0cd7d06fcb2a34bb9ef25f18f8bbc3848de931456437fabf9402d1d9b9932aaeb890fee4eb4b60c1d61cd7345d7a7a80d091566c9270a8e24a77bc26133a8964527e9b5b1fc8b376d5b65c9fb5bfc9d36dc6538ae8174c42a54940276a74a2a4d1aa99d721a113e65eaba503b604ccaf41ab0a867470244a08655211cf86a684292c2d3170e9dc2207a1edd0fff62c81108437354b1edffd0abf96c3a577820e7f4659561e11e57177564b1745cd240743eca37b0f827af298d25f5c352ad29082aa5a9030b69896d47e4460c210ca9f3ef1981fdce6fdf13a54bc77ca902bf35e31100b06f336690bf2f9a12fa1e9ae2b2a7d7caceb65cbbfccfa52c69cdee200ba34da38334356b7ec4d7765c3ad88cd6f4b3af13827240dd43c9f47b7f7b1fd918fb828aa6a8af0e8f7d3ff8710124dda6e6cfa923ecbd60e007ee6f2b4865937a411fb4859d40feb7974c9dfd27b41880056e35427063a1bf21f1a9ef1a7f05f49e41c74813452ca3265ad710a43be1afc528682e256d24d5b39fe2cfa57c9bf7f728e2aca3b36df31a9618647e4291f603b87a5a82850a0ea288a926812232e5c1cfc3b2ede5b9888a4a039a612158315bb55f2fe481e47dda46caa0f5f1db4fb78299ddfafb43bb55edf77b1402a3d61c4b9d84fa2cd3f9827b1e73a200888aa7ea2b4589400ee0bf389c3fe530e0227dfd7c7f9b4fb5d3f8d127a49b7fb33f3edaf19a1f546444811f5fb83e4126ac5062ef352319abfd9a34a8961ad1061d3577a3ecaa9220713b11bd6311ec7524a687dd46bd067cd8fed06e63d364f4bf4082d8b41cba87a5bc713fb1de4ef661ca05fdc40a098c56184e4e8e63ac7b06a9dd2bf6da4c5820d4f5a8b476f930801b9fc4767a98c0c597c4ef5a3cee795598c7df3911ba71153141b3f74e68eb3afde37c40bfb6a6da19e73cfa3fa4f8f9d622f9f9b7e027e686f872698ce1c415b4ea07d19c20cf40df424d01848e65093e52b049ffb8389626956965a1fa19f3ac8943ef2457a6c31cbbae469846b29a3b92ed5f6d37fd3192caf8fcca888e0fcc45612f0c8103eed3ce543d4e4f2165ab64100c2d1b86fe2c140faee78887df0c34e8520d40a7dddd8c6d423121df5688c91ec5186184dc4bf5db4aa1dcf071c0446f33f3fd37e14ea8ca77752bc73c4ddf515bf04026b68ae127efb7e63958494a13a0a0319f46ee9cbf92c36ba8f15e16ae46c5e9b8ae654f332e36713236368734d83c9eebac4a67c6d142ba20dcc83060c37733e6b9d98a75f7e367c905fca0f8b3bd9b53968d0f7ac129afc6a1ab68642bd5db00b4cb443797a239f291e77d75ae8a8854cfcd916b71cc53a135a96da844e75cabc2a455e7a17257a94ce917a2f92d408f74a09adce0705606394bb3e11db5554bd5ad035b28e754048d832eaf932172d942fe144ee7b310c2db9a6385ebb2ac085baff10b1dcae517a7ea7158dc00c3fa34ba0950f +shared_secret: 1d660952391268c94f6c47347627fe3b2a5e1097d6d85dcc14e3dffe3a4a1fd5 + +# Official test vector 83, seed: "16bef67f7ac3a755c59c816478b75fcc16ce5844db537791accd1ebd49d2824b105fd2e970f728c8f0cf16e439a9ae2f" +entropy: a7a31e140891ea37d2b6424b59b1f84f89220f32dcb73e037eb912b389d34a48 +public_key = 98c5377fa74b86746684a02b2cc8694852594b62cc0dec3c240c49b1cba8235b2b7220cca57aa380ca7f6ff96688b70299a0a52e34805ada0144632ceb704b0f08a3ad9c78dea9a9f1f556bb830cb0345ab9f2503342aee2944879ac0103caa1cfb1932062a04cf473ff372d72d500574660435b756a99635a9626f9f085faa880f8c332f674a76ab0196a3326b0e88ac19547b6e8a4cce3a3a60a9590d524e61501a41262cc67a3cf036e08e947e11c33d34895a2d4b7ed348ea8329f8e8775453a65ec242ddc6b33e6374acd4064cd8c765bb3079550c05e0054dc11b4032b33c4e9371630aff59986b95b7c729402d61c7ca3bccbadba94ecb5151bc60330379e24eb3fc36358cb83c55f18789c37c541e93b3b781d42904ed910aba5f6a4168336dc351aee66761cd17617db2962547d77fa238bc415a6f441c0f50fc2cc88dcc7049fc58c3bf3a3091458278087ab81569b607c66c6b6e4f677b4e0c3b4188dc3d3741ecb585ca68a72d0b18f18739e0194448a1da0d436f2a71fd08218283c416a0a580588932fab5903c289bce9a1b53328c70bb943660ce98773ad14a51783486268c270808cddf713160068cc8c8682ba11d4a21a3408b181625bca33491522949fe6a3ae6a2f046619114a0318fc69a3d58bc048c45ed4ac3a610ad1987629b2bd66200bc0e7b083b1b26cca00f576a2d2b8ad3c5212d956a5ee0985cc4023e9a99031f3a903934f2ec24e2ca46f06a26efc2a19fd28236e9097420337ddd61bc2b7c15fe9949acc7c279708a7365ca87b72b635aea5d67541853530f66be8da1730815852cb3c62024be50288c7ab08a3a2c442307667c8bdcbd940c0a6b91ee1657be599f13722f1d21848d189b8b389741a5ec86560f1b862eb63669753558190516964c610696e9b24a955d07bf388ca0cc4bd0861b388e5a9f1c78014da35ca594f9f1b766494b7ab4377eae61bfd8cbb5e775a4e627e2dc80c17128bb5c314be217033668c29198ce8bb27bebc79b1b4c5fd81578eb32709ac6badc3cfb7c414584bc3a38ba2ca1c9eeca55db9bc295791ba22ab54f9d22cadbc83efb58e243517abd4a93a11bd083950ec71536bc49b39c53d17b8a301a17ec0b90188c800cf2400312b76fd85a26557022909866f5591eb8017440364868c459f9039ff053e6e829ac73b2aeb81c9dfa78703c7af8efc6ee88c929183351f752a47e608638c7016026a031c289b936e06f46889e827a1e0c99ec431c763ae80e72b8e8cb87c3b7b74159596a9cc5a6c67253738e6889f5259a0ec87555e975ee50c82cd44428182827faa7b81a0abcd009a05685813e3000f9623e1c4536443811c98148fab9c8941163a57b8c7377d55a994d6ca310ad58012f51f94bcc9fae366a0591adb9a7a78e78478d1076d65c8f029867d69be153cc7f7b7c3f7f6b5f1832bea256f3f9b7f1165978eca35728115a115500677c1bd232fdf7145ed07810ea4651985a3ad7b5edb37bc21e33115d4c8c8b5094419780831c65b88a7d934bef0b9a52ca4299adb84a6d9053eb4999a92c92b353d9823896d3759c3daa69879782785017747c102e7afc0a330ae96bc2e7a4e6c4b5a637b2d85ebafc4e6c4cc676f78e29e6eb5b8a4bb942a797d78cc708ad3cd2f04217f18bb3677318d3a917db689599c009d3897d95b586e899e5855253cf54974ec4f6fe8be5a4c6804c99dbcd7c3e7407fa99b90a5586e9f180aa559a81978adba7b770a4c601980ad940ccd42eb70010254848b8c4a2886a1d835abcb9097253e2fb817425525cbd37c1b8b3a2ef47e8a15147a6a441be37e7b2579e5f74641c4731ccbaee47b1f5bd744a15284239179a70a70bb8217b1371f928b275e14c83554788687ace377888321c87eb5403cf3c93cd4c9e302b63533591d96af9aa5c47353c03171caee118bd868a6fe29575f5881c5a5bc7f67a2dd5457efd71329473364d509b02914d543843cc3b36e213e27facd6f0369f165adcbb314f9c4c8930564b9f5aaf21c82860035e9f729dfd30584b8cd6735aafff819f9d244cf8bcf9ec15770903a3cfbbfaa385cb960692923b88364100ff67a2dca71154700e0594dfd66ae557ccc6ff36519a2252adba29881b7dd1283d3b621b40acdb3bc22fae51c5a64488a3993ab8fdefb1682784edd39f0fd80883fa378cde6eff656f57119177c56a9 +result: pass +ciphertext: cda962ed9823fd85e1279d4c2855e9e16b01e1228905d7a7c243f94adca4f22a33ddb85ef0cf052b8968e3963757c19d104fb566b9188006da9ce5b5c57ea9c30858aab0776459ed0272a0492705c5643dbd7110ca2c2e6a4dfa8a00512f9b2cb730d5b94cb816587fe6714ad7f69bccc08f45e78170be9cce0414d096d961ffb1a180442f510fd65c5fa8ad49afefb8d96a8d85077dca9ab501aa4bbb91b121927ceb461c6c7b907aec1b6e874db0ec7171522122824975b1eae1f4319ca046edc531055034a1fcdfd37b05248ce9a1fd240e44dee1264989e1380a5970e533e10a41498792de3390dfbebe2ef26470276046867194bde9858589c8da307b3093f9fbbed633b628973e9073a9a2e204d436bf4b5509555e0e06d5bc8efd56f2e3ac2e2265987811b396eed0dbe7421d01a09dc97b90cf3df6dd959edaffec7d0bc17e01ecf78025dbb35b6cebc555f89e87e68e272e260fdca9f7c0b886f85d23b7b38fdc565270c52395b136b8f1ac289b8d37358fbdcb9c516eb4bd0d9e75afdad371c1a2bc693c3dc6f89a5c731666dd5d93c9dcf59be90a8fe8c48a41b40285fc43d6ed2a9112f43d7f46f79788642518039f9e1e51e8c21ea7e0c6246fd8395177b271d9dc6e3c5daeec361d2f168d3f50288f4078de91eda0b1396809f9dfbbfa54e6803894e802396d50accf38dac484237f1ec851d93605655d4ce0ce900982618baaf24b3e7521838b9b4b1ec656684d82b3a2f82fc06d1d29d3f00c83fcb4c579dfce129156b809410074fac770227de7a1263a8c9b619781929083b05918faddb75a73ff32ac0925f7cc336dddb1c03ffa6e7d4449053e3d9452b971bcaf7a914a28b16ca4615e76ea00f3c15507df347254a10f4957a560ca28e518a5569d1d153fdd625b538b4065c6375d8cfad5aba472ed15537c22aa8febcaf408bda07bdb83f737440dfdc28da8ce43bfa5edb7798921e0c70dc6341117e70c825f7bc9b83b8c5c036bf3889eba5725b7e1af2fbc6aadd190d3ab68f94f80bd71a4b79aac2186fba726d0be379f1669ab4a91e38c680e38f1495b96fb45533d73d62685621092eba9068eae3ea1ad1c27d094fc6c3d5f52c958391bd58aa00eb55c329452dce85199414e61abcf3608133dd72651c01cc7a7c0a1ad3593fd227d714025bd57920e92b1a3eefde9cda50456aa257ffb85668064c5b3e22c1b0d27dc0e41a8b68d9709615b5138e6272d4f8b7fb26ef147dafab88cae1027f0ae026a413f1f130fbde445df7dc517471223e5b0a5fd96fec3294c66fff3799597689e1e7c84c8913bb9fddf91bf77b339c8cf4412e8ff8d496c6f6d97ba772ab8b1c44779eaf1339e87bb16799c1291ad46dd9776d4d3b15de11931c508a6eba012182784e374a381c671d26ebbc2c744247438e5fbef7021001c233542d13e17fcc4438c4be9310f5fbbf9ab2cebb2aa2097d5f2d30c0471512e8b022b43f8025408ba09c31a246a8ebd9fe904ddb03dda3f1a7a74f64befc83f89375628e7ffb587dbcf904b8d7a5ce52407eed130d42dc4554771c2a10b11c09373160463e775dc2ae642fd76e43441fb544ecadae0b5d6221f4b65b458f02378ab217b4e3e980b0d0ce70f548e5b0b312133dd6c5ab74fd947109d5753168d395b6620d4c9134d6640f216dc86453360aa47e0be2ca5a4431631acdedbcc50e8bfdbbdcfdc9fcdd9695561716ca01f2a872dbe7704ccac7fa6d57bff833335dacdd3b3da12c5eb03556271355881dd2a7d47bf45e1dd87a3a7253357af6a4a92016c5da1816c089be187895f3a576c23226192ee5b66fac243fde774f645552d87e6a50d75ea560cedb453730b7b4be30c5420e2103db839ba14e6c35815020046730762ce2bad97b004db9632c5368fe4a613030eb6830767ff15bc01243158c4ea0033b8989b18f4ed2e5885313044b81d03a0ddb47404b815830c50922a79882e0fdb75ea99428435e776add924ea6921a01bf5fef8995904d09a898b095d5aaef5d46d253ca3a36b4a89d4c34d3a4d6b56465210d4668d4a201d0415dbce1170dd3a52c5c9179aa1ccd90619613ce8a09d09a44a8f042c652eb1c4836cbc1f8d5f4849e4f25ea5bc313aa79e48fdcad067386d8d1216273f7476da2c64cae20c0bfac4c2c4c3e2d05b080ea5c2b14d83d3f199b310f956c4a9345c57265e0a50ff +shared_secret: 06b3f79ba4b060d1fefdd589c9b87c48cf1acb34e0491e98b28293fb6b801baa + +# Official test vector 84, seed: "d0611f9ae5be4da5d7eadc9109944348e716cb3daee545721eea8c892e7831cf2e54603146454cbfd92387739e9a78d8" +entropy: 70eb3f791faa91f1f982fa477dbcddeb2c55691c07f93b04cd31b37544c94b42 +public_key = e5bc009432c97a66bea57133df41cd6d6095a69192226c8a1c6a0416dc13bcd39cee2867e991102ab5c7ee37ab23d33e113b3e7766b7c652cd0fe03fdcf38653149139b532ac46b7e80229c2576c44834080b75d9f2490d79a23e6d6cba707458c90c7bb758e3c7049d5868b32e2c50441b280bb1fe7528924181051a9b35c6ac779645e6554b5deb21959754f3a47454837b9512820d04722a884b10e01b5acec05aecc2a778091bdab81f0091ed67a7c7d062085866df21734959206733257294a4c82a7295a739638141aa3821c764891fdbb64dbc6aebb67a8c82caf86f7248afbbce556055405ada63ac9f6423de12447d89746fea494662a69a021733592a0fed82749e73d4c2c9d192c994a535f126700a6c4cee988945353c9e9d2240828bb674bc98f22a298fb6750da5ee76345ee1b2dfda01862d2116e6607d3c251ade46ef82974ebd2a14502684be1cc3eea46cf3c2b3c4c14178a79fb495a44275cfbdb5a23ac7b8a911d7ee2ac0672b997cca5d4442a5d80be02c149c0c333caea0090937df91491f3e03ca3f8c85357001e4b0c1c9a73be64abbd7c68776179d4696fa138834325715e115584c368b720ac8eaa45aa4176e9860200cb56c41143985a6bae63aa16733464acb2cc948a949528bf6a91156a3a6bfb55bbe1980d499543720cfd435289c880ad10a4e990cfa2548f17bab1fa31a45eec41361198daf50f22a271c7f1acb7f70463b9b4c82b71228644b3421325b09de2946b829b31e56b0c95727c762b5b5d078c1bb46ff2596b4db6863987c69b26225bb9595d612a5a464d84b6bc775701fa5559d5c8cb55bb30e2e3bad532125ce9c790774dafacb19f4c9dea8abb25b26a6c6a51e27205b0d2031938a9f1700d353c2997e935461b121149a16f7a133af9a103b34e2d3180516a5421243769eabc81952a407486e2111238d99bee90554c32aa12e774dd9b17a5d98cd68029f1bc8671a9015591cfee86bfb8712a5948b9455caa51074db3771f89e74695524fe030aecf998b6eeb301d865f67b9bf4718476026ab3161c77f677fe77a301f357caefac5e579bbd0b34b51b8b58eb71c44c52dc669b9341670bb653ca363096d691680c95a0086601448c619050486b6c244eacaa0198f77d987c5083853b0b9b5531a716a10e7517484a36e38e465e4c855164b2091c8a23e5b2f220524285c739d8b519f55ab1d6c4505ca6a00f6cb6de0a16e1355c1c8824ea571611b8a3925c4fc64a5de44a2a1bb189d48aafefa13ace52290a615b5b4339008181d428f3d33267cc135a2649eb113c023432132a0b93bf08203b40ef0e6465c1ba8a1fa517c37c3d363b80d25c70248c52010cd995a866c8004eba1ae03e56e4783453e52609d6c84264c836857a24f2955fa955041a44c6157bd2e627124fb102ea2bf87b1ac628a393fe09968d707c0f27105b491e19c34dccc207367ae309cc1a0f0cb0072781c63642823623b2239335a73db76bd449b401cf5636114a22863b50ee32bd4804006f13dd66b44058b43be960e9a3a5adc3437298b05c7b314d3fb9d4c7020b64b6488f70a73811d934bc0a81677d1664bb497949b757b02e074e76c8a2e65410158973e30a2a9b6b034c0baaa22cd62a421bc25c7bfda61d0578c1436b808540cbb608cfcb78c8af6a43188bc26f637ab479a1ce86242766d9daaccd93c13d1885c7c994acb657fab0a75de17037f637076f2099560799520182b8265f9ea8440ba9e07b084efa2a6cb244d7db1a39b10297eda34bdc82bcb6a2ee871bf13c1cb8ee602c0b3818335895e754ebe75476ee1786d4ccb52c7164c33a76a3b3e2b57b170c34d37295d22e2351be21a95b6495432a1a5e8489edabe9b71a4459a4ea08b8dd65c4fbeb66a5058cfe7706d8e09381979b608230c7430879bbbc30a6150af273cc4d52c5f1c43e723a036530eddf0cbbfb6ba091b0861f1c751530ce52c947743a59595c15e529104a892e089b912975c7c598b1de528983b5a66a7a66c459610f63e95a7b1198b4e42710d69ea7a8fc3880c0876da82ce872952120a666aaccd5b1001b6b99877610071249db481117cd69f6a252ccaf1a64b45c84c2004eea971ade4659e3508e7b623fd9658f1ac8789297a8dfb3de7b385d927b522126a05aaf40635372f59af9ed4e64cd55048057d8b30c04fe6c876b8a67009 +result: pass +ciphertext: df6932fbd48242f30e3b1ea4ada5d8bb84e27babdadab801a1ed8d36f93d123cedddf0da50035531fe9d7abede9969acdeb76d9f26648a1d0c2f4a03d78e7cb7321adac80135603cf52b48e6b9e577b167c8b4227a325bb9eaa7bcf517eee62c0a30206b140ac27023ffc1c0ed126002e5c54a146f29f615cb320b7d19e1d32704717bd271264852d8e154fd4739b54ea3fbae78eee7c6297dd59489bbb35d29994353caa7ae27850b3722f56ef241d6e2479fb8423f9507a0e232cbb0554af598ef5460e151e2f69f04e8508ddd1e86dde600d645906b5800ef8cd70f5a11b9c9db74f65b03b0c57b5d9d3ff821690ce41ecfd9e2f80593591b48ab8fff0671ff47f58f2ba533d9e11f6251384c3b3d7ab0176e1509a274af00df564cbd89d5145b9640249a80aade7e6c6695ec3628e1a035216bf49b7e4f034029399d3ca4d60455d20e460005a21393c5ab7ae4ba564cb4067ffe1f51bcdd7032e339db7875f3bbb99ea2893fcf2e055d4226e566260646a09d66c6942fc24f3a06c8fdbe46e95db21400a75501a6c10fe94d5fd1de7d110115525428d641a695f79fafa86a0fc6d2bb01060b9edf55f2efa42ee9a3473bfa966c98a2091f01d8b85b48331a727ab9573da40b55d15e5f68d227c7d8dc803fcebaf3fb171b32bfb30b82d812ddcdfde1c1833043664db97729967431194ab78e254886c404a2aba5d2de25e8e5c6d98f797490e8b135ef54c40b77967a58cd733850adc1b56fc39a5d1429ec6ca0158c2b4b5aad303834e148aac021472b10e4e4696dd73c49a7e2d8e6ca56674cf267a116cb76cddffce8ab6f44500d0dd66a0ae460571199d17b87d3dbaa3832e90f0e26263ae301ab6df79a461b91bd149a1e99187c09d259baae83cfa3c9f33d4bc700285f25a423d05c0e9a50e2bc3efd291c8f74f21c5a2b7e35f13d3e13d5e78c84e2cfb449dbc02ff4f1fd5e98164c4ac30f6663e2ce79ba97997370637437277bff8b2b08b1a8183e4b1c340bce2a85dbeddb2cdcff31152829c294355204fefa07e75fdbbfd48985ede759049de9f1625d43cc83c895e6b0e806874bd74c75f1088a48b2f0eb4e37f70cf38d6496abed79ded46ec7c6ed709161f2996a8fc337bcd8457f155252c0d2b5dd21937259c11e769d507c713b558ab492bb055d2cabeb8f5206eed3d75daa508a1533aaf3a44307d542e7c25fa8ac6a38df6ae99148a746f440687fa5822c02dc6c2cc625f90ab9ebe52162d2382b851b14badf23737e5e94ef61c8401025dae044d3f6033b257fd5a8f8b8ef1be2b03a4045f9da7fb9bd0efcc0f81dbd526c9c4cdf810bcfb3ebe0ed96e0bf69b0d1c311152e715e542ff959ca7ef7bfa072ccca22a864bf3c4514aa23867f1822be589e1776849d1b681832f41f4ea2109aff5926abf92a2d5f546206bc81b40305f2f2891acee0f32443d8e709c27efa376522d8deac407202f258afe4810fbda7868e916a683a6170bd2a221f33890d37db1a9deb131285549c13bbcf858953298b0c2c1a2a39eda9e7ba0c4d550709f17492fbd138df32c5e3d99d7553a3d5ad82f4c81e97560c1f0df2abaf489ca7dc841f12adfcedeb8005d1d90afea3c6b44e646b2774976074262364341f447a34b0b2ad77048d426b8502c3a0a66564ce93f75ffbc7589d774ab33e56a5a2e96c060f60396b7e6016031826c1bc0eae28f3694ffc582d63e1a7ea78c9abee8b8372f7acf672efe98e383d06ac56f03de79aae74c3a9b82a9cfb63e083dfebf2df0a50745c4f41b11e894d192a9fdc272df804a0cd577a7dca7b9b17bab29d537396de43a4554f2b4ecff541d3fb544fb12785c3d200d8c5d75c9113ea2a2a8a0e8f6bdf31f2428de88bc71ba028e06654d1e4aa78745c1e9dd9e5530c3037578bfe6f5b3f081ba5276b49e33992f2ad4494101ebfcce435943ec8c948eaf0cc109f82d0fcad7372fc9791fe4d99c4ba1cb4bb76072e98f76ff1c080ffdbb1790f886c9769c4011a36e9d88f33594e90222e1bc14ed23f53014a0a2f26344c7b4af10cf4b5dc14d7f3a3a9ea3674bfd295c6a78343fb64270824b10d79dee3d8152366f7c4bc99336d69b5fe117dd526744ad5e3dbeb255bf4edb49670daadfc69373ca1e70ba7a3a0839b95afdac0d293f39865013f9746c8eb4295aa6f5a40bf85300266fad6ce396124e71ed5583d +shared_secret: 46228506ca245daf1bf40b48167a9bd3603c5d123db157645bc93780509b404a + +# Official test vector 85, seed: "fbc38d7614d7718e931edb850d2c6f0c5eea9ee889b3e25bd69ac255d5b91e885d93e808e66bf9c88c655dc594da5792" +entropy: 30f4095015ba88b6d969672ca3f438c395dacf7d476ea7a9e805ce932d270a13 +public_key = 5e8ca56e95a1b844147c6011e93057b8d35b6d6052ca045cc1d8444c1b603ff211fc67653a03cf7d3930373206d4ac62090712be287eb6404843c5c1208b0b993c028a445be50550e2b5625e3124bc58b256eb0886e74ec7f0c4d082a143139222b80037b61649e1b4f3079c3f12cd9742486de788ac1a987c158f5d20296742af5953617a5608b5b965ce1cc261139655a09936f555ad8882f3d7b823c400fb7056abd05bc4cc18636141a3f0c0688b5cc04455b768be41096eb7676315f808953c8aa95656e4686c89078e36290fb0b01697c56e41a0bdb7c9c6c6ab8f50eaadae889fb9e0a41d757ec6756bb6e690819b95bd02386398817e1c9ad7db807a842e75017f5bc6b46fa6cd1580993c1238aa197931c9b55d333e953420dec916dcb00b657b5c6fb538468a855e830f1afb9eb356098e12226a7a0718919dfee4ce6e275211804079bca97f291355790aeff36f7baa99c79ca6a4fb1979331494407b33cc6fef3663fa018e28d76e49eb1b5fa828fd7aa270f917e143a9a7938bd9a05d9e483a2d7725061a88588c3df6935ed6c411a149c634d0376decc87d2988954671c8e9249f517ea3d939af8a71d505a628958c634221f11ba962aaab9fc91565fb647973633a4946976b379199105eaa8e8721a12ef43325f08fe6e173bac2243ef74f92074d7e96124d70b3327839806876a6d6b982219bbce5499bc56df2b45af9cb67e3eb878d02b881a5ce9ec55b98808c48a2c963d8854f0172083c9bd2f55b15f6ac7ad7156af33fed0a5b6b668d654b602cbc3e3f9b81b3eb3c476b5bab8b6c886528ae4699e3768b51cc7f48ea9304d77cc8a708ed08321e97228ecb97aec4ba224baf4e684fcf62753985c8ea07c86f501433f40c21f6903cc8166a7332c0b6a8a9c121c41c35690413e98a1a0fc672fb1cad48d74044811f5c7363d7b03fafe2a6a3634d850cb4fb505547b72daa710babe7165b50ba090338f6001d8744041b5b3db9dc2bef60c5b73928889975f51548ab72b4b88a85cbe2457810115a9121f72a3d8dd6bd0c0b2476b2bb9e69a7e613a83d820670596353944a26a16115fca33c505a4dbc5c1136ae3a981da1d1a4b2c25ca0d5474916675ec8817a969e78812414053a4d0245d86119e1072c8dca8c211b9bf3c91fee350f2a0a392c4017c5705655f26657c5090206270140bb93718c37918b4ce79918a9356161b00f09a43aea259ff94d0dbc95a6b83eda5326397750c68cc6b498ce974235484aa453334e05c8232dba3dd1a182ba4543b4a944a5220c46d56812e125c06bba360ba7759cca24a1cc02b13ee9fb75ce8459df3c601da31ad552c153f789905a105929a223e3101f32431f346bcec3a128b0a3c3d4290d270b34e643e17bb5d53b6d248455502c71edd01654d028525576e3422bdf69571e9c10cf3c3c30227c89e2ce0c62911e5014b78b0cdabab060579ebf1a517414bbe5343bf33311c0ab1f659b3d30727184ec1aa8f1c3a3db45fbe215aca961fcd8ce98429d381995280ca0e5e78cde55442518476e0b404a2668424719abe71d64083ff8b63f285396f5989dd4aa9332426eece567d8098951e141ec43747c17cd9b1805f9245e0819ae416c61f3c60818ea448d397211e8b97e755494f0403a133abcd0882ab907e55a130528a5ac535ade736081d1cabd62980355cf85f84559ea36d6d3855030c341babcf65a20c9bb67ed4901f8b2617c7b9c8466976da39c6780003b71a74f6a16339082e6a62458835d30f1b32041bf9ed21c65ec59db3044dae0654e743a5e65836a4b9c5d2c9c4de859b1a6755ae7860fa6053de71aca0a61cdaa34eea773867a7ce66654380219c7b756d117a81e1c1f81156c6d5cccfbdb285c831317e5cfb8fc50b673600bb46469bb3c7c6072d87cc3b17bbb65b95e81875548b63e3024a24a329a4bb1404ff862ef10bcbe6a997c847650b5402b888e0d71c900d4a4a4cc429d717d3860a6615869f734244a0b25cd463371b189a243733469bb5dd97cb3e856cdf2ae64fcb519d9be1a75aa8794542f51bd67878e9a1b8f6d70a650b05b6a609ca9f477579264b127230966a289295719158b63931a3c0cb764e4847c9ac8bb91598b905a650a0123c7c0fb939f7e3943a2f3bafa20a221f37dc17933cf5e868b958e4e7cea4cfd021ef0ba63ff7a7250d21513171d5e +result: pass +ciphertext: 266487d97a7e78c94cc702e1869784dee13c887088707aab4bfb065bb5ca21efe01033215c2ea740d838bfa46fe849f697786ed81bd42ada9fd509065daedba4738c5299b3fd20b9805bacca7fb67777b05e2d1f25b56335b2176b59fd4e6cdfe568edfe76fb17d9ec39474983f44752e59eb2e18d8aa659f7a0dd9ed701ff05f94576f9ce83c4f04e2d47c13a2b3c407c6083a486d299c7e335bde88ff84b6677938b2ba4f6d307275c5e883b06ab66de74b5613257cd17e58409a8ea521a81b43653f652ac178c3bd19204addb4d6d66e9fd34363c7a9359094600212baddd2bc5b7780b222c5acf0e866e16adba183f12410c7cf91a9512d567bbe8bba633b363ecdff1fa198abb376b1ab479fde329ea207d0c665a0cae43350c871a20bf99f3b867bcfcf26e144c64b38131558cca0cddd3afc9c095621bfbcf789af1db138a58c5a2e97dedbe0c05d1d2d9bfb3ab3b1d87770d61882ccda744f67e89cfb89385e989e48595b975ee51d3631187f67d35640aae07eda8f0ed815b3fc2bc952b075db1856c84d8e20dabb7b1ff3f3fd8aafee26ba1cd69ec1c37073f27cbca57f1e493a1833d57702baa80aebcbbc1475ea314135f1598dc69737f325dccd2c817746ffe03302546ee6a8dd0e66d2487fe0400eb0278513940dc453e95b1c732bfa691459e96d864e342d532f39fd1099d2d19f81349c92aaedb560d2ae2b97859b430bdb4662f1546056ec29f80f582af1ca3bff28aadc309e3e22f63ff8944fc2a2ee0e88935a6239a68704eab53e737583977a66798436acfd373eaf5ef04870ceb6ad0077075287892c01a914408dc1703eb332bb66c4f721264c2a582297bf4853a4d402193dd48fd80401e1994685f600bc1a1e4e6c1419fb944e642ae4aac3f3b28ed5ae13a0fe822a019174e4aba84fd0f84f5623d54ba6ab820859827ca997039018fae104fbb95756e4a308314dbef967add842940023487d5100c1d146d5f5fa270b1ae998e08c8370b21d4fdc3b7e56ba64adf9f8f7c4af431a0ab53611941fe5be38abd05ec13456e30c48f80ec39e111676dcc831d9f41c1a3861ba29ebb24784686a2fab5a50ca72c8d7600b2b833683e7bfe2bdf9b63eba575620cae84c87d7e9e0393d4f146ba6c8f4fbd3276567a0b45377f55c5bea463862721be3a02b7da77671e48891551c753520b52962c2d1ef4ae3fa1133f7c065328db517868003a28c59562d40d8cfda5327fca66fc54134fa303b506e7fd55ddc0263f72a9579edc9a8491ac33145338b81e1960fa395f808ae09420734fe952056fcf038af61ef94983750bd56c72ffd1dc13ef624bc3ce95239a71e2fdf9e403897cf45e581ce8af63a245223adca6a3a31132dbd21d55482871aa606345b27966e2e07f175ee4be7cf0efe4d84ab6fb979e365b26ed749eefdbbf2148eedfec6871420bcda1467d8e5ac88c3d023585d8dc980cb6d0423f016eee54ff9f93a62cbe758559207e9cde870ba5382563867973491735e0c2b745eb79b88f1852d585e90f572cf3e00c6dd2987a066ba1f742dd7f58555f5f9f3973334ec91700cd21bda10628acf624a31f9395a468bf6ff78d4484ff60e44c13af103a81d8d0ef5e26efce7530983527e95fa7a5f6a4280768bf91f0ea21efb607c73843a6d2f80cf77656f01608c3102e1bba81f2d72b37fe34cf35bd7150de20d30da1049499d775107c306f88067977231a06181b3700d602489ae9327581cd431a1e83fd3dbd92bfdcb787743fcfb066bf1446fea699f75f9eb3906cf829e31497d74b92c7bbdfaf798d2f54b91f35bf2eefffe1865abbe4e399e27a78d9e32c683590bb77fcd2dccf1ce27523adabcb3edc0805fe5439409f9ed2b90537ecb2066d7560226d352a8e67e54161ce51c380b8ffb176852d132d0604685b5b267d01be16fcc2934b325bdbcdbad79cde7d4ba07a3c63a2e645fc143d62827730ad34118eb6ce61ca2cdf890abba3f9169e287417c97d0719da6b9f1a45c179b1641dd0357ffee577aef94efd5b498868d91d19a780e2b65dffcfb23d01f6536d91bd49fc0e634b79449bbab49f612d41afb45060b448830643a0f246ab5019ce2b1e08f871eda66bf23ccdda8a421985b58199dc3d7e42207bf830b2b12fd859578aa2b153bfb93e65ea210a5c0f024925d77fb096b50c1ca77758fc67118559dd7f +shared_secret: d51687f0a54626d49e07e8c8c272283b6b4f6a0c85c5a6875107b53c100264b5 + +# Official test vector 86, seed: "1722219cb5db47374eb0af0232c856a57f026f1cb09e5a5799f4c333dd422ff6a0a67c4da502faae727fb2d45dafcf35" +entropy: cf31220f44de862e1719570e1b26e897790159366a385452334fe24cdcae28ba +public_key = dffb649aca864c32b4f082ab455c94e6fac7ac1c6c46943e0d4b811e48a80f18a22130589937a1f4e4097dfb8c3342aab55648486701ec3c36ed167dac427c7dd54a6ef844468a481595b933701a2db33235439d702967ac1b77f47391e6700596d52b534b6ef33357322ca6f1c6a6917b1d8d9cc7f83028437c125912b4e8d33db0d00b6d475452f41a5088a9e5d169d1faa564b220c3aba1d6c27a5b87aef7f4afb75442c0565cb78c7b81144aa3c209f9a808d43132c75399293400ef70551b51292ba501fb613998011a35153046787183580e485bbf5b81bb9fc690ecd0cb7449615a0b0134f559b6e1062d9209ca62aa10279e2c7475e48837e70a2ddecc66d1ba5dac35760a5a5de0764136618b78516a0c711c3c4440c1f0117d617cd64b55482c952e7617176443c802c8046012e9b774d0312a68c49c85a44d430984ec510212316d43ecc3d6fbcf9736cd3e712d0d3011b645107a22b9d8f51e8dbc30eba66e98624473880c3378b8bf933d6577cc31d0105e19565f848290059604f9b71b755e123b7401f204356120c769cccc2b1660e03e688a75fb370ca4088b46d955cb24b7073c8540ecb2a537a66980332df62196d8c6e5584b7ba8a4c8739eac585a812aabb33a5f591b428e50c7291415012467d49b232989c34711009806249580a557048dd3dc0d2d6599cd556ac325a5c00b8820f0c9dfd3336bfa5f61d6baa5e26b848b39ca02cc542c1dbe90ad8d355cec4c9f3548868e9052618c86fb729998cb4cd610c8fbd86429621e34d11c4943402c2598b80aa98f395a85a180ad402587111de30cbb41e0c5f6044219d6a243860fa8da94f2fb878c8625b8e8243731aaf5b511fe7b3c34ac3fafc68df6d4be563727f705ad41245fde8048d184337e662aeb85135df92d4c1a3b36f1c984079d50248f88523483cac2dfe959162a79353708d09b399e6534aa88aa5bb3cf3eb59eec6a5c8309c6980bb2e4681bc47b7dc2939ffd5439ec4473606166da1053e9467c50854712490b583ac02a657c61812336b47a5e2912cbfb4a1acc84991116b9cb1497f199ab41b98bb54343d188ae54a269c89c36a61be71898006bb9ec531d6006325a47a13995492f41498790bdae9a9e41c0cef6fc78f8e027380cae57c2372308a1b0c2321f8ba17867a1358c5c13095617c2b276aa3c0b36588a9c62683104db5c94643c69c1330db1fa9a66c107c62567f2898419008b9465355af511afc923415c545ea44f15e7b98dd09ec0d79da5893125d6125aca7adf78a32f918af2a41cc6377c04a627fbb28ad5bb65bcb16e3f32622f45b5600cc367348379894c65f494f79948e6e1941c10afc4cc00ed871e529c8573b36debc7c80364b01ea874f345271517b6c399a6277b80bfc1a9996a3748a0bbba5a24abf84d6a714695202ab7779637f85774c27a51446e72fcb59ee684873ba60315a84988b5936674833a93f06b283c6cc1eca1bbc36a02c8197480c24e17e2316eeb58b81a3f5a063b1dc4b20239818c8aa67fd96cf6ab52017979bd82431c862837a1b796d0744a27559e748db8da63676369795ba92d48bb11f9bfa5393c522403b6379b0d2c82beb17ef29b37fbebb387aa695d54c241d51fc3d5bc7f8316100021fd805d76a601862473ae3996b2840ec274bfc37bbf5119668dd0bb0e909fc2a28f3b3c469a9b279bc4810c040b70781f3d67c584a965a94ac1bc088cd2b61c54f301f5dbb82f110c20d51a6c882cfd3c2ad1e6311fe4041eb6cefd7681e75a72d7b0cf39742394e33328374e5ee5b0fb3b0e2c709365780ed3191e56008280188baba9c745fa5a8958c0ef28c1fb641e4ec13dd77404dcb031ff3b670a2092edf848900818c7104b3e457d4189cac8082b55c55573c2021fd32e4b331eb515092843c323b02228737b2c8915beb2718d63b8020c2b3a957fa5029638846abcda5c3c0cb2aef55d05c38cdc1755328735901ba53d685b939b168b9cc55aa0ae05fcb8815400a9dc36a58a1f4f90b3eda3060a4490751413d9c1453ec8cb64dbb679fc69073c9e839c40e8ba4cac38124c3697528404bcc6435c9c21a5b89cd05516686b4df7da8ed3bbbb9afc428a842a90bc09666804988c7386b794b460105fc5035dc3018dd494d421ae46f978b305738d5f40faa6dd68ee73df57c41f89935528e64270c9759d496204 +result: pass +ciphertext: 6b0bf99e0b0ff75905ca7bbfa272c50e2603e7c2c8d0d7a28aeffa277c279baa6eac0dae07dbaade7b9e47f863555ff913e0c55410e5eebd974cb98e3aa0f73bd7d7bd52c451acea0137df60c19ac883f92bf27fe16d086457c46820ab90192cd4f1bcfcf62d7904f8af6a028e4ea5e490f404e88596d0af72f3b2e1da4674e20e7a437f921f036aedbc3619fc9f0a700eb103146fc8ced979319283b7b32d58996c7d430fa89db2ac9e717b51dae25147d92e8ad5f01d738b3eb308087a4204377ef5bb35f8d02c707bd407a2b706e7832582b288a082b238c3bbcba73604537956c3d12614645539ee1aa5449b721776fcd829209e2961478d154f122af4e4e42a9a88a02579e2e60af3df04d56189d89ccf236c5b51d5dff985c1abc0c18cc85d1e01d8f0a95e88df078c296f50ea8efd6d792ddcd8d694fcd935206850f423240f860d94b9843822a8818d9e24589ea80be4ee48341b5fecb9064e863f33840e7f48d2f2ecdf64330ed811c3e9301ad48cbf5a8969470d12cefd1a927636f8f34d78fc1427f9e3876ea2ad0979aa967f70630a2c0347118b8f2fb54ce3e61a2538b57a941d3c8b14e8c7c10af9bfcabc00af5a5eda911bb1a489b45f95ae1e621a58d4c1a287feb55a8deb01adaf0321f2c0979faffecad7fc5474f62503056582157d7e920522adb236dd7a27b1d5d61f2b13924b78ae8fbd8c4187be30bd181cd57e138518d4914893c6ab475d23191b25ca3ed1ad74c0a519d19b3e269f0e9408608a898df75cc8253dd36641f280369365d532dddefbdaa9253e732f767641616c2d2232b0e3a7afd1b46acdba3f1ab7af1e422bf2c4c9b8e6d1585a50b900888dab0e2d7f421d213d8842ca007b9f5fe7f76c2ddc963671cbc896f5569a9531b5c22bc085f944edb6c95cfb6797586c8d8eeb40055aa002ca3110e9254e1af1a54abe82a0418bbab6b2325ecedb6056b7e0bdb9108f2f8443ae8279e0fc3db874cc2c0026c2b265c2bc9b406049c015da6c8d86a3d5b23de546a63b8d8d98d9e3cf0a621590e443d8147640621addae6d5c1cf2bbfe3427ab820ac18c2a0d6309c29568e064bebf72ba372b3ea006260b3b1b84363e1478fdcb8e727fcbb80fe0daee1cb4d0b47f3fc5690e8885c9e76e299ea74edf30610cd418437128bd48991ed47010b3f7a1536292da3dcf44b9ababbb2914f53d35f2a1c2e5a3ca48d96ceecc2e92089101e8ee50c9d0ecf93e9f4a68450a3fb23b34377aad47381188517d8d0c6a185a07d1de4a30ac45b328c8104b5fc35eddbcfac173e4b668d603ab703abf600d3043d6b64c0494fc757e530fc99b13296200c2016089472168c9230029ac155aa5d6ae83da44880a86483ac0a8384862747947e585f502e1b1e3aecf4c9c4ac62f8cf348b23e0e015665d97ab654f51f624e5b54efe23b83daf84df2812eb434393193d0ca8f8c7f60f354508d5e46c97c775417cb82b66a4d9a683c2d9397e3136ba9264ff9cd7676995932d9f803c6ebd2d446990bf5313cd4677fa10ea6d9c5d5f3bbc00667fca3009b69b953f22c33fcc800b4e9a96627c838966cf00e2b5647725ab18950de4fdda622b8d19d94c3b3f188068b4e538c1d8dc8f69d32d8708efe5bbeab6a9a3fd9bd58f2bdb4691bc72d933dd6b303e586987e57a212af80bbb763d43b9adf32ebdb28113a6f3911d95a1b75656efc36c4b950f4b523bff785cb5eb1ade5878d53c74e113a1f6f97abed9bcaee8d5a012d9453720cb4217a359d5b800569626e63b74fe4439df428f380aa00ee9563bfd8fded9d364ba45ef5477a4f27f6ee637435bd5b7c970e181733bdad678dda5e11969bd2d15504f705e4a3fe34ce6d6457dadc0300f6640a8d6c53fbbfc993c42f2c26a9dfecc04ce2bc6e63e1258868f1c787287e03dd4698d2d400bc5857a56ea37d8f02a38a7fb02c98f0c084aef51a83e8c4853043f71fe70bd1e6d758e673260aac5b305028091fcc44ccf993fbb232462dbdd6694fec69487fd6338b4a7f0aa0c3c4286223566cee9c4facc6faa84fdf7fd41dd1072353c51f9e5d99b7a15b9a7fcd960bb747a8a4a0980b99c847db7e6793b65cdab1abe753fde758c55d6ef85bc81df59cacaeac2368c255374fe9d1f94a2c482f40855f7cae9dddc131268ffee6a5616312893b819e285390ca57d814c9e3790989a29f9460 +shared_secret: 73e86d2bb2813c76a8a901b8c665497e2d16615c5b2d58c9772306a3d6bca39c + +# Official test vector 87, seed: "ac139b78fd16ca0f26d6d7f9e15345c888d857b1910cf38d883339b37ead2dcac30f7cf10176f23ff34b4488eb79437c" +entropy: bb5e65669a44e5d5c709bafa98c16ccba6ac2c4ae923334f69a11543eda64f5d +public_key = 1e4205e8fa992213c49059a409aaa3ac72b85837cddde4c4ac42a9a35ac7fb80ad2d8c1eae7019276b1f3f3a6761602a01d99d4d050c23892427d6267efa092b587a5d2376012cb755627b9e63a2a04432260aa1abb2698ebb6075620ff11b01e4d049de698966fb49bdfab73675586583c744b5bafbe9692b6c6c1448899ab72a8821b52b4bc061910fcc70beaef424afeca7d3737f4c7c6711b38dea919e1a13c78160c1c652a81210c010c48908b13101b04334e6534aa0986ec01a86b30d41cba67e573ab6b0cc1a2c973c0041bd26721b508a667bc28e010265b762a223128e092eb512bb9d6150af6840581514470212d0e5c1f4696e45ab102a91a0848497e8a7a52ef20c85d7067e6a1f99e1c0de84473b735bfb001e860c3194029d5a06484920bb0e371114ab2f3bd775248a9449d2c19de5023876931de00dfd609c95c98c133bcbeeb52c0f713a19176dc90b5143a6876ab45b7f717865d4b8f0b8a2e6a45f123b85c8fb584cd3c042676ead069cf9c23682aaa05c1010e122473907547d79b0f8b61180014b1b3a56b88b3b4fd97eebb21eaab37883889a37676c61061d41b40b49dc5e68f64ed979bbd3da4a7824b32fc0bab9985a94251fcb740bd2b103f9c21c25bb055043c895531e68b17a3cf3190683969d6299c850b7d11a6b7a183b4b3a3daccc41d3321f5c088035102ab68b2938975ff180890153135e284155f971ca624c19f15ae4a3023f20cda6d404406c39cc26ac4df1665a3c19107a99bb289176a09e4a7c197ba72d6131980264a907b605c1e1791305974d49b604c81a9c8501ecd0cdd32a5f94dc3f64481164323736435d1043b09fd1ba63ab6956e4216ce47f719bc10f0c2b2830c17886965188534205c3f8818369aa638d5902cedc28b56c9723aa4eee8485151a270d3c1d963404bc265b912c6e52099df9ea72910674bbb8493f670620645fba16c0e6c73ffa20a99d6378433c6c55ab20f0a40c74ba37ddda39d2ba4d7f34c705a4117c618ad91408ba3bcce9fa9900d2650fb109fe2221f0f6219c226b74e7968f5aa0b3e3575be051446b1b76b8a7785a43c824c73688ce495681fe723d97b249e5a65a961abd0d61527d4b18027b00dfa49f4d213253e80ff2a556c48ace2b6a5122b42c2d15622e158e2613b23e62c6398838aa821cb05a4424817f0f9291f4ccbe6578941070b22b9c36bbe89ecad318e4251451a80202a70e1b2274854809e770677ab76c9e9c5cf4e8621e4338a279169ab46a6e5344ca391b80eb12f9b8a582105380384f2fe845b7298e52803989211498b42537b8b1cd22a59085bc00941f190a66fe77a1a6745e8af09762751c63656a26692bf1870df08cb861abba73b50ac6b03f880844a2c6811a031eb412501c79201e686ae528c84b7606aac09bc42265e77b56fde93022a71374693f9ff5787fa0855c79321d147831ca28e7880dfe1c15c66bbccdb93c0e7113a5eb9b97285ae8717bb87c1f071c284c0089fbb5a7b5121770950d255aabfcf54f1c18c8d9b2bc4aa253d5ba49bd2944a8c440d01343f0770f690743dd952f4f6692a60bc3360588f9575636748e3d321050c42c11d75b69d316cab62c681ab48f1880a9d787449440d1f1cfa0386613c2b3d25494e7c17d3e4b1f5a5780a9f088f00a9d6a79c6b1bc0e1d501fdb398421a19e316489bf1105d9f79c74433c82b87a775ca358965e8b1248134a94179c20011121aff04b95130f2ea20a0deb2d3ad8a0f6086481d8297a10374602661ce031b99012be53c70110b53d28966d8009ce6857f778006a304fb402769065c04d25b2f3aa1bae18a692d7552bc9805897c9b65a930ba11c6f3487801284d85579a912664118075b7237e66183c66510202188dc8abc1aba9524e0450b7a29b4d6b5076769b7e419fa4a63521619d1f76cefd0a7de67c7f5491724d063a13bc27bd20e9d486fd5158d3b7c04a97b95bb06895206058f94050dd8c262eb70a73746cf279350125807c52ae8a29db743099f259c9748318f391e524c9d8b46932157c94a8179e02897f33226ef1964f4cc92c7323df35a7700daa10170082f0664e4b8a221da0b5da84f43b79584194aa8c18724a6452760365c316c1f36212811a8e1936578653878b2372fe58505e7957a3e0e0f1ac0d822a80287d204eb6a446a74afae0ccd1859a2544aedfd +result: pass +ciphertext: d93e928dc35a487d9008fdcaace3165118ed7938a9a119b07fc9a2110843cb1f43a8353b000f2ac5b46f989a23991c018f9d43e53c586322fbb7bf31cf3d28d93eda34863ef22f6b51001879614bd8abdeb10d9728183d0f2e6c4c64f9f1ad6790e5f27a6fd601620526f0e5380778bb087e2dd437ea330340444af5a65eff203fbe231b0fd1649218fe4592bffe22f6d4427d053f22cba52c25559c5536b262ffc21c1c384bdfed79a974429f9e7158eb23802b3b4d6131817a65efb093629d3ec4a0cce7c5e8428954489a7c9f10d9efeeb9ab60cfa1785fb0cce23cd7ec12882a840a56e106e4f2251ead429cabcb92a1de08c9e79776ea090e195a80b755d3807ce234e7ca665b3dffdc34f6f30ed2a67e246f8008ddb9dd29aee41495151549c6f86d8233da909dd49fe814c8f3213197bb3300e5cf5ae564e55b0b71c4016067d416d3fb94cd4be0f200d403edfd964da3372e7cbc1fedf96ef3bf3f4f2038877343ea9ea1092cc40249aa46e5a307945c639f9c653b44957c8f121dc4c84cca6a7a2c240f13ea6d9020233f4f75074501f100bb53dd3b7f9a905c7534edf518efb4090c47bd52f09cf98190308eae80b12957f42562d2038c85d1f1712fee26c66fc959577cae0d1e699f00aff7ad2911d6826879161c9b9b12cab1412e11b8a42502acd2baf888b82b8f2e06b03c6cd96d8a2b44a9625d029439d2e0b8f7723bc252e6edd566c394a9ef0f5496ac59e04f34eb0eb7cce7c446ed2b0aeae5ec63d27d7f2a257ca71763af1a5e85fdf33afcfc1ae8f7c7b992b22bf57a8f62b86e7da0aa00f2b2fac92aea4598b270284640a285db6a5a37eb74300f7b2814278e5813a213d89ba2e3c8ee000164d5e14cbdfdc869fcaeefe3a5d4763e5a21c2b27023f26067f2612a5f4f2603dab06a9e885b86aa76d920ecc59c77e9c26b21e5ee02cd31cd740732032c9bc29c1e21b442435db3554edf0dcb8df0c67c0bd2c1c9a822caf88fbfa10ef7bd4bf7423433c5b24cd61f8fb6c527ed516d64890f4a376604b9eb126a83b435ea7e8592252ebceb331e94be13bc4a7a3521f9f6ffee6068312a9ee6f97a9be5b86a8f6e4ab6a9174ae67b05151383bb79781a532f6b6e3101c48612ea76e98de53e13f3a7a58005e3333ec353499ce107dbac10dfdc83671fb506378febc6debaaed17c71069e9b9a51189d76a8504950682305c05a9d53b32c1ff29d7d8ab2b79a5f97a304696c5de3076504d0118d85d0e02c1c961774de4412ae6016108506e038dbf7deae8201243f252bb6c9969ecd50dc198cdb7c48535c1d86fbf56b8e138cae78d1baf6d76001d668e93600032374c1646f19e89e73318e74e90404b3091626767a7fc610771e9cc7babd9407c1de14d54ec1ea0440a320d0a050fc547309d5e65b6be2ca147f56140750e36273b7a0b36d689f90c9c8f7beedd56eecd931c5ad003a7e7f892d029eb5752e19464c273084490bb693677d448a797e2edd6e60eaa484e807a5207b6c0e5959aebf4830de62bf03a955acd692ad37fec58d531ecf49c75582a77369af12502dea9c051237e882dd7399ac9c6293c98cee53895c16efd7447cf15eb50d67469e9f34d444a049d5ad57116454b322c75f67f36da417393341fcff60d5b46bc6dd4a14bb53d7b9b2a70faa788c8da1146ae4964ff5edfc3b239a435c4c49a3a3313bee21295240eb2c2781626b96b99215e356be5f56c4570ad59812ac2944465015fd5f1e098a6969233e0a5910aab8096e75903023f3d11aa37086bf41760d010da3789b157175a4d255631f37212bfbb5a35c0e914db64d31e5cff36dcbe9304115d4f0299599b6b067ebb541986495584181b5f02a10d8e51f20795f2a2ae9e6da72e9682f0c39e70a5331f34a3e11c0f184548f7775c1ee7aa1759a9d7f8af4d876d0c94db0db580f720d0477e48ba4a74430b14635be23632eb1ea40cb7264d786e3d474753a8b8b6c009af2c6a2600d0fde3e03d108ec237508b3daa6bae725f8f9398b8f61c17510d135a80fb939411606080b9f972cac3fd4b1b0cdee99752f42f41daebf3608a70a66e569fd37d849fc469ded909c8cbc41b2c598b3e5e1e301308f2765eb68f1544565f1e1b950b26d16a127601c0e94f61920806cccb9d97f6293271a11cc0de7551ae996c6abbe317bb7f64ddc6bdf63df09fab9fc83 +shared_secret: 17b113a1728b3b0847062a3ad34968ec3192cecdd758fa1c3188d57df9fa0326 + +# Official test vector 88, seed: "cc7152849c98d5fed2813275d32069e44824ecb14eaef425ce017448cd9a401c91c06d0f7eed6d22b7bbe8ba6c429ec3" +entropy: 9ddb3aa9c7905d1a438c93bcf78e3e321813580371ab4e1289e2dbf3701972c2 +public_key = eac2871f16b152d08e74e28a250999db0a6db7036711a24370401ab844cd39b124b8d42e8a15b2bdc85fe3b11c9caa30ee666f260ab0f0e230a5901229b974446428a9e24680a884208a2dfd3899ff1a4920b798ab275d5a10b01503d000c23db72ccbb3a91ab0186fa7850de3055e4531439bfa9cdce3ac888066d17469dce07f76d0397bd46a59c29a4a776c8b7310021128dd248beec9296c7c5e95d13aae21303127778b653131babc17494f0aa63c18260130315bcca7a8c8521e7b9c9544c1260bd201ef23974957a6a4d3658d96a7fd4cb7daebb11e5acec216042cac64af05c8a7db570ceb09393c7a24f5ae305280b1c22b9d68b02a0c521dd6393c20cb3eb798db457ccbd869748aa2cdc8336a58162e56528c3ac7a7bb41e2db1a35257b6135247c7802024ca258f03de2ea93e2f6c42e539617d27fc62510ea016deaf787a2b3b930165ff1fc8e20413b90ebc827581b74988937a018f612ac4098514480212781c4ea128680448b58a5a296b35020c6668acc7a39ec329f3c5eb00c44f43c9ddd612c0860031669c911e0b4d5d20f45ec1b6c5b6be399c2bde785757215be7617aa6a57eb6b797c8c5cf774274b2463d0c85e1343554ba052fd9b36da139e13e04ff18427b418282a5642429825d15636da6c45834375d543714e80530deaae0b006488eca46974642c8307aa5297d34619dc39863f276189a20b75673744fb934420a138506fb04b0eb2e22108c1923784523e767dc70ca546fb820de07bb9663333e623889279bc596b2f559f5699c272c3040602a0ea98c878d2af1d7aa697aa83f1dc10e54017e2e586b220804588473c4b9d05aaae6ff9c038d00f953547ec748e62ba3426001c3f669941596c6184b353d3919e591df898831eb11aaedbc49b88c8187cc13eb79eb09c7e07545be6041a9bd0a70519b17b5479aef79d105b83d74c08c719843a94bd1f76baf7e3bbd6795e05830184c53f42061f4b6b0321e2561b4c474865a0c825c96f9269e12742771c4c9b20b9380540772a24b43c2ab3051b88ec4760f794c17aaa55199e39eaab54c53aef32bfd339c824501972eb5ed299908ff0ab3da01460f106919b450bf00678967e45c18531d112b481918fb7023efa1617da59ff391b84b03ac199a1ab31208b918777a2c8a9706cc8359d09e4a817386ce09757c44350d10c4edf02625ed06dd3db07514639f67828c5077f0eb722f39587830c506c4bbb4bdc60a1b256bb157ed4770e603211d508165edccdb2d6cf37f039578176032c2158eb3c9d48921cb387339267bb728eccf97bf31309d08611b91271ec698d8920ca3bf334fd8765b0170608726a6220a3ecc14023f02aa4f31446b22da93597e4a46d451cada3965ef2148a832221c4d8a7d12157d9b3bc69fac8626b2dd1c44aea272cc2125dc79a4f90b56ea75144037a4f0060c33c5b6eca4572142310ce956fd6f31d23c6c9f6235057362b884a014fb5867b2c1976127a5a287ee371b7430caec5d35b63789b31d176d2553f82c8407f585c32511e3f0cba0ba60537780edc6ca22d1422ec8c3357eb203ee68c8fa135b0ac2836e027fe3161769c6838e98cd449c14ef2b07afc714cf02d91d387a27472217c9ea6bc5cd1249bba38842cf1b28701a6074ccfb7316dcf345acd84660d02381040cbe8109c5d423921b84771a1cba981c5fb08c5de08ae6cdb38fd5b9489357df11565d48a7797a6af82553225d73cebb362abb1ce335358c6776d9fbba731883ae7cc517e0a0a3bb5b970e4cda95a98aba47d9e2397abd7757218c5d7bc4ca59b70be5aa4d7b62afb54048ffb0c64919afb746120b383958b715d110e5e6ba666940328ab4510fa25e9b43537e566ef760d2cc52b07e5bc089b8ea9e166c513bacbccc332f36d6afc379e1a838ac24ea35c1260726d029651088996631c55e846adcf36c792c21011320b2287973a770d2636470c080b2893a09bcc8705306c5b364837b7cc89a9ad1fd9c1edcca9a0b4b81846c8e088b36fe361539060cc08c911c9058bbb0839183b0c59302171826dfc7b6fb1c623dba3f0f9b30768346a7714481b741bd0bb7ca32ed73a00a6a1874d8b7369f695efe75e00f03be6cac1476815ad889c69ec6bf7fb38ce9609c174b902b6047ead37da33285d1009b83c39ff67773cc46f7b4b2cee35e8e95100c31dc59eb9 +result: pass +ciphertext: edd9d2379c9063a3b97781b2f9bb06055ee94cb8182157eba71b983ccd18f237d8f9449c156ece2064d19ae1dc32861784c7e5829217397b27df13a61ce333f9d48677f1e4e6cab1763128d2b94aa9ac7f5785314289441fab4da9d6d021fe9fd21a53b0d18b58c8ee916232aa19e08da9f7521d4f959f85f32f3bbbbe741b021c915d5702a97028019c7dab562b9fe01bc3fa954e71bde099de02c842ca8304f0214c77741c901c0add89d96a78b1245875fe0a1523d1d03b7a6637c2fd6dc919e45d4ef10ba5e01996a43169dc5cc91293e382edffa16db90011f2aaf64c3a3533628f5739a2887c56af3dbed3486c2eabcd3c1d2c19667cceacc21b2384a2f38ef0de2969884619bd282af2cbf2091a959af8f26a15471b1637deec3885ec81995fb516e63c7908eb189bca27aa7ce70e7ee6e289c8aeb2ea4f79b9fc5bf0155c3cd09430f8bab8c70033afb42261b957ae60636204ef70d401678e14cb08767b22b8e22edc120515d9203abf4af7fd12a8f3dd908c7ecaed10e3cfadb3408401b6e96ceb58f71c69492a3956fc1d442ba092477e98696cd544f52410614622296c6aa73557878dedb5c5ac21801648cbd5be2972252774a54cd44b801e9cbe9ed13f73f3ff472d3f36751f7cfc5a81b93c0dd7bd825267ae0613a4c26b2d677712c2f78068e61ebbdcf955e44edc66910160d0981b992ed92c91a21fdf985d2934bab8e864b34fd125f85972e36802a0fc32fb2cbac4074526d8341a9098c9b0a91ec9d6371331791af6f6fc90fa5fbcaf3086377cfc141e0d972df44568adafa6bcdd9bd3792eeba068d8f07903a9fcdb2e6b29c5e56bd748aea8c06d502bfad55f28f750d0331e24c96d3760f796f12c4e6b97c5ed58b56836899c81ab3ac0f28907709e8304c95f6f67c80bbcacf1c94aef29ceb353a55005cb3fa48c9b39973dfe495cff4d483b1c1ba3976eded81e31c5325c7b6e177131d0a72315763731bb905cbeb9ab31ce7d1bcadc0e8cc9d82d5ce127901578bc742cb04075622bd5ccc85bdda27326e5f114295c2b31033b01094001634aa55b9187c5fb4a1e3be6b71f361325a54bff9fe3380488e0f09b407e3e53f2266133b8bc80bd96f7c2842430e653e7461bfcc5a21a29838103b8dc509cf01bb1984beaf43d0e5a45092413d396d9ce7f2d96762be56e45b530bdc7ee477337fc4318929097a60bb4bb88df9b4bb01b6cba86c148f841121cfdc369083fc0accc80d4e33d582427c84c34e134d06ca2023c09708d848a7c5cc6dbdf280c1eaaeab8d2806b53a28194b9a95a1e2509f8fb40333564cdddde4bc34e6d2c81ffdd07bdb5546a34af69347803c14e19558c82fed568f5d3da003618c6b570f59c1913a44c281e65295119219ae5427fd7683913402e41d60775d27089ae706bd00dc94bff715a2fbbafd9932645f90da872167c95ea89ab446828230b0be29b93e214caaac2b49ab88e420732d954ff24d0c6b0d07b60c34d9a25e5237cfc2950f01c10755631a30166e6fe742a316c3c952bb9af53782a255aa58fb817107de7bbdbf589a8aa1f1e48c7ee493117a3c76ebd891185ce21250378a39a495c3977e5a14ba6c1ab47ec71e5a8f3266046e50009e09d7544945d71a423cf320cf7e18d8759df9a027aeb38799a1590d74fdad410e39ac9e1f654d69ef624a1b9ba1639d1af179930ab071501f0df65be8a65327cd97cf028983077757f693bfc4fab29fbff36fcc9cbdfe23a84551f9da0c93c9905b31ada24dea830932525402db03ff3dbfcfa562ec028495c5fc1325a2fa5ca9251ad3853cd2d2a21051afd4b14f6677dc897dce4471adef042f067802b4f60559c0b592f18c33d6ce638dc2a56ea16479835e447a77956aec7b933060ca8ae1d5a79a9e5a8eae8631076de019ed933ede4339f6bcc01eca00845028001653f6c61dfb9a9089e4a84482ce83f1188f84498df81aa890e361a1ef0d226e6553ee3c079e796f7be70651b2eccbb38c7fbe22cad04f777e4f73d11569e3cdcef469e703070c4a195a499af2e41488f201d9d91d1162054bd9cae3949d7054056d487f8fdfeb1c6389ccdf76f26233d3635c4e1c4b7c831fff636b1b63e9d683b4e06added2541b5c40bd2d455bd50e2867840add364897c25daec0ffa4b065d78c6f9945868408a65dd78bfbd3d4710e6cbc5693b501570d +shared_secret: 5ebc9538f357baa7df0165af3e7fec1af8f4c1c051a214135c1fc03d026cee6e + +# Official test vector 89, seed: "96d9a06f88ff2c2036fa8e914b89c765e4a510b468dee40f914f78858c811857efe9fd0e17c0048e7389e8d996b7e2b0" +entropy: 26d90b190a6c3d0d9a86cf66005154e7086749e966e7187c249ccb9329fd3b8b +public_key = f8ca36bdd81e5969c6e2f8a58829a9b7697b6b36983e896e82b40738740fa2e6b657616b0b4cc0b15c2292eb5b42550f812673194b944b830051e4206670bce9734f53232b408a6cbe7542712352c453cac39741b5b940151580482b4752d16f58a1c090b101cf985034299840a186a1061e59eaa300b66fec19a3abac920a1a12e1e4070aa37893923067614f9e53c0d859917626c6d6658a0324419d0b0d16a647ed57c3cee638400875cb0436671a0c9f472eede423125a95c86c60d2301c85660807f43f35208716905ab4153b6510c128e038920a3a13e957e2e209afb46c7e0c9e92fabbb80063b93c0a963b1aa2d49f48174f86c761d923259ee04c65f4b85dc110cb04ad4e26c369682e213ac4114824a526b2e6a21705174110b538e3562bd93cb251962e71782d89e562482a51949707ac8337b78627d489b193600636fc44c44898b2dc7c87332f3dd9c7579a68e0c01211fc1957c43d781473fd3bb17ce14456e62d93c236bd9656f5ea8088339668658ed8cc1e909a026fb76f0ec747d5a570ab88aeb44750710c0d10ac86caf73f8e2238b7e51da8722317973bd544834fa31571f48744b6a7cac95e1d3375949038588cb1d5d50476629432ca9e43076bd260b1a6a3472be2cd780177c4750b4080c09c820bf9f1ce2de695478ba26a216ba2b032cb7729770514f71700864ab0e3780cf94cb7e94c88dd673dd03b8690ac65b8e0c597fa8098111d36ea9fc4b166d9e6bd4935993dbc8f21acb9f53a20ee118a721541425a31705a5d67a6196c91a96dec2b2b48536e118afbd5c8fe46455aeb282a7a6e73b734001b6d3a997ff1d50ac7d3c97eeb4338f13f8eac05cb0b6f7f60908c0b1ed89682192a6ca384c7ded2170674c353d9aeb8696648cb83ac986dff669e23f49c47e9208df49187c1155bb1c876d1242098bb7951454e677c67042dcde2af77e8090935b5bada59c4252c6889b16765a033d98452f25632710ca5553559d76358c162c70c1b5624abc090b59960c65889351529bdae24170751a45a566ad858444ff61cfeb7003b08605f3b2558577f0e12b31a447d377294e7e4060ec12a5ecbb9770bb8707240c1237b08c744e70057d0e68e2fca1cced27a1997389bdaada271054f72b849329e9a2321aeb03a940c44239844e94181b627876838671bdb3e9b4061fedc74741b4b5e9c4b421167bf420cc8077c5bf02721076c1c5462d7624f8350af75c50eb7267a96359004166c84145e72b731d5a82d43469c98b00a0c2352b7806313c60c04dc5f5c8b39d50376a9461f2a8773fe06973e852a04025ba6592f632bcfc3ea0ae572a50023c684a4a7a0db573ad1494458990938c624e5928c028ec48a9a26492420781071d13a85a332dbd8abb8f318a31596a38c7efeec28bbc1aa38198aa66ca68d811cf5700d9e093e34f38d0cc74a989459ab0b200a8caaf6d40ab5e5cd651c05fcf68e14a1ae602560186a10aa452328218e41c49b7e5154c67099ec790e88ab641ae03dd6acb82c33a6d4034a775515c52859bfe354b2e881c7c577bd5663b19b124948739be90addb36348912710cc12102553765c580512b22ea35141ea4ffe681045497fca77ad2e35c1a5b31baec2a8279c783d28241c923040607d38463a9b615be08ab87acc5e31b84ed8376d75f31dda47c869f82ce14022acc6c70429ba854b58e942635a12209240bae3137ec8a40e716655a0a82bd02003f20428d15806594435de6c39b746298aa9a693577783c71154cb31b7b31283f46733d199ae627ddb7947c4f4aaf1172858a97ef6140f56477b80450536396399a14a984caea756b1b5c09ed1f43c4e1754f40ad0bfc8c5f153346e0113930a3c9ad215f11c4ece2875c41516b0a8452e948f3f3cc45960bdd8b23f14eac17927142eb4a72ef6c3585899efc128f53b022015b2bbb9642b5675be352b9d442194d54d5b40a17c236e8a275dc2358fb31471a3f521b444040d983e64976b50f71441982f29fc690c41a954512f82a3abf85235847a28982009e3303239454ce0c7a2c3840cce031ad37516e6a3ba59b79ba4478afdeaa8ee8ac4731ccbb34125d0a7c6504a8d7e285171a464129b714d8521c69b8d952b4623aa8967f644c8c08bdef96117198e56c12602501201e036804129d528d717640ea33c9fb4885d61fa43860dafed4282b108 +result: pass +ciphertext: 3804e49185cee41c6861a7a0941d454024e2310333f1103d73334739510be6a09619c5229bd73c4199399f0bc7e43ab79b06bb836cf443912d2142f98a5dd284c457740a4da361946ea3138a9be5e4c46a7f0550b7a807627ccac5e0c658a0a57f70633758f77f555fbcbafdbdf5a19f2e0efbb7e932b262998f179f7aeee18652d5d572d5d71d0af89e58a1fcd401287e046b1429f504a4759b56fc90735b91dc640c55ce2f736f1ed491cfd3fa25c17c2ef4afea940de20ebadd1ac456c5c184b660e3a2791df78e4a4716fb09a78a3ed4aff107717b8ee823f689c31c1b7bcdade58567a8941a64033738345c6e7f11378b6c3b680b94b15c12e9d291ab54ac66def4f97616bcf996a840b93c960e24e5729a92da64ceb8608afc9ecddd9190a188fe142e7796dfde0b44b83d37b4f3103dcdbe37f0db2c404517be707b0671673e2f53c59da7dcea24fdf2ceb22a711e1081ffa529df068e8e2285b17e81c45d43d672f02d49e04df68f784be77625131e702f12d907e010b1c05fe379e42048620f533c9e17e0ca8b7aaa003695d085bdfc2c74f98dfdc9d7290f03dc00d89c2d94ad8b390ac3fd88e4c255242e7420c9566fdd6693f94f86b3317d7901305e209794d0ed5f0038a5e5f988b2497a5732d05b0372fc27862b339d3dbb6cecddeb0fa5da20e80edfa5d8677301eab7ed43159a1cc62b25f10a4a2e1c3f1d08884177ea74c2110f8a496e73d732f02f4d4a0c091aea4b4715e78bf1738279006a4f8e3397743998f334db9f91005333776a6521b8931fec72e2231efee7043517070ef977cc6fab6bda27de97ce4ce13554dd35668ff0f753606f2687ba5b1a12b2b42607e0a767ff95e962144e7e67065efbac277cc1695ac1e12f1a82072f9ba15e24af37e36b345fb50cf7bed32803b63343ba5593de883aeffdd75d92cb42e15efd70b944b8330826b31b1d69453aabcc803b3f1f390548bee070b84a38eac4fb244247ae4c5a26024a8634bfbd9c7eb94fc84a65599805e9c150e215e2978064d7dc5bbc4bcec8e16adc6f55190fc11496028afec6e41881e0a0094bc17632249613b6e95cd210f7763d2ee99a56087938f721abbfd09a72abaab9cb7aac78ee1202f3406c0dff5a4f31e70760c7bf2f7cd4f27fb6f7d6e9e9eebd737f30c080c0ea8bc5bd6d7c58cace07bc82f55c65788624e7e17faf3f4d54b0e5845b8da07cd51b589409b2ee4865b908367d1887111c8817ffda5fa7ef26a5db54cbd2b51777865240284aeec8f7c40966e9589f071d875858133b1496e1e5b9ad7447156b60067fb0e61441015ab474d1539745386ef550becb1345341a8bfdc2051041aef1458da87fd8ac4016b9b8ad24f9afe3f5acd1858639068512af6fcaf9e9522b98027dad0f6ba914ad2c35b99528f6a812257cb21b6ddacec678c2bb44398104b373c984f72dac502cde60d2576d3def63438697d50bc6e912a8f6310bac01ebf890200904318b7efb9616485539c472220735873ce9885e6651a244c56b296c1badef19af9dc6ae5ba8015efa52ce5af25768dc10b32ee36b637c4048ad832316e20e5a929d0dfa8d4dec7d5e195e0b59f52a4e39c05a4fd2f23962c945f04876bfe5f0d2cb1b66b7c7ee3107c823b4c60d98521a24a7f82f39e0363e411c9a5a3c0cd3959029a5f86844e08d13997cecbb483f24060bf1ed28892a99352ec3c538877ae85339c1d05523b483f676dfb26b3e3d154ffc3d33c46d06b089c6a7fa18266afaff1552266f5bab7ba6cd9ac64a1a81ecfbf5f654428a697ef439cb6ebe8c005f7685df5a0a9f475500339ffd92e0103c78549b3d4984268288501968f0e21c815a7c3f6e6f50960f5de64ca611c584e53d7c21c0d002b699fe330456ef42840bfb8b475f56deaf67cdb656a7938d0b7484687ce5eb0261cd67607d9c822e9b3e4991c32ba9145c6d33ec1fa4746c27c4e0d38c000495a8934283ce88e7460e4e6ae32b16814703cea8b0f5d34610b401677117bb3b78659d2402590b2161791c10a7c975e2892e316d49cab8f54ca1b4cb98d2f1ad9ebb8f91e57240367e1ef5831d77769e73c3876361356243c120c224ad8462504a1ae0904a707348aea1e29d1c6eb2a9c60e1f2bc0ea4a9e0558ec177030aa14c394cb946fb23f1cb0c2c6472c13fa3405a60434956e9cf7a686fe47a08f5d8d5a +shared_secret: 2478974168bef71749a93fc9005dfc0bbfdfb7c5e485878bc04025ac7f97de82 + +# Official test vector 90, seed: "d26ce360d399bf7b89dc364aa7ac06bb513eab8f527383e93e30727edc3f22c262aa0ec70257b39edff0630dcdc1b79a" +entropy: 7db6d1a129d6123f1f805b79ad3b413012ea86aed42a05e98e7b1f32f9fbbdec +public_key = c19093bdf18070e37b3ab06ade8b14de2b34ca99763f575e8d75177c72522c6c4eced8ad20ac6bfc4aa329e765f986579c373a3a333d6167c2c7440e8f4131ec305188c989140b63b65019f2949c81c36cbc45939c026a42a1554f2385a738a229534cc6552d5e76076087c9e5b260baf8724973b9152b3941fcbe19227bb7987d74856d3636049715beec638db8e3b1d4e3ba2a440b46445369b60e0ad3c9c07c3203e2716ffa51eb5005d1a797079089f6e14d86d988d7f960f0dcc553a83f7433be60a463b04423a6977599b7c1f7730265807b3f7b2bb8a625e0b0a0f3f1171d6c4e7a9a6cb5803b4871501453ac19b576364c3bd7e01f1bf475a9e71d557171e4d33bd3d14823672f27e356c89395c1476e0fa065dd168478bb710394116de27cc3b0617ef5b74ac718e8b8c152c052a4d57828824af38807d91295a0da9b49dcbda052317f5576e52b51eca732d8d260d08832918094de65ab48d3351b1327568574dcc82e3e8a222044984649271b3b45861ab6f5250a770b59071309d118adb32322739cad7227ad2b3460d156c065713f29a05ec48bb21ac7261aa6a0f3f19d05f0aa577cc8cad6a7fbd25826a3cc6ee225c1b183d8e124055414c54469e4e410828bce94a5cd95e22c7ca3770ec5a023f0656447621006929174850c786fd6357f36188a4884cadc108485277890a0114b4c565747c4165196e3e90cfa659662d992c33bb2582970ceb60582a691d66174952841ac5a64e53b31566671054486ee20437e245e234176ebc696a55a53308abf020b40b944cbf382155ba02fb9ec298aac3c2b81278772c9e0c730ab13c6f374ba8c886300831adcf9ccdcc566e2456bef479f4ed08ef803ca8719c382dcc667a21897db1f81b41521790ee233020f3301bc9910dce2202bf4329f632542f820bcabbd2bf38962e6810bfaaa5377a83b10a62495029e99c4becba9f0b3a54f70788f97ae54f01781b8505c27c23b810ee9c7452952af9339c4ab88aedaab3b9f951cecd828daea0888a3481ab39207a6851c0285226136ee392996c41b7d93221df711d44531c8818bf3b71aa65aa0a3b5055634699b007a47210e9583928ea984c413598868bfbd021cff817c426caeb3a77c9067b04dd3cdaf2b840af6a44e5a5ec3956b21697cddcaa035c46159262524e55f9923a5c44c1c747a1e35889b20ac2ecf5883577c0722316d6a82a88b21c8334ba25a442101b6828b10b1d9280f13f867e10c88ff3cce3af457a4ba82ccc4c231ca991b79c66be0c56666c80656845789b45f0606539149cb12b0917b297fa683031413d3e89d3e38544ec40cbf288320bc3b812311ef69125e641232322e3f1ba325b668174179e38868bd50233c78b0cd8721acb23b0b065a13f36a2b8b8245095cc785c64997add4a33b45e9a602b10edb318830a046d8f700b2e76094228a14a251e8f48403914cfdcb9e3ac0795f907cc592ae18d322ebb882a1473ff2fc666b7a829189a4910c60f8b1193d59515280bc5a9169ca6433c4e560db8ac756944fd9ea1dd1a0c9f9f57a474c32b94730460046251aa7d27a9a3f2c617816386207449d8c18f04537084a3f464b737c1a49e59c9042876e0556b92139225fa3aadad3b5f18752dd614c1fc200923c0e0b4804fc5b26f7c6cdcc684da00289ce344518c7a480936e46ec4c01b36a7f2645074b26d0414fcfc46d2ada8fbdf1c50c128ec5d2abe11ac78205310ac8aea724a117f00246046c4360662101b191228628383cd9047a28025cf8d6a47dc161af353e9067ae4433803c48b3cde24466d00aaf68be2eb1a209e8b1f6264fb14873edac70f834c710acc18fa4c6d16a627b03406fc7501ef71e62963e01869c80787af2d96a4ef8c72d273a3318c2826b8bb513bb2f6739648666af720fbb4b7785c853bc1aa4cca2c9d5852706b7bdde4c06c78c960265ce1887b5e13275f42377447751ac0bc811e26c2f65bb19e058d573a64959bc0d74727a4b5ae8ba23f2179ffdfc171563712eb028d9524af43c6143277bbd537f1155b04c0006b66036161472a199764ef7283e044c62a7244593564b15436b435da9e995fc803964f631f8332fc8887e49a87c5812860cf96747ec5891a9ada1e769af720e946c9727731449cc7179f73e867c8a63b210d73ca9f8d4eb44b5da3b57dfed46bd22ab85b9bd915556 +result: pass +ciphertext: 02c2554bfae2f207dda53c0c9957f1002311f18d7adc29263a5cd54ddbb844871d65fc88128c8e0d7a569d0557d352dfa0443980fd4b675e8ddfd43cc330f23f0c8ed0a344060dacb235cf748ef5652b2f91472751c950613ddc48696ad0268f1e49989ea267e4fed6e5df8701704abdaaa36d965e5e94eebdeba377091d9a6d8174e2362bbb17d4d4033ec53ca3fa57887ad7190892867e736f55c07226cda68d4dc6b518e4910d8a1eed5658a5e007c9ade97b270bdd9b9f18d8a98cb235e3a19e808cc015d3f90639e6c6a6c33e1dfc21bc09f7e7ce8d490d746f7f0d08e22bb6ea9863f8365a1c1b60ee660112b3528c6106772fdf0b2c795f637c35a3c77c63bbdd6e905c49b8ccad39b7b1339933bf9174f0f753195e67c1fdecfd1e3264d277a07c7a67da8665fc992620bb34ba73b33ac373a7a8de1ad27ad22de16433d3d43323f5690ac1144f0cf20ae1e94af27e7fe23c0f0b822b739bb473039a50138390f1d3fd99ce2e598cd13177a5877256e092f25436eb6254b82c213d0c1ef35e1a141c29ae4ee1dfe8c39f2e70121a852938167e930cf41d22fb9e22d3698b105b3e62bd4aa3bfb1087e5406349b2dc9f4101c3cc5a7104d8d4403afbe4f896b640e03a194c30c401fbb2c73a54fa8ef1c2519ddc21d8d5c0634056d749eb10c41394eae0d6d4b73c6fabc27fc2e346390e2c771276f0551d27a20f98089dd6557efa1cbf4f020797c5524590191901e52ca66cb74173a2da456bdcec454d3ffd45691dff6a70dde3437b30794776290782a265bbe3a1c07688d4fb3ba1fad312399d30c7fa9d3d43a855e0cdb0e02b1a76dc3fd8c3e53b3c814f98fe7d24493bd6e854336a77732747f809c0782a926aa275637c29c041f284170b870352aff1e0bf77c0776b33e051eb539b864c3d9800a2f082899db3b22d37607080b29486485c0e6c92c1b00df67ca5be95fce1b262b32ffff00f04b17435d7cae7be5f9af0d673e4536b383bf912d68cb1592a01cd25df2039f826ad43a137c81ed2ce0928b1315c144ea3a1fc9c12aa13bc9564be273a58427b467936773b6555e05682cffc87dc8685889853237fb0e3c5cd0c3a4537a9577fe47a8aec0421f023628c941994dcfa7e699fb7828e125ff08a58e24e3e63801837c801cdf5e2fd9ce710040753da43d02d383acc82abd9291c47ab4b870c046af3ddc9bb68697b8e89ab550b9cf0c6c98cf3d3781ce0a655c6bbd8dbdbf9db669eae8d3610d23c03fb0f364f489f02bff1d42e610fb3bf94157d1ad8fa6a7063b02e910c145e3d9582b1efd64d6f745a733afa5c8b38cec2f748768bfe9432b612c73b2e7887fb8a06aed687b3619f56fa3c750fbfc35fb5481a0c21aac19733071e1cce965fdd5198c12649c7d5c8eb3d519980717665786aab878bdbe6240f58d913ebb9993c3779b5e51c6ebd3f95532c42df3a8025ea1cd73aacf40ca79b1a6f8e280b97d9c2d9b15f96ad265c6382c4f915b705068710b02136b98d0415adcbe79228f5b7a06dc97ba2b35dc76d37fe4216d5a896472b2f60a86759e596fcbffad1910304d3ce37675a4e6b34dbd75e52465d3f71aa7a8e366fa915a4c2544060e67ccfb4c839945d5dd9548fe8d63e2381055dcbd9cbc8a2cd483716ccf3902c78130419d2971367304e0f25097b2c0bca79017f6c12b428c3f47b649c6c41f1a8e6b17ec7852debfbaebe46906a9c0d8019a3db8ab0ae6e02af82cce0acdfdaa01e66f8fccf3b0600a256aa1e7c0a70e49fe22e1ef12a00b7bfc3b37b8f8fc65a382a873d29b85756ee84d0b9dfe2a20e062422b99163dacf5f96bdb34aaa88377495abb000b5fd84c75a9976cffc3732f5f989b40c4353275212a740206e575565de708f9892144bd2323da14806b6c8d590b1bc845541848c990c56ed334de9a59cfd5e7ca775644ff9ee3969ed606f0f48565fb566f205dbb4633b62d731e0498614a5fe9ad277e49557ea1eeac5e9601b205525a09d3ccf146f856e766406f256e2cf44fbff3f911c4f34dd94cea64a143d23fc6ca01abdb42db6fa0b426ba8fdf846629d32748f8981828e64332fc6488cca38faa48c36cb212bdcd6b969df4008f55389dfcce4ce12b83d5e80b1d62912f3daa79958381c0edc39479b1f525a17271faff55e9d8c476d17b7d33556da787d1c4e47a89dfed6f265396e05ee70b +shared_secret: a3611e119061c60bb8f76b765b1d00ab8dd98b6036338462619adf32ca39b2f6 + +# Official test vector 91, seed: "c5856298c3cb6ac9787a0f30938537ab2635b96f6d19cc9522063360e7a5c88e644929d2879180e3e5bcad2422b7cfc3" +entropy: 1d129b27be7384c359d04311fe5c44917d1fde4bfb57314f483ac617edd5ac49 +public_key = cc9a64734c470128056a7b5d374435c099752edca129091770d6af831ac7805a7dd5657bcbbcc9d751b140283a2ec533c17ba38a392bb98421a4f0731390c30a8701c1396a4c17cece6cbce99949d0279119e8790722b0e2c748348a8a5a7c760826bbc0d395313b893a796b9d572c10432b2f5363b9682a89d1174f822bfe38b05ddc5b68ba3ad62497c3ab8ea6d13b11a6a69ddb1f1340b41f013952da1ee1e759d2d5459a01cece819e5de09b8d707c7d59519369660306c4174505a51846d5476d41d00393979293c1325a1b6673f16c32550529b21121e95f99f503cea88530e2c72b038aa641327181673e301dde28b0ba76b2b88453d1812499681cddf932370c864bc6205b6cb13684455fcc5e008bcdc16597ed661b3732a60e329df82820af51b1ba4647a7944c4dcc7a8f1bce390c44a9a7221e0c0943cb4ff6f048e2362f89f4113fd3636b97919e41acf042189e02a83b580e5d4a996fec6d6b7b33d690825f366d89f8952898152b3671685a22d8898bd62c83c32a1e3076aeeae845900ab2cfab51ea76c3022b52dc702d05b17a76609c88e69d12d7694edc3e91420737b17bb6844a1a28c0c756038a8c6c6a74906232b50d74cf532b5266d32d01034c56aa898d624727e5363e0bb300203e792b3afd39b5376998142acf52f6933a594c9a5872ab619a8a4317e86a91d419a78d47245b1780bef14abedb77ccb97d550ac223e5001e0b64a61b8fa0526331b409505a512b4b6ba7e3b4b630a112920b431292db5962b577af8d546b7465673a8641ab5807443085a9f0849b914a31393c1dab0fa30b3b1c1261bdc9a8ca69cc0f0432e91c1d42b6a8346cb6fd9cb49b189d125c8be422a690dc90ed4a87c70ca8e35caa16a35a3120b9716bae021c861267aea4244219c60fb1c788ce8264c0241156340daa3b1ae7725c6552cdadd4c244079cce22aa083a1a2c0810fc7ac55d77bb6ef934fb73a8e8f4cc299b28c42c5d26f36518ba4cd3b320ec3158b8b36108bb6d4f6427dc46653ec24927a833853b4b0af5723d8a3c5f37c17b3476d86161c57579cd020167a70c1c310325c6707fc82270f0c73d552363e2343b371fc1448b2770bfae474707305a9b32a6aa77c7fc7715cb35826bfa1696d67ec48cc0c9554691d186dd025ead64a9e39657be0292f39829ef696d3584b99c7367a00034395252f2443ef4692c163a5ff1863be79273a93192d10b661b9051d57572d5caa817338c52374ddb282d4722b1efac7339f1ce852867e4ba2a4d368ccfa58fda097fc59244fae273aa7c63f891bbbce875624800dca2b5d65b5a2d414a81c7525583c0160a006be08a68776223aa97525a1e97b241f59c0dacb50ec89b90bbd58e8f27c9f19729782b2c06bbb91725c3b6ca991e75bdc7850a0107674fabab38e28ac5b9b717ca7542ebb563d078e4c856447a0ac85c9240d77210e4ce850570ab693aca497819b5210e2cc957fa9b4542070171c56a2c1253e006cf12162e9168673a08d82b90812c8cb989394ca862aedb1ad9885598d39a42b3ac25bc914fc15eda2501d7c8c51aca0c257cb8b0c16de89900b2b12a875116cfc967553829e59510a00998440b93d8371a0b294aab2b4697196d397a9ccedbcb2f5414dc8c764189cbf720834327a9557cb44a90286277c54aa424d080822814626b753cb281b9f2fca8680c2e197bab18643c9b0aacf8445618a45814389466f67a5c557aeccabcf083cbdff5569e39cae20584ef46bb56456386f3c7ef5a5c196c51646b69154393bc7a6a6d0869e06c3f8ababbd7aa070f974e682398508a356c78c74be8108b42c6b53744c3742f16c84e5bc6750546739acbada819a2af9c5bbae2ca34f6215df82c10ac8a5873a2a8c04ced887730988c14f00a33821994503f9e3555f790715414095f05bc7d5c20dd9313acf98b10daa4053c90f3d2c0dcc676dba1cc0ec92427d4bbf61425935314494c3e65b266f16411a1250667954388fc5b750270e00a8bde873d3d58c627c6b31d8610597174366c8052f21e429c185bbc4c080122b4b25d00a982101b4b44c18bae64b7aad2a2bf646e39bb241df17d8c5b42db08ca0d6571097250072420ddea731357154e861809fcc1ceb7ad01d843ea928dcad3c1370b6b517f5473b94bd6351e282f01bf82a24c3ef05658b9e66735007b45f5b008a7bd +result: pass +ciphertext: acc839c2bc7a7d56a8472ece2cc56b8cd74eeaa4b37d366f3fb119226553304fe6673e37db7fc7a0735ab3ae10f6cc38151b7f3ece0a8dcb646c571aea0656bf0a6ec1c90023300ab33169845b8a64ffa012b890e06d691d82be4b5741e13d4920079b3d939215f3e7d73d4b9404c28c0bfa50cce06e6288ffd58c73326b77f7b6606ea5d742a32c54cbcded3f92f8c210b44242df2ab8ac2ac906860f632058e90d2ff90251efd91c9bcc9fdd0180cbf824f4487cc0fa6a812e2392eddd62d08c4ef62633b1a914f410ccd7bfb1d66240c035bc97211ce567070ea112a17b0ce6cbbc02587626b266caa1b06852661c5be631b24fc5ba4717e14be2f5ce7f5903c89fc56a46d7f31d840e3efad03c29869ec8475c9844404ff71380b4238c6da7c22cd500e6902fc962684b5d3900c23bd871ade2c7ac0cc004a3ab60d70f946ffe660f3d731a831190a03c20d66483d99cce14133f3a3e7f42a07b985579e0e77bbf338dfafcb0a850794f37f677c61df96de1fce1ff240775339eb9c97a92df37d7983bc27977dd2e54eb22729c495d345968fafabb96fc4592f89c89ee022bb477ec8d48d810e3b1fafd37526303a0430092ab6d43b253a7e0200cf45b037063ce753af83469911634aca0f890d3d9bb7671f5a6a171fd2af27d94155bb4c7e7d5e18c788864ae4c0e3057f6f6dbcffb659ca48113797b66b26e46449b197b72f7f5af1d698b654f0de61136e99bbce7462b823d86f4dd5e7bef7dba147a5a9a6dfd7aa70cee2fc7d558f0a25d5f111134f2777fad92840f2a969da17de0de10a5f74a665a7eed83382857c0f9e3ac4e686b712fea2d99eee8422508056cbf988b33e1bb1cc685a556607ee1876f53bf548ae9deda1fb4f1e0c4e724e4ad1ea9ce3da9af39d5fc7a6fbe8f76c89f7bfc22aeb08708ac6ca7bdf730b7334ed58dfd2dbb82d56d085a553ab8fcc9a3fb865fe9dd3743f33b0c008b48f3c1212ce04a2066bc1e916470bfbf0225745e695798c6dfe308f433c5c9c8eb6aebdffe47ef0b8df31f702f1a7fefd6b6ead7b69b22d55223e8a7ad096e588f941763b744ad565282ce29ec6161d5934e5dea1780c940033f0089d762eec127663d9b4fd5c5d39498f6d01c0687733426db733c9e6eb15798530db3fe5b6915b7945b80aaa0780d8800d9bc6ad02281a25a33450abde1942c0726c807ab3d46d9c91c03140444642d9fa3c2c436287d1abf1350d45154a38594b1d881be08437f27ae1763607e4f7836f562749c399a74bb7e8101875e47f3f4c6cd06b715e6e4cf3a8d7ec0215706ccf5b627c763df70aeb3516cf45976a42fa302faaf4aa0db5c1ea75dd0399449ce029f3b766f9b58a0217e97f58cd10bc4e79d228e2424d57cc423a09a5f55a4934384a0fb2b3414fbd93a4d1289096f8dd2154d919b1894ab0b38f484fc69fd9674504c829116d4cfc8e544cff6c74b44086498a0266cd9d4ad9c6b9e863e0ad7738ddb22fcbfe642b5d30760fdc3142f31e27aebf763926909a720465ecb22f1f7b9676d41f85a5cc407f6c52bd849891e16000ab5c5b3a369f71b1abcf6cd302809cf2cde77465fd823fa85c6050c9d5fc83cbe0d9de966646b679bb9af2c1d89fb4da1bcdad86e2bcd2b7430e1b33183c3192697ee2c902d3a68ba250d633ed6ca044b0c0b5e3776ce445342c1859a9159737304187e14f608b091ac6946fb817b9cc4afad0d7dac61b653620aa1f695bddc40113dc884d762e399f0df4fb6637f1dbfe3ebc32c5e37fa915a1105a01fbd341070c771dd8b3247c99d935157c5e17218aac87bfa024f3d344e9c33ddfc0a0d5d8f39ed4cd2ae97c5d40097548cd79ac398ad1200dc7762e0273dca642462e76a91f242da10c8c38cbbdcf44fa45e00eaa1fac8bcbb67fb138bb5dccab1012b881bd8148049c6aedcf4203b9191ee1b181f34f73ba8107e0fb5d3c93698dc80a70e6f3a23b4e080f0ccacf162e318149da1c1cdd3e64e8de6e5394c29c312272c0110a1c29e2b74baeb0988600bca03912131528d24595841d4fc442d9dda00570f86927dea5447efe93d60be3fa106bc50339d81bcf0df550e317acf652b286b8511d9b75ce32ec55ad5dfb5bc574ca3cdaeb83f975be3a852149528db62b127cccf15784d482f271ed0b70e78ccd779a8be7ec03fe8f734091fefa5eab7cc6154a0ecbb2d +shared_secret: 3b6be80a10667e6ad229725c012d7c5197194d5fc26787d53925d19f81b865c7 + +# Official test vector 92, seed: "a28ead0a08e7228aeff602b16a1e752278b8ed1e91dac67994f5adc372e1d82f95cc390cd97ab9212275e0566c833fd8" +entropy: bbc773ebd2df42c36ae05952d6a64c63a5dfb82ceb3ef4f8d4df3a30ec8c0467 +public_key = 60c06a2db222a10a620d78b129042477537aef90b5f0f20a58b6005ed0234f3168ee927d726733c3221035f21dc2a95471fc5aff57381741c9ddda97273909ec4c68d4b2a22019cc2d58b0f40860cf429c20757c91269979a17e5d01aedfc21d3706369c3294617628bb97c2655656301772007414aed6a9113ca543f9b027b2aaf0f122d1747a800a49da48239eca99fd4443566348a3f8142c6ca511e769cee83d0513444e7778018211f3a683ceda1ba2881a37f92586a54806858058b37aad546d48b4a5f3e6289c237a041814c0531b27045b8716c1ab1566ae22bb1eea845340791e2899020c8ac1d6724a0b8b432222b204b0b2ac55d924b4afa5083426c716ca2de71c99687748b56342ed726694ba5e63e42911f66f8f8b3111261ec39bb3dbcb9ed5c729b401a23aa26015d31bdf8c8301f61abe695066eccdee028b11322aa437c26a785899817893cb321e0b72e7a7131410772799500a116f612838d7601f66f29567e8a0f0b7477114281df703ca76326b8aba041457004156854c1b81092ffa869eb46807e6a1108ceb06f65453800b72ebb4613e2c363b6190eae29735d48e537a717e335c9f7b456c923c42a31b8f4b4dbba96f59362743d516a01400b8f1b3ea71954f85b0ccfa751d3428fecc2663d509c8b9a211c011313b5cc8e8930b223d08c95e5eeb47127a4bc5482b0e871a758893e9b64bdf4162332b8da6d7b29152a914f5c748a404fd865dc1224e0b64cf782b7c866833dc8773b20c6eb28ac57cf5166895cee2e78d41f97b5eea14400c1d329363915094bd5650377924c15c86ec833b0ea0b3e476aa91398c108a6e99e7ab64990513e061ca52756cf29238564cf0cab366f8753aba1fd3e9ab70621a0cf161b398c413a39280a268c1d28172d6501d313ed15284d12250e6b75704d1950bdc5af1959bc3e93156346dd3b47450f758d3e9796cba90598224740b33b239b97c45c696323a05cb15ea44ca4fd98ee589a2f5aa1d1ee00a476533d5baa58027aaceec151c9c5eda23b14367b8bf7571e7c75d197a55ed3a349de636bf84ad6d446e2c3ba5657c683622b136384be3b89c7eba095a89697b4c8ed9215d1e5544f3d957e51a86efc098fbf272a6140a17530ef6e703f272792371b7c5e36a83c61c7ec18e6bfa7752c095639420968b91aee627c3ec575d74b49fe13f2a216c711508a4ab1fe84a20bfb019aae1b8b3c8750edcbc30cb47ab0b567720421359a0c8c08295ccb705222141b74b8361004d9c484061aef8c19de9f8c809b90050f3345d65531070cd36d5b2e50047b97b61cdea5c3b896dc0a22f6ac2a2585295ae0993be023a498cbabd6b37d56c2f8db63804d0ca52a169f5d003efe695b6eaa2c530773cc4347d4b9e0e46a822a980a9f4c8900070c67437576c572160ac7b297bdd074c9eec3a368297f0a34772b8292d0b7a29faaccf7bafd2dcc6999b0766d106e04a76bc9118b7875c187b1f8cbb00b3c882f3bc6bc65b294443610c65b19aa72f90c7086ec18f228c36d63808b0aa253052c1a44a6842568d82b43a994b5b6c69555a449ffd0c3959870f3b679e4643842083b20a40401c51898e138a092ba393bbaca9fc6f37f28d88560a7992c5b95c228b3388a622a6f2839da96b121dda0c75c0b36ef162bd7981ec294ba7f91a97b34c69bca54c2b7e91548fa7c396f3d783255a79b3fc579cb62eed83b430c45377857190d06e5a26576d92af1b79941f922bb234a68b21309db9aede9765c78c486da51e400cb46cb586c33c46db9ba99b983b94815fc5b52b7feabe42b4253df9cbca4037819a47f8541bd5747ccb34ca74158318664b243c81b85484bf050ed3aa81ff37725f29b962f901f5f44b4768cd9db394fc7370d0ca72e1607f83a0cd82793ec3a23d3510ae6ef3375c3265dd8268b3f31bcefa83f8e5aa3d1077cc62a8ed858e6ed4639447aa3d705a1dfc4cbe7c4b74d67183a5875d24552ae74e546ab15376ac54f0582f3a92a1e1075cfb682a16b6a46ba93f31165f32654838c9e14b46476465cfe45bec653d2c0a1cef96cf01e123f1a3116c93b1d5e54730dcc5f9d618b53a7917a71abbcc312cacb170c10e454c41869717afd8aa4a86113ceb654d582af443a0b6a74173f963d99c8d44e5520ae278370855c0e9e01df9b37d13e35124e6c2590e9a231a219c07ef6c +result: pass +ciphertext: 940def77ca2ceb3a5493b53f9f11b03d8714dc86580ad78129deb2f2f402c99f49d8a37eaf9841e9f7ec3485eb2b830298487de09d7387cc32db2d89ccf1341d5a58f41288115b8a9950e3771d7ef4b722565ecf49c40838848262c72cf630dd23a29175a30d589bb271d0059f038ce32fe941da9a687b76496d4dd1b040e013d129abba459d7320a43ad9f5454d22058c137273c167e4bcca4c491d73322cae90e30bd1c5d2e672da993b7ca42137e33e80d51ce3e6f07a0e2d641dcd7bf1ee96861b9d05c99304d3cea4e06df0ecacce42121cc86566764c30c2ffc5e53fb9c3a38c346018953028b0958a41cb7d22640115bc576859c458fbfaf66a916d01384a335bd3e5470944eaa3bd3f00a4d1311a3b1e2b9db547e20298b5145a302ea0a7eb9373822eea0facaa85d58133bbe1d5ad4fcb32d60da6db4ba4d5b0744f7b85413d551406a93bfbcbdeac128f20b5b268089ba063d6fc3c4700f5a1c36dfe179e71ec20a628f453768a2bb70ac71c69b1beea25199613f6d8fdf24d1192228145313d4c6c405071fdd41c61b63b91daa197dddb02806d131365b8dd7db229a47a84d6768ba308ca5f26115c723b68c4e040aced7dc5ec5662ad73fbf958ff04aac4d749e2931a9613e869dd50169bbdbfcf03b4d594e2ec327ea1936f64ff1589b258fb7cd1aa31bff2d0561bc91a6c945f81adb345836b6a028ea7216ff18264bf67e68bdf9e586d07fb6876dab46825aea47415d3ef91a3af677ce277c4d5744c2dc686afbcc30b5eab9ab02280f6ee99c181430ef7305781e42a874d8e5591a6090a740a7c5c5a0bd3b960e0458d270a641c7583b00ceedb6dd7b3dcc16ca1605f46bf799928e5a80f7ec445ced534b02c9ebc3aaec035d3a24adc4cb6617ef8469e98352aea0929d3287ca56ac8b7925074702570920be595df7717f3addc22e842a1d72e2864e32bbbe97d8717ceee02581496e92bcf75158868de27cf0b4b6c5508a9abed542f49e01bdd849ffff94056b8612e955d2e430cae6e34e8e45c655ce37e1fa49bd3fab70ac5c84f14e31622d079088e972555ab850d8608161dab959300d64d6a9e963661a0eb615bd1cf87252c64ba41740fb9682695e4fe11e7318539ebdcc0d29d42c2ae0b764da06425f0be9d9343a43fe1afd763d93b2af27cfbc6adae24f52a87b57453778fdf8178280f4f05cd59b31833af437fafa11ef5c7d3851e0010b83379986f531090e62e36222fac7a8e94440d7bd101264c5b3400224fc700fc0fe9600d90b2d6b1552e66cf6cd14a3dea3b806b830bcda236d93a3d4164db43a96db6266b4e25df70747b421f6e8cc19c37fd3c903e4fe7c22c3bd1e56e60acf7f635a792209e06cb34f5ffa2a882e4e1a4abf4fa1805fc06a72cf23481badfce075a6774430d68d98504d75b87bd3c154e3363c7975f1363fac01a04f0f3ad92e081495cbcdd027ae81a3a8adb35d3cf13a09c04513ffd66544ea4bce399e2ad4c243148dcf41ca01b0f6fe528f598d21704d4f8ccf850d852883b81cc1914fe50cd09d4fe795cfec90652a9dea7bae10244ae0d870b75549bf90087a6aedba5f92bcecb15f770cc14018ad150461b73d3a4fcefd70e1ec8eebb428eeb78a665f4e180b312d0d7f5d88a9e5a17f6fd48cb92147b4a2bb2f9332d8af37e667776b4e82f850dc58f1173f3dd56c5ffca7ce5b5b516d77621ff3a78df6fe7a88479aa1c3b8bb0d40466528e4483d2a6a60be6cf32ece2e91bc090a36708c1b7f29f3318189bb6a05f9acf730d2d6cd20e1fe3739d9179e639ea34eb7eeb35daf32b78d94cb31da90dae7668fdf6d06b6ecdb331415272d9496d2a78b4054f9d59054a07f74cab7697b83ef03501d1bb1ab250ca9caecc8861d8f2b56090e2cf7dc32526f249034891a54b2a8f4187957c374567d741b3d2ab260663da07330621925b35d020c9ef6b354c646891ced14e0f9f4172b2eb9cfea714b7a296b4559a99a6b5393b343e59a00190cad70247d670b0c22599119a545d3140b240e486dbe7fe3532f4e0c23975fbda2bbb8824e93af3f9d2d76484bd0c1f130ebe1a61bf20be7f667fe55b8cec87ed597f8ad2402a0f0786d0cf5141a6e11c4d1eee404aa252baceb67a323a8b091a704dd774ac79be50999466d12caeb95bfaf9324cbd0610b0a4dcc630bd654e9f63a9ca6e72cbb940cd +shared_secret: e6a61e88faaa25ff8bed035f8a47afa4f034121457104168a3247e366e781871 + +# Official test vector 93, seed: "92877d706daf88ef3412eb143db8cd91bc047a9a43b7acdaa42523560dee4c172697be4332042fcab91135839bf74ab2" +entropy: 5b17a6adad541efcbf5ae4b0c0452cd2ce32e4f0f8701801c5b63e197c1fcbf4 +public_key = c75c9083566b23acc2e981457fab1306b04340969dd1081f074a2a33bb85b892750bd34336a68362e00302712410eb8fc8f37da6530a408b17fddb0fd602c2e40a7dc4c94ea843226ca79b167b180f3024a273c57f91cd69629c970617720497c4308e10f03a038544fff13a3afb83fb2291dbf177a003b0197037a3c9283de78dc911beacf30e6c4c6740300266c6ab69893aa9e112b67903df849a4bd59ba106030b62b61bc293fef997a8851d06c956631c266ad533791124a4e09bdb06c0ffa681cf2c6d43670e2a017b9a40c13e85bc1c24ad914003aa69439d401ba605d013a2baa0e0b010363574b71242745e9d709a3ff3b0a2ac7f374684bce9bcf0200db5a09b5d0c92cdc7bbfb3c24a79a8a4a0a9a64376a0793c1252362af170856046471b1a60eb33f23c59122d0aaeda79caef27df971ac8764986cfb2617fc3bb71355a56867c29795f46668f8166970b06c6ca91d8651ccdcbc23fc1b2f0a75c45fb3321151953315036d52322c9b6408152bbb595129f41a8b8570f02b8ccba66de5fc36d892457673a9a096c556c9afd11b06e1ca9cc8b3a9e9765e38e711d039612c4bb296061771e42efd68c9acc8ca61012f295251ccb33252e8b0e6486c5a5bc28683347571b8f0a42aec4873cd3549324ab728324030196035b29ad3043ab9008da6b924bd376cfb103fcbab9450b44c299b4e27165303786944009418cbc66fd9a570468dd85ab652d86402501d61f5272cd880056521f72a362170580675bddd505840378d96334a704282934527f70a499ae99db81516b1d1426d233dcf9855880022d72100e14858c0a226325338b33ab5ecc5a86e0ac4e8504e168c5e1a4788177878bd569d49dc60b1484f43134e2bd39efb207430aa564ab7a88cd40ecc00a10e4b6c663b61a6054323429c0722b2e4464ec0d43374234b4884bb8ddc0a28852600369635531ff943194cf91937b43afd418f8f964cf9c9cc66988407bcc7b5247a2372980035c8f8357bc3db948c0c4b391ab47636024dcb79f094c62ccb64893c0c45c1bc88cb00ba85248253606735547d424797b0bb302c5eb9631ac98060bc47341e69379bba5b5e44980970c699187f62731f2b1a4bb4c7a33f8a20758335bc8a3c4c4c0900b3c2cfe35356a58aae233b066466b34c814a4cb6b9f916581b0361e78a2971bbfc014a7476ab2f7c291ba688d5f75153c4ad7ba4c664a8002058c9eb195a3ca7ab70638bb114c3618bac3ab383dbf292705a478a35c31f06a1823b545366cb6900c59c036b063727504a55c2ac940606c7bcc74643644bde915d83c395023c8fbd069f9ec50e1fdbc8edb0387ad1074b11bfdf220edd7486082a4842d6c737c6a1ed5b98bb78cd6de1153480b3bf095b04a7cbccc19102964e34693a6e492fae134c9d726e49532236018dc517bd94232d717a408af43fd5c837a21cca33ecc2a3859eaf8a74b63c36fa70168f241e2ff52f7197a615d04357a7acca269e47848375bab1f82ac686903d44786d540a496e29642f71061ee76054b5aa6ae67cfa01704b386a657a6773b8509cc1b4e16bbb92cb204b5bc6638cc5dd868db40358dcc4c258915d1e93771a12aa7ca4b3bcd854ea2a111c09afbc60cc91f5abd63ca5ccd11ef2c1b06a38925eb9a4bb569d8c4b859ad278ceb006a3d44328636809a31c377c58957aa5408b488445bf1fc4ca378c733e410e3814c4300850fffb052df767743468c6a91d81dc3c4c34b4b5a06dfab7cb6a741c91107758859f2e1c2d06881612e05cd7444abf23c104b6a068988fb794306e90aa1ad2ccf76482f0fa7067467dc105c27ea7192d0c6fc50b4042934e81876e121c6c295a5432219345bab9ca566f0dfb6b9d4728ab7187f311ba22d55b4047b9b3a17632925ec31bb2322257dfea3d1c1b4331467904eb2bc1f7a4369aab9912531a6835358b016889ac910a7c398c18a1636976e04c7227cc9fe13d61a848eeb60d56635064ba07359730a0c269ed6cb25ca2908f524ae3c9bc860a062192421cdba741dca98f98ae0d955c78d141fedb59bee95957e035d5b05155f5792e88ce43342f410ac92eaa68cd055fe28c4a217b9c2da4ba64d4a6605565d41a00acf377eaf80881d9a5305766747cb076149866504db6b96ee4cc9d4bb977165f0b04d3c03c1f8150a265215387c7983d37463a3136a1b7c6 +result: pass +ciphertext: 0512de1ce921b93fb6e5bc9b3c41ee032b2dd86806cc50d2529bb8a79fa67177246fe90c67b3303bc92b853f645968a3d196b869145c83acc953228cab2ec6171c7bea6bd89376f7f20accd881a38e498f8e01cff9e6b291d3ca3e478ea2b710a3305c812c467303d84332ede16cf30ce7ced5cd1a1b3467e727313777e04f7e6c66acc22dd3d079b2fcb0b519f5f86be0d201027e93f4b1757ff2b23ced963b2b01eeb967b71498e33b47ddf1ccca9de66c13c733f126606907bf717e08d4c6adc879f6a59db879986e5e3fc01340c3b1122ac08beaba9e4cfdc912c738ce91fe440d706eae8233260082a97710df67622e7e5da4653f52c76571f4d707469b2de6ab29f568c68b750fc55cb11a69385b1ccf86f3058f9521a1587f87dd7fe581b7419a75066c58713b3b350d01659045d3f66da70a8a48fa42fae43311028b0b61bc49e756e55cde70befefade922d01b943f9f3ce870dc6f6adb1adf53134758804f2e20919913529bfaa187b37f4115a06b0ae8ad84a28c5237c070599eec2064e4905d584cc6bd5216b193286392977eab85fbf357b565e6071b744476c9f9ac7c76d8a8f36e238d75fc69d8464537230b18d73a3a0ae41ea6c12796978d2deb5cbdc6305a6287541d4e443483577a1c1baadea774c5c87e5dd3489bd7e9ec4dbeab1ec4b3dba80c28d599d2992209f5e89b057d742a68e3586f11839579f34dc314264ba9538550aa6a8141370f4090078be5cc3d06d9b355b478d0b16ed945a51a25a6b8ede93f40412005a20fd40eef736cd1fe8e08fb564479be00e59e1ec273c82f92a8a816868b45a4a40b965cae14115668afe9c2d5848cc0e5717b05fc8431a9cd4ccb1208d35230840e32bc8cdbcb4513914714a203890bdec25c72f89af01ceb2c2f9073232c5464e7ff2dbc3687c798ba88d72fe9a1a47fd91a0f17a8fed16aeeb3a1b5d13df78c2580635f0e2af0e439fa35b1e7091ea821a77bdbc7b219172ecad5bf43db870d21ac01e0954fc4092ea8e85e1fab1c8eaf5322e6dae64b224df3b7c2b7f31f4d6101a82bf17e74b64bbee7256dacc3ece2ab95d0ae162118c5c7c6a1fa94a9015fcf76cdcb97a5af486139f23fd48ea62d4ad5c84125ff7044756016a84654b2ac4c2c0ba6915991575dda35570fb23f1a50ff61dfd88c1e9b14ccdbc48015b49f773ca2426122c323eb2dd2a972b64fc2718608a16162c6f38570d30c1d39dba3bee7367daf206594f6d2eb19dd72799c2b9351e5825d5ff453c5b650e0906bfa5a48f6a12b8d1534c60d75b40b48c1e457da5c9bb7281e503270c5ff5e247471fb14c1af2012d52ea24f48855d51daace8c4e8a615f825e8e24203613ece54deee01a0aba1d0fde8e5ce495c382382de6e95fb640483ca7405d02fff7c4d3799e9931ad3e6d64230d6c9d99afb39a049ed44ec2ddbd7c793202168ea54c60f7758c1da23f6c2a9165b6b5581fbce1ee7c41eb3830ce978b20af2eb4108edf93e27db402ad68256c1f53f4066902461fe8c9dcc92e553f679bcf19b8da57ac0d15e3e2b4f6d57dc9d5a870fe2dc252ed58171f585168c4823320daf7c25af7be123382d6d45998b53f6fe29a2fdc7e6851ffb53f63c8a2e0ab0866d7a680d65c54547d6f610207dca369db3b1ac44858ba5793c1270d8a2bd41400272dd6a19ca3fcd8917a52f65cdcede7aea00731f6786e16362e836c197a9e2b3c6228e9884ac942d66b67bcef075d85ae394a9b6b7c2c4ce43e8d940a0e888947d041fdf98c879f550705e2a7ea4c33af64c56af512ea79b94b865d4eaecf93cb6e03d454146ff5ef8ffe21bcf36db1cefa6ccbefece8d3e9cae9e03f259bcea9d65b23fd395b66c9981d6102d938913d6997772c2582b8ee09f2ff1675c116d04669224b6f867d0cab6699be7b03568c953901e75b67a1da01248c02ee2ee4d1bc7c3282c7b55f511e0242ab59b69a90300c5cfe3c80f8c382d9259a3ea1804211d02a95d166c17cf3e0319b47c4ad1425dc0a9338e6eac2eb91ad3250b6e69fd6dc5b193609c049342531aae7179f3fff718f62d6c1752b5c2e465fb6c625a299364a964e56a9ea758af79b3958a5b016442c76a9554cbbea5833c921e356d6fc6a688a55b2d37b29fe8ca97d2c1926f3e9da8ccfbfe2df9286c821b13e28f39a9ffe42f41075f93e3dfbffa4d3fab09a8ce3bd +shared_secret: 7b5182633888d2708c344b6bcc5bd895e0f1c31719ce78efb0eff0240453fb4b + +# Official test vector 94, seed: "bb4c0082ca4044b1ff60b036c9b0e0495d58667156786c530bc69d949a13bfaff53798e456423d7a0e162a60039367d7" +entropy: 61ab87659525de9656af41246f20e1dbe85c24e335e7ecf9493f46168bc14e94 +public_key = 5586a5b224aaa6428374da6bbed37b0f67c3b5352a5ec2bc072247d20c7e83d83ec162a3dd00b44c070577ebb614c97b06e15d7a41ccb6a45fb2205bb57ba4dac40a12ac5f6bb522ed863daf67379d230badf71844256cfc596d28957bae0c050b9182668857951a38628b83e2082659317ffdfa0e279644fed9877d6775e131682b998adb000ace652f13fb0b9aa57b9022b792bc4bae5ab5f07372bcf131ab93523ff42e5a328fe465520bc57d62f222e0a3623ad8b034f164b1800926ca8a850277d0054f34b941e6388349a87eb853375055caa0305309a06fc2016ba8a3c9bb06bbe7581946755e6c726e9767330d639ad4ca467ff670414a65eacba93d2b33aa628f9eb2949054c82e62774cc13f013998cf29465e8b83dce66928b2c9e1f4cebbb91e2d8b2278879073411358910ef23c66c3115af8ca4ed0b595c8a49ae8eb955a86a2549132cd65a2f6a44eece7b43a40629ef172b068aab1c2126fe058ad02183dea6994abc7daa71414666c57b4c40a17781ac4784e6ab2ecbb8fb2101fa1530a00032b5d1b51b57ac1537076faa54b3b9bbfd9dcac565209cc681b73d5a3c7138156b258321c05a494345c9aa72197c9d3a9552e437e891c437ba16c00c76f0a6252c8e4cebed86398957088596ce28c5880db1b90306958c12a45b5a14e1b05c161c5a3aa78099154a557a58e6c2c7758653e3209edb90110e40e037732a7e44d7a60736437c7a3e872c82b20478083b2592ea7418b75b002f1da834df8624f665df2677e0ae98c62636f603bc1d796935a11bd18fb851e8076c7e4c58b41abc71481608281ee4c572b612c08b8cadcd6b7dc83130f161edb26b1335662a5161478eb5d5a8c61faa175f54166ea2741d27c0496292380e93f6b77577b494c463c9ce8960bcec25f43f198f0552da73819bd7131cec101fe6448f7ba3fb03637b351af9e284da6677b53b71ffde41ee41518b18c39813a82ca041f2466321ba9531ad4b576cb8825978b565580d5f000b9a56a943c2cedec578f728785487abc0a8f2d28af8aa3237022125fab084cd19565816d15f8bc6936959eea23f8279c74946a8ba37d2eec75622c4f911c24839b78cbc8812fa55e19e10ede4931f5d16bba8aa44943bf9720395a8b1328648b887b28a98423e4322a69a752d1d2121d447c2f05bc91e52635d06bb1e05daab02f02b6ba9ea8944d9344ef68c23af10144b93a40c456da0857acdcacebf1782d63a0648497c91916a50b3d0688800b968f1e2200fceb4538f7520becb0fb86368ada208c0602e1ba5d2ca85da8d36ab8782a80436d69f65622279d8145aa5ed9671a28699ac9990d738c3b67ba500a731cda82965a01b4c16144383bfbf3334d159c31831f94301d6a0320a4c7a340aab3a18825516b819a285dbb82a28f164091516c2519b9b534ab8d116cf61303dfa4091fab8669a417a9862f90491d251277d4b7b0523b7c4e345ebb090e5ee581f1933e7168567a857dfaf916f7747550409889bcbfb7e32840537ecb7c050b18552fe5aabb6794b27505f3b721c0b96b738c844f816160d3c4349c4463f12d248a6605b52bb9f8b370e958db55b9ee0663454104c47781e8e0a6eceb2a2632acf0082c4e1806c0927a25e7ba8f1a395f1a352e72ccf72093a9587299e5bc23933395836bcc97832360a992b040a7b67d4e2caa3d227f60d4c8ae293070b1878c63c8e106267a8ac7bcc850dabb5904769fc487b4f417388ce6755058470a3a7fae41b56f009b01c74af2c0a7d252b30302a7b3585864c84c8aa4ac42e82b1ab44215191284799c40d5ac80079d30625dd09562e555167391a370fb6841a98ff2b85713b75ff58b984efaa29393540fcb20e3c1cdb1887be3a30fd3861d62999f2c376704983f969197c9165f19b498bc169966269e3af2300847c908a4738c8655f476238fba9bdb05c3e4f1c3aadc7432960603c36f759c69e4ba048c76561ab4831b40341ed5c05c7b8a853169f2d75713c97a883419457193b9889724d3a108c1c3d083404d93a25a98babfe33d36fccf4f6623b9e378fc5c731b0a20df7b5c28a0c86c065017d37a65d89e8e127acb630f4304739f19bb2a596bf950c996805f73d79ec0aa09dbb0561c3a3bdb13009f672b9f2c907c468d916c305d530fe5910a3c029a722a9e1e6048ef23454bb64b1c9eb2d1c1fb4c57 +result: pass +ciphertext: 9ea5dcbbe778444d92c1162b8842a4a2fc33f2e4de75c1e5dc23569c80479384067bc22205b47bba218bb0c8f54475d71141a2e66dab38320476b00695a09735ff5037008e16ebb9f5d5865a479fefd25cc29e9661569237ef9b1a0f3f857328d857c1052490b533f46b50653e95b7159cb7373ed0a06b86229d0cdabda69738c45e9ce6339c58a5206ec77b73e71f29c55dda3b396ecea3f5dbd533f8e5892608c204518174fe2abf933b4d1a734cf0f0b3e53b566e00ddc9551164577ec0b9b698a35bf949fedbab9ba066b0bccc5611cc57ddac6cec3307a51e9af5ccc4aaab97551d005a68c968c5ad29ac12681672910919f4f3708c839f68ba43ab6ed9b3fd5ab913c156daca0c79d4ce04604d49494ffe53e204bfb04810cc179d830b22b36563674fda54c8369e412160d3d5f1e5494ec76e1714f70b5d41312802dc615f06a22159e762f825052d1de9d1a43bb476c43ab6071a53dcfd1575beeb415a58902a22b9018d1fe86b664d8676b2cb145a3b86756dd1dc7c0c8cd64777064e95f3e47c54544a0e192116b54ee581444e8a809f6b4e790888560842609c2115b6851cb388eb3d441c28ad517eeccdcc7fc0f5a487bb38995143fa2f0f99d0ab708df86ce26756adbf7b75844c8e94b628ec2b117e07180b7ef46bcb04f9473903e75cfe8c34eaa3fbc44a9da3568b06ab5b8a2196b09cc53c0d47d28a118c1ae014ebefb782a4927500a57c8a4f44a9051eea6cbfb00a20f3b62d1101ee1d0a9f7a706774b9aeeecd91daaa82ce8ca7adcaa2727cfc2ae37c1d05ac515e37108678272226d1dd0a7a4a7aee2be99831ff18864cc3d438427897f22043cb5e193b27465b3627fd9d7a0976268f2c2934050701783e25b73537aae506b6dd8de3a03381b96c9af1e0cb477bb1da66683b832402c829dcf20e872ab79f5f4a658af4f7d53430b415d0cb50ed334acd4ae8693bb27a0b36b5f2769674758585d03121c3636ebe4d4a55f23e0fdf7463385fac3fbe4827a6cef0e814823dc6aa558c1e9f18ece63a62820bfb338a5929cbbcbd496c601892a9f6b4a34fa43d3ddf9fcac8e0069a733e4a9cf976427979bd829c0d394ca2b09ae53a4a3e7582e8035d22b42f0f66549ccaeaa5809afd1c18b22d5570e4bd6a872dc534b4a1c404e4f9985aad35422a27af913f8f8f39ba3535ba4339710e2869aa150fdadd00ed2ddcdb85404bf6623ae56f8279b5f86f7e3b28643c8588d7900397b567cbbd62bf9399aaaa1f608b2be7f0caa251b451b6186fe58b49d4b7e061193ee591da5bcdafe08fe03e3ff0bcd7b5327817e8d155859e77bb84ef616897e15ac38b516bc53421230cb0c256fa5aeb72455300983d2114b64d61c9b2f2f08e5c1f3af7a00f47eeaa36c9de5fe9487533fb893281607bef7b7c940216abbec21befdf21ab4e5078ce57dacb96b9b46281a483a11d05df9933a1e09385e6cea10a26fbad604cfdb56e82e6e7fe146d34d935946e19dcb87dd0dce2d2110614027e7ec6208bc2ef5d0a1f9554124abc026233d41958d683667a20829811d224f978d5a3fca48340dbf8b6bf0953d90eff929431b8c312335ab4c5a8538d6b07dd53fa214974183f2c0f8b2969f59881c5a7a90605a8ac2d47001a9177391a66cbe2f26664b5b446e03df736fd43ad9dd80d753e0c7cc9c86c0fa36fc0edd2e5515683d88d30f16c0a89fe72f855bc47c0cb676b2be16be3f93476df3128d49e8107a05b8128bf69a8d4ef13ab3805d78c2dd2d27b771daef67c3958117901d0f23f4432bf07a45cfc0ee2345363bc713c3e34980c6b0266f990e33fa25cf7a6ea84fdb6eb43761d3117d99a1e44c4996787d286ee5776381557ae949499ed5ffb3834aa30585aa8f782aee707e02aab97a4749fdf26aaab56068b35ccbcd148db9b87e07174600338942ed289afe3cbf81df1636dea87a53a15e87456cee2c8693d2f727035e52d89f4919575c7843485e147c36e9efd0831c1ceb9aa70bc6f0dbea7398e924ca07fc682dbb2b9c419e693267c37255397ae89f3c76c6ce634d7113eaad6474dccfb0bc914b4d11371f4730b228dfe89a4b0db7753239a9959a3b250ccf43be6207a12e588529019e72c0b4f432e377abc4f29449c45e987bfa765a45ca0fa39d96014dc447de4ccd3b0a6e07def8afff4cae12af7673935771be3aaba37060d +shared_secret: eff76345f442ea27594bfb6e1e9eeffb55dbd15b9936a3aab881c0d21b45c28e + +# Official test vector 95, seed: "121d90e70af6204445d0deb28ac0c108262719e9fd3476aca74bbfde89faf04d8d5f89a624e8a75db80431f0d10ad28f" +entropy: eca2adc3da1fb15f34033405ec08ef2f46163df4bfcccf8842c600ce0bc2026c +public_key = 56180d96474d83a849634866a5cb0e6e00b8cb964067060df339cb2ea05fbc6021057978ff3baf47ccca15d90147473e8bab23693b6b70872b27b4a4c0730c5374a260e7cbbe9a094ab50e6fab80c32875c2032a5eaa8f2347c313409ca19302a0437cdea621da1ca0082157ea362ef7907fdc5826f067ac4a4a1e4b997d240c7d3df9ae6db528159402d1943fad6743e6e18b345ca2c0494d9bc956888ac85c021153b65388f04c456608e41361a6d3525a1143f610c21b2a9a7f5a2e1a461552904e341ab427028e567741d9906982e4b563d980b68871eef012f2c3639a244cd300cd0030bcf4a2b1db5101c1d66ee28bc3bc276b7e9922d0253904f30bb676777a36a897d35d381292915a82f9b2b7705380277916e16a137030198032b865c823e80a58c12ab39639488d65b0c80a391102cbcb4811911c60f618323c13a0e967bac6561483026c32348502927f70cb2f780bb571f861cdd5394296436e37737a8ac6cbdc42a0f9b96941907be3abb5e7740e193d590c862130283f0711665a85fff5158c968578781a7b766cead81633b6a2560b0a740752d83253a04c7f17b90b63860c19f38b78866edbb79482d8af6cb858c8a38fcf1c423f10cbbd9131ed87116b611a75bc109ee57eeacb6b2e1201e488c785b87f384c86587844a921701205979c1ba17dbc1519dc0908c656d7734a5a354e05606acf7901f0c7590e3a324c30a905b2462da7cfe478a4697601618bc74070a9e30707219c53b48c14c01a8fc745098a27b799868166c26f51a12a9a24c9faa336f92692c141961ba4444dcba2a370a63f533f87ca2b1b9537987b7b71043d5fd090300a7d4673a38cb781f833897e94955bba19d428cb7f71710e98901b3597467795a84487bcc5a1180482fea1205a0a854481719c12b11054ad3c85175a04c27011c29c387d0e571084f625a6f73cb5986945cccaaaac7d9eaa305c31535877cadf213d5bd25801438717dbb5051532f5f135f2f79fbd093864439507446b36f349ce4748fe614463917864eb90f3f36742f026ecf32e82f1cb90017099ec78380b5aca2c7e82657557eb66c2fb633aca3d99962ef8927a3f3c9d8da538b89525310664dc2889410465e90b4d078c7dc8f030729555756c807fe228623a37a2b248ba55516caca65256bbffaa6cf6457dba32336a71221659358f955416074ad0131dc4d186bcca317d193a91d12900c477a00490cc464a119214df01882576b41ad7b6f29b34dbb3b03a5c77b2d4162d985530c908b186b7e168c2ad69830302283cca078f5816a9c79add9bbbca9b3fee02447dca3ccb82bac0ccc385538208e49742da9616a28bb3c20568838de02140eee3a7e5a94a82563a90720c62ba2f32f05ddea552f565b4e2597b17c3b8c24168d4484deff79a25b82ee1253049e619829508b01a7891a10db5c5a532f4880c169a38c7a0c99715a2a696bf66b678a0349ef02c7002a5e5ec3db2c3647b960fe9a343b540069a6c228e024719e269853535f5e841f78922dd85c3052188a2db0b2a453b5119311747386352a437d0a0e2fa474aec0bdf1090ec169cf473b9cd153c2131b2e7e001d3525957a487a38c726d710a6bf6a1f0027432c53a56a96c3a1a100ea69103fbcca441a3f43002dd47714d397f7a3a02d0137a0dc060ea0669530161c67334b8965faba455b81a6dcb37c8d2ba97c9496c3e3bc984c44a7b2611b51794ee2347cc489c07b4a89e8c5c620221b9c98c08eb5b245819a92cadeb684b82757e00039079e550a7c7a14bc856e0d347d28861921277bf18932183cb9c40cb07d67202a7838b500df71b1ebaa87202a0943d982aedf41260b38c67e25173dbc67be8b33d10724b08611857c13870bff8c0324acb67f498b599db59515ca863bb1016e87d07b747efe8c903f50b3f7468053587555163e7f5165740204b78ccf2bb11dc32ad1cea844073b7d4667fb55b93bdb4a708db296f3bbbc511119db4479737578859075c320e55b0a5185552cb9426a69b0bd11b4dff716d5cc208e3fb46c3c4456cd63ef1d598bd675d55b1adc177790da6509dea49aa958d2ce9a9e6ecb19fe96548a88f7b489433147dde00139007b6bdca9b3c6c0eff0a1832c10a257599fa50200b167829bb34ee72551bbf3a650c7a34ae6ed516d401d89486d438a0515a537077561ec79e1a3963ab +result: pass +ciphertext: e93751ffa496e521eb17c23e50a0f6760223fd2846317d2e479e6f78088daf421843d2da3581c95bf51904b3a1716bb0c0f47095622b02ed4d8a7ae681d50b91606b597fac2c506380b94600919c4d3bafbfcda50717f13cd2d149f6992e48390333fa9016604aee7a8680b6e20003f62d265c5db1248774abf9a37b47cb63057486cbe378767f4f43a1280b8abf9678a86ad0195f915d880b0ddb336924c3fcc135a7a34517713d5c43a1ad0775530dc1429b55dba7b95dc1ca7809b5e84e905dc12b47bd82289af59ef73ccaa232b34e68a2e1cf445f657fa9ba97dd8164e39937f19e5d3c185098683aa7a5ffa27077a2f2f898c91d0dd71f8a11c6fbec90bbb3777da4e6184b24d8aa84280d02ebc034e884d53cd00f1d7cdf5d1da8e0139d0bb23e02d82aa50c65067366478176bb3997e0ac5ee7d499aefdffbb93d5a809e68c2d36dafe9ddb1fde88b9aa682fd32bfd10994e4636005aa3444f5d69434ce963faa32092f0fb99e980b1b3e9c20d322c8dc3be47365823084740da3358ec916d9f73e4e7d14ed93b8af46636564e34302906c2056eec89a6d5b80f464fe052348715f341e4463d6be386f6a00c9f2195e8528f7874e802ef1a67eeda9f2d88ccb798afee08312f50831c7464d8eb9477d215ff6197dd0c527388ad39f285fbee3b7e7b3577e5ad8c9a3296a3336e20d0e488a136a12d216f956f431098d4851bf0d5a39a6c9816b793e02f3a0caa80b12d75a6d3b30dfa8ef2c5df0b7ceae707589b11ba925c389b91335b7108c54baf166b458493037091b9b03d4464e30938f40963c535ecbc15911506a392f8c810faffb3935d9d8ba7cfa7f9bdee26dc7c8adf4cf456455aa4a9fbc9923752d9da4373b3e4964ae8fc35d47db83884017105d83b403e265e707e08904ce12ef68be7fa4ebb2e394cea40f59d149e4c4c36517b4ca97715811d263f75f3f0fead99bb8237c1ddd87f0c97abec768b6778ad9d7766b59110031675a710e2ca58adbed88f60ab224f438d66803c824a597f4788f04d363b01993fd1d781fade7473d9642436a6903a4f90fe2c657210543ad430f380192f3fec2cde08ffcc8ddf6f06b2ec6ded6df90cecad837d216b8a2430fa202096a874a8ad599ac981851b3d2473e34cfeebaf6c80c83dce157e1d48dc55fa93486df68761a68cd4ac25598e7aa592176cb2c129afb0bd1605785f677ffec08ea09687aca6862ca2553ff6ab3b06efd9d95d9e85b9762f7d6c69765f12f88f5c53fd27eb2f01e4befa14cb806ae36f3e03279e63f9654fc6117939c821e95cd395233278f13a9383ce09098d908ea7cbf40601f69643a6570eca6fec04a20eb27c621edd89fe1cdb8e5a92ecd5a79f9195832126e3bf6a50d5fa01d9b6b421497d847507cf1f09f292becdf91857b8e5b3be40400095dc02624bdb895dc54c59294806919a370433cef927d816cb8f4bf1fd8d86e1b997176bdccf4faa3cc2015612d08003a1a20fd0af157192fa4e5242da1375ca707fac2eab67c9f9c8d7dd0cdd555e3ec7dd475655f6d5a02c5956c3168ad4c0c7b2b661ac2f02898594fe539e09c2d484bd179f4d58a3c2dbf64deadce93d6c5941a14b68caec2d6599bd323ae520c9e388dae37c28ddaa92ec49c725ada348b867014b72f9e18a3020dac6438bd35b0a5850fb9f60f2fdac1a7d4c7a1755c898969666778fb16f13621fa171efd844d89eb7c687d429e3e35eb353acc6aa2d85948527f4f704c4bc7f96ee8ee8c6110859cd798c12610ac35035ff371ef30e20622339805b8a09c8a10b45f32e1f67372bcf47c3b5c1c3f4786a01fa6dfd40a75859e60ad6e74b1bfa906c5f72c0631661943aa2d7ef701ba54546b5bdf6a057e4b4354442a8188fa6b2b4d316a59c3f7512266e145976ba4a0be6b65b6a70da0c31a14810f27ed51dd30ebd9032583e65c3f6e7efe5f6ef9b311e2984c94e88007d4e810c387135175bd7389ea96ca37b041bb0e1d6143b3f4df77e43ffa3a5e2b07c3534b774c2eee8ee2ea2b2f672a7fc40c73f8fff21b7feaeedd7ec5e34047cd6665a58eae2e42f9ee1b52429328c961449b1b712c2d8f3a637878acb02801ebbd15158c1c86ea656db183e583b297fbfb6a2f64ba68eddcb2dc61eab4cc180b0efdcee90dfab0feb0f49f833cb029f8a901cabf2ea1f7de4b8aafb630fd56001cd +shared_secret: d788c3a7c4d8a957b409028cfc62e5266559cbec39534d7f337aad2123bba577 + +# Official test vector 96, seed: "b3ac6503206accc2a92cbc210d020a2654726911d11ce676aa04feaa08af1d20c654e4105883ae470ec3ab299075d420" +entropy: c4f15bec2d7701339d0ade4835193bea3632edcf89e74992620d9eb623a0d0d4 +public_key = cbf017d8e336efbb596130b73268680be4885255aa6353a39f04740be2c3910a9ba91700687088aeca7fd4a37feca45bf29a27824babb327c49f18539ed20c1755983e6b1e03f98f8610227362c9e12246d2176ddaf48dac31955e59a7d69a8dfa582f8c66b14db7259e6c4c63bb88c995a71fc44bf964b1650746ff672fc2716528741dd8174aa2326e21f025367a0f243ac63728bc6ab95dc22a9632e18cff13cc6e38a1f4a0a542259d41db0c1dc640e8735dfbaca58c3c7f18e39c74641d477099ff1ac96c924e366b16ae423de8bc9610c855eb686e8d9301f2c08e96e3a2776523ffb93cfa3726c1d03d0c2c634f1cbae6dbb4cb987be8eb464190056cdc29a7651c79773b1686269c1646a65786f667986e7a552278713fe5c5a4f9c23633c467b8b63b408c4229cea5f5a0664852729a7474695137c0961783656df45277092226e232d5eb929c8bb57781cded3b7d5266bf5c2ccfa992bb9d8b59746319e6b5803d00a84e2a99989c08bc9726783389fd506074606a0945c7e3e22500d58fe3a647213b19beb6174c72833dec8ecd036499e53b0a18a1d6e471712a1d64a903b1f3634ceaace56a906a1336c9d9708768a6bcb9cfc036ac22607810457e8560561a38c5cd84c6ca021a98c15aadc47e874778a81423d669ab411a72aa4a661deb2b8f4a06600baac967617bfc5dc8d12d44d9a7f80b46d9a40b91a66e3cfa0bfb5523c04922db21c4120717b436c6dc81030d13b867e707b9a3891791c756800adb41cc9a29260d98202472b733611037a98b454b6b5af423df236dc079941b160ff1c0b8ed1b14e787898da354cf79ca4fe506d5742b58141dcf624964397274737e4ed1aacb76a92bba8966ab24741163893587c94cbd4581bd0a110937946051c572f2232a149667794812039ba9e6525a298531e7479a161123da95b83ee746dcfa1d880130af080fd71480a4d51a48c48abcb62d4c7b44b712bc0ecc4eb53a929a1167f3c49be7b019002679123348af5b7ab18a36f86a23b309154c5307b003966c8755047718b32649945c7865f123ee60198af51dd591934ee02ef7ec218569129d03b76e9729dacc17e4407eeaa4820e238deb307d819528b932bbdd74ac25c0476c037cd8200ee9231533676f3e1b11a6fa2511a3160f10b26f2cba2966572450516be1a39ed8bf651b961e58be810bbe83957037f1671c128f91f302dfe1103d624b97b4c331db624fb354178047ad4b909ba93211908e35014d896144356c250df2248c5487ea11b329214b4c3b2342e64244d684ba914e020228e0d9b5b0283b5c96a22b510f31974843b21df48878652721bfea1b38054ba1b39ebd0a03746ab5d07ba3d80b5be050af1282bf1ef87629ea0e2f9a272bac24b7d3b464c182a8032dc2acc0b7ba3482c5cd7c0b5199522634f61d553534020671baca3534193b2a9585f47394aca1c8aff24c05a7a8b0f59745e56e12321fa1a7b38db38de3485f017626eea474e3e3c1a6bb5242f26de2529e517928e547423b79cec6452f14c17ac403c0a6e23d25d334ad07aabd8c60310082bb4a194d656b2e2b64ff3475fcc9226a526867ca7dd03c75351ab921eb35e445b144f4a7e743acca85372a03c4cad754f1d788a1c919efc198aef95baf7768dbc94f36d5a37db440ee403b9b8a339bcc50c0469f51681fcbb294a042147f895d9121701071a6ae8b85b3ca4a7f197f06cc5ed4e40c5bd1ba18f76a8010857bb0c3f8c15ef8f89fcf22afd560445c8576b8a46297f1cbf5896232040727eb40b78c97099a09eae192803bcdb153b7c9918b8c66a3e8ccb0a928b2505b3034886b452bc9f7719246d62ad183a292a75f4d6715a42153b8f8656b2c397428803725bd66239587506e9ad5694ee0592918a14346cdb0a9117b7969345bb11be07b82dc4361b580fabc4a91d919fc97251ad1a69938b507e066cfa6a251d98927f2bf2a9806163c07d1a96627265776105126e5ca5872c61e4bba95220ed45124e76b334df40fe0cc4f193baf6ce69581313616c0a9de56824f007d65692d0f675aafe086b6e2621bfba18ce1adc4337553c81b92ca4a9a2c9712416a168a7a9fd06450589641e952a96b122b4c4bb63721d6e76201f96e7403a908819bb61864f9225185678741da30f96e7973a83811b94c50bae593d1da6d3b306bf50669e590eee2 +result: pass +ciphertext: 3e9c6cfffce759668c9ba24ab80658675c29e84e998e85c476cd6854af0964756021a73b731c075391093a652e118d97f33128fe1fc8af0184a7db5a9c9ce619133154b530b34a32e1bae01226994aabfd137ec3ce15f3f83b80c78dced99d36b689e94c39e740b30c3b60f9df1980d0ceba60a721c171030034c8b686b8ffb86e14cab112da3b734d6e7f402540377546d9f46c90b52693986293ba3e96e570ec9bccac78fd3399c1a7ec2bf01492da9a54df0d106b311014af8ebff9607ad85341f31f8f389f0f780a24a84bedd3e62e5ad282c5520a7a58508f32241817ed1d673c344fa35e2949b50e5812cf2029921d4e673703d056b5a99650feee6d77ce424003fed4b0583a0b9e7331613d566399c244b2d497885cc4cf7f067cfeadcdb1702ba29d1407ac4986a0e29db84866f003f1d3f56c01a42837167ceccda9b6afc39b8ea1859d587a092202003fb06da60bc4928ba839544954c1c9bcae5b93dc808d7f312ce500ca22c7272dfc7a75182c020b5004dbe76283bf5561bb5c0bec93de1675f2e299d977433cf601b46fb52c4f7629b2a85a687a465c16bbea40c06b36bafbe2bc16bb7bddd9be6b4b710fdd63bad9bd37637f46b3d4503655cd517327ec5e32af5faa3cdbc0a83ee5fde307547b80a5da0a047945542b768add53f4d159004dc826b7469d944e802461d2a9f04857ea16b29121fdbb84ea84b1cbbb5c3accbdf7b756be7e01d25530a315848d7c5fce23e96054a5c253d4ed5a3c218825b707f97e9ce17a6e5d6c7771085eec55068f2c19591aa2324d0ba0b2cefb03fbd8d26c7e9a37cb9aa7ad69b782405606f32b80c47e54a563a960d2e75352d7b4eb4946b5e744621d62e80602902380aca323b31e52c013af38e3ecd9bd47fc632c2dbedf7948aab5a10bf492362a94eb8bcd4997899e7e6a888befb98d618327dcab4c69b25a7cba0c8cd1b9b675bbf0c051bf1b8bc1e88785b10fcc67b6bf0f690df552c2720c78767b79b02355a19c56751a007c36480e3cb90b9d91277feeb13b437b35b4ab6325113317d0129d85a386533dc8d53dd3bcd38d93cc6815abb1f30c1a3d38544e8ce0d08db592c5688598ee73eb89402b2966d736e728b75e6ff5702454b31f5c4b68c60cfb64bcec551b92d922b9a418c12b021e847021dcde19401ea9e277b136f9ebc4e066935c45280f546c806ee6a2e5d38a43f64bd467ff41aea502ca82a5cca6d26a9c688e23c0543632513279be831a342b9c00b2518657059e0992beb4267aa2a441bf252b01a92e65269288cadf6bec7f17927f01cb88d8b785baeb4678c16e20aab4de33a458356ed74471507c15dd95c97377a08485f8ad20eaa450c65e6620c40cb569f429dbbccf46d5ada1ea1ff01dd0a4cf1aa1c9b94490c0a216e1e6df250620fbf705b706856bb03a645709d82cf3fcf6f840f98b3fb4b8161c06b8a1ee5ff8360423bfa725641fa779d3f24f40c8b348f68563dbae52e3ccada99cce8ad681213c046582875ac027e6ddc210636fdd68d3f6b250ad9f9c789b76329c01859917f8b0f10b5ce451c821f9ac8c060fac028077aca46fdab43ca273d98a004acb81976ff47a50afd625d5122c7cfca554048183ddf5e34342796b17b9848071359e5722a5e4bec026733a57b1fe3ca8f5af95f3b7674d38110bee4d2c0ae39418c2b6484ac676cffce8781904cf3202d9e1767599fe870d1856bd52ba4bb1d34bf623cddcc67b9f967289b02b09ac41b55cf3a66b1e5c4a972bbea1494a4377cb0aa1b51596c5fd0f874bf8b2acbb5a0c0dd6c7c41b8ca66def9b190db9afb1fc24eb91208ecd17b8cc6e4f563c7f7d81c6188384f09ad34f8c3a6e1f1a592390780df959e0b7ab7cb255bc8ee1df237b361c88001fd1606bccc88942cf7810201bc62a9963f8bb8d2ce4592e0159950451a4d5aacfc1aca2cce03c54bb1fab96cf1f79ce3195181daaef8c527d504f5ed6bb29efdecea74202c3a7b9bb8582abe579720226df3c953a8d4d19e680aebe1536efab43379f36c215527dca12c395f71a0efcd74c6f2be3979b45234e3e16abae1a1f559470ebd9217050e6d635dfdfc410962e611917832575e1700ae85e6c79db04ffde6e7bfdbec672e5620f70d4ad86bd0b12c65de71b4dea5dc97d00e0c51d3c7707360106da1f7949fb7d706a97594224c473b77c699a +shared_secret: f4da03d95d99bdcde651fe09b288b46588b50ebf50ac1e35d86077e04f76944a + +# Official test vector 97, seed: "59eff60b1ef6185db34ee1e3b1dd2f159106ceceaa79beb74923b4f5623d5bc52dbf5d2594a1f7c6c64d12cf144e9ed4" +entropy: 28878249e2ac2b6263422993923a0c8bd05ce56e385ed13c943b03d226856947 +public_key = 8945cc28753a4f3771a68a9000944d726479e1a79d88675fa13795fc086d79f82ea5dc7e2da5ac939a42728963bfc3659d50345694373b877b0504a864247addc746e98126cdc71d0e3b0c7f457c046ac8b8c1458ee70c82905ff5183d890845b21c66953c6402cba2e329886ad51a92f7c673995fe255bf9462b2edcc899125b1820125590024b6928fa0c79476ccc407312664b83c9c59a806989c3252683b139799561708732f57804a96c0b58c88cb4a83a1271a05a9a58a4c187b45cc893b9621e8c5543a02221efa2617b0a42bca1880959e70496cd1452d36191dea226b49f76418b1a44079c2d6392c37a319ca007b65f57743598f2c40a68dcbb603f11cd32c368a0688343a25f6a348c0b260b1946abbf15b3c9ba0ad1cb302b918e4285870c9444118598ad60dd6030c45f33239abc79a04a05a2cb8e62128a3a9ccb61248f1021c7ba5751dc60d50919862332bdd0bc371e4037063879fb5bb22290328c9194aa83716316b7747a5130a984a249e2e124ea0eb67396a3197fb80bd672c6e6cab6de2cca2e3ad70d5866fc878dab1cd654729ecf9ceb733a1b81890cf51c2ac112a52b6a4122c27b86cca81089afa1361c4015abe68c62d9a11bb10358459882f58461761a7ecd3b9b3b17e32a682a389c4328bbc4aab01f44ca93f150e72678160243130555ac9e964c784c33943b5ecd07aa8097be421b796305f05e196ae166559ca5c59a445bc98092be1182f8000d5c39b7c074e016433235aca94d7162b853e45367d42e1604b10702cea82d9004259d130ad5117ca24c6ed411d5929c3f7a6bb35cbcb2ca6bf08c06d1a1cb63aa54d4164a838173b82b45523e00559994e8ff5a9cab63c6fc3266998ca8bd5820e7b16f8f86ce149c355e49451c89624b4b1f2fa7f09c5a15bbbaeb6a641d561830ba25ea470c9d7c397499c9747994bb8818bef9c1ef7802fd6963dbafb6e6dc5a3ce1509510578b96983d08c53c9384e45e6a5bea7c943d11c5c46cef5d0566c4c1f99d00079b0641636bc31913034a134e7a4b0cb959ea4662be55157fe89a7eae1a976f30517ba7e019820984115e5ec2e7d00267240695f600b2eb4181adcad96c7605d5c750154a41124c6f23696845b9b5539ae30b1564bdb2b41c09feb96b31b0796fed8503028af11b02e68f342e3210845525a52268a1b0b4f7648600b455c5c824c49e2972371808bf572017331cc8bc0e11147bc10793e096144a4187b196abde288b134bc54c5b3b85312e7a9bb90135dca9bc7396615ac979de9800c26057ae3064090174437209ede210cb2c733302c4ae9c1ac1462024d54006835ac3f23611d1bcfc945a58401c6a6da42242983f4e712a5080bdd13633b1c98f32835f179a3d011aaa46b9b2fb810dee9495cb4451fe0ba20f71992a445e0c16486d06382c8cc4051647739762257a00d80956475b4521493df79a28319c2c1338c9cb3791980785c2a1ec4a11844b608a7c7c92b81015534a03904cd5a4777fd587ad8004b61ec40bc9aa7a4268ef445900522759cc5057baa2a5729bcfb3a0666126a90d56b7527c32800960d9586e93579eed18189f0a762518125a4317649a3c1883c6ed8b047b5444667b4d53ab5d5b952b10ca1b8aa4ca5e438ee3c2e79c2132bcc257d8585abb609ff870d25826a67075fc38c32cd1c6d78e56a4f18cb59c756979331f1786820ba297f4c26ce251c93686506b26805286cf5919ab660092e6c1825d746c8c9478b408aca024376233ab8c287d709d02f7b8c6d80b4430917fe546ba774482b9b77c20bccad85355f562152a1593cf2bbb02014df47b29d1ca5c1d300445cb4835b45bd59b92caa1cadfab9986869f5a7875967981f1267e615180bf7952a27ab3527a60b130d69e155ff88410b1a10a705b14df248cca801e3b7610baac9d92c75e4c759cf7c8f644b610a350a9a9b5b59eb798a1cbf42d02f211a27aaf05ab8e19baa600f3babca5d82c9388466c5aba81c32a7dabc9775e73a77432f9b96225db1698a2c7a6c9b6949c59d7796758d24c41872802a63bc9723b17f703903c84e425383051abb07e94a1f19a258a61c66b56f46cccf68fa4ad62c528cc1bba2d579913ab754268eadc4204b887bb764096783301fd30ef9d972acacc01977d137525d619df951b0f9a5008bd9cb4524c5ae7cec747696489a8fc0ef65 +result: pass +ciphertext: 6b45b47d66751eaf9909cd0edbd820b9990a7fe19e758d8391c34f5839c9d883ffa86690b4429fd944b2ea3242fc374b007779138a8148c80349b13d098bab8ba58e7c06fa8c7f06e681402dfc890421cc926b7b6e1798eb43ad3e65802b9b997a85985ce8abec4643de68dfe0aa48abaae4f1a91df524608cb6552019cb45a5c42bdacec25bbcde3fbf357258dc908d513d9868a5b8057b12a68086c13aa259c5b53079bb6790b52f7fb8f0e5b220f8960e337f1d60f72819551c9280910e340d3a60c653f384d9dfad692c84d86c3921f427b396a8de54c846274005115119ad5dde417ae74c49dbed1fe8b34eae4091f2d5b8316f7015b74ca8f18be3ad970a99860da876a68fba30375e095fb96fd31d770b290bac3289692831b813261d357e176d39c4e95aefc2d476c2bd03c85e47893e6d730c57f463ceddf1b519f73c56ad3fe2e8966dcf9df718d0589b4d6c78f74c06d0f6b0e3a5d411b00026e950822f90dd1bb91bcbbe81b18f694eb115ea5b529aaae5837a3203cc788b1f25f5712ee61503a2e433cbe61b5242f97c8b9b6ac3e9ff3d50f6240b486f7b127d4ef67fd7db5fbd37d6954ca43764bc9e93e6895455b3b97787b867d47c3fe58e9cbfd916bde745aa799f6c624e66b9ce6409343844cef89a72d50885019be04deb1b5fb94cd74e3fc04163ec07d3ae68e6109543693e6ebcda3fa2921128e53f13536398b0a233c82b31c66ca4ea913eb54402628a1174bcd3212eb460006b872fc5955a998e20d05fd8861e296ae371e84fb3641caf9a64159b9e40b140d9e676c5fdd40f1f6b8050cf2c96a530b2e7752a6587144ed01b585f8c6da4802a4ccb0444fa9849f49f5bd02acf084063639bbf440e14da90f0ec5ccb0bc3a343a6edcc5416907a78ba52ed607747d431b1ab2aa2a166c75af9773be3c10e30c0354596cdf55036de3705c541a0e776e5c06079fa77790da400608823ff5732da88a5e0f04daea35c2ee37b2e852defd3ac53cd0bd411206eb6172ab133d3864170a2185bfa97daf434b1a944501e278bf9696cfe7d5331ab222fcde6237c765336d38d1791bc6f94364699e1fb040ca99633d107998152a78b918e58925fa510174cca3eac4db336ea9eee5fcdc4bc637273e221d6a6a23acbcf63b90b2f12f776cf1aa7449365695d487a7d9d1c84238556bc5a1aacb169f0be9ad07d796c7e0065497c0dc4eb75b00afc7aad3c14b145bc1119feb43a54c00a79455d92bfeb5637f55507f6fabc9643872423a71c791568eb5cd4de77bd5dc3bbbf3fa866f1481d87866232a30f8d826dbbfe440505a2d72cb314d15a8831c21ed690e51ac7f78b2c8ac79e4c1b0b8df49c1b35799d1f9f67a7d0603dc7b7247de7db7c9b3f1fab9555a8b45369aba7111a3cceda4ccde002b225b2b9eb02a0291672fcba505e0e2c7dda86a41fccd3ea865460c734778683cf73cbb420e0bb0a6507195c45691367442a823d0c74c36ad52e45cfe3e458b098b5a535dff6b90d74247ae425f22c4148ab53085ac3165c63c689e7d09d0c5e242b41adab8d295c7a01bf343221b831cb7915d2127b076c96f161949096424790e2614b73e6d7b107d6628d012c8c6f7de8c4577a8b8c67c50099595c104a13012c33de38cf7db732dade0f1cc6da14e785b104ba024920222a00b183f1957ee8a11b121aa624fef83d80e112da47e80476bbd73a03e579b4fd821525ec0768d84cf9f1e75f09852eeb3b13df721b58d174fd06e8f0bbdcbf8dd194d2a5393f22fc7249448050f29b9b74c044bdb8aec832ca049146e3c4fa06c0b4e699f5ed8a3a0f630ce91f1091c827dc7d790db09d2e93768957be071e6c9dceb41a26916b6110586e85d75fb45691cecc84022e0d49da6cfe5d178e798ab353541bfa947a2ace7765163615947c1f4d6b06d8287194d08be3b5708697cbbab8e2a875f3f362c20ad3a92260a80d1a24e72a0392766b5cd759e246bb8150b397479d43e5a4b0b568786dc50ff13f5acd640e975a89be58dff8be1197e33d7d0a0e10922878c7377d09402e888ba06fc11e0e0cbf5034b5638a7b043c097d90898272ce306aaec09610cd2cb0ee870bbde1d92b6d9cb5c46dae7e5e2ccd08565f6556fb2a442fa74b898c18705d82f011a50e0dcf96d14d7dfaa7602d56dc53b54f907b6b1feef5845a5b27c2cce78ba138ff +shared_secret: 4aac182a36508198689ad4b0c24abacfa421cddf073e6ccb3f5c22c37f1c9eb1 + +# Official test vector 98, seed: "dddca9dc31bea737d3f474e7560b37facb2f53c803e768ffaade7669ff94b1d4fbd17068cffd5dfdd24aadada4ef6b12" +entropy: 17fc65f7fbd7c75ceec421dee84dff5a8cb22764a182db17e0ebe857f54d60eb +public_key = fab5cf19743430a247522566196826be35c3ba55053ed8c8ac04211931a38d5a100c7097059bc058d551672542a8f1a7ffe81e0c43b1636572f4608dfadc72f9a786c4c2b2d27c576d29461ad56369b7300d3b0a7890ca3d8407a8a1a90f796558843202152a7131919d9417065360440ab8516909087b2f4ea408baba0cd5c0af2a85634e88693b8c121dc8121d462650f2b417a0c44a5018bc2a70e68a590b757b4c0ac70bca25923049fda10856f62ca42701ab9a75d9991fe3d99856138112ba4f52da1166f410e3f15baf7c3062563dbf0626f76c4ce98ccb1f238a8870201654a6e551a5de9cc24fb36dff2334f2f7bcf51b8b6f8c2d07b4892a657e58637011624076040c02ec59924916f5e49956534b0b7a746b16663f33cef4440f2eb5be9fe4034db153d296a86d83bee3b08ae5341223193a7febabc53956049bc1e14819391c5be5e216377438b0fb56ad770335a97c8e574c015c66d99c59325a2edafc7a6b4ba77fb51050a2c400d754d71c0fac84781af78c03c094bd800fe25b7f7060bfb4252643d97ccc6002a1568d4af181e992b1ffa8cc17bb835f0b2e6b72026478729275b002636cb49c9edbf4373912961da0b913e6cfc1959b80e711cea276c10158dc43b6887042d8d58402cc54a671275fb49a7920c35651aa4d81aebdc772112420db0162b94648ccc519e369958ce40adc90413d9802e621b6e8ccac13d846151c19c6813259c5998f40710f3162d006c5d3a9b2d18861789aa7854831a0314eb74a03b84921ed73ae13db7298288ccec07eaef97716d14a8a296bc3d0b95e4a78e1fa2467c6ac961a73ce63085ca1a4b101adb7f2a4059a97a24bc2dfdb6115386de5e95486a46e6697a17a88510c97a0602205e008088d269082b2c1790c02912a9f03383a94d2127ce1a0d7f558434a6300513a14e2c4f6b33d8a159a06d09983688f75265a84637f07846f0c47441bc6a6a8e48142b39b4891bb5c321c8bd307dcb6326dbb960b532d88f08f8a299d914824e46189378c635cf2088ed8382fbb4164d01c867c1f1c4973116c3629b3cddcb40b1832a0f06b6d04ec8edc46205da3b28f50bd1730bbc04c5f927209a4369b878596a2e149767139e4a06493ea42034062ab1ab037728908c07f9bdc820495916c9114f7e95683c945c19354dc06c5b7888244ec179bf88ed4e68bd10483918bcea652446b7333e71a403e97446564361b5253d0b225d4155682123725f61ed5d4655bdb7891c6572758977f0b4e8de021e832ce6314c25e82392cbca5c794cd20241b87ec87a85a017774bc3da18e77e0b53a521b2eb0a7006b35edf5b0a85b44d3d78dfbb476861997714330c9c5ae5e0027d7298a64b62f2523670c618051629c9577abc2f456eb0ca33fc86e94d910d186144be3a886230cf3566cc09c2ccc76719bc349cfb70c35b24ea6b4bf1c0394527a529641a2b45b60da3a976d70012e48b5df60a7d8382ab149760cb5579f0673f78a52c01c8efd1a667d86635bf15035ac32805b56cc9a1cff506ca38b3df7a3b860985fed84b2b4f1c7f3a88122630f438c565660362a90887a9cb55090cc448c9088c6783aa890cb51ccc3c8cc7c097d59808f06675e1e826869abbc0644a612d471d5c106214abcc1115b106ab3405b1de14c664a773e6e5667d8177ed736a967710edda390f0b105f9c5ba3a2a61912a2414397030022035c533de16c634a799f2b72fc3112071e7aaebd1636a3603971020e2f90fb8113387ca17171b39104595e5500b50c99c37aba1fad50fed567d5eecc00db3ac14624675c76846b42327b9510ddb882b24be90c9661f5c46eb5b1991d25920c78f35807ec55ac2827776a54ac4ee272b469ac65aabc6ba199dbe33724e5866e24a8058d5908e30bf54325745907752d324490b766f6672c4c8443ff7647dec597276135a4789dbab39355175bf3a63ca6a359a879d648c0b388270680781d3e732efa5c85f1c020e4384875954b50403a4987ce54a6f24c83e541491b7d144012544b96b00b933c51704bcfc2b20ada6c481ab32d555898174526a266f70b7939054a88256a59c95a0ec2501cbd45f0ff2ad418b82ecb514f7ebc3fc33647f5c43c5026fb547a33bf2642c9279dc39ac6012a770267d6c947324c6d45b65393421bf4bd7068abb93ab3a36081a303cf37b90037749a046d478 +result: pass +ciphertext: b194cfcd01263bba40476580d27f88b07b884d31221bf0e63c7951ff897d292c0fff18238fb1c563280953dd81591e55830ec1430dbae2c77a8b116679a80cf79d651e7ee9e820ca0551511f525df28319be43fbacc67e58e3617852e7fc9933d49826837b88f18474a71710e58a5d0ace606d58e596d63843762964e98c56861c20cac9deb2f4e8ebbf5d522e6d059721d628ec00e988043587b4472d630dc65a73ca4f218e0bb8045688409185183a6c7263c6cf90e00b1016c70a70ffaa02fa3ee39ed539387c67b92a48d5c829aba6906b82f322db0b632b1e557f9af22adb324fa555a44caccef691a57fca147707d973dc9f4fa73ade6bcaed8c7ccb789162a632fa1c9014b91950788d6d6c3019d2143c376ce025726c3cb7451f506784ced9baefca8dcbbb3a52151611d8a08ff87fdb67d9b5e59e78df8cf674cee8bbe5e4c513089f6a91441dadfbb12c869be7c805a650b62407dedcaa5e4bbe7f25cc654e75335016f53e5d73046358f82e457c2e28ac678ca8eb67c25b87e47bfe02bf16aee67d99f6670560ee4a4a6ecbb0c85695c3d89b6448e02b47aedb9901ba5406711f7583d3a9ea1ce672a06a243763855cf17f900136b90b478c4b4f3ee0028b5608fe2ae58083cd079dcc47e4fbceff2340bf87310278a4eec7ef794b576447b87d991d2164815d05b93b7d4b1f1aed5b536dd57a374312b801b3dbfa9822d9e381ccc160653c72b1c129ce6c61d94bc2e647cd86defe3210ca3c31501ad31aa38ae48c0743360edd1b88d6dd6981657283a4f745fe69949e1b402903efab49cb71072280e75b1ab271aa84f9ae18532e90eb21279a8c11a4e3539b0ac7e5cbe6c1eafba4969a65ace86c355c8d0d2e884eab80f3073e6c26c8454a6ec77961b02018739fad9ca01e4963532450e5f477685c82244af62d58bc3d932b2c34bd30772a0d0ea939f7a6f609034cbf27aa308cf90efd2b3baac238b01bdaab0b5f6970bb0ce8cb0154461d8ec9239c4db6cab7b109d48695120d9ef3e75977205c7746d1c2bbe5a4bc4799e62ced8b5e4d2c924aece66c7e3c93859619c4791b10adb6e6f19cf0437c86cea08e3fd1d8dd35200598f5740461ce79d75f72b6e1ebbbc2ef5534eb2a76f6410c9fc338ee0ed87427df9efcd06df7cd29f4cd4273f68c6bb6d22c9d511575f25ada1ddf2b497537fb2a5fc7b7370c741a355b5cc6c19267d2d14b75b3fc6797268bff49c5e791cd085abb53e309f1f68cf25a6c10c53c2b7522739f763c2efb08c9bad5ea5c4ad37dec829fce7e0c1838c1fdbad2cdf2e9ca493f78429e2b1cc23cda79ebc3a559c06c771264fa69b42985bb6b51408ad7ee0a5f5f97514ce8505b1e9f442d3a48038d7d258a98fc64a2ad5973dd69b88939bf3fe7760aacecbaccb546dd7fb0630194a4456e214d931b9d12174a9f386807ec46683e424dadec6f86e9becce6ff2627ddf9b65098a26844cfccc30b9a822201d90448d81189547e9d6383e392f661a61b9bce01d765cecbe8ff6f31b9daa9a83141c7b02f993244c45b8262eab127f94d6304a375406c31de7cd51209e64e3172caa871db3af0dc3f7c806665407790c18f533d7dd742f43961e55a646f6661936eee04d489e9adc7c241597683814d222c5addae355666deb5f118387b4a5c4d496c856b001243113e9ad3d099bdd50fd177d72c86c1ca9a039941dc845b6355a05489ba51b7c0d7169883bbdd89d2a3afd97d932f6417d14c7d48f1f3dae337d070ac8d297ac3dd4886c3149de9e1a3a082f1890e01ee224bf8cf49e0fa01d5cb9b81cc4b1763e02b8fcc27231601a6768a55490a6ca280d78999b5b482fff4b78c5cf2c20512bb02ba980b50d138bd6fcfb42e055b7f93b814b3cad013c38282c25a9beff303963c33d91a699be48b6754087f80d39c7cc5d1fe3e5b0a0878d94494bc933119c0f5562ebbc1fe7b6d68df2ad51ea2f055c045b048932cf6df144db0dd8b04f9787932a13e91ec19871239a2d650055e8ce262c2aa3caef9a7f487bd7c53d47f899b7dce9e99c12a3d4276e7988950d72e7a7eb099f954311b0a357ea77df6e8650dfb872fbd64dffd5426485b9b60058af70396298ebe82f0cf8f2cf7b4fe82b0be28888339b09a13b9dfefb41af339ffe33f37c539c67f9d15047acc6de9ee6b71eb41d2bd7e04fe8e1704714f0512 +shared_secret: a51f089d627c8d7da9740aa9d768778124229c4ea9408941ee04a1940c1762fe + +# Official test vector 99, seed: "2a6f7386b815366f572aeb6c79e272cc21b7095fe09575f18072c9d677da23bc9c8a4bc393b7524604d299bedd260c8b" +entropy: fa0489f3730100609488e951e6aaa15c0f193bc1dbcfcd013bc418d6c507b176 +public_key = 7665cd15516d767a980e05ba44d761fe17355c0aa302f3826dd25da4ca4d044c299dab608da967c1e253ba77108df51914a15541763f737a89fef62be1f7b4e1b8b77eb719a84377be0081f7d71a6e881e15578603867855d87ec04b5f1f133368e43ec6282fe5eb16935a04ec9916caa90031e40d98b0a8ced98979fa7742a20dcbe84c67223eb6925d7b1b12e07a47677b56e9916029204e91408635eba66a6a844de5ccff6aa63fe15190030b8771101b456288b170bb117584c996c8515262c684a4718f8b369011865c756827d3038d62355f4c994a539815f4d6b6dc9455f4d7ba24501029170cf1aa3b0944574f6642c446a3f121cd08c7bb67e7239da147e0e9c9b5c57b8f2182e00488341994f620c99978c818aba5e4516efe23690636cabf607c438cc288e944b3446b41a264b88c6e0371a08a1c02703c21a0bc5d73e6b95e7b5fb87c6cd43415aeb26f92abac0371b9a7a70ea51c88e12bbcdef7c3cd3a4bcbfa3bb83606b25c85984021122400272a616fc4071db20560654a7ca099a6d0754c43687d9657b1b816a04b8d4cb63d0e3765e228890e0907accb4734cc557fc96ef7fb6b463cc2fa5b73b7fc231f230028201483e66efdd4570365865c08028f96609377703a2300f7e1b9f4939475541e0cda2527b28aca7374d1827206426637965870e9b86cbc115d9a04c0e73e8b7a866c277da3c58e0d2094fa285e2d05af7ef64f8ea6146ec4321395b7f30a6e52171ba28984b1e49726b48ed259638f6bacbfc5c2a4baa3cc391f0be917f7ba3a05dc911642a63db03fce58bc6ff92af7616569d04415a26eff8c271f9921ddd302787959f5397b70d7a388f7569e010cf26b67fb2c3a2a52714f5666b9726cb775c28a79a41531213e4766c9442fa06498f6d5a1816b7338f9afb779a40f2670221bc5ef319786762fc78b1a25fc9db8e362f11c9f374b04204940877bc209b25ae7f461c40a0193f66a95ab7dcc80afed9402ab725dab23c1abeacad633c461a26790865c21a960d338a7e485cb2b42a8b0963b8689c9d4287643b8685a341333dcbbd7637fa2671c1048638a547815f07b255ac115c8bc32b61a369128c60076c3464fdbe2c7c0bc5ef1e383ddd2ae8b0457410c19ba1c486b702a9048049e85cd1e7569eac6b3be8287ec9c195c3bb0b4f28952823832c55257d05ebd8a8bff9c372095be66359c9ba7384080a7acd9567db7905c50c36734cec7519e8e57195247b48a65a1e34cb942d741d88b429d226a4097beed271dcbc8a035606e056a89a8487197039adde30f78bb17148a4f0bc84bf1dc0d9057c97b028296b9260e601ed1a675bca781c53bcbd6866b4ae108d059ada7c6b8615195336c2df2e71ce97528378b2fdc4b6501f2443fd4b6248429b67a4624769236e32c12e3116ef66ae2554f55c7be15319e803b8ce0089d3c04b65ec8340c483b2ae4c2b8ec7daa91b39270ab7ec04fee436e1c008f61c46fa854363287573c50c63c3b1f94d52feeba13aec5c926257592904b00ca8615469df5539e8f4c627b11be02e96d17189a80f37da5d08db81baeb7c34b5c58ab3ccb25af3c29cec9364175b6bb4a04b5958079e18d5440bf24538598c1c548327980297efe531d4c14a9360b8dcc173f6536b760b2a6fd59bae262087989269c884a966c658017ce65d14519a2c61266b344f6648abc0a657580130c6fa0f6565d8100f0532011945c3fa296de184750aa931582a90e6bb9080971cdd6b470f68db4e529ed61bf97f62bfac5cb534c1570db606cf0351e1866d7e199dc329d70316d7fd849d5c296d76a8db20306bbab609e7a9ac05c7896b150d6962d2466158f8697e532901e421d5ec00671344640623891a9221ea17ebcf6b290dc54359814a86658e2c0159c2374e1dc5f94dcb30ce01f3633129274585e304f0436396d66660f81c4cd273b94a3740f9c2fdd081bc309602a2cadd82aad35a46684547d01c74c38547176113a697b49e6c98c1c017b25f817e19c2a0302d083dc5c74c4c38b6706e94c10d178369b375df9c118130824fe99ac49f24a682ac23de429f8c7a6d1a89c36f82f0a47379e7aafadc744e1f20b9186c67784c3e6b823306896fca303baf61309cb498a216431862f00198c26ab6938487dacfaeec6906ae45303ec7dbc2889a8eefa511b82609b980dad54ebb3e7091e9d +result: pass +ciphertext: 2dc32e31aec258d6463c8b3a5b9464fad89f1399b6464d5194a8704edbe2fd1abd7044fcc1fb2781c4ee362beaa35ae6a1f8b37ba5d58610092cc908ed65ea0aea8b393781be6277d0842fa27f9fb97b61b33eda5e50c1254b0410fdf9dd42306694b158bbf9a2acc025ba0018448e4adf4a1c9f71c7086750217ed7afcd3a2a2651797944e8cbfcbeb6e9b67d2ed65dbbaafaf3bdaccbb12e17d90e91e8cc1e0c96e3ad6387d95e2ce0b74ce9238c400c75723e8100af62a9fe53732f256d410f16de8c88eb484e45062c60d39fed5a780af738d320097139d4f26f9f39b8b1e777d5d0eba2bdf08d7950ba817522ed34c4774976ee6210f61393cc3c3d34da2ae3ac491db3c2de20b223bd73ce0c45e4743996e3ddcf286d7ac5e2c9b42f23afca77956e39c7fe65246863465de548f754fa5c07ed6bddaf138b22fae3b316dc5571b9a452c65fc01d9680cd4a6f04e69cfc885f80d1850994d85d4cd13afcd51ce1470c4c467442f845b5904b54f53b6b9150689fa40670f00b78f1a40735a2a8c4075520e1593fa8f2624b1dfa86b60c37ef09d97cfc4ef03002a3cd104f7399204c5849a860bd2685091364aed298b73e44f414eb62d093317b710da0e3380167aea5a87c071495a57243542f1a8b1a2aa433b25a9778f3224d75a8e5b913feacb83ec1ce53e9de2d53f6ccd326c463c0b82bc41f1532cb74d95b820a2cb1ddeff87393d219ca1c58a6bb742fde0787708cddb57fcccbe523c90674857074b2875cd961e8144aa6c2eb4f33972e695441f659b0c066bb7bba5925d26811c794d4a2c2c9c5f167cc92d8bef403151cc1f27fd0addd2a1297a07c5f47f9f8fbf72d0eb08158993efd5985970de5938382f4b504dac300ba12f6e733fd8f3d5fb26ae306164fe0ad0df2ec13ee8958ef7667a88d36ef9b7a521d840c69e208eb7df5f862de630c74c1ab65909d0fcc6093022d7f475a2d095801c1b12884b9f97643f714865d9752e25111a5c29ea974ce2532301bc0920de36d35abb364cadc0b3941034ddf459bde80f28c1178df12f50047b73a7370d380a858430e0eb7a3589bbbf578559c94035a6aa69b5dbccf09d2ad755311c97e80b75086462fa35027d72f6205e0a4b8ad20c5b56f91dcde31aeb8937d23939115ae4b76833dd5265e1019f8126069fd0da3059e96df4209efc730d4cca140076418c1f1fbac6b6a5422d56cd2d9eb16fb23d798021aa03292f34a6d302e119e4b3aa104e4856689dc10685c71ee038d02b8a0b965691c46b014184e20497f05d46e6f955b20a67ddac8f6d0cacc5f1e0ac6e826338026b58de71b2292ffa6d1ce333d124f17735fe21009f46fd2009829fedb8ee018e6d773a0bede891cd7ff9acbbbe9ea5a772850d38b89d3f423b0eb53458f28bdfd57184f6aa830307dbe8f8e9acb86dde8649115e0752dcbb4ef99437c488ca7dee225ee999ccf8176e1cd8a735817b927baf1e4d602c37815a086f74f27d318ba91c0bba5d6c52a4fd3a481373575345e660db150505466e9513224a540c33d9713b755c82a67dc3482e6ecce3a46dbc189d9a71a7f5feb091ea1e8b395d599cf0ae5c4ed6dfde8fa12bfc93de992e19d75434ecf158be6a3a22607b4a54b702e5822575c28ddb1a51500c5894f3d01d6bfbdc895bae212e8ce78ae75a38ad93123fab702a2c3e64db8bf44d05143aa87ca54c66fab032142b9569dd21f74d67148f54d513c991362097ed325953f0c621c42968806460763c211b4d8b383a724a2d53b7b7ba72bca0fda2ccc816bc74935d66b408e174994d856a20cab75fc8a0ace390f47c4f26c8a513c21fd3e8ea5d0ab19fe2547fe4f1981ea9133c2d9aa06580369ac4ce8b95c78d57043dbf444daa14c0841d84c2dbf7298e3df9e21d771265c4471778d0522ae99ca9c86e4cf568c8e18075bd6c6348455b53816a673d56f6fcb63238f653cd8dad471721b272585b6713f223afc43d05409a1e032642f8f653304696f758832db360d754666e1bee5a33c6c52027fbcdfe51abd5e4b3c165d219ade2a527ebe6d77096de845e09316c9099c7605953a31dd68b936bc96144c8120e00dc00300667fb8471dcbe770f72a5e3fbffceaf6edebfb8d786f7830f7aaf48e1cab9372ab7442176e8e9eb8d71df0001d5fd4afa3f4b1179d4f50fd338c2f15bbc27c3419a931ade3aa +shared_secret: b00f65a7930ffc261046644203b94c89dfa7334bb011a4ba896c2d547d96637c + +# Public key not reduced +entropy: 147c03f7a5bebba406c8fae1874d7f13c80efe79a3a9a874cc09fe76f6997615 +public_key = 5389e1958ce25148a8804e589dcff2d1de922aefcb56eea04489ee7cb6e192a46460d3e83d2bcd6eed8a5e7651603acc349ca16ccae8acbf3a3e8c330d84f1598a6278ec7ebfabca0ef488b239d55475349acd452e4538163d9955c8e510aea1e393386edeffdb27b38c6745f2944016ec457f39b18e6d4a08aeabe07bc84415dffa9ad6fa154a49d88fac775452d6a7c0e589bfb5c371cfc4b73deddb8dc9ac2d76edcd8b456fffda43f6f033806edf69403e973904dd504fb24aca7098fb8ff5f9ac2039fd02b56ac746801acccc84863def3f878497b69438bf991776286650482c8d9d9587bc6a55b85c4d7fa74d02656b421c9e24ed3a48d4b74425c26e5af0dd9562a4ead793f3a352ccc0f29fe7d868c7f61dfabe768b1fc73f05744e7dcf8f10344063dede08eccced4cef7d49fc01d979de7e8d8398374665a16a9870585c39d5589a51ee33389c9b9a276c034f60d9fc7711d8eb6337b57da3c377ddcd75ee4c747f7b276656b9d8a4ec7e896ff589d4b893e82edf3bb948edef91dd86c0b7468a678c746a8dc12aa6b95e3bdcbe4331bb24a33a37d153aa472c4731248fca365c5f35259d025746fc6595fe636c7685e0a6acee8a176b7949958f2697399497a2fc7365befc81a8f95239c826cb508208607738fed6286520cd4c639b43862fa9df3d9b15bd86d6f9f3c65e623be7fa733cb0dabc54aa4e6a99f7fc9feaecb3fb9ba06b8adb34f2d68cadc553c9830fa17656478bcd44ef3456378abce9a9ee024eba79094fa8f77a3018d5d2e3fffd6fbf0ca4554c43dc2bc7d42db35102f68b1b0d62583865381c74de9e3af71bf6cf19f3d0c4cb971692222552a8f4b788b4afd144ea9d04e6d02d3900f5ccf7f65988949a7568dd049639864ed0855bf1f50e80046dfbb1ba95f556a5d67c7eb534e0ecaf88a7dd635ca8a4f6d696d1bdf0c826938d34943c48d8c79cc0077685342e6bc2bf9da6d8e2eff3340baa8d2e65344f09bd47894f5a3a41197e5b3d6df067a3f7f9189f7f1d856b238bbabdab4ca85abf5bf1f5c76bcce7e851cffe0469f8277adf2ea5edb17d7c6b1e6dc2aee3fa86fdc60fdcd6dfab5bf7e744dc9cbdc5eea757963aac56a91add8023bed1f5cae8a64da057f79b353a096a835b1bfb023b6aa048989243d79aeb467f6fffa27a5823afee5c65eb4f537536e46f3a6a97e72c3b074ed4e0aad40598940d97ff6d97ef5ef9b4365d73b54769e45454e7ad81959940872eab4413b35507b0df578ce2e5e1d62d58d5749df39bf9d6cc58870caf92f69a7526e406f7ec5f09f551a77522b8b2968afd58a49a8176eaa65ac09b08c9fe45abc395ef99c730c56dd3adafbf0f94f4a19b7408a537d64ec16f5682bfe3a7faea56501f98611a7f606d922cae9de74be918fe853273555199a64a3e8b50773345c997460856972acb43fc81ab73f1b1c33c2bc5d98bd489d696a0f70679c22e3874dd8bdae4f8459f72160472056332134edeeaad6cb21de6c805503c44ea36d87e5617feacef3731e34af8ef328f85cdb47dccb00d515b64c9c54bc837578447aacfaed5969aa351e7da4efa8be15c4c51f4a699779850295ca72d88ead41bc68063fb89f7e0e2189eb3d5d817caf55c7474c95ca9110cc43b8ba8e78fc7fb8bdfdc265c0483a65ca4514ee4b832aac5800c3b08e74f563951c1fbb210353efa1aa866856bc2ed34734bd485dab1d12dc6bf765ff60b3b801984a91cffea7dbf1de97004a6cf44b4984ab58258b4af723fecd17530a80dc32959c9436344b63e6f09ccca7029a230d639ddcdf2d8ba79bb9ecd6bcefae1579c50c7bb10f3d301a65caf4ed1d40c7ba927bb563e48d1647024d4a06d8e66d1bdb81269b7d5f4b350cdf2f79e52f524d04a7c685368552343bb6046dfbb9945edf446d345bdcaa7455c74ba0a65ee1856f0fef97688773d50b6433ca7a7ac5cb6b7f671a15376e5a6747b6f3fa7bc6630373f5b1b51279da661377870b6da7a189683f9b0cf0466e1f750762631c4bbd9f505c42edf863356947273544295ee3226e6d50d9810777b6bd46fa82f4461a5cc284d5dfbbcdd3acdd2cab33434ffa86eb8ce92ce34a6386f861ae994eb4b6875a46d195582de73854b53d2293df3e9a822756cd90fe3b325ca29b4f9f8cfbadf2e41869abfbad10738ad04cc752bc20c394746850e0c4847db +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: cde797df8ce67231f6c5d15811843e01eb2ab84c7490931240822adbddd72046 +public_key = 938a454364cf10a4c71a1e3a24bf42bd0e3963fe3421fcd686f3fccc8d840749643eb4b5cd4e82cfef366717cf77f97da296a18554d11387db6f755bc596cbbdfdf1e953d6b1e4ae437ab7dccf952724fa9223a8a7dbf6949ecad807dd6cf666118830485ccaebcaebda34f1765599057e3c682fc413d5c2bacf669d68e38ed5b23506a71d6e82af6939de4dc51d678639238c8c17e385def56ee6a307475bb72bc93976c8976bb89c736d90be9580cacb1f335b98de6944cd706f88d95408cdad77a9fe967c4bca738a6db3a4ce716814f6529af1578b79b226bda19a9bf23f998b2e49c463932d73db0f23ee8096be472d80e7de71087d4f3b0cc90c49d8cd645268375056f6d72425b51a46c27a48b9c0db67b025a58ee37b44794430f3ae6cc74e1673c2b1d4b29db5370f69deb06e65e68d6376f6a7d58f5c74038792683f388934651d3d834f6593f366f97bd23008be21956e6be8a4be7efd4f95f39e6fab6c49d69bbfe0b47b37ca85394c19327e63d3cc9c54a5c63aec1d4dacf67a1c1c31438eddcf78fedad8f471ba98c81a552bdf541b7338b3adce41354ccab879f549cfa58995eb8c64a8c3db6f384ec3ed4dc2beeae04c967f744024e7dda88d516777a1b27e5f22dbeeb46eef5c4c99ce577836489a108e3a99b6f2390b52e4757843c772f6e75f4713d5259833b3993919f3aca66563f3eb7375f5883cfca72398b04927debf0997ff277e456defb0e83d0c5ca6c81ed4828dac68d857e0dc5d25be628433c737b8808c39d839e4fc6b4ff251edc22c8eb4c028f60d288c47976bcb84bcd0856c40448ca40b723c8e44837965ad46b521ec4b406cf8589b85377fea10678a75233e2cd59bc7ed3f49d93925c5bcc133bea39a7e229d7a1994dc812f5f1f154c270a4bf12d6a17cf41c04fcbd46ed55adc8519d38fc9d3b977ffe44919d53c5843c36b7b247a6ecd04c9d89fa6fae968ccfee71369fb287cc8b07b73c334bdbcc9ed05c7ae4e86aa7547b4cc74d3504acaef4c6e5b758f4e36ec762433710dc187648325f36ac8854d4a9aec2c83fa091eb39439340e23c33bfdce519dce810d70306834321b5af9e4be14cffea6655da124f7f995a115dc86cda737aaa9d78407b9f78b914e93ea6bfcfc8509f3fa7fbddaa7eb6686e0468e3a853adfdaade3694d835f8b5a72c5c8e8a65ce8d3ce958bd66a8f61170d31598af9e3388a4f5a5f0b96b7058ea2e5738d3b6de89496c75a856643899947c955be8871e818d30a5757d6b46079454b54e5e557cca964379bca5a8191698275dc51cb164f8f5d8fdaf480032af8b0bec9ccc65da9bcecded6f5131c6630188ffffbcb736e33ca563da74dc76a7cf41065d2ea4cf4b918c5b828e21cc68e2f1b62112a41594a6359876b92dd58fd66861b7633d73cc7226b8debebcf90fcc390f761360554ad0de4ad03911b49b641c73687f4a73f9cf90a2890c02c56e2a65680bd3826353d87ea41369673e1f9b920b36203cc9aa474e92e0eb6d859307927a62aaf4b3423fcbceca488adcb3c7442aba47c4a077fbe7442c2b4f21b3dda93f7f6518830b11b690f0497ac0851a6bf7ea30f53065a9ae7e65680cf6500edb11346955afbfd9c7cf28f1644f21b34e3694c060e6284bcaf746ab6345ae0eec87cd0f76a611ab64ec86288c339294aa15233abfb78d037efe55fe7736363dc3fedc4b8b74a54e9a2453ca082edef962686773f870b178d25b831fd133a2bcd596e688653ce772e2979305c5e2b1d949bf35bdc08cecd6771b7f659b61960a55d54998472164cf1d42df4c1cf4972d5b1466d8c104471906d894bf5875a453d4a7c4569c63a2b38c2db6a4fb8dc928a7edef12754f37cb4dad3b66e135d1f7575972fcd80ad3c4bb8ed71ac9938c9a97839a12d7a4622943c382ad48eebf6c659f6b3b8d7b644aebdaee0c55bd6d4faecbf6462a55b31c705f12cca8b7c698d9569f76a1a3963cc56dd26ce3c15e168ff99d80c3a8ee894f134567cfae032c845d79ccd963e3f04d6459d1ba72f0dcc604365a9c5c5196dd5f18ad397a559a1bf8f31c4ea5e0948c825d1ea0fb9cc253f6eba88172bbb930f4984fa99c5bab08edde504556aabe8c81bc99c56fc771ddc85d37b7c5028f346ee89267934564aa9dd80bcdc25b127f1244763644004e5eaf06b095b892bae095e0ba7f9d2700a50 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: f43f68fbd694f0a6d307297110ecd4739876489fdf07eb9b03364e2ed0ff96e9 +public_key = a1a341b578b4765c4649e6bfaf5c8b2ae8dde63dde4de3dda0b693f5ebbfcfba9f0bdfad46576a7a06b65de6bcdc53fb6a753f3a73f6a37d73436483affe70b8649e2dbdf24983f9d17eaf4c25968dbd521b1e8aed4ecbebcde3787aec2984cb2c649da0fc94fdd880fd4ad5239b84ac053ca008f3e4c94ec0eeb6d6898da04bd2e455467af6c89dc7f25ad653a5bcdc8e165f3b9b68b11f70ef0ba7cc56322d5c671805b7d333b899abbac22dc010033f3064647e4a387649c272b3fc2ddcffd62793d8689cf5a6e9f43c87fdeaaebcd4c3f21483863563ce8442a7f58100a4e0b3d5d6146390fcd44d109e8b2903940b4fec678ddca5ffd5d56deecfcf3a4d27e57ce4a0bac562543f73fc8d71ddf960217696ccd98a59e6c39dac5cd185a0793a9191ef5a056d837d07d020e7fb5c5ba9841bd94093ffa3a483aec99d0e6f9cfd67a1ce77766a23b2349947969cf38e1ef6f6ab9422b97d6dec5658bfda683544ba07971bc773a5da90bf57eeb01f310283944d7f3eb2ed600efbf464bc71df7f33ebfb7be75fd2ef3ed8832fa48cbfd0f04b6bf7aec7f74d4295764e6fd857d747cd986bd7f4d83f8b13a901ccbff8cdee21b8789c05b635bcc14d9ef8c379bdd63df9efd660468a34512bb78ebff4fff9a22347ee457333ad464c6fdba4f6c5451b58558365518279ef6ef8e7d08ece6e7a5cc6b9cacfef75c473ae1c58aa38e43de50796f22475fca44270e3a46fb5b8bdda74e4ed5b893edf54f36e790bd6becc76805b716154a6e2346b0f4cac241748fde93f325b4f82f3b681136a008e56bc83d4f02f652f1679c826d32bc35db68b64b2848351da88df99e66707b194cb4759e676113faca4b7a54f8d64f5755d36288fc516e072eaeec35a8491396c940644616d34746ebed96db028b572510de97f45a204fba678f587ae13eac38480cf4c3f00aee88e9f5bd4c7c6bd0b758698bcde97ce395869771dce05e4abfcb6deac13b66683fe836fb36b7447c0c93f9146fc519337052865927a9863dfc1ed186b411554276af4dc9738751a4ba243bcfe56e0931fb711aa453a35b09cbfdab405b6f0f345742eb24027f61b49923225b3620678c4f474515396113880df463138abc3e92dc65415c593d74c01f5e3625db02f1ccc55a6c1e7e9b121588362d784c3e8565863f331bb59678f377c85fe7c259608c6f9e74a5a470bad77d3c0673bf3832af17c1ac82b94a82437643807681dce684098b86eed31440a79379af29be9d2f2996f327addf16354778a4cd5375c756a34890ccf0d9fba07b6e546387bf55cfcb0c8548d4780ab7fb668cda1ff5ddb31fe94465cc97f04f611e75458dea8aa8efa6ea971d797baa894b0348561df068a3455a89afc368418ede0cda90fd8acbedfe7c83398390f67786d51cf3491542534b1a74b409b69a9ae42c1b437b5a85620bd64ecb591b7334afc58faf678cfa5feee970a48bd08f3a0b45e1c69ed0789f884e4bd058ae5eecc5cdf66c994cca765daab1af377a14b98bcd8918fe3546fa4438ba5322eaeba75543be245b12f2f8d08cecf119e499a2c57de4fc9f6ba3241cd53165ca3fd669b4c3944a8edd3d016a0fcb8f6b5f6e5846c48873cb7f32fcc1256f023e38f14d98fa0486eae58df81a7376eb6380b4fa1a2b6e23d8a4efc2dfee7c9d0cbe7a9238b59006abddf2ab25565815947b3bf7be4eed43be91a5687b339e6bb6614387583c585f1456372aa68b17449c3aec626aad5f8659da97585f534f1ab74b9d705ba13bce39f15bea04e971e0a6e04cae67be9b682df94c706d0478af2d64565e7197900aae8c8086059f3964ee3f7288aaa0c9afb2d976d5fbb50b94fbcdf3c9d25656ed82f4f3435c9bc9b59b187f7b46a546eb8553dab54ecc6842cba94fb24592fdd77fc56bd5edfcd7997e5fe0c513377361d263c6348340b6de8b0e9b43f2efbb6ba60503ca955ffbb25fc585d1feb57fb3d1acc80a4cfdff4555ec0bff3f90762e30d8cea2da420b48cd8fa9606ec583415ed0904847466564294cdadebf5cab5cc690d8f96a7eb281eae8d73b754cc8ab2cce3e087d8e7b555ac78ec0bfd961a29e05b06fc93267b8c47c73526b8c3dd8bb13867bf2df11347656d1ed8aa48f5234847519a52b6a4599ccac59e10e945eb7bd579e0c98d12aa9905ed85271887a974ab8f04a783747caab69d +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: ea74fbc3c546500ed684bed6fe3c496d3b86d2d6dfaf223969b942e9a8c95e85 +public_key = c90e6eeae46e271da5fd35f102a480cbcfbc6e7860630f59e41c64591584f1e6ce8e43e2dc8862de8d6cc228ea18bb91fb184dcf045b0318d7a60f3c4b3779f15ae62e0938743b78c71493beda78271ffe78bce00e7892fd1d4d49ef5ce936e0c17fa3e9f8f08c93cc225c916a2941c13838eda382f41ea80ace9b9cb6df1899e0a2aebede57e0b6c7f127e48a5454a457d8d37439572c558378cc784564e71f7adc78c676db8bb8aa48d357fcc1f61859b0ec72731ce0f8c3932975c70e73f9aad34a56797a04ddf97fb4aa6b97a63cee9f5ca6318d1bfc8b4c6d9e08d9ebe364d0b4ea82dc768be47f4403d1bcabfe4cdae051ffea9919a9b66ad7a6c8bc1ca5622a54e118ae74931e571c56fa40c94c341ed81867b3a8957ff46cec3f8cd0097a35af93438d74c78c16ec2d645e7f6c3be5fa6da759d85eeef461fc517e1cf8baf93418978772e4c724cd719099e5a1a580715dc57d2a3d56597b1e1bae4b437633af52303e4b39fa6ab8ad47e12b65030f7e334b715b6bdb17bb76af6d8acd0f50d91a859c8c448b27bf4c44b09245de260b65c20c82588c8c1fff5affaaaf150479e818d1c82cbea73a37dd1a7df7df68aabdc4fc753158c39ea4f9d961dfd4618d4329f58bd56da37357ae6515bcd505c7cda55b2679d17bec3d528e6e710eb0a64837faed7ea26735e94dd92a648f828cb30a4ff8b99adc92656c1a14cb3b3d6929d6f0785ecebf3eaea5cd372cd5c06cc637dd9b68950ddecb3796d09ca87884412726a25bfa9bf6eb613e2afa1aae96e2ee634e1ca0347a9bcc96816933d92a6eb69ecdc014ce91f7ba4fb1be3ce5555e8c2bd7d8568722155287264b5fa990e936d3aee7edf778832ee3bf9a767fa9e650421ae4f5bcf27df497efab895123d2d33ea521c5353be4f5307ae4b8dfa566ab3b32aacf354cfb05ae48e4c93c3e57d605067dc769d722c452245b3d761fd5d3cdaad04bde2ec535bc6cc3966e32e329a980c8495d765ed1fbd71c58680b1e859c3cc0b1e986486a5b543949643b83452c307df477685a4d0b7da7528a55a997bea46780b36f52af157fe5d874cf5c420b6bea324a932bb5f2924f8a3977fbb359abc4b54bbfac608b0e35cc99a38f2dfda4ed88e4ec5c47984a636c7cb99a6b6304cb046dd5261847207e6be06b899087aa38053111e35a95965c04a7c42beaf319598819badaeb5c39191d79f41982e16ff3c8e89abbd3ffc1487f3cb99a167ba695bd668a65f5a88472439c89189e47ef93e022b45f6b8553c825de32b5421f85f91c93da8698a9174d68080fd2142adea1dbf8255a9ed709502ec7851a56a86cd3b7f067f6ed6a6e50fc52717ed4e829b02f7b61a1856c9b44b8d22e476895eac29db46c6ec053c371a333a95b88d6efde6c033790c1563fb833f04e26ce3af87750ca639f6d5cd445d24336751dadbdab99ce5b45cefa04caa29ba33b4998da0aa832fcf25528f1bbcd55961acefa077de544bbb91fe1878c6109c5e2b6b4850b5a8d0bd9bea6978a10afdc1fe8601f2ef3a98aa23cfa300918e7ee849e655ad388ae85171a43047758a578a02ebb557914e06ec3d96d4cef9219ff0299ef1d4bd65aff84188b711ace4896688ef2bcc8086c6050ce40a80af5c9595d030f69b0355ad9a44cbe8d3b5a1eda1b85b12fc785ef1ad78adedb3b3d925dfe55ae8682859a8f8164cf620cd9df577eac2d71db87b02aae6ec913d3f5b9711786ec603dd3321db1bdf7388895b30aca86302fadde69304318f1dcdbfb1ba4cb923652309b4f177ddfc9fbcfaa8553cb45bbb63d35cd28526ea8449844ac68b87aa71d47ba4f44f126bfe33f3af503dcbaaceb96b4f6a1d84c2da35fbd1dee20b5e7d458b4291cb36394cd9a074e51d8a45cf6f3484a3aa7d575987f42aed535d46b74d8645aed246692bceb8b055d717ccbd59769ffa6e7bcc3aa7bb9366bb5ea737bfce79b971e1cf04ad6ffd09755b4e4b233e94a9cd349104d49ce6cc96c8cdfa1254c4eb67748b337c41c473fab4a944364531a6fe18652856797787c804deec5956fb8d145cae4b9723254dba99cc3a67cee019b53febf72d10dc85ad63d686a907b3e700fd4a29e5936a53a4f2d2486751851eedeb70115adab07a29b15594576f21c3f9076a5a116676d3534044965014daa0d13da178581619dc06df40a02750beb995480eee9 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 64efa87a12cb96f98b9b81a7e5128a959c74e5332aaab0444fca7b4a5e5e0216 +public_key = 2f7a733cacdd0a05b6af9e77614fe05bfa99d159d62746ac20dfca81db92255e8a3a6f9a37dd43e6a398445ad55a2cc28ac785e22b9ada469d2e3491174a4e17fee824e3fc343f6f7dcfb73e4e7a725e496fbb6805a79d5d974b12f3c0125b5d7bfc7c6f244b69efc1ca96e3e99e32236eb4789898a1f858f5a9eb2b2be77769aca1453c57c4314054845203d63d3b55fd2c3063adb11939a3c14a81c59432616a5700c775fe98c6fb88c1ec8f77c469be42f541dbb79808479e0cebe1856cb7c1cb6a5b865469bba549d73cfe68ebee85494dfaf8d6e96a5f04cd65e561ef66a2482c806e49f57b9ba95824f1708663bf0b45b423eeef3384eb53b8733c4957937161c3ccacea5cc09e429e87b8b2b6a0aa44cab94bcd03de4cc3a3fc3ee58b484bed11f5f43ffadd35aefb8d45bdf49ce358db3fc163ac082cf3ca6c43919a649c33911c68d2e34d7e9fea350c3b64f40fc549add5ec87650df4f8e60b790489a17e96b9e1fa91b33bce5f4b8d8d0ae710b39fd2858c25b898c1386c6eddf1bd44e4c02e3719867f8cdccbb5dfbdf23fd7860a638be4ea05b9697a3bc901e9ad0075c080243cc0cbb3d389977d6ff230b4f126bd8d41839986b6dacbef8bda183aacd3fdd5dbe49bffbbfd6db0d5ba8ad8abeacc0863cfbf4faea37ef306d268cc96d766642f07a1172f5873e651ef693f2bb97339acbcbb4dee9764d5662bfaa533e68e06c86f9bcbb42b5f12d79c3c379afcc37dc4995b11a4afc3578a31ae3ff57ab8801fffd5c3ac5dacc3462c7e7edab63b889c22f9dd685733a1a79ec336c50c18a5fe54d8c3def2e34a60ef56a78cce6b78c3c98ed689e0d9f76697cdd8aba6681d9cda1eb77e6930c4f58cf01f40c107d15a8afb1749d9899f4cb16d4b4f897d19c5b0e4a557a7af3470bc71db15bc99248d42d9bed51e765279d125bebebb4384746e9c4919c6c0f4d71ca990baedd5eb287b161f6e5c3477a98669f0856242ecd73cbf673c8ceb1485799d4dda0648a8324fb95a2377d8efb1d9a4f09184309934c9153d8b747ea307a3bfc825958a98a12524b847ba5b61e5a279eb9f7cab5ce13dc45ffcbcf919a6cf1d59dd7c6aa077c2d24374093e5db32a800d2d99a92ab682fac6461896d593d07b97af2336b1e7dd61643c62f0c5e22d48a2312f5128d5f863c9aa7837ab4f254f92863efbb3b379f87e4017ecb6c8b74ac79af4fce1da7cd28f1caf9545a7d0a984bf6ac8d4067a80ff9325daacd3f9470e5f9f03cdd183586011da8a0295b679be8d767fcd4f18e317c9fc228d3f613bb95927dad3a4cf465645d3e5a1dbf672013bb935bccdceb5e393bcbe7c975d30a9823667bbb155bdcdde4ad3d8b453c3dec3bdcbd703485975cc571530b4cc521693a9975e39fdbfea90d57397f34c479ffea1edca0f56668b8692127bc9342f389046c640dd8ff82b67f9778964054b49bbddacef4628e771627ccf34f46c6d9fde9d99db15f396a39ea98fbe4a23575952abbe46374c74c8e2aac6b9ced932c078ad3f3ad5c92eb7213d5774dd70b8c86d7686c53c8ece241586f5f752fb5af77425f639fd4157adb24c3d61141878d5759d12f8bad4e98aa5e4e895c9ee132d74b31aaadd3da1df07d8c32aa0dbfb2fe0b5e9b4289942e99754034d65d7b9eb6cd0882f5048b5a293038969a944726af3476bd681daf177c5bee023bb7e0abe99a630b5babb5f8a67c91e7fed0fdd1187c338a97b73ce674ab3d2c40d503773eccfe5ea5c1dce8389e1d8d8372b9760c0498b8ae8f18f93ffd95e9476ea5673d6659b558895796e14cb5a55e7a3d0c9ecf5b6f28a3c93176afccb06c26ccddd5224a4030eeaa3b4f356a37cfe9fe62c65953b798d9d96cf4353805ddca537a9504c7d8d174f4a3d7fd9c2d738e25c357256833ede4375a65e1f3f868bc4c4e6ed62fb636e27f4c746eaac0f74e331df35d909a128c890e63ebe3e0cc307e632babbdef7684cc687bac9b966efecb85feed30a2bee15c7ebe6af63fc64c321be45cab657a15cf749dcc9961952ad5489c6485f208933000ef13f3c31eb6a389f17fcc3573166b9349ada4d7dc66bb13ce8a7d96a86f93883f83822fcd095bf4751388a51166da7bf4a0c5f69368e7e1ad73b4403aa3c1db5d29ffdaf198aa848a73c9f9a866b634f939c2179ce55edfaa1d5d48cb3127f0fea3acc7b163d +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 8a95d71228acaa5f9ae6f9d9ca8ae55fde296463b41083a39e833e37c4c90f88 +public_key = 69bc82661a9e8236f4d2a644e1767de906658569ba69affaa6ce8996c58b3325685bf3564518afdbb99aa67acabdbde7283bcec3cca9075cbcf00fcbe57ccfc73581784bc6fc1b8b7623b9256cf0f753d887c87a5f6873b8789de49edee494e447e8f6706bbe47d6c4bb13380a03a533df40adbb8240847e6ed68eb5abb3452584b949b8889bb77d2bc87b1ec45819e99325d9e8fb931c5d9580cddb972c8f17c8be0e0565bd95b16799606c8f5e472d59a80e412bcf704cdba91faf692725e9421574f817f06d8a65f8b67f451e7b4c84fe7b04f19668cb013975aa3e7ee847bb09db3c44e8d29f0ec4ff4954d5ac7557a4eb4d1fc6062d785867cef3f772158d5c96d8497c5d862a7e3064cbb04d0b9abf2eafaccedf33eb38b6b3bfb359d8ecfd48cdbf39701944fe64792b8a909ccae4bb05de03b858bf4a318b9860e68e41b80ee5b396e6533c96c4fbf51167f4e677fec20937fac6e64aa4a9818acf072c90ea4a5ba34cc9537da331ef874d76a5e00bd95f1aba5917a6e6c3a50ae59659d95704dda1e9c76c100d55605ac83907e06868bf0727496f38c4fd14f2260bf71def7bcfab89dbae92044462cbb3e297a660b29ebf454d305d5f35ed2f5018cc92481ce9bccb480d03d08c57dab20c88c8aeb2a9f37dd7c9e1cae469de0c7f6e08aa9e4f7a8ec9daf2649aa28ccf1cce9c0fd84842e5748f68627873e659a5a874377347ea3895bd35a6ce39ec8cc0aa63a960535f8f4ee3f668bbfa9a67a82ccb03253461d3354ec8ed0e2effd667a1f133c05483df28ab50f54c5416f65ef60b6ce8c86f6608456d8e9a7f1dba933f322e4bc73d8370874846653f75622b3da6dbcaf9fac7001cce6d34565cbc6f35aebc9af9d4c62f9320a3755c4a439f035b5f9ad99d7da6a57b5e3e25d01b0cea710878c5ebd931cfef296d3ea4087e0c3da2ccbdf118fa64443ea8141fa22dad7220ff66620bc91ff3e8897b77d3c9b7f9986861879a3a9c349e16c72aabfbd6459160bd5a94ba4c57aa72e93c3decc55597e664ae3a683284f67f486453ed89aaa8679234c2fde99327b6da81e687cf4491de4b90528492b6c46eeb87f5d876a91997d25bfd6895279635e98183cbdef7267c6449913fdd9ae1ba77bcbdd10b03b90086311a1eeb1eedfaa969ba41b6b684fc3976d4e6342891ccdd588b5c6a481cd4d7798820da67c924ffc07a906f35e7aa2e7398c9611b0749f5556821d933690e4d9e0ecf2976af6bf492e2e59b66d3671f8e4e466388e20390383e3ac79dc3dc534ba87f81613560b0fc9bc6af98c87b879835b386c6b0e168d830b689e8cdd5aea5dd30acfe264556685c54c606aab8cd318b2c66d55e3a707b8b590dad2edce5688d7f292ff525b69b7e1cc0d1646efdce673a15642abfd5e50e6887464c39a6543f8fff0a8db8205f4203b45deb55e84d35351be963d49d6e7b0a98b59e67a3edbac9c7a50dc6f657c4cadf6985d753c3409dbb1a275be17a7342859415f7855384975775cb558afeb938d1bceb7f63cb97a40837ac159a38cf935167e60e5e8bdf1ec1fcee8c339f3d3049b50c5dc2ae0a32538ec7a4bc32022aa78356301a9ed3b25398d61363196db70a6536bbc66ef6fc9ab85677175f689527c5f5ebed1c4f43e4fd6460eba75c363715378c9a0e9d213732804b31e30cbe3e93c6f83a7ec239560abbbd48d96685fe7ed61c9dafcb55cb168e2cae778edbd166e7664ea4e2f4ec735319ffdba5cca4585d184df3f18568376e9e58cdd52b17e41ba9507b14fc5d5b89ac4f9b3f237f0e8dc5d51f6cb4c59d9d19bf0bfa9e3ec4f8952f8d14ad5125b36d1daa64776e905cb471b094d5207469ebb35ba5375a40c9f3e7bdcdb40ed80bb6728a389ca4b89079467732ec3cd8af7d746850bd59d8e51ee34b75d419e639fcad7d88fbfbbb755b2a7ac2bc6947ab99d7c80a3b571da77188fdaf89d874563b66bef36baba0b6fac1e6ff42919bb4519b63746456546745670d88263f457f1f49e79fbb83ee6c802ec371af9453a95601ad69a55bdb62087f09ea7ab3da48358f57877864cb18df7a39603e284063da75ec0b9219f5e5021ba46ca8c573c3d6e824f45d45cee5f55d0e5c7e36b3e166634e7805a414ad62a7b5a7ae75783f97c505daa8f9113507a98a3e8ce6ff046df83fd23815de42eb44b586845b55b2d39aa000ad +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 90d79d75d0bbb8921cf70d46bab497022a8e750efdc99e5f1bae653275441c7b +public_key = 55f39e78fd722b7f6811358dc1fdb76ab9daab9cfdfdd3a4f3f3ecdd076948dfb503c73b8805b26d6780d75b86d5f3b50ba899bf0ffabeea7d18fa9016878f3aa8ba392a4b42ec4f9204fbd08ccbe59ae8bbc7c863acd4016b9c663ca32ebc31fd8fa138a7dc0ddf38b7deb2f2645fa407504183a126beabec7ff245886b9dccb9f2793147a63227236c9ceae73c0546739bca51bbf4d03f87cf935a8d97d719b6fb727f8fc6ef62672f96f9984e496ed1860679cabad2fb2fd9e87d3e0a5678c496a401cc5c1b834ae9ddfd2b6eb8c40694c634c8039da2f5b4a63f865ed6689a553de589a3384adcf99c054d1c0af6be6ab27863db946e6efa35cbd0ac8fd367923bd89cfb8f8f1e9ae0a7edf7ef34e7422a491bcebdd38dfd6898d9b7455824ac902b7db06d54c92d73b2047567a25336fc74a6d96e3d6bfda51c0645ee3dc1a03f31c147ad99fdf76654b9278be6e20da2bc23f7ee5ed43c6e900d48c1f51c70735e33af4ee90c9db43eaf6335b3f3c13652a05afe0858f7f29d915548acd4d96323b573afbf633cedb3061544cb6b80176337adeb4c5eab7c55bb612e9390419a7598dba6a7a5f3f5764ec7fcbcd31b85c41548e1ebdcf1aac1deb8d31b0c3b9f6f9b6bacd6ef29628afc979e3d3355fc4d1a58dfd0ddbddacd4168e772880a4a53e4e82ae3db760c89b2787691c4deb66e65f42e691f3c4881cfda82dd8834c9b2d8bfaeb0e537f5ebcaada992ac0a3402f8ee18baefd149ef00fbb333d46c7af5d373eba628685d15dbe867b952ed05bcaa8a7efce7c825ec58055bfc84d5c69edffc219cc71d5a92230b9f40f633029c30bc7bf66b37bc5e994e14f96d4c568d83db3491e38ae1b4a320d831cdd5a8e68fa1e8a43153c347a3d9e919ba60d18490bbfe8ab8a530066a9c35cb7e069e5d218f9405abe61b09a0b8b446c42fc9be6e60d84e3975aeb11d0b643364432a2afbadbec0d70c642b68811b39a69d44974c1f5655a64075b35cf9dcdd632493ec46307aba8abcded33eac4e7ad3329c246a08294f3dbe41fbde6f10b680507d597dd6ac35bfb4029dc36e1732584fa4e9386c08b69cf2fde24bdcc2cea6ce77c3e0262a71008ee7fa1b70deca96dfce83f2a8e975036117656955a5c4f1c674b0ace625cdc48bdfc2584968f61eba5d17dead9c7889e79b1f1f3c488349a105f26f45e070bc459f3c8cc93e4e16b97266d37675c8d9fea6f914e9f4d18f7cf9c4eca0ae69612b70adf6d9bec43e04345e5b97c330e9f16a5a7e4273ff09e95469e9b3432d41c41e9de5e845d7fdf7968d6abbafd3db9f82029d5e2fb8fc6d8ff9ef074a231ad5401cc9e32d76e1c372e84fc8eeeadfe7aba76ce5baff468cfc93482a1ab5957cbcdc2f95ba074038e539be24986cc8f97a536fd479b42c8973b8dd3d71d743476f5f96234b333f3b17c3769564a1a82378dd5c4d23a551024c3468f5dad5b97ca574e2738eeff4464d62b9619d23dde859e430b5ccdbd9f8b7f4e1fe08e0ba4fab3233f3db2dcdc42b5d17a9406e46e2b7a7db6498e7e17dd30d338689665d3aa7cf2b9731508f37afc890b20d97d803d5a26b9664844784ac8d00a3fed8c3f439af8e5b078484b5324d9764233f4fd10fe8325ed2ea587d6de84b482992d9e6a6cdc3e12599942fd7643449dc0613f1d326bc702376d466683ad546b3ccfe47e4b891f3b7d584375dd3859ed58fea4f55ff5febbfd7f14e3abe266ae465e58c1067bbc02e4db3a94c548767250ae0dd048765afed5b6ba00c3382d5064baf295b310f9bf27a88f8f630d5558d595549b76fd17a4ff9ca2647621648297a66e939e7e409cccdf5cb1378b906c3ba731355d57cad4106e58f7a706f95de99e7610d2c78d45b9f69a9f6a5fde528aea49886ba60df5ca21c325f3ed34246c45795e27f4859c0a67cc7b7625a5edb304d8f4e1569c73c54a4da92a40476402573a29739644d6290549f4b4ea2236e31251c5d59d85e1e6ef3d527576f7c79494f974d884e7a9f7f7bf6b09b85fcbbfc442934ba4624f9a3ea921aba995f0efd221e6cfe66b1335dfbdaf690ed95483aec9785e6989e934e7858bd13498f4e994619ea9cd55a9504f4db4d0ccbe8f8cca107febf74caa39755966f3c130ffd121cd22b59b2cf3748b17199c44cd37f8ea61ba5d8c1bbe50789ce915df9fce1b4cf3c5acd7ce52dfd +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: be8a32f97b9a8d596382c02fa2a0eeebc15c083e970ddaa4f2622b91d6718663 +public_key = 07f76c0e2f45fe775fc5cb525824bf945b31bdccda86b88d8827ae80cda3db8bb9f534a2189f637775d81c4669832bb66495e3406ebc22c55f04ced9882b9ad7e75fc01f519873a18d9472087a6fb385f44c3e3f6b8eb608d88b0f89e4738fc9c47d84b10e38e8bc8cb3bbbd2bf9c5f957660416e7962651f0556756bb9121a6bf09b5e5c6836b650c44e9db72cef47e08079945b8cf19d8bb2574e186a8c89aaed3898492a904c5a8ffbefc26e4b458f931989ff7fc83ac4d781ce54fb51866706cb04fcfc1c98e3e963c70b1fe5567c4effdda8d02a94d01de348a1ebe52163f5c54e88c7fe4856763a419d40e8480c1ff63d966a99ba7c7d67f4f225ab99327a963de497eabf65be8e9c2959b1cd7995d138b4e7e8050cef2730b61347e3d68c95d861a3c567c803adc403cd9e11873f7e27f6e298ebc9b5be87319e637c5532a5ec0c02ad999e7740fa77c1c1c847feb3dcd387ba3974e1bdd310f889d05e350900f4435aef61c367c95ed7401aed3e8bccf266fdc4546c4bcca7aad34aac89892535fe9ba9b715c57dc72c6c6791e76492633608ffc03b85c51aed5d6f43f65ea9908d4c61f7947d07dc4edcd8da31aaa6bce887bd388720cb36f1d521dd88d7b2a483fc5833f8694be9892bbf8bb19b6ceb09ae33f037372ff879578f1014b58c6eb9351946303a3b7fbafde32a471f27ae8a0b939ff137928cfa79c27a99114dfa1df9b5a99e24de37fcee8e09ff634f73e355124da873a6b76245a2538aeba8af34845cb4ffdc9707a4c56f8baee23f9864591d09745ffcf4b1b49ff86c47c38b6fb613a8e6eddf2ecf58d7e8ec0f2feea27296290cadcb5ccd4516a50fd1361c248ce450b54699cf8a69f742054f7c53c68b5f73c739a62f9d57ffcde7f19cd6995fdcc59fd979646a7273b9f0d3493db1af3df085524845418695ede5f6af36ac6b0b4c3347aff623e7ac8e93cf54351e12a752183c7adbcd4c3a943c463599aebef4ede8a69d6a934ae4447b73c260f37478fc820a7d6cabba3a3cf7b2b1d8ffa23a6b983ff5cde4ff2fcf5e9a384a8bc83856cd43a47f687a7f11215d9020efc9c0ba8ae7676b1446cfb376b1ddb89af36d007abb736b5b223044e73dab7b3566c7e46ec5eaa54978a6f407fc31bf499c0854e283dd5ed6d3d3b5d426b24a3582ec0f26e3d55e68e9278f2185deb9b2eaf9296989e75588143495907cae39cf31c85f11a7f58ecd6dbf14d9e4729ce5bd436749343a449a9450c5b2a08e8db93f10f9738c10f9ba26835c73c4a2b95f55c4faf997d3d1d57e06e2b3bf3f6c90c2bdc88f4df14ee8f497daa42555c09fddaad7760321c6fa825e768a3dcd8defd1c6e49fb679d35e981319b566108b56b98cf1efb9ecb9a3efbb6ac471c6f102d7569fbf022fadfb0048207e96a7dd8d5d1dd7de164e531848d6718e7463bbed673b5082ff7666ae57bdb5509fbd9874ad0b8c98c48a3c132fdf9576b76f49b7d025fbceb0bb499ac6bece46f55fe6b5d84e4c8ccf7dfdc9948077c0913d4adefda4955b3510ff353576780696aff4998dabbd2873fce4b3a372fca46b0bb33f23a52a93c31dcbba882b9f5c9c6c0c4546ac25fa0eac489eabf7ce9c89aeab652920690b6b9944fc6b807d896cce9bf0a19d8f063f2e184bb7c6bfa4d7459ea75bc7014f4f884925a2a83cca5f41e87d1944ccd5337ef8b1992afac3bd3f63af42f8e9b84a5d1a9483d65d2dbcf8f992531ece7ccec18b14bac48f106f13996ee90cb8ec078ed059788ed147d1f2de15aaab25b6b41a66a5e1388557ad56eeee6571e04e9a6fdb79745fcc013a1176c3b131b499008319d2fe185a976c593ebd3258b7bd7b3852aa12fb77e9ebd8538acda9f1d33ec2f4835d4793c96d3296c965bbc699f87b328db504b335fe94de0432a4ef3adb0a54dde2a3d9e347d660fabf1bbd79382a7ddbf4750b4ee42d5f7c38113d901e7c09218636feb3062d43ec75a7ff9a640006cef08669c50d6a41fa86791ffbb41e7cdb50ec06c4cd35fc8e2af3de36054f2a7e3c1e6aa437ad4f61f7834fa95be9f8ed01b65bd2e14e7174e42f2bc80366a8e5e1ace661d8771c3f1db9ee00397a1180dd615b6a2c934599416cad1e5d91cdf3708e45eb609db2fb5c47c8c77d6e395a643fa45f4178b0959466f648ec5c43422397d4e771f902db7b8d876a028f1708e233d +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: da2cfaf69e25b2a89ff2557bbb6f69e01d8e2e7bb27a7a1ce7e40fead16f33b2 +public_key = e50efc6f27cc5513f582857549f3ba0d6bafeee47ca3efcee05bd23b066f53f75a5dfaa0acb4e6ed16cabdc5e0564738aa18e3434675809f585bdee2c25a6e0723958b8bf3bee4ea1276e7b4dc30de275bcf9d3a1c7cfa28c5c58c49a5f0c447fb0c86f5b6a6eadf71383588ec398fe79f8f04b67ead2633ee174564dbf115a55d8a53971e0c9fe3bfd9f9c8745467bb8d9944e7cebbc8a54a5d28cf82e8815a46e5dec5695e0dc0e73bff7c483f72d36d2f19ecd169311a283a42e6d8d0d66e030e72a6a799a67ce0aa9b93a9dc5caefc805cd77d567390c00e7693db8b3349fbcfa6d11dc88287375bef8f8341e5a515a97c019895c8e68d42cd675723af42b6a50db9ed04c9880e2ea5afa9f93634e1f5b36c75199211da655f454539aa399fcf76af39d120cfb5e7f553457ef20ec3ad3879e78109a282e8a960c6e19d0a4ce90ed0525dc637efdd70dbb092999bd2ab9598adb1de66d86c27ca8f6cf2b86995e5aaa9f75e4323b3e750eb794aeceea124731708ffb4436050ff54e99a895446d6039eafccaaa1fa26b20fbb9f48e4628525e3f87d7a5c3461e3f4b3b4f7fba3089c53fb85bacd576c06b2dc93ffafc9f9c3b34de6974021378356fbc4e138f885dd62b93eb9adbceeeded3f5be7c9c7e8b69b1a7a7a3d484233ef0cbee07079416b388a074ccddbef6b4e2f693f95a8bbdbff3445ccf74abb7034f8fd4ad4bea9ce55b6c251c57b700ed332a6a8593f530835883336a10a9fcd30144b757ab6a6377389e36094ffe8bd09cca25d4400a7a474ef48cce4d567637183ccbab9cbfddf7e98abf35df8f8c837eebfe16e448b133898fa6ce3abc79beb4ac8d9997d1f588d9d8aa21dfb267da64654c8bb4ce914583748b95d13f9619659ab4c8687f98fd30d09f7ee04b6a84d47b995625b1a9a929a7fad134f989c7cac25c42817bd9f45327725474b6f9df0944f5fd3bf06057356ff843f8e57115361ce6f7ee6d548230a89ad49bf1b156e50cba750ce9a63fafe01796b6ef4a37e5fe2897346da865f5c36cc49a6954a8a868bee95bc56f53017e6d3b3692e683a10e9e92e2ac5d096c4661f6730a9b72bb3a729a7cf3aaff674e39900dbbf92bf785f4dead8a3843f875361b5c4ee0953ae34a583b36d0f54cc1958d0be7bda6465479d5e999e6df9006ee17d5498e8c6a0c81bbdfc7cf20c2ea310993fd5e7691834732e358faaca4610af6ad30d44dbc7e77c47736d5efbca1eef0aadba4e2faefb485a524bbb8f74bddcf78358c8addec550b86895fd3e41683cdc334fe0ed756865aedc9446c7d9983cfa98ce9edc644967cc93c7d08e3c9166ccbffbedd8cca6569af9e3e83f7c2613f744758f2f8fa70f8a399ad7f657995ef2754e3184c263ab93cfde510bcaed0838a13bafcb9d8af5c236a37ec37fc6ddd93bb47dace9944d077f5c837d78c54e40becb0e8a70c5ae8b6e8b95f6b7be2b79b802055ad4ea5febe770c39757ad4fa09feac48c6e74bee79621bb3af8dda0094895cc8b6aac07f3eeb76abf6b6f0d66bdc545c68c845b22dbe67f96a0449bdcf91fc46793a28b55a601ae431374b570c93d6dd7b4f799e01e578e29d96b2384a8e1aee5faeec8de0d8d0047926c27f85dd996690b4ee9957cde5ba5655ebc2de46371738e65744fbbb558537b33581998dd15f5ebb9c17d9777a80ea676956a03bb491117dd83c6d3f5169f66838cb77e627b899e9706be956dccbdb5d135e5d4e37d9ac31c48c4fa67eaa740bcba4173fcf5fd7766bdae98ff5ef2fe93be5b646b1a475c74bcf76bca3904a7c11abd57dd2bbade27d1ff249f484a4bef0439222fc416aaacd67f6a283d66fd6edf3959d3b5f348612d6d8c45a4cc44d4401796952f3b8eb578c5bac2cede83507946e4edfc0f2e9ae44dd8e1a8f2d77acfe5c85bfee7a0b6badeada58ad1ca5ba2fefaca2d63c326ac425df50ced91b2095f568ac7b483acafe7d45b2f9954b8583a33376ca7b19a948a10c4a45a5b80d403c89773b7c2c67ad1358bf3adde8a793def7eb91c978c389b4d8d8f4937f9f1a189e4c7dea4bdd6460a2c7cad5dcbb30dd7ce9c98c7a3342f9acfe21d94b249870afc3e169dd701e6d6471a7a0dfcc074cf77bb74706e5571f81cae743ea7d1e36dfb437d7e5f957526bda146bfa3530dfc93063fecb103ce58c30abb5bb70c6dbc92e5f3bf4060 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 511c2ab40782322c06111e144e505328c4e5bfc890a5980a2bbc44aeda4c738b +public_key = 1e778910b9afed44842d78417dedf7f819699af6b0ab475a18b7359817b50d3d6bba17f8c5b9d88e667dcb7944af7ce0ba86300318e65d1f42cbe8708c8347c44ab77478304e0cdb9e63f8f203b901084190deb5b7c3b085e74cf60d729e27719c2596feaa689a54ccb3a5a4a74acf36c652fb97ad4929dcc7fd83830e7db7b9e0f816701957cdd8449ca075b9a4ce8bd88469e305ef0c9671474e3bdbae5c38284a726a8935b3987e774a193df3cc0acc18b8db8b79d9b52b872698e381cfd4cf2cd69415a99556476c1fe8ebc4f17ff33a0593be5f3cc47ef89c13397d68933721c5a6f134eb88f452655cf49d35c1a9be6305469586435c1b6e56f96fdad33938c8dba42adee8165df0206bd23536ff233c36a89b384e8fbbc49b6d6074517a73ec5fdf85f56585b28646297f503da5c3df9c91350d71eed6f5f9bf9e4d4e6e93b46d37f95822ec35c2897417e7e81dc9a7097aa74f4ad2bf24f0b1a568e1d7b1a743c0d086f3e2296072aeff7ebf5d67d751fb3b9ffa77e404ff9d162b635f0c7ae693578d2a752984914ec9d36bca365a76861a15d75b5bfa95077b670da42e17ed61ffe618a689e3f7b5c9836b755e997e08da17f635208e4e2ffe786736a7041efd3c9ab9dc5db5bafd8bce69ba51afc48f059ddf2e81f725cf3904f7b4adf8402acac36bc0797c918e3da4a6d4bdea39f7cd75364d167f34db97270d39bfccb64c1dd3ab3532f77353fb7ad433a5a9567dc2ccbc77f0e4bec1584cb1a88736ff7acf68e20e1ef65ce7f36f18af3d0db4363cc372fab07ef3a8713db19b07af0213f0f1f747e32a8bd103ff79fea62a6da43327307d9cf12e1d4468a8d5be15c1c68682d0a8a24eb5e267058dc5be5f37fef104ea83e425c2492d9a8d193912efa2dfe3a47f485abc2f6f039e9f9bba401436fffe6b4607bbb511fb5fcd2d5134f8aae34ed245b9c9e73957a2b5b4d0ed916ecebf6ff891c645b28e63bab7cf3e5077a8c3954fb5978ad9ed7dac5c5c1fc4759a1f524566785e0ff3d04435a7af4361178d917b53af57438b46aeeac546bc6fd7c186bd196bbb6287f16d95ab6e545d79ed4b82669d19093241c8d8aedc5db79a9e5486f075adaed869314989e7969ca7f20942eef7e9287c887b45d8f23b919428f78cfdf36043acb3e4abaca4dc44c3aec3ab8c78bcabd85ced373899369b515c2478c6085ced4bd8f678f24fa5dd3c8f355468bff0534cc776d045e96ca50d67df6fd09143730907d4107ea250c359f0d7ec2f98e9b62cb39646b19d63669f679ff9f48ac7b4f6e30ceb1d358b686ed5f285867273d4adc8e09f1d4715b6c331fd53972fd7eba6e48a866c12c9349fb6aafd1b42f508db2e8f7094c3b4def647831f332d96359fb3450cfa6bee93f7eb7d7b8cd6e79a1d53596fec6199607d9b769b38ad15e4b639eefd16aa90aa49cd90c9d47696acface4cbee59f82b46de5bc64450f400bbafe839ac801d7da368a3611dbe1a1484dad03d2862eff535fe197de797b3d85f5e4f9d286343953ba8de676c48eaebf394d0453bf171d905f3b6afde5f99a85df2333b3954d67d9a9cc2029f2f9c5e62cd4ecbd35400a2757182f8050a97d06ddc1b303bad44d5f37bef18c6cd89c98467aa37905b334edc3ef667a88c31f9c1749784f49b83b3f9276eeb5fff4798d5bec5779a5d433ce716bce5763572a29cbddf5b40b464f3e163cd5b554c67efc217f6f57244736ef616f45356247f63d69a1e2ed3cc4d9ad57c83b3075cfaee4541838f261d8bb531b685c76698acf8ae9f9914169d78593d8a10ad37156b6d3c8c0d09f6553b570fd077b6fd4e9d8f4556655ce53f6802e4d6782bd646314f304477bc8fae9757bb54f2cb54c9f76fdd575d6bddc268be222d4c25efee860ece4a1f3453423caf00fbfe98fd473ce94dd234038f8aa0e4ee8286b530247b88a83318feada9d2f6cbd0ff610f681db3880c32d8b70f67c124437de3fab922d894baf87c714de06f6cdd12feedf2d9068238b587e6db488335564c3172eecde9d741a197646874922ec355a26a7e5ba4af5873f975bf626c4dafbbb5c5a6defcedadc9fc76fe9b8786bdec5c77bd71b7cd54abcdeb9ed535bf8a4249a9256e4c1e8ec673fb5bcaf3dd63b9db602ed47e9bac3ba827acfba4a7e9b040776bd6f351e548ee005d759da86c9b2971f9d6d1cab8d +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: dca92dbec9b260dd97e8886f876862d6effc3b91fcf3fbc986cf56ab93ae79a2 +public_key = 1cb3c6a707f2c4039b1058f9919f3aba14f7e2da5bde3dbd55133989a5b43bc371d31d5415e76ba18786237c7151548b270d59610bfb9e737e39bbaf9706e3cacc3ebcefe6f9f57873f97c503a95a4aaea114bdc4555f6a19ff03b2af7e20be810feb59b0657861567d55655560eefa325f3c42898d6faeae36dcd98b9cd69f9ae4d19a81375e54d24c008cce5d158f665d3e3c48fecb80ec3a407373e1bca5829cf45d484721357d5f83b5cb58b21987d9fb7b77224c03d0e7e183b31fb4c407bcf3312aba708e8bf809d5d68b4895a48cd7b7daf6ac9d60d959f57bdfd7e3672a90a6218fbbc6fb641163674bd736af2764c72c5bc8575ebe47350507ab81749bb2b6c74462db5b0a3b6633355c0a9ece5eea8146e5f2e93d03675f1050d49b1054a784eb29bfec301efc86977af90f8f0dcfcb8cd967c282dfd490be783c63553289cc0d6fde1ef6f7555392197d09e0cc5896acd8c3c9a4a7c637b1d7da325cb7a694e9b2ed7e889cdc74ed671bb6c5c5ea35b0e69ff7b5158bc6469b7ea3e8740e938ef5879e80d9ecec9fee69e2b377d8e74669ca67428e16c3cbd2ac6ed8a874f9bb767de8973d94f5cd118bc9b4fd453db9c64183249cffaf3f489ae79e59a056ad113833c2a9fbc56b10e0e3e922fe0bdb8cba69adff1fd729757bdcdf68b3fc7be480481ff64c4c0a8f5ef5fb274e85e554d91c3d36f40444d28878d7c29e22957348e4cf7fbe746850ceb3d3ee26074f42616bc4aaa5284f5588445e40956cf37bc72daf5a73ff6ce452ca689066fd7fee8bcd498876dc7c96dec34dcbf1965c66fd95fdad9e0b9e48093fcb200564b4cfb36c72c3096c5579f736059534d57c7e68813439c8ffd533db25563fd838598d615c1b74ea9d68d7f33653a1be96835f474d5fe955e3c5bb5d6f1497c34520d3ca86f75af98b25aa6f765e5bf2fe754330a77847f88810aa53be9a256445131a4d5cc38b1350ea7f7dc960b6bf096f45a94098a2fb39dcd654f846388cfb4b57b4b92abc3f1a16a83b3e6953a17f4afb47902e581acecf78967e00548c735fa5c04b4e47f8f6a7713d2856e5b82fa60bd46e9b57bbca10872affad91fd6f88ee434d93e9f039ef5a0c5d06cacaca8ca6eb95c7ad87c7e499a4ad81bbf7ade44ab16ac9cb49743258cf0c83f2c0d6b1d0585f0adac7dd7f2ed7ce2170831f0964cae2b6d308d8afdd6f23e1eb510b949e77ada4c36f748148ce17b38c55cc7ebcfbfdf468105bb89298c88c98d6b124c7488e6d6b53bf17d8ea17ee5ae67dcf7f6a3382e5d705a9bbb1d3c59f68b8ba9a45ed1c97ea1eaab779d3d1f3aec72ad7420f47696deb68d06c5dc95e14ae83204fb4bf17cd9385934105c9e2fe8d3d83542f4aacc3af6b949a63e6d1bdc46ca8a6b4633927cd665ccd9b69ca250945c14366d4a7d5658f6cd76964e107497bc5ff90f5ce471a4ac29b6dc3dfcb70187d619cb45b16e306819ea68b58c7b3ae9ca9933ccfbe12e2340158e6b7db43beef660101ae9377a4201ad806be78d30169c4b747e8208780a14aa53987065936ac5fd6b7b8ed870fca3b1bacb05cfaf5f4dd5aa2d8b3a03929b864d0f2de1cec63b943fde96b480129cf0b7675c9a87c1c9efbab4a7422fe9c16d3679291e7765458a3803af0243fd1bf654e88f816b15a5bcc3bcf12e3dcced7c59b9fd1b1baf202e7062ee97c82ff3c12746d0cdb0aeb99fea8bf9bb4ae300ccf66f1692fd8641d6fc594b9894dfdbdc951b835123608734ef7cc3506ca74ccfb4c930fca1bea4daf76d6ffc76bb92b53768294c3047db29b795de63caef55ea193e7384299168b77794ffffe00cd4e5cd64cbb6979b38871fceec575d587dbb31efcdcf7dfef8f535b0545ba98af5ab4cce86eb1d81ae15bedef594551dc800553d8b3fe1e9ee6125d4a7cf25a91f13858e1cccb8e56481a5a3bbc3468bc6f4f39fd69425c8b556f725b8e3bbe53c1dceebc0af42c3ae619763448bfe84958cc333c3aefd35c4a496ec5c0bffe2bdc39b0c73314aa3d29eb6406caa94e8f80d9bd1e1b73e56f5bdbbb8dfb49f3a4c6d8543ac827395cad2bd50530b5e918f31c334e32d88f9947532859f7f3a379f726d3037ae72ef68d18cfbb87aff9a43bed6bc3fa384db6e0344d1fa56d45b035ed2b3f277ee6bc7b69ea2a0946112498da4ee64a2be6ab49596c4e61553e1164d +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 57c170e691d7a914a901b9a11c62b8b569b3806427557a9dbac9faa720ec3641 +public_key = 78e9db2d3bd6c3c74e613d6d7e15e4fcfde11aa3da116f7e5b3be1077ac78bd3fc47de406ee73acd4eb519bfc1a8cbc93a9db9c2dd964c1d91b097edfe594aeb77e9400c71e96893a85f4d082bb5b7b3711f586f9ecc4b65f66fdb38d14a5d86969a6a49a6ed563391a25be029a7a3caef39a06d5a37a4a0523757026d976b658da00b57cee3e8b4d7d25cfbd71c269ec9db9d6a2944c973cc9c4f7d5573c2eb37c64e56f4217cf90c5645b36cbb3f8f713de383daa5cb4029c6e0be4c43f4aeaa9c93843b784fdb63957b75f49d88820694bd17d6ca8568640ad41b78f03168e6746d8dc9fad58dfad14ab79eaef74928d4cb343d8fcbdd6ed303a1ab8b6cbbdac333af4ce5474013d9dc5b1b869bc9881323435a097d09e5910e39cae6aebc148ab7d8bae2c84634864930c24ac4f375731cfb65d5a9f9174df640b5f4a4b5fc9b2f81534956f94647364e852d0884e656e614f9a1dd95cc923c6298998b22cf415518443f86949e6c390f9463b69a63f2f9b328053c0197fea2ea8fc55e85ca3bbe74c7e3528cb3525a60f7639f7718f4687ceb2ae7e9fbeaed4c44c9ddddb2505f77fb77f0e696f70b5349fd4be2160d8c6b24c26aa943af8ee46f063073fdc42fbee4d3986ed113d260e88f2f2c34e7385491565169eec18ae3f4fb13482f5b83b206d30a6895fadf4b948d5fd5556b4a048c2f4ed6ec0fa53a774b17aed6a77bc166137e7dcc4b60569e77dbc6d5f9c277bde1ef59bccd08793b695eb3a5bd3c1b64ca3bbfeddeadb5f97294d8909c3e772929c693ac396e5ef54abecf910aa3c60ca02519f8ea4350b8d9edf7e3e474fad7cff56dbf4e7b176d3c6af97329d53163343e0af3a84ed37cb91a349cffaf7ee84d8ef5d4f2a73e9dc330158dbc6f144a631bc3c26d348773cb0b6a3b570ae387ffe07ea5dec6a682edcac8939f6967ef8ab2a482bd5991f8c6c6f6ef31b18f6191a8c8d4cf701984980146bbd1b8a629b548ce578f5d09dc593d5026aca96f0fdd787eda2da79019cdd47f5351859cfc9aad35f2f3398865f1d0a6e1a219895e987472afc10ee576e083f0b7f9b5d688f21aa995afe550c0f72f1b647f3e04fad48fd802d7b53ceb917feca6396d337fbef6ff4e777b85980754d25ef9418bb4c1983c8af11d9d2a1adff48ce21eee926ffb5b3d8bcac797a0f63d9c8629605a757a6af9ebeaa437d0ee84bfd3b70315fffe8cb2d7e57b4127e9625a9f1f1e473aa8a4814788c038dfd179596ebf3d3003461314896d38a9e8fa75e93b65cc76cdcdff4a73cef94acc47b3e7843b2a322f8fc9909d6ba369b7e8b588d2dc8056c7de8588c4ec8dce840d630d265a8f6a74306374da16f2ec1f5f51764c81c55b9966c27b66fc5ea3da312d7f826bf7711c3124fbb98d4a8351a8da0414ee99f7af63bcd15d66723226fdb0e793eebc70dfad4eba186d2c14381ae886f7c6b934f587710aa096cfd6621cbe4daebbb885fb5489626ad7f2913e5fe9a967ef6980f9486462b74e7938800c1fd519c5c0a684adc1c8ff0ccaa3988cb5a38f64ccfcba1f9ee9add64a58da88bed5cb01f5b0410a3ee03c91060f9ea789bf65bc9ec58b4b2b0c9aa9c7859a48cbf1defcf9e7804a5f8118d366d0345952ddaa920fb5c12b36c71fffa4c7b4564e78a99ddc1a968ec74569af48e5acdc39c0fdf9807a8fff1f67a79d73744a80626ebb5ab59d544db8228d54a35f560c188315ce77c5f3300e86863eb97253e6778415b77f24dd498aa104fbf91c2ebdc2c5693a49f54dcdec8a3a9e8e14a966eed7a6b98eb0aaf6c295e05aaf90b6e94ec20e38299e48086456047750a3f8aadb6be693c9642a8ba89b89c6f46ce8ba85d657ce51cb563ba736dca09c780077b956f5f75cf998c86748d2d332aa0d8f8625bc61939b19fdc064fe71175338465cdd4039e5c6e54682fb6876c7338f654d19166560be9e22fe8e2c16f9e0a6f457cb62bdf3c93cfba8a65ec75274f01607fc5479615eae6c172fb21b1d5da734e3e02db125c48b0a86d0157f780cef92a995d0322cd07b2ad2741d8be097ba0e5972a2394861c5c9f9fdd93dac8aed47a6467570299a5501c6b2f39ef83e1de32619d1a08531e737bb6bbadfc13895253ac446a5e9c483b592df8cb8a9a0eddd51937eb8d82bba18673a17339dee827be4156633d8a2c376d41fa4e7bd70d4e199 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 6b5a14e1473abf5a33d44975ca2088bd8fa6fddcb3f80e8fd5c45b9d90c24a5c +public_key = 82ff7e77ae562cdfc206ba308733e983badbd664f0e2c7eb74a6d5960c94319abeb1f8daecff74b27a923784dc081e4614658c52ddc5118b9fe7edd64e9b47641ab18abfce2096f93dba6055ae437e0d719b6ce1351a9902bda15e4c7efcfbbe9a3a7ac6bbe57586c8d5b68b2d9b747b2461f3afcc3179a70926423ea5aed845407846bb9c5c57534b66a6cb8b480c9a18453e047c58f00dcf652867b474c7b1c6ffd7badd7b4c63d98eb05f6a8d8559f57d8bdb7153525d6bf95e8bbbf3d36da46a5d4266d1e9fa8ee85df535d553bc6d547bbccb7777b5e48373f2b38f3c566e7b98a85465590feec8cffe6e4515ac3b4c69f99ca7f3495254c345b14d5fcf975bb5dcf6a1faa830fed9f8d670f27e64f25878a9e8834c4f71f75338dac56ca7b4bb3b56ae95444af369c20b68fedd2d4928037434c3c5f8c372fc9449a783f61ecbaa4ddb929f148bb6bc471d2a72707aef621ca295eb8b44a83a4b99c6f3cbd4003bfd6ee4ffa64e8bdca5a07f74375498fe2ec966f54f35fd3b48c1ba874d8765ef4de56cccd456f6e0c6cdfc8fc3b6d305aa23a5528e77aebf2bc3696a37c438a2a1259054c3537ab8798ab9c16c2b9bed7ea861a96ae2387955cb95fc4c984d2b936be897cd05ac3524b846afaed4bb981dc47120fc9e4c6476e7847ea69755886a5c85dbd59bddcf06bdaac76d9105ed449e36815efb9c0b33fc7e5b9b80e386a8bbe2bf2fa72e0a4efb447b253c65f619c2c85a878a54457d37fd2e9a32d2668d9b1fd89a434a1bcc4cdfcf5f909640901ab4eaa7e2895d335e63882f363eae69959aaebafea68c998788285eb545795ed74f8162993b17e7a7fbccbd2115c9cdb83c995f9130dfebaf63d82fb4eae427f3a8e6a8e6a3c008dc8b8c6f50c7c740ad2a3b92676960db68318c3cf24b855c6fb237b97df54c561c7fb0bdad877925734d75dc0824ab818e802f166d8a294ffe93f8fde34b02436ea37d86b98dd09545a71d56ccfda986d00ca3e6a3eb85a53cab3aa85b2e84e567e8a9988e11baff034d76bfb36c0e3ff685977ec3a7d2e4eb70462f9e5256890ad87d84dc8de5c44f8e73c65a8df16c73e2bd2f920fac8e24a6b2521d3beaac8b4baeea1b06f970a33ad9986d8126ea3e44b0f5c9508be97324a97107dbe5b3afb9f607ec80fc7b5ade99ff8bd4652644f20e56c2dbc33ee34cea079e6c7e8ff5efba10858a2b3382808de9bacbb952ca83a8f38d6a5ff431fa722b03e783e3ad6e1784ef9ab21049eee70dc2d0c690d739ac5a68ec4f5660576bc743d79552cc83332fb43e55f01888a3ed9fe94ecf307a07b8549c838bf4a70f9c4f8cf586881dcadb4636c01fa257a57c354d61b9f83dbea3f4195651021cff02574a2db4aa4e05f8e5a66fd4758382f96e52d8447295fa30b49ee7e6d698f4b9b6f9d03f475623e345e1db767b143bd30bb5273636ca89f6f434863cf4e813767082873ab5365dcd7fa252cd35db4f6fe6db4aa1f34ffa45c92783f7a81f5c866546bcfffb9c09c055ee33b3d8b3fcfe8832248e5b3e98c89794c5ba4e6486574de79cd686f6ef2953007431ad08895ae499cc27e11f76c0034ffa670fb677b9f2fc55d971fc90c0b8ce16dba195fa80196569fe8b87fe16d311867e6c6abc88ff351f5bdda1f837eb7830ba3e9498f36ff707c80936e58b84a9355ddf64aeeb575dc6d205686f7bb7d415ca9dcca9a94c5706945580f49eba773067eac6c989a8e1d84d2586c58f7d793933367da73ef15d9e27a97f04cf8a10086d782a3ef235ed08793748357f422fd0b68d3f0c76c886b35bfeaa68544aa038374f868c474f0a6df116ede88886a134ef090ac4c8ce7f6b4f9f5cb4d0e8dc98554c56363c8fce7f8a1fab7c0007c67915b7d793c0ec65e4c8f6a394c8502ee3c63b73b26ebde5c47d826278aea16ac479884ab78afd3c1be47ea3e81167bc1a8d627b46b7d075d9d87f5cf1085850a53f443cf26cfaa24c97f1db1ce37c7a72b5898cd213783a3dfdb535cd8ae76e432e9e49eaabe2fbbb643742ee9e551cd54f1eee6f63c953fbc7b5849ccda31676600bf9f2a6ad8327a6d6ab649fcffccfca574733cf01663fbadb3be7c33a483ce3e61df7d77ae34f1e4c5448dc1e94f5516d944eeed322bf914aaffbe789eb0a8fb7721fe98a1e0bee89476e7efd6ba100e4d6c896905fc524e7f985 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 40e593754e6eddb7f9cf176ba2d5fd1087c90ad377556d0b0f686537b1a3165e +public_key = 3375e904f4dd7b863a34774ee1f4d1aaaf4a970d45d4537e5124921355cce93e93703d7c7ce8d7eb376ca1b640e7a76965dde95b6848b2cc9f832ac0c11c3c3d7f90ee28fc46cce608c49e80abec24a7c738845e9ae972d70c5ed346c46ccc73e1ef51b1b57368b96dd71cbda55366596de1ee659a2f18ea7288c873c8a98974e31c078aaeadad176fbb0d3bda1555a3c84555c5a3f31d167d378ba606257fd3958bc24b47e848ddc47dc374a869413547d17d3d28e4b5ec85cc0c897f14d5b03d75f0947f95183ccb1059821c2b866e755e24286634fcd8862f941516c5934e8a4fa872b209e2018843d7c877da76c1832f46cbdcc046695a1e93aff063a5770cdfff56b27a2bbb56f76dba2b34b6a6765b7849405e4661a4a83b58b42e4b96b58ed6878fbb73f535e32c8fc7964a978b47beabf3cecfb33ce980f67ad3408e54bf24b73157e52f544939377ba2ecb5a298f76d8eff2317ac6939feebadd5a74a3fe336aacd4f57e46395fa9a96a3fc9172c5f29c393021e57266ede7f6e7a5ea2d66b469e99957cf4dc653ad3ffbf0b953c3c4ccd5f7463de539c024bfcc9475cb3437c235d2fe16b909f73b6e733c6dfc6d87cba8a24ff0e823a46ee9d0c76494950d6767af3cec36aa46756d3b8ef4bf0bfbf34c586857e62735ca2d2bf59f6ceeb1aefafcf684674e984773f66ccdadd6e6dfdf5b6fd87343a5d59c108cc663d8b700bbedd6cdab60fb66b774f0182fc9c2f5b2ce9a88162c3135d44ca9a735fd9db35058bbde43f0649fdf3085cad54c4a8cd8708d43b871dafb42ddcfbccd66ab45bae33cbf280dc67a5a62ccfeca1acf431b6c52ac476fc2ec4c00ea9c14cbcee12be232e5f3aae8af555958c3089c6c45b47ba58cf1f884e77893fd296ce80584a76abbf243dab058c2af87de4478d97ddfd749ae88b77fdf1299e2126a899d8bddf25bd67a73c432a3e4c3f6b0b9b83fb55d414dfda2ffac6fe2aac17359b20288a1437fa95274f958058f05bf4a69b93492ccddad67a7552b37f34e7cf7e5b889e97b2e0f980f7336f9fde98123c855ecea40bbc5a93779c7c7be7089a8451fe4b364f341e56499bcef6ef6eb9827d5258c5ff6e746370adf48556bd364fee44f891ea4b4dd5a4983bd471ce63d61b3adce1e97dbed5627c5993c6dfbf40f5f6cb879304ff64184b3639d9be8ba74a1b6674e253f29bd8619aee512a9e9821b867cc84341e3ab43b350a5c79d5af47b4deff8866e89454538d47fd49d8ed953f33679cf8f3cd9812d83eaa9f95004b94425d6dcff34e86f644e749a6963b77760ba491744ccadc7fe23653a3a08a1f7bba316a9c83f4ee3cb59d22edfbe9a4a69c7db6145377289d9f1eb0f92f3e4ad84e99ed72696dbbc97a364447886ed6083aeaa69d04a9694d545835549ca3357cd9d73d07cdbabd7eea0b77ee13ceb370fbcdda48b893b3c86366e9e79f4ca1453ecdaaebe2f34aaf3ccd59de3a3d9b630b564ff38a5a1712c67327c893bd64883b7701636b0587ff3c4868f2195716c3499a4295b0387715c9ca4feb3b1bc08c6e0acee809988e204e5f1bdcce65e5f43c5dc2dcad28e9ac11e6368062c36047dbb7f5655a3a75c2e7aa86ba9b8930e9db25dbc7dc881c5e3b24f4e47816efbfefbce95d9e4cf16da76fa4c34359c635aea11d4dab7b56af2de9e283fba6f3cceb93cb31e08c93f2a9a3394ed677d79f27e5a570e3c0e68386b639e414540cf3be3650ca9388f34b95cf4bce9a9cee8c2adf4356f246dbfcdbd9b47eddd296ee623603edbaf65e734504844b0fd438d163b27c34d52163d736bcb43bda1a77d67a6e84bc8f849531a631fc55046eafb32edb99b938d4f9bf39384bc2ed54e47ee7e9b8f97c3ae6775f77859ba69c759638fea8fc2057b5105952b44d58c3f9ee8bfb08a69b00a6fc31b6ed6a38e890ae6f57daa8c6ad5854eec7e8b2d3cddb935ab5545e3e57ee5f78926be531e5c4593a7afef3e9c5215645905b50cec48962bfb6c27f7b4794ed48fc66d1eb67804b18c4cd000868ee4e3ce4e9790b79ee61b2cac3f9aea4198926098e4aad65880e683fa75ce66335831a7bbcc236dd7ffb8c63560ff1939b2b56b97e87049eb4c6504fe641cdd8fd5841e48bcbd28e5ef0c62da099f5478bb93198ef28d89ec6714b0f142ece80c6a6050d3aa936c25bbed1dbcfc99f39b4805782b +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: c152523abd8248bed40c3827bcf0f8e8127037a55c780695e2c28ea3e041a44c +public_key = 24f5f49d9fdc83a86b66536c8fb3717734d8729447f9ffbd61fc63dc2f4d868b70c8e8ac6685c8e3ccf375049c25f941179f91c39adeb0f3cf027bc8324398fcca99feb47059e87db2cfb7246ffd3f09cb8a19bf7b2b35db65e6a75fb837fb94a6ac6701c479686ac758c381fa34fd8e67b1e7f6b0cb04cee5fcbe2bc5b266dcb55f1c72b1aed39596c4e4f5ddb884e763c35365a3ebb37a3552bb3223938c6a876e552fefa489c503ee4943aacebe7a5e7747bddf5c6e926d95bea36dff8d59cac7adc0dcb10a64bbc39efbbcfbd01f2fcd5448e83f9b324aaf7566098af16782c6c5d3b987a6a5896c1be8fef7d3c5c77b82cc797bd78f849826981187a1530b4fc17e73dda9ccb8d5f48583503a8b974e9beca3abebeae9ab526d87a27dba4e1fad5e555f78ff7c55d5e9226cc6b3246ca23f8db15648ed4394cc038245bb7d9ea48af245df0a7ef83f195bd523d4af6653bd133e2427f9b5b6f495c8c45583cd4d3dbb1c538fa4f86afe799026f86e1efdd250fe3ed67e3a8806cb9eb6cec9c94c4fc4abb2569d9486507137733e78ea5eeb479d8f56cebceef823b34995c65cf43bb0af50a874b743388cb664ed8356d71f075b43a6f0bce761ccfe848963f00553e77f0e54c9343b47ba3f5dbdf5fbefd1bfde45b7e8abec99a4057fea1147fc9317e3a013b0cf4b346ea6cb657fd859d458d1ed8b5e4e6bc86552c7abd87f63539303c6fa96aef18c6a61dc37e1e8436fac43763c9acb9b5955157cbece5d356936cbd6d3f6eca2e2a5316369eb3e2f57d67335ca06dc4223b8c0cb7c54454e3b58e2e586d848fcdbabd9a0d7da9e847e9bb0d7395418c44d86bfeff4c8a8548cee6780a5388e36eb4f5667ac228fc213a577fa2c46178e4ebda8ce8a1c5852ed551d356471b8d51d179de078c9f22e63b0234fd729c9b02c302997c13974b47aec75746d4d8278783bdaea5f184f77047f3b1861b8eec2dfeba290e785d77ccc38edad04ce99322c47529eaaaf87300ea43f6a956b7d03b339be47cd0ae5468bf850a73ba99c6b39d89ec6fa3052a9bfd0f6922f9b37ae6966ca4d37091eaad167f039ba3366dd89017cf1fcb64fe3e9f4f805336d49683fdf62410594f92d5bb264908274f314fc7065cba9b8c4421f1bac52f69ea8f96093f89342b879eeb785756587a50f76811e9d41bb559c758197d360342bc3855f37afedeaec9ed4490b9bcb4ac159fe54b347a49219ca5b5def91dec1f4f7ba521bb33bed610777f07f3c9feba9ee7ce444a42b33ee6ae4710586523cc98aa53de028d1bf383e33ebc03a0d67885d73441ec349cac283ba827fe39f976b3de296e0123f91f623f5b97d38438dc58ac9c48bb65c5d8a672c86b218e8a706d3b87f2341ba5e99956886ee0ab068e9f7deeed9af59ed23e991f4e8619e4aae99053c4db3514d48d1341d5ad60885a9fa5fa81ce44a3949cc8c33b69ec776d5a7a6e9c8d134e7b5ce661c86711907d16e75f0462b63e187daa74f4dbec6b9a1cfcdb8c8945d653e62c790d7857681b479febefc8894640abbd41a044d897c565ce882aeeb8cb04f630f1dafd22f93fbec9d7fff59bf98ec92cc7706ac41626bbe1d17373e57b3a86a3ba62cb6084869b58c65947ec110a3db6c7562675e97174ea899645846f96082cddf6c29bcf8c646210676bf266467e9deb393b64a1593b4579adb0b549e6648da5c9e2eb3bddbc78c4699e2dc674b126acd4448bb40bab46ebc8620288253156d8d39ada1b639c6f69d34e9a25e6b6bf434ebc00b596838fbab963820fac716add1fb4e4dbe2b94a84e58ab43c6a445e9f9a34a716cc07908452e6ada527e38cf56f20243bf2e27ae78835b74ed72032f70097ee36b2a405a34ee58f37f132c588b2ed2a5344b7056e96679d0c73990c2145497565d09e984f2689e315ab204c59a360534a75ef28768a9f168e532ea9d7717b8d80691596d5509af4ad1d7efee5760605bc2d619b177985ce89cbae0ea5ea335529b3df25cf83744e8d7b886ccd5cbcbb8393d5cfe44497a4c455afac7589b5315937345cc0247ffdf2ebec81cdac9aefd28b3348effa88c35b7f384809f2466570d58364df26c5da643afe7cb3ee946ea66451c9092e7c42c3d9a922465561b307f99e2f2aaeee687b1d96d8c201bdd75a34e09d954a4267f21490c0eb74ae98fad1b5a3b5d2b9f70e9 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: ad6466dd59f26b762fb02b19eedf5f79964da68bce0459b91c3a6ee5a7e01183 +public_key = 693de6651eabe7eae944fb933fcdd9de46ba61ef496657f2776b37ccf770b197f69dbf40004aaf74c37eb027c62536ae847b8ec48a6b2a9ac68307802db576b81ff6fa1b951da9cfe094a0bf5bdb306c5e030baaa25baa592bf8a0af4148c7ca17ae9e0b0d39eda555645bb65685a75a67d28cbf9456e4c16ab48c06d346baa9f5dc4e84adf635e779522c2670dc5bc1ac86c662eb37975aa807afb2e307904f6c6a0d094828baec0799ecf0a8f23ea78967e7af711f73a9ae859adccac61bcd0d1d3f3c13aca18689397bab1ddcbdee2ab113ec6932c68622d5e3b0d66c60244cd77441c7aa964b5331ed1ea088b5d34e064a1d95b4b389c15d5e426fc9a13546441698e8596eefc894bc2a4bdb742366dbdad62f2c3eec28bc3c38c809eaab081c5dca65bfce27e057ab8467eaab50987732b9c85bdcaee647342c3660950b9ca8cdbdfb3bab69268fc8486397b540f093eefb96eac11855dea4a588c4935847a644a470f055a92326ff1dccfb6aadf0880cb08c8d621de33a9f0aa840afb5541aa2d04eb98214a5ffee478576ea646d3f05afe63b47829d7ea7b0bdb5efe94e8f2f5ea3dde79539772b6eda5ab5456be4670a076ee2bf5ff62687aa6f84166576e3e773aeffc061258bf3df8b1cbddfd485b8161d76eac5be6ab7ccd823e2a9ca938f256b6fbc8ab6d3c3a1da5c76ee806c5c4cd53dfc0c2d816e368bb2443684463ed43787a99f36fed3ffc99891166462852750a9ce445ad4d7924470a57becc75c7a379afe41dddfb36cdd4f65bd12f49911fb923bfceb635baca94f8ec8de3b36079732838459c669f8fdc2638e717ad45eeca7f011c66d64af98b95566b0feebaac79a67dbadc98f815e0e4549dcf94b658a8d0da2423cdd23f6a0be9bca232c8374f6e6e749623e8a99b0f96a08c95897e8890095e077beb47083fec256fbc9c943255bc475da70b45be34e0cafe8f3cef42972cc175e04fbbcbdf4cd151639156ad46975e408d9f92de9383e63c08c8bcd96a69a3ebaad9b3ce940a37f6d3fb1d3c7d2d28acb908cb2c7b88b89a7ad4c87cfa6c53987e4721d33d2bfb53ef3e9bf7329f19926bb7894e120efc4a9aa4c4c2cdf8be3bda99dc0342b56f826a6ea7ec340add40839fc592dc92b66bc853fcf735388ddc35eb004506d8a671547b7f32474206d9e222ea0592644e8edcffcf7f80f77c34d05b930b96ec9c79838da4a7878dda4bd7c1495d81d14b9d98dbf3ed6ed863ee4d738580918c72a37dd7034412305ba10d6a5629a93174761155460305f9f32356d9e0331df2f32e65c695bfeb597cc816e1deddca540a0fa3ae683e3853b6a476d6c1bd3b32d193bddffcdfc3cef900672436555073fbae19bb3d618d4d0d8df1778eee12dc6cf3cb7c1aaf2b1d4acaa8abb4003d9ec2cc6626e64e106a0708ddbc72f66cce4dd4b4e4dfd8e8ef3ea39550f47c0853309d45fb99b84fc3ba115cf40916ae9e96b742a234ca2fde83f6dc8acb65ed2c8a7d239b408c33fc5f3eae83caaad17c24ba9f38b2a521825e7a23dfc88ae7f22bca93e758ed95a895a6a97c163cba8a4c0d0b980e997efa8f595a668adf927c4538374c7e65fd16fe96a64cbaa23969a2cd7145352b78f9aa9e93993c640e006fc5ccdf28ee374016e9eab4374350f6df078bef56ff6794ebcb72844e836ac96df5439567a76f69a3b2c6cfc1c4525f340b40c558007b4f76864e8367cba7c71eeffaa9ec56f2506d7cdd66ceedd93755eb9552fa50acef553a8cebe7b95bd97b45564c98e2da9ce8c51add836d9dddaf538b0d15f8507bc3924a731ac05a689ae680e15db770c3a8f49c654138bde367f4269abdd5fe5175799a72efbbc186b23745fb0cc3f2bcbb6ba1670b1834e9afedb30ef5003243284c59ee53dfee28a6ec2086510697240e6d961398c77b3b047af3a55b89151673e1ad8a9de959923974c5419d2716c973eb4d2b3576f5b664da3bed4812a6101996980d68baedc34f9856effb6c457c8332487349ea3b8bc67acb7fc509d2fa476c331af75374c57b4c11d675d59dda92c7c60ac69d8aaf5e0d67351aa5c9e9880bc1386b88de9436abf526b319ce44cc759b009b93f8b9c3059bc7c63ab483a749e1a86ee90587f13945674e85b7c896281de5d2e2dbcea11db480755602348b4616400faeed3c143406ea9c1307e37e2642ee73c442a +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 1a4d5dff5847cfb48333e33bb00ca7301b144aa89dcd412ff5a3b1081d775b7f +public_key = 60045ceea77d8303982ab9b039dc4c40ede59d46c89f6e8304fb5d4cc53e9776e38fbcb061b56ddbe6ee33873a953590f628c123dd49d08ff737b54d453dc31244f189b59365ee4fdf8cb1edc540c3a6e2f9efbf898edc274f5c09dc7affa63f520ad2db7794aa3cfabca69145e89c06e4d189fa704dfc4b2538e1b949e18f1b9929ddb0b6767a168580506dfa19254ff89a45d9539c9f9688360e3b69a362f634b269c9e1c53f752067304addde0fc437449cf849089918ec93c2faf70cdd699c85898d0e48f5bed95039a216b5e143183f4d695aa456c32e8a35d45e41522d725ef9950114d9e1176806da6b6e08ccfc3d93914c87c107cd15feef937a9f138b928ea5580494c6eb643ae33b5600f7726f3dd4f52cc39bbf4d0cc9c3f9e57a0c9fefdfe8404e6532bcfde609b6edef2b4f453aefbff381692975e16ef1e243dc799d55e5a4ad696678bbfbea8e3f47d2257ba246a2ef966c305a8f4fac73a60cd9f71ca500aa9d00a6fcaab7a2780cb94d2d9b1cd4315103f58dd344bc9898b788d951bed211d73aa0caf0d8abd1b376f3ed8aae48845e1d7372f12b9a692b3d535f63e0befb404eff91b5802d3b3380e58be6b9fa70e77cd6134103496dc3f9f370fe7cb0ebb04a1783379baa0a3c54cf1c5eb1b4afcd9a7042d5dd6405b1b71da9429aafe61a5423055af906ee3617be60bb59ef9de9e83ef306a6e4e738a46703af5cff5d31ac4f1357832c1f32cbb9325f6ffe7967ea1e2f6397f4d7e5bd8b4418fe71e984e463747a33dbed934127e892fcaf9b88857606983a60b9425018e17dee7d20d8fb628ee65ea4d530254f2b0cb4e6cf35dce373fe1450ee6457da59c332be7f8d4b5e0bbbf5aac789c04acffb957724783d00edf4eec3375f97ad838ac0c36e789cd3afcd68b2d54cdc9bf944f094bf0875c0f09ce61d46e8c774304bbf5563a8e974dafe13b5bbde3edec10ba39c64635dadf5ba7edb624cff12a768e13e63d763e5c7097782b69c44b3a0c33a552228c6001c5ce194346b8d824627b975dfc64fba994d2c62f8babac47c51dd2ddc54789f737c61b9b3420469b11e2eddaeade0c6c67ead33f9d3b4c665ac52814ebfd028612d6d8f87f3ab74b6b68309317e2cdee576ff8dca46c36d39e2dcb1fe8c42d00dd67d4bb3e4ab3bce13c142e589593cd851fee7cacbfcac8843156ea5e6743696ed96099a824affff4033c15f9f66cc0da9a47ed3ac473123e95d374bddc92cbdf7bfb174bd7a387e456d283c758ab9649eee5168694ddfde64e8a678ed5e3915c4d93c8531b75d430b3709753f89abec45434be196a3fbf5e49deafac1aefafad6e9b4a45f3eff62f7e6e7322a9e832ea79f33e9e6ac59034c80b42e49544e9a192bde4a35f47bfaa0de0ad11d65f9b1cbb9e63ac03768404645bb8ac7ce25687be70796bd05e7b86d39f7b689ce6c3f56aad4c52875ecdc9fbc97447f0e60e75a89215aa26319ee7cb5534a97660cc8515ee6ed9c6f4951cd89d9aa647f787a8ed7c89216694a83c56dff78fa94340d89d015c9e4d09ba91f1dac5b7ba9589fbfe779966eccd7ac79e6fe1aa4bce56cba05d75643e9c5a4c4344344b58ff26f59b7fbe7982c08afe9b6da80c446b8b341ebdff0fa8a664b7bea0d07f784b67bf213fd75f5aafff7cc724acf401d51ec3cc4ce8768fa9ab51fa6df3293a1fd5f768667dda354d4b578e9672587990af7f32e79e29ff1f4babc2b7c46601ab7cedaea356df7d44783e7d6c5126e5b108c4197ccdd9ee49c927fe074b9d7ab39fd4575abad75a1a01dc2a493af912f52bba57348dc33fdab321777842978db4f45fb52445eb77fe01eeffdde3eef314577cb23bc47d7e76a4fc5ccad72997cd48408a5dd795907cbfe2f49acd0e75a93cc4f7948e36d8cf6da0691c08733e8138caed6c8cc1e6b900869f9fba9f68f3b216f6980ea86e6f487af758830c787bb1bbd8efdf4be9765dd04b969ecf158a3e2e709cd688dc9a38a8207fbbe750ff1c3c33e2b1f7588b64e327d999d3a77c8f67eec947cb69649dc74d10b4ee9c913de20dd530cf5c3b73b631917719d0983ad1ad6d2963741289a282a717d7487acc3d354fc74b005ba022dea1c8b52c23da00339bff4f480a4e890030a709b38d82d3c501b2aa2d14fbef9e429f8cfb50e84c327ba02edb7f6abdde459896eac77b5d8c7d7cabe +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 34f44ec2092eeaf686f2ea170591a98527cbb03a4fa9477a7aef6b41a54feeb2 +public_key = 944633d5f98af3845ca7c37f1be75a535edda6dfbf9e2df305eace0a0d9e6fbfeb6c543a2513f61259fb58247f140ded6ecbf7fd469dcfc83aca3d71d3368fa128a4c71475ac28e7a9be744caaf085e54ebb8455bfcf86def5dcbce87ebb0bafc32341e877aba7a5ac10dc99b65687aa53cdf2585977ad6bef586e8993953d5a3cfad8a7593349f9d3e010e6bece3fcf6ed7df4ef88b1ab955a5d6aac2a877333e81669afc7327f6236c4c1f77768fdd6a7358744d9ec6910f9c4c74760328987413ffe683dd9649f806fedb7b5da6b849985083caf8d64c20cf577486e3b9e6c85e455ace3755cb9d34099e62d96346e4fdcdde0a81f6a7727babab5f24d1dc1832bc175e3576b36757e01ccac306df8ac5386ea92447f483408aea6ab23ce027b99b9f14a1b6a67a24fccfd505f395ece1995b9503d76c7d0ba51abac76777b960c45ce8dcc24f06d41da9a99174be42a381654b5c9697b13188a38c278d9408d2a2b94685acb0945d74c16f72e0ba87b72e4f718cd1da5d8d77535e444b5a2b56ed02acb855d7309b8ac6b783ebab76f6931e60e1a35d0cfe4deec9f2d87dbe073e98d5b7fde086f16bb366a0889773bbcdef5872934a894c7664f568ac7f1cb5bd7f587777d25a37edb14adce44697aa5cddbb8da731cdc1c2146b36b5dd249f6df62dab356db18687921de988c2a7c97dabacc5aa849068ad770edc361b9a2d1436bd88c962ec724ece5a6583ca8b4e704f3946da465042c8d8f35e3b65b5d09da5b4412530824f478ae8fac64940165cf4a599c96eb69ee5e4bef1e45067efcab719b57fbcc03c1985472cad17af699e4939b3ef850c2bf4e8049a4146fb2c9d8e53efa9f88d8d06b6f98e059bbe1c5a87a8610a06af036fbc6149df90d962ec95bcc907c8518fe778a947678af26c0482b67d4e7f0e76f2ef8e2725dad94d93ae96f682b4a74e8a7d330c4c4e144c3a39c3a3da3c75873dbaca4881cf940cf3ded10c395805c0bc043cd296eb2eacdda1b59474f8c4930f4cecdc7676d4b8c4b33110a6f70d39d57d05cba6494b6bad7379b73bdfac9a561a8ffdd3a43c5877d85749db9c8379abb29f7567fa1cc57b09c35e7b6ff3f735cc18473049ba2d5837ede8e7663eb67e04a509ba811a9467c633b962e8392d065a038656599e3f4955d1feacda6a649dc803f66c6f74cc6f35b0dbf7823f676e0f8a25ed7595f56c4727a7b11830c1c9840d1dfdb53b6198444e5b63be4c46be9548bf4e1598ea6371686c63da774270c8fc96fdc9a12b5c8f9a591ed5d971d897b4cec4e18deda6ef6be286dac99b48125eabd3bfdba343bf46eca8699487d14a9667565ca4f3deae468ac5e6cae54b4adcd5acd758e2ebc3b4077df1b0cc890099b911553b95c794643a97f99a512ce874f10a3c250a513d0d5a716d5429f594370dcfb9e4b2c5f7fc831e49dacfc554c43d9bebf71806ae8b5850667ec06134db6e79674175423347731794f4d57ef2c83efe0ba7b5bf4388e8f4a3f60cae008ffc1e3773ff5eb357584a917bc3e4fb950c54fae17abeffe262a4a6550576b6e8297ba723943ae3bf60a7eb9b86cf952c806fecbe937c7b15d9ec9e438ebee95e52efd9e71ed5bc43be355e67ad9f492bba954a8d7362ad6f525380f6fe9f7d1bb926dbec2fb7f6cf47e174caad5044d37d07ae303d5f4bb5ff9415b0c624398b936333d68625f533d7eaf0d635d7768a73f579ae72cfe9405fa214c3d921ece21b6c94042b38705fa202794bab835a949eccbdbab2ddd94b3b04acf72ae2de67cd25dea85e7330dd36bbb6b387acb6bad3a59c1d39ffc24aa6045c8c34ea4771c8e37537b644997eb45bc2ef3ae165c3d8d3d9f6a1df3d09e749a24f493a99ab1c3a80a87c3003a9d9577f9ec1c6c60a47a16f495813cb75c995aeaa58e87593df1f9d6fd6eb993a8b3365189d1c5d627476e6155ea21ee45397a7ed8f56634e9dcd0e136c9e8f729f8a76c71f98a2af40f71e824173abfc5fac1aa4bed85b4b18939988895075e888ac0c519ec75ebf693d3903560445414ed3bb3d36f074a8e524e361efe44946be4daccc62e2c335ed4dbb4453cae35f422967eeceb64a260f6b3e1ca24adef7aadcd8cdf4f03ebbcb6fc4f7389d97fe3ffb4e24cb9cd47381c6b780553dd196bfc6c356f031eeed6c85b57be19afc39dd1f929bbb2d627f5f19db +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 6250c81126572eec2da330271db36ee591f060fc7e53eeefe2e1c476c675fa33 +public_key = 6d4bd96a7383934cdcb76e5824885499f79dc06b5e885fd3c3349b2c4bf7b20ed22f5fbce9968497cd68b6e6c72457f2622aea44349314845b1d8831da9feeca386eb80cf64587be5dd5f9438485b3fac44bfd61383f509d0ff6f6def7a4056cd5f5d3eb84fcf13e54511969e7a7438357d8d71579e9ca4a4e38eaeb177ef50cb0dc8f6ddd17873e63a182e3b001f659ea3cc73cfaa5d7d7b5e7e9cdabed4c9944978dfb7ed44f48d986e90cecd184a3de25c630642fe80a0b8758395d1febae96cffe0945c5fe265595a9ae926e6cf9f35b588b7a02f66d8d49800d6dd17d7f72bbebcffc1da16a5c856023dd960bdd242af86ba949620ab83539b83d96fdddef507ec4b4bc4330c285e7172b43befd9a5e6a5fb694e6690d372663544859acbe07424705809587a08dd5dfafabc1b2f9486ca6415266c502f7b998dcc947c7b5f5584cd34cc90a4c38603da2cc15e237c6a85d4a55723d5a528fc970b9bc87268485ff93464545f4c349e9bfba3e5b4a5e7c42238cde6e1b7723bd4e3e0fa27d0597d7169a49e340a788e79b9f4a1e3ec0c3d53bedb46868b6fae17847f23dad1478b8429bd9fe7eb029fe933803318af781047f3ae8fee8590e872f84775396ffa07f323fa8dd6ba9744cb6c07944eb02443b52e4becca891fffbc6084ab40cde7af7c6b2b22cd9c27d455d5fc4c7093c44aabbb2adc1d12be2070894f764911203fb98d976c82f91100a3bb4948f928771b063839a94a6152f7588dea9bd25479bd8bd07fee4894bca118e4f0d5e6e1bf4eb81ccc6044a8f3654679df531c83fd98286daa39a4e982ba3248bd09e4d5c0c5d969c694858889b4068d8973ec57edec5ff1facd6bf7144dd9a2e9dc8abd8930d16769aa44a3927967b2975a329bce9599bfb27de02a7994fc9de0b1c7bc7db753c065cac08f1b80c6c1d585624c93ff15af6aff6f45ad8a6b3cd82ec97edd10be1c3acca1898520647b8ef9cde4568dc8707e9ebfe8ed4e97ea25e6acca657bd0ae74a4ee5e6d9deb998cd31e6ca0a5d66bc85d57b2b71ac2a75711a7820984aea3d6deb8f5c81ff6a1ca6c686189c9365dd932aef73fc3ed044eea703c033bb463d6f60097c54bd17996b8fabb0e3f010cc53d81b7b715fb86abb6302b57d6a34895d09840b3b6a50c9962ecf48edfcb328e94460d3c82819cbab49a79f84fa86e85577ec995b0f5fdf6e6fae5fc4f19fbd89286297d8a8922f94faf7c959ca392ce4d989d9fb8229ad3ed9ed352a6bb7d757d47d9c591db40157cc10fdd6bfe843419b8a1d89fd01ce505e0a63b39c7c2dafc96f695426073ebe6df8367fbace67c01bb7b27b09be59e589be6dacca376a874dd34cf87e9d49411648a1b05c329a09fdb29942cb2369381c3ef86ea02f8c905f963f0b08514a8ce302b4bacaff61fa37855b77f50258c003e5bc9bdd7035e667bcd6a537f35a0756bb290ea0aca56576e7ff3a9cdc2f47ee5bad36af3a987bb550ac06980bea73b938ce927e5a4b19620a08be52695abcb3c833eca2824b60de483810857aba0a9293aeec4177e59c0f398add61bb8ec94df979917c72c8eaae518ab0e46ab8927b5b9db690bac6720667baf81ea73a5fb033abaa59d5c4ccf676017d44e27cfbb31b5aa2095f2da972467dcb04174e9bce74217ce390a687c60b6c396aa48ef849d29f34f36886206bdb2835de7803502565523d0cc0bffb78efe64dc758cf3c93bef53ed3694b434c58e9f82bbc42ab45ae8f7287a560ee43600b87443d8bc91ac5b15fbbf702fd5577d3f679ed67918d8d4a6965c31ad915ac8fc7a5db274c428a43650003beee37f6be3ea09eee4e892b54c36d5269b8c22f146afe669dc9c4775e3ddaa9534af67efea736b01543788b13c3fbb6d8af9daac0da9335e6c115fbb1d67938b86849d5087a87f3437faf9d7b899144fc3e739a4c07a6f8597c618b554468f56cc6745ff76ddd3118c55b8e71e42b67ca43ca32135673cff286f78d0485b363d63a2ec737d2aa98af7dfd3c485815dfc195db5d7bea8b3ae5470ff7a1e92f5f82d565414c6b59379cc6bf6155f682f6098795d5fe3e8acfed87743737c1bfedba875a95ea5d9d89f3667d84ecb3aaa989378a2425a0e60fe9c02763de4345a208c5bbe4949b5d6dcd6bd1c5f8f4ec5f5bae6946c95ad7fa4e1e5f80354b5112d882796092029150d5d621 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 35d470bcc5880872754810dfb3f2796da2fd7f397537146f6488c27804072b34 +public_key = ce2fca9cea98bce4d1164c349b35c8b374f4f294b11ec7c7d0a3953ffcf0dcbf83ef99a3452496d9b86513e33633765c10b45c671fbfcf69df6036a711eb3debedd067649eeede44927e6caee4da3ebf6d7c0dc6e8396858c39163a7e66d24370b033ee54c3d3b85b5383bef402ff0325aa2f804bba473cc71be5d4435484924e6bc1698a5a9c39dfafba69e71f35569ed6946622ceb3647598becbcbbd7fa088ec77baa5ba128b1b7053b2de9c122b8790125c50f0d3a119964aa48392a96b01d7675af64eb46b4369c1dc38a2c68ee64f5c506fa3d2f55a19a7cc36d7774d342af773a22c3943a9b411bd69a93eec756993a1a49f698a93d5f4772c374b54ace5a0bd636bf9d8641a7b8ed758e3c44e292598b82a7976f45ae50bdbc2bfd352e9f751a6a5e5015444d3b82cffd64d32c3befabf29267e09246de1806b5e5a892597df9ac5feed247af004e8f7fbc9b5cab930a6896b135dab1c58ac433efd7ddbd9ba9db65adf8e5cf8e445d93b36462e28940fd37f3e7ccf0e5a9e4e1d8e2bb3aa9133e8f1557fa64b75c12ba361b28437526e1183870a70f8496195cd6efe9698a89dbdbfc1c06ab2bd5937c1cb5a2da7774bc3facfaa0298f9f3c3c9bd6c584eec882ccf3ae1c0db1357692ed377f0a8efa30fbc73f17c0bc56fa88e64de36fc24e7a7f7c784dbc5b615ad57e58484db23363433a46811f6c2eb5b9153ce62f3f77c0bc4da9693b22daac52aec6117f42b84f8ac40ff02c3968810435f9aabf3c65b7db7b37372fe8b49b9c76695b53c9a227963ccc1b60d447b3b8de5765bab6b3b73586ff6c2f0862c927b6f246f4f46da4f6c537b09563adf7a9616a4dba03732d7d7fed845c35c660b63e7ef76fd55843cbc28ac501dcb493eb5d6bd5c322faff2a8b61418b978858ff51c8e35f5cef1173895057ad3218387e5f713399dfa3a9425d73ce04ee879b85a5b23df85c8f3501487d5c555ed2b7bfad8f762c9f62d3d4b3b64736497899a76890385dbff4b8fe6b0d97f4cf30dba5bcb0ac95006852c06d480d039d1fca9fb758b5562a38426dacd9c489a3b4bdbcd96989c57eb7b4e1ea3540ada882aa567fbb44db51847783a9f5577c780953bafd0cbe2803626b89cf1c3b3056c4bd78c888193eefc836765ff8e3c8be8e5dc9725978ccd9ea8c7e27e0ddeb883ad93e2cc987024b817d3d908bbeba7a658399dc931a4ba4fca5a103a8f89ea7e8e906336b148c329cf930b843cd4ca0d4735b6346e8e9cec328bf9597cf4bab05386774788333ef120d5ed6987679544b51c45d42dcf09c7d61a92adc82b9fc943c85c149b79c2ae90716c03f156d3d2fad27e7b8b87962c8c5421d4bd1c7fbf22055fb22e8e3d228de7a38be15b6976aec765adf5b60d3c780fa75c3654d7f9b6de0d33c8c28c97b6b95bc9cfcb517b497f73a98d4ea6403e3fff48fcda7b07e86a8137cd5720a8740d866bd0f4ca2fffd43f6470c8a38a84deb3ce74585e6ab8b899b13ea39c163ae79e764e0b846fcd57029a7370819ef064fe2c6f93f1173a855bf6d7e49bfae48d46e53e93b98460d27efb58f83e736c7a175edeef6f72387cf65ac876feb4292bbbc930d981299c9c0fe3690d6c2017bbd3e257701bee1fefa33072ccc8ea5f263e486769dc79b558187e3441aa3d964aa3ec054ee91e7ad198cb6e8959a3515eddda7fa44bdf0d0f968eaa8696b9686dbcdeb9f9b80966ffa7c5eed486444b16ac4fee7b24505dca2af6d81457b802bba966ac8ec4ddcd92773ca26908b9ea2e24bf1b11e6dfcaaa5f4a57514ecfad736cc7899d4c39d50389b80ca0bde72be31b567551f7afe1649dc55234e5ae5d080ea6268047618b333a49795b4233bd07530a8acf75bdabc4ec99d84b8e2daffde2c37d721a6e38386ba42cc49993e4906ed70ecab69f3eefaa204a32bdf8658da3fab79f2362eb8156e312cf88700a490789e4af4cf8a2f544d619fd9e24cccfeb46ae13bb90e8b86a4bc85d504eb9ada7a957ca8763acad77e3623fcf0e3fe99b137d96653fbf2b8cacec65776d8a63a57ecb4a7c892bdebc92c8c297e9c3ff9a8a7a350d945472adfce932982e94bbf31bf98b3353ca6c459ef6de7fcc7f4ff53da9348b9fb46abc86374b245668ad7e0976dea7f43e3823c5749e01d0e40444111bebc0a6858891224b08cfc8e74c41084fd5c03c102480537 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 8d667921c5db401a86fe1c35dfcf164a6bb2ab7400fd6a0b67eafd4a0ed11940 +public_key = 18aec1ca6b5b6bdabfebac339a6ce218afd56d5d8ff99588d39fcbcc1760f1eccbf115f81116a623d6d0e87b4232cfa94699e33dae6b6d9979680db91736ff4d776d117d9a271f3a5af9af5ac745598fcaa5eff0447f71aa5c9e30877a3dbf63f9048a483a826774c806a4e939c44274287b62abfbcba56f19e7aab2b8c6a307fcbdf5820c774c49ae51c48ea5a76cf7337c60c406cc1ae36a3efbf5d925f1918a780d75a69f94aa4005771a6cf2ed4466811834fcbf38e645efb055a70d3f99455ff97f273752db6f03f445805cdcdb48df838c484d6df50cbfc849f3d8d806d9eda4f442e85bae7cadf4c6c3a49cc1cd1d7ff42e54e61a99e01f44f8f956c678ac429faba83b5486ff84f26edb817cf6d179f2412738db9796d07df3e558741c7ca293eb35fde7ef9175b838377f003e50d447a35f2d802798e406446061686621fab300755a16afebeadf4b721a50976884c76ba9294d5ea9e6b7b357baa68674c05eff66f54a455cd3fc2a64b2dee42bc56cc535911efa578c6ad97d93d1836cc642ed78be0ef55e5359a0d7ce3a97d12d199880a3ab5e6e753488782b9734c26947b6d9f5e4fa6ca38475905a9f45a88221db62b86fb4c884344cfc7d81e55fa44f93dbf49e4e8bce0bb95408c3fbed4d4a246ce5314fa3ebcbbd8598a3f9537e1403319a5cc6a006a37db5a3fc4960ddc5381a2bdb85657d42dd85309b47caffea074e700a24e50a0b3e018f3e76c6bad867c6f3e6568eb840b9a9c4f4f45d35e733ae56377bacfe008b66f9436b5a4fdf3107aa43ece23ccfa89637637dd3a26bbdabf355c0fef6426335f3612ae96e34d2ac16c3866fa0f8c65b6a0485dfee492def494c7f30422abb2e7d5333d4c3f5fedb28d3c4b3266949ca4b9516fe3e7ddcaacc77665f36192fd8c0dc4487063ccd5f896176edc0e474bdd88facfbfec448c1ea8a6f152d6a33195e30fa4efd463b7f438ecf4ace6619dbc268b533bf51d783bb380380e12a79ac044bd73cdd9488d18d98b6e4e36f244e42347b91970e521365665fdd5111f39698c43f5c6fc048feba861a91a2ef9f6cfeb8ba376280db89feda41195a9565de7c73f4305d73cc6b6d653017902aee92352a5aa9e58f4df6c0c9d8846da451829fbc360544f734340cabd72cf3998079d6794d73f72fac18c766de49a65df56b6ff99a6e896245c7aa5585723d1c6982adad30cd9115b8b8321941961959a8f4db38cf4a671f58112f3dcfbaa0946edbf0b9c631e65021d64bae6bbe847c75778f6506f73494de9da8d47f07898d179697afcda1df3cad227cbc83c33c6c7fb45083ed953d41f89e36d34c7f039558468c3de1f3d21f5d9a2d898ec1245fa9a966ba457e589469189952146fb7f2e6d7579bd1f33d365a84c7ae1ba12ba53c1f2e6933a34e53e75e252c52087c615fd5ad705743495be0043bd33468af0026f74df94f2e75d48e9a4595a4b542bd82bcd96e6e9da44af778088dd7c069ac9673cb4a559821afa9992c4500da89f5acc48a6bc9ac29f2beacf11f36c468986d0714e21193ad5e2732d693c650d867234c9c2625f5335e57fdf94d89fbfda1949a627338c1dd7b1cb9cb45d95b64b38a23cdf9bcb87c928c7c97984d760bb11b9666271aa914d3cbefe7f3d419f8ede94af185e6ef7a72c1fa978594e11f9bd903c544dd7c81d94a3b860fcc09cfecd89c8fafb94d9eb57f916ea51e9aa6f396dca3ead18dfce4d46981062b8ffd64f747e7c83c08e699aee7ac14ba1654be4b9fb397cdefab274a0836d9ed9c68601f5fdc56e1cc9cd0167a8be6ff8f0867397eae86ae68a2980eb4c1885235faa006d45d30b990d13c479fa5b1b76ca2406a46a0d4ff9c63cccede87f5e93b170fdcb86b5252cdd843df8e58c86dbcb4ead708a62c28846d0c983de6ddc4f5b0190e7fb1276eaf839a2898a8caec69f21d37498c5a622cd5cdc5bfc9ac9dde35da7c5ce531c8e3b3f84e70a43baa43950a9cacf07c9dc6c8b8c4a660aee6ca67159a011eda3414c87fd94ad197856d9940ddb47ad0d8700f635e594d8a5a08f23fe4636fcc594ee677b40fd6e365f202ca8088aff403df4ac4f42fdf5c99ba1356f14cbff2a7e92b4db48abb531a1fb8f853a07cdf41b19aa1effa784e5746905449b1e7436a79a28e3f712507e5bc0d026037001723d3443145bd066cebaaa3d000c9f0ca +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: ec750b3939385a3f8df868119dc76f77ca845567ef068de6ada5478a56bc78b6 +public_key = 9eb3fa4a4e824846f7859e69e30d6e9306448035f29fdfc14f08f6a43976935a8a14b8448d6c4db74fa17278f3a2053f4f75951c8db47056bdaf6eab695dfd4aea6ead635f237fd82e7ec4ff5c78e6a6345b7f505e33d64dd773118ac985e49e4d88c64dd894323bdd2b8eff0cccbb506436c4fdbed765ad0b193ea62d580be4c12cd65f2406cbe1fc9281d37bed1988d7488f3935f44454b82a8fc49fc5f2a2f83a7d23ed1cc65cfd7e79f9ad43da88e959b8e5b5e45f6e0b37269c842384f4fcabbf4ece6a722cb171984e48864ef71cdfe14c69ee385f15eb7191249bbe3a3888d5dfcde9302ac5aac71d5503589b3748938eab5614e6f6c6b3d1599b623ada44f53fbb18e359c8cff3414a349457864696f8c6579f9c0d4185cb7591ffff94e83de26c6a9b6970307d4041da3ffbc8ce60cf367a3a97c4b997bb06a01b8964a8534e307e3c28aaddc9cd72dfe4a4303d5785a99c0dc898d41d4e0dcc62c0f6d0254cf18f15e1fcd94bf78497b04ad8efea8bf70cdf45d3545effc6d708435414bc00e64c76b5f3bc0ac823fb56da247da4643fd9063749bf3128c6ce4316bdcad4bafbca77b8ea6c10e54ad063a14333332533e1f68c676ebac53aca8fd70b9405cecf3c979ca0c492199aff92294ee5ab4a2fde51010fdf5eb948916ca7bac7b28fdc904bbe911a0ceaa454af45e6a265b7f6350f91bad8dcee679e00acd2254a6c624df27464b2fcffa9576ebed8b348ae9c759fa53a4c4f9c0b536fd6bc85d5c9623309dda3057839a47b068855283487c90a8089ef71a3e33f5ae5695d044c4d14ae854dbf03c3e854a6d0e39cb9d9d58ea3dfa5e4dd8a11484801c8e67d4c5afd2dc56bf970a34df31da8372ebbdf5266686b4a3da0ccc6b57cc81baf905324fcf0f35cf0c83282893c25983ca076d6cf255cc1c4eadd5947ffa3f2a5cf3bee47cc49656a868eab5a99a3797798ea77a1db18c39acc97e644fb887d55031f718856398878900d6cc9a5963a7153fe5678a12ce86258bdb32ee751eb28efff62ad98443f7d79cc4f85bbc77e90a695d4a24a3166c588ac7b40fed53318b8b453dea738e59a2d8f442ffbd13fabf429b6c60307e719f3861193f7ebfdc13eb3dfd73df22bfd64c61aa8da9ded5329fc61575e3448b265ea9987bcc84cb8f5943a4d51a9cbb5e76e4fe88cb6e9f21506dc0a4ec46b89a746cc96c74cba7b097bfdff7533a46fce9f8f49d670f95e79e6b598ec595cf39c3554eb5f93ab9707d4a559069d24b4d05dff8bfebbdbeae8d363ac608975e41e35fde61d562ccb5fdf94c30ebef47ddc4c80554d879b62d0b49eb4cfeebbeeda50794545577be4eab070e3d365dc9c34eaad1163b252cff3e8ba45dcb77dcbbbda07fa635d8b841179a3553d4e0d249dde33e9d85cb724245877a549cce8f30fac8721e8fe8b2e82e5cb63285ca8a1dd49cd7e60d81e6d5c2cd127a9ae5fd8d8eee88e340a57a80964b21a353b08bd35eaddc1e7d20d6cbe43f4954768654649ed94b9a2b2d63b23fb2fb8d3df7ac371b3b8daae0470d93b610cae681bfebe297ea49419a2371d843bf940804483dfadad8e6d9500d8aa2426cbf0ca5aa353668b7e51bb54c7c4e4ae3354c598cbac6f9d949cf6b79aa4ec541c65245e30709ed494ecdae743cedba7904d34c2e0c3fb6046d6e43e56bc85dbbc4773142e9a98ee84d695c702cfd09aab88077d9b8d376b9cb6a24f3b6d0b4e57398c740d08809328aed069a52fe77cd68b9dad6fcebe3649cd2be39fa84f6a2333ac8dfa314e442505df25f4ebfeaafe277869e18cd3576ff37889c37e3c86cdf4ec7585776d14682f4cd30aad9c1ed43609b5b82e03508869a7f6c6f7c48edc58198ebfaed0f433ac0e0ffe03934c1ebae0aa98b88c879fef6d596a3ab29739b613ab741ad4518e6ba5edfce90678b20e6544f469791c64629657b9b1d5eeff26e6e2aaeb3ccf5a55cc9c481995bbe68abbc383ddddfe4d9fd8ccfb57e15fae870e7dfebcbd216581025e538e7a9af3a4c5365cd22094f8d2b988919f3b7bc9fd67af907b5376906a61115c979d4b34670a9134add8bb466928c3de807cbecc3d7bedeff8657bae78f5869c3463d1b73e09aa7f6274c7fd2a3a9cdb4160da310254462eba30dcdbb5c30542463266d790d0fd79c3c76f5da348753312e4949ff2955212edc46dfcf9e6c37a +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 74f1d52af09b12c36eb062ea7528550cb4c18a3ce8e4f4ea9fac43ae383bc925 +public_key = a2fd55f88cc36246d16d58d9e5e9d9686f571c1586392479797fcdd773709187f0776b8ea9c7f18aff37e9e7e0da79d6ae25331b9c82ca0ca257dc980ccaa23ef6ece1e681ae09aecf967c345d5f83078bda23fd1ae6f3383f52b83ed9f6e6b8f558edbe89b6033558b90a70d3866930a3c78f0f4b2696d4c8b3beca583b8b63ea4a7cd9469ebf184ed7025ba079d3d62b6d7e3064730898708444e92563e076cad4e03c8dcbf551b56885c383a5929a54c207b39e26f348f7a7fb375f38896e7c1c6641b56557f52f4eaf332035faeb48f082b8560cdb83c356e4c40b8e4dc4ce54b4c009d9c3cd6884c11c61662dae0e3fde2ddd3a879e47ffa894d6cdfc760d7bb09b51c8f59a53eac1af2ad1966f3217b578bf4c3bf59459fe3c9ca7b677155436346e76a99653fe677d0d9bcb267bfe5484a72bf8a86f2bf50b5666e50d83bd24cf578c4f9386bce3fd34d2e9347835632a1ab39726c2f467a864f5863c0b4985aee1132ebb2e83386db5ec764b8598efb504bfeeeedaa6350683ab8f65a0af76d9b8ad3875a019ea6a00c3e193d9f8493fc581555d7c478f82ef59150c41e9cf3047fbd599647ca403a7f29f73a765c439535efc2da6862aeb7fcba48927412af6c9364670e2e44c6c73da930b94385f9f0afa7535ad8b7606a512fb737b5db6a08c637087314da4bbd76c35a41fc091fa3a863a3b8c7874501c8a9243f12e69fc8298f9800c9d174cca7086ebf8188ff5585fe1d599053734212fd8490ffde8d4bb8faf53d3499e0ae59b526555a2245eb00bdca2a38cdb0d9a31f89bb46851a4277b819de8e9ff3148789b8ec69d8d7ff248ffd7d3ed8491a3945b6daabdb7b5ccdf60a348818c8493169e99717bbe5305a5c785c4efbf6dad73c76a04bb28b740d2a761c9ddf097edb6dd2974867f5ec5abe07086bc40f7ef61c9dba596cc905b564cd33d77efb1624bc3a2e75440474daa778b79f3819d237a42dd8d937df26e73f31b5494da25d093566f31cc3a53f5818815e2c268f6a7a8e241f4c90ee3b3eeaec277b5c1582f6342fb7e372fb0676ed9fb7342d13a96e3eab49c63d74b76b3a2baf6c899bd86c8a26159ca279cd34f3f3476adb12f447df223aef827597eb5422cff6cd48b6a40c4d200898430ccbe1a6b8ee1635c7626f3a956b270dac22e4af4fbbc8cb637e0a1a7e1059eaaf8b89575d68b530530cb2380a5e65cddcd44b52a922b346e510d5da16b8c2189525a5da109f74b236fe3c39ee3bc793857e9c3859e4809cac7c8ec5667a34b007c7eec63ae9fdfea46497b6b836cac1c451b03814b7c47554a9e6039842418468fd5860ed6cb144eec638b86680ba1628ca09afc406d944cb0bce1b928899cf333ab54be5796a6e0db7cb3bfc8c9b9ae704dda3e5d8eeedf92c77c589c6682e35d9b8e8efc6c4e669a5b53630ad7f6bbc0bd37fabf0c423e0c719bb9dcff4bddc2c390e30b46b48f81864b5d8ccfab339c48bd9cc8ff8dd67358722cfabff6bc907a457f85bebcbd6c765ada9b5c684d290c53625ef3a02660ffb2fffa06d3111b761296fd2e2d4c65f8fdc33f798a8f652eb5ea362743beb6f9a93f4f76b693125bfc388fe11d6f7e9db55c49fb7ae52d4222d850311ca5daafe31744e6df4bbe68b6b6fc5e4dd4c8f1beaeb50f5587b7cbf54a65a2d9e6a2c5baa0e72bdbe98e99096c516f84a20f38a9d335f0a0064e955697008a9bccb6524ee56825bcbb786d92c9aad40b85c2e7ee669f08932f63635f1c37e989a4f9cfe90c335e32ad3aa06a75512fc895485780bc90a969c83419ef2cc64960d399ee65359bcf45201b948ccf827943a06175f55b0492a7236e7b69b66847824d8873a24b6267acadacf330f306652dc766e09f69f0aee068c5ddcb199997af94b8f935df477f00b99882a5a5fb8e47023737593afd797358bebff8be6f4410bdc3811b73ca1c8fe5eec070498b11bc816da770bd895a96338fd9a6659ffb88e05e719bf3a4b208647063cf9ec985ec087fa643608e0aa23ce7749ee3c7983783992961a409729a1c6f417ada0a5659e94fdf95277ccde3ede6fa3e41ac9de3293e3ab3697194fd6f9bfffaaaf6de29b0c2af681546fa657a5571fc378425b23089bb950e6ab3ee80899ff6d1f7b448749280b978958198cbc626539abaa520f4c1ffed3ecd10dca6a4d6edfa0952d6e2785cbddb +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 4b3a70d85f640d1a2a852fb6fe96704af56a7415a8ee4282e9207bc3a2dc116a +public_key = ada7c7f7ae93f8174b99e5b0c249517ac47c4ababda18b523a665587579d884b7d98f778758c48d28c89c97441e7caedddedf0455c73a30377403ce3c20bb8bc09d52066424b9d81c9d44139e53f3afb7d9a687c361da2f5ff2fd5ab37bb778267053055f38158c3762694aaa89596ee8f4a0b1d490c49619a6db79dc3e74b2f7c7687ac0b453319779996a9e1a24bcf1e19a4d72f4e2fea4c4da636484ad9c3acde6363ee367b7b74c9734313bad6056229eddd90f8806b7ad6dfb45e4366867d2e75d79fc66cb9e083b5ad8566bfb58e6b40da9971bb4855b44e14ad4eac687af2bdf5863b88798f7c1a06360e84c24e8940e404716e665e571ae2b063fbc673d01ae8cb94aa658a9394b60a6a1c9bd08ec7bdf54fd02dd43f340ad5675f78057cc5a0ec65b83e5e831681e4d5ccc2f95588089123be8b4cb93df84db2910ccb4924f942b563d30f7c865fba5bb595ef35943ebdbc2daefd58ffcf167bfb9e2e9222a6a71bc55ccf7cb9c7c8c23398761aa58bd8a587013841a276d00a375cc25de8cec577260aa9da6f799da9d0aa9e873b1751958fdf50b9d310c4b8b5248c0f08a0b609440eca877d7d8e1a4ea15af6407d5873fd6f492bea381f53ec8b7f7e60af35b39434bdeb8e0918c4ac8fa5d735b0f676aac18463f8e65cf2c3dee3a97969da994105d056d49e2245ac50de912a44b6f3647cb9c377df2c7f0aa9d16725bda1fb78681de3fb35d61f1ec0a0eec92fdfea83da9a2fdfc95636598f63c264c972a4365e668d440b13f7d3638629ed6cbb7ba024cbf481f64bbd39a5e79c46b43abf104d5fee48d76b7dd469fd33b9d5faff5c3ffc6e91ab8b37dbd8730ec63677e6b43afc74331631fa0c5263268b17cbda78ff699e839e66489a8754f30aac9c77ab765cd9d94b8d77c12c8e8dc6bcffadde832cd2d01ee61c083b14677f01878655394f31296a33d6e2a29ef1cfcaff7a1358af99d4b5e8c00028434e08e3ac1a5d24ccfe09eaa5929c5e6e05683d39f4293f4fe3bdf1e238b2717490f483eaef04f7ad085574c9a1f7cab392d662fd25b4390a694946c6685cda02d85da18776973fb6a829cfc24999a317436d4b47473bbf8fd73f9576c6424acf65e88a4cbf30aefcef5e08c7c06aec84aa3af9d44c25d8ee4db436285a4b1a67ff950437e287f94de7c0ec087b8148607c4df29bc97f7917d76d9842f5a77fc56441770cda5f7f45eaa7ba8f9c7840c99f853ae09257b04bbb367908db617ba997f5b5b23ce4d148d7ab9bce20dcf71cabfcb5dcbf67e4a0df65a5adccdf8634670c57e8ffbd6880293d7d7e84c536d1c69c58f21dcb1ef961aeaa95133483715be1b57b71cbb94e6a483444f65f293b7d34aad2960d79edce8ce19eab09d647151d65e037c2041c932dad92ac7b870e4a64cbfe4069fc9845cacd62549356c38fafcafa807e33c5f7c6318fefca36ad23767e4d86a2d1ec8c41eae8355a9375659c9b8cd4539864b1098b8c96fdcebb94785370430498cedbd64dc8aee2e385fd775749f47c1f38b6d7dd8a6c3a5b2e148204e5d048a3c8e6fe3e2f3d59e6a3554a636acca6b634aca6db7e977e33a74f0a56e78cb856c8e6b73681a3a96f5a53f8a2aeea7e063ef03e4410efee5f38ee9be9954113acbc366252a9e1cbe8f21b8ff7e2d38e9bf798df6e627d67b8e8f62f2f1dbf67ff4188dfad2e0ad81f1bf210e53092ef9be859857f9de34819fc572b91b6aed2e335e04c7cea49c7654c2bb4df53ec12bbdf89fee32b63bf57ce616028994b3d4536564dbf18b54a16b50b9c75d3f347d8cac3f3ccfdca8f7155d5d72a5de4c8d9fe422e386c936f3bac661f4c4f8604a2b658d53e88792f5ca9a497e9bed781ad4a7bebd8306b64d1dcba9a69a35128a7a89e2fb97ffa5c2336cc5dcd90a6cac001dc560baf5f8f75d93f1cffa564db51f5686248d996a4c48e9da68f8956ef59d19bb8d9b84496128f35e02535a38beda0c95846fe8342545ed134f6a6e5ba1bcc7b34858566acd03c1fd33fcdf4cdc7d405f5c5e6077449d8c4e6e66d66af3b9b05f04033dbd34ebac33b708ae7b21488d9ba3ae4015d38d1de97c89d491ffa5c756f6d2f6c5e0bbfc69ba55ebc93e95044cd7c5cd0d84bc717edff8bcccbb4f85d5f5dc6efec71d667cc0338e6a6ca392e61bc1211681ce762516ade8bdad2f1ed78a9731a2634 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 26e38ac804fb5b4d59ddf747715e7e6041d875f99c7b638024b4af82d622da60 +public_key = 307cde7e44a625f44880dbdd125bac36b650f853dc647c68e1ca6306e39c6124fc2a69f4cd0c9cd6ad85f4eb5dc58e5711e4aa7e4af6e62ecac85c303f5fda18a3393d996c1cb68dca9d45894de38555e788e578433d5c0658d7431d34ad845df2baaead84acef5defda1fb191c89f51c436ff6bcf4b33b0b32fd440e65777f4bff5dba7570e48374d46598acf3d46b70f7960eb9a7c5fe893c87c6dc584ecd85bd80b7a4d0a596effa363b654e848d849b72a7cbafe597c99b7eb6697bdd3e81ebf5ce213c35725bccb2dc840066dba39420763572f187759dd5f6e43cbd51f96f7c7a637cb49a58bd0a2a9cfa8bfbd1745b5cc0f55b1a6889253e704f4bbf5c4844d1cee9ca5bdefbbd430eead30d4491427543cb39fd127e7035690a87e49e09a9173a433dde8a29d4d744cd4a7d2ebae568a392a8e326fc8bdc2989869d6a56f77e5ce65a51dc9a5e8f5c304ab693704ea64f8dbcb259b9494bb713b6c882b94af65f8a7bebee6886f1db4ed5b1db8ccbe88aca7a82086ee10b6797a8a5aaaf54b607f4c8fa9a41bdd9bf9c9875df8ad4088eec93748b428cb0527c9257aa83e5efff1755d835343ae05be331ea4481ee944aa8953ffca011e53f10bacb18ac64619689ea6562f23c0fb5a33046c5dc5b7c37f2e33d0987a45dfd7ae5abcb38ba68e13505fa5a05be45af58876077d4b7b4a4e18e5b7905e8e878da4c3a678b65e3cdfa3b18debf85a66ff01ff9cad2c98506dc005f73d23e3cc627e48d6a53178eed004a8efb7e8a1cc46f224e48d0cf69d290fe4082b4425368c2757ac8493393e5495f35a41657ff5b384ee5edebd6e354681e8b47ae5c577be9d7d8d7feb4abc89ea94f3de50f946920a0a3d6bcc3d1799332314d35525f73c2c4e3764ca05ee653bdabdea77819e0490427fe1ba7877ac9df8f94e6fa099e8c7a7791ceb4a65b567848f83cea96997e3ce2564cfa0e4ec43868bf6f6828dcc78f6cd3afc54f2675b9fe926c5d2dce97046c38b3dcd5cecc076ba9bdb3c57a4fc806e835ef6c5fb4417de4689baa7633459edacbab3a781aa83158b31b1c949338b58ac034ff3cfc80d3bb54ef7c10d5f81e0d5930f48e7b9893032246f6ab8ff7f6cb29a46739544dc6c8e347b2997f65e4d90c95e7e84633813861c488ea38fd0ebe7cee795b560973effe3a19d3f950f9feed124db454c8d5da64453fccfee09565c7cac729f952c46d23296eeabb9f4780895cb1ff737ab9139645bcc7b6edc77d50c5a90a53d8c44764740279108ff799a455a8e5bfd395de2d66956385bdce0eed8a1ebd88fb34cf18f4f82ccc7da6a8824b9d982b9fed3b46aeb0f837f57aa0ada783e8766887b538fba4c34be57c2138e9b9e55795399cc99613bf9b7085e9f011f41ab2336e96981aedbabd204f06673c4bf28929f777f260dcf0e48ff8dbfe82b9b8e4fc36be4ccc4a1293aa477a76625429a78e78733380ce950d597ebd8ad695254cd4367a1d8a94bae95304f23622d07650a17341e5decc5133a772c8abb8fa63ffbe9db78af7fd850c31d4fd207579649b0b9eb38ca0ff46f1669cd3ea5a116474c9b66897c4f6d96cef74f8974748bc066338b6ed621d9690e4345c1a3756dea7355148d45c89a16da8868ee64ab538e01e35489c792f79a53a977f77064f97fdb4365fc7f9cce5068c7db680fa8d0aa9969bdd5a65ffc30596dfc9c635c189f9d2ac1f958e167558993cfeab4dbb54f88742177e64ff964c75fd1da9cabdce9b458dc8cd7489684d4c8ac7951a2147b7368d98975837083723eb85a4889547c3847d83e7cc89aec5fae9294358941467fc48bc6bb38486dad5715058171c7b2a178cffc838de1cada03ddfd4049960d477d9f79a0b2be7ba9345afaf641aa08d318e4ea71c9d63a568058aef3992cc4efc596ddccde1d2c66f035963f8be1c7d74c35158ebaf6bc16d6798a24ce938f74e125cf3e5e419bc6926e69aaf11562f64e446df6b77d6f5f9ed8f0587b68f1c5de5a0e32d9c988b66cda86b6c721384b9283cbeb1f8904f5a8dbb6b6a50bfbda47918ae3544c7978fbf9381f78468c0f652a0e81b8f57ee043690023bc9dd43610de3514c79cf9e3639b89faa1f7dc763c52a43773fbe6732d36ff9385716538f00e47d54237c04504a8169baff63f6fcbd8988928266537d344dd44533e2797aa03d8cb025e705a9f45 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: a319d2b8f114f1acd866478bcdeba6fd164dc4e37b0adfa8d8034afb3e197376 +public_key = ff4fd0f4ef60b8bc589e0e62aa3beeaceff9f9ab6f64f5f8e1fd5b3c69b9cafe92964a3a6d2c96b8e5f5f0bbb32b848e5c24440a9d4f1583c7d69fd9b91465b9e3a6f2b5e5ecf55a789ee9455bc57af5aa885b64100acbf9746787b9757a17c1416c4ee317b017348f5299661436c1fb5c8aef13f929fba046b6d1804b7b4474461957c8eedcc19d6d9254cf3ae24f8674b5ba69264ec1ea74f835e98cb7ec3ae9f9466bf769338a6369e32027aaf56e73415b31ca16f4d7e6c258b9e38884fb107e917d08e5b75c38b17df5fc9682876b597cd65cf21943cbcb4e78be314c4b487aa46493fb7d5f734d0da891bd5ecc90dd454a7c9bfed5747daa43e2c95feb5ff166fdf81998fa535a7e312739622da2435efbbf7384bd9e372f74d202ea9ea593d002654d40f346c20fd35dd648befb332bf9ae0809810445a2c91a6c51c68ea1abd1ca287e3e967139f58ee66b4632346cf434d634095c5959ffc3c9e9be49c7f33bd0da0a9b966f5132ef4a3b03c0b45cdcbcaa7fde1c78726459518e8c69b6fd865bf51e54b10fb6820b9678026353fb3bc09fd9dcc594f84935fd2d7fd8dbc7754ce7d905fe5434a8840104b6a758e4b555c69897b4b3dfa69407715f93ab337a70060d7218b5536a99d2043f998a14d599bc688f6497c62db73ebaa40b735f41d966cbaf4e655848fa66a2b473437d14c4f80357e449643cfb34e1759677bdb2b3733bfa7bf324357931b7f866e99430454fb1b65797b9de5267d37744c0f074e5fed93540a68fd2bc5ae84f47941cf1a16e923d6d3c4a89309f8a7d1ae48a2947d908e9e37ecdeee84c3fb6d4bcde28ca63c34cf21efbdb16dd831cfaa6eae9edcdc0a80cd373ed66a8e6f25f4af873b5f992768ffffdbd9c1d9ced86ddfd2c3ce8de7cca5d95f95bc84f448ec51331066ab01275d5e01f73752ff0a869b518cb458c0db5e1f5d3f53c639cdfbf11e7ec45e886668fc71c0663cdde9b0519330f36594f1385f09fe99d76b45083e8fde59b6af4e85f48e1f15b873bf9d2d80c44aa5f3351653365e369be2939f7fe7f753c776fc3421dc75bd0ccae0fab9bcc2a81764d8950fa32e983cb746d75040a85760eb2e543b043c6e7c27dd1cf0fd4ae164effc243d5becba30ff6f46ea7d65949cabc32b3b3a782cbe8d046f7cd35d7f2eef2a46c3e3509e415ccaaeb2ed709f648125ff0524b8fae55c8e6caa27a693c3a559496e3ddb245867449f575accea61c91cd3b9188b94655de5e7eebb384ee9d114bc0720b7552cadd42d85863e984a32dbc473fbbd8dec3409f5837fee7b209351f0bd2c99f3edbf4a54e6ddce7dabda56df1601a5b19d9b0b736c8b1f3d897bf85a633c647658622c3da9b476a8fdcf51e0971f893806365dcf3a7e8c86b6849c7b55319b7a4f8e7b4447d265bc518a6e4258df6c82c557be5a4e1e3d2397865b07f77646b442874a5b0d5ae614f9e4dc5ab31ce32062d30d747715dba66c173e6a8eedd180b6ea88a6e987deae123ea251fb5e93d39c76aecdfd8c0775ed9d47dd9498f725d6f7a8f9395cdfaa7beb4d263c8479b3a3e1d68cfa5688cfa19322b833e0eb863171a3f48b9910f5f89611c4d51554574dbf39934cf870550a0f7a4e79beac50b59ac6bede0f348f13e5e627cc2e517d7827b9f9c6b94311db46a2b75260d52694da13e4ef3621462bf5486820594c413e8b86731e1258de72e5d76d68b5808314aad413a5ee4caf69198277a8a67d82da4a440f799f88d64310660351bdab34970e6d9c9e54afa25bfc95135971ecef8eec54cc21378b6067d648c85c8ccf1bb9551a06488267e9d5fcc67727d83e9d677abd5f3340cc24da5b489933ad8dec1d12b7004ccea885f44a7b9810b29c77826aac6daa1753681e2b9cefa4aa3a5c4cdd63a844176d17f8aa79db97115b86c447bb7e66b7965ae9d420e49fbc475ec1bab8b06cf96cad86116ff89b6f17775d7af4d849c8f615f0b6d81ab82aa2e84ce9b8b07f693110bfa5eb83cc5cc4545d89362c33c8dcc7453b7d05104db5679ee212897747ce7f61dfd8c15bbb2c6f5ef267914e6f759dcd1da4c8437eb3facf336fa0bc0e83a9ff51c793dc44007a634333d946026f258de91ed8872ead9a8a76f96a7e55d30d86ddffdf3ccb84744bab7db9c015a60707cd7aa0ebe7b8cfb1d663d8b18c5bbf06da994e7eff9d64742e2 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: ff646071b2509e6b75790917e08e4f0b0d9f0116ec6291c0b59eaa4b583ad830 +public_key = fcd4fe1aeaf0b98db35f49a31228df66b866c4a5fd93ffbf39bd8f621d850224909413938678c8f9585a084eb561a36b778d644947485b2462d984ae5fbee5fe6ff02653d14617d67b9540457a3405f7e27e94ed004b86c094468a0743b82bc70569c3388338e0dbc6acde456ca3afc4564ee9d361ca0a708f4e7aadaeaf1225ed5fc93db4b652eba9da0335c79aaf7b723e72b6949be937b570384f3637e02edfbd784c97d46c8a30ffa1d3adc4390df91dff9971e3c58df77c33b83b535fcf0f7fc4fb9448aca6a3acbd6a22677c0206609598c54488e598fa318bd58da36f5ccaf7ae759b774147380f13d4164bd786b9f03b1e69d943b54b9b92f7bc7be50be8e87a37dfe73712c33fc18f4ab448a9b2295a7364629956cac2cb6ed54ac085bc3693fbcd9cf7b44d4b318e248ad737aa1c9fefa985bf802e9829becabfe66deb269a6be49dc3f74af594c820748fcb6d9620bd4f22bcfcd4787b5b4ea91195b8588b3a75aea188f95e50bbd47cf42fd5b63fb88ba57edf452809dd2f966a1cd9ece39ba848fbb2ec4576df188350f587e5abdac0848d71a93cfda63e3ef93745c6516cbb69a65d5b20addaa409e1953d6c84f640050393f1c751a05872aa8bd27f678b1bafcd5f97ca268d6a540e6eae54e2a8ff3ebd8a7359e5a707bee415a5eae2a45d60fc999b66a255cab76ef85602bf974c56fec53dff84bfba8529daec7c6fd6263d73ee9f7e07ec6fd37694fcee5619d290549d003cfda9be8beab345f969bf1b33e44486c29a1d4dc7dc367265902469c45d7788c6df3941c6a1609ae2586692eb759eb4835c5384f9ef287b6709b87edff653d7a92cd3e4a295a6a6c939e33b3a87394cc40cb285be7988ad88fffc3f402cfb072cb72b467d59f930d93ed1ad7f5c79d54fba036aad5760a615cd60aea323a87fb63a44732f8f124a3ef73ad86ac74245cac6b778424ade7c7a19a127bf8c763dc1ebd6a806097de45e77a517dabe84bbe3b99ee7149c582f4357c8624d08ce6467b144e598701987fb56db21e53957f57ce98343a564c63fc466f8ed4bbbdaa63ce79448364ff1d9c05267f19d03b2d90c9c0c299026d3c0aa4845060d92fc84f4f1fad3716a456cbfb936afbe5a5570b1eb467d54890493c49783d0344887718bb54bad6bd9adf29359ae33395d7a8bd8a71465297780f54cb0d31f5ec24eed6be3e76657ddc198e08497d6c0e79c8654c6c6cb35d406ffe70541e92982ba67ddbc289be8e842a31b7e7158660744992d75d6e2dec8bc6eff990e52703761592f8319cbb7a35ee253a98cbbca8a6d86c2710631e105c218bfac0508e44757f7c2bd89b3c8ab8779ce926e9352d86b38c5a622c73d6938e4fd36800d6cd09bfdbf0eb6734eeb38307d412c2469d10698071c772f6fc6243cca237cf6760bd358487430998ad9aae457df9d79977c810953b138642754c0bb993e8b9b7e3b3b7972359569c44bd6576fc0dfe2f79cdc3346f0122f5d2596bfd2fcea4c8fea36259fb723c64149e0229d485a6f52225879c04dec20e3d5dd3bafb2f6fcd0bec3d40db5460ba561f3c61a3d662f3641b763b2f5b5b2682546cba9a1543eb8afca63cf68b7a10cff49c5b4042a3a2c2e48c427c97027f7dcf3371bc7b13ab6f878c8a358f391f03befd4dfad663c4f71c36cc0fee582ee995d976ca37440ddf9c4de2b48ed9c49283da978fde7a7065cbcd8e1c0de55d1935123fef32583f505c6c568fa67bf7968ff6836f765c242b5b9966c333fbee61a336164e7fcc5767e40939591fd7b537788c56f65fbbebc3078c470e98dc1b7a31cc53a84ada7e95c4634754a07add7341396371ab79f6343b70eb50966c59a9e44cc46b6d16d89a879871cdebb9c2cbcef84cb8fb4a031786bf778703b164f6787c5cd63ac7824f4f865de1ac992a7cd4bf7953787047b043632df1f698f8d526d8e3e08f36dc1db592f48968395817566886cbfc7d3fcaddf43e273ec7ecbdbb3e5e7dc8243f3fa9aea16ee371534cd056fcd052685950bb6b6833600243e35d7d47ccfd833fd9e1d854739c5b425bb32bf96d29f1e59d79ba70293badabaf5385563cfb4babdf4bbbe44e058d3817e9a7941e69adcc867559b822bf63d0034c15eeea9371945bfacb1caca4fad8590f723014cf5355228d850d99c57f85c67295a4afa0b9d8e1da6065ee0e9e43b6d +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 0584270ec26f3b9818e4af074d17b2d51037cc8dfdcbe3b140fa4fed5deebc54 +public_key = 3e074aaa7ac9f87d3a87c7fbd0bad50574b63fe8def56c882109c9ebcff0e77d41397af9d6977f963dc36293f9a3fdfa795dc77c73a46a8e45c847d8802f41ae46a1b7b692fb5c81de38846a5bad7246b596a889eaf558d1d55bf147f058fe795c5dd76d53c0b91f88fdadd9757a9111faf6c45edd562e7768378cdc94a3cc4daf38f67b1b473b162d5c58d876078bfc8005bf870588dd73e8ac154dbd9aaaa6d48d1ecd5118739fcc8ce2327a68f8b5369a846b6aac56fe1d43c5ca867585fc12549840d47b6563c7047f3d6b8791befe4e011ec0615e36a26fe266ce3874b9ba6064b85ea895180c634168774aa55e2df34ebe8e32bac959dbb9dffa656e7d6e677d3b801ef3604814ac36e3e657bcb05c0fdd893a4a2e5d644a1fe33babe6e82ceabb2b55224d8f37a9e52cae4d51a6a7f5af31b5167b0273b22cfc60658fcc6685bbe8f8df6aab99d7f55b51ed93aa55b568c45aa3e4a0766a922829fe5f9e378a06d92773d89068f6c7af4e7413aa98f57495ecfd5ed5bd6fb5c65f4b4ed7b9c4c7c5d4549bd306c892f547613516a90654e7b1b96a95cbce5c6dfbc87d356df5ad52b98ae00ebd66175ab3747910d8e4e8bd70205b60978aad90c43341ac6aee03cecf7cb8cd2b4842c3401beea3b71fd7af366fc7f78069e39fdeadca545dfba455af5ecbf1ef9a6d616ded6edbeb5297312b38dab30f3f2fcc42c2d66309ff63b8ede9af78e44247c2dd93a05df57daa6ad3e896a182b480f106d8ea668aeb6db66964b2a3fb609ff547da9a51aa6848ce2a686406c7fcebd58595a807a6692f833cbf3e66fffc73a203d623c86db1b98ee7f477d8fea8c82ed076774d6147bb56a79aceb6804eb982a9edd356553a68ea8e91d8b86d676f394a776353bc840d43d02d9debeff481cd8d5eff5e80fb734bd6558f1b9081bd9fab74f808c458cdfbdd72e5b49305aa5033f1721e31c7f848fd14811e7e8be5d8d5c9bf54c8c556981ac8c1dab13cbc9e927d8d99688e36599f3b8af3f7ab83f2a3b613b38288bf856aec5b4ef9dc33e85b8d88cde397d75a4fdb4c2cdd8e7f7c8e379f84ead222bfcdfe07d370299bab0b7f9db8c69d7c9ea7ededf71d7e0454dbdcf945b03f9bc016892d9cd1f17e654ae3b19374946256d2731dcf9b1760aafb5e4a935c2d0b7c70db3721279e6fe43d712468fed532cad432ed3da1372554c97c3769c380c719d18393364ca97f9dc37a0d393511a9daabf398474965dc45ac2a37ad60163145bc3b73e7a6c213ff7e3fe6bc19b26b4cc55bc68ed996411ccdd715473f4e0636283cf0387da3bbebf6cc58aa7b4c69ddddeee3e53ae524e69859b632937cd8c355c66dcef6cd91f418d0489f9554c94d7115393fccc11fe397f2854564533fe9e66614da3afe15be921962698fdf5fca36878797a3bd45daebf491fb3cdcfb7254fe8750774d4108bd6c7c6545c8d1e8e368a1087e0f33c22a359908cec75bd59db38f68da457699337356436787be6bf7af5fc65e41bcb3d3faf566039991c80da228ddee6543bc174cd6b9b8d270ed7e032c30f5d4c86aa5da3a7b32e6c67e5187ed79cd8cb548fbd4fa8068969926d352f7e5820bbe9878197c2527fe95d6ab6a05acbbe375ab955bc777977d2b926786c9143978113c49083e438ea53c0ebf7bada4be961b38138b4c685ae2d5bd8b6f03ab28f6a261cdeafd348b596841981dfbc534836c8b735efe39ff98c84fed3a59fdfd0f7ef5f2ed9bf7d7a9195df2646fa6686f7ae5f580ef5db594fa64892a508ff8bf8095eabdc45486936e12ef6bedae4334454d67dde28663c52a97d0b525950425a4ce88f4b25b9e45ec6bff08f89d25d3816ac76f498f8e18b2b626b285655ab50d96cefbf29856457699b500b77f7af5c2bc8c545d4f92a387583fd74dce2dc4bed85bec9cf45c63608eb3d2d567e99d9a70194a5e92acb24264532c0fbaa808f5052379395b3b432f536164823c379782837ff417b1593f38721b8b6b4a5bea8fabfd35a90d07bade6cd3c4d3e70257bc0e88b41b34fb157df7bbafcc72474d014f7b0c79cf2a5fd3df379628799452d3952d2ac70a0fdecfe33b012df2917a4678966f1e9d65cbdfbb9b6979817873e8d662d7ba8344de872939ec545cd0fdeac5ead3c8dd2cf3e2ec7899253e7f980f9ab3230eb1a9a3688f94bd522ebe016e2980d72c +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 51e05c7b4ca3079781e8293f4eccebeeb2f8c8b4c59468eddb62a21bcb4ab8a3 +public_key = 10489b6e53ef18744974e86c075394189349b01beffd5cac617fcc112e7b0f4fd3e306ef1e9f81c3efd8af83a7f17eba78546e283f71ac1cc01b4fdf35e845f10c59bb8c97e26f7603f5ea06e532ef7e6eb845e9c80a4833c7ab45e6951137c0f83e964fefe97b033e17bcb5238ae128179a86df4f730a6b31fade52075ae2198b491d6ad1fef2580e313bfea7b675347ccdca48d88c50fd54eddbe092e87ccf17de10ecd93bcc9bd50d49035db7dca3775c7e5f218448cbbdea8d8c8c6577cca02ea7e3f6f08b2c42215794954aac588efa3845523c74960b57a97e0c310cf7b87a8e92eba5d7fe75d2107d6be12977501d79502f96acde3587a78457bd83a164bf23d8d1969a575a1d62d22bab23c6ee7dd5b31bd5452004d90a4c6c01c6603f4b4b1aabb9978ebe0b9c671f496f8ccafa5725d2e0da35ffa9bd2c77a5e678d9e4d54000b851b32f6e24ded72253826f374842da3130fd931b7a85e6186f5e6a31277afd40b8efbe135e2c86c328b896f08cf269f983b313cd92578882b3f1f013efcb9a9e7e6e8fd3d543e34abcdddb98d4c4585cbcb67799f83c54ff8c5cc9154f7fb1a53f3e35b78d3ee0ba956df0ad35084c53cc9b6fa7946e1194d087f8e94db6607246c7b314ce7644b8e62fcf494a6333dbcc23eae97cea95c318797ffda18c84bafbe968df375fd0c9981757aa8c8786598ffbfc2684e11faf3c3da067ac996315b0d0be3ec56ff0c9447ad4374c78484ac75f921338f14ca3346606d34abb7a78cbb528c44a339638effd9d3ee370d4ae746053629e7a37eb36d0f2f73eb9d5720305980433e5b093c0082456fbbd6ca2a4c9bbd4c651cbf97b494fe7e38d5c8aa3c7cbb6f1189d4a3cd2de0acdd1efc7ffb2fe83c63624bfedc137c00e17e93cdf8264fcdfef2f59ff2362ecdec2531d3d93645e92e398f46935109bc0cc5dc61a4f4db056e823d33fd9df71727554a4c86a5113a17de7bd17b47cf04bced6cabfa7f9f6993b57a7cda694ef51e3c9db7b27e960fd37fd867b881d9a8bf9d40316dcb34b32689cf63fcdd19449eef6c978db4c83c8967a735895a70b6dcfdd6016b3737015696f2ae9462eda450df3473cdffcdd49c19f5ab1d68ef3f775309cfa95e99866cd4b17b34d29bef54c433313c972a705eb48696db9d7ab71d4600c0563b36437fbceba6ab9ad6e89630357485dbce486ef808de8869ae59fc6a952890c696964f4e3bb9f27aac219a3d1dc6b36503699f35d4ac5e35ae0ed8048f9842d03f70abc3d20aae311d65c048b58111bc7fbd6953e2eb56364a51dacf41917fdecf8fb9d93aeb99c3f0a5a6c3f276504c3697a8ce9563abd84068e8a39373c1375d848400c663c44e6c968c3c61fb375efeedbab6dcf6158aa7e39c99f6d9a8b0765e37affbcb5e5e468ea0207ac3fd5b3b7a95f194ad8522ed9f335cd1dccc09233e29da93aeab93ebf397bb073bd6374634675b6386caa3307ef05beb421bfd36979acf22835fcd5e1186441e1f585850faf78ba99684ef5ce9331b6686821ac739ff4e467fcf2736463ac54e5db238bdb9a32e1895e0445aeef16b12f8e8f33a435afb9ef850549ed465fc036e63f98858214d274638eada37dc26fbb2d2839ca934bfa44acaec450ab4436ee78a5e668e34b08e0924d52be1a605e69ba880d5f414fa25569c29253e57865c5bed6918da360c4c8f4c7ebc8157870962737d25dac5583907c1cdf0603b1dceca45f1d467ecc3a4435355a08f64abcf6f51ea37b2587f40cc024cec497664de5e7d5fcddc103e36876be68c1c732ab364e1a57f6c1e8f07e1830d747f1dfcb55557352a75d8469eabccdafca707cede5fab0a7647d2cf7b05f1e7998173c5b3958d48349201f8f01889fe00dd0b668a857479031fdc16bb7537957e9e5ee42f0c5a1a52445de8862cbe3377c383debee817c9ee0e045321a16594fa7c1d1037fbdeff08158c6265e4f3474f37d7c73b0dcc605fba342cb6fbcbc71391577ac3781adb39d4b2cf236a4c957a8e0d039c10fe556dd954d71f7d5c6fc9389f3be0089697dd6703d8bb8ff08c88bf677318fa56378b52bfb30182c9ae26efae2cfb9f99b4f3d1bf0f8593bc63dc585d737540972bcea60e11441e07a9c6837d31363990b383b704fafebf55e5f20635ba731fa86c24d6908aed77e3a57b2138c0c83a5bc98ebd3a002c0a9c6 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 9eca0fe36c80fc5eba171c3ae66a5b1c923faa50b4521bb055e7bf51005c93df +public_key = 0dc34b0fc991bea47b02a8cae208eb10043ec8d655124b3ed575d5296c5aa32f7ce2bcd4a0b3eca05575b2e55c021e9d6588cfb529aa54f7d7155bb4f9a63966d9566bb65a9528759107e6e6ccdd80de69112999965fb1771b35a42fc5145c7a40d79d6d9c3eadf941112c4f76d678cb0aab59b9a30bbb340e078bc289995179ef9bf84189a87f2af590f99ed27a489ea1bb89e3a8b65959ad503a5e051c5f398a654d7d8f9eb5ebf75c6bfc25634155d76a93aa6e6640e6b47158ecaeb72ec607cd65972c9f26a34736067161e6bd490af97173eaee5b518ddab90f79f929d5a7a6e76582e53dcd36acecb6a76dd9455358ba95eb8a70d3786d0e960b367e15536b4574d8e4faccabae39c8e9737ad6b8b0e380bbac446c73b7b388b319ecf047fb733817fa102f5b516f53afb7f2c91f419e9c739d9dbeed97ba8f684112adde7d1762a6cd903c49d787ee445c6e5a1e054efb8bdb1daaab671a63cae7b55c8b6f140ede567d7650ea8d864c7e5217b572643e6c7480411489c9bbe8400483a667e85a9dbab58b6a734596a71f3dff5f40b209d9fc8c359159df89875e0ad3b06f78e2ea973e70bda69896e99b3b55b8df6a566deb446d9b3d6a3981cab946049c10b5737daccfb214de014a5f715b4c1f9bd406b3a32056d2182450d11bd19b388bff3eb5a5a9794b5863bcb34cf6f659b25cc95f0a42faa3d5a0d647342845d6bf8ff6ce727975bb48c5ad2c96b97ddc3bd5fdb40e9b6fe113873afea9ca3b969cf33ccc8ddfa9fba93ef565a8bae80cc3711974bda14ab85e48e7ef58d1c0c3b3f694d3bc94cc751fad045af2085db6ca963e3e15ff310bb14756f3f717e57c8a7d67f9598959f278ca5707ea6d106431fa5a3b88c39e3e46dbc0288925a3fd45af523b0980a32e519ceaa65353a7483b7de70f8745af869bbc869a58bed33f7b3c6a4aa7447a9a09bbba03f3d69e4dc9d5a1ef8aac92c9f0524c6968289d7ead6db266eeefaf6fb774e68c185ec20ccf2b57a89f28877218d9e94c377c3e3cd5ebb7f81d37bc0decf85b67553fb89195d316f6b93833e793aa3aab2972e979c7aa258735858434b6386dfdc5a933ff60b7d624b4cbea0ee0c9e3a0d86d5bcbaf3ab4aaf22f76e27a1a4b9f2bada03c8dcf43de1de9d13195fb71cbcfcef9ef528377d30d433dc898c31e8f7c6f75f5edb9aa8df8e759ae0c77477c0cf7a1398cade7671ab8934424df5c3662c746e07205a2ceb7ec371fc4eb063cac777b9d6b61cc14e9fcab4908bce61674c6b4c58c53b5d65c637d0a4c964e29729667aa949c39ea0797b698f9523e4354bcf8d53cf096049df866bd029beac3b47cd2e648ec4ff1356ffab2993db33491326a625e8739672551563bf829ca57ae75e8dd4553156f81fa57aa3744e2f23cfd0dedfb624eba2903e712447deefbaf8f974aea85e40ebfb85df4d9db834c283440e387e47b2b8205fd9da25df8f1a6dfd7c6b29fcebdac0d98eb2f669e8ef3d36a52dcd634a457f09bdccea83eb47719745597955d3372cc533cc9b59712e770d7cbb63d0ee5cd0fac9933ab2496e7babf84a8763a8856afea63c442ba74089d5c6ebe3dde25a2416fb7dc4f8959efb72117652535c1c35ff6266bcc7e87a72128eced66cd9edec8d87aec29ddc335b66eaf84f2c1bbb3a7dbc7f2b8ec7a477a367e7a23b486f307c7670efa1be3afe94d802645fd28b8f6a7e5781949df344ebfb9ef58651fe3bb06b8aed87eb79bf16a8ed60b69df17dd5d849de404ebc63b83d4a098d062b4c1e235655b43c2b616fc28e4d64a1a861a9844544776e8eaadc0ca66b2cbbb691460382b586e77856c8d85a1d679608fbe8185c62ed79b2bb8a3ebf57150145892f99a27ec8d181ef65dde6b605f939564d0a54e92b0e47f39aadbbcadf7f9d3aa1f64d7465b8b29efa87ab881bf4ddfb82d47f61a53b138fc13b65ec41d45b2edb77968d018ee776e46a50185987a9f96f4ace44747daf22f7a7d1dde327b40ed2965ebfc7a5568d3d4d34177ee4bd6f9905c5c4e263d62c22eddce1cf2e74779f07846a78d6eaf44dbec965dcbdbea2d4da5e74f8d2bfb50ceab3a64cba6aed667edbcdcbf03ccd8d8a56d73c70c2ff62809df4c86dea21c485a0536f7fe6330adde1dbe3208f442501c6cfd05027f5fae41abece025084a5e4598a766114b13b17dd16a4c99f255 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 0c5719261caab51ae66b8c32e21c34e6d86ee4aa127d1b0195663c066497b2e9 +public_key = ad4330bdc85f4699cccd373de5e7f66e5530a73a42d10c9b327a57715539eba9d30873689f47bf697ea00c6caa06e4b04a93fc865b692943d3cf838ac186b453d77088895db46e63b1074a8e045911fa92db578cad284642bcbb44f844c6663f3f4c98cc8acfa1a96b6df57f5cfedfc76477d316f4577db2c79667244ed76f74480c36f7a3a44422bde22a5d9752a536e95ba97e85aebcafdb4b2bebc55bcb95fc76ed43b9815f36cdc6f861fba354fd8409d9e12676e5811f350acd5208c8604389b2dd4bdf8fc94f432b41632c4ae1dadbdac54ceabbcb743362725b839ece8add4b7796bdf5271e39539641aa43a9c185621d13c33c579189244c885cd47bab4187577c97639ca4abc631eba5eabe41e11b6aa8d562449c3ccd8757503a7ab358a24d2b36f3ee7690bf47289de123354b6dc661f74d883e16e3c8886121b893373dfeddc464205bedc16b9fcd49d6bb9a6cf8d6a176a43aa2be3200d67ad1ffef2f83e86164a6fab968ea14f7c835d1c59c4948884648a7e0d7976a5d9eff78b5b7df2aaa6447d54b1ad3180c4a886b7d663e49e8497b19be8e98f7ff9815be91df52a4583f2de88c0d7bb10cea4d65bcef59683db4ca4969a9b57ba65e079d8f7f9f67adc8c87e8b8d8d5651b234bc9feec65ff4fa51368a051f53ea9fe00c25955bc39b70b36c67484f8df88c2066cd2a5339c57eb60a1b81acc5922e274cea5ad71ec7ee798f41ad1b7c41ebee983fe2e27c770e77f0a7e67dea4ea1caa5fbdbbc591ef78019c67dd194f59bc873f045607d1440bee46f199a7d2274b4e50d62c064368bf5c6d60d46a198c89e1372950b7710b3b6376caa9bd3f882a6b0aa9b7fae86cccbdd574cd8b417047d30e4ebfcbde19c9d9142363d308ad06265a3961c9c604a7b65384a5dfbec62ff5f66fb3b774db5c4fffb8ed488f19fd1a10c3b5b4fb043965d4fba6f31c9dc5a9aed8b29a01e6ddbea4ff5ab6acf77a6dafd38f4f2283ce96f88cb1a9b99deeb03dbbb0e0854732bf2464331f6dc70e8ee77158ef36b6bf6ce23e649e77d46e7946b85593b2989bab4ce5d09ab8d745a64d53401ccdca4855e55cfdca59eeae5e9e92de398d9d65dd3b3f7499cc0ccaa9f9b2b547c5b53722b50b21c7bd2c3c7f68ae5be8371e9d4583faabf2467a4d5365cf7e9fb8de8a55effd0b71e85b89c83bd08e8adcb67fc775a5cbe9f1aa453b59ecf1bfa8d52ddcc499331de7730878afdb14778052cba5d759e21a8cea65d72505fbf26cfa31d8be17a4377f7a461ff92882f1ea4a9ce37ee5a4b7aa67f712838737a96faea89824ea1b51657625deadbb650bbfae698267d324a3cb1d9933be8bc95d55aadc4a8150fd2eb07f5fb0f4763563e2656b028053cbd16b32d2d45734970280fc4b453a277c3e8551c8b732378e3d7bc32bedb5ed975ab13ffbff647c644dc2d5c91f69ceaddb447000eeefd5cdc9e9f5111948f001880b36588df16cd1b9bbe85973ce513662277f1476d34037ff73fb45f97f65da4f6e5dca4a6aa06c5e9cadff727775c8460871e827c98c8b87e7dab7dd04e3fe2dc28b4392a6e0333a77cb9400978b60b0da76606f74486c60af452ff9f452156961f2467d023d72f1c4cfced8ea7885a75dd649527e7851fa1ac73f61a8eadb87d8dedc89b64e67dc2a8b25d98cb1ad7428947fe48fabe360495b4a7472f3c8b7f877280ebcc6019648ef960ca23a1c49b684f947460e96f0ea4e4080ad36d1f7900d84665768db52a8ec05696725b3dd82498236d30b7189c9beec612e9a2c65c86c2a4f6caf686d6cddea0557467aeb04f8485a457bb83dc68c5becb01e7831e476454fd84444e51fc0c9ea3c7d81ffddb4675d48bcb8fab778ead09dd25f54d8f55f382ef52b248fd050f8378e7cc7b3973cfb776249857cd7eeaf809eeb8d5b9f5e9d213bf7d5fc9a794d53e3f1df08aad5a421a540b36aac5d8d3c8f5cd721eff176ca57a7a439dc9dbdd7eac66fd470d64e88927bf3d2640e5a3a45eadf1f876562fa7c6c2b37be936e39396ec5f0336a47ac373e6874ec53fc909de8578d7675858bb1f91c7134c4b8432f988fcf6855ae9d49226055d9c5bff24ddf3902db516d6600fb7fd8a6cfd07ee613dbb7fcdf9817dcf99ef36e4b6085517cca4006876de51659c317c7c9d15b2dfa3cfd29db64b6dee0f6e53b6bcee0ac31c086db16d +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 0e59f6f9047c784c1f00b24454aa4f1bd32c92ae7e626549972f86fab90e7e89 +public_key = 2bf6a6fce45eb9d6a0401e858433994f3d4b2d379c43d4670be6c9d65a61e50c34ed26c67f7e6933cc5d9fbffd14f86e5cc54967ccc82e45d6efb8cdf40c31f323e35b597b3ab7ffe84bd1ec88a97f3f464743e072a4f7109ff16f1e688df6cefc2a9332243eb85d59fcecad20a681abae7402fb36c7ed91728ab92efa891d24ec251895f4c79fe2db4b2263e14cef4d22a38b9d14532f08df384778c8b99a4303506d08303bab91d7ed5c69adc0affb5dea7344ef5ab21a559cdfbc3be395834b4b8d8d9c4af6a9ca37a34fbf05669f99af8bdb3237c98f999dfad77af6eb353c671f674e8b4f94ae90f293c80ebdf5db0daec30f65cba37b0df43d78a8fe6ff49a9f464e7ff57680e745608e6f815c733bfcf5e52f7ca32573370d5d0559b64758537964feeab8f82d8a90b7a885b046dc4ca4f89528f0d189b874ef46e4d793fa94c0211630f555e0f8fd6d116acfa35c856f87913b06edbdfbd554589dae65a2e25341e4b93916aa4b7397e4526653e798c11f24563c3fd0319c60343869579b74f2ba9ddb03c6f3479a0ef3a5e508d283d69034968e2599fc29cf72dd6de4677febc19ec0fc0adaa2b56c9f8cca6ceaf08b5f3ea6b4da4907c1f49d780d5ad4624466206594ccebeb1adfb9cd4d7bd27f428316692e19f29fc963720e65970471e1b554f42fc1549ae18f94e69dd9731bc8c49d2bd130287024c391cb0f706569efd9755ffc2a68d36b7dcdac3a55edce67e432e35695a3987b1d5aee5eb3f935cecbefbcf53eafba9714ab6a4a46a07950b6477c313d67e0e673fc6cc801af6fcfb59a01e397f944335efcf6002889b09af6338947dcca758eac669929bb4d6d8f996e812e06aa61f5b8b66f99efe95109d57c43cd66eae5e1bd868c2c1d7522043da8356f618cf6f718fb088f34b435c478d48a53d5a369f7907defbe847dc0ba7347707b7ffebf5e6bbbffa85b5923edbba7269fb7a9799a158f9806bc3599f68d95e4134aab1dc83d416af35ef49586133de1ba59b80aeff5493cf9dacbefed4f4b9a94b3daae4235756833e1bd7dc49e75d90a97e37cc3f741aaff2d5481d7ced044c6a551eb711bfa828a3cbf23fdf6d2345dca34e5b6d9b03e9479faf589eb0fa12d2cd3939935e9cff5d8ce8535afcef16d456bb58145337e81f7346e057bbb98a8c0b3e2f784351ddbe1a1fca7985af443c4d9bb9d3c3024b8da9a8b6aabca90b74a34b532c00ec7c2cec7ce05bf08c5c65164a01f64c86797317ecd3b2d69c26349df9f5eedf4f4508d8bd3c7b473a8ee95e8338cae5b89b8546578adf9c0ac711653b1c8af4bb3b9bff0d6e2888ce2a3acff5cbf920313cf362f396eb79065cbee854a8956f7ac2143abb4136b078fbd01275506a765175c4b7648a0dbb875e2864d52aab697533512164be2659c5725ec4af898d689a861a7f6417ee0faa69f624fde75d3a05dcf7feb06dae63df6c11cd1c41ee8ee3693a7293f4f7cc4d9f84ec37c5f3899da6a58afce1855d5ddce1f0a57789d423115c59228b96be6fd68e9df4bfac9f17a7597a492e68eeb65d8626e568f025da4593dec6205a81fe74a591b547be8427667f3b585d3c3b352478b304c39b22b147bf6b5bc48acfdccd44ca02d6b7cf58fb3faa3c899e524faaa88479b0d4d51deb63eab53822f84935566ab7978c1b9e5cc043767c109bb4663960a534a750cae177aa33315584148e38e5f648aaa5cf0bd9f5cd58d008d4c6aaec85a34fdd63a997385b52aaf88758c427cae5b0574fc230c8a028d938606c6e14651670ef9a35ca3855657ac1b3678ada15d094ec68caaf90cc1958ba0dcdff169f3853f3b7d56f4bde7cbfc1d7ec8c4c95299d95873f89a17a4583bc9e98f0f79a45691a41d7ba1294726a385eda5e63f0bc3c609c01fffd1c6addeb76351903eff157f33157e5e7bc84b75b6e1c58ecdf858350eed495d2cd20228b0056f4900d3d0ce0e8166fb4dd217cda3c792da49a87a3bcac52542f3c3f43f689ce6ace947ae34aa7d61c93e34ad5fc92d97a458b7b38dfb7f42476b6c6cf72d8ed65f5e59121484d4a541311c97fca3488d13b1de64610483cb3a9551cf4a3318ddc76766c777f5f6595539ad17bb6c184aff73b6c4eaccd6ae4ed2beb836975deeeb8909458146938505dba5dad77c1a3acdab128b36dc1e94a121c545e3515ed56687f8911eb5e172 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: a3963ade17d69debbc358dda82c7bebe2c39d25b36813058e7a161542e3f8c2b +public_key = 26c68b1ba4659966cc95d79852fd3e029a736c3b4809f9c366093967c53769b4796ee76b501f77f24d7b8c478fc25ddde74e5c2a33e7283d3c872edaf4b743aa85b73e38b41c8e9022bd7d1ed5c6c28ed77e9c9b6a678d67b94958c66921e9cf0f573585bc3b483f3f32979b91d4e1c9133b3b9bd31a9e79c6f457f106be430ebcf3de42a58e4c5e166c1778dfdb3ae29699da89d8d2120585951a9051fccc4d5fd01346c9add97f9329ec720466f95c5591bdcb8046a470cb50a47e6a073e35ea5ad21a2e7b4d373efac8625ef44e5c0761bc14d4f4ab87bd8abb069cd7da5c832de7530be88532fbb5d8eb5c6023a5f0ebeaee3a50d2864601a579e6dab597d6cd2a2d8c49fd75d42c6b27aa3c3cd837e224bdef354e20168c0327fa16973224e5dcc0ac7f60fc9b0afc7f39acf9aa5d9f9bc3abe7298303ebf53ecd4a69bc873e874a43ecf8fba6339f4e52e4399a3f0ed65be8e099b33a5087b816ccc668a75bed05650d37966d058d6ecbfb3b8e9218036c2cad64ebac797c77eead25ec121ab88f6c93962d4e7153e0a8293c64bc9789864f93569ca043b856c8412ad985d92d6b6e7485f1956d7f6e610407f1e76459bcbdc874e45479e67233137875d8fdc75d9cc124bc184a3dbfddfcbb08b98a1d3fb59c37877dbe59fda96a694d7116fe6a04f5b6745fd923dbeac38d297a5f1ac783ef064084b84aa06ac9c278de8ebf487cf43bbe6b85754eea4bd99d734aeb6a85ef695de93804da1d2583722d664033770d476096e561a2bd3e8cc878481ad15225cdc2dd719cee96b4aa94075cf9069d988e9b4a4ebbb4b3e5477483cfa696d21923792474ecfaafa7a22e9a8a87bdeadd8167fdc3091f97eda4737d18fac66e7cc7c36d428b9dbc7f37c22f676ce932fe0eaac625b5dc5d3a814fc01137e4eb43370b5b5bb0d53378a5b6f738c874dc7a7f2ce5988cf8112857a4bb4310788375d9aa0f6dc59958c7f0db809f688f774d805c334e9b1aaf7886ed5107c12618b81cbefa1258c4b11f3eeb67dccda9f4084b7ae3473eccc4f9ae0c7fc059926f25542a1ea8739bd186d4d4f30ed8716b5d2f2f8f923d6e3beae2aabf81a598c52228330ef93963dd85adeb6bec1d76969844e1a8d295964fa01e5840753c15674c871e990aeee1729e82f98dad9ee9792bece28a8c4df1da9b3cd43301037b192abdc6a4d99bab87452ee3c77a7f731d764cfb463a96c4018ed8d4537f29d4859e3d5987a3dfd4d94c796cbd5555fd10e9b8723a6165ccca8dd39741e944199ef291facdcdb453529960d95da40745a022643cd1cb70ec43da6e29ded04963ee28cc784e98914b5bfd7c43c76e4007d49dda88c1d8c4fe05a388f4ebd9ff1a394c0e547155c79ff4933a28568e27f1345e5eafab53b87ad78a1a62b114b9977465342a61aeaea20c236d3788f50eba35f8d36ac0d58c91198d497461028ebea1cca0734d61976a7aaf26eafa2be11f1bde5b835ace9ac1fda361048a9b0018d96c4ebf7d6e9af3299c5acbd449acf7231e931f7b6529ce7d605f405097afe6edc6ed2aa2cca7915fdcf543b4c8278f56cf49936a858f751ee17c8db18b18ee08b45a0f8f8bf93dc13fdc55fb468d99f8e07b93616da437b90a5b52896330c53cf4ef8bd3799f66ff8bd6fd406638c18c8c9838c555aacde5dc99a61ac330fc1e65493e571fe667f208689d2cd45517af836abaae47e84ed6d3d01a918733362a4f632644b9b48f6ed0967e6ebd5a6e3ca77dce604174a2aab6ce720befab3e480e235be7acec2593fcce05e3e6c65262ffc485cbccf416fa82aefabdbbb3c98c5a6a1f388a236161e7b82839655379d8c0145bdc27dbec33c5b2e437628b452aaba7f3ebc8fa83d147469d63eb8294fc3cc9096781e58d0ba64d6dd683791fb530f9d77a5c5648aa6cc034d6925dc5adff6d3c0afe658ab18b86b1eeac4ae35ffd427d4b9a8fc8db14bc54ed721123a209d67999d9d35fad7f3485ac50e35f85379396d6f0defe59c3a4cd57fab15b53c8f2e6aee06c6f2dbdff0d99543368ab70b9bc3f655830d7cb47a6fd7c3789ddc893ab1aeba4fee706adf49a594445135ab07ea902d9aedd178d88d980355e90d72b710cad8077fc868e86713be6bb4575fa26c73caa1d890413f2801b9c68de70662248670f323f4233c1a3c0937dc86f0b6476d12f426868be1b +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 97beafabf2c8575586487c7a80e8af5fc50f94b6051c1bc66a5ae9f66be3cea7 +public_key = af6c50f25fecc9ee532bc6afdfe7acf2a43b3423dfea7ca5b24d9ab10edefaa5a5f0e7b9a73dd6f1c53e82b5c7eb4f7009c990c03ea939faf70573d164445715bc5c80b3906739c46a4c4cf20f4776037bd0bd716d1ba0021d6380ce77fa1768e73cad8fa4777e13aac74338513c516715b645e3bed82f382a5db1334e8fef8e639d448eabd55a94c66a34eab68ddcaf1c756a4907bc406ee5aeab5320f3b9bbe84e0d885fb784af7fd8c1eaccb3774fcf39c8a24c59d3a7f8d578ac7e9f2a95ce8d6cab3dde23873f751636ce6d6d819731cf1b812a0affd24381a52b4f5fba658618a02e14e8d78f3e804e8294d8e032936559a77f9d0e4d8a3b38df8bb17b7a8c3b45b53ae6db0da9f9a21a4ae3039366f894b118fdb5f3cf2f13381d53827b5a568fd5f34e099d6b94bc1b0e3ddde944b4fae3ec5fbfa98d716b2ae0d98f7a033878996e55b8ff944a63a2cd3fbbd629d7125475bc09b0ab86f22cb4c9f2f8da00f9b71bf9705e3576b5a96f6229ba1ded6fa2cfd79cf66c5903defb88c1fa5efb0b2ac059dcab888fabe68fd9188bb939dd8bda24da0fbd8de0db3f8558c403d7f5a77aa1e0563a54a77f32aa30cb88df4e66f716075763e9c5d57d564fdefcdfab424ba970c62fd1091e93741a5e358cc7d73d64a7183d9abf8ddc6bdf10374eaa8ed193385b856af5923dbc4a0d41f76a9d661483aa668aacf5ec6178d4b5e7c1bdb8762b73b39f17785af94b356bdfee8fd83c2b71f0decd44cea9704a93e0e5752e99a2f01e5b6ecabc74dbd3bc19e038f5701659a0d4bc693815d80d6a5c82bdf73bf9e4996ec461c47cf496cfb235f6d3fb8ba5a3396ede9a8477611c8e4b76d5c8191ac1c829dac4cef065ca4ccc879d5f34bc4479a5c8d4693d8771b434c4b8e8b8afafee02ae31ea5eded11c505e2f6723fde1f2073b0db34d11ded4b0cf656edd53e43a8db8dddfe705b0bb6fd980dc71e844e27c18d77806cd8f9fe44e5d448dd59a085776dab69e42ebde7e8ccfc11da140c5db51ed9f233aacd3da972ab4df1e1f41d718b54c7dd9d3daa090186cb167c1ab3979c8356397e5985034f2da2935edd9c8c44b90e8d5d4741e9d26e99576cdc3293d7e2017b515f33d4d38f1bf44e48088db21d37fb6cc304a3f4eb12a42c9f7c9e086bd0f39a1959d58f1d8c8f0739c230beec64f429943d80ae732b85daf74bd5df6b46e0f27b678668f955dc193c861e7e38d65e5cb05b5ff63bf9d21b4b33d34771bca88b3149aceda8553c5813bfa6f8a99c6577defd6f4ca7e54cf80e48fa144bd996bcf41e49aec97734687a7d0eafc7133edd94ec8fec9a8fb686a7c08e207be6735d6559424c1ae7a5a5f15e5a8074bd879c1cbe6d12a3b5a7079bbec7ff9de7676a876c02f26f0d059d5341c95cf6efd20c4ca11f7c08684473b3e31374d760d24b4947cd269ded8a8b96f699634415bd7044448090dc6c3d4bbdf339c47e9b1660b9ea039bcc6836a6fda9489e76418047eb3e99d40aabbdbcae4032e333dfecf2cdef1318aab0a1fff95d3eb12abbe67469bc34ccb88c8a0a965902e47494c8adbd573910a97377b764ea7443e73346ef9bac03777e1db236f8abdf5dabd9931aa473bdd4b352ad0c5d3b969134f04ce745f77f13805fca47a542a4fc1078892ca3b9509f435d96fea3748e0b12393c8eab18fe7b6f3f4ad7ea88b89cfedb46338adac93914d674bf5fe6c2948fd659935a86692fd76c80ff9bc5874fc9fe4edee947f68b0585eec218b776a43ff5aa351b4e9f560b4f34628dedb08bd57f5342783f49fdbef036955db0f69695a712ed852a35a3de876f967cdb2c2038ea1ab7b4fa7d8c5849dbdc6a29e734ce8ebef458ed9b755af11976b73cb6c8594a5df3fec44c6eb9e4f52810d7ef4ec4ce3b34beb733cc74aea7f6857218476aecdf00d96658c8456576666b6d7c06ead366329ee649457d298b81b06778acf85af25eff4b97239c35ab8688a8d6b4469fcc7e53fd1d5d57bf3cb98c883c5c9c88f05555674e7a1bdd59e403f7b69a74f0d5af50aa89fe1359e5724ca02c38785ae4690d6fd891364b85fada814d2128c623d0839a1fd9bd0e6a37c7f4070a435674ec5394e5f2a97701c5492d2aaff2823884496af9edd6703d8ac2c17c4ddf5561590b63ff78c4995a31a18d861a91c43c5dec3705c6112d81b81555f7a3b432f +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 75461decd34c50d6a094b4a64fb75e5e9479f8f9250d82bb7d729dedeb2d4b65 +public_key = 822a87a23fc0b9e3c13bb45e2eb5bb47535099e37019b3c7ac3b81c72f5dcc654770defe7b8ecc80c9a508f5d7f30e632be9c1bf27317fd97275cc3f481bc7c6cf5a4b1462767a42cba43b153cf76ffc8db55a96d428f46e0bb7d6ae5f0d883597e9579d675e816b8333097787d6e3cbcf9428cee739e650cfafca8b198c0158caee9971894b67332baf761caf89ce6bd11c9f1dcace7b83a6bed7ef0ed9bc2807d7c39bd5733eb7c43da4b998980387f0cc98f45f8982daea502ae3de316cfca477a3f055d84356cb81184ed90734e0cbc0d1553adaf5a94c2a6d8b5e566997c735bc45fd4d8241357da2c38c8a15f0fb5a33e1d5c06cd8dc4f9e314d08599773f32517b501097e4cbd9bf814a0cdba619d8ded249c933d143bbe9fc1647f4b523bc05568a410a5f380177ff6084c6416bc22c637b8eead5873f4103677101a74835c4255b89ea1935ec8b838271ebd4de9e931c436f9b9d9af4747dcf8e1a2ecb63f046b412af01d1b4f1254fe73d7703f2f896b9d47373d8453b946f248a6be1e800797886af555b0787d84daad7883c0e583a7b663dc7d0a855a9d6f0f4f3e9e6cb600b9917768777b7489dc173fc67551ae9fa26b054ddf13c4f83b5805b9b7ba8f95147eee171b9ea358abf9054de00f629a397489ecf13705a9b86735577493b86c326e857eb816663ece417cdac789addc813d80385ebae32f92af87cf8fda4f2a9e418948c0b4f54c19163dc5be95b76cc5def67b5288bad948cf214cc6a11c6e1bbea5babe501baa75cfcf3531cd91cadb8c9b0f415f8e6ebf7d8422dbc2dc2f4b74caeb843f7c8b25bda3cb7127f5c5b963cf3c9abfa15c952bdba2adddec9d377a89eab6a96a65cfba3d722b661836fea78770d5fbc556789ce5de3bff1fd65f0333631f4b8466df462c64443b88f3135f585a3b29e450c1dcbaa7c9e81133c9166ffa90f56e595ba11ec3327e6a83c8feba59a5ec4684995ea64edbb345137ea878f4fbe7d763b27cc430ab6b078e73b983e41e0a72cebe85b273d71e2da8f5a37dd08ab6ea8af63aedcac189dd5583d53569addc1731a339488268873d89a1490b78ef4d4c2e93f8004d44cb55f1a68737f195634ab659b919a94e268131daf90e5975641eb6273b5dfc2c3adc2e534609cb2fc553907ae4d9cd79f497d91587943df49a3adeb465a5fefae34d33fb9ade56cb6ca9cfa93fe458d9940d4bb5f054f97d4e60a2284032458bf909c31e47a27c7aabdca8e5f1ecccadd6f88fdaa6c13e6f2cdac38ce89fb31cb81b673f26e5709e08c474cc41f213b0fdbc556395ebbec682d915ea5d68e48b7f95682ebb972f4215dd3e8b99d21b98b9a0a87dbf15b4921f5bc07c6ab6353560e6e814ea3cb2f7f3451d4b074e3f973d918034e3521441da27ee6b7bd3949e84224ec87ca9ea4157b428e35ce499a806efc0954457582b6a905fc4e20fbb33dbd1d1ba883ed4cb127cf137a75aaddaf6863ff3742cd7b027a1894ff0ca9a65585a5e0c0847baedd1409febdbdd902504785f9f70173f8c99daef3d2bad906b3cef04a3599bf993bfc5882dd533bcccd15ba1aef877c3a565cb45fb7b8568811d8fb828b42d46e2473970044c6c4a057f18fce3dfbfc398393c19383604ce83b02a461bc9b8ac0969e14e79e53c5a8f54a556f542190f4041137449dd8401fba8e4bcc09cf3b91dcf8ed9bb700cc74524cf51ad3a7c21f43398f85c7a4e38771fc0c76a43db3ada379ed1e88480aa1a5f160db2a17b5704299d5639b4789dffef34bcfd548275df6c476c50fff8851f29ba5ad66caf066ddffcf140dc97b93d77aaffebb4f87aa86ae6a81d7e3597a1bf4a5be00d8c14bba230cc95e617ebf0e6a25607566dadd8d725f23c483dfd6737e26afdea59deb66d6c6f3fb8074ef8bcc6e81166a93da7626d4f73157c47b6afadb1d88441e76ec9fb6efbda9fd084b496d5635794aa23a43a8c4650e05bcc2f4e5d775971923bea4474e1fa5fb7e564d091a430892d67c10dd9211a705e4842789ccf653bb919e742b65339aaf4653e474c10583d9329cadc47a6f02d58967fa2e6e4ad68dd3abdf7ce1dd9d15ba94ed9c69220d63b423cb5daf465d5e3a9d29da6c9d84fb38e41f28990969f50d58e62c68b81356db04a88e26e5bfc4514d83cda2735e3d3f1889578b626b002cd859ea9ba6fc856a8030f6010c780 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 2607dcf4fd6ca1c614c21b5e37c24981c32b91c8c3e6955777da8a3f5d9c9335 +public_key = b9d8fa0dc3efb3c6458ef4c21b5663ef7795f4c36ae77a85ed93d4a4066c4884e323ebc5e505de50b7d4df2d6c4f6a571abf7b8fec3d95e77f545a7f78c57a953fa32984e15a8d8d265f32d4288032d658bc483d4afc3d6ba94f8bf44b347a8fd4bb7e2f5dd0dba9d9c48fd920b4e0a479d5d3a34083c3484cdf448f33fed825658a9bf5d99c995ced866a18c01274607ad6bc0154a4fd07e042768a5ca86df42e327b99d94383648a236d8f74bd3e3854b21dad8d24d3e428a73daae3cf29a6240c30cc53532e7de52ff560d1e3c3205ac557fc76bcadaf547c69ea8e9d1cb4e2088a8665863f64cc98f3853e2dfee5c4d3d80f1df5437e4efc1db8f51a59ab954885c3e3b07dd0fb9cdb23bc59ae73948e8b30213c84240d9847afd0c8d3aa1f78e60963b4dec95c20d8f90783457c06b7ee6eab1707770969e416b4f2e53afafa2c61ec4932df188a4a1cd56dc854acba8ace5f98a6dbfde04c7c3bc7bc734e57fa2b9d01c9bcb16f4d79f5f988a4b783e8a6d7c45115c548e0eb474368993da7ee59e96d5c2a9341c4df461752dd73cbff7543031caf380e30311c458684a80209565b7544389f6bb20840aad3f9392cbc508df2efbd3580696b23abf993c9927f649aa838c4e897f6f9633b873d977e85350cbf5c140e61b7ddf98c03bcb387c38b4853cf8f58176e75634ed7f3d4c5a5bf66c9978154f7e0f11337f05986ea2eb20d2cd2d0667b43dea4f19f31d7d8993263a2cef7b3e6fe53aa79ea12b7ad295e3ebb1f3946fd651b83cd36099047b997ddd5e28335f13875ab7ac39b6e969693c4746f19a15abe9b7a1eabf45a9215f5c9eb06dd47ff54c37f85e959e486773ca0f8848e23bc16d83155d3d2d0f4f50486f2278debb3a446316b919996db825cebb5cbfb4f535e74c493a80b3faa5b635d653650cf41a3ee366f4afae40ad07e76f1ef64428ffb6c87ae883bbfdd04c6e0ffea3b48e88e6083d05e38ee91d65ceaa9d79e1846ce89c2fffc8cb38932c00783ca9efd2609ea37e6966edf642cceb494775f5acb46ddb3bfe70c62e30e8cda9be6ff86fec394490add34c27ccafd38d3e4f392fedba006d672021a8eec76cd2c6bef2bb65737a5369365c8ff6231b78669743de853d7538b2782569f629c88e2dda74b795ccc56fa684f8f44a5cfd4c1bfbcea4ed0a58cd2dd13c5af67e8094d42e9e8d9effdeef88e66d5579fb18dfdeb07b6708c7ae2757a005dfce329f1040d59c37ad14e0de88d59c7a7a7b1c4ed4bfdca8ad4697bc2a36b5b2e3900249ce02a678009a4c9f8589ccf4810f6e1aa4fad469afae2d8af0b3b3a7d84efdaeba89f3b6c1fe3d2dae37f2d54ba53fb78e14d991f4c468ccfb6f527cb985a9ae19797cf845c548d3d14bf67c803ef448f791f0a7ed27a96ad6d9b40c8bee0bea11d9cf44cc85f4b79f607e7ff3ddd5b070b5e8f4b7e0ba56657434296caaed49f8f32e5f6d00f81a57960e5c55f6dfbe636494e3e6e8d1e4431fdfef5adf544b929d4cffd45f2dd88e159a6cff792005f82386a87277953b4c4ba3714c20bd5de05cfb2b628b148dd7292ef4e18a6906b63d03a3e80ee1eeb2c458d7e3aef4604816a94b83c93c5160b740e3640707a4fe9ff65ba45ef50ffc7fb75baf8a8df137bfba2f8ecac4bf7c2653c89b65ce236a3c1cf875acef275c4cddf6ce4c7b69e951bb30459b150983fbc43ddb7dc32215fddd5f9f8ef69d5a79adb0f2e4bf135f765646f6c657aafdeefa785e83c1ca3bc7f61a32d5e47dd6424aed3203532556ca7fbf750d1f88ed696fed02489bc3dc976b4abfd1ef3583837a8db3f6a38bc5e9a44aa9da471cb3e380b4508ac4162b4d7408e5507d33fffec823f9ccf17bae50a5bc7562a4e3f85995444c788de690143f98ace5fdce4b43b2e5da77dd0525ab32f6bed728846fea3ad2c19fe282fd8b6f833e51c701da8854b867e0cedf34a3c9d991e7c58bceac9bd5f5a0df8b4a78e9487eee263792cb891e9d5abf17d6f71fe49482948ec6f48be9ee210765f93b4cd49daa19a17843f6ed409d6638dda571f78df03be7183eec7eaa542eaadf75cdd80bdadc793e3e13e5f4598fc9dbc453a066dc556e7bfa3856570b570a1b43f826574596e5be518dc8acdbc7e99a67b9ebb9b8cb821f4f6b843f7542c5ce12ca13b5b7f6c716e63411681fef0ff85e8cd3fcde5abdbb9e4 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 38c89bbe7145c29e9a831c11431eb9929cb24fb4992db20737e4687d397fd732 +public_key = 36df9c0e6f63da1fd38934dd058974e97eab8e43319678df50c7b88e6a3ec8764b4509c3764bb4dc4d4a8ea3f413a3ddadbb5c5e6da01539763428cdffdcca2ddd554633367bdf45e069bfdb397b803c68c854358368ebfcc9bb1147a2073f627757d6dbbda015e7c57e244b134d6b0019d250cd6181ccd58b466ee12c3ecd1a9840eebb030774db93eef1cbf6549f45caab4d9954bb02adec6bb66534b95cdcd9fa1bfd75be8a949829558cf6f5ace38b1296a75058b9a309df75ed4ff398d106869899e6844a75d4b9adcf99ba86c72cba2656473aedf220bfdfb51f82828da14bc570504ad33eb379790a45809f77a32eb7582d537205cd19969149ab9d2b87a1935db595186454c99b46ab8f033652014f4b4ef8cae2569ab4ccd7b98acd2f5db0436d32f967354d7db6c2fea1e03f406c296b0e9b80679d4fa2184e0edd4ad6cf7f9ea5f774bc82a923ae90888613144bbe376b392efa836b7d6b16d6d25abdcfcdb471a834ff2dadbc78a68cdc5619089ae5fd9b32947eaeda996adbcf1326f1bdb99173063f99fe380b3f4f856f6212f8acca44f05299399f6fb32113d191379b8bf96ccb336499dfa8bf573f44596d0dc9f7932ff026c6e264693be3a3a7160a9e600cf0c0897e607df483d6c81f48fe3e237d6709b82056976def3d67cde3ea48cb56d78d12c68dc2cc6fdc7aa1142548e1a4de3d889c71e990fcbe9d50adbf892b5cb873ced695e6e544bcc4bac3745fe5201c617767757dd3ca2b0a50851dff175995abb6a7b88892d07b4ac68b974ca83f148fff028bad4aa9400f0b755fa3352d9d673a44be327845d1ececaead996d57b62fbbe032ccb6eb9476460af6d06495a6577a17e7d7b11c3e8ff8f326efedc2997d0ada9bf85b45d8e5431ce5ac572cf53754e0909eaba1bf868d7d96c93bff53fc5a0d996cd94e4cf33dcae4c5805917760714dd871b8b1eaf8837c7ab177369fd3cd5ff4ddda0d84e97497cf60ffb36b966b597f2673dfd207740d47c8b20eee8ab49dcd5ba70bfd9a0bf8b59d15be65575a079e8fbd00bedc015340a2cda0c77c7f92fcd2999c6f10b5aab063181775b804fb2fbd8e3b2fabbfd76c0a5d4942df97c449cadad3d3ccf4790685438258ad09356ef581c981bd6e229c94a130372aeafdd2cfa5cbec684f8986a7ecaa94275814cecfd7ff4d3c933bc0038b18b28cc3eec9ccac49bda2fc446267cd07b786df3e6012330af7dbc4a2e6fcf6b4c7ebfbbab65e53f3ed89d04c3fde934955ba216dd47398ac173cfb1a19cd59728fe88b3f7d1fd968796ae0a03772adbb407bfe0f3fdd48115e3f0a7e2836c45cd1ea0d8c8433c8e3e0e8aa380dbe66fa93962afb6775f87aecace40cb4caa064f6b547f0084bcba7856899bf21d46fc9de766c7d447bd1d92543dca87a8379ba944323c638f33b165ee3732bdb92a134ee9d454684387790361b31b53c245328cbe9185f9774e2764fe4f9e12efa4852bf22c4a9e504531fda6ffc23852bfa3b4632aba9be4595c05d93d64522ac93b41c7409acaeb83ec51cb7aec0cddc24e35cbfff95088d7b6ec99dcb5559c44553dc458f2693af43d13fff75c7c099e4d847551161d52c6846e2f5562022d5dc23dbabd9483dd8fed4204fdbabcacff1aa93d05a2ee54bd3a9e86bfd4978a7a76d6df4008fc55ed4da6bdc899ea0a69cb2facdf8bbd14a5cfa3ad65887f8427865a343ec60e77b5782c37e79561cc7ff195656d8facdc8c2c560ac95cb0b98600ae784fee7554dbfbd0d332645958bb68cde66be3d274ba9a655bcd8d72d678ecf556c7942dd0b94a94377dff0a5a6fbf87da2c3f3612bc47190c9a88d4588d97c099dad4b3b7377867a6e68869febff58083cdcab4eaaa798ea11ba7f6cc4839ffaaf9c579608e37adbc4c17b491a69f55e61ba078a9b4179cbc89cc3c9946c65efb9ca5ac5765f3570f673ac81ced26b5af8f13e266c65b4e04f07923af49dc6eb4dda0eac745acb4d2ed4b9b2de754bc3b7a6b54c2159baee1f560dd6dfe4ee6b3a3d6b4c1bcee06dca9edb6775f5696d09eacbe9f93be7a82254f34de9869b0beb26973d0331aae6c9332850e45eb16b016f87150ddd020e4f9f85f31f74bf6537fa936f4d4f0d57b79c6ca8c25cb7c8bb89284c4e8bdba9eb33c0406a8c39eb0d5429fcae286a9c56be5839c10ad33e8a58374dff41feb +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: b2c35e33c72d90182791f0e12a0324f5b216efcab2c8da1bee025dfbe13f4152 +public_key = 359f51ed1f3ce574a5dd6ca1d14a967f7e77aae64d9678571d7bdb0769935a2afa8dba53db6c5b7077f10426c64f53542929b31d565bd25a480e9d65d79852b1fd5002964772465c3fca5f8307308055603039b1b577f6efbdfa8dce9c5a04e40afe45001dfaaee3d38c17911677a2641f42281cf3ea8e6185c75e5dab43b5bd4c8777a3582e605abbeadac8f8f274dec6bf3173f6cf5d37ace70fce5a06f208ecaa540ba465a4e81ac9869517502aa73ddedc4131bbe52b53501dd4aabd79556486d63da48c4978835f2850109edb787e525718dd872473554df3994858533e4598fc6eb1f93feee6429eac96d37c8422dac30f473b56ebddcd2c64f2ce8f91a5de7984a88b63979c4f4c6d4a36231de9881b5aaad7e5e426a6976a3010fe71a29778c83ae52004fb2f1be0d36d35614aee061e720087be146ac9f0cba2c29f9c0a6dbc16065748573d61fbe95de53ab9ec802d247b210b747d7dc45aebcf3a2f9e4b938eff354fb9f65cc6c5fff0163494744848885ee587d48c5d6a962efed45466252783a50e6f31ef9b1928acbb44837a7f3d51bc3b59b6fdf46ca75f64bae27aa2d9456c67ef997b58f7504f5004e6884e296e18aeff7e387db55f681cc3fe72175668a7f87fe9c3872f325a8c6716e5a767b6f6d98836cb779983d3ed190fb0e0bca04bebbfaaefcc034f9f987a31f83f74ce63f0e2bdcff8154da43ebe8fffecae8c5038aebaa4956b04833d4928a1c42e47257dd24677e6ea9c69f413fd3336dc338cb13fad9e5e4795780dc33bda9b147a3f3f64b46c933b7f4689d2797e4bdf4df43cd02b3f3ac0e781b7e8c8e679c949ca730826b3f7cf8813bcf4ce7ccb21136695c75b3e0f8fbf6ba94f6ad6115c72bcb879d64cca2a3d9502836edab5c7b2a79a1f2fd4161369c5e8b63dd5e3d0aac9fd366388fdaa2e736bc09b4dba05414659a6947f64baa8fb419342e9cd63ec64b28663cbf5eefaa5a6ae5ab9d56af7ec4f5643cf08ede6d7a8d2aaf50bcf7be274afef453dd176c46289ec249a817339e42d0dba332851e51ad1660a47e35bbf399dc23cee73dfcea1d57a4837975c14269707384855e897cb44c4bef532a003409aea41d2fc889f67fab21cd40993effc1ff2cd7f46438a95fe4a6e335ef689bfcc8c1963e395f6201aa9d3bd963533b2fb4faf59f6ed53c4bac2bcc09e44c5f9c4963525a7c025f4410d749f9ee873a391f723e5d1fa60c806390fb3aa80295e77f8d158c665eae6e28337ea1997757e5c4dc6893ad71a63a1898fcebdf165db76e35f665163d16d9dbb9c94f3cf9aed371338fec4da383cfc3f99840ea96f99246044f4a5fa5cbb8d7473110b4a5248f55e5c3d43463b055bbe473eed2e05812dc46bcd539c57ae5199cabe5029f20dccc1a828a5e0c37bf23da6df86fe3969e5654b5bcb5c3eab7e42e27d6697b9914a287513f4d7ed376354697144b33260eb966316c05dca8656ad436bf47967779d43cca5edccb933ddf3351542867f68a57a74c4fbd8b88d9c289c5543cc3730594b3ea33de7ef3a570dae6a68cde46e4cb1b8dbd8cf379c1834c349c55fa73859c5a3ad45886286973f1363a5a536a1bd8faf26a939179f873cac6238e26086856947fdcc744185a55fecdbf620bdaf1ee7a50dcafc49636e09687f4618667ebe36bb39ef4b5ce29fc763528f72062eacf1d67c71aaf83d5efbc9165d9f883db9049b9848ea451fb659a3e6cb39986a9c3f8c069aedb9b5e13b82f3abc0c1cb70dcfdb5d1d66ea003676197c1be3ce5bc6533a428d4ce1ce23fa55a87fa344d95daf4f5b130cdae371d593e1bcaa1868572bfa618db9f1a0dc45937679844ee4263c70cb94a9dc4fa04067f7a63e0c606bd7ff661ef45d8e6b6b6373c7ba0c872b90e9676263bfa1f673c59a4c51372a2da8603a9f22654518063c3e2fd7cc6c93e91ac6b53f3c04516b76da651253f5c59d436019e923d1883977a52b328c0d508d0f039696db843bd1fc506c5f1ae34c9bade45057f93a6eb99686770dd587c92bc65aa3a4083c4de90efcf891c515238e7457efb2598664e4368775572e5ad3a9ff53e307caf081ca897dcb4316ea404c689d934653769ad59d68475a8b0e7277bb38dac77ea7b1a1b6112ce574c6358dd6a472c49c264965f8cd9fab7d1fd2c5f4c3a4ffcd66e5b05a4879536aee3074b69c3d4e6b1 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: afb7d6dc2b7eb6d84acc080c1be63c98afe7b07786b5801f716444a3e8e64800 +public_key = 6b5e5111cd76dcb486eafac9040ac0690b79f5278022f59bfd3e6494a782d933e0489c9f93f6e585b3bd2a2e65f75ea7017a994b35e2f0a5bdc8e77e9bab7e5cccaa7bbc779d445e5f16b871989974e9fd2c268bcf1d764d0e46a683ae56c47c4654d57ce8b4749d31879bcc288be94cb36fab79e6ff563249dd4851c74a7fe87f4fea546a565eefe5d7457882cf288ed294783179577ee898bfde8c9776dbdc7f6868afc9581cc13bebf63dbb414d695990ccb897fa31984734e3178e081856628bda4bbc736a235b3e49fb3996441198c41bf8cef5ec64d2f5c4b628490736cbbc076d8ebab4cd1ab4936935fa3aa40da4ee85dbd87755f0beef3f24739400bd45b2bd56d9ad9ebb49a3e4c7f09037c94a57d84604697185bac887f123debcf22888f165546bb699b24bf2620351362fdcf677aa7f767ca049b869137999884e3615e8358852cbbca3f90643764cb310ae6cc009766c43b89e599203d6344c1d81e97c86329dab57e4f812e6d3ab66d68283cd30f9fe3f7a898a7e5479cc3735f3cb1ee9e20e8b8c720ba35bcee78c4f6c413c5e89eb5483cbdfbfde3a30dd783ce4bdb1aca87e9dd00dd48caacb57c74b802c7be33817ab099c84f2dff383e57a759ac6eab76df67876e369ef32595a57bdf7f2087b63db7dc138cd820a84b0a4e1db2f84ac7844595dba820c31b1ca97f3e680e35fd1fe77e54b935a3639fb18857007953a848c49d0236406e7a320243fee64ac25cdf953dda02a57ac4fcae9ce373e348fcff71e60913ca55a19e696d782f4134db83958ded48e681546edffbe94cd9a9bea7b3f04f1c84a9107f4a75a3aec40cadf9f6d60e946f18f1cd904cbf9aedf305cd59e2adfb10fe667f9ea49d0de49d1d8bd62e549e08baa1ccc63b8cbc735af4017e4a099bc5a93a8f8ffc8cac5fb5d388ac8624fe6f21942675cb714f3fcfe6663584e3773ab5f6a2c405179995e04f735cc7db7238dd7d4e0bb5f9e7d7391556c5f604c38fa079a70fbc2e8b393306832fe2a8bca99ed891fd9ba7e9eb5df73268e408a3896745e43462a45f5f4f67084bda97a9a5324a2e23a714c23f2f4368be3ea521adedf56cb560a78786c2a51db18c79f25ef3743a7de67c43a35c63d1b70e17aaf4e4c48e40da73facd7bfa776ee8797f803ca148aba783affac2eda7c4440c589e355bf5c1117e06be979b2077d422a6d8edbc04225ac63c3705394c9fd5389c11855057572fc3d3ffa365cc2854a3b06f1cf6fd3b21bcf7ad9c6764f7ca1294c7c1dee38bdfbe18473d2be3d9d5fb9d59bc267ecb1fdf3bb97cfb374f7fe4ccd89854ec47adac60c1955bd1a5096f371bfd7d9f06f4078139feb979c9ef48bc0bb9101dda97198b466bc5821978c87da85c4f4e64bb6ea010b5fd99435dd28e29a6b379d3f32f75c8789d486ee3b6c85ed52b65d66e81c409c28fd4e84926b4fabac49846fd7b6f7d3d5e244e30026540a6571d3cf41c38dded5ed73d036fbf1a6e64d7ea62c9d4938cab91dfe2fc8e5f7a19ec20a86b163aacaf3ff5d1814bf2d435dc798eb101fe9bc04e090f894e74392ffad65fd1b69f2e959cd0a5851cdd2cfaa8e45dd867a16ba5b173711d77f355a71bdf7674299a91dcd5f2c87fa539de77f2551b6f4a986f3bf584a899e755464166c333de30e694616f76cc48ffc999536b7de45dfa5a27aa591ee994332893fa87acc2df67113f8a9c438abfa667022c9f842c73b15047d6ebd8e02a3da6348a7157fa5e04bcf866d58e785c10d049af83736b2f78f90adb16b0b7e897cb695fcf0d37c35191ad79a57cb41ba5a101edf4cb94b585466c9b8d2f085594646e238ad840d43487bf65bda0dd1f258dafc0cd4b3dbba70fd53aae4981fd6e9d838e8252cdd00ddb26914f902b4c28fe6578709374f2461b00ceb0054eb7868fdb2a76dee97f9be17eea3c9957f5a3e7593462818eeb8339ca5cb5ae83677d4d3ed7c1fb0463b57bf7aae0af3901a9795085b8aed0564d3755589ad82961578604ffadd179edf18f0412eb86bb3cf8f45f8ad75f437ba8b0c79d1cdbb748ee8a2d854644cb694668b9ce42f992dc43f2d8a7ee655be3b257a0974ad0659e04b6b4e9a16bb8cb79a42968ceb1cbbbdfc6c3a2eae35f6b22ac3c2f868e84475b4f3befdb3158b3bbf2d64f07ee186fc57de21c26bfcf6b645f83cbd47cef72136aeb644 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 28f5e9dbda122b2cf8f3754fe9e0c73a84ad4b0c093522e0b62cf815d60bbc3c +public_key = 81d55ab23e8e2d6dee7d56fcea98864e39ec2d7f7e6fff34943f6810bd6b09767a2cb7fcfc078164ce40dd7e51d869a9c785ac62c6ade5f7519e17da08269938c7796b54b4830df8a0c63ac24a6a00f7a0e7c65844eec1fe0ebd12df4ecf3c8b90cb803636d44d03a39fcca7e918ae4195e2631898f417c9ca6e805544da05f67b6f1cb7cc54e17bfd9922dcd7ea6ff286de6c42a7b2f833b51f7fce1c28a3ff37ab697cbd90d96b3e56dc57ce734f2be1280ac33f27db3447c07f99a68f9a6f1dac608336855588ff800bc7f54d9abf76b0eccb6da9fd825dcdc696cb911944df6643e7913a641ff369668fd7194b65fa7bedbbba94d22b512b5687722da6eededdafdbff727349e593ea3dc8a53acda55b5e7e65a8feba9793012d608094b93e58efcb8e9058537bb3cd51cb2c3f0e5a97e8365a1459efbccd3f603977274ad35855c4159efece238d254ba7334cc5bcf7f56726d77766cc21d6e7a9c378fbce786c1cadedde394869e19878fcbdfdcb098c504dc4b16b8f69d13a70183eb29b7e43220566000591982ec9951eeca4cdba8d3e78a6e8db2abcc9f6e6b78818e1894cc6e63cd1351eeaafa69569aeb95bb43c816ce405b4351b7f90b856c50e284eca0cc384a4551f455b503488313a341baf5f80bad2c97b9d3267492d3e652b7654621a59f1aa64ae54e0a1099ed8fe4aec1d485f794e61157c1563ca5515684db66eb99b76837af441139a0906b35553c9e3f3e7f6efc08487697574464a9936aaba5290efb0c0c6b058b791d94aac3bbce80b16d9ab36b27579864c5bc6d8288292387dc4a3efc889a45fc8bad636ae2bd493a5ab40142ed84fb57c6fd88c2f0c504d5c463738ba7c5a97238ce681d8aad673d7ef648748198f6fadc8fd6ba7ed4f4052c8a9b17dc572be36cfa86f199542b12cb2a77c6973494bd42aff0b55cb0f5ef2d0958026b7c54bd4fedecd40cea8470f738f9ca9e6c158a9ca6457d8d9a0649337a3ec7347475eea8c34e91f7636b3897c547c0479a1e22bb2f86d6afd97cabfee79467880dd0fc7b6f892ff3a7a29844476fa9843943d68ba4df2db6b8368394c6fcfcd257beff5b8b64e50407c552934976a8f4af105adfabcc53f936a8a59f825d6a9b21d8f1faf58c9dca2d739a600f68617cfd94bdf9207184607985e3bb784d7977c20ecd585233131f93fdfdc9ee25ec6937c7bc7fa4af43b3b1dc4774cf6f73bbd47373d8e8affeeacfb81845678a1dff0309a3c9ff3e0506e680f33422777df96ffb84c137a965ada3a57525a4b99b33ea8f22830d5bc588c0c705189b2e9ae9c446fcb50186b99b5a78313e301af630038df279987ec0584268e7327b481cbfc789f659530d9c5d9c8432959adf71741c1f9353d9a84836a5a5487392d19b5073a72869ba4e454c14ea5a9385e322b8592e8566236a86c6619648cee782ddd3749d9b9615fd9ec66804c64913a1438883efe7acb54d5d995d0dbe7e4ef7c6dac70914f35f5c9bb29e9d8d8098b11739b177d654103ec53e3a384e594a7a640629543944ae262558531ce93d28d794277d8127e97a91bec45e8b3951f5ac56f38d3ffffb885dd1c29d8258f828056509399960804e23adce83715d9211d56d599d41d748b2fd7eda154908838d5d3d3c0fa0a83750db73d25688c698cc8d78d144a80aba8372bf7c349b9c395bbb8adfb885906402ebbeea58b622ff45c4ece4c9e1e70865959665fb18a4cda1bffcd7b558f15f461f16dec40aae20b4468f3cd9282ab7b25f9b028746fbc9ab77a04f7279ea64dc43d59139c21eac58e58a492ef6e10974e6cbbb82af385c4f77e741fccb5194902257d3c4a4fa1b9d35a77db5db47ee68ceb07747b889a6c4814904638f9b36e84be3c9b0d8adf9f2bcb10d8e76f0346487f479e9b84dd28ce94199d31845dff16e4d02841f4fc92fa3fecff17e551f8fdc829c9cfa9ee42265f94f7b4dbe7b792cf44e37c3ca429ff70d3fcbe9366db59a9dd8582d6e69d859e51cb7c6ab82ab8e7854c7b5ce5b1557443dcfb1284b7fc8be6e425d07427b5aa9d9b9a0fed47956c46ee4022374440c7d415b896669e78d3c98bc4f3bbe904a470e4838849bccdcfceda8b9bb2efaf29169d5929e45c4ff9fb8c9ee705cff4e9efba7f9c6cc5f725321f208f2d0b39ed53edaba2c350ecba69a4ee1f3159930f65c8baac80b2e0 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: b0d713cbef0bb1df70cbb425d1e9373e9f7790fdc7980cc96a240dfc53f1e8e2 +public_key = d4f7656b2b781a2fda7cb68a80c9ef2783979e1a329584f72a4be54c5f843b08e088d947c79a58ae555e819674e07eb13ea48742eed3d345a8d4786eb54de2fdebdb01c3baa7adcf129bd99a7f449ecb3de61df0b025c486b4b5b115c78e9f7fe6ed6bf9ef9069ddb3d963c3b46cb9d1ba3256fba0202e85cb56655625eed3eec993469190b75fa85f59a6ced96d6ae647448014dfeeca67a3acad96a4dc77f36cf447f8e114f732148663a9439b1304b148c8e3f12c61654688d363e8b9cda8c33738a3febd2a1b6e8ea93eec87eec9ddd94d4c6a45ba61579c72c2b4effd468a6c679fc3d6b15d5a549b26e4bc8874304bb6f01b77561ece5bcc7c055441ad7fc34dae64f56e990a57baaa98840439371c36e3460d377b39ad6e3fffeb0b67e0fe97c65d541b73e73e3beb713eb30cc3772e97734ad3c5b6243b3269c490ed55a82c9f4d2ce66c294b8087f69304cecbd4d4ebf8bd83cd41ca1eb09fd7c2cee33fee1bb754878d8143cc93c8ec7e99323c6fe0e7a64c7a3b8d97ce594ff3ba5023f484e6637a7f46dd3f38a1eb743c4a33c51c6588bff4bec9bebcf5ceaf175dd37c3591ac7d836efe9ee7c4accafcf5cbf6d4bfe88bf3f1114a7724c797a2cbf6cbe43b40ad3a8cce6dd5a49a68544e9feb51786c46794c9f5239b7584acff69aff766ebb05e6b5506cf4936fb509b9f2e97c40b4736e90cfaf4017accea5ecdacb3386fd60cc1c55a4f79a60daaecc9390371e5d2f58df6f13e5ffdd5387e99f9448b6155a51d66a69415e9b371f33b2b7b34c84df0cb64a7dfdbdc48677293bdd1ed5898cf9f8e914d3098d7cfc83dbe0d8c614e3f2736ceaf3efe99ccca1de8da96cc6d2481f5cab18ce7a1c5e4f0c4b978581742c8550cc9c85bd632967654b968c0159f557cad630fcdcaf04a443d9b2f616a9cb4ca13da38fd9e6e1a59bc698dfde8ebadd2b96aa2ecee1bba3a05fb463bdf7a777cb91b1086addee7ded04be8caff54ec5442a6852134b5fdeabd60feaf58c18740b79970dc981cdb883cbf3f97fa33ea988b07f9a581cdd86d545d7ce0753611fa211c6b4de17b73a18e53c45e4db0ef2864e6a81d6efe255a3e04b33e3c5a6a0188f6e09855bb5d4f838cb8417c2f0e97bbf5b937ff5384813e274489b5366abedafcaa7636cdbe83f15a8dc030fd8577b5efb947692fb40ae7b36dfa83b728478f064e511fa58afcef1c24d56451654d0dc4421695864db64bc37ea79bcdbef07f5b6cbf290cb64087b72297a6c398e765ce9d9aafbae72c9448b33f093694ce62fc72d2475f38eab1b633432175e3f78715efed82df66f74a351904be15d74489b3fbb7a873aadfe95f9fd43932f72cffcf798f52f65f463840fc62658e99e7979f484db30d38f7d794cad179aca6dc838db4ad7038ab84955960b48233f4c5e0ec5985ac8f57e38bac5f2db895af2f9a983494f361bd61bd5e20f385166a5ae9ab844c288d08e47b65567d43055ecb606c2494db7a0f5e268cba81998697a5653e33bbe47d43edd3f49c32964e87bc8ccdb6d604cdf7387306b043fdb343e860daaf11d4683dc9489bdad3d04a1c2657f11a99d47bd40d0a5dd0937a4938de2f4a78ee34d5eabcac445845d7e88b54a8c57947b7ec1defbf664d59d93ba38cafe50ca3fef8e94054bfca01dcae8c846710392744ef3b0fbdad8a5f16efac4931cc782e886fb2c87bee3d5cdcc690dabbeeeffeaddf7468e4873919865b905b3149a4d686b7c96fcc014b578e1d36bc3b63449f467b09bc84b9fb20c0ebf713dde704aded084c86004db336576274c7e5475835bcc8ec525d50ec8f15f397f641fc9b1ebeac1eaf9009ea4ed58b8f96f3d4b893e1ff94e3e48a0ddc5c222cdb34a798713897bbe16a4c298c5e9f44933bd9806e554f76b76fdb8744cb38d01ff4f5cccc75dbcb3f91f33c454ce3664a807e8fc68255c422866cfcf6ef6f4f8677b4db807e3ab05dd1f1ec9f014b9ad69d77dfd47609f55694ddc4acd8e4e17cb7a5581dece7331eb3bd7ccd4c933b6472f4d3386a3140cadd445b632268458f63942455ca2be64c9ccb2ae679ddc1f524c34cf823b3627cff4e476f45cacbbcf57896b7acc6f6b702cf9d0047e473d7ff303db63b2744c7138363a93fb2973bb3144bba91de999eef108e317890c4b63e857c6de99266629d3267db18fd97baa47b2da64fcd1 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 32bdcdb7059fe27f6409901980c080308951ffd90deffa8317b4d213a5f04495 +public_key = 2829b04b7fea204a4e64af308e7f8b29ce6652fa939d4551810aec7b44447d1abc83e46f9d5c4134ced4ccce36991fbbf9e83ae1e58f66f8b7c2e56d902cca69dc84203e372b783bc75fe723bbdb2cdfecebc7cdac0cc3c55a3a089cdd21b4f71264945766740bfd6ffa75f75facd0b45beb3e78f3d4cf9c0b5d9bcbafbe1486972ece78821c40a203849a3abef50f408cfbee543c3bef193417bbc0c5679c13074063e83eff63af43464b3ce47e4b86953c0fe684cf515f8be025ccde50454a093e3e915882dbf556feabe8ad37f5013d723dc5de5d0bf480d8b74874c7896fa1bd9d83e1a8438e546ff9ca64c4a53bd18ce558067206056a103ffc8a5ad0b2b9f631179b6aac71fd8eecb635b009ff8cd69b51b5d7aa6839a1adaea0da854faa39925c06d7af2d612fc9c7573c73394ad33cc8417e4f7db29bb6973546a967354fca3c442f3a6587e3e26df62e66f1053bca46a3e248386114564cd5cd861d4ca648e789efd4f21f8ad75dd8b119ab7bb3f467abdc6cd3d8d8d1586199ea7be6e75c049e6da5dde2d8f8e843f472c95d4ff4239d3c0881e0e664f7ef53c03ee2bec3d1f19774e6998d4e8b683323468a8d87f1b7460b664d5e1db1ae199ba76ecc460685d578d8d6e66f3a78b6f548fee3eb94558fa141aada509a8909e8ab02a9d166c84905c7533159a9dc447f11f649e367486f2e91a6c48b6143efb6137052be410467cc440c8d0f9c9369b8803cfb33da84e6dfc47db77f64410f8b248d7c0f68804915a09bbe6c47287d4eca5f19b9883913de9606815629b1e153a5cdb954f6f3f81759d40eaed61df4afb67a5f8b19b30abbbe9b4b98b49e82c4e48d514c35b515cdfb5bc61553c7ef047b17bcfab4eedfe7d86a78386a0599d72fc58983058a6959915c1fa80ec79035c660b0bd4e977dcba58ee25e8ae6d9fabea6ecbfe2de8904757b0bf6a45a0dd97ede93be59db4bf87bcaf772547b863eaa703bee8b599f6aee14cca90e5af2939a4aef9d546b968debe7ec6fb9eaf9ce53949e7477c4e9893a40766a4a15cbc49fc73c3e3a0ef3f0153ebf3d5555dcf7317403fa9c2b88dfab4431cd8c94183c28eed35c78769b143563a942057d35a7cf373a03c0bcfc3973db4f8f25c002c46376d6a6ff1d3bc74e608e98948d86bbe6e89d5405542587aa492ec30ac8756f07c593044570f536b5bd7fb14b32375ffd01789822aaa020e4acda3ef680abfd47f49049875c1557fa37b4b033fcc260fca04ac6f9474c9b8255dae667fd891a58629caac895bf305fbabeb6974be7873a7f43b20a99f37b52ee77934fdfb6157ac3351b9c0f44d5369885a54bc33b2c48730dba8b3f6b9d167420a9f4d3e5d5285e7978fbd40bf85ccc9569a6c3e38f17f084595825a994079ad9bee86ed1e75ee9e759b31c491e9f92fd2abbe3cba6276ead954dbbd49fcb7e3d3cfab4bd6c0e30af1c3337ef768907aff0633f18f9bba47d6434b3bce7c75d6d4d753b6bbeb01ec47773cff33b506799dfd5b8548e66c33d25906a066bc52e617b9d9196a3986d46fd3c9dd95f1d77a6ad87248d54f2d89e0fd9a0d67dc5ee2aacd3abc1622ee89aacb4d2f9e1abb7aa5099bb4a269d770e74c334d94fe944a4dc55d87d8395f6aed8654831f7c3ecd85baf03c444ade93634b16e1c91aee33979666ee0be8d7713c547b9dffa5e4ba6469e0a77e6ff5cd4214f7bf00b794785d43e26fe798871f81dc87f04f4d568dd873b7f624c96c7d63e23fad2b1d8d0914a5836fa73d7a748473bdb7a03da9eb933f4a440ecd48262d4c9de5cd44ef3dcc51877352b53b1cec14153c88b44931e0effe96fdcd18ee7a1266815b74a431652d43d74922ced6dd6c0104aaa3f1a84e2f7cb2456e290fb321e7d6114be72a2c7bdefafedcdd3e640f9c749f4b27e0f4a748872906d5f8af9d4581d62ce9b36c00993805e722639782d564970cd56b06b8a4a6c3f402649e1ce5eafa83e85b4deda43433c44b6d9fd37487c9e1b66622c6798c94b9228c7a52cde8361ed7ac5bd57218469ac09b397477d7f63f5ca47b902dda5d0b6977194a1307eabfbabb3da1da8cbd5fca0dcb4f905fe37dffb71b851317dc1c6c9a33397c79e4680872e96cc1c3baea5bd04c58ab295b5da25fa98a6ab3035b2c48478f30cdff392b47dc011e8fc82e0914e5ad3c8eaf0f76a57327c62bc9d4d +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 4ed7c92d83bd03b2a25b567f17ae55542e2f6a4308ec0f3fe69f8ba5ae24331b +public_key = 68e3ed58c83101c362627db993cfab3c28ef3d58b554249aa9e73c9e79ebe2c6c402755ce0737ca3ef524ff59d3397b417965ed4c547f8dc97252c58f4367379f4bc9da75b64b4a40b3f99536f3f0625e17d28af7cfbb994b8ad71bf540988f42dad609a18fdfe7daa5a1d7790becfe537c5c1aa56130f9d9ba7faed8f35476d98559cebb40afc85eecf9c16300035a57328b461cfdfacea43d66df958b968547b60a3d9f55fbfdfaecaef4e69cef343a6f3793d4b14e8edfcd73909b6786a38fa3337c61c8f7af5a79604eb383ea4cb6d963834f3ca4e61655fb6a5438977445ffff43d54e7b787cb9bc6c95c370d3d87b9bf08934996f7301618c5a2a9b6d5e8d2d58cd2018b44b0d95c5bcec46caeddc528f77be4c89614d0b14c51eec975976975826bfd574965c338c122ad56e2b9c9cd88ce421ec0f00deeb82f734b296540ab44a51fe4646c32713c87bba448d349cd5b26ddb494e1a77593886c81ac1b59d10b51e8338a4188d82ee858ff3987e58cb7e2a58cf24cf8ccfc614137dc5fddb884ede092d3d95f0abafa2c43eab7e81136bd6e3bdc332b3e78ba665c73304e0fee83cc3915f9c8073b7d6e9d7c13bc4a295432fb0a894958b98ca6f9d7bdf5e3368fa234399bddaa5f8c8fb54b9af1d3a18d1a7ec2cffe805d56c0d97595b8d1896fd2ff8c9ce33e5ba44d924d1c5e2e0bfee8cea468b684c8f7a363eb98dd4cce7ddab73447a5d263b2cfd4e29be74174c5dae359c69f086153ab30039ae3af2eab5ef870c444909918d6c4936eff553ccd9ac01e9db1e3d54bbf943b19236b935cafefeaa105a8f3b1e9f8cb77cbdc0ccff50f4e7a2e9853cd653ecaccc3e9f92a18783d1dcce69732dfc4585c8a45138ab94fffc84eefaed22b98bfee6bef556331e56eb43c3d92e55a7c1bbc0484f51b7dac72d5cdbabfa9ebb9be54cdcfc037c1679ae351cba5e91bcf7157d02518b8c8933cca1c34f9ead3d2c7de895d59b259b49aadeb98345aedc9d75bae686e36a85c6337f01b4ea3ffab29939ebb6e8c68d5f56eab4e6c2aebeb334f93e99bcf3cb3111fb1252537f9dea58953db46e487ad07cfc5c58a2865b0a92a621016f48a46c838fd95109a3de17bf4b2339a519f84c90557798e6e9656c743a8929cc6f2f3e34f024ec821df31501c92068ebc259c8be9bd928b58b6f2efb34c6f830133dfb18c390484ea0f16ecb613b560e972b406c44e154724f6af887a345acc63065481c4b468423742e84f582386c00f2531c67835f3c679ebfa9aff97ef0c0d6c461b760fc3e71b99c9cc74a5378c3ac78c87c847a65f4bcb5043a552dff3429ee4d58bbbf6aaa4422aabd4e7de7d78a620beaf3398feb5bc886d154ee13fb0d04ddefbfcfacd9eeccd2c6968f9df6d146dbfbd932a569896f96a91ba3298c57c5ebb4aa23da7730a996054b9c068d57fdb41826af323799bb0b5efc10e842816eab3f3c12a6479c3367810acc4aa869867f5888b9da1ad5e91339fa195feb3d8c976913ff1d4bdc6087e4f4fdc8196859c939b499f6eef54f5fd05aaf5459d68c49d81dd59624a75e5e38f935ea454cae482caa9da378a3b42edb0adc6702a9533c0c479a406e86ceea9a18ea357f5bb98f835ed13ca29eb969f3a7c759b43474e55ea88d6785f534e1d44be35d1c38387b31c662e6b9cfc4584e5dc43cfad805e273d9e56b71fd9f4204c8ad82ccb326fd7afe34efea97f73bfe760cbb629d6391ac85fe28ac569beb96ad8b888c9cceec93fc098f542a6e4be45fc55bbf18383ccaefdbad13862778bca36285d6748e164f585344dc0ba5e6ee49e6700f4c3b93f6e497ba7966456b6144b8707dd89cbc07a3a553d6db80f0ec0c7f9f97ed7de5b4de7e906cf24593f86d3b6d1ebf6004b8ebe7d47339468184cf0df47d5563799562fa8323bd4619be23bb3b1cbf765beb8cd17b3d2b98e66fb84a9bf27f8bfbc57853b7de40ee4257359f6b7835e9953db1f3bfcf545e5e3541c96f0f5f588730eea2b67424b5a9909d5324a44ffc74caf906c69fbe3b2385afa9bbbe53449f41e6d65e0f944ef67c4d6873635b3650bf4cc4a4b879cca63b6873c8e78e982e4a183557e0465bb106da8b9d97625065d4727731e173977a95e7ccfce3494b5817ec1b8abe866c85ff814aa4843f7ab5bee6124c2166757943afa3df3d5f59581246cddf8777c228d +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 060ea5d2ed1dd88144a9885e79278590821c22917b55a48920f96b53ebe0e689 +public_key = b3dff47d98c6184e9adcbb5027c3f0e65fd5ec3b9c37fb528ceebcb2a6f4f095ea9844b83c5788a243fc0148c6ca8fbe4ba98be6d9a54623b8183a66dbb8456473ace5fe8829a56d1523497e1731c524ba3545652be97aecf9e5ec25cb8c18364ff961dad655e3dd8e14293a77963e4154b5d52a6d424a3ff976b69fd6c073b7bd960cc397d7511f76aee634f40cf6430e7ef386bfea33838d181c3f77197e530463ea5f662f6efa538b81e739e3ec3f357577319d29599fafca2e088c9178eebb295c5fb3c4f11643be6686f63bf59c737c4ed37b39adeeb7a79d5facc426438f6bfff8338439d136ab68ba7ecb86da3b45c77f186c178cff79f47f7cccfa43da4b9447ee4ffc9f8e6fda9c1749d5b63b02afaf5b8ae0ee47505598ceba4ca725ff2fc166f6a5243895db48cd2bbee26cf7b27ec450ad9d9dbcf1a128d3ce0a6492c7fd178d3dc793cabab535eaa44eaa14b2d81a4162d3fe73cb38a7bc945d1ced6f1df2e2785093d66c29f3e616ba7ea0f58df00f339bdf31c48d6600ba861218dd6dfbb50353b0fcc98dcbbfc07473b34e05a556d777cb1982bbf5f1b1cbc58c78d606f352b166de7e4589b905b50c299ae8d3328a47f9ac14f0c4df3eca06491c43ba8e7faf0cbbea87add2434476bd85f7f27b751c9364670a3730d5fd514454e03386c674d6a4b4315d9fd1db66ee9b79c2ca4c60b35d44e6cce253465b4e1fd6fbf695470b4b7b8bc068d391f6ddb7e9e8d28f1591ee9e6da43e57cdea92ff46ad99de8e1ce6c4b2f75854733e913c5ad3de3e23ba51b7f8c2d3dbdedea793b55acc3995c97d3c65c0a8ef139e3c88b56f636f3f41e85a84543d4e55f0c884981a3531d30dccbafcdbf1096fa7ac429a9b3bc2afb38eee59c2139361dca3eb8d5d97e67f62eedc0a1e6750ee48b33572797ace2138ab478a510583d6f11d661d569ddd9a4e55e73f68ff5f0ebd9d62fe951279cb79e8e4d2bfea4f03e2be54ebbba97d81935b31bb4dd558544babb18175b893357504589fe89e701aaef9e78874882aa89b87c20cbd359103f2419a41c1a78f880e6b4e65ec6928a37fa7c60708afc03c8b5b27d01ab3d88dca6ac9ab93fe5665f188ee36d7813945471f6945198983816cf7387e3f9c53a8e717bed4d9a7a706ac41d339001c5d74548389af439dcde42bb6bcf3ef3442155adec4f69cb39432e3e4560dea1a25822f35c88aff9630fd81f2ceb5c55b9af1be4a414b618c7366fe05e3da4d77470440fed7c2d20eb5c9ec7b79cae7cece4653b6c3189f61aa5dea0c2dbfd30ebbe243b8cd23f2fc97fc4ccf9889586a8f4dfac27bd43c6d5c14ce300a68c95f269b2ef49402786819668e964c921f765ac08d5477faf39d3b8b203c7db303afe5a8c70158874a8ec664feb3f8a645991cbe43af498beb4579c3e4918c85a8388f31f6f8010bca96858a09e493667f5b32dd726c037970a5f9c38b47e15678aca6f5b28a763b579af908cc1cc45a5edbf3e5a6ced504b9e42decc66fbe9714bf4a3ecbac1fdfa4fed457df3d2e0eaf6dda8dc7ed9ec6aca54b3f53f5e9d5d4b34b6635df813f4061be609093d28a63aed377a7cca6a929da786fbd80db85dcf906c98eb9a106ff88a374f751acd087f3d07065f4ac343b2c448ead88d24054e7cacb6ca5a398c7e9c2a8bf855fdaf98bbebd0fa9c23af9c5079496e0bf996a3738d5ea37ccccf4f1744eb9f5c672d74968c872392480fbb9edaf0c60fe96b13828bbefd6e56f96dca304970de5695553a632bedc79abf9b2585652065f33c6b53179bac6473b4ecfb277284181c7a2a959eea52fc5087358ef8835bf67e1e09eb38ac9d000e3f4e7b6ce841830bda5fe18583eab6b6a9234f7b3dd94ea633cda75c94bdaa1a3e9f8fd2376a876ac0306b1ee73efe38987e514f1389cb224e4d45e36da9d34508d1739f223765a3a8f2699a8919b30f90e77daee41d7d9630b46cf5dcc4ff95d45e62a4f0f86bdbd6367c157eac5cff21087eeb636c2bbe564588f66b878f817b9e18d95ade61d31de04ff0d9cb274cd3e3f93ac97395d9f09be36eb8b2d2ea4c74796af6de759cff2101634d1668657cdfcd10f6c9eead7c0f3bb7d99b7fac6a78793bcdebfa18ce4f6203972405ef23d336451eb31922fe9760d98125d62110dfcb20e30c6d5cf75212b294eadf4ac273ecb8bb5beea59108851b4 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 10ef9426f8c4a13b52325c5bb4ead4596ecf2c6b5bd2d37d8350e90d4164fdd9 +public_key = 4e35c7f9aab81aee981647b85f7b73ac0b8ed44a9ebf2d399887eaf694d86f0da0ba098841e7979bbaf0d82b450bc35b88884eb935788dba47bc73f47de5cf5cda3f06aad2874598468c665194fe56464d983ecc027aa307da811c9ce63e6fcd057863a9cf76508ec889e7e8d20f67200c8c2e7877d7d853a83f87d9beaef013c715f69084bf9a589b8e2afbc72a7658713f9368a9f44d435f1df58a967d912427f8dbf57693f46acddfe4dcb89fa35ac97c77732d0768e12be5b6d5c915ac78d5bae7323bafa836ff75b66d06f55eb015a5774a3855dd9bd23d473295a94687e652176dc0479cb96fcc7b93494efec815d754f87cf90f44c1c838f28d48a5573a574b2d39dd9e40ee8a55c6abba1986938a47b0e84859558399a42ca01355d033c53b1e978d5a3ace10a87761e5ea19bc34a0de9f565d42e1ef806c1aa76436bc3293ef0935c51384b6698a432fd4a014157b8a9858ccdfe6fa784e66ccd9f12f58a9dbbc4034f2cf75fa3e53d301678284de9889c7b61226951bfab2814a7c7a2899f83670b1a396f5df60aa869fec4d9b0af63b0b2438fbd7fbaf0753fb2c7473d577629ed9aadfc2a8448a0e756b450fc7c1ef80fe1e60f20b9b395ff4fa2ba06feff7495fb15e1b35851ab6e8a5bcb646ab45a8574424e970f6c5af37f0fedb56abdb65603588d84ed9630baa73f773f36dc63e8ec9148ed0b24ffd7d3ee81285b773b7c552b4d00cebf831ef8daa17ca1db9bfa12f6e2c1ca720e7565f8dbc09fec742e453fc2f30138bc430335c2965386323b26aaffe5713957057311ba339443dd96075b492b641379f36144d95d728341db3aa13ec453eb4b9c996d85e23453e878e43efdc9af4376d19fda16c8a9afa9834cca64f16b2b166ea4068c0245c4b6f3f9fcb2cda9b15660485672cf7df3f17b486586597e8aebf9987af18bb2cf3f6782fc549a851952751605ef9ba5c986327996c38babd95cee0ce305f4378fd2c8b686ea24344e92d4759660fc8618dbb202946f35cd8d8ffd1a3ac937844b181d739ba8d7ea3d6792cac7a7a1b4ba7fcb2c5833cb12de2925f3208e7bcd486737ba8fc1136381cee6f763df757fbb86a8de94c4a32eee3eb01ccc5a3fd534bda8ee62bdf4b3df3ca58b415e59a8d9bbfa9964cf765b320bdc565174bc8cdd6855c9747a66748ee8e954444dbaa8273ae5cae2b774abd8dfa9eee8cecd1fa46a36215ff50bad6ec2f49287abfda0aadb2f7e9f2eeafa4cf9d7c855a6daf7aea76ef413edc1d6f9f611343240b3968238747af45ace3994bf88b46893eff1a3a60a6e66e0bb73429d0e73bcc36bb92d3e539e456bed44b84cd0dbd846d81704ab2e4065559896657ab31c60c3564a8e453b58bc8ef38fc5b778cfb4aaba574180d9a78aae3bb075b6d9541692b85ac5f961fe887c39f89923797d18ab8c9d352316f4b004457f749497267a2f0de5faeaf44c1d35c451d9ade5d3329dd63b7e8c0fb8c66bcc4fc8b2ceead5fe564cf32e579431fd9ce4d67f904577812ef3af39ed9b2f4e9525f60e1eebf4a969d18a4378147c0334a5886046833ab8d06c78041c6b848a438112d8a60ada202fcf320f4adb15bc299c6649c694f774eed8c0450cb8f9c3545ace79a33e0a4ff133c35e1e6be342c30fa9b8debe6820a3cad5a2995414bb7f0744a22194435ea8e5a534dcb8c754bc75444093af5e7f490a3468cdd6bfd14428717d1896a4f20deefd5c8c5068dcb0629fce7c9df81e9f0a3bcc52fedffd07d3429dffc8bef5fa66d85f8033c972b47c61998dc0d5b029d32d7a836618d3cd4ade4bc3e65c94b9dba1c6e38abbf6567cd523f83174c42bf56d5b48d9c29dabf149a650bd9d6a4dbee33a469bff3820723d40bad67711f82cc1c68270d8f8787cfd0796bcb568211ed88f649349ae9f1b9349cd4998189b4b945e9fba6bbcc982e55d279f0e1a756bce6441748c41c6c73747f3a9d0d434e485216e9fdd6884f6123d690cfb79889df41bb3104b5e3f0f4e3cfde9303f396e5f7c7271fc4f52eff425e8ea77c850f7b8e65deb6df73a40f87b2946be4b8275abb4fb455253b9e6ff263e4bddd7cf4232d62ae68bfe5ba4193195ed026712f7f9d59c7a1f519a9c65c566b5e504cb93355a33d83acb62a268e02874c67c89530f914761b751f03f3d2307ac9ede742f51bce4342afd3cb6ce2ab83fe +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: a4bd30a64cbf29a4e290fa1cc1dfb99e68348713041e4409a1af23c5d80c15c4 +public_key = f3a7e3c42ed77c359f42a7eb65463a8eeeaed9879abe6efcb55b6e44f5c691eda3f60768a778cc9cac5ad6b89737a5d7e3ccb994956284a7715a7db0e306e99f0c66d99c667119b82d87a6517e41cfdba46fcbafa9afa1362e39b20f4dbc64388b3f75f44e80ffdacc390e32eff35eaf788364f3aafdd6af9d0fcfa39659238fcbfb2ed792f87b628fb2f37ada896cd791276d789976cefd9d2c16a32aac669657f19086bd36f6bf631392511cde0a8dd07a88378b647b520cf1ef9e48cd4575bb8b31b064499a4d98bdf77680a48ab51b8e583f545d6b87112884e36af30206d458f651f8b7ec0799d18dba79c05f98a9f6ad16bcbbecac4f0cc9888cf55bbeb38264c885ce098fa80463f648d6a544bfc194b77895a76c2fb81c1d98a8c3819e035269efff4cad339067ab3bc3de665d6a86e74fdf5fafee944df4e4c745f9393ad59117dacf74b4d7c236b8b6afaa12bec9f96e63e04ee29e885ebf78d4109ff315cfbc4eeef75195e864d743ea49b68aa3f12d49f845ac46f967e5796a488cb44072ecceca89878f37b51d76fd7849d0b644ea65d894771476fba4fed058b1525dbdc67a3b7f4cac93733f735b81f8dc4aa5fbe288d761b0b74238a5cd73c8bd2457bc195b785fe3e804d654abed6eaf6bd8a365a4735d3809c4e6914e62c17942fd27671989c553ab5137488f385b7b9519a69cb496444a7a2dc6d7adea5c3f1f8bcbb3ef586c5603f953f4fbbb448ecadcb88d6aa778466fc6f04dfed398cc2113abd257c95558e8c8175db54baf210f4979ee67620b672b28bf24465d2cb4cfc7cd8739fb9696bc84fdd76b136b39b85c7deb5ce0ff59337c5ee2e32bb25a665e9c06f5baa86aadbfa18ea3cb6756f8751e744509e4558c32e5eb7e1329cfc2d99ca4d83007467b80d74d2ec9832a5785fd7f93eb466d55cc8904874bca67e4c776579b253f87be7187b9c19e8dfae65aad9d7cc23a0bd51e593bc423d85738f5a76b4dfe5ea2bafcaa1049da77ed8458c384ce0d89668955fcbbd0082759df9e47bdf581aa4a81f808fcbea84d255b43e30b6728fb7a706cdaa96b794c7ca2883dc6a2beb2c114dfa24a98ac96fed74453c03a3d842cb0bc87409a09456c739ea097e7d8bed6114ec425de3bbfef99c1bbebf328b42324f63f186e5b198bd6be712c04402bf849df6473b8e78c4009c945dd5277c68d6eba8555ec48139560922a7a142632d4168dfbc6396e0d46c64ff1d43b7bbf0ebdffcc67302e4217679853d3c0939acfa7b45ac82be45e5bc7d668a4476e56faa6a44befb9cd6caa5e4fcb1c2ac5aa847cc76dece998b2896652e2d9d1483acdffa695cd26f5b124a8a88490b12b72a5cbcb68af9aa965f480de7ef476d6ab5b5fda6ac39eecd128e463119d3b32435e301fe58f678463ffbb240f46455b7d307b5bdc4d375c6cc507987ef616816d3a97545bc0f6e44c025c961cca33a828beb658d494cb9049cbfe0c8734437ca0745b55174b67fca6abe743c7f979321aae9a8829821166fe7ad85644bdb680c957eb6b740bce422778f2911ee0f3998f2b043816d9f16d4e6d64e482dd1d539297f2efda8c35bba98c563eb40bf9089ea9a43d968ddf936096d737d3cabef87d1594e9cd8794d15771588cb049f393d47f9fe3276590488e980ddf63b6cdb86dc22fb853353cfeaaf7340c2d4d6bf8cd186cab5f786e7f967a4d147686a690ca83d8173843dccdbb17fa4ab2788436f4300a8f7946265e86e782b98bfb27b87ee3cdbaa0ff3d6e7fdac13ef4189bb008d54da90de28a18ea7014db0d8ffa7b5a97194c5641078b22446d7ce9b66ab9332f2ab85d83f0fc75eeebf8b93b838421ac6818f8767397f58246dbcc9d3ab70972e8e589465660e6e4b9295675416547c277827d667102c99297f9909548c5272e846f5978a5d6971ac97c6df5cf1a3a42727e94f22fd93b73642cd757b64ec6d5094931d97afaa5fba91df4b5d76caa088578ff4b872d8da3448dcdef4769dcac3af496b4ec8e644f94c7e3f3a96ef8d5ffddbe5b7bbafa8fbdfef132fd66367fa4c1a4885ac49cc60757814fc0c68853b76eb45276fae194512c2d8435b7febbdf351aed7f96f59ee0efa5297c351bb3877347874783fd994eb5c36d91ce45559e7e84e1dad1b7c388a8cb030a00f66b47988c2d7d195332662cfc7d90b279248de101f77e30 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: f4b66a7d3b65b896dfe100b2cad24b175a1168cfd2ae11fd704b835f6bcd311a +public_key = 2d76ef372bef9a3c88556374af9b603c9cedb20dac3f7ddc042672bcd971867f32fbf7de3d1f80f5ac45d0f8e9a8495d2da89ef5086b110773c8de539ec94a440cddd6f4a3946f73205f7de4fd6f4a78b0dfbb94e4977a564c765cf8ca68658fbe27937a8be5a877ecfc8b3e779533d1b5c0938f6b3038b21365d4220d4012a4cb401f478e0bdd92bcbdcb4f59b153584bd4b65a6b8d66f578f604d9c0ef46deb5304ce5487b7a95c6db56068e8e27dfcf5fa6adabea9e3a48b6f889305d0e6055db7a02a34ba6fed573143ddb8659fcef5c7c7fee3494aecffd37effb36b38e9a1816788a6b410918745c2a423285c7e11fecb8c8793c6db4c916ea39f97ff23eff02d387d224b0ec258268a374b7ef7ac9c4598fb78c387a7daa439280d79a6218b3cfbdbfc2e685bad8801e9fb5b1b4ff64c8890709c58c95bd8ebc43568c33362a53b6befc052489bfe8d6cad36ddb1e7b228db68cfbb317d4bcdf745c513f4e19dc7b17ab7f31649a57bcce91fa72015fafb1bdba5e8b57a5f4f96b1c390da9a4f76a869bfdb938acdac48eaeae0a779ba588004f5858b3300e7eb9a0ce72dea5da95c3a61d9d72b7ffa7ce9f45da79d128b9c597c44903837b8a9443865c785ff6bc05854e1115b9e3d7a70c7c40216ca48b1c649716fd61fb8cb29c71e69ddb8e85fe70b9a8655baa8408742b6eeede94d93026f0f3bbc2a27790de7d58841432cae4cae719740835571ce65027e74d85958db506a8ea7dec1f5ba5728a6e710a3d3d93748a7a640c56d16758fdcd6cccfc23832627e927c6a72ef7d84ee97d3e85e9744ab8df75eb9b2b69d4ac7cdbd9437859e14e29550ba332130f906e9331bc7ccbf467eda4c6ae1a1bf797ba4bcc75398e18505fcdfdc86db00f687c77ffa3607d7f609ca149b4be233b3ba4739e19e4462d78950138cd1c3ed905ceda83356156a63631d4a6193c68e78642e7c5c0da04d4e96fdcc2f7438ae950d4136ad32684f298ec51cea509bd442bf6c92f13df82653578c79fb4eaab1cc6ddf497dd6966ca5bd865150da5a6e4f4749c8cc6aa6fc90b6514b8f74e633aaa7443564fbd2eaa354d65a3269e819c8f33834abf149e470085c9144b823949df986f4fdbc645d376ff8a8afb7af4e2f95f588418eb338f390f8c35e2379aa6df34dfe9c0ca4d98ecfab31dfc315413c62ab8dfb8a9ad12dd70d02cb193de8f3717c13764d1c17e3438bd8682a8f0526fa78f9bd0fb46ca2ccc6dad37e7185b72794bfaa009419a6330ed5d8c8d3f5110c53fa16efa713c50073eb36ad4e0c5a966eefe656419740baaca6719639987bf5e17444c5ef2650c87c894d69fd5fba18f837158b9bb85b2ca7ef68284b5d8636b2ed3bd189ef96de78a1cca44502a779b2bacb6f86d676355d4e5f7bd15dca8d33a13dd59e6d697f996e77e1b95424ba97cda6b6bfde91bb7dbcb85e72c354541c7742556c5fbe591f33b962455f3935eff3859953bdfec50d5a445a34d94d492afcbd1a84c844fd582802391f4f4a5d11fa8a72d79e254363fba52c83a399bb3398f78d7e7fd3f74f68fc798e87be6bcaa5491ff666c98e43c3f96d47048d76807dc4987c6eb1d411eb6dfc7e8cba1beafd72a52713a41a227f804ecb9fc6d315e37c544555a8aac808918ec6c2695b09de1bda9ee1ddc87c94ecbe1cd357e04489795f22a3da5d75b81cdf9ee5804315bc3dbca3f94367a4624adc4a0ec8ddc436c7a9fb157039879bacbcb69d491cf8ae7d9e4226765439ec06a85f37b24b88964d4cd03fb073c4923dfd2a087bce07aa57098e6818564c78f37137cda991e9c2b6f44a69d510724e4425b9230b6e13cbbf8b07ad58e67b16b9b32880dd2423cf76c78aaf608820836c864ae55569dbc802a70abda52e4c430c80992745945ebd343278cf22836631c75fdcd4f5e1fec6f22383eb78c9b47967e865c638233eb4f04fc95ff81c4e9a849477706c339a48ac2c6a4e6d1f5e914c751e0fdb74cc657a8d9b0d1ffecb2c3a730af41339be1f529a0ea9cbb8be3e0204bf9775867f23b7a6ed3589003d24474b51a578110dbee1d15fd2ddd3a190ad7f185d27947664285f9353dec093fb80b65fc7a4b4eb21e8e2466624588ac1e0e48c2cd48445f479eb6d4769de2b5d49e885965bf6ec29407a0d9d3f1f08826007a5a3d32062d2a775728c35116642149c2d449 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 1d7b03d3c5eefb8ae5799dc569aa668f1bcb8c86607b089d3530cf61d6380147 +public_key = 90c537fb848ea87cfba929c7b97456ac4b5c5007b2773eaaddf9d2ae29e7dba8cf29364280bff504bafbcb4fbdadcfeac9a497eb1cb8a5bd96e79f94620386abc48f389c7f1448db04cedc614c625427c8cb9962f3d75409e9f3a577e7892e69bdbbe5e54f6dfebf6072a5f255eab0380a88277ccac2df4939c98901ddbe467db3df596aef1ae748bfb0106c31e9aa9164f7745eef3bd1dbf22178ba13f7c807cdb02ff9898774646417bb2fd3e53167c1ec7d7655c548b63caaf3fb3f3787ebe2fc972d03bde5286586e4d6b019d2e0ad897785481b95805ab79dac54f33af99ed3f53bfd6cc36bfecc7a0d6289563456fb71b54c6e5e894f47e7e5ba16fe010841a9e67abdbacc31dc373ec88ce8eba2f96381eeedffd0b88b47888f5084ac264c755d6fa663ca9e30cbfbb8c89dc2ba91ba75ffb8add8aeaed90c16e4d6c7c674139ba5d57d26dba05e7c47e31d7aac4cc28405a7d0e4e5e257ff66d4dd4aed94add494c29e75886474b5a6991e355738c66d9178c94bb4c05a1fbd9e7d9290a8b562a358815ae4c50750d27d54273c7587b7ad5f4d3f231964bc5dd14fb7e21fdb74dc23875a148f101fea8ceb3cbde6842714cdf20d8d86bdaf62e65cceaf7da0cfa12f4e5801cbf2a865b861aab5cc3c9093d3e64e6b436a3475e5359bb9cf41b635c351ec3614f7a225e5f2f3adb7b28ea1f7a4ccc868d14b3ff2ba6be9777e54e28bf667f9daea45fae7d3c68e07b7c5dd482ec38aa226ac4f2b63a8da4be57842a4a65b6e04c21673f7be09a30128bcc34ce5413eb94fee3aa5e6df7708347659b4d73bc50053fbf35de862ce83c84fd19576a673ddc10d6ce8afe4364e9ccf67d670b39f83d1fdb9fa1e30a0437d755dacb4d76af99aa4ea287a6bfc73fbaa3207f58fccc775a91ea7e7adb7a63bcd88fd4f1efadd57ab77363e532438fb4818b8d4346b0ecbcea3ac9c0a7bbc17a955617570a61e447a9b8475f7c602135f57255e251fcb6debdd22d3d159b43b9dd58066e8ed77f7a4e263603e193ebf77efa3283c69f7ea4ac433297867da3bfb7edae9373a9b4d3897699d31e68f84ec8779fcc4cb742b8713ceea3d143b02645a99db61c0be9c26a5902f7b3d784dfa9bbd593519f5d9eea994b586ea777697c389f9cb6e268e7e07c5716db9ab63f451dc89a85213ebb345fe8ba53643d5d9ed8590694b6a0744dad0fb2f1788937a0c45cf9a441494ae447c44c79e7f2d8bf1bdc6b7d3853bd8e33bc7ea75e62535fa5d96aadd930cbcc0a31dc2f5c8e091efda5d8cd346bb43ebe6b7717f859f13a6576c72c0553da80a4ca9fd3292d86a98246151a6de4b15b759bf8e2beff71c9ca710afd61c8a560cffea2d967c0beeb0ca446a987bbfd888ce4ccb725ba5d50d13e34f3441f853935255bce8473e88397d5eb4cb8d6acaa6bb8d606dd3a66db08c89ac890b77aa16304f5cc7492f764e8f823c3e7572c5bbef0e8eedab6cd93caa934f79ca8932a8858079197d412b7284ed84a7fb9dbfff6d463dc1b613661abd6fbae495d207a3c326910a6cfac9c7b919498bef5482532535d265efeea5e54c2d82a77cdd3b16ced88993697b344cf7be484fa3180c69f6fb589bce7fbd03489b13a0afa5eec1d9776efa82d0edf76e58c554cfd46b4594ca7fee0afbe60d89f3bbfa53f7c9c2a5ad77d51a6f38473fb6d7a2b2b99c5414c5e646734fc48c57ce8d30997d8073afcc9ff680c3f1c40696092a7aa09d72cd034523acb15154354d697f27b3e23496d1d1eee70beb475a6ed330dbdadef4cf31ca82f8fe5bc033e0f22c92dcbbc059e347727f5685955dd559d332edbd9a8f9692275598a77a320f43a72f5f392a9f84aedafdece72e1f4cd2a5f88a77ae061d31f898b42d89fddfe8c0902944b78d43bba48a26cf7324fd7d4f6a8c6ecc33f13948ae1f463e834d245e4af69954396ae44d1a4df805f7c043e248de6d06ee85defd4a94b9f047bcc976cce7f6b7488dd390eaac4b608390e9fac6c38f9eed19d3d544b3ff08b2c27a779198387b9ee2e374ce4f6bdf5f8981011594639f9c5417bf3744f0811b4ecccd34ec4eaec0888a30976429efa54473d72f3c9b5544e147c464dc88b55dbaefa8afdc22fb6c8225b2ccf476937e3ded1c4a76a479bc2eee56cf782a6cafe938d47de49bb47e732223b0bd1bee7bf690d1857044eef2aaec +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 554f3385b382f4a46314de37ee3885addfc5332bd4038785094e0a832e9e8c2c +public_key = 12e4c280de91ab43b4aa8a66c53f6e681cbe1207bc2d5aac1ac59ef0a8aac0c8b91f8cf3ac35abf566c75ad3b01d7bedfccf9db4a334b45ce0fc25808f9b8acdb4a2ba67528fba8eea4fa895d5544857473459763fafe74dc640bf2849090f3146fb553b1b8b1e99a7446c5320dae7eb6bc497a330ded7b1017aec29df3965ff4f2188b2d7ebb2bbe954c9e9f71baa7e42acd2dab991dffa49410ba6ac2d829ed4eb03b8ba8756b5cffc640f9f8b2446ef100d7227ffb5315a8bdf9ae0aa88581ce5a140588b69b531f62ef610c5306ff4ed4d0e8302dac1dbf69863b6bf99d892072591a0168decc69f8a8f3999095f256c52c6336acb063bd84e551bb855678c4e8b09d291a38c2fc6419583e2ee758e73d88d8c8937b9c6912c59ca13854a4209924dc7efd8b547a076a34066d1562ff298f9e328b7e774eecf1189f0e5faa8fbd847feedf7f734c06bfcdbf479b97ddeed637ef2d1049e96c7643a6b323aa93e116fe460d7e93d7c85a1a8969eddb0835b64aeef8df777a1c70646b8e55578ba9da6e8fa96b5bbca2bfe9346775d24b987535882468b3f9f63a1c7428869572224fd9caf3fd74738393fb2a3b6720c2ecfb60ddb178c51a878992d666872685cb1f346c77b86a0174ac955b06df96ba0a4e0143d95856fd74c5737806fdbf076688185fd71cda7794e5f9bd3b5d286e0100dad563735cded952364f60c153c3cbff7182af1b908e76ecdaa42acc24106d61624b88d1659a2b8ef9c09fde82c76daecf7bc4bd18f953a5af66ee224d1c02a4e3b8b4188a36be48e8ccc8f686ddfed516e4f201dd721f8445323b4920b3d92ace362e9eef948371b63e096186034e6ef050ec09679c54c5a993ce85138fe5f50466badef9513ef60fa9d764d3e648d6649d23c80085da08f759fa94f58515c4625b856eb368d917c36768a8a157ea376ab367aab462967d7ea4d80bce47dd4633c2c5dce0b19bf47d4a68c45e9db2ec206bdc91296d6ef8a7405ac525b1fb0c613c7ae96aca34743ca9679bf078d5e0e6405f336f6088a976ff04154648e4b3f697f92a00f670c7962f5bd8bdda9beb2a33a2babcef40cc4de288461ede890cf9ca86bf12ec4df7b158aa4a38711ed608fbe50fb5f52870d58cce8f2618961cf6ce8a01bcb2ec9fdda84597fe9b346ed6d14a597917a4748949ce6ff9e60a7ab2984d242166c5a75e5021edbbbc73926a7c4d0dc6aa425f40e1cd769774055f9882aa4330dbced860d747be5f64bb7625c2ab58e89e7ce2ff858135ec09a3f0128837669bb38aee903854d57da6957e7d407c752a209515365d3848be7c536a69bcd9a84ca64633a4fbacf6221296191bf7c0388e729456f665363a0cd36fe17c4b66b390c3fd4a146e5563f3dd307572b2caf24148dfea74eef05880205c164da71980974241bf167b3c3200745ce778a4cab786a0cbb142e88158c31127d7058884358db6ef4dd4480d7ba058c7e52f4d52c1898e39e8d9869d716b8dbd9a3a4c3d53cd92ee0067d9e709bd4c7de8bb1577219a39d26a496582384f21f6fe59ea2dab7b8adb4a07563c687c4a6056455113c6fe9b7bd30cb7fbfdf839a93a584c76af6ce422dca809cd6f3079ab65dbe46a41eec39cea6f3ebe34c7f583ab9331e4e8c7ac5e3d77b91a72fd5402e7d406babb04e70608ae979ea637f8875154561f69870fb1682a72d52fa36a21bf94fb5ff4ea55ce658d8bea5ef813707981366a8d9655400db440db8c27af57ebdaa8ed897c75957e2e698ec81f5b79557834e53c9b537ab69a4f830fa60a0c8bc7528e92f5f396fee5d945b9f8e0deaf803f6148e7117834a9af58ff86ea1830798edd48fb67ebe338b43140c44d18bf72db6aeecbdcab26d342b49cbe2b47a6b6dd6b5cac09d763f168c6a603f9b7d1b87dde69542a4437b8c42699db4a5487ab43a98ef94667efc881a943b33c4fc776b3f8af853fd59c2d313efbcf541258ed0d33fe9e77d94ba89791186bc8b7b536fb6438aba5276df34adc5a9ff129fa8deb5c57574840dfa80fa40882aa0c73cdef233b0c2a3ef1e15cb7e5f8b471c50913f56e54a87f9ce6f02b3bb914e33c07de36e6d3bc57c50352da8b78deaea4a3b415f334f75bf821cfed999dbcc9efb20e9d31c269af9598acdeb8a52bfa7cb804627acfa20285753264f3df670dc445647c881e112b71095f10934 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 38bf0033b779edf5367d9ebc01c988af90904c560970815837380650e4749eea +public_key = 96f73135fa51010a83491b40768ee26d95d02b6dcccceb5393b459cb39b4ddfe75b2134cf515c06b38cb0ea33d8c34a7283b99b7ddc9e918f5159cbf4ccfa1c1fe31580557f253e84bbc7498b39266f669fc26e15058fde58dab196ba61dd5f6f8a46a2ae3336a7abcaaef743fd654e965b3b33ca0b9cbc8ca6d95d78a971b7f77496a8c123967e9dfd4765a86499db762d34e8367da8dec5cd25333276555e7644eeb5ccf8004579c3574821ddae9a930a83e3468d3a8b6d5b4da4a558a8ce318da670dec758c98c5058e44853d96c2b781d73a9f216cfca058eea5aca259997c8489f5694e507717b7de0ecfe1755f8bcfbf1008c2c61b7bd148e0797e85cefe6a18cfcf00bab7eab737a74ecc12ea6d8bd8d2e076e7316f8194d4da7865a3587cc2f6bdac1e3f8307c55388a7db96c4969a533e04c4f5e528c713e4e821ca6cf1f5bc74e64859c49b914563ad193c626c6dc63de43a75513236dd5a4dc76f2da7f07987fa8cea4e1f83be8ddc9759871f973fa6d94fd99de5cf0bd56555b36559420bcb98cf6e7169465770135b167efa9884586e0f32d456d6632c50a9d5beb3697669c9940e1739508c360515f4906dedbbbabf70e7cffb24652b88fde5f4a310a7767826bc73886e60f5e230068dcfebfb3fff46f88ded668e3e54d78ddbc34cc9bca0269e4883364c60576a5e0c5a864ae7a997fb819cd70657e70cc46f4498dd4ff46d68c469454f433d8f3c0ab39656c7e5e0443e8ebbe4aa9dc42a13eebefa6cfd54c32fe4521f2e8396d53c5554c60b93cf2f1cbb016fc6101686e57388977fee44c3f44acf97d968b16d8dac75aef79dbbdf84749842195aa3dabbadecf457fc8b854752d33cb1a5499dd547f5bf34bf34a68457e57e4b37dfe1fd7323275fb99b78ab9daf2758db655df17c0e867a1b7a5a5885fbcb931d5f4395dbe1a406a492d4f51facd9e14a45e2b86a98d7ff163f664879a2d5557fe9db6bcb2ab6197892e5686b2e1ab35a3434a77a65ebc6e89bbdde19fbb046ad3fb767866184c5c3efb155f465bc8ae35bbf5cc64e5b0b4faa17595a33efa3713e74159e3279ce8837f346c3a54be68ff5213e5333bfb43ee4d89c4f7cc9ef4f11fe7610f4d882b4c724c48b6315aa6f0c64a413fe4be75bb7bd702a2cb7a11cc6aa14bccff9eaf256425144f5ca475fd7e7c3882e4294a36fff09bb1388a53239e0ba9d6491bc923a2644269d86bd5e31e5d67794e9ef66bf4a0ead6ceeb63239456e6c4becf40ad5165879b5858bf60664aaeb45b4af38b1b9f648aafd395473d3b5e73fb37a51fcb5ba0c9cc3fbd1debc38336db4f5033bee258f66b5d4e64a74fafcbd1a56d76fbdda02246eaf5fba669ea8cfefeb58a7ef289847c508768dbba5ab29f1c14982ca5f5ab4b642867f3954d33c8a35396ebe37c0db48a39432da0abc3857c536abf36ccd3ef66fa8a5f4f11986a385b8ab4d17457434e1aa8ef256636e62976f99b7fd75c654f8574737b6ad35def9a2eac230ee66b278f84007d53d4339bf699b68e5eecd3f974c26e13637ff912ff19bac6bfa8950c70e6207dc6567efdb916974753f90f0b5fb8bf5ec9f4cf39e8b6842278418ad5dc789bc430aefe077ea51ba3301246ba88dab71295cbe2dada8ad7e5593a39346d4efa7fa711349a0678a61dfaf2434b17ee940c067bd89496c90d4b9903b9d146a49c46e38dabaa405499eceddff791562a5d446fb358703bfa5eaec93b7f475686fb3c18bde8d48ceb5e5f44975e68fd9c3e6495d1fd578ba3ce68805897cd351212d59b5a4b9668746584eb077677583ca7411c4331583308ebddab5045ec5943beb38d0b30978c41d31675a84dbfcbe6d8bf7b2da65152c692fb8727a485b974e888b1b36a25491ac86d458aff78125b0a3735f3e7599025d7ca5afaa12dcbccf3c35c68873518a4fc788f01f0b960c7b551f038c630e378ffed19496f9dbed364e38ad07a3f0d2cc35bfbc8ae7cc446526447e6db19a36519daa8331a45f1e53d8d564979b5e79083e30594cc5fc07a1fb6b5966277511544612fde8f3f8b76567add2c94a0da8502063c66c54c3a50644e43b81a93c7cf14d9b505c77f6dd6d3453fbec389a137b6fbafe8da064f6d03477ff0b81863f7c37f449c8f639878dc78ef7d26c51bba9665cf58b72cdfb115bcc2a0715b5b4f40dd01c7a0585bbae73 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 048ea516d0ebbd9f709b47eaac66f344c571cf50f0d01c9466aa061a50b66a24 +public_key = 3b37800c878b5adbbaef794f4f24abfeaa40eb1c5763fa55b7369e5be8754beba6bea3e9cc3a482a53ba93d4e7bc9a5a313dcb2a247177fbe1b63a672f0d39ff7e735ca9ceaa9e68d1634df2737b463f403459fe1d3c74f20f39565bf3e39585734c86da9ee8dbc944dfcf8869ca8be8ee7b39bcb0b0e34e257bc9bb4fcc792d78955d94eb1336e516c62c0d871e1fc601a7d0b478b5db43ac41abfc7b5d442d9458ba4b853d6af9ca946d64b6a6e6cb3485439abd4a9cf34b592134fddf46e1289a72efac4102cfd8cb7598894a9ef1ec38e34a58b3cd71b3e6738138bbb04e6f256d72ead83b355ad832b98b551b7210095fea3f3e1f75bb9a9d5e5bd961cd778d33cebe956efa7893c062f6a66563e52d1c820b98f5c25938c0348a3e3fd6897ab903e6472193b5c2aa3f1b0bf3bce88bf47f3eab8f92d5446546865218d5827a5ba0da5354e2f6c81eb96cf1ff8efae54935138273447a953aadf975731aed3a6bde9d7f6e3c2cdc7f5a3aa1891368399ab5c5337881c782bec48f926e774696f04027b6fd895ed1c8d0db68c2d9e5f9157bda8dc9df107964d8f5c860737db2a3375e0fdc7bbc7f1ea57ab7efa2eb44b5f8e6980e5f33a089e350f4ac243eda4bbaa92827329479eb7c54eedbcd490957fe8f77e4e99bb7df1d76a22e576efbed42aef2d4366023cbffd66937eda4d566bbd7d7b480b43d937c44e106c3bc01f3c26eb7388ce740432fbccd7cc42e8a56919f39a2968f2da3cea3c6695cbc909ee481b4d6e9f1e7ae685db4d8f691d70490134ba02cfc97327c9f14db4bbfca7b4589431e0b8fb8dc61669ee0dcb675dd1bb46db49605c66534ca53d918aee579557f8fc733a3841a7338f9947d92d4379b4afd47469166bbc20ecc4de2f7c769adba4dd788cebac30eccbdfb1eccbf06e42809f83afef160b83369d846652e37448da1a2c8bfd80ea869b49d09644266e3d0493badff19f390e894113df8768a4592e9630623d55039eecdaab48d8eee8a28f2cd278b80357856a739174b3da66795fa8375333554fdaff98de9fb3ca6fbad03542404e9b9c6f6d32b53840d5564b8cbad19e5a977b1c967e0ae59dbfd158a2c88de14c85ef93ad2a37dec3538c1297772d1045bc59eee4e78933114e3b52fe201eba6c4db8658378fa3a6b9b919c9247c40ef39a7d564bf13a6c8ec575fc3b58f434f6ae1a4944cd638bcf8336504577c65a7b76bd664a8d2bf898fc3337ea3f783bd58bc85e33c51d9e413cd9d99d3e0aba8d2ddeb4e977a640fbd5a6f0e984186b6303f37230b33cc57f1d984382e0d3a457f496c163a0c23aa7527a7a98b45260794c109c3ef645fd45fb779fd6c6df4dae1aac577698edc053e951931e88b7561aafe3a795d9d8ad15fc39978ba6832da41e0ceaa36d533524fe107d33d00d934ce079f54cead114b622ffd9fdc7d888a96ee8b9334610a9c2a66e4325b92662e9dadfb7eed9fb472c87c100e81e73c580b9ca8564bc1e3b9b70528a30d0c54bbf48b310ec46b536c52ee5c4d0844ff8ebc035351d929f12c699a455b7f0a1de21a77360f4aaf09443e913eba9286c0ef18a72a0c6afb2b38055f37a0ce4dde7af0cae7c703b8c367bbbf4ea43df773bd6a3a4c051caeeb66a236244f7bf5a83783e655a73bf6e7a3413459cbbcdddf3f9e59fc95210cf109e480d837e1496a5871f33d0388f23253e37486504b2d9d911f574c1d5620cd4deed84999baa3a936a9b1234ac4c4afe56ed4308f8cf40c49e73fc6153684458e54a023684bfd8ce14bf04bddf5991c5e44b63201073f22b5dc935b9bc1c488aa8a704cce78ab0a752595cfe15db342af95f9b851b67a3c0a1edecf297791c746bb9f47df3aebe5b8fcc809d5e1553b31d53711bdb0b747fb8eacdb7c15636097316d46587e07753cad5e03f7cb3c6c78870a7ab21ca99dc3d217245a29fccc3ee8d364ec661ea93194d472813a3cb12d3b223b909c5774f2dca50e8a9753e36c33e9fc278a52122a72fe389f0fa6fce5d3a1d9f5c0710d919e4761a17f82e016854579b1c2e7c60873dc6b2a6a1bd96c7149fb9ffe5e04f7bcef4e4cf5d9a6008eec4d2586516f48f4bb6bd4ea4a45fa79fe9faecdecbf20d7ad853467393fa0d6dae3c66ea446aaa23539624487767e4a195dce0e2bc6a3fd1a73e918f297aa031fcd8c14925529ed33b83ae8e7ab +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 686c921c9db1263e78ae753b1c9c2e7936b8229dca48c0942c56c6bca4f10917 +public_key = 96886aea374a0c4886e4185a5ad8ca7f1a7df73c6af138f397a6a9b94c95c8284a0d65c3e614cc73159fd71bbd6aadd6d1b97da34ec470baf8114af4eef9856ecbc3619bbdbc25bf179ea2424e4cc3b8e6433c6d9476d37cca4dcce8851aa9a182fa9e7ecc47e437e3e908e289cb5b68c5f3890955454f7321ac5bb23dd0372aee1cd96b596ff3ebbdf218543c703fa777d79c3eef8d13dba32818ce42de3e2eabbc3d2ff3eae799057c43a2977ecff4a5966a7e53dd554a99d7cc39495fb8d33926dfce96742fe5679cd4c46499e0ae17e5a98995317f3be9b551e404b88a2cf72f7fb1b3e56144a4974df799efcfd17096f305e647951645df7f9da99bb4fe579309d4abebcd3ea5edf9990b3fa8464f82e4472125bfb98837e275508d26edde593b490461e75d8276b344bb18b93cc3c966ed84df68a68bfe4e6bf37b4dca585d16f1a403f363abab1684ce0b1a5fefa7ee90ee8928d3847767fe55596e35ab627098dc2e6abd0ef9d80e75850165f73aa38c0bf588e13dd6f5837c01063360773ff79376a72380dafef3b199b5620d7f1873a4ddc7e5abc93d95c7a854a4d7ec94cd0c9f8b30e3cdb168d4cad99ab33df005675e68ec6f7107d182139b42e5bf02abcd4a4988ee1ae6416ad95ec8b94d2431070a710e7fa596f3ded4588fdf9e670f3ab70f35a5f097de879f7d68f641fbbedf962941e10f6908ea7d27084262de90cc6fb4355aec8f06ab874d3134163792abe275aec97be6f208e681f3a9633397ec429e6b03e668d7559fc0a67decfbdd308e8f45e8fa9e4a679d76436bcbc45f1c971e966a6cfbb4e1948f2e5bd621af8d633b789528e2fa15c4696a7bb17a9ddfcd329f9f7aa1294e5b7974bbd7d08a977e0e13500337cd63bf81bf7392100fb19c357eb57b3c585f65f1e73a16b455af856827ff9be21d49a80d5d9ab4d1af05e3e808f20f296fe64ba0ee77b1734bae351ddb85d6d9d8bcb3936d690ca9b82f1d5746acc35fc49ba7de461a74820646eec179990c2bfec71387b52cec7ed344b826d08c384eba96432ed66fe4f7f25d0d47e3bf979bc359a99eb259afcd40ba3694086489088b4255f6835e8ec5cebf8b56b91519c8d02395e726ad48696d5a38d9d703d31539bbdb38bb11f8f3cbfafe7273742c87776457a1804b89d524acfcb39e19fa454753908813815349a873ee31a5fc91c51579b3b5de924f955ac575a8b5f8ffb35a77a634801e9ae0fab0780ecd4166a0144963ad79f68bacbfdca7bb193d5efe0d6e4408e3d063b0b7e8b1fd75b5b176fa4aef6324f89415b5efbeb4eb75485c53b661c97ab2baee93d70ed7805e8e862fa73447aa1be8af9ce7f2eb8653e1837279d5e94fcfebca1f7f1eba895fa9f4a254c6b38caa0917d18197a771d531a506713d3434c23a3a2b996b7f1ec83ba7d58a08e2e974819ebfe47a473686869f4d04bfcb9786a0f9723dc67e70e4ac0f565b85f4bb30ebce83cfe950838a220f80565dc9fc26d7ab93a7e43adc9e79611fa7829bfbd25415dee83d792e73975a7b38bc7e8ac75d64ee7d90471658668ef3e88f3631f8d2142aa56387ebc6975ce38fff0f1eff555c3f021a7fedf78f521fd936edea9246fdff154daafbc4ab6c8d33dfa11525a474757c691bf1274b443b58458b83766df851da6fe4dd04bc0af73679249cdf1d55e197755adf6b3bc6dbb306503879b7fcfdb2eb35d8ae05f149f43ae06f75d4ebd27b6477d6479cfbba91ae0abf1dd8e26fc962cea9f1da2bd006ad9c30b6894ef6b3ff79a0c088bd2e6d74988ca824bae8b897d73b1dc7f21982f91ff04d3fd757cdbdf59ba855a63a037ef5bd5c677ebd8368b475b52c3559d3d31ea56040b9590f859f6c2560f927df5fa759068678bafff88877ecb0a693e825bafbda853c0b56b79a63aa198710c6f46a4aa58c2f60874e6d3ee8fc413bf82cf38c71348b40eab105caf3b2f3720ebaa6f21c9f7b23c4e324c4c3b8f1de7957c31e83fb48c4c127732bbe69f92fc3003a803aaba857c6b92ccffd8d2df51feea6839be8c75dcd5b93d4f896f40e16c8cf4a74f14938a21a8f3e87bca045edaca3a8d6dde4037ca5666af589eb7ec7ff9d18d891c0cac82289fb3408617166b55dcee8244ea309f86f99f86b4e7c54e7cfbcd15b15b091274f185cbf5aa7a7a8ce437adc43de798498003691147635e787ee +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 2387772e50059cabda53cb93ba24b19ae529496c03b36584169451525c4a0e7e +public_key = ba96bfc11884ba3d4cc16b66965dcc09af828dc34e704534fdcd57a46bf5ca8ab60047fcf606dcfd63db1e67309e6dd4361acacd49fd104c9d3bf66075d5949ad75815bc9518fe3208068ad535d595d76caebc3b189af6841f353e33fcbbfcd830c45b44f3e5b5ed37f677f2f2c8c58d47f28a7b3c81a8914df5f757947eddb3a99ad35bcf1bbe82e9f49e2f8a160d9bc36fe163df8f91c7dce4cd5c500f7cf648d53776511fd4c24e76d0248fd37014fc6bdcbee2cc853e1345278f35e1f3ed421d6b1c359c8c4844274a4205a7f4b1ba455f0eac4c9ddd79e4d50d4f60b96fca9f3da3cb8768529972996d9c19479b7ea35691ec5deaae6b0948fcad755cd2bdd8c06b3a5d347b76ad6825d4a8077cc6a61543a6e4c362e979a78f4dcb494b806edc1a3557664b8ea3d681702932ba284deafce9e83bb4eb0b4e916670c185b8effbcba335f95a7e44638d9d54049561baa71f13ae09df5fc587a01c853b3278ecf1fc9070fddc2cc58971f8863c8d3d985f310a18303298ac6c188b46bcd3e4af4486b6bab553d6fb1942b908635038f3873fe9898f98a08efed3b3def5a7d528bb477ee6a671dd31e5dac2557655adbfc10923441a77959923bd90ed7745988efdf48bf794659bd34cd8a4e733f97d85178021e8b20b185e0cc47973173c15a681f5adab52c5c4c6f3a2364465d3d7f7928853a5a55998743e58695feeeb9f07cfcfab7d679d0dcc6eb3f9c16bb49444e8da1de7befbd38534d0b7e87d6eb8be9493d3e323d6a51e6fea8ba59e3dab6f0a5061cfaa8a3f9306065290466509ce7eaf7687c66ee00a18cdde76d0b9e467e3fa7b10dcba2b8ff347349c2ed9443d5deb6759f25f48e95c04838ce8b96ab66cc2e7f35c9bd316eb7e1bbeca956c5780fa491a87f0b073beeb48b98dd4ea1b276020256ae6d85aa3dbfd60e6375b44aeb6e345030bdb744f6cf999af33e89f1f2934c3438f488e4d774e3b88af64ffc67263e3cadbead367fe3b82d9a789d55f05b3d868c6a9b7bc7ca7e6918415ed9f2abff4ebcf0e36f90e69c0bad83ce3cae9d81e33a0d8b348eeadeebb8a8c9e5247689311e5378d256ffa867fbb9d4217339976b4af06bc3e5b9d93e8e45cd615cbacf65bf2bd899db6e790883ebec896a095959af55d0d7b39aa7eee43aaf6caf8c71dbd5a57dad71d7e9a2826f5c2e4615cd4b74826323b163cf26ebf6a14f4efbf381df549b15dbfba6f84623ed461a9a35863bc0103c82a0f44c6ea5ba48ec4225fec92dde0645ca365549c7bad952025763454fb83e5806d3af74df4b8888bca68accbb545d743443d8dcb471e25ae4b748338b9f2b8feef762bd59bd5848eaa441d9ef9527f9d6f8de3fa98340ae9a142b84b6a98c6577369053652b3c5d5d4d8607737b4a0ed6c5ce8b40ec680839ae82e44f96d3e7df688f6f4fae6f4547b4fb9cd0778b2e5c66e1e5382db1cdc432770d83aee20f59ce1fbecba29a1b9d8a5e2dcba6b14d22bc7f92369ee79dc4f0616b2d4637be08558a32fe66a97588f1f8c0857985aeed12088a7ef26355fb4b83849aa3bbd6b886aa45baae824a74b06fd90baa7cf2969368e6a82760e60cfcde0791e543bddbd2513ea285c41877e9d9b4df710eec73ac8bb64e9e2dff5bc324441df18ae95dd3c82b63cdd9d85d083d63eaf96627a5cc754973dff96f11aae6cded2ea4d740c853fdf2576c24b3816f6d483448d9a28c3e2bf95a4e6bb36283f4716f9098fb52f7babe54b95773ae74a5ada3767c2f6aa992f69d4360d71ece661d94c868df7396c2ae58808e07808fcacef8531d97617335cb098cc530c5234dbb4dba8f69e6db271376a537fefa40a464bfc620cccd8b2bbd199efbcf7aef752b39caff4938b94fb1519455bca30c9be5f6e2942b1c6798b584d8948fabb26af5be574ff1f838747d9171eadf225d7e78d3a8867dd19e34332fd7766d39d5708ddeaababb0ac5a29a9ea1189a6c9364b93a53e74ce3d91c656df3d38312f79de9add45d46715d78a8c9aaa5414540d9cc6553cc911bf4cca4e769ca5b8c576ae8e55996a8fdd8058f91c9374913ba79ee9cc3ddfe7c6fea590a7ad9cff7b365881367cfa529a85ef8b34d64792bf78696493eda9a38dbe8ea573b74a8247b04006d505ad38846bc2a3117bbd025b0f7a7de41806de885d79e49a5eee5db12a57b1a7da55ccb00b5b +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 155c29c5f0378df0cd0e847a80a07143cf7522fcd880c9229eb9feb1ce340cd2 +public_key = 2626cbb144988a6ecd4a5b3798aee772787768b796a5157c181ae265cebc6ad58814adf8faff8b3d8866b8964a5253b79ae86064b5979a0b468f87ce0ae843f34765993ee4c03f7ff08c801a3a99af1cf7c72cac496e4620d373b24cd1d1ebbb343ec4f0ab6cf8ad3804545427547acc2a467e895d75486f23dcf3c779a3910f6e41b56cfb04b1e32e90894a3c1fee6f1a0e7d7cd75151047618b49921c8990a68da04ee656f94ee962deeaddee06f0cb94ecf789cbea2b369e135bd5e7d983736f83cdd985d160a9cab3edde18e3ee78b411d8e3fb40d8742f793e337a699b3a1180c5a49fefd92b9709525858b7dced3dfc81e0af501283fbca4c4b5fe904e75ad66a894aa57cf251ee8c73643af435f035de3d6664543888f803d327bc65e373ea4da4b662923eec5067ec5a8c354f94aa207b588fe39fd3583b3cb51e6f7926b9a914c15928738a75c9b618b35dffdecc6116e618b8d38b3c65841ab3d5c0fd4c22f723b087d4bef604f5bb6ca0e3c4f38903f75f48c9783db79b98b9a827e5f8445cf6c8ff4d8d785530eade23e3d371cf46308eec6a91d97aba6f80fed58d5a8f07e666ca0ecf13fa48892c3b7d5f49bdcc894f2a8659fe882201b4eadfffe1713c06d84e56a7ad4d85cdb29f6b53fc6e774de9f5cf9394ecd3ba919f3d43d55b6cd89f43961cf9eda28fd878f4a77e9e6da2a1842a055dab82d8d24cc865a6393aa9fdb62f96abadcc0651be71b473db3f9e9078fdcf7ea3730435f63aceae9fac889d76bca76d2ba96b0eb98aa44136cc3a978b747acba054032d36509a7ae9dd3d856bfb169a6f8601793062c5705c5b103344c3a77947a9fa2071c35f6393942dba3b8545eb9a58ded8a5408af70b686d61dfaec5d59df26ad5c108f750af6e51eefbf029af8667f69789733f1e4c27a2d3e2fb837e6bbef31cd4daedb3ac38d9791e8ce988a4c1754c8fdfa8be0fb8c95af40ae4bee73ecca729b4ab14d44be1b97973aea27cbe0bdf4f40d49a5691e4b938bcc051bf6145598905735ba2a3198e3a375b752d8f5a84004890e2591697ea34469a8cdc8b1077482f785ac3e497574aca642d74a3625ca37dac98565ab6f4c95a289a434c9ce9ff6ed12acd73b5cb7563d6d47873fb186bcb86ac00cef65c42dc70788bca0f462fbca6db98d59874f5a6437304ce48d5958848966ed37c6dd1f27ef03ea8ab817c93ea7c3b0cd6447eb823e73dacc5fe3b50793457aa8f0b9b484d5830399bc2c98a7fa55ffc317e3fc85ad9a87d7e8343e2feee3ec43662527fcd426fcb783de603f7e9566a01eff7d06b460d155c8717469a365acd5ea80b935445a76e0efe3d62ca954276c70a8085c42aa7f836f8655f97a07cd98aa7ba8a1783060fb819efdf7daf9f56e8ccc9b7f539995e4493dc23ddbb3a196d147bcc0edb69a0cad3bfa6f6c1f35a611f686cc7e801e23de0cf363b795bdd9d3fe82978f53083262b7d3f85398d0587c2cdad6ce1c83ffe6e4d1a85d4377846248e4d804cc00778979edcd3e37d4d34563fc23494d84b6a458f402cdd9b70e582bf48d762e676023439befc48e5b54bbedc592b64d038883a1ca9a4a843c100a58d29f70f8484da82ac633c3550a1634d0a7cb8bacaa19d4500bfdae14499ebad63ca2dfafea753e772f46a0834942643051be51cc9aaecb587808754e2abce5d6bfc07466776628e30acee32123f0603499dabfa5adad65d9cd88b24482201cdeb26c3f7de8751ef56850ac809768e852873b397bd5ea5ce23483d9c88e4dc8a9f9ea6c3f09d9bfa92bbfdd0680591a69dd855269fb77e8184ddb4aa0d4bfa7013ba06d447598e95222774badd3544b6c80c229392b0caf13a94eb3bc920fecdad3aaaab45f554a15ad0aca4d7038c208eba4f5be81e8194e21575687e55b5bfdc2551acd378f4c73c950b1d9a8a86f64adc88e6f3fd396cbeaeb6ac836ffcb3167c7f4db6bf0b6552dc3e4bc9e584b86c0d786f041075a432583f8f357a77731eecea7eaa3fdfe4da8acacd9d3a687dd63dff1ab95c4e56537dc6e833edc0d3c582049a18013dacfc37910aeb437f9ee1f77f62e03cb59a87485658183dea5199fff679cf66ae7dfc27ffc5c2d6ab7d6e511fec920db37ee95f277fe961e64614ed8e67fda7091988c176e893ab163e034a7e92d569882badf4976ba648396ee00e3af7f5bdb9a417e +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: a9cb9a61a3324b1ea5afe693b32784e2871096b2ca14a11acc9577c52359a241 +public_key = 032c5f6aa3dc1f65420b1cfbbab954ae55ca838fb1da2a61f2cee1df33edf125e504f9d31b8bf8e7a3e09ed49d478dfd25b37f58fa812f685090efb9efd3e9a1976064a648bf8af51a948b74ca3f1985c5f124d33f1f40bf3691238b507cff8956b5f204459eae17fbbf1d431a56af24bce5f8b546a63cd3741ce6ecc8afc58871537c485ca93617b3f4f72991274ad549b377ac14daa12a46d366462ff7b76b4f9bb88e922f7a53973854224f4a24b366651b72c5f8870d2e835e1bf94906efb367ecdcb780db683c96ef3b708889303a4b9f2b862b68a4e36e4eb2e8e69edce349d9b71c6fd6973487660b6e4cf544baa688203bde8df9ae88d85115f9a183fc952666d866199383a9e4da9f6cbac8993013c59e979aa8444a54a7fb99257542e4adb869cf56dcb305455bfec5bcf74e37b73bfa6cabddcc6c386ee6e6d7af5259ea612e89c21a27db64e379459bdabe7f5dc8f53a55e5760438fdd474c4ac3dc4218a32b4183f0eff4476edefc9f8550b0aae3a9dbd414561464ad23445bd23c7c321dc80ef05daa6155cd7cfd59fca448ded5d200d62f4dfe849e38a7b9dbfbf15b192265f11b5bef91a6bcd18f3e3eeb41485de057583401b3a5f24ded7bbcb87bba4b1aaa1aa75a911dac26298a7baae830a48332f139f7a5ae2a528b9496e97999b5717cb8552b38f7f759beddd4970eb64bb58f6a5cb47bcfba7cc46ca17039f1db3ddea436de4b6ab76f43c07dea1db65a9002aee106edd7b4755137bb4c08a710e9a9d7fd8cb32d64153cdb8604db9cb433ed1d7bea29fec698e30975fd53f993739e3bcd38951434bf91faf6f0948cb2dbbacc3088d58e4fde008ab582bdb3a9341ac18c28b23efd4e49964e7fd65658c684472551ad6e68391f8d34bc0aaff2526e745c74d6878ec3b333ea58c412f68b44d066e33cb7ed27f53fa655603dca0de8ae3c8cdc78c9630f5c57ae925ac97b8f3102c423d0b7a3af864c7a95885e574d67d89564da3793b3cd0c73b5b2e660b64577d7be46e888a113bc44d78c175aa7ee72760f3c6fed7c971af6fa3e9fd8ca4ab7daa43c51a18cb72158de398326599f41f07a9e78bbe0c4cbc5dc388b03a7c131c885fb63841445469d4f502de98d114c31da36418985ca5d951960ae3b59599f90750e4567a76a767547baea91c6580b6f8c4cd52c3c8bef8755239cfb31e5f621ea5579b649f6328695a06fba9df8402a554942be1baf7b54ffab7be2e918a0a6d6a368516b4a04354b6aa2f901fb8a0e9bc9f7713b9782f6bd8477d5d7d88b8c9dafabb61d0c3fde995f9aaec904aeab8d034dbd01e4c5e4afa450dd53c6f8f030ad5addac64d9e8916b3d31d78d81045392769d1c8d8cbf17741a7ee85250c7eb9379de56e76d0b6cb037fef98cd83b80ceeabc9a0cafa9585aa848606c9cbc58b96da5a904e4bc9a6ab4da8e1cd3b3b5139f5bb5b352cb67f76d8e0b3fc79113685e85595d4d6fd41633fa19fc31fe3e0220f960b1df4d1f460be89ebdb1be9b77ed6040af7d74f3864e93493066f859b86b7cf693a899dbc36cf667ab5e4e8f7847ecc411abba846b78019dc7023a09409cc464eb4d8784ba0f643ab6f33665e525c3e5d6fc7d86ad6d4b237f334cd71b23595ccabb5459b6307b5978683e009be4ea24fc89a066d5e5c502724bc395de3b5544a99aa872d5b65e62dd31507d191d9aaeadeaba2ace8a5549d11bae95e7d46af5ea864eb4d6929fda8248300f985fb5742a9fd623859b2a7aa600fa835a0aa647efb62ba3d9ba89a9c4b7478a9bed86d6c955844f2370db65b8d342cdb6789fd9b138456773aa8a3be75f477b801cf803877f53b06b5c5296d8ca3a4c85496fd9b413383c0cbb95880545c178d99927ce75bc6d08b1abd6a5d5b8c88fc9fed68785f3802a936830c9e58145c669ec66bc56abe38d4b1bcf8394b9f0db695b15c560bf48ded5c54a57f44dbfd89985d65b8aabc77e4a6d1178ed5c5d3a4ca40c2584e878c5c15fb41307ac297da94a3ea7e204b8a4156489df3577d84e86e5f55156aae92f77513ddb54d2ce559b8866a04efc7db75cf658625f784ab36d89a076ae63ed3ef3d53addffa22af920c65c10ed6437248d292293f495cfc663a87d7eab6f01f6a4e05d1039f4497f7d1554f6f8b9801b09ae930907e6284e384a1c6554b2bc594591397810b18d01bd3777534 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: e99fbae8a024ebbbdcef32ce213f6aa942e3eca925e5da4c09975d773b33a175 +public_key = 059a381bd53c1ade70642535f7c56a2f6bbea8c8f4a81339da5945f7175d08c69784e67d5e079fedaef9ee799a196dba58485ed73ecabc19ad60934c193af7f9266bef098ce2d8474088f6afdbdab53d57008339c534b9e19c5a364fb40a3a88d41533b3467550cd9fcfafded74bffd7048e540bc9af59f4722f771ffce29cfe33c3c3711a679353a9a0ad47c4094471aee9619eb58a393ebc60257e08dd9def864638498d3a83ef24b8e41788d1afaddb5fb6cf3374320a36ed58ce70dab6a473c86036733e86ff90c9aa4cf7b56011d6e723839b1e7c629c7cb5f4e4bcd1d6c9fec583d4b78670fa7a53f65ba0dda91cc6620a6ce129339ce2a93a676e8c1ec69e585ade9c283993268fdb1c8ec25669439472d409447b7ad4cfd699d177f52c29af53fbf7f6c3950b456861b7ad273887bcb3b41e75bdf2a6fb604ba6295fa92f8be92cca7391accd0bddbb6577fe673e7ab82bba06766917455f7fea8af76dcbf6f3e03f7a60b9736bf897b3a53c9be798ac0c493911b835b55e4f3e095a49a474c0d9d7987867ce1eae25effd20faf4bb0f8f03deb2966d5271dddc733bec19658af14f4f2c0eb7c4b8896e77d6ed564b880febfc2fd8f9f85e1c5df44e7ffa5aa461c26bd319567b7cdac03d9bcbcb0f8ab10883725da6436e38b1073c349aede7eca92acbbc0a95aa88864d734bb90cc8b8dbdcb91c4c333ae46dfd8353c27438abab8a6067fd19c5bacf6b35a50b86e80a7b9b44bc74f74b051cfd6975f98d43e50c63c7a25e50fb76d82c95e637568c2e5a9952e7ad62436e850ea0545c6415a948aefe449b5e779005bb08bb75fe5e8c2eddfed6cdb63dbb35a386e2ec44b2a04a3d3c15414d0e93ef6cd9aad6fd1dcfe2bbc7bc7b48dbc88a37ac1d3d8736d5ba7883cc0bc83b2db2ce28a31a4bdbed2e6b7b24e9bca5425e255b25a86ddb5ba95a0dc109fd36a9cafe942ae967cff5b03cb73369d1e6e3f613b54807cdc737984da26f84ab0b4595bd734fe5c6019cd47d238fea777538d49992a9fd1b1eff4a75d08554405e4cdbf8d386c2eac5e07470d4e6d15de45b3f99cc1b9b6f8e459e9987b773d69e3783b521eef82b177edd9c631bb4a7615fc8eaa8aa1be6f26aafb2d7a6ba36be670d27be1ebbf8d167e054a67e94ab3adcdad5ed6d9b527ea1d4bceb3a2876e33b7218c7b1a119812479c4974575208540a093e446a7be7bfde50859ad522add891b7a6cb9cde236b48868c30fdf63925ed548fbf1756c3d9efa564df5780ff7b1b1f830bfbb70cf7e81e08fabccc941f1d79b6db3a012d5b7ce5b7ea9daf4b387cbfc34400d57f00cad7d608fc28a9eb289f5636103e430245f274e49c9567feb569f4e3cf1cd9b80a11aeace48d4b899410eaefd42a9ab68b76c2c4e97ec5aba066453fdeecf05dfa315a6e126dcd4fb63361e137a258832679865cea937cbbd353474691818db1c9fcd09a6f2ea137e4d7bdb31de8ba27582775398027bc550ad9d7a23655655c492ff31828e6d45437be299feb73958b56899f25b3e488744350efb015f518f3caf122e5df0bc3265d648935a68806a756185d6fcf9d0de0cb07f7686223b99917e9af535fac61a6c44a7655f54585abb4d27efae529fc2392dd9b4796c87097c2667d95bed3b924653bffaaab6c9d35d176fb44e84e69ff7a74d59f54b44ff6fa68c8ade798362de1966db1a982ec3af25fcf0f48f4cafdb53cc5f6f055bcabf7fa9e817d79046b57efcff681ac8ebdcd734b7eec76ff4e4b8d24444dea1d339e44c7e2c67e7209ad34e9a6791888c9968987f8edfdf2e5207eab3f38aa491a5e90a885fe85d74e189f0ea64b6fa077336aab211fbb75798ddbe46f47299bb8f65c132e48c54d47eccc7aa124547ca1d831bd98b07cbef435ab7c96a4cb9b46b36b6b667da4eb7dbfa13febbfa88b98f3c6c3704be401ddf6566fd7d4c4977ac8c98ac44959cf8f75f80ae68466f6b749575dcde4aaac4c68e07767d09f44918bf9df63352dcd76c1e393e0e5d67c76855a989b04547a62586fc7316f4835a663629ec83d3836bf74593839a83847aff3bcb3bbe69f76dd0c6aab1df08994e26e861498fa2f4fd120378640dadb16da9c34f9bc83f5eca34f79404ac3c934ebed499160fbd66a3d9e7a76cf09507b31fbf659deb7bb881f5358d70595c01fbc7ae7183540b7883122d67ba +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 67a216f37d67f5e74f782f1badbce1cc8c80a6130aec305b421899a4faa0a6c3 +public_key = 129ae70837c0c51758a90e31698ec56d436839e5778e79553d97c6c48587bac980e17632f7c7af3de5a9b15ca6d346f6254a9e840d9442289274a4c86004fd86e8d60b38f1c873aa5cbccde464da8e5a6784bce5e6c3dcc71a8de57a83bc69f4d11e7bbfbace8ad5cdfeca785fcff4baf8361eb64c81453fdeb54e4e86ab4a397ed6e84b9ba73a0c4b8b6073e8ccdace61c7ddf22c4518f463d844fba6faa846eb55284995f36a7467385bc8b7768a8d7ef62ee22e2fd66f1f619e37c8ad0872d68ed084afb9dd8ed7c955623dcfd9149d34c9b3c6cfb7b31345d2621662a61bb63b9c3a4586c22025e6ee6c3f2d35d26fa3ffc13c5426d64093cbc768985fb807dc697e755f98e1c60a4318bfeed8b5a7e52ce784b562c3af44065451e22935ba9c3ca6a63dc945ca37489e317abbb02c9e87b6b7093beb4049c604fd87d3596169baa2c6e3a778f6eac6fd4962c6eaff07a70eb7f801bde43e9c43f2a7f909af7e0f3b627cfe48416936148ee115cce9659c5b3db6bc19ab7be41cf4d5887d93e6b7d31899781f44c756790ee881fe6d5d1383409e6d8fc2bedd6f35e1cf8e5361a66db6244b00efb61a46a889ad6f336d409239abbb9c717d76ac4d658e728977cafd9bae96e05d796f0bfc4b87385efcc791abb5e69c679dabe34e1ee44ea66ab3d597f4c3f7d99be8da9e5fcca8ba95f9699c3ad8c90199a3ba6e3cf975fa79cbb93c8c949d0bdb6a8aefc5e4a6042f47b7885b3843a7af4c7bd59d68228875a10f32163dbc6c5d76d0853be448a8a85a8be09b94e5d65d3cdfe94a977396e7e924bc5b420aa6283b7ed9ac822c27641d9ee777a855016846899f987e936488e7ec9bfda8732b6ac23acc24cfbf8719be5abf3aaa7ee0ff02af63858b7405482d684848d83fbf3b317217be6bb750cae74df77a8dfe3f539e8964b764a100688301bcf0a963d6163ca391d33052e7488dff7d4da5be786caf9aef94ba1782d56fc4476e3a15f97e9f5632c524cbc053d382f8f85613e5e6bac00b35c08484ddbf159809849f8f1d4eaa28abd5f6978f17ed53279c4689c77c43c0b649b8aa14fa9c8ca969ff8c82dfe1f8bca19269a9d799854797d7489caf779db529b988472be25244d5db659014138d9b6e33171c68961a327099477769f61d5f3f9ba6a008d3c14b1ad22969d26389e2c01f30a8b763ae397f806cfcfc5ff8776443655f74f6dde515986cdbb3e285f9c72fe7634c0b44a52e50b1dc75d8cc512e5d3b3ef748747eb70e5db9650360f073936398356cc341a02ff5a3946a61bb38b2f6ef0ef85d1686a29e66e92d9af6d43af2f274811d0aed1c4cbfec93f38815f32898d5aca8d00944b667346e1746e1fcdc3d475bdc31bd620f69b3d463f1d9d9ea130cb6842659a7ad904ba598ac7d63374e7e186d7e8663f8cdbd35bd0646b023c3546cfb437463cf0ae5dbd86ee12b8ec24375f5b4a3a0548eb9997030bcd92a579bcb7ada984c9f3553e2931c65334f678e98502b5e9d15e645970cf3420ecd956face9ba56c52eb692668976b3a170d88c461ee47e6c68ede8a29fd4951e3fac9ecd6f700cbe9b536a476736b1eab14e2493c5a94a07f6ab5b3f3ec3e9b9f649f58275523fe3f071739b585b5d8657aa512f62700998f0c5ba71974c35573f15ce3a7094f14acd77624737e6ad6d52863d6308e6d57acb500e42c9167d2784365ed78c9f7bf35c7368f3bf6dada6fe060ff89ceb447859d1dbe87e414ad4f56fb4395b5e2264784c2ba356935dc1ab3c104b6be0abd8942ad2522d55a1e7dececf81e09c78215ade58ffce035947239e81b943c5380b7e708d4fbd8e5a204df3e4aab03fb4b0e2c459f58c348249adc6b4a54756f2c336fb128e4acfa872bb6c79b46e4e3bdfa1517adb0dec98f863cac1bd61670ccd8d0c6f7eeccdac933bad47cecedac3a533eef2cd40aef8bc540f5e0dfbb3d5c6cb2ae96f12ad5dcf8885aee9756a13ca0d1f80c4d331d50b850b7cd0999360dc585e1d849115be3f3849b36107d93b5b3db57d796f5761f774ea89189c748b4f6b88822ec85b052f8f04a669c495af4c19eb54a3835b379201d9c7273557f74cee357588b68baf3e2a5c88bbde9e057cdbed6ce77fc84b3ad4503372c0f370d114ae10f97052fb3ba450d323fd3bb1b887fc4da6dbfef06ba5a2d5344feede346d1f04ad60895ab5 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 52b19fea232c9154a3e431e9d69cda40013cf2d485c3cd027ad24e645420420b +public_key = 2ded82fffdf3e6c49fe048ecf056ac1bdc958a5f71f5ef45bdc98ee3a87f661e91833bf24b3c552866ff9498979c4485c42d6eee0a6f5cba8fdab7dded1d5bedd4de4c6b667d1739c868df2d24637104e6411c803bedb52f0b5a6cda5fc344df1b0ae1bb29acd05dfd6f06472c14cc52556e5a97b56c29deabe6817985cc346baa02c76afbb6b6dfe33f711c78896a529656b4acef5516e448bcc4edbabc340ef4b483b750b028df68fcd02037ea0e9b9f466a4729ce9bdab4f6fc9ff94dbdd261dcdc3349b75d397674644ae5ca363774abe9af90240abe4039a7e124cc894657ca0f5e1534b91b896eefd3af2d559da9f8558fa7774708a7fd535580545bc68c9cc89ccdbcc78ed62d3ffb653965e7b0920574b89d7443b993157fcf1ace7dd18ab8794fc85356f36664688169fec3f5cab67b7e768472a08a43692ef0f59ebcde05a9805c6787b96eccdbd5d7d944fc858b5ec3828869f34da88d8e0d542c1d4883f8f4e7b630278ee1e4abebb5f4e03ea9ac2b187e046b4cd109709fdaf6b08e344003d418dbbc34598ee5ecf806794c4e0a8c6bacf310c34636088daa2e47d6c3fa7bb447f50b898c5a3e5cb43d6e4ce47bdd85652ab9edda72f25b7bf35dac85eef890ce88ba645d88333b66cee5082f334b66e6429b608a0c93d0d946c15576c92d93e1bf63bc6fed9fda997a56ef1ee4709896efeeb8b557b4656cbac57dd6efaa6edbc1c95726b561a1ca4001ff8a582dc42eb932f1ca8fc9b647d384d117ebca3d5587816bb48c0cedb4e9caeb7834e28e4a7c478fa15f640bff53381f42da9575c2a66bd01c5fca4b958ea437e6474301069d0debf54bc4603d3ba5b84e5a96e5327743662caa7e0806d9be974341c7ddb77a850b3ce1e3b4cc6525808238cb0986e1e77cc44afe7c63eae22966394e79518fc6d22ec470e8d5d82a945c73c5ff05c38e2dc3419a04d90e99da6f8e9bb1c3d1056d57e54889506ee989b4de854aafb62ace7e586794afee292cc8611e81599977d9fa457bbfd39b14488d5698a9fd3df1b5647909e19beed5b038f19b3c90adac962369ac200d43373bc243286c24f599de4af86855f4998e98972cef894e9ca09b3e502fb64b3fedf8e3fafebd572bb6fc7397f35fef752903535c9c912af3dc925ea3b6d4e5d59a4969cc432d0881970ffd528d37054f36eb54e438acb6bc6eca45c947ab98a53b44c48129e35f776f2aa4a8414ae142cc4eed9cf948f8ca5db39388dbcc16defd13035763a57c523b99a2aefd10df9b952776eb03aeed697320c66c0f65b36aee3c7ebbee99bf81e8be7cc2cb9ceac7f5671bb5df0933eb5c70a3d39e0eb5a55ddfdafa1faf87dcf3e10ab77a9c97563deec393b52305ee5307b177fd5fea16a2dfcac794f834f60a712f13ac8e5e74d3a7627ce66fb96f497cb95e36da3f486c7432e5983c2cc8cc3a7582a6b22c5a7ab3bc5107c831af145fbcf74efa5f3bc8fdca5eb97b34a3872b9870eefa3fab06da475c46b1e736cf03e4f046b6051ce3392571f3df52959aca2f94e8f7489809ea5193aaee829fbea67e92632d8109b37bae34f4ec3655adf9da9daf35f69c8a3be54793655a9e8c6e9c64354a94f458067296fd8b6ab3b938e6b188ccf52d4569599f82ec7d3f0dbf37a67a779d8957c57dfa9be8df2673d3898acc60439a975c8e9d8342f7fea7d6d9ff126d6435878739d3bd2756dfb5e735a73cbd1cb6c658dda6074633de38647035b54ceed986e4573e09820ef56fd8e7eee77882308fe94237c0b5344cd8c888f12bb34fc86e6157e61143365fd45960396bf45a8868176c7d0c440fbb71b8c6aca11b6ef3e33484f9bc23dd900129e8c45f5cd1fd724423bd1e2cfb46a665539f6a3a7ad38a5eda3e5c41d67bd7c1c4ec645787e95d3c613343cc83d66bc85b039df5c3bb6901e33e243ad062fdd1ecbb7ac79d837c1ff82a457ccaf4ddde98934bf37dbbbdddae287fa0b6f8c42a66a8ed5a6645b244f9d9fccb6ac00d75bdfd974ba7d99a7c67a2d7e090c7bb027fe0d0ab69ff775dbc57f06429b347e6749eeb3e23983759a583e09be653cbb5ad4b677f9b9b375f87c1b559c199c3945653a3bc7b0da8b41914be5c5ee26818d396795f1b95ae1497e398ee4f8f3bc9410dde669886668c2dddebf98e5e270510db63b9982ef818d1253d74a644fd56900607545ef8 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 64440adb05db3308b189bf999f9ee16e8ee3a6ccbe11eebf0d3ae4b172da7d2f +public_key = 4f34dd6d4ac24ad53108968ce43555fd4bc4e3ba3df8ae541e0764c6a387de455a575fd3faa38457376a327d360b63d3be69450acc7ffdf638a90c7cf413e719fbf7fad55e4dadecb7dc5fb828ae5083d609c8dd5b9fa89ffe963d836a166858820f875add6c55b9505e84b1aedc5e07e5f94a084c130ec0109699b40d9b2c67603c05594904d1ad487168cece048b49a98a8740abba939e618f7c395d77b0649cbec2afc0e3df5c86d7d320f9fbe7595e114de3c4974b7a3b70d92ddd61b89a1ff43c30f48c1385e1375ba781e74bcb03f3bf9d8d09fac8991b4213db7a299cfc29455b3b5d92ec96e0c13f5187434239a8b652fda16434dca4f8f7f7bb7345848e01c5de3426fa35acfef8c8c9e6e9b7a18bc372bfdd2f086865a83a2ba3545953d68e173941e487571de840be9bd08f42fb576f908a8d805cb0919d54de4cb6b85be79478a0bae353d9cedecd278a310466fc1ad0c68784ef246f1f0847cc07f994549807cfc9650c9431cdffdd5cb0b3a9608bc85f02dc329348e1d883f2dc4993d4de3177b744092fc62fc7a31fae7415a8e4c59bb209356c5eefd620c4dd08169df2befd924ed5225cbacd9c6055fe499e7fd4cfed6206389b05057e579a9e294b43243ab92e13626557d787bf56f615cd364dc5ca675c4bf68f7da4760105367ad3c6d72afa4c2d9296daba2778f23ab3d845d4ce7d67c2916e56bbc4c2452de7675f765e294a9f2fc58dbd31ba06a11b5a8ae035a37db36ce187e99916ed722cc99eed3e96ec3216543ef74447dad96bfbd386b3154b36ed8dcccc88791677054ad001dacd8eb6c34cab6eea355a10d5e7c55e64e9eb4c724d91c01f9186a6b3bf33a8604967175fceade8b55bde7472b49513a79f2b867bf3157d5dbc929984e47903ac69a6618f67781a55d637eca5d0a5d948ca8f3d7c41983b8943bd3d6a04842a09a4896ba3cd345e7e7fa16ba3c63d95a1e85ac4fb04fffb588b088749e2f66bd7fd6d56bb80a818c2c56c5d1d1b5580863d1f0edbe2a97f5f83be1259ec7fe6f9d21f823e7f8a2aec939e163436259367473ea0b63ed37bac19934da906a21e5355a4bff77519c8f53c96b5fea8704b8d79666c12248196add48f5b9a8b767ffeada20697caa075ac25b5546af3feb2959948ceefdd384aea2692f7a5f266267aa559c8f09e68a04cc57fd8ae46674b75e785536afb1c0c779a553f4ce5c1c06d94541363bbda825fec4b42035325a3a2b1b8e35dcbcbf22ffb90aea37f9f5440e95c2e5cdee1f69319dd4283cdbb5fc8616e99c9acf8dd27a79b64c843b08cb9fc8af7d213d9726cb50735cb355dbe54d86860d7708c1ea615dc662edbf299a7d04f9670e27898e78a4b383fb4ae5cc45aff8e7884ef9355a8ef9b394cbbd01daef125bded2733ff060ca523d378a5e4fe012fbef3df700d7c6c14ead9736679b3adc33c035b3f15e3bdb5b46fdbbf3a5b80d65c4be918511bc8631e35aa5459793f858f364c96f31edd8859f29acc89e8b5d36065eafc9ced482aec21ebb100079cf3d45ab4159371c49b16cca69fda67aed588204ddc5864c03a9391ac1d80b936d1f23a417a0563c1ce4b17cdf55c36529f74a103036466fa9290744eca08cb16b94f3044dc4968ebecea5b64088fa7498e02b439981cb4b4bcf9ec4684152830ee8f864ca8334823f3fd8a8f66ca34bd4abcf07dc15d9f6fb8b6323d6d9efeb7e0dcb6548c06bc13d6bbb41b40caea5745c68cc65d873bb467f9dc6b3f8fdff4649aad27ebc65f7b0633cc2709932f0869a18dfda89da30586ef9d146c1b34d05f7cec808b6dd5d97c657f32e843cd61e39895adfb776f4b73739e3a1bbe50beb4b2348c836592a2e3edc98843956f8ebbfdd112643bcda9a01f34a8bfb8f8333b32e8063acc5344a4b3666779ec55d5db2f3d98bb4c7069846283b57fef7ed89654a8ba06797c57c2e7e9bf1414d77c8d928f6aebb6c6a753bb8a95bc46748c32e1eec8f7aac1e2573a48eed4ff9567dbafc0732c501bb9ac1315a212dee5930ceb38a69651347b6bbef50f3895a7844e1eefae45ec66214a8b41da464baa5fc61ed0c5073bdaf5b4a88c70460f56b6d65413ab3ed40fccbee864c578733e4da796a8ea8c3849f465cacaec79898cceaad4f4fcd9b57b426caf306d165d1e0ba6573a638fd7df6b3f824f240e7e0eaeee7d7a093875 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: c8bb46b3a7344ad170c2052fb042b5a3b62e0590562ee82577b1081f6f114d16 +public_key = 159d5ebe26c856fcce2d6f3156e43efd0433c19858c98643625d96823f591db37eb00ee3c1383239cd767316c0078ad0a57e4e49d694d90fa510dc960d5f5bf70e384b96b9024eb846dca14f44e59db49048afd5b318d01388e9406bc6e14786dd4d79e058ed098ca4a4fe5f5a3e35ca64cd7d3fc46b45b3bdfadd7fe7ddee467020ab49d446d355146d800d337a1cb452357bd11d74234b464a134abecce4f7557597cbd57c4972d30de3b5aadb843f8e88d76bd257ca5aca8913cfa9f90672903cbca16b9747ee35108638c388676dde894533f5dafb4ddfe435e149d8b177a5fc883bc233679df34e41ad9fe384654e6a857e49c5f62aaa31fef3ee7ea4d79a65bac4deb2ba7e1c497ea29cd69ce9898f3789fb2bd3cc07a5789569496a5a6b84966dc3b601577b08cdee2bd6afc315cbe75bd3cbc5ebb699f036247481aad2e5d6ddb54ea3e1afa7299ab0913a92e42f8987ce8639bbdb953ad1c789d7e7adb59625c01b1c406a4b339d1db0c8947fdaf5c14f77f1be6ce1e3b6fa7065a78babe176e64ad085e50b67aaf718f0b9b6f848378c374a3aeae6c63c06f1d19f7972dde88768991734754368bdebcac2d6b899e5ecc20a3fd5974e566b4996be455e90ba9aedaea40ce8cbd68a6ac0cc708468e69d6f4ef81af5ccc7c931d938687ca4a22f90712bee72fb3793a760a6cf9942896854ef6dd26d6fb49cf2b545d6b54e3e8f5b3c20b446dfeb58663fa09ae6d2e5c54d5e1cd149ec3526758f174ba49134c980bce09f8eeff658b7ce0de88b8c861b7ec700f9db1ddb9265e9bfbc07a2547f6fc9c54419bcc39a3f555024af652af7740fbf383cb67edfa929037fb51d9c6934787685ef4f83955a4768fb9462249d7907a6d84215b6108c72e21fe7fd9e34b797fac6ea3d07b989bd7da23b8f66777e8f31338c68a5b1f9ecba4b18bc47e3e61419530b77d41b3864697ff4d027edbd248a495f7951ffc4c857aac6f7a3394662afd84f79d5854ea77c26e7c57fd8a3abdd399ccba0ae4780eddf481bed65e3597cf1868c328ce4baf36d981ea3a8647d26ea52a409e49ba835f48dce9cc599f70ee687fe58fa4e520d143f76edd125a3806c66e08de46c5bdd93872ba5f927bb2a4a88e668c40af5b4feabe7f80ca75ab58224caeb485a9e1c3a6e82c8e4a2bf3bb0e6eae14a9ca4e95d03746a574d87f9c53a343ab7595572cf2542d7a9cc9016de6e99cb2d18880f18fd3ad9efbf0dc5ab24ec6385895d6f6d9c143ccda4d42a27509ff67c812d98415a49c0ee63cb0ea20a45add59e6aa61f467db549e8bdc898656cb4265df3987998c8737f3c79bedba48b9c6b8967a9bfbadb22e6858307977913d01877f82cd38a01798d3c7ebed21459ed4c4ca7ee85d565f5bbad96c1897c55789b9e19a6b303af32f493cef7e7bae7dcedd67c3dd89bed79f6a10fdc1798bb47de73452a31d75435314ee7355fff3cc9561d5360b665ad88ae9da71a7270998b87e6fd5e8bda5ca969120b4c610848fdc6afc0e631fb2abc210963483fe972ad8b95bdca4116c2f5b8e88cd982f3e647ada99eeadb3ac263e0deb9efa724cf3f2de7c0c86c2a979791e3d192bc3163ecaf73d8e9dc0ce23535bb3b4db252c8bc269884cf84d7fcda465c2aaeb19681deedc99a3853a96eac81f77e1319afc6f67b2ff5fdba6b38533e47f4e589ef7e617275dc7cb44e0b86d17479e217093ed55fedd5a38f2dafc41604c592366a89c4c70adba149ac63de1b5e21e78788f33d9e135890f6ed6a5f9dd9f658b44d848623b17447998bacbf1d3e5b1fc5bdf8fc357e89448fe7a40227f05c64961cd643ac6bc3486c5efd0d3011f8dc4f4494ccbef3c2ac45f7e9d19cbc7018669921fa76db3cb5436763b48a8046fa71d186b57ca4ff6529930d23737c49698c15404effdf8f357d5db5f3ee4ae17fd8b69ac8d335e388fcc661a0c8b583f94a8c7869e464a0544c84d26da829fe770d97be7bc43cdfa856689e727b7884e99a5d9fc549369a4ec5195ef1285860dbf63085740cd466bc24835ae33bdd1499cea4ef814e571ab638bcf896201cbf0b83f4ed2fc6d4dddf60ac6e6f13e7f0ee4efb1344043db50cf86227fcc7bedac20f9364e2593adb7599b524f174d6b999d7f5f8eee9814642f79de48f28d8b47d06bfec41fd06e2da9ae905005ad241ba55ab42a993df7551 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 2e2b70609f3fe029a14d09d5d659871ac776ce2797a0355f16e2eb68f5613fd1 +public_key = 212bacc44e3ae9ddda2b78cc3b0c7958e349211bc64f036a70bae6067882330a36aa4cb183497c035eb2ba4f964baffc265f5ee9e3834504a08564db36a7e964ed91060ce5125659bbedc96e6663a479a381b9e5fda7b8a414d61d9db814d3e46a549b517a373586d244ea8959fbfd98bc37e2f7309e09749c4c689f6b640d28a7a0b8524fb9bc0b544eb219683bf9ee79baa327b5c0d3ff713b78341c9682f6a4e327959f863e95aa36b91aed7c1d67f3d75f8269b360984857df1636f2b8dcf1383a776cf30a9991f97dfd074b5f0bc4fc13daeeaf4b3c7336a4ff6ea8310c9c27f37454f9af40fdbbb233f689c63ce4b7cbb98d886b36681414902bf77a2623ae5f0c359c038f82433414dfcfa88373bcde7bf1d5503774939f9e6c415c8b929b5c2313f3460eba642b75ef38f3e42b71658de4044a9450a55ceecd592da6554cf746944f9d2e5f6d3495efda24a6455dc7866ed1119889839e4fcba3addcdd963c3bce5504ec3cd7ec040dba33cdffac86e58d673ab1ec7a23c3dafd2a53d5aba3c3c87e0fa544088640386eedc3fce13153681d28c45b3af5e7256b6fb9ddf8b8ba8435b2f917f7d4394eaf49981b397917ce642abb68f60d6fbb2ba6c2c53b6dc5795a36eba674778ffa7e9daa65ac93366954710419c9a0cfea47cdf9252e582a5ed7e0af8c53554aa3d79878b53506fad3846a9041664bac6d56f83eea3389e0f78aff37b9933259f7d64aa0d508584047503acd4acbfdce582eb1f28fb53e96928927961b9ad4511ee8a453738c78b8a796ceebd960474bffd2c9c825593ff4a95f3f659ef01bf51449a25343f171bbcb051699b20d501f84bbc64c4e7f9c7db129dc472e664fb33c6259e0088e55c20fd45d1755f8ced112e4521d58cb9c89575a4affa6caae5dba470a9b4d3fdc9b7ca6ac29ed570cd9f647d382d04a5091d8a1ef749067848cda293a47d7723738f0f35f45ff457580857eaecdbda1ad59edfea3adfbc6d7e87184337e9433ee8e3774c9854ef1c6b4c97fbea6f939845942ff2732aee9d3a23b72cbc5e22c43c8ee3d3ae0d33a7b7d400199df0b378039daf71205d052fb594d5f6e7c86ead7bdcf14cbf51225c7ff42b4b5f651ed65e43edcd5cecfe962157e28d7be4fc4b5aebb6cfce5396fb5eaf1bc85fdb5db00fa63ee9ddd60a5761dea715258bcf597a434e48b243dfd8b4e5832cd417c6c43a669d36e0ed872e796a2e7d515939823575cb6dded35155f7399bfe1b3ca9bfa47ebd69f5c8cc8879b87ae34a7dd3f568817aa409f3df22c92be454e99d83023d3caa2f8de0ecb88194e4b034ea6315ab20b63c422b6be867fb5e8ff49fa48d2fa647febc89c8cdcf2584ce44c29eb91187257235d857b9bba4be3db06be10a35d712c540e7bcc62373d76e5828ced49b656fd8da931f24a6827e3e4f6cdad266a3529fa9b47cb6eed4f5b326ab0c0ad32b78d9d83cecc3e34f7787a413daa7d3976aaf83ac08d87b34ebfe9a92a631784bce31cc66693c75aa58c7c87a9e3b9f6b62f9a500d8b8519df351694f66743dae3a59a96f99b43c2062fcd82f962856f3ee20b5217a4e14d1459fd07d839558124fe8ff93d4730fbc63f198a2eb992e81e5e0705dadc58b1e3bddc3157e4b526f33496eec20acac85664d24d57d2788208ddea7ae383c93971d96de02e6dac0d14fc649ce00ed660ef9afcad375ae2bfeb11998264e86ae066ee19d971699e83968a98be064486b8abc3634021f770e268eb4383aa3c938bf3aca4aa2a337fcd6647aa47428bc027339f290fb9f135820f3a8bea06846beac4c2af702d6dfe50d338fc8da590a564f48a6607bedb51e839a4034f2c9d6ea34b4d3c875f1ff6bb57797b076638e4b576fe8c5a4918d6c0de78b4569a6a6f6001c8a5fa1582bf4bb7bd586296f9ae757f4d7b6c9c39df5274fee4fee5f5ac0d8b887b9e598ee72cc3939399d2914a3ace06a41cf92f6da963e52e7f6b1363f7273cbf4a342865a76147ef24285113e74f7a87d079157c0cad700e6bb9ca99ae10b83299ca9445c8d24e55dcb625ffceb79c0c433754cdb88c2ec71bcb38c643ae5e165030de4c0aa8939229d05a25e80446a166e74933f46f41a6867579fe268e6e7b2f7808764e20c98d33d6c3ef48d1d21cb37d2872fe76749aeb09976580ccd4feadcea0b16f00970f92acb21c560501728f +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 4725dd8fb314bfd8ee23731c2341dbe114606d9abe6434c471b5573e7df193bb +public_key = f91d37775c727839696aebe15b7d4f10199031d9ba3d3433ecc5d702068392ac97a2db354cc3e1dc39aafa7e9c4f5a7c051ef82ba4697ca8c70ebc4e179893145e79cc0df920d6bb7263708b2339f777c242f4c34155ac255fcc229d4580b381a964c281d750c15c42d8477e7708c45d6ebbefc6928f29e2614d9ac31a61400350e928a3b24c313b8ed210de86f6e9afab17bb075e32589ce15d3eca8c73d275b4baab7a98a778b97a78dadb56e1e657e68345fb6928b7f0378105383b5fa8e923f8d0001fce6b64904ad3835c37dcad0cb0a7eeb8879cbe163ff1e7ed994fea9bfeb9cf4f68fe504f9170295a8419c984283d79b882bc5fd876588ae74d3f207b3798d89ddc1bc90d7c91d8dd7aefbfbc0e59e26938ecfea3e29d5f83a03630543ae312ba5c896b969bcdaba15af89c0672b964a6cb1c4a11c3617ac3de4beb8b8874f85087a15c574c843e66c759741f493438a535919cdab0e46927de95802a5ccb3d78fcf3770ea9644a69c7313e4f3e9eb5e14e50b77db23458d08ee55f842ce48a699387e9e9dcdc63a23966a44bf927fcaf48ffcb36935d667ff2154d3256753ef3dcaf74de83c79384e89e4bfe597363684356ff5ac114f50546ea04798e377791b5553c44a9f7efdb48607af72d0f9a2db8e9a48749bd66a3219e946a2a7a0659d95ebee93c1650aef470994568625e9bc98de477bb5b01359c488ff69735485c8f983596e496e437a063838a14e9ae6877d0c493b5c3aa56777f3b7f7e0ee5825dc83ae9f4a51f7ef002748a5d2af1c1f870f5886b3aaf3e0c0ae5b625e05368da8d8a306bfd4a7418c88bb5c398c6cd8f75f9edfbcd602cd4997fc1148eab11ddf67c0c8c306e4b16e9f800edd9890bfb23887ccf46401b8645531d5dc79bb0def57eb8b6974723a9165cf737abbdb793bfc00da861ae85d3b8ea2257ca92ed9f547c6acaf35ac5833fddaaef38a5b4f6fff7b3fc692677766bc8ef85e34de6cfd0dd077574fd796185e40fa9c9216ffd6814d518c5aa8f84b1ccacbe5ced3e0a0789372c338a2bf4b47a8bfb0941aaa8601a7937d5577fdab4a6d3094aee8cd73a7632f417b63383bd035a351c3656b0b5fc6e435d6d6699946585b6ea9e8568307c18c025b8de9074629de7ddae6bbdba296e0897c8ea895fc6b5b447eed00e4c880747798ce4fc860c3bda63607b69a6c4fb88082593c1d965ac6cc71125cc56b7fb61eef97605787819749d43be4653e959bcf9a01c3ebaab30daae8c1c7998daef9415cadcd73cdd943d86ddcec20c537a6f296d89ff9b5d3af1ff3e4999cb6037d539092ef0d71fd6effeb1e1a498eb75f68e94366cd8912d269b2e1fa3f1b99572f6e38ccf9fa66fdc8a6cb2409d859fada495ce7fe7bcd9beb658f36dcbf3a5cdf9933ca1659f2a0551b99ed55406cc6c7fbaeaccbbc4b696485eafe07754da9a8b0b25ef02a7fdf2cce4669f9c0be64e38e6c55fdf37f29fe51d1a91e4253c43dd5badc8fcf3457e01cb59a96730b60d7ae0fc37a3b3f2115c8561fda2a1395a88464729ce8a16cbf49c168accd3e65305a6584939105b594bff44c2bb41415e63e5bb50fefed4e7dc604a69fb9f2f649c0686be9a8860794cee458a73796ed877b18e034f305db84426d9cf63f80facd95fd6774997e245a4c2bc9cb008ea3e4404f5dbd56a7c734b1b4ffde366541c83ffd5f74a0663a61f2773027f3579158ecd08bd014c5cfdb7610c6e789d8b84da23a58e67ea72a8ecf63cc49c59ccf045acbd3cbfed4571f6daaababf3bf36d91bc68ecbf4de674a7fee55fde7e0740bee6e7a3c94c3ca3be7125c7d634f185163398458311937adad8462b0cb3d6add994f590622ec20f6731ad8ea32a864ec383bd841dbd64b3df3d575d9374f6e83ef28b93c0c58fc1bf1d6f4cf4ec5f0d57116b30cbf44aa3bfe7b08b690ff891667e88d3b6702ffa9d8ed7b62cf78f693ea13c5ed679f6dfbf9a32229d6b5885404a83f6589681c1549b9459745455bae21ca7997960669f5ffa8daaa69cf06b17aad1cb95123dee53dca34d439167d559250e8e7f5e3fa919a4573b5500b9ec8ac6ef17cb5bcc38f93927f217365ef694c98a54db09c883ccdce14769b84ce736c5c9c52b15dea17ade4b8c58465438b7bae1c2c98ecf4aea6284cd00c4229cb6fe2f90dbbc05eb935c85f1ca2afde0d54307949544 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 818d3bb8ebfb32bf464775f7139bac0a5bddce80ec5798595992f9403002cd5d +public_key = 5227748594cc5ad5fdecbb390cb6a9b8f989c704801705f3321f5d91d5eea6174ef4a37b7cc5d5b5bdf9f54d79e14b957ffa2f903f5e7334bcfb6bd23b58d1f5f576333c54ef0440b4f7c8f6b3afec35f4e31943fd73f3d9ff300caeb80963d9e42ceea70e6de8f6ce4af647db19467e59fc1ddefb5b64f6b8339ea22f473d1b84c603babba7b32534587145b360474a8483be8b06a6086bc5666a9b5af8b4edb9f9fc6d606b85305c89cbd26a4be8a6b48678d8fd3ef0649a60a3eafc6443da94dabbdc4cab2b956b2a5b7dc9e7cbdac88a71d5c06df3b192c5cc5dc6b7d11bd7857df6a3f5cf0e6bfc5d1c80bde5c3ca33eac908bdb7054190e77d54e4db9e7534e0fdb36ec9f652449aa53d5967e57c9e358f8114544e0a5b90ffc490c4a3267a405e38653449b618ff6c6a3a74033ac484cd74d6edd29d98ff3507a7936845a6ab4d33bb4ddb8d675995f489ad67323ff6823f6e9c6691077a35a789e734bc6b8e35e1aba6ebb2fe7ee51eae86ebabf1b4968db6efaf667b50745000ffa33934f5457ba4635d86ab1a871c8386982a322c8fb7cf198ad649d60eecc1c2f4dbed7462ce4c6792764509e5cb9dcf8b5b7ea26e5f658c0b5b961e80f903bad708ca9bf7995e4595b9bdd9c614406c669469ceb4fa3740a9f9ec65cd3ce4a3adedde9a716a82530a508a7dcf16fca38bbedbafa8e0a8c3334c7b4a2a9d4b807fbea3f6e5061d7e642cfbe03ccd6c0546d2698c110caf2f194789d6e6adb3e03b5c7f015991d473837e9451c9cbc9de0f333636bbbd8f5dd0da77a683efbc3a831348cf1a3550166b72b5ddc59a5bb31eee829cc77c235b73bbdba937e5b45a456199cfe8b74ebe8c05ccdff9746bd64fd5a759a4886d312fcb63167aa3f37655a55e9acb967136faeeb99f6d66e82134e9b1b4eb7c36d213b86ad9c995294b9e96e77ba66a40f9c5f43bb38e6b7a7311d7c29d9f72f993d8a5f68c58dbe11e33964b797a151588ef5e5fc1fd32b054c7dd35ce5c734b8887465b0b4bb58c491f9953b1133561977f0c25401e6b577dcecbd555bb8ba7760fb972a7bf344e3ff2c0fa575717501c3e91ecc598bc93bd1468d0da9f4c06c36d046daab9678e93138d266572b305b7ea69a6ac8ca3ed64713719dced2ff7169754b4a3f4f029776ad3c6c3e33e1427d265296c1b7d56292d74a64690450555945a87ba57b54eb3595d08ff82ce552f19c415c6cfdc0cb5fc3fc3db16ddcd2d8b6beac782668eddf9986e1aebb6ad941a3745ee0b73ca0a5f98f5928be7e89ac6b2020555515d846edb51a75573ea1eef2d7738bb8c58bdde67968d5f03b4faff1b854d39810036e4b39b90c6f8bef32bc0cecd85466c8f55c7935ba6e57b6f46664d4468783478d4b121d6b6a026818ecd4516ddb98faae634977d362e316849f53b7a847224c381a8d2d6b84482988122a7c87d069a143e5fbaf56c9047c0374eb4b018d70bd885f1f3f52f16918dfd3af8634a907f91e7b64df5ee4feac9d9c10c7fbed446beff557d8a96e2dce7cbeb91516afff0b78bf1bfeabcea847deb7312efa782a567a7bea57c0ed6a55e3de2c378b2dde86909838b0eabc10da829a9503d9ce2f374c0d48a32c6f539a2bbf8ae1fbc4a5d7e230c9a399ee53113c1ddd446ac5e3608a567afae99624c98845a3ae09da5a89a309819ef207b46f28a5659f54c76bde348ee8a11db75f924774acd3c7ccc6b9ee7f2da2be18d4cf7612e6c792b7f304d6397bc9a7f1834391fa09e97a0f6c3c3b97e79888a6d6acdeb9d8c4b8defe5af5b76f7249747aba3547d44f7a9ebc30854eb68c2f6f8b404257cfe6d43a3b3f7d457651f0b600415a978decb319d4bb853b4dc48dba59dfb28f7c479fa7705b3a6cdf8a99def604bff670ab6a751236e094fed61e9fa285effebca600ff3d850f3c86c647746a65b1bafe0adf34003a39c16ea69a626c73929567f2bd01923b4f17f633709d224b74e511dd7ee8938cecbe5e1f993e1fad727dd4a5e3b52579c625ef79ebf66485083ade7bebbd0c9a95319ffa80755f157eff8fd63a30dd2404f9f1566d9142a685039c0aa64db3f5ed6558d3c7f38ece44b9cae5842f7347b29336b5125586d25e117f3afe13669bcd7991068bdc68676a703d8099d6db34d33fc5822b8cbe33012f5e916c80ec7dfb3661e433431ccb796ba70c5a1ee85d63d +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: c92aa5fb91c980d9cade9ce99d4c75b2ffa7d6a6ff9bd59def1aa701f2a0992b +public_key = 03a595bc577a703b420125336786fbdc7a8d14f6d784e5bf04ac62f5cba8327c78122f427a83800c9b34289fad6e93bdca2491720894ddf6e6a9a9674e87e439b8704ea57d70f9d95e05a0403e55c40d7b1bed467b7c7bcfd67a5dc679c8f6ba53b44c110560359c65ef74f5f667b5ebf9674a8ee9fc4bdbd17ddc930af79f349bec1397c5bf3bd95ea0824b80b674d7072f860aeb98f3bfc9349c8e0cd8f4f6bd386348a77857c277496cf20d46dfd59765dc9d01cde3c41df060737e668cb6440aaed403f30f789826b579359a3338c9ef6584b27dfa732406e95947d795568de4cb39c5beb015fb69404fc09ea8ec7c5658d1cab448a947f4adcaa99962523ec9128f58ab7635d78caeb86ac5c20db30a67f16f586902de863e37f62eccfe3f0cdaac4b6ae45c968fb8eaac089a04e7393409799e853499888dcebf9691defa7f6ef8925fef112af189cabc1e0da2fb9878c0057144bcca25c9a3f2afc3b92c61261a3557177629af52347355bee55dcec7be730639fbcf8e0536c0636bbadbe97674d83b6d2d9442b34e37d9a43e5d8e849b3c21369149b7f70e56646d984e00af43c87777083bc5437db14639ed8b4cbafc6ab7e72a871469abf40e8ecdccd753b94baa8e40e4956c819e3eff0bf3ad68792166d055f466b1744e9bc851e12648899b7666ae8a7123dc1e4a47c26cc8f1a497262fe86fb89a740cbebc6553ac4cd88c0eb21bd9c47cd5578cc58fc4697a0c756e7f96df91086aefb4cd03de84d294acf2ff87229e851f585d96d3b98a755bdce648e8d7ab5e8bbbe8cadb752973fbcdd7e549dbcb6ab750f8aab5d9d7042ab8f49acdc57f71d7bfa2ee148f145e82448d9fb575ef6da4379225bd864597aa65343c2eb8f8753ab2994d981961cfaf4b7f88d643b567462db7fe1e793b1a4ff21daac85e6c196ead54296b917c72e38e692797af7a594e50c35d958436826d36d13348f81851bc5332f7eeb55aa575af1cd03553fb10abc89ca5cf1927dd9537c414dec76749924683f3ded94c4c6b694558cd3ed45447bc5fd3979a694f7916b9f97904b02d48918e9e4ad9e88c99b5c28a6ac037248be9e3d54adcb0f3746acc3cda681ecbb25dec6d08d07a947d3bc35eb7b477ce29d68fcc74487fa126f98789d349fb7c58d9d9ecb1ec4830ca54e2e44dcd27b45c48ae07e84c045487b235f178075cda577b277d4803a94f9b07acc6f8e5a75696fd9f7c1cbcfc5cef90865f47a4546288a383c16bd5715ceeef845e9be7def5e3f84d68d0df8ab0a76ff372893618d6a28baff153beadc2e93f618e3026dfb15667947788b93ddc34f05374c9997a0ab8b72023ce47b5dc86cad0c86a37e33b7516437a23d37d6dab5197a88e823a5129d656b03eb755a89c4e0fec520b3cbda558130dc9695b497bcfb0f68fa42caf8b537a7024e3dc1289d7bdce667547b79ae655b4143723dca5ec494d851b3e3eb763f58d9cb045ca6a4d7627cb49aa69d99b15dc2625eb4d89cc55e762c1e358f1679b803da8cdc531b80580bfbeb8495487d3ddac3aaaf40bceacc457b53f6aa6a68db79d9cb95334de9b09df54644253dbc79b2b3029ef6ac874e042f7715da7e90e64ca4e1362463da882bc53b2d7f4f695e1021641ce277d0af3fd329b9ff554502def5a294a3829c770e9565512e5ff093eeb7fa583ca675491533d158e3ddbb96ba5fd5fd9b95cca15fb7dfd98000882be2cfad9865e4babd834189f91d544489ea561ec7baae5c82b09893badd920d6bf6efe391dfea2506acb25d79f6d54ea17bc5eb5de33f5059ae52565014939ab0fd9882631a63e582b486bbe7f850a17f4de5fa225d4dfa2a33f313ce6a426a3162993cb7370d23c300e2a5d2b8de02e9aaee23b715d1e860386c4bf5d80283a4727954f2d5e97e71f5bc3cf8757a63d47cdb322299e5f483edc1dcaef28c44cdcca5a9bc9515e99e7eaf82878e5757a63ff83c7149bc0152a674404b3c3cd6949a5df7b073f5387f8515bf0c676c53186d02a8c7af2865ebcfa57f22f6fadb6deeae67fa64e7ea4b863d82c3871d4f69974bb76e3338328c0064de22e38c138f4fdf47dcb5193d980f9a6b58f9af71a714aaf837aaf515313d6d17e9d0d6794f89750ce06c27b9e3832a9595b9a9c1728bbdc4515cf1afe1dcac211a3135eeecae628aac9538ef2fa7dac989ebf18207def +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 7e8086a01dc5b3bb9eda25bcc45d27f99874841b97237968495800e007696ac5 +public_key = df6fc02cbc47370eb03f5547f1b4a8078aa079c4cf39c56f899f5a9383b9a0f57b5884e760c58d2629c5d80d74e00d7e715a3f9344755bb9d8a4b3e0de83e50a79a9ee3957a83d687f5bfe7e0df6c1d699c254af674fbfab84809ea9a3b364e0c7688b296a3da82c6cf689db48fa3f66f5b652aefe7939ab77bd935f49c1e1af5422365974698c963fad012fdbd2bbe0a9dea78ecb392e6892624a3f97bf758b4f3246d67933eabe6cafbc01aad3153e338ab546b3154a80945a9c3ebb5f9c4071a4b0ac5beb85b3a11bee371db39771259937af7ebec742e7e6f82f19c4b6fcea70085ec6dcf3186c8a29f4c3a1d3ade9aefe3e238f024cbd30f6eb20ff312d9ea2eef9cdab68446bcb64af5d5c33fdca5e0f547c4bf343a6fdf8d384bad8ed15fa3bd3bee6b4d9aba41d41428ab688f950809c94404b5c3503d4d995fa100f9e61aef6110b64e41dc81d634117e3b3e1994ee3af79970daa38966e00aa9451ff4657a39b4a0e764c4af6803de8363950256a69d6cdf40f368bfb238fc3abae22ecff3fa6c9e8fd55a98efcec654adc039c49baed313e58e06bdee5feccc1ed7cae84d47c6d3671b9704f7d646cecdb1d24f3bf3c4fca76e2370f69a26b97325f4a2117a2b696e31708470ab6c1ecec857465cfdcaa5b1506abdcb6a5e379bb4e35846208d3c2b8eb27edd91aaaf81a99ec06737fdb6dafd65ab7c7bc4d97667220ea69896a46f31fd0b03335477e3d9e685d833d487bc39b69be70115f3183a4e7fb9faca1cc38246b3d0da638aa28c907d8f3a1fc779b86f6a1146645ebd583ef3115c64ca6468bc21a480385b27fdcf8c0e6b8431af70d5d61012a619db7e38ca97da793f807aa4f338a398327db62145f36a35242efec13d6ea1044b5bceff32f6ce6f106ad4778e8f849f0f75da87de8dc3213680dce572b16f5391a92de4f3e53dcc0ef58ca377be8a46b8ba55d6878f38c88e8e4bcaf80585f35b34ed7bae8c1f443a5eaded58d9d4a09366b50e7b53155ef8416342267352fcc7fb22cd5bad69bac0967779cdc2d48a60a8dab5b89d1b84b54f1a53b6cbd9b37d48dea04838193657cc7b47b436d4dd36cf9bb4bcc65f700f98a88a850dd0d9b00bc41c9f552e5b346427df4065634f4d768cf49bba93e758a04ff408668ab8eff93f43658c48b80b7fbfedcd258ac6fb10c51ba665e8f25537116ae53336a8f4add220eb70574fc599eb4500ac61e0f3398b35a21e37ec6c9821eb46c348c59469d9420adcb5d88ad32d3e65cbc356aee5960dab8f54ce6d033f0b7c8394a7ec14c5633ad6df3d67f608d6da726e5db22dc3696e7c352fa6faa0c8e741f7ece085562bb8a86ab6628149292a750588aa90d268f5fb6e8b559a4f8468218985db9f4cdc1f65b4644cf586aea8057431995d58476cfda6ca0deebffd789e7fda88d79a7d9c169c01f9dc5528a9ffa144636334d8cb3a1cb27b81df55c9205aa1cb43f04fcf9bfbe9539a9f846db361de4bea0a7b04574960967e639933e6d1d522188f033885385d5d36153ab3ee68157fdabcebcc67d9e63fd09cf2b5d910c8a5e50ebbaedcd30ff38b041c3513da677f79bf53d7c5d9bec993f85aab57af1503beee679f2ce9995eb83376ee3d9b1f66c9e9b46436399364496a51851d48ca06e44ffd40a6c64748d6db5a9bf18893d65a9fc4bf2750ec9410888298ed0482438e604cbac435abe14d598f5cb7f07aecc23b6b38a95f9cc8ebbcb4f5c0be8a8443f89ea8eb69f456ead9fe9a36bb31a98e9e5372d4bc83f9a7509da4ad97d36582bf7844b79a9753bad9a476ef64661dafa5e497980ee61159aca370de8d947b66d87833383c9eb593313054e00867a82edaa6b1a8494ad82305a387f8c50024a9f682c69ca0aa180eb8dcdbaac44f4a3fa93dbb056352095c2b8b65ef06f775a57d639cf52f40c8138dd5cad7c9508c3c34a7bf9e6c6431b34882a45f6cee7e43eafbb9733c2f08e6e28d3a1372b418ca595ba593b18789b7c6a411e27acec3b4246e8659a2330c628436e2e722536858548a280588cadab31651eb5edebb50ddaae15d3fecd74af476b3d4d834c104737610ececad3d3f6cebf7afc7b63e8372c97a8fb68837074f94527799a8874684a81f6145ad7ebac7a5cbccb696472ca98fd95b9ba4db7d8729965aeb56b8ee101d0b32b6b80a772fa80e70598b17e84fa +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: bb321ef14d44d8698df879fd52450567657f52a2df8d111185dcd7d4f30a72d4 +public_key = d0c5379075ef609447f1be8434e5b31f3bfa3e1f33206ce1e594edacdcf0182d3beacf6db2ea7de30a6671f79c1d4f4052a784e727c36a3b9dd1e7eba80a542de4fb17c85eebe8e406dc394ec556adcdd932fa9a8af6e0646a973df4ffa0ef9c92b35c04884be2a5bd3f68b2083945f8ec525d75e877e9f4483bd24847938eaac5690cb33f0a878927bdb4a84ad637d92f046a2968437bf9a675e9ee25e89a3f246b3856ef002c3d792d6539968d9b7a83745869ea8accb72ab1dab78ff0183c2ffa338d8e9dd0dee78ad8b928c68abca8f09819ad705a3fc264bde3047fd2065c3e28d6aa3e8d75a39c6e4541dfb86433bbaabe1f76306fec843af381dc78fc4efb1a6a318d6fd1bed68ae518be985746b863ccec279836d6810178c54a0f61940e467bc986a735a9e93678b1f433bcb7af36da821dec7546a4957f4e3d30a4b1d75ba216da71af7a7b17a932c224bfda459681893ec103a4b57ce0806af4543741ed1bef5bf84dab0e8f95cd7434758d32e8da3d8c6b54774da92f451c1faa086782facd622c2b8ac9776639084a19b5d9124b5de6d77a83bb6e123b8eb20e9a2c2d3f87896f240e8568ead81d07ff461aed8a38e5794966aac55fa07cb7007ac3744adf2ed5b6f387f86a8cfaa4b9655237b3f1635dc265f7357bc4714c3a47285c9ae3a5a84886c84dfd22cafd3c15580be7b1627c81fa2bd942e85a3a075845e47dc0674f4fcfc1ed9ca031bcecd934a01d1ffd26b6ce5c038fbd64edcd4ab4a9cce7c06842d7645935b57587559c11b99af337bc629a45ec37a3a21befe905510a7eb6e19f6126f8e5625c5d79f677ebfc69b148980927ff35ed75c29a6e9fb4b536f892b16c7aa986f31698f3d6beafb439cd2603c97599d4ba4f971d769827be69936ac108c6caedb98982098d5176c71cbcb11c2fb96143433f7cd83bf83f6005c5c8b93563ed81ca4d903ae662a9fe7fd098ffcb399162dfa2bd2b8d1bfd731b13d3e3c9beed8ec5473384b8ad4c1c94ef61ef7eca0977eab4c750a3da2bcb3983daa99cd4c2e34e4ab8f7785753f037cea9a65c493afc62f08d75893d417375c698afa7fd0782ad1ee014733e52fd88c03fb7135b5db727b147936740f3f0c603365e38dcbac5d2b654e2abdc4d25fb9a96ccc96f166445f6a6c3a894a7dedac7ccd74fe7b5a2df964ffd531e7bc446eda402f45b0f29809a84795848812a1b935e3fd671cfcd0e3332abc68f57b98f24cb9e68f8b1663b4c793ac4222e77f11c59477e550e44794f84705fa4835e9e8b318aed5aa39e660f6d3888aaf40cc2480f3b74cc4e000bed011c6a266560949c626e18f6399e608713c12e75a229c5bc114bada81395b00a5b6e695097bf790e85c9550f8c5b288758c9ad634a3ae12bd6989dbffa4f8b425ab70c5c46c225d346235814e7af8576af317ec6e6d4b56c6e412d7a5cacffecdcddaa69e53d4e2f3d72e4c77afb927968f45cd579684f8d9f6c81cd6d4fadb43dd56c8148664943ffd85395b17a1c53656f87fa14a9bc2d8aeebea7e6f73829fdaaa69e8a6adfe1bd765cc0f93615a57609b5aa91d5d2b95ec4aabf4336df82348ba33b9df1715f4ee345eb6c88da3a9b46cf57ffbab34be905d9c32a64bc37b6e6c3df37a7a9f30dc3491ec2b8553ec3fcd9119ebb08bbd2ca7680877f44fd3c991508902e84bb5e177f736ed57c38784c19d5cbf7d4201fbdb78cd7853ff8ab569fb6a7d0f9b3a058dc5791c6d0dc488560becb939bfe2599c1f45ee628b64094bcf0eb6c50f5f5cfdfdce0471346dea4f9dd29953e8be39e2a46f15ef7d82f5fd477f3e0ee9522a4a76389bfe74e4450b885cc3eeae78db59ef46177e5db0b43d6820a9d57293ae6753e65097f8de97c898c465b07b6e89459f446a59c14e45f2c30dee57369ed479468ae96cbfe8b0332bb7535104498ffabb2abd65a6b9af358d467eb8376a795aab51ed8edabd967b7e0083acb477cf8a01b46e68a3d65cefdbb59e46df48f32ee531cfc3295e4cda083af7b4ae7627f86f60b5caaefe8595d8f900d98799e6473c85360e8cf6ae8360d8daad8bedf6cb7a707063eaabfac0a7e55e6a6e388f87328dd84baea61d5caf6e1d5bd9dcf5ffdd46a24e8ec4063f697b4cc8f58643e4eafb7df9b7c857837a1e385a9106e3bd9911c697c8709312db4ee1d9b023e39fb4a92d9d95ff015 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 210a423dadd899b810f011794b79aa7f860823ac1962370e791287d3a1afa384 +public_key = 13665dbe0a4aa46bcc4096ff1e46f1f2596ba293466f7499d9954eb6b6f51483b35017fce7a491100d8166f6f476e383f025efe706c23999b71edf471af759ba9f39ec05996a94b7a3943e380edebf0aeca205b2ed836af00f5221ca53ad7efd41339770e8db040df310de580b786353c9bf169d9242494253684c8e2b5a292e6502eeb4f29fdd641fcac1ccd2c22fbc0ee7e351ad5457f4c40a29584f2db70a8739f1e733483b7e7f8ab62b664c978ff29a8d536d747f3199a064ccbd66e7be173641808a93231aca8a7b54dcddc593ba85e01ec54ccf894c6a797ccd557d05e4734c74f374ea6d2c98fcd8c1ed356c2e199c28088ef495a550ded19b736f2fb8895eea391c67c89514ef988d5bfd2354ba1c3dd8e98467e3d2366a616d38dbdb4747fb6ad00bc5781bd8c1cf2b563ecfd6e6f5e22493e9d32fff5ee77802d88466b6ef5016f39d6dd1976bd0dd6343787d52756f9f16b9ff13b37049698b12c39bb1c3579d693970736fd72c8d8654943e5868c53a51324abdc57b330ee3d145f9fab82c91d985f44288833ff3a2d9e9faa1f53d9aceed191c99e064341973e8e14d87d9aabd03d7ae1ddf887dcfe97ec4b09f7699871e93d8eb77da9c9e33749e4a0c5bab3bb64adc4436b7a6d84b9463c4887e4642d5add52093399b2cb52a73b59059f0a70ec328ef937ac439fcf3b78ee830b4ecb795376dd263a3ced9ec6a6b60e59dd1a0f739e217b5b3c4ab0a6761325e4bb62c9fa29debc80b6c8c7ac7021db4860cbf221543f2aa61e0683bef6ddf98ba4fa94cf866af8ba59fdaecc3a6c7b56081869c702bebf85ee52c0ca0a753a211c3562daf6a15395a630a4a937f9ed9b3d92d23bea5433447139ac15e8f76eeeaf71e3b8368cc7299ea5eed8dd7689b26aff56a8ccfa524a23459f1a0e887627bcf7965a1876ceea6cf55c36978da7c4f185aecbbff4a2efe42f08dc0785db8726941982ec48e9de4f4ec8b4fef3d95bbeed9f8b5ee994367add7d48ac1657454afd466e8765c877a54476e71b659e88a8cf05bd3d7389eb832b6a7536f580a9e9db9258ef1b7a15d2c54c7ddff57fa65751438f4186a8b576d7c66ed649a7a61de928f0e3df7d69f4de7d35495e07b7d62bf3ca84a93a5a0197ea00b7522dc769ed45596bc5e712954e1eb37ffd69d63fafce5e33df8088545e3a738b864bc6eb917df9e45ebb39d8a7a6fb3cb3a0eb9880ab0558ed7c9073b19258e4e39d156f54ae3d44d19d8abc5fb334ad757c8ef4987af6a31d458edd45c69b9b8d88bd622166e66c76afc49a23e2ceabbf357b83f8781aa9a055bf4aa2645d79e639f24e981d3da7203623d65dc32efbd4bb95b2e7b518b44512dfa6a5387afd6c7ce162a434a6b9ed937cd7a3ff1354eda252d934b357e73fdd9ea94e3a914869834daef2732836b5659566d222ee331fa9bb0b762c958f47cba816f3e310937deebf8f6ee8ff322f9841f33a9362d9e0eff73f5fff37a59b27cf85fb3773999af95a387e4ba074d1093b0f096b2ec5e33bb273e51ee7de75b45301cdc862354344336fe0f8a4a73eda23bf85d4435082667ffd2efa01b79626cd19f7ecd0ad86032fbaa7a3f663079fb9e0fbe563e5543d83c0b94f97945406c33969aced93e5be8861eaec19b3c9069bdb8799a2e077af53d8c401982e978e9c8fe7f6bca98054688c30a75dacb90ad44facaa9ba227a7f6794e00428cda9d6890396cc19cb90a91e53bfdf81cbdbe0371e32512d6b5a2d8d8c75839b76ab8435f11a6e967396c697fd5d913598259334c84f915ede83f32c5a4e957013868634459f038340aa7761ecc6f8fbbb435ba642e21c538c9d7d881d413bdedd7f0a7966bd3cb8c36d39336543193d0d768bcfcddaf89d69e7c85b0a1e4e77f6d63adae8f27376beb9ac4a0b976ce745fa7972e9fa74d0055ef59dcf41feee6cd785510bc4bd1f31d88abbcacfffc2ef577608580e2663517d702fea437f9ae3f6fb37343b488c2cdb267dd27bda77fc6a972233e9b66a86538d61f32de9aa73674519420b0af7ac66e6efe7e4cd46b7b785e922175a1ddbf28326d9ec4db4d27ed7c8438f34ffd3cdbb85bfaedb78a99d766499d464eb91567fd8c7a85d983080c9ec9254ce3c2a9feddb8c8ba948f0986a91edf681341fac1cd19451956432b83b79d115d32a3d4f86f902f2f6b0c95ad7f4bd49 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: bc856afe24213e3d14c3d6f9b89223bbcfb2c890722d770fa3492c1e46d1c302 +public_key = 869a9e3773a7c7a4fe279471a233a05d77899c3ae8f35ac98b3f43fa6767f076976529b75b75b070a341dfc95bb85c4bfa1394091e41fe2beb31365e3c33d2c9bdf96b9769de14d24da48c2d7a3e5b29ae58659384fbcb4caface58c4ceca5baa523ebdd465797664276aa44e843ee2f23f8aa79e0f68a6a743ede575ccbbdc689199559f094bb6248df436a925a83d5fdeba6c53a9193069873f7f4cb1b67fb98f0e76cf7d175bd5f5b5db12dc91eeaf439383b57ace4db0e73e27d4a319ad3de6691ecbc600097b41a7a9a429ca1a4d8a34dfc6c86ed34e9ae762928efe7c993ac0e8d135a738624d5186763b007dd81dd9706c9af9723e3e47bb91786ea0e3a39f7b96703cf88254675f7ad7771768f3939b7bec979cbbb8bcb1ee125fd8347b7bc7d7d833197b1920bf7599d98e48834e8fc8552aec1fd5fa17023f3d98c4bbe7779b867b813a5a2a514dd8e8845d5afb03efbcdbbc3d8393eb1ffaaa9e21c7a3ad77053793b1f7b7476cdf1e3ceae26fe94857be5952f8e939af9b93f930d5bad3667c854366f83b48cd46de769fd86b79dd7eae7eb2f046f640e96b8237967c940d57f7d3898d0dfebb3b25fcf57b330698d3c1d55c59fcae4e31c323f9fd265c8826ec3b6018c8f60445a11268da9b44f8dcc512b96d21204d9d3baac60cc6ca53fe1d2ca3a4137ef745bc46fb7da9a8a3999ca83e8635e7a4843ea3b861194bf019d9e435dad1ddb3006f86dabdfb8fb8fdd969a7d87dc97af2e4ab3769ead0f61086d92260e33736f65eb7987bd4bc01fddd4e71bb8f8bd6ab339ac9c0849fdbf3c4bf35b11955c52e3dfa0eb56dc7cbfac95704f5e969ea45ab02ce0e59c691dc3908c083263c3565766a34c2e6f5508f9502e9dbc158cff247e2296c86ba69c932e61ed753fdc1471844f70095a85a5fabb1dc9efe213e13139526a6ebb40c4ee909e3a3656eece86b37fc8d978add5c54ef727f68923187204edd1a378c0074af4029da144a6fbfaa89b1c384083178a1b44461926a9ed135abaf5d5ca3e77f263996de9780fc573619b63f85ed91ed576584d4644194a25b6cd1e5aab45f9d21d9a8839546a991375272ebd7983d685397d93ec49d879e0c47af81439f8a054599cae8cc3964cc4db8bb7a87543e8a540af3a95bb5b6713478f5bdb5cb6f48018a729469a3794a8ed04a315f3783e667c0ddfac80c68a40c35d64d9de5e8a3135dae5cfea69d5aea2e9b562dad5e409c6485f0f6001fbe196a4876074d4b75e9974b386abfc9cf5ad305aab4a627b6c22a994dfe46035447f0dcd9d1bbcd397a68fd647b0b13630d1439e63fc8fca3bd1cbe66bfdb431533db06a9797b34a57a5ebf0817ee95823d73c8ae0ac95b8755aa79c2d33c09d386125d66f177ea25feab0267672c9e831af6c20b4a8acade1668cc46b49a2d834d6720fc95dc842b404f4feabbd774b4a4be351bcd8cf2c486ca70a5eb60fab5ffb8d78cfbf00fb7887fb960c089210d67367aadc724f8b5ae348ff293602833b6927add6be8f22acc4cf0e517c65c84878dd59a3e175954ace9689fb6881ce27d73f1e3cbcd53547bacb3956d67a1a46cf6b4969065c99ce7304d53ab68d45028eec154aeb13d7cb453ff1ef4ee466469ba22f5cbc4ef708c7b5e0055e3b476265cff44fe9590a557f088c9d4fb47a3d598a999aeb609fed1a9d9221bff9ff12dbc21e43cdfaaa91fddb71d6c8b87fff24584508ab4d036792135b750eb9ae091b4baa96a27d0bebea06d6132d60e5268bc4e9c08d1bbcd55ea22e44a2d73dec6df5fbafa4df14956aad4eeb5c3782e64377c645b35e3ede1bed43ae6e42bf7cd5abbd7d3915500b67989709b7477432b957f39a9c7abbe747b2238ade39f448836b87938e804a402aff4182a4ecaf6ddd85aa7ab9556ca98c7808e9d558e771d97d9446cbe06964edec34b69834c8582e5822f773871c4401ead4c715d3cef8f492bd7e8597480b6bae6255d84a4b92facde5a168f95f237a6386e18868486dacea8389baed937b392ab840d4bf67f3edf3cd73a4a8c691896b6d6b623b95670c04d5dd499773a54210975d1eb7f667439e0fd8c112f33470789f2899a64217400e4b51fd6de362ec98a466f0ff6ba181bfe1ce6ce54bc6fa1904cc13a64fb6f445b48ef88ccad56919a0deed94a2ab2d4b6442a71c288753f1dc41ef5389e39497 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 5fc00f89563e44b24cd67d0ce684effe5731619fd08e7d72e2406eb016afb66b +public_key = 12c3e41c2441f97ad53ec568c8dfb7e22f9fdc7fdd916ee9a05690cbc9564bc9cad3a66e05f641302a38adb6fe0748dba315acb5a3afa00faba89ee726a3ac957f3d6e66428ec8576718c4db8ef846d450cc4f8572be786267487b353b37d984caecff51aa6fa58c48b11e360c6be98afed4b99671ce2985a174aec03ecb608d3d29d93134dfac1c9851032bf1e8da4021b44b4064ad741578612fbdb28ae87495908ddb6109489ca2a67dea269493986565e33942ded12e65d4f4e5abe77ff35bca3a145ce49da7def48e507aefbbfc36d66a7c8dc569e871e83731139952af62f9f7a2631cde0fe635cff95b792a6b9d59df0fde4b125b652de35cff994ef44ea15bf579793eeca4149fc389c6109e5edc45610b9c588318de96d77267268a37b4338ccca9059dcac44a61f2795f944af5147a8943dc545c18d5e5d39b70139bf00d6df10c695cab9cdde3b7c4afafe823c709936d7c48e8584abce96950c07bf48b858859ccf2327ff426078e490d74c0cde1baa6b11346f06435f11d7eb48d134b7b1bec960c942a8f9ac529ef8f8aac1ee7dbcfa4342a46fc68a35591db506f2b69bf03e133f5ca4654421f48afdd736e25e8e0add97f750530c443618e674a67aef29c4ae7f4be9e9d3740ae4a6aa6b77255bf7375bf46381483e536f4a483d35feadead4f7cf007f54b3b8fcf4c835eff3cc5c7f9bdcef85ac4952adef41977741bbe5c298434405e39e22e9d65a9fff75637fa3a48633fc1069cb49269305067d80b535d4b6f4bdbb78ac194d7fa8b48caec62459b80cdac450144d3ad04e1380cdc97fbb3b955de9953718ce8fb4ea5eb3628c7c1fa39f66f9dbd074549de56447f53ffe9ff7de9b293cddd191fcad1ea7c27af95e373bf80fa6f173b68e7149ec6a454db833d00fc46257fac52bfd8341a39fa8ba8f7d8f43987cafc65a48ec3de72aad33cd8929a746ab6eaaba19388e9246ff28355bcfcd249fab0e00b722c9ebdee0b8fd80377509937f30e880239ce9d9f51a9d3b48d455884e98acd948f0afad95155b3617fdf2aaf79116ba08a5b5ccd6c86e0e57f4b33c5787c38b8fdb924e7ed7c06c58fa3fd7c68422085c8e365c6787b806aefef0fa5a414d44267c4da606f9b6c08fee5588b7f8f8868c5b6ab9438af13d983c7c37d1d32bf6d59371df559ee61ba0bb2b1b4c6b1fb5fed0f9ec389a375d563dde64eaf7b95e5ad5e2cb7b1a58d9e4e98893fcbfd79aacf0e8ad718b3f2ee8f96323681ea3989826efd04f56ad2cce0677e87b2ecae2e9aa5e3afffe00fffb975ec37c75f6ca87aee7fe3e0048e36984e2b9b6936e6e318da6b7db7c8b1538754b997de3f5053dfed233f8f03d5774f8eea51ac6d3c333f0b5f9c1568840bd9fad436d3b4a361197b366827f2d45b497cd94f73e9dfd48570b445c4b166a02c5a3c5928bff91545063e66f0fca5f8cff2933fa301484ddb25854e6fff546c477f53d72814668a734786b681087db227487a21abaf17e79dfc365c3843363ec53af3686cce84f9104740a327ce441bb8e3736af22448016b8e69784d3a2c92e1fe787f8e813aee9e96efa9db2b62175ff1d9b77ab2ca91dd3feba5533322aa772459c6c5763f25ad7c5c7e5198bfdc7357cdbdce8840aa7af18c4685ef75cc4ff00103860a5f59c4fa71f946621346f2a2945d8cc6572b33e1a70cdf119ece19d8c5d89e3acc59de6c1751d5aa3e5d8fe8ebcaba43a8c0f6d78898ce5a20a87a891bc2ca94779525499a2958a60b4878db537dabe48d0eb7c2a642feecd624e594cd3e8a0fcb529615f6af5561980ad38604a9f028ebe16399edb84b394d5e33b43c13d83e54483418467a57f8a796c4d32d37a744fa6201bdaae04899c6865a679f3eb173906b26c3333ea90044c9c4e5f15117ca1e5dcbaf2ef0472cd462fbe248fd7a2197680856428ba494dd8febdb3760c1a97d2e59735bea606475df563ef11765938015f550fa311599923dfcd97dbf8d601cc4a127f6992fa2bb589ad165a8587893bfcfb0e32d30dd8736d387673a77e51b249c49e7abf96960f5394fb255be8cd992726ff11613c5242a45e98df87466f6df7d9542338e131678b97e95569fd1501d74e2f8be14a634ae5c40dad64b7845ffebdbf1bd987d773fc16e13f61c4771bed2bac280f77da45501c2ef4d97f2faf650309211985bbee4c3a85865 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: ea22a76065db4b565ee1807fbd813b43bde72b0e08407fb867c6a18995025e50 +public_key = 5cd35cd9fd9ec23d54176c506e0fa7258a84eb685d14c3352f1bd051757c30e4e84ab6a37bc6d58c4451e9aed6ad3cf59bc6791de49ed9ecdbf62bab130e429035c8716b86465fa26b0549b193fa2ccdecc8f8cb5573d618b5f5f885cb6fc4d7f14f61078e42813e399e5666d56a9657eea53056dab4178c3e957d22244b1366750ead84f67f399a33bb452c7c73f3cbe9b7d28cf3849b475606fafc96958dbffe7aa08b3f16ce46edb65de9379f63dee226f9b4b868d26956e4ec2f9c8ed4419864f6867edf53885f5bbabdd95c5597f89d826bdf442bf1aa476ba4a7dbea0da2f40cb7435dfc2093803f27ca38dd63486e5131c8efe6ac6ac9249459d9fd921338712eeaa5176c6bc8f8a4198c866ae730a84961f3914379bbfbeb46412ce705bc86f8a38a608e7f1b4c34e99784783d51764b3f55d38571e98d754d43288ae9dddba7d4eac3f0b98174dd9f0deedb23adbc0417a056c66064d9d6b7559ab134b6c47baa7a3f54017d811d3ab8f6ff65822873b4c78af465e4ffdb6d03d79c24a88531d4ae733d486977b612dbd5b906ce19337ca2fd455718569f8dc2c2c795b8ae56e60c5c650aeafdfb5e4fd96727947fd66abd94774a5bc45fdb9ff147befb67534ad93aabaf1f3af9cba2b2a376608cc6335aaa99f759dc964aede8de432c6f418aea65c63f639b5312c35038faa9c55d51bb3ec66a1f538fc5ea85189d846b799d9cffedc439ec8685b547376be49a83fb60281accd743d01e7f9e4156badffb3b7dd8cb415eeee7a3970a168357a89dcb75535ce341b5b474043d8bd87bba01f5cef30634cadf7d56da4d4383f3489dacbfc5d51dafa8519a42e72df69b4b32c64770a5db4caa1ca6670c432bd74745fbba302f377d7f9446954a6e067454639c387eaeb626871e3558a1fe41a38cf733be3b1363fcd16462f89ffba2869a0c2d717e3675a328625da796e12c4403d380cdb54930db78493994c0793fd68bda9124d758fb78d239d51e696c8707cf5a1c40f06ee123b7c6df5eba4b89fedb9ed762dce1507e6c66a79dd4f5b0866aea2b1e44db8dc4106b72aacbda908d36beee9b204992dd7dd956bbd76ccab60104f60ac4b2cef77c38d6b6ef99d7feec307bbf9503bf69dccd63e337ad43958d893a36318c6c052549be9d7314dff51744ad02d3df79ddb394635508a5e857eee60706cb052f75bb2da4bb6a734f9856aecae64af669f43c5017fe305f8d84389581bc146169cd914d1a65af5e88e29d82d585af436ce83eff8179c6b2278491dde450e8bebf64075e0a9a8301454b5f2eee3abdccee1df681ee73c5db96de18fc3c399e3a9fe0c974b6f47449dca3f6c1a7a79f893f454834e6fcebcf0a860da6fa4e05a1f528f5982be8dc4ab661abcc98d4313cc4dbab5df307895460139c75b6aa6aef7c5e79f7324e487b849a42996a55788b3c5fd18eadab1d3e5d113d8f05c54176e7f7a04b656ce6859f69471a186a4ff6b17b8770719f4758c83dc79ef92bfc7619ffb75413c79eb9b946deb2aef95a47dbf1cc8982f405739d9d64975b5ab875ae5ddac05a65a43cec4ed80acfeb15aae898b995e649f32b98613c77fc9f6879ec940bacbca0696cf6c6749604a1a59979a623477be871a2278d22134a95ecc1b116c4844dc6c6a8eadbe742eeee426bb65b9433d2162b816445ff918679d54cd6beab47f07c8a37aab0a7449d46fdecfdf9422a783e06f645353cb56b8c57e28840e074629bd58b5646cf1ca6d0328eb915b7ecab0da35fb4533e0ffc2367c9bef95ecc85359a236e23b4f5f9c975ef94fee31ff8c66673f1ea3be278b0fd43ad4d0d465563f654598f35af57bc7c81dc0999266c8c304da4d9364f602bac27145b5be7c4fb0759288761ccc586b9039d6ee57859bfea05676edc5fc9380eed350cda1d3baefcdce5bb953bf5d5db95b449b8db44991d680fcc53169bc8403bc70a6bfe3dea7af89aa0fd76f255197360b8c7325545b7f45f2dfcce05d939ee5556f5c63cf05fcd68e8399fcf5726b3e6269374eb94bc3894d11c89890f8f8b5d7f6d149cc3446b8a12d76c35545eecc7aab0fe7031adcf9c993e53a88ca11de16c3bf0700e87f725acc6a6e12b5c44977af2ac6e7a0d4fa64d03b8ce88b7a8aa7cdcaf8a197a5d3bdc64cf089f922345dae5a7c6bd86d17444f21dd9b1a5c82b9fc906c4ad49e0 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: e9602b34fe73ad57f4bf6ead99743d645641553a5b9b9bf2e7016629e3e9bd76 +public_key = 66834aa7bf66f0964efa45c0479f49c30ce0aefbe9d25d8cb7d4d9b49a7e38299920c3433da3929b2552d5e9a1f19f383e3b4d3d9ae600df99f7d933eab5d6062697c2abefc02df92a4758d26ab61f085c32ada3b86ae9e956860f93a3ece8a0c234f6b40bc8d1dee91754803e1fd4ff048c07f6c778fc685c3ed8b13f7dba9361b01cd71d9ff3affd949ddb804075c3a0178f41bca68b676ec8469e417547617c8b8ebb6e19e83af1caf7e2db7d09feef268d5f969f85aeefe6c26ad29694e60a98dfd2dc57547d9ea3e8ea59b9e3582d5cf126c24f8858a3757be1c562c75e66a19dd047949c062bca7aed3837dd5aa6b9ea30856a368bd87b455169a7c35a1d91e72c96b753f397b6a2587f350876e349265c4c475ee735ee4dcf6d739b33190cbb07a993e5c7f288a55d589fcdd2d9e77c9541f0b7dbf076e35e06a3ff27d0af34f47ab6ee70f4727e6a9fdae7dc470b671cb3ea22df36bcfc508a83371428f198c4c41cdeaee23b5acca7f0a3e955aecee9eaed6fb6c8a7ba5a37bfbfe565f77f7f037f0ae7ed6bde3301a547fe8458c8363fec2e8a3ed5bf594c3bdc8ad3003641da15479304810b6adc94a4e7b9a8473f76ae6c23e44d7b3673074703ead389f8fad44e65f1cf58457367b66fe128ec318df886ebbfd3e259bca21eb68e13ae685bef1b3781d93d5194ed94c21bee91b473ac9992d1e77db96df3cd043b147681fcacfc9c3ce238cf7f1e459b953ca0711a318a4b76d924baebf599d9eb852ddaedc508d291c9e281f8345d774a29053514fe59164a705c954e53faf6b79f7dc58adfae6ae9bd33bd67339e8ec9f5577afeabda6b0a4743aced5546ed80d5495402fbd629859672ee30cd048236ff54fff49a7d394f3b1c3de06a784747311affe8cf0944609958300b93046869c026cd94ffe925b3dda0389e24ba6f08d498748730e2c4dd1c73452de8b7581df757ace1a84e7f2bbc67122c9287eef19e7f30ee6bdc42e7f4d2becd4b13e500958dc81f4178af565188e6589d4fd1267f2bb69d5d9f9f8967cf2179f4d63696627c91808fbd2813563cc443706bda1b279eab237326b4ce465d4ec81dab96edead91f559b2b8be763c1e9c5544aae3670afcdb7ede06856b081ae6d7e47d0b087ea4234f3c806c62614b0489fdad6876d784db35fd674d9a6d5fd6e638d863ce5cc6a55e6ff83a4a68abce0ac06565797db5d6f3970ebea40773500757179ff9d54548aeff9fead3d6fa809f7e5f84b15f339f4fc388a554b79d87325d8ef9e9989c79d92100e8fd454dafcb4d5b1b667e48956823ee78cb7a18fefc38f1dad4f6ad9df64a76c0badfd0862797ee44f8a449d04d99a08c48dfeb110b443d16386042b6f2483dc921643a6f8b7aedb9a7036339f2be56c1c4de7f4a03acb57b1cca827146f4bbc30f17a32dee4f949ca5341bd494ddf909836da87bc7b5054ddee8fbefbaea6c5cf8bcebcbb16a9d978ea92a47d9b817996f51a6e080578f3dd60b924c5d9b930997f5eea946ceb84a0a884c7fbdf52bfda7aaf374e5ff8703a4ea8483493a5143e0f9b6f5ef45f684cfea2c4b5e8c9fa46984064b97e28d339789a8655ef7e38c84ed7e4cb2054e2a434bac237e97528c6c7ee625dab98c25557e16cb5b8249ebd1ecaaeedb5fc5d5527d45981864d4abc8e116dcd9a7467475d64c9b8cce823b6bdb9c702a7a30415b4fc6979d2476b461e909d9d55a07d597375c050189ff2a3f852b5ee75bfeb32c834c744d52d7ee37025c20718f63e0aa71d87b20263bace1cdc98a58cdfca488977fe6b654c003a7e22465f981feac8deefc5dec0525ccab768c6dceef4c8c533f49ba88629c720decb6ebc4aaf09ab6ecde1349bfb079ebcf8fbebea9588b74dcf3fe97e35f9f440284cca6d7d49a3891283ac96d3fa2b2f3d1c47fb50abed950eba6cbe3ebd5ccb6c44ba12e392b5de65c4a4da714359cf2fff6b34bc1344af802992c60afe86fe957045bdbdb4d0b526b21bdaea0dee81531c8bc644799ee8477bfe6fbbfc33879868135a5adc748f88799d23476aab0643e5dab979f3658dbecf1939fac603db486353275cae5fb941b2d49a0d0349e669e7b4f4cddb9a97704ffd8917b70278ab9dbe6ef193cc33c3e2e168917063ff32cdd1361ff5180493d7966e2b216c709ac1bea73f1c624a081620b7981c1c95ae0387aea62f +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: f72b9080a6c051bbdb9b0abc1949034be0f89a9f73fe277ec4d4740c78d04a83 +public_key = 1493dbe3faf25f8e61039550c3d3f0e6c57221ed76224aa8fd48b4db59a3107eb2a2fbbeb05b38868e9b672c48393c5fe1865a4d1e3b7375d5c1199b807c5e7669b7d2499931d899b21b8c1d9caa129761bfa3974c4a85678adea1a49c4ffdf2d03d48012a3b108b43810edbd2d3f7a009717a64704b6fcb31446c5d9eda5aa9f8e1e4564f95b027bcf51c464569344f0096e06f7a4dfbce3eb194abbd64a8e7ebf352dcd7f06fe95de869bead87cf838fb42862f6346755fe744de8a414464ecaaa921bf76a4ee344e3055ce0fac32c15bc9f03d29c7b9205737426dcf923a7f1ecf65ddc34ef33dac59dcad6db57751499ef71edf0f6bf40b03493aba381f77e6a16646a8a8343efd4e394b9dcfc896dc04c4fba8aad7cd66005f4f6a41e3dd1a4be4a76eeac59cc284fa229c6bab9caf6cfb9e94ac4e674e89a410bc7e9af5bc51dbf95738f852dc64de5715af6f43693f2ec4a513647ca87af31e76b62e52753c939308f8460a775da29df58b24c4662793e2ad4454b5756e179fc6e78f2a8dbc070ea81f4a85d6a2a852c55f235f63817ad8d957cbab13dc33b5535c87c5e795ec5550389903ee38c6e558b38b04ce785276580833d8117978bca146f8f338c4b4b623177a0b1b5eb5f134ba59ce9b4db691838d7f3bcb29838a0729cc2d45fd0379cba1f85eb6764c27d57efcf8adb3f9a404fd3bf9825d150b540d7abedf10d38ce87d424838f59fedaecd3d4f29a91031777536fdae3d967ba33ac2526c85d9a7aee03845caeef9c0a51701da06b0e8af253e9385a81c153653fb8e808a6bd7478df684a52b8b7fba5288b6e75bca98ad305ffc3d8e940dbb7f39869bf68c951ed8884de3fcdb254755098cef7abaadfcea47a8adfa646b1ae78af8d6d8ee7535bc43371c02fd6c878d634174427ed62adacf8f4474a01b6785df35df68de4c3e8858c3afed9e9e1cda8303d3e8bbebe3371bd7bae8facbbddbf04c3ad2c59e329bfd790c392936f9152ecde6a39e9935eb5bdc956a2d4f72a4b894a87359b1e803a8b67e236837d25a274c97eebb6a8a9e7ce73cca9dd9ea1139f36730786de1af2286b71affaf8e01abdf69cbf460ba2d7d6914389563005f7c6ffc6feaaf89a4ad58d84b64228389c94984644bca50af0620d4a3edcb94567d93345991bcb9bdea45915a5bb966e8f4e6fcce237e7a67c60042856fe8ab437066aaa733567694dcbe3d1307b4eb02cce121f4bcde6a79819b95eb6f1f2cee4933e5e60f774bc6bf0804fc1797d8b29ae8c9883561cd66daf17bc0bd4fe015db2a8157354f7945828a488a941363b3394bee12c79ee123c6b5699a5c955d38b7bfdd77f5e7f6e9becfec34c7c32245461d335f5c5f49a763944cb64581cea3a188e46dc759c29c995ca0793e06fcb2153859b3f905e785e8e6ba2b834918f3cfdc5cab10f8b95867467adc87111d7beaf79d9950daa4f9d8fe1af99e9adeef5f93470bd7ba297f35087a1ae05ecc8933824effb8b0fc1fffa56ea6bedfb143ec24f6f32959a4103b9e353e08c87aad20cdcfc7384c12deafcb474100eb57b483c040dbaba66543adca822b4381e99870727a75c59ea1129af47d768e4f59fdf05c6f59eaaa5ece1b9ac7e20e541aafae1b6ec8b27e94189ecebe939cebfeae09cd53f38fcbbee7aad3c65a3c51aa3970ccb31695bbfba3e3c1dcdd0d37d8493d9ebeb3ed97deca3de479f3aa0f2766d25bdb0ffcded34bc5627ea8dcbd935a33d3bd6aa6d01e7605d33f17b98b2ce8564ce077032abc35aa6afa056f54d9a63be6c4bdebb95e11fdab5fb89aa6bd1248d47a4ce83188bcec1158c0c09d2636b3a45aaf23a73986afb886787cf93a8aabcd9af1e4cc585cac6f604f5131a9e01fb49bfb38ea664ad31ece6b2dc3c701753a297dcfacf711436f167763902b58b2f03bd906aad3c1ed1b7898e2663bd458b5c4bb7c5f4acf8fffb97bb4393ba3aada5ddf3e264f7de6de6b089591277b13eddc26ae3ccb07cd88fbcd4b475477decebe076f0cf3754548a6b2a65eaa1b97df5faa296c6a6eddd52cda5903533c93445778755876136c1930bdf3c937bf71ab2969af5e9dec9e49a9962cadc78a5ef6498fc837de6f63b97e6f8ba034fa45d79f770edce07fe4be7535859c87a9875904870890c5a620d8632f30f55d3cae33d1c6f5896e6b12354a75c7894d8905403 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: f1e5542190db8ecf4b8d617a04fd3783ad0df78bf8dab749afb57db8321d151b +public_key = 70ec588f847ca3faf1787531444355e37dd021aee0be1b6994d3d0343fb95b6aa30f9add047cb6a2d9cfae2977e08962b666f55637405057c233388e018753ffcd8442a6603878a6d4f8cbb2574b9ddaec32ecd964f8f606739ddec9f4036e9649cce43a5db753993e48da443b1bbc8c4ade2edaa2710a541ea6ae491ffae1f48af844c2b337d77349e6c259ab598f41ee58aca3538a0bd79fbf3589eda9ab099d6d7777864afda2b2a7898a75ebaf8de3f8b863112c4ae293da43ac421444f3625eb2aa7a5b3be77d4c85c89f3e40f538d4ca57daa2c9f9e8e8bf9c4f78be1657cf4fe573efe96c4bb158ea891f6f7861dbc8125f5cb6fd7a3377be081b4651eba3c41ebb1c0357bf7a7923b5f4f003b02eccd3050db4b2ee711ef633b9afec101bcabce37655e8c651cc94592ede68566d097e659d3d72c509538c5a617406346aaf5c4134baa5fe36e7146417abd04fd361cb3be9d955376d137284039a693df11aa578189765f15a47e4c5fd4af9447c4a8343f84edfe7ae77aded872bda0e7f414c5bd1f35a38fe35a268848e673f63439b4dfb9b3435537f54cbee2b23f528fa5942da8563554276d466e98af5cea6c78427f9cad8f4dc3ccefb9ec7d0a377f46be0b8f8cf79edd65709df114363644869612bca78f4d2c9efa6ee29e0e07b72ad43b44edac06fcfcb3c448b506cb0a09746ccd84b3b993213b7a76dd681d6e7b7ea9e627627fd1553820acdeba5149bb0aaa55ccbd4ac8967480d544ed7d79b8f77a3dbc298034e097e684acd542dd4fb7f3f319b0b7efb43cb57f951b5aefaf024e965fa6e180ecc54dd8c1887bb31fc9339a8f3f147e712785ce6cb549caed99b2f45dfd350c374943ee6826cd3c9bee7fe712fd28b938bd304ba105f55ca664389335962f35bdf253e2b3933699d70145462f245696e5bed852bab0d8e7193679229ec684979c8f17965f55eefc148f30acf8e99cd95f663b587e967ef73f0a84a474ee4e5e64381ff44edaf59ea9bd872a019a113afceea76661015b5428eb8c325977c5d993a6cf6a7d992d05e9d65fda01305e8674f68d415a9c8fe78c047a68449546443ffd99d71db3ddc2e7dba68c68425c8e5772b349cf4ace5ece437bbb21f3f83d36f3cb58680fc1d84e50685baaff4f8d9ed167590d5bd3fd9b6fd546953462e7fb08658f1f6c25d0652cbc8cdd858ac9ad44616a8be04ed6e14288c1bbf7e4d4ce5b156732d246ef859fefe5d8b41e6438c1c899b33987489ff2bfaa1b8e55dc284db03df3e8da9c0a1c9ec61db66c92cb8bb3c64cc68bf4af341892441085a96f3aaa1a32e7bf7ddd5a3938c2d6ea15b8dee090c84d946f8e7cb6bb0e49c180d79df2cde364a4ad47ff033b762593586549c79b764710c3ed7bd1cdad01d6c7f7ba9accccc6debe5d2b68a9fe7a2e99fdee9acbfdef8c139bc8b5ef47fd196f62864d9a59479d517714637b9d75aabae29cbf44e8bd66e54faf5e9548ff99a5ff71b0c90f0bb7f0c2537df6a433a2350128af4aa144d30b95faafb39f566651dcebf2068e4027477c46b7ff1b66837c657af9cb0e7f46a42b4a74a69c36f7e6e2e993ad3c574aaec31a8fa5a950a8ce88f3a7e13fcb4a3dc95d8483bbed2d2cfd926a6a324c9d62b39e9253ebcd61aa56488be8b9491ea373fdd276bf986ac01e6a9683785d3384accf6f97da89658ddd5ac08668726ebc22ae8d6e3f5fe06d69f07e2a60782263a5dd87552f3b6691708a60459a8142ecaebba42faaa5593a8fad5ed956ab4fbb03867664470c8459a522df6c2b8791a47f78faa906b288dac7aeb7aa9588af9d62b3e82307686490db08396aa90bbda48a9798a146a8e77b1051f5ab2feb5448cafbdc749ff085f07cdfa2c35e74f587f6c2583cb0384c62e990b7ce5ce9f6b418efbc503471d4b807f85b7baa3611393e2f1d6fd6253e297a451957375607bceb10d9d09ba904a864be363bd220cab38de3a77daa42454b8683d7ed8cfa956e4ea62b996e0e78c34b4ac0e7aaff8e8e64b5ae1f8aa4379fbbb35fe4ea0ee3a7f4ab0025586f23d914d6e83719a941b0338e2feeaa4fe67a52ebfa38c9143fdf317deba4e64c6042dc0a29dcec11e304f0bc58af38e492937bcddad3a5a904fb39ce365a13dd9d2166c864aa7f082fd9e2ea5548a3b6c7d885a3ca6ae2e12efc2ea3ee4ca0b0b171ee93a198b42 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 74efa414ae171bf60b6f884cb7e5ce12028f49365daccfa23e845d551711660b +public_key = d0947b8c2e912d16f783fb94b468d13f34480ba83178c87d9ca4575ad9d14bcffa7cc9fb1b04efcf098f735b3401f3ebc02a43c457f20da64ce23be7408ac5361356422ddd1ea581a158e8eaa4c77c2f9b326eee0b4d3229889fccada2d4d3c845868816b79f56e6f65d678c9138b7172e3fcfd7acb2c68f4fac7915de40cd2a7487b341477d8115689407a9bfd35fe6f563a6fe3fd894cec5e2c657031b43a2abe9472bd84485b7f739af017459af5d423518460266cf449b524406b9a2c8da77093afb1344bc25f1e13fdc5b1e3cc0c4a4321a772055f1e3c758927c83398aa1f4bc43ad6e487f7e58ac4d53fce98a75be4632054d3d3aaf018cbaad87e326c7e60247cc11bee4444d87fa05e6c7a39b0705bc374b7af73c5b6084ee037bc69c1d949ebe739ad74a241cf191c3f01b1fdf4399dcb16390d7cf7c39e4daf0043b57e8a0f9786280eeb36c6c83fc97b49af9f68618b2c96a7a372fd02b2673bc1ac762a37e07fc6ef374900987639996fd67b5b4867ecaf8c3f6a4b8db4544c03bb8e1b46de518d5caa107be696cbdaae79cab0e91f5678fbe14934609aeb60ebdb0b5f5ada654d77cb3052e59686381e3677edbab5f7dd87fe1c4566dd7382f03c2acbccb1428fb9a65afc0aac41f4c3095675a326e59b0c7f7200f84e27de90efdd0ff4d76b6f3d73e4dfa51c7a6f6486c52c97446c5d6dd7c76ecfd8a5f8c70e6e8479735c2ae79a6d4a99444a347ba838c44aeace485a005a7531916c4529ee57c955817c488ccab9aa4d55dd79a5e2445d4a754d5a8a4ac01dbeb9f39e7fdab3b2909ca609739859383d73eb65965affb4490d5b9be85af902cb34cc50b5c49cbce43f8351a68b3476387bf87a16b9784a0f8d1e1eb39ee33b8b9ca82bef596605b59f43d35a06ad12d8549f0b68c93b784c7b3d9de7e425e3e75bb6de07d28aa8de4f369bcc68a8aa0751fdb4c2ec3d537ca25c8fa50dc875ab76b35a982b089ffd84b60e7db48fa0b80cdc9de1aa5d3894f404a78c17d6c73e42951ed0fe70dc8e6cb83f3d0cdb8b0057e6e66a36a856eab6d735433bc178d636d137b8da85f19334bd0ec9617d8b484986af31bbaf7f8ea050c5b4dd9356563bd2f874b6c8fa6e9bd88b2ca59ef3866fde4f17efbc5dd66c72b76e37ae65e7dc5c541d4fa5c4cc1c2feb678b7941d37ab5be7f92c665ea89b9679c5a6f8248f9fd6ec2bff82ec048bea74ccce0cf177f370d3979b84efa65d64be8584fbb9b66308fcafc94d38e72950e968b33fd98da285d4850ee48aacc0e5e8607e45f8053e6b272eec5a34fc0aade339fcb7d304c749e9f05f169d2663a03bbc82659adca40f5ec5dda1e445be8fe3a72c77f333188abd4de0b6a98ec10dee698b87f195b2e398ca708d38ef0739af347b22076a5849ec46573b0f88f444464d9fad645b4cc6f7136927c34e51fba619bd82f826b29fabb8bcf8dbb1fd5524348104eb4733edab504d40e104b78ab9317b558330d4995168752fef3455eba2cc4cb679687be93860cdde848bac42616893e6f7e0645b354a657e4f064e2e3f66f89bacb8585e6e9f725a7f3e7e4feaadbcbf9638b1bc09e8e4dfd3fd16e45ffcdbe1059c4b5fad751986d1fdbbb46bcccd365ad6c6e4dfb87dd7f97ccd83ef4fabf80ce3f1d7d7679743833823aa5a05b1b4edf63858cb2fcf7677da6929bf6d3459573e25b0ca4964d6798cf35d860d05541886ed800de99223a1d3eb6ddbcfe572b58f0f5ab03a1bc047d7928c16d84426de16abfce17fa89fca5b384b81b8abf4741674ff62f3d51e6ada77797234ad3ccbef6a78cc34ef7b03ebb0d6ae842706f6a54eea9599ae8723bacf49fb7d9e5aa83ec943f49c25fe89065e43502cb35318432c8b89bd2b9243f35c4b443ad59ef6207559a33e4a77bc67c4d79a3f1edfa16867625d9e6774bc2df86eec6c5e3cd547f9a5457fb4a98469de57ccbbef3b38e55ef35e9dbb61af4a6924f5cd65bb43b5868e1f8e3428b4474d9805af5333a7ad1f5c6d722e69f76d798de5a448aa393b5c496db978934c6eb11ee1254d784ebe3825167a342d6f77bd5eaabbdb89966150238748c492379b387ec863fdb6f1adb4f970ee6593358ca0ab83c26ff5dd26691eadb00554c2399afc45fe71bfe63d48db72ee6cf36f47dd054b8f7bec5a4bbb6b0d62bcd24a3b8a6d32c53a51bfb7c57ecf +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 0b4c3cffb2ba4380ead13dc0d8acad2356b448a810da1df29f264c44aab6d24f +public_key = e3658e3c96d7f9775ea3b57a481ca307a36b3688defe5ed87309d77ffd6a6f75b2f695620c9753f98be67efe4f4b59a66ee953aeb7eabe866ff3e34caf6eb53f5842a9ac3c811abc36798059db5a51cbea003b5687dc73e289f36e69477ddd3c5143b6e22bbde999379bde31215c9c46e373775dfd434a58f4ca4c5249c538be5937c38283df759a55f43ce36d24fbf34c5bb876bf594ac89e51564e44df869edc93cc2e43d307fd6d8672df16a08cf940327ef19adff4e25bb223fb646ac5997c8d6adc1bcbd49a78344d9516cd5238bafc3445a290eb4e4cda6fe1f6efefd58084db9ed675b608faebf77de95d2f6a6c7dcef6bee4ec584903aa427a34c4f75b7d0dbb4564d7fc2b35fea9b99173659ab3639d3476332c74aebe0b6656e3cc3fa9f06406718e67e8e76bbc2dfb8b409780263851db783979fc5ea3e4a18d6383762c6d5f88fe7333876d1d414dfb4548296d33947590534a01c399a383eddd4c88211fbd0b1448e066c529ff8c52d3c34f1ca1e2eaf34f67eaeaafe084179a9683d91555b9d77eaeb33a3c42dffadfaa8ca90db92ea4d1ff3eb35d4eed793df84fc534c928bfd575881e5678ff8e803fdd8041475b0f4a36c7644442ad67cb35a634afafe385ce1a1b5c4f9c4a169dd03d1aacc548a4d5e7c94c6a4799cb843fd4c6e72d9e1fbea71bf3fb502bd04ad9c0d7a6b44c2970141ad21416483dd835e7987b789d41aac46807aea53825fe3c7e6beab69a86f5f91b53eb1eb6810548ddf09758871335be0735b5bffde2c4593ead367a7ffc2af78f4d888fb188d98486602b743d73ff5a57b3533623b57cc9d5ab499835093b1c4b9d40d361fec791d08fa17417981ed7e3514ba50b46608c23d7b7939ad5f9b1ae47ac2f0c76172e61cf0677aeca801504512433918aab949c078d46399d874bda6e9987e9aa71e52c569133fb8bc68c565d8c9bec555d17a62945f5d297be94559672ddf0966ec6bf7859c3469773cf5e0863c16c9c4aa453862f5fab3ca942d887c95995dcf40bfbfa44f0fe55660d2f516bf8c940ebcb1ddab9a36a341dce44a646321037c0733e424e14dad92c706d254e56f480137dee0de840232e71120fbe85f54d3bd5e3482cee2ae6c50b1ffd056967c7bd32c99ba8917d847bd5aceb4669619c71f2b7581736726dd8d0a3148bd297ed8b06d808da4cd13b88232d9bc09cc2a88a43defabe6a24986d697fef253aa925f5b3a3cca02dfc9fae58c699745b03af77e4ed4d07fce7fcb6b723df308bbeef6ac699388976a574ee1a74e84b48649bb32ec763227584ee24c0248b7f5096c72dae72d2c8e982f676dfe44a8976e8c773934765f1eb6a6fb8ec6e153c72d7f8c9067a765cd4e49fc58777974f975ee739168deb8a6b0f9d5997563d7f13590ac3d173cbf3f7b7440fcb6db809e1b12958e0c6ffb6f84fa5aa931c1e8ab5fead6374a3482ec0542f4b04dbd7982988fa3a569ae9342963e65c1eff327f8960f89d58a6e3d08afb16d7ee0ec942a91fa72c09dfcabf3118a59c6bf7c273d6e63a8470b18c8c2ee76f4d2975e7d79df7f8de759a52e6b689ebb7bbc7abbf660956018eaac3aba2b43aba545951427cc35dac5cbafc7d394bbd58af854e84b5f003d69a94b35f4bdf1ad3344dcfa40fb89a88ed91cadde25d0d52e9bf8c00fec3e049d968ee364a4ba8c0b77a7fe83a65b762565ffba8bef8fd4b3c8ef85fd0ce6f80ba5701c9a48daf30e455b02b28641b98a67a95ef327fe734cda77927debd79d111f395e756e12758efd9fed57d35b6c21bef694ffe72f9fa2363825566445544995d0cd9ccc492f7ee9072e398bafc32ef09fd7f2f9f88de327cbe884ddd4849569c415860df59646ec59ed15fbade4adea6bbb8e9e9f4e6c43aeb2fcd4969528e5daf83b977d4f8681fb5fae6f5a60fcecedbac91b14b70d46c5ea18551f288690c3aad6428939426326c54a80b1c6281e5eb3d47462f18c6c5a3ec60395a1e74826f7cf58f66f2f689c4b557d976a961945ed4b52ed0142854bbf75d41dd9bfdaade64575a7546bec2aed8771ce9a7cb48208780e1c657873e63022c910f17ec5aff39a23cc9f1697cf5177f88e7580df8c926bfc405a3360d0a80a6fae486136faa9c48aa48d1ee87b7cc5c638d67be57548c03711f9b2b31ab319d45c578e5acfa30dc426ac3b194230a4bb5ee07f4 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 1c82471dcdfca3a6942061ab4f3d5bf0d197321437c706d9cccccce449447002 +public_key = bd85575297f5706cfbd05331fcdfdf567df59fb8fd438392c72994648ed35726df985555dcbfae4438310e3879982b55f14de8c28ed1c2556ec377b15fe6507498d52ddf360c5fb8cbc7856c8894cfaf37e87fe4da58eef0363c887f94399cca9e38c24949fd62af772fa4bffda8e65d24760bc9dce236e4e99fa9c7f3507074f7bb2f57ea8ae3050f9a6eb7e5bda9b2fd78fc6aec65f81de8c26c3a41b3df53976ad8b83aff7268f6d9b3125ae5b955f8025ae79edf4b8c56cc8605914ca89815f943c1c568f255b7583fdac606d06a27d1458bd57cb3f3ddb65ef076cda0044cac79455798b501463d39df4cb9c65faae94410f79995e9e7c4a3e9e898aad54c62039e491f96362d4792bc3639b665ee5a8b7030e9870896ccf56eb65fe8fed0f69dae1dbb618d5c554aea1953364363d3c1c8834c4af5c293fbf7c6fe1c5dc603a5ec12ab6b74eb72f5be5abb5455d9f681a0d5a291cdbf0ae79b03973e3cb8dd9fdf83272592fd0a64939cf6803441dda5907bf5faab1b9ae14b62f9ebd44dcdc2f5f48f0b8348a7bf6631433dfc0db180c7f1910b8fb533cfe4a8be1d35dd75a9cd492ca0590ae2523fae5463577eed70c87944bc48695f3b4b050e4e9ecf9185446e4683ae2cf5b9b3ac399fb6c65429f5075b7bca7b732696edc105b3b57ab55b9ee7ef69b33cf79665663d3355819dbbb235f9693d8cd062f5f93c0a32d744fc18648500f8cb3af9f5c63db65084e8da33a819e57897849bf3f36f6bd68287f7cf8c5f81e9e5af40bb5f76c63d4a14cfbdc8f35c6a95415c4aa157568c34ca9f58b3991a756bf5ab9b658d9464ae218fd6daefd49e9e45b7cc592618602688d6a23aa513f3c39cd7aee8f7eae4b3a4a6ccc571fe79149cfaa50bcdd71fbd8108f170de334389b9a736f08dc9f0944530ca839f326e61b89a59351bf220a4b6c67caaa34f5d78eafa3b454e396386c66ddf7726aa3863db881640a697dd2f6ed0ec1cf5d5a39bcb2d6ea575fb55a8a31cebc84fb6ff2ab6a57a2658241adf1494ee4844dcf158bfc649e49a2e632047ace0dcfaee5a3e0f647fc0c671f648c68a1dfd99aedf78b34e80d5f3f9073e4e4c9e6f2df818e996d3b3d886e7bcf18b69d3ae6fbb1e81610b6bd258d35cc9dd8d54df6d57f9032bf1a5fef37e8edbddd5d40047745b33ea22246e517a76d77adee7985ebc794fc5b5ec17d9a9e9acc471f89cbe36ddf5c4676d97db8713bca53a400cb9b4fa6c36df97a023bcd3b08c621e83f9636cfe9828719203852a7dc2fd557348f5365cd9e7fd3ccf71d38d5d96336026c7d33b88552663297dd44237b4a7bd9ad49f414b068144ac67972b3ce8af5753f631eb2ad3b40aff9f553303bffeb9d7f1eaffbf75ad6673fcce5bdb77eb4b525d63906bbfc4e95e8322e3d6522ea20546a8a4eb45f85881ce25721c0d58c2334ffdff946c7b9d6bcd5806fa778c2d41bbdec1250883873a95e3d5b76a3480d8da8b48683c5ebf757eab919385d649e74440dc58a56b3ccc27b2a8177bc638b61f0e36a215c8079666c77857018784f38bcdda0c5663acd3196b54cbd8db4abdaba6f6a9df45fcd09c5cc7ed5f62e835f8bef5845bba2fcaae4b06ecc55ac98bd67763fcd214dceb7c09e732a6dc9fddee0f27a9809d9d80cf486d0cabfa146b72baa1448ed41a5336c723d5e6e68a43577bc1665c0d66c76a239096ee3922dddc4beeecdb79d50f7857c4aeb70e3af152ebcd0a6ea93606e56d6a58315d86e944d61af3fbad1b894dcf794aff803214d1188775ab5d78b1497315639288baff208f6b48465613a73c540e383b79e81dfe4ab4ad5035a79de39973ec6cefc5869af123f0350c3c4208cc68db8944bde7215b72b3353b780d3fb0e5e3bf677b81f66085f8f05c17cdd6c6d3ac98310c9a967a7b99b8d3af10b668227ef333f5dd72faaabcf936133ed572e6710e58f703be7bed5abb5e4a57baf365c39b59dc7cbad146d1de6b40f547da49e5b48c9580a1cf61960e3e6b6889b99b7ee5d93fc8b795cd6fa37ccc5e3eef692ad66e903c74bcc45ed7fe6a68bbe7d8f5d9478dc429af42d20af57985a0b7d7a30007df844765dd3d437d13ff216a8d99dcc54da34c0a5cf5a9bef0b3d3ff45a3777467b1e639bcff1bb9839b6b45c7895bcf62307460df309eb4e61aa9cc8941418677001064ac161a607e24e1 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 46fe60a18124125ab93e0c578f1c02f1bd1301595013001c7f3c2fa56cde294e +public_key = f8ae521ddb8ce3f9ea2835a177988a4e856467f6ced236ada9bcce8ed885b19b862ba5fcc9bff69f35826a39da91ce70b709ea608e6dd73eb1ce66442469c42b5fdfad3970edec53a01e826a4a917bced5123b4c14087f7b2455202a5455159e828cacd84767e5b9c024f4ae6d37596ca7570fabbe5a1d82df6f7fe04a97f464d9fe265054bbb57426b6cff7e825837b4be360ff7b48af3a72275f5b77c450cdc4a484ae7d77f7f3c9cef82bc4dfb72e731fc5d4277ab50f27ebec369818bc3ec33ef6f6a47ca2937f907890c88e5a1f1e5143f62f5865da0459ce7e04695bc7737787a9734fe5793fff572f44912df87ab844e624699a1ab50bd872cb29bfd534b401e538c52ce2dd8c467a14c24f5c9856234da17ac5fa28870dfb70565ac954c440db4572150e6e301736520b5e15538e93decb205776f849cc0b33f11e6a67ad5c9fceeae577f6f5bd37e587f939fb3acee24e35613592a7364534c77c2a1564152ce2e1c6a219b878191dd1e2c94053ebb1282c5288b7d7ed8bf45f25d54d87b901c939383f44f776ca51b3b9d016f8c9b8e65993974bbcfc0b26715bbea1ba7d6e8264a0d31da0e627ae60b59ba58a4abbc6ee94fdcf3133da624591e1dea36849d205d652688964075eb7cc7ec26807b11923d56629914fcbebc2545b56bf610fa9fe749efe82b73d10a541a7c8621a4690b3ddd149b5b952f9ed992c52e94f6448e5936de4eed87f5ff1c5bb558d3690e7b6438d5b1698f9ee5696b5e5ea1366da374d9a1eb4ef03ccbf6bb86a1c2d5bed1f8ef82cfafa8de752fa54cb3784081b5dec67bceea87a8864bae5bca2aeeab4ecb3dd460b401597dc0187b2519783fa13da3784f77f0e8274775ea2cad27b96f4c1dc569416a3117b57dc5b34a1056e4cabeea54b6e5f55bf1cd3c027cac8f5f9b9e4d9f1d98692a007ac22c6b044f6ac9ae5acc4aa3062a348eb2cad9e87e8923ebf56aba2d876e2e01accc76b3223cded31bd79ff5250e086954574e214ce75bdae81eb738fc7f8de989b43a0c4c7ba0b41404abe955c3c01859dc17b35f48cc39e9c6ff856f5924ce229e9b7c4cfccfa86dc8808b43225ce4fc96bf1cdaffa26aa4344ef7f14aa37ba5d48798c176e319c3e325d04afa0759c35153ec78bd7d5d88050f5a1f65f62860c94990460341c6eab4fd55a58d547cbd829d5c33a9fd8018b4c098ac687feb1897d864e2cb0777a798d3fea65aade7e9c5c2936afc4897a611c55086330ee1689f88e7f44a6c127a53597576f37b35b4f74c535444abf5342ddff56d058d0b04361adc83a207952fc8ecaa20cc8dd07a6fe8864e66f84498fb405b5b4b65c948b237b385974a9d4963068c3e6be8c51e4fa7bafe1d5ff74ef6fd8e63d907db49db956b8e10977e23572245f3a58c5e1fbf7993bba3c38a95bc0b980634efa1c9449ddd4d8270e780ea65a6b0be568bded9f3f6cd10a8e2033f0d3af9e9b36ad09c441289fdd6e0f4b3dedc818234f55d7855b1bd0056fb198a669c09f4bc81c99ae0b32a2dfef448ac6084c71a59a90fb43aaa83f66e6aad77d16a8d1443de5cfb61c3ccc731437ff744b7a7cc3a02a948da951d5763f078a991cb64ca8bd49fa2beeecb534509aafe04437e5f84e984f61957ba7477d5eaf55f8b4ba37658e6f45045d40f8d7c14c3578af5f75f69ccbae36cf6f7742e33db588bdb5cc339e09e7d7a9b10828da637586da65d85eda466e3c7734f85e6b9d3ef0fc91ce79391033ea8f46a7e084c595177a501b390eaa818c0a9fd37c9be88e60c7a398f0f8dd8e5896624d639656890ddd8f7ff9ffe316cb1e25e7ae7741445a47c8ec3ff8f54f486e46f1095f9983d62cce7f6723542b0a48e12b7e4dbab100f3bf6dccf19816a76b4ed9ebba8c823cbbd9176062dd72d587f6d01f908747bbc267c59fb7ef6d7e9cc88f7b929e9ca3793d03a73605eec2c98ca2e99877b7cfb93c97965c06b2dfe7ecbbcbc7c81cb56b36587a174e89a3d6acf88fd2689e345a78657c5c0b65b0f308f16f4d5dae4738a716ed54db38bebfab87e8cb6dc93f2cadc11b6571294db740ac90ac44d4b69cba2123cd346dd4d8e363eb18e48b6f7b66c4e42f66b18e56db5add509174d5883eff4de6db84f6ef0ecddac06be5e83a6e0ed3c2bd281161cc07676e12ef19a936d073d684c1491518bdbd426eb5a1463cea8b67 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 52fb7cb6a633fd2e83f2892bd9441b48fe59ecee6d026f5246fa7f2a5e55ee3b +public_key = 6f26e381cbb8ff776b4299a36c893aea783b541b50b3cf53c088683aaab40ee4f1ec1e3add58b322fccacbc9aa91b74fb0657e7a37d6ad9c7c7f88e3bfadd8cb07980d4edf47c764b4ea496a06df8e6a534cb49853afc17b4c7bf096c52d8ff64b7855b7a5552aa93d9aeb47f5ac34e44da094e4e1cb2cb962c9d589aeb32dd68b672d60ffa2ae2999525434e14ecb4906ae9a1284928ed8c42a2c54626fd437f93d3cb765033de412a65983dcbe4d7db9fa4fd4195fe9630d5b39ac65703442002d52d18a83b08574896cdeeffe9bfeebcfcc7c308fa6d090e9be94bdec36044220858f671bbc05fea7557897df2a51adf85a0f8bf5f158d089855f1a25dbd92d7edd0c63db7b99497aa03eb33a8078d67d43a24957a20fdb6e11a4f559087c3ff343a2f5503b33756d55c9baff9f6fe83d80cc3cbeaad0e8b3ed0b986d1ef7635c0cedde434f6d8f6ba5445a5933845d1cb8047a8e2f263e1a86b4f58433c63e8e6b86942cb9fcae767e2cca9111bbcd8b68fa81aa5d22baf9dddfef374a96e563d2b837aab97d920224e324386ff7f9c7d2fad68b057cf6954e6a433a560f785bf43ec8854ee7a8f002d7d3a0d6c35ee79a317aefe3148b0d933fcd55d829746c71ef6d5b7b4792d4dee5d5eb80cbba43acf12f1c66ce6e9408d654aacc9c1eed97aadd347845ee9a377e098ed2647f8c08b7eab3db7f4b5d774f0b99c93d6f7d39c1aabc4b4bd64356476f85d6945b4d4df01bfda8988bc9f6b34579447dc3bdaadea687efc8ba67666f179f782e7daa8cbe47b4db155ce6a773627bbd6c66b5c291b8616bd675c045edb13938c1bffc874b33d7dce28113642bde321e65f0a636681bee88fa6fa794bd72badc69316b96fb69ea99f53ce26dc1c9e563859f5afcf5c2dd84d69f89580b4ce8bc15ab0d9e578686cf802bf5c56c3e37847be52b586acfb3f03b9b5b6ab0d2c5d43e56bddb1c793d3cdfe47544e62ce2ac0771a48c8249b3649d77ad9a4bb5d20c3ccb0ac05c5ea0d2ef9cc89e677693b2d96b83c0d599e47bf38063c50c8ce01f3b3bccae8fc4da9d72bf3dc143e48417c2f4369b0d9f855e538245f444974e3c751f82f5d7b1492e67d90536b99e65226aafd7e8aee92eb22f69b963a87e4bea84d5ca3040464e7293b1bac7f3dd393ee46d6ca2a4d4326dff56183cdae3d5ea19cc3f39742373e0d16ff0f233b383c5bc97fce544a8528c1c74a6a48e9b9b31097477efa632baa4bc6a8abd6ceab5d774bf988b7d7099f6286ff7be2c416dd9dfca57f04384f5ae9b4769443473efb54ad8924935bc0f65a4740699f215ec1e63e53cc354527450c99d9366f696c8b3f3a40da28388bdbbec532a0ce680faa1f89fec5a6988d8386265bb9dc1043c5fcfa1c51a35edaedd81aea4c41755fa669a8aed5de79b331cfe3ecf88bff92ca340d5b961f446eca336af53a95173cbddeb643d4831c2f563950736fcaefbbe47ddb0ff8cddd3e9ebe869580be894a97002ae4df91bd1b3badc6ea5fe79c7af0739d5f65f487cff55e106e636dc93824c770959fbd133516af7ec1b057cbce6a4a3d48b0744a5cfbe604f4ea378e53a9afbac28c3cf98beb03c3e797d4d6550cf3666c34f782d7639faabce69c1ea8f62af2fca956bc043fb6748f54310379e975958584579fba4bd51ed4b74adf0df78849acad07a5af3da9ae8d459e94073903d1a3ea4f43e0e76b29acf33c5fc8534d831e69475ab6b611bcdfda335efdfe6b92485d41f88e4be839fc39bb06a1f799c553b4647a7073482990d90c2c9a96b2866d6d8b65ecee72ccd62f359db709bf39fcc8a39f8e75924c9318f5916386b463b645b4832bcc399b69a812aa9fd0adf60cfc964eef5c8840f7a2d44743fd538d05b3418af6974bb639f4941328d3b10678c725a389aa6abeaf83bc947c6a4dd31487488c73be700b76f25f42ffff6595d87426b77f58fb6b9945d8189e9b37f16c2efe87e3df7d5ff794b0b5dcb7d8bba4059ae2e3ab42984f9a42ffc3e0568a64b64a50eaca8cafede8d7dc1cd656c6db02739dd23bcad4bb7ede7f9989cd85ff44aefd519b7ec4d352d85b9412d8f9f8596f1946dc2366736a345d9c750162ee01f8e92848d591c19868128a921e56384eeff19446577783e0b1665396c56cc9046c4c7c08a569d8edf0b76096e3c0643e13acf3d522c782871a1f0b31cf8 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 0f81a5f97082121244403da3feeb734f6084b314b8d94beb11627aa6ad1914e9 +public_key = 810bed51f687aa1438a329b1018d5f9a0de7da1e9d2d06c1a6978569e7c40cab47ce5cacc4d35aadd89047a3bf7175cd8833540b9ad28c27461d334b3f8680daf57313d7713a45d75ce971cac3cfebddf774c3589d3ef32d5a73d959705be77c3dad884f9aec3a89a1059972f125f57ccdce9f23f71fd73e7293bf944b82865986a5d56e6c9c825c93f7204f908c0953fea66de4ebb8210e3fe9aa9522ab4ed66334de74ef8e66766bfc47a7b5e56c28fc0bb3628c8eb5956eb05e4ae1d945b36a49f3b12abf8f698d1234593d0c784633cdaf09cf904e48f74fdb15c48aa82befc3e79fa4055599935e1076c8c188db1a1daf4ac9652249b0c64c94147e32a12ab62edf65334cc46a3444437a74b086d39f39bdccffd16d94d2081949c8f6d66f09839dcdadfc6fe5590aab10d5ebb03b68702bd693dec5c47c58d214b139b835637f8b3a87ef25cb7638077c4b7bff84ceedf2369ebe9b4e51f36be72bb04e1b59195faea0cc31d1a774768940d748d1b8caf3f71c542c9cd1559862af4950b8ffef5d4abc3b2ed4251574e5597076f971b46c3710be858a1cba35353d2aaf3db9e756c58ae15539824f5375080990b3835023f448a33e4d08c6897da5ae363f5f9b7ed7ad4ca05d653ba78c5769f5eb369cf00543c2a2884a2e5d4a748f700ade66218a981189b5556b38df395ae007772d2ff2c4ef778c34774c87ae0a3ebd116c82ae33b34558d8e07cc5c7de6c5108c155a451e056f60067c6fc0e81ae0845890e7fdbb7ae63e9632139dbdb4b3867074e6e684b700b7d5c1d74641c5703ef87d257b8a54597668ceccd8dff735c30bbaa84c04d51247df572a6fed8acfd7a48e7ac4879d149ff9199c003e63667fecfc609edfc9386b196e5bd3691401ed270e8a4a9a99e772cbb994b4ca926bf8a04cc1d2dc886df68340ecd8c7b38129db0e3dca0d6c33fdd494660df65782ae6fbb546e9b6c6ce0462c604b900fe9cc2d4608269f84b8a83a877b9fb18415ce6dc38bdb3d6a48c803a61b0a5c9686de8f65ad1316f440f0c40c72d55cca7bb6cb9a293193485fc529a2f478e4c620a83e44a57833d3b5b9ccff2f2f4b452447cc06638fbceb44054d2449a3cd60bcb2fbccdaeb4f08678fad7f972018f76e4e5449227d88b485ce6757eb45edc62796d0e7a643a3c72c71fab165475f6f5e456d498e858aff563c1f788e035fcab3c85cfa30fd8d1e4703e4de5e14689fa0c9b1f57984b678bab1dcace44a2fb23bc203e7d5304552316e83435c6211fb2ccdaa9a744575f959b57b9ccc3cf8e1a94959b9efda7ff59d11479fbbc97f54a57a986be61f49ec53ef4da687221aa3eb4bfc02a8f49747bf0ccaf91f1633e7856d8d5897da14af0ea377df6b9519823fa7fe5f6d075f50f97525e8d9bf9cc7270c7b723cc95dc9c8de06ee3ec4c8b3cdca07b7f42034741a3cc684a998514fbccc435a8a2e9f675e6c3f35fa7019a74818689574c6ad917d80954557ddefe1d47ca2334db79cf301f39c78137e80c268b76289132aab01f457adfa649a53f4a09edbb5345cc2e09e0e6e33588d6adb499b04daa6430ddef5777bef8a7af041796316e9d13cad991cb36e9cf3f16baab09b7fe7388c93385331f7b5be05fdf1e75c7ad28c54df96df40ed96ff4e20843af7c7878b4483957cdf2ae15e12253b97e6a61780ccf4047589fad4000d575947ff983f8e87b6f32deeb59f6ee47ef26f8a9f692b8bccea069cee6f49533b7301728a3ffc85d7db98398ccb38533f54f843dd79bb58b4796a1fc6d68095b8faa7ff948ed01e6ebd6694f2d2f5c46086031a8610576e033948c29278e422b304dac98185deaf89540a2aaecd6093c86a3878d2f6fcbee56b95d38f4ac53589e43f2f585508f5b0d45bb974b724368814a9487a60a6e4136e470935a90ebcf45b53279c67d9243d556e99606ecf2a34e9021896b2eb750b2479aae7a706b1bbdda5e4174ff3dd3066162adaf8a6a9ef6aa7efc0be406b9c421f63be2e376f747731a233a45a8309bb8e82d24cf6598c26d65c89da9c9e9e6b9579a481765fa8d355ede798e0988eb387c9935333b15e9f998a4c737df66e0cfab627d8fcac7b822dde04459ff7f4bb8f37b502689df3a437cfa63af8844eb95a8899ae3eb3759ece3e42fd9b3701a63d537569b75a6b4b362c14f1b4ba66ab7914c9900187f1057 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 31af9345365549ea0360169ed57daf98cc5444799d4c75d9f1f5d615e9df8a91 +public_key = 56ae5b781e8696afbfe69365a4474cc6febd3bd3dbecb4dfa5bbd5198b708d68e10aba64fa4a8e5f955bfd935530b95f16ea816074ac23f8435fcffe85b762158e444b69927818f694fd73d623c99764c759badd6e4fe1ffaea61b04851aee42eef86ec20430813cf6aa48e2c42471cc8799b819e5233ee1c97bd9ea063518d4f78656910108efaff3f29fd85900da5abac8a84a688bd59ad3213ac801a9f9e089a24ff8c713ae751856722fc7af3c57bbf95c77c38c85d3e481916c75ffa371d3adc584bd3d301538cf49c74404fad2d8de1bbe3c5f1f6ab6d3ccd743e77e469e6b3dcbe0d3f12215b66f57bedbdae18cef4c4b3f67a1e65c909f4588e9b10dfff15775de653e4b7653e36e87bc141c9a01dc7b746556a1fad1f5aa8d2277ebe3177bcbeb605093a226eea847c6ab78ca89c4d3a4a618932025aab56646a974b0894f9e1833d8dbeaf7fe7ada7f5a6b36d681cbd94ec205a0193e9a89345ca67e5ef89f66d1f67dff3ae867366d14bb60625b988384df4b46f7ac385fa728a51c26f401d86c4f2385bb9661ca99e5635f3a7a76e11195bacec69abd4c35ba6959397664ab56a622af5b00c5aa2c0793487a8b1b5847a29844d6e8cac42ba2aa3586cf1e7b010aaa334f36855771cc99992afdb948c671b4a7ced18f358fc94147f86fb01c3b131dbfe0ef66d106db72baab460aa7cf7d83d4c9e3635332cf559b122af6fa643fbb7553781847787c8d78e9662cc8f9426f7bc863bc79799d478e830d3b41d156384f157e3bdf7192c9fe48ded6ab7ce304a3b56733e62e933cc29bf20f45cbba6e5cc90aa3483cbb9c6ede7aecbd81bf8ba3b5ee1264b6c70f3c30843462f33faf19de43555635c674a80679fbc88270ab53ccc83b79673e297ae394dba0bc2b421c0fa0d52e3891edd93c19384298b039b5b8f406eb2def86c01eb9a7ce64bb6af69427999e7d7c3f6fce88d66fa293f18ef393a4ec7a36efa927c9f866e5976e1b95132f36c39ddd2b4989e0759ab8ccef37eaf1288ab22fc4a13b08d78a9abac80c814d25d88586f275c638087b643c6db46744d8879e56d52ca257ba50ff1354f4164b4d39d69a99c78065f7c7674c2dbbcf26656d1118f3f18fbc894d529aed931a5d38f766fb11daaec75668b81f44fa6769a19bfd4643930714e9a01ed5082ba91ff44f7b6bb33aff43b524979ad5efc92c6b768ee1930afaf8a8e41a6c444e2850f03353fc6ca2801df3b9c88f6c0b8aafc9cb9a8ec461efb17d594c7b6db6e355ec9675c923a7b1645c4d40bf8b1f4fae1fa3d90b86659e1a7d46183d26f380a3cd46da0f8e9906cbdf1ab605367be6a5609e79cb8dc349c739b7d4f74007fa69b9c5dc952f3e2155d9b3ed57272476b1653d9084db0c059b1d2845ea9a57cad384a2c7cc2c9f697906e0de47bfa02af17cd3c43cddeaae86642b84b79ce582978dd427c78b804fe16823ba964379f1374e4b164ead1d8235cef139d580ec4bc11be3b6254f445419f04e1a9459ab3d7d33815e76589cb4d09b27ca2e6ca470c6e504569d0f8de55d988b80988cda1c9ec0da673bcf497d7affe1cb853905f72bba5104a4cf7659a616755cbd7aecfe4fa9ee2ce15158a66bfdbbcfbe49dba4af4fdfa128a988d8aa5c97164be56483e28e6e535dfb909be2429c505d0a3a4b2366a7bb38169497e7bcde3ca8ad8f9636a54cb4b4d667d91752d6658a094e6d552c3ebef8da613c41de4478611598bd05b34a66853b079481885225a4ebeb4b67229de3a387fa60e55aaa25ad44575f45b3e78d37af2786a76f2da5a97e9d84e693f693507aab4cb43c55a64339359b8075a643b7a696c383e44a743288c37ffe36c454a45445cfa48c3c7d0415c126de33670ca1709c7f80897751fc8d0703dca0a3b1108ee0b03863e6bd40b7a4fc6b5f7008f7952b89cffa3ef8029695536eca7605de1ecda0d2b8b682d8459ffcf91c27c1e38ebbf6ae7dff1cdc75a3bb4c987f31be75c293931fc444728ab8590c6095d6d542e6bbd2a39e324b96b06e328ecbc54eaea44ca7a175d6ea1326e0bae5e44c8df380d45b5efe622f4bfa4e74d457ac830c8cc05ef95b4429b599983bab346a47443575087e975a57ac9e601ee65966c5e8391d8117934a5f334979349e3fdb9b49ca49252a4214b6e298c3b12e5f6e85ddfa7edc01a03b27468684972318831a +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 774ae54093d694ef40b63b62c73e6c98295f606feb8699807eda1d030ffb996d +public_key = 31596bda1f527e2c965ce3344b56f1191ce0705d84847dd6296c37949aca196c426f4783b76ff1b9d5d827c85b7067a9872a6d9277828ea9385f9b512a8a3e8986f8d1aa36a62d6b350bf29bef626a1f6b7569db2e1d6741abf7fa6852a365fd6ce48c9193c96b3e313a7e66d47c53eebbb68b949a5bc3c7d595d27a6eaab89b38f5295ce7d6dd3eadd9508769ee37a48eed685caff8d998b883d871996ed8b49c90849dcb68147e8bc561df29cde03beed5236ed78bf3b303ff687b859dd6343999dd8735640f6cd73ccd5cda79603cfb37fc5ccd28e98b4fbe692724d8a1cba57e2eafb87c97e2044766b38280b6911b95725d5a773277648336d3fe87eaed89baa1c8b2ff49b74118e884c63270ad693fe645525df302ad552f59d35a36fe9d047d8b2d75fdf6636d7f6f8c6d98fb2b8f01c89e87478dc22efc38feb8570be4cec53674ef97b8aa9613df6a4dddc6168c9deb4d7133acb93add6a7c76d581a877f046b9b1138f6fb6e56cefa5c0bf3d04954fe33be272d73e39c79094864cc9e36e46e9c8f1db330c17a0ecbb332e385769c4c0ace7c0b0d49fb8a5d3ccce3ff4aeb1a05feb80855fcb947cb75eccc0a7b55c6ed0c09aab930ec4ff8c56a2e9dbac255a3665a732dd7b8ae8f9f7a7b556bce2accce073b4db7c46d59edccd97b5dc493359c8ba390e47e6921a69998b9b111c4dd283456f7b61ccf97c1dbc362e2760e39f82284d5e44ace26d85f6526f98f73e5302288043085808195ea597e18d83e544fd947aafadb96884b3b6f0d4c861248e8cf848b295fbd0363eebf614b07797edb1d8c779e6ee90257730e47bba178ac6ef8b8e47794517727f4d49dc759ed5a69cf7c66de06cda5b0dc366a87f7f39e4e2ed59bd29f1ee06eea9dcf0200e6f1cdabca3dfcd9aee884d1e4100ec5fd004e6d6fc6222a8ed8e4582dd138d71a368bd5590645359cf767147ffcf5f7a58e1eebecadcb1da0c87fd385c4bde5e02836d877df5d0e8e5b06eb564f8d3f1fdbdaaaead0a3b86dd9a79b29792a713c7900dc55668aa2a0962b4a9be8bd9cb6966a055fdac3928fca4d54f00ef97891b964933aa8e6da87bbdaf09ce39a8e79b7a5773cf189cab6e5f64b973eb273ede0bf8be439de0ffa1fdba7f2cc3c65d0bde0dbe77b7ac49ad1b4da17f5a3f4af7410bfd82347dad3f9657c9bbaeaa94821ff95c28f8b02cf2ae45cb0e0b46a68837ca5c8639ab483eec5b4dc9caf028a7bfee8accd4d2ec6aa57a93a1c54ae45f9f319444ebdea6f96857890fb6e6d1bca0cadbbba3e4302e65f86c58a283ca8d1626515e6a84881aa692c662a3567cc294a23059392887ce7a835f8c8d30f6ded60518c71e0c56229efd54e5d043b73182fa67df9f768c63c4a2c562ac25e342fab8fd9e81bf8f301404792aa4f58b98411fdd93aa2fe699fae3fd9ffbb5b3e7b56ce167bce2bd8c3ccd9bc743a634ed7ad962ee3ad91a779a34fdd0b9b4b41a5da11cbea095d32fef382c4b8ce088524075cdfe7b7c06cb6f2bfef8f4f7a6c5d58011c4fb8cd39a8a0aaaba14a0ea8c9a7203f36944e0cac54c3ee5487e7f6acefdff9dddb027844ea2dde8e2744571c3a2c36b4e0ead88f09ab93925fe30696cfd3473a085be3eccb53ec4d6b66c95ef9becfc0aeef8d8f38b9ce29abc9177ed864415852cc8ce13a7dfe8a76ed0ef46800997c56668af974605e748e3054700d7b760ae822793d9e41cbe5b5ae7696c843fb4ad7257ebac747fb03dc99d2433665433ef29b6497dae8a3593845ac211ca4af0e5aeb9b8afa5b4419559502e834f993543353835596985e325f9c158fd0fcb9c12aec79b7d4db1d531bd0774f91b6810b98766a83387387c078f584c94793fa771ab8b4216455f7b1e7c65e5a482fdeb5bd8bd0b9f636368e5f4ce3c7c6740d3de778ab47d56c9a37ed4a660249b8a5ad2cbe7e6f7ad9a646456c4b54cad68c86f8b99885537966d692cfa68b517630926fa7b5d6b29ed42c25850a7e6357ebcce397e46b95ad9fb8fad2cda8123477f926757d65f929eb7fe379a9bb997bab1deaeb60df668e7715d9591691f9cd68d48ac1f99eec754b918de7347d84ddc37c4695b75488effdc370edb65665f31f01d91d86fb8ec53a3283b3f7bc5e14429c789afcbddeec0454466882448990d0c963c4dc08e6955a7aa5238a6347a0d168a1ab143347ab4 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 9f27a47604ab5146caaf0aafe6d149424f8d66e39ba3baf5e6c73b19221b7e21 +public_key = d7e9bfebe65e89997ce4e680ce385c8efbf862175fbdc9b25dc7724f74eca15be676ee3465d634915593a228c3553fb317df95dcfcac909b9aaecafe9306d38bf9d4571dba38c763c093d8a1d6b9b8667b500c649b94cfa703432f8695377462ed6e59314ae84f7349be26512759a1132f3af2cef127f5566da94c8cbe9765849f9e849a4f235c9df3783627b3e558f430efcf506ac1fd09cd5067422789ca6bd3ceb0f5e6a2e88d0406abe03b65b1fd64d87ddddd2f7ca56dcc784652fd1e68e8ea53f825851b3ffeac1dbb9c8598e6a3da2abb627ec5640d4a3c6efbf2566eae1a0fdfb7dd536ceb93145c7616fcb46c04b2076b9d8b5de3a4bc527848a8973bdb6577c50f73e94e6357bc2d84fae54c592577d6c7a61b794760eec43f7d98087fe32806a7d25482ec3ade19778aec2685ac19490d3d3cbee96e2a9fb8373d5b5837d554dd71855d7b13cd6510437b5c78b3f5dbeb586f7da586e1dd3361773af13e033dd65e9667de8bcdbe3b3f85e901e6d1ae23eff4cd61af8783979f967cb8819afe770bddae196388ed6b9746fc6e536443b0ed4a3c9f352acc4ea14e73d00ab9e3eb9c1dce37b2d6b14fe36dff9591b64dd853a349dc23799e9fd9e91e965ac84090f34d3648f020ba31532addc909b9ee7f5ef72fd92a2f8f48a94a5e04d03314993fc8b30667fa4d5a70642edc062de1c2bd9ee3dd9315196f0929fc329565cc5a64405c3acecf34acccda78f8eb3ca5f3c44affba6e873fcfd7464a302d8349ac6de67ca33cde19ebe588d1b6e850dda6c5baf498ce1897b247bc7e1a84c7be41fc1df86fe864aaff7db6475ed24371cf1ce9586750d07fac1cab46ce0886019da0c24ffabb4fcd902b6c05f4c4bab667b55bdd5a0433233573154467608da2ade66dbc075d7a9b4ed924417677b6e195b90294ffbd4390598cf8a25d4e171e75d259ae7c44333e84f471b58757cd666a0dcb94d87f73043e940a5733f89ae3e8cf037b83a51b4769ae9dd1a9672a2e6c7f3e7bcb06dc3b07cd82784d964754a54dce297b40e3f8811834885ae76a9605a249958f02d9bf2ffda195d360336e560593a637be5dddc681ab9bb19ab7ae95e3fea474388e8e585e49b463b4703308ea6458ef47dff9f85ea930f6a632e8aba8a8ecca98d511164b8f09a8bd9ab8c07bc8a28636d0e3fbed77b2cd13fb1819d9290def192943e028af329b4b822f38a346fb5e2a61cd7b3692dd61497d3d6a2d80a6c755c66d490cd5b47606ac9cd9bdb927b6e4bf6d916d921757a0f86aff82c6e8bbb9d08c7d73f24a88fdfa922eacbd673ec32157b3625dbe06d3ce2c4b64410543cdff80144cede749e7b816c86b2ad4204a8f3fd7cadcefdb4193ec8229788acaf19ba59af78388c2b9865ec3d00089c6c05c850faed21a63f8149cb2a2af7e075a3ec873dd905e5cb789d3fb5531f7ed5ce994f96669b0bfe8af8ae59438b834d52edba16d6ee426799d3e3233ca9487ea35071871420c6825889c07eadf880ee98d75650e36ad22af65d4b44c0146ec0653b5604d9ff4cf90d3cfc2133e9297d5aef2bb87164b7535b7518dae4469fabee91c81395df5f79e4c1a0e8a0775598ad4bbada98e06c87c9a03dac749d3ae1b84fa9a3c3f668042883a8195cea1fa5bdca59c213e78efbe8041bafe9af770d28dbe044bab1c8c36044a70e60f815415d1ad7be65d1fee53b86a5f368729efaeed25f0a09a48c1fade9419b313d7c6a9e59f182fec8ad47410abb73f0d8c1edce6c32b4a46f39712648cd16e96ceb8a076f5c7048a3aad37393973b8679c553a3e37e6b6ba2dea4d50f65e1f0ef216598de59f60122d55f5bdacdb5d3396ef42ba9d398943c18d0ecdca993b3c9a74e19ac6768581ccc9a0332cd05ce873b34eb3e5e497493ab135ee8569f8da6e1fa0461691209d72fae6a30f5f9cea1bbdbaecc7cc64a7d655a730335e8b2fb4f435de2c54976c69a161694aba04456cce4e2bf8c13b1ba2a5bcea6b557bb16e805d9d3d1d1aa33689f2fe0c51dbc35da6cc8593b8b3cdf741231ef6eea9cc5bacd632f75c7aa3aad60a46afca4a6d166f2b2ac859cfa572e4cdc2d65bca199cd73367b849d9fc3f4855c4899eafda32c3e07ec56789d63c25036c35e3dbe6df8d54e7f5f1eb3f924bb991cc4c5ec2e36585c0133b82099b8234cb459a9fd8aca37c4249a3b020 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 90044031b7597b5e60a4f946b713e8996d0426d2cb013243d9b7d8f8ef159a0f +public_key = 27c546b9fe48d0ce33ab8d7fd8cf33c7b5a5c3f6b8db3edef7dc5c1a834fd1559cb2439406895223a9ea4e78f554c63ac4bee7d94daa4848b1b3864edac960c666d46e3bc6d3b681e1e6b49ccdf59f1aa2a53f9b2598b933ef6c00fdae2cf4686803ca7af8bf101f43e64544d51794583349f9854dae778894438805793b085373d0aae85cda5489d74274eb7bfee433b63a56e14b95941440924cad32935440b46235a8576e1eb8d66afe8198b64c6edfc1f942bdabdf8e077fe33c559cd987625f63e9b66c38c5683893c3e10965f18aa756eebea7de789913cf2dcfeb42bf3c4eecab25798ad14af6321c59e36bd517a78743c4469a4435970bbc2bace5499bef17dbdfccb446f68cff4384e5abe98cdeb3346413539a6eb3e0cec40e243296695f2725fb7f7a32ff5be85ea437b275c6f617523ada8f7d2a594e277b9328d19accd051aa39974fcc0a478ac7466e0729848b5e6c9e86bc8ad85be985b395e3b28ad89f71e3b584d857bcce915a47a2fdaab586b7916d9a87a66f35db0c683b9bbd601dde6b2e8e54464043faee882bb906d9e7cd4449fdd5acadf5b017983c87b4a8b0fc9ded8aee2e7ba35934d00abd6701b5cb29fa3b935d715eb3ebd8784dd1e9ed26764f32b9a49f934c8c06ec4d4a8f3608ee3ee33023959427d889e4a3c797df84a10bd995184ba445e035bdf80f34af12add4eabd6fb1e690500afeb039a9abc6ab00484b9a2694990e97b69b9730eadb8455bf592bfeb4f9cef38ad6e8ded7bd56c3f7bbe0ebdbc60de87bdc9cf2f63cfe4db973140c5fff95631849f64aabac5dd4873e44b8b207e16c083dfff8b64043f2f467a91f5fcdd369f9364da45134b97a39aefc6f52c9d9f8addbf31ebcdd7914f2a9e3bda366762e35e4758badb3bfe14a9ac924553d43ed5d3769350e4ca047e4f19f1b6fa953b60cc67b07b7edda85649b0dd86ec5c55ef46e73bbd6613a84b35ffc1cfd39564a6873a93860be8c4ac9fca8aeb205e8ad587f8ccbbedb13268ca519c2a0da39be15918bd7f4f786de826ab9d47cc2899e8b60aa87e037a60809b23066fce19ced76bc457107c8c08d574a2cbd0f945c59d4371bfe4737983fc089a426deae74993451055ec21435a91e4060baa6d774bb6cb8feffcea40efe87712ee63108a2b30e901369d0a98a3372afd88d8c66e9e774b02c6d568e9dafd9bf3ca886d49e65d1c4cf2abeabd7be85dee9671eb941ac598e1c0f40d92ca7c0bee9cdae5a643ac29c3dafeddba1acacca8b83a1242dfff21bebb94ccc16fbaefaea4fbaa36f3d46b7f67d6a7e06df051f5229add26137ec9bceeb04a7eca63e5e6f3c9eac795687da91eec532476bc66b2ba7a575deeffee9ea13c91bd94b19d3efdbe8d843df5dbff62f928550b106e93ab64443e6b0d9653c5389e58af74a6436ce3b1e50eb3e367aacc7559cf01124573235a5997773064a621869707ac661a39f38421c9ce88cc38e733c755394446e3d8e8ec60db7de46035b343577a176de08a67849558901d539ed84cadaecce4da36c4b9940e116d11b97fd1b9748cb08c2e3db4880638767bb67c753e1021b6c46698a21aba391c65b9abbf38d93a4bb8dbe911c3ba93e9bc866cac3e67fef1eb773ebbbb86398928d9d565f58dc9445fce8e5af355ce2cb38552c5be069b6c8ddba83f849601f30f50bb57a8c4d82ea89136d8cef0ca6cff4d8052b736d9c6fbdafca08e76301de50dba480815fec5a7be3f74b8f705b4eccf9c1a336a0e7a47263e3db5d1675df5afabec7522868ba4d6e39a9effc246d8c40a8bb5e8c65661b94e008ba442b9dd9883e8963d29d7c4e7b56f0698db48214a84cfadb3466df2905475604f8d195f41d946efbead4956a3972f974bf2dbe2033e4d9c58dfa3543acf894d65b6f22047032f4d8636440024452f7cfcbb5d6987319d7c337e774da95b0a4f1e499b17f77dcaf8585e243d3954dfaad5fb0c2dfb2ad16656cb79258be43f555757b989c79a49730354e42299f29ae66edefa03e1a6dea08b01ba3f3d9958d9f4fdf3055c95016f5b83ebef77c3f300bfa60974815243f7edba28b64a58bf5afebd76b53675dbfb6fb05b89f85f945c00b3de4f8ad2517e21bbbea872f4a9db9afe9cf65142e9cccabe9166f68d169d97ad048f7fc245fcb93edce592a8d415d4a38502632973ed98b6f97f986dbff7e +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: a7a31e140891ea37d2b6424b59b1f84f89220f32dcb73e037eb912b389d34a48 +public_key = 98c5377fa74b86746685bdfb2cc869495f594c6fcc0dec3c240c49b1cba8236bfb732dcca57aa380ca7f6ff96688c7d29aada52e34805aead14473fcec7d4b0f08a3ad9c78dea9a9f1f556bb93dcb0345abaff50344faee2944879bcd103caa1d0be93216fa04cf473ff47fd72e5d0574660435b756a99635aa6f6fafd85faa880f8c332f674a76bcde96a43f6b0e88ac19547b6e8a4cce3a3a60a9590e5f4e625d1a51f62cc67a3cf036e08e947e11c33d34895a2d4b7ed348ea93f9f8e8775453a65ec34fddc6b33e6374ace4d64cd8c765bc3d7965dc05f0d54dd1eb4032b33c4e937173daff59986b95b7c72a4d2d61c7ca3bccbadba94ecc5e51bd6d330379e24eb3fc36358cb83c55f18789c37c541e93b3b88ed439d4eda1daba5f6a4168336dc45eaee66761dde7617ebf962547d770af48bd4e5a6f441c005e0c2cc88dcd7d49fc58c3bf3a3091458288d87ac8e569c6d7c66c6b6e4f677b5edc3b4188dc3d3741ecb585ca68a73ddb18f18739f0e94449aeda0d436f2b7efd19fe8283c416a0a580588932fab5904cf89bce9a1b543f8c70bb94376dce98773ad14a51783486268c2718d8cdd07e4170d68cc8c8682cae1d5bfea3408b1826f5bca3349162f949fe6a3ae7aff0476e9115ad318fc69a3d58bc048c45ed4ac3b7edad198762abfbd673ddbc0e7b084beb26cdad0f576a2d2b8ad3d6fe2d956a5ee0985cd5df3e9a99031f3a903934f2fcf4e2ca46f07af6efc3ae9fd38f36f9d97420337dde6ebc2b7c15fe9949acc7c27a7d8a7365ca87b72b635aea5d67541853530f66be8eae7318e5852cb3c630f4be60f88c7bbd8a4afc4433d7667c8bdcbd940c0a6b91fee657be599f147f2f2efe849de89b8b389741a5ec86560f1b862eb6366975355829d516964c610696e9b24a956dd7bf388ca0cc4bd096eb388e5a9f1c78014da35ca594f9f1b766494b7ab4377eaf6ebfd8cbb5e775a4f6f7e2dd8dc181f8bb5d3e4bf2e7033668c29198ce8cbf7bebc79b1b4c5fe8e578ec3f709ac6badc3cfb7d4e4584bc3a38ba2ca1c9eeca55db9ccf9589eba22ab54faeffcadbc83efb58e2445e7abd4a93b1ebd083950ed7e536bc49b39c53d17b8a302ae7ec0c9d188d8d0cf34d0312b76fd85a26567d22909866f5591ec9de7440364868c45a09d39ff053e6f8f9ac74bfaec8ec9dfa78703c7af8efc6ee88c929183351f85fa47f6d8638c70170f6a032cf89b936e06f46889f8f7a2edc99ec431c763ae80f7fb8e8cb87c3b7b74159596a9cc5a6c67253738e6889f5259a0ec87555e975ee50c82cd4442828f827faa7b82adabce0d9a05685813f3d00fa6f3e1c4536443811ca8e48fab9c8a5ee63a57b8c7377d55a994d6ca310ad5801205f094bcc9fae366a069eadb9a7a78e78479eed76d65c8f029867d69be153cc7f7b7c3f7f6b5f193fbea256f3f9b7f1165978eca35739ee5a115500677c1bd33ffe07e45ed07810ea4651985a3ad7b5edb37bc21e33115d4c8c8c5d9441978093ec65b88a7d934bef0b9a52cb4f99adb84a6e9d53eb4999b9fc92b353d9823896d3759c3daa69879782795d17747c102e7afc0a330ae96bc2e7a4e6c4b5a638bfd85ebafc4e6c4cc676f79ef9e6eb5b8a4bb942a797d78cc708ad3cd2f14f17f18bb3677318d3a917db68959acd09d3897d95b586e899e5865f53cf54974ec4f6fe8be5a4c6804c99dbcd7c3e84d7fa99b90a5586e9f28daa559a81978adba7b770a4c601a8dad940ccd42eb70020f54848b8c4a2886a1d835abcb9097253e2fc8e74265f5cbd37c1b8b3a2ef47e8a25e47a6a441be37e7b2579e5f74641c4731ccbaee48bef5bd744a25f84249e79a70a70bc9fe7b147ef929bf75e14c83554788687ace37788842ec87eb5403cf3c93cd4c9e40fb63533591d96af9aa5c47353c0327ecaef1e8bd868a6fe29575f5881c5a5bc7f67a2dd5457efe7e329473364e5d9b039e4d543843cc3b36f2e3e27facd6f0369f165adcbc3e4f9c4c8930564b9f5aaf21c82870d35e907fadfe3d584b8cd6735aaff08eafadf44cf8bcf9fce57719d3a3cfbbfaa385cba6d692923b88374e00ff67a2dca711557d0e0594dfd66ae557ccc6ff3651abff52adba2998eb7de1f83d3c6f1b40acdb3ccf2faf5ec5a64488a3993ab8fdefb1682784edd39f0fd80883fa378cde6eff656f57119177c56a9 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 70eb3f791faa91f1f982fa477dbcddeb2c55691c07f93b04cd31b37544c94b42 +public_key = e5ccd0953fc97a66bea67e33e04ecd6e6d95a79e92226c8a1c7ad416ece3bcd39cee2867eaaee02ab5c7ee37ab23d33e113b3e7766b7c75fcd10ed3fdcf38653149139b532ac46b7e91ff9c2576c44834080b75d9f2490d7aaf3e6d6cba707458d9dc7bb758e3d7d49d5868b33efc5054eb280cbefe85f892428e051a9b35c6ac779645e6554b5dfcfe959754f3a47454837b95138f0d057f2a884b10f0eb5acfcd5aedcfa788d91bdab81f019eed67a7c7d16f085866df2173496afd6743f57294a4c82b7f95a73963824eaa49fec764891fdbb64dbc6aebb67a8c82caf8607f58afbbce566d55405ada63ac9f74f3de12447d89746fea494662a69a12e73369fa0fee8f749e73d4c2c9d192c994a535f1277d0a6c4cee988945353c9eaeff40828bb674bc9902fa298fb6750da5ee76345ee2bfdfebde863efe16e76d7d4cf51ade46ef82974ecdfa1460f684ceecc3eea46cf4cfb3c5ce4178a79fb495a44275cfbdb5a23ac7b8baeed7fefac077fb997cca5d454fa5e8dbe03ce49c0c333cafad090937df91491f4ed3ca3f8c85367d01e5bdc1c9a73be64abbd7c68786e79d4696fa138834325715f1e5584c368b82dac8eaa45ab4e76e996d200cb56c51e43985a6bae63aa16733464acb2cc948a94a5f8bf6a91156a3a6bfb55bcee980d4995448fdcfd435289c880ae1da4ea9dcfa2548f17bab1fb3ea45eec41371e98da05e023af71c8feacb707d563b9b4c82b71228644b45fe326bd9de2946b829b31e57bdc967f7c762b5b5d078c1bb46ff2596b4db6863987c69b36f25bb9595e7efa5a464d84b6bc7767d1fa5559d5c8cb55bb30e2e3bad64fe25ce9c790774dafacb19f4c9dea8abb26bf6a6c6a51e38fd5b1efd31938a9f28ddd354cf997e935462be21149a16f8ae33af9a103b34e2e3e80516a5421243769eabc81a5fa407486e32ee238d99bef9d554d3faa12e774ddabe7a5d98cd79df9f1bc8671b9d1569ecfee86bfb98efa5948b9455caa51074db387ef89e746965f4fe13daecf998b6eeb301d865f67b9bf4718476026ab326ec77f677fe77a301f357caefac5e579bbd0b34b51b8b58ec7ec44d5fdc669b9341670bb653ca373d96d79e680c95a0086601448c61915d486b6c244eacaa0198f77d987c5083854bdb9b563ea717ae0e85e7484a36e38e465e4c855165bf091c8a23e6bff2215f4285c739d8b519f55ab1d6c4505ca6a00f6cb6eeda16e1355c1c8824ea571611b8a3925c4fc64a5de44a2a1cbe89d48aafe0ae4acf5f290b6e5b5b4339018e81e4f8f3d43f67dce35a2649eb113c02353f133adb93cfd8203c4def0e6465c1ba8a1fa517c37c3d363b80d25c70248c5211dcd995a866d9dd4ecaeae03e56e4783453f5f609d6c84264c836857a24f2955fa955041a44c6157bd2f6f71240be12fafbf88beac628a3940ed9968e7d7c1ff7105b491e19c34dcdcf07367ae309cc1a1fdcb017f781c63642823623c2f39335a73db76bd449b401cf5636114a22863b50ef3fbd58d4007fe3dd66b44058b43bea6de9a3a5adc3437299bd5c7c3e4d3fb9d4d8df0b64b648807db749eed934bc0a81677d1664bb497949b757b03ed74e76c8a2e65410158973f3da2a9b6b035cdbaab2fcd62b4f1bc25c7bfda61d0578c1436b80864dcbc6d8cfcb78c8af6a43188bc26f637ab479a1ce86242766d9daaccd94ce3d1885c7c994acb657fab0a75de27d37f6370770fda966d79963de82c8f65f9ea8440ba9e08bd84f0afa6cb244d7ebea39c2df97eda34bdd8fbcb7afee97ebf14cecb8ef6d2c0b3818335895e754ebe75476fee786d4ccb52d7e64c33a76a3b3e2b57b170c34d37295d23ef351cffea95b649553fa1a5e8489edabe9c7ea4459a4ea08b8dd65c4fbeb66a5058cfe87d6d8e09381979b60833dc753d879bbbc30b6e50af273cc4e5fc5f1c43e723a03663dedefdcbbfb6ba092bd862fec75163dce52c947743a59595c15f5f9104a892e089b912975c7c598b1df5f8983b5a66a7a66c459610f63e95a7b1198b4e438edd69ea7a8fc3880c0876db8fce872952120a666aaccd5c2dd1b6b998787ed071249db59ee17cd69f6a35fccbfea64b45c84d3dd4eea971ade4659e45d8e7c6f3fd9658f1ac8789297a8dfb3de7b385d927b522126a05aaf40635372f59af9ed4e64cd55048057d8b30c04fe6c876b8a67009 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 30f4095015ba88b6d969672ca3f438c395dacf7d476ea7a9e805ce932d270a13 +public_key = 5e8ca56e95a1b854e47d7de1ea3d57b8d35b6e6d52ca045cc1d8444c1b60400fe2fc67653a03cf7d3930384fd6d4ac620917e2be287eb74d4843c5c1209bdb994cd28a445be50550e2b5625f4ef4bc58b256fbd886e74ec8fdc4d18fa143139222c8d037c6e64aeeb4f3079c401fcd984f486de788ac1a987c158f5e3df9684faf5953617a66d8b5b965ce1cc261139656ad9936f555ad8882f3d7b823d4d0fc7d56acdd5bc4dce8646e41a4fdc0688b5cc04455b768be41096eb767631508d9953c8aa95656e4686c89078e3639dfb1cde697c56e42adbdb7c9c6c6ab8f50eaadae889fbaeda41d757ec6756bb6e690819b95be0f386398817e1c9ad7db807a94fe760e7f5bc6b46fa6cd168d993d1f38aa197931c9b55d333e9544f0ded9e6ddcddb657b5c6fb538468a855e93df1afb9eb366d98f2ff26a8ad7199e9dfee4ce6e2752128d4079bca97f39e35589daeff36f7baa99c79ca6a40bea7943e4954d7b33cc6fef3663fb0e8e28d76e49fbeb5fb8f8fd7aa27009e8e143a9a7938bdaad5d9e483a2d87f5061a88588c3df6935ed6d4e1a149c635dd376decc87d2988954671c8f9f4a05e7ea3d939af8a71d505a628958c645ff1f11ba962aaab9fd9e565fb647973633a4946976b3791a9e05eaa8e882ea12ef43326fd8fe7ee73bbdff43ef74f92074d7ea6e24e7db3327839806876a6d6b9832e9bbce5499bc56df2b45af9cb67e3eb878e0fb881a5ce9ec55b998d8c49afc963d885500e72083c9bd2f55b15f6ac7ae7e56af33fed0a5b6b668d654b602cbc3e3f9b81b3eb3c476b5bab8b6c8875f8ae4699e3768b51cc7f48ea9304d77cc8b7d8ed08321ea7f28ecb97aec4ba224baf4e684fd06f753985c8ea07c8706de43304dd21f6903cd8e66a7332c0b6a8aadef1c41c356914e3e99aea0fc672fb1cad48d740459eef5c7363d8bd3fb0efa6a3634d850cb4fc5d5547c7fdab8edbabf7e65c5dba090338f71ded8754d41b5b3db9ecfbf06dc5b749f8889975f51548ac7fb4b88a85ccef45792de15baef1f72a3d8dd6bd0c1bf477bfbb9e69a7e613a83e9fd670596353944a27ae6115fca33d5d5a4dbc5c1136ae3aa8eda2dea4b3cf5ca0d5474916675ec8817a969e799ef414053a4e0f45d97ee9e117fc8dca8c211b9bf3d9efee45df2a0a392d5de7c67d5656ff6657d5d90216f7024dbb947e8c389e8b4ce79918a935626eb00f09a43afaf59ff94d0dbc95a6b83eda63f6397750c68cc6b498ce984f35484aa453334e05d8f32dba3dd2ae82ba4543b4a944a63fdc46d56813fef5c06bba360ba7759cca25aecc03be3ee9fb75ce8459df3c601db3ead65fc153f789906ae05929a223f3e0203f431f346bcec3a129bda3c3e4f90d37db34e643e17bb5d53b6d248455502c71eeede655edf8525576e45ffbdf69571eace0cf3c3c312f7c8aefce0d6f911f6de4b79bdcdabab060579ebf1a517414bbe5343bf343e1c0bbef659b3d317f7184fceaa9fec3a3db45fcffe5aca961fcd8ce994f9d381995280ca0e5e78cde55442518476e0b404a26684257e9abf7ed64083ff8b63f285396f5989dd4aa93334f6eece567d8098952ee41ec43747c17cd9b28d5f9245e0819ae416c61f3d6d818ea448d397211e8b97e755495fd403a133abddd882ac9d7e56ae30528a5ac535ade736082decabe6f980355cf85f84559ea36d6d385513dc341babcf66af0c9bb67ed59d1f9bf617c7b9c8466976da39c689dd03c7ea74f7ae6349d82e6b6f458835d31feb3214ebf9fefec65ec59dc3d44dbed654e743a5e65836a4b9c5d2c9c4de859b1a6755ae7860fb6d53df7eaca0a61cdaa34eea773867a7ce66654391fe9c7b756d117a81e2cef81156c6d5cccfbebf85c93e317e5cfb8fc50b673600bb46469bb3c7d6d72d87cc3b17bbb65b95e81875548b63e3024a24b3f9a4cbe404ff862f01dbcbe6a997c847650b5402b888e0e7ec900d4a4a4cc429e7e7d396da6615869f744f44a1bf5cd463372be89a243733469bb5dd97cb3e856ceffae64fcb519d9be1a75aa879454305ebd67878e9a1b8f6e7da651bd5b6b6d9ca9f477589f64b137f30966a289295719158b63a3ea3c0cb764e4847c9ac8bc9e598c9d5a651ad123c7c0fb939f7e3943a2f3bafb2da221f37dc17933cf5e868b958e4e7cea4cfd021ef0ba63ff7a7250d21513171d5e +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: cf31220f44de862e1719570e1b26e897790159366a385452334fe24cdcae28ba +public_key = dffb649aca864d3fb4f18fab455c94e6fac7ac1c6c46943e0d4b811e48a80f18a2223d589937a1f4f4d97dfb8c344faab556484877d1ec3c36ed167dad4f7c7dd54a6ef844468a481595b9348dea2db33235439d702967ac1b77f47391e78dd596e5fb534b6ef33357322ca6f1c6a6918bed8d9cc7f94df8438ce25a1fb4e8d33db1eddb6d47545204eb5088a9e6de69d1faa565cff0c3aba1d7cf7a5b87aef7f4afb75442c0565cb78c7b81144aa4dfd9f9b8d8d53e32c753992944d0f07d551c6ef92bb5d1fc6e39991eea3515304678718368de485bbf5c8ebb9fc690edddcb7449615a1bd134f559b7fed62eafd9cb6faa10279e2c7475e48837e71afddecc66d1ba5dac35760a5a5de07641376e8b795e6a0d8eec3c4440c20de27e6e7cd64b55482c952e86e7176443c90fc8057de2e9b774d14efa68c49c85a44d430984ed6ed2133e6d43ecc3d6fbcf9736cd3f8efd0e4de1b655e07b2fb9d805ef8dbc30eba66e996f447398dc3378b8bf933d6577cc32ede05e19565f848290059604f9b71b755e123b74020fd5367ef0c769cccc3be661ed3e688a75fb47dca4088b46d955cb24b7073c8540ecb2a537a66a8d332d06f296d8c6e5584b7ba8a4c8739eac585a812aabb33a5f591b428f5dc72924e5012467d4abf32989c3482ed09816f4968da557048dd3ecdd2d6599cd556ac325a5c00b8821fdc9dfd3336bfa5f61d6baa6ef6b848b39cb0fcc543cedbf9dad8d355cec4c9f3548868f9d52618c86fc7f9998cb4cd71dc8fbd8642a7fee35eeec4943402c2598b80aa98f395a86ae80ae5df5882eede30cbb42edc5f6044219d6a24396dfa8da94f2fb878c96f5b8f8f4383eaaf5c5e1fe7b3c34ac3fafc68df6d4be5647f7f705ad41245fdf8d48d184337e76faeb95e35d09fe4c1a3b37fec984079d50248f895f3483cac2dfe959162a793547d8d09b399e6534aa88aa5bb3cf3eb59eec6a5c8309c6980bb2e478ebc47b7dc2939ffd5439ec4473616e66db1d53e9467c5085471259db583ac02a657c629ef336b47a5e39e2cbfb4a1acc849a2ee6b9dbe498fe99ac4eb98bb54344de88ae54a269c89c36b6ebe71898006bb9ec63ed6006325a47a1399549304e49889dbdae9a9e42cdcef6fc78f9fdf7380cae58cf372308a1b1cf321f8ba17867a1358c5c13095618cfb276aa3c0b36588a9c62694ed4db5c94643c69c143ddb1fa9a67ded7c62567f289841a0d8b9465355a05e2afd9f3415c545ea44f15e7b98edd9ec0d79da5893125e6e25aca7adf78a3309e8af2b4ecc6377c04b6f7fcbf8ad5bb65bdbe6e403f622f45b5600cc367348379894c65f494f79948e7ee941d1dafc4dcd0ed97ee529c8573b36debc7c80364b01ea874f355f71517b6c399a6277b80c0cea9996a3749adbbba6af4abf84d6b7e46963dfab7779637f85775cf7a51446e72fcb59ee684873ba60315a84988b5936674833a93f07bf83c6cc1edaebbc37ad2c8197481cf4e18ef316eeb58b81a3f5a063b1dc4b20239818c8aa67fd96cf6ab52017979be8f431c96f838aeb797dd744a27559e748db8da63676369795ba92d48bb11f9bfa5393c5234d3b6379b0d2c82bfbe7ef29b37fbebb387aa695d54c241e5efc3d5bc7f93e6111df1fe8d5d76b6d1862473ae3996b294dec274bfc37bbf5119668eddbb0f9d9fc3af8f3b3c469aabf79bc4810c14db7088ef3d67c584a965a94ac1bc088cd2c6ec5403d2f5dbb8302edc20e5ea6c98fcfd4cfad1e6311ff4d41eb6cefd7681e75a72d8bdcf3984f394e33328374e5ee5b0fb4bde2d7d936588ded329ee570d8280188baba9c745fa5a8958c0ef28c1fb74ee4fce3dd784d4ddbd31ff3b670b2d92edf8489018e8c81d4b3e457d4189cac818fb55c55574dfd21fe3fe4b43eeb525d92843c324cdf228737b2c99e5bfbf718d63b8021cfb3a957fa60f9638846abcda5c3c0cb2aef55d05c38cdc1755328735901ba53d685b93abe68b9cc55badae05fcb88164d0a9dc36a59aef509db3edb3d60a44907524e3dace453ec8cb64dbb679fc69073c9e839c40e8ba4cac48e24c36975294d4bcc6435cacf1a5b89cd065e6686b4df7da8ed3bbbb9afc428a94fa90ccd96678d4988c7386b794b57de05fd5d35dd3d18dd494d52eae46f978b305738d5f40faa6dd68ee73df57c41f89935528e64270c9759d496204 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: bb5e65669a44e5d5c709bafa98c16ccba6ac2c4ae923334f69a11543eda64f5d +public_key = 1f5fd5e8fa992213c49059a409aaa3ad7fb85837cddde4c4ad4fa9a35ac7fc8dad2d9ceeaf8de9277bef3f3a67627dfa01d99d4d15dc2399f427e6f67e0ada2b587a5d2376012cb7566f7b9e63a2a04432260aa1acbf698ebb60767fdff12bd1e5dd49de698966fb49bdfab73675586583c744b5bafbe9692b6c6c1448899ac7fa892eb52b4bc062aedfcd7dbeae04f5afeca7d3737f4c7c6711b38deb9e9e1a13c7826dc1c75fa8131dc010c48909be3102bd4334e6534bad986fddea86c3dd41cba67e573ab7bdcc1a2c973d0d41bd26721c5d8a667bc28f1ed265b762a233e28e19feb61fbb9e6e50af68405825e4481fe2d0e5c1f4696e45bbe02b9ea0848497e8a7a52f0fdd85e7d67e7aef9aeec0de84473b735bfc1dee860c31950f9d5a06484a2dbb0e47e114bbff3bd775248a944adfc19df5d23876931efdddfe6d9c95c98c133bcbeec5fc107e3a19176dc90b5143a6876ab45b807e7865d4b8f0b8a2e6a45f123b85c8fb584cd3c042676ead069cfacf3682aaa05d2de0e22f473907547d79b0f8c6e1810e4b1b3a56b88b3b4fd97eeccfeeaab37883889a37676c6116ed41c4db49dc5e68f64ed979bbd3da4a7824b330cdbab9985a9435efcb84dbd3ced3fadfec25cbd55043c89563ee69be7a3c03ea0683969e6f99c95db7d11a6b7a183b4b3a3daccc41d44fef5c0880362dfab69bf938975ff28d890163e35e284155f971cb6f4c1afe5ae4b3d2402dcda6e4d4406c39cc26ac4efe665a4ce9107a99bb289177ad9e4a8ce97bb7fd623e980264a907c6d5c2ee791305974d49b604d8ea9c95d1edddcdd32a5f94dc3f6458e1653f3736435d1043b0a0deba63ab6956f4f16ce47f719bc10f1cfb293dc17886965188534205c3f98e8369aa638d69d2ceecf8b56c9723aa4eee8485152af70d4ced9644d4bc265b912c6e52099df9ea72910674bbb8493f77d620645fba16c0e6c73ffb2da99d6378433c6c55bbf0f0b4dc74ba37ddda39d2ba4d7f34c705b4e17d6e8ad924d8ba3bcce9fa9901df6510ced9ff3ff1f006f29d2f6b74e7968f5aa0b3e3575ced51447beb76b8a7785a43c824c73688ce495681ff7f3d98bf49e5a65a961abd0e6e527d5be8028bd0dfa49f4e2e3253f8dff2a556c48ace2b6a5122c4fc2d15622e158e2613b23f6fc6398838ab9fecb05a44258e7f109f91f4ccbe657894117db22b9c36bbe89ecae3e8e435e451b8d202b7de1c2f748558d9e87d677ab76c9e9c5cf4e8621e4338a289e69ab46a6e5344ca49eb80fbe2f9b8a5831d5380384f2fe845b7298e538d398a3ee498c4f537b8b1ce2fa59085bc00a4ef190a66fe77a1a6745e8bfd976285ec63656a2679fbf197ddf08cb861abba73c5dac7bd3f880844a2c6811a13eeb51f501c89f01e686ae528c84b86d6abcd9bc52f65e77b56fde93022b7e374693f9ff57880ad855c79321d147831daf8e798ddfe2ce5c66bbccdb93c0f8ee3a5eb9b97285ae97e7bb88cef072cf84d0d89fbb5a7b62fe770a5dd255aabfcf54f1c18c8dabfbc4baf53d5ba49bd2944a8c440d01343f087df690743dda5ff4f6692a60bc3360588f9575636748e3e4fe050d4fc11d75b69e3e6cac6fc681ab48f1880a9d787449440d2fecfa0386614cfb3d25494e8ce7d3e5bef5a5780aafd88f00a9d6a79c6b1ccde1e6defdb398422ae9e316489c02ed5d9f79c74433c82b87a775ca358965e8c1f48134a9417acf0022ef1b0fd4b9523df2fbfda0dfbfd3ad8a0f6086481e8f97b1d37470f661ded31baade2be53c7021db53d28966e9dd9ce6857f788d06b3d4fb50f769065c04d25b2f3baebae18a692d7552bc9805897c9b65a930cbeec6f3487811f84d85579aa1f664128d75c7f37e76e83c675e0212e88dc8abc1aba9525ed450b8af9b4d6b5076769b7f4e9fa4a635226e9d1f76cf0dda7de67c7f559e725dd63a13bc27cefde9d486fd5158d3b8cd4a97b95bb06895216d58fa4d50dd8c262eb70a73746cf2793511f5807d5fae9af9db753d99f259c9748318f49ee524c9d8b46932157c94b8e79e02897f44ff6ef1964f4cc92c83f3df35a7700daa1028dd82f0664e4b8a221eadb5da84f43b79584194aa9ce8724a645286d365d3e6c1f46f1291ea8e1936578653879bf372fe58505e7957a3e0e0f1ac0d822a80287d204eb6a446a74afae0ccd1859a2544aedfd +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 9ddb3aa9c7905d1a438c93bcf78e3e321813580371ab4e1289e2dbf3701972c2 +public_key = ebcf871f16b153dd8e75ef8a250999db0a6db7036712af43715deab844cd3acef4b8e4fe8a15b2bdc85fe4ceec9caa30ee666f260ab0f1ef30a6ade229b9744474f8aaef4680a884209afdfd3899ff1a4920b798ab275d5b1db01503d001cf3db72ccbb3b9eab0186fa795dde3055e463e439bfa9cdce3ac898d66d17469dded7f77dd397bd46a5acf9a4a776c8b83e0032ef8dd248beed9f96c7c5e96de3aaf2e303127778b653131babc17494f0aa63c1836d1313e5bcca7a8c96fee7b9c9545def60cefd1ef23974957a6a4d3658d96a7fd4cb7daebb11e5acec226d42cac64af05c8a7db570cfbd9393c7a24f5ae315f80b2dffb9d68b02a0c521dd6393d2dcb3eb798db457ccbd869748aa2cdc8336a68e62e56528c3ac7a7bb41e2ebea35257b6145f47c88d2024ca259fd3de2ea93e2f6c42e539618df7fc635e0eb0e6deaf787a2b3b930165ff1fc8e214e3b90ebc82768eb74988938bde8f71fac409851459df1288ec4eb1f8680448b58a5a296b35020c6668acc7a39ec329f3c5eb00c44f43c9dde7efc097dd31669c912edb4d6efdf45fceb6c5b6be399c2bde785768fe5be86e7aa6a57eb6b797c8c5cf784f74b2463d0c85e1343554cad52fd9b36da139e14ed4ff194f7b428f82a564242a8f5d15636da6c45834375d543714f8d530deaae0c0d6488eca46974642c93d7ab5f97d356e9dc39863f27618abfdb75673744fb93452da1395d6fb05bdeb3fff109ce923784523e767dc70ca546fb820eed7bb9663333f6f3899f79bc596b2f559f5699c272d3d4070fa0ea98c879dfaf1d7aa697aa83f1ece0e65de7e2e586b32d804588473c4b9d05aaae6ff9c039eddf953547ec748e62ba34271dec3f669941596c6184b353d3919e69edf898831fceeaaedbc49b88c8187cc13eb79eb09c7e07545be614ea9cdda70519b17b5479aef79d105b83d75cd8c719843a94bd1f76baf7e3bbd6795e0593d184c53f4216ef4b7bd322ef561b4c474865a0c825c9709f69e12742771c4c9c2db9380540773af4b44cfab315eb88ec4760f794c17aaa55199e39eaab54c53af03fbfd339c8256de972eb5ed2999090fdab3ebde4610ed7919b450c0dd778967e46ce8532eee2b58e918fc7d23e0ae717da59ff49eb85bd3ac199a1ac4ef08c9e8778afc8aa7d6cc8359d09e4a817386ce09757c44350d10c4ee00f625fdd6dd3ebd7514639f688f8c5077f0ec7f2f39587830c506c4bbb4bdc60a2bf56bb157ed487de614fe1d518e65edccdb2d6cf38fd39588e76033cf158eb3c9d48921cb387349f67bc7f8eccf97bf323d9d096e1ba1f71ec698d8a2dca3bf334fd8765b027d6097f6a632da3edce40240dfba403e547cffda93597e4a46d451cada3965ef2148a843ff1c4d8a7d22e57d9b3bc69fac8627bfdd1c44aea37fcc31f5dc79a4f90b56ea85e44037a4f016dc33c5b6eca45721433e0ce956fd603ee23c6c9f623505746fb885ad14fb5867b3ce9771f7a5a287ee47eb7430caec5d35b63789b32de76d2553f82c8407f585c336eee3f0cba0bb6d53788dedc6ca22d24f2ec8c3357fbf03ee68c90ae35b0bcf837fdf7ff3e61769c6838e98cd449c14fffb07afc714d0dfe91d387a27472217c9ea6bc5cd1249bba38842dfeb2880ea6074ccfb83e6dcf345acd84660e0f38114dcbe91d9c5e4f3921b84772aecbaa8ec5fb08c5de08ae6cdb38fd5b9489357df11565d48a7797a6af82553225d73cebb362acbece335358c6776d9fbba731883ae7cc517e1ada3bb5b970e4cda95a98aba47d9e2397abd7757218c5d7bc4ca59b70be5aa4d7c6fafb64d48f0bdd659e9afb746120b383958b715e2ede5e6ba666a4d328ab45100af6e9b43537e566ef86dd2cd5fb07e5bc089b8eaaee66c513bacbccc332f36d6afc379e1a838bcf4ea36ce2617f6d029651088996631c55e846adcf36c793dfe0124fdb2287973a87dd2636470c18db2893a09bcc87063d6c5b364837b7cc89a9ad1fd9c1edcca9a0b4b81846c8e088b36fe361549d60cc08c911d9d58bcbd839183b0c5930227e826dfc7b70bec623dba3f0f9b30768346a87e4481b741cddbb7cb3fed74ad0a7ae874d8b7369f695efe75e01fd3be6cac14778e5ad889c69ec6bf7fb38cea6d9c174b902c6d47ead37da33285d1009b83c39ff67773cc46f7b4b2cee35e8e95100c31dc59eb9 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 26d90b190a6c3d0d9a86cf66005154e7086749e966e7187c249ccb9329fd3b8b +public_key = f8ca36bde8ee5969c6e2f8a58829a9b7697b6b36983e896e82c4d73884dfa2e6b6586e6b0b4cc0b16cf292eb5b4265df812673194b944b93d051f4f0677dbce9734f5333fb408a6cbe7542712352c453cac39741b5b940151580482b4753de6f59aec091ced1cf985034299841ae86a116ee59eaa300b66fec19a3abac920a2ae2e1f4d70aa378949f30686e4f9e53c0d859917626c6d6658a0324419d1bdd16a647ed57c3cee638400875cb0436672adc9f57feedf4f3125a95c86c60d34dec8576d807f43f362d87179d5ab4153b661dc129ed38920a3a13e957e3ffd9afb46c7e0c9e92fabbb90d63b94cda964beaa2d49f48174f86c761d933f59fed4c65f4b85edee0cb04ad4e26c36978fe213ac41158f4a526b2e7bfe705174110b538e366fbd93cb251a6fe7188fd89e562482a5194a7d7ac8337b796f7d489b1947dd636fc44c44898b2dc7c8743ff3dd9c7579a68e1dde2110cea57c43d781473fd3bb17dee4456f6fd94cf36bd9656f5ea8088339668658ed8dcee90aad26fb76f0ec747d5a570ab88aeb44750711cdd10ac86caf73f8f2f38b7f5eda98ff317973bd544834fb3e571f48744b6a7cac95e1d3375959d38588cb1d5e5d4776f9432ca9e43076bd36db1a6a3472cefcd790e77c485db418dc09d9fdbfafece2de695478ba26b2e6ba3bd32cb87f97715e4f727d0864ab0e388dcf94cb7e94c88dd673dd03b8690ac65b9edc597fa80992eed36ea9fc5be66d9e6bd4935993dbc8f21acb9f54af0ef1e8a721541425a31705a5d67b6e96d9ea96dfcfb2b48536f1e8afbd5c8fe46455afbf82a7a6e73b734001b6d3a997ff1e5dac7d3c97eeb4339fe3f8ebcd5cb0b6f806d908c1beed89682192a6ca384c7dfefe70674c353d9aeb8696648cb83ac986dff669e23f49c47f9f08df49188dee55cbec877eef42098bb7a5e454e677c6714fdceefaf77f8d90935b5bada59c435fc6889b16765a033d98453ff56338edca5553559d76359ce62c71ceb5624abc19db59a6dc65889351529bdae34e7085ea45a566ad858444f06edfec7d03b08605f4bf558577f0f1fb31a447d387f94e7f4d60fdefa5ecbb9770bb8717f40c1237b08c744e80d57d0e68e2fdaeccfdf7a1997389bdaada38ed5507fb84a3f9e9a33f1afbd3a940c44239844ea4e81b627876838671bdb3e9c4d61fedc74741b4b5e9c4b431e67c05fdcc8077c5c0df821076c1c5462d86f4f845daf75d5deb7267a96359004166c84145e72b731d5b8fd43469c99cdda0c2352b88d6313d6dc04dc5f5c8b39d50376a956ef2a8773fe06973e95fa050f5ba669ff632bcfc3fadae67fa50023c684a4a7a0db573bde494458990938c624e5928d0f8ec48a9a2659f42088e072de3a85a332dbd8abb803e9a31596a38c7efefcf8bcceaa38198aa66ca68e9eecf68ddd9e093e34f38d0cc74a989459ab1bf00a8caaf6e4dab5e5cd652cd5fcf68e15aeae602560187ae0aa55f3292e8e41c49b7f5e54c77d99ec89de88ab641bed3dd6acb82c33a6d4034a7765e5c52859bfe354b2e881c7c577bd5663b1abe24948739bf9daddb36349aef710dce2102553765c58061fb22ea35141ea4ffe78e045497fca77ad2e35c1a5c3ebafcfa8279c783d38f41d9f30416d7d38463a9c6e5be08ab87acc5e31b84ed8376d7503eeda47c86908fde25df2acc6c70429ba854b58ea4f635b2ff0934dbae3137ec8b4de716655a0b8fbd13dd3f214f8d168d6594435de6c39b756f98aa9a693577783d7e154cb31b7c3e283f46734de99af6f7ddb7947c4f4aaf127f858a97ef624df56477b8055d53639639aae4a984caea756b1b6cd9ed1f43c4e1754f40ad0bfc8c5f153346f1ee3930a3c9befe5f11c4ece2875c425e6b0a8452e948f3f3cc45a6dbdd9bf3f14eac17937e42eb4a72ef6c3585899f0def8f54bd22015b2bbb9642b5675be45fb9d54f194d54d5c4da17c236e8a275dc2358fb31471a305f2b454d40d983e64976b5007e541a8ff29fc690d4ea9556eff82a3abf95f35848af8993dd9e43d3239454ce0c7a2c394dcce13ead385e6e6a3ba59b79ba4478afdeaa8ee8ac4731ccbb45ef5d0a7c6504a8d7e285171a464129b714d95f1c69b8d952b4623aa8967f644c9cd8bdef96117198e57def602501201e036804129d528d717640ea33c9fb4885d61fa43860dafed4282b108 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 7db6d1a129d6123f1f805b79ad3b413012ea86aed42a05e98e7b1f32f9fbbdec +public_key = c29d93befe8070e37b3bbd6ade9be4de2b34ca99763f575e8d85e77d7f522c6c4eced8ad20ac6bfc4aa329e765f986579c373a3a333d6167c2c754de904e31ed3d5188c989140b63b76de9f2949c81c36cbc45939d0f6a43ae554f2385a738a229534cc665fd5e86d76087c9e6bf60baf8724973b9152b3941fcbe1a2f7bb7987d74856d3646d49715beec638db8e3b1d4e3ba2a54db46445369c6de0ad3c9c07c3204ef716ffa51ec6dd5d1a797089d89f7ee4d86d988d7f960f0dcc553a83f7433be60a463b054f3a6977599b7c1f783d2668d7b3f8bfbb8b6f5e1bda0f40ee81d6c4e7a9a6cb68d3b497e501453ac19b576364c3bd8fdef1bf475a9f7ed567e71e4d33bd4de482377ff27e356c89395c1476e10ad65dd168478bb7103a4e16eef7cc4bd617ef5b74ad7e8e8b8c153cd52a4d578298f4af398d7da1f95a0da9b49dcbda15f317f5576e52b51eca732d9df60d08832928d94de65ab48d3351b23f7568574dcd8fe3e9af22044984659f71b3b45861ab6f535da770b590723d9d118adb333f2739cad7227ad2b3460d156c0667e3f2aad5ec48bb21ad7f61aa6a0f4fe9d06fdaa577cc8cad6a7fcdf5826a3cc6ffff5c2be83d9fef40564e4c54469e4f4e0828bce94a5cd96fffc7ca3770ec5a024fd656447621006929174850c786fd6357f36188a4884cadd1d8485277891bde14b4c565747c4175e96e3f9dcfa659662d992c33bb2582970cec6d582a691d76e74952841ac5a64e53b31566671054486ef2d437e245e244e76ebc696a55a53308abf020b40b944cbf49fe55cbdffb9fcf98aac3c2c9ef7887fc9e0c730ab13c6f374ba8c88630093eadcf9ccdcc566e2456bef479f4fdd8ef803ca8719c382dcc668bfe897ebef81c4e52189dee243d20f43d1bca9e0ddfff02bf4329f73f54208f1bcabbd2bf38962e6810bfaaa5377a83c1da624a5d29e99c4becba9f0b3a5507d788f97ae550de881b8505c27c23c9edee9c7452a5faf9339c4ab88aedaab3b9fa5ecece8f8dafad888a3481ab39207a6851d0f85236e36ee49f996d4eb7da3f21d07e2d44531c98e8bf3c7eaa65aa0a3c5d55634699c0d7a483ede9583928ea984c413598868bfbe1fec008f7c426caeb3a77c9067b04dd3cdaf2b840af6a44e5a5ec3956b21697cddcaa035c4615936f524e55f9923a5c45cec748aee35889b20bcfecf5883578cd7233e6d6b8fa88c2ec8334ba25a54f101b6828c1db1d938df13f867e10c88ff3cce3af457a4ba82ccc4c231ca991b79c66cedc56666c80656845789b45f16d6549e49cc1fb0918bf97fa6830324e3d3e89d3e38544ed4dcbf288320bc3b8133e1ef79e25e74e2334ffe3f1ba325b668184e79e38868be6df33c78b0cd97f1adbf3b0b065a13f36a2b8b8245095cc785c64997add4a33b45e9a603cededc3e8831ad46d807d1b2e760952f8a15af51e8f484049e4cfdcb9e3bcd79609d7cc69fae18e3f2ebb882a1473ff2fc666b7a829189a4910c60f9cee93d5951538dbc5b9e69ca6433c4e560db8ac756944fd9faedd2adc9f9f57a474c32b94730470d46251aa7d27a9a3f2c617816386207449d9ce8f04537084a3f464b737c1a49e59c9042876e0556b92149f25fa3aadad3b5f18752de6e4c20dfd0924cde0b58d4fc6bf6f7c6cdcc684da10f89ce344518c7a480936e46ec4c01b36a7f2645075bf6d14e4fcfc46d2ada8fbefec50d1f8ec6dfabe11ac78205310ac8aea724a1180dd346046c446d66220eb1922f8628383cd9047a290f5cf8d6a47ece61af353e9067ae4433803c48b3ceef4467eddaaf68be2fbea209e8b1f6264fb14873edac70f834c710acc18fa4c6d16a627b03406fc7501e07ef62963e01869c80787af2d96a4ef8c72d273a3318c2826b8bb513bb2f6739648666b08fdfbb4b7785c853bc1aa4cdafc9d595f706b7bdde5cd6c78c960265ce1887b5e23f75f42377447751ac0bc812ef6c2f65bb1aed58d573a64959bc0d74727a4b5ae8caf3f2179ffd0ce81563712fcdf8da5f4af43c6143277bbd537f1155b04d1dd6b76d36161472a199764e07f93e044c62b7f44593564b15436b435da9e995fd8d3964f631f843ffc8887e49a87c591f860cf96747ec5891a9ada1e769b08fde946c972783e449cc7179f73e867c8a63b210d73ca9f8d4eb44b5da3b57dfed46bd22ab85b9bd915556 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 1d129b27be7384c359d04311fe5c44917d1fde4bfb57314f483ac617edd5ac49 +public_key = cc9a64734c470138d56a7b5d374435c099752edca12919e770d6af831ac7805a7dd5657bcbbcc9d85eb140283a2ec533c17ba38a49fbb994f1a5fd73149dc30a97d1c1396a4c17cece6cbce99949d0279119e879082fb0e2c748348a8a5a7c760826bbc0d395313b893a796b9d67fc1053fb2f5363b978fa8aeee7509ffbfe38b05ddc5b68ba3ad62497c3ab8ea7de3b11a6a69debef144db4200e3952eaeee1e759d2d5459b0ececf8e9e5eed9b8e7d7c7d59519369660306c41755d5a51846d5476d42edd393979294ce325a1b6674fe6c3265d52acfe121e95f9905d4cea88531efc72b038aa74e32728e673f4dedde28b0ba76b2b88453d29ef49978ecddf932370c864bd6f05b6cb13684455fcc5e008bcdc16597ed76eb383fa60f3f9df838f0b05eb1ba4647a7944c4dcc7a8f1bce390c44a9b7f21e1cd943cb4ff7fd48e246ff8904e23fd3636b97919f4eacf15fe89f0fa83b68de5d4a996fec6d6b7b33d79d825f366d89f89528a8e52b3671686af2d8898bd62c83c33aee3076aeeae845900ab2cfab51ea76c3022b52dd8dfd06be7a776d9c88e69d12d7694edc3e925fd738be7bb6844a1a28c0c766d38a8c6c6a7490633fb50d74cf532b5266e3fd01034c56aa898e6f4727e5363e0bb3012d3e792b3afd39b5376998142acf52f6933a594c9a5872ac6e9a8a53e7e86a91d419a78d57f45b1780bffe4abedb77ccb97d550ac223f5d01e0b64a61b8fa15f6331c4d9505a512b4b6ba7e3b4b73da113afdb441f92db5962b577af8d546b7465673a8641ab68d7453d85aafd849c9e4a31393c1dbbdfa30b3b1d1f61bdc9a8ca69cc0f0432e92ced42b6a8346cb6fd9cb49b189d125c8be52fa690dc90ed4a87c70ca8e35caa16a35a322db9716bae021c861267aea4244219d6dfb1c788cf8f64c034e15644ddaa4beae87f5c665fcdadd4c244079ccf2faa084aea2c18e0fc7ac55d77bb6ef934fb73a8e8f4cc29abf8c42c5d26f36518ba4cd3c3f0ed3e58b8b36108bb6d4f74f7dc46653fcf4927a833853b4b0af5723d8a3c5f37c17b3476d96e61c57579ce1fd167b7dc1d4ed325c6707fd8f271fdc73d65f364ef343b47efc1448b287dbfae4747083d5a9c3fa6aa77c7fc87e5cb35826b0ae796d67ec48cc0c9554692de86de0f5ead64a9e39657bf0f92f3a8f9ef696d3584b99c7367a10d343a5f52f2443ef479fc163a5ff1863be89f73aa3e92d10b661c9d51d57572d5caa817338c52374ddb38fd482fb1efac733afece852867e4cafa4d368ccfa58fda097fc69f44fbef73aa7c63f99ebbbce8756258d0ddafb5d65b5a2e4e4a81c7525583c0161ad06ced8a68776223aa97526aee98bf41f5acddacc5dec89b90bbd58e8f27c9f1a7f9783bfc06bbb91725c3b6ca991e75bdc795da0107674fabab39ef8ac5b9b717ca7542ebb564dd78e4c856448adac85c9240d77210e4ce850570ab693aca497819c5f10e2cc957fa9b465fd7027ec56a3ce254fdd6d02fe62f9e68674ad8d82b90812c8cb989394ca862aeebead9885598d39a42b3ac25bc9150ce5eda35d1d7c8c51adadc257cb8b1ce6de8a9d0b3cefa886ee6cfc9675548f9e5a5e0a00998440b93d847ea0b294aab2b4697196d397a9ccedbcb2f64e4dc8c764189cbf82d834327a9557cb44badf86277c54ab4f4d18d822814626b753cb38eb9f2fca8681cfe197bab18643c9b0aacf8445618a45814389466f67a5c557aeccabcf083cbdff5569e39cae20584ef46bb56456386f3c7ef5a5c196c51646b69154393bc7a6a6d0869e06c3f8ababbd7bad70f974e682398508a356c78c74bf8e08c4fc6b53744c384ff16c84e5bc6750546739acbada819a2af9c5bbbefca3406f25d08fd10ac8a5873a2a9cd4ced887730988c150ddb349fe9955d3f9e3555f89d715424d95f05bc7d6cf0dda3e3acf98b10daa4053c90f4dfc0dcc676dcaecc0ed9f427d4bbf624f59363e4494c3e66bf66f174e1a135d667954388fc5b760f70e00a8bde873d3d58c627c6b31d96e05a7e74366c80530fef42ace85bbc4c091ef2b5bf5d00a982101b4b45ce8bae64b7abdfa2bf646e39cbf41efe7d8c5b42db08ca0d65710a7f500734f0ddea731367e54e96e809fcc1ceb7ad01d843eb9f8dcad3c1370b6b517f5473b94bd6351e282f01bf82a24c3ef05658b9e66735007b45f5b008a7bd +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: bbc773ebd2df42c36ae05952d6a64c63a5dfb82ceb3ef4f8d4df3a30ec8c0467 +public_key = 61cd6a2ecff2a10a620d78b12914f477537af09db5f10fdb58c6d05fedf3503e68ef9f7d726733c43fe0360feec2a95471fc5aff5738184ec9ddda972749d9ec4c68d5bfa22019cc2d58b0f40860d04f9c20757c9126997aae7e5e0eaee0dfed3706369d3f946186f8bb97c26556563017720084e4aed6a9113ca543f9b028bfaaf10ef3d1747a800a49da58f39eca99fd4443566348a308e52c6ca511e769cee83d0513444e7778029fe1f3a683ceeaeba298ea3709f686a54806858058b37aad546d48b4a5f3f6f89c237a0428e4c063eb27045b8716c1ab1566af2fbb1eea84544d791e2899020c8ac1d6724a0b8b443ff2b204b0b2ac55d924b4afb5d83426c716dafde71c99687748b56342ee7f6694ba5e63f4f911f66f8f8b311136eec39bb3dbcb9ed5d7f9b50ea23baf6015e3ebdf8c830106ebbe695066eccdef0f8b124ffaa437c26a78589a8e7893cb321e0b72e7b7e3151d772799500b1e6f612838d87def67ff9567e8a0f0b7477124f81d07d4ca76326b8aba041457014e56855ceb8119fffa869eb478d7e7bee08cfbd6f65453800b72ebb4613e2c363c6e90ebef9735d48e537a717e335c9f7b456d9f3c42b3eb8f4b4dbba96f5946f743e5e6a024d0b9feb3eb7e954f85b0ccfa751d44f8fedcf663e5d9c8b9a212dde1313b5cc8e8930c2f3d08c95e5eeb47127a4bc558fb0e97ea758893e9b64be04e62332b8da6d7b2925fa914f5c748b4d4fd865dc22f4e0b64cf782b7c866833dc8773b20c6eb28ac57c05e76895cee2e78d41f97b5efae4401ced329363925d94bd56503789f4c15c86ec833b0fadb3e476aa91398c108a6e99e7ab64a9d514ed61cb5f756dff9238564cf0cab366f8753acaefd3e9ab717fea0dfe61b398c413a39281af68c2df8172d6501e3e3ed25f84d22f50e6b75705de950bdc5af1959bc3e93156346dd3b47450f758d3e9796cba905a9ff4740b33b239b97c45c6973f3a05dbe5ea44ca4fd98ee589a2f5baed1ffdda476533d5baa58027aacefce51c9c5eda23b14367b8bf7571e7c75d197a55ed3a349de636bf84ad6d446e2c3ba5657c68372fb136384be3b89c7ecad95a89697b4c8eda2e5d1e5544f3d957e51a86f0cd98fcff72a624da1763def6f7d3f37f79247eb7c5e36a83d6ec7fce8e6bfa7753cd9563a4f0968b91aef6f7c3ec575d74b4a0ee3f2b2e6c7125d8a4bbefe85af0c0cde9abeeb8b3c8750edcbc30cb47ab0b56782d421359a0c9cd8295ccb7063ff141b74b847ed04d9c48416eaef9ce9de9f8c809c9d050f3345d6553117dcd36d5b2e60d47b97b61cdea5c3b896dc1bfff6bcfa2595f95ae0993bf0f3a498cbabd6b37d57cff8db63805ddca53ae69f6edd3efe695b6eaa2c63d773cc4347d4b9e0e46a822a980a9f4c8910d70c67437576c57226dac7b297bdd074c9eec3a378f97f0a34772c8f92d0b7a29faaccf7bafd2dcc699abd767eed6e04a76bdaee8b7875c188bef8ccbd0b3c882f3bc6bc66bf94443610c65b19ab7ff90d7d86fce8f228c36d648d8b0baf5315fc1a44a6842568d82b43a994b5b6c69555a449ffd0c395997df3b679e4643842083b20b4d401d5e898e138a092ba393bbaca9fc6f38ff8d8866da7a9fc5b96cf28b3388a72fa6f2839da97be21deadc76cdb36ffe62bd7981ec294ba709eb97b34c69bca54c2b7e91548fa7c396f3d783255a79b3fc579cc6feed83b430c45377857191dd6e5a26576e9faf1b799420affbb234a68c2e309db9aede9765c78c486db5ee400cb46cb586c33c46db9ba99b983b958e5fc5c5fb7feabe42c4f53df9cbcb4d37819a47f864ebd5747ccb34ca74158318664b243c81b85484bf15ded3aa81ff37725f29b96209d2f5f44b4768cd9db394fc7370d0ca72e26d7f84adcd82793ec4af3d361dae6ef3375d3f65de8f68b303eccefa83f8e5aa3e1d77cd6fa8ed858e6ed4639447aa3e7d5a1dfc4cbe7c4b74d67183a5875d24552ae74e546ab15376ac55fd582f3a92a2fed75cfb682a16b6a46ba9404ee6603f654838c9e14b46476465cfe45bec653d2c1aecef96cf02fef3f1b3e16c93b1d5e54730dcc5f9e6e8b53a7917b7eabbcc312cacb171dede454c4186a7e7afd8aa4a96e13ceb654d68faf443a0b6a74173f963d99c8d44e5520ae278370855c0e9e01df9b37d13e35124e6c2590e9a231a219c07ef6c +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 5b17a6adad541efcbf5ae4b0c0452cd2ce32e4f0f8701801c5b63e197c1fcbf4 +public_key = c75c9083566b23acc2ea8e457fbbe307bd4340969dd118ef075afa33bb85b99f750bd34336a68363fdd3038ef410eb8fc8f37da663da409be7fdebdfd70fc2e40a7dc4c94ea853f26ca79b168be8104df4a273c5809ecd6a6f9c9716e7720497c53d8e11fd3a03854400ff3a3afb83fc2f91dcfe77a003b01a7d37a3d9f83de78dca1ebeac03df6c4c67414dd266c6ab69893aaafee2b689d3df849a4bd59ba116d30c6fb61ccf93fef997a895ed06c956632cf66ad5337a2ef4a5ed9bdb06c0ffa681cf2c6d4377de2b0e7b9b4dc13e85bc1c24ad925dd3aa69439e5deba605d014afbaa1edb010363574c7e242745e9e7d9a3ff3b0a2ac7f374684bce9bcf13dddb6ad9b5d0c92cdc7bbfb4cf4a79a8a4a0a9a64376a0793c1252362af27d856046472bea60eb33f23c59123ddaaeda79cafff7dfa7eac8764986c0bf717fc3bb71355a56867c29795f46668f8166971bd6c6cb9ed875eccdcccf3fc2bff0a75c45fb332125e953325d36e5f322c9b640825fbbb59512904eb8b8570f02b8ccba66de5fc36d99f457673a9a096c556c9afd12bd6e1ca9cc8b3a9e9765e38f7e1d039612c4bb29616e771f4fefd68c9acc8ca621eff2a5f51ccb33252e8b0e6486c5a5bc2868334767eb8f0b4faec4873cd3549324ab7293f4030196036bf9ad3043aba0d8da6c9f4bd376cfc1d3fcbab9450b44c299b4e271653037869450d9418cbc66fd9a570468dd85ab652d864036ded6105f82cd8800575f1f72a36227d580675bdde5d5840378d96334a714f829355f7f70a499ae99db825e6b2de426d233dcf9855891df2d83ed0e14858c1bff6325338b33ab5ecc5a86e0ac4e95d4e168c5e1a4788177878bd569d49dc60b1484f43134e2bd39efc2d7430aa564ab7a88ce4decd0da10e4b6c663b61a60543244f9c082fb2e4464ec0d43374234b4884bb8decda2895f60036963563eff953e94c09ea37b43afe4e8f8f964cf9c9cc66988407bcc7b5247a247f980035c8f8357bc3db948c0c4b391ab47646d24dcb79f094c62ccb64894cdc46cebc88dbd0ba95f48253606735547e4f4798bdbb302c5eb973eaca8d60bc47341e69379bba5b5e44980a7dc699187f6283ef2b1a4bb4c7a33f9af0758335bc8a3c4c5cd900b3c2cfe35356a58aae233b066466b34c814a4cb6b909e7582bd361e78a2a7ebbfd0e4a7476ab2f8cf91ba688d5f75153c4ad7ba4c664b8d02058c9eb195a3ca7ab70638bb114c3618bac3ab383dcff92705a478a35c31f06a1823b545366cb6a0dc59c036b0647f7504a55c2ac940606c7bcc74643644bdf9e5d83c395023c8fbd069f9ed5de1fdbc8eebd387beed74c1ebfe03fdedd7486082a4842d6c737c6a1ed5b98bb78cd6efee5358db3bf095b04a7cbcdce9102964e34693a6e59ffae134c9e7f6e4963f2370e8dc517bd9433fd717a408af43fd5c837a21cca33ecc2a3859eaf8a74b63c36fb8de68f34ee2ff52f7197a616dd4357a7acca269e47848375bab1f82ac6879d3d44786d540a496e2964308ed61ee76054b5aa6ae67cfb0e704b386a657a6773b8509dceb4e16bbb92dbf04b5bc6638cc5dd868db40358dcc4c2599e5d1e93771b1faa7ca4b3bcd854ea3ae11c09afbd6dcc91f5abd63ca5cdeeeef3ceb06a38925eb9a4bb569d8c4b859bdf78cfcdd6a3d44328636809b3ec377c58957aa5408b488445bf1fc4ca378c733f5ede3814c4300850ff0bd62df767743468c6b9ed81dc3c4c34b4b6ad6dfab7cb6a84ec921d7758859f2e2cfd0698e613ed5cd7444abf23c104b6a068988fb794306f9daa1bdfccf76482f0fa7067467dc105c27eb7e92d0c6fc50b4042934e81876e121c6c295a54332e9345bab9ca566f0dfb6b9d57f8ac7e87f41eba22d55b4047b9b4ae76339f5ec31bb2332f57dfea3d1c1b4331467904fbfbc1f7a4369aab9a1f531a6835359bd16889ac910a7c399ce8a1636977ed4c7227cca0ee3d61a848eec6dd56635064cad7359730a1cf69ed6cb25daf90905f4ae3c9bc861ad6229f421cdba741dca98f98ae0d955c79de41fedb59bee95958ed35d6bd5155f5792e88ce4344ff410ac92eaa68cd055fe28c4a217b9c2da4ba64d4a6605565d42ad0acf377ea08d981d9a5305766747cb0761498675d4db6b96ee4cc9d4bb977165f0b04d3c03c1f8150a265215387c7983d37463a3136a1b7c6 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 61ab87659525de9656af41246f20e1dbe85c24e335e7ecf9493f46168bc14e94 +public_key = 5586a5b224aaa74f8374da6bbed37b0f67c3b545fa5fcfbc082f47d20c7e83d83ec26fa3de0db44c17d577ebb614c97b07ee5d7b4eccb6a45fb32d5bb57ba4dad4da12ac5f6bc5f2ed863daf67379d33dbad07e944256cfc596d28957bae1cd50c9e82668857951a38628b83e218f65a3e7ffd0adf279644fed9877d6775e23e682b998adc1ddace75ff130bdc9aa57b912fb792bc4bae5ab5f07372bdfe31ab93523f04ff5b3f8fe465520bc57d630ff3e0a3623ad8b035fe64b29dd926ca8a860f77d0054f34b941e6388349a87eb853375055caa13d530aad6fc30e6ba8a3c9bb06bbe768e946755e6d7f6e9767330d639ad4ca467ff670414a65eacba93d2b33ab6f8f9fbf949054c82f6f774dce3f013998cf29465e8b83dce66929bfc9e1f4cebbc9ee2d9bf2788790745ee359aedef23c66c41e5af8ca4ed0b595c8a49ae8eb955a86a2559e32cd65a2f6a44eece7b43b4d629ffe72b068aab2dfe270ed58ae1fe83dea6994abc7dab7e414666c57b4c40a17781ac4784e6ab2ecbb8fb32defa163da0013fb5d1b51b57ac1547d76faa54b3b9bbfd9dcac576fd9cc78eb73d5a3c7138157bf58322cd5a494345c9aa72197c9d3a9552e437e891c437cae6c00c76f0b6f52c8e4cebed86398957088596ce28c5880ebeb913d6959defa45b5a14e2bd5c26ec5a3aa780a9e54a557a58e7cfc7758653f4fd9edc9d110f4de037732a7e44d7b6d736437c7a3e872c83bf0488d83b269fea84e8b76cdd2f1da834df8624f665df2677e0ae98c62636f603bc1d796935b1ebd18fb851f8d76c7e4c58c4eabc71481618f81ee4c572c7efc08b8cadcd6b7dc93e30f26eedb26b1335662a526e478eb5d5a8c61fbae75f64e66ea2741d28cd49639f380e93f6b77577b494c463c9ce8a6dbcfcf5f44fe98f065fda748e9be7e31cfded1fe6448f7ba3fb03637b45eaf9e284da6677b53c7effdf4eee425e8b18c39813a82ca14ef2466321ba9531ad4b576cb8825978b565580d60dd1b9a56a944cfcedec57907f8785487abc0a8f2d28af8ab3f3713fe25fbbd84dde95668e6d15f8bc6936959efaf3f8279c74946a8ba37d2eec75622c4f912cf4839b78cbc8812fa55e1afedede4931f6de6bba8aa44943bf982d395a9be328648b888bf8a994f3e54ffa69a752d2efe21d447c2f05bc91f5f636dd6bb2ed5dabcdff02b6ba9ea8944d9344ef68c23b0ed244b93a40c456da0857acdcacecfe782d63a0648497c929e6a50b3d0688800b968f1f3fd0fceb4538f7520becb0fb86368aeaf08c16d2e1ba5d2ca85da8d36ab888fa80436d69f65622279d8145aa5ed9671a28699ac9990d738c3b67ba500a731cda82966ad1b5ce6144383bfbf3334d159c3193ef954ded6a13f0a4c7a340aab3a198f5516b819a285dbc8fa28f1640925e6c2519b9b534ab8e1e6cf623d3dfb4d91fab8669b4e7a996ff9059ed261f77d4b7b0523b7c4e345ebb19de5ee581f1933e7168567a857dfa09e7f77475514d9889bcbfb7f3f840537ecb8cd50b18552fe5aabb6794b285d5f3c7f1c0b96b738c84508e6160d3c4349c44640efe248a6605c5fbb9f8b370e958db55b9ee0663465ed4c47781e9eda6ecfbfa273facf018fc4e28d6c19f7a25e7ba8f1a395f1a352f7fccf82d93a9587299e5bc23933395836bcc9783246da993bd40a7b67d4e2caa3e2f7f60d4c8ae293071be878c63c8e116f67a8ac7bcc850dabb5904769fc487b4f417388ce6755058470a3a7faf4eb5700d9b01c74af3cda7d35fb3040fa7b3585864c84c8aa4ac42f8fb1ab4421529e284799c40d5ac80079d316f5dd09562e565e6749ea370fb6841a98ff2b85713b75ff58b984efaa29393540fdbf0e4cecdb1887be3b3dfd396ed62999f2c376704983f979e97c9165f19b498bc169966269e3bff300847c908a4738c8655f486f38fba9bdb05c3e5fec3aadc7432a6d603c36f759c69e4cad48c76561ab4831c4d341ed5c05c7b8a863e69f2d75713c97a8844e9467e93b9889724d3a109cec3d083404d93a25a98babfe33d36fccf4f76f3b9e378fc5c731b1af0df7b5c29adc86c065017d37a65d89e8f1f7acb73df4304739f19bb2a596bfa5dc9978d5f73d79ec0bad9dcbd561c3a3bdb23d09f77fb9f2c907c468d916c305d530fe5910a3c029a722a9e1e6048ef23454bb64b1c9eb2d1c1fb4c57 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: eca2adc3da1fb15f34033405ec08ef2f46163df4bfcccf8842c600ce0bc2026c +public_key = 5628dd96474d83a849634866a5dbde6f0db8cb96406716ddf339cb2fad5fbd7df1057978ff3baf47ccca15e9d147473e8bbbf3693b6b7097fb27b4a4c083dc5374a260e7cbbeaad94ac5de6fab80c32875c213fa5eaa8f2347c3144d9ca1a3d2a0437cdeb6f1da1ca0092e57ea46fef89d7fdc68f6f067ac4a5aee4b997d240c7d3df9ae6dc5f815a4d2d1943fad6743e7ee8b345ca2c0494d9bc956888ac85d1fe153b65389fd4c4576d8e41361a6d3525b1e43f71dc21b2a9a7f6afe1a56e5539d4e341ab4280f8e567741da9d6982e4b563d980b68871ef0de3f2c3639a244cd40dcd013dbcf5afb1dc6ed1c1d66ee28bc3bc276b7ea9f2d025390403dcb676777a36a897d35d391f92915a82fabfb77053802789e6e17ae3714de9813fb865d8f3e80a58c12ab39639488d65b0c80a39120fcbcb58e1911c60f618323c13a0e967bac666e4840f6c323485039f7f70dbff780bb571f861cdd5394296436e37737a8ac6cbdc42a0f9b96a4e907be3abb5e7740e193d590c86224df83f17e1665a85ff05e68c96857888ea7b766ceae8e633b6a2561bda740752d93f53a04c7f17c9db6396dc19f38b78866edbb79482d8af6cb858c8a38fcf1c42401dcbbe9e31ed97e16c7eea75cce09ee57eeacb6b2f2fd1e488c785b87f384c86587844aa2e701205979c1ba17dcce519ecd908c656d7734a5a354e066d6acf89d1f0c7590e3a324d3da906bf462da7cfe478a46986d1618bc7417da9e317d7219c53b49ce4c01a8fc755d98a27b799868167cf6f52befa9a24c9faa336f92692c24e961ba4444dcba2a47da63f533f87dafb1b9537987b7b71043d60dd90300a7d4673a38cb781f833897e94955bcae9d428cb807e710e98901b3597467795a84487bcc5a1180482ffbef05a0a85458e719d1fb11054ad3c95e75a04c2711ec29c387d0e67e08406f6a6f73cb5986945cccaaaac7d9eaa305d3e535877cae02e3d5cdf5801438717dbb5051532f6fe35f2f79fbd093864439507446b36f349ce4748ff6e44649e7864eb90f3f367430df7ec03ff83fecb910e7099ec78380b5aca2c7e82657557eb66c2fb633aca3d99a6fef99f7a3f3c9d8da538b8a5f5310664dc2889410465e90b4d078c7dc9fd30729555756c8080fff8623a37a3bf48ba55516caca65256bbffaa6cf6457dbb3f336b8ef21659358f955416074ad023edc5de86bcca317d193a92eef900c477a00490cc464a12afe4e00e882576b41ad7b6f29b34dbb3b03a5c77b2e4e62d985530d9d8b186b7e168c2ad6983041ff83cdad78f68e6a9c79add9bbbca9b3fef0f447dca3ccc8fbac0ccc385538208e49742da9617af8bb4dfd568838de12e40eee3a7e5a94a82563a918fdc62caff33fd5ddea552f565b4e2597b17c3b8c34e68d4484deff79a25c8fee1253049f6e982a5d8b01a7892beddb5c5a532f4880c169a38c7a0c9a7e5a2a696bf66b679ad349f0dfd710fa5e5ec3db2c3647ba6dfe9a343b65dd69a7cf28f0f471aef69853535f5e841f799f2dd85c3062e88a2ebdb2a453b511931174738645fa438dda0e2fa474afcdbe01d90ec169cf473b9cd153c223eb2e8fdd1d45f5957a487a38c726e8eda6bf6a1f10f7432c53a56a96c3a2ae00ea69103fbcca54ea3f54dd2dd47714d397f7a4ad2d0137a0ecd60ea0669540e61c67334b8965faba455b81a6dcb37c8d2ba97c9496c3e3bc984c44a7b36e1b51794ee2347cc489c07b4a89e8c5c631ff1b9c98c08eb5b2468e9a92cadeb684b82757e00039079e550a7c7a14bc856e0d347d28861931f77bf18932183cb9d4dcb07d67202a7838c6dddf72beebaa87203ad943da8faed04e360b38c68ef5173dbc67be8b33e1d724b08611857c1397dbff9cd324acb67f498b599db59515ca863cbe016e87d07b747efe8c90305dc3f7468053587565e63e705e7585df04b78ccf2cbe1dd3fad1cea844073b7d4667fb55b93bdb4a708ebf96f3bbbc62ee19db4479737578869d75d4fde56bda5185552cba4f6a6abdbd11b4d007f6d5ddfd8e3fb46c3c4456cd63ef1d598bd675d56beadc177790da6509dea49aa958d2ce9a9e6ecb19fe96548a88f7b489433147ddf1de39007b6bdca9b3c7cdeff1ae833deda257599fb6df00b167829bb34ef7f551bbf3a650c7a34ae6ed516d401d89486d438a0515a537077561ec79e1a3963ab +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: c4f15bec2d7701339d0ade4835193bea3632edcf89e74992620d9eb623a0d0d4 +public_key = cc0de8d8e336efbb59623db73268680be4885255aa6353a39f04740cefc3910a9ba927d0697d88aeca7fd4a37feca45bf2aaf7824babb327c49f18539fefdc1755983e7bee03f98f872df2746fc9e22f46d2176ddaf48dad3e955e59a7d69a8dfa68ff8c66b14dc7f59e6c4c63bb88c995a71fc44bf964b1650746ff77ffc37e652884edd8174aa33f6e220df6368adf243ac63728bc6ab95dc22a9633ee8cff13cc6e38a1f5ada542259d41ebdc1dc640e8735dfbaca58c3c7f18e39c7474ed487d99ff1ac96d9f4e367be6af4f3de8bc9610c855eb686e8da3d1f3cd8e96e3a27775f3ffb93cfa47f6c2dd3d0c2c634f1cbae6dbb4cb987be8eb4642add56cecf9a775ec79773b1696f69c1646a65786f667986e7a552278713fe5c5a4f9c23633c467b8b63c4d8c4229cea5f5a0664852729a7474695138cd961783656df4527719f227ef32d5eb929c8bb5788ecded3b7d5266bf5c2ccfaa9fbb9d8b597473e9e6b5803e0da84e2a9998acd8bca7f6783389fe5d60756d6a0945c7e4fff500d58fe3a647214be9bec6e74d7f833dec8ecd036499e53b0a18a1d6e471713aed64b9d3b1f3634ceaace56a906a1336c9d9708768a6bcb9cfc036ac236d7810457e866d561a38c5cd84c6cb1fea99ce5aadc47e874778a824f3d669ab411a72aa4a661dfbfb8f5ad6600baac967617bfc5dc9eefd44d9a7f80b46d9b4db91a66e3c0adcfb65f3c059f2dc2ec41217e7b436c6dd9ed30d13b867f7d7b9a389189ec7579ddadc4ecc9a39f60da8f0257fb7347ee037a98b454b6b5a04f4df236dc079941b26dff2cdb8ed2be4e787898da354cf79ca4ff5d6d584fb5824edd06f4964397274737e4fdeaacb76a92bba8966bbf4751e63893587c94cbd468ebd0b2ed937946051c572f233fa1496677958e2039ba9e75f5a298531e7479a172ef3da95b83ee746dc0aee890e30af18dfd71480a4e5ea48c48abcc6fd4c7b44b81fbc0ecc4eb53a929b1e67f3c49be8cde9002679123348af5b7ab18a36f87af3b319e54c63d7b003966c87550487e8b32649945c78660ef4ef7de98a05eed69e934ffdfef7fcf18579e29d03b76ea7f9dadce7e54d7eeaa4820e238dec3d7d81a5f8ba3fbbdd74ac26cd476c037cd93ddee933e533676f3e2be1a60af611b3e6101db26f2cba296657255d516ceea39ed8bf651b961e58be810bbe83957038fe671d1f8f9103d3e0fee03e6f4b97b4c331db624fb354188d47ad4b909ba932129d8e360e4d8a6e44357cf50e0ff58c5487eb1eb32a2e4b4c4bf342e64244d684bb9e4e031ff8e0d9b5b0283b5c96a22c6edf31974844cfedf488786537f1bffaeb38054ba1b39ebd1ad3746ab5d07ba3d80b5be15daf138fbf1ef87629fade2faaf72bbcf4b7d3b465ce82a813fdc2acc0b7ba3482c5cd7c0b519a6ff63406ee553534020671baca3534193b2a9585f47394adaec8b0ff4c05a7a8b0f59745e56e134fefa1a7b38db38de3485f0186f6eea474e3e3c1a6bb5243ff6de35f9e5189f8e547423b79cec655ff15ce7ac403c0a7ef3d25d334ad07aabd8c60320d82bb5ae94d656b2e2b64ff3475fcd9f26b5f6867ca7dd03c75351ab921eb35e445b144f4a7e743acca85372a03c4cad754f1d788a1d9e9f0ce98aef95baf7768dbc94f36d5a37db440ef4d3b9b8a339bcc50c0469f5178efccbf94a15fe47f895d922e70117ea6ae8b85b3ca4a7f197f06cc5ed4f4dc5cdeba18f76a811d857cbdc3f9ce5ef8f89fd02fafd66d445c8576b8a46298fecbf589623214d727eb40b78c9709aad9ebee92803bcdb153b7ca9e8b8c66a3e8ccb0a928b2505b3034886b452bc9f87e9246e6fad183a292a75f4d77e5a52e53b8f8656b2c397428803725bd662395885d6e9ad5694fed592918a14346cdb0b9e17b7969345bb11ced7b82dc4361b580fabc4a91e9e9fca7f51bdea69938b508ed66cfa6a251d98928ffbf2aa8d6164cd7d1a966272657771d5126e5ca597fc61e4bba963fded56ef4e76b334d04e0e0cc4f193baf6ce695823e3617cda9de5682500d7d6579fd0f675ab0ed86b7ef621bfba18deeadc4337553d8eb92ca4a9a2c97134e6a168a7aa0dd6450589641e952a97be22b4c4bb647f1d6e76201f96e7403a9098e9bb61864fa2f5185678741da30f96e7973a83811b94c50bae593d1da6d3b306bf50669e590eee2 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 28878249e2ac2b6263422993923a0c8bd05ce56e385ed13c943b03d226856947 +public_key = 8945cc28753a4f3771a68a9000944d726479e1a79d88675fa13795fc086d7908ffa5dc7e2da5ac939a42728963bfc3659e5d345694373b877b0504a864247addc746ea9ef6cdd7ed0e4bdc7f457c046ac8b9ce458ef7dc839d5ff5183d890845b21c66953c6402cba2e329886ae5ea92f7c673995fe255bf956fb2edcc899125b1831ef55a1df4b79f8fa0c79476ccc4084ef664b83c9c59a806989c335f683b13979966e70883ff588d4a97cdb58c88cb4a83a1272ad5a9a58a4c187b45cc893ba6f1e8c5543b1ff21e0af718bda42bdae880959e70496cd155fd3629edeb2f6b49f76419bea44079c2d649fc37b3e9cb0d7b65f57743598f2d4da68dcbb6040eedd32c368a0688344af5f6a348c1bf60b1946abcfe5b3c9ba0ad1cb302c9e8e4285870c9444118598ae6ddd613dc45f33239abc79a04a05a2cb8e73ef8a3a9ccb71f48f21fec7ba5751dd6dd519e986243fbdd0bc371f4d37063879fb5bb2239d328d9e94aa837173e6b7747a5130a984a249e2f1f4ea0eb67396a3197fb80bd77fc6e6cab6eefcca2e3ad70d5866fc878dbbecd6557f9ecf9ceb733a1b81890d05ec2ad2efa52b6a4123cf7b86cca81089afa1361c50e5abe68c62daae1bc1d358459882f5846186ea7ecd3b9b4be7e32a682a389c4328bbc4abbd1f44ca93f25de72678160243130555ac9e964c784c33943b5eddd7aa8097be52eb7973d5f06ee96ae166559ca5c59a445bca8d92cfee8309dd0d5c39b7c074e016433235aca94e7e62b853e45367d43ee604c1d702cea82da0d425ade30ae6ee7ca24c6ee5eed5929c3f7a6bb35cbcb2ca6bf09cd6d1a1cb63aa54d4164a838173b82b45524fdd559994e8ff5a9cab63c6fd3f66998ca8bd5820e8be6f8f86ce149c355e49451c89624b4b1f2fa7f09c5a15bbbaeb6a641d66e830caf5ea57dc9d7c397499c9747994bb98e8befaceef89dffd6963dbafb6e6dc5a3ce25d9510578b96983d08c53c9384e45e6a5bea7c944eeec5c46cef6dd566c5cef9aedd07abd641636bc329e3035ae34e7a4b0cb959ea476fbe65e57fe89a7ebeea97603d617ba7e01a8f0995ee5e5fcfe7e1df6734d69607ddb2ec4e81adcad96c7605d5c750154a41124c6f23696845b9b5539ae31be564bebfb42cd9feb96b31b0796fed8503028af12cdfe68f342e43ed8465f5a52268a1b0b4f7648600b455c5d8f4c4aef97247e808bf572017331cc8bc0e21e47bd1d793e096144b4e87b196abeef88b134bc54c5b3b863e2e7a9bb90135dca9bc73976e5ac979dea9ddc26057ae30640901744382d9edf3edcb2c733302c4aeaceac157fd24d64d06835ac3f23611d1bcfc945a5850ec6a6da42242983f4f7e2a518dbdd13633b1c98f32835f179a3d11eaaa46b9b2fc8e0dee9495cb44520edba2007ea92a445e1ce6487dd6382c8cc415e647739762257a00e8d956475b4521493df79a28319c2c1338c9cb3791a8d785c3aeec5bee844c6d8a7c7c92c9ed15534a03904cd5a4777fd587ad90d4b61ec40bc9aa7a4268ef44590062f759cd5d57bbafa5729bcfb4ad6671f6a90d56b7527c3290d960d9586e93579efde818afda7635e8125a4317649a3c1883c6ed8b047b5444667b4d53ab5d5b952b10ca1b8aa4ca5e438ee4cfe7adfe32bdcf57d8585abc6d9ff97dd268f6a67075fc38c32cd1c6d78e56a4f18cb59c756979331f1786820caf97f5cf6ce35ec93686507bf6805286cf69e9ab77dd92e7ce825d746c8c9478c4d8acb0f4376233ab9cf87d709d02f7b8c6e8db44319e7fe546ba774482b9b77c20bccad85355f66f153ae593dffbbb13de4df47b29d1ca5c1e3d0445cb4835b45bd59b92cbaecadfab9986869f5a787596798201f67e625e80bf7952a27ab3527a60b23dd6aee55ff88410b2ae0a705b14eff48ccb8d1e3b7610baac9d92c75e4c759cf7c8f644b610a45da9a9b5b59eb798a1cbf43edff212af7abfd5ab9ee9bab7ddf3babca5e8fc9388466c5aba81d3fa7dabc9775e73a7753ff9ba6f25ebe698a2c7a6c9b6949c59d7796758d24c4197f802a63bc9723b1807d3903c84e425383051abb07e94a1f19a258b6ec66b56f46cccf68fa4ad62c528dcebba2d579913ab754268eadd4f04b887bb774d96783301fe3def9d972acacc01977d137525d619df951b0f9a5008bd9cb4524c5ae7cec747696489a8fc0ef65 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 17fc65f7fbd7c75ceec421dee84dff5a8cb22764a182db17e0ebe857f54d60eb +public_key = fab5cf19743431af475225661978f6be35c3ba65d53ed8c8ac14f11a3ea38d6ae00d7d97059bc058d551672542a9fea7fff8ee0c43b1636572f56d8dfadc72f9a786c5cfb2d27c576d29461ad56369b7300d4bda799dca3d94d7a9aea90f79655884320225fa723e919da4e7065360440ab85179d9088bff4eb4d8bacadcd6cdaf2a85634e88693b9ce21dd8e21d56f651ffb418adc44b6de8bc2a70e68a590b757b4c0ac70bdaf5933d49febed85606fda437d1ab9a75d9a9efe3d99856138112ba4f52eae16604e1e4fe5baf7c3062563dbf16f6f76c4ce98ccb1f238a898df01654a6e65ea5de9cc24fb36dff2334f2f7bcf51b8b6f9cfd07b4892a657e586370126f407614dc02ec599259e6f5e49956534b0b7a746b16663f33cef454df2eb5be9ff4d34ebe53d296a86d83bee4bd8ae544e223193a7febabc53956049bc1e158e9391c5be6ffe6377438b0fb56ad87d335a97c8e574c015c66d99c59326afedafc7a6b4ba77fc5e051afc400d754d72cdfac84781af78c04cd94be9ddfe25b7f716dbfb435f643d97ccd7dd2a1568d4bfe81ea9fb1ffa8cc17bb835f1bfe6c8fd26478729275b002636cb49c9edbf4373a1f961eadb913e6cfc1959b80f7e1cfaf76c20e58dc43b6897d42d8d58402cc54a78ef75fb49a7a2dc3575eaa4e8eaebdc7721134f0dc0e62b94648ccd5e9e369958cf4dadd9d413da8d2e72eb6e8ccac13d846152ce9c78e3259c599904d71103e62d006c5d3a9b2d18861789aa7854831a13e4eb75ad3b859f1ed73ae13db7298288ccfcd7eaef97717de4a8a296bc4ddb95e4a78e10af567c6ac961a73ce73d85daea4b20eadb8ffa4059a97a24bc2dfdb6115386de5e95486a46e6697a17a88510c97a0613fd5e018d88d269083bfc1791cd2912a9f03383a95efe27deea0d7f558434a63015e3a15efc4f6b33d8a159a07dd9983688f75265a84637f07846f0c47441bc6a6a8e48142b39b499ebb5d4fec8be3d7dcb6326dbb960b63fd89fd8f8a299d9158f4e56e89378c635d0fd98ed8382fbb4165edec868cef1c4973116c3629b3cddcc4db193fa0f06b6d04ec8edc56f05da3b2905dbd183dbbc04c5f938fd9a4369b878596a3ee49777e39e5ad6493ea42044d62ab1ab0387f8909cd7f9bdc820495916daee4f7e95683c945c19354dc06c5b7888244fce79bf88ed4e68bd10483918bcea75f446b7333e71a403e97446564361c5f53d1cff5d41556831f372506efd5d4655bdb7891c6572758977f0b4e8efdf1e93fce6314c25f8f392cbca5c794cd2034eb87ec87a86ad17774bc3eae8e78edb53b6feb2fbda7006b35edf5b0a85b44d3d78dfbb476861997714330c9c5ae5f1df7d7298a64c6ff2523670d6e80526f9c9577abc2f456eb0ca33fc86e94e9e0d196e44be3a88633dcf3566cc0acfccc76719bc349cfc7dc36bf4ea6b4bf1c0394527a52974ea2b45b60da3a976e8dd12e48b5e06da7d848fab149760cb5579f0673f78a52c01c8efd1a667d86635cfe5035ac32805b56ccaaec005e6ca38b3df7a3b860985fed84b2b5fec7f3a8812273df438c56576d362b9d887a9cb5519dcc448c9088c6783aa890cc5eccc3c8cc7c097d5a8d8f06675e1f8f6869abbc0644a612d471d6ded6214abcc21e5b106ab3406bede14c664a773e6e5667d8177ed736a9688ededda390f1ced5f9c5ba3a2a61913af4143970311ff035c533de16c634a799f2c7ffc42ef071e7aaecde636a46d3982df0e209e0b91e3387dae7171b39104595e66ddb50c99c37aba1fae5dfed567d5eecc00db3ac156f4675c76846c4f327b9510ddb882b24be90c9661f5c46eb6be992df5920c78f368d7ec55ac2827776a54ac4ee37fb469ac65aabc6ba199dbe33724e5866e24a8058d5908f3dbf553f57469d7752e3f4490b766f6672c4c8443ff7647dec597286e35a4789dbab39365e75bf3a63ca6a359a879d649cdb398f70680781d3e732efa5c85f2cd20e4384875954b514d3a4987ce54a6f24c83e541491b8de44012544b97bd0b933c51704bcfc3bf0ada6c481ab32d555898174526a266f70b7939054a88256a59c95a0ec35d1cbd45f10ffad418b82ecc5e4f7ebc3fc33647f5c43c60f6fb547a33cff642d9f79dc39ac611fa770267d6c947324c6d45b65393421bf4bd7068abb93ab3a36081a303cf37b90037749a046d478 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: fa0489f3730100609488e951e6aaa15c0f193bc1dbcfcd013bc418d6c507b176 +public_key = 7665cd165e6d767a980e05ba44d761fe17355c0aa302f3826edf5da4ca4d045cf99dab608da967c2ef53ba87e08d05ea15ae5541763f737a89fe06fce1f7b4e1b8b77ec7e9a84377bf0d81f7e7ea6e98ee15578603867855d87ec04b5f1f133368e43ec638ffe5fbe6936ad4eca9e6cab9d031f4dd99bda8ced98979fa7743bfddcbe84c682f3eb79f5d7b2be2e07a47677b56ea9e602a2d4e924d8635eba66a6a844de5ccff6aa640ee519013db888ee01b456289be70bc1e7584c996c95e5262c684a57e8f8b369011865c7578f7d3038d62355f4c994a53a8e5f4d6b6dc9455f4d7ba256de02927dcf1aa3b0944574f6642c446a3f22ecd08c7bb67f7f39eae47e0e9c9b5c57b902e82e00488341994f72dc99978c818aba5e55e6efe23690636cac06d7c438cc288e944b3446b42af64b88c6e047ea08a2cd2704cf1a0bc5d73e6b95e7b5fb87c6cd444e5afbf6f92abac047eb9a7b7dea51c88e12bbcdef7c3cd3a4bcbfa3bb846d6b25c85995df11234d0272a616fd4d71ecfd560654a7dad99a7dd754c43687d9657b1c8e6a04b8d4cb63d0e3765e228890e19d7accb4734cc557fc96ef7fb6b463cc2fa5b73b70cf41f33d0293de483e66efdd4570365865c18d28f96609377703a33d0f8eeb9f493947564ee0ceaf528bf8aca7374d28f72074f6637965870e9b86ccce15daad4c0e73e8b7a866c277da3c58e0e2d94fa285e2d05af7ef64f8eb6e46ec4321395b7f30a6e5227eba28984b1e49726b48ed259638f6bacbfc5c2a4baa3cc49ef0bf9e7f7ba3a05dc91174fa63ebd3fce58bc6f09fbf86e656add4416af6eff9cf71fa9f1dde3d2787959f5397b70d7a388f7569f1edcf26b67fb2c3a2b5f714f5666ba7f6cb775c28a79a4164ef13e4766c954ffa06498f6d5a1816b7338f9afb779a40f2670221bc5f03e978686ffc79bea25fc9db8e362f11c9f375bd4204940877bc20abf5ae7f461c41ad193f66a95ab7dcd8dafeda4d2ac7f5dab23c1abeacad633c462af6790865c21a960d338a7e485cb2c4fa8b0963b8689c9d4287643b8685a44e333dcbbd7637fa277ec1048638a547816fd7b255ac115c8bc32c6ea37aef8c70d76c3464fdcefc7c0bc5ef1e383dedfae8b0457411ce9ba1c486c8dfa9058d49e85cd1e7569eac6b3bf8f87ecace95c3bb0b5ff89538f3832c55258dd5ebd8a8bff9c372095be66359c9ba738418da7acd9567db7905d5dc36734cec85e9e8e67e95247b48a65a1e34cb942d741d88b429e2f6a4097beed37edcbc8a0366d6e056a89a8487197039addf3df78cbe7148a4f0bc84bf1ecdd9057c97c0f8296c9f60f7deed1a675bca781c53bcbd6866b4bfed8d059ada7c6b8625e95337cfdf2f7ece985f8379bffdc4b6502ff443fd4b62494f9b67a4624769236f3fc12f3e16ef66ae2554f55c7be163e9e803b8ce0089d3c04b65ec8340c483b2ae4c2b8ec7dab9eb3937dab7fcd4fee436e1d0d8f61c46fa854363287573d5dc63c4bef94e5ffeecae3aec5c9262575939d4b00ca8615469df5539e8f4c627c1ebe02e96d17189a80f37da6dd8db81baeb7c34b5c58ab3cdbf5af4cf9cec9364175b6bb5ad4b595807aee8d554dbf24538599cec5493f7980297efe63ed4c14a9360b8dcc173f6536b761bfa6fd59bae37fd87999f69c884a966c658017ce66de451aafc61266b344f6648accda657580130c6fa0f6565e9ed0f063f011945c40af96de184750aa93168fa90e6bb9080971cdd6b470f68db4f5f9ee6ebf9706fcfac5cb535ce570db606dfd351e1866d8ee99dd3f9d713e6d7fd849d6cf96d76a8db213d6bbab609e7a9ac05c7897be50d6a6fd2476e58f8697e63f901f5fed5fddd6713446416f3891b9f21fae7ebcf6b290dc5435a8e4a86658e3dde59c2374e1dc5f94dcb30dfdef3643e29274585f3d4f0436396d6666108ec4cd273b94a3740facffdd18ebc309602a2cadd82aad35a46684547d01c74c385471771e3a697b49e6c98c1d0e7b2508e8e1acfa040fd083dc5c74c4c38b77d6e95ce0d178369b375dfadee81318f4fe99ac4aff4a682ac23df4f9f8c7a6d1a89c36f82f0a47379e7aafadc744e20fdc9186c67784c3e6c8f3306896fcb3d3ba06e409cb498b2e643196ff00198c26ab6938487dacfaeec6906ae45303ec7dbc2889a8eefa511b82609b980dad54ebb3e7091e9d +result: fail +ciphertext: +shared_secret: + +# Public key is too short +entropy: e7aa41194214caa340115002a25d547f794ea33200dc8a9ee0fd033e181ac23a +public_key = 29b39d84ec83b12962ed6a6d7f859c90f8995d150c3c76a1231002f37bb369f85da6ab37f1b196636754151bad6e8a5c8ed1b6ec6639925493832b5df0415858861a495707f0f05c32d226c15a1470a109259c4af6919210180041198662374bc60cb7a735753dc10c2997c76b1bc1c53a11390169898c99efcc454e18824304099260cc115131255575143b9a0e563ec8e24a5ac138df875db356475b368eeb35bf78621ebb70908ed1812e896c0aa9123a94326abb3a48ac2eae206febab0e46b9bd7fbba7e3b91a0008b83e00385b968db5e188c58680b21a6f76fa7439c68585705c9346ce17000cedd60db7d39fd4f2c6e0389b33a83533544077e432ad58aa65c2bcac922a4d800177a68571e398a2d82e96ec111c32c03842212030416c93c1127a9efec75518fc5a1b3955957b5868f558b6d8445bc8650159bed9b2084b24c92a3cc1b45787892c0c01667f62c453b9c9569458c584c35b800b5863787e13661dc6a65980ebc20d5480eb058558fc6be0857cb8e86d6a5ac3847b0047fc7f65704f7984398f281465c7342a6c586422c475e67103ea2cd0d032ff152f38e8a00b522ff48653595ccd591b3a0dbc55e2292180910dee3044f78668a6c93c26 +result: fail +ciphertext: +shared_secret: + +# Public key is too short +entropy: 08a1233ae8451c8d300783fb93056849f6bf554252a4c35a517d4bb0ac28846a +public_key = 11a302f253ca27b1f8808e7b42bc4e5746a0e40071560f872a4ad8625d143cc4bf5a51abb39c39a60de28750c57005e0aca082331650614a0bb7b626505fcf53139a675ef07a000fd31f4e38296008806227b4c45040dea8144076a30d8c224f9a7df0201a0fa539110335ea5246873956630a98e851b86687aa1eb91746e63e1d166479d2a2452b4b0291a219a0c672603dce380a7a8b091427499309c87f275df1d6b551b394b2dc18bbfc76267c6e07cba8dd2091237245450ab5e5d7a57158183aa110cd1253a829559222c2f3d3796c480606754085577e6d271f46f80d4a1b75d126125bd1b80d03178e47c705a7888a26c0aaf60455e221f5c821cc93702881bcd7d1849e7a8e42f3c151913747521ccdc895c6661cb2f04007d2afa77000f2a14817e59796401222611ac5513fff91c66e059cfa2bcffd9054112164cb725576818ccc6a91f2c698c5b2c59dcb1165ea5fade6cc0a466dbd357941f40cffe8af5041a8da610e82753bebdcb45859337151b3d5b10df7ba6f0b8a3d45678c6a69768de79bb0b069e363c1c7a90e16734633e14f3a1c927380aaafd378262602adf53c55e500242621074a92bad4221ba2552e24a89c1282ead295039c99fd01a761fb83d9249ed1889bc204a132c81be3892301874ab768882a86ceb82abd3af084da64598d002a455bc0f6645803a36f9af7689be7b0e9275df5dc6ea9d87f73a6424fe76b1dea51ab41b2ede75d202291aae3c89bca743337541e61a327859127c24671a25194c4290eac27c525b624210c26d14bd6f4102c700c6ef333570c2c527a2d6a3c34a8ea78e179ae0055460ab3b57dfa7cd8c250664b2cf860a0637a7015aa097f758b2a43b1b086afe217400d131d58116cc8cbc68746b7570b4c0704b630bbbd2156ac6fb21783637768d71fe22074fd9c215bb16701d47b37f57aaa833e4227c578e75725b9823b9c1e0fa01eecd0633ee436a1322be86499b4f50710950859c7061e46a42b8810a47c9ec92a960bb622f3e1baa2c7625708b7508647bc8a68b3920a493c9d39e57745874bcf63938e791723579aa4b10eb006a522b54de2f9348d402c106460f37a9a8b50a4dc50c439e7354424a17a643b61391f84b611fd069752f6259d34c35f061ed1c22fb9f6c4b90799cd92cf1ba5a5a50673eae126600611f249b77234b948158ed832056b76c12145357747430bc38525253ff850b1f8c176e2f94ceb2c25d75b5dce82b950430461eac1dbd43504c50de1cb10a404506f59c9160c87bd7bc56f86499cb39073262972354c36927ad5048c624bbb5d94536a178aaa790f74358a1dd7625083271711c55796338b97c126ca224227395bb12c57b5330aa2407965cdce66382c075d71013ddc817c63ab0a4af49a0851182777288401b969cb14094b44e98036bf47357e550a8d425da5302da69c7c6ff6109ad94645b476e769ac39798a4f36b007d9104298b798b66e3bc79a7eca308884063d608ab30c376b13a7859ba7c676a857ac2fb4b238e317061adcb7dd013fd666bfe4f910fd696485b7958c87cb01a539c76abcabeb8b2e3798787fc25830c3c411a3e59b +result: fail +ciphertext: +shared_secret: + +# Public key is too short +entropy: 9504db1b73df385fe1325b11ccd3323052f0c861aecd077f1128a6a70c96b530 +public_key = dad163da1a9a77567f166430d7f8af8a6545941b6b9ab2c11e8695de1990f351965c10bb273a07b546405acb50ffbca731ec2272f9537ac2c8b974a4bd3300c64ba458c0a0f7fa6edffcc01d866b968a17451411fb086a8c9a1ba6c623d4e14b7fcb4e40e432acd57f237134fec78cd46851bea02d0be10d3f86bea4f8ae12bccdd92c4b17276d2ccb341e162fe80c7ace16590aeca8efd49b819aa4620c8a3f7ba9c5c69483072b710c1667d0256244661603cc497a88c942acc457baca9c190f1a2005c013bcb44d4b64b0e157c37b70cc23f890cca7199d6590dc5a55092961a3d4b808e58b93853aa57053ff070434ab6a0454123cf024bd5bb7683a1ef2000456452158957bc5f430848660bf64498a94c5fa06348d4a3a9512b2419bb990827705050ffc621373e5b386b78840650ec0d981d6175cb7a7a9c27243fa561e3283c18bb960 +result: fail +ciphertext: +shared_secret: + +# Public key is too short +entropy: 985a506de024e2a8eb662da102bc835ce2ba861c6cf4add4c9f09a4fb826368c +public_key = 034f63d80d93b240fdf3294ea3034c542acf64418eb6584bfc2eec3c6eb92c3d639239d7b887cea71b649a5d076aa78c74939781557cf50419c20a1a82350e88431703a21ac3292d89025416c87d46440be00fdbf13bed8416abe280cf46381bc2a400325687132a3d2915d6 +result: fail +ciphertext: +shared_secret: + +# Public key is too short +entropy: da47de23ea8d972b4212f0f58a0fe6fd47654c86bb490a8b4976e9c14f4b6ccc +public_key = 9484aa45883e1c5ecfb5b9637c66fc272c8c8033e2b7a16e81aad212461423b7d886bea7cb580c198aa4426baea23a457122739cca5f3383ad9057a01223ae6fc00e874990 +result: fail +ciphertext: +shared_secret: + +# Public key is too short +entropy: 3cd670e828af82544d1877fc27218314a90f6d52b8676fe2a1e6aa2c5ae5ad2e +public_key = 2548807922b7cf9a3d5b5c6762d408cdf6cbc84c3e5553907233a1542c3a3e09adee78845e087f81d81fec6690f63789f4ec99c1 +result: fail +ciphertext: +shared_secret: + +# Public key is too short +entropy: 37093904498ae4743d282481daea6c1ca3178c2f1d626696273b34323d8d837c +public_key = 8267516418aae882a1d5a51f230d831bcea7c8aa543ac2814856df2a3f440a9d8c9544a693359ca08533416d0f087935d51974eb00e3183a70115715e98c +result: fail +ciphertext: +shared_secret: + +# Public key is too short +entropy: 71d027342e3fd6d3d6fbcd3c8e00e29ea5fce9664fa7c58b615f5128b67e061f +public_key = 9b6fe56700676cb7d4760361b45e96797ad745671e925898d7bef3f03e531a6614052e822c5ede1544b2751e6ab55642b559a6a114afc8a056dc1d7dfb9ff4ac62b0431d20c195c8270e93a29876d0 +result: fail +ciphertext: +shared_secret: + +# Public key is too short +entropy: d1bd79ea1afb6b51ecda5fcf663a6ef8074bab232ec352866bd122b8ffa75adc +public_key = 68d31a7b393d2563b8987531bddb014b7671b976b59cba +result: fail +ciphertext: +shared_secret: + +# Public key is too short +entropy: 259b39143face8dee2cb8255366b221caf7fd595b3da4d86c63c9d47583aaa95 +public_key = 3ec72cace317a9d44a582cbb3074c2ae6527986b797ba639c5d0e79fe7d1340bb630196073751415bb744bae046881e8024bd73def994ff067a8f7c4301376cba606c0c7701e8d4bae6097a3eff77ad2a9ca97b78fd4871dcc568fd1841be189a0645aa511f2c28c8cc521ca7dfbb841c2261ca6e1ae37b1cc7ad1b95e671061060e33692892a7ca1feaad8be5249a44c15507c0df2c2b9767656e7a42f7fa378792b819555e102c23c9177e948a375578c6b6f46a4ea88794777903d6596a78b2ddd71dc5d96aab009969ecdaba3ec7b4 +result: fail +ciphertext: +shared_secret: + +# Public key is too long +entropy: 2fa93d1de7c718780a4344565540fb38cc33692b6feda37e5ed8e17a50637b97 +public_key = ab62cab7402048a80832467b782bb07f74911206993464645555acbc7813ebcb1d5dec3211c6685629c32d69405f1a5a57bb6fd2a57c8bcb1a3ec17a31c0029e813c73a4353b7906c1e1bb2d6c8d23198c540c711cfc9662f66a32db750b10324a33839c20cdaada97384c624ab528728883830792126c16c68c58b9c52852764b4a7333a40143a0d173f1f4a99d6b3403c384a95879bb569fcfc94b4d47a24d628b03459555bb41eb63c7806273ef70cca10b0e97667341702a81341c79122f1097cfc9b7bf8f5810e2104f707a5117702b7ed54201081a1e18a4e811828257691b429ffdc214b6d38df9714b0073a863a3a310d24192905d999ab020f834a7695f2e923608b55284631b6d6330e42435011b184f979b3d1ab35d2aab5ed430a061029681735491c0ab9a966e9c159c35c6349a48269346a096006bd19e9bc445f1fa5c71f329eb215e4dd064f955760f08cacb834a92157ce51567a0554fe8ec16e751a3ccac743f3835392466323b9771741f9f3166a65a32a0983ae86ab074689b92a6509317b527420f1e1b204b08cccd9937bada6317b734710cbb97555d9c44c2d1b567d7e48ce9e7ce9f95ab8cf12734f3689f6c0766c85381ea88d916aff639c51d176797360a0ba334cc95993fa06b9a580b415c496a1098889371def5cf82bb8b381b444248ae55966991db2c6d598101978cc9288b08528919937acee3cf64bc1ea0585f479570f554566514956c05474a7b3bda7947e3288e6ea7651ac0c26c2953dba6cb7cf89f71080834391dc596c235f0a173444750d635b5565e47a5a02403a6b9402358633b9ba96e23635caff289414a366d99b6820383e3b88959c31c3f9baf0432abb0014fa4c15a6038c19fb98794bc7fe31c0d8a04acbcc043c096aebd9a64ecc3123ff1cfeb46a49d94317230a53e74914028cd9dab915ee769a197c504156629640ca2da056df727f9c7023828a8328a7e11245b2fa64d04f787ba4246ff9261e1c21e3c43cd90b89ffb8349a980abf0131ba17235bbf12455f2c16c693d2c0c081ad3bdbf73a69be0c7932766aa1cb6ac4240ea39ca0a0725b4d84bc56282a4b013ee960340f49216743390780283491ea876b6cfc934abd758d68ab04d4a06b0201a6ac74d879539e1476141a2456de730f8d696d3e2c557d4abd9470186eb41fca8a710198a7914a0e7909755272f5c6222af704773c3353621927722114484880c010aac85148e10a26b5bb2a3811cc9306fdd9c6704571834da22de1ac2cd4a0b773613eacb701ee364de22c03163628fcbb4cd92bd91e0cc97bb54a5324396e94745f48dfdb78a8470a29cf29df146ba1592108132094d85cc62d5194c881a102b5d5acac44ba72281f76a3723b78c301a4041ce2c6581a8060bd8a01e00744f8601718cbc8c75663d4c0549a499abe2d706f3a232f4397cce1031178545561b5572681e1263af45e1640804c74ef4777d773b3fc127e8f459b88aa65a600a0d616c7d1b857e6247dbc077932a2d517a4b74cb2537a525a8672cab21a4497ca1c96c640d69103ed4c0e7695122bcc9af3870fa9863f29a6aef05915c9459c3d6967b79531d5ba431041cc7d06e788a474c6098d18a7b23ca672af95d154b9d789605ce54c7e10010293b46a5ab4315b0544f381b4b8a286ba214bb019c4fb153da43bbad4621cd412d0f0663a92855edf6ac6e6a0e2b5cc59a55b7aef4a49e5b9ba9151b6059bc7a9ca22ce912ec3167268b6d6b483ddb7cc18dc64c987a05aa86932f76afc78317a82488bc722f3cfb15c5f5a5d97175631155765b6dcdb852dcd434c19cb75c4b02d80bb02680423f7b36ae51560ae73edda75c55d52689627aead65dbd40880f5b56540a1db5db30570738e2e88ba305228df15004b6c41c4767c024cee8ca38b43c93cee03e55a4b3f7e91049b29ed57c9e3bcc2349168d5ad2892e5bb59629c280c27bd55602cd5504ac80cbb3e497a5c741fad3032fa52a08ac9c762c7cf8206a1e283d42d6439ee02de16c407bd849d431196971018db46150d6bd10d21a3c15cde5129c8f19c4c37a4e7df7983739711ae4be4f864cba2cacd308c3f69b70a43a52d6e83d901018055a7f7dd57bfaa5722a023967d723e49716328b2523500b61eb5d057c23f3a6544f8f6ceab2bbdf34bbeea1478f41e5fd89df8d8fe7696e064a6fd08aee3cba5e50638d145c0f36fb0adaa242c663a98e1fdac1766dda3f3d0233 +result: fail +ciphertext: +shared_secret: + +# Public key is too long +entropy: 3d36c670e23059028db121737c0ba77baa3090d7ac3af5239220a6ee6489ad85 +public_key = c6509c9beb695778965915570e0b3d95b742e4964255a45667269fd3825b27292b3066153050a20af3553d2b1c3f7c8501f187721c8259262015732ac447c625a25d102507d7dcb3e150c0fb867da426798d47c5b893445ecbad9aa1116659393b751c9cc5b4f126764a23817514324c1616f380ba8230a196314810d49ec9b81d3c48735507a973190a08346f5aa23a6a0831eb23349b723583488a0047625b1c00c239257845c3cd881ff7a157c8e9bd2bf1ad143c4cb7a114e253220e2bcd98196d049986388553530086e97673aeaa1e9dd07b4b37a861478ed983a3fa78b71736b572cb22641470c746a4849c3431c303a8ac5c56b949d88cb214d52fffcaa37e4327baf77c6e2276dcf72398397ee53551d09a2a080aaa6058175a823e86f32483f46d583921342c8937bc1673467cf3a141374b7c5845330311cb8d75194a4bba09832ca9e0734659807438315d254da7a39d153a07086a4b01f810976ba32f3725572c834362a0eb93ceb23970e748079fb52f7b10cb2a9c2f50a181e9767ac4f50e35f1cecb95b3d43652fc062bec472444b70f4f7c0c24a627160c7239ab5c59b526ff370a530883dc953430f56b568cc74142b95966c08635a2c69759fbf96e2e21c618cc1117860379d04ab1959039c1a90361cc8a833807eaad96e335cb74b3a62828ae35966e9a417d3694efbc8f55367bcab4c2a3a42135d022a893363837b4aa0109308c7f70c972b3209b5a2cbc92b21ef3f96718692efeb70aba92098a8a17a5074969010aade155b87b4f8c9521ffcb48dc575d0f60c3fb2b2fd12c3c4ec94438560944862653480b3ab657a4920dba893a5c9b138e86a98e69bb71117e364c8be110bac7e7652f643ee9caa3a91cc41349a0d1065e8693b52d2524dfd52a8c0902b6bb3e76eb898f036609c3bd1e2c6bb9d537a6419dbe068613814bda8359a0436402fa62443363b901230a523370278776fcc70eb10a08fabb5cc04f4b5c05e4c64b8a49950606b2f968a0785573c31274bd019804133ab1954afc98c30168a144ca182b372334f73ae1e67068843953980d04e054e9497241d885c8e2053beabb92e00a2cb4cd99b3067fab0aff684723773645e4736824b4f849832c369676493fa85a021fdbcb9adb49fc0b8e51710323c6af5b542af7564e6f706a40c6a6cf66239cf76560457dd3a220a35340a03a16e6385494d59e0e6866f8a0b8e7d09343706706f184ec126513187b6835a14b00a123066431b309d648ae1c490f75361c61467fafcb54649ab88a629ad6f39492d7b53980112910af59135750487003bba83cbc9ef137157cc48cf651415f88bb693b9a4b20004043a40d9964b6458d89268ea8155d583c4e06895be2737dc37729186abbc047118474bbd3a19fe648a57a0c5f67f226f858ababb73075fa9941a54726564ae31a42b4324e24b6a594332273d9bcc50055a94062f12454a8193f8085c4ffaccc520613752c74a555029e0532b23c787d924efc0023b495a9007b02e798317f7b079229c3f9fab7bdd48a061468c5e88c528693d62c8dfa7237b1c28c0cb8a6f8c3726bc38774a99b2596389a6a101d543ef1f9bbc36567ea4b74cf4a82ff243de5e2a16a7a3db9cb50a4f6bb639c482859c44f62555932488c0112c2a53c614ab7f45a7916541824c0ad67720feb0905c736532547cfb6f10332556a39c2632e549195ab749192353d337ed38a818e82ce6dac7251b973f749bd7092426c7a2ce4ec25218c0439bacd9772cc1fc740588c24e29c750a8c3534f60c8c1bbeb7345d52c70ae5764d8034ccabc2b6abe928ddb113afd8a007b06d081a66403130df441dc85932103589eac81691fa66e12682e014a144140cba401efb351d4c176df724113acac4dff07a28da7459738580d5bbb383c0443868a143683947a114d9237518cbd2a8312006405c5c5215412c342ab7230524a56039c17a4e6b5b9ec0259c034ab24da48b1c09b7e7b6789edb1a6450862c9cb714d8575bd22b0ab333b51a466c70a3e3094bea952e7c79cc05c710ba64b39d0abf3e70406240816bf617c1d6ceebb5660a3aa1587685e1b9c2afab0fe7417d08d748e5867590dca3ffc41699d977f3549d5ea118b9195f187838cbe1753ce0b6b2db4395c310f0a46a39606a322e68dc022d4a0d6840c77e2ebf4b602790896d11ec9d18a20295e16f32b200498e02e16db3ba2e434de9510b0b520ab7e7041a2e61b513b0 +result: fail +ciphertext: +shared_secret: + +# Public key is too long +entropy: 82901f10858d3c07a19dc72d8768398c85e93b246d24c5378201c3a43bd4b356 +public_key = c6e4cdc1f4748bf11b6fc320873155e2042d52d17d1ef1b05bd3bf014a87b910bde5cb72ca8c6e9059ba4894873351aa89a4638f39bab3301eea98271a49b440e549456b59a24b3dcecc7bae0530cc7286cffb7549f1a07b840b6eb4b9be0a72f5d61ca79456b8542883d36c72e98989c037045c4b2d6c70c6d31f7a366f23a22bdd13921e01843fca6e61f0049b348d11f730d8100d9447370896171be637f1ca815bac3a8b39268355523140051ffb98469a2b84ba055434371a42554aa4344ba710f130256015cd2fc7b9188a9e0231745511426168baa23372111bb66011a19442a7c87acdac44935e98aa7e5237f6a9cb18370654ec4c0db57d0d127b186396b55187c19bc6bd074ff5e47d789a6cef698d6270389e7a5fa7381083f1bb8e3c072b832516572dd7168e01dbb923a02267aa5a3c86a464b6583ec726f2c505b4a3a20aac469132a96a967f20425b17094643047319a2a459ec1218d4cd1c87cbbae3caaeccb0a152876bca4f472211e8564d9e945579e99506bb6dfe0b13bd42c9195876356811cdd74b60697a6bcb1ab918a66fc24059b72076a589ed33b462b2bc593370c4d294ed7310f06b860597b6a9d189ce7aa69f2b6b8c486a22d3991ffa4d99d2c8b6395b83974f8924b52eb153bc492ca9130c6fc9caff5785a71976ad0912e7a76ce8c99bbea4a456223d296568b4f257b594cd788590a5ea4378c302cbb30de14c74aba372c7321d78341070406e8c2285005d7362c32efb880fa9dc6a4d339232e57a3036aa80549167a886ff14b2711388ee81881b6062dab241e8f65ea87263c3c96d69b55fd338b28e2b9261848d215047303413b97263acf1a7872675577c341c8216d2f766feb96fdfc9baa073a82aa739c098a24d644f89b3b980a8a3f1890aab89a181ec87ec771ce7d5085cd87890777bfb49a2d97639f749497a011ac66a4ef3702c08b4325c1056a64907ee6b875883326751055b850ba72c9773e89b0fe4382ab7cdd675cf4ddc199910ce8e58a2c6475f01f64d53607e8cc13da51916d1b99e590abd06197c8dd54c63463edf935b44d2c1ef54076271bcff558f05e47880897f5b7c6e4e788291ba65b175201d7776712808827a48eea6485bf0ab3ada7ad5a50f9fd12686e6a906b255ecf518868844379257ca51c55a979a7ed72bed30a7ced1908fa26c119abb5ddbb4490b36cecabbe032806b0719a6c3cc7f6a9e55f63bade297226a74dfbb8087911f1e4a3327e0827e79a11b6689faf17120aa4fc4a269f8d92f00a012f5a06840a600dfea9a73c6a26f193860698989969bdde259d839a503e24572ba767e56435025b4ba9a6ce7a8c53de49eb0c468ce0597104593adf72798801392c2a67e3ba77d440a0f330825a490a219423720a8a734425a9a7186d70e87045311500600201a070cc10839a907243e2d08b55c344d40034be6545c48b3b44be15d6a7a3ed7e071420440329049746376e03a9f2ab6bdc33b1fbac28eddf34ec7e24c918ccc866579347a34686c1af4236d520199b3960c72067f84a837be772405db24c80604c6e438b74c51e05c9a59e42c174b5d5a910156d57081465d9b6c06c8e31081260c74751db1083a537221927a2f1eb9c6f25c369809c643f5612c76711b599b19247df4053b93887e25e163dfbb924491804ad03615f202af948fcca23458d0171c40a6f3a6a76f0851aac2adee57811ac66d93869853240744f36ddc2bc8cff6cbb83a0af9555d0d649d8a120e45853def02651724a9dea4a3a335b65d445013d48c1f260a330415142caca1a363fd37502c96b0b65401905b71e823983e7740f5d0bae718b42ad7c3ad7bc05195acad0a166d326c3a2344e7b977447143c7ec6d5bb527fe67b7f7aa5bfab290ee1152a9a541711c20b0045dff2a20cbfbc526d27bed255ce1b68ba5e876ae546b3f7691cff346b6ab4b11244018d729592188ea3808f085398cd94d3f4c2e55d4915939b08efc7442c643ea71579ef0461d3076c6d2b0d7c580c907059eb7cfb1c029251cbd971a4d8a0053783a128e5043918ba68ce859b211cd70ac81cd9ca732323fafd8c24155543b711451511e6cc5c916931f61285d3adc932196bb33f16670a60da2c6cad049c6eff7922728a0a3247936a3bf61735706531c9dff42c1f364c0b000a7dbf16d6d296c3f670a539bd9a372e74bd06ed431bfabeb668d6726 +result: fail +ciphertext: +shared_secret: + +# Public key is too long +entropy: 2a5cd1c9cafa6f458df60e27bc5fdb21432f31d5e3fd9872c91c5024b83a4ad1 +public_key = 46892b31e87d774656d9ba61e92c45d184559c08a4d9dc6949d9b8480c95678bb0d2b804cbeb8403dc09c1590c33d43fd1ba33be15912993a3ead7ba134828ec105bd80b79d77c58c1299966809d3ae74eca16a2845bba6723679308918a7612ae28a77328a464b9cc5a98171aa01395c39fd826c1286c7ae2397af9fb47229ab447b854464b039cc10bf21c9f1fd85215b4971560316330340fd3882588884901b7c531911ebc0354907ce5714549fa83ac606addf3be6670cf126980b20c311c75796a92c672e465e9b400089c8bc336858964a0f7959945395809b625b8c103eb06090e16b27dba47f5a4a0c5638f202c7327d53bec5a4d80468715f45266785ae7033bfae3ab9be2a3e420445141110bbaa558037b69a586626c1a865c949114740e96671155957ee839c6003c99a9917e0c713ac95f6ff25e6931b1190376ecdb97b2ab1dab28a812272f1c2a44d8f0862cb2538c9a2c211c1c1da57f7790a3a4eb7c1b86bd5cecaf6952b696d069f69c36c201065dc6120cb16242261b5113328a79a467a20930c454ae67ce67e6ccbeb3965652c721e2a3b7d359f6e7c9cbaca4f3231c61f776acccbdfc218ebfe08b2a8b4f1bf92e125184ae6c205df39afbb78076f4933117ba9ba2449a11196d1362d3db41db2585429ba35da180c02c598f7a02d4a47bc77a5d3b12ce9bb928f74c7d3b9b642a0860f159066da45e94ec6651c13efd3a802246307f63cf61da2b04bb05ad3b61a2877c32708a1db42a87b29306272c59a406bc8ba1a074b607f9b44bf657a3284b96b1b670bc08fcacbb4daa3a5c457feb2289c2392be8d704b5b945698b191bdcbfb3ba3381a7bda7a56a6080ae9455cd08e0ad405c0d770586c396a75bb3cc4b77530da82a810b22a8db14bef3092d2b5cfc721b01aa4aa1c09c94b549ffa2369a9a11e31c2a13d1c7f5c32e8f424b45669d2a83a40bcc27854bb237fb62fe051c032cb4e3c08856457a54cbb7b824c64f8996e9764527265ea5dc2cca62519736cf95421ea91bac2c83a35ad59bba12069bd60f550042dff205c4005732912336fcac988c66e347729c3c7d549926af79887e71824bfc87b7db659f4a60bde053f5235602aa74bcd2aa4b46bf4ff28105773016c4ba48d46508e583b8a09809562b97a66d1561506f05945e2644e83272525a111d51c8ea79401d59a82da103196a9a39bc2e0e651b24096bfe792039292539c278b1a6a43ba6b05b6aa05437bcbc9297bbb1c81596007c92c6baea538dd36c96bb9e781842c7eca1e2b71adab44ce6248a14552eef1cbf8580c53bfb21a1638970d9c0d845be06d9c8cdaa7f208a1259dc607cca3a457a7ceb62448d790686cb096159903ff14ee7f421a1f63d49077c890459ec9458d4c94c476c16e7f38f886b6a50b58e875c00787835b806181ce8661bfa56a0075a04b4043b8aaa92158177d173a0d272b0e18af7bb5960e6859c9065d30345902290b7cc85800c9ffa641b537530c6167ec2d233e5f398215370c0a773eec9bad35b6e008a05454963d1d5cbf9925ade851dd9a7090705b9ea47427e1615ecb0c542576f358a88b2f761b38951b9d9c60cf6b03b95a84f9040e346795e30cd44568c48176b8a578c7f338e1565bb882470bc2c48409019514b6b64a5c464ea6e61524164bca80235cdb0a9775ab93b659102e076821a4c13a72428c724897b169087f6abe68b5ab399a16859349dea3a539c4de2ea2c4c1b8fa766c868a88a0e54042fda68dfc2cd7a76322dd8b38e367a46ba3606694242d326eca12d78fc0a94148acac93c7ad8ae4344363a20a23df90ffbf8be1d4c931dd3ac6bb8ced99633811192917ac5d7e2667a43ae366c9736a0461dd11a21b3b699e97f5c35b414fcc15508c846fb5d4cb0cf252104ad109027723dc844577411913197ad0d497b28b740cfb816fde3259ab56e0dec2ebec60f1dfcad53c64d00878dcb981f07104e76760ee635c62ca233b044632698bc4ff26ff1b6cdb611c882f13f0b975ab23b1dd02c7d12691c9835a6a9f7b3f5e84287e8573cf32d63e8922b016636da3667a73436b6a9de3654c924a5d83708450289cac756fed9095b13b5bf48a6e0f2cf3867ac7e131c8725339b4073ea7929daa66b874aba29d20a7c4587bce99611efa28a60838e582fa30c6977654b872509dcb184e6845b75c82899be9025c351c192d27e6cd58f +result: fail +ciphertext: +shared_secret: + +# Public key is too long +entropy: ce3eb23bad9f43d6b1a9763e5c7705346f514ba7bbd5f541ed0df44cbd91184e +public_key = 242ba6b2314f45a0c471018a05b2086fb5331cf2b5b20946e4036b5f642f0a53cf8916c2780a929d1314528492af610d279b0b6d22905301c4044b940d2c49a69219b1c0ba749839d293322bd2bb2b31a2924032e3b64ec0525358c31b6a08713fa9ac5f2318bf291944447c0bf9321457c358e89936a90441809707f18d56d11f9223696f7a6d41aabe79fb85faa097fcb6c5993b0db7e0c7929b05b23747c3408abbf87efe2b5525ac8353e8674e6018214272af6b884e495e72d007f40ad0ba5ba2687907ea1856a068c9875b517f5b8249218bfba64ffea46e1254b095e56c98497943f7a5ed12c8ff680b722abaf7ccb7b5c604284939f4175f49d1c86f827955a2412f201441d2107cd720f5247b85612c2b400d17d38f1b8a6a13a12d46a7cb2032ae65d37faf1920e50482e43ba04830aefa90655e3c47c5168fdf94b0428870dd89679af12625592205856632690aec792f2957b30cd09b90d80f1a876f33774c45034e36a0abdbe799ca932430f4667978cf6624b136f5957993b655dcb643a998124acd872324b72249cd130ecc64c75c2abfc40cbd975713e10a7f994a05cf0130db2549d037891ff777830551a30c3422a3971f2925d824a1d113c41b33b765761d55c93a70833a25b8268b8aa880ba0de4402dcae88f71d7b9de5682ec66bc32288d957593c9778e1d61a8545603d030c5c39a51338526b19967e82458c7a6b66b0a4f71f273a084648fa03b48972c6925350e0c304399be9584498b00c13d000ffaf0681ab6332ca7b2e9d86f74744c3b29259582bf1295b2aba005ef563a1a28c2c514b7d30721429520223c5afb0328d099c4e032afabd7a6d58b3fd61a42c3a4327c617df8c5540ed681a81cb70dab0eaeeb53b62bc9e2ba3640a69868db5f0dc32c341a900aa25d29d17ff3e71bb686a67c8130dfa28f3c5c67bae27056da550b218803c187d655b85b180ca1427f580b69d20a4fe8172fd5d447558c025b919bf6eb080cc8af26e06ee50969de26c47a263d4bd16c39f3440ff611f653cbc6a281debb0a753c4f80799f41094b1ab902bd078e19e018930aa00b7b14a22948e884c6a39c31acc9bc1f4c320be20ab1193500a9c07d2829f8d488a2e1261be56f38225a8c4a793889b2263814df55672c6abff05240b2826f2fc8190718708589580e084d06dc5102ab5cf0b71c06d716def95781673fc2331640fa8990c262589b5830a83595412dc91595d6a21b67578ec15aa4faaa0c42611ebae94ea1c342b4c59212593fad6c5fe022be870544eb473df0d10c9a1c824577a91bd91718d5671682604166413786a26e541ee45b3ead55913b317dd1bc49620a403088bfad81b0c7eb6b05172f86003b70e288a1e3b452655511396eae840e2d260a7da07f35357ea5d58bbddb2525e315adb0bb3cc088922367647c7024647bc9f71f8e5a7a0733ad302994018502b2c41f5f002fbf84a0bd9b3d1e24028192572e35c04ca554c05817b6b82a8b0b9d4eb2c3c1801a125b065f42849f66a00eb623cc9810c9740c4149745deaa9e262534f310329148b35146606e751bb8c4c38f56be3eb7c2060172d0913003d98a09a425f663d31ab2d6cf06ea4e2b2fba58b09034d77c249b7a80488c4368f15c0f0c745b221035de253258004cbbb70ea04bbb0bc32ee910e4cd6be38bba880a2471aa66fbf04aa59204835497d042153def763f9fa7d60f0731f8041935523bd2bb1cb179724669403b677c2f229e386357729992edb1e19c51e9ff41748d3570630c150438245eb053218aa162b0a7e6c6bca967ba117525d698f2e56a9e0019aa771888b08146f900388a25476ec0e33631ab9c3ce11c8182ae1cd93e65294591bf0cc686d874abd7606d208582c5b1b63eb6c892542cf61a227ac128a0c49b4117ddea03122539ee1f7c392b19824f8a19bca22ed69598af0284dcabf01f79e0829cd2c22aa324a12a0a5bc2424563074acd7337d55498b3b918c3dd2c63966149e33ae4c819557546a87353d646c43d47b862613bf039aabb1e1217c885d5e6b57c1c7774f1b11b860179bb26885e03bf8d53709daa6e991a5629b83f26a2de495680b5644b2480a912c651c83c366c2a8b5e58971e45a40e39e1e18263d0709b01b1bb2c4b6b36b6fee2b50314595a44856794a5c81c7842fd55ff0fcfe969518b4b5168a81bf8f9ff1abcd3141fbc6231f72340dc485238e1d64a88abdef +result: fail +ciphertext: +shared_secret: + +# Public key is too long +entropy: ed9a8144063ee3508cce3e15c1d2c830322f875b2c4903d87b3619cdea6f2bf9 +public_key = fee9387b116849e2bff20348c7fa99e9375c9f72733432cb377b6f31c738b985472a93bc7551184f5a0f5cfbc05ba218a6d0459c035a48c522260876dcd067355773b290b9c582aa5953b52d2305bd68bc4940b162da7e61a1b3fb8c7b62456bcd8149761c731be06de70c76b2e1b52de23a93f2c831f9ba6fb83f99981fcc027219f14999a6392a10132e1c3e0cb25ae9ab83254075f597c2cca81dcaf950ce450adccc1396276aa241c80b3398b84360fa2714b8fcbb8376960384c40bf5a442d3be05aa50523bbe469a284aa394aa858ee9630c4329773724c68814c1964559a2eac685a05a4db71ec9e5b413438b6475ba43207c5dc57e103612568567484243d6929d267abb1cb4810d2205285959eeb6221934109aa1afe5d0a9d594b9cbe2804f056be3da764d5c6572bb3625e900c8a0c71d6ba9e6a05bce3970ad024ea0449a5f76001dc3bdfb92a4acd64d601c9acb85acec20be51c83f0cf933040565da82a682e80eaad17462cb6783ccc54ae51a81430eb79069f99142e4e21d7346aa61d6168016304d340924aa5185b40874c62986152d71059c38495163c1052b31c9ba23128ab744a77756de8917db154d44c55a1754b1e36a08f5570b06b31a481b94b6844a5b7945cd668ffaa0bc42c8113d5767ef4ba5b458838a1284031818aac4395c9680b918a11e885efff42a529645f33cab7608893bd4b9120a546971c6cbe85ae6a69c9b44c399f99569582c6f1c379fe35eca0a38f31833fee768f1a2452c30b580039b0136c23042874411c212c40e1063a6ce487be03915ca411c7fb70539c3bf92712c232cc8bbca4e7e0485f2379546fc103f4046ac1c950023ca4e518f375b05fdf6ad02a9a1f7321ddfd0cbc047b62ecb9a3b5366f2dc074c9864d2b633b6306ba70a6dbe61cc3b326b9206945fbb1a0276c1c10c86ba14a02c27824f28a2a23988ace2ad2d21004c012f97c59ddb396fe044043404312acb67c105b673a6b587dc11135c5de8f99d67170f1691173e1577532545e475bdfe44607a593bb2a2a8f920ccd43976a3471417e98283171501ec85de28ae38a965c93bb149944c21215b9b43607c851744f6709d2588ebdc9cc2130456f10226d0248e2530a4c267e48037817c262c85cd4fe98c2b17784ac410fa8c830609d05bcb59e76020f67747532577c599625a416eed32990042a453d94aa3dc76cc024a02505f33c0b2ef08bb18070eece12494a21350d1633f8c19a489369324797ef350d50981e03a9a828022f1d0649f799c66703db5590eea296d1f121c8be8698646b9b76a265fd248b5190602e53a0a6c9285e68970127d5c93c7e1b966cd3a79a8766767b6c5d6e461f0e79ae361ba34365a2ff689aa91132fc77986a04e0d87967bd72bf962c91aa8897f20139c864881060073021c944295e2d91aff6240cc8197b0951d3fd3c1be1cab23e13767e09c408b2ea2b0381f39090f1c0ea6d3384c83a16e3ca10ba465ecf76ef83717442527e0916335fba4f2f574b5da61dac6aa20bcceb260bce450ba7d9c4fe3d99fb3a681e63655b6a8b226d787d3e976a387cf68436a0bbb2f2294613ee07eede17d3739390c7c3306f9cde8a8cb2a9268113a947c3a76e55c31be56c99f189fa1c3b6f266b649a30705c5b70000a9be281402eab0c1504e691b728ca634fb9c2b4d582bef3110bdda8c29229cdf4026fe5708d166cdad4a7058ec60e5925d2794c0906c64903a95d19bcb70e50e19a69bd042c51fb098976c27c97b4867c50f22c9c56ab467dc45110204a099c3ba149b53a89b0ba0d05066968c578182628688664ace5b946033b82785eac501650c35f5bd8f351d38d82b2c34136d90c28848af484682a948a8474a28a1f6a9a8031ab16bb066f141cd328d2d093951378642c6ac97d184b89a67e4586e081989b0750349686f66a9388f99508d195bce36bea703052a2a28dbcb7cdb925e8149c59a80b71c86a04fcb91d286c4c33c4b42188ffaf8a1b73b0859854ef2ec5045480bdbe50105092b742650d7b5aba02937cbe513500045e8d2260fd60a78358b995244c2ccb22963bb028221dfac564cf73bf2a086c8c348815373e7c8420ea8afc1b66a3f2274537546ebb772119169e67672498c25fa286fe996b9e523b668b89fd4ed4de7c1d2d19da73c68224621f04612fa2fcc8b1ea17922caad6b44e261b76cefda7d471120868f838fdc2c76bf95dd63592996a6 +result: fail +ciphertext: +shared_secret: + +# Public key is too long +entropy: 8eaaa8c0471e0cd24bb68c344b2c7eef19414c9b4eeff7ef1da55834d3ee0aae +public_key = 4a3c7390d732f12979fa84989253645bd36e39e317fd10ad41f61b64641f768a6365b14898641a1e8cbc76705fecd988b04317dbd9a3b9139fafea2f1776089295cd97fb02fb3b7b438933fa6649a9f7748a22b709755224cc4799082db49970ae9815b172ca80379d2a840820f3585f957517339894a36984c21c3380929db853bfd1638d9b82f4916c5bb9cedd356bc3f04e41f59513eb21558495c387bf931a1dfbc744a8c396f64c3ad6d16d2f662c77fa72384b5bb4f422b996341be1a9d94255477b6fa1c1199496a505181228525714fa6eacd3113e79585b5239f8622f418067e1f653cd28a2a3e0ca330a924fd976ab4974c4e1a04999cdc81740cbd2a164cc2bc384ba9b8236aad947b07ac5e51b19809c486e32aae5111d4e7b056f1825006cae1776634ce61fbd292e5ca4b0f860b751a90382ec46e881bec0787dd54b2212934c37291b0827cfbeba5dd720155b73873bb8cfd3260b042670045423658348bbc24ae9e264fc8a073dc4c305a59b5eb91aa0303d78cb935fe5378d858e78038244769330c94738f7c13cb2b64e9a12965615d7c10d9449a909815e1f8793e6921637d60a19620bb536787956bd2082ac0043c67aa32cfb711cb2e70afbe51ebb710bedd8a57408599f7a60ed04cbf401cb39bb4223338e2e617c9595687797c6acd0515d6465418a2f7528c6da1c872195c7f94a2a5684acc384b1f6b69d147c1a478c4af7cb084291bdaa823a4110100e04c283751235e33c4157b5aebcb756b8a63958649585b7b1f494fbfc5a7ae43646d8cfed2385bdd23eaa0c668f859ea73b43e4c9713b744ed43c34c1c535e840be9f1174b9bb3d7c401c1864126a6c9b95340c39c8ced60412b2636ca168159bba81818b02b7d840367c61ee228a7032a03458abc48917ae9aa0c377252d053df5503ec81a7db771a447c5a89d346b1e2c7f82074ada88348e05266609b9a42bc4dd788acdcb80120832d81523ffbc5210118837d74f29106dff7888ee9b69d0bc900044456d2607bd73c795071175d03504f4bfbf15137f5cb542f62e68198c92785b3b215ccea41a5aeb3ba57434006677e8479c562a12f87474ca605afc061287670773e023e9607f894201ca69a553453e32fb9b42e83c95637808b99c37dab1a46b83953916d180c482651ff6ba57f5a2cf34e70717101475cc00d0dc1d5b4ab6776045ff4a254a02194d152fbd974849f0b32f3c3662a13ce9d21cb4e7c582548ca8a66f10358b9ba65668728dd7b188e680a35bf326e7e154d306502a5a9d4502419ee60f9d54bd7405a7edb70907e27757c1bdcfd2ab274c76a039a3fc20950a8495b18524650a438b2733878a87b3579325419c840277dcbb8ccd97875989715d4774ec5b80ba0527c703a4f2c28259902320278617a2058a578ed8b2a1158a55ff799fe314a5bb717c7a328d94fb9dd4028d710985177c3d5a5732c5e01a4c18b31398a49f774ea8193755d363cc5654338b12c36a488fd40279d57b6a00899642c5237b2df01aa9d6ea8113223ae0156414fcc5ccf5c72ec2cc39f41b2bf537f3194c5bd21e87c96202e0699da122d5b32e44411aaaa19637989c596793287527a1a87fdf3393519b76d3631883f8a92c14c7889c219562a1e081217c1c8ac6f16a6a20b9381b3e61dc2a7f6a3f9ca75193a8a6077a304222b66da157575859d1cbc5cc978a6cd67623131e30f2850424c5d1119e2ed68ba0da889676a80f5a4fc92045c8a90961e2a9e499731ec50dd88a553e04507f485ca308cff5b29620e28255053b1e16a6a59c860a8bc749d66b2c0c365ff992a23536a43244e00bbe34d8259d53aac199a0cb44876eb5a58754bd0b5876f50b164a5323ca7a20a469752fecbd534474b585a3cd2961a75a4e8d492aa961badd9b9fd246859fbc612c70598af5074c191a414990ff337c69f30937133d665283b335590ac2a7849324c0b806905781a1032287ab85bbeb19fcb6582ad84dbefa6b249129f7e3b68cd93264e906e09b3cbab535eac0b80b429193738cc2540f549786d5281a4ec35edce76895676d6c4952eaf3929c22bab669901cf40397f8c04d815c1b7bc9d7f9080112a57f7c3faeeb466bd645caa009e5935ae0f71237e2993e641eac106fdfa6700a514616cf4fe16ef7c2f61efdf0c11fb9cbceba2e9f79c7156c209d732cee865c0daa7df9ec93ca88ab6407912ddf5cd3d8df99a42c3680cce4866e389ac8 +result: fail +ciphertext: +shared_secret: + +# Public key is too long +entropy: efa2efe68712d67a330db585df6f768611084f03b68d1542b909e1a40c1c42b5 +public_key = 7a84be1ce6010cd6c481f227145294811061a218c7ec32231a57b98f7a1a6ae04b596b29163b2a52630ad08340556219f1a453b66ba5be956bcb952aa6952fd722cd69d5b41d732b1ec96a55e54da4a419630824b92401acd6195ae4047258111bccbab720ced0d3a6a3477f9fd98a2ea5180cdb709ec98bbed5af7dfa586f37290b6320d2174cd9fa6087b2411e9382e5f9a70c76658f4052a5a7870a29b68c546cffea02656bb5d2778cd87b49b0978d1f53666a206285e3706d662c3eb6293641584218c7d6e71f7d6374404c647ca9318bd900fec53cf44b2c6a8ccb90d22d7eb5b29b676ff1004f85a2c3c62b92e022b32aea6683a3b6baa0c375ac6755203630e9bd63f058966c1097d0b097362328a0a4c0b6c6b8c728f259b00d36ab407147b4d3506b4512137803080440c3383144c6679940a1fbe5c68ae69d2ef997a1c6837580ae570c9570d93f0eeb4eef239d77520c7ec264c871ad9545cbb14488c9b14d78e018950b0a0b99926038690a7239d7dc0a71924e5d368a4b358aa005ca984a52da81ad0ff681652810f7f739a68a5f22f15d0c9b4f8305b4d150a263521ab7577d949aa3a5d6297462bafeac19c882229a10a981e762b72ca9036a536ebace095a365403c089580a74711392300db05acf12b9231dd2862d5a048ba4117bca601c861dfdd13468bab7510a061c462dd8109beee782850c5f5f637425ba7a8a94cfb3d728cc5a943b936cced12c2b9cacb6a9a054193bede672616b8e49eccf3ddc9def4cb9caa1c251f85862077669a10c6a921b2f81ad2382b03dd3cdf6213ab0352fbaa04ca4fb8481722565879778bb56bb748cae282e3b7514d5a36e1e4ca5da0554f1acc7479cc698cba82e3c1312735ad4e888f45ab48db60355ab4f2c692b91d256271c3d4cb8242227a7664350878c19d24072904055123494b066200f5c72c1f70c63f69164f80825656218881eacdb7db7d13c39d3cabf0615a3f419beb7bdb1b430e20c187bd64419888c4c9260b6fba8dc2858b4cac3479b7b1fe2218f6134c87c09a1f36f1d790e1d1742257203b5702d844518c525338f292e7f458933e2a54a34ae9bc5be7b836d643b3262182fa39a707c1681d6052885eb3044ca99045c6a04c6afcdb6c6f5a5593ccc3143172ea8aa065b38a9a939908b886797969aa6a450b3496a62d0578b8b291bd21c1eb18e622201d3b1392eccc65bf38109c51b4fa310407b33c5478860732ff3e6c15c442354f9ac036257337741fc813cff5829632a35079065ed531cf476823c5449705c59a8f25abd3031a0567cd994159fa41d7359309d77a4b16ac758906ec917985c0366dbd91bfdc357c4c8715ab151d944c9fd699089a822008ccea4b88402f6b52a9082c5945a4d902e38a99751e2063f5582ad6169d2b71504ab523404220984409fa5c2786b3484a45a15a51f4b0bc5a43802090632cbfb9b66389de6c69edffc1145ac03c26c6064566ba1f9414b9b7279a96138a4c6e88618464cbcc54198e5a7c1cddc7b58634e62560ca7333295d64afffa6170d490beb922e78022bb64bc8eabcec5b60fb92b6b47bc1b69828769fbb7e60ab5e06b47c9621cf02a745c7c4dc8c30af4ea3991433b383b656645104fd7c850656ed3109cf50cc39b4a78895792ee10706b81bd47169bc5c751e34b4526b6772a66a5fe7126ad5470c07a381a144769d13b5a949755f4173c131dd416363ac886a15397e381906d8a27eaeacd04a402a789a786b08756b007a02b7815553486b705a2171241e9645df11589114f08e4c12f2b2ecc8a8853247b0d722baa84081b65541b293b83ac5045cbac4a96cbf463a51c189ec84b3d46e9c7c5fc0f05c4c114eb9fd752a5b8f14faf4c0a25368cdb310cb5c6ce5caab478f1bd3ec865d1d8b6e0589b91560be3d387670cb11468662b556d8b56a6921644ce5007451b507ffc17f2ab238cd45f6521cfb41546096607fa9552ae3a0a70e391e620ce638a8cbb4747b8eac7dd96824a571ba916532d6432410c3de3f8ba836977d94246bae87bfe4ab21c783baa781e137016efbb7737ea26cb346461245a08089054500778482cd623a797490f3d776d75775badfc5e2137ac3f5431a259a06d085e3644c71cb00bd18c89bf2488ce89585c556d687eb84bd988a50eead7f3991fb1ee633cd1470b342c1fbf250221c8c36e780e6cffeb8874c8df8e83b1877a1057890146f0b8b3ece187 +result: fail +ciphertext: +shared_secret: + +# Public key is too long +entropy: ced2e5ffc24a8ace3bb2108739af5b8b5d426a4bdf3a79276b673d9c61e1fd13 +public_key = cc21b44c8b16e571017d54116465343c33312a910e75b052651642bbf751269c29d9201820e98ef4624884a41e96c33379ea23ba7cc330c95415dc9f65f9ce9acba37f657efc680bdaf2910493698592259d724d888450084a91a2ab83e6533dc8bbba4c179787b9916272bc5cd1683059545c4b685936b1cc94398a57c61a9986e8c968be56ca5b5b145286a03ef118355cc773b8ab32d99c5f031210277bc426ce94054d2e208031739f631c5dee7ba26785b2801a6985135c0d0bccab3115da99312c15792e42c3d77b6d1b204a2b0434f71997f2a248e0d824b69800ba7b4d6e951d928179294390ed698a71612ef7f004e08120baac91534347a33b9b1c2839d67ab9fc301d8d739aa2192363709fd0893723d80d8245182d5c794a243e5b98ac1917a7b4918fd679c161499890d20b75cac293f254d4b649e244be6a7a369982bb2921733d311a9e1b3031c84d6bea99ea7c61e673ae54556f28327312eaa1693c6d0a02a40d554329a0af568176efb2a24130cdc3cc1a5eb59b462c11f3dc0a277953d0dbcdbe37becdf974771392c5852d2167affc921eb34a500be7799177a027ccafef449e8ad6a5678439cf331f1fe1980dec1e355c024ac8564703130b11b7085603193bc8fec67bc351c1e7b74bd2fb9d88521bd2b56b09434a74c30a7717c6a50a9643b8a84a16714f345ad6bc6b96417e917a0b4da309cc00b066837cf0a7a7c7ebac8b652de0c939e0c43332a26c6bca5b6cbc4c0ab44d094b2d7fc7cd5bc6941373ca62c15d68bba360111abdd0581fe3c74db8485dac885a434e4982a9ec987197ea9be6d79ecf9b1cc3fcac2852bfeb233c9ed3acf195ccb19ac78893508ae52c833459f090545410c70667087ecba1e91c5aaa10b305a89a4e008a384c275fb6070063b03e728f6981af589265c02aa001439d9bd9226800c6755b2193854cc4081ff75093c456c13e87752ffb73c3d60ad63a0bcf90cee99c907232849f86648af817faf97545eb2ecdb58493148f4b14bd851209e48a3483593343423affc6362f4063f5a464da5775c0238fdc71c41d4463421462f4996c5802559a6b608c89a6ea571608b85c2541b2e0e29da108163daa3bfeeb7cce9a22c8f02b41a7c83f97379a9224eee7c4635181b28c94be80adccc40200c1aa814ac6f68cb71ab94efd024a6e76bd7e08262da657d71688fffa783d0cad5c8c77976c3a85aa26f0856f2550ae899672ed21ac367671c05332794b99e336886958cad0172f117492db09c240902c2a16377560aed3ea41485282f8588c73e34465c705179628be75bebca3871c888cba31b5a7223c6ea0875f1b7374ea3573916c1120b5673a83a75a66a4c396e2905e9787c3f9332a78986051d28052238c396c630fc248e3120617f411cd7c6e7b54cc96bb066a5365a47a458d1ab958a82d78a3786048ba13476cde53cac7f8345594389a0070f497b2bf5309d37413aa637c6da466be685ff68158b0d26dfc788feb510c30ca1357791b93e12db7ea07a65235dc7198c9934729b5593689a5c64214f3189d150b543a508569c5715900337176c9a6e78c24515e1821b8aeeb7dab9256c303283179939041122ae01d9c869714eacfb8842ead0b945e8c1676aab0e511cd4f74a484dbb683fa2dc3ab06bd643d8c6122fd37382f713c441a133c3006236826d9f9c0d8e02f0eaa27c9a2bcb671168b98cfe85c77ec608f5ec78f1b5051d16c4c83d8c0518a816c671fc8f1122ca704f0b4a9137936854022d5d838d5c13e197a3ed7f225acd1b6668b82254ca749613b11484a724295ed079cec2914bafb95879999012a4818e77bc585541e15ba774a61c0884e49482696c11e549c9aee03cd5acaa6fb2c0277216eaaaa2b0275af7829c249d5bfc3a775a133b7d7e7082f31b74b218d308939fdd94391d5a1606bb73859352885627df90d25d2c0364c60ce733f80c8516fa282964bb1eeb84eb87540cb205967a143d7702b16a282ad1a6e79a2c38bc087aedb204eb55451435563195f02956f8e1866cf944f68c64544e93478da0f07db0b71a27e5f689bd642b663a6b55da473993a7678108e5e1419ebc350c5abbcc0a596914956cc50896ad4552a48241f093dac480e51d740c019841bebb33dac2fbd05b994f4e3bed53bc919436b1db8bcd706d7eded090e0a052bf39bf3df83a8a80dcee696346de2a041b16ae7429807ab162ff0 +result: fail +ciphertext: +shared_secret: + +# Public key is too long +entropy: d823bb23a3760eb90b032a46aa51eca400d1332b1c0edea0f9b513bb9ae91214 +public_key = d6871927e907cfd2773be25f5dd82aacec4b6e17c5a836388b18a3fc31b3e0577170d3a48ccb23af28280be87a51a78d655abb19d009ac95160e5cae9ee4275c716db381ce11b5abc97a69d59a7563476b047685be82c9325908194529afea752b7aad31cb12f4a3bd2978378adc8fab179a64eb9017eb3952f8bfdde986bf897ed01a7eb3db7e2465c611927ed4ab10a9b5c9597546066c6045e02f81227d944c0e8af11254808000294fde55596a5acd4403c6dce6296bb043a7a53d6586825c74ae598a72bf63629e78b27293239d68814a8ab4b48b565358b3b9e903ab559f85f565ef701494d2178fd2cf88688ac3eb278a69a97762a517259c9aec4d9e662917c89c42286f3682cffb555ea67a5a2d4c0526e091e61843bb258bc3144912a8c268044b651294f7a8c030a799afe87fba15a43a8b0ff2c165f117685ec9c917fb3089b4144dc2893e6a9ff5b203c8c49cc114194c1ac46fe095946b4529e0c274759f56f5757b3a36f164504b738ff648885ab589d4966c7907806215a870ac5c08e7c053554eeec7cf3a6c0a4f970b5155ade98a4ce91818bc8424dc4653060c7ce0e2b52cb5a5b5468700c722d0879ad8da96cf5292bc92c518c8b8e53248ad70167a0100a322b803031a90648e432b0ffbc20f10443f5e7a6ec4c1b00035085de11ba13313d926772150bee7ab3888160e22497e40993afdf18a21978efd2853f9234e9c5b0c1d6c40c2619608b26008a5c03e673e9ed59ceb5792152297c1fc02b00333abe58ebe816b8469654306524338b4a2732a9e66624147cb538245bbb889e8aa9f6f17055112bab865c700d9a1c642389a426050329c54c865dd425a1d375e315b8f5ddb805c0307bd2079cb98768f511e2e6715b70b14b14cb1d1076d42da55d19a115a09760342b2306b6f52a64514a86407fb26375490dd2a1f41793706e4a442db3da7b209ad32558bacab730245d3fa3a30a88ef77a1163c16f60397fc6dabf315b44721040265290af670de5ac3e0e84bba8b325330750c8a63a3f2a39f1bb803d767cb1232d79060c0a41a0849759a0c056bbf556b4e9bc24cc54dbf62f207a56fdb292c7bc6ada93117699c6915c70a4232f022882918a0a669a40224b11f4903a0063a148d76d69d2259d437f1f488f1b673a4f2501ab2bb104a12d00e48541e67b7c4493253a2442ab4aeba0280a589f7d4c2c5c915459f339c153ac184c88ee4562bcc9c33db2972dd5a1c3138892c7769afa0440904c13b960cccac988799d1e369887f46f6a30ad9f4819c335765a7293fd1872b13cbc309a32a6a5204df8a8beb1c34d8c690bda52a6623678652bd9d154f6200d5c0cc0a1d8a5c12801f7a359dad9b778dc3ea5896118670a85559d35e55c97790851f1cca756008c057de189788d1764fd39c67bb91c48e6972ce803b5c31dcf0b695fe1b87b02a9a010ad131b2286bb5c2d8a80ba536f61813a81f3ca08a305f07a4732f11b6c447da0a9a2e5c8403fc251230c024965406bc18a483469ca296b57849b49fac07d6626da363c49e7c25348a571ea44d425a428d33f2841606d9c404bbb2f3f49833b29c3c9705e55cb78a1e097e05bc18ba8959047255266789d8791a5a8a8708073cc561e943b6b635b4f03bcb5c8f59c95a3ad74b8573c476459f167c66a118b0637be42904008383ba2a5dc5349686565c0352e36b9334d0c1bcb9c88ff3c3542e5c4c352a770c4a3be9664dc0cb840da60e338cec5561c045254d834c5256a7bad6b0d4382024323bab12324432195e89030408201d3d1998c329251da486b845ce9d85b12e814ed267b8c3a5c2e55ba3cf15ec6603debc082a80b6a5e5a2108babb8cf62aeb907aba8215f63c7a323a154e3a0f7883aa57547abe86253f87709540216b1a6408a0ccc27887a8f64954e98ec900921104646bd128a0b3ce919028f41a5da9d55466988132730e5f23cbf70484596b4b647ca46d58bcd5523488e193118cb4b055579a04a0606454dd8b601bdb88d03ccaf9a543c27016987a5176f7a42bb14bc832c965db07d9ac94fbc56c31a6536b65779cab9402815f003299b6d4c8fc5470287c3cfcd5096d9905a475c3bab67e673b0f92b177e7302d9516a1ab46cc1ae0c2ba478feb15c03a118625eb8518fd8dde90364b890b9d6b97e6513c11296dc3319fa738a054d6bc97598b2139a20f66df626a690254bbd5211f3de88424 +result: fail +ciphertext: +shared_secret: + +# Zero secret and error +entropy: adf510dc0e997af14f96e4863f316475be59850bc861ca0d1b057d6b94c3b5d6 +public_key = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a60e1a95e846cdcac4c779702db2e7d39055c815cffa89c71595bf461924ef2 +result: pass +ciphertext: 30a0fa10e8c0f94f9e11093a8416c0c21c8d76f192b2c5bb48149a874efa1dd6ae457ab33900dfa4e04b117396c5b8cfacda8d01bec1eb08e83c11280b885b8d883344df96cc32edd098b05d3ee2a30081fcea4cb7f6bfa4658a0f3cd3299be05ed2ffaa90d6791469d383bb2f07d61e25d5739de0652980a072fb5803c361d81413004161390926457e7384a6d7c37a7b0b6ee33fe95b6078b3bf085a1b080ca03ed6d7729750117d41880c8ef0e402bc15bd81b3cf4272cb84db3f48682968f683ef7bd5c07fa0f85b6787e83b9c6d9e665befc7d0843a0b911893c9699d99c36c8a95f1f61edfce6803eef39fb2d555503809289877a78ddd41b7f271b8d8ca6f01bb6a2262cc6b459488677c67fc2035c47fd20e33bdd9a81d279fb7f1ff9b5b8d3e000c02c68d590e637fbfc899c9fdc7a10fe7348e2bcf4f1f731ced7f5741175ea484c85f8304c37f1949980a0ec0101935f7ca9bbdbbb4fdbeed3a56238344419655dcd2dc0bf0a2abdd81fabfe56440f44c615992d1c1b9478334c199c40d4b62494be60d0d18a2cb1515060d884fd39e4856cc2c8b4030b46a00c33804d3d2d9b6408ab6a258d4ba55c52f9eb7c864f2511899d28b91fe9c1e328d867f404f7dc523c89ea66dbf934f2d231b63d5b4329a8f09a336554da77bd22c506823a69341af85a0561015c84cd1a52391ecbad57667a2a0a99cc7bd0e6a18dcaacab1b6c7f9173fc1b7bf247bd8e2564f74fa9d0e6a8a7cfcc5597e27d06962ef3f78d182e21a7eaf77c8f783f916b170ca79e3f1032f2ebfee0b9676806fb5ad881a6db806bfff8bb077bd1e0e988de526469e3ed6970254781bf0d3f1729958bf73f59da6b7ece2e7e3b7c3b558bb63825111422d7320086a34e459c9681bad81cc89db23a376bd620588eb381839a5f819dd826b13c060b48488cc857298b614dfe1e61b8684efc110fdaf72fe0c79d0d1d4de979a75a5f58a783fc074a1b0f3e5251cac2b0a798a31bf9b8e5c2f84ddcf2ba8a7d81878aae9c53ad2bdefa5cab9c2f1637ffb2299af62f382e4dc843c0e6c989c6a983d86675531e3b297ebc8254250f052addf07df3ea7a104bea20052cb7037e68b52bdf205cc8b77bb90c6fe671182fab394eb62bf39733db9fc1a18f307a788038d3a58a18e6661a74b4a2e55c24d42cb2824856138c1898630e059087837409612cfc8a7635a1e6c985506711c737ea7aeee42851c9edfce69500b34d15357b14867fcafd459e2de311b826d8c3819eff5ec2f16c6f6c59bfdbb4d9c63997c1e0b461170326cca23cda09f0c0f978ff75800ee67916d521b87ac96e09d8230a9df27626420d17842aac5e20aad404c07e1c1bb32f4fae720bda3ebb8652c5ac9259e9bde7b0430176ed477977116cdf18948d2e117be3a5bc996ea9738c4709b2ff9f625d34128801d696f6b5d0730ed935907b170d9b1d0099a4a221e7c488aa1b341a212a12bfb44f89f13fd33af275816b2c8a56b8a2ba19893efab7809efbe92453d339046e6cf08fd6104d8a487b385975eee673955e059bb997ebdad498bf4c2825355e5d4732e78d4d9288c247a5c4d2e53d5d1d6dcdfb19a82a610614abfaf61e982f9d17bc10221c3ea5033679407b7cfe22fcbbf9e1a7e8900b29b9cca73a8d3461586f78733dde42d12e9bf39d14735dd4c1382b3613c9bcb057feabaf0e90de42c9c16fe87c704c0b03cf324b4316653a9c1257affe86d5bba7f17d4973ac798e5a4ecbd6227b2da17f4eaa462faaaf6cf17adaa4b3564c0a012422480cf3bdac498dc9750a486ff54662135f72e23addecba2b49d85a254259dfbf2579a1be48a93a3a31045046936bdd268c2aa54cee82c4148ad281bccb8bf3677e3ede6dde20ffd2b61836fcd80e106c92d72a35b57d4ea17366f92743ac36b77339077882491a1288c8744a435cdcf21dce1eb4196e076b269d2652152500aa9bc2b1238e910400820801040002184000000010000400801840042080000100008018000020821041000002184104208000400420001800040002084004200008010420821001000002100004000200410400021040042082180100008010410400000801002080000000008008410000020040002080084104008000010020801001040000000104008210410020820040040000180100200008410400021800042000184 +shared_secret: c5aa00b1b6e55e6aeecc23499baced296d8576f3674ba6a9da68bb14101194ce + +# Zero error +entropy: adf510dc0e997af14f96e4863f316475be59850bc861ca0d1b057d6b94c3b5d6 +public_key = 2a2b8a9b681139477ce641c0e766a4573c65fdd08b74038ac64021fa53ab9e2801743c9cf730b0609985059bc12ac92c61d86ee425b5811c6e4b144f0ba3599d7bcc83ccc4462c0aa17c7dc9d55598aca3a48b6ab4479eb4f4584796c64d2c74c360a34c901f08d00d4e4cc7e70c7b816bb0fbd323ce96416102580ae89095d4cb5ae93cd9b105d1065402a4a2681255d0821a21953ff851c23648a849ba27b267c0e70558d54146031482653116570a0fb6e7a63fd5b0ea9212a920c43467740642cfcb53130cb77a2a3bc678572235920191973075fcc1e769480895bc7cfa3c4c8068c3907c8da657e656bd8572a54f80847683639991952ad7b978e49d0022c17adb021030c54ed691e7b0b738c0b7078442651b979c46b0786b45ae446f73b56ce1b64042f5b27bc470efaa8ace21afff35487aeaa8d635bc607908e3f00236c74017dc0b515863ae690984f56c5156a70fe97f72e913ba74a7d04cae8b14364e2baea90695b5e36344107835ccc4335552f228c32e861f21357bb345663a1b9d70ac37ad9b4a937c304fd887048b8364744536a443540b7b5e572522a8c969b8a45068622982ad161c5ca1b69f9084657bcbc36025a82cd416beb15f037c045371617a81bc9bda545628804e4cb0b9ab7a6bc959ed6616465323f9b861521cb493da674c579b6799584af793459a2d1513345e67c06c1b268930c6d4dc0cc56c93e7f01bbafc589e178491f6206f9c89816622b8d5c19795c7c3404b54404629933fb6bcc03f99ad2155c332eb4181da3d07c35c048920f35a7bac1b465545018b899a5248b53f354cbbe01a004602dfac254efb3bb42130f55520921a712b20cd250bbb0d7949db4a05f5a64797417158241ca40c49dc83186cc236be4774e51856da828a5143588d32cf17c7a8d44aaa7be6aa96c794773b656a622609ac22b7b302dc88ce0d317c8a18877db8168621485edb278a0561d7abbbe33560b2eac30cb6b05f850418e1293d8566b5c370cadc2b80c10c9a84a47bc217bd645df4d627d9b28bc898701d87a07560918ba0a657589660972a7d636df533c58c02cdf960a6083c5a1452ab54673dffd2769dd8b95fc761b152181e2484be9c5e7412a994b81478a863e32489ad294cd7f60e2648a42f8890c740220cf4564725b290355cb86834b08182b54ccad880a4fe3617d0e04dd651334c00ab396c42829a45e149b3bf584f25e1aa674293e132a2a75b5e5ee4c6977a2b1df64220683326fa3a7b3888e42a51f712c944f9cd5aa6cd992c7f60b0858a638862b178080c5ccbe45ab9e07b35d37c34397cd2c6280226402784c04bb6c1d8492d5c021969108c13c7b2d1e605711a71256a3216557687f69a8ce38e8e3c74c12798e7547653418ac2b41133b3172a734d3c632930e2638750cab4d0883261598df19f1ebcb5c1baac516a4167f3c14e271d6348bc92ec1da704996bf9c53177855028335b834bd0340123a67632598afe146298177668c967fc4461ae3237a38a1be079a460a7a5d7d6cab0345ba945708d604b2a037198aa7209a9356270010cfb96f663b35601c92dfcb202d027e753a662e060ddd90360bbb38f4301111c509d624abc4752ae1898cc5732a518061c4ba4aba3ab5b9a66d9e8a679ca31136aa709e14cd35a129e693436990836c0648aeb5815e34a91e0ca3ad6838e859b2169b6e482492ed42bf2026b0508b733e437f1c6cdee0654c73b98b740474e2b9a19d08878855564893059904623711c42b62e34733e583424a9d25fec3b20b6345b28801d3db830cd503aabaa5120a040ab31513af89fbd0b8e11034abe120be9f99756bb26a9952615527ba4a1c0cc562cf565635fba5d2894b846b19907aca15e1979136c79b737821ed74839584de5b7493121c7cea71e6b744e42fa278690a6c9f434c0d51e28f5ad045c6d88969bc1e7b68b1b13a1d1a01e0a913e187eb861023a8268061692c7db71cc1272b63094e4c28163ac636fdb5a9422757744032b329e0891232a60cf1d5b71b2090bed7807a2d09ca1192541290ce65605e4197951e87c85ab3a41aa7e76d4b9e4d691c3d54aa27595a86a218b396fdd99642515bd4dc38dd7861b17e30eaac2c3e139381e2ba17056b7a7a07f7c9626f716c454e66c0a60e1a95e846cdcac4c779702db2e7d39055c815cffa89c71595bf461924ef2 +result: pass +ciphertext: 8702ea652463d333c0695063d67f213d9e150f2e3aebe2d2bc992677e4492bb95fb116e17e8c5caf5067ce0c9c2d8c81369ec85fb7dcfb0ba32dc924a67eee3f92e13251bf1ffef5b1e3f98f25f7a8446a0305296e097e51bd157e97d476258ab146f7160413416a86f4b2a860971c1169d3b01a82201929cf2dd258c693e2becc839ceeb97c9b570e26a54cc1915ef8f17c47fa0b1d0b6bc9f25379514fd234425d02ef22cbc151fc2cbdf4549bef807afa1ec7e5caece5a8f4b62f2b388c210357c998e61fb205dc975c8fb5814345671bb8a614f911bd4de6eefb458a74d95093ca17549940c65101d62bfddfd4aae3c9a7adee294ad409ef778b1c25811cca3ece5928dfd6f3bd8a4da41a81b7973d5df2b1c25d0610ccd9b61e477785908d70b23a6ca9ec11a9c63ef6f52b624d66243925d2f5c2f90538540304bd3a11c76344c2aa90a12d8aedd1c6517732a15948fd3bb6a2e736b33bf68e816f19905b1a96156e2431da5525147d35d6b903708add85dd102658ab1972aa19cee456b7ba1c7847cd6b4f132068833a70cebc4b23a63771f4afe8f2aeb077572c76132033b2575c1dcfd12521d1249a5e38a8ad06979601f18e156518157a7c8e6526b957f657f8489e2224cfb73b2d1736837507fecddddac860a587122a98a08c137108e5fe9f9b2feef6b52e712e3493f66c98ea9cfa08aec95b27220f5b219689216b8e0aba6ee8a7e758730108652776d100680e800d6613aee85f831c3d92fea5123136d204f8983a7aaaca63d812234da3ff596ccd4970467f24217565b6069b6bebf58ed984a2f0476cde2319aaa792e46eb6b84f4c3c20ca27183f1e3e2be347b5d1250a666a81c5936b8d0f569db64aec4c2bb1099e6c5aa6b726a1617026c2c8eb5e72925d030759677863cae4f09018377636b69f2aad335200934ad4bd622fee2780b11bf1373000491724b37fe82d8d26a869bfb4d003dc0f85961dec623dbac4c55e7a9c439eb91ea01960d3103b7c0aa052e81acdaf1286620229f5a2973e8b0a72eb423cf068fac5c26190bc90afc16938eedbb5ddb3c9b5bdc8a595ac12f9c80dcb9abefda4268b8d74c7462104f105cf3437bd2cbd337dc5d71b552936e9df0e47eaed472f1162e2bb1b94ca19d449f7d1fcaf0e737a07075352aa6a45318981f9e67a6b23c2d03b3655147fb0d2b07462d64277b6cd11f4ffe969929a20774a885831ca24abddf752cc6133f8211edb3b5229218c9a61fb3683be29c7a2beab256efed36c6537614c77089ce44a6402a07c54cbcc105c4c1d7f35d2390ea2248fea06f472ed018548b1377738e62c081345659121a3948afd758c3fc764291c17f1274f6025c802f42ef00c6d692311c27035d7ed2ffd32d82671aa31429ba471b605993770e093a9ae706d523accf9684fb12a7b6e6da228e9e781a8c28f6cb6da9a6876f0e5dfe2fea4b6da856dc981ad8323dadb1768aee416471b87819d3685564ffb3bfb3ef1dc93289416b540f3a2f46f29bbdf9fe05155ed8d12adf5f85f372999b113d780e3034715f6e143c256cb2c50e86b044cb5449d09576e776520f8206ec7f9deeba0db6a4a131f0fc99e8bc794ed12e45bfdc9ad5e40a7f6825ce57f3f396f20afd968574b6ad34f3c150dd65ee11b7e0e396067e7d3931b493089ac078a812fdb2e6a56b04058a53d0c8fa9d0e6497cd89b0f35abaa09b3c8cfe7c89caa9325bac5440e971bc0ddaccc7390456b7ae38e51862522193e90d0d6452d19c2501edeb37567a0c6a9f9aa9b6dab2058bd08b3ed4f90e823ec4fc4c003e137004e0bda32bb843defc50ac4d0e6c21e1c8456963db80c3798319336723f4cad669696cc3ba07c98f986a9b7559bada4540b10fc50ea11d4eabb00baa323f4a8f4b93bed5561aa3dd36a0c8c9f56a684b65f08c7e725f60bab7f786b26921f9a638f7046fcd25ca266a4cdf774f29fd683d97750b7a9f551e99b04b3e6345f831cff027bae6919beab52eedcd93a2295f54cf4b14b010500d18493f99439a6f528212681d240adf2cc4556daf03ed57e19689f09f29a06b618fbe8428bbce371514c8b15cd9c34da0009fb854a8299b7d02f1c8b0350628c901427274f6e5c7f34c2097a56e0251eb14e5ea5d5ac0b12c778476d1eb4a85513387ecad05510f64bf10d1325a91f670ff6fed9c4a8421ac98c0d06 +shared_secret: 4aff47d4682e6b414067b3020720ed442d0e2fb4a2b15c38df29723b8bab7b85 + +# Zero secret +entropy: adf510dc0e997af14f96e4863f316475be59850bc861ca0d1b057d6b94c3b5d6 +public_key = 76da327e31334a81297ac41a07b9c1d4e04ef3fb8b06e9bc13071c98f6a80523801d0c6e5e7848d143a5dc011eab319ce6308bde406c4ca459fd3c20c5c76dab11c3eff0a060f52d6c677242b6019ea40c0709d071f587c06557d0cc36f7c428383834b69b877308c55e8c816d8195f614336e50357da66fb3f03de7c3742fb23c2398c7868690648122afe321a0b2b55abb99306265b8e9c4be1771b7727775a25adb2108a8d62bf5c18571267e6c1b5dfc547019c331532a40550579e79426304b52c88cb722da72d63a8da549731d5625a6e28db6ec22f3d1733df7775d5771857382bbca11dd271fc35b4854f58b6ffb25fd42286823790b1bbccb40c105e38092f5a744e19d7b758ce2a5379fcb1f401aa4db967fee4bcfd73811b214516a098d1cc726ba418118e14970aaab00293bdd9b18de001075e2a1d25183bca677db703b010a7f3166b7a4bc374b913394c504463a42cbac84ea799d70db4ac0db6dc3da8c78149bae1cc5e4b65f701bca315866d6a67e9bebbea36ca91fa694929cba572c60a1d1006c95941a640d472bc2b30cbb635087170381a4328cbd462964c80692f224ca17575fd7cce32425d6fb19a363cd114524d8c4106cb628253bca70377aa242751b626447fc43de18333dc21c841c236eb0b2073a2a8f9a268c931669daa4c9036228394fc8a0a2cf809a1a2929a5ccc98f924a9b7282f922c5ecd96cd1436b5b21692610a44747a2435807c50581dad25268d737fee3834a54967e76c3e7f537023b57f6a7b58c191427a12282e06421289448c97f7cb042ca66927a417e6747b3dd501d119cbd4dc43d18174aac099ef85839c7d9425d87a17cd77ccd568bbf4bb0fa8ca4e5005f9ae815a307471219a9aaf60bea631e07162a1818c3c5da6c29385fbeaa76ff4804beca79d1f842c46b9fb29c81fc4875afa0b178564d26b26cb21aaad891822ecb471b76a869b83838388b9f5839e0c344a7eab55c392c99019a0841b20dd14f36875853c6150fa46c2572828f51b9636b00bad5940912923252be3c49190577c928d5bcd6983bccf00875db487287ada1849d3339069195380c1a3ea34703792251e5c7877523c1b6278f9e40cfb1614a04c01d966c41bea36a10492edba56a90e370c1995de2203aff43002446a30f3771af65924b8354e0dc2fb4aab0295925a23576e4e9770740845ba541eb23610125c782c6c82af506d9a25d148373f5f48537d7b0df7c9e72f10938f9cd66aa6b2dea9322412eb01cb04de39797f78efa29186af03d90588d8488914f94033b644663269435e2c26b47297af4a324526301f2cea3446c2507717e83c29c8a53f277cb739851bfc94db3db6c6d2a35df897ad06420452281d1659e7aa89e3062abd2a1a7113cb373e6856b7acc402abd86418c554858eecbc2b38b8b9920cc0fa091b891c8a4248cbec13d52984c6512a025ca69b34477dda65e12b7839128427c42832a1c5f31e5c3ec09497667ca7e0059c5f43889460344fb6985441afee726b58172e2ba2312aa10639737325cb82e2947299b94aa8bb021857232878b45b03f9f0ba5b0ab75c1773c471ab51e666231c3c37f1bc4630628a9b1272fb9af6268b734e27627797582803cfe6006230901d074c72fd0755e011d676a8e69d41459c31fa5aa5de74814d0eccb67d6151dfab3d83927623242d78367f20249ee924c2b582d9d775a1cec0155a64f058aa6741867c7e491f6b53f1f8267832b7a6a8494dd249680a5b147579503425a55914580810673d507a2b0cf003cad1ca3809f6a06706ba72034ab8e79340d6232eef9815e761f6343a3bae63004c57bfe876b8d4a6a8b1550db541b359aa0f192a3fc2937078875ef55aaedc2115201c721db56b170239582cdb5c72ac4c7c94508210ab0bfbd1ac7cdf891fb370522ebb8a087709b3803069843dcd8bb4ce28663019cb470413e78097d933b44621b1f3a0930839807a13325900d0536a8f280225afaafd1d76c0e7aad8fa3af38884440d5b3a9f56922720d6854979b835c4ff69af290aa94d662fef6be4c46760b200333992f4df215425296f8d50876a94753024dd176991ea8a4b4256fa25a7ad7429303172bc7c06382316a61c0b2746252d2d7b1f501b2f9d6457e09955e29540a60e1a95e846cdcac4c779702db2e7d39055c815cffa89c71595bf461924ef2 +result: pass +ciphertext: f0e103c8bf553c2dd0a1043aa1c6eda544ac9ebefb081b1724be5cc4bf4167e8f59c53e11c2d2005310f3ac9e470759f8297971fbe8c08e7edcf5501164ded5e40e0cc9883ce1a8a574579cc7f675780e1f130ebfd2a83fc6fb276da2e6baaaa80b9b27cd19268ed6db19ed2e5f8467e831e5b19d6afd169ca9789c58b887214fe589a0fa5ecbcd88866dd2f574c39813b4bca5de8ee9577af32ca11bc6e17ca841d7c565a630c145855dc974b9584ca24c9979f46516440c2f5d35f148283cbd41db73bfddffb5a36420cb3c0d15e81f1d6e0c5e99b4693a7c83a51ecf91d7833cfea740e2e53f294c767bae0982a46532c35737fb5a23fcdd46d530b7b0cad6127a66ad052ee518006c6024bc2b2944d9b7536d47287dedf8a1bf6dfcd8373444a379fd1756d1189ea101e7c26f579b32525973eec803b074764b13d96d60f68a279e34c04f3e43bec799fb0fcd25da9eb14c4ae21d10a1dd7cea23b2ed5724f3ffa5d37766a34bb9d3aa8330a923a41925a7aaf071593ba163913aeba546c75d889750492ac376acf12e841cfc53f28a82a1ce65d29289a57218731c0b7ff814ce4ea7cdc087bab5cd2d57f0f1a45d9ad7096323edb3ef3558649f8aa2fe49a146244991f1d0cbf2c2e74e50038d6c47d80479e04f6cac03e667dad2c8865d6c8cef96cab4d3361e3def6e0b45a2dc81a4993e05177f2fcf013d992a943cb0b11b6a75861bfc8ad534065aa832915b254fddffa898c69c24514ee452ee1f7d8e052bcf3f6f598fa69db0ce6b3397994cd1f139e665d87ddc69ff6a4b7368ec4e5d026fbb16c44a62a33c2644a93128cb76397516dc88f664261bd09409b2d0187cb73e3744854ced4d6cb1099c56fb325dc93232ba353e421c3e318669f821df71c6d8bc68cacd45958442575b9960b0d903406c2d6c8577bb1a3ca8e24f47c7bcd2fd6a4ab83a3caa554c6695b286b115df21699a78269b25ad7013978daa30290d541f3060b01e9c3fa0d703322700227d84101c9d50dbddd00c92f57154ec9cff10a3dbfe6c2d4b5a0e0099dbc9b4883dbe2d1ad748fa6b5136d8759b9ed314d330a8822ecd74df76cb605087875150b205ecc1b73023bc185b8bb44c8c3c32d76948bde1249730aaa1f52e11754b2037d2cbad433c9beba44b6c8cf19b15e688360dd2cb7d9832926ae72b5533cda8ef08a0f92c5c1c5c287caa02b79eeb8073492e46cc4183fa2d4623a36e0a968ccc6ac29ee9ee3582182c261c7c0960f163b290f2ef893da422ad03fcf3926942570c186e7a90bba86ff792472911cb04bf72a8067190d4d87331d52d4505618c60de95142db27f784c012e209addd58bbcda062c590296be66722e175ac6536c58bd10a68b6d75513c78853d4d1f796bf477cf380c7f533f741460c9c5c2d1ad851db4b761b9c5eab3fd9d291e7921039150f8d2b81f86f1f997214660ef4cc63eca4b6c76bb5742fa9920d6e2db3480ae82380fcfb8caf51abe21094736f58cd7e6706b5d10c4b33f021bce59d288bb41faace2411a0ac5c766fc7d87c5d6a4f0cf2fe16cce09dc7ddf8d968366ac293ddbe9c0c709a4c0b28eaf2e23b4212c1191112fb9a316aea3334ff9f4645245420006c406724cd7f254a46097daf669c2b137560a25432030a6c7d6f4732594f21a277b610b870222b4ff561a6401f10b35cc5045020cad9479bb449322d37df22c9522c8b7c5c0c4897b1175f0dd40038a477c46e10f10f4289a81477a07b8ea223007e25f5b871d246e585083240c56c3d80d4425ff7821f17acc96121ca9ca50b95ea46ef8116734d015ce88021c620b57fe83b5022ebd980856d5102e4e80d7b176bb79209809cc32a7d246df9df5b0375bac96547962c413f516f4f0c24c8921d148f0a168ed5e0434b72538b9e5cdbc00b7e7984c243872fe44baba62b917a3f0601b81cb1e6cd89de2f38d0fafc2eade0b00a573d59d290586f1040082080104000218c000000010000400801840042080000100008c18700020821041000002184104208c003004600018020400020840042100080304208210011000021f8004000200410400021041fc207618010000801041040004080f0010800f8000008c083300000200ce001080084104008000030020801f80f40000000104008210410020820040044000180100200008410400061880042004184 +shared_secret: 71a637ef1645d00719e56ef39217bb4d8b2cbc71db826affc2529589830148cb + +# Rho leads to frequent rejection on matrix expansion +entropy: adf510dc0e997af14f96e4863f316475be59850bc861ca0d1b057d6b94c3b5d6 +public_key = 1ef7040c4b37bda74af8a45652510df4d67b7c618279d2844b10815913914c392a4119911d2b40da79b882534a6daa1b3b8679eeca4ef2b57bd48507b994a950b98865103cbda9b6fd38ac82b64859863864ea023fa6990f0898a8d3ba8a947fe859934ab06ad545133f57a3c692c19058a07fdab3f0daba0bb7846ef3222ad4bf62d995a7bc4801e5114b5c131130c58f76bb858abd1303003461442d64762cd5ce3421b52f492ed5660a4d632af3d24b9b5a1af291323429896fda2e21494e5630502aacc91bacc2902880c99890f259c1b9fa01e7a716a0a3a0707581acc347622369a4e610a1336047f3429ec16e7cc97607a11ff59473b5191e04586c1b32cf82da6816e47c72d7344e84a0d6cc42099781e5837eb6ba878e489172c41b4e2c3d0370874c0bb939c485a05851cf351652f82f1ba0a50fb235a6f10f98655cf2cbbf1c21acf999ad24f77ebed4297425b59072ccd1b6aa6467874eb014b3c911a0a9430cc86cca1aba84cbc709824a5f3abdf7f927d8f9a8c5d6cb955661fc7bafdec7cffd720fedf95353b01743613faff9b4c94c80472894c2322f641240b0d60549e4a405e9a20c0b794151a63a598e26eb021e1717723bbba58302096b563ea4217a8863350a7a729b0c1f8486a8faa7379a41515103f59b773be06a6b3b01ebdc67cff93147279f861114f97c3b9e7abebda5a51ed4518c6a20e679cf2a48b8bb354095b3ba14d07f3a61c18964cfad11b6b814b50c07bd2c6aa38c6c4b20d47778aa5c82fc575bf02b8967ac79fb9c1354bb1df83af95a839015c32f8b4387795038720c53f1780c6a5a42d828ea42264e55594732419e450afe13ba956581465a686a1659bdb21bb2083424d19fb0682687ab005f1111c4a43205db0633d301665c635dc016ba2762360474e728362ba46b52b54475140fbdbbc491ec5141e7947ba42053c4b63dd1032d8b8d3fa2c593322e5509c01a1584759892a910581fe6bc16b935a5931627b67e77247df0d3c77b94190920aea31c093a1a9146f75e51f07d45a607c7f4c38a5a23a3198cbaea7baabac8e70721b80596c015285f20ce45c9bc86d67a1942c139c9acac70bcfb7a1f0b993c7d145b4a03be0a86ba201647d7831c6d960420fb517ae68f3dcab3c5651f49d221037283aa4711bc3973ecdcb7c030c24b084ccb850f91d35e78e381970a948e376d4bd7b670086542a61be4c670aab7257fc58dad24a3afa727dff967cab9088587385ca15209c18e06b68ab8c66db7d680fe40677f8a0d6edb9d34b4b1901ba729338a7bb90f98ccc61676934d8b87d7ba15170017e9247a6445236512aaf23a6ccc629e2a2a7d748b0a67b2c64cb61aa549b7befbaef6ba45e0b6c3a72270de5497f6ea95059238d0d28aebf1cb4f209c24c8b83f19368c495ee05638f45b7002c12a23013f24721501d6aaa6c337af9185d8b733464229a8aab8eeb50f8fc5b4d9880897d3128387aae8ba6e2c116a63b5434be0503b77903f98a7efa5b919c4a86f39671a477c4569acaa07b316d8402a1580df17736056acb05379cbc1228aebb671f7ceb2a977e4f04ba363538c4c28f5a585d712453556b4cc74894740b73c5882bab36f96c27dca7caa815331ad4425cbc732ee3a56db445dec2cb7b3c5444e95bf796b3e69999867307af7c716aabca5854a2118eb78e92c9e1da4209ae0c7d61a0920e58f50f62aa4321d541a8ce7d74f456abf09b293f7da5d1549ab0d34044a624cd51c5ff3774101fc4e77cc76a0f3a1224c3ca2d42f92ac6a23862dc2539dadcb396dfc41e73996497879d8c396c3657c379acfac04a652fc4c32aac57e0368ef606bab471e52495369d7c616d3a3d01b668c7a0f0c305efea09a2d01b602c4a2ee47027b0c5f18994c3e369c7b985832a48372fa6af929605b0c1806539a0dbb2b1eaa674ab8720b9381688b18e5136330e303f0b4a9d6b5138a07cc372431c8958260c91c655551b35538860acac1f047905cbec0623bf9c33968583355822dd563af7b71a39113b3024074f865ba8073b412672eececcf8af0669413655c318bc5684e7a655e370840c59666ed8a6884c05060072fd2c0bde6f39c22c1348200855a66aac2155cc13233538aae893abbc3cb4bd2c87ca6f78c49691829a6cf40d7000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 3c14f18e865f367b72dddbccd6c535fc2945bab3799b9edf5dd5da57f28a74aec23c5113f792f0a92e096f9c7af548e96c6a4157de843eaa0a0089e25b8f85ff44187a662845fb8cab374c143f4f96c6482ce7cb7cbf8f27e06dc50e0783568652043c45767295f860e63093d53213c808692d0bdfd10392bab65bac43979fbc5aaf04c824df2383154bdc30362c28d0fdc353f4f18bec2620a906426f744d717f04cf108aa91c82028ae847bdd5e66eea3ec0e719cd1a3f0d36965a8e2a1a03bf4233edfc4b5cfc7fdd8ec969037b3f02404e3bc3933ee3c2e910d86476d9b7667772ac75ea46e181e95b9a3157c3420ccffb064de3ffb32c1c855040eac8cbc15c9ae7ca1aef4c442eb54c3e574c9155474e93a14a5295f66e9ff6292dea202b9bb4738d7280128057586e0a9635459119df84bbfb083f0545d4d8387ce9a502f2c3addf0a7968fad11284277478dea0b29c96b364ea62ae83825011f1ccc6cd7a58026a4250e76696b836bc06f83e74e528d216f474dee938e78534fe21423cea6f843a70096f83e144208700d156261c091782fe8787b32848ab55390e1968370203e59a9a53b1c48a6a449a55ae997d5f222712f4f674991e8a4cbb62b67479b56933c290f701483d2dff855797323f19c06e692940fa32c9c2964f700b4147e23dba5313ac247ee26ca05d147e469b6e870651878328c79fe28158e29a6c41ec48356de5c2374c2d7ca435330264fba31bd9c1c85be3afcd456b3345a669577c996062026108891b8cdd099d91e3c662fcd1a2f28abf1567b519ffeb46e9580ad17a5b13c9c52c544fad1648495b77394232ebaf7e26c57fedc43bffd6021fa165e526627a80761207ea3ef172e8a26bd65bf51ae6ab9071c61c17b19d02e66ed12fdb851adccfb9ce73ea98839f96ce0eb6e1bdcceb752d7c5ac5d6c4bf6c56258048a21208fa289dd517511a5849899ac33d50e1e94fddbcca5987324230ecaf242497be400d80541101793f8fa5bd896bccec92e425bc63500305d69a226a165d070545fc2277a9faf16c5b004aa8c7e8c3147890cd2ab0847afffd4026ca76cc6b5d6c9aefec6fb1b21794e37c56aaece2cee1881ce64c9941f904c6e0143f0332c5b0b9ef7fa394070b73a62b2f811ad53524fbf9a038f185daa3546715acfd63c95594a7f18924c3da980d8996885b04cf7944477b2b9b1d939e81d14f84b129f76046a6d78482ff8debf21315f412c234cb776f529829e07ddd89806e343112d82ae23b90657ebadbb1fb7999c868b52f907b7f8aa131dd334a5332b4b2d8fa664e18edbd89b4596e34eb631cec9e81dfb44fded66b9f236add78150415c3feea074e34b43284765274defae58471f27a889c641069b436ecaeace548b03e95cbea4a424611b79c0a26502808b8e35a1b285163db948692afb29d94367eb43ae5df88467e4cbfa92f0f4b5388a975026c5cf0ad2b8d10c53f3eb5d6d94e5082302e8780e5a7dbe4eeb7061c02f4a46d6611f6599fdf2121bafb38789cc789f2e1730ba6be17caf12d5deed32f731126b3a75f33b86498e1c739db09c3fa2a97fd77a16ce0d6947e5c69120e1490b75cecf695390255938c9f884cb0248082b36ba19580130dbd292b34bed650c4eeadcdf15685ed27b6c23edf7d218bf7d98dfb3018fd7e14e68242554250886dcb6a0496220f8b4c4aed6c87dbdcf62b47bd8c07f6347773937e0bd0680e7e0d62720947ce2a2bdead1919ea3859bb01e341b814dd13615711afb12320cd914dbc97f6767c5d0d69f0e38b46e4bf3b132466bcd89ba1ae98144874c28bf476702975d3afc17fe4bb1dec671b85111e5f1e359c15d6b0421935e26a5d4eac269b64d122f9419a9fa0fd5d239fb20fa31192ba2acfac52c92cf5f339aa80c3e5a2a4ece0b077d5114df54349cc8f2b6daff625d347f5fa60a37913a1402bbf9790eed6ae5b67b87e076479ed1abb258d6a7e91ba07786d819ee869f5ac216341535995799e492911a9b077be49ab3538d3a52fe14e19b6a0d6af2a7df2cb1e5904a3941b079489f574e066f6c565828d2a312573fb6e90ea67a7747c8b55b1f117482c77022b38ccee1a397d82f272166b66af0ab67b631b2dc891e2ce4404e6446563489077873674ef477e9da7d37926489ef60b5a028e8b6ddc871bf5c224be846b9299f02b82c8dbead01d +shared_secret: deafeb0bf0d0634e5acaa34966e58df8b9bb63b376e3409db49b4b117643fdc9 + +# Rho leads to frequent rejection on matrix expansion +entropy: 3983da6a4615805f6d55c14ba582d59a40e646c7ae77f4835a51afc6c37f11f3 +public_key = 32f393adec83a1bc0379bc0fc42015610c1e8fec7878cbaf623959a22008ebc81ccd02b0847a7318b414f1ac47ab2b0dd88049c1047e4331767f3847bef0750ac4623696bed9c2162d2b84e0b4b606180a6d2b6dbb5190bc3c6a51780de86071ce2a0f05758e199983ffe8349c036d6667870296c76930b34260af449b2a6795b4fbeb3309f017e9f820c145716a91569057a22b44bc38b368fbe221e1f92d0d5430913580f534b8373aa760d47a0ebb6bcda55b5cb62797b819cd185ea798a1b9e21391381173d2a416eb98db74895085ce31c868f52a2f7654b3779a0a324126c1b3aeb73c073deb19e7925126aac8d87bb09ca69b68dc4fb17bafe16a4315677d57d0c36e9479fb03a30609b7456aa8e8b76c97100728c46ac8f39588f7062c1b27fbd12f4c9bcf95f24f1a698da0e78ff1f4481691068ca7070d341dd519c63815a2fe3286155c741e20a3bd8c89ee6bb069bb89b7aa1b1c4b4ac85699ca2c786d8305cf1c4527979442fb4f3823c7dc887abaf866fd1b20a9933707c23036e653ed99476c242c791744cba152f45040f6bc3414a13dd8670327d50e446a22b07a42bc056a95c94d911356e276cc95d585aeb25f061b87da78550805af57414cec34083be60f6e7b0ddd1a9c60f5725681bb70db9390014df9dbc5e022b4c24563efbc2b32604aa41225d9993f924cceea9c0196a8065237cb47035142b0693d090e6ef48ce85aa33b57c9bbd4c1dcf4b8314162e0f9b44e01732d6cb7876559096620e974cdfc263adfa1c8d94ab6080cbd42fc1a585009662640eed3353117017e754db4cc0901f3c18e6452667312386b8bc27c32cdd9c11c14403d390f80f121c02500a1d03942c0aaf56a83f3f062ebc708003d7deac3a47f33ce9463381b19818cb97c8d61c320da588105651f5496b2d38615a5929e50234a54393814311b52b678ea8b50e3ac47c30ab2f99998a481602b4aa701384ed347878b85b8bc108eb90bda44423e620613e223ea6a03708493b7013be2b926daf33fe3d81fbd9795a885accd8b4ce3ba33ea57bf04530afae5643bbb4b22981ff5b097e68c5615b70b4213b3feb020e968734ed33b6ed87cbf5468c5f055a1dacdbb9b19d2a057a6fc371d389ff6084fecfcab2f0bb66d0931ce29afd098ccc4020af50275fd5600f3b31c063174cf5a63363752cf5612f121bcf549993132c71dc5c4835c396f2436a70092244c82b5497209b779786b3a399237e0a7237e550e0d784f1258c540ea91bb99c915f052fc8164b6c1b88058242f7b13a98cbbe1646274105f330ad0377ac65e6acf89987979d44bcff381620335ef93b9f7698527f2c55a39a4858812e9cc8c99aba640c7915bb1475ae172bbd2251fb2695b842d27f688e1e23f607905bd347c83db7376706f68ccb72c94519e426840b412944c7181f72f98a56c0c5ba302ec728b31a43d6418984c47dc0276bc3cb6c2817e658ba9acfaaa1017659d10beeee7a399e6049dc62f5795558c082f273949d9f82cab2c3977359f510394720cb9815c240ed64ad4f4c4b27057da3abc1486942d01c5852658a267ac18e886c410031bd9aff0950165b53e53cb28b21172b1866d2dd16f9cb59c9bfc8aac8606bfbc2a0861a9c7f62d3d41074e56a73615085b9053fd2ca533470c06970c4c6a097d0b4661c2b001e9bad5238392b811a1276ed0a65493080e94b7813d9baa3c05c9f7820f77e4af8891170a6ab302e23287932b82364fbf5abdb4f2716e5b74705b0756eb6e3b1ab9f96707ffa05d3afb29dff48a004b86bcc784ea003727a49c072cb3cc6cbc4473c40965b5f76670d8cc1a9fd3c4982662b8fc2d9e982debac25d891217dd24f798346b2ec770c427f49ba4452a1c8d49b9089e751931bccb07557db36bbc13225590cc94586058c3c1ba406633e650f703a44aef3c305f652a4f4c785b02eeb40cab763731a7c20d062125a24b2bc58ae6c4a0aa4e4c5a330cfff7a46bac4ca58a33127a8bea7d5598b29c49366cd11cb4d60d71c0d08cad7145216a8878d6c346a32a948b52300c8448d55a532877daffa805320bba26a9f6197a08f71b4f9210cdd9c3416263f5b921191084b87236649a02e9f0a20f09004bee065485088430924326353ad90077ff0a10fd3c077111e909e000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: bf6a1a4a5905e3b6bf5d5fff91790e56f6152e31289585d4209cc364cfda745e4da6ab9baf213a75f7f6ae50b4570298035dd17a7108ccb8a5f511a0377562eb37eedc3426e5ceeb793eeceeb5f3ca4935c68d352c6b1ae2bff892c04de562dc2197cec88133bd7384679a1c7cdf80a43aec446e60c8690c50207e54d1d6771bd41ca54654b835cec7bab1efdd6c0417d06cd74ee851c4b0cbff894dd245ea33bfe28adffbd0ec8cf6b34148c6a8126b988f83f5517125b998859abfbf4e9eec1afba438faf25238657d0b9a370df6445dd9527e85502ceffb25e13fe6cd8108475f56252a148ca7d11dff8e83c760a239da62f994dfe5a4d409feba83005402252491e87b5d585168dbe6c4f9b257bbdf7797526a208dd05687e2d8176655848e9f171d6fa63791b02e6508a58f70f461c5de34ca3713c1c0b0b280db1d493ee5103e768ae38482a38692425f05d91b496b47743f28a12d34cf26a7ce164bea186549cd4eb1e0e9558902aa1b63fe90b3b5a1ae952676d37395e64c873f042022c7c9fffe06e875a7828af940e0c4bd0ecff75d8154be5bb5d3dca963f35b0d5d45020c4e793c4f895983a71a1f48d8a6a03cd58f570f56eb3affe3514f89e46dc9a91cc466da782e976aaee83773a481788cf872ce552fc56399fbc8f802303a5e8a0215fa3822d21393d268a15e617edbb9de328ad2d92633fbac21f5efee93588b8f8789aee93019e61602374bf84e004174aec2a98939d3fa29462db61e3cc1acf68606802fe312336e72ecf9faa23177235d7fb3b00b5c8639ef16af505f42943c3c3b8bf0b1118ee78dc8143fc74d178b4db2e4eed82cb21930e67d5fe265e2c095aba86991fd378f5bee637e0a6e283440d57b11cd6e44dbc55e06a574fe959d946b54619091a4a0ea394e5d00c707bb11595773241b23731cc741bbe253369555934daacb06492991e8e5238344e75c7b3b6d85cff5683a75995216228922bbc0e5932bdde90486569d60decd6dda4cb4e8961a1beb45e8e0dda5fe91c2ac9e709f4585f4ccb56d89979767cabfe7ad88094bc975388840c55c8379ead9374b5b368ac51fa7ea08fed2519209ba78dba663a6c2d352bb9aea6bd24131178c52d4a0e161496c758fb8a451001292b56f69180c18aa5afd1a6c0bc1c141aa68fbb9b74a75f893036f3ee4b65eac6a9a67694d8473db851fe78d0ed544e2927c9cdaa0e8187389cc0a15612b1ac53c59ca1deac4cfd6a3944b7df446a0121dc81fa7ada3660e27f6c2f65311f9e2e9a1f97545a8b3c6e226ce547a3d9d283cf37338c07e2f426e7017a6a513fd104b88cb8b9a92cef6a1aee3f12f258a5d059318830a6d842563134e896d577adcd229548396e5b1d3a1bf80b49c064cbc20f22eac0a2f3da972c580a92b293d99b820888ac9b3c50f0c16ca80147e5e73694da824b0e1e1cfc771773727744822e933d2631b1376bdd88f37d124bb6776b83c5918ec63c48c8b339b62d1e487cefccbc8e9f3276d1c29f448c5c37b33a2442f096286e64b90dee751a6de0f50197805a6db4bf77a845df7770dd34a44ad0344caf560c77e7edc655604a4d42e591842022d64c1ae605c749479ba401a31867b4a11b978ad690b4c2a7cb6d0ea262e15ddae9025b522312e08bbad67038b4c2e272bacd18ecc2317410901ed69b6b9f03a6d5575efe5a9c08463ccee314a522fb24163630f888c9eef18539e5a088e80f4604612515dff0e0bce97e9788d70d148431e8eb9cd49f52a42e21e36c392dab9aa3f3c80e6e8f812d18be435a1b073f9c346856446dc5144f5e6776704342cc877b6bbbdb01cae23a579f5238241988a9ddf5cc7f2bf64265b465fe34d911c10265cf7d2208e526d51467de5fc1dff6228d771b643f4e31ac9edd95929eb89c98a3849a34a8672660f8464c42d6566d5ced7639c2f2165d505c7eefe844649a605a3622e60569676a41cd7db48ac0fc624c1cdfbd8e1f07ec14519023b068dd1e58e720d53e61560b1d00f7a1b0f59c20139874c4d0c35004b5477cf5b3880a95864eed75de14c8be43a52cd46d6e4e510058e58d80096a243e191471abdf0f2ed4d7d61ec97ca4b7d2658294a15cbd40414ff3e185a809522ace539bcb806881019930bdab728fa2f2d773f7997db7aae3927500a4a9b9508d199fc622bf62f445fb0c0df9e50e34a833c0a +shared_secret: 5a9c3568ee557530a57078310ff6452b09049f55f30df0704f9607674971e033 + +# Rho leads to frequent rejection on matrix expansion +entropy: 2676b8426b9d6a30af007094bb76d65d388c2b3da938215dd6f6987206400e13 +public_key = 80d67fba099be5882ff1e53ff300bbde74cafa260a124624df72a7f73449b253525e75b658656556422e26352900a0b1ab258dacb5cc3ca0ae9da2826f15b8aec76676920168492ad2b9b56714b3881103634c1cf299403864cfbbda1546d1031e022ed172960171bf94894dd48331f5973bb509d068a32a60f56377b911f5226fc77ab27ba0295ecc70275a0b311284eab09825c14ec7826779039f3319877fe39d8f938068b9916fc60a7359737a918286b2c943801713b78a8d14a558994fccb48ca20065a013318f099917bc930d0ccfc54b6aa0a7791af5c0443c96c17a5a59666f73c395139268024a49bc7285aa7634ce461814592e74081c04a99c84a2205420a5a9777a24b11717011d897c2ceb02cdb79b94d26862df47cd793645b6288f4e7a1f5d18a1bf732dae8850f289307ab82ed5ca025c1553b5d40c6a776946016016ab5913845958904b53fbce279979dc36a0c6b2c483864b33178998e090d0e01d263c84daabca5258027f57bbb99c00d817749b14bfe4902ccb65258d50559d6678206ba44f3c0160dac0434a1e2d25bc16b407b0209b1b08122c68b75a6a4f22e50387f13a3f590ddbca358fc60e8802a25b31bc4ff327c1da127b20132f0036df997b0c7a1d43f8758b4330452ba985c9241b1879c0995247569bd1a1c927b52bf318695e73102e892f9588a527c68196b625ae412b4fb35ebc3c147a4c3860348a414875b60233f8061c38000401452957fc7223303930e653051535e647943b1a50d324108189955e589d837b1ad3fb331ca7b0993c0d5275b2f9254fbdc87ecdc8b28378553719b1de9297bb65abe703294d11aa41f7a5832a7247c100002b2c3afca68bc729f0f2432ecca03b83b6c748cbdc457e1906ae03f25ac5e37ab0880cade4c8aa6904862484e985a88f54c0ac75712ca9706d9c6e130376a14549a1a7a9d2bb155e797c98a22076e00343a55f1d488941a6527e808a65f3b79a73b46c3523f71455c0bb33d26690bf657900d549988cb96069cec0822b1127cd9456c975cccc86486ea3686f46e0ac92b35ff2cb881106c1803823df12163d004ebaa45919dc7a2c304868885badfc4baa43bc386500b1f8acbb0734183b674b338cba409684f993d8a6068d466d4ac82dd5e42f336badb7c78aa41ab2d0eabc90d9a6ce033f1dd9755939a8854498c7415af65b52934246ba521fac2780b0e1586e351dd6266e93ba9e3955c753841373dc89504c7361081034f02e18311fb2297fdbf79d004ba49cc916836209965c6ddc2c4a55b667eb1c08d405b01bc6204250159fd55485d29c48da37dba05a6cec2f856943f383a6a5ea09c947c4c7ca849881aa6f407a1e86be6954b221acaede360ecae49ca9222284695f93480ec710365c68847e7b839aa81d84c6bca8c7a71127a750e078cde65bdc649b17a0a928c8cac51a9e5a40608f21b3254b3e38f81aedf4c69bd49aeecc32089634450c42999357d432a82a0b96a789c3001c7b9a5b55501a7f360616ba7a648648866228bea7520fdb11c70d549fb958c673825f98923469fac9af62c702bab67f29815b331a136b34b29bc54302bf7f35721e722a01cb7a327b078f590864841926214a3f068fddfb8cb196c7a8d8c78358488723bf508a27729085ec4c9bb7337834212b2ab082ee1339a8c64e267517db35ca687826d4b62d40b60aff89c720ac62fa2c3091eb87c3eb1f33272585a6c91d8c669b1a69c9211c098105a0c58960137b3563cb16da942cc90e47c95bb0f9895af845024692bdd99e87269c15f82468454791c7682c8962bb8b85430bb6ff067df8bccd78a476779b075876350b3668fce84af7e5b6a90911f973144740046aa7bab4a1bf2e6961540990d159ac6884c85b28309336ba18ec9e2455cda24a1c25246375dabb21f0c252b4319452719c84756d730a33a90502b4749d36a2ed80b755a931148c8074065487504b5a7c2db6f648adf92d8c8258d2689f921123ae5495feb095b5c4981a860df6478340bac21b700601d324c9d0a1951353fabaa885f00b3622b59d31cfa2eb524b3a5f33e520c6074382ac30cd9636f9c3693f17595a4942f2bbb5b168649fc35a3ad63d11179e64c0a7cb258692087f665620dd0125e5a8901eb8468cd2007020d53b72000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 516f535f15a891e51513c4f47d87634dadaee540c8d5c4970f199679cd8faf38eab3c2369df56d5b31722036fada3011eaaafdf4f83acb5141e2054095ba0f31ad2b89532ce8a55908c9349fa23ee04b551853012e712538f02c7c6cb9bf3ca670b8a3319aabaa5f857586bf1cfba6226144b9b40bb90a706635c1a4d252b8f3bdbb3eaceee7c0dda061b9da7a3166c1464f970dadfd92cdf2f6589dd8c07db7d8e7071978c7cfc432e668eda06826facab576af7213713abb2c3538291f9d09e59f956b6f2946d67815956d3b9a492bc2bb1a2942e869245ffed653be70f0e39ff06ac55d7f8282b331404bfaa3ba7213c17f7939238f7f00931e39fb5e97bae2d4f392f59ccdcec0881d75da5933c31f20d66b60c9383d36aa12b1a975fae04bf808f6ba0099a838382b844df1bcf1366e96c462e2219ae96c3d25d10792c775a2d488b27026e17dad61745fdfd44772116092743bc74ac5bd519dfa22a39f90f4bf38160daa52caaf71778f1c2030c8715674c2aa7191c988b6a5ecb02bb68126816db952393e8c52e91249f14e920003a6f803b09543342360857b2de0b227feb86187bff55245d6ea004d54527ecc6196155d0a32fb1f97908c2e61ee1528ba98d039096eaf8d4bff977f05a9a0b53436b55d2b9322cf1b0f6891b0573d44eff7515f5005f0a12b7066180436c24bde5ddb183652b1f41245f812981fe0e97ccbcde1c2f3ef7423d1bb5e744c05ff49dce1af51392851a716834b4f059fe179f1cd31860ed8ecdcf440f62333c86a6cb7c21409fe20afafb972cc3ef584cb76b85208c56c676f21eb27bb490263fafaa2e23e8f3379023df3250678d0287badd7cf425c04632c1b688ec438dc6b3963a26e69e093fba5ed940e672bc8ae109bc78dff824a04b90dcd5a5a453fecf60c33596b4a89bf683e1ee5a3cadcb0a6c1371cf21ff75335f16d94b67c0b774c38c592a498a9d7ace89c5cccd998a339c84d3ad90e2fc96c0d1d4caa6cba13c5a11a9e04936f3610e16b36c2c37bbfb73517ac10ed3bafd6b9424c2dae97600458553a243e124c85ce66b414129f3f08cd48b33af0a633befa2515a5b7eff8b6ba70710538926d05ba1fe341426278efb17b2b3769069cae9c051168b5e5deb437550e1eb7c0bf88c2514fd51d8d511b7ec90c233b846a103c0fc516e8dd0805c5a2b0880b9a5e293e0511926802b252b7781332fd73be09f02a7ef234cd1cb1effe32cdd7e3a37c8668884cb8e6cc10033f42786c3ceae1754dd4b7b9e69fbc8273e27f977b0e1c3b320d2dde5f9edbc751b742ab24cfd776a67f3a5d52409911d1fc1dfdc1d35771f5ad35d19c36401b2688118efaf1c71f333528ec6140dd2196946d69c6f1b6f53428904dafa316bd4a28ab7fbc9380928abece9ad7ff6c6a9c26fc581550900b7e6e4db71118da5d5db5c504d0d45b310abf0057523d573f868aa04a99be48cc694e194737a1502c2a379ad39ee8d6448867aa2c970c84f00c446236ab4908d791d304f69089968ec5412a807501f5a11ddb06bfa598ac07ec27776415da98efc38326973d6908c1b8cacb95cf2a04811ca39bf1ffce699e4c6d8bd35e51e4e02b89a3545391354a8f4d46beaf9864794524bd6c975b15ae0dceb2c4623096d75bd1ac8991880b3cddeced70fd3b27af44b2d36147c2e0d34048e4f30de879618e7208529d30122fcb179f754d2745169afea6e91d5538d67c54648faf2b61ee1e75154db58d17160dc5a5a36fab0a8dc86e421c4d99f963e6822802adc7b261357bf34fb4ef076d1d617e3ace0b8936139b52bf6ad4ad26205dc206756ca54c972bf932d4d0646df0eaae7a7bd2962b26df4aa54f4e9cc353896163c8b48355c7df687941949ed03b3434102708f881cd9a114163fba2263e29f992eacc807c2a96dae2cfa5701122f8426feaaf2d739802b29f1d70cd6a46d1a8e15bbda052c2ea8d1f41d4a5d856c44ebf9c7fa22005eebb61c0f0012e4e36b2ac1926db6938790e1319b9bd66de5ba35674bbf22317731a8133eb3c45cde4f328275592472ede408060462ce06623926426e5c2fdcbf725d5bac2b34e0c887e668e0be3c1cc7ffb97dd030295f8739c9813bb429c4ad0d381bf8958d76780beca5b9f559deb25905c618fabdd3bba6a80085b2e5b048a93ee2673447a70a58a09f06a30298ee8d4170fcd +shared_secret: 2b5d1e7837bc6877b4bad1c4b7e04276d96f318dd248017846f71328d85e2eda + +# Rho leads to frequent rejection on matrix expansion +entropy: 319c51bcb76124b92f39820a5653c0ecfba79ec91d632b0488f4020e5df4e37a +public_key = 74187555c00026e85418aa30f84bc81607376ac9c2e64a98a4c024c7165610027967228cf5f85dc88ccf5df023a8cc0e76723c97b99934766caaa3bfae25afacd39eaae56cf36023c6e368cbf38f27a268ca24845c48a85f2198a6c1744c73c62c830c34b8248b52b62f847c3ef87b6458235fd25cbe2abe57aa62709452ca6412c0932c3a10bce9181628631db6a7b525d1c7e5231e33f65470a31371023444926a19f80a67495a9fd1043efb44adf3789c576577f5ae6d136b3268606fdabe081509fe1c4c05077a6805b22eea9f965666e82866a47444721a3e7647250ccbc69df06b3e3c3895c30f6d275ab624913173952d630aa72240bc4b979ee55ce8505f42f1b7ae797f53f4b23616a00df2153fe89c94391a35074946764275e064abaa01487830839616df9485423029b470401cf010fea769d6f237cb00bc2e8c13f6c49f740c9544aa6519e93dd824ca395076c184b2b2078e4a51622401be47f089d2668260b1b8817052d0c407a76009a0b61abb0a0b3c481d86d4c4fe19b910d1b34fd4408098ae5a599e7eaa04321c44da53297f788d9c2a0707f8788780343a80cfe6119bccba711424cd8c453649870280568347ab5bed10b57222c213e55c703ba7f154939898c89e43643635ce47534f770c44dc839f295b1361a9a6bfd494baa2b8a3264bddd204f1f063887192a0f1849e2b0b3fb6293c2cabf6fab1aada5ab9c35a6ecab7b4c605d6178b26203ea82a76a9fbb7d95c8cf0230dc2cc57128493d0b47324d333ace21d3b3750ce6584cf193a0aaa25f8f865d93495598109d5b07450bc9c590905e9a19934e28bb5bbb149f2b68965056b989338240d1fc52e87446d3ad6617927cdbd268249b785695311458909c62a724db618fc28114a904053ca89d127150d930d583ac664ec1ba08949a027bc86c403d0865b9d3781b0d4a034067fc558033760672639697d649f8bc4cd2a90ccf2435fcbd98b3dec0367f02889991aff7709bb0503a2c732c3869b4f969a75f797f32a323d546a5c47ae6e3292872ba85414c7cfb28078d67afbc42894a92172ec2270974a259680f659a03147661ce4ce94d608b62a660c0099ee1460b71b4c091110ad6ac5e5c5978ec04a203686f1385573663956e8c77a5c29ef06235b671ecff82e49d68f8e0054409c68858954d25162f0177fb08b29f5d9afcd4cc512d8b0f42877a60197837717887849ee127d5f76871276b9a285307e96890fd3569c9ba5c58664cc20744c9609bfb859f72c85363a34a721bcfbf2b9c48c1ff8d813ca596430d62370f91b342516e650173c711196a50396e43b46d6661087c4adfb8639c0cb17183dae91b95e1832ac14554909390e087e3bc09e9ea5ad53670eb93c4fc653a6798428be514d6d00509ea1310ba84fe56b2eea2006817b31bf661dcaa3b26592898bba2ea0379aeaab254b9b62c4421a06254798b892272095a989513a2199c8d90afd753b574ca7f17c2c96334f32a703dfe4735bc2965db62a5c995e349bb1d6c63736874180b044dfec8c83527731781dc193b68c997b4f8637a7c86a8c38172e42cf4ea46dd43abed5b0b386508a00bb0203d6a8a0ab5edf228a85aa8f9152b48bf1bb92240c92059b531b4206abaf3478c41d0c1c054422a7fcc405f7bbf453cd9e133208e2475738a03e1ac2f18088cfcb51c8ba447514aa59fb54066c979de9c38c43cde0162f30023c3a1026a2a2a18cc6c0cfc390b7336548a06239d287b6709ba92869a8673448e142f74848bb38b1ded527b0a69370910fcffc53cb875b008d7505428ec11b3f93c7ba27664ea1099f6dbb3cc1ea7d84e1807f3b5cb1b2bac0053c8097094ea73aa033221c853f88672e3ea335a5499502037dbfa227aa458d5ea59d80fa4a2eb72fdf514f4fe22763d227c9a69a5769b63168c4b4fa9403e3a1ef54b39e6568479796c591afbbe1a911f92df63aaa698a2f5309a92617242999176239bc01b8ad26b02b6d7446d8067a52d40c424b99bd353de13a6defc9a92855763fbbce9f648715aab80342beaca6928a036c08361643f669365105fc6853db1a44ac0b574a842e58a74905c9c437fa375fb22d7b113ec4e91319926168516618139d8edb60574774bd808f88457609127617c85394c65f2e3d78ca47000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: e831dc3e5f67734ce3520b52763f64d8f40199c8dd2e723441f9d9fe9b33a1ad8ec79fce3745bc53ddf45990ee1f86fe0191cd5515093eebf6357409891e4822b543373ff83f3c0f73b67bf1e15cbe8b95b0e3dbbb20f10fcad2bd05778ae106e8ab813a131469bbc6da7c2ac3b991c6e070fdc7781cce3cca56fb572ca822b8a52592d24141f089a4dbb842a4318a223b947aa7684be12273592e0d4b6fb65071f9292293a85eadee0cd22b6b893a683d504906923abf3b25e0e7024e7b499b281c965fdea72de1f02fcebf0bdbbf6e3ca02bd05089f79f641ad199300cecc03d88d41360cc895e77ffec06f835c5cba89e8e3d17906bad950b85542bcc551588c32f0376631f554cef3de448afccf8efeefbab031f1c95e569c8b90bda0038082185370403ec340ca345c7cfb1e82a2c5c47bbcfde132e798f53da8c33adabc610272e7ff2037a009e3d3df4f521e8c9b5f3ed7cf28bed5d25145926edc4ce783b11896be3ed184e3d9b92b29dae5510fbec4386e89bcfc033704d05ba91bc6bb09320bf017ad7c567f8eedc273f992fb6d6dbdc9fcebff8007088afd5c9eeb3b14b152185a01b8fb537530b7369b30ed437a280f71597d09b07c1477d8680ede31997c8b125267777437316c44c3b1a1251f608ebf5b37416b5a2914edda779653010685c0d391f888073bac0d4f9b197fa009bc0bcffbcdf0fe2335d6062edbe8f25f87abe8f75b80e9f9cb6709057271ed6690c9b6bc6044c218d65c88b8aba768350567374b66e0489803a9932f77008faee9a83402269803ca5c90592491c686bb25b627dc997a3a8c6db9e5233e02ddb4e5fafc182bf996f741f6f34933d7ced8eb86da62e2739f8a0b956ea7bd854b1c6328671adcb0e233ab192e6f77594a2a3a11dc534a21b5e49bfa45122e24d878c4614180b230836e95a9b3dc8ceb7c826e83a66bed645bdbdc0c4257cac60406306bdfa30a8b8f5a4480db8c75b68b31604cb3eae19b3893d3600932523d0c55a4ed3bf8f86404764187dd4214de1d9bdbdadc7c9fecf06a823d3b3ae16561b3b1890fe1b9689d92e478120e9c38262d312b3ae2eb3d773d946ec99f018a6963b261fa65de5887801882c64f5598003aa4dba947022112cb33febaf8b224fcd3ed10cd2f6b4396c966b5a9709e69c7b7eef4a926171762ad9707af6ee93d4c17b04af42fad670cb7099393d8182045a22e1a7bb8e02da5d4e1fe2bf8c8bdabf7f7e2a3e1fb5db003cf8078635dcbb3cd2b49cb3b8d84e6ed64944c2d75cd6f557deb1b51029df2320ddbdee99f41153cfd7ba46d44c63c90772c3d60531f60e7e761913dcabedd57bfeab2fd0d8bf7df560d8fe30763e7d45c22459991ef1583e6e937edaab7e9f1e8a68552336993460c3dfde7f3a3c5b8b44d6afd57f04d62feb97290b488286426c48c4c87fcaddef7c06a534b671698718fa326549ef5e8e724cb11c21f7b362b967caaafd8205a3eec0a52bcb0d6ed6a1d0c4f433cada99e021047536782581584ef2677b3f3bf75983630e70d57f90b13c369bd4103fd643953190a536b05ea60b47da77bd0f6fabd0ded8f608a08d807234b54830aca2fe82a181626a9b9a219246b039036d1cb04748a2f84094770a12de1411e4510f11b5d090e79d8185cd8718649d88000e6f9571bdf78623a85c42afda73e637bde0b5a5e73aa2ebe2cd0897ebc09ad6974d825a5540627b1cb0e7df03a73b91270ea6402927bc4698cc061cbbec9245024e0515bc27a52714e2189ff3a17caf5b3530b781f70786f074d5c01b5a108cf7d13c2363cc54c73ce71b4b33eb354dc377dab5807a7d05808833c270d5735fb1e75727f66d3ca1ba467545590f3c2fc1218d94bb264ae313930ff8485d616cfd5a64080837ca618344559b46ca89c8b29f83e9a2bb62db57cab70be4042e01f68ef54d3a915d0eb51f21ff89b729ba4d63c6b2fb1b14e5e397f13f0c277dd81705581de763d3a3b8e2115156b4766d40e8bdc0d68bf76e14233d8be21a68d881ca6f5a11a1ceb0393f73a9276eb78bbd740e4a94128e6f5eb00aa10974cf41c6a4cd22ead82816a402a50b306b5312ba196ea4df4c5386668079ccc95a75893b834415254b2feb5b25f0c7529d6954a3657fcef64a8eff497b95ffbbf20bf7023cc62f2119e2f06b3e5fd22b39feef1acec8bac4962bf52b90ed35 +shared_secret: cce58b5d736b86aad09ef4782fe87a0a4555c7f0a4b190de6246cfb21308b103 + +# Rho leads to frequent rejection on matrix expansion +entropy: 00ff48b3769ffaf4e91c1c9110eb8ce9e2cb99f060b486b37035407d2f4ca517 +public_key = fc2177e50618c73948527b9073c885ce0873dc47350eb3a421f59b4cf27438ca36d3f271b4467f61a2bfde259cd4a67674c4a1827a7e23e24e023b08aabac3c8855d4c737f0e73600f368a8614529aa4217f198e1eb69696f2bbb829835ffaa069f31b1c9c5100ca1ea6781b47c3bd788ac8a3831a56b08093fa64f70a1d3402b17b184e96dbae2b84aa75c2116dc1ba6183c6ce5a3cf1e1c65807245fa3211e9a49703498451916a8a04325bcbf34140539b89acb550565525f99aac5cff44d25c163d30aa6d9f36edd44a3b2c6ba5b54ad0b0b28a5e0991fb41b909067c1300fa6d174dea315f33434b6f79016b5be65d87333e606b2243ff524a01a754adc354ae2b444271a1ca5d4c0f06761300715ddf58cf16a41a83892ab379348b778d1a62cb4b806f03c3f219b8419c746b1b127f5cb8a853955626ba6a5130b19022845cbbb250759bea234592cb294fb7c97777855236659f48b59a21c99ec9130baad818536ff238b33234c718a45de873a69d693db31157a86c9a123b5ee11b715b90a409308efe93db1e3512b012435f26e260527681bb939216ff5409002dc4dd8ac83f41c745509a82036ac3ae524cff190e07998b2e93bac316932fc0a56f98f27a7189ed4449b875f97a2950366754d85a299a422e7b7405b629542007ba5c93e372ab3d6b2ca26db5a9107cddb34408d0b075e209239c2c52e041c2889a625b86282ab8232e10cb14c04ecea6037759f8a6057d4c2037527bae813982128205e535a855710e077cf4b3c94db0683d462365f40043a328cc0991b84e8066e44bc2cd020722157111a76970a521f85a24708565c38babc003b1f84739ff5c7896bb3b9515cea8074f2eb18592b2c9af9b67d4b3f831093bc49993cab27f4b8a47c4364c2855d9cb2cc7e5c7f9d6b70076057e3b989fd314e1c16161a4b1e83713c1fec8cf29a60271808c03814e7252c52c1440d933c363b9878b198ad3641c92c53e5d4bb240b03fb81086662041c03189e43c7afea6cc036a12af28b051792fca44dbec68839d3ce6de4340e88bb4289105e162e8021c169c81aa462866cf20eca2206f7745685abba5636897a8c8ba1292ec1106d623b0e2769244f702a3c295dae415602a2b313da54184aa3c32992bf3c7a846b30fb046c816ca123854481ca1a6d1076ba261f0f969003a37a83e822b668006aac6d5ea3be1f91c5f2300c53372668d3059ba8b8f6f020d2c5ae135811c395138f4a3c17f86f20f2bf704705f7b7acb1c617367bced496cb3ee5bb23e34eac352d60459704ab39b7b2b98bd2c7d5f809382331c3f29bef5aa25b18adcd821dc4d0854638be88fa55b1d00babf77ac42b6e256a1fc3030870a8c612dc2dcc686ffba99093b13889da8631a60b150946cf85188e15826f22866168600c3629494063f1a16ff5b90d6db24cb08c6b6d0257730970942ace54f0a0316b0518c1810c860b276b510424163e6826dffb02fa1572b96a857af935ac8423fb9179452cbea55c3fa490148793c42a0450dfc286ae68b782847eabc30e3652bd7d998324b6b87f7b308a947b1bc74683c02f73f2b130219529950bbfbb6b103645685c8461216e8d51bb2c1266b449657e63625af83743b584e325866ad14b0d5361975c01462739139c8ced3c356a21080d5649753a5ac4849c7ea42820d712490a174243cb744b75cad06f4231ad132321c6f91469024a29d7ab8dcac97a91aa8a08adf39638c1053082c3cc4e38adc7950e280c17ff4781600a95692a76f0c53456eb697d30a354f738cee78b5ab7ca72f99b8c224e44d3337851143c46907dd7cc6be50f6f3ac6f8d8537ff4bd12618b79881148a9791bfa77fd062d65c3a5e9f806770664a050570ca2858175867731c2e2e49ec3a88015b96498806ad52580dca82a37d34b39fb5401e45aa7f8ceaff25e6cf94b0db972d1c21f601041ab309cb7e757b2d65578b252585bb6c9456f35a89024306cba79886cb05af6cb230f56025d6c31c325bd64ac6cef327e66f6b4bb80aeee82043468914a7b0b5481ae7b954789836e59dab088b54467a85fc042a26d0581a1d6059bab0f5d0050a61ca1ef1c705f4bb9fee243b8452ab7ba022bd6a3838baacd8725e7b37bb09580e371813ab53ce7746c7ae67fe6cd89411d000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 04825db8d0ffc522482a8464e01d1da34eb0984cee438850ca8e3b8fa37ccf842aa33ac29ccd52eca6f187be197907e7f84ef4bfccb1af2ca91e7fa3cc6cda0dd3df2efed4c3980d9fb011ed301a2117176d5a94c1d9983fde14e4f2e45f28932df2ef001341e57053462edbf03f4f6133918787ba1d62619eb818655091c7660dd4162a1caa675b125ba8461b137a55296b968d1851c96c455809c1d9151403e2530b18ac186ca769cce801f4cdfd181ce90515dc1cd8c1c66596248099de2ffb8ee5486d7674ef326338dd55b2fec7798e34f57351cfe5258a52a6723c147e9908d05132636795ca6f0bd682a10b100688e4d9f9d619e2e8de507caa684208bf8bf9e3b63d473b51ada0ec4424021181128f55595c2fcde65667e5221bd895eb9560944f7262ec89d9070c19b45393a69502a602d753b97e8fee4f1ba1762c21e87d04d3a86c3368b15043d36906472bbaf160130a31ee3ae005e1711d68e07b176349a50647da3746f42862d1dd394b75f4a4baa3061544477cbdd03a37e34a2c57992cbb022df33f4525ca3589b295967976d8f46c931c047b9912de175f2afffa428ef4e68f2594aa88ba839e9c278b23af1b0d1d7094ceeece58ad15d92524baf693c0aebec574c10d67596dc5d835880cc3c79263e5ea520e6d3dbb32ca894f6b37c07b7077e4f807b1f931fe37324d237be301f92798c1279b73e1f57de6825588f5a1eba171b85cde0e4b137c84967af4f12f26f340f0269868184c4b2e01648f68db166ebb134b67e135d3f510f16c450024968106fc8fdc6d49043a1206f89a8ebb7a59a69d354440ce2f6ee4617df5acd396e3739639094efbfd93ea89c436a776c910dae04317c3c9c9af5b265d8e8fc3934a5527125bbe8b72ea8f9c7ed3e760107b313e4855c799e8013a4f29dd69d7922cb76a5cbc6b2d3a6468d74ef015da8c9c3f3c47da81ed7f1491fbdd67c800aacab404e88df2c7fa383ad3d07a1139881db4e99cad396769148d143be6ec5832fe8574310b9b89644865bb206b1f75704dc883c3913ce8f4a3bb0c24dee01548727957d85e42139c16b5e9dec16df089bc07f7466ca38a421709e4cd86ad111d7ed7a317764d13ef73fa4e65722d955d97e8f37341bc511f9596f2c46c356e5366162ac33dd643011777fee6beb5e8b03ded3948e165db06fa89a1e576d1e52f7785b6fb1133ee82a283766cc81948879815e8fa05cf29c727b8820b39a4ad80ef57e919b71d83657331c8daf6cfb1cf7f883ad31fed93df35abb12ad6781b19c0f4223303d39957798d516d09dc00d8dc52fb60464e55b8db1ba5e23236873c1c4001bcea552f5f633ab42ff3124aa5d62592a9405dc1277e24a9fe610de9f3b2321774ef6b6dbd91f1030561ccd890a99df2a039264c74a3cc5bf97ce8572a4ac1a34745e55f9d31bdebddc04882fb27283d63cea4fbe6e5f5c660a8ab5a535c44c56c39664206e63b11ab9f7127579e9e7bf02ca8e249c2d21639f6e09c5e4b73ea45351d0841f87aca886cf4b171981289096858f59a0796d04d2b0e1dd8721ff246cf53f46b6d6fa2240907440319e0fadded6877a1cd9be7347a2b757a11e0563b6df98bb12c79c6fa60803bed991bae7524f7610e77026d5e75843ec50e684bbabd0b37b1c1e2b1b58c88022bc874e401828d20a013dd67f1e26a27b440b3a85292a65c39ef0ef17d26178fabbcc21a64e4b90daeec7a763402105f42a819fb9096da9a52fc3e918259fecf4aec6f54f167ffb795264ba7ca86e7f9ad67df0f79ba29a83534354a66b7c9c32dd386809e3245b3d7b4d353c3ccce2df45d30a37a9bb5d197d1ef74a31b0e9c9022298ef0fad317ea3990af27d9b2c80c1a123d773aacf759dca2042046014b7e228c963977cbf7ab81cfb7870e9d26049428b2eb88d1e4e1def593f087adc169e46a36869ee73ce1f5b3ce962636a75b1d14d1423fcae3332d2cd6ef6bff1b8cb7221c04b7a27e5dd7adda864826444c94f4247601004091548f8e3fe14db0e3cca9528e76e2db9d5686fdd51442f799e41d7f63f93a17628b65233e9882b82916e02a0f84e5b0592ab1b8719a0aac9428e2eab67c95738c82e4b0a2c1135bbbb9d243acf146b2ee88aa84ac00af15cada505528c1eeb3c7bb23dea16992c489febb1e242a67dbfb454c95b42740baf31df72eba9351e1c1 +shared_secret: 536cdb35f0c8ba05ae954b77f6b04849704359e9e7cdc7ff879f4b70dde3fbd2 + +# Rho leads to frequent rejection on matrix expansion +entropy: 4960ccb1276f96d7aa55885b6ae6f90343d42e1391e8241b5952931a979837e1 +public_key = c06b2d1ac8bfd7d00164a4122e50441742702ae38c2d422f6d956a214375485443b11c3a1d705a03728ba53b9cfdea8c83550ef17b9779220885b993df38bd50d12933d3a4918c92813490aa5792659206569b7514a413db3506c28095ca4840f964312ea8862bdc932bea84fc19749c026d0e3c620de5942006b47083514f141f2fa81713bb95523ba5df235a78f52aca7a8b86256c64933baa18342c1a3de1d3a0697809f6762290b0474e205253bbc80064a8d60ab8844324e20c1b249624bdd5434efcb46f52a1d3881cbf0055c390a91b286bf0dc67a95a4acf40cd858427f805b057d85a5d121a7888626341a7e475a512476d8f15993f58918a22b92c23908bc528dca6c3239794b802335174b2e2246d579b5de3a17d7f1aadfe69906601730f4b6d6717ad98d6371628b062750459fc9cc1640b8a584a92d10d4adc136c8c7bfe76748a91af2d644ba95690a34114ea574495f967f4b951cb487f4369858f79c111e8671a250dc0c053d857b3d02566e2254df7c1be3d1651bdf29d96829a5f41c691f4c1e4d8a5dc5b4fc9dc772e4411c442bbcb767508b7585116232b8b4210bb01f7bb24f54820b29a494a07a4456b785b90b29fb89e265985133828e8819f3c8437449748c7cc7b5c40ad0fe193ed6b1f0b0ba71339adccc7020b9334107c32ef765da84564f8ca0efc213e91219a11c495a44b905acabf18720f8396c4dfaa78a5258e980c6011712188bcbf10d9cec3028bfc85a2be9b7fc879cb86175900a66df3128843c53ce2417be898073b362b98942bd52183fc0b54e5b84570d59cdb6282ceeb3ee9226c5a5806c4646056b4aed3a09dcf4821deaa9e2b7623b0193d2ffc25abcacdbd6a39615102818b9ffb6a6ca89911aaba7f1ab6cc1601bb056061fd4417161b9a1678be6f5558d2870af1d18219a031e685c66cb74ebe7a2f177b59038656ffc56801c839445c61035bc54ef2b2aa451ce494acb9574c8fb4a6e6399f07ecc2ad5054bb23cbad267a9ef4c350a2403c06bbce5bb71f2865d905624fc0c84868a3a7f52cbaf45f9ef27a9a0a3e83da93721464a910b9f0399fa1b856bee051ab84ad33113d7001af17926b70e758f8001a790968178c1b9e679e877591fd177384519da0c94157001bdb6b112a74241a447b4fb31126ac94e993711c4658f20b81a7526a55e9945f53878dd64a09a481023b385de41b763ca371a3cb5c927549b112fd73cbf2012a5b334f446962111907c4b04a0c06ad9c69b85a722be0a33860997ed58312bc0b1958c4a016650eed626661785ca1e8766efc09732a7c3f8044d18564e2dc8ad9c62563a01433d8145b13968835111073cb134a9b0dc80f195ab12732514cba1a66929065e3159c4a6e7d40b182f420ba56aa6d4446eb7bbf49db265cd22c189139b50b2ad4ba1fe8a130e4d9427cfabef8a946a51a5defe3642842365608b0af110116dc3bb1db7b2ab137c6c3a9c04253d60c72e696610dfb62ee841d7d427842b032a254c3647b0812f20175575ec1f1c0ea14824aa687c4c52f6d224c289862e015634a815dadfb1ec495c4cc968ad6e983c829490f1905b55a1d4a08b50d3114ef6cb4c780cab2ea702b8762c89492a29c452ee35e00c366a7e932a916977c7aaec8908219466864f8b0c5f8a3c46c745aa96550a710203055e90916b190872c186efa16172399240e0801b3166810360db1c7788a33be47062aa3310b57c1220b9001491512be0366bcc67ed80640fbfc7fa5199d261a3b9204cc085baf653635c77c80c39a080dd61b3b095c9ea24c8cd270a722bc16ec5011e2b6494b0560f8b126b943b0b56fd0f82be5fb615d724c74002f8aa85aa91cabe3d79e39753252b847843aaefcf56e08a919b7bb7bb5e404770a46e6bcaf4d278924f85a49a496aecb6ef2ab692590877f2710cb642f312231310926eaf8a96b4ac13224439decce0bc614e8050d698b015d318f284109e2103d1e877a4f43bda014291377172c6c8e1bd7c80aebb3ec3578cde5ac745335b6408d7cb5150e26bf95641441dc06d9454ce9e75bd6eb19b4a49c0b70adec9695c6a5366e69146aea0a6f27c53f19c4c718cd21d1601a8a1bd2c26f9b5aa984abc34c4bc9b0e212e1b84b2e41547883378681045145b341cd0933ae000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 8d6c45548a028fe38093d0ed1c1f89f921d823750a65a0f4b55eec20b6144a6632427f53b6a56e7419f89286e0b958d63d1b5ddc633edc0b08414794b6e80265b426bda64347c7e6e8071a7076823bcbc9c96ed247d85386dea5de7eb551fcc92d86f05c121d16fe669afa879faba422c460c1998d150fd0f2a27b9928b66c022f879f153f604d6372c173afa6e3bcb8b9792db362f0b3ca28c7cc4e128019cdeefaff98cf247f3db5a35b59027124d440fe7c3f523e36e48c343bd10acbb4faf3859e7012469779ecd010c6a94ec63021be2c22290ab1e4bc92dae6dccc71263172172a0c527dd379453e053050b79aba7100854473abeac7c0f7d29fb9f72059e5b64f83cf8a7be5c2524e0d87e7b9b1851851291534bddb128d69cb025416433d006c7ae4e1e9ba95ea63dc614a8677ab1472cd8ca7d9fde895a658e0fd4755dc340e46847265454d16e561ef12af68e4be6db09c58d91221cdaa5a2188fa05258b0089c1d66ac890d8c7b9149ee9e27bf16cf78a323c831c5f3cc063a2aa48f8306bdd296efd061305b1da2a696bd80fe90d2a873bc9384231a6edcfc6a83bbea524eab04af929d6d489ecf5480e67722f5e67ebf463d36a6b26131e9284e40083b90e0fba3db9e347b7470405cb4486ac1ecd87c4ae8893d65dd191466863d4d98226c6790cb8a176b53978e726b5494397d7a7e522ef31cd40e600f4156384a2e605be4be6be73b57aa1120b05700cf7bcfab4aaaa439cb152da52f4129b78c50f5d7994591b37fd444a907981d029298d590f4d7ac3bbde8d852e65d85a0402ef680f348146edcfca9886509e8017354daa6634a4880ddb3db205aa23b7f1934a35464105fe852911c7729fdd5ae11b8ffbd3e329c7781bf9a19e8a25d2f15787178cfa6addb4f6d739d611dac67d64f01647ccea0a02f2f03ab1dbf0e45c95dacca0395b3b2241a2a4ff3d82d8fb02218dce04d2e00ec60208a9835daed88c91b75a94d80a5c10054491d48574766c40d8b2aa96836f9965117310574168eb234ea516df470ec12ae167c4b618162b6b7d751b9e8f7ec84262c8a3d442577456023d2abaf2f8f666c7e7c2b230474597e344fad49eee580f429a65e40abad25eb45b3cd9df1cd42aca2693be05af75241638df4a8b400e2df9342c35f450b359c1b0cfb5190453863d412061361ac6fb7828044e55302bcc6134cfcfe6247034a65e7fb89da7ea05beb35a386950957aafd29c4d60770d6d150a3c97e50ab9e6430bec496b9255aa054383d1858956f86d600ca56f05db5546af09b81a3a9b473d9b8b5d83de010a6c4dd27bdc1e699e998cd2b2412c732d21908441e7e9d43b571da361108518223b1a3e8f7c9f36599e4f933c9208a0716487c89050b473a1d027b31044ebaa81f8e62f4766c3887fe15282e84dfe303ed273f96fc70b6f4402a5d97a59058d016f3f6e9dff119edec4654aeda2cc011cf005ba3d6cb562c23d8ab2aa1cc1bd362ecb80f3e0b2261ef518b77664f58e90747f273fb19386d3602164e1c126b754269a6b5da31f965c36023fb2eb454e6fe0ea83c83c2033b49cf54056119660369a499da230a4a6d528729809dce197ea36b27ae6324197ba3dedd5044069ecc9f5ea8a02ec29089dd9e991fb828b87f3c573a0bd7b9490f5437d18f98526b4fb66ccbf2f58bb8b27441fd5a8b54e23861115bddb1ef115075541d6187aa3083e156a61c4ba69613251e2c0800df9ebdde17ae7643c3d6032680ed73b44711570a8b269649b33360a92206b4c4ec4529287376d3b0596d9dc94a5a25a75596fb3efb449fdae50f3446592d9a0fea2e9c68de91e21a09f85a3889635927414d88a5f413578d2c2e79858ab9a2a75f9606eb8d3a4fb582429bc5527f5e56da5f0e24cb3afab72925b3a9cd2443304dcc1cd96d0c496ccfe6941f870c230bd3831e7d6c25ac1132cae6fd7d874192514e7f812630e0919aa735b5a7f8fb04fade34f1a478b3b2617f0fbb6aaa1392adca2102518b4518e40919ae5f7770be298c467de4663cccf5349ed38056ae429fe00d332447e12237394b8549fd8655b31db77bf72388e58369248e9682fd2b306178bb7bf4aa3bec18da1ec50f5004f6fc8a92f56b4b87ce71e6709a15bf5f1442ec7a0b55c70507d3ff42ce190eecb930a2191fe764ad8c3e1ed2118effa9d8806bb091b8557 +shared_secret: 7fa8518febf294de03c48fd26404aa1736aee3eaf19d5a55311fc4d367d56447 + +# Rho leads to frequent rejection on matrix expansion +entropy: 456be124e7f43803de5f734ea016455d68164a7f054c003f4ef49e46f42dd8d0 +public_key = 4dd98b98b790d85379e8434858571ed2261eda1ac35943b4361abf24b92af0723874601a9dc98a6c872801c54e55981024887f9dca26f6531952055f0ea90ffa859e6c39aafdb8621ba078dcb4884de4bbbb0b96ef167d5332c00cf79f93d30807a44e60e68dcab05e3167315f5b71bd2844017b417af2ce61e2a2d2713b7945cf20a39a0cbc92a07348cfbca566d04fa6983c3e37b2bac33627abaa656c873da54a46399ae61117086b7798259a11315dcf411eb7b4a32f375596485dcac61494978e3ce6626b8194211bb134aa82d3b28997d25637f4a9bcf828f7a17d04bc15eeaa809d582297da9f5afccdad46b71983a5f40763d709c2d7038abbca9dffc530ef293a78a43aa2979f53d3a4ff184d2aac5cfe7ac114d378c7a4a46212a3c56c7443d5b4ed309d7d356e169270196159ab428b6dfc5441004fbc019de1f5aa0aeab64c850d1e9acc000a9628d849bdfc7d8a4b29664b65a66aa4ece6a72ad5136a7ab61f8c85eaf798ad7752b1c5908f931699c35fe2c19a7eac2c73f512e4a368e221381281c6f3688965d55969309ccda49bc38a558b605e38bb593c2bae94cca262b37408fcab7cbc29dd0466b7e7ab4a6013bcc7a3d9b87045f7609285aaaea16ccd1cafefa5a22b33043d47ccc0b0c9a0487691f93f92ec0c9ac47756e3cc91b3331866afcab93966c2a1d1490238c79c61d757e5c383a691b2a241c6c19bbd5c99655c4c632d95b9368688ed9294a4865c602c70b40ab6b1cc6c6b039206bc560c302394e46c428a82979b2288b30bcb813e6c35c35565b67bfc1dc4804ec8462d54709a4ce181d46abfd6554afce4204eaacee5092828321e1d3132d7d0b4f2444136117ba1dc843b440e2b644ce6b5cd1cea7ba6fbb1adbb0a4d9417cccb68add346446172ac0232727a6fba3cb59c38057b2b8be26b56d974483d31019fb33d94449226608adbf1b1571c34f5f920565b4a791b78836aa50687ba6ba49b4e280bf037b6901770db351af99bafa9dc0cab14b406561c101478b4b20d4f765d70f072f1d6676c43a8ee432426f2238d37c11a280adb094458fa6ebd2269da310438503e15b22da42a7a24566881d3cfd41bcefb34cff01328a16a01459259e5406451d831f9430ef7e94d4022714c007de3fc0fd637c16cd14489f178f54aaa72529816f3158c601027dba98093712b54aca5d33954077e3b856e4588432c510342e5c99e90995fe7604524a3d066196dd63e98a3b325d2a8669013c9b10cfed68b24b0973f0c286e59605bc3c0d34094ea667b780288e323b334463dd31c7c64b10f6479430406d04b4756fa685aa30a61bac24ed5451a63ca3299606491644e76c765b8ec2dac478192a685210a4af4397f7646309d17b1c1543346ccb884c28418858a5fc9866dc46f5bec91f2a73c02a1585e620b7f9045ced60827f58123274649048477c70f4b57ab8e8189ee8560ce4b84b2d57eac13270f00cac1e0a11a394ab4fbb0fc8890af29111cb87905c09c3d3170806a80063258a6625a24b230c502460f5c44a6c27457e43412a7671cd24911b23f38013ea1d7771f6b4ce483803778be0e5c447b457900133f4fb882d2b9224f2997a532360e573fa626543e856f6b8760107110cfa28815e71b0b1430f02bb857005193875caf86693c1a0748d3a4d3469be2eca0db34b10f692ec1b12d84453fc067cdbdea8bf59a2b00b083a34a5e3061327263be41ab8012e8283f1b86238a077cd02c79845fb71744a0b2306c29a541d6bf2467a483a03324d87cfd00135f8a9bc3aa97ccd68d0fe98bd7bc260976344cd9af0e6c911f3589a09695064769f5b92ee1165ee7f10031d5811274075ed14069d391b09b3b0fb80280767fd04b47e755a1eb3cc3bc9084db2b79e5b506a4022662909c135083b5a12a59c6328f6ca9856b0befb52e84624af1d81b52068ffb80c58b837134f49990632354799ee166461a916b170a5ea397c319b0a492f566257a3672101038a88be2e4ac5781bb829423ca2429b8238150743dcd43025da8121298b8557c410993828c316265bac2f6c2b0e3340ca5dc4c01045c14731d7525158ca89e35e21121256d08b8ad6c850aaff8ae7b97cb1e8683befab96678b6c0c564b2d41d92d24460d75461c91b42b62112ae783c1d000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 182bc48cfb7ef59210e250816725e59be1f4175faec6003c718d88e5d802c96d95e024e9cae147f6cebb2fdf3a98b796a1cddbc680095fe1c4a3ee780b61dff0d5a208532a836a90c919b32e23ba0539fa28ad99c3200469258e444c55237ad4f25651ed888a9ba538c90a94f601d0db2a8e0ca91b655c7abf7a4c5e2578a6de7eeb68dc681dbfd4fb042c6c36dba421a81dfba5c2d8ed9649193905692db183a946dfb819ecfbbd94494c36331b1d65e6468c76b28e35af3b5fc6503b1a7407fef9c493d8f3b86ea00900c5928e857744ecae5d8b486f755b6ef655a1fed4261daf062b62352f88e8f41b4d3a656a5b8ce0b3c7d44ccf4f9e901c9a77b84240e6ac45d941cb2d9305e9e78ae39213e825381e2cab3abde4447b2742677fd271d0e53fb1b6eacb6eebc24cb44444a58488fb8e114f4a771e16e96c350518ac2eef03e1c116034e7a5f82dab805994b791af74c9af4e0e80cb1d543779ed0edd752294652869d83f43a26c9198b375b621d8ddb9897f9b2440505372aac898adcae00762e5d46f189903e1e3d21d5036a3eb74c1a833e377050dba79bc2fe909b1f4df99ee85265ba379b83ea67ee9b7386dab1ea2dbf2918c066fea055b7024f60e9e431619d2282cd207a06fe2d926f96f6d6d92906c71c5a9cd64451abb4e9d4eb4d02cd394740a0b6c3d43befd2c4edfa6539b1f7e165fcdfecb8e0a5e52744b050b5252df3fc3a39badff486164c1b238e315362bbc9de3e34d9e10f44931fcfb45c47d368d922c56695ae3bff0d809b620f28ae16916432f7627c2849ba943556fbac4bab79c8b939c12b78eba9ee62c256d378ee912b124f6f7c56be139b9a5b85f6b98aeec516d1086cbfe06dd54c4bb2910a28206554d312f907c7462f6791f07841d9bc88a96870719dd548197f3b92d22b8789656e41cdf629beab410d8a7a5c65453949256892392d9ea67730007cee5482f6beffbf49dfcbec6f76539474f34d9b803b759780dcea2ff8a307998ecaae255cb0bc464c4fc4a236d3989a82b6e86de2d1b9df441fef56524cba6cf996ccdbe18e7dc433a938fd0017a912c44177341a42cca0e2104094658b1a2822cb0d2bcddcf37770efd18e41c6d3c9eeefd57f7d350104b569cf270681f2656f8c561c901a17c5453ae0a8ee6bc7751d8ce737166d2978ee8f38c9ee07bc785dd59ca6956f850dac891e1ccb25989dd3d347a0194a1d44d8c8fe9418be7e0ee631a80798c2003bb4bd5bc76269fff164ccf95eeea8c0c2867bd5ed4838251768f910f9b58f21478509bec110926cb886ac03f6809de328311c7f66636b46fb04e2b54ba2b09cdd06c0b6ccf1f0d744f699f281e8aa1fbe90ea035924777adbfe3fd28d21935ac911be0c8de9e2393632d07f140ccccb46c4d625821b08f55335a95c2dffef96e1feb13091d257313eaae7d911e5e120f2192c29450e32a101738fb6a73104d9ec0a2f995b7b134f3f748efb82e012d63448bc417f54e3f354ebf584b26e4dbb85c75b28fd9ae25885170ad64113e8d5b47d54767ca184d579edd0b0bb30bfcd5d1e44838df5431235079163075ecbf30ba6d5ccb737e732aa16624abcb42f1c63f91862471c3d8a14697ab74a28b4d1c7a7426732e7d323c2518d82968d7237c76493fd3dd169614a756f7f931f29bdc89055688c142cd71dff82a33f4494e36a64fdfb377613c92d58644c5828997849e19ca5de4dfbfa1ad860644c60d794f0cacd1d8b059d9a126d56b41ac2f03d8c0cbdfe04573481b5d7cff7ce84d757b3544ac5162c600808a331fa671629a6d140c49f4685727f087202a8ca5186d2315d47270cd61ed96ef6eae844194dbd3eae320aee0338beb0d163fb668b22451b3d5a8fb2b4c961a9615a6b1bae6d257bc5baf216022f6d2bce09adf8001c9f8e9c9eaab2d9c5af0e81dab1ca14199646e854bc7b33419490b91c01914705f5b4d094f1b71c8557958f01430040eaf2e06f427135e439f780ce8184e64b339537ec933c8a896716738a0986491771d4d4e6e98d4d33e2633ef2b9dc3c0fd83dbdc48a2c8aa53c70aab81bfb13c0cf11f1d5adc9aee2b1301b6e3a7e644deefc7f1ca260bd26abe04797f7b87f32b792a68db6d7136ab6c4a29207ffbab0aceadf8dafb1c7cd28a484049e91bb900d01a10db39398f6943969f82c82788ee1568ab6adb1c6e2 +shared_secret: cd7069783053ed075b29b8bb8f86ba6e723df5d0a8e813c585874f5b39ca2d0a + +# Rho leads to frequent rejection on matrix expansion +entropy: e8ac9e76377d67d84f85a142383e777157805be0d0f679ba89cefdfa61583780 +public_key = 453578e606159c2c0c8d25857a72912297b678d44e0b328bf0d05a1b096d302c6edf39934ea185d1577207264f0ad6c098f6ae59759ad045726a03c0735080c6b1a7f39ba84c27b41ae555f3e93133620c81674a8d9b29501b8bc19ba9fbd375875843524194858a88a57ba69f719c11b534b5055ac821216d2a54be9771fae1bba5448e39a1c6ab667ea0fa6df038a1843675aa5ab1ea132f797490c3da86b0d58474db11417645e4cc68d0294839513b36db91bf3ab32b2aba77655c407240226bc0baecba66c40dc24469ee617f06f739d7d2249a5802f69285053c74c98cbfc134706e535a34fa03f0a697d3db3e3d2240958ca40ea9545369bed2d44e75592154967b71956d35031b8b425972544b63b8bec1743608c2ae16444eace5395689a02d0999b189065342166984a1799bbc00b7b1cfc33bc210433fe86464093d69b83e095b74d46b8786e71732c6088b4753933b77d40c32570879525b20b2b006febb8d0195a6eac5aa310a38b2fb1506d0bac2857e65ea29a210bdd3ca526d59a259f7cc6ac20c078aaefc8537a69516a8081a0e6313288cca716869ec4a47b7b1afa40a59f9f1b79a2307582a2537330dcaa4167cd848bd51725ef478fe98c6ab616f71a43f24f323f536c6fcf67fbd517ed2d61efa9acc8b9966d25848cb416df944a7f8f900c395884062ce1553518abb314b446a85a0a58f78b8d9a8cb7f027ec87470e9fa05cecc07328a6fd03b8960582e47e97272960802013be71974e83573a0fcce793160949826f376492e3c4bbc376f60ab1362273a918bca4fa64c13c290af3c59e7b0279f410a14d5b1d53c1123dc1e6515619da1405844b5047831e4e0c2c0eb890ed5660d7b98f01019cc98c513ba29ff89101479bec1f37e81f84b23d907728665dbe96f4c2469105c3f3261cc4972b030c58746258eb14494b39381c8c022b4010f6758a0ae85c10776ca67c8225ea9006d8798cc90ceecea408d896ba957291166a189619447ba3940379308fc303900a409b333c9c5cc54a8829a4b36241ca9bf319c2442093c1c22dc111b64e783511c7b38e7481977a56f5baf2ee28e15fc5f46a0a83a26b3edcabbd8602938b2c320f0a384228f1d1c86c0a41c2d238af906c79c5ba65e66a2e76626ff50bf3acbc24b5891e0f4370d764b6c503997b98c9c4656ef1c6ccc89a6794b5913d829e87194088b183bc64eb55c85342a3d12a08c0518a69b4c711348291df114c8da5adac6661197373aebb3ed6b8f9940a127527f43b0857d9c4888082802acb374824791d9c3684c2fa05cc965b9481f1cb1956b4cf3c84fd92083f371835c087371ab840d90b93bb3a0dee11307c66a22c6c18d86a3ffe89434d5322cb17666454482f06d608a8a0f1509562435b10bc3432331891c6c759b4a8517247bd8ae4f950f09638dc5206e39db7528e63d15cbb7484c2f68183dfb234cb393b193e134a470adda3a497d6049b4d712edb380b278b79a065f0bac8ceb654c0607a387a689713a5553755b6121012b614910543bad77c21ad8770cf78ac789c6124369a5766a65e89a8921520febb92fb85e561140a4eaabdaf4809052434ea4a9f5298c3eb4c8a7a98c4c5811b4519402c55102f6973cd13e503ba847874c76754ed8cb92b1ab398661367a3b21f2d0ba969347821cae1f475567700c8a0b911d45b3ee10cccd2544990a6a29d0140685a1de7696abfba58f1577cd84713dd947b9d14d83901c19436dee843021e75951e6474146b355422a80d6a67e4c4ad1fca2d8e607e28032a7d0ba4ef916989a47059922be992381691e0580b5b5192a210acf95285a9f156d14fb3ba7b8090a6946b2345123477e96c373814b26f12b40f0b302cac522f3c07763b82b53d36abf2c74dd29b8edf0c9bb5c749af9ad86542ae6c555930a7a95d31e9bd13ff6971ef6a62cedb4779dd008ff5b165d4b4c4e10ce512932ef890bbd5331f445ac68d045babc39f1f528d73210d0f526fd575af6e80945c92f95448972dab108089931e99958f28ac08567cad714a4c737e8a37629d64deb5c8dd8b313d10a662906bb8e958a60a7427cf2b0c226452463c1cb716bcd9b93d0ca0f3e2a12c5389e38983d11e7534d77525fc6aa32e4a91d552e3cc5049ee74ff2bb98ba8b60c134000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: f47ebf9c54267c3ca90048612dfd843904470288652f4177601e6db651ac45682f0885eca62d9c71a2526068d57bb05d65188f5265c5d8c6ea66eae04070de6be319e67e08ebd76c77261c7d6a684711166b62198a4b7f2cb77f5646af2f0bc24212b2c6155b1181b75d449930b97c7fa700f151e7f679b75692d4da04a47864b307ec54b1288550f4759b25a34df63dd1c8db38b9374c6a9964abd7e143df3083832e0ee46521a715c2f5c7770904715feed7c927eb1e424f5a27984be052d36bde159795e0f5c909c7f7f5fc5f71e4fcd09c1a24e377af273fb9f469c7374e769d49a71ee13faeed93253fd3346e0b695741870b8bfe1046572f9a64bf52dc535a2ef548f932c8cf574e456705bab088768336e5422c6827d18fa0aca54de0b788876c48010249db3e874b448032390f384fb67af94653bd1fcb64655cf467545c2939ad167e37951a39200ac7270c6d7101930c05d417e7407e8003cf428f8e0f4a516fddae3ad998843f73d96d97fa84d37829c0072b75f2ea0c61472a23cf99928511ac3ee0031c61af06b9849541c3e87fd7b11bb1fe7afd49e0a07f01e721dc975ba4440262b96c90f5f4a12fc2e2d0ca6b7969c24a81cbc8d87e3086339959c7af99b690240740709bbc09e41f318c977c5a9431a977decc1cc2808b529d40d8a823f8d2428da165dc21026b73dd9e60f48d1900807ffde3b903b667ed20f71e71790d2de970a13913c69d2dc72041152f44be8c78735ab1c7cc473bd598d7e0a671105e5e26da1492bf0031d7051698d46f36c3b389048bb9147518efb3bd57e85ff5fdb2b606c1504d15eab114fb7c144b35c60d5874b3a6adbe1193f38113fbb78416ad9ea7e896ae57b41881b91e54552e3e7d17891759802e0f49307880eb3dea4657059bb144929d484b6a573ef854b466225a3b7e33f09b4a7bcc04c7ed3bd8efc704812cdf33e450b1a497f99d6c5b7267f0ba5cb250d0e62cfe4d18ee03a11132c222877f3d3dc4a12d89b9bb805bf66629a2c14fde7c7baae60e7634a61e9207dd9ae6ed80da7869ab911e0c8e3ab90e3135de34f548a12ba5a20faec23212ec4014ab1b624f516cf95b1fe42aa33e136a524d8e1955ea964a738bc3d7fb66d92e3926653587f69d421657c1765707ab8e67ec50ba954907d03dd1a5ec5c5a78f044c9393b028417e2919664003a96c7ddf2aa997b5ef1e1f3d9f333380ccad84df867c22eaa6fc2fa3defe362cbd6d068166935c67d6b498c853fec2ec699203f0c1b5ac93d4e1369d8b9776fd86d8de47d8cb813538d613742c6de64e854b9230e427f0a2982d69563bbf7237c9a88b06e67a73baedafd7f7043c9ac7bf3b2d3ff2f9961d62fc0d6a0196ad15b0cbc2f34b1cfcb1b77164a8f8fae684bca6507a1cec731820c920bab97327908736fd552ccfe0f1d075cf15b58970cc41e9f86f28702f4bff59b88f2e478ce69a2f8746673e25cc38971713d018f7b4dde544b05d02921a6ea43ec5992bc3e9b2585cceebfa3adf5503f0d8c2b63de7230221f0e53d61dea4f9e153e3e2db14498a5be638b3177c14d4bd9ae54ddf24aeca14bf1a5a146ee880e181cc8eae9e61e514905fb80f5fa812ffde64918727f2c00541f7ad40d8f2bd2e58b28e1bc21f075eb185af9186a4875f99738a095066f5d2c3b13dceb5935c48b1946d7c45536a122ac99638262eec4cb395cacd6458f6a2970fe400df59d890a3b7dc63cdac7a8f74e4546354c830d45e18f1acc03da15f01dde2bf31669e8d4479921196c826338c18afbb553bf5ef3ad5492dc7e0d4530590a5a09a17629d50dcc941b6a31df1aca559ff490a197e912cd01a4e6385e25513237ae611328b07ffacf6760be6465a00cde8cb8ed630b27cf36cecafe59e9a32c68d28dcb853d346ce4ae872b97abdf85ad6aaf05694eec608cd38799f9106d0f48fea705c0abbf8421418d4a511230c73340461f3a0de4f69b141d00569f61403303542da36953c26def5b2b322e70a101d5fb53aa9b9ff1a940056212e30eac32d3b7cc161ff70e74c0c4a73bf2cc722cfb9c30fd1c90276a8383dd2fc625e1c8d728e16306019ab61066f25ebb9bcbda68322fcbece63328501581e71fc71b7e31e0b57d2c4280100838c439e48d6358c370a9ca5301953d9b4d00e806ee3a4d0fbdbbc0da4ad72833aed64390e03a818bc307 +shared_secret: 19a85075ee44b34ff0b11d12655036af401478f0e66d354ec9d17a6c197a69c3 + +# Rho leads to frequent rejection on matrix expansion +entropy: 2fe6b9cf4510f212839e348d671b3345da68a477f57513ce363414e87299a717 +public_key = f4c42b57b1625ba25249b9697b09985dcb92d155c4a7db3b2e77464ef901af38b930e0b5fb67cd7a4cad52ab9297b383dbfb7e7cb32bf674b24f92c6f13ba50afb2164173282031b584828f8fc835a094bb4631193258f8bb1aea8949a7cb4abd1279ae3373ac36108eb290b1bbb205bf81f907873de0466179787394a48c72bc100192d8a0a46f76aa35a2c4ba8430ff976caa5d2888b7bc054bc07ec8a0374a5276dc01c34918b37795369b66493ac0e3c1362a4f3217d240ad438b7472172474a377b715eb0702e3b1652c3e35873904ee3b139896245c0a05133e873b5183d5ce54b758075478874cbcb00aec3a5f82c03f6ca9783ba3f7a6a1c05a41b0fd30f24f8c47309950282b7aa9ca84dfa20c8a9c5b9b3665ea59b2bf035159a20eab110a862c4112cb697c923311387b99a15066c569c300772eb44eed03e25903e88a84cc5f3b6b982086563a36f21b3f9c434f3200b0b9b5852a2aa75eb54426049c264b73891a28d9412b9c3bc5b87cdfa6b07242a4c1aba32b229b374071d4aa33580b52dc09093d9c40d95801246561cc70136c389ae1667bb0ff600fb82321c509121694c4298c67b36a21264201ea1c97aaa757e5c975195067416964a3a250151337bd489a4e943c03bce82a7b447b134f25940b345166c5b498b6431c159c829434067562f7a331b051854b32b7000c42a122974beccb36016459c61a97517c80c763964c64f6f72cfe69bb2c87c63bf610dce640702e99affc20d1ce934cf1c70683090367673c7422e57389394e7c2aecc13b23733076c6a50631c69106792492a6dfcbc7963998d219f5be767b180568b76658573410ed41796a9affdbcb5a9991ae48572f1d2a78da29a6eb85cbc50329e24c56b41a4b9b313a85abdab851886fb45f643b6774c7792b89dabca1d54b1c728b38dbba6887b028d51715e131cac8ca22eded549b54c39733309efdc2b5a5b3e45968afd13392c29a519328c57e259e7aab48d730175d61479b044fa019cf86681ffb7a43770c7b3e22efe3aa45c61246c368e920b8183b7446475c32f739ae4774c4430c5265a3aae3104629c31218c7b424c3ca25a4e9bc8cb5067a38ea4cd6f704c5cf895bb676489e8995d15954422495e82caf1484fa64264173c5bbe8138b6132cf45b8f6c1b2a99d42fadf494f90730ca9286fc9aab08f3b006622a9837149f30275bcca354136d876a728634c6ccf48be4034bb937bce815b291d9236da83700b494082900d435151ca37258d39c816704f8bc1373aa2f6f1a916e21c983fc590473072ea0039630b016b963fb8bc95f21959538854e9c5fad4212d80ab30eca4661d1aa6184a8d7a872ca6682a85773c6ea9006a64ba1b44205facee36c93b962cd01d700ac7a088c7c43fcf8bd07d413a0022fb43883f9351ac675508cd89c50f06eeda01830c42a864515fc88c9693026e785ba2a163dbc819541a61d98a64e95e62937795290440769c1049592499ea0726c18b943040fc9d533ed38655d05264cb0531d23bec531c6726c9dcc132e34704752ba240b4c4ee506bc15150932c9038e164aa22925152c52cd59ad3c68bf6ac9789c01b7a87b8a5314354f36038a3b2bde93cb73b596f830bf84f024458641504cc450d510791c43b9db3ce60127f081c8d7f61840eb75522590ef57391c3a4189771ac293770aeac4ea031707d6c38a2334d44817db05cfa54aaa5540c3334291145970903160f85cb814905b493bb995ab3ac79bb62e3cbda3d4a0cd388517547cb3b5a6c2ba9ca5646473dba10104a2bac7b4a8f79cede97d48a94d0080ad5782819d8c4b19f8860b711285ab3082784420863487863e182a09d30c8dd8198a8876829f1c336e583d27e4a06b091c4627022da33f06a201cdf43120e1a6b396bf26324d32c73cdf531488650b3b899c1ada8bccaac08c3c6617649233501839628e53c1ac7ae51ec19b1468039ae88140feacc9027c5f9370985a0932422c0b24b849be7a9bc497cbd3d317f48c50009a676161901494a52045afe3b6c516b18d31aabcfb27b2024505f758c91f441b8139889bc6ae3440208f34508df8a25bb4b3fed3929da0572a5a804b086ceb74020894b534bccbdf485fa769aac8e9577e477caed5b029c86b4682a7e74cba8c930ff80d000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 6d12517b654513bfc072c7567a03257db9f6b093bb84737dd5cb2861952e1936bc84892a5b7c5f70c5349b4af1ab9e8b65a2107232f26100b4ed9fa413bf04bd9cf7598763fa3c40b7a2b2593a4bd51167a64d6228dc5bd20d0cd431cdccba3dd5b97a56b12b422f666fb817c1a5fdf9d1fdf8d69640826aa94ad87bccaf8bbe4f1772efa2604d14006b45836addb7f2935697c445b4fa69452e74290115a623e8758803000e0f4261ec8d3a68f4e82df31c8da1a59d74aa956a4227ef6b59b430345e4aabd96fb0c336b9be15ec550cd964bc15f2de060b2144648d71e7ceec4881bffab6540591f3837f935b4ab48c3241c95edbe3b7be6de17f62b6a141048b6663d6316ed3c1e8320f3ec5b818eb890985225a33eecae76a813f08b9deed452d34546b8f806f8ea57e6315ed7e305c420d037c2fd2359022a92dd3b0645e00551207f578158f2d853f41f09680fb226b08344af892ae470b1f281b58b2129b302f2da1b8292bc851b0f274365ac410ee178594fca317d55df1a63491b92d8d1c5be3b2814c40ce082702b9f6a6e6eb9807325aac5ad656523e69732feed01e4a085372b72c604a201730f785059709a6be4589f8e523d254abf8004bdb615d6b45dae3e7609b94be0878532e1dc124e92b24b677276c66d62fa6f097a3a3ba029c56cd7b3af092abc02ae18ace1109e47beaf478a84f34ac8bec69e67f71e9e8713b2e04460de25503c8355f26bbd9a84e8f136c15e93d17c8da50e0ef1f529283a574f81de5ec885b3e114f4b26a5ce46c6d94540981c8e8c38fa5d6a2dc1a78d4655a255a915903e88bee5f30bbe9e730d9d47084500cfc4a5cf5979696508cbb3a20ad11870b0871ba7c579846e67c5d504edb07bb742f58684c7af5b247c5b1459fcf04fbd3f1b2f7caf32a73325244d1febc8bb93488e73679e1171208597d50bff5f2a0b1b0e38004f93facc8daef9865d35a779ed93f4e9e65413733b01e2c4aa7f649ad4774a92422b47b1610fc003fb25b62ccae811e8bdd91fbc65c1b2505a8226ee96e275ac3de93bf8539ab14ebb5f3eaa536a96ef7042a4158af84c80e7b5f161172ad08438fe518d32411c9e9fb2213515617f418477ea1b69d767ebfbbd99fc7ff164da7a43f0f1804f7e928531283445ea517a9e1e715bda558807d2df4a636dc5a0cc59353a33b4179a0c431802b11f676d46fb3a7700b08558c409ae96af58ada7af081d42d6d0db42371baf3d12078f61b88bd09cb9e37f51e512d8ed1f44eed6113600f705f7514f5d14a91b1089d7b441ff4166f728ebd4072bc77530bb85ae0c6b0233d47f9d474466d7b5d852c20f6c5ff936efb6842fd94a4618ed11086ad6ca4dbf9bd6eabff8c230421c486a3c68b440f2e9a28c580cd438ab8da399f8ec2e7e0a38aa95ba39acc9ca8bc928479779c0165cbcbe292690015ae10db2edb418fbb148925eab905a3093bef13fefdb1774bdcfa7b907caa321a5b9fd149240a0ceff340ad906fe103f6bb111eaa53761cdd971dd61d463ae503e96df8c457e71065a86ea58fc345d73646f5c9261701a7264f119c29faa19322af0097a3f889cd40f0eb7884c2b2716342634a640f6c6388a68822cf38d93f159f67048baa8cfbcf5ab5f8b45d8786206a7ba497fc935d2be5644fe5d90e551fae7ae2bc0f237dd03352f511f61bf873b33d4974e1936260536ca88e0dfed5bb80700b3300f781439530b4569084297e38deb96976b66922a11fe56e5a14a5bb01654f485e1f87bd204433dd15871e7b9f4ebce48775e117f29cdab877d65d601c2657b407c26b33778491ebe4944056efc8bf547fa7bf534b56c363d4a165210feea4888078320636e50b08c46168953db0caec119f38188666dff40c056b1f70b4cd956ee8db8309c406563ac9d4353b36f51ebd760670250c556d9f0f2556aa153c0b8416b26fd723429ab0357e32725b2ef106b3bda98afba709692ba91a2ae2708d9d67a79cf615f8304cb4301e8120ea00f1372e429d873b0c7161beadf87fc12f06269784aecc7f6545345753a5a55799269c9276125633252501f0d313ca9f8e06e4e2777e6ef21e78efc716992ecd979fd3ba00b4c3115b194f3b84f515fbb0b4f31b279f3e776273715c05aa9adbed7e12b6f2522a397cc6acc96b25dc115835ee824a22a21319fdc4514f87b4c5d48bc7e83c2 +shared_secret: feaca519e19182ed57d07e8661103ba82976d8a079ae871951bc678c73a81379 + +# Rho leads to frequent rejection on matrix expansion +entropy: 86630b4f72820d19e9941784183b3a0d770609becd6fe0dc463cb6edac432d59 +public_key = 6f87a12c4aa441f688b2c0cd16a89e315b3553a16179db0e01d01e19bc1574c75a13987b2600ba2ca68cba5c1d0ea69ac5fcae7862ab218b1a94b22030b40f0b3b16bee7c6d6e58700e150d7217bd7721afa7702023786f365a43a60226068c5ef3323c8f85488e77c106a243e96ba538264749539f5874d55929b72a695ebc3366589b04880721180258eaa095a950ea13319c0302245d86219b79a1dc61caa658fff790f99d2c3f25c11eb34aef2e66234e2116274ce54e5ae335260fe3ca3e0673128d064a39c82a3a9ce3be0a2c501aaa53175478b847f9cb17ceba19e120144534dc1a9b38afc864913a8dad5a7ba6bc9ada898c60b63deac87092275685820131001911b98af683248b50f1e2650bd299c9628678ae542e3e7a526620d1f78aaff445ba75b47d0ea0af4a3a3e7447851377f40c248053a88f5706dc119712a5001b8f035436c7d9eb1269b845156e60c5a714026cb330eda7f4ff1980fca10f5b87666d5600f468b11d81140b27498a10715147167fba6c8c58680824b21e97bc982b61aa43f2dc4866641b9bf6200e7a8afc3c1b3c70226e2a320c603797330c952050c90508a4b36580fb5c83e7c9be912891e7849db960f83b134543a3ea1c40d7f0029118a855a926f8b6a2777172ad5452fd0a38753a94bf3f6023fd631c3e9a49be1194df4c7fee149698a2cd7b54c5fb33b306ca72b6b7b4280cc5db4c452bb8abe365a3d16c5c02122be27bff2f1623294bb6217c201714e9868b991229df1569d7dbc9ad957379bd58a41c990fde349d50a3a2102637b18be9f4b10cfec0fd3fa2cf4868bac98a268891d9bb208f489c1163a16c4d68a13156ff31a0129839a6ba4436ff735ad69161d551cd0933a25728360a7668f166516a69ace60b8283878cb22394fe8beaf153632999d60554725c041f5b089dc205d4a3759a7044caa82c78bf50d63fb3d72172622f71c31fa66460882a603d02b798470b24409b019a6f4b85f571c5122b872997aa4c389fea1195ac349014660e619888a50142ebb173f95011a716f1b031a7b860d1986a3c43a65bf5654dc8376d2dbc8d25ab90d139a18167fb73b758331ca69274a2d340e59bb6091975407b4039bfa9e2a4480ddfbbc8b26c0d1457f39a38f1b8626186c469b48007fe0cd2472a3b4369d425518988741507912bdb12901fc19c49932cb1b1558862291a63ad878cb6afc2dd57a1593e80e720a0766a031cea2528daa3fa866543fb5a2ed8a1c111593db955c36143ea38a43d73024de9446ca2c69923ba88d2c5b4444cdd94a3c380156dbb0346a02271237cc488c89d050035db74022c7c924921abfd86f71646221ea2c61b123224a1b34fc5f02c6849678313fd86a7da11f3ee681ae5560ad42cb3a86bfaae100478b0677d23dacdc9005b17af54515863159f6072937ac882212cdb3e82f3f811737b81928b605a6142a9195211fb73142c96e2cd309b22a8191166e33d39dc5a26148179521a4ce69d4c55988966ee2b278bc2564c62007e75da8b1ae169595a9dc58dbf47da2e0c192a915a59765abc62e375588d8ea3b72850bd0c584614305218c729628a663399dcbca2d30fcbb6e99921f5c22d1e06f6dd99442a27c1342afdd2705041acf8df78bc4e835d8e400cb6419c52148f676354421c5e7268c84501fe82b851bd87bae738ef5c67032c746356010ac03caec13b212060890a38ebd28285c990021a76cf3a417d538167b782b65a56cefcc2ec6015ddfa7ad8f2876a9b3bc0d9649827abc33d7ab21d5b20e4a84577311ac7b381741c8238955e630795c7a3072d23dccf4ac689a781fd783fea7592d0a629449b44142b56f440ed00b19bbb976234439da01238640890353b8e14b7a0d964819101110da435c9b68e73b033c78b1efeb9d44e27acb225fa1e07bb56299d54a779cd5379b7c02fad52f3c1a2cefea9636d850c6e05ddc14b4bea669505a94fff87acb2ba0321541b2d78d2c58abe48b62d4d828c8ac0f881baadec1bb30d347772729a73390bdb85f0e1c9b93123f7e44a541740c5d0598015c1433c96eaf97b5e0d39c27e60b9ba6cbcf8a2dbbab8259e44d006da65869c75b711939cb38a3ea83dd3c8ae97b4e272a07403c40d127956e969f8ff3bedeeb23c406a20e73a2d589000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 16160deb06f8324dca1eb3093b3fc501dad316edb4d5f8b2ec591eff7b65a048b3333532ebd3d961e363157ebbcac231aead8e255abb462fba12955310c6c925b530ad2f4a761d2efa5a3b9a8aaf1929d3630a6244e9ee1ff5839198fc9b4ef47e450d4026b5044120c13eeba48e8fd9fcbb02523814c44874ad950a83bfc21b1ec778c1d5b5efa0f2a9e028b13622fc0c2c08d7acfdc45788e0805aaff92b51532139416982f0fc9931f3fb12ebcda2f72bd9048621208a4a91d42b56f7d810e89bf6e4e7d5171c82f09402d2906b692bdae3088df4b686b9c1925143e07212e13f4a3732f84bdde9074ebf3a549f0d90aa152671d88d88af39364d33e8e14cd0c71e979c045002c3c40f897bbff857f1dd82141c719ac5cdcbc944f6d38978e8f39ab0ea2dd9e8d19e6cc95e0bfab01f8bb1f8330e6241c3a937c70c40280cff3bb6a34b5b247fa970e50361447bc5b163143091f766387d15033cbaf8b9cd208a2548f42f00dee7ab81838ec03aff5d4ac446a55100934866163e3f53931e1f4b86ddc021f39f2305f59c95d336bd070d089526af38416e61cc73f94baefadc73794da7a7c9eb06b1cacef4b37626ef7d1dd381952ef67d8a2959021ca85f4f904f912187294acce58fe364f57e113e1bb4cbfd2913095ba6039677046645cf84e4069bf5f4c0996539eb1d036cd4c8f8e1c2c8e0d775f11d0eab393d9474220186fc3459db73bb864716418cbb90f55abbf9ac57096f566702bdfc668314d98ba91677bf74d91547c7b5302c725b890b4f3f2a8b95f65521a9199a4bb429b31e7537733dee03f7f2f135dfe88e38d1c301ed65a3d5788dd593531c639eecd3b947dc557253b993321d76a61ad4ea37ef2bc43b5d410c7837aa3b706a28051d3c1ade2216cfcd719ceb9ea9aab4d373d535a13da4c9c27c5612b38badaf16ae3a584cb7c057f1c2f4a24a477cfa4a1d834b3ea4f9254ac3f89223bb1c8b9eb514460028ac47b0b38d0b4dec9aa4c2b4ab16e66780ae8589860006ad4ab72bd42cbe4275942f8476928046134b89922b39e3e527dc48f7f5433620dae3ac140747053789149cc1434053923ace9f5205dd3d1d7057dff6b316535fdf508bb91b4eec6503db29bebfef73302300822fc4ec4e39f5a5813bed54837468c739e43a421b2d6478f12ea5a5f37e26bbfdd57ccb11900bbc3054687edfe96f88b59af5856e87e90e594b5555c03add6fdc0b62ff3c48577b3a9ac720a3bba2d10958d79651c3d5e7db9bd701e072a25799197e615f4f4258b7c0cc7982b8ea89033304a0c2c23eaa24d26b56f84d82b139f990698906209ef8df440144941b435c891f6a2ea0276df6f9e9fd36ba636284574d49eae6c09e82e4c0a147bbdb2a636392bb1671862f8c8ffc0929e4f59da3dc02d7461777ba48acbd062c933e1a61857124bed102865fb4a8bcda191894ce19953aa6f922a351702c570cca0e6d95cc4757ca61fc76507b82481ab538f418ad6b225abafb0fb824d0b8f1baa9597e5e095d5deb5a70d7390e1ec308e2e3a15a62ce03a73ee6a827e50d68b173a7e1ca2133c26f2a0b922b06c72383410b75c8911203a7c00a2920ea891c0940d33939e0d5098b42cc31d6bb6c0dd8c03e8aa2465aa01597ceb533acb3059763273ec053c5fe1b72f9db066a1a5fe216004b1d8577849b6d5cac89101ec453bbfd8d571fc08087d0353c0413b02fb8956522fa871db4f4d734e0677339cac50199d070d8f592b66503be23ff44104d5e02ea81f17234cdf33db122b5f5540432610b4700ddc6183d4528288d692f119bfaa81a33e89ecef970b514355bfb0f4bee9800c8227217db2514ba6396106bf603296b17b3b5e9c6512694de41c99c1959398800fd9f0c0cd0975a2df0c477b45d2f433fa28ff3c7bcc6c543428490e9c2f6169edf583775595f265f969dc11d5f1679a8cdda1738e64e2d250dc8b769b08742002f22106d7f752cdfb1af97e4236cf11589f82816b065ca8d1b159f49c9ea06a7b5153cffc0d703a94ed67dd58859311b72b4f032ab50d4b10556ab415c8a6b2bdffe62deb01c654af6f8c1f29a4b91d9cb1c6663485965c0acad445cade15282833c0ba20e821fc443945eb783d4d22b0283522e59ac6b8fce4b00f5a7837bb7943417288442c286f2c869f99cf41c9b91e70307d2424b4b831f0cb78729c7 +shared_secret: a2b9e1dc08b711d8744a6533f3c9ad42097526e8e7bdd375b95ada3e20af11d9 + +# Rho leads to matrix containing zeroes +entropy: adf510dc0e997af14f96e4863f316475be59850bc861ca0d1b057d6b94c3b5d6 +public_key = a1626b61157361758af813446a455edf8346004c8f1d8882c6833b7d6bcbd86abe3e448006f0598a288c813790256b0c5f0332e06ba2f7f61fa405752f509550f86a18bb5483800a7329486f310228e9b467353957291eefc5ba630715ca177ec73602b1cbaa4956b37f1c6cc8714702b882686bbb8d1a19bffabf06068f72563437d37b33b38c476366404a4a6d17232e437c7bd4b56656b80eb7180e29613dbb4dc4b45f9d6909b07bc479126a4ed1b60d276962c060f725406a6641a29c7b87d17e29209c5473a595f93f6f0b6c4473afe95b2d0cf13710b12e4cc094f71b8f6c3cada16370fa4037cf721d56f1c5efdbaf1c395fa77175abe6c9fdf3a1a0b88f608580c1024dc319cea9836cb3f70e0d7101117a3d8e8841a92990d30cae17b676287795dd9c0a451450b7b75017881a210175af8a6ed69900070192df3195d27756c303bc82bb93a19bb805820177a07c75c5c1c04a8e61566ae62a357d6016e313181a260d678cb646a3cac063caac952ad4830deaa1b2bc4161b7c23c31356442e2c851ba64f1e99abdaa55b3b9a2fab0c172a3b9b26918c0f6933ab74fafc700255a59f3871628d291ff56b8f9241587f5a8681aae851b73b0a26363f2263035a271e883c5fc8bcc653c910924c202b103b4131325273e6246579939dfca8c6e78bc47e686841b629c93cd7dd16339d5b40cd8b34a289de9394c40d63409cc97b87860ce54c647929d2fc84850443a42a74a5dd67cd14b715c7535b28b01dbb3c0c3793b438b6e56f60347bc4220e695459c402c94aca43b9382a47091b0569601ccd7a74b75b868b035a39b9617a10953e468558d5850acc0a7d83532c9a6c5929ca3c9bb8fa16775457c2d9b320dda73bea9d2047a0c8f62f78f5e52ad9188a851860d1015c15f89395cd86822faae4fd2354610a608b36607247956e68bd4c252d7d68a4d58c3107465748a31de880be3230ac6714a33b4c62dbc711f5c0af44a36e6ec7ae6eab7ab954dc1f420a569b53966141df1566c73290a530d4174c198e5c5f427838f1884a2108c85688a16436270002207d58e75412de7255a1544c7d8b43f60bb2b93f45bacd80f2900cb324ac271c98a95f3917008ac3940853c13a516140fdd0064f646aad67b5bf1b966b68a6c795b2f6742a9d68228f86a60cc210aba894ed84859d990c10cba5671161caeb59c497c1b2ac52df6913a819168f8b8343654120a459ce5846a6fa777e82702fc8987368c05a503b57ef7304f862c55b9848a461af1e4383537154da27866a8ca4ab4af01ea4c30dcc59ecc0c9215a141996ecfe34aea6542b3b8c917c98ef574b1ed006977fc7b755b87c6eab128f6bd4b089359aa74eef351302335561303d26c24fb327319b8974c165e77277db30035c84a36534495ca260f7f76bd96396dfca983c89a8b99735486a78d34c9580b691108f63846183659854fe8f1168cfb9d1f5a05ac8106743bb74c1b72cbfc0e8ef6be184751fa449795bb1d0b7ca37dfa8f3979bbbc09a13d4c47163a69b04cc013795d41b0033549c3d84b00c01b1a9d7104a9d37751d08cf0e8132eea86b2462f37d660df4a3a095910b5ca2ca0da78163bb79a181e76dc619283b6cc670ccf2b1f3862c57e69c2b5cc293b87578b190710533bd4fba426f3389848919619c5b41cc5244a368adc40ea2647e4413dc9114e22749684923fddf2192036b83cb870eefb9afaac2961e3869ff0554077caf6d1aea720ccc59734c0a5465b7768170b323ab8c65a2a82f1267db4555565833d9f19ca10400d513bacb055c956c622cd7c0e5c54b33073be531c6586802cc11b75e8b0542f80b99639021d89caea41644029a81084129ffa66a66238c65c0f5562bd74b861293549a1c7cb70b6b3ce25286558a43f318d24052a196639c8b247bae6c59cd27d0768492b6b6ddd2011134cb9d9964ead020fe8da84a1f910aae304a9c3756112331e62ad8650544b5111a0977325c6c9ba242271ecb0c1a3c753543413685e46a31312c68bf9175a8b110a6816b6aec9562b8322b0d932f9692b1f29c6e3424d45686272f00f22db854fb8157594ca7c7b018b01c1f1a23028a4663c6b258af445f83c97f652954d619d7c68bf5e10046e7079f44b05b9c74591988f328443c1df349052000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 1b5fa7222ee14e61e4532b01189d576a2f0c0019705a424c3a68c27da592c2ad20802204e58a40e5c4b88b34410e000dedfeb719c7541cea51bd176de9fce964a96006c7ac87219b0114d171d89a261a2c08220ebe532c48ce9db09c791824b7373e1237e82a6ed491d71dc997baed4622b5d4e87e5124267a3b87cdef166d6d1109e2258f5deca3390e750f92bec1795f84f33ed51e071cec46baf3704afbd37be4603bb4fae6795589228be43598b1b055cd696377481e6e4c5b0e9ca39358312a27fc1526814d2acfa9f4a2a4820294dbd422715ad3957cc3b30cbf97a4453d9d6e2b340b8a6822963b19b5213cd9707420cbe5183ebf969d9a1d7c02ad9b02e7c0f8e15903891a506ac9182b424e4025c56b8f8adddece1c62a9593c1a1b83e01239f3582b3e97fb55a639b29bd7501c7008801dfb67716540cd9fe51ab5340f6277a57eba60f3fa755b141eca72b5cd33d1f51f32c32f15459a60dcc0cde1ec97cd3574a70fb835a8080ae180b76c6894c01dbc81429ab00fe1840b4ff75887efa840fc89f3baa828bf860c6c394577edd9490f14d9bb25adf5fe7c81f2e1d5ba110e3271ebef0d42a158aa51afe9343036d86273dfcc01a414d2c89a05576545466c1d2e5f238ad901d2b1d042476c71f8a3889202b25a8b73bab3209d168812f2d495849ba309ad8a51195c32a8f9bb35287a2c2d3d75976748d3660db6c398d88fd84693c83312823f886d839dfc7e56d93ccef2c8b8b64045347870489c3a7e95383429dc78978038649742755304daf1289c74eafe56675cf8d7aba5b737c4d8476748d31b2c02fb8851bf719fc36bc45a42dec0a36c0d9b0cc12a8baad50b539ee36db0052942c1a59081f0463a57792e954f609bc14316f674877eca906f3bbd25607a4c076c9fd0e85eec2a02a767478745c563fce06833144074de383ef1c50d1a135d51fbc499267b2f224fddb0c8d392fea01764e38eddf6ead2ae01f30cce05fd7d62543e3dcce21c76524c52afb252eac36e10d8f9aeb3ddd450fe18bce8034e154d4b0c5d5639bf745e2c8e5435c9ba7db121a780be2df8ca2fc98d41348f2830fc5e182e5c88dff7c88429762b0459ca7977d977b14cce7c84ba39c8cd012a3b15f4695338cb3d6ed991ebd20c853328bd81e037f75e82d85695d56e10973c88b33c88d70b321818e62ed15f697c3eb949d1d70e91fb8cfc3cfaba12dd57beb2ec6a2ee80cff28e54ca18e1686b2674156bbe57a9a8a1152b3298c56174550818fff9beea0c2d6ce74785a0cac87c7ce8a11c0a8eebb5070ad79332e15961bf2413a793beb17ddcf0cf805de33ba04b48ec1e3abc05b7c81aa3277f39d40a1509232be61fa8dd5428300d60efa05329162b46fe3f6973ea3adfc6c11440240099a3d65dbc1fb0996fb75677bca40dc764caeba053106f74f2222482ef6f7617ab0ea0f97bcabfcaa8442657419eba2970aa5031245760b0047ddb8868997edb5a5b443277d00f8af3ef9b024ec3e0ef2ec199685d44ab4e06cddbe4dfabbf336488fb82f64edb55d8f7e52f9b21b2f984507170bd4b8881566ce5308401b6a06e06f2217f1160f5550555527b71774b47e619a83d2c129beb5601ab34810fbd16f7cbe6597de399e4bdac009c6d5e891b4e1b776ad16192437ee0b3d98f528a6e65d17797debdf367a202a9cd017332f6e36c4a6a83481bb859ca6613e0d2b34dfbbae2c583e4936dac99f45956b966452a9c68bf1dc3a326d6d38a6a6da2b6975fbecbde9cde0cd6af3e1cc8a0efc7cfab8d4ec0b74288bc319df5c4754c77c5071a68056f9019aa1d51d6ed28a99d7fe9125d04df0d7839810f2d6f129ca61d117169b0f272af6eaf080924c42c52acd3f28abad80c8bf0d2fdb79ec2e22c6967c044432f381eef520d0f99916fcaa184c81e820d894f9c668261d78daa3a62d11f6a82a2a803166b98cb4568f4cf8845fa78322fd07b0692790a80889e0f54c042b61737aa721b62c8b1f1cb5f01b6d41861b1c614d2f42ab82fd0c878f2212271429383de3496757158b50c451542751ecc49b7b7d3bdf697d66b042e47c33cdcb9a084c275fba27a94c349565532da680efd1caf40a4dda1014279d4b6a530206bd90bea3c14c1039b570e351b13da4a1af2612fe67c3ea4ce4c623fc4026005384addb19be959dcc24857de3af02d5652f9770 +shared_secret: decadad640367b73f7c6a9e5d1f9e6dd576350f841e9d8eabd8d525fa8b0e1d6 + +# Rho leads to matrix containing zeroes +entropy: 3983da6a4615805f6d55c14ba582d59a40e646c7ae77f4835a51afc6c37f11f3 +public_key = b69847be058806d916fa0a458891821a0099f3618274091336ea37fca742ffa5bf85a845bc772ec2abc4c9b05aa7e51e8291aeef2a05cc185aa2f438d56026fa0ab0a0e8ce682294bb41238d358dcc1016bcb97ea4e01918a516cfd658ae753f4e7756f08b247edb899ac8b2b11862cbf92a5966b68e4cc6fdf66f0f14a135753ae0f5472a3614a46715fdc7cf69bb465c66ca82e65bd263c5bbbcada701844104ca821a6b5a914301948bc20987229c81d2128754122c1cd3c43e2b4b6aa880d0c203cd9490b7796c02109c2875ae7bd284dec49ecd22949539a2f7c792d351bff0c26f8721a86e1948e08a0fcb2135ff7ba42e352ad3c3a4d1930a26034ee75b355cb299f2dc375f7462f3801c1a636a87d71fd0e528191c8b1d6c4a1aca21edb82825056f8623975c54b1aab806ec623ee50c3c9f954b29212662b7530793c4e3308fb5610429519ab35906834923b053b595f19d6be33c5ba4624dc72fc5488a98e0c7cc9835a161ba97e72bd08485b2c59fe2e56cf1c5a091f389f555c7049c9a74b57af3b1af1263c7720880e5d9c3270b338488279a27c9acc04409d612aa8b195dc5c15bca57a4d24d8d10ce661509054a23c0a0b7839c7ca0f77b0524721b06a8f92570aa62091de06d06783562ec9a0a795100c28fdaa06928dc6a9fd106ff05c2c4d4c3d193898661a4a39583eaa9b62cc282c04c872e145b42058de4467e3f22cdf293723299565d452219c3740bb65bab60387a3321bb2b5ebe585e85e4a2a5882c72919caadc9b46495d100081c88964c87521ac22127e891e1b9709954326b45cb35f5778420b08773b926bb79173130d43aa2c586689effb567fd165334b82ae4c6c98f93b64d99a44815877f5476583ce363196d0257ea472a9bd630f2fa64585b9ccfa1a2012822f6a004cd5959d5793adfdbbc5596887b5088bfc5c5af9aa35e5b9205686069c55aa7437026e75ac370bbd40421df7c21350da1a5b13b651159db592bde2078e2d8cc374d6833cc91bdfcc1f19d9676e060f2baca39cda1dee758ccd096545e21fe2cc082c00374d593968fa8eebdc309698020a29910f3910a1679129791c02f94cdd8aafc8c007c96411835280e148c4109743c8d168ea645ade7c23b5bc26d4bb083d0a4833f87e6d5b218dd73b76810216f9658a9547dad241d408bdca43cf792bc2a6438df858ba77d01c34c54ee9a31c83e472d5f945fa504f054443851a9c0d59734f175795a86ee2847d7981654d89633f47a420b5bf65920b9810c5512a4d8e19aebbcb13ed0a87980891799650a88b8dd4eb7985506a581110439a0f5afc8e998a7477e8c4b54872b9479b36f2378a4cc97b3208be2457326988e4a13b02812616d5add646cf0f5a8f5458b8960839f93581db651ccc5238df417b4ec6a445127e29e44563a7b49eb403c10a6edb624395c58738762009a073d1949149ac8e69e8014478a6701cbe140411d2f1b95376afac6988737a1b9278a2ee5b7fa4c1cd89b69f56f2686bbb59a54c676eb357a0602e8f8a8a914c745703bb7542c313461d1075beda6cb685832fea735d0c573fe744c16bb52b8e7a7c8d049ae34891ef0ba338614f300033969403ab4677f2179c8224bb2031b8e891a8d0806819abce1356cb2c906fa2a17d4f3c4ed0b8cca831376f67487847475a5b27206a18dec19d29f6a8d49737e7b14f2034209b0497474a3b0e94b6ba190d2793c945cb7866b3959f7b2721537b77a45ba6a259c0153889141a1f9171e4503a503802b4e856f90433063b37ff00b4fc3347b99539efe3cf29b515dd7b700b37871d926f699499d6699831e18cafc00619b35e58555a40034c22bb430fa23854c81ebe12823b92c0bb05b2eef1cef35a75ba6564db9122ec125952260149cbb8e524391aa92b82d13de624c0368a9df175c5ba9b99703b5bd1b918eacb53d78c86b362729a01c2ce905c4d5120e690911255be11b39dae9b8a9b60191790b59ac5421473237508ab327811ebe955e8acb15ae72019426573e314cd775f4041658e85b3261c3f04c32d04e58b3393a81c7b4f6b2542b2e27b042027f9a0b40947a919fc80e87a8182508d2b4264fdc9ce9786ae8ad3cb041274b9fcc575291d74c3b95afc31acc280297841fd5549083120a2fe78991e000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: a9560cc3bd566af9beeb59a300ddad8de5a70be9cbec8777b625f9df541f3b7e3432edbbae58624ca393a7c8466654ad4e616f302946f2b4e848aad0b16d6ea8d19faeff99df0577f422b17638ae8fc1c23b90de0d3b0aab0e7f77d81d4411af93fe1fb038fcbe8b5dca3aab65b63b767360ff8d314dfd9adc924dd5315a591946d7e3bb9a8d7605d4168255e2c0eb5e5fa2483505cc5e7e25203728ff51504c580ed157bbb7ea59702fff5f39c67334332d5ee17ae551449ad402b9d299d7519a9d60efa56a1bc39c1a3e12936ad533457fabbaeb5f4016c39deeb95bde3d8b62db69aefe698e9ad4597762589f20771171623c3fae08176cc6b9904fdcdcba42b1ce7ac5a4403ba3f38542160bd235f2b1a9d2c8735e86ee7af2e749508252a34a4c36bfc82573b856ad0408a95b7fbbfee254191f744e0f36d698dbdb0e9905e2a5e4efebe76dd2af71578e5dd28974f393afaa581e755030a137ff7a912648e6c1c9cad9a11c2fb22a028cbecb24909ecd07a53b5094d035664ed822561daeb8bc09c3be6f351dbff20f0bd69c6dbd8495460e55710e2e26ca39a1a90f05bb44e74cc0fd932296443a39b968717b5d7bba52b4313005a7e917a7eef4561e340e42c9d4730a8ea2500db48da0aa4c8086a038c00a5698b1675b398cbdc8223bf2ab069503e574873ed015338cdfabd2c4c8b349c6889732dc737501f9f4804c67d693722f3723fdfa21130fe621e1e091dd6dd63cee53f643f105ec486fcd4bfcafa03bf7662b2b31f0b428ba30636e2672b4114c381e2ceb631ee4b59604a656de5b13f556ac60747f00362ec577381cb6263c7511d1b4b6b5d55dfda1861bd8ce2437e47fe8661ce3af193a8ecd2e3fb249a7b82c9ca905f38f3072b25262b50ab205d7c210ac62783f332254ecbb013e0ad36ec963d62e69e085aa6356e1d2027b6831cc7ead70301bed933823d1fa5d157573d9828700668593dcc60e1c8adb12f14d61496d90d38b9be0fc78654762c4cb32ec66fba75063f1d8f7e83a3e78c33a5fab61c80e73af520b6d013daeb5d48b0308a5c30f86aa19e64743d1bca73ad7336b7cf2b9a309e3d86ab39882bb6d3f4c2c2533fa3a4c650463d3992ad0ea1732b2371b62d4c8c98dade19edd0eb1462c830e67ff7413d890d30d2437deb5abbab57d24411fcf49a2cdf997263721f1a36fd7e32ef383c3ba460a983c61b2463279330f24b75abf6d2ca977727696f336220192a827d13d74d833d038647dc6720769cb316ed38e9e60ad35b00f21eb4c9076b16c79f8f3bbbed9fcbcf1f0bd70a4745a697f3a7497996953604f29e4ef850cb96735153fa3f2416229cbb4c36e85ef8f68a607d77c48f4a14e00a080c62bc2094dab53d39c7a75403f35c9f58aeb25b075c9258c2fb23afe18cea496ec56b3f17cad7eff23bfde253eac130494c0715e5dbf5a565bab2998d8d0dfcdd278b863a2776e1c97c8deade022f3cbc190517d0ea91d0e8b224e3eb802795f730fc90284b86c265ff0d9b7a5de627859be4c7c8288d22c19a638fc80836aa30b948617b3d4f086f337443db0eb6f1dde7e854525ce5028d3fa8d45bdec7aea94fd2c4586ede8a23cee74e42024c8875df7c2d22a10dad2ab7c677242bb80d21a52ba9fa299c046111838c5a0555f8d11880d35e6434bd66433dd9500febab247e9c220b2d97d523199e99597d0e83ad6c11846c42fd04b2831b4688b4b338519037e90b68055c4d10722d933b0c90197979be263b884e7ff11d527b532fb17e1f8ea94e0a177308c6e626d6deb681b2083f9960b6d9845069b6bce1512a001a8ed694b16a191023cde941a525b94f225b55d12ec40bf92db4c04c957798be6eec2c1f377be77499739f48c9561e83a01c49012f134b5eada3d662e02127ddddc7569c07499fff9f8f341adf25ce79bc46315c4dc08b65ddec14275df0c38ced826ec2e21e3acac3ba78860bf829b5775da4ec61ed0dafd17b79b671629c0f10a497ddc3734586e8c6689d087ebbd63c9ca5d2edf349469ebcc31e81c2d6d58f2c2ddef32b4b9986bb64ef8816986758a616ca4c4155d126d357f0571b172fbe6b7308e357436945bbbdc70c831f60243dd96a7c617d040a6276e4d9ce07c880cd4feca2537127eb0eecc6febd22c3c92a3110eb4c4080e88923e56bea4e5fcb76c450442b89a5cbc230f +shared_secret: d31df13dfb22d68333814c817ad444cfef6378fcba2edc372ac44ace59e4e9d7 + +# Rho leads to matrix containing zeroes +entropy: 2676b8426b9d6a30af007094bb76d65d388c2b3da938215dd6f6987206400e13 +public_key = 424b6ee6089ef75bae678c685b685315456ec584a93ab25f67427be85bba701c0566544f8133952936a203923e07d5aadea1130d906daaa1a4d9939ce1e147cd874ca0f777f9023d156070f8998a9607940d15af47a4919c52b831748af51b41712077bb4836d383a33d802c80a133a388bcf0f3cfac305a7fcc3199ea880d271242a3a6adfbaa5a894ceab055a6594436818ce10bc8113c8ce0613fca2533088a9f35c4a161e0035d690e48b4677273ace7d2c70e378047e7b9b7c49b729a612f5abc7551756aa91239cb16aec08e2ee53659954cfe1a5ba8b47f36c47d6ea2885b8332baa61b71a9bccdca58e2f0cd25e9b40d38867f69574f98ceb03c3d18b9b6d5c2ace4a8b1bdea7e5e678f1662932c267f117005be498dda33b97b0c520b1375c75829d8e7cf268524f74656d033bb986977296b4997fca693281896681022dc138fb24d9fa5270626b1dc4375a72c42955529922cb683c225cc76ad1b25c3082b9d2c47491bfc8b83767d274b0473fa753b16b117546b8a755e94b6b6f7048079985632b33664aa50eb072b47a338ec12b3501b3413e6c94488546f2bb142d851fab8260665aa88a75856d1ac719341ba190e941b8d6bf53f76b968fedc28d0a524d7e366efd50c8929cd9362cf4ad9366713c2dcd4b91c45b6fe654fcb87a6674c2f3c9447cc546aa645a04cc3b57d8b1265d91028c3756d216bd671560e29467805a2ddfacfa651a2fe32731ddc74ccdc243ce97ebb7b2ffc7056b334a0fe7813cf5825997690b91073b7f9563749b8eaf46cd8b93161c21543592c21855f577290b9a6616e2c80134a3713f04e6c2cacfafb3daf78b9ab671337931ef7eb58a48a73a96b6739850f2af60ca0917e301610c5731b032ca6cd77554b7a7d7783c26b2cb43ff1c1fc3716fcec4455e516d164c561776a03c77275d52d1ff426d76240b8b5a47c498fe836736a09cba0b32983387f595593800a4e37b3764f054bab91731c748021818e4d149db358ce8b2ca2af45c6e070ab06fbb3a3485698bb955681b95e8932aa30b9d8242bff3618120038b3ec776dc3b635963ab24b8e5f9761162737b04a59fb38ba1b3685b3512133e25e7810c4cb26a25be67b314924728528dbdcc87ec53cade88b1e55c7a9ea43b647655c697331db555e7881e240cce208ab189265db243cc97508889a2fa201a0d1066c5d2a7370eb8137d04fe035c8510b9f21e6bd152872ce6c7cdbba87ec85341c9c23bbea14f9caaccf56cd41c60931a1970867a38fca93fe6a789f5b1cf99ab23fbba5abbbc881aa154df05e9dfb5c92679cb56b0f156c3b67e918de09c5eaf4288885c91fa5366f0854e320451e14a48261cba3cc671ab590ccea69693a25ba90accdb715241754f2f5adb67a6e6491703c0b803d8c55f6364cf64c3f117206013ca309f5c7b4b40774f98ee7738f70b5b9bb19737855bae9958f6b24b22d643753515f79b884c223cb9a734c634306ba20cffa79a5c5fa46e1501aac245523e2b1e42a44a953964727b13fa01b65eaac6188a1c9ab974c613cb5971bc8680e90181b3ae927b3b325a22389c204470e4c6a97e404437858910c61897cad27f00e2f7556639635e3775f7ea351921051684cc6ac224df9ea98bde524863683175447d25aaed72c68b15955dd1639dd978318a8347316690c24bea1d3c64f031aaa2a3b48593a7593b2047a8c29c317c9766bea878cfe5ab947f12d5fdbaa267a18ffe966ce629c25ac16b68aca3ca000e5081faf0b07c7b914dac266dd08109ad52408c0cc06524ed424638d1b7d3175bd977b982b26450b7b3111625d2f64a6055a59168c9ad1cc13773a8f4a2c79d92c08de3567387a2bcfac1186960d3c939f2a601bfa96bf9416022385b2d1aa2dfd570fe54cbf4cfa325bf4a87e734b2bc4ab576387c63590ec3171b41a5b621109ff0a7617030e02962224903d40c5c396413d8793c2d2044949659a92b4480e8123a8738f3cc12e45504dbd40a3a497623e70600378bb32d66dbce08eaa28303e896aa887186ef9107b023b69c49c0ff802fc504431ca0aae2008fbf39c268cce17f1a75dd8c880a34467963cc2ab4d60d78e96dbbc5e5611d955658de04b13d5ce6cd3af9e2bb3caca8e6a088afc7ba31f951b920318ee4f3c26cc000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: cb24ab9d59fb286f3ecd5908e34b4e5860bbd08ac3939825156f619e0c005de948e8698deb7a34462c5fb7730ef3ddc05b017b58edd91e6fd6d4df125128d20ff619e3e593364eee7e532f3d962108b31f77216f71bc9d5163acedbdfa48f94f2f587bd5c16e11b5480237e88f1260f7c2fb25d044d5108d199e1bae51f8f14dc5614b75996ecc3d067ad3cc6b294ad60fb9fa21750c7bfb53874c2ee99f73a494d0df220f054a845f2fbf85d1a5727c087a65436433b73013b9a6f26f08c1ab443ebffaa03a7f8f185f33b07b99400f6b03ab985711fb4ea97d058a8e9a948101359b610a6d428a3d10594aea5ad602bd83b05ef6b6aaa2f56b655dffd3db5ad2ba51d8d3138d355f2550f29b40bfecbc43f1a3dc7448640b5b3006b87a23f6b71554d8a54fe0d4db52732e8260c915407286bb3074d2dc56e4cc50bb14313a4117e78e29d83c3b5dbd93ede35d2a47b46a0ed51fe72cc7b86f96a3d9367949abcddbd9988639f8a8555534e23fad9f35fb132396a13f3abed73fed757363207043a84bf5fa6cc2bd862ca46dfb9a124fc0a2958a09f1f35fdb5095bf48b859255cf49eea771f10ee78ee460599342bd76ecc8ea35077c4adfc3e05c37abe4b45cc00ab74247ce6568b0395ec681de4f96af9fe4f053d08ab465ae580bf2e4bb54884bc90c75758a6c9fdff87fe56990cd3d0aa691f97e03d46b5e25bb6a8d2acdd458bdd60aa803f4a2e7652cd9901a385525eb1f2c619fc2ac3bfc655a40102e0721cb842bd1516894e31d972adf9570365c2d3acd23e998c9aa620bbd0f98b07cfc103389df202660a9a66e819e8ad4872cac9d11667ba07e49d0095b1470d793b0520d492b4524521f470c1ad11a917545c3e90c0d09c57153b9f01021dd9af03ca73f0d833a0f7d6d8cfc132c95bdf9713b055acd993f8070095cde23f5782bf1502268ebbbe18e0a2c2579f4277d2487173fdc03f787e960b351c0b0c8b676e6a9a1b2cbb8b88ed59ca6fa351141711349e70f13175f5e1e6c40b495c283f7f10eecd35fe77330b52b1dd5c198c1ab5aa82547b822b59f2eb18d3f70c2fe6d78a5eb960abaae74fc69c573948212efb77b7b58ac24f23e39ed35a0c52f00885c24bfda0336ae6ad827b83a0520710d9a039bbd2c9653d8b3ec38133f06c4bccd714087f5291a37b1ccbb4fa71aa04b6ddda1cfa0e4af9d531c053b4d3b4546894693e32feff3de7df191517c89d34bb3bfa4215d98f5c72bcccfecb97144f1abf05fdb21e2a4017e9423019a26eb70022c74d49926654e986781d9acea4d8008dabd068ded76190b76a6dea78e2aa33b33e5c68b43946c0f83cd3c162dc23392d47e6dff8ae4dc9ba44ede5ed59d6bd399110c513e52a71bed8073d3b791aba2dd34ae5fe07bc9f0b8efd5a275b10477773ed26687be2df6afca51aaadf3df873b7b87b221ed25e053de30b529aa920b14ea96d955ed4452bcc4f40389a9b8dbd8bf25bc02a99d0c1fa92e8d1f39013210268f766c5d9a8f080756791e2b9ecb7c81b10ff643262da8e63870b6e910c26e10c20643ee740bdb73c3ecdae5bfbec98940ae2cd3936c8dceab8c6156840463786e20770d7c2b89546a41b7bf5dc1a441dd8089d03b69942f3ae9823a29aaead42fe77763fe0b51803cfff169b5303594823ee70e56b4aa0d8d77a7a39181169d4c9910280edc3aa6841e54427b962846df3fc73b71ef19cd6f24b74f88740347ffed1c6b299ca9aabe8f17c9425da19518f490ce73b1418a41d7f5d60a14f74a51dfbe6170b4df1c908af859392a4df8e27168a35091c20b2a3ecab2e0713e26f97d7d571dbb2931db0d36997cba78a929f06480326a8ded29b0bf1199b654cf6cee8e982ce057a55ecd2be458bc8f55156be7db5a39dd5b5e62c0b178c0b500d79bbca5330cd21c4e213bfcb2584e2fde2e7f19629710776affb99fb442dfd517d49305d1980069447b09fdb411e3ff2df0fd2e76b35ed65b6abd6771e6e05977ae1a86145a24ccf8b8ea28758921a0f202cbdb629254059ea8f9b5f6f4cb4f69853e7de7cffe70c05c5588ff5e77755852b6782f2565644e6489f62318a7e2a29370f5ea90c6628bfff320d948f715ea88958974a0ff700b08b3712100e73ba7d134f107c304ee0c00c65dca2853e739ff2842beed8e5df18fb4bb3e7edd7ab8d7d6fc0f2afd92f5d15 +shared_secret: 751052356086210d8df27a08a945497eab163ac925b059000c89b6e82b2c6bef + +# Rho leads to matrix containing zeroes +entropy: 319c51bcb76124b92f39820a5653c0ecfba79ec91d632b0488f4020e5df4e37a +public_key = 52f8b3b253b655f962e9475e8cf792f5f99b5c4b440a166e0d18c79de23173d690cfb697f1d072f269b94a78bfd6196ceb655354c31f356806ab5c42bcb9030c6c61e3c3a023327fe813362bb69ed9e783b086a94581c41cc49c03489ed53b585febabaa951bcb642674b74a4ce35db92894c6db484ad10b0dd84b3e1b9f88960f4d7a9b36e580473692930a83a5233dd07a027c8cab7b4165c860cae41b950d970831105902b90805d066da6552b839607880a1bbac123145375115c647d10671e84b85f94206d534cf44bf59416f01994b8b125a0e098a842c4ad6ea108fe5bcdea005a1e3985f656e34c431d456cdf9f624a7d221c2c242cae4c9720a048c760cd2927591db67c951905c67bb42900c44f67b99e508d5b38839a0b31443ac8c241ff7b9ca0a06ad744813eb37142939248c7163262216a4438b7f3aa5eb1c9ae329c0d0bc63b2665d90b17e7a27308449bdce8a861fc08c982266ec83c9aa1422135a9e9be99c0a098df9a5568960aa2c727a18c15e7713c289e502bfa9170788c6a2d01711fc9b4177a491226c4d6a05b03baeec202b98e3af0c7612d474c6b7b912cbb38990f29fa5f15fb12c4a5c417bfe30a8ad88aad5395287376fb3b18b234199273625fc23c79a775586d87dd9466f1cb816466807e5079a270954e8fc8851738dc316369f8344bd1019f6b6624bd50f0cca851eb57c48b126aaa3a97d8044d3800bf344c4579361e3096ca29506b4b125143b2d625c21bf0a001aba2e17aa6075d8177d55324a08cca923339bf5c7c00b5717e7007cc94b61f3207dea1e3bf24b79a09ef07a37c4476e47f79a674693fe00b78d372b6ca76614ec604a86b64106cb61d4324e99873b241a56e063960b5fce306640bac5d46c88c85678c508452a806de60966006663845692129123d2846fff3225529475f51521e3f027d537877797b511043497706f3bc3b77ab6823a112597567e6b4848acea62fb09181fcc556beb8216c76ca6782e2d1234bb8521ec40a0f6d511bf8774d335b9a764a89aea93cc9b21ad62635c1b8fb6a4a4130572e41bc13ec627ea2c631d33a81ab1b6c77078c564957b39b0f9f04cc91b1b9ed89240b03a1c787347505fe4675af30a09d6ba13074431fdd045c44b4754e5682e7c5d49492e0ff2bc7585b631f3cedf98bf774427df7ac847954a139545d3643b1aaac31b49571cb7ac65554356d8aa555a67faea89396aa810a9b1cc8312be7333003d8e1f854a7e35ca0d75b06c499b0ed2a35699114d287bca9571e93948bef4c32de6bbb952a5fee5ac42a14c4ada7ceb5c8bdaa873076b0f7ba4881bd2118ae67ea671482312a35c7c13b1d7af2c9291a8408c3ce985a6311a2c702cbf306c9a7b4eb3ba169992831899c6870a8fd3302079748a835b04791720cc4737c5b7684ff612abcb477c7032a88262a37845f2c46f9f0066d19238689b1b53dcaed0544c06755399da2ff4fb570b299290497937126672a41ee9fa594d40551246cebbca8ab1f5c30ad6bba9b0aff0f06b0dc060e6b58a70cabe5ebb464b3562f1a10990d12e5da525c43040d66461cc396ace7c90c0f1aba06c94dfe7426b922c91744310ebb4e33251f1c47e2a415b95a895666333aed434edcb69dc69a513194ee2013a19164d49a519e0cb3771247e65664dfbc69c46dbbb6ab2193bc5b56abc9034790ff43909e6563c42545bd6ca31045c2228dbb5601895cd397dfd73473b0609bd720f9475482697636df216beba0d1a85b396e6ccb3e41fb8d52b1341b08504bb00a5740a80228118adde4c7d0bfbbb0fe0b8b815bc07885e496324c9806f9d07762f123ddc558aeb387b9858b2117714886bcb2b18b182b6ad2f8a21acd50388959f3b70a258a025c80a0b89d6321f222913484990549fcb98c5c8c88c2832075be378410b70c9b9494a6c1a40e5aebc88ae3d186d0b3896d309710c17ab96c93e629166980325bdc946e022ab80c47f61e01421c780ff336d7ad11a3c28721b09a03a5337dfa6cbb76acdb1846b62225578d17fdf062839878196d1819abb7f09dca6a1d225e2e0bd89a5578730adc5d53d19623203e24597c1a2015accd07a6f83938810bcbf2dc94a99f5b47082336fd11a45ba478c750f3e638d064144818a17f1586d6806353409000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 6fef277df2e04e66e489b1e04fa87580157cf1c84f0b3bd8137afd87cfb0d726e39d9706f177f605e9aaccf3a52e841e4c3c4b5d54935c5a9eacb0e6d8a2cf17ca416bf7ad3cea42c3533706c54779d62a0c8a44d0c0f920db72b7d072738ecc07fe16a8e257452e1197604054866dba1d12cf4745a2808a435bf31aa64db6af2dc4a3af697911adcf9022936fb5d40a9c553774f4a589192d98bf8289c09ea803807c448ee3e99c26799ac051a50ce5edcb57f3e13a13fa1af41befeeadb7c33e513ee8cd9364025ea0b4efc5ff8f095db6f0a9783acc57b2ed7573cde2ae2a8e7b211ec9eb6eeb34bd358d5cb009184c76bd7d1bdb4a920464d1da993787cd284ab05b8d5d3ca474847e64e1e728ac4ae3522cfa3a642eae5c47a94783700a2b758b2342d5dd261715db4f3156a5be96fe219dc8038f2d7afc74fb60e6cbcad3ddb6befd0625c4b2de1cc9039c9486c5c18aa8a796169a93cf8e626ac47e82b752f2e6537287580acfc1b6460bf5db3f71fb1a4f57e67e0d914587dfba55ee5bfbd5841bc04d041526a46053af4de2347fefb071465a7f9b00396b66c49efda179f13f07dfd0278464239436d8bd39dfd048329c89c2c8fcfa54c24ee67d124dd0b2f411772e480dc2a8b40a6792d0cae8ae9c6c883908a0d33e931053dab157d49e11e76ea3a9bde1c24eefff37379b265a52a4a26b507b5a4eed6f60a84595b1b747c96e8656e7759392924662fb43a40f8154b642dad2d8a0624b413a15545da8bc3dd5a5f8d304eaf23299d5a4574ffef0bd5b3d5977daceb80d67df682979abe36cd7d74c063a0b7214336c75c6d047f2bb52a0a5124658b9b53ac5a67a27b001aeed0c6dedadb3c818ca99e52b18dc0a9adba7f88eaf4bcd269132be2462be1a42ed102811b376276780e7a4b399f02e6c00605f1806987a6c1b3d4cc8f9cdb85b2c833702735ec6a61b9fd2c9ba220b108451d1fb8ddc5a07baa2537f71bd82f1f06d7f27e4a374336743c40466e11de367ad4a256e860e6e5f62a38cd2911bfce65b1b29274989dd1016ee6fae7790bdac6a3e1ee05fd4ea743c5609c3e4f1a65953421be132220b1792404d80d68db00ac5a94feb238325ffa44b376a9b6bb3a84928b065995cc7882673f1de566a78bb80b61beaacbe138a5a7e2cb5e3e276057520db7424405c69f719534983fac6ff483b884c932f6b72fd1878ec2ed1edf741159b973e5ae846fbf59ae1aca97fb855c72dfc5181b09a5a52a1f8012629218a8b00968a5c4ca733a07893cdb1ada1380db4b6f4f211996bf9fff20227f7d73aa552d8f9fbb6ed0d4dd278aab1214fce37dd76ad2ddb90e7ec49c4c4bfa61602988bde7f498d5feb0540cc0d6f2ae75018115695482a4264d513780a87bedf78e256f99ad0ad37f910215795fdfbb375d66ad20d1a731003a1ed52014b6183906fc6a0ee544f1b238563cb6eb407875714ba9d2fb48e667962b45127deb0180e317af9d2fefed19ee929b75c97088ba9cf525ad7264680d3a9fda47a6b5168a846a1bd63695f4b3342ffc828f8fd1d5614fb4adf9d64447984605a8846c094f813e991abfcf01c0ec330cff0aa9c8680d424196f173f63e2d0ae359e5e1968fdb6fc72721c23c239e88957f107eb296d7967701d4e9dcdddbc5962085616cb641c17c86d8f33d73bef887a160065f48f5d7b456153c4d2898f092f6a870c49ef615fd22833131b55fb46f73fb399b046248723cdd15d37c46e0460a81840dfec3879a49eef63e3b331cf53c8bc5b10570a7fa23e3228ffcc20cef18ebf8ced22dd37b50f79aea827dc37cee62a849110db97287b366afe64b4b9379586ebe34b313e260e84be654d83dd3fe4f31d622132c06875ddbc70629197f54b400a97180b81b2cc5aa430e3dc6ec4d9aa37dbf811ba2932aebbb9990f0048b4f04930e147b38f3f22c4f026b806d9dbdbfd69914346440d9b37e7ffdb8bec0761e49762f4f87485e2ba5beeaf306253b97cfca2637e7f7cfa175e5565e9df8741b94aa8d808515086a12606cf207878080b7cadbd318ad5667b50ebae48bc923b4b7a7c7f7145f7f223f2afb9536584caf2e8df28bf693c2d4d2ca71e38361f3db5108e28ba11aace9bfb85bd872be837916bb53ea66a22a605683cc112220f894a8dcb16098607ee5e2ae33b4b93dca707fe7f96f91defd1a6105022 +shared_secret: cf115ea5c334c9374daa083543cd805b8070de6688c552b82b256628573d668d + +# Rho leads to matrix containing zeroes +entropy: 00ff48b3769ffaf4e91c1c9110eb8ce9e2cb99f060b486b37035407d2f4ca517 +public_key = 5be7aeb3f7b944d964d1a7cf0e1a686e02b0b30195ee2bc6d5c78a8d73caa7726a8bf2cd62f33ec676a2a0c997541a386ebcb3a5d845c0a9b970f35ae0602a4282136a0cc832f34de426a08f05bb89f05c4f23a1d7bbbc81628040fba50077569d99cd7b5c7f19b4cd5ac618a4c489cc08cd55f567a203106be784f6824f276c5b4407cafc0836a69c8d90047803c598db03491110688029885ca112ba18026a339ba7e47a4dbc2386710e87fc74495935b6c408ee077138476b8fe10cab556bd1613bbe8ba72a345f157641873651b314534a7c4bf2979fcc062593c652441340e481a76df717b21061620c946e1250e781661bd10914556552ca3204d44d64972038a68a60358126305dfc2bad91289ea150162333bbe98874930abfb3b13922b2be9fe6bd40c9caba8b9412f85ef64348b6b46695184b212b9e35586df10375f0c0781b6245e2d8c580196a025022388a8b1422a847d388b1cc17f785772d5ccf342c01ac667ca866c49272af0127b8076570ab309fdd096b007843a2dc167837977b459000a8378fa4aaec320874804698524e4111bd1525be985a959ad3c8ee8373511726e88c71f2a839067c4a5a4235ac4a977c444b482087c612752ef0359d1041d3740ce4db971071c0947319a8a2c314dba1bfb118fd093f323c4e41d618f0cb73d6023e7380bd68b9351a825fdb952f13f48b64d99bda8701d040b6da27061ccb36f982611b851cf2e795f02161f58ccb973c6c3b0880915c31b7d59e3ab05d14d7697ba59245043bab406d0286b71f72006a51aba92c8f53e39333cbb273fb7814162c4d87244933ceef702d17db03eee50b48eca264026d19191800e47d1bbc7ef57a4fa0880338922f75484759e2a926391d1f993ace7756fd03c13002950c33cd4a882d90131d5ac4c436bbca02e22c608a3537d21971672b49963a1f867fde42c4b464b8b1e557be884862a68cfe361600f39d38886f8fd97479a0797ccc95c66289a489a66aa9955d1985d518b7c3dca884db56a6bc01d1d21818fc25f43a1b378286eeb18da2706393026dd8295e4e20a103ba97ec7618b119154543875f43bc08d76dd51730672321bce866ae2ac6a6450215439c9510174c90b58a416375e935092bb7469624337a5130c30e27905b0121678480b75d206888c706699b555084a6cf21237b102107bca8cfd4809e3513886b271c45cb162a189568ccf9389ec8017355db91ef79afb172cdc60929d071c6ef927f641a82937a146d85ba668701f14183a5136df8d6b27a87c215363016a21b8ed0bb27173d067349b170911c0607c065b173a429f244199db3affda480d7e3919ee616aba4165cf1040544739b3b2669817ad6f3335c96b731ccb2f0765552a71ab3a32e6509c7d53233b229bbff40c8898544a8a26db655275500bbb265acc4f8cfadecb77465c5c1989680fb37b554b9e5199c53759f27409df229034d9247fc965d453a206197cd840c42b495483faa1d62571b27190aac9c56bf5b992b8019ffac1366925d2b65230e2a88cb3c209ea13a1f273c9c512918637d5e40b92b9546970b341ac0c69a264b90a414a43270e442665b59608919cb8ee7234d113bf6d14c89a7a1a1f489420bcdcd96123349c65984aa9ff083a73c8294a282fecb16179c494ffb33506947c9b59e39990b9b516a3751aae6cb5499d196f6402f7c2a88459639e6c2105bd565380184b3e48691b11598b5473c02917558911afc73bada907ee1c124a1086a949fcd45c0f0c37df0863f45d70125d02ceada9c797a80b1692ce7e7c180079023826f0acb5c80a44a47f724b27b652c10bbe4f6258014a03dd7cd84ea2fe0ccb4c0744b76fb01f0f42d3c5862327c6d2980751f835a9dd741cab5042e685b52f45ae95cafb6229b044b4a3e056c242ac7a44587abe55f8de5b2fe0a9cb8f9aca9baab8b423a2b7c6afed694f275c5ae2157288751e95c2ee45c03935a45a130156a739906f104dd931a6498960fe27aa15a0679d1bc68c9850c930140b6a45bd2c2b5cac0a168aa644760f3c8af61b8bb184cb7dfb784e0f0c5ce739fd881c1856815cecba44a3c4214f7825ac44e77e97c8b8b32c405292d508d2f8709428a39e9b60016908b1ce6847f84b14b555250451be218c2bed841584b3627fd000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 3fbe35bddba843a88d1401fb50ebc9a3ba2b42cbc5795ef3f29f3c641287536a4999325b99f6b5e9c2a36f8127e2c09a7fc6140a9bd68300e40e6ffbfdf112e9a50a21d16a256dc2b9b94b2e45d249c40810a6978963b186d543e2154590b9007afcaf9d1791f4b0ad69283ce711467f001e8580693bc7a59928f7b1c228dec882e3a37f6f6ca83efa2a3c2b2aa919328a4b4174c00c9ab4af6d16de60859d3b4cce874366fa93c26457d029d20c186034ad8c4c30a51a2a5547e90456ea1d43ddd1b882681e58fb8e2db2c0ff36201e0becbe530be3cc8c6ebc80b9f7904e8a1009c1aa33fe35649ee91c558882f84c885183a6f226db7dca9af61babd423d2f749e98133744d5cdcb36b541a6486a43a5c39f92e0949c6204237ea64ac25faa8129af4a10f9aba6a0b647e1bc99b19187d3a2a941df726e7f8872e2e4064702ab7bda5756d7ec0afde524bad03e5f80a4bd76790a46bcd2556c31aef335daaa780c2533c1aa5fb2109a597326fa9a88be25f28c0b9577fef5521761802236e274c790891b4966030d08319894e6904745065e417e91d8f06722b159f21e4395143a875b2b6f48fc614fc06aab25f676c665ab98971fd28a7a9674ab15012517860b2a532fe543f50a4b467b2246efd85e32bee86dd067963edac95b2adda65a7255b7e83be377f2831c0e1a2cdf491bfc255bc417661a581ced672ff02e61c097e8103966b7ebd851a63d5d5b5266d2604bc350711df665fd82152a47c723cdd0d43b226145aae4462a233b2a8f91975c498d50a6f4f368e8501b709c0df403ae23b4f559cd57c2597f6e30b1f6047be7630b90f94f8b13b26421386b62ea16fbbfe926b7cc08aff6a216ce84b850d4b3fd2646824a3a95d26480aca8a36dfa1925578eeda4dba9bfd90fc72419c648223d259886d72e728d90cae21cf204f230c57d00be1444a891d4da82a9c9009db64c8fbfa922c205e2d51b50f4cca46ef3c19034be588d305b21d4b91dc2c806b12bfcefac96c6f5294d1d43c5c33365a0d5d21f5067c4b525e1fa20742502441b8d7595a309c7ef52f4bc96d3a4dc09e4480a67aa9ca10cbe640197bd824099448cb7a2cc6d8ed1a036c3dfed788fe64905a0d6b850002b932503eabcc1dab4695b33b48f0fbcddae3b8235333d29080ea2c1b58309c014b13dcdc2335dacffc003e98e2bb2259fef78ca1d136ee25805d9fb757a292175b0c9edd0452effb49cf3cd43aa50009e55a4919d2e1031e17ef2ca0d6d2eb660c159580b1ec821b0dc9af97603bc27611adab6fec6ddeb233ea4c5d068d1936f5e2d0632052512bfbba15e8601f5cb8534f543997d268146799abcde181ae13fe13d1b17a4785012e902f3bf43599b0e287ad3abfab70c2eb79a60d9c7c9e3856d5205b27272e16dfe157f36befeab28785309ff0c2743a36ee66b7b036c6df71c116fb4ba983f80b07817982e084700a24245f377eff62536645699e1ba3072caaffc45a7a3668c4ece26d7eeef7d7e32be0e218b89e88aabfb7a2979c0ba030ce36c47b6c0e4609315fe12b25f66f33de60cc9334a0198e00a81da412c9ad39a036e5e3f9d39b4a5b81543a7001caf176fb1964cbb1bbcdf7e096d762302baa502f0c172ae4f22bd92a969381ea476ff67ff3c96e9be48950b51fd01f3160b5156b66103b40d3274f041640e14d6579870a6bb51c5c27ef6a3f0f5260cb29982becda5fb21114533b5686df14885c36b07907e33b2462c17717f85a700d8c209fde740af48652663d4a67eb09f22322006a63a54fe50a9310cedd9d69b6ba52c1c991b8b43913d97cbe5150ba103951462140bbf02da88709af263eabd1a6db3a1036d2ed6bfb3b035c108b5df06a9b0e64f16891e11460e71707c6e0d5eff6796ae7d054a9026ae1a9daf1fd6e6f6ba780c852b7dd164711167f0fa71ede289aa7e77aab847e9b8852bca0be1e0b22201158f8ef8ed7615ef65f5bfdc3cf3b8dfe33d94a0b4976e621df81f699d0b7b61b3a1881698595a06a46fabbfa2d41ebbd7467fef258b6676fa8e89fab9103cb1505b9a4a2a532ca2c146dca4da88586ebe6b9116e7abf83f0042ba7a8393ce1d7f6ef50d443579eff34a4bd08642441f98ffa908a4adc4893a5a4cda1bd08e271a317950421be1af54ebce11f3928dba1d5c72897f896a9f11266062b5abfe3ca98be59a854 +shared_secret: a0cd6965a9282d1db07120d6ca59cbc6939fc4c64c6f980db9ef85b07c047e95 + +# Rho leads to matrix containing zeroes +entropy: 4960ccb1276f96d7aa55885b6ae6f90343d42e1391e8241b5952931a979837e1 +public_key = 75a9865fd5889a51a706c80945812c122ca0ee71178b4ba808bb7a28ec91ddf13affcbce77c1111f692e50f8b6f54b2694266f10c5cf411096c36aba5a292335592d975036db69a823b5ba1d003b98acaa0f6929701653058627e444b63777b6047957bcb749c889b1426b34a10783507bc5e3fa7bd75abf62fc236edb83d65061c2a7671703758b04d0ec738e1841b8256b58ac448285f1cc0495928c78166ec0a5ab8471d8d59606e375935c0211535ee2a47f051b310de23a153451f39179105997841857f7e277918b682de60ea5d70419b0a2de9c6ad708091148514e94249d45c8cb60215996abce1c86c31a780246b0bb937f26313e6fe1ccc963952352c717d303254b5c373752be849c027cb6d3c616fb52375492a4848732756247397a238cb63a6d50b9317bb939fa594c881497f92f5783951e03a3b1496cdff20e22256319405d44c9553f91018197510db2956baaab22009ab153370b25a98ec2c2645661e748ac85976872a47d9716ae7f865ed112c4c522c1825213e68978f0c1654812868c00050c7acc412aabb4a9683ca9c673e129d018a05da0105060931dba7eaee888a2b233cc567d722a447dcb880a46c640592837891d6a4770a46c267f104811ba47b19031bec2a7510933295752d2b28de55326dc71c4caa543b70372938087843bb63d74953453057a3877d2343663c058e218412db1829ed9aaf8574681bb2ff9e217e7d44b2c260b90c18a1b20c5842225a66c9afce760956b118069a4a8ba057eb204e03a85ea1701b85c71fa6ab590345140f58280121c58b42fe74922a99b8c2be04dc76c1173016b7673bf870889ce6520ec537d356c9b55d7680324517ce3066d8551f84c7ba9d70fd9f3ce485b6d1e38b5cf055b38e2b83730ca439a14b7fb7a043a390fc652f74940ec2b906a41b5304140cb5b5412f996cddb40f8ab85b087a42e6ca00a275975495678890ea6a51b6d874235b48295495e951007142b703463c934d10cc88145886c5e7b6a04dfa9b435e27c6c729941802b9b682a6587907254c5b93694de13aec3d93043e4c095e4937e9506867266ddcc601ab9a2649822824aa12846563350caec702f1b493cfce645e2a0758bd5a9e29bc3c72ba74305577c10266099bf884477ef111c6982826ad7b658e8aae4ac69a2025fca407f6b5275ec6572b0a86a16a787a413cf919a39f65074273c54d8fc548b2abd1a7c9fff406c84191a8d4c2e9916b37e652e5e83c879942a559024fc9008e8d008dd39768116b50bf4c94031cdf45cc932210711a443b4d5b1b40875924576e864335f130f2f51348333c0b6538a7efabfc8075306669e7b47cfe5758f7387526e666e93d16777895201f555ca916c5907c80cb003f6b31daa94851d0199493242a2d4ac3ebace84d04b7663a7f922bc277562d984244ab894bebabc8d8b43110b4b1b0ac3f4858be1585a94c46b24252d3bda105521b0c625979b6b251726ce2848b327d36ce3e8502ebb9e67c102c3e6250bc605d71a93e96472c9370dcc3626bac07334954bbbf280c2e84dc2e61b7ebc0035897516d75cb6cb6994a06bde802d0bf986633c0ea0f3a4854059d3e251283bbc3a19ad83902938e2b976c10611b62441f7c8d147023fa88c1803a8f4b5a8915b3454a85e66345218f6c27dec0444d4bf28a024e8d82a86cc40edda2751db4bae70045af8a450c46b49ea7ea01b70424810a5187e2057aa7ca2a36ba56cc94917535c06a827a704d3088a344125215d0b5944e5a91830a663f8a8c4f8e20c6072759290946f153422a62cefb33ab80b037b145dc4f5c49426770c103fd91539b42b52ae74a6b50c50f60650142b39cf595eb520592c0a4be0c16d4f766c29eab0edc03a9b864c19102d08458b1b94292c1915a4f191f6674723285caf177e339c7c8ec7c6b0a502e96a74db0c5102eb519814acc3a6698be62f97e82bb57535ad82cc4a8b90c2c46827ac0adb013954e959364c28e51284252466be14c2141231caeb2bcd975492e500e6c518d22a2b5cd667700bbc741c155ec81481687e4dc98a6f5b5efb9188c028c01b2c94bf858852603ba35924e1ba3fe08c50020b7d142a8bea70aa5ef57eee5ab904b4a5d1b251e93ba6d9fb955fc33e5c961289ac040f2b4af6ec2e27fd000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: d7e07ceb0c6e77b3c5adf2682470e7a7b874f6de85bf8a43a6b08a5c9a538058b8c3bdcea97479c5ba6d7aa64a243d739c22bed27507968dbc74427bca924f61d6fb5825c5f74592dc09eabc65508ed637b8908d058790bb97f05a1636f42714e7d829177b49c8b464d0491ee9f00412c38f0a67504499d119acd85a3df5835302ac2ada18cded22f36e7a97f18643c1181bc71fc636827f9b45639744b6dd5d121c2c5651faf11e7752be2a91488fc684419d394d13fb8d8b566a2f4e72f86f6ea22b45aad8f52e2a4e0b9e4b02e216a1c2d924dcd258f84430047c2a999c7b6548edf5ff36bb14ff79534dd18c89d187dbf261db5abe5e9a4a98af5d1d8633690a18ee5ba00b8b606fafa63c9b5a4e58fc32f32f6917436f8aecffa64f70bdfac2d9e5963f0c841a9a2a40bde295a7ee21d5f84f88ad2dfb60482f5224a1ca6f4d0bfc3ff133795478f8d58dfd086ad5bd93571070865723e0cc1171e8ae93c13d565194ef6cbd40f5930c88a2e433120a1b773a9dc93daf21ee0f201fdc24752693df11c0d86115b68e31f4edf4cc672c2c1c75f45e534107317c5e353dc575ece35ae6069993999c2fd5a0ad534682edf567e1c0a960013c7abb691dee608eb269825a71de35bb3441fc422e4604ee2635f73fd3fe18c59b04b30954f81d4e8b6e63a12287dabc50c26dea93a5aee7fc00815af233c9fd510a21be7c9c0fd7276c7edb2130545c9e732980a1402aa639dc713a540fcba2d7d0c2f7058cca6d503c1d2a062ea636e78cfced18a17914394b340f7cf3d5cfdec1caad629133939f0fa0d7eb093ca8bce074716e9b5a8fa39893e1841a14294506b921e34b7680ea79fbf88328dc55b56803411e54a172585e4d119c6b42e089744fdeb34d5c3e0da9a61ff73dc9d41d5483fb7fa90f31aaae4ee2e9068f00e2fa0ed7c37722963639160ec4aef8fc076c4224745310f3514ff50fb36611eeda4b14034c84ea774f3f864dc8d43656648c514ffbb59969b573af2daaf209ce7b99d6b2ea076acd3be5ade1832b8f074e6c721218b99d64c499a26c1b33f2b293900c9d8a5b0b6380610d49ff6a55c6fb9e06640db1e0181fc39a070fb1573acb86ec8cafc0239a913727f8b1f4f58bbdd522f9106afa5ece1be2fbd5259201783c0444a95a4d04aad6fbfc3c514a4c5959191a8baee6459bf086f31204d624d7a8821ee7da353dd95179eb6dfdf95ca7571830f7459f4ce6a5237f4fdfc13e2455a3e94996c2fd08136fd44dfb23d15e9bac5ea07c270f62402cda12df927bac95647d969591b7ec8deaaedfe34f8b4731e578b1b7ad8d0386885552934f6a8f00ef304128a369e78ec7100f9118f0ffe8ad237d2851eda280b3cd2b7f46d62ee0ed52487e951592606f8cd0a2f463781bf3fd1503218d4872a18ece06c18463c075418dd4bbc514ff4013b6a49b4f3676a1654c74552dee3faf897f3695db1d3b75e3336146b78371fbbd5fc135c63bbcbe019b5faf910ea1709c24c0819e34a54f03c27f87b040e07d0f418a04d1d1a9508b70d6f0b4315f37d0daaa0839405f4b781606801b4a5b0d3b2087965e194d513ca64c310ea65192da9179a483adcd1dcbb21f389b1a515160391c1becb9d7ac34f75386c9ba4ef487b4edaebca3545a40cd3bcff1362d5d27a38993eb843bdd2c7de9e81ee87bace1bb4ac6d88a524db65289cf69c9c7be3c1882a39b8fb038ebf531ccb1538985e51b9b494b113933b1b436427bd1dde4540ffe8ab7c4c426a384fe0d9a824ed21d645cff1afe2bab0511e6dd3b0554843931ed277e378d8fa56e8454b8318447712eab10c102588ebb12b481fe8a613bc1a5def7883d0681ed90ec5f3004d04020700848885f1b5fc542fa9085641a5ac2d8b42cc9ca6a484d8c0efe93850d6896dd7a2bb15e3b36b8edffcbb9810cdcf510344070a264d32166ec55ce3764822a8da2377d50749b415077112a1353327bbf38d89a0611cf7e95d0a1a5cc6173555d3b76c13456e7e042dbe22b1123f32528953d2969a966aa37affc93472fad39949ea8db080d58a4460d6bedf80ce4b83a8eb4fe3e29cf72da59d354055a364dbf013d4ad0133fea1c690d8b68e9eb3c01b7a14bf1bf619f8f5fe2d2b3001d3a14eb07e9fba744c4ea8e4700492070bb2792c8a753251eab737267840e4f8b65a8f533aaee2de1bc20a4a2 +shared_secret: c6a7a9d970bbe63973359c7c72f190080a27a02b95abd0f588fc163eba9f82bf + +# Rho leads to matrix containing zeroes +entropy: 456be124e7f43803de5f734ea016455d68164a7f054c003f4ef49e46f42dd8d0 +public_key = 54532140ab6140d7a6265c3c55223229f1520da71b88cbbaa7dc7b6f79cd6ea1062f9ca88c47b70fd5b78d5a38ea594de590b49ba0ac7b5cc2b324bfc4d26dec413467950eb7dac40f5a60f054662bb9607f8bca39fab368526ee9980498180afc1b6954cc242cb04aa8a01a37c16a805792872b2b1ec63bb4b6bec174cc28631c37953241399edae60e66074dfd9b019fe97e00ccbf5537baacfb6bed8b6d3d4cc9c3b54e006c70ec2269e5081e8bf17371757b9dd40a8f1a388d68226d46bbe0b661a2b4521d143b77e2cb2e567fce825ee9338c12f425466716e67508f7e4882229a85766079194834df17440d0a4533cbfe24b05b503c75dfc9dd4e7a067ec9901b504b5a08a9d340f9ea4b036b218ff6353d8732d08d74cbb4cc19d6123cc237e31768845c628ad754ad9f484f3c3c0587a1b9883b0abb2845fcb7a57b42493d60eb5793926acc86b1a21ffa1a790183e1ca56aac8256c98546c69523819790fd3764ea0670836078dc5105ffc04fa83c50d1e933682c54911348c8627cb6f776d6c79f4415ac0a91c46bdc68711c10b0e34770c4b2d39194f95b2215a9bd453828871789a45164e57215fd4096d9ec05054bc55e2a49206a69e4f998cfc68656840065d242ae067195a5c421db21db766b27c29fcfe530c5e311408328d1b69eb415bc4b30917f957c52c14bc1c01d3f0588dcd58565f500569c539fc67e1381ce86904bddb978467c24352032b975045747235c8932f42276e9a36ff89335d6a042699827fafa84ab12b17db956b0b55c38a1281f5a5f2d9c9104cc5af03a918a5b26fc5585f25cc8ab750c47684623dba4f609827abaa9ad668427b63e1b347f00957041b6b62509259a35542ecb99002c5d388c98e86b7697f41398a3a30aa69158171a63e3397526b6fa4c72008288bcc1c2f7d4572e449d228ba05646a946b512260b6eea7218e47642cada5a9561b867648e41c368b1796e2df7273a7208f26444871756e4d52fed089019fcb727189718f02122853c6ef21d6b3403e50c0cfd447229b3457d7cc63737c6b72c384c8ccd4fb451d82a1b49e88c90c7be28311c25e3be7160bbfc42865b9003d84c1734d44adc8b590465986089bd59f1503d888f7ac2064e03447896074a947487c2b08247328c933cc31a9d9ac828962cc0b7807554f661a7d64ac90009bce5bf00b19c579995df27401fe4bf0dcc459a8c2dac1c55e50bbf0e877abe5b658d128b7f434936e273268442e725116f946738d810119531637b65e14c9d3ef26fba358df92319598c092b936e368a3e0d8a53f438708eb47de814bc90f49c83c87a282640fc02a2f30b56f659717f6234b611b4465347bd990be4ca01e550524a164c6b97a2d64cba75c3aa35924e31d92f008b42c2f701b0d99addb39a045a8cf7ebb868822250db42408c0c0a60785c182231002b0bd9884fc89a0ad60af9699e5d0661b514291b824639517bbf267decf078e8c35dfab769845a2cac1ba4c0e513454151d942a8d4163ced994d166c144ba81b41b1b64b74220b34cd5185086a797b7738a4a6e48100ed5077c1cb4401ad5f173ae4d047da4b5977f3bed56c6c318bb2c11883aa3870b760bef4a71ebcec54b49430ef0b792ffa503947187cd382c49c130dd32797740f335703ddd9703ae163b069cc76d50aac06ab01710785fa5429f79d8cd0c6f4f8711e766796d054b8a99c7c800b4f5c4f75a329c147649a7485cb61c19c0a453a9774585856e65bc9b3d30a20094be3d2767fe0431ce85e21eb9b35d48ed5fb2c2b1c17b13a4c67b09431d7180dc04fe087c827b6a572c446dd5caf68f0b2a1d973fad4352f3a5b22ab45eae32d17a993b24200125720a1255f607a1bf79c3928230dd3443343694bf62b996c3273323997972076fa49c48f094d2e122382b36503e95729e41be8f19eb4d962828959eb56491115bbb5d279a110330b818cb4a139f2290c4771399bc041b5905531b76bf817cc283331e860ab5566b5e7023d3c6a28f0d7151d175dfb9c1c8cc01a45522d0ca6374b8718d04b77a03635ed23c4001145f586a4f252a10bccb3cde193fba4329867926ef0b1a47b8bc130431a563ca97bae83111d309167caf354cbec2e51977094bbc6cec068d339833ca9c7b649204345079274000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 21c66edfc81eada5da6f03b40842bc67acc6653a816c35c9279cc4b1e956c94cbeda12013dbcf99a31c8579eb911171bf6f02b95e9a75ebbd255f2bee1e78fbb1524cf32afb999b4f39e3084e15b6bd4f6aca7f8cc2228ae48362e3c069426b260e0c5efab5f260f7ace2f1d29d0d9344c56b0a2232c7ad3d0dc963dd6d6bb24d956c47f8ff0dd7c5ad88bfd888de6f81cfae46096dc35739adfba6521fee79b4d74c4e3673ef9d91d26278404af9afbf26a8d8663dd722653c993ef20fb8fcb22057539f0a756d20a4a53710b3076aa90cd7c9f6deb6cd5fdf50b320685a6fde64b3e0580edeb49b63fc0038433088deeacbdba4bde5e07a1952dad8a822e4659ef39c6e32cf5f674591b939cb17db95cd73a18f3d7b4e2305d890d3d8134e78550a06b16eb84d7214748a50297dc409e7b60638878cb6c051621277c47648dd6aae6829b23f5bd6df5925d435fb5a4eb852f2bff1701c68d451760f254ec59f7fe900839afc085adb69b6d640a98c10c49d24d75046b4fe7a945248df6be5331285c42c4d714fde6fbb83cb7cc2c435b5691abee38030da34cffd895cc8231a8b39940e55437bd2856e3adbf2e48807aec2c90452e02d51731eb5eabc223d9eb47fff0fd59480648ead1b14a380bc1a0433a14ca0d815cba125b21b00e54d60aa912ceb7f4976d2a69865377a5b884e259001626303a33c302e4878fdc75be458f1ae041213e85316836f2574394002d248159b74e127012085b3043ac53637ef55ad9941802446d5c165b336a1bdf83736358ef62efca6c3f82bf0ece3ef5a69c6817748091826fee0677995584995e2b73bcd7c185e1bc88c4fb9953f61fc8c3bf3127bb3787da572dd9d99950557120ca64a09a1855d651bb6aed9cf9f791fdcbf92a742bbafedad28112787482810ac3bf3c6c14755c9bd75ad285076e50a30a232c3f6f0d7c4efd1857c239b59552819524690f8b3b3d3ab415eb36418470565248bd10657ef4b46d2b42dd769e386275fbb4ca289fd095d33a86fcaf88cbf5a374e272221b2e771b2e7f5546dade7e11616a722d5ae62d87b9ef777039977d1448e84d385eef27ad070b39a96a610c238945b530f0b1e2ec2aaad1de6c669b60aa1afa4616659de42dcfd2b7437a5952c7601e803de19fdea2564765cdef8b10d300d4df126fd8be3b0e75dcc935352b0e942723bd302f7f74b434618941b02d7872b17be9814549e72326b6b098f7dc15b4dea4806f9c713523a6c9c4166e689fc09bce2e61eab4dfcd82d0ffc0bbac3c419b56a16739d68afbeeeeee17b561c8ed1d26c4abf375e8fbefafc9f9a039bb28e4146a2a6d7a80743c92ce938c3fedf05f2addea12a470379d152eaa1be0d997797d880cda4335d325c2a8b1f4d04afd1ce667ba24c6bb66cb361b0eb97034d6a26bf02a1fbcc8f02e865299ed5cad65dcb1a3fc71966bac09633955f4834b0d9b3222176013aeeb0030b2623bafa7c2011777a6236633a719ebd6c5aa6347c9c8545dc8110668fc5f4bcb9cf070e4da0d60933f8b064271a4b70dc03e813329e421b84ef778ad98b59dedad9b1ef3e1115343100604fcb7f95b1e448639a6a35d2c0a49eafaf18a19f5d6f3c528b6a9cc14f091b19bb57643eebe1deabedcd4a20faa1f308eb88132774091dfb4a7b17c012dc9521ba4d5a0023f284abad7570645aeb798dd23863a66d02c68a91b87ad060fe813dd9894f56511ba7b40436ee063fd67109209b3d6724e4b1dbdb445c02324474399bf144302b9bd49e73f1801304a68870ddeadbee49ba227f7edd5fd288a0b936a7ac25290aa1cc57a0b90120b8eb89bf423511564b764991750a5ecf42938e854b1e4b768c61ecc871ad4eccc18d3196e15ddf3afe4bfa59a01344289a8d19133ac3b63d4e700591a3ad63b3253f6e25705585c56fad7b965732de47fa92ecdca4f0914dc1d78caecd85b6f9a71d057493cbe9cf27fa0923f642dc94b917b7ac52184f75530951fb84d9bb189c879cd75c93895ea9a8f53ee91358351a68eb4af66a07bab5e838dba00ba447642eb3568dc472a89190a2e8204c715a0475353d177f32775b7626cc2f3430dc488a4175d1a574f7be8a7f3a5c89e6ee97a73a5797907ed8c239ac3d93e299e74d01af7651cf3cc2cc9d92000edb5b91f77abf3f5da6500e04ad76ad016371779740b9cf845581ef5 +shared_secret: 784ac74e14797b27f5d98bed3d61d66a017ee9ee37a5b53038820b55b130a2af + +# Rho leads to matrix containing zeroes +entropy: e8ac9e76377d67d84f85a142383e777157805be0d0f679ba89cefdfa61583780 +public_key = fb0a389191c8b5857fae399094ca8c9af399152a87ba77181926b78f2b462c92b788ac988303cb8d2a9855497543fc09c7a49055554b9a9b6d868a31fd4922907275ca978fd0a6c3790a72b438c4203641fe2bc4f5f45f492c0abfc9267fc6660f2c4581e53d6f8b57b0d89b2cc29d97aa315fc7c9ae419f38f425c45271a29a9aa3f28f5162a92e317312f218adc92b3c46b8ab8a4c598a78da54107df7720b734f58d63064088766b06fef11a95e76b2b702b3eb0aadd0a23b66429572677304b024f34a0c07c4cc02d51186e406085a90a7352cf9ab502dcb65b24881c6a86d39c49c37f77a15b1b10bda2fba45b5c6c0025452bba0233040c11103084e95c8a51b7743fcd984594208deaa223278c12d191a060ba269eb0083c00b60daa0b8169188ec35c589652bc21da1c3c21ce5b7d6fc5eba8bbbe13216497884f09a1ef04b529805a80da578d8fb3724ecc9b861a3fb457fb47678c0809eb9e24da241900903a71ff446ec4baf09305b03ca1ea1034686f533813921d7137848e962e32563c9f80cf6f564f12999b25c4826699f06fba88234b1d51b77d5583af18868ff1c78a502b414c49319461749b91398832863821381fbcb62b589fd665b78e81297d34df7b44117464dcefc863f850ab12ab338c359ec9383e4957cdbb810e7d4c73c173c23f65ddd8bbd31305d868a496a63aea62014fe21c8ed2c80e8ba56f606a6412a9a34a98c3c0219cf054755b44515d805dbe4879c0347bad7c7cbbc08380aa297623cad5029634b025141b58169c8865c206cf7232c260cf88aa91855a581b750a1ac168fe960e5ca283a1245e0b31abdaa58031b3bd51ac295850772dc0b819cbb07c66e734597f6387ced79392594723cf39c67763e3a3c2c6a009853e510bbf91c4f4b5828a91328073683120919eca166095c7bb4bba5f13b43bc8b7a991ef855399c6019e5a7a83057982e43b099016537760956304479a4a73b57bb76153f58f51d47dc7706542b64e73e00513cd838bbc9800d6b90ca304b06a31bc493035cb1d116ae17c164f8c758f5c7be580997d155b2494e3701137ac69119e47a2f145eba891839f0baa084af96d916a9a64752d4b4586c0626836f549317e4b6bdcce1196a09761928a968a4b74b611960ea2eb34bb18a964c18fb10a15319fb9468134395fef8a40a1b144fc31aa536a473ec9f809c8fa1f74f90262fbeb0b1d980be7a2970563cac92565d6af60be699ae8e692c311692d8852c0fe0426624cd9a0a1a18961a1be613b4a9a03d275e4248809f0226179410fd190c858a41abf5446b2cc3fc1815e08149d5c81c924664e2455fabc46f108259073520446b98b697c36da1602ec8135bd053cc034ee5db4b7b58ae8b59256d93a80b69c6911b14fbb68527da6a3a29a8d1c61f4d7c21f0dab9a5b266c875610437365e2a2a4e38a2e1a8835cf7237fe1483ee01ead6aaf2fb072f9200514a9709d6b4ca51019e782aa590552fec8b5ebe40a0c99ba17c57a7a460abf5ac9a4869f11c7c1bfe8b8eb0b7618895acc88b91ce273df7353b3d083cd72501d0163abab80120a317e870c0a1751600162d633a4a4373fc988ced65b6501844da162c6a4132d8e690246898e3d2a6915ecb013661fbd763a624c8c7c1672f88347d6d28ff622427b669332aa34dc590b3244029912694721551727cc36725861959ddac230b5781ce2f9b5147bbd3b70a499c0bb34c955a1245e7cb16287f357f464aa11e44eb433b6745aad46551e90935be4c5b2ed211e818480e4b32c2af84c61aaa6c01a7e16a08761d80b221772d234c68c97a3355637e3535ffec5bad36b5214a22bed5331b5ccc55e48c4a2a76d0f68759442ca54075ae0accab8f3c9746b129a152343993bc7db74a7e027a523bad3b7cae347328d64180ad396897007a098a590d98a8fc5816aa5ba805035cbc24c685441d5c754efd879c327b56a7194b5391696f0167c0677c48bc8d3701447e052829b3de6c840ce0b7b8d95b5f46695b85037232a7356c296e854842be0a48a758d34fc0d7cc2808d7908667c77a2630ae8a52c06da9215653cf41799eeb5c517f65f6d26152a656d03a685109a955811bf05b6199be9ae97fa62ee2ac65a6354200856c6538646d47f9f974289f0ad6978cb5dea000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: bada76528c6a07c80d5f8363c32338250d6ea541cf8d1177bfecbc469dfb47c28ffc75e102b25b880bdf0c8e9977f41592b24b1ccabc2e2de5f38283aa30ac51fe3b4960ab8810ae05a823b52e76f267358a56124a54fe3f8cff35dc8ef24895c83e90773733dbbbda50df879fec084be456a1250980f4ef12c78ff2b59231a944d4c4449956c635d443c92845bc747854ec6e92b0d9339684326c5adc6a07737b27a6fe207639046dbc623f531217a7d6fee0f5c8d6397d05dadcf53e43823daa7a0afceb87b718dfb46e4818f11d2c935c628ff152a0361fde8458e76475682541919b517ddcaf0eddb918c16539a8a04f81ff07827a47b5d72c92b566f4d7afd4db362c855e75dff1c0bd83bb6543332218d33e8f9e6fd38d021f961ac98525371183dbcbbd4875861d5d9cc65da0550279b8055b4bd099109e193a32b862d14faaf1534e29a4d9963e2c71eeee21b0fdf66bcca905c691cad611e4b55329a9bf8aeb55a1445fa2f6ed7782a6b3450f6aa7aaad82dd5a552f5f3d333c49f1677fb34cedcf4243cae779143fa555690402302bc47bc8d386ef9969426cb5909dc7d180a02374614b2bb46fc61988984bcb91a307c40848f7c8fb058ef2712c2bb5aa42c1027cc85f22e3ea91e59ab33cd9bdcd80de2c8ba1879ffe9a79a17948c0a27e4dea267609e96e5c84195d5b0c41178f35266df867a7d32149dedf2beee8a3f7dfa9fd91865e2a1b9e738378304884979f667055f755444c73ee53c36c21c2c9638ec9c0eb4f761a9658a494cf2213b70e9c19e5ae51a3750a34f3c78487a7736623e57e320e63162fb6f41cbe19af57aac75506d59350488368b443269b98300652412bfcf66a37ee5911d9ab94e402abc78515e5e0abe59ce7396ee77c7dfd28382494f96defd6c2d00ddc19d40f256e8656c7eee808e01dda0e04d1e13f3bcb943339934fe9ef9dc3b4a6b2d89ef7f42f9ac7a9dd446715ea4b25d14d37894ec6ed5fb8ea97a101e2a6e324989dacfc10d0634198aa65d65cd7f4e8d60021f288124a4a33bf9cf4a8e3a44c8fd44f6ff7d4fd69c645b37c5860c1f86d87c16e05e16e3e8fc84d4948f19cc8e8cce3012d94b6ee94bae5ee701d585a9af4b48c70055988235861279bbfc1663299dd6ed22a61d2542bac802ea9b0857b5afabf44008a8fd2a46d5b5f6d27be8ae9b13e4522c609f8244bf9b3049a8b49ae60445db69d72be3fa1b5d7756ba8a1fede16dc223cbe27e2d36dcf275e3e42be48a7a4a9674b71a4483d6c6b8d2dab1eb7851e089fb94fd3b18a37243828fc1f40658024200b1284c82d9e5dbbff6974d68db1c4e95532441a4deab8c2904cd5bf210dc3ba1e35073ddeb346976904062ae052c6f5edd46bcbbbae8e4197fbf8a638576618d77aa80c8d83c2365426fedbcb2c5781e08138d700ee544d07267d392b081a281408e5dfdc303dc7940c61e64aec119e0a3b1a78f7c703896d2f1d53ce7fd13245ef67d57963cb4c9231aad8464d2ca36bfa42f282234461b4023a842220c838b1fe7157223d254e0405b81536cc06a3a9f8a6f175054d31b67223fb59ca0df92c84473291e87c9b74bc5207a7fdc966dfc36e503cde19ffe7b284430a865334968c2ad1c1fbdb2951d44d18c898a26ae480f31d55b97190481d48f395e34b4571e2fa5bf83ad9b16d185f34a5b55d65ed5679775f39e63085e67217849b98b54d251b128e5c232fb3fc355a87caa3ba457cb49ee1f0ba692c875079d1cea754f6ca91d28bba83392b420135423420cb680dbeb047c45f4f7bf998c9084900448e8bcfcfcfc87a81d2b586ed4c38931175442595ffb4088ae657e66636c07fb47bf2abd0e32b3d979b1f32c2b3516b9831a57136e4783dfc081dcf8e3666544f2e3f9af6d85b2588811f3335c1260092af225572ac7722ec3a3c00f987b4ded3d1a9d278cc6151ba936fa02d66ff76ea12913db49830283890ce5b87ecb6270d71418d9c213206db87b116eb58eab2530a1bb97ff7d57546d83b32e4b351e3da6c619670974722b6d006e3c288b3a6f684b1db98938bc864433506e67de883749a3c052165720a833dbc412556ea35c437a582588d94eab42f5f7cf9f841f839c7cad07017634e70940453213638d9efed5503def0076eac37c82ecb46b194bd22c6e7db7bff4d5d75e188518d6479fcd34dda34eb70252f +shared_secret: fa3ccb03eda9e8299be919496cb2581d3127472eb062a8f2447241f6b4a66d02 + +# Rho leads to matrix containing zeroes +entropy: 2fe6b9cf4510f212839e348d671b3345da68a477f57513ce363414e87299a717 +public_key = 26c5792a30b2ce4856623898d79ba97c3076e54100eb7029df333b5190cb28a8207a557cf78cb88c11b241da951ea96dbeccc90029845c7c8071f584095923266964179910a64c835045922fd520535b35869a147616970424835e913ad8382faae3b756aa51d65306c6b6760cc3aaeb7958b531293e6a6daf0382db834fc7e16811643692ba162db4266e3b2af1dc9227aa7edb2a545b8785e425bbd982cbec02514924844da57e3740881ae68d9c104afc33a8c27782c658bbbff5ab1da73ae2ba267326ad3ad61183e792075033b448a36ab3bd8e8429f9cabd5e3a57f45464487871a02bca6752311d607701b89aac021649f37ccac9a455017495129a45a6b24f07726c0b633c7a333a2c589967c85e7376929205d6291a74335a89381a4b851bf758cfc069be95847da5d6258123bdbae08fe0b39d55c11044d1c8a6d70421333ebd91bec10b73532a6c00e090027b3480e796e69209bfea7f3945350747af2534234fb0801ce11c73b934391b0f7c6574d8c8c8086151f8817bb2082724c733d44837fc7c24355c463bdc0365b8a0a2b15f63ab15f42c6635a40c6d8a502d5000a6b7158a16cbca964363a4c7f9da5d51c2289d7342d885bcfca1123c324e36273fce5c4be83c343e84914ac382fff92869dc11fe80824de3b745e68f55bbc979a0759a35cd91a75a7c649bbf7999d8726134d75691dc7d25b23cb5d16f0d505e6e145f84a4644536827ff982b5b9326324132edb30e02a611aecb749685069baade2545d758aba6c5220bb244e08d01235faa1fd5a0cc4612139466d6ab26093a22c428252bf8491a6794728ecaf421286c2ac5f4117b16d145977c4232f8564fcc5996de99b71f896b5d828105c593fa43ebaa2cd74712d769814d490aa7e2140f942b6e86b734c32bc79187f6275b9da3bc621ab152c8a6148a9327a549727ba02a9a1465b3b9a32d7cf6984c610691061e9c8a55badc65503158bb637ca4c55775649caac535c345a443b27e88e3b0c435dc33aebd5087635be061a37f3a0715c37b0b351681614bae36460c5a34eb7e763af22955167b85542519700511c843e56476f0a977a5a720aef292e0ff94d726a958a63cca8665fc9a943d235a569da3e2a4b5964d457df1243771504fd26527b94aba0e8b547207861b8cfb79bc6abe3054184922d477840a4c221b420af50608a265eb508a651dacdbad403484b59ef9a819466c66c458d172622609065a424024811b26b61b74b8c0adb179d2dbb7cf4e336677132052b1b7a6c6eadf63a15b484a3240c7bb1c9e1160dd6832c727044c012936ea43eee4ba721c489d6b8a6fcc2bcd3c3ac8121455c845978364148bbc9498542ac093a4d1b7a6a666d0276adb218315afb4683d6956459833915862e18056f7c02f9a492388a1fc65c5211e7742cc656bf2a82cc727fe3516288986da5e4b74ed8abda8084aa90285a86a275f8a18fa99934e73f88f42aa6ea3428b6a9d936af53438e51423a9222b81ce7b27d7b015ff06ef98ac62843703b9828f4a0c71a603b591888df2339c8c5b8922a2ba8ea1a85a6163d5205824056176b2cb150bb544667635788338919c21578faf64ca0c980e5a554f1935410b36b5f29b110121c35424cf52cbceb53134f7569594b0677db53f97b570f842a1d27c3e0971343baa872bb2453799b1e5b433a2361d2f1931c185f13cbc0a0e1ab1fb310f4664d8a49289d15433742aa439483d8789a25c2ae77a3689a17807fd544ff4c7d022c42ec9049e683472b490bc7dc8c9766983e32a2620a611da65583479fdb7670d329c33d51af50dc3234e63bfc1306913c66c587b9e3a23143824e84227505b0b34a3399746554bc6037f87b84b0a7a41da3b366578fd6d79cc9a03d34a227e8095b9bca636ae01988dc2dd67722a5db934c7009f812a985598e7e309cd7015d24a5b36cab65e8f91c233474e1473fef76828f2b245231605d079b308a732553600b549314784690d5ab5830c36d824b68881d6a440696d3938f328bd755cb833a8af037a4bf8241c5d9aba41540a015aa0b110410a05e104881f5e41471e70029a9c42ed2aa4e3a5012a7aca6db06b7a847ae624ff7e941ee18bcfce68c58a8c47db56bcbf60701858e26943cffa53661c180a3ba0bfb25524bd6000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: ef250a35ec80dbfe58ffbc7f7f0a97ee1e77dbbb601ef38a8599fe1c50621a7fafb3c2f42b8dc17058d2c5cbf965d1dc6e45fe0f033b1e42326d024ec27eddd00f4af75ae389b6e2b95076862e11c63136698eaae4a9735ddad9613af997976cfae920dc0a08b9bdbcfe7fb168d5712c7d372fa29a656adeefb3cdf8775cbf38ae0134bc024dcbff32ff2575911a98bc19e7ba3b8fa7e5a1df85bbb4bda21427195206a07a1f8ca8b2550fbb9724df204be3cd5f3231da0211d79900cea59a6e394915d208eadba3feb264964e269bbcae99bf7d8caeefc00976687ed7ba1a693008aca00f0e9641293f75fff8e7169e6e149e6695003c544b946898f466a0cfe7a2ec2b531e771094787c75c05712b6b27e55f1fd3ee3bf4230c05059d83eaaa2ddbd4e9fbdc8fd4e694f17a5a634daaae4c125e1373e8103a1feb119a5a6bbbe7d722427182e867e6bf051653d28ba59f68d52271a29bd109b4b55bef30940bdffe931cca17e2add03a2e808c4c2b09cc4978cd89c078abbd1b3a0919421c0e86f1294f07f5c9ae8c6f66369702aece6f1a368dac179a64aac92d445c9a606103b48e2778237178e407de8d576e5931d123caba6f99bbe158ad4878c5dc78bce1c519f5690b12b5421607d5819d36c5bded5a23c46578e564b1c341e47953b80db58830ccbf40edfebd6bd92b99cda2c62c0d3117f5e84f9f7b8dd6871d045c4cb287e689e865a9d1d1f0b0feeab1ff86adcd1952261d94a994869d33cd083e28f158b918f22f0b8a1fc4cc79d800c38ed0d9f746c3b506e6ccd58224886083cee785b1b1ab19eba46e706e8e89abfa36ded66bb7a180250202dea8366b4695434c81f02e0ab5c4cd40451cf5242fe95af132191a89d653550cb76505cf5792efa6c8f074801ee54ae10a36d75160891fc2a670f1f7f1cd628645980376999d86aec88d3ab55a06d987ee62ab7feffee85f8dd7bb925e3a60c8b4c63dea64777e3dfd19eff0c42371820aa81e451b50e6183e762798270a20e94f11efa43ae958f283e05d20faea378d9e94f57c32c47755c400c4a6f17a94e28ccc0455726e309d1b65d920b185ec129088071f557cbaa3372c9bc56d16ad33fb592d8af9076920ede91e6ce659f76b6f8dee15b1ca5a5ef9e5b20e7a136db652c095c883a5cc638a79fe5dea351a485ca8ac83373dea459073528d138da4eb895cd201d88b8c1dafd0d344a430495632e82044b4bfa73237857b5bb2e260a6bb2c7583fb49826ec08cbdf60128677ff1f0c44aa55901b5b9c4eaa6defabd1f6633ecab01cc0a79229ebc22c7451d81846844d229fa74c0f9da3bbd8135630f2311341929c146e7221af95c8f569858f113f32773a8d3cd10f71bb962364279a023518daf7e9a53778c228dcbdab239917a4f963dd221b00a940dc1a1aab798820aba5005b7d80cc84c18e91b6087c7c966015cbb22c30ba409e5fd93d4bd843b35572a8a629e9e2713659ce0b893f1c995f1e61d502b50a62f166f2f3bbefbb534ac139580fd56acfbd232dc507065830377cfecd3bbb377b72450fb615c7971acf1548a2abc79fce191d1be1acc15a8102b50923a8e596537eafdae404d546a90e444e47e04aa6a7d529ce6c74710ea4f8140b3bf7fd8a468aa8b96445b413c9bb19d057bde4ceb98a537f736c9deebcdedfc58c9d5ebdbcdd975b762a20d6264016cfb8bcb57ffc4bad83a5b997ba6263ff34270c10eaf932f85f5cf10cc2ddeb3344ba5dd654eebd67008c3161e4c9f79680c375b2e8b031bbd1293e22323abea7bb04f9eae988c8a9a9d9e7f27cb1f87eeeb5151566e8d22db6389119d33cfae07f1bbaf14a48f0c082e325f2e8d397bcf3a676666e7c2edc85727da4729c1d15b4b820853ef49434372ec50c8d207ff252cefe875f5971a6b102b661d150a782e55019d9761728b752e208bd740fd148e9ed06d872ebfde0489315c46a62ebc6c0a5ff5cd57eadec362a2d8cf87492f557abce463e100e6df8981573e54358c3996209b8758dffea3847eccb6aeeb5c3c5471167e1aeaf6f9a660cd281ed06ff4fa11cc88e04b162e72222c4fac1081a9f991be6c4ca4b1ae02de3b514692b8c144ddf40720c1e1394b38c879c382861bb2285a28975c26a6c1fb4e542794a8e654faf918f79ebba577c5cedf72431ba7d18cdb0da6e90edc2cdb85175fffe80dbe7 +shared_secret: cc0c70663e64be7264620b5682f2506f2084b66faf8e8d3916c8b77fafa924dd + +# Rho leads to matrix containing zeroes +entropy: 86630b4f72820d19e9941784183b3a0d770609becd6fe0dc463cb6edac432d59 +public_key = 2fb1b863185bc7a3bd95b15f041c8e3aab5b08d6c32cac121cf003161c05c64b1d90074090605731b5c6c465675ad846cd99cf3fa08f7aa45448fb2fc802529bd69e95d1a21e98242c66266290bfbbb2ba58fb320d660e297ac416b2b0d1c5968b53a95172450598ba30b96472d14522513caf0332c8eb8f846bba02870ac989594f9141d56813a68aa5cc43666202038c29621eb658911027663aa0155262cd86798079a257621ab73a8489fc531f41c1483582a1c92cbc6b329fd09913b1a6c5fa0b3f7116a9866290d4b321cb639f544b0db81a6177212b798f911b0786849b17259232ea74a9963a85d90aa8636a9f4746f7b8ce423a374039907591a54a503f9298b486e907f2d93d1a2868a1d47608a6aad83c1ce7d216dc0283ad56426d7b5cdfba794ffbc3654235501c960b8c9613eb6126d1929c55c1e7cb8cffb180e0d942e199b4bd51721465ba8de1cabb081f1f55218a86cbf6b7ae038421b5278f2d8086041480ea9898880a84ad25ba631b83e953598bc76ec9b36b92a76359fa1e44209139272fb0c9c5c5f0af6a0cac4d4529d18b8070e76b8b173085c12d84bb2bc4eab464a161f5ea69e0318d3719249d112cabf827ef4a4a7c813d384b62c02c608c0b49dfdbb6f34c4ca8db3dd19142e5c53e3d17010f931d0f9c8657551deeb53516149b459238657295cb5c66dd6466f9c1ab7b711ad985a93a46b94f2aa2030405f0b013e12bbd380a6ed98840c1f484ed5c5ef9401880f646f424c052f20278139fecc3a3dfeb7c3cf99979f8b8c6c77eb4d20d9deabcb0648fd07bce67738800a2415f3722595c4267f7a743f5562b1a26ac168602a84b6864bfdc770ebd792543455055a6055117cdbbb6cbec340b69493c7f0648ece7119b8bcadc3282e5a8b0a21b1898fb20781c298ccb750eab8bc9abb3330276639bafc2d9c00315c690593c67896b83d63356e81cd4624c4f39591cac40ac49425af7a5058a651eb4800094b0a32778ebc025910b0e69450cd0657c296c986fc9559b1c3d0a605754b266f0f28a8d5470155906331693e425896a7644d6f340b0ecb4cd2268b536b54a38431e69852d7c443ef97db319879d1b7147411db40a0d7ce7cd358463d8c5be972ba5add85b4f6a47b6e59b58312dc0500457a1a578c93ca9356354834599c41a2853c53d6739be379b9c669e7ff7460a29a2e5126e90902b22a29446b3275dec3d891852c3d3175d8bb3526466a662a163095b8c3587fac94dfb78cf1f3968ba9888f790cd8d7338b2c0b55c12a91a32381fb2427227aa66935cb0a07575c726ba16c92275370fb849aa548967a1077cd2801b858111761230544184883ce385541acb0033f0a5bfbc6779506f7f0063fd5b3136232302b46fbef8c94cf384fe50a97d24a67608bab6299d1de88189b612a43b897c612e9f44a0451588ce9c319b9107fa3c1188986869fa0fa43c248c91c4ba5ca3bbe31c3fe4a5c3147914234aca96b0a58c52288b174aaa5c9b156bff3ace0604aab391411204714ed067e03b38b6654dff57354a311653c40e70017df6b3bb2813a19bd2b128a5001a38a7698386e7f5ba1eac57e183034133cc83a152bbf0b321dc5a4cab8cad524eec35783e93956cd59e1755773f321ae6427b53c33cc91c920448bd7734b57672c9744164b22c9bd0c6258dcbc5fe22b947f6bce1b156967b65b1910c0c57b3076148a627a74f5a42342cca8d757cbf227adba4cb954a562ecc9557c45b76e83a88f9472ba8a4c6a0b670952f173c85e0d033ed74a48445670830c493c8c89b321b26a1c87db34707e5a21bc7644bfac385690fbbb63db72b2de6f684c68b494a461d62f19d0580bca25a878e5077e8617f69c446da1ca1ca81adbc8a6a4055b0bbd2138be99617c9463c873b7a0a8d13f8c228663730171c19462fdf02a164ccce14e53c8cf3baac96af911b328eea6e89d91bfdac72fbb1846e6b071bf7929d486363bb66cdc24e5fc93965e3ccc6f5ac2692087eeb884ed6206c924c0b1952da48a84d919805a7bbbdfc578dfc08020b0ef5e4a49d013a66ab449ed91c3f8390b2f2a7461123ee3b6cbf965e71b824c808ce142995fbfb6f9b0213b0b83c330281a26cac93f94f32c30bc22a13ea8337497b408a0ba3aabbb1c7c48225cc000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: b9cc6d4403baa088e562753c1a21c66f1e9ec19efde0365ee8e696bcf2d1e68ff6acde8394205be0269f2cb9bdb974660c8041dea23912b0a154dbd31792e2495b4cfdd1c772b12398b279ae755af3c525c700620e8a30d9bd54a062d8f64b029dfeea3d13ef53f820b71c911eada200b3f90d019a6430d382c187228cd85dd229ec0dc125b0643709486535907d69d11ecfa15b9be98674e3e49c25510b889052d0f53dc225def026fd7ea783093f16463ae4b4f0e1ddac026cd9e00db7b168fe0b9e3a87db01185ff52443ee1cd51a89ffdee88f476de7641b31e44446d8db73991a6b491017ccf55bcef6d6d2b6be1f69f789c545fe233e09da0d5137727b4e7b437c57a12dcfd26fdbe8ded090630ad6be805aba4c4230daedc645616cce15662491117feab609c89d61e0d7bdca2660d7f36dac259e4a100efc4130870f0c2bcf64137b43b7695a1a8790b365aa3ced0738c9e1d170860dfd3229145818ce8cc786e60b1d3b159fdb9dd8af4a2c8002b24c30be007233eb5fffce3ece5f8fef18286851f89b0d741cc2bcb4f8099e5d7c31034d7a3634eb7503b93fc9135c2774127ea1d30261037bb18061fa97fd44adb8fe69ba85e520f3930ce991d74ab849d0af667b6984b398e6b392648b0272045889df3f1f47a17361ef2afa15fc15acab23d4541519f0a8de6d9a82dc3daebcb242706dba34408e4fef0fb03ac7be98b331c9969e738e2e4b4ede9ce70f59ebebd3b9afa9224623aed04721688f8332b1a214c2c8f39f76ba631591f9fb162d867cca0c65041ab7d4ad9355210084813d8beec36783a2f0456074e35d43014d44d8254970f8e279b5e2d7762e7a51937f32b50eb140ad9ceb23bd8101e0e9edc34c579249bff46251139eb54ce0e533ea720c4bf3ff7a73793d83d94c4e2fb17745c18df2ef1109ab6561dc91669600d046dd1e9d6ee68b6fa5b16fb2bff887f4aff76e5bfa6f2352da18312080b62f09322211b54e7ac1a382ab2de1b6e2b2bc0bf15ed700415ef319405fc5946bbece863dcb0728ffbbebba11ca578293f0a1886f53460685e778abe01bf1df7d8babe44bd48b0cc6f69e1d4389e77049694221008b73a8da2761ed862d0127d8ba8f6e4f7d3057c3e32059ab1bb762038ffca50fcf2693d78127b2a65c335905e1fd6deaa5bbd14b350b8afe18c00cc0d4a4271401fe78cda6b89c6381e566c69bc5922bb6a43c10968d754703b5602c93e6f21b1b7432170ea5e62eb4e0c0abe6f6a3317b19e19b5763f8bfbf74f4a910e5d271062fa79fa9682baa5fd0b9db3a5f2a069fdd10aade60a618dffe2ffb2a89bab137cfb73e92a774f57606a30080cb1bdcba5dc6536e70b745161017639187a7a495e93fdc48bc24bc565f603484127ccf13f74130b8466973548b1157709c9d6ddf672efbee69a4223f164f8309cee7d9660a323f834bead26a7cf668fc3e033b68c7abf3ed0e4109ec9e263efd07b3b1bb0ab26899067971158d0cd9ff7f91eedea7c4b7e88728a1177087653bd6517d11c490d9dffefa52d4f09284921edc23b5230c109d3697c881121db8b85e1fb7c2b9cd2fb48db52f18a51374b7e4a6220e8a50d82809c6666b5ae854c2848bf5881cf834ee44171d26b0c0296477b4299b38af261f9ca6620b57fcf276ec790e47b778cadf00fede43d03e70d6518cfbd6581fcf84e81aeb3bba3bc7ab26e562b65e1599d4e8ee7a23992c5039d612855c90dba4c90cd3231d01ed150b8226a95cb87867a2358f11890914a2016c78ffbd31e7ddfb1dd97f2e0e01e3010d6633952d7c16c1755594868702215cd917b315a54f35f92f52bad10b3a7e54df657dd7e168eb8119b28507cac71867180e0914d39b8441b3c5c20ac22ffcb0ca2b201e4b350debd73a0c08b37fcd13a3957d96476d31d26153e7b4bfbb826f7ddd5b2a7d29183a579f05fb36d459026963ed9a694fbbd9b3ac3c5e2be41336b48ff5af60d9c6030dc13981585426d3a0a946b5008ff5cb3fbaae3bc491f536dd80e747f5df92270ba40502409d9b24307d775f4ef7c9c06dca69cb5dfb4d0fb890a816a7b50bebd1ae9e55ced79dc36bcfe04ab83fb2f94e10910f0086e0b5bcac717c5bc73f5e03f09ec94c3bfe05d732fcfe0d6baef66064cdb02b49eb5d938d2b9bb077b5426905865b170590f8ae3a50f823c9f56fd3b390fea9 +shared_secret: 5772134d07e1befd82268588f722bcbc7c131d7bac8921fd55d7bf5201074bf3 + +# Rho leads to non invertable matrix +entropy: adf510dc0e997af14f96e4863f316475be59850bc861ca0d1b057d6b94c3b5d6 +public_key = 86d0a6739947e5cb25b2b10d9573429894601c1891ba3c78f2814e1273c8d2098f19172853b3b590487397692ecd3b6e37f58875b60167fc208e6b813e0b26e1b42b7af60a64aabfc156346c78a225738983a03253d679437504740b872128949d971c619031b51090f54abf0ba2cec479a671d43ddb33c430c8056fa37768f8551ffac4682cbc4755267f7736c3c97002356edd676e0f26c2c0f80bbb04c26a09bc337bcdeb68bf25d183dacc4d17cc68cb8b967b31692b2b6a035c69460bb202937d7ca92cd87651bd7804a1d24826c3be2232310db3cb08ba900ebc4f5bc4052dea72e272596f6373b97aab10e8b9ef713550d9cfd3610432b6710130ab394830bdd4129e0232263bcddccb1dcf9a4f023865f24bad1080c207e02af3b56f2eb1356ae45466a61905807a5156958782b02ee86f69dc3ae5e2b23b8a01e6e30471a7c85eb18216d751645a893ea169f661230d1887e77256a4944004b8415a3bb554e436ed2004f30a19c6099a573ba752f2527e59b00ff8943cc65caf4ac07721c702e05d5ab2970ae55ba7f8a1335aafd7542630f933dc7420cd054bbae009645231a1362c74252e649844f413ac83e544578903c310af5660cbf3e4c4e1b4917eb2a0a8bac4be184341629d0c9b3b1cf38b936828abc520a3c13333c0c2c1c35185028bf1f791fc24a1ba12c49b252ce82c16085623984368269b6dce933410f5b6bf61c13388bfdd87c0b547690d3cb2910b05707865f9ac3c1872a7cde62d2ca43fc391af8328bb5c853c1f1cc06c165394874405734746874a84b2261b5032bf586fe9939a0ccc980724759582669f646406097270e2cc1371b0b6d81e575b5170760004f593a0c377c59b1705bba52eac083cc597a2d03510e8a0bee8c5e39546f193cd8e4083a3683602cb1ddae257b1c1bfc409942d2abac0586e63f3721b4bb921e135759b1efff0306105a71275388ad69c75c5056fdb443e3c708a8a107ba0cae4955e2ae7a310d97a6063690e5c8ba84891e0a9c62eb983578ac0c6a56b710a2d63305d931293ed42887284904c3cc4e1418a9c77b8158916bd028f1272518c0917b7f4b457fb09a31b63bcc9278b529cc98c4351436e02e30b639562c14131f4e7903136157269235508a7aba15519f911fe061d9bdb7b63dc91539428bf1c72861305deb39ee8e226cff39e448a9cd7e50589f85430655d0d027405d991cf1c2aefa28d83d5c7ec8994cdf39ed49b5cef917c55f0136a1a9d8cb38715cc0785d5cf5f9c5db452798348c70c52b5fd89a7fab54b75d22c6958af84bacb21621694d492fb90b71c787e9fac0ac9e3c710739d67598b8dd6428bc2ae26218eedcc4d9015363f8acd9ff043d0f7105bc7c75eb9c376da757f1b9aa2378da73a7a6e4571eda670b8287f4a333412a9c94ca39bba9759bca1c2e4649bae51b1cc10913e0cafc8575629ac866a729674772a16660c1aa53a77f002e4136455da31ec28121a7577150cb3fa0ca2c0d8b6985543d7f90eabf2bf4b85a3efeac5d0b28f70e93dd08073a5529b41ba4e2c736fe3e0192794b00fba1d429498560b2eddb788ac274c06f43ba9da341fc52cb2f5755ce3c1af65027c143f106b587a1b6f18201d9c3b0f19e4b005076834d7830911c449aa913dc6a3ef31c208d014b41ca6ef1b12a796be561b006630c14c03504f87c600ddc20c6477b5b02c5bd337f56a9423f516812a594fd4b2e794442bc8057899aae012c320b64eccda7681274adb72101ec41f99d63648763158323c753b0acec97d96cac9dd35924ba1c0555b09a3ea95d513b138a444bee8608c7ac1e64240d15028cae552855c47beb0c9f6f10cb4a3b9f68c3552a301b6a8cfb9487c241964c4e167e2c1b158a6b1a7c303c0e38fa7e0c53b376b5ee5222cb574d72734e7e90b531aa4ec656160f5a23f6b3bb2e3c72a453f73ac96ebdb128dbb8442b5c7ea842fba805799c811afebaa4bda82b559c624322aabf5a3910a152d5b8402f33ca0176fa5600b8d358d6f5956fe6171cb841ccde5bc76a27550878b5e065364139cb891065467c630d8a8ec6a002626c25c8aa00bba4be3c2305f0b1b18e79dd1a8475d2001324c898c0a43075a7c06697c2ec6baa4d78258e60297081869503b7084aa73756b74776af98b000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: a64e4169d49c70374a2c237a33ac42503c6ddc7239c53aed99ed033992435ad443153362ad3c9cbdb576fea6b87ae15bac3f70c457f5e84bd387f358dde9c5a904db99386d2f5cfdb29454c978a89083c9095b2a2ea1fbe220ed78cf34747528e7559c6b6f6eb168e878046afb0526bef2f966fc80a863ed6e138d6ef2272ff9dd49201d746f82db8122247a3921a058fa62a03f259284177d518538972fb8e3d83c4644c8ca3377801c719f55277894e1d2170719782c6b136b7612eace3f903cd5c5a98f001b2c8e351b0a3f24d48df4b3f639b749c3771d38dfb69c586c44477195853255fd8d36cdcb867c8d4033e5d48a9bae96ce2d839311a5620af3dc42d35126f222b9552e1c36ab21c461cbc7ecfc6eecab244cad16ed8b48cc056ae98b4a0b93c1db5b5976a40a4b5bf58ab01c2a32e045f3db5c5ac00d3d04718c796895a2690b126120222a786520de726b43fa40eaed49f7e86dbae56c7c1d782254277f438db81e56236535b36a1c02c54dfb3974d1ac1f6c814e2fb890fb3c1364d1544e87aef84e3ee3e47e6ee32160393f9610c5ab33ab9e1b49aee4bc8c91bdcf79fd831fb651dd80bd0cd9cc439c811b736337b5ac64d61e6eb1abda5dc67e694f2350a92422faeb7774755fb8bafd5c091b634d229ebae35e3bf93c6f1d79f54c7cb6cb249a589a6dad72a4551b32e1463dce1f50e636b60b70648b81ea9febcf79a3fc8ff35ccafedb3bfd48fccef6e6fa5bfcb44a2fda45ce7df150b9639a9615a936ba1c2fe0c6f2f660cc820b414da22a3dbf9e8139ab3a0c5c0946dbba66a02e2c5febc88d46e6f79d0e669e60fc8f6df1d346aa9caf90c16505886b48a0c6fb41883c93b6e8d307b97f1ae01e5e4af5b9be506dc4a8bea249f50141accce764e85e9121a7cd087b26f5d248113ac7b97517d575bb505fe6048df915fb5e0cf304d636d4767042c609ac823d9d2812b9cdf4207bfb3bd477ec047c1987162e250d2bb57791d1b84b4341bf55f0f93afd75abbc90cbb23e47dde24583d1acb6720e1722231f9b103b0a7d454182b6eec57eb1e4a64fe7c92133302c22d941a0b17e86adc350b47650cc7a1a953b78fb1a80aa44735b3623d2da25ed5691065a467ef15a3dda917d80c1d47f2542a0afc383e75b0e955ca530d61df1aac8da5f1ed8297a6b5fcf950f6cff8521a7096ec2391669742087139cb5665cdf525c7c8f157af19779156beb2fd39c34ac614d2b0a91d87b050f64aeaff74bd894d3a68c1a52da47a42ba04d06debc14d9d82e9bd94aeede4a35b6bee9732bae0f76e9d07f742a430441b9d8af5edfc290a6f30050841c5921084d7df1ecbf8b70637090cfa784d5214839977eba9ca94f3432f47bbc4d60c465edfc7a931e7f569da5e6b4dda05913f7fb67263cd939b15d7a8f7c0d15b2c9c50dfee128ab50821b3fb9b724b643a9464b0ca38d51c751d8d4fe5e378339c9f68d51a245fc0ae76ba14d9539a90e3174199f503231d7bbed22f977b37a34596cc8a3207b852d6b09e254d7aea868b29c6506881644f493eb41875d6c51218b7d79f7f1202c0ae747694403da054128aaab773e092c04a2c34f4a73fba19d99df3a81e4e60c1635f0b34b0a5fd7d0e5a5a236033fea303e819da88131223fee2064e5981d596d30ccd7b744e183bbbb58bbc7c84d4ca59cbe1f52e2739fac45fcd0a706a1123584167946169c3494ac911a02deeea2b487f5d57c4429210cf812f90eacadb7d51ac65a6dc49f9e51ac3b4650bda7966eec378df60e5c98723bcf7cd63d65a93569be54d17a54df9502f9b6b9f6deb46acc37da4451883f7ca49d4075d045296012b6f2584c972c087bf948fe7d9f0fb561dfd91c3e64f8190ba77202331e5988aa9d5df9499eee4119fadbe2b5530233d6873bac60c5da33f4f0de0262eea35b2041c3864731c3a3fcd9aadadd6eadfa55249dbb5a8b63d4c6f69ecfaa9dcdd293b7e85a3062b53e7350141ff7f6d622a1f4978ffbe22bad117aeaa425568cea246d0da900568c70a412fcca2fecd427d14d59ed0867b6905adff8cb33bbf33743378d4a2d0ccbf79e721d22d4c1a9921e296640639a5dcecd93a1ef94a06b25af0628a32647127c10c504f77ea6ecd31c2a035e8baf3fbb1434c59d28d25221c6d71cd063e3d6000130ba62163566e2f8ace8e2031a530787c4c9b25856 +shared_secret: bb7c4b5d4fe3d2e310f176eda060f614672dd307e94766a8043b914e9f3e5c25 + +# Rho leads to non invertable matrix +entropy: 3983da6a4615805f6d55c14ba582d59a40e646c7ae77f4835a51afc6c37f11f3 +public_key = 8eb82cca6371fcf0392e359ee7d96badf47a3a46aca01aa9ee8816ed4939a8da1c7a6cc0c78a2c74dcc482aa9b0f27234d1a418b994fcdd4864ec208e423b97c98ad541878794770730c4e1662ac60a1140a6aa9fe425fcf9098cf9592725712fd995a952a73b0f8c4c312a1ba498d3bd9c742cb7f011216bc816e6cb13324c17a060361b01551692a7456a46c76c994ed067d102947f674b918e5c924c86a5e6172b0f1ad8e7336409cbe7b16afbc48aadfc4a77bc22ea467a2cdc9350313af150a9eea3775a78b45d743afbb33bf2ae2bebb19b800eb18e59a74d79197d8e36f74790645e77d2ec46a5df081bff73ecd31c0cbab6275710206fab518230aa749cd4f5099a304017e937a264010620b80f1d0c7244480736ccc623c8a2d7938de85411d7acb1ea00cc8298d85a5443ee058505b5aa3d88ffb3900567a31a9b25a3082035f5c037e571aa832672a74961e51290cfb0b55843229d11213d18feec5a35ff2160480887ff03c16c5a35e367fb6f5561ea266e973928e3b1304d13b3924be68855cebdc8bd0c3511503ab8e50c828b04ef2934c41207c725c8f1d589956e259a9f3120d6392851469b7fa49b8452389eb2de3497586ab043448c14a13310ab5b352a740bd486e31f0655dd472dc3b3208d06a79cb0dceca7c2efc8cee019c023232342810e3448b5d019859da0ee25526b81422f884438547386c3c38dd707e9ae18b27838556d2398b827dcbac8344c7cea904640f9608c82b4b86d27b3f4ca4882c6da694bc78bbaa08c900abb62379eb00f2ba692b167264802d47d74ab3671620194555b8249857996a25bf8b44892914cce1433685ab210f92253e00a355b96d6716af32e6629cb26771f57c4ea7cc80476d3af5a851f191f35ab646961780e35d6ff449e3b258b57375c8a43718f05262c274344c95ad251ae8619cc6714efa12ac9999b085390fb684c03028615063ae5f472962d49dbe7a65e248152bc73476026cab06733fb57182c9c539553b223b31adc966c8e41cb0e9847236c38ca67c13966c915a9b04088c72d15ad221950e65309a2bad8a58693168b5e7d7be403137f4130f8e911aed444c84e469f98228a55a2c2c22c0061861d866aacad343ba3590145424ae886b52c862cd0036eebb6fd1e33cdc957e2370ae8b42c2c7eab508540a72698810533bdd7a1739e88255e86c8752974986bf36d889fc172d9c434ef3d079697204b778117f1acb520c63462c07679347c4604c78f5acc99cc58c245490250c811bcec2d2184cac261263581769044a232dce38c6802c359e154119c4874fd95bcaa5a67eb4c8c3a5104f15962a725e5ac34e0dd363f5aa667a22268afc4c382a7968017331f4cafa6b76999640283ab672985a27dca0d39c4b7ab102fef1863b06b67d9bc01b8040e1156468960f1213b365d2ab2a877468851fb627b1ed7154c6b83e7f62ccd65ac410e8c97adcc6e37c3b5d7893efd6b2a0b995aaa9171391292aba405b051f5125c8978a15fc479a55ac296d7c278ce5a3724535c91209e1e90cb113423d27845c95aa1258afc49a43532ab873f2a6d967796421a8da73cb2acb14c3981bcab14d1c7647735b25de0ba346bb61acdb8be7f513ce561adea73d19c34d41d12499e8a843943bd21610e3749cddb25d0fe0959f8c0559f774d5ba347c30430684b7535302e4daa90535840cfc9263fb126d23cbe85a43404050eae4badd99a0a1c24e1a2b4df41c8a8593a6763b31a4642830e797541b3ffac28bd7b7a496053fb1e0b4002433dfd705251900a636b7cbe3858874bb9585715bbcbb74dc992f4a5636fa62c2a56989529f7de46bf10845e9e9c03d282261715c7b7c97b4786387411cfe36565c2159903959444c68a0726fbc5a13468714b92cc3f953966fc3bdc3cb1f606a5548e4bbabe2755c56a35664394fec77d9f0646ac5736903a537d29bc6e905bfb5650cea3a5ae0145605c0d81191fba11da630b5c6c866cd09681ff16950b495b9aa6843141236b079ec67cca7c554fba14e534bca50590c1bf40ad5403a1c12578337b55a684038d4046f2c8d4be864c2025cf182592871909e824c24815fe1e206e37001022ab475481c56464a1d258997887c49a052b43108f6b7b8b50271eba002c3d881b4025cdd3b000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 2c2a21b05890062fab5c11d3d55b8e032fbb07ff61ba147998ad1a4d200fd8fb17defce7723b268150ba8ce7a4d9a3548538e2606377e91658440e10b048c8c4e42289a17f398a664986dbe522ba68f42b14f40f25be762aea2049c9444dfbddfe416c04ca7139471f185a441a515e0d08fa24991e9f02d37520749499266d2d5980f35356c86dab927c39d9276aa745f4f9d1cb33c386faaf84ab03a67e42fccc7eee3818254b7799bf445a491b1f4bc64de499ac4171def329cc94f0c4b0ffcd6ccf9b140c776993ce1a0241d8113c67d852c24a0e4e070ccdbada47e953cf65146087476d1b0dc53c039427f1ad7b466304a4f4b2757f661bae492960f667ac439e3d8d4595d7da06367e69015df630a7292b0dbfcbe2629808ca08e3ade11185ded915fb0f5c599417d2d2c9fe742db9535ce90e49d2e70cb83b29490de8db042530e16d3d35b488ab1693ab4d9642740394fcf6b34d74ed47a16cd2e6dfa80a94eb1261ee6391687ba0bd60ec124cb1c3785c2143b48b6ae5c2a109169a974599daf0c682e1bd74c7fe7b3b76fbd5347750755195f73af0a5ddc35c7415302f34f331fd976a84426c3f1b0bdbbd0fca925e7b2e9f78e77571c761f896ed51b66bd9d8d4dcdb5a8d28c382f322dca57bbf1bd6a4131f162f4d8c0983a0140a3bca10d947efd93774edb8b4d0cab98e83ca40a327d68c8cf5fe4b48583d04612bf65e61f00a4a56a63fadeb321a033ad5f7b65540d74ffd144495ccfdfcd4afa7739811590e4d7357a9f80732cd0ca6355c31eba16fc0671de573de5c73d43999477bf383e35387db6b9e236850cc5a286d5a93e9906b6c53bbb822a43a59a3b47676d30d4c8c4665d73fb275ca0dd493afb80aae9e503518ad8c7cd5486ac10ee2ed63913fa20c4e3ad6231b39ce07256f0e8ab72a8281db22ff9f8c2c655209ccddaccc1752f63b1967b218a872a36f84f5fa46064173f44f4a0133771abf6183923eb11b7676ef55726f62689b4695fa39130718c21145dbb8979566dcde5197bc3ed8381e4bdbbb881998a60a772811c50babd1f7811def20ce5fe1937a28ca433116d6c85d5e8046c7b7640ce5b7ce5e3c11e13c2afcf6c20a633abf9e4b3d6323b71acae281ba73d00d9da20292fd6e6042dcfe154f22b308e78ac3decac8afec89ff500534e6e789459b42358221b37e180d3e0aad911d35d381732682c2b5a50f29d41e7b21f7958ace59f56fc1ae6de40bc26a78ab022b5998c324340e95aa424677d2cfec90ec8785339d20859687272bdb581b29ed49a5463be54770a17ab25214806e9acdcd650d9007f4075659271c3b288c9a6a8a7e8291103d2b750c7c088637a733fbddc39cf0f0a9dd6d9dfa6102d12c5dedefd12ca43e43e807635993be1495c18be1c90f3a620074b86655c40b904c1bd97526d7b70364a2af22ae002844c6741ea35263f08d6be51a6f1c039b52dc08c89b45db2c4091c55b3ea13f28494dc0c131aefda9d3b111cbd1df48eb51f68db738d31e73b03799a57bbbff09a0018ee684b6502422edbb80022498ef6e26065bf5ac7e4992766fef1548bbe43ee1cf9335fdd154a6731cddb9d50165d28a62774f23a8f4cfb381a71e488cebb6eb4f23d97a6f6e3dadfd0ab3e146d0873738f1e3f9ac9f6ac38ad1566dd5d33e263cae86e9162bfaf0de296cbd8508ce6e1d553ec6d8915e69ecd0d460a9d839f66aca1481bb17938c25e6c1839ccfa09e5660452b4de60ba32d3492d2e321236fa62e00f56f9284c1cd2c994e503a69aafadf18e631f5d36890cacf5950364dc8d4f564352df1da0ef6d7749108c27d63f4de76e0805db07b70f35adc2be0cca552bf5211cff3cce4ed17fdbff7351577c14344fc4aea63a3e659d615f80388b2c7d1b75ee007138f76a42a82f8bd948a06cb6d8c2f9d0999063e5dee458e0d18b861c4e298c8a61bdc11d54a3c2a3b50da518bcc39db9252f4298c878d2882248cef7b7b600c455efc13bb3f0f0d16380c86272db86f988465611f208f7d1b3e2987bf60a432428a0fb810d29c1c7ab3ffab55819cd168454603c7292efc59fd7164ba2c53f9bfced9c3da9a4dc9a9f48def429489a5742147c79a3b7f2be6d20a2db79dc808e0f56a721c31b1df888bd19acd89b273f169984109b381a1e449778d768aca994bf8e9740b0dbfc1654e2a7c14e95fe5 +shared_secret: fe71e2b85d231f4abf082d4f7ca86f042ba259b24a14a934d79cace53cc10b89 + +# Rho leads to non invertable matrix +entropy: 2676b8426b9d6a30af007094bb76d65d388c2b3da938215dd6f6987206400e13 +public_key = 480813ee095bdea49d18f360a690b145d96b0ac56ad8007ffecb7cd198a9f6178add5535e863471cd5198c565b62d912fd3a9040828ac9834ea753c0d77b5f23637e5891a92fe7508b672deaf212c2711137915249b50ed9bbc2f7e804536b382d3a29b6132337e68d363903aa84b08a989f2482c56418b59dd351c54b0b89ba5266d354b91b2fdbf26812b19c79a12224b723bf0b0e6967bb1413cd439789058091ef95c62852075e464f717ab84db9b28b23934f625f08d0a05541a5866343a04216dfe83ea37abac6e273ebf649f7e391df2829ad2aa45e634dfee00fb465bc2b7658b36556e7c813d2e4a92eac6c2b84c8b3ac8d13bc4dec0615199b63860ba29172bd8ee51080071553489e850b1d8026a898c0941ac62fcea1cc83bc02fcaa3b5e76938ff96c3c682fef30c320d3a325d633f16888613550c120b9631235281c6f531b19f8ac1958eb531d11a857843c02e37347c13d8a216c1456a9405111d7e00d0ec2bba81b0a4062908883a3f7e088ffa10118352646964be2ca3ba2f6a4843b836d538c042c693ba928fa1651521894a7f83311476faf50add5952aecf663686a07ac302d5ca15e16baab85230e077acc0ef4b36de2613a1c210fa7c7c37188f1685f067403d4babd15925c470b8559e8abd4db4cf965b845f22156515ce54643f9ec9645c53c5c830344f6c7c537c87f2b6c70938c58139fa6e2237b03aff94b48abb8441d8b0d4c108bd6f4114f98c22c412b0d559a25c0845a68bf6266b7b9e17d80dc6c3631ab0620c0582b0705cc686bd267e8309ad1e33ab0bba9fcb21b13e7c455887d07a83d34d836cec3907026911d799653ac0298fc1bcba7c941823fcc88bdb39541cf989bcf08a0468451bef079a627cd31855667e97e3eeca47e2839ae32bf112b71af0003a42523390bbddb71cb1531264113b990ca286f689a3c660496f68c5d68247677262eb36b7b26ce6807459d7c7dc5e4782964122bd96d1b5b8ed9105ad2e72050d874ca1b09b7bbaec0107c1abc025a557206446745ec8d462a83e6a53c5ec6c0b8133054745762b5b4bd142a1e2c2471a81ee35cbad7d6200924cc367c3a3c55032631418cb6a3124200209a782e2a0036ab9723f511fae105049579bf1051b9b41d388609cbb81dd1191b857699d04486e018779a4011471a241fa9401f9009c90a14ac6a5b691bca69c3c5df7b45a7e77267f1082f0418a8d14bcdc29bbf48758af83cc9331e3fb34a49a2570f75562d0bb7213c230a549498751b2cf0bee4561546907f2aa436f6060bd74c3b06a7812fcbc63523a451b90b4c7386cb5614a97a146637c38cfb77ee1316d0ab981b4874a9d263185908fbfb1aaf9b9939fa2d3d552bfd577de94264740ba291ca4c0f732263617dd8d7bdfbe80797c68932664e414c8ced3a48f5287dddb04655b76cac5ab725763264cbc95dbc2ad7976eb5508482389e6bebb358097c79f2b3f5f6a0249881fa6b932e6906816038f239992fa23e3f1814003c48cbe3542825ac45a00d1c104d76424fac824478471c0349cc7fe5ceeb21c5bcd1c262154fda607fa811aec08856b444544366a62a57860e71b742b61de0f129009924af08a92799213b933739a3a81e7a65002596da271bb19675c02302a0a2cb2d928318c365cef3b828a362166b9a6eda5bb7e610a5e22afdd390c6c5a0e6f955d1740e8fb41347a62abe59752ee6ab13f78b4a3c3fc0f70de4a46d276333d5b51f139cce889ab9e18643f9a18be7349a319913ec923233311d1473b37f39185d872a9547b1702cb096526a8596127411bd1e611d51816198b95bff68bac6538149163330814d4d34a84cf2c174c96b21787348c037ca48aed72b22ebb24afa3924dbe43a36f50f55f3bc5ef41125d400eaac4376daacd71398dee37e84fc007f93b245ab0842015cd26671ab840f74831954d9886e2513c8d752ba15943945109b601f051146824181f258417cb393e8761fed36c5fe36590a589ad52675a9b2c05a1565cf54453c7781d01709ac331e5fc454bf222d4f70517f80afe7d90038987df37990a0a42095a517979a0fbd994fac3a42568687b20c8d4857321edb8c320682638c55c4a352d2e843b52278f78953a617b08b271b4fec05109278ffa5b74856188cdb6e30e8000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: ad2de30126428ed97dc602f7d15fa00dbee9bdeace6b9fd7579ecd9c015fae9d9d752b0a56fdbc997528f554879ae42c40259eb4f0d289ad7898ce21b45d0f84981eba7a48df5be7b6c3b07675d5f4c241c04281781e80a9baaf183570f47eda8e535a39f8e8dc562b28c1cf2b24118d87f5c528ba93cd5f4757e23a2a9ded44295ee1e706444e62a94e04df3fe4d2e6e77f77ec87de4527f20f93c62939e08b0bea1a8862f01f7a884de4f77f7f32b6ea6fab67635699f2b19eac1d1c4902432e1f2851bb35fb1e3a1ab79bf2d2589d34eaa4294c4305090b12e3625ee42c8f2e6a6a0ff86eb4439b4fb3371ef04b61f5b7d75217ddd16dea7977ee763f07da3cc3eff2ecea8d4734b8cf67e4f95874fa14ae397854810ab1b593f7eaec2e87650b11079d5eba756ba7282f1bc735e9dda89ab226148552a0a6bf67436149a2d79e1212da11ef87da910ba69e1499314f3cf90fbb4c04730cea5fb1e5d35eb1f522e09590522d6294f212c223249f8f7ff82f3707875e66621235c464a7564df4e0a825311cd915e6ebb0834f6f8a709636ca137a32d405550d97f9dc1e8b970394003fddccaaa1e98185d3dd354f3f390a5e6ef9d293e45ceed7be1583c983eaa6f9489a994ace30441b252c375cd448ff4c7059f6db14d1c65d14c4a6b1696381144bfed51a55827db14584f54eac1073031d7b282fc5a48eca5b164429d9bbf46803cb079924c971aacb0bacf3e58637b813b15794029740f06fef8d80ab7013041f3b11e04df8c6737bbe842c8271d584e5c84fa01870c9ff001864176c967d8aa39d6f3585ab0b0959e37ac8e9cb06e3bea1083c2053cae238c6cf55e9b6052592ac075900eca92404af4a174a2cdb94e202c31807cb5bee36fa4e6e6f67ad4eb5d60a2edaa101408a8e16df3f3ca8cd6e2239b079d70b5dba53a42cc594d595160a3ffae9f16121383ba5b778397518095a4a92d26eadce6840acad84610db923b5583024a5fa682a3e224c5b081a75d9903a870642151329befb6c7f83d5ff8c0001303e7349fdedc44067f894023dbf61557394bae481cd25bb48ae7785db5457a90fb1644f16b9aec60baf5095d4182b10eb12f680b37b779619f59108b055c7e7d0e33f2ef4a8911ac876dead82cba65def0c3015274d14891d1f726f3397f0ddec9929189f7d5498b41799f6a4cb8289744a9ef7d9c620b28ef6cbe88188111a5ca0c5a320c47bf7c12fc1cec6a3dad012f073966ab62ef5fd71a7dd05d774c322c8163b18a6461fb321d77fb26ea2afcc9a7b30bacf3d6bdea1daf3312192632b9a5a5f3938d42f3e7b5b48b4b58d915fd8bc63eb5135e5a617a333a21839e47d7f61e6d206ad88332c1fb55b71369e63d76e9bbf8e7cccee4307db753533b61b7fa2edd1a2fd434ae1ef841c87f6250dfe40d8c045e47f9b93abedea1c4ffafbd0d61499652e3b636e0b6dc559bd3db9b764e4d46c35f2434f23ff3628e9b4c30a65d485d29a57f5a400aac8df42593b33833fd138408e63fcd8f4f1fbd189c05d651065473a88c9e259029f752848d07f80954af01e8cb70ba019e902260a612c24bd8af1e484b280449f335bce1a32878a0af01641bab8901ce362ddf2dc31a2ce8aad03e8931a427b07fa2688114feee300302d193b05db582ea6c1c68c7c4e405e72607dd4df28c905ee38f5dbb6b0eee1864712a1489c974764bf7e79d5520d2695025a04173049057b54c23a3d2b9e4367f6ffc7be4bb3642b7fcbc639614c3e479bf755c343bbb925c7e7336d567eb051479521319be75831191c8321a5a887611fd8353463f245f91c396fb0b5e495dde71b124c875dcae8fb4d597bb84f9045c17949692963aef558be7260973589ca0760fa7980c85498946f90c719adeda096e111ac8b3a215084af549f4d61f8253f4acae2894c7e880111c1bf01124bfcf829ecf809b67b08bfc3fd9c8afc04c330fd67df9a07f2b92f19b56bdd5c621b62ff1b55d7dd0ba5235e72d5e88014c16016178975c14d4b105909e547dfa6486043025e55bcea08dce175cc10bca8c56abbfa688984504f5176a12d975a99d49c30ddc265f1f251bde72ae16b36d9ec61640c4728415521872967a6521acd50faef7d198e78e33e0585a14280ecb2a9f8a75744491d90616ee35b34f50ddf9800dd80bb39fa9e7b523bb03760550ede1a90aaa775 +shared_secret: 365bb81ed68c6ebaaa58a3633b096874485c19fccd8661cb2ba8c2634efd0fca + +# Rho leads to non invertable matrix +entropy: 319c51bcb76124b92f39820a5653c0ecfba79ec91d632b0488f4020e5df4e37a +public_key = 0231538782738a75b631f992d3d74842714f03c31164843609092942715aa4227254a57fa5325e39e2763ca679ce680c528b162d18a3b60c6485e4aff926895b4982a64c40b28484a32979d849b380ba867d355ad55a148f811625bc1427c917379239203cb59230460c880754234453779eb7032ffb3b98071546e3300a63f39cf4ec0dba9018c4470c63e920ee79c000f57fdbf504bdf709b70c82ccf3c7f351b2b35a9b94582f61455b8f24bd43f1148b91a123076562e53b23fac78dc4ac6d257b3e882842382b30437e5c208fc7dc15a0eb4948e902a8f13192d401887c4f01a4924248af31db0892ba9dddd6704b6c696870bb87257a0e357d0c908995b0789079c414a0424855c47dd73becca7b13b029afeab7a7860220e4cefb361edc19c961fc2b24d4311803727e5c0669aa5228e907f6394768e7a3af5068b1b7a0bba9a2aa195ae052233e92ba6382548dc201a5d1c9bcc70f1f50694f56277703138787b34f63b407125d402369eae548d12353220b50e36583d9b0b6b33b8f38a8b7c0f20a4c7561d6c80ddca37d2e709263a54b4abb4577800705f068f21b8a4b44cbf4e3c4dabb1e78865c1fea7064f6534b1c1e7d088dfb37c4b5d362f6d19d90db7b9804cc0b5b02a3f091cd073722c82d0113bb64ab2762411cfd91353a8838ff39c2b1da1fc41353d4f02a66dc28930b9aa96088489c6a83822664679457f9868a0ab58f34bc16cc6fc8672e1f35a21891246bb201dff207148b08f02c7bb707a150084b93c44c021ca3d56735744070d0b26d3958c87218accaa424ba20c3522a6e17b5b99a26650c410d6042cefe6493c660c954484a6fab528d034da0d5a92200ab2c36262f074ba54432dd7054d348ce54fbca9e88043d3b63f8193ce57b770f05079c3946f9c33c2c9285422756b3653b4a876618773de5c7b0f2b019dd7c23f39759cec53e95aa0b87609f0ac794632849e5bc76c1619be9688067d93cb87b1f51337f45bc9ae8386d7c98b88cb0b96c583b010656e7f017e972c812635115335af17c2c3518346407c94e25c628002652e2cb88fb0779427fad957d394999c0c369447b06c095381bc909d93a5e0e0c087d71965e296a489ca5a542a41a99529592167e2bc1dda7bda1c5026ea15cdb4bae4b7500f0b1aaac059f0ff8381897c4f3a144728a2ff12453feda091503bf603b16e406288dd89be4884e4f86baf722269475c874b1133de17ce1d51b694c7df5b9a87f19c2648170de3552c7990f68ca7e16a913b6697b5f848c6c2a92a9967d7bd180b74839e233389bd334c80c7772071d84460c509c092462cc1e4072f8a3297558784b68c7359c0adfac975ee4798d26c719e25c16e47850d11569866e3d610c0de0c68e2886e2675f7f59791f4568eb60583a28ac8ff2430bab6e5fc07f1637a59be1cb9b33c93b3ca98674492203a9e9514ef5da006854037b4b4c2a1ac6ea6587d208b505d206f04c7a8df119774657eb549992002bfa75b480fb576d3a0484d695f6fc56dde369154c5509f346c501c12a699354c14478ba95601239a2c48217219013fc51eaba658d4a5662e469b6547f74eb29c10c296d1172d1b0c75df4b2459cae31b33d7e9164025478c75586e25730550216c549ad05c3660459a2653397d60c27b342a5b51836fb1a33bb8bc9cd622af6632245e49c5b129307942eff7c3157b2180112843a61376dec7f6294029a441683a996fa538bcd07a35585558ee09123b7c3f6291ff04cbfb5d9a85607cb086bcd36f3c0a8854bd0f58cfcd5a1f4c51bcb41bf0138c8c7e29d7c43a1b4538f318532b8f30351967efc26a7a683967d770f3c21ad3dc85b7da94c64ec6e66d83f01490ad6ac3567c81b55941ed45a6ed4b2c87f473f900891b5c69d5092087559407cfb5e9c2aa18b491d6ec7424aec12675aa6230303521bab27303244ca2716e83b212783cab442c909c8760ac2d341a24df63315ea42726912fcbc0187d520d70022eb6872c8b1158a804ac86893ac7741e2118bf721c5225853a8e056c0d963dc0b2500147b0f632fbd27594656866167c5bb28994833ac2031bf4998597f6c1da7a0a3d70c3d3b01cfe6a87ab57419491140ae9c4eec0b4bd91a1946233f3cf88a1ae27acc03cb551294ae5ab7606431923b000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 5afa8807bc581062978485432085e6af37c06780538bd96f798f641949ba3793cb496b51fc455413e47586d44e379daa9058a4bbd2e329e7083db3c99074287a3958682fe1c94c88d175296b78e880eeb27bdd5b550bad0577e9b24ea5f3148ad58ab81a1bd1b63a24c0ebd31f2198cbbb819eae7d30eb8ab49b08451b4eb4c16d1dbdbbc1da5933c284c2b1cf37d9d92af41ff4ebc78f4418c6b9077a4888a3b516fafdad71a517df1b8818c29accb9536f9b0998c3a973b91c87a57a04d48d5f8332a67720f92c8692e8b2eec3fd62dec973b815a18a33e721617110e636301b737ac3268252920c578e18c50b8517c34b38117fbcd282392c14a61dfd30b5e15e10f05fff96f15359a73b8c29ffc44233ae49856da73426bc84305f83e540ecce3eb1c386572fdf2bbc18163c2dff137c05754a43e50d5103c0d7b4cde47457d64dd2cf1b1edf208e225fccd89a47831a7aeb0d1ea313d2dcffcb730532fe151a2ff28c1dcd8212a10dfaa0a6668e3c66c67e20290b285411f9c9ca55c36369b11548048687282e6bd9abe13f4b621a2545d50f530544602626d524306a97be439004d670414bf69f07cde6d82576533fd01fc9e8d8d40eba682f88f228151d5a87097a8ae33ab845d523f709eab85835278d8c9ff1ba2fa639f61726267b033bdc355c5e4b844fce265936e7cc009a99caaa3c76c4d73ce84264b15d1eb3359ff7e8ea4752bf3cd2c9365ec3f5b8fade92e7c1768814b0566bf3a2633b0f8ddbae1da24af6b42bc80a28e9bc1b601ae1addb0d1ed1666fcc9bb3e9fa8ca2dcfa7bd53c96ff0732a00bb1fbafd01b239796d658437c5a42297c2ef395edcf90a521a2ac2a852d329c95e9c9dac1be1948777f794c8e5c5728d4ec2c95036bd7b8aa5a272add19f5c10fc8171fb027956cd3c9e1039795bf6514310d4c2dec7e363320e481a33179ba5930fb20fb351ba3f4c6b72985f12a43d133530a8122e4bf9774e62e064eacf8266803769fb991cce898cf03457241d2bd7f7d104ea07615d8be80f3c2e86b015be16a7e0d0015f69ce1841ebe279233d661209495a728dbc6949650168148227ac08f88a57f3b3b45b7f99552467076ddcddea388994b2d9e4ad91a384ef053b2f7b5f0815d23c3a5c1de5751173353f88b9b4d8f2cd6335f736a646e370ca66fb911525299a5ee382dd49c2b34b654ae7f5b4ac07ba6af9f3b903407eba86dcbda9113fcd00ec8edc4873ddfc54adede668df06968ce5f63335f3834d6172d40d0a7086c9d3e68dac3efd25bd08d4a72b0e19455696c45f1a8f5ae0356cc86e0712aaf8c32393161ba47e519c8fadc19db8f4db41651c1fa90b800172b41fcb88f8bf6843c0503a1451177303f5269e804a73b5ec0b45e46522fe1f939c2f1b4b0fb6568206524990809edfd450e9412e76498109b7b349379aebd5cd6cc9a3c57c7eab0f57ad011f2599ee74f75ba208a1cdfe7a52a67b9a1af206013d28d01f8b4a5680735c8c6adbc3af20063441d5c4a6a6395da2e97151e92da944494c639638d6c2f1d5849ade57c75138a462d3a97adaa4599db5cea3f03a89e4f6c02a874f09768c5c38cce9e8dbc7c4ec5fd6de36f7a06267199ade0e03a2b9c8fe1bb38e4aaea819d9bc2d9a2023372d264231bee7da2f6b853f3441348e9875aa784162c9def07ac747135f445b7645e713e3467856f35fb4179b01ebf0baaf840f4b56681a537afeaf1c9a6f86fe6a9ba6a3f4300d222b9811d4d61f03a8edd7d2a4c1554587bf1e82f97a25dd5b3fa145ca4d92660023734ba7242470b7d784284002e3e4ff3b1fa12a50c159cafc3446747f57c860c7d1755273f9ba906f8568a650a9dd4cc2a31502be833fbaea86bfd4c13a2bc8b713d68c6cd0d6b0ae7ef14dd58fc68c558cdd337318365289c7e5da57bb63422e431d86b5e7e47b71a3d2340c619f0598f5af80e97a0be519d38b03c826ba8f87fcc4b13f8827baa22c46598861351595f8274688919c972b884882026ab739692f9758d12e5597b8e3f5da9cb5a7d903bd8030dc468b2c4b66416dc56ff18c20c78f018d7102bdbbdc9189cba86f9eb1f57b6211f9569cd34737478f6946a2fc2f34da0573db8968690d9ed0dbb2cb6bffaab6d8b28eecd6220c067e1ae1c5e4c8eb2ba179dd4c56860f6f38f5ed3f0fcbf7e7e67f5c92bb9db439b4dffbc +shared_secret: ad8e3f1d0b1d2640a6f879f697c81f353f8e5fe17d0d09bd5d21c068b0720147 + +# Rho leads to non invertable matrix +entropy: 00ff48b3769ffaf4e91c1c9110eb8ce9e2cb99f060b486b37035407d2f4ca517 +public_key = 0bb7ab955a1d1ea4113173c05093259a84c8f055148d301f1c72c9eb2ac6e03b8ec47b955fa429b138ab9762705ef19cc3d4019947c53eb361b8a6798ef219ecd086464641a642660bc0086bf97691e81d178007731511bc632097e08453fa02e8a2cbe9e858a20835b8090f56119bbc000c69f0ce0fe49c4e80b41e040f3f3c84388c6eb5ccac37b19420139e19f88b0b99214d06ce660b844b0604b49222e46136539c7084260ad0786a9b790d76c5132068ad6d1763c0207392760de1631783d21c2459c8189c3099245de001aef30a5bea95609759141e8458c3e660aeea2a3f721d15302e46e1a92d213d1ed16168f71e9b21b5fbd62355fc8e696c71eab7cbeee9258dfa4c1b876583f56c6bf37f770aa7c3e317f50ab01a7bc9f7a31d8babb0c9d2083821343d6990e50a06a33985af449c29340b89a59192b37a2a7aa3fad830725aae61c52b5932a2d9eccc98612997a2b76cb70094e62f4c97279c2044eb5b624097c4f2d6a6232b526b582c9897a9ac734096d88639fc4adf548bc9f8905a4a4d13aca80e952aca037cf71151042429a6f30e3f67802055b217900f748844ddfc987623b27e21c869c16396a57da38938625b9298d66d1da767810860df4768f9c26cffd4b0fe4693cbeb321ea69243fc0e0da0948e5c9ad676c058826b9c263c4587b104350e29fbbc9dd91e876b40396a67fe874177dc5013a18c9c1195cf92436c03b0e06b86c7773b0ec37aadaa7bab6214bd296ee820b86d4026a5b13bb0d79df7497d1d27194f3450bf38b9ae7a18aae876de5b74fac93afd26750b9817df000b89c113ae700102fcaecbb2a0f52035c6753be93ccb6e51c6627ac06a121d55845199a69e9b8b14f4f878d7fa9d3bd901fef7b250ac713ea823eef11cfa041bee03abee508f45a828dee681c077c8bf89433ac4c58035a755b27b495678fb051282299f8658bcc5567429798407192e8ee59693853a37f54893974c4fe64bdffcb6d2c660f88c8f489c4ffe716e27d3a157a539a8a6c1c5045fa93b7ba5f0b426d628ab6a1efd92662f802d9287570dd962f44c4a8ff37825444031ac27e26669fa15a90733ac0352819722724419642875cb1a143b5b2a2dc8e31cb4aa171798181feb539ca8407e06120ebbb2aa5a3bcc4600ef64577ed0bf315a05bf4513e3739282732c94997ebf91ab6293b909d935de20a8939071168c10f1a2792b4911bb212914e5781e3ab5b0d1c7c1363bda387118a2b130e07bcf4768c0fbc43cda2d58f44fcce9910deac4b2d11cf89285b1a604b2d6b6832ab2449c35fab65b9f1b6a22872858dc8fa6923450975f55bc7099e355416768af41c657352eee743d51da6133231cdc5c2db54b59ba6b092b63362ee2bf3ffa10f1897b75e329040c31bb3b76440ccc0b6098930072a1a95c70d0b5bec7786c3ac69dca40ffc687efb75325a5b0f9b67b642007ced66b31745828aa89526006be500edc94c69d9351e9139d3d826a3da4177757b100460f0cf223c23680bc233de3ea7950d0b21a3949e3e278a3c058f9eb7751a2ca35e35f88f121646774960574dec686452732d2ab00c863ccda19698456a08de7b4e129a9f2fca3615001720406d3dc90e94665d501246e446cc6225ffe44c8dedc908d7b28fa1437c95323630cba8944c0cbdbc7f1729919795c5b52aa1974647c43297efb030a99a6b0d5a0a9d3679c20c28067786f580506318bfcdaa3417366cc9c93e34488dde73652a6b9ac562747da8109481260502fab5c1bc4636c9d6b555f96462e940cf0b58202d049aac1a3c87b5d950b6701846e948550bb8199831c461e7436a3713c77c0662ed009df341d5de0b697770f12082f04449fb2868a69c68ad14c941130967f0b06b2bc91c0b840c43c20e837147775853d3baf7094c51ec86051b1ac73753f032374e76cc5eed8a0be466c9fcc1ee9a80c04b566decc5a448753c2535fc9c0b3083716d5b049f89c9f191a807b933c2ab912b7127b4ba04c85386372f6bc5db69b972821d54867f440c4697220a12cb5769cb7495a37acf99fb0451f6ac7807087ae83a0b564924e84428cc94538fb0357a7e222f8606ef0404cd7e29d2a4ccdbb22a45f9a7a51499f9764a063788c070a93bc0766923297fe438c6fea2971b887fb4c000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 20327e06aef57e606fc94d91141d35db28ab5fb1a7a1c0ea51eb1230a4d8b7b0439722c9b08528ac3c63e93c1f1932e2602e96bb51d8d34930df8198269997430826c455c1feaee04e96bc91c5d19d5ae236a2e90cc23cbb802d4075aa7ceba81689bdf1907ca524a7582f7f6945812fb8f0e07b0a6b5bf1a7e879f4cb725d8c2a11df68aab2447374c9721a13225e23ab561301d3e1627f9973a0e37f76a3b4c3f824fc26f249f8b4cbc9d9f5ad11b93a29167d6f6df17b47c1144c0ee807d296c49e36e78805decd1143ad46b29c310b9228c8d66639de571542806115d8e55143139f976095b88903831a5b40f12772a7aed5cce13ff46c97606abe1ae98f5d43ea40d48d8ae94e89851c4b39d4d426b8a1d5622d1bf03d56739a9f81eb4c62fe026dc51edb57874572d04eb5d3b43e4e17e8d1554444a98145e3bbf65c900a7f378e5d9cc71169e5fbd59259f7a57b1b4c608e863bb6dc0cbe45c402acd789cedfdd3200e2c4e9ca77054e391b457f011486bc58708c44166bac944ab915ffe993591341a5d07bc0b66ca063c5294c3de876d4a57b8a9651e9a5159b1e12b9005bc44e757cb141cc665a2a03158308e7203bcb43a5b913add9e7c1f2a33319bd25e8101e9bf21a4a58de0653b106f22249a05f43c61780f9574ec4180a0d05947b0107bfe5bf368e3b3f9c7a7e9bca0d848d7b76ca57bf0876be4a0a97995d00f7cb65ccdb708e992efac5f1ffb990e107c854c5f15b8540db4573cc52aedf1bf5e4350c4418be50c9664c4bcf113e8d78bfa116a287e5f174770e7f9cda3ee4f9cc4f3e2aaedf97f576e0e71282479ec1fd4801e222893ef7d34919872ab79315547bc687da4ab3fa5e8d330a4ebb79be2a2866788f0e24fd946b689998c5226c0c241d24e3c6dde149fac94311031377dadf8fb263b9d8e055824fff8fff07820fafae7aa9477e42fbf42ea1332eeb572c0070b48ddae20822b45d491c819756afb5fd6f9564d3f71c043229cd9588d0292aecaec74d537339ee37cb9d2d365ea41bac6a811c41b9946dc1963bb6302c6ec01627dde1c2024d5dc9f9978cb963dda825a3bbbdd75dbaf04ff70f8b905abb70bf4bb4db15467de1f37e7a22109395f7b9cc60861888c41c8efdff5942ac6758e8466029cb6378eb4b79ae5c47b8c13dd9176d64010c98ac111e9b9ea8391a1695a7597ad38c016d3d28d44a22847c551159ef9a473bdb98179efb294e85d7819e0a100fd2ef92a0ccaafa07e5320527dc798886a4e49911afeff40e45768f18fbcd79f6204f17bc19cfd6b86f0405e0dd55ce4ff9e092825f0d83cf3a7767c49106dc3b996d011535c316ec78433810173b1cc8e280a7e23d2bf2bb615f3ea576bc8ab9c7ff5cc7d79cd093cc031a58fc7d8b98e7dd127d67696ada28f14082a779398ea6c722331783e77b26a2a496d484ba8986c497d5a038542e192a82d1a1c5f02ed3afa81ebd6348c06a897567163377bfc9bcb41fc3b0a037565871ca9693b1023fb0aabf770571be26e847f9ef822681ecb407c467309b118c24243ce1b64b060d48ee545c094d66d032c9249f877a1b034e9072e5aa63d05a9ae2e7ae037b70b68e0851ad8d99f3a6b6edca98f24a4070f89c92b786db50802cc8bb5d7362e8a17de3a4137b01269d53368836ba7b7e9651f3073f32140a5c86d88ea06d8fb488e20d721a198d43fb530d83f9f67977997bd24af8bbd6469f377e8fe6d4021204869813e11407a310ae89381f05b30257c608d3b6c395428fbef8c5d28a4169c07885c3858de23196e2e3e67819e50fb0bf45734d1ee5e61520cbead2f716f58fb7695b00cc7de362a149eb34ce562b93806c78efb67a62c7abfc5f2a7722f48c496ef6d641a710fb5dbdc0db58398dd401828a6e5ea1387386e9d67fec705df55ab466e3498b1e7ae78fce4626e440117dc16a5d3b849a60a3b6e0030b483ee04c7513c0effee19e63ea7f148cb8f4de75c0ff450bccc5cb85a3187881f3b396e4cedc685894d5ce799320f01b7aff4788af6e90ce97165f3cf7e9eef7f8f86283a99de3864843c6177a8cdf90c50c77d1f81e11cb42da9fbd3b495e7528453844f315b18a3a0be78f3fe0801b1a8f89dfd5d7eae27a8eb608831eefe5cfd0ad9631dd8be45add9da2f73cdb57f062fe46be28462d09c5ee38feafef94269344d765203047b8 +shared_secret: 957ed68960e9527bb32460505e0a8b69ac6dc0225501d87f46fa810d98f2e31c + +# Rho leads to non invertable matrix +entropy: 4960ccb1276f96d7aa55885b6ae6f90343d42e1391e8241b5952931a979837e1 +public_key = 9eca02981ac7be932e01087b615a60afe87ff8d93d807589e1d351a5033aea9b032ae80fdada8fc4ea6a72b82929339f23870e620b836634a0594906f5acabf563c97abc1da988aa4344bdedc707e4636d65ba034a7c2a29090e30f677439247f753ca9ff93303a52a9ffb605c7b8fc142b576f14226c2c20828a258bba28bc0b680e60f43c08417946b77d29ed1ea968aa3a268e54b71531e680c09f5b08c01500956a86edcc05633dcb13e173e28e8c983fa75207b537dc37c9356b8ebac5d401a28a6d937f9ac49c3fb267d9a0ad9386f9ad4397442b05f191314356b431892f590290e488f12bac3faf94ec0389ca3d88924671262845bc022ab0856242cdb5fcaec474565caea58395a34c709aa270955104493832d2805a8e05d62437df6993a0f6cbd35040580871aba994eac37955f73ac8b057060426eb068114dfcbf20441405a2322156a5fd491f24402f8b73ab88f2498b04148cc2835901604674867947c3fa24a2d821963ec5180cbc00bba371fa3879be800bf309c0ce9b6ae90c99bd4b9eed787a539c90b31cc4ac3bcd1d2bad5fea1abfd7383a7497483b089297722d27ca0b325bb09272e4ea1182da4a75cb0daf7a6647b15ff0e1cf4a55a061921e55d6c8b5131d88da828dc800eaf4216c283af147939f1cad02351ac8ba79515167d1d2b582292776c300230a9cdfda2ecda65c1456884a5aaf3ed23c8242a3577913cfda45e3bc2adec6aa281051d0d94ed0320397b7ac724b8679aa29a85b838ef9a3c53021b0946c9933a5c5669b65b789e349055404b134671ccd105b453066fcc9949927798670bb011bc76834c37f3b98d2f992fa493fc3850fc64a92c6c17be8ec3ec5c46c4cb415de2c1a7f42700e415825c4376998522bc05f7a61c77f47651dc8a4df012d1aaa85ca5899f67994303c5e870b38557c05eb2a09069397c638674cb868b028b96e4249d2d935abd80278d35fb9668ac0d9999df99a78da32eae376cef69546fc71e3e2975221c49ab03baf048e1823bb8199049443433eb6b42a32ced9f15a9f4a3503598a43582070fc7492d6c1a05ac47f4a8dd3802af68c4aacd778d7693ffbdcb3f5b77f81a1951cb43597f5bdce907671d43bd4f92f70fb7c2a9a09402cbf0b8798f662550e2413992a8419d6a98e709c2c2caf9fac14fbe558b0597979810d62854205530f9b558ca4488470a39c88a37a152b6572c2c57d337a4b7ab261520729132afd067e08035924a14f28d32f6a258dd59472b5db2c6cdc53b9d766dcc030bf54b62a100cd0dbc9b99760df12ccd1e61df0b624b593b004f6712a13aac6934ba8339fcaa64f5d45c05a2a6f970400020380c320adf23377c6f5691dc96cdcd4864cc8254c929c080232a01b1dd9e7808e076d6e729926e81ef57970447c46f6ab942b90505afbb98edc344c47a3510c358bc63b76ca0ade7589cbaa3800e9278eb16a691a54de7cbaedb384ad97bc04a7666c4bb10cfc6ea85855b1c4c18005cf4939130b3a4d55a954805616678671a6353d45bb23fe847dc992cfef322484f7b90b3a45180a214491505ba24572d596cb6a48dd21748b770ae5a8559b287c76c29f3c5636b4400175b8aab65b91bdb09d43db7cc5805673c5a3c509ce77184f4d5ac4f674c0a602363d984e2bd8336d7877b436b6c0a8b68084a7cab956d300c498a86d49965172a78972844f37b5ab703731451854d7558f8f307d74a967282bae40806597ea5984899b54d31d85d159ee245a85ba7181c5bb051c49f2391acf60cc7c211f88d11617bb4a62446c635cbc09165fc590926cc7c4b67acbdca1804abc519af0c7268c0a3ab92123f15ec9f148517162e6d2a1083919570834cdbb7d7c23556a1cc11a55760b0470e6466e595a43a25b27565524618a6f0853781808bc14a97257b6ad9ca5cae8c294fa26053dca2c5fb300e0982df766882d80b33af645688c7a57b5b1a27526184083af969aa4aa5f52d9874a09b8dfa21cf5376b8db101b2b218412a400e02aae7a186f3b226fc018701533ae10c37b3836bcb829c7137a6252c9fd73723ab7169667b8c8ed4401724b36c71c2c8e56dc3785379a55219e63b4f7159dea9225c8b51cb4c8e435c3e19b7413345b12fa3a0f3cc6146860acf104ebe31a52aeaba9a28000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: bc99921d5e80c1f9d343ff32fb4a40a3706f750c4f7b0ccd7656ab6111f1ab8dad341e30e9a18c570d4abc4195927cc24fbfc57b1467d82d2d0cc1b7a192d769190a29d0e0ff672d6771910ecc08b2e8559c8677cb8c5d2109c07c67c639db57d9f83e0e67e2347bfc266bbdaea1436afc2ffac8c753c33a8c464c2652fd6bdbb7b78de3c851d98c5903a26d253eec7af773f7060eeb34f721178f8f6b4fb48ed18e0a614be5b35d9059ff8f096796d1c750fbfde317cb9bc95b14a25fb919a9df07d19aafcd52dea0a9b37d3d4d5fad67bce77f25358bcf3f90c09d08ca0afe83501bdcbe63160b7c8fdd8afaa7ef023f6ddc2c966118602cbe64a5450f1cf3d62d7cba4cb2627ab954f65f628843fa661b55a9e3f0d8a1c710b068625985405b29ab4472a4161183795032966e27080a8c3042d616807b49a68f9df5a8f466845b0948b1ef85695a631bbc503f8113318ce81e436e4fa69749bf38fd1a598e6f15f0412519363b76a6559fe068946925da95d5d00707ba0da8bebe3121f859fcbafe80796109a067c4e1ecf970bdce85946830b783e9223dda9ebd84ca91ef9ef096e3174785db6d4aef47043476128313195cc9fb3c009c41a2b859046f9494d37e057dc0723b17d7c1ed99c9ccdfa0349229151b584081bf921cd7bdef7215125d5ac2d2764e1d0c5671845164a77bfc91be29a476da8bbd5bfea6d102890fcea3757d9b323d12aa050a4653a93f5a29f2cdfb30e7df5d36f8dac610dc401b0f6ec0f63a022865f10e119b68c017d083ae4dde05598e02cb22f2db9c69372e23cef10e92536e11fd69baf27e41b578864c7f1a552b739b3369e2fbfdc7a7b6c38a1961cd717c4c8a4ad0d3da4e147766ee94857d0914aa7d18879ec6c5ee0cf747094ef3d681699decb917280bb76874e90c5b70e8f2c3739a22874dedfa8d8b1c5ef0cb72e67a55165abe7c3513ff34286ab8dc690b95b914acde3f63bafeffc2a6672e280acad66e757bcdf9f6650dbf39035c2a0ba75c100aeebfb8d0763074b191e6d6ad86d50f945400568f61a4e8b400a41a336e1179934ca181798f159278146dbd5f6a49481be03dd9538539dda5cce2eb4c149f9f7ef0f1ef5488c4fae38fd49c07a07976ed93e57a8f978e7704a1b316e4dc3482e6eea6181ace8e6fcd37cea7357740b9ac7a3c6c4cc3b1b7f27f25ba500f7b430079ace631bdda634e421b457fb9a951616ad2a15e7fb7af4a9d05473d94bda20fa5b97cdb6bd54d028ec81b09757036bdca2eb2fae32a00a50b21cbf7b2c9e0206ec617870bd18e8e5c05c4d93ebb88f4376f0d4d8629f5e03acfc6c5903564a3fd45529ddf45448174d2b9a36dac4876e601a26b0830546d3232cca2c2a4a5f6f62fa9f9c6c8a88ba83417487c2f838dee3657f4501f46f99467a738ba552ccb69ce20fc576722a5736d30cd2d6f3fa2e6731db14f4db0ec60fa134d2cdaceca19aaed29ed3c9905e98031470e8f06e5a95e25ea98e712b16028fb0641fe92ddd6012b05d3a2910e885135ee75fb9de08ac97fba4b42886bfbfdbd9c831996ea58d3eaa0cd712602d65ff8798b80001a5deb51a4823216d85f8d79eb85bfcea1805571a048f0ebb6944b8b32988014601b161894f736ecbd4ca149b8ca8297f8bdb4d4467b776e96df55df1ff8c192d7632fba09959e18edb38256f13519ca331e61a11c43a1f83f0fc668a62a467d3aa5da3b2875fb0befdb947f57e90f9fd9330d6a8b691038afdee461737f4a1b21f3409c71a09f8e5a26f4b82e7995872c13b023e2afd497eb4c95b949594138d4c52edd4cb446974e26740327d9ce438d3c7ea4e786e74c9981fdbe6a8a63fbb814e17fdf517775ba6946f9e4f802e39d03c829b87a68abfcf25b6b5e20f2b6b2ce53d99eef19b44bff5f76f5a055897a9695d6f83e7c16cc395211a672639134f960f986c75fbdaa7355bbfc1f79da427ef0037d4ce4cc52e972c03886ea3e1e9e66ed98033ee579f951b46839d3546608820bbb1e4361144214c27907f000c5e7866eb2ab5c3902395845c5b3bf14186eafa490d74dac8f1be75904f56a385c102ab9413022ab6da58d2d170dbad5c2a7c935a9c0190bb730448fd3e50dcba8aaed162a4aca6d4d2ecd8c9879765f87d6630a204c05772ca873fd78a7bedd4b6217d3731c0c51998cdc630e5a256200395053d0 +shared_secret: 713597a2ec9a4e0cbad958bc8e4929877ae01d034c78947399b9cb1a383ad7a7 + +# Rho leads to non invertable matrix +entropy: 456be124e7f43803de5f734ea016455d68164a7f054c003f4ef49e46f42dd8d0 +public_key = 1582ac34c94dc4828091253944b84b01b12106432fc87321a15688d6114c5486aa6d90338d3260de15633028a9a2c501e3e7a88747a03bc4c41f748778fc06adfbb70dd01d706789c49b847b12a2e369341c7b5610f2336730cf1c1bb07df6c1e9a035c6da4f01ac38570256ea0bbe73832f2ef968635765e7b9c823fa326b57b1608c50cb552c5c4b6b509abf2ad9452b76660e69abf2f172a117359b40cb7e972790f4b9bc05b0e866474ce6c2e37a36d74b49d400ab37486e47597afe6a08cacac56a654b1c56cc2dbb944cb6ab12338444d15f0de20265b57f3f7331ce56b374d13d4c89213117a15ef15ed6356778a6a6579356378cabf268be41466fb82c20845bb5811a2ac3609f3d556002148dbda989d8668ed8c26563595da887c657c915bc83923b46034af134a6a71e09992182310b061840afe058556738526469f76b91ed6081bce143e5e223e9a425bd645689d37fc867006092a7305a44537b06c60b168d039751e6b015c7c7d652ce121289920bbb1fd30304124819121af20600c4f0b261ec014153604140a5b8a97ea49c6c065429e08781c7377b73d06eeb909e9222007a7436a8e8a28edb7ff9e78c76683234092b6c97b256f2942eb01bca52a5f192ce1b890bcf0052ee905d66bcbb7ff44462e5c2a92a58313807b884a719cb07a2d8a3a0f5c2bad57cfa692a3d01345807213a2b5cf6a1234278256965464b48bf96fb6d3d0980d2c89dc3171093e80b6fb7391f203fd0e77475b8c8b8e913abc7066b5cceedda8e97acbcf3c6a1b5a590ddb0265b2abd5df28c8d7cb1c6553049d65808a0021d671622f45a5e834ba8498f97a10a15f1c8882b8c28e31b1187207bf5b6577053c5f7af3839bb2997bdfd761154fbc683c68259eb2e2367b2832a0c26a53b6abb06968a05ccf236dd8aaf3422c427368400dab1683832b9c73af3f63827ea16c1bc832f115ff3d00eac20cd353687507cc6d8f97ba12941bcfc714c735b45aa33dd3451ec56c4bbd6c363b3b8f65097d6e0ce03b29fd5039fa0f2a8342514278aad9d4807c1b25fdf035596f8548ca85f2291207694b949b42b00fac43cc6394ab85c0a01c583717d900035463acafed05f6717057e577fc30a92567a080fd942816157146a70ef3427a71478f404c4f613266f95a552578af3b4a7bb8383b1f20a6e47157277a7277086b0c38dffcaa911a1725fd34b04d545cbd924adabba3ef705c6e44c885526dbbb55bfc8a772453397902ea9a2b279e379f65151fc3450a1f471355a97ac0abd0af32a4694cbac06c32069c41fb6af17d684aa05a84689565ec05292d61aa374044485a507ca3478973b11008bcae4cb0a2975c2a471db196dab32bd71397e87240043b1305362a62fa6843010a25fca317993660b705f2637988494b94aa9352510b0bdc352394ab627e5937892aea86ac0e7eb1c5a2b2eb403994df5bb8cf144f3043dfad619e0627c2e661b70d1c4bdb30401ccbba87c1e8e0c1a83802abb5910625344174b6813f89191d23b61f3aa4c458a1886233aa29d6473be06f0906b75b1f16b1e5ef34dcc88007cea76130a70f6d1aae5028ff71ba38e047f02fa1956e7439ce37d13ecb555635e3644cd8c51b53db31a8254b2698a76b96300f7a14847c9ac372820ab779498b15f965831965c158fc196f56aa9dd37b0972c834eb0705b266def50b62636546b96a87ff666b1d5aec3e52679d4ccdd5c9b0dd50a7d916bada24eb6bc0ad94b9ffc986a4899303fb95107a90313fcc3fc0374e0c53c8160567f577402515624d84b15a9b4f18625c7d732aed4c64ad4766945155657b93a81283172850ea5417bf877e5eb95d739079377913529657dca52c756779876954f864b7251a255dc58b723b5fdea551aa299ebb8af0bdc2f9ef1b78cb42401ba62fc1992c5ab95e6288b584bcca263912c25a72a69a3d895aafafb38904a7ea64983637773dac77f0752909161833d3185c5d2824319aed09b0d27eac30bf5ab3849cc9041c7c8bc92e0c0b3bd657e2074963f79a4ccc42ec823c8b0d302d85371c4e928e5cc9d11d0889834622041bc971ac40e00871b27cf052647fab656401782a0685a800850100526cef363fd550cc491225e4c4a0ee319afd39ff2e2b581f728cff590a5a60dd5e4000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 51256f7e688d03d9c716d923b01f95c6266ec20da79ba4dec7268f51319e8bf0b37db4c07ebca73a80a06c25458e7861dab9e675c67ca9ab940dabb117a7e2426a7a81be3dc6ceddd27f073c2daafdb9162b4409ba741c6f16ac6892d7d8b06972d39f22e38c6f2cbec7f0506a5f86c5fc708a1d9a36391019c6ed9281c986103b6099f87ac956b59cad12f69db134f05d9f8f641678da42b276e754a31a77db16b5e85110235c4a4dd8ad1f6be34527d01115b072b82e007abb4e8bfbef65919c4309b8417c4bcfab963ee1110614e57b85195359f48c5c471e24fe3609a5314b5854b695efe31aab0a07d29ec29a8030c2a7a005e3d7ce06a23bd240feeefe6320b7c994fec0134bcd88b2fb91ec37b0ad802e45003049024133f90ccf375abafc7e742542576b026f71dd8f00e8f790178de9912fa850d6c24830354c4927d711a3314bb389fd01341c270eb1cf2626bc19042955196358421c559a107d4274c9bfe232328e9571192f2209035c425224a240f6a9b3dde07b6fbd18eccbcd7b00a6904a801b0ee93011644d64d0c3d58c0f9699af2d4e7f9578aabeaddbf8257e41c2512a5e566577ebe94699e00953126ce91674a772108a433c82b05524c1ac742ae513087f69e67543b93f03f8bec5e5d8dff5251f4bb4d17e721fdd7b9f6c06121eb53bc06a730d482aeff1b09cb6824eb52838d85af90a685e4178e76441ffbe7aa6fcc3126fde29193aaa25cc850cc0e8df7c9699584fedc15ed5e0e7d49f89efb61ae381e3adefe8eae1c6d6f71ecdb418ea36a357f20ebb4faea2ec2826b756daf9a4655102064d036e745932fc63a0fcba1d0ffb99815d03dcaeb5c156f4229ae0b07375cc4d8a9cd22a583c16114aa613dc38ebdb8c06721d32a6293aea51dd7d31ed3a101ff727a938bc70d78f08e3847145c02f4f0f8635be2bdd8958c4265bb27fe915a9206e70e9cf9979f9b47823708102ac1cf12863ac7dad149134824d3f23a621446ad907549b082ab099815e1fff844959bda476ef642299652f2bc801a26b9d4e5c212cbc1c1f23f23aa334300cbb73bcb9d43344cc9b6bc2aeacbf90fafefcd483b791fc3e310643f910de193c788c702f359cf97ca07341dd6f088db0c435bb300f23d90ad23264f9c394d56bdccc23665ca8f802e2907d08e7c825dac31520282c1713701ca29a3175157d7060bb9244f4a54ce1ec2b736e73aed3ff4dfe979e89e241b578197a0a8f37f0d811f429b5b1246ac2205b657e7ea051890bd62ab11c34e1373e8e48d449ffe08dc36e978e4b0530411d9249cbd5e38182e9a7922ab0e51f7feed86201fffd39af6dba54d3129a7ec700145f819499d4bc2d95a47e09e3429a5803f0b2f35d9467671336e3289eeea89d233f9c2a3562e277a81af46d00417106b1d7257b1ebc20cbf7c09f8a5c4f035a314be27fed58571d77ed229662c946b233feebab9e14891fe6e8295c945502c114e6f2117de50fbf7c116e5e151b12aafa3432a2532f66301292ee764cd9dc76fe93dc395c110d400e8d337541e94ea1afda991ac7309de1149dc78ac843317fb95eef99e72df29a0a88f788eab75ea8ad1dd0c2b1d0ac644cf180d022ea8e0b7d7ca12f65d0c1647b2267b971ae1a7d45b3f5c6ae5b5c239bf3b59260005f24cca25a883245d714ffd87e357d987a49ed565ea729b0c9424aa4116eae2e8ebd62c69fe7efe6dee622d83d620ab2a53b24c82ba9aa0406a9be7139092cf97db8fb4c5647bc14e3b3890d482960c7e8b0422e4757feaf66426985d07a0cc39f51faf3269fbf2d8db382cc35f5845e7dd13df13455f4b3ffde636acd70c60e3f3a814173ae1167a69d7af59d61ef0bb800a371e79b60681c20882fe80fd3e6f5cc21b03b0b70686e8b62e5efa48f46b48e349f20b3f0b4212e8eb1d7b2120c0a0fb8f11852dbd144ad22c549914ae1aeeb990a317a6c942ddd07b023352cbd33209326a6ce4d751988a4c7ceb6e7f718df7e9edf6e2b2675429798b013d321da1f0e0c2f50b2db93d9d451209b4411dd6eae8b74a63342785dd492103e9ada05d797ee2027c9ed0837a0f4e9175b6b508cedfc44e00c944a771e40fe4de1e609965a08e2434a4ff5ea969a43274105b631375c4e3b38a7f40c26f4aa202771ae2a9179141ef005aa18a64d6e97ecc1270be6cbb9d5bcbed815b983ff8c2c99 +shared_secret: f1b9f6c6304614a31639f9e63a019e699257c5e60ecd5cc9fc950355e0981772 + +# Rho leads to non invertable matrix +entropy: e8ac9e76377d67d84f85a142383e777157805be0d0f679ba89cefdfa61583780 +public_key = 54c26e3a0776f2db61ae55ca140c1056156469333834633d88c59aa9207774343fb3c0bec2aa0c60f25a1761337e9c3823a3965028951e114003dc86e1cb701b3112ea048672e5be40c6b319d88d62731a02290ed9d7429b71afa05964a5f775b855a271759945532eee7a1e49c1518d0b3466d2c5513bc84a69a0770b8f506c5203336691a8189ff8672efc68163b895d7a77b4a50668ca1ebc4bb703756e15605ea9e9c7dbd398aed773040ab89639aa4d005638a839a1e47e113564a33889d72682794cc68304d0a21858def7c8e5d20cce503909bb2064b7775db64c8a87a9e3ec79580a4493a0a845db33afbac74880888dd3070dab2ace759f777c03d0194d23a3b655713932570fb3686eebe97747713050868f72f6537b1b1e80e0a84d24c4a9a888f5b7c3bfd9380362ab98806812d07403463c9438069eebc541e8a8afcb93a18285d0f1a319e2768cf1427123ab458a71f3a44002b93cb84b72856a6688b99be6f2c764f81af231c87b7bbb1f3002705ac905f9be3d4aa584b98927902261f2c8bca677a2a77e8821a1afbc2b227603a75c1bc98aaefcb22fca6908ca2a8b28c813702c64c8fcca8af5c29e3893a1d696e3609312e0286c47bfbd2a562692a8fa28b17865aca8a7b00bc1356c489c4a9c11781c5f465c7c547b1cc464b5e56a84fe104501399a5ddc47c8b3ab0914584bb54f3c7107dbf0a3b8404e35fa22f3474aaf6b24ab562d65654e3889723c201d68f0ca9074769c15613319beb2449b4c2cac246b4f4687b09205c239fa839314a1d90a71c0aa9c74423873b08904a263adf2101b02aa222c2d06e42819094a60fcceba022dd9f50dbf00a96a76528785830fe453d539c2f61b0c999cb90a2bbd3db831cccb813ff1a7a70ace99976bf4308e2894cb4232441c0a094dc78334e2be9e6a830eb9c6458887217a1e6a7cc679838ea84b41e5b45066b32c69731ecbcc4d73f68f964958fcfa6a64b8b05171be99a78c31340486174566f4bd108433dde695762328f0570fda1cb79d60c67b510b7b34b0c341ab8cf8bb70146e0cb2036799368ee78b330a9288625c366b0b0d9a1eadf917b2f7159f25c31d34b422ca5d70d93de8e31b7a6736677c93952807314a2e58b685fd926b4555146ba41bc4f223b42821bdb22a99527699a7c85eb52288a3a4c56296bf20c2be811830fa689633887b8512723c598d8b1f9e88671fe77d9ae923f1b85973eb6ccd7cb5ee15b34022ce5078ce171837472101bde6915c97150b3b712f05435cf975b24b51e2395ad667c7f38a8fb3abae833a939b1a86f4545b3b55119c10a19983b089276ed7ba25c910a726ea3ba02344d33cc666a280bdcc2f99e3991d2491861c3b295668cc0a5c465b1e00c2be482a57b9c4475b3c11d9850e6684768091480e4a1dd0d71e88c17456ca0049d209d1e1a92ba4331dfa7382e2852c98390d4393f4016a98d59ecbb829a0f4b7261b12ce796844458fd393ac69f050317b66f7208afef2113e682552e81d99b3bd8bd30648b1a0bb153864bb7293233230f0b164c1a60d834c2a4a41bca495b57c02113281cf484937745b4ee90a55662860306df33368d7f2390c2b600b0a0314d1741c1a1cfb0940b39070fc1001142a27ff752ba7fc83e296cf62bb76f8a3b06359705ef1759702ae9623b6d365344ba2578ff4c00a4cb48db88e9c5acc8cfc033210857abbcd6132140eb372b9c3c1b69c9fed366efb33b518f99c23d7bceca7cb6b427623286f14b55b6fac869e8a229bc342c96727917a94bf29549c145fe9d95d35e518aa5776ca3678460a49bcf22035d981a4217b6044af11c9710a26466be948f177820d26957573b1575a09c3a87a13552f16234db5152dd2fbc764c88525e3226e2b5ff5571890db75458363bd8791dbca67ae112858908a4ebb7d0d847ecb610541c0791ac73f2432775207a73544491b7a5c03199ce3010a05f764a09cb9afa27023f72d9bb0b3252673ab714b792a35a78b0cc1593f4c5582406b4d44f6c67fb06972fc7a30e937d8c7964359376d896e9d54c05eb6864e583539a348e6d3abc256ad6443013926831513896cb5636aa1062f95bdf5b0acdb49a72581b6d9369c02234ab3dc5e3b4419f27318ecc3c7dcc60ce888b787a3458c342cad1c000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 6d7218616fcb7c0a8a0ebbc738afeb35b63c00897f8557500d34dc984338ba4d4e9a4228063774f6b19d60e68d67f14a63a0777c4af4b9a0387c8165f368cfc8d603ed70f6df210e9f540cf9d240006bbabe17821d46700b8fc755c5074d4e558d80230b50c298b4a813f6652f6ac92427c168bfc6b63df821d1566b56dcbc48e96e6e9de8c011a3f94e8cb3b11e9928a125b2acdcc5323da857ffc0211dfaa59653a14b408635bf1d1a1ac1f614a6946c98d9ef55e8d5f6c66b980241a0f65c14e5e6fc1c116ae9af9961a7afe535332c5f922f49521672e84d5e28974f8df7e77e7e07e4931f827d94c7576dc16b6f8e0409d4eed15ca747112ea1c9c16602799dc37f31a438f7809db67ec184fbeaf917a72e8ce7d0b68c4eb69b3e4285f0dc3d5494b6ad0e6c9649b75f58808b8cc54258837eda14de7e2f900e8dce47e35df2b529409ab78952779a1006f81e32726d9a6d5a83e541ddb249054956c3a0ab4520b4315b8cae764e42c97af4876ece118e0392b6063a8b38c89dbf8c4e1f7de17aaffdcc9ae30bc71ab4b25b26e0a2526ecce67cae66c6eff9b9a11e8bcaffa5cfb21cd5c576275b5603a852aa08ff1382cb047b1bd6519a6fb1e505fa4fdd06338bc9567d78cf1deae827587006e220777b34fad307a61e955673bb539abeab976bfb545c3e002d5af5581819aa9c932bd2ae210ca29dbdeb33269439f1553f86d44287726d74690e279aebaa526653bc24ee5a94fe70a83c46378d4b2aea5f4da0ac4ce75aa7d21072746a7bd5a4aac231c977e9365488410ed78cc357c9cf36c71c8608b2e233e37ae1f169b15b9b5d5de5c225b60c3ea32eca29501da353218b593c6793829f38a852ee3c575e468734733f8d87f677b5e425a2f96553d554dc52a8ca96b1d711406e04b2d12c0f089ac1001b00e3ab5ca951091876813a1a7fcf4fae9859991f8abcf40bd2430326a0f0ee7582a19416bce4a95f486b146283641091135c7d71e89ae8f44daebd43c7d179be2db238ee7f7723ae782eb4d0da34d35dcb4b8831617f1c82b10dbc8682beb97d0c58d4fafc5fbb8720cfc7718df0883473867433bf7a851a225d60c9e76dd7a7efecd15534dd0e3d14d64f86c4d9a696c61dc520fb79c2c8cb081e72aee2119a3ef76c4f49e9616ef6a85f9b779f99177e0ef427d9a6ba6465f230e63d9700855065b4eeb5ef471698ead0dcf7a55fb1ea54073bdd1d67dea4de22469c317984f21fc421171fea81ac872c779c62bd4e4e8f1ba4faee4e701458a2e21222e9b45b3ba2789d1ddc34bd48f16ef6e4625b1a73aef185f62c73b79dfd40ae3d6d838484b3d9a6825a2a4b9870d87fac0a4b2c8af548b47766e3c92f7821484c406b74bc4b4b88c4d7ac536767fa72dbe413e5ee4ff8d4ca83cef9de71590e02d07d9e830ed7f315d542ccd1d0820374c19967f2ec7b73089a4438e5a94c6580d689bd9cc25bd900c275ce9aa450a5d13fa143e2ed6d2bffd5a1ed96e4c1073ed92f48d575cceadfcde1f0a82941dcf4daaa5399b3775469dc75f150ab41b446e2e3e17cb8c89b54be85dfdfaf1769d022332c3f819536ab3abd1d89f9de0b25399ef5872130255cb0572da109496b44c5abc4b8fc5ce2a9515ba12c38c4e6ee83f4d447badfbf5842757aab335b62c89665a1c42f829a40ca8c470bf79c65e29ab71358063594e21af5bfb2f6b53d2c55a2a1f05652ec8773b437d68ba897c035b781b266b90ae3addcd603febb3f0ad2afa0904cac6b9c04ecfc1547bbb0278c024dfea4c7ec8df54d24c4b7e9f614cd8ad0307cccbf298092ef27add01be5f4631d4e1d7afa0d8bc34d0dfd4922abaf5952062bf86916831d2864404d565ec557ba7753480ada5eecd37e21808cb7e92bdd34b7bdbcc0c93f39e9a4f515ba7bd6071c2b9c7d513b98802111c2ac67bf004f211e4daa201ab61bcf174dd83aa5d98ea1b55b19391ec50b299a56899f51cd476021fba5f5f997a0103049a71cb20da170d38bdec4964acff514b0c4fc77c90e8ae331099f6863b551bb980ae547fa41c12c31c324765bdb09f6d9eb734708b6c0eddba22154b3dce0acf3210ffa58fda8ff718f949da8eb7c7fa4a67775834c1fc9e74c5f7f765920f2647572e9158f6bac6e1240850decbc4772cbf54ac754af22d16ab0abcc3ed51bed9af0a936b82158c310ac457d5c +shared_secret: f72431bd4d76ce666c68f35918a601983e117a666e5009b4802e904d0b32d9e1 + +# Rho leads to non invertable matrix +entropy: 2fe6b9cf4510f212839e348d671b3345da68a477f57513ce363414e87299a717 +public_key = f4e8aa57f60972f4421bfa448cb92525f41ade71a35261551547b97eaac35ec9607a061483874b19714ca7f443abf4bd34d2729891383cc0a52006a4bffa743cd910d4927fbf792c20e07e9228b56247c2440a3eacc0c231ec949ee7809ae4aa00c46a56aba6db5218c588bc9285261b278b1efc62e52556b130a61659cf09648b57c79647b54ee9658913caa76eeb5c8a6b6eab8a7cf9f2707dd4195fb3939e91bdc5856372b5cd571983c9709c1d854ffa56cdaa34b3c2a51bd0d304570a591f45c2f1e4cc35fb5a00923d71a5acce485b210b39de54a8adf82fd8682fac45430ad513aca5022611038769b29c1a3f3ad751eaf5b058370927e36049d1b0970650db914249d7a2997446e1b746f47b5fe6057bd55801c8c0af94857776d0b60be8a66f46440ba766046a1e08948944525e6d078f1177a60fa3acc2832121c7a428d5cb3ce316a986118d006ad5aa7e54c4c5ab5492e894b484e594b14b8f65752da0239c6a0784e415bcdee96ca0546f81368d8899bf7c372789f62a3182bfc990c9da414e0ff346a4c1025ee1bbbfe99099fa29cb5b744d860e6630c132e521a65a2e00d1561c98afbd434be0f92da317c89926a87dd674afdc8baaf99661c9572ab800e14280b3b08f5df826dcc051a647b96009159ca26f5aa2ccb770b8636b432b564b4183a50ee32a80318c646c7b29d083c718c27ed989535861c385bbaa44b836dbbe49432f63b29bf66923dde69c6d742aa2fb28524abd22433ceb87a4eea71a4180a370305173a8a597aa00bb364bfc167461e33cf4e764d4437e5ea445b7334a31db333fc2b3754bbfa6bab6bec208d68274a4103d16f9069a9c9f6b0901c2281112bca50b475b4d6cb612ecaacf8827b55b6fa8c1821a8a9f602c66cb719c97337c4364450ec2a8ca6b01fcf2420e0b0d27c0bd82a721c74bbe62c5ceeeb906d555ca90fc12450bd0522ca52f4598f3701a50710fa2e53561562e8cfc58f4596cb9c8b8df540fff63359b24b1cfba7ad559a583b04626d03bca5247be964b457bc71e324ffdb758ebbc695b919517e045f6e1162c333c30526bdda31e5f4a6eacab3d97c27025f32e695703bbe7ccc18a87b8e347b7c678f2607e24c888b85454fc738ee0a74720ba03a7651d84c4223b32277b5231bdd1b4e61361a451420891c1a0dba6fc4508119237fe113aa087772659b64c122382bc9aec39bfd2b2a88b32199d38728ca98b259b85df75ca4ee5a671130ac11ccfe19a1fa34954387035c8721e2bec713e635290eaa70660b5b79660334a5d56544aeed1044d6a3f0b88a1c900cc362151a3e0b46cf5a64a5bc38578bad6d0c467028df742be58c3c4c0096c20ac9f5799aeff295f3939ce61a92148ea2313195525cb3da93b30698ab893964d23e72eba952f058c2f74a00081814497a0306a51aee0ac1cfef00b7accad91448f49c8530ecbca5c5cafd66b1b03515a5d6a0ff5a10eceb67493506c8a514b72babd2036674d1a493b598a2850342a52a163226f07568c846a4bf35c502255b9ef4c95c87aa6088226a8033af1f6bd93e642fa8a5ae1263de5e53de8b419ae066ac3d28f159613cc63a163a41b95589249f0747c6a179ac9830cb5c14bc88efa708100aa7a5d2c7fedf0c550a5097f764d948a9e4e821a4c64a125d9c54677848b806debfc2cc5b9c8187b52cff197341904cb21b9061acc7c12aafab320e2f468244852c3720a0ec554d1219561e954752495c423635b92975ce327c18c346b026753a60c5159a33c584a2d297a499a294ef9c1c8b5081f859443f53625d6113ba1a90db33d7b5a32fe399eb0e84e0804adb0e29f4f063892484110121fc6c618a0235a22014dad868ccc55875c37af10062fc8a029a0c458dd80578680757194a75c4350de14100c73c40b616becf89637508074baab38acc741139b31d70bf0568ed5302f3e356dffa01f6da50011313b78016134e4cc15e65206f1ba865180d3f7736076c682566defe87bd676bdd149c76c136d549049990b482860a36e321426e79ecdf4c9d4b0b4953073fd8472268929b8694f07bb7c20f2900db8055893607428b1586c65b4ec7e195a431249a9d1480400d0825c4a655e257ca20175ca47ce081938e724c138592946f344d9eba69db96899f5afc8ec000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: c22bae19c43331e5c52e16ee59188c1fff71f15af20de57409add7604fe7c7a9426ed876726ffeb416a2bc7c698584155935d02338aae28a12625d39b8410b232da09e83c1c5e4b12cdf2a6c540575f232d5e5bbabfc299b9e36f3cd658dc38873fb3d5e9b3c8c292e28b7367299a12dab435bf2eff2602643e13cfaaaf96be846785b3b712a1f7de9f3fc1c340f32d069ead5b68ae6adb183c5d7589bec7e2eb96715ed3f15a336c63b3955fd6329281d069a041a76e7d4bf6d758dab0f5eeb27e74a318c1dcb3a645155c62c5d7710bf019fb0667d88da8d41a226bd45e4b6015166631fcc9f559d405145d49291123baa069febc3b720c2edd2dfbc29145c6665b0a4bd75e95d8118ab1367175464fb7a9a6cdc0aa7818466721f44e6622b40fbbc18947652a1940f885d3977f9a177caa17634bcc528d71ea678b387284f9a33f549052c331ec81398dc9f15bc3f3eff791d31f80324e21e86317e1ceff20791c8c8bd590d8ad3f64b3efdf432efc0e374506697728c84711f84b0f1c1c386f8607a20cfe3177029824df54caff1c525f3b1f8780490439a53a3b0daec32289201c81e4358f8549bf9ddcf2b2991dbc54ee9bb3ec0f7344100ab900a48d0a350546953a52a42d108de591cda14cf5471fc38ca8babad6693b518fc8774f351bb29ea8da5e2eb05f3190a97cb819ef91927e6f1288872a8179a99b0c071c429c5dcc8250d5e9c5afa505666d8b95712605cf9fa557c6c26c574f8fede993ca03ecabaa144911468f8eb0549a5c0f9b7aeeb94ee26d097d6b7bb76360d4d5091feff29843f256507f4bd743a5d2a50cfb0d0d439197802a44f53e74bef67695bd08f242f51d842ecb3c24a05788c75315a54e1f7035b86171b3258dbf49427cc2b871b3664babdd7db14f4d9baae20171ca7798594819f5e2ffb31c2589c169dacfd15b4c890441f0f87a8e503c2135037eb62988aa1fa610c6ceea56ae48017b8a9ad2ff5a86bd1a9d17e5e9a82fee0fa21b7722535b2eeee10573f9dee78d7b6667484f09c8353e6099c09ffab08994d2a6a20344de0c359e8adf05732fd6862a978ad9614986a2ad87cbd87015b2925d6a23a9f02f27fc7507f852cb06539e00ac560461154005a9ac3dc5ffd521abf8d584a1df85cfd64922e0d1e9e4fc731b0728a50c02e184e404b3c5e4fb8fad63a460e45370211bf60e7737df85b373fbee014b11706c9d8b09b1433a96ce62c5c0c08c484cf8be95b7426fcf4878a4eb15e668786af45712c82849f9146a2ecc3380bb473a0d619dd0295401ff9d1f57f2fd5a84bff5fa6e1786466b60169c1ed7e4083cf1816e116e8d0bae7ad6bbfab7625a47eb6d20fc1fb2b91c84adc23c6c14cae79f4fc3f3ca90c3c15315720fbd15d1a70298cae1b6b03dff6a1afaec2018016616dd7c890066e1a36562e55773f8c5fd22ad1f4f1b2fae4e8ceef92c681fb40cc279edc2a834eecb1e49efed02766b9547bd679634940f247eec42b790afc45a77f5e4f6fafa9eb1323fa73fd40727ffb6998cc5c8ceed32252e5c26e57290f336f5831689d54b8797de208f0ca2c75bb6d7f9dbca88946c1192fcc99fbf906c592090d3cd183eccf714c52c39f63cce1044a7e15cd574aca2cc7d6a76a56e945f108d53c51fe67e8212abb7849e7df5ced062bab608b445ffd9422e608ce096791a1cfd3f2b2f61d4e5c800e33fa3a8a38114cfa02385833d435551f2cdd5fadd3afb949437f0c19d7566a5659770441c7dc09768782f574caf781855621099d7602a6eb1935317d25dfc813d12cdabc3897d0493b88ab2eda981c407e0bc4a62f6d18c96bc497c6c9bbb5401b77a77413f154fcd309eb6c4b711e41ea4ec1c7e2f4c503086be4d96394d5b420a813cdb5798b00831139eb57678b790a90aa731ecacaefcff840e0d721dddbe5cc1c3deb03620615f79760b92384fea781c8971820f9636d776bb2c32d596104fb30e0295769acfc39a3101db88a4b5b38a75e9ca10f4071660ae869063cccb409fe921dc1596a517391184894b45a561621eb7c1184f5e69051845eed47021da5073e078e0f872566cff985ed3b866f273b80ef57d88cc1e2f91b72c69b1c1a766b4f8db2e8ec653a618f046fda32cee1f06a6e8b5895b578b3989a4e86dcff4cda1d0b573ec52b0b53dcb1024ba58d10253330fe3fb7c19c6bf30d +shared_secret: 0b6ec01df36ce91c82f78ed1b85ab731581e50597253c08745f0f2891a97f942 + +# Rho leads to non invertable matrix +entropy: 86630b4f72820d19e9941784183b3a0d770609becd6fe0dc463cb6edac432d59 +public_key = 1cfa5addb505d4b3155f44c292f958f02c32de979b3b042f85ac3354fa3190993040a01ad5450680026d7e17a0732a54c09329373009a1c3087e8c892ac0aac4793fff2b98cb96a3d0671f998749d716a78c4cb6738879d76307a3a35738a886606a236c92accbc09ac502c03b41ba0a768edf06a2c6162467581eba5083fce8488414068ba06158a9128ff5361ebc06fbd492d69c185d0b5568c1973bcc1604a4c0916a1c03aa9e82c98cb3f107ebf239ab50213db93136013dc11c44f2e55871c7bc34fc76a4383477410f73902f57d229e6851aa182880e767e1386082fc77f20c7a3fad8677f9ac611dc40494ca66917a6a227b9e6e71a325a3a4925640ae59c96d9bc33c919be595aea76a47bd64fc291948d51409d99008073b2f3356a040cb8a27706eb5ac08d8aa71c716f4f9420b5974078f235bca67f2c8161319824eeb892e56a3b7097068be52eea909805863057f1163b1bbfe98b1963e83e1edcc65e88411836a6735b50f8256d54dc11fceb52ea771930a3987a85b2a73a6e36fc946a3716277943aa935953141c167a8fba5545089345ce8a8682672ae718c87dd63511f81ef1185db0c173159928722202b0b161f5b3a1224766ea1264166c2bc83229fe273824014adb8c6630cc3fc8b19e4bbabf24bc9bc3c3adc5e3774c11a134eb1cf491550c9cac68ec89e281b88709ca688597679a2ed6f73160fcbb0b9cc696da6060864c2e0108cf225323129af8958cb5436604ac0e184a68d22110afc91384cc7735d546e6db898e163cdc62a3e8dc4c20652a947396d5973ff8f0b1141bb361530011604f8f85b911302064c69493529869c5284ecb64bbf00612b259b859717f89bad2bb71be41781fc011cd26c93c7028ea35389817bcfa09b727c66f86ec9497ec90dc0a89402611b71ca6a513cd4e568cb02a7f9ab84135f7c1b43aca898780d150636af51b8e78c754067f872438ac7a6270fa9ba3ac47dfd13de72202740ca297f284acd317282733f652ccfb805d628887b1ac6b22fc0ee4748995a685a151aef80cacfa6497f23156805269bc346eab122cc8a16883fb42ebc19dc2c81065a773444617d0fc0cd150c3afda64aac933823864197cc28a672893f926b562cfdfdb7fa62bcab40157f26b0dc0fc805de81719759c9af0abbb998559759b35a58daabb243fc2477caa289fd194c171be2ae5b66b84ca5c480be10887948aaf86149c5f47b137eb3d2a6ba5738c1ed6688ee6eb7a3c8bb022d19165964ffb2746c5e81b39ab7e6f5b3ad8c65b0bb3b7315484cfb62a96f76cdbd715beb261574bad950660f1f155d6a62d29449cafc43e9b0a4b7a747aa65a825b26282a164976d557fa8a135ee58e9cb1bc0e8bb38e7b931e528c7e6a2139b2061d605909375934fb3fd7273cdd7ab28d17b892102149f6cdfad1772f0b18ecfbb9c2583568551bfb33a1eb0cb91cd5609db35379f71a88e1035d875942d646783a8f11e4314d6c97934595165b23df05c1ab8bcf51783b81f435c4c74d652b44e077c7685908abe138755763974367f0ac2a63f5cac37039ad7919d3c98e88f89397a401d7ea1b06c08a717b582238191f17b9ecc1782976ba3737526e4bc152d86f3d4407549a079fb15dee5232f01a05300a72c073be6147053d712887fa909aa787c401b7b08c1e8395809876bd6d423c3e489e152696c12603f0d27ec9e4caed1bb9563a19547400efe30502d99430bb378ec397dab2a553330a34243839876b5ed532fd469a7df044ffe90354205303009cf7f252dd6b0aecba8da45a8c683413577c787ec8ace7d17a277561a7f271283895b380cd294974520556e072a7ada4024a2842e3f20c38cc5da139a1cc496fa583a1b1410a15038002f1a17352972347ca22215739d53b27e53dca17cbd2bc616a804d314373cfcc1d72c0736fcc3f041455443c443e72875f968d095b18a7f111c1ccbbc0c1a5d8485fb207223057b8d4b754076a919f96cab4db533e2c48dc134c190b478fe6635d053c476959ee4b7ff2754bb4e7c8b9675791d1a84845491902c7cc99a300d4a1196a9f43c816d7013794e1b3402622afd8ba997cb9aab2ca302b8f3af098dbc62d44bb3c9e35871554c6d30840ab3c7127a030e19b4c1e382228b5bf481b0759fbf1adff000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 6e78c7085b62594c22b881c61e63674892e8b15be6b3137030cf91834ac0126295c6893f0c386b7670821cbbcafac5d4211cfad5c1f75deb8e7df047b950fa504c189fcef6806e16c7a447187a7877ff91d5aa1f89d9f4c2f8c726dd7cbc688e247c929117e01c8cf93e62440ac3f9affd27ecfd76d525dde13ec8b3a6686e25cea8e46fdb3a264b4e1692bcb1cbfbf6e750a1faf99d8864c1a9beabe0d436b7ec5566c92be999b165ff4f30d6ba43347c326edf4a41ecf2d35cb825bafe62184cfc28b30419f509b631f9affdca2b3b78771fdfb006f5b6cca6d0f5522308543b4a1fc65463d8b0ef14fb3fdc160178692d598e59d71110447fec3d02a58556bd1d17d212bd09d4dcda359fc4ee60dd2f0c73db72ee684a28b550f6b17e7dc8e2bd1867076222033023851676c0a55956e14f2c67874217e5349918243011ace52437a127c1a743a52c7c6fd8a0a007d5d020ec1bfb9f98b0ae36561eadbb5e23b7202d909c7d5fad270542c2e57dd0a54fe7179050b7ca81d72fc8c4f07f45fb2ac905e209a3ced970bcf5334daf441a0ea8f250d41be94cc33d96a42a067654f43047cc500214d0a54920f61728b6e95a014926f03faa1b27f6f5cb4397347dd0744c09ad92608ed7cbc0bae29092d6846fbe0fa14a38529e00c165a7ba098c16e532d43a8e4bff1490c45e0a33bc02738b4a1958cebeb39fd30ed7026b3a015863c2e4a2ca00635475678132e7fc114fc8e891711241942b787384ee22352b2811cfe1a22fb7e8f2e173df93e59cfc98a677a136ec29bbd47bc66070a7a8fa3a709aed2123ce55bf27ff2d23eb87b9762659d16ced5e24b7e825e0b4c2e8a6b6cd1596e4fafc06c9e90a8f0137ad182662f54288da8b590d42c6fbf9bb14cc8f23fff1abcc5885ecccb580d93846b2ebec01bd528547765fa2c231dc1b5ec3b3263617d136a102f6e02458444b158162b80e9acd39ce90db232582ecfd679029c6ed4d5a17f28b4ef2a120455b5933b51d3751728ad07e9d1ae3dc52d690d5838cbfc8c8d5bd7284dca1b753be3cc485aff60a120eff28891e902af0ec3358785a0ac87f99f18f268d73c05ba725de2cbc82d2918f1694c3f6c813d02f341c9f40a7c75bcc5984d5ecc1cc308eb16a9c1971d4f8e6a8d5ba59e855656543c0c7e5b7e49a360bc31c9411da0642bb815703bb64fb550f19fbb0bb993453ab8f15ca9ebddae7ef5acf2910f130f95fe1e4ca602f7e09d605a4dddacdd3cf5c2830a7bd1fafa1d63f7cf4ad511303ce42fb6348397df469a813c822527b933747f8f419177caad0787b63570cdb807a35a190a46f2150fd19c18db91c9435908d79449b23430c1d26a7354b6b9d1d21f31d160e767681580c770bb264dcc24567e88a8bc6512831fba35cf6aa4fcac1040b200df1c60b88a3d7e1550f0a27e8232dd88a9c751624198f811ddbf1c2a833c58b91bab501e7cfccb5374c21482808be44877ed51389234f3bda65c44ab5781da9ee3269a0cd4a3f13f50ec1445c859fc164774cac725a3b561bd63a97170823fdc07bd6ecb46bcfcd76384e7baa0ec3c1f4c89215e26b580962502a4c06aa26068c041ff1354ee9ec07da71b163901784ef525c65bd00c403a9445ade4b0bddfc30e04d278b4873dbd1f18f4587cedf870d958b16be02ecdf3a5cc435b49e0e56775521579530013aea6a081aed4a5774bf72918526eb290a5bc1ef3f0ed9440863c1133a70b1481d46b6f0adb352b3cd4e50bba138570b8e5617e3a10b6382970ace312b95d87f5e8a6baea10d2ea19546acb5fcbac0d20e964b7c0bd0d1825d3955971bd657c316710066d81ccc421c786f7d21df4e748b47111732f1851dc992322d5b50cfcb66321b46588b39184c503666435d620eb03a3535b9611e7aac801e9cf90ecf7671f70eeec6103d6e00a2ca5a6a8424e645d4fa89b058b5f77441437e40bba596d705ba522fae5fb1240d9f9e25c9bcae741b514b9ff33d0132db5f06a73964f05dce8b41a568413bd7f4fc78a4c7dbd2f5815f3dff8f25b2e82a508f5f2fb02087bd23927707bc729574777e01ed0c93557867956d8493c1cd9dc86ef3c1e48986be905101578c8e7a11ea96709929e5dbb1560bd4d9f9acb7957355e09fad7c97712e890234b335fd950e25cf59a4ccc6cd461e6ffbbc43026faa7dcc6df33a8bc5f1dae7e5 +shared_secret: 8918cd0c3eabdb8267e24b79272ab6b67c9ea6418cab15e2e3070f6c747b4dc4 + +# Rho leads to a matrix with unusally large entries +entropy: adf510dc0e997af14f96e4863f316475be59850bc861ca0d1b057d6b94c3b5d6 +public_key = 9d76798256925e67ccd5ccac6d69a85343825b6a20793095e1a29d1b526e183611bad90cf6440bd3e79f847c6b912aa1919a9e7d9357b414cfccb206180067469b294b2c4233960a40e17800ab0ce483c40b653392488df837689fd72da0daae74575da747527b2a116984b2adccba04000ab72402f09c749341be42c79a5c8198488124fe750f66b82cf272826747c68a946d2629a48ce0a777b4a9673ba9c3a2a402305506f4b65b65b327e62de16c696bca3d0b8ca44013cc88d9444a83549af17a3f8270565359b168ca721027479a6e60a28f11b33d88da4faa084b576ba5bea09c2fa8a68c0aa8a309c96119aa52443bae570abbd942d193cc8ccab6e5643d0e362049f1ad00f98d173849afb1248ee2a67873950ec849e9b7042b94222b60bd50720b94d7317053cc86758cfc0bae9c9856c0c4411e74730fb65d8b7b838426123bf68b9804473469c6d8717dff450fcfa208b8f53e2cd8987919a5defbcda5a422ed82b495c67b46264106a613ec138097f05a2f2c5efc2076b9e2475ee162a5e7242cea1598088f8146bc8ea65909723fb7a60b1db157a4f43158457d2d157a1f980925a396401450b670728b2c7ca3aba3e7d4b4fd34b24caa87d45846bc2104e95a1d9a5676b734736fb00f7b3241160c2299b50e5517bd4faa859b79c8590c4322115a7c724f0767c056620bd006c01b5b87d80091bc483e5d341d14149095045d0648acabb46053e78c84045a9606bf82f6124fa9a8a9104ebaa734e3720eb6921553e353e66152f2e96adf34534a06aeeb677fc4f901bea148d28411f1f856b4d2cd261526e3a8139788796690413a50251dc1763703a42ee708f932cdeb9b7ecfb2c7d99002bb93cc248a133b9a4c8e910a045669ef5bc75113ce12f7963d665d6662246d383767f74317dbaaa3d0b855bb0274815442f0b66821cda6aab15672192d20c6aa8537432699ca8a22392a855323ad70f75979b56b392c29caf9c072885710c33967120aeef0bcfca1293df8181ce50dae21577701b1fa216dadf19fee4c35e0d435ffc83de3f92c2b276461b66398c75c98d92628b32a2ac3b571853c4a142bd5e81a8770c9d9359c91ac41aa2b4b063a9bcaf4592cb6626c213bc89c6eee3b75c59a21d6d748825b336f4052c6bb79f4ea13f51b672d1abb32887f1977505a75c13f0b66db14b56956050550ab0d85a814640dd3a36a825682c9cc6d6f13cf132780f5fcce87355007f9021ab5a5a3a69369c7876a5158654bc9f9400a1de60e71e34a370372f24cbc84166ee68b6433b6911a76bd78fa249e850bab6aa96ad820e0dcb438fbcfd9ea81f5f3c0d5d53653ba288815029202807aebb27402660e4b3cdb609bb7145dbc055fa146466b121e673359a8465073d99b63e799cafca95733938dfc2ad7d6007a36a8da027ad396618f1647b1287094737fe518b779f238b1ec0c9351b3c408b8f66b27f5262693826b24842a9153a9d205a7593665fc172c7c835354daaf90574686a8ca7fe5824ab94f29d6a5ac87cc40b999e5e7ade2744e1fe7048e38c804472579d93309986c28962b06e80d0952ab10d1cf1d945b99432ef5074dea9c6f4ed97959fc904e23a3834cc30de35f5350656d027a1e6620925a6840a337d14a82dd524c2077302fd6b72e97a959001d3d81768ccb7937f4aa07f00eef0aaeca877999e5598d30a81e920e2e8489970a31fdeb7d921474500835a01530e0177a44852cba38c3b0c297a0c5bc73db986d24cb0b323402d5355b543468f948976284dbcaa1c87c8b27cc62ce2b8306da3a5e08b0991403e7b0381adb0c897c7a994997a69ac1f5092f8edc480e77a82ae9bdedc724883b5eb3da56648979fd2337fb42aed861859aa6165a800d4c9b964e70195927359378073a84b80219613873a164324a04144c4a5b551937c23ac75e3a664a773966b512a01f3a7a60ec1ee06a068933a8ab0844511488f058b2c5bbc1c8dc07e32b267aeac8285543300bc66f8514ed6aac59cbb9be835b3ec68987a5cff5791643c60841da8c172c1ffc07110c77a43ab34621c474a60a385d153d79831922638740657030481146ca6843f6043cec1de4b0b307c52b288b98905b918bf3af0e698b4ea261db5895f7d02ea0fc59156090609764d09b4a7ed5000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 02c49972f757b82c1f5e7ff048b375cf05adac485075ca5a1eeadb615de1306d6712f0cfc452db395c57039fec57708d0a35b7bb238d1e4fd58301473cc4737d72ceab2b097d513ccd17a7f54d1fd145bc28aeaefd2157f2a8dbea391cffecfc2e1fb86c909b45e97a39b30ff59f176b2359a92cab56cf8d04ca42a08c70051c8d9405fa9aa2aaf5724d8b2a00528b7818671af4129c527bffa74702f02172bf51cb8e5b7c07438c785329807bd022fcb5aad5286642b1fbaf976af9816d3f0a3fdb79c2787f6abc1dd20fbb2995bc2a4b2408f5900c68a60f38f78037c3ddee01a3861433a7d9eeb5e7a41a56d2b2a11615d8ef8751d19cf7bc5e5e46b0944dfa61cee6dc16c490f5c7b62ebb6bd9bdca7dee23c3bf1529a4bf40977b307e945efb6451d4ae1c1aa507e30f653ef476c64610edb39201492434dcf36053f668b43746cda8fefd4316425c92f97e1900c62a91004405349c69497438aeecb876ab534220a4563138ceeb3d4edb0d70330ad031aa82dd62e19d17f62bf83dc3d4e2c3850d47efd50edbab06c9661d1ef274e856d8ae58564909625de2acf771334ffc3a3d7a0b1a382e8a17c1a1dc0f29401d9a3dd198a4ad70a740700301da40b468fc4232ae841489a1169170d5131d9b0a036149eedc23f2abba55883ffbfe4788c887e3248bc1de1b3677f286f1269d110d574d01199524d93263517afb76759bcc2728ac595b004508946618b55b0ca734431e85496f07e153f9707d876b6342cc99be864d9d603c645bb9731890d497d85d955e2d80e2e660c93968873eeca1a51157ceca558c0544040db61fb4ac4e20effdccdf950feb214971dde984cff17a75973b8d3a8cd27c92a8686fb93564def326e3cb617411892469be218d663a009c37e2d573b59beb4c5f62206f3a0df818608583e73d12366fcb1d685650d72ca4f533b928c0b4772ae645f0b0ad71bb8313a601723b8f90ffcc53dfcda9d092f8931ef168ca2f53d4600677833b9443fdc05db07f80c03bcf6e364fd4d85c89fab6a08cc9399b10afcb908cc4b6b6a3f6a4725bcf8de94e6515345e333a8324765ca69ddf9c61539d36c67e91ced0396ab2adc022ae9fa8e41d5a00168cd8c9ad0291f653af63e67b90ff2d448fdbb058702c551d323f5916ed90f6b87e354944e167887c5ea4b37703c8b0a94edf20d188ea989999deafe0a6de995434275b18d17a33b100032f2796749a385d972542dbc9989311068e84f3629bbb797f7c6f1057d99185009b5ac0d43d7b944b2e5f528cdb26ca14d995671e72eb725bf2de60289da1f06d78b137a79ebfb75425446c20b4310700053cf3ad58ce01cfb4d97325a27e5b5eda3cfe1009cdd186313ec3d16f005be47c8f38051cf2108b85ec43aa0d527b8d3bdae4e0a7a711c6fa69998bc26a9a8d2f7433f24f79c0dfc74a56083b42de7860b22c45f0c6e31422080c7a21c8d672fba60ce7652a90a3134f54594eb0fafe5a953e4f179ab06ea6b9795bc31a4f6a7f18bd5f1800a5263c48da4ad48ceca613fadea7741dff9d90f6400aa31519bef0b01e3312a5042ac35362df5e61c8e04eb52bf5bce0505ea7233b516321a08185fbdb9ff8434b4c6a88f880f594d100f46924a26f468c754d6af07f4868cbd7aff2caa53e5146df4afde9f7753484fa8be36baf89ebd4741b7260ff1ea398d59e503f5fd6c5c543ae1d318dc1894a48025c76e872fdc3026bf33a91b4618d1618554393eef6f7816b7de65c4bfbb55353cef9a53ad35340049ec65ad5af27db6fa597eae6499a3e5a192ed731915f6ffac811e35555ba5ffcb6628f812bf71a268620c161fe2a571921f5bceb4d0cdca776c7e52f68140845f455d247cad416c4de040bc37f5421e2b8bd6a049db84f0b3c807c3bb9d47cc7ac3ae9599ce82cebce8243306c0f3de6af1526475387c76751b7412a227571450599120570cf3cda19264136e0a93b4d25a160dee03d3d812dbf172618f58d09645becacb5c287b3b01ce4d1121272747648c50112c44728f66d86bd421390f2b36ed7e18b09a985a306ec52f240c0bc0957335483439f146b6c340f7e062a6059b1d47750c11cda575f8a2aea78ee09af0e06dbc2b2ac2b2bbef17fa108681dc90a7b970306522e521aa987e3ab6dfe2e1b3c6d9fa68897efc9e998afe55620cdbe9ddbbac8a0e22395d5628a +shared_secret: 6e63c5ca8af98628c02c8f1d520615a1a2c4824d5d155a6e51d181e8eb44c7fa + +# Rho leads to a matrix with unusally large entries +entropy: 3983da6a4615805f6d55c14ba582d59a40e646c7ae77f4835a51afc6c37f11f3 +public_key = 452bab83196c047889f7eb13897b3d73db6ecf5c9687c3a97d5b3fca3071a29cb82902c7a4e673f56842129c4e27254d50c2a9741abedcd925a62796d9a98733262e45366a5d7b81cf7c9b3c42a6b2f70626d0adde9311239061dd893669404058da8d209ba6a6825e796c84e765b348414447246f57acad8c933dcaf752ef268bd6246f6b57377cf82607a522dd7028b572319263c9a9805aa6501ca4ec2a182a25cb751ad6f0a0a23955986155e0a1b0957bb9afb35320da2b20e29210b2605122791db13adb91a0fed0b36bca7d6f03b0ca6c8597b56a189c10ee887b4429b0cda99d83728aa6f57a03d182685b2266ac1f70645b123c0ddf352520332fb5ea06e716b010f82c62858c0408446afb0ffe23ae9241be953b3d05a9087f8738143c3c66b5b3c61ba1240b99c2f50b620038d775706aa58cb0f7094d52c755b992e008c2419b3b4bd85a41f65bf633136867caf5872d551340f377c06546495b8882e4e14df8a958a501161c547146fa2132160fce98c830a5b42784cfec7410bfe87f185657a29508bf339c7871ab9de91423d23e90ca2bdddbacf7f4af0f616e9626a3ed4a87b9b900b2412b0b5328104479d33046f54a06cd88a3d0c9780af5807e3517e0c72d45b17106a136e68a49521364e8661636f250fb679d3fb649a0491d349a6bcb49a4e06552ec60b33f947e37fa11b6742ca9119f0c6953f8175deac4576292165f42110c99467b008f53e25308e560fc845df84b28eff321687c45d6d09d96533f1d0078af998a9db59cc51b1ed4ec6c13695fd33a768af521bc9c39bbf6c27c6266ba271e5d8cb89982077f553b1dfb5341b5caccb856a7608cfee57ad3dcbd782ababf70c4f825cbe1279b304c2cf134beb0268655951cd76079b06410737cc10550c16cb9848612b6b7652d4ca9bb5be64f08236b69a097cbd10014e561469b7a68723160d91632d67f4908622876a29c59682579b34a298cd01597887c1b4d100ea724ba3fc8960356b499825c5223585024a478d34561a98d0c23930473ad6da637666b454c7882f0a98254f41caee03e03067b3a001f303c651489c1d00a825537c2412826a73959f085c5d6a836836582d938b9d999b591019219c906f6712fdb52b13bb8708d0c570a00bc40f1168b80b9c11a4e72430943c2544e2bb910ca5c4f0b245f4bccf0f0c3a284757bc6c535c6a205b34cddc15abcd92dcee9717b413568b461e2b9035756a312414e2644422112b49a3a23eed98e07884c80a6291df38d5bb039df15b7d89b5021d691f1a165eab9242b34146f6b223195bff19c6c6197a5e424c59572502f69c7a8b633534786e4d8c1e280680361b8ab5657b74336d72571bcd12af7089d4a23c09a167d0a3bcc540b8be036b24664bdb3a13b62c11eee93c4ff5bc0bcd92f186741eaf56a5f6111f161b9158bae9691b8c99cbae21c9534da07d11930b96751e3c29a804195a18781e016b6af45bd23e8297759a1d1487c6212add88675cc3b92de46c09b4315c9a0cf6a5a20e7fa9ed5d594aa95cfa3681e42a3543429b9ec551e1e74ba46b79234b8c69c0b5f9553aa12455edd971ac29199c04a40d702128cb77f63d50f11184d2d0b66befa6adf7c2bed427c82a632a81497c3831e38256784802fb7195e40b571c26a925de84f6366b3d9aa2ecbe57ac61283f5ea3648b652f0c742b9d7c2a8c00ab5b611fd36458ec71f1c49579f96c1a774a3b4179ea63b4fd1e3b172b39eed1bbbf0d27aabd1befa0232440b336b53230bd60b88da4c116ac47b971de59a214a0752e75888172386ab2ba525ea50492a59467a57713985475108501cce687bca50b6c8840b03bf2a5072e8585f33625a9a8c17160fd7d630ba54c2dce9bc0ab2cae4965ddb9110ad612c65c8203e7b462ff86ba28abedb808f70818f022413ed5a9a3b0ba6aa24685fa91d5938a69693862e31aef5054af2f9849d3b1d22e121fec251c8f358a0d320efb9299df6194cf6cc5cf0c11363114abb8069e57634ba173ae199b080c1d935558c16696c97a5f316a4b8565c20b266802c60d4272e49c2a5ff794bbc914240f81317558a8cc862d9783630d90d99f6a68738219c44b9ad5c07b7242e85d71f2a958398e25047f494e7f6acfe339f98cc2d65c114a537b1259e000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 841dcaa46434e75228b0bc10733771ae67fdcbef99433463b2aaf2da88a98e1bbc748e1d14239a3a91bd2b6752b83302265c58d36f176b15988a3cdcc0f65cd72eb5486913269eb31b42bd0ccec456b72ff18f3801a1ad44c3ae6eebfaca59f2ee8308bd6c4c05a7262a01f168662dd42153bcf885ca7e84adfbaf6429bfacfde0ba36426b17dec09cee0591eca54dce505b6f23d2b674fba0a9dffdf7e77ee007e7570b31c71723047c3e8a271d6876261fc1766e1e468bbaec2a42960c2f0a3ebb7dc5d5d6d75a24245a375d160bfafb01cfa2c08831b1ccc67bf9d05df3a14d8f4b170e145311a793a92b1d59602e45328e58c5842dfa6d7021e1c65a900e0b04a79b17edec62c5d1c2bb8679174b45da0cfa336f7a0973923b8812d7b2015e73c42e1219900cfc3cdc93824b55724acaff2158d38732c429883b4d461b74a858cd167ba9e47f8157834f2e758cfc1c8f0fc5e762d56ead723cac0759cfe5233473b9706be8d909c1bfb2cdecbe7eb15b74b181e8fb949aba6b82e2c7c1d40bfc43cdc758051d1ad428a43bc7708ea9b46ea3f202974abf44644c7614769c9fb39de6ba9fb3009cff125fae0ebf0ecf5c9dea4ef2b9a8f26fc5d27d875e068ce3d319f816000f1dd560d03cccf97c5485ce65a77a326ed0fb2ece5cd5a55661c7b41f4b08486770cdc510f03b2b85c73b95d0d77b0aa75f677682d0a383a6e69ece0d5bd62568f2f50dd64ce3cd9e51556043323729b165e4c6726dc77c78025faef0653e54c6474834b9e2b51c66bfc8fe90e6e48fa217add307120ee0c00e8ac8988e5765e66dd0dfd92c80a3b19eaefb46585f0078f5f2de0b9c83ee10996b27b7c64d0f7b4d3be78ae18030bcd792e83bbf99529d1e7917bc053846268ded779a622e83f5d2fcfb0c15bdb1a2621188037acb8999ccae846ab2664792b043903c3e6b59c2645ca44e2b19cb21122035f7f3b222bf382800df1d1d8926eada144f880ecc739bb5644986f0a3c1b7cabcf3c9cbc7938802274ba459c1b870ddc516b5ea871fa6bd87b8cc5e47541f1dab3b9fd63865bb514b85155c41780b6ae24a02a06804a319d3f8d81383e7c8167853f3e24b35e220c105dfe14c33441f928c6dcf63a606500539b602f3b3f547a49545fa43f3fa6bbbd6049d9769ae5ac0964d00d68409abac87369f9608f2d244935aefce11e009fdc9a94c4a803eff45f989affe68c4dabbb291de0e7251a82bd5e5d19bc165fafa25465066e23dd905dd456e0d02ec3cf229c330d404b5f214a37363bd997979fd171584a296cab6e37928940f6bde0d1ed593903d86524449ad42248572680f1b573ede4ae27237e56755485657a5f542577700680308cea4a0d249e48138743017078e668e9ee556c7ef5a83cca9f96ca22beb7e30e2df1a793c6e2f402f109770ce7763eeb057f65bc0fec1fde8ccbeef1441dc98d059d1589564debb2a993ce21031c67d4d8c61ec53160be67aee11ff4b901bfd7c91f6e1faf7aa525aa8d15c3212ebdf0e3a5adc57690d446fcc9435caa5b1ed174b96d4da42851545ce1764bcae48c5fa580802eec2d1b83e4307c1da0dbb2a0fa414d2db8d6335f898fec5e391d0d7c2098e35dcd68afa8adc29d5eee9a9cc6a517ed310897e69eb23ce83e5ef0535c0f64d4f8d62a962e8af80f47a7f76cf735ae4ab09db0b806a9c4b2fa9ee493d69e73af045e6a1eb07b5bbd3241ccce8b5196080c2953cbc50a2052126ad754dc971050150d7ad4b319fd85cec8c4be05b55ddcd5ec7e804083278495b1601792464202969dbe01488f876d1655e0a3f4879ba41712c9136ba0f99d4bbf3145f34bd6f4edad036e6db0ba2532e35c6c097820d1fb069f9d69c259fb17b94970f2cc8284e5fd80f4e6070b4389bcb49ca99f207d002e44f6f0c9046fd89c0ddb1d86b01007c02920acafdf28e49d3c209e3bca054b67398b6c6c2561004c129947d87d33390d28489855074a6777dbf72816f0e1bf9488009bb0a247784c8a9b8f13a163d86a614edda8d205058071c12845b21e82ead309ede45872c379417c536ba446272ffb63d924d0055a92c320739d364e3eafcea6d10ee09a58a70c6c9a88550327070d6de72034b8140976856895147e2a1ab4ad062c7d299228a50b605872e3d20daea3e918f2dda9f8182aed61c93b4a47c5796478e182ba54c87fe +shared_secret: d0ffac51bd8b7e6192ac5954b26a5c64f4d0ea746b08d9f73602062aa8aaf7cd + +# Rho leads to a matrix with unusally large entries +entropy: 2676b8426b9d6a30af007094bb76d65d388c2b3da938215dd6f6987206400e13 +public_key = 04db6353d04f4a88b97b6aa5a6a42a101a535da323cae6c7dd757de67c24fc0c1dd894ba24c26c873172bf2c1ce63c56cb98189d60587cd76c2ff70cbea93a0d0767ff347a071333986226a8812677e2b5e18a15fc5b2d23bc03786b2faf8a9d2705bcb6276d2c140509f67a123a34a98bc879386b5a596b4fe77f0caa5145d766e05834658961a4aa3d5a90bf9da5a53ddac964e62216d0a6e39934f00c6ab988cfe6334a69480bfecbc7b100b621d471ab51725008a21f404142e489cc30cb1aec8dbf99038c8989ae8c477c198cefba1f3420951b660026c820fb406d19fb0878677cbb852bf5978d99d33f6fd7c3aad87585e68e5dd5a444a8369749ac03902b91000c0d986b26029005ac6daab8b0888a75b75bb667469525a70278945e2847cfcf242b420a10af98cdcab58417400b9d58b68f3670aec0ade93996a8e16d63337444d0b7de449f3ee63b30aabc9ac2b77d5bb13d672ce9db86770b9c21e11ca3f42c2117654c657da94c451c319e1139088d008179707eccd6a47d68677c692c9bc7790a6311dfc244d1c67eeb3420109404a86ba668e24c09b6308f3b09e546cb20db4117c74b4124946735ae70ec8147bb2e24784c3b4a24eec5ba8de3269054399a623f0050b5d0c10b5f5139b0786353504216850c85677bb596b2ac6a5fd4c224bf61ced0fb031411a887066d7a5455afeb8309058485386a023b6c58b5b967557a5b291698d488a131826b958df717caf472118d96a3b6882c1e95240909886895a0f5946aad1c690b7a904121688f5685ae775738307786c5a6915baee72b3d71103a96860afd696bc70b880c019e6dc77c38e33817db195ffc2f7cc37b4a6450a2e787d2e65c55748be376af57251974ccbd8b398858971eb5ac62f7156e9f2b43d6c54a51c40c55156971804e21869933771b3ef64d16e48ec5195018425d32b56dcce1844f33600bf366b9237f6ba451fef0816d17a00542433dd7312c474f2c1abe2e3a1a12b303f9d42891b12954473f6eb41ce2014bc083732e7a4a7808831ae478bf2865934437d4874b6e5132ee99c727798aac4b99c7494fb555a594d21bc99a014001b7d06612c2b3a8c7170e99e037a2d50f33e61156c519a1a15dc78a60afd1c2c159375ed570878c319db912c1745b90321ddaa48bfb80411197b2fa146315bcaeb292714ab7576d946b3927a280319395dcc4a0c431692c7848d10a36dbaf5d78af33f62c25e5c4fb009be83a5b93e054e587393c48ac1c65a524a0cb4e6637fdd90e43346fc9a45a720898d05b4d3743a0e2e40f4cc77237e8913ac0557db49eadd7cf00c3695379b06602c332f57da6409b3b888e7c06898fc4412444c677482003c73fdf07ba45ec968591c3445b14053a8077e664b9964956fba6faa50d680352a4c8378d208940722bda766910403970e3b50d863d28400512d7adfb372052f1cfd3b24ff4e46695533449dc232a14604a08b00da1ad81e31232412e72d180826b968513a2dcc724085a3ff0d5c3a7361f861a3e02b0308b897ed9d35b14a4159cf646336ab8c0e273a6915a14297abd937afeaa3f62005a001417d91699e4166740764cee25b91fc2c44753a3bcc2a8144174cea18546fc513028018aca8cff714d6eea7515db543a192d8695b1923642228394dfb428cf167201bcbd1e217ed1e2391c616db739b09c9a0996c5bab53bb5e1bb3aa547937dfc49223897034bcfedd55599e15641bbcd1b0072e11ca24ce7a828776fd0c94bce2738eaf13075aa7340d51b30fa0caf857f1c5b7808048917e7490ab0739147b7cf229953a633f080ac80c495f5b03355bcca47a94b60e95d72a29147f2b677c6a106f905f5349933b0b7600358fb009bace2c229246aaa51a95842cee212c11a205711125c4ea14d68a833c2892e8bd265bfab3e7b16cc2d34adeac46aa6e92598d45d972577fd76a9a7b954ad1bba6ed63132a375aa29b9eaa42366e2aa8da0374a19b16389a1b36c025168584a91a4328071de904ff9162a06a8bb9b9030f4571b1166133bd11f9fb9a2214c3f838a0a6106359e778fa7f504c6e719ed9c2ac66479eb1b662c8571d7e398f80941bf2ca0b8791bfb51693fa95894f25f2ba53882e450eaeb0b3ca706a936bf22f6056588144c1c3219f0eab96c000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 8106cd6746bff4925c2620882d571c50b36b066a5ea43fa6528351d97dda7dff1d9e9ee6ddc640ddb88851844c388727c918152c41c814be39f274183e116432a61f9a7c1885f07bf118e4ba631598fa9b1e01e72a68ec43dba62235587c9b9dd1c8e806174ad612a2ffd477e8d0edc2ebaf4036393283b55144b9c83cbb31d1674565abf29a56980dc4a3803a389a20dbf78c78a907a5d651649c27c9771ef436c189d1922564397f5b5594d7efa951ba7d05962df80c49c1f73029c3d7899852d8a1fe03d1245a228028cf713f4403abc64a9093d782cd1a6dfe12a79098e07f40904ad146dbbdfa919058149b051bea097a60aa0373cf9c0803e8da99c03a6b83813f99adea8c87e6da09013947cbbbde8edc3b7ca29f3180882cb11bec706f4048a20c5938560ea83380be5cd75f48d77bf3360fc131509317dd72b9340bab91fc6bf7ce099bfa58d6c5a413fd2801a15ce7ac6f6f2c0447cba39987a37695468cd0fdc982631d9b0354205194323e74d41c54e0a026c4e67467b5595aae7c8346d1bc5538ad0acdd56fcda32f95dd7830b65b2d98c05355a3ad9c84cb43c23ef9845250888ecb6f992da17f769a13bb7bfd621571f98b42a9aaf19d0626d7d59355d9730371b29a3868b97afd7013142866e0b2f1c54841de47c47775940c58475c96a4881bc69c6de346e05f55cab15d497392fbefd2309a834c733eb3ec8df4ae65ccaf690af492e39d0b5c91d09b39966b31b47ddf6751b481966f19758dbbc373debf284640015cb197e53120e0a36ab02203e0992f35b4c8347021f8c4663c996597a466b416cf271e04a20045639635b904b63250817c29451dd2ada5f3011500f705c2f0982d236ee1cd02944e35cfc6704f0e8fa30d8d2d595340b4245d3f3d5246d368062b53f06ad365dbf12c0fe7f492690fbf3389d234e76a618e63f785af41b2f4af70be0bf0a917df6a5f34683d931604c6df9288cb9e38b8d8396ab2e21a1c9a54f4dca2a4985c3c4aaf20af5e6fdd126860df422a894dff4a857f2a8aa54c4bebb70d44a4ad15d47497be7e0b7487003ecd6f92cec84bf4c459eb5f480dc20bb6db735cfaade1ce33782aaffa6a39e4f2ce9e7df44347b91d75bbe71b824d6302608dedab325d00163cb9e0a274ce49717bd6ddf4b9c02fb6986a8f765ed565f48c10dc90f39b93aba1a69a832e41f2b0dc2113fee500c99471ab67e3ab5a1cccc0f92273739eae4747de461ca3ce6161b558577b56af9e695a978970473dc671efcddda2bbd8d15fa6eb8ec0ec9f479bd9b8d3dd4865460846733856fd57664760bbd5ed354696ce6c8b44c6ebbcb07920cb6c3cf769c005503add472c7374b8875d714d25c74e2d4390ea455e00208763f56e475b630a30875bafc70f87f541bfd0a28839d441ce567db3be7a20e2773f08ae73f9686b95623fcfa7b1b3052d64448756f9a7481b1d9c6022898e79afd4c2290a9ed2e0658c6178826ce94e0ab460798a88cc54558c51239bbcc5347d59ac87fb6580f84aae6492e1ca700093438889fd50eb7028153e8b4675fd272667fa022b17029808b88df427ac048d8b410f60a56ac39220f8b509ca93c34c7dd62934f62a7e29aa3b0918299fd5c56b3c3158775a3b3d5c78aaf2f656257fdaaaa5b7daf83294b5fc48d08922ea6f5487d647c30b1c11a30d2b1690958fd90107a0d6cc689441a36d04039bea83c447e79b04bdbcbab04427949855aa1a32790075438ca6ae6f7897581b4489ea1dbc4c025fa1ebe698959a8145e8f11aa1cb6f742d1be789cba73fdea457eb0abf1e814c931922f451a7d59514c3e2526b1378be1ba8ce317ec3fe2e3d983edb346874f5251d197ea02c7b16fef2b7ba8cd3b0179b1f935d4aa4d463bda2d5dadd6ba96c0ad630f1eff86e34dee3f2eafb9cc5f5ed13dac2149a583e2af8db3a789c39f751e645acb58743646c6f65bb12564b8f26697e80b8d9636b0833d71433a0465dd501eb313158275608390568c7130ae5f998d3819ad7f3855d26ddc9f4ec07a36d191450dd6502a28665eaf8235a3f10b90aba654c70974038cdc9b3335d9b865da8a07be70d53f6a5edc7c4a5f4b5220c8e7fc01f5740360db072a4f8d7e80246dced5c75ad642ef1b41841f43e6e422f4f9131c1b3f505197f18571b057ed1cf2dab2f37dcb88082f8d8291d13eb7abdbb14 +shared_secret: ab923efab9857dba5a68f9198c4318f54a42aec38d194133eb7f5dc172478e79 + +# Rho leads to a matrix with unusally large entries +entropy: 319c51bcb76124b92f39820a5653c0ecfba79ec91d632b0488f4020e5df4e37a +public_key = 61e61727c66c5cdab43ea53041e25b36b56a323a12f70c99eea25fb4d387c1aa2d871244021a45ab27a0709583e0c8652db31167da21ca46b84002ab009a8659656876a037e844b6c027545cc66d783713a79b1bb5021e7a2c5deaa900e595503cb1bfc394cf65707c78a97ee522be49c2c08de89336b4b50270ce189bc81fb6a464a853262791c748714aea70e79a6967e62566492157b4bff737804b014c69f41eedeb07e47cac957b4ca937cf4c907189606a9187c700a7b6756c5694b285ea6171625038f1c729a7897e5cf853aae66104fa1e6c66b86b643b1e37838f85bea35132a4176afefb2e6254433af76d5eb455b11a0624fcb63f7310b0c9b171d62134fcc361c2a58b12b2c53530fb658b83107e76006e43ca74d9093fe0ec4127f5866c306b791b5d033cc834652e6ba485efc76b5289304b3c774e88ce0173012e0203eda7a71eea170517114ef93f739501c6f9c9a4d56b77494f82c06753a996f33721a56a003167bc773c44d685a2aa45b61744058a1a097a14299d7a5257e27f8efa796776249878854f458d7e4b70db914e888567e5aa9cf238ac4187bd783570daa77c3a9854c11c80bee12374267da446cb1a3b5177c112a3945a92596093f77c3ea9bc2f95452b89879bb6c0028b653cb6c804d2680da39cb99233067c7b9124a27c4c6558a641718588709ac86d5c57ac7a1f1aac68c9c027cd2c0433a139f17b2972a5a81fc8763ad92391e818a8b77c43fa7e71930ab5934d58301c723825f9079ee9ebcc8096a1c4eaabfb5b73f070b43c3112af289c09d908fb8a2ab48786db29c2dfa82a16c6c8a8b34f83583a6fe3a630b639631742adc422a71798974727e2a80b139872df5420c60954a453633bb99dd40098be6952930cb35cda52a33c4728eb31fc7048ee5176ce947b194885395163af5aa5f2f53fe8c9246bf6143d199d2a797dd62b0fe67042fd455acebaaab2bb61ff778ffdac5edaf8778879c5517911a468a583286bb4d11a7f852ce921cec823647226c96110063d02a2708364e585c5ddb3914a27123a8c6ac89c6f98260009f172f644b10a27201a73812de28eb9f04cd0e4a19080001d082189b7b85c788e02324b2f4b07dcd4aa298b44b0f49efca0b9c0811b57729ec7ab7f0a6a7bd14c220394a2609832a26b3b8c29139af994a5c96bdcf13d8fe21c225b5e5f5aa2e0c7a21ec3a8017c885ab5a694aaad999c6ed14b77dba90fc666c0ef88336d79b3093719df8179e25bb59301a67548cf74122954e34fc5e94fc70b931a3669314605d609cf06f25f74f76fddc056cfa4654094b724636f49fbc3964a5ccd79580cc8a15eb07eb4061d528a32de192413d388b051660d43507c49720ec67ae41461b5ac87cbf91dcf42af4d38680f450acb9c6cec903807153b71613f02900117ccaa11e2cbd2885187a49089b63c3f1106fd5a3070a38b25c9757bb9b40c80c6fc4611334c4463e1aca784af6bc38584a72ca4db482361314fa1b18da660f440ab6c9167a4c18afe6395cbdc5320fca49aea990e12ad6863a0725863dc1009de81abf3d56ed4c70258096f6647cd3c5b1033512a742984af1a08617aa63e1b754ec93e77eb1f379532cebb7d4421a58bd133b9ec264ffb252bb8b546961e2f602aa45c5c20756f51c0ac29983ed95036758b05f6d90aaadc464e914004ea81eb74162d8a1e4bf986120c1e9d13cebc774677577f86c10addfba2b9486f9123458fb20e73c32c8a36a60f457074ba640309a7c9b744413a5622f43ef3785da0b77739e00f1268b50e04056b0c2071f8ab5451cc0d2861310806a4f180867310b03c0fd0d9781b3315c0da53d30b5a84f27962326084b4cf8e88a2087b420a9299c34a517c088e12ab2f54f35bc4542b85d455f6e9307c949cfd617dee8153a46c99fdaa1c00795296e9816e557369e34bb25b1555199dbe0a089cf83cfe019e5d013c6507294ce27e51ca5e805b894c13655ae6a0f9da6051706d46dacc69ec3898fc58ddd5c75e82345fd8137cb606a7707b4d3bb801f77b615527705399c8448f95d3c292662957e48bae0004acb52e55385f0cac2a9c76c471e2654968113c98be84c89e0a49040ef23751521558e677e32089a6969beb0897f74a52aefa2a087c454ef26efd08a555d6000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: c60d4aa71649960bedcfd1ba225807739b82f912425f50d32153167826926e51f8ed961b5439fcc7a3804d55ff46d5b873e13a0c8ee7606fbb21c5e121fb8e60377ec46ead034bea9c44a685e7a588875e5bc2dff98e5529cff460ef5fd1ede8d4cf2b02e9a537887028150d0d79ee6a0ef2f0d5507c42ad1d788a75899d0b7243f7179af88cd6b7fa41849f1f49f782eb0bb727a9b0fd51ebe3f05ae80fe7259aac42c8b0a70b7b74da297c03dc1f06c44edf72773958e5a0d38aa91c35e71b27155e875f3378ad6a2d064d6d7cd56689b1a42dc4a26ce2cfc8012e147940980403bb6bc164f3a0f9055867efd0bdd3ff4c36ad8165aaba00c8365d217d4bf208312f3ce9fbd7bde30d6e4d3f1a98b0a20f947d03b45f3a25ad481fd1dc271a0cafdcc04f02d314ce3da2e1aeb00c7d3a88ea3ea2783b75e16768f0aa122db015492b0ac9bab3d3f85fe6d8e32cfd66fab8e3138402f690bfd3a5fcf09ca27cfaffca96181b8a906a67d93303069ff91c2e3e6cb26c5608bb04e05ddeab18ad3ff916bded7e9e27c99492b7525f95e02833ae827c48b1f4ef06b77633a66ef85520768b64641c5b1b3bf319c390006a026b3a77331c530aa5a86d0e329d4c7bd729992e3c574876ad9a29d79b09018e850e2e63d51f75861af33e6acbdabb722d41312294a9b302aba8e3f04ab1f04688e373f86e3753d84070bda2feabf6b94617cccae0fd427f90f43d3b686fd772292fe1c93f355fffd2683eb8dbdf171b69bb6a5c929b7109744f542a21539e04151ac7e46f5d4b8b151981d4860a366d3500c3422a2bb5c24fced0221e1b84b9e5b587e9bcb87220dd92c127be67a396ac18cfd3470e715ebd320fa07097122f696ff81923e4c2d3c0310bb8b70690dabee4e17efe6d871b32eeaeebb448f7d65fd60e7a3f32cd07e61948be330179dfdab4d748d01694d64edabfa95647a21ceafd5261cca24a0548a135ca1f7c262952bee7a291857062d3546dea97cd745050121c82a73ec9c0095847e0563229ec36046ee1564ef3747b49812eb2bd015025f077b56d63500bfe523689a6be7b886fd8aebbff18cfb6e4ca18c2d0dcbdcff8fb7a9e852f81ffb39245abc6ebb9f58a28beb15942cfd5f797dc867f7a855a3e6ecbdd9a8123ecdc30c7240d44dffcbdca05bb17d524a791ea32d60c65dcb6ae3ae3b724ae7da36b88d3563a63f4c059fc83c97ad79602cd7701749f92c02bd65f505f407b64ab3f8417d3de5631804eeae565af62d7fbf95bfe25126aa2494368bab7afabc23825d6cb03151222bec05b09a3fabd5937b7a0ff17246564e163d049e0724456576f250045d13d99aa07a5f298cd76ac73f69c3547ec9a344998dea3448a96480ece462922f76f1fab68d030796bcf570298013001414ee238a8ac4d7047514ebd5c3e55e051846403acbd3d7a581c1d53084eef20edce56c2f50443440ad0fc77a955c1e5c4d610cb45f43435b1a66bcec638ce88126ad88bd1b0d10cc5aa23789d5c8f4d9c63cf796e1ee6f7fb309855f332a648c731775edbcb4968592f1f633a3fc74bc5fbfe9c0e74d8379fc56f869e63d8db3b9ffa92e9b470e668e10acc1c7606839f2ec0abd02629007e3b1300e558e5afd136f949eb1e6ae56b5a8c21d15ec4b62b22af89618501c1af9992a3f002242288fe01140e2476ff900afe32685afac7baee893bcfaa54c1bcae65b2c9db04b1e17dec3821145daa041150f3282a500ca46c535ee47ec02b1a1639713354bc4ff7217ec169a63bbf26a26b2c712b02c76b56a8ed0535e3ee1c3f118f2a68f9c699ed8702f3eb30328118922b15b8399a3fca410dae21e7d762e6e45c8de7ff023a75211e42d1acf1d8f506223cb281fb9615b2de1848ad674236e768a0f315041daab6f491195453081535f9235f6d215e5750226ae7eef4df26469cea1d0541e7932ad917fb360f4a9d5601126b1c76bdd1696e6d59749635b844c9d416a12d0eff4c4a9e7f40860b047ffad7bce7439ef0fef50cccbdcc848b02f66bf67f2d3cd795242896c5f2cff82864b1d1f00974c9142d0b0ef2a8d00289238e822d352a924c689ab15e6e5b201ee7ebca1253b9964a04efb4d7af21c6ecdc03365b4275d72502523d562209a316a88163ca33ea279702309f8c2373514d459a5298ce6999571072852d996fa8421fa594069645f034d3 +shared_secret: a6ac9ae3077504c8a7b1e5558a0fb1e7d60cd2bc3e59d615e68d5165e4903d07 + +# Rho leads to a matrix with unusally large entries +entropy: 00ff48b3769ffaf4e91c1c9110eb8ce9e2cb99f060b486b37035407d2f4ca517 +public_key = 6328240b1a7286c71c5cc17284fb5058410381c74456c1ae3ad93735b6c7d0e13621c924a67a44937039df4b4da608ab49978109f077c961c2e6d02cb0f429fb04bf7b32afd9e0748a50162bf49ab17602717b25800ca3c762145636adeeec6543c43dd20a2a194211030971f16139ab86a22fe07664b425e47240ee1101cd171bd681a681804d38bc4cd562b7675a1a4fb113ab476fb7e67009c8ad5edcb053e77e99d10a348851f266919d29204f5bbe27e8672ed92e7777aae4141a8e81a39cd83a30005127289092929a41b42db3ea2c3b9b4e14a02a45906e871b5ed4c5067180aa97a6967642a5ea52639f27665a78aa24511ec6bb8ec7c3ca2fd34fafd5b5397c75c8144894b56d61e57ef77725ed8909afc703c6cb858fa1c600556babf3cf4fbc089595606f450753c727b42c7e8a8c470ae99e40e518d73684f2810e1ccb187441873fe14cce8628efb360083029fad17c1a9809daa08df859a0626365e0f1ba97ab9bb0d09e3b2632812152ec6361cdc65307f916b1782eee7873c2313089f3bd0c5ba938b80f1b43c7fc6c3f801444a34ab9c167629076442b1cb34c9b02941368c6377098a7618ae352d7cb1ed9419d56158f9222c644f58c3efa5209317a165434b86350c1a94d21fbb065854534120e665bb73266b6a392a60fda82b096701cb100aff65b44a40a4d8c83f8c63621f44a6de22f9b4817a2772085a95597c309b6423b9710cf72720598064717b52a336a0d3d9b6092e9a445a3c507e37ea9ca126b1b8f4f702d55959faa7b80322045508b2025ba64575049738699e2e1a42630c80615724dca7e98acb40f6415f6907e3649962c451f31164e88601cc2c37a65c636b6c146cdc24e5ce6976bc3457277a588118712cbabd8dc273fd0c8c3835fdeb500fe035116f6beaf437354c39e9152c3c9999f5f98281096a0f1cbafbef24e87bbce8f88377a0a3541eb128e31a0d77c247dd32180b97bf6f8bb2f611e7a7927f7ca25706cbc7b52598b4865ed8b520aa53e6199a96a0bc79a09002e07bcdf78473b273028b34e7a7c9f71ac38bd6327ea4c9acba59a07b59433908a3b8a4cc5a01d704773621b4c750389e8557498747ebb3b8b41b99105756205b2b578f668de8c293ef989a934cd1c80b18d700f7666986fc445854c9a6bbb8c9ae050c6316bafda5e98aba4ca0b92e3c3a43c504e214193b43c9c9ccacdf4ba85a57c6da6d1a8b310c4f0b7390c7001e8004beb92bf55cc8eaf37ae07738a090018e843288a965d4e8bbbf9a18730106c52758367361f558272f3887762ea91c35a23a708394b8a3b505098f7ab8ba505bbd1763a0339084f3ccdb2e68ce8b032bc217d51110c6cca10f277142a844ce5e7c8800b5bc857613deb0e5e59b4acc72f0fa1bdb0f016ace9b02a43a49e83c207e8ab82e98fa1144a47809a5dbc5be622b1bb364e8000cfa2c203f247706b3b3dc520bb308a62bd893c3bd890102bcdfa1b6ea91cb5f86758d5339396184b2ad4b36d6c875675261658615e55c85839cb10ac8c789959cc675a976c4b88146179d38820344f319b1621248577294d4550a33e723d65f11f3f654f11f206a7b4c4b909a4b1490f41d68752aa4af2723ba9c092d371c0e2459c9361230cea1772ac0990b6626a9914b20769c51b2df3996639fab765164a7b61280049ba14d55a98537e85ca0d8259b14ea4151c787d49c9b2d291c9e2b005c13a3d93a88840f9a19d30c346b14b413c150818850bb8585ef0263b515a74e79032b3c561ea543d652076a38fb4f769318378510a8e277334c148bbf38868d74ab56adb16f75a6c4ecbca6e1ba200874567fa5d1bb42527f123faa69bf2c45e4e79022799a717c21260e3585d6a86b7582a1f166dee7015abe11b42a961d60750e2e40ffc82588448b515bb4afe246c875297ef87740a775fcbe0bd902c67b9830c6d318523e422b0060bcc5a5a5f7b267f5b53e111c7121b86a6025a0fc2716fc11025c857ae1926fa7066ab527045d8244c75bf13a1a3c6688811d35ad23c1435b4cd536c6f14f78bb5d34b4bb34548a375b93234c63645d7ab59580567f9517604837fa6f98b2b4911d9946a54d0ad2cf0747b4081b904a2d6f953c70065b0c4b698e556daa27cee3b40070326f43c3d93a7cfc649000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: b0ea35919c0560ba7caf9fb6352b36bba962cd45d3d2b7f6bd97ebb2a3ba6df22e018390330f75cb4eaef8c9ee9bde4a1f25110dadf363df31f3f8702a3c14d5d2da303bbaf0fb199384a2702f7089fcc63acfb29d5e53571102566866898055258241e5ec4f1a325175cf3a64a84ec50b4e8e511ec24dfdaf0ca79911b1d84b5a0872fb1618edf364ea06d7287c6ac39e842c56d6630ef38f4c812a8d1fcad73f2d4ecf8f7033c1f5ab982c5b6b8c5545237c4a3ba8d5ece30dc93d1d4f4e89d3bba0b8149ee5c2df793c8779d45de92630b292714582387e60769209ea7d00e2f1173f8817567f52fe53d908d11e8e77375e7d2f73f44a01ee3c87c8f4163c579c40ce70dbc006ad2426667650c35d80ced3df0f3f626fb52f57d874625d414aeaa658a220a4ee6350900dd7b1b9e165661b41cd0c96c3b665d789a297f6b7b4f261e6dda3f6b027ed8a308f1168627f71656bb0ad456ed2b197c672d88ea6bd61fde6dc3df7e4d8b505afcaa35fc1d9b5df57b69679811ab5b738d62a5800555fe282dd4d06d5ab25a3847b4f22725a2360d8b47c69458b55f485a1ee75918cefbac2b4945c20a7356d1b7c69f1c047ba355496e21eaa2123b5b545e86c23d4cf27011e68611290161366d6c12b340292113d3973efb312b1474807f8cf735b76bb3a722aeaca7b865530fba177f9016d1ad1a7bd86da6f657c32d6662e57cc691f5acad0faf4f21027fd761ae23456b599333c9af918166927c6253dabe508c7d931d50cc824c589881b39087e02b52276b9d4252c08199dd4943d72b4fc14e603c9e901d0038da715973b0d168b13edc26b20e2649f37d27c9cacc7a8508ab340a1c3ed8d26099171bfaebd39b0b9fedb3c195a381b55c13365139063e5525400127cc963d9659c964ef3415b31c3a2a923ed3b96ffd327d6eb4929ce1d0d26232b46da119e5e38e71a2dc97bb953567bb5dde9c2d19bbd208c85b135bdc885121b5f7195904d2a9141bf5222e98f95ead571db8fe2df9a93501b8fb9a06a3ce0338a37920fc4268e26e71f94cc218d6fad6c2cfdbf0a5855b186ccdf10f66f01f884f22503c530b3c5ecd96d9b55651b1eeb3af62cb7a4cf4cd185d98afd1b942e8f7eff849ce843e113e82c3a875fb996161e0d0185aa99e21e7c99c9636cedf0dc9aeb55a37eb1f744841f5d8fb3eeb5eef76039a40a5c643957cc81dba3fe556234acc512efa07f3a140ef28a93ed9cdd2088456e3bfad0e8377e69fbb3dc67f3864ab36f8f8422837e067c20787b80d77a30995e5d78f84804cd7c897d0ffa5fe1e7b92f17575d94512b6a4b5888a3cfa6e03be3a50b8797f43a87477982fb241f24af59f13acf60ecc4c11e558b1a4feb81f69acd5a67f56bd698888c9f00430dd8f8309629f7c29e96d2951fcd8b521265c368e13e22fefa30bdecd51407387c77259e64a62e5d705d3d46be5b6f710ad86e844e509a3c5c1dce0efe4b1427bcbe56758432301a14d8b882a70cb5c587e1636ecf96c61998bec7a9b6b98eab92be2e30b30174c87bb8bd66d13282dc4d1b67757435807a90a0b268a9f760054c219bef6c8811476a56a14994c760e21a1b786efda3fcda5acd859967b9874eb049a9690b0acd97c907c1ec6b1bc9790b1fa6c8f15518b9c18b3f0cf672d26496be193602d909efc2562bf72e83a3d8244eea1942c6b6708f006963ed1005615abfdb57cff11b985134ef3ca90116a7ae35299d1627fc05cd40cb32a83c9f9e19570ab0b4e079ae34402641e47e1f0bb20b63e551dc7c090421bb1916e970b33a6cee4be985f28ea66cbcbaa21279b45a4d3927eff26dd1d171f18ba8c5e78644d6027e7ace96ab62bc862d8cd69bdc9c07a4d8d66ce2a08601783e6d40665fdc637aa813a447361ccd9d843bfa05f5e88f1f74a4d6fd1bdeddb1c50523d731cf6cb4686018e8518525a83c2aab2fc5ff97ea1562c7cc7347482c96675b0b249f99428d68f180d6590c67025e41c80468a3edcf147368f3612456e9d73bc4d6e0a70364036f75cb6657ea99c8fa365c165d7fc912bc583f0f4e57ba0f531544282e21dc42e00f00fc59273d272a711748bf62760377e5c30c1776542936a10fdfa8acca0b4b5e5c9cabf461ed5caa9124c59a4e867859401c158080970ada9cf76ab49e250411a61ec5e83c781c269b75ed1c193bf8134d7b0dea +shared_secret: be6aaee5bf0744e7ca1ca0e545171f3075aba9b4d10a71ae00848c8398e3c52c + +# Rho leads to a matrix with unusally large entries +entropy: 4960ccb1276f96d7aa55885b6ae6f90343d42e1391e8241b5952931a979837e1 +public_key = 2b1a5060745e8525bc617900d53b414dc995772543cc58a6bb7c4868f8999509428a3244db4081ac6b3f3c685865814c318032a678ce19866754c0774b31cc47a6a8e3cc90d6a15e54c7370c0360c38409b126c06d4b06b7d652318cc810c774f0e66e7e547305d03109030fded56940d472ee123438551d6885922ee91889f97ae31954703952f4a3951e8003ca2836fce071e382373c36a27b947ec8766bcafb1a3105aa2b082802b9bca0e4c50b80cf9a4033b44ba4b8a2cd6d480a315b08e7774d68f8ca8778894bebc2ab431d63c931e61c5366699b65ea448c127b82ea493034616fc1b6be01243bc84dc92bcb50aa4c7a417f1b5268e93b35ced9cd6263227c849dc8b107b10120f9f690706cb0ddec8fe2b20a26da422604c9135c58f0b06aa5180ccb55adcce07e51f885998398c4f16162c33b89bb37a09b84dd0a9d0e8c90a71c2851e33b3e9cc5531a76f81992344161a837608872355d57111df72412e58c5ff85b97ab2016b41487f56a9fbb48d2e498c2e12d3972c677caae5e439c598b67520a7ff6ac9c2424482988153b145d6b40973a1582b90a5bb76716c9878dee223046f746f08323ac3a5390a6148d767c3054524b7247c26c9339c0642632710b8a4fe0502dcbc32c35ec2e1e22510ea4abc7c74980ab25f9fa58caf4a70eec2d22c1957f162f5f1c5e5ad0a0fda4c342885081d3070d773cc972928eaab2ed604503257bfe448ef2a9c9c933055e633a339792d24a44769b95123c1f9588c8759a469c049a75bcad2e6087559c8afa5b6415a8825567aa44f63ce5b49ba4fabaea311918b804c7fa2d1742945f39bc9e8256b537128a9735a0939a1150c10418551723154cf4c027a5355e1751a9866bf558672fc68324438f12d83551ea49b358cf873772ae7853b53c9627ec75479c746a116c5e66b20ce0478c490946a0af4a3a3138534c2c94a44bca955e84513f548840b929f4b4ae51d53d52225a21b320d0d8b075358b019720c325814303170b627fd6856a149214eb192659d21001d5ba6953288e5a62d141ad5ff31c413418f332947f1441b8663f95b1a8ea35576e725a83177126719889651e8f20a8fc2392cdf55976651f1c177c5d8bb035993b0f2ca020a8b22b27080c4161cb86abda574deb0c858d14ab4261b1b8718ac12c56db9071a5acb00c4b1fcc9b9880917f53cc12bdfc77103a45ce8a2f4875c7e3711b659b967c5c26497c6e2903198f36b01c56ac5d054672d6914498643ae6b5bdc2447300737883306e4250ec445b543bb06b6113db5369da2b02dde3a11b2c080732979676040ddb2941956068557e65e0c4ae9c2834671f9ff65c246b31dbfb82720c8f014aa35d343b8eb762219b0eb802637574724595ac1c92b85e9a416089a2366ac9002d01af606ee9b21868e72ba96c6d5adb51f97c778cb8653e30a253b333ae5bb600a2b064cc387b38bbc0379c77dc45f7fc45fd060c60bcac60bbc794d18a5a8ab680a0ae202c97c3f153d07058017bc0b74458959c2a358b6c3733c60374a2ad540c75785ec95cb0bc125df1e8359af2bff55026d18348d0eca6672a87671925a8568060c09913993fc6f89e2523023544938a573ad208761e3ba85354cec6d999ee1c5f909bb973e0780c84101cd3cb42319b0d5614b9d103be8477ee9713cf943e038a04259c0958376c1013445731b0a5224402845499f30449f0800de86b614718bbe333b4b8245fc1a8e0c43eadd61f11f532ddb7551686cb8b054b2e90a19c889ccf68394cd501fb92a7211b9b599b2a2b637dd4246a7b8a5f713acfdeba03fb513f998177dd8cb216aa12c27ac3a5b84491738e5a745cbe7a3b5006bae6a08b0cd79a2b27af3da8ab021893e7727192e28787a052df8b434abb0f3a5866368991aba8ae3c891a0870327c3967eac16e8bd725bde990ef882bd6e5663d50b7adf75048d3202b39b44606ba1ac33fbb7a866a59a8c70988705974ec413abf660d5e98b6d9c60454a8825874953d778ac527578769aede871242b04561ea2d6e5c8aa04ba44228125bdb4beb90ca152705716cadd283ca2fd83ed9087ac5b2c7cba9334fe936c69586e3399fa46a174170aa8db62bd7095736012b49111e73bbcbbc89391bf70af7bc3581777c54d74ac2fd37b453000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 1feb4f1d63f08052045012a21c33c2951b16c4b5ec02c00093d54ded6f94309e44d558787273bf593ac4bd77a56fe4dc30a54eb68a2f473c31c239ba18c9ca489cd50611fcd3be42f6f5069facdbcb7166a64ba7c06ba953142e5914ce20ec69038895c9860e69ce6cc3dac6c1b28d30fe83487d40591995f091d4ea116ad2675e32bb83325b7f379449dcded935027120d01ee43b2208deba910ca7ee635c5b928e5f6167307c813c8e7034096878a2915ed2d20898d8412ae61a72378a4eaee2f227ad5467d04ab884340cbfde2400cbdbca7e07a2f14016fa9e403a2b0ed27ad1dbb3cc492f584a6b5a7525baa628303039f69cf1c1e4db920ef7882de21eda5d2bad76231c88a061fbb2829fe93149c69204e2e783009beb4188fb876a6f869eb11b1c32c2ef15f9aef62f699f9692a502a4d87e5a497097ca73f8fddacbc03dd40a53abf267f749f9ac0f7b4ce9417a0f5eafa91fef75441ff7c887dc2eab2336fd257d4cda373121af864d4707fd20965e063fae456f0bef8f587bb385f8e5c96592c9b7d6c284197ca1706e1961dadf16a2264f74be425ce117a95dc9466474c856adb20931cc920177dc3f8c93d2bb3ad5f7c5517f0b7d141b87a8c287207e64158934766c8845ff0a480da124716b11d0e257206f68f2d4334e8e260895ab83e218e032a35f8d792be7b413b2679f8044e1c0ff67c474ef4c9b7e0dfd3d9bc4252fa81922cb146417dcadae7d7a7ee96e13bd480c96a4314f31fea83eef588bbf1435528c51eaf05cee2f193c3fc234d695ba32546ec77a16b1ea8047498125f2bf78dc9510812be57fe0ec77bfb3e28f42a4d15c2a2f0b54aae023ada92395cf384a1524a24e36ee2e69128fd2ab78b5af77d28c2e9ccd6c706315d46887db0c0c4f28666da7437489e3b245a19fcee97f187327a5806d35889e63940b19249d627165727f66f50aee62dd9496d6493c1f01ed0091e985048c2aa85a3b25a4f90f6e9f9cf67d6961ca246d763d3437ad64e7bc5c58b10117a66c40be088c58a27be4bc1360d114e61d002e271c4806b872f5ef7127217d5af6092e4aedf8b5c40198f266f9e10c560d4873668d58c912ec7ec18d27249f5be604a82d50421d436a3230780419bdefd10f049f404184b3530361c5c0644c3205c32fd451f6c6919487aefb12a75c821cfddeaa14c2abe20db3ac57ae0ee8ac4567db2d1e2d0920fa036351e8bcadbc14ab73d0868df6ab06e675ee193722f93f64a5344bd70593c23647152a81acb4d1a08b62b5f0b2669210d5d7845248d95fe9ccd796d73e34af955d1c94edcd2bba91be211cacb0884a90eab8a0125130ae65318f5419810f4df129c8504def662df4879e2a8df02d881e9990148065942c0d52865425f3239c4a4af51eeb85e1baeaf647e794b9fc04ea16eb328b8b1d0550e5dad8bf6248782b530735f8f5da40cf21241a2d62951cc9e894a339491f64b78d436c635eccb855d3a1f7d64f63f23023620408df6b3d190e7965d219a0cabc0933f7d50d9854e4d4aa7a5cf67b37e0475241a5af8e5000d117ebcea40b526c5a669dea1760d7fc30519148649fb00ca434f2cd84862a2755a99531854cdc847b7d5af3ede653ad6959f49c921d4a8675f7f3f51416c39e026488c297d844a8429caab43671093cc3ebf8730a18bae06f10ff8047cafb8d80edd7630c95d008cefca78f2b08ccb330d36eb33b18cf47bfbbcd0e2f81daa87160f421603d10409b8eab53f1561623f5167dafccda4f9a4e6504a0b5e67ab5dcfae98672f4cf62e4f152d09f2c64dd81e3476839aef8538a86f3b616ce55adf1dfe9451ca48acbe210c32ea1cc574730b37d4747b580c66820caf475858b4b6ad0eb7c06ed56b8f16f83595ee3466bdb8aaba3bbf35a177fd6645610b9dc238571e81b27b94757c9004a4c512cbad25730bc6f85255ffdcd052447766219e667095d4058e5f0045e16c0fcae1aed8dcb7c25fbcaf29a71a8abf72c398a61b1a57bec4b11a8c746bcce3ef0f82b9b2bd702d92a7fabc1efe0065e662270e1ab664cb1197f00983f1d265ff738f63b93d5d95aa4ddef2ea3f473440ce7ca1558b28fd68ee09c7b97e9d4c2052fb1dd657ecf09a2f664de0902f23bacab5d64bd449a0ddab34d4c0695c67ff5f6e11044a0db15d2d19a9ce2aeb818f0ecaf8c1522276521b0193f76e2 +shared_secret: ff81d45deb69b6890f147710945d1b750cf17e876cd4e694158efcaf4fa2cb15 + +# Rho leads to a matrix with unusally large entries +entropy: 456be124e7f43803de5f734ea016455d68164a7f054c003f4ef49e46f42dd8d0 +public_key = 101738f8f11e10897f9b1b16cc7c57ddfb3e4f6b01ad6239982baa07c56c05827e838c1b4bc99f9cc40608e74ed2d123757aca9d8030a0857ee2676db47bbcb1e10badb32508b87aac4c066fc747ad09a52177b378fc1446ea5aefcc30b0d744d2240e5e94c6f12254945223aa93abd8e71fe926a4fafa2a49273d618a0a5921cbde9c6f9648c6c12bad96d080e39ba128464d8f496b7cb020ebb03fbb2850a7118a7edb1bdc438565ca33850c1b1bfa6be29b88bcbcbb3e6675924550a7427035f60000841603c2b4c9f22040f9205c9386cd1b457046b4fb1521e4fcc47c1a0e7fe072bda26946762167d8bddba8c6d04470a2705fc05a6b00c4cc54409499a4859c4148b2a7596c8c7b2e597f0912742794495491117fec96486035f270363fb88511f756238ac9faf98251ecc06e1495337529b209031c0008e4250f550c3d476352ab82c8ef41c4b8203caab3b81335613016cb71b6a1f2c9b71158526cda75d9057c7597099789782b05164d338593b0a9b5ec85e0e6263c6a54d5a06ab4caa6c8db5b40e099f0ec7c00628373c3189e6c129b76827d160783f183ee14151b3b92e72bc4c65a06296a88b9f75948a18d50f53381f59360a19daba36939c3af104362d725c62f51b72ba1c8526c0be6a36930e19de18c2b1e470136cb7f92d246dc45992879b3762c92da6b97c10a552ff7a8b56788985814d2f9c5cd316dde3b2c7329b42f7492917c9174552219719575196844144a04a0b6718158cefc7833a421016b5193a5b965eb7b689698d14a41c03a408f8713aa46a077eac06a6106796c64b67117acd1bc0220125f4408222159503864eaa8824626c5651959d0f4c250c0002ec513c0817a47927ed99467c1eb6091f91773495d70084a7c344f41e0967925734ad846d360bc2a73c96f754b065112f1f472fcfb331eb8a286bc69cc1486d58b2d4932086f40c90ec601035c3016985962da0ca3571f5f36791a466861527a1ea52dc5a6254303971ce841d165985e2c02ec5b6a92278106117fcb377ad2c6c48bb24899a519626c74da9a3b026623417156aeebadabd418a0a8bc0bec5b43316ba7d7c4145016ca515ae19932a50819ce609b9ee9997c29a9af03a05ae9aaa89aa03b4ac5ca887b7b05a14d283a42da27ed7187369b0108165ef403550c99cad5c3cf7e28bef8a83ac8867341b331c9c02176520e0555af9b8047b3753e1928c849a13900545ba7a5c16bb9b6c689102aeb73eac0c5aa093a1f92810472c29642cd2a549a32bb9029961f6c4a20876ba8f4ab5212539f543c9d247355a300467b5a0a9d130613549d17a185fd045495f06820684c86aaa18a89317ea34eb0923d5600146497729fca9a66e9a544a55c1aa6841c556cdfe7ac0959635281c54e044c025c5b466442f15655474928c617a646c7178bf5b679062ceada6c6d702c22d339e0d3a9563a252e36287fc7975725bbc1a68122f4579a34c9c84318b13a76254c6be35a1ac3b26a8c2b373c6378cc20a7de414924a38ae7e8423fa1a66367a14b198f9980aeef068f346b208aecb13d827b3b5ac088878548171451109ce1535eb0a18ed1c1c677f9ca7f60501e1986ac19764849633c408d476540d6290738633a2e711eddc883ecb5111ce01bdbaa3df0f381facb31389249e261786f79aab0a80992b9a74002c9a7432fe88243f4276599389ce8119b846a75dcaa8eb300a7cfe266bbcb3742bc1e4dca77b986be341a03a75644dda25805bc50818a05a8495fb351c0709a5c37a07759dc0c3a253a3c56740aa8095d402bc65554880c2919dc6375451be6186d18da30c2f35ee4f1abfdbc594ea6ac5799c1d9912fb173044ad995d675751294489be7674d84181f4aaeacd9951dd0be79b919e585560d0b090b750f2f667e2ea21e283577e3aa4f6b11ad2560212f8309fad233ef87c6fa37480217a7b3933147daa29d2642cd582a3ac96ce5026135d5376a586f4604a8d511bcf5d09dd3e895fc3cb7d90a2535a1c31da1b1df5562e1b2a86a116212ab10a6328d2b80921c3c04ca9a4a9424bcc3a75e649ab34481561eb0a0920b71c245c1789770df5a7fc9136d4b573b227614dee4b23276af4b6c3537bcca67b59afa0119e668c910060e04e7c94a1a7fe0e191fe22cc727d12dc6d000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: d4952da07911c8ceb643e6b3254f7fcc22242a88df735c9aa9a91fc692f32544b7f30fefed3311dc8a927930c50b17577573f858b778294929b123b180498c22c1ddc92a11cda9c0da3cf300664feda28bff6f1873a682451d24e2c2a5991fa8aa29718a43c2b379ebc7387fad5dc9e3681d233641d1b805b167ae52631b3b6ebb0aaaa6507d4a87a808a1c3b62c97da49c02dfa2c729693de194a1bb1643fff14e0fd8d3749ad33936e8b4f8f6f3106c08a8098c6b903d1cb70c2636571253564fb7dbe54b96b1f999749d0c81c698934756b455bc6ec918ec267b5e54a0a812c62de971d8ccd93e4c1d6752afe3d5308c5257abed2b1c01d0489bc1d5fb5b2f4b199cfec784b2bf92dc85904cf78a9a6c0fc3a9c5c1640f905fb8fee2e08b3c0d5fa029062a5d41c82c512ab0645e7a1d728e7fdbcd95ec59d121fe876b1e6d624dba73cf68f35b23bfff7a435a5afc81947587b60d588c54ba0c999242830e568c3269bc96e001a99edb6ccef086abec634d0febbbaf72d872eae8c5606e86d9bbe279395c5370647f245351ae41358cc26f5447c37f959396dbb03e484c80dfcfdf93701e849e081232e85eb15e034b5421dc63c62190ea54a83ae06c89f395f7cef8eaa41517345a3a0aae4705529d3c2c13f71418817287c860f062c6d0c5ee918c50e613164dfd241533dd08928fc695f3b3c45cd75c740f76f6a896cceaafc9afd64deb69db89cdbd589fd6987b1f5da8b5b9115d675d3ab6cabcd0f793f00418c97b673fa31b851c1209140f76492359f3580c0e4de09d2a3efb2b3dd4afd4abde0e97180b7b24a45063f07f82771991fd2da92e12de7a868e6e84dca6a318dd8ef3a1ae6420d63051306d0582b058b7a96f25766aa0d863059483e9c7a17748a268e896f0d02173606e4381b639b480fbf0b3541a7c1790e66810e064cdc9d4e176cadf3d64ac27648467cd0b8643ad1255347cb6b086788f6c4dcfb3363cfef54c3ba5c13562ce884b53b09e6f149a60e1fbb35b65261406ec04f4146b2de7c61c2fdcf0f714981308774af933b710d1d4f315feefa97a581a98dd083a4d31749e5d0af2ccc2109cb739f8bfe85e4e7844dc3907959ff3c04ab9edebf3317f354c5e0aabe4de2e0711ee771b8dd70a3008eb9936f8b6924ec0dc9897a801e00f6738ec7f31cef0db9608d2c3d3683e97befb02f0ecff93068a46e57c97201608756dc45ca8bad93e0f562f5d74790c87d4ffaa67613b89c22339115d7499a2fd038bc4533e46bfb5eef28b06b8fe9a3182c6a8b18286edd1b57adeb55bacebf7c842d527ff5024c0ffabbf78eeb956a5127555894ca8459d99df31fc0fd1e1c5f7050d2cfb427dbb2f67530e049e23f8310b88c39d25dacbd6c7dccb9e382b0b471980d54974adcdb082825a9d6325cbaf90030a58193d5ef0a4e1e8fc885f04329253408b4de1d25acd097ff10e0afb4ff344063edde277e49b18996cfa57a7617b395a54731052a95a3cced450d38a31f19811ba278c60097aa1e3c91e87c57486b23ccb07d687c48fbaef4e814f9500b1e6f679a749614c86197239936be1f7ad2290b9a421c4f2fdbd4178a75cbb9cb1f7eddaad9d369f79c0e383fc9ccbbfd5e4cb93b211c477cac2786395e92385a4c0815d0ff6849e961395eba07c86e698d5f62466492efdbc326ff7c955840ed2877919d1cf95cdf5f557ad069363caa905c97471c85c5d0e65cea1ca90df82a0f8ef5660f68191c1aa19a180d18ef4a7b0dde8250ff3ff0a97dd4d65c3faf1e3a426f6c4b64f1f2d65ce9c5e5921ac20197a00f2331e810acf4f6b71878f1b785a28970d844ab4b6d1a604824db09f15e96bb711389114a4680b1c8b19be73aa5b039116c7a7cb7d2c2b026f5847afd6d2ac804f4ca24554f5ab27db900a159579efd23d78cf5542a038744cd6bdd64a3b59d233b878b383bc0ef38a0a2a8ab60869b64634df1cfdf3b53a367d3bfbbfb741badc819cb01823a8e8e16f6b4a35c380f99cd45af0edabf9de4fe2e5b0e6c34f7dce2c8d9a4be2b2b8951c27080aa965ae3afc422ddbefe0da8f766c8c63823050d1ba055e42352d305385ab932f99c0309dfa8d6362ec1c07e33909ac63200787f5963653db6ba2994cf308c9763a153b6ba824fb8ee94bd6a38f2a12047f7e0b01d090aaa41b4acce8396c18aece73cce364a7e6d9d +shared_secret: bd452a700448a4542a31dcddcd0bf285610aca6570d8bc85e20e163a13db5663 + +# Rho leads to a matrix with unusally large entries +entropy: e8ac9e76377d67d84f85a142383e777157805be0d0f679ba89cefdfa61583780 +public_key = f6036a8efa3d74327dac2417e6fb05e2f1c178023b70214296c3ce65151248533f43a4b50826b181bcb51fbc54279397a6e50113635faca0cf7439be90867a4c548a9af0704da13d12c7549ebcbe5b279afc266fd83b9c4222b717b86fd4724cd0a35238abc2c3390695ab975bd38e0681b67bf86f36cc91af700277998ad3d700e6419105dbc952144561137711a0acaad546e76c66ab5722bae1cc110abdff7044b662beb6acac276317a7799f7ec6bc1282c87cb284006b3e74c361e5c6c8b899ad122880a1219102404fad458170f8aa3576750a9682c830c7c8796daef63042f3607c5c059ff98b7a093ebda2947b861f497202510a6a2cdbad3d7ba3b8da61f02671be3410549aaa9c3140635334f6b4385cf4105ce791db08b73f3ccebac9ad93f1c7abf6289721568d601c2cf5ae2e4690ae0c77b66134f3e1c33bf82771491da4d228ebbb7077312babb47e1262009457a3caf60f0e47145e29a3ec3b37a67b9b418625142937278c50344c05a0a606fe43c229749415064556a55dac28321be77a256637fe2b8dedbcbb02a29ae505c641b004f970b051e028d047cd152477db673875148b71434a80221166698c3cc589374634c06110320b0f249a3ec4856ffeb478979533be7a333eb144550939b00164b6b1b545905612dc24775ac2e4bbb531c6763f934121a8a8d804951b05c8f9c9237046245b422272288e333970f7469a78d543132055c8781ee308382398a7bff70f62b7357bb8093624a3ebe3169e957f3a33019fb0296ea1cebbb484e87b04eec76a3e29cb38b451816a8feba195dfe79e820591d7e73c50139e2beb847ef43e42ecad64b533ee3857dcb35413066c7eb19e8c1bcc42c9959c13ccc4bab6ac81b44346261ebc74af482e34f855e08916e0c1bf33861fb6d706c3a5c03bc62c6d97cba4174b2441a32ce47db7b8703452bc4693be69a4c539c6a6b744211598cb644209e84a711a05b9116574c7a222bf459305f10a68d4c48eb72ea16526ff7619e8391032685e244693ec24b30a257511e00ada5a69b6cb75c2983d53157fbd708fa1e54057757bfe6067d242cee6492a51098913a6b2bf888ccb280dd3cc48c6a95ceaa5a844338cf4985978929e9ed153819b97dbb944e18c0d7530a09cd420aa7ac5f5910325d02368c602d531289db188d30c6fba407f32c41e80133cea869b52e8091f701c3d7a7d4b317e9b0291f05a652165695130c6cb783b18ab1ffeba0f72d2c21cd9844f8ac2826267081a4315927d9ab6123fdb0193f723a3cc3738794f735b1a145b83189b71c597bd8248ba511b9463b9262c80790a09167720473fb77b1da2af8632ad793c10d1916868b99d2d23a06875769d7151c9a524aad51eb4f20bc58b4c572cab2642769fe444362533a04c7350b3c5eb418785e13e05b5459ca2c856b1b4e1b266e9677a27d29f6dca61a2776c92dc9290c04d77d7bc7cfaa8a31a581a623cd1c046a488080ffa8c13f66f4d262aba53cfcad64313c5c2fd838f88e903fd3c7da0942fbb3c84f4581457252e8248a75e185d4b5b64e0634b2ec5c5a088a6251c9c8c76837c95c066a565f9fcaf0cc76a79e1a20fb05a5bc1bcdef32deae76105c581319bad317b7991d062ba1761cf1accc2b969ece35274d7b6a3c8c79142c43b14772ad96fe2f296eca5c9aa4b68cf14c584792b1e4ba1132aab4de7788dd642e307a6b2476caaca69a1f7a3946404a440764e4446c20c216da5965c88bb9e09c165b93845c68a5674105884c46c601d35737649815de052cabbb31b39f95531286e08e64772213280ba64b6467d03ec43c5911854498656a831a366cbc256813d451153a3610e6979671ba7bb7ba41dc832a81885589974f8ebc2e57a1709eab2ae9931a09bc97d486839d6a16b29b7de642aaf1861c31b6ebe82891896b4e75b2360a776678aab892b81c5e2175eb588885b980ca02e9ae7bde1dc6346a13a5964c4391b4a3cc776d9311f0a9706c2c04584d05b58624906417eabc95738407ba197b2a14c6e4655396575b585f7c2a8b262cfc7c7d6f3a1fcbbb4356195b502ca7b278133614379176f3f4aaa49a040c7672cfada79ed5a2400dab4d050560d8a30c3e57ec6411988e941622c64b934833f9225daf42885a5b1f7909d65b5000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 021a27d9ee3c76b205152ced9c68003eedb09245954d50316a14a3e1d877bd9d6480d479265cf7a693e77b8761f11a09c1c30d2fa5f50497ae6a4d2afa3e61b0b7fb4b3504024763ac6c10fc2e6bc77dda7fd837ce115b84b1d0c749e8e4a961d3e7de1bf6b36741be282f9df710b46410df07191c3207dd9e74e8c4d43e3c75607966a1894e86caa95cba51a9c3289b00ad0fe59c034099b822654caec138a1b06635d1de59fd469ca3e928deb7873cc3dc2fe03aa4b5729f91b940f01ce83ae5aedac13d0a961cd9420584346346955780974ef21ccbe3208cb019f050fac0b80076b48ac6c0f3c2aa2dc3a13b914ce5343c7a140186728bb335a47515d361466c2d78f3fc6250f13a4d4fe6c8a587512700fd5272c9de73eb698045708e18b86d6b6692e3afa1b73e5ed55614dce4b8e71ba9dab03a246b1469c617f5bbf3e502632b060c7c17145ba7df290ec310661480de58a56cdab7a2e5a8e298746eb1b7b8703c5c650456c567056451e209148059a59af315540e448c0c6a7f48df9e22f373aca8be4df3bc9bda80e94a92634a612afdbfced39194e124c07748328698cc21f39de459b4cb08c6c73e80fcb6d0d86adbea470a207b0575f180ddc0d658d7ae66b2166cdecdee265a02e56bc4880797f0fe09c081788f5bb507db2406f37a2743a3c22ee0caa51ab62ceccaeaa9e189ae412f8dece857b0faaf61f81f2bd968d0f6c9048fca287f74d954e48ecf05806a695d06bfc66ed8b5297899dd4b3942424cec559c33ef0da1ca083e7eea98585f89003ae0ba98fb3f51becb80094ba0091f97b3a32c635a12308851e070f4a94502be51fc6f4e11bb7803cfbee43135c82bdd3bc82d58383636eee387d2c13c1866982d7c4f15f0be3bf5f87c8fa5d43daba703c73135ff3aafe4cec43abf9c1bcd16e56d6df85fc38dca4d09245677ed75b585722a9b20fd5ffe9d0436b3fb592ca6982ec2b96a8af589296b0b0ffcae14ec9027d4815bb9b933470a357d0afe5aba5010eb0d93a0fab2c28f84d7091e607505ecada258a551238a2ff68621bdf5ee1246c27d6e8673f1b785f7abc9b88310e3c1ca5e266f2c974d1c88a31e27a102330f924fb3713adccfd09c4415c1773c8da37e4e18ef274b00d462970873b54ad108f588c8bee6a7b4cce157109aa04ba0daefc9b5119b3ff9f70d4728574cb9f57573f41760248a8a8cdbbf7492083cfbf585c844f03ee2e08da4a08d04717b6244b63bbf80d0f4f0477f94de7ae6b2883388ba05b27ffe8a497541f012f16bd9ec50f64cd0d14e1a6c2be8c77ffd39d1d19ef402b46c0c41718ac406acb1b71fc044b1f93a4fe98fa8a0bbf09caf9dcfcbd8e8ecba42e4bbac9bb5de40f089b86ef71003b92a3fe385bfe603b098185d05f43819f8686b4f4e14a75463f2026baa66789edc52610ca8d3d5b11f10672c70c80effd7ba0352b2079de6910221ed21c487a7367cff076e84e1cd3ec625065d7a9b8ce4eed9d91c8a72b16a4a50d96b8a00921695a00167b53471e79aa445c656fc0d41da64d836ac21a34be767c514d1571e500fcea435d1a1d59a6d07140ee4d1a4014cfa8a6f0be9c334ebdea053c842a06124dfd165232c1a2ce63babadd8a56fd78ffbed64b63bac3b49e5af81c746253bcfdfd045deec785e0e272ef8c7151bcefdad6fa2bea962d621abd97f9b5cbf1eab792139d16b51e1f732326a5e02926817ed0bc4c6c4680e42e7d5847d6e0195c402e59290ce8a8f040a70980eac1a0bcd3867ddc0f2de9b204514011491c8dd63a371d331b2edb870e76e7ec5b27146a0097b969a6b157d00f66ce53b71598b71869063b9a29b23f3623837385571962ac29ac868301e2ec0643bf639b074c8a28f0a66acbd0ad77e5c86d01cabd8fddd77a4fce6185768566a6d98e679986aaf9978c49189a2ef1a218977f4d2c34c5027188d816cc918061ad13421be77fb910ee5aef5e159fb74169d7763b446e523470409c4fc4e76aa6d98f120013d4af284bb0a8e9eecff71b8544f9d3815062173ad6d4e9c4727cd6395bd3da54237501c73390cc5c48683d780efec478d2a15a40a5ffa3455f52c092993859fc8ff9c1ebb308ed03b5b88f6de341c3be3ddc96f695d68c1562b85806e162f1b07c5f10a1213f8d85f6b7d92e06d664cda2ddba47b93e2922d30c3bb110405fc7dd9213812 +shared_secret: 8d99392e447dbb7f7eefd329325bd71d1d984cfb01fd609c3283a84fdd0f0138 + +# Rho leads to a matrix with unusally large entries +entropy: 2fe6b9cf4510f212839e348d671b3345da68a477f57513ce363414e87299a717 +public_key = 2970cafb137f0e7c060db72de03a46d8a860b0cb2a45b462e5530eb566bcddda2315a633ae5054957cb74df537c30777a547b0c6e486787c74c3d242ee34158b212f4fe4107885b2d3da2224803e73bb282cdc8ca0365eb70751c3263531b31dae5a29561316003b2d781790cdc2ca09b65ed19995765263f06c8a1f3378d46c19b1b46a43932952a37e4c828e99f95404075b013b7471070422fc65f9c9965a1c0cd0141472fc7004f6319b548c19929f792ca0d588208ba4628cf2bbf7377ddac05a058308b7fb92cf55584a381204523a460310bba06a88d4b69cf62fe2a71097461a8c3b5eb212337887a34fcb278c59931f28a0000227d9cb9b1b3753dafa63e893c9783764bd01b7f668b83cea1e7fd94913a405babb301ffb6b57b2845cb7cd929c0acc7540e1bcb196679380822c7bb67f732a3c9ca778b60451fb03755ba151e6b0bacd1129df5174ebca123805beb8e91b840b70643713272ccbcc2b80008a46b3a818ccfa6ece2c3364f373fc8c10ef4b4c95955052f99202362bc3020cc2528486784784095fbe10b4a44732a2c6c0b2b50d199a93c544a00980baa2f5cbcc6a3456eab71c2798d04c9a85827b8b654c962b7e4125cfc0f82a59632462d656b9b96188cc89373a6165c287bc890d5ed9500ed08ec1f2822d718bb94525ce81cb48b4999e288b5c90bb7e3647ab26a7f5479199f9198fc950948605b9aa0c8d0b133851abe4d77aed7455b70410b54a00bdaa166f0b4712e3916a70846840c8f3f9c80c8a95c912bfef188782974eb372795d96cccfb6c9209cc2cbec64bcd064e238608ea46f841ac02d6aba8ba9bb251a381777b50570a5c79257a964190e56aba3b27c708803a2e6909a6920f546c509a7524d138a9c2c839f34a6a814b10ba4642b7214e447844d553532804154b36f688715b203cd576274445c98abc60192f603d970c988b42d6cc250b4349f2d91b50c123875c608c932a7f85bae2cd54b6de80be13914f2606cdd9b03ed83219ae5623748972a657e0ccc41579b745b3abf6b04b50b945f2f2963504bae804a261254ceedb767e252c64908abeb94669a94cf511b992c475d99939095ab9b19f74f75d30efd58beec598352108e1ca648b5f31bc7071c86aa97c5fcb60bba8884a3c72414916bf68a277a82b78857de531611ab7c7a111a632a64704458dac97dee2442b4b05a378baa74f34154bc8c191591eb2196a4d3174c3848b5f02f2351211f605b2608c9fd8a101b658599b87c65a3c2c7a266c02b3b8beab84feb0071c25a50b23ec8acb1daa290cca2ad6fbc8280c5cadac42993c083a25338150231cd134548661d645c678bcbc0e7815da41a14e8eb123c482e2831a1ab0399ce02cfa1a39a41c714bd8c9206d6c8c922043a235cae2bb6dd1ac430e22947444ded7447e00a51c13308365aaaf4da9dec03495c73295aa9259d4529eafb67dce58b374066796983f06c91d034226aa75afed116c886927e135564e4000cd86016346b56d9864c7abc6211a72cdbcd32fa869cab01f1da8f6bcb84cf1441781c6baa263ea684cf96a1277e2459ea07c6071b06093985b047b791ab6e6593be230099308a79376bbbcd71492a4a4de83a4d70c290aa05b74a8c80fdfb9293317d10e07615acc85d762ae35b187c55060c912d9a2a09e995afeadb874a5526cef75fa4701e9e0a5c082b92ed3b8887f0bcca362b492369881373ab878d00054027c4cef0c07cae57b30fc51e744653316591b5845c0a47492378764769cf3846b263ca6e086835cf0197b5025b2a960097e57597327f28d4b2fbc6bb241863a2c96d3242a031171042fb40afe8a75cc2976903a603b96019f4c7420b77625470b62287e03239e5008c1297888f5322937457b9467e52937996157e50764537ca495ac75fbff53dc1e8cb77002aa7988604b0829976c8e49649f7446495a7548227ce61d963da3bbd2705a8dfc73f091c20e72b77f6640a14aaa30134a1b3fa7083a50cbc720bc9a802a4208568e2a2ab065db245628ef2a138ca1d71fb3f66d6a8aee513f1c80b64a0bf38f01f4979a975054dfca823c4165aeb1876a7a81fd6920974b516d6b3a1aa71776a264a32447240855b84ba0fa1d35f07a8c11361040da933c4c44e88417b585c1a1605c68ce4000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 6899d650581d8ddd73d6e7095d24e2962ac573877204768c66a78047649ffd373d4e0cac20e0b98675e6f50962871c33957b5a7ba2af2ab800ad728c2d0e70877cc3f459ba53d432d45f4c9ff4c951c35f14185e01a1fbd735fc3ed84063b579e69c230f41af67c9cd7481fea81ed64bf248c63f56f81115ad8255a172fc99d87d8fdd6db00ee407618c7877a2486b6fac3b8eb7bea62c24bb5c5655e47388f2108ac36d5e55c5511d72bbba65706ffdf297cd0788b4c34ead564e86e78c605359b6b344380a4ec73a4f64b7866a2eaf36a494c76adba39158a3d1d3b41973cad055780ce211982fee596ba61e5e5f7e44cdd8b1d6f866c708d20403760b9fd4abf31a0573afa130aab5bf7493b2365ef5437b7824366fb3ec967016e2da547eb61276be7c5509c2bd5e16d8812c034f6b4c5a7f5f489137385ad5697c4312042303a5d7f62e398bf5fcc758ec1475e7ba671c656911bcc32ddedfdb07252ecd0eeea696046e3fc9e564b2ffca11562191c4a1e4b31d9494961fb66ad44f24c4b0d8d7422df106663600ba380baf53007b6146c923412228936d7324a87050e62b185bf3700959e262fc64bc4f2b55402d57c63539c57272240f4725ea23d389b17d6af64e864ce3429c9c0514c9b384d79b830a9c6fe12f8781755d53b8af9bf81e4784d9780ba6ba0ae36f89a99289307481bb3955075057648129349f1e0ce4e750be53372f82c92230127280f0f393150c89715a43eaac8abf538a031155661b489b066e915505d59ba40cc0b5a4b8de7e731533fd06dda44e65f22b7931c4b8e34a72331d32798aee1c16d81e06eeef892e7858ed2e9c27d21a3030567e40a369e21c925a26712e1ad6344474bf8e9539027040eb4b0cf65b627623ddf81253c6cf002f837673d2389cd296f9abfcd38a36c6976b03432c9100c7ce9bc862d2c98a6dc2f931f62e471369bbfab644f8ae37deb65784e6f5414bf88cba9e6836d3fa3c0ab7ceddd81d31e94c612224270fe79048688b6d8d46acc7d656a647888a469fdfb6ef8c8daf78a2270c5058e9b87d2fc0e4f8a098c1cebf96e06ff1edb382e545387b2314b2f7d4a669dff20122a0165c285258a39e2a1d27c5eac3d79ce0cdc64dff98a8633882db588a34b93a1403f6a739bd056cd2d6531af36a2701acf47617024cd1cd4b9b60a02cdfcc6f34e4693eba3bfb32780c573b4482a5f6bf109c7ee51792252dc119a5e41a4ea8f25557b64e500a83a6d8a839c456775a9ccb906a733391605bc487bbd6ea7272325df31cce2093649fa8a379f4977801240ea2be8b1e6a5ac95ba613bb2798bfd1cedfc34c39e1c43cc094f8bff34607f8419bc3ef2fc0c37075dc49280656304d2f642c5ffe86d5cdea4fe96cc8b4451954e5d898f6cdf7e7ec5af447dbda66a254b964df9e8dd565d46cdf04dd2d19ea1c7400925be2105e45343baa9855c5236dd70e042d0153c904d30fe45d087b0f0863ec603ad74baf1836b18c91d98455f3e6477936dba7379a6072744be6d4c64bca89ac3334ba727e0763f0ea52faff3daa52de9fad1f27e566e7a6e85914a02bdec5f7a8509f80a616f6ed66848d4ce8920757fb7611ee7c70366ce847fcb62a94452dd2523daa21c759f36cd31337afe1a5c8e8ce8799c6f03873f58bac3649e0d0fe6adea0199ef6eed64dd1e2fe0bc606b97ec8ed1e0b567baec2816273b7280ac91b05fb25e7467e934bf79025f5b4060a813c221291cb307f7783d5877987124ecab1d9d8c8e36c10608871a92e8878220f593cbd4ba61c35d2805500cdc0b145cd6ad2cd614481edbc913733e3a5104b0006dd26e871df58f32047701b2420d93bdc2d0a2474f7d9927e7f196993d9792e30cdff67ae89bc6a27236a6f0ce0439d4b04788765943c2be5c9fbc0f139135ded84ce79d876eeb37f30371194c8eba42659c185a10c8941f9fe9fcc722183ba7e22a7885a66d8cd10f214f4534171e0836d86368cd04d87737923da8801166afb398bb345b5bee89eb512cbae07f192aa50a932a5d92e909e65443f4004fca49de5eb19abedbf57d066d134e096e7c63defe4430f8e1886bdd3cfb8077f7196584398589ced5670c7be91d715a20f51603db8ef35724805eb1c270cf16b282ce7c79111e4577a0a1a27a435c070d6b3e89dce1bdb53826fe9a05d86e586ecd950d27247ceec6d +shared_secret: 71e358b21b3b98d915b70e9b877e94159aabe9df32737c71c50c2f99d7a074e3 + +# Rho leads to a matrix with unusally large entries +entropy: 86630b4f72820d19e9941784183b3a0d770609becd6fe0dc463cb6edac432d59 +public_key = 46e77cf311b99822a8fde459d7d01210db0ce68054199939e8156f8f7c33adf5bd5f2c54c6bc70054a5b8e305d526c1322e49f57c47264091e39eb0c72a596ad5575434c4de07c0bbac32f7ed30a0930221bba0aa75140b0c97a6e1775e1211740c23390f0094d144632169e4a0c2534479b85546a7fa65694610b2fc19488a5833aa7bd0ecbc6dee36997a900fad18b1c13b7cd381b1ca598038c2a4e40ac374615ffab46b3cc992df777eb0781aec573783b75cb426283ea01bdcbbdf8f8b30ce92f46cc7d4ce407bacbab2bfa27fd7792f43ac0ba74b58b332bb915be649a573eb22c12b6037b4a8cc109cb4495a337e42ac82c48dac2099684bd01700b7da007dd8039bd6b09900776cc783ca114358ada02cf5443c9bc6c181a6c86daa79371bf6e6c5cb68b7255d592796bb7b38c5f8c655b2e480cec127a2dd4aae4b23c44d4367de78e74797b64b0ce07a36e73613ddee8a61c5c32f865119f1a60b44ab5a28374af3324e68604bfb33962fc1f06d661119c0a081c45dea91190c4cad6b6253ce560d4e7855a64c58bc950bac88ce61b76691a93be4b81c202768c984ba2d9122cab4880942c40d87022b91c5ad817dcb5037b835dffd916a2b35c09f782ecb72cf63239b6c33bd73c0efd115357b283bd6512c1eb3ede4730284328a86021fa805ddc55c96c1caa3832857cacbeb5353453638ee70669c4dcb6a10c723b18c71dfc44fb5600c0f8cbb35c6d0b075335f6bec7ba1306766591575b5d2b4eba76a84e326b1475b5ece6c3ccea5e555616d38c03fe630c3ce56d3ad73858539d1718b915fa703996ce39745831b3c93e4829cc5677e5a79d3b1794f81816dcc2c5babc859b0966c76c23a4e66f1031634c93b8a51550d7850d5407b4e2d00ddfb5862c1c570b778042986f66ec940c5039dddba773c9a6a3c10e370714d0a4a43300a7b06b01aea6b6a4b5c17e7482d59bb9e1fb16897cc0340c5b65b9239d973c06d41f6e7b9f351a22b8eba6ac1148d91bb4f8959395e6a6ab996fc79bc8f0f7309be14fdb65bfb0287771908244033a3975ce2ec096abb9c15fb40d33a074fa2c84bdf7b1ee94746c42044be55484a179ec5c7edfecce56f9845f29c7c535282759c2d0a2546a13bf56dccc6d4463376a46ed05ba7f54577f26c78e2aaefb0928c36820db23a999e4b399b9b4fc864444d665e58ab24577533aca26acc5c512970c3a84bdd6fa7c7fca6c60eb73a1ab79db779c208c61a2f5311a694dcb7ba37ef7c7db92587d4a77fe3665036531d12c1adcd29cd2ab733e1b2d3ca56a2c7c9f7e3b96d6355b73c4bc4061ce276308b449cc0660b0f9c30fa4a62005f836e182a77e0b74d2b86e3bb6a63fb58d362b9496025bc5485a086808d3779ee28038d1939c5e39b645db160059a04e1b8e0e532686f29d34467fedb02236f3bb0b699c68726961f49824d277c8495c9d804a61f5320e61bc57a85bef199700d18a69e25331c41646abc434e6033d4abb30f114c35377365c51f5173769c315edf076e58710449763af61cc316b5a3e75346bba705db322cc683d5258a249a22524db0e88059a423c9b55d173eca88ed47cc4711a2ae295b846fb113834ab688bc2a42435258b9b1be648c5889230dc153273903e06aa2590ba5d77a63a16853d304933157288e03af785bbce36067c296a18cca79a18aefa33855683becd7b19b3890de40a24d6d389460a4a66378da2b82980e61ff0b144bfd64d0ce294e9816b9105c20c2076ddaa1026c68e50982cf79ba879f630d4eb8df663390307902207950b8b9db571c306a033272ac8976133a641c585d43e730a4969d752072bc6f180180e0ca0fd9c27d7845be15cbdbdd44c7c525fd70b5479c18a24800833c9338a5635034704db0443307c616209ab2172a0bc42c239d87ced11779625315ec168c3716ae62a209ed7096ecb83d7939593e519fff06e99a6a09122c5bf20c5bdc09af2402a3a605318d68c2b31a284b33b1719a4b6c7a5fbe4500ce23f7d858456f47d135a8256c9b40f52c37d07c728da600f127738c027d131b19b0070cbf9322d1865fa515471d461d17c424626b305d68e34838d5d7a35fb91816b65a1f9403771fc3a8f22403ca8616f89995b52425d618a63a789a0dcbb9ac196bd6612fb69000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 09ada15058fa9bf500eddb096fcd572a056beffdfce251252d0e9a8ae0300272e289f4f8868c1f4909b0502fba470989aefee80303e817862fb74080dbd7e872c05bd63162ada055a9f5dc88e9504ac344a517e613113f670c16415e2ebf5ecec2056620d4fd9b905a14a92d4a6af2d34a4aeb21ed9a98d498c25155559fc1b3046a5ea8c519bf320a8e2c0ebfe02cf28bfacb9a6a04c54130d93f1aa33af643d2620060bf578f525b1ece5464114e56c5d21692cb5243f763129a44deb9835f4851cbef64e0f97cc4ffb322c2f3863b26526153db89dca3f55d6727252de17c2021d3da9c1f9e3521f03844a066b047b318baa867c3201a1943c3a8245182f1d3a36b5e4beead76120470b2ef02b85ba13a1dcede19b5e4a7adf09d13e4f873fc5756a37f1ff240f6554683098437a9c374721088c0e0a390c435d8196d94ce94d988510fca6ead810a5da834f86f7bec0e41d83d35d1acae4205dc00a7a9b05779d41c893371bd000e308f70badf03e2f9066540fe2ad85f312db74fb48d054061c869f80bbf9f2c6c28fa691eaf8df27c7e13e076d8a793d7ef70d6cbb3afb059ba176888f569e73426765e4b866148729151dcd89753a68a2e1b76be36559dea6c7e4f8aac70a417698ac9d546f228ea36b01622cfb4405563a43e75c6baf2c626ff14b098ee33b1e9200d7b7fcd2cde35198b3332a3292f32bd1959132fa1510d8f1a43956b1d93820fb9dd88aa04597f65f86166033abd9ffdf9ce1ad4d8ad60d05f298c11f2816a0d375a9f8095aff0725905f508d20b11dd59b7145a101810ee140f86644827f31c64b2a7401048a8a5654934d6e5eb41d43a4957db61f341f5a214d2d09d4fa6fd2cf709264c4a755aeb0aa171a8286e94a354425d795780049f097b3c20ddb6cac39a78f8205f11c4744972263c1a495ab1fd563524f9822deb74a70df9ef5486ccf54e737fba48e3ee8d1c69ecd1c843fc38f4986f8fecfa42be99b056f24a2156a14d10998b4edb501f7edcb9df12bf1f235068b2961455f3513facfaac92d7d5093f00af6834d3e33c5f0271feb31edfa94bb3dcbd1221fe29095d6832f5a5155951dee6ba7a379f73854cf10ef5ad39b1730bb01e315a3c642321a52f4ea7efbd4519ba2192d974d445d6894feb9356a4c4b7512a0b1973568a04d7a45d7a4b0c73cc9df8147a2d0e31d2729c6091bd7a1c1985649795f2cb3b40f4df43e3bd7069683a737347bbca94239bd1e20badcbb702aefb93391c852108708db4949579eb495ada6840755a40fde96a009ed6acb54e98e0f4a084924ef15b25a917d497d25d9032a895a6ecae037af1d6e9f36ba56efc69fb893506a311f1f80b746c8ba0b8e08cb6c980c476a5982ce622e8d7394ddb0f6ba2c6dba68b7c5cd8aff2454dfc92362e82594123d9c200609d2372a7ce4df6e1b7ffa68df7b681c1d5174b3de4eec7d6f1321b13fbf4986b0c73ec6b9583229798801aae096bc5f972e1b3b07b0a40e1280070b2977d6e31aa8f4894d6dbc967a4d0b29c736ab33db11c172d9b771ffe84a8a803306a1b59d7fddf4975e6aef83375299d97d364a7629cf69ed856c689b09dde89fce7ff9e273bb72e768fd7d671d6591c6497f3da0eaee46feb58783f9d0495a62eaeca8e054038efbff4cc599529a9443b9496d1b0734eaa278121ce64d2a59c352b0ade0ffa907846a0ae8bdf02426f270293f1fc40f2b645089d621c18d11fac3d073afa27f20925039258e9d5530137f848d8e3e56f970d523544485cecd847dbc7fd8033f89c04a542f23a12e8e4bac7b9ecd76be797d8195b8f6f4e57b1b779ef41f03739175f1ac5e336fac71cab07f7dc760e4de2a3296c5acdb01dc5096f3f2de463980ab26e6d84b8a0754578de9b0a022281d6d1ae1a4ee40b781f49ed605a387b5176d685d1a29d3581eee4b1bcb050c2567e4f997330105e67f128c28577eee5ba1d170365cb81dafd7b218c8ad0207bcf00a38ea63ea404e3482a110fe16d0ddc8700e185670fc1df89ccc8a712df0c4f69c4db77390f72bb12dd627ba0159afa309e17e3538c313716f7d03a07998f941a7d4b8280975b2c353495747d1e115b770951ce5c924a8adc73eba6bf4146aec3dd27f828266fc3e1fc23f3b5c501404ec19c8030ad8b07d26aff71aef4bd7228728442325c5b880120e1c4492c1166cb27 +shared_secret: a2334b0bf4b86c60c4bd971e673427352bf08c60e7730fcd94edb8c34339028c diff --git a/regress/lib/libcrypto/mlkem/mlkem1024_keygen_tests.txt b/regress/lib/libcrypto/mlkem/mlkem1024_keygen_tests.txt new file mode 100644 index 000000000..63223189e --- /dev/null +++ b/regress/lib/libcrypto/mlkem/mlkem1024_keygen_tests.txt @@ -0,0 +1,499 @@ +# Official test vector 0, seed: "061550234d158c5ec95595fe04ef7a25767f2e24cc2bc479d09d86dc9abcfde7056a8c266f9ef97ed08541dbd2e1ffa1" +seed: 7c9935a0b07694aa0c6d10e4db6b1add2fd81a25ccb148032dcd739936737f2d8626ed79d451140800e03b59b956f8210e556067407d13dc90fa9e8b872bfb8f +public_key: 537911957c125148a87f41589cb222d0d19229e2cb55e1a044791e7ca61192a46460c3183d2bcd6de08a5e7651603acc349ca16cba18abb23a3e8c330d7421598a6278ec7ebfabca0ef488b2290554753499c0452e453815309955b8150fa1a1e393386dc12fdb27b38c6745f2944016ec457f39b18d604a07a1abe07bc844050ffa8a06fa154a49d88fac775452d6a7c0e589bfb5c370c2c4b6201dda80c9ab2076ecc08b44522fda3326f033806dd2693f319739f40c4f42b24aca7098fb8ff5f9ac20292d02b56ac746801acccc84863dee32878497b69438bf991776286650482c8d9d9587bc6a55b85c4d7fa74d02656b421c9e23e03a48d4b74425c26e4a20dd9562a4da0793f3a352ccc0f18217d868c7f5002abe768b1fc73f05744e7cc28f10344062c10e08eccced3c1f7d392c01d979dd718d8398374665a16a9870585c39d5589a50e133389c9b9a276c024260d9fc7711c81b6337b57da3c376d0cd74e14c73727b276656b9d8a4eb71896ff589d4b893e7110f3bb948ece291dd86c0b7468a678c746980c12aa6b95e2b0cbe4331bb24a33a270153aa472c47312382ca365c5f35259d025746fc6595fe636c767510a69c1e8a176b7949958f2697399497a2fc7364a12c8198295239c826cb5082086077282ed628651fc04c639b438522a9de309b14b086d6e923c551623bd72a733cb0dabc54a9416a99e72c9fda1cb3fb9ba06b8adb2422d68cadc553c98202a17656478ac044ef3456378abce9991e0141ba79094fa8f77a300805d2d32ffc62bf0ca4554c330c2bb7042db35102f68b1a0062583865381c74dd913af70b26cf0923d0c4cb971692222552a8f4b788b4afd1341a9df415cf203900f5ccf7f65988949a75580d049639853100854b21f4018003502bb1ba95f556a5d67c7eb52410eba288a6d0635ca8a4f6d696d0a020c826938d34943c3808c79cc007768533216bc1b29da6c812eff3340baa8d2e65344f09bd47894f5a3a4118715b3c5020679327f9189f7e10856b238bb9b0ab4ca85abf4b21f5c76bccd71850b22e045928276a0f2e951db0707c6a116dc19113fa762dc5f20bd5d2ab5be71744dc9cbdb51ea757963aac56a90a0d8023bed1f5cae8a64da047279b353a096a835b0b2b023b6aa048989233079aeb467e522fa27a5822921e5c551b4f537536e46f3a6a97e72c3b063104e09a040598940d872f6d871f5ef9b4355073b54769e45454e6a0819599408621ab4413b35507b0df578ce2d511d52058d5749df38b29d6cc58870caf92f69a75161406e71c5ff92451a77522b8b2967a2d58a49a81661aa65ac09b08c9fe45abc3851f99c730c45003aca2bf0f8424a19b7408a537d541c16f5682bfe3a7faea564f1298611a7f5f60922ba19de73b1917f1853273555199a649318b50773345c997460856972acb43fc81ab6321b1c33c2bb5098bd489d696a0f70679c1213873d08bdad42844927216047205633212310ee9a06cb10016c805503c341a36d87e56072eabe23731e34af7e2328f85cdb370ccaf00515b64c9c54bc837578447aacfaed5969aa351e7da4efa7b115c4c51f4a699779850295ca72d781ad41bc680532b89e710e2189eb3c50817ba255c7474c95ca9110cc43b8ba8e682c7fb7b0fdc265c0483a65ca4514ee4b832aac5800c3b08e74f563951c1fbb210353efa1aa866856bc1e034733b0485dab1d020c6bf765ff60b3b801984a90c2fe970bf1de97004a6cf44b4984ab58258b4af71221cd17530a700c32959c9436344b5316f09ccca7029a230d639dcb022d8ba79ba91cd6ab12ae1579c50c7bb10e30301a65cae3101d40c7ba927bb553148d1647024d4a06c8166d0b0b81269b7d5f4b34fb022f69152f514004a7c685368552343bb60360fbb9945edf446d345bdcaa7455c74ba0a551e184620fef97688773d50b6433ca7a7ac5cb6b7f671a15376e5a6747a623fa7bc6630373f5b1b512690a661377870a60a7a189683f9b0cf0466e1f750762631c4ab09f505c42dd28633569472735442851e321616d4009810777b6bd46fa7224461a5cc27405dfbac0d39b002cab33433f2a86eb8ce91c134a6386f860a1994eb4b6875a46d195581d173854b53d2293df3e9a822756cd8f212b325ca29b4f9f8cfbadf2e41869abfbad10738ad04cc752bc20c394746850e0c4847db +private_key: 433a70ee6950f9882acdd5a47820a6a8163708f04d457c779979b83fe117224701490830386637da332e74b1aeda0b2f81ca4f9bb2c2b02b0cfd680c11482f335acf7b9139b5b88a34e3542c6861377545983343cd829414e47864212e78f855f52390379acc3a62953131b63ee832adb3bf4bf58e247349b5e097e55abe497b15982373ae732e0439ac67d05c7f037c8a739b18140e144c851dc9611f4bcf04f3a2093c197bd63bb5e6190100545ff81db7fccddd9a324b0bac3c2c2382284058f08b961952c094019c10be37a53d5ac794c010a9d0821f15027a1c419c3c71c9a1d28aed02597ab79b875394626ba39adc090c3a90cf75871a65275eb1c5b03372e13a1a23d0cf9374111f80cc83a905622b83fc513971ec8419f0880c3067633671b09b5456ab6057936d19a4a2a267911b000a13956fbd493821da072c04642b0c20da6cc0d9d864a39365dfd64f10187825fa33250749cbc0c905d7b1ff3cae2412bf86b81a817b86baa30edf7862e5f6bac98726e56b3cec60664caa2a7df670c5e207dfac03824c89897cb490eaa76521222c86205169c91c329c4a184d78721af836ad4db0ca78464d4171473012b7d183bafa627585c64be3809d7e6004cbdc79a5460f0ad677cb716512407d3a619ad09543b739547472a706b317a509be5d861fd66c7d0ed94cd5004795c18159e3a33d798711525f1635a68428172923249635aad032b9e56664bdd48ed24ac75c6468d1903e471086c5f1567e831a0508c539632591ab577d324a82429725809950761d8434288c14034f1c06c1d0aae09a71c740a55701c28ff84499f2bb18b6628caaa3fe75ac4de04c6f913900d86c88126252a17c4d303991db0287120881bb88478aaa9af9bc53d3729843858fdb4648059cac82c1a10878ba39823b041bd0e258487b56cc8a3220c1a58bf66a172b5b9a0c632d674eae885a015c4e37ba073680bede7534f3e34b6050c86b21c3c090941f23b7f6731e2bda0e6ea4646771cec572b98ca0a158919adbeb84ce585ff9f25ebdda6cb6f07a8f811232607e7217bb039babd0d91934a8594059c9687723c04381bfd627a10517f5f4bfc77777aa2671ae124f2b7a5f4d5614029197e6586fa8c17e0ad90781bc7bb19a772d5a4efe32cac89b76c42a5ede9bcc20c1898c08a5b0c07e478b1bbc226efad15f2ac737514b8c6149810779222416537ed00daeab177e903ead6b4ac42370af1b1f50ebafaa1c6e647bbacce72c7d0b88aeb0b06fc1a45457a9c187579bf184579cc351c43dff942605aa5604fc85fc5583f6f1496fe61d70d6cde2327fee713d86f29b3afcbb54e9a92a33a6c1ea6ffa309566b0686233c0f3b1c3144890e4f0829a6099c5749cdec84328ec2cb64a7385a761d64b3a23c489343343b97723ae78c7d805458e1620f0292897691704cb76e3b0b281a83cf64490498cbcaf04802416b33c565171d772d3b9354037587629ae14a5c5031ac36671a0d0c91cc0b4cd69d8402e33b9bcc2bbaf6b971e303fa137be232598a4999bc012574c81651b38b38396c1c365303ad25d49fc6b689951a1cc4c6007613065495f97910f9735d4ea4e442acb2fabaecfe1adef0667ba422c954a05d1b6167a263e1275c6ada8385965304b30324040542cf5a451bcafc74788be3b9b9fcc45d4790e2d7335c60a14f0a49d13053f2626a627ca19553cb336a2cb4a455d8ef3989491472ba0051ef7416e0bbf1a6108fa07c161548e7c62331ae5a2b4e4a108a51093d3150821a2fb547170a1b73c43c550c6557a4048a58a2cd77a244234b2235175a0897d5061b4613482dc136414048c11db37eae0a5df87c19314b0e82397a0d338dc21538af36149d93f8b1a11c53bb5def8b7a2cca3362b7fe3a1408a2547e209058c673a7566c26123a6d8b692a5f33ebdcb2624b79d877bce5fa14e42e83faad82e9900553a3c6045ca329fea4a506558c491b6a616c6fd400b42136f44cb0d0257650819018d3c568ef6c60c6c409e70a829287108c1b6a4d32f76e5cc4d104b02438ef7a467912398ea9c7cbd9981589a341897687b516a13307d66c068c444b4b949a17412413315ccf49b99980034b5b8cfdec4a60b9c1e7455aafbf3a757346990cc32b0599ba217a6c5fc39537911957c125148a87f41589cb222d0d19229e2cb55e1a044791e7ca61192a46460c3183d2bcd6de08a5e7651603acc349ca16cba18abb23a3e8c330d7421598a6278ec7ebfabca0ef488b2290554753499c0452e453815309955b8150fa1a1e393386dc12fdb27b38c6745f2944016ec457f39b18d604a07a1abe07bc844050ffa8a06fa154a49d88fac775452d6a7c0e589bfb5c370c2c4b6201dda80c9ab2076ecc08b44522fda3326f033806dd2693f319739f40c4f42b24aca7098fb8ff5f9ac20292d02b56ac746801acccc84863dee32878497b69438bf991776286650482c8d9d9587bc6a55b85c4d7fa74d02656b421c9e23e03a48d4b74425c26e4a20dd9562a4da0793f3a352ccc0f18217d868c7f5002abe768b1fc73f05744e7cc28f10344062c10e08eccced3c1f7d392c01d979dd718d8398374665a16a9870585c39d5589a50e133389c9b9a276c024260d9fc7711c81b6337b57da3c376d0cd74e14c73727b276656b9d8a4eb71896ff589d4b893e7110f3bb948ece291dd86c0b7468a678c746980c12aa6b95e2b0cbe4331bb24a33a270153aa472c47312382ca365c5f35259d025746fc6595fe636c767510a69c1e8a176b7949958f2697399497a2fc7364a12c8198295239c826cb5082086077282ed628651fc04c639b438522a9de309b14b086d6e923c551623bd72a733cb0dabc54a9416a99e72c9fda1cb3fb9ba06b8adb2422d68cadc553c98202a17656478ac044ef3456378abce9991e0141ba79094fa8f77a300805d2d32ffc62bf0ca4554c330c2bb7042db35102f68b1a0062583865381c74dd913af70b26cf0923d0c4cb971692222552a8f4b788b4afd1341a9df415cf203900f5ccf7f65988949a75580d049639853100854b21f4018003502bb1ba95f556a5d67c7eb52410eba288a6d0635ca8a4f6d696d0a020c826938d34943c3808c79cc007768533216bc1b29da6c812eff3340baa8d2e65344f09bd47894f5a3a4118715b3c5020679327f9189f7e10856b238bb9b0ab4ca85abf4b21f5c76bccd71850b22e045928276a0f2e951db0707c6a116dc19113fa762dc5f20bd5d2ab5be71744dc9cbdb51ea757963aac56a90a0d8023bed1f5cae8a64da047279b353a096a835b0b2b023b6aa048989233079aeb467e522fa27a5822921e5c551b4f537536e46f3a6a97e72c3b063104e09a040598940d872f6d871f5ef9b4355073b54769e45454e6a0819599408621ab4413b35507b0df578ce2d511d52058d5749df38b29d6cc58870caf92f69a75161406e71c5ff92451a77522b8b2967a2d58a49a81661aa65ac09b08c9fe45abc3851f99c730c45003aca2bf0f8424a19b7408a537d541c16f5682bfe3a7faea564f1298611a7f5f60922ba19de73b1917f1853273555199a649318b50773345c997460856972acb43fc81ab6321b1c33c2bb5098bd489d696a0f70679c1213873d08bdad42844927216047205633212310ee9a06cb10016c805503c341a36d87e56072eabe23731e34af7e2328f85cdb370ccaf00515b64c9c54bc837578447aacfaed5969aa351e7da4efa7b115c4c51f4a699779850295ca72d781ad41bc680532b89e710e2189eb3c50817ba255c7474c95ca9110cc43b8ba8e682c7fb7b0fdc265c0483a65ca4514ee4b832aac5800c3b08e74f563951c1fbb210353efa1aa866856bc1e034733b0485dab1d020c6bf765ff60b3b801984a90c2fe970bf1de97004a6cf44b4984ab58258b4af71221cd17530a700c32959c9436344b5316f09ccca7029a230d639dcb022d8ba79ba91cd6ab12ae1579c50c7bb10e30301a65cae3101d40c7ba927bb553148d1647024d4a06c8166d0b0b81269b7d5f4b34fb022f69152f514004a7c685368552343bb60360fbb9945edf446d345bdcaa7455c74ba0a551e184620fef97688773d50b6433ca7a7ac5cb6b7f671a15376e5a6747a623fa7bc6630373f5b1b512690a661377870a60a7a189683f9b0cf0466e1f750762631c4ab09f505c42dd28633569472735442851e321616d4009810777b6bd46fa7224461a5cc27405dfbac0d39b002cab33433f2a86eb8ce91c134a6386f860a1994eb4b6875a46d195581d173854b53d2293df3e9a822756cd8f212b325ca29b4f9f8cfbadf2e41869abfbad10738ad04cc752bc20c394746850e0c4847dbebbe41cd4dea489dedd00e76ae0bcf54aa8550202920eb64d5892ad02b13f2e58626ed79d451140800e03b59b956f8210e556067407d13dc90fa9e8b872bfb8f + +# Official test vector 1, seed: "d81c4d8d734fcbfbeade3d3f8a039faa2a2c9957e835ad55b22e75bf57bb556ac81adde6aeeb4a5a875c3bfcadfa958f" +seed: d60b93492a1d8c1c7ba6fc0b733137f3406cee8110a93f170e7a78658af326d9003271531cf27285b8721ed5cb46853043b346a66cba6cf765f1b0eaa40bf672 +public_key: 938a454364cf10a4c719113a23b242bc013962f13421ec0686e32ccb80840749643eb4b5cc4182cee2366717cf77f97da296a185440113770b6f755bc596cbbce021e94306b1e4ae437ab7dbc29527142a9223a8a7cb269391cad8f70c6cf666118830485ccaebba1bda242176559904713c6722c413d5c2b9c2669d58138ed5b23506a71c6182af6939dd40c51d678639238c8c071384c1256ee6a307475bb72bc93976c8976bb89c736d8fb19580cacb1f335b97d16943c0706f78095408cdad77a9fe967c4bca738960b3a3c171680426528a21578b79b226bda19a9bf132998a2149c463932d630b0f131e8096be462080e6d17107704f3b0cc90c3908cd645268375056e6072425b51a46c27a48b9c0db67b025a58ee37b44794430f3ae6cc74e1673c2b1d4b29db5370f590eaf6165e5806376f6a7d4825c74038792683f38893464103d82426593f366f96b023008be21956e6be8a4bd612d4f85239d62ab6c39069aa210b47b37ca85394c19327e5303cc9c54a5c63aeb104dacf67a1c1c3142710dcf682edac82471ba98c81a552ad2541b7338b2a0ce41354ccab879f549cfa58995eb8c64a8b30b6f384ec2e04dc1a11ae04c967f744024d70da780516777a1b1715f22cb1eb3511f5c4c99ce577836489a0f813a99a622390b52e4757843c772f6e75f470305259833b3993919f3aca66563f3eb7375f5883cfca72398b049170ebf0997ff277e44501fb0e83d0c5ca6c701048180ac68d857e0dc5d24b1628433c737b8808c290839d42c6a322250e0c22b81b4c018260d288c47976bcb84bcd0856c40448ca40b723b8144837965ad46b521ec4b405c28589b8536621a10678a75233e2cd59bc6e03f49d93925c5bcc133bea39a7e21907a19840c80225f1f154c270a4bf0206a16c241bf42cbd351055adc8519d38fc9d3b976e2144909053c5843c36b7b247a6ecd04c9d792a6fae968cbe11713592b287cc8b07b73c334bdbcb91d05c7ae4e86aa7547b4cc6403504acaef4c6e5b758f4e261c7624337000c187648325f36ac8854d4a8a1c2c732a0811b39439340e23c33af0ce5090ce800070306834321b5af9e4be13b22ea6655da11427f995a115dc86cda737aa99078407b9f78b914e831a6bec2c85f922f972bdda971b66761045813a852a0fd990136840835f8b5a72c5c8e8a65ce8d3ce957b06698261160031597a29e3388a4f5a5f0b96b70481a2e5738d3a50189496c75a856643899947c955be8871e808030a5757d6b46079454b54d51557cca964379bca5a8191698275dc51cb164f8e508fdaf480031a28afb1c9ccc65da9ac1cdec625131c6630188ffffbcb726133ca563da640c76a6c24105502ea3c24b918c5b818121cc68e2f1b62112a41594a6359876b91d058fd66861b7633d73cc7226b8debebcf90fcc390f761360554acf013ad03911b49b641c73687f4a73f8c290a2890c02c56e2a6567fb03826353d87ea41369673e1f9b920b36203cc9aa464192d01b6d859307927a629a24b34132cbceca487a0cb3c7442aba47c4a077fbe7442c2a4221a200a93e726518830b11b690f0497ac0851a5b27ea20253065a9ae7e6567fc26500edb11346955aeb2d9c6c228f1644f21b34e3694c05016284bcaf746ab6344a10eec87cd0f76a611ab64ec86288c339294aa15233abfb680036d2155fe77363530c3ee0c4b8b74a54e9a2453ca081d01f9626867632870b178d25b831fd133a2ac0596e688652c1772e2979305c5e2a10949bf35bdc08cecd6771b7f659b61960a45054998472163c21d31024c0c24972d5b145608c1044718f60894bf5875a453d4a7c4569c63a2b38c2db6a4fb8dc9289610ef12754f37cb4dad3b66e135d1f75759622cd7fa03c4ba81d71ac9938c9a97839a12d7a4622943c381a048edb26c64926b3a807b644aebc9110c54b06d4ea1cbf6462a55b31c7f5202cca8b7c698d9559276a1a3963cc56dd26ce3c051167f299d80c3a8ee894f134567cea1032c845d79ccd95313f04d6459d1ba72e00cc604365a9c5c5185005f17a0397a559a0b28f31b41a5e0948c81501e902b9cc253f6eba88172bbb92024984fa99c5bab08dc01504556aabe8c81bc99c56fc771ddc85d37b7c50182345e189267934564aa9dd80bcdc25b127f1244763644004e5eaf06b095b892bae095e0ba7f9d2700a50 +private_key: 1df76d46867cd8c5b94b3666ccc8c368ab45c71abc8df2cf74fb3070095902282b41a698b405947354664df4727af16b549209329623a33889b41747d56594b842be87f40aabb37bb457c935c5a2fd3801694433fbb545b35b23b6d17a8d9aaef6d31fefe99d8c7c2030989a285900d8fb78ed65c97428c25459195890406dc878b2a98993664fecc960237a2326530105f78bb0d04a00030e6ec0a258d803a00844753b8bca802ad335648f348fa34905681a72a8e198206613dc285101499413267a5588bb4331120213bf3dcc0efbd80b70fb08bbeb6067e617d380b804bb6a4e745a97cc8342c5cab4208390147bf1b87c6c4430d8b443e45c101ae65fd9c43798a082aca969b8171b8794c3e442096a139496b9a11e9821afea868107006e4a283f60a035485914e9901e843013d36c36b35318522cd69c1df78acab468336ff89ca4a787363b51f7b62468d974506a245049c0ec7092e7c9368e18c313297a92a292926902d34b0890192b50cb3772a797ea6918d380b1752b8e1e0a36b41a2f865b73a8b3a36d68446ada396ae000898035c40cb4bbc76abe0240392372fa6bca942c4112c86eaeb60a548326868b80af6a8f9dc506bf9474641b7032994d641a3d1c45b8df7c2fb3301003f6481f00622932309e860fcca71f7fd6c38242cda0a4a589e4bb791294a6aa9f85959e91b0b5424a61a974ce29d87c7c0c1b0d7ab804690e285952cd95ca150097a7c6aba8c878a87b883c52b2d076762fd424fd76c074873fafa03d0d98647e76b4fd994300850093c2529b3b599d33692935ba09e4156052916833bc0c13836110bc134c4ae465acf1730a01e261f2d3b1156288f54573aa6cba8d161e533b50c56a2ee0fa04676b83489b742d492aa6650fd658baabe309a860967a726a6cac46bdc8893215160f97c3db16cde48a684ba64fa34a7c9720935711aa4e3bb0fea7b14f4c9a889b9a45024cdbc09f3a971854b5ba1f940712913284516614277a1df04a6a583873b154f4e68151dc8ecb86b5f58842fd31491e4422db7b7059268030c60f4ec3bc1b37b076d157c2c014dc52a9909505d99180b259cfd3204a22825ba2051e9dd4376e7502b305a208a98a2bfba19ad9152d3853acab2c48551ee998c84649c2c8e7b9140bc67cf839c1a49389c0aefb2120ccf6b7cba4360921a0e31b7eec4335926788af441280b4accad52ae014493d15caa20246cd4434639303fb5603f282b8a6f0b1fe41098d28c73f0b74653cbe673340158492d6517c514218dfea8bbb4aba8f741c0820c076a23b170456f8d8598211cbe6a37c15e6c38c905b8ed8430db09982ec4f6c882632383adda285a08bbcbe219947e96017c8bf3b790dca66b868ca729df23a8125bc103b5eeea6cabc6472a07281de58cfbbcb319a7ab27d3a5f5c268bb0ac6587e7774a2a437541a28c84a8c1b986b1a7204fb613cd0067ec26458155923248bf0c641fbb4c4219941414895f60712928fa7275f7a99ed20e6aa7a2e3637d1fabbe65db9dce36b1df2656e0284d3c5b4c2d789802c97515071a8f7c31b5501f4ff492cefc8c7f6b0937da9e02dc6a99493ba7f7269a32b610127f89b6b94020bf58a20ecd7548009d63331b2f4908499b400357c30f1a67694de351ff5cbb4eb553e4d523568542a0e241a6ecc8045caf295bcb12c55861f7b5e5151e5f4cba28d54859619dc04b96b6b3a2a2436d921bc4560a4c4df68a34413733761b8adb790fd95a6479351bbb7cbb17a528ca14f0c31eadb195c86397beec61ab8b8ef9032d1ae0c669fb1203f554d2575e25e45bca0767b0821740eb7aa749161e485152b68d5a8c0c53db6ba6472a34016fd9067d07e8745e66785949a4be88573987aa91da5fe01387b739415b0c5d03caa04089812c85829dd43e9b310ff5887561c7aaf64b1368862050b157e0bcbfbb659934466a3b1611633619d7c2855553b4c3934c8f410e7a097a5b591a76582aef355c57a076a00905b6474626e33ac9dcaa77e8a07bd9509f5baf27bc54bfb8890ac4210f8bb45342350acb61c34999371614d85c7cc49c92e54bbbc94389663053b74088984b1b2d6c335c000ffcd21c9a45a8d377638f954a5e132563f62347614f10d103d0a58408867fec69c50f595c938a454364cf10a4c719113a23b242bc013962f13421ec0686e32ccb80840749643eb4b5cc4182cee2366717cf77f97da296a185440113770b6f755bc596cbbce021e94306b1e4ae437ab7dbc29527142a9223a8a7cb269391cad8f70c6cf666118830485ccaebba1bda242176559904713c6722c413d5c2b9c2669d58138ed5b23506a71c6182af6939dd40c51d678639238c8c071384c1256ee6a307475bb72bc93976c8976bb89c736d8fb19580cacb1f335b97d16943c0706f78095408cdad77a9fe967c4bca738960b3a3c171680426528a21578b79b226bda19a9bf132998a2149c463932d630b0f131e8096be462080e6d17107704f3b0cc90c3908cd645268375056e6072425b51a46c27a48b9c0db67b025a58ee37b44794430f3ae6cc74e1673c2b1d4b29db5370f590eaf6165e5806376f6a7d4825c74038792683f38893464103d82426593f366f96b023008be21956e6be8a4bd612d4f85239d62ab6c39069aa210b47b37ca85394c19327e5303cc9c54a5c63aeb104dacf67a1c1c3142710dcf682edac82471ba98c81a552ad2541b7338b2a0ce41354ccab879f549cfa58995eb8c64a8b30b6f384ec2e04dc1a11ae04c967f744024d70da780516777a1b1715f22cb1eb3511f5c4c99ce577836489a0f813a99a622390b52e4757843c772f6e75f470305259833b3993919f3aca66563f3eb7375f5883cfca72398b049170ebf0997ff277e44501fb0e83d0c5ca6c701048180ac68d857e0dc5d24b1628433c737b8808c290839d42c6a322250e0c22b81b4c018260d288c47976bcb84bcd0856c40448ca40b723b8144837965ad46b521ec4b405c28589b8536621a10678a75233e2cd59bc6e03f49d93925c5bcc133bea39a7e21907a19840c80225f1f154c270a4bf0206a16c241bf42cbd351055adc8519d38fc9d3b976e2144909053c5843c36b7b247a6ecd04c9d792a6fae968cbe11713592b287cc8b07b73c334bdbcb91d05c7ae4e86aa7547b4cc6403504acaef4c6e5b758f4e261c7624337000c187648325f36ac8854d4a8a1c2c732a0811b39439340e23c33af0ce5090ce800070306834321b5af9e4be13b22ea6655da11427f995a115dc86cda737aa99078407b9f78b914e831a6bec2c85f922f972bdda971b66761045813a852a0fd990136840835f8b5a72c5c8e8a65ce8d3ce957b06698261160031597a29e3388a4f5a5f0b96b70481a2e5738d3a50189496c75a856643899947c955be8871e808030a5757d6b46079454b54d51557cca964379bca5a8191698275dc51cb164f8e508fdaf480031a28afb1c9ccc65da9ac1cdec625131c6630188ffffbcb726133ca563da640c76a6c24105502ea3c24b918c5b818121cc68e2f1b62112a41594a6359876b91d058fd66861b7633d73cc7226b8debebcf90fcc390f761360554acf013ad03911b49b641c73687f4a73f8c290a2890c02c56e2a6567fb03826353d87ea41369673e1f9b920b36203cc9aa464192d01b6d859307927a629a24b34132cbceca487a0cb3c7442aba47c4a077fbe7442c2a4221a200a93e726518830b11b690f0497ac0851a5b27ea20253065a9ae7e6567fc26500edb11346955aeb2d9c6c228f1644f21b34e3694c05016284bcaf746ab6344a10eec87cd0f76a611ab64ec86288c339294aa15233abfb680036d2155fe77363530c3ee0c4b8b74a54e9a2453ca081d01f9626867632870b178d25b831fd133a2ac0596e688652c1772e2979305c5e2a10949bf35bdc08cecd6771b7f659b61960a45054998472163c21d31024c0c24972d5b145608c1044718f60894bf5875a453d4a7c4569c63a2b38c2db6a4fb8dc9289610ef12754f37cb4dad3b66e135d1f75759622cd7fa03c4ba81d71ac9938c9a97839a12d7a4622943c381a048edb26c64926b3a807b644aebc9110c54b06d4ea1cbf6462a55b31c7f5202cca8b7c698d9559276a1a3963cc56dd26ce3c051167f299d80c3a8ee894f134567cea1032c845d79ccd95313f04d6459d1ba72e00cc604365a9c5c5185005f17a0397a559a0b28f31b41a5e0948c81501e902b9cc253f6eba88172bbb92024984fa99c5bab08dc01504556aabe8c81bc99c56fc771ddc85d37b7c50182345e189267934564aa9dd80bcdc25b127f1244763644004e5eaf06b095b892bae095e0ba7f9d2700a50cfb6fc18d6419f5438a0573693f421d3793e5ddf3d846678552aaddc19265946003271531cf27285b8721ed5cb46853043b346a66cba6cf765f1b0eaa40bf672 + +# Official test vector 2, seed: "64335bf29e5de62842c941766ba129b0643b5e7121ca26cfc190ec7dc3543830557fdd5c03cf123a456d48efea43c868" +seed: 4b622de1350119c45a9f2e2ef3dc5df50a759d138cdfbd64c81cc7cc2f513345e82fcc97ca60ccb27bf6938c975658aeb8b4d37cffbde25d97e561f36c219ade +public_key: a1a341b578b4765c4649e6bfaf5c8b2ad80de5200e4dd30da0b693f5ebbfcfba9f0ad2ad46576a7a06b65de6bcdc432b6a753f3a6326a27073436483aef170b8649e2ca022497329d071af4c25968cb0521a118aec41cbeab013786a1c2984cb2c649da0fc94fdd880fd3a05239b84ac053ca0f822e4c94ebfe1b6d6898da03b02e455467af6c89db7225ad653a5ac0c8e165f3b9b68b01270ef0ba7cc56322d5c671805b7d333b899abbac120c010033f3064647e4a387649c272a32c2dcc2fd62793d8689cf59619f43c87fdeaaebcd4c3f21483863563ce8442a7f581009410b3c506146390fcd44d0f918b2903940a321c66700ca4e205d4501ecec23a4d17157ce4a0bac562533273fb8071ddf960217696ccd98a59e6c39dac5cd185a0793a9190e25a0460837d07d020d72b5c5ba9840b0940832fa3a483aec99d0d629cfd67a1ce77766a23b2349947968c238d0126f6ab9422b97d6dec5657a20a683544ba07971bc773a5da90bf471eaf12310283944c723eb1e0600eeb2464bc71de7233ebfb7be64202ee21088222a48ba200f04b6bf6a1c7f6404295764e6fd857d747cd985b07f4d83f8b13a901ccbff7b01e21b8789c05b635bcc14c8128c379bdd52029efd660468a34512bb78da224fff9a223371e457333ad464c6fdba4f6c5451b585583655182691f6ee817cf81ce6e7a5cc6b9cacee275c473ae1c58aa38e43de50796f22475fca44270e3a46fb5b8bdda74e3e05b88210f54f36e79fb05becc76805b716154a6e2346b0f4cac241748fde93f325b4f82f3b681136aff8056bc7304ef22652f1679c816032bc35db68b64b2848351da88df89166707b194cb4759e6761032aca4b7a54e8064f5755d36288fc5061072da1ec35a8491396c9406446060347361bed860b028b57250f0187f45a204fba678f587ae031ac38480cf4c3fff90188d925bd4c7c6bd0b758698bcde97ce3958697610ce05e4abfca60eac13b666732e8262b36b7447c0c93f91362c519337052865927a9862d2c1ed186b411554275a24dc9738751a4ba243bcfe46109212b711aa453a35b09ba20ab405b6f0f3457321b24017261b49923225b3620678c4f474515396113880df463138abc3e820c65415c593d74c01e5136150b02f1ccc55a6c1e7e9b121588362d784c3e85658532331bb596682377c752e7c259608b629e74a5a470bad77d3c0672b23831a217c1ac82b94a82437643807681cc1684098b86de031440a79378a229bd902f2996f326a0df16354778a4cd5375c756a34890ccf0c92ba07a61546387bf54c2cb0c8548d4780aa72b667c0a1fe400b30f194465cc97ff42511e75457d1a8a9712a6ea971d797baa894b0348561df068a3455a89afc3684081ddfc0a90fd8acbdc217c83398380267776051cf3491542534b1a74b409b69a8a142c1b437b5a8561fb064ecb591b7334afc482af678cfa4e11e970a48bdf822a0b45e1c591d07792884e4bd057a15eecc5cdf66c994cca765daab1af377a14b98bcd8918fe3546fa4438ba5322da1ba75543be245b12e228d07c1cf1091499a2c57dd42c9f6ba3240c053165ca3fd669b4c3944a7d003d016a0fca826b5e615846c48873cb7f222cc12462023e38f14d98fa0486eae480f81a7376eb6380a42a1a2a6123d8a4efb102ee7b900cbe7a9238b59006abddf2ab25565815947b3bf6b14eed43be91a5687b339e6bb6614387583c585f1456372aa68b17449c2a1c6269a05f8659da97585f52421ab74b9d705ba13ac139f15be9f41971e0a6e04ba167be9b681d294c706d0477a22d64565e71979009a18c8086059f3964ed327288aaa0c8a2b2d976d5fbb50b842bcdf3c9d25656ed7224f3435c9bc9b59b17727b46a546eb8553dab54ecc6842cba94fb24592ed077fc56bd5dd2cd798715fe0c513377361d263c6348340a5018b0e9b43e112bb6ba60503ca954f2bb25fc585c021b57fb3d1acc80a3b20ff4555ebfa223f90762e2008ce920a420b48cd8fa9606ec5834051d0904847466564294cdaddb25cab5cc68008f96971b2711ae8d73b754cc8ab2bc13e07708e7b555ac681c0af0961a19105bf62b93267b8c47c73526b8c2d08bb13867be10211347656c0108aa3825234847519a52b6a4599ccac59e10e945eb7bd579e0c98d12aa9905ed85271887a974ab8f04a783747caab69d +private_key: 9a29ca06e2ccb6a96ad265638a6a057ba846fd6777408cc21aa7c8a7b60aeffc6d014b02e64968cab39948e45c6e32676117373f201dc8a86368f54a54501b8d002d3ea36c1287a5504313f3e03ffbe64d28059b41247e76c24a8c05abc21678110983ca0905434b5b2ac45adc6c5d90d83b416b30351b780e8386d304caafc70f3a2a059e8094ceb83810d7599af876537c4d367c21c0827cef5c80f2b04f554c105c1a8c874389a5f8506d104c105213b64b00b1f194c1f793f6d340a7466896905e295b39d9fa9e6c314e879140bd0b1cc276632e70a56902346fca21d2fc7b0004817b1288b3b34506cc1b15060d1b103025e2ce51e2868335685382b2cea4b87dcc6590fac80825caff465ceb9b1dfb51b52ec97c5077b55d528b32f4b2e344071e04b703f759bac057916916ab758718509921d0c0e0d08bd2037e0643a18ed60f984a837b86c5ebb7b8068c1528100515cb808a019f9017113122a7ed16582c78cdb52ab7b6320e7ec0afc194b651119f79f6c7ff32b003ba7e0160510d32af80eca6547c3999547749dcb7205c50bdc62f54cabb15f386648b1805da6ad5c1a55265b57665bebe46cdfba6604352b5fd036d5a9426f70c014fab63bc2ab7288653ed2680dd6081519b3bc56ba9704ab32bf3a59282257bb9071e270fad6b705e48bed7a546ca6a80a3181f3875580965798e978f757b83fee729774ba46ab32a61343e002b6379a5ad9ee25f37838c84f397b9b4039b447b50c834c1b99eeff51ce6d5bdd8810abe873e1a1c57e74c51bb0139d937390f10c118a568bc464a28028cf5a778bc1a717f9a672ec5cc2b635add077485da497f68c51f017d3785bf0dbb6ad9eb3ab3a02776e9784a864a45dc0527b00d47d2a8c7794d43f059cfe88a2f43160c38292216b0dba17da92b56ce6b2711b0869e1204e21c2834c12a2d4557fb723caadc01af894afe656956b35829e780bba9c8ac28002245cd5d46112dc93dac9a656fe40ef67bb544847bebf73eaffc85ec1514b9a248da8760bbd1b65108acfa364b4286c538ab466f34c383f008e0e611f379aba066638b87854163065afcaf1003a189a81ccfc873c84bb465601479d1ac21d9886e7614cdd3603415b8470766892028ff575a69f471b126aacb0136b5d91d1f532f85392e66e182a5acc4be796e42c16d1d56447264aa9f20505f1a447288cd2362bd99c19a7bba93d1775586d769b3a2a1aebc17f84b1c14c5a0d5908ddab90c06bbb7b31c3b88625b96e9244d163585724ffe361e04127e5a981929d24a8e8b58be5221a9d202b84b3c1e0cba55349abd356d787022bf01a04573ccdbe42d1687b29be8c03cf3535eb952073a43319a2f0e52726906cdf7d06be43319d43370b4131457aa2f968628b5c5a71b4b1804734c85ec5efbbacbacd336ca048f8f3589e9561e3732a0ea5523168a8449a9b30a88ce124c25dc2749a3933382dca4cfea4de519bc17f7605321c99b3b20faa4adf952231fb27a95a55c7238702a869d0b1ca018fa58ca21c6d494bc38db4b34216bc770bbc1b63102a588da22a6ae3723bb80b1c857ad06b88d1d0001b396be411618dd421760a58e0898787c498118775ce407317f4bcbd3477ce35c565d83c1ee124ecafb0eeb1b19a4e05eda182b53920b4613c989523d93dba735423dbd84b76491047db0c6f50376dd5460a9c20c02643b63049dabcb3ec09c9a6aa264f3c02cf4faaeaea9158f74670c74c783d461e1c3aab218403161508be461dc2c09d4c77f6737509cc317a2703e3850ca06636105463a4eb16afe797be2c32763f0ad222401545462ddf41c71b65fb2499ad3d0a7c128556518be54948a86b6bb5a811b76b4c35d35bc2d54c0c60c6a744c4944bc74303144b4891b841ac2b1e63777101465eacbe933087fa6541e502ba54522eb69842d3a706dcc617076ab90c16393853fea190cad088da65953a412c8eee83945cb3e10719f37188054c31518070603bc0af5e483f6155d618700f74093aaf352facc6a1ab0809dc101b64c9ada665d1acc9bf31c15bb3a2d163874b523951c7441bac80823d29a909b9db7b73d43020300e68bc66b1964a1031351b451650b63f0076ecc6fe8495857e6a93c9b667d924eb3a84caae9b401ec2fa3355da1a341b578b4765c4649e6bfaf5c8b2ad80de5200e4dd30da0b693f5ebbfcfba9f0ad2ad46576a7a06b65de6bcdc432b6a753f3a6326a27073436483aef170b8649e2ca022497329d071af4c25968cb0521a118aec41cbeab013786a1c2984cb2c649da0fc94fdd880fd3a05239b84ac053ca0f822e4c94ebfe1b6d6898da03b02e455467af6c89db7225ad653a5ac0c8e165f3b9b68b01270ef0ba7cc56322d5c671805b7d333b899abbac120c010033f3064647e4a387649c272a32c2dcc2fd62793d8689cf59619f43c87fdeaaebcd4c3f21483863563ce8442a7f581009410b3c506146390fcd44d0f918b2903940a321c66700ca4e205d4501ecec23a4d17157ce4a0bac562533273fb8071ddf960217696ccd98a59e6c39dac5cd185a0793a9190e25a0460837d07d020d72b5c5ba9840b0940832fa3a483aec99d0d629cfd67a1ce77766a23b2349947968c238d0126f6ab9422b97d6dec5657a20a683544ba07971bc773a5da90bf471eaf12310283944c723eb1e0600eeb2464bc71de7233ebfb7be64202ee21088222a48ba200f04b6bf6a1c7f6404295764e6fd857d747cd985b07f4d83f8b13a901ccbff7b01e21b8789c05b635bcc14c8128c379bdd52029efd660468a34512bb78da224fff9a223371e457333ad464c6fdba4f6c5451b585583655182691f6ee817cf81ce6e7a5cc6b9cacee275c473ae1c58aa38e43de50796f22475fca44270e3a46fb5b8bdda74e3e05b88210f54f36e79fb05becc76805b716154a6e2346b0f4cac241748fde93f325b4f82f3b681136aff8056bc7304ef22652f1679c816032bc35db68b64b2848351da88df89166707b194cb4759e6761032aca4b7a54e8064f5755d36288fc5061072da1ec35a8491396c9406446060347361bed860b028b57250f0187f45a204fba678f587ae031ac38480cf4c3fff90188d925bd4c7c6bd0b758698bcde97ce3958697610ce05e4abfca60eac13b666732e8262b36b7447c0c93f91362c519337052865927a9862d2c1ed186b411554275a24dc9738751a4ba243bcfe46109212b711aa453a35b09ba20ab405b6f0f3457321b24017261b49923225b3620678c4f474515396113880df463138abc3e820c65415c593d74c01e5136150b02f1ccc55a6c1e7e9b121588362d784c3e85658532331bb596682377c752e7c259608b629e74a5a470bad77d3c0672b23831a217c1ac82b94a82437643807681cc1684098b86de031440a79378a229bd902f2996f326a0df16354778a4cd5375c756a34890ccf0c92ba07a61546387bf54c2cb0c8548d4780aa72b667c0a1fe400b30f194465cc97ff42511e75457d1a8a9712a6ea971d797baa894b0348561df068a3455a89afc3684081ddfc0a90fd8acbdc217c83398380267776051cf3491542534b1a74b409b69a8a142c1b437b5a8561fb064ecb591b7334afc482af678cfa4e11e970a48bdf822a0b45e1c591d07792884e4bd057a15eecc5cdf66c994cca765daab1af377a14b98bcd8918fe3546fa4438ba5322da1ba75543be245b12e228d07c1cf1091499a2c57dd42c9f6ba3240c053165ca3fd669b4c3944a7d003d016a0fca826b5e615846c48873cb7f222cc12462023e38f14d98fa0486eae480f81a7376eb6380a42a1a2a6123d8a4efb102ee7b900cbe7a9238b59006abddf2ab25565815947b3bf6b14eed43be91a5687b339e6bb6614387583c585f1456372aa68b17449c2a1c6269a05f8659da97585f52421ab74b9d705ba13ac139f15be9f41971e0a6e04ba167be9b681d294c706d0477a22d64565e71979009a18c8086059f3964ed327288aaa0c8a2b2d976d5fbb50b842bcdf3c9d25656ed7224f3435c9bc9b59b17727b46a546eb8553dab54ecc6842cba94fb24592ed077fc56bd5dd2cd798715fe0c513377361d263c6348340a5018b0e9b43e112bb6ba60503ca954f2bb25fc585c021b57fb3d1acc80a3b20ff4555ebfa223f90762e2008ce920a420b48cd8fa9606ec5834051d0904847466564294cdaddb25cab5cc68008f96971b2711ae8d73b754cc8ab2bc13e07708e7b555ac681c0af0961a19105bf62b93267b8c47c73526b8c2d08bb13867be10211347656c0108aa3825234847519a52b6a4599ccac59e10e945eb7bd579e0c98d12aa9905ed85271887a974ab8f04a783747caab69dcb74eb00a87eb1651271050e74552291b66a29053bef5e49690d4eec7b7bd352e82fcc97ca60ccb27bf6938c975658aeb8b4d37cffbde25d97e561f36c219ade + +# Official test vector 3, seed: "225d5ce2ceac61930a07503fb59f7c2f936a3e075481da3ca299a80f8c5df9223a073e7b90e02ebf98ca2227eba38c1a" +seed: 050d58f9f757edc1e8180e3808b806f5bbb3586db3470b069826d1bb9a4efc2cde950541fd53a8a47aaa8cdfe80d928262a5ef7f8129ec3ef92f78d7cc32ef60 +public_key: c8016eeae46e2610a5fd252102a480cac2bc6e7860620259e41c64591584f1e6ce8e3312dc8862dd806cc2181a18bb91fb184dcf045b030807a5023c4b3779f14a162e0938743b78c71493beda7826022e78ac100e7892fc104d48e25ce92610c072a3e9e8208c93cc225c916a2941c13838eda382f311a809c19b9ca60f188910a1a1bede4710b6b72127e48a5454a457c8037439572c558378cc784554171f6a0c78c676db8bb8aa380357fcc1f61859b0ec72730c10f8c3932975c70e6329aad34a56797a03c0297fb4aa6b97a63be19f5ca6318d0b2c8b4c6d9ef808ebe364d0a41a82dc768be47f44f300bc9b2e4cca1050e21a9919a9b65a07a6c8bc1ca5622a441117a1749211571c462a40c94c3301081867b3a8957ff45c1c3f7c00097a35af93438d74c78c061c2d645e7f6c3be5fa6da749085dd12461fc517e0c28baf93418978772e4c723c071908915a1a5807050c57d2a3d56597b1e1bae4b437632a2522f314b39fa6ab7a047e12b6502027e334b715b5b0b17bb76ae608acc0250d91a859c8c448b27bf4c44b092350e260b65c20c82588c8c1ef25affaaaf150479e80801c82cbea73a37dd1a7df6d268a9b0c4fc753158c39ea4e90960c20460804329f58bd460a37357ae6515bcd505c7cda55b2669017bec3d51816e7001b0a64837f9e07ea26735e830092a648f828cb3093228b98a0c92656c1a14cb3a306929c6207751cebe31aea4c0372cd5c06cc637dd9b6894f00dcb3796d09ca87884412726a25bfa9bf6eb613e1a2a19a196e1e1634e1ca0347a9bcc96816923092961b69dc0c013c191f7ba4fb0b13ce5555e8c1b07d8568722155287264b5fa990e92603aed71df778832ee3bf9a767fa9e650420a14f5ac227df497efab89511302d231a521c5353bd425306a14b7d2a566ab3b32aacf353c2b04a148e4c93c3e470605067dc7590722c452245b3d750205d2c0aad03b0e2ec535bc6cc3956132e329a980c8495d765ed1eb071c58680a11859c3cc0b1e986486a5b543949643b83452c307df477685a4d0a70a7528a55a997bea46780b26252af157fe5d874cf5c420b5b1a324a932ba52291428a39672bb359abc4b54bbfac608a0135cc99a38e102da3e088e4ec5c47984a636c7cb99a6b6304cb0350052618471f716be06b899087aa38053111e35a95965c04a7c42bda2319598819aa0aeb5c39181079f41982e05223c8e89abbc32fc1487f3cb99a167ba694b0668a5525a88472439c89179147ef831022b45f6b8553c8150e32b5421f75291c830a8698a916406807f201141a0ea1cb28255a9ed709502ec7851a56a86cd3b7f05726ed6a6e50fc52706104e829b02f7b61a1856c9b44b8d1214768851ac190b46b61c053c371a333a95b7806eed16c033790c1563fb823204e26ce3af87750ca639e605cd435024336751ca0bdab99ce5b45cefa04caa29ba33b4998da0aa832ec22551821bac055961acefa077de544bbb80211878c6109b512b6b4850b5a8d0bd9bea6978a0f920c1fe8601e1123a98aa23cfa30090817ee849e654a0387a185171a43047758a578a02ebb557904106eb3096d3c1f92092f02891f1d3b0659f284188b7119c14896688ef2bcc8086c604fc140a8fa24c9595d020269b0355ad9a44cbd803b59010a1b85b12fc785ef0a0789c10b3a30925cf155ae8682859a8f8164cf62fc08df577eab2071db87b029a16ec90303f5b97117761c5f20033110b1bdf7388895b30aca862f22adde6930430821dccb2b1ba4cb923652309b4f16600fc9fbcfaa8553cb45bbb53035cd28526ea8449844ac68b87aa61047b94244f126bfe2323af5f30bba9c1b96a426a1d84c2da35fbc001e20a517d458b4291cb36394cd9a074e51d8a45ce623484a3aa7d575977242aed535d46b74d8645aed246692ac1b8b055d717ccbd59769ff9617bcc3aa7bb9366ba51a736b2ce79b971e0c204ac62fd09755b4e4b233e94a9cd3490f4049ce6cc96c7c0fa1254c4eb67748b337c41c473fab4a944364531a6fe18652856797787c804ce1c59462b8d145cae4b97232440ba99cc3a66c1e019b53fdb272d000c85ad63d686a907a31700fd4a29e5936a53a4f2d2486751851edd1b70115adab07a29b15594566221b329076a5a116676d3534044965014daa0d13da178581619dc06df40a02750beb995480eee9 +private_key: 2ca62ac1f40bbef551a3f75613606661a204ebc3a81a170ab0e80eac65017bf3add2830b80ea56743a56bbb7b428951050844474ba8aab61912d35433a679c6770b3f8174214510215268eb5b14411e982f752192c649b61e559bb189666d98254ca913edcb22f93667970566dd06fcc06bd937bca44ba015bc689278925fbf64f1aeb93ee4a7bce8093aeb6862009c49f89cf31e74f91da8a206ac4ed0c21f8ea9ae1ba7f3ec59dfb5b729e73172770ac90957740068b1fb41ed528c73e2c2e62223264dab7f23b6a583c2e0e4bbcaf9878384376c23c38802c5753da4688554a2e9843b0dca303997451a0609be12d73ca1687e2702db3cfb703504fa7b3fb372a59831267a8b9eaac60ec31932c776907d29be988abd0208789f457def7130d628b4e694760f9883e197475f43670402f992cbf22819aa27a12fd60470e0b2a59700c05287589c2a85fa723b5c95ec12488f7e503bf090c581b112f854383c02e9bc693748628dfb2af873713e268c98fdb5ec890b55d8a7af5b93f3e94be8f5971c8c63590715d09d894e078c07fda4414280b20386ad6c645df5b21fe43b940610dde4b30b2a40131627d68a47045696eca108e93ba6a3600ca7be14f54346e9699331d92bde1786bde2886027a62234155648b2a52e3673fe5653cca7ffac07acc060371d67a581a529d0bbe89762dd1763daef0c09657698829348028c5f14359f4996437ebb092f64e7dea7c87e003c874c0531200e8163a9891cba6b0750051006914cf22d95088542fe58c4f6955256370825306122aa5a26963c66ae4ce268c180698a4123954467972e8c9ab44545d0224443ad83d3d7c48ed052ef59b1772d82de3781d713197e6e739e187cb4ad8b8b9f4972ed232f9513b03d2bd0f84c2d5951f2f20b01e362bed051a1278bf2a185b95514814494f576b56418c9d4de5c62b30ceea03a1e86a7a7fab18a5c4bc9ed43c8f46426a3a853d5127073125bf3510ff3065e81a726d934f3a279950a675f0c3c9bf0bc42a574bbe21be72092ed5ac8323e44cbdc1ce8864031838a7c43b64e9dc28a657bfe11711d0f1c5d407212f5938a7f14e82d9353173bd4d94621ae29247a2328007078fa5029136290d48009afc39720ca4a8b8cfc2233dd0042ab0625007b36474fa370a961b520575404154a1070560bc0bbbd9060daa27d4d10a13da8fa0b676b291544a6c1bb5582b08d761162ba103094df56789f76c8cae2b6637d58391f0ce022c9f77da0888c5045586a0c18a2e1730b3003493dcc8bbabfb359a39796ee578f5cc67fdc9a817461aa5296c5d379a58ab6f7a911114f0bcc39771633a6776965816384e5cd27ff1401a8880b2774cc73e6303e00574e241573edb2282a47c6f1c03b74a91ff3c10e4305fcb86ba613c747a591d9aec4c90193f9617431af4689c11310025b92247c805487de6c82968938e67084a178511c70722b28934e64a6e4a5223105c3bb24a6192d9216b7232ff0764f7d48507b84d72ac2236d92c69716bb6fcbb06757249ab3d7bc5a751e104c9e5881fc4675b374afb7735a56b9872164c847493a5dace7a855674d90091809109c524289ccbc4143a2567a6cb587045ec2d33e93ee2c60c9ea6a1a40344613a49ef538a41753a41d8c203785d38207abb3024584caedb404c8c0661d114405d256bc06164fc6ca2b8d71b1e481ad065462128327adba3d7572c3dc71a75791258a5cea5c65a70e11b0eb93a9f027b3b91aaa58a8a50b6bc2f59049f915404087ae4280cf7f603d110c9eeccb045125dc22b4c1923c83aa84c779a6312888ae7e019b7814d61d1cb6635b69d6445a8d005b4fba51b91604530088cb3436cf73f19e42ebe1acbc013b2e8341e3986c4ae156950e1b9d799c450751953da223fc11688862405691d9120cfe4eb283c99b3e39555c7f246c6e73119f7473e0709f979499c52630f140dabc690beaa91186151e5865f7fc85aeae9c27dc3c03c31715303caba288f95c55bfde806374902d0f50015221a3c3298db60a2257648bf22cefff39ac0e92016d71fafb8c9037246a99a0eaa4566a04b0e7b8c4dcf8abea7f72e214494d4176920858e9ba69487680499d27e2ed56d040045ac671a364848c0a4100fd4b44e1b1e8bb5914ab89dc8016eeae46e2610a5fd252102a480cac2bc6e7860620259e41c64591584f1e6ce8e3312dc8862dd806cc2181a18bb91fb184dcf045b030807a5023c4b3779f14a162e0938743b78c71493beda7826022e78ac100e7892fc104d48e25ce92610c072a3e9e8208c93cc225c916a2941c13838eda382f311a809c19b9ca60f188910a1a1bede4710b6b72127e48a5454a457c8037439572c558378cc784554171f6a0c78c676db8bb8aa380357fcc1f61859b0ec72730c10f8c3932975c70e6329aad34a56797a03c0297fb4aa6b97a63be19f5ca6318d0b2c8b4c6d9ef808ebe364d0a41a82dc768be47f44f300bc9b2e4cca1050e21a9919a9b65a07a6c8bc1ca5622a441117a1749211571c462a40c94c3301081867b3a8957ff45c1c3f7c00097a35af93438d74c78c061c2d645e7f6c3be5fa6da749085dd12461fc517e0c28baf93418978772e4c723c071908915a1a5807050c57d2a3d56597b1e1bae4b437632a2522f314b39fa6ab7a047e12b6502027e334b715b5b0b17bb76ae608acc0250d91a859c8c448b27bf4c44b092350e260b65c20c82588c8c1ef25affaaaf150479e80801c82cbea73a37dd1a7df6d268a9b0c4fc753158c39ea4e90960c20460804329f58bd460a37357ae6515bcd505c7cda55b2669017bec3d51816e7001b0a64837f9e07ea26735e830092a648f828cb3093228b98a0c92656c1a14cb3a306929c6207751cebe31aea4c0372cd5c06cc637dd9b6894f00dcb3796d09ca87884412726a25bfa9bf6eb613e1a2a19a196e1e1634e1ca0347a9bcc96816923092961b69dc0c013c191f7ba4fb0b13ce5555e8c1b07d8568722155287264b5fa990e92603aed71df778832ee3bf9a767fa9e650420a14f5ac227df497efab89511302d231a521c5353bd425306a14b7d2a566ab3b32aacf353c2b04a148e4c93c3e470605067dc7590722c452245b3d750205d2c0aad03b0e2ec535bc6cc3956132e329a980c8495d765ed1eb071c58680a11859c3cc0b1e986486a5b543949643b83452c307df477685a4d0a70a7528a55a997bea46780b26252af157fe5d874cf5c420b5b1a324a932ba52291428a39672bb359abc4b54bbfac608a0135cc99a38e102da3e088e4ec5c47984a636c7cb99a6b6304cb0350052618471f716be06b899087aa38053111e35a95965c04a7c42bda2319598819aa0aeb5c39181079f41982e05223c8e89abbc32fc1487f3cb99a167ba694b0668a5525a88472439c89179147ef831022b45f6b8553c8150e32b5421f75291c830a8698a916406807f201141a0ea1cb28255a9ed709502ec7851a56a86cd3b7f05726ed6a6e50fc52706104e829b02f7b61a1856c9b44b8d1214768851ac190b46b61c053c371a333a95b7806eed16c033790c1563fb823204e26ce3af87750ca639e605cd435024336751ca0bdab99ce5b45cefa04caa29ba33b4998da0aa832ec22551821bac055961acefa077de544bbb80211878c6109b512b6b4850b5a8d0bd9bea6978a0f920c1fe8601e1123a98aa23cfa30090817ee849e654a0387a185171a43047758a578a02ebb557904106eb3096d3c1f92092f02891f1d3b0659f284188b7119c14896688ef2bcc8086c604fc140a8fa24c9595d020269b0355ad9a44cbd803b59010a1b85b12fc785ef0a0789c10b3a30925cf155ae8682859a8f8164cf62fc08df577eab2071db87b029a16ec90303f5b97117761c5f20033110b1bdf7388895b30aca862f22adde6930430821dccb2b1ba4cb923652309b4f16600fc9fbcfaa8553cb45bbb53035cd28526ea8449844ac68b87aa61047b94244f126bfe2323af5f30bba9c1b96a426a1d84c2da35fbc001e20a517d458b4291cb36394cd9a074e51d8a45ce623484a3aa7d575977242aed535d46b74d8645aed246692ac1b8b055d717ccbd59769ff9617bcc3aa7bb9366ba51a736b2ce79b971e0c204ac62fd09755b4e4b233e94a9cd3490f4049ce6cc96c7c0fa1254c4eb67748b337c41c473fab4a944364531a6fe18652856797787c804ce1c59462b8d145cae4b97232440ba99cc3a66c1e019b53fdb272d000c85ad63d686a907a31700fd4a29e5936a53a4f2d2486751851edd1b70115adab07a29b15594566221b329076a5a116676d3534044965014daa0d13da178581619dc06df40a02750beb995480eee94ada82049cbac3e8c6830334021c22894085dbc8382fb43cbe318e8e6ada9955de950541fd53a8a47aaa8cdfe80d928262a5ef7f8129ec3ef92f78d7cc32ef60 + +# Official test vector 4, seed: "edc76e7c1523e3862552133fea4d2ab05c69fb54a9354f0846456a2a407e071df4650ec0e0a5666a52cd09462dbc51f9" +seed: 66b79b844e0c2adad694e0478661ac46fe6b6001f6a71ff8e2f034b1fd8833d3be2d3c64d38269a1ee8660b9a2beaeb9f5ac022e8f0a357feebfd13b06813854 +public_key: 2f7a733c9c0d0a05b6ae91776032105bfa99d149062746ac1fd2ca81db9224518a39629a36d043e6a398444a055a2cc28ac785e22b9ada469d2e3491174a4e16e11824d32c33326f7cc2b73d417a7151496fbb6805a79d5d974b12f3c0125b5d7bfc7c6f244b68e2c1ca8613e891322261b4789898a1f858f5991b2b1b177769aca1453c57c43140548452f3053d3b55fd2c3062a0b11939a3c14a81c59432616a5700c775fe98c6fb88c1eb8277c469be42f541dbb79808479e0cdb11856cb7c1cb6a5b865469bba549d73cfe581bee85494dea28d6e96a5f04cd65e561ef66a2482c806e39257b9ba9581421708663bf0b45b4131eef3384eb53b8733c4957937161c3ccacea5cbf91429e87b8b2b6a0aa44cab94bcd02d14cc3932c3ee58b483b1d11e5243fea0d34912b8d45bdf48c1358db3fc163ac081c23ca6c43919a649c33911c5802e2407e9fea350c3b64f302c5489005ec87650de428e60b790489a17e96b9e1fa91b33bce5f4b8d8dfa1610b39fd2858c25b898c1386c6dc021bd3414bf213719867f8cdccbb4d2bdf12207860a638bd41a05b9697a3bc901e9ad0075c080243cc0cbb3d389977c522230a42125b08d41839986a60acae28bda183aacc32dd5cb149af2bbfc60b0d5ba8ad89b1acc0863ceb24faea37ef3f60168cc96d766642f07a116225873e651ef693f2bb97339acbcba301e975405661b2aa523168e06c86f9bcbb42b5f12d79c3c379afcc37dc4995b11a4afc3578a30a13ff57ab87f022fd5c3ac5dacc3462c7e7edab63b889c22e90d685733a1a79ec336c50c18a5fe4408c2c122e34a60ef56a78bc16b78c3c98ed689e0c9276697cdd8aba667109cd911b77e6930c4f58cef1240c1f7005a7a2b17390988924cb0604b4f897d19c5b0e4a557a6a23470bc71db15bc99248d42d9bed4117652690124b1bebb438473619c4919c6c0e4071ca990b9d005eb287b15126e5c3477a98669f0856242dc073bb2673c7c1b1485799c300a0648a83142b95a2377d7e2b1d994209184309934c914308b7371a307a3bfc825958a98a12524b847ba5b61e5a279eb9f7cab5ce030c45ffcbcf919a6ce1059dd7c6aa077c2d2437408315db32a800c2099a92ab682fac6461896d583007b97af2336b1e6d061643c62f0b5122d48a230225128c52863c9aa7837ab4f254f92863efbb3b379f87e40071cb6c8b74ac79af4ec11da6c028f1caf9545a7d0a984bf6ac8d4067a7ff29325daacd3f9470d529f02b00183586011da8a0295b678b18d7572cd4f081317b92c21803f613bb959170ad3a4cf465645d3e5a1dbf672013bb935bccdcea51393bcbe7c975d30a9823667bbb155bdccd14ad3d8b453b30ec2b0cbd703485975cc571530b4cc521693a9965139fca21a90d57397f34c46822ea0e0ca0f56668b8692127bc93322389046c63fd08ff82b67f9778964054b49ab0dabe24628e771627ccf34f46c6c820e9d890b15f396a291a98eb14a23575952abbe46374c74b812aac6b9ced932c078ad3f2a05c821b720305773d070b8c86d7686c53b81ce241586f5f752fb4a2774152638f04156a0b24b3061141878d5759d12f8bad4e98aa5d41895b91e122074b31aaadc30a1dff707c32aa0dbfb2fe0a519b4289942e99754034d65d7b9eb5c0087225048b5a293038969a944725a23475b0681ca2177c5bee023bb7e0abe99a630b5babb5f8a67c8117fecf20c1187c338a97b72c1674aa302c3005037631ccfd51a5b10ce837911d8d8372b9760c0498b8ad8218f832fd8519476ea5673d6659b558895796e14cb5a55e7a3d0b91cf5a6228a3c93175a2ccb06c26bb00d5224a402f119a3a42356a37cfd82162c65953b798d9d96cf4353805ddca537a9504b708d16424a3c6209c2d738e25c357256833dd14375a65e1e32868bc4c4e5e062fb636e27f4c746eaac0f641330d235d909a128c890e531be3e0cc307e632baab0ef7684cc687bac9b966efecb85ed1030a1b1e15b71be5a263fc64c320b145cab657a14c2749dcc9961952ad5489c6485f208933fff0203f3c31eb6a389f072cc3573166b9349ada4d7dc66bb12c18a7d96a86f93883f83822ec0094b24751388a51166da6b24a0b526935817e1ad73b4403aa3b10b5d1822daf198aa848a73c9f9a866b634f939c2179ce55edfaa1d5d48cb3127f0fea3acc7b163d +private_key: 6360495af613e1c6b526a64a23cb3052fa4fc0198a351aa70d982284b13ce66384edb522df0b38199baa8265ca96da7040a7204cd0162ab481517a76d9b94a20306b04d19f5ab43146f26c4f43c23094131b9ca58552ae1eda8b9e623cffc533e77ab7345790a507a3edc589a0e01584a291e0a98389224ac057a2c7a49aa92c012e3068fce416936ace78967543053542faa399a8b7d2f5c483d9b09058067db414b319407dac97a1045d78b6633d2b690a77510d996abd44c972a37b37baae708086a4143926875e09aa15a206b3fdc69562d645ba213a13c74b245072a2480459672b33ab4f1d969157137d85f481828a7cb71aaabbf6b54874821b9b77e41caf849874830a742c887fae918ec657343aa11c8dbb6190d53749157e6277582c589ad1d9a33e740e25f00bf3dcaf2c03b1a6a64ffbc0a104fc37a2c34f7b8c56e06ab258b7c79ecac3eeb9c2a87c02171aba70b84c58d474f4841241dc10ae9645c1b71163ac3053a8b9e999309494763c50354e235f253b87af35818166aaacf85abea0056b3ca078960dc54c599bb43508fb06e06c968964cca2acc72a17c25d47a6768c512836a7ccd3cf58b09a024b1aea57bb26f2219eaa3f473a367efc8bd1790f576978ff159f282a218da906b506be5c63c016a55d92c69999e4cf1e1730af67881dda242f505ff78c242d3a3730c088b83abe4f39bb628a4efcfa03b0ecb8ff98c288d1b8e12b2429263ffb0a638f9665704b1770c4be9d999f8ad6ac080671cba047378a60c259bf042839ba39a11f94354dfb8d3da789a4790b2241718a2a267c7c8b5e1a2178002971306d08f360c6940043a25b4ab350ae385969fb28b64cab121c10ae15ce4c51475cb4794cc18118b877d1e3723101ba4172c272c1cdd1e33f506212c5b421b0f631dd773ba590b894056051753ff73013daa26c597a50d0023b2ca99af7aa5f218971b5c8845c68801468471651765922c6c7586d88b65d017572d792b037d7684a86a517c453fd36ca5135b320092c36ebab15dcb82a70c156e6657ed35dccf34f94559b92d83f7d46277926c9d7422fdbca5424d431d61648a848bd8e260179047120a72a0bd1a495ebbf154908edf0363b86892f783e75369252e92a85097a2636c8f284a841396d4cb39f8b247ce1593fa502a6ca4014cb4036f94810656cb9335c24ee345b1cc15431359dcee9526ec6a42d26280493b6090b0d500808bd29a321959f6101c18af673921804a3501f5848022d0b1075b1adb6f30f47786c9dd345cc33a12fa98dfa909eb724ce7e853b5f29a00f43319f92a14999526cc7966d3c25bc24924f5ca64de9a2a5c69965f95fbf29875b201dd3d54a1ed97cb7039f8d3982764a4e964c45583183a15c0d8097c033dc144bb7ca7d4483900090859c2a25c9c2b1aab964d7629bb420f3261e2e4c76afbcab41272155496c4cf9131d7195b9228ebb613dc7b42541ca05e39ac09e710fb972978f4395b883bc6a67593a7361e4179b7c95945513c28bd488f84146c5c8956c4b18a0da5ce7a680d26a779ea5ab1a046cee3191acd2c655cac8dbd9518528be44e03c1bd758cfc30d9d163b06c0a60e5013f6e646d3461a3993b7608b9edcc65304e92d0e59b193747325452ac403771a657b92fb8d4a57a424f13e323b37c46183b4014600b760bd44c5eb1099167354a5c31ad377a5041c6ea00bcba66b18cd457a6571853db6a90f408ffdbc35fe7bacf16a2be625abc9473f57c269f0029844976475f484b4090a53523f0766168f80a708ab37e0776c0a4b4fe02795073a19c01619edfc36ffdcb12668851c43c2ce7765c050a46a025252904698d2427a634ff421c45d2018772bbbc3aa2ec49799b3e9733e4b0cb16973e51a1f43ab1596d64a92c61576592d6f3cb339f76fffe186106a176f45525900a6b594b673271ce54499bf90a5c5489928ca879e93b3cfa7917999b472d1abd7da21333165b95c8b1f6736bb183fa14b9d1b26143e1807c7f71d66360b1ac2be6db555c1dc907b794dd6a07c505451bda90d2e7a7112636fd7590f48e0c94ceab150906945273cd375b82573ab5994c2ac447f5d53a3d9e04b4d694f5d81b54e29c125f461ba056e599674b5d15b0161802012217cb73419d431e03abe2f7a733c9c0d0a05b6ae91776032105bfa99d149062746ac1fd2ca81db9224518a39629a36d043e6a398444a055a2cc28ac785e22b9ada469d2e3491174a4e16e11824d32c33326f7cc2b73d417a7151496fbb6805a79d5d974b12f3c0125b5d7bfc7c6f244b68e2c1ca8613e891322261b4789898a1f858f5991b2b1b177769aca1453c57c43140548452f3053d3b55fd2c3062a0b11939a3c14a81c59432616a5700c775fe98c6fb88c1eb8277c469be42f541dbb79808479e0cdb11856cb7c1cb6a5b865469bba549d73cfe581bee85494dea28d6e96a5f04cd65e561ef66a2482c806e39257b9ba9581421708663bf0b45b4131eef3384eb53b8733c4957937161c3ccacea5cbf91429e87b8b2b6a0aa44cab94bcd02d14cc3932c3ee58b483b1d11e5243fea0d34912b8d45bdf48c1358db3fc163ac081c23ca6c43919a649c33911c5802e2407e9fea350c3b64f302c5489005ec87650de428e60b790489a17e96b9e1fa91b33bce5f4b8d8dfa1610b39fd2858c25b898c1386c6dc021bd3414bf213719867f8cdccbb4d2bdf12207860a638bd41a05b9697a3bc901e9ad0075c080243cc0cbb3d389977c522230a42125b08d41839986a60acae28bda183aacc32dd5cb149af2bbfc60b0d5ba8ad89b1acc0863ceb24faea37ef3f60168cc96d766642f07a116225873e651ef693f2bb97339acbcba301e975405661b2aa523168e06c86f9bcbb42b5f12d79c3c379afcc37dc4995b11a4afc3578a30a13ff57ab87f022fd5c3ac5dacc3462c7e7edab63b889c22e90d685733a1a79ec336c50c18a5fe4408c2c122e34a60ef56a78bc16b78c3c98ed689e0c9276697cdd8aba667109cd911b77e6930c4f58cef1240c1f7005a7a2b17390988924cb0604b4f897d19c5b0e4a557a6a23470bc71db15bc99248d42d9bed4117652690124b1bebb438473619c4919c6c0e4071ca990b9d005eb287b15126e5c3477a98669f0856242dc073bb2673c7c1b1485799c300a0648a83142b95a2377d7e2b1d994209184309934c914308b7371a307a3bfc825958a98a12524b847ba5b61e5a279eb9f7cab5ce030c45ffcbcf919a6ce1059dd7c6aa077c2d2437408315db32a800c2099a92ab682fac6461896d583007b97af2336b1e6d061643c62f0b5122d48a230225128c52863c9aa7837ab4f254f92863efbb3b379f87e40071cb6c8b74ac79af4ec11da6c028f1caf9545a7d0a984bf6ac8d4067a7ff29325daacd3f9470d529f02b00183586011da8a0295b678b18d7572cd4f081317b92c21803f613bb959170ad3a4cf465645d3e5a1dbf672013bb935bccdcea51393bcbe7c975d30a9823667bbb155bdccd14ad3d8b453b30ec2b0cbd703485975cc571530b4cc521693a9965139fca21a90d57397f34c46822ea0e0ca0f56668b8692127bc93322389046c63fd08ff82b67f9778964054b49ab0dabe24628e771627ccf34f46c6c820e9d890b15f396a291a98eb14a23575952abbe46374c74b812aac6b9ced932c078ad3f2a05c821b720305773d070b8c86d7686c53b81ce241586f5f752fb4a2774152638f04156a0b24b3061141878d5759d12f8bad4e98aa5d41895b91e122074b31aaadc30a1dff707c32aa0dbfb2fe0a519b4289942e99754034d65d7b9eb5c0087225048b5a293038969a944725a23475b0681ca2177c5bee023bb7e0abe99a630b5babb5f8a67c8117fecf20c1187c338a97b72c1674aa302c3005037631ccfd51a5b10ce837911d8d8372b9760c0498b8ad8218f832fd8519476ea5673d6659b558895796e14cb5a55e7a3d0b91cf5a6228a3c93175a2ccb06c26bb00d5224a402f119a3a42356a37cfd82162c65953b798d9d96cf4353805ddca537a9504b708d16424a3c6209c2d738e25c357256833dd14375a65e1e32868bc4c4e5e062fb636e27f4c746eaac0f641330d235d909a128c890e531be3e0cc307e632baab0ef7684cc687bac9b966efecb85ed1030a1b1e15b71be5a263fc64c320b145cab657a14c2749dcc9961952ad5489c6485f208933fff0203f3c31eb6a389f072cc3573166b9349ada4d7dc66bb12c18a7d96a86f93883f83822ec0094b24751388a51166da6b24a0b526935817e1ad73b4403aa3b10b5d1822daf198aa848a73c9f9a866b634f939c2179ce55edfaa1d5d48cb3127f0fea3acc7b163dedc529d14502bab03d1b7fc370f2ede22c7190bd47cc88028adb3294029e264abe2d3c64d38269a1ee8660b9a2beaeb9f5ac022e8f0a357feebfd13b06813854 + +# Official test vector 5, seed: "aa93649193c2c5985acf8f9e6ac50c36ae16a2526d7c684f7a3bb4abcd7b6ff790e82badce89bc7380d66251f97aaaaa" +seed: 7ec408f52c9aa723d0c41d9987682a5f4ce6c9da7cd0215af60bbaf5484ab353a08ccf451b049fd51d7a9ad77ae14a81569df8c9bd3a8f1ebea86fdcfb823082 +public_key: 69bc82661a9e822624d2a644e1767de906658569ba68922aa5c18996c58b3325685bf3564518afdbb99aa67acabca017283bcec3cca9075cbcef02cbe57ccfc73581784bc6fc1b8b7623b9255c20f7430887c87a5f6873b8789de3810ee4841447d826706bbe47d6c4bb13380a03a532d240adbb8240847e6ed68eb5abb3452584b949b8889bb77d2bc87a11c4580919931509e8fb931b50957fb00b972c8f17c8be0e0565bd95b16799606b825e462059a701412ac2704cdba91ea269271519421574f807206d8a65f8b67f44117b4c742e7bf4209668cb013975a9317ee847bb09db3c44d8029e01c4ff4954d5ac7557941b4c12c60520785867cef3f77214805c96d8497b508629713064cbb04d0b9abe21afabb10f33eb38b6b3bfb34908ebf048ccb239701944fe64792b8a909cba14bbf50d03b858bf4a318b9860e58141b7f114b38616533c96c4eb25115724e6672ec20937fab6164aa4a9818acf072c90ea4a5ba34cc95270a330e2874d76a5e0fb085f1aba5917a6e6c3a50ae59659d95703d0a1e9c76c0f0055605ac839f70f6868bf0727496f38c4fd042226fb261ce27bcfab89daa192044462cba31297a660b191bf4440305c5235ec225018cc92480c19bccb480d03d08c470ab20c88c7a1b2a9f37dd7b911cae469de0c7f6e08aa9d427a8eb90af2649aa28ccf1bc19c0fd84842e5748f686278631659a5a874377347ea3894b035a5c139ec8cc0aa63a960535f8e3113f668bbfa9a67a82ccb03253461d3354eb81d0d112fd667a1f133c054730f28ab50f54c5416f65ef60b6ce8c86f6608456c819a7e10ba9232322e4bc73d8370874846643275622b3da6dbcaf9fac7001cce6d34565cbc6f34a1bc9ae904c5229320a3755c4a439f035b5f8a099c70a6a57b5e3e15001bfc19710878c5db0930b21f28603ea4087e0b30a2cba02118fa644331a81312a22ca0721ff266620bc91fe318897b77d3c9b7f9986861879a3a9c349e16c72a9b2bd645915fb05a94ba4c57aa72e93c3decc55597e664ae3a683274267f486452e089aaa8679234c2fde99327a60a81e687cf4491de4b90528492b6c46eeb7725d876a91987025af06895279635e98183bb0ef7267c6449913ed09ae1ba77bba0010b03b900863119011b1dd02aa969ba41b6b684fc3976c416342891cbd0588b5c6a480c04d7798820da67c9142fc07a906f2517a9217398c9611b0749f5556821d93368014d9d01cf2976af6bf492e2e59b66d3671e814e466388e2039037313ac690c3dc534ba77281613560b0fc9bc5a298c87b879835b386c6b0e1580830b689e7b005ae950d309c2e264556685c54c606aab7c0318b2c66d4513a707b8b5800ad2ecc1567807f28122525b69b7e1cc0d1646efcc1673a156429a205e4016887464c39a6543e722f0980b81f524203b45deb45184d35351be963d3906e7b0a98b49167a2e0bac9c7a50db62657c4cadf6985d753c33f90bb1a275be17a7342859415f7855384975775cb557a2eb92801bceb7f63cb97a40837ac159a37c2935157160d518bde11c1fbe18c32923d3049b50b50c2ae0a325281c7a4bc32022aa7835630198103b25398d613631860b70a6536bbc66ef6fc9ab856771652689527c5f5db1d1b4243e3f06460eba75c363715378c99019d213732804b31e30cbe3e93c6f83a7ec239560abbbd48d96684f17ed61c9dafcb55cb168e2ba1778ecb0166e7664e9412f4ec7353092fdba5cca4585d173023f1856836619e57b0052b07141ba9507b042c5d5b89ab429b3f237f0d80c5d4126cb4c59d9d19bf0bfa9e3eb42894228d13a05125b36d1daa647661905cb471b08405207469ebb35ba5375a40b923e6b0cdb3f1070bb6728a389ca4b89079467732ec3cd7a27d746850bd4908e401134b650419e639fba07d88eb2bbb755b2a7ac2bc6947ab8907c80a3b5610a771782daf790874563b65a1236baba0b6fac1e5f242919bb4519b637464565467456600882532457e1249e692bb82e16c7f21c370a29453a95600a069a54b0b62087f09ea7ab3da48348257877864cb080f7a39603e284063da75ec0b9219e515021ba46ca8c573b306e814245d45cee5f55d0e5c7e36a31166634e7805a413a062a7b5a7ae75783f97c505daa8f9113507a98a3e8ce6ff046df83fd23815de42eb44b586845b55b2d39aa000ad +private_key: 5999174084c2dbb511a7cc2500577f27809863db3607c863f5e50901e2be2b949ef9b55231b82703a200b1cc181e7119c0f9ab9839b795e763a5e7ca3a0216f6b080f0e7b52c8c196051b5ddd86779587b92bc10a16ba470bc115fe733c1847c689b06cdd2b3cc28a95d92bb479b05244549f5c3114951b872e1257b10acf04ba20cbc2a045947ad631c41781d0704c6f469908da6af1250bd04772cc6c45145e8193b739de340397f1cc431227474f2c15c634961b7af3dc645c9278c8ffc304ac39d1933946981399c92094aeccac243b81b698c2c4985e0191ca1126861d5a5f8eb61c023a5b38489d2168bc75a6f891202d734a28335add858b6a3dba95c86899db97921007777902df820b4d63b1ef40bbf87a59fb20662001511a75c323ee3b2eac47f51ca993f865bb80954138bb59bf2731c2b2498940129746c8c6297d2bb5aa8e75e3560ce91002fae79543289c7f1d1b1850b8ceb2166104b2aa30028cdfc6a5623c1ebc2c8f8cc2f27345412d90a9a840085ecb68214a13444aa3aa7259f35b0c5cb9e80aa83ed21c714a1a51cec15b91a578544294f565fa5c640edd9bb94c52419209006e9439ad53cacf4946567b80d4a11f5b2cef3740d20abcc04e39aada58cae16185072b98c64b7fb756eb0022fd055545b679bb14829bf0606558a6ec5497ea824371ea95312e31a02036179945a599454f5210dce7a3610055bd6db8f40e37502073824eb699a3913348660f3d1454430951732acdf3b4b64d57c9e69c6e6caa65e029a9de4c36942cbcab150034510eada835ff5aa0024b36df8301ef2aae086545a421e834c9dea771575d0ad98a0562e3c56b38546ad04475a39c310572fad7339dffacd2c39888a898ff9703d71147c3c9c476b75911d8615f43c9138003d1ea59e86cc9160f340a03904c8774924cb8ce5f610ee7a979f320960343d22c0cb84f977ec08b7fa18c34a2836a2157271472100758281198cfc88cf2c4b4ec287c6c669553f0135bca1129874b480d4621a4994d690922f67c6ef8b66c6602256ab917a9576638285e0586f3ef860d3891b66a8551a19a57ad7286c700bd7566938727b74401b9225732d5ba65929175480087f645632e93ea2c607b0bb900efb9e71d57b84f63b2d6946be5a66e77b032883b64c2734dce12944225dd58c3d19476a4cb01416711a1a81be7510c3d1183eb5d39391889d78206f3bc2775e174839a0162000921ef689a204565df8cf155131c9e7c5569459c81b3f712a8b0da79b1fcbc9a13c12d346b2e121177adcca95e4c6ab647784231172e4c4bde45c7a4532930a2a0a60a663a5b7bf186a5346a2c0ec9f918147a1e66b7f6289a21c2a6df8b04db12e76027d89bb7c13ba9672d1c76f4057415160430985f5215b53c59ac76c6387e52281889d968592dc607744757b61f30afb6c4e90ca6a580c475cba12664a5552f17330696b12b3ca3ea72784d16d2dfc5acc0b1665bbb1d8a09d8bfc6d81ba51f1117a109b43d2c97250fc9634001fe8018e2c9300e1e46c317c62574b1ee2c850b78383da446deb16aeb66a08a3348adba75693991b4c4172f8575ad7730039e3acb9bc8bf238c20e51b9cbc9818554021d7465d007967d274d82c03afb990f7502a87a60036bf5a204910e7fb3a514b8126aa96de7926592108c0692af748a839335837f0a9d3b20c97f3131906197c6a66ab88291a7c62d7d740f004d44e261c683827fe424b02802937d6ab4a798554574a0a6b5894ba8afd11b782472950c2cc678c148a9f80ca305be0b765a1542a1fe8690f4c865a09931904a3408e665d60633349b72c2353159220a12b5434eda854d7983333c04a0864356c6a137892023a89a2ed1a263a100a7503c1eac6aaea6b12a434b9ba504c9d79c8ab4aaa20611cce877a5f834d740108874bebb82c23e65bb16ca769c60280b036e2b921ea4d30f59f68d189a595dd099a6da6afcca07a6159099e05483b92d00076f22d0a1b94761e8b8399b4a82e204a011f141fa82768b2926d086a24ea0a71aec9d8723aa77614cb0b0ce881742e0a7a2afd0c288244be4400be81a90209c33aad80b84e383f84a4c313acae89a6575a3aa726b65f0d75e5a7ab355f967d5b771c85993a0b6094eb35e05c409f3e47369bc82661a9e822624d2a644e1767de906658569ba68922aa5c18996c58b3325685bf3564518afdbb99aa67acabca017283bcec3cca9075cbcef02cbe57ccfc73581784bc6fc1b8b7623b9255c20f7430887c87a5f6873b8789de3810ee4841447d826706bbe47d6c4bb13380a03a532d240adbb8240847e6ed68eb5abb3452584b949b8889bb77d2bc87a11c4580919931509e8fb931b50957fb00b972c8f17c8be0e0565bd95b16799606b825e462059a701412ac2704cdba91ea269271519421574f807206d8a65f8b67f44117b4c742e7bf4209668cb013975a9317ee847bb09db3c44d8029e01c4ff4954d5ac7557941b4c12c60520785867cef3f77214805c96d8497b508629713064cbb04d0b9abe21afabb10f33eb38b6b3bfb34908ebf048ccb239701944fe64792b8a909cba14bbf50d03b858bf4a318b9860e58141b7f114b38616533c96c4eb25115724e6672ec20937fab6164aa4a9818acf072c90ea4a5ba34cc95270a330e2874d76a5e0fb085f1aba5917a6e6c3a50ae59659d95703d0a1e9c76c0f0055605ac839f70f6868bf0727496f38c4fd042226fb261ce27bcfab89daa192044462cba31297a660b191bf4440305c5235ec225018cc92480c19bccb480d03d08c470ab20c88c7a1b2a9f37dd7b911cae469de0c7f6e08aa9d427a8eb90af2649aa28ccf1bc19c0fd84842e5748f686278631659a5a874377347ea3894b035a5c139ec8cc0aa63a960535f8e3113f668bbfa9a67a82ccb03253461d3354eb81d0d112fd667a1f133c054730f28ab50f54c5416f65ef60b6ce8c86f6608456c819a7e10ba9232322e4bc73d8370874846643275622b3da6dbcaf9fac7001cce6d34565cbc6f34a1bc9ae904c5229320a3755c4a439f035b5f8a099c70a6a57b5e3e15001bfc19710878c5db0930b21f28603ea4087e0b30a2cba02118fa644331a81312a22ca0721ff266620bc91fe318897b77d3c9b7f9986861879a3a9c349e16c72a9b2bd645915fb05a94ba4c57aa72e93c3decc55597e664ae3a683274267f486452e089aaa8679234c2fde99327a60a81e687cf4491de4b90528492b6c46eeb7725d876a91987025af06895279635e98183bb0ef7267c6449913ed09ae1ba77bba0010b03b900863119011b1dd02aa969ba41b6b684fc3976c416342891cbd0588b5c6a480c04d7798820da67c9142fc07a906f2517a9217398c9611b0749f5556821d93368014d9d01cf2976af6bf492e2e59b66d3671e814e466388e2039037313ac690c3dc534ba77281613560b0fc9bc5a298c87b879835b386c6b0e1580830b689e7b005ae950d309c2e264556685c54c606aab7c0318b2c66d4513a707b8b5800ad2ecc1567807f28122525b69b7e1cc0d1646efcc1673a156429a205e4016887464c39a6543e722f0980b81f524203b45deb45184d35351be963d3906e7b0a98b49167a2e0bac9c7a50db62657c4cadf6985d753c33f90bb1a275be17a7342859415f7855384975775cb557a2eb92801bceb7f63cb97a40837ac159a37c2935157160d518bde11c1fbe18c32923d3049b50b50c2ae0a325281c7a4bc32022aa7835630198103b25398d613631860b70a6536bbc66ef6fc9ab856771652689527c5f5db1d1b4243e3f06460eba75c363715378c99019d213732804b31e30cbe3e93c6f83a7ec239560abbbd48d96684f17ed61c9dafcb55cb168e2ba1778ecb0166e7664e9412f4ec7353092fdba5cca4585d173023f1856836619e57b0052b07141ba9507b042c5d5b89ab429b3f237f0d80c5d4126cb4c59d9d19bf0bfa9e3eb42894228d13a05125b36d1daa647661905cb471b08405207469ebb35ba5375a40b923e6b0cdb3f1070bb6728a389ca4b89079467732ec3cd7a27d746850bd4908e401134b650419e639fba07d88eb2bbb755b2a7ac2bc6947ab8907c80a3b5610a771782daf790874563b65a1236baba0b6fac1e5f242919bb4519b637464565467456600882532457e1249e692bb82e16c7f21c370a29453a95600a069a54b0b62087f09ea7ab3da48348257877864cb080f7a39603e284063da75ec0b9219e515021ba46ca8c573b306e814245d45cee5f55d0e5c7e36a31166634e7805a413a062a7b5a7ae75783f97c505daa8f9113507a98a3e8ce6ff046df83fd23815de42eb44b586845b55b2d39aa000ad80db50ddb1aff6498e12eac2d5dcdd68be66c7a569b0153ab4aeba37a75dc973a08ccf451b049fd51d7a9ad77ae14a81569df8c9bd3a8f1ebea86fdcfb823082 + +# Official test vector 6, seed: "2e014dc7c2696b9f6d4af555cba4b931b34863ff60e2341d4fdfe472fef2fe2c33e0813fc5cafde4e30277fe522a9049" +seed: c121915bfef6abdfc177dae2f5a24218f9abda2559afc6741b08e0e61ab433eb84ef52db5eaa6df8ec3a0bc5ffa730db0dde8c5f38f266d5c680a78d264a7b96 +public_key: 55f39e77f0722a726811358dc0f0b76aa90aab8c2dfdd3a4f3e31cdd076947d2b503c73b8805b26d6780d75b86d5f3b50ba899bef229beea7d18fa9016878f3aa8ba392a4b42ec4f92f42ad08ccbe58a18bbc7c8639c04016b9c663ca32ebc31fc82a138970c0cd238b6d1b2f2645fa407504183a125b1abeb622245886b9dccb9f2793147a63227236c9cda173c0546739bca51ab24cf3287cf935a8d870719a62b71728fc5e262662296f9984e485101860679caaa02fa1209e7703e0a5678c496a401cc5c1b834ae8c02d2a61b8c40694c634c80290a2f5b4a63f865ed6689a54201589a3384acc299c054d1cfa25be6ab278530b93616efa35cbd0ac8fd367923bd89cfa828f1e8a10a6d027ef2417422a491ac1bdd2702d688809b7455824ac902a70b06d54c92d73b2047567a25336fc74a6d8613d6af0a51c0645ed30c19f3231c147ad98e0276654b9277b16e100a2bc1327ed41043b61900d48c1f51c70725133ae31190b90b43da26335a323c13652a04a2e084827f190915548acd4d96323b573aeb2633be0b3061544cb6b80176337adeb4c5eab7c55bb612e9390419a7598dba6a79523f5764ec7fcbcd31b85c41548e1db0cf1aac1dea8031b0c3b9e629b6b9c06ef29628afc979d303355fc4d1a480fcfd0bdd9c04168e772880a4a53d4182ad30b760c89b2787691b40eb56165f321691f3c4880b20a81d08834c9b2d7b2aeb0e537f5ebcaada992ac0a3402e81e18aa1fd1391f00fbb333d46c7ae50373eba628685d15cb1867b952ed05bcaa8a7efce7c825ec58054b2c84d5c69dc22c219cc71d5a92230b9f40f633029c30bc6b266b37bc5e994e14f96d4c568d83db3491e38ae1b4a320d831cdd5a8e582a1e8a43153c347a3c91919ba60d18490baf18ab8a530066a9c35cb7e05915d208294059b161b09a0b8b446c322c9bd6160d7413974a1b11d0b643364432a1a2bacb1c0d70c642b68811b39a69d44974b125655a64075b35cf9cc0d632493ec46307aba8abbc1033eac4e7ad3329c246a08294f3cb141fad16f10b6804f70597dd6ac34b2b40190c36e17325742a4e9386c08b69cf1e0124bdcc2cea6ce77b310262a71ff7017fa1b70deca96dec183f2981975036117656955a5c4f1c674b09c1624c0c48ad2c2584968f511ba5d070ead9c7889e79b1e123c488349a1f5216f351070bc459f3c8cc8314e16b97266d37675b809fe962914d924d0827cf9b41c9fa169612b70ade609bec43e04345e5b97c330d9216a5a7e42632f09e95469e9b3422041c3119de5e845d6e02795806aba9203da928201905e2fa82c6c7229ef074a230a05401cc9e22076e1c372e742c8eeda0fe7aba76ce5baff468cfc93482a1ab5957cbcdb2295ba074038e539be24986cb8297a536fd479b42c8973b7d03d71d74346625f96234b32323b17c3769564a1a82378dd5c4d23a551024c3468e50ad5b97ca5641272711ff4464d62b9619d130de8491430b5ccdbc928b7e411fef80fb942ab322323da20cdc42b5d17a9406e3612b7970b648817e060030d338689665d3aa7cf2b97314f8237afc890b10097d8f304a26b9664844784ac8d00932ed8b32438a28e5b078484b5324d976422324fd0f217314102ea587d6de84b482992d9e6a6cdb3112599942fd76434390c060321d326bc702376d466683ad546b3bc2e47e4b891f3b7d584375dd3859ed58fe94255fe421bbfc7214e3abe265a1465e58c1067bbbf214db3a94c54876725fa0fdd048764921d5b6ba00c3382d5064baf295b30029bf27a88f8f630d5558d595549b65201793229ca2647621648297a66e92917e409cccdf5cb1378b906c3ba731355d57cad41f6148f7a706f850e99e7610d2c78d45b9f699926a4e01527a1a49886ba5fd25ca21c325e21034246c45785127f4859c0a67cc7b76259410b2f408f4e1569c73c54a4da92a40476402573a2973963406290549f4a41a2226131251c5d59d85e1d5123d527576f7c794842974d884e79927f7bf6b09b752cbbfc442934ba461429a3ea921aba995ef12c21116cfe66b132402bdaf690ed95483aec9785e6989e934e7858bd13498f4e994619ea9cd55a9504e40b4d0ccbe8f8cca1f72dbf74caa3975595623c12f22c120c022b59b2cf3748b17199c44cd37f8ea61ba5d8c1bbe50789ce915df9fce1b4cf3c5acd7ce52dfd +private_key: 8146c57021044d4310992c0a37686e1b55240a076646e041eca9976ee77981f4c4743788e5071b28011a2e26c2ca7c3dcde694dd996855ea17dcb241ddeb8ceaa74eb6e90bc7e415028cc4f7280069626196b793e7208b6987516a4a95b4906274b9a154d669ad7a85d454ce905c090aabc30fb68f0a001bb7998772937ee88714fc854dd1cb7f544b7ea345a016841c6eb1bc070066c2134591944016ec8cc5443f57e72fd8020f90f332a0284314ca6b02f8596db0a7244359d97a9a84c07f14939405718781606c80e272a0462fdb2c323c326383a010ab5bb55531a687233af12812d88268a2b73fe0377512e6bfe1fc5f74948a338259654760decb2616f3ab2d80428cd754e27746196b38c399a765b610f46b00f3b717a888b7e2111eb0986c8cdc84a546c420b6b37c882e96e96618b374975c0b8ecb50c6b9bc8d598ae6b46c023b82f3393817a19d09fbacf897251aa9389603321192baf160c0c5489381634320bb2083d604f6db178c8374b055271a124cda7100d48847719704beea14f6d18edca69db74b1e5ccc47cceaa4609a7ac43bc32c8159cb4abecb2800b1947245196bc4e3675540b6d5a29eb7e82db5c3b7f2b70b12042727489170884ecf09b0537134a9aac0cc79568e562695947aac325bc104bb45e83956e857803c563e287a20f9063291b8d1809795a069dbac2525e6cf0e1628ce07a335b110648551ed4471fa166aedb5449f64cad9ea5605bb2c51caa38afac0190c515ff0bac6d8712afb250dc4bc96dcbbeac20c4291097f31611a2a3dda52c94008357901ba6b5a227d5cc744d4a4e3bb97ea0b7cc8b7829bd245e6039e23b9451011334928c6cc22a919e97558cc9a79b988d248186f3acfe7c1ab71500c8671568a591c6306920c19b396923368118153458ea7411cf38cb60779cc9195ce98ea9c0c549889414df119874cb44b332b8789599a713056bc0a6ede61c05777262fb1c7dd03aed0b324dd903b7be44fdba05d192bb5426a86910108e3d257aad1a99fb7408aebc5a758c5728c7375d405c4bb461816bd7583aa2357c83a594d41449f7b7cbaf4d80b3948a8e92cad59a3283f7c3233833ad8c866aaa1cd0b39359a0c60da978046ec7039ecb3bbe752045bb15e8a0c745bab19287e79d844ddaa9eb89a4512b249b637122ba646888a0b14a50473683e05449295f7729980043c03357ec35432585270780805683d04e6a6dc099f7ea4a72b482e090797392aa8168242a5890ec8e89b13ec202a3398a734c75ffcc37a088225e103ac41b52af9412069bf0084c303fc0d205509a7211598d475f4437782fa3637d8c6a7150600061d4458811608ae7d290b1706516a9456c665cf86670f20f2a5f691cf36d1c90772b837747b737029d558cbfd418df8e26e5369bc0fe35e4089c7ea67383ee02f51f5cca36a2a2b867668521ae972486ff865d4e2beca6c4b1e39cac3c61cf131352f036c6292cce7875ce6939544b58634cb62fe6b80c4a4447cba420dca993ae070d3c69d62da3b956897daf687c6e339f8b45760b40c0b9ab06773584584b83a8113bd765815537985d2cbfb784bb3fb50be2b11e79b91129c29b7468638978a1cc8a81ed289cf209f41f85b4b018372c8799e9b7403e10a8a63035417719b3416961b94c47a0d81e51860aca7832b23cc41a541529df511a443e480e31020a1a5b5ac8a43b022b9b1581cfdac0b8d0c082e392c473c922481b15122cf4e47474d6c73f94496d812283173b6361c31ae5251029bb45d21b8aaf3037fba8b3f3744508b25cdcb35873321b6671d94c13148b115ea13b196dc9c3c5c7b37d5324aca344597870f361cb4e5b9450b93ff8a69b8ca3c55bc76845a635584cd0c145b67cb047c0517cf60c8a1146d11274531eb46da9943d8b777df8344f28b8b12fba249398fcc7710ed177c4ab34c0f229e4573c882d00a5a88cb41f4102d309b8a23858da00aa9c935e4e157a7da40885379ade1489b4b75dedc7612282df1969b5e42a915b17cd084788ce92521d6a83a79047e7cae21325d40d357be0b3a47933a5949a4c9b42ff883a3d7130b01843d57717bcbcc09ee13c0b63311df50425e7669540b3c3444a43b775473189d07c1724a114fffe30bb1976004a66ccf811955f39e77f0722a726811358dc0f0b76aa90aab8c2dfdd3a4f3e31cdd076947d2b503c73b8805b26d6780d75b86d5f3b50ba899bef229beea7d18fa9016878f3aa8ba392a4b42ec4f92f42ad08ccbe58a18bbc7c8639c04016b9c663ca32ebc31fc82a138970c0cd238b6d1b2f2645fa407504183a125b1abeb622245886b9dccb9f2793147a63227236c9cda173c0546739bca51ab24cf3287cf935a8d870719a62b71728fc5e262662296f9984e485101860679caaa02fa1209e7703e0a5678c496a401cc5c1b834ae8c02d2a61b8c40694c634c80290a2f5b4a63f865ed6689a54201589a3384acc299c054d1cfa25be6ab278530b93616efa35cbd0ac8fd367923bd89cfa828f1e8a10a6d027ef2417422a491ac1bdd2702d688809b7455824ac902a70b06d54c92d73b2047567a25336fc74a6d8613d6af0a51c0645ed30c19f3231c147ad98e0276654b9277b16e100a2bc1327ed41043b61900d48c1f51c70725133ae31190b90b43da26335a323c13652a04a2e084827f190915548acd4d96323b573aeb2633be0b3061544cb6b80176337adeb4c5eab7c55bb612e9390419a7598dba6a79523f5764ec7fcbcd31b85c41548e1db0cf1aac1dea8031b0c3b9e629b6b9c06ef29628afc979d303355fc4d1a480fcfd0bdd9c04168e772880a4a53d4182ad30b760c89b2787691b40eb56165f321691f3c4880b20a81d08834c9b2d7b2aeb0e537f5ebcaada992ac0a3402e81e18aa1fd1391f00fbb333d46c7ae50373eba628685d15cb1867b952ed05bcaa8a7efce7c825ec58054b2c84d5c69dc22c219cc71d5a92230b9f40f633029c30bc6b266b37bc5e994e14f96d4c568d83db3491e38ae1b4a320d831cdd5a8e582a1e8a43153c347a3c91919ba60d18490baf18ab8a530066a9c35cb7e05915d208294059b161b09a0b8b446c322c9bd6160d7413974a1b11d0b643364432a1a2bacb1c0d70c642b68811b39a69d44974b125655a64075b35cf9cc0d632493ec46307aba8abbc1033eac4e7ad3329c246a08294f3cb141fad16f10b6804f70597dd6ac34b2b40190c36e17325742a4e9386c08b69cf1e0124bdcc2cea6ce77b310262a71ff7017fa1b70deca96dec183f2981975036117656955a5c4f1c674b09c1624c0c48ad2c2584968f511ba5d070ead9c7889e79b1e123c488349a1f5216f351070bc459f3c8cc8314e16b97266d37675b809fe962914d924d0827cf9b41c9fa169612b70ade609bec43e04345e5b97c330d9216a5a7e42632f09e95469e9b3422041c3119de5e845d6e02795806aba9203da928201905e2fa82c6c7229ef074a230a05401cc9e22076e1c372e742c8eeda0fe7aba76ce5baff468cfc93482a1ab5957cbcdb2295ba074038e539be24986cb8297a536fd479b42c8973b7d03d71d74346625f96234b32323b17c3769564a1a82378dd5c4d23a551024c3468e50ad5b97ca5641272711ff4464d62b9619d130de8491430b5ccdbc928b7e411fef80fb942ab322323da20cdc42b5d17a9406e3612b7970b648817e060030d338689665d3aa7cf2b97314f8237afc890b10097d8f304a26b9664844784ac8d00932ed8b32438a28e5b078484b5324d976422324fd0f217314102ea587d6de84b482992d9e6a6cdb3112599942fd76434390c060321d326bc702376d466683ad546b3bc2e47e4b891f3b7d584375dd3859ed58fe94255fe421bbfc7214e3abe265a1465e58c1067bbbf214db3a94c54876725fa0fdd048764921d5b6ba00c3382d5064baf295b30029bf27a88f8f630d5558d595549b65201793229ca2647621648297a66e92917e409cccdf5cb1378b906c3ba731355d57cad41f6148f7a706f850e99e7610d2c78d45b9f699926a4e01527a1a49886ba5fd25ca21c325e21034246c45785127f4859c0a67cc7b76259410b2f408f4e1569c73c54a4da92a40476402573a2973963406290549f4a41a2226131251c5d59d85e1d5123d527576f7c794842974d884e79927f7bf6b09b752cbbfc442934ba461429a3ea921aba995ef12c21116cfe66b132402bdaf690ed95483aec9785e6989e934e7858bd13498f4e994619ea9cd55a9504e40b4d0ccbe8f8cca1f72dbf74caa3975595623c12f22c120c022b59b2cf3748b17199c44cd37f8ea61ba5d8c1bbe50789ce915df9fce1b4cf3c5acd7ce52dfda0237f5f24fca5a18f8f98c916c3e3304d2669330c1042829573e197597d729484ef52db5eaa6df8ec3a0bc5ffa730db0dde8c5f38f266d5c680a78d264a7b96 + +# Official test vector 7, seed: "aefb28fdd34e0ab403a703b535296e3a545ca479c1d8148e2d501b3c8dd8b1034bd986f13f1a7b4671be769359fd2aab" +seed: d86634ecf96cc2603761e284c0e36734cedec64e7ff486469e38539c71141c5a99daf37400cfe59841afc412ec97f2929dc84a6f3c36f378ee84ce3e46cd1209 +public_key: 07f76c0d2245fe775fc5cb525824bf945b31bdbc0a86b88d8827ae7fc0a3db8bb9f534a21792637765081c4669832bb66485133f61bc22c55f03b109882b9ad7e75fbf12519873a18d9472087a6fb375244b313f6a81b608d88b0f79147282c9c37084b00138e8bc8cb3bbbd2bf9c5f95766040617962651f0556756bb9121a6bf09a515c6836b650c44e9db72cef47e08079945b8cf19d8bb25641186a8c8999103898492a904c5a7f2befc1614b4482931989ff7fc83ab40781ce54fb51866706cb04ec2c1c8813e963c70b0f15567b41ffdda8d02a94d00d1348911be52163f5c44188b6214856763a409040e8480c0f263d966a99ba7c7d5724f225ab99327a962d1497e9b265bd819c2959b1cd7995d138b4d71804fb122730b6133713d68c95d861a3c567c803adc403cc911186327e1726e2881bc9b4b1873091637c5532951c0c01a0999e7740fa77c1c1c847feb3dcd387ba3974e1ad0310f889d05e3508f02443491261c367c94e074009103e8bccf25520c4546c4bcca7aad34aac89892524219ba9b715c470c72c6c67811764926335f722c03b85c509105d6f43f65ea9908d4c61f7947cf70c4ecc08da31aaa6ac1887bd388720cb36e10521dd88d7b2a483fc5833f8694be9892bbf8bb19b6ceb08a133f037371f287956821014b58c6eb9351946303a3b7fa920e32a471f26a18a0b939ff137927c2a79c27a991040fa0d29b5a89124de37fced8109ff634f6313551140a873a6b76245a2538aeba7a234845cb4ef0c9707a4c56f8baee1329864591d09745fec24b1b392f86c47c38a62b613a8e6dc022ecf58d7d81c0f1e11a27296290ba0cb5bc04516a50fd1361c248ce450b54698c28a59274204427c53c68b5f73c739a62f9d57ffbd17f18c06994f0cc58f0979646a7273b9f0d3493db0a23df085524845418695edd526af36ac6b0b4c3346a2f61317ac8e93cf54351e12a752183c7adac04c3a943c463599adb1f4dd18a69d6a933a14447b73c2502374682c8209706cabba3a2c27b2a108ffa23a6b9732f5bd14ff2ec25e9a384a8bc83855c043a372687972112050901f12b9c0ba8ae7676b1446cfb376b1ddb89af260007abb736b5b223044e73dab7b3566c7e361c5eaa54978a6f3f72c31bf499c0854e272005ec603d3a50426b24a35721c0f1613d55e68e92682217401b9a21af9296989e75588143495907cae38c231c7521197258ecc60bf0409e4729ce5bd436749343a449a9450c5b2af817db83210f9738c0029ba26835c73c4a2b85255b42af98703d1d47106e2b3bf3f6c90c1b0c88e40f13e18f4870aa42555c08e00aad7760321c6fa8151768930cd7c12d1b6149fb679d35e981319b566108b56b98cf1efb9ecb9a3efbb6ac471c6f0f207569eb2022ea0fb0048207e96a7dc805d0d07de1541531848d670817463bbed673b5071227665a157bdb5509eb09873a00b8c98c48a3c131e029576b76f49b7d0152bceb0bb499ac6bece46f54f16b5d7414c8bc27dfdc9948077c090304acd20a4955b350f22253576780696aff4998daab028632ce4b3a372fca46b0bb33f23a52a93c31dcbba882a925c9c6c0c4546ac152a0eac489e9b27ce9c89aeab652920690b6b9944fc6b807d896cce9bf0a0908f05322e184bb7c5b2a4d7459ea75bc700424f884925a2a83cc95241e7701944ccd53271f8b1992afac3bd3f63af3228e9b84a5d1a9483d5502dac28f992531ece7ccec18b14bac48f1f62039861e90cb8ec0681d059788ed147d1e10115aaab25b6b41a66a5e1388557ad56eeee6571ef418a5f0b797352cc013a1176c3b131b499008319c121185a976c5831bd3258b7bd7b3852aa12fb77e9db085389c0a9e1033eb224835d4793c8603296c965bbc699f87b328db504b335fe83010432a4ef2a0b0a4300e29309e3370660f9b21bbd79382970dbf4750b3e142d5f7c381030901e7c09218636feb3062d43ec75a7ff9a640005c1f08669c50d6a41fa86790f2bb41e7cdb401c06c3c035fb812ae2013604422a7e3c1e6aa437ac4261f7834fa95be9e71001b65bd2e0417164142f2bc80366a8e5e1ace65108771b321da81100397a117f00515b6a2c934599416cad1d5091bd23708e45eb6f90a2fb5c47c8c77d6e395a6332a45f4178b0959466f648ec5c43422397d4e771f902db7b8d876a028f1708e233d +private_key: 617c1296d2bb9802655166cb0c2074c206ce03fc18f252ca7f7a66d3e619acd48697b3a5d9845f8cba2fe98654b56cba727786ae19c961e447c07ab7b9d30a64c85659429fdca3a01823c30a8335014a2472898d963a3407980a63c6bdf5aa79bf2aa7da370f03b593ca91c77f998ad93917711b7639e448a2036b86489489bc41a25404f77b0436b7810b38a3b729472b26bb47c70337d575ed265c22b86d46a8c7f1c668e56a66f3d65223f0bfe60b472a90a463881ed587313a45a675b9aaaa7a618da1165d143ea764c0eaba20ce244f8e3acb79c9be141b73d8d00bb6db5d27e30c2ed5189c31406f154560d7832cea31d40533a45b1811216951099f59896d25e1c1e898ba033aa6107b703cc7cd357b0d60118fec352b5df527fc0245f7a44fdb649c01b1b9e410b8990c689758aa606c1ba559075e2c3068e865cd835aceb37a78268e8eec1e1c93a619abc71c3305e6db35b58791e8d00febca9d3ed37b62a818d2a12a66d591420cb38896248a5792d2716c63c6949b804ce27768ac78a974e42be1437cf170464610223f9812908c29fb748ea9e253d3d8242320b4b0125bb094c7a2f635eea0ad60abb710f85150d797502617fd4341fbd58835b48412309330d3859e1140ba2443f6970b96c154d5b9429fb1a41ee6a30e4c4b919642fbd288629c68301c363599738a5571deb84358c571311737c01101e00c490d918260d7172efbcba6b8544d96a384101be6f64e946012cfc91125236b8a54781c4ab58dac60f737021c5b6e45b0b4fcbccb224bc7cb1b551ac35fd99a5f9c0cbdffd64d43fb3588f177489a02340b19fa12b2f3ba61f6d53a7a0cc1e186bff1a49cf22c500537933364a7fe257a5519c133aba7ab7648e2f7c6869b6531723cd03673afa10eb8b30ada830d53a4c7099695e8f4242454382e752b86fbc8bd361c058986d80699e60039437066db9172a6d8b3274a6369402c12a885a5e5136ab8b10ab8c7d3361eacb7627f16cc411bc7e2b3403d6b5f53b31f6a6657c2464eacfb796afb6a172a201026b3834bc70feca013fa036b5611f6f81013ec66017a4b1ea043f52c02ef0b55f05b6f65783a4dd6641496988e3a84364352967ca26302168ea81405929a4c72c30aa14f83016692413399630b582078fa6574dcbb29f17c5b85e3134e8c2db35c73b4683abd8b7ddf666ac1501b56d855081054b3085144a57f74246464bbc226c8605f71bd620562c044b9a6e656e7640549147819e124afe991fa28b049b388d150a313829144262234f46779264ddae5725469755a3594cc42cf29469b8a35016d170323601131b72304378a66f41dc0e43792915f5f35b338822ca6c7c9e6273f6ff36fc022522732514bbabbace610b9d952043c8d9ac98e89743faf9b2dcdbbb10aeb07c636001060a165d41309b46fd7d32c5f05c138d33cd06c3f316117ff90831aa5b6e0e054d49761ef3b2c6771b0f6f7124e5b8ce0814104500e704c84202b02deb0b78c17883ce72444850e608620c97290af3572f2681460f08e1fda10129806f6431317daa1e091889b7573c9100d16cca12b77a27706a34c5775bd494f13eb59002847d13163e777886501a497a7bac4ca9166b1c2ed27249cf11f135876b4c50c2febbace470505202a8fe10223b9374c6520ad4075dc30b0c4d06ed30877beabb108a6659078b7bd56c9c3d6a83f1b4380019cda1c5c6519145d515dd521449b717a98335efedb5e301a9d72467b4b458089d4242620697e27887d5b88b8259d0564ca792a3395649d4f458100e14f09400e8bbb77d64bab25407c95bc792115bd88e767b3d7c7eafca87dbb27e7c1989e74817b723f348a0a4d3b2b3506cc150934f6f50bcb676b756b1b1a401822c853b986b00599c61a269dc8a1b54227963fc7a7608952e984b90e10a9a81172b2577c7fd9ad3ce4b319fa0611f46706ea596af024831248ee19258c4b0d9928aae5208c4f3621c7696adb95a7cd91c39157cc4ab735cad892768850493b4509564ddef09eaf84c6f86638a1667dad3b2076cb93fb538d02a5c36e28240c367ba19717fa695dba621359f85c05e740bfc2ba1c146dfed60a88785179373ec49680999aa616e7753d3abceb4a2ced2a60c0b00bb3a90b2be5cac300b107f76c0d2245fe775fc5cb525824bf945b31bdbc0a86b88d8827ae7fc0a3db8bb9f534a21792637765081c4669832bb66485133f61bc22c55f03b109882b9ad7e75fbf12519873a18d9472087a6fb375244b313f6a81b608d88b0f79147282c9c37084b00138e8bc8cb3bbbd2bf9c5f95766040617962651f0556756bb9121a6bf09a515c6836b650c44e9db72cef47e08079945b8cf19d8bb25641186a8c8999103898492a904c5a7f2befc1614b4482931989ff7fc83ab40781ce54fb51866706cb04ec2c1c8813e963c70b0f15567b41ffdda8d02a94d00d1348911be52163f5c44188b6214856763a409040e8480c0f263d966a99ba7c7d5724f225ab99327a962d1497e9b265bd819c2959b1cd7995d138b4d71804fb122730b6133713d68c95d861a3c567c803adc403cc911186327e1726e2881bc9b4b1873091637c5532951c0c01a0999e7740fa77c1c1c847feb3dcd387ba3974e1ad0310f889d05e3508f02443491261c367c94e074009103e8bccf25520c4546c4bcca7aad34aac89892524219ba9b715c470c72c6c67811764926335f722c03b85c509105d6f43f65ea9908d4c61f7947cf70c4ecc08da31aaa6ac1887bd388720cb36e10521dd88d7b2a483fc5833f8694be9892bbf8bb19b6ceb08a133f037371f287956821014b58c6eb9351946303a3b7fa920e32a471f26a18a0b939ff137927c2a79c27a991040fa0d29b5a89124de37fced8109ff634f6313551140a873a6b76245a2538aeba7a234845cb4ef0c9707a4c56f8baee1329864591d09745fec24b1b392f86c47c38a62b613a8e6dc022ecf58d7d81c0f1e11a27296290ba0cb5bc04516a50fd1361c248ce450b54698c28a59274204427c53c68b5f73c739a62f9d57ffbd17f18c06994f0cc58f0979646a7273b9f0d3493db0a23df085524845418695edd526af36ac6b0b4c3346a2f61317ac8e93cf54351e12a752183c7adac04c3a943c463599adb1f4dd18a69d6a933a14447b73c2502374682c8209706cabba3a2c27b2a108ffa23a6b9732f5bd14ff2ec25e9a384a8bc83855c043a372687972112050901f12b9c0ba8ae7676b1446cfb376b1ddb89af260007abb736b5b223044e73dab7b3566c7e361c5eaa54978a6f3f72c31bf499c0854e272005ec603d3a50426b24a35721c0f1613d55e68e92682217401b9a21af9296989e75588143495907cae38c231c7521197258ecc60bf0409e4729ce5bd436749343a449a9450c5b2af817db83210f9738c0029ba26835c73c4a2b85255b42af98703d1d47106e2b3bf3f6c90c1b0c88e40f13e18f4870aa42555c08e00aad7760321c6fa8151768930cd7c12d1b6149fb679d35e981319b566108b56b98cf1efb9ecb9a3efbb6ac471c6f0f207569eb2022ea0fb0048207e96a7dc805d0d07de1541531848d670817463bbed673b5071227665a157bdb5509eb09873a00b8c98c48a3c131e029576b76f49b7d0152bceb0bb499ac6bece46f54f16b5d7414c8bc27dfdc9948077c090304acd20a4955b350f22253576780696aff4998daab028632ce4b3a372fca46b0bb33f23a52a93c31dcbba882a925c9c6c0c4546ac152a0eac489e9b27ce9c89aeab652920690b6b9944fc6b807d896cce9bf0a0908f05322e184bb7c5b2a4d7459ea75bc700424f884925a2a83cc95241e7701944ccd53271f8b1992afac3bd3f63af3228e9b84a5d1a9483d5502dac28f992531ece7ccec18b14bac48f1f62039861e90cb8ec0681d059788ed147d1e10115aaab25b6b41a66a5e1388557ad56eeee6571ef418a5f0b797352cc013a1176c3b131b499008319c121185a976c5831bd3258b7bd7b3852aa12fb77e9db085389c0a9e1033eb224835d4793c8603296c965bbc699f87b328db504b335fe83010432a4ef2a0b0a4300e29309e3370660f9b21bbd79382970dbf4750b3e142d5f7c381030901e7c09218636feb3062d43ec75a7ff9a640005c1f08669c50d6a41fa86790f2bb41e7cdb401c06c3c035fb812ae2013604422a7e3c1e6aa437ac4261f7834fa95be9e71001b65bd2e0417164142f2bc80366a8e5e1ace65108771b321da81100397a117f00515b6a2c934599416cad1d5091bd23708e45eb6f90a2fb5c47c8c77d6e395a6332a45f4178b0959466f648ec5c43422397d4e771f902db7b8d876a028f1708e233dc266d76c52b2a849f00690ffb252699d5b3e9f66e0abd3c1362c39cedbc6985099daf37400cfe59841afc412ec97f2929dc84a6f3c36f378ee84ce3e46cd1209 + +# Official test vector 8, seed: "cbe5161e8de02dda7de204aeb0fbb4ca81344ba8c30fe357a4664e5d2988a03b64184d7dc69f8d367550e5fea0876d41" +seed: 0610678ff4dc3128e1619f915dc192c220f8fad94da1943b90aaec401683a492da1804ddb5aa9b1c6a47a98f8505a49bae2affde5fe75e69e828e546a6771004 +public_key: e4f12b6f27cc55032582857549f3ba0d6bafeee47ca2e2cee04b023b066f53f75a5dfaa0aca416ed16cabdb510564738aa08134346757f92585ac112c25a6e0723958b7b23bed41a126617b4dc30de275bce903a1c6c2a28c5c58c49a5f0c447fb0c86f5b6a6e9d271383588ec398fe6928f04b67ead2633ee174564cb2115a55d8a53971e0c9fe2a209f9c8745467bb8d9944e6c1bbc8a54a5d28cf82e8815a3615dec5695d00c0e72b2f7c483f72d36d2f091cd169311a283a42d608d0d66e020172a6a799a66c10aa9b93a9dc5caefc805cd77d567390bf017693db8b33392bcf96011dc88287375bee828341e5a515a97c019895c8e68d41c0675723af42b6a50da91d04c9880d21a5af9929362411f5b36c75199211da655f454539aa399ec276af29011fc2b5e7f5534461220ec3ad3869178109a282e8a960b6119d0a4ce801d05150c636d20d70dbb092999bd2ab9597a0b1de56086c27ca8f5c22b86995e5aaa9f6514323a31750eb794adc1ea1247317f82eb443604ff254e99a895436060291afccaaa1fa26b20fbb9f48e462851513f7707a5c3461e3f4b3b4e72ba3089c53fb85b9c0576c06b2dc832fafb929c3b34de6974021378356fbc4e1282884d062b831b9adac1eece03f5be7c9c7e8b69b1a7a79304842231f0ba1107079416b388a074ccddae26b4d22693f95a8bbcb2f3445ccf74abb702428fd3a04bea9ce55b6c251c57b6ff10232a6a85832530835883336a10992cd30144b757ab6a6377389e36093e218bd09cca1504400a7a473e248ccd40567637183ccbab9bb2dde7198abf35df8f8c836e1bfe061448b133898fa6ce3abc79beb4ac8d9997c12588c908aa1002b2570a64654c8bb3c1914583748b95d13f9619659ab4c8687f872030df926ee04b6a74047b995625b1a9a929a7fad134f989c7cac25c42817bd9f45327725474a629df0944f5fd3bf06057355f2843e8157115361cd627ee6d548230a89ad49bf1b156e50cba74fc19a63ea2e01796b6ef4a37d4212897346da865f5c36cc49a6954a8a868ae195bc4625300716d3b3692e683a10d9192e2ac5d096c465126730a9b72bb3a729a7cf39922674e39900dbbf91b2785e301ad8a3843f875361b5c4ee0953ae34a583b36d0f54cc194800be6b0a6465479c51999d5029ff50117d5498e8c6a0c81bbdfc6c220b21a310993fd5e7691834732e358faaca460fa26ad20044dbb7177c47736c412bc9011f09a0ba4d22aefb485a524bbb8f74bddcf78358c8addec550b86895fc3141682c0c323210ed756864910c9446c7d9983cfa98ce9edc644967cc93b7008e3c9166ccbffad008cca6569ae913e7327c26032744758f2e82a70f8a399ac72657995ef2754e3184c263ab93ced1510bba1d0838a13aa2cb9d7a25c236a37ec37fc5c0093bb47dace9944d077f5c837d78c54e3fb1cb0e8a70c4a18b6e8b95f6b7be2b79b802055ad4ea5febe770c39757ac42a09feac48b6174bee79621bb3af7d0a0094895cc8b6aacf722eeb76abf6b6f0d66bdc545c68c845b22cb167f96a0448b0cf812c46793a28b55a600a1431374b570c93d6dd7b4f789101e578e29d96b2384a8e09115f9e1c8dd008d0047926c17285dd996690b4ee9957cde5ba56451bc2de46371738e65744fbbb558537b33581998dd0525ebb9c17d9777a701a676956a03bb4911070d83b603f5169f66838cb671627b899e9706be9460ccbda50135d504e2709ac31c48c4fa67eaa740bcba4173ec25fd7766bca198fe4122fe93be5b646b1a475c74ac276bca3904a7c119b057dd2bbade1701ff249f484a4bef04392122c416aaacd5726a273066fc510f394903b5f34860206d8c45a4cc340440179694223b8eb578c5bac2cdd183507946e3d02c0e219ae33008e19822d77acfe5c85bfee7a0b6aa0eada58ad1ca5ba1e12ac92063c326ac4140250be091b2095f568ac7b483acafd7045a229954b8583a33376ca7b19a948a10c4a45a5b80d403c89773b7c2c67ad1358bf2900e8a793dee71b91c978c389b4d8c824937e921a17914c6d1a4bdd6460a2c7cac50cbb2f006ce9c98c7a3342f9acfe11094b249870afc3e15800701d606471a7a0dfcc073c277bb74706e5571f81cae7331a7d1e36dfb437d7d52957526bda146bfa3530dfc93063fecb103ce58c30abb5bb70c6dbc92e5f3bf4060 +private_key: de8539327c009f37124d009dc3d112be749b80e86ce81a4edcc802e757aeeeb0bca029441dd2193c568063599dc8d87209775224a792fa020eaa02aaaeb0c444336d94d38a1a156ddd4014070c197e527d33ba3a40b496c8fb19f61353ca32ad986664cde663862534a7351ceea4779fec825f8ca93aea7f23883548989f23f77a25f99ba847b427d319145cc8e32656e83b6295f50a015263c75ca8778650624ab7409c0f45964a8cf466d2fc95417807a481a1d2062629b17df583b254124342316153fb5d45f67bba6024f6180252b6b54662cb2ad793704c51fde4bcc758314dec86e6751ecd6a0324aa123109c38d356b0dfc9676c087bd7c945871a33e46c0924b8e8e1b6777f530615a5e3a71c95ca532c8255e8eb6afa1b0570be3b80fd1974b170c3cf30559d998e0684f92fb1bd4fa79b5bb5aff34443c0c1a5423c42833b9753b1f98e46a024cb1d3074b00f101802b105a89b95b306a7d546f1d357cce202a71043ac2859265cb768a29cea051810a08965c773546768c09a66aa76710ed954269070fc886a30eb42e33c4cd7ca650cff5aba39b7b0ad62311b92139805e89dcb14507c0dbaa6ded775bd1107fa1e1c5d2a61ba9d732df58b8845b4965d001f78066261794311701330b238483bf61780f7a4082881aa316892f5cab105b5519ad111bc7e32fa5f23f98202cccf67d825826cfc50a6db58c15e12a6d84c185b469b0f94022550eb72a4332d4377dc356a5b34135d1593117651a5c0f0c87580b392b8643386167119f4651b7a433d7104f9a216486ab6a6e0208ed6b75b93989797472391c3464054eaa91558e1b570bb2116ec964eeaabb650896bc296c93a090bbe1c79a320f4e94a2a27122fa8c422a0a4d318c62cc840ea2379ccda0a4fc71c1fd7759133520b8ba0037f688f2a3057fac7fc5e6b3d3b1652c2567b092b7add6a542c182c579a366d620c2f40e59a13983609df8d2c6a7301e0566323f00132ec9a3ce800892304ddf74411d3932c27089dc987e8a3755fb010629887e0e518acca18110ebb53a48980091ab4c156185c8965acc1d16d702efc301fa88a20c5b4fdb24a25e0a6822c9cd9d6b7a095c2e14b027ee38319fc0827c5c393fb6c3eee59cf315031e5baeb6b08753c7aa0cc7cf8abb926298c444352b50d12e7f2474aa065eb6c16b1b660f3a1a80dd36151c8b40bb265cbafc87c526b89b860de3513770110402734fc2a3568aab6e751233f5da9a7f846f5e4c7d318595f1989d557312d791261e642fc93b23e6378d61fa036cd11f0e3723e7790551d010cba70acf913acba674393b06de7aa856953f10ab2ec7f182996695d4bbacc5457b904b7df2fcc73bdb62c047b3c7377e5c41b247fa1f562c57d4a09c6b9710c7675e267263cd06781a5b63a58c36c94317509540a81063cf97af65249eb6648290e10c627b1029fb593a05cb575c3f63f280d367cffd0c9a8443836235b90201c5a8c53380b4b3c669936f965337acc72c05ac5b441fd8dab2ba5259e38c9b87c98bcd9646aa397961a160c7718808c414ddb05742189ec4730feb020d92f84296dbb97a453f7f4b09c965a6652894e92350f097b184a1bccb0728ed70c0da600b3e3b1c6cf0790135a329b6b3c86c748ae6840ef581939c81ccec3848f15821643e4a41cd9b48b1e0979a964c858de00c67970ba281a4d70678d61a0b6e5b93cf7b5297c6219c1733670407d8272491d137bfccab4709984aba8a3842415ec337e6eb5e22b4855aab21bb394c470881bec25f21238bce98caa9a44e06277870a74426bb927b46cb63f10d116bc94232c566406b79c1199cd16dbedaad1404ae4f98ba38b58d6f6b7b46fa21247b0d93d58b0081c5473aa14c7964d56496739214033c34528a8b51d0857ad3b18699cf7a025e84d91788d906e70c011cdb3b291019e2225696a2c61d0787fe445b6e36c64231288f3854e52aabd1295cba072adf5b756aa19c9b079084c204ea1bc7b65a34a2e8894fcbca16b42ddf415b40b73d5bb36ad2714b233c899fd42040502a9ac208c031885791323a9b706a35cbb9f935de1633d1b6b877d5c402e92e8d06117ea4a8fb709de91320d5aa554d77a945b30c127031030858c066556c957fa8813bf9f4bea15257905a4de4f12b6f27cc55032582857549f3ba0d6bafeee47ca2e2cee04b023b066f53f75a5dfaa0aca416ed16cabdb510564738aa08134346757f92585ac112c25a6e0723958b7b23bed41a126617b4dc30de275bce903a1c6c2a28c5c58c49a5f0c447fb0c86f5b6a6e9d271383588ec398fe6928f04b67ead2633ee174564cb2115a55d8a53971e0c9fe2a209f9c8745467bb8d9944e6c1bbc8a54a5d28cf82e8815a3615dec5695d00c0e72b2f7c483f72d36d2f091cd169311a283a42d608d0d66e020172a6a799a66c10aa9b93a9dc5caefc805cd77d567390bf017693db8b33392bcf96011dc88287375bee828341e5a515a97c019895c8e68d41c0675723af42b6a50da91d04c9880d21a5af9929362411f5b36c75199211da655f454539aa399ec276af29011fc2b5e7f5534461220ec3ad3869178109a282e8a960b6119d0a4ce801d05150c636d20d70dbb092999bd2ab9597a0b1de56086c27ca8f5c22b86995e5aaa9f6514323a31750eb794adc1ea1247317f82eb443604ff254e99a895436060291afccaaa1fa26b20fbb9f48e462851513f7707a5c3461e3f4b3b4e72ba3089c53fb85b9c0576c06b2dc832fafb929c3b34de6974021378356fbc4e1282884d062b831b9adac1eece03f5be7c9c7e8b69b1a7a79304842231f0ba1107079416b388a074ccddae26b4d22693f95a8bbcb2f3445ccf74abb702428fd3a04bea9ce55b6c251c57b6ff10232a6a85832530835883336a10992cd30144b757ab6a6377389e36093e218bd09cca1504400a7a473e248ccd40567637183ccbab9bb2dde7198abf35df8f8c836e1bfe061448b133898fa6ce3abc79beb4ac8d9997c12588c908aa1002b2570a64654c8bb3c1914583748b95d13f9619659ab4c8687f872030df926ee04b6a74047b995625b1a9a929a7fad134f989c7cac25c42817bd9f45327725474a629df0944f5fd3bf06057355f2843e8157115361cd627ee6d548230a89ad49bf1b156e50cba74fc19a63ea2e01796b6ef4a37d4212897346da865f5c36cc49a6954a8a868ae195bc4625300716d3b3692e683a10d9192e2ac5d096c465126730a9b72bb3a729a7cf39922674e39900dbbf91b2785e301ad8a3843f875361b5c4ee0953ae34a583b36d0f54cc194800be6b0a6465479c51999d5029ff50117d5498e8c6a0c81bbdfc6c220b21a310993fd5e7691834732e358faaca460fa26ad20044dbb7177c47736c412bc9011f09a0ba4d22aefb485a524bbb8f74bddcf78358c8addec550b86895fc3141682c0c323210ed756864910c9446c7d9983cfa98ce9edc644967cc93b7008e3c9166ccbffad008cca6569ae913e7327c26032744758f2e82a70f8a399ac72657995ef2754e3184c263ab93ced1510bba1d0838a13aa2cb9d7a25c236a37ec37fc5c0093bb47dace9944d077f5c837d78c54e3fb1cb0e8a70c4a18b6e8b95f6b7be2b79b802055ad4ea5febe770c39757ac42a09feac48b6174bee79621bb3af7d0a0094895cc8b6aacf722eeb76abf6b6f0d66bdc545c68c845b22cb167f96a0448b0cf812c46793a28b55a600a1431374b570c93d6dd7b4f789101e578e29d96b2384a8e09115f9e1c8dd008d0047926c17285dd996690b4ee9957cde5ba56451bc2de46371738e65744fbbb558537b33581998dd0525ebb9c17d9777a701a676956a03bb4911070d83b603f5169f66838cb671627b899e9706be9460ccbda50135d504e2709ac31c48c4fa67eaa740bcba4173ec25fd7766bca198fe4122fe93be5b646b1a475c74ac276bca3904a7c119b057dd2bbade1701ff249f484a4bef04392122c416aaacd5726a273066fc510f394903b5f34860206d8c45a4cc340440179694223b8eb578c5bac2cdd183507946e3d02c0e219ae33008e19822d77acfe5c85bfee7a0b6aa0eada58ad1ca5ba1e12ac92063c326ac4140250be091b2095f568ac7b483acafd7045a229954b8583a33376ca7b19a948a10c4a45a5b80d403c89773b7c2c67ad1358bf2900e8a793dee71b91c978c389b4d8c824937e921a17914c6d1a4bdd6460a2c7cac50cbb2f006ce9c98c7a3342f9acfe11094b249870afc3e15800701d606471a7a0dfcc073c277bb74706e5571f81cae7331a7d1e36dfb437d7d52957526bda146bfa3530dfc93063fecb103ce58c30abb5bb70c6dbc92e5f3bf40602bfa2721399623d76222e93d092c34792aa8308d8999aac7e17433da2166292bda1804ddb5aa9b1c6a47a98f8505a49bae2affde5fe75e69e828e546a6771004 + +# Official test vector 9, seed: "b4663a7a9883386a2ae4cbd93787e247bf26087e3826d1b8dbeb679e49c0bb286e114f0e9f42f61f63dec42b4f974846" +seed: d322d56d8ef067ba1f24c92492b9c56df3a6ef54a304adc1b69913766a1ce69756047447b810cc094d400ab204cf9ae71e3afa68b88586ecb6498c68ac0e51b9 +public_key: 1e778910b9afed44842d78417cd027f819699af6b0ab475a18b7359817b50c306bba0728c5a9088e667dcb7944af6c10ba86300308165c1242cbe8708c8347c44ab77478304efc0a9e5328f203b90108418fd1b5b7c3b085e74cf500729e27719c2596feaa689a54ccb3a5a4a74acf36c652fb97ad49190cc6f08382017db7a910f816701957cdd8449ca075b9a3c18bd88469e3f51e0c967146413bdaa15c38284a726a8935b3987e774a182023cc0acc18a80b8b6909b52b8726881380b204cf1c069415a99556476b0218ebb4217ff33a0593be5f3cc47ef89c13397d68933721c5a6f1241b88f452654c249d35c1a8b16305469586435c1a6156f8520ad33938c8dba429c118154020205b0235262f233c36a89b384d82bbc49b6d6074517a631c5ed285f56585b286462872503da5c3df9c91340071eec625f8b29e4c416e93b46d37f95822ec35c2897417d7181dc9a7097aa74f3a02bf1420b1a568e1d7b1a743c0d07623e2296071912f7db25d67d751fb3b9ffa671403f29d162b635f0c7ae693578d2a752984914eb9036bca365a76861a05075b4b2a95077b6600a42e071d60e21618a689e3f7b5c9836b7451997ef80917f6351f814e2ef1786736a703012d3c9ab9db50b5b9f08bce69ba50a2c48f059dde2181f725cf39f426b39028402acac36bc0797c918d30a4a6d4bdea2927cd75364d167f34db97260039bfccb64b0003ab3532f77353fb6a0433a5a95570c2ccbc77f0e4bec1584cb1a88735f27acf58120d01265cd7236f18af3c00b4363cc372fab07ef3a87030b19b07af020320f1f747e32a8bd1f32e78f1a62960a43327307d8c212d1044689805be15c1c68682d0a8a24ea51267058dc4b15f36e12104ea83e425c248209a8d193911e2a2dfe3a47f485abb226f02919f9bba4014262ffe6b4607bbb511fb5fcc205134f8aae2310245b9c9e73957a2b5b4cfe0916dc1bf6ff891c645b28e63bab6c23e5077a8c3954fb5978ad8e07dac5c5c1fc4759912524566785df222d04435a6a24361178d917b53af57438b46aeeac546bb5207c186bd196bbb6277216d95ab6e545d78e04b82669d19093241b808aedc5db79a9e54762074a0aed86931497917969ca7f20942eee719287c887b3508f23b919418278be0236043acb3e4abac940c44c3aec3ab8c78bcabd84c1d373899369b515c2478c6085ced3b08f668224f950d3b82355468bff0534cc7660045e96ca40067de520091437309f7030f71a250c359f0c71c2f8819b62cb39646b19d63669f679ff9f48ac7a426e3fc1a1d358b675105f28586726304adb8109e104715b6c330f053961207eb96148a866c12c9349fb6aafd1b42f5f80a2d827094c3b4def6478212332d96359fb3450cfa6bee8327ea707b8cc61799105358521c6199607d9b769b38ad15e4b638d12d16aa90aa49cd90b9047696acf9c14cbee59f82b46de5bc644402400baa2e839ac801c70a368a3611cb11a1484dadf30185112f52421196d1797a3085f5d429d286343953ba8de676c381aebf394d0453bf1610905f3b6afdd5299a750f2333b3944067d9a9cc201922f9b5162cc41cbd35400a275717228050a97d05d0c1b303bad3405f36a1218c5c089c98467aa37905b334edb31f667a88c2129c1749784f49b83a329275e1b5fff4798d4b1c5779a5d433ce716bce5763572a29cbddf5b40b464f3e163cd5b554c5612c20726f57244735e2616f45356237263d69a1e1e03cc4d9ad57c83b3075cfaee45418282261d8bb531b685c766989c28ae9f991415907858308a1fa027156b6d3c8c0cf926553b570fd077b6fc419d8f4556655ce53f6802d406781b06463042304477bc8ea19757bb54f2cb54b9276fdd575d5a00c267b1222d4c25de11860dc14a1f3453423caef02bfe8720472c194dd234038f8aa0d3118286b530247b88a83318fda0a9c226cbcf22510f681db3880c2208b70f67c124437dd32ab9120894aa287c7040e06f6cdd0121ede209068238b57716db488335564c316111cdd90741a197646874922ec355a26a7e5ba4af5873f974b2626b40afbbb5c59501fceca0c9fc76fe9b8786ad1c5c76b071b6c054aac0eb8e0535bf8a4249a9256e4c1e8ec673fb5bcae20063a90b601e047e9bac3ba827acfba4a7e9b040776bd6f351e548ee005d759da86c9b2971f9d6d1cab8d +private_key: 7592584ba97569a4cc9c918d9deb2312e81719fb4286d67866e9a14fa947f220692ce29d0f68a97f851e5c938db1587180ecae36fcbdb8eb19d96302bf38a02e0128fa562ba7a9260c873460814ff3021d511482f4f731f9a152ca42c920285003025c5aa0c77698bb5b778c1f864d696c0dd4d634421224c7d14287d625b422062310af94c005636c8f15a486e3ea3151b5230e337aaa59235bf7968d9c7b067b8d1bd6247316047d0568aef514f725befea696ef124f10f822d45773e780226730b8aa043f80229ae2200739392a3b42c0f3833da3b18b38c243f0a72760a917581bc6d2784cd4b796e6812fbde666fbda9ce9522a32242a644032f144c4904031100c12ae7a3aa52aa3eee02f27909736a8bf9f8992079c76157001c64b08428a5acd67762d01c4009d4ee71c3c9047751d89b0f6020ffe848bf3013a5e4c5c3db6457c55bfc8d62f6db63fd4ab1b51a06b43f8b7eea0ab5987bda78278d711ad53a6b5fe58ba81c5931c9b1edc74643115bba84ca0621a9c3e49325f8b583715142732c4e0ea713f36c6fbc3c90a467757c798ede3368015b95a62adb0a62a12452abdda5e0b9a882eabc2f1150157e8aa950010efe51f29b3c88f132a02e311fd75497bd21828f428cfb12bc361250b3a765e022d70bc3544b55df119adbb5c63399172ccc7bb6f392f04cc02f96aab64e0b46744abfe9acc869487f929317ae1c103508556f688be7c3407202a79e54f68683cd066c537366bfb918b3916a8b030b0cc1301e1e4b7098a47cbb46d417caa00418e9020629db0bc597b2a9008cfde2bbcc777ac7bd55f2215502fcb3f803075037a56e70c8b4f3b44b9269824610bccd15ca8a3c52357bd582c52ea217b22627ed9eca00e390e7e890e626b75af7bb9f5d8a05c293642c51b0d399d9d5250b19724d22b3f1010389bc38752a032622bc44fc4ba074b0b1ee753f6305931fc3cb7b0c88fbba271f0722e73c83e8c49a120cd3130471a78c10df4cf52952829e596bd651ab39c430c4c4904b55ebfb06f74640dffa40d76c15e3779bb752ccb3d86ad225b8333208ec12c50b7e923a9f67b3e77aa55a8486cba6efab46ce56a7adb92739b264617ccbdf5f41d5797873a42b36f26a6fad310df949f9c670014403136522fd5530e03263401f3138847c363e400477baff7c38ba4631a19517bdb61b8cd3868a7c6bde90a97d5722b9c5b17bf05c60822a705179d018a324e0ca09b54998ca8ac188b0037e4b563b479c4795562591cd3e06f64bb83057631b243cd981819a3655f68b506fd0cb52237c9b9166d07f46a44c22c037b7b07250cb5088a96473c9d225b79aa8c09245d8b9a71496ac9ce658d0cc329a1bb3fbd03c433e413f355515b2373d8158a40562501fc46c0e7a4e903293442a2d8bc0fb26a1475d2ad52cc1b99229c4de5a78b7b07d84475b5e8651590916a4978dcf72148838140896e210a3c328486a315a9e15592b9945730cccd1fd75ed55a74f4897e63b3a1d8b96d5021cbd0b8141176af3aa4a69ae6c634419246ba662f5739e46991b09c631db407e1a94eeaf717f92a977a448e67891be2006da0371aa0b0c581db7a605080533b2427194df500c4d4d17a24a6a98f96714556cba48327ba2abeca7c06ffd382133621cbe68d9c11b07ff458e584848473431b488ed6730aeb26093288058b653cfe453ee00c3d97d35e5061660f246ff10c75f6ba6b404a48d537a846c06d02b7242462b0c0a80cbfe9022d97852c290887d0766ff81cb9a08f0f06bf00d6996c962ebf4139739709bbcabe7e770f01fc720bf015e81517d1a7ac1fa69236d452f783c0dcb65cfde091c0b8abbdb8b83fd2134e7434452c21bfbc0d5fb81f631c2afb1c0f65ea0172999c6888b2c39a8269fc383c06105a34194d8bb64d31bd56e86e5c3758293b7844fc5412a7b7d9cb9a614420be1c079ae9830a494f356b99e9981e55b5cdf2fb227f2a8eabb86531a00e42f07c0e1a0b198bb198ca8252763b62872ac7c742ba04084df82f542b067c23b72fcb51dfc9a4fa2958ce0c2ea4265c1654bb2090ba81273e83faab505871ddfa6c76062b3308ae5d8143e258793130431a16ce5e7b62ba9b90dc776e778280d0f2b8cdf7bc8750a96b219eda180621707f1e778910b9afed44842d78417cd027f819699af6b0ab475a18b7359817b50c306bba0728c5a9088e667dcb7944af6c10ba86300308165c1242cbe8708c8347c44ab77478304efc0a9e5328f203b90108418fd1b5b7c3b085e74cf500729e27719c2596feaa689a54ccb3a5a4a74acf36c652fb97ad49190cc6f08382017db7a910f816701957cdd8449ca075b9a3c18bd88469e3f51e0c967146413bdaa15c38284a726a8935b3987e774a182023cc0acc18a80b8b6909b52b8726881380b204cf1c069415a99556476b0218ebb4217ff33a0593be5f3cc47ef89c13397d68933721c5a6f1241b88f452654c249d35c1a8b16305469586435c1a6156f8520ad33938c8dba429c118154020205b0235262f233c36a89b384d82bbc49b6d6074517a631c5ed285f56585b286462872503da5c3df9c91340071eec625f8b29e4c416e93b46d37f95822ec35c2897417d7181dc9a7097aa74f3a02bf1420b1a568e1d7b1a743c0d07623e2296071912f7db25d67d751fb3b9ffa671403f29d162b635f0c7ae693578d2a752984914eb9036bca365a76861a05075b4b2a95077b6600a42e071d60e21618a689e3f7b5c9836b7451997ef80917f6351f814e2ef1786736a703012d3c9ab9db50b5b9f08bce69ba50a2c48f059dde2181f725cf39f426b39028402acac36bc0797c918d30a4a6d4bdea2927cd75364d167f34db97260039bfccb64b0003ab3532f77353fb6a0433a5a95570c2ccbc77f0e4bec1584cb1a88735f27acf58120d01265cd7236f18af3c00b4363cc372fab07ef3a87030b19b07af020320f1f747e32a8bd1f32e78f1a62960a43327307d8c212d1044689805be15c1c68682d0a8a24ea51267058dc4b15f36e12104ea83e425c248209a8d193911e2a2dfe3a47f485abb226f02919f9bba4014262ffe6b4607bbb511fb5fcc205134f8aae2310245b9c9e73957a2b5b4cfe0916dc1bf6ff891c645b28e63bab6c23e5077a8c3954fb5978ad8e07dac5c5c1fc4759912524566785df222d04435a6a24361178d917b53af57438b46aeeac546bb5207c186bd196bbb6277216d95ab6e545d78e04b82669d19093241b808aedc5db79a9e54762074a0aed86931497917969ca7f20942eee719287c887b3508f23b919418278be0236043acb3e4abac940c44c3aec3ab8c78bcabd84c1d373899369b515c2478c6085ced3b08f668224f950d3b82355468bff0534cc7660045e96ca40067de520091437309f7030f71a250c359f0c71c2f8819b62cb39646b19d63669f679ff9f48ac7a426e3fc1a1d358b675105f28586726304adb8109e104715b6c330f053961207eb96148a866c12c9349fb6aafd1b42f5f80a2d827094c3b4def6478212332d96359fb3450cfa6bee8327ea707b8cc61799105358521c6199607d9b769b38ad15e4b638d12d16aa90aa49cd90b9047696acf9c14cbee59f82b46de5bc644402400baa2e839ac801c70a368a3611cb11a1484dadf30185112f52421196d1797a3085f5d429d286343953ba8de676c381aebf394d0453bf1610905f3b6afdd5299a750f2333b3944067d9a9cc201922f9b5162cc41cbd35400a275717228050a97d05d0c1b303bad3405f36a1218c5c089c98467aa37905b334edb31f667a88c2129c1749784f49b83a329275e1b5fff4798d4b1c5779a5d433ce716bce5763572a29cbddf5b40b464f3e163cd5b554c5612c20726f57244735e2616f45356237263d69a1e1e03cc4d9ad57c83b3075cfaee45418282261d8bb531b685c766989c28ae9f991415907858308a1fa027156b6d3c8c0cf926553b570fd077b6fc419d8f4556655ce53f6802d406781b06463042304477bc8ea19757bb54f2cb54b9276fdd575d5a00c267b1222d4c25de11860dc14a1f3453423caef02bfe8720472c194dd234038f8aa0d3118286b530247b88a83318fda0a9c226cbcf22510f681db3880c2208b70f67c124437dd32ab9120894aa287c7040e06f6cdd0121ede209068238b57716db488335564c316111cdd90741a197646874922ec355a26a7e5ba4af5873f974b2626b40afbbb5c59501fceca0c9fc76fe9b8786ad1c5c76b071b6c054aac0eb8e0535bf8a4249a9256e4c1e8ec673fb5bcae20063a90b601e047e9bac3ba827acfba4a7e9b040776bd6f351e548ee005d759da86c9b2971f9d6d1cab8d517dd00566aba5f53253d778ce06e380b14c9019095028f3944a31a1aa4816d556047447b810cc094d400ab204cf9ae71e3afa68b88586ecb6498c68ac0e51b9 + +# Official test vector 10, seed: "980d0ba7c8f8b23d0e948a6029ff2659810ea1360064663a8994d0333c8543ee5ff5d6d5c9acf446e61dc464f792b9d3" +seed: 2f1d8a3bebb34540324b9485fdf3d5be3b858f544abc3fc641b5728cafab03ba8d6c42e7270ee2b77b6045385f3d175984a0e260363166c73b0c70c971644363 +public_key: 1cb3c6a7f721c4039b10482990923aba0427e2da5bdd30bd55133989a5b43bc371d2105415e76ba18786237c7151548b26005961fb2a9e737e39bbaf97f612cacc3ebbd216f9f57873f97c503a95a49a1a113b0c454526a082203b1a27e2fb170ff1b59b0657861567d5565555f11ea31523c42898d6ea1ae260cd98b9cd69f9ae4d19a81365154d24c008bc15d1482665c313c3721cb701c3a407373e1bca5829cf45d484721357d5f83b5cb58b21987d9fb7b77224c03c017e183b31fb4c407ac23312aba708e8bf7f905d68b4895a48cd7a70af6ab9060d959f56a02d7e3672a90a6218fbbc6fb641163674bd736af2764c72c5bc85651be47350507ab81749bb2b6c744520b5b0a3b6633355c0991ce4e1a813615f2e8300366521040049b1054a7741b29af1c300e2c86977af90e820dcfcb8cd967c27102d49fb1683c63553289cc0c62de0e26f7555392187009e0cc5896acd8c3c9a4a7c637a107da325cb7a694e9a1107e889cdc6310671bb6c5b51a35a0169ff7b5158bc6469a71a3e8740e9281f5869180c91cec8e1169e2b377c8174669ca67418116c3cbd2ab61d8a874f9bb767de8973d8425cd118bc9a320453db9c64183248b22af3f489ae69159a056ad113833c2a9fbc56b10d013e911210bdb8cba68a0ff0f0729757bdcdf68b3fc7be480481ff64c4c09825ee52b274e85e544091c3d36f40444d28878d7c19122957348e3c27fbe74685fc1a3c21126064242616bc4aaa5284f5588435140956cf37bc72daf5a73ff6ce452ca689066fd6e118bcd4988660c7c8501c34dcbf1965c66fd95fdac910b9e48093fcb200564b4cfb36c72c3096c5579f736059534d57b7168813439b722d5230b255532d838598d615c1b641a9d5807f33653a1be96835f474d4f1955e3c5bb5c621497c3451003ca76275af98b25a962765e5bf2fe754330a77837288810aa53be9a2564451319405cc38b13401a7f7dc960b5b2096f45a94098a2fb39dcd654f846388cfb4b57b4b92abb321a16a83b3e6953a0724afb47902e581acdc278957100548c735fa5c04a4147e826a77030284615b82fa60bd3619b57bbca10872afea091fc6288ee434d8319f028125a0b5006cacaca8ca6eb95c7ad87c7e499a4ad81bbf79d144ab16ac9cb49743258cf0c83f2b006b1d0585efa0ac7dc722ed6c12170831f0964cae2b6d2f808afdc6223d11b510b949e76a0a4c262748148ce17b38c55cc7eac2bfdf468105bb89298c88c8806b124c7488d606b52b217c81a17ee5ae67cc27f6a3382d50705a9bbb1d3c59f68b8ba9a45ed1c97ea1eaab76903d1f2a1c71a07420f47695d1b68d06c5dc85114ae83204fb4bf16c09385934105c9e2fd803d83542f4aacc3af6b949a63e6d0b0c46ca8a6b4633926c0665bc09b69ca250945c14366d49705658f6cd76964e107497bb42290f4c1471a4ac29a60c3dfcb701770619cb45b0613068091a68b58c7b2a19ca9933cceb112e234014816b7db43beef660100a19377a4200a0806be78d30169c4b747e8208780a14aa53987065936ac4f06b7a710870fca3b1bacb04c2af5e3005a9208b3a03929b864d0e1011cec63b93220e96b480128c20b7675c9a87c1c8e2bab4a7422fe9c16d367928117765458a3803af02332d1bf654e782816b15a5bcc3bcf0213dcbe07c59a92d1b1baf1f217061e197c71223c12746cfc0b0aeb99fea7b29bb3a1300bc266f1692fd8641d6fc594b9894dfcb0c951b8351236087241f7cc3506ca74ccfb4c930fca1be940af6606ffc76bb92b53768294c30370b29b795de63caef451a18317384299168b77793e22fe0fc03e4c064cbb6979b38871eb11c5650587dbb31eec0cf7ce128f535b0545ba98af5ab4bc186ea1081ae15bedef5945410c800553d8a2211e8e16125d4a7cf25a91f13858e1cccb8e56481a5a3bbc3468bb624f282069425c8b5462725a813bbe53c1cb11bbfa242c2a1619763448af184958cc333c3aefd35c4a4861c5cfb2ee1b0c39b0c73314aa3d191b6406caa94d8280d8b01e1b73e56f5bdbba80fb3923a4b608543ac827395cad1b050530b5e908231c324132d782994753284927f3a379f71603036a172ef58018cfbb879f29a42a106bb32a384db6e033401fa46045b035ed2b3f277ee6bc7b69ea2a0946112498da4ee64a2be6ab49596c4e61553e1164d +private_key: 25c969038aaa118900417b46198c2c1d718005994dfa10ce5eb8b998a524dbb1a4f3e0716d314458ec6de9972dc3d988a064cb0b11cb82450f1055c9f333b2c82541f99167786b126c8427c515a8f9f506f878427e1a5e239547f1d6bd97674379b06813624a220a22f5c51e0dc0582ae30caae6cc39cc1350412c7de154c3484602496bf84cb3df4c031192bad2390f9f60c7e84855ca118b00bca814510c6a019d25e8687489cfc7c0240c822de267359b877adddba93ee7b99b8831efcbc6c915639b7547204190f4d500701b239a161cc4858411542fe113372cc3b0e3b4417ee5117df681ccac2efa3988921a151c8418e52cb49215b1e7c270812b876d37b092b882ef98a8075226ad76ab0bb9170f61c73d1caddc201ed8a38b9e237a6c345fffbacd6f86c47bfa56bb04b05185607fea02a16a132730710c85a424a08ccac9c8dcb662fe0650fdfb1ae1ba973e95079fb9717de44348cb0930d1c8ef1202b4c7849c244436d7b477c2211758801c316ac9b5be8a082661ea78e2b14e87da8c78e81ef2285f00d116755c5cff986b56b29032b390bb8453e8d970c7f90237757ec291ca8f71c9b691cda16749a63246ee865ac503a5573962be14a61c31a6bd3995e51684c1e59d2e803b5061b2ce633e7b692b5503818e349a61155b8820b790a692896317fb56366b63cfd7a4305f1082bde4cac8904d22f782fcd7c89f32cd98125f7ed96b0ef932cd077131424437744a5cb74f2dac52932c6c25ec282caa4e65fc9b38a43e21d3b95cc5bd67801a22d95280457b5a182f6d9c8fdd197cd12231f7889af318aa0dba8e3ec6056fd6687a476a971abe6cb439c055b21c6933c5f58c9409cfdf29ba810b87cb971f1e314256dcaa7ad63a41a11b4c1c127a8065c24979b89c96d3a2a944d16d20e39c27cc2969bb132a688a0a419c726338f93593005453001b753afca27c84c25661a63628365ce3074c90448c92b20e1299b2a10403fc9fc8dac9bd479802f8c3add3929b60b409f73e53fbaa328756a7b3ca8ab8a3341863ca5c625697b4e1760e63217275ea216a61951f88b9ce64839c461de048b3aa4692e6095496482130ea3be3569cbdac7c6684c4c561043b4167795138c662b44eaa97a279a7ea1a9e94d83d008ba136c484fa27c05db44066fcaa02f71a663512a71c7ae01742082c5fbc879a046373759965b0e565930506a8f6cd1035aed5e4a12b09a7abd74d4135653c509444775190b3c822c567381a266d1a7d6e19a60a536f60a946a455c71ba2385fb099addbada7691de2c54d5ea88020db4424605c69ba6ac2bb4181b363c688c24611737cebb00f536a83c3b30f0a9d46946ff4814aa8559368d393d94264da25b805b417158b6d0103ca9d1c5b62b1b5cfe969677a70ec1385c17a59a065809e52b99fb647e63b1f1db0800dcb9952710a94361d60fb0f932b30ed8b6715d913d8ac16a095809dbab0b0f64b6f5a7ac4aabb38414401c58b935586f000354be345f9c45cb0908df8e33063cc0997d122ec830e4c871166ea0499d6710e919faa269b064374d463bcfd96b427b47755d689fb3320b3e4759ac13f738a72516638d8194c31802abbfb68f4a6b107e05d81ba4d5d70ce6e140771f08ff7e966364703fe8a2f2ea8cbcc960ef834a711cc7c3baa7485059d7315ae0b395baa55652cf54fc817bb23819117b933b82bafb146248310b494c506ad0ab37025965f550a2d821787671cda3c9874e6781ad85934da3393b566d58742bd8cc44043ca7a4268b757ba3e1b4975f112617707c7f603cc3569b82b100fd79a391673ded0a14cb11af1556fc26a4a11291f4ef1816c52c292475807f58a2d461ca15b13adc4a7e1a75e1b4bac02f11c3af98f57b5516da77b49455ccfca47bfa0c70e0935f53b14c3431724a35a8fd663fd2ca7107c8e4f0a14d30b98b5f03e1cb568331c0f14e7756aa4901313842447ad98874165f8372334869e89c82eb36429c13f442a3f6f92a9a3f75b931b97b5d4080442371babb4509c5e1b997266805b777c1253fba72a839f9d62002bc2075788cec91269f0f1408e71031122b107e11486d096b1faab348c5aa46cc63eb38c4935915e037f4238b9be3b59975c6a67fc807a732b0ac43671825cd0f74d1cb3c6a7f721c4039b10482990923aba0427e2da5bdd30bd55133989a5b43bc371d2105415e76ba18786237c7151548b26005961fb2a9e737e39bbaf97f612cacc3ebbd216f9f57873f97c503a95a49a1a113b0c454526a082203b1a27e2fb170ff1b59b0657861567d5565555f11ea31523c42898d6ea1ae260cd98b9cd69f9ae4d19a81365154d24c008bc15d1482665c313c3721cb701c3a407373e1bca5829cf45d484721357d5f83b5cb58b21987d9fb7b77224c03c017e183b31fb4c407ac23312aba708e8bf7f905d68b4895a48cd7a70af6ab9060d959f56a02d7e3672a90a6218fbbc6fb641163674bd736af2764c72c5bc85651be47350507ab81749bb2b6c744520b5b0a3b6633355c0991ce4e1a813615f2e8300366521040049b1054a7741b29af1c300e2c86977af90e820dcfcb8cd967c27102d49fb1683c63553289cc0c62de0e26f7555392187009e0cc5896acd8c3c9a4a7c637a107da325cb7a694e9a1107e889cdc6310671bb6c5b51a35a0169ff7b5158bc6469a71a3e8740e9281f5869180c91cec8e1169e2b377c8174669ca67418116c3cbd2ab61d8a874f9bb767de8973d8425cd118bc9a320453db9c64183248b22af3f489ae69159a056ad113833c2a9fbc56b10d013e911210bdb8cba68a0ff0f0729757bdcdf68b3fc7be480481ff64c4c09825ee52b274e85e544091c3d36f40444d28878d7c19122957348e3c27fbe74685fc1a3c21126064242616bc4aaa5284f5588435140956cf37bc72daf5a73ff6ce452ca689066fd6e118bcd4988660c7c8501c34dcbf1965c66fd95fdac910b9e48093fcb200564b4cfb36c72c3096c5579f736059534d57b7168813439b722d5230b255532d838598d615c1b641a9d5807f33653a1be96835f474d4f1955e3c5bb5c621497c3451003ca76275af98b25a962765e5bf2fe754330a77837288810aa53be9a2564451319405cc38b13401a7f7dc960b5b2096f45a94098a2fb39dcd654f846388cfb4b57b4b92abb321a16a83b3e6953a0724afb47902e581acdc278957100548c735fa5c04a4147e826a77030284615b82fa60bd3619b57bbca10872afea091fc6288ee434d8319f028125a0b5006cacaca8ca6eb95c7ad87c7e499a4ad81bbf79d144ab16ac9cb49743258cf0c83f2b006b1d0585efa0ac7dc722ed6c12170831f0964cae2b6d2f808afdc6223d11b510b949e76a0a4c262748148ce17b38c55cc7eac2bfdf468105bb89298c88c8806b124c7488d606b52b217c81a17ee5ae67cc27f6a3382d50705a9bbb1d3c59f68b8ba9a45ed1c97ea1eaab76903d1f2a1c71a07420f47695d1b68d06c5dc85114ae83204fb4bf16c09385934105c9e2fd803d83542f4aacc3af6b949a63e6d0b0c46ca8a6b4633926c0665bc09b69ca250945c14366d49705658f6cd76964e107497bb42290f4c1471a4ac29a60c3dfcb701770619cb45b0613068091a68b58c7b2a19ca9933cceb112e234014816b7db43beef660100a19377a4200a0806be78d30169c4b747e8208780a14aa53987065936ac4f06b7a710870fca3b1bacb04c2af5e3005a9208b3a03929b864d0e1011cec63b93220e96b480128c20b7675c9a87c1c8e2bab4a7422fe9c16d367928117765458a3803af02332d1bf654e782816b15a5bcc3bcf0213dcbe07c59a92d1b1baf1f217061e197c71223c12746cfc0b0aeb99fea7b29bb3a1300bc266f1692fd8641d6fc594b9894dfcb0c951b8351236087241f7cc3506ca74ccfb4c930fca1be940af6606ffc76bb92b53768294c30370b29b795de63caef451a18317384299168b77793e22fe0fc03e4c064cbb6979b38871eb11c5650587dbb31eec0cf7ce128f535b0545ba98af5ab4bc186ea1081ae15bedef5945410c800553d8a2211e8e16125d4a7cf25a91f13858e1cccb8e56481a5a3bbc3468bb624f282069425c8b5462725a813bbe53c1cb11bbfa242c2a1619763448af184958cc333c3aefd35c4a4861c5cfb2ee1b0c39b0c73314aa3d191b6406caa94d8280d8b01e1b73e56f5bdbba80fb3923a4b608543ac827395cad1b050530b5e908231c324132d782994753284927f3a379f71603036a172ef58018cfbb879f29a42a106bb32a384db6e033401fa46045b035ed2b3f277ee6bc7b69ea2a0946112498da4ee64a2be6ab49596c4e61553e1164dd2d4c9cfe0e22188f2bb5e538a054c904cdd0d6dd921af93591f4a37e9ea2b5c8d6c42e7270ee2b77b6045385f3d175984a0e260363166c73b0c70c971644363 + +# Official test vector 11, seed: "6c029462ca42ed520f10a579f52687101105e0b90c6e7bfa582a4c112b579d5ad0a0abd38f72abcfdcaaf5893a112bdc" +seed: 31beda3462627f601cbc56f3ddf4424e1529c04737ef0ef2af6d7401f653b8a1812083bfa3b670e3eaf9b443702fb6db16ac1197656bbd61a8e25ed523b8d1e5 +public_key: 78d90b2d2b06c3c74e60306d7e0514fbe0111a930a10627e5b2b11077ac78bc32c46d1406ee73acc41b518b2c1a8cbc93990b9c1d0964b1091b0871dfe594aeb6719400c71e96893a7524d082bb5b7b3711f586f9ecc4b65f66fdb2801495086969a6a49961d563391a24b1029a7a3c9e2399f605a37a4a05237570160976b658da00b57ced318b4c7025ceb071c269ec9db9d6a2944c973cc9b427d5573c2eb37c64e4624216c290c5645b36cbb3e82713de383daa5cb4029c6dfb14c43f4aeaa9c93843b784fdb63957b75f39088820694bd0706ca856864fa031b682031581673608dc9ea058dea014ab79eaef74928d4cb33308fcad06ed303a1ab8b6cbbdac332a24ce5474013c90c5b1b869bc9881323435a097d09e5910e39cae5a1bc148ab7d8aa12c84634864930c24ac4f375731cfb65d5992916302640a524a4a52c9a2281534956f946473541852d0884e6461614f9a1dd95cc923c6298998b21c2415518443f86949e6c390f9463b69a63f2f9b328053c01872ea2ea8fc45185ca3bbe74b713528cb3525a60f7639f770824686c1b2ad719fbda1d4c44c9dcd0b24f5277fb6720e686270b5349fd3b1215008c6b24c26aa943ae71146f063072f0c42ea114d3986ed1030260e88f2f2c34e7385491565168e1c18ad324fb13482f5b83b2f6020a6895f9d24b93805fd5556b4a048c2e3106eb02a53a774b169106a77bc166137e7dcc4b60569e77dbc6d5f9c276a011ef59bccd08793b695eb3a5bd3c1b64ca3bbfecd1adb5f97294d8909b31772929c693ac396d412549b1cf910aa3c60ca0250928ea4350b8c91df7d31474ea07cff56dbe417b16603c6af97329d53163343e0af3a84ed37cb91a349bf2af7ee84d8ee504f2a73e9dc3301480bc6f144a631bc3c160348773cb0b6a3b57fa1286e2107e950ec6a682edcac892926966e28ab2a482bd5991f8c6c6f5e231b0826191a8c8d3c2701984980146bbd1b8a629b548ce578f5df90b58305026aca96ef20c77610a2da79018b0047f5351858c2c99a035f2f339885521d09611a219895e987471a2c10ee576e07320b7f9b5d678221aa995afe550c0f72f1b647f3ef429d3720802d7b53ceb917feca63860337ea126fe41777b85980744025ef9418bb4c1983c8af0109d2a0a0ff47c121de1926ffb5b3d8bcac797a0f5309c8629605a757a6ae91beaa437cfe184bfd3b703052ffe8cb2d7e57b411719625a9f1e11473aa8a4814788c0280fd179596db23d3003461314896d38a9e8fa75e93b65cc76cdccf24a72b1294acc47b3e7843b2a322e82c98f906ba369b7e8b588d2dc8056b70e8588c4eb80ce8300630d265a8f6a74306374da0622eb125f51764c81c55b9966c27b562c5e930a30207f825b27711c3124fbb98d4a8351980a04041e99f7af63ac015d667232162db0e793eebc70dea04eba186d2c14381ae886f7c6b934f587710aa095b206621cbe4ca1bbb8752b5489626ac72290315fe9a967ef6980f9486462b74e7938800b020519c5c0a684adc1b82f0ccaa3988cb5a28264ccfcba1e8119add64a58da88bed5cb01f5b0410a3ee03c9105029ea789bf65bc9ec58b4b2b0c9aa9c7859a48cbf0c12cf9e78049528118d366d0345951d0aa9102b5c12b36c6022fa4c7b4554178a8800c1a968ec74569af3815acdc39bfe029807a8ffe1267a69073744a806161bb5ab59d5340b8218054a252560c188314c177c5f3300e86863eb97253e6778415b77f140d498aa104eb291b21bdc2c5693a39254cb01c8a3a9e8e14a965d107a6b98eb09a26c2851059a290b6e94ec10138289148086456047750a3f8aadb5b1693c9642a8ba89b89c6f45c18ba750656c151cb563ba7260ca09c780077b956e5275cf998c86748d2d332a9008f8625bc61939b18f0c063f171175338464c0d402915c6e54682fb6876c7338f654d1916655fb19e21f18e2c0629e0962457cb62bdf3c93cfba8a551c752642016f72b5479615da16c1622b21a105da72413df20b125c48b0a76001472780be292a98500321c007b1a0273108be097ba0e5972a2394861c5c9f8e0093dac8aed47a6467570299a5501c6b2f281283d0013260901a08531e737bb6baa0fc13895253ac4469519c483b591d28cb8a9a0ecd051937eb8d82bba18673a17339dee827be4156633d8a2c376d41fa4e7bd70d4e199 +private_key: fc569914244bca63c05d25beb59702977903c59c046079c9410c873936b86945ae56f3c1f049a3ba4185ad5c49bcbbbe7fc89e561b2a940aaf66538ebf594eb0e5bd163824f8022f6b5183c0839b59361b96008f3ba83d1cc37ca7581121a0b552908e28245218730b3817a27e4099313484b6fa99a539295713abe453afbf8788fe6ab530e1cf3f430f4a855abf3bc11da69e10cb2d879075fa6198b1601dc8903c32a845d4da3b726b6828ac84e3469dc9e66701c16b64957d36128856b82e1367ac00c274d9a366b6b38fa87364880299e86561bdb46269a951c273710616109aecca78e5710c406b27ea403c05704c77b27da95c45da86d2c586f72a0ba1bc5493a389961b789cf5b35ef88dfc38cf6443b7c3190069a19be5a7b11a7339f6cb445f88c90d1b350d5c3089ba13c4c70ed5514dea34b61d7ba5abf4c78024abd21a9a84f4cd73f86b43f3744ffb572d918338688168cbac7f979bbdb2c52910402f94c3fcaa29f4362147205dc5b5af7d4cb920f21851392ed6a40e10f1013b380ee87a4fe70b864ae285bb5b1d01a448aed532da26948f639258a4af94b3270a984063c927929867e1fc9415815fc51c5158cb4ae9d8c81cdb30a98a82e6367e6340c6f5704a37e06523e736bba1c4d98c524bf136a3a48b5786a9ec624df5a992bc89c389861b03aba410531340baae94c5a91410370f92573c3b28f2e2a47a2695a9626cf311b834597c0a09ab0ee2a588e26962189b7b50a99d5b7906c274a8130f3a30b56cdc85c1a8ab9853476a22a8c047b4f825032a742d601ca1bf319b8a1825be3c38e93a686a50694e15164d9c603f537772f88abc1258749a1adde38b55e0485f34bd20129a1f6180eb2382bf2b96120cb798fcbd98401a62a872b4b175f80ca9aa0b496ec12fcf713184400d43212db7a55a522a1d718c43d61823f4e342e9396e6c2451c056ce3ccc93c7d9a45ff41461262e49c01def44a350e5cb7e40bfc2845989bcb8cd59600f1120647b45a585318b0bab8a202afb7348028b3fba36a41aa7528dc9973feca1c28a722525c29687398f607e02c9be2b2491a0458e1aa6c10882bb4c0bb50985cbdba386d0b53cefcc6f316965e1f289148c64be223853791a254b38a98160f0bc3aa63cb6d45263cd61048a831a5440413ac3c6f38670a83190d2bb32ac5a35908c41618ca017893b3eb2628265b857d5130c821af61c895c274faa2150034c0e80e2318917bf9aa15cf2665c1b3ab8b62a39282c738ffbbf7760845637861f46c3e5137f050a907e98bcf755a3bc0ca201522acc9bc780d10d4c41c69eb400f9234c8c7907bce0cb52b783c0fa82410a5b0f325753d985622bbab7639b649c5b36696e2bd8b5c969165f66ba02b142e4380e77ac07d2a85c599b9449e48f4a6aa0fa30160c18180ca2056fd52a94fc2f2d26c0f5641c81cb854197af4eaa389aca0e5dc9bdbd4885da4b9ae207983cf37bf8955ccfbb37e57b30e74bb6f798b4ba62273059b589e51f78b79fe927818eb12f0e73636321b51e456dc5f90281153c7687cc313723b1034de828620d17aecee6482242afe899c45735209606b82a1c284fd7a0dd819f72ac71d30bac8b54715e422e7c4511a073039587ca15251d8bd926ceb2b0864c159d348889bbadeff732d0303951d1b491b98b43214d26bc7a3b121dce077739109b5c00441917cbf3169577d63bc7ca18e4478f4fa8bf23164c8ec68e86acc8d0e1ad1034a99eea986699cdb6176c84294f711067ec7748ba83cc6dc51fb3e9576d7150977c76096a233b2233c68995333b82baeb80c3f2480fbc93b414cd3df6165e4969aeab0b052492faa0a613818b6f60086cfa21a1ea774afbab6857033c65bc38395b47f3514c624d27e3120a969d01b1a49af814c7192ad1f97c2b398301ebba4e76be866c8dd17a46c7db9d5149329ca53460d135e323c6488134e9e3ceda48562aa78cefd098ff75a93f3413384904cdc10278c798a77aa93f033eb4fa32f7698318d23c79b4af83639bffdc56af742144e7b36c217f13244b152b88fa3192781594759b1e0d158cda2a12c1fc85d093390f42413e00a4337c32092618908a24379444fbb5c7f702b2fea3098aa125a89b82336a3789a3bef7c403a5a2c56bdc0a78d90b2d2b06c3c74e60306d7e0514fbe0111a930a10627e5b2b11077ac78bc32c46d1406ee73acc41b518b2c1a8cbc93990b9c1d0964b1091b0871dfe594aeb6719400c71e96893a7524d082bb5b7b3711f586f9ecc4b65f66fdb2801495086969a6a49961d563391a24b1029a7a3c9e2399f605a37a4a05237570160976b658da00b57ced318b4c7025ceb071c269ec9db9d6a2944c973cc9b427d5573c2eb37c64e4624216c290c5645b36cbb3e82713de383daa5cb4029c6dfb14c43f4aeaa9c93843b784fdb63957b75f39088820694bd0706ca856864fa031b682031581673608dc9ea058dea014ab79eaef74928d4cb33308fcad06ed303a1ab8b6cbbdac332a24ce5474013c90c5b1b869bc9881323435a097d09e5910e39cae5a1bc148ab7d8aa12c84634864930c24ac4f375731cfb65d5992916302640a524a4a52c9a2281534956f946473541852d0884e6461614f9a1dd95cc923c6298998b21c2415518443f86949e6c390f9463b69a63f2f9b328053c01872ea2ea8fc45185ca3bbe74b713528cb3525a60f7639f770824686c1b2ad719fbda1d4c44c9dcd0b24f5277fb6720e686270b5349fd3b1215008c6b24c26aa943ae71146f063072f0c42ea114d3986ed1030260e88f2f2c34e7385491565168e1c18ad324fb13482f5b83b2f6020a6895f9d24b93805fd5556b4a048c2e3106eb02a53a774b169106a77bc166137e7dcc4b60569e77dbc6d5f9c276a011ef59bccd08793b695eb3a5bd3c1b64ca3bbfecd1adb5f97294d8909b31772929c693ac396d412549b1cf910aa3c60ca0250928ea4350b8c91df7d31474ea07cff56dbe417b16603c6af97329d53163343e0af3a84ed37cb91a349bf2af7ee84d8ee504f2a73e9dc3301480bc6f144a631bc3c160348773cb0b6a3b57fa1286e2107e950ec6a682edcac892926966e28ab2a482bd5991f8c6c6f5e231b0826191a8c8d3c2701984980146bbd1b8a629b548ce578f5df90b58305026aca96ef20c77610a2da79018b0047f5351858c2c99a035f2f339885521d09611a219895e987471a2c10ee576e07320b7f9b5d678221aa995afe550c0f72f1b647f3ef429d3720802d7b53ceb917feca63860337ea126fe41777b85980744025ef9418bb4c1983c8af0109d2a0a0ff47c121de1926ffb5b3d8bcac797a0f5309c8629605a757a6ae91beaa437cfe184bfd3b703052ffe8cb2d7e57b411719625a9f1e11473aa8a4814788c0280fd179596db23d3003461314896d38a9e8fa75e93b65cc76cdccf24a72b1294acc47b3e7843b2a322e82c98f906ba369b7e8b588d2dc8056b70e8588c4eb80ce8300630d265a8f6a74306374da0622eb125f51764c81c55b9966c27b562c5e930a30207f825b27711c3124fbb98d4a8351980a04041e99f7af63ac015d667232162db0e793eebc70dea04eba186d2c14381ae886f7c6b934f587710aa095b206621cbe4ca1bbb8752b5489626ac72290315fe9a967ef6980f9486462b74e7938800b020519c5c0a684adc1b82f0ccaa3988cb5a28264ccfcba1e8119add64a58da88bed5cb01f5b0410a3ee03c9105029ea789bf65bc9ec58b4b2b0c9aa9c7859a48cbf0c12cf9e78049528118d366d0345951d0aa9102b5c12b36c6022fa4c7b4554178a8800c1a968ec74569af3815acdc39bfe029807a8ffe1267a69073744a806161bb5ab59d5340b8218054a252560c188314c177c5f3300e86863eb97253e6778415b77f140d498aa104eb291b21bdc2c5693a39254cb01c8a3a9e8e14a965d107a6b98eb09a26c2851059a290b6e94ec10138289148086456047750a3f8aadb5b1693c9642a8ba89b89c6f45c18ba750656c151cb563ba7260ca09c780077b956e5275cf998c86748d2d332a9008f8625bc61939b18f0c063f171175338464c0d402915c6e54682fb6876c7338f654d1916655fb19e21f18e2c0629e0962457cb62bdf3c93cfba8a551c752642016f72b5479615da16c1622b21a105da72413df20b125c48b0a76001472780be292a98500321c007b1a0273108be097ba0e5972a2394861c5c9f8e0093dac8aed47a6467570299a5501c6b2f281283d0013260901a08531e737bb6baa0fc13895253ac4469519c483b591d28cb8a9a0ecd051937eb8d82bba18673a17339dee827be4156633d8a2c376d41fa4e7bd70d4e199ad2b1951f0dce0b0afd296d3f22bafe4f13638ee2540caf8a6bf7d0387265bf8812083bfa3b670e3eaf9b443702fb6db16ac1197656bbd61a8e25ed523b8d1e5 + +# Official test vector 12, seed: "db00120937570d62331f4c3f19a10465231eff46465cdee336a0d46aa1e7493df80f18617f9ffd0476cf7784a403ef4f" +seed: cbdff028766d558af4466ef14043a1a9cf765f7748c63cc09dceb59ab39a4e4d8e9a30597e4b52ffa87a54b83c91d12a5e9c2cd90fcac2c11b3a348240411a4c +public_key: 81f27e76a1562bd2c206ba3087231983aa0bd65420e2b71b749605960c94319abeb1e80aebf274b27a9237740c07114614658c51d0c5118b9fe6d0064e9b47641ab189b2ce2086293dba6054a1437d00719b5c11351a9901b0a15e4c7efcfbbe9a3a7ac6ab157586c8d5b68b2d9b747b2461f2a2cc3179a70926423ea5aed845407846bb9c5c57534b66a6cb8b480c9a18453e047c58ef00cf652867b474c7b1b62fd7aa0d7b4c63d881b05f6a8d8549257d7b0b7153525d5b295e8bbbf3d36da46a5d425601e9fa8ee7402535d553bb60547bbccb7777b5e48373f2b38f3c566e7b98a85465590ee1c8cef16e4515ac3b4c69f99ca7f3495254c345b0405fcf975bb5cc26a1faa82fe109f8d670f17164f25878a9e8834b4271f75338dac56ca7b4bb3b56ae95444af369c20b582edc204928037434c3c5f8c372fc9449a773261ecbaa4ddb929f148bb6bc471d2a72706a1f621ca295eb8b44a83a4b99c6f3bb04002b2d6ed42fa5418bdca5a07f743754882e2ec966f44235fd3b48c1ba874d8765ee30156cbc0456e610c5b02c8fc3b6d305aa23a5528e77aebf2bc3696a37c438a2a1259054c3537ab8798ab9c16c2b9bec71a861a96ae2387955cb95fc4c984d2b936be897cd05ac3524b845a2aed4bb981dc47120fc9e4c6476e7847ea69755886a5c85cb059ad0cf05b0aac6609104e0449e36815efb9c0b232c7e5b9b80e386a8ab12be22a72e0a4efb447b253c65f619c2c85a878a54457d272d2e9a32d2668d9a02089a434a1bcc4cdec25f909640901ab4ea97128850335e63882f363eae699599a1bafea68c9987882751b545795ed6428162993b17e7a7fbccbd2115c9cdb83c9852912fc21baf53082fa41ae41723a8e6a8e6a3c008dc8b8b6250c7c740ad2a3b92676960db68318c3cf24b855b62b237b97df54c561b72b0bca0877925734d650c0824ab8081802f166d8a294ffe8328fde34b02436ea27086b870009545a71d56ccfda986d00ca3e6931b85a53cab3aa85a2184e55718a9988e11aa2f024076bfb36c0d222685977ec39702e4eb7045229e5256890ad87d84dc8de5c44f8e73c65970216c6312bc22920fac8e24a6b251103beaac8b4a911a1bf62870a33ad9986d81161a3e44b0f5c9508be97324a97107cb15b2a2b9f6f71b80fc7b59d199ff7b04652644f10156c2dbc33ee34cea079e6b718ff4e2ba10858a2b33827f7019bacbb952ca83a8f38d69422431fa722bf31683e3ad6e1784ef9ab210391ee600c2d0c690d739ac5a581c4f5660576bc743d79552cc833222b43e45201888a3ec82194dc2307a07b8549c838bf4a70f9c4f8cf5868710cadb4636bf12a257a57c344061b9f83dbe9324195651020c2f02574a2db4aa4ef527e5a66fd4758382f96e52d84472852a30b49ee7d60698f4b9b6e9003f475623e345e1db767b143bd30bb5273636ca7926f434863ce41813767082873ab5365dcc72a251c035da426fe6db4aa1f34ffa45c9277327a7125c866546bbe22b9c09c054e133b3d8b3fbf18832248e5a3198c89794c5ba4e6486574de79cd67626ef2953007431ad08895ae499cc17111f76c002322a6602b677a922fc450971fc90c0b8ce16dba195fa80196569fe8b87fe060311867e6c6abc87f2351f4b0da1f837eb7830b9319498f36ff707c80926158b84a934400f63911b5650c6d205686f7bb7d415ca9dcca9a94c5706945580f49eba773067eac6c989a8e1d84d2586c58e70793933367da73ef0509e27a97f03c28a10086d782a3ef2251d08793748357f411200b5803f0c76c886b35bfeaa68544aa038374f868c474f0a6df1061de88886a1241f090ac4c7c17f6a429f5ca400e8dc98554c56363c8fcd728a1fab7c0007c67915b7d793c0ec5514c8f6a394c8502ee3c63b73b26da015c370826278aea16ac479884ab77a2d3c0b147e93181167bc1980627b46b7d06509d7725cf1085850a53f442c226cfaa24c8721db0c137c7a72b5898cd2137839202db535cd8ae76e42219e49eaabe2fbbb643742ed91551cd54f1de16f63c953fbc7b5849ccda3167660fb28f2a6ad8327a6d6ab649eb22ccfca574733cf01663fbadb3be7c33a482c13e50027d76a134e114c54380c1e84255060944dd10321b29149922be789eb0a8fb7721fe98a1e0bee89476e7efd6ba100e4d6c896905fc524e7f985 +private_key: 7445654a55ad6aba3d41506b872c53fbc83988eb1aa5d4ca645854ae700cdf3a1fbb448b51d83b20c3bf82ba45000357d3820a0ce20f011581d2a4c4f186522d568861554efafb1c843296c927a3c29a19bcf7037b497f6ed90706305bfb28b06818549e9b7700a387ce14420c74a5151555dda18b216b0846c5a90cbc29bd623bdc8c74f2dbafff76a1a53ca1b9137ffc687c5304a3faa42772c85719585c39fc923d7c253dfa471ed7260394134c058b8c768b04123f3c955bb8c94a26d4b6b44824cbcc79f305516672311da2b15be23a183c323f8841ec76882bd161844c2829da23482a3ad106225cd444f4463072f096740aa4a72c88dbb9b393289d91b85b20db1cc38096c0bc6dee84a16068a80d759d0d861a6eeb11d82a2b1b6909280c32ba42733d259ad3bbccd3e0bf13446b0ba77df35085f6494934555514353825c33a0ff41bd00545f607096b524519dc3ffd73a65dc1b9ba4ac7d32818ba2b21e1a300da3248b2fb913154be448c76195ba9cee404b0f8ce458540a678984d034e4067065116a4c8580da808b3e0f07d74a2a6a6b391eca57039bb3d5643a5545394057ac7222abbece46e06e4684830aaddd737baf64fabd956712b57add25a462441e362796d0796cb4c10706017c42c4070d8a51492b7c0db033e29761e593927111a9bac35e8e9a12a6423d8726237526d95e10cb0a3bf8b2302882c55eb92a69173b3a6353fc34711b51cba08c3642c449ac9bacd0b2906a2b5a8b53a1bc64b810023cf4fa7c73b3779ab468131569a60409831f32e2d87bcb455c15b705de96948cd9652f30619881879f3d043a341a3239680a6b12645b750e42cb736245fc83330ad7408e8b56bb535b865a9bd79549fbf8ac3468b9e90158b0a92c53a08b774b2caf4a124b8785f26589e65346b7f4469b807292108520a02c9e5da14c1fcc21fd526aeac3088d94666b54cb3bb00e3887f34b0670fba3d167b1b9088651a377aa8098c1f87888655b0bef1364e39973442c1b8fb4396e3079cd244c241149535aee7767ce60267a6bc733de942cbc81e0ab46f19370e5a82a09cd724043204cf6372ac5ba918fa2105c54640e3b9bfb0ca60600ec5091236a44d7fc5a183579febb401872066a95b22cacb9492f14955843a0460102319a1c49980405bc947283f95643d0b63b80d36b7ef29097bcb057926b2583745de85192a65070a0143be745e0651775b84480f7b0ee9727ea738b1c36b3890e19aa4431c46a7ab29f273660983e5eb05810327da1bc0ac5020ccd34bbb4765cd632e3f1b727483b76a0262c0617b3a06439171ace34b482674a967474c1bf77536bc6819bb77ad40b157267c6648c9c05259f06c20ad7b814048c926c52e2c14682b464a4c2740a37c3434b7055fb99efb813df8637bf8b4ab530731f77653ec2ac15a174769dbc5e435ae8b4668d009cffea1716f38037752a007c788ba80976a319b5455bbfc41119aa24e1e43a0ecf02c4fdbadfa60c187bca996f7b039692a6a03439221aa85c145c1110e22d46ae25ac7e1f99c68b7ae69fb22adac7446961e543532b5c10dfa74388a031c310275cb29b4a6f290b97c9fe8f7052ac51b759a75a9e552faf29f10114e43237f3e758506e53fa110488b11b3c1e339a7c8312f1335af7a8a456b581bd61d0af384d0796d531b6af20b2b08725c341b5d38737fcb055bca240ef239c0419598ad303344722dcf2c5dce35bb393b89dd876f9dc97020724c6cc75892f996b470b609872a127a3d73bba81ba14c7bc0049a9bcd5985ca4ad15d20267f6e56088e1512491aa7b51a6e3aaa6d34f870eedb3db6eb03ff44b3a674750967ca88a0a1cb110c9e9566cb20b42a696e86f3711ad407e3a01c269600ca9446a87baf63789410975376a5bcb801303b30cd1df625129b44e388672356132c10b6a6030c1678797d157c55b4741dd925df96374b16b8fb464d4bb39eccdc30124248aca11a2521bb0af5aa53c61f29663b6e103a6ee6940ce05e071242280858a06930bb5413ac75a3df260e070752e1818e12c221a69554a774507e892bd18b88a4672bc2fcb07302a132648d49c08d65804d1da7324fb00f53b44e6539b941839ffa36c435498809c3804685273324147ac41c259b86f5a09781f27e76a1562bd2c206ba3087231983aa0bd65420e2b71b749605960c94319abeb1e80aebf274b27a9237740c07114614658c51d0c5118b9fe6d0064e9b47641ab189b2ce2086293dba6054a1437d00719b5c11351a9901b0a15e4c7efcfbbe9a3a7ac6ab157586c8d5b68b2d9b747b2461f2a2cc3179a70926423ea5aed845407846bb9c5c57534b66a6cb8b480c9a18453e047c58ef00cf652867b474c7b1b62fd7aa0d7b4c63d881b05f6a8d8549257d7b0b7153525d5b295e8bbbf3d36da46a5d425601e9fa8ee7402535d553bb60547bbccb7777b5e48373f2b38f3c566e7b98a85465590ee1c8cef16e4515ac3b4c69f99ca7f3495254c345b0405fcf975bb5cc26a1faa82fe109f8d670f17164f25878a9e8834b4271f75338dac56ca7b4bb3b56ae95444af369c20b582edc204928037434c3c5f8c372fc9449a773261ecbaa4ddb929f148bb6bc471d2a72706a1f621ca295eb8b44a83a4b99c6f3bb04002b2d6ed42fa5418bdca5a07f743754882e2ec966f44235fd3b48c1ba874d8765ee30156cbc0456e610c5b02c8fc3b6d305aa23a5528e77aebf2bc3696a37c438a2a1259054c3537ab8798ab9c16c2b9bec71a861a96ae2387955cb95fc4c984d2b936be897cd05ac3524b845a2aed4bb981dc47120fc9e4c6476e7847ea69755886a5c85cb059ad0cf05b0aac6609104e0449e36815efb9c0b232c7e5b9b80e386a8ab12be22a72e0a4efb447b253c65f619c2c85a878a54457d272d2e9a32d2668d9a02089a434a1bcc4cdec25f909640901ab4ea97128850335e63882f363eae699599a1bafea68c9987882751b545795ed6428162993b17e7a7fbccbd2115c9cdb83c9852912fc21baf53082fa41ae41723a8e6a8e6a3c008dc8b8b6250c7c740ad2a3b92676960db68318c3cf24b855b62b237b97df54c561b72b0bca0877925734d650c0824ab8081802f166d8a294ffe8328fde34b02436ea27086b870009545a71d56ccfda986d00ca3e6931b85a53cab3aa85a2184e55718a9988e11aa2f024076bfb36c0d222685977ec39702e4eb7045229e5256890ad87d84dc8de5c44f8e73c65970216c6312bc22920fac8e24a6b251103beaac8b4a911a1bf62870a33ad9986d81161a3e44b0f5c9508be97324a97107cb15b2a2b9f6f71b80fc7b59d199ff7b04652644f10156c2dbc33ee34cea079e6b718ff4e2ba10858a2b33827f7019bacbb952ca83a8f38d69422431fa722bf31683e3ad6e1784ef9ab210391ee600c2d0c690d739ac5a581c4f5660576bc743d79552cc833222b43e45201888a3ec82194dc2307a07b8549c838bf4a70f9c4f8cf5868710cadb4636bf12a257a57c344061b9f83dbe9324195651020c2f02574a2db4aa4ef527e5a66fd4758382f96e52d84472852a30b49ee7d60698f4b9b6e9003f475623e345e1db767b143bd30bb5273636ca7926f434863ce41813767082873ab5365dcc72a251c035da426fe6db4aa1f34ffa45c9277327a7125c866546bbe22b9c09c054e133b3d8b3fbf18832248e5a3198c89794c5ba4e6486574de79cd67626ef2953007431ad08895ae499cc17111f76c002322a6602b677a922fc450971fc90c0b8ce16dba195fa80196569fe8b87fe060311867e6c6abc87f2351f4b0da1f837eb7830b9319498f36ff707c80926158b84a934400f63911b5650c6d205686f7bb7d415ca9dcca9a94c5706945580f49eba773067eac6c989a8e1d84d2586c58e70793933367da73ef0509e27a97f03c28a10086d782a3ef2251d08793748357f411200b5803f0c76c886b35bfeaa68544aa038374f868c474f0a6df1061de88886a1241f090ac4c7c17f6a429f5ca400e8dc98554c56363c8fcd728a1fab7c0007c67915b7d793c0ec5514c8f6a394c8502ee3c63b73b26da015c370826278aea16ac479884ab77a2d3c0b147e93181167bc1980627b46b7d06509d7725cf1085850a53f442c226cfaa24c8721db0c137c7a72b5898cd2137839202db535cd8ae76e42219e49eaabe2fbbb643742ed91551cd54f1de16f63c953fbc7b5849ccda3167660fb28f2a6ad8327a6d6ab649eb22ccfca574733cf01663fbadb3be7c33a482c13e50027d76a134e114c54380c1e84255060944dd10321b29149922be789eb0a8fb7721fe98a1e0bee89476e7efd6ba100e4d6c896905fc524e7f98558672899468fc0a35e2a8c6fcbb35b2912e4aefb8c396bb9738e3c16c95ccf758e9a30597e4b52ffa87a54b83c91d12a5e9c2cd90fcac2c11b3a348240411a4c + +# Official test vector 13, seed: "bd26c0b9a33e3b9b4c5d7ea32d5bd1fc371015be163c86f584e49bfd5362c8d8341161cd1308115b2a03b7e5eaddd418" +seed: 4c04310bea66305c6ca8ba6b8f61ca96257a67663afc11761f13fb5c7b324b6b8aec87a9a79204cee2986867a2906eb851b734b8b22b91d6749b1a5f07c44e3b +public_key: 33651904e40d7b863a34774ee1e401a9a24a960045d4537e5124921355cce831936f307c7cd807eb376ca1b640e7a76964c0195b6848b2cc9f832ac0c11c3c3c7290ee182c46bc1608c49e809b1c24a7c738845e9ae972d70c5ed346c46ccc73e0e251b1b57368b96dd71cbda55366585011ee659a2f081a7288c873c8a98964131c078aada0ad1662bb0d2b0a1555a3c84555c593231d167d378ba606257fd3958bc24b47e8380dc370c374a869413547d0703d28e4b5ec85cc0c897f14d5b03d6520937295183ccb1059821c2b866e755e24286634ec088522941516c592418a4fa872b2f911018843d7c877da76c1822246cbdcc046695a1e93aff063a577fc0eff56b27a2bbb56f76dba2b34b6a6765b78493f514661a4a83b58b42e4b96b471068682bb73f535e32c8fc7964a978b47be9b23cdc2b33ce980f66a033f8154bf24b73147152f544939377ba2ecb5a288276c712f2317ac69292eea9005a74a3fe336aacc4257e46395fa9a96a3fc9172b5229c393021e57265d017f6e7a5e92066b459199957cf4dc653ac222bf0b953c3c4ccd5f7463de539c024bfcc9475cb3437c22502fe16b909f73b6e733c6dfc6d87cba8a13220e823a46ed900c7649494006766a23cec36aa46756d3a7124bffb2af34c586847162735ca2d1b259f5c1eb0912afcf6846641984763266bc0add6d60fdf5b6fd87343a5d59c108cc663d8b700ab1dd5c0ab60fb66b764201722c9c2f5b2ce9a88162c3135d44ca9a735fc90b35058bbde332063820f3085cad54c4a8cd8708d43b871ca2b41d0cfbbc066ab45bae33cbf2700c67a5a62cbf1ca19c2431b6c52ac476fc2ec4c00ea9c14cbcee11b1232d523aae8af555958c3089c6c45b47ba58cf1f884e77893fd296ce80584a76abbf2330ab058c2af770e4468097cc20748a188b6620f128912126a899d7b0df24b067a73c4329314c3f6b0b9b83fb450414cf0a2ffac6fe2aac17359b20288a14272a952642958058f04b24a69b93492bc0dad67a7552b37f2417cf7e5b889e97b2d02980f7336f8e0198123c855dc1a40bbc5a93779c7c7be7089a8440214b3542341e56499ac1f6ee61b981705258c5ff6e74637fa0e48556bd3542ee342891ea4b4dd5a4982b0471ce63d61b3adcd1197dae05627c5993b502bf3025f6cb8792f32264184b362909be8ba74a1b6674e253f28b086189115129919821b867cc84341e3ab43b350a5c79d5af47b4cd228856189454538d362049c710953f33678c28f3cd9812d731aa9f95004b94425c60cff24186f644e749a6963b77760ba491744ccadb72e23653a3a08a1f7bba316a9c83e3113cb49022dd2be9a4a69c7db6145377289c921ea0292f3e4ad84e99ed72696dbbc97a3644478761d6083aeaa59004a9694d545835549ca3357cd9d63007cdbabd6e1a0b661113ceb370fac0da48b893b3c8635619e79f4ca14431cd9a1be2f34aaf3bc059de3a3d9b630b5542f38a5a1712c67327c893bd64883b7701636b0576223c4868f2195716c3499a4295b0387715c9ca4feb3b1bc08c6e09c1e809988e2f414f0b0cce5515f43b50c2dba028e9ac11e6368062c360370bb7f5655a3a75c2e7aa86ba9b892019db150bc7dc881c5e3b24e414780512bfefbce95c914cf060a76fa4c34359c634a1a11c40ab7b56af1d19e2732ba6f3cceb93cb31e08c93f2a9a33841d667079f1715a56013c0e68386b639e414540cf2b13650ca9378234b94c24bce9a9cee8c2adf4356f246dbec0bd9b371ddd296ee623603edbaf65e734504844aff0438d163b27c34d52163d736bcb42b0a1a67067a6e84bc8f849531a631fc55046da2b31e0b99b938d4f8b239384bc2ed54e46e17e9a8297c2a16775f77859ba69c759638fea8fc2057b5105952b34058b329ee7b2b08a69b00962c31a5106a281890ad6257daa8c6ad5854eec7e8a203cddb935ab5545e3e57ee5f78925b1531e5c4593a7afee319c5215645905b50cec48961b2b6c1727b4794ed382c66c11b67804b18c3c0000868ee4e3ce4e9790b681161b2cac3f8a1a419892608814aad65880e683fa75ce66335831a7bbcc236dd6f2b8c63560ff1939b2b56b97e87049eb4c65f42d640c0d8fd5841e48bcbd1815ef0c62da099f5478bb93198ef28d89ec6714b0f142ece80c6a6050d3aa936c25bbed1dbcfc99f39b4805782b +private_key: eb8809301a6603d8822f86b6b44286f1e1b83b121b3880c35731a1215722562a2f14d15364b7aa6ab35503331dc63bc435f31a23ea1a7dd060195ab2626245fe2853a88244b7522bf9fc39a76b188c7260c9c2829f7a6e1964cfc8c28f45889958731f742aba74993c2a75bf4557c71fc5390067ac00a39fbb7049c657056b168a83899e94bbb38adb1837b53a32e74b8eea1a2cc198105cc32932bc5d4071b06b1a6cb7587deab9f7528309a64dc5d696ea00575be8ae3788721b061e6f143dfb73bd9e2bb04cca4074894b067a70270b7fc8762772890ab8d3b3a5545b9c48be169c1fff82473b250a25f15f0bd7b142c97a3400233c57b8f5db3db25817880a4490f04977a605cef4c151593bf769100eec456ee7831a526066e757f7844f660392f6f91372dbb0b8a3325a498bf7291b3ee048fcb61db8ca6cf8fa0b98671894e95094b325b922103b564189937c1f032488d868405800264781a702878268a7c19b8c39899262c246a8b4cc91eb5afbc8765d23a40b40c49decbf917737f14765d0e7ca19879236551ddce824c22676f754444a829434a01b264019d970cb44f1b8128483c549c329288c9a55991e12bce3547f22d4088527a8d1322fce360bcde1309205b2547b32e917a39d4846e45c5d4d16aec4435ad8695ad384236bd71336358294652418a33839608230270ae247780f16ba3fe7ba2de37063b66402d360601baa068833bdf2325f144aa6528db92225360032e5199a8e61ade5087dbb741e2903c245a1c95470c795bc0ac363806cc6be3268cb51d333100a21f00917bb3479fed22f3d263763b406dde76514e929f5c604dd7536be6305d6035f31790c40aa6bb5f17ea2ccc9e07c6262878ffca72d78f4208bf804b4c322b1287011a21dc54b81bfa22bc77ac1a0db6dea6c4cb7ec49d8858138f45d9d200a52d33d13b533cb6447910cc4cc21a0b9350220845c1c4b64b5c84bbbf7c7c3a4932000559e2b068d2ca9bf44b0f7ea760b225a37e78a84a5b14c5a2fb926ac622b8f86c7ac7734a82125b18f1575fb3968a4634d9633ca7b0a2d3e56580c34bc3b13741406be06396e66e64126888055aba9c8ca2ed2bc344a38a710dcb1e7d72d70a166dabc79cf79439f5340225378e7e062472584a477cd67c812733b5d57127d6cf9a6855b9a4479af6870a6090caed93a642bd91224f6b1d1f13b86582a5a7c227bf21b1d7547b2dc398fc88158e87571e826baa55933459521401c432782e2112d1fd7adec475178aa2a3ce59c96da6449b75dc5aa37201ccf404c5efed99c7b266a97d46494f1316f0781ed830da8484a2c5174403c0efc2b1010d9559329c714771b7bc7023e9c89e3f0a601d439b8bc2d3ea1b01a991fafb409ce994868ba5ece31330118161ce9a6c08c5f4c65af7334920b659b56d2c658ca4d9951c4c0b93f43a91d580b81087838ae28ba99c1b916103a91709b384840fa4a047eb94abf2c96de847d04e2198e363d248921a2537172735537878bb65b2b4eca2d9a1c4270a8a00ac667e7f9192f7c46c244b6b7676086f18eed246bfc10855e9591de3415142a8621f98170fbb55e608e10e38b6ce140a3835172387ea722339b1c6598e53d7fb694978bb5a3b5cadd1822374071ad6bb1a1569230c6042c9cb9e205104bc6827d3b9b1912a3f275cfd31a28b7291d4875c88954a36e078c9f72956e874426632a9b2b24132a1a45306a4d8caeda6a2c401713d4176c694378698a77284b7a9dd016cb332da7138511923d9f3850ddd5c6ef5ba28c357ba766b960e351df862db600320f996943e10046891f27b2b243ea71506b755f27c032690713c42298a16096d28cbce4051633974f02adeceb95e1bc264c45944d752e23b000419c2b88108a0320b3c86204edf5914f324b221bb9884499603137342b8d102b96117c88d6b589f9545b639cc18fc2c89d144107610fada81b1e2344a5cabb357acae302bebd71159bfc23906bc2bc781a76a68489a73dd5235738b06f8bd54a8771257513b6e1e74dfbf774b1e469e67086b84c1a6ffc274b73633903aebb05911fc7b99151a8a6d0abe8aa466473b2ff2155ae2568c23576f70648676bcc1a6a19e880267f139edeb973a8a9a59ad2a8edfb5cea9a0bb39407f5153633651904e40d7b863a34774ee1e401a9a24a960045d4537e5124921355cce831936f307c7cd807eb376ca1b640e7a76964c0195b6848b2cc9f832ac0c11c3c3c7290ee182c46bc1608c49e809b1c24a7c738845e9ae972d70c5ed346c46ccc73e0e251b1b57368b96dd71cbda55366585011ee659a2f081a7288c873c8a98964131c078aada0ad1662bb0d2b0a1555a3c84555c593231d167d378ba606257fd3958bc24b47e8380dc370c374a869413547d0703d28e4b5ec85cc0c897f14d5b03d6520937295183ccb1059821c2b866e755e24286634ec088522941516c592418a4fa872b2f911018843d7c877da76c1822246cbdcc046695a1e93aff063a577fc0eff56b27a2bbb56f76dba2b34b6a6765b78493f514661a4a83b58b42e4b96b471068682bb73f535e32c8fc7964a978b47be9b23cdc2b33ce980f66a033f8154bf24b73147152f544939377ba2ecb5a288276c712f2317ac69292eea9005a74a3fe336aacc4257e46395fa9a96a3fc9172b5229c393021e57265d017f6e7a5e92066b459199957cf4dc653ac222bf0b953c3c4ccd5f7463de539c024bfcc9475cb3437c22502fe16b909f73b6e733c6dfc6d87cba8a13220e823a46ed900c7649494006766a23cec36aa46756d3a7124bffb2af34c586847162735ca2d1b259f5c1eb0912afcf6846641984763266bc0add6d60fdf5b6fd87343a5d59c108cc663d8b700ab1dd5c0ab60fb66b764201722c9c2f5b2ce9a88162c3135d44ca9a735fc90b35058bbde332063820f3085cad54c4a8cd8708d43b871ca2b41d0cfbbc066ab45bae33cbf2700c67a5a62cbf1ca19c2431b6c52ac476fc2ec4c00ea9c14cbcee11b1232d523aae8af555958c3089c6c45b47ba58cf1f884e77893fd296ce80584a76abbf2330ab058c2af770e4468097cc20748a188b6620f128912126a899d7b0df24b067a73c4329314c3f6b0b9b83fb450414cf0a2ffac6fe2aac17359b20288a14272a952642958058f04b24a69b93492bc0dad67a7552b37f2417cf7e5b889e97b2d02980f7336f8e0198123c855dc1a40bbc5a93779c7c7be7089a8440214b3542341e56499ac1f6ee61b981705258c5ff6e74637fa0e48556bd3542ee342891ea4b4dd5a4982b0471ce63d61b3adcd1197dae05627c5993b502bf3025f6cb8792f32264184b362909be8ba74a1b6674e253f28b086189115129919821b867cc84341e3ab43b350a5c79d5af47b4cd228856189454538d362049c710953f33678c28f3cd9812d731aa9f95004b94425c60cff24186f644e749a6963b77760ba491744ccadb72e23653a3a08a1f7bba316a9c83e3113cb49022dd2be9a4a69c7db6145377289c921ea0292f3e4ad84e99ed72696dbbc97a3644478761d6083aeaa59004a9694d545835549ca3357cd9d63007cdbabd6e1a0b661113ceb370fac0da48b893b3c8635619e79f4ca14431cd9a1be2f34aaf3bc059de3a3d9b630b5542f38a5a1712c67327c893bd64883b7701636b0576223c4868f2195716c3499a4295b0387715c9ca4feb3b1bc08c6e09c1e809988e2f414f0b0cce5515f43b50c2dba028e9ac11e6368062c360370bb7f5655a3a75c2e7aa86ba9b892019db150bc7dc881c5e3b24e414780512bfefbce95c914cf060a76fa4c34359c634a1a11c40ab7b56af1d19e2732ba6f3cceb93cb31e08c93f2a9a33841d667079f1715a56013c0e68386b639e414540cf2b13650ca9378234b94c24bce9a9cee8c2adf4356f246dbec0bd9b371ddd296ee623603edbaf65e734504844aff0438d163b27c34d52163d736bcb42b0a1a67067a6e84bc8f849531a631fc55046da2b31e0b99b938d4f8b239384bc2ed54e46e17e9a8297c2a16775f77859ba69c759638fea8fc2057b5105952b34058b329ee7b2b08a69b00962c31a5106a281890ad6257daa8c6ad5854eec7e8a203cddb935ab5545e3e57ee5f78925b1531e5c4593a7afee319c5215645905b50cec48961b2b6c1727b4794ed382c66c11b67804b18c3c0000868ee4e3ce4e9790b681161b2cac3f8a1a419892608814aad65880e683fa75ce66335831a7bbcc236dd6f2b8c63560ff1939b2b56b97e87049eb4c65f42d640c0d8fd5841e48bcbd1815ef0c62da099f5478bb93198ef28d89ec6714b0f142ece80c6a6050d3aa936c25bbed1dbcfc99f39b4805782b5bfb6d44c0e7348fba37d50b05031c0489d4294be6cfdc6f4146740e54fa5d698aec87a9a79204cee2986867a2906eb851b734b8b22b91d6749b1a5f07c44e3b + +# Official test vector 14, seed: "e2819ef86853bca1b9dee7ee1c1619988964f9a913e635aacf0d96ca6e0300d084329dabd8f149e24176d22757404260" +seed: 38a0d5f41d7dc1896efd1b45b0485634cef149828751b96087a0a6dd81b4d58aa2acf359556df4a2abaeb9dcee945829beb71185b4d6bd18b76e5668f253383a +public_key: 24e5249c820c83a86b66536c8fb371772408729447f8f2bd61fc63db224d868b70c8e8ac6685c8e3bc2375049c25f941169291c38a0eb0f3cf027bc8324398fcca99feb47059e87db1c2b723522d3f09cb8a19bf7b2b35db5516a652b837fb94a6ac6701c479686ac758c381fa242d8e67b1e7f6b0cb04cee5fcbe2bc5b266dcb55f1c72b091039596c4e4e50db8741763c35365931bb37a3552bb3223938c6a876e54121fa489c502e14943aacebe7a5e7747bddf5c6e916095bea36dfe8059cac7adc0dcb10a64bbc2812bbceb001e22cd5438183f9b3249a27566098af16782c6b503b987a6a5896c1bd82ef7d3c5c77b82cc797bd682849826981187a1530b4fc07173dda9ccb8c5248583503a8b974e8b1ca39b1beae9ab516087a170ba4d12ad5e555f77f27c55c519226cc6b3246ca1328db15648ed4394cc038245bb7d9ea48af2350f0961283f195bd51304af6653bd133e241729b5a62495c8c45583cd4c30bb1c538fa4f86afe799026f86e1de0024ff13ed5713a8806cb9eb6cec9c94c4fc4abb2569d9486507137733e681a5eeb479c8256ceac1ef823b34995c65cf43bafa250a874b743388cb6541d8346071f075b439620bce761cbf1848953200543177e0154c9343b47ba3f5ca025fad201bed145b7e8abec99a404621a11372c930713a013b0cf4b346ea6cb64620859d458d0e08b5d416bc86552c79b087f63539303c6fa96aef18c6a61dc37e1e8436fac43763c9acb9b5955157cbdc15d356936cbc603f6eca2e2a53163591b3d2257d67335caf60b4223b8c0cb7c54454e3b4812e5760848ec0babd9a0d7da9e83719bb0d7395418c44d86bfeff4c8a8548cee6780a5388e36eb4f5667ac2182c213a577fa2c4616814ebda8ce8a1c5851e0551d356471a8051d179de078c9f12163b0234fd729c9b02c302997c13974b47aec7573604d8278783bca1a5f184f77047f3b1861b7e1c2dfeba290e785d77ccc37e0ad03c199322c475191aaaf87300ea43f6a956b7d03b338b147cdfa14467b2850a73ba99c6b39d89ec6fa3052a9bfd0f6922f9b37ae6966c940370811aad1572039ba3365d089016c21fcb64fe3d924f805336d49683ed262410594f8205bb2649082642314fc7065cba9b8c4421f1bac52f69ea8f96093f89342b879eeb785756587a4027680119d41bb559c758197d360342bc3845237aed01aeb8104490b9bcb4ac158f154b347a49219ca5a401f90d1c1f4f7ba521bb33ae0610767207f3c9feb991e7ce444a42b33ee5a14710586523cc98aa53de01801bf383e33ebc03900678750734311c349cac283ba827fe39f976b3de28610113291f61325b870384280c58ac9c48bb65c5d8a672c86b218e8a706d3b87f2341b95199956886ee0ab068d927ddd109af491d23e991f4e8619e4aae99053c4db3514d380133105ad60885a9fa5fa80c144a3949cc8c33b591c776d5a7a6e9c8d12417b4c1661c867119f7006e6520462b63e1770aa6424dbec6b9a0c2cdb8c8945d653e62c790d7857681b479fda12c8894640aab041a044d897c565ce882aeeb8caf42630e10afd12293fbec9d7ef259bf881c92cc7706ac41626bbe1d17373e57b3a86a3ba62cb6084869b58c659371c110930b6c75626651971641a899645846f96081b00f6c29bcf8c646210676bf266467d90eb393b64a1593b4579adb0b549e6648da5c9e2eb3bddbc78c468912dc674b126acd4448bb40bab46ebc8620288253156d8d39ada1b639c6f69d34e9a25e6b6bf4241bc00b5968282bab963820fac7159001fa414dbe2b94a74158ab43c6a43519f9a34a716cc07908452e5a0a517138cf46220243bf2e27ae78835b73e0720222700861136b2a405a241e58f37f132c588a1102a5344b704619666900c73990c2145497565d09e984f2689e315ab204c59a360534a641228768a9f1581532ea9d7717b8d8069158605508a24ad1c71fee5760605bc2d619b177985ce89cbae0ea5ea335529a20225cf83744d807b886ccd5cbcbb8393d5bf144497a4c454a2ac7589b5315937345cc02372fde21bec80c0ac8912d28b3348df2a88c35b7f384809f24665600583530226b50a6429217ca211946ea66451c9092e7c42b309a922465561b307f8912f29a1ee687b1d96d8c201bdd75a34e09d954a4267f21490c0eb74ae98fad1b5a3b5d2b9f70e9 +private_key: de2a5203a614274820ac186bef852a92160817520323d112ea9240ed0bb381db4b012a4282775c91055800516cd465812722c6696165d80188c1f7bcf2f99cf18124a2905b6e3a69185c0a20f61913402bc2622a5477bd455046a032823da983660bd0aa51238de42a86fa9654f61ce0ea1e8f865bcd9407b879cd54c8520acb99b74abc1a6a23b767ac7c9449613a4a4b5003b2000aa52c17cb6652ce133abc641eaa34141feaa745c06ed7a1273be6a66eb6779232635c22b4030252ab30ae3c13291513438f2b19c4a10cc6f884d093223d2b12e460b49c191adcfcbd4f82c67ea936f946391835b2752ccfefe46230d84245ea8d8c799eec979f98409f51a65cbfc62a8c3a889d33a72ea24c96c094257104701755949524d5d4abba117a098b16da589c47e5415ed0920c4b2b5ae0bce2616c5781a903953d2d768ef5c58431984f671a3b31953940a6b52f24658ce943fc360fe9b0c9f9308caaf7a04e3779ef5ccf99a505b2b27d1c0b68f9f2254752820f6b721d55be6a205b3c832213d8cc015a14f5895d8ad17a14501ece031adbe36362b1c475c7cb2129863838ae80ca94d67007e3b5668ea415e5ac3e66d1aadc76021c4a47c1ea8c41423571a553d041a07096ce6548511cf08e108893ac1c0ae3990559b21952e5cdaf1751052425f483c88a3356ea567c717c75dfb70ee49b0be7f9cbf172ab7dd22172d40214bb7c9f22801c3645c8d075582965eb02ca9dc68dd6c3798d28162de30da699a29c216220e35f725a14b0708349e4c87f726755b68f632918daa2c83836b8ed34a542daced4a46351f337b16516b853bc2a44337710043a58a83ba5870af51af1252b83e69ca81539bb89af01526dfe7162665b9347d441bdd77b2e4a3665565307e65fbdd341b0b154fef5aa7ea530c93362a0a4766ad13307e90d1dcc2a2a37746e881d57a718e2964fa80080d9f28074121893c95ae850c61028a6e82caa571a63b7d85c37290b61ec6ebee839da040fd1d5b359d9bce5ab54462242eee31892030f7402aafdc1a2575000ad636337ec69537c4b61669547859875a2b94f13aa723182f9424e8a95051f10148f470f1d04c9c444641d4ba30ceb312bb89dcd04be5b421fa5d7327748c7a37acbdcd73589a94070635ea6198f014b4471106862ea794d2c8eba828e95d81f3bd226247952db967f72aa44311438d4d995b3c6ca6d6233705a311f095a6c9ca8cec042087c8071d00ed4acced97053116a8928981e61c5b3bf8177e4d99b4a130999066729f2875da7462b7827ca00980eb96d3ada528778cabd214dc0969ffc38b795512bc385921496a27b1ac7a099989a22c173a06ddc4b81b2365a9c6a160cb36f70fa4ebcf22c77e477da74a7be867394e5168b744dc03a32ff21221f877421a4aec9e9a2bcec7e46c88c2ef550333787dfe664e767124c5b0f09f8874d085324fa2eee6a127cb2a3c6936f649719171116bdc8a6db265c387930be3a1daac267b838640d44c8ba75537347735de517582c9d8da18666942db6951a4a7a2ea8f09768d026734c0bdcf7983f877e29c42f659873114669974c9018e7392c4500a45bba4f3c834275c84289c23fa13ca6e927c128accd480225c79247982b811b885062022eda9b448061aa908664400acc9b7f34284d98d526fb96336b408845d85c4be2b0215b0b32547c5f4b7e43fb465a358f6b1297afc22bf08b9307fa8e5a1361b03882a26798106526fc136cf93438b03601d48a145d58998f087d0c4386afa0c834a91ad3121de0c57dd7c117fd339dde05bc09e0a157c9c638d8c1a1d10687fa3eeed68eee7b3b2adc8b970bc0a0820b14679462c1113221cdcc045906618dda5cc340c448ba0038c0bbc36de75c00fbcb11f55e6532504fb2ad08e59aa3c65702547d04a02c5da62286a2053a75975c38c865d3bddc9506fe7c7081345700daa716da27b789590360b5c6f5b9f964921b7680ed159899829052987536f4375a8c5ca9e322e05a3d11f58bea4b1de4191667e87508ac279f4757a54393130b04675c312314218ad0c98038488bd501104989055bbde396cec47790b462b13b00a625a732959157e5715b16f4aa25582b7728c427c5758d25191b5b42c33b5d096ba301075d7c515ad195aa24e5249c820c83a86b66536c8fb371772408729447f8f2bd61fc63db224d868b70c8e8ac6685c8e3bc2375049c25f941169291c38a0eb0f3cf027bc8324398fcca99feb47059e87db1c2b723522d3f09cb8a19bf7b2b35db5516a652b837fb94a6ac6701c479686ac758c381fa242d8e67b1e7f6b0cb04cee5fcbe2bc5b266dcb55f1c72b091039596c4e4e50db8741763c35365931bb37a3552bb3223938c6a876e54121fa489c502e14943aacebe7a5e7747bddf5c6e916095bea36dfe8059cac7adc0dcb10a64bbc2812bbceb001e22cd5438183f9b3249a27566098af16782c6b503b987a6a5896c1bd82ef7d3c5c77b82cc797bd682849826981187a1530b4fc07173dda9ccb8c5248583503a8b974e8b1ca39b1beae9ab516087a170ba4d12ad5e555f77f27c55c519226cc6b3246ca1328db15648ed4394cc038245bb7d9ea48af2350f0961283f195bd51304af6653bd133e241729b5a62495c8c45583cd4c30bb1c538fa4f86afe799026f86e1de0024ff13ed5713a8806cb9eb6cec9c94c4fc4abb2569d9486507137733e681a5eeb479c8256ceac1ef823b34995c65cf43bafa250a874b743388cb6541d8346071f075b439620bce761cbf1848953200543177e0154c9343b47ba3f5ca025fad201bed145b7e8abec99a404621a11372c930713a013b0cf4b346ea6cb64620859d458d0e08b5d416bc86552c79b087f63539303c6fa96aef18c6a61dc37e1e8436fac43763c9acb9b5955157cbdc15d356936cbc603f6eca2e2a53163591b3d2257d67335caf60b4223b8c0cb7c54454e3b4812e5760848ec0babd9a0d7da9e83719bb0d7395418c44d86bfeff4c8a8548cee6780a5388e36eb4f5667ac2182c213a577fa2c4616814ebda8ce8a1c5851e0551d356471a8051d179de078c9f12163b0234fd729c9b02c302997c13974b47aec7573604d8278783bca1a5f184f77047f3b1861b7e1c2dfeba290e785d77ccc37e0ad03c199322c475191aaaf87300ea43f6a956b7d03b338b147cdfa14467b2850a73ba99c6b39d89ec6fa3052a9bfd0f6922f9b37ae6966c940370811aad1572039ba3365d089016c21fcb64fe3d924f805336d49683ed262410594f8205bb2649082642314fc7065cba9b8c4421f1bac52f69ea8f96093f89342b879eeb785756587a4027680119d41bb559c758197d360342bc3845237aed01aeb8104490b9bcb4ac158f154b347a49219ca5a401f90d1c1f4f7ba521bb33ae0610767207f3c9feb991e7ce444a42b33ee5a14710586523cc98aa53de01801bf383e33ebc03900678750734311c349cac283ba827fe39f976b3de28610113291f61325b870384280c58ac9c48bb65c5d8a672c86b218e8a706d3b87f2341b95199956886ee0ab068d927ddd109af491d23e991f4e8619e4aae99053c4db3514d380133105ad60885a9fa5fa80c144a3949cc8c33b591c776d5a7a6e9c8d12417b4c1661c867119f7006e6520462b63e1770aa6424dbec6b9a0c2cdb8c8945d653e62c790d7857681b479fda12c8894640aab041a044d897c565ce882aeeb8caf42630e10afd12293fbec9d7ef259bf881c92cc7706ac41626bbe1d17373e57b3a86a3ba62cb6084869b58c659371c110930b6c75626651971641a899645846f96081b00f6c29bcf8c646210676bf266467d90eb393b64a1593b4579adb0b549e6648da5c9e2eb3bddbc78c468912dc674b126acd4448bb40bab46ebc8620288253156d8d39ada1b639c6f69d34e9a25e6b6bf4241bc00b5968282bab963820fac7159001fa414dbe2b94a74158ab43c6a43519f9a34a716cc07908452e5a0a517138cf46220243bf2e27ae78835b73e0720222700861136b2a405a241e58f37f132c588a1102a5344b704619666900c73990c2145497565d09e984f2689e315ab204c59a360534a641228768a9f1581532ea9d7717b8d8069158605508a24ad1c71fee5760605bc2d619b177985ce89cbae0ea5ea335529a20225cf83744d807b886ccd5cbcbb8393d5bf144497a4c454a2ac7589b5315937345cc02372fde21bec80c0ac8912d28b3348df2a88c35b7f384809f24665600583530226b50a6429217ca211946ea66451c9092e7c42b309a922465561b307f8912f29a1ee687b1d96d8c201bdd75a34e09d954a4267f21490c0eb74ae98fad1b5a3b5d2b9f70e922599b58af4bf05a9815c270046161175cfdbc167293cfd50e9d74851ef1d1dfa2acf359556df4a2abaeb9dcee945829beb71185b4d6bd18b76e5668f253383a + +# Official test vector 15, seed: "669c4ef8a051ce201da65fc4bc34d398ec1f806276fc5d987ad71d93bc12dc8f107b58be6e8422a0795c88cb9a0e7488" +seed: 97b5665676e59e3538ebadaa8cd50df1f9fda1502d9894c616a946078e56b621df05318b5f655efe36f1b678cf4b875108a18db2fa312261caf839f84bd956c5 +public_key: 6820166411abe7da1944fb933eb009de46ba60e249664722776b37ccf770b187269cb240004aaf74c37eb027c62536ae847b8ec48a6b2a9ac68307802db576b70226fa1b951da9cfe094a0bf4b0b306c5e030baaa25baa591b289fa24148c7ca16a19e0a0039eda555645bb65685a75a57028bb29456e4c16ab48c06d346ba9925db4184adf635e779522c2670dc5bc1ac86c662eb37975aa806a2b2e307904f6c6a0d094828aa1c07891cf098223ea78967e7af701273a8a1859adccac61bcd0c103f3c13aca18689397bab1ddcbdee2ab113ec6932c68622c513b0d66c60244cd77441c7aa964b5331ec11a088a5034e064a1d95b4b389c15c51426fc9a135464416881858511fc894bc2a3b0b742366dbca062f2c3eec28bc3c38c809eaab081c5dca65bfce171057ab8467eaab50987732b9c85bdcaee647342c3660950b9ca7c0bdfb3bab69268fc8486397b540f0831efb861ac11855dea4a588c4935847a644a470f055a923162f1dbc2b699020880cb08b80621de33a9f0aa83fa2b5541aa2cf41b98214a5fee14785661a63603f0492163b47829c71a7afb0b5efe94e8e225ea2c0179539772a510a5ab5456be4670a076ee1b25ff62687a96284166576e3e773adf2c061258bf2d28b1ba00fd485b8151076eac5be6ab7ccd81312a9ca938f256b6fbc8ab6d3c3a1da5c75e1806c5c4cd4202c0b20816e368bb2443684463ed43787a89236fec32fc99891166462852750a8c1445ac407924470a56b1cc75c7a378a2e40c00fb35c0d4f65bd12f49911fb923bec1b635baca8428ec7d13b36079732838459c669f7f0c26281717ad45eec972011c66d63a298b95566afe11baac79a67dbadc882815d014549cc294b658a8c00a2422c0d23f6a0be9bca232c8374e616e749623e8a99b0f96a08c95897e88900851076b1b470732ec2462bc9c943255bc475da70b44b134e0cafe8f3cef42972cc175e04fbbcbdf4cd151639155a0469651408c9292de9383e63c08c8bcd96a69a3ebaad9b2c1940a37f6c32b1d3b702d28acb908cb2c7b88b89a7ad4c87cfa6c53987e4721d2302bfb53ef3e9bf7319219926bb7884111fe2c4a9aa4c4c1c0f8be3bda890c0342b56f826a6e971c33f900408292c5820c92b66bc8432cf735388ddc35eb004506d8a671547b7f324741f609e2121a0592644e7e0cffce7280f77c34d05b930b96ec9c79838da4a78680da3b07c1485081d14b9d880bf3ec61d852114d738580918c72a270d7034412305ba10d6a5629a931747611554602f529f32356d9e0331de2232e65c695af1b597cc816d001ddca540a0fa3ae67313853b6a46606c1bd3b32d193bdcf2cdfc2c1f9006724365550632bae19bb3d60804d0c80f17681ee020c6cf3cb7c19a22b1d4acaa8abb40f308ec2cc6616164e106a06f700bc62266ccd40d4a414dfc818ef3ea39540247c0853309d45fb99b84fc3ba114c240915a19e96b742a234ca1e0183e60c8acb65ed2c8a7d239b408c33fc5e31ae83caaad17c24b99238b2a52181517a1202c87a17f22bca93e758ed95a895a6a97c163cba8a4c0d0b980e9871fa8f595a668adf927c4538374c7e65fd052196a64cbaa23969a1c07145352b6829aa9e93993c640e0f62b5bb0228ee37400619eab437434026df078bef452267841bcb72844e836ac95d25439567a76f69a3b2c6cfc1c4525f340b40c558007b4f76864e8367cba7c71edf2aa9ec56f25f606cdd66cedd0937451b95422a509b12553a8cebe7b95bd97b45564c98d20a9ce8c51add836d8c00af538b0d0528507bc3924a731ac05a688a1680e050b770c3a8f49c654138bde367f4269abdc4215175799a6112bbc186b23745fb0cc3f2bcbb6ba1670b1834e99e10b2fe25003243284c59ee4202ee28a6ec2086510697240d60961398c77b3b046a23a55b89151673e1ad8a9de959923974c540902716c973ea402b3576f5b664da2a104812a6101996980d68baedc34f9856effb6c457c8332487349ea3b8bc67acb7fc509c22a476c331af75374c57b4c010675d490da92c7c60ac69d89a25e0d67351aa5c9e9880bc1386b77019436abf526b319ce44cc759b009b93f8b9c3059bc7c63ab483a749e1a761e90587f13945674e85b7c896280d15d2d20bcea11db480755602348b4616400faeed3c143406ea9c1307e37e2642ee73c442a +private_key: 402525b257c035fbc56b1aacd731540e40999eb1a2cce3487189184f088a4bc96d9dcc63ab435bb6e26f78a90ca281b436ba7b222cabbba20b4ca3223b1210b5da1c7fec7e64d27b9d7abd831417d8e384aa500a5a986442c767eed412e6499825ca2946bbb83e1a9d07f14429aa46ba598595dc4639da5015c96535c90e99a1c36dd511daaa713f741f3ce3cf8232cb5ff403f32c75467440092a4f7714524b9ccc3fca9503c50cc8d676758ab660e2742930bbb061639549346b9a67d82617a33283061011844467bf12ad270ab2e047835ce36276051062f46f32e05c3af197cf7244352c03f423305c6477a9b606301b606c693ea08196a2c8b639c21aa641646bd3c958f3b6da0ca8234b17ead33b9a855e2b0181dde85ae8a33ce357273583cb06968f07f6b52de50d6600973b5b60ec3702c5480d95820dc0aa611cf80891338b5187b74d7046906499bf7419f2dcc89f7808b5557915ec82dd90102800a26e1ca3503b8844416c688386c3a74fe6b11fcbb6293f9c65fa247c70a40d8779056663bf92ab39b2596a17710204b884765c5c90f6b61b660a32c8158ce1817f45c2d9c769bb203acea434817c6f788482135118623152c0f38ff33733013a3fe5898f741986a5d322f679a7c0a17040b4cfc0f65e0395bb7d5b698e676db248880791274ea868d13009e289951d3b80d57385924a433a83a42d879208072a2a5b563b171c9b53c263c6b233a27e40f6b3205741373880498552afe88132b80f3849c937fa91ebb3a0770c5027a7065b961365429a7685bd2df71792ba893cec50bf398493d0676e002ea5a9054f095d52870728fb9ed9536da077273437689209b2b14407f9639bdd287ba9f77af0f6c750580c7cec0426035e89745e88f3b328c60fb31987d7fa0280d062d8ac2f57b5133aa1af119151344b5f4589389aa11803da3c1f08aef60589ab2687e5ebcdcccc9d3c38b80d078c3c4038d0870e0da3adb641a5f22198868a24d2a128981b4bebab984f9c39edb9650d23823dc1ad7f2c39067b95844829bf24ca25b68325134f14d9a849db47169304f3319f95da79e119be3f31af93cc1f1a1bb6743379a6314477fa01e687b135256f72d5657561b98d215ed6bc1bf80239e3831c16317cef9b7e2ff60c6d116bf8456c11c6a47006b75b27ada9c6baedcaaa8775306319982372a39039bfd1315aa310c7859aa42c287dda6cbbe0f24f288ba3f9d78b214b6065d35eb9374ec46c251e77608c53161232cf11480b92505ba69a7fba20b5713bc616317e4c963fc938af06558ec62b47be7c967e652dc55c1ea38c1a9d90947d167d672c6d0c608b6b9535bfe20e2e2bb322155ec3e777341c3b5f4a5c79a93a376a023f263e71c215e19b2cae2c11ec400a93439b0bd13f8caba7366094635cbd1558448294704c5b209d7b7a6ba1aae425aa03ab197aea341d0166eca608337c387644638ee00cc3fca30f2a063b8847f637299320127d038343f001720ba4aaf339404a2494b1385f851ec06b07105869960332a8da7f5a7065e8983261eb7b68191481062a22a800932a38e0280ce73c1b762a3f95058492c27c4022cb2f82c1781418ce217c06d5ca7f1ab2e99167705b3721719497b266db68b6ea1356b4c642058b4f1aab6c4093c3b2532181f9bda310387a216b6339341239b8fbb9cb9d8a46554c1aa875b1acb34ba50b2b6b11cd07ab0c695a66f025cae448229655b177543b98478eba7895882a6a7e20a5263370c7177370d1ae4b48b18583a49dc62228165c55368ae6aab812f6321aeac1ee5542bd35a9c291b6f8ac01df1c10e5e10a00d61acaf83b125407445a341aeaace6f592fed5bff105178c018f893116bad4aab410ce04071e312269bcb1725cf229bf57103fe90a99dbb8a0105e926c28aa87571d613290550ec96bc9e2213a088c98c3981727e8311aa595f221183a9657e0cca6ed40962a30570a475e7c70281576013d725793e11a91b312e688a55365ce42ab08ac759897a8af7c607622e56014dc825f647d1421a9099b14bcc4934cc4b389b333c14373fa593f0851291a1b3b4fa96edbaa893e4814f887adecf9560154876e1b861841a2ad37236dc2c647e608cef8a3bcacaaba0a66acfaafe173cef526c86d31416820166411abe7da1944fb933eb009de46ba60e249664722776b37ccf770b187269cb240004aaf74c37eb027c62536ae847b8ec48a6b2a9ac68307802db576b70226fa1b951da9cfe094a0bf4b0b306c5e030baaa25baa591b289fa24148c7ca16a19e0a0039eda555645bb65685a75a57028bb29456e4c16ab48c06d346ba9925db4184adf635e779522c2670dc5bc1ac86c662eb37975aa806a2b2e307904f6c6a0d094828aa1c07891cf098223ea78967e7af701273a8a1859adccac61bcd0c103f3c13aca18689397bab1ddcbdee2ab113ec6932c68622c513b0d66c60244cd77441c7aa964b5331ec11a088a5034e064a1d95b4b389c15c51426fc9a135464416881858511fc894bc2a3b0b742366dbca062f2c3eec28bc3c38c809eaab081c5dca65bfce171057ab8467eaab50987732b9c85bdcaee647342c3660950b9ca7c0bdfb3bab69268fc8486397b540f0831efb861ac11855dea4a588c4935847a644a470f055a923162f1dbc2b699020880cb08b80621de33a9f0aa83fa2b5541aa2cf41b98214a5fee14785661a63603f0492163b47829c71a7afb0b5efe94e8e225ea2c0179539772a510a5ab5456be4670a076ee1b25ff62687a96284166576e3e773adf2c061258bf2d28b1ba00fd485b8151076eac5be6ab7ccd81312a9ca938f256b6fbc8ab6d3c3a1da5c75e1806c5c4cd4202c0b20816e368bb2443684463ed43787a89236fec32fc99891166462852750a8c1445ac407924470a56b1cc75c7a378a2e40c00fb35c0d4f65bd12f49911fb923bec1b635baca8428ec7d13b36079732838459c669f7f0c26281717ad45eec972011c66d63a298b95566afe11baac79a67dbadc882815d014549cc294b658a8c00a2422c0d23f6a0be9bca232c8374e616e749623e8a99b0f96a08c95897e88900851076b1b470732ec2462bc9c943255bc475da70b44b134e0cafe8f3cef42972cc175e04fbbcbdf4cd151639155a0469651408c9292de9383e63c08c8bcd96a69a3ebaad9b2c1940a37f6c32b1d3b702d28acb908cb2c7b88b89a7ad4c87cfa6c53987e4721d2302bfb53ef3e9bf7319219926bb7884111fe2c4a9aa4c4c1c0f8be3bda890c0342b56f826a6e971c33f900408292c5820c92b66bc8432cf735388ddc35eb004506d8a671547b7f324741f609e2121a0592644e7e0cffce7280f77c34d05b930b96ec9c79838da4a78680da3b07c1485081d14b9d880bf3ec61d852114d738580918c72a270d7034412305ba10d6a5629a931747611554602f529f32356d9e0331de2232e65c695af1b597cc816d001ddca540a0fa3ae67313853b6a46606c1bd3b32d193bdcf2cdfc2c1f9006724365550632bae19bb3d60804d0c80f17681ee020c6cf3cb7c19a22b1d4acaa8abb40f308ec2cc6616164e106a06f700bc62266ccd40d4a414dfc818ef3ea39540247c0853309d45fb99b84fc3ba114c240915a19e96b742a234ca1e0183e60c8acb65ed2c8a7d239b408c33fc5e31ae83caaad17c24b99238b2a52181517a1202c87a17f22bca93e758ed95a895a6a97c163cba8a4c0d0b980e9871fa8f595a668adf927c4538374c7e65fd052196a64cbaa23969a1c07145352b6829aa9e93993c640e0f62b5bb0228ee37400619eab437434026df078bef452267841bcb72844e836ac95d25439567a76f69a3b2c6cfc1c4525f340b40c558007b4f76864e8367cba7c71edf2aa9ec56f25f606cdd66cedd0937451b95422a509b12553a8cebe7b95bd97b45564c98d20a9ce8c51add836d8c00af538b0d0528507bc3924a731ac05a688a1680e050b770c3a8f49c654138bde367f4269abdc4215175799a6112bbc186b23745fb0cc3f2bcbb6ba1670b1834e99e10b2fe25003243284c59ee4202ee28a6ec2086510697240d60961398c77b3b046a23a55b89151673e1ad8a9de959923974c540902716c973ea402b3576f5b664da2a104812a6101996980d68baedc34f9856effb6c457c8332487349ea3b8bc67acb7fc509c22a476c331af75374c57b4c010675d490da92c7c60ac69d89a25e0d67351aa5c9e9880bc1386b77019436abf526b319ce44cc759b009b93f8b9c3059bc7c63ab483a749e1a761e90587f13945674e85b7c896280d15d2d20bcea11db480755602348b4616400faeed3c143406ea9c1307e37e2642ee73c442a4f71da07c289afd5cafba73184b9723c238da81e3ae109daca1873ae1e34d84adf05318b5f655efe36f1b678cf4b875108a18db2fa312261caf839f84bd956c5 + +# Official test vector 16, seed: "9debccfe818f6b5204db4ea09c03ec9a19dcf1629c1527685b8a29776bb1daaec45f8abf8f0adc9a8c8bd6e2df6d8048" +seed: ef99224a03a85a46ef115474ec5b5d620da6795d6efcca4c9135d19958a9de62df7d92dda83e6b2ef4cce08c9134563063068a196d7b1a1a13623e48ae12528e +public_key: 60045ceea77d8303982ab9b039dc4c3fd0159d46c89e618304fb5d4cc53e9766138fbcb061b56ddbd61e33873a953590f628c122d049cf722737b54d4430c312342189b59364e14fdf8cb1edc540c39612f8e2bf88710c26425c09dc7affa63f52fa01db7794aa2c2abca69145e89c06d40189fa704dfc4b252811b939118f1b9928d0b0b6767a1685804f502a19254ff89a45d9539c9f968835013b69a362f634b269b911c4327520673049c00e0fc437448c2849089918ec93c2ea270bd0699c85898c0148f4a1095039a216a51143183f4d695aa456c32e8a35d351415120725ef995010409e1176806da6b6e08ccfb3093914c87c107cd14e11f937a9f138b928ea5580494c6eb643ae33b5600f7726e2004f52cc39ab24d0cc9c3f9e57a0b821fdfe8404e6532bbe01609a61def2b4f452a1fbff381692975e05121e2330c789055e5a4ad696678bbeb1a8d3247d2257ba246a2ef966c305a8f4fac73a6fc08f71ca500aa9d00962caab7a2780cb94c209b1cd43151f3248dd344bc9898b7780950a10211d73aa0ba20d89b01b36623ed8aae48845e1d7372f12b9a692b3d525263dfa12b3f312f91b5802d3b3380e58be6a92a70e77cd6134103496dc3e9236ff17cb0ebb04a1783379baa0a3c54cf1c5eb1b4afcd9a7042c50d6405b1b610a9429aafe61a5423055af9f61d3617be60bb59ee8019e72123069614e738a46703af5bf25d31ac4f1357832b1232cbb9325e522e79571a1d226397e407e4b08b44082e71e984e463747a230bed934127e892fba29b88857606983a60b9425008117ce17d20c82b6171165e940530254f2b0cb4e5c235dce373fe1450ee6457da59c331b17f8d4b5e0bab25aac789c04acffb957724783d00dd24eec3375f97ad838ac0c261789cd3afcd68b2d53c0c9bf944f094bf0875c0f08c161d3618c774304ab25563981974ca2e13b5bbdd210ec10ba39c64635c9025b9610b623c2f12a768e03163d75315c7097782b69c44b3a0c33a552228c6001c5ce194346a80824627b974d2c64fba994d2c62f8babac47c51dc100c54789f737c61b9b3420469b11d110dad9010c6c67ead2329d3b4c665ac528041bfd028612c608f87f3ab74b6b68309317e1c0ee5662f8dca46c26039e2dcb1fe8c42cff0057d4bb3e4ab3bce13c142e589592c0850e117cabb2cac88431461a5e6743695e096099a8249e22f4033c15e9266cb00a9a36103ac473123e95d373b0dc92cbdf6b2b173b07a3771456d283c758ab963811e5168694cc20e64e8a677e05e3915c4d93c8531b75d430b3709753f899b1c45434be196a3fbe5149dda2ac0912afac619b4a45f3df262f7d617322a9e8221a79f2319e6ac59034c80b3214953419a191b0e4a25247bfaa0defa001d5529b1cbb9e63ac03768404645bb8ac7ce25687be70796bdf516b76039f7b689ce6c3f569a04c52875ecdc9fbc97447e0160e75a89215aa263091e7cb5534a97660cc8515ed61d9b624950c089d9aa647f787a8ed7c89216694a83c56cf278fa94340d790015b914d09ba91e10ac5b7ba95792bfe779966ebc07ac6916fe1aa4bce56cbaf506563319c5a4c4344344b472226f59b7fbe7982c08afe9a60a80c446b8b341eac220fa8a664b6b1a0df72684b67bf2032d75f5aafff7cc724acf3f1051ec3cc4ce8768fa9ab51f960f3293a1fc527686570da34404b5681967258799fa26f22179e18221f4babc2b7c46601ab7ceca1a345027d44783e7d6c511615b108c4197bc0d9ee49c91621074a907ab292d4575abad75a19f10c2a493af902252bba57348dc33fdab3217778429680b4f352b52445eb662101dd22ddd211f314577cb23bc47c7176942c5cba072996c048408a5dd795907bb2e2f49acd0e75a93cc4f7938136d7c26da0691c08733e8138caed6c8cb116b900869f9fba9f5823b20626980ea86e6f487af758830c787bb1bbd8de024be9765dd04b969dc21589312e709cd6780c9a38a8207fbbe74f220c3c33e2a127588b64e3170999d3a77c8f67eec947cb69649dc64010a3119c9030e1fd0530cf5c3b73b631917719d0983ad0a06d2963741289a282a717d7487acb30354fc74b005ba01101a1c8b52c130a00339bff4f480a4e890030a709b28082d3c501b2aa2d14fbef9e429f8cfb50e84c327ba02edb7f6abdde459896eac77b5d8c7d7cabe +private_key: 499333bcb7971e60c8a924aa6ebb2ccff48b4d3b9fd4786741668c071aab1c401d6e50928ee83d7997cd10151b1bb28bbdc8844681cbf736c4110cca8f32c3ce345060080d9280b9d8d8b8621b690eaa77e6bb8ed23285eaac41ee6b44d85a7253d70dc3180c5bc16ff3b7a4371616c98b50c3dc46bdb3207f880220b6ba60bb6db6a3326137190fca28777a519377cf8f08b333a721ddf9c8a91479a600087fc15a35430091357759da0b009d86d312aa7c8abed3d6babc371612543edb115c0273c999452f85d796d9eaa442c880eb098ec2a8b249d3378611b4a27a583cbba276790e9a119abc9cca1ba7c57414c1d697303dea1778b736ddbb9f521a44b76941538666a98140263419d3bb593cb23bd070008f396aa8532a92dbcfa7031d5c537feb2594131204691605d7fc8e5c7c6aaeeacdfd169e62b476d3a65d611801ddb06988f38636f32600ebc192b8709b1c56070a68fed61866f00d0f2b16b0429a9edb6e6850366cf3995eb5c926ab4c82506f50017a1a106e2cc32698fb77bdabbc60f35dd93a54faaa10f4272c2ec98357f3c137628c855513173c4788c35af8bcc723b97910343eaf4172ac586064dbaa43ea90cc36521a54aad84b3cf906145ababa3498cf2ad900c10b5c7beb0fc11b8d358a90d34383faa5032d535935fa4c639cc7e0094534623176b836d7c041d2b6c1689c3325c71dbef0743863a4993c34623578428910959075c5129d7706a3537172cfe981e8ab8a29bb09a1681b6fb75bb60017ba998af84863aa17c03cfac56e18aaf714ac9854616f09becf13427e996dfb084b1e62c5495c9eeeb1c0bc23c971077255520f17692601a9021662b770672a860c025ba9238cf8c73a8a467833bea9462ae604387f11431ab5794907916aa15de03aa6501c993bc684506b24d715557ddb7ba01c492407147905abb8977902da131cebbfd9b3b5dbc7a03580726510393f2835a1db389804a7af54743c553f5c445b4d350d3679b8d300916be22dccc7a0aa009e22e98dc21003f7a8041813bf84a8592d7979ae34b299e9403fd8a073cba7dea6a44968944eb4be70623163eb9e59da4516612d3df06e80d8326090b52ec78c3b883e70c06a77c70fd0426ef34150ba3195d05075a08c133f608de4327712c825e05878ba74acc9ac66a7573f6d245f2ab3c09e702b1b395bb28c1746eca972b41fd9d28743b736ab39853066c5029b4cc37089b89179e3a822cd606bfbb74820d3885e3b08bbb0716a7c7d4b674f46ec36d6d89a4e331add040ef64cca6c3b1e1bacb5a5d857a729beec7b5f4b068c3a685614619d6021170ce22f3f28a52517268ac6693c58b3f19798e4b186e2f0c471e33c4ca0338555ce3c37316a291cb89a3fdbd1b64fea422c46c51e65844e5317e4dc47a9461704e16259701718600610d7273a09cd53b256d5c6701dd1cbbc3b452bf943729c3f35a2761360885cd65a0bd06965443e2762b4d5152f50a4c18171205bb192de1619d9f3217a870ef1272edd442f62c21257407427fa0d4e85bf4e27563fc2c569357e44f7239edb9828c65dae20870d5a48b4f807cba20062eba57f0613114c335969ad471178e6f3318103b038c2812c18bbd68903c00827179a710c23ce84670c08075b70513aa9d5c6b3c34a3e4c437cc6c14b63b4c3e1c27638151d8a2fe633520f1159c52c4c59536eeb22b6981b8d10c29469242f3a09a7a416c79d893fe2c5c3204895ab23b0b062160b58b99d501f2dbc3c75a594e0a605dcb6ce54832d2bd450bc4c53abd892fecb0db87319adc0294345770197acc8e1b8fbfa67e8a830834432fc93aa463541456059da44be22695b3ec0caec411835e409430076de94426ff03af3e97c5ed07dc0b9450cc1a37508d019ba1b08d89943a5661fda1e84f09f2b8961d36243f36155f95c8a74e83b0fe61966f1008826566f5737bbda0a3bc1b2e0852f50f96df1c692be536346fca97d83c41ef6cc63ab22f4a159229217261a8760e648d2653d4fe13884624baf9a57af50802ad6c90359a10f3a9e83119834a001b74a09baca15c80c2b1a391dc652236011885bc181f6a8b42e7b0581798348cbc987959462e3b2f8986e42f59d84ba35cb171f2e81bfa5079dd30b981973adf67c645dd82d60045ceea77d8303982ab9b039dc4c3fd0159d46c89e618304fb5d4cc53e9766138fbcb061b56ddbd61e33873a953590f628c122d049cf722737b54d4430c312342189b59364e14fdf8cb1edc540c39612f8e2bf88710c26425c09dc7affa63f52fa01db7794aa2c2abca69145e89c06d40189fa704dfc4b252811b939118f1b9928d0b0b6767a1685804f502a19254ff89a45d9539c9f968835013b69a362f634b269b911c4327520673049c00e0fc437448c2849089918ec93c2ea270bd0699c85898c0148f4a1095039a216a51143183f4d695aa456c32e8a35d351415120725ef995010409e1176806da6b6e08ccfb3093914c87c107cd14e11f937a9f138b928ea5580494c6eb643ae33b5600f7726e2004f52cc39ab24d0cc9c3f9e57a0b821fdfe8404e6532bbe01609a61def2b4f452a1fbff381692975e05121e2330c789055e5a4ad696678bbeb1a8d3247d2257ba246a2ef966c305a8f4fac73a6fc08f71ca500aa9d00962caab7a2780cb94c209b1cd43151f3248dd344bc9898b7780950a10211d73aa0ba20d89b01b36623ed8aae48845e1d7372f12b9a692b3d525263dfa12b3f312f91b5802d3b3380e58be6a92a70e77cd6134103496dc3e9236ff17cb0ebb04a1783379baa0a3c54cf1c5eb1b4afcd9a7042c50d6405b1b610a9429aafe61a5423055af9f61d3617be60bb59ee8019e72123069614e738a46703af5bf25d31ac4f1357832b1232cbb9325e522e79571a1d226397e407e4b08b44082e71e984e463747a230bed934127e892fba29b88857606983a60b9425008117ce17d20c82b6171165e940530254f2b0cb4e5c235dce373fe1450ee6457da59c331b17f8d4b5e0bab25aac789c04acffb957724783d00dd24eec3375f97ad838ac0c261789cd3afcd68b2d53c0c9bf944f094bf0875c0f08c161d3618c774304ab25563981974ca2e13b5bbdd210ec10ba39c64635c9025b9610b623c2f12a768e03163d75315c7097782b69c44b3a0c33a552228c6001c5ce194346a80824627b974d2c64fba994d2c62f8babac47c51dc100c54789f737c61b9b3420469b11d110dad9010c6c67ead2329d3b4c665ac528041bfd028612c608f87f3ab74b6b68309317e1c0ee5662f8dca46c26039e2dcb1fe8c42cff0057d4bb3e4ab3bce13c142e589592c0850e117cabb2cac88431461a5e6743695e096099a8249e22f4033c15e9266cb00a9a36103ac473123e95d373b0dc92cbdf6b2b173b07a3771456d283c758ab963811e5168694cc20e64e8a677e05e3915c4d93c8531b75d430b3709753f899b1c45434be196a3fbe5149dda2ac0912afac619b4a45f3df262f7d617322a9e8221a79f2319e6ac59034c80b3214953419a191b0e4a25247bfaa0defa001d5529b1cbb9e63ac03768404645bb8ac7ce25687be70796bdf516b76039f7b689ce6c3f569a04c52875ecdc9fbc97447e0160e75a89215aa263091e7cb5534a97660cc8515ed61d9b624950c089d9aa647f787a8ed7c89216694a83c56cf278fa94340d790015b914d09ba91e10ac5b7ba95792bfe779966ebc07ac6916fe1aa4bce56cbaf506563319c5a4c4344344b472226f59b7fbe7982c08afe9a60a80c446b8b341eac220fa8a664b6b1a0df72684b67bf2032d75f5aafff7cc724acf3f1051ec3cc4ce8768fa9ab51f960f3293a1fc527686570da34404b5681967258799fa26f22179e18221f4babc2b7c46601ab7ceca1a345027d44783e7d6c511615b108c4197bc0d9ee49c91621074a907ab292d4575abad75a19f10c2a493af902252bba57348dc33fdab3217778429680b4f352b52445eb662101dd22ddd211f314577cb23bc47c7176942c5cba072996c048408a5dd795907bb2e2f49acd0e75a93cc4f7938136d7c26da0691c08733e8138caed6c8cb116b900869f9fba9f5823b20626980ea86e6f487af758830c787bb1bbd8de024be9765dd04b969dc21589312e709cd6780c9a38a8207fbbe74f220c3c33e2a127588b64e3170999d3a77c8f67eec947cb69649dc64010a3119c9030e1fd0530cf5c3b73b631917719d0983ad0a06d2963741289a282a717d7487acb30354fc74b005ba01101a1c8b52c130a00339bff4f480a4e890030a709b28082d3c501b2aa2d14fbef9e429f8cfb50e84c327ba02edb7f6abdde459896eac77b5d8c7d7cabe482c88cdc80345768e4cb54d17aebf2947b07c716dde8da26e0b7114f85dfd29df7d92dda83e6b2ef4cce08c9134563063068a196d7b1a1a13623e48ae12528e + +# Official test vector 17, seed: "8098ae7a92c10f707d405f7dea02c2efbef44efa132ba8aefe81bd45e543ecec74f10920ae48a40b0653d63532517f2a" +seed: b12f6fd965ea9c5b947db80fc60c83d5e232dca82e7263027c19bd62e5a6ff550f6aa3e88f7fa8a96067f8cdaeceeac90c2d0b5e277e56e9c405ec9420c30252 +public_key: 944633d5f98af3845ca7c37f1be75a52410da5d2bf9d102305eace09009e6ea21b6c543a25032612492b58247f13f01c6ebb27fd469dcfc83ac93071d3368fa128a4c71475ac1817a8b1744c9a2085e54ebb8455bec286dee50cbce87ebb0bafc32341e877aba7a5ac10dc99b65687aa53cdf2585976a06bef586e8993953d5a3cfad8a7593349f9c31010e6becd32cf6ec70f4ef88b1ab955a5d6aac2a877323181668a2c731726236c4c1f77768ed06a7358744c91c690029c4c747603289874032fe6730d96392805e10b7a50a6b849985083caf8d64c1fc257747613b9e6c85e455ace3755ca9034089162d96346e3f0cdde0a81f6a7727babab5f1401dc1832bc175e3576b36747101ccac305d28ac5386ea92447f483408aea6ab22c1027b99b9f14a1b6a67a24fccfd5f52295dc11995b9503d76c7d0ba51abac76777b960c45ce8dcc24ff6031da9a99174be42a381654b5c9697b13188a38c278d94f801a2b94685acb0935074c06272e0ba87b6214f717c01d9508d77535e444b5a2b461d02acb855d7309b8ac6b7731bab6626921160e1a35d0bf14deeb922d770be063198d5a72de076216bb366a0889773bbcdef5872934a894c7664f568ac7f1cb5bc72587767025a271db13a0ce44697aa4c0dba80a730c0c1c2146b36a50d23926df520ab3460b18687921de988c2a7c97dabacc5aa849068ad76f10b361b9a2d1436bd88c962ec724dc15a6583ca8a41704f3946da465042b808f2513b65a5009da5b44125308142478ad82ac64940164c24a599c96eb69ee5e4bef1e45066e2cab719b57fbcc03c1985472cad16a2699e4939b2e2850c1b24e8049a41362b2b908e52e2a9f7808d06a6298e059bbe1c5a87a8610a06af0262bc61390f90d962ec95bcc907c850721778a947677a226c0482b5704e7e0176f1e28e27150ad84093ae862682b4a74e8a7d330c4c4e144c3a39c3a3da3c75873dbaca4880c2940ce30ed10c395805c0bc043cd2861b2e9c0da1b59474f8c492024cecdc7676d4b8c4b3311096270d29057d05cba6494b6aa07379b73bdfac9a561a8ffdd3a43c5877d85749db9c8379abb29f7567fa1cc57b09c35e7b6ff3f735cc18473049ba2d5837edd8176531b67e04a509ba811a9467c633b962e8392d065a03865658913f494501fe9c0a6a649dc8f3256b6274cb6235b0cb278132676d028a24e07595f56c4727a7b11830c1c9840c002db53b6198444e5b63be4c46be9548bf4e1598ea6371686c63da774270b82c95f0c9a12b5c8f9a591ec50971d897b3c1c4e0701da5e26be2760ac99b481151abd2a20ba343bf46eca8699487d14a9667565ca4e30eae468ac5e6cae54b4adcd5acd74812ebc3b4066021b0cc890099b911553b95c794643a97f99a512ce874f10a3c250a513c005a70605429f5943600cfb9e4b2c5e72c821149d9c2c554c43d9bdb271806ae8b58506571c061240b6e7967417542334773178424d46122c7212e0ba7b5bf4388e8f4a3f60caeff712c1e3773fe51b357584a917bc3e4fb950c442ae17abeffe262a4a6550576b6e8297ba723943ae3bf60971b9b86cf952c806fecbe937c7b15c91c9e438ebee95e51d209e60105bc43be345167ac92492bba9549807361a06f525380f5f19f7d1bb926cb1c2fa726cf371174caad5034037d07ae2f305f4ba52f9415b0c624398b936333d68625f533d7da20d62507768a73f579ae71b2193f52a214b30921dc121b6c94042b386f52a202794bab835a9391ccbdbab2ddd94b3b04acf71a12de67cd24d1a85e7330dd36bbb6b387acb6bad3a59c1d292fc24aa6045c8c34ea4771b8137537b644997eb45bc2ef2a1165b308d3c926a0d23d09e749a142493a99ab1c3a80a87c3003990956729ec1c6c60a47a16f495813cb75c995aeaa481875830f1e906fd6eb993a8b3365189d1b50627466161451a21ee45397971d8f56634d90cd0e136c9d82729f8a76c61298a1a240f611824173abfb52ac1aa4bed85b4b18939988895075e888ac0c519ec75ebf693d3903560445414ed3bb3d262074981524e361efe44945b14daccc62e2c335ec40bb4453cae2524229571eceb64a25026b3e1ca249c127aacc08cde4203ebbcb6fb427379097fd222b4e24cb9cd47381c6b780553dd196bfc6c356f031eeed6c85b57be19afc39dd1f929bbb2d627f5f19db +private_key: dc0009fa7c1c6bcc6a0164044607925524ccba9a8c5986419805c924374838a2764fea94d7db8cdae57360510aa9da6b61134d767b14cc87a2aee90a68c10ce92a41bf8144e97c73e2b730f15673165a5647ca4d536bacf780a3e33a224f67b58258b3718bc184534b8436c1162bcea0b5c6599c00c262c34283b5bef25a1620ab60410c9ff0b21cac43cf0a68ab784a1110c183e06984596712560c087aaa05b67be9d6bd9520a486750e18a14ac0796ab1e9c33629bd1375316be248f06295ffc665d8d9bdb701c0447b33252360377611b04a30812b0e2d003cd1365f122104e71b8f52256976b6415ca0b1e2713214527515d37eca3c466a9b11fef107577caeb5e17e33aa0c9c4a71c7ba9b4813b3413ba65887c4fbea22e80251e3f727d2b7b0128555be6965cf704f9409b57b939aa2612d1d7241adb88eab14926a3718a483ba06a604d72591bb0377d53a31b8810ad8f70a8a2757ddb44ff1b02f557b9b61eb5a33c481f4b25ae00b1389b93437b5cde202ba6282912a095f19255c7b7bc136072ee3e7ca4c6800c415a2135871313bbdd47338ceaa715ab7450293a984e3805141b1185a84bd867202ab34b0213f917728176b5edee0a0904bc29aa74880c8618ee862c326c37152b325b5cbed5c679268aad2c903cfb6a5691912fc0508e23a8e88957f89d79e93b91da85742ede6ac13f0aa15d76b9952c1f5058a3ef0b453691ee45943b7564adcec64d4a02389d3b2f255553e440203605a0f7a192ba417ea54ad6eb347ae52250c5a2bd59c46bf750d60372eaed87c8bf11c44e65fb8db1017411776b161551a9d29212e98cc9c6c735ff8100267296db77b2425b6319a3b6ed5998a6426125cfa78167c0a6ea6c6f8100f7a19628c325b4ef4b29ba97297258565dc5da1042f80c7c634140a2cf93d2c19973506cb6b84c67e32c0a7d718b7d86265a76fe1417bdaa1c8d56a1748016c4b9ac886736a8fb3cfa2693d4a443309dcc003f227f1586498c0cea3d6853e5c07c66ab02943cf9cc791fd2289ab7a1a13c7b3d3a0b990e32d747c2588eb54018c1d25e86cb4d84538da8752248c04353cea97c534801eb223c877682d2dc50284f932095bb2e55b031a144f8f646aad45935b8c947b37b19b99092a0b636d0962d93053e147030187954614ae54caa88eb3736c5745d2d5bdbc462389f97d72f128ab4b5bab3a7aa9e1588452c240774ca5783f56b01824f007d1946d0414a1a722c32154598f3682f3e24aa5c80167956ccafc84b6c343986729e7d03c87f418482b56963243fa67cefda9b221253753a004bccc4d156817bcc9b8e7332128b38c6f6625ced3713c51a3ee137d37785a35d88b7a2b4daae5b356e07bf6ea7a67b5763b04a2944475a5323002b30a6680c9eb08b5954347824a2ae17a29c1a69523ca73bbc9403c35c3b2c74affca1864e24556b90162d07a95e138ea80469d021e35a1770a1c3a5185258cc9659d10054f814ecfbb0937233c3f322e77d3821e9ab61033c24fea260a4b8b3004592c50c68d41b72a67936598a177a6aec3163bc3dc9872415e1f60ac07640b9180a20500bced23add93752d586915a2c448301449e024967159e4f278c674b0313d00dd69cc819c354f5722537dc4dacf29f58b46579b917ba38b2807978f1569df299246a6c23b1e92907f540ca9c27d2393b0481cc10e47d3246cdd599312af942a38cb8ff936e3b64743a6b22a7e96925c863d82b963fb909ef439ff687544b53937c8110399c1dc37c66c987124aa56f9b8c8ec0501dc170252aba325a5a70bc134a2e73c90ecb5cecd373820a34eb706bcdd25f95b3cc9c035a4f1659ca5252a5a21d895cabba090c5115028a079bd81a3c948201b6f9981fb45e73600b2475578d08a8218a9d832ca974d992d13984664057fea0771a0c125b16b9a2d33b72d2478250a4cb9a34a1b3ceddba53d1a4905332217875797ab6248c6b97052678317a99716376b851204cf24fe743782c88ca93b90da03c3e54321ed9500af39b9bf2f7856b13604013a7f502b4c60049b1a03e91292c40d487cc9673e8bb150cd84b11c83493dc0ca1d5568f532af3e54c8166b5b180a6e253840012b7a5eb4f05d53f3bcc5c9414136a70057037c7b88266bac70e4c01b0944633d5f98af3845ca7c37f1be75a52410da5d2bf9d102305eace09009e6ea21b6c543a25032612492b58247f13f01c6ebb27fd469dcfc83ac93071d3368fa128a4c71475ac1817a8b1744c9a2085e54ebb8455bec286dee50cbce87ebb0bafc32341e877aba7a5ac10dc99b65687aa53cdf2585976a06bef586e8993953d5a3cfad8a7593349f9c31010e6becd32cf6ec70f4ef88b1ab955a5d6aac2a877323181668a2c731726236c4c1f77768ed06a7358744c91c690029c4c747603289874032fe6730d96392805e10b7a50a6b849985083caf8d64c1fc257747613b9e6c85e455ace3755ca9034089162d96346e3f0cdde0a81f6a7727babab5f1401dc1832bc175e3576b36747101ccac305d28ac5386ea92447f483408aea6ab22c1027b99b9f14a1b6a67a24fccfd5f52295dc11995b9503d76c7d0ba51abac76777b960c45ce8dcc24ff6031da9a99174be42a381654b5c9697b13188a38c278d94f801a2b94685acb0935074c06272e0ba87b6214f717c01d9508d77535e444b5a2b461d02acb855d7309b8ac6b7731bab6626921160e1a35d0bf14deeb922d770be063198d5a72de076216bb366a0889773bbcdef5872934a894c7664f568ac7f1cb5bc72587767025a271db13a0ce44697aa4c0dba80a730c0c1c2146b36a50d23926df520ab3460b18687921de988c2a7c97dabacc5aa849068ad76f10b361b9a2d1436bd88c962ec724dc15a6583ca8a41704f3946da465042b808f2513b65a5009da5b44125308142478ad82ac64940164c24a599c96eb69ee5e4bef1e45066e2cab719b57fbcc03c1985472cad16a2699e4939b2e2850c1b24e8049a41362b2b908e52e2a9f7808d06a6298e059bbe1c5a87a8610a06af0262bc61390f90d962ec95bcc907c850721778a947677a226c0482b5704e7e0176f1e28e27150ad84093ae862682b4a74e8a7d330c4c4e144c3a39c3a3da3c75873dbaca4880c2940ce30ed10c395805c0bc043cd2861b2e9c0da1b59474f8c492024cecdc7676d4b8c4b3311096270d29057d05cba6494b6aa07379b73bdfac9a561a8ffdd3a43c5877d85749db9c8379abb29f7567fa1cc57b09c35e7b6ff3f735cc18473049ba2d5837edd8176531b67e04a509ba811a9467c633b962e8392d065a03865658913f494501fe9c0a6a649dc8f3256b6274cb6235b0cb278132676d028a24e07595f56c4727a7b11830c1c9840c002db53b6198444e5b63be4c46be9548bf4e1598ea6371686c63da774270b82c95f0c9a12b5c8f9a591ec50971d897b3c1c4e0701da5e26be2760ac99b481151abd2a20ba343bf46eca8699487d14a9667565ca4e30eae468ac5e6cae54b4adcd5acd74812ebc3b4066021b0cc890099b911553b95c794643a97f99a512ce874f10a3c250a513c005a70605429f5943600cfb9e4b2c5e72c821149d9c2c554c43d9bdb271806ae8b58506571c061240b6e7967417542334773178424d46122c7212e0ba7b5bf4388e8f4a3f60caeff712c1e3773fe51b357584a917bc3e4fb950c442ae17abeffe262a4a6550576b6e8297ba723943ae3bf60971b9b86cf952c806fecbe937c7b15c91c9e438ebee95e51d209e60105bc43be345167ac92492bba9549807361a06f525380f5f19f7d1bb926cb1c2fa726cf371174caad5034037d07ae2f305f4ba52f9415b0c624398b936333d68625f533d7da20d62507768a73f579ae71b2193f52a214b30921dc121b6c94042b386f52a202794bab835a9391ccbdbab2ddd94b3b04acf71a12de67cd24d1a85e7330dd36bbb6b387acb6bad3a59c1d292fc24aa6045c8c34ea4771b8137537b644997eb45bc2ef2a1165b308d3c926a0d23d09e749a142493a99ab1c3a80a87c3003990956729ec1c6c60a47a16f495813cb75c995aeaa481875830f1e906fd6eb993a8b3365189d1b50627466161451a21ee45397971d8f56634d90cd0e136c9d82729f8a76c61298a1a240f611824173abfb52ac1aa4bed85b4b18939988895075e888ac0c519ec75ebf693d3903560445414ed3bb3d262074981524e361efe44945b14daccc62e2c335ec40bb4453cae2524229571eceb64a25026b3e1ca249c127aacc08cde4203ebbcb6fb427379097fd222b4e24cb9cd47381c6b780553dd196bfc6c356f031eeed6c85b57be19afc39dd1f929bbb2d627f5f19dba8f24545f5c1f2244d7712dce7596ce08146dae6a7f474daab4056da2d22c4ad0f6aa3e88f7fa8a96067f8cdaeceeac90c2d0b5e277e56e9c405ec9420c30252 + +# Official test vector 18, seed: "d5f23808871544e9c1d6eace2028362b48e225312f77663e9f78cafeb512b908cd9e25875d61a16ec615f4b8ff826856" +seed: 9f52af92ca165fdc38788f2b59ba02e01c8281ff7c1e60504688043a5fe814b04f3029e1be4e1c0258c3a22ff5b50b2674cc094ba7018da2a61569845c17d26f +public_key: 6d3b096a7383933c0cb6615824885499f79dc06b5e874203c3349b2c3b27b1f1012e52bce9968496c068b6e6c7244722621a1a44349314845b1d8831d9821eca386eb8fc254587be5dc529438485b3fac44af0613732509cf225f5c127a4056cd5e503eb742cf03154511969e7a743834708d71579e9ca4a4e281aeb177ef50cb0db826ddd17873e63a182e3b001f659ea3cc73cfaa5d7d7b5e7e9cdaae04c9944978dfb7ed34248d976190cdc0184930e25c6306312180a0b8758395d1febae95b22e0945c5fe265595a9ae91616cf9f35b588b7a02f66d8d49800c50017c7272bbebcffb10a16a5c8560130d96fb0c241a286ba949620ab83539b83d862ddce2507ec4b4bc4330c27517172b43bdf09a5e6a5fb684166800372663544859acbe07424705809587a08dc50fafabc1b2f9486ca6415266c502f7b998dcc947c7b5f5584cd34cc90a4c385f30a2cc051237c6a85d4a5571305a5182c970b9bc87268484f293464545f4c349e8b2ba3e5b4a5e7c42237c0e6e1b7722b04e3d02a27d0597d7169a49e340a778179a924a1d31c0c3d53bedb46868a62ae17847f130ad1478b8428b09fd71b028f1933803318af78103723ae7e1185801872f847753862f9f72323f980d6ba9744cb6c079341b02443b52e4becca891fffbc6084ab40bd17af7c6b2b21c09c170455c52c4c7093c44aabbb1a0c1d11b12070894f7649112f32a98d976c72291100a3bb4948f928771b063839a94a614227587d1a9bd25479bd8bd06e114894bca10814f0c516e1be41b81ccc6044a8f3654679df531c7220982760aa39a4e982ba3247b009d405c0b50969c694858889b4058089631c57dd1c5fe12acd5b27143d09a2d90c8abd8930d16769aa44a3927967b2975a329bce9599bfb170e02a7994fb90e0b1c7bc7db753c065cacf820b80c6c1d585624c93ff14a26afe6245ad8a6b2c082ec871dd1fb10c3acca1898520647b8ef8c0e45580c87f718eaf18ed4e97ea1516acca657bdfa16493115e6c90eb998cd31e6ca095066bc75057b2b71ac2a75711a7820984ae9306dea825c80f26a1ca6c686189c93550d931a1f73fc3ed0341ea703c033bb463c6260097c54bd17996a82abb0d32010cc53d81b7b7052b86abb6302b57d6a34895d09840b3b6a50c9962dc248edfcb328e94460d3c82819cbab49a79f742a86e85577ec995a025fde616fad52c4f092bd89286297d8a8912294faf7c959ca392cd40989c92b8229ad3ec91d352a6bb7d757d3709c5810b40157cc0fe006bfe843419b8a1d792d00c1505e0a63b39c7c2ca2c96f695426073ebd50283572bace67c01bb7b27b09be59e589bd60acca376a8630034cf87e9d49411648a1b05c329af92cb29942cb2369381c3ef761a02f8c905f963f0b08514a7c1302b4bac9f261fa37855b67250258c003e5bc9ad07035e667bcd6a537f35a0756bb2801a0aca56576d72f3a8c0c2f371e5aa036af3a987bb550ac06980bea73b938ce91715a4b19620a08be52695abcb3c833eca2824b60de483810857aba0a9292911c4167159b023989d061ba81c94df979917c72c8eaae518ab0e46ab8927b5b9db690bac6720667baf711a73952b033abaa59d5c4ccf676007044e26c2bb31b5aa2095f2da9724570cb04174e9ac174216c1390a687c60b6c396aa48ef849d19234f36886205b0b28250e7803502565523d0cc0bffb78efe64dc758cf3c93bef42103694b434c4819f82bbc42ab45ad827287a560ee43600b87443d8bc91ac5b15fab2701f05577c32678e06790808d4a6965c30a0915ac8fc7950b274c428a43650003beee2726bd31a09de14e892b54c2605269b8c22f146afe669dc9c4775d200aa9534af5612ea736b01543788b13c3fba608ae90aac0da9335e6c115fbb1d67938b86849d5087a87f3437ea29d7b899144fc3e739a4c079628597c618b554468f56cc6745ff6500d3118c55a8171e42b67ca43ca32135672b22286f78d0485b363d63a2ec737d2aa98ae602d3c485814d2c195db5d7bea8b3ae5470ff7a1e8225f82d565414c6b59379cc5b26155f682f6098795c52e3e8acfed87743737c1bee0ba875a95e9509d89f3667d741cb3aaa989378a2425a0e5f218c02763de4345a208c5bbe4949a506dcd5b01c5f8f4ec5f5bae6946c95ad7fa4e1e5f80354b5112d882796092029150d5d621 +private_key: d0f6234ea63d21038094ac3082f06f5dc2081b5a6083b00a59e5490266a351259927ecc2855c144a83871475277f89311b71436ca835797a1250945a9cf23e041a7020e0cc3ad5c719c9707a6b823b3083351451fa94a7258986c05421e8c98d6e0140a8c171c1116a5a6939dfc95308e8495a47c2aab4b4d30a663e005ca89273b3fa6bed9475bbfa3a6526673d2b4428f01a8041377dc04b9d21618ea05cd2988070c91e95f489b76225ac396de3562ba513b3f23b9809f86eedd7bf9a29a8cd856587eb558772bbe847c2e93497a226080df9567e3a6b22c513b1523c5977b1a1d573336869ef2389b37c3867a5121fc92a097c9640bc996e2845514b04f1b315eb0c7ce4a0b0b219b9c0846cb46c5668796d83759da3a28348f170c3042a86846b78ac7fa5e5c831c4bb953ccdf6821bfd674a8e775a17a4429a197c910b0163454ec3c286cf94ce7e9562f67797896927bcd1b07c1c1b62714a7261ae5d9180473120da730c5e3b8cf1b8b9d9aa54d5392d5c695bd84badf3e20ceda5bb15c1a1c231878d35267bb49571a2216b067ba7515b3cc2661bc8742c3a8616436d117a53e6c96474fb67f0332a261884adb452219b52f31545550b5520c48da1acca388bc35aa120e05433ea1c31b35113f9ec2828e6bf63dba38afb0ed144015c3bcfbf221af1954f5d95b02e3b3df2ea8cfaf09f152987e3db11aa112fb0270d69fc3ba8e26ac30556340bc630c60af699171dc4914daa5fbe81125941982a900a1155188a7a55962639408a2856f480fe22830305078c8785cb9591728a47b0043d0a987a498542f31a113ef0a2ed971a8fb2aea9b334e5354b901393c5a140b05a72e54c21c4860da23019edaa2d0b8680e4379a7813b07df36969e22ae2b4102132711a63171c8bb97f30a599552bb8b902cd9565ba1b0cad788ce92b85b7a468b8348094bac38980981797c80032376da288df3cac31f202f3c3279882b4124761d1c02075303f6f1401bc4b361dc156a417028e56a2822bc941c7aacf26667b100f9bc003398866e9d104f9090c46e23c1d249cfe4619059b38a9012db2d8833b9c96cd40945b83be73b16fe8e53f5e69612f488c7d0753856071882741d533adcc9ac1323513ef15bfae06761385a651994085ec4820e75e7694c5b2423cd12a3b0d06a7194b87055b973803899b4492ae8c6e006636e3a21ea9d872b13c9364e208e99c2c74965215d6290eb96a802a1c836c2819772e21457596982d72e6491651070f1cc7e6861d5a7a01bceabb0daa0692321e9f49bffd83a07caa9a15453831898df4505cf33899f4cc81ba7059d592690d784263074060155c4491130fb9159c09028ec559c4169faf663af83c8d82db07ab08213b1b97607ba0dd50962966683b014bf381be25da2ee32057bb55562a6197b3d6555570af1107ac025cc8ffcb3f4ca17ea33ab0cc792bc83b4674f0014e3808ea128f7e3cc01b4495a0b72846938d23a32eca110e47b17c7db043340a79f7d521407cb0da754b59f267721c63d46c5c4fc58d88f75426a00914dbb3e98246d1b2573bf59cd65222e5939c34b25856625916c28c9cdb82c5643bd13c9b8a634235f1badee54aa3180c1c2bae97828d8746affc737f5bda768ee34bf9fc17618164f59b689f094aef337ab0f56840dc569f20b313647b87c74154a4c6b79968b29627eb067d2918bed7a94d24163848830463a1088a60c49a7c3fe9579a58ca4277a8a75fa7c4a734c2917a98e540b5405a3699949fb66340b36c449b685a1b03896df118a73213bb404cf6daa413134ae2a5594de4c98789b3f5e93fe9a51395d22f72211429252489673cd7668d8cd48b733a472a2736b82ba3dbaa0757b89debf5883909c82b7ab523e2aa6d0156dc2ac8c9f6352f038e4ff045f7a81a0f026881a3890425180e9742cdd0c6a7129a163338ec0ab2ac4b7d80145053ab101ff05f771568a724cee02741a604c92b53485b617c8ed24ef14a2fc608c882c59d9be5717e444fe347b0cab7b07f4b5d405034c9baacae2c4e844046a95275738966eb87322479043ed7083cb2a60fea71019baf85d3866a5cc3a8b93f09260b5533819aa7b6cf0bcec07181b6659f469533b3419f32129fb33b2e8166aa8d10acb4f035d7e6226d3b096a7383933c0cb6615824885499f79dc06b5e874203c3349b2c3b27b1f1012e52bce9968496c068b6e6c7244722621a1a44349314845b1d8831d9821eca386eb8fc254587be5dc529438485b3fac44af0613732509cf225f5c127a4056cd5e503eb742cf03154511969e7a743834708d71579e9ca4a4e281aeb177ef50cb0db826ddd17873e63a182e3b001f659ea3cc73cfaa5d7d7b5e7e9cdaae04c9944978dfb7ed34248d976190cdc0184930e25c6306312180a0b8758395d1febae95b22e0945c5fe265595a9ae91616cf9f35b588b7a02f66d8d49800c50017c7272bbebcffb10a16a5c8560130d96fb0c241a286ba949620ab83539b83d862ddce2507ec4b4bc4330c27517172b43bdf09a5e6a5fb684166800372663544859acbe07424705809587a08dc50fafabc1b2f9486ca6415266c502f7b998dcc947c7b5f5584cd34cc90a4c385f30a2cc051237c6a85d4a5571305a5182c970b9bc87268484f293464545f4c349e8b2ba3e5b4a5e7c42237c0e6e1b7722b04e3d02a27d0597d7169a49e340a778179a924a1d31c0c3d53bedb46868a62ae17847f130ad1478b8428b09fd71b028f1933803318af78103723ae7e1185801872f847753862f9f72323f980d6ba9744cb6c079341b02443b52e4becca891fffbc6084ab40bd17af7c6b2b21c09c170455c52c4c7093c44aabbb1a0c1d11b12070894f7649112f32a98d976c72291100a3bb4948f928771b063839a94a614227587d1a9bd25479bd8bd06e114894bca10814f0c516e1be41b81ccc6044a8f3654679df531c7220982760aa39a4e982ba3247b009d405c0b50969c694858889b4058089631c57dd1c5fe12acd5b27143d09a2d90c8abd8930d16769aa44a3927967b2975a329bce9599bfb170e02a7994fb90e0b1c7bc7db753c065cacf820b80c6c1d585624c93ff14a26afe6245ad8a6b2c082ec871dd1fb10c3acca1898520647b8ef8c0e45580c87f718eaf18ed4e97ea1516acca657bdfa16493115e6c90eb998cd31e6ca095066bc75057b2b71ac2a75711a7820984ae9306dea825c80f26a1ca6c686189c93550d931a1f73fc3ed0341ea703c033bb463c6260097c54bd17996a82abb0d32010cc53d81b7b7052b86abb6302b57d6a34895d09840b3b6a50c9962dc248edfcb328e94460d3c82819cbab49a79f742a86e85577ec995a025fde616fad52c4f092bd89286297d8a8912294faf7c959ca392cd40989c92b8229ad3ec91d352a6bb7d757d3709c5810b40157cc0fe006bfe843419b8a1d792d00c1505e0a63b39c7c2ca2c96f695426073ebd50283572bace67c01bb7b27b09be59e589bd60acca376a8630034cf87e9d49411648a1b05c329af92cb29942cb2369381c3ef761a02f8c905f963f0b08514a7c1302b4bac9f261fa37855b67250258c003e5bc9ad07035e667bcd6a537f35a0756bb2801a0aca56576d72f3a8c0c2f371e5aa036af3a987bb550ac06980bea73b938ce91715a4b19620a08be52695abcb3c833eca2824b60de483810857aba0a9292911c4167159b023989d061ba81c94df979917c72c8eaae518ab0e46ab8927b5b9db690bac6720667baf711a73952b033abaa59d5c4ccf676007044e26c2bb31b5aa2095f2da9724570cb04174e9ac174216c1390a687c60b6c396aa48ef849d19234f36886205b0b28250e7803502565523d0cc0bffb78efe64dc758cf3c93bef42103694b434c4819f82bbc42ab45ad827287a560ee43600b87443d8bc91ac5b15fab2701f05577c32678e06790808d4a6965c30a0915ac8fc7950b274c428a43650003beee2726bd31a09de14e892b54c2605269b8c22f146afe669dc9c4775d200aa9534af5612ea736b01543788b13c3fba608ae90aac0da9335e6c115fbb1d67938b86849d5087a87f3437ea29d7b899144fc3e739a4c079628597c618b554468f56cc6745ff6500d3118c55a8171e42b67ca43ca32135672b22286f78d0485b363d63a2ec737d2aa98ae602d3c485814d2c195db5d7bea8b3ae5470ff7a1e8225f82d565414c6b59379cc5b26155f682f6098795c52e3e8acfed87743737c1bee0ba875a95e9509d89f3667d741cb3aaa989378a2425a0e5f218c02763de4345a208c5bbe4949a506dcd5b01c5f8f4ec5f5bae6946c95ad7fa4e1e5f80354b5112d882796092029150d5d6211c931f81fc67b2316f99db7f55d799363828f7de74b5e979fd7620c7449132d44f3029e1be4e1c0258c3a22ff5b50b2674cc094ba7018da2a61569845c17d26f + +# Official test vector 19, seed: "822cb47be2266e182f34546924d753a5e3369011047e6950b00bc392f8fec19ea87c26d8021d377df86dc76c24c5f827" +seed: 851ea90fd3854cbf28fe39fb81f68e4b14345cf0d6eee7ec4ce772513df8410d1c0ec046899a777655233e4e1b5ca44e9afbdc67964bfd5d5e3dbb45e60d03cf +public_key: cd22ca9cea98bcd401164c349b35c8b36424f294b11ec7c7d0a3953fec20dbb283ef99a3452496d9b86513e33633765c10b45c6612bfcf590f6036a711eb3dead00067649eedd14491716caed40a3db26d7b00c6e8396858c3916397166d24370b033ee54c3d3b85b5382b1f3f1220325aa2f804bba473cc70b15d443548491416bc1698a5a9c39dea2ba59171f35569ed6946621c1b3647598becbcbbc72a0781c77baa5ba128b1b7053b2de9c122b8790125c50e003a119964aa48392a96b01d7675af541b46b4369b10c38a2c68ee5425c5f6293c2255a19a7cc2607774d342af773a22c3943a9b411bd69a92e1c756993a1a392698a93d5f4772c374b549c15a0bd636be908641a7b8ed758e3c341292598b82a7976f45ae4fb0bc2af0352d92751a6a5e5015444d3b82cef064d32c3bef9b2292571092360e1806b5e5a892586029ab421ed247afff408f7fbc9b5cab930a6896b1250ab1c58ac4231fd6d0bd9b990b649028e4c28e435093b36462e28940fd2723e7bc20e59914e1c812bb3aa912318f15472a64b75c12ba361b2843751611183870a6028496195cd5d219698a89dbcb2c1c06ab2bd5937c1cb5a2da7774bc3facfaa028829f3c3c9bd6c584eec882ccf3ae1b00b1357692ed377f09712a30fbc73f17c0bc462a88e64de262c24e7a7f7c784dbc5b615ad57e58484db23363433a4680126c2eb5b9152c162e3277c0bc4da9693b22daac51a1c6107242b7428ac3f21f2c3968810435f9aabf3c65b7db7b37361218b49b9c76695b53c9a227963ccc1b60d447b3b7d15765bab6b3b73585f26c2f0862c927b6f23624f360a4f6c537b09563adf7a9616a4dba03732c707fed845c35c660b5317ef652055843cbc28ac501dcb493eb5d6bd5c322ea2f2a8b61418b9788482f51b8135f4c1f1173895057ad3218387d527133890fa3a9425d73ce03e1879b85a5b120285b823501487d5c555ed2b7bfac82762b9262d3d4b3b64736497899a768903750bff4a82e6a0097f3c230dba5bcb0ac95006852bf60480d039d1fca9fb758b5562a384160acd9c489a3b4bdbcd96989c57eb7a411ea3540ada882aa567fbb340b518477839925577c780953bafd0cbe2803626b89cf1c3b3056c4bd78c88818211fc836765fe813c7b18e5dc9725978ccd9ea8c7e1710ddeb883ad93e2cc987024b817c30908ab1ba7a658399dc931a4ba4fca5a10398289e9718e906336b148c328c2930b843cd4ca0d4735b633618e8c1c327b29596c24bab053867747883231f11005ed6987679544b51c45d42cc209b7061a91a0c82a92c943c85c149b79c1a190716c03f156d3c22ad27e7b8b87962c8c5421d3b01c7eb2220452b22d813d2180e7a38be15b6976aec7659d25b60d3c780fa75c3654d7f9b6de0d33c8c28c97b6b95bc8c2cb517b497f73a98c41a64f312fff48fcda7b07e86a8136c05720a8740d866bc024ca1e22d43f6470c8a38a7301b3ce74585e6ab8b899b13ea39c163ae79e764e0b846fcd57029a73708091f053212c6f93f1173a854b26d7e49bfae38046e43193b98460d171fb48283e736c7a1651deee6272387cf65ac876feb4292bbbc9200981299c9bff13690d6c2017bbd3e257700a111fefa33072ccc8e952263e4867590c79b558187e3441a930964aa3ec0441e91e7ad198cb6e8959a35051ddd972a43a020d0f968eaa8696b9686dab01b9f9b8095522a7b411d486444b16ac4fee7b245f50ba1a26d81457b802bba966ac8eb300cd92773ca26908a91a2e23b21b0116dfcaaa5f4a57514dc2ad736cc788904c29050389b80cafb0d71b131b567551f6a2e16390c55234e5ad50080ea6268047618b333a49795b4233bd07530a89c275bdabc4ec99d84a812d9e20e2c27072196138386ba42cc4998314905e070ecab69f2d12aa204a32ad28658da3fab69223521b81461312cf88700a49077914af3c28a2f544d608209e24cccfeb46ae13bb90e8b86a4bc85d5f41a9ada7a957ca8763acad6713623ec20e2f199b1270966432bf2b8cacec65776d8a63a471cb4a7c891a01bc92c8c28719c3ff9a8a7a350d9454729d2ce932982e94bbf30b298b3353ca6c459ee5017fcb724ff430a9348b9fb46abc86374b245668ac71096501a7f3313823c5749e01d0e40444111bebc0a6858891224b08cfc8e74c41084fd5c03c102480537 +private_key: 2b8c2ea5542d9e3b90c417523f690109007c5aa97940102ce5ec7bc9bb471726b202d02e4f871062c281d2a095c4cac14d6b9ade99421d2599fb696942f6b74d349bc23a2099f687f1a3b1db3781095615a341862246b29500cf6c3828085c8f72c303ebb9773dd90c37d1001bd70e1ba70ab99cc2440a6d8b841314e84c71718c1ff802897abde7694d49e416090527a600b2ab4578a378b0cd9b52308403ce5c5ad198bcc6dc0b3d5bba010ab9d5c18ca3210111654b47fa504cc2b34ebab1a9e328fb963b22491d5dcb13b5f46b3f43669101483e95aa0bfc83cbfbbc6656269d900138dbc252206fe781b007b3c2a26740643b0b9e6cba3d83a3546b112baa3113fc5ce4e94dce8abb1180564c6cce9583a703da022d20a14489426e6693ba2710aea52761173f5f5379ca711df6972e7264b3c8d2805fb08880a6420eaa1a060476e792562cd3cb8a768d2ba32402b2659330b7970a1ad3782d670486e4e73a6cf47938549a8246991d205f4a4bbb8f977ddb3c8f724110ced267ce681e1240ae0c9674c4e20e4d82194a1bb835e1b56166cac3714e3b42a60092bd746665e253933d6786dfe6b95eb9a98f7c299fa9993d803755e40ef80aa7de893948b5bd65366288a7000c6a5c3b7c5b00d7102ea95f490bcda8d6ab38520c30e231a449a69bec79cfb80dada50739f83a85c624a1458c135875a803041f186fb6c50d2c0b657b59377bd2aeccb343b56a7a5dd2466fd902d5b5bd3cd3557fa31465fa8cf9ccabd05a24ad290988355ee1318789fc81e4d112cc797dc5e087c0ca19d5e8b85c57463f456868eb585a188a27e51858f8cc8c24a9a1b47b38934e07b92529c0722b98ae0c3ba8d7f329e19c0f6e8092acc7c617fa145c37bb477501c1919b26b041aa6641362a480397c5e0441439545deb6b5c47d01539337f523ca078c6543ed9984aac812638a00fe930a07b56e6859a20f0ce54617ee6b8395867319930583309a67530aedf8018b602536d33c98f81b7a7b6a252a00073443c9ff4bdfdd87b3513536d93c908188516749a28a92a410919a2c803196b1e4a533cf8133bf97c2f49fbbb1cd19e2f3838f3d05fc8e5c11cc602ebe5a2a5187ff2a74025a7af16075fdf88374624305c191116c9bf59dccf9fe89e86f007a6e3c0b0dba7333bc4c9733214bb233e05c8a033ae93e85bfbdbafe31260e8f7a5a1abc9da303fadc8697a264012900fd1b713f8da7ac5ca8f2206be63c31c5fe3c6f6188deaa31d89502aac2ac5052b982e3a75b385ad353c9c035c862cd5a6290076c959b11e6a4832793378b9828b0236e016bf6817511dd9a86022cce5182f660013f8b2a036a993c90740a6a5ae2779724a60b872e5bf76c78a6d95997397bf1092b2827924db015caa204bf23710da941e0d3a1a05458ee4386404aa5ec1cbb108925ac4703048a09f37814c78e63fc4b31f2341c559222a6db43d50bc12d8c88962cb7e9149c009414c519721b63970953524009b8be2ba1644c787edfa0d9f9c0eae722037f0546fc96cb333a062206436dc21f6806099bb5fa43879e2d433c9e1be8b073076b1034d062ad0348e6213176960a90b7ab4dea8adb0ba41c73b2c4be4c0a06200e3a975042346b52244ef5334c98189247092a19092e8833ad43096e4b47c50668356ec0bc5ac212e8a1972e40e7029561ad20e33ba29f97cba0e3153b338a09841bb6eab67fce41a86265d6a2899d1b7bf4416ad1ac211f7969914930da09844a2603989998542ea9ec24c0a5d8b01fec38c33e84d51b93c360a4d98d439c593063a3747fb9c2eb16439ab7035490a99793939445ccd33c4aa2974aacb21873a7659a98bb67668ae47548ab98b336e2103323522dcec9b59c80ef0e5c935b697c0ac85da18766b39cc1e8c1319567b9560109c2c2f66a9ae528a889f500e8e11b9d548690750c54ac1785bf998be78cc935bcce9e8185efa9f009791d4a687f131309a0c8d51105d2b650e295abb3ec29f1b421063148638626019525c844974f12a9add84c72e324ea3698bde2b33de8770aa65674f43b861e28e53e54df35040a4a91ac6cc4867635ccb91680d943a4782af82d17c2fc8a3f5eb2af0a1525a29af94d2cf7c8631f95862fce1a401e175de0c3c184072444c10cd22ca9cea98bcd401164c349b35c8b36424f294b11ec7c7d0a3953fec20dbb283ef99a3452496d9b86513e33633765c10b45c6612bfcf590f6036a711eb3dead00067649eedd14491716caed40a3db26d7b00c6e8396858c3916397166d24370b033ee54c3d3b85b5382b1f3f1220325aa2f804bba473cc70b15d443548491416bc1698a5a9c39dea2ba59171f35569ed6946621c1b3647598becbcbbc72a0781c77baa5ba128b1b7053b2de9c122b8790125c50e003a119964aa48392a96b01d7675af541b46b4369b10c38a2c68ee5425c5f6293c2255a19a7cc2607774d342af773a22c3943a9b411bd69a92e1c756993a1a392698a93d5f4772c374b549c15a0bd636be908641a7b8ed758e3c341292598b82a7976f45ae4fb0bc2af0352d92751a6a5e5015444d3b82cef064d32c3bef9b2292571092360e1806b5e5a892586029ab421ed247afff408f7fbc9b5cab930a6896b1250ab1c58ac4231fd6d0bd9b990b649028e4c28e435093b36462e28940fd2723e7bc20e59914e1c812bb3aa912318f15472a64b75c12ba361b2843751611183870a6028496195cd5d219698a89dbcb2c1c06ab2bd5937c1cb5a2da7774bc3facfaa028829f3c3c9bd6c584eec882ccf3ae1b00b1357692ed377f09712a30fbc73f17c0bc462a88e64de262c24e7a7f7c784dbc5b615ad57e58484db23363433a4680126c2eb5b9152c162e3277c0bc4da9693b22daac51a1c6107242b7428ac3f21f2c3968810435f9aabf3c65b7db7b37361218b49b9c76695b53c9a227963ccc1b60d447b3b7d15765bab6b3b73585f26c2f0862c927b6f23624f360a4f6c537b09563adf7a9616a4dba03732c707fed845c35c660b5317ef652055843cbc28ac501dcb493eb5d6bd5c322ea2f2a8b61418b9788482f51b8135f4c1f1173895057ad3218387d527133890fa3a9425d73ce03e1879b85a5b120285b823501487d5c555ed2b7bfac82762b9262d3d4b3b64736497899a768903750bff4a82e6a0097f3c230dba5bcb0ac95006852bf60480d039d1fca9fb758b5562a384160acd9c489a3b4bdbcd96989c57eb7a411ea3540ada882aa567fbb340b518477839925577c780953bafd0cbe2803626b89cf1c3b3056c4bd78c88818211fc836765fe813c7b18e5dc9725978ccd9ea8c7e1710ddeb883ad93e2cc987024b817c30908ab1ba7a658399dc931a4ba4fca5a10398289e9718e906336b148c328c2930b843cd4ca0d4735b633618e8c1c327b29596c24bab053867747883231f11005ed6987679544b51c45d42cc209b7061a91a0c82a92c943c85c149b79c1a190716c03f156d3c22ad27e7b8b87962c8c5421d3b01c7eb2220452b22d813d2180e7a38be15b6976aec7659d25b60d3c780fa75c3654d7f9b6de0d33c8c28c97b6b95bc8c2cb517b497f73a98c41a64f312fff48fcda7b07e86a8136c05720a8740d866bc024ca1e22d43f6470c8a38a7301b3ce74585e6ab8b899b13ea39c163ae79e764e0b846fcd57029a73708091f053212c6f93f1173a854b26d7e49bfae38046e43193b98460d171fb48283e736c7a1651deee6272387cf65ac876feb4292bbbc9200981299c9bff13690d6c2017bbd3e257700a111fefa33072ccc8e952263e4867590c79b558187e3441a930964aa3ec0441e91e7ad198cb6e8959a35051ddd972a43a020d0f968eaa8696b9686dab01b9f9b8095522a7b411d486444b16ac4fee7b245f50ba1a26d81457b802bba966ac8eb300cd92773ca26908a91a2e23b21b0116dfcaaa5f4a57514dc2ad736cc788904c29050389b80cafb0d71b131b567551f6a2e16390c55234e5ad50080ea6268047618b333a49795b4233bd07530a89c275bdabc4ec99d84a812d9e20e2c27072196138386ba42cc4998314905e070ecab69f2d12aa204a32ad28658da3fab69223521b81461312cf88700a49077914af3c28a2f544d608209e24cccfeb46ae13bb90e8b86a4bc85d5f41a9ada7a957ca8763acad6713623ec20e2f199b1270966432bf2b8cacec65776d8a63a471cb4a7c891a01bc92c8c28719c3ff9a8a7a350d9454729d2ce932982e94bbf30b298b3353ca6c459ee5017fcb724ff430a9348b9fb46abc86374b245668ac71096501a7f3313823c5749e01d0e40444111bebc0a6858891224b08cfc8e74c41084fd5c03c102480537c11d5e63a349785e242cc58bf790539d3adf4844176afb3ade1db843a9e6ae9f1c0ec046899a777655233e4e1b5ca44e9afbdc67964bfd5d5e3dbb45e60d03cf + +# Official test vector 20, seed: "81401db81138d6874e91b7c11d59596e4ace543f5a3471b6fb00999221765fec3ca057abe20f03b2d59003375fd71fe8" +seed: d304c9389cc973477f169788abcb9d511f843219d246a9b587822f422a70c2386590a2e5c7ed86cf2c5c2a898662bc9a81418720bbb632ef9cf0b845ed052d73 +public_key: 17a1c1ca6b5b6bdabfebac339a5c121792056c508ff99588d292cbcc1760f1eccbf105281116a623c600e87b4231c2a94689133ca16b6d99796700b917262f4d776d10709a26123a5af9af5ac7455882caa4d220437271aa5c9e30877a3cb263f9048a483a826774c806941939c44274287b629b2bcba56f19e7aab2b8c6a3f72bbdf5820c774c48a151c381a5a75c27337c60c406cc1ae36a3eeb25d91521918a780d75a69f94aa4005771a5c22ed4466811834fbb238e6351fb055a70c32994442297f273752db6f03f445804c0cdb380f838c484c50250bb2c849e308d8f608ed942442e85bae7cadf4c6c3a49cc1cc107ff32154e61a99df1244f8f956c678ac4192aba83b5485f284f1510b816c26d16922412738db9796cf6023e558741c7ca293eb35fdd71f9175b838377fff3050d447a35e208027881406446061686621fab300755a15921be9d24b721a50976884c76ba928405ea9e6b7b357baa68674bf412f66f54a454c03fc2a64b1c1142bc56cc535911efa578c5a097d8301836cc641e078bdf1245e5359a0d7ce3a87012d199880a3ab5d61753488782b9734c26947b6c925e4fa6ca38475905a9f45a88221db62b762b4c884344cfc7d81e55fa34293dbf49e4e8bce0bb95408b32bec404a245c153042a3ebcbbd8598a3f9537e1403319a5cc6a006a37db5a3fc4960ddc5381a1b0b85657d41d085309b47c9e21a0641700a14150a0b3e00823e76c6bad867c6f3e6568eb840b9a9c4f4f45d35e733ae56377b9c2e008b66f9436b59320f3107aa43dc123bc2a89637637dd3a26ab0abf355c0fef642632523611a196e2402ac16c38562a0f8c65b6a0485dee1492ce2494b7230422abb2d705333d4c3f4e10b28d3c4b3266949ca4b95062e3d600caacc77655236181208c0dc4487063ccc528961661dc0e474bdd88faceb2ec448c1ea8a6f14206a33195e30fa4efd463b7f438ecf4ace66090bc268b532b251d783bb380380e12a79ac044bd72c0d9478018d98b6e4e36f234142347b919601521365665ed05111f39698c43f5b62c047f1ba861a91a1e29f6bf1b8ba376280db89feda41195a9564d17c73f4305d73cc6a606530179029e192352a5aa9e58f4df6c0c9d8846da4518192bc360544f734340c9b072cf399806906784073f622ac18c766de49a65df56b6ff99a6e896245c7aa5585723d1c6981a0ad2fc09115b8b8321941961959a8e40b37c24a66125810223dcfbaa093510bf0b9c631e65021d64bae6bbe847c7576826506f73493d19da8d47f07898d179697aec0a1df3cad227cbc83c33c6b72b450731d943041f79136d34c7f039558468c3de1e3021e509a2d898ec1245fa9a966ba457e5894691899521362b7f2d607578b01f230365a84c7ae1ba12ba53c1e216933a34e53e75e252c52087c615fd5ad705743494b10042b033468af0016274df94f2e65048e9a4595a4b541b082bcd96e6d90a44af778077007c069ac9673cb4a559820a2a9992c4500da89f5acc48a6bc9ac1922be9c211f36c468986d0704121193ad5e2732d693c650d867234c9c261525325157fdf94d89eb2da1949a627338c0d07b1cb9cb45d95b64b38a22b029bcb87c928c7c97984d760bb11b9666271aa914d3cbefd723d40928ede94af17516ef7a72c1fa978584111f8b0903c544dd7c81d94a3b8502cc08b21cd89c8fafb94d9eb57f9061a51e9aa6f3860ca3da018dec14d46981062b8ffd542747e7c83cf815989117ac14ba1654be4a92b396b01fab274a082609ed9c685f125fdc4611cc8c00167a8be5f28f0867397da186ae68a29701b4c1885235faa006d45d30b990d13c479fa5b1b76ca2406a46a0c42f9c63cccdd187f5e93b16f20bb86b5251b00842d28e58c86dbca41ad708a62c28846d0c983dd60dc4f5b018017fb1276eaf839a2898a8caec69f11037498c5a621c05cdc5bfc9ac9dde250a7c4c1531b813b3f84e70a43baa43950a9cacf07c9dc6c8b8c4a660aee6ca67159a00010a3414c87fd94ad197856d9940ddb47ad0d8700f635e58408a5af8213fe4636fcc594ee677b3f205e3552202ca8087922402d24ac4f42fdf5c99ba1356f14cbff297192a40b48abb531912b8f853a07bd241b19aa1effa784e5746905449b1e7436a79a28e3f712507e5bc0d026037001723d3443145bd066cebaaa3d000c9f0ca +private_key: 04a39f7840ad6e0c41084136f21609602a0a00cd8e0fe0158c1c3c27845ae6219abcfc95e72814a9776655841e46491a9ee342591133569123d6a09a54a8a253a49af9b27103d196873622ea93bd17da439e88226a333da9c525b856c7ed53593a002007235d84225fca027493168f9748c4384004d873abe1bba69212c7fc4ca89ec745ffac84b99c8707860ef798bc1e7c4f2f0344542054f3c46dc72a6f9d2b9303e6cf114040e136087b66af5fb47ec6a55c11c02acca23f306a7221f3c81470714a472ea822bd387cb29de9ce4bc96655d63e1811c93a740e148c994e149554b24edfcc6b4878c55570971d95576acb6943c6532cb2101b4468cf578a99348634836174792758c350651224a2d22647446f67a056180ab2afa34ba27a76933c9f4f3447c0ac6b605b144a2c9f2c626e8f434b4f35ccf894327c53a7dab9009d5a9a4e7bbf0e6a22d4f120b0c42ae4a7c0ab08774cf8a33e069d4860655cd4bff1940a22314356e8525213c351688b1a725a673918078031ec37080956973266811dd8ca275c9a75fcbb7b9891c26a3e343b36be5273ec946f42f70865bc48d6238ad42b616c11b708d3551d3b9dc61b653e06b1e6709bc115256687af92941b2fdcb99948184b025239c89052765b3d63b476c3a4df499564ec0749a03496040029da776d686dcf9984ac9354c2c69f2c3c8d3d5774201b7ac0254a891871847acca5099f89733fbe2a4979dcbc26f5c38efc5129e083f508441dc6c7eae73b1e7958671767968b180a3b34343cca94289fe0a8788b1cc8394c5710b9ba6fac1cf3147db32c9060a9cf2d056734031190b53ae17917e40907b61826527c277344c8bc475451414e00e3cfa6c15400cd5a6875c7b2820702706566a00460acbe58128e4c869095160fd0dc303ff8ca68a8947e3110c626c707da0344717297147aee5c39838c0f73ea57f70308601ba55e977bbd7b681e0c4c1cab818aa156eab24f74c2b66ffc8959c3617f92941f1c0935d89702c71f4d76c44402ab92310904504ab5f9a002c321b411bead73a819e02d006d8ac368bb89231af85a97bb6b0e23ac2ca869306e9239d808cb24312c48c4624c33537a8092f6e8c147900894f3838db9b0fc9419dffb6e78127e922042fe4a3c20e5c48e478bda52a2bb0a85612024ff5c92801ab1eda82de8aa6442249ade4b6bb9886015035d436a855cb495f6885f6d3084f498affdb17272e127bfc3bacd3831d06c20569b92fa9b90278707c995b2db1b63a423a997e37a244c763394b9b28b3d3538c981da0be1556696a7330fa83882c1b7da6668f1fa5841ea5a984b4f6f4869356682b9652a842859bf079238a83ee3d6b01610270488247c6b5e63cb1e4336773231b6dc6bbe6888345a0ab5cd27091442786f2313c16bab398356f1899554c69c4fc09c9a720fdd8bb1de03c80e5241d25559fd7568b321cbffec8f619403662a61c696ad90346bac979a7e446e41d5582acbb5e0f70aecc4330a550854e60eeb5290198825a1f01915bb094f10bc0bc29572430bf8cb8938a4c182698557ca49ba9b7494419640792c3fb31cce70aa2ed24830b65efb3218052c539f2539dca01532513717c7bc552179957671275327ff44a79a49b92f343a533baee4e06caff23d7857ca540a78f886be136b3506bb080ef563e8a3987c083b4b5cbef410ab20213af7807d3c52c58c852dd48c4060587ccf259f00f40816ea86edd276d1135eec70b990e5c11e97c470d97ce45a3a105a9da1ca768166c86c41474be92535f1bcf7539d09598e773aadf39a5b66ec79b360699e953bb0babde4f0c707b99ce6f5075217a054407072b084b7546bfa95ccedf1666746bfe74c674fdbc80edc35b4769f5fe08632aba9b5398e79dc45ad014a8ab539c157b672eb74757c6632e6c922202590a27dd1c82527a36287e2ab7a327a264abd300634226149513980b9dbca957c1560a6c32a20328b6926c843b53c635719f635edd90f3c5313ee1766563a7a9ab6b011462558b229fb913179a438f3b5b2f427adfbeb90f73a2ceb190cc6dc713b83afbd12a54b0c170cf973367b11db2cb3e5d880c169041732a276b93056e4632deb8606c276a0897116a0829482bbeec870f18c247309759971c4e1702117a1c1ca6b5b6bdabfebac339a5c121792056c508ff99588d292cbcc1760f1eccbf105281116a623c600e87b4231c2a94689133ca16b6d99796700b917262f4d776d10709a26123a5af9af5ac7455882caa4d220437271aa5c9e30877a3cb263f9048a483a826774c806941939c44274287b629b2bcba56f19e7aab2b8c6a3f72bbdf5820c774c48a151c381a5a75c27337c60c406cc1ae36a3eeb25d91521918a780d75a69f94aa4005771a5c22ed4466811834fbb238e6351fb055a70c32994442297f273752db6f03f445804c0cdb380f838c484c50250bb2c849e308d8f608ed942442e85bae7cadf4c6c3a49cc1cc107ff32154e61a99df1244f8f956c678ac4192aba83b5485f284f1510b816c26d16922412738db9796cf6023e558741c7ca293eb35fdd71f9175b838377fff3050d447a35e208027881406446061686621fab300755a15921be9d24b721a50976884c76ba928405ea9e6b7b357baa68674bf412f66f54a454c03fc2a64b1c1142bc56cc535911efa578c5a097d8301836cc641e078bdf1245e5359a0d7ce3a87012d199880a3ab5d61753488782b9734c26947b6c925e4fa6ca38475905a9f45a88221db62b762b4c884344cfc7d81e55fa34293dbf49e4e8bce0bb95408b32bec404a245c153042a3ebcbbd8598a3f9537e1403319a5cc6a006a37db5a3fc4960ddc5381a1b0b85657d41d085309b47c9e21a0641700a14150a0b3e00823e76c6bad867c6f3e6568eb840b9a9c4f4f45d35e733ae56377b9c2e008b66f9436b59320f3107aa43dc123bc2a89637637dd3a26ab0abf355c0fef642632523611a196e2402ac16c38562a0f8c65b6a0485dee1492ce2494b7230422abb2d705333d4c3f4e10b28d3c4b3266949ca4b95062e3d600caacc77655236181208c0dc4487063ccc528961661dc0e474bdd88faceb2ec448c1ea8a6f14206a33195e30fa4efd463b7f438ecf4ace66090bc268b532b251d783bb380380e12a79ac044bd72c0d9478018d98b6e4e36f234142347b919601521365665ed05111f39698c43f5b62c047f1ba861a91a1e29f6bf1b8ba376280db89feda41195a9564d17c73f4305d73cc6a606530179029e192352a5aa9e58f4df6c0c9d8846da4518192bc360544f734340c9b072cf399806906784073f622ac18c766de49a65df56b6ff99a6e896245c7aa5585723d1c6981a0ad2fc09115b8b8321941961959a8e40b37c24a66125810223dcfbaa093510bf0b9c631e65021d64bae6bbe847c7576826506f73493d19da8d47f07898d179697aec0a1df3cad227cbc83c33c6b72b450731d943041f79136d34c7f039558468c3de1e3021e509a2d898ec1245fa9a966ba457e5894691899521362b7f2d607578b01f230365a84c7ae1ba12ba53c1e216933a34e53e75e252c52087c615fd5ad705743494b10042b033468af0016274df94f2e65048e9a4595a4b541b082bcd96e6d90a44af778077007c069ac9673cb4a559820a2a9992c4500da89f5acc48a6bc9ac1922be9c211f36c468986d0704121193ad5e2732d693c650d867234c9c261525325157fdf94d89eb2da1949a627338c0d07b1cb9cb45d95b64b38a22b029bcb87c928c7c97984d760bb11b9666271aa914d3cbefd723d40928ede94af17516ef7a72c1fa978584111f8b0903c544dd7c81d94a3b8502cc08b21cd89c8fafb94d9eb57f9061a51e9aa6f3860ca3da018dec14d46981062b8ffd542747e7c83cf815989117ac14ba1654be4a92b396b01fab274a082609ed9c685f125fdc4611cc8c00167a8be5f28f0867397da186ae68a29701b4c1885235faa006d45d30b990d13c479fa5b1b76ca2406a46a0c42f9c63cccdd187f5e93b16f20bb86b5251b00842d28e58c86dbca41ad708a62c28846d0c983dd60dc4f5b018017fb1276eaf839a2898a8caec69f11037498c5a621c05cdc5bfc9ac9dde250a7c4c1531b813b3f84e70a43baa43950a9cacf07c9dc6c8b8c4a660aee6ca67159a00010a3414c87fd94ad197856d9940ddb47ad0d8700f635e58408a5af8213fe4636fcc594ee677b3f205e3552202ca8087922402d24ac4f42fdf5c99ba1356f14cbff297192a40b48abb531912b8f853a07bd241b19aa1effa784e5746905449b1e7436a79a28e3f712507e5bc0d026037001723d3443145bd066cebaaa3d000c9f0ca5955b9c5a4f2ca172535d5a32ef67d54f334bf726829082485a7b83d43b46b236590a2e5c7ed86cf2c5c2a898662bc9a81418720bbb632ef9cf0b845ed052d73 + +# Official test vector 21, seed: "30b5de5b73681ec08aaa03f6f2d2169525d25f4042a5e3695a20a52ca54927b85f8bb948fc21df7defc3910b28674994" +seed: 89a6e3be304a3518fb82b18ca730f0b359cd6ba90664a493fb4f8edaf965b9c3b6591121e25d64010c25a18676033e1d7278ac5f2d0b43a31f3a4156ae710465 +public_key: 9ea32a494182483627849169e2006e9306448025229ed2c14ff825a43976935a8a14b8448d6c4db642a1726823a2053f4f75951b80b47056bdae61ab68402d4aea6ead635f2262082d71c4ff5c78e6a6345a72505e23064dd773118ac985e49e4d88c64dd894322b0d2a712f0cccbb506436c3f0bed765ad0b193ea520580be4c12cd65f2406cbe1fc9281d37bed1988d7488f3925244454b82982c49fb522a2f83a7d131d1cc65cfc7179f8a043da781959a815b5e45f6e0b37269c84237424fcabbf4dc16a722cb171984e48864ef70c0fe14c69ee385f15eb7191249bbe3a3888c50fcde9302ac5aac6105503589b3748938eab5614d626c6a301599b623ada44f432bb18e359c7b223414a34945786468628c6579f9b004185cb7590e22f94e83de26c6a9b69702f704041da3ffbc8ce5fc2367a3a97c4b997bb06a01b8964a8534e2f713c289a0dc8c072dfe4a42f305785a99c0dc898d3104e0dcc62c0e600253c218f0511fcd94bf78497b03a08efea8bf7fc0e45d3545df2c6d708435414bc00e64c76a523bc0ac823fb56da247da4643fd9063748b23128c6ce4316bdcad4bafbca77b8ea6c10e54ad063a1433333252311f68c676ebac53aca8fd70b9404c1cf3c979ca0c492198a2f92294ee5ab4a2ed15100f20e5eb948916ca7bac7b28fdc904ab1911afc19a454af45e6a265a726340291bac80cee679e009c02254a6c6130227464b2fbf2a95661bed8b348ae9c759fa53a4b429c0b536fd6bc85d5c96233f90ca3057839a47b068855283487c90a8088e271a3e33f5ae5695d044c4d14ae8440bf03b318549600e39cb9d9d58ea2d2a5e3d08a11484801b8167d4c5afc20c56bf970a230231da8372eab0f5266686b4a3da0ccc6b57cc81aa29053142cf0f35cf0c83282893c25983ca06606cf255cc1b41add5947ff9322a4c23bee47cc49656a8581ab5a99a3797798ea77a1db18c39acc97e6342b8770550212718856398878900d6cc9a5963a71432e5678a12ce86257b0b32ee751eb181fff62ad98443f7d79cc4f85bbc67190a68504a24a3166c588ac7b40fed53318b8b452d1a738e59a2c82442feb013f9b2429b6c603f71619f386118327eaf0c13ea30fd620222af064c61aa8d9801d53192c61575e3448b265ea9987bcc84ca825943a4d51a9cbb5e76e4fe88cb6d92215f60b0941c46b89a746cc96c74cba7b097bfcf27533a46fcd928f49d670f85179e6b598ec595cf39c3554eb5f93ab9707d4a559069d24a4005cf28bfeab0bead80363ac608965141e252de510562ccb5fdf94c30da1247ddc4c80554d879b62d0b49eb3b21ebad10a50794545577be4eab070d30365dc9c34eaad1163b251b223e8ba45dcb77dcbab0a07fa635d8b841179a354304e0d249dde2319d85cb724245877a549ccd8230fac8721d82e8a2182e5cb63285ca8a0d049cc7160d7116d5c1c0127a9ae5fc808eee88e340a57a80964b21a353b08bd35da0dc1d7020d6cbe43f49547686546391d94b9a2b2d63b23fb2fb8c30f7ac371b3a80aae0470d93b610ba1681af1be2871a49419a23610843bf940804483dea0ad8d609500d8aa2426cbf0ca5aa353668a7151bb54c7c4e4ae3354c598cbac6e90949cf6b79a941c541c652351306f810494dc0ae743cedba7904d34c2e0b32b603606e33156bc750bbc477313219a97e184d695c701b2009aab8806709b8d376b9cb6a24f3b6d0a4157398c740d08809328aed069a52fe77cd68b9dac62cebe3649cd1b139fa84f6a2333ab702a30414425f50e25e41bfe9a2e277869e17c035652237889c37e3c86cde41c7585776d14682f3c0309a09c1ed43609b5b82e03508869a7f6b627c3710c58198ebe9100f433ac0df22d03934c1eaa10aa98b88c879fee60596a3ab29739b613ab741ad4518e6ba5edec190678b20e6544f469791c64629657b9b1c51eff1616e29a1b3bc25a55cc9c481995bbe68abbc383dcc02e4c8208ccfb57e052ae86017dfebcbd2165810151538e7a9af3a4c5364c02208428d2b98890923b7bb92d66a2907b5376906a61115c979d4b34670a91339008bb466928b30e807cbecb307becd228657bae78f5869c3463d1b73e09aa7f6274c7fd2a3a9cdb4160da310254462eba30dcdbb5c30542463266d790d0fd79c3c76f5da348753312e4949ff2955212edc46dfcf9e6c37a +private_key: 93ab695549515d75a2caf8a97b8974e75407d5e56416d3a3010c304c99aa39d468bdab9dab3b87db1c27a2b831ea3595d371039345c37a892328287cf39255619494927828d95a7139871eb99496755ab3b689969e907cedb05a97c7976a31683f329fe0237798f9387d5ba11870cf6dd01668ea8d0a74c0aea46e13697dcc9846b1a8a9f2bc5304378154bc7cf8ec2df7f070ff06b085239589b1a7ffd13f9653a821767a36a8294fd59793abbb833b09d6e09e71b9062dd3055cc9a04fa0b8e6d41ae10001c18a398ed85bf31218532271332c73cea3862867081a8b2c610b1785412be3f42ea64917d3ca6779ab6581809d5f0412f579019a35c6ab21a4f9142f9d2a4b0c731ab447a002c7029b490ad5c1372eb6483a205fedda376ff1b432430e1738b7ab9531bcd48b4da54f4d3a96a00c718fc809303c50d1042b7e49457c9512e4f66e6b75415fa1bb6b23a1edec751c60aa619473b9c489d6c5c4935380dcb67ff7f59d03a33881b60818a12639386db06c6ee6313f98bb8c1163b2c8526744b560f1d7c672250258288a78761c99a8aee292a6b0b48b80d2495684891a28bf0c226de929b8229289f3e290d21a450901659c404e0b9c25a55c7dc39bbe070203c85cb3e9708071f6cb9e9045cf460939f29c321583f8695ab709ae11721924282afbf225cc54ad87c13c56733a21294beca82d8472363a2308a41163c2d60b7c3b42fe1b74c93a6a5146418e58697d3344006aa576d6300728440ffa0a6166514539bcc908cd1b3ba889d9ae234316a8d7709a7156635412f0eb33451942dcdb77aa9b4e29d1ae41b586ca960660e08672accafd847ff9289035e10e05f0c35d5b1a9278615105533c98ca6b1b930f207c5ac3380f2933e834b4e45983a92a1af994bc51ea5ec3e38389d2559275ca3bcc4d7c50585cea9fd145bf284262d458badd032f294050e01422fbe34c0501815008205ec4a8d43006674788a8d3a64c57470c953ecfe789fb3224efd84d4a40c921852056a8cdf43976648429729386e663397f475900655be634aab9344610fc6322a28d859b5214395172468a15570a171096c5401175fbcb0db8ccccc16e5e6b82f7732c2c47ae7d15738d650189b3702d859ee43bb0a0650fa0cc823761bee4a40877727eed58815a64c38a94b7de743688156a18368f7fa9a83064cdb972b762a97ba0bc61bd45650478661819ba109947a9327d1e54b1bee845e6e54efbb51c9f2cb38ae825286c4a1a872d4a0629ad00574d60569d6106063ac54380ba3cda463d41736535b631a3245f6360860b4d75fa153743203ea0846ce423bab1095ba148a18c2ff75222bfb295ee904cc83bcc89d44a82558753e096da4964346470c920499faa392a3c7258c5b17a770b50906c6518239d81301de60bd5522e1168a16801683ea09ab8d083c0250eb1413123164f95a36a5c053e706327c49ba727f00a6000c35db64c01f92f4a746cfc76c9d0b7810e559f9b12b0370075e42153c7f66bd5b79c94f4c80cb0226be6924f1a29a707007d998ad9a1aa5eb7176879b2ff476918732d1a810d456168ef86467f1aae56a673e40921d48440914568c3c98e33f5835952517d6ccfc0206c2cbbb79a43a428a4858bc5200b5735d7809de666ce5e124169b7acc44a3e6b1838d497873aa48b66893fce45c252813ad2e3b68c1c27ea4237841108218b8d7bbb8733ba43c6f6b2c7818b74fbb41e238ba1f5c1c5db2ef8bb80f2456f228592e952caddf6bcac9c362a031bdb4b7f422573cb772115f385b830ca6fa368ac3920e43b5ab283989b3c719e295867539047d4420f71a2ec046f031a43ff738ce87b67ec19c4f284cb1c1cb07938348f17332bea4dfb4c4417d7a30275460e498784f50d6af7920a78a69e070d2786036e3145e1d7a503f188e81b42a8fa8658e30a8701341bc9b7278601951b2caab4997dbcc7c8c15c00611cebd801b2b3b3155433240c6a8481a9eaf0b34f6750bf6c974962210f69a4022471a4c72fcaac2dffc4c603b6b4fd6b4d7806c0c275585eea28b8f010a1d48506b1516872b70c43b6576544b9a19644fc1d00a7bf9a59a51afa318818819dd8b1498bc1fc913b55c573b39633343c2691f6a8af8b65ad05559e1721ddaa391415979ea32a494182483627849169e2006e9306448025229ed2c14ff825a43976935a8a14b8448d6c4db642a1726823a2053f4f75951b80b47056bdae61ab68402d4aea6ead635f2262082d71c4ff5c78e6a6345a72505e23064dd773118ac985e49e4d88c64dd894322b0d2a712f0cccbb506436c3f0bed765ad0b193ea520580be4c12cd65f2406cbe1fc9281d37bed1988d7488f3925244454b82982c49fb522a2f83a7d131d1cc65cfc7179f8a043da781959a815b5e45f6e0b37269c84237424fcabbf4dc16a722cb171984e48864ef70c0fe14c69ee385f15eb7191249bbe3a3888c50fcde9302ac5aac6105503589b3748938eab5614d626c6a301599b623ada44f432bb18e359c7b223414a34945786468628c6579f9b004185cb7590e22f94e83de26c6a9b69702f704041da3ffbc8ce5fc2367a3a97c4b997bb06a01b8964a8534e2f713c289a0dc8c072dfe4a42f305785a99c0dc898d3104e0dcc62c0e600253c218f0511fcd94bf78497b03a08efea8bf7fc0e45d3545df2c6d708435414bc00e64c76a523bc0ac823fb56da247da4643fd9063748b23128c6ce4316bdcad4bafbca77b8ea6c10e54ad063a1433333252311f68c676ebac53aca8fd70b9404c1cf3c979ca0c492198a2f92294ee5ab4a2ed15100f20e5eb948916ca7bac7b28fdc904ab1911afc19a454af45e6a265a726340291bac80cee679e009c02254a6c6130227464b2fbf2a95661bed8b348ae9c759fa53a4b429c0b536fd6bc85d5c96233f90ca3057839a47b068855283487c90a8088e271a3e33f5ae5695d044c4d14ae8440bf03b318549600e39cb9d9d58ea2d2a5e3d08a11484801b8167d4c5afc20c56bf970a230231da8372eab0f5266686b4a3da0ccc6b57cc81aa29053142cf0f35cf0c83282893c25983ca06606cf255cc1b41add5947ff9322a4c23bee47cc49656a8581ab5a99a3797798ea77a1db18c39acc97e6342b8770550212718856398878900d6cc9a5963a71432e5678a12ce86257b0b32ee751eb181fff62ad98443f7d79cc4f85bbc67190a68504a24a3166c588ac7b40fed53318b8b452d1a738e59a2c82442feb013f9b2429b6c603f71619f386118327eaf0c13ea30fd620222af064c61aa8d9801d53192c61575e3448b265ea9987bcc84ca825943a4d51a9cbb5e76e4fe88cb6d92215f60b0941c46b89a746cc96c74cba7b097bfcf27533a46fcd928f49d670f85179e6b598ec595cf39c3554eb5f93ab9707d4a559069d24a4005cf28bfeab0bead80363ac608965141e252de510562ccb5fdf94c30da1247ddc4c80554d879b62d0b49eb3b21ebad10a50794545577be4eab070d30365dc9c34eaad1163b251b223e8ba45dcb77dcbab0a07fa635d8b841179a354304e0d249dde2319d85cb724245877a549ccd8230fac8721d82e8a2182e5cb63285ca8a0d049cc7160d7116d5c1c0127a9ae5fc808eee88e340a57a80964b21a353b08bd35da0dc1d7020d6cbe43f49547686546391d94b9a2b2d63b23fb2fb8c30f7ac371b3a80aae0470d93b610ba1681af1be2871a49419a23610843bf940804483dea0ad8d609500d8aa2426cbf0ca5aa353668a7151bb54c7c4e4ae3354c598cbac6e90949cf6b79a941c541c652351306f810494dc0ae743cedba7904d34c2e0b32b603606e33156bc750bbc477313219a97e184d695c701b2009aab8806709b8d376b9cb6a24f3b6d0a4157398c740d08809328aed069a52fe77cd68b9dac62cebe3649cd1b139fa84f6a2333ab702a30414425f50e25e41bfe9a2e277869e17c035652237889c37e3c86cde41c7585776d14682f3c0309a09c1ed43609b5b82e03508869a7f6b627c3710c58198ebe9100f433ac0df22d03934c1eaa10aa98b88c879fee60596a3ab29739b613ab741ad4518e6ba5edec190678b20e6544f469791c64629657b9b1c51eff1616e29a1b3bc25a55cc9c481995bbe68abbc383dcc02e4c8208ccfb57e052ae86017dfebcbd2165810151538e7a9af3a4c5364c02208428d2b98890923b7bb92d66a2907b5376906a61115c979d4b34670a91339008bb466928b30e807cbecb307becd228657bae78f5869c3463d1b73e09aa7f6274c7fd2a3a9cdb4160da310254462eba30dcdbb5c30542463266d790d0fd79c3c76f5da348753312e4949ff2955212edc46dfcf9e6c37a1f40abf556c865cd096c702d21239de7c22713d70626f1a3a4c4cfbdf3faca62b6591121e25d64010c25a18676033e1d7278ac5f2d0b43a31f3a4156ae710465 + +# Official test vector 22, seed: "e335df8fc0d890588c3e305ac92c7160ff199e07c85760a828933750e3fed8c83b0dbe802234481ecf890a32d7a2884f" +seed: d569b935ce015c85f792f8f7fb0d83c4f53b492959361dd4f75fb764d656450176eae84d11c4528382828f7a689a0d5cff87b8ca0bba97feacb39b935a8788cb +public_key: a1f055f88cc36236016d4809e5d9096762571c15863924797872cdd77370917720776b8ea9b72189f237e9d710da6906ae25331b9c82ca0ca257dc980ccaa23ee61ce1e681ae09aecf967c33505f83078bda132d1ad623373252b72109f6e6b8f5481dbe89b6033558b90a70d3866930a3c78e024b268604c8b3beca583b8b531a4a6c094591bf173107025ba079c3062a607e30647308987084341925531076ba04e03c8dcbf551b56885c383a5929a54c207b39e162348f7a7fb375f38896e7c1c6641b56557f52f4da23320252aeb382082b8560cdb83c34614c40b8e4dc4ce54b4c009d9c3cd6884c11c616520ae0d220e2cd03a869147ffa894d5b02c75007bb09b51c8f59a53eac1af1a0195623217b578bf4c3bf59459fe3c9ca7b677155436336176a99653fe677d0d9bcb266b2e5484a72bf8a86f1b250b5666e40083bd24cf578c4f9386bce2f034d2e9347835632a1ab39726c2f467a864f5863c0b498491111221bb2e83386da51c764b8597e2b503a21eeedaa6350683aa82659fa276d9b8ad3875a019ea6a00b31193c9284832c581555d7c478f81e259150c41e8c23047eb0599647ca403a7f19273a765c439535efb20a6861a1b7fcba48927412af6c9364670e2e44c6c630a930b9437529f0afa7534a08b7606a512fb737a50b6a08c637087314da4bbd76c35a312c091fa3a863a3b8c7874501c8a9233212e592c828829800c9d174cca70761bf8188ff5585fe1d59905373420120848f22ce8d4bb8ea253d3499e0ae59b526555a2245eb0fb0ba2a38cda009a31f89bb46851a4277b808018e8f23148789b8ec69d8c622247e207d2e08491a3945a60aabdb7b5cbd260a348818c8493159199717bbe5305a5c785c4eeb26dad73c76a04bb28b740d2a761c8c02096e0b6dd297485725ec59b107086bc40e71f61b90ba596cc905b564cd33d76e2b1624bc3a2e75440474daa778b79f3819d237a41d08d9260226e63231b5494da150093566f31cc3a53f581880512c25826a7981241f4c90ee3b3eda1c277b5c157226342fb7e3622b0665109fb7342d13a96e3eab49c53074b76b3a2aa26c899bd86c8a26159ca278c034e323475a0b12f447df223aef827597eb5422bf26cd48b6a40b40200898430ccbe1a6b8ee1635c761623a956b270dac22e3a24fbbc8cb62710a197110491aaf8b89575d68b530530cb2380a5e65cdcc044b52a922b346e50005da16b8c2189525950a109f74b225213c28113bc793857e9c384914809cac7c8ec5667a34b007c7eec63ae9ec21a46497b6b836cac1c451b03814b7c47554a9e6039842418468fd5860ed6cb13311c638b86680ba1628ca09afc406d944cb0ac11b928899cf333ab54be5796a6e0db7cb2b2c8c9b9ae6f300a3d508eedd292c77c589c6682e2509b8d712c6b41669a5b5363fa06f6bbc0bd272abf0c423e0c719ba90cff3b0dc2c390e30b46b38281864b5d8bc2ab339c48bd9cc8fe70067358722cfabff6bc907a457f84b1bcbd6c765ada9b5c684d290c53614123a02660ffa22ffaf602111b7612862d2d204c65e82dc232798982652ea51a362743bea629a8324f76b693124b2c3772111c627e9db55c49fb7ae4204222d850311ca5d99213173416df4bbe68b6b6fb514dd4b821bda1b50f5587b7bb254a65a2d9e6a2c5baa0e71b0be88199096c516f84a20f38a9d32520a0064e955697008a9bccb6524ee56825bcbb776092c99a040b85c2e6e1669f08932f63635f1c37e989a4f8b2190c335e31a03aa06a755022c895485780bc90a969c834091f2cc64960d399ee65359ac245201b948bc2827943a06165255b0492a7236e7b69b66847824d8873a24b6267acadacf330f306652dc766df9269ef911068b50dcb199996a294b8f935df477f00b99882a5a5fa8147023737592a2d797358bda228bd62440fb0c3811b73ca1c8fe4e1c070498b11bc816da770bd895a96338fd9a6659ffb88df51719bf3a4b208647063cf9ec985ec087fa643608e0aa23ce7749ee3c7983783992961a409729a1c6f416a0a0a5659e8320f95277ccdd31de6fa3e41ac9de3293e3ab36971842d6f8b2ffa9a26de29b0c1a26815362a657a5571fc378425b23089bb94016ab2e180888226d1f7b448749280b978958198cbc626539abaa520f4c1ffed3ecd10dca6a4d6edfa0952d6e2785cbddb +private_key: ea4c84806ab1066a1665a830346b85ab6b9494364f2d46661cd97115948228557cbf7a541f34899cec8cf1a3c57c913d6eb713d3022b13c7c15ea35158b043b9829c0516c5ba44327ca81de2313aedd1a3e9a5c07ab07bfbab2686b9a33010a85382094e1c9c400714839ac2a2422ca6e10a96f70c8edb8ffab42562e7598d501168d919a6475e619a87a4c0790131684f3c8320466e002d619ae828324c163cc32a56a55afea2bd51625186784db007673f1314efcca127a90b53893901d4253ac3625ba543a4b875ed322b2c510a9522403fa08bdee8814492112da917c1548e93ac360bd651f311ba8d675eebda8e78b6a0e5d4c314d89100b58a4fe6af99979bf58b8b2a88229a53c73be55ecfe26c48dcb4ed005680505caf570998341eff71864ee44d030262f3bc1346e44795d24cbe346a9f7871ffc71fbe0c9f03c925fc9904abc4a58bda6ef7d408b21a145e544e7f28758223c1b2636ebe2647abc39b076c8903426eda5359c58b22be15c1f2405caf641029f6810789b5c150525db917bb8b82ef217f1b726dbb3a1589445e4fa472da00b3ed673b8a95104e9039e1248e14137fee3a34c0daa6b937af71b75337694394a7c180191b1137a92cd71a588ab5969694956369ee85a139dc552151ab48068147047b0d0a8f8a0a3373c60732fc0790d488784a58e07b0180b1a5f322a5c7609ba0759db31ac35431736564724a53cdec4cab8155229a7036524acc08b8b9069b53e497195f656b581a037d8309ef072a2810a5762a05f759bebb7a27dcc0ad3e4824cd2781a6a2431e8badd79902e8e492e40a9253e758100a19c17246409444f3b4bffd2442ae86c544061fdb5971a0e0a1bdea4942a8c4ad11571ee9460a539b8f49327db237e2c5b95b371b2259138f68252aa5cd95d3c2bcf410e9201e71641d62ec9c9896a86d643505c8b99a625a8d19c6c4e0a94b816b910156b7f125c14cac14498c643c8635d8b49962019f0a885b4a91836ba9cb16142ad712fc5c99137a2afe2195e27a006f9b6be6d67fa9eb00c9741847c1bb228036330999120870562487fe8843a967b362e1659c8337bba05108741340e38057f351a4605388874561f99db1c696b23b45f96a48377a18acfb4d7200b7cb65b6fd0672671259f9337579424ceb2315336919a84965ff1bb9cc92622adb3b8a991768b72d07c93898d815e4f49e8cc0500e64bb37bac3c4613b6d4badc656530955b9f3984c7b1a97d09c75242c169e9886a8e543c58812f4829778fa9cb20706dc84a4b5226786950db1337061b79ccb78c4f520b232db36aa599c1e800956a28f2e0b05e3ba11e1432c89713a4be993cfa552f1c11d0cb8b3fcf2525e30c2aab210ea488871430bfb2528858053ba499df337b8853959a10504c124569086cccb069b97a1b782150542e184e210a24c0b5447487ad5a8c291c5c8a9b3b9b701c13d7114e337231959b7c18b2631fcaa40e841ce72b633279e57a38e2ff26eaed13af3f061595b679cb0c886304d874392b31173c89889615ba9676320d917424b608b057974d18c1806bcad1d955b48420f927c6715641e6e867f073968a23a5751a799b08b2e1d30c8894634968b6450c48b7a4ba3894628697960efb753d2540b6b4432a6b59c92ec3398e9c0c476173843ce80c626df72b18ff7424c923fb0db28a8b1903bd19b963acbe1fb6f3fb27180490e82c97592d41abbe486128cb57999816a97c050ebbc4781a672d07acd13415f036b26763365ca756a7c13db0b1f46fa23f591bc5a5b527e72136368bb85bc52f0916f921b2ff3c96ee0759a00f230d8b141a8c532f037770422a95a495b3087013393694d496a0a4241e8d62547178e2ef3663e211ff7bb213bb69555b25e91cb7b34039b6995c8bb91a1e31937af23b09410cf9f583a76e04948c7c3d341c75a30aa670707ef83793537392917a0c2195013b54c0a8b3e4686c10d25239a03c3ed28c916f40d3809068c542eb8e0a321bab4ae0011273190bb1136d5852abaf8bf82156f2ec402725503b8849daaa9bf266490da991a56a30fe3c089cee7ac241bc1528a0129cb8ea22b1c90023c9d1cb4bb04268b60cfeeb8071e4b8d6b52798c3b960cd87bdc66ad467649d0a835b5153bf2ec57f12b93a1f055f88cc36236016d4809e5d9096762571c15863924797872cdd77370917720776b8ea9b72189f237e9d710da6906ae25331b9c82ca0ca257dc980ccaa23ee61ce1e681ae09aecf967c33505f83078bda132d1ad623373252b72109f6e6b8f5481dbe89b6033558b90a70d3866930a3c78e024b268604c8b3beca583b8b531a4a6c094591bf173107025ba079c3062a607e30647308987084341925531076ba04e03c8dcbf551b56885c383a5929a54c207b39e162348f7a7fb375f38896e7c1c6641b56557f52f4da23320252aeb382082b8560cdb83c34614c40b8e4dc4ce54b4c009d9c3cd6884c11c616520ae0d220e2cd03a869147ffa894d5b02c75007bb09b51c8f59a53eac1af1a0195623217b578bf4c3bf59459fe3c9ca7b677155436336176a99653fe677d0d9bcb266b2e5484a72bf8a86f1b250b5666e40083bd24cf578c4f9386bce2f034d2e9347835632a1ab39726c2f467a864f5863c0b498491111221bb2e83386da51c764b8597e2b503a21eeedaa6350683aa82659fa276d9b8ad3875a019ea6a00b31193c9284832c581555d7c478f81e259150c41e8c23047eb0599647ca403a7f19273a765c439535efb20a6861a1b7fcba48927412af6c9364670e2e44c6c630a930b9437529f0afa7534a08b7606a512fb737a50b6a08c637087314da4bbd76c35a312c091fa3a863a3b8c7874501c8a9233212e592c828829800c9d174cca70761bf8188ff5585fe1d59905373420120848f22ce8d4bb8ea253d3499e0ae59b526555a2245eb0fb0ba2a38cda009a31f89bb46851a4277b808018e8f23148789b8ec69d8c622247e207d2e08491a3945a60aabdb7b5cbd260a348818c8493159199717bbe5305a5c785c4eeb26dad73c76a04bb28b740d2a761c8c02096e0b6dd297485725ec59b107086bc40e71f61b90ba596cc905b564cd33d76e2b1624bc3a2e75440474daa778b79f3819d237a41d08d9260226e63231b5494da150093566f31cc3a53f581880512c25826a7981241f4c90ee3b3eda1c277b5c157226342fb7e3622b0665109fb7342d13a96e3eab49c53074b76b3a2aa26c899bd86c8a26159ca278c034e323475a0b12f447df223aef827597eb5422bf26cd48b6a40b40200898430ccbe1a6b8ee1635c761623a956b270dac22e3a24fbbc8cb62710a197110491aaf8b89575d68b530530cb2380a5e65cdcc044b52a922b346e50005da16b8c2189525950a109f74b225213c28113bc793857e9c384914809cac7c8ec5667a34b007c7eec63ae9ec21a46497b6b836cac1c451b03814b7c47554a9e6039842418468fd5860ed6cb13311c638b86680ba1628ca09afc406d944cb0ac11b928899cf333ab54be5796a6e0db7cb2b2c8c9b9ae6f300a3d508eedd292c77c589c6682e2509b8d712c6b41669a5b5363fa06f6bbc0bd272abf0c423e0c719ba90cff3b0dc2c390e30b46b38281864b5d8bc2ab339c48bd9cc8fe70067358722cfabff6bc907a457f84b1bcbd6c765ada9b5c684d290c53614123a02660ffa22ffaf602111b7612862d2d204c65e82dc232798982652ea51a362743bea629a8324f76b693124b2c3772111c627e9db55c49fb7ae4204222d850311ca5d99213173416df4bbe68b6b6fb514dd4b821bda1b50f5587b7bb254a65a2d9e6a2c5baa0e71b0be88199096c516f84a20f38a9d32520a0064e955697008a9bccb6524ee56825bcbb776092c99a040b85c2e6e1669f08932f63635f1c37e989a4f8b2190c335e31a03aa06a755022c895485780bc90a969c834091f2cc64960d399ee65359ac245201b948bc2827943a06165255b0492a7236e7b69b66847824d8873a24b6267acadacf330f306652dc766df9269ef911068b50dcb199996a294b8f935df477f00b99882a5a5fa8147023737592a2d797358bda228bd62440fb0c3811b73ca1c8fe4e1c070498b11bc816da770bd895a96338fd9a6659ffb88df51719bf3a4b208647063cf9ec985ec087fa643608e0aa23ce7749ee3c7983783992961a409729a1c6f416a0a0a5659e8320f95277ccdd31de6fa3e41ac9de3293e3ab36971842d6f8b2ffa9a26de29b0c1a26815362a657a5571fc378425b23089bb94016ab2e180888226d1f7b448749280b978958198cbc626539abaa520f4c1ffed3ecd10dca6a4d6edfa0952d6e2785cbddbd5d6b62e0449476f7c6f9ea3621237bce0f97b11fe0e65776f1e92da38362cb376eae84d11c4528382828f7a689a0d5cff87b8ca0bba97feacb39b935a8788cb + +# Official test vector 23, seed: "fbea1bc2c379f4f8fdcb0de260d31cdb064c9ea9b1d6dfbe91b3692add1d34dec9c9ffae7bf5e72ed2743ba3f9f2e43d" +seed: 5cbb141c2763425c274f7404fe530d9116e08c33f9f200a20b011cf563a28990fc9ebbe336dc464489861db8253606971bd0a9008a433ed17752d04023781552 +public_key: ada7c7f6a193f8174b99e5b0c249517ac47c4ababda18b523a665587579d884b7d98f778758c48d28c89c97441e7ba1ddcd020455c73a30377402c13c20bb8bcf9042066424a9081c9d44139e53f3afb7d9a687c3510a2f4f22fd5ab37bb778267053055f38158c3762694aaa89596ed824a0a10490c49619960b79db3174a227c7687ac0b4533197799969911a24bcf1e19a4d6224e2fea4c4da636483a09c39c0e63531e367b7b74c9734313bad6056228d00d90f8806b6a06dfb45e4366867c2175d692c66ca91083b5ad8566bfb4816b40da9971bb4855b44e13a04eac687af1a025863b8878827c1a06360e84c24e8940e404716e665e570a12b0532bc663001ae8cb94aa658a9394b60a6a1c8b008ec7bdf432002dd43f34fa04665278057cc5a0ec65b7315e831681e4d5ccc2f95588089122b18b4cb93df740b2910ccb49142942b563d2027c8552ba5bb595ef35943db0bc2c912d57f2cf166b2b9d219222a6a71bc55ccf7cb9c7c8c23398761aa58bd8a587013841a266000a375cc14018cec577260aa9d962799d9900a991873b175194720f50a90310c4b8b5248c0f08a0b609440eca877c708e1941a15af6407d5873fc62492bea381f431c8a727e5fa235b39434bdeb8e0918c4ab82a5d735b0f676aac18463f8e65cf2b30ee3a97969da994105d056d49e2245ac4fd1912a44b6f3647cb9c377df2c7f0a99016725bda1fb78670013fb25061e11c09fe1c92ec21a83da9a2ed2c95636598f63c264c972a4365e6580440b0327d3638628e06cbb7ba024bb2481f64bbd39a5e79c46b43abf0f405fee38076a600468f033b9c52aff5c3ffb6191ab8b37dbd8730ec63677e6b43afc74331631fa0c5263268b17bb0a77f2699e839e66489a8744230aac9c77ab765cc9094a8077c12c8e8dc6bcfe900e831c02cf01161c083b14677f01878655394f31296a33c612a18121cfba2f7a1358af8904b5e8c00028434ef812ac1a5d24bc2e09eaa5929c5e6e05683d292428324fe2a021e238b2717490f4731aeff426ad085574c9a1f7cab392d662fd25b4390a694946c6684c0a02d85da187769632b6a829cfc24999a317436d4b47473bbf8fd73f9576c6424acf65e88a4bb230aeec1f5e08c7c05a1c84aa3af9d44c25c81e4db436285a4b1a572f950437e277294de7c0ec087b8148607b30229bc97f7907076d9842f5a77fc5644177fc095e7245eaa7ba8f9c7840c99f852a109257b04bbb3679f80a617ba997f5b5b22c14d13807ab9bce20cc271c9b2cb5dcbf67e4a0df65a5adbc0f8634670c4718feb06880293d7c7184c52601c69c58f110cb1ef961aeaa95133483714b11b57b71cbb94e6a483444f65f293b7d349a02950079ecc18ce091ab09d647141065e037c2041c932ca092ac7b870e4a64caf14069fc9845cacd62549356c38fafba2a7f7133c5f7c630721fca36ad23767e4d86a2d1ec8c41da18355a9375659c9b7c04539864b1098b8c862dcebb94785370430498cecb064dc8aee2e385fd775749f47c1f38b6d6d08a6c3a5b2e148204d50048a3c8e5f13e2e3059e6a3554a636acca6b634aca6da71977e33a74f0a56e78cb856b816b73681a3a96f5a4328a1911a7e063eef31440fd21e5f281e9be9954113acbc3662529911cbd8221a7227e2d38e9bf798de61627d67b8e8f62f2e10bf66f24187d2ad2efa071f0b2210e53091e29be859857e801348092c572b91b59102e325104c6c1a49c7654c2bb4df431c12ab0f88e1132b63bf56c1616028994a304536564dbf18b54a16b50b9c75d3f347d8cac3f3bc2dc9827155c507294014c8c92e4121386c936f3bac661f4c4f8604a2b648053e88792f5ca9a48719bed781ad4a7bebd8306b5401dcba9a69a35128a7a89d22b97ffa5c2336cc5cc090a6cac001dc560aa25f8f65093f0c2fa5540b51f56862380996a4c48d90a68f8956ef49019ba809b84496118235e02535a37b1da0c95845f18342545ed12426a6e5ba1bcc7b348585669c003b02033eb024cdb70405f5c5e6077449d8c4e6e66d65a23b9bf51f40230bd241bac33b708ae7b2147809ba2a14005038d0d197c790491ffa5c74626d2f6c5e0ab2c69ba55ebc83195044cd7c4c00d84bc716d02f8bcccbb4f85d5e50c6efec71d667cc0338e6a6ca392e61bc1211681ce762516ade8bdad2f1ed78a9731a2634 +private_key: 2a3a066cb7ce2fd3976cf377eb5500fbf9887c2375705c6feac85eb92cc4d423ad0dd37b4b1abf98d72a57e3905b9531b3f9382a2817b464769ba133c3a550036abd7a704ef0026e832b5a0d494362025debc90eb1a03807b35832aaa00a8c93bd72bd1908819ef7165358541659aca85c2e640987d5cc3fc941b7777ba63e17987bfb81869a484ffa81a83293d87272ebe243416728a92632480112628463d880c8cb23193b7038b765cafd629605b0a1645a2770635b47cb35d728a264a03c2d2c260d965a86eb9603b16c33a092d472c0857b632be44a04a2424f4ab1f1ec6fa54200c1bbb4ef0a35a59bbca8b889889332577835121195d38248d849087c996933403f74e56c9b3406dfcb416359cc9912cff4f69b3e826071c5029671724c28212f0b85950b100412bc574a059aca60a3f1c76ea45a6dc88cf4998c21805f9b17c3ea7793af98224b017ce25bb16676a1146c933a587d98448d7fc188e6a510272770983b964091bdc09b10ff341064da0cb347c8ca92c53eb83bab85248e0859a4a933be5078feba8a8ca12d8b634946c24861fa7a699069c2c72ddc840ff20c4795a680111222b3e52116e64134616f4b223e0fdab1b7a514c667155a42847c4c726e2c7211e675ace1412303390b6a2dbdfcce2d435750c94799a82df899227d344a81a5422af0c05b4a605ce5b00a438fdbdb80b8f224051c7c934937fcc8889c6baa43e89244e1bc5f9b136a2b6b956a349aaa3cde7338e1782faf951518f29d492842a936cca4cb09e81ca78586558550a7e11452197c29f7625e680138b03039612048913aa4a8c8b383e8655900549a472dc552ba39b617bc82405830cb186b1c89327145e1cb07113dcd39110cb7b45dd9a92a4b28b6e8794ca070f1e398e603ba39b5a7eb7b289885039be10bed6a08b296298766752ee392e5d693396b90e71147463a63aa6b69e1e3c1426c403bccc11c58beec481bd1f5b5a26657cdc75cd93ba89f834594240295544420e09f5b0bc9e76458ad426ff6b6247534aae1a04a6a5a67894638c88bb858c0c21af8376500b33143c917148c3244c2bd176fb134154879314d111bc2193ae5b03fab328db03837a177c8caa585caa45ba51794a7954837cb671017cc6325196fd767d50a65ce798754754403a0af6a1c25de2b051e502da59c20e80528cf0b6e509772114a0e7b43436877cb0f175f8d1b0a774c36ab09a9d13013cf20667100ac1a314f0ba661ba72bbfb86890a48929dac8ca0e40604b17bc9434013f707a2e37099021e1c7c8564e7848bd21b45d13c020b3a2c09823194cbb46841675a92c888bd1191b3cd78b154f650732b12634c3b8473cf044471a8a54de3a601a4545566e9076d0149c8e8760cf0aa1a820e7fb24ce428a49f572ac1028e7109be2ccb41f5e02bb902697e537305ccb425b8cad1d63fecd8a8e1852e1988419e7688e891bad58155c72002f190ad27a55725398831310cb8b14b06516ee2906ae86874629b7073e8acc95548065275a66560d7935174cc4dc8f4596d000d288c5ce8536666fb275e33cd68e004210985c7d146bfc1b2e1b9a1ba1048c6516a4e4384c48921f271a4207369963b75c3d15e859322715b8a59b116deb2bd623acd158a8375a2c403f15068f74bfbdbbeab602357461b9bb1ac5d429929025ac2a3b1200376a953704888a2b304b3ea608fc10b1f05716ef9466a670407ae66baa218557177193df197f3d692536c02ff5816cba620d23b0a866980d1820d2417722ad440534a0f15e65573cbb8a896be183b83cf2b954139a27d4a4eaf267b0a2471182963bde3503e7b7fa723ac20e97357f24d5b6cc01b8b8606aa6ee251578963593187109452b352ab1f90a8928999b87b1c054a3b8ea30c4f79907c831636c9071277412a1fda2e5631a86e7124f0393e1892857458327136a136414cd0db09e7a9948995831882b1f08ac2b9767536e41d19fb54ccfb3565a470e1350b9d3a81ec11043a3a6f445433db604dda35af06aa636bb88426d0623fbccb6f9c43ee1b32f822416335ac36c7200e60ada28096bec7cafe37c3aff80f0ec27dc4ac5390e0756e080ff198bc11ea96178b55b00a21f5c81ec67744a8b236100cbf5cd98204000f931898eac7cc091389ada7c7f6a193f8174b99e5b0c249517ac47c4ababda18b523a665587579d884b7d98f778758c48d28c89c97441e7ba1ddcd020455c73a30377402c13c20bb8bcf9042066424a9081c9d44139e53f3afb7d9a687c3510a2f4f22fd5ab37bb778267053055f38158c3762694aaa89596ed824a0a10490c49619960b79db3174a227c7687ac0b4533197799969911a24bcf1e19a4d6224e2fea4c4da636483a09c39c0e63531e367b7b74c9734313bad6056228d00d90f8806b6a06dfb45e4366867c2175d692c66ca91083b5ad8566bfb4816b40da9971bb4855b44e13a04eac687af1a025863b8878827c1a06360e84c24e8940e404716e665e570a12b0532bc663001ae8cb94aa658a9394b60a6a1c8b008ec7bdf432002dd43f34fa04665278057cc5a0ec65b7315e831681e4d5ccc2f95588089122b18b4cb93df740b2910ccb49142942b563d2027c8552ba5bb595ef35943db0bc2c912d57f2cf166b2b9d219222a6a71bc55ccf7cb9c7c8c23398761aa58bd8a587013841a266000a375cc14018cec577260aa9d962799d9900a991873b175194720f50a90310c4b8b5248c0f08a0b609440eca877c708e1941a15af6407d5873fc62492bea381f431c8a727e5fa235b39434bdeb8e0918c4ab82a5d735b0f676aac18463f8e65cf2b30ee3a97969da994105d056d49e2245ac4fd1912a44b6f3647cb9c377df2c7f0a99016725bda1fb78670013fb25061e11c09fe1c92ec21a83da9a2ed2c95636598f63c264c972a4365e6580440b0327d3638628e06cbb7ba024bb2481f64bbd39a5e79c46b43abf0f405fee38076a600468f033b9c52aff5c3ffb6191ab8b37dbd8730ec63677e6b43afc74331631fa0c5263268b17bb0a77f2699e839e66489a8744230aac9c77ab765cc9094a8077c12c8e8dc6bcfe900e831c02cf01161c083b14677f01878655394f31296a33c612a18121cfba2f7a1358af8904b5e8c00028434ef812ac1a5d24bc2e09eaa5929c5e6e05683d292428324fe2a021e238b2717490f4731aeff426ad085574c9a1f7cab392d662fd25b4390a694946c6684c0a02d85da187769632b6a829cfc24999a317436d4b47473bbf8fd73f9576c6424acf65e88a4bb230aeec1f5e08c7c05a1c84aa3af9d44c25c81e4db436285a4b1a572f950437e277294de7c0ec087b8148607b30229bc97f7907076d9842f5a77fc5644177fc095e7245eaa7ba8f9c7840c99f852a109257b04bbb3679f80a617ba997f5b5b22c14d13807ab9bce20cc271c9b2cb5dcbf67e4a0df65a5adbc0f8634670c4718feb06880293d7c7184c52601c69c58f110cb1ef961aeaa95133483714b11b57b71cbb94e6a483444f65f293b7d349a02950079ecc18ce091ab09d647141065e037c2041c932ca092ac7b870e4a64caf14069fc9845cacd62549356c38fafba2a7f7133c5f7c630721fca36ad23767e4d86a2d1ec8c41da18355a9375659c9b7c04539864b1098b8c862dcebb94785370430498cecb064dc8aee2e385fd775749f47c1f38b6d6d08a6c3a5b2e148204d50048a3c8e5f13e2e3059e6a3554a636acca6b634aca6da71977e33a74f0a56e78cb856b816b73681a3a96f5a4328a1911a7e063eef31440fd21e5f281e9be9954113acbc3662529911cbd8221a7227e2d38e9bf798de61627d67b8e8f62f2e10bf66f24187d2ad2efa071f0b2210e53091e29be859857e801348092c572b91b59102e325104c6c1a49c7654c2bb4df431c12ab0f88e1132b63bf56c1616028994a304536564dbf18b54a16b50b9c75d3f347d8cac3f3bc2dc9827155c507294014c8c92e4121386c936f3bac661f4c4f8604a2b648053e88792f5ca9a48719bed781ad4a7bebd8306b5401dcba9a69a35128a7a89d22b97ffa5c2336cc5cc090a6cac001dc560aa25f8f65093f0c2fa5540b51f56862380996a4c48d90a68f8956ef49019ba809b84496118235e02535a37b1da0c95845f18342545ed12426a6e5ba1bcc7b348585669c003b02033eb024cdb70405f5c5e6077449d8c4e6e66d65a23b9bf51f40230bd241bac33b708ae7b2147809ba2a14005038d0d197c790491ffa5c74626d2f6c5e0ab2c69ba55ebc83195044cd7c4c00d84bc716d02f8bcccbb4f85d5e50c6efec71d667cc0338e6a6ca392e61bc1211681ce762516ade8bdad2f1ed78a9731a2634269505d6cb8212b9dad2fa70171035fd4107ff47c02696b3489650d5ef9c6f19fc9ebbe336dc464489861db8253606971bd0a9008a433ed17752d04023781552 + +# Official test vector 24, seed: "7e87fb886bc3c7c9fc12569f465d2ecd12532e76cc27c65644c8d3dd603b0cb2d036c5974e675058f271d5c82ad7a813" +seed: 293abb6d1c207927945417cf84883ef010823e11b487ed55239e466e83696d0cff8563038aad865a817cab9ce98846ba75be9363718ecf5fea538aea90b2a558 +public_key: 306c0e7e44a625f44880cb0d125bac36b650f8430c647c68e1ca6306e39c61142c2a5924cd0c9cd5a085f4eb5dc4815711e4aa7e3a26e521cac85c303e420a18a3393d996c1cb68dc9904588301385451788e57842305c064807421034ad845df2baaead84acee401fd912b191c89f51c436ff6bcf4b33b0b2120440e65777f4bff5dba7560148364046598acf3d46b70f7960eb9a7c5fe893c87c6dc5741cd84b080b7a4d0a596effa363b6441848d849b72a7cb9f1597c99b7eb6697bdc3181db25ce213c35725bcca20c840066dba39420763572f187758d05f6e43cbd41296f7c7a637cb49a57b00a2a9cfa7b2bd1745b5cb0255b1a68892431704f4bbf5c4844d0c1e9ca5bdefab042fe1ad30d4491427543cb39fd11717035690a77149e09a9173a433dde8a29c40744cd4a7d2ebae568a392981326fc8bdc2989869d6a56f6715ce65a51dc9a5e8f5c304ab6937f41964e80bcb259b9494bb713b6c882b94af5528a6b1bee6886f1da41d5a10b8cbb188aca7a820761e10b6797a8a5aaaf54b5f724c8fa9a41ad09bf9c9875df8ad40781ec93748b428cb0527c9257aa83d412ff1755d835343ae05be3211a447011944aa8952f2ca001153f10bacb18ac64619689ea6562f23c0fb5a33046c5dc5b7c37e2133d0987a44c207ae5abcb38ba68e13505fa5a05be45af5887606704b7b4a4e18e5b78f518e8680a4c3a678b5513cdfa3b18ddb285a562f00f29cad2c984f60c005f73d23e3cc617148d6a53177d10004981fb7e8a1cc362224e48d0cf69d28f213082b4425368c2757ac8493393e5495f35a41646225b3741e5dd1bd6e354681e8b47ae5c576b19d7c807feb4abc89ea94f2d150f946920a0a3d6bcc3d1799332304035515273c2c4e3764ca04e1653bdabdea77819e0490416211ba7877ab8028f8416fa08918c7a7791ceb4a65b567838283cea96997e3ce2564cfa0d41c43868bf6f6828dcc78f5c03afc4422675b9fe926c5d2cc197046c38a30cd5cecc076ba9bdb3c57a4fc806e835ef6b52b44070e4689baa7633458e0acbab3a781aa83158b31b1c949338b58ac034ff2c2c80d3bb54ef7c10c5281e0d5930f3817b9893032246f6aa82f7f6cb29a467395340c6b81347b2997f5514d90c95e7e84633813861c488ea27200ebe7cee795b560973effe3a19c32950e821ed1140b454c8d5da64453fccfee09565c7cac7192952c360232861eaba924780895ca022737ab9139645bcc7b6edc67050c5a90a4308c44764740279107f2799a455a8e4b2d384012d66956384b0cdfd108a1db088fb34cf0824f82ccc7da6a8824a90982a92ed3b46aea02837f57aa0ada783e8766887b538fba4c33b157c2138e9a9155795399cc99613bf9b707519f001241ab2336e96981aedbabd2f41f6673c4bf28929f777f2500cf0e382f8ca2182b9b8e4fc36be4ccc4a1293aa477a76625429a68178733380ce950d5871bd7a0695254cd4367a1d8a94bae95304f23622d07650a17341d401cc5133a772c8aba82a63feb19db78af7fd850c2104fd207579649b0b9eb38c9f2236f1669cc31a5a116474c9b66897c4f6d96cef6428974748bc066338a510621d9690e4345c1a3756dea7355148d45c89a16da8867e164ab538e01e35489c792f79a53a967277054297fdb4365fc7f9bc15068b70b6702a8d0aa9968a005a5422c30596dfc9c635c189f9d2ac1f9481167558992b21ab4dbb54f88742167164ff964c64201da9cabdce9b458dc8cd7489684d4c8ac7951a2147b7358098975837083723eb85a4889547c3847d7317cc88a1c5ea19294358941467fc48bc6bb38486ca05715058171c7b2a178cffc838de1ba0a02c02d4049960d477d9f79a0b1b17ba9345afaf641aaf80218d41a71b9063a5680579123992cc4efc596ddbc0e1d2c66f035963f7b11c7d74c35158ebaf6bc16d6798a24ce928274e125cf3d51419bc6926e69aaf11562f541446df6b77c625f9ec820587b68f1b50e590132d9c988b65c0a86b6c721384b9283cbea128904f5a8dbb6b6a5fb2ada47918ae3544c7978fbf9381f78468b0265290181b8f57ee043690023bc9dd4360fd13514c79cf9e3639b792aa1e70c763c52a43773fbe6732d262f9385716528200e37054237c04504a8169baff63f6fcbd8988928266537d344dd44533e2797aa03d8cb025e705a9f45 +private_key: 09080dc7cb09012bb14eaa2b8d92a71c0078a792ca0607908c04b8b684a0aae139231991812b5e763b2f191526268519469673713359936bba126ab5e0b4b62d8a5fa0d76b365212d686ab74188878aacdc1b420d323ac67659dd2e8851317b0c132ca57bba44671b7b9a78f6e6c73503125ab718bd386b2bff1b6f026c2a2da0f5a05578b8013a0b78fd628cfd7090c648c0afd11a9fd768e56dca02a6a87c7c523ea959348fa0dd38b5d380291c99a989589b6b784bec0cabc181c33c45840700622a0e666f3db15c32bc4636782fc688c8d5433bab63c35d3ca26eb488660a4d141b33371413156322fc2a9be424fb96712e7b6a324fc1559508910124c7eaa62b731147d1331a375b597494cac741520a07082d6945ea92b7f326d3830814f62b20c84179071182dd707d4bc87010b406299c11a633210726c59184767f96720a918de74178d397407950c62974b3ed703b8305e9892016d859fb1479046bc0a0e1766a985266b950d56e9b178244d9a5c969fac3e1a41983db574b3c9b50f2797c807b03de8ab0e692ff913a79e1600a4dc8f4d537368784844a34797433c7fe2b8c5ba14af06bb9ae4c5b301201a55a55b2a3be308a0354456f0243882651d91f69cd5930a27a25874b45b7a556dbeb65ba5f68f684c643a81c0810143de8c2352b0a92e86c72db570c3ac0ceac65bdb5912cb59683a88627086a06a00ae99922fac3a47afe5451b813c7fab053c043069e70c0624a40b6629ef46bfddc36f82173abda6a36642c4b3685ea23375a1906c9eb98e3e057889671d2d6ba894876816c79a6ad476363b27a2811fdd4baba235077a037fb780c540132a046432f04aa041f25b44897c885c8ab8e070d5f07042c2a383a9886bcc40c7750e5ce85c5fe1b217151ffe2ba53bc9875af281f927c8c88529f6395a75783098a9b3a89cb494a131d3118a51a868ce76b84cf3b2ceac1ae145b070793ece3916b86726cb52bb1b40a24be7a9580a29f1ea9146ab5d787c2f3f777638fccaeed72a74f0959ce5b0edd45bde14c4edd0aa601b82ff6b4edb9b77c833a8b0aa59252c812d25bb627b0f82e3186f4ca2ace595cca41ac2612e6c409011854b033360f179c397b06c82e43dafc47b3f424d4d59051048c624e999fab7bd73b18b13a9305064844be040fc5c4a033b59c097299e6221e2c5ca3b9b05317376ee4b4e9963b172802030ab06e403b6940b5d8258572d16ce4c80a20ec0a796b06df076b73e2b648534520dec6ef0b57f61f4b9b5519c82d9931e863461d26d41f35c0a3509a1d684cc5047b9482955d0387808a26bacb2b3922ab780b7ce43256246073b6c5900f004a3830fc14770debb620b1569f6c98db310abdaca61dbd337a9773758ab92fb490a9fb95596d1087a696fee494c0e5739a2aaa63a77cfdaac6a37618cab56a6c6ccbdace66f7eaba24be57cf1d1c1cbc42517604c17801865081f13f3c04c9118444578b95b6a55e51830f3c594b3662351b113d57c6f49640ff14468dbbaec7a7ead354506c0adb923a0050bb3f89cc82b2cceaea4582f1998691bb1845a22cdfc721d6b088bfc52d6a8ca526625b6fc2267c277b9e86b88d9ccf81847c79a0075d36f9b7315273870d0239b8adc9f9dbb05a1e44e7c4604aa3947ee2085dda65651b6069e2c7d64f06986f527c02525e103b50363cffb93c9735135eb1a0a1bb056842278badbccb43810c3727028fcb0f4cc5dffbcb7d39590165a01ad4092ce6954f8c3bd28663d5e3c35142b0351538b2660020dd30d35c0bb5bd7276a8743c79c53a1f80146c16523080db316382d2c9ddce7857703bc3c939b4d5372185603fed280dd8b57fb6b7d80270049aa09bc6a206ccc47f935ad40602a89e9a633541f903a16545274d8a51a40150cde7555a56bcc80261d9522acdb3390f6a5719d57705ec8aa871ba41fbac75254349b15bb6af427bc1053a8a05e2d766a3b8243690b1352a59ea4f2c18e202cf69c205db06a3915058fa01fa8e4a35e3c26bd5abe05db1240687616d873355b6485dc858f5441d9155ab5e6c9fa115f46815e6394c2c1cba717cc0d8048561bab198a9449d8d9ca47803c4777ab6e55443b3ba176a15a0167826ec662877a457e5b4e7401b9b30883bf67b1ffa09f306c0e7e44a625f44880cb0d125bac36b650f8430c647c68e1ca6306e39c61142c2a5924cd0c9cd5a085f4eb5dc4815711e4aa7e3a26e521cac85c303e420a18a3393d996c1cb68dc9904588301385451788e57842305c064807421034ad845df2baaead84acee401fd912b191c89f51c436ff6bcf4b33b0b2120440e65777f4bff5dba7560148364046598acf3d46b70f7960eb9a7c5fe893c87c6dc5741cd84b080b7a4d0a596effa363b6441848d849b72a7cb9f1597c99b7eb6697bdc3181db25ce213c35725bcca20c840066dba39420763572f187758d05f6e43cbd41296f7c7a637cb49a57b00a2a9cfa7b2bd1745b5cb0255b1a68892431704f4bbf5c4844d0c1e9ca5bdefab042fe1ad30d4491427543cb39fd11717035690a77149e09a9173a433dde8a29c40744cd4a7d2ebae568a392981326fc8bdc2989869d6a56f6715ce65a51dc9a5e8f5c304ab6937f41964e80bcb259b9494bb713b6c882b94af5528a6b1bee6886f1da41d5a10b8cbb188aca7a820761e10b6797a8a5aaaf54b5f724c8fa9a41ad09bf9c9875df8ad40781ec93748b428cb0527c9257aa83d412ff1755d835343ae05be3211a447011944aa8952f2ca001153f10bacb18ac64619689ea6562f23c0fb5a33046c5dc5b7c37e2133d0987a44c207ae5abcb38ba68e13505fa5a05be45af5887606704b7b4a4e18e5b78f518e8680a4c3a678b5513cdfa3b18ddb285a562f00f29cad2c984f60c005f73d23e3cc617148d6a53177d10004981fb7e8a1cc362224e48d0cf69d28f213082b4425368c2757ac8493393e5495f35a41646225b3741e5dd1bd6e354681e8b47ae5c576b19d7c807feb4abc89ea94f2d150f946920a0a3d6bcc3d1799332304035515273c2c4e3764ca04e1653bdabdea77819e0490416211ba7877ab8028f8416fa08918c7a7791ceb4a65b567838283cea96997e3ce2564cfa0d41c43868bf6f6828dcc78f5c03afc4422675b9fe926c5d2cc197046c38a30cd5cecc076ba9bdb3c57a4fc806e835ef6b52b44070e4689baa7633458e0acbab3a781aa83158b31b1c949338b58ac034ff2c2c80d3bb54ef7c10c5281e0d5930f3817b9893032246f6aa82f7f6cb29a467395340c6b81347b2997f5514d90c95e7e84633813861c488ea27200ebe7cee795b560973effe3a19c32950e821ed1140b454c8d5da64453fccfee09565c7cac7192952c360232861eaba924780895ca022737ab9139645bcc7b6edc67050c5a90a4308c44764740279107f2799a455a8e4b2d384012d66956384b0cdfd108a1db088fb34cf0824f82ccc7da6a8824a90982a92ed3b46aea02837f57aa0ada783e8766887b538fba4c33b157c2138e9a9155795399cc99613bf9b707519f001241ab2336e96981aedbabd2f41f6673c4bf28929f777f2500cf0e382f8ca2182b9b8e4fc36be4ccc4a1293aa477a76625429a68178733380ce950d5871bd7a0695254cd4367a1d8a94bae95304f23622d07650a17341d401cc5133a772c8aba82a63feb19db78af7fd850c2104fd207579649b0b9eb38c9f2236f1669cc31a5a116474c9b66897c4f6d96cef6428974748bc066338a510621d9690e4345c1a3756dea7355148d45c89a16da8867e164ab538e01e35489c792f79a53a967277054297fdb4365fc7f9bc15068b70b6702a8d0aa9968a005a5422c30596dfc9c635c189f9d2ac1f9481167558992b21ab4dbb54f88742167164ff964c64201da9cabdce9b458dc8cd7489684d4c8ac7951a2147b7358098975837083723eb85a4889547c3847d7317cc88a1c5ea19294358941467fc48bc6bb38486ca05715058171c7b2a178cffc838de1ba0a02c02d4049960d477d9f79a0b1b17ba9345afaf641aaf80218d41a71b9063a5680579123992cc4efc596ddbc0e1d2c66f035963f7b11c7d74c35158ebaf6bc16d6798a24ce928274e125cf3d51419bc6926e69aaf11562f541446df6b77c625f9ec820587b68f1b50e590132d9c988b65c0a86b6c721384b9283cbea128904f5a8dbb6b6a5fb2ada47918ae3544c7978fbf9381f78468b0265290181b8f57ee043690023bc9dd4360fd13514c79cf9e3639b792aa1e70c763c52a43773fbe6732d262f9385716528200e37054237c04504a8169baff63f6fcbd8988928266537d344dd44533e2797aa03d8cb025e705a9f453e8ca044ed0e215c83f03eb98b6da9da137ff2433b319d9ccbd0bf054135d63bff8563038aad865a817cab9ce98846ba75be9363718ecf5fea538aea90b2a558 + +# Official test vector 25, seed: "ad1424e804f306c7ff513da4c1e8d445afca7bc942fac5c0b335733aaf70693712ecbde26ea726ee0f9fd9d52a83b1a4" +seed: 74d87c7556f2671f2d666854a4d6e073e69f35421e6e1a428cccea49c37f972ce1fb7456ac0aa1b97068f452cba64ebdc138bcf5d36b0a0fada2a3b374141eb9 +public_key: fe3200f3e260b8bc589d0162aa2b1eabd229f9ab6f64e528e0f05b3c69b9c9f192964a3a6d2c96b8d525f0bbb32b848e5c244409904f1583c7d58209b91465b9e3a6f2a515ecf55a778119455bc57af5aa885b64100acbf9746787b9757a17c1416c4ee317b017348f5299661436c1fb5c8aef032929fba046a601804b7b4474461957c8eedcc19c609253c23ae1428674b5ba69264ec1ea74f825198ca71c3ad929465b2769338a6359132027aaf46173415b31ca0624d7e6c258a91388742b0f71917df814b75c38b06025fc9682876b597cd65cf21943cbcb4e77b1314c4b487aa46493fb7d5f734d0da891bc51cc8fd0454a7c9bfed5747daa43e2c95fea422165e02819882a535a7e3127396120a242412bbf7384bc91372f640202ea9ea5830002654d40f346c1f2025dd648befb332bf9ae0809810445a2c91a6c51c68ea19b01ca287e3e967139f58ee66b4632346cf4240634095c59492fc3b919be49c7f32b00da0a9b95625131e24a3b03c0b44c0cbcaa7fde1c7872645950818c69a62d864b251e54b10fb6820b9678026353fb3bc09fc90cc5842849252d2c6208dbc7754cd70904f15434a8840104b6a74814b555c69897b4b2d2a69407715f93ab337a7005007218b5536a89020332998a040599bc688f6497c520b73ebaa40b735f41d966caa24e655848fa66a2b473437d14c4f80357e449643cfb34e1759676b0b2b3733bfa6b2324357931a72866e99430454fb1b65797a90e5257037744c0f06415fed93540a68fd2bc5ae74247940c21a061923c603c4a89309f8a7d1ae48a29370908d9137db01ee84c3fb6d4bcde28ca63c34cf1012bdb060d830c2aa6da19ecc0c0a8fc0272e066a8d6225f3a2873a52992768ffef0bd9b109ced760dfd2c3ce7d17cc95095f95bc84f448ec51331066ab0126505df1273741220a869b518cb458b00b5e1e503f53c639bd2bf11d71c45e8866582c71c0663ccd19b0519330f36594f1385ef82199d76b4507318fde59b6ae4185f3811f15b873be902d80c44a9523351653365e369be2939f6f17f753c776fc3421dc75bd0ccae0fab9bcc2a8175408950fa32e983cb736075040a857501b2e543b043b617c16001cef203ae164effc243d4b1cba2f225f361a7d65949cabc32b3b3a782bb18d03627cd2507f1d122a46c3e35f91315ccaaea110709f648114220524b8fae55c8e6caa27a693c3a559496d30db2458674392575accea61c91cd3b9188b94654d15e7eebb383e19d114bc0720b7552ba0d42d85863e984a220bc4632bbd7d1c33f925836e117b209351ffb01c8923edbf4a54d500ce7dabda45021601a5b19d9b0b736c8b1e30896b285a633c647658622b30a9b476a8fcc251e0971f8938063550cf39718c86b6849c7b55319b7a4e817b4447d265bc5189614247026c82c557be5a4e1d302397865af7277646b442874a5b0d5ae60429e4dc5ab30c132052030d747715dba66c16316a7d10d180b6ea88a6e97601ae1131a2412b5e83039c75a1cdfd8c0764109d360094882725c627a8f9395cdfaa7bea40263c8479b3a3e1d68cfa5688cfa19322b833e0eb863171a3f48b9910e5289611c4d51554574cb239934cf870550a0f7a4e78b1ac50b59ac5b1de0f348f0315e627cc2e50707827b9f9c6b943010b46a2b752500526840a13d3123621462bf5486820594c40318b86731e1258de6215d76d68b58083149a041394114caf69198277a8a57082da4a440f799f78064310660350b0ab34970e6d9c9e53a2a24b2c95135971db128eec54cc21378b6067d648c85c8bc21bb9551a0648825719d5fcc67717083e9d677abc523340cc24da5b489933ad7d1c1d12b7004bc1a875244a7b9810b29c77826aac6daa1753681e2b9cefa4aa3a5c4cdd63a844166017f8aa79db97115b86c447bb7e66b7964a19d410149fbc475ec1bab8b06cf96ba0861062f89a621776507ae40849b82615f0b6d81ab82a92184ce9b8b07f69311fb295eb83cc5cc4545d89362c33c8dcc7453a70051f40a56691e212897746c17f5002d8c15bbb2b625ef267914d62759cc01da4c8437eb3facf336fa0bc0e83a9ff51c793dc44007a63432309460162257d191ed8872ead9a8a66296a7e55d30d86ddee023ccb84744bab7db9c015a60707cd7aa0ebe7b8cfb1d663d8b18c5bbf06da994e7eff9d64742e2 +private_key: a902027dfa84635138ab20cb6b0cb06df848adb138ed618d93b5857f11042d2c753e0765d3a1c6febc1fbef347c58b4993f5bfe065a9464098bbcc2c61aa1ae338217592b657f60cdb39b740871103019d17504c4a572f2c5490ac61cbacd3148d23ad48bcba53a7a331e3403c13934ed8a3a6f794c263be9e1b4fe96a40e991798987a54af53048ab9646db8b06b9152136713668a4ca1cb3947469ac27c035ba69fdf43c2b4128efb31aa7226902e41de295cf22b6711cfc34a5276dc6ac9329d30269e637a4e92a80fb481e123c45e9bb04b1724e4065524612ff66a30633a4888bb8b5a15b8780a10ef8841c35c54b90b98f156dcde86a0b78a8052399d0d4bb6d2822a450cdfb5c245f245274167388d25f278b2a3b13bc7ca108d2e09a2af50f47e82bcd8c62813375d88c92f9005a1255a4ebc720146b97929925d9940797a95354d3cb64e0a399cb1ed1f1b395419c0332293fe37c6d676123394e40e3be474cc211dc5240dc855f27ca87d7af59b799860ac3427959516a4794ec9318d1826e8c529ca7bf0e4613a7e9299a416c4dac9937733825f1223d369fe773782381c1374b9f0eb942d5eb446f07c3c4130b3dc057e4222ec6a5c365f2b8ca618cfe998446171b2ccb940eb49a47b1cd123196c04128e1b9c35f30b38287b831ab79191c488de7b4f302be30c84ee446b29e4476b41a4901d85cab92767bcb88cba8b91a23aa45e088f2c82bffb330cdd9cc4aa6b46b032e36a885f61627357208a1b4031c858179305a52f57480483a6bf30654022fce933da873af8c64a74b1b51f1b9532a6caf0dca3fb16b50cad1189097b18526691cec9e3d2b6d53d1687fe64b434a7084873593ca8f359365eae00b1220099adccfa4c78b5f3056d5bc6e3ab96aaf917d4f1073c4a517f66447a4c15a26f96a9ac3c4fd624283757abf435aef7a6de4fb6aabdac65a99792e548e2c2c24fff7259bbbce3d588ae4725585517b5b68b712166171b9780a8c46b3d07b1864ba4a4b5c88e14666b09733c3ca7f1a185dc950e6854a086cb8642487a313a72f916200255a70d94a43cccd9664975d50c2995c56ee142c53bbb1f596a9454b1bdef4a11dd6a21746a3d499c6e3d7209b1004924b2b69c7c9e4286d871546bfc37481faba482616512b3492c4778fd1977bd079ecc188c3172d3b6193b7032708981a71fb72495c6e6787c7012748c062cdfae690b3ac483b985b2fea1e16e51b4ad408e1f53290b48bf4a972a3676862853ba348b0f8d730fc577657545da7500d989c657e787783008509d81babd7227348c574474f574aa60e976b97814a5f7c886af9c3941bb04ec3314ecc1ded62b39ed69636c07227dc11d9596103dc104d96b96cb085cd18ad7087743795b28bc6ad4af3196dc7c7da1907f6d7c7c862b4f9f1045c5b7c57907fc319aff58a113807269d9a2deaf4ca4ec501d6a35c1c23710d674f5b0ad0c5b14d3ca61145b4c8aaf363c7560a61923fb54b3daae6ab4f979dc78b971a105f5d5bb3d8f6201b82175a215d16c501726c8fbd903a2878152fc471a8b4236d6c10698284ad07a7f4b1784aa893669539a7ca8093d81c367b5f51996e3477148b626a35326010d9b7a52044d56355f7008375e2237b312c3a399f265304ed53382f766c21a6822c4864cedc9bd8a26b3928ba0b206d7f446b95161b5cb4415696cb50739b8b7a484470c8d196a762f586c5604f3e0c7bb41669bc538436a413b2630d12d23b94486f3d8bad351a5cb277933e6b1db56b3850149e28a91091aacd9a87beb84a457bf242e78c9d1af9b0412c0b61867f6981cd6c6b8b6b928409f606c4fc1ff6f6453a73b209527bb2e25527e791f729414544c8ac4c7c51b9a64591102c36c5942365498cbe7f9379890a70cd8999610c06e7504a96b6a7f839617fe42e2d13972ef49af07ac9f35444d89a7454e1af46b239fbf2aafb87405768760767a2f4721d7a57288a42bfecb512ce6a023a3221c74266990171d09aa61596787984584697bf80d79dffe0674e416cc74b311a9cbe9fcc7d6b185a5d1322aba71d6f11b673aa293e037464d214e9061ee19341b11199c88a78e4103b41f90e849664c08c30e3d9c011595199913dc231bdfcc98b0ae15f276054215b1feb4c4efe3200f3e260b8bc589d0162aa2b1eabd229f9ab6f64e528e0f05b3c69b9c9f192964a3a6d2c96b8d525f0bbb32b848e5c244409904f1583c7d58209b91465b9e3a6f2a515ecf55a778119455bc57af5aa885b64100acbf9746787b9757a17c1416c4ee317b017348f5299661436c1fb5c8aef032929fba046a601804b7b4474461957c8eedcc19c609253c23ae1428674b5ba69264ec1ea74f825198ca71c3ad929465b2769338a6359132027aaf46173415b31ca0624d7e6c258a91388742b0f71917df814b75c38b06025fc9682876b597cd65cf21943cbcb4e77b1314c4b487aa46493fb7d5f734d0da891bc51cc8fd0454a7c9bfed5747daa43e2c95fea422165e02819882a535a7e3127396120a242412bbf7384bc91372f640202ea9ea5830002654d40f346c1f2025dd648befb332bf9ae0809810445a2c91a6c51c68ea19b01ca287e3e967139f58ee66b4632346cf4240634095c59492fc3b919be49c7f32b00da0a9b95625131e24a3b03c0b44c0cbcaa7fde1c7872645950818c69a62d864b251e54b10fb6820b9678026353fb3bc09fc90cc5842849252d2c6208dbc7754cd70904f15434a8840104b6a74814b555c69897b4b2d2a69407715f93ab337a7005007218b5536a89020332998a040599bc688f6497c520b73ebaa40b735f41d966caa24e655848fa66a2b473437d14c4f80357e449643cfb34e1759676b0b2b3733bfa6b2324357931a72866e99430454fb1b65797a90e5257037744c0f06415fed93540a68fd2bc5ae74247940c21a061923c603c4a89309f8a7d1ae48a29370908d9137db01ee84c3fb6d4bcde28ca63c34cf1012bdb060d830c2aa6da19ecc0c0a8fc0272e066a8d6225f3a2873a52992768ffef0bd9b109ced760dfd2c3ce7d17cc95095f95bc84f448ec51331066ab0126505df1273741220a869b518cb458b00b5e1e503f53c639bd2bf11d71c45e8866582c71c0663ccd19b0519330f36594f1385ef82199d76b4507318fde59b6ae4185f3811f15b873be902d80c44a9523351653365e369be2939f6f17f753c776fc3421dc75bd0ccae0fab9bcc2a8175408950fa32e983cb736075040a857501b2e543b043b617c16001cef203ae164effc243d4b1cba2f225f361a7d65949cabc32b3b3a782bb18d03627cd2507f1d122a46c3e35f91315ccaaea110709f648114220524b8fae55c8e6caa27a693c3a559496d30db2458674392575accea61c91cd3b9188b94654d15e7eebb383e19d114bc0720b7552ba0d42d85863e984a220bc4632bbd7d1c33f925836e117b209351ffb01c8923edbf4a54d500ce7dabda45021601a5b19d9b0b736c8b1e30896b285a633c647658622b30a9b476a8fcc251e0971f8938063550cf39718c86b6849c7b55319b7a4e817b4447d265bc5189614247026c82c557be5a4e1d302397865af7277646b442874a5b0d5ae60429e4dc5ab30c132052030d747715dba66c16316a7d10d180b6ea88a6e97601ae1131a2412b5e83039c75a1cdfd8c0764109d360094882725c627a8f9395cdfaa7bea40263c8479b3a3e1d68cfa5688cfa19322b833e0eb863171a3f48b9910e5289611c4d51554574cb239934cf870550a0f7a4e78b1ac50b59ac5b1de0f348f0315e627cc2e50707827b9f9c6b943010b46a2b752500526840a13d3123621462bf5486820594c40318b86731e1258de6215d76d68b58083149a041394114caf69198277a8a57082da4a440f799f78064310660350b0ab34970e6d9c9e53a2a24b2c95135971db128eec54cc21378b6067d648c85c8bc21bb9551a0648825719d5fcc67717083e9d677abc523340cc24da5b489933ad7d1c1d12b7004bc1a875244a7b9810b29c77826aac6daa1753681e2b9cefa4aa3a5c4cdd63a844166017f8aa79db97115b86c447bb7e66b7964a19d410149fbc475ec1bab8b06cf96ba0861062f89a621776507ae40849b82615f0b6d81ab82a92184ce9b8b07f69311fb295eb83cc5cc4545d89362c33c8dcc7453a70051f40a56691e212897746c17f5002d8c15bbb2b625ef267914d62759cc01da4c8437eb3facf336fa0bc0e83a9ff51c793dc44007a63432309460162257d191ed8872ead9a8a66296a7e55d30d86ddee023ccb84744bab7db9c015a60707cd7aa0ebe7b8cfb1d663d8b18c5bbf06da994e7eff9d64742e2b4ecd70cf455e2195477c581fa72af1ae232e7b5efb374d9607fd958447b7c67e1fb7456ac0aa1b97068f452cba64ebdc138bcf5d36b0a0fada2a3b374141eb9 + +# Official test vector 26, seed: "7c33ca0e987226c8524dd56c811fa4d1ccf9995b1e4e4dd5b1481974e88cfabfbf6787775c2611cefb27ed4403ea9b46" +seed: 013bab0212d04ecd54b478daf72748003a25e2cb060ba6cc50bf95c292b8206b9da0c5da5f195b80fbb99c2e8b06926074f3f604b3f6195b5a5b9737876bba72 +public_key: fcc42e1ada20b880b35f49a312180f66b866c4952d92f2bf38b08f6110850224909413938678c8f9585a0741b561a36b7680644947485b2462d984ae5ea115fd52202643014607067b9540457a3405e7127e841d004b86c094468a0743b82bc70569c3388338e0dbc6abd1456ca3afc4564ee9d361ca0a708e417aaca1af12151d5fc93db4b652eb990a0335c799a27b713172b6949be937b570384f3627102dd2bd784c97d46c8a2ff2a1d2a0c438f0281cf29971e3c58df77c33b83b5252cf0e72c4fb9448aca6a3abb06a22677c0206609598c544781598fa318bd58da2625ccaf7ae759b774147380f0304163b0786a9203a1169d943b54b9b92f7bc7be5fb17e87a37dfe73712c33fc0824ab448a9b2295a7364629956cac2cb6ed54ac085bc3693fbcd9cf7b44d4b318e248ad737aa1b821fa985bf7f219828b1cabfe66deb269a6be49dc3f74af594c820748fca60961fb04f22ac2cd4787b5a41a91195b8588b3a74a1a188f95e50ab047cf42fd5b63fb88ba57dd24528f90c2f966a1cc91ce39ba848fbb2ec4576df188350f587e59b0ac0848d71a93cfda63e3ef93745c6516cbb69a5505b1f900aa4f91094306c84f640050393f1c751a05872aa7b027f678b1aa2cd5f97ca25806a53016eae4412a7f23ebd8a7359e5a706a11415951ae2a45d60fc999b66a255cab76ef85601b2974c462ec4202f83b2ba85190aec7c6fd6263d72e19f7ef71b6fd37694ec1e56090290549d002c2da8b18beab345f969bf1b23144486c299104dc7dc367265902469c45d7788c5d23941c6a1608a12586692eb759eb4835c537429ef287b6709b87dc22653d7a92cc314a295a6a6c939e33b3a87394cc40cb284b17987a088fffc3f401c2b072cb72b467d59f930d82101ac725c79d54fba036aad5760a615cd5fa1a323a87fb63a4472228f124a3ef72a086ac74245cac6b7784249d17c7a19a126b28c7530c1ebd6a806097de35177a5070abe84bbe3b99ee7149c57224357c8624d08ce6467b144e598701987fb460b21e53957f57ce98343a564c63fc466f7e04bbbdaa63ce79448364ff1d9c05257219d03b2d90c9c0c299026d3c0aa4845050092fc7424f1ea03716a456bb2b935a2be5a5570b1eb467d54890493c4977300344887718bb54aa06bd890229359ae33395d7a7b08a71465297780f54cb0d2125ec1311d6bd31766470dc18810848706c0e79c8654c6c6cb35d4f62ee70541e92982ba570dbc289be8e842a31b7e7158660744992d6506e1d1c8bb512f98015270376158228319cbb7a2411253a98cbbca8a6d86c2710631e105c217b2ac05f813474727c1b089b3c8ab8779ce91619352d86b38c5a622c73d692814fd36800d5c009af0bf0eb6734eeb382f70412c2469d10698071c772e62c6243cca236c2676fb0258487430998ad99a1456d29d79977c810953b138642754c0bb993e8b9b7e3b3b7972359569c44bd6576fbfc212f78c0c33362011225d2596bfd2ec1a4b721a36259fb723c6413910219048596252225879bf301c20d305dd3bafb2e62ccfb1c3d300b5460ba561f3c61930662f3641b763b2f5b5b2682546cba9a15331b8afca63cf68b7a1fc2e49c5b4042a3a2b2148c427c9701727dcf3371bc7b13aa62878c8a358f391f02b1fd3d2ad663c4f71c36cbfe11581e1995d976ca37440ddf9c4de2b48ed9c492730a977e017a7065cbcc811bfd155d1935122e12325732505c6c568fa67bf7968ff6836f765c242b5b9966c333ea1161a336164d72cc5767e40939590f07b537788c46265fab1bc3078c470e98dc1b7a31cc53a83a0a7e95c4634754a069007341396371ab79f6343b601b50966c5999144cc46b6d06089a879871bd1bb9c2cbcef84cb8fb4a031786bf778703b164f6787c5cd63ac781424f8550e1ac992a6c04bf7953787047b043632de12698e80526c813e08f36dc1db592f48968395817566886bb2c7d3fcaddf331273ec7ecbdbb3e5d70c823323fa8a1a15e1371534cd0462cd052685950bb6b6833600243e35c7047bb20832f09e1d854739c5b425bb32bf86029e1159d79ba70293badaaa25385563cfb4babdf4bbbe341058d3817e9a7941e69adcc867559b822bf63d0034c15de1a9371945bfacb1caca4fad8590f723014cf5355228d850d99c57f85c67295a4afa0b9d8e1da6065ee0e9e43b6d +private_key: 6fa78813f0808fb375e817a1aa133a3564c1bd632f43a517d7d0bc43386df21a252c71c707c5295109a5f5b64d8d8b338b86ce24290a1857364f69750ff116fdf273cd6861fa085f0ee8333e32cae0c4c202b6af2be601a62c1e78ac3330b96dff58c2037652fe497bb9c6b544460f58d59bc63091c9dbbad4225d4f4a2ad5936a6fa20b5ef52be6d72b8b2c9c9ab23a4937ce834364068a6a9feba95c41b577bc8e70d58425466bebb66167384d6ed37dafd7741e05971b5509aa5c7969c908dc71670e47c45358170f12b9d2804149350663a8a9bb45454929813e7c7fea462440ab4bef1035277a24a9076d7d11256ce4cd024157c0f2a37111a5305459f220aa4c569d0636ba1dcbb918903edff43aadf5c8843a99a9031b35311522d0ba96d6514ab0ba44908749422782a66f29ea4cc916adce65978b6a8b1be6b0bb930427e8af9ef176a13593b4bb1ab1eb4e816725fa182655750a9d835a4c20470e6c646c6314c42559bb2762077b482ca069787836d8d94412d946330a66dc819b49d0a0e42393311826507aa0124c47b5d402758b40d88bab51333f1ab1a61bd81ccc561471c239d4f2cc2af811b93250e4624d8817539fc95e90fa7a7c344d82477d0d632283624d48103e40fc924f1c5d372560af7b96bab49a3de15abe1363e17cb9fc722e986b48ed03b0e727b126320969a56c94428ba31878c6803033689639c67e5950b55f35000f90505ee871c3bb27df9c5253634865024201d50384671813ab1cd77ac1261b08fa9702575673d8b3b40a02530928757842979df188b2c697406a4800e59888623365b6a3299710eb65adddf4b85f087a87515fe9c46332fb3e825b9b37a40d48ac1af52886ba7742f2a528ffd046b4d72d85b49da1fb956b11886562afce32c7dd3771c9c4432871762f00bd72eb5cab4a0cb401605d18c9b66c20b492365a2520f391be37b449866181903653c40312b9395e57496e94c5a913d5a0aa7b41daa33e4c3bad134569e1039a5fecba93a3be80221c7f5cae6b1242cfbc6b15f33540caba84755c2dac7b3239b6aefbccc239ab170b9168e842e53308f9e737c2695a09513c1dc213e7fabc79950aa4063104120b1670b7ade210ba6a22069441b9f1cea4964b7621c6b842c409d1093b8abf7a9c12a9972a7bba867b07af3451af3cd6b61f58af1d842ea8e4391de05f41ec639b3c63a72c4e0af51ff8d144d3654fbb2582c488241c2369dda7ba047181535432fcbb15d58548a7e991922c5a32ac86a80725b0aab1b3c37639e812ca9568f00b88d84b3dc4ec9580b1760301a38ce7a78850a2f7b0931c1c729481c90aa367882643a432155e472ecd1280d5c68cda283304646dcfc13672ab9a72c039d1909650db543dc15bf8b2a94e68858c41c17f2c718977bb0a10a34bb093fb318650cc8af102c1ea138a73e392bd8100f66b287d2a0e5bdc6b63b92db44aa2a42251e6276079c1a53e896764c201077c1e052995ea609b9948cd04e175a3218a25288009b44b9a72cbe37bac0801821f5575a2c54bb367530cb1367d36978a8ac6ecbc718107318ac28c5f18426489536c22359004a478799fc50a21baf28dd269c34c218395c2a06ab07559157142c46ecf7517dfa9192b0c08e8a2524b46c7543753708b726ecbbececa5218849f6b0142b9d45afda4c9a68ba91f6264e4d6a4649aa66aa6165120c4f57b3ce81a3833978aebf52ffb536f61b74a25107e8ed440504c546f1941ac762d42f0a10c890dcbb79b35d93bb85195c8c58d9b27a934fc7466631a5451939d61b009cc054a90c143636b3aa76fbadb37dddc5afc231cc68320940098fcec220d26114fb88b3e10cdb3a98b5df06d2259911d340d27798b27108b2959c5734432a5f45298d4c9be20ce912c199ceb1f53c309047a3100c5400cebba5d6c6e4ba7ae707c38cdc7782254b280b1c8dcb85726579842674a7d6061185556ce3c841fcc4927264712645b6369c30fc388d6899480490e9f223e7435a3ba055b96179c4e625eebe824ca0498a2646749d04340c28edb1077cbcc871ab64a2c23b14fdc1a45b063ecd263ab49936d325cbdd7a80d171de2e6156445655629bd64ac08963824abc09014b497ed50af28b1b62b6c9d35515a0393341ddc9ffcc42e1ada20b880b35f49a312180f66b866c4952d92f2bf38b08f6110850224909413938678c8f9585a0741b561a36b7680644947485b2462d984ae5ea115fd52202643014607067b9540457a3405e7127e841d004b86c094468a0743b82bc70569c3388338e0dbc6abd1456ca3afc4564ee9d361ca0a708e417aaca1af12151d5fc93db4b652eb990a0335c799a27b713172b6949be937b570384f3627102dd2bd784c97d46c8a2ff2a1d2a0c438f0281cf29971e3c58df77c33b83b5252cf0e72c4fb9448aca6a3abb06a22677c0206609598c544781598fa318bd58da2625ccaf7ae759b774147380f0304163b0786a9203a1169d943b54b9b92f7bc7be5fb17e87a37dfe73712c33fc0824ab448a9b2295a7364629956cac2cb6ed54ac085bc3693fbcd9cf7b44d4b318e248ad737aa1b821fa985bf7f219828b1cabfe66deb269a6be49dc3f74af594c820748fca60961fb04f22ac2cd4787b5a41a91195b8588b3a74a1a188f95e50ab047cf42fd5b63fb88ba57dd24528f90c2f966a1cc91ce39ba848fbb2ec4576df188350f587e59b0ac0848d71a93cfda63e3ef93745c6516cbb69a5505b1f900aa4f91094306c84f640050393f1c751a05872aa7b027f678b1aa2cd5f97ca25806a53016eae4412a7f23ebd8a7359e5a706a11415951ae2a45d60fc999b66a255cab76ef85601b2974c462ec4202f83b2ba85190aec7c6fd6263d72e19f7ef71b6fd37694ec1e56090290549d002c2da8b18beab345f969bf1b23144486c299104dc7dc367265902469c45d7788c5d23941c6a1608a12586692eb759eb4835c537429ef287b6709b87dc22653d7a92cc314a295a6a6c939e33b3a87394cc40cb284b17987a088fffc3f401c2b072cb72b467d59f930d82101ac725c79d54fba036aad5760a615cd5fa1a323a87fb63a4472228f124a3ef72a086ac74245cac6b7784249d17c7a19a126b28c7530c1ebd6a806097de35177a5070abe84bbe3b99ee7149c57224357c8624d08ce6467b144e598701987fb460b21e53957f57ce98343a564c63fc466f7e04bbbdaa63ce79448364ff1d9c05257219d03b2d90c9c0c299026d3c0aa4845050092fc7424f1ea03716a456bb2b935a2be5a5570b1eb467d54890493c4977300344887718bb54aa06bd890229359ae33395d7a7b08a71465297780f54cb0d2125ec1311d6bd31766470dc18810848706c0e79c8654c6c6cb35d4f62ee70541e92982ba570dbc289be8e842a31b7e7158660744992d6506e1d1c8bb512f98015270376158228319cbb7a2411253a98cbbca8a6d86c2710631e105c217b2ac05f813474727c1b089b3c8ab8779ce91619352d86b38c5a622c73d692814fd36800d5c009af0bf0eb6734eeb382f70412c2469d10698071c772e62c6243cca236c2676fb0258487430998ad99a1456d29d79977c810953b138642754c0bb993e8b9b7e3b3b7972359569c44bd6576fbfc212f78c0c33362011225d2596bfd2ec1a4b721a36259fb723c6413910219048596252225879bf301c20d305dd3bafb2e62ccfb1c3d300b5460ba561f3c61930662f3641b763b2f5b5b2682546cba9a15331b8afca63cf68b7a1fc2e49c5b4042a3a2b2148c427c9701727dcf3371bc7b13aa62878c8a358f391f02b1fd3d2ad663c4f71c36cbfe11581e1995d976ca37440ddf9c4de2b48ed9c492730a977e017a7065cbcc811bfd155d1935122e12325732505c6c568fa67bf7968ff6836f765c242b5b9966c333ea1161a336164d72cc5767e40939590f07b537788c46265fab1bc3078c470e98dc1b7a31cc53a83a0a7e95c4634754a069007341396371ab79f6343b601b50966c5999144cc46b6d06089a879871bd1bb9c2cbcef84cb8fb4a031786bf778703b164f6787c5cd63ac781424f8550e1ac992a6c04bf7953787047b043632de12698e80526c813e08f36dc1db592f48968395817566886bb2c7d3fcaddf331273ec7ecbdbb3e5d70c823323fa8a1a15e1371534cd0462cd052685950bb6b6833600243e35c7047bb20832f09e1d854739c5b425bb32bf86029e1159d79ba70293badaaa25385563cfb4babdf4bbbe341058d3817e9a7941e69adcc867559b822bf63d0034c15de1a9371945bfacb1caca4fad8590f723014cf5355228d850d99c57f85c67295a4afa0b9d8e1da6065ee0e9e43b6da97ab878370142b7b2b346179050eff0a4153943be66d9ce47c6772362ba795b9da0c5da5f195b80fbb99c2e8b06926074f3f604b3f6195b5a5b9737876bba72 + +# Official test vector 27, seed: "54770ea1252ea2857d6635151194f5f520adea8a41e409ff498d40c271359858fe2b084d5b96bee087b8e8f4dd4e00c5" +seed: ccb073c4b90be0ad746e26fb093b60c70110bd1dcbcddb566a8cffb7b3caf80e71600a8982c350df524cde514431ded7aec23576530894bcbf0ec0bfef0bb64f +public_key: 3e074aaa7ac9f7703a87b72bd0aa050574b63fd80ef56c882109c9eab220e67041396a29d6977f9530c3628329a2e02a7850c77c73a4698145c837087f2241ae46a1b7b692fb5c81de38846a5bad7246b596a889eaf558d1d55bf1372057f1795b40076d53c0b81288fc9009757a9111ea26c3410d55217768378cdc94a3cb40af38f67b1b473b15205c58d876077b2c8005bf870588dd6318ac154dbd9aaaa6d48d1dc05118739fcc7c12327a68f8b5369a846b6aac56fd1043c5ca8675752c12549840d47b6563c703723d6b8791bdf14e0011c0605136a1521265c13874b9ba6064b85ea895180c634168774aa55e2df34ebd8132bac959dba90ffa656e7c61677d3b801ef3604814ac36d31657bcb05bf20c893a4a2d50644902133b9b16e81c1abb2b5521408f3799152ba14d51a6a7f4a231b5167b0273b22cfc606482cc6685bbe8e80f6aab99d7f55b50e093aa55b568c45aa3e4a0766a9228192e5e91378af608276308905826c6a24e7413aa98f57495dc2d5ed5bd6fb5c65f4b4ed7b9c4c7b504548b0306c892f547613516a9064417b1b96a95cbce5b502bc770356df5ad52b98adf01bd66175ab3747910c814e7b070205b60978aad90c43341ac6aee03cecf7cb8cd2b4842c3401ae1a3b60207af366fc7f78069e39fdda0ca53402ba455af5ebb21ef9a6d60501d6ecb1b5297312b280ab2023f2fcc42c2d66308f263b7d019af68144247c2dd93a05df57daa5a03e896a182b480f1f607ea668aea60b66964b2a3fb609ff547da9a51aa6848ce2a686406c7fcdb058595a807a6692f833cbe3166fffc73a2f30523c86db1b98ee7f477d7f1a8c7110076774d6147bb56a79aceb6804eb982a8d00356553a68ea8e91d8b86d676f394a776353bc830043cf209dead22480c08d5df25e80fb734bd6558f1b9080b09fab642808c458cdeb0d72e5b49305aa502321711131c7f848fd14811d718be5c805c8b254c8c556981ac8c1dab13cbc9e91708d99688e36599f3b7a23f7ab83f2a3b613b38287b2856aec5b4ee90c33e85b8d88cde3870759320b4c1c0d8d727c8e379f84da0221b2cdfef70270299bab0b7f9db8c69d7c9ea6d01df6107e04440bdcf945af329bc016892d8c01f071654ae3b19374946246027210cf9b1760aafb5e4a935c2d0b7c70db3721279e6fe43d712468fed532cad432ec30a1372554c97c3769c380c709018393364ca97f9dc37a0d393511990aabf398474965dc45ac2a37ad60163145bc3b73e7a6c2032f7d2216bc19b26b4cc55bc68ed996411bb00715473f4e0636282c203770a3bbdb26cc58aa7b4c69dcc01ee3e53ae514169859b632937cd8c355c560cef5c091f4080047929554c94d7115393fccc11fe397f2854564533fe9e66614da3afe15be92196268720f5fca36878797a2b045dadb2491fb3cdcfb7253f18750774d4108bd6c7c6545b801e8e368a1087e0f33c22a359907c1c75bd59db28268da457699337356436786b16bf6a25fc55141bca303faf566039991c700a227c01e6543bc173c06b9a8026fe07e032c30f5d4c86a950a3a7b32e6c67e51771d78c08cb5382bd4fa8068969926d352f7e5820ab19878197c25172e95d6ab6a05acbbe375ab955bc777977d2b926786c9143978113c490731438ea53c0db27bada4be961b38138b4c684a12d4b08b6f03ab28f6a260b01afd348b59684197002bc534836c8b735df139ff98c84ee03a58e02d0e6125f1e09bf7d7a91840226362a667627ae5f580ee50b594fa64892a508ff8bf80851abdc45486936e11e26beca14334454d66c0128663c52a8700b525950425a4ce7824b25b9e45ec6bfff8279d1503816ac76f498f8e18b2b626b285655ab40096ceeb229856457699b500b77f7af5c2bc8c545c4292a387583fd74dcd20c4bed85bec8c245c63608ea302d557199d9a70194a5e92acb24264532b02baa8f824052379395b3b4222536164823c379782837ff417b1583238721b8b6b4a5be982abfd35a90d07bade5c03c4c3170257bc0e88b41b242b146027baa2cc72474d00427b0c79cf294203df379628799452d3952d2ac709f20dcfe33b001022917a4678966f1d9065cad2bb9b6979817873e8d662d7ba8343d18729291c544c00fdeac5ead3c8dd2cf3e2ec7899253e7f980f9ab3230eb1a9a3688f94bd522ebe016e2980d72c +private_key: 93d973d0a7b385a29d218666fad6525fa2788a053b455422c2526d556b1e79a17330c18063b054f0e238ebc1ba8cb874836989c4a7c75d364118585b7db99469d52b043243ac867b25b2b8cb9a8f6699c3d8fbcac40423fad90a56775c57d02107da9dc94731a2a298da61caffd12ffc119f817cb01d4c98a2f48443d6b36782be1c25adf882702b225f439000ccc8c3c16129f0040fb4bb1a4993470f7c20d73ab393016847a1647a3c14ea88a7095658b0b9c61c8c726fda255d641b83f03bd1c9c3cfc20709909b1f227c89d9c7f5d51fe9fa753ee729571a3e7939af9cdc17a0373f86a4253dfb849f70c52c336d1f34a682661b6c21c73e9a92c50bb69363a9cb3c41d55c1da8d69607e012f5193a79d581bf8760cdd742f63003e96c6a1305aedfb36de84a9e5b832eb5ac2ff204397d28c8eb64a756c27d8e7b0cfee3ba9ba2989c2310633813c9828705266c2f8569163c91e33baa49e6a4b6b92bef81174d24bff6c0cc6c020eb501126ed1507ee8cbc4a7281b34c82da47bd06851c0e52e5ad9ac27f3be552564b7792fdf847f3cbb5283ca8f04c4b6a5e0bbdcf3c77a02c29fb847a5643ce719b276a39ddec8a361d73a4a54bdf1757cb6c65b0d62333c562a64317f713ca2c714a2ddb1bec986583e8b07a5f24217223aafc711ccebb83e7921a41625853a045ca02cb8b597332b524dca8e15b02804101e3cc2882546864d732094e2cbb06699027727509a4a22e28b7cbba46a30b174594c7abb7735a47a471a245050c0aa5c6abf020e005441766bb4741c756c588e4bb7963ef2a889e40d542b65a38a888e0511d8053aefc6401db4c795b718b9019c96b39458c62da35a383738649c065fd0812ee4a0b9b809725359ce754604c4e8462d7094beb3ccd17148e4ebce2a799dca2c55174c98bcd9206a0c340f8c559f6c7745d7b305b672f263643362b2fb099fc5173b43c167cc25bd8fdb7dfb7b3252162ac665bed6bb0edac9822745a80a463329db5853b091f304094dc949b797b127e11ce4860793757cdaa510cc5c04f0c7575567ad1457c54c3176861c77e7f86446d410e9b3a005678577787d32741595989d9fc92fbe5b0620a11aaf94beeb68000877cbaf39bb6bcc2bad72975bf94ff94a56419726630cbb32114bbb412c27779bc49632faccbadc4c3bc1a61f5d2337754b5981382e6d406828c6ace3f73adba6021aa15e52eb152b222b0bf593519703b3ecb38a39adeea3123a2167f1c102a19bb83a76b562090e7d24c9fdf53056f35cd367431b82a7ca210521d4c78f78ad54244e97149cb2d28bf96cc36756bc4474c0bff06aaaf3985329af217469612b225504afe70c69cd4467b3f277df5a2b74b14f407a649dc76361527c0059a8c3fca243b0c2eec7c615f7c8a15a5d4055a301abbfd5a5be42a8cb7f4b0700f4575ffb719965a56ac21dfdcc19d48a8302c29cfc340fdfc391e2838f878164cc7b58355473a9ab44098ac0c0f8cf2c0b3657709e48419c3aec2509222cb658aa1f6709d0c4bf6a077197a8a89f433ed18987072a9bbec9a19307c51f66cded27a2d0538ed86989040308fcb42e8c8a9bd2c5845a914c18c5c2aa5cc2bc418ccd5328c139af2d66b63190b99c5042e7b81372772610511fcac1449e71a6db9b35fc1b5871a627a63900594869b20a1483a055c8bcadf3468b4e9a7cfa6c4e3230c550889a48f0a5b5ebbe64cc06110c96987ccc2343bba708791bd9b2d5d6b028b9425841646244745b38c644342781e886ae452e3f04098e9c0b1c37c30e08328b011e0f4838a64874b1985ca1834559a07711c035e29c0159286d9473551ff65251e2c26a227e75f1293b2b86c53650a33b2e4b77b0108050f8c8cfc965771bbb8a9ca0075e09a30e81b2a4bab1e424587ab282ca7927bfe1bf3e18775cc36a6579a3fc338db8e090707ca42ca12981dc7956763285014577e9af843b7ccfc631bf706a1186c6973b532fb204fb0c0645e54b7581871db60e5b4c375dd2bd43b35865b08856166f640ac7efa516f24885fc9216fbabbce3d66fe9466db3907ab224244e759d1b89c041bac289040d125aac681cb048d908d38513eda6a23248a01c5b2c1b6c6296a5c612b21ad0b433bc3296f9f40b42f02973d2a4740c823e074aaa7ac9f7703a87b72bd0aa050574b63fd80ef56c882109c9eab220e67041396a29d6977f9530c3628329a2e02a7850c77c73a4698145c837087f2241ae46a1b7b692fb5c81de38846a5bad7246b596a889eaf558d1d55bf1372057f1795b40076d53c0b81288fc9009757a9111ea26c3410d55217768378cdc94a3cb40af38f67b1b473b15205c58d876077b2c8005bf870588dd6318ac154dbd9aaaa6d48d1dc05118739fcc7c12327a68f8b5369a846b6aac56fd1043c5ca8675752c12549840d47b6563c703723d6b8791bdf14e0011c0605136a1521265c13874b9ba6064b85ea895180c634168774aa55e2df34ebd8132bac959dba90ffa656e7c61677d3b801ef3604814ac36d31657bcb05bf20c893a4a2d50644902133b9b16e81c1abb2b5521408f3799152ba14d51a6a7f4a231b5167b0273b22cfc606482cc6685bbe8e80f6aab99d7f55b50e093aa55b568c45aa3e4a0766a9228192e5e91378af608276308905826c6a24e7413aa98f57495dc2d5ed5bd6fb5c65f4b4ed7b9c4c7b504548b0306c892f547613516a9064417b1b96a95cbce5b502bc770356df5ad52b98adf01bd66175ab3747910c814e7b070205b60978aad90c43341ac6aee03cecf7cb8cd2b4842c3401ae1a3b60207af366fc7f78069e39fdda0ca53402ba455af5ebb21ef9a6d60501d6ecb1b5297312b280ab2023f2fcc42c2d66308f263b7d019af68144247c2dd93a05df57daa5a03e896a182b480f1f607ea668aea60b66964b2a3fb609ff547da9a51aa6848ce2a686406c7fcdb058595a807a6692f833cbe3166fffc73a2f30523c86db1b98ee7f477d7f1a8c7110076774d6147bb56a79aceb6804eb982a8d00356553a68ea8e91d8b86d676f394a776353bc830043cf209dead22480c08d5df25e80fb734bd6558f1b9080b09fab642808c458cdeb0d72e5b49305aa502321711131c7f848fd14811d718be5c805c8b254c8c556981ac8c1dab13cbc9e91708d99688e36599f3b7a23f7ab83f2a3b613b38287b2856aec5b4ee90c33e85b8d88cde3870759320b4c1c0d8d727c8e379f84da0221b2cdfef70270299bab0b7f9db8c69d7c9ea6d01df6107e04440bdcf945af329bc016892d8c01f071654ae3b19374946246027210cf9b1760aafb5e4a935c2d0b7c70db3721279e6fe43d712468fed532cad432ec30a1372554c97c3769c380c709018393364ca97f9dc37a0d393511990aabf398474965dc45ac2a37ad60163145bc3b73e7a6c2032f7d2216bc19b26b4cc55bc68ed996411bb00715473f4e0636282c203770a3bbdb26cc58aa7b4c69dcc01ee3e53ae514169859b632937cd8c355c560cef5c091f4080047929554c94d7115393fccc11fe397f2854564533fe9e66614da3afe15be92196268720f5fca36878797a2b045dadb2491fb3cdcfb7253f18750774d4108bd6c7c6545b801e8e368a1087e0f33c22a359907c1c75bd59db28268da457699337356436786b16bf6a25fc55141bca303faf566039991c700a227c01e6543bc173c06b9a8026fe07e032c30f5d4c86a950a3a7b32e6c67e51771d78c08cb5382bd4fa8068969926d352f7e5820ab19878197c25172e95d6ab6a05acbbe375ab955bc777977d2b926786c9143978113c490731438ea53c0db27bada4be961b38138b4c684a12d4b08b6f03ab28f6a260b01afd348b59684197002bc534836c8b735df139ff98c84ee03a58e02d0e6125f1e09bf7d7a91840226362a667627ae5f580ee50b594fa64892a508ff8bf80851abdc45486936e11e26beca14334454d66c0128663c52a8700b525950425a4ce7824b25b9e45ec6bfff8279d1503816ac76f498f8e18b2b626b285655ab40096ceeb229856457699b500b77f7af5c2bc8c545c4292a387583fd74dcd20c4bed85bec8c245c63608ea302d557199d9a70194a5e92acb24264532b02baa8f824052379395b3b4222536164823c379782837ff417b1583238721b8b6b4a5be982abfd35a90d07bade5c03c4c3170257bc0e88b41b242b146027baa2cc72474d00427b0c79cf294203df379628799452d3952d2ac709f20dcfe33b001022917a4678966f1d9065cad2bb9b6979817873e8d662d7ba8343d18729291c544c00fdeac5ead3c8dd2cf3e2ec7899253e7f980f9ab3230eb1a9a3688f94bd522ebe016e2980d72c13035e253575fcae389887037cdbff8ea508ff9e5337e2fb607919747cc53df871600a8982c350df524cde514431ded7aec23576530894bcbf0ec0bfef0bb64f + +# Official test vector 28, seed: "cd6cfe94e9c0a1cc4ffdcd2d7876504be5f50f1d1ca5cf93482943465b268276056f2781f4de805c138976ca72621387" +seed: 2e889f44e28901e9ac7ca6b2fffcb124c8979401b17064d7e1d51a7e3c3adbfa0e145e44aae52cfc609e6f47fd7a6f6af877190ff52256d0ac5b05b89c3f449f +public_key: 10489b6e431f18744974e86c075394189349b00b1ffd5cac6072cc10217b0e3203e3f61e1d9281c2d208af83a7f071ba78546e273271ac1cc01a320f35e845f10c59bb8c97e1627603e51a06e532ee716eb83519c80a4833c7ab45e6951137c0f731964ed2197b033e17bcb5237a1128179a85d24f730a6b31ea0e52075ae2198b48106ad0e1225701313af1a7b675347bc0ca48d88c4ff054edcb1092e87ccf070e10dc093bcc9bd400490250b7dca3775b715f218448caa01a8d8c8c6577cc9f21a7e3e6208b2c42215794954aac57712a3845523c74960b57a97e0c310cf7b8798192eb9507fe65020f706be129774f10794f2296abd13587a78456b083a164bf23c801969a57591062d22bab23b61e7dd5b31bd54520f4080a4c6c01c6603f4b4b1aabb99681be0b9c671f496f8cba2a571502e0da35ffa9bd2c77a5e66809e4d54000b851b2226e23c1072253826f374842da312ff0931b7a85e6186f5e6a31276a2d40a81fbe135e2c86c328b896f07c2269f983b313cd92578882a321f0031fcb9a9e7d618fd3d543e34abcdddb98d4c4585cbcb67789283c442f8c5cc914427fb1a53f3e35b78c2110ba956defa035084c53cc9b6fa7946e11840087e8194db6607246c7b314ce7644b8e522cf494a6333dbcc23da197cea95c318797ef0a18c84bafbe968df375fd0c9981757aa8c878658722bfc2684e012af3b30a067ac996315b0cfb13ec45220c9447ad4374c78484ac652921328214ca33466f6024abb7a78cbb528c44a339638eef09d3ee370d3a1746053629e7a37eb2600f2f73eb9d572030598042315b093c0082456fab06ca2a4c9bbd4c651bb297b494fe7e38d5c8aa3c7cbb6f1189d4a2c02de0acdd0e2c7ffa22e83c63623a21dc137c00e07193bd28264ec0fee2259ff2362ebd1c252103d93645e92e398f46935109bc0cb50c619424db0461823d33fd8d271727554a4c86a5113a17de7bd17b47cf04bced6cabfa7e926993b57a6c0a693e251e3b90b7b17195ff037fd867b87109a8be90403060cb34b32688c263eb00194391ef6c978db4c83c8967a735895a70b6dced06016b3737015696f1a1945110a44f022472c0ffbd049c0925ab1d68ef3f775308c2a95e99865c04b17b34d28a1254c433313c972a7f51a48696db9d7ab71d4600c0563b36437fac1ba6ab9ad6e89630357485dac1485e2808de8869ae59fc6a952890c69695424e3bb9f27aac2199301dc6b36503699f2504ac5e35adfe08048f9842df3260abc3d209a1311d65c048b58111bc7fbd6953d21b56364a51d9c2419072dece82b9d93aeb99c3f0a5a6c3f276504c3697a7c19563abd84068e8a39373c1375d848400c663c44e6c968c3c61fb375eed10baa60cf6158aa7e39c99e609a8b0765e36a2fbca515e4581a0207ac3fd5b3b7a95f193a08511109f335cd1dccc09223129da93aeab93ebf397bb073bd6374634675b6386caa33f71e04b1b420a2036979acf22835fcc511186441e1f5858402af78ba99673125ce9331b6686821ac739fe41467ec22736463ac4415db238bdb9a32e1895e0445aeef16b12e818f33a435afa91f850549ed465fc026163f988582040274638eada37dc162bb2d2839ca934bfa44acaec450ab4436ee78a5e658134bf80f914052be1a605e69ba87005f4042a25569c29243157865c5bed6918da360c4b824c7ebc8157870962737d150ac5583907c0c0f0603b1dceca45e10467ecc3a4435355af8254aac26f411a37b2587f40cc023c1c497664de5d705fbd0c103e36875b168c1c732ab364e1a4726c1d8207e1830d73721dfcb55557352a6508469eabccca2ca706c1de5fab0a7647d2cf7b05e117998173c5b3958d483491f128f01889fdf00d0b668a857479030f0c16bb753794719e4e142f0c5a1a52445de8862cbe3377c383deae1817b8110e045321a16594fa7c1d1037fbcd2208158c625514f3464237d7c73b0dcc605fba342cb6fbcbc71391577ac3781adb39d4b1c2236a4c9579810d039c10fe556dd954d71e705c6fc9389f3be0089697dd6703d8bb8ff08c88bf6773082a56378b52bfb30182c9ae1512ae1c2b9f99b4f3d0b20f8593bc530c585d737540972bcea60e11441e07a9c6827031363990b383b6f42afebf55e5f20635ba731fa86c24d6908aed77e3a57b2138c0c83a5bc98ebd3a002c0a9c6 +private_key: 5bc2b53498cbfbe8cad9602f75187bd676b0b4995353374df1c4aac9d105b8172badd17b6707b89ca23568f5bed5969479557cf8a0abfa8b4913a7bae3720fa73c705655cb39c48137d2b0878429fbf44a0297b1dc71496de1c341290865d60b8bd34c761933b3f7cd78e42039a4377fab7c8c82b9cfa6b0358b0783b766e3a598afca3aecc59d0eec2d35a0a55210a94eb44377634a1c097635d851d022c5f15838bd299f6e1a2c7e8cb330515f595966ba717e0da12a2dc84e16902e6b022a48c4cabd27993e5587cfb4575fda0e67830078d01935e4b47861c893d3c59267404bb2238ca14534823a3e1c82a97047f1b32388c96f615c729feb7500125e17881bfeb2b7425151914c5bd24b479ea33bba133a56fb1bb155ac34aa2c15d77588ab13ed53432bd0bcea28b79c9cbde8e66d75e6ac227224299a3391a38be9ec2154751729022e588b341a062f6794494b0b549b0832d011ca6d04c976d76111f85456ac9c21649106a8b58b359c943aa7722c0b737393f5c9040e0a9126dc8ded3703ee7298e1424c18c2492fa1573de9b77ea9988ef88db2a61221c8729f0b0c88773f8f9553ceba7ae0d6c9ad7ba7919741fa140e0703c96034766b126a6f992bf13381366121d0205ef45a9515b5a05d8c6dcb293ae44469c8875c40813db41a06e935c80fe24ea9e178edea641f48519d6a6e6b0547c4940ae1178b234bc06f07129a6c9287dabd64f151f0f2be8bc9b988b71341c74164d430fc6bbcc4e23d36938e2a4a8ebb8b5a0d906e428089e48946b63bb2525954323421fcd76bb00245ec4761c5fb3ee5f255ebfa33f64584f6dc971189a07bb19479f99247c11b3318076c2c9c08457e35aa25973a31e1f0a82355916d5891f193b0c45bb1d496091d7a47a33a83a5f34ebdd9b8935601abd60768fa5c2ff2bbf2457aba1523a3007e09b90a400a0c8b23beae5b48d6e9c642d985376a09b8ca6ddfb493ee37a0f6551f9c9208229a36cff883c09b5239a55680967648116010645450da2175ec5e4a452c982ab3ced778a802644945678dc514daa144efc4b53a153d6737a6dc3515c4744e39c61f9fa8522f39384738c99faa3a7cdb779b9a7b75a5603ac55bf13620b647692f40594e144c378a3b5041ac1c63034198976bf9492b7393de8455c284b1d3b2b773c448539bb493a9a8f1fc39045917f40a8cf2a052008626423328417478856c1cb67c36a34507ebf38eec630ae5a73f7998344cf7be33268fd99492d895aaadf5164df7429af1816e516f2717a0f6d0858b3a0119aaa1cc041eb5172d465184ff312e23f766ad29746e78aff74abd65a2af2a0ca0b65cbc1f1a9b8544446c28c010da1dffb708d842bc82014cceea6784a35d74510503e8a8afb7985684253f000bb2c95524c0827401ae9b058bc65896cfe43b9acb3a00a475614136930bcbf0ac993e61236c24123105a6a70058a8d49a11931875f48f69a074d1757876f598a4a665ae6278a8e27d1591849857c42fd2a75dd4096359c4cee2a42620b62ab641da1bbc1ff4acdf2220fd0751cc8a3789c06500765c632a32bfe88d0f9bcbb9303eb1f6cae94a45d5f537c7eb7205d81c65863216f571d3babac57a6520a30a76f4950628cd46b88ab8f4c88fb33dfdb13089d85bdc7550647b257dac3c6484cf0e881b83f241b5d869b5076148607718e43ef56572a3aba527595c25d541ee1477f50773cc433d573b8c1599295b01b321c7aac1f001c65baa0d63650fc8c45f7312d1a7700fa1bf92092768c406934a8bb3c94951f17fde83804f2608d292999f53872b167d2c4c17cfaccc9ff37ff7542e6d097bfa414ede2453f2328408f0580aeaa7e67116cd895594452458675d93c03177c31bcfb57cd173006548966bbb6cc628c446576e9eeb602810a04fb126b37c45a6e4041df38330812fa517117400ae7f429ab1a610d9d09e9ed36cee0401d09a0d847b3dd2f826eee3c841b4526280225d106eeb183c816a6b8387277e588712279cee18c34d3162878204d4506f659047a9e126dfc756d946892d991b4bd406c83cb013fa8a9e7758aac12c0f0bb6c014a048d5457309a125aab0759aac0bdc347dbc7eb572386d71569198c6f0a6c213c44a14a22ab40a7f34d1ac821972710b8c10489b6e431f18744974e86c075394189349b00b1ffd5cac6072cc10217b0e3203e3f61e1d9281c2d208af83a7f071ba78546e273271ac1cc01a320f35e845f10c59bb8c97e1627603e51a06e532ee716eb83519c80a4833c7ab45e6951137c0f731964ed2197b033e17bcb5237a1128179a85d24f730a6b31ea0e52075ae2198b48106ad0e1225701313af1a7b675347bc0ca48d88c4ff054edcb1092e87ccf070e10dc093bcc9bd400490250b7dca3775b715f218448caa01a8d8c8c6577cc9f21a7e3e6208b2c42215794954aac57712a3845523c74960b57a97e0c310cf7b8798192eb9507fe65020f706be129774f10794f2296abd13587a78456b083a164bf23c801969a57591062d22bab23b61e7dd5b31bd54520f4080a4c6c01c6603f4b4b1aabb99681be0b9c671f496f8cba2a571502e0da35ffa9bd2c77a5e66809e4d54000b851b2226e23c1072253826f374842da312ff0931b7a85e6186f5e6a31276a2d40a81fbe135e2c86c328b896f07c2269f983b313cd92578882a321f0031fcb9a9e7d618fd3d543e34abcdddb98d4c4585cbcb67789283c442f8c5cc914427fb1a53f3e35b78c2110ba956defa035084c53cc9b6fa7946e11840087e8194db6607246c7b314ce7644b8e522cf494a6333dbcc23da197cea95c318797ef0a18c84bafbe968df375fd0c9981757aa8c878658722bfc2684e012af3b30a067ac996315b0cfb13ec45220c9447ad4374c78484ac652921328214ca33466f6024abb7a78cbb528c44a339638eef09d3ee370d3a1746053629e7a37eb2600f2f73eb9d572030598042315b093c0082456fab06ca2a4c9bbd4c651bb297b494fe7e38d5c8aa3c7cbb6f1189d4a2c02de0acdd0e2c7ffa22e83c63623a21dc137c00e07193bd28264ec0fee2259ff2362ebd1c252103d93645e92e398f46935109bc0cb50c619424db0461823d33fd8d271727554a4c86a5113a17de7bd17b47cf04bced6cabfa7e926993b57a6c0a693e251e3b90b7b17195ff037fd867b87109a8be90403060cb34b32688c263eb00194391ef6c978db4c83c8967a735895a70b6dced06016b3737015696f1a1945110a44f022472c0ffbd049c0925ab1d68ef3f775308c2a95e99865c04b17b34d28a1254c433313c972a7f51a48696db9d7ab71d4600c0563b36437fac1ba6ab9ad6e89630357485dac1485e2808de8869ae59fc6a952890c69695424e3bb9f27aac2199301dc6b36503699f2504ac5e35adfe08048f9842df3260abc3d209a1311d65c048b58111bc7fbd6953d21b56364a51d9c2419072dece82b9d93aeb99c3f0a5a6c3f276504c3697a7c19563abd84068e8a39373c1375d848400c663c44e6c968c3c61fb375eed10baa60cf6158aa7e39c99e609a8b0765e36a2fbca515e4581a0207ac3fd5b3b7a95f193a08511109f335cd1dccc09223129da93aeab93ebf397bb073bd6374634675b6386caa33f71e04b1b420a2036979acf22835fcc511186441e1f5858402af78ba99673125ce9331b6686821ac739fe41467ec22736463ac4415db238bdb9a32e1895e0445aeef16b12e818f33a435afa91f850549ed465fc026163f988582040274638eada37dc162bb2d2839ca934bfa44acaec450ab4436ee78a5e658134bf80f914052be1a605e69ba87005f4042a25569c29243157865c5bed6918da360c4b824c7ebc8157870962737d150ac5583907c0c0f0603b1dceca45e10467ecc3a4435355af8254aac26f411a37b2587f40cc023c1c497664de5d705fbd0c103e36875b168c1c732ab364e1a4726c1d8207e1830d73721dfcb55557352a6508469eabccca2ca706c1de5fab0a7647d2cf7b05e117998173c5b3958d483491f128f01889fdf00d0b668a857479030f0c16bb753794719e4e142f0c5a1a52445de8862cbe3377c383deae1817b8110e045321a16594fa7c1d1037fbcd2208158c625514f3464237d7c73b0dcc605fba342cb6fbcbc71391577ac3781adb39d4b1c2236a4c9579810d039c10fe556dd954d71e705c6fc9389f3be0089697dd6703d8bb8ff08c88bf6773082a56378b52bfb30182c9ae1512ae1c2b9f99b4f3d0b20f8593bc530c585d737540972bcea60e11441e07a9c6827031363990b383b6f42afebf55e5f20635ba731fa86c24d6908aed77e3a57b2138c0c83a5bc98ebd3a002c0a9c60409f3dfebc62eda14a11b1c03d59d46382c2c2a579009c0355da8a58440c49a0e145e44aae52cfc609e6f47fd7a6f6af877190ff52256d0ac5b05b89c3f449f + +# Official test vector 29, seed: "265eb2de7099e4bd5614e5de7f0c2a05c78ef3e8e2dd4ae4cb70f3e5e59c8d1d88248303f07de0c5508652da66b47222" +seed: 174aaa36410566dc15a5e62874218d7abdde0b2c0f30d877bb80b1abd5f5a0a450a7a2354f7e5cefa6f4a4e9a1c411eb9364506e9e1204a8acb3cb77fbd2c4ed +public_key: 0dc34b0fc991bea47b02a8cae2f81a10043ec8d655124b3ed56505296c5aa2227ce2ac04a0a31ca05575b2e55c01119d6588cfb529aa54e707155bb4f9a63966d9566bb65a95287591f715e6bc0d7fd1691129999552b1771b35a322c5145c7a40d79d6d9c3eadf941112c4f76d678cb0aab59b9a30bbb340e078bc2899951691f9bf84189a87f2af590f881027a489ea1bb89e3a8b65959ad503a5e051c5f398a654c708f9ea51bf75c6bfc25634145076a93aa6e6640e6b47158ecaeb621c606c065972c9f26a34736067161e6bd49fa2871631aee5b518ddab90f692929d5a7a6e76582e53dcd36acecb6a76dd9455358ba95eb8a70d3786c01960b367e15536b456408e4faccaaa139c8e9737ad6b8b0e380bbac446c73b7b388b319dc2047fb7338072a0f225b506253afa722c812419e9c739c90beed97ba8f684111900e7d1762a5c0903c390786e1445b615a1e054efb7b0b1daaab671a63cae7b55c8b6f13f10d55707650ea8d864c7e5217b572643e6c7480411489c9ab18400483a657185990bab58b6a734596a6123dfe5240b2f908fc8c3591490f89875e0ad3b06f6812ea973e6fb0a69886199b3b55b7d26a55501b43609b3d6a3981cab946049c10b5737daccfb2040e014a5f715b4c1f8b0406b3a3204602182450d10b019b388bfe31b5a5a9794b5863bcb34cf6f659b25cc95f0a42fa9305a0d647342845d5b28ff5c1727975bb48c5ad2c96b97ddc3bd4f0b40e9b6fe1138739f1a9ca3b969cf33ccb700fa9fba93ef565a8aa180cc3711974bda14ab85e3817ef4801c0c3b3f68403bc94cc7412ad044a220750b6ca963e3e052f310bb1474623f707157c8a7d67f95989492278ca5707ea6d106431fa5a3b88c39e3e360bc0288925932d44a2523b0980a221519ceaa65353a7483b7de6028744a2869bbc869a58bed2327b3c6a4aa7447a9a09bbbaf322d5914dc9d5a1ef8aac92b920524c6968289d7da06db2561eeea26fb764168c185ec20ccf2b57a89f2887720809e94c377b313cd5ebb7f71037bbf01bf85b675432b891850316f6b938231793aa3aab2972e979c7aa258735858434b6386cf0c5a9232f60a70624b4cbe9f10fc9e3a0d7605bcaa23ab49a222f66127a1a4b9f2bada03c8dcf330e1dd90131852b71cbcfcee91f528377d200433dc898c2118f7b6275f4e0b9a97028e759ae0c77477cfc26a1398cade7671ab89344140f5c3662c736107205a2cea71c3612c4eb063cac777b9d6b61cc0419fcab4908ac161674c6b4c58c53a5065c637d0a4c964e29729667aa949c39ea0797b6882951314354ac28d52c2096049df866bd028b1ac3b47cd2e648eb322134522ab2993db33491326a625e8739672551562b2829ca57ae6518dd4553146281fa57aa373412f22c2d0cd02b6141ba29f31612447deefbaf8f974aea75140db2b85de409db834c283440e377147b2b8204f09da14028f1960fd7c6b29ec1bdab0098ea22669d7123d36a52dcd634a447209bdccea731b47719745597955d3372cc533cc9b59712e770d7cbb63cf114cc02ac9933ab248617b9b284a8763a8856afea63c442ba7407905c6db13dde25a24062b7db428958e2b72117652535c1c24226266bcc7e87a721181ced66cd9dd1c8d86a1c28d0c335b66eaf7422c1bbb3a7dbc7f2a81c7a477a35717a23b486f307c766f1291be3afe8408026352d28a826a7e57819390f3341bfb8e258640213bb06b8aed87eb78b216971060b590f16d05d83801404ebc63b7304a0880062b4c1e235655b43c2b6062c28d4064a1a861a9844544776e8eaadc0ca66b2cbbb691460382b586e77856b8085a1d6795f82be8185c62ed79b2bb8a3ebf57150145892f99a27ec8d1701265cd16b5f5293955400a44192b0e47f399a0bbb9027f9d3aa1f5407465b8b28e2a87ab881be300fb72047f61a53b1282c13b65ec31045b1e0b779580017e1776e46a5018598799296f49c1447370af1227a7c000e327b40ed2965ebfc7a555803d4d34176e14bd6f9905c5c4e253062c1110dce0c22e74779f07846a6806eaf340bec965dcbcb1a2c40a5e6428d2bfb50ceab3a64cba6aed667edac0cbf03ccd8d8a56d73c70b122628f90e4c760ea21c485a0536f6f1632f900e1cb13208f442501c6cfd05027f5fae41abece025084a5e4598a766114b13b17dd16a4c99f255 +private_key: 55fb671a41c8a2850965768b1ea68a496a772291ca1bb79aaaa07b542678f391bd786579be185f883cac4350621fe531dde9a3729493e1e71530a5261a4cc20b41847d815297ba8415954ac0307543c34dae9b5007254c18414a01ac0fcc55707d906a73ca41a2167d64470b9cd6c082a27fdc62b7711b2c6d4aa9fa00c1348c7666b7a181bb0b84617a9f67bc9825c0e2011b4cc5b1c3f243501a56d27cbbe2f73897332f1bf57edf885f7a462d801089e9d96d14b9a891a909dd8aa7205545fd319598d3ca93e13eb0219a3674554c45238890cd54bac9bf3058bd0a6c7de7c3ccc98ab53c99f1e0bcd0f975d51c0eb11113b1144c8f46be95c11b6a7909aea01e3cd013a274354118b351e95c043073f4a3c0f8fc5d50570540281da1d0cd7401615eb29d4c15b8562690d96531e48003478b805e222043c0611c276940d58e41900c34862f0cf80dd072ce0f8cb6e948cfcef439333ba87dc04031711dd7859855a4493d4462d5b08bfa825c0a01972c333ee1291dde850a33eabbd83ac27dda737a0aca9692b197358d82438fa24c7721773a61a52cd2781640ab111b588fe4f7a8ceec4136115d30e325e5160975dc915cab6369c579f2240881a02276938845ca6c679942757263cd4216cd0c09d01696cbc83b84b430366c2a73207a586b8400f4a9b098bd53a222a51b31b3e1a5a215824f268790d620754c1a387001bc9a3605d94360f9b50ba29723d8088a0871a0b79badc669cf18bb95ebca4e53106160a71eecbd492757f2e98c27a47fba13c7519399cbc2a2121a1ae5376594159ac23b856888a34026904a3734141bbe75904d9d727486e644d7d1c7eeb4b7697ac925dc9fea40421482ade07b35879342b71426c8e21ce9ca3081d62e615661d1168e102779352571d884c1104b760e29bed2bc4f5e01bef7322d1ed2a8c0c882798781310197828792430530443481a253ced84b8b7ac4736452703298519d41bd59cb3c32a2271a592a0f754192a6672607a346fa3997b360f0a75b423397b2520cfcc44c0197c7c7a6443154ac6f3985c1256a0aec9bf72b1d8dac046c7376b6a424b5324ba04881afd25d16387c43aa57ecbb9caa055c6863339f420b09e1cc665982e73997e23179234250b5c047a9e5b656169734576fae1b970c15a9bcabc1742792e2a9bae6c29b391b6a91136e31abcdc859ca9d3a7a807c36db195c1731ad11da6afb304704475ce0c3a73b42be27172c8f2824fff7b933102d1311a310444a73cb2e71a9aa6b482c73317689235b49f44c7af6a02d5ab3547234944bce390756719cbfc6370b18ab828a6971f770182422a9f2eb2c8523605ab228026797fc1721aa942ae8087010a5bd2c2886eff0a29fa99daa8a91b8a1c6395544dcf07586ec99e592b995074fda2a716d8a86fb1005a380878c07243d708b1bb15bc2e639cac28011e461c34c17a47a0e5e07bed0b6761429b21c04689df8a2aa22400253801f41196a02522ab49c1b724107012ee3c362ce351f774c8943832f27732014c8918b2c8e747bb0cb531a3019204a441786ac3dad4532a508147a334fd772ccec01a07c021e2b59238d7b57d24a8f4c90b1b7a7546144c9fff2bd9b931eeea30fb2677d5a3bb24ffb4c15c0a222f151b0fc3b2fb68c96140c22765e36d471bda76bead7baeaea3e86296403a673b0c60389a66003da689f42c73471c0025364f86a66826b9e03864781073614d90eebfa1f266c4255823a37258f51c0839d2106a90171f1191035310abcc8522d814310b488e51bc7ae20c8597cb2ef11645c9b921ca2424f3780d6c87a17a9ae9fd0a5b15c6d9085c6e580a1cee699a624046595401a370912381a5a9731e3f3396070c2e2795690abc0383a71ea4aba69459123aaaceb99691a82c729d028bbd69ec903a60acc9fad24cedc2c391c4007dd324ca46581558cbc0bd4a397a776db07c41eda6c24f436021b4b269b105d33ae94a55594e70232c15cede461c40742bb950447064d21220e41673f98b57ffb9a23fe096dfbb4417e024ad4121a824274c75c7d457794c9034364aa1681c79ad7f3c3e308ce35ab8704ec566eb786283a9ed8eacb14e24ca349a581598e26967b88ba5b3e4a1bcc9c13cc74330d6409e0e1057c125aaaa4ba0dc34b0fc991bea47b02a8cae2f81a10043ec8d655124b3ed56505296c5aa2227ce2ac04a0a31ca05575b2e55c01119d6588cfb529aa54e707155bb4f9a63966d9566bb65a95287591f715e6bc0d7fd1691129999552b1771b35a322c5145c7a40d79d6d9c3eadf941112c4f76d678cb0aab59b9a30bbb340e078bc2899951691f9bf84189a87f2af590f881027a489ea1bb89e3a8b65959ad503a5e051c5f398a654c708f9ea51bf75c6bfc25634145076a93aa6e6640e6b47158ecaeb621c606c065972c9f26a34736067161e6bd49fa2871631aee5b518ddab90f692929d5a7a6e76582e53dcd36acecb6a76dd9455358ba95eb8a70d3786c01960b367e15536b456408e4faccaaa139c8e9737ad6b8b0e380bbac446c73b7b388b319dc2047fb7338072a0f225b506253afa722c812419e9c739c90beed97ba8f684111900e7d1762a5c0903c390786e1445b615a1e054efb7b0b1daaab671a63cae7b55c8b6f13f10d55707650ea8d864c7e5217b572643e6c7480411489c9ab18400483a657185990bab58b6a734596a6123dfe5240b2f908fc8c3591490f89875e0ad3b06f6812ea973e6fb0a69886199b3b55b7d26a55501b43609b3d6a3981cab946049c10b5737daccfb2040e014a5f715b4c1f8b0406b3a3204602182450d10b019b388bfe31b5a5a9794b5863bcb34cf6f659b25cc95f0a42fa9305a0d647342845d5b28ff5c1727975bb48c5ad2c96b97ddc3bd4f0b40e9b6fe1138739f1a9ca3b969cf33ccb700fa9fba93ef565a8aa180cc3711974bda14ab85e3817ef4801c0c3b3f68403bc94cc7412ad044a220750b6ca963e3e052f310bb1474623f707157c8a7d67f95989492278ca5707ea6d106431fa5a3b88c39e3e360bc0288925932d44a2523b0980a221519ceaa65353a7483b7de6028744a2869bbc869a58bed2327b3c6a4aa7447a9a09bbbaf322d5914dc9d5a1ef8aac92b920524c6968289d7da06db2561eeea26fb764168c185ec20ccf2b57a89f2887720809e94c377b313cd5ebb7f71037bbf01bf85b675432b891850316f6b938231793aa3aab2972e979c7aa258735858434b6386cf0c5a9232f60a70624b4cbe9f10fc9e3a0d7605bcaa23ab49a222f66127a1a4b9f2bada03c8dcf330e1dd90131852b71cbcfcee91f528377d200433dc898c2118f7b6275f4e0b9a97028e759ae0c77477cfc26a1398cade7671ab89344140f5c3662c736107205a2cea71c3612c4eb063cac777b9d6b61cc0419fcab4908ac161674c6b4c58c53a5065c637d0a4c964e29729667aa949c39ea0797b6882951314354ac28d52c2096049df866bd028b1ac3b47cd2e648eb322134522ab2993db33491326a625e8739672551562b2829ca57ae6518dd4553146281fa57aa373412f22c2d0cd02b6141ba29f31612447deefbaf8f974aea75140db2b85de409db834c283440e377147b2b8204f09da14028f1960fd7c6b29ec1bdab0098ea22669d7123d36a52dcd634a447209bdccea731b47719745597955d3372cc533cc9b59712e770d7cbb63cf114cc02ac9933ab248617b9b284a8763a8856afea63c442ba7407905c6db13dde25a24062b7db428958e2b72117652535c1c24226266bcc7e87a721181ced66cd9dd1c8d86a1c28d0c335b66eaf7422c1bbb3a7dbc7f2a81c7a477a35717a23b486f307c766f1291be3afe8408026352d28a826a7e57819390f3341bfb8e258640213bb06b8aed87eb78b216971060b590f16d05d83801404ebc63b7304a0880062b4c1e235655b43c2b6062c28d4064a1a861a9844544776e8eaadc0ca66b2cbbb691460382b586e77856b8085a1d6795f82be8185c62ed79b2bb8a3ebf57150145892f99a27ec8d1701265cd16b5f5293955400a44192b0e47f399a0bbb9027f9d3aa1f5407465b8b28e2a87ab881be300fb72047f61a53b1282c13b65ec31045b1e0b779580017e1776e46a5018598799296f49c1447370af1227a7c000e327b40ed2965ebfc7a555803d4d34176e14bd6f9905c5c4e253062c1110dce0c22e74779f07846a6806eaf340bec965dcbcb1a2c40a5e6428d2bfb50ceab3a64cba6aed667edac0cbf03ccd8d8a56d73c70b122628f90e4c760ea21c485a0536f6f1632f900e1cb13208f442501c6cfd05027f5fae41abece025084a5e4598a766114b13b17dd16a4c99f255a964f69c975bc276b67b828d04997c8caaf20600da330ec642633f9789858f7350a7a2354f7e5cefa6f4a4e9a1c411eb9364506e9e1204a8acb3cb77fbd2c4ed + +# Official test vector 30, seed: "806bbd111f27c2668318387bd0830f65ec21a51af01985ef48d03d64e1958ff7ee5133a4ebf6dbf36329bcaaf65f40ea" +seed: 351fe4313e2da7fac83d509f3103caf7b4c64a4d458fefdf636785ac361a1390f072d9b5a99f9c7a0a011e4dc10f6b600d611f40bba75071e7bee61d23fd5eda +public_key: ad4330bdc85f4699cccd373de5d7266e5530a73a42d10c9b327a57715539eb99030873689f47bf6871a00c6caa06e4b04a832c865b69293303cf838ac186b453d77088895db36163b1074a8e045911fa92db578cad284642bcbb44f844c6663f3f4c98cc8acfa1a96b6df57f5be10fc76477d306245670b2c796672331076f74480c2627a3a44421a01229509752a536e95ba97e85aebb920b4b1b1bc55bcb95fc76ed43b9805236cdb62861fba353f08409c91126661580123509c05208c8604389b2dd3b0f8fc94f432b41632c4ae1ca0bdac54ceabbcb743362725b839dc18add4b7795a025261139539641aa43a9c185621d13c33c579189244c884c047bab4187577c97639ca4abc631eba5e9b141e11b6aa8d562449c3ccd8757503a7ab358a24d2b36f2e1768fb24727801123354b6dc661f640883e0613c8886121b89336202eddc464204b1dc16b9fcd3906bb9a6cf8d6a176a43aa1b13200d67ad0e21f2f73186164a6fab968ea0427c82501c59c49488846489710d7976a5c812f78b5b7df2aaa6437054b0a03180c4a886b7d653149e8497b18b18e98e72f9815be90d252a4583f2de88c0d7bb10cea4d65ac1f59683db4ca4969a9b57ba65e06908f7e9267adc8c87e8b8d8d5651b234bc9ee1c65fe42a51368a041253e982100c25955bc39b70b36c67484f8df88c2066cd2a5339c471b60a1b81acc5922e274cea4a071eb71e788241ad1b7c41db1e972212e27c770e6720a7e67de941a1ca952bdbbc591ef78019c67dd184259bc873f045607d1440bee46f199a7d2274b4e40062c064368bf5c6d50046a198c89e1372950b7710b3b6376caa9bc32882a6b0aa9b7fae86cccad0574cd8b417047d30d41bfba0119b909142363d307a006265a3961c9c604a7b65384a5deb1c61f25f66fb3b7640b5c3e22b8ed488f08201a10c3b5a42b043965d4fba6f31b90c5a8a1d8b29a01d500be93225ab6acf77960afd2824f2283ce86288cb1a9b98c11b03dbbb0e0854731b22464331f6dc70e7e1771471236b5b26ce131649e77d46e7946b85593b2989bab4ce5d09ab8d745a64d53401bc0ca4855e54b20ca4811ae5d9192de398d9d65dd3a327499cc0ccaa9f9b2b547c5b53722b50b21c7bd2c3c7f67a15be8371e9d4583faabf2467a4d5365cf7d92b8de8a55de200b61185b89c83bdf817adcb67fc775a5bb19f1aa453b491cf1bfa8d51d0cc499331de7730877a2db14778052cba5d759e21a8cea550724f52bf25c2a31d7b117a4377f7a461ff92882e11a4a8c137ee5a4b7aa67f712838737a96faea898141a1b5165761401adbb650bbea1698267d324a3cb1d9933be8bc95d55aadc4a814f201ebf724fa024763563e2656b028053cbd16b32c20457349702702c4b453a277b318551c8b732378e3d7bc31a10b5ed975ab032fbff647c6340c2d5c91f68c1addb447fff01dfd4c0c9d925111948f001880b36588df16cd1b9bbe85973ce513662267214660340262273fb45f97f65da4e615dca4a6aa06c5e9ba0ff727775c84608611827c98c8b7717daa60004d2212dc28b4392a6e0333a77cb9400978b60a00a766f6264486c60af452fe92452156961f2467d013072f1c4cfbe08ea7885a74d0649517178412a1ac63261981adb7708dedc89b64e67dc2a8b25d98cb1ad74289372e48fabe360495b4a7472f3c8b7f877280ebcc6019648ef960ca23a1c49b684f947460e96f0e941408fa026c127900d84665768db52a8ec05696725b3dd82498226030b7189c9ae1c612e9a2c65c86c29426caf686d5b00ea0557466a1b04f8485a457bb83dc68c4b1cb01e7831e476453f084434151fc0c9ea3b7081ee00b4665048bcb8fab778eadf90c25f54d8f452381e252b2382d04028378e7cc7b3973cfb776249857cc611af8f91db8d5b9f5d90212b27d5fc9a794d53e3e002089a05a421a540b36aac5c803c8f5cd71012f176ca57a7a439db90bdc71ac65f0470d54188927bf3d2640e5a3a45d9021f876562fa7c6c2b37be9261393861c5f0336a47ac373e6874ec53fc9f90d856807675858ba1291c7134c4b8432f9782cf6855ae9d49226055d9c4b2f23c0238f20b516d6600fa72d8a5c2d06e1613dbb7fcdf9817cc299ef2614b6085517cca4006876de51659c317c7c9d15b2dfa3cfd29db64b6dee0f6e53b6bcee0ac31c086db16d +private_key: 0054c46a1943ae410f1d4b32823272687175a7fc81c1307f51e384fdf6168983525c430f0ba34722230657c2ce28f47fe354791b624ca6462f5634be583c822a55180dd8a7f00b21fc2b58d1a1746699ccd91acdde65280048302af4141a56000675448f00b57db19788678872abcc7f727af4e816f6a1b8ba7ab408ab03a28a28c0906d47b98b702b513d306212e96be12647c9586808025b74e37a593a47e2b00f6d505e38586885baa7fd6257d30c3ba38027f5d149a4d53ab5019386779423851f84c234931c341a216f84e503fb429183e8544018b78bc90c5dda2923b68ed2f47014683b3be50f17cc7ccb36b314b0528f8c7cbca19d936300970772af962ade7c7efc2602a9175fe0b11628702502a9a0143a0c7004ae1dfa2aefc3986c74348485a846981121250d07b78818302c41c20292143a9b5c6e22f61de390286e0c9c036b945fa5495a592ac3b2aaabacb11824614ab15114dccf02dcaef932361ea0621f860b1d399a22153140220497bc723a00791df15b6aacbcbfd5b16ee74daaf059e4b85e30e4bae4c53e2a133466413459e0857fc8c136e072f1b75be9a3b806335f5603a46c734edfe0994408b355442db7967682859d1a5b36f6a135f5100d259715e04c00236b3855fa25551334437198e2b317c1f54207a1b504475368d328b9d561ba33c9ac75231c127ec8c8b6807aa787b15c1bf756c923aee186a680acc4f1d6b3a70116016bcc3fb9a4d95b9f3596ad52895de27abbe0d42751804ec2f1818f5361eb68a9b0f8188e9647ec627d1751a8a5f37e6ed4a42e2540dc97272bb380195b75df18aa8709738f6207ba65affd669e3d23ae7bf1b7569aa9411561857921e048000a44819466ae28c631cdd68416e596abd9365642113b78901b1986f7b43f240300fd487689e63773c1555d1b4ece69304389074bcc99f1c88bc3068df61880d32c43b6326cfc11836d94aac626cdbdc6addef07086eccbf6f44850242a5d15219fa5598d45097171598cf6803e7b1110a04265544fff9612416446bc62cb3fe6718b2152292552bd05be6a30874111538af71b5fe08367f8a646b925e7d52cb4331ddae40e66302db02c87437c1ca03176edec873c883707ea0edc41a45c386a5782beef1c2353a97ee5a198a6e572a467aac63aacc528777d847ac835886a15415286b4e0b0c9089c6472c00b389353f0c6441d84bbd12bba40931bd2bc84270177c5db13dc7a2c913c4718a63d9470cf63aa35c705a37cda0becc0c024d1257590272d6a302f275595d18a679573f2ba283a162114f34ba8c06d21435474697ef301a0d8f50fac4324d32448940792a2c174948cab5f3710a030cd282bc97ae617bc67823bd33efd32af9861ae0b4a7d04b4b207d9cdd7244f23651424602d8ec1ccfd77a7b4317bf2504a06646aa19280a22b82a41157cefb3d3a08431d889e7afcce2c771bc5c604f71310983433cd59bd43a4adc2fc8776109beb59039aa70e8c1b8c7dc5bfed08c4789337efec6692db5cada88f0e3998e8b30e9a8897dd85cfd051c62bd9a9e12b47aa4015dd156616682e1c299357d57a2fbb22c2139cb562971c6360a7b607d7e2001ee26baf0b5957f73f8d94acbf8b3c56a3b72b11054febcf21c95d9ee82b70739846f06eb9966e280a8b007313d3084cf984cc1f7b34d7243627eb70e558b096644feeaba78541a06abbaf2cd331d8749247c2220e722deafcc5a76a0998d7bd62c50623ec183e4544f647943655cb5330381bf608536c81755319854296e2f3b52209ba9df6093536541fb654d0170c5901228a4c8f95914c1a2c87cf76a3cbf3c6a9fac15716001a2b7e0e0a8c00f984b08358e1902238e36046ab8da9ea35560313c476286e1abf559b407bf2080684b11bf44573f642002d364c35183a8b107c3952afa40cd68a22b666af575344be88a269e141ff171a6169a29a92a1b63cc1ddcc642808b6f22b65a8345ada90a992d91a9114480df287359b9b709814e425c1a397ad0714948ec339b96a229e5ac0fa985df1a19ed1440d1fc78c1fa77920abadc31c5256c52314cc970b72b0a6d84fbeb1b1f08657a636be530a5a8129a8f8137c6ffb5e5f549197dc2fe05259841b681a6393a6a7781fd03fcf592ec3b458d3027fad4330bdc85f4699cccd373de5d7266e5530a73a42d10c9b327a57715539eb99030873689f47bf6871a00c6caa06e4b04a832c865b69293303cf838ac186b453d77088895db36163b1074a8e045911fa92db578cad284642bcbb44f844c6663f3f4c98cc8acfa1a96b6df57f5be10fc76477d306245670b2c796672331076f74480c2627a3a44421a01229509752a536e95ba97e85aebb920b4b1b1bc55bcb95fc76ed43b9805236cdb62861fba353f08409c91126661580123509c05208c8604389b2dd3b0f8fc94f432b41632c4ae1ca0bdac54ceabbcb743362725b839dc18add4b7795a025261139539641aa43a9c185621d13c33c579189244c884c047bab4187577c97639ca4abc631eba5e9b141e11b6aa8d562449c3ccd8757503a7ab358a24d2b36f2e1768fb24727801123354b6dc661f640883e0613c8886121b89336202eddc464204b1dc16b9fcd3906bb9a6cf8d6a176a43aa1b13200d67ad0e21f2f73186164a6fab968ea0427c82501c59c49488846489710d7976a5c812f78b5b7df2aaa6437054b0a03180c4a886b7d653149e8497b18b18e98e72f9815be90d252a4583f2de88c0d7bb10cea4d65ac1f59683db4ca4969a9b57ba65e06908f7e9267adc8c87e8b8d8d5651b234bc9ee1c65fe42a51368a041253e982100c25955bc39b70b36c67484f8df88c2066cd2a5339c471b60a1b81acc5922e274cea4a071eb71e788241ad1b7c41db1e972212e27c770e6720a7e67de941a1ca952bdbbc591ef78019c67dd184259bc873f045607d1440bee46f199a7d2274b4e40062c064368bf5c6d50046a198c89e1372950b7710b3b6376caa9bc32882a6b0aa9b7fae86cccad0574cd8b417047d30d41bfba0119b909142363d307a006265a3961c9c604a7b65384a5deb1c61f25f66fb3b7640b5c3e22b8ed488f08201a10c3b5a42b043965d4fba6f31b90c5a8a1d8b29a01d500be93225ab6acf77960afd2824f2283ce86288cb1a9b98c11b03dbbb0e0854731b22464331f6dc70e7e1771471236b5b26ce131649e77d46e7946b85593b2989bab4ce5d09ab8d745a64d53401bc0ca4855e54b20ca4811ae5d9192de398d9d65dd3a327499cc0ccaa9f9b2b547c5b53722b50b21c7bd2c3c7f67a15be8371e9d4583faabf2467a4d5365cf7d92b8de8a55de200b61185b89c83bdf817adcb67fc775a5bb19f1aa453b491cf1bfa8d51d0cc499331de7730877a2db14778052cba5d759e21a8cea550724f52bf25c2a31d7b117a4377f7a461ff92882e11a4a8c137ee5a4b7aa67f712838737a96faea898141a1b5165761401adbb650bbea1698267d324a3cb1d9933be8bc95d55aadc4a814f201ebf724fa024763563e2656b028053cbd16b32c20457349702702c4b453a277b318551c8b732378e3d7bc31a10b5ed975ab032fbff647c6340c2d5c91f68c1addb447fff01dfd4c0c9d925111948f001880b36588df16cd1b9bbe85973ce513662267214660340262273fb45f97f65da4e615dca4a6aa06c5e9ba0ff727775c84608611827c98c8b7717daa60004d2212dc28b4392a6e0333a77cb9400978b60a00a766f6264486c60af452fe92452156961f2467d013072f1c4cfbe08ea7885a74d0649517178412a1ac63261981adb7708dedc89b64e67dc2a8b25d98cb1ad74289372e48fabe360495b4a7472f3c8b7f877280ebcc6019648ef960ca23a1c49b684f947460e96f0e941408fa026c127900d84665768db52a8ec05696725b3dd82498226030b7189c9ae1c612e9a2c65c86c29426caf686d5b00ea0557466a1b04f8485a457bb83dc68c4b1cb01e7831e476453f084434151fc0c9ea3b7081ee00b4665048bcb8fab778eadf90c25f54d8f452381e252b2382d04028378e7cc7b3973cfb776249857cc611af8f91db8d5b9f5d90212b27d5fc9a794d53e3e002089a05a421a540b36aac5c803c8f5cd71012f176ca57a7a439db90bdc71ac65f0470d54188927bf3d2640e5a3a45d9021f876562fa7c6c2b37be9261393861c5f0336a47ac373e6874ec53fc9f90d856807675858ba1291c7134c4b8432f9782cf6855ae9d49226055d9c4b2f23c0238f20b516d6600fa72d8a5c2d06e1613dbb7fcdf9817cc299ef2614b6085517cca4006876de51659c317c7c9d15b2dfa3cfd29db64b6dee0f6e53b6bcee0ac31c086db16d2a63040993f86bda57d8006a152c436e383ae407c7d9bd7a715a2f9efa507422f072d9b5a99f9c7a0a011e4dc10f6b600d611f40bba75071e7bee61d23fd5eda + +# Official test vector 31, seed: "ad540a9ce816d6fb1661e5483c44f6fdd00c9e7bd1a8ceda4b4c4d3697d4f78ed0a56954996ccb7da96ecb8f5cb15809" +seed: 9bc5315580207c6c16dcf3a30c48daf278de12e8c27df6733e62f799068ad23d5a4d0a8a41c4f666854e9b13673071ceb2fd61def9a850c211e7c50071b1ddad +public_key: 2bf6a6fce45eb9d6a03f11858433994e304b2d379c43d4670be6c9d65a61e50c34ed26c67e716933cc5d9ea22d14f86e5cc54967ccc82e3506efb8cdf40c31f313135b597b3aa72fe83b01ec88a97e32464733107294270f82216e11688df6cefc2a9332243eb75059fcecad20a681aaa17402fb36c6e091728ab92efa891d141c251895f4c79fe2db4b2253114be24d22a38b9d14532ff80e384778c8b99a4303506d08303bab91d6e05c68a0c0affb5dea7344ef5ab21a559cdfbc3be395834b4b8d8d9c4af6a9ca37a34fbf05669f99af8bdb3237c98f98802ad76a26eb353c6612674e8b4f93a190f293c80da025da00aec20265cba37b0df43d78982e6ff49a9f464e7ff57680e7455f816f815c733bec25e4227ca3257336005d0559b647585379542eeaa8282d8a90b7a885b0360c4c9428951820d189b873e246e4d793fa94c0211630f54510f7f06d116acfa35c856f87913bf61cbdeb0554589dae65a2e25341e4b93916aa4b738714526653e798c11f24563b2200319c60343869579b74f2ba9ddb03c6f3479a0ef3a5e5f80183d69034968e25892c28c272dc501466621bc091c0fcfa09a2b56c9f8cca6cda208a523ea6a40a4907c1f390780d4a04624466206594ccdb1b19d2b9cc407bd172428316692e09229fc963710165970471e1b554f322c1548a118f84169dd9731bc8c49d1b0130287024c391ca027065591fd9755ffc2a68d36b7dcdac3a54e0ce67e432e35695a3987b1d4a1e5ea32934c1cbefac253da2ba9714ab6a4a46a07950b6477c303067e0e673fc6cc800a26fcfb59a01e397f944335eec26002889b08a26338947dcca758eac669929bb4c608f9861812e06aa61f5b8b56299efe95109d57c42c066ead511bd868c2b107522043da8356f617c26f7082b078234b435c478d48a53d5a369f7907ce2be8370c0ba7347707b7ffdb25e6bab2fa85b5922e0bba7269fb7a9799a158f9806bc3589268d8514134aab1dc83d415a235ef49586133de1ba59b8fa1ef5493cf9dacbeee04f4b9a94b3daae423575682311bc70c49e65090a87137cb327419a2f2d5481d6b10044c6a551eb711bfa828a3cbf22e026d2345dca2415b6d9b03e9479faf589ea02a12d1c03939935e8b225d7c18534a2cef060456bb58145337e81f7346e057bbb98a8c0a312f784351dcb11a1fca7984a2443b409ba903c3024b8da9a8b6aabca90b74a34b532bf01c7c1c1c7ce05bf08c5c65164a01f64c86797317dc03b2d69c263390f9e411df4f4508d7b03c7b473a7e195e8338cae5b89b85465779029c0ac711653b1c7a24bb3b9bff0c612887c12a39c2f5bb2920313cf3522396eb79065bb1e854a8956f7ac2143abb4136b0682bd01275506a765175c4b7648a0dbb875e2864d52aab697533512164be2659c57151c4af898d689a8619726406110faa69f61320e75d3a05cc27febf609e52026c10c01c30118ee3693a7293f4f7cc4d9f84ec37c5f38890a6a58afce1855d4d0ce1f0a577790423115c59228b96bd62d68d90f4bfac9f17a7597a492e5711b65d8626e568f0150a458201c6205a81fe74a591b547be842765723b57503c3b352478b304c39b22b147bf6b5bc489c2dccd44c9f206b7cf58fb3faa3c8891524faaa88479b0c4051deb63eab53822f84935566ab7978c1b9e5cc043767c109bb4663960a534a750cae177aa33315584138138d52648aaa5cefb09f5cd58d008d4c69a1c85a242dd63a997385b529a288758c427ba15b05642c230c8a0180938606c6e1465166f128a35ca3855657ac1b3677a0a15d094ec68caaf90cc1958ba0dbc22169f3853f3b7d56f4bde7bb2c1c71c8c4c95299d95873f89a17a4583bb9198e0279a45691a3107ba1294726a385ed95163f0bc3c609c01ee201c5900eb763518f212f14723314715e7bc84b75a611c481cdf858350de0495d1c020228b004624900c300cd018166fb4dd217cda3c792da49a87a3bcac52542f3b3243f689ce69c1946a134a97061c83134ac52c92d97a458b7b38dfb7f42476b6c5c272c71065e5159121484d4a541311c97fca3488d13b1de64610483cb3a9551cf4a3317d0c76766c777e526595539ad17bb6c184aff73b6c4eaccd5a14ed1b1b836975deeeb8909458146938505dba5dad77c1a3acdab128b36dc1e94a121c545e3515ed56687f8911eb5e172 +private_key: c5aa9d405bcc9af610795279ef2403c6f92389332592d0adf1b3a5172c795b483e1f600f2c79a7a683574076ae8941b68fd17793fcaa9cb60d39373da09b827662835ea227ab05845853979910154dca8ba44c1511172123ea658b519a53695e1315accd3c5855e03c1e40a50e10666ba253ff23b1377830ca1a485f656b24662dd3eaad239553f3a50b2934225b2647658aa1a21828a413944a53135ff9516850a2b0a66b8d502a17322ca87b3c09866059942bd8eb4f44d646e5a80a38687dff595e92b2250c2331dfd2495964bc03a2ca5066cea671a5cb0ba079788366376f8078804e98c9493a9556d044e7d218ddb83597f9bb33369266711f0ed4514582b25f04aaf1d0247c5624eb5555d0b08c14d307b7084e41e1185465c193ab04d4295790e4451dc25491796d4b3c47b1051d021a91440b869a75848e9894c8d393c534c4b2ac1318a5cb482b53f9ba76203331e87569803b0fc2e96072f777f61b008941642fdc76e9744faf9c6f06c381f5d54492eb6ccde84f09101501c60ddda80788c4619cd48defd9a9ca6576dc451101d37d422350b4357c49a90c291aa393263cfcf887c1363769c40c76530877dc9cef88bc13f740a8612ab43599933b7a3a7495a03800b9dc66be070d8096976c85962f3c75bad40c71457e5ee929386c7f65869f3e3c067512b2256112ffe557881b873bd313a021851c581259c2cc1f3617b38cacbf4a5bf2346623f2b316e4c82cfc9c4ae2c08742709af023b91ccdfa0b829fb047661c8dfab33bc9ba334328a8f22419f2f8768039c098806937c05cedf34a8d65930b07ad66cca3ceba2de45694cb534f7ea881c2a2c8df9c9f52163feaf0cf199cb81f1c05d1ec3774c203961c2d14c307bcf4716f69b837b7c894843766700cffa87a5b6b655fa304d8b2a8aa32637af967814b7915e5283f1263ed03469768783fb757f4b8385f7995548c75b98c24fed4b2a3b28729924ccd618a21f9385c5b577642150534c31a15a854179e1a0398df0c2c69a76816979f0834000378bb9f4ac43bd098ad6944b2cb028924b201b6cacdd87f25a67e676c738931acb4c42594a4ae4354cb87008cb2f486dd50a16e0228db6b547e48780e523b8841cfe8b636670ca397990550c540e2572349947d15cc46e186cc3197045d77b8dc85943c0abdcdf1629f4a74092a65f579b33f5233ed47916f1475aa284675972c7611c1f35c41cbe6a8f1f18f3bbca2f7d9380e2c9ac9126ac3287a09e80a041531d83b39591a9618232f990862d125a29b85a1de31bc4380c0c4f56e8a93a7a332a86d114faa06189f91b76ce79cacc88bbb2360599c0e9090226c82a57c5c1403745703f6b55cb9bfee17c4dd382c17da5585b823f9a037bad4101f07a301e96953e02a32a31326b04e02a52928293af67a6fb115444f4a4b58ea17ae716d61806094a301bed3015443abb0389afd98196611cb1e0c21c951517717835e7868c4bb8c958c630b0c78032367b5eb30100a15ad9949e8051c9bab638e8c0e271cab8a3a43998532469724979879dd46c40426cb49a29f987c9beeb92c1a393d6132921b019791d776728617597b0f2738916c99a9d889619bdbaff69050e6b0c906f3048b8811a8da04aab71a1ea85e2b07ab021c089dfa848800aba0d8838dd8af43d82abb6c664e363ba30b0e383214801cc69191bbd7913cceca3a45b52b9688957843bbf86112c70a64b0e2a1c3c89ac5d881848616ca3838c3647ae686568883550e93190eba3b1a08080b46373fd05f8ec81a535650c5281843279073c0802cd33a7caca35547c0740256f8b7ccb85c790aec85525759c0b22b15d268c9755bf020bf6c913074c5a4118bb45b025372dbaed0f96329c245052c8e831c5966105ed6d098a4e4527768cc3cdb47eb343788c9b5ad2b4ef15b24d8193b5e9b6611e3bcfce348869b07bba361035b54484257d1d65b3d11226f31c299607674c783b81aaefa6161656115be771991615a7e5a7b4becc21dfcb48738cbacd764d1b8b8b9080d6811caf9927a4bc68dab415628422b05530ba495101a9b336a896457837d6694bd568290e2259dcbc302ed2baa96292536b9a0154771b0c791b7ec8c4ea2489062160f8691cad483b020afbb076e0ee7c54188b32bf6a6fce45eb9d6a03f11858433994e304b2d379c43d4670be6c9d65a61e50c34ed26c67e716933cc5d9ea22d14f86e5cc54967ccc82e3506efb8cdf40c31f313135b597b3aa72fe83b01ec88a97e32464733107294270f82216e11688df6cefc2a9332243eb75059fcecad20a681aaa17402fb36c6e091728ab92efa891d141c251895f4c79fe2db4b2253114be24d22a38b9d14532ff80e384778c8b99a4303506d08303bab91d6e05c68a0c0affb5dea7344ef5ab21a559cdfbc3be395834b4b8d8d9c4af6a9ca37a34fbf05669f99af8bdb3237c98f98802ad76a26eb353c6612674e8b4f93a190f293c80da025da00aec20265cba37b0df43d78982e6ff49a9f464e7ff57680e7455f816f815c733bec25e4227ca3257336005d0559b647585379542eeaa8282d8a90b7a885b0360c4c9428951820d189b873e246e4d793fa94c0211630f54510f7f06d116acfa35c856f87913bf61cbdeb0554589dae65a2e25341e4b93916aa4b738714526653e798c11f24563b2200319c60343869579b74f2ba9ddb03c6f3479a0ef3a5e5f80183d69034968e25892c28c272dc501466621bc091c0fcfa09a2b56c9f8cca6cda208a523ea6a40a4907c1f390780d4a04624466206594ccdb1b19d2b9cc407bd172428316692e09229fc963710165970471e1b554f322c1548a118f84169dd9731bc8c49d1b0130287024c391ca027065591fd9755ffc2a68d36b7dcdac3a54e0ce67e432e35695a3987b1d4a1e5ea32934c1cbefac253da2ba9714ab6a4a46a07950b6477c303067e0e673fc6cc800a26fcfb59a01e397f944335eec26002889b08a26338947dcca758eac669929bb4c608f9861812e06aa61f5b8b56299efe95109d57c42c066ead511bd868c2b107522043da8356f617c26f7082b078234b435c478d48a53d5a369f7907ce2be8370c0ba7347707b7ffdb25e6bab2fa85b5922e0bba7269fb7a9799a158f9806bc3589268d8514134aab1dc83d415a235ef49586133de1ba59b8fa1ef5493cf9dacbeee04f4b9a94b3daae423575682311bc70c49e65090a87137cb327419a2f2d5481d6b10044c6a551eb711bfa828a3cbf22e026d2345dca2415b6d9b03e9479faf589ea02a12d1c03939935e8b225d7c18534a2cef060456bb58145337e81f7346e057bbb98a8c0a312f784351dcb11a1fca7984a2443b409ba903c3024b8da9a8b6aabca90b74a34b532bf01c7c1c1c7ce05bf08c5c65164a01f64c86797317dc03b2d69c263390f9e411df4f4508d7b03c7b473a7e195e8338cae5b89b85465779029c0ac711653b1c7a24bb3b9bff0c612887c12a39c2f5bb2920313cf3522396eb79065bb1e854a8956f7ac2143abb4136b0682bd01275506a765175c4b7648a0dbb875e2864d52aab697533512164be2659c57151c4af898d689a8619726406110faa69f61320e75d3a05cc27febf609e52026c10c01c30118ee3693a7293f4f7cc4d9f84ec37c5f38890a6a58afce1855d4d0ce1f0a577790423115c59228b96bd62d68d90f4bfac9f17a7597a492e5711b65d8626e568f0150a458201c6205a81fe74a591b547be842765723b57503c3b352478b304c39b22b147bf6b5bc489c2dccd44c9f206b7cf58fb3faa3c8891524faaa88479b0c4051deb63eab53822f84935566ab7978c1b9e5cc043767c109bb4663960a534a750cae177aa33315584138138d52648aaa5cefb09f5cd58d008d4c69a1c85a242dd63a997385b529a288758c427ba15b05642c230c8a0180938606c6e1465166f128a35ca3855657ac1b3677a0a15d094ec68caaf90cc1958ba0dbc22169f3853f3b7d56f4bde7bb2c1c71c8c4c95299d95873f89a17a4583bb9198e0279a45691a3107ba1294726a385ed95163f0bc3c609c01ee201c5900eb763518f212f14723314715e7bc84b75a611c481cdf858350de0495d1c020228b004624900c300cd018166fb4dd217cda3c792da49a87a3bcac52542f3b3243f689ce69c1946a134a97061c83134ac52c92d97a458b7b38dfb7f42476b6c5c272c71065e5159121484d4a541311c97fca3488d13b1de64610483cb3a9551cf4a3317d0c76766c777e526595539ad17bb6c184aff73b6c4eaccd5a14ed1b1b836975deeeb8909458146938505dba5dad77c1a3acdab128b36dc1e94a121c545e3515ed56687f8911eb5e1724016ac096bf081a60fd2726d6b275f550c50021d42608c49c93385828573f89f5a4d0a8a41c4f666854e9b13673071ceb2fd61def9a850c211e7c50071b1ddad + +# Official test vector 32, seed: "288a5f2684d862a86d2790afddddbac6fda934ee7d2e6da1508bb550838609e8107312b28e00a6c01706374ccd3aefa7" +seed: d8b907b34d152ff8603b73051f772daa71eb902c47b7e2f070508269d757e02e36b817736cbc5f7b1dd6eef5fe6332fb1a598f3871e5470d440fd2ea631da28a +public_key: 26c68b1ba4659966cc95d79851f03e029a736c3b4809f9c366093967c53769b4796ee76b4f1277f1407b8c478fc1400de6415c2a231727303c86110af4b743aa85b73e38b41b819021b07d1ed5c6c171077e9c9b6a678d67b94958c66921e9cf0f573585bc3b47323f32979b91c411c9133b3b8b03199179c6f457f106be4201bcf2d142a4814c5e166c17680fdb2a1296890a89c802120585951a9051fccc4c42001346c9add97f93191c720466f95c5590b0cb8046a470cb50a3716a063135ea4a0219217b4d373efac8625ef44e5c0761bc0404f4ab87bd8abb068c07da5c832de7530be88532fbb5d8eb5c6023a5f0db1aee3a50d2864601a579e6dab597d6cd29208c48f075d42c6b27aa3c3cd837e224bdef354e20168c03172a16973224d50cc0ac7f60fc9b0afc7f399c29a9509f9bc3abe7298303db253dc04a69bc873e874a43dc28fba6339e4152e4399a3ef1055bd81099b33a5087b816ccc668a75bed05650d37966d058d6ebb2b3a819218036c2ba064ebac797c671ead151c121ab88f6c9395204e714310a8293c64bc9789864f93569ca043b856c8412ad985d8206b6e7485f1956d7e616104f720e76459bbb0c874e45479e67233137875c82dc6509cc124bc184a3dbec02cbb08b989103fb59c378670be58f0a96a694d71062e6af424b6745fd9130beac38d297a5f1ac783ef064084b84aa06ac9c2680e8db2487cf43bbe6b8574311a4bd99d733a1b6a751f68401938f4091d25837120664033770d476096e561a1b03e8cc878480a015225cdc1d0719be196b4aa94074c290590988e9b4a4ebbb4b3e5477483cfa6860219237924641cf9a2a7a1219a8a87bde9d08166f0c3081297eda4737d082ac5617cc7c36d428b9dbb7237c122676ce932fd01aac625b5db503a8042c0112714eb43370b5b5bb0d53378a5b6f738c874dc7a7f1c15987c28112857a4bb4310788375d9aa0e60c59958c7f0db809f688f7640805c334e9b1aaf78761d5107c12618b81ba12a1258c4b0123eeb570ccd9924084b7ae3473eccb429ae0c7fc059926f25542911a8738b0186c404f2f107716b5d2e228f91306e3bda12a9b281a598c52228330ef93962d085adeb6beb1076969844e1980295964f9f115840753c15674c86119909d111719182f880ad9ee9792bdc128a8c4df1da9b3cd43301037b192abdc694099bab87441113c77a7f7210764cfb463a96c4007108d4537f29d4859d305987930fd4d94c796cbd55452d10e9b8723a6165ccca8dd39741e94418812291facdcdb453529960d850a40745a022643cd1cb70ec330a6e190ed04963ee28cc774198914b5bfd7c43c6614007d49dda88c1d8b42e05a388f4db09ff1a394b01547155c79ff4933a28568e172133515eafab53b86a078a1a62b114b9977465342a61ada1a20c236d3778250eba35f8d36ac0d58c91198d4974610181bea1cca0724061976a7aaf161afa1b111f0b0e5b835ace9ac1fda361048a9b0008096b41bf7c619af3299c5abb04499c272211931f7b6528c17d5f52405097afe5e0c6ed2aa2cca7915fcc2543b4c8268256cf49936a858f7401117b80b18b081e08b45a0e828bf830c13fdc55fb468d99e8107b93616da437b90a5b52896330c53cf3e28bd3799f65f28bd5f0406638c18c8c9838c555a9b015dc99a61ac330fb11654831571fe667f208689d1c045517af836abaae37184ec603d01a918733362942632644b9b3826ed0967e6db05a6e3ca77cc1604174a2aab6ce72fb1eaa31480e235be79c1c25832ccef512e6c65261f2c485cbccf4062a81912abdbbb3c98c5a6912388a236161e7b8283965536908c0145bdc170bec33c5b2e437628b452aaba7f3ebc8fa730147469d63eb8294fc3cc9096781e58d0ba64d6dd6837812b530e9077a5c5648aa6cc024069150c5acf26d3cfa2d658ab18b86b1eeac4ae2422d41704b9982c8db14bc53e0721123a209d67999c9035ea07f3485ac50e35f85379396c620ddf159c3a4cd57fab15b53c8f2e6aee06c6f2ca02f0d99543368ab70b9bc3f655830d7cb47962d7c3789ddc893ab0a1ba3e1170590249a594445135aaf71a902d9aedd178d88d980345190d72b710ba08077fc868e86713be6bb45652a26c73ca91089040322801b9c68de70662248670f323f4233c1a3c0937dc86f0b6476d12f426868be1b +private_key: 23f2a309696a69c78a5272b1318a02669321e5461de8166ebcc0a85df06f30782c29dbb0fe921b9c7c54eba9771d7b52887b55850234de9b296c925420567fd327842af26d0ef1cc1ec393507c540f27184f297340651ec5a0151cf385ba7a8b82156cfab21419633338708212364997ba39755864b368c333397bef42609f4b09c68a096f086ab6530a3816c35d6170b4b28479e39f3a5c621f4198f8b8ba5cab50194bc8490a227c473854f9ab021851eb1a405cb236f8937723d74f0963a67dd465fb172489c594cf91517c3c0dc20c6bec78ca1e52373a57805c30a3b319ac204995846c0bf1286cddb73f777522dde85b43e078c74634408c5e14777f74f9696e1c0703d9a221f04592f4218988ad5cd0b434541be033cd3a28b039c22c77ab9fc1e477e6bc223703610c4076ad3b583c9402ccd26841a55074dc27ba3981a9552578644895e8279c02c39cc8c22da0b11f16ccfb3750cdf76c333ac9988a23f1bb33030718279582fdb578b37512ea084348bb52fbd63c365951d9428468310821210105e0600b5723416b62a72c92c7a26642e7c9c562be22bc9b5b82a16a00069b104b6e359328d0c78af04bb337415f5a14c5730681e3c323098f117a1ff85cba1780cb8e51690d8a8565f9739d15391fd7b6aa2091a828a4bbaa45d80b568fc59c77375848cb44d6f5a76f260fbdf6223ff80b3f1229992a7e8421acfb918d28324c94350dec894b50e73e084026be12733146bc4ff3b76061cdc27470052175179c2dd2ba84db17501d41a16cc183c8d0c2318480efd5632e630b6c2612f0c88a9240017ba431c5a8629107af4cf08614f24e44808949e75c283ab36092266ae41b66d67aabc836c7364525ec4db7ab972d46709ff08762618d7050a3c165b21c5611de2aca9de5a6d826c6441b4894f59bdb93690757461579024feb4531abbe20d0410ef201e7f35ac3d304378971df8855f992cafac0ca7d7c277907d071cccaa84b3cb2203a72bb3d7f0c3e08321c7bb944a4a19fe794544c28181d92cdbe62ba9c270df5d646e1b05adccaa2835aa8b40a8b1741b10cda223783a788f36a3a8c00eed901c74b95b009a04fa169d8e0512e28266d3348774c7248d6c7122362661c5a1146103d401621434198963f26d3459c6572b029a3828bccc1ea35be549bae2c1aa094374061492636989bc8528d2a7ed649c1062a10c372c7635a4d0155a12b82a3656a491e1041fe25522ce39ddbb144a0ba37dac28608794c87743b8884b2fb2cb2dc1a37fdf34718813ab58b8f73c0742d2595802381748736458a846dda95df2740842411661853de6a8c04d1cc31975a8b8b3f676c4636a606dbc0906d101ca6e290d364b4a83b1ae5f461c56100d5d48a93c5448c12c67da30341664f2f2a35b58c25a3397462308170ab80a95780ea1a4e650c6cbd90755c0905026a42d4001612289e7a4a0170b9907d689141138de4460d143744b5e4975f027d48186161458c5d05cbccba6ee3a0a88135b94d0aa28db8b61131783d63224fcb4962d83ddc39c08fd0773642340d93125e83bb31838e786a2ce3a1a68a4084c214b9f304ad8e4a13e80bc168f8115b378fe5cc0a12468b3c24ccd2dcbaaab7bb4848c731e68810b92342b77e6e207d5abc7b93118d0384941460249a3c495b617c35ab97c912589c76313b3cbe21a3ae88d9b0e93a2a24d8449b6816c1045760e7ab5b37649a97938fd4317f3984ccd33a0c6388dec97f4c0b685f536a30e5c06af072f7ba2c129c05df5c40c7aa3e633aa44566689008506ba90107817205916df72b97eaf79ab0d5c97a483f4c9825f485679ceb0d15c981f1605a86c637fad32bdfa800cee7846f6cc52df8475b170316815cef36137c2378e9e27f8121b5b8123a1fe62589db2108810cd360b108018f5d67bfe36ac51ba1c56485cd8a88918cf70141b39ad513846413342be9a31f62691d221df48c125b1829526290c71ca471868c6df5a5b1a5cb14052a46f34e5d5b1e271251427bc4f7f3249c220341261d102b31979821de60610f9323da66061311ac2f2413ef97730b0a38e436958daa13a4f015cf96ca59d93bb56c58e66ab56ad7ca707a44cc1901e5866c3a223831faa00ebbad437a0a9dfa83bd32218bf66027f82d26c68b1ba4659966cc95d79851f03e029a736c3b4809f9c366093967c53769b4796ee76b4f1277f1407b8c478fc1400de6415c2a231727303c86110af4b743aa85b73e38b41b819021b07d1ed5c6c171077e9c9b6a678d67b94958c66921e9cf0f573585bc3b47323f32979b91c411c9133b3b8b03199179c6f457f106be4201bcf2d142a4814c5e166c17680fdb2a1296890a89c802120585951a9051fccc4c42001346c9add97f93191c720466f95c5590b0cb8046a470cb50a3716a063135ea4a0219217b4d373efac8625ef44e5c0761bc0404f4ab87bd8abb068c07da5c832de7530be88532fbb5d8eb5c6023a5f0db1aee3a50d2864601a579e6dab597d6cd29208c48f075d42c6b27aa3c3cd837e224bdef354e20168c03172a16973224d50cc0ac7f60fc9b0afc7f399c29a9509f9bc3abe7298303db253dc04a69bc873e874a43dc28fba6339e4152e4399a3ef1055bd81099b33a5087b816ccc668a75bed05650d37966d058d6ebb2b3a819218036c2ba064ebac797c671ead151c121ab88f6c9395204e714310a8293c64bc9789864f93569ca043b856c8412ad985d8206b6e7485f1956d7e616104f720e76459bbb0c874e45479e67233137875c82dc6509cc124bc184a3dbec02cbb08b989103fb59c378670be58f0a96a694d71062e6af424b6745fd9130beac38d297a5f1ac783ef064084b84aa06ac9c2680e8db2487cf43bbe6b8574311a4bd99d733a1b6a751f68401938f4091d25837120664033770d476096e561a1b03e8cc878480a015225cdc1d0719be196b4aa94074c290590988e9b4a4ebbb4b3e5477483cfa6860219237924641cf9a2a7a1219a8a87bde9d08166f0c3081297eda4737d082ac5617cc7c36d428b9dbb7237c122676ce932fd01aac625b5db503a8042c0112714eb43370b5b5bb0d53378a5b6f738c874dc7a7f1c15987c28112857a4bb4310788375d9aa0e60c59958c7f0db809f688f7640805c334e9b1aaf78761d5107c12618b81ba12a1258c4b0123eeb570ccd9924084b7ae3473eccb429ae0c7fc059926f25542911a8738b0186c404f2f107716b5d2e228f91306e3bda12a9b281a598c52228330ef93962d085adeb6beb1076969844e1980295964f9f115840753c15674c86119909d111719182f880ad9ee9792bdc128a8c4df1da9b3cd43301037b192abdc694099bab87441113c77a7f7210764cfb463a96c4007108d4537f29d4859d305987930fd4d94c796cbd55452d10e9b8723a6165ccca8dd39741e94418812291facdcdb453529960d850a40745a022643cd1cb70ec330a6e190ed04963ee28cc774198914b5bfd7c43c6614007d49dda88c1d8b42e05a388f4db09ff1a394b01547155c79ff4933a28568e172133515eafab53b86a078a1a62b114b9977465342a61ada1a20c236d3778250eba35f8d36ac0d58c91198d4974610181bea1cca0724061976a7aaf161afa1b111f0b0e5b835ace9ac1fda361048a9b0008096b41bf7c619af3299c5abb04499c272211931f7b6528c17d5f52405097afe5e0c6ed2aa2cca7915fcc2543b4c8268256cf49936a858f7401117b80b18b081e08b45a0e828bf830c13fdc55fb468d99e8107b93616da437b90a5b52896330c53cf3e28bd3799f65f28bd5f0406638c18c8c9838c555a9b015dc99a61ac330fb11654831571fe667f208689d1c045517af836abaae37184ec603d01a918733362942632644b9b3826ed0967e6db05a6e3ca77cc1604174a2aab6ce72fb1eaa31480e235be79c1c25832ccef512e6c65261f2c485cbccf4062a81912abdbbb3c98c5a6912388a236161e7b8283965536908c0145bdc170bec33c5b2e437628b452aaba7f3ebc8fa730147469d63eb8294fc3cc9096781e58d0ba64d6dd6837812b530e9077a5c5648aa6cc024069150c5acf26d3cfa2d658ab18b86b1eeac4ae2422d41704b9982c8db14bc53e0721123a209d67999c9035ea07f3485ac50e35f85379396c620ddf159c3a4cd57fab15b53c8f2e6aee06c6f2ca02f0d99543368ab70b9bc3f655830d7cb47962d7c3789ddc893ab0a1ba3e1170590249a594445135aaf71a902d9aedd178d88d980345190d72b710ba08077fc868e86713be6bb45652a26c73ca91089040322801b9c68de70662248670f323f4233c1a3c0937dc86f0b6476d12f426868be1ba08c74eb9f3d9296c268dcd23c66bf0250b222854a5c31830b7431ccd3ed53fd36b817736cbc5f7b1dd6eef5fe6332fb1a598f3871e5470d440fd2ea631da28a + +# Official test vector 33, seed: "4635dc5bb92ef98cdb6220df0dd717c7f8158375eaa2b78fc3f0b58e9c9653e92684cad3461d9158a481da3d14694c44" +seed: 684a29e4e5480a5f2533e1526b5fac8cdf5927f3d85087c71f928c59690eb56575d12195ec32a8686d0600e45d4a7f54219b0d7a3826d193a51b9156ecf2edd6 +public_key: af6c50f1421cc8e1532bc6afdfe7acf2a43b34130fea7ca5b1409ab0f10dfaa5a5f0e7b9a62006f1c53e82b5c7ea427009c990bf31a939ea2705630164445715bc5c80b3906739c46a4c4cf1024776037bcfb0716d1ba00110637fc177fa1768e73cad8fa4777e13aac74338513c516715b645e3bed722382950b132418fee81639d448eabd55a94c66a34eab68ddcaf1c756a4907bc3f5115aeab5320f3b9bbe84e0d885fb784af7fd8c1eaccb37642cf39c8a24c4903a7e80578ac7e9f2a95cd806caa200e23873f751636cd606d819731cf1b812afa2ed24381a52b4f5fba658618a02e0418d6823e7f418294c81032936559a77f9c014d8a3b38df8bb17b7a8c3b45b53ad60b0d9929a21a4ae3039366f894b1082db5f3cf2f13381d53827b5a568fc5234e099d6b94bc1a013ddde944b4ea13eb52bfa880716b1a10d8827a033878986155b7f2944a63a2cc32bbd61907125475bc09b0ab76222cb4c9f2e80a00f9b71bf9705e3576b5a96f6229ba1ce06fa1b2079cf66c59f30dfb88c1f9412b0b2ac059dcab8782abe57209188bb938d08bda140a0eb08de0db3f8558c403c725a77aa1e0563a54a77f32aa30cb780f4e562716075763e9c5d470564ec12cdfab424ba970c51201081193741a5e358cc7d63064a7183d99b28ddc5b0f10374ea9710193385b855a259130bc490041f76a9d661483aa668aace51c616804b5e7c1bdb8762b73b39f17785af94b355b0fed72083c2b71efd1cd43c1a9704a93e0e5752e99a2ef115b6ecabc74cb03bc091038f5701659a0d4bc693805080d6a5c81a0273be9149861c461c47cf496cfb22526d3fb8ba5a3396dd19a8477611b814b76d5c8191ac1c8190ac3b12065ca4ccc879d5f34bc4479a5c8d4693d8771b434c4b8e8b8ae921e01a131e9410ed11c505d226722e011f2073b0db34d10c104afc2656dd053e43a8db7c00fe705b0ba520980dc71e834127c08077806cd8e82144d50448dd59a085776dab69e42db0e7e8ccfc010a140b50b50e09f233aacd3da972aa40f1d1241d718b54b6009d3daa090186cb167c1ab3979c8356397e598502422da2935edd9c8c44b90e8c50473119d26e99575c0c328307e2017b515f33d4d2821bf341480780b21d37fb6cc3049324eb12a42c9f7c9e086bd0f39a1949058f1d8c8f0739c23fb1dc542429933080ae732b750af73b05df6b46e0f27b678668f9450c193c861e7e38d65e5cb05a52f62b29d21b4b33d34771bca88b3149aceda8553c5813bfa6f8a99c656601fd6f4ca7e54cf80e48fa144bd996bcf41e49aec97734687a7d0da2c71231dd841c8fec9a8fb686a7cf81106b16735d6559424c1ae7a5a5f0515a8074bd879c1cbd6012a3b5a7079bbeb6229de7676a876c02f1620d04905341c95ce512d20c4ca11f7c08684473a31313640760d24b4946c0268c108a8b96f699634414b070444480800c6c3d4bbdf339c47e9b1660b9ea039bcc6836a6fda9489e76418047eb3e99d40aabbdbba140221333cf1cf2bc121318aab09022f95c31b12abbe67469bc34ccb88c8a0a965902e47494c7a0bd573910a97377b764ea7443e73346ef9bac0376711db236f89a025d9b09931aa473ad04b351a00c5d3b969134f03c1745f672138f52ba47a542942c1078892ca3b9509f435d8521a373810b12393c8eab18fe7b6f3f4ad7ea88b88b21db46338adac939040674be52e6c2948fd659935a86691f076c7f228bc5874fb8214ece1947f68b057411c218b776a332f5aa351b4d92560a42346180edb08bd57f5342773249fcb1f036955da0269695a712ed852a35a3de8662966c0b2c2038ea1ab7b4f9708c5849dbdc6a29e734ce8db1f447109b755af11976b73cb6c8594a5de221c44b61b9d425280007ef4ec4ce3b34beb733cc73a1a7f6857218476adb0200d96658c8456576666b6d7c06da03663191e649457d298b81b067789c285af151ff4b97239c35ab8688a8d6b4469fcc7e42201d5d57bf3cb98c883c5c9c88f05555674e7a1bdd59e3f327b69a74f0d4a250aa89fe1359e5724ca02c38784a14690c62d891364b752ada80402128c623d0839a0f09bd0e6a37b724070a4356641c538415f2a97701c5492d29a2f2823884496af9dd06703d8ac2c17c4ddf5561590b63ff78c4995a31a18d861a91c43c5dec3705c6112d81b81555f7a3b432f +private_key: 2702a72c612968570b25144125a96fc1e89d964a96ca260ae250c7af8c825d857b795396e4eb439f131dc9f36cc190b8ad3a385747a83a976a0e3662834662ca8c7f68386486da8663774f04066d3af42713aa6c8280aa96293bd92217c4aa8cc26b5f3371290eab1aa0d0cee1382de722162a23bc001690cc5ac2c49705711164508ca429e06ff1231ebf0b64550c359b93be6690b9d7e2cbd6027de95c34f03c3d2097cbe1150e4861b57b691e18100c333a3bdec306a87121e51c7641687290553d7005a5241609b75239e43abe459414ff1ccc41118417633d72522b7d1b3746f8a542106061d567cb4370f721540cca09bcb9cf8c364fca8322d2d56a6f1026a53a1593981cee1b8d8776b3827b5161886aa4e91d6bc26a516a757a353f6c2020db2b090a7327215238f5eb4c91594e555b8b0a3680ba6b9bc0589b5e91600da829205395ee836deda787045438e657830cb0c6f82379795a72f698c0d7209c85438c92812938c65407058985184e48f9093f6439fa158749696c1144a336614459f2bc41c9a7a31a2b74ac216d202ecce10f82488b4f32c010a23f35c918ac8c3ea7906219fc85f67730ad12450120091a4b8b53f5378f81b5b7b0bd85b486c6aca5b5435f33f8c38dc255c9b42f1a191457497845f291fbcc239de68c1f6875a445baba0951238265d90b87f630530ff089967b50a1d722ddcc7bb1803e552463b62249b4454095a0903da20077b045213b0db8953340761a8591b042fc885daa8a8c6a2985836c9109b827b804ed5c0e92b568b221618df155c1535fbb128012cc27b7aa6a5a362bb3747712cc693bdabc919bcf2be8afe42a76d814a3362b5337853828639767bb7fbc4bcda6988a7a933f68aa3b3cb7baddc065efa98da09cb742ba3563e19e27eccf6b68b94dd28fbb351220764bbd781ab884956a865bec99c222e59295842eda25c340a45275dab51631b24bb86b70a2b831f171ce9222e350a70a1879adc70d87888db2b1c540c4666f7641ee36c30e733ae206b087084fa3bab717d2c8761b78c20a31093ba5e923298ac59cfb768c527a3aa4d19d1f0262d6d4bebc41699d152e092368ffac3088d2488e6b177bf9045802579ba973b89a2404db17df25c546fac731480d180a519a9309e28a98fe3b521c978df1a94aed0a2aeab5b971c995724189afe7b3f90c5b1563a9187311abe681d61834ffdc8a2142871cdb48096a25c0a315f12a627304206149312a4c647d1059a1f559e6aa3b4f22ba01ac09365718763a720d94506a39582e6400d93a19540690c94c9afe1c5df5b6716ccb4b80939698caa521313a3b3ab17a06a8ebc3713944656a75bc95599a67744bbe79997b4153182372754a9d8238926b1cc239d5942e60c1b5d85fbf828409bbcb68e30e89180bf08083e94816dda4aaa53267787880b9cb38e381585535c80ae47d226893889b5240db1d82d926656541f3196be9458a1a20a5b9b263bfc60670d6baa7981672a4654fa87a37804486258403c9b0dc48054d312c52592de43a41a3a7aea934a72281807d26c10aec91bbbbc8ea75b2b215083cfc94a12c61be14cfcb2b688b097832fb016b0a60cc133c709b9d6c1734d4a100d3523f8f30c78f9647808b6cba905cb4da605a2b3fc3a433c916089304c868257bab174861a8b57f6bbf6b79ab55a3044be689a8e19f3d598f7453b3a71a06b29bcf3eb3819ed35d56b74a176cb9bc81b9ad94250e639c17f431b1c856b02c4d6579417d304f3c7b2a34579b6c09a866ac9d871acfdef3099368025f4109240372feabc2d17a7e89031e67a74b68144ee1a871c8737feef4b9c663bcc9a42770ca4571a9b92c60ad14f53600dda002509f109659f8b2a5a83ab6a1d8c3025c38ebe6346ea5cb11e66d560a9c656a61de98407c130b1094c391a879ad70ae5ddc2acce2b42ccb378b9a9997d6042581230e6843e70634d25ca675e09947027591372e50fb42a28cc9c8e13693267305c89b7ca4cfca931eb1e6137f6470432a55a08a183d1187ba7a8f78e6b960874001515ee15437bbb8157c382af1641693b20e2de25cdfb7c4bfd9a803517fac4ac6bb960377f17ed89b216cc92eda7b08a89505903659b94552ed2433d7d6668b226081691f4ea558f2b072af6c50f1421cc8e1532bc6afdfe7acf2a43b34130fea7ca5b1409ab0f10dfaa5a5f0e7b9a62006f1c53e82b5c7ea427009c990bf31a939ea2705630164445715bc5c80b3906739c46a4c4cf1024776037bcfb0716d1ba00110637fc177fa1768e73cad8fa4777e13aac74338513c516715b645e3bed722382950b132418fee81639d448eabd55a94c66a34eab68ddcaf1c756a4907bc3f5115aeab5320f3b9bbe84e0d885fb784af7fd8c1eaccb37642cf39c8a24c4903a7e80578ac7e9f2a95cd806caa200e23873f751636cd606d819731cf1b812afa2ed24381a52b4f5fba658618a02e0418d6823e7f418294c81032936559a77f9c014d8a3b38df8bb17b7a8c3b45b53ad60b0d9929a21a4ae3039366f894b1082db5f3cf2f13381d53827b5a568fc5234e099d6b94bc1a013ddde944b4ea13eb52bfa880716b1a10d8827a033878986155b7f2944a63a2cc32bbd61907125475bc09b0ab76222cb4c9f2e80a00f9b71bf9705e3576b5a96f6229ba1ce06fa1b2079cf66c59f30dfb88c1f9412b0b2ac059dcab8782abe57209188bb938d08bda140a0eb08de0db3f8558c403c725a77aa1e0563a54a77f32aa30cb780f4e562716075763e9c5d470564ec12cdfab424ba970c51201081193741a5e358cc7d63064a7183d99b28ddc5b0f10374ea9710193385b855a259130bc490041f76a9d661483aa668aace51c616804b5e7c1bdb8762b73b39f17785af94b355b0fed72083c2b71efd1cd43c1a9704a93e0e5752e99a2ef115b6ecabc74cb03bc091038f5701659a0d4bc693805080d6a5c81a0273be9149861c461c47cf496cfb22526d3fb8ba5a3396dd19a8477611b814b76d5c8191ac1c8190ac3b12065ca4ccc879d5f34bc4479a5c8d4693d8771b434c4b8e8b8ae921e01a131e9410ed11c505d226722e011f2073b0db34d10c104afc2656dd053e43a8db7c00fe705b0ba520980dc71e834127c08077806cd8e82144d50448dd59a085776dab69e42db0e7e8ccfc010a140b50b50e09f233aacd3da972aa40f1d1241d718b54b6009d3daa090186cb167c1ab3979c8356397e598502422da2935edd9c8c44b90e8c50473119d26e99575c0c328307e2017b515f33d4d2821bf341480780b21d37fb6cc3049324eb12a42c9f7c9e086bd0f39a1949058f1d8c8f0739c23fb1dc542429933080ae732b750af73b05df6b46e0f27b678668f9450c193c861e7e38d65e5cb05a52f62b29d21b4b33d34771bca88b3149aceda8553c5813bfa6f8a99c656601fd6f4ca7e54cf80e48fa144bd996bcf41e49aec97734687a7d0da2c71231dd841c8fec9a8fb686a7cf81106b16735d6559424c1ae7a5a5f0515a8074bd879c1cbd6012a3b5a7079bbeb6229de7676a876c02f1620d04905341c95ce512d20c4ca11f7c08684473a31313640760d24b4946c0268c108a8b96f699634414b070444480800c6c3d4bbdf339c47e9b1660b9ea039bcc6836a6fda9489e76418047eb3e99d40aabbdbba140221333cf1cf2bc121318aab09022f95c31b12abbe67469bc34ccb88c8a0a965902e47494c7a0bd573910a97377b764ea7443e73346ef9bac0376711db236f89a025d9b09931aa473ad04b351a00c5d3b969134f03c1745f672138f52ba47a542942c1078892ca3b9509f435d8521a373810b12393c8eab18fe7b6f3f4ad7ea88b88b21db46338adac939040674be52e6c2948fd659935a86691f076c7f228bc5874fb8214ece1947f68b057411c218b776a332f5aa351b4d92560a42346180edb08bd57f5342773249fcb1f036955da0269695a712ed852a35a3de8662966c0b2c2038ea1ab7b4f9708c5849dbdc6a29e734ce8db1f447109b755af11976b73cb6c8594a5de221c44b61b9d425280007ef4ec4ce3b34beb733cc73a1a7f6857218476adb0200d96658c8456576666b6d7c06da03663191e649457d298b81b067789c285af151ff4b97239c35ab8688a8d6b4469fcc7e42201d5d57bf3cb98c883c5c9c88f05555674e7a1bdd59e3f327b69a74f0d4a250aa89fe1359e5724ca02c38784a14690c62d891364b752ada80402128c623d0839a0f09bd0e6a37b724070a4356641c538415f2a97701c5492d29a2f2823884496af9dd06703d8ac2c17c4ddf5561590b63ff78c4995a31a18d861a91c43c5dec3705c6112d81b81555f7a3b432f37e94def940045d3fd9ddec0289680ae2f96d9d43f5d774a81b86ae7a4761ab275d12195ec32a8686d0600e45d4a7f54219b0d7a3826d193a51b9156ecf2edd6 + +# Official test vector 34, seed: "5da2c51b4acf488c8bded5e985cc4702e4a7bcb248b5ac18aaba529f7f9cbf30efa776e99f76d5c1686e94f50fb57dae" +seed: d76b3573f596eb286ab5231feec7499686b13021be36cb126c7ebeb9d7030daf248c0a21ea0bb6d6f56f12300e8584d8e9a34e0e6f52227281151ae4c305fb8f +public_key: 822a87a132c0b9e3c13bb45e2eb5bb47535099e37019b3c7ac3b81c6225dcc65476fc12e7a81cc80c9a508e507f201632be9c1bf27317fd97275cc3f481bc7c5c25a4b1462767a42cba43b152c276ffc8db55a96d418246e0bb7d5a15f0d883597e9579d675e816b8333097787c613cac29427b11739e650cea2ca8b198c0158caee9971894b67332baf761caf88c16bd11c9f1dcace7b83a6bec71f0ed9bc28f706c38b057231b7c330a4b99898037720cc88245f8982daea502ad30e315c2ca477a3f045084356cb81184ed90734e0cbc0d1553adaf5a94c2a6d8a51566997c735bc45fc408241357da2c38c8a0520fb5a33e1d5c06cc80c4e91314d08599763232517b501097e4bb09bf814a0cdba619c701d249c933d143bbd92c163724b523bc05568a410952380177ff6084c6416bc22c637b7e1ad586324103677101a74835c4255b89ea1935ec8b8382611bd4dd91931c436f9a909af4747dce811a2ecb63f046b411a201d1b4f12442e73d7703e22896a904736308453b946f248a6bd11800797886af555b0787d84daad7883c0e583a7b6530c7d0a8559906f0e423e9e6cb600b9917768777b7489dc173fc67551ad92a26b054ddf13c4f83b5805b9b7b9829513611e171b9ea358abf9054ddf02629a397489dc213705a9b86735577493b86c326e857eb816663dc1417cdac788900c8030803751bae22292af87cf8fda4f2991418948c0b4f54c19163dc4b195b76cc5def67b5288bad948cf214cc6a11c6e1ab1a5b9b1501baa75cec23530c091cadb8c9a02415e816ebe708422dbc2db224b74ba1b83327c8b25bda3cb7127f5c5b963cf3c9abfa15c952bdba2acc01c9d377a89eab6a96a65cfba3d722b6618262ea78770d5fbc556789ce4d13bfe02065f033362124b84560f462c64443b88f3135f585a3b29e450c1dcbaa7b9181133c915522a90f56e595ba11ec3327e6a83c7f1ba59951c4684995ea64edbb3451271a878e42be7d763b27cc430ab6b068173b973141e0a72cdb185b263071d20a8f5a37dd08ab6ea7a2639e0cac1790d5573053569addc1731a339488268873d89a1490b78ee404c2e8328004d44cb4521a68737f195634ab659b919a94e268131ca290e59756311b6273b5dfc2c3adb21534609cb2fc553906a14d8c079f487091587943df49a39d1b465952efae34d33fb9ade56cb6ca9cfa8221458d9940d4bb5f044297c4160a2284032458bf909c31e47a27c7aabdc9815f1ecccadc6288fdaa6c0316f2cdac38ce89fb31cb81b673f26e5709e08c474cc41f213b0fdbc5563851bbec682d9051a5d58148a72956721bb96224214d03e8b89021b98b9a0a87dbf15b491125bc07c6ab6353560d61814ea3cb2e72344104b06413f963091802413521441da171e6b6b039391842141c87c991a4157b428e35ce499a805e2c0954457582b6a8f52c4e102bb33cb01d1ba883ed4cb126c2137a75aadca26852223741c07b027a1883220ca9a65585a5e0c0847b9d0013f821bdad0902504785e927016328c99ca1f3d2bad906b3cef04a3598b2992b2c587100533bcccd15ba1aef877c3a565cb352b7b856880108fb828b42d3612473970044c6c4a057f18ec13deb2c398393c19383603c183b02a461bc9b8ac0969e04179e53c5a8f54a556f54218024041137448d08401fba8e4bcc09cf3b91cc28ed9bb700cc74523c251ad3a7c21f43398f85c7941387612c0c76a43db2a0a368101e88480aa1a5f1500b2a17b5704299d5639b477802fef34bcfd548274d26c476c50fff8851f29ba5ad66caf066ddfec2140dc97b83077a9e21bb4f87aa85a16a7107e3597a1bf4a5bdf008c14bba230cc95e6071bf0e6a25607566c9008d715223c483dfd6737e25a2dea490eb5606c6e32b8063128bcb6181166a93da7626c4273157c47b5a2adb1d88441e76ec9fb6efbda9fd084b496d5635794aa23a43a8c4650e05bcc2e415d775971922b1a446411f952b7e5540091a430882067c0f008211a705e4842789ccf653bb919e742b65339aaf4653e474c10583d9329cadc47a6ef20589572a2e6e4ad67d03abdf7ce1dc9015ba94ed9c69220d63b423cb5daf465d5e3a9d190a6c9d84fb28141f28990959250d48162c68b813460b04a78126e4b2c4514d83cda2735e3d3f1889578b626b002cd859ea9ba6fc856a8030f6010c780 +private_key: b212c7b33a82755496caa9b591e69054a2808962aa4b703ff72b8f7ee2206f4a7cb77262dd34c791e095cc059b1e00a474e5b60a3a8b2b77b0b6a34968f02a67133b5f93c96e94657c8995aeb2c6706a1361e7370a8072ad3713f56c6aa32c19e34278fd2c397e84905813b10fac77595a624476c9be5a06dea927614c8964c9300f6cc7d0e974e334540b60c48868c8fd99829a0ca9743522cc88b6bbfa77b9432b9c373c07573c5477a339697ebd8c4c2e087fde72bf826b001cc7b3d3f7b05484193fa38982f3ce0488182f59cef992b82c6039218829e4e4b1c554a9aaaa301f4733c0540fc2c7acd1a13d9fa0bb6da18f1631c5ffca65bd9519fa454ca76c1b8f5c8f41037499561ed02252e4e408aa352af4155a9d940e5fb964a57117d250556cb9ba2c888cd877083b742428ea6b62f0208c862a39dc6f9d6671965610d69a54d10abbc1238931777cefa00461ec086b26ca2dea34e88565a6a89bd1a138178298cacc938135ad58cc98fcd29851409a3e93cf0a270f4d8779b5f7aefc2143e0e082e8e8b357b84af630364538b19b55954edcb3f250a2a53cba04682065846c0323556f154b97b7973d267c1678a02d1b2f168977a142bcd492509b46a6bda72255510ec952a50aa11907b42b62694f978539fce0cc35079a4bd164fac25c46737c22540803d4a04f54824ac381eaa5ad5ca51568a8c256762a1021a8c46142e0a99f16db9cff371317c602bb08b275269b312411ae849c2c29285cc98d1244a346497ff59c9143a3cc9481ab5ac82ccc86c2d38512bf901b97d83b518aa0812aa2c6e3c2f8da9e8cd8154f299fc8bb52e9ba96a4aa264f8b828fe783ca4190ac42a56a97c0e6d88ed658b6993399e47127040a44aa539480131b485318ffe6a598570139c06ad4054b70b6991fa4b82e59018b7a206f5595e0a2456fc122ea8828fc3b75744650b2ac1a248133bae700585784a1949caf7c58bca497b0d03569127c6fc88b407268cfbaae78e779acf25e9c9767bc691eb0969f69988d3af98ffda60b308a789b8c985235c9d694c6f0e1425cc1782a921b11444e54e7a94819021cc1899439a753a677913970f470854966357569924cc5ad3e2210b6654193a4b2f145782c9397c2c6bf8fc14535149289b904a1f628a45b2cb0e66bd955c3c153baeed32a71673067f7262fc0bd6385c6cc00793528b9cf021b339c179a157087864f70d24cab938be046cf3e409e01faa10e4601ae47b677b670b11ba1edcacb5b292908588554a8b9f204af840a2d2581ae916652db5a71e36822a37b6ffdd3664b9ac253acba6187211866b25a46b62853878ba777a5156948e52e0040bc63f120644a8ae466591986acf5c1c41b77b562a2504c0509b411a879997491c9c25ca38aa3d62250ca5267854e1ee9554e064b4a6181958c50b11708a348929579ccc09953191011fefc0c6a2242adc09ecdd29d1de974a2d3497d904baf5494d4f96ef5fa8e86e45fe4f0c79bf3861be98b7177093e9312c0f77b88f23fa62ba2c6f93255131f23e9607f3bb54c8888eccb2e01cc22bff2384bab57fc2c62a8d47f73051af951c7efd63c0f0a87d29460402814e85602997a765a3597d5a9099b99a37d2817e827b76eb4a2da2622f516364c525c69586c8e5729e3309925fbb3f9e86717503d04682fc5d83888b96e00bab9348c426ce55977a73c40ea2315f122e724a17252317af5187c290a87e6675e78589170454df4b800d2546f9a33a288256669c09ec63e49eb755cec96a542b49ed0365d6130ef2051b9a0c42c675302453ee7ea854c1184b43609a0b25f30164269479e6f2bc7a76aa758db9709204739cb3378dac80f54c665eab7dcc0be9e8186349b9f2e2bcdd9e2af7ef03ce65c62e2d798fe588242f990caa7650b5ba55897615a85ad2f96906651becadc7b53b38dd74962d7e6cc79d68f7b273452aab4f692018bc60dc6161e36e8b523b3b349f6666f4583855998d1f41f9333194b567b9b3332d8e93fe30b8e19813bfa0abaed64106d147495a6abbb4909e7aa06970b2b20914c51a5c6f1d9894d911038600bf22268b58ac4d8b8bd07f24deacb1737779cd5b328dfc251577846131392d8533e70d074fd50841698bfb584b620a100b09ab9ad6c60822a87a132c0b9e3c13bb45e2eb5bb47535099e37019b3c7ac3b81c6225dcc65476fc12e7a81cc80c9a508e507f201632be9c1bf27317fd97275cc3f481bc7c5c25a4b1462767a42cba43b152c276ffc8db55a96d418246e0bb7d5a15f0d883597e9579d675e816b8333097787c613cac29427b11739e650cea2ca8b198c0158caee9971894b67332baf761caf88c16bd11c9f1dcace7b83a6bec71f0ed9bc28f706c38b057231b7c330a4b99898037720cc88245f8982daea502ad30e315c2ca477a3f045084356cb81184ed90734e0cbc0d1553adaf5a94c2a6d8a51566997c735bc45fc408241357da2c38c8a0520fb5a33e1d5c06cc80c4e91314d08599763232517b501097e4bb09bf814a0cdba619c701d249c933d143bbd92c163724b523bc05568a410952380177ff6084c6416bc22c637b7e1ad586324103677101a74835c4255b89ea1935ec8b8382611bd4dd91931c436f9a909af4747dce811a2ecb63f046b411a201d1b4f12442e73d7703e22896a904736308453b946f248a6bd11800797886af555b0787d84daad7883c0e583a7b6530c7d0a8559906f0e423e9e6cb600b9917768777b7489dc173fc67551ad92a26b054ddf13c4f83b5805b9b7b9829513611e171b9ea358abf9054ddf02629a397489dc213705a9b86735577493b86c326e857eb816663dc1417cdac788900c8030803751bae22292af87cf8fda4f2991418948c0b4f54c19163dc4b195b76cc5def67b5288bad948cf214cc6a11c6e1ab1a5b9b1501baa75cec23530c091cadb8c9a02415e816ebe708422dbc2db224b74ba1b83327c8b25bda3cb7127f5c5b963cf3c9abfa15c952bdba2acc01c9d377a89eab6a96a65cfba3d722b6618262ea78770d5fbc556789ce4d13bfe02065f033362124b84560f462c64443b88f3135f585a3b29e450c1dcbaa7b9181133c915522a90f56e595ba11ec3327e6a83c7f1ba59951c4684995ea64edbb3451271a878e42be7d763b27cc430ab6b068173b973141e0a72cdb185b263071d20a8f5a37dd08ab6ea7a2639e0cac1790d5573053569addc1731a339488268873d89a1490b78ee404c2e8328004d44cb4521a68737f195634ab659b919a94e268131ca290e59756311b6273b5dfc2c3adb21534609cb2fc553906a14d8c079f487091587943df49a39d1b465952efae34d33fb9ade56cb6ca9cfa8221458d9940d4bb5f044297c4160a2284032458bf909c31e47a27c7aabdc9815f1ecccadc6288fdaa6c0316f2cdac38ce89fb31cb81b673f26e5709e08c474cc41f213b0fdbc5563851bbec682d9051a5d58148a72956721bb96224214d03e8b89021b98b9a0a87dbf15b491125bc07c6ab6353560d61814ea3cb2e72344104b06413f963091802413521441da171e6b6b039391842141c87c991a4157b428e35ce499a805e2c0954457582b6a8f52c4e102bb33cb01d1ba883ed4cb126c2137a75aadca26852223741c07b027a1883220ca9a65585a5e0c0847b9d0013f821bdad0902504785e927016328c99ca1f3d2bad906b3cef04a3598b2992b2c587100533bcccd15ba1aef877c3a565cb352b7b856880108fb828b42d3612473970044c6c4a057f18ec13deb2c398393c19383603c183b02a461bc9b8ac0969e04179e53c5a8f54a556f54218024041137448d08401fba8e4bcc09cf3b91cc28ed9bb700cc74523c251ad3a7c21f43398f85c7941387612c0c76a43db2a0a368101e88480aa1a5f1500b2a17b5704299d5639b477802fef34bcfd548274d26c476c50fff8851f29ba5ad66caf066ddfec2140dc97b83077a9e21bb4f87aa85a16a7107e3597a1bf4a5bdf008c14bba230cc95e6071bf0e6a25607566c9008d715223c483dfd6737e25a2dea490eb5606c6e32b8063128bcb6181166a93da7626c4273157c47b5a2adb1d88441e76ec9fb6efbda9fd084b496d5635794aa23a43a8c4650e05bcc2e415d775971922b1a446411f952b7e5540091a430882067c0f008211a705e4842789ccf653bb919e742b65339aaf4653e474c10583d9329cadc47a6ef20589572a2e6e4ad67d03abdf7ce1dc9015ba94ed9c69220d63b423cb5daf465d5e3a9d190a6c9d84fb28141f28990959250d48162c68b813460b04a78126e4b2c4514d83cda2735e3d3f1889578b626b002cd859ea9ba6fc856a8030f6010c780ee3fad17b073dded30b6531f854523002db21673437ae275e8a4d702ef311619248c0a21ea0bb6d6f56f12300e8584d8e9a34e0e6f52227281151ae4c305fb8f + +# Official test vector 35, seed: "4d2239e84b052109a78dbab6d80c51a86d38248105970476b74a0b78b9cfab6283e30d5a406fae1c7f54f8bae1110ee4" +seed: b87439fde81c9e39eebe7cf741c685785532c1dd23e8ef868b9ce7a541010f3d1646460817a0fce5836bdfe124a7448e7adf7b8ecc2652ac6d280e986682df71 +public_key: b9c82a0db31fb3c6458ef4c21b5663ef7795f4c36ae77a85ed8304a4066c48741323ebc5e5f50d50a704de206c4f6a5719b27b8fec3d95e77f545a7f78c57a9432a329741159808d255232d4288032d658bc483d4afc3d6ba94f8bf44b347a8fd4bb7e2e4000db9909c3720920a410a46905d3a34083c3484bd2448f232ed825658a8b25d99c995be0866a18c01274607ad6bc0154a4fdf70f42768a5ca86df321327b89094383648a236d8f74bd3e3854b110ad8d1403e428a73d9a13cf29a6240c30cc53532d60152ff560d1e3c3205ac557fc76bba0af547c69e9819d1ca412088a8665863f64cc98f3853e2ce115c4c3080e002542714efb10b8f51a59ab954885b313af6000fb8c0b23bc59ae73948e8b30213c84230098469200c8d3aa1f68160963b4dec95c20c8290783457c06b7ed61ab17077709591416a422e52a2afa2c61ec4932df188a4a0c056dc854acba8acd5298a6cb2de04c7c3bc7bc724157fa2b9d01c9bcb0624d79e52988a4b783e8a6d7c45115c548e0eb474368993d971e59e96d5c2a9341b40f461752dd73cbff7543031caf370130311c458684a80209565b754437926bb20840aac329392cbc4f7022eeb03580696b239b2993c9927f649aa838c4e88726f9633b8630977e85350bb25c130161b6c0298c03bcb387c38b4853ce8258166175623107f3d4c5a4b266c9978154e710f11337f05986e921b20d1c02d0667b42d1a4f09231d7d8993263a2cef7b3e5f153aa691a12b7ad28513eba123945f0651b83cd36099047b997ddc5128325213875ab7ac39b6e969693c4746f19a159b19b7911abf45a9215f5c9ebf60c46f254c27285e9491486773ca0f8848e23bc16d83155c302d0e42504762226701bb3a446316b9199860b824c1bb5bb2b4f535e74c493a80b3faa5b635d65364fc241a2e1366f3a2ae40ad07e6621ef64428ffb6c86a1883aa20d04b610ffea3b48e88e6073005e281e91d65cea99079e1846ce89c2fffc8cb38932c00783c9812d26f91937e6966dd2642bc1b494775f5acb46ddb3bfe70c62e2018cda8b16ff762ec3944909d034c27ccafd2803e4f392fedba006d672021a8eec76cd2c5b1f2bb65737a5369365c8ff6231b7866973201853d7538b27825592629c7812dda74b795ccc56fa684e8244a4b204c0b2bce93100a57c02dd13c5af5718084042e9d809eee01ef78166d5579fb0702deb07b6708c7ae2757a004d2ce31921030059c36a014df0178d59c7a7a7b1c3e04bfdca8ad4697bc2a36b5a213900249ce02a678009a4c9f8589bc24810e611a942ad468a2ae2d8af0b3b3a7d741fdaeba89f3b6c1fd302dae37f2d54ba53fb78e040991f4c468bc2b6f527cb985a9ae19797cf845c53803d13b267c8f31e4382791f0a7ed27a96ac609b40c8bedfb1a11d8c244cc85f4b692607d72f3cd05b070b5e8f4b7e0ba56657434296caaed3928f32d526cf0281a57960e5c55f6deb1636494e3d618d1e4431fce125adf544b91904cef045f1d088e159a6cff792ff5182386a87277953b4c4ba3714c20bc50e04c2b2b628b147d07291e24e18a6906b5300393180ed011b2c458d7e2a1f4604816a94b83c93c5160b740e3640707a4fe8f265ba351f4ff2c7fb75baf8980f136b2ba2e81cac3b27c2653c89b65ce236a3c0c28759b12275c4cddf5c14c7b69e951bb30459b150983fbc330db7dc3220420dd5e928ef5905a78a0b0e214bf1252765646f6c657aaec11fa775183c1ca3bb7261a2205e46d064239103203532556ca7fbf750d1f88ed6862ed02489bb30c976b4abfc0123583837a8db3f6a38bc5e9a44a990a471cb3e380b4508ac4162a4073f815507d33fffec823f9ccf17aa150a5bc7562a4e3f85995444c787d16901332989c15fdce4b43a215da66000525ab32f5b1d728846fea3ad2c092e271208b6f833e51c701da8854b867e0bd0234a3c9d98117c58ac1ac8b05f59f027b4a78e94771ee263792cb891e9d5abf0706f70f149482948eb6248bd811210765f93b4cd49daa19a17843e510409d6638dda571f680f02b17182e1c7eaa542e990275bd080bca0c793d3113d524598fc9dbc453a0560c556e7bfa3856570b570a1b43f82657458615be5080c89c0bc7e99a67a91bb9b8cb821e426b843f7542c5ce12ca13b5b7f6c716e63411681fef0ff85e8cd3fcde5abdbb9e4 +private_key: ab6656e1c10c6071c28b24c6461336d91c7b5ff6cb9c97ab265215951983f6530ab7da57f0e4967321866ab70204396caa7b9917c9c6e082b331d65fd1eb300dd481311b723c44408a1b1f9657b19bb73ac593a3b2a86a1de53f2fd150abe7620fa9b061340ac23ab1ccf45914170ac5553873873fd0175b79d500c2e92ad5fc71ab348522c5c82b81c89303abdf684eb9f638a2c502a088795caa954f9255ec8389d0097d768133a7340857534cce37b7372388507c8dd9908d01a62077dcb583a5328238a097a572b800ac1e3a4b02080edf616072229b74f4078d99018eb6191e09c5d498a32cd04e22398604479c85c61436606dc6cc4256611fb8d0c2a4f83fa160c1e7810e558526140c42c2c111141a3a24ea7400e44e3a472d1e913e341b50d88364ae301f4917ad1bc94ce43027a2435c6ea9b979cb30d86a856bc69928348b52b36915684cb5b02c23b00b8fd68831d593338b07ab0316bc3656e9b58b4ff4969fd461ad72ab05754399e39e2776a08ddbc25e4a8db78a279575bffaaba7b9143c337888e8f524c163c059f860187b2cf674b6fcb94b480a859a2b7af7066be0111c94510a919739757470b1a25fd9eb3143cc66c7a2a0c4f9ae57ab26d9481aae956240785043c43bb130c25bc10bc9956a930c009b7a08839cb483c73e671c29f2609667b49e52c79d494596a668484b5659c90965e8222db617ce6e18c94cb80aad565206c930cab57e8040cf6d2c1bd4219bde58538bd71eeeb1ce8ac9bab801aefd84406d7233a0a21a68d48fcbb10892f71a7b98110cb780db9b07b6e53339e3a0ae3921a0f85c4dc282c4874b7f5a56ae059ee327bbbf68ab3ca84e1e72b5955cc3caa12b86e949025a7bad520acc7037e97a51bde797636c5ebaecb671f68518756207327f8acb9594971e7ea07030748a87d674604b2c53b6cdd6f16a0e4669ba37a20477b25ea47ce56aa81f100bc3d4392e224af7984d59f0570e9b020a698409e8b119425756a678cf6c98cf814be4e02be4d1bfa9daa20b91a934da2b18a9cd294808f838bd21a93189859fd6b645f805b8c2caa10904697189ca2a90bb8c9431c14372fbe552009067d6097b11246c4d8469d01c470509079183082e6c10784a5110b93f450a8860134514110079393f3bc45a2442b59de6b37896be3a54553fcbb72cb10755649341699be44488bce835caebaf9f8a017437615d6409b576b90f8021db6babe5c10c0fb159ab9060a0744837631046d04930eb853a1970bc34734bcb327721b39528c0ded4226207033aa18a3171b50f698035282000696c9bb14a6617ae7453b608893bab7b385e87ccfb83929cb968746c5196ac7c46423f4b10ad3ddccf8f9616def05642e22e15e15b5827b850249434d9088896cdc45b39582c3e2d7340650365c929546298beb4fa024da8b3886a8ed6699bd15bc645dca53dc792458470395bb64cea5bd9916a11f5920487cb60776f3fa1b7e6d16007a5322e92410377c874f98bdf32066a136d8221b95474a240247bea21cf0a572cdd721ad9c98f6a248c33a20ccd3a6965133e6e47055b5893d8db26c6b77754f441bfe7439b8a5269280769247adf0665d161c88e756de537bf5601b248e9632886c84b572aa542b53f25001586c60eab6e1cbba8b62582efe41ca212874f402635815611f09ab9ca4ce29b6fc665478192452d667228f17d1500d0a18574527a3ea92bb208e037722684b2f14db7d7cfd11616d9a528e0d54ce197b16282bb2a2a778b81999bd38fa2d86b071b7d47db2c7b3b3af53b4a8bf7051b38468e63b2728003e8489d33caabf3ba196468abf982452f7a261993bcd3941fdc59a60ee24d19f060d7e493c29ca5a7510918b918eeebab86dba7eec12f233c0b0adaa65cc1ada2d64976c0399dc8092d5c3ef0774101a01f6643ce8ba0280356cbefb2c2856cb6021768564342287a9952b1c2da5928520cbdf6d8a970c4aa776c60d7781107ac9da66672dc0490cde4b38dbc08422624e50b9b3b775c8806adcec9a5a2d94f56d488a8ab8f90b6930cdb8fac4ac5b17b66c6b1167c981a55cba0c8079d1668ae51f32a62d4513165b275097597e422fb3ccb4bfcbeba52c0b028a01c94c4a192b9f1dc4f584328cbacb263b5c71c145bb9c82a0db31fb3c6458ef4c21b5663ef7795f4c36ae77a85ed8304a4066c48741323ebc5e5f50d50a704de206c4f6a5719b27b8fec3d95e77f545a7f78c57a9432a329741159808d255232d4288032d658bc483d4afc3d6ba94f8bf44b347a8fd4bb7e2e4000db9909c3720920a410a46905d3a34083c3484bd2448f232ed825658a8b25d99c995be0866a18c01274607ad6bc0154a4fdf70f42768a5ca86df321327b89094383648a236d8f74bd3e3854b110ad8d1403e428a73d9a13cf29a6240c30cc53532d60152ff560d1e3c3205ac557fc76bba0af547c69e9819d1ca412088a8665863f64cc98f3853e2ce115c4c3080e002542714efb10b8f51a59ab954885b313af6000fb8c0b23bc59ae73948e8b30213c84230098469200c8d3aa1f68160963b4dec95c20c8290783457c06b7ed61ab17077709591416a422e52a2afa2c61ec4932df188a4a0c056dc854acba8acd5298a6cb2de04c7c3bc7bc724157fa2b9d01c9bcb0624d79e52988a4b783e8a6d7c45115c548e0eb474368993d971e59e96d5c2a9341b40f461752dd73cbff7543031caf370130311c458684a80209565b754437926bb20840aac329392cbc4f7022eeb03580696b239b2993c9927f649aa838c4e88726f9633b8630977e85350bb25c130161b6c0298c03bcb387c38b4853ce8258166175623107f3d4c5a4b266c9978154e710f11337f05986e921b20d1c02d0667b42d1a4f09231d7d8993263a2cef7b3e5f153aa691a12b7ad28513eba123945f0651b83cd36099047b997ddc5128325213875ab7ac39b6e969693c4746f19a159b19b7911abf45a9215f5c9ebf60c46f254c27285e9491486773ca0f8848e23bc16d83155c302d0e42504762226701bb3a446316b9199860b824c1bb5bb2b4f535e74c493a80b3faa5b635d65364fc241a2e1366f3a2ae40ad07e6621ef64428ffb6c86a1883aa20d04b610ffea3b48e88e6073005e281e91d65cea99079e1846ce89c2fffc8cb38932c00783c9812d26f91937e6966dd2642bc1b494775f5acb46ddb3bfe70c62e2018cda8b16ff762ec3944909d034c27ccafd2803e4f392fedba006d672021a8eec76cd2c5b1f2bb65737a5369365c8ff6231b7866973201853d7538b27825592629c7812dda74b795ccc56fa684e8244a4b204c0b2bce93100a57c02dd13c5af5718084042e9d809eee01ef78166d5579fb0702deb07b6708c7ae2757a004d2ce31921030059c36a014df0178d59c7a7a7b1c3e04bfdca8ad4697bc2a36b5a213900249ce02a678009a4c9f8589bc24810e611a942ad468a2ae2d8af0b3b3a7d741fdaeba89f3b6c1fd302dae37f2d54ba53fb78e040991f4c468bc2b6f527cb985a9ae19797cf845c53803d13b267c8f31e4382791f0a7ed27a96ac609b40c8bedfb1a11d8c244cc85f4b692607d72f3cd05b070b5e8f4b7e0ba56657434296caaed3928f32d526cf0281a57960e5c55f6deb1636494e3d618d1e4431fce125adf544b91904cef045f1d088e159a6cff792ff5182386a87277953b4c4ba3714c20bc50e04c2b2b628b147d07291e24e18a6906b5300393180ed011b2c458d7e2a1f4604816a94b83c93c5160b740e3640707a4fe8f265ba351f4ff2c7fb75baf8980f136b2ba2e81cac3b27c2653c89b65ce236a3c0c28759b12275c4cddf5c14c7b69e951bb30459b150983fbc330db7dc3220420dd5e928ef5905a78a0b0e214bf1252765646f6c657aaec11fa775183c1ca3bb7261a2205e46d064239103203532556ca7fbf750d1f88ed6862ed02489bb30c976b4abfc0123583837a8db3f6a38bc5e9a44a990a471cb3e380b4508ac4162a4073f815507d33fffec823f9ccf17aa150a5bc7562a4e3f85995444c787d16901332989c15fdce4b43a215da66000525ab32f5b1d728846fea3ad2c092e271208b6f833e51c701da8854b867e0bd0234a3c9d98117c58ac1ac8b05f59f027b4a78e94771ee263792cb891e9d5abf0706f70f149482948eb6248bd811210765f93b4cd49daa19a17843e510409d6638dda571f680f02b17182e1c7eaa542e990275bd080bca0c793d3113d524598fc9dbc453a0560c556e7bfa3856570b570a1b43f82657458615be5080c89c0bc7e99a67a91bb9b8cb821e426b843f7542c5ce12ca13b5b7f6c716e63411681fef0ff85e8cd3fcde5abdbb9e471c37cff80f992f3359ded64b566956adfa3266cb05f171eb644711d3a2cb4b41646460817a0fce5836bdfe124a7448e7adf7b8ecc2652ac6d280e986682df71 + +# Official test vector 36, seed: "ee762f5c9021c36446706a88ef16312f4a12c725cd7afff1484337c91eda8e89f7007f3705747d29907b3fb7500e5074" +seed: 056661b38038da4fdd7426f32a81576c73ed84843b305168a374f934e27a4e1b79238a80dcfd7c992d84b2dffa67493e669243d4fa38c46b090bdf86bc548411 +public_key: 35d29c0d6263d9020389240d058974e871ab8e433196680f50c7b88e6a3ec8764b4509c3764bb4db404a8e932413930dadbb5c5d60a01539763428cdffdcca2cd0554633367ad245e069bfdb397b803c68c8543583581bfcc9bb1147a2063262774706dab0a015e7c57e244b12406b0009024fc06181bc058b466ee12c3ecd1a983fe1bb030774db831ef1bb26539245caab4d9954bb01901c6bb66534b95cdcc92a1af075be8a949829558ce625ace38b1296a75058b9a3f90e74e04ff3880106869899e6844a6504b8a0cf99ba86c72cba26564739d0221fa20fb412828180a14bc570503a033eb379790a457f9277a221b75720537205cd19969149ab9d2b87a19250b595186454c99b46ab8f03365200424b4ef8cae2569ab4bc07b98acd2e50b0426032f967354c70b6c1f1a1df32406c296b0e9b8066904fa2184e0dd04ad5c27f9e952774bc82a923ae90888613144bbe376b38112a836b7d6b0606d25abdcec0b471a834fe20adbc78a68cdc5619089ae4f09b32947eaeda996adbcf131621bdb99173063f98f1380a324f84626212f8acca34205299399e62b321030191379b8bf96ccb336498d2a8bf573f44596d0db92792122026b61264693be3a3a7160a9e60fc1fc0897e5f602483d6c81f382e3e237d6709b82056976ce23d66b013ea48cb56d78d12c68dc2cc6fdc7aa1142548e1940e3d889c71e990fbb19d4fa0bf892b5cb873ced68516e544bcc4bac3734215201c617767757dd3ca2b0a5084002f175995abb6a7b88892d07b4ac68b974ca83f13722f028bad4aa9400f0b755fa3352c90673a44be327845d1dc1cada0996d57b62fab1032ccb6eb947646fa25d06495a6577a17d707b11c3e8fe82325d21dc2997d0ada9bf85b45d8e5431ce5ac571c253744108f91aba0b2868c7096c92b2f53fc5a0d996cd8414cf230cae4c58059177607040d871b8b1da28837c7ab177369fd2c05fe300da0d84e97497cf5f22a36b966b5872266202d207740d47c8b1fd118ab390cd5ba70bfd9a0bf8b59d14b165575a079d82bd0fb1cc015340a1c0a0c77c7f822cd2999c6f10b5aab063181775b7f42b2fbc813b2fabbfd76c0a5d4942df97c449cadac303ccf4790685438257a0093461f581c981bc61229c94a130372ad920d2cfa5cbec684f8986a7ecaa94275814cdc2d7fe403c933bc0038b18b28cc3eec9ccac49bd922c446267cd07b786de316012330ae70bc49216fcf6b4c7db2bbab55153e21089d04c3fde934955ba215d047398ac172c2b1a18c0597182e88a327d0f0968796ae0a03772adbb406a210f2e004810513f09712836c45cc11a0d8c8433b813e0e8aa380cb166fa93961a2b6765287aecace40cb4caa064f6b547f0084bcba7856898b221d362c9de766c7d447bc10925330ca87a8379ba944323c638f33b164e13731b0b92a134ee9d454684387790361b31b53c245328bb19185f9774e2764fd429e11e2a4851b222c4a9e504531fd962fc23852bfa3b4632aba9be4595cf5083d64522ac93b41c7409aba1b83ec51cb6a1c0bd0c24e35cbfff95088d7b6ec890cb5559c44553dc44822692a243d032ff75c7c08914d847551151052c6846e2f556201205dc130babd9483dc721d42f42cbabcacff1aa93d05a2ee54bd399186bfd4978a7a76d5d24008fc55ec40a6bdc899ea0a69ca22acdf8bbd14a5cfa2a06587728427865a3331c60e77b5782c37e79561cb622195656d8f9c0c8c2c560ac95cb0b986ffa0784ee17554cb2bd0d332645958bb68cde65b13d274ba9a655bcc8072d6681cf556c7931000b94a9436602f0a5a6fbf770a2b323612bc47190c9a88d4588d97c099ca04b3b7377867a6e68869fda2258083cdcaa41aaa798ea11ba7f6cc4838f2aaf9c5795f8137adbc4c17b491a59255e61ba078a9b4179cbc89cc3c9946c65efb9ca5ac5765f3570f673ac80c1d26b5af8f031266c65b4ef41f7923af49dc6eb3d0a0eac745aca402ed4b9b2de754bc3b7a6b54c2159baee1f560dc502e4ee6b3a3d6b4c1ac1e06dca9edb6775f5696cf91acbd9293be7a82244234de9869afb1b2696300331aae6c9332840145eb16b016f8714fc00020d429f75231f73b265272a936e404f0d57b79c6ca8c25cb7c8bb89284c4e7b0ba9eb33c0406a8c39eb0d5429fcae286a9c56be5839c10ad33e8a58374dff41feb +private_key: 6d02b73b69cadb317ae9c9b09a74634c1762b30c55e793c0fdd50574eb6156f152e7dabf92b1a4cf7a9afe32cb5f95909f1c045bf9c7c76c137c6c4a4c170f82724c32921a2ffb7250ea6fea48060cf88b69a0506e2bac21912e4ca5806d15983428c4d7f32847b6a4bfb7218a4cc2b09a343de3ae2fe392ad6a555c035ecd0a16c66339280219bb40ba2ff5432524cdb0ca32a6d1b8a9ea96893c3864494e3690647d8318a3520682cbc19632cfe2e28733da34a9811f5e659cfe99b7894a88aa01c3979285813a149e196ff51206ba654215985c47f3bd24848e0c959a93eb20c3176c68188139b72929b83533ea0a70e44333d923512750cd9520f98bcae6c16643c080fc836367aa4a39c88f66c0ce09428135673b0f09529d0bb1e9e4b14679cf41f433bcf533e7e4cb1db4b5e800218f564fce359056706f9f091f6b1a0420269948512748871ea2b7c7fac91411c70a23418a336297ce670ebba02520c3c1d13807bad55100ab3d0a8b4e87fb5a5d21925a6892e93c3c10a66fc4974b282ccb9cb134aa0aafa86a527f96b2df98ba19da2e536614d243a19dd1a095fa37e9008607c882b48a79b3403f76342cd4345e6f6c95327965c2f860c4367135124373fb54a4aa7284429455f1637f56b4443ab048e0c9b82289f7d2340c2547a3bc8e66343248b5114d27cbb0e19a6a6a82c84bbcb340113ed65460052c088c555c27847078319149048c5a9103dca6770aac9d5a75f84930d6f7cd5813590a22040ffa2b9b631ec897409259037fea8547dbc92288414dd002a4c377e501800aa49b28e68a528a3312060d635ca584542a8452cca7c0cc3ebc4e3f46a5a5cb1fa49718b1c71f95224f9cbbcc9376737cf827b25caccb4b49cf4a0b0de096e4d83f319582edc68ba1177bf7ec2e2a41b0686bc6678b8355cccb7b9a8519aa68b39067dd178db2fa8ab33305efb7592a29a8f49b9264251c1ef83d75518134da35ec07ca4beb10e102466da0b74673b9fd7cb93f287ab4e321c9c4034cb26be63567f7083cc86a15b67535b1c235c7aa4ab1eb5097947b5b282e15b888a8b010e8596faaa410f6ca7fd358765ed97e5f8970abd54e36938709f6410b779077cc0b01052b412822ce256f15352fe5314aa2b41be3611ec14020b975077a444007296455818b90f6b85c50a3fc4506cc48c1ad436308154c5075755c6419ed7a267561841cc56b428608ee62047122aaa674bc9af18f15c52bfcc981fed3622f302896d7bf238b9808152b4d8ca1efca092569595deabe45f6b35c8c9b7293a321e96e9574726dfa93c79b162eebb0e7a37cea7127ef1179c728c22d98328b59b86ba4a85d11249ea08a3e594e7df1210846c8f7683f5b856ff4fc8d63b129cb1c8ea72a168c71c56c166cdac216e07097e9fc050f458e0cf6bfc5f55116e161938c8df6643b6d5514ecd860a4372693e12c1fc8b1552800802ccb48d16f4fd89306d30af791aecae205a6235eb9343c6576034c38747a306db6c2302e5569c19a75b2cc62d3895584361284801f368766f27a83cd376952d0374316af68d06b3c242d7188acbf8847f55b80750bab52b2043df10b47dca1986131f2db9c9b12bf4664a3db6bc1859b59b468c0f34c1bc8d8c74243aa3f434f044a408ab988a5820ca9317d35b8344e45273f76259c813ddf991e0e02664a4c8353252c85ca8531b6196bd68767cb8010d92fcfb12acc9c931d169b9cd247aa2c8c5fb6013cf65f0ebc432c38936db3b6ec983f742a1ca6449011bbb70f5bc7755b58d4c011455aac47c6831d6a3368905e6b700c987cc910b23d3e406e81e56f28d0a35aa331f7499c63a10b2eea5dd24b4e7c173d9e694d6c6b7a6262b26c99163c337ff3fc9dc9586548665c1472935aac3a8b653e07802b1f2a291929233e7c8d1932718ca63299ba4919d9936d65a2b78c733ad2c15f13cb4f45252b7004d9d9911bc5293c61983eb24f7b9c1808285d82cacd48801a721b15f43c0f4563c494a9a5491c30dfaa5ed5f89e08cc76dd7324d16b3ffcea5393aaa525e90f7a4bc88ac07010a60e68f7be39b20faa28610db77006a5577acc2d33740b6ed66341a56dcb4ac5a3eaa431765d006caf51766a00e07f84a6bb0222c251764d628b9cb38860c4d8cb35d29c0d6263d9020389240d058974e871ab8e433196680f50c7b88e6a3ec8764b4509c3764bb4db404a8e932413930dadbb5c5d60a01539763428cdffdcca2cd0554633367ad245e069bfdb397b803c68c8543583581bfcc9bb1147a2063262774706dab0a015e7c57e244b12406b0009024fc06181bc058b466ee12c3ecd1a983fe1bb030774db831ef1bb26539245caab4d9954bb01901c6bb66534b95cdcc92a1af075be8a949829558ce625ace38b1296a75058b9a3f90e74e04ff3880106869899e6844a6504b8a0cf99ba86c72cba26564739d0221fa20fb412828180a14bc570503a033eb379790a457f9277a221b75720537205cd19969149ab9d2b87a19250b595186454c99b46ab8f03365200424b4ef8cae2569ab4bc07b98acd2e50b0426032f967354c70b6c1f1a1df32406c296b0e9b8066904fa2184e0dd04ad5c27f9e952774bc82a923ae90888613144bbe376b38112a836b7d6b0606d25abdcec0b471a834fe20adbc78a68cdc5619089ae4f09b32947eaeda996adbcf131621bdb99173063f98f1380a324f84626212f8acca34205299399e62b321030191379b8bf96ccb336498d2a8bf573f44596d0db92792122026b61264693be3a3a7160a9e60fc1fc0897e5f602483d6c81f382e3e237d6709b82056976ce23d66b013ea48cb56d78d12c68dc2cc6fdc7aa1142548e1940e3d889c71e990fbb19d4fa0bf892b5cb873ced68516e544bcc4bac3734215201c617767757dd3ca2b0a5084002f175995abb6a7b88892d07b4ac68b974ca83f13722f028bad4aa9400f0b755fa3352c90673a44be327845d1dc1cada0996d57b62fab1032ccb6eb947646fa25d06495a6577a17d707b11c3e8fe82325d21dc2997d0ada9bf85b45d8e5431ce5ac571c253744108f91aba0b2868c7096c92b2f53fc5a0d996cd8414cf230cae4c58059177607040d871b8b1da28837c7ab177369fd2c05fe300da0d84e97497cf5f22a36b966b5872266202d207740d47c8b1fd118ab390cd5ba70bfd9a0bf8b59d14b165575a079d82bd0fb1cc015340a1c0a0c77c7f822cd2999c6f10b5aab063181775b7f42b2fbc813b2fabbfd76c0a5d4942df97c449cadac303ccf4790685438257a0093461f581c981bc61229c94a130372ad920d2cfa5cbec684f8986a7ecaa94275814cdc2d7fe403c933bc0038b18b28cc3eec9ccac49bd922c446267cd07b786de316012330ae70bc49216fcf6b4c7db2bbab55153e21089d04c3fde934955ba215d047398ac172c2b1a18c0597182e88a327d0f0968796ae0a03772adbb406a210f2e004810513f09712836c45cc11a0d8c8433b813e0e8aa380cb166fa93961a2b6765287aecace40cb4caa064f6b547f0084bcba7856898b221d362c9de766c7d447bc10925330ca87a8379ba944323c638f33b164e13731b0b92a134ee9d454684387790361b31b53c245328bb19185f9774e2764fd429e11e2a4851b222c4a9e504531fd962fc23852bfa3b4632aba9be4595cf5083d64522ac93b41c7409aba1b83ec51cb6a1c0bd0c24e35cbfff95088d7b6ec890cb5559c44553dc44822692a243d032ff75c7c08914d847551151052c6846e2f556201205dc130babd9483dc721d42f42cbabcacff1aa93d05a2ee54bd399186bfd4978a7a76d5d24008fc55ec40a6bdc899ea0a69ca22acdf8bbd14a5cfa2a06587728427865a3331c60e77b5782c37e79561cb622195656d8f9c0c8c2c560ac95cb0b986ffa0784ee17554cb2bd0d332645958bb68cde65b13d274ba9a655bcc8072d6681cf556c7931000b94a9436602f0a5a6fbf770a2b323612bc47190c9a88d4588d97c099ca04b3b7377867a6e68869fda2258083cdcaa41aaa798ea11ba7f6cc4838f2aaf9c5795f8137adbc4c17b491a59255e61ba078a9b4179cbc89cc3c9946c65efb9ca5ac5765f3570f673ac80c1d26b5af8f031266c65b4ef41f7923af49dc6eb3d0a0eac745aca402ed4b9b2de754bc3b7a6b54c2159baee1f560dc502e4ee6b3a3d6b4c1ac1e06dca9edb6775f5696cf91acbd9293be7a82244234de9869afb1b2696300331aae6c9332840145eb16b016f8714fc00020d429f75231f73b265272a936e404f0d57b79c6ca8c25cb7c8bb89284c4e7b0ba9eb33c0406a8c39eb0d5429fcae286a9c56be5839c10ad33e8a58374dff41feb6af202d9ad3f2c7ca61993e238140ce8550a5f0c39147130a5313c8c02d68de779238a80dcfd7c992d84b2dffa67493e669243d4fa38c46b090bdf86bc548411 + +# Official test vector 37, seed: "d882ba69ac8bbc88715f1c6387531f53273a5dab87e66faa8221a7f628d2bdeee1cbc59c0e08d0add84520a3a70c1389" +seed: a1b52d871612a1c611ae0944f9e71858f35d3bd14f20e96a931720668bdf0a6b1f135cf64b6403e103afae34da038613e2853bbfc36baafa3c6a95347193f37c +public_key: 349251ec123ce574a5dd6ca1d14a967e7177aae64d9678571d6b0b0769935a1a2a8dba53db6c5b7067210426c64f53542929b31d565bd25a480d9065d79852b0f05002964772465c3fca5f8307308055603039b1b56726eea02a8cc19c5af41309f145000d2aaed3038c17911677a2631242280c23e9816185c75e5dab43b4b04c8777a35721605aab1adab828f2640ec5b23173f6cf5d37ace602ce5af62108ecaa540ba46594181ac9869517502aa73ddedc4131ab152b53501dd4aabd79556476063da48c4978835f28500f810b77715257080d87247354302399485852314598fc6eb1f93feee6429eac96d37c8422dac30f473b56db0dcd2c64f1c18f91950e7984a88b63979b424c6d4a36220019881b5aaac715e426a6976a300ff171a29778c82a1520f42a2f0b10d26035613a1e0511720087be146ac9f0cba2c1929c0960bc16065748573d61eb195de53ab9ec802d247b210b747c70c45aebcf39229e4b938eff354fb9f65cc6b52ff0163494744848885ee577048b506a95112ed45466252783a4016f30e29b1928acbb448379723d51bc3b59a62df46ca75f64bae27aa2d9456c66e2997b48274f425004e6884e296e17912f7e387db452681cb32e7217566897287fe9c38622325a8c6716e5a767a626d98836cb779983c31d1802b0e0bca04bebbfa9e2cc02429f987a31f73274ce5320e1b0cff8154da331be8ee21cae8c5037a1baa4956b04833d4928a1c32147246002466716ea9c69f4032d33260c338cb13ea09e5e47957700c33bda9b147a3f3f64b46c933b7f4689d2797e4ad24df42c002a323ac0e781b7e8c8e679c949ca730826b3f6c28813ac24ce7ccb21136695c75b3d028fbf6ba94f5a06115c72bcb879d64cca29309502836edab5c7b2a79a1e1204161369c5e8b63dc513d0aac9fd366387f0aa2e736bc09b4dba05414659a6937264ba982b419342e8c063ec64b28663cbf4d12aa5a6ae5aa9056ae71c4f5643cff81ce6d7a8d29a250ac27be274afef453dd176c462791c249a817329142c00ba332851e50a01660a47e35bbf3890c23be173dec1a1d57a4837975c14269707384855e897cb44c4bef532a003409aea41d2fc889f572ab20c0409831ffb0222cc7246438a95fe4a6e32412688b2cc8c1963e38526201aa9d2b0963533b2fa42af59e61d53c4bac2bcc09e44c5f9c4963525a7c015244000749e811873a391f71315d1fa60c806390fb3aa80295e77e80158c665ead61283271a1997757e5c4dc6893ad71a63a1898fcda02165db76e252665153016c90bb9c8423cf8a1d371338feb40a382c2c3f99840ea96f99246044f4a5fa5cbb8d7473110b4a5238255e5c3d43463b055bbe46211d2e05812dc46bcd539c56a15199cabe5019220dccc1a828a5e0c37bf130a6df762e395915654b5bcb5c3eaa7142e1706697b9914a287513e407ed376354697144b33260eb966316c05dca8655a0436bf47967779d43cca5edccb932c023351542857268a57a74c4eb08b7809c289c5543cc3730594b3ea33de6e23a5600ae6a68cde3614cb1a80bd7c2379c1834c349c55fa73859c5a3ad45886286973f1363a5a536a0b08faf26a939179f873cac62281260868569372dcc744185a55feccb261fb0af1ee7a50dba2c49636e09687f4618667db136bb291f4b4c129fc7635182720521acf1d67c719a283c412bc9165d9f883db9049b98381a4412b6599316cb39986a9c3f8c069aedb9b5e13b82f3abc0c1cb70dbf0b5d1d66ea003676197c1be2c15bc6533a41804ce0c123fa55a87fa344d850af4f5b12fc0ae3610593e1bcaa1868571b2a618db9f1900c459376798341e4263c70cb94a9db42a04067f7a5310c606bd7ff661ef3508e6b6b6373c7ba0c872b8019676263bf912673c59a4c51372a2da860399222654518063c3e1f07cc6c93e91ac6b53f3c04516b76da65124325c59d4360091923d1883977a52b328c0d508d0f039696db843bc12c506b521ae34c9b9d145047293a6eb99686770dd587c92bc65aa3a4083b40e8fe2cf891c5152281744612b2598664e4368775572e4a03a9ff53e307caf081ca897dcb43061a404c689d934653769ad59d68475a8b0e7277bb280ac77ea7b1a1b6111c1574c6358dd6a472c49c264965f8cd9fab7d1fd2c5f4c3a4ffcd66e5b05a4879536aee3074b69c3d4e6b1 +private_key: 4f311376e73d8074bebfa35fb9c25879f482ab77c1708a8974d609f4aca60712bf80e6a4948042a333cb8abbb1bc32960c75776194adddf09925b605efe3cea0421a9cfc63acfa774858b9f8468c39e9038434517b103e117abda9531ec9db871b0144de3b3e6a99cc091a696ec218e6e099188872d3b2b2e4188c1935530a364ec7a1a98d9cba4bb68d26ca98eb437d2a3378bce40fcd3b4a8f7982485a1296364363dcbcd813a2d434bf3f68788c035980c0be8f46a6ef54a198d64c0d149731a097cac43d7d022167aa8657ea521197cdb3585b4ef64b1f6708082471820919e8b9392a5c2f56e56148d10f18525491647fb0140e7c66bd26e3631f3bb3f20c947a67194b9c5de9793d55c2b800263e50929889d8afc878b661c7cb2fb366b8f70f8ebbcf75822caed8a6c83a3651557389c51e5431ab15095705300a88ebadcc417a4e955f2858b797b39b64f10f587119e24a01e2a17a638873b485b2c8d867969c39b30c01404905ed14aff50484da83a8bfdb23689900a7954695b6695186b590e5c3dd27ab6a619a2cd13b78c9cfc7c966d4d373485ab99e522a74372c51a4764ec0152a29acb154826479567b1c6aa68bb2fcf471e035c0d7f22478fab87e7c035102a8fbb5cddef910923748bc752d0c82cfdf8b7733f30e6752b037482bfcc8a38097c9a9d8745b0681ad79710a4049be27c13680627516aba8d308287a45f498c9065900cef26280f17b8ea6216f60118eea6243337fb2d7ccc156325c33116b057b92e24d662718235a7e7b69186b17232132b529e44d558039eff0c2aa6b0b0bf8332c382e1b132c3f343a2bfb3f11a116563a7905617e639c6bed21051f5513c4793dd887b9ea26b90dd7076aa4aad5614d53e87d91861caddc1dab846c6933a689eb2d1566814f31951546b820620fb60690a7734153e79e9ba9a054aaa9b908605b10384bba08e2213e683c6d64e9a80d8235f02c39a6bb42def54865164c86c08af24a614f3608b24a617bab86e5196172c81f1a6a001ca4cf72c9bcd6f89b8dcc154dd761a3c02362092db91b3da7dcb723b59c3e029be1f96e6933a5a7a8296da3a043a32e9fb27573a62352a088afa68baef5403f200d8d71743ed79ec3acbf1c4811a0308f425a05714c5637560cb7b36dcc91008d715248fb3e2e52c38b9c67381c3e0bd8127c163e320504ab20588f02a0ab036e8cd121d762af33980c0a7625c6129b83b6c8d7e304a4529ac33c204d79741c1a68ce356c4ca04a4f16406b462db4038f78bca2baab2926250cec30a3ce827e56186da8669fbd7a2199f53cf87cb2656349b6d2ba189079e7d2aff8938a983275551a21e7e179e13cbcea08885af930509c68456a9e778baa0e4649e2c830454c278a06849f088d130c176320b260381259d4458555a2d8715a93957470e538448a7b29958d7119c17f6a38f09a8b441c371114cf1cf390b56365d7c71fe9bbcb496401bc8b07d15c06a49c221828b6b7b56cc601bfd6d75fbf3aab16ec9584b78078324cf9060c5304354bc99e9a69c090c6513e16b6af982f2bfb4e0ddc4cb69ab1fea10575a53358890feb66162d29b4af6023eff84070e25bb84b0b5ef18f4bc554b8d661cb5a97a83b856d6437eb503de82760cedb83a5ac4b05261a02a621937231eee26777d75a3863cdbc24954f74b43260a089823b8c659108bc86dd1bc36e9643b4f62c1489a880099622b27160a2c934f4b3369a9afa7531ec39487ef2b8742b63cc5059a8f9317b06aa8401071d86791b09249510aef7924c25a2458152165ed7c4403c0ccb5a8db007221f930ff9162d66b4a1522b878d8b08624a0ef3b24c1cec21928773c8fb99f4816a7955a2a2816949eb1dc1a794f7b61c1837398521bb07c0063b2b01571054af509dc94a3ef1882b0928aeb4dca18769b593d2b357e56bb3148ef7d4cfef73068d0b48cb37c168168a46701e3b16b6e8d463fd47ca5f7b472878497eb9a60e629897108c30461bf6f09283a006b95ca010aa80c50072892a1d7f406799593112b81d61775d4c15a3ea54c4184b775a88cc3c427d9a36cd1e77948ed33bc0891b24dc7a08822cd2c94246758cc4e49f04a61d0d721e43e57b8c18337293c25e109e64f01e88bb0c08497d49083a9fe260349251ec123ce574a5dd6ca1d14a967e7177aae64d9678571d6b0b0769935a1a2a8dba53db6c5b7067210426c64f53542929b31d565bd25a480d9065d79852b0f05002964772465c3fca5f8307308055603039b1b56726eea02a8cc19c5af41309f145000d2aaed3038c17911677a2631242280c23e9816185c75e5dab43b4b04c8777a35721605aab1adab828f2640ec5b23173f6cf5d37ace602ce5af62108ecaa540ba46594181ac9869517502aa73ddedc4131ab152b53501dd4aabd79556476063da48c4978835f28500f810b77715257080d87247354302399485852314598fc6eb1f93feee6429eac96d37c8422dac30f473b56db0dcd2c64f1c18f91950e7984a88b63979b424c6d4a36220019881b5aaac715e426a6976a300ff171a29778c82a1520f42a2f0b10d26035613a1e0511720087be146ac9f0cba2c1929c0960bc16065748573d61eb195de53ab9ec802d247b210b747c70c45aebcf39229e4b938eff354fb9f65cc6b52ff0163494744848885ee577048b506a95112ed45466252783a4016f30e29b1928acbb448379723d51bc3b59a62df46ca75f64bae27aa2d9456c66e2997b48274f425004e6884e296e17912f7e387db452681cb32e7217566897287fe9c38622325a8c6716e5a767a626d98836cb779983c31d1802b0e0bca04bebbfa9e2cc02429f987a31f73274ce5320e1b0cff8154da331be8ee21cae8c5037a1baa4956b04833d4928a1c32147246002466716ea9c69f4032d33260c338cb13ea09e5e47957700c33bda9b147a3f3f64b46c933b7f4689d2797e4ad24df42c002a323ac0e781b7e8c8e679c949ca730826b3f6c28813ac24ce7ccb21136695c75b3d028fbf6ba94f5a06115c72bcb879d64cca29309502836edab5c7b2a79a1e1204161369c5e8b63dc513d0aac9fd366387f0aa2e736bc09b4dba05414659a6937264ba982b419342e8c063ec64b28663cbf4d12aa5a6ae5aa9056ae71c4f5643cff81ce6d7a8d29a250ac27be274afef453dd176c462791c249a817329142c00ba332851e50a01660a47e35bbf3890c23be173dec1a1d57a4837975c14269707384855e897cb44c4bef532a003409aea41d2fc889f572ab20c0409831ffb0222cc7246438a95fe4a6e32412688b2cc8c1963e38526201aa9d2b0963533b2fa42af59e61d53c4bac2bcc09e44c5f9c4963525a7c015244000749e811873a391f71315d1fa60c806390fb3aa80295e77e80158c665ead61283271a1997757e5c4dc6893ad71a63a1898fcda02165db76e252665153016c90bb9c8423cf8a1d371338feb40a382c2c3f99840ea96f99246044f4a5fa5cbb8d7473110b4a5238255e5c3d43463b055bbe46211d2e05812dc46bcd539c56a15199cabe5019220dccc1a828a5e0c37bf130a6df762e395915654b5bcb5c3eaa7142e1706697b9914a287513e407ed376354697144b33260eb966316c05dca8655a0436bf47967779d43cca5edccb932c023351542857268a57a74c4eb08b7809c289c5543cc3730594b3ea33de6e23a5600ae6a68cde3614cb1a80bd7c2379c1834c349c55fa73859c5a3ad45886286973f1363a5a536a0b08faf26a939179f873cac62281260868569372dcc744185a55feccb261fb0af1ee7a50dba2c49636e09687f4618667db136bb291f4b4c129fc7635182720521acf1d67c719a283c412bc9165d9f883db9049b98381a4412b6599316cb39986a9c3f8c069aedb9b5e13b82f3abc0c1cb70dbf0b5d1d66ea003676197c1be2c15bc6533a41804ce0c123fa55a87fa344d850af4f5b12fc0ae3610593e1bcaa1868571b2a618db9f1900c459376798341e4263c70cb94a9db42a04067f7a5310c606bd7ff661ef3508e6b6b6373c7ba0c872b8019676263bf912673c59a4c51372a2da860399222654518063c3e1f07cc6c93e91ac6b53f3c04516b76da65124325c59d4360091923d1883977a52b328c0d508d0f039696db843bc12c506b521ae34c9b9d145047293a6eb99686770dd587c92bc65aa3a4083b40e8fe2cf891c5152281744612b2598664e4368775572e4a03a9ff53e307caf081ca897dcb43061a404c689d934653769ad59d68475a8b0e7277bb280ac77ea7b1a1b6111c1574c6358dd6a472c49c264965f8cd9fab7d1fd2c5f4c3a4ffcd66e5b05a4879536aee3074b69c3d4e6b1eba48a8a50609e70baaf4c552f680f0b02afab2da76d8833a2cbc3b6f782b36a1f135cf64b6403e103afae34da038613e2853bbfc36baafa3c6a95347193f37c + +# Official test vector 38, seed: "6c3aff39f5d097096d882f24717718c8a702382dc4aaffd7629763fda73c163cf084807bbb0c9f600cd31a7135f48aec" +seed: 952b49c803d6d6fba69f4375adce8594847a00bcae2179da49af2aed0423250262d7033947ae42ca53522a65fbafe18d3bc3e0cb66164e9a094fe4b44d8977ed +public_key: 6a515110c076dcb486eafac9040ac0690b79f5278022f59bfc316494a782d92310489c9f93e61585b3bd292165f651a7017a994b2512f0a5bdc8e77e9bab7e5cccaa7bbc779d445e5f16b871989974d92d2c268bce10764c0146a683ae56c47c4644057ce8b4739031879bcc287b194cb36fab6916ff563248d04851c74a7fe87f4fea546a565eefd507457882cf288ed294783179577ee898bed18c97660bdb726867a2c9581cc13bdb263dbb414d695990ccb897fa31984734e3178e081856627b0a4bbc736a235b3e392b3996441198c41bf8cef5ec64d2f5c4b628490736cbbc076d8ebab4cd1ab4936935fa3aa40d941e85cb08774520bde23f24739400bd45b1b056d8a09ebb49a3e4b7209037c94a47084604697185bac8772122d1bcf22888f165546bb699b23b2262035135120cf677aa7f767ca049b869137999884e360518358852cbbca3f90643764cb30fa16cc009766c43b89e599203d6344b1081e97c863190ab57d42812d603ab56068283cd30e92e3f7a8989715479cc3735f3cb1ed9120e8b8c720ba35ab1178b426c413c5e89eb5483bb0fbed13a2fd0783ce4bdb1aca87d80000dd48caacb57c74b802c6b133817ab099c84f1c22383e57a759ac6eab76df67876e3591f32595a56a027f2087b63db7dc138cd820a84b09411da2284ac78445850ba820c31b1ca97f3e680e24201fe67154b935a36292b18857007953a848c49d0236406e7a320243fee64ac24b02952d0a02a57ac4fba19ce373e3382cff61160913ca55a091696d782f4134db83958ded48e681546ecf2be93c09a9bea7b3ff420c84a9107f4a75a2a1c40ba0f9e6060e936218f0c0904bb29add2305cd59e29d2b10fe667f9ea49cfd149d1d8bd62e549e08baa1ccc63b8cbc734a24017e4a099bc5a939828ffc8cac5fb5d388ac8613216f21942675cb714e32cfe666357413773ab5f6a2c405179995ef42635cc7db7238dd7c410ba529e7d7391556c5f604c38fa079a70fbc2e8b393306832fe2a8bca891d880209b9719eb4d2732581408a3896735143462a45f5e4267084bda97a9a5324a2e23a714c1322f4368be3ea5219c10f56cb560a78786c2a51db18c79f151f3743a7de67c43a35c63d1b70e17aaf4e4c48e300a73f9c07bfa776ee8797f803ca148aba782a2fab110a7c4440c5791354b25c1107106be979b2077d422a6d8edbc04225ac63c3705394c9fd5389c11855057572fb303ffa365cc2854a3bf620ce5203b21bcf7ad9c675427ca1294c7b001e37a02be18473d1b13d9c52b9d59bc267ecb1fdf3bb96c2b374e72e4bc0898441c47adac60c1955bd1a5096f371bfc709ef624078139feb979c9ef48bc0bb9100d0a97198b466bc5821978c87da85c4e4164ba61a010b5fd99435dd18129a6b379c3232f75c8789d486ee3b6c84e052b55066e81c409c182d4e84926a42abac49846fd7b6f7c305e234130026540a6571d2c241c2700ed4e073d0262bf196164c71a62b904938cab91cf12fc8d527a091c20a86b163aacaf2f25d1814bf2d435dc7881b0f0219bcf40f90f894e74392fea065fd1b69f2e959cd0a5850b002cfaa8e44d0867a16ba5b173711d77f355a71bdf7674299a91cc05f2c772a5280177f2551b6f4a986f3bf584a899e755464166c3220130e694616f76cc3722c999536b6d145dfa5a27aa591ee994332893fa87acc2df67113f8a9c438abfa667022b92842c73b15047d6db08e02930a6348a71472a5e04bcf856058e785c10d049af83736b2f78f8fa0b16b0b7e897cb695ec20d37c35190a079a57cb41ba5a0f010f4cb94b585466c9a802f0855946361237a0840d43487bf65bd9f000f2480afcfc03b3dbba6ff053aae4981fc619d82818251c0d00ddb269042902b4c28fe6578709374f2461b0fc1a00441b78582db2a76dee8729be071ea3c9957f5a3e75934628081eb8339ca5cb5ae83677d4c31d7b12b0463b57bf7aae0af3901a9795085b8aed0564d3755588a0829615785f322add179edf08204021b86bb3cf8f3528ad652437ba8b0c6901cdbb748ee8a2d854644cb694668b9ce322992dc43f2d8a7ee655be3b257a0974ad0649104b6b4e9a16bb8cb79a42968ceb1cbbbdfc6c3921ae35f6b22ac3c2f858184475b4f2a12db3158b3bbf2d64f07ee186fc57de21c26bfcf6b645f83cbd47cef72136aeb644 +private_key: 68e429be33972613c71269a6d8c28f37780f659bb7329478251ba1f0a71e5292986ef1054d57a4a1a98eea60bdd2244908972f138761469962af11078f880e900543195101e2238cc4065ee72a33cab77529c891209116774a34aa531093b15a133b3bbf24ca44787294578312a9648d6b427cc630be8420ac73ad795175563b471694658721ce97a74719587f6dba69307600ecb86c16d14428d264080b7083145c1ccb143933b902d463ab1264c53360c5fc04cad928d3f91efd67795ee2a9273a41353529cb3b6d3f61b2d4759662f1b0aab989b1d42c40e05f53e7251d56879e57c40dbaaeeee626f87b4f4efa07a7666049c5c6af4446260a1c2641432de89eb582ba6f8c84640723b7a6449f268a7e8b93af9b8a98552bf2aa940e277859824c22fb0ce8d1b3d118813d1c9749a345c990818091a21ebb2027a1bcb7434097b83fba702eeab0a8a8c3719df9821ce2c0c6a392ce5a48b56a73801accf9bc0f55c96ad21c3ad7793dd62ac413f9cb25a75065e68edc63508b13b90b6bcdcc127816d5c1e3b246b1db27e50528ebf6b946b93962469de91a70ec36c848c8bafa2b13199c146e224552e619295703ed8c441a41188a004073392c59e88b76e847a11b527c6479daf28548a5540ddc811d7727e203b51699a0dc85820aa90e7a96378d99148553726d251f73ab290b206452fb15314a7005a50fef5b6a3c69b5c91125a161699d0956bca47394567eb0cc4145fca15b2ca32a751946841829531adb91b9efd60bb2018a13d736e67aa86c12517b134cbf51a6831a80188b54b051063561b1419c4990b1aaeb52280a2ca421a84b1f1827e544c27b88c1db7593fbf3a9146633dd41a2cd26bfeab57c7b01c3a7b07b0ea196db4c21259baddd81981d9a917b4a7bbbd45fd2773539817b77c09e79797bf301077bda0e6de9829b01c6beba809130a1a9724e3ce39931b58c07344ec731a11402470828be43b33601667e46c66a59979b8b1a15d9739a7da6aa19ba6def480d0e2b2f859b6482d128ee6262a929cec408974af41b9e0c9c6a9b0c32abbae27a36dc373199f65a18d4b3e4153086f003c127c7926c9dc3510ba0f99280a5360f29447c9204e7472e10486c3c465dfe4855b1d8b8d557b99232531c0b43426521c8034518d32bd5981c149883e8b95ab150c051793384c9662aa795c93b25dd3957fd3382aa117a9d6b333035650918cc924732737aaff69472b4f699a99288c5a24946138fb955385a8a75f2088c143057275c3e7c97615c7721e0a049b544864c358aa8c0a30ba788c2e71de8261567084040f83f23e333a4d74c55d52acd20bd7c56142c2152407864f62c3d482622d87394e246110e133315d151dcbab02909cd0a10754681af44c2445331912a4031dd800e07e4aa3b37aaaa827738048a5afbae9677452cab2deca0205ca5b3e6f577892555ed3872bc845f97a86788a9577996810f0277cee3235574a6ec91cbd49cca68c870e161a7c9cc4b4c2252bb4c2f7cdc0863959061d73efd366a65c140a014cee9042734a9b79d67bf7ab6ceaf5a2c1feb9b283502f940cb7e49c199cc7a4f885bf4b041cf418eebacabb41067042b3c9c42a72655947ed2233a778fba0338ba0b6ff8c58858e48281799f94acc6694148b07cb1a5f8ae6de647251758a2a72f19a34c6176614dfb6294646c5b95c59d857320cb2233b9aede91a6837820ef74376ba533d06487939348cf70681053078466b900206af71a76d18a4e5f063317ecbb394ccc7b5ace6151b1fa662abe652186b92b3f785e828c2b1ad967feab658439c73ce93adc47382c63544fe5cea89a5c2602aced184cb45b18fd3108bdf70152421571b9a432d299eda808f8e0794e482bf468cb7b9b349932492f43c57e216281e1506d9a1679a54e4fb1986e284e6ca5466bdc8b3386b47e5103c0c70d796b4d42e17e279a9a31e434d2625efeb4abac6bcd3014bc1ffa5b6424674710059a74b6b4e4b32bb8b183c76d00a109909cc799430a2ce6abee67504f1a65f2d4c5a305639b0a1e31776797734dd535bf20545e37b33624865890114c01c874c7f78bd6d88ed73356ebe5b14db386cf677fb9315f8fd9a32039651a28338a0834696613502ca86f4830dd34b806a467fc2a726a515110c076dcb486eafac9040ac0690b79f5278022f59bfc316494a782d92310489c9f93e61585b3bd292165f651a7017a994b2512f0a5bdc8e77e9bab7e5cccaa7bbc779d445e5f16b871989974d92d2c268bce10764c0146a683ae56c47c4644057ce8b4739031879bcc287b194cb36fab6916ff563248d04851c74a7fe87f4fea546a565eefd507457882cf288ed294783179577ee898bed18c97660bdb726867a2c9581cc13bdb263dbb414d695990ccb897fa31984734e3178e081856627b0a4bbc736a235b3e392b3996441198c41bf8cef5ec64d2f5c4b628490736cbbc076d8ebab4cd1ab4936935fa3aa40d941e85cb08774520bde23f24739400bd45b1b056d8a09ebb49a3e4b7209037c94a47084604697185bac8772122d1bcf22888f165546bb699b23b2262035135120cf677aa7f767ca049b869137999884e360518358852cbbca3f90643764cb30fa16cc009766c43b89e599203d6344b1081e97c863190ab57d42812d603ab56068283cd30e92e3f7a8989715479cc3735f3cb1ed9120e8b8c720ba35ab1178b426c413c5e89eb5483bb0fbed13a2fd0783ce4bdb1aca87d80000dd48caacb57c74b802c6b133817ab099c84f1c22383e57a759ac6eab76df67876e3591f32595a56a027f2087b63db7dc138cd820a84b09411da2284ac78445850ba820c31b1ca97f3e680e24201fe67154b935a36292b18857007953a848c49d0236406e7a320243fee64ac24b02952d0a02a57ac4fba19ce373e3382cff61160913ca55a091696d782f4134db83958ded48e681546ecf2be93c09a9bea7b3ff420c84a9107f4a75a2a1c40ba0f9e6060e936218f0c0904bb29add2305cd59e29d2b10fe667f9ea49cfd149d1d8bd62e549e08baa1ccc63b8cbc734a24017e4a099bc5a939828ffc8cac5fb5d388ac8613216f21942675cb714e32cfe666357413773ab5f6a2c405179995ef42635cc7db7238dd7c410ba529e7d7391556c5f604c38fa079a70fbc2e8b393306832fe2a8bca891d880209b9719eb4d2732581408a3896735143462a45f5e4267084bda97a9a5324a2e23a714c1322f4368be3ea5219c10f56cb560a78786c2a51db18c79f151f3743a7de67c43a35c63d1b70e17aaf4e4c48e300a73f9c07bfa776ee8797f803ca148aba782a2fab110a7c4440c5791354b25c1107106be979b2077d422a6d8edbc04225ac63c3705394c9fd5389c11855057572fb303ffa365cc2854a3bf620ce5203b21bcf7ad9c675427ca1294c7b001e37a02be18473d1b13d9c52b9d59bc267ecb1fdf3bb96c2b374e72e4bc0898441c47adac60c1955bd1a5096f371bfc709ef624078139feb979c9ef48bc0bb9100d0a97198b466bc5821978c87da85c4e4164ba61a010b5fd99435dd18129a6b379c3232f75c8789d486ee3b6c84e052b55066e81c409c182d4e84926a42abac49846fd7b6f7c305e234130026540a6571d2c241c2700ed4e073d0262bf196164c71a62b904938cab91cf12fc8d527a091c20a86b163aacaf2f25d1814bf2d435dc7881b0f0219bcf40f90f894e74392fea065fd1b69f2e959cd0a5850b002cfaa8e44d0867a16ba5b173711d77f355a71bdf7674299a91cc05f2c772a5280177f2551b6f4a986f3bf584a899e755464166c3220130e694616f76cc3722c999536b6d145dfa5a27aa591ee994332893fa87acc2df67113f8a9c438abfa667022b92842c73b15047d6db08e02930a6348a71472a5e04bcf856058e785c10d049af83736b2f78f8fa0b16b0b7e897cb695ec20d37c35190a079a57cb41ba5a0f010f4cb94b585466c9a802f0855946361237a0840d43487bf65bd9f000f2480afcfc03b3dbba6ff053aae4981fc619d82818251c0d00ddb269042902b4c28fe6578709374f2461b0fc1a00441b78582db2a76dee8729be071ea3c9957f5a3e75934628081eb8339ca5cb5ae83677d4c31d7b12b0463b57bf7aae0af3901a9795085b8aed0564d3755588a0829615785f322add179edf08204021b86bb3cf8f3528ad652437ba8b0c6901cdbb748ee8a2d854644cb694668b9ce322992dc43f2d8a7ee655be3b257a0974ad0649104b6b4e9a16bb8cb79a42968ceb1cbbbdfc6c3921ae35f6b22ac3c2f858184475b4f2a12db3158b3bbf2d64f07ee186fc57de21c26bfcf6b645f83cbd47cef72136aeb64469835f3a1f1d9511e257abfead77d365076a5c423ebf1554cecc7b29c0a61b6762d7033947ae42ca53522a65fbafe18d3bc3e0cb66164e9a094fe4b44d8977ed + +# Official test vector 39, seed: "cf520b92a2e3677afd003ec1ec6ef136a709d78f828c9c0dd4946efbd451c5faabfc83ca66f9d3d17ee4220553b7a69f" +seed: 3c815e57e9233e975fa1630208aab206b71ae0db37a7a8789ac683d9f9b2d29801c8e376fdb140ee343106c093af7cb149b316ba79446ceb4e5e0cedb9b164f9 +public_key: 81d55ab1318e2c501e7d462cea98864e291c2c727e6ef2349332680fb06b09767a2ca72cfc078163c140dc7151d869a9c785ac62c6ade5f7519e070a08269938c7796b54b482f027a0c63ac24a6a00f7a0e7c65843e1c1fd01bd11d24ecf3c8b90cb803626044d03a39fcca7e918ae418512631898f417c9c9618055340a05f67b6f1cb7cc44117af09922cc07e9522285d16c42a7b2f833b51e72ce1c28a3ff37ab697cbd90d96b3e460c56c1734f1b11280ac33f170b3447c07f99a68f9a6f1dac6083368555782f800bc7f4409abf76b0eccb6da8f0825cc0c696cb9119340f663317913a641ff369657207194b65fa6b1dbbba94d22b512b56877120a6edc10dafcb2f727349e5831a3dc8a539c0a55a517e65982eba97930020608094b93e481fca819058537bb2c051cb2c3f0e5a97e8365a14491fbbc03f603977273a035855c414812ece238d254ba7334cc5bce7256716077766cc21c617a9c378fac1786c1cadecd13948591198682cbcf0cb098c504dc4b16a8269d13a701731b29a71432205660005919721c994011ca3c0ba8c3178a6d80b2abcc9f6e6b7880811894cc6e62c0134011aafa69568a1b95bb43c815c1405b4351a7290b856c50e284eca0cc384a4551f455b503488313a341aa25f80aa02c97b9d3267492c31652b7654621a59f1aa64ae4410a1099ed7f14aeb10485f794e61157c1563ca5515684db66eb99b76836a2441139a0906b35553c9e3e317f5e2c08487697574464a9936aaba528fe2b0c0c6b058b791d94aac3bac180b0609ab36b27579864c5bc6d8288292387dc4931fc889a45fc8bad636ae2bd493a5ab401311084fb57c6fd88c2f0c504d5c463738ba7c5a97237c1681d8aad66307ef648748198f6ea0c8fd6ba7ec424052c8a9b070c571b136cfa86f199542b12cb2a77c6973494bd41a2f0b55cb0e4122d0958026b7c54bc42eddc040cea8470f738f9c9916c158a9ca6457d8d9a0649337a3ec7347475eea8c34e8127636b3897c547c0479a1e22bb2f7606afd97cabee179467880dc02c7b6f892ff3a7a29844476fa9843943d68ba4df2db6b8368394b62cfcd257beff5b8b54150407c5529349769824af105adfabcc53f936a8a492825d6a9b1108f1ea258c9dca2d739a600f68616b2094ad29207184607985e3bb784d7977c20dc0585233131f93fdfdc9ee151c6937c7bc7fa4af43b3b1dc4774ce6273ab04736308e89e21eacfb81845678a0c220309a3c9fe3104f61680f334227670f95f2b84c137a964a0a3a57525a4b99b231a8f22830d5bc588c0c705189b2e8a19c4362cb50186b99b5a783031300a26300280f279987ec058425817327b481cbfc789f659530d9c5d9c8432959adf71741c1f9353d9a84836a5a5487392d19b5073a72869ba4e454c14ea5a93751322b8592e8566236a86c6619648be1782cd03749d9b9604209ec66804c64913a143887212e7acb54d5d995d0cb17e3e27c6dac70904235f5c9bb29d908d8098b11739b16706541f31b53e3a384e594a7a640629543943a1262558530c193d18079426708117197a90b1c45e8b394125ac46238d2e22fb8750d1c190824828280565093999608f4113acc18370509201056d589041d748b2fc71da15490882805d3d3c0fa0a837400b73d25688c698cc8d78d144a80aba8372bf7c349b9c395bbb8adfb885906402eab1ea58b622ff45c4dc14c9d11708659596552b18a3c0a1af2cd7b558f15f461f0501c409a120b4468f2c09282ab7b25f9b028746fbc9ab77af4262691a64dc43d59139c21eac58e58a491e26e10974e6cbbb82af385c4f77e7312ccb5194902257d3c4a4fa1a9035a670b5db47ee67c1b07747b889a6c481490462829b26184be3c9b0d7a0f9f2bcb10c8176f03464772479e9b84dd28ce94199d31845dff0614d02841f4fc92f9221cff071551e82dc829c9cf991e42265f94f7b4dbe7b791c244e37c3ca4192f70c32cbe9366db59a9dd8582d6e69d849151cb7c6ab82ab8e7854c7b4c15b1557443cc2b1284b7fc7b16e415007427b5a9909b99f21c47956c45e14022374440b70415b896659178d3c98bc4f3bbe904a470e4838849bcccc2ceda8b9bb1e2af29169d5919145b3229fb8c9ee705cff4d91fb9729c6cb52725321f208f2d0b39ed53edaba2c350ecba69a4ee1f3159930f65c8baac80b2e0 +private_key: 4ee12caa4baa2439ab1e4ca28bbb4f3a85c606a636cdc0553d821ec2aab20d0394a0e3ac09c96cce60cbfd9a1351b3cceafb11ca7c87bc42a1a191506ba9b3b617a6aa7a705c26b7820068d930bfcc96c3728bb277b157cba1c1f8f17c415a1bc9e9ae5f4771eb38cfb7231108212167d6074ea1cf2d5b4c04179740c31ba48750e206c8c584355fa9c57d6cc84d1c88bb2a43fda99cfcb14da5e285b7ecade1761d4c711b7a83b738d7060bd820e03529c608937b4734f8237ff746b47b3460a40c9ffbb18b6b30437c4b55df55544f74bf3fc5758dd2b4320974698aadb0431f5670580ed39c1e1645101b635a49998157221ae3087229bb0f9ca04d2766cf308500eccf34c40730888fd9c1ae671415892a8044d780d27b3f3ba3751cb9c9bbe61174614d2f15339d0a066eb738a0b43b8e0ab0e422b64f50c125769bd812b1de3672a1976402909d353042d8c4a535a1acee33245254b575e71c5713a3dd919a8a9446b9fcc80368be2f67669bab466b91486a94a940e007a761461401d0512788aa06111c8c3da1b136d3074598cc7a9d9aaf0a390a6468aab1fb56a71414139840dc7582b439aa78b9194cfc00b0c357e8840fc583380942b26174838d558c6c441f1e634ac590bf9c1344b8fa95aba16c6c130d8137706c424092ca5cc2bab74340aa6ed81535fc6a0ab7b59cf276f55583759b0b009b4d6e117410212dae343eaac5946c3b379b7169cd5b5a4e838a2b0a7810a05c2ea6bf10667b4cd7a2e71b321d2395fa48a02fa08497fb68c771b1eae67d5c11224eb19ab241770fab2fc1800074e697d27b0ad3035cdb09772b222945a9bd9b2cc20d4b488df40e80776eabb475cddaa0efd3c05f1c792ee9c946e717984686bd43660eb334bf775cc5470462d03cde3c9830ac8a66879ea04aba173b0858425774fa9306590a8c273cdcf347202267b44c3c52063693abbafdf65f4a2949c18b0bbcd02812da0eb7f6a753b0893c4771a13986c408a2b2f3cb2144b1b7f7b6799177e0a258415cc91d449009c17a265803a038a21ef2911778242b043e19f986ab2754c33c31c8100a15f8609fc05804730d0b2212768901d7e4afd4451950cacc42e891ae845a53bc396ed0b6c1423584c6b575a535e949909ca7cd95d05e743c16c25b57fc0a973e7b026197c6eec688a5c19596bcb9879b44d2b1358f35b5a31bc3d8e38f003bbcf82a540993c73f30123c66bd31f04964235477d5323f69c6a99399055c8347cbb443c9ac5ffa477e05229457111dd212928b337dd6a98f59a303097536c10d7064177e06830497a644ac404226b688d354237742fdc6639a979625558ba4509cac106121d847932311e4c22340b056f0ab54a4a1b5bc186c864397d7984defebc974b25b211849ad36a93ea21d5eb9926f7c6b96233f11822bfdd822fa211ac570196bd1aca785463c56a7fbb602aaa3c8dee8bfee7c18fec5ad0f844ebe66b17d71337f71bc7335a86002ce28e65e6a5101c7871e9f651f04c1c6ec45c47bb97b1e4253e4110fb0339fdb84a7ca40a6f7ac81fb43681ed56c1f51ab7812cbbbc3a512ba340c566a9d60cd1ac90d568033d0e1166d70c9e10583e61282794b8247f4c2b248a71d379302b82e9d275f07bac252ac4d09633be60002a2a7cc23f1b1448c1e1ae77fe9cb8677cc3a2e8a1f6f3bb786a8b3b585946dd909ae296dc6648f1695b66d51c056e741c4468a3db6acc1c340228ab88d83cb168982008d9fb07b177278c893472437a12f3b2099c80322610c96c9754cdb513626297dd9dc5c8b64babbb2cd2b904a52d67a1d00c92462a291d6b509fa66de596516774edccc48ce2c145e625158381814709f23d3427bb56b465531453185ed500341a317f97c48373a0778293bf989529edc39ca931f23b341bbe18bb071c61e488e45e100091ab58f18a7f33335d11019a973899f173fef0b43454a2d091274c4601029176900d03d068164b2f1279094c16d38b32c2973958c0cf5362d34983ab213a4cc235d3ea428bf289d08428e02c3b23dbbb89d35c7c571a1cf018dbd6b377dbb2f09fbb30c5c0244c8782ac46e98c4cf614c42f48b49cfd8114cca11e1455a419c2bede2684ed140aef81bfff6c2b32911013432fdf751e5855320202481d55ab1318e2c501e7d462cea98864e291c2c727e6ef2349332680fb06b09767a2ca72cfc078163c140dc7151d869a9c785ac62c6ade5f7519e070a08269938c7796b54b482f027a0c63ac24a6a00f7a0e7c65843e1c1fd01bd11d24ecf3c8b90cb803626044d03a39fcca7e918ae418512631898f417c9c9618055340a05f67b6f1cb7cc44117af09922cc07e9522285d16c42a7b2f833b51e72ce1c28a3ff37ab697cbd90d96b3e460c56c1734f1b11280ac33f170b3447c07f99a68f9a6f1dac6083368555782f800bc7f4409abf76b0eccb6da8f0825cc0c696cb9119340f663317913a641ff369657207194b65fa6b1dbbba94d22b512b56877120a6edc10dafcb2f727349e5831a3dc8a539c0a55a517e65982eba97930020608094b93e481fca819058537bb2c051cb2c3f0e5a97e8365a14491fbbc03f603977273a035855c414812ece238d254ba7334cc5bce7256716077766cc21c617a9c378fac1786c1cadecd13948591198682cbcf0cb098c504dc4b16a8269d13a701731b29a71432205660005919721c994011ca3c0ba8c3178a6d80b2abcc9f6e6b7880811894cc6e62c0134011aafa69568a1b95bb43c815c1405b4351a7290b856c50e284eca0cc384a4551f455b503488313a341aa25f80aa02c97b9d3267492c31652b7654621a59f1aa64ae4410a1099ed7f14aeb10485f794e61157c1563ca5515684db66eb99b76836a2441139a0906b35553c9e3e317f5e2c08487697574464a9936aaba528fe2b0c0c6b058b791d94aac3bac180b0609ab36b27579864c5bc6d8288292387dc4931fc889a45fc8bad636ae2bd493a5ab401311084fb57c6fd88c2f0c504d5c463738ba7c5a97237c1681d8aad66307ef648748198f6ea0c8fd6ba7ec424052c8a9b070c571b136cfa86f199542b12cb2a77c6973494bd41a2f0b55cb0e4122d0958026b7c54bc42eddc040cea8470f738f9c9916c158a9ca6457d8d9a0649337a3ec7347475eea8c34e8127636b3897c547c0479a1e22bb2f7606afd97cabee179467880dc02c7b6f892ff3a7a29844476fa9843943d68ba4df2db6b8368394b62cfcd257beff5b8b54150407c5529349769824af105adfabcc53f936a8a492825d6a9b1108f1ea258c9dca2d739a600f68616b2094ad29207184607985e3bb784d7977c20dc0585233131f93fdfdc9ee151c6937c7bc7fa4af43b3b1dc4774ce6273ab04736308e89e21eacfb81845678a0c220309a3c9fe3104f61680f334227670f95f2b84c137a964a0a3a57525a4b99b231a8f22830d5bc588c0c705189b2e8a19c4362cb50186b99b5a783031300a26300280f279987ec058425817327b481cbfc789f659530d9c5d9c8432959adf71741c1f9353d9a84836a5a5487392d19b5073a72869ba4e454c14ea5a93751322b8592e8566236a86c6619648be1782cd03749d9b9604209ec66804c64913a143887212e7acb54d5d995d0cb17e3e27c6dac70904235f5c9bb29d908d8098b11739b16706541f31b53e3a384e594a7a640629543943a1262558530c193d18079426708117197a90b1c45e8b394125ac46238d2e22fb8750d1c190824828280565093999608f4113acc18370509201056d589041d748b2fc71da15490882805d3d3c0fa0a837400b73d25688c698cc8d78d144a80aba8372bf7c349b9c395bbb8adfb885906402eab1ea58b622ff45c4dc14c9d11708659596552b18a3c0a1af2cd7b558f15f461f0501c409a120b4468f2c09282ab7b25f9b028746fbc9ab77af4262691a64dc43d59139c21eac58e58a491e26e10974e6cbbb82af385c4f77e7312ccb5194902257d3c4a4fa1a9035a670b5db47ee67c1b07747b889a6c481490462829b26184be3c9b0d7a0f9f2bcb10c8176f03464772479e9b84dd28ce94199d31845dff0614d02841f4fc92f9221cff071551e82dc829c9cf991e42265f94f7b4dbe7b791c244e37c3ca4192f70c32cbe9366db59a9dd8582d6e69d849151cb7c6ab82ab8e7854c7b4c15b1557443cc2b1284b7fc7b16e415007427b5a9909b99f21c47956c45e14022374440b70415b896659178d3c98bc4f3bbe904a470e4838849bcccc2ceda8b9bb1e2af29169d5919145b3229fb8c9ee705cff4d91fb9729c6cb52725321f208f2d0b39ed53edaba2c350ecba69a4ee1f3159930f65c8baac80b2e03649c5c2f1142a51eafdc3edbdcb3c5150c608d828b7e1b9c1ace00f9a548fce01c8e376fdb140ee343106c093af7cb149b316ba79446ceb4e5e0cedb9b164f9 + +# Official test vector 40, seed: "197e5d562de7e01bed4fc597db28dc6efdf0179f3a5bda5f94caa39d67bae730540534d59a7a06c8448f628da8b7859f" +seed: 588760826dcfbd36d9abe6ae44a669bb3ebba6a218eab69e30f18a3bd536576e0e860576285483bb5fd36e2f944d32c4317bebc1e441470c1372046a790d79d4 +public_key: d4f7656b2b7819120a7cb68a80b91f2783979e1a329574272a3b154b52843bf80f88d947c79a58ae555e819674df71b13ea48741d103d345a8d4786eb43012fddb0b01c3baa6a0cf128b099972449ecb3de50020b025c486b4b5b115c78d927fe5e06bf8e29068d0b3d963c3b46cb9d1ba3256fba01f2185cb566556151ed2e1c993469190b75fa75259a5b1096d5a1647448013c21eca67a3aba096a4dc77f35c2447e81114f732148663a9439b1304b148b813f12c61654688d35318b8c0a8c33738a2f1bd2a1b6e8ea93eec771ec8c0094d4c6a45ba61579c72c2a41ffd468a6c679fc3d6b15d5a549b1614bc8874304bb6f01b775511ce5bcc7c055441ac72c34ca164f461990a57baaa98840439371c26134500377b39ad6d222feb0b67dff197c550541b63173e2b1b7031b30cc3772e97734ad3c5b6243b3269c48fe055a82c9f4d1c166c294b8077269304cecbc404ebf8bd82c041c911b09fd7c2cee33fee1bb754878d8143cc93b81c7e99323b5210e7a64c7a3b8d96c1594ff3ba50132484e663797246dc3238a1eb743c4a33c51c6587a224bec9bebcf5ceaf175dd37c3591ac7d82512e9ee7c4acba2cf5bb26d3a2188be321114a7724c797a2bb26cbe43b3fa03a8bc16dd5a49a68544e9feb51786c46794c9f5239b7584acff68a2f7561bb05e6b5505c249262b509a922e97c40b4736e8fc2af4017acce951cdacb3385f060cc1c55a4f79a60daaecc939036115d2f480f6f0315fed05387e99f9448b6155a51d66a6940519b361233b2b7b34c740f0cb64a7cf0bdc48677292b0d1ed5898ce928e9040308807cfc730be0d8c614d322735c1af2d2199ccca1dd80a96cb60247125cab18ce7a1c5e4f0c4b978581742c8550cc9c84b0632967654b968c01492557ba0630ec0caf04a443d9b2f616a9cb4ca13da38fd9d611a59bc697c20e8eaa0d2b96aa2db111bba3a05fb463bdf7a777cb91b1086adce17ded04be8b92254ec5442a6852134b5fde9b060fda258c18740b79970dc981cdb883cbe3297fa33ea988b07f9a581bd086d53507ce07536012a211c6b4de17b73a08153c3514daf12185416a81c61fe255a3e04b33e3c5a6a0188f6e09855ba504f838cb8417c2f0e97bbf5b937ff53848031274489b5366abeca2caa7636cdbe83f15980c02f207577b5efb947692fb40ae7b36dfa83b728478f0541511fa58aeb121c14056451654d0dc4421695864db64bc271a79ac0beff724b6bb2290cb64087b72297a6c3881765cd909aafbae72c9448b232093694ce522c72d2475f281ab1b633432175e3f78715de1082df66f74a351903b115d74489a32bb7a873aacf195f8f043922272cfec2798f52f65f4638302c62648199e7979f4740b30d38f7d794cad179ac960c838db4ad7038ab84955960b4822324c5d01c5985ac8f47138bab522db895af2f9a983494f360b061bc5120f385166a5ae9ab844c278008e47b655570430451cb606c24840b7a0e51268cba81998697a5653e33bbe47d43edc3249c32964e87bc8ccdb6d603c0f7387306b043fdb343e8500aaf0104683dc9488b0ad3d04a1c2657f11a99d46b040d0950d0937a4927012f4a78ee2405eabcac445845d7e88b54a8c57947b7ec0c12bf654059d93ba38ba2e50ca3fee8194053b2c9f10cae8c846710392733123b0eb0ad895216efac4931cc782e886fb2c87bed305cdcc690dabbeede21addf7468e4873919865b905b3149a4d686b7c96fcc014b578e1d36bc3b63449f467b09bc84a92b20b01bf70200e703a0ed084c860f40a336576274c7e5475835bcc8ec515050eb8215f397f6312c9b1db1ac1da29ff90a4ed58b8f8623d4b893e1ff94e3e48a0ddc5c221c0b34a798713897bbe16a4c298c5e9f44932b09806e554f76b76fdb8744cb38d00f24f5cccc75dbcb3f81233c454ce3664a807d82c68255c422866cec26ef6e428677b4db8f712abf50c1e11c9f014b9ad59077cf0475f925568300c49c08e4e17cb7a5581ddc17331eb3bd7bc04c933b646224d3386a3140cadd445b632268458f63942455ca1b164c9ccb2ae679ddb12524c34cf823b3626b224e466245cacbbcf57896b7acc6f6b702ce9000371473c622303db63b2744c7138363a832b2973bb3144bba8001999eef108e317890c4b63e857c6de99266629d3267db18fd97baa47b2da64fcd1 +private_key: 04c78eb9c2cafcf78072b8508905b42c5698b3c86d8f20bcdc31a3e0801a084b35913203a642cf671c434ee39477e83d7314bc81a5b0a5d010031a26dc55bde54c5194525091314212063b7e852476364aa64155e6e9a52bda41c17939e553c26378175fe3c4cff13e3f20543a275d6263276d2262d1a9596b52996c4982817a4fded3924416b65e9bcaa45c6a6956c3724c0ea4171757393b5af903de5694e8962f3a122104092924f25e1590419fe11cdee60bb33b5bde000f7d621811819c77e4584a89659caa85e7197588498ee8c8a8397c1157c29a7c8b696653a941ec2579c1ca7368bc0be8bf4442222390bcbb871aec382de3c5011368cd420abd03fa8bcc35a99aa27a1412515710b3f5118eabcc9055a09b350644a490bf83dcac4c2035c81895ad53545d5b59bfe5455ab9c7caccb4418b5830838e0403a56619af355ab2448a69f2b848ffb42a8f5407fccb9c5164b7f306b109533dd8c690a5a9332f058a1978915244645eb127b6ab92a732bfa7f0b528aba0bcaab51d52a54f57cf75c54ce462bf7ab8414c9974b58272357bc204d13d198058cbe21781e7a83507a7e1220195ec34cc84125d18cb7610b3996035e755421b969ab6cca1b79a8315b791d96207b6920af2e26fe66ca583a943aa3914a930943a723447c1639c22a937d91240839824547eefb69e8c5868f0fa6df79570dc01041d763b13c08084b8cf0213a5eeabb0d7507a0f8837e9138cd99349d4b2acd1f72749b804eec23f88ea19b00b5fc06bb665886c105786b45610e9a431ff8a48da00ad35369843096f542396ea143974791c1e830256eb7c291368ba95009e6b4ae821ba1839ceee153adc9b7fd5b6462d4938a9129898b9ce6be51c9ae90b065232616712580a80c6e57d57b1c597b526cec406a948abfa1bba5d1835eae0755270b8ffd5cbdf772c5c68c4a7f66f972c1c49553e206b08ed95067bd615b12b35f3e84f6e7a8fd72180fd904ac46ca901b89a5fdc2da3b472f0a547901755194543e7a399c4363c33cc305345b79ea06889e12e049319a0428142e6a77d4b7223c72d3dd0c8e3c315b2677b19fa8c1ba7107d10b31e719a2c90abc3102ea5e074f9707fcacc8a10e42014c21d7aa74153da8b80779ef71a86c9d10bbafa7432c9072e3cb4def92b9264af134917dd24a687a492f0d351d3e9c61a421d0614baf259752db556c8bb401dfc33d9b0869af44c81210bc25aa2ec07afb5ec862d390c6794a0668580ebd39a23f914feba865a33603d5794e6f4bc210bb82b7a3914c1b5812120aba6a58ef7381bc89e49817f0607980c93458343a12e26666c664832da7552b804ab349e0b56a174716e3ef1270669653ee63a73a09c66e12c7b343a7ac13cb5ac4c740057c947bc3145b037d756bb8bcbf46097dce24c2801c0b364b8e02329f7fa183c1003fc715ae470b50f1561fb3168b421727e66940a717a350a69aad45e506144fd528f07235fcdd0c5b7b659f8c0bf85bc53195c75c447442e533b12e08404db99a7346524964e312c48736c99a651407a3661b3812f83da22f2e455483c44af351ccd50721828313586665e95804f9a4e7d3878cf134a9d815ab4fbaa711517119043a46963101390c20c552d4c5366a92693526ed0893aa097481f8658122c3df8fb21a150c52f9367991bb31955035d286fbdb5040e58556b2a8b7c88011877890f9abbe1292f9bc36cea7463318c5047629ed9a31c39d65f92c18b02e5a7eb16c4aeb68d7a057623f25c0ac68b48aa3a06aa534830a790cb36840c8e1c4b653cda1acdc1a13777aabdf19f55b66488296f407366dbf03d3451b8c55284a9f15f8f16cf51ba93781550ede5bf43ba4470e6bf1d4236c4c78f7710bd0df79f98d55873aab6e8e573d88b19655497812aaea85ca6b95ac5e0e908d2150d68c110e24a48f0e7a581eb4fda5b7c3d97a68e26c9f709126089753d2c072e88ab97796600b2732104acf744471bc562bfe4a995e88c36a80c5479c0f1204fbc6b723a1b1d3f817341853a02d75c1497b18e242e9e037aebbabf28bbb5c4b72f22eb02734bbf5a897e77f84d9e4209d3fa77eed12bda34378a541e5e5c3258399386c49be1a05b6c509724c68d42b5a9be11bc08d154c9e07bfca513256a52d4f7656b2b7819120a7cb68a80b91f2783979e1a329574272a3b154b52843bf80f88d947c79a58ae555e819674df71b13ea48741d103d345a8d4786eb43012fddb0b01c3baa6a0cf128b099972449ecb3de50020b025c486b4b5b115c78d927fe5e06bf8e29068d0b3d963c3b46cb9d1ba3256fba01f2185cb566556151ed2e1c993469190b75fa75259a5b1096d5a1647448013c21eca67a3aba096a4dc77f35c2447e81114f732148663a9439b1304b148b813f12c61654688d35318b8c0a8c33738a2f1bd2a1b6e8ea93eec771ec8c0094d4c6a45ba61579c72c2a41ffd468a6c679fc3d6b15d5a549b1614bc8874304bb6f01b775511ce5bcc7c055441ac72c34ca164f461990a57baaa98840439371c26134500377b39ad6d222feb0b67dff197c550541b63173e2b1b7031b30cc3772e97734ad3c5b6243b3269c48fe055a82c9f4d1c166c294b8077269304cecbc404ebf8bd82c041c911b09fd7c2cee33fee1bb754878d8143cc93b81c7e99323b5210e7a64c7a3b8d96c1594ff3ba50132484e663797246dc3238a1eb743c4a33c51c6587a224bec9bebcf5ceaf175dd37c3591ac7d82512e9ee7c4acba2cf5bb26d3a2188be321114a7724c797a2bb26cbe43b3fa03a8bc16dd5a49a68544e9feb51786c46794c9f5239b7584acff68a2f7561bb05e6b5505c249262b509a922e97c40b4736e8fc2af4017acce951cdacb3385f060cc1c55a4f79a60daaecc939036115d2f480f6f0315fed05387e99f9448b6155a51d66a6940519b361233b2b7b34c740f0cb64a7cf0bdc48677292b0d1ed5898ce928e9040308807cfc730be0d8c614d322735c1af2d2199ccca1dd80a96cb60247125cab18ce7a1c5e4f0c4b978581742c8550cc9c84b0632967654b968c01492557ba0630ec0caf04a443d9b2f616a9cb4ca13da38fd9d611a59bc697c20e8eaa0d2b96aa2db111bba3a05fb463bdf7a777cb91b1086adce17ded04be8b92254ec5442a6852134b5fde9b060fda258c18740b79970dc981cdb883cbe3297fa33ea988b07f9a581bd086d53507ce07536012a211c6b4de17b73a08153c3514daf12185416a81c61fe255a3e04b33e3c5a6a0188f6e09855ba504f838cb8417c2f0e97bbf5b937ff53848031274489b5366abeca2caa7636cdbe83f15980c02f207577b5efb947692fb40ae7b36dfa83b728478f0541511fa58aeb121c14056451654d0dc4421695864db64bc271a79ac0beff724b6bb2290cb64087b72297a6c3881765cd909aafbae72c9448b232093694ce522c72d2475f281ab1b633432175e3f78715de1082df66f74a351903b115d74489a32bb7a873aacf195f8f043922272cfec2798f52f65f4638302c62648199e7979f4740b30d38f7d794cad179ac960c838db4ad7038ab84955960b4822324c5d01c5985ac8f47138bab522db895af2f9a983494f360b061bc5120f385166a5ae9ab844c278008e47b655570430451cb606c24840b7a0e51268cba81998697a5653e33bbe47d43edc3249c32964e87bc8ccdb6d603c0f7387306b043fdb343e8500aaf0104683dc9488b0ad3d04a1c2657f11a99d46b040d0950d0937a4927012f4a78ee2405eabcac445845d7e88b54a8c57947b7ec0c12bf654059d93ba38ba2e50ca3fee8194053b2c9f10cae8c846710392733123b0eb0ad895216efac4931cc782e886fb2c87bed305cdcc690dabbeede21addf7468e4873919865b905b3149a4d686b7c96fcc014b578e1d36bc3b63449f467b09bc84a92b20b01bf70200e703a0ed084c860f40a336576274c7e5475835bcc8ec515050eb8215f397f6312c9b1db1ac1da29ff90a4ed58b8f8623d4b893e1ff94e3e48a0ddc5c221c0b34a798713897bbe16a4c298c5e9f44932b09806e554f76b76fdb8744cb38d00f24f5cccc75dbcb3f81233c454ce3664a807d82c68255c422866cec26ef6e428677b4db8f712abf50c1e11c9f014b9ad59077cf0475f925568300c49c08e4e17cb7a5581ddc17331eb3bd7bc04c933b646224d3386a3140cadd445b632268458f63942455ca1b164c9ccb2ae679ddb12524c34cf823b3626b224e466245cacbbcf57896b7acc6f6b702ce9000371473c622303db63b2744c7138363a832b2973bb3144bba8001999eef108e317890c4b63e857c6de99266629d3267db18fd97baa47b2da64fcd1f651c0028e1e5653a53302082d4e89b76b6b6a939a2f2f5b6b7d5931ff3ed6c50e860576285483bb5fd36e2f944d32c4317bebc1e441470c1372046a790d79d4 + +# Official test vector 41, seed: "f170583cb451d8a45d105457c02c01a33a40350616ed8515bd49067142f61efb00f07857e4fff3fe11e7164c648c76ed" +seed: 47550e9edacb6ddce3d9ab81f6b61080dd4f2693854acb05e0ccc7a4fb6390fbf89d7d99d5c3e0d10d6ef9af054d842375f695abb28e3b8eb495100f04306e92 +public_key: 2829b04a621a204a4e63a2308d728b28c16652fa939d455181fa1b7b44447d1abc83e46f9d5c4133b104cbc1369812bbf9e83ae1e58f66f8b7c2e56d902cca69dc841f31372b783bc6421723ab0b2bc21cebc7cdac0cc3c55a3a088c0d21a4271264945766740af06ffa65275f9c00b44b1b3e6823d3c29c0a509bcaa2be1486972dc178821c40a203849a3abef402408ceb1e543c3bef193417bbc0c5679c13074063e83eff63af43464b3ce47e4b86953bf21583c2515f7b1025bc0e50454a08313e915882dbf556fe9b18ad27250030723db50e5dfb2380d8b74874c78862a1bc9083e1a8438e546ff9ca64c4a53bd17c1558067206056a0f222c8a4a00b2a92631179b6aac71fc711cb635b008f28cd69b51b5d7aa6839a1aca1a0da854faa39925cf606ae20612fc9c7573c73393a033cc8417d427db29bb6973546a967354fca3c43223a657713e150262e5621053bca46931248386114564cd4c0861d4ca648e789efc4221f7a075dd8b119ab7bb3f467abdc6cd3c808d1586199ea7be6e75c03916da4c012d8e81843f472c8504ff4239d3c0881e0e664f6e253bf2112beb301f19774e6998d4e8b68332346898087f1b7460b664d5d10b1ae199ba661cc460685d56808d6e66f3a78b6f5382ee3eb945482a1419a0a509a8909e8ab02990166c84905c7533159a9dc447f11f649e367486e2191a6c48b61331fb6137051b1410467cc440c8d0f9c9369b8803cfb33da7416dfc47db6726440028b23807c0f68804915a09ab16c47287d4eca5f19b98839030e9606815629b1e153a5cdb954f6e3281749040d91061df4afb67a5f8b19b30abbbe9b4b98b39182c4e48d514c35b515cdfb5bc61553c7ef047b17ac2ab3d10fe7d86a78386a0589072fc58983058a6959915b12a80ec79035c660afb04e9670cba471125e7a16d9fabea6ecbfe1d18904757b0bf6a459f0087dd193be490b4bf87bcaf772547b863eaa703ae18b58926aee14cca8015af2939a49e29d546b968ddb17eb62b9eaf9ce53949e7477c4e9893a40766a4a15cbc392c73b313a0ee3201431bf3d5555dcf73174f3299c2b88dfab4430c08c94183c27d1035c78769b143563a942047035a6c2373a03c0bcfc3973db4f8f25c002c46376d6a6fe103bc641608e98948d86bbe6e89d5405542587aa4821c30ac8756f07c593044570f536b4b07fb14b3236422d01789822aaa020e4acd92126809b2d47f49049875c15472a37b4b033fcc260fca04ab629474c9b82450ae6572d891a58629caac895bf2f52babeb6974be787397243b20a99f37b52ee77934ed2b6157ac3351b9c0f3405369885a54bc33b2c487200ba8a326b9d1674209924d3d50527517978eb040bf85ccc9569a6b3138f072084595825a994078a09bee86ed1e75ee9e759b31c491d9292fd2abbe3cba62661ad9440bbd392cb7d303cfab4bd6b0130af1c3336e2768907aff0633f18f9bba3706434b3bce7c75d6c40753b6bbeaf11c47773cff33b5067890fd5b8548e66c33d25906a066bc421617a909196a3986d362d3b80095e1077a5a087238054f2d89e0fd9a0d570c5ee2aacd3abc16111189aacb4d2e911abb7aa5099bb4a269d760174c324094fe944a4dc55d7708395f6aed8654831f7c3ecd85baf03c44390193634b16e1c91aee33979666edfb18d7713c547a90ff9514ba6469e0a6716ff4c0420427bf00b794775043e162e798871f710c87ff423d5580d873b7f624c96c7d63e23ea02b1c800914a5836fa73d7a748472b0b7af3099eb933f4a440ecd48262d4c9de4c044ee30cc51877352b53b0c1c14153c88b44931df12ee8520cd07117a1266815b74a431652d33074921c1d6dd6c0104aaa3f1a84e2f7cb24461290fb321d706113b172a2c7bdee921dcdc31640f9c749f4b27d024a7488728f605f8ae904571062ce9b36c009937f51722639782d56496fc056b06b8a4a6c3f402649e0c15eafa83e85a40eda43433c44b6d8f037487c9e1b66622c6798c94b9228c7a52bd18360e07ac4b057218469ac09b397477d7f5325ca47b901d0a5d0b6977194a12f71abfbabb3d910a8cbc52ca0dcb4f9f52d36c22b71b8513070c1c6c9a33397c79e4680862196cc1c3baea5bd04c58ab295b5da152a98a6ab3035b2c48478f30cdff392b47dc011e8fc82e0914e5ad3c8eaf0f76a57327c62bc9d4d +private_key: df9a22dc6c97b1e41ab3d6b79d183b1ed95c6cb32277a25155d380318260933cb26e427fe1d6be2e40bc02ebc9e85a3850b30689acb277096d8d48cf9b3c6b699864fc4b085ba86fd2b92396dc384d03428ceab2173380603b49bf2668af38967b4145a427c04a5541357771256277f7956335da5bbda033fc7b3909321777e2991189a93b730feea54fd6445796726c52752a7d11235c8461c281c9bdc3651dc72b4bc86efcd5cc62a18ece4b6586b2b0be374ce392214cd175117453d393842346abf0a0527e791e484c08b5324bc0e489ce327eb536609c4a646330a3d1168401f9420ada3f4b7104af688bb2326908d023f990ad064b6fcb4ac12903290e93bea142a092c72b9b77b56f27552115057e6a7e92822ea635c1419159c186690e67beac07785e0a585681c67cb73aad460378691b07d653ec0308cd0c21058892d34c437a5bab3bbc83f660b644507a5dc00ad5e01a231a7d426764b9561c974490c85911ed94330ce8ab4b6c0c72d67114096691d1476eb820ae01ac8df78aa1fc10d2b898a8f600cc1878360961ec5018d7f63d79744b41da21bcd086e55a83e1b07aabb47aff6831e9ba51dca086208531d1205e8124b66a40a5c0d7249a29a1a218be0f6091cb8135f552b81c397a000ab923050d167940cef362ba796b9bd7b7f1a197c8704ab51c63f362c368c77dd5563b82336edb912984fb144e46cf21a11c490ca7e8c66cae89772b2b96e8085abeb82aa8e33da4b56693f81592545ddf9176486350e86229b423072d586852328e7bb2065d5a7a8600aec4911d07271d75924d412494cf77b868aa7b192a11a5d66eda19a10ee8c051d456fe7846bc8c52a0923d76e7b4e5b27bb2e2a03f8c214e6636620b54b893a3c9ba9bb7e68546626f601c8591bb33537b71b9302a15b81d6fb7919202c45c0341e3e17b9cf39964a4a48ceb4b7d936fc007c486f40b4265a8cf677ab5e97d1381bf1d8267e4445aade22c4fd536392a6219d3c9855b06de9610f714a5eff2158f4ac31a29b71e0a9db207c2075109c0fa762b70bdacf391399113fd8429c48a6a3edb5d465a45e357332a7a1ffc414325849d9325be55586aa9535f85e20ddd2696a615139c037757514295173dc7c92a5274c1571c0893190c5513c990c5c1fcb67aefac3be248c9111c752c94c180fba60064af53d35ded934d7c72856bbb9703fa43ad125e285626065869c10027e0c374a28732bb238b426905491c25e73907d293b40777782c3ac846675502958bba239597fa230930b515996e5b3054581a94f0f848ce13ae14425aaf593b175635b6db63131c14abdc4be6e984e62bba9f95a9c3d986c71640ffd1a3585c20423068b52662929406945199fa67a87f289cb15b85e6b28099f3477b8166d0d398ba922c22a1319cc168b970c699706eb87891b1504f99f91919da8300a49dd8d292390c41f9735ba65c19fbb83c80e08392f10b31c0c18708a9b1780e253404bcd5753eb75e269b980ec34040a4495c2146ba5a1edf3a8f228bcc10206d2868ac73318a361318be704518a71b0cf65eb91823b643392bbc02b0e0835832adbbe34577119c75171460a891efb51559282700a80e65797e6b367d444c024332a5bbfb2b8c9619e1498adca52e985a9d03b91f356718e15bb11ac4bb133c08bb82c2a9fa0ff8785e92902818d314bff162bcf5393dc0b2739a7271d02606673eec47cec412484f9b1437c688b3f147f1792a463738649a0df8d0480e0a1cdfe3107d48c5ac11c3d7dcc204b439ef3533ddc2098cb22746001ae103c8d99704e7974e27b710a57cbd9e7a4509ec96374b648e6c49d0b0b0b7354e3dcb206e5b47942a29c0c498c7a1c1d401af425a604c729a8fea21a77aab00c67db762b5a32ca0e73aa9f5e2319ae5cc419c964c418f19276bbee6af76aa4fd04278d4c28aebd4ca01b6999a5c8068540a07c2823116a4e56468abc468fb222f32326bf5c02eb313c4b4ab4d92f408a60047d6890de1ec3994e23ec757c138caa5e3cc14b9d60153565af3c20581a24d2684c4d251aea1b36e56042fdc7c922812ae69796cc4912c882c5d46b4a2af9874d91c3982660c2dd6749ebb2484009be255177c9ac65623c65e0a896b1979e9ccc093ea5113fb59d4cc6b2829b04a621a204a4e63a2308d728b28c16652fa939d455181fa1b7b44447d1abc83e46f9d5c4133b104cbc1369812bbf9e83ae1e58f66f8b7c2e56d902cca69dc841f31372b783bc6421723ab0b2bc21cebc7cdac0cc3c55a3a088c0d21a4271264945766740af06ffa65275f9c00b44b1b3e6823d3c29c0a509bcaa2be1486972dc178821c40a203849a3abef402408ceb1e543c3bef193417bbc0c5679c13074063e83eff63af43464b3ce47e4b86953bf21583c2515f7b1025bc0e50454a08313e915882dbf556fe9b18ad27250030723db50e5dfb2380d8b74874c78862a1bc9083e1a8438e546ff9ca64c4a53bd17c1558067206056a0f222c8a4a00b2a92631179b6aac71fc711cb635b008f28cd69b51b5d7aa6839a1aca1a0da854faa39925cf606ae20612fc9c7573c73393a033cc8417d427db29bb6973546a967354fca3c43223a657713e150262e5621053bca46931248386114564cd4c0861d4ca648e789efc4221f7a075dd8b119ab7bb3f467abdc6cd3c808d1586199ea7be6e75c03916da4c012d8e81843f472c8504ff4239d3c0881e0e664f6e253bf2112beb301f19774e6998d4e8b68332346898087f1b7460b664d5d10b1ae199ba661cc460685d56808d6e66f3a78b6f5382ee3eb945482a1419a0a509a8909e8ab02990166c84905c7533159a9dc447f11f649e367486e2191a6c48b61331fb6137051b1410467cc440c8d0f9c9369b8803cfb33da7416dfc47db6726440028b23807c0f68804915a09ab16c47287d4eca5f19b98839030e9606815629b1e153a5cdb954f6e3281749040d91061df4afb67a5f8b19b30abbbe9b4b98b39182c4e48d514c35b515cdfb5bc61553c7ef047b17ac2ab3d10fe7d86a78386a0589072fc58983058a6959915b12a80ec79035c660afb04e9670cba471125e7a16d9fabea6ecbfe1d18904757b0bf6a459f0087dd193be490b4bf87bcaf772547b863eaa703ae18b58926aee14cca8015af2939a49e29d546b968ddb17eb62b9eaf9ce53949e7477c4e9893a40766a4a15cbc392c73b313a0ee3201431bf3d5555dcf73174f3299c2b88dfab4430c08c94183c27d1035c78769b143563a942047035a6c2373a03c0bcfc3973db4f8f25c002c46376d6a6fe103bc641608e98948d86bbe6e89d5405542587aa4821c30ac8756f07c593044570f536b4b07fb14b3236422d01789822aaa020e4acd92126809b2d47f49049875c15472a37b4b033fcc260fca04ab629474c9b82450ae6572d891a58629caac895bf2f52babeb6974be787397243b20a99f37b52ee77934ed2b6157ac3351b9c0f3405369885a54bc33b2c487200ba8a326b9d1674209924d3d50527517978eb040bf85ccc9569a6b3138f072084595825a994078a09bee86ed1e75ee9e759b31c491d9292fd2abbe3cba62661ad9440bbd392cb7d303cfab4bd6b0130af1c3336e2768907aff0633f18f9bba3706434b3bce7c75d6c40753b6bbeaf11c47773cff33b5067890fd5b8548e66c33d25906a066bc421617a909196a3986d362d3b80095e1077a5a087238054f2d89e0fd9a0d570c5ee2aacd3abc16111189aacb4d2e911abb7aa5099bb4a269d760174c324094fe944a4dc55d7708395f6aed8654831f7c3ecd85baf03c44390193634b16e1c91aee33979666edfb18d7713c547a90ff9514ba6469e0a6716ff4c0420427bf00b794775043e162e798871f710c87ff423d5580d873b7f624c96c7d63e23ea02b1c800914a5836fa73d7a748472b0b7af3099eb933f4a440ecd48262d4c9de4c044ee30cc51877352b53b0c1c14153c88b44931df12ee8520cd07117a1266815b74a431652d33074921c1d6dd6c0104aaa3f1a84e2f7cb24461290fb321d706113b172a2c7bdee921dcdc31640f9c749f4b27d024a7488728f605f8ae904571062ce9b36c009937f51722639782d56496fc056b06b8a4a6c3f402649e0c15eafa83e85a40eda43433c44b6d8f037487c9e1b66622c6798c94b9228c7a52bd18360e07ac4b057218469ac09b397477d7f5325ca47b901d0a5d0b6977194a12f71abfbabb3d910a8cbc52ca0dcb4f9f52d36c22b71b8513070c1c6c9a33397c79e4680862196cc1c3baea5bd04c58ab295b5da152a98a6ab3035b2c48478f30cdff392b47dc011e8fc82e0914e5ad3c8eaf0f76a57327c62bc9d4d63a647d85d1d66436cdf42ca198a44b31aa9f9d28b0311fb858cb5ecf74eb770f89d7d99d5c3e0d10d6ef9af054d842375f695abb28e3b8eb495100f04306e92 + +# Official test vector 42, seed: "44a6774b2cac02dff210ff861a090561a453db311f47b6fedb81811872d5d9489f5fc4103010139ae53fcaed209dc9be" +seed: 610afb64be8cc1df288cfb016ee2f44c6c07113de7f6fee071fe0c3fe31c6215cd292e4c5f9e1a55e0489bceffb204d672a6215f4f3980a646d9f880817c52dd +public_key: 68d31d58c83101c3626170b992c2ab3c181f3d58b554249aa9e73c9e691be2c6c402755ce0737ca2e2524ff59d3397b417965ed4c547f8dc97252c58f4367379f4bc9da75b64b4a40a329952623f0615117d28af7cfbb994b8ad70b2540978242ca0609a082dfd70aa5910778fb1cfe537c5c1aa5612029d9b972aec8235466098558c1bb4fa2b84e1cf9c16300035a57328b460b20facea43d5502958b968547b60a3c9255ea20faeba1f4e69cef343a6f3793d4b0418edec073909b6786a38fa3337c61c8f7af5a796f41a3731a4ca6096382423c941616452b6a5438977445ffff43d54e7b787cb9bc6c95c36003d87b9bf08934996f7301618c5a2a9b6d5d802d57c02018b44b0d95c5ac1c46b910dc518277be4c8960400b14c51eec975976975825b2d574965c338c121a056e2b9c9cd88ce4111c0eff01db722734b296540ab44a40214646c32713c87bba448d349cd5b160db48411a77593886c81ac1b59d10b51e8338a4178082ee858ff3987e58cb7e2a58cf23c28ccfc6141270c5ed0b883d01092c3095f0abafa2c43eaa7181136bd6e2b0c332b3e78ba665c73304df21d83cc3915f9c8073b7d6d907c13bc4a295432fb0a894958b98c9629d6a025e3368fa234399ad0aa5f8c8fb54b9af1d3a18d1a7ec1b22e7f5056c0d97595a801885202ff8c9ce2315ba340924d1c5e2efb2de7c1a468b684c8f7a363eb98dd4cce7ddab73447a5d263b2cfc4129be74174b50ae359c69f086153ab30038a13ae21ab5ef870c44490990806c4936eff553ccd9ac01d90b1e3d54bbf943b19236b935cafefeaa1059823b1d928cb77cbdc0ccff4024e79219852c0653ecaccc3d9292a18783c10cce69732dfc4585c8a45138ab94ef2c84de2aed22b98bee16bef556331e56eb43c3d92e55a7c1bbc0474251a70ac72d5cdb9b2a9ebb9be53c0cfc037c1678a1351cba5e91bcf7147002518b8c8933cca1c34f9da03d2b70e885059b259b499901b98345aedb9075aa1686e36a85c6337f01b4ea2f2ab29939eba618c68c5256eab4e6c1a1beb334f93e99bcf3cb31012b1252537f8d1a589430b46e487ad07cfc5c58a2865b0a92a621006248a46c837f095109a3de16b24b2339a509284c9055778816e9656c743a8929cb622f3e34f0141c820d231501c920581bc259c8be8b0928b58b6f1e2b34b628301230fb18c3904741a0f061cb613b560e972b406c44e154724f6af887a345acc63065481c4b468423742e742582386c00f2531c67835f3c679ebfa9aff871f0b006c461b760fb3171b99c9cc74a5378c3ac78c87c847a65f4bcb5043a551c223418114d58bbbf6aaa4422aabd4d70e7d78a61fb1af33882eb5bc886d154ee032b0cf300efbec2acc811ccd2c6968e90f6d146dbeb0932a569896f96a91ba3298c57c5ebb4aa130a7730a996054b9c058057fdb41825a2323799bb0a51fc0018428061ab3f3c12a6479c3367810acc4aa869867f5888a90a1ac51913292a194f1b3d8c976902221d3b0c607714f4fdc8196859c939b499e511f54e52d059a25449068c39081dd59624a6515e282935ea454cae482ca990a378a3b41e0b0adc6702a9533c0c479a4f6176be1a9a081a357f5bb98f835ed13ca29eb969f3a7c759b43464155ea78067752534d1044be2501c38387b31c662e6b9cfc4584e5dc43cea0805e273d9e56b71fc924204c8ad82ccb315207afe34efea97f72a21760cbb629d6391ac85fe28ac568b1b96ad8b888c9cceec93fc08825429614be352c55ab218383ccadf0bad13862778bca36285d67381164f5853340c0b9516ee3916700f4c3b8326e497ba7966456b6144b87f70c89cbc07a3a553c60b80e01c0c7e9297ec70e5a3017e906cf24593f86d3b6d1db26004b8ebd7047339468183c20df37055637995522a8322b04618b123bb3b1cbf765beb8cd17a302b88166fb84a9bf1728bfbc57853b7de3f113257359f6b7835e9953da123bfcf545e5e3541c8620f5f58872f1192b67424b5a9909d5324a342fc74caf906c69fbe3b2384a2a9bab153439241d6065e0f944ef67c4d6873635b3650bf4cc4a4b879cca63b6873c8e681982e4a183557e0465bb0f60a8b9d97625065d4727731e173977a95e7bc2ce3494b58071c1b89b1866c85ff814aa4843f7ab5bee6124c2166757943afa3df3d5f59581246cddf8777c228d +private_key: 536b38508a50a06441226094dd386686e461226c3a3c121f4c906608f7a78ce66d7f574d479a7154c87e1e88278409968859356c7b6dcfc0a9cfc473e670bd377849619887ab701c3c4a1d2bc0b6a9633247cb47e8305d983b80a37462512b1e587ab1a80293d3ec1d9c785be97b7960e96cb4bb2a70454d5c619022cc647e12b67f786c4f386f68c03caea65fc0c14d8d0809b5a181f3fbcc5446037a00bed867264f167c69152789e38399356e1eab187490b8c8c3c5b8f226bfa41877374d41972c151b11168c5d971740a373967492804bc988afc31e7cc195f71c8cb4a53c39d16666982685368194a70fdc0b7ea96729ece4085c6c59ae12218f649e1552998d571c0a41503fb278c2195d16f79012251ed5eb281ae05f88650cb62017781b7ccd534a0646a4e2e2a4a8f6160b64cc3aeb4cd78c17f633068d299b286730b2db36f2963ab421b0f3dacfd18a5a02aa807b47231001ac238c176bc01646541f465b832c448ad4f157093c8d26b0b1da121d17c21c71c64bdfe4793095c38d930b7a26a85c87c5b87821c389bc4f3ccbf42424d994754073605c166731a48923cca3a30ba4df4c2ee7457d5feac30ab08b21b71abd66c8173a84587a047454afeea38e6ee12936743195eb79b6548e73822960c7428a7b36c75b5f549b66f2b30ae3cbcc4f10cbf672817b9b45305c7cf290c4c8c60aa2d443b03a6418b8bb42309f2d912a6268260d35b5c2d72ab320617d114ff649308789a3ac88817498333f2c8e65f47a99755929b35af1bb975cb804c7f71469f32027c33e705c12e6ab4227f2bf37eb2214b66a00c556ccba44ee84654212495d96983ef16d9af2b848919005700f01b58b3d5667f6220983e1ca9cb8cc1ab09b609224afa0269f935d99d92535cb2758c24f08aa76dd1cb889320c187c48bf781a10cb3762e402f3e39cc151ad6b7c6c8c50b71e7682364314a64c6c8e799915d84f50b37403077d41c76062277b6a1354d298427c31b52446864ac075e4229b598a9bcac0c03ee1934207cbeebaa931c18870e7787f4718830a932375935759c98dd5074cdbc3a2cb6786ea21ac928b34d675ecc9affa0c8c0d341fe0588a8a6a398e994edd03786a167982815d693c9b149600fe5b265a94697ecbb5a9632f3a158e0eab8d06dc0bd176bb02172c68851237e7bd9592433cf97b33017c32bac8c719926c4a8cd6788f494806e7821edc0c798cf6424767ad4715cf2e02c806565b5829bb4d9980210566763999046075ad12612ae07d6c0394be26cc1c375c757ca776f7852002b6e1fa8f44db1e643753f1daa627799eb8d320edf134b5362a7079093f519dd20a9fb662cc47e373ee81a058e367f4124b8dfc7eafe83e2ed7693e46be701aa7a9e3ba45338aa4c9c26831a5b1f7c03227c97c515e8a1b154ea910d7265aee1c3f16198905e9c3770aa5ba924fddf0433edb6df1ac0d2e6282e018912db1c056f613bffc51efa044d995be8a83a5560a4ca3c554ac538a45060b42cba3255332cf2529795ac109db6715d87810e697d97a4c88fba86760460aa493bc25b2cc6bb79e3b1391134ec2934165a77f44b81b1416799d027e488450e43c42792c7753a8ac4805c13ce7a654b4a1bd881503a8cb3ed462e40a42f71c280c175663a64657fb61a9d8cbc58452141366a1f34eddec4e8c40b59d82a9260a68727431d8f36a614a8ffa681774c60587153aca0591d212bc5c3a22423267d4345db36878fc771c0319178a6936569bb778cabaa0e211b2a14efff4a4649052c60a9dabdc37350bb1c931ab2cb3854ae4999fc0a9f5d92a117783f975ce6d1297d7621a48fc0a2ab584d754b036a831051ba25b7b5b9e1442fc3a7f17d2710e7aa3d86b85ddf2abedc30ff756b2262a1d2d1165574a13e51373382704bc062f5b2261ed5053608446b7db9e12d0191e1a2d41a0adb4015696c3266c79497253c6bc51c20999b890bb21c8fcc9a786142e57009505694b7155b386c39b5c1b84f0791d9583d58a904eb66f461b2621f2c024b4a6f0cc1b2a7bca62f5378fa1334b7b6f06c61cf5362cd4e3cccea93988eb757032a844037aa0186df5703ee8f7c649c9785a26197c2593af38c8f56b849bd68e12c696825982b4f2919d9942ec240178848f68d31d58c83101c3626170b992c2ab3c181f3d58b554249aa9e73c9e691be2c6c402755ce0737ca2e2524ff59d3397b417965ed4c547f8dc97252c58f4367379f4bc9da75b64b4a40a329952623f0615117d28af7cfbb994b8ad70b2540978242ca0609a082dfd70aa5910778fb1cfe537c5c1aa5612029d9b972aec8235466098558c1bb4fa2b84e1cf9c16300035a57328b460b20facea43d5502958b968547b60a3c9255ea20faeba1f4e69cef343a6f3793d4b0418edec073909b6786a38fa3337c61c8f7af5a796f41a3731a4ca6096382423c941616452b6a5438977445ffff43d54e7b787cb9bc6c95c36003d87b9bf08934996f7301618c5a2a9b6d5d802d57c02018b44b0d95c5ac1c46b910dc518277be4c8960400b14c51eec975976975825b2d574965c338c121a056e2b9c9cd88ce4111c0eff01db722734b296540ab44a40214646c32713c87bba448d349cd5b160db48411a77593886c81ac1b59d10b51e8338a4178082ee858ff3987e58cb7e2a58cf23c28ccfc6141270c5ed0b883d01092c3095f0abafa2c43eaa7181136bd6e2b0c332b3e78ba665c73304df21d83cc3915f9c8073b7d6d907c13bc4a295432fb0a894958b98c9629d6a025e3368fa234399ad0aa5f8c8fb54b9af1d3a18d1a7ec1b22e7f5056c0d97595a801885202ff8c9ce2315ba340924d1c5e2efb2de7c1a468b684c8f7a363eb98dd4cce7ddab73447a5d263b2cfc4129be74174b50ae359c69f086153ab30038a13ae21ab5ef870c44490990806c4936eff553ccd9ac01d90b1e3d54bbf943b19236b935cafefeaa1059823b1d928cb77cbdc0ccff4024e79219852c0653ecaccc3d9292a18783c10cce69732dfc4585c8a45138ab94ef2c84de2aed22b98bee16bef556331e56eb43c3d92e55a7c1bbc0474251a70ac72d5cdb9b2a9ebb9be53c0cfc037c1678a1351cba5e91bcf7147002518b8c8933cca1c34f9da03d2b70e885059b259b499901b98345aedb9075aa1686e36a85c6337f01b4ea2f2ab29939eba618c68c5256eab4e6c1a1beb334f93e99bcf3cb31012b1252537f8d1a589430b46e487ad07cfc5c58a2865b0a92a621006248a46c837f095109a3de16b24b2339a509284c9055778816e9656c743a8929cb622f3e34f0141c820d231501c920581bc259c8be8b0928b58b6f1e2b34b628301230fb18c3904741a0f061cb613b560e972b406c44e154724f6af887a345acc63065481c4b468423742e742582386c00f2531c67835f3c679ebfa9aff871f0b006c461b760fb3171b99c9cc74a5378c3ac78c87c847a65f4bcb5043a551c223418114d58bbbf6aaa4422aabd4d70e7d78a61fb1af33882eb5bc886d154ee032b0cf300efbec2acc811ccd2c6968e90f6d146dbeb0932a569896f96a91ba3298c57c5ebb4aa130a7730a996054b9c058057fdb41825a2323799bb0a51fc0018428061ab3f3c12a6479c3367810acc4aa869867f5888a90a1ac51913292a194f1b3d8c976902221d3b0c607714f4fdc8196859c939b499e511f54e52d059a25449068c39081dd59624a6515e282935ea454cae482ca990a378a3b41e0b0adc6702a9533c0c479a4f6176be1a9a081a357f5bb98f835ed13ca29eb969f3a7c759b43464155ea78067752534d1044be2501c38387b31c662e6b9cfc4584e5dc43cea0805e273d9e56b71fc924204c8ad82ccb315207afe34efea97f72a21760cbb629d6391ac85fe28ac568b1b96ad8b888c9cceec93fc08825429614be352c55ab218383ccadf0bad13862778bca36285d67381164f5853340c0b9516ee3916700f4c3b8326e497ba7966456b6144b87f70c89cbc07a3a553c60b80e01c0c7e9297ec70e5a3017e906cf24593f86d3b6d1db26004b8ebd7047339468183c20df37055637995522a8322b04618b123bb3b1cbf765beb8cd17a302b88166fb84a9bf1728bfbc57853b7de3f113257359f6b7835e9953da123bfcf545e5e3541c8620f5f58872f1192b67424b5a9909d5324a342fc74caf906c69fbe3b2384a2a9bab153439241d6065e0f944ef67c4d6873635b3650bf4cc4a4b879cca63b6873c8e681982e4a183557e0465bb0f60a8b9d97625065d4727731e173977a95e7bc2ce3494b58071c1b89b1866c85ff814aa4843f7ab5bee6124c2166757943afa3df3d5f59581246cddf8777c228d53729573ce2f4f51da212385808ef436eecdb8fb9f3c8346800beb4b9e537d1dcd292e4c5f9e1a55e0489bceffb204d672a6215f4f3980a646d9f880817c52dd + +# Official test vector 43, seed: "49e1855588b6235df2a400c4a70aedf8ab17b6e5e2891aa745f132fa2e7ab0c8117c1df37c39f5d57624eb77c2b4a091" +seed: e1953800acaa85ac02a906c72cb8e8d704e8d27820345f88f71e89c1f549afcc8c64c049c6dfc0f1476cffd520b055756162f7ec94243de6b14ac0b9e5fb366c +public_key: b2c2247d98c617419adcbb5027b320e54205ec3b9c37fb528be1bcb29624f0851a9844b83c5788a2332c0148c6c982be4ba98be6d9a54623b8183a66dbb8456473ace4f18829a56d1523497e1731c524ba3545652be97aece915ec25cb8c18364ff961dad655e2d08e14293a77963e4154b5d52a6d424a3ff976b69fd6c073b7bd960cc397d7511f76aee624240cf6430d612385a21a33838d181c3f77197e530463e952662e512a538b81e72913eb32357577319d29599ea2ca2e088c91681ebb295c5fb3c4f11643be6686f62b259c737c4ed37b38901eb7a79d5facc426438f6ae228338439d136ab68ba7ecb760a3b45c77f186c177c2f79f47f7cbc2a43da4b94371e4ffc9f8d520a9c1749d5b63b01a2af5b7a10ee47505598ceba4ca724f22fc15626a5243895db48cd2bbee25c27b171c44fa09d9dac21a11803ce0a6492b72d16803dc793cabab535eaa44eaa14b2d81a4162c32e73cb38a7bc945d0c1d6e0022e2785093d66c29e31616ba7ea0f58def02339ad231c3806600ba8612080d6dfbb50353b0fcc98dcab2c07473b34e05a556d777cb1982bbe521b1cbc58c680606f352b1560e7e4589b905b50c299ae8d3328a3729ac0420c3d23eca06491c43ba8d72af0cab1a869002434476bd7527f27b751c9364670a3730c52d514454e03386c66406a4b4315c8201db561e9b79c2ca4c60b25044e6bc1253465b4d0206fbf695470b4b7b8bc068d391f5d0b7e9d8028f1591ed916da33157cdea92ff46ad98d18e1ce6c4b2f75854733e913c5ad2d13e23ba51b7f8c2d3cb0edea793b55acc3995c97d3c65c0981f12913c88b56f62623f41e85a84543d4e4520c884981a3531d200ccbaec0bf1096fa7ac429a9b3bc1a2b38de159c2139361dca3ea805d97e67f61d10c0911674fe148b33572797ace2138ab478a51057306f010661d569ddd9a4e55e73f67f25f0db09d61f1951279cb79d814d1a21a4ff311be441bbba97d81935b31bb4dd558544babb18175b893357504589fe79170199129e78874882aa89b87c20bb03591f321419a41c1a78f87016b4e551c6928a37fa7c60708afc03c8b5b17001aa3088dca6ac9ab93fe5665f1781e36d7813945471f6945198983815c2737713f9c53a8e717bed4d9a7a706ac41d339001c5d74548388a2439cb0142bb6bcf2e23442155adeb4269cb39432d31455f0191a25822f35c889f2962ff081f1c1b5c55b9af0b14a414b618c7366fef512d94077470440fed7c2d101b5c9ec7b79ba17cdc14653b6c3179261a9401a0b20bfd201bbe243b8cd1322fc872c4bc29889586a8e302ac26b043b605c13c1300a68c95f269b2ef49402786819668e964c921f765abf805477ea239d3b8b203c7db303afe5a8c70158874981c663f1b3f8a645991cbe42a2498beb4579b314918c85a8388f31e628010bca96858a09e49365725b31d0726c0379709529c38b47e15678ac9625b28a763b579af908cc1cc45a5ecb23e5a6ced504b9e3101cc562be9714bf4931cbab020fa3e10456d23d2d01af6dda8dc6e09ec6aca54a3253f5d905d4b34b66250f80324060b1609083028a63aed377a7cca6a929da786eb080db750cf906c98eb9a105f288a36427519c0087e300705524ac343b2c448ead7802404417cacb6ca5a398c7e9c2a7b2855fca298ab1bd0fa9c23af9c5079496dfb2996a3738d5ea37ccbc24f1744eb9f5c672d74968c872392480fba91daf0c60fe96b13828bbefc6156f860ca304970de5695553a631a10c799b29b2585652065f33c6b53179bac6473b4dc2b277284181c7a2a9491ea422c5087358ef8835bf5711df91b38ab90000d324e7b6ce841830bd952e18583eab6b6a922427b2d094ea633cda75c94bdaa1a3d928fd2376a876ac0306b1ee631fe38987e50421389cb224d4045e260a9d34508d1739f223765a3a8f2699a8919b30f80177d9e141d7d9630b46cf5dcc4ff85045e62a4f0f86bdbd6367c1471ac4b22210771eb636c2bbe564578266b8682817a9118d95ade51031def42e0d9cb273c03e3f93ac97395d9f09be36eb8b2c21a4c74796ae501758b222101634d1668656b02cd0026c9eda07c0f3bb7d99b7fac6a78793bcddb2a18cd4262039723f41223d336451eb31911219750098125d62110dfcb20e30c6d5cf75212b294eadf4ac273ecb8bb5beea59108851b4 +private_key: 548b6bf0069239d110a3699befec0527e89da2e3792653549fb865d1e9ab9ab9250ee00d913b83df22acd9b4b17a23cd1bbc9c0b46b5df36c3d5a636cd9808e08b8affe75d42dbaddb9974e8417c8cf14ffbdb8e89fac43330bab32c9bd8005b0a1c4948c04c4d110a6248ad52018549360b4e7a950a29a911e43250127a5362787d67ad2d85243ea92cbffcce1ac4cf4f979b59e47f60ca1156096c0f93a219328619fc00d2912d1a23badb2c5190d211e339bbc3317e1a22afe452492b75b0138600848894f3b86eefbccada8c55c73877f9d9ab985004c86c717b199a164c2e25d79f3230368216800de11fae5c2d8892c5f33456dcb2cdb62392bfd1b2e7658c979b87d287ca62d052e86a1afbd367bc066de99851331a00e9461adfcbc6b770471ac76bea98bd52824fafc790b41aa977481fdce18f91528939c202bce50fc64667fdc6c06e339b2ce3aced139739036a7141b1d3b293ee188d57354969485238669b74514d281a7a5bbac250ca154fe898e7cb42ef6670891b32dd97494f75ac96c6bd10682c682786d270bdd73a204aa340cdd9ba00162ff1787b81d2982d9a5fe90038537b65c5bc68bcc22bcffa87e1415b79fb35dbdbb6af8673e56baab96104cde80b3d59ae0563660f8b068d3049c23c0afb59b36d537dabd8c4dd2063afc12b19539a845b51fb4594ca58bf967a9b87a057f7352d40c0b8e79b71e86a34a79116a5e13ea1d4054a35a65d50a57b61bb8f203f8f221c5a79119f0b3dcc2974038865b54c9711cacd1a2b306188235f36a173e99ff982a966d4030a84220604717e8b7726136941d80d23420ff3c599b623276e510567b499da25abecb32a51165f4800b95fb66b6ac1693e52305f32bbb4d980d8a53d83d44f754b0798e6596981c0260300bcab8d55574c92a09ac86b277383b062857d1e4919e094b0b835b7848176a8984ec639942ae9a541fa0549d62570bac5ee458130b0bb46c30ff3c8c7b2d67cb21785b82a9367e59d38528c82694d25756890b789ff86b9a755493eea0b6f640afd8c26ad833be6014ebadc04a6866f2250c73cf5121522bd4d6ab3d8366e04676734fc92699531f5f6c0e595befbc425f91c2c978842595668415c59582142ed11418fe2983128959dc425b61183d2ba458c477e4b9338228b3ad1a16316ec976522b9eb95596628a3aad73953b2877a038887b96a991ca938aa2615751b22f9429a65a8ea4c637f63b313b48f29662950227b702c6811b75564e58d9ffc3609479ee75205171c7db51776177a2a83c74e3f61cfde821f4b60b433902542770ffbf45d668001f94c553673742c96b76eda9750f154e61362d4a173c806ccaf48aba8ebafa9648cd1b3a17e135840800cee9855e1f4623f9768197b2ac9f5525c534c8bd7728bbac26bc18aa5e412fdb92ed262027dca769d9851917510b9e1a66826cda147705f703512767a4d9245a2660ade559956f67b7a012df0a99fbf911d73367c0e7372e7265fce319efb818f139b84a5f652f183c7f2f68c1c252bfd69a586a716dce522aab98d94587dccfc99a4b813ad60a15c924c87a9b11516188c4787171c98fb11466c59b3c72017d9ac1d9e6522b52c1ccbe45ebe0ab6a0983e84e8bec3001ebfb845a14a47c34c9a74234676a28b33d2aabe157f56c26895e7586658649687cd7442832a1c1f2401207b51c676b90c41295bd609882e40a170008be7c3909318593857b602ca882a998ab0265f5e162c60aa090287a9e7a3627909743de22272ab0214816311cb4548fbb5b093c29ee57170121337000208759f6e224c6992c593337d62d3011e02ccd41015497190e9ba5df520b3fab78d68c2b0c18b72c8f67aa9e056a26ba52e32ad7c717472766f5be4acdc60b48ee38bf361b1ff52b11df42546e30a2e0c3f37456fdd190030921e301c555f73b68e5818f285714333b5e2818c5d460994985e81c09448f9a58bea16b87a02e4bc5d7765ab4936ae83b035a8878ce47a659778cad7248733772b52459744362a51b05dc4d17f0e6b72fd1119b1d24d378b6b50831759870d2a80b8dd5c67e13a30a9bab1cddb0d5007ce2d2c7f391a654ce2ce94a77a83035f7d059f4016098f21a9b4633a96d634c32419aa073be74b792b080be8b672b2c2247d98c617419adcbb5027b320e54205ec3b9c37fb528be1bcb29624f0851a9844b83c5788a2332c0148c6c982be4ba98be6d9a54623b8183a66dbb8456473ace4f18829a56d1523497e1731c524ba3545652be97aece915ec25cb8c18364ff961dad655e2d08e14293a77963e4154b5d52a6d424a3ff976b69fd6c073b7bd960cc397d7511f76aee624240cf6430d612385a21a33838d181c3f77197e530463e952662e512a538b81e72913eb32357577319d29599ea2ca2e088c91681ebb295c5fb3c4f11643be6686f62b259c737c4ed37b38901eb7a79d5facc426438f6ae228338439d136ab68ba7ecb760a3b45c77f186c177c2f79f47f7cbc2a43da4b94371e4ffc9f8d520a9c1749d5b63b01a2af5b7a10ee47505598ceba4ca724f22fc15626a5243895db48cd2bbee25c27b171c44fa09d9dac21a11803ce0a6492b72d16803dc793cabab535eaa44eaa14b2d81a4162c32e73cb38a7bc945d0c1d6e0022e2785093d66c29e31616ba7ea0f58def02339ad231c3806600ba8612080d6dfbb50353b0fcc98dcab2c07473b34e05a556d777cb1982bbe521b1cbc58c680606f352b1560e7e4589b905b50c299ae8d3328a3729ac0420c3d23eca06491c43ba8d72af0cab1a869002434476bd7527f27b751c9364670a3730c52d514454e03386c66406a4b4315c8201db561e9b79c2ca4c60b25044e6bc1253465b4d0206fbf695470b4b7b8bc068d391f5d0b7e9d8028f1591ed916da33157cdea92ff46ad98d18e1ce6c4b2f75854733e913c5ad2d13e23ba51b7f8c2d3cb0edea793b55acc3995c97d3c65c0981f12913c88b56f62623f41e85a84543d4e4520c884981a3531d200ccbaec0bf1096fa7ac429a9b3bc1a2b38de159c2139361dca3ea805d97e67f61d10c0911674fe148b33572797ace2138ab478a51057306f010661d569ddd9a4e55e73f67f25f0db09d61f1951279cb79d814d1a21a4ff311be441bbba97d81935b31bb4dd558544babb18175b893357504589fe79170199129e78874882aa89b87c20bb03591f321419a41c1a78f87016b4e551c6928a37fa7c60708afc03c8b5b17001aa3088dca6ac9ab93fe5665f1781e36d7813945471f6945198983815c2737713f9c53a8e717bed4d9a7a706ac41d339001c5d74548388a2439cb0142bb6bcf2e23442155adeb4269cb39432d31455f0191a25822f35c889f2962ff081f1c1b5c55b9af0b14a414b618c7366fef512d94077470440fed7c2d101b5c9ec7b79ba17cdc14653b6c3179261a9401a0b20bfd201bbe243b8cd1322fc872c4bc29889586a8e302ac26b043b605c13c1300a68c95f269b2ef49402786819668e964c921f765abf805477ea239d3b8b203c7db303afe5a8c70158874981c663f1b3f8a645991cbe42a2498beb4579b314918c85a8388f31e628010bca96858a09e49365725b31d0726c0379709529c38b47e15678ac9625b28a763b579af908cc1cc45a5ecb23e5a6ced504b9e3101cc562be9714bf4931cbab020fa3e10456d23d2d01af6dda8dc6e09ec6aca54a3253f5d905d4b34b66250f80324060b1609083028a63aed377a7cca6a929da786eb080db750cf906c98eb9a105f288a36427519c0087e300705524ac343b2c448ead7802404417cacb6ca5a398c7e9c2a7b2855fca298ab1bd0fa9c23af9c5079496dfb2996a3738d5ea37ccbc24f1744eb9f5c672d74968c872392480fba91daf0c60fe96b13828bbefc6156f860ca304970de5695553a631a10c799b29b2585652065f33c6b53179bac6473b4dc2b277284181c7a2a9491ea422c5087358ef8835bf5711df91b38ab90000d324e7b6ce841830bd952e18583eab6b6a922427b2d094ea633cda75c94bdaa1a3d928fd2376a876ac0306b1ee631fe38987e50421389cb224d4045e260a9d34508d1739f223765a3a8f2699a8919b30f80177d9e141d7d9630b46cf5dcc4ff85045e62a4f0f86bdbd6367c1471ac4b22210771eb636c2bbe564578266b8682817a9118d95ade51031def42e0d9cb273c03e3f93ac97395d9f09be36eb8b2c21a4c74796ae501758b222101634d1668656b02cd0026c9eda07c0f3bb7d99b7fac6a78793bcddb2a18cd4262039723f41223d336451eb31911219750098125d62110dfcb20e30c6d5cf75212b294eadf4ac273ecb8bb5beea59108851b460166dfba8564a4a16e7f53e467431528a6e2d8b62b614d427846b701fbff5f48c64c049c6dfc0f1476cffd520b055756162f7ec94243de6b14ac0b9e5fb366c + +# Official test vector 44, seed: "df0e41d2f6f86c1f79d31fd5878e7ab434fc0af3a0d5f47d2ab3fef31a42bd949b0e3629df9f575befbb62e829e51dae" +seed: c719f9b2d16399b7326ce4eca30dabefe8fdaab18e9f6df888b0a134ef355570e40771856eb77e4633504899fcb86c6a3d433d0b8d60e26f07bd61f1d4ed69bd +public_key: 4e35c7f9aab819e1981647b85f7b73ac0b8ed44a9ebe203998771af684086e00a0ba098841e7979baa20d82b450bc35b88884eb935788dba47bc63247de5cf5cda3f069a02874598468c6651842e56464d9731cc027aa307da811c8c163d62cd057863a8c2764f81c889d718d10267200c8c2e7877d7d853a73287d8b1aef013c715f69083b29a589b8e2afbc72a76587032936899244d435f1df58a957091241728dbf57693f46accc214dcb89fa35ac97c77732d0768e11b15b6d5c915ac78d5aa17323bafa8262f75b66d06f55eb015a5774a3854d09bd130473295a946771652176dc0479cb862cc7b93494df1c815d754f86c290f44c1c828228d48a5573a574a2039dc9140ee8a55c6abba1986938a47b0e84859558399a42ca013450033c53b1e978d5a3ace10a87761d51a19bc349fd19f555042e0e2806c1aa76436bc32831f0935c51384b6698a432fd4a014157b8a9858cbc216fa784e66bc09f02258a9dbbc402422cf652a3e430301678283d19889c7b61226951bfab2814a7c7a2899f83670b1a396f4d260aa869feb409b0af63b0b2438fbc72baf0753fb2c7473d577618109a9d2c2a8448a0e756b4402c7c0e280fd1160f20b9b384224fa2ba06ed2274852b15e1b35851ab6e8a5bcb646ab45a85744141970f6c5af2720fedb56abdb65603588d73109630baa73f773f260c63d81c9137100b1322d7c21181285b773b7c552a4000cdb2830e28daa17ca1db9bfa0226e2c1ca720e7565e80bc08f1c742e453fb2230138bc430335c2965386323b269922e5713957057311ba3394320096075b492b641369236134095d728341db3aa13ec453eb4b9c986085e23453e878e42d20c9af4376d092da16c8a9afa9834cca64f16b2b1561a4068c0245c4b6e329fcb1c0a9b15660485672ce70f3f17b486586597e8aebf9987af18bb2ce3267722c549a8519527515f4129ba5c986327996c38babd95cedfc1305f4378fd2c8b6761a24334192d47596502c86080bb202946f34c08d7e201a3ac937844b181d739b9807ea3d6792cac7a7a1b4ba7fcb2c5833cb0101291523208e7bcd486737b982c1136381be16f75202757fbb86970194c4a32eed31b01ccc5a2f0534bda8ee61b0f4a2023ca58b415e59a8d9bbfa9964cf765b31fb0c565174bc7b006855c9747a66747e18e954444dbaa8272a15cae2b7749b08df9811e8cdc01fa46a362052f50aa06eb2249287abfda0aadb2e719f1e1afa3c29d7c855a6ca27aea661f40210c1c629f611343240b3968238746a245ace3994bf88b46893eff1a3a6096166e0bb7341900e73bcc36bb92d3e539e456bed44b84cc00bd836081704ab2e4065559896657ab31c60c3564981453b58bc7e238fc5b778cfb4aaba57417009a789a13bb075b6d9541692b85ab52961fe887c29289923797d18ab8c9d35230624b004457f749497267a2efd15fada244c1d35c44109add503328d063b7e8c0fb8c66bcb42c8b1c1eac421563c232e579431fd9ce4d572904577811e23af28109b2e419515260e0e1bf4a969d18a4378147c0334a5886046833ab8d06c78041c6b848a43810208a5fa0a202ec2320f4adb15bc299c6649c694f76311d8c0450ca829c3545ace79a33e0942f133c35e1e6be342c30fa9b8debe6820a3cad5a2995414bb7f0744a22194435ea8e5a534dcb8c754bc75444093af5d72490a3468bd06bfd1442870701896a4f1fc11fd5c8c50580cb06192ce7b90f81d920a3bcc52ed02fcf703428c22c8ae25fa56085f8033c972b47c61998db005b019032d7a83660803cd39014bb3165c94b9dba1c6e38abbf6567cd513283174c42bf4605b3809c29dabf149a650bc906a4cb1e33a469bff3820713040aa067701282cc1c6826008f8787cfd0796bcb568210e088f649349ad921b9349cd4998189b4b945d92ba6bbcc972155d26920e1a756bce6441748c41c6c7373723a9c00434e485216d92dd6884f6113068fc2b798790f41bb3104a513f0e413ced19303f396e5f7c72612c4f4112f41518ea77c850f7b8e64d1b6df73a40f87b2945b14b8275aba42b455253b9d522263e4bddd6c24222062ae68bfe5ba4193195ed026712e729d59c7a1f519a9c65c566a51504cb93355a33d83acb62a268e02874c67c89530f914761b751f03f3d2307ac9ede742f51bce4342afd3cb6ce2ab83fe +private_key: c4ba61e90c3a8868850ff1c4662226ac4953de3553f0701c404618bc69c0f57b527ee459f171bebe70c730f1841ba702f182aed1ab25ae59cb9e793d7a22c4640ba87e78433b639bb061106c0581809675c702596af67e382b564b514c4d091a13f35629bc71aca95a502239bbaa7fa15310ae31b7e8b97ab3ba783a27c8b9eca6b9b054911c756085002a329063067b06707a6d3a31c27c234fa36daa420c5ec0aca490c0fb66023c34064f09832d43b465dc8f84572130270599c10534294ac0458412c58273f49c39cb12d522317c980670692207b3af7417bef469234ac081b1884815972c7fbb3733e22d8a164c614ac8546c14cbf05a6bc47d6424c36d3b106fb245ca335a927538d227be6aa1a4dcc33bd1c68851e18e2ff7cc7ea93104521db15c7f11041676855e0bec2b2f9b8e9f63920858b3db1cba7005c5e21c4effa94427d155ec0c1432cb2679c45802795e0ff13674f15be6d60ed4326ca4f230d87a59bfb268f08362a6764aa2402e270172275191649bb3991200330a62594aacc81a8fe9e5004bd5ab8ca4bce4e36860eaa9e49a2f77762d88f0935d6563296121764aa34ce64b41418bcf275b8e5bb2a25259669b3010b239f111b2f6584c3ee9bfe7608d12639e72ea38073c9c45107abbaa5c673718ec2c4a77a19464209b8efba54ae482731bbb3aa036a67653ffdb0e8741c678b88d4ad4647f8b39dc61a879eba65db1b98281ca641c954915a916b15307808587ec3d7248668b1003a1612f9ea13e4ca7b660431a7a55199814ba1e757ab08056b7d9c13b0334661839c334449afb77de61aa7caa28ad57acb2ba0e02e76ad9218a29c6c638390823d6ca512139d3f8826b5c176da373d7754cdce78c614b98a59b4bc607382f103eaed7645cf791b3fa3374fc1fb16493658a7885735f7fc38fbd324fbdeb904f17b7a9fc7af45013a0e8c1d3c4b9b7ecce171731ef1c97693695fa775ff0452d457b8d7f17bf24638112391d1b4017db07c3a037845722aa4fd72a0a079803102b0cf49b522302b37a46e482914ac51af1f007ac91a84d6556a176affcd28553362c16471eaf569e666683ab71cbb0748b6bb026d6b736e68203a3103940315650c4201f31bd286643c635644a567b2d38b1c6746757e956c663cc2ffb1230e7c20e94ae939c8ad10b9be3887b8fb7ca9ed360b2295f03725047cb8cb771adb18b7f1c976cb436ccc0c675f99575cea24675c358c3678b3dfb345100caa3d11a4fe8a34737c4c11131b7e400aefab6380b4565326f1ab8510d4210e3335a5ff07473a46d9ac73974aa4c8a10ae5851addc7b4d3bd9823b71aa1c0a7f2b4746744bbdb9335d7b161f55276a1b63c3b5b4800d0344023093ace786fd99c144655d6af601e86336a5e16e6cab8b772a39cba32c68e84390a80d62701af5d5822629a758b49cba714507c7cdf2034cf65c4a0601bd1b07b4e1c1a70ae555d7368a568aa0e59b5494239d2e25a9eaa34bf8b29b2fa31ef8eb606e69602ba0a4024780d5c29cb6c63cee9187249280ea56207b4628f8964579bb878ef25aedb180931aa5e176ad53a890b3f705bf626861265bb9331d79f66b87e96a6724634df6a35a82979a4a2b1c23bbe585a001a936d548599cb82c8e362442a6481ad29478ec2e389853fdcba3853629630030c9091e8781a33287001a6abdeddcaf69856a832cbcdd3894f09690b581ac6f7951b7f3558a284c8298225bf74c6847c8d834aa4b118a37fcc87c44749031091af154b6273bbfb4ac7a3b34ba6c5642a78a22b213428782eb81194297a88c1c04ecd35d6c548289285999b69ac46346127aa097eb2a08fc1bae1a944ae83bff25949e27af6167b73938147bb97ad5380f599822f788508eb73563e82e73c9951d5c94428a056939b9c5ab272525a7088977135008b0c5181bfa27e336457375b1438914bc0189c00bb2f07c5eb5429ee6956943d4c5aa597cf1376ff7083da68b7c1941529ff5509ca82e3a424dcbe4673ad16439ea874786544e7181bb755250025572c9bcd36c28338482e31449a3b6a917c9947876a702b8567327309b3812a3aa4bc8b979168bbb2db72f533434808cbced5ba7f567ac05082db4b029512747d203c84ed6aac81245522a4d30a887b8f44b4e35c7f9aab819e1981647b85f7b73ac0b8ed44a9ebe203998771af684086e00a0ba098841e7979baa20d82b450bc35b88884eb935788dba47bc63247de5cf5cda3f069a02874598468c6651842e56464d9731cc027aa307da811c8c163d62cd057863a8c2764f81c889d718d10267200c8c2e7877d7d853a73287d8b1aef013c715f69083b29a589b8e2afbc72a76587032936899244d435f1df58a957091241728dbf57693f46accc214dcb89fa35ac97c77732d0768e11b15b6d5c915ac78d5aa17323bafa8262f75b66d06f55eb015a5774a3854d09bd130473295a946771652176dc0479cb862cc7b93494df1c815d754f86c290f44c1c828228d48a5573a574a2039dc9140ee8a55c6abba1986938a47b0e84859558399a42ca013450033c53b1e978d5a3ace10a87761d51a19bc349fd19f555042e0e2806c1aa76436bc32831f0935c51384b6698a432fd4a014157b8a9858cbc216fa784e66bc09f02258a9dbbc402422cf652a3e430301678283d19889c7b61226951bfab2814a7c7a2899f83670b1a396f4d260aa869feb409b0af63b0b2438fbc72baf0753fb2c7473d577618109a9d2c2a8448a0e756b4402c7c0e280fd1160f20b9b384224fa2ba06ed2274852b15e1b35851ab6e8a5bcb646ab45a85744141970f6c5af2720fedb56abdb65603588d73109630baa73f773f260c63d81c9137100b1322d7c21181285b773b7c552a4000cdb2830e28daa17ca1db9bfa0226e2c1ca720e7565e80bc08f1c742e453fb2230138bc430335c2965386323b269922e5713957057311ba3394320096075b492b641369236134095d728341db3aa13ec453eb4b9c986085e23453e878e42d20c9af4376d092da16c8a9afa9834cca64f16b2b1561a4068c0245c4b6e329fcb1c0a9b15660485672ce70f3f17b486586597e8aebf9987af18bb2ce3267722c549a8519527515f4129ba5c986327996c38babd95cedfc1305f4378fd2c8b6761a24334192d47596502c86080bb202946f34c08d7e201a3ac937844b181d739b9807ea3d6792cac7a7a1b4ba7fcb2c5833cb0101291523208e7bcd486737b982c1136381be16f75202757fbb86970194c4a32eed31b01ccc5a2f0534bda8ee61b0f4a2023ca58b415e59a8d9bbfa9964cf765b31fb0c565174bc7b006855c9747a66747e18e954444dbaa8272a15cae2b7749b08df9811e8cdc01fa46a362052f50aa06eb2249287abfda0aadb2e719f1e1afa3c29d7c855a6ca27aea661f40210c1c629f611343240b3968238746a245ace3994bf88b46893eff1a3a6096166e0bb7341900e73bcc36bb92d3e539e456bed44b84cc00bd836081704ab2e4065559896657ab31c60c3564981453b58bc7e238fc5b778cfb4aaba57417009a789a13bb075b6d9541692b85ab52961fe887c29289923797d18ab8c9d35230624b004457f749497267a2efd15fada244c1d35c44109add503328d063b7e8c0fb8c66bcb42c8b1c1eac421563c232e579431fd9ce4d572904577811e23af28109b2e419515260e0e1bf4a969d18a4378147c0334a5886046833ab8d06c78041c6b848a43810208a5fa0a202ec2320f4adb15bc299c6649c694f76311d8c0450ca829c3545ace79a33e0942f133c35e1e6be342c30fa9b8debe6820a3cad5a2995414bb7f0744a22194435ea8e5a534dcb8c754bc75444093af5d72490a3468bd06bfd1442870701896a4f1fc11fd5c8c50580cb06192ce7b90f81d920a3bcc52ed02fcf703428c22c8ae25fa56085f8033c972b47c61998db005b019032d7a83660803cd39014bb3165c94b9dba1c6e38abbf6567cd513283174c42bf4605b3809c29dabf149a650bc906a4cb1e33a469bff3820713040aa067701282cc1c6826008f8787cfd0796bcb568210e088f649349ad921b9349cd4998189b4b945d92ba6bbcc972155d26920e1a756bce6441748c41c6c7373723a9c00434e485216d92dd6884f6113068fc2b798790f41bb3104a513f0e413ced19303f396e5f7c72612c4f4112f41518ea77c850f7b8e64d1b6df73a40f87b2945b14b8275aba42b455253b9d522263e4bddd6c24222062ae68bfe5ba4193195ed026712e729d59c7a1f519a9c65c566a51504cb93355a33d83acb62a268e02874c67c89530f914761b751f03f3d2307ac9ede742f51bce4342afd3cb6ce2ab83fea96998e3f52b93dc875dbbd503bc67beeee7f1e46083868f96edb9ec3601dad0e40771856eb77e4633504899fcb86c6a3d433d0b8d60e26f07bd61f1d4ed69bd + +# Official test vector 45, seed: "d3c9ebba6eb03ccb5c9b9d2c8d7f0cfbbf50841e24396cddf0e56525b38918c2fbe6c34cc1b93f7bcd4f4d5777e1a488" +seed: e9acbb774be970206c3a738e243b420805a509fa59fa902044be2f0d013650d2ded5edaec5de3bf5b4d7c2f2e18e87f499c1968993eff196753db8045e2c8ba8 +public_key: f39713c311077c359f42971b65463a8de1aed9879abd512cb55b6e44f5c690e0a3f60768a778cc9cac5ad6b897379507e3ccb994956284a7715970b0e3f6189f0c66d99c667119b82d87a6507141cfdba46fcbafa8a2a1352139b1024dbc64388a3275f34180ffdacc380132eff35eaf788364f3aafdd6af9c02cfa396592282cbfa110792f87b6182b2f36a0a895c0791276d789976cdf09d2c16a32aac669647219086bd36f6bf631392510c0e0970007a88378b647b52fc20ee9148cd4575bb8b31b06449994098bdf77680a48ab51b8e5732545d6b87112884e35a2302f60358f651f8a71c0789018dba79bf5298a9f6ad16bcbbecac4f0cc9888cf55bbeb38264c885ce098fa80463f63806a544bfc194b77895a76b22b81b1098a8c3819e035268d22f4ba0339067ab3bb30e65506a86e74fde52afee944df4e4c745f9393ad59117dacf74a407c236b8b5a2aa11b1c9f86163df31129e885ebf68040f822314c2bc4dd12751851864d743ea49b68a93212d392845ac46f95715796a488cb44072ecceca89878f37b51d662d783900b6341a65d894771476fb942ed058b15150bdc67a3b7f4cac93733f735b81f8dc4aa5eb1288d761b0b74238a5cd73c8bd2457bc195b785fd31804d654aae06eaf5b08a365a472503809b416904162c17942fd27671989c553ab5137488f385b7b9519a69cb496444a7a2db607adea5c3e128bcba31f586c5603f953f4fbbb4381cadcb88d6aa7784562c6ef302ed398cc2113abd257c9554818c8175db54baf20024978e167620b672b28bf24465d2cb4cfc6c08739fb9696bc84fdd76b136b39b85c7deb4c10ff59337b4112e32bb25a665e9cf624baa86aacb2a18ea3cb67462874117445f913558c32e5eb7e1329cfc2d99ca4d83007467b80d74d2ec9832a5785fc7293eb466d55cc8904874bca5714c776579b253f86b17187b9c19d702ae65aad9d7cc23afb041e593bc41308572825a76b4dfd51a2bafcaa10390a76e08458c384cd0089668955fcab00082759de9147bdf581aa4a81f8f82bbea84d255b43e30b6728fb7a705c0aa96b794c7ca28730c6a1b1b2c1040fa24a98ac862ed74453c03a3d842cb0bc87409a09456c739ea08717d7a1061041c424d13bbee299c1ab1bf328b42314263f186e5b198bd5b1712c04402bf849df6473b8e78c4009c944d05277c68d6eba8555ec48139560922a7a142632d4168dfbc6396d0046c53221d43b7bbe01bdffcc672f214217679853d3c0939acfa7b45ac81b145e5bc7d668a4466156faa6a44ae2b9cd6caa5d42cb1c2ac5aa847cc6501ce998b2896652e2c901483acdffa695cd1625b124a8a88490b12b72a5cbcb67a29aa955247fd17ef46606ab5b5fda6ac39edc0128e46310903b32435e2f02158f678462f2bb230246455b7d307b5bdb40375c6cc507987ef616816d3a97545bc0f6e44c025c961cca33a828beb6480494cb9049bb2e0c8734437ca0745b55174b67fca6abe743c7f9793219a19a88298211562e7ad85643b0b680c957eb6b740ac142276822900110f3998f2b043816c9216c416d64e482dc1053928722efda8c35bba98c563eb4fb280791a9a330968cd29360860737d3cabef87d158419cd8794d15771588cb049f393d3729fe3276590488e97f00e63b6cdb760c22fb853352c2eaaf7340b204d6bf8cd186cab5f786e7f967a4d147686a690ca7308173843dbc0bb17fa4ab2788436f43009827946265e86e782b97b2b27b87ee2c0ba9ff23d6d620ac02124189bb008d54da8f0118a081a70040b0c722a7b5a97194c5641078b22446d7ce9b66ab9332f2ab85d7320fc651eebf8b93b838421ac6818f87673872582360bcb903ab70972e8e589465660e6e4b9295675416547c277827d667102c99297f9909548c52621846f5978a5d6971ac97c6df5cf1a3a42717194f112093b73642cd757b541c6d5094931d97afa952ba80024b5d76caa088577f24b86208da3448dcce24769dcac3af496b4ec8e634294c7d323a85128d4e20dbe5b7bbafa8fbce12131f0663572a4c1a4885ac49cc607578042c0c68853b661b452662ae194512b208435a72ebad23519e07f96f59edfe2a5297c351bb38773478747732d9841b5c26091ce45559d7184e1ca01b7c388a8cb030a00f66b47988c2d7d195332662cfc7d90b279248de101f77e30 +private_key: 744900d5a1cc90d1baf5c17965a200ad563be74168e130481832184937172b780a1cb0249bc3ac8fe09d7892709c70bfd6496041ba834bb1c291d5a73368944d13561790a20603bf8b97929624c5f586ceecd1636b6cb09c99807cbb9befd3b2688a29a63120132b05b5420a0d984b9368338710b29a4c5a4102b25ce23414e3563272c2c91a33467aa665b40b7a18ac434ba8e1fbae3a7cc2493b531c6b642759625009cac7751496b18127d33d4733af3fd461c1cb7531223945eb1be69c8486a35bd49ab075fa6227465f97ea2efe552db4329bdf66259d091956a41a1d938940998c8e83329ae0a8309b521af642b9466aa3a52a4572a00cd6acb467bcd0a0551f4538fbf78db2e0668f47ae9f65094d4a30814371e20350066bc797777d79135d9f104f773289c2c20c55d4bcfea1a674f454c87ab9d809a1ab91a6e13747438a7eb7f814464426cda6c10d9456a34c66dc37766b87cf01a4a38e45154bf96d5a5617a9e3a353a57706ab5911dc3f50a1c9ccecb4590bcf8c4765fad91ef119b00c027cf5f30bcba608fc4667843891934935c49c8a945553575c67a1e3c80df48bdba8778865ad972bae7733c8c4d2787609d062b16aa61c25564955213a06e8d021d631bc032257d0618d1b0122491b8c9df8251886a2efeba199a850ca41bdf7c0362293b80a25c247820571eb6d6d798da2c207115500a1441977a3362a2c1366a15cf60a6086258d35a695690a53ee6737cc76a8edd47795ca913daa42d762996e4061f8353be362752fdab69a571fa02671432615834c8008284293c9c83ca3b1eea330a91a7522aa876d37cf7da439e2b31db5c903b17b9449e397659bc7dd668f3e9cb2cd877c57fa3ee2fa9a3b3c9d22e5c02a48ae494142e5d56664ca0ffdd15be6c4c2a063907e842b800912ddc9141af93839b17f37f3725ce36b9a7631e6a002a7676df2d7a72a740302fa5ba55a41fba7953a5812ce30823195cf26b8611c401242ba90487ca730472f30bc8975d78741051d91701b7fd707b7846ba16874a8984446d017bbf2357526a4882359edda98570b44aa2b1d968c4a2de84ac78330d2d2725f7a317c093f42809d3d26092936330eb51e93132c975096df35506fbaa429c67ae6b75d24b9a510ac2bee812ced4a732fd1198fea3e135ca2a97657608b6944181d062b1df05679d8d847e50a8668fc8238caa884b31fdeb3adf0f890a4956887417d00376543fb8588fb4433156ca8c7152ef466b9eb7534e9030980ae47d82c04f55d5764827fe036fe58c6ac9aaae51c115ed619e5db99f3f6143354903bccab9cb5448f9a8e76c3690c76732db1757d9742aec5334f79c0080a9c0f251b34f637f80253152b4c5d8124f302c3f6e15ea5d09758e42b99f15427ecc63976a0315644ed8ba516429a1aac16aa2045fef31a4a68c737f206fb26667a403c3af01d82a191bef752976c1962b53b0228513a3026a0ba7358162dd8885aa3dc31e45b72346a055026396b405ece0579bac0504082589023b4e0aa77b07366ecd188381ab2b9ab47287c44c14a36fd1095453b2b3b0a816af1c62ebb2e023247e4983bc983b867460158eaad4876551638ba5b528e0c74b9a081537b7bce3e1540062b93fe447873523766f2cfbb4c46e3c3751057764568033942b89b7325e639c318f63aacd82139192c81e45f4484073a540df8e459fbb9afcba59c167a1ecc71aae7473c8d9cbfe41cc27db6b72c804f64cc1a015018d212c9dbe320aae4423596b4fd544c6bd16af096af352c18a8dc1d68fa29df7a454d54b92bcb21a74cb107153b8386285c0479020c04ac0b59ba8392bc976c046995ff606f2aca215ababd04f031e52032f6c08e63149dec0a590a4c49ef55533735224c341baab9b0fc36771790c0301638ad09882634871196b55e87a5e7b9348c8a83d9fa0b1be81232864342262f57f063d38940947b48ae840dc42b27d52a01f4c624196c9198d081992934777653fb533e525cbec4591844485ee6a457f4b31ff94927713c9392627a0e676231318f18e084cee43501f0bbd708196dba67644145e7561fc1fa2c5c4835c76a5264a25d96d47138e2cb3d75297345910c164ffb30cd4c26cd1189264a602a3397aa6afbb27dda27a6566e9769a5f39713c311077c359f42971b65463a8de1aed9879abd512cb55b6e44f5c690e0a3f60768a778cc9cac5ad6b897379507e3ccb994956284a7715970b0e3f6189f0c66d99c667119b82d87a6507141cfdba46fcbafa8a2a1352139b1024dbc64388a3275f34180ffdacc380132eff35eaf788364f3aafdd6af9c02cfa396592282cbfa110792f87b6182b2f36a0a895c0791276d789976cdf09d2c16a32aac669647219086bd36f6bf631392510c0e0970007a88378b647b52fc20ee9148cd4575bb8b31b06449994098bdf77680a48ab51b8e5732545d6b87112884e35a2302f60358f651f8a71c0789018dba79bf5298a9f6ad16bcbbecac4f0cc9888cf55bbeb38264c885ce098fa80463f63806a544bfc194b77895a76b22b81b1098a8c3819e035268d22f4ba0339067ab3bb30e65506a86e74fde52afee944df4e4c745f9393ad59117dacf74a407c236b8b5a2aa11b1c9f86163df31129e885ebf68040f822314c2bc4dd12751851864d743ea49b68a93212d392845ac46f95715796a488cb44072ecceca89878f37b51d662d783900b6341a65d894771476fb942ed058b15150bdc67a3b7f4cac93733f735b81f8dc4aa5eb1288d761b0b74238a5cd73c8bd2457bc195b785fd31804d654aae06eaf5b08a365a472503809b416904162c17942fd27671989c553ab5137488f385b7b9519a69cb496444a7a2db607adea5c3e128bcba31f586c5603f953f4fbbb4381cadcb88d6aa7784562c6ef302ed398cc2113abd257c9554818c8175db54baf20024978e167620b672b28bf24465d2cb4cfc6c08739fb9696bc84fdd76b136b39b85c7deb4c10ff59337b4112e32bb25a665e9cf624baa86aacb2a18ea3cb67462874117445f913558c32e5eb7e1329cfc2d99ca4d83007467b80d74d2ec9832a5785fc7293eb466d55cc8904874bca5714c776579b253f86b17187b9c19d702ae65aad9d7cc23afb041e593bc41308572825a76b4dfd51a2bafcaa10390a76e08458c384cd0089668955fcab00082759de9147bdf581aa4a81f8f82bbea84d255b43e30b6728fb7a705c0aa96b794c7ca28730c6a1b1b2c1040fa24a98ac862ed74453c03a3d842cb0bc87409a09456c739ea08717d7a1061041c424d13bbee299c1ab1bf328b42314263f186e5b198bd5b1712c04402bf849df6473b8e78c4009c944d05277c68d6eba8555ec48139560922a7a142632d4168dfbc6396d0046c53221d43b7bbe01bdffcc672f214217679853d3c0939acfa7b45ac81b145e5bc7d668a4466156faa6a44ae2b9cd6caa5d42cb1c2ac5aa847cc6501ce998b2896652e2c901483acdffa695cd1625b124a8a88490b12b72a5cbcb67a29aa955247fd17ef46606ab5b5fda6ac39edc0128e46310903b32435e2f02158f678462f2bb230246455b7d307b5bdb40375c6cc507987ef616816d3a97545bc0f6e44c025c961cca33a828beb6480494cb9049bb2e0c8734437ca0745b55174b67fca6abe743c7f9793219a19a88298211562e7ad85643b0b680c957eb6b740ac142276822900110f3998f2b043816c9216c416d64e482dc1053928722efda8c35bba98c563eb4fb280791a9a330968cd29360860737d3cabef87d158419cd8794d15771588cb049f393d3729fe3276590488e97f00e63b6cdb760c22fb853352c2eaaf7340b204d6bf8cd186cab5f786e7f967a4d147686a690ca7308173843dbc0bb17fa4ab2788436f43009827946265e86e782b97b2b27b87ee2c0ba9ff23d6d620ac02124189bb008d54da8f0118a081a70040b0c722a7b5a97194c5641078b22446d7ce9b66ab9332f2ab85d7320fc651eebf8b93b838421ac6818f87673872582360bcb903ab70972e8e589465660e6e4b9295675416547c277827d667102c99297f9909548c52621846f5978a5d6971ac97c6df5cf1a3a42717194f112093b73642cd757b541c6d5094931d97afa952ba80024b5d76caa088577f24b86208da3448dcce24769dcac3af496b4ec8e634294c7d323a85128d4e20dbe5b7bbafa8fbce12131f0663572a4c1a4885ac49cc607578042c0c68853b661b452662ae194512b208435a72ebad23519e07f96f59edfe2a5297c351bb38773478747732d9841b5c26091ce45559d7184e1ca01b7c388a8cb030a00f66b47988c2d7d195332662cfc7d90b279248de101f77e30087881ddff4095efebaea305138bf83f0e3071f5494c3ea5bec8f775128ce60aded5edaec5de3bf5b4d7c2f2e18e87f499c1968993eff196753db8045e2c8ba8 + +# Official test vector 46, seed: "6b3996e8bc6f52879f2b7be012c44ad555707cb7e5fd8abb3457a298336d6fdc9eb7853008ff13201d5969a315c7e493" +seed: c1b3cbffad4b306f9af0cdd3028876486dbe858875c9b6497fe20172a986c82b1c96249919cedc2369d8d739ab125e0d2ccb82dfebcd90240a545cdfe07511f2 +public_key: 2d661f371b1f9a3c88556374af9b603c8c1db100ac3e600c042672bcd971857232fbe70e3c1280f5ac45d0e819a8495d2da89ef5086b110773c7d1539ec94a44fc0cd6f4a39362731f527de3f06f4a78b0dfbb94e4977a564c765cf8ca68658fbe27937a7b15a8671cfc8b3e779533d1b5c092826b3038b213550421004012a4cb3f12478efb0c92bcbdca4259b153584bd4b65a6b8d66f578f6f408bfe246deb5304ce5487b7a95c6db5605818e26d2cf5fa6adabea9e3a48b6f889305c016055db7a02a34ba5e10573143ddb8659fbe25c7b621e3494aecef037effb36b2819a1816788a6b410918745c2a423285c7e0021cb8c8793b60b4c9061a39f97ff1212f02d387d224b0ec258268a374b6e27ac9c4598fb78c387a7daa439280d79a6218b3ceb0bfc2e685bad8801d92b5b1a42f64c8890709c58c95bd8ebc43568c33362a53b5a12c052489bfd806cad36dda117b2180b68cfbb317d4bcdf745c50324e19dc7b17ab7f31649a57bcce91fa720052afb0b0ba5e8b57a5e4296b1c390da9a4f76a869af0b9389c0ac381aeae0a779ba588ff415858b3300d71b99fc172de950a95c3a61c9072b6f2a7cd9245da690128b9c597c44903837b8a9443865c785ff6bc05854e1115b9e3d7a70c7c40216ca48b1c6497062d61fb8cb29c71e5800b8e752e70b9a8655baa8408742a511ede8409301620f3bbc2a27790dd7058841432cae4cae719740835571ce65027e74d85958db506a8e9601c1f5ba5728a6e710a3d3d93748a7a640c460167482dcd6cccfc238326171927c6a72ee7084ee97d3e7519744ab8df651b9b2b69d4ac7cdbd9437849114e29550ba3321202906e9331bc7ccbf4571da4c6ae1a0b2797ba4bcc75398e18505eb02dc760b00f687c76f2a35f707f609ca149b4be233b3ba4739e19e4462d78950138cd1b210904b10a83356156a63631d4a6193c68e78642e7c5c0daf403e8520cc2f7438ae950d4136ad32684f2881c50c1a508b0442bf6c92f030f82653578c79fb4eaab1cb60df4870d6966ca5bd8651400a5a6d424749c8cc6aa6fc90b6514a8274e633aaa74435542bd2eaa354d65a32591819b8233834abf1391470085c9144b8239390f97624fdbc645d3662f8a7a2b7ae412f8525884081b3282390f8c35e2379aa5d234dfe9c0c94098ecfab31dfc315413c62aa80fb8a9ad11d070d02cb192d18f3717c1375401c0713437b0868298205162a78f8b00fb46ca2ccc6dad2717185b72793b2aa009419a6330ec508c8c325110c53fa0512a713c500631b36ac410c5a966edf1656419740baaca6719639987bf5e17444b4122650c87c884069fc52ba082837158b9bb85b2c961268284b5d8636b2ed3bd1781296de78a1cca44502a779b2bacb6f86d676355d4d527bd050ca8d33a12d059e6d697f986177e1b95424ba97cda6b6ae0191ba70bcb75172c354541c7742556c5fbe591f33b9624452392412f3859953ac21c50d5a445a34d94d492afbb01a84c844fd582802391f4f4a5d012a8a62079e254363fba52c83a399bb3398f6807e6f03f74f68fc788187be6bcaa5491ff666c98e43c3f860470380768f70b4987c6ea10411ea60fc7e8cba0b1afd72a52713a41a2172804ecb9fb60315e37c544555a8aac8089081c6c2695af8011bd991e1ddc87c841cbe0c0357e04489785222930a5d75b81cde91e5804315bb30bc93294367a4623a0c4a0ec8ddc436c7992b157039879bacbcb590490c28ae7c9142267654291c06a75237b24b8895404cdf32a073c4922c202a087bce07aa5708816818564c68237136c0a98119c2a6244a59051071414425b9230a6113cab28b06a058e67b16b9b3287f001422c276c78aaf608820836c863a1555590bc802a70abda52e4c430c80992745945ebd343277c222836631c652dcc425e1fec6f22383eb78c9b47967e865c6382231b4ff42b94f281c4e9a849477706c339a48ac2c69416d1e51914c751dff0b74cc657a8d9b0d0e21cb2c3a72fa241338b11f529a0ea9cbb8bd310203b29775867f23b7a6ed35890f3014474b51a578110cb1e1d052d2cd03a19fa06f1750279476642752934201c0832b80b552c7a4b4eb1118e2466624588ac1d0148c1c0484352479ea604758012b5d49e885965bf6ec29407a0d9d3f1f08826007a5a3d32062d2a775728c35116642149c2d449 +private_key: 74e23285e187f22c6a1f0b5258081ca00c59ad4a733b6c168c39ae4994c7cac606422ab8ae07968a652c7cb130e3a1b5b65077ad348f2b213ef368c46c1b45ecf9c58fe49a86396285d554b157ccf2142864fc88df377c2bf758a3488722dc9111b39a90c58d29d18b0373801d761faab0845e78bef3c0b91509c7c9e44cf6a74bcef19de93538567564855981484ba0dc5a0553e921d302449663cce9c3aa1fdc3db0129999e011ea3172a1a3a504e2286550cb86156a23c74e0b2b2750648a15479aad813c4a576fc8f70553a34287147580b6a62957a26306cea1571963d4171dbb38448763b664752ce93a21d84101f79a66bb1e192b2c4ea0266d1c869226b0e110975bfc13e6e384c1883a76e5258c129185ec036a6063f182a35c3ab843523ca5c9b30b655eacd967847c86de2c169c40866f8b798555497ea94cfa99591c1c563264b54d369f0297168339379310be3354baf9d1ca6d7a79a2d0517e39c0f6412bf64bc57059b05db3888dd35e5af70fccd55e38e053b453aa43d0027f8ccfc0e15da1c91e4a0b3b4bb776df88aac1308f444856f3e888ae4753888b017cb342e70c78318a7a3a8142bb28326caa32809571d547c15b86437c655ebcd48bb2990493001ef4bbc7b4a02008396755b911e1782ddffcaa92a34c39dc8e0b9a48a33a252d6c547ca341f92727b5b40e92565ac466ae58000799a534b8277591e99876b4925a9a046644056a625a7a51431aec58c5d6b98eb4a0f40724e24477f6ebc52ab7859987871e623e93a0c081c9212e5b33e1c813c6a81980a5a670c1991dfc721ec62dd771cc9a30bb7eeb67ba71ae78c81cb802743b3589e661c4af476bb5753458db8c7d281575eab3f9216307a02f95147eeddb5fcc76c158701bf8a44d3890b65e6b43761a757221a70769b825b6cac8fcabb1dc155af64b86258f0ed5260522188ffb472cf64b82cb68cd41b986b560bd00b6cd99b805531076e25a2bd6204e264114602d6c1bcc5e9235c85575e66b391bba0d4297c9cb5508dc5cb3200b092400ad59508d7fe14703d433f980a79a796f24b82c60741a8276257c5b5311d85cfe1b8733eba10e305a3ea4affa5304f98a438325647a521f1b154a6547cbd8457545dab60ea7966a03b40e7c28ec1a22c4757a3b3c7dbb191895dc419cf609adf40c5fd86436506894a3932f1666ebd14a74c93d5e93511b5401fac02fc7280d088057eae2b3c457168b1b9e25fa81ffaa9d30c27dfb250dd5f287f281b12f1381657918eaaa067ccb07bc0a67bd4827368c7c0b4cb45d403159f9cd8de5caea6b5521ba173160561c9270ab15c85351cd46e8c4a3810587702f3f0b6921367e4648b654fb53d9627f573b936c6bc050a34b7e3c7c379a4c744b80230c35b784bf9a4a3fbd8a892450b4739488912b2b822b3664c25327d051c0236e05487671461264e2643c0aa7ca89a9c85867c817b714507c2b955371583611e77c783b68796267259638d4001e0555a19644b70b8527d9d66a5a3036e348cbf21200e3e07717cc83d0866ec7356412705706f192dbda8f43ab30d3f14d059190c1c95bec240e0c3271c2b755942183379893fb6cb0c0075c7b67352a76bc2bf7390c39c3768127e9402fc7e2716431bf25cc8405e23bb5830f348b4d00fcc1fb44389100cff58a3409174fcd39c5779c93336a053d04531942133fc92d66e3855043bfdea0c0f7b7795b0941db78a52d6708a83913cfca678f67000d873060777ed6f0906976ad12946b70c9b5f9e4a95a8b1eb5b733d3d92921cab8bb610b3ea33549e6371ae507ad34170fb09ca9d65c4360ce42ec63db51b1705b19205b01688aaaa7c00af97c93fae66dccf93d44a61ab5381326982ff2a73bc5b19e17b126c7a652f36154401a6d28006a383841f4d9998a06152d0b58c5e6457b601953536693918768cc1ec85b1494255858da9253693293848bf8c14a6bd362a2b91137cbadfb82a4b1f80a3577869b50716983730a31ad1574a3f5a62ad6635ad11c4706ac6912248a6b55cba70658deb6336e7344f1535e195722486866475bca60c8ba89cb591afc603ff0cddfdc55a705beaa1b99ae725a400454f6874462713e12698a55a267a96092be913b3472b0d9fbaecf20169790368f010b2d661f371b1f9a3c88556374af9b603c8c1db100ac3e600c042672bcd971857232fbe70e3c1280f5ac45d0e819a8495d2da89ef5086b110773c7d1539ec94a44fc0cd6f4a39362731f527de3f06f4a78b0dfbb94e4977a564c765cf8ca68658fbe27937a7b15a8671cfc8b3e779533d1b5c092826b3038b213550421004012a4cb3f12478efb0c92bcbdca4259b153584bd4b65a6b8d66f578f6f408bfe246deb5304ce5487b7a95c6db5605818e26d2cf5fa6adabea9e3a48b6f889305c016055db7a02a34ba5e10573143ddb8659fbe25c7b621e3494aecef037effb36b2819a1816788a6b410918745c2a423285c7e0021cb8c8793b60b4c9061a39f97ff1212f02d387d224b0ec258268a374b6e27ac9c4598fb78c387a7daa439280d79a6218b3ceb0bfc2e685bad8801d92b5b1a42f64c8890709c58c95bd8ebc43568c33362a53b5a12c052489bfd806cad36dda117b2180b68cfbb317d4bcdf745c50324e19dc7b17ab7f31649a57bcce91fa720052afb0b0ba5e8b57a5e4296b1c390da9a4f76a869af0b9389c0ac381aeae0a779ba588ff415858b3300d71b99fc172de950a95c3a61c9072b6f2a7cd9245da690128b9c597c44903837b8a9443865c785ff6bc05854e1115b9e3d7a70c7c40216ca48b1c6497062d61fb8cb29c71e5800b8e752e70b9a8655baa8408742a511ede8409301620f3bbc2a27790dd7058841432cae4cae719740835571ce65027e74d85958db506a8e9601c1f5ba5728a6e710a3d3d93748a7a640c460167482dcd6cccfc238326171927c6a72ee7084ee97d3e7519744ab8df651b9b2b69d4ac7cdbd9437849114e29550ba3321202906e9331bc7ccbf4571da4c6ae1a0b2797ba4bcc75398e18505eb02dc760b00f687c76f2a35f707f609ca149b4be233b3ba4739e19e4462d78950138cd1b210904b10a83356156a63631d4a6193c68e78642e7c5c0daf403e8520cc2f7438ae950d4136ad32684f2881c50c1a508b0442bf6c92f030f82653578c79fb4eaab1cb60df4870d6966ca5bd8651400a5a6d424749c8cc6aa6fc90b6514a8274e633aaa74435542bd2eaa354d65a32591819b8233834abf1391470085c9144b8239390f97624fdbc645d3662f8a7a2b7ae412f8525884081b3282390f8c35e2379aa5d234dfe9c0c94098ecfab31dfc315413c62aa80fb8a9ad11d070d02cb192d18f3717c1375401c0713437b0868298205162a78f8b00fb46ca2ccc6dad2717185b72793b2aa009419a6330ec508c8c325110c53fa0512a713c500631b36ac410c5a966edf1656419740baaca6719639987bf5e17444b4122650c87c884069fc52ba082837158b9bb85b2c961268284b5d8636b2ed3bd1781296de78a1cca44502a779b2bacb6f86d676355d4d527bd050ca8d33a12d059e6d697f986177e1b95424ba97cda6b6ae0191ba70bcb75172c354541c7742556c5fbe591f33b9624452392412f3859953ac21c50d5a445a34d94d492afbb01a84c844fd582802391f4f4a5d012a8a62079e254363fba52c83a399bb3398f6807e6f03f74f68fc788187be6bcaa5491ff666c98e43c3f860470380768f70b4987c6ea10411ea60fc7e8cba0b1afd72a52713a41a2172804ecb9fb60315e37c544555a8aac8089081c6c2695af8011bd991e1ddc87c841cbe0c0357e04489785222930a5d75b81cde91e5804315bb30bc93294367a4623a0c4a0ec8ddc436c7992b157039879bacbcb590490c28ae7c9142267654291c06a75237b24b8895404cdf32a073c4922c202a087bce07aa5708816818564c68237136c0a98119c2a6244a59051071414425b9230a6113cab28b06a058e67b16b9b3287f001422c276c78aaf608820836c863a1555590bc802a70abda52e4c430c80992745945ebd343277c222836631c652dcc425e1fec6f22383eb78c9b47967e865c6382231b4ff42b94f281c4e9a849477706c339a48ac2c69416d1e51914c751dff0b74cc657a8d9b0d0e21cb2c3a72fa241338b11f529a0ea9cbb8bd310203b29775867f23b7a6ed35890f3014474b51a578110cb1e1d052d2cd03a19fa06f1750279476642752934201c0832b80b552c7a4b4eb1118e2466624588ac1d0148c1c0484352479ea604758012b5d49e885965bf6ec29407a0d9d3f1f08826007a5a3d32062d2a775728c35116642149c2d449367bf894b2bffe5be757d54623b972fdb9093b0f54568b4f6f2e688f86ab2eab1c96249919cedc2369d8d739ab125e0d2ccb82dfebcd90240a545cdfe07511f2 + +# Official test vector 47, seed: "730b65ece22de27d573ce3aea7cb021c415df210d228808d91d4f380070ffcb0778b683c71d4853deb569c822765f2a3" +seed: ff7495b8575b5a98e4fd21fb4c3e58cbb60f14bef21aa74cf8802e3153f14807bdc370460375a778d1a31d01c42b66367ed8d9e8f84551002f552f0e52102b5d +public_key: 90c537fb848ea86c2ba929c7b97456ac4b5c5007b27631aadde902ae1917dba8cf2936427fa22504aa2bca42bdacb21ac9a497eb1cb8a4b096e69294620386abc48f389c7f14380b03b10c614c625427c8cb9962f3d75409d923a56717882169bdab15e4426dfdb26072952255eab0380a88277ccac1d24939c98900d0be4570b3df596aef0a1747b2b0106c31e9aa9164f7745de23bd1cb222178ba13f7c806c0b02ff9898774646417bb2fc3153167c1eb707655c548b63caaf3fb3f37771be2fc972d03bde5286586d406b00902dfa0897785481b95805ab79dac44233af99ed3f53bfd6cc36af1cc79006289563456fb71b54c6e5e894f47d715ba062e010841a9e67abdbacc31dc373ec88ce8eba2f96381edd02fd0b88b47888f5084ac264c755c62a663ca9e30bb2bb8c89dc2ba91ba652fb79008ad91090c0614d6c7c674139ba5d57d26dba05e7c47e2107aac4cc28405a7d0d415e2472f66c40d49e094add494c19175886474b5a6991e355738c66d9178c94bb4c05912bd9d709290a8b562a358814a14c50750d17054273c7587b7ad5e403f231964bb40014fa7121fdb74dc23875a148f0f021a8ceb3cbde6842714cdf1008d85b0af62e65ccda27d9fc2a12e415801bb22a865b861aab5cc3c9093c3164e6b436a3475e5359bb8c241b635c351ec3614f7a225d522f2a0b7b181a1f7a4ccc858014a2222ba5b19767154e27b2667e90aea352ae7d3c68e07b7c4d0482ec38aa226ac4f2b63a8da4be57842a4a65b6e04c2166327be09a30128bcc33c154031b94ee13aa5d60f7708347659b4d73bc500432bf2401861c183c732019576a672d0c10d5c18afe4364e9ccf67d670b29283d0f0b9f91130a0437d7450acb4d76af99aa4ea287a6bfc73fbaa3207f58fccc775a811a7e6a0b7a63bcd87f04f1eea0d57ab7735315324282b4818b8d4346b0ecbcea3ac9c0a7bbc17a955617570a511447a9b8475f7c602135f57255e2412cb6ddb0d22c30159b43b9dd58066d81d77f7a4e263603e193ebf671fa3283c69e71a4ac433297867da2b2b7eca19373a9b4d3897689031e58284ec8779fcc4cb742b8712b11a3d143b02645a99db61bfb19c26a5902f7b3d77302a9ab059350925d8e1a994b586ea777697c389f9cb6e25817e07c5716db9ab63f451dc89a852031bb3352e8ba53643c509ed8590694b6a07340ad0fb2f1788937a0c45cf9a441494ae447c44c6917f2d7b21bdc6b7d3853bd8e33bc7ea75e62535f95096a9d0930cbcc0a210c2f5b81090d20a5d7c0346bb43ebe6b77072859f13a6576c72c0553da80a4ca8f03292d86a98246151960e4b15b758b28e2ad2271c9ca70f92061c8a560be21a2d967c0ae1b0ca446a987bbfd888ce4ccb725b95050d03134f3441f853935255bce8473e88397d5eb4cb8d6acaa6bb8d5f5003a560b08c89ac890b77aa16304f5cc74822764d82823b317572c5bbee018eedab6cd93caa924279ca8932a8858079197d412b7283e084a7fb9dbef26d4530c1b6136619b06fbae495d207a3c326910a5c2ac9c7b919498bef5482532535d2551fee95154b2082a76c0d3b16ced88993697b344cf7be4742a3180c69f6fb589ac17fbd03489b13a0af951ec1d9776efa82cfd0276e58c553b2046b4594c9621e0aeb160d7923bbfa53f7c9c2a4a077d51a6f38473fb6d7a2b2b99c5414c5e646734fc48c56c18d30997d8073afcb822680b321c40696092a7a9f9072cd034523acb15154354d697f27a312348601d0d1170beb4759510330cb0adef4cf31ca82f7f15bc02310f22c92dcbbc059e34771725685955dd5490331e0bd99829692275598a77a310243a6225f392a9f83910afddc172d124cd295288a77ae051031f898b42d792ddfe8c0902944b68043bba48a25c27323f07d4f6a8c6ecc33f13948ad12463e834d23514af69954395a144d1a4df8f526c0331247d16d05e185ddf04a94a92047bcc976bc17f6b7488dd390eaac4b608390e9fac6c2829eed0903d544b3ff08b2c27a779198387a8112e374ce4f5b0f5f898101159462929c5417bf373420811b4ecbc034eb41aec0888a30976428e2a54463072f3c9b55341147c464dc88b55daa1fa7920c22fb6c8225b2ccf47692713ded1c4a76a479bb111e56cf782a6cafe938d47de49bb47e732223b0bd1bee7bf690d1857044eef2aaec +private_key: 3642bf33d87830ec6d87e3ca5e4432a0553fa502878f93281671b93e87cb76763518841148126ccdfb6e8723aec1975cc8a3971e24a8a9149a9957620b0b211c4c3f942a21daa5182c63049bac82959429f2c1b4f4b1204ce35c7c683db5127a89699e23588d194574e603557d811af3104b7f23627dc046ecd6aa633a20054ac997625147a2cb6bfb62e44bc7eca7a019d41ff5ac505870c0dc648e209111ccd5827c750eb676058c6a14267ccb865b3b40da4e2476aff41b9227e18274c96e32966f2eb611fcfb3880159e6f2c62a9565c8e6c3a84bb530a13895f841ff354b798299ad3b68ca32838ea6b3920b3b6f0415b7a750295d33eae09022b8c17d7ac040df6b298d7bfdad78f868cb97d178d5c80b27b69ce03d37f3277661d9b9340f347bc7296d310041c996efa841bddd592fe4b480da657d47bcb4d147c112243f15268340b14ae26742b813934c26be8204ad984863eb44c50c510a5c5872cf334275c5bd2517c55772e9d5020e8093d5f21264929b1c7858b4f8745ed0b2c9bf9671d3c085e80804ad730b8e0865b82a6d6bb1595331a0a05567bd3af6a641918019d9a89b08f227640182fb8c7adc6278473b2b8af4c4c9e6b8f8232215d265f433c7357fa8c91751f6cd08b678240c5da1ebc38ce3f2735d3320713ac4301ea1fdc1990b8909cb718b6344c45a612633376bb9e003656ac347305c3aec055689c696eb01ff62b3a4fd0272b10cd778572667702fa4c2b7ce5305c413d91596904b872a0b051a255af18119d00e1a4654c05259cc16663674365708843c20df18b95d212efab1dd9485dc4426782fac42e258fa0cb8bc3896a507107720246b972c457750bb98ac03c9375820046fa7021af606c9344599ef233de25667592b423e456a659c0389b86b27a0eb4675693c029c489a4daa1b5ecf37afbf80b8fea5cd9d37beadc9fd812428ec68484b8853cc82f019c9a7419115e8ac0972836d42bb459611ba06b82a59592f5440134908f35d182c0a765f9f44b66b293f471222d648989b61b7eb8586e004e7bf789838500c2aa2de031661d4b7c46737772f4a86df60e050164a1a998e996042e22b7db76c3a4575f99199c5851c75f901085b21f6f693b5839557f259194590e84dcbad233bd9b670049d47b67d91616db28dce64ec552712129a2abac23b4922fb4cb6bb3e54f7ddb093c5811a638cc3330a1170c46de338757f445df01aa42e056e6d59daf690d3b4961365a6927db368a5633a4ca087fa74020b0b7884a0afecb5bb3d124276b38eb8c19c7c8afb616a854b444f7f0910ed6c3eef93722c827e80297e7f411b90b41ed430258e091e5ab151d961af1e51fac9aa03172c147d69e84274b3eeb949c8588edac38b400c775849cf162932bdb6f80fabba816bfcaf51bfe9174cfe0191084004486814e938153478728041fa06a78e1916d20465370e55aab5c993ef543c360bd082c7298250678f979904b402de70dc4f9403e805b71955039b539784b2e79173d870363d8b677aa5c823b8980062ca773ba71bfebafca6399b40c8109f4848db6cb154a4846cb9c638c4e8b10149de52667a21d1af419de65c030cc7bc8586c45a615dc346ea4073f4eb131e0607740c73ded62c192a413e955146f86ab9386156b3ca110295ced41977b147ec9e73f934ba396a27b6d6c37d2460e4e15c0af6a090cca7947c0103489c7dd9a56dfe62f5c9692531087fb7b7a75206765f34316378673c52b6279b0db8c8dd74049052aafa5467ac9fb7686cbb904f24afdebaaa8a7928de03c02e35c14e4102b560d8831c62c44154758582bd901ed9c963fc558ed076c107a87f0e49bb2e1585e809ba31788a925588a0c8fbab37b3bd79268eb359982063775abaf9622024aaa9730cff8411c04401cb58a4ee90b83ea547b1fe8ae6c3a93531511298331ffc512ec195f982c39c9394bb0933bbbfb1b46fa0c2dbc120c8acb03953e188a6ee6b2852e79642ea3261c8403b3497b99ba7b25fb99949300dbc9bdcbcbbd72ca935242ae35d27cd66003f22c4918ac412f3304ee92b740c86cb12362df19353438569c16935edc8af7b6091cc97c59996ce174253e9b2612a54dd9399fb11a5d0fa3af913bbc66e1874dc7527381b593966014fba090c537fb848ea86c2ba929c7b97456ac4b5c5007b27631aadde902ae1917dba8cf2936427fa22504aa2bca42bdacb21ac9a497eb1cb8a4b096e69294620386abc48f389c7f14380b03b10c614c625427c8cb9962f3d75409d923a56717882169bdab15e4426dfdb26072952255eab0380a88277ccac1d24939c98900d0be4570b3df596aef0a1747b2b0106c31e9aa9164f7745de23bd1cb222178ba13f7c806c0b02ff9898774646417bb2fc3153167c1eb707655c548b63caaf3fb3f37771be2fc972d03bde5286586d406b00902dfa0897785481b95805ab79dac44233af99ed3f53bfd6cc36af1cc79006289563456fb71b54c6e5e894f47d715ba062e010841a9e67abdbacc31dc373ec88ce8eba2f96381edd02fd0b88b47888f5084ac264c755c62a663ca9e30bb2bb8c89dc2ba91ba652fb79008ad91090c0614d6c7c674139ba5d57d26dba05e7c47e2107aac4cc28405a7d0d415e2472f66c40d49e094add494c19175886474b5a6991e355738c66d9178c94bb4c05912bd9d709290a8b562a358814a14c50750d17054273c7587b7ad5e403f231964bb40014fa7121fdb74dc23875a148f0f021a8ceb3cbde6842714cdf1008d85b0af62e65ccda27d9fc2a12e415801bb22a865b861aab5cc3c9093c3164e6b436a3475e5359bb8c241b635c351ec3614f7a225d522f2a0b7b181a1f7a4ccc858014a2222ba5b19767154e27b2667e90aea352ae7d3c68e07b7c4d0482ec38aa226ac4f2b63a8da4be57842a4a65b6e04c2166327be09a30128bcc33c154031b94ee13aa5d60f7708347659b4d73bc500432bf2401861c183c732019576a672d0c10d5c18afe4364e9ccf67d670b29283d0f0b9f91130a0437d7450acb4d76af99aa4ea287a6bfc73fbaa3207f58fccc775a811a7e6a0b7a63bcd87f04f1eea0d57ab7735315324282b4818b8d4346b0ecbcea3ac9c0a7bbc17a955617570a511447a9b8475f7c602135f57255e2412cb6ddb0d22c30159b43b9dd58066d81d77f7a4e263603e193ebf671fa3283c69e71a4ac433297867da2b2b7eca19373a9b4d3897689031e58284ec8779fcc4cb742b8712b11a3d143b02645a99db61bfb19c26a5902f7b3d77302a9ab059350925d8e1a994b586ea777697c389f9cb6e25817e07c5716db9ab63f451dc89a852031bb3352e8ba53643c509ed8590694b6a07340ad0fb2f1788937a0c45cf9a441494ae447c44c6917f2d7b21bdc6b7d3853bd8e33bc7ea75e62535f95096a9d0930cbcc0a210c2f5b81090d20a5d7c0346bb43ebe6b77072859f13a6576c72c0553da80a4ca8f03292d86a98246151960e4b15b758b28e2ad2271c9ca70f92061c8a560be21a2d967c0ae1b0ca446a987bbfd888ce4ccb725b95050d03134f3441f853935255bce8473e88397d5eb4cb8d6acaa6bb8d5f5003a560b08c89ac890b77aa16304f5cc74822764d82823b317572c5bbee018eedab6cd93caa924279ca8932a8858079197d412b7283e084a7fb9dbef26d4530c1b6136619b06fbae495d207a3c326910a5c2ac9c7b919498bef5482532535d2551fee95154b2082a76c0d3b16ced88993697b344cf7be4742a3180c69f6fb589ac17fbd03489b13a0af951ec1d9776efa82cfd0276e58c553b2046b4594c9621e0aeb160d7923bbfa53f7c9c2a4a077d51a6f38473fb6d7a2b2b99c5414c5e646734fc48c56c18d30997d8073afcb822680b321c40696092a7a9f9072cd034523acb15154354d697f27a312348601d0d1170beb4759510330cb0adef4cf31ca82f7f15bc02310f22c92dcbbc059e34771725685955dd5490331e0bd99829692275598a77a310243a6225f392a9f83910afddc172d124cd295288a77ae051031f898b42d792ddfe8c0902944b68043bba48a25c27323f07d4f6a8c6ecc33f13948ad12463e834d23514af69954395a144d1a4df8f526c0331247d16d05e185ddf04a94a92047bcc976bc17f6b7488dd390eaac4b608390e9fac6c2829eed0903d544b3ff08b2c27a779198387a8112e374ce4f5b0f5f898101159462929c5417bf373420811b4ecbc034eb41aec0888a30976428e2a54463072f3c9b55341147c464dc88b55daa1fa7920c22fb6c8225b2ccf47692713ded1c4a76a479bb111e56cf782a6cafe938d47de49bb47e732223b0bd1bee7bf690d1857044eef2aaecfcda92e6bdb853f01617133d65b67c0d6cc83710c053a18263aa91dbdbef7b85bdc370460375a778d1a31d01c42b66367ed8d9e8f84551002f552f0e52102b5d + +# Official test vector 48, seed: "5522a5a891a9a9b5514f4556afd8df40b9cec63a01492f0cb8a1db073a285a963e4a9ff2376c88662f7d8d241f8acf17" +seed: bdc3fba1c32751139fc45bacffb3ea97f26573d804a5f27a459293d95190ed8efd5a08f656a6eb8cd20679930a31caa6a6331c4b133a6838c223ef9f769f6246 +public_key: 12e4c27fd191ab43b4aa8a66c4326e681cbe1207bc2d5aac1ac59ef0a8aac0c8b91f7c23ac35abf566c75ad3b01d6b1dfbc29db4a334b44c10fc25808f9b8acdb4a2ba67528fba8ee942a895d5544857473459763e92174dc640bf284908023146fb553b1b8b1e99a7446c5320ca17eb6bc497a330ded7b1016a1c28d23964f24f2188b2d7ebb2bbe954c9d9271baa7e429c02dab991dffa49410ba6ab20829ec41b03b8ba8756b5cffc640e928b24361f0f007226f2b5315a8bdf8a10aa88581ce5a140588b69b531f5112610c5306fe41d4c018302dac1dbf69863b6bf99d892072591a0168decc69f89823999095f256c52c6336acb063bd741551bb855678c4e8bf90191a38c2fc641957312ee758e73d88d8c8937b9c6912c59ca13854a4209924db71fd8b547a076a340560155122298e91328a71773e1cf117920e5faa8fbd847fdd027f734c06bec0bf479b97cc11d626122d1049e96c7643a6b323aa93e10521460c7193d7c85a1a8969dd0b0835b64ade28df777a1c70646b8e55578ba9da6d82a96b5bbca1b2e9346775d24b987535882468b3e9263a1c74288695722142d9ba23fd747383832b2a3b6720b21cfb5f00a178c51a878992d666872685cb1f346c77b86a0174ac955b06df96ba094101330958452074c57377f520bf0766881752d70c0a778415f9bd3b5d276100f00ad563735cce0952354260c153c3ba227181a21b9f8166dc0aa42acc241f6051624b88d1659a2a81f9cf92ce82c76dadc27bc3b018f953a5af66ee21401c02a4e3b8b4188a36be3818ccb82686cc21d50614f1f000721f8445323b4920b3d929c1362d91ef948371b531096186034d61f0401c09679c54c5a993ce85137f15f50466bace29512e260f990764c31648d6649d23c800750a08f759fa84258515c4625b856eb368d917c36768a8a1471a376ab367aab46295707e94080bce47dd4633c2b50ce0b19bf47d4a68c3519da21c205b0c9128606ef8a7405ac525a12b0c613c7ae96aca34743ca9679bf078d5d016405f336f6088a9652204154648e4b3f6872929f02670c7962f4b08bdda9beb2a33a2babcef40cc4de288460d0188fc29ca85b212eb40f7b158aa4a38710e0608eb150fa5252860058ccd822618961cf5c18a01bcb2eb92dda84597fe9b345e06d14a597917a4748949ce5f29e60a7ab29740242166c5a651501010bbbc73926a7c4d0dc6aa415240e0c0769774055f9882aa4330dac1d8500747bd5264bb7625c2ab58e7917cd122858135ec09a3f0128837669bb37911903854d57da6957d70407c752a20951535503847b17c536a69ac09a84ca64633a4fb9c26221296190b27c03781729456f6653639fc036fe17c4b66b390b2204a1361555323dd307572b2caf24148dfea74eef05880205c164da71980974240b2167b3c3200745ce778a4cab786a0cbb132188158c3111707058884358db6ef3d04480d7ba058c7e52e4052c1898e2918d98590716a80bd9a3a4c3d53cd8111005709e708b04c6d18bb1577219a39d26a496582384f1126fe491a2dab7b8adb4a07563c687c4a6056455113c6fe9b7bd30cb7fbed2839a93a584c76af5c1422dca809cc623079ab65cb146a3011c38c1a6f3db134b72583ab9331d418c7ab513d77b91a612053f217d406babaf4170607a1979ea637f8875154561f69870fb1682a62052fa36a21bf94fb4f24ea54c1658d8bea4e2813707981366a8d9655400db440db8c27af57ebdaa8ed897c7594712e6881c81f5b79557834e53c9b537ab69942830fa60a0c8bc7518192e52396ee15d945b9f8df019f8f32513817117834a9af58ff761a1830798edd48fb571be338b43140c44d17b272db6aeebb0cab160342b49cbe2b47a6a5006b5cac09d763f168c6a5f329b7d1b87dde69542a4437b8c426890b4a5487ab43a98ef94667efc881a943b33b42c776b3f8af853fd59c2d3031fbcf541247100d22219e67094ba89791186bc8b7b536fb6438aba5275d234adc5a9ff129fa7d1b5c5757483f02980fa40882aa0c72c0ef233b0c2931f1e15cb7d528b471c50903256e54a87f8c16f02b3bb904133bf60136d603bc57c503420a8b6701aea4a3b4052334f75bf820c2ed9890bcb812b20d9031c269af9598acdeb8a52bfa7cb804627acfa20285753264f3df670dc445647c881e112b71095f10934 +private_key: 58b513bc1a5f348c2e22a0a8c99bc5178a736854b211c6b4e191b497f288755843e306c1527c87ac5393c98c77669a29299c660bfc0d67453de33cc838d2c0e2d561e54600f89951f7543a42e0891d846f347a0e2fd956e29072d7b1565be798d3a295321cca8209aa439b5374602da08792d6c814fe3b0398a2743cd258a8e505be98be9c5c806c7007abbbcec5caa7151363789b22d6210e519649c34c56ab5b7a8318944370c30d4c16b226490d738282e63881e0b163e11b4818083cfc7593b068eb7c8711ab06553164382a87a683267957485df51dd5f5b0135bbd09e0be01594b3a134761e3a7efb567c4554b0d4b6ddabcc50c036144b1b88484a19ab8a94e168cff620330647dee43b673664a01407334883cbd6379a61a1c7b755d28c80921416edec02ca326c8fae52b4495b991335d253387682716f283675ae96ef431b98a821dda681f35c71f5da09ffdfa471d915574f23391072c9d8b50b9e06bd91055395958bb911a399c8ae9eb2884154cb7d59aa36a4d05b5887a23962260a057257e7e815859f53c85059760857882ab38fd8cb7a2514d2745867fb348b4f1ab4e8c0f200261e68474dd45394ce01c1e4a07799ca7dbfb5b3c51c7c1500edc768bc389499427955868c21bd3a94c3694d588700da5641b242edc152f1c1c90e3ecadcb04b8512342a76027c98a6af96a0958f775abd890fa586d81497013e062af9aa7e7734017807d89076a102bc46924b854d32476b1b6ac2cc922f0afefc6c90c6814a1819e96b429991b1250817a9187755805956d28a7cccb043469896d326df5477699ca89081cb44cc492ebc6671f3108f0795cde1422d3fa8dffa15e3d6040300b462f57986b355d7fb12454bac56d66aca19240c70445c166cda05a8d5a0763034387b50c32df573e61c921cca5b26ee3095b0739cb7cab1756a097b4c5a24555bc4a84681772b1ecca530a41c7db1f2c49c2aaca0ee363ca9a29b1040a5c31c608c235543d36abc90a36d8110badf3b10af267f6cb11ebc7c0224175d2d82a0df8485a7a754319952da50f48563937517fd4032935830b47f907a9489011b93a0e9a3d999b3d13416be914a4d9a4196ae573d73a4bf1099dc3c19dcd2b6cad5999a71a7e25717729495597997112f23f38d54808bb0b86c2558c83bc5a290b0ddb26a9493abfac76e9d25fbc888928417f5c2a1a1e34a355343a45c4309822cd83bc55362a7b8ee521fc816bfe22afc047196f87b9eb9092700723d3611dc5a53e8f9108e5064a9183aaa252ae2024b33ad93ad1c96796603a8538c7f1a3af202024ce12cb4025192744bafa338f325c10e1544e18a92509639bb62c4372ebc39965cab0d1317f91bf1b46a4523bbca018526cd681a3082cdeccce960c6d2e5b317e2568b2f4a25a8cbd1844b1dcfc32c0160f12f126f0caa3e6e37d95db68deebccde353d7ccc22e204bd8b016f9dc1bca5c8439a4cce98ebbfae4111a8776b09bc325599cdae20c354640faee43c07911e08348a17e75f483a3751237f1eb9a43a49702654a4a0f21c3d6b591d3b4add7c3320d8083c223e889080ab6b364118cdd1d42038182ce07bcd7adb2deb2531a2536d2126460227604740cf54bc513c918058ca527b48b0ec1c6d6cd4549b5c18d50a477a80cde6e87efad1284a71869d46b47f54465b9669e1ec5ed18505bd8c49bec69abee2a2c69c684db270e5a7a69846738f2a2416148098174c038964c8149f56097caf8840fca26d4f47a68d333761db2109372778f56aa0003f402b3237b079f3a8ac031a41eed50c218673b05a5757d29196a653a47b689ac25a2800c79ca20bbdb02ec6b430456435df3b7d81089cc986bdb246193bd1a153796ca5f1099d2a8c23810cf8467517085ef79b7bdfa7ba0c1b180b8312fba0999f87c8bdd518b5654075950cd27861ad55724766664d8a3468a8139201cfc9a48fcfd0839dc41b0d61798ee6180bf33335c78faa7a6e1a31262521ba7fd79a5ab0854c6a2f14265e418212324817cba46ee849713fbac9bc11a8de51376ac02c35f45e21f642732cc132745c5dd1cd1e45a31b5c9abc56055a8510f5fa71eb56c89d7685ceb4afe3255c734a59dcc2b5a9910db6ebbeaf4b110bda0270fb568c3c6a59130fe6390d12e4c27fd191ab43b4aa8a66c4326e681cbe1207bc2d5aac1ac59ef0a8aac0c8b91f7c23ac35abf566c75ad3b01d6b1dfbc29db4a334b44c10fc25808f9b8acdb4a2ba67528fba8ee942a895d5544857473459763e92174dc640bf284908023146fb553b1b8b1e99a7446c5320ca17eb6bc497a330ded7b1016a1c28d23964f24f2188b2d7ebb2bbe954c9d9271baa7e429c02dab991dffa49410ba6ab20829ec41b03b8ba8756b5cffc640e928b24361f0f007226f2b5315a8bdf8a10aa88581ce5a140588b69b531f5112610c5306fe41d4c018302dac1dbf69863b6bf99d892072591a0168decc69f89823999095f256c52c6336acb063bd741551bb855678c4e8bf90191a38c2fc641957312ee758e73d88d8c8937b9c6912c59ca13854a4209924db71fd8b547a076a340560155122298e91328a71773e1cf117920e5faa8fbd847fdd027f734c06bec0bf479b97cc11d626122d1049e96c7643a6b323aa93e10521460c7193d7c85a1a8969dd0b0835b64ade28df777a1c70646b8e55578ba9da6d82a96b5bbca1b2e9346775d24b987535882468b3e9263a1c74288695722142d9ba23fd747383832b2a3b6720b21cfb5f00a178c51a878992d666872685cb1f346c77b86a0174ac955b06df96ba094101330958452074c57377f520bf0766881752d70c0a778415f9bd3b5d276100f00ad563735cce0952354260c153c3ba227181a21b9f8166dc0aa42acc241f6051624b88d1659a2a81f9cf92ce82c76dadc27bc3b018f953a5af66ee21401c02a4e3b8b4188a36be3818ccb82686cc21d50614f1f000721f8445323b4920b3d929c1362d91ef948371b531096186034d61f0401c09679c54c5a993ce85137f15f50466bace29512e260f990764c31648d6649d23c800750a08f759fa84258515c4625b856eb368d917c36768a8a1471a376ab367aab46295707e94080bce47dd4633c2b50ce0b19bf47d4a68c3519da21c205b0c9128606ef8a7405ac525a12b0c613c7ae96aca34743ca9679bf078d5d016405f336f6088a9652204154648e4b3f6872929f02670c7962f4b08bdda9beb2a33a2babcef40cc4de288460d0188fc29ca85b212eb40f7b158aa4a38710e0608eb150fa5252860058ccd822618961cf5c18a01bcb2eb92dda84597fe9b345e06d14a597917a4748949ce5f29e60a7ab29740242166c5a651501010bbbc73926a7c4d0dc6aa415240e0c0769774055f9882aa4330dac1d8500747bd5264bb7625c2ab58e7917cd122858135ec09a3f0128837669bb37911903854d57da6957d70407c752a20951535503847b17c536a69ac09a84ca64633a4fb9c26221296190b27c03781729456f6653639fc036fe17c4b66b390b2204a1361555323dd307572b2caf24148dfea74eef05880205c164da71980974240b2167b3c3200745ce778a4cab786a0cbb132188158c3111707058884358db6ef3d04480d7ba058c7e52e4052c1898e2918d98590716a80bd9a3a4c3d53cd8111005709e708b04c6d18bb1577219a39d26a496582384f1126fe491a2dab7b8adb4a07563c687c4a6056455113c6fe9b7bd30cb7fbed2839a93a584c76af5c1422dca809cc623079ab65cb146a3011c38c1a6f3db134b72583ab9331d418c7ab513d77b91a612053f217d406babaf4170607a1979ea637f8875154561f69870fb1682a62052fa36a21bf94fb4f24ea54c1658d8bea4e2813707981366a8d9655400db440db8c27af57ebdaa8ed897c7594712e6881c81f5b79557834e53c9b537ab69942830fa60a0c8bc7518192e52396ee15d945b9f8df019f8f32513817117834a9af58ff761a1830798edd48fb571be338b43140c44d17b272db6aeebb0cab160342b49cbe2b47a6a5006b5cac09d763f168c6a5f329b7d1b87dde69542a4437b8c426890b4a5487ab43a98ef94667efc881a943b33b42c776b3f8af853fd59c2d3031fbcf541247100d22219e67094ba89791186bc8b7b536fb6438aba5275d234adc5a9ff129fa7d1b5c5757483f02980fa40882aa0c72c0ef233b0c2931f1e15cb7d528b471c50903256e54a87f8c16f02b3bb904133bf60136d603bc57c503420a8b6701aea4a3b4052334f75bf820c2ed9890bcb812b20d9031c269af9598acdeb8a52bfa7cb804627acfa20285753264f3df670dc445647c881e112b71095f109342b8799c6382723886f5b8371ee58a35fbb48022d9c107ba6fb6dc5fdbd4ff573fd5a08f656a6eb8cd20679930a31caa6a6331c4b133a6838c223ef9f769f6246 + +# Official test vector 49, seed: "1853e72329353b3f89ae6a1b1ef700da8ed3c10d19f9e61ee9252e28ebb0e15802ee43083a12a0b7527088832605e3ab" +seed: 447f6076a627bbc5ad7773fbfeb14b4ba9ac43a0f8b99fb6dcd5e452aa3c47ec20a7237801f470fcc2bd9fd7bea8322859b850f7882d362947432913dd068c01 +public_key: 96f73135fa51010a83491b407571126d85002a60cccceb5393b459cb39b4dcf175b2134cf515c06b38cb0ea33d8c34a7283b99b6d0c9e90825159cbf4bc2a1c0f131580557f243184bbc7498b39266f669fc161150482de480ab196ba61dc526f8a46a2ae3336a7abca9e2743fd654e965b3b33ca0b9cbc8c96095d78a971a7277496a8c123967e8c204765a864890b762d34e83570a8dec5cd25333276555e7644eeb5ccf8004579c357481000ae9a930a7313468d3a8b6d5b4da4a558a7c1318da670dec758c98c5048144843096c2b781d73a9f215c2ca0481ea5aca259997c8479256841507717b7dd01cfe1755f8ac2bf1008c2c61b7bd13810787185cdf16a17c2cf00bab7eab737a641cc12ea6d8bc802e0661730628194c40a7865a3587cc2f5b0ac1d328307c55388970b96c4969a533e04b425e528c713d41821ca6cf1f5bc74e64859c49b914563ad193c626c6dc520143a755132260d5940c76e20a7f07987fa7c1a4d1283bd700c9759871f973fa6d94fd88015cffb046555b36559420bcb98ce617169465770135b15612a9884586d0232d44606632c50a9d5beb3697669c9940e1739508c360505248f501dbbbabf70e7cffb24652b782de5f4a310a7767826bc73886e60e51230068dcfdb2b3ef246f7701d65813e54d78ddbc34cc9bca025914883364c60576a5e0c5a863a17a9872b818c070647170cc46f44880d4ff46d68c4694442433c823c0ab39656b715e0443e8eab14a990c42a031ebefa6cfd54c32fe4521e218396d53c5554c60b93cf2f1cbb0062c6101686e5738896621e44b32449c297d968b16c80ac7491279dab0f84749842195aa3dabbaddc2457fc8b854752d33cb1a5499dd53725bf34bf34a68457e57e4b270fe0f07323275fb99b78aa90af27480b6440217b01867a1b7a5a5885fbcb931c524395cb11a406a492c4251f9c09e14a45e2b86a98c72f1532664879a2d5557fe9db6bcb2ab6197892e5686b2e1ab35a3434a77a65ebb6189aa00e19fbb045a03fb767866184c5c2e2b155f465bc7a135ab25cc5415b0a42aa17595a32e2a370317414913278c18837f346c3a54be5722520315332b2b43ed4089b427cc8e24f10f17610e40882b4c724c48b6315aa6f0c64a4032e4be75bb6b0702a2cb7a11cc6aa14bccfe91af25642513425ca475fd7e7c387214294a36fff09bb1388a5322910b9906491bc923a2644259086bc5131e5d67794d91f65b24a0da06ceeb63239456e6c3b1cf4fa04165879b5858bf60664aaeb45b3a238b1a926489a2d395473d3a5173fb37a51fcb5ba0c9cc3eb01debc383260b4f5033bee258f66a504e64a74fafcbd1a46076ea00a02246eae52ba6591a8ced21b58971f289847c508768dbba5ab1921c14982c9525ab4b64285723954d33c8a35396db137c0db48a39432da0abc3857c5369b236bc03ef562a8a5e4211986a385b8ab4d1745742411a9712256636e62976f99a72d75c654f8574737b6ad34c129a2eac22fe166b2682840f7043d4339bf699b68d51ecc32974c161136272f9012219bac6bfa8950c6016207dc6566d20b916974743290f0a52b8be51c9f3c239e8b6842278417a05dc789bc43fa1ee0671a51ba3301246ba780ab71295cbd20ada7a07e5593a3933604ef972a711349a0678a60d2af2434b17ee940c067bd89496c90d4b9903b9d146a49c36138dabaa405499ecdc02f791562a5d446fb358702b2a5eaec93b7f4756762b3c17b0e8d48ceb5d5244965168fd9c3e6495d1fd578ba2c168805897cd351202059b5a4b96687465741b077677583ca7411c4331583308da00ab5045ec5943beb2800b30978c31031675a84dbfcbe6d7b27b2da65152c692fb8727a485b9641888b1b36a25491ac76045792278125b0a3735f3e759901507ca4a2aa12dcbccf3c35c68873518a4fc778201f0b960c7b551f038c6201378ee101948629dae0364e38ad079320d2cc35bfbc8ae7cc446526447d60b19a36519daa8331a45f1e4308d564979a5179073130594cc5fc07a1fb6b5966277511544611e018f3f8b76567add2c94a0da8502063c66c54c3a50644e43b81a93c7cf0409b505c77f5d06d34432bec389a137b6fb9f18da05426d03477ff0b8185327c37f449c8f6398680c78ef7d26c51bba9665cf58b72cdfb115bcc2a0715b5b4f40dd01c7a0585bbae73 +private_key: 4ccb897e841627f45dbaa7b00b670c7bb17786a89a4284047a2527c9464307c2b1d4072f357a09df72a768b752e8794218f94bf07a6d288507fad04380b13e397c80ce956e3e96a604d668530b20759438a83b35219a6cf39a44d2cb697453265ba04784501bd310560e7cb693a06944cc2ec1fc1201e5a105b239d024a41ac50103335c170684c9f03727185858506ba29c8d8c19a150bcc6d8dacc1054bd7ab4c054d390ff8484861c8c4b823d3c3b11e31cb2e4dbbc7592ca95e983aee58ef4b6ca6227a2d024ba7b383b3fa752d6c9be8cc91e6905619ea17c0a1b24d2586e91e590ba51c1672442bc9c7af0e6bece484a3b96a4d76467bfe4b199d22646fb86c74864b39a60d8ec41e7b5adc791c1fc563ff2e14ccb8228f1944cbf1aa2f4258d6fbc5ea7c46282d109b8a87cfdfc576d74263be3c866311a2ebb1ad5628e14975ea8da31b7622245330788c340e0b1094ad8c2a1a1ba14663d749013742235bbbb6045733e7e6519cd1c8593e1baad83a50003b73900bd69e6cdaee53db7a7684afa3b4566375b693c1410aab368015e12517cb04b3eb6b824767724ec7718a403e5e7178c01190c289811b716c79a846133243ff383ede452f15b7912f0b763c08de8d0a2c08b67b3b41f39b63bc7bb7601a0ac7fc03dd4a656dfc89179c34f05976be42896ffb49759222f259895dd433ed73b4e77a715127a3876849e1b039cb8a71ba4f2cc640b93986974a46c15974b7ef3b3745c3893b5327848590ac2dc44b5e032591b2acbb055f2d336abc062a1ea11388432ab2a7e402a62a4ac1ac5503ffbca57f2505a951c0ef2b2bfd36ac5e4a0ae116c189aaa95202cc280e08dfde77952bc6566513878c4077bd45fdb87520478073501818d2271324820ea038f79059c871a1b19625fb60a9e7c806dbc444fa8261c1540c890d315b1ba2bc4857445a539af555d6ce710aac7b9dc15a149d1bb356b2321112c6c530a63a9ae1d1b59dacc92e9f919f990509e7a66dd41cdedeb8252d692e3dac47db872ec36bc4513741e31a65376abe99a6d82e6110e2a5acf501e3b785088a4298639144560c6d07c3c39c9364ca56dae571abfb13bd805cfa19054e8403493f2cce7121836d01a83561d734aae163481eaf2ce8519bfbd6aaa1b29ad09f8705e8582ade2774161a2f47b03b2c995eecb024622b287e84500369ce1a71c77483d1c30653a7657f953b0503192c97528b4d92856696d256bba012bcfdbd8c3256c9969819268c40944a9015750cfc255411c196147470743609356e7ca800c2635615337b1383267bb339934c3f68dda85bb582c7bd7131f6041bb21f14aa0b25df46bcf1c6b42b1db5b604c17efd00f6b23c85a3c054c600f9c40c21d1810f6699bb8620146a4c2466cab86b1659313290d9c182da0555e417009b3ae20f6cf1fa128d86307ca75c0046c269df20f0c98342f39af8c00918f93550c668f9e6c4423f559350185494c5663ab81bce72919521baaa81680e19e38154c4e0809e64c184a9396e1dc813de849d13a7d6922cb41b2346dac86f06996f8a71d3fd09b44ca60233c9229750263e88c10264694ac305c7390e2b63d8076863865047c80088894916b54756278c6f9c0730f4abacb129842d1610db66892c52616f62cc3e26f93e22b736ca9f43c16d3826f5e324150416a8c554874d094493a135111afa6d45cf1f58a7177b242fa9e9b185eec54659c887005b702db26a05cf53dcfac6179342abbb707ea449912d9021cdc5716bb469e00baecf754cea89b36eb6b1c130f5d439b4ad903f09752effa555f182fb1c578855a44d4f9048479ae4551b61d34048ff53d911a51c547999af5aa76500ff4b8434f2043fb583e5fc5af9c73584f5065f1e465a794490a1a296bc8bd43c647e4a3283b24c4ba3301b40c462dbc20f28bbb17c1a0706a5fa084268298899f0a0fa4d36c74952fbdca323bb3adda17944ce5898b9027d876a457d066819ab43d32a9a04b2ee3378c23e6cbd25bb2b317767866406d374bcf327b1045cb96f656fae8228295156ce26dc2770ef48322972668c5c746deb4b57b37040e9aa732c79a238227723576ef822e95a6c80e6151f6523fe6db352dda9f7f613a3601b6d61719a21c3696e4c9f80500fc918d96f73135fa51010a83491b407571126d85002a60cccceb5393b459cb39b4dcf175b2134cf515c06b38cb0ea33d8c34a7283b99b6d0c9e90825159cbf4bc2a1c0f131580557f243184bbc7498b39266f669fc161150482de480ab196ba61dc526f8a46a2ae3336a7abca9e2743fd654e965b3b33ca0b9cbc8c96095d78a971a7277496a8c123967e8c204765a864890b762d34e83570a8dec5cd25333276555e7644eeb5ccf8004579c357481000ae9a930a7313468d3a8b6d5b4da4a558a7c1318da670dec758c98c5048144843096c2b781d73a9f215c2ca0481ea5aca259997c8479256841507717b7dd01cfe1755f8ac2bf1008c2c61b7bd13810787185cdf16a17c2cf00bab7eab737a641cc12ea6d8bc802e0661730628194c40a7865a3587cc2f5b0ac1d328307c55388970b96c4969a533e04b425e528c713d41821ca6cf1f5bc74e64859c49b914563ad193c626c6dc520143a755132260d5940c76e20a7f07987fa7c1a4d1283bd700c9759871f973fa6d94fd88015cffb046555b36559420bcb98ce617169465770135b15612a9884586d0232d44606632c50a9d5beb3697669c9940e1739508c360505248f501dbbbabf70e7cffb24652b782de5f4a310a7767826bc73886e60e51230068dcfdb2b3ef246f7701d65813e54d78ddbc34cc9bca025914883364c60576a5e0c5a863a17a9872b818c070647170cc46f44880d4ff46d68c4694442433c823c0ab39656b715e0443e8eab14a990c42a031ebefa6cfd54c32fe4521e218396d53c5554c60b93cf2f1cbb0062c6101686e5738896621e44b32449c297d968b16c80ac7491279dab0f84749842195aa3dabbaddc2457fc8b854752d33cb1a5499dd53725bf34bf34a68457e57e4b270fe0f07323275fb99b78aa90af27480b6440217b01867a1b7a5a5885fbcb931c524395cb11a406a492c4251f9c09e14a45e2b86a98c72f1532664879a2d5557fe9db6bcb2ab6197892e5686b2e1ab35a3434a77a65ebb6189aa00e19fbb045a03fb767866184c5c2e2b155f465bc7a135ab25cc5415b0a42aa17595a32e2a370317414913278c18837f346c3a54be5722520315332b2b43ed4089b427cc8e24f10f17610e40882b4c724c48b6315aa6f0c64a4032e4be75bb6b0702a2cb7a11cc6aa14bccfe91af25642513425ca475fd7e7c387214294a36fff09bb1388a5322910b9906491bc923a2644259086bc5131e5d67794d91f65b24a0da06ceeb63239456e6c3b1cf4fa04165879b5858bf60664aaeb45b3a238b1a926489a2d395473d3a5173fb37a51fcb5ba0c9cc3eb01debc383260b4f5033bee258f66a504e64a74fafcbd1a46076ea00a02246eae52ba6591a8ced21b58971f289847c508768dbba5ab1921c14982c9525ab4b64285723954d33c8a35396db137c0db48a39432da0abc3857c5369b236bc03ef562a8a5e4211986a385b8ab4d1745742411a9712256636e62976f99a72d75c654f8574737b6ad34c129a2eac22fe166b2682840f7043d4339bf699b68d51ecc32974c161136272f9012219bac6bfa8950c6016207dc6566d20b916974743290f0a52b8be51c9f3c239e8b6842278417a05dc789bc43fa1ee0671a51ba3301246ba780ab71295cbd20ada7a07e5593a3933604ef972a711349a0678a60d2af2434b17ee940c067bd89496c90d4b9903b9d146a49c36138dabaa405499ecdc02f791562a5d446fb358702b2a5eaec93b7f4756762b3c17b0e8d48ceb5d5244965168fd9c3e6495d1fd578ba2c168805897cd351202059b5a4b96687465741b077677583ca7411c4331583308da00ab5045ec5943beb2800b30978c31031675a84dbfcbe6d7b27b2da65152c692fb8727a485b9641888b1b36a25491ac76045792278125b0a3735f3e759901507ca4a2aa12dcbccf3c35c68873518a4fc778201f0b960c7b551f038c6201378ee101948629dae0364e38ad079320d2cc35bfbc8ae7cc446526447d60b19a36519daa8331a45f1e4308d564979a5179073130594cc5fc07a1fb6b5966277511544611e018f3f8b76567add2c94a0da8502063c66c54c3a50644e43b81a93c7cf0409b505c77f5d06d34432bec389a137b6fb9f18da05426d03477ff0b8185327c37f449c8f6398680c78ef7d26c51bba9665cf58b72cdfb115bcc2a0715b5b4f40dd01c7a0585bbae739590cca5e4b82099b66c7175c5f858851eaca730fd0c55edf9ae451e07bd366d20a7237801f470fcc2bd9fd7bea8322859b850f7882d362947432913dd068c01 + +# Official test vector 50, seed: "027c3d5847ed4470931141104f25b19ae76117cbb64b224ee424ffb782e9a0e988839e0bded0df666fe8e5fcbb5dbc09" +seed: 2d5df64d62cb07fe630310bb801c658dbf3d97993e68626745de39d37fbfc2b27b534537addaba4ecf14f02ab317d36cb9f0f50222ced7cf029dff8a0d3d2fd9 +public_key: 3b37800c878b5adbbaef794f4f24abfeaa40eb1c5763fa55b7369e5be8754beba6be9319cc3a482a53ba93c417bc9a5a3030cb2a247177eb11b63a672e0039fe71735ca9cea99168d1634df2737b45324034492e1d3c74f10239564b23e39585734c86d98118dbc944dec28869ca8be7e17b39bcb0b0e34e257bc9ba42cc782078945094eb1336e516c62b00871d12c6019700b478b5db43ac419b2c7a50442d9458ba4b853d5a29ca946d64b6a6e6cb3485439abd4a9cf34b5921242ddf3611289a72efac4101b208cb7598894a9ef1ec38e34a58b2c071b3e6738138bbaf416f246072ead83b354a0832b98b551b7210095fe9323e1f75bb99905e5bd961cd778d32c1be94512a7893c062f6a66553152d1c820b8825c25938c0348a3d2206897ab903e6472193b5c2aa3f1bfb22bce88bf3723eaa8292d5446546865218d5827a5ba0da5354e2f6c81eb96cf0f28efae54935138273447a953aadf9757319e03a6ad19d7e613c2cdc7f5a3aa1891368399ab5c5337881c782bec48f9161774686204027b6fd895ed1b800db68c2d9d529156b0a8db90f107964d8f5c860737db2a3375df20b7bbc7f1ea57ab6e2a2eb44b5f8e6980d5233a0791350f4ac23210a4bbaa928273294691b7c441edac04909472e8f6714e99bb7de1076a121576eeb1d419122d4366023bb2fd66937ed940566ab07d7b480b330937c341106c3bc01f3c26eb7388ce7404222bccd7cc42e8a56909239a2968f2da3cea3c6695cbc909ee481b4c619f1e7ae6750b4d8f691d70490134ba02cfc97327c9f14db4bbfca7b4589431e0b8fb8dc61658110dcb675dd1bb46db49605c66534ca53d918aee579557e82c733a3841a7338f9947d92d4379b3a2d47469166bbc20ecc4de2f7c768a0ba4dd788cebac30eccbdfa11ccbff61328f92739e12160b83369d8466421374380a1a2c8bfd701a869b49d09644266d300493badff092390e894102028768a4592e96306130550291ecdaab48c711e8a1822cd278b80357856a739174b3da66795fa8375333554fc92298dd92b3c962bad035424f418b9b626d32b5383005564b8cbad0915a977b1c95710ae490bfd158a2c780e14c85ef92a02a2601c3538c1297772d1045bc4811e4e7893310413b4121201eba6c4db8658378fa3a6b9b919c9247c40ef39a7d564bf13a6c8ec575fc3b58f42426ae1a4944cd638bcf8336504577c65a7b75b06649802bf898fc3337ea3f783bd58bc85e33c51c91412c09d99c310ab9802ddeb4e977a640eb05a6e01984186b62f3237230b33cc4721d984382d003a4472496c163a0c23aa7527a7a98b45260794c109c3ef645fd352b778f06c6de40ae1aac577698edc053e951931e88b75619a2e3a795d9d7a015fc39978ba6832da41dfc1aa36d53351321107d33d00d934ce079f53c1ad114b622ef09fdb70888a861e8b9334610a9c2a5614325b9265219dadfb7eec92b472c87c0f0181e73c580b9ca8564bc1e3b9b70528a30d0c54bbf48b3001c46b536c51e15c4d0844fe81bc035351d919212c699a455b7f0900121a77360f4aaf09443e9031ba9286c0ef18a72a0c6afb2b380452379fc14dde6a20cae7c703b8c367bbbf4ea43df773bd6a3a4c051caeeb66a236244f7bf5a837731655a73bf6e7a3413459cbac0dde329e59fc9521fc2009e480d82711496a5871f33d0378223243137486504a209d9012574b10561fc04deed84999baa3a936a9b1234ac4c4afe451042f828cf40c49e632c6153684448154a023684af08ce13b204ac025991c5e44b63201073f22a50c935b9bc1c488aa8a704bc178ab0a752595cfe050b341a295f9b851b67a3c09010ecf297791c746ba9247df2a1be5a82cc8f904e1553b31d53710b0b0b7372b8e9c0b7c15636097316d46587e07753ba05e03f7cb3c6c78870a7ab21ca99db30217245a29fccc3ed80364ec661ea93194d472813a3cb0203b223b909c5774f2dca50e8a9753e36c33d92c278a52122a72fe389f0f962ce5d3a1d9f5c07000919e4761a07282e016854579b1c2e7c608630c6b2a6a1bd96c71392b9ef15e04f7bcee414cf5d9a6ff701c4d2586506248f4bb6bd4ea4a45fa79fd92aecdecbf20d7ad8534673832a0d6ca13c561a446aaa23539624487767e4a195dce0e2bc6a3fd1a73e918f297aa031fcd8c14925529ed33b83ae8e7ab +private_key: ea9b6cf63a18d0045a6aac4003930bd833a2109bc026caa6b9a38261ecb70f9992ee3a47bb4335eb80314e699734098178c25f924444714a9348b980ac7699111856623c9d9f2b4f7da5cfd47970a149c3bb882f84146e7b8562a549ad16e447a7c154b2eccb38020b44c6119ce9663d34a646d6c31cf296f5b65ccb055cada93c272ac018902c1ec93c907bac9b7790cf5b2c129738e573c5d84734ae095801863b654b740fc216edd2064c230e6266454d064adc932428e6944c2a7951268f4310209cdba48262036921bbd35c71d8728e46b291f9e865873316d9c0525c702841c3acf3252bb36020d18238d36b245c08ac1e8a28b75c5b29a810d3c6087ed058cea97aadc75f28bc92bff3614dc04c825716f79b363e971ec215974277c02277322c1471959ca699aab4662acc7fb62120896b14a3a25151280e7741bdea18e32a72f0b267ffc7b2108094e1378b169093c007c0769213e28b9249acc9b2acb5f8e7972ffa629a5b40fbc9773e921354b31bad947c45d079da092b5c4b7c094573d1da2d378c8708d98e55061b9281c2feebbcb62a99b0c6a05291345b731788e6879de89d9756a8795839318249849bcf7e432d622a319e57c0a982a2e034be75771f06917a3193564c3231590c74eae7638449989f703c6a664736823e039a571431535af0211a1931177a4761e022bd925f76913c522b128fa54ea1a04a1f2196508a2d65106950437f13d463f1652691ab919d62118ce743440b273217acb03ccd67e16cf85265b67c8ee56a4cd757c860372ec1f01d7e61aacfc55f072423abcca70834b550a4bc8228be40bc08e723b37fe945f66018b6f4808257607a9612f9577d6bd86fcb3c149edcb7d8d28cb5fa63b72a41d42471a0f8b014f8315e1ab6a894b2dc70c71f782c00e52c3f1534d46c83b2d2bbf4b0258c919307e9470e8027e5b261bc36c33511299e1a990ac68b6a735c3cb39baf03af5b4206601a7a6c24011fd56a965190b0b675d33381e5320d03dbcdcf684f782cbc2b80791e00a0b27913001796ed9baeab103bdfe2cddcccb0395b441d72746b5c13470408530460b473466d6b8f69ac8518a3b26c9ca22d077a31a3640538cabbfc852d3159fc26730fc5af89c5b5200a7636e56f74f99953886f80b77f6e22055d51048cb4122bd525710a4ec272628cb50ce549342c314e81253e0cb2be1d779b82462085829bb2ccce74290e2018ba51d1cd08f00fe0870254f4a73fc637d0f5c6d8f56ca376690265c4b7773bdbaa0b08880da2d82e79c87402c38bd60a4c07e219aa30b3566b78ded73683fc1dbac43d033559e81364f8a0cae5096243f15b7bbc3bf7cc061fd2921b12a5feab37c8b402ff97718faa1ffe69122a658804310d9ba4555977b2cb5a97e14ac626fc4770fcc8c325b4e03472f8e62ae7c37918a48f6ecb15c0a01ae920a84b4b7113a74bbd39bd3318c2361401f1c15fb95875ffc55bce76c77c3563d302a2794b92dc800cf9f38c5809c29b4b7e0e38c340e458bb00b44d7a11594a87ca96bab666277970b569e5c21f574563da3dd139ccafaa29f8a79578a7afb0930be8f8914a17415ebcaf14d13f5a4037a960c70884b43c066698cb4a004aa9e32a4b1150a98b708e185a5b4ba09e4678290d33c13c14137a2b61e19495587190d34a2ed82aa0f9861b04e51344e4cb0eb60bad5010d635c4811006a130470459262d028fa6c383417ab81586ae5cdba777071d687c99dc9ab4ad21692d70679e0c4dae3b1243294146d6bc1bb4b8d6b6a3e8da24a27c62961ccef556359a9486db3642102c0c129224b2c035792649923010152c1503e797635905dc442db389acf6c30219e3a25538ae1e696b74576fa7997177343914f45954728499b3cc26c768a3d476ebd7120b336baeb4c65b72c8518357776c774cf48996d6ad205c092c9791e55c727bac7e916a2bbcf994c5f9c4330976b1743894dc024dba7997e33efd944405844c01235d4308c09a75548b43555a8a6ea0d212f5da6c8427862873149cb6c3ce7a07ea39af30e7a7505caf30762798e84bc7e965ef96c51899341567c1324b6b07a984cbe7aa6b56cd52702fb106b1cddaa02d50362cd12737308e3e93a45c9c0a3420c4b71167d9587a4b2188b6ca993b37800c878b5adbbaef794f4f24abfeaa40eb1c5763fa55b7369e5be8754beba6be9319cc3a482a53ba93c417bc9a5a3030cb2a247177eb11b63a672e0039fe71735ca9cea99168d1634df2737b45324034492e1d3c74f10239564b23e39585734c86d98118dbc944dec28869ca8be7e17b39bcb0b0e34e257bc9ba42cc782078945094eb1336e516c62b00871d12c6019700b478b5db43ac419b2c7a50442d9458ba4b853d5a29ca946d64b6a6e6cb3485439abd4a9cf34b5921242ddf3611289a72efac4101b208cb7598894a9ef1ec38e34a58b2c071b3e6738138bbaf416f246072ead83b354a0832b98b551b7210095fe9323e1f75bb99905e5bd961cd778d32c1be94512a7893c062f6a66553152d1c820b8825c25938c0348a3d2206897ab903e6472193b5c2aa3f1bfb22bce88bf3723eaa8292d5446546865218d5827a5ba0da5354e2f6c81eb96cf0f28efae54935138273447a953aadf9757319e03a6ad19d7e613c2cdc7f5a3aa1891368399ab5c5337881c782bec48f9161774686204027b6fd895ed1b800db68c2d9d529156b0a8db90f107964d8f5c860737db2a3375df20b7bbc7f1ea57ab6e2a2eb44b5f8e6980d5233a0791350f4ac23210a4bbaa928273294691b7c441edac04909472e8f6714e99bb7de1076a121576eeb1d419122d4366023bb2fd66937ed940566ab07d7b480b330937c341106c3bc01f3c26eb7388ce7404222bccd7cc42e8a56909239a2968f2da3cea3c6695cbc909ee481b4c619f1e7ae6750b4d8f691d70490134ba02cfc97327c9f14db4bbfca7b4589431e0b8fb8dc61658110dcb675dd1bb46db49605c66534ca53d918aee579557e82c733a3841a7338f9947d92d4379b3a2d47469166bbc20ecc4de2f7c768a0ba4dd788cebac30eccbdfa11ccbff61328f92739e12160b83369d8466421374380a1a2c8bfd701a869b49d09644266d300493badff092390e894102028768a4592e96306130550291ecdaab48c711e8a1822cd278b80357856a739174b3da66795fa8375333554fc92298dd92b3c962bad035424f418b9b626d32b5383005564b8cbad0915a977b1c95710ae490bfd158a2c780e14c85ef92a02a2601c3538c1297772d1045bc4811e4e7893310413b4121201eba6c4db8658378fa3a6b9b919c9247c40ef39a7d564bf13a6c8ec575fc3b58f42426ae1a4944cd638bcf8336504577c65a7b75b06649802bf898fc3337ea3f783bd58bc85e33c51c91412c09d99c310ab9802ddeb4e977a640eb05a6e01984186b62f3237230b33cc4721d984382d003a4472496c163a0c23aa7527a7a98b45260794c109c3ef645fd352b778f06c6de40ae1aac577698edc053e951931e88b75619a2e3a795d9d7a015fc39978ba6832da41dfc1aa36d53351321107d33d00d934ce079f53c1ad114b622ef09fdb70888a861e8b9334610a9c2a5614325b9265219dadfb7eec92b472c87c0f0181e73c580b9ca8564bc1e3b9b70528a30d0c54bbf48b3001c46b536c51e15c4d0844fe81bc035351d919212c699a455b7f0900121a77360f4aaf09443e9031ba9286c0ef18a72a0c6afb2b380452379fc14dde6a20cae7c703b8c367bbbf4ea43df773bd6a3a4c051caeeb66a236244f7bf5a837731655a73bf6e7a3413459cbac0dde329e59fc9521fc2009e480d82711496a5871f33d0378223243137486504a209d9012574b10561fc04deed84999baa3a936a9b1234ac4c4afe451042f828cf40c49e632c6153684448154a023684af08ce13b204ac025991c5e44b63201073f22a50c935b9bc1c488aa8a704bc178ab0a752595cfe050b341a295f9b851b67a3c09010ecf297791c746ba9247df2a1be5a82cc8f904e1553b31d53710b0b0b7372b8e9c0b7c15636097316d46587e07753ba05e03f7cb3c6c78870a7ab21ca99db30217245a29fccc3ed80364ec661ea93194d472813a3cb0203b223b909c5774f2dca50e8a9753e36c33d92c278a52122a72fe389f0f962ce5d3a1d9f5c07000919e4761a07282e016854579b1c2e7c608630c6b2a6a1bd96c71392b9ef15e04f7bcee414cf5d9a6ff701c4d2586506248f4bb6bd4ea4a45fa79fd92aecdecbf20d7ad8534673832a0d6ca13c561a446aaa23539624487767e4a195dce0e2bc6a3fd1a73e918f297aa031fcd8c14925529ed33b83ae8e7ab9b3999082be47443720bf6b573a95207d1eee1b3be613a1985b3d6f48dc648787b534537addaba4ecf14f02ab317d36cb9f0f50222ced7cf029dff8a0d3d2fd9 + +# Official test vector 51, seed: "450751d4401737459c6d93e6c5f2fbcc4a3af7cd7250ccf404bbb817a67bab7b4c9d0ef4570bfe25cf919da331c31d88" +seed: 25056d1b8113bb362dd979d98643d7a7ac9c4f95994c0ba060609b6d07002ff3f48a9254dd40b117941fa35a66bb50296327b725525deef70e128ca8045ec451 +public_key: 96886aea374a0c4886e4185a5ad8ca7f1a7df73c6af1282397a6a9b94c95c8284a0d65c3e614cc73159fd71bbd699006d1b97da241c470aa28113a24eef9856ecbc3619bbdbc25bf1691a241414cc3a816433c6d9466037cca4dcce8851aa9a182fa9e7ecc47e42713e9f81189cb5b68b52389095544427321ac5bb12000371a1e1cd96b585223eaa02218543c6f32a777d79c3de28d13dba32818ce41d13e2eabbc3c1223eae799057c43a2977ecff4a5966a7e52d0554a8907cc39495fa80339160fce96742fe5679cd4c4648910ae0715a9899530723be9b551e404b88a1c272e72b1b3e56144a4974df799eeb20170862305e647951645de729da99bb4fe579309d4abeac03ea4d029990b3fa8464f82e4472125bfb98837e275508d161dde593b490461e6508276b344bb18b93cc3c965e084df68a68af14e6bf37b4dca585d0621a4f32263abab1684ce0b1a5fef971e8fe18928d38477572e55596e35ab6270880c2e6abd0ee9080e75850155273aa38c0bf588e02006f5837c01063360773ff79376a72380d9e123b199b561007f1873a4ddb715abc93d95c7a8549407ec94cd0b928b30e3cdb15804cad99ab2202005675e68ec6f71f70082139b42e5bf02abcd4a4988ee0a16415a095ec8b94d2431070a710d72a596e30ed4588fde91670f3ab70f35a5f0870e86927d68f641faa10f962941e0026908ea7d27084261d190cb62b4354a1c8f06ab864031341637929b1274a1c97bd62208e681f3a96333871c41916b03e668d7559fc0a67deceb0d2f818f45d82a9e4a679d76436bcbc45f1c971e966a6cfbb4e1948f2e4b0620a28d633b78951812fa15c4696a7bb17a9ddec0329e927aa1294e5b7974bbc7008a977e0e13500337cd62b281bf73920f02b19c357eb57b3c575265f1e73a16b455af856826f29be11049a7005d9aa401aff512e8f8210f296fe64ba0ee77b1734bae34000b85c609d8bcb39260690ca9b82e105746acc35fc49ba6d1461a748206361ec179990c1b2ec71387b51c1c7ed344b816008c384eba96432ed66fe4e7225c0047e2b2979bc359a891b258a2cd40ba3694086489088b42452682518ec4c1bf8b56b91519c8d02395e726ad48696d5a2809d7f3021539bbdb38bb11e823cbea2e7273742c87776457a1804b89d524acfcb39e19fa454753908813815349a872e131a5fc91c51579b3a50e9142955ac575a8a528ffb35a77a6347f119ae0fab07701cd4166a0144963ad69268bacbfdca7bb18305efd006e44f812d063b0b7e8b1fd75b5b1662a49e26324f89415a51fbea41b75485c53b661c97ab2b9e193d6f1067f518e8522a73447aa1be8af9cd722eb8653e1837279c5194eb21bc9127f1eba895f9924a254c6b38caa0907018197a771d531a506713d3434c23a3a2b996b7e11c83b97058af811e974819da2147a473686869f4d04bfcb9786a0f9723dc67e70e4ac0f565b85f4bb30ebce82b21950838a2102805550c9fc1607ab93a7e42a0c9e79611fa7829beb0254050ee730792e73975a7b38bb718ac65064ed7090471658657123e7823631e802142aa563771bc6975ce2722f0e012f555c3f021a7fedf78f51020935d01a92362dff154daafbc4ab6c8d32d2a11525a474757c690b21274b443b58458b83766df851d95214dd04bc0af73679249cde1055e1977559d26b3bb60bb306503879b7fbf0b2eb2508aef52049f43adf6275d4db027b6477d6479cfbba91ae0abf1dc8126fc962ce9921da1b0005a09c30b6894ef6b3ff79a0c088bd2d6074988ca824aa18b887073a10c7f21982f802204c220756c0bdf59ba855a63a026125bd5c677db08368b475b52c3559c3031ea56040b9590f859f6c2560f9170f5fa759068678b9e22888671cb0a693e825bafbda853c0b56b79a63aa198710b6246a4aa58b226086416d3ed82c412b282cf38c71348b40eab105ba23b2f3720ebaa6f21c9f7b23c4e324c4c3a821de7957c21183fb48c4c127732ab169f822c3003a803aaba857c6b92bb22d8c10251ee1a6838b18c650cd5b8304f886240e16c8cf4a74f14938a21a8f3e87bca0351daca3a8d5c014037ca5665a2589eb7ec6f29d18d891c0cac822792b3408617166b55cb1182341a309f86f99f86b4e7c54e6c2bcd15b15b091274f185cbf5aa7a7a8ce437adc43de798498003691147635e787ee +private_key: 09e4c3ac7c3e706ac8eb1a3c09ecc4c26a683a3b0141298052e81871d820b931a79e4a3292550098c93be9ac0d9539641825928d8398c1c5082550489e1aa671b936bfac883e23ce83b24122a28b20b5908b4c5d65e4c8322bcae55755892c8896d9ad6c4b78f1d616aa37c61f3b117ca77643fc65d74746b1110c6a0c6abec7131f79c62a5b90d6ca21139682165ac043d063b0d4644edcbc9746c498a55d2ccc1121996cd82769c9f388e2c37e7ea3b5e4e76da12c4121ab1aa40a5b8a045e5ef767ba1b2da22847424049e73ac213f7333a9664b836abb08650e1370d4e3693898a802896300bfa14ed3b62c8156f76f6c5573946754c95e238136f33709800c589c38e76d76d946581c554aa5d608d613b2756963a3cf512d823afd6d4afd428601a1c5c7de8c58d3727b8bbcd7a704b2b33b161536affc498e5d6ae2d1c9a3f9823dbb32664d36242185c6da03c11fb5e21905dd374641b569ba4d3096ac5833faa0641d40ded086973a49413d8596ea97c76f4838c37824db6c8b4310311501cfde747b4130c916927fce26777f7978f2a0a3c89c93439ca7e00121c5b2074f775acfc4239b0458038c90d71b45f83899c7b20bd91b1c697a12eb958f1618a2b8c5bf1a8b1fc765c7346b53f2c8dd311cbb8985d93e9184dd73eca6036b1a73abb38505744001260c21f123fb950cc550563c2e5240af922c5caa5dfda1afa84b23ae8420960ace7224954dc08001513ed63a4896c96f45824504341f8b8b84cb2979947a923e3883eeb3ce2f06ff38a7247504c8e1c6ad0b014836001e12705534847a676b2c824c04d71467a58cecfa97672069df0376db8c23d1400ce62f1a0c3a258b763a58077a1fa01510a8071dd939ac1183e3bf22f880b5102878b1317a67a874d8e211aec3a3adc921272e756ec16b4694c2e398798f2ca8d7a668ac51711329b30483828f41b2efdb9823a957d601381d2e86ab2502680f1004d67887a890336b218b2940eb60262f6c1593b500f45d18d2f081b5a956ef5b1817250452d87128ef0126b98302ebc3dac33780e260b61f30cb5c81bc6a54fcb362a64f804506c79922893e889bd6c22c16a9018b9a522749950bd5ac6129126dfb2409bd512f5106e3e757f749a5efef79a5949096b47686386159a47ae22456257093f27455c402574ffe725b59a7afe89b036e34e6190928c70b15f525daeb69c71a08f1f611dc84748ce219fa38b89b06a15f576885ea73a4f773932ea14823c404f2004c056bbf6463268a1a6192443dd06b92c8cb0d11bc9f0029d6b4c9b44304cec028c6e46ba3248b7f2912a1854a1a90229402035f1519535e53777a494e5da9ce02195d7646ca2993b38c409f6cb3c9baa7f461bac9a877cda431e1b5244ade7351274bc69353437f4cc9641111ab74e07a734b1f0be390b3421a598ab91770587af7f16cd043990d0d73af2e861b0f216b53865d42c8e8e1baa52735f684248f14b8020461d974c2f79bbab12d0717cf08d72c9a9f8f1c60b4c01362cb4c16620b6ac5604661728781e1f51cbfb7cabc24243235c1dcc19394bcb115bc2a2e6443527f7c446a3ac04c58de930b5f19a9bdbb34c61c3c79a2ba4760173cb55c5171908aea5c1e6860ca1898f51174c7ff50d92e87d989a36da409db602ac0eb8bf13655ea8e9b46956b9b80a4e97918623469d081214971b4b32c34c5bd9bc5d299eeff97629a0c8e935816e1532853952ae007a6e9224839169bff49493c13a5842aaa5b32d9257c30bf36d53870bef195dee5819e185a5db768e950986ca8092ca371863b442db96b62877bbda7179d5c009a9626c6c8537a114ccb571c714644bdc9449d070bd9b35078fd71e862aa59d57630b0b3f0b17361a05aba7b906f3d66c2a1c52da0135742c40501a15f4b269c66683038b4bcc9aa5fae69edbd765e8cc34c5b31f0f56008a04c137f9507096c1a173466a8b496e1c7165cb9631e0b039ea8bfd55374d674a9d2ba84dd29cd200600ff374fe128a8ee4ab3b824126ec3450367784d936ef927e4339cd05fc013d57341ac63530c8808ff734531c5e802161baa0697bb9b8f2545e36a2155958af41d4bc95e27a8ed5bc5a24386fb73ce97b628d972eec7703575c598b7a95f36c89586474cd413396886aea374a0c4886e4185a5ad8ca7f1a7df73c6af1282397a6a9b94c95c8284a0d65c3e614cc73159fd71bbd699006d1b97da241c470aa28113a24eef9856ecbc3619bbdbc25bf1691a241414cc3a816433c6d9466037cca4dcce8851aa9a182fa9e7ecc47e42713e9f81189cb5b68b52389095544427321ac5bb12000371a1e1cd96b585223eaa02218543c6f32a777d79c3de28d13dba32818ce41d13e2eabbc3c1223eae799057c43a2977ecff4a5966a7e52d0554a8907cc39495fa80339160fce96742fe5679cd4c4648910ae0715a9899530723be9b551e404b88a1c272e72b1b3e56144a4974df799eeb20170862305e647951645de729da99bb4fe579309d4abeac03ea4d029990b3fa8464f82e4472125bfb98837e275508d161dde593b490461e6508276b344bb18b93cc3c965e084df68a68af14e6bf37b4dca585d0621a4f32263abab1684ce0b1a5fef971e8fe18928d38477572e55596e35ab6270880c2e6abd0ee9080e75850155273aa38c0bf588e02006f5837c01063360773ff79376a72380d9e123b199b561007f1873a4ddb715abc93d95c7a8549407ec94cd0b928b30e3cdb15804cad99ab2202005675e68ec6f71f70082139b42e5bf02abcd4a4988ee0a16415a095ec8b94d2431070a710d72a596e30ed4588fde91670f3ab70f35a5f0870e86927d68f641faa10f962941e0026908ea7d27084261d190cb62b4354a1c8f06ab864031341637929b1274a1c97bd62208e681f3a96333871c41916b03e668d7559fc0a67deceb0d2f818f45d82a9e4a679d76436bcbc45f1c971e966a6cfbb4e1948f2e4b0620a28d633b78951812fa15c4696a7bb17a9ddec0329e927aa1294e5b7974bbc7008a977e0e13500337cd62b281bf73920f02b19c357eb57b3c575265f1e73a16b455af856826f29be11049a7005d9aa401aff512e8f8210f296fe64ba0ee77b1734bae34000b85c609d8bcb39260690ca9b82e105746acc35fc49ba6d1461a748206361ec179990c1b2ec71387b51c1c7ed344b816008c384eba96432ed66fe4e7225c0047e2b2979bc359a891b258a2cd40ba3694086489088b42452682518ec4c1bf8b56b91519c8d02395e726ad48696d5a2809d7f3021539bbdb38bb11e823cbea2e7273742c87776457a1804b89d524acfcb39e19fa454753908813815349a872e131a5fc91c51579b3a50e9142955ac575a8a528ffb35a77a6347f119ae0fab07701cd4166a0144963ad69268bacbfdca7bb18305efd006e44f812d063b0b7e8b1fd75b5b1662a49e26324f89415a51fbea41b75485c53b661c97ab2b9e193d6f1067f518e8522a73447aa1be8af9cd722eb8653e1837279c5194eb21bc9127f1eba895f9924a254c6b38caa0907018197a771d531a506713d3434c23a3a2b996b7e11c83b97058af811e974819da2147a473686869f4d04bfcb9786a0f9723dc67e70e4ac0f565b85f4bb30ebce82b21950838a2102805550c9fc1607ab93a7e42a0c9e79611fa7829beb0254050ee730792e73975a7b38bb718ac65064ed7090471658657123e7823631e802142aa563771bc6975ce2722f0e012f555c3f021a7fedf78f51020935d01a92362dff154daafbc4ab6c8d32d2a11525a474757c690b21274b443b58458b83766df851d95214dd04bc0af73679249cde1055e1977559d26b3bb60bb306503879b7fbf0b2eb2508aef52049f43adf6275d4db027b6477d6479cfbba91ae0abf1dc8126fc962ce9921da1b0005a09c30b6894ef6b3ff79a0c088bd2d6074988ca824aa18b887073a10c7f21982f802204c220756c0bdf59ba855a63a026125bd5c677db08368b475b52c3559c3031ea56040b9590f859f6c2560f9170f5fa759068678b9e22888671cb0a693e825bafbda853c0b56b79a63aa198710b6246a4aa58b226086416d3ed82c412b282cf38c71348b40eab105ba23b2f3720ebaa6f21c9f7b23c4e324c4c3a821de7957c21183fb48c4c127732ab169f822c3003a803aaba857c6b92bb22d8c10251ee1a6838b18c650cd5b8304f886240e16c8cf4a74f14938a21a8f3e87bca0351daca3a8d5c014037ca5665a2589eb7ec6f29d18d891c0cac822792b3408617166b55cb1182341a309f86f99f86b4e7c54e6c2bcd15b15b091274f185cbf5aa7a7a8ce437adc43de798498003691147635e787ee4e145d000a02fc34e2891d2047f787ad49b9adede43fc52fba6803172487e191f48a9254dd40b117941fa35a66bb50296327b725525deef70e128ca8045ec451 + +# Official test vector 52, seed: "5de720f2d152bf4e1f96a61e7ae5f1bed6b8548e32638c2ccec9f43b87d1bb43dfcf334f0582984d27e440d519ab662f" +seed: e4d34e12982aeeb1d62fd488d9b9e28557ed3429292239fb4f76fa9098009acae6c45c7fc62329b13c8d29844405db8ff6860de474bf727ecd19e54e6e1a141b +public_key: ba96bfc11884b9304cc16b669550cc08a2828dc34e704534fcc057a45b25ca8ab600372cf6f60bfd530b1e67309d5004361acacd392d104c9d3bf66075d5949ad75815bc9517f13208068ad5250595d76caebc3b188a268312353e232cbbec0830c45b44e315b4e037f66722f2c8c58d37228a7b3c81a8914de52757947eddb3a99ad35bcf1bbe82d9249d228a15009bc2521162d28f91b70ce3c05c4f027cf638053776511fd4c24e660023720370042c6bdcbee2cc853e1345268235e1e31d41106b1c359c8c4844274a42059724b1ba455e01ac4b800d79d4050c4260b862ca9e30a3cb876852997298609c19479b7ea35691ec5de9a16b09382cad755cd1a008c06b3a5d347b75a06825d4a8077cc6a61543a6e4c362e979a6824dcb494b7f510c1a3557664b8ea3d681702932ba284deaec19e83bb4eb0b4e916670c185b8effbcba3252959714462809d54049561baa71f13ae08d25fc587a01c853b32681cf1fc906fe00c2cc58971f8863b803d9752310a18303298ac6c188b46ac03e3a24486b6bab54306fb1942b908635028238622198882989f712ed3a30ef5970528bb477ee6a670d031e5dac2557655acb2c10923441a77959923bd8fe07745988efdf48bf794659bd34cd8941733f97d85178021e8b20b185e0cc47973173c15a681f4a0ab52c5c4c6f3a2364465d3c727928853a5a55998743e58695feeeb9f06c2cfaa70679c00cc6ea329c16bb4943418d90017beeb03852400b7e87d6eb8be948303e31306a4116fea8ba59d30ab6f0a5060c2aa89329306065290466508c17eaf7687c551100a18cdde6600b9e467e3fa7b10dcba2a722347349c2ed9443c401b6749225f38195c04838ce8b96ab66cc2d7235c8b0316eb7e1ab1ca956c5780fa491a7720b073beeb48b98dc41a1b276020256ae6d85aa3cb2d60e6375b44aeb6e34503fb0a73426cf999af33e89f1f2934c3438f47814d76413b87a264ffc67263e3cadbda0366f13b82d9a789d55f05a30868c6a9b7bc7ca7e69184051d9f2abff4ebcf0e26290e69c0bad83ce3ba19d71133a0d8b347e1adeebb8a8b915247689311e5378d256ffa867fba904217339976b4af06bc3e5a9093e8e45cd615cbacf65bf1b0899da61790883ebec896a095959af55d0d7b39a9611e439a26caf8c71cb05a57ca071c719a281625c2e4615cd4b74826323b163cf161bf6a0424eeb2381df549b050bfb9628461210461a9a35863bc0103c8290244c6ea5ba381c421421c91c010645ca365549c7aa09520257634442b83e5806d2a274df4b8888bca68accbb5350743443d8dcb471e25ae4b748338a922b7e11f761b059bd5848eaa441c812951729d6e7013fa98340ae9a142b84b6a98c6577369053652b3b505d4d8607737b49fe06c5ce8b40ec680838a182e34296c317df67826f4ea16f4547b4fb9cd0778b2e5c66e1e5382db0c0c432770d82a1e20f59ce1eb1cba29a1b9d8a5e2dcba6b04022bb72923591e79dc4f0616b2d4637be08558a212166a97588e128c08579859d1012088a7ef26355fb4b83849aa3ab06b886aa45b9a1824a74b05f090baa7cf2969368e6a82750160ceb0107811543ad0bd25031a285c4186719d9a30270fe1c73ac8bb64d912dff5bc324441df18ae94d03c82b63cdc9085d073063da296627a5cc754973cf296f11aae6bc102e940740c853fdf2576c24b3816e60483448d9a28c3e1b295a4e6bb36283f4706290882b52f7babe54b95772a174a4a0a3767c2f6aa992f5904350071ece661d94c868df7396c1a1588f80f78f82babe28531d97617335cb098cc530c5234dbb4db98269d60b271376a52621fa40a464bfc620cbc08b2ab0198e2bcf6912752b39caff4938b842b1519455bca30c8b15f6e2942b1c6798b584d89382abb26af5be574fe12838737091611adf21507e6803a88570d19e34331f07766d39d57f80ceaababb0ac5a29991a1189a6c9364b93a53e73c13d91c656de3038302279de8a0d45d46715d78a8c9aaa5414540d9cc6553cc910b24cc941769ca5b8c576ae8e559969720d8048291c9374913ba79ee9cc3cc217c5f1a590a7ad9bf27b365881366c2a529a85ef8b34d64792bf786964831da9a38dbd81a573b74a8247b040f60404a038846bc2a3117bbd025b0f7a7de41806de885d79e49a5eee5db12a57b1a7da55ccb00b5b +private_key: 0b57a478859c30104a9dac5c9c4b15ad5a2c3dd362b50c7ecf4b4f5861b60c9774994752ae90556290193f02b53fc3cefdc6864b9845185a1b99745ce6120f6df5898e8682d2484fd809106c9a01283251569a67fd8692fe202995290b6c54cde2166a8926a96864c2f1d209da830832d05275101a8791a5fa7b42fde06d7109002d580701ec45777a5cef2a961306244f540cfa4120aa146269d8b9178c34b0f9086895cf4376c10176621138ad1216bb1e0a109c0cc4da4167a5fbc7497a6663a5cc2853b347801e5401b2846b7ca0233ccc78b2b79c0da56a1854696180552a05a3cbd024668e593a65143de0a969acba37d3da4e834375f564379978121aab89f2e210934c5a5529ca121c015474afc1b805103226899967c616c482462fb588bd8e90606e440046a3593f4bc1fda596067532f340469bac9e75226b328c491411b940e27d196c872d3630e5a396bb47b38a256f6b376508e1b6ef92c15915469d2b781a8c09bb5382be765af47035a57b0bc85120cf10200f98844c410d3c077e0bf7703ad090fe58a7763c77881761fe651f1b8ca7003a99d7f4b94560b0b501241f102e93476dcdd937331b6a415317df973c2a33c98d835c19b78f548b314bc5933474132f89876c9204e2221a61f81d140083df2aba9a674b088156c99a71f14674b2daa435a85c4ca2cdf4a2588858cdede20516181e3537b1bb0060b448a306c691e93aae45240800b390e77163f25b8ca78a7868c0b738a671f3a78171a931ff164b5bfa058d481aad6245757bc47e32038ac95508878070bb6061069e2a0a1369c45daeaaa04b9766b21c354fe31635189c4516694faa2c72fcc8d15c9162ebc7bbb98b07e52c296a4087ea7eb7a0ac1233ab108c3603670d3b15ac529157356139c4dc19c5ab85c31c9b3ef4911861419f821a8d6a2a191925bb76ab9f203a2e241873b264ee980267f150b9b9b836e88fbfbb79c5fc2e738ba031d8b51439834d96c75d6017f4d404a0f41d0781986e7c72a98a2702143264b153b93b05b08b414a221eafa3a733b8ccaac737cdc6497dd07b171525730978d01b0222a54450334777a2658ca37bba60afe909896f47217f45652c1b1670c54098b962e49493239b62b17365b391112110b3f3f3b6df73008bb238fb029e46c06e488b28e0d599eed122d3350c74c168e79592de7c31f443b848051c8b8bc159d301c323ac43f24c9e06456fd19b72a1c237e25f8113047ad20b686c2541850b42c9056c68c9a95c3413f61c8a713dee849732930b71f0cd65930cdaa816fc20b8db2aa130202418f94115e2b6549a01da9183524607cfa78f787219a4c88ec0c3913882429fb16961b2a8f6b298b24b2503254d6500746352030119c5c0a153b7dc204227a641417669139abb8083f0552cd2a24e3cac82899773bb77becf49aa6faa95cc230c9db01dca7094d44269c4e9823cd17f5344bffd2c999dbc011d466eaf987eb4074a0045997bd18da0213d5805afc7278459f31151c6c81a8b54a3a6562422a4123266d66bb47a1ba3089a583e517f92d3386407a4d9849fd6197581b43c3bf0afff21b14b925954459e0348ab52b5120e140069ea1f47c97d3cc9a865f56a00b1b68190ba331a1a72d06b22847af0248a21424e8c08426e3c5f40ca61a1705fc36c3a228332c1626ff9478c3382059126c9ae101278fa968ff7c3acc43b326b9d0f7baf4f979baf542bb6d04769a05139e358150210d8bc26abb209a3e17e5b6c85a5d5861906c943c3a25bc41baa292157ba5e1998addf38b6d01cc4be39c91e8348b1b38fd8324cf413125aa0c6bfd2749ff43c8edc33e4a68b0ee9c6d5ca31b6e3c2f5a261dcc804d90a3cdf09a17881a697f52a9eeb2d81f48ef191408fa915f6ac9601f19bd4442ea74c2d99505a25b36f83000236a73de7d776b6e57f7baa41257a261e008fa4f574f8f90cd9865670b280d2ba02ba647d2eb6c7e7b1b679f85c03597764a59e51caa147c63a4d9ab99815cb716593fbc898bfa9ce15f68d938ca77ba537ef1215bf160553306279dc539cf2395c004374860e812b7035fa14a2aa711eeac5e666ac51096c5210a3b744681944a5877b917f6cbb7c58123c6372d87b12555105cd773c86249ff866a24942a758aa18ba96bfc11884b9304cc16b669550cc08a2828dc34e704534fcc057a45b25ca8ab600372cf6f60bfd530b1e67309d5004361acacd392d104c9d3bf66075d5949ad75815bc9517f13208068ad5250595d76caebc3b188a268312353e232cbbec0830c45b44e315b4e037f66722f2c8c58d37228a7b3c81a8914de52757947eddb3a99ad35bcf1bbe82d9249d228a15009bc2521162d28f91b70ce3c05c4f027cf638053776511fd4c24e660023720370042c6bdcbee2cc853e1345268235e1e31d41106b1c359c8c4844274a42059724b1ba455e01ac4b800d79d4050c4260b862ca9e30a3cb876852997298609c19479b7ea35691ec5de9a16b09382cad755cd1a008c06b3a5d347b75a06825d4a8077cc6a61543a6e4c362e979a6824dcb494b7f510c1a3557664b8ea3d681702932ba284deaec19e83bb4eb0b4e916670c185b8effbcba3252959714462809d54049561baa71f13ae08d25fc587a01c853b32681cf1fc906fe00c2cc58971f8863b803d9752310a18303298ac6c188b46ac03e3a24486b6bab54306fb1942b908635028238622198882989f712ed3a30ef5970528bb477ee6a670d031e5dac2557655acb2c10923441a77959923bd8fe07745988efdf48bf794659bd34cd8941733f97d85178021e8b20b185e0cc47973173c15a681f4a0ab52c5c4c6f3a2364465d3c727928853a5a55998743e58695feeeb9f06c2cfaa70679c00cc6ea329c16bb4943418d90017beeb03852400b7e87d6eb8be948303e31306a4116fea8ba59d30ab6f0a5060c2aa89329306065290466508c17eaf7687c551100a18cdde6600b9e467e3fa7b10dcba2a722347349c2ed9443c401b6749225f38195c04838ce8b96ab66cc2d7235c8b0316eb7e1ab1ca956c5780fa491a7720b073beeb48b98dc41a1b276020256ae6d85aa3cb2d60e6375b44aeb6e34503fb0a73426cf999af33e89f1f2934c3438f47814d76413b87a264ffc67263e3cadbda0366f13b82d9a789d55f05a30868c6a9b7bc7ca7e69184051d9f2abff4ebcf0e26290e69c0bad83ce3ba19d71133a0d8b347e1adeebb8a8b915247689311e5378d256ffa867fba904217339976b4af06bc3e5a9093e8e45cd615cbacf65bf1b0899da61790883ebec896a095959af55d0d7b39a9611e439a26caf8c71cb05a57ca071c719a281625c2e4615cd4b74826323b163cf161bf6a0424eeb2381df549b050bfb9628461210461a9a35863bc0103c8290244c6ea5ba381c421421c91c010645ca365549c7aa09520257634442b83e5806d2a274df4b8888bca68accbb5350743443d8dcb471e25ae4b748338a922b7e11f761b059bd5848eaa441c812951729d6e7013fa98340ae9a142b84b6a98c6577369053652b3b505d4d8607737b49fe06c5ce8b40ec680838a182e34296c317df67826f4ea16f4547b4fb9cd0778b2e5c66e1e5382db0c0c432770d82a1e20f59ce1eb1cba29a1b9d8a5e2dcba6b04022bb72923591e79dc4f0616b2d4637be08558a212166a97588e128c08579859d1012088a7ef26355fb4b83849aa3ab06b886aa45b9a1824a74b05f090baa7cf2969368e6a82750160ceb0107811543ad0bd25031a285c4186719d9a30270fe1c73ac8bb64d912dff5bc324441df18ae94d03c82b63cdc9085d073063da296627a5cc754973cf296f11aae6bc102e940740c853fdf2576c24b3816e60483448d9a28c3e1b295a4e6bb36283f4706290882b52f7babe54b95772a174a4a0a3767c2f6aa992f5904350071ece661d94c868df7396c1a1588f80f78f82babe28531d97617335cb098cc530c5234dbb4db98269d60b271376a52621fa40a464bfc620cbc08b2ab0198e2bcf6912752b39caff4938b842b1519455bca30c8b15f6e2942b1c6798b584d89382abb26af5be574fe12838737091611adf21507e6803a88570d19e34331f07766d39d57f80ceaababb0ac5a29991a1189a6c9364b93a53e73c13d91c656de3038302279de8a0d45d46715d78a8c9aaa5414540d9cc6553cc910b24cc941769ca5b8c576ae8e559969720d8048291c9374913ba79ee9cc3cc217c5f1a590a7ad9bf27b365881366c2a529a85ef8b34d64792bf786964831da9a38dbd81a573b74a8247b040f60404a038846bc2a3117bbd025b0f7a7de41806de885d79e49a5eee5db12a57b1a7da55ccb00b5b706781da8dd5f11267492109ea905a77270a67315eea1f5c223aa9378bfb8116e6c45c7fc62329b13c8d29844405db8ff6860de474bf727ecd19e54e6e1a141b + +# Official test vector 53, seed: "d71729dcbb27d7cb39e9e905025d3e55c8602efbcc483c9b866ebf82326157833169243c14550ad728bd1470f39c642e" +seed: cd6a99396eb3539ca663a51e42063a3a262cc1c5a5fce1566f0597b52ad9fa325a3407f591791a5db4578b5972093a95bec3b8e70c1d542c9b5c9789729f8922 +public_key: 2626cbb144988961cd4a5b3797911772787768b796a5157c180a1264c1bc6ad588139028f9f28b3d8866b8964a5253b79ae86064b5979a0b468f87ce0ae843f34765982114bf327ff08c801a3a99af0c27c72cac48614620d373b23c01d1ebbb3331c4f0ab6cf7a03804545427547acc2a467e895d75486f23cc23c779a390026e41b56cfb04b1e22190894a3c1ee16f19017d7cd75151047618b49921c8990a580a03e1656f841e95101eacc1106f0cb94dc2789bb1a2b3591134b05e7d983736f83cdd985d160a9caa210de0813ee78b411c813fb3008742f793e337a699b3a1180c5a48e12d92b9709525858a70ced2d2c81efa2401283fbca4c4b4f1904e75ad66a894aa57cf240118c73643af435f024013d6664543888f7f30327bc65e3631a4da4b6629131ec5067ec5a8c354f94aa207b587f139fd3583b3cb51e6f7926b9a914c15928738a75c9b618b250ffdecc61061618a8038b3c65841ab3d5bf203c122723b087d4ae2604f5bb6c9013c4f38903f65248c9783db79b98b9a827d528444c26c8fe408d785530d90123d30371cf46307e1c6a81097ab96280ee058d598207e666ca0dc213fa48892c3b7d5f49bdcc894f2a8659fe882201b4eace22e1713c06d74156a6a04d84c0b29f6b53fb61773d19f5cf9394dc03ba90923d33055b5c089f43961ce810a27f0878f4a77e9d60a2a1842a0450ab7208d24cc865a6393a9820b62f96abadcc0650b171b473db3e91906720cf7ea3730435f639c1ae9fac889d76bca6602ba96b0eb98aa44136cc3a978b747acba054032d36509a7ae9dc30855b2b1699628601793062c5705c5b103344c3a77947992a2071c35f6393942dba3b8545eb9a58ded8a5407a270b676061dea1c5d490f25a05c0f82750ae6151de2bf028a28657269789733f1e4c279203e2fb837e6ab1f30c04daedb3ac2809791e8ce988a4c1754c8fdfa8be0fb8c94a240ae3b1e73ecca729b4ab04044be1b97972a1a27bb10bde4240d49a568114b938bcc050b26145598905735ba2a3198e3a375b752d8f5a84004890e25916871a34469a8cdc8b1077482f785ac3e497574aca642d74a3625ca37dac98565ab6f4c95a289a434c9ce9fe61d129c073b5cb755306d47873fb186bcb86ac00be265c320c70788bca0f462fbca6db8805986425a6437304ce48d59588489561d37b60d1f171f03ea8ab817c93ea7c3afc06447eb823e630acb4213b50793457aa8f0b9b484d5830399bc2c98a7fa452fc30713fc85ad9a7707e8343e2ed113ec436625172cd4162cb7730e5f327e9566a01df27d06b460d155c8717469a365acd5ea80b935445a6610efd3062ca954276c70a8085c42aa7f82628655f97a06c098aa7ba8a1783060fb819de027dae9256e8ccc9a72539985144830c23ddbb3a1860147bcc0edb69a0ba03bf9626c1f35a611f686cb71801e130e0cf363b795bdd9c32e82978f53083262a703f85398d0587c2cca06ce1c83ffd614d1a85d437784623814d804cc00778978e0cd3e2704d34563fc23494d84b6a4482401b009b601582bf48d7521676023439ae2c48e5b54bae0c592b64d038883a1ca9a4a843c100a58d19270f8484da82ac633c3550a1634d0a7cb8bacaa19d4500af0ae14499ebad63ca1d2afea753e762246a0834942643050b151cc9aaecb587808754e2aac15d5b2c074667766181309b113211320603499d9b2a5aca065d8c088b24482200c0eb26c3f7de8751ef56850ac8097581852873b396b05ea4c12347309c7814dc89929ea6c3f09d9bfa92bbfdd0680591a69dd855269fb77e8184ddb4aa0d3b2a7013ba06d447598e95222774badd3544b6c80c229392b0caf13a94eb3bc920fdc0ad3aaaab352554a15ad0aca4d7038c208eba4f4b181e8194e21575687e55b5af0c2551acd36824c73c950b1d9a8a76264adc88e6e220396bb1aeb6ac835f2cb3167c7f4db6bf0b6552db314bb91584b86c0d7762041075a432583f8f357a77731edc1a7ea932dfd40a8ac9c09d3a687dd530ff1ab95c4e56537dc6e82210c0d3c582049a180030acfc3790fa1b437e91e1f67262e03cb59a87485658182d1a518822f678c266ad70fc1622c5b206ab7c61510f1c920db37ee852276f1961e64614ec8167fda7091988c176e893ab163e034a7e92d569882badf4976ba648396ee00e3af7f5bdb9a417e +private_key: 455c59bac459203a7beb868c8477cf5ce391d9842619abc685ea791c1c905cda7d92a4cb0560c022bca55c78ca606904ce666b79366eb2a06fcd6525f6075f80a5c23e7621965292549775e9250e8f7b6f902a0f5ac93ca9fab1c843b0f71652cce35f8950cb88981b5e9c20b6c639d2486dbdf823641836e453b4f3b3732965b8b9f64ef7c0897225cd495c8d38406b3b380a70c0b499788cb22b5c6859c25590bdffd578396372c47cab57d22a02313b23966e2c2b6f84f49fe69b7bff77474b0654bbc71ab6346001b2c11f446818c041646050cf6136e037cd4cb8a69206a7bbf2c6e3d0a92b68a1e7caba00a6a70551abdcaccb618b35a3e96026b6499735bbc8b9551938680978804b1735f2dab7bcdbcc3c4cc15a73053dbc1a7ae967ec073863132da8f742c343a0b48851eda61f97d6018f7bbdbc674cf24b6290d6a7a9577745ebca38859d5a7c7d1e54cc18983d9a9530910a10ca8aae777336cc147c939622bb433ae125484d2518ca45c000d2004ba72acca4288d391103a9a9f3db703584451932a02dc46eae313f55305e5990cfb776605fd268b63306fada7a4337c51b2c2b44665b93e2a2d6709c0b08a172db7ea5410b2c252a86d2a08d1aa9126986e78a910b852a12278b1df95baeb41965d1caf6798ef097a5f7d9bd13c83b7c87aa29e4069a376668f730e1d85f693742cad56a122494f926944db6c8270407eeb7b0e3e20a56161948baa86e218dad3703d19854e5e475223476d2da9b1469531322a1c7592577d7035f144ab29a76f661803b125046e33eb230cfb194ce37a228cf251e1c7190d9c231bd5bcf65d03595b4601ef519b91232f745c8182c921d937ba8f6a75ad524ae1a84aeb61a1bd4647e7a3f43315445f7bd6db427bf309fa6e715cc1354bb3a66052a7665e53c8218b4afa57b91e9576dbb562efca278b04707d8760ab73799260ea88b10070c2ed6fa545ba8a43b306d326abf7054488702a5882c19848ac8c2397e42972260cc1cbf6b66cba994a0282784c05acdd25cf4e99f6f91086e777d3b0449aea69d85570ad3ec60923300869502f245845c43bff69b83e1ec790af2b610f7cf09c3456b81023dcaa497277fd44733fc836572b76744280aad512a94582c0a6caef92c02b81c646583ce8223183bd4303a741f6c752b8604be7b8b7a0903ae91836d39bbb1b9fb864a86636977b1ca742a99d949818b535db3ae8aa4618bc702cc4a1766411ad6fb993008a0b8ab46a0bbba563006b0fc82c5b1667fba4774f176cbd667068c7a5cb0055f2229025b3c99b890c1cb6757c14e748358d90c040f44a6dae0025fa820c5d037d48c31e11892ec496833d41e1cf226c19341fbab7fccca4b111160122755f35c43cbb75063462e3de16a4619139ed178f78686b3590009153c17d142e34175d1b4c1d2d476c0ba4f8f715f0ec862138bc70a7a919237c2344ab8a971146a013864ac6128315590c671b1e6c1fb329df06052f782a06a4a1fd8a66eda148d03f04ecf878a13e50d657167db2c57700278fcd1813884657caba453dba396005f51949619342e83b601eb1b85de358617663656ab006aac29443c4ab0696c48824db1351bf9dcac02f32fb45105151c936c48642429758979b1089c0696e039e8b4cdce179ed2b457e65b3f9d65afbaa5885a377581a2814ee1b048b10209918fda1b7e2fc4368a525626a601b621503afb0d3f883b94d1a41089c89c8c1c81880fbdb312e72983a38471a8d797b5719799a8c8482c9a99b07240438c01361a156a1bec17619a60535a745670db06b8c33b83d17f9124076409bf9130595e1322137c3deb17b6da088fe160b8345624a5612330c2042b98b13c6c2c8191772cc37623353d4dd2a9e2a156a30a7ad2c3461f6548d9282115a1b115d81293bc155881bfb49c5d16da815ce4ae5c871abc62828535cd8c4a98fd0430711b50d468715368a15680a6e0a78d088660e0364a3f279265f1556c7a711493b666f5b20be30890cbbebbb429b5c84f3f6a7cf6085e9f411656c65771806c69db98168b278f506ce4d385b95468b1e94f6b0b6dfbf77ea7c8b924c81449530161b61b1d0a3884a23c90069837a386cb06b4caf3a5bd0608d7b33dee6a25a9712db231961d73cd6d3b572626cbb144988961cd4a5b3797911772787768b796a5157c180a1264c1bc6ad588139028f9f28b3d8866b8964a5253b79ae86064b5979a0b468f87ce0ae843f34765982114bf327ff08c801a3a99af0c27c72cac48614620d373b23c01d1ebbb3331c4f0ab6cf7a03804545427547acc2a467e895d75486f23cc23c779a390026e41b56cfb04b1e22190894a3c1ee16f19017d7cd75151047618b49921c8990a580a03e1656f841e95101eacc1106f0cb94dc2789bb1a2b3591134b05e7d983736f83cdd985d160a9caa210de0813ee78b411c813fb3008742f793e337a699b3a1180c5a48e12d92b9709525858a70ced2d2c81efa2401283fbca4c4b4f1904e75ad66a894aa57cf240118c73643af435f024013d6664543888f7f30327bc65e3631a4da4b6629131ec5067ec5a8c354f94aa207b587f139fd3583b3cb51e6f7926b9a914c15928738a75c9b618b250ffdecc61061618a8038b3c65841ab3d5bf203c122723b087d4ae2604f5bb6c9013c4f38903f65248c9783db79b98b9a827d528444c26c8fe408d785530d90123d30371cf46307e1c6a81097ab96280ee058d598207e666ca0dc213fa48892c3b7d5f49bdcc894f2a8659fe882201b4eace22e1713c06d74156a6a04d84c0b29f6b53fb61773d19f5cf9394dc03ba90923d33055b5c089f43961ce810a27f0878f4a77e9d60a2a1842a0450ab7208d24cc865a6393a9820b62f96abadcc0650b171b473db3e91906720cf7ea3730435f639c1ae9fac889d76bca6602ba96b0eb98aa44136cc3a978b747acba054032d36509a7ae9dc30855b2b1699628601793062c5705c5b103344c3a77947992a2071c35f6393942dba3b8545eb9a58ded8a5407a270b676061dea1c5d490f25a05c0f82750ae6151de2bf028a28657269789733f1e4c279203e2fb837e6ab1f30c04daedb3ac2809791e8ce988a4c1754c8fdfa8be0fb8c94a240ae3b1e73ecca729b4ab04044be1b97972a1a27bb10bde4240d49a568114b938bcc050b26145598905735ba2a3198e3a375b752d8f5a84004890e25916871a34469a8cdc8b1077482f785ac3e497574aca642d74a3625ca37dac98565ab6f4c95a289a434c9ce9fe61d129c073b5cb755306d47873fb186bcb86ac00be265c320c70788bca0f462fbca6db8805986425a6437304ce48d59588489561d37b60d1f171f03ea8ab817c93ea7c3afc06447eb823e630acb4213b50793457aa8f0b9b484d5830399bc2c98a7fa452fc30713fc85ad9a7707e8343e2ed113ec436625172cd4162cb7730e5f327e9566a01df27d06b460d155c8717469a365acd5ea80b935445a6610efd3062ca954276c70a8085c42aa7f82628655f97a06c098aa7ba8a1783060fb819de027dae9256e8ccc9a72539985144830c23ddbb3a1860147bcc0edb69a0ba03bf9626c1f35a611f686cb71801e130e0cf363b795bdd9c32e82978f53083262a703f85398d0587c2cca06ce1c83ffd614d1a85d437784623814d804cc00778978e0cd3e2704d34563fc23494d84b6a4482401b009b601582bf48d7521676023439ae2c48e5b54bae0c592b64d038883a1ca9a4a843c100a58d19270f8484da82ac633c3550a1634d0a7cb8bacaa19d4500af0ae14499ebad63ca1d2afea753e762246a0834942643050b151cc9aaecb587808754e2aac15d5b2c074667766181309b113211320603499d9b2a5aca065d8c088b24482200c0eb26c3f7de8751ef56850ac8097581852873b396b05ea4c12347309c7814dc89929ea6c3f09d9bfa92bbfdd0680591a69dd855269fb77e8184ddb4aa0d3b2a7013ba06d447598e95222774badd3544b6c80c229392b0caf13a94eb3bc920fdc0ad3aaaab352554a15ad0aca4d7038c208eba4f4b181e8194e21575687e55b5af0c2551acd36824c73c950b1d9a8a76264adc88e6e220396bb1aeb6ac835f2cb3167c7f4db6bf0b6552db314bb91584b86c0d7762041075a432583f8f357a77731edc1a7ea932dfd40a8ac9c09d3a687dd530ff1ab95c4e56537dc6e82210c0d3c582049a180030acfc3790fa1b437e91e1f67262e03cb59a87485658182d1a518822f678c266ad70fc1622c5b206ab7c61510f1c920db37ee852276f1961e64614ec8167fda7091988c176e893ab163e034a7e92d569882badf4976ba648396ee00e3af7f5bdb9a417e243a93c5dc84bb3afe84c380645fad6886c5614a8735a6f718acc565905e35325a3407f591791a5db4578b5972093a95bec3b8e70c1d542c9b5c9789729f8922 + +# Official test vector 54, seed: "a7c2c8edb3601396beb2df0657ec82fd5780a2723581a9e03dee1cdb018440439bb1142cab0487c5d136e9af46338ab7" +seed: 6c8c53ed6f65e6b2e324b84364e10de42d1c26a106d4d1c99eee79c78586fb55b9402bf02481ce4b27a52e87feb92c4399c7f2988d40e942e7496ad15ad2aa88 +public_key: 032c5f6a930c1f65420b0c2bbab954ae55ca8282b1da2a61f1b111df231df1151504e9031b7b28e793109ed49d46702d25b37f58fa812f68508fe2b9efc319a1976064a648bf7a251a948b74ca3f1985c5f114033e1240bf3691238b507bf28956a52204459eae072bbe10431a56af24ac15f8b546a62c03740c16ecc8afc58871537c485ca93617a324f72991273a0549b377ac040aa12a46d366462ff7b76a429bb781922f7a5397385421424a24b366651b72c5f8870c21835e0b2949f61eb3571cdcb780db683c95e23b708889303a4b9f2b862b68a4e2614eb2d8169ecc1349d9b71b5206973487660b6e4cf544baa688202b0e8df9ae88d85115f9a183fc95265608661993839914d9926cbac8993013c59e979aa8444a54972b99257542e4adb869cf56dcb305455bfec5bcf64137b72b2a6c9b0dcc6c386ed616d6a25259ea612e89c21a170b64e379458b0abd725dc8f53a55e57604282dd474c4ab30c4218a32b4183f0df24475d01fc9f8550b0aae3990bd414561463a023445bd23c7c321dc80eff509a6155cd6b2059fca448ce05d1f0062f3c21849e38a7a90bfbf15b192265f11b5bef91a6bcd0823e2e1b414750e057583401b3a5f140ed7bbcb87bba4b1aaa1aa75a911dac26298a7b9a1830a48332f139f7a4a12a528b9486197999b5717cb8552b38f7f759becd04970eb64bb4826a5cb47bcfba7cc46ca17039f1da30dea436de4b6ab76f43c06d1a1db65a9001a1e0f510d7b4755137bb4c08a710e9a9d7fd8cb32d64152c0b85f40b9cb433ed1d7bea1821c6881309642053f993739e3bcd38951433b291ea26f0948cb2dbbacc3088d58d42de008ab581b0b3a9341ac18c28b131fd4e49964d72d65658c684472550a06e68391f8d34bc09a2f25161745c74d68681c3b333ea58c412f68b44d066e33cb7ed17253fa655603dca0de7a13c7c0c78c9630f5c57ae925ac97a823102c423d0b7a3af864c7a95885e574d570895540a3793b3cd0c73b5a21660b64577d6b146e888a113bc44d78c175aa7ee72760f3b62ed7c971ae62a3e8f08ca4ab7daa43c51a18cb72158de398326589241f07a9e78bbe0c4cbc5dc388b03a7c131c885fb63841445469c42501d198d114c31da36418985ca5d95196fa12b59599f90750e4567a76a767547baea91c6580a628c3c052c3c8bef8755238c2b31d52621ea5579b649f6328695af62aa8d28402a554941b11baf7b54ffab7bd21918a0a6d6a368516b4a04354b6a922901fb8a0e9bc9f7713b977226bd8477d5c7088b8b90afabb61d0b32de98529aaec904aeab8d0240bcf114c5e3a2a44f0043b628f03fa04addac64c918916a3031d6808104539275901c8d8cbf17741a6e185250c7eb9379de46176d0b6cb02621f97c083b8fc1dabc9a0cafa9585aa848606c9cbc58b96da5a8f414bc9a6ab4d9811cd3b3b512925bb5b352cb67f76c810b3fc79113685e85595d4c62d41633fa092c31fd3102102960a0024d1f460be791bdb0b19b6610604fa26d6423864e93493066f859b86b6c2693a899dbc36cf667ab5e4d8278371cc411abba846b780090c7023a09409cc4541b4d8784ba0f643aa62336551525b315d6fb7086ac604b2272333c071b23595ccabb5459b6307b59786731008b14ea142c89a066d5e5c502724bc384013b5544a99aa872d5b65e5100315f70091d9aae9d1aba29c18a5549d11aa195d7046ae51a864eb4d69192da8248300f985fb5742a8f0623859b2a7aa600fa835a0aa647efb62b9309ba89a9c4b7478a8a1086d6c955834223600b65a80342cdb6788f09b138456773aa8a2b175f477b800c2803867253b06b5c5296d8ca3a4c85496fd9b413383c0cbb95880545c168099926c175bb6008b1abd69505b8c782c9ee06877523802a936830c9e58145c6591c66bc56abe2804b1ac28394b9f0db695b15c560bf48ded5c54a47244daf089975065b8aabc77e4a6d1178ed5b503a4ca40c2584e878c5c15fb41307ac297da94a3ea7e204b8a4156489df3577d74186d5255156aae92f77512d0b54d1c1559b8866af41ec7db75cf658625f784ab26089a076ae52103ee3053acc22a21a2920c65c10ed64372380292293f494c2c663a87d7eab6ef126a4ef50002924497e70154426f8b9801b09ae930907e6284e384a1c6554b2bc594591397810b18d01bd3777534 +private_key: 62d210ecf64cdf77865b40c9b663c2d30a39bc7916c4d7beb420c29dac6e3a7a1fdcac2c68a117966c2bf4e2aec3a7895cd83f0e426cf826c8d679055773798b748253f34a873824b01153566499460bbf16b41502e97bd7a4cdeae40ab2f4372c755bb0a624a220b774345d3ebb235e06afbea95669e75dcf78502f68439a485e72427345e17a845109d816c3bee592ac82c7b27902e43b31b5460e37a43a16fbc98065125109c9aef2c8f1ccbc99ea571781595fbb27b8f26f62c995afe082e46caca8929e5c48510f05b1c6a28ba5c0c652dc0ff6e20a5a3c8d19691f0a29be46246eed49b66d2398378b1b3583656cfcc1f1cba0422b2a5e474c5f7854724607cee3955e108b93585c3794cebaeb8f6e4c24b653988a84708e3bc9649394f422c25bd88ef774aa17f8bf9bf19aa64cbeb4d343eedb0bfbcc8b07330334278aa7901f8b7810a1e49a3449bbad23cd17721a52a03dae0822a4333c6896a303c26356008aa03c9f9414b47c8137bee6922ff9160ca84d9a0a11e444528004ad471598737699ead095c4991f99257981a7668dd60d97ebae26019073657409bcb8909c3247bc7973b79882009aeb701eb82bb6b568bffa379ffcf235460143ab7a4624f797ea324e16c6757072bc0e5c95166acb3f9b30ffdb46b5b720bcb55209d96f4da40faaf21e2b9b5014d049936469a63940704947e5670310178c65f9c7ba44a6a6eb5580a0174b43595933b19eab8c4d978d29bb8e7ff4b37fa1ba4dd9af62daa5ad879836849b88678bd3549238e2674963770a657c1389b023b75e8a7262e8c97a94444fcccc63f3e4c17db97c6131b721561d28146521f3afa60bb75b0491e9f22636017f7c2587e8e64a8cf4b2d0c5c2dd53322419038e239c7f60b10c66905917c2c7267303d565fa30169904159b7a2e348cb641782599787d7c63be7a536890dcc858f7a43a7080bd3593f6da1f4c5454e745cb4ce2ac2a5051e8052a3616b9dabcbac6b5c43fc3c28fe0505aa823fd324d79f0c1908c2720b37cffdb58c7e822a48b7052748a996043c31364ab3b9974560f63e00d7e06184ae0485cd649374632ffeb64ed749e1bda052ba4c0a972c679db187a345e8c055fee4c28df4537795aca7a602a243b77499146f649226f73991beb88544ac439e53c2f060952bc5fdc3648e8b850526837b2744d0e7323a97598e01690e04c63d92891c64b9b1c962541755cdd861390dab893b3adbcc04d52f0ae193b27fc948305e5787bc2c27efa77c7b6823fa700eba383c96a119d453036ea2966988acb289a324a02272a75acd3a4551562ca894bb63c6d38b6710f90537dd007b807bdc0071a88537624876d58ecca89d27757c9acde480bcbc96ca3d338f014b6da5251d9578ded5aba69b7047f88a8c75860cb652c744571591369a69ac0118209a70b2a06790baff6c35f515811e45b9b94a9d9b4add0c898037c2988858eb15bafe5a88439f67cfd537a3070a12f40394cd86afffa967a206a5ab72afedc52acc6add22ca1e0b0816d729d68d67bf1b387eaf43461a5cd28ec6fb70ccea4828a9dc6237f04681ab4cd3e9c69138b48459769e07a3f6ca684c299bf3cc95df9656df5968ce5bc91c87487a600236bc64ca9881797b626b0881903a899f945716fa32d955711f289328c66c518539dcf9b83f241347b11210e4a3dcef1516be12f9ce514c38200d8757220b30ca95b7682eb16f7a305f6580b4a764c23470bf159846e656f62da82b8db4828f7244608320f5860d02821dcb61415249779d4941a06bb88c64fb14b8fba049960c2118cc9473f66ab577a953e283732c689506b4b4c95a4ac105aa418a144b2901180876aa4128424baa807354e12631473b8e05c00d0d505ce454bd425a0a1443aaaf92ff2237bc0f7458ea72b6632a2b8b760e377ce48ea5a60e8c4daec0670102c4c747492f28f81069cd1d64345553f8cac531f23b6556010f79b623ac6a8fbfbb68176c41d3609e73c65c1006de04804a0f2222433a2d1834dc80828fb06c098565297b815889161a58c0d187454b61a1a2986ad7e07a6edf27fb4626277892bd12051a0c263e6f94cfd388e1e32ac4de308edfb070eb60dcb5887fe7ca44ba4a39ba7bfb363c98b00b60a4c7781940bb69998032c5f6a930c1f65420b0c2bbab954ae55ca8282b1da2a61f1b111df231df1151504e9031b7b28e793109ed49d46702d25b37f58fa812f68508fe2b9efc319a1976064a648bf7a251a948b74ca3f1985c5f114033e1240bf3691238b507bf28956a52204459eae072bbe10431a56af24ac15f8b546a62c03740c16ecc8afc58871537c485ca93617a324f72991273a0549b377ac040aa12a46d366462ff7b76a429bb781922f7a5397385421424a24b366651b72c5f8870c21835e0b2949f61eb3571cdcb780db683c95e23b708889303a4b9f2b862b68a4e2614eb2d8169ecc1349d9b71b5206973487660b6e4cf544baa688202b0e8df9ae88d85115f9a183fc95265608661993839914d9926cbac8993013c59e979aa8444a54972b99257542e4adb869cf56dcb305455bfec5bcf64137b72b2a6c9b0dcc6c386ed616d6a25259ea612e89c21a170b64e379458b0abd725dc8f53a55e57604282dd474c4ab30c4218a32b4183f0df24475d01fc9f8550b0aae3990bd414561463a023445bd23c7c321dc80eff509a6155cd6b2059fca448ce05d1f0062f3c21849e38a7a90bfbf15b192265f11b5bef91a6bcd0823e2e1b414750e057583401b3a5f140ed7bbcb87bba4b1aaa1aa75a911dac26298a7b9a1830a48332f139f7a4a12a528b9486197999b5717cb8552b38f7f759becd04970eb64bb4826a5cb47bcfba7cc46ca17039f1da30dea436de4b6ab76f43c06d1a1db65a9001a1e0f510d7b4755137bb4c08a710e9a9d7fd8cb32d64152c0b85f40b9cb433ed1d7bea1821c6881309642053f993739e3bcd38951433b291ea26f0948cb2dbbacc3088d58d42de008ab581b0b3a9341ac18c28b131fd4e49964d72d65658c684472550a06e68391f8d34bc09a2f25161745c74d68681c3b333ea58c412f68b44d066e33cb7ed17253fa655603dca0de7a13c7c0c78c9630f5c57ae925ac97a823102c423d0b7a3af864c7a95885e574d570895540a3793b3cd0c73b5a21660b64577d6b146e888a113bc44d78c175aa7ee72760f3b62ed7c971ae62a3e8f08ca4ab7daa43c51a18cb72158de398326589241f07a9e78bbe0c4cbc5dc388b03a7c131c885fb63841445469c42501d198d114c31da36418985ca5d95196fa12b59599f90750e4567a76a767547baea91c6580a628c3c052c3c8bef8755238c2b31d52621ea5579b649f6328695af62aa8d28402a554941b11baf7b54ffab7bd21918a0a6d6a368516b4a04354b6a922901fb8a0e9bc9f7713b977226bd8477d5c7088b8b90afabb61d0b32de98529aaec904aeab8d0240bcf114c5e3a2a44f0043b628f03fa04addac64c918916a3031d6808104539275901c8d8cbf17741a6e185250c7eb9379de46176d0b6cb02621f97c083b8fc1dabc9a0cafa9585aa848606c9cbc58b96da5a8f414bc9a6ab4d9811cd3b3b512925bb5b352cb67f76c810b3fc79113685e85595d4c62d41633fa092c31fd3102102960a0024d1f460be791bdb0b19b6610604fa26d6423864e93493066f859b86b6c2693a899dbc36cf667ab5e4d8278371cc411abba846b780090c7023a09409cc4541b4d8784ba0f643aa62336551525b315d6fb7086ac604b2272333c071b23595ccabb5459b6307b59786731008b14ea142c89a066d5e5c502724bc384013b5544a99aa872d5b65e5100315f70091d9aae9d1aba29c18a5549d11aa195d7046ae51a864eb4d69192da8248300f985fb5742a8f0623859b2a7aa600fa835a0aa647efb62b9309ba89a9c4b7478a8a1086d6c955834223600b65a80342cdb6788f09b138456773aa8a2b175f477b800c2803867253b06b5c5296d8ca3a4c85496fd9b413383c0cbb95880545c168099926c175bb6008b1abd69505b8c782c9ee06877523802a936830c9e58145c6591c66bc56abe2804b1ac28394b9f0db695b15c560bf48ded5c54a47244daf089975065b8aabc77e4a6d1178ed5b503a4ca40c2584e878c5c15fb41307ac297da94a3ea7e204b8a4156489df3577d74186d5255156aae92f77512d0b54d1c1559b8866af41ec7db75cf658625f784ab26089a076ae52103ee3053acc22a21a2920c65c10ed64372380292293f494c2c663a87d7eab6ef126a4ef50002924497e70154426f8b9801b09ae930907e6284e384a1c6554b2bc594591397810b18d01bd3777534ec53d050d5a81c049eab8f93e7768c39323dd805f12c6553c204d58cbc47d8e8b9402bf02481ce4b27a52e87feb92c4399c7f2988d40e942e7496ad15ad2aa88 + +# Official test vector 55, seed: "467f6158cb86b724039ff18c47950ae5c49170163c910fc9a9b30141f86e9c06ebcec91497bcd156d95758c9f0c6ef91" +seed: 2107204cd995f1df14314d5381f8c5440f09a347502e161cffc0a2ec3dcfbc7324c3da70fe850e80aa818301d60c70f3038153866dcd5d179e22db59b8991bb4 +public_key: 059a381bd53c19d170642535f7c56a2f6bbea8b824a81339da5945f7175d08c69784e67d5e079fec9129ee799a1860ba58485ed631cabc19ad60934c192a27f9266bef098ce2d847407826afcb0ab43057008339c534b9e19c5a3542b40a3a88d41533b346754fc09fce920ed73b2fd7048e540bc9af49247122771fec129bf133c3c3711a679353a9a0ad47c4094471aee9619eb58a3831bc60257e07d09def864638498d3a731f24a814177801ae900b5fb6cf3374320a261d57c170dab6a473c86036733e85f290c9aa4cf7b56011c61723839b1e7c629c7cb5f4e4bcd1d6c9fec583d4b78670fa7a53f65b9fd0a91cc6620a5c1129339ce2a93a66618c1ec69e584a0e9c283993268fdb1c8ec25669439472d409447b6a04cfd699d167252c29af53eb27f6c3950b456861b7ad273887bcb3b41e75bdf2962b604ba62852a92f7b192cca7391accd0ad0bb65672e66317ab82bba06766917455f7fea8af660cbf6e3103f7a60b9736bf897b3a53c9be798ac0c493911b835b4514f3e095a49a474c0c907987867cd11ae24d22d20ea24ba028f02d1b295605270c00c732b1c19658af0424f2b01b7c4b8896e6706ed564b87f21afb1208f9f85e1b40244d622a5aa461c25b0319567b7cdac03d9bcbca028ab108837150a6426138b1073c348a1de7eca92acbbc0a95aa88864d734bb90cc8b8dbdcb91c4c333ae46dfd8353c27438abab8a60572d19c5bacf6b35a50b86e80a7b9b44bc74f74b050c2d6965298d33150c63c7a15150fb66082c851637568c2e5a9952e7ad62436e8401a0545c6415a948adf1449a51779005bb08bb75fd518c2dc02ed5c0b63dbb35a37612ec44b2a04a3d3c15414c0193ef5c09aac62d1cb212bbc7bc7b380bc88a37ab103d872605ba7883cc0bc83a20b2ce28a31a3b0bec216b7b1419bca5425e255b25a86ddb5ba95900c108f036a9ba2e941a1966b225b03cb7335901e6d32613b54806c0c737984da16284ab0b4594b0734fe5c6018c047d238fea777538d49992992d1a012f4a65008554405e3c0bf8d386c2eac5e07470d4d6015de45b3f99cc1b9b6f8e459e9987b773d69e3783b520d1282b177edd9c631bb4a76052c8eaa8aa1bd62269a2b2d7a6ba35b1670d27be1eab28d1571054a67e94ab3adcca05ec609b5171a1d4ac1b3a2876e33b7218c7b1a119812479c4974575208540a0831446a7be7ae0150859ad521a0d891b7a6cb9cde236b48868c30ed26391410548eb21756c3d9efa564df5780ff7b1b1f830bfbb70ce7181df82abccc941f1d79b6db3a012d5b7ce5b7ea9ca24b387cbfc34400d47200ba07d5f82c28991b289f56361f31330245f264149c9567feb569f4e2c21cd9b80a10a1ace3804b899410d912d42a9ab68b76c2b4197ec5aba066453fce1cf04d2a315961126cc04fb63361e137a258832679865cea937cab03534746918080b1b92cd099622ea137e4d6b0b30d18ba27582775398027bc54fa09d7a23655655c491f23181816d45437be2892eb73958b56899f25b3e48874434f12a0052518f3caf11215df0bc3265d648935a68806a75617506fce900de0cb07f7686223b9990719af5252ac61a6c44a7655f54585abb4d26e2ae5192c2381009b4796c87097c2657095ae03b924653bffaaab6b9035d176fb34184e58227a64059f54b44fe62a68c7a0e798362de1966db1a982ec3af25ec20f3824cafdb53cb526f055bcabe72a9e807079046b57eec2f681ac8ebcc0734a71ec65224e4a80244340ea1d339e44c7e2c5717208a034e9a6791888c9968987e710fde215207eab3f38aa49195190a885fe75074e17920ea64b6fa077336aab211fbb757880dbe36247299bb8f65c132e48c54d47eccc7aa124547c910831bd98b07bb1f435ab7c96a4cb9b46b36b6b667da4eb7cb2a12f1bbfa88b98f3c6c3704be3f000f65562d7d4c4977ac8c98ac44958c28f65280ae68466f6b7495650cde4aaac4c68e07767d09f44917b29df63352dcd76c1e393e0d5067c76855a989b04547a625762c730624835a6636191c83d3836bf74593839a83847aff3bcb3ab169f65000c6aab1df08994e161861498fa2e42d1203786300adb060a9c2429bc7325eca24279404ac3c934ebed4991502bd669309e7a76cf09507b31fbf659deb7bb881f5358d70595c01fbc7ae7183540b7883122d67ba +private_key: 08d1b85a3b6262a96eb593935cf9aa02b2738496441be27303da5e8a5badb4c23fd7c2873c28429c7778a3f41c430786dcc92e41d41ab97028fdd1a87914190b210a0a108c74c86597f280ae4195b39a00d7a35a210b80d15c1aa54945887634e7db73de2945355227b86970bdb0abfb8baaaca1be8f4382e36c0c3bb972f68a5d7e089ed430c977d4836e3a18116584e1c860c99277c00b51e6480bd78004ad660bd0002fbc4b04eec53def499da022741d96ba4277a2ddf1ae2d309cc9cc3c76c28baf0180b03b4d5751572c2253e5e033114a81580b960059b6cda77a06d990d2fa285d7694036b3c714acd7c80a6e7a28d8ba01075b65772e65843e679702879e4d77fa61a7018da1d14b6664b0133506bae1840a6f2ec8897eb72e22874ce275ec4a81dc1714343d31a0e99cbcd497dfe5376d8e3caf40683f7491f1fb85ef9a43587e07d21196161b831b0020c643845fbb26101389ffc83c88de29def6b550b683d374c26883c4807b51a23110ef6b8c16ec95e0dc03f7fb6a8ea09a83cc4a82ff4c7e407271acc2fb3943a3b0a1571d1c060d80977770d0bc17ed94679381984ddd7460f782a8a596646a49c48e59b0890a99768740f1c66d58a7dd7f88f27dc4f41b28db4bc240aca187371110ed39871ccaae2972653db394312793458208a29ce6a676498a100a5199ec642853e4661247b0fcf60a218f424a6831eb2488300542f1f354863db3e32878758d21fea35b06c79787851a61da1786bc45008085e87eaa72623cb41a28200ed0b4cb86e77f510f4507c6c321891d455842750e933967890ae10e91b0eb5b23789ce5da58ee120b965d20765830f9c4079a64848708a51d1826ca3425e0ea31727107c2ad28d1e8b0a6559094cd5c000c271e70b98949359be468307526f683a32df61aba0821efdc289aa273a9166abfb4abdb6c0a66cd444f349c8c2015ccf5cb3f72a561cc37bfc210f8ee4b0b89873b67506766383d279a2f1d28077e91f6b4ac289d3bc3934766af53d2f238ea8227e9e9226b4f7a8c47b8fc5874dd30c51a1d61235bbb5ddc7b22511a776359ee18842e5b8341ce045f6cc9ea6922a0bac7db004217c0c234b52c53a33c03c8b1990f29fb2816d7aaca9f633495ed0aeeeb112f180b2d740b550550d8fa56b9ee659420a3575ac40c3d2041e01be4e58824b2bc85685a5bfc7289494175b81626c7b88530bd031c68cae15a76c510310b161229cac449ba38809be3446734a84080473c80a58c3e1a56ae49b2ee802a896c3c051d92ee2bc7dd9478e5954ab98202a2403ce6bb3660e20c4de2c54289963f2cbcb692349a8a7b6676413105923c6c30a557c958ae16c03d7817a963230692ca16cc8cde66a8b0a01b0d63b58d76b7d76b078db1351931f0c23673c275a9fa87fed1a758b9302d8e65567ca508452b3068a9f3eccbf53f44cead8103c3b0d5df16d605b7ff9296434692b2a8c079be8659cf507e8d59663e6116ac03b43f54528427176a354420212f9208abbf933679c9c302c39fbf777bdb21c197065fada38b9797586e61327565e40113cf5980a32936b57ab0719a837d2a394372230d9f03a9aac0c8cb6c5491c7ea371bb17740bc76b851d77488c3b4c21d9c510b49971e11874ba9c46e3af7b555163339b3c739e4349291e931bb2c9cd86fc44f0e1911c08864cf3bb74b3484f0a7a347ca8fa335c58a2ac4687a33787c1b49b791c026c7d4b1adcf13b4c7a51e705c1ae114e527690b2713234d089fc35b880027215784d27e50e6a513598ea7a47bbb574a31d872c3549d307850b80dfe04350b814a297340fec56662c7131d99ae573800d0669ba2b8570119d69f30de12535cf05acd9e8b66215b6d2979ea7a64c25941c69c61400a62af40412fbeb1870319b37bc75d9292e2e6a76659c87e22cbd01fab946f1c855bca6d3d052ce42659c8c98d53674c83800d1776279a494c44617c281631dc9a338545f14fc1b7b7b407944786f8c25f69ab5e50c5d4d6315505c5cf03bc23b454d2427501a13c813cc11cc76681b90264121aea8594bf087b474d821ea102c7014a796429a05d38a1a4b8e6ef8504591bee10a3a7fba19c9d8122c4c66503462b3a14e99144257203f76ca484fec606ca158a8e29d944760059a381bd53c19d170642535f7c56a2f6bbea8b824a81339da5945f7175d08c69784e67d5e079fec9129ee799a1860ba58485ed631cabc19ad60934c192a27f9266bef098ce2d847407826afcb0ab43057008339c534b9e19c5a3542b40a3a88d41533b346754fc09fce920ed73b2fd7048e540bc9af49247122771fec129bf133c3c3711a679353a9a0ad47c4094471aee9619eb58a3831bc60257e07d09def864638498d3a731f24a814177801ae900b5fb6cf3374320a261d57c170dab6a473c86036733e85f290c9aa4cf7b56011c61723839b1e7c629c7cb5f4e4bcd1d6c9fec583d4b78670fa7a53f65b9fd0a91cc6620a5c1129339ce2a93a66618c1ec69e584a0e9c283993268fdb1c8ec25669439472d409447b6a04cfd699d167252c29af53eb27f6c3950b456861b7ad273887bcb3b41e75bdf2962b604ba62852a92f7b192cca7391accd0ad0bb65672e66317ab82bba06766917455f7fea8af660cbf6e3103f7a60b9736bf897b3a53c9be798ac0c493911b835b4514f3e095a49a474c0c907987867cd11ae24d22d20ea24ba028f02d1b295605270c00c732b1c19658af0424f2b01b7c4b8896e6706ed564b87f21afb1208f9f85e1b40244d622a5aa461c25b0319567b7cdac03d9bcbca028ab108837150a6426138b1073c348a1de7eca92acbbc0a95aa88864d734bb90cc8b8dbdcb91c4c333ae46dfd8353c27438abab8a60572d19c5bacf6b35a50b86e80a7b9b44bc74f74b050c2d6965298d33150c63c7a15150fb66082c851637568c2e5a9952e7ad62436e8401a0545c6415a948adf1449a51779005bb08bb75fd518c2dc02ed5c0b63dbb35a37612ec44b2a04a3d3c15414c0193ef5c09aac62d1cb212bbc7bc7b380bc88a37ab103d872605ba7883cc0bc83a20b2ce28a31a3b0bec216b7b1419bca5425e255b25a86ddb5ba95900c108f036a9ba2e941a1966b225b03cb7335901e6d32613b54806c0c737984da16284ab0b4594b0734fe5c6018c047d238fea777538d49992992d1a012f4a65008554405e3c0bf8d386c2eac5e07470d4d6015de45b3f99cc1b9b6f8e459e9987b773d69e3783b520d1282b177edd9c631bb4a76052c8eaa8aa1bd62269a2b2d7a6ba35b1670d27be1eab28d1571054a67e94ab3adcca05ec609b5171a1d4ac1b3a2876e33b7218c7b1a119812479c4974575208540a0831446a7be7ae0150859ad521a0d891b7a6cb9cde236b48868c30ed26391410548eb21756c3d9efa564df5780ff7b1b1f830bfbb70ce7181df82abccc941f1d79b6db3a012d5b7ce5b7ea9ca24b387cbfc34400d47200ba07d5f82c28991b289f56361f31330245f264149c9567feb569f4e2c21cd9b80a10a1ace3804b899410d912d42a9ab68b76c2b4197ec5aba066453fce1cf04d2a315961126cc04fb63361e137a258832679865cea937cab03534746918080b1b92cd099622ea137e4d6b0b30d18ba27582775398027bc54fa09d7a23655655c491f23181816d45437be2892eb73958b56899f25b3e48874434f12a0052518f3caf11215df0bc3265d648935a68806a75617506fce900de0cb07f7686223b9990719af5252ac61a6c44a7655f54585abb4d26e2ae5192c2381009b4796c87097c2657095ae03b924653bffaaab6b9035d176fb34184e58227a64059f54b44fe62a68c7a0e798362de1966db1a982ec3af25ec20f3824cafdb53cb526f055bcabe72a9e807079046b57eec2f681ac8ebcc0734a71ec65224e4a80244340ea1d339e44c7e2c5717208a034e9a6791888c9968987e710fde215207eab3f38aa49195190a885fe75074e17920ea64b6fa077336aab211fbb757880dbe36247299bb8f65c132e48c54d47eccc7aa124547c910831bd98b07bb1f435ab7c96a4cb9b46b36b6b667da4eb7cb2a12f1bbfa88b98f3c6c3704be3f000f65562d7d4c4977ac8c98ac44958c28f65280ae68466f6b7495650cde4aaac4c68e07767d09f44917b29df63352dcd76c1e393e0d5067c76855a989b04547a625762c730624835a6636191c83d3836bf74593839a83847aff3bcb3ab169f65000c6aab1df08994e161861498fa2e42d1203786300adb060a9c2429bc7325eca24279404ac3c934ebed4991502bd669309e7a76cf09507b31fbf659deb7bb881f5358d70595c01fbc7ae7183540b7883122d67bafbeea6f8085943992ed8b051cf758a8b8166c1a1e5f818f0deb30fa1fa06190424c3da70fe850e80aa818301d60c70f3038153866dcd5d179e22db59b8991bb4 + +# Official test vector 56, seed: "687c02de1041abac7b2c1e6ec2a7c3375552ed5edb10e3a8139c24cc76bda44d719d8121a81d47a0b762b4e9eeb85235" +seed: 63a925685a8ac5bbd918faa33ac397d1ffbcf99135d9da7c3d6ff7aa4c50af3d3afdb8a246a56ee71465591831c371f2eb87467b0559dedd776ba063ee6d2f93 +public_key: 128a170837c0c51758a801316881c56d436839e5778e79553d97c6c48587bac980e17632f7c7af3de5a9b15ca6d33626254a9e83009442289274a4c860f42c86d8060b2821c873aa5cbccde4540a8e5a6784ac15e6b30cc71a8de57a83bc5924d0117bbfbace8ad5cdfeca785eb224baf8361eb64c81453fdeb54e4e86ab4a397ed6e84b9ba73a0c4b8b606318ccdace61b70df22c4518f463d8342ba6faa846eb55284995f36a7467385bc8b77689807ef511122d12066e12619e37c8ad0872d5710083a2b9dc7107c955623cb209139034c9b3c6cfb7b3133502621662a61bb63b9c3a4586c2201516ee6c3f2d25026f932fc13c5426d64093cbc768985fb8f70b6871755f8811c60a4317a21ed8b5a7e51c1784b562c2a244065451e22935ba9c3ca6a63dc945ca37489e317abbb02c9e87b6b7092b1b4049c603f087d3596169baa2c6e3a778e61ac5f04962b61aff07a70ea72800a0143e9c43f2972908a27e0f3b627bf14841693613711115bc19659c5b3db6bc19ab7be40c24d5887d93e6b7d31899771244c756790ee881fd605d1383409d608fc1a10d6f2511ce815361a66db6244bffe1b61a46a888a06f3260409239abbb9c717d76ac4d658e728977c9f09bae86105d796f0bfc4b87385efcc791aba5169c679dabe34e1ee44ea66ab3d58724c3e7099bd80a9d52cca8ba95f9699c3ad8c90199a3b9613cf9652a79cbb93c8c949dfb0a6a7a1fc5e4a6032247b7885b3843a7af4c7bd49068228875a002321530bc6b5076d0853be448a8a85a8be09b94e5d65d3bc2194a977396d71924bc5b420aa6283b7ed9ac822c27641c811777a8550168468892987e936488d71c9af0a8732b6ac23acc23c2bf8719be59b23aa96110ff02af63858b7405482d684848d83fbf3b317217be6bb750cae74df77a8dfd32539e8964b764a100688301ac20a95306163ca391d33052e7488cf27d4da5be786caf99e294ba1782d462c446613a15f97e9f5632c524cbc0430382e828560315e6bac00b35c084740dbf159809849f8e104eaa28abd5f6978f071d53279c4689c77c43c0b649b8aa042a9c8ca968f28c81c211f8bca19269a9d79985478707489caf7690b529b988471b12523405db659014138d9a6133171c68961a327099477759261c523f9ba6a008d3c14b0a02295902637912bf1230a8b763ae397f805c2cfb4228776443645274f5c01515986cdba31285f9c72fe7634c0b44a42150b1dc75d8cc512d503b3ef7487371b70d50b9650360f073936398356cc3419f1225a3946a61bb38b2e61f0ef85d1686a29e56192d8a26d42a22f274811dfa1c1c4cbfec8323880523288805ac98000944b667346e173611fcdc3d474b0c30b0620f69b3d45321d9c91a130cb6842659a6a0904ba598ab706336417e17607e865328ccb035bd0646b023c3545c2b437463cffa14dbd86ee12b8ec24375f5b4a3a0548eb9997030ac092a579bcb6a0a984c9f354312931c653242678e98502a519d15e64597fc224101cd9462ace9ba56c421b692668976b3a170d88c4501147e6c68ede8a29fd4951d32ac9dc06f700cbe9b536a476736b1eab14e2493c5a94a07f6ab5a323ec3e9b9f639258275523fd32071739b585b5d8657aa502262700998f0c5ba71974c35573f14c13a70842149c077624737e5a06d52863d63f815d57acb4f0142c9167d2784365ed78c9f6b235c7368f2b26dad962e05f2279ceb44784901dbe87e413a04f462b4395b5e2264784c2ba356935dc1ab3c104b6be09b08941a02512055a1d70ecdc281e09c78214a0e57f2ce035947229181b943c5380b7e6f804fbc815a1f3023e4aab03fb4b0e2c459f58c348249adc6b4a5474622c3262b11814acfa872bb6c79b3614e3ad2a1516a0b0dec98f863cac0b061670ccd8d0c6f7eeccdac933bad47cecedac3a5231ef1c040aef8bc53025e0dfbb3d5c6cb2ae96f11a05dcf8885aee9756a13ca0c1280c4d331d50b850b6c00999360dc585e1d849114b13f3849b361f7083b5b3db470796f5761f7641a89189c748b4f6b88822ec85b04228f04a669c495af4c091b54a3835b379201d9c7273557f73c1e357588b68baf3e2a5c88ab0e9e057cdae06ce672c84b2a04503372c0f370d114ae10f97052fb3ba450d323fd3bb1b887fc4da6dbfef06ba5a2d5344feede346d1f04ad60895ab5 +private_key: 59985866133caf531409205b859b9783cc2cffb66f52973ff226822187c58234ae920a4cd64665e6e60ac668a793052eb07981fd99c6592090e2286f0c405308970ddf93857e1c8f202173aa886fb54c242ee64167e9188c797888d1ca74604edf6a21f38a8787b5ca07b49a7c491c240050d8eb234d891a3e120165bc1bdb1800b7b32c254900f9e36e40cb55b4d2b366d99f1c86304f6a970941bec4d48905b33fc44564fdccacd60993352a215daab12a93417d51a3db6c9aa1a0c9a7d7b4a2ea121cf483090bb855048cbb6c4051140744919e4bc651b5007e8f3893c6ab6d745334918a2407a75557ec6b2db1cbd819509958c255776158f4ab1be64e3e431efe786c8c941ad91936f1e37ee396b8609b4e0781ce842c312b1ca70ca80690773455421d50f49401a16fbf47192ca7649e3989e0546a662a84e1904d82133dd2fb83ceb959f33c3e9d46b69a107eb133be1297749386ba7cdbadeec0508256b126f801138a17a0488cccea64a0238384ba53aec7b342c247257c5fcea471d6123c942b312b486438351ac4b5306c6699bd868087348de8f22f7f714ba3b74ba9b9c63a9098e45c1e37f2a4db9c5b9a8a9f662a2f3fb1bdcd48caaf1b5f01574db0712a34429a87690639fc148f984434ba7e35173f924a60dd70208d74443921ae4805b03c77bc48bb7b3b0964e9c743d02801b7a727025a79104c8eedfb80df6552f7038a373283d7a38b6ce430dd8b46ce067d0b699ee27b1690538541d28742a125bd2bc801a660410492707abc70725661f16b9ea10e7fba2da2d256962887c2a12d282907220456ce8a82ec163a54c97f4b7a9392d004a64731ca6b883c94a836e0539db41e36d9471cf13c0cf343ad250d05a26966898505a161a5910132d747fca047b5489a32245868778a68041b6b7870b0730afca761e640059d200f7a8948294991e6954e48f41e5f039072337aa5f2b3ec4bc2f1f12eace4ba397230861773ef628d3f13654352adfcc7c1e91510e22a4d0ad799c94a889562145f1372ab85bae981023458ad1bb9859a701af2c2149803058f435b4bc18e8a62c68c355c8b8450dfdb345d47a2585382e13c7d2f9a8adafc4643f642d4a463abb34c25341545816c169527641a63d85c0180d74a09b070b182bf0921ac8f59c5dc194ef8b93a0235cad649b781c58037e6153128bca0699d0b9494db44407f5455cb013d1a9073de80a128e04cecbc639c64898d022f3c0b514408c8035cbca60c4eade1bc5e9873ef1612890c0a253a6c34f0cf9f9cc8afe65737523cb83a90de44847102ce96956cdc988448f7134ac791fa44c0bf760e07b05482fa1443e72505e1b2e4e73f6bb775c3a1072bd62452d7994056101a63467da7511572142dd703aebb4bc4723988c334f4f71baaaa8ecc764abfa43273eba82b46b53f2b0f59f88cd2d113e49b52fc740ea0a5026be88739aac300e2810379027ca3b5467413b3484578062aa6b01fa91186bae66d3994cd41c191cae212a546354c7bc22d169dee7132a8c53fb6dbc4e81ab5cff448f5e7acd9c5bdec7c61b14a8671e45305341a4b8416798138a475154000b1424b4c2579a630a0968dfb7595c92c42292c5798b6ce4693c7566877e2725dbb5871c51fde7b2022f28674d11d5c86c0a1874099fc192af6b4cdc50843131c232c59e6e48a21dc1b8926b40375b6eadc7f11a8713e08c0a15220001469da3a84a8a802b2737e596bacaf674c29d72fb1d463286cc3916b064e076d53058a5f86118506cd99e8372996a8e32a36ceb31163694bbada95e9c36f02851d379a3522f638f737723f2b840663a60d2a8e25d49dfa6670b997b361394e9db653b269c352e5135adc008ba82cbae431f6440c8ad9774c181dc0c07b0e0a326758bc536cb94c0c4d3e5490b6f7158c93a1b93915cd70bbc78631d9d8a34bb2c383ca2e1a59859c51306a50b8da12c41467c6a89cb6e4506d1da5177b2b443c644777a74e96f65913589582a8c7abd99876f48efe540cfca7a88bbbc7784c2815fa82d3f17645fa632017c4004a5846503c9bd629850438d964892d0208b67903ddfc5476e50967a665b4b90abe8795c7a234b2759826f9b1ab846d5f763007fc93107b1efdc7a2876488b19554d4d3a9f08b82128a170837c0c51758a801316881c56d436839e5778e79553d97c6c48587bac980e17632f7c7af3de5a9b15ca6d33626254a9e83009442289274a4c860f42c86d8060b2821c873aa5cbccde4540a8e5a6784ac15e6b30cc71a8de57a83bc5924d0117bbfbace8ad5cdfeca785eb224baf8361eb64c81453fdeb54e4e86ab4a397ed6e84b9ba73a0c4b8b606318ccdace61b70df22c4518f463d8342ba6faa846eb55284995f36a7467385bc8b77689807ef511122d12066e12619e37c8ad0872d5710083a2b9dc7107c955623cb209139034c9b3c6cfb7b3133502621662a61bb63b9c3a4586c2201516ee6c3f2d25026f932fc13c5426d64093cbc768985fb8f70b6871755f8811c60a4317a21ed8b5a7e51c1784b562c2a244065451e22935ba9c3ca6a63dc945ca37489e317abbb02c9e87b6b7092b1b4049c603f087d3596169baa2c6e3a778e61ac5f04962b61aff07a70ea72800a0143e9c43f2972908a27e0f3b627bf14841693613711115bc19659c5b3db6bc19ab7be40c24d5887d93e6b7d31899771244c756790ee881fd605d1383409d608fc1a10d6f2511ce815361a66db6244bffe1b61a46a888a06f3260409239abbb9c717d76ac4d658e728977c9f09bae86105d796f0bfc4b87385efcc791aba5169c679dabe34e1ee44ea66ab3d58724c3e7099bd80a9d52cca8ba95f9699c3ad8c90199a3b9613cf9652a79cbb93c8c949dfb0a6a7a1fc5e4a6032247b7885b3843a7af4c7bd49068228875a002321530bc6b5076d0853be448a8a85a8be09b94e5d65d3bc2194a977396d71924bc5b420aa6283b7ed9ac822c27641c811777a8550168468892987e936488d71c9af0a8732b6ac23acc23c2bf8719be59b23aa96110ff02af63858b7405482d684848d83fbf3b317217be6bb750cae74df77a8dfd32539e8964b764a100688301ac20a95306163ca391d33052e7488cf27d4da5be786caf99e294ba1782d462c446613a15f97e9f5632c524cbc0430382e828560315e6bac00b35c084740dbf159809849f8e104eaa28abd5f6978f071d53279c4689c77c43c0b649b8aa042a9c8ca968f28c81c211f8bca19269a9d79985478707489caf7690b529b988471b12523405db659014138d9a6133171c68961a327099477759261c523f9ba6a008d3c14b0a02295902637912bf1230a8b763ae397f805c2cfb4228776443645274f5c01515986cdba31285f9c72fe7634c0b44a42150b1dc75d8cc512d503b3ef7487371b70d50b9650360f073936398356cc3419f1225a3946a61bb38b2e61f0ef85d1686a29e56192d8a26d42a22f274811dfa1c1c4cbfec8323880523288805ac98000944b667346e173611fcdc3d474b0c30b0620f69b3d45321d9c91a130cb6842659a6a0904ba598ab706336417e17607e865328ccb035bd0646b023c3545c2b437463cffa14dbd86ee12b8ec24375f5b4a3a0548eb9997030ac092a579bcb6a0a984c9f354312931c653242678e98502a519d15e64597fc224101cd9462ace9ba56c421b692668976b3a170d88c4501147e6c68ede8a29fd4951d32ac9dc06f700cbe9b536a476736b1eab14e2493c5a94a07f6ab5a323ec3e9b9f639258275523fd32071739b585b5d8657aa502262700998f0c5ba71974c35573f14c13a70842149c077624737e5a06d52863d63f815d57acb4f0142c9167d2784365ed78c9f6b235c7368f2b26dad962e05f2279ceb44784901dbe87e413a04f462b4395b5e2264784c2ba356935dc1ab3c104b6be09b08941a02512055a1d70ecdc281e09c78214a0e57f2ce035947229181b943c5380b7e6f804fbc815a1f3023e4aab03fb4b0e2c459f58c348249adc6b4a5474622c3262b11814acfa872bb6c79b3614e3ad2a1516a0b0dec98f863cac0b061670ccd8d0c6f7eeccdac933bad47cecedac3a5231ef1c040aef8bc53025e0dfbb3d5c6cb2ae96f11a05dcf8885aee9756a13ca0c1280c4d331d50b850b6c00999360dc585e1d849114b13f3849b361f7083b5b3db470796f5761f7641a89189c748b4f6b88822ec85b04228f04a669c495af4c091b54a3835b379201d9c7273557f73c1e357588b68baf3e2a5c88ab0e9e057cdae06ce672c84b2a04503372c0f370d114ae10f97052fb3ba450d323fd3bb1b887fc4da6dbfef06ba5a2d5344feede346d1f04ad60895ab5aaa698c34e1b3b6ef69049a883160c66533c8a65249aa35006f003d4eb4350a43afdb8a246a56ee71465591831c371f2eb87467b0559dedd776ba063ee6d2f93 + +# Official test vector 57, seed: "4142237070c216bcbe245a39bd9220533c97651d84832b26727855ad994a0760c52b9319ad404693e4248b8c5ff324b3" +seed: 6a1aee5e708c1b47f02bdacce4f56c860f74fc7cfec1ef3b58285b1c8ad7fec2230e05b7114ff0395cc6634db1eae8258072d09c09f291e92d6620b177dc50d7 +public_key: 2ce082fee023e6c49fe0381cf056ac1bdc95895271f4e245bdc98ee3a87f651191832b224b3c5528562f9498979c4485c3206eee0a6f5cba8fdaa70dec105bedc40e4c6b667d1739c8580f2d246371f415411c803ae0b52f0b5a6cda5fc3340f1bfa10bb29accf402d6f06472c14cc52556e5a97b56c190eabe6817985cc346baa02c76afbb6b6dfe33f711c78896a529656b4abe25516e448bcb41dbabc340ef4b483b750b0180f68ec0020271a0e9b9f466a4728c19bdaa426fb82294ca00261cc0c3349b75d397674644ae5ca363774abe8a290240abe4039a7e124cc894657c9025e1534b91b896eefd3af2d559da9f8558fa7774708a7fd535580545bc68c9cc89ccdbcc78ed5203ffb653965e7b0920574b7907443b9931472cf19c17dd18ab87842c853462366646881592ec3f5cab67b7e768472a08a43681120f491bcde05a9805c6787b96ecccb05d7d944fc858b5ec3828859234da88d8d00542b104883e824e7b630267111e49b1bb5e4103ea9ac2b187e046b4cd109709fca26af813440f30318dbbc34598ee5dc2806794c4e0a8c6b9c2310c34636088da92147d6b32a7bb447f50b898c5a3e5cb43d6e3c147ad085652ab9edda72f25b7bf250ac84d1288fc188ba645d88333b65b1150722334b5616429b608a0c93d0d946c15576c82093e0b263bb521d9fda997a461f1ee47098861feeb8b557b4656cbac57dc61fa9510bc1c95726b561a1ca4000f28a5720c42eb932f1ca8fc9b647d3740117ebca3d5587816bb48cfc1cb4e9caeb7834e1814a7c478fa052640af253371242da9575c2a66bd01c5fca4b958ea437e6474301069d0ddb254bc4603d3ba5b7415a96e5327743662caa7e08f608be974341b70db77a850b2c11e3b4cc6525808238cb097611e77cc449f17c63da122966394e79518fb6022ec470e8c5082a945c73b52f05c38e2dc3419af4080e890a6e819bb1b301046057e548894f511989a40e854aafb62ace7e586793921e292cc8601181599977d9fa457aa2039b14488d5698a8f03df1b56479f9109ad105b028219b3c90adac962369ac1f0043373bc243286c24f599de3a28684524988198971c1f88419ca09b3e4f22b64a221df8d32afdb0572ba62c7387235ee2752903535c9c912ae30c9151a3b6c415d59a4969cc432d088196f22c518037044236eb441438acb6bb61ca45c947ab98a53b44c48119135f776f2aa4a8413a1142cc4eed8c2948f8ca5db39388dbcc15c12d13035763a57c523b99a1912d0fd29b952776eb03aeed697320c66c0f65b369e13c7eab1e98b281e7b17cc2cb9ceab725671bb5df0933eb5c70a3d39e0eb5a55cc20af912af87cc23e10ab77a9c9755201ec393b523f51d5307b176f05fea16a2dfcac794f834f60a712f13ac8d5174d3a7627ce66fb862497cb95e36da3f486c7432e5983c2cc8cc3a7582a6b22c5a7ab3bc5107c831af145fbcf74ef9523bc7f0ca5eb97b34a3872b9870eefa3fabf609475c46b1e736cff313f046b6050c13392571f2d252959aca2f8418f7489809ea51939a1e8192bea5719262208109b37bae2424ec3655ade90a9ca235f69c8a3be54793655a9e8c6e9c64354a842458067295f08b6ab3b938e6b188bc252d4569589282eb703f0cb237a67a779d8957c4602a9bd80f266303898acc60439a975c8e9d8342f6f1a7d6c92f11606435878739d3bd27460fb5e735a73cbd1cb6c657d0a6074633de38647035b54bd10986e4573e09820ef56fd8d71ee778822f72194237c0b5344cd8c888f12bb34fc86e6147161143365fd45960396bf45a8868176c7d0c440fbb71b8c6aca11b6ef3e33484f9bc22d090011918c3525cd0f0724423bd1e1c2b46a66552926a3a6a0389410a3e5c41d66b07c1b41c645787e8503c613343cc73066bc85b028025c3bb6901e33e242a0061e001ecbb7ac690837b02282a457ccae40dde98934bf37dbaa00dae287fa0a628c42a66a7e05a6645b244e909fccb6abf0075bcf0974b97099a7c67a2c71090c7bb016210d0ab69ff775dbc47206429b347e6749eeb3e23983759a583e08b1653cbb5ad4b677f9b9b365287c1b559c199c3945653a3bc7b0da8b41914be5b411268080396795f1b95ae14871397e14f8f3bc940f00d669886668c2dddebf98e5e270510db63b9982ef818d1253d74a644fd56900607545ef8 +private_key: a1ea441afc0440b20c72e1b094ec44783325ba58a537bb2ba389b1a8e111fa85ac48716072d2345d789b2a9a07519506cba99aa60932f0a112282531a4123c99b8b4eba967f8b82b9b81c3b913b05cf51dd862810031aa7928242ce7b0a9404bc0142746b151eb3b002d571c07893507b7487063a4d59453dca293625cb45fc8464edc0322d3c9ee8b8c002c227d97b36611cc60204af3d88352d6bd6c07c87b1365c8c58d3a2468d2103be03604065734780765e4b932d6b0bf3935aac04849b0498a7087c7dadbcebc167858c778e8a09138481ef7074afc688829a45311d16077e5a9e38744c140159795a281206998943db5315599391d39007c25481bd79c8c0fe55aa013397be3ab85204792872577ea1b3393cfee4c90b442640f864bf0605a70f608657782a36cb78bb37d91748e1bc2bb388880a3b9ad78235ecad24b95f2c0f880a59775c90ca46819300dc0cb35ef0b6aafaa2f9234bfd7f0bf41507fe0166f7a4698e992373b6867704c2e7aea3344288d98b22f42888ee4da9ecc411aa079253309a2a9483d2ee2906518661e64482bb9cee4dc314034741fb7377728831664ad3a333105b261ee87b107720a5da79bb234cde3234364973237d825d98657709715b71a4d7b78952406b56265b6756611d9a2a4844924a78a0bbb3c25ffab7f5b94c96a3a90569cc178f06c884934b547a116938458e5bae601b49754b3e0e48c86f141dfc624ecc0823eb6215476911b4b9d13b93fce12076573b995ac8984b5a0dc33826d3b87ef0a77c363bf3d5c23255021f8612f28eb501890666b4486a972a3522b07e1c13beb539e731167bd535593796d68d6547c7913abc73d8812143bbb2cc6a05908c1038152655df28fba4912c757c9671b8d01570a5dd91a5dba81113a69d15395c25b474dd817d862ad78d24566d7989b3691faf25b88137f3c683e9917152e9b7d7218083df9a0e1fa702f184d745b7dca658b07a42494d27c15fb44f7c1199eab93daa26fe3d5406c09ad407b6d28945493db62a9924e755c29b7b1873f242f7c637d9ec2a222b9ceed63bc73543a5729b93d618c09738957c8368c50a58d01a7ba0bd06548b763a4b3891641e640c89af573be0382055a9539b471c661646047c10c52c4d8121bf32bc89532b763656cfb19be72330d4e7cab3053b900b162ff480dd5018c9202d0a41a4185fc554216065ca0cb01d5460f209debb40496eac65ac73ba264041bfb43db29b0038ac8c12164f9826c20ab8dc4248dd7717ec3d6c2bf974da380a31323b1b38678abf80a32f832e642c31fa69a163b4a3af6250ea212e8033377d1c596a72795196de2873bcc00c21e8b5d75619c31cbb1b1e339aacb204c919b43cc4982b3405d82bb0c97b2db370230c2413418c91eab62e30b57b304a91568a8dd29506e656c6785bf482807960bc962e43fa7d8ce04669044924f8c62660e5a0eb9c4885e739c58c22d7440583189c6c9e51aad37328a1c605bc44136f34b3fa82e24764743a43983f91125415c2e5042ba6393d2159b8992c41781a06d6c5745c5cc3bf10785f19ba1133cba89c2609a26a3524daac54d152b34d62399459cace6d0caa1d01e77841ab153387c64c5dbbc29bb88250221046e927f6e7a4d85c5299887ce3774a726096d37c61343aabdab95720ac89bed9b7ec29a14568178c9a63eae1268f9f29d9c4080cef312609834bff34bfa775b4b3078fba0cff3812c1d79674d13c9a0853f89a1bb9a87529d55548e303d51d8004f539f60d17e3d858037e90e04dc54a2f8bba79a395efc823e085c93eaaa069c4a27720c16047934e2cee970bec418a02cc91ee82a3999870fb190855e571c075445e2f53c8eb65f4a18844032b6991c098ccc069ff55a84d484e4261c7a379655aa1d2fa461aaf74deea4603838b9e8d908f9b7a3939c17b97cc9c330438855c77c284270e81528a745a7b97098b55e7a120791491c10615494b39934143b18311e83b13b6e92bc6d450b47b7589c1571a122370cc98793a13d1e008d57e955998c222a97814a1caa5fe7c336ca331bc6266dcb85d3ebcada0593c04bb91c3155e83b2e0a8a57b5532f799263b0b3111b1146fac429ef4c870911399e8158915b7522477500941b2c560cd7a39000219f2ce082fee023e6c49fe0381cf056ac1bdc95895271f4e245bdc98ee3a87f651191832b224b3c5528562f9498979c4485c3206eee0a6f5cba8fdaa70dec105bedc40e4c6b667d1739c8580f2d246371f415411c803ae0b52f0b5a6cda5fc3340f1bfa10bb29accf402d6f06472c14cc52556e5a97b56c190eabe6817985cc346baa02c76afbb6b6dfe33f711c78896a529656b4abe25516e448bcb41dbabc340ef4b483b750b0180f68ec0020271a0e9b9f466a4728c19bdaa426fb82294ca00261cc0c3349b75d397674644ae5ca363774abe8a290240abe4039a7e124cc894657c9025e1534b91b896eefd3af2d559da9f8558fa7774708a7fd535580545bc68c9cc89ccdbcc78ed5203ffb653965e7b0920574b7907443b9931472cf19c17dd18ab87842c853462366646881592ec3f5cab67b7e768472a08a43681120f491bcde05a9805c6787b96ecccb05d7d944fc858b5ec3828859234da88d8d00542b104883e824e7b630267111e49b1bb5e4103ea9ac2b187e046b4cd109709fca26af813440f30318dbbc34598ee5dc2806794c4e0a8c6b9c2310c34636088da92147d6b32a7bb447f50b898c5a3e5cb43d6e3c147ad085652ab9edda72f25b7bf250ac84d1288fc188ba645d88333b65b1150722334b5616429b608a0c93d0d946c15576c82093e0b263bb521d9fda997a461f1ee47098861feeb8b557b4656cbac57dc61fa9510bc1c95726b561a1ca4000f28a5720c42eb932f1ca8fc9b647d3740117ebca3d5587816bb48cfc1cb4e9caeb7834e1814a7c478fa052640af253371242da9575c2a66bd01c5fca4b958ea437e6474301069d0ddb254bc4603d3ba5b7415a96e5327743662caa7e08f608be974341b70db77a850b2c11e3b4cc6525808238cb097611e77cc449f17c63da122966394e79518fb6022ec470e8c5082a945c73b52f05c38e2dc3419af4080e890a6e819bb1b301046057e548894f511989a40e854aafb62ace7e586793921e292cc8601181599977d9fa457aa2039b14488d5698a8f03df1b56479f9109ad105b028219b3c90adac962369ac1f0043373bc243286c24f599de3a28684524988198971c1f88419ca09b3e4f22b64a221df8d32afdb0572ba62c7387235ee2752903535c9c912ae30c9151a3b6c415d59a4969cc432d088196f22c518037044236eb441438acb6bb61ca45c947ab98a53b44c48119135f776f2aa4a8413a1142cc4eed8c2948f8ca5db39388dbcc15c12d13035763a57c523b99a1912d0fd29b952776eb03aeed697320c66c0f65b369e13c7eab1e98b281e7b17cc2cb9ceab725671bb5df0933eb5c70a3d39e0eb5a55cc20af912af87cc23e10ab77a9c9755201ec393b523f51d5307b176f05fea16a2dfcac794f834f60a712f13ac8d5174d3a7627ce66fb862497cb95e36da3f486c7432e5983c2cc8cc3a7582a6b22c5a7ab3bc5107c831af145fbcf74ef9523bc7f0ca5eb97b34a3872b9870eefa3fabf609475c46b1e736cff313f046b6050c13392571f2d252959aca2f8418f7489809ea51939a1e8192bea5719262208109b37bae2424ec3655ade90a9ca235f69c8a3be54793655a9e8c6e9c64354a842458067295f08b6ab3b938e6b188bc252d4569589282eb703f0cb237a67a779d8957c4602a9bd80f266303898acc60439a975c8e9d8342f6f1a7d6c92f11606435878739d3bd27460fb5e735a73cbd1cb6c657d0a6074633de38647035b54bd10986e4573e09820ef56fd8d71ee778822f72194237c0b5344cd8c888f12bb34fc86e6147161143365fd45960396bf45a8868176c7d0c440fbb71b8c6aca11b6ef3e33484f9bc22d090011918c3525cd0f0724423bd1e1c2b46a66552926a3a6a0389410a3e5c41d66b07c1b41c645787e8503c613343cc73066bc85b028025c3bb6901e33e242a0061e001ecbb7ac690837b02282a457ccae40dde98934bf37dbaa00dae287fa0a628c42a66a7e05a6645b244e909fccb6abf0075bcf0974b97099a7c67a2c71090c7bb016210d0ab69ff775dbc47206429b347e6749eeb3e23983759a583e08b1653cbb5ad4b677f9b9b365287c1b559c199c3945653a3bc7b0da8b41914be5b411268080396795f1b95ae14871397e14f8f3bc940f00d669886668c2dddebf98e5e270510db63b9982ef818d1253d74a644fd56900607545ef85499cb370a74dbc96de89daa52e6af0482648e3995fce28f7b7c0daca7b78f1a230e05b7114ff0395cc6634db1eae8258072d09c09f291e92d6620b177dc50d7 + +# Official test vector 58, seed: "bd334d7b7eb14e00e68863f2e5551a095f8af10681c28353fd19b9a7e70b8bfe266840860609008a567abc66316c77ce" +seed: 6396b328b100e4c7f4bcae69875edea1a1982421558c608c13c592bf7b5d0fef1100ced48add211a5c937b8d6079d8e271af3f949edc61f70e60453aef20dea9 +public_key: 4f240d6d4ac24ad53108968ce43555fd4bc4e3ba3df7a1541e0764c6a387de455a564203faa38457376a3170360b5303be69450acc7ffdf638a90c7cf4031719eb27fad55e4c901cb7dc5fb828ae50730609b80d5a92a89ef1963d836a16685881028759d06c55b9505e84b1aedc5e07d5294a084c1201c0109699b3009b2c67603c055949f400ad487167c1ce048b49a98a8740abba9291618f7c395d77b0649cbec1a2c0e2d25c86c70320e92be7595e103013c4974b7a3b70d8100d61b89a1ff43c30f48c137511375ba781e74bcbf322be908d09fac8991b4213db7a298c2c29455b3a5092ec8610c0325187434239a8b651f0a164240ca4e827f7bb7345848e01b50e34162a359c2ef8c8c9e6e9b7a18bc371a20d2f086865a83a2ba3545943068e173941e4875600183fb19bcf8242fb576f908a8d805cb0909054de4cb6b84b179478a0bae353d8b10ecd278a310466fc0a00c68784ef246f1f0847ccf72894549806c2c9650c9430b02fdd5cb0b3a9608bc85f02dc32933811d87322dc4993d3d13177b7440822c62fc7a31ea174159814c59bb209356c5dd20620b40d08169df1a12d913105225cbacd9c6054f1499d6204cee06206389b05057e579a9e294b43243ab92e136265470786b256f615cd3540c5ca675c4bf68f7da4760105367ad3c6d71a2a4b209296daba2768223aa30845d4ce7d67c2906156bbc4c24410176652765e294a9e22c58cb031ba06a11b5a8ae035a37db36ce1771999061d722cc99de03e96ec3216543ef74447dad96bfbd386b3154b35e08dcccc88791677053a0001dacd8eb6c34cab6eea355a10c517c45164e9eb4c714091bf129186a6b3bf33a86049671652ceade8b55ad17472b49513a79f2b867bf3157d5dbc929974147903ac69a6618f67781a450637eca5d0950948ca8f3d7c41983b8942b03d6a04842a09a4896ba3cd345e7d72a16ba3c63d95a1e85ac4fbf42efb588b088749e2f66bd6f06d56bb80a818c2c56c5d1d1b5580863d1ef10ae2a97f5f83be12491c7fd629d112823d728a2aec939e163436259367473ea0b63ed37bac19934da906a21e5355a3a2277519c8f53c96b4f1a8704b8d79666c1224819590048f5b9a8b767ffda0a20697caa075ac25b5546ae32eb2959947b11fdd384aea2692f7952266267aa559c8ef9168a04cc57fd8ae46674b75e785535a2b1c0c779a553f4ce5c1bf6094541363bbda825fec4b42035325a3a2b1a8135dcbcbf1122b8fa1a37e925440e95c2e4c0ee1f69318d04282c0bb5fc8616e99c9ace80d27a79b64c843b08cb9fc7a27d20309726cb50735cb3450be54d86860d7708b11a615dc662ecb229997004f9670e27898e78a4b3732b4ae5cc459f28e78741f9355a8ef9b394cab001c912124a01d27232f060ca523d378a5d42e0022bef2d2700d7c6c14da09736679b2a0c33c035b3f0513bdb5b46fdbbf3a5b80d65c4be918511bc8631e35aa5459793f858f364c96f2010d8849229acc89e8a50360551afc8c1d481a1c21ebb100079cf3d45ab4159371c49b16cca69fda67aed5881f300c5864c03a9391ab1080b92601f23a417a0563c0c14b16b0255c36529f74a103036466fa9290744eca08cb16b94f30340c49581becea5b64088fa7498e02b439981cb4b4ac29ec4684152830ed82864ca833481323fd8a8f66ca34bd4abcef70c15c926fb8b6323c609efea710dcb6548c06bc13d6bbb41b40caea5745c68cc550873bb467f9dc6b3e720ff4649aad171bc5527b0633cc2709932f0869a0702da790a305761f9d146c1b24005f6c1c808b6dd5d97c647232e843cd61e39894902b76624b73739e3a1bbe4fb1b4b2348c836592a2d31dc9884394628ebae00112643bcda9a01f34a8bfa828333b32e8063acc5344a4b36667691c55c50b2e3098bb4c7069846283b57fee61089654a8ba06797c57c2e7e9bf1404077b80928f5a1bb6c6a753bb8a95bc46748c32e0e1c8f7aac1e2573a47d104ff9567daa2c0732c501bb9ac1315a211c11593fc1a38a69651347b6aa1250f3895a7844e1de2ae45ec66214a8b41da464baa5fc50100c5073bdaf5b4a88c70450256b6d65413ab3ed302ccbee864c578733d40a796981a8c3849f465cacaec79898cceaac424fcd9b57b426caf306d165d1e0ba6573a638fd7df6b3f824f240e7e0eaeee7d7a093875 +private_key: e8d7111942790185ab64776746d835f4f3b4b8458eece8cf89e08b7ae974bb84c5a5325faa7958f830bfc65a3f57b9bb311928d939b7bec454b051b399103aa8f871f3d87d240693a2d10587371a40fab0a52a3c13091710476a393a90a89b3ca8ec955f3b42287b23b2519cac32a1b8ea6194752a3b1083930a0c415159da51967ba96299065158f156d31189c797c150306c2903b1fa4639252aba2e131b3ee74917ea269aa41cfbe05915688b9e73780d46ba63325601895aa054023ce760347bada01916087a700963aef293a40a0b3e4de60258a0a687e367489a684a22b86e22aef5e5976989b09f1931d3e753a6265aeb677c0fb3629329c28b2061be210b3c156b46c5364df8b74cc95b416341ae5080488b895e2c4e7005901f5397249a3fc1747baf1c8105eb433227c959b6ac876629bcc911eb671689b2bb33d8b6a1cbaf90d81ce3f11200314dc0a53b41dac824ea117e25852f2339a33934278cca7dd0797c7b55af75ae8f6a1c34f288c1124dac01ad5399c1966049e8569efaa305caf9bba4e92e15154d2b2521d0f245aa89788687817afcac195315befb50eb77bcfa487be2547e98306fd9e92bab57cc7935168018c570260c93d712e3058a843aa36e88123815a847411a3c4078e336b2bd26472be6b8bec382898b57e02048e531b335894ccfeb24ede00f9a46a34ddc67f9f73bf5d98a87b50fcb115694e7b3daa7067f287dc665a13bc58661b53137401403a211a3574a7a596679a021f8458c7baabe9efa18f3f82bdac20c6cab93bcdc2d31218dfe0c451724226961189b460958a9bd12d87446b7b8dbf65ac7d908ff1c9fb7e927ec1679da95c4b43cc5a11937b3538446298cc7b55b178078025a229be58a95a0727928bd3370901b180543d78233530186b3155a78162d3969bdd6b6a0204a25066303c495fdc9c9df947959b79497a805a3122c71e96efa728c6b92042b39b45291cc87895d4ab62a2437c9aa7754b54a48cb34c1070b08fe2cb2edb974ba633cc6c5413980ca5173160ca43cf77320850a12e402a0c94881d3c50eb5f317628c4e0477bb4b1b962c15081b2662d65c4ee1099c001835de716ac6a924d3702dd2c61acc2487851a14ef06c36c6925f9e6714291765d8272bdac11651ccf6848975d57323f599de580cdfd892209c7888b7bbcf6b65c1c32b5a8e9885a29c16446369fc51e4155b9d5081d9c74c2eb2c545c07277f608616d800e3ca0ff95a655b7189c48412556a8fdea48e0701b4d1d5175cf0088b70042b5678f91164eb42031067814db0ade6b26c606bbf8cf596947980793ac48f7abee21a854fe00551e98ce039734ca028c8d8a3169c9922dbc273580fd5bb03a85508e0141eef13a37e80ce35531ba7b900599acdd281ce729c4f2bc6b898b47622f5b559e7cbc86a26ad61a0edaacd3aa638879296a5413dddb78edf347879c4c325ec69e2bcc7710b65b4821489aab9ab7c8ff9e6b8bfec9d5c61967b1c77f7823cdaca03a7fc04703740dba421c30b8ac1894ce58845ce9a73b2321c65228ea0d64c68d3c7a6533837b6967ad3139a709acd8517ddb693ecb75ce3db51b7235b34c0b296038a140737bf77ba7ae91c9c49200d6262a2d357ac390c744bca28c9ca4d32a2dd8b456715907b1b42e7381a605b16e4e2a021e383f4d051f859be8e83b39a2bbdb9987a37423b689718c72365dd5b65d1601b48707955724ea106602b6b4c2223b142907195855d652c13cbf29340753911714f82bcafbff178d52bae8b9447cef9745a6b18f53bb697ac157516c3123c526073cd7aeb3550128b1243b95f178705accb7efa2fdf9c5ff9db4a6d1c171aa7b6222151375796b93c8f39b8262d56169f591a8b3964ea228de76710698698f23a147e3206a8641f5c46b7573b1eb13b8432104fc7751e813c4004d25c2af512c5a47bd4a50a37129d7b0b80ae551145356ec304751a8ca143a57c6c1830ab5717e3862b50f70b745b33210bb73b340154b6197f1423f9ccb88feca121e24e79600dc0b047a36b1b76697fa06395ca8769763443695852923572566abf8c5c7097f6425ae1c7e1185b1db5ab75a9856217ae82c61c82265e18151f831b65a5b435dae57a89b2ad55c3cc02f70fcdc55901069a2e773b4f240d6d4ac24ad53108968ce43555fd4bc4e3ba3df7a1541e0764c6a387de455a564203faa38457376a3170360b5303be69450acc7ffdf638a90c7cf4031719eb27fad55e4c901cb7dc5fb828ae50730609b80d5a92a89ef1963d836a16685881028759d06c55b9505e84b1aedc5e07d5294a084c1201c0109699b3009b2c67603c055949f400ad487167c1ce048b49a98a8740abba9291618f7c395d77b0649cbec1a2c0e2d25c86c70320e92be7595e103013c4974b7a3b70d8100d61b89a1ff43c30f48c137511375ba781e74bcbf322be908d09fac8991b4213db7a298c2c29455b3a5092ec8610c0325187434239a8b651f0a164240ca4e827f7bb7345848e01b50e34162a359c2ef8c8c9e6e9b7a18bc371a20d2f086865a83a2ba3545943068e173941e4875600183fb19bcf8242fb576f908a8d805cb0909054de4cb6b84b179478a0bae353d8b10ecd278a310466fc0a00c68784ef246f1f0847ccf72894549806c2c9650c9430b02fdd5cb0b3a9608bc85f02dc32933811d87322dc4993d3d13177b7440822c62fc7a31ea174159814c59bb209356c5dd20620b40d08169df1a12d913105225cbacd9c6054f1499d6204cee06206389b05057e579a9e294b43243ab92e136265470786b256f615cd3540c5ca675c4bf68f7da4760105367ad3c6d71a2a4b209296daba2768223aa30845d4ce7d67c2906156bbc4c24410176652765e294a9e22c58cb031ba06a11b5a8ae035a37db36ce1771999061d722cc99de03e96ec3216543ef74447dad96bfbd386b3154b35e08dcccc88791677053a0001dacd8eb6c34cab6eea355a10c517c45164e9eb4c714091bf129186a6b3bf33a86049671652ceade8b55ad17472b49513a79f2b867bf3157d5dbc929974147903ac69a6618f67781a450637eca5d0950948ca8f3d7c41983b8942b03d6a04842a09a4896ba3cd345e7d72a16ba3c63d95a1e85ac4fbf42efb588b088749e2f66bd6f06d56bb80a818c2c56c5d1d1b5580863d1ef10ae2a97f5f83be12491c7fd629d112823d728a2aec939e163436259367473ea0b63ed37bac19934da906a21e5355a3a2277519c8f53c96b4f1a8704b8d79666c1224819590048f5b9a8b767ffda0a20697caa075ac25b5546ae32eb2959947b11fdd384aea2692f7952266267aa559c8ef9168a04cc57fd8ae46674b75e785535a2b1c0c779a553f4ce5c1bf6094541363bbda825fec4b42035325a3a2b1a8135dcbcbf1122b8fa1a37e925440e95c2e4c0ee1f69318d04282c0bb5fc8616e99c9ace80d27a79b64c843b08cb9fc7a27d20309726cb50735cb3450be54d86860d7708b11a615dc662ecb229997004f9670e27898e78a4b3732b4ae5cc459f28e78741f9355a8ef9b394cab001c912124a01d27232f060ca523d378a5d42e0022bef2d2700d7c6c14da09736679b2a0c33c035b3f0513bdb5b46fdbbf3a5b80d65c4be918511bc8631e35aa5459793f858f364c96f2010d8849229acc89e8a50360551afc8c1d481a1c21ebb100079cf3d45ab4159371c49b16cca69fda67aed5881f300c5864c03a9391ab1080b92601f23a417a0563c0c14b16b0255c36529f74a103036466fa9290744eca08cb16b94f30340c49581becea5b64088fa7498e02b439981cb4b4ac29ec4684152830ed82864ca833481323fd8a8f66ca34bd4abcef70c15c926fb8b6323c609efea710dcb6548c06bc13d6bbb41b40caea5745c68cc550873bb467f9dc6b3e720ff4649aad171bc5527b0633cc2709932f0869a0702da790a305761f9d146c1b24005f6c1c808b6dd5d97c647232e843cd61e39894902b76624b73739e3a1bbe4fb1b4b2348c836592a2d31dc9884394628ebae00112643bcda9a01f34a8bfa828333b32e8063acc5344a4b36667691c55c50b2e3098bb4c7069846283b57fee61089654a8ba06797c57c2e7e9bf1404077b80928f5a1bb6c6a753bb8a95bc46748c32e0e1c8f7aac1e2573a47d104ff9567daa2c0732c501bb9ac1315a211c11593fc1a38a69651347b6aa1250f3895a7844e1de2ae45ec66214a8b41da464baa5fc50100c5073bdaf5b4a88c70450256b6d65413ab3ed302ccbee864c578733d40a796981a8c3849f465cacaec79898cceaac424fcd9b57b426caf306d165d1e0ba6573a638fd7df6b3f824f240e7e0eaeee7d7a093875cfb4f6a03bb7707d37c80474f92c12748b37f448186584df115ee97c195d45a81100ced48add211a5c937b8d6079d8e271af3f949edc61f70e60453aef20dea9 + +# Official test vector 59, seed: "a0264c58ab1f2cbcb212077fd378d340307accb31f1312137cf84e3d3135044d4eae8bd38bc3e540a0c14d46458f6179" +seed: a453bcacdd2b0d4646009e5ed451c3c45f08fb827ef733db3c517a9dc1af93e67a3cc8aa3239d4c52ce4c95afdeff6efbfacac10d294edc0e7cf4535059bfdba +public_key: 14905ebe26c856fcce2c623156e43efd0433c19858c986436150968132591db37eaff112c1383238c0767316c0077a00a4714e49d694d802a510dc960c525bf601384b96b90141b846dca14f34159db490479205b30800137819406bc6e14786dc4079e0481d098ca4a3f15f593135ca64cd7c32c46b45b3bdea0d7fd70dee467020ab49d4360355146d7f00337a1cb452357bd01074234b464a134abebc14f7557597bb057c4972d2f012b59a0b83328e88d76bd257ca5aca8912c2a9f90672903cbca16b9746e135108638c388676cd189452325dafb4ddfe435e13908b177a5fc883bc233679df34e40a09fe384654e6a857e49c5f62aaa30e123ed71a4d79a65bab40eb2ba7e1c497ea28c069ce9898f3789fb1b03cc07a5789569496a5a6b84966dc3b601577b07b01e2bd6afc315cbe74b03cbb51bb68920362474819a02e5c60db441a3e0a2a7299ab0913a92e3228986c18639ab0b952a01c77907e6a0b59625c01b1c406a4b339c10b0c8947fdaf5c14f6721be5c11e3a62a7065a78b9b1176e64ad075150b67aaf70820b9a62848378c374a3aeae6c63cf620d0927971c0188768991734754368bdebcac2d6b899e5ecc20922059641566b4996be455e90ba9aeca1a40ce8cbd68a6ac0cc708458169c624ef80a25ccc7c931d938687ca4a12290711b1e72fb3793a760a5c29942896853e26dd1606fb48c22b53506b4413e8f5b3c20b446dfeb586532a09ad602e5c54d5e0c0149ec3526758f174ba49134c980ac109e711ff658b7cdf0178b8c861a71c700e90b1ddb9265e9bfbc07a253726fc9c54419bcc39932555024af651a277302bf383cb67dd2a929037fb4109c69347876751f4f83955a4768fb94622390790796084215b6108c72e10217fc9134b7872ac6ea3d07b989bc70a23a826676718f31338c68a5b1f9ecba4b18bc47d3161419530b67041b3864686224d0171dbd248a48527950f2c4c857aac6f7a3394662afd84f79d5854ea77c26e7c57fd8a3aad0399ccba0ae4780ecd2481ae065e3597cf1868c327c14baf36d9711a3a8647d26ea52a4f9139ba835f380ce9cc599f6f11586f158f941520d143f75d00125a3806c56108de46c5ad093872ba5f927bb2a4a88e668c40af5b4fe9b17f80ca75ab58224ba1b485a9e1c3a6e82b814a1b23bb0d61ae14a9ca4e95d03746a564087f9c53a343ab7595572cf2542d7a9cc90060e6e99cb2d18880f082d3ac91fbe00c5ab141c6385895c626d9c143ccd94042a27509ff67c802098415a49bfe163ca01a20a45add4916aa512467db549e7b0c898656cb4265df3987998c8737f3c79bedba48b9c6b8967a9bfaa0b22e6858307977903001867282cd38a01798d3b71bed21459ed4c4ca6e185d55525baa096c1897c55789b9e19a6b303af32f493cee717bad70cedd67c3dd89bed6926a0f20b1798bb46d173452a31d7543530311734422f3cc9561d5360b665ad87a19da71a7270998b87d62d5e7b0a5ca969120b4c610848fdc6afc0e631fb2abc21096347221971a08b94b0ca4116c2f5a8188cd982f3e647ada99eeadb3ac25310dea91fa724cf3e1017c0c86c2a979791d30192bc3163ecaf73c819dcfc113535bb3a40b252c8bc269884cf7407fcda465c2aaeb19681dde0c99a3853a861ac81f77e1319afc6f67b2fe52dba6b38523147f4e589ee716172650c7cb44e0b760174691217093ed4421dd5a38f2ca2c41604c592366a89c4c70adba149ac63de1b5e21e78788f33d9e135890e61d69529dd9f658b340848623b17447998bacbf1c315b1fc5bdf8fc357e89448fe7a40217205c64961cd643ac6bc3486c5efc003011e80c4f4494cba123c2ac45f7d9019cbc7018669921fa76db3cb5436763b48a8046fa71d186b57c942f6529930d23737c49698c15404de20f8f357d5da523ee3a117fd8b69ab80335e388fcc661a0c8b583f94a8c7869e464a0544c84d160a828f1770d97be7bc43cdfa8566791727b7884e99a5d9fc549369a4ec5195ef1285860cb263085740cd466bc24835ae33bdd1499ce941f8041571ab638bcf896201cbf0b7324ec22c6d3c00f60ac6e6f0317efe14efb13440330b50cf86227fcc7bedac20f9364e2593adb7599b5142174d6b999c725f7d119814642f79de48f28d8b47d06bfec41fd06e2da9ae905005ad241ba55ab42a993df7551 +private_key: cd85bacc99669bb19f64f32796599fa909499edb700670ae7eacc07c89b4659cb7c3bab323f3761728c79ec67515102091b133e3536a2032093df24531874108d1010194338b16475f531030e0073ad08e168976af67243eab3596b9975b2a216e8146a5192577975883c21646cc20c036577dd709edda6abd44989e6a8e07c555474b3d14215777193308d56fca4aa7e2378a94f80daeb4788f4c87b6477193d7a5d0bb6c49407adfa222e7d34ca19b046cb14a37db2cbe781288584f5c386a2e9c4fae79a106c28f27c49ca2401a0a375664e885070814f96c9048993300065037ec06e1e692a97835c129b06707cd501c6c5cf1646d82365942cae5e104a5bb71fdf42518485c1602838929244a49b194c76cfe2bad0e758701214cc6c938adf0c8e4712e0ce148576961f3b613537a843ac07243926a92a324adc52b65152c69613acc6336341a72f7104ad72c540de40c4bbb8611a03ce9271680aa77bb827d7bf629a44bca141c0cdf912b8b372a32030ac9680a2b64ce93f726001d6ba184736d571cfc79282cca13dd0aa3adc14683ca9bcd89b72d7cc280963f2d37925d57693b947017d61b716626e45a5c6eb295ba0963f2a9086615697688383ee8775228afcd760c2a90c85d18c3fe553edc719926ab0ce6e40d690a53b34626c6e28925b469eaeac11209c7b00a03f020cc25176fad9a2ad2b38fd16b04758a5d379630f3c9cc2b0824eaa882fca6b134011a0e3035b1f2cb19346303a17837c30b60f11ff8795593035c6d335496734c491552ebf4a38ea10ab203b13f325a4df221b9dbb7eb01ab00097845c1335f6349ce50c15e64a02e644e058807c9b764badc44c6f21745c80b6f4264b1a7ce8fa65657d75d5319807a9b5bc17b1d76ca64ec831e113c1b8e79b5a1fc0b32d21f839a64bc212722e1664b9ac5c39a3dd0d8961d53c6dd697a6c896b664a6c7c5a70de5a0df2745a64cac12447b70b1ab16395b71dbb810d763faf817d42149b99181f9b9835c8e947cce200a5a5aa573b44544226b1607cf58968b3829de360952a8307f7fcb157c4affc5009ca6628f0527042e235f5d1c1a91bc178f8288bfc37b2f53077cc0c7c414e59f57e78d5357f447871579b54421986116c6bc22be84080422c9b983794ae70304d601e2cf0ae29f6172a5529e8a4a14a89b064a3b142c4c90e421b59a48471e4852c749b9dc4867c677e52e44363a5131eb5642c4415f5248ae4358a3fbc01beb2568c8321b711bc3199814a2b9e9be56e266b2639fa920dd204dc41518b19b8a9dc0b5ba3290b362e9d071dd61c041b4a809fb92f0cd2b25bf94f04701299ab530ee704dcb6ca69613439c4c288e7a0643ca3ac321d930a99586c85ae0597b2c56f9a870e7bb260df51ba7a62bed6859d7159b56b211d282b7e1bf85d81b1258fc01e2b8b15e3829bafb34aa81036d05531d288a0efda8106362da9878b61a4b3ab6813f27ab65bdb48105686ea3594fab5c2d83aa867055a233052a5d57c741086814b7e4ca39b688669d4688cfd92203c902dc1d9831d3652475328c99bca41a7b0f54a7795f8c2a4f90f305626e4e31b983c9fcb0748aaa856630a67399b37a2f204186388dcdb740f8b8b00ca0e328958a821a9f5e9a26d39c60a37b2a513b79c37930a992f3710ba1f574471f2175d2a777112a4f5444d37db793d87c1c1e8b4cb37bef3d06f8785ab65d8bac7c07cb4003fd4a9933c3117e347664d92a18f137980f8065cc031aeb8b1a98b24656031c3b57d36894964171d6f511058e21a63a2083fdc37ef1848379ab86b7c53eedc941d16174553966415439f6944393660c6209e59981662387a1e827b768787b8b46b685b8bb3b72175a367af89b5f3953f4a636f9bb89b8351866a335a7ea422f9e9c794a24372b40fd277a5ba2a2531a4703e60827f562acf95a8193991c8f4417109c059e91c4fbc289233b080a0aa8a4b3e02b35cb59216a9c37509a91725910cf8b11d6e7b985ba5c0d85073a99b324d0583c7f8c73901847e41c4515048a7556a0cc206711550649926514c96e3535ef6194a37c1a3eae023a8851dfd0bbf0efba981880c19fb9d4e6c2f80b4b8cb4031b8106ab6ab33b6a37b3f8b5d133244894ac86929b4373b30f6bb4395b11914905ebe26c856fcce2c623156e43efd0433c19858c986436150968132591db37eaff112c1383238c0767316c0077a00a4714e49d694d802a510dc960c525bf601384b96b90141b846dca14f34159db490479205b30800137819406bc6e14786dc4079e0481d098ca4a3f15f593135ca64cd7c32c46b45b3bdea0d7fd70dee467020ab49d4360355146d7f00337a1cb452357bd01074234b464a134abebc14f7557597bb057c4972d2f012b59a0b83328e88d76bd257ca5aca8912c2a9f90672903cbca16b9746e135108638c388676cd189452325dafb4ddfe435e13908b177a5fc883bc233679df34e40a09fe384654e6a857e49c5f62aaa30e123ed71a4d79a65bab40eb2ba7e1c497ea28c069ce9898f3789fb1b03cc07a5789569496a5a6b84966dc3b601577b07b01e2bd6afc315cbe74b03cbb51bb68920362474819a02e5c60db441a3e0a2a7299ab0913a92e3228986c18639ab0b952a01c77907e6a0b59625c01b1c406a4b339c10b0c8947fdaf5c14f6721be5c11e3a62a7065a78b9b1176e64ad075150b67aaf70820b9a62848378c374a3aeae6c63cf620d0927971c0188768991734754368bdebcac2d6b899e5ecc20922059641566b4996be455e90ba9aeca1a40ce8cbd68a6ac0cc708458169c624ef80a25ccc7c931d938687ca4a12290711b1e72fb3793a760a5c29942896853e26dd1606fb48c22b53506b4413e8f5b3c20b446dfeb586532a09ad602e5c54d5e0c0149ec3526758f174ba49134c980ac109e711ff658b7cdf0178b8c861a71c700e90b1ddb9265e9bfbc07a253726fc9c54419bcc39932555024af651a277302bf383cb67dd2a929037fb4109c69347876751f4f83955a4768fb94622390790796084215b6108c72e10217fc9134b7872ac6ea3d07b989bc70a23a826676718f31338c68a5b1f9ecba4b18bc47d3161419530b67041b3864686224d0171dbd248a48527950f2c4c857aac6f7a3394662afd84f79d5854ea77c26e7c57fd8a3aad0399ccba0ae4780ecd2481ae065e3597cf1868c327c14baf36d9711a3a8647d26ea52a4f9139ba835f380ce9cc599f6f11586f158f941520d143f75d00125a3806c56108de46c5ad093872ba5f927bb2a4a88e668c40af5b4fe9b17f80ca75ab58224ba1b485a9e1c3a6e82b814a1b23bb0d61ae14a9ca4e95d03746a564087f9c53a343ab7595572cf2542d7a9cc90060e6e99cb2d18880f082d3ac91fbe00c5ab141c6385895c626d9c143ccd94042a27509ff67c802098415a49bfe163ca01a20a45add4916aa512467db549e7b0c898656cb4265df3987998c8737f3c79bedba48b9c6b8967a9bfaa0b22e6858307977903001867282cd38a01798d3b71bed21459ed4c4ca6e185d55525baa096c1897c55789b9e19a6b303af32f493cee717bad70cedd67c3dd89bed6926a0f20b1798bb46d173452a31d7543530311734422f3cc9561d5360b665ad87a19da71a7270998b87d62d5e7b0a5ca969120b4c610848fdc6afc0e631fb2abc21096347221971a08b94b0ca4116c2f5a8188cd982f3e647ada99eeadb3ac25310dea91fa724cf3e1017c0c86c2a979791d30192bc3163ecaf73c819dcfc113535bb3a40b252c8bc269884cf7407fcda465c2aaeb19681dde0c99a3853a861ac81f77e1319afc6f67b2fe52dba6b38523147f4e589ee716172650c7cb44e0b760174691217093ed4421dd5a38f2ca2c41604c592366a89c4c70adba149ac63de1b5e21e78788f33d9e135890e61d69529dd9f658b340848623b17447998bacbf1c315b1fc5bdf8fc357e89448fe7a40217205c64961cd643ac6bc3486c5efc003011e80c4f4494cba123c2ac45f7d9019cbc7018669921fa76db3cb5436763b48a8046fa71d186b57c942f6529930d23737c49698c15404de20f8f357d5da523ee3a117fd8b69ab80335e388fcc661a0c8b583f94a8c7869e464a0544c84d160a828f1770d97be7bc43cdfa8566791727b7884e99a5d9fc549369a4ec5195ef1285860cb263085740cd466bc24835ae33bdd1499ce941f8041571ab638bcf896201cbf0b7324ec22c6d3c00f60ac6e6f0317efe14efb13440330b50cf86227fcc7bedac20f9364e2593adb7599b5142174d6b999c725f7d119814642f79de48f28d8b47d06bfec41fd06e2da9ae905005ad241ba55ab42a993df755120179b32e6faf885f946898d545245757425d719681b0b2ba24d49340f931cf87a3cc8aa3239d4c52ce4c95afdeff6efbfacac10d294edc0e7cf4535059bfdba + +# Official test vector 60, seed: "99a9cdbfc674ab3ff2c64cded7d697a6e27a767434a47aff7c3fbf3c6a22d6043d27868955286a13efe3de36d22ec48e" +seed: 47ca2b77c5b717f423222c2730ca5cb9c856bc951d01b2b2c80bd76ccb5539b78f1481d7cab000e33fa07de8dc9627a85e76fabb4428a3376e66300cf12a0787 +public_key: 212bacc3413ae8c00a2b78cc3b0c7958e349211bc64f036a70aa16067882330a36aa4cb183497c0251b2b942964a922c25525ee9e3834504a085540b36971963e09106fc14125659bae0c96e6663a479a381a915fda7b8a404061c90b814c3146a549b517a3735760244ea8959eb2d98bc37e2f7309e09749c4c689f6b640d28a7a0b8524fb9bc0b544eb219683be91e79baa327b5c0d2f2713b78341c9682f6941327959f853195aa36b919e07c1d5723d6528269b360984857df1636f2a80cf1383a775c230a9991f8602d074b5f0bb42c13ca1eaf4b3c7336a4fe61a8310c9c27f37454f9af3ff0bbb2232689c63ce4b7cbb880886b36681414902bf77a2623ae5f0c359c038f82433413d2cfa88373bbd17bf1d5503774939e916c415c8b929b5c2303234501ba642b75ef2823e42b71647014044a9450a55cedc0592da6554cf74693429d2d526d34851fda24a64450c785510111988982914fcba3addbd0963c3bce55f41b3cc71c0300ba32b02fac76158d673ab1ec7a23b30afd2a53d5aba3c3c87e0fa54408864037511dc3ec113153681d28c45b2a25e7256b6fa90df8b8ba8435b2f90727d4394eaf49981b397916c1642abb68f5006fbb2ba6c2c53b6dc5795a261ba674778ffa7e9daa65ac93366954710419c99fb21a46b029242158294107dfa28c53554aa3d79878b53506ea03846a9041664bab6056f7211a337910f77a2f37b993324927d64aa0d5085840475039c04acaf0ce5721b1f182b53e96928927961b8a04500118a453738c78b8a796ceebd960473b2fd2c9c825593ff4a95f3f659ef00b251449a253332171bbcb051699b100501f84bbc64c4e7f9c7db1190c4621664fb33c624910078155c1f2035d1755f7b10112e4521d58cb9c89575a3a2fa6caae5dba470a9b4d3fdc9b7ca6ac28e0570cc92647d382d04a5091d8a1ef749067848cda293a47d772372820f25245ff457580857eadc0bda0a059ecf1a3adfbc6d7e87184337e94231e8e3774c9854ef1c6b4c872bea6f939845942ff2732aed903a23b72cbb5122c43c8ed303ae0d33a7a704001890f0b378039ca271205d052fb594c526e7c761ad6b0cf14bb251225c7ff42b4b5f651ed55143ecc05cdb21962157e28d7be4fc4b5aebb6cfce5396fa51af1bc85fda50b00fa63ed800d60a5761dea715258bcf597a434e48b23202d8a415831c0417c6c43a659036df10772e796a2d70515939823575cb5c01d35155f7399bfe1b3ca9bfa47ebd69f5c8cc8879b87ae34a7dc32568817aa3f923df22c92be454e99d83023d3caa2e80e0ecb8818414b0241a6315ab20b63c422b6be8572b5e7f249fa3802fa647febc89c8ccc22583c144c191b91187257235d857b9bba3b13db06be10a35d712c540e7bcc62373d76e5828be049b6462d8da931f24a6827d314f5c0ad266a3529fa9b47cb6eec425b326ab0bfa032b6809d82c1cc3e2427787a413daa7d3976aaf83ac08d87b34da219a92a631784bce31cc66693c75aa58c7c87a9e3a926b5229a4f008b85090f351694f66743dae3a59a86299b43c20522cd82f96284623ee20b521794114d1459fdf70739558123f18ff8304730fbc63f198a2eb992e7115e07f509dc58b1e2a00c314714b5162334861ec20acac85664d14057d2788207c01a7ae383c93971d850102d60ac0d042c648c100ed660ef8a2cad375ae1a21b11998264e86ae0561e19d971689183968a98be064486b8abc3634021f770e2581b4383aa3c938bf3aca4aa2a337ec06647aa47428bc027339f2802b9f135820f3a8bea06846beac4c1a2702c502e50d338fb80a590a564f48a6606a10b51e839a4034f2b906ea34b4d3c875f1ff6bb57797b076638e4b576fe8c5a490806bfd178b4569a69626001c8a5fa1582bf4bb7bd586296f9ae74724d7b6c9c38d25273e114fed525ab008b887b9e5871172cc393938902914a3ace06a41cf92f6da963e4217f6b1363f7273cbf4a342865a761371f24285113e74f7a770079157c0ba0700e6bb9ca99ae10b83299ca9445b8024e450cb6152fceb79c0c433753c0b88b21c71bcb38c643ae5e16502fd14c0aa8939219005a15180446a166e74933f46f41a68675692e25816e7a227808764e20c98d33d6c3ef3801d21cb37d2872fe76749aeb09976580ccd4feadcea0b16f00970f92acb21c560501728f +private_key: 6b3b1e9e6771d2b6946533c210a8bbfe297df569cdfc56b501c54ec9e21dbac3ca24335438a71c456842ce4653ec9b4ed5ba80ebe665b40597230213f58951104c7ca0f225eb535fad8c5724189b49138c22f4478b19492403c2c41c452080a2625654beab411ee59f1f372effdc5dd282a5b4244a8d7a0ade30386a13a353d1516ca38991948497a4ca83cb9f65f5aa1a6ac85dfa634253068b2b43a1ac8c41f156e0acaf4f05505edc57a1a6bb1a890c15d35967b86e84f16d2a1056916c8f90db83b47275b28ca3efa0bd4f18b9caa5b480e80566cb3951d606887777c2c3bcc88640a6c1c826ea51b169c8bb11a7f51b084bf0246f93990e62ac6f012b89eb025b5962e9a6bf36564ee9b483895b2ecdd6699421abe9cab8820771e121719922315de8677fa1214e332379caa11133a5ffa13dbba75c6491308ed201c23812db0a8d006c9ca9e7606c532557c8555cb10d6194284b71275ca84eaab50e50470fc9e8c2954b70ecd96dde6937616618ba91b1fa858335605c162972495c4846b46b6831477dc5658751c0169a5ba0c733863555f62c5c1bc5c83bcabbdbf1438617412bebbfb5705622c258a301caa76a4561099c3ae34ea4e014f89431cfb957c6a930315b7a001955310caab03076440594f7a66c1385637b69135ad50df1934a1bc754eec983dcf351b306a14fba9ea5b6a416fba9b46a40c99b640048aed0e4ce74771704a3b3a7c90009c964e7b055f4753bf062349a368aec2423bd6a278fdcb3d9f0c81ef551a0122a72175e76d5970fbaa44ff8399fec7498e59dcd685a6b4038b3b5bf47dbbce204ad99b8945bd3afaa237af16a81db0c15a906364e1733427b28040539d32832cc5a7f0cec282ed902df9a0af281cf14256da8873317fa5f6e9149a2d6ab544c97697683032455591c75eb2a0bb4aa5eec1c3499b64b78729b6cb7553f1653bd4181224cadcd62ab80f5af7478b909a4ad9dc1cf97e608234b48b2d9b005a5ceb80ccafae85e431a258c77601dc3764823177e970ab5763b154447de89cb2c6cb11ee51195f59977f983c1629dfc640026a8c36b909d4aaa9f9e0b642140a35d2a5fe503a07a800c62cb4bb7c6334c056500d14337dc984c7730fb37891ba737f2a65545b2943bc22a5099345732a1129bbe22e88b987aa1c8e33934323006eac14f03a9970cafd6ec587d15544ed9950d5a851c63898c3b2331192e0fc620937c30a5e8b56355319ccac8094ca136c237941372b17ac5367aac78269658f4b40d04b33e84961733a353baa9d5f4b2dc69609ce6a00ee6af8dd425d2b04bca841411473070d7a1f4042a8167cdcd138634619bd78c5c37511b54b3857a897f17fa02de663854196418b4b23ed80008b6af534b28b1f0027dbb41ebcbb83c9cb0f0080d5e9c8e80a83d120a0d679c9b3eec7d4f94c9046832d947a622f7509d41ae888107f5fc7539cc0053a1365ce005caf627f8185cd1355d4ae65638c18510b93eeb87642cdc87fdb858c4a997bce0963f6b3a1318c206635289aaaf73a33cc7d76977e3570aaa98c515436ea39cde485342a4503d991ab2e374ef2ca8e221c71840b876100aeecabd475233a40122f2832193f40bf29ac1fe71c1eae1767ea470f3e580089ac09bc1737fa3449b4b9911c114191614599a8b8e02060517c57ea13baec5ac77b34b7ae21c2c9646fb6b6f9a0a3787760509e3cd9af200f8cab9daa5a4bd7a9c816b4fd7d3c0905a2347215f5ec01e40c605ded70ebf472b1ca4cb684272dcc75fc17a3a150c06af61ca0573ac03473c395bb35b34bdb0d3297a5c4729a14345546124377896b11975c26118d79970c76128502d474b8828b3b01a9bbad62728b8593a254734ad208f29722fae409d7f178b4a0937e86542527201a7e4c14547b599408552952cc65128533c4207ab047287af05e9bc5ef0b110e4ce977660cec3adf062a154c24cc86494bf5b2f3f1424f42a7308d0057f041c077528030182295a67c27422af6180a2010e4cc478444b595ca065b8a50de1c775174bbe870a874beb8649d82c07a68341165c11abad1fb5b7bdf2bda1511543108158471d94c3b59ad199c868bb67e210a724909b9452ded168587247977a70da79b3750c39f319b44198a5dbf047ce618c212bacc3413ae8c00a2b78cc3b0c7958e349211bc64f036a70aa16067882330a36aa4cb183497c0251b2b942964a922c25525ee9e3834504a085540b36971963e09106fc14125659bae0c96e6663a479a381a915fda7b8a404061c90b814c3146a549b517a3735760244ea8959eb2d98bc37e2f7309e09749c4c689f6b640d28a7a0b8524fb9bc0b544eb219683be91e79baa327b5c0d2f2713b78341c9682f6941327959f853195aa36b919e07c1d5723d6528269b360984857df1636f2a80cf1383a775c230a9991f8602d074b5f0bb42c13ca1eaf4b3c7336a4fe61a8310c9c27f37454f9af3ff0bbb2232689c63ce4b7cbb880886b36681414902bf77a2623ae5f0c359c038f82433413d2cfa88373bbd17bf1d5503774939e916c415c8b929b5c2303234501ba642b75ef2823e42b71647014044a9450a55cedc0592da6554cf74693429d2d526d34851fda24a64450c785510111988982914fcba3addbd0963c3bce55f41b3cc71c0300ba32b02fac76158d673ab1ec7a23b30afd2a53d5aba3c3c87e0fa54408864037511dc3ec113153681d28c45b2a25e7256b6fa90df8b8ba8435b2f90727d4394eaf49981b397916c1642abb68f5006fbb2ba6c2c53b6dc5795a261ba674778ffa7e9daa65ac93366954710419c99fb21a46b029242158294107dfa28c53554aa3d79878b53506ea03846a9041664bab6056f7211a337910f77a2f37b993324927d64aa0d5085840475039c04acaf0ce5721b1f182b53e96928927961b8a04500118a453738c78b8a796ceebd960473b2fd2c9c825593ff4a95f3f659ef00b251449a253332171bbcb051699b100501f84bbc64c4e7f9c7db1190c4621664fb33c624910078155c1f2035d1755f7b10112e4521d58cb9c89575a3a2fa6caae5dba470a9b4d3fdc9b7ca6ac28e0570cc92647d382d04a5091d8a1ef749067848cda293a47d772372820f25245ff457580857eadc0bda0a059ecf1a3adfbc6d7e87184337e94231e8e3774c9854ef1c6b4c872bea6f939845942ff2732aed903a23b72cbb5122c43c8ed303ae0d33a7a704001890f0b378039ca271205d052fb594c526e7c761ad6b0cf14bb251225c7ff42b4b5f651ed55143ecc05cdb21962157e28d7be4fc4b5aebb6cfce5396fa51af1bc85fda50b00fa63ed800d60a5761dea715258bcf597a434e48b23202d8a415831c0417c6c43a659036df10772e796a2d70515939823575cb5c01d35155f7399bfe1b3ca9bfa47ebd69f5c8cc8879b87ae34a7dc32568817aa3f923df22c92be454e99d83023d3caa2e80e0ecb8818414b0241a6315ab20b63c422b6be8572b5e7f249fa3802fa647febc89c8ccc22583c144c191b91187257235d857b9bba3b13db06be10a35d712c540e7bcc62373d76e5828be049b6462d8da931f24a6827d314f5c0ad266a3529fa9b47cb6eec425b326ab0bfa032b6809d82c1cc3e2427787a413daa7d3976aaf83ac08d87b34da219a92a631784bce31cc66693c75aa58c7c87a9e3a926b5229a4f008b85090f351694f66743dae3a59a86299b43c20522cd82f96284623ee20b521794114d1459fdf70739558123f18ff8304730fbc63f198a2eb992e7115e07f509dc58b1e2a00c314714b5162334861ec20acac85664d14057d2788207c01a7ae383c93971d850102d60ac0d042c648c100ed660ef8a2cad375ae1a21b11998264e86ae0561e19d971689183968a98be064486b8abc3634021f770e2581b4383aa3c938bf3aca4aa2a337ec06647aa47428bc027339f2802b9f135820f3a8bea06846beac4c1a2702c502e50d338fb80a590a564f48a6606a10b51e839a4034f2b906ea34b4d3c875f1ff6bb57797b076638e4b576fe8c5a490806bfd178b4569a69626001c8a5fa1582bf4bb7bd586296f9ae74724d7b6c9c38d25273e114fed525ab008b887b9e5871172cc393938902914a3ace06a41cf92f6da963e4217f6b1363f7273cbf4a342865a761371f24285113e74f7a770079157c0ba0700e6bb9ca99ae10b83299ca9445b8024e450cb6152fceb79c0c433753c0b88b21c71bcb38c643ae5e16502fd14c0aa8939219005a15180446a166e74933f46f41a68675692e25816e7a227808764e20c98d33d6c3ef3801d21cb37d2872fe76749aeb09976580ccd4feadcea0b16f00970f92acb21c560501728ffd648a3b658ce84640d17ad1564189385fe895b25cd30d122a90decaa0583b908f1481d7cab000e33fa07de8dc9627a85e76fabb4428a3376e66300cf12a0787 + +# Official test vector 61, seed: "c799d57b41f28c5c446dfc58a5ac6499c4bcf3c162afd2b09a16549826ec2a6f689e44bafc4acc82f5d6aec23f4a3993" +seed: aaf6eb40e596a5e3e8218871e708b089240dcbe7fd3641f0e5e41e071ce49107e2f8d320ac3cb0c52efdc753282f092bc39baf4a18783a48ea031a191865eb78 +public_key: f81037775c727839696adb115a704f10199031d9ba3d3433ecb50702068392ac97a2db354cb311dc39aaf9719c4f5a7c0401282ba4697ca8c70ebc4e179893135179cbf02820d6bb7263708b2339f777c242f4c34155ac2452cc21904580b381a964c281d750c15c42d8477e7708c45c61bbefc6928f191260409ac31a61400350e928a3b24c313a71020fd186f6e9afab17bb065132588c115c31ca8c630275b4baab7a98a778b97a680adb4611e6471683352b6928b7f0378105383b5f981923e800ff11ce6b64904ad3835c270cad0cb0a6e1b8879cbe152221e6e0994fea9bfeb9cf4f582e4f429170295a8419c984283d79b882bb420876588ae6403f207b3798d89ddc1bc90d7c91d7d07aeeb2bc0e491269281cfe93129c5283a03630542a1312ba5c896b969ac0aba14a289c0672b964a6cb1c4a11c3617ab30e4beb8b8864285087a15c574c833166c759741f493438a535918c0ab0e46926d195802a5cca3078fcf3770ea9644a69c730314f3d91b5e04150b670b23448008ee55f841c148a699387d919dcdc63a23966a43b2927fcaf47f2cb36935d65622214403256753ef3dcaf73d183c79384e7914bfe597363684355f25ac1042505361a04798e377791b5553c449927efdb48606a272c029a2da819a48749bd66a32091946a2a7a0649095da1193c1650aef47099456861519bc8701477bb5b01359c4772269735485b829835861496e437a063838a0419ae6877d0c493b5c3aa56777f3a727e0ee5825dc83ae9f4a51e612002748a5d1a21c1f870f5886b39a23e0cfa14b6151053580a8d8a306af04a7418c88bb5c398c6cd8f6529edfbcd601c049872c11381ab10c0267c0c8c2f614b16d92800dd0989fb2a23887ccf46401b864552105dc79bb0def57eb8b6974723a9164c2737abbdb793bfbf00a860a185d3a81a2257ca91e09f547c6acaf35ac5833fdd9a1f38a5b4f5e227b3fc692677766bb81f85e34de5b200dd077573f0796175140fa9c920522d68040518c5aa8f84b1ccacbe5be03e0a0789372c338a1b24b47a8bfb0941aaa8601a7937d5577fdab4a6d3094aee7c073a7632f417b63383bd035a351c3656b0a52c6e435d6d6699946585b6ea9e8568307c18c025a80e9074629dd70dae6bbdba296e0897c8ea895fc6b5b446d1000e4c880747798cd42c860c3bda63607b69a6c4fb88082593c1d965ac6cc71125cc56a72b60d1297605787819749d43be46431959ac29a01c3ebaab30d9a18c1c7998d9e29415ba0cd72c0d933086dcc1c20c537a6f296d88f29b5d2a21fe314999cb6037d539081120d60206eef1b1e1a498eb65268e94366cd8912d269b2d12a3f1b99572e6138bc29fa5520c8a6cb23f90859ea0a494c17fe7ac09beb658f260cbf3a5cdf9933ca1659f2a0551b881055406cc6b72baeaccbbc4b6964751afe07754da9a8b0b151f02972df2bc1465929c0be64e38e6c55ed237f182151d1a91e4253c42d05badb82cf3457e01cb59a96730b5007ae0fc37a3a322115c8560f0a2a1395a88464728c18a16bb249c168accc3165305a6584939105b594af244c2bb41405163e5bb50fde104e7dc604a592b9e22649c0686be9a8860794cee458a73796ed877b18e034f2f50b8441609cf53280f9c095fd67749871245a4c2bc9cb008ea3e44f424dbd56a7c734b1a322de366541c732fd5f74a0663a61f277301723579158ecd08bd014c5cfdb7610b61789d8b84da23a58e571a72981cf63cc49c59ccf045acbd3cbfed4571f6daaab9b23bf26091bc581cbe301674972ee4420e7e0740bed617a3c94c3ca3be7125c7d6242185163398458311937adad8462b0cb3d5900994f5906121c20f6731ac81a32a864ec383bd8310bd64a30f3d575d936426e721228b93c0c482c1be106f4ce41c5e0057116b30cbf44aa2a217b08b690ff891657188d3b6702ffa9d8ed7b62cf78f6831a13b410679e60fbf9a3221906b5885404a7326589681c1549b9459745455bae21ca799796065925ff980aaa68c206b17aad1cb9511201e53dca34d439167d55924018e7e513fa919a4573b5500a91c8ab61f17cb5bcc282939172217365ef694c98a440b09c883cccc114769b84ce736c5c9c52b050ea16a0e4b8c58465438b7aa11c2c98ecf4aea6284cd00c4229cb6fe2f90dbbc05eb935c85f1ca2afde0d54307949544 +private_key: 41b21693eab370113852491e3791739eb8b3ba69a2c2542a85b4c536d840d4b90800a7a6062b7c98f920fdb11ba6b0262a647dee2570f422cce4b7673b51670be0694083c23ffb380025279c849a91d147ac85a3eee4c8ace51c314b21382009845bbc56c9a967a5bf25d1bd75908ccd0a5b86f14106998b27a41a38c365130a420569975da13bda305553750bc5b9402bc38646857bb50a97d016749cf7394dc35ba1f69c17b080a6961203514eb2520189b846d9597d3e443b0168028943bbfe80b1d0e4a323f61324352aae686b1aeb914dd33745da83f9451edde1359a630a4c79b4e9aa7cbc464b1f3923e981654f80922ef604465740938a9484137077533f4f7c379312306c6a26bad108cc16c59cb729fa6ca21feb2365f12e3e32c75b95cf9201bcddc2046f93893db11e35103303478f6a661e4747c854696d6fa00b47f3b18e32469e3b9312225b1a877eda5b2f17699ef4bbb5054961e2a7c445e70c1bccbe6613a4f332b380fb21565c809fd593e7076c42b9b891da4513742e45fc4e60934583f888f399b4a3a0054bdc3639b73f756b94edb5401fa66211d2bf7c714f527c48854a73ead8993fe1b3a851048aa638b2a5538848912f6672430273e82820044a6d6a6b4b80ea6a12aa1becf8b647292a2d328877c10d64706de00a677f0399e30b8842633e2246109a407465f096a1e4b9f14605387494e3f3cc7f200e4398b2c234575e022bce0961b0a8686537cad6054a81fc83b6167c7a855d54e662aa29358bc192a0925d00d15a4634453a494c96758aa687476a7b15075045684b51a82225a562c2d1c28b36ccce25668ced9ccd0cc58522d36ebb6c0368f67104f6c8a240b976c59ef5b46c62323cfe74bb95a55c8ee3b934253de101a11832cc91d685cdc1599da17362763abc4a63a0c13cba2123b76b391d20592c8799bf86054203307d770bc87696457962dfb39fa988a954532671818f6d7438ccf3c044599486e6b781933a45692e1fc79fad5a7d8fd8bde635ac05c631ace040f383b9e5aa69bf39243c711455f605ddac05ee905aecb6c971bb85c1ecbcb695810a713fbee75d71362e5b6777322528bc54a77b6a979ed7c48e9270ada7824814957563585334998fd6ac4566bb22da8cb18a425bdab55d61a1b8427ab1b817e8853ef002cf00389dc36a8e739c601be907d749b4165ca166e6a42253c897a6112d2994a0f492116181081356ab447787d3c8d399a807d48860668dfa2aa8890ca8a7128cd38cbff5eb5e6fc5a46c903eff075ab70a36b85958db922ca9172f53b7202744cf11452bdee486d44b3920636bd7962c3622633324a2bb5b82fd3225a0d83b9ffa6b433b19b49a11db2a19a7a5587553a4832a4dd2412502a575660bbdc1d9a23fc6ac2e7047ee9941ed3b99e7951c81d6473b440416a18332914d97b7c6897bb248876ad757c74d83950951c0d14724d99caf72d17462d006e4d0064d14057a2c1488c79faf4cc08114c9eb2c6ea68220d64735ccf603baa718bae17d130457835019e7e943a43347f7b3253e750bcaf71dd0f0a63d91c7deb97e270209a942a9512b635f5c704f830649909c7c1107986bcb7df1a191366f80ec694c179bcd9029f62880c60061627078b2d3277421169e45ae35f9991730159b005f50ca257ef3b1194b46dae425b9d67e1692c9f1c94da299a19aeab00f45c62449af52c81633403e2bc77ed6750eb91c1735411a32a9bd458029d31c1673c86db6eb6c739021bf1508ea97b902a14bbe298f676258d9260c9f7305d5d1248332069432941ad759f3488d3a2c927793add8ab08bceb6524f8b6f5103c2aac069d0c46f8c314d1c77a86a605db2a773aeb8b44ec8d12477970167ce70ab3a449276a7540313927e61239e23c79bb260aacf4c7de036cdd5a55a45a8a7b898fd8b209c6f643b4202b16187a87842b33f0574fd0a4198a7ecf7b46282b8344ebaad63ab34a652c22521561f2c74a68c485f4cf22735ccd203a8265ad5ea173ae4b8fb0cb4ca979ce33557bb09010767acc4b881f24fb94ccfa008a020e3cab56cba5c3c6c87d4bb6a2448a94c55bba200681d88878563b05454ccc7171a42abcc545649483418bfaa6c3b1e568b251962a75853b6634872529d31b32fa0c29f81037775c727839696adb115a704f10199031d9ba3d3433ecb50702068392ac97a2db354cb311dc39aaf9719c4f5a7c0401282ba4697ca8c70ebc4e179893135179cbf02820d6bb7263708b2339f777c242f4c34155ac2452cc21904580b381a964c281d750c15c42d8477e7708c45c61bbefc6928f191260409ac31a61400350e928a3b24c313a71020fd186f6e9afab17bb065132588c115c31ca8c630275b4baab7a98a778b97a680adb4611e6471683352b6928b7f0378105383b5f981923e800ff11ce6b64904ad3835c270cad0cb0a6e1b8879cbe152221e6e0994fea9bfeb9cf4f582e4f429170295a8419c984283d79b882bb420876588ae6403f207b3798d89ddc1bc90d7c91d7d07aeeb2bc0e491269281cfe93129c5283a03630542a1312ba5c896b969ac0aba14a289c0672b964a6cb1c4a11c3617ab30e4beb8b8864285087a15c574c833166c759741f493438a535918c0ab0e46926d195802a5cca3078fcf3770ea9644a69c730314f3d91b5e04150b670b23448008ee55f841c148a699387d919dcdc63a23966a43b2927fcaf47f2cb36935d65622214403256753ef3dcaf73d183c79384e7914bfe597363684355f25ac1042505361a04798e377791b5553c449927efdb48606a272c029a2da819a48749bd66a32091946a2a7a0649095da1193c1650aef47099456861519bc8701477bb5b01359c4772269735485b829835861496e437a063838a0419ae6877d0c493b5c3aa56777f3a727e0ee5825dc83ae9f4a51e612002748a5d1a21c1f870f5886b39a23e0cfa14b6151053580a8d8a306af04a7418c88bb5c398c6cd8f6529edfbcd601c049872c11381ab10c0267c0c8c2f614b16d92800dd0989fb2a23887ccf46401b864552105dc79bb0def57eb8b6974723a9164c2737abbdb793bfbf00a860a185d3a81a2257ca91e09f547c6acaf35ac5833fdd9a1f38a5b4f5e227b3fc692677766bb81f85e34de5b200dd077573f0796175140fa9c920522d68040518c5aa8f84b1ccacbe5be03e0a0789372c338a1b24b47a8bfb0941aaa8601a7937d5577fdab4a6d3094aee7c073a7632f417b63383bd035a351c3656b0a52c6e435d6d6699946585b6ea9e8568307c18c025a80e9074629dd70dae6bbdba296e0897c8ea895fc6b5b446d1000e4c880747798cd42c860c3bda63607b69a6c4fb88082593c1d965ac6cc71125cc56a72b60d1297605787819749d43be46431959ac29a01c3ebaab30d9a18c1c7998d9e29415ba0cd72c0d933086dcc1c20c537a6f296d88f29b5d2a21fe314999cb6037d539081120d60206eef1b1e1a498eb65268e94366cd8912d269b2d12a3f1b99572e6138bc29fa5520c8a6cb23f90859ea0a494c17fe7ac09beb658f260cbf3a5cdf9933ca1659f2a0551b881055406cc6b72baeaccbbc4b6964751afe07754da9a8b0b151f02972df2bc1465929c0be64e38e6c55ed237f182151d1a91e4253c42d05badb82cf3457e01cb59a96730b5007ae0fc37a3a322115c8560f0a2a1395a88464728c18a16bb249c168accc3165305a6584939105b594af244c2bb41405163e5bb50fde104e7dc604a592b9e22649c0686be9a8860794cee458a73796ed877b18e034f2f50b8441609cf53280f9c095fd67749871245a4c2bc9cb008ea3e44f424dbd56a7c734b1a322de366541c732fd5f74a0663a61f277301723579158ecd08bd014c5cfdb7610b61789d8b84da23a58e571a72981cf63cc49c59ccf045acbd3cbfed4571f6daaab9b23bf26091bc581cbe301674972ee4420e7e0740bed617a3c94c3ca3be7125c7d6242185163398458311937adad8462b0cb3d5900994f5906121c20f6731ac81a32a864ec383bd8310bd64a30f3d575d936426e721228b93c0c482c1be106f4ce41c5e0057116b30cbf44aa2a217b08b690ff891657188d3b6702ffa9d8ed7b62cf78f6831a13b410679e60fbf9a3221906b5885404a7326589681c1549b9459745455bae21ca799796065925ff980aaa68c206b17aad1cb9511201e53dca34d439167d55924018e7e513fa919a4573b5500a91c8ab61f17cb5bcc282939172217365ef694c98a440b09c883cccc114769b84ce736c5c9c52b050ea16a0e4b8c58465438b7aa11c2c98ecf4aea6284cd00c4229cb6fe2f90dbbc05eb935c85f1ca2afde0d54307949544b08a2ea8e2ff6fa677e3c2ba136c16dffd11094ad7f4ed4c5e7c11e3898a284ee2f8d320ac3cb0c52efdc753282f092bc39baf4a18783a48ea031a191865eb78 + +# Official test vector 62, seed: "f7ae036a0176a9de9a036a542dd2840033277c44ae936d10b768566216de9d4395cd42b116873b69d9804ba6ccbc05d5" +seed: 6500f32c93415cfdbc0bd31d78d5be95cb9060c8cfa2013955b56f8b6868b322393308641a9a4647f230201e1389624a296b55192a9819fcb19ab77c25f95445 +public_key: 5227748594cc5ac52decbb390cb6a9b8f989c7048017f52231125d91c51ea6174ef4a37b7cb505b4a029f44079e14b957ffa2f8f325e7334bcfb5b023b4801f5f576333c54ef0440b4f7c8f6b3afec2524e31943fd6323d8f2300ba1b8095309e41c1ea6016de8f6ce4af647db19467e492c1cc12b5b5426b8339ea122473d1b84c603babba7b32534587145b360474a8483be8b06a6086bc5666a9b5af8b4eda929fb60606b85305c89cbd26a4be8a6b4866808fc2120649a60a3da2c64330a94dabbdc4cab2b956b2a5b7dc9e7cbdac88a71d5c06df3b192c5cc5dc6b7d10b07846026a3f5cf0e5b2c5d1c80bde5c3ca231ac908bdb7054190e77d54d40b9e7534dff0b36eb92652449aa4305967e57c9e358f8114544e0a5b8ff2c490c4a3267a405e38653449b617f26c6a3a74033ac483c074d5d0029d882f3507a7936845a6ab4d33bb4dda806759852488a06731222681326e9c6691077a35a7791734bc6b8e2511ab961bb1f17ee411ae86ebabf1b4968da61faf667b507450fff1a3392425457ba4625086ab1a871c8386982a322b82b7cf198ad639060eecc1c2e40bed7462ce4c6792764509e5cb9cc28b5a71a26d52658c0b5b951180f903bad708ca9bf7995e4595b8a009c614406c669468c1b4fa3740a9e91c64c03ce4a3adecd19a716a82530a508970cf16fca38aa10baf9810a8c3334c7b4a29904b7f72bea3e61505107e641c2be03ccd6c0546d2698c110caf2f194789c616ada3103b5c7f015991d473837e9451c9cbc9dd02333636bbbc825dd0da77a6731fbc3a831348cf1a3550166b72b4d0c59a5bb31de1829cc77c235b73bbdba937e5b45a456198b218b641be8c05ccdff9746bd64fd5a759a4886d3022cb63167aa3f37655a55e9acb9671262aeeb99f6d5618212419b1a41b7c260213b86ad9c995294b9e96e77ba66a40f9b5243bb38e6b7a7311d7c29c9272f98308a5f68c58cb111e33964b797a151588ee515fc0f032b054c7dd35ce5c734b8887465b0b4bb58c491f9953b1133561977f0c25401e6b577cc1cbd555bb8ba7760fb972a6b2344d2222c0fa575717501b3191ecc598bc93bd145800d9924c06c36d0360aab9678e93138d266572b305b7ea69a6ac8ca3ed647137090cec1227169754b49324f029776ad3c6c3e33e14170265296c1a7056282074a64690450555945a87ba57b54eb3595df82e81c1552f19c415c6cfdc0cb5fb32c3db060dcc208b6beac782668eddf9986e0a1bb5a0941a3745ee0b73ca0a5f98f5928bd7189ac6b20205555050846edb51a75573e9011f2d7738bb8c58bcd16795805f03a42aff1b854d3981002614b39b90c6f8bef32bc0cdc085466c8f55c7935b96157a624665404468783478d4b121d6b6a026818dc04515d0b98f9a1634977d3521316839253b7a847224c3819802d6b84482988122a7c87d069a13315fbaf56c9047c03641b4b008070bd885f1e3252f16918cf03af8634a8f7291e7b64df4e14feab909c10c7fbed446bdf2557d8a96e2cc17cbeb91515a2ff0b78bf0a21abcea847deb7311e2a782a567a6b1a57bf105a4513de2c378b1c0186909838a01abc000a829a9503d8c12f374c0d48a32c6f539a2ab28ad12bc49507e230c9a3881153113c1ddd446ab513608a567aea199624c98845a3adf90a5a89a3098091f207b46f28a5659f54c75a01347e18a11db75f9247749c03c7ccc6b9ed722da1b118d3c2760216c792b7f2f406397bc9a7f18343812a09e97a0f6c3c3b87179888a6d69b01b9d8c4b8cd215af5b76f7249747aba3537044f7991bc30854eb68c2f6f8b404257cfd6043a3a327d457651f0b600415a977d1cb30904bb853b4dc380ba4802b28f7c479fa7705b3a6cdf8a99ce2604af2670ab6a751236e08321d61d92a27412febca600fe30850f3c86c647746a65b1a9210adf34003a39c16ea69a626c73929567f1b001923b4f0726337f90124b74e500007ee8938cebb15e1f993e1ea0726d04a5e3b52579c625ef79ebf66485083ade6b1bbd0c9a953092fa80755f1471ff7f063a2f0013f429f155609142a685039c0aa540b3e410654803c7f281ce44b9cae5842f7347b29336b5125586d151117f3afe13669bcd7991068bdc68676a7f30708906db24033fc5822b8cbe33012f5e916c80ec7dfb3661e433431ccb796ba70c5a1ee85d63d +private_key: 79949cd3da852b8381b94853cdc981b74971879b0555d5b51d5ac57707a8d340c2070c9395214d3a6c0afaf0a675f45f4fc779a7443219471570d43bb73caa4c9501f2a220ffa00b60695b049b8543cb0aa94884be42276588c4a211908dc979a0292a9b3c891cd2c59e39bc11b725d66ccccdcc9d35a03d390ad0656bafd8f9a778222c8fa753f4d78bb1792e87542c8fb3b71043607d77672b1a6a7f7840eb953d3290cdbfb78ab1535aec0544bb6a6398466eb1711f9ce01c42d2aea9fc255d694bf4c02b7e1cb6763b274807b1802aae3a3a95e57c78002493faea627bf5bacb17a3b1085baea7802958c9bdb398377629b8c8c03057497bd542ea4c6b28c2cf0cf316cd820c6cec0e2bd121664c252b0b570826ad17490363232d731b4f16b68291c78c3ba252ff110bd756225ca82b38e2b65d9979bd2b7ea0b30d83461f6e09219af2ce1309cd99a87de718cd46e40c091603cb572e6de993e0051f84b55db3ea6c7a64b9c67bce6c3c6a0bf02cecf39e93d149ea38b585d77be9726e662860dab465959588c9225303c8b4ed935ded42721196747f104f02c17cdf3520f2435ca0f963d9ab8754f13b22ea157d0c061ca65d8a363c8c4278512888ef6111618c18be72103de324cde4cf16f26f6a8421ae61aa867b3854d54e0163811a3843a7984e815a26a135ca43d249d17c9d93f8a742037db4d95b2fe33fa3da0db12b7247d665f7488ba34ac5ffb0cdd0e123e812b6854739bfa740792b0a5038037c59991aab615f937caf9b89e4b9742992c5534939e20353c8573d9ee399280984b446a851868775a7a0da729d8c594a5f5518f0681e22069326b1146d1213fab35b0c811d990b529f7c7f7d11645da77ca0f081ad592291ba2a0e15a880832ed7f02fc70908366485a9562cc45888c1304aeea26e9ba961bbb53c89f79265a962f2c72b39f9cb43118a22abaa91e96fbef1c42e6334aa258ceb739bb17a24aec2a8f59b972cc7910647cb1ca86031ea4b80c97308697cc4f414f7575154d51ce8c9bc9309c92b113da36a1915934a64cbb358151dc28186c7f71bea603c73f1c5aba4a6da017f10b16053d77cc92751bdf8c59220b5eb574e1f51a374f337d663213d3756f9096b6b9421a692a4820943576ac2a10246207aafdeb8acf6dc32b9a6cab2f1ae21dab2a678a308e138298a1d947151b5743d8eca936963271ea15d5195304d268d87ba70e1c1a9ded02ef5da2e077cc8a576b433716c419808bb187c9fec2371832a09360525b49d89c84f84d1c10f1a7514077d14515ea63918a76577f1957cb0cc393e7122c097b51039869765342aeab8106398ffc009e0f403225b2df37c3d71f93c78763abb49bf23e7a1c3a1695986824a54aeda43b3f7dba478097cb9019390187a6d9b8d9b684ad169ace6f1b0fdb9184fcb15b0e724fa17b986576b3f5986a5fc603b466d232094402b0571a82864367dfcd17a53c3c74ae4ac0455af209b05371174312679ee5a8d1a3326b70246642631a479bbe51bb73581549f7957747b87030ac019b454522b31cfa9cfcb7518deb670bfb4b62cc964109c6773b885691b199259412f49b00c5ba719db7162819e20984373175170f7a16de42ef8770e55a6bb6d98748f9a0e6dd1335e2669764bc2754c7223b8a23986b5c7d49d3ea4a5529422a98c7b4de1205465b357a1c8fc188eb0c4797f847602cba59a20a4a2842bc05a4dfac46b1469be6c434e6feb017be1cd206247b6742edc1141f9b54fa00a8f757887a4d04d0fe892db899354e73442265251b30caa18496aa22806425f0da193f4932bd057c8c7a06ebbc3cf373205ddda04efab885d12396b09c1df636dd5d5c721f103c93a18b5227ad0e3339d44b804b65a6c628f71fb5ab900a8ab9917c94a51540a7b2f9badb405853e9823d30a80ab9613556555b4273486927427942e7a6caa1a727dfc59089f540a2beb9802c91f324668f78a9e4431c6255603c5f15642e60a0dd843f8fc610fe102716333121105bedbbf161b77d0bbcba13296967a68c14aa99a6765718ba3782b3835f7571177212e0763a5cca4492b94ae59616f9b5839141af31a774fc32fedf0a3408c211050948c24a722a48ca6913b32305e7a5194b7e187bc255f3618532075355227748594cc5ac52decbb390cb6a9b8f989c7048017f52231125d91c51ea6174ef4a37b7cb505b4a029f44079e14b957ffa2f8f325e7334bcfb5b023b4801f5f576333c54ef0440b4f7c8f6b3afec2524e31943fd6323d8f2300ba1b8095309e41c1ea6016de8f6ce4af647db19467e492c1cc12b5b5426b8339ea122473d1b84c603babba7b32534587145b360474a8483be8b06a6086bc5666a9b5af8b4eda929fb60606b85305c89cbd26a4be8a6b4866808fc2120649a60a3da2c64330a94dabbdc4cab2b956b2a5b7dc9e7cbdac88a71d5c06df3b192c5cc5dc6b7d10b07846026a3f5cf0e5b2c5d1c80bde5c3ca231ac908bdb7054190e77d54d40b9e7534dff0b36eb92652449aa4305967e57c9e358f8114544e0a5b8ff2c490c4a3267a405e38653449b617f26c6a3a74033ac483c074d5d0029d882f3507a7936845a6ab4d33bb4dda806759852488a06731222681326e9c6691077a35a7791734bc6b8e2511ab961bb1f17ee411ae86ebabf1b4968da61faf667b507450fff1a3392425457ba4625086ab1a871c8386982a322b82b7cf198ad639060eecc1c2e40bed7462ce4c6792764509e5cb9cc28b5a71a26d52658c0b5b951180f903bad708ca9bf7995e4595b8a009c614406c669468c1b4fa3740a9e91c64c03ce4a3adecd19a716a82530a508970cf16fca38aa10baf9810a8c3334c7b4a29904b7f72bea3e61505107e641c2be03ccd6c0546d2698c110caf2f194789c616ada3103b5c7f015991d473837e9451c9cbc9dd02333636bbbc825dd0da77a6731fbc3a831348cf1a3550166b72b4d0c59a5bb31de1829cc77c235b73bbdba937e5b45a456198b218b641be8c05ccdff9746bd64fd5a759a4886d3022cb63167aa3f37655a55e9acb9671262aeeb99f6d5618212419b1a41b7c260213b86ad9c995294b9e96e77ba66a40f9b5243bb38e6b7a7311d7c29c9272f98308a5f68c58cb111e33964b797a151588ee515fc0f032b054c7dd35ce5c734b8887465b0b4bb58c491f9953b1133561977f0c25401e6b577cc1cbd555bb8ba7760fb972a6b2344d2222c0fa575717501b3191ecc598bc93bd145800d9924c06c36d0360aab9678e93138d266572b305b7ea69a6ac8ca3ed647137090cec1227169754b49324f029776ad3c6c3e33e14170265296c1a7056282074a64690450555945a87ba57b54eb3595df82e81c1552f19c415c6cfdc0cb5fb32c3db060dcc208b6beac782668eddf9986e0a1bb5a0941a3745ee0b73ca0a5f98f5928bd7189ac6b20205555050846edb51a75573e9011f2d7738bb8c58bcd16795805f03a42aff1b854d3981002614b39b90c6f8bef32bc0cdc085466c8f55c7935b96157a624665404468783478d4b121d6b6a026818dc04515d0b98f9a1634977d3521316839253b7a847224c3819802d6b84482988122a7c87d069a13315fbaf56c9047c03641b4b008070bd885f1e3252f16918cf03af8634a8f7291e7b64df4e14feab909c10c7fbed446bdf2557d8a96e2cc17cbeb91515a2ff0b78bf0a21abcea847deb7311e2a782a567a6b1a57bf105a4513de2c378b1c0186909838a01abc000a829a9503d8c12f374c0d48a32c6f539a2ab28ad12bc49507e230c9a3881153113c1ddd446ab513608a567aea199624c98845a3adf90a5a89a3098091f207b46f28a5659f54c75a01347e18a11db75f9247749c03c7ccc6b9ed722da1b118d3c2760216c792b7f2f406397bc9a7f18343812a09e97a0f6c3c3b87179888a6d69b01b9d8c4b8cd215af5b76f7249747aba3537044f7991bc30854eb68c2f6f8b404257cfd6043a3a327d457651f0b600415a977d1cb30904bb853b4dc380ba4802b28f7c479fa7705b3a6cdf8a99ce2604af2670ab6a751236e08321d61d92a27412febca600fe30850f3c86c647746a65b1a9210adf34003a39c16ea69a626c73929567f1b001923b4f0726337f90124b74e500007ee8938cebb15e1f993e1ea0726d04a5e3b52579c625ef79ebf66485083ade6b1bbd0c9a953092fa80755f1471ff7f063a2f0013f429f155609142a685039c0aa540b3e410654803c7f281ce44b9cae5842f7347b29336b5125586d151117f3afe13669bcd7991068bdc68676a7f30708906db24033fc5822b8cbe33012f5e916c80ec7dfb3661e433431ccb796ba70c5a1ee85d63dc27bb236759e3a2af7553c03894124a6bdd3e3c87def1f1bf3e01fac4709aa9b393308641a9a4647f230201e1389624a296b55192a9819fcb19ab77c25f95445 + +# Official test vector 63, seed: "d995d38f934b6e1a7ca77c9522e3d037676cc939b0c8bd4b84394b3dc91a791f09d2d97199258c9943da955e7f7b26fc" +seed: 7643cef2d62cc5aaeecf754653ea62294cd2208e5bf3ddeea209e3dc45373d49eac9d531a532770837a854b4f5531f6e0c8d6c10183b30d3435498c2dd142951 +public_key: 03a595bc577a703b4201253367762bdc7a8d14e60784e5bf04ac62f5cba8327c781122427a83800c9b342792ad6e93bdca2491720894dde616a9a9674e771439b8704ea57d70e9095e05a03f3155c3007b1ae0467b7c7bcfd67a5dc679c8f6ba53b44c110560359c65ef6425f667b5ebf967497119fc3b0bd0600c93fa269f349bec1397c4b23bd851a0824b80b664070622860aeb98f2b2c9349c8e0cc824f5b0386348a77857c277496cf10046dfd59765dc9d00b013c3002060737e668cb6440aaed4f3220f789826b579359a3338b91f6584b27dfa7324f61859370795568de4cb39c4b1b015fb693f42c09e981c7c5658d1cab448a947f3a0caa999625131c9118258ab7635d78caeb86ac5c100b30a57216f586901d1863e27262ebc2e3ffc09ac4b6ae45c968fa81aac089a04e7393409799e853499888dcdb29690c12a7e512891421f111a2189cabc1d00a2fb9878c0057144bcca25c9a3f1a2c3b92c61261a3557177628a252347355bee55dcec7be730639fac28e0536c0636bbadbe97674d83b6c209442b34e37d9a43d508e849b3c21369149a7270e56646d984effa143c87777083bc54270b146291d8b4cbafc6ab7e72a871469abf3018ecdbc0753b94ba98140e4956c80913efffb22ad687921560055f466b1744e9bc851e12648899b7665a18a71130c1e4a47c26cc8f1a4972512186fb89a740cbebc6553ac3c088b01b21bd9c47cd5578cc58fc4697a0c756e7f860f91086aefb4cd02d184d294acf1f2872191851f585d96d3b98a755bdce648e8d7ab5e8bbbe8ba0b752973fab007e5390bcb6ab750f8aab5c907042ab8f49acdc47271d6b2a2ee148f13518243809fb5651f6da4379225bd864597aa65343b21b8f8753ab2994d981961cea24b7f780643b5674520b7fd11793b1a4ff110aac7516c1861ad54296b917c72e281692797af7a594e50c35d958436816036d13348f81851bc5332f6e1b55aa575af0c0035432b10abc89ca5cf19170d9537c413d1c7674992467323ded94c4c6b694558cd3ed45447bc5fd3979a68427916a9297904b02d48918d914ad9e88c99b5c28a6ac037248be9d3054adcb0f3746acc2c0a6711cbb1401c6d08d07a947d3bc35eb7b477ce19068fcc744772a126f98789d349fb7c58d9c91cb1ec4830ca54e2e44dcd27b45c48ae07e84c045487b2252178075cda577b26704803a94f9b07acc6e815a75696fc927c1cac2c5be290855247a4546288a383c15b05714c1eef845e9bd70ef5d3284d5800df8ab0a6522372893618d6a28a922152b1adc2e93f60813025d2b15667947788b93ddc34f05374c9997a0ab8b72023ce47a50c86ba00c86a37e33b7516437a23d37d6dab5197a88e823a5129d656af31b755a89c4df21b520b3cbda5581200c9695b497ac2b0f582a42ba28b537a7024d30c127907bcc1667547b79ae655b4143723dca5ec494d851b3e3eb763f4809cb045ca69407627cb49aa59099b050c26151b4d89cc55e762c1e358f1679b7f30a8cdc531b80580beb1b8495487d2d0ac3a9a240ac1acc457b53f6aa6a580b79d9cb953240e9bf90e54644253dbc79b2b3028e26ac8641042f7715d97190e64ca4e13624530a882bc53b2c724f68511021641ce277d0ae32d329b9ff554502ce25a294a3829c770e9565512d52f08211b7fa583ca675491533d14813ddbb96ba4f05fd9b95cca052b7cf098000882be1c2ad9865e4b9b0834189f91d5444791a561ec7baae5c82b09893a900920d6bf6df1391cf1a2506acb25d79f6d441a17bc5eb4d133f5059ae52565014939aaf208882631a531582b486bbd72850a0724dd52a225c40fa2a33f312c16a426a3162993cb7370d23c300e2a5d2a70102e9aaee23b715c11860386c4be5080283a4727954f2c5197e6125bc2c28757a63d46c0b322299e5f483edb10caef28c44cdcca5a9bc9505199e7da28286815757a63ff83c7149bc0152a674404b3c2c06949950f7b073f537728514b20c676c53176002a8c7af2865ebcfa57f1226fada60eeae67fa5417ea4b863d82c3871c4269974bb76e3338328c00530122e38c138e42df370cb51830980f9a6b4829af71a7149a28379a251530306d0719d0d6794f89750ce06c27a913832a9595b9a9c1728bbdc4515cf1afe1dcac211a3135eeecae628aac9538ef2fa7dac989ebf18207def +private_key: 01ac758391018442afbf29af226cac76c6bcc2f256e0454802a968d79b90ebe3252fc57781952afff183ec0c7b11ec71a6868963335825c00cedc8089d822e8470978d74c75806654ed5bf178ab7f1a658440b0d28996b4fd23cc4104f811882a1129fbfacbd29ab2f278ca869ba0722544f0d28c879f0b1655525169a723a09bf15cab7d3a1ce835294ae77c3d55c7537478660cb696025cb0db431fa42349ee5266d5c41d92c64544a6a79d9099623b513190946b24bb2707259eb40ad59510496bd4eac68ba9c14058665a465578e2bcf28068f54b47c957a7a1d1004648b2332a113c85b0261f1474718c95b95553e083b50b69d455764c6718fc286348c187fb0f8cdbc8a7c37db679fe41d853769ecc03063aa1dbb215f044a025ce98767e7a52fbcb44a9c67b5529e3f9b9953640e525471511336d993b6e741bd9e8cc942a1219fe23835384ac0f990f1646e487aae445065ccfb1cee5790342b4d9594687bd53b871b2ef34c619994093f368049a6a483c007ba115af85c976fa28787805bdfc158f64b50de04ab3b82ba026621ae262d25c4bef55776fe7ccfb15524120171e806bd413300089490d233c00fd20783630e2bbc5a661a0700cd1181c0559ed5712e0949c720cf2b15b776240b7535b76a237e37a86b81f6b59d4418c3a00624166559e180e18acb91157c715c0030640522eaa523d76f073a1279b570eb08b14bb697c93345c3da33b6d65f5ba668c80477140c22a56700feaabd73f90237c54754f377695b83a7d5ba8ea4cd9934cc83a3c7abecb927e1cb1ec405b58a7c4a010d3df2a9b48c213d0b63dfcb1533602d26614c08995c561a3bdb4933a6ca3defe340e52a20e3894e8bb95657e8ae363b928b3648ec266193d44c11ba2e47e2656d54c3a13558510c9a739c7f857b586f13a5efcc403ad347eec8623a3b41f8447301e1bb512766eb803fc1460d05880d8272c4b38a03894c2f41b1c4f08a416bf06b3595070e985768132bec00c05f5ccfefca9a1851c9b4100110051c977729b7d3446edb2ec1d02820d189fc6476b6aba6e08021e5000fe8f20d8c48b75daa6d8de2c0456345cae60309589ba9c289c6dc664328b5ffe10610a5b2af41053e21c8b58c7872ca332a8b6d12e75f739a6bfda88e85690cb35c5952c1a238d2b82ba0216a44a9c1d346188ccd3365b0f0e66007b606e04ba1d8c2c08cb6a901f491ae6c4442417a86da9d7051812066a652ccc178c0be52b304dfa4b6092b8d5e8486d4918321b6537f883661cb8ea4596c804c6534c40404f992841309f272cb61ba90d7a439dd204d9d7369523087fa2818dd56a712227d96f026f1fc1d4a3b272475beb1c0a398189fd392b0112ccaec4704b7983c10da4b1735ad78cbab8144b485f2b721193b1a9654eb734dfd2b42b50078db163b67c192f014becf74847bf47f19e5a70eb6b28a717ca908a944ac6575f43d048950016b69bfb86e21e012e15435cefc11e5b6813ad37942bb646752b82ef9c76f99a77b0707a8338a7528c01981b2b19cc64be2ade4e384aec67773912e0dc9c8c5d431c099abc663bec1f64050517acfb8584323169c941d1dba6c0be940df049e7bdaae440614e9c389a5817e54700b1710a24467146d124a12b90fcd18a964a8ca0b8883ab26916ec339d39133981570966083dbea8038716d6a574a03710477bc7776f7338c435c4ff27ea3b42c315700d327757b821117595026392e8526ae12c51b27752499cc02faca268594bedfd3637d78abe703b4a47564f7d78f87726e6ab45e814493e8103aa0255c26cabdd1321205657878460afc005bb952482d672f8f9c4196282d5558085857a83bd43ca75805557898d49a9afa414d6d2ab315506cb2879ff7628982588b62f2a428e21516c47757e36a1ce0236d9a074cd2928c043066ca3a3358b6d8065d8ac8458ce374ac71c0f6c6415faa870b760aded1668fd09f00dd2650dc75b426228d23b579204843cc0a2c9170b1155d7e445f93788308b316b9fb2c3b3c6ee79026ebf611505bc91a476baaf65bccf86091010dd14b7456e2a2ae8b0cf7e655ff251515f6627e01b1279bb0ed640d266c4b9798647fb17c09cc183f2170e9d8709f537cb6e7911ddcaf969c438c55623b89b037708303a595bc577a703b4201253367762bdc7a8d14e60784e5bf04ac62f5cba8327c781122427a83800c9b342792ad6e93bdca2491720894dde616a9a9674e771439b8704ea57d70e9095e05a03f3155c3007b1ae0467b7c7bcfd67a5dc679c8f6ba53b44c110560359c65ef6425f667b5ebf967497119fc3b0bd0600c93fa269f349bec1397c4b23bd851a0824b80b664070622860aeb98f2b2c9349c8e0cc824f5b0386348a77857c277496cf10046dfd59765dc9d00b013c3002060737e668cb6440aaed4f3220f789826b579359a3338b91f6584b27dfa7324f61859370795568de4cb39c4b1b015fb693f42c09e981c7c5658d1cab448a947f3a0caa999625131c9118258ab7635d78caeb86ac5c100b30a57216f586901d1863e27262ebc2e3ffc09ac4b6ae45c968fa81aac089a04e7393409799e853499888dcdb29690c12a7e512891421f111a2189cabc1d00a2fb9878c0057144bcca25c9a3f1a2c3b92c61261a3557177628a252347355bee55dcec7be730639fac28e0536c0636bbadbe97674d83b6c209442b34e37d9a43d508e849b3c21369149a7270e56646d984effa143c87777083bc54270b146291d8b4cbafc6ab7e72a871469abf3018ecdbc0753b94ba98140e4956c80913efffb22ad687921560055f466b1744e9bc851e12648899b7665a18a71130c1e4a47c26cc8f1a4972512186fb89a740cbebc6553ac3c088b01b21bd9c47cd5578cc58fc4697a0c756e7f860f91086aefb4cd02d184d294acf1f2872191851f585d96d3b98a755bdce648e8d7ab5e8bbbe8ba0b752973fab007e5390bcb6ab750f8aab5c907042ab8f49acdc47271d6b2a2ee148f13518243809fb5651f6da4379225bd864597aa65343b21b8f8753ab2994d981961cea24b7f780643b5674520b7fd11793b1a4ff110aac7516c1861ad54296b917c72e281692797af7a594e50c35d958436816036d13348f81851bc5332f6e1b55aa575af0c0035432b10abc89ca5cf19170d9537c413d1c7674992467323ded94c4c6b694558cd3ed45447bc5fd3979a68427916a9297904b02d48918d914ad9e88c99b5c28a6ac037248be9d3054adcb0f3746acc2c0a6711cbb1401c6d08d07a947d3bc35eb7b477ce19068fcc744772a126f98789d349fb7c58d9c91cb1ec4830ca54e2e44dcd27b45c48ae07e84c045487b2252178075cda577b26704803a94f9b07acc6e815a75696fc927c1cac2c5be290855247a4546288a383c15b05714c1eef845e9bd70ef5d3284d5800df8ab0a6522372893618d6a28a922152b1adc2e93f60813025d2b15667947788b93ddc34f05374c9997a0ab8b72023ce47a50c86ba00c86a37e33b7516437a23d37d6dab5197a88e823a5129d656af31b755a89c4df21b520b3cbda5581200c9695b497ac2b0f582a42ba28b537a7024d30c127907bcc1667547b79ae655b4143723dca5ec494d851b3e3eb763f4809cb045ca69407627cb49aa59099b050c26151b4d89cc55e762c1e358f1679b7f30a8cdc531b80580beb1b8495487d2d0ac3a9a240ac1acc457b53f6aa6a580b79d9cb953240e9bf90e54644253dbc79b2b3028e26ac8641042f7715d97190e64ca4e13624530a882bc53b2c724f68511021641ce277d0ae32d329b9ff554502ce25a294a3829c770e9565512d52f08211b7fa583ca675491533d14813ddbb96ba4f05fd9b95cca052b7cf098000882be1c2ad9865e4b9b0834189f91d5444791a561ec7baae5c82b09893a900920d6bf6df1391cf1a2506acb25d79f6d441a17bc5eb4d133f5059ae52565014939aaf208882631a531582b486bbd72850a0724dd52a225c40fa2a33f312c16a426a3162993cb7370d23c300e2a5d2a70102e9aaee23b715c11860386c4be5080283a4727954f2c5197e6125bc2c28757a63d46c0b322299e5f483edb10caef28c44cdcca5a9bc9505199e7da28286815757a63ff83c7149bc0152a674404b3c2c06949950f7b073f537728514b20c676c53176002a8c7af2865ebcfa57f1226fada60eeae67fa5417ea4b863d82c3871c4269974bb76e3338328c00530122e38c138e42df370cb51830980f9a6b4829af71a7149a28379a251530306d0719d0d6794f89750ce06c27a913832a9595b9a9c1728bbdc4515cf1afe1dcac211a3135eeecae628aac9538ef2fa7dac989ebf18207def1330f4828e22a13ca5031217a3d8e6f8ed708a7026e1a96d8ebc4fd2f54b5051eac9d531a532770837a854b4f5531f6e0c8d6c10183b30d3435498c2dd142951 + +# Official test vector 64, seed: "5929f02a271725cb40200de32d9d03d8bea53b53ac83186c42c7f565ccb1ca508305d470850cf86e9b2c61a5b8ca1c93" +seed: f8ee95521060c03bb8dacc79f7eb7db640f545f315613a35d447a09e504cb4e13fc3d8392cb53f36ed647364a04e37278a0e0a45b720f4a75c580c9920eba98d +public_key: de62c02cbc473601b03f5547f1b4a8078aa079c4cf39c56f88925a9383b9a0f57b58741760c58d2629c5d70074df007e715a3f9344755ba908a4a310de73150a79a9ee3957a730687f4b2e7df025c1d699c254af6642bfab84809ea9a3b35410c7688b296a3da82c6cf6790b48fa3f66f5b651912e7939ab76b0935f49c1e0a25422365974698c9532ad00120bd2ab10a8d1a78ecb392e6892624a3f96b2758a423246d67933eabe6ba2bc019a031431338ab546b3154a80945a9b31bb5f9c4071a4b0ac4b1b85b3a11ae1371db39771259936a27ebec742e7d6282f19c4b6ec1a70085ec6cc23186c8a29f4c3a1d3ade8912e3e238f024cbd30e61b1ff2312c91a2eef9cdab68446bcb64ae505c32f0ca5d02547c3b2343962df8d384bac81d15fa3bd2a116b4d9aba31041428ab688f950809c94404b5c35f303d9852a0f029e609126110b64e310c81d634117e3b3e1994ee2a2799600aa38966e00aa9450f24657a39b4901764c3a267f2018363950256a69d5b0240f368bfb238fc3abae22dc2f3fa6c9e7f055a8712cec654adc039c49aa1d303158e05b0ee4f1ccc0e07cae74047b603671b9704e70646cdc0b1d1423bf3c4fca6612360269a26b9731524a2117a2b686131708470ab6c1ecec857465cfdcaa5b1506abdcb6a5e379bb4e358462f802c2a81b26d0091a9a281a891c06737fda60afd65ab7c7bc4d97667220ea69896a46f20200b0333546713d9e685d8230487bc39b68b170105231839417fa92aca1cc38246b3d0da638aa28c907c823a1fc779b7626a1146645db0582e23115c64ca6468bc21a480385b27fcc28c0e6b8430a270c5061012a619da7138ca97da7832807aa4f338a3983170b62145f36a35241d21c13c61a1044b5bbd2232f5c16f106ad476818f83920f650a87dd80c3213680cc1572b0625391a92dd423e53dcc0ef58ca376b18a46b8ba4506878f38c88d814bba280575235b23107bae8c1f443a5e9c1058c904a09366b50e7b531451f8416342267352fcc7fb21c05bad69bac0967778c0c2d48a60980ab5b7901b84b54f1a53b6bb09b37d48dea04838193657cc7b47b436d4dd36cf9bb4bcc552700f98a88a850dc009b00bc41c9f552e5b346416024065634f4d768cf49bba831758af42e408668aa712f93f43658c48b80a72bfecc0258ac6fb10c51ba665e8f25537116ae53336a8f3a0d2101b705642c5891b4500ac61d023398b35a21e37ec6c9821eb46c348c594590941fa0cb5d88ad32c3165cbc3569e15960dab8f53c16d02320b7c8394971c14c5633ac5023d572608c60a726d50b22dc3696e7c352fa6faa0c8e73127ece085562bb8a86ab6628149292a750588aa90d268f5fa618b559a4f8468218985db9f4cdc1f65b4644cf585a1a8057431985058476cfda6ca0dedb2fd77917fda88d799709c169c01e90c5528a9ffa144636334d8cb3a1cb27b81df55c9205aa1cb43f04ec29beb19539992846db361de4bea0a7b045749609571639933e6c105221782033885385c5036153ab3ee68156f0abcebcc67c9163fd09cf2a50910c8a5e50ebbaecc030ff38b041c3513da677f78b253d7c5d9bec993f85aab56a21502b1ee66922ce9995eb83376ed309b1f66c9e9b46436399364496a51851d48ca06e342fd40a6c64748d6db5a9bf18893d65a9fc3b227401c9410888287100482438e604cbac435abe040598f5cb7f07aecc23b6b38a95f9cc8ebbcb4f5cfb17a8443f89ea8eb592456da09fe9a36bb31a98e9e5372d4bc83f9a7509da4ad87036581b27844b79a9753bad9a476ef64661ca2a5e49797fe161159aca36f017d947b66d87833383c9eb593313054e00867a81e0aa6b1a8493a082305a387f8c50024a9f682c69ca0aa180eb8dcdbaac44f4a3fa830bb056352095c2b8b65eef62775a470638c252f40c8137d05cad7c9508c3c34a6b29e6c6431b34882a3526ced7143da2bb9733c2ef816e28d3a1372b418ca595ba593b18789b7c6a411e27acec3b4246e8659a2330c628436d21722536858548a280588cadab316411b5edebb50ddaae15c32ecd74af476b3d4d834c1047376001cecac303f5c1bf7afc7b63e8372c97a8fb68837064294527799a8874684a81f6145ad7ebac7a5cbccb696472ca98fd95b9ba4db7d8729965aeb56b8ee101d0b32b6b80a772fa80e70598b17e84fa +private_key: e747a3e56b5da1ec0b2859be85084ecfb60144b5ad600a4bd5f31ee866b72bd110f6111653124f695b75dbca4a5aea5c17c237d3e5748d842830fa2c87454960bb6652f5b0108332ef3024a2346e5c9ab71d4466330c2761f7cbfa29bfbb51931970b3a291179a1139a0e23e46b62dac796eaac32b4225c7bba9638fc428d3d4b691e5263c3c586d8abb56a313bdc69dfe323bfa237f27b046966c0748128ea32c9f0b34015e6c3bc8578dee1465f63c92e2e197e4e2ab2a76a9a41bb57b97903808472255b2f98bb24fdb4e8657ca5ed0cdd176931c934b33bc08f97646f6e7ab9ac565b7c04f26d12c44228e36824838c84b2efb0b5db6126b1b54614521c55455ada2002203b12954652c84b3ed26163b70c8cd5c76976075bf323d1f7984e2ccba31fa26fbe82a61895504abb81d660da8943bf6c29f16b72e59965813cc218a8635380044d40bcbcb728d9c37c375a975e619524e4c10d7a73fd8c400694ac396b384699bae098c07ba1483c834aeb3f1222d753758f3458fa2b579f3a156d0a27554a27b9192ea872ad9a83d137a1ef1f3445458761348ab6f40a0b8121f25f56fd9e7cb57318169768b46d71c7c41914de73838fc4adbeacf5f7778adc5cef5764f41b8b5b0e1aaaa594eae08b84f1b2fa8caa94eb46e2468b090832f9afcb4b543a61a5b572de2b79967c03d97cdfb5c0cdd5166dd121f8e1552780667377783c7e14f23ac2a4f2a3de89735c9e095dafbc72fa8351cf5203b7c9e96db2f5926320d8aba5a2750ec7668406319860101d86b92d4fb00f0fc75d8e3b344573d70449fa2fba847d399ee982540ba92a8149c24c411d4a13154ca92ab5a8a2be2942d45370a1a56e3ab715dcb7864b9956f2aceeec963d34cc3ea33cc9ae700b58c0953011adba08c115574a377a71bec017c79c12ca7a9362c6e40391dbf3ac987362569dc34d20a07b03306cf7577ce94078ef122207bc05e55a0d1d6368ef85874ba21a0090825c720467a891e1106a4c229446086bc71937904b534780e40b07d36175c81c8287dac48fd72c37946b98a9ca814401d1dcb5a243cad5240543234c00cc146b9ebbcc0dc57f5f963255366e4424cc595a1f7f2b9a066792fe0835e97390c97a43a52c39676af8be2393ca82d64039e6ae6a6ffd5b582915b23db1f307c1b18c90086263a9ea5a87d5470b1584c0ff272e6cc3e1c3b59b895b048db369bca70a3d22263483226262a7f15b96eb316dc62178a52af1810a7fd357679121c78083acb8ca1f0f6c3959c235ed901e32366354087162c3c86828c7b6b8688120ebaf50f55f111950ba79093a3c2029deda0a007b73241d30024d897bb66a0653386bdb344d10c90e43249d1fa0847f0ca918a414484656d4c0c246350be4722b43343a2e310ec985476fb754c93256a8321d9369fc531495b263a440c1db25b975d0a74d6b6cae1686a63b64a1fe0c51433ce5b886c34d9a44afc76133245b302a277403ebd46889e4b84585615d6482a4b0b5d528790e40538d4612646a690f0e7a451fcaff648583fb7025ea2038540acacd2b30429a550c980247188cea490e5252fdd0481d0b9837ce69e03d4798cdbcb25867b9e794ddc945d96489625aa16ad4150a925aacd254a6ae309869a018191c9e6f9411a6b375bcc9cf81925c57b99beb92921ab932aa87c3e68c500070f5568757b2b8e86035f717b88b3735ae662add2334184e6cbd2ab026b8a9d41f12eb322afc154a0b21330c951a4bf5c54959a515896adeeb73c42d94218d46219c01ce056bf78fb88902ba686b440c1026bfda6455610a1fa008d44c28bf22796204850f0e124108816e39b3c55c7ccee889effe88587b0a12a5c0b2a30152e98c612b61b95c0ca8fb3b203dc850ffc7f866275c7c851b67333f2c37a6b5b999b686fd6ec67ba67c9b0910e95f84a5e9a826e0617229206d94b98927c418cea516604444978c24dab19f0c63536076e9a0841873338767b3d935cb526c04c2ab5015fbaaee2a523ccf7154353b5282c7d9af78f55a73857ac5a70a03a584a8f1b0bb762f9c7265b40404888516016f6808bb3b3b7d0553e2877726ea63312f3afd494b5c1b60fc4b6bb6c8a68fcd1a6cfbb9265a10fa4c4bb76b8b47d0bb34f99b612a595aaa91dde62c02cbc473601b03f5547f1b4a8078aa079c4cf39c56f88925a9383b9a0f57b58741760c58d2629c5d70074df007e715a3f9344755ba908a4a310de73150a79a9ee3957a730687f4b2e7df025c1d699c254af6642bfab84809ea9a3b35410c7688b296a3da82c6cf6790b48fa3f66f5b651912e7939ab76b0935f49c1e0a25422365974698c9532ad00120bd2ab10a8d1a78ecb392e6892624a3f96b2758a423246d67933eabe6ba2bc019a031431338ab546b3154a80945a9b31bb5f9c4071a4b0ac4b1b85b3a11ae1371db39771259936a27ebec742e7d6282f19c4b6ec1a70085ec6cc23186c8a29f4c3a1d3ade8912e3e238f024cbd30e61b1ff2312c91a2eef9cdab68446bcb64ae505c32f0ca5d02547c3b2343962df8d384bac81d15fa3bd2a116b4d9aba31041428ab688f950809c94404b5c35f303d9852a0f029e609126110b64e310c81d634117e3b3e1994ee2a2799600aa38966e00aa9450f24657a39b4901764c3a267f2018363950256a69d5b0240f368bfb238fc3abae22dc2f3fa6c9e7f055a8712cec654adc039c49aa1d303158e05b0ee4f1ccc0e07cae74047b603671b9704e70646cdc0b1d1423bf3c4fca6612360269a26b9731524a2117a2b686131708470ab6c1ecec857465cfdcaa5b1506abdcb6a5e379bb4e358462f802c2a81b26d0091a9a281a891c06737fda60afd65ab7c7bc4d97667220ea69896a46f20200b0333546713d9e685d8230487bc39b68b170105231839417fa92aca1cc38246b3d0da638aa28c907c823a1fc779b7626a1146645db0582e23115c64ca6468bc21a480385b27fcc28c0e6b8430a270c5061012a619da7138ca97da7832807aa4f338a3983170b62145f36a35241d21c13c61a1044b5bbd2232f5c16f106ad476818f83920f650a87dd80c3213680cc1572b0625391a92dd423e53dcc0ef58ca376b18a46b8ba4506878f38c88d814bba280575235b23107bae8c1f443a5e9c1058c904a09366b50e7b531451f8416342267352fcc7fb21c05bad69bac0967778c0c2d48a60980ab5b7901b84b54f1a53b6bb09b37d48dea04838193657cc7b47b436d4dd36cf9bb4bcc552700f98a88a850dc009b00bc41c9f552e5b346416024065634f4d768cf49bba831758af42e408668aa712f93f43658c48b80a72bfecc0258ac6fb10c51ba665e8f25537116ae53336a8f3a0d2101b705642c5891b4500ac61d023398b35a21e37ec6c9821eb46c348c594590941fa0cb5d88ad32c3165cbc3569e15960dab8f53c16d02320b7c8394971c14c5633ac5023d572608c60a726d50b22dc3696e7c352fa6faa0c8e73127ece085562bb8a86ab6628149292a750588aa90d268f5fa618b559a4f8468218985db9f4cdc1f65b4644cf585a1a8057431985058476cfda6ca0dedb2fd77917fda88d799709c169c01e90c5528a9ffa144636334d8cb3a1cb27b81df55c9205aa1cb43f04ec29beb19539992846db361de4bea0a7b045749609571639933e6c105221782033885385c5036153ab3ee68156f0abcebcc67c9163fd09cf2a50910c8a5e50ebbaecc030ff38b041c3513da677f78b253d7c5d9bec993f85aab56a21502b1ee66922ce9995eb83376ed309b1f66c9e9b46436399364496a51851d48ca06e342fd40a6c64748d6db5a9bf18893d65a9fc3b227401c9410888287100482438e604cbac435abe040598f5cb7f07aecc23b6b38a95f9cc8ebbcb4f5cfb17a8443f89ea8eb592456da09fe9a36bb31a98e9e5372d4bc83f9a7509da4ad87036581b27844b79a9753bad9a476ef64661ca2a5e49797fe161159aca36f017d947b66d87833383c9eb593313054e00867a81e0aa6b1a8493a082305a387f8c50024a9f682c69ca0aa180eb8dcdbaac44f4a3fa830bb056352095c2b8b65eef62775a470638c252f40c8137d05cad7c9508c3c34a6b29e6c6431b34882a3526ced7143da2bb9733c2ef816e28d3a1372b418ca595ba593b18789b7c6a411e27acec3b4246e8659a2330c628436d21722536858548a280588cadab316411b5edebb50ddaae15c32ecd74af476b3d4d834c1047376001cecac303f5c1bf7afc7b63e8372c97a8fb68837064294527799a8874684a81f6145ad7ebac7a5cbccb696472ca98fd95b9ba4db7d8729965aeb56b8ee101d0b32b6b80a772fa80e70598b17e84fa2a35c723556eb2782c7cf77ee75f8928f8038ee66db41346741fbd6aa1daf2b43fc3d8392cb53f36ed647364a04e37278a0e0a45b720f4a75c580c9920eba98d + +# Official test vector 65, seed: "905074033d7b75deb2d06a2f29144eb377b452534c5710632989f02d45312d156557e96d4486020826db200153bc4a8b" +seed: b8bd0493a882e3a49b4e0f6256fb1fea0912562fd9ba26ec3d6c9cc12c8973abd7e4b5d8021c486b9c3114d7cbbeb7cd49eba8a61bc2bcae1f1bef30a1daf76d +public_key: d0c53790651f609447f0b18434e5b31f2b2a3d1233205c11e5841daccc2017203be9c26db2ea7de30a6671f79c1c424052a784e727c36a3b9dd1d71ba80a542dd42b17c85eebd81406dc394ec556acb00932fa9a8ae610646a973de42f9fe29c92b35c04884be2a5bd3f68b2083945f8ec525d651877d924482b024847938eaac5690cb33f0a878927bdb4a84ad627092f046a2968437bf9a675d91e25e89a3f246b38461f002c3d78206539968d9b7a83745869ea8accb72ab1dab78ff0183c2ffa338c819dcfc1178ad8b928c68abc98209819ad705a3fc264bde3047fd2065c3e1806a9318d75a39c6e4541dfb86433bbaabd12762f521c842a2381dc78fb312b1a6a318c5201bed68ae518be985746b863ccec279836d6810178c54902619301467bc986a735a9e93678b1f433bcb7af36da821dec7546a4957e413d30a4b1d75ba216da71af7a7b17a932c224bfda459681893ec103a4b56c10805a24543741ed0b1f5bf84daa018f94c07434758d32d80a3d8c6b54774da822451b12aa086782f9c0622c2b8ac9776639084a19a509124b5de6d77a83bb6e123b8eb1019a2b203f87896f23018568da081df72e460a1d8a2815794966aac55fa07cb7007ac3743a0f2ed5b6f377286a7c2aa4b9655237b3f1635dc25527357bc4714c3a47285c9ae3a5a84886c7302d22ba2d3c15580be7b1627c81fa1b0942e85a3a075845e47dc0674f4ec2c1ed9ca031ac1cd934a01c022d26b6ce5c038fbd541dcd4ab4a9bc17c06842d7645935b57587559c11b99af337bc629a45ec37a3a20b1fe905510971b6e0926126e815625c5d79f677ebfc69b1489809172f34e075c29a6e9fb4b536f892b16c7aa97623168823d5b1afb439cd2603c9758904b942971d769826b169936ac108c6caedb98982098d5176c71cbcb11b22b96143433f6c083bf83f6005c5c8b93562e081c940903ae662a8f17fd0882fcb399161d2a2bd2b8d1af0731b0303e3c9beec81c5473384b7a04c1c841f60e27eca0977eab4c750930a2bcb3983daa99cd4c2e2414ab8f77857432036c1a9a65c493afc62ef80758830417375c697a2a7fd0782ac011014733e51f088bf32b7135b5db727b147936740e320c603365e280cbab502b64412abdc4d25fb9a96ccc96f166445f6a6c3a894a6c10ac7bc074fe7b5a1d2964ef0531e7bc445e0a402f45b0f29809a84795848812a1b935d220670c2cd0e3332abc68f57b98f24cb9e68f8b1663b4c793ac4212177f11c594671550e44794f84705fa4835d918b317a1d5aa39e65026d3888aaf40cc247023b74cc4e00fb1c011c6a266560949c626e08263891608713c12e75a229c5bc114bada81395b00a5b6e695096b2790e85c954028c5b288758c9ad634a3ae11b069790bff9428b425ab70c5c46c2150346235814e7af8576af3071c6e6d4b56b61412d7a5cabe21cdbd0aa69e53d4d223d72e4c77afb927958245cd57967428d9f6c81cc604fadb43dd56c8148664942e2085395b17a1c53646287fa14a9bb208aedb1a7e6f73828f0aaa5918a69c211bd765cc0f93615a57609b5aa91c502b851c4a9b24335d282348ba33a802170524ee3351b6c780a3a9b46cf472fbab34be9f508c32a64bc37b6e6b30f37a7a9f200c34811c2b8553ec3ec091091bb08ab02ca7680867244fd3c991508902e84bb5e177f7251057c38784c0905cbe7041f12bdb77c07842228ab569fb69700f9b3a058dc5791b600dc48855fb1cb938b2e2599c1f3411628b64094ac20eb6c50f5f5cfdfcc10471346de9429dd29953e7b139e2a46f04127d7225fd46723dfe19522a4a76389bfe6414450b885cb211ae680b59ef46177d50b0b3306820a9d57293ae6753e65097f8de97c898c465b07b6e89459f446a59c04145f2c30dee57368e0479468ae96bb2e8b0332bb7535104498ffabb2abd65a6b8a2358d467eb8376a795aab40108ed9b0967a710083acb476c28a01b46e68a3d64b12dbb49146df48f31e1531cfc3295e4cda083af7b3a17617286f60b5ca9d21858508f8f009878916473c85360e8cf6ae8360c80aad7a10f6cb7a707063ea9b2ac097155e6961388f87327d084baea61d5ba26e1d5bd9cc25ffdd46a24d81c40532697b4cc8f58643d41afb6d29b7c857837a1e385a9106e3bd9911c697c8709312db4ee1d9b023e39fb4a92d9d95ff015 +private_key: c35b3d09514951dc232b3b261cc77a4b23b033a57012277498f66299f98b2e58a618cc8b68ba21d1f86cee4b7221611b8d003010c870a4f8510198a7f486279a168ac82aa70744cdf8662ce35b65ac836895255089ca97e4b61c1a52b7b6cc24b434b25be51814d09b4312a1150931d627685917b8535bc52aec1eae1338bcb6c087bc419d3a30f625812bd73fd3e3c798d61be67b30d0d34e34434878f53102437db096cdeff6c79992337e1122902c803e58c56d0878c5e891fe47441f95390fab44d716978a0c4af218863ba783a8c7b5b9f74ae671684fa284e1399e3ca469acf757f6dc3b6306a2b241005214554a7430dd97646fc26f4b45ceb8e13fe47bcd2a1b0ea558caed29be60baa1803808e4702eb6f46d92d1c36c5aa89fe27346c56d17b52ca4394ea563022551922923b6c5d36477002d92a88041399f33a902a0292563182a48145bb3791e0eb45708a4132fb768850c83c9517d25b1954939c857311cc94a168756aef272764cf63cca0b1a95ac4bde1c2c531769ce89419edbab9614c620583aef725eefda51bc16b5193241b986073764c4503b7b497a9d77587443a52ff47803bb40432852a1e4f6a7f1fb0a46304da84a85523bba99e06b304583bab0baacdc98db486439916bd3eb4fa6706c8f26682d728be9a82fb96c6f82a1c7414c5fe645b833ab30b515a446e54e5389a972d6222ae14209d9634af7bce363a0db3222378968eb589f9bc2a5032c37af18a9dc72211b5858575147aeca713c216dd4c7486861a16d9a56305c81255403be295de819b8efe70a19a1201e7740240aa2a081739946606f7786a6a745b6929e70f552b7a28f49990c82e114360b63cf739712dc647fe8a03b9a8ec5a2b4f8c3010ce71ca964a1a89c61729c3c18bcb8891bc2f880c93041a5ffb9600e184df6a07ba52838123ace34f01099d5507e7820abe2bb4f9b67012a4419934d13db839d36aa6de939feecae90cc35955164d9d9c8a078909d4cb22016854c2729633b2f2899302f356521f0427cdc7907b4529155c871779149f606ba29aa0d9586ee05baa1c78d12b9807ca995d38122c43b9671b16fd03436fa87143805c71c4656c29b8da8b3293b44be0a0bb873647f7aa92562e4706362110388c9f15962cb249953128a53e30998918ad5370ff32081f4053d13f741d036c36fa47e8a97b15c647272a52ad94620c4ba7aded0259323067f8b5612fcbe0aaba35d6999339cbff2502ea693b446f626fa05b5f3b90c7362a38d0a710a32a1e68614b1d63469182baba57bed2a462e879b7a172bde9ca930d85b393a797e339d4116c3bca1cfcb16205ad5c0e68488a112c34c66b4d617b856ac8c66aaa98ca458ec4219a747930f3394c4623a7d402b557069aa524eeca0a6f65a82a2c95aa816723aa2cdfa841106b0336a613420994580b94b3261a15799cde04ca3a758884be34955725827c15432e194f624921c674ed10877cb5078d1b29a52694fac72cc2aa435549cc34242906ed1cc12e523d6ea0ce55cb8a09c22cf580a76a8909d3c3cd749bbdae9c05f117114f4b5ad58533d410f8b2010fb8c25fc1acd38c69dba50803a3066214914cf9a8ab056a47892197dc50783072764a69d8b988798aaae3f1c1b2a268312bcaffe253940311033c64d20c1aeb501029f873a6aeb1d249945a997819651bbc86b96cb0537e7e80c0e382df932606bd58ca3d21c01332cc65c1c00b31c34588d1b10cc176b2ffbbbaf2fa95545e51f0d7445cc017c4d3178fd38c9d85123040a702003af65b74904028753825c7f7c6843b3bfc8020535fb6888227f6bf329d5203eaf8b8a3890716e563578e795ed566d43b071858b1336165544ec566acb361a8b8564796b8934c8ce253c409677c2d45691306301a58da9ba2d05f0c847684e960590f1a5c60217c5ab905cc8a95e9bd26301802ba9257370b73e63d647f02cca6d58907da1759cd5c20f7a8762e56c1e09b95c1b99f2bcab69931f03a707baa0580a896c022a53c3c846e4d0551f5a2d6f6b4d22ba779b017fb36546430292d950c10ee42862c749bd95104f133252b15771db7d3ff4a7cc310036903650041b40609d6a9c16e40ba12e6c390a388b95950b1de92acb71396e4a0fb7890bd7d123d710a5d0c53790651f609447f0b18434e5b31f2b2a3d1233205c11e5841daccc2017203be9c26db2ea7de30a6671f79c1c424052a784e727c36a3b9dd1d71ba80a542dd42b17c85eebd81406dc394ec556acb00932fa9a8ae610646a973de42f9fe29c92b35c04884be2a5bd3f68b2083945f8ec525d651877d924482b024847938eaac5690cb33f0a878927bdb4a84ad627092f046a2968437bf9a675d91e25e89a3f246b38461f002c3d78206539968d9b7a83745869ea8accb72ab1dab78ff0183c2ffa338c819dcfc1178ad8b928c68abc98209819ad705a3fc264bde3047fd2065c3e1806a9318d75a39c6e4541dfb86433bbaabd12762f521c842a2381dc78fb312b1a6a318c5201bed68ae518be985746b863ccec279836d6810178c54902619301467bc986a735a9e93678b1f433bcb7af36da821dec7546a4957e413d30a4b1d75ba216da71af7a7b17a932c224bfda459681893ec103a4b56c10805a24543741ed0b1f5bf84daa018f94c07434758d32d80a3d8c6b54774da822451b12aa086782f9c0622c2b8ac9776639084a19a509124b5de6d77a83bb6e123b8eb1019a2b203f87896f23018568da081df72e460a1d8a2815794966aac55fa07cb7007ac3743a0f2ed5b6f377286a7c2aa4b9655237b3f1635dc25527357bc4714c3a47285c9ae3a5a84886c7302d22ba2d3c15580be7b1627c81fa1b0942e85a3a075845e47dc0674f4ec2c1ed9ca031ac1cd934a01c022d26b6ce5c038fbd541dcd4ab4a9bc17c06842d7645935b57587559c11b99af337bc629a45ec37a3a20b1fe905510971b6e0926126e815625c5d79f677ebfc69b1489809172f34e075c29a6e9fb4b536f892b16c7aa97623168823d5b1afb439cd2603c9758904b942971d769826b169936ac108c6caedb98982098d5176c71cbcb11b22b96143433f6c083bf83f6005c5c8b93562e081c940903ae662a8f17fd0882fcb399161d2a2bd2b8d1af0731b0303e3c9beec81c5473384b7a04c1c841f60e27eca0977eab4c750930a2bcb3983daa99cd4c2e2414ab8f77857432036c1a9a65c493afc62ef80758830417375c697a2a7fd0782ac011014733e51f088bf32b7135b5db727b147936740e320c603365e280cbab502b64412abdc4d25fb9a96ccc96f166445f6a6c3a894a6c10ac7bc074fe7b5a1d2964ef0531e7bc445e0a402f45b0f29809a84795848812a1b935d220670c2cd0e3332abc68f57b98f24cb9e68f8b1663b4c793ac4212177f11c594671550e44794f84705fa4835d918b317a1d5aa39e65026d3888aaf40cc247023b74cc4e00fb1c011c6a266560949c626e08263891608713c12e75a229c5bc114bada81395b00a5b6e695096b2790e85c954028c5b288758c9ad634a3ae11b069790bff9428b425ab70c5c46c2150346235814e7af8576af3071c6e6d4b56b61412d7a5cabe21cdbd0aa69e53d4d223d72e4c77afb927958245cd57967428d9f6c81cc604fadb43dd56c8148664942e2085395b17a1c53646287fa14a9bb208aedb1a7e6f73828f0aaa5918a69c211bd765cc0f93615a57609b5aa91c502b851c4a9b24335d282348ba33a802170524ee3351b6c780a3a9b46cf472fbab34be9f508c32a64bc37b6e6b30f37a7a9f200c34811c2b8553ec3ec091091bb08ab02ca7680867244fd3c991508902e84bb5e177f7251057c38784c0905cbe7041f12bdb77c07842228ab569fb69700f9b3a058dc5791b600dc48855fb1cb938b2e2599c1f3411628b64094ac20eb6c50f5f5cfdfcc10471346de9429dd29953e7b139e2a46f04127d7225fd46723dfe19522a4a76389bfe6414450b885cb211ae680b59ef46177d50b0b3306820a9d57293ae6753e65097f8de97c898c465b07b6e89459f446a59c04145f2c30dee57368e0479468ae96bb2e8b0332bb7535104498ffabb2abd65a6b8a2358d467eb8376a795aab40108ed9b0967a710083acb476c28a01b46e68a3d64b12dbb49146df48f31e1531cfc3295e4cda083af7b3a17617286f60b5ca9d21858508f8f009878916473c85360e8cf6ae8360c80aad7a10f6cb7a707063ea9b2ac097155e6961388f87327d084baea61d5ba26e1d5bd9cc25ffdd46a24d81c40532697b4cc8f58643d41afb6d29b7c857837a1e385a9106e3bd9911c697c8709312db4ee1d9b023e39fb4a92d9d95ff01560d717ee34e223ead8139db400078cb308c3e1bceb046cd9d53f1a2abdf8f924d7e4b5d8021c486b9c3114d7cbbeb7cd49eba8a61bc2bcae1f1bef30a1daf76d + +# Official test vector 66, seed: "a3e2e511afa7bb560446bdadf67d2ee2e16ffc7baeae7efb8c5455068bbd4e91bf9be9d98b280072faba7712c75b26d4" +seed: c0407e41ddf48d333978b89bcf2db01e4613425b456249e76a6f25b8a2827bf5b2dca81e3f5f748d23c9d356a2209f6b2d60247b2e45c9808de497f64f124643 +public_key: 13665dbe0a4aa46bcc40862f1e3621f2596ba293466f7499d9954eb6a6251483b350072ce7a4910f008166e62476e383f0151fe706c23999b71dd2471af759b99239ec05996a94b7a3943e37f10dbffa1ba205b2ed836aef025221ca53ac612d41339770d80b03f0220fd1580b786353c9bf15909242494253684c8e2b5a28216501e1b4f1820d6312cac1bc02c122bc0ed71350a05457f4c40a29584e20b70a8739f1e733483b7e7f8ab62b664c9672229980536d747f3199a064ccbd66e7be173641808a93231aca8a7b54dbd0c593ba85df11c54bc2894c6a797bc0557df513734c74f3641a6d2c98fcd8c1ed356c2e199c28088ef495a54fc1019b736f2fb8895eea391c67c895041f97805bfd2354ba1c3dd8e98467d302366a616d280bdb4747fb5a000bc5781bd8c1cf2b563db206e6e512248319d2122f5ee77802d88466a61f5006239c5001975b00dd634377705274629f16a92f13b37049698b12c39bb1c3579d693970736fd72c8d8654943e5868c53a51324abdc57b330ed30145e92ab82c91d975244288833ff3a2d9d92aa1f53d99b11d191c99e06434196318e04087d9aabd03d7ae1cd2887cb2197ec4b09f7699861193d8eb77da9c9e33749e4a0c5bab3bb64adc4436b7a6d84b9463c4887e4642d490052093399b2cb52a73b5904920a601c327e2937ac439fcf3b78ee830b4ecb795376dd263a3cec91c6a6b60e48001a0f739e217b5b3c4ab0a676131514bb62c9fa1801bc80b6c8c7ac70110b4860cbf221543f2aa61e0683bee500f98ba4fa93c2865a28ba4820aecc3a6c7b56081869c701b1bf741152c0ca0a753a211c3562ca26a15395a630a4a92729ed9a3092d23bea5433447139ac0518f75d11af6113b8368cc72891a5de08dd7689b2592256a8ccfa524a2344921a0e887627bcf7965a1875c1ea5c255c36978da7c4f184a1cbaf24a2df142ef80c07750b87269419721c48d8014f4ec8b4ee23d95ab1ed9f8b5ee9943669007d48ac1657454afd466e8765c877a54466171b649188a7c205bc3073791b832b6a752625809919db9258ef1b7a15d2c54c6c02f57fa65751438f4186a8b576d7c561d649a7a60d1928e013df7d69f4dd7035485107a7062bf3ca84a93a5a0197ea00b7522dc769ed45596bc5e712954e1eb37ffd69d63ea2ce5e33df8088545e3a738b864bb61b916d29e45ebb39d8a7a6fb3cb3901b9880ab0547107c9073b19258e4e290156f54ae3d44d19d8abc5fb334ad757c7e24986a26a31d458edd45c69b9b8d87b0622166e66c76afc49a23e1c1abbf357b7328781aa9a054b24aa2645d691639f141981c30a7203623d550c31e2bd4bb95b2e7b518b44512dfa6a5387afd6c7ce162a434a6b9ed937cd79222134310a2420934b357e72e009ea8413a9148698240aef2732836b5659566d21111331fa9bb0b762c948247cba816e313109270eebe826ed722322f9841f33a935209e0df273f4e2237a59b27cf85fb3773998a295a37714ba074d1093b0f096b2eb5133bb273e50e17de75b45300c0c862354344336fd028a4a631da22b285d4435082667ffc21fa01b79625c019e71cd0ad86032fbaa79326630692b9d02be55315543d83c0b84297945406c339699b1093e4b188511aec19b3c9069bdb8799a2e077af4308c401982e96819c7f17f6bca98054688c30a75dacb90ad342acaa9ba227a7f6784100428cda9d6890396cc19cb90a81153bed281cbcb1036113250206b59208d8c75839b76ab8425211961967396c696f05d913598259334c742915dd183f32c5a4e957013868634459f038340aa7761ecb628fbbb435ba642e21c538b907d8710413ac10d7f0a7965b03cb8c36d39336543193d0d768bceb00af79069e7c85b09114e77e6063aca18f27376beb9ac4a0b976ce745fa7972e9fa74d0055ef490cf40e11e6cd785510bc4bc1231d88abbc9b22fc1e2577608580e26635070702fea437f8a13f6fb37343b488c1c0b2560027bda77fc6a97222319b66a86528061f21019aa73674519420bfa26ac5616efd714cd46b7b7751922175a1dcb22831609eb40b4d16107c8438f33e203cdbb85be910b78a99d766499d4541b91567fd8c7a85d983080b91c9254ce3c2a9feddb8c8ba948f0986a90d02681341fac1cd19451956432b83b79d115d32a3d4f86f902f2f6b0c95ad7f4bd49 +private_key: ad3cc5e966747302200dd35f1d80350983648610ce07452591948a1c6a9debda418fd0ad79da318004aee89acdd62c689f88a5a7621f7ef3b1f16c5bfd5c17438b98f029906c276ef1202d1f5504bec6243f608438047e6625c825b902ce22141142145368298d0c33ef857a45c872aa73308ed112726847def20029c2730768abd1c40a8dca501fa61ccc737d8fa497091ab5ea532bc730bb9633becde90398a391b4e60f5a5a31a360529b1486530b98742780c78c2761c09e655334be04b71d8b9b04a7b7daa7ac4d2a98e2ba49a54c2e91016be462418e632a4e023bc6e816240927c73703fdf0ae2912787626c55f4614c93731c9c679984738c96b5cf64c7f3919cd4d217f44e668e9fbaee0530949f63ac68137c841ab926587b161c56d218e3500885b82bce07668ca959093792507eca4827a003d26cd02324e352388fc76197ec546d590b00f646de107681ad32c708561546bccaf0489495821f8d43a436c1e4d9ccd9be2a5b46232dd37485328c3ade9bb08e53947eb16afbc6ac1b2b96b496f1afb250277bdbb0b6186b61b88b81240292880d9cb9a43352546a5e9f600045153ba033c3148a5aa78afa9b2b7c8b86e4dd70a0516a8a3e746e83ca8b919104015650da3a6f7ab9868e1c8e33b039b9279e4680b5c2a382789049f953fc28764a0422f00e9cac3ec794de5ade0b432d294a9c06941a814ab0f89bf88e719d081520b114c9c821f772a7a3b2a16edbc2f140724e7dc1649281233507187e4b87ea13803bb8e23541e176c1cdbf38ed1a225fc932716974829a6b83f30b3f587804eb8720e102278d5c7a2668f1481c42adc13788604d60c9ed1498bdda86a9640bc0b8137f3d7ba17e0bba28167ff1c5e3eb86b6eb5c018ac766e15193b8b4f65acaa3a2c191d646f97f19b200ba588780aafbb2f1c582ddf4105767cb93fa984c5b6cb73cb0301d9183513582af59e04d9c5869cc99ed83677d5a0f4405d166a97ceba0d6e0b8692cb6ebe130f77025a24264bf6851b2a52b41ef989b9f890cdccc3867c3ae19c7238750bfa11ae52dc573e87554a40088e682f15f9be503b05e2b53fc4411758854f5d691ac806ca00136a0702ca52803dca8c935d98c87fe476f960a169401147b240c026745c894d7d91197bc7b2d7802568f61eee554d3b852902934906521fa08b29b6c7c27c6867667168b796b5249bb442783970e7c443469c540aa9598834bbc4bf8ec97a18119b496a56c3fac7e2627b76ccc51fd60edf764f68ec032bdb7a1b5424be15329a54c537810205c15ca2ea34a6462cb3647dc7a38590b120a8d141d821a20349631e7c4804f11af9ab9ad4917a27ba99b9f2277f3a8afc059bab0072e93131a1936f87c8356e3859fd97a89e17affe170693309eb4e29a769ab2ab48659f635acb4ac986f08f1b186bb6a70a50a6cd4c202a10bc2f1d24ab4338b2d9765ca263ce01295537dc56bca315db1c652e850dfaa522cee677d2775f878037e5c17da2e6c7fb296927c64ce9256f88851d31ba9658f5bd7aa0636cc2bafb1c3494110e7fb8683bdcb3acbaa7274351b14a81bafb0a4e2208d3c204e84c00920c0c074109a81426416bb805465e429641bc9006b56c75ba1c75c5ac4113f95bce7843344749e969ba2702adf09032af83396606903772547365cdf835a5bcf69d3c14505b5472475c97acd88ec1ca4d52d0b1281086a5bb3bed1cb3986238385391a0e59523b5a16756af4e15b58a07426b574ec080893294a60d1148dc418c1312673f89951ec94e1db149365b33ff60cb2bc372763277eb97c5c8884ca7421f681b90b249275e631918aa57a7ba65b4d620cbb59131201c9a3c5e070ac76f7214e167853fe16c6058a9231a0f5cf69339c0463d290457fa47d0d949bd7362b5c0c2236826e4241353c2ae7833c31dbb03e7332dbf370a637a8885cab1b9d1a864b98bef6c81a27c93cc306a27b37bf794190a3cb6d55bc580d295ae6087d05775fc802198191ac5f400c25b39102a54820b5ed02146d5f19586a8c66126c87bd22b0e9c7857c3426b470768676be8f7b826b1c1dc486c9ee64d79c33372e33ad4880f357196ca95637c80668040022885549d1a9801109a96398f1b8c6247f203ddc4350cf730892b53037b4a13665dbe0a4aa46bcc40862f1e3621f2596ba293466f7499d9954eb6a6251483b350072ce7a4910f008166e62476e383f0151fe706c23999b71dd2471af759b99239ec05996a94b7a3943e37f10dbffa1ba205b2ed836aef025221ca53ac612d41339770d80b03f0220fd1580b786353c9bf15909242494253684c8e2b5a28216501e1b4f1820d6312cac1bc02c122bc0ed71350a05457f4c40a29584e20b70a8739f1e733483b7e7f8ab62b664c9672229980536d747f3199a064ccbd66e7be173641808a93231aca8a7b54dbd0c593ba85df11c54bc2894c6a797bc0557df513734c74f3641a6d2c98fcd8c1ed356c2e199c28088ef495a54fc1019b736f2fb8895eea391c67c895041f97805bfd2354ba1c3dd8e98467d302366a616d280bdb4747fb5a000bc5781bd8c1cf2b563db206e6e512248319d2122f5ee77802d88466a61f5006239c5001975b00dd634377705274629f16a92f13b37049698b12c39bb1c3579d693970736fd72c8d8654943e5868c53a51324abdc57b330ed30145e92ab82c91d975244288833ff3a2d9d92aa1f53d99b11d191c99e06434196318e04087d9aabd03d7ae1cd2887cb2197ec4b09f7699861193d8eb77da9c9e33749e4a0c5bab3bb64adc4436b7a6d84b9463c4887e4642d490052093399b2cb52a73b5904920a601c327e2937ac439fcf3b78ee830b4ecb795376dd263a3cec91c6a6b60e48001a0f739e217b5b3c4ab0a676131514bb62c9fa1801bc80b6c8c7ac70110b4860cbf221543f2aa61e0683bee500f98ba4fa93c2865a28ba4820aecc3a6c7b56081869c701b1bf741152c0ca0a753a211c3562ca26a15395a630a4a92729ed9a3092d23bea5433447139ac0518f75d11af6113b8368cc72891a5de08dd7689b2592256a8ccfa524a2344921a0e887627bcf7965a1875c1ea5c255c36978da7c4f184a1cbaf24a2df142ef80c07750b87269419721c48d8014f4ec8b4ee23d95ab1ed9f8b5ee9943669007d48ac1657454afd466e8765c877a54466171b649188a7c205bc3073791b832b6a752625809919db9258ef1b7a15d2c54c6c02f57fa65751438f4186a8b576d7c561d649a7a60d1928e013df7d69f4dd7035485107a7062bf3ca84a93a5a0197ea00b7522dc769ed45596bc5e712954e1eb37ffd69d63ea2ce5e33df8088545e3a738b864bb61b916d29e45ebb39d8a7a6fb3cb3901b9880ab0547107c9073b19258e4e290156f54ae3d44d19d8abc5fb334ad757c7e24986a26a31d458edd45c69b9b8d87b0622166e66c76afc49a23e1c1abbf357b7328781aa9a054b24aa2645d691639f141981c30a7203623d550c31e2bd4bb95b2e7b518b44512dfa6a5387afd6c7ce162a434a6b9ed937cd79222134310a2420934b357e72e009ea8413a9148698240aef2732836b5659566d21111331fa9bb0b762c948247cba816e313109270eebe826ed722322f9841f33a935209e0df273f4e2237a59b27cf85fb3773998a295a37714ba074d1093b0f096b2eb5133bb273e50e17de75b45300c0c862354344336fd028a4a631da22b285d4435082667ffc21fa01b79625c019e71cd0ad86032fbaa79326630692b9d02be55315543d83c0b84297945406c339699b1093e4b188511aec19b3c9069bdb8799a2e077af4308c401982e96819c7f17f6bca98054688c30a75dacb90ad342acaa9ba227a7f6784100428cda9d6890396cc19cb90a81153bed281cbcb1036113250206b59208d8c75839b76ab8425211961967396c696f05d913598259334c742915dd183f32c5a4e957013868634459f038340aa7761ecb628fbbb435ba642e21c538b907d8710413ac10d7f0a7965b03cb8c36d39336543193d0d768bceb00af79069e7c85b09114e77e6063aca18f27376beb9ac4a0b976ce745fa7972e9fa74d0055ef490cf40e11e6cd785510bc4bc1231d88abbc9b22fc1e2577608580e26635070702fea437f8a13f6fb37343b488c1c0b2560027bda77fc6a97222319b66a86528061f21019aa73674519420bfa26ac5616efd714cd46b7b7751922175a1dcb22831609eb40b4d16107c8438f33e203cdbb85be910b78a99d766499d4541b91567fd8c7a85d983080b91c9254ce3c2a9feddb8c8ba948f0986a90d02681341fac1cd19451956432b83b79d115d32a3d4f86f902f2f6b0c95ad7f4bd49566debcfc9a4f48f6f60ad57731445a7861bb9c371e4ee4407b35df5a730f36db2dca81e3f5f748d23c9d356a2209f6b2d60247b2e45c9808de497f64f124643 + +# Official test vector 67, seed: "074ab1a37ba5a0403d8f68d26fb787bc2c90f5ef88f2a6d286c3e6b168abd85d393d8225618608b8eeb301d26af53bc0" +seed: 334382d39164d1989696a2ff77b25a28af8bead9883b5365eb6fcca7c1781cc9aba5068af837be962f439f233593d193ce5e08f7d66efb3389885927b89d2523 +public_key: 869a9e3773a7c7942e279471a233a05d77899c2a18f35ac98a3243fa6767f076976529b75b75b070a341dfc95bb85c4bfa1394081141fe1b1b31365e3c2302c8a0296b9769de04024da48c2d7a3e5b29ae58659384fbcb4ba2ace58c4ceca5baa5131bdd465797664276aa44e8331e2f1328aa6910f68a6a73210e575ccbbdc689199559f094bb62380f436a925a7305fdeba6c53a9193069873e724cb1b67fb8820e75c27d175bd5f5b5db020c91eda2439383b579c14da0173e1704a318a03de6691ecbc600097b41a7a9a429ca1a4d8a34dfc6c85e034e8a17629181fe7c993ab018d135a73861405186763b0f70c80d09706c9af971313e47bb917761a0e3a39f7b96702c288254675f6a07771768f3939b7bec979cbbb8bca011124f08347b7bc7c70833197b192fb26589098e48834e8fc8551a1c1fc52a1701323d98c4bbe7779b867b813a5a2a5040d8e8845d4a2b03efbcdbbb3083831b1ffaaa9e21c7a3ad77053793b1f7b7475b021e2c1ae25f194856b1594228e938a29b832930d5bad3667c854366f83b48cd3501768f086b68007ead71b2f046f630196b8237967c940d4727d388800dfebb3b152cf57b33068803c1d55c59fba14e31c323e820265c8826ec3b6018c8f60445a11268da9b44f8dcc512b860212f408d3baac60cc6ca42211d2ca3a41271f745bc46fa70a9a8a3999ca83e8635e7a4843ea3b861194bf00909e4250ad1ddb3006f86daad2b8fa720d969a7d87dc97ae214ab3769eac0261076092250133726265eb7987bd4bc01ec004e71bb8f7b06ab339ac9c0849fcb23c4bf35b11955c52d30fa0eb56dc7cbfac95704e51969ea45ab01c10e59c691dc3908c083263c3565766a34b216f55f8284f219dbc158cff247e2296c86ba69c922161ed753fdc1471834270095a85a5fabb1db91fe203113139526961bb40b41e8f913a36461ece86b37fb809779005c4312727f68923187203d001a378c0073a240190a144962bfaa89b1c384083178a1b44461926a9ed135abae505c93177f263996de9780fc573619b63f741091ed57657404644194a25b6cd1e5aab45e9021d9a8839546a9913752621bd79730685397d93ec49d86910c46a28142928a054599ba18cc3964cc4db8bb7a87543e8a53fa23a95bb5b6713478f4b0b5ca6248018a729469a3794a8ed04a315f3783e667c0cd2ac80c68a40c35d64c90e5e8a3135ca15cfea69d4a1a2e9b562dac51409c6485e026001eb1196a487606404b6519974b386abfc9cf4a0305aab4a627b6c22a994dfe46035447f0cc09d1bac0397a68fd647b0b13630d1439e63fc8fca2b01cbe66bfdb4315230b06a9797b34a57a5db208061195813073c7a10ac95b8755aa79b2033bf90386115066f177ea1421ab0267672b91830a26c20b4a8ab9011668cc46b49a2d824067102c95dc842b4f423feabbd774b4a4be351bcd8cf2c486ca70a5eb502ab5ffb8d77c2bf00fb7887fb960c089210d673679a0c71428b5ae348ff293602833b6927add5b18f22acc4ce01517c65c848680d59931175954ace9689fb6881ce17073e113cbcd53547bacb3946067a1a46cf6b4969065c98c17304d53ab5804501711c153a1b13d7cb442221ee311466469ba1225cbb312708c7b5e0055e3b476264b2244fe9590a557f088c9d4fb47a3d598a998a1b5f821d19909220a229ff020bc11143cdfaaa90e00b71d6c8b7622f24584508ab4d036792135b750eb9ae091b4baa96a27dfb1aeaf605122060e5268bc4e9c08d1bbcd451a22e44a2d6201c6de52baf940f14956aac311b5c3782e64377c645b35d210e1ae043ad6142bf6c05aab07d3915500b67989709b7477432b947239a9c7abbe747b2238ade292448836b87938e804a4029f24182941cae500d85aa7ab9556ca98c7808d90558e771d8709446bb1069541dec34b69834c857215822f773871c4401da04c70503cee82491b07e8597480b6bae6245084a4b92f9b015a158295f237a6376118868486d9c1a8389baed937b392ab840d4bf67e31df2c073a4a8c691896b6d6b623b95670cf404dd499773a54210975d1ea72667439e0fd8c112f33470789f2899a64217400e4b51fc501362ec98a45620ff6ba180a211ce5c154bb62a1904cc13a64fb6f445b48ef88ccad56919a0deed94a2ab2d4b6442a71c288753f1dc41ef5389e39497 +private_key: a11ccbcf239bdf7642937b7d37c0b33dc0667f06b13d7a166870cb3c696c93e038b314276a135cbbc672f830585a46c31cd09c621bbad1f4c611f3349104857a4b1117f47142d36fa8f73834260fdc337d7427aa0fd90b5646587330cbfa5a56f3f42d211226c6a627085b86cdd73c05838f46692be0d15a7d59b9c2e803940708946293adc5c338a29913c489ee1396de0162588b6449452259a243d422a92dacaf5ed9a88921a37500cb0b1031467c494b3c207acb6d4fb444cafbc9dd364933a3488ee654b7fa866dac82a53acc8c15464a29cacefa9432256934c7790e1b99c85c599e3c5c0ed11310dc2ea6d813b505a6feb4626048bb6ff0ca8a1c418bb4512008a94d863a6f7b359df211f061584f34043aa628ab80c46007257283a6b5052e8967a56e86230d9b58acc6125406064f03b6b25a5f9a706aef5812790566308ca35b19b3c6a7a2450a56b164bdd19278de85a5769186e7c67ea9dcb7e2a8223774ca66290368f67ef6494d2bf5411f7114e7e930b7a99beb84bc69494e7461127fda4d6edc4959c375b6d8b48121312000a6ddf510504a8454600f87523d71071e13a0b676fa681428c31d7cc0d2492bc7c94c7b423092113dbb1b123a3936c0d1846057b2970a37d1caa6e53988bc0565842b143cf2207af23167080257a339795141318562a0141d1f7b59f68169fd0a2d7c959af209971860123e5b30464a740f5214aceb6b322b4cdcbcbc28285aa2746090a8595d4371508735eb5423b94a54f6bb8aa2019b76bb76b25c1dde42b56d13819123be6ed3bc3d26b1dd515121a268d3d3381ad4432713868d7059a06609864671fd9a6a1777803e4b46d9ba6d45050fb2c80f88f450a3b655843872f727a68aaa66c758a8317a3e2aaa55bde0a97dda29a244615ea33469cc5ff82a6c2e0982935c9737943b45c77c3355900ed32785f59fcad14b936c1708baa6b5686b952b07683c1252c99d8a49272b053faf69ac090a8c0e2a0f639544ca196c00975f77667bd54289445cb62367bd79a290683319daf1be3cc89a5d105069e221b875075e7162b12b3203630ebdaca13bd6768cd9ab4872a7ff54ac4baa49c3680e372b9c7e25124f6a9c62c498adfbbe9a90a79fca19fa358367a2b5a24b821866402e43b93dbc3cce1467245a42cae42eb6217cb7470158a24fa225467cf0962b399741c4743ea2222f265a45e7a94ad800734a050635aeba147023349854305c59276565e32dfadb17b3183722b1c44af4c289430f6ab53b416ca239b409fd1584a7891cdb77b742a32e55875d9a20a92f877dde6662a0c0513fbb0875973924c16dd283ad5cbb18dfcc37fbf28914713a04dc05146a7d5399adbe57b60d6003a81a3f9f5559450483d4116dbae0470e15ba3f6323adab47af30252da7bc45e38759ba99877a6421f04232b35cd3b372c0c30ed32c64b0d74fa70c7e6085048c76c2e7e9b1bdc8b033021f7600be3135b785491cfe48932e30a89f34729c012588374fb1307c808228dbf704f9a8c0eb8a98765a8e4c1b0591c212d5aac9f9593a1418afb84bbb931349b1b1bdd8d10bcdb66e7e97299a4b1c23770f8ffc8a08a0391f826b5058240d345fffb4ac4c03483b74626d049f7fa52693b18b5381cec4b13dd1478c5912a33f009f0d533bfe57105755392ee76df7dbab0db56fbd2733487b511804bd63ec767464c10fd22817d79aa7909471b14c1e0445722a240918c2cd829d3c6c4ba81c0b6493b9d0dc3910ba048d515f2e3116142c553fd230d110cd71b449f6216fff68839d83096638348a42a5ecf0986c62bf9305068ceb799ca1b7b8826a8fdaa131d6b872e1afde468aff285aa818c8caf80b9ebb2730f770fd143d81c86819b223d4059ec5a39f18ab5386142464195263f02f9b577105658ddc80a1c7ec2d82bc8c657b00c3d986f8261b039738449c0db616207676b9ffb36a986c3350b698289367ca28cb404ca0c1e436f0e91898941d72e7c1bef2a9aef3305fc4c73d7acf83f5248766a95f9a5b97185ed14c7508d7c8f7ca571a534bf4b843145799233818e0a65e0a7065ae5678411a25d95610dcf91847513bfe14abbd94300f322619fbcb0b03857ef1340de5510156579a52ada7601eeda662b61b16677c2c81f998869a9e3773a7c7942e279471a233a05d77899c2a18f35ac98a3243fa6767f076976529b75b75b070a341dfc95bb85c4bfa1394081141fe1b1b31365e3c2302c8a0296b9769de04024da48c2d7a3e5b29ae58659384fbcb4ba2ace58c4ceca5baa5131bdd465797664276aa44e8331e2f1328aa6910f68a6a73210e575ccbbdc689199559f094bb62380f436a925a7305fdeba6c53a9193069873e724cb1b67fb8820e75c27d175bd5f5b5db020c91eda2439383b579c14da0173e1704a318a03de6691ecbc600097b41a7a9a429ca1a4d8a34dfc6c85e034e8a17629181fe7c993ab018d135a73861405186763b0f70c80d09706c9af971313e47bb917761a0e3a39f7b96702c288254675f6a07771768f3939b7bec979cbbb8bca011124f08347b7bc7c70833197b192fb26589098e48834e8fc8551a1c1fc52a1701323d98c4bbe7779b867b813a5a2a5040d8e8845d4a2b03efbcdbbb3083831b1ffaaa9e21c7a3ad77053793b1f7b7475b021e2c1ae25f194856b1594228e938a29b832930d5bad3667c854366f83b48cd3501768f086b68007ead71b2f046f630196b8237967c940d4727d388800dfebb3b152cf57b33068803c1d55c59fba14e31c323e820265c8826ec3b6018c8f60445a11268da9b44f8dcc512b860212f408d3baac60cc6ca42211d2ca3a41271f745bc46fa70a9a8a3999ca83e8635e7a4843ea3b861194bf00909e4250ad1ddb3006f86daad2b8fa720d969a7d87dc97ae214ab3769eac0261076092250133726265eb7987bd4bc01ec004e71bb8f7b06ab339ac9c0849fcb23c4bf35b11955c52d30fa0eb56dc7cbfac95704e51969ea45ab01c10e59c691dc3908c083263c3565766a34b216f55f8284f219dbc158cff247e2296c86ba69c922161ed753fdc1471834270095a85a5fabb1db91fe203113139526961bb40b41e8f913a36461ece86b37fb809779005c4312727f68923187203d001a378c0073a240190a144962bfaa89b1c384083178a1b44461926a9ed135abae505c93177f263996de9780fc573619b63f741091ed57657404644194a25b6cd1e5aab45e9021d9a8839546a9913752621bd79730685397d93ec49d86910c46a28142928a054599ba18cc3964cc4db8bb7a87543e8a53fa23a95bb5b6713478f4b0b5ca6248018a729469a3794a8ed04a315f3783e667c0cd2ac80c68a40c35d64c90e5e8a3135ca15cfea69d4a1a2e9b562dac51409c6485e026001eb1196a487606404b6519974b386abfc9cf4a0305aab4a627b6c22a994dfe46035447f0cc09d1bac0397a68fd647b0b13630d1439e63fc8fca2b01cbe66bfdb4315230b06a9797b34a57a5db208061195813073c7a10ac95b8755aa79b2033bf90386115066f177ea1421ab0267672b91830a26c20b4a8ab9011668cc46b49a2d824067102c95dc842b4f423feabbd774b4a4be351bcd8cf2c486ca70a5eb502ab5ffb8d77c2bf00fb7887fb960c089210d673679a0c71428b5ae348ff293602833b6927add5b18f22acc4ce01517c65c848680d59931175954ace9689fb6881ce17073e113cbcd53547bacb3946067a1a46cf6b4969065c98c17304d53ab5804501711c153a1b13d7cb442221ee311466469ba1225cbb312708c7b5e0055e3b476264b2244fe9590a557f088c9d4fb47a3d598a998a1b5f821d19909220a229ff020bc11143cdfaaa90e00b71d6c8b7622f24584508ab4d036792135b750eb9ae091b4baa96a27dfb1aeaf605122060e5268bc4e9c08d1bbcd451a22e44a2d6201c6de52baf940f14956aac311b5c3782e64377c645b35d210e1ae043ad6142bf6c05aab07d3915500b67989709b7477432b947239a9c7abbe747b2238ade292448836b87938e804a4029f24182941cae500d85aa7ab9556ca98c7808d90558e771d8709446bb1069541dec34b69834c857215822f773871c4401da04c70503cee82491b07e8597480b6bae6245084a4b92f9b015a158295f237a6376118868486d9c1a8389baed937b392ab840d4bf67e31df2c073a4a8c691896b6d6b623b95670cf404dd499773a54210975d1ea72667439e0fd8c112f33470789f2899a64217400e4b51fc501362ec98a45620ff6ba180a211ce5c154bb62a1904cc13a64fb6f445b48ef88ccad56919a0deed94a2ab2d4b6442a71c288753f1dc41ef5389e394976ac9cb9123b99fcd75201ada0fd5daf1a51f1d069822d795f8e736abb8d1fcd6aba5068af837be962f439f233593d193ce5e08f7d66efb3389885927b89d2523 + +# Official test vector 68, seed: "cc0c86cc0abf86fa21899be1953913c00e7c46e6b5f730c4e88b3c034012763981d7f14459d3081638080378348856ea" +seed: 6995143e8eb8a6e93840f76eec844f67d2b5f75b1839a5040337e61f9806764a0f4dff8e56f68440836a072412a30d851ace2c7c6f02d60e7a8420001a63e6c6 +public_key: 12b3141c2441f96a053ec568c7d2b7e1229fdb620d905119a05690cbc9564bc9cad3a66e05f641302a38ada62e07380ba315acb5a3af9f02aba7811726a3ac94723d6e66428ec8576718c4da712846d450cb428571b1786267487b353b37d984cadc2f51aa6fa58c48b011360c5b1989e104b99671ce2985a174aebf31cb5f803d29d93133d2ac1c9851031b21e8da4021b44b4064ad7415786022bdb27a187495908ddb6109489ca2a67dea269493986565e33941c1012e5504f4e5abe662235bca3a144c149d970ef3815079e2bbfc26066a7c8dc5591871e83731139951a262f9f7a2630c0e0fe635cff95b792a6b9d490f0ed14b125b652de35cff994ef341a15bf57978211ca4149fc389c60f915edc45610b9c5883080e96d77267268a37b4338ccca90490cac44a61f2795f943a25147a8943dc545c0805e5d39b70139bef006df10c695cab9cdde3b7c3a2afe823c709936d7c3818584abce96950c06b248b858859bc2231622426078e480074bfb011baa6b11336206425211c71b48d134b7b0b1c960c9429829ac5191f8f8aac1ed70bcfa4342a362c68a35591db506f2b69bff31033f5ca4654421f48afdd736e25d810add97f750530c443618e674a6691229c3a17f3b19e9d3740ae4a6aa6b77254b27374b246381483e52624a473035fda0eac427cf0f7244b3b8fcf4c835df23cc5b729bcb1285ac49529c1241977741ab15c2984343f5139e1219d65992ff75637fa3a486232c1069cb49269305057080b535d4a624bdbb78ac18407fa8b48caec62459b80cdac45013403adf41038fc0b97fbb3b9450e9953718cd82b4e951b3628c7c1fa39f5629dbd074548d156437253ffd92f7de9b292b00d1812cad1ea7c26a295e373bf80fa6f173b68e7149ec6a454db833d00fc462472ac51a208341a39fa8ba8f7c8243987cafc65a48eb30e729a033cd8929a746ab6eaaba19388e9246ff28355bcec0249fab0e00b722b91bdee0b8fd80377509937f201880239ce9c9251a9d3b48d455884e98acd948f0aea095155b360620f29a279116ba08a5b5ccd6c86e0e57f4b33c5787c38b7f0b924d71d7c06c58f932d7c68422085c8e365c6787b8069d21f0fa5a414d44267b40a5f629b6cf82de5588b7e828868c5b6ab9438af030983c7c37c1032be605936002558e161ba0bb2b1b4c6b1fb5fec029ec389a375d563dde64eaf7b95e4a05e2cb7b1a4809e4e98893fbb2d79aacf0e7a0718a322ed8296323681ea398981512d04f56ad2bc10667187b2ecae2e9aa5e2922fdff22eb9651c37c75f6ca87aed6213e0048e36984e2b9b6936d61318da6b7db7c8b1538754b997dd325052c21d22328f03d5774e711a51ac6d3c333f0a529c1568840bc92ad42603b4a361197b36681722d45b497cd94f73d90fd48570b445c4b166a02c5a3c5928bff91545053166f0fca5f7b2229232a301484ddb25854d522f546c477f43072814668a734786b6810770b227487a21abaf17e79dfc365c3843363ec53af3686cce7429104740a327ce441bb8e3736af22448016b8e69784d3a2c92e0f1787e818139e19e95e2a9db2b62164221d9b77ab2ca91dc221ba5533322aa772459c6c5763f24a07c5b715197a20c7357cdbcc18840aa7af18c4684e275cb3220010386095259c4fa71f94662133622a2945d8cc6572b2311a7fc0e1091ce19d8c5d7913acc490e6c1751d5aa3e5c7218ebcaba43a8c0f6d78897c15a20a87a891bc2ca94779525499a2958a60b4878db537d9b148c01b7c2a642fedc0624e594cc318a0fcb52960526af556198fa028604a9f0181be16399edb84b38405e33b43c13d83e54483418467a57f8a796b4032d37a744fa6200b0aae04899c6865a66923eb173906b26c33231a90044c9c4d5215117ca1d50cbae1120471c0462eb1247f07a2197680856428ba494dc721bdb3760c1a97d2e59735bea6064650f55212117659380052550fa311599923dec097cb28d601cc4a117269822a2bb589ad165a8587893bec2b0e22030dd8736d387673a67151b249c49e7abf96960f5394fb255be8cd9927152211613c5242a45e87028745626de709542338e131678b871955582014f1074e2f8be14a634ae5c40dad64b78352febcb21bd987d7632c16e03261c4771bed2bac280f77da45501c2ef4d97f2faf650309211985bbee4c3a85865 +private_key: 160b1e369b620e7891965a391bb99d9933bddd1b407a647daba289f0f16509f41eb62576b3ccb404744d2b699891300b119cb1bcbb97c090ab4091c1d15454cdfb2e0e181eb677797041b47069680a929f85da252b34b571467b564ba72256867aba61d8b14561b7a6c6cc0bd73227a3f5c840d264ca45cbb4d6c529329f011b2235b83fb8158a3966643c5664e4a4028b784aa3f84c2d21a6abcc5f0bbb5160326963929fb3296b3c65502a34c409ca9ce0fac53661a77a6ab85339364f0a999d21147958b01276c31454c14410989186496a5aa529223cc1d460a729a5d5170fbcd3c742b267d5c6aad2047154630cb8492556372e927c0ff48015b4121966c742730c223ba3ac0d9553e8f3043c84a19cc40657167a75603a2e467698d117e0e96beb199ebef57ad25b91be9bbbc31499999068d4f56315c05cf69727f6c1b09038ce4e3ba307fcce081669c7f666934a9feef44653466915360c9160a573781b0be59f23d817922bb9453802518b52250b5bfb1631f16327ea30552cd26725d94717e098e9b40559d12db67680f52aa19ce11ef22641d214b1d14689252027e68bae8f3a0034189c2452a89a8011b0f228c2f4c6c575ae8ab49d9b951b7f534c5c0c02b94c2eb1c120fbc6cab391ac02d71b3a61aedc65211314129ce950f4e82530f297f1d6b8b9fb6f0c423ddfa842f5f6667109caf5ac5db25a26ff46a771bb1731b855e909604dc4426d1598ba26b94fab7188ca788c1b473bb00f74232d7772c196e3be42c20ad9991b1460661c85a90285952a5565b9290d50fc2821a84eb80680c4d204981851882565e20455e7f70015289032d1792ee5475c499c8ba701bc094cde789b7647536ceb7471db9e4fa51b1b0a97d2d94f73024e83077dab62acfa03289197cd5d802901e34230d47cd5b469d202ad64e98f612cc286a267d17596bca1634094ca33e09b9fabb5ca170920804a3f58233ed2ca62362cdba424114275c1ea0df1183c33303efa559bca706fc77b164670058708b5a97c6f18acbabc011d8fb230ed56265c5c013bda6defd92e76c0ab04fb8b1e0758073325c8c60465678537bb5ff47923b39a800cf39eb5686b653c9423594fd7290745d566abe2735dfb4e9f7454eecc53b6fb11bd407d37e49a3155cc3561cfbe8250dc207d3f942fcaf3cfe5223103d2475d0aca6809ccce5b8d70c7aebd053f4c94bd2b66c9e1eb68b7b6989f6babff582f85d08b3926c0fef7ad5ee61cff982b690689996412504284e65bbe77123180f78efbc01c41a8262ee26765d39e94400a1a27ce4b147ef5e25d314c69aa86353f9a3933b73ea131bd7ef12979b863ba331f1412386f87336a90718da6c9265249cde518c39ba4e6ab83ab53c2d2c846f43041c4855d93099939d0bbf88722d873bdcf5bbd73519d8ef50255c7a18cfb04187147ec706fce576ce8f13928530b43262cae618f09d434fbf29fb5380add29c3a7992613733fa730a17e059c67297598f44fe28b4c4fb04ff17bcc7f3c8e516b557bda28fbf82971e8134e3082bd7497995bb2e09cb398254a12e0bdfab5a1f3234853c3067903a64ac22e528963eecbcedc58149deaae0965185b1c2588b40668103719152016e833a95184da4b10958c78b2d4ae2ca07466700f62fc687fca4779b500aa904a0d95c93464717b3c21e58b9e4c133d793ca5660348ab0198a81937a8e000225b8728477922813b9f79325f788bd8020f052801fc079f3d604b3ec830d29407aa9c2168a122434b751085804207b29062b343fb90426319998a98401232f3d0ca1b475d15650e7e9a42f498a7995c4bdcb893d09531832a4fd12c8874e4c3c65005d6c27a102725a8113d2ec9663a40255fd4cab9328b2220737f13aacb4646b392811eb3ca72307f89919525107be84a5ccedc1bb9d313f7b99d619cbafeecab88a01ba78c688166a6710b12a4724b2c661351574d7b1ba6b9265948d5a572b2c74982bb6f8546b8684cfb6916c9c1093ba1c205f92afe80ceedb043a04b67468335d28a8eb2406c72690700e724d773b40f4875c30b056e904ab688888195655d020ddaac5d1b20032a9b65501b51ba036ba2d48e5fd75b5c2a4d8b65766bb7a341247ee8121961e40cd192c6c126a3fe92488d467212b3141c2441f96a053ec568c7d2b7e1229fdb620d905119a05690cbc9564bc9cad3a66e05f641302a38ada62e07380ba315acb5a3af9f02aba7811726a3ac94723d6e66428ec8576718c4da712846d450cb428571b1786267487b353b37d984cadc2f51aa6fa58c48b011360c5b1989e104b99671ce2985a174aebf31cb5f803d29d93133d2ac1c9851031b21e8da4021b44b4064ad7415786022bdb27a187495908ddb6109489ca2a67dea269493986565e33941c1012e5504f4e5abe662235bca3a144c149d970ef3815079e2bbfc26066a7c8dc5591871e83731139951a262f9f7a2630c0e0fe635cff95b792a6b9d490f0ed14b125b652de35cff994ef341a15bf57978211ca4149fc389c60f915edc45610b9c5883080e96d77267268a37b4338ccca90490cac44a61f2795f943a25147a8943dc545c0805e5d39b70139bef006df10c695cab9cdde3b7c3a2afe823c709936d7c3818584abce96950c06b248b858859bc2231622426078e480074bfb011baa6b11336206425211c71b48d134b7b0b1c960c9429829ac5191f8f8aac1ed70bcfa4342a362c68a35591db506f2b69bff31033f5ca4654421f48afdd736e25d810add97f750530c443618e674a6691229c3a17f3b19e9d3740ae4a6aa6b77254b27374b246381483e52624a473035fda0eac427cf0f7244b3b8fcf4c835df23cc5b729bcb1285ac49529c1241977741ab15c2984343f5139e1219d65992ff75637fa3a486232c1069cb49269305057080b535d4a624bdbb78ac18407fa8b48caec62459b80cdac45013403adf41038fc0b97fbb3b9450e9953718cd82b4e951b3628c7c1fa39f5629dbd074548d156437253ffd92f7de9b292b00d1812cad1ea7c26a295e373bf80fa6f173b68e7149ec6a454db833d00fc462472ac51a208341a39fa8ba8f7c8243987cafc65a48eb30e729a033cd8929a746ab6eaaba19388e9246ff28355bcec0249fab0e00b722b91bdee0b8fd80377509937f201880239ce9c9251a9d3b48d455884e98acd948f0aea095155b360620f29a279116ba08a5b5ccd6c86e0e57f4b33c5787c38b7f0b924d71d7c06c58f932d7c68422085c8e365c6787b8069d21f0fa5a414d44267b40a5f629b6cf82de5588b7e828868c5b6ab9438af030983c7c37c1032be605936002558e161ba0bb2b1b4c6b1fb5fec029ec389a375d563dde64eaf7b95e4a05e2cb7b1a4809e4e98893fbb2d79aacf0e7a0718a322ed8296323681ea398981512d04f56ad2bc10667187b2ecae2e9aa5e2922fdff22eb9651c37c75f6ca87aed6213e0048e36984e2b9b6936d61318da6b7db7c8b1538754b997dd325052c21d22328f03d5774e711a51ac6d3c333f0a529c1568840bc92ad42603b4a361197b36681722d45b497cd94f73d90fd48570b445c4b166a02c5a3c5928bff91545053166f0fca5f7b2229232a301484ddb25854d522f546c477f43072814668a734786b6810770b227487a21abaf17e79dfc365c3843363ec53af3686cce7429104740a327ce441bb8e3736af22448016b8e69784d3a2c92e0f1787e818139e19e95e2a9db2b62164221d9b77ab2ca91dc221ba5533322aa772459c6c5763f24a07c5b715197a20c7357cdbcc18840aa7af18c4684e275cb3220010386095259c4fa71f94662133622a2945d8cc6572b2311a7fc0e1091ce19d8c5d7913acc490e6c1751d5aa3e5c7218ebcaba43a8c0f6d78897c15a20a87a891bc2ca94779525499a2958a60b4878db537d9b148c01b7c2a642fedc0624e594cc318a0fcb52960526af556198fa028604a9f0181be16399edb84b38405e33b43c13d83e54483418467a57f8a796b4032d37a744fa6200b0aae04899c6865a66923eb173906b26c33231a90044c9c4d5215117ca1d50cbae1120471c0462eb1247f07a2197680856428ba494dc721bdb3760c1a97d2e59735bea6064650f55212117659380052550fa311599923dec097cb28d601cc4a117269822a2bb589ad165a8587893bec2b0e22030dd8736d387673a67151b249c49e7abf96960f5394fb255be8cd9927152211613c5242a45e87028745626de709542338e131678b871955582014f1074e2f8be14a634ae5c40dad64b78352febcb21bd987d7632c16e03261c4771bed2bac280f77da45501c2ef4d97f2faf650309211985bbee4c3a85865a7ea65e4729daac39a47c305ad3084af028e66f759e0e22469d0386c10bfc23a0f4dff8e56f68440836a072412a30d851ace2c7c6f02d60e7a8420001a63e6c6 + +# Official test vector 69, seed: "6d5a7cc326ecf3983c4e7683f45263a37f692f3bcd2d920e1fd9584350119e74f9a3f905f70d3e20318c1413de2a0dea" +seed: 995eff7e0d195c6d0533f3dc194d47e60f9ad14696144cde694d60a95f3e96b4b28f7e7a15a005f92400ce33db073d49b53871594a88fc45e0f94207b5f0f2dc +public_key: 5cd35cd8f09ec13054176c506d02a7258a84eb685d14c3352f0b0051757c30d4184ab6a37bb6058c4451e89106ad2c259bc6791de49ed9dc0bf62bab1201429035c8716b864552a26b0549b1832a2bb01cc8f8cb55630618a525f885cb6fb407f042610681428031399e5666d56a9656e1a530460ab4178c3e957d22244b1366750da084f572399a33bb452c7c73f3cbe9a7028cf3849b475606ea2c96958dbef17aa08b3f15c146edb65de9379f62c11226f9b4b85802694614eb229c8ed44198542685610f53885f5bbabdd95c5597f89d825b0f441b21aa476ba4970be900a2f40cb742402c2093803f27ca37d06347615131b81fe6ac6ac9249459c92d92133870111aa5176c6bb828a4198c865a1730a84961f3914379bbfbeb46411c1705bc86f8a38a5f817f1b4c34e99784773051764b3f55d38571e98d744043287a19dddba7d4eac3f0b98173d09f0cd10b22a0bc0417a056c66064c906b7559ab134b6c47baa7932540070811d3ab8f5f265822873b4c78af45514ffdb6d03d79c24a88531d4ae7230486977b612cb05b906ce19337ca1f0455718569e80c2c2c795b7a156e60c5c65fa19fdfb5e4fd96727947fd66abd94774a5bc45fda822146a12b67534ad93aabae123af9cba2b2a376608cc6335aaa99f759dc964aedd80e432c6f417a1a65c63f639b5312c35038faa9c45051ba31c66912538fb51a85189d846b799d8c2fedc439ec8685b547376be49a83fb60281accd733001d729e4156badffb3b7dd8cb40411ee7a3970a168357a89dcb75535ce341b5b47403308bd87bba01f5cef30634c9d27d56da4d4373234790acbfb5051ca2a8519a42e610269b4b32c64770a5db4caa1ca6670c432bd74745fbba2f22377c729446954a6e067454639c3771aeb626871e3558a0f141a37c2732b13b13532cd16462f7822ba2869a0b20717e3675a328625da796e12c4403d380cdb54930db78493994c0793fd67b0a91140758fb78d229051e696c8707cf5a1c40ef511123b7c6de51ba4b792eda810762cc114f716c66a79dd4f5b0865a1a2a1144da80c4106b72aabb0a8f8036bde19b204992dc600956ab076ccab601f4250ac4b2cef77c38d6b6ef8907feec307ab29502b269dbc063e337ad43958d893a36318c6c052549bd907313c2251744ad02c30f78d0b394635508951856d1160706cb042275ba20a4bb6a734f9856aeba164af669f43c5016f1305e8084389581bc146168c0914d1a65ae5188e19082d585af435c183df28179c6b2278491dde450e7b1bf64075e0a9a8301454b5e111e39b0cced002680e173c5db96de082c3c399e398210c974b6f47449dc9326c1a7a79f893f454834e6ec1bcf0a860d962a4e05a1f51825981b18dc4ab661abcc98d4313cb40baa402307895460139c75b6aa69e27c5e69273141487b849a42996a55788b3b42018da0ab1c315d10308f05c54176d727a04b656ce6859f69471a186a4ff6b17b877070924758c83dc681292bfc7618f2b75413c79eb9b945d1b2aef95a47cb21cc8982f405739c9064975b5ab875ae5ddac05a65a43cec4ed80acfeb15aae898b995e649f32b98613c77fb926879ec940bacbca0696cf6c6749604a1a59979a623477be871a2278d22134a95ecc1b116c48340c6c6981adbe742ede1426bb65b942302162b8164352f918679d53c06beab47f07c8a37aab0a7449d45e01cfdf9422a783e06f645353cb56b8c57e28840e074629bd58b5646cf1c96003181b915a71caa00a35fb4533df22b2367c9bef95ecc85359a236e23a425f9c975ef842ee20228c66673f1ea3be278b0fd43ad4c004655532654598f34a257bc7c81dc0999266c8c2f40a4d9364f602bac27145b5be7c4fb0759288761ccc586b9039d6ee57858a21a05676edb52c937f11c35fc091d3baefccc15bb953bf5c50b95b449b8db449810680fcc53169bc8403bc70a5b2e3dea7af89aa0fd662255197360b8c7325545b7f45f2dfcce05d939ee5556f5c63cef52cd68e8399ec25726a316269374eb94bc3884011c89890e828b5c726d149cc3446b8a12d76c35545eecc7aaaff17030a0cf9c993e53a88ca000116c2b206f0187f725acc696112b5c44976a22ab617a0c42a64d03b8ce88b7a8aa7cdba28a197a5d3bdc64cf089f922345dae5a7c6bd86d17444f21dd9b1a5c82b9fc906c4ad49e0 +private_key: 41a174fe5ac24562ad78e74c8e65930e7cbaca489509d26ebd09a742548fd3b90406b2b8a218bdbbe4a5222c13dbe576d37c0d4dc20f3e416dba4b784491ab7a534d28b90c7121589dbc55bb214af6475853b74a4c048885a6ceb5184535a5cffe6c3a1c43c305fac42ca17ca7f64a24700c0048447154cf15d25636873d41c0b588190b2d0178f12940f5eabec85a59f90179076abfc3e734973b4074c721a3d41ab31465392841ec558580711aafa93bc1382efa153f5bac2fab8c17eb7872e9d3b7b6fa94c2ea20d964388bd5144c237771e1c6a7f991d37a55975078dddbb76499b6b87c974bab79ec5513d839cec1926ac9c5a7e45861e0a226e6f2b00a95bd52a17eeed93f573c19724c593ed7749e542287a62ae01a4021737242424694637649771345408d2800b5a03872cf6c70ce848b8ca2c57f93543bf7a61434a48f536338051bdcb092dea6690ff3b6ea892612ab5472c0cb9e7987c3756548937e47a2cfed69ad4444cf35242bbd1b7d65ec028f2116507ba09ca114e4cab4bcb736ec5109822b0a590270d3268de357bebf98317090185db82b6c28cd4d7838d8a2368c9a315661b3554b43a8cb4cf376bd771664b5ea2c50eb929eb768bb685812ec4853a33a49519ab98c1ff8d4cf37b2bf5b97c2e0921a0d769abe68c7e19a87b50a6a56228f4fa4915b2192d1e4225a58b3d2f0ca23a05dec8bb5ff613e636c95fbbccbc5f86d49e447d0124631f52fe575652f782cc5e3a376bc868695868d17b254c797d8cbc543343804c7b5bfa731df211f48b20d0930b19485531c678328ac647c2260f6062af02cc2c1778833a62b4c40bbc095b285e282b641b75c5cbafe41a0ebf88b3cf890b13b5b8b032177754763454ef79403b6922cb012013ad810cd6875759693b298a57d107b8b568778e6c493239719c73249545ccd0520805ace114c0b7b936314a6af1f37bd3876322ad855877448e5ba7162cb7c7457c8d2a47d128b1bc8603a60d06b044c7611239ea90c0cadc09a4e8c4cb0ab386ddb2ac14c2741bb7ccf6c0387e6966ec824691855cf748b680134535397ec427df2149f27fb14fd814d47031dacc858c52a5b435b6d9b8c8f76a40ec0486d2c670b5e4878adf7adeaa9b752b0350775ce1b9b590a9695c3c05c2ee0a6f2064a363664dff41668c3bfac172e1ba87e3d3845d1119a36f52c394cc328d8ab23914609c058b8f72b4f8851048868216a9b13c7cc55177ce559553ad28ebdf2c927aca49ca90142e2caef59c9d457387d81c55729177c665de8d2ae21453f91b7663b2b1f4304bbe02499f690b95ae18976a00e3151c570c479a6d512afecbe34a2a2f2b7cfcc03290a052f00a093956091c22729e57044dc066f892799b9e263dd957296865e09a2c15e300c4cd1b1d05067fa1483c6e765c551425efc7d5b15517bd911178a2b9692a1fae74ef4cb2785e561a51c498ffcc20f039e0ce74dc62c3a56303774449661f171487cc2cacc071bc3b2cc54bee99332d655ab4e6b8b9a8351397a398c484ae22a29a4187c6f5690bc741c23e9c2af0916f8f4becd630d47010402850f3111930cdaa5fea74e3748492e6b2c589ab4af5a011bbc8ccf878bba2708720408cc56bd83859e62ab95dad5c17da8301010933ec27d18f02318fcaa9fb5336bfb608cba4d0b59cbde5c8317d09443f7aa641886201b62cc3b233903ba98cca9a40ab8345c1dd886bfdd87cf6ee2c50af15bb0539ac2673d0ef08e58bb34e3a83198093380f11035e38a0cf532cd47a45ed7cb95bb9420aa62f779345b6c851f9b09de8c79ee1a807160763b9a0b26e74ebb32aa2f429740319285161585a7bfb6f7294669cce50a044ad055d2f747070aa6cdc5195b221dcef05c43456dd2bc1c1784b397444e6eb397f35b5e4cb8aa04a7207633ac1526bdcb9591494554d03557ce60820325008b42acad262f8a062e1ad11716001d99e8b3a1caad0226878099947a2511f62a333b1b97f5b1654a35c73f0c69fd92531d32a33cb50be57041ae870e15019a0f30c35ecc8f33ea39ae209d7f65c5937b5be1a82192c8c335f35b36d6cbedfc953eb140e191c819a0ca16fa8775d67192161a3eb1a508b0695d61971cb9b4ca61ccb459b8fc3748d7c9596a93a88b535a5cd35cd8f09ec13054176c506d02a7258a84eb685d14c3352f0b0051757c30d4184ab6a37bb6058c4451e89106ad2c259bc6791de49ed9dc0bf62bab1201429035c8716b864552a26b0549b1832a2bb01cc8f8cb55630618a525f885cb6fb407f042610681428031399e5666d56a9656e1a530460ab4178c3e957d22244b1366750da084f572399a33bb452c7c73f3cbe9a7028cf3849b475606ea2c96958dbef17aa08b3f15c146edb65de9379f62c11226f9b4b85802694614eb229c8ed44198542685610f53885f5bbabdd95c5597f89d825b0f441b21aa476ba4970be900a2f40cb742402c2093803f27ca37d06347615131b81fe6ac6ac9249459c92d92133870111aa5176c6bb828a4198c865a1730a84961f3914379bbfbeb46411c1705bc86f8a38a5f817f1b4c34e99784773051764b3f55d38571e98d744043287a19dddba7d4eac3f0b98173d09f0cd10b22a0bc0417a056c66064c906b7559ab134b6c47baa7932540070811d3ab8f5f265822873b4c78af45514ffdb6d03d79c24a88531d4ae7230486977b612cb05b906ce19337ca1f0455718569e80c2c2c795b7a156e60c5c65fa19fdfb5e4fd96727947fd66abd94774a5bc45fda822146a12b67534ad93aabae123af9cba2b2a376608cc6335aaa99f759dc964aedd80e432c6f417a1a65c63f639b5312c35038faa9c45051ba31c66912538fb51a85189d846b799d8c2fedc439ec8685b547376be49a83fb60281accd733001d729e4156badffb3b7dd8cb40411ee7a3970a168357a89dcb75535ce341b5b47403308bd87bba01f5cef30634c9d27d56da4d4373234790acbfb5051ca2a8519a42e610269b4b32c64770a5db4caa1ca6670c432bd74745fbba2f22377c729446954a6e067454639c3771aeb626871e3558a0f141a37c2732b13b13532cd16462f7822ba2869a0b20717e3675a328625da796e12c4403d380cdb54930db78493994c0793fd67b0a91140758fb78d229051e696c8707cf5a1c40ef511123b7c6de51ba4b792eda810762cc114f716c66a79dd4f5b0865a1a2a1144da80c4106b72aabb0a8f8036bde19b204992dc600956ab076ccab601f4250ac4b2cef77c38d6b6ef8907feec307ab29502b269dbc063e337ad43958d893a36318c6c052549bd907313c2251744ad02c30f78d0b394635508951856d1160706cb042275ba20a4bb6a734f9856aeba164af669f43c5016f1305e8084389581bc146168c0914d1a65ae5188e19082d585af435c183df28179c6b2278491dde450e7b1bf64075e0a9a8301454b5e111e39b0cced002680e173c5db96de082c3c399e398210c974b6f47449dc9326c1a7a79f893f454834e6ec1bcf0a860d962a4e05a1f51825981b18dc4ab661abcc98d4313cb40baa402307895460139c75b6aa69e27c5e69273141487b849a42996a55788b3b42018da0ab1c315d10308f05c54176d727a04b656ce6859f69471a186a4ff6b17b877070924758c83dc681292bfc7618f2b75413c79eb9b945d1b2aef95a47cb21cc8982f405739c9064975b5ab875ae5ddac05a65a43cec4ed80acfeb15aae898b995e649f32b98613c77fb926879ec940bacbca0696cf6c6749604a1a59979a623477be871a2278d22134a95ecc1b116c48340c6c6981adbe742ede1426bb65b942302162b8164352f918679d53c06beab47f07c8a37aab0a7449d45e01cfdf9422a783e06f645353cb56b8c57e28840e074629bd58b5646cf1c96003181b915a71caa00a35fb4533df22b2367c9bef95ecc85359a236e23a425f9c975ef842ee20228c66673f1ea3be278b0fd43ad4c004655532654598f34a257bc7c81dc0999266c8c2f40a4d9364f602bac27145b5be7c4fb0759288761ccc586b9039d6ee57858a21a05676edb52c937f11c35fc091d3baefccc15bb953bf5c50b95b449b8db449810680fcc53169bc8403bc70a5b2e3dea7af89aa0fd662255197360b8c7325545b7f45f2dfcce05d939ee5556f5c63cef52cd68e8399ec25726a316269374eb94bc3884011c89890e828b5c726d149cc3446b8a12d76c35545eecc7aaaff17030a0cf9c993e53a88ca000116c2b206f0187f725acc696112b5c44976a22ab617a0c42a64d03b8ce88b7a8aa7cdba28a197a5d3bdc64cf089f922345dae5a7c6bd86d17444f21dd9b1a5c82b9fc906c4ad49e021cee8b1f3fe43508e7bb3b567d02568cc93c39c3cc347e2dae6e0144714d80cb28f7e7a15a005f92400ce33db073d49b53871594a88fc45e0f94207b5f0f2dc + +# Official test vector 70, seed: "f68fc0314dea88f66afaa76e6c9b6804b13d4876924410d1f526fac59a62e26c560b125b1d0f8b461f1fc2e351effb4f" +seed: 3e809ec8dd0fec0d911a4e3fac20f70fbb128c5de94dc7184ca7310ae9157a98d8128601c28b1def8d393a0db283229f7c7383152a814e7cefe8ef9d9768c473 +public_key: 66834aa6b266f0964efa45c0469249c3fc0faeeb19d1508cb7c409b49a7e38299920c3433da3929b2552d5e9a1f092383e3b4d3d8a16ffd199f7d933eaa506062697c29b1fbf10292a4758d26ab61f085c31a0a3b85a19e956860f93a3ece8a0c22426b40bc8d0c1191754803d0204ff048c07f6c778fc685b2108b0327dba9361b00c071c8223aef0949ddb804075c3a0178f41bca68b676ec8469e417547617c8b8ebb6e19e83af1ba27e2db7d08e11f25805f959285add216c25a029684160a880fd2dc5753709ea3d81a59a91357205cf126c24f8858a3757be1c562c65166a0800047949c062bca79e03836d05aa6a91a30856a367b087b455169a7c3591091e72c96b7432397b6a257723508661349265c4c475ee7251e4cc26d739b33190cbb07a993e5b72288a55d5792cdd2c9177c9541f0a70bf066135e06a3ff1700af24247aa61e70f4727e6a9fdad70c470b671ca31a21d236bcfc508a833714182198c4c41bd1aee23b5acc9720a3e955adb119e9e06fb6c8a7ba5a37bea21565f77f7f037f0ad71d6ad13301a547fe8458c8363feb218a3ed5bf594c3bdc7a03003641da15479304810b5a0c949417b9a8473f76ae6c13144d7b3673074703da0389e82ad34165f0c258457367b5521128ec318df886eaa203e259bca111b68e13ae684b1f1b3781d8305193e094c20b1e91b473ac9992d1e77db85023cd043b147681fc9c2c9c2c1237c27f1e459b953ca0711a318a4b76d924baebf599d9eb852dca1dc5f80191b91281f8345d774a29053513f159164a705c954e53ea26b6927dc57a0fae5a19bd33bd67339e8eb925576a2eabda6b0a4743abe05545e080d5495402eb0629859671e130cd048235f254fff49a7d394f3b1c3de06a7847473119e218cf0944609958300b93046869c026cd93e21925a30da0389e24ba6f08d498748730e2b40d1c73452de8b7570027579c11a7417f2bbc67122c9286d1219d7230ee5b0c42d724d1b1cd4b031500958dc7124177a25651781657904fd1267f2bb69d5c929f8967cf216924d63696627c917f82bd2813563cc443705b0a1b279eab237326b4ce45504ec710ab95d01ad812559b2b8be763c1e9c55449a1366fa2cdb6d0106856b080a16d7e3700b0771a422423c806c62614b047820ad6876d7740b35fd674d99605fc61638d863ce5cc6a55d62f83a4a68aac10ac065657870b5c623970db1a40773500757178f29d54548aefe92eac306fa8f926e5f84b15f339f4fc388a554b79d87325c81f9e9989c690920f018fd4440afca405b1b667e489568121178cb7a18ee2c38e10ad4f5a09df64a76c0badfd08627861144f8a449df4089a08c48cf1b110b443d16386042b6f24730c921643a6f8b7aedb9a7036339f1b156c1c4de7f4a03acb57b1cca827146f4bbc30f17a32ded42949ca5340b0494cd29098260a87bc7b50440ded82befaa1a6c4c28bcebcbb16990978ea92a3709b817996f51a6e080578f2d060b924c5d9b93098725eea946ceb84a0a884c7fad252bfda7aaf374e5ff8703941a8483493a5143e0f9b6f5ef45f683c2ea2c4b5e8b92a46984064b97e28d339789a8654e27e38c84ed7e4cb204412a434bac227197528c6c6e1625dab98c25557e16cb5b8249ebc11caade0b5fb505527d45981864d4abc8e1060cd9a7467465064c9b8cce823b6bdb9c702a7a30415b4fc6979d2476b4511909c90559f70597375c050189ff2932852a51e74a21b32c834c734052c61137025c20708263e0aa71d87b20263bace0c0c98a58cdfca4889672e6b654c003a7e22465f97021ac7c11fc4d1c0525ccab768c6dbd124c8c533f49ba88629c71fd1cb6ebc4aaf09ab6db011348b2b0691bcf8eb1bea9588b640cf3fe97e35e92440284cc9607d49a3891283ac96c32a2a223d1c372b509b1d9401ba6bb13ebd5ccb6c44ba12e392b4d165c4940a714359ce122f6b34bc1344af802992c6fa2d85f1957045bdbda400b526b21bca1a0ce181531c8bc644799ee8477af16fbbfc33879868135a5adc748f88799d23476aab0643e5dab979f3658cb1cf19292ac6f30a486353275cae5fb941b2d49a0d0349e65917b4f4cddb9a976f322d8917b70278ab9cb16ef193cc33b312e1689170532f31b001350225180493d7966e2b216c709ac1bea73f1c624a081620b7981c1c95ae0387aea62f +private_key: f1594ece355ed8872280f422ecd4b02c1c9fd2716ce375a9c01b172b3c735e4908dc96c1a58945e70813250a95c1d48f6bf159aaa265da841dedf23d0bc71809c6bf16856a0d316f59955dbbe18a39175295d5899b4abaeeb6a7b3f9267426b6190c1f3c7372a0235a644b1dcb577065a6a2e6cb130f8150a8633ca8f388ff6935c2f3584508c0da3898e5a1be423506e612982d80179c4cc950aa35df21244bba78e2b24176769c934a020554aef4d43caff4203ed5351bf822695814cc0ba1860a27031c0c9de66ca3675ecfbb3aea48496a2179e6124e755656f1412b04f2aad353c93cb068910c0c73362183063a233183db280174c0648c3422361954be811651380ad3975305bc6e09b9736e911d6c55083f63347e2584e6a26bf3200c7cb9c1d71522fa87c684ac208a81b3f01298ab315773ca10d8243f465055d8489d5ce385e7c6c0b5cc741df52b7e62caf73509ccb814e9644f6c35bb394a4094745ba69b6b8f933b715581fda1abb0f8ac9ec15ded803a28e057e4d87bd7b9c53af6b943a00e3f694810e3878e3359ab109245b29a962ac32d1a066872a6874a4e3a7235c5157250086d00610e21372218859f807207e20911826b1533c851024054441014bbd618e65056576aa6404a1499c92683872eafb152fb2a171ff02f4f895f3a4b3d9bdc22a9627c6095957f86b41395b98b947e4611ae496844ba3083eb9228cc0277cd21c050f181d79bcb90416d4d5c5932f5643766a3dd1295cc2805721b58a0596a371cc1eb69c986c2b230f4ab6905468ce77916c816df1b7668e6ac5ae2429cf56a9fa6a7327892556c58ab5b24be7a9beff69ac35ba63a11c6dd15772b501dfbbc6d1437cb2ee29c98779131a56a28258b8dd6237629276894af0b46af6ed66c2b7272fb3ba9b936027b330e2f20b0813a240d27c7ae10778b0a0776e17751f85f410c373a6376670007d8eb78a7213a5ebb8a89d02cc902a62ca15f15709fef9caf5a558168b90fae5b5f3909259184c20a0c37a0196a37b2232c34a32704301cfb56066ca60aa65a6a459689bab328114e731650cc690b7f50814da97dd2495302fcb61ee375afa57eb06247277ab8ab96355ab42c87714ec6020fb6f95f05a02e679abece5069356c70d2444020521eaeb6376af0630edcbb1b655cee8a734d577353d95e3f93bb7d703a6399050e12c1e41340807cc91e274970f27d7ec86c0e7b632190a65e886b52e02827795a8e3ba1aca22c80e59765461b128543ae34965922876f2c418a47cdb447168160c12bb03e94fab4ff012845e15bc17985a38c7f3c6b6ac365adc1e8744b15334079bf0b081d3e2a9572119501892537bb0be05249661a5700bbb268f153603aae0850cded06a4d7b548550797459141beca50dc609110b22fbd61a2ce84c4d437663be27cee1b8f234b4e58bcb3d8b63295a5891ec1a63a933420a33eed084626f83dccb82002d844a593b693190f4291372dd6428c7b90bf9a97019b7b1f9bae23c87f152b6e514554cf6b9703604cbb2c864c94a024d54b7f3a2709ac878a8c2a9ea74c03f9a027d0b4973b062a45340eeb1b08aa2236b021f9fc56757237cc9411cde098aadc935e52832d3a3101268ca57b566c1804ee9831863b2fabbb9497833c2d9097805b3d125c96c2eb3bc2612df211829fc842ee6ca3770852beb38d48399a195cb91fab32e0b6752836cedf05345fec5143b28a5ce2a2510548ca95666c579f36e477e67a6ae6275ad32813a4f3795a602d24d6372ee039e50844cc000be6609cf388686cfb1f6e775951a6a2626095b190191702114ad08193d714abc32849a5a33858b1f951b09fb115f2f8481610cca8bb14a10b54e8e364c471ae4e57037c3baafd9ba275f1a4baa82c585279eb01403b2669dfd6b1735c5b7d85c5efb3a1ad8c0e8d40198ea4b4b7d1427c39660c04635ce59619b5824c80b84164641ac45257817c0cb038b3047c30ec460298c75b73a2f7f0b82b6a6583391f58ba057a6581bada84b5978888e15e9462952349961093354dfa34c0c08972b7571fd99197b13aa8b19a7f6920e5d41f50613a5c2a6036b79c0037113f41a3146ab6d7235185f51526f9b564462ad4c70f8f30346ce7282635783b9850eb9065ce58a272193166834aa6b266f0964efa45c0469249c3fc0faeeb19d1508cb7c409b49a7e38299920c3433da3929b2552d5e9a1f092383e3b4d3d8a16ffd199f7d933eaa506062697c29b1fbf10292a4758d26ab61f085c31a0a3b85a19e956860f93a3ece8a0c22426b40bc8d0c1191754803d0204ff048c07f6c778fc685b2108b0327dba9361b00c071c8223aef0949ddb804075c3a0178f41bca68b676ec8469e417547617c8b8ebb6e19e83af1ba27e2db7d08e11f25805f959285add216c25a029684160a880fd2dc5753709ea3d81a59a91357205cf126c24f8858a3757be1c562c65166a0800047949c062bca79e03836d05aa6a91a30856a367b087b455169a7c3591091e72c96b7432397b6a257723508661349265c4c475ee7251e4cc26d739b33190cbb07a993e5b72288a55d5792cdd2c9177c9541f0a70bf066135e06a3ff1700af24247aa61e70f4727e6a9fdad70c470b671ca31a21d236bcfc508a833714182198c4c41bd1aee23b5acc9720a3e955adb119e9e06fb6c8a7ba5a37bea21565f77f7f037f0ad71d6ad13301a547fe8458c8363feb218a3ed5bf594c3bdc7a03003641da15479304810b5a0c949417b9a8473f76ae6c13144d7b3673074703da0389e82ad34165f0c258457367b5521128ec318df886eaa203e259bca111b68e13ae684b1f1b3781d8305193e094c20b1e91b473ac9992d1e77db85023cd043b147681fc9c2c9c2c1237c27f1e459b953ca0711a318a4b76d924baebf599d9eb852dca1dc5f80191b91281f8345d774a29053513f159164a705c954e53ea26b6927dc57a0fae5a19bd33bd67339e8eb925576a2eabda6b0a4743abe05545e080d5495402eb0629859671e130cd048235f254fff49a7d394f3b1c3de06a7847473119e218cf0944609958300b93046869c026cd93e21925a30da0389e24ba6f08d498748730e2b40d1c73452de8b7570027579c11a7417f2bbc67122c9286d1219d7230ee5b0c42d724d1b1cd4b031500958dc7124177a25651781657904fd1267f2bb69d5c929f8967cf216924d63696627c917f82bd2813563cc443705b0a1b279eab237326b4ce45504ec710ab95d01ad812559b2b8be763c1e9c55449a1366fa2cdb6d0106856b080a16d7e3700b0771a422423c806c62614b047820ad6876d7740b35fd674d99605fc61638d863ce5cc6a55d62f83a4a68aac10ac065657870b5c623970db1a40773500757178f29d54548aefe92eac306fa8f926e5f84b15f339f4fc388a554b79d87325c81f9e9989c690920f018fd4440afca405b1b667e489568121178cb7a18ee2c38e10ad4f5a09df64a76c0badfd08627861144f8a449df4089a08c48cf1b110b443d16386042b6f24730c921643a6f8b7aedb9a7036339f1b156c1c4de7f4a03acb57b1cca827146f4bbc30f17a32ded42949ca5340b0494cd29098260a87bc7b50440ded82befaa1a6c4c28bcebcbb16990978ea92a3709b817996f51a6e080578f2d060b924c5d9b93098725eea946ceb84a0a884c7fad252bfda7aaf374e5ff8703941a8483493a5143e0f9b6f5ef45f683c2ea2c4b5e8b92a46984064b97e28d339789a8654e27e38c84ed7e4cb204412a434bac227197528c6c6e1625dab98c25557e16cb5b8249ebc11caade0b5fb505527d45981864d4abc8e1060cd9a7467465064c9b8cce823b6bdb9c702a7a30415b4fc6979d2476b4511909c90559f70597375c050189ff2932852a51e74a21b32c834c734052c61137025c20708263e0aa71d87b20263bace0c0c98a58cdfca4889672e6b654c003a7e22465f97021ac7c11fc4d1c0525ccab768c6dbd124c8c533f49ba88629c71fd1cb6ebc4aaf09ab6db011348b2b0691bcf8eb1bea9588b640cf3fe97e35e92440284cc9607d49a3891283ac96c32a2a223d1c372b509b1d9401ba6bb13ebd5ccb6c44ba12e392b4d165c4940a714359ce122f6b34bc1344af802992c6fa2d85f1957045bdbda400b526b21bca1a0ce181531c8bc644799ee8477af16fbbfc33879868135a5adc748f88799d23476aab0643e5dab979f3658cb1cf19292ac6f30a486353275cae5fb941b2d49a0d0349e65917b4f4cddb9a976f322d8917b70278ab9cb16ef193cc33b312e1689170532f31b001350225180493d7966e2b216c709ac1bea73f1c624a081620b7981c1c95ae0387aea62fece8e4c1277c5b64512a4b2bb7cc80044f98e2b654e5bf0f4ea520caaae1f2efd8128601c28b1def8d393a0db283229f7c7383152a814e7cefe8ef9d9768c473 + +# Official test vector 71, seed: "a229218b0d51f58d915df549901548fb0722f352c7470900e7e4d8399205764a319bbddbd06c00e8c5932722ee5a404d" +seed: dbf1c465fff3d9f783bd9ee61a573715e45691147b8904439b5ffaa64f94ff7bb6d75eac6c76ced1b0a025b40a55440712ad8424672e761e9bc400d63812006f +public_key: 14830be3ea225e8161039550c3c320e6c57220e076224aa8fd48b4db59a30f71b2a2fbbeb05b3885819b672c48393c5fe1865a4c113b736505c1199b807c5e7669b7d2499931d899b21b8c1d9caa129761bfa3974c4a85677a0ea1a49c4ee022cf3048012a3b108b4380f10ad2c327a009717a64704a62cb31446c5c810a5a9928e1e4564f95b027ac251c464569344f0086106f7a4dfac13eb194abbd64a8e7db2352cc07ef52195de869bda087cf838fb42862f6346754f1744de8a414464ecaaa921bf76a4ee344e3055ce0fac32c15bc9ff3019c7b9205737426cc29239721ecf65ddc241f33dac59dba06db577514891f70d020f5b240b03493aba381f6716a16646a8a8343efc41394a90cfc896dc04c4fba8aad7cd66005e426a3113dd1a4be4a661eac59cc2742a229c6bab9ba26cfa9194ab41674e89a410bc7e8a25bc410bf95738f8420c64de5715ae624368322ec4a513647ca86a231e76b62e52753c939308f8460a7650a28d258b24c4662793e2ad4454b5756e1692c6e6822a8dbc070ea81f4a85d6a2a852c452235f63816a08d957cbab030c33b5535c87c5e7851c55503898f21138b61558b38b04ce78527658082308117978bca146f8f338c4b4b623177a0b1a51b5f134ba58c19b4db69182807f3bcb29838a0729cc2d34200379cba1f751b6764c27d471fcf7a0b3f9a404fd3bf98150150b540d79b1df00038ce770424838f58e10aecc304f29a9103177752520ae3d967ba33ac2526c85d9a7aee03845b911f9c0a516f10a06a018af24319385a81c153653fa81808a6bd74680f684a52b8a72ba5288b6e75bca97a0304f2c3d8e940dba7239869bf68c951ed8884dd32cdb254755098cef7abaadec1a47a7a0fa646b1ae78af8c608ee7535bc43371bf1206c8680634174426e062ad9c28f4474a01b6785df35df57014c3e8858c2a2ed9d911cda8303c318bbdb13370b07bad82acbad0bf04c3ad2c491328a20790c39292629152dc0e6a29199251b5bdc956a2c4272a4b894a87359a11803a8b67e236837d25a274c97eebb6a8a9e7ce73cca9dc91a1129236730786de0a22286b71afea28e01abdf69cbf460ba2d7d69143895630f526c5f2c6fe9a289a3a058d84b64228389c94984644bca5fa1f61004a3edcb94557093345991bcb9bdea45915a5bb95618f4d62cce22717a67c60042856fe8ab437066aaa733567694dcbd301307b4eb02cce11124bcde6a79819b95ea621f1b11492315e60f774bc5b207f42c178708b28a18c9883561cd66daf17bc0bc42e0050b2a8157354f7945828a488a941363b3393a1112c691e123c6b5699a5c945038b6b2dd6725e7e619bebf1c34c7c32245461d32525c5f49a763944cb64581cea3a178146dc759c29c995ca0793df62cb2153859a32905e785e8e6ba2b834918f2c2dc5cab10f8b95867467adc87111d7beaf69099400aa4e908fe0a299e8901ef5f9346fb07ba287235087a1aef51bc8933823d22b8a02c1fffa56ea5b1dfb143ec1426f32959a4103b9e343108c87aad2fc0bfc7384c0101afcb4740f01b57b483c0300baba66543adca822b4381e99870727a75c491a1129af47d768e4f59fdf05c6f491aaa5dc11b9ac7e20e541aaea11b6ec8b27e94189dc1be939cebfda109cd53f38fcbbee7aad3c65a3c51aa3970ccb31695bbfba3e3b10cdd0d37d848309ebeb3ed8601ca2d1479f3aa0f2766d24b0b0feb01d34bc5627ea8dcbd935a2303bd6aa6d01e7605d23217b98b2ce8564ce077032abc35aa6afa046254d9a63be6c4bdebb95e0020ab5fb89aa5b01238047a3c183188bcec1158c0cf901636b3a459a223a73986afb886787cf93a8aabcd9af1e4cc585cac6f6f424131a9e01fb49bfb38ea664ad31dc16b2dc3c701753a2870cf9c27114262167763902b58b2f03bd906aad3b0101b7898e2663bd458b5c4bb7c5f49c28fffb97bb4393ba3aada4c023e25427dd5016b089591277b13dd0c26ae3ccb06c088fac04b475477ddc1be06620cf3754548a6b2a551aa1b97df5faa296c6a6ecd052cda5903533c93445778755876136c193fb0e3c937bf71ab2968a25e8d1c9e49a9962ba0c78951f64882c826016f63b97e6f8ba0242a45d69276fe0ce06f14be7535859c87a9875904870890c5a620d8632f30f55d3cae33d1c6f5896e6b12354a75c7894d8905403 +private_key: 6cb427a837b55537299e1a8836b9c79afab583679fcd65663b17a3008200d9035fdbd50b99449ff6d14d5e0611bf21c652743d60268c89e0c75c5b4445707215a31593349a86960219f0cc079a2e39e221060aa5dc19861197049e817f692ca55e328ab0c32ec8fc5cd25a83311bb49ec8929455330764885c70c9d988a5dfabcb1366ac382b18bc866e5b93b780736558a0afc0580c4af75f6b6c63f95a454f0bb106627a2294af45f02d948c1075618b8fb01228401b1fdc2b65b02b52f40452b86a1b235298b535b7990ab75565f66568be06aea98a6a1e4744c1728914d00cdf16cf3d940ada784e14eaa332026c2f3cb05a7793c4239d5628281356170b181aa3ac98af93193cb6a9bb6a682ea5073e11c5fa7558c9f713b98a424ff86d84fcb5238b8258076529311d3b522189b0a440b4194bd15344a5044216a524862acd43223b51682df641ff3876521cc9372c19ecf117d505b6e1b26a33bac9b81c13b2900f11d849a0843a44c3061cc111c34acedb3b98a49874f4642ddbac92d969597a635d64109ba5d55a20968b65072ba0bb4349046dc3c25cbe154790d3353e580c3855a755215aecd7b9c800aaf9d12816135f80f010c07824483c838c8176bb58cae99817f1d2a538d694470021e3d87989f4b31e19539f1b60211022a3a74df892a08db12b03e3051d4b3ba9144926c1431a87cfd0f5702a7a127cc09b92f2a1d474b013cc9443f137e0bb1aab721ad975c13bf69d6c5a2725a2b2ac88b80d7b8079b811e978caeb96a89f97781dd7c422461d6a309add83cf83d563d2bb3d381a1dd4147943f76010d292f6703136d127840c9c4b532b86d46587eb54ea613e542645d1156f5b965c772905f90b3f518821a1b18961d61acd7c0d3fd09df90b9a1bf993282b7de33a1ed638cc9a162fde471971d2a5e946b70bccaf00fb76c02a520343b24f1173d4d27e2ac574e1c123e7d663bc054cc432bf1eccb0ac775377c65bbb2291c9695b55a2265f87323a7b63980aa0f1485775b2369ec3a3eb5a0fd126860ad14db7928a9618c684c7790610c118a0aab2b3adceb88b278a3fceac58dfc80bd9f2c7a2d55b35b82f18363a3e577737788dfbe0c6d995b3da953a9bdcb46b1754e0a187f872c2af0b0bfc70327646ca6778928f1005767a091e727d6f287a684199eb36a21b5a42d0c9775b9a2cf6d2ba31ac7677d075c9b207107c79a863c4ef47aa71a0ce5a409d6de8b9549366273967a760101a67c3aaca617d49960fd658bbeaa371c172113b017e1445fa2096428074857142b07782924909c7097412280d45930561a80cc47720234c94cd682ad3c18572e5becb8413b1868f7f3941e7256b01280330620056431911a638828162eba4c7df9c4c5c537b9738643e72b04f4c280048a4cf37becb58a83cc0913ec58026b59135d15fe8950832ca27c1459cce071feeba54106b89cef37bdbf9515f25bf9de37363d61ab5e02fb867bb86fa1f95b3638e105310258548a7986ad04a33a9745a71c41e783a3b86bbad123a4b9971cf6755e7ea7df2a5481d9973c079ae7801747ff8b03043944ccb8b3cc1320168566070bab7e05bd98823220b17d8084dc77ab9ed4331df4495003162c009b24735c736dcac1836b8603c7893cac54b922e50e64310196b08696b42fb8871b0991ad80977aa3de41a25d6c918f2bc0f76b940a0ba85af62c54a5b260807c5e76a062277a6d2a87e42e68e7f66b3c60936c207a57195cd0f4342be7557cca765094cb7d8cb0b03b134cca0578ca61619d67f44b9a0c0843daed00fefa300c8678ebe8642046c454a34202a617bfce69127f07c6987ccf09b1ed7e7c7b6f311293b575517c8cc720f8e2643c616269f6bc4abda117fdc031b93588b888833f0c791eb2862abb733dc5691b670d041b171788c39d5b62aab751b5361ddc4ba7a0a6690d2205c7cb2cbf65ffceb0830383cbd134bb35175760350f5f9a4b4f67390e671bdec8e3a61af35c79c4d7c72feb112aebcbc22c074ae77b172e5b5dbd3374acb2f031bb18c174b02755d8a53a882459695305d772176273b5300d02d7ed2a272f9c7babb545a6c1aa25172f11096af5398c9d6c4590730ff05c74c81308ae5315ba24b17fc738a30718ad046d0627e4b81b214830be3ea225e8161039550c3c320e6c57220e076224aa8fd48b4db59a30f71b2a2fbbeb05b3885819b672c48393c5fe1865a4c113b736505c1199b807c5e7669b7d2499931d899b21b8c1d9caa129761bfa3974c4a85677a0ea1a49c4ee022cf3048012a3b108b4380f10ad2c327a009717a64704a62cb31446c5c810a5a9928e1e4564f95b027ac251c464569344f0086106f7a4dfac13eb194abbd64a8e7db2352cc07ef52195de869bda087cf838fb42862f6346754f1744de8a414464ecaaa921bf76a4ee344e3055ce0fac32c15bc9ff3019c7b9205737426cc29239721ecf65ddc241f33dac59dba06db577514891f70d020f5b240b03493aba381f6716a16646a8a8343efc41394a90cfc896dc04c4fba8aad7cd66005e426a3113dd1a4be4a661eac59cc2742a229c6bab9ba26cfa9194ab41674e89a410bc7e8a25bc410bf95738f8420c64de5715ae624368322ec4a513647ca86a231e76b62e52753c939308f8460a7650a28d258b24c4662793e2ad4454b5756e1692c6e6822a8dbc070ea81f4a85d6a2a852c452235f63816a08d957cbab030c33b5535c87c5e7851c55503898f21138b61558b38b04ce78527658082308117978bca146f8f338c4b4b623177a0b1a51b5f134ba58c19b4db69182807f3bcb29838a0729cc2d34200379cba1f751b6764c27d471fcf7a0b3f9a404fd3bf98150150b540d79b1df00038ce770424838f58e10aecc304f29a9103177752520ae3d967ba33ac2526c85d9a7aee03845b911f9c0a516f10a06a018af24319385a81c153653fa81808a6bd74680f684a52b8a72ba5288b6e75bca97a0304f2c3d8e940dba7239869bf68c951ed8884dd32cdb254755098cef7abaadec1a47a7a0fa646b1ae78af8c608ee7535bc43371bf1206c8680634174426e062ad9c28f4474a01b6785df35df57014c3e8858c2a2ed9d911cda8303c318bbdb13370b07bad82acbad0bf04c3ad2c491328a20790c39292629152dc0e6a29199251b5bdc956a2c4272a4b894a87359a11803a8b67e236837d25a274c97eebb6a8a9e7ce73cca9dc91a1129236730786de0a22286b71afea28e01abdf69cbf460ba2d7d69143895630f526c5f2c6fe9a289a3a058d84b64228389c94984644bca5fa1f61004a3edcb94557093345991bcb9bdea45915a5bb95618f4d62cce22717a67c60042856fe8ab437066aaa733567694dcbd301307b4eb02cce11124bcde6a79819b95ea621f1b11492315e60f774bc5b207f42c178708b28a18c9883561cd66daf17bc0bc42e0050b2a8157354f7945828a488a941363b3393a1112c691e123c6b5699a5c945038b6b2dd6725e7e619bebf1c34c7c32245461d32525c5f49a763944cb64581cea3a178146dc759c29c995ca0793df62cb2153859a32905e785e8e6ba2b834918f2c2dc5cab10f8b95867467adc87111d7beaf69099400aa4e908fe0a299e8901ef5f9346fb07ba287235087a1aef51bc8933823d22b8a02c1fffa56ea5b1dfb143ec1426f32959a4103b9e343108c87aad2fc0bfc7384c0101afcb4740f01b57b483c0300baba66543adca822b4381e99870727a75c491a1129af47d768e4f59fdf05c6f491aaa5dc11b9ac7e20e541aaea11b6ec8b27e94189dc1be939cebfda109cd53f38fcbbee7aad3c65a3c51aa3970ccb31695bbfba3e3b10cdd0d37d848309ebeb3ed8601ca2d1479f3aa0f2766d24b0b0feb01d34bc5627ea8dcbd935a2303bd6aa6d01e7605d23217b98b2ce8564ce077032abc35aa6afa046254d9a63be6c4bdebb95e0020ab5fb89aa5b01238047a3c183188bcec1158c0cf901636b3a459a223a73986afb886787cf93a8aabcd9af1e4cc585cac6f6f424131a9e01fb49bfb38ea664ad31dc16b2dc3c701753a2870cf9c27114262167763902b58b2f03bd906aad3b0101b7898e2663bd458b5c4bb7c5f49c28fffb97bb4393ba3aada4c023e25427dd5016b089591277b13dd0c26ae3ccb06c088fac04b475477ddc1be06620cf3754548a6b2a551aa1b97df5faa296c6a6ecd052cda5903533c93445778755876136c193fb0e3c937bf71ab2968a25e8d1c9e49a9962ba0c78951f64882c826016f63b97e6f8ba0242a45d69276fe0ce06f14be7535859c87a9875904870890c5a620d8632f30f55d3cae33d1c6f5896e6b12354a75c7894d8905403ef5c4f316e67ab8b72581b6eb228a8f357b716164e0388d504a7f1aafbb06d48b6d75eac6c76ced1b0a025b40a55440712ad8424672e761e9bc400d63812006f + +# Official test vector 72, seed: "6960f21c7350dcf41b4770c551dc8692d8ba2c0b6e162c589166ff22e7a1ac0f94c2f48504a5f7eb0da094df427bc98a" +seed: 1f7cfd2b70863154e8a69d1758532e86c20cfc763d67c758bd10a13b24e759b5273b38bddc18488024ec90e62a4110129a42a16d2a93c45439888e76008604c6 +public_key: 70ec588f847ca3ea21787531444355e26000209110be1b6994c3003332b95b6aa30f8a0d047cb6a2d9cfae2977e08962b656255637405057c233388e018753fec08442a6603878a6d4f8cbb2574b9dca1c32dc0964e82606739ddeb92402619649bc143950b753993e48da443b1bbc8c3a0e2edaa2710a541ea6ae48022ae1f48af844c2b32707733916c259ab588241ee58aca3538a0bd79fbf3589eda9ab08906d77778649f0a2b2a7898a651bae7013f8b863112c4ae2830a43ac421434236151b2aa7a5b3be77d4c85c89e3140f52804ca470aa2b929e8e8bf9b4278be1657ce321572d2196c4bb158ea891e627861dbc811525cb5f07a3377be081b4651eba3c311bb1c0357bf7a7923a524f003b02ebc030400b4b1e1711ef633b8921c101bcabce37655e8c651cc9458110e68566d0871659c3072c509538c5a6174063469a25c4134baa4f136e71464179b004fd361cb2b19d955376d137284039a6820211aa578189765f15a47e4b52d4af9447c4a8343f84edfe7ae76901d871b0a0d72414c4b01f35a38fe35a268848e663263439b4dfb9b3435537f54bb1e2b132528fa5942da8563554276d466e97a25cea6c7841729cac824dc3ccefa91c7d0a377f45b10b8f8cf78d00657f90e114363644869612bca78e402c8e2a6ee1910e07b72ad43b44edac06ec2cb3c448b506cb0a09746ccd84b3b993213b7a76dd681d6e7b7e9916276172d15538209b01ba5149bb0aaa55cbb04ac89674700544ec7079a8277a3dbc298034e08716849c0542dc42b7e32319b0b7efb43cb57f951b4912af0141965fa6e1701cc53d08c1887bb31fc93399823f1371712785ce6cb549b91099a2245dfd350c374943ee6826cd3c9bed72e7012028b938bd304ba0f5255ca664389335962f35bdf253e2b3933689070145462f245696e4b1d852bab0c817193679229ec684979c8f17965f4411fc1382309c28e98c095f663b587e967ef6320a84a474ed415e64381ff341daf491a9bd872a019a112a2ceea76661015b54181b8c325977b50993a5c26a7d992cf519d64f0a013f517664268d415a9c7f178c047a684495464332fd89071da200c2d70ba68c68425b815772b349cf4ace5dc1437bbb21e3283d2623cb58680fb1084e50685b99224f8c91d167590d4b03fd9a62d54695345217fb08658f1f6c25d0652cbc8cdd858ac9ad44616a8be03e06e14288c1ab27e4d3c15b156732d246ef8492efd508b41e6438c1c899b339874792f2bfaa1b8e55dc2740b02d23e8da9c0a1b91c61db66c92cb8bb3c64cc68bf4af341892441085a96f3aaa1a2217bf6c005a3938c2c61a15a701e090c84d93628e7cb6bb0e49c170079df1c0e364a4ad3622033b762593586549c79b764710b2107bd0c0acf106c7f7ba9accccc6ddb15d2b68a9fe7a2e8820ee9acbfdef8c139bc8b5ef47fd18626285409a59479d517714637b9d75aabae29cbf3418bd56154fae5195372299942271b0c90f0bb7f0c2537df6a433a2350127a24aa144d30b95faafb39f566651cc1bf205814027477c46b7ff1b66837c657af9cb0e7f46a42b4a74a69c36e716e2e993ad3c574aaec31a8fa5a950a8ce7823a7e032cb4930c95d8483aa102d1b20926a6a324b9062b29192431bcd61aa56488be8b9491ea373fdd276bf986ac01e6a9683785d3384acce6297da89657c005ac086687161bc21a18d6d325fef6059ff711a60782263a5dd87552f3b6691708a60459a81321caebba42faaa5593982ad4e0956aa42bb03867664470c8459a511026c2b8791a37278faa906b288dac6a1b7aa9588ae9062a31823076864800b08396aa90ab0a48a9798a146a8e77b104125ab1f1b5448cafbdc749ff085f06b02a2c25174f587f6c2583cb0384c521990b6c15cd926b40712bc503471d4b807f85b7baa361138312f1c62d62431297a451957375607bceb0009d09ba904a864be363bd220cab37d13a77daa42454b867307ed7c2a956d41a62b996e0e78c34b4ac0e7aaff8d8164b4a11f8aa4379fbbb34f14e9fe13a7f4ab0025586f130914c6183719a941b0338e1e11aa3f167a421bfa38c9142e02316d1ba4e64c60320c0a190cec011304f0bc58af38e492937bbd0ad3a5a904fb39ce365a13dc902166c864a972082fd9e2ea5548a3b6c7d885a3ca6ae2e12efc2ea3ee4ca0b0b171ee93a198b42 +private_key: 342c2896a97cd8d63c24504629c1555870aa71fa19b668a558e2bcee667a6b61463dc46547419dc8c458b24b5f463ca8399337782b02df7704e53bc2f2d49f2ddbac73dc3c84728738a29e6f1a906229a05bfc4673c87a2d2b0894a67c549b6631a925c562258edb258524152b7816a9310d99883f4a583df4e582ff16acd9846b04a957bc54665f86c237bcb092a505fb089a8f76b865c130c001529ab53fa3b61f45376561a781c6ec75d0810ccdf44dcb0055bc70bf98f9940b000212215040cc08b31b90a395acf312a9fea3adfbfca17d309ee84b25bad086ef669986c4bbf1aa6f694bb74a760cd235650e5927184ba6e4e918a1fac482109767d2289dc16277468ba17031772868eb6749175c9a2755c18d67a0f6658fb6b5a27374ba2914680d730372e725181a6292db0d1c719501257b0f33a152dc077188673fbace2ae568bc1a890fda174edb4a1c10b825b85a78b26563b9429fc7caaa116bf5d808427c0bff488ea615017ce73008e9cea01747b73733e91ccdfb5c88611a94642b661d1a41a943bf065733fe2449ee68b4537cbc86871e1268cca564b5e952188e90aae25988f79bb706706aade42add2c1b2951b84d040e097b85d78c3c5b10c595879784b71638b2c70c390ad308a311a337413a20857a216d31134e2429cee72be2268cc38ac8617b7d45d2651efc06c3b1c1d0c44531f5523a707d0802251576ac2d6a91b463a68348a2673a2f74cc7c20a79b73bb1916637830c91e701bb200166d2a63a21b5b8e52c7acda296d80d6c897c86334d8424f44677e9246ffa32c5c1754b632692af6bffd05458d131c41275161cc50a51ab2570746048b455420053193b6f1c0ae02f83ecf364e50a6694285523c5372a84b6345f484d0b2c8156c05e9f3c6b661bf1cdc5573082313c5c05c648be94b7b83b68ad93019b8469dc93a51e9f47a532a15d9140bb56878984877311a8c303b7c2cb9b62cb34c1f70cdde82c9d9e76c5037c46e6196903b1a372860110a721fbbc844963f287909e2e093c4b89358160bd6ca892b95a910565fb67b640a803a4eb7c08109cbd235b773f91cf54842352b4a7677bc310563e5fa320fdab95517c61952b5687379c6e229f4d296bec53cfaf346d0050ea6465040fa11d5f04e997932b9201a117b3d552bb853161de6f6ae5669ae9cfbb36c00ba54052e5a70071398b0f1858ee5e3a6740a7b93a453af91550e7cae362532d59490d70ccfc9997da3519638302be5c01cbdfcac7b32a984049426acc67f12283598588d68a46c1720445b6602e4b60df0864ad3760892403b575e61120863f03d0d67551103d02a8386b1abcbd2b6307b42a62103a6e970cc0a021e5fd54b659b6c0fb8641c6c74c12873f5348c3fda18ee264af681316af0c55cc2bc91d767344c7046c0455b36b673591942a622fd122fd6505ffb4a3fe61b0b0bf1bf0c539efdaba1aca1baa254a788f821502b06db752f702c15227c4a60fc09bb28c3d2165c95171c20ea6e8526cace1c239da3705844c860c35d6dea477aa1339813a9f2d755a21b143724621421abf6d5aae62c591be72a8e817603d942a35c9e7a391bab514e88c1b54d9830ef7c490644287594c834d898a50c2f6e18575454733d40ce0bf20033babb661c84d9040a12e4881e9947ba4023b0eaa86f9984f4158d825bcdbd888e7ae6084e3b2f49498fcea10f1db637c82287e6f8cd553caf40b7bb00236450243eb7349958286f380bc456b7208922a5d8887a075acc0c29b231c51cf9839e1fac91e3d0631b865bcef168e71a4a53921c5cd9aa758175c8b94a2be1af094c5a5c518ba3c7ad0a0cc105126217f04a49c674b7fc3e6a9bae73778c02320512d1ad3b7b2508590dd544b03d2c21d0549eb5a146d87c3897a5525df8735079970afc8b58f419bab8b3b513844cd08164a2882518ceb79abf6ae8cce5618afaa228db659a6ae16b82e351ed4646f2a3cbe1ac1dc0b6a0838532a0b2aead760ac43a7eaa290d991a172e4a1fe1e860bdc50b51e58d18272a942a9045358faf279a916663cdb431bf81cb30777cf105a032108769475f84c74b20668a991b53541a45061236c232cc85a56292ea7d470b00b4b128e45586e1531c02f364ceeb86e4b22fe6d4a049399c70ec588f847ca3ea21787531444355e26000209110be1b6994c3003332b95b6aa30f8a0d047cb6a2d9cfae2977e08962b656255637405057c233388e018753fec08442a6603878a6d4f8cbb2574b9dca1c32dc0964e82606739ddeb92402619649bc143950b753993e48da443b1bbc8c3a0e2edaa2710a541ea6ae48022ae1f48af844c2b32707733916c259ab588241ee58aca3538a0bd79fbf3589eda9ab08906d77778649f0a2b2a7898a651bae7013f8b863112c4ae2830a43ac421434236151b2aa7a5b3be77d4c85c89e3140f52804ca470aa2b929e8e8bf9b4278be1657ce321572d2196c4bb158ea891e627861dbc811525cb5f07a3377be081b4651eba3c311bb1c0357bf7a7923a524f003b02ebc030400b4b1e1711ef633b8921c101bcabce37655e8c651cc9458110e68566d0871659c3072c509538c5a6174063469a25c4134baa4f136e71464179b004fd361cb2b19d955376d137284039a6820211aa578189765f15a47e4b52d4af9447c4a8343f84edfe7ae76901d871b0a0d72414c4b01f35a38fe35a268848e663263439b4dfb9b3435537f54bb1e2b132528fa5942da8563554276d466e97a25cea6c7841729cac824dc3ccefa91c7d0a377f45b10b8f8cf78d00657f90e114363644869612bca78e402c8e2a6ee1910e07b72ad43b44edac06ec2cb3c448b506cb0a09746ccd84b3b993213b7a76dd681d6e7b7e9916276172d15538209b01ba5149bb0aaa55cbb04ac89674700544ec7079a8277a3dbc298034e08716849c0542dc42b7e32319b0b7efb43cb57f951b4912af0141965fa6e1701cc53d08c1887bb31fc93399823f1371712785ce6cb549b91099a2245dfd350c374943ee6826cd3c9bed72e7012028b938bd304ba0f5255ca664389335962f35bdf253e2b3933689070145462f245696e4b1d852bab0c817193679229ec684979c8f17965f4411fc1382309c28e98c095f663b587e967ef6320a84a474ed415e64381ff341daf491a9bd872a019a112a2ceea76661015b54181b8c325977b50993a5c26a7d992cf519d64f0a013f517664268d415a9c7f178c047a684495464332fd89071da200c2d70ba68c68425b815772b349cf4ace5dc1437bbb21e3283d2623cb58680fb1084e50685b99224f8c91d167590d4b03fd9a62d54695345217fb08658f1f6c25d0652cbc8cdd858ac9ad44616a8be03e06e14288c1ab27e4d3c15b156732d246ef8492efd508b41e6438c1c899b339874792f2bfaa1b8e55dc2740b02d23e8da9c0a1b91c61db66c92cb8bb3c64cc68bf4af341892441085a96f3aaa1a2217bf6c005a3938c2c61a15a701e090c84d93628e7cb6bb0e49c170079df1c0e364a4ad3622033b762593586549c79b764710b2107bd0c0acf106c7f7ba9accccc6ddb15d2b68a9fe7a2e8820ee9acbfdef8c139bc8b5ef47fd18626285409a59479d517714637b9d75aabae29cbf3418bd56154fae5195372299942271b0c90f0bb7f0c2537df6a433a2350127a24aa144d30b95faafb39f566651cc1bf205814027477c46b7ff1b66837c657af9cb0e7f46a42b4a74a69c36e716e2e993ad3c574aaec31a8fa5a950a8ce7823a7e032cb4930c95d8483aa102d1b20926a6a324b9062b29192431bcd61aa56488be8b9491ea373fdd276bf986ac01e6a9683785d3384acce6297da89657c005ac086687161bc21a18d6d325fef6059ff711a60782263a5dd87552f3b6691708a60459a81321caebba42faaa5593982ad4e0956aa42bb03867664470c8459a511026c2b8791a37278faa906b288dac6a1b7aa9588ae9062a31823076864800b08396aa90ab0a48a9798a146a8e77b104125ab1f1b5448cafbdc749ff085f06b02a2c25174f587f6c2583cb0384c521990b6c15cd926b40712bc503471d4b807f85b7baa361138312f1c62d62431297a451957375607bceb0009d09ba904a864be363bd220cab37d13a77daa42454b867307ed7c2a956d41a62b996e0e78c34b4ac0e7aaff8d8164b4a11f8aa4379fbbb34f14e9fe13a7f4ab0025586f130914c6183719a941b0338e1e11aa3f167a421bfa38c9142e02316d1ba4e64c60320c0a190cec011304f0bc58af38e492937bbd0ad3a5a904fb39ce365a13dc902166c864a972082fd9e2ea5548a3b6c7d885a3ca6ae2e12efc2ea3ee4ca0b0b171ee93a198b42191fc1297d126ae957ec70b3e5cc940f2649f5a8cee53a1feb5e68e08aeadddc273b38bddc18488024ec90e62a4110129a42a16d2a93c45439888e76008604c6 + +# Official test vector 73, seed: "53df46012cad4a745b7a3c06e18ca95e0b839fd8161e3025749a0887549eb0ed6a44eeea08bd6060d6509dbf7e9dc864" +seed: 3a19577908efd37697b8edc7fdaf47d1bd3ad01a1b77faf794bee5b9c3192a6fa3729672816f3eba84c9638a79676eeac0f22c8a48e0c5d50a26ff0844c66b99 +public_key: d0947b8b21912d062783fb94b458013f34480ba83178c87d9ca4575ac9014ab22a7cb92b1bf41ecf098f735b3401e31bc02a43c447220da64ce22b17408ac536135641100d1ea581a14818eaa4c77b229b31511e0a403229889fcba0a2d4d3c845868816b79f56d6265d678c9138b716213fcfd7acb2c68f4fac7914d140cd2a7487b34146708115689407a9bfd24216f563a6fd220893c1c5e2c657031b43a29b19471b084485b7f739af017459ae50423518460266cf449b524406b9a2b80a77093afb1344bc1521e0220c5a113cc0c4a4321a77204521e3c758927c83398aa1f4bc43ac61487e7158ab4053fce98a74b14632054d3d3aaf018cbaad771326b7160247cc10a114434087faf515c7a39b0705bc374b7af73c5b60741e037bc69b10949db1739ad74a240c2191b3201a020f43890cb16390d6c27c39d40af0043b57e8a0f978627fe1b36c6c83fc97b49ae9268618b2c96a7a3612002b2673bc1ac762a37e07fc6ef3749009876399862d67b5b48571caf8b326a4a80b4544c03ba811b3501518d5caa107be696cbdaae79caa0191f5678fbe14934609aeb501bdb0a525ada654d77cb3042159686381e3677edbab5f7dd87fe1c4566dd7382f03c2acbccb14182b9a65afc0aac41f4c3095675a316159b0b7271f0284e160190de000fe4076b6e3073d302a51c7a6f6486c52c97446b506dd7c76ebf08a5f8c70e6e8479735c2ae79a6d4a99444a347ba838c43a1ace485a005a7531916c45181157c955817c488ccab9aa4d55dd79a5e243504a74405a8a4ac01cb1b9f2917fdab3b2909ca609739859383d631b65965affb4490d5b9be84a2902cb34cc50b5c49cbce43f8351a68b3476387bf87a16b9784a0e801e1eb39ee33b8b9ca82bef596605b59f33035a05a012d8549f0b68c93b784c7a309dd71425d3175ba50107d28aa8dd42369bcc68a8aa074020b4b21c3d537ca25b82a50dc875ab76b35a982b0792fd84b60e7db48fa0b80cdb90e1a95038842404a78c17d6c73e42951ecf2160db816cb7323cfc0b8b0057e6e66a36a856eaa60735433bc1680636d137b8da85f19334bd0ec9617d8b484986af31bbaf7e81a050c5b4dd9356563bd2f874b6b82a6e8b088b2ca59ef3866fdd4217efbc5dd66c72b66137ae65e7dc5c541c42a5c4cc1c1f1b678b7941d37ab5bd7292c665ea89b9679c5a6f8248f9fc61c2af282ec048bea74cccefc2077f370d3979b83e2a65d64be85742bb9b66308fcafc84038e72950e968b33fd98da2750484f1138aacc0e5e8607e352804316b26111c5a242c09901339fcb7d304c749d9205f169d2663a03bbc82658a0ca3025ec4d0a1e445be8fe3a72c672333188abc3010b6a98ec0f01d698b87f195b2e398ca6f8038ef0739af347b22076a58391c46573b0f782444464d9ea0645b4cc6f7136927c34e51fba618b082f826b29fabb8bce80bb0f05524348104eb4732e0ab4f4040e104b78ab9317b558330d4995168752ee23455eba2cc4cb679687be93860ccd1848bac42616893e6e710645b354a657e4f064e2d3266f89bacb8585e6d927259723e7d321aadbcbf9638b1bcf917e3c203fd06145fec0be1059c4a52ad751986d0f0bbb46bcccd365ad6b614dfb87dd7f97ccd731f4f9b280cd321d7d7679743833823aa5a05b1b3d0263858cb2ec27677da6928b26d3459573e25b0ca4964d6798cf250860d055418761d7ff0189223a1d3eb6ddab21572b58f0f5ab03a1bc047d7928c060844160e169b2ce072a89fca5b384b81b89b24741674ff5223d4116ada77797234ad3cbb1f6a78cc33e27b03ebb0d5a18427f625a4311a9599ae8723bacf392b7c915aa731c943f49c24f189055143502cb35318432c8b89bd2b9243f35c4b443ad48126207559a2314a77bc67c4d79a3e010fa1686761509e6774bc2df86eec6c5e3cd547f9a5457fb4a984590e57ccbbef3b38e441235d90bb60a24a691425cd65bb43b5868d128e3428b446409804a25333a7ad1f5c6d712169f660798de5a448aa393b5c496db978934c6eb001112440784db13825167a33206f76b05eaaab0b89966150238748c492379b387ec863fda621ada4296fe16593358ca0ab83c15225dd26691da0b00554c2398a2c44f171bfe63d48db72ee6cf36f47dd054b8f7bec5a4bbb6b0d62bcd24a3b8a6d32c53a51bfb7c57ecf +private_key: e6d51f1ff8939a52842f092d10a9cd02fa1b7840147f3a5417da6994e7663b536d253b627094b87d951583c61b8ed8a15295276df7b080c71a6b2a4fb93b29512977f02c7f8dc36eeb2644f4db64a60ba2083b984a010e0029616295835118ce0382144701cfe9d5a02bea7fc8ba9ea074c15cba8f2a77062270b9818ab99d856e3c4c104a66441eca4d7fc74b148a37a5eb7103f021c955826048a1ab6a4c3619c1a2884fbf4495b1469e33671c845a40314ca87c4bc87e8c8bab04a1b9b237413242a83cc41517c11d50b7124a730d7b54a68282e2cbbaeba0896b2453568c22b3e779899a5e8850424fa2b68af95381cc5ade59b54d6a1bf2f1b16ee59375a314f811a716239085a77bc4e29506589a420a6c09c2206cc1aa97f2aad03657eb967c1ab8bb73a87a4853035d77285c29c788885bf1108fafb517e5bc1f13f89cd5ca97d70c12b5f64b88376466230439026d73a3aa9d11b03db22e541c28e32c22a2976b23508717379ded0989e2345cb5f0c7d9c97a81ba09514b0d27598554189f7e8b6e977a5d3588c979aac19ee60c4f64ce5ce73b437c0c1d11577d539af94158b946918085c689dcb227d72240a843b2bc4979f5cfdc2791eec3bd168593ba7b1eb06b829844b9861387af68b466498c84e8aa31fa39488cc676f728ed106aa9e368459028fff42aff418320498fc283b8ce860fd1c02ad1c0a7d0d92d61b6aad6d1b939ab0396983693353f23507335ac5fce277df06559dd3a6961cc43247cb0f9e7269c438ab4e14ebc0ac2907bb1289741b211cf40a15ded58b8d18c4948294b774c6edb047114991981fb612c5a196354bb80a2bf6efb713aeb72d5f434f9c46d14dc461507ae5bacc7c04789c1dcace8904cad02401ada53489a04fa2140d1864c76fb91777bb9900b010d7a6f2d09868504823d83c5e881aa7b5b408f144e01f2a83de212a7d3188c845539bc6b061c2f72b5c771f8b7377c678ce473ddb25b33518cfcb71a18455acdb02ce73433961a98d840c6bf844014c7c89cca5ea58a6291391ff6c0135e11911b6895557193dfb84a97e4b8f1ebae016947a70b8b08e5c578591f0874c6a2b7b900a490d240ad36bc745c113778ec3777c3220cb19fb49634cb200fb1f67e5decafd84100544c86ee79c000169cd908a884344ed2f40862558819458d5f87c4f3714fe0925538f002a7d454c2f438a3c751a1fbb13f77c85c612e16c0cb979249518b82b85586df793db403ca55709e1e6030356048b458a492ec56e0b08c661c5ba04b805cc631b12a741216448e22a22db406c04935f7c6cba44c213968a5fb6ca9066c88f70900411a43e8651641197fcef47470299c51473f158175e2e7857716ba80f501e156525ce0bd05cb3327673385095d144562dc4b006c89b0c6aaa2e21ccc79c0a7f3b0aae77142a447454b65694c6a5eaf3a7761b860189846a8612b89fa5ed5715c8eb3042890c52326af5edb7de3b578dccc61283474bb8966b187acebb9bce0a08031e66cec0bc57fa368af2574e7397a1177828d4326a66a8093415872537099d77eb83b9cbb516f40d235c0831b3ff663d3f3a9db6c0cb5106c905cb55db0721e45a7ebb676def137a585ccf493002055536c3ab49a17a68783290fc9366923654e310b17c2551816a9196497ee62ade56b24a2b421ce48a583d46f3192bc09493ed47502b75580be01cc94cb4893f32fd6266fdaf865f4f16571d18c8e1a301341113d5c6b59061cd3124683748f5c20426288c7bdf8ccd2d21acbec096101283534cd4974978b117beb70bcb5fc557d5b7482c626a390a10f500e65f8af72b3779068b24228c37907477017327026324fe3c607a86ef7fc453af88c2dba51114cc67f32bb46e58cb7995d4ac31f9b0c2048b05012189e73562fd2baac0cc4795e55b5058b9a747a5c34c63438f2767d32354f12a0ba546c76f38cb54ca632f321eb39ab0528942647415f91cd0738190ed20b1401aa0b1c4765674df3e47755a12426a2a307760dd9d39c2f7728dec213b2559cd2128181e74426595082dc0065a2aa132c72b798aedde6a7c2bc03cb0539ec61bbcca78e510600faab6828ac6a60f58b6bc894d16712b34892fddcbb695c36eb9c3169543c61969c22f95b6ea52bdb9b2ed0947b8b21912d062783fb94b458013f34480ba83178c87d9ca4575ac9014ab22a7cb92b1bf41ecf098f735b3401e31bc02a43c447220da64ce22b17408ac536135641100d1ea581a14818eaa4c77b229b31511e0a403229889fcba0a2d4d3c845868816b79f56d6265d678c9138b716213fcfd7acb2c68f4fac7914d140cd2a7487b34146708115689407a9bfd24216f563a6fd220893c1c5e2c657031b43a29b19471b084485b7f739af017459ae50423518460266cf449b524406b9a2b80a77093afb1344bc1521e0220c5a113cc0c4a4321a77204521e3c758927c83398aa1f4bc43ac61487e7158ab4053fce98a74b14632054d3d3aaf018cbaad771326b7160247cc10a114434087faf515c7a39b0705bc374b7af73c5b60741e037bc69b10949db1739ad74a240c2191b3201a020f43890cb16390d6c27c39d40af0043b57e8a0f978627fe1b36c6c83fc97b49ae9268618b2c96a7a3612002b2673bc1ac762a37e07fc6ef3749009876399862d67b5b48571caf8b326a4a80b4544c03ba811b3501518d5caa107be696cbdaae79caa0191f5678fbe14934609aeb501bdb0a525ada654d77cb3042159686381e3677edbab5f7dd87fe1c4566dd7382f03c2acbccb14182b9a65afc0aac41f4c3095675a316159b0b7271f0284e160190de000fe4076b6e3073d302a51c7a6f6486c52c97446b506dd7c76ebf08a5f8c70e6e8479735c2ae79a6d4a99444a347ba838c43a1ace485a005a7531916c45181157c955817c488ccab9aa4d55dd79a5e243504a74405a8a4ac01cb1b9f2917fdab3b2909ca609739859383d631b65965affb4490d5b9be84a2902cb34cc50b5c49cbce43f8351a68b3476387bf87a16b9784a0e801e1eb39ee33b8b9ca82bef596605b59f33035a05a012d8549f0b68c93b784c7a309dd71425d3175ba50107d28aa8dd42369bcc68a8aa074020b4b21c3d537ca25b82a50dc875ab76b35a982b0792fd84b60e7db48fa0b80cdb90e1a95038842404a78c17d6c73e42951ecf2160db816cb7323cfc0b8b0057e6e66a36a856eaa60735433bc1680636d137b8da85f19334bd0ec9617d8b484986af31bbaf7e81a050c5b4dd9356563bd2f874b6b82a6e8b088b2ca59ef3866fdd4217efbc5dd66c72b66137ae65e7dc5c541c42a5c4cc1c1f1b678b7941d37ab5bd7292c665ea89b9679c5a6f8248f9fc61c2af282ec048bea74cccefc2077f370d3979b83e2a65d64be85742bb9b66308fcafc84038e72950e968b33fd98da2750484f1138aacc0e5e8607e352804316b26111c5a242c09901339fcb7d304c749d9205f169d2663a03bbc82658a0ca3025ec4d0a1e445be8fe3a72c672333188abc3010b6a98ec0f01d698b87f195b2e398ca6f8038ef0739af347b22076a58391c46573b0f782444464d9ea0645b4cc6f7136927c34e51fba618b082f826b29fabb8bce80bb0f05524348104eb4732e0ab4f4040e104b78ab9317b558330d4995168752ee23455eba2cc4cb679687be93860ccd1848bac42616893e6e710645b354a657e4f064e2d3266f89bacb8585e6d927259723e7d321aadbcbf9638b1bcf917e3c203fd06145fec0be1059c4a52ad751986d0f0bbb46bcccd365ad6b614dfb87dd7f97ccd731f4f9b280cd321d7d7679743833823aa5a05b1b3d0263858cb2ec27677da6928b26d3459573e25b0ca4964d6798cf250860d055418761d7ff0189223a1d3eb6ddab21572b58f0f5ab03a1bc047d7928c060844160e169b2ce072a89fca5b384b81b89b24741674ff5223d4116ada77797234ad3cbb1f6a78cc33e27b03ebb0d5a18427f625a4311a9599ae8723bacf392b7c915aa731c943f49c24f189055143502cb35318432c8b89bd2b9243f35c4b443ad48126207559a2314a77bc67c4d79a3e010fa1686761509e6774bc2df86eec6c5e3cd547f9a5457fb4a984590e57ccbbef3b38e441235d90bb60a24a691425cd65bb43b5868d128e3428b446409804a25333a7ad1f5c6d712169f660798de5a448aa393b5c496db978934c6eb001112440784db13825167a33206f76b05eaaab0b89966150238748c492379b387ec863fda621ada4296fe16593358ca0ab83c15225dd26691da0b00554c2398a2c44f171bfe63d48db72ee6cf36f47dd054b8f7bec5a4bbb6b0d62bcd24a3b8a6d32c53a51bfb7c57ecf5fb124740e9315cedb69ebbc969314e2b7469c2d2e2bdf2698af4bd116f0d12da3729672816f3eba84c9638a79676eeac0f22c8a48e0c5d50a26ff0844c66b99 + +# Official test vector 74, seed: "deb963f8b1d8fbdf499d564ba8d2d47915bb402da02f17031b37b4039a842afb9b7e48f37200605992bd2429427a7a4e" +seed: ae0f65e29f38804a6759f70f4d01e2aaff7fe1c91ebc4f892dd0de3ab2e68ea5e03ff73e02a217659f53d8c47556bf3d8c94040f630d63605e2d0f923579370c +public_key: e3658e3c8607f9775ea3b57a481ca307a36b36780efd410873f9067ef06a6f75b2f695620c9753f97b167df14f4b59a66ee953aea71abe866ff3e34cae61b53f5842a9ac3c811abc36798059db5a51bb1a003b5687dc73e279236e69477cd03c5143b6e22bbde999379ad131215c9c46e37376402d434a58f4ca4c5249c537b15937c38282d2759a45243ce36d24eb234c5bb875b2594ac89e51564e43d2869edc93cb2143d3f72c6d8672df16a08cf94031612199c224e25bb223fb646ac5997b806adc1bcbd49a7833409515c05238aa2c3445a290eb4e4cda6fe1e61fefd58084db9ed675b608ea1bf660195c226a6b70cef5a114ec584903aa427a34c4f75b7d0dbb4564c72c2b252ea9b99173659ab3639d3476332c74aebe0b6656e3cc3f99206406718e5718e76bbc2dfb8b409780263851db783979fc5ea3e4a18d6383762c6d5f782e7333876c10414dfb4548296d33947590534a01c399a3731ddd4c882012bd0b1448e066c528f28c52d3c34f1ca1e2da234f571ae9921084179a9673091555b9d671aeb33a3c41c22adfaa8ca800b92e9401fe31b35c311d7820284fc534c928bfd575881e5678fe81803ed08041475b0f4a36c7644441a067cb35a633a2afe385ce1a1b5c4f9c4a1580003d1aacc548a4d5e7c94c6a4799cb843fd4c6e6209e1eb1a71be32b501b004ad9c0d7a6b44c2970140a021416483dd835e7987b779041aac46806a1a538152e3b716beab69a86e5291b431b1eb68105380df09758871335be0735b4a22de2c4593da03679622c2af78f4d888fb178098486602b743d72f25a57b3533623b57cb905ab499835093b1c4b9d40d361fec791cf82a17417981ec713514ba50b46608c1307b7939ad5f9b1ae47ac2f0c76162161cf0677aeca801504512433918aab949c078d46399d873b0a6e9987e9aa71e52c5691232b8bc68c55508c9bec555d17a6293525d297be94559671c0209561c6bf7859c3469772c25e0863c16c9c4aa453862e52ab3ca942d887c959850cf4fb2afa3420fe55660c22516bf8c940ebcb1ddab9a36a341cc144a646321037c07231424e040ad92c706d254e56f48012601e0de8402221711102be85f54d3bc513481c1e2ae6c50a022d056967c6b032c99ba89070847bd5aceb4669619c71f2b7581736726dc800a3148bd2871d8bf60708da4cd13b8822209bc09cc2a88a43defabe6a24986d697fef253aa91525b3a3cc9f102c9ea158c699745b03af77d41d4df72be7fcb6b7130f308bbeef6ac699388976a574ee1a74e84b48649bb32ec763227584ee24c0248b7f5096c72ca172d2b81982f676dfe44a896618c77393475521eb6a6fb8ec6e153c72d7f8c9067a765cc4149fc58777974f96411739168deb8a6b0e905997563d7f13590ab30173bb23f7b7440fcb6db8f910b12958e0b62fb6f84fa5aa931b118ab4f1ad6374a34721c053224b04cb07982988fa3a569ae9342953165b012f31728960f89d589613d07a2b16c71e0ec942a812a72cf90ec9b23118a59c6bf7c273c6163a8470b18c8c2ee76f4d2975e7d79df7e80e759a52e6b689ebb7bbc7abbf6609560081aac3aba2b43aba545951427cc35dac5cbafc7d394bbd57a2854e84b5f0f3059a94b35f3b0f1ad3344cc2a40fb89a87e091c9c0125c0052e8b28cfff0c3e0390967e1364a4ba8c0b77a7fe83a65b76255422ba7a128fd4b3c8ef85fcfc16f80ba5701c9a48ca230e455b02b28641b98a67a851f31621733c0a779170ebd690111f395e7461127481fd8e1057d35b6c20b1f68322e72e92a2363825566445544995dfc08ccc492f6e19072e398bafc32eff92c7e229f87d1327bb1884cd04849569c415860df59646ec59ed052bade3a0ea6bbb8e9d924e6c43aea22cd4969528d50af83b977d4f8681fa52ae6f5a60ec1cedbac91b14b70d46c5ea18551f288690c3aad6428939426326c54a80b1c6281d51b3d47462f18c6c5931c60395a1e74826f6c258f5622f689c4b5470976a961934104b41100142854bbf75d40d09bfd9a0e64575a7546bec19108770c19a7cb48208780e1c657863163022c910f071c59f239a23cc9f1697cf5177f88e7580df8c925b2c405a3360d0a80a6ea1486136faa9c48aa3801ee87b7cc5c638d67be57548c03711f9b2b31ab319d45c578e5acfa30dc426ac3b194230a4bb5ee07f4 +private_key: 401208d8b00dd0515a1f7c23013c9a8d48062f281437a312e94c7a76055580b894cf66a7795c182d889a1a940ea044112a265dee346d902758ef7b3500a02f8c009e3c803a9fe2a39e95539702250fe05da8a85fdc2ccf54bc17b540947e280276a084de678fecb73a5d1bc985718c09ab5bd87675736bcc8eb858cbc246fdc07f0a7b3dbd1656f04c7bfa3854b502a71db111fe2c36a25910d37a5c357ba0667417550071fd0b0c4ffc094b37b67d262734eaa64794c5e0d66d0ed96a5d7c7f3865ca8579b89c2b7349b3134e43a677680414eb2d88587c73192a11e5088d673e65eb1e88fbcefd8aa72b704521749a384588a6009b3e41cd839313ed00b5b4a14236835055a875ada5674a1959e2746e3a38a1cbc7bc0cf6a2c9ab95c135287bab8b7d12bd8dbc79d2e6b36f0542ec73bd66f6949ef00975f74ec8f31c0cca8544c25a431c8e43a9c0c99545a18ca7c5f28d4e0173c4505c5c4ba94e1b87a3b4b0eec5759bdbb221530ffdc9048517102e70745eb09079f376914b643ecb3fddf0b68d384e2fb727bac38148d897554cc8eee5a986ec0c2081a2d583b73db69bff054133e18e0e7b52e9e9c5c0e088a99895baa375f5b27255f1b64b38b96b91b08afb5b36371802559f240ac4bc4234d8da75b6839ecc822721a466e0f7a292723286f38646e396e7aa3dc9239c3d621fe70a2eb14c37139b878285435c682b9b5489903bba677a963509c5ba412f8165bba029084344445e21bfb1432f97b27b3377252df129208c71c41a10955c79c6b6507b1067dddb8e1331897854897b6ba01f79ba6f6273cbe540620c27d731a86719903fdb5534bbbd9a9275870103d9bba74b694595188460b80490e0269dc678fbf0cab0918c59958ec297bff5e6572b3133660936689a393ac36f638883d5a95e1d78c6460c692040a9a28895fec808ceac9590aa8552382b31a489ef167429e63c7387b794552cda972d4dd3aa41835bf29315bb095b95d4539b66008887ae15e66fe561534fbc973f4621c4f41ab9498d0ea667637c5e563accb2b0429d580cee038326a8413271203b93607acc70666c50e34c6186d03600043ccb4c7e18a1182ad39eb49c0bcd746832b1ad47bb9248402091872ba2b68d25c0b04064558f9453de628c4c983c1eb202fa724a9f373c003da76c37743a452d8f765d82c292468c28c16c9b26a2727df96b26673b191b3162970a557caa63827b5a2b631abaa861763663d08b72b712ac53990a35b57f99b5b7d4ca3035a590db287e1513193177f687157ee74ae10b73e6f24e8838c3df29c6d8b78ac6b70aa1ea1b6467b6d4319dbe98771ca752c9986006a687d0812e9e46374563a15ab32c7b70b58a21c976816192d36f04634fa0b46fcf202b44e684008c624f0209ddd64497184524032982dc654fe22751846a2402c17503799e9a7d686326873a4593479b615c13f91cbc3abc952bc4792ce04f7a272921d13e34b10a203c2c06d65dda903287887c29cccffbd4059c5b1fc2c3b7786c0ea2e49ad792136635982103473657ca2e4b32881b6ebe8c4e7c63594d34b341f515689b7c671b4f40fbc7d8e1ca6cd4016a9200cbb58741fb21ec84030f6cbaa282b9fc4365196094dd39bc6447739999041ee1055b373689589da7a6a23a007145ab208bf56ea51c3d68e2c3b4cc4f0da518f9089d4efb28c7f746f0b948a2955e26db2b5ecb7c6db2694db5ada7a7aa939109b1d0604c5a2b654a4674b636cb9a5f65712f404b4edee505093b1fd76b627b32c4c42910b1390ff03c30a5e79be6241dfa39a2d9456c331c4404e7a159b8a89e10588e3446c7151d7bf31a6b930f09312b5d798dd71c45b2273f513c8279034483ca7010a9b3d597cfc7f699e649a99238b1283a935b199f57f6333c2a08c553a9bb8c38109319486a4a44d71a5317ad4ecaa9b4548b86a9560969690e8b02a38bbb628391eafa6d2eeb4a783c661f14b9754a8c2faab853dbc10793a61ce2b1eb72c7e5b15789fb1885e7bccc89c03350a047b811c54738fa91219744ce5166a4882412c6898fe9037b817099779968eabc1261831a6c0a5f308431d8904cb9d4a1bc8b79f0ea01395088a5377935c26906093a34e0bd61199a9b8a06511b2127340c9c0169961a08e3658e3c8607f9775ea3b57a481ca307a36b36780efd410873f9067ef06a6f75b2f695620c9753f97b167df14f4b59a66ee953aea71abe866ff3e34cae61b53f5842a9ac3c811abc36798059db5a51bb1a003b5687dc73e279236e69477cd03c5143b6e22bbde999379ad131215c9c46e37376402d434a58f4ca4c5249c537b15937c38282d2759a45243ce36d24eb234c5bb875b2594ac89e51564e43d2869edc93cb2143d3f72c6d8672df16a08cf94031612199c224e25bb223fb646ac5997b806adc1bcbd49a7833409515c05238aa2c3445a290eb4e4cda6fe1e61fefd58084db9ed675b608ea1bf660195c226a6b70cef5a114ec584903aa427a34c4f75b7d0dbb4564c72c2b252ea9b99173659ab3639d3476332c74aebe0b6656e3cc3f99206406718e5718e76bbc2dfb8b409780263851db783979fc5ea3e4a18d6383762c6d5f782e7333876c10414dfb4548296d33947590534a01c399a3731ddd4c882012bd0b1448e066c528f28c52d3c34f1ca1e2da234f571ae9921084179a9673091555b9d671aeb33a3c41c22adfaa8ca800b92e9401fe31b35c311d7820284fc534c928bfd575881e5678fe81803ed08041475b0f4a36c7644441a067cb35a633a2afe385ce1a1b5c4f9c4a1580003d1aacc548a4d5e7c94c6a4799cb843fd4c6e6209e1eb1a71be32b501b004ad9c0d7a6b44c2970140a021416483dd835e7987b779041aac46806a1a538152e3b716beab69a86e5291b431b1eb68105380df09758871335be0735b4a22de2c4593da03679622c2af78f4d888fb178098486602b743d72f25a57b3533623b57cb905ab499835093b1c4b9d40d361fec791cf82a17417981ec713514ba50b46608c1307b7939ad5f9b1ae47ac2f0c76162161cf0677aeca801504512433918aab949c078d46399d873b0a6e9987e9aa71e52c5691232b8bc68c55508c9bec555d17a6293525d297be94559671c0209561c6bf7859c3469772c25e0863c16c9c4aa453862e52ab3ca942d887c959850cf4fb2afa3420fe55660c22516bf8c940ebcb1ddab9a36a341cc144a646321037c07231424e040ad92c706d254e56f48012601e0de8402221711102be85f54d3bc513481c1e2ae6c50a022d056967c6b032c99ba89070847bd5aceb4669619c71f2b7581736726dc800a3148bd2871d8bf60708da4cd13b8822209bc09cc2a88a43defabe6a24986d697fef253aa91525b3a3cc9f102c9ea158c699745b03af77d41d4df72be7fcb6b7130f308bbeef6ac699388976a574ee1a74e84b48649bb32ec763227584ee24c0248b7f5096c72ca172d2b81982f676dfe44a896618c77393475521eb6a6fb8ec6e153c72d7f8c9067a765cc4149fc58777974f96411739168deb8a6b0e905997563d7f13590ab30173bb23f7b7440fcb6db8f910b12958e0b62fb6f84fa5aa931b118ab4f1ad6374a34721c053224b04cb07982988fa3a569ae9342953165b012f31728960f89d589613d07a2b16c71e0ec942a812a72cf90ec9b23118a59c6bf7c273c6163a8470b18c8c2ee76f4d2975e7d79df7e80e759a52e6b689ebb7bbc7abbf6609560081aac3aba2b43aba545951427cc35dac5cbafc7d394bbd57a2854e84b5f0f3059a94b35f3b0f1ad3344cc2a40fb89a87e091c9c0125c0052e8b28cfff0c3e0390967e1364a4ba8c0b77a7fe83a65b76255422ba7a128fd4b3c8ef85fcfc16f80ba5701c9a48ca230e455b02b28641b98a67a851f31621733c0a779170ebd690111f395e7461127481fd8e1057d35b6c20b1f68322e72e92a2363825566445544995dfc08ccc492f6e19072e398bafc32eff92c7e229f87d1327bb1884cd04849569c415860df59646ec59ed052bade3a0ea6bbb8e9d924e6c43aea22cd4969528d50af83b977d4f8681fa52ae6f5a60ec1cedbac91b14b70d46c5ea18551f288690c3aad6428939426326c54a80b1c6281d51b3d47462f18c6c5931c60395a1e74826f6c258f5622f689c4b5470976a961934104b41100142854bbf75d40d09bfd9a0e64575a7546bec19108770c19a7cb48208780e1c657863163022c910f071c59f239a23cc9f1697cf5177f88e7580df8c925b2c405a3360d0a80a6ea1486136faa9c48aa3801ee87b7cc5c638d67be57548c03711f9b2b31ab319d45c578e5acfa30dc426ac3b194230a4bb5ee07f4c5b86efedfe663032fd6ec053e7ae81ee85ae4b3f808156cd357c2b36db2f7fae03ff73e02a217659f53d8c47556bf3d8c94040f630d63605e2d0f923579370c + +# Official test vector 75, seed: "8e2995f1b3e43853b18916bb1212aceb05898e2b177a87abeb928ad7184e59695c56b2cccf5db80853c28a525e327d13" +seed: 6084a235f79dd093ef6d185b54e69df33dacee73a9bf2f379004421a10e3a79d9f684fb055ece19459eb464e91e126a7a6e3ed11ccee0046da234d964c985110 +public_key: bd8557528725705c2bd05331fbc20f5560259fa82d438392c7299463710357160f985555dbb2ae4438310e3879982b55f03018c17101c2556ec377b15fe6507488052cd2360b52b8cbc7856c8894cea237e76214da481ef0363c877294399cca9e38c249392d61a2772fa4bffd98165d24760bb90ce22614e892a9c7f350706427ba2257ea7a1304029a6ea715bda9b2fd682c6aec65f70018c26c3a41a30f53976ad8b83aff7268f6d9b3124a15b94528024a179dd24b8c56cc8605914ca89815f943c1c568f255b757220ac606d06a1701457b057ca323ddb65ef076cda0044cac79455798b501463d38d24cb9c65faae94410f79995d917c49319e898aad54c620291491f96362d4792bc3639b6551e5a8b7030e9870896ccf461b65fd82ed0f69dad10bb60805c553a1a195336435303c1c8834c3a25c2832bf7b62e1b50c603951c12ab6b74eb72f4b15abb5455d9f681a0d5a290c0bf0ae79b03973e3ca80d9ed283272592fd0a64938c26803441dda5907be52aab1b9ae14b62f9db044cc0c2f5f48f0b8348a6b26631433dfb00b180b721910b8fb533cfe4a8be1d250d75a9cd492ca059fa115132ae5463577de070c87944bc48695f3b4b04014e9dc29185446e4683ae2cf5b9b3ac399fb6c6541925075b7bca7b7326861dc105b3b57ab55a8117ef69b33cf79665663d3355819dbbb235f9693d7c0062e5293c0a32d7342c18648500f8cb3ae925c530b6507418da33a819e57897849bf3f36f6bd68287f7cf8b5281e9e5af40bb5f76c63d4a14cfbdb8235c6a95415c4aa157568c34ca9f58b3991a756bf5ab9b658d9464ae207206d9d2049d9145b7cc59261860267806a23aa513f3c39cd7aee8e71ae4b3a4a6ccc570f179148c2aa50bcdd612bd81f8206fd1334389b9a726208db920944530ca839f316161b89a59350b2220a4b6c67caaa2425d78da2a3b454e396386c5500f7726aa38530b881640a6870d2e5100ec0c25d5a39bca206ea5652b55a8a31cebc84fa62f2ab6a57a2658240a0f14841e48340cf158bfc639149921632047ace0cc2aee5a3e0f647fc0c671f648c689002d98910f78b34e80c523f9073e4e4c9e6e102818e996d3a30886e7bcf18b69d2a16fba1181610b6bd248035cb90d8d440f6d4729031b21a4e1237d710bddc5040047745b231a22246e517a76d76a0ee7985ebc794fc5a51c17d9a9e9acc471f89cbe260df5c4676d870b8713bca53a400cb9b4fa6c36df97a023ac03b08c621e7329635c2e9828719203852970c2fd557348f5365cc917fd3ccf71d38d5d96336026c7d33b885526632860044237b4a6b09ad392414b068144ac67972b3ce7a25753f631eb1a03b4fa2e9f553302a22eb9c721e9f2bf74a06673fcce5bdb77eb4b525d63906ab2c4e8518322d3065121a20546a8a4eb45f85881ce25721b0058c2334ffcf2946c7b9d6ac05806fa778b2041bad1c1250883873a95e3d5b76a3480d8da8b48683c5db2757eab9193750649e74440dc58a56b3ccc27b2a8177bc638b61e0136a215c8079666c77857018784f38bcdda0c56639c03196b54cbc80b49b0aba6f6a9df352cd09c5cc6e05f62e835f7a125845bba2fcaae4bf61bc55ac98bd67763ec0214cc1b7cf91632960c9ec01e0f27a97f909d7fc2486d0cabfa146b72baa14371041a5336c71305e6e68a43577bc1665c0d66c76a239095e13921c00c4ad11cdb69050f7857c3a1b70e2a2152ebcd0961a936f6146d6a58305086e934061ae32bad1b894cc27949f280320401188775aa5078b1497315639288aa2f1f826b48465613a73c5301383b69181cf14ab3a05035a79de39973ec5c1fc5869af11320350c3c4208cc68db8943a017215b72b3353b77003fb0d513bf677b81f66085e8205c17cdd6b603ac98310c9a967a7b99b8d3af10b66821612333e50d72faaabcf93612210572e6710e482702b17bed5abb5e4a57baf365c39b59dc7cbad13601de6b40f5370a49e5b48c9580a0c26195013e6b6889b99b7ee5d93fc8b795cc62a37ccc5e3de2692ad66e903c74bcc45ed6f16a68ab17d8e5094680c428a242d2fa247985a0b7d7a300f70e844765dc30437d032f216a8d99dcc54da34c0a4c25a8a120b3c32f45a3777467b1e639bcff1bb9839b6b45c7895bcf62307460df309eb4e61aa9cc8941418677001064ac161a607e24e1 +private_key: 76a86ace9756dfb462fcc13e1c01409b79a49c256d8a75a9a30712f5e913e38240f3520c11344f4329c3372ace01c1979b75c641dc5f0fa2c2ff1a8055dc61dde093315910e032ced42248ead082e9b355a0bc17cf349b2659555d5844d94310633b9098f3ad6353a4fe71809ee99d05c5a055a68e83a35b614361d4ab7e4bf30a80cca2edcb692c25bb35c702854c55939b88e020a329cc35f6f702c94740a614390d6c89b2fa2c324681ce4b600d87b0adc91aee506b50f40640259927b120df4a3a2a2c1411e1a198102b8eb03fc1569b83daa50a7687e1f8b7e2e16b5d13ba38905ceb285a57513532aba8a235c4f9566d1bdbc64be56e4b088e76854868377665cc922cb0a401c14142308e8851acf4ec8484177eaca16ab5164a37f8bd12f4b514eba7ff555ed43415eea7a4b7b4ccb0a08d507992ade401af6a60426972d5f8a19d72cc2409584c4473f4d8088e34b376504344c242c6c7163ce6ca351b3b40a2ae3b7c45a96ac3c30136c880bfcd4166014736e0d575d72c9c2b1278db43126c952b393c47b45152b2c7c59253b9b8d97e19818a9b007fae17765cb60c6722014c6562aa4723c5a33ef63821dd9464ca298b72c68e80213613953e89e2b0d3a4b18347030015cdc1a6716d8a534b5031a5367c70184d7daa93533b46ef97a573fba6b7c39c9971b1538cc1b708b921196e97c7a3658ca9efd1670b1b7934502896e02e18fb0f01b7a8b9b81322951ca25714da90baca924c56132bc8a09b52192de63726d30186146b8b2c233f08acb46092b5ca654c14c92b69e1ca946812fd3b0fe56ac13739bd2fe99c3c62c46ad3b39b4214a3d8220e67a718a16901ca82d59c08bcc7cf2b6a3abdf995ec7a38c06801b0a2ceb88937a3164424161403fb639fb2ad6947a7153ca7ba8290f099a7d6d8322448127adba4e26c5972ac4ebc95905e7148023bb74cc13684267123f57243368f0c141ce0b05f29a61866f99a15a2a85437cf651ca4ed718e5787a0872c536f86198f0125087bc898bbbb479c1dbfc23231db78d47b61edb37f3b03981ab15cb70181fc3b9a1366c9f98acfbb3b6e1cab49b4110eee3cc87dd2ac8d8720f48633d0910c2eab7ea1fb197d3431c7b1becc201a21c02b2e4b5c9e85c5a9560b2105b99c7b7b121842a79179057b6642976ef5e650aec633b0b2b3dd14ca2c0206746595113c7a241443a9a0521421b21bc7238ca77691c76be86365cd20be3d1c8af7c559333b5f94a344c2891467a742be4a457064ae4fe0355f2910a2252269c60a2dd723d5c242a055ce73b2c29df12a629ca382e6789cc95f0aa44bb1e1710690056d507392c9c004fb9079d27a6695b762d80b6533a8114b6691845d7e92ccf189bdc4c32f06e986b2d82706f47819f807032ba5dce871f355433cf05ae849037fb6455c0caba5951d4dd77575832c4425cdfcc70536f741b1a4a1ec47b600d430df473f2ada9313f2aa9b972e7e68c2a2c84d7c9b17bdbc9aaa4468598412c9dc325e3b9d8c545b80e13767373ed61c9ad5c531f6c391f293ab7195237e3a2d77f2685c50b2a9e09afc18c18678b97143bbd52823218a60a87b71f321429a5b7ce32a48d5b3a4578a9eaa45aa66e6444d534f4ed46acedc33325333bb986027d0cb05d93e659a6dd5a09f3f820db8b1751ab32c46473b4284499b5165196871eac3730c062be3482ae8d969a8ab5cf3d1234859bea98476942439e2180ada967e4cb303f8d884fed11a4998af1b2b1113a9878a9290f1e846d3ec68a21c8c4026ca25844ed1464074b84b3b51351dd5a7de685ba338387eb6277e8018091cb7aff0449540b896fa3a63c2bc9034a3d99990b0c34d91d464063c4d7ec08dce0a493096149955b5e06773d790c618a881e91ba94d276e034497b433a65d393b3b764201583a3b57c9cfca20e2526e4670725bc346b1330880d4a4ae348813956439721a3d1a5b7871622378cf73554e0d33905e8656968510e4b2274e69235fc63e0ef78745f99236c27d33e676a626c7a679588ac7998e2332b8e0a39ca33d5d099b087cc966a10c40f52a8ce89b905586a95c1c6c2521136516db69ac7e439e000a97031b7378b99d2112ad69a5ce78c46cc2c6a9efcc85fc3932a956ad313536f3a5b9810ac8bd8557528725705c2bd05331fbc20f5560259fa82d438392c7299463710357160f985555dbb2ae4438310e3879982b55f03018c17101c2556ec377b15fe6507488052cd2360b52b8cbc7856c8894cea237e76214da481ef0363c877294399cca9e38c249392d61a2772fa4bffd98165d24760bb90ce22614e892a9c7f350706427ba2257ea7a1304029a6ea715bda9b2fd682c6aec65f70018c26c3a41a30f53976ad8b83aff7268f6d9b3124a15b94528024a179dd24b8c56cc8605914ca89815f943c1c568f255b757220ac606d06a1701457b057ca323ddb65ef076cda0044cac79455798b501463d38d24cb9c65faae94410f79995d917c49319e898aad54c620291491f96362d4792bc3639b6551e5a8b7030e9870896ccf461b65fd82ed0f69dad10bb60805c553a1a195336435303c1c8834c3a25c2832bf7b62e1b50c603951c12ab6b74eb72f4b15abb5455d9f681a0d5a290c0bf0ae79b03973e3ca80d9ed283272592fd0a64938c26803441dda5907be52aab1b9ae14b62f9db044cc0c2f5f48f0b8348a6b26631433dfb00b180b721910b8fb533cfe4a8be1d250d75a9cd492ca059fa115132ae5463577de070c87944bc48695f3b4b04014e9dc29185446e4683ae2cf5b9b3ac399fb6c6541925075b7bca7b7326861dc105b3b57ab55a8117ef69b33cf79665663d3355819dbbb235f9693d7c0062e5293c0a32d7342c18648500f8cb3ae925c530b6507418da33a819e57897849bf3f36f6bd68287f7cf8b5281e9e5af40bb5f76c63d4a14cfbdb8235c6a95415c4aa157568c34ca9f58b3991a756bf5ab9b658d9464ae207206d9d2049d9145b7cc59261860267806a23aa513f3c39cd7aee8e71ae4b3a4a6ccc570f179148c2aa50bcdd612bd81f8206fd1334389b9a726208db920944530ca839f316161b89a59350b2220a4b6c67caaa2425d78da2a3b454e396386c5500f7726aa38530b881640a6870d2e5100ec0c25d5a39bca206ea5652b55a8a31cebc84fa62f2ab6a57a2658240a0f14841e48340cf158bfc639149921632047ace0cc2aee5a3e0f647fc0c671f648c689002d98910f78b34e80c523f9073e4e4c9e6e102818e996d3a30886e7bcf18b69d2a16fba1181610b6bd248035cb90d8d440f6d4729031b21a4e1237d710bddc5040047745b231a22246e517a76d76a0ee7985ebc794fc5a51c17d9a9e9acc471f89cbe260df5c4676d870b8713bca53a400cb9b4fa6c36df97a023ac03b08c621e7329635c2e9828719203852970c2fd557348f5365cc917fd3ccf71d38d5d96336026c7d33b885526632860044237b4a6b09ad392414b068144ac67972b3ce7a25753f631eb1a03b4fa2e9f553302a22eb9c721e9f2bf74a06673fcce5bdb77eb4b525d63906ab2c4e8518322d3065121a20546a8a4eb45f85881ce25721b0058c2334ffcf2946c7b9d6ac05806fa778b2041bad1c1250883873a95e3d5b76a3480d8da8b48683c5db2757eab9193750649e74440dc58a56b3ccc27b2a8177bc638b61e0136a215c8079666c77857018784f38bcdda0c56639c03196b54cbc80b49b0aba6f6a9df352cd09c5cc6e05f62e835f7a125845bba2fcaae4bf61bc55ac98bd67763ec0214cc1b7cf91632960c9ec01e0f27a97f909d7fc2486d0cabfa146b72baa14371041a5336c71305e6e68a43577bc1665c0d66c76a239095e13921c00c4ad11cdb69050f7857c3a1b70e2a2152ebcd0961a936f6146d6a58305086e934061ae32bad1b894cc27949f280320401188775aa5078b1497315639288aa2f1f826b48465613a73c5301383b69181cf14ab3a05035a79de39973ec5c1fc5869af11320350c3c4208cc68db8943a017215b72b3353b77003fb0d513bf677b81f66085e8205c17cdd6b603ac98310c9a967a7b99b8d3af10b66821612333e50d72faaabcf93612210572e6710e482702b17bed5abb5e4a57baf365c39b59dc7cbad13601de6b40f5370a49e5b48c9580a0c26195013e6b6889b99b7ee5d93fc8b795cc62a37ccc5e3de2692ad66e903c74bcc45ed6f16a68ab17d8e5094680c428a242d2fa247985a0b7d7a300f70e844765dc30437d032f216a8d99dcc54da34c0a4c25a8a120b3c32f45a3777467b1e639bcff1bb9839b6b45c7895bcf62307460df309eb4e61aa9cc8941418677001064ac161a607e24e15109d06641e916a660b3e7f849f08b9dcc32c47e4a7df2d5d4a374d3e5718a459f684fb055ece19459eb464e91e126a7a6e3ed11ccee0046da234d964c985110 + +# Official test vector 76, seed: "9218943c51fd2de47e509aac67eff176795102f37d7a2017e3afd768fcda7877af38739b00fcdf227c2fd62eb635942c" +seed: acd1c0217fad5caa4235544dd9de153ab1880ccf4c76f16f236fae4e4bfda04cf03a8abb0a5010f400ae5722a75bdf5a2f6d5b546b34d73857cb1bfc7e587aa7 +public_key: f7a1521ddb8ce3e91a2835a177988a4e856467f6ced236ada9bcce8ed885b19b862b952cc8a2269f35826a290a90c170b7f9195f816dd631b1ce66442469c42a420fad3970edec539f11826a4a917ab105123b4c14087f7b2455202a5455159e828cacd84767e5b9c024f4ae6d37596ca7570fabbe591082de627fe04a97f45409fe265054bbb57426b6cfe71825837b4be360ff7b48af3a7226525b77c450cdc4a483a17d77e723c8b1282bb40fb621731fb504277ab50f171bec369818bc3ec22126f6a47ca2937f907890c7815a1e115143f62f58550a0459ce7e04695bc7737787a972321578222f5622449010287ab844e624699a1ab50bd872cb29bfd534b401e538c51c12dd8c467a14c24f5c9856234da17ac5fa28870dfb70565ac954c440db457214016e301736520b5e15538e92d1cb205776f849cc0b23211e6a67ad5c9fceda1577e625bd271587f939fb3acee14135613592a7364534c77c2a1564151c12e1c6a219b878180001e2c94053ebb1282c5288a707ed7b245f15054d87b901c939373244f776ca51b3b9d00628c9a8165993974bac2c0b26715ab1a1b9706e8264a0d210a0e627ae60b59ba58a4abbb61e93f0cf31230a624591e0d1a368390205d6526889640651b7cb71c26807b11913056629914fbb1bc2545b55b2610f992e73812e82b73d10a541a7c8621a4690b2c00149b5b952e91d992c52e8426448e5936dd41ed7725ff1c5bb54803690e7b642805b168829ee5696b5d51a13560a36409a1ea41f03ccbf6bb86a1b205bec128ef81c2af9701752fa54cb3784081b5dec67bceea87a8864bae5bca2aeeab4eca30d460b4015870c0187b2519783fa030a3774277e018274775ea2ba027b8624c1dc569416a3117b57dc5b34a1056e4c9b1ea54b6e5f55bf1cd3c027cac8f5f9b9e4c921d98692a007ac22c6b044f6ac9ae5acc4aa3062a348eb2cad9e77189131bf56aba2d86612e01accc76b3222b01d30b079ff5250e0869545641213c175bca181eb738fc7e80e989b43a0c4c7ba0b41404abe955c3c01859dc17b35f48cc39e9c6ff84625923c1229e9b7c3c2ccfa760c8808b43225ce4fc96bf0c0affa26aa43341f7f14aa37ba5d48798c1661319b31325d04afa0759c35153ec77b07d5d88050f5a1f55262860c94990460341c6eaa32055a480547bb0829d5c3398208018b4c098ac686f1b18870864e2cb0777a798c221a659a0e7e9c5c2936afc4897a611c55086330ee1689f7817f44a6c127a53597576f37b35b4f74c535444abf5342dcf256d04800b04361adc83a207952fb81caa20cc8dd07a6fe8864e562844882b405b5b4b65c948b237b385974a9d4963068c3e5b18c51d42a7a9211d4f274ee5208e530907db49db956b8e10977e2357223523a58b511fbf7993bba3c38a95bc0b98062312a1c9449ddc4082601780ea65a6bfb1467a01d9e326cd10a8e202320d2a29e9b36ad09c44127820d6d024b3ce0c818234f55d7855b0b000462b198a669bf924bc81c99ae0b32a1c21f448ac6084c71a59a90fb43aaa73266e69a077d16a8d1443de4c2b61c3ccc731437ff744b7a7cc3a02a948da951d5763f078a991cb64ca7b049fa1b1eecb534509aafe04437e5f84e974261957ba746705eaf4528b4ba3764816f45045d40e807c14c3577a25f75f69ccaa136ce627742e33db588bdb5cc339ef916d7a9b108180a637586da55085eda466e3c7734f85e6a903ef0fc91ce793910231a8f46a7e084c595177a501b390eaa818c0a9fd37c9be78160c7a398f0e80d8e58966140639656890cd08f7fe92fe316cb1e1517ae7741445a47c8ec3ff8f54f476146f1095f9973062bc17f6723542b0a48e12b7e4dbab100f3bf6dbc219816a76a3109ebba8c823cbbd9176061d072d57726cf12908747bbc267c59fa71f6c719cc7827b91919ca3793d03a73604e1c2c98ca2e99877b6c2b93c97965c06b2dfd71cbbcbc7c81cb56b36587a174e899306acf88fd2689e345a78657c5c0b65b0f3f8206e405dae4738a7061d54db38bdb2ab87e8cb6dc93f2ba0c11b65712840b740ac90ac3404b69cba2123cd335004d8e363eb08148a627b66b4142f66b18e460b59d05091640587212f4dd60b84e61f0db00ac05b15e83a6e0ed3c2bd281161cc07676e12ef19a936d073d684c1491518bdbd426eb5a1463cea8b67 +private_key: 26c5b889fbcfb6f91cd0805ff87c89368c9cf82c43aa70c6f59b01e297bbbaf7b8c9332721c2bdcb0526788204e7674eb1e975e3e609c82a97988787b8bb8daf49763bbc0fba822a3dda19509bac10396261134d0402073deb6b64ea8e0e98a55fa2cd37b14c1e27cff4e64c52bacadc319d57246bff7145adb11d06ca87f2939478eb094a06361d65aecc8b148b653ee2c15dc618535903b26592c4c334245661830f15638ca13583e387d92c6cc21ab77eb3cc13969322c8521809346a873ee9d9b888b695f695bba983645e22b1a6a30bc05baf1cb49a51dc9eeb5c9c7077495e6800fdca87d3a15ac0d8cc2f2bbfca1626107b3c2a670039ec12aec506e82040cf72ba510881a408595d22c88c9c8d0806a079fc6f7fc32996273a0496c61a22b9c87926aef37097c947eb5875599401d1911b175a770d901a453ca20af484e9735a27a7b4cd3b52a2409a567a369801818e22314ab369c1fb93a9f2a669f4028128bf3a929424d84ba8c0adf7b111a45b1dc6430bad947a4d19152709001c069e1b0b7c00a05c3c420478e05e49788e27d712ae99029037c2e3fb4172d0594d69cacebc05c5d87a8bc91662071c3ed07d84f2bd477454e4fb37468151c0c346053a3adde76c9575386f63bf44ab4b23d3852e274cda84712a28777d69cea67463e563722c90a956057a922c72a5810b0e5895f09baefa947392725c4211898181acf14815eb316855066145063b75260a4c281ba96538073971ac59bc5ea863161a7c0aeca766526b9c627d716521aaf55173fb8eb7308805b47c89a520404548a144589d15490477ac5eb56c62e441d728a808a2ca8dd74981d205c11813ea165e05b938cad77be34a0d1612cb2ec6c90e6283aed35065e74a4d9905713bcab3a1105287162786cd7839537f186bc6717f1132054c482ba0765ab95cb2b4bc4e15704f5808108244bcc1490338ab97cc94a2a02814ad440d34bb7ffd753dd5535f6b7b1f35bb44656726229522e5890ee2f3ae36a468c3c7c21716411bb0c4fa11a3e2baa334c149483a404e5220cea6926ac56dd1fa856db5ad60bb86f0a3cc731b8ac0c48ce98a90c6c20617c8c142697425a7b6017555c7012b63769d6d817e0a810ed84cb436a2cb9a2167c7a0be998b9a42a43545697577209fd09a03d5c902e9082091d0c933665ae84068d3384066b197c71a07c4307fe9aa1fa17436c41550a0337cf70c68a9220df0852ad92853f7fa25905b81c528bbeb8260bc10654589475b1883b77a672f7bbfe8b9bcf5f8b2c432994d975cf6ca8cddc929088c2806fc49037b3c8052448b65812124c82cec2601268f0e998bc41854de6350f56b4c3d31acd427910c8546921132e88a8d1f9c573388cfa3bc93f57c6345682387a69d4220b756f7546d5687dfc9586245b6bb08a9d68263e67c21135301ac1ca2c08a1523132c6cca56b6c05c91d33c44bccc515ab429d9a812693eb1f3380e69be20fc81c76b57bc99498c52784ef3650bd296d6675c7ccb55b67a59cbc09d44d9499a6243140040f2e30d1ff3aa0cf66c6569cfa6d2ca8517a1d5c87fd0d0693ef20d8e21ba5a4a2bebd77cf55698b1a09b2d05bbf7d973c5f5792b165c35bc17f873a9dd95a696929d0f3106bd685fe83871ec99772ba3c21aa523842138191527cfe7646717c65cdc2fa2a9ac97e818625455c2877346b378a4653aacbb1643f075762a9ceba500f0283013269f1b970c9d01588a149c1d8823eb214e76dab3966a622e815ffb22a39e2cb7898b4245a82e72557d51785f3888bef9bb9f1ff3312ac32a0524115ad1897753325378ab94b50dd5172cac3a453535af258a05d57930c035a503f26af358c537519ff53c0e602bb8266abb0a1854524b5311d7488754b51c672fa0b3312e356a60c62202b1678c241438d22720963a0ba51bb4441bd3246adb2511dcd132abbb85c18ace9185907dc3175ca0cc9681c52e91388ae5b4cb4acc4183c588a43e08986e4ca45770a5a40913ad353549c9652d60d5400282040ce17af243614ee4cf045b2c10b6845d8a7704d4173e5cc2b3a6439acb9b2df0901bc229c46945c2a81c7e7742fd96a71066118d618154aabb8e7c9c45b2436f132e3fd48fd5ec04f857b24737c4ea5c218f52c562345af7a1521ddb8ce3e91a2835a177988a4e856467f6ced236ada9bcce8ed885b19b862b952cc8a2269f35826a290a90c170b7f9195f816dd631b1ce66442469c42a420fad3970edec539f11826a4a917ab105123b4c14087f7b2455202a5455159e828cacd84767e5b9c024f4ae6d37596ca7570fabbe591082de627fe04a97f45409fe265054bbb57426b6cfe71825837b4be360ff7b48af3a7226525b77c450cdc4a483a17d77e723c8b1282bb40fb621731fb504277ab50f171bec369818bc3ec22126f6a47ca2937f907890c7815a1e115143f62f58550a0459ce7e04695bc7737787a972321578222f5622449010287ab844e624699a1ab50bd872cb29bfd534b401e538c51c12dd8c467a14c24f5c9856234da17ac5fa28870dfb70565ac954c440db457214016e301736520b5e15538e92d1cb205776f849cc0b23211e6a67ad5c9fceda1577e625bd271587f939fb3acee14135613592a7364534c77c2a1564151c12e1c6a219b878180001e2c94053ebb1282c5288a707ed7b245f15054d87b901c939373244f776ca51b3b9d00628c9a8165993974bac2c0b26715ab1a1b9706e8264a0d210a0e627ae60b59ba58a4abbb61e93f0cf31230a624591e0d1a368390205d6526889640651b7cb71c26807b11913056629914fbb1bc2545b55b2610f992e73812e82b73d10a541a7c8621a4690b2c00149b5b952e91d992c52e8426448e5936dd41ed7725ff1c5bb54803690e7b642805b168829ee5696b5d51a13560a36409a1ea41f03ccbf6bb86a1b205bec128ef81c2af9701752fa54cb3784081b5dec67bceea87a8864bae5bca2aeeab4eca30d460b4015870c0187b2519783fa030a3774277e018274775ea2ba027b8624c1dc569416a3117b57dc5b34a1056e4c9b1ea54b6e5f55bf1cd3c027cac8f5f9b9e4c921d98692a007ac22c6b044f6ac9ae5acc4aa3062a348eb2cad9e77189131bf56aba2d86612e01accc76b3222b01d30b079ff5250e0869545641213c175bca181eb738fc7e80e989b43a0c4c7ba0b41404abe955c3c01859dc17b35f48cc39e9c6ff84625923c1229e9b7c3c2ccfa760c8808b43225ce4fc96bf0c0affa26aa43341f7f14aa37ba5d48798c1661319b31325d04afa0759c35153ec77b07d5d88050f5a1f55262860c94990460341c6eaa32055a480547bb0829d5c3398208018b4c098ac686f1b18870864e2cb0777a798c221a659a0e7e9c5c2936afc4897a611c55086330ee1689f7817f44a6c127a53597576f37b35b4f74c535444abf5342dcf256d04800b04361adc83a207952fb81caa20cc8dd07a6fe8864e562844882b405b5b4b65c948b237b385974a9d4963068c3e5b18c51d42a7a9211d4f274ee5208e530907db49db956b8e10977e2357223523a58b511fbf7993bba3c38a95bc0b98062312a1c9449ddc4082601780ea65a6bfb1467a01d9e326cd10a8e202320d2a29e9b36ad09c44127820d6d024b3ce0c818234f55d7855b0b000462b198a669bf924bc81c99ae0b32a1c21f448ac6084c71a59a90fb43aaa73266e69a077d16a8d1443de4c2b61c3ccc731437ff744b7a7cc3a02a948da951d5763f078a991cb64ca7b049fa1b1eecb534509aafe04437e5f84e974261957ba746705eaf4528b4ba3764816f45045d40e807c14c3577a25f75f69ccaa136ce627742e33db588bdb5cc339ef916d7a9b108180a637586da55085eda466e3c7734f85e6a903ef0fc91ce793910231a8f46a7e084c595177a501b390eaa818c0a9fd37c9be78160c7a398f0e80d8e58966140639656890cd08f7fe92fe316cb1e1517ae7741445a47c8ec3ff8f54f476146f1095f9973062bc17f6723542b0a48e12b7e4dbab100f3bf6dbc219816a76a3109ebba8c823cbbd9176061d072d57726cf12908747bbc267c59fa71f6c719cc7827b91919ca3793d03a73604e1c2c98ca2e99877b6c2b93c97965c06b2dfd71cbbcbc7c81cb56b36587a174e899306acf88fd2689e345a78657c5c0b65b0f3f8206e405dae4738a7061d54db38bdb2ab87e8cb6dc93f2ba0c11b65712840b740ac90ac3404b69cba2123cd335004d8e363eb08148a627b66b4142f66b18e460b59d05091640587212f4dd60b84e61f0db00ac05b15e83a6e0ed3c2bd281161cc07676e12ef19a936d073d684c1491518bdbd426eb5a1463cea8b671c02b230ed109318ca7c1470f5a0ab154b74ee3990ff20ca8ccb835adfda4867f03a8abb0a5010f400ae5722a75bdf5a2f6d5b546b34d73857cb1bfc7e587aa7 + +# Official test vector 77, seed: "542e20078add5296050af150360f057f6b9ab3ba835589dd56987de805f900b906505b5390a0d86cba28038992dfc59a" +seed: 241191401a63afa750f05662e354dddbc683c776ce3222beb83e3cf913d7ed7ca59b3bd23b49a95bc1fad20070fec930b6060bd827d742b077092e422268e15d +public_key: 6f161381cbb8ff776b4299a36c893aea783b541b50b2c253c088683aaab40ed421eb113add58b322fccacbc9aa91b74fb0657e7a2706ad9c7c7f7813be9008cb07980c310f47c764b4ea496af60e8e6a534cb49852a2c17b4c7bf096c52c72264b7855b7a5552aa93d9aeb47f5ac34e340a094d411cb2cb962b90588a1b32dd68b662060ffa2ae2999525424114ecb4905a19a1284928ed8c42a2c5461520437f93d3cb76502201412a65983dcbe4c70b9f9320418421962005b39ac65703442002d52d18a83b08574895c0eeef19bfeebcfcc7c308f960090e9be93a01c36044220858f671bbc04f1a7557897df2a51adf85a0f7b25f1480089855f1a150bd8207edd0c63db7b99497aa03eb33a8068067d43a24957a20fdb6e11942559087c3ff343a2f5503b33756d55c9b9f29f6fe83d80cc3cbe9a00e8a31d0b986d1ef7635cfc1cde434f6c826ba5445a5933845d1cb8047a8e2f263e1a86b4f58433c5318e6b86942ca92cae767e2cca9111bbcd8b582a81aa5d22aa29dcc21f374a96e55302b837aab8709202141324386ff7f9c7d2ea068b057cf6954e6a433a5502785bf43ec8854ee7982002c703a0d6c35ee79a316a1fe3148b0d933fcd450829746c70e26d5b7b4792c40ee5c51b80cbba439c212f1c66cd619408d654aacc9c1de097a9d03478351e9a377e08710263728c08a71ab3db7f4a50774f0b99c8306f7d39c1aabc4b4bd64356476f85d6945a404df00b2da8988bc9f6b34579447dc3bda9d1a686e2c8ba67666f179f77217daa8cbe47a40b154c16a773627ab06c66b5c291b8616bd675c0351db13938c0a22c874b33d7cc128113642ad1321e5520a636681ae188f962a793b072badc69316b96fb591a99f53ce160c1c9e56384925afcf5c2dd74069f89580b3c18bc15ab0c91578686cf801b25c56c3e37847be52b5869c2b3f03b9b5b6ab0d2b5043e56bddb1c793d2c0fe47544e61c12ac0771a48c8249b3649d77ad9a4bb5d20c3ccb0ac05b51a0d1e29cc791677693b2d96b83c0d599e46b238063c50c7c101f3b3bcba18fc4da9d71b23dc133148417c2f4369b0c92855e538245f44496413c741282f5d7b1482167d90536b89165226aafd7e8aee821b22f69b963a87e4bea84d5ca3040464e7293b1bab723dd393ee3606ca2940431502f56183cdad305ea19cc3f3974236310d05220f233b383c5bc97ec1544a8528c1c74a6a48e9b9b31097477efa632baa4bc6a8abd6ceab5d774bf988b7d708926275227be2c416dc90fca4720437425ae9b4769443472e2b54ad8924935bc0f65a4740699f2051c1e53153cc354527450c8909366f696c8a323a300a28388bdbbec532afc1580faa1f7821c5a6988d8386265bb9dc1043c5ec2a1c51a35ec910d80a1a4c41755fa669a89e05de79b331bf13ecf88bff92ca340d5b961f446eca336af53a95173cbddeb643d4831c2f563950736fb912bbe370daff28cddc319ebe86958fb1794a97001a14df90b01b3aa0c6e952e79c7af072905f552487bf255e1f61536dc93824c7709492bd133516ae71c1b057cbce6a4a3d48b0744a5ceb1604e41a378e53a9afbac28c3cf97b1b03b31797c40654fc23666c34f77207639faabce69c1e98262ae22ca956bc043fb6748f54310379e975958584579fba4bd50e04b739020df78849aba007a4a23da8a18d449194073903d1a3ea4f43e0e76b299c233c5fc8534d831e69475ab6b611ab02da3251fdfe6b92475041f7814be839fc39bb06912799c553b4647a7073482980090c2c9a96b2866d6d8b65db1172bc062f3490b708b239fcc8a39e8175924c930825916386b463b645b4832bcc399b69a812a992d09d260cfc964eef5c883027a2d44743fd538d05b3417a26974bb639f494131803b10678c725a389aa6abeaf83bc947c6a3d031487488c72b1700b76f25f42ffff6595d87426b67258fb6b993508189e9b37f16c2efe87e3de705ff794b0a50cb7d8bba4059ae2e3ab4297429a3122c3e0568a64b64a401aca8ba2edd807dc0c0656b60b027290d23bcad4ba71de7f9989cd85ff43a1fd519b7eb40352d85b940208f9f8596f1946dc2366736a345d9c7501511101e81928380591c19868128a921e56383d12f19446577783e0b1665396c56cc9046c4c7c08a569d8edf0b76096e3c0643e13acf3d522c782871a1f0b31cf8 +private_key: dcbb8186f46c07bb4d36203fb6c89a5a487a0d16c2aa674a1b7a4724176d0a3a3efa4c42a258c7566b39ee2172b36b8102b900327b5c97876d2df233951c6ce26366c264b4202508fb4b37fab78977c76cb91707c32b41ae916708b108c2c303c5958c3f8a84c0b44ed504af57e31baa864871871583a98c4360a8b467ab78d16715860e4f112f4ce4a203e154e78c29ae4035f6a6b3df33a0118b6a70d5af8d9a95c65a6c223398bf541879351943515db63a4c97f7255171cd45c34c803c02668c73397c4adcc7874b2346aa6123bcf9050c22942fe7605606b745e6b375b35ef4b3be364353428abe7b29a9c93072e24b6af7904d87224b4b877a204180ddd63281d7211c17b8dc2ab00b5c71cf086e79b99cf1f7834e85b7c8e403b5e09c15042f5248c665b6b85bf84168d0165ab990eeca036e822bf6499f47b6162261b29f44644c78200a09bfada808a8db934977956fe026aaf342cd768d8f68ab2eccb64d67710995ca46eb10ee5b54d05925019510405606633538e45c91cf5c8d285a42eec3cba21509356cca48633e40b26ae5689e51a618b8b2481b780f071451d6c641911183184748185aa629b316139bbb8b666b9d165a24280bcf695b0d7a539a7950b0f133727141618605c7d8311ec5c61d153badb14117a502f353570c051a7975cf3e0031389ab13409a699ab4b8711c5b5188d71d4195ff54a3587b8a965280326afcd609e7b133da87ab115e63963541e512a6a4966c9ba569f43f68877e9c7659a7f75011e5c9757d6ac23782b9579032a2d83848f2966a5e007464c1f26510589269acdf80d28640aad02142d0c02368203c80ca9d6274a66083b194200df05473a056b20449d68d5af4ad617698c1126666276d38368ab87b104158e0c025dd5b7f8835e9757929c75814179943f05467eb6984bf4600bbc99cc7022fdf21a174bcf7d1504a69ac7693c175cc1bb3aa93dcc1c0599b73b1fe8cb3daa93cfd63dba315a5bd84d5e13b59cf15b86539037565b4e753ba075c9dfb049692525a015428f07b8ad5b3ec2ba89a4691615115b647cbdc9787d3f51109fc42a3c6005fff13ac191883c2683c6f45143e298ecd57f63c9bef9294d7a6a00a2737475d46e0927cc2a3c172f4a2fd960470bc4ca50db3b6ad5902508bb7538b7f9a9a42922104403a0d22bad7f36033c91b6acdc03205ca685e144bf72278efbcea55c7fbedb3798f0c2ac2969e4a9c742e6435400a9beb5c2a7874d971a36a278aac25113f382aaeb0877a2241fc3b089e929b806d72613007924c65c72611d243b00554a864367ce38a1842797cc5d4270f297647f1a4bd87236de55c6f3d1343e26708a623b8a03c3d3043055457a574c9b7b6a013d501189828c99a33d3fc715be7cc72e27cc8b0a397b95a79fc5b78bc5179bf1ce44f71a5d699ba34a271ca67409c115bc67b6a7790d384026246ac0d5fcc0d0f5b92ad2cdfe9c5b3dab52f07590ea07ca292cbfd2c44321c4687c385760988c0532c3dc237a9ec0ac139783d5caa0ebc76d0c25a8c1a0bf1e1ca106466548558290d2683bd69ca296711072c6dd5b95040a5b434b8193fb0c7b0496f9334cc86528cf04b77e3451ae590cbf2c0c55219ee1310989aa2ffe7b3bfaf09dede24a86b765fdb9045919c2c70965f581ab16a90afbdabd46d21edb9b3710c392f1f8115dd12377321016e96334491bf6b4a5f661797e92926551c006dc5a5db6512dc91542f017bd1976068386435a52f6684a0bc257ebd0869f72a5a269a46e5aa608d1a551c8192a7349885b95b3cc38d2d134442c69eb0655d9792ee8d3518cd7841b0563198a9f5526b925d2a02a5b3e7ea358cbdba5b1d22f9416915dfa2d9c399fcddc1f70a99e0c534bcc35382f1b4b4283cfd4575a3ea10ba05c77f316acd1a7459eb40a663978114425e0740676e483c9ac833f881523427335796405f3a0a52c8eadb3952f328a0f5ba2468a594ff00bd673922782b0210a3d97b546e4d3333a7104409625795016e9dc57a7e4815268a06273cfc0866126605110163d6de117b551c986ac4613d24aaeeb0209db97bb734da4ab0c9da2adfe1a058b88b2e5311118279443da1859b23a814b6a10125c7c2a7b2686465840ccedd31980f00786191ad330c36f161381cbb8ff776b4299a36c893aea783b541b50b2c253c088683aaab40ed421eb113add58b322fccacbc9aa91b74fb0657e7a2706ad9c7c7f7813be9008cb07980c310f47c764b4ea496af60e8e6a534cb49852a2c17b4c7bf096c52c72264b7855b7a5552aa93d9aeb47f5ac34e340a094d411cb2cb962b90588a1b32dd68b662060ffa2ae2999525424114ecb4905a19a1284928ed8c42a2c5461520437f93d3cb76502201412a65983dcbe4c70b9f9320418421962005b39ac65703442002d52d18a83b08574895c0eeef19bfeebcfcc7c308f960090e9be93a01c36044220858f671bbc04f1a7557897df2a51adf85a0f7b25f1480089855f1a150bd8207edd0c63db7b99497aa03eb33a8068067d43a24957a20fdb6e11942559087c3ff343a2f5503b33756d55c9b9f29f6fe83d80cc3cbe9a00e8a31d0b986d1ef7635cfc1cde434f6c826ba5445a5933845d1cb8047a8e2f263e1a86b4f58433c5318e6b86942ca92cae767e2cca9111bbcd8b582a81aa5d22aa29dcc21f374a96e55302b837aab8709202141324386ff7f9c7d2ea068b057cf6954e6a433a5502785bf43ec8854ee7982002c703a0d6c35ee79a316a1fe3148b0d933fcd450829746c70e26d5b7b4792c40ee5c51b80cbba439c212f1c66cd619408d654aacc9c1de097a9d03478351e9a377e08710263728c08a71ab3db7f4a50774f0b99c8306f7d39c1aabc4b4bd64356476f85d6945a404df00b2da8988bc9f6b34579447dc3bda9d1a686e2c8ba67666f179f77217daa8cbe47a40b154c16a773627ab06c66b5c291b8616bd675c0351db13938c0a22c874b33d7cc128113642ad1321e5520a636681ae188f962a793b072badc69316b96fb591a99f53ce160c1c9e56384925afcf5c2dd74069f89580b3c18bc15ab0c91578686cf801b25c56c3e37847be52b5869c2b3f03b9b5b6ab0d2b5043e56bddb1c793d2c0fe47544e61c12ac0771a48c8249b3649d77ad9a4bb5d20c3ccb0ac05b51a0d1e29cc791677693b2d96b83c0d599e46b238063c50c7c101f3b3bcba18fc4da9d71b23dc133148417c2f4369b0c92855e538245f44496413c741282f5d7b1482167d90536b89165226aafd7e8aee821b22f69b963a87e4bea84d5ca3040464e7293b1bab723dd393ee3606ca2940431502f56183cdad305ea19cc3f3974236310d05220f233b383c5bc97ec1544a8528c1c74a6a48e9b9b31097477efa632baa4bc6a8abd6ceab5d774bf988b7d708926275227be2c416dc90fca4720437425ae9b4769443472e2b54ad8924935bc0f65a4740699f2051c1e53153cc354527450c8909366f696c8a323a300a28388bdbbec532afc1580faa1f7821c5a6988d8386265bb9dc1043c5ec2a1c51a35ec910d80a1a4c41755fa669a89e05de79b331bf13ecf88bff92ca340d5b961f446eca336af53a95173cbddeb643d4831c2f563950736fb912bbe370daff28cddc319ebe86958fb1794a97001a14df90b01b3aa0c6e952e79c7af072905f552487bf255e1f61536dc93824c7709492bd133516ae71c1b057cbce6a4a3d48b0744a5ceb1604e41a378e53a9afbac28c3cf97b1b03b31797c40654fc23666c34f77207639faabce69c1e98262ae22ca956bc043fb6748f54310379e975958584579fba4bd50e04b739020df78849aba007a4a23da8a18d449194073903d1a3ea4f43e0e76b299c233c5fc8534d831e69475ab6b611ab02da3251fdfe6b92475041f7814be839fc39bb06912799c553b4647a7073482980090c2c9a96b2866d6d8b65db1172bc062f3490b708b239fcc8a39e8175924c930825916386b463b645b4832bcc399b69a812a992d09d260cfc964eef5c883027a2d44743fd538d05b3417a26974bb639f494131803b10678c725a389aa6abeaf83bc947c6a3d031487488c72b1700b76f25f42ffff6595d87426b67258fb6b993508189e9b37f16c2efe87e3de705ff794b0a50cb7d8bba4059ae2e3ab4297429a3122c3e0568a64b64a401aca8ba2edd807dc0c0656b60b027290d23bcad4ba71de7f9989cd85ff43a1fd519b7eb40352d85b940208f9f8596f1946dc2366736a345d9c7501511101e81928380591c19868128a921e56383d12f19446577783e0b1665396c56cc9046c4c7c08a569d8edf0b76096e3c0643e13acf3d522c782871a1f0b31cf8e5a656d13cdb067db3640acd507a2fdc583369ee08e235663a202af6720934c3a59b3bd23b49a95bc1fad20070fec930b6060bd827d742b077092e422268e15d + +# Official test vector 78, seed: "6a85a61dd08c0733fcbc158abb49fe0b0d96a50dcca140a2e9f5a254f1901985844613b1c656c0cb0112620591b88ad0" +seed: b9a6b0c05677e957d41a34ba03bd06f2a9092e31f63389397d7e70fde6409d18e99c0e7b82be89bc3c1eaee6680aa4efd394e40c2b3f30523c8117f7c26a8969 +public_key: 81fb1c51f687aa1438a329b100805f99f016d9119d2d06c1a6978569e7c40cab47ce5cacc4d35aadd89047a3bf7175cd8833540b8a028c27461d334b3f8680daf57313d7713a35075ce971cac3cfeac02774c3589c21232d5a73d959705be77c3ca0884f8a1c3a89a1059972f115257bc0ce9f13271fd73e7293bf944b82865986a5d56e6c9c825c83271f42908c0953fea66de4ebb820013fe9aa9522ab4ed66334de641f8e66766bfc47a7a5156c182c0bb3628b81b59461b05e3a11d945b36a3923b12abf8f698d1234593d0c784633cdaf09cf8f4148f6320b15c48aa81b1fc3e79fa4055599935e1076c8c1780b1910af4ac9652249b0c64c94137132a12ab62dd265334cc46a3444437a74b076039f39bdcbe2016d8402081949c8e6066f09839cc0adfb5215590aab10c51bb03b68701b0692d1c5c47c58d214b139b83562728b3a771f25cb7638077c4b6b2f83b11df2369ebe9b4e51f36be72bb04e1b591852aea0cc31d1a774768940d73801b8ba23f71c542c8c01559862af4950b7e21f5d4abc3a1104251574e5597076f971b46c370fb1858a1cba35353d29a23db9e756c57a115539824f5375080990b3835023f448a2314d08c6897da5ae35325f9a6107ad4ca05d653ba78c5769e51b368c200543c2a2884a2d504a73827009d166218a981189b5556b38df395ae007772c1222c3e2778c34774c87ae0931bd116c82ae33b3454808e07cc5c6d16c5108c155a451e046260067c6fb0181ae084588017fdbb7ae63e96321290bdb4b3867074e6e684b700b7d5b1074641c5702e287d257b8a54597667c1ccc702f735c30bbaa84bf405123602572962ed89c2d7a3817ac4879d1392f9199c003e63666f1cfc6f91cfc9386b18615bd36913f010270e8a4a9a99e772cbb994b4ca926bf8a04cc1c20c885d2683301cd8c7b381190b0e3dca0d6c33fdd49465fd265781a16fbb546e9b6c6ce0462c604b9fff09cc2d4608259284b8a83a877b9fb18415cd60c37b0b3d6a48c803a61b0a5c9675018f64a013062440f0c40c62055cca7bb6cb9a293193485fc529922478e4c620a73144a57833d3b5b9bb222f2f4b452447cc06638fac1b4404402449a3cd60bcb2fbccdaea42086682ad7f972008276e4e5449217088b485ce6757eb3410c62796d0e7a643a3c72c612ab165475f6e51456d498e858aff563c1f7781035fcab3c85cfa2f207d1e4703d3015e14689fa0c9b1f57984b678baa10cace44a2fb23bc1f317d5304552306183435c62012b2ccdaa9a744575f959b57b9ccc2c28e1a94959a812da6f259d11479fbbc97f54a57a986be61f49ec42124da687221aa3eb3b2c0298249746b20cba291f1633e784608d5897da13a20ea377df6b95198132a7fd526d065250f97525d809bf9cc7270c7b723cc95dc9c8ddf5113ec4c8b3cdca07a7242034741a3cc684a998514fbccc435a8a2d92675e6c3f252a7019a74818689574c6ad907080954557cc12e1d47ca23240b78c2301f39c78127180c268b76289132aab01f457adfa649a4324a08e0bb5345cc2ef90fe6e33588d6adb499b04daa642fc01f5777bef8a7af04179630619d13ba0991cb36e8c23f16baab09a72e7388c93385331f7b5bdf420f1e75c7ad28c54df96df3f1086fe4120843af7c7878b4483956b022ae05112253b97e6a61780ccf4047589ea04000d57593622983e8187a6232deeb59f5e147ef1628a9f692b8bccea069cee6f49533b7301728a3ffc85d7db98398ccb38523254f843dd79bb58b4796a1fc6d68095b8faa7ff9381d01d61bd6694f2c225c46086031a86105661033948c29278e422b304dac9817401af89540a29a1cd6093c86a3878c226fcae156b85038f4ac53579143f2f5854f825b0d45bb974b724368814a9487a60a6e41261470935a90ebcf45b53279c67d92330556e99606dc22a2419021896b2eb750b2479aae7a706b1bbdd9514173f23dd3066161a0af8a6a9ef6aa7efcfb1306b9c421f63be2e376f747731a233a45a8309ba8182d24cf6598c26d65c89da9c9e9e6b9579a4817552a8d355ede798e09781b387c9935333b15d92998a4c736d266dfc2ab61708fcac7b821c01044492f7f4bb8f37b5026790f3a437cfa63af88341b95a8899ad31b37491ce3e42fd9b3701a63d537569b75a6b4b362c14f1b4ba66ab7914c9900187f1057 +private_key: 7c12448f6c47d923c2abe1a0d6f5259b00b5b0f84304fa9192c5ae32fc6e7d0c6d2cd2162e121c4d202a01d0c471f7a959f3941fe56655f808c139b471827d24d97464993bb77b69a45b0380a666874804de793a2ab31d749070bf174ddc8a113b50c8d11037dcec6ea71a7a37e84e133551494a2cfa01bfbac60ea3691b60312ae6707883c74fe70954565abdabe07364db5c76fa2afdc234c63b39fbb597eea25faadc07d326bc06918b201630cbd166e935cf713373bef1749f0a579b77c185a9855e444a353a0804065c3640114d29b25e96ca34e8912454a2c9d39f353103ac17b7d3742222e605b50043e06350e655bda46760e6073b0710691072b52681a81557930fea99f1c13ae618930466305cd56e7879c455f1c7f140bb37dcb56c807955a084a7866b3858a78372487a565da243c7c328c355bb1e21d25c499bcf2de82fb77349d712a365b395d3a1a82d43326d464cabcba97d634fa0f54226029d576304ab06229bf59be0a3be83c4a927157db10743b9cb4070896e79b17483b07d185aa097c790b1b8168fe0aa02f47965e11a1f63587cb512d65b2cf4080d8be80608e0aec5d98a77813492e57db94c20b3b4a29912466c2b693b2464dc8248757b808931727a7270fedc06d86339886a90ec5a0cd5a66462646f66a9bfa959a5c790af13b777f31bb0d1952e1c0a241aa743b54bc2cd4a3583d735a0774a65a57a1db99fde48381b456b2d415ba066ce94c8ce2f144efdc71465f3aa19bbc8aa2cafc85a0fdb06a784a48fb617bf3b7847b91037ce732d10cb2cb92331c38003dc87647015146adccd2a3761283c221f90ab65816107d69d5b481269009f43facad5d52830f53df74b172b41c1aa693e2bb9a2a1bbac5a362a9c190f142b71ed621429b58e88b05851668bb0193df370402a8c6dc19591d84090a879b0c297c2b352bc74bb6a91a598997cb8a7bb3ad9553b9eb114e4b44e30e2698e83a38134be232995a66644e1a0c308b014e1dc5dfc71c580d61acc478db94052340c109339731610223e212cd7ac3e7be983cb75b0a9145fc2a058eac5288a584ca024258a596bdb2a64b42a471a2c40bea222cad46478007cf981ae7b179f1864a76d0b6d3cc3324735bc2c7474a7c9778777b01cc85c67fb68f5671a74479b691137a006d0d5531014ab4261dcc4c88c07ff298eb9209d3234637f1b8bb0bb506d582467247fe6286ea885612b0648aa593f5436873646406bd03e65a549e610a6502121c0c84ad16c7da8026b2d47334553967f749cad20421be2c67df13225d694a4f84faf99c61953a5199a556b8b6e86ac9dfdd4223fd3adb37623d5a6c8a292ca4a048a7a72b7cde58f60e227efcc5290f5c55e75274860813ea29496123adf577d22dc57174a25188ba951970597359c32b24031f264fd8494121727c7b4940ff4cf12f4ce8ae074272a0ce870304af5b274e44eb34c8aef476190917b0194bb75a23be748c15a69525aaba908baafe6f67b4140bcc9f8670b16a84ea855d67610ec1a6cebc7ca15534bd740bde1181660501094050fc8c58a48f4b87f98cda881569d03be5db1a4418b86f93aa5f18a9e2873418d5bc9cb849aadbb04883914d413955fc072b26c17af227e7e3bb41c666c8ba269e5d6c9d14a13b458cc7e7b37907003e4a089f2941f4ed3b3b7f7caec60ba21389570e014612088db3309582254e7a4667cd3755f4b3e536ab68f36459ef04c1eb210e17259ff714ab8d1052a6c03351a829a02a0f9267e6f62912b188627d907d11a85237ac296e3629151516e495e69c9bf93677bb1582900d5c3ee554d9e491bc1972239c96d17937b094795e6780b84f7baf953095e909c11a90c2d803a3d7a265a9894d9b76988f9b54dd033d4c2461000087987a1f81a2027a036138c42dff0656e4338bb717b0da922e677b1d6447565f5cdf202ac9e7232c2b962626729c1f6836862900a32688ac60716286ede932085d23774512f610881b63b1e34b77b25e30c7472969b7b2f4fb03a4fc46217a0a562b27345eb8038b22160913bf658478d089a88eb9e07b559d268be07ec3e9f9a752f7c110633821fca2ee9dc3b94e9a190759c6c4ca9aaa5547c1c86d714ccbed6c41ab53d3379bbe7c189bd1860df788fd4528281fb1c51f687aa1438a329b100805f99f016d9119d2d06c1a6978569e7c40cab47ce5cacc4d35aadd89047a3bf7175cd8833540b8a028c27461d334b3f8680daf57313d7713a35075ce971cac3cfeac02774c3589c21232d5a73d959705be77c3ca0884f8a1c3a89a1059972f115257bc0ce9f13271fd73e7293bf944b82865986a5d56e6c9c825c83271f42908c0953fea66de4ebb820013fe9aa9522ab4ed66334de641f8e66766bfc47a7a5156c182c0bb3628b81b59461b05e3a11d945b36a3923b12abf8f698d1234593d0c784633cdaf09cf8f4148f6320b15c48aa81b1fc3e79fa4055599935e1076c8c1780b1910af4ac9652249b0c64c94137132a12ab62dd265334cc46a3444437a74b076039f39bdcbe2016d8402081949c8e6066f09839cc0adfb5215590aab10c51bb03b68701b0692d1c5c47c58d214b139b83562728b3a771f25cb7638077c4b6b2f83b11df2369ebe9b4e51f36be72bb04e1b591852aea0cc31d1a774768940d73801b8ba23f71c542c8c01559862af4950b7e21f5d4abc3a1104251574e5597076f971b46c370fb1858a1cba35353d29a23db9e756c57a115539824f5375080990b3835023f448a2314d08c6897da5ae35325f9a6107ad4ca05d653ba78c5769e51b368c200543c2a2884a2d504a73827009d166218a981189b5556b38df395ae007772c1222c3e2778c34774c87ae0931bd116c82ae33b3454808e07cc5c6d16c5108c155a451e046260067c6fb0181ae084588017fdbb7ae63e96321290bdb4b3867074e6e684b700b7d5b1074641c5702e287d257b8a54597667c1ccc702f735c30bbaa84bf405123602572962ed89c2d7a3817ac4879d1392f9199c003e63666f1cfc6f91cfc9386b18615bd36913f010270e8a4a9a99e772cbb994b4ca926bf8a04cc1c20c885d2683301cd8c7b381190b0e3dca0d6c33fdd49465fd265781a16fbb546e9b6c6ce0462c604b9fff09cc2d4608259284b8a83a877b9fb18415cd60c37b0b3d6a48c803a61b0a5c9675018f64a013062440f0c40c62055cca7bb6cb9a293193485fc529922478e4c620a73144a57833d3b5b9bb222f2f4b452447cc06638fac1b4404402449a3cd60bcb2fbccdaea42086682ad7f972008276e4e5449217088b485ce6757eb3410c62796d0e7a643a3c72c612ab165475f6e51456d498e858aff563c1f7781035fcab3c85cfa2f207d1e4703d3015e14689fa0c9b1f57984b678baa10cace44a2fb23bc1f317d5304552306183435c62012b2ccdaa9a744575f959b57b9ccc2c28e1a94959a812da6f259d11479fbbc97f54a57a986be61f49ec42124da687221aa3eb3b2c0298249746b20cba291f1633e784608d5897da13a20ea377df6b95198132a7fd526d065250f97525d809bf9cc7270c7b723cc95dc9c8ddf5113ec4c8b3cdca07a7242034741a3cc684a998514fbccc435a8a2d92675e6c3f252a7019a74818689574c6ad907080954557cc12e1d47ca23240b78c2301f39c78127180c268b76289132aab01f457adfa649a4324a08e0bb5345cc2ef90fe6e33588d6adb499b04daa642fc01f5777bef8a7af04179630619d13ba0991cb36e8c23f16baab09a72e7388c93385331f7b5bdf420f1e75c7ad28c54df96df3f1086fe4120843af7c7878b4483956b022ae05112253b97e6a61780ccf4047589ea04000d57593622983e8187a6232deeb59f5e147ef1628a9f692b8bccea069cee6f49533b7301728a3ffc85d7db98398ccb38523254f843dd79bb58b4796a1fc6d68095b8faa7ff9381d01d61bd6694f2c225c46086031a86105661033948c29278e422b304dac9817401af89540a29a1cd6093c86a3878c226fcae156b85038f4ac53579143f2f5854f825b0d45bb974b724368814a9487a60a6e41261470935a90ebcf45b53279c67d92330556e99606dc22a2419021896b2eb750b2479aae7a706b1bbdd9514173f23dd3066161a0af8a6a9ef6aa7efcfb1306b9c421f63be2e376f747731a233a45a8309ba8182d24cf6598c26d65c89da9c9e9e6b9579a4817552a8d355ede798e09781b387c9935333b15d92998a4c736d266dfc2ab61708fcac7b821c01044492f7f4bb8f37b5026790f3a437cfa63af88341b95a8899ad31b37491ce3e42fd9b3701a63d537569b75a6b4b362c14f1b4ba66ab7914c9900187f105744df0b816ba22f5d471848886dd490d5c76169a14af42c03b0b56a7e26aa7ac4e99c0e7b82be89bc3c1eaee6680aa4efd394e40c2b3f30523c8117f7c26a8969 + +# Official test vector 79, seed: "7f4a56eda151e7b097cfb8ef980440fff707affba91867c89522ced6c5ff3bd7f5f00bb49ddd615d9361a7e4efa42851" +seed: 28a96c71577ba00c94f99fe965bc595a26db2b3ca6ab5cf8e443cdd8462b17929c35d165453e5fcdc6f9df64526d9de698f2bd3e6bac6c7fdd86601b9ba5f4a5 +public_key: 55a15b77118695a2bfe69365a4474cc5f1bd3bc30beca40fa5ab05198b708d58110aba64fa4a8e5f955bfd935530b95f16ea816074ac23f8435eb22e85b7621481444b699278082693f073d623c99764c759aa0d6d3211fea1a61b048519e142eef86ec20430812c26aa3812c42471cc8799b80915222111c96b09ea063518c42786569101f81eafe3229fd85900da5abac8a84a688bd58a03213ac8019929e089a24ff8c712a1751856722fc7af3c57bbf95c77c38c85d3e481916c75ffa371d2a0c583b03d301538cf49c744f429d2c80e1ab13c5e126ab6d3ccd733177e469e6a30cbe0c3212215b66f57bedbca118be24c4a3267a1e65c8f924588e9b10ce22157650e64314b7643136e87bc141c9a01dc7b746556a1ea01f5aa8d22671be3177bcbeb605093a225e1a847c6ab78ca89c4d3a4a618932025aab56646a974b088429e182308dbda27fe6a0a7f5a6b36d681cbd94ec205a018319a89345ca5715ef79266d1f67dff2a1867366d14bb60625b9883740f4b3627ac385fa728a51c162401d86c4f2385bb9661ca891562523a7a66111195bacec69abd4c35ba6959397664ab56a621a25b00c5aa2c0793487a8b1b5847a29844d6e8cac42ba2aa3586ce117b010aaa324236855771cc999929f0b948c671b4a7ced082358fc94147f86fb01c3b1210bfdfe266d1f60a72baab460aa7ce7083d4b913635332cf559b121a26fa643fbb7553781847787c8d78e9662cb82941627bc863bc79799d4681830d3b41d156384f157e3ad27192b92e47c106ab6c1304a3b56723162e933cc28b220f45cbb9615cc90aa3483cbb9b510e7aecbd80b28ba3a51e1264b6c6023c30843462f33faf090e43555635c674a80679fbc88270ab53ccc83b79673e296a1394dba0bc2b421b02a0d4213890d0093c19384298b039b5b8f4f61a2ce286bf11b9a6c164bb5a269427999d707c3e62ce88d66fa283218ef393a4ec7a35e2a927b92866e5976e1b95122236c2800d2b4989e0759ab8bc1f37da21288ab22fc4a13bf8068a9abac80c814d150885762275c638087b643b60b4673408869156d52ca257ba50ff1354f4164b4d29069a99c7805527c7674c2dbbcf26656d110823f082bc88405299e093195038f7562b11daaec75668b71244fa6769a18b2d4643930704199f0105082ba91ff44f7b6bb339f243b524979ac51fc92c6b75711193fa29f898141a6c444e2850f03353fc6ca27f0023b9c88f6c0b8aafc9cb9981c460e2b17d594c7a60b6e3451c9675c923a7b1645c4d3fb28b1e42ae1f93090b86659e1a7d46183d26f380a2c046d9028e9906cbdf1ab605367be6a5609e79cb8dc349c739b7d4f74007fa69b9b50c94223e214509b2e057272476b1653d90740b0c059b1d2845ea9a57cad384a2c7cc2b926979f60fde47bfa01a217cd3c43bc01aae86642b84b79ce58296700427c78b7f32116823ba964379f1374e4b164eac108234b12139d580ec4bc11be3b62442445409204e1a9459ab3d7d33815e76589ca4009b27ca2e6ca470b61504569d0e70155d988b80988cda1c9ec0da673ac2497d6a2fe1cb8539f5262bba5104a4cf7659a616755cbd6a1cfd42a9ee1c115158a66af0bbceb149dba4af4ed2a128a988d8aa5c97164be56483e1816e52402b908b12429c505d0a3a4b2366a7bb38169497e7ac0e3ca8ad8f9636a54cb4b4d667d91752d6658a08416d552c3ebee80a613c41de4478611598bd05b34a66853b079481885225941beb4b67218013a3772a60e55aaa25ad44575f45a3178d37af2786a76e20a5a8719d84e693f693507aab4cb43c55a64339359b8075a643b7a696c373144a743288c37ffe36c454a45444c2a48c3c7d0415c125d133670ca1709c7f80897751fc8d07f30ba0a3b10f7110b03863e5b040b7942c6a527008f7952b89cff921280296955261ca76f50d1dc0a0d2b8b682d8459fec291c27c1e281bbf5a17dff0c0c75a3bb4c987f30b175c293931fc444728ab8590c6095c60542e6bbd2a39e324b96af61328ecbc54da1a44ca7a175c61a131610bad5144b702380d45b5df1622f3b2a4e640457ac830c8cc05ef95b4429b599983bab346a47443575087e975a57ab91601ee65966b51838108117934a5f334979349e3fdb9b49ca49252a4214b6e298c3b12e5f6e85ddfa7edc01a03b27468684972318831a +private_key: a9a63209470b02c598d426b60572256c3a610ee70e65d20bffac56f5371d896255fb79ac3934b43c78ccb0cb8ca428c975e0be2e901c85f92950ab2e2e30b75953656e87c5107b1ae0b0275c0ab1e0a9019b3681e0b909ffebcb467447ea7c8a4328c7fd485f4a6c6aeb6c730f10ceb68c3a3974bb5c2a37f3c588e6e9058dd458f478b702467155d9a2b0d28b5d60bebbea16924c22efa742f59c10ff235f3ea05c51a721ab75550207b3a6f36e34683e7cc5127210015f20082ef4aea1c273ab2c1adbb235ba590f027028313b9fcaf656e4747d0461422efc565276577720223f8600f9c3739e185c98669cc75a282ab8a663285afab5b1b406818c19508f99c9f35a01144a36fb8a68f12516b7eb09eed336bb0440a013bf78c19ca0f11257db7751e5b54033a74fb5ac24d07fe2a547a0f9882b83570ed29e2ae403eef911c3827cce4a3b926b4c5fc579486836cd9c78cb537369d270798aa6a5707a28a2b48a93302f4ba79c8882e23256a335bd7674612749383e8399c7715bf53945e57927c29b2d04481e43e8a91d58511d975bef95a304f253f9027d2948431da71b92c0319b9512b5cb7dc6908a9fab80d0f25f18207fa0323c7951ba4272c053440d0b9a81fc84708643b1a2880c7272a9cc0034246430cd396d4d2134fc1477aa0261ad5595a384cf19a6c37be499274b870ce21120033092e70a38175388645c86692c5e213a29c910323270c790376a19a3d11742376c797e55628adb813aa4ac10d2659a42a3fd7aa13c9c67cca92d0bf0a37fd093a3267892bca285c93c45ec65d4e0a63c3bba8f0051f35a939f0c11b0356c160b14921b4aff79a127b35b5a27c431252abda5a570c48327fb7204d7ba38a79f34a15ae5a2750e27a3e62acf8fd87329b78e426a1bf91901190a29fd820c7656969ae737044207c8137d8eac5edaa41b606b257a53af4d0acca2266618f081d743ce9803c1ebf29afe0c24ac83bf3ebca2bdd35b98355260c31819d7c4ca9c5550972b34ea388ec62a04cb6d06f083b06c4850814b1b4b65e3931e2037c4d89ba1314ca2c47b7dd7a06f11150bc5188178584f825205b693cbcd51612c13385c98b57168b0c4f9a488a81d31a3429968310496a665446fa6a988b7647b95ab582193543906b274cc73925073c55532d7e9af4066998edc208aacc5a0e23431255f1cacbfb380335046cdaf416417b80fab2bcc834bb9a377709069a330f654929c39a0aa95126cbf26fc320dc34fa8eb706234878b516ba9854d2265acfe5ca3ee0ccf5a413b884a9757608453516a524565345b0290421003e71ef631266a021488303a56998505cb4020b1c38c859f33d914ab97a0bae13f620a090f80382be3a40efa723bf42fa10aab9651485f8c6d3a8621a863723bc4ae27627c18287d0bd01b8393819100cbcd28b4173c35b0d874dbbb4e7e3793f16785742c282e590b4b4960c8503152980dde8b5cab7186fce546a8642e7a43a0e939c17b25c8f7ca3b15814ebc91cc213920bd35848d8b412c0269fbd59f74382a27206f2886b33ffc71cb896f225170cc730e07092031e60cab064be4e005af92428b8bb522237413e72b18949cb06588db32c5b53570a93796ded26a22ec8e27b9a042795901b97507789905c421b3e1260263ab704925c7d8ce3393ce04a19486559eea554ec40361010b73544c590147256cb50e7d940e9dd859ac8647f418548270941a53bc4d126f050152ae557f15756562c0267d26c1db4313e5ec6e0f76a2085a77aff2c1ec5cc4d6299591bace03b527f3fa71d9786dec5c9c1547c9e1665d707b565bdc93f0a0c88ae3aa5a00975d136a64a375f05b9e4efcb85775627619a04000b1cd518dc8854362819ca583c71f4c6cbe624d847a2651776672501a71e3717f249b5a7582583b18f006530feb7d68855592026cf6f52f3640ab33032e7d609fb8d3cfcaf15d3abb0691e478d528af606014bab3c15ff5cac8c774142c9433d6bd192676cc4b7230b66ba55a50426c1a47ea6118b4913b46ba3f72255689416cc47caeeb470f8372dd21aaf34687bbe5a66c402762b64b96a42a3bb47d14554c8dd4c31d4c7c1c8071050a41df9a1377d6457c341f6f1538fc74247581640a505f85e151f1775885d7b655a15b77118695a2bfe69365a4474cc5f1bd3bc30beca40fa5ab05198b708d58110aba64fa4a8e5f955bfd935530b95f16ea816074ac23f8435eb22e85b7621481444b699278082693f073d623c99764c759aa0d6d3211fea1a61b048519e142eef86ec20430812c26aa3812c42471cc8799b80915222111c96b09ea063518c42786569101f81eafe3229fd85900da5abac8a84a688bd58a03213ac8019929e089a24ff8c712a1751856722fc7af3c57bbf95c77c38c85d3e481916c75ffa371d2a0c583b03d301538cf49c744f429d2c80e1ab13c5e126ab6d3ccd733177e469e6a30cbe0c3212215b66f57bedbca118be24c4a3267a1e65c8f924588e9b10ce22157650e64314b7643136e87bc141c9a01dc7b746556a1ea01f5aa8d22671be3177bcbeb605093a225e1a847c6ab78ca89c4d3a4a618932025aab56646a974b088429e182308dbda27fe6a0a7f5a6b36d681cbd94ec205a018319a89345ca5715ef79266d1f67dff2a1867366d14bb60625b9883740f4b3627ac385fa728a51c162401d86c4f2385bb9661ca891562523a7a66111195bacec69abd4c35ba6959397664ab56a621a25b00c5aa2c0793487a8b1b5847a29844d6e8cac42ba2aa3586ce117b010aaa324236855771cc999929f0b948c671b4a7ced082358fc94147f86fb01c3b1210bfdfe266d1f60a72baab460aa7ce7083d4b913635332cf559b121a26fa643fbb7553781847787c8d78e9662cb82941627bc863bc79799d4681830d3b41d156384f157e3ad27192b92e47c106ab6c1304a3b56723162e933cc28b220f45cbb9615cc90aa3483cbb9b510e7aecbd80b28ba3a51e1264b6c6023c30843462f33faf090e43555635c674a80679fbc88270ab53ccc83b79673e296a1394dba0bc2b421b02a0d4213890d0093c19384298b039b5b8f4f61a2ce286bf11b9a6c164bb5a269427999d707c3e62ce88d66fa283218ef393a4ec7a35e2a927b92866e5976e1b95122236c2800d2b4989e0759ab8bc1f37da21288ab22fc4a13bf8068a9abac80c814d150885762275c638087b643b60b4673408869156d52ca257ba50ff1354f4164b4d29069a99c7805527c7674c2dbbcf26656d110823f082bc88405299e093195038f7562b11daaec75668b71244fa6769a18b2d4643930704199f0105082ba91ff44f7b6bb339f243b524979ac51fc92c6b75711193fa29f898141a6c444e2850f03353fc6ca27f0023b9c88f6c0b8aafc9cb9981c460e2b17d594c7a60b6e3451c9675c923a7b1645c4d3fb28b1e42ae1f93090b86659e1a7d46183d26f380a2c046d9028e9906cbdf1ab605367be6a5609e79cb8dc349c739b7d4f74007fa69b9b50c94223e214509b2e057272476b1653d90740b0c059b1d2845ea9a57cad384a2c7cc2b926979f60fde47bfa01a217cd3c43bc01aae86642b84b79ce58296700427c78b7f32116823ba964379f1374e4b164eac108234b12139d580ec4bc11be3b62442445409204e1a9459ab3d7d33815e76589ca4009b27ca2e6ca470b61504569d0e70155d988b80988cda1c9ec0da673ac2497d6a2fe1cb8539f5262bba5104a4cf7659a616755cbd6a1cfd42a9ee1c115158a66af0bbceb149dba4af4ed2a128a988d8aa5c97164be56483e1816e52402b908b12429c505d0a3a4b2366a7bb38169497e7ac0e3ca8ad8f9636a54cb4b4d667d91752d6658a08416d552c3ebee80a613c41de4478611598bd05b34a66853b079481885225941beb4b67218013a3772a60e55aaa25ad44575f45a3178d37af2786a76e20a5a8719d84e693f693507aab4cb43c55a64339359b8075a643b7a696c373144a743288c37ffe36c454a45444c2a48c3c7d0415c125d133670ca1709c7f80897751fc8d07f30ba0a3b10f7110b03863e5b040b7942c6a527008f7952b89cff921280296955261ca76f50d1dc0a0d2b8b682d8459fec291c27c1e281bbf5a17dff0c0c75a3bb4c987f30b175c293931fc444728ab8590c6095c60542e6bbd2a39e324b96af61328ecbc54da1a44ca7a175c61a131610bad5144b702380d45b5df1622f3b2a4e640457ac830c8cc05ef95b4429b599983bab346a47443575087e975a57ab91601ee65966b51838108117934a5f334979349e3fdb9b49ca49252a4214b6e298c3b12e5f6e85ddfa7edc01a03b27468684972318831ae360d6a628c3b1b5dc926153f22a88c7b953085255edd2a72799bda15e49dffa9c35d165453e5fcdc6f9df64526d9de698f2bd3e6bac6c7fdd86601b9ba5f4a5 + +# Official test vector 80, seed: "09fc004519bcf85b20d25d314a0dfc79e00cb6262a7dddf9c52473641afb8cfa0f5dd5f53558184caae9ec34b459e98e" +seed: c08ba2ef8c3a0a043afad931652d7a19e6e8cb670f840de5f1fa03309b2ca9ec5fe6141a25f7ab9f875f79e0a82d6ea5cde5a017ab637d5fdb7c42646a1d71df +public_key: 31596bd912527e2c965ce3344b4621190c106f5084836006296c37949aca196c426f4783b65221b9c50827c85b7067a9872a6d9277828ea9385f9b512a8a3e897628d1aa36a5206b35fb219ae26269126b75590b2d1067419b27fa6852a3552d6ce48c9193c96a3131397166d47c53eebbb68b949a5bc3c7d585027961aab89b38f5295ce7c60d3d9009508769ee37a48de0685b9228d998b883d871985108b49c908390cb68147e8bc561df29cde02b1ed5236ed77b23b3f32e687b859dd63439890d8735640f5c073bc05cda79603cfb37fc5ccd28e98b4eb169271408a1cba57d21afb87c97e2044766b38280b6911b95725d5a77327764832603fe771aed89baa1c8b2ff49b741081884c6326fa0693fe64551402301a0552f49035a262e9d047d8a2075fdf6636c726f8b6098fb2b8f01c89e87478dc1112c37f1b857fb13cec53673e297b8aa9612d26a4cd0c6168c9dea407133acb939d06a7c660581a877f046b9b1138f6fa6156be2a5bfb23d04954fe32b1272d73e39c79094864cc9e36e46e9c8f1db330c17a0ecbb332e385769c4c0ace7c0b0d49fb89503cbc13ff3a1b19f421b80855fcb947cb651ccc0a7b55b5100c09aab9201c4ff8c56a2d90bac255a3665a731d07b8ad829f7a7b556ac12acbc1073a40b7c36059edccd97a50c493359c8ba390e3716921a69998b9b111c4dd283456f7b61ccf97c1dbc362e2760e2928227405e449c126d7526516298f6315302288043085808195ea587118d731543f09479a2adb96884b3a620d4c86123818cf848b295eb0035211bf614b077871db1d8c779d61e90257730e47bba178ac5e28b8e47794517727e4049dc759ed5a69cf7c66de05c0a5a00c366a87f7f2914e1e059bd1921eef61da9cc201f016f1cdabca2d2cd99e1884c114100ec5fd0f415d6fc6222981d8e4582dd138d71a368bd5590645359cf767146f2cf5f7a58e0e1becadcb1da0c87fd385c4ad15e02836d866025d0d815af61b564e803f0f0bda9a1ad0a3b86dd9a79b29792a713c78f00c55668aa2a0962b4a9be8bd9cb6966a054f0ac39182ca4d54fffe197891b964933aa8d60a87ab0af08c139a8e79b7a5773cf189caa615f64b973eb273edefb27be439ddff2a1fdba7f2cc3c65dfb0d0cb177b7ac49ad1b4da0725a3f3a2741fb2c82347dac329657c9bbaeaa948102295c1828b01c22ae45cb0e0b46a68837ca5c8639ab483eec5b4dc9caf028a7bee18accc402ec6aa57a93a1c53a145e923194341bde96296857890fa616d1bca0cadbbba3e4302e55286c58a283ca8d1626515e6a84881aa692c662a3567cc294a23059392887ce7a835f8b8030f5c1060518c71e0c5621812d54d50043b73182fa67de92768c63c4a2c562ac151342fab8fc9181be82301404792a94258b98411ed093a9121699ea13fc822bb5a317b55c1167ac12bd8c3ccd9bc743a634ed6a0961e13ad91a779a242dd0b9b4b41a5da11cbea085032ee2382c4b8ce088524075cdfe7b7c06cb6f2ae128f4f7a6c5d58011b42b8cd39a8a0aaaba14a0ea8c9a72f322693410cac54c3ee5487d726acde02f9cd0b027844ea1c018e2744571c3a2c36b4e0da088f09ab939152e30696cfd3473a085be3eccb53eb406b66c95ef8b1cfcfa1df8c8238b8c129abc9176e0864415852cc8ce13970fe8a76ecfe246800997c56668af974605e748e3054700d7b75fa182278309e41cbe5b4a17696c843fb4ad72471bac747faf30c99d2433665433ef29b64870ae8a3593845ac211ca4af0e5aeb9b8afa5b4419559502e834f993543353835596985e31529c1482d0fcb9c11a1c79a704db1d531bd0774f91b6810b98766a83387387c0682584c94793fa771ab8b4216455f7a117c65e5a481e01b5bd8bd0a9263635815f3c13c7c6740d2d1778ab47d56c9a37ed4a660249b8a4a02cbd716f6a09a646456c4b54cad68c86f8b998855379560692cfa68b5176309162a7a506b28e042c25850a7e6357ebcce387146b94a09fa82ad2cda8123477f926757d552929ea72e379a9bb997bab0d1aeb5f02568e7715d959168129cd58048ab1299eec754b9080e7337084ddc37c4695b75488effdc370edb65655231ef1091d762b8ec53a3283b3f7bb5114429c788a2cbdce1c0454466882448990d0c963c4dc08e6955a7aa5238a6347a0d168a1ab143347ab4 +private_key: e7831320d38dd5629ccd557808a8b263730777d379caa64e1da51cd8c2baf8ab930118770cca3dbc11825c867af4421c87541c5a6788bb93b560948dc8555c8caa6597441e1a6313ac5a8ecc6a0acc25cdabb2c59b49352cc589f13269ca38094d2a2029b070e989b0a2d15332ba43657b23f278b1a253c4250b2210b0905b4737f678a83da40ca296bab3461b58c1274ba0ce79e5562723242ac1cd86839e32e4302e84b42bd118fc4415b71c92e149cdaaf06dd12837a5c03aa41b60178c1518130ac4c7017d78c5afd922e83ac2bcc3c3d94b6d8dc8062cd54649339ec4b75c49704d2e5c86aaf48294d19e4d28c12fe45cc56898c630a252e09e6f718c36c71cf9b38d38a3a9731c4f6f02528107c745277841b29d7b93bbc4b5c860147777f79745ea2296274856915d06944582055b31741f291c66df5c4a2f09351311a6d56a8572aa6240a42be432a5e4d98cf229195ee0a72f6c67cb4a9c48a9932d36cf70164364988270503573e43e2b730d88f94d23315b6848549515104320c26e83206ad5c33ac98c922b6bc0c961ef2607aab223a4fabd82dc7670fc999263991612440d93a2e3eaa8e65961d441a8548762c84754fc4880da92aed2621876294d1c086efbbb52cd252e2f14853f6a2b7d0bc9e1f104b9703a27779733049013da1812257bb8db3857075b665c8e7622ccfa10667de3ba468808fba7b6dda902a1337af7ec59e4aabee16c8017674114dcc2a0571730c14a9d07485648228ff8528c155f6266b79b3c76a8ba2ed133401d6bc56394785089abc368b9d05b4a1165912360bf87fb6ef6f79859f8187151a31437904398c997c30092ca21c43996805245904a0d90ba8658309be2b4306266888f5564b631cb250569aec1886059352bf770e1137f5287058ba78463523c59f14d1846b7e1764aaf2210a58990fed7528bab242ee02949539469122dcff23f921b3a0746b44f64a7aaf81f99954ad88b67567c120b191abde6c7d54aab5ce7bc87960e2ee2618e24746f24c03b153dc988b0d3712c42d20e152533bcb914588a32ffbc2c44b4045f07ab79ea5627045f45b11d62d2a3bbf97e57e8c27439418be800a667bcd35435b6770b8223ace5284371f5b0d8930aa93b8a3889984b8065f408bafd0c5d5df30cd3e5911d9845c9f687980a1609198dde43a52ee970867c0addbc2114d52d91073d6c95156f7c95a40a575ee07228b22bdabb0b16729b2266b13ec29bbc70486e13612270541102baf04a96b24900af60cdaaecaa1af07459f554b53b7806a65465fa8ed5c2bf65d32410caa887a90527b82a9697738cc71a1926478bd4cbd70067a50479058bbaeac05698b1530a1774c0f45001ec718e05053da12f24115acdd76bff98094f8bcb45960e635377077b6d92150221c87b60994bd7732e24c34b55ac1fe660450af46b3397a0c1c577a30b2fe1c263544c025172164f7c5620b5658d34455757c920f229920729264a159b20658a75496c6bb48fa9090d88be51f754988ab5cc774d526a1c27361cf3ab173326886eb0053b082ee9279c27a428d6f7cbf9fbcc15ac4988d13dced43e0045167d33b0aac4c11c383ccd1025bbe1c83bf5c43ab6836328959ce979c3914510027121a00061e12d1d831efa030cddf9aba24754bf556a99f65109832ef12ca41ed9342309c24e7a09cfc93647c6cfbae5cc262764aa64ab49132da03a6e7424c56ba49bcad27affdca4b88584b74c0623224541b82419e563db5b90ab40787f8425e4b38bbc573918224c4d73149bab4dbbe350630229a612bacd4b081ca05eb95a62c50453695a65763461586c8de2934d31093297ea1384d3c2f2f811bc75c960237693652387a13f69629a3fd625351927a9658bd4125c713177959aa82ef3771c03b5bd5805b7d56f00d86fecc7aa29a7637cf3bbea377ee7b9b1f94836197a718b097f510c81594a0e11381f01584a87419f51f49c120b89514754dd85a6be48ad947b81698001f0a256f8a92d09a1a049c0376d236a19f19bcf431a90f94b028475c11807d14c5562e5747f1b8db5b072017023bab895a07415deb89cb3cb8a9115b63216bd69243186901ae32b24402b88bd18cd03b2216d24928eb82e385684bc143e0d5745892b0826f89f9fa8a931596bd912527e2c965ce3344b4621190c106f5084836006296c37949aca196c426f4783b65221b9c50827c85b7067a9872a6d9277828ea9385f9b512a8a3e897628d1aa36a5206b35fb219ae26269126b75590b2d1067419b27fa6852a3552d6ce48c9193c96a3131397166d47c53eebbb68b949a5bc3c7d585027961aab89b38f5295ce7c60d3d9009508769ee37a48de0685b9228d998b883d871985108b49c908390cb68147e8bc561df29cde02b1ed5236ed77b23b3f32e687b859dd63439890d8735640f5c073bc05cda79603cfb37fc5ccd28e98b4eb169271408a1cba57d21afb87c97e2044766b38280b6911b95725d5a77327764832603fe771aed89baa1c8b2ff49b741081884c6326fa0693fe64551402301a0552f49035a262e9d047d8a2075fdf6636c726f8b6098fb2b8f01c89e87478dc1112c37f1b857fb13cec53673e297b8aa9612d26a4cd0c6168c9dea407133acb939d06a7c660581a877f046b9b1138f6fa6156be2a5bfb23d04954fe32b1272d73e39c79094864cc9e36e46e9c8f1db330c17a0ecbb332e385769c4c0ace7c0b0d49fb89503cbc13ff3a1b19f421b80855fcb947cb651ccc0a7b55b5100c09aab9201c4ff8c56a2d90bac255a3665a731d07b8ad829f7a7b556ac12acbc1073a40b7c36059edccd97a50c493359c8ba390e3716921a69998b9b111c4dd283456f7b61ccf97c1dbc362e2760e2928227405e449c126d7526516298f6315302288043085808195ea587118d731543f09479a2adb96884b3a620d4c86123818cf848b295eb0035211bf614b077871db1d8c779d61e90257730e47bba178ac5e28b8e47794517727e4049dc759ed5a69cf7c66de05c0a5a00c366a87f7f2914e1e059bd1921eef61da9cc201f016f1cdabca2d2cd99e1884c114100ec5fd0f415d6fc6222981d8e4582dd138d71a368bd5590645359cf767146f2cf5f7a58e0e1becadcb1da0c87fd385c4ad15e02836d866025d0d815af61b564e803f0f0bda9a1ad0a3b86dd9a79b29792a713c78f00c55668aa2a0962b4a9be8bd9cb6966a054f0ac39182ca4d54fffe197891b964933aa8d60a87ab0af08c139a8e79b7a5773cf189caa615f64b973eb273edefb27be439ddff2a1fdba7f2cc3c65dfb0d0cb177b7ac49ad1b4da0725a3f3a2741fb2c82347dac329657c9bbaeaa948102295c1828b01c22ae45cb0e0b46a68837ca5c8639ab483eec5b4dc9caf028a7bee18accc402ec6aa57a93a1c53a145e923194341bde96296857890fa616d1bca0cadbbba3e4302e55286c58a283ca8d1626515e6a84881aa692c662a3567cc294a23059392887ce7a835f8b8030f5c1060518c71e0c5621812d54d50043b73182fa67de92768c63c4a2c562ac151342fab8fc9181be82301404792a94258b98411ed093a9121699ea13fc822bb5a317b55c1167ac12bd8c3ccd9bc743a634ed6a0961e13ad91a779a242dd0b9b4b41a5da11cbea085032ee2382c4b8ce088524075cdfe7b7c06cb6f2ae128f4f7a6c5d58011b42b8cd39a8a0aaaba14a0ea8c9a72f322693410cac54c3ee5487d726acde02f9cd0b027844ea1c018e2744571c3a2c36b4e0da088f09ab939152e30696cfd3473a085be3eccb53eb406b66c95ef8b1cfcfa1df8c8238b8c129abc9176e0864415852cc8ce13970fe8a76ecfe246800997c56668af974605e748e3054700d7b75fa182278309e41cbe5b4a17696c843fb4ad72471bac747faf30c99d2433665433ef29b64870ae8a3593845ac211ca4af0e5aeb9b8afa5b4419559502e834f993543353835596985e31529c1482d0fcb9c11a1c79a704db1d531bd0774f91b6810b98766a83387387c0682584c94793fa771ab8b4216455f7a117c65e5a481e01b5bd8bd0a9263635815f3c13c7c6740d2d1778ab47d56c9a37ed4a660249b8a4a02cbd716f6a09a646456c4b54cad68c86f8b998855379560692cfa68b5176309162a7a506b28e042c25850a7e6357ebcce387146b94a09fa82ad2cda8123477f926757d552929ea72e379a9bb997bab0d1aeb5f02568e7715d959168129cd58048ab1299eec754b9080e7337084ddc37c4695b75488effdc370edb65655231ef1091d762b8ec53a3283b3f7bb5114429c788a2cbdce1c0454466882448990d0c963c4dc08e6955a7aa5238a6347a0d168a1ab143347ab4c4e4ad5295a60c2d41e0b7a7bc92148855ebedb4f2b77da0c706a1bafd6429d55fe6141a25f7ab9f875f79e0a82d6ea5cde5a017ab637d5fdb7c42646a1d71df + +# Official test vector 81, seed: "e3c41cca6f04cfe7732fd54de30cc5caac93e2f80e76aed7d24a962a3969c1b6a311459a3ec3e510e3e9b1e4291d4d7d" +seed: 0e3b30e102d707538c2671060f603bb0b8a014103f132d63b09ece07e4a4c75b11eafeca9e810796c34e8cfce9d59342884456007b01ddd12edce6d10ed87e4c +public_key: d7e9bfebe65e89997ce4e680ce385c8eeb2862175fbdc9b25dc7724f641ca14b1675e13465d634915593a228c35432b316d295dcfcac909b9aaeba2e93f6028be9045610ba38c763c08308a1d6b9b8667b500c649b94cfa703432f8695377462ec6159313a184f7349be26512759a112223af1b12127f5566da94c8bb19765849f9e849a4f235c9df3783627b3e548242fe2cf506ac1fd09cd5067422789ca6bd3ceb0e516a2e88d0406abe03b65b0f064d7600ddc227ca460cc784652fc1168e8ea53f825851a222eab10bb9c8598e6930a2abb627ec5640d4a3c6eeb225561ae19f20eb6d0536ceb93145c7616fcb46c04b2076b9d8a4013a4bc527848a8972b0b6577c50f63194e6357bb2084fae54c592577d6c7a61b79475fe1c43e70980762132806a7d25482ec2a0e19778aec2685ac19490c303cbee96e2992b836305b58270553d07184507b12c06510437b5c78b3f5cb1b57627da57611dd3361772a213e033dd5519666d18bccb13b3f751901d601ae131ff3c061af87839692967cb88199f1770ad0ae196388ed6b9746fc6e536443afe04a3b92352acc4ea04173d00ab9e3eb9c1cc137b2d6b14fe36dff9591b5300853a349dc23799d8209e811965ac84090f34d36382020ba31531a0dc909b9ed725ef6120929228f48a94a5e04d03314993fc8b306572a4d5a7063110c051011c1b09ee2d09315196f09192c329565cc5a64405c3acdc234acbc0a78e81b3c9523c43a2fb961873eb207464a302d8349ab50167ca33cde091be57801b6e850dda6c5baf498ce1897b247bc7e1a84c6b141fb00286fe864a9f27db6475ed24371cf0c19586750cf72ac1cab46ce08860090a0c1322aba42cd902b6c05f4c4bab667b54b0d5a04332335731544675f80a2ade66dbc075d7a9b4ed924417677b6e195b902842fbd4390597c28a1504e161175d259ae7c44333e742471b58756c0666900cb94d87f73043e940a5733f89ae3e8cf037b83a51b4768a19dd1a96729216c7e317bcbf60b3b07cd82784d964754a440ce297b40e3f8811834885ae76a9605a249958f02d9bf2ef0a195d3603261560593a636b15dddc681ab9bb19ab7ae95d32ea474388d81585e49b463b47033f81964481f46c229f751a930f6a632e8aba8981cca880511164b8f09a8bd9ab8c07bc8a28636d0d32bed77b2cd032b18090928f01e192943e028af329b4b812238a3362b5e2a61cd7b3691d06148703d692080a6c755c560490cd5b47606ac9cd9bdb927b6e3b26d9060921757a0f85a2f82b618bba9008b7073f24a88fdfa922eacbd6631c32157b36150be06d3ce2c4b64410543ccf280143c1de73917b816c86b1a04204a8f3fd7cadbd20b41831c8229788aba219ba59af78388c2b9865eb3000089c6c05c850e91021a5328149cb2a1a27e075a3ec8630d8f515cb77903fb5531f6e05ce984296669b0bfe8af8ae59438b834d4110ba0606ee426799c313233ca9487ea35071871420c6825889c07da0f87f1188d75650e36ad21a265d4b44c01361c0653b55f409ff3c290d2c2c212319297d5aef2bb87164b7535b7518ca14469fabee91c81384025f6914c19018a0775598ad4bbada98e06c87c9af309c73903ae1b84fa9a3c3f668042883a8195cea1fa5bdca59c203178eeb18041aa2e9af770d180be044bab1c8c36044a70e50281540501ad6b165c021e53b86a5f368728e2aeed1520a09a48c1ea0e9419b313d7c6a9e59f17121c8ad47410abb73e008c1ecc16c32b4a46f39712648cd06196ceb8a076f5c7048a3aad37393973b8679c55393137e6b6ba2dea4d50f65e1ef12116598de49260112055f4b0acda503395e242b990398943c18c01cdca993b3c9a74e19ac6768581ccc9a0331c005ce873b241b3e5e497493ab134e18569e80a6d12a04616911f9072fae6a30e529cea1bbdbaecc7cc64a7d655a730335e8a22b4f4250e2c54976c69a161694aba04456bc14e2bf8c13b1ba2a5ac1a6b557bb061805c903d1d1aa3367922fe0c51dbc35da6cc8593b8b3cdf741220126eea9cc5b9c0632f75c7aa3aad60a46afca4a6d166f2b2ac858c2a572e4cdc2d65bca199cd73367b83909fb324855c4899d920a32b3107ec56789d63c25036c35d30be5d28d54d725f1eb3f924bb991cc4c5ec2e36585c0133b82099b8234cb459a9fd8aca37c4249a3b020 +private_key: 27cb06cadca3f6235b6b59c5a5e7499e95130ab431fc7c4744d1ad414393f5acbd04d15b23c8867dd88ae7cccff7a03122b44de4a4beccc2251744c517f116b413a18d614d5bc371df9534eb76b5fcb13485e60304f02425e37a653c76e08072ae9527e449783cfa72fae68c27e4abcd59ab364b49e6045d764581a9738e3f6443229196478ca629b28dfa519400149a1433b716564dc0959956c87e67e8179b46b1b1b4b9b60a52641971fb91372e6550af2c4e1be88e534108c059217b4071493807e3986d182cbe451047fa4021e264ccdfd89c5458085832c7e157676a649e4533a91904ab61e875ba8180d8639c82522a211787b4a490fcd587d93a7ce8e08dd0094fdff708bf23c35e1b904ea56ce14a9bc5272ab935a69e36cbb15ac1aea1865b7710aa747570704627aa79a1075d8adc4d008d45926b8b55dc12624b6e66f4ce3502150aa0bfc6125430550d595b6627f9ad22243a12aa70b5597708509f9dd09f5ad23a4a876fb251a46f013f05b1884aab725ff1786a4892542c2c0b23150bd6cc3b25427f4b76365193d008a074715b06e713a4e71e3819776b078390b8042d312715b28f1d44a4d540abfdb9a2b3b7660a7101b31030dabb52a05b7f81a488a5e306156a268fd7396d4394a43534d9c4beb2f91686014ee0d7c103733fda120b62ba668f0955db0c596355091002b4af9929384075d6575938468f95571397f8a2f227b57c8599eac2586b72902c698800c78f4b1b99b7284aac542fee229f32a25312f85469f9bf8b81aac6440d4dd26d38c001f2d625d21577d0ca557016405de603b7f26dc7199b300b120a0c278a1475b266354bdb961f5a54a4e0cd70a05e23d7a59debb4134111906a9f6f5b66704026cf033b98c617fc528b104060b8673083490d6c238ed1c943a217533475b5e7c00c871c81292516763b3936d3b99c680695139e6534335bf499aa6abbe10acaa5a2a75f659baaa1a743d228934a129beb65158a04b52c999612c6a8e602afd532139006f386ad51a618702769ece33229187e0f647027420418d560329abb658aaff3a358c5577115f437f59c06d503b154f380c4512d66364c0ce20b5f0a7563626d9f2620f09208adb71b3d91c94a10c4ec29aaf892b8d0991e7f699bddda9c2cd8b96de4661674b400f780fb60921008ccdc911ce6e29a771cb308e86415f4b641d33bbe0746fca69e2a00015f9932af23772abc68abdc5ddae66e84e3826e3cba0a7234df3868fbaa8b2afc0cac953be2271ca2da5cc674569db62a2bc5c5447966a0553eb3a258dfa05ad763850c0ab1724a01f2e2b4a2f3640398bd0b8bbe8af79adc3ccdebf775f2a545a7e8a8685ca73d4c5bf0d788d6a21fef02c241b34f80752f8860249966ada889927582c0f60642b042b95eda965c8873fe8191967b3acc13457e0708316096cb50b856c35a7c19ac64a85a03f9b81e9a756046b901dc9491947c077a05e5d9986cfc3dcba09d02055cae5a47a6969652b056035453c97571138561e28b3b0d0160da428c9104810ca69c75d15ce66b126a27b96654c6e2a0a463d1cd4775458964be2e5a3bec582e38b64c8bb68776c15bc2919d5e99259a68c5c8e42c37b2b4a6b0351c18a09d2378f04403a04aaa7a6ba6589b63061b0eeb80442ada851bcbb5afa1be84d688b3050647530fcac5af0f8b275f036ab0d354991265fd1190d7f5468fc3578e15723214aba66b855b0b5ba2fb27c8b1b7dd37790a8c77120a6c18797b5a920450f87144872d83e8afec5a72df7a61b50655f5081389225235389bf15444c90c1b332b5395796a185b1f9d816ac1b69fd1457e1ce4b1d7071e1956ae9282645b8458cbb8c3f5711e3064a4d05488104848a846aff4c01445241db51b81549ab00230621c8c699fb13c94679f7f51879bc2676973c7418b6d14d9963426819768631abba1db070321a32c0edc95b35c206272946ff134afa2093efc76b28927a948bc4f1931e1a2cbcce18ce9c93c8b029b13291234e76b00452bb3f7860ed98ca0fa2a01a16735272b09c4c0a0b08904f5654911a937f9237818926c03cdb0a98b167b6434a96fe74796ac233716625927535581516ec3217382e61710991003e81f2e0b8d139821f3bc631edcae24cc4583a8abd7e9bfebe65e89997ce4e680ce385c8eeb2862175fbdc9b25dc7724f641ca14b1675e13465d634915593a228c35432b316d295dcfcac909b9aaeba2e93f6028be9045610ba38c763c08308a1d6b9b8667b500c649b94cfa703432f8695377462ec6159313a184f7349be26512759a112223af1b12127f5566da94c8bb19765849f9e849a4f235c9df3783627b3e548242fe2cf506ac1fd09cd5067422789ca6bd3ceb0e516a2e88d0406abe03b65b0f064d7600ddc227ca460cc784652fc1168e8ea53f825851a222eab10bb9c8598e6930a2abb627ec5640d4a3c6eeb225561ae19f20eb6d0536ceb93145c7616fcb46c04b2076b9d8a4013a4bc527848a8972b0b6577c50f63194e6357bb2084fae54c592577d6c7a61b79475fe1c43e70980762132806a7d25482ec2a0e19778aec2685ac19490c303cbee96e2992b836305b58270553d07184507b12c06510437b5c78b3f5cb1b57627da57611dd3361772a213e033dd5519666d18bccb13b3f751901d601ae131ff3c061af87839692967cb88199f1770ad0ae196388ed6b9746fc6e536443afe04a3b92352acc4ea04173d00ab9e3eb9c1cc137b2d6b14fe36dff9591b5300853a349dc23799d8209e811965ac84090f34d36382020ba31531a0dc909b9ed725ef6120929228f48a94a5e04d03314993fc8b306572a4d5a7063110c051011c1b09ee2d09315196f09192c329565cc5a64405c3acdc234acbc0a78e81b3c9523c43a2fb961873eb207464a302d8349ab50167ca33cde091be57801b6e850dda6c5baf498ce1897b247bc7e1a84c6b141fb00286fe864a9f27db6475ed24371cf0c19586750cf72ac1cab46ce08860090a0c1322aba42cd902b6c05f4c4bab667b54b0d5a04332335731544675f80a2ade66dbc075d7a9b4ed924417677b6e195b902842fbd4390597c28a1504e161175d259ae7c44333e742471b58756c0666900cb94d87f73043e940a5733f89ae3e8cf037b83a51b4768a19dd1a96729216c7e317bcbf60b3b07cd82784d964754a440ce297b40e3f8811834885ae76a9605a249958f02d9bf2ef0a195d3603261560593a636b15dddc681ab9bb19ab7ae95d32ea474388d81585e49b463b47033f81964481f46c229f751a930f6a632e8aba8981cca880511164b8f09a8bd9ab8c07bc8a28636d0d32bed77b2cd032b18090928f01e192943e028af329b4b812238a3362b5e2a61cd7b3691d06148703d692080a6c755c560490cd5b47606ac9cd9bdb927b6e3b26d9060921757a0f85a2f82b618bba9008b7073f24a88fdfa922eacbd6631c32157b36150be06d3ce2c4b64410543ccf280143c1de73917b816c86b1a04204a8f3fd7cadbd20b41831c8229788aba219ba59af78388c2b9865eb3000089c6c05c850e91021a5328149cb2a1a27e075a3ec8630d8f515cb77903fb5531f6e05ce984296669b0bfe8af8ae59438b834d4110ba0606ee426799c313233ca9487ea35071871420c6825889c07da0f87f1188d75650e36ad21a265d4b44c01361c0653b55f409ff3c290d2c2c212319297d5aef2bb87164b7535b7518ca14469fabee91c81384025f6914c19018a0775598ad4bbada98e06c87c9af309c73903ae1b84fa9a3c3f668042883a8195cea1fa5bdca59c203178eeb18041aa2e9af770d180be044bab1c8c36044a70e50281540501ad6b165c021e53b86a5f368728e2aeed1520a09a48c1ea0e9419b313d7c6a9e59f17121c8ad47410abb73e008c1ecc16c32b4a46f39712648cd06196ceb8a076f5c7048a3aad37393973b8679c55393137e6b6ba2dea4d50f65e1ef12116598de49260112055f4b0acda503395e242b990398943c18c01cdca993b3c9a74e19ac6768581ccc9a0331c005ce873b241b3e5e497493ab134e18569e80a6d12a04616911f9072fae6a30e529cea1bbdbaecc7cc64a7d655a730335e8a22b4f4250e2c54976c69a161694aba04456bc14e2bf8c13b1ba2a5ac1a6b557bb061805c903d1d1aa3367922fe0c51dbc35da6cc8593b8b3cdf741220126eea9cc5b9c0632f75c7aa3aad60a46afca4a6d166f2b2ac858c2a572e4cdc2d65bca199cd73367b83909fb324855c4899d920a32b3107ec56789d63c25036c35d30be5d28d54d725f1eb3f924bb991cc4c5ec2e36585c0133b82099b8234cb459a9fd8aca37c4249a3b02025a466c0b64a911e75243db16841847a8ac72dd835486e96a168b2f9fec46f3011eafeca9e810796c34e8cfce9d59342884456007b01ddd12edce6d10ed87e4c + +# Official test vector 82, seed: "373fdde922cfc416ed96b444e445bdd0962e8989f6c50adf9912a89937c57217d3600b06c95440448e3f601ae69ca5be" +seed: 2478f7d3de6041e7e5cd11c5e2ef483d1aa6218eb126444091535f6ae532fa7311136e2681df2ef881b51a092a9badbe72c9772c169808521c47149578621e28 +public_key: 27c546b8f148cfc133aa807fd7c233c7b5a5c3f6b8da210ef7dc5c1a834fd1559cb2439406895223991a4e682554c63ac3a117d840aa4848b1b3864edac960c656046e3bc6d3b681e1e6b49bb0259f1aa2a4329b2598b932e26c00fdae2cf4686803ca7af8bf0f1243e64544d51794583349f9854dae778894438805793b085373d09a185cda5489d74274eb7bfee433b63a56e14b95941440924cad32935440b46235a8576d11b8d65a2e8198b64b510fc1f942bd9b0f8e077fe33c559cd987615263e9b66c38c5683893c3e10965f18aa755e1bea6d1789913cf2cb21b41b23c4eecab25798ad13a26321c59e35b0517a78743c4469a4435970bbc2b9c15498b1f17cb0fccb446f67c2f437415abe98cdeb3346413539961b3dfc1c40e243296695f27152b7f7a32ff4b185ea437b275c6f617523ada8f7d2a594e277b9318019abc0051aa399642cc0a478ac7466e0729848a516c9e86bc8ad85be985b395e3b28ad89f71e3b584d857bbc1915a47a2fdaab586b7916d9a87a56235db0c683b9bbd5f000e6a218e54464043ea1e882bb906c917cd4449fdd5acadf5b017983c87b4a8b0fc9ded7a1e2e7ba359240009b06701b5cb29fa3b9250715ea31bd8784dd1d91d26764f32b9a49f934c8cf61b4d4a8f36f81d3ee33023959427d889e4a3c796d284a1fb0895184ba4351034a0280f34af119004e9b06fb1e69050fa2db039a9abc6ab00484b9a2694980197b69b9730da0b8455bf591b2eb4f9cef37a06e7c107bd56c3f7ab10ebdbc60de87bdc8c22f62c2e4db973140c5fff95631839264aabac5dd4873e44b8b2f7106c083dfff8b6403322f467a91e52cdd359293540a45134b97a39aefb6252c9c928adcb231eac0d790422a9e3bda366762e2514758badb2a2114a9ac924553d42e05d3769350e4ca047d4219f1b6fa953b60cc67b07a71dda85649af0076ec5c55ef46e73ab06613a84b2422c1bf039564a6873a9385fb18c4ab92ca7a1b205e8ad57728ccaa10b13268ca519c2a0da39be15918bc724f7760e826ab9d47cc288918b60aa87e037a60809b230562ce18c1d76bc457107c8bf80574a2cbd0f945c59d4371af14737983fc089a425d1ae74993451055ec21435a8114060baa6d774bb6ca82efec1a40df1877011163108a2b20190135900a98a337192088d8c66e9e774b02c6d55819dafd9bf3ca886d39165d1c4cf29b1abd6b185dee9671eb941ac598e1b0240d92ca7bfa119cca15a643ac29b30afeddba1acacca8b83a123102ff20b1bb94ccc16fbaefaea4fbaa36f3d46b7f5706a7ef60e04125228900261271c9ab11b04971ca5315e6f3c9eac795687da91eec532476bc66b2ba7a5650eeee119ea13c91bd94b19c31fdbd80842d25dbff62f928550b1f6183ab64443e6b0d9653c5379158af74a6436ce3a1150ea31367aacc7558c201124573235a5997773064a621869707ac661a29238421c9ce88cc38e733c75539443613d8d81c60da70e46035b343577a1660e08a67849558901d539ed84cadaecce4da36c4b9940e106011b872d1b9748cb08c2e3db4880638767bb67c74311021b6c46698a21aba391c65b9aab238d93a4ba80be911c3ba8319bc866cac3e67fee11b773ebbbb8639891809d555258dc9445fcd815af355ce2cb38552c5be069b6c7d0ba83f8495f1230f50bb57a8c4d82ea8912608cef0ca6cfe408052b736d9c6fbca2ca08e76300d150dba48080421c5a6b13f74b8f705b4eccf9c1a336a0e7a47263d30b5d1675df4a2abec7522868ba4c6139a8d22c23608c40a8bb5e8c65661b94e008ba442b9dd9883e8953029d7c4e7b46206880b48214a84cea0b34560f29054756f427d185241d946efbda04956a3972f974be20be202314d9c58dfa3543acf894d65b6f22047032e408636440024452f6c2cbb5d698730907c3271774da95b09421e499b17f670caf8585e2330394302aac52b0c1d2b2ad16656cb79257b143f555757b989c79a49730354e42299f28a166ece2a03e1a6dea08b01b9323d9958d9e320f3055c9500625b731bef77c3f30fb2960974815243f7edba28b64a58bf5afebd76b53675dbfa62b05b89f85f945c00b3de4f8ad2507121bab1a86224a9db9afe8c26513219ccc9b19156268d159097ad048f7fc245fcb93edce592a8d415d4a38502632973ed98b6f97f986dbff7e +private_key: 0be83a886381009553ee02aa62b113ea829ae09b3cf11b62d21091f1115cf548388e71abb52315ca69a4d1d601a192a4e7b494b1d3127630cec313c15c9cbc91693375a1776b51a08b56b31f38783af9c052b34b7c0cbaa4eac4618aca24dbc843322fbc666f07272a587c5c54b778aa446b349b88f2416557aa2bb9e3bc74979f3cd287645435d2ab30abf0b6e094446e95536dfb0cbafaa2e87706738b192ef721edb12d6d9a3dc366214e9752a4e8b0ac3ca5a69944ff0aa86eeaab62ca34b8fc7d74bc6eaec56612267724a038a47982fd6ab6cc726ea0e096529476329843ebe484fb7263b4e97fc2f68eb89a65ab8750ce193d9f3176bd876b69f9a826a64dac2186af796eed9469aa79660c295121367906478940099e51bc36ab67a72558425e153821ec43a560558d59b136255f655c161d729d7c21ca29a70b7bfb1b5ba66c0922947dca55d854863203064b52896e3a412a9a5afef93fda7601adc46fdc3a1d25660df46437debccbcfdc78a0d90234f0073b496d5b586a9f8b36988b33ec82c8782ab744b3355fc934544b656ed93eaa36734cb40217d680ea85476fa98d3a50c86b4a2589e85249b9a7ad01aa4afa2df396c5fda43753501bb2b614acb5bc715a113c382b6667457bc30e79e58b41b7511e011965820f2fd6c5280caa7a35c13eba57654501d6c326eda25b7a96ad0236c663d70f9b46cc798cb2a4d335f6c68181c49d669946673741285626b078401928c466c1c51922c4a62553141a86e4082f661198b07539a47283aea18c0cda348375201473a8d3f211b1770ac0dab8252468303b909d078524f10bc3d4958f7037f830b96c64c7f3a89586e3254ac823f8a4911a878c9394006429152b7260bccc60d4604d1226a87cf434e39158db5557c887207f1aa4bc9b3fbe8721dd4c96e294c2b581c78ab3997e740a86707888b6929db848ee38bfb6411110d1b5dca49dc4109f62762126d9a7d2e46400755513eca554665556d3ad2c047f011076e4fab77579c3f9f515500c7ec9747ee5b56f840994d2eb91d13c523cbcb506f011e250c23ce4243795b4e83a8f4f32308007610e23c64f38aab3aa9ac0c303edc77442a2a29ba6bfb46343e32c549d043371ab941c5982feaa30334531f61877e1515449690dc4c6a94de7cb3739c43a53a89f41ac39f0ab90622d41b48f69567c9ba5c128041426cc367ab02ec5c3b082936ded118a50c7933de5a5fb51a07f04ae11012123857bcef60e5e70a51e109382d17fb1d461a157c6b10b7eee63af1bf40626a61c2f94af7c93041676705fec9db5670777a462de3659a20ca8ec41060168c06fe925cf294cd2175e7591600492018ed70cda9266a7772103fa43c48129a1235ab1348bc5b2960140a460531ace8c01e6c136d69751f623c29bc0cad760743cc04011782790115bce926202575fddb867ddea380852b2420a7555994f91525d4a5ab5291983d87abc22407325618b04a42f8f11b203a33353245f06432778c2b3e9f08e2f9234777b00493364ee48cd5c256f15d62e03a52e5d52a849d042a84239d64a08f86a7a20334c77e332d7f886620461f0c0a86292c15180903990a68ce02d4dda33f8d34cf003a4ae80a160a27edbbb300b693f01a151d1363cc247b41c66b3eae25bdc76609d2bcc5f429540543d1db01c801137a99b1df325b88225bdf5d802c84771df545f806a0fa8f85779f56319e25d262b37f952b7bc962911822ab4f98bd65c9720208f6b0953b1d62e51937997b480497cc656341b2fea7b812c3db311784c6a17790321c1cc5021543ad7d54946d71d57c2a517b1187054725e7040cc4506de0208513366c014116fa4444bc06cf5e22e50a993ddf89f19aa14937443ce2676fa817ede4928f81394cf82b9bf629f8d33b7ec0c6b3a35c6adf0ce6480bd837655c2297833a8c150d45610a011b57224ce3b5b47e8b2895c95c24745d1e44b0cf26eee771f906089c0c864dff15da9e6c53c62371de9875030c534daa8be4719fb8a1dbdd2aa12617e4dd3b9e7c40906817398a42dbe3384fc4a4cadc098647ba4c0035774aa1d9fb85cd6d9695088271431818980ad32e4c493ea358f863853e2ae8be6ba9c978fe45b379f90aadc4b59a4c92cfe8288a3073f31f21927c546b8f148cfc133aa807fd7c233c7b5a5c3f6b8da210ef7dc5c1a834fd1559cb2439406895223991a4e682554c63ac3a117d840aa4848b1b3864edac960c656046e3bc6d3b681e1e6b49bb0259f1aa2a4329b2598b932e26c00fdae2cf4686803ca7af8bf0f1243e64544d51794583349f9854dae778894438805793b085373d09a185cda5489d74274eb7bfee433b63a56e14b95941440924cad32935440b46235a8576d11b8d65a2e8198b64b510fc1f942bd9b0f8e077fe33c559cd987615263e9b66c38c5683893c3e10965f18aa755e1bea6d1789913cf2cb21b41b23c4eecab25798ad13a26321c59e35b0517a78743c4469a4435970bbc2b9c15498b1f17cb0fccb446f67c2f437415abe98cdeb3346413539961b3dfc1c40e243296695f27152b7f7a32ff4b185ea437b275c6f617523ada8f7d2a594e277b9318019abc0051aa399642cc0a478ac7466e0729848a516c9e86bc8ad85be985b395e3b28ad89f71e3b584d857bbc1915a47a2fdaab586b7916d9a87a56235db0c683b9bbd5f000e6a218e54464043ea1e882bb906c917cd4449fdd5acadf5b017983c87b4a8b0fc9ded7a1e2e7ba359240009b06701b5cb29fa3b9250715ea31bd8784dd1d91d26764f32b9a49f934c8cf61b4d4a8f36f81d3ee33023959427d889e4a3c796d284a1fb0895184ba4351034a0280f34af119004e9b06fb1e69050fa2db039a9abc6ab00484b9a2694980197b69b9730da0b8455bf591b2eb4f9cef37a06e7c107bd56c3f7ab10ebdbc60de87bdc8c22f62c2e4db973140c5fff95631839264aabac5dd4873e44b8b2f7106c083dfff8b6403322f467a91e52cdd359293540a45134b97a39aefb6252c9c928adcb231eac0d790422a9e3bda366762e2514758badb2a2114a9ac924553d42e05d3769350e4ca047d4219f1b6fa953b60cc67b07a71dda85649af0076ec5c55ef46e73ab06613a84b2422c1bf039564a6873a9385fb18c4ab92ca7a1b205e8ad57728ccaa10b13268ca519c2a0da39be15918bc724f7760e826ab9d47cc288918b60aa87e037a60809b230562ce18c1d76bc457107c8bf80574a2cbd0f945c59d4371af14737983fc089a425d1ae74993451055ec21435a8114060baa6d774bb6ca82efec1a40df1877011163108a2b20190135900a98a337192088d8c66e9e774b02c6d55819dafd9bf3ca886d39165d1c4cf29b1abd6b185dee9671eb941ac598e1b0240d92ca7bfa119cca15a643ac29b30afeddba1acacca8b83a123102ff20b1bb94ccc16fbaefaea4fbaa36f3d46b7f5706a7ef60e04125228900261271c9ab11b04971ca5315e6f3c9eac795687da91eec532476bc66b2ba7a5650eeee119ea13c91bd94b19c31fdbd80842d25dbff62f928550b1f6183ab64443e6b0d9653c5379158af74a6436ce3a1150ea31367aacc7558c201124573235a5997773064a621869707ac661a29238421c9ce88cc38e733c75539443613d8d81c60da70e46035b343577a1660e08a67849558901d539ed84cadaecce4da36c4b9940e106011b872d1b9748cb08c2e3db4880638767bb67c74311021b6c46698a21aba391c65b9aab238d93a4ba80be911c3ba8319bc866cac3e67fee11b773ebbbb8639891809d555258dc9445fcd815af355ce2cb38552c5be069b6c7d0ba83f8495f1230f50bb57a8c4d82ea8912608cef0ca6cfe408052b736d9c6fbca2ca08e76300d150dba48080421c5a6b13f74b8f705b4eccf9c1a336a0e7a47263d30b5d1675df4a2abec7522868ba4c6139a8d22c23608c40a8bb5e8c65661b94e008ba442b9dd9883e8953029d7c4e7b46206880b48214a84cea0b34560f29054756f427d185241d946efbda04956a3972f974be20be202314d9c58dfa3543acf894d65b6f22047032e408636440024452f6c2cbb5d698730907c3271774da95b09421e499b17f670caf8585e2330394302aac52b0c1d2b2ad16656cb79257b143f555757b989c79a49730354e42299f28a166ece2a03e1a6dea08b01b9323d9958d9e320f3055c9500625b731bef77c3f30fb2960974815243f7edba28b64a58bf5afebd76b53675dbfa62b05b89f85f945c00b3de4f8ad2507121bab1a86224a9db9afe8c26513219ccc9b19156268d159097ad048f7fc245fcb93edce592a8d415d4a38502632973ed98b6f97f986dbff7e53ac28332ea3f161cf5dbc077e44f725b05ff0ac4abf95f60c5713aef1bfef4d11136e2681df2ef881b51a092a9badbe72c9772c169808521c47149578621e28 + +# Official test vector 83, seed: "16bef67f7ac3a755c59c816478b75fcc16ce5844db537791accd1ebd49d2824b105fd2e970f728c8f0cf16e439a9ae2f" +seed: 9d405d3ebdaf35fa8722de431b669722acaaea2fd10b814310b17f78b66147d16ceb14f7662be0c42779459f69a145c0e2ce9f0bd9a0cd1bf32ed5694cc9ae32 +public_key: 98c5377fa74b86746684a02b2cc8694852594b62cc0dec3c240c49b1cba8235b2b7220cca57aa380ca7f6ff96688b70299a0a52e34805ada0144632ceb704b0f08a3ad9c78dea9a9f1f556bb830cb0345ab9f2503342aee2944879ac0103caa1cfb1932062a04cf473ff372d72d500574660435b756a99635a9626f9f085faa880f8c332f674a76ab0196a3326b0e88ac19547b6e8a4cce3a3a60a9590d524e61501a41262cc67a3cf036e08e947e11c33d34895a2d4b7ed348ea8329f8e8775453a65ec242ddc6b33e6374acd4064cd8c765bb3079550c05e0054dc11b4032b33c4e9371630aff59986b95b7c729402d61c7ca3bccbadba94ecb5151bc60330379e24eb3fc36358cb83c55f18789c37c541e93b3b781d42904ed910aba5f6a4168336dc351aee66761cd17617db2962547d77fa238bc415a6f441c0f50fc2cc88dcc7049fc58c3bf3a3091458278087ab81569b607c66c6b6e4f677b4e0c3b4188dc3d3741ecb585ca68a72d0b18f18739e0194448a1da0d436f2a71fd08218283c416a0a580588932fab5903c289bce9a1b53328c70bb943660ce98773ad14a51783486268c270808cddf713160068cc8c8682ba11d4a21a3408b181625bca33491522949fe6a3ae6a2f046619114a0318fc69a3d58bc048c45ed4ac3a610ad1987629b2bd66200bc0e7b083b1b26cca00f576a2d2b8ad3c5212d956a5ee0985cc4023e9a99031f3a903934f2ec24e2ca46f06a26efc2a19fd28236e9097420337ddd61bc2b7c15fe9949acc7c279708a7365ca87b72b635aea5d67541853530f66be8da1730815852cb3c62024be50288c7ab08a3a2c442307667c8bdcbd940c0a6b91ee1657be599f13722f1d21848d189b8b389741a5ec86560f1b862eb63669753558190516964c610696e9b24a955d07bf388ca0cc4bd0861b388e5a9f1c78014da35ca594f9f1b766494b7ab4377eae61bfd8cbb5e775a4e627e2dc80c17128bb5c314be217033668c29198ce8bb27bebc79b1b4c5fd81578eb32709ac6badc3cfb7c414584bc3a38ba2ca1c9eeca55db9bc295791ba22ab54f9d22cadbc83efb58e243517abd4a93a11bd083950ec71536bc49b39c53d17b8a301a17ec0b90188c800cf2400312b76fd85a26557022909866f5591eb8017440364868c459f9039ff053e6e829ac73b2aeb81c9dfa78703c7af8efc6ee88c929183351f752a47e608638c7016026a031c289b936e06f46889e827a1e0c99ec431c763ae80e72b8e8cb87c3b7b74159596a9cc5a6c67253738e6889f5259a0ec87555e975ee50c82cd44428182827faa7b81a0abcd009a05685813e3000f9623e1c4536443811c98148fab9c8941163a57b8c7377d55a994d6ca310ad58012f51f94bcc9fae366a0591adb9a7a78e78478d1076d65c8f029867d69be153cc7f7b7c3f7f6b5f1832bea256f3f9b7f1165978eca35728115a115500677c1bd232fdf7145ed07810ea4651985a3ad7b5edb37bc21e33115d4c8c8b5094419780831c65b88a7d934bef0b9a52ca4299adb84a6d9053eb4999a92c92b353d9823896d3759c3daa69879782785017747c102e7afc0a330ae96bc2e7a4e6c4b5a637b2d85ebafc4e6c4cc676f78e29e6eb5b8a4bb942a797d78cc708ad3cd2f04217f18bb3677318d3a917db689599c009d3897d95b586e899e5855253cf54974ec4f6fe8be5a4c6804c99dbcd7c3e7407fa99b90a5586e9f180aa559a81978adba7b770a4c601980ad940ccd42eb70010254848b8c4a2886a1d835abcb9097253e2fb817425525cbd37c1b8b3a2ef47e8a15147a6a441be37e7b2579e5f74641c4731ccbaee47b1f5bd744a15284239179a70a70bb8217b1371f928b275e14c83554788687ace377888321c87eb5403cf3c93cd4c9e302b63533591d96af9aa5c47353c03171caee118bd868a6fe29575f5881c5a5bc7f67a2dd5457efd71329473364d509b02914d543843cc3b36e213e27facd6f0369f165adcbb314f9c4c8930564b9f5aaf21c82860035e9f729dfd30584b8cd6735aafff819f9d244cf8bcf9ec15770903a3cfbbfaa385cb960692923b88364100ff67a2dca71154700e0594dfd66ae557ccc6ff36519a2252adba29881b7dd1283d3b621b40acdb3bc22fae51c5a64488a3993ab8fdefb1682784edd39f0fd80883fa378cde6eff656f57119177c56a9 +private_key: 974b92e8755220ba2f34234c9c59c29de41c7b9967d54334aa259f05a73e43285e4a6ab005a36528153c5599b79fb680f2d82559b68bd3a46b159c3f2e28c960d6cbf8c103aa205fdd885bcbe2c48723b789766038678d15f72ecb96afbd340d4a17ad153a8f31a1c6b0f8291f6b5a1a4979197ba6cad90c26e25f6424cd1e856c0fb5ac336a01c7e5c472c575ae15a5264263d3f82c11a8111ad7a88d536884c664c4a52d4adb85f1a3567f48cfe068c038f5c10813a99ec6c605920cd481a6d6e0ba5409a65c6168f3d5a34e3b1fffd16bc5522d7861441300c550022ef3235c85f5a1fdb6b7c4742a42351e957666a66aa918d959a4f10d24533abb63196f44426f19302b3c0651779c690ca0a108710f4a8fa001a25f6619a49768416886c5d34dc8ec3eb4a89824e04e67cbc87dcc392d64004b5386f40796c71c017e133cd7853f2955289d7a52d7388dffa436ad1363c03902b15128285341217a0832f094bc37733826c13c0886e123a490741ee0859923ec825d26aa4a3ba5c094728f83956596a14f12b4b0958fe01bca0cf557265a5b5f367917d3841e3c16b1dba445038cb95542f7276f906136e7f76c32ea23d78183acc4bbd4067e08e3379ca47c2f37a4aeb1b2c4e4023b8b241993bfce492ab7fb26950b4ac8c5bb1f7bc209957d72a2a87d0b37e0d74c08268bd81822d4272f6048997e9449579b4f972bbbdf1a2083f49996725c68693eacd63d98f3bae3fba88dac46eba99ed324c5ba3523c5398df6035dfdb82e48a49acc15b823d51d812cafa9ea7041bb1d6b848cc4c1cb0bc67ef6a7a6d9b013f3356f353b1dc5c5934fe483099300a800c82d7513d8286e64d5b87882c03cfb1c981b2613d5981f92026f46403286136fe40272841eae68c34e56363226cfaf0c7fb4a64fd094a7cb3b1b8dfc7bafc2552bf98ec7e8967b46c70e4c0eb649a8f0464612d08b69a72b5a89820f1c1fd8e19a55526f592a79dc1a475d16099ec133b21c973c90160d68cf4ed7282096265df929b43b0b265982b4a78a72317cd603c09f70b622b14c31f52f68a6572d749b60b92bcf4a7f3c539da10c8c3c3c4131ec88485225955b63fe8617703c499f9201bdb583d07cc0077347e28b0275a26cf2e600122b73d8b22bfe17cb4a48183211a4c7a83f8002004dea91bc2863b6b9086dd7a8965795392cbc188739702ca7ee84c85c867fc45431a7579dad1bcdf5162d876499b039571174c44d679a7475a156ea73c14113aa206223e90a63c8b450369a89fa59fb65ac7ec1ce8e830b84a9a330e63f7f494a32867f6a815546d100fec9482771871376ccd5aa649293c57800792275349baba6589327dd883053f59d13695c41ea73c8b832a5521bc234a73bf668c80c7665a9aa98c0560da4a6e9ccb0cd7c77ef39670a731a53a85606911b900866a8d272abf56f31dca4d15c7ad19c8d4bb31d9e545c84687fb50757f54ba51d283dafa480c2aacd8c0206877948e1b8215088ab3c0b019eb42956a00e00e875dd4594175ca709164fea4a0b3f819e4dd57ef4d2016e799e5d645e8a47267bf714c88080d7329a8f075af812b3c7acbfa0dbb477b93b789b76ce445c58b9b977a681e6b22730e35a82851f40649a3231bd7fa1a19ff859ad1b007a30413087c0b98a31c9423753f3c2feec9edcd1cd2fd7a930fc08e811cf49762d792513719b370b7c809de37bbd53879b533fed6295e3318a03cc94c1f81ccb563afbb72bf6643c9a80c333134c8734360dfb4f001b27f58b625cc50e20acabf7e1165d0a22bd96ac403440eb802e5fda4d0653491979b331f0ce326a8365281b18ec83bd33319bb7149c192ebe202c6e2c2ad69313c12bc1c0b56599b90bef70a8e70b60b72570bb49c207524850e8a7b549bc07b660e5d26ea8d94a5d1a59a9c8ab17196000c97f48e2b3f060c8b2236f6cc60f6ee09d019cc631809c91da3ecb2544ca4237f37a20c2a82397e3be1f0cb7af6c693b994c8b811537e9007ce088f0fa4c02203b9e08388b186e3be11093e218c8c3763e9810c9760e26d6c90c6400c349cf22069b86dca993f36a303436166bbac8db1cb9e2a37c155f0f678dab52abeeca048b1813d63b42b2a986ae296e3f027854393dcf47004942ce611b9a82a54098c5377fa74b86746684a02b2cc8694852594b62cc0dec3c240c49b1cba8235b2b7220cca57aa380ca7f6ff96688b70299a0a52e34805ada0144632ceb704b0f08a3ad9c78dea9a9f1f556bb830cb0345ab9f2503342aee2944879ac0103caa1cfb1932062a04cf473ff372d72d500574660435b756a99635a9626f9f085faa880f8c332f674a76ab0196a3326b0e88ac19547b6e8a4cce3a3a60a9590d524e61501a41262cc67a3cf036e08e947e11c33d34895a2d4b7ed348ea8329f8e8775453a65ec242ddc6b33e6374acd4064cd8c765bb3079550c05e0054dc11b4032b33c4e9371630aff59986b95b7c729402d61c7ca3bccbadba94ecb5151bc60330379e24eb3fc36358cb83c55f18789c37c541e93b3b781d42904ed910aba5f6a4168336dc351aee66761cd17617db2962547d77fa238bc415a6f441c0f50fc2cc88dcc7049fc58c3bf3a3091458278087ab81569b607c66c6b6e4f677b4e0c3b4188dc3d3741ecb585ca68a72d0b18f18739e0194448a1da0d436f2a71fd08218283c416a0a580588932fab5903c289bce9a1b53328c70bb943660ce98773ad14a51783486268c270808cddf713160068cc8c8682ba11d4a21a3408b181625bca33491522949fe6a3ae6a2f046619114a0318fc69a3d58bc048c45ed4ac3a610ad1987629b2bd66200bc0e7b083b1b26cca00f576a2d2b8ad3c5212d956a5ee0985cc4023e9a99031f3a903934f2ec24e2ca46f06a26efc2a19fd28236e9097420337ddd61bc2b7c15fe9949acc7c279708a7365ca87b72b635aea5d67541853530f66be8da1730815852cb3c62024be50288c7ab08a3a2c442307667c8bdcbd940c0a6b91ee1657be599f13722f1d21848d189b8b389741a5ec86560f1b862eb63669753558190516964c610696e9b24a955d07bf388ca0cc4bd0861b388e5a9f1c78014da35ca594f9f1b766494b7ab4377eae61bfd8cbb5e775a4e627e2dc80c17128bb5c314be217033668c29198ce8bb27bebc79b1b4c5fd81578eb32709ac6badc3cfb7c414584bc3a38ba2ca1c9eeca55db9bc295791ba22ab54f9d22cadbc83efb58e243517abd4a93a11bd083950ec71536bc49b39c53d17b8a301a17ec0b90188c800cf2400312b76fd85a26557022909866f5591eb8017440364868c459f9039ff053e6e829ac73b2aeb81c9dfa78703c7af8efc6ee88c929183351f752a47e608638c7016026a031c289b936e06f46889e827a1e0c99ec431c763ae80e72b8e8cb87c3b7b74159596a9cc5a6c67253738e6889f5259a0ec87555e975ee50c82cd44428182827faa7b81a0abcd009a05685813e3000f9623e1c4536443811c98148fab9c8941163a57b8c7377d55a994d6ca310ad58012f51f94bcc9fae366a0591adb9a7a78e78478d1076d65c8f029867d69be153cc7f7b7c3f7f6b5f1832bea256f3f9b7f1165978eca35728115a115500677c1bd232fdf7145ed07810ea4651985a3ad7b5edb37bc21e33115d4c8c8b5094419780831c65b88a7d934bef0b9a52ca4299adb84a6d9053eb4999a92c92b353d9823896d3759c3daa69879782785017747c102e7afc0a330ae96bc2e7a4e6c4b5a637b2d85ebafc4e6c4cc676f78e29e6eb5b8a4bb942a797d78cc708ad3cd2f04217f18bb3677318d3a917db689599c009d3897d95b586e899e5855253cf54974ec4f6fe8be5a4c6804c99dbcd7c3e7407fa99b90a5586e9f180aa559a81978adba7b770a4c601980ad940ccd42eb70010254848b8c4a2886a1d835abcb9097253e2fb817425525cbd37c1b8b3a2ef47e8a15147a6a441be37e7b2579e5f74641c4731ccbaee47b1f5bd744a15284239179a70a70bb8217b1371f928b275e14c83554788687ace377888321c87eb5403cf3c93cd4c9e302b63533591d96af9aa5c47353c03171caee118bd868a6fe29575f5881c5a5bc7f67a2dd5457efd71329473364d509b02914d543843cc3b36e213e27facd6f0369f165adcbb314f9c4c8930564b9f5aaf21c82860035e9f729dfd30584b8cd6735aafff819f9d244cf8bcf9ec15770903a3cfbbfaa385cb960692923b88364100ff67a2dca71154700e0594dfd66ae557ccc6ff36519a2252adba29881b7dd1283d3b621b40acdb3bc22fae51c5a64488a3993ab8fdefb1682784edd39f0fd80883fa378cde6eff656f57119177c56a90b6cae64de81b6f1395296905389da76ca7c5435e1c4b2d93cc5c303d31bc0536ceb14f7662be0c42779459f69a145c0e2ce9f0bd9a0cd1bf32ed5694cc9ae32 + +# Official test vector 84, seed: "d0611f9ae5be4da5d7eadc9109944348e716cb3daee545721eea8c892e7831cf2e54603146454cbfd92387739e9a78d8" +seed: 9a86490f0615f3edf789cb0654066e9ee339cc59f968281f3b89213f83c692edfaeb2ef44d2f608621e831187ce79b2d2f4a20f1568bbe76b0d3d5af36111714 +public_key: e5bc009432c97a66bea57133df41cd6d6095a69192226c8a1c6a0416dc13bcd39cee2867e991102ab5c7ee37ab23d33e113b3e7766b7c652cd0fe03fdcf38653149139b532ac46b7e80229c2576c44834080b75d9f2490d79a23e6d6cba707458c90c7bb758e3c7049d5868b32e2c50441b280bb1fe7528924181051a9b35c6ac779645e6554b5deb21959754f3a47454837b9512820d04722a884b10e01b5acec05aecc2a778091bdab81f0091ed67a7c7d062085866df21734959206733257294a4c82a7295a739638141aa3821c764891fdbb64dbc6aebb67a8c82caf86f7248afbbce556055405ada63ac9f6423de12447d89746fea494662a69a021733592a0fed82749e73d4c2c9d192c994a535f126700a6c4cee988945353c9e9d2240828bb674bc98f22a298fb6750da5ee76345ee1b2dfda01862d2116e6607d3c251ade46ef82974ebd2a14502684be1cc3eea46cf3c2b3c4c14178a79fb495a44275cfbdb5a23ac7b8a911d7ee2ac0672b997cca5d4442a5d80be02c149c0c333caea0090937df91491f3e03ca3f8c85357001e4b0c1c9a73be64abbd7c68776179d4696fa138834325715e115584c368b720ac8eaa45aa4176e9860200cb56c41143985a6bae63aa16733464acb2cc948a949528bf6a91156a3a6bfb55bbe1980d499543720cfd435289c880ad10a4e990cfa2548f17bab1fa31a45eec41361198daf50f22a271c7f1acb7f70463b9b4c82b71228644b3421325b09de2946b829b31e56b0c95727c762b5b5d078c1bb46ff2596b4db6863987c69b26225bb9595d612a5a464d84b6bc775701fa5559d5c8cb55bb30e2e3bad532125ce9c790774dafacb19f4c9dea8abb25b26a6c6a51e27205b0d2031938a9f1700d353c2997e935461b121149a16f7a133af9a103b34e2d3180516a5421243769eabc81952a407486e2111238d99bee90554c32aa12e774dd9b17a5d98cd68029f1bc8671a9015591cfee86bfb8712a5948b9455caa51074db3771f89e74695524fe030aecf998b6eeb301d865f67b9bf4718476026ab3161c77f677fe77a301f357caefac5e579bbd0b34b51b8b58eb71c44c52dc669b9341670bb653ca363096d691680c95a0086601448c619050486b6c244eacaa0198f77d987c5083853b0b9b5531a716a10e7517484a36e38e465e4c855164b2091c8a23e5b2f220524285c739d8b519f55ab1d6c4505ca6a00f6cb6de0a16e1355c1c8824ea571611b8a3925c4fc64a5de44a2a1bb189d48aafefa13ace52290a615b5b4339008181d428f3d33267cc135a2649eb113c023432132a0b93bf08203b40ef0e6465c1ba8a1fa517c37c3d363b80d25c70248c52010cd995a866c8004eba1ae03e56e4783453e52609d6c84264c836857a24f2955fa955041a44c6157bd2e627124fb102ea2bf87b1ac628a393fe09968d707c0f27105b491e19c34dccc207367ae309cc1a0f0cb0072781c63642823623b2239335a73db76bd449b401cf5636114a22863b50ee32bd4804006f13dd66b44058b43be960e9a3a5adc3437298b05c7b314d3fb9d4c7020b64b6488f70a73811d934bc0a81677d1664bb497949b757b02e074e76c8a2e65410158973e30a2a9b6b034c0baaa22cd62a421bc25c7bfda61d0578c1436b808540cbb608cfcb78c8af6a43188bc26f637ab479a1ce86242766d9daaccd93c13d1885c7c994acb657fab0a75de17037f637076f2099560799520182b8265f9ea8440ba9e07b084efa2a6cb244d7db1a39b10297eda34bdc82bcb6a2ee871bf13c1cb8ee602c0b3818335895e754ebe75476ee1786d4ccb52c7164c33a76a3b3e2b57b170c34d37295d22e2351be21a95b6495432a1a5e8489edabe9b71a4459a4ea08b8dd65c4fbeb66a5058cfe7706d8e09381979b608230c7430879bbbc30a6150af273cc4d52c5f1c43e723a036530eddf0cbbfb6ba091b0861f1c751530ce52c947743a59595c15e529104a892e089b912975c7c598b1de528983b5a66a7a66c459610f63e95a7b1198b4e42710d69ea7a8fc3880c0876da82ce872952120a666aaccd5b1001b6b99877610071249db481117cd69f6a252ccaf1a64b45c84c2004eea971ade4659e3508e7b623fd9658f1ac8789297a8dfb3de7b385d927b522126a05aaf40635372f59af9ed4e64cd55048057d8b30c04fe6c876b8a67009 +private_key: b3d43c1965522268cac5210ff79934c1420c14030e9da56e02e26afda97824904fdf2a107a37baef774ca7a87030b1662b97cf678bc3bcf7586d78285bc44a9bbc546a7b1f48491f30f2939c11516ee6cced064d0647950e004cf966045b871093cb8a42b9c903c5802bacc2aab484d35b319a0025c330208913220c2a8033b4152eb39b08fbbd468c754dfb47cdf790a300be561c004047826a03a175c285b5ca718919a119fb80f1f43e6bb00efbd44c1d67c853c118604cbf2b980cf312caf81793558050ffa5bb3643cd86788c6f5734cf652eca45301ea97283f6c52da4adcba71ed4e1acd3499188d555082aa43fac55e8e45bae0c023801133edcb2a5665bfb7829620ba4e21c746ac2c1e46c4000d93af973810a881c1640562426424647752f162d2e65bba6020143ab7fc2486401a30f36e3a81040b4442382608a02c4031cdd6a9569229fee9c87e668a77e9bce352704b8220136f3439c37c05c917eee0578cb2c689a907e2b2544d26444b1f0a11c0c34b2bb0806a072e39c6952e28a08515dfddc80e19413a2a3ae74092d34c2cd71e770deb1cdb1e15a497a0def06b14b6cafd066713f44a77755a7909bb4e90301a995c280982249714a72773493f060f6175a51f61a340022e69125716661d235b5ac124dc381a15fb356dddb3623c53fcefb0865d18c0a4b1f028704d50313dd0bc80f674d563588eab3712a5c4903f27c4a9a3440443c31c2bf51f21fa9e6417a5479c2b5be1a242ff9ab5da06124f7544172456115481e8441aeb7a8a01f218e286b9b52d5618cd0b05fc99a02a24420a359c3a7a09beca408915d4ffbaaa4865f37670f8744548b5bb8ceb9bf1deb799ca06483d521e44b63c9e485bb75c8e32c42247b5fdbc137856cbce035cec6e1323c9a04aa154585f8a9a6c08dccc720a3690d6192ca6e63990a5a9c7ef519808c68819a66394829025543bd3a823f729b98175b5e2576bf557609f50212524691f7b6bbd91a877a0b297c7facf50967059e2fb23caee12093ac230505a4d8d8963cc05277361c371b4a50cc638882b068883de6d69ef590a33a384deff6b618f9199099734e7b9c951b8318030a9cc92496db0e03e738e0a64d1d24afe6274e5e58b364ab1626fb188a91b35eda4156c483830c2f603138a660310cb39dfc490e510b88b5ac4ac9006e6888b33b992b8343c71085ad4311356cd5563e03c75517c99e9bb59188abd8880559d0b8fa290274dc6fa70bc97fc552f4a76b901a212f0364c584717a39a6e66568bbe0a277f9bffe8355072c75d6c4cfc7ec7bb644b8932b41d191a058f2cfda77cb3e876d00ad4b3b80aa7e1b83b031a4e3f891ff747b17782f633324aff6afb58975cbcc0e14fbc9f90584c51b049e6170af720cc36c9acd7002aba933b685b34c665e90a4219d6721a71b79402acb2e53480865b62dc97432d800be255e7565b5f7ba6ca39c6fa443ceb79308ec9c2527a799cc75535082bfb4a5246ef8026ef925dec7164bdba472db7919b17458f83386764b84e83e51e20b41346d424c65b7949a9db6ab79b091f3a980448c0d253c36e9808d586c6e55e669c40bb9633a156733c76aa709b4bc9a877717b5bc4b0cd91ef75c0272119370b8401c815c129836ef785faffb25ec787188f40990f986961c5e785b9e6627913f7b2163408a7f99329314305c0b330bfb0ee5759016b4232e06b627b84f6b51843e34425deb2bb8e10566e91b37a3657c2ca240f57711420094134c9242936c4a76582686db9001635723c63795451537831460d0b4140fc811ca977fa2eb7bab8a597a162336790697ec94ee684dfdf649e327cf61a15f2a6262a3001c5a342ace47b394626439b313f9e21382987ecfa533d09c6a489b2ff84c63c0f5b4c3f8895d2283cd59305ca7248c6b293ae1b4b3071e5cba9058706a1ea9add7fcafa2c50b86ca10e3a951a5fab5a0015ef09901b36b4f4055087a5361ace4a1d2acbcdff1048fe17bd84b6c4dc05bdf4c453d18c6250a8ecb69b3da26cadde7711c0520a59ac94ee57b77a6aa13db76bfc40af90161e3634459b3263ae233178796148b592271408ff06b5ec012f5c082e107510907bb36e330d5c9bdd1245242d724a6d438085a30705662eef25fb465a9aa584ee5bc009432c97a66bea57133df41cd6d6095a69192226c8a1c6a0416dc13bcd39cee2867e991102ab5c7ee37ab23d33e113b3e7766b7c652cd0fe03fdcf38653149139b532ac46b7e80229c2576c44834080b75d9f2490d79a23e6d6cba707458c90c7bb758e3c7049d5868b32e2c50441b280bb1fe7528924181051a9b35c6ac779645e6554b5deb21959754f3a47454837b9512820d04722a884b10e01b5acec05aecc2a778091bdab81f0091ed67a7c7d062085866df21734959206733257294a4c82a7295a739638141aa3821c764891fdbb64dbc6aebb67a8c82caf86f7248afbbce556055405ada63ac9f6423de12447d89746fea494662a69a021733592a0fed82749e73d4c2c9d192c994a535f126700a6c4cee988945353c9e9d2240828bb674bc98f22a298fb6750da5ee76345ee1b2dfda01862d2116e6607d3c251ade46ef82974ebd2a14502684be1cc3eea46cf3c2b3c4c14178a79fb495a44275cfbdb5a23ac7b8a911d7ee2ac0672b997cca5d4442a5d80be02c149c0c333caea0090937df91491f3e03ca3f8c85357001e4b0c1c9a73be64abbd7c68776179d4696fa138834325715e115584c368b720ac8eaa45aa4176e9860200cb56c41143985a6bae63aa16733464acb2cc948a949528bf6a91156a3a6bfb55bbe1980d499543720cfd435289c880ad10a4e990cfa2548f17bab1fa31a45eec41361198daf50f22a271c7f1acb7f70463b9b4c82b71228644b3421325b09de2946b829b31e56b0c95727c762b5b5d078c1bb46ff2596b4db6863987c69b26225bb9595d612a5a464d84b6bc775701fa5559d5c8cb55bb30e2e3bad532125ce9c790774dafacb19f4c9dea8abb25b26a6c6a51e27205b0d2031938a9f1700d353c2997e935461b121149a16f7a133af9a103b34e2d3180516a5421243769eabc81952a407486e2111238d99bee90554c32aa12e774dd9b17a5d98cd68029f1bc8671a9015591cfee86bfb8712a5948b9455caa51074db3771f89e74695524fe030aecf998b6eeb301d865f67b9bf4718476026ab3161c77f677fe77a301f357caefac5e579bbd0b34b51b8b58eb71c44c52dc669b9341670bb653ca363096d691680c95a0086601448c619050486b6c244eacaa0198f77d987c5083853b0b9b5531a716a10e7517484a36e38e465e4c855164b2091c8a23e5b2f220524285c739d8b519f55ab1d6c4505ca6a00f6cb6de0a16e1355c1c8824ea571611b8a3925c4fc64a5de44a2a1bb189d48aafefa13ace52290a615b5b4339008181d428f3d33267cc135a2649eb113c023432132a0b93bf08203b40ef0e6465c1ba8a1fa517c37c3d363b80d25c70248c52010cd995a866c8004eba1ae03e56e4783453e52609d6c84264c836857a24f2955fa955041a44c6157bd2e627124fb102ea2bf87b1ac628a393fe09968d707c0f27105b491e19c34dccc207367ae309cc1a0f0cb0072781c63642823623b2239335a73db76bd449b401cf5636114a22863b50ee32bd4804006f13dd66b44058b43be960e9a3a5adc3437298b05c7b314d3fb9d4c7020b64b6488f70a73811d934bc0a81677d1664bb497949b757b02e074e76c8a2e65410158973e30a2a9b6b034c0baaa22cd62a421bc25c7bfda61d0578c1436b808540cbb608cfcb78c8af6a43188bc26f637ab479a1ce86242766d9daaccd93c13d1885c7c994acb657fab0a75de17037f637076f2099560799520182b8265f9ea8440ba9e07b084efa2a6cb244d7db1a39b10297eda34bdc82bcb6a2ee871bf13c1cb8ee602c0b3818335895e754ebe75476ee1786d4ccb52c7164c33a76a3b3e2b57b170c34d37295d22e2351be21a95b6495432a1a5e8489edabe9b71a4459a4ea08b8dd65c4fbeb66a5058cfe7706d8e09381979b608230c7430879bbbc30a6150af273cc4d52c5f1c43e723a036530eddf0cbbfb6ba091b0861f1c751530ce52c947743a59595c15e529104a892e089b912975c7c598b1de528983b5a66a7a66c459610f63e95a7b1198b4e42710d69ea7a8fc3880c0876da82ce872952120a666aaccd5b1001b6b99877610071249db481117cd69f6a252ccaf1a64b45c84c2004eea971ade4659e3508e7b623fd9658f1ac8789297a8dfb3de7b385d927b522126a05aaf40635372f59af9ed4e64cd55048057d8b30c04fe6c876b8a67009f33aa451c6ad54d556d60210a23da8fb68662c39a1e08d893e1d1e784fb71702faeb2ef44d2f608621e831187ce79b2d2f4a20f1568bbe76b0d3d5af36111714 + +# Official test vector 85, seed: "fbc38d7614d7718e931edb850d2c6f0c5eea9ee889b3e25bd69ac255d5b91e885d93e808e66bf9c88c655dc594da5792" +seed: 6dfd9b575872560c7bdc2732c4a28dac4db04e535eb8e402c3dffd145c09ce47a2985c1c4d203778597947d710dec806e36b0cd949fe460ef141213bfc525e5b +public_key: 5e8ca56e95a1b844147c6011e93057b8d35b6d6052ca045cc1d8444c1b603ff211fc67653a03cf7d3930373206d4ac62090712be287eb6404843c5c1208b0b993c028a445be50550e2b5625e3124bc58b256eb0886e74ec7f0c4d082a143139222b80037b61649e1b4f3079c3f12cd9742486de788ac1a987c158f5d20296742af5953617a5608b5b965ce1cc261139655a09936f555ad8882f3d7b823c400fb7056abd05bc4cc18636141a3f0c0688b5cc04455b768be41096eb7676315f808953c8aa95656e4686c89078e36290fb0b01697c56e41a0bdb7c9c6c6ab8f50eaadae889fb9e0a41d757ec6756bb6e690819b95bd02386398817e1c9ad7db807a842e75017f5bc6b46fa6cd1580993c1238aa197931c9b55d333e953420dec916dcb00b657b5c6fb538468a855e830f1afb9eb356098e12226a7a0718919dfee4ce6e275211804079bca97f291355790aeff36f7baa99c79ca6a4fb1979331494407b33cc6fef3663fa018e28d76e49eb1b5fa828fd7aa270f917e143a9a7938bd9a05d9e483a2d7725061a88588c3df6935ed6c411a149c634d0376decc87d2988954671c8e9249f517ea3d939af8a71d505a628958c634221f11ba962aaab9fc91565fb647973633a4946976b379199105eaa8e8721a12ef43325f08fe6e173bac2243ef74f92074d7e96124d70b3327839806876a6d6b982219bbce5499bc56df2b45af9cb67e3eb878d02b881a5ce9ec55b98808c48a2c963d8854f0172083c9bd2f55b15f6ac7ad7156af33fed0a5b6b668d654b602cbc3e3f9b81b3eb3c476b5bab8b6c886528ae4699e3768b51cc7f48ea9304d77cc8a708ed08321e97228ecb97aec4ba224baf4e684fcf62753985c8ea07c86f501433f40c21f6903cc8166a7332c0b6a8a9c121c41c35690413e98a1a0fc672fb1cad48d74044811f5c7363d7b03fafe2a6a3634d850cb4fb505547b72daa710babe7165b50ba090338f6001d8744041b5b3db9dc2bef60c5b73928889975f51548ab72b4b88a85cbe2457810115a9121f72a3d8dd6bd0c0b2476b2bb9e69a7e613a83d820670596353944a26a16115fca33c505a4dbc5c1136ae3a981da1d1a4b2c25ca0d5474916675ec8817a969e78812414053a4d0245d86119e1072c8dca8c211b9bf3c91fee350f2a0a392c4017c5705655f26657c5090206270140bb93718c37918b4ce79918a9356161b00f09a43aea259ff94d0dbc95a6b83eda5326397750c68cc6b498ce974235484aa453334e05c8232dba3dd1a182ba4543b4a944a5220c46d56812e125c06bba360ba7759cca24a1cc02b13ee9fb75ce8459df3c601da31ad552c153f789905a105929a223e3101f32431f346bcec3a128b0a3c3d4290d270b34e643e17bb5d53b6d248455502c71edd01654d028525576e3422bdf69571e9c10cf3c3c30227c89e2ce0c62911e5014b78b0cdabab060579ebf1a517414bbe5343bf33311c0ab1f659b3d30727184ec1aa8f1c3a3db45fbe215aca961fcd8ce98429d381995280ca0e5e78cde55442518476e0b404a2668424719abe71d64083ff8b63f285396f5989dd4aa9332426eece567d8098951e141ec43747c17cd9b1805f9245e0819ae416c61f3c60818ea448d397211e8b97e755494f0403a133abcd0882ab907e55a130528a5ac535ade736081d1cabd62980355cf85f84559ea36d6d3855030c341babcf65a20c9bb67ed4901f8b2617c7b9c8466976da39c6780003b71a74f6a16339082e6a62458835d30f1b32041bf9ed21c65ec59db3044dae0654e743a5e65836a4b9c5d2c9c4de859b1a6755ae7860fa6053de71aca0a61cdaa34eea773867a7ce66654380219c7b756d117a81e1c1f81156c6d5cccfbdb285c831317e5cfb8fc50b673600bb46469bb3c7c6072d87cc3b17bbb65b95e81875548b63e3024a24a329a4bb1404ff862ef10bcbe6a997c847650b5402b888e0d71c900d4a4a4cc429d717d3860a6615869f734244a0b25cd463371b189a243733469bb5dd97cb3e856cdf2ae64fcb519d9be1a75aa8794542f51bd67878e9a1b8f6d70a650b05b6a609ca9f477579264b127230966a289295719158b63931a3c0cb764e4847c9ac8bb91598b905a650a0123c7c0fb939f7e3943a2f3bafa20a221f37dc17933cf5e868b958e4e7cea4cfd021ef0ba63ff7a7250d21513171d5e +private_key: d246b3612b31d8212a89f347bc6411c7f73e78e23a18fa3972a98dcd857165c070dfbbc8f62197e22b40e2021d5bb1384862c61a6380e042b3714695c515c5a984abfedb949f91c0ae23c4eda48a276c9cc9e6911fbb4b20620875127704ebce55db5300ea34a1c76de6a09c7933a1740552762a2d1d0754192019792a068942574037b949830c2121639e630449b1bfcd02970ea8887f4ba1cf278d819b14f9b58be74566846c742ae150a70380fd0ab9ce2557b2349890969af0bba2fa05335c28b2b125806c637ff4b70095f66e41c136ae3b400323cb04909c035b3c6aa4c5676590ab448c0e6aad6f246a6c59938ac3a56afa0e4e23844220741c93507c445a9efc53c7e6298305c5db623d6469c15a4bc597d1af24a532aa935aacba42da1831b8fcc344088b090a1b08031bb2364e2923afa448a6a7a56c45a90181527776a70858631fe304acdbd37036c83f976991ce8aa99c2252b73c6e54ca894301832c129dfa45b59a023ee45229cb8b3e34805b4d4590e857bcba451e9b6c009abb9a92a19b61f2b814325860680934f30847b5895a430b843969b24cb6dd1c66900569088897821aa058c2c814f3b7a0b14893f96fb241029141c90f63954709187186538b36c4c44536503056d740536d8212236925df8c7a5a19ab01c70a5100759ff5b46aa5c78a8833dc48288bb432b2e741d1746f0f81245982395c39ae716bb35eab66551a1f3c59b873487097d8748a285fdd1a6fbb963e3db4207159256f2121ad6216df07628ac607c1faa3e6b158c5b218cae892cf457dfc29acf2e24bc3672d57e014f4143d301a3e00e276f0066178bc08d66cb163157fa534c96d304e489b22ece80509e8437e23b556217c42b64be26a3f9a445dc830746b47c011ba941b118965f52f44d126e5087c81368b42f1b73195cecde34238f2300d909937722f3d2c999daab1b395851db4cdf4152fb699c7794977d819988020836a185f62a57e1ed656166ccf27f50482c517d7d09b65f0af06651fb15052aa65813b3b1bd1c33bdab745d9a2a2d7373e9d6b8445e9a35f17a8e47c79fd768be8f37dbe19a686ec6887d510f8e2181692282557458678c6d8c90cf1208c8470798f4799b5c2c63e0c350b46091b1a40286c7ad955ac7935965d944baf0ba45ad10512c698d4c6a117ba3132e06812d10d13708285948bbaaa728d2b74e612a5a1f3545fa937a11496add908c932849d577b2a7115b4b47e67e543fb36a809d6cc369a1cb3ba357e332b93276b3af902433b81fe546aa47a322b4812d4955bac7365f4e33e767068e5928119baaa867740068351cf70b75e2998b6e77ee1d80409d6b2d97c9732861cd9acc05b1a1faff8a944537eb56b06c3c520365bb405780d12016baf661bce454e6da89507267aa0fcc880078728d12ec0e6b364c60e6d589e50b7371a66caad262b729a0d34b08f0798951be0c7d6798aa99670d9106a186001b93ba137461c0d3b8da691194f0a9ffbda4418bc2e97076b8ae3a4fc700531c502febbbfc766131dd4b00546151ba804ef08998ed9346c596d804473c54ab8d6f64ae654890a54a3ceb9201a74816d086fa121034a6661a20295bdca444b1c64c9b77e235cadb4c08d75b5c02f62401208578442bd44b2615d3869f8526fc6f71a08b4a1e2398b81e86fdf3b89a3453569a66e52d5bbbdd670f173529d30950ab1b9166821e8538effc1495fd0c268baa07e5212fc41385bc0a902d85f5f2093601c77b43bb865559cab77b4e6d89b5a7a0a6d069e5ff839a77603ee4ab29a331c6f9b64aa626755e61648992003a556c210345f33c2300c3504f33fc57c32ec196b1a9a353f04020bb16818136d32737dd4c92f7b4656a83580ff053ad4d6a13ea364431ab1f3d8ac1f510d3fa25d8c33084a10ba42a50943fa22ee420bc7d656492952e157a689c73cf8d45487293b0c8c4245b410848670d66ca54a3a3e016b36fc1227ffcb63b9310b8dd73bfa405b3da64c69a64173c15000f88dcec5007e58bb05a81672e02414612829cb7e25637a77c49d434a44f4874bb4f27b3584cf85b3c73e2b9e0ba2a92b977e9c194584b04c3e8c37d9b7404e77802c05b50b3acce5b46e54c7354087321b4822cab148137459124caa95197546f8b65e8ca56e95a1b844147c6011e93057b8d35b6d6052ca045cc1d8444c1b603ff211fc67653a03cf7d3930373206d4ac62090712be287eb6404843c5c1208b0b993c028a445be50550e2b5625e3124bc58b256eb0886e74ec7f0c4d082a143139222b80037b61649e1b4f3079c3f12cd9742486de788ac1a987c158f5d20296742af5953617a5608b5b965ce1cc261139655a09936f555ad8882f3d7b823c400fb7056abd05bc4cc18636141a3f0c0688b5cc04455b768be41096eb7676315f808953c8aa95656e4686c89078e36290fb0b01697c56e41a0bdb7c9c6c6ab8f50eaadae889fb9e0a41d757ec6756bb6e690819b95bd02386398817e1c9ad7db807a842e75017f5bc6b46fa6cd1580993c1238aa197931c9b55d333e953420dec916dcb00b657b5c6fb538468a855e830f1afb9eb356098e12226a7a0718919dfee4ce6e275211804079bca97f291355790aeff36f7baa99c79ca6a4fb1979331494407b33cc6fef3663fa018e28d76e49eb1b5fa828fd7aa270f917e143a9a7938bd9a05d9e483a2d7725061a88588c3df6935ed6c411a149c634d0376decc87d2988954671c8e9249f517ea3d939af8a71d505a628958c634221f11ba962aaab9fc91565fb647973633a4946976b379199105eaa8e8721a12ef43325f08fe6e173bac2243ef74f92074d7e96124d70b3327839806876a6d6b982219bbce5499bc56df2b45af9cb67e3eb878d02b881a5ce9ec55b98808c48a2c963d8854f0172083c9bd2f55b15f6ac7ad7156af33fed0a5b6b668d654b602cbc3e3f9b81b3eb3c476b5bab8b6c886528ae4699e3768b51cc7f48ea9304d77cc8a708ed08321e97228ecb97aec4ba224baf4e684fcf62753985c8ea07c86f501433f40c21f6903cc8166a7332c0b6a8a9c121c41c35690413e98a1a0fc672fb1cad48d74044811f5c7363d7b03fafe2a6a3634d850cb4fb505547b72daa710babe7165b50ba090338f6001d8744041b5b3db9dc2bef60c5b73928889975f51548ab72b4b88a85cbe2457810115a9121f72a3d8dd6bd0c0b2476b2bb9e69a7e613a83d820670596353944a26a16115fca33c505a4dbc5c1136ae3a981da1d1a4b2c25ca0d5474916675ec8817a969e78812414053a4d0245d86119e1072c8dca8c211b9bf3c91fee350f2a0a392c4017c5705655f26657c5090206270140bb93718c37918b4ce79918a9356161b00f09a43aea259ff94d0dbc95a6b83eda5326397750c68cc6b498ce974235484aa453334e05c8232dba3dd1a182ba4543b4a944a5220c46d56812e125c06bba360ba7759cca24a1cc02b13ee9fb75ce8459df3c601da31ad552c153f789905a105929a223e3101f32431f346bcec3a128b0a3c3d4290d270b34e643e17bb5d53b6d248455502c71edd01654d028525576e3422bdf69571e9c10cf3c3c30227c89e2ce0c62911e5014b78b0cdabab060579ebf1a517414bbe5343bf33311c0ab1f659b3d30727184ec1aa8f1c3a3db45fbe215aca961fcd8ce98429d381995280ca0e5e78cde55442518476e0b404a2668424719abe71d64083ff8b63f285396f5989dd4aa9332426eece567d8098951e141ec43747c17cd9b1805f9245e0819ae416c61f3c60818ea448d397211e8b97e755494f0403a133abcd0882ab907e55a130528a5ac535ade736081d1cabd62980355cf85f84559ea36d6d3855030c341babcf65a20c9bb67ed4901f8b2617c7b9c8466976da39c6780003b71a74f6a16339082e6a62458835d30f1b32041bf9ed21c65ec59db3044dae0654e743a5e65836a4b9c5d2c9c4de859b1a6755ae7860fa6053de71aca0a61cdaa34eea773867a7ce66654380219c7b756d117a81e1c1f81156c6d5cccfbdb285c831317e5cfb8fc50b673600bb46469bb3c7c6072d87cc3b17bbb65b95e81875548b63e3024a24a329a4bb1404ff862ef10bcbe6a997c847650b5402b888e0d71c900d4a4a4cc429d717d3860a6615869f734244a0b25cd463371b189a243733469bb5dd97cb3e856cdf2ae64fcb519d9be1a75aa8794542f51bd67878e9a1b8f6d70a650b05b6a609ca9f477579264b127230966a289295719158b63931a3c0cb764e4847c9ac8bb91598b905a650a0123c7c0fb939f7e3943a2f3bafa20a221f37dc17933cf5e868b958e4e7cea4cfd021ef0ba63ff7a7250d21513171d5ecba1f135207bd2ab61bf7718dc6825848e742ad56f9f8099bd43905ebd9d6ba7a2985c1c4d203778597947d710dec806e36b0cd949fe460ef141213bfc525e5b + +# Official test vector 86, seed: "1722219cb5db47374eb0af0232c856a57f026f1cb09e5a5799f4c333dd422ff6a0a67c4da502faae727fb2d45dafcf35" +seed: 6fca9f4e384d8418075cc064c70730801bdb8249899d456a77130d5beeb3662cce7683f8a03d3cf04e46970ff7d6a12494ae12558346dfc8fd9370bf944a0102 +public_key: dffb649aca864c32b4f082ab455c94e6fac7ac1c6c46943e0d4b811e48a80f18a22130589937a1f4e4097dfb8c3342aab55648486701ec3c36ed167dac427c7dd54a6ef844468a481595b933701a2db33235439d702967ac1b77f47391e6700596d52b534b6ef33357322ca6f1c6a6917b1d8d9cc7f83028437c125912b4e8d33db0d00b6d475452f41a5088a9e5d169d1faa564b220c3aba1d6c27a5b87aef7f4afb75442c0565cb78c7b81144aa3c209f9a808d43132c75399293400ef70551b51292ba501fb613998011a35153046787183580e485bbf5b81bb9fc690ecd0cb7449615a0b0134f559b6e1062d9209ca62aa10279e2c7475e48837e70a2ddecc66d1ba5dac35760a5a5de0764136618b78516a0c711c3c4440c1f0117d617cd64b55482c952e7617176443c802c8046012e9b774d0312a68c49c85a44d430984ec510212316d43ecc3d6fbcf9736cd3e712d0d3011b645107a22b9d8f51e8dbc30eba66e98624473880c3378b8bf933d6577cc31d0105e19565f848290059604f9b71b755e123b7401f204356120c769cccc2b1660e03e688a75fb370ca4088b46d955cb24b7073c8540ecb2a537a66980332df62196d8c6e5584b7ba8a4c8739eac585a812aabb33a5f591b428e50c7291415012467d49b232989c34711009806249580a557048dd3dc0d2d6599cd556ac325a5c00b8820f0c9dfd3336bfa5f61d6baa5e26b848b39ca02cc542c1dbe90ad8d355cec4c9f3548868e9052618c86fb729998cb4cd610c8fbd86429621e34d11c4943402c2598b80aa98f395a85a180ad402587111de30cbb41e0c5f6044219d6a243860fa8da94f2fb878c8625b8e8243731aaf5b511fe7b3c34ac3fafc68df6d4be563727f705ad41245fde8048d184337e662aeb85135df92d4c1a3b36f1c984079d50248f88523483cac2dfe959162a79353708d09b399e6534aa88aa5bb3cf3eb59eec6a5c8309c6980bb2e4681bc47b7dc2939ffd5439ec4473606166da1053e9467c50854712490b583ac02a657c61812336b47a5e2912cbfb4a1acc84991116b9cb1497f199ab41b98bb54343d188ae54a269c89c36a61be71898006bb9ec531d6006325a47a13995492f41498790bdae9a9e41c0cef6fc78f8e027380cae57c2372308a1b0c2321f8ba17867a1358c5c13095617c2b276aa3c0b36588a9c62683104db5c94643c69c1330db1fa9a66c107c62567f2898419008b9465355af511afc923415c545ea44f15e7b98dd09ec0d79da5893125d6125aca7adf78a32f918af2a41cc6377c04a627fbb28ad5bb65bcb16e3f32622f45b5600cc367348379894c65f494f79948e6e1941c10afc4cc00ed871e529c8573b36debc7c80364b01ea874f345271517b6c399a6277b80bfc1a9996a3748a0bbba5a24abf84d6a714695202ab7779637f85774c27a51446e72fcb59ee684873ba60315a84988b5936674833a93f06b283c6cc1eca1bbc36a02c8197480c24e17e2316eeb58b81a3f5a063b1dc4b20239818c8aa67fd96cf6ab52017979bd82431c862837a1b796d0744a27559e748db8da63676369795ba92d48bb11f9bfa5393c522403b6379b0d2c82beb17ef29b37fbebb387aa695d54c241d51fc3d5bc7f8316100021fd805d76a601862473ae3996b2840ec274bfc37bbf5119668dd0bb0e909fc2a28f3b3c469a9b279bc4810c040b70781f3d67c584a965a94ac1bc088cd2b61c54f301f5dbb82f110c20d51a6c882cfd3c2ad1e6311fe4041eb6cefd7681e75a72d7b0cf39742394e33328374e5ee5b0fb3b0e2c709365780ed3191e56008280188baba9c745fa5a8958c0ef28c1fb641e4ec13dd77404dcb031ff3b670a2092edf848900818c7104b3e457d4189cac8082b55c55573c2021fd32e4b331eb515092843c323b02228737b2c8915beb2718d63b8020c2b3a957fa5029638846abcda5c3c0cb2aef55d05c38cdc1755328735901ba53d685b939b168b9cc55aa0ae05fcb8815400a9dc36a58a1f4f90b3eda3060a4490751413d9c1453ec8cb64dbb679fc69073c9e839c40e8ba4cac38124c3697528404bcc6435c9c21a5b89cd05516686b4df7da8ed3bbbb9afc428a842a90bc09666804988c7386b794b460105fc5035dc3018dd494d421ae46f978b305738d5f40faa6dd68ee73df57c41f89935528e64270c9759d496204 +private_key: ffa253d9738c7f3cc8d3d9645bfa7b3dfcc722170ccf43200ed962315c4a48882756588b0ff85656bc8329c33d81dac016a5b048a25204396268ea3e16b63aff88a6c0b0344fb1afb0f530ff3b2858954ebbe8155c287b3c0244f3ba7aa05c1ba3c7bec8861a15f621d420653a44354415a152b774e31cc0d3ab9b08486ae87a406f17b062b224b75c81d3f1bb1678aecea90a9a950f86ec8fa357984e697d21c82b70a0933dd34e2782189fe64f94325bc3d068f9a56328f6cd0fc93e74462640998cacaaa7d4aa17496c4fa0414f55e2a5601b3651934cb566594027a9ba5a77b2729165a51cd457907a25786d4510a5e281c2dc3ed422a40bd23a36494d4825a32caaaa244685734a543c8c65b6bcc11db390c24c57e3821ca2a229052846fdf155a786cae0c3474c58c4cf6a4fc3f0cb4040a699198fd4f9519fc9533724b9d5a5c76e8c5f38d28f034cce980008645704ad2b5e2f985657047554b389cac253e51a862eba7491aa76517224d7d247eaf35fce78b0ce3c8ef14c901d2122e364449967446437416e052b8fa6671a04a173559f46015fbde16c11657c7f759242ec6950523be14c8e402a1cbf973c91ac94e004c00be513ffd90c179071c5b05fd20a3db6727b90325592fa06b220104988916d558817a734394b1ca7c95f2da093ff211afa8aca0c11bffcdb243e986b34b72d66647d05173ffa621d0a191e6e69cf7dd33c252a8267d50b57babe73cc84972665db7343eddc2926dbbc17f44e80e229ba494743b6201a0693f4081bc6124bc27067f0a566ee95b455f6cf414c6621536f14762ff8b1b36342adaa6c381656bf2fba2d96304f895b6b0beca0e7fc02603671d2a916a2b571cf17b060994c0d296089e3804cd1b76db57d9a23640bccb4adc34ba970b9fe131427538dc80c41b2891c0900b2c16a42018696490c4dd31329577542e0b56778281f05379cebe49f7276ac28cc0082ab23fb983811daa72c940b8ab912aaa41d3ec895d215bd4325268ac137ed7bb97fa09f5c7aaeea47b822ec6761740809a9b58470ae5b970d6bfc37c3092250218bfe248e2358600170b8c0b3444527947ac515211b9b2d65328e13cb33e413847cbad815412ef36c7e7a42a6f097b0193af3bb0c6049becb3051d60a10ba1c6cf4b9cd10583886172fb2527d85ca2714fac6a7352ead8050819bb08ab050b5525e2a093ce296a0dd7a0e79faca7a209e08fcc4366ac22bf63393eb32285a5dfc2198c0f3ae7f389d4283ad23e86a2e7972e6e4b22fcb7c5cf54353500d680288bd004a5fd28a280c09acd35dcd245051545b46598524ab218df38044f52f038281b332b2d6610d7fccb9f25173b48c8a2b18b3dda8c3b0abc4aaf28ff2b4a6abd085b6d8722c9a02ccdb96a0dc90922691f96769e2d9800cf5818b23c2f9030c929c3f11995c68c504c91b753496cf7b3b00e46a78babc61043780ebfb9f037668e3b5039663c8cc291db5f5a4e3352db5079387e5855d74b84045b1ecc7b0371a048f484c658502c344b6bee19e370c78b203260f6732ea55a0479453b4684454588c90e49d0a192f2634004d326292011f1d53b0ae71bb8284379d925fc139b581f402a9280dde30a9f5847fada70582a7af03c71d0a8a3147219f986c329bd60079f38f22e99dac8cbf4ba67ad77b0819334135d00888f476985441de439df0b81673d3274da42aa8851c34ba304b467441405559491662443d51e92f50a056d4fac1ed2357f00503f5280da63c055f923cda36916ba51f35e13cb17476a879bf88b406dce51ca85475b7447c0cd6c46ebb0722a8cf8d8250fbec5bbcb5b9b644238168151ad9ad156c7e0dd1abeda37e8d511a34b447195a897568b0809a02b4207aa8ec12b2ba73d64bb97952328fa1c5c19801cdb237ffa23115a774592c5f644bc60fe3b5b96a1689a90cd1d6abfa9a50bb430ae796364cd99d8e6261820282204a8dc81cccc40b67b82067fbc38faeeb068ab72ecf3a6af5259092b06b2dea6665b7901ffb6c2a243a3d2b4235552935c323aab07769aac9ba0a8c3813c536700ca8323ed662954adc5bf811c4d09434d0046566363775f4965e626346b6bc1b50655de01cc642b7f984c925b11b5442c827dc28a004c38ee59d74cc0dac334bdffb649aca864c32b4f082ab455c94e6fac7ac1c6c46943e0d4b811e48a80f18a22130589937a1f4e4097dfb8c3342aab55648486701ec3c36ed167dac427c7dd54a6ef844468a481595b933701a2db33235439d702967ac1b77f47391e6700596d52b534b6ef33357322ca6f1c6a6917b1d8d9cc7f83028437c125912b4e8d33db0d00b6d475452f41a5088a9e5d169d1faa564b220c3aba1d6c27a5b87aef7f4afb75442c0565cb78c7b81144aa3c209f9a808d43132c75399293400ef70551b51292ba501fb613998011a35153046787183580e485bbf5b81bb9fc690ecd0cb7449615a0b0134f559b6e1062d9209ca62aa10279e2c7475e48837e70a2ddecc66d1ba5dac35760a5a5de0764136618b78516a0c711c3c4440c1f0117d617cd64b55482c952e7617176443c802c8046012e9b774d0312a68c49c85a44d430984ec510212316d43ecc3d6fbcf9736cd3e712d0d3011b645107a22b9d8f51e8dbc30eba66e98624473880c3378b8bf933d6577cc31d0105e19565f848290059604f9b71b755e123b7401f204356120c769cccc2b1660e03e688a75fb370ca4088b46d955cb24b7073c8540ecb2a537a66980332df62196d8c6e5584b7ba8a4c8739eac585a812aabb33a5f591b428e50c7291415012467d49b232989c34711009806249580a557048dd3dc0d2d6599cd556ac325a5c00b8820f0c9dfd3336bfa5f61d6baa5e26b848b39ca02cc542c1dbe90ad8d355cec4c9f3548868e9052618c86fb729998cb4cd610c8fbd86429621e34d11c4943402c2598b80aa98f395a85a180ad402587111de30cbb41e0c5f6044219d6a243860fa8da94f2fb878c8625b8e8243731aaf5b511fe7b3c34ac3fafc68df6d4be563727f705ad41245fde8048d184337e662aeb85135df92d4c1a3b36f1c984079d50248f88523483cac2dfe959162a79353708d09b399e6534aa88aa5bb3cf3eb59eec6a5c8309c6980bb2e4681bc47b7dc2939ffd5439ec4473606166da1053e9467c50854712490b583ac02a657c61812336b47a5e2912cbfb4a1acc84991116b9cb1497f199ab41b98bb54343d188ae54a269c89c36a61be71898006bb9ec531d6006325a47a13995492f41498790bdae9a9e41c0cef6fc78f8e027380cae57c2372308a1b0c2321f8ba17867a1358c5c13095617c2b276aa3c0b36588a9c62683104db5c94643c69c1330db1fa9a66c107c62567f2898419008b9465355af511afc923415c545ea44f15e7b98dd09ec0d79da5893125d6125aca7adf78a32f918af2a41cc6377c04a627fbb28ad5bb65bcb16e3f32622f45b5600cc367348379894c65f494f79948e6e1941c10afc4cc00ed871e529c8573b36debc7c80364b01ea874f345271517b6c399a6277b80bfc1a9996a3748a0bbba5a24abf84d6a714695202ab7779637f85774c27a51446e72fcb59ee684873ba60315a84988b5936674833a93f06b283c6cc1eca1bbc36a02c8197480c24e17e2316eeb58b81a3f5a063b1dc4b20239818c8aa67fd96cf6ab52017979bd82431c862837a1b796d0744a27559e748db8da63676369795ba92d48bb11f9bfa5393c522403b6379b0d2c82beb17ef29b37fbebb387aa695d54c241d51fc3d5bc7f8316100021fd805d76a601862473ae3996b2840ec274bfc37bbf5119668dd0bb0e909fc2a28f3b3c469a9b279bc4810c040b70781f3d67c584a965a94ac1bc088cd2b61c54f301f5dbb82f110c20d51a6c882cfd3c2ad1e6311fe4041eb6cefd7681e75a72d7b0cf39742394e33328374e5ee5b0fb3b0e2c709365780ed3191e56008280188baba9c745fa5a8958c0ef28c1fb641e4ec13dd77404dcb031ff3b670a2092edf848900818c7104b3e457d4189cac8082b55c55573c2021fd32e4b331eb515092843c323b02228737b2c8915beb2718d63b8020c2b3a957fa5029638846abcda5c3c0cb2aef55d05c38cdc1755328735901ba53d685b939b168b9cc55aa0ae05fcb8815400a9dc36a58a1f4f90b3eda3060a4490751413d9c1453ec8cb64dbb679fc69073c9e839c40e8ba4cac38124c3697528404bcc6435c9c21a5b89cd05516686b4df7da8ed3bbbb9afc428a842a90bc09666804988c7386b794b460105fc5035dc3018dd494d421ae46f978b305738d5f40faa6dd68ee73df57c41f89935528e64270c9759d496204f118f77224920bf4ff7c69db5ebe12eacdc6012d57e2ccb3d690db251204dce3ce7683f8a03d3cf04e46970ff7d6a12494ae12558346dfc8fd9370bf944a0102 + +# Official test vector 87, seed: "ac139b78fd16ca0f26d6d7f9e15345c888d857b1910cf38d883339b37ead2dcac30f7cf10176f23ff34b4488eb79437c" +seed: e58f71bf175c0550a67e00e0f7b3b7fc36bc2707bf0c93044a492626de36301a7f7054814869cf7625e45647bc1547aff288dbb90699b2ad84893f3b755d9722 +public_key: 1e4205e8fa992213c49059a409aaa3ac72b85837cddde4c4ac42a9a35ac7fb80ad2d8c1eae7019276b1f3f3a6761602a01d99d4d050c23892427d6267efa092b587a5d2376012cb755627b9e63a2a04432260aa1abb2698ebb6075620ff11b01e4d049de698966fb49bdfab73675586583c744b5bafbe9692b6c6c1448899ab72a8821b52b4bc061910fcc70beaef424afeca7d3737f4c7c6711b38dea919e1a13c78160c1c652a81210c010c48908b13101b04334e6534aa0986ec01a86b30d41cba67e573ab6b0cc1a2c973c0041bd26721b508a667bc28e010265b762a223128e092eb512bb9d6150af6840581514470212d0e5c1f4696e45ab102a91a0848497e8a7a52ef20c85d7067e6a1f99e1c0de84473b735bfb001e860c3194029d5a06484920bb0e371114ab2f3bd775248a9449d2c19de5023876931de00dfd609c95c98c133bcbeeb52c0f713a19176dc90b5143a6876ab45b7f717865d4b8f0b8a2e6a45f123b85c8fb584cd3c042676ead069cf9c23682aaa05c1010e122473907547d79b0f8b61180014b1b3a56b88b3b4fd97eebb21eaab37883889a37676c61061d41b40b49dc5e68f64ed979bbd3da4a7824b32fc0bab9985a94251fcb740bd2b103f9c21c25bb055043c895531e68b17a3cf3190683969d6299c850b7d11a6b7a183b4b3a3daccc41d3321f5c088035102ab68b2938975ff180890153135e284155f971ca624c19f15ae4a3023f20cda6d404406c39cc26ac4df1665a3c19107a99bb289176a09e4a7c197ba72d6131980264a907b605c1e1791305974d49b604c81a9c8501ecd0cdd32a5f94dc3f64481164323736435d1043b09fd1ba63ab6956e4216ce47f719bc10f0c2b2830c17886965188534205c3f8818369aa638d5902cedc28b56c9723aa4eee8485151a270d3c1d963404bc265b912c6e52099df9ea72910674bbb8493f670620645fba16c0e6c73ffa20a99d6378433c6c55ab20f0a40c74ba37ddda39d2ba4d7f34c705a4117c618ad91408ba3bcce9fa9900d2650fb109fe2221f0f6219c226b74e7968f5aa0b3e3575be051446b1b76b8a7785a43c824c73688ce495681fe723d97b249e5a65a961abd0d61527d4b18027b00dfa49f4d213253e80ff2a556c48ace2b6a5122b42c2d15622e158e2613b23e62c6398838aa821cb05a4424817f0f9291f4ccbe6578941070b22b9c36bbe89ecad318e4251451a80202a70e1b2274854809e770677ab76c9e9c5cf4e8621e4338a279169ab46a6e5344ca391b80eb12f9b8a582105380384f2fe845b7298e52803989211498b42537b8b1cd22a59085bc00941f190a66fe77a1a6745e8af09762751c63656a26692bf1870df08cb861abba73b50ac6b03f880844a2c6811a031eb412501c79201e686ae528c84b7606aac09bc42265e77b56fde93022a71374693f9ff5787fa0855c79321d147831ca28e7880dfe1c15c66bbccdb93c0e7113a5eb9b97285ae8717bb87c1f071c284c0089fbb5a7b5121770950d255aabfcf54f1c18c8d9b2bc4aa253d5ba49bd2944a8c440d01343f0770f690743dd952f4f6692a60bc3360588f9575636748e3d321050c42c11d75b69d316cab62c681ab48f1880a9d787449440d1f1cfa0386613c2b3d25494e7c17d3e4b1f5a5780a9f088f00a9d6a79c6b1bc0e1d501fdb398421a19e316489bf1105d9f79c74433c82b87a775ca358965e8b1248134a94179c20011121aff04b95130f2ea20a0deb2d3ad8a0f6086481d8297a10374602661ce031b99012be53c70110b53d28966d8009ce6857f778006a304fb402769065c04d25b2f3aa1bae18a692d7552bc9805897c9b65a930ba11c6f3487801284d85579a912664118075b7237e66183c66510202188dc8abc1aba9524e0450b7a29b4d6b5076769b7e419fa4a63521619d1f76cefd0a7de67c7f5491724d063a13bc27bd20e9d486fd5158d3b7c04a97b95bb06895206058f94050dd8c262eb70a73746cf279350125807c52ae8a29db743099f259c9748318f391e524c9d8b46932157c94a8179e02897f33226ef1964f4cc92c7323df35a7700daa10170082f0664e4b8a221da0b5da84f43b79584194aa8c18724a6452760365c316c1f36212811a8e1936578653878b2372fe58505e7957a3e0e0f1ac0d822a80287d204eb6a446a74afae0ccd1859a2544aedfd +private_key: 3724c5ebbc753f55535fc5ac0069c238d8b7c111bb7eea08b59999349bb352cc5c18f9926bf676b53a15c759964f205a322a1c88e1b4266c2d6a311384216ee6e4625c15414b77849706292fd79753163975a4be5b9410f3d261e1931c934380263740d2a2666d861010036251e7061f04a6e8f8acab2907edb1cf01f906bb972b53f79df07b3ae368411913976e73360b077771b16489e83818b6a176223097e2397432c9fb4bb013b2c8fbd2815298b0214b97cf8b740aa4bd89067ced36be138a3d096bc51f606d3865418610083c71968fa41009530931da393aea3ad975423829233bdb9b0095c2421a3db1d914e502c4ade29c408c84257a2a1b2a100839600a659026e6362be2acc789a12832ce5d876533862c0d20844e903516448448c0a600b6c7cb812a3847037cfc0cffbaa582b9028528b52580c956d4383d10155dd58bb84bba99cbae99055574b02aea64828f4c28b8a0c19a4009d6e6c58c661bea9a84f6e273b9c50d9a8048ab144f168912ca1c5efbf87997bac3834300960aa1598c15221a1a0de795f9385fadca44cb036972a8c37dcbb61c793d851214a701b3f23645a166bf1912a827934a32a58fba6abfb41a4ed2331ce0d08378417f42c176403a9ca5eca30370ca2c523e7a294c7f9a7cf87b941ea47b19928fea095ae42038217b3fa0b54caecb60ba03a8a99745982835afb01934e1bd4c432f3f3c041e96c08c8836e267a30b8883997749b56047d182758a683123a91f70e08b1b42121b666c27d4c902939cc90442c19079e53b87b834baa609413aa3698d365e5bd71b247a7f0d42184b166cffd532b0691563c7874e9392fb1c9c528387ef3648d72cc063546cf22b23b6e68c340a23895a6573f80f30e3ccbde14f56aab4fba5505314605d5311ee89a7eb5cadc7523716885b4150bc07318902657ad101594c24c7328004a29cb8caa4a3f48c1aaf7c289a063a6ed690f72625c6ebc7c10bc500b8a0f5e807655b1470a4802fa6c3d9fb0beee3386858328ef97e0b94518a455c5c6a3020a70a9468cd784a38bce99492cba4be53624925c3f74c533aa681a8482fbba5c15b026462956fb4269bfbd3591ae33823425ee57398dcfc1e7f3a53fdc6b031267e59f0c82bb4b7ceca3cedb23cbd29af7c797867493046b30e1264141535315c24a03f08c811716da610726472039fc1cdf489595e072f717a67487b842a6c8b2cb33ee9420ec5428ffa6b85a7311014595f409ba93e8b10100ac45bda836a522c01c78fa8b904bd422ef17a93d1767f31b02b7540ac4ebc3cc6025884ac9fb0ec996e537608695b84c350eff27a15f2b83d76b1622789f55157be7274b73378994a997d564b819552389918b781c19317cf85a72dfe66bf8c44b032210b9395ae35f9ce61d002a2e4a0d6f823698698a0d475e6d90baf596b83d2628b5b345570680a13b56c27a9a2d7be01ec655da3c1c93886d15b6b6f28404c85b37b09701aea3c50a146be8bb93b10c65b96248a02bacec816444c911a700f7acc16497c536da22ba6995f89985f59e0bb5a16984a005f2c64584ffa868da78d33b44b1afb5a25f85c083ccf6db93a59720aadccbf2598228bcc6da0676fec92109480548e421a618c0f0a519750d846d4818f5d1a625b877c64e9ccb639aa69186b70775bdd6612c7607ae6149f52d447a9b2946af664b493805de93e9a4846b734c0946822df415c446455cd037fece9302eea5a856208c1a3bca48c35e88cb329f2cdd6f56a1b89cb8ab972140093f2686a2cfa1ee17ac413ba6f3f83723bcbcd933947389476ecf71c676a3c327c9725048dce400f791c9eae184aa95c193e84040cda88f1a497a2b90201c95248abaad0c8848d7280be076ea7b4ad3bf083656948c952417ad3bdd28821c9c92e59f90b5582bfbeeb560469aace0b1e7dd53d29f59f12b767355a0790780e19716b588c150603bf3680464f15aab3809ef240b1759288ec719b64f7a184b890060ad066a41923f25ad87b55ae89a1222b4bdbda1e07631d95c704f6866b1f9994f94681c21b41c3d7972ccc2b842759754ca826e433497b358c071f306a464d3b0f7950b5503304910529a6e476cce974488443562cc11dd13f45ab1926859952b67fdf277ad3cb8965c1a31e4205e8fa992213c49059a409aaa3ac72b85837cddde4c4ac42a9a35ac7fb80ad2d8c1eae7019276b1f3f3a6761602a01d99d4d050c23892427d6267efa092b587a5d2376012cb755627b9e63a2a04432260aa1abb2698ebb6075620ff11b01e4d049de698966fb49bdfab73675586583c744b5bafbe9692b6c6c1448899ab72a8821b52b4bc061910fcc70beaef424afeca7d3737f4c7c6711b38dea919e1a13c78160c1c652a81210c010c48908b13101b04334e6534aa0986ec01a86b30d41cba67e573ab6b0cc1a2c973c0041bd26721b508a667bc28e010265b762a223128e092eb512bb9d6150af6840581514470212d0e5c1f4696e45ab102a91a0848497e8a7a52ef20c85d7067e6a1f99e1c0de84473b735bfb001e860c3194029d5a06484920bb0e371114ab2f3bd775248a9449d2c19de5023876931de00dfd609c95c98c133bcbeeb52c0f713a19176dc90b5143a6876ab45b7f717865d4b8f0b8a2e6a45f123b85c8fb584cd3c042676ead069cf9c23682aaa05c1010e122473907547d79b0f8b61180014b1b3a56b88b3b4fd97eebb21eaab37883889a37676c61061d41b40b49dc5e68f64ed979bbd3da4a7824b32fc0bab9985a94251fcb740bd2b103f9c21c25bb055043c895531e68b17a3cf3190683969d6299c850b7d11a6b7a183b4b3a3daccc41d3321f5c088035102ab68b2938975ff180890153135e284155f971ca624c19f15ae4a3023f20cda6d404406c39cc26ac4df1665a3c19107a99bb289176a09e4a7c197ba72d6131980264a907b605c1e1791305974d49b604c81a9c8501ecd0cdd32a5f94dc3f64481164323736435d1043b09fd1ba63ab6956e4216ce47f719bc10f0c2b2830c17886965188534205c3f8818369aa638d5902cedc28b56c9723aa4eee8485151a270d3c1d963404bc265b912c6e52099df9ea72910674bbb8493f670620645fba16c0e6c73ffa20a99d6378433c6c55ab20f0a40c74ba37ddda39d2ba4d7f34c705a4117c618ad91408ba3bcce9fa9900d2650fb109fe2221f0f6219c226b74e7968f5aa0b3e3575be051446b1b76b8a7785a43c824c73688ce495681fe723d97b249e5a65a961abd0d61527d4b18027b00dfa49f4d213253e80ff2a556c48ace2b6a5122b42c2d15622e158e2613b23e62c6398838aa821cb05a4424817f0f9291f4ccbe6578941070b22b9c36bbe89ecad318e4251451a80202a70e1b2274854809e770677ab76c9e9c5cf4e8621e4338a279169ab46a6e5344ca391b80eb12f9b8a582105380384f2fe845b7298e52803989211498b42537b8b1cd22a59085bc00941f190a66fe77a1a6745e8af09762751c63656a26692bf1870df08cb861abba73b50ac6b03f880844a2c6811a031eb412501c79201e686ae528c84b7606aac09bc42265e77b56fde93022a71374693f9ff5787fa0855c79321d147831ca28e7880dfe1c15c66bbccdb93c0e7113a5eb9b97285ae8717bb87c1f071c284c0089fbb5a7b5121770950d255aabfcf54f1c18c8d9b2bc4aa253d5ba49bd2944a8c440d01343f0770f690743dd952f4f6692a60bc3360588f9575636748e3d321050c42c11d75b69d316cab62c681ab48f1880a9d787449440d1f1cfa0386613c2b3d25494e7c17d3e4b1f5a5780a9f088f00a9d6a79c6b1bc0e1d501fdb398421a19e316489bf1105d9f79c74433c82b87a775ca358965e8b1248134a94179c20011121aff04b95130f2ea20a0deb2d3ad8a0f6086481d8297a10374602661ce031b99012be53c70110b53d28966d8009ce6857f778006a304fb402769065c04d25b2f3aa1bae18a692d7552bc9805897c9b65a930ba11c6f3487801284d85579a912664118075b7237e66183c66510202188dc8abc1aba9524e0450b7a29b4d6b5076769b7e419fa4a63521619d1f76cefd0a7de67c7f5491724d063a13bc27bd20e9d486fd5158d3b7c04a97b95bb06895206058f94050dd8c262eb70a73746cf279350125807c52ae8a29db743099f259c9748318f391e524c9d8b46932157c94a8179e02897f33226ef1964f4cc92c7323df35a7700daa10170082f0664e4b8a221da0b5da84f43b79584194aa8c18724a6452760365c316c1f36212811a8e1936578653878b2372fe58505e7957a3e0e0f1ac0d822a80287d204eb6a446a74afae0ccd1859a2544aedfd8678b1f242830fb21f34f7beb20a96ebbbd6181890cee3bdcab29697c5aefd707f7054814869cf7625e45647bc1547aff288dbb90699b2ad84893f3b755d9722 + +# Official test vector 88, seed: "cc7152849c98d5fed2813275d32069e44824ecb14eaef425ce017448cd9a401c91c06d0f7eed6d22b7bbe8ba6c429ec3" +seed: e3fc575ed51513e62aba655d24cd9c8f1c6c848aaffa946c49a53ac3ea59e474d82c2f1bf2e6aebde5660fa73356982e12999d8fdafbb3cb186341d0386dead0 +public_key: eac2871f16b152d08e74e28a250999db0a6db7036711a24370401ab844cd39b124b8d42e8a15b2bdc85fe3b11c9caa30ee666f260ab0f0e230a5901229b974446428a9e24680a884208a2dfd3899ff1a4920b798ab275d5a10b01503d000c23db72ccbb3a91ab0186fa7850de3055e4531439bfa9cdce3ac888066d17469dce07f76d0397bd46a59c29a4a776c8b7310021128dd248beec9296c7c5e95d13aae21303127778b653131babc17494f0aa63c18260130315bcca7a8c8521e7b9c9544c1260bd201ef23974957a6a4d3658d96a7fd4cb7daebb11e5acec216042cac64af05c8a7db570ceb09393c7a24f5ae305280b1c22b9d68b02a0c521dd6393c20cb3eb798db457ccbd869748aa2cdc8336a58162e56528c3ac7a7bb41e2db1a35257b6135247c7802024ca258f03de2ea93e2f6c42e539617d27fc62510ea016deaf787a2b3b930165ff1fc8e20413b90ebc827581b74988937a018f612ac4098514480212781c4ea128680448b58a5a296b35020c6668acc7a39ec329f3c5eb00c44f43c9ddd612c0860031669c911e0b4d5d20f45ec1b6c5b6be399c2bde785757215be7617aa6a57eb6b797c8c5cf774274b2463d0c85e1343554ba052fd9b36da139e13e04ff18427b418282a5642429825d15636da6c45834375d543714e80530deaae0b006488eca46974642c8307aa5297d34619dc39863f276189a20b75673744fb934420a138506fb04b0eb2e22108c1923784523e767dc70ca546fb820de07bb9663333e623889279bc596b2f559f5699c272c3040602a0ea98c878d2af1d7aa697aa83f1dc10e54017e2e586b220804588473c4b9d05aaae6ff9c038d00f953547ec748e62ba3426001c3f669941596c6184b353d3919e591df898831eb11aaedbc49b88c8187cc13eb79eb09c7e07545be6041a9bd0a70519b17b5479aef79d105b83d74c08c719843a94bd1f76baf7e3bbd6795e05830184c53f42061f4b6b0321e2561b4c474865a0c825c96f9269e12742771c4c9b20b9380540772a24b43c2ab3051b88ec4760f794c17aaa55199e39eaab54c53aef32bfd339c824501972eb5ed299908ff0ab3da01460f106919b450bf00678967e45c18531d112b481918fb7023efa1617da59ff391b84b03ac199a1ab31208b918777a2c8a9706cc8359d09e4a817386ce09757c44350d10c4edf02625ed06dd3db07514639f67828c5077f0eb722f39587830c506c4bbb4bdc60a1b256bb157ed4770e603211d508165edccdb2d6cf37f039578176032c2158eb3c9d48921cb387339267bb728eccf97bf31309d08611b91271ec698d8920ca3bf334fd8765b0170608726a6220a3ecc14023f02aa4f31446b22da93597e4a46d451cada3965ef2148a832221c4d8a7d12157d9b3bc69fac8626b2dd1c44aea272cc2125dc79a4f90b56ea75144037a4f0060c33c5b6eca4572142310ce956fd6f31d23c6c9f6235057362b884a014fb5867b2c1976127a5a287ee371b7430caec5d35b63789b31d176d2553f82c8407f585c32511e3f0cba0ba60537780edc6ca22d1422ec8c3357eb203ee68c8fa135b0ac2836e027fe3161769c6838e98cd449c14ef2b07afc714cf02d91d387a27472217c9ea6bc5cd1249bba38842cf1b28701a6074ccfb7316dcf345acd84660d02381040cbe8109c5d423921b84771a1cba981c5fb08c5de08ae6cdb38fd5b9489357df11565d48a7797a6af82553225d73cebb362abb1ce335358c6776d9fbba731883ae7cc517e0a0a3bb5b970e4cda95a98aba47d9e2397abd7757218c5d7bc4ca59b70be5aa4d7b62afb54048ffb0c64919afb746120b383958b715d110e5e6ba666940328ab4510fa25e9b43537e566ef760d2cc52b07e5bc089b8ea9e166c513bacbccc332f36d6afc379e1a838ac24ea35c1260726d029651088996631c55e846adcf36c792c21011320b2287973a770d2636470c080b2893a09bcc8705306c5b364837b7cc89a9ad1fd9c1edcca9a0b4b81846c8e088b36fe361539060cc08c911c9058bbb0839183b0c59302171826dfc7b6fb1c623dba3f0f9b30768346a7714481b741bd0bb7ca32ed73a00a6a1874d8b7369f695efe75e00f03be6cac1476815ad889c69ec6bf7fb38ce9609c174b902b6047ead37da33285d1009b83c39ff67773cc46f7b4b2cee35e8e95100c31dc59eb9 +private_key: 081ace51252462bb622ed578c65c864be5210ad1cbe55b6288a8cc22d297edb0aaf549bc240963f0c65368cbccfec732a7345f43d563315442aa97acaee1036c58a4fb752984ac6e85c4b744f5177cba665ee2154b5c6c3c0455b4cc602d9c411186ccaf5c1a1ec51558fc5eb1713229ea213f261a249c225566c5d9333b9a579a907016406b709b8c97a0d2270aa0a11e72ac51e1a5192545c6515153e193ebaa7985bb23a47138bfdb6f96e47e8bda4042cbcd993948ffb7ca2673c4a3773e9ce5a97c34c543ea24eed7537ba8a5604ca316aa38b0b04beb922c9c62af8e010a8ef9b22ac92fbb7a6035e0c842c3caabf12c90b706cac75f6868b26b8ab652476d520662faa46ecc990a4db166262c19521817b3a82dc3b8b671ba21dc4b06f3150209f890be837882570bc7603c48026c44415ed938146c57b36c361b7c0b0e04bc81f532494a198af962208e0785ec1601b57967bba750d4a34bed69c1c4b2982b97a1fc49b4e7e970307087930b32a44ca7fa4c4bcf5a91e1b86a2d8c60e3019b7cf98f634aba74c84911ac4b159636a4d49d63bc81fb2210fdb40bf3b2a467cb101c43c68473046cc4b6b741bebd71b27a56ae4de70288d74e6eabb2f9a1b334f4274e7369b7618b31316f5555288ea88310b97ad7b425d052b21fb42487331cdaccc4398bc0a67b4a28a77a2396327a95cc6cd98b54058428d9a9d7a45f83ea5e1bd26222c60cc3f77e0cc87449836940815279ecb65001c5bb4a599771848e10a64d8c4ac30b57c6638fb11bb1350b1d5fa34153804556266fc8d70a4b56067718c47899a134e36a1815a791600a14f43c9a2065ff786aaec7a7c4571546ba339dbc41bd98c462a85e5b72cdd07c5af9979f74c32b2d501f05a57d5d659958b78f26853500dd47f0cb8ae5c08db6a6a97c1312ae3c20bb34c4c3a2a9177cbc1b152c2f9940937433b3414067093375fc6bdf44b8738b4ad95261e74371ea2cb2eda13b57579cd2a939f7c9a9950a32ad07baf63c02603a626d9c7edc89817ed02bbb376dc2c523b9a84e45dc811d736789647c5c291aaa9a3d01511b9237a56e26130445a4486962ef8682f71412104b7ffec39b11fc713a234ae3087181a2ce5a2a3e7bec354e2921806b7c99c57c8f5bab84a83dd75b16147ab62a39064b530462e40d38c4971c18bf39f469d34c12dce7707ad61cee073c6fc0cf6ae259ce16890c2528a499b98ac82712b8aee7225b78ec01a19bbf5692366e737591733015616c38e30924044c2f551cfe2c90755362c34abb53c59fdf8a50c1e392af7a0a739a5626246e655991c41c9aff111e2c21cddd5242801561747306fdac5b54cc4e76543e39900e491cb24fe353b45b38de47cb3e05693c9525f88b4886e1514564231caa5f33d776cdba9d6ce8323f7c02ff9310c7227a37c172392a85f3c234f73c52ecf48a3385c310554c04481d28b59185b8cdcf80437b04087a7820e94b95e31189f2eb4a02e4cb13e683971b9d9d912d2c369488a1037b468ca88061b1a96bb8acb2a21bc54b402cf84798008006caeb9266b9783ba81482f02e19da185aac95e233659672479d02c0e1a418852230f28a3faabaae8c058a995cb843d98e048499f7250e1b40c532380917fb8156d0b5ce338fb6256e31752ba16aad5b9c7e1017188de86e509109586cbc59916993a5226c13332bea339716a228cb2c6a90b485440a98d6cba8c5592b692763f853f56c35948b0860e087a15a78a134c3585cb034f135a2b79d2ffc73db89b65512253893cd2aa937eaa1ad24d0aab311845becac9f15b7ec1b6a51aac4aa45c337b44644499cd464cd6f717472a08cedb8570c8714d088a2cc21c4efdacf8cc59c2de91764141acb26851cc584484728fa1290a90338468aaf944c943beb9d7295cc500054615ab770423f82f329e3d3b751c70589c693009d7c1634b5c43ba5b795ad3873ada60669835a034d61439f3a897c021a057616f911087bb626ebb5a9e6d63e896371ae4192c93471b66ac0544131ec28074cc6a12b4364fe362c2fc68f359a7313ac5d744989bc33b1846a2b0db449f84a273738c9f2d98e6bda993dd514f17aa047e8b72e413bae7495f0b58b38b71d85a8cfc1f183eaea4cc281a5ba6a876d7233107b1beac2871f16b152d08e74e28a250999db0a6db7036711a24370401ab844cd39b124b8d42e8a15b2bdc85fe3b11c9caa30ee666f260ab0f0e230a5901229b974446428a9e24680a884208a2dfd3899ff1a4920b798ab275d5a10b01503d000c23db72ccbb3a91ab0186fa7850de3055e4531439bfa9cdce3ac888066d17469dce07f76d0397bd46a59c29a4a776c8b7310021128dd248beec9296c7c5e95d13aae21303127778b653131babc17494f0aa63c18260130315bcca7a8c8521e7b9c9544c1260bd201ef23974957a6a4d3658d96a7fd4cb7daebb11e5acec216042cac64af05c8a7db570ceb09393c7a24f5ae305280b1c22b9d68b02a0c521dd6393c20cb3eb798db457ccbd869748aa2cdc8336a58162e56528c3ac7a7bb41e2db1a35257b6135247c7802024ca258f03de2ea93e2f6c42e539617d27fc62510ea016deaf787a2b3b930165ff1fc8e20413b90ebc827581b74988937a018f612ac4098514480212781c4ea128680448b58a5a296b35020c6668acc7a39ec329f3c5eb00c44f43c9ddd612c0860031669c911e0b4d5d20f45ec1b6c5b6be399c2bde785757215be7617aa6a57eb6b797c8c5cf774274b2463d0c85e1343554ba052fd9b36da139e13e04ff18427b418282a5642429825d15636da6c45834375d543714e80530deaae0b006488eca46974642c8307aa5297d34619dc39863f276189a20b75673744fb934420a138506fb04b0eb2e22108c1923784523e767dc70ca546fb820de07bb9663333e623889279bc596b2f559f5699c272c3040602a0ea98c878d2af1d7aa697aa83f1dc10e54017e2e586b220804588473c4b9d05aaae6ff9c038d00f953547ec748e62ba3426001c3f669941596c6184b353d3919e591df898831eb11aaedbc49b88c8187cc13eb79eb09c7e07545be6041a9bd0a70519b17b5479aef79d105b83d74c08c719843a94bd1f76baf7e3bbd6795e05830184c53f42061f4b6b0321e2561b4c474865a0c825c96f9269e12742771c4c9b20b9380540772a24b43c2ab3051b88ec4760f794c17aaa55199e39eaab54c53aef32bfd339c824501972eb5ed299908ff0ab3da01460f106919b450bf00678967e45c18531d112b481918fb7023efa1617da59ff391b84b03ac199a1ab31208b918777a2c8a9706cc8359d09e4a817386ce09757c44350d10c4edf02625ed06dd3db07514639f67828c5077f0eb722f39587830c506c4bbb4bdc60a1b256bb157ed4770e603211d508165edccdb2d6cf37f039578176032c2158eb3c9d48921cb387339267bb728eccf97bf31309d08611b91271ec698d8920ca3bf334fd8765b0170608726a6220a3ecc14023f02aa4f31446b22da93597e4a46d451cada3965ef2148a832221c4d8a7d12157d9b3bc69fac8626b2dd1c44aea272cc2125dc79a4f90b56ea75144037a4f0060c33c5b6eca4572142310ce956fd6f31d23c6c9f6235057362b884a014fb5867b2c1976127a5a287ee371b7430caec5d35b63789b31d176d2553f82c8407f585c32511e3f0cba0ba60537780edc6ca22d1422ec8c3357eb203ee68c8fa135b0ac2836e027fe3161769c6838e98cd449c14ef2b07afc714cf02d91d387a27472217c9ea6bc5cd1249bba38842cf1b28701a6074ccfb7316dcf345acd84660d02381040cbe8109c5d423921b84771a1cba981c5fb08c5de08ae6cdb38fd5b9489357df11565d48a7797a6af82553225d73cebb362abb1ce335358c6776d9fbba731883ae7cc517e0a0a3bb5b970e4cda95a98aba47d9e2397abd7757218c5d7bc4ca59b70be5aa4d7b62afb54048ffb0c64919afb746120b383958b715d110e5e6ba666940328ab4510fa25e9b43537e566ef760d2cc52b07e5bc089b8ea9e166c513bacbccc332f36d6afc379e1a838ac24ea35c1260726d029651088996631c55e846adcf36c792c21011320b2287973a770d2636470c080b2893a09bcc8705306c5b364837b7cc89a9ad1fd9c1edcca9a0b4b81846c8e088b36fe361539060cc08c911c9058bbb0839183b0c59302171826dfc7b6fb1c623dba3f0f9b30768346a7714481b741bd0bb7ca32ed73a00a6a1874d8b7369f695efe75e00f03be6cac1476815ad889c69ec6bf7fb38ce9609c174b902b6047ead37da33285d1009b83c39ff67773cc46f7b4b2cee35e8e95100c31dc59eb9d604833a540d9922a7dba53d67a38de1634cddee1b169b45bb9eb3646e55fc0dd82c2f1bf2e6aebde5660fa73356982e12999d8fdafbb3cb186341d0386dead0 + +# Official test vector 89, seed: "96d9a06f88ff2c2036fa8e914b89c765e4a510b468dee40f914f78858c811857efe9fd0e17c0048e7389e8d996b7e2b0" +seed: 470b4943f0fe7fd0d8ec5185aba0d1db09d112934e4fb4787e2bbc6b88466e7b8b2809fd40008be70a6b184981101724bc3d5ec5e1956b510b82fd5ad0668a5a +public_key: f8ca36bdd81e5969c6e2f8a58829a9b7697b6b36983e896e82b40738740fa2e6b657616b0b4cc0b15c2292eb5b42550f812673194b944b830051e4206670bce9734f53232b408a6cbe7542712352c453cac39741b5b940151580482b4752d16f58a1c090b101cf985034299840a186a1061e59eaa300b66fec19a3abac920a1a12e1e4070aa37893923067614f9e53c0d859917626c6d6658a0324419d0b0d16a647ed57c3cee638400875cb0436671a0c9f472eede423125a95c86c60d2301c85660807f43f35208716905ab4153b6510c128e038920a3a13e957e2e209afb46c7e0c9e92fabbb80063b93c0a963b1aa2d49f48174f86c761d923259ee04c65f4b85dc110cb04ad4e26c369682e213ac4114824a526b2e6a21705174110b538e3562bd93cb251962e71782d89e562482a51949707ac8337b78627d489b193600636fc44c44898b2dc7c87332f3dd9c7579a68e0c01211fc1957c43d781473fd3bb17ce14456e62d93c236bd9656f5ea8088339668658ed8cc1e909a026fb76f0ec747d5a570ab88aeb44750710c0d10ac86caf73f8e2238b7e51da8722317973bd544834fa31571f48744b6a7cac95e1d3375949038588cb1d5d50476629432ca9e43076bd260b1a6a3472be2cd780177c4750b4080c09c820bf9f1ce2de695478ba26a216ba2b032cb7729770514f71700864ab0e3780cf94cb7e94c88dd673dd03b8690ac65b8e0c597fa8098111d36ea9fc4b166d9e6bd4935993dbc8f21acb9f53a20ee118a721541425a31705a5d67a6196c91a96dec2b2b48536e118afbd5c8fe46455aeb282a7a6e73b734001b6d3a997ff1d50ac7d3c97eeb4338f13f8eac05cb0b6f7f60908c0b1ed89682192a6ca384c7ded2170674c353d9aeb8696648cb83ac986dff669e23f49c47e9208df49187c1155bb1c876d1242098bb7951454e677c67042dcde2af77e8090935b5bada59c4252c6889b16765a033d98452f25632710ca5553559d76358c162c70c1b5624abc090b59960c65889351529bdae24170751a45a566ad858444ff61cfeb7003b08605f3b2558577f0e12b31a447d377294e7e4060ec12a5ecbb9770bb8707240c1237b08c744e70057d0e68e2fca1cced27a1997389bdaada271054f72b849329e9a2321aeb03a940c44239844e94181b627876838671bdb3e9b4061fedc74741b4b5e9c4b421167bf420cc8077c5bf02721076c1c5462d7624f8350af75c50eb7267a96359004166c84145e72b731d5a82d43469c98b00a0c2352b7806313c60c04dc5f5c8b39d50376a9461f2a8773fe06973e852a04025ba6592f632bcfc3ea0ae572a50023c684a4a7a0db573ad1494458990938c624e5928c028ec48a9a26492420781071d13a85a332dbd8abb8f318a31596a38c7efeec28bbc1aa38198aa66ca68d811cf5700d9e093e34f38d0cc74a989459ab0b200a8caaf6d40ab5e5cd651c05fcf68e14a1ae602560186a10aa452328218e41c49b7e5154c67099ec790e88ab641ae03dd6acb82c33a6d4034a775515c52859bfe354b2e881c7c577bd5663b19b124948739be90addb36348912710cc12102553765c580512b22ea35141ea4ffe681045497fca77ad2e35c1a5b31baec2a8279c783d28241c923040607d38463a9b615be08ab87acc5e31b84ed8376d75f31dda47c869f82ce14022acc6c70429ba854b58e942635a12209240bae3137ec8a40e716655a0a82bd02003f20428d15806594435de6c39b746298aa9a693577783c71154cb31b7b31283f46733d199ae627ddb7947c4f4aaf1172858a97ef6140f56477b80450536396399a14a984caea756b1b5c09ed1f43c4e1754f40ad0bfc8c5f153346e0113930a3c9ad215f11c4ece2875c41516b0a8452e948f3f3cc45960bdd8b23f14eac17927142eb4a72ef6c3585899efc128f53b022015b2bbb9642b5675be352b9d442194d54d5b40a17c236e8a275dc2358fb31471a3f521b444040d983e64976b50f71441982f29fc690c41a954512f82a3abf85235847a28982009e3303239454ce0c7a2c3840cce031ad37516e6a3ba59b79ba4478afdeaa8ee8ac4731ccbb34125d0a7c6504a8d7e285171a464129b714d8521c69b8d952b4623aa8967f644c8c08bdef96117198e56c12602501201e036804129d528d717640ea33c9fb4885d61fa43860dafed4282b108 +private_key: 18264c57aab774ea1ba3555c788511bbc7bec8d072c953579d7b8558425123a057f94bc5670c85b11b81963731fc611bf751973a1105c7138d9c8ca76a559d20d25c79b64b70a91224e8110f623da7097668bb1ea2a17d8c085128225af2506c3f52a1f57011f849cecd605340724aa418ca6a86204fa02b0efb0102e4b2d6f34a2817643ba33561827b3ea92fe0270fbfe89c3f84438c4397ebe8a735a77cb8597ad73b95d170b329d491ba624660a01edd634acaf45303133127e11b4a3b95804620a7c6b1f84bbd916744d18487a5d9a54697716a965b7a9530dcb406ff8b276787ac9e846cd037a00852662a6b73e976807615bca1c00c1554ad0282b544daab0533b1ae9c1e71061dc18a79486c7ff9f0771a8138f93983134c5cf123955e748ce224ce925883c3565910088fac9393d423ad55ba3fad9012faa77957d88573a721f372b2e3fb977de30f72116090cb1cf02b0c1ea68cd23cc593e715a6a53493759f16a26a5c5745787115aaa233ec305b65b846c775bf36a754c8d563e25ab9e7681d589632131b8596b36a4fea7382938e121c38d4b2b218b90d4c602354a3bce5b58c4841c8daf61f8573b7b1e46f38e203bcf0a0d0981576a45215f2c7339a6fe91839d899b995b839b9b465aa942f994913b906698b9a31530b0d4f096de5aa3e885c6ad9468e1e674fc9b2acd26c4a20ea5363f32d745a0af3f037adac5350f07c5ca17738a243a29564455290602884866913d62413ca628aeaf248885b7517033583e05ccd55ac272b8cf142bcdf0bcea1a9c271e747c8507fa6bb89b1f0345300bddda4bf13b40dd323c860f237d8f2b14e03cf02e923990bb8baf13fbfd355cc3cb46bbb41b2f265a403c58e440306c7ca5a11cf2265562898b2ec28b5c6d396a1c668fd95b02e3451621a2d7212793e0921324450d601a19c975d877c84a91aa4b1e381d4f9256c0428c32809857b1cce8b7ba412a3f7d4b3135954177865677c45191294636241609c533d548dd5e8131be776724068a59242c1263e55abc515e4b3536c6cc836a140062e11dbb43ef9831a012b8c34714467906b78a5ed8a8e515258ddc6abbb0a110b6451544b78d85cb0dd78894d9ac491a7a5f08114833bb9c7628dd4061610944fd3a92205d7be722a8f2a51a07d75ca660107254c88653a79a8d79811543dbaa5205c290a4f615df4a24e7a7012155006db9715ccf712fd65876013a6c5f12c272c112db75e0c2983478328066496c34bcd763703e012076f85564719a4b477b8fc93845d30ba64164b28fa025ccb077a457f029b367ddc001b8cbed771b391857666ab88672b4bb5e4b653a8035225708b897fefd950f8d9614e310ef1b65942d53ba13611faf259f0a02c1cc357c36870b8b747fe1c66a5097ff49607007c0f52a74017d798dad417cb308ba8b0381f692081c51fda5b21cc5a471f5321d2128f0867714b141a37d983f3121054934b320aa2b044ac971870e0b2a6d14227c785504d341e3df90c586b5c66243b01b42f6686afc0c8b6a2faa636e39a0c550a7f61ac5af769e2573cea2a8da6b8adfb03b12c74b330b02042e8c2921239c45641ed1899376c7939c51c08a15e23493c9b8a6396c44bbaf4212b05cea4668a2e851c56ba56abd11410e21b7bf18347cb020c33429c15b6658248dc75224189cf5c53b920068c855b24f9809cfdf8c61bc9662e981d8dd896c8b99ee667cef1a4cdb2f14df05435efecc3d974cabda81dc18192bfb39ccd144787bb3a6051b06b1082f2b75eed10c4da0132d27c4fdd854b305b02c66a04dc50407d7160f1d54929e91a6a008d0a28cfe109be18774744250c69aa7ee7bc41944597311c87438441cb59b082a5348e312b30d66f936585f356c06d761ecb04b48339082f1542e3f3cd885aad7056a02d075aa825a3b99848c2e2ba518aa4e6662198fa871f744bff97351e613cf2e7505d2115be9a7386680300c1a985b39e0eb3769f73576eeaa28ed8c0f3b76ab5acb302877bce254fcf3636b4f6c4e0089d59305d5f819be4f380d669186a24214e9b2477334c25d23910907240ca8f7e1720dc8abd38e2b88246be2a55c72f6c1db3840370836f93992893b98f42f9180778795830ba59f09650986e5197a4dd239f99e7b5f8ca36bdd81e5969c6e2f8a58829a9b7697b6b36983e896e82b40738740fa2e6b657616b0b4cc0b15c2292eb5b42550f812673194b944b830051e4206670bce9734f53232b408a6cbe7542712352c453cac39741b5b940151580482b4752d16f58a1c090b101cf985034299840a186a1061e59eaa300b66fec19a3abac920a1a12e1e4070aa37893923067614f9e53c0d859917626c6d6658a0324419d0b0d16a647ed57c3cee638400875cb0436671a0c9f472eede423125a95c86c60d2301c85660807f43f35208716905ab4153b6510c128e038920a3a13e957e2e209afb46c7e0c9e92fabbb80063b93c0a963b1aa2d49f48174f86c761d923259ee04c65f4b85dc110cb04ad4e26c369682e213ac4114824a526b2e6a21705174110b538e3562bd93cb251962e71782d89e562482a51949707ac8337b78627d489b193600636fc44c44898b2dc7c87332f3dd9c7579a68e0c01211fc1957c43d781473fd3bb17ce14456e62d93c236bd9656f5ea8088339668658ed8cc1e909a026fb76f0ec747d5a570ab88aeb44750710c0d10ac86caf73f8e2238b7e51da8722317973bd544834fa31571f48744b6a7cac95e1d3375949038588cb1d5d50476629432ca9e43076bd260b1a6a3472be2cd780177c4750b4080c09c820bf9f1ce2de695478ba26a216ba2b032cb7729770514f71700864ab0e3780cf94cb7e94c88dd673dd03b8690ac65b8e0c597fa8098111d36ea9fc4b166d9e6bd4935993dbc8f21acb9f53a20ee118a721541425a31705a5d67a6196c91a96dec2b2b48536e118afbd5c8fe46455aeb282a7a6e73b734001b6d3a997ff1d50ac7d3c97eeb4338f13f8eac05cb0b6f7f60908c0b1ed89682192a6ca384c7ded2170674c353d9aeb8696648cb83ac986dff669e23f49c47e9208df49187c1155bb1c876d1242098bb7951454e677c67042dcde2af77e8090935b5bada59c4252c6889b16765a033d98452f25632710ca5553559d76358c162c70c1b5624abc090b59960c65889351529bdae24170751a45a566ad858444ff61cfeb7003b08605f3b2558577f0e12b31a447d377294e7e4060ec12a5ecbb9770bb8707240c1237b08c744e70057d0e68e2fca1cced27a1997389bdaada271054f72b849329e9a2321aeb03a940c44239844e94181b627876838671bdb3e9b4061fedc74741b4b5e9c4b421167bf420cc8077c5bf02721076c1c5462d7624f8350af75c50eb7267a96359004166c84145e72b731d5a82d43469c98b00a0c2352b7806313c60c04dc5f5c8b39d50376a9461f2a8773fe06973e852a04025ba6592f632bcfc3ea0ae572a50023c684a4a7a0db573ad1494458990938c624e5928c028ec48a9a26492420781071d13a85a332dbd8abb8f318a31596a38c7efeec28bbc1aa38198aa66ca68d811cf5700d9e093e34f38d0cc74a989459ab0b200a8caaf6d40ab5e5cd651c05fcf68e14a1ae602560186a10aa452328218e41c49b7e5154c67099ec790e88ab641ae03dd6acb82c33a6d4034a775515c52859bfe354b2e881c7c577bd5663b19b124948739be90addb36348912710cc12102553765c580512b22ea35141ea4ffe681045497fca77ad2e35c1a5b31baec2a8279c783d28241c923040607d38463a9b615be08ab87acc5e31b84ed8376d75f31dda47c869f82ce14022acc6c70429ba854b58e942635a12209240bae3137ec8a40e716655a0a82bd02003f20428d15806594435de6c39b746298aa9a693577783c71154cb31b7b31283f46733d199ae627ddb7947c4f4aaf1172858a97ef6140f56477b80450536396399a14a984caea756b1b5c09ed1f43c4e1754f40ad0bfc8c5f153346e0113930a3c9ad215f11c4ece2875c41516b0a8452e948f3f3cc45960bdd8b23f14eac17927142eb4a72ef6c3585899efc128f53b022015b2bbb9642b5675be352b9d442194d54d5b40a17c236e8a275dc2358fb31471a3f521b444040d983e64976b50f71441982f29fc690c41a954512f82a3abf85235847a28982009e3303239454ce0c7a2c3840cce031ad37516e6a3ba59b79ba4478afdeaa8ee8ac4731ccbb34125d0a7c6504a8d7e285171a464129b714d8521c69b8d952b4623aa8967f644c8c08bdef96117198e56c12602501201e036804129d528d717640ea33c9fb4885d61fa43860dafed4282b108cac59b140df7d3285c832994e7a4ff5491c786281fdbd6f43a4c3902d4eac0d28b2809fd40008be70a6b184981101724bc3d5ec5e1956b510b82fd5ad0668a5a + +# Official test vector 90, seed: "d26ce360d399bf7b89dc364aa7ac06bb513eab8f527383e93e30727edc3f22c262aa0ec70257b39edff0630dcdc1b79a" +seed: 6df4385db978d27b27d2aa5e452e4152b36f097503d9581ac3390105c5727e7dc95fa08ed106ce84660e8a4c90bd2b22634e40769aa0090a101c5dddad45edc5 +public_key: c19093bdf18070e37b3ab06ade8b14de2b34ca99763f575e8d75177c72522c6c4eced8ad20ac6bfc4aa329e765f986579c373a3a333d6167c2c7440e8f4131ec305188c989140b63b65019f2949c81c36cbc45939c026a42a1554f2385a738a229534cc6552d5e76076087c9e5b260baf8724973b9152b3941fcbe19227bb7987d74856d3636049715beec638db8e3b1d4e3ba2a440b46445369b60e0ad3c9c07c3203e2716ffa51eb5005d1a797079089f6e14d86d988d7f960f0dcc553a83f7433be60a463b04423a6977599b7c1f7730265807b3f7b2bb8a625e0b0a0f3f1171d6c4e7a9a6cb5803b4871501453ac19b576364c3bd7e01f1bf475a9e71d557171e4d33bd3d14823672f27e356c89395c1476e0fa065dd168478bb710394116de27cc3b0617ef5b74ac718e8b8c152c052a4d57828824af38807d91295a0da9b49dcbda052317f5576e52b51eca732d8d260d08832918094de65ab48d3351b1327568574dcc82e3e8a222044984649271b3b45861ab6f5250a770b59071309d118adb32322739cad7227ad2b3460d156c065713f29a05ec48bb21ac7261aa6a0f3f19d05f0aa577cc8cad6a7fbd25826a3cc6ee225c1b183d8e124055414c54469e4e410828bce94a5cd95e22c7ca3770ec5a023f0656447621006929174850c786fd6357f36188a4884cadc108485277890a0114b4c565747c4165196e3e90cfa659662d992c33bb2582970ceb60582a691d66174952841ac5a64e53b31566671054486ee20437e245e234176ebc696a55a53308abf020b40b944cbf382155ba02fb9ec298aac3c2b81278772c9e0c730ab13c6f374ba8c886300831adcf9ccdcc566e2456bef479f4ed08ef803ca8719c382dcc667a21897db1f81b41521790ee233020f3301bc9910dce2202bf4329f632542f820bcabbd2bf38962e6810bfaaa5377a83b10a62495029e99c4becba9f0b3a54f70788f97ae54f01781b8505c27c23b810ee9c7452952af9339c4ab88aedaab3b9f951cecd828daea0888a3481ab39207a6851c0285226136ee392996c41b7d93221df711d44531c8818bf3b71aa65aa0a3b5055634699b007a47210e9583928ea984c413598868bfbd021cff817c426caeb3a77c9067b04dd3cdaf2b840af6a44e5a5ec3956b21697cddcaa035c46159262524e55f9923a5c44c1c747a1e35889b20ac2ecf5883577c0722316d6a82a88b21c8334ba25a442101b6828b10b1d9280f13f867e10c88ff3cce3af457a4ba82ccc4c231ca991b79c66be0c56666c80656845789b45f0606539149cb12b0917b297fa683031413d3e89d3e38544ec40cbf288320bc3b812311ef69125e641232322e3f1ba325b668174179e38868bd50233c78b0cd8721acb23b0b065a13f36a2b8b8245095cc785c64997add4a33b45e9a602b10edb318830a046d8f700b2e76094228a14a251e8f48403914cfdcb9e3ac0795f907cc592ae18d322ebb882a1473ff2fc666b7a829189a4910c60f8b1193d59515280bc5a9169ca6433c4e560db8ac756944fd9ea1dd1a0c9f9f57a474c32b94730460046251aa7d27a9a3f2c617816386207449d8c18f04537084a3f464b737c1a49e59c9042876e0556b92139225fa3aadad3b5f18752dd614c1fc200923c0e0b4804fc5b26f7c6cdcc684da00289ce344518c7a480936e46ec4c01b36a7f2645074b26d0414fcfc46d2ada8fbdf1c50c128ec5d2abe11ac78205310ac8aea724a117f00246046c4360662101b191228628383cd9047a28025cf8d6a47dc161af353e9067ae4433803c48b3cde24466d00aaf68be2eb1a209e8b1f6264fb14873edac70f834c710acc18fa4c6d16a627b03406fc7501ef71e62963e01869c80787af2d96a4ef8c72d273a3318c2826b8bb513bb2f6739648666af720fbb4b7785c853bc1aa4cca2c9d5852706b7bdde4c06c78c960265ce1887b5e13275f42377447751ac0bc811e26c2f65bb19e058d573a64959bc0d74727a4b5ae8ba23f2179ffdfc171563712eb028d9524af43c6143277bbd537f1155b04c0006b66036161472a199764ef7283e044c62a7244593564b15436b435da9e995fc803964f631f8332fc8887e49a87c5812860cf96747ec5891a9ada1e769af720e946c9727731449cc7179f73e867c8a63b210d73ca9f8d4eb44b5da3b57dfed46bd22ab85b9bd915556 +private_key: 6a45c4d6507cd4abc9be8cc42a75bb661007f8bb7c8a408e51fc9b63fb8575683e3ac77aa6862f808529819219d8639f0c261ca4a2c2021426b53c19eb7c6dcb554f39952c0f4940fabb4c03903c5bd2592fd4178a68601a8c4b4fe598b3b874dce5581063351683a672612904b17bca915ff161c26aa8a27b212a7650b0858736c1d7025a987c91171e4465702007b4bca05fef05186106b895c62c42f33aaf449ea0d4982c46276069a970e04e8c58ce53356f18a99c7e2a8b1a9714a64aacb42338a2e05f377b969c82958891a9c335ce1ea24865ea1440d99038d82035cab7d011508a802da9b51a00192344ab9a38a59a2b203b448639b89a80b2c2b3f6163562cb2a01f526bf812181ac466c55013c94190172c086a2cafba3152ff247b89120efbb1e957a33615924c34c0260034a9163c3da2b2afa4302595c4170953864990a95146dbf30b379f343b2f236c03bb4851775da2a50f9a40121f7107d184d410975ed743fdb674b179c396b33c808b1af0e717eb95000b62526598879fb5b972b54668b62306cc2c196f81113b72f6e4b0433b44251121cb7b872c54656a8e211b30b57c17a29fbc91de1a8943eb2a0ec7cb04b4b3d4d057c12181684519da9da271e8189c8a6171f9108740482da39c8da064f5d2745ea9585702601513a2c5c1322fc95a7ef15ad1c4353710080ccf396f2f006335480ac1932407b048e72c0ac24a106051e7737a1e11ab0905ab829404b5e37bca2ec9f9bdcb370b68404875061f1035978a3c7f7962fe015aa4c019465cbf37c929848c335e9cec829218e15902fe045e6d43c845b99a8878ef7a73238fa87cf0c58dcc3913dcb29238928d948c94bd54029d9651b25401e64a29df9a04c15bdf047a3ae857d74a5a22b383069ec24bfdc3e0d85aa892c6e69651a07eb61ccb40ea1d0bf624a17c4b849fae348f8a8c326f875dad81227465688b264de92a195635a690b3d6126989af58cb6e205cb8253ae8472e2e9b2c8d711fea534ba41c108f22cef0829f1bb4372d7a76dc4901f07aa413395998734390c07be80ca1dc6cf087b11ffb180f94b86c051b505752d27ac9fefa29fc849c77201b90641906492b54cc595e1dc71738a678451aeb9d4a30bfb2776435eb3d990f8405623856abc7980b0a4c65d40abba6278fa4c7b3ecbb718180fb3225b597acfc7e43caae9413fe858359334499a921b3216a03403672b6b1920c6f39b8ecdba69d87ca52542cb0898477587aaac8369f6e39ac7609c437456290434b002b2c3f32b05c41c1f827accf461dc159fb7caa9856438fc232a5b4545c25c66a8a25c1f240eaaaa263f22cf5fa86506b51fff385affd91b6ad8bb599633264c3ce786670ae70266f898a48040639ccf334188774c90b08b99e1a07be3244d7ba319146711faa921b647c7227b6caaa70152701562d81bd1d1cceec218ea967bdff454fb176f6ec504d7285779c3866763cff23cad659803b41448bfe253e391a21c67b89911c06e7c78b6b2ac56f737aa027cb7f80fcbd0897f60781767980b89266e342e80c97bc2336be308a7ce393a229836f765086a6709191878570c6919d825e6c2a8f3fb9b4689079ca814759a8234b5c49c19623ed637859b991335672e168b7a31b788667cb088c4da1a64319824f2002be6d942c3e4891b032cdd347361352ffd3022f68017184110507017243c68906425c883093ca944ea118b20a30e05f740fb86c96742cab2c086c4309fc53760e77a8500fc6830ab9fab96be00a319615905325103113956e233728a8c8755789f0b0b5f6061b320f0c3217415eda617d33758fda34c0acc07c4c46a7c457ffb2ab6962397e1349325a90dbee0aaa5977047549f28873e034aa770064fcc40c069166061b5ad66277320e989712a30a8969882e275b160046bc80077dca73b307d71979c55731741e916657a1a46104d511b7bc8378b833350be93c3015b68a8c651b960238853a294853d1f60a32d016721c25a30542367426fe2a22b45945a4c61117dac71cc04a9ddb9b86a5b4b25569a04a19d28778e6fd27ca9763db9e4b40a773b1fd53dc0466ca2086a561969d842310e5bc14cfc22fd3a5b4a969800e036e47c9f07b3aaaa0181cd8cb43b11534e267751337bfecb7ac19093bdf18070e37b3ab06ade8b14de2b34ca99763f575e8d75177c72522c6c4eced8ad20ac6bfc4aa329e765f986579c373a3a333d6167c2c7440e8f4131ec305188c989140b63b65019f2949c81c36cbc45939c026a42a1554f2385a738a229534cc6552d5e76076087c9e5b260baf8724973b9152b3941fcbe19227bb7987d74856d3636049715beec638db8e3b1d4e3ba2a440b46445369b60e0ad3c9c07c3203e2716ffa51eb5005d1a797079089f6e14d86d988d7f960f0dcc553a83f7433be60a463b04423a6977599b7c1f7730265807b3f7b2bb8a625e0b0a0f3f1171d6c4e7a9a6cb5803b4871501453ac19b576364c3bd7e01f1bf475a9e71d557171e4d33bd3d14823672f27e356c89395c1476e0fa065dd168478bb710394116de27cc3b0617ef5b74ac718e8b8c152c052a4d57828824af38807d91295a0da9b49dcbda052317f5576e52b51eca732d8d260d08832918094de65ab48d3351b1327568574dcc82e3e8a222044984649271b3b45861ab6f5250a770b59071309d118adb32322739cad7227ad2b3460d156c065713f29a05ec48bb21ac7261aa6a0f3f19d05f0aa577cc8cad6a7fbd25826a3cc6ee225c1b183d8e124055414c54469e4e410828bce94a5cd95e22c7ca3770ec5a023f0656447621006929174850c786fd6357f36188a4884cadc108485277890a0114b4c565747c4165196e3e90cfa659662d992c33bb2582970ceb60582a691d66174952841ac5a64e53b31566671054486ee20437e245e234176ebc696a55a53308abf020b40b944cbf382155ba02fb9ec298aac3c2b81278772c9e0c730ab13c6f374ba8c886300831adcf9ccdcc566e2456bef479f4ed08ef803ca8719c382dcc667a21897db1f81b41521790ee233020f3301bc9910dce2202bf4329f632542f820bcabbd2bf38962e6810bfaaa5377a83b10a62495029e99c4becba9f0b3a54f70788f97ae54f01781b8505c27c23b810ee9c7452952af9339c4ab88aedaab3b9f951cecd828daea0888a3481ab39207a6851c0285226136ee392996c41b7d93221df711d44531c8818bf3b71aa65aa0a3b5055634699b007a47210e9583928ea984c413598868bfbd021cff817c426caeb3a77c9067b04dd3cdaf2b840af6a44e5a5ec3956b21697cddcaa035c46159262524e55f9923a5c44c1c747a1e35889b20ac2ecf5883577c0722316d6a82a88b21c8334ba25a442101b6828b10b1d9280f13f867e10c88ff3cce3af457a4ba82ccc4c231ca991b79c66be0c56666c80656845789b45f0606539149cb12b0917b297fa683031413d3e89d3e38544ec40cbf288320bc3b812311ef69125e641232322e3f1ba325b668174179e38868bd50233c78b0cd8721acb23b0b065a13f36a2b8b8245095cc785c64997add4a33b45e9a602b10edb318830a046d8f700b2e76094228a14a251e8f48403914cfdcb9e3ac0795f907cc592ae18d322ebb882a1473ff2fc666b7a829189a4910c60f8b1193d59515280bc5a9169ca6433c4e560db8ac756944fd9ea1dd1a0c9f9f57a474c32b94730460046251aa7d27a9a3f2c617816386207449d8c18f04537084a3f464b737c1a49e59c9042876e0556b92139225fa3aadad3b5f18752dd614c1fc200923c0e0b4804fc5b26f7c6cdcc684da00289ce344518c7a480936e46ec4c01b36a7f2645074b26d0414fcfc46d2ada8fbdf1c50c128ec5d2abe11ac78205310ac8aea724a117f00246046c4360662101b191228628383cd9047a28025cf8d6a47dc161af353e9067ae4433803c48b3cde24466d00aaf68be2eb1a209e8b1f6264fb14873edac70f834c710acc18fa4c6d16a627b03406fc7501ef71e62963e01869c80787af2d96a4ef8c72d273a3318c2826b8bb513bb2f6739648666af720fbb4b7785c853bc1aa4cca2c9d5852706b7bdde4c06c78c960265ce1887b5e13275f42377447751ac0bc811e26c2f65bb19e058d573a64959bc0d74727a4b5ae8ba23f2179ffdfc171563712eb028d9524af43c6143277bbd537f1155b04c0006b66036161472a199764ef7283e044c62a7244593564b15436b435da9e995fc803964f631f8332fc8887e49a87c5812860cf96747ec5891a9ada1e769af720e946c9727731449cc7179f73e867c8a63b210d73ca9f8d4eb44b5da3b57dfed46bd22ab85b9bd9155568513eaa3de494e114c2700ed07ffc1c2f8ef741765e8a42579da4946ae0a201cc95fa08ed106ce84660e8a4c90bd2b22634e40769aa0090a101c5dddad45edc5 + +# Official test vector 91, seed: "c5856298c3cb6ac9787a0f30938537ab2635b96f6d19cc9522063360e7a5c88e644929d2879180e3e5bcad2422b7cfc3" +seed: dbacba825728444921b227cdba54446b3f6881b47be9cd02832f78b023b1bee0e15274a8e2bc08fe818b117ba28c5dfae74d54fcdf6f20052f79be333edc8dde +public_key: cc9a64734c470128056a7b5d374435c099752edca129091770d6af831ac7805a7dd5657bcbbcc9d751b140283a2ec533c17ba38a392bb98421a4f0731390c30a8701c1396a4c17cece6cbce99949d0279119e8790722b0e2c748348a8a5a7c760826bbc0d395313b893a796b9d572c10432b2f5363b9682a89d1174f822bfe38b05ddc5b68ba3ad62497c3ab8ea6d13b11a6a69ddb1f1340b41f013952da1ee1e759d2d5459a01cece819e5de09b8d707c7d59519369660306c4174505a51846d5476d41d00393979293c1325a1b6673f16c32550529b21121e95f99f503cea88530e2c72b038aa641327181673e301dde28b0ba76b2b88453d1812499681cddf932370c864bc6205b6cb13684455fcc5e008bcdc16597ed661b3732a60e329df82820af51b1ba4647a7944c4dcc7a8f1bce390c44a9a7221e0c0943cb4ff6f048e2362f89f4113fd3636b97919e41acf042189e02a83b580e5d4a996fec6d6b7b33d690825f366d89f8952898152b3671685a22d8898bd62c83c32a1e3076aeeae845900ab2cfab51ea76c3022b52dc702d05b17a76609c88e69d12d7694edc3e91420737b17bb6844a1a28c0c756038a8c6c6a74906232b50d74cf532b5266d32d01034c56aa898d624727e5363e0bb300203e792b3afd39b5376998142acf52f6933a594c9a5872ab619a8a4317e86a91d419a78d47245b1780bef14abedb77ccb97d550ac223e5001e0b64a61b8fa0526331b409505a512b4b6ba7e3b4b630a112920b431292db5962b577af8d546b7465673a8641ab5807443085a9f0849b914a31393c1dab0fa30b3b1c1261bdc9a8ca69cc0f0432e91c1d42b6a8346cb6fd9cb49b189d125c8be422a690dc90ed4a87c70ca8e35caa16a35a3120b9716bae021c861267aea4244219c60fb1c788ce8264c0241156340daa3b1ae7725c6552cdadd4c244079cce22aa083a1a2c0810fc7ac55d77bb6ef934fb73a8e8f4cc299b28c42c5d26f36518ba4cd3b320ec3158b8b36108bb6d4f6427dc46653ec24927a833853b4b0af5723d8a3c5f37c17b3476d86161c57579cd020167a70c1c310325c6707fc82270f0c73d552363e2343b371fc1448b2770bfae474707305a9b32a6aa77c7fc7715cb35826bfa1696d67ec48cc0c9554691d186dd025ead64a9e39657be0292f39829ef696d3584b99c7367a00034395252f2443ef4692c163a5ff1863be79273a93192d10b661b9051d57572d5caa817338c52374ddb282d4722b1efac7339f1ce852867e4ba2a4d368ccfa58fda097fc59244fae273aa7c63f891bbbce875624800dca2b5d65b5a2d414a81c7525583c0160a006be08a68776223aa97525a1e97b241f59c0dacb50ec89b90bbd58e8f27c9f19729782b2c06bbb91725c3b6ca991e75bdc7850a0107674fabab38e28ac5b9b717ca7542ebb563d078e4c856447a0ac85c9240d77210e4ce850570ab693aca497819b5210e2cc957fa9b4542070171c56a2c1253e006cf12162e9168673a08d82b90812c8cb989394ca862aedb1ad9885598d39a42b3ac25bc914fc15eda2501d7c8c51aca0c257cb8b0c16de89900b2b12a875116cfc967553829e59510a00998440b93d8371a0b294aab2b4697196d397a9ccedbcb2f5414dc8c764189cbf720834327a9557cb44a90286277c54aa424d080822814626b753cb281b9f2fca8680c2e197bab18643c9b0aacf8445618a45814389466f67a5c557aeccabcf083cbdff5569e39cae20584ef46bb56456386f3c7ef5a5c196c51646b69154393bc7a6a6d0869e06c3f8ababbd7aa070f974e682398508a356c78c74be8108b42c6b53744c3742f16c84e5bc6750546739acbada819a2af9c5bbae2ca34f6215df82c10ac8a5873a2a8c04ced887730988c14f00a33821994503f9e3555f790715414095f05bc7d5c20dd9313acf98b10daa4053c90f3d2c0dcc676dba1cc0ec92427d4bbf61425935314494c3e65b266f16411a1250667954388fc5b750270e00a8bde873d3d58c627c6b31d8610597174366c8052f21e429c185bbc4c080122b4b25d00a982101b4b44c18bae64b7aad2a2bf646e39bb241df17d8c5b42db08ca0d6571097250072420ddea731357154e861809fcc1ceb7ad01d843ea928dcad3c1370b6b517f5473b94bd6351e282f01bf82a24c3ef05658b9e66735007b45f5b008a7bd +private_key: 1783c5f7f498d7d8c421436701176e6349c025970f41744b369852a6c2cfabc9096f48706a702d3ae62d6a2c79e068143f45ae3d472180c432d6ac6897633982806c87526ee2f837dea521fdc3c3a473a6d7405c2cdcbd1d99142d097ec5ac782cb80909b9c47b7a173922cceb52c926f4b5c904c5f342c460356c72751baf271a496ba3ded912e6810b8f498e78b194a02643b855aab4a6c7df2938a0da001c461b52829cda688aea4c21ccc478c04923406acf8a7b72f5b52cb091ca66d769fdcb2d2cf220c3eaa73db7888cb37ebe441d81d0b53bf41259433922a1c6df57062c2a010bc3c190e7c19157207d1b607ee33469334b3ee4500bda58a1785b2c247410573d6d703d822149a5ab5a4e811516b69d76f3a80fe8b84fb8ac7f3568cfd69521036541e975e5c09f63905e571531984921f9c159cc2964541b0b55860270ac7795f0c26a3b9fba603c26601322ba61ac86722b7933edd01c68a292c783a56d55c0254439e936af5b9970241c73a9244a271a43cff187bae40ef9cc6d47f23f3b68cb4ac08180537b16daaa329345f17102bff856891ac52e25bae2e95ec2ebb21b9330067091cd7b0a963588e9700b89fc4ea40aa6c4a2c8b63568663b8c2ec9ac281ac3d470098f559f49966e01a91631f263b834a19ae5b3d6d150509815684c300cd483c3fc475b324c8873bf5cb01609b58bf573cce0034b19425edca86c598aa4da9bc4ad2cc78545917df6962ba4ca06b0bbdb322fe300984e16b982773a0c1a1bba55a14f575150484f2be11ccdf97846a33aa8580c22aa647b7089a73831651c506045a05e785c1d682a0af364b4cb1fd704b1c306523d6a7394ab1abc34719a0c97f49cbe6ce9519f8b03556cc9c72c613e513aaa68074130456f2ac4775218f7a1c35ee07f229a7d59994f6b909c381a0385c2a6d1bc8d7a60a1a113442de3cd785b7679230ca6d49d17f2c7fcfb1fc2e7121e20b87cac2817e26854c392dbe25b31753db9c5923879777364530c4551c28a3a5d83c9631008571c2f889889e8c835eca3ce30e81c03cab74b3b5b198458f0f81cdfd6ce88e7cb79f704c0159b83345232541cf4ba04a1c2c2a929c3687996d25ab65fd9a93cc6590846a861c5b72ce4640b47673e5a883d44162f914a318a163b5c33c37a6330f34b28b22aa639978598c3c6ac93d811c60d0330ab500d41f950e51c9fde115619f022f9e88f7892ba41330018da306f42bcbc8cacecabcdb0e5085bb687fc14c55ba8630df92c3a2b7867e951f3ab12f8ba2417a70f766c60cddc85a012b60e368f7c75a6102684efb14d21961f2231c0394520ea813eea69465a8a8582e89beb3aabb9b42fbee8bbd4900ca52247a322837d58c9c7b0a9e5d246178862253c7baf2081d7c02367956a7a68554debac141c634048053d602645a88549b94c95d907ac1c02058c66fd5b894222331952c4e214ab1331a3b2a83dcbd8c747431565026ffb231e9835961919c659f734c665636196aaae827bbe2c30f736384f74cec5ccc3de622879f6afd1a0c472509f9460b07e524bdc65cf605a36ee35cd6267403cd91b8ad8376c670c3be6b4ea42c3cd46b275b9394db41e0b389642461d443ba0163b7d7530243b911a64a27560e3956f18744a673606089fd611c9b5d4b6e9a5c0927632b259056d95235ed5a0490435127405cb164d8b0540bad0b706a431fe077d2e385e4b64beb3a8527c1921d119c6676bb4e59937e0600c07f0925d665a9b643e034478def83188f4caa30764394a3fb0c3b9f4c2243b0a53f8b2ccc5d96ebb0478201cbc7e165fefb565ea149bed831df5dc4df16531460a28c6e708a7686f61101d327a88f998223c9abcc7d22b5ef78765e075ae4aa41730c3d507837080c4955614e88826ef4a8dcffab0bde615673150a7f36ebac7bb4c793dbd9a11f2e765bbfcbae5d2ad2239ab9a2548ea20c47458b3a998533df6b3900997770153c73955d200656314b90bd49d6d95407302a67813a62ab3b63d61b9a3195effcc87d6ca43cff278bcc65ee0bb06c3da296a117b3cc86c78e29c33748c0d293e243c25897b200f3b2d7a5b96215822d310805a35a331615c59172709baa171d947d1b12e2c2699fb460b8219992fa09d529069c40138f24cb4cc9a64734c470128056a7b5d374435c099752edca129091770d6af831ac7805a7dd5657bcbbcc9d751b140283a2ec533c17ba38a392bb98421a4f0731390c30a8701c1396a4c17cece6cbce99949d0279119e8790722b0e2c748348a8a5a7c760826bbc0d395313b893a796b9d572c10432b2f5363b9682a89d1174f822bfe38b05ddc5b68ba3ad62497c3ab8ea6d13b11a6a69ddb1f1340b41f013952da1ee1e759d2d5459a01cece819e5de09b8d707c7d59519369660306c4174505a51846d5476d41d00393979293c1325a1b6673f16c32550529b21121e95f99f503cea88530e2c72b038aa641327181673e301dde28b0ba76b2b88453d1812499681cddf932370c864bc6205b6cb13684455fcc5e008bcdc16597ed661b3732a60e329df82820af51b1ba4647a7944c4dcc7a8f1bce390c44a9a7221e0c0943cb4ff6f048e2362f89f4113fd3636b97919e41acf042189e02a83b580e5d4a996fec6d6b7b33d690825f366d89f8952898152b3671685a22d8898bd62c83c32a1e3076aeeae845900ab2cfab51ea76c3022b52dc702d05b17a76609c88e69d12d7694edc3e91420737b17bb6844a1a28c0c756038a8c6c6a74906232b50d74cf532b5266d32d01034c56aa898d624727e5363e0bb300203e792b3afd39b5376998142acf52f6933a594c9a5872ab619a8a4317e86a91d419a78d47245b1780bef14abedb77ccb97d550ac223e5001e0b64a61b8fa0526331b409505a512b4b6ba7e3b4b630a112920b431292db5962b577af8d546b7465673a8641ab5807443085a9f0849b914a31393c1dab0fa30b3b1c1261bdc9a8ca69cc0f0432e91c1d42b6a8346cb6fd9cb49b189d125c8be422a690dc90ed4a87c70ca8e35caa16a35a3120b9716bae021c861267aea4244219c60fb1c788ce8264c0241156340daa3b1ae7725c6552cdadd4c244079cce22aa083a1a2c0810fc7ac55d77bb6ef934fb73a8e8f4cc299b28c42c5d26f36518ba4cd3b320ec3158b8b36108bb6d4f6427dc46653ec24927a833853b4b0af5723d8a3c5f37c17b3476d86161c57579cd020167a70c1c310325c6707fc82270f0c73d552363e2343b371fc1448b2770bfae474707305a9b32a6aa77c7fc7715cb35826bfa1696d67ec48cc0c9554691d186dd025ead64a9e39657be0292f39829ef696d3584b99c7367a00034395252f2443ef4692c163a5ff1863be79273a93192d10b661b9051d57572d5caa817338c52374ddb282d4722b1efac7339f1ce852867e4ba2a4d368ccfa58fda097fc59244fae273aa7c63f891bbbce875624800dca2b5d65b5a2d414a81c7525583c0160a006be08a68776223aa97525a1e97b241f59c0dacb50ec89b90bbd58e8f27c9f19729782b2c06bbb91725c3b6ca991e75bdc7850a0107674fabab38e28ac5b9b717ca7542ebb563d078e4c856447a0ac85c9240d77210e4ce850570ab693aca497819b5210e2cc957fa9b4542070171c56a2c1253e006cf12162e9168673a08d82b90812c8cb989394ca862aedb1ad9885598d39a42b3ac25bc914fc15eda2501d7c8c51aca0c257cb8b0c16de89900b2b12a875116cfc967553829e59510a00998440b93d8371a0b294aab2b4697196d397a9ccedbcb2f5414dc8c764189cbf720834327a9557cb44a90286277c54aa424d080822814626b753cb281b9f2fca8680c2e197bab18643c9b0aacf8445618a45814389466f67a5c557aeccabcf083cbdff5569e39cae20584ef46bb56456386f3c7ef5a5c196c51646b69154393bc7a6a6d0869e06c3f8ababbd7aa070f974e682398508a356c78c74be8108b42c6b53744c3742f16c84e5bc6750546739acbada819a2af9c5bbae2ca34f6215df82c10ac8a5873a2a8c04ced887730988c14f00a33821994503f9e3555f790715414095f05bc7d5c20dd9313acf98b10daa4053c90f3d2c0dcc676dba1cc0ec92427d4bbf61425935314494c3e65b266f16411a1250667954388fc5b750270e00a8bde873d3d58c627c6b31d8610597174366c8052f21e429c185bbc4c080122b4b25d00a982101b4b44c18bae64b7aad2a2bf646e39bb241df17d8c5b42db08ca0d6571097250072420ddea731357154e861809fcc1ceb7ad01d843ea928dcad3c1370b6b517f5473b94bd6351e282f01bf82a24c3ef05658b9e66735007b45f5b008a7bd627d8e894a4fd9228571ecb1041a11f23220b1b83a46d7ec32691ec9bdceac14e15274a8e2bc08fe818b117ba28c5dfae74d54fcdf6f20052f79be333edc8dde + +# Official test vector 92, seed: "a28ead0a08e7228aeff602b16a1e752278b8ed1e91dac67994f5adc372e1d82f95cc390cd97ab9212275e0566c833fd8" +seed: 690eb71fd7052b906eaec09937a8ed374e0b02afa27c2f14399932be5839fad281c38c2cb5cfafac81b96a810ab749b61806b6d54c9f8cf4bf1be0192423288f +public_key: 60c06a2db222a10a620d78b129042477537aef90b5f0f20a58b6005ed0234f3168ee927d726733c3221035f21dc2a95471fc5aff57381741c9ddda97273909ec4c68d4b2a22019cc2d58b0f40860cf429c20757c91269979a17e5d01aedfc21d3706369c3294617628bb97c2655656301772007414aed6a9113ca543f9b027b2aaf0f122d1747a800a49da48239eca99fd4443566348a3f8142c6ca511e769cee83d0513444e7778018211f3a683ceda1ba2881a37f92586a54806858058b37aad546d48b4a5f3e6289c237a041814c0531b27045b8716c1ab1566ae22bb1eea845340791e2899020c8ac1d6724a0b8b432222b204b0b2ac55d924b4afa5083426c716ca2de71c99687748b56342ed726694ba5e63e42911f66f8f8b3111261ec39bb3dbcb9ed5c729b401a23aa26015d31bdf8c8301f61abe695066eccdee028b11322aa437c26a785899817893cb321e0b72e7a7131410772799500a116f612838d7601f66f29567e8a0f0b7477114281df703ca76326b8aba041457004156854c1b81092ffa869eb46807e6a1108ceb06f65453800b72ebb4613e2c363b6190eae29735d48e537a717e335c9f7b456c923c42a31b8f4b4dbba96f59362743d516a01400b8f1b3ea71954f85b0ccfa751d3428fecc2663d509c8b9a211c011313b5cc8e8930b223d08c95e5eeb47127a4bc5482b0e871a758893e9b64bdf4162332b8da6d7b29152a914f5c748a404fd865dc1224e0b64cf782b7c866833dc8773b20c6eb28ac57cf5166895cee2e78d41f97b5eea14400c1d329363915094bd5650377924c15c86ec833b0ea0b3e476aa91398c108a6e99e7ab64990513e061ca52756cf29238564cf0cab366f8753aba1fd3e9ab70621a0cf161b398c413a39280a268c1d28172d6501d313ed15284d12250e6b75704d1950bdc5af1959bc3e93156346dd3b47450f758d3e9796cba90598224740b33b239b97c45c696323a05cb15ea44ca4fd98ee589a2f5aa1d1ee00a476533d5baa58027aaceec151c9c5eda23b14367b8bf7571e7c75d197a55ed3a349de636bf84ad6d446e2c3ba5657c683622b136384be3b89c7eba095a89697b4c8ed9215d1e5544f3d957e51a86efc098fbf272a6140a17530ef6e703f272792371b7c5e36a83c61c7ec18e6bfa7752c095639420968b91aee627c3ec575d74b49fe13f2a216c711508a4ab1fe84a20bfb019aae1b8b3c8750edcbc30cb47ab0b567720421359a0c8c08295ccb705222141b74b8361004d9c484061aef8c19de9f8c809b90050f3345d65531070cd36d5b2e50047b97b61cdea5c3b896dc0a22f6ac2a2585295ae0993be023a498cbabd6b37d56c2f8db63804d0ca52a169f5d003efe695b6eaa2c530773cc4347d4b9e0e46a822a980a9f4c8900070c67437576c572160ac7b297bdd074c9eec3a368297f0a34772b8292d0b7a29faaccf7bafd2dcc6999b0766d106e04a76bc9118b7875c187b1f8cbb00b3c882f3bc6bc65b294443610c65b19aa72f90c7086ec18f228c36d63808b0aa253052c1a44a6842568d82b43a994b5b6c69555a449ffd0c3959870f3b679e4643842083b20a40401c51898e138a092ba393bbaca9fc6f37f28d88560a7992c5b95c228b3388a622a6f2839da96b121dda0c75c0b36ef162bd7981ec294ba7f91a97b34c69bca54c2b7e91548fa7c396f3d783255a79b3fc579cb62eed83b430c45377857190d06e5a26576d92af1b79941f922bb234a68b21309db9aede9765c78c486da51e400cb46cb586c33c46db9ba99b983b94815fc5b52b7feabe42b4253df9cbca4037819a47f8541bd5747ccb34ca74158318664b243c81b85484bf050ed3aa81ff37725f29b962f901f5f44b4768cd9db394fc7370d0ca72e1607f83a0cd82793ec3a23d3510ae6ef3375c3265dd8268b3f31bcefa83f8e5aa3d1077cc62a8ed858e6ed4639447aa3d705a1dfc4cbe7c4b74d67183a5875d24552ae74e546ab15376ac54f0582f3a92a1e1075cfb682a16b6a46ba93f31165f32654838c9e14b46476465cfe45bec653d2c0a1cef96cf01e123f1a3116c93b1d5e54730dcc5f9d618b53a7917a71abbcc312cacb170c10e454c41869717afd8aa4a86113ceb654d582af443a0b6a74173f963d99c8d44e5520ae278370855c0e9e01df9b37d13e35124e6c2590e9a231a219c07ef6c +private_key: 214a365e155f2468311a972eae496d188b7d7ce281b8dc49d326c2935829652b1a8e936030ccbee7989dcd407dc74a5da47b7387674310c37da58c0b9474a7dc5a5f97763211b6208ff9b7ad343b0c0b58b5c3b2e95210a2844c6b013d5c3610f71006e8c806bc61a90071bdddab9dd214cfc9f6501f6570305b5f03c38fcdd9516e73b76f5b6bf2b7665c70c31d763a1721628f73490402c8a18ca4c8f42c8a95b81e0219fc0c66db22763707c44e555924fa385aa212d4c643e6f51234728b47c37e67f2bc559c92b5a6248e9cbb8f197dbf4221e8fb938a4881c22841076c2c2ca6b5798b5991623160148a8de9c4c7667fc4ab2d30b8917304011015400644079be43f60f07b8501957a53a0acc69520871013aca31fd4b3bc246f5e300d8e84340927a645532b251945a9ca024892b0bab4769f6c27f497206d1598259aa0f2d649d560c082b12cb1d851d757cc38e1abd7a6c38a947b36e95579da29a25765f2d85d5e5016e0c91d25c6a7cac3cb4d504bf7046b7b32646cbab6a3eb8fc1ea63016c0cdd74cf63b8c86b790660c94110e4c6119736af99a75ffc2f98c7cb0ac653cb90cf69978e0859c610362b24b14c309476c53b5dd058c4075c59c2c753aa76b7e04520f2250319d41c6c6183921409908b6df6fc8e7d17296a9a0826101be7450ab3babea3c520b6735ea8d545949988baa98f7a2684f3b3c62e058b398a21a5f5073177798d1c44ee5c94ffc564357718b7fa59e68610aaf8294eeb0619502cda583f0a744d8a03be0a6c9d6f756070dbba4ef85ad8711bd691b489a3a23332a6e766c79eab5644e42378ba05b9ab0eb6d790ae65c2dbe3620c26783b8a11ff59850ea182e6258b5232833b4538eab3306023b2eb01b2ea157571791d0d37c6d79c2caf1601528b6fc1600ed3db72e4414822051b469b8b0e962d94c1672e318796e0cd17fc5df12bc1e7f6b91c5a3449c16effea06999bc5344c19b5d36466d18f5dbc56d7065a924b4f128639ee5acc2e37c02c5332e2919c1be01e799c27e18bbfb7404c6299b2335b6b410c4cf28474eb6ca8a4859f0a4a587ff6b356fc1c330041c72765fbdb1d2bb779ac384c53f77124faa473716047d2159a3326798b0d38c0c77c4568d6450a0aabc9780aa2b3252cd3da838094a867ab89e12c342953a3a0ab33bf6b27d4a0758c248dd9f2b0864c08d1083e32031283d979ad81709fe2466e7b15c7cc4429bb4d96b2733aec85eefac633f626edd8cc64114572608408d614e3c0a1473c046fc5405f46bd229b30659505094a312c170a0c21b33628a220a281637b3909d418268bcbbd746df44c5e94dc5ae6db45312b05f7c99985b3423755c17f9acbd7d831f5c3aed7f33284745f09e0cbd0f4b841fb84fbb6cd190072773388a334cfbd05a45468cdaa249ab02c4394c264c276be8ca164873c5d4e035b043c86d8a09d0aaa3e7f983a9cd3108f56ba545847ed27c29a1a84bb11310e556821181c4cb79b4abbaf3c123053f9c92ca15f6c326e2fe67f24a20ae584bdfe763db45ac37ca8a2239394cc86ba1ad976b7cb41b5304cf6eb23a5b8456470237731882bac17ba241cee78b740ab91a3b13b716634cd55c4faf9c80da43b43e13e770a90a9743f151958a267a8a6622bc57aa51ec356ca98034f836f6716840ff98dd190a6bb509d000211ac802c80bc3b28ec20c7407cb898980ef125b0fa34a88812550477dd267d37495930cba3f9e43f920a42ddb34eb7b72801fcad3000aaddb473210436e5110efcf52791c9593607bfc6a440a8043ccdd9965099a200c7a4aa93944bf7ac55132efc367aaa358eab042a6bfa125e19759f469ee054147c58adc98991cf92693708c75534a13e125b9a0540e423aa29059103c7708edb1cf626a95e2ac9e34b9694325e9c9546e7fc566a013128c2ae932690447a552c2bab21d249cc6590a1fb05ad0cb90edb8b7074bd7d172b1977581cc0840f1a69cc0abfba1091927ba9cf7821aae3295ceca3c20c018c3590c4151c0fd13958890195e761fb0c5bf8d1caa0b57087997e8495c430373362a71dcf670e0b1108ada374dfc08b57a0ab687a7d5b8172318c0e4fe868fd68a7da773dca08a71a49a4ca1b45ee3b223b785f2e6b0dd195ce79a1cb36751b60c06a2db222a10a620d78b129042477537aef90b5f0f20a58b6005ed0234f3168ee927d726733c3221035f21dc2a95471fc5aff57381741c9ddda97273909ec4c68d4b2a22019cc2d58b0f40860cf429c20757c91269979a17e5d01aedfc21d3706369c3294617628bb97c2655656301772007414aed6a9113ca543f9b027b2aaf0f122d1747a800a49da48239eca99fd4443566348a3f8142c6ca511e769cee83d0513444e7778018211f3a683ceda1ba2881a37f92586a54806858058b37aad546d48b4a5f3e6289c237a041814c0531b27045b8716c1ab1566ae22bb1eea845340791e2899020c8ac1d6724a0b8b432222b204b0b2ac55d924b4afa5083426c716ca2de71c99687748b56342ed726694ba5e63e42911f66f8f8b3111261ec39bb3dbcb9ed5c729b401a23aa26015d31bdf8c8301f61abe695066eccdee028b11322aa437c26a785899817893cb321e0b72e7a7131410772799500a116f612838d7601f66f29567e8a0f0b7477114281df703ca76326b8aba041457004156854c1b81092ffa869eb46807e6a1108ceb06f65453800b72ebb4613e2c363b6190eae29735d48e537a717e335c9f7b456c923c42a31b8f4b4dbba96f59362743d516a01400b8f1b3ea71954f85b0ccfa751d3428fecc2663d509c8b9a211c011313b5cc8e8930b223d08c95e5eeb47127a4bc5482b0e871a758893e9b64bdf4162332b8da6d7b29152a914f5c748a404fd865dc1224e0b64cf782b7c866833dc8773b20c6eb28ac57cf5166895cee2e78d41f97b5eea14400c1d329363915094bd5650377924c15c86ec833b0ea0b3e476aa91398c108a6e99e7ab64990513e061ca52756cf29238564cf0cab366f8753aba1fd3e9ab70621a0cf161b398c413a39280a268c1d28172d6501d313ed15284d12250e6b75704d1950bdc5af1959bc3e93156346dd3b47450f758d3e9796cba90598224740b33b239b97c45c696323a05cb15ea44ca4fd98ee589a2f5aa1d1ee00a476533d5baa58027aaceec151c9c5eda23b14367b8bf7571e7c75d197a55ed3a349de636bf84ad6d446e2c3ba5657c683622b136384be3b89c7eba095a89697b4c8ed9215d1e5544f3d957e51a86efc098fbf272a6140a17530ef6e703f272792371b7c5e36a83c61c7ec18e6bfa7752c095639420968b91aee627c3ec575d74b49fe13f2a216c711508a4ab1fe84a20bfb019aae1b8b3c8750edcbc30cb47ab0b567720421359a0c8c08295ccb705222141b74b8361004d9c484061aef8c19de9f8c809b90050f3345d65531070cd36d5b2e50047b97b61cdea5c3b896dc0a22f6ac2a2585295ae0993be023a498cbabd6b37d56c2f8db63804d0ca52a169f5d003efe695b6eaa2c530773cc4347d4b9e0e46a822a980a9f4c8900070c67437576c572160ac7b297bdd074c9eec3a368297f0a34772b8292d0b7a29faaccf7bafd2dcc6999b0766d106e04a76bc9118b7875c187b1f8cbb00b3c882f3bc6bc65b294443610c65b19aa72f90c7086ec18f228c36d63808b0aa253052c1a44a6842568d82b43a994b5b6c69555a449ffd0c3959870f3b679e4643842083b20a40401c51898e138a092ba393bbaca9fc6f37f28d88560a7992c5b95c228b3388a622a6f2839da96b121dda0c75c0b36ef162bd7981ec294ba7f91a97b34c69bca54c2b7e91548fa7c396f3d783255a79b3fc579cb62eed83b430c45377857190d06e5a26576d92af1b79941f922bb234a68b21309db9aede9765c78c486da51e400cb46cb586c33c46db9ba99b983b94815fc5b52b7feabe42b4253df9cbca4037819a47f8541bd5747ccb34ca74158318664b243c81b85484bf050ed3aa81ff37725f29b962f901f5f44b4768cd9db394fc7370d0ca72e1607f83a0cd82793ec3a23d3510ae6ef3375c3265dd8268b3f31bcefa83f8e5aa3d1077cc62a8ed858e6ed4639447aa3d705a1dfc4cbe7c4b74d67183a5875d24552ae74e546ab15376ac54f0582f3a92a1e1075cfb682a16b6a46ba93f31165f32654838c9e14b46476465cfe45bec653d2c0a1cef96cf01e123f1a3116c93b1d5e54730dcc5f9d618b53a7917a71abbcc312cacb170c10e454c41869717afd8aa4a86113ceb654d582af443a0b6a74173f963d99c8d44e5520ae278370855c0e9e01df9b37d13e35124e6c2590e9a231a219c07ef6c49cec726e5bc6c6280269fb608e754d097ae818b16b386bc895af3bb9f5f2a4481c38c2cb5cfafac81b96a810ab749b61806b6d54c9f8cf4bf1be0192423288f + +# Official test vector 93, seed: "92877d706daf88ef3412eb143db8cd91bc047a9a43b7acdaa42523560dee4c172697be4332042fcab91135839bf74ab2" +seed: 32e0ea9089fa928482c0770da545af1bb871a03ce38604138b0d08ea2a10ca2bc06c5bef7b6508409daf847a64c8d30d0974fd3ba7476dc76c46b458a036d884 +public_key: c75c9083566b23acc2e981457fab1306b04340969dd1081f074a2a33bb85b892750bd34336a68362e00302712410eb8fc8f37da6530a408b17fddb0fd602c2e40a7dc4c94ea843226ca79b167b180f3024a273c57f91cd69629c970617720497c4308e10f03a038544fff13a3afb83fb2291dbf177a003b0197037a3c9283de78dc911beacf30e6c4c6740300266c6ab69893aa9e112b67903df849a4bd59ba106030b62b61bc293fef997a8851d06c956631c266ad533791124a4e09bdb06c0ffa681cf2c6d43670e2a017b9a40c13e85bc1c24ad914003aa69439d401ba605d013a2baa0e0b010363574b71242745e9d709a3ff3b0a2ac7f374684bce9bcf0200db5a09b5d0c92cdc7bbfb3c24a79a8a4a0a9a64376a0793c1252362af170856046471b1a60eb33f23c59122d0aaeda79caef27df971ac8764986cfb2617fc3bb71355a56867c29795f46668f8166970b06c6ca91d8651ccdcbc23fc1b2f0a75c45fb3321151953315036d52322c9b6408152bbb595129f41a8b8570f02b8ccba66de5fc36d892457673a9a096c556c9afd11b06e1ca9cc8b3a9e9765e38e711d039612c4bb296061771e42efd68c9acc8ca61012f295251ccb33252e8b0e6486c5a5bc28683347571b8f0a42aec4873cd3549324ab728324030196035b29ad3043ab9008da6b924bd376cfb103fcbab9450b44c299b4e27165303786944009418cbc66fd9a570468dd85ab652d86402501d61f5272cd880056521f72a362170580675bddd505840378d96334a704282934527f70a499ae99db81516b1d1426d233dcf9855880022d72100e14858c0a226325338b33ab5ecc5a86e0ac4e8504e168c5e1a4788177878bd569d49dc60b1484f43134e2bd39efb207430aa564ab7a88cd40ecc00a10e4b6c663b61a6054323429c0722b2e4464ec0d43374234b4884bb8ddc0a28852600369635531ff943194cf91937b43afd418f8f964cf9c9cc66988407bcc7b5247a2372980035c8f8357bc3db948c0c4b391ab47636024dcb79f094c62ccb64893c0c45c1bc88cb00ba85248253606735547d424797b0bb302c5eb9631ac98060bc47341e69379bba5b5e44980970c699187f62731f2b1a4bb4c7a33f8a20758335bc8a3c4c4c0900b3c2cfe35356a58aae233b066466b34c814a4cb6b9f916581b0361e78a2971bbfc014a7476ab2f7c291ba688d5f75153c4ad7ba4c664a8002058c9eb195a3ca7ab70638bb114c3618bac3ab383dbf292705a478a35c31f06a1823b545366cb6900c59c036b063727504a55c2ac940606c7bcc74643644bde915d83c395023c8fbd069f9ec50e1fdbc8edb0387ad1074b11bfdf220edd7486082a4842d6c737c6a1ed5b98bb78cd6de1153480b3bf095b04a7cbccc19102964e34693a6e492fae134c9d726e49532236018dc517bd94232d717a408af43fd5c837a21cca33ecc2a3859eaf8a74b63c36fa70168f241e2ff52f7197a615d04357a7acca269e47848375bab1f82ac686903d44786d540a496e29642f71061ee76054b5aa6ae67cfa01704b386a657a6773b8509cc1b4e16bbb92cb204b5bc6638cc5dd868db40358dcc4c258915d1e93771a12aa7ca4b3bcd854ea2a111c09afbc60cc91f5abd63ca5ccd11ef2c1b06a38925eb9a4bb569d8c4b859ad278ceb006a3d44328636809a31c377c58957aa5408b488445bf1fc4ca378c733e410e3814c4300850fffb052df767743468c6a91d81dc3c4c34b4b5a06dfab7cb6a741c91107758859f2e1c2d06881612e05cd7444abf23c104b6a068988fb794306e90aa1ad2ccf76482f0fa7067467dc105c27ea7192d0c6fc50b4042934e81876e121c6c295a5432219345bab9ca566f0dfb6b9d4728ab7187f311ba22d55b4047b9b3a17632925ec31bb2322257dfea3d1c1b4331467904eb2bc1f7a4369aab9912531a6835358b016889ac910a7c398c18a1636976e04c7227cc9fe13d61a848eeb60d56635064ba07359730a0c269ed6cb25ca2908f524ae3c9bc860a062192421cdba741dca98f98ae0d955c78d141fedb59bee95957e035d5b05155f5792e88ce43342f410ac92eaa68cd055fe28c4a217b9c2da4ba64d4a6605565d41a00acf377eaf80881d9a5305766747cb076149866504db6b96ee4cc9d4bb977165f0b04d3c03c1f8150a265215387c7983d37463a3136a1b7c6 +private_key: c73842b1f8a1f7cb343c570bfa701270595100a58798d235bad4ae8ac7376607675de7cddab1432f5b04fa1045af5a2644fc431c604a2c794d57b1cce958707e508c0ff80ecd5c001439456b65091bb75dae518b9dd5a28fc8c549e4450ed9b92a6c77c5849836f52bad941438672e06786cf16233fbbccb192b5c07a9a2eceba39571778b665df2b0c359206cbb34b33e215d1f8900bfc1bf6dfc69490257e2a533430a79522957d1677a19526a44e4bdac44358cd283e60376b8026a0d389912324b1f37ab4283156a913782d26d7696827fd55a2d636afc42173f86b03622091e489d55f74db20c846b0c27e7c1c0ea8729b97ca5ffe5296fe180aa2a5728f7befc320bbaf64c0e5555b1f35bf9203ee22478127122aeeb4a3d983fee5219dad3b4db5197ad079be2803491238bbfc003e2e22e2ff98f0e0b2389c83c7a30a870e63ab54a094b27adbf301526d04449b1283b02254aa2074a902e67b978c1ba92ad014c7a15c2f678bf3d1342fe588e4d7b8b674b9b92699d8b312fe0a64c0da1a7d93c16f4917a96f03e3bb21e400b3141b17f90d58a853445efd63e607cbb05036ed720c783f187aa897cd5282d64fc119da7882bd28dbc42ccd3c1982e1ac0b4aa1497dca5f764217a068acb73af404a5c8daa35268484666199d7761b1a802f5334bd1bb4b05c5501bf1c4a1b23a35e3341e7623f181546fd2c069f63554a67c0d85a479123680849a17ec1890ab616de357f16d14b3a75326e13ccecc690eb66af0216921043c31a2c8a44688b670a060006afddc6cd13898dd97214f405a24ea5990e06b55c278cc66115f8655d4d8381eb55a0655655966b3f2ca433d3c78fe3a0aa0e6196ce4b355425ae81434c27e47b73cb6e024065fe2bbabee99ccb8459e1ec8bf6703032330d402b2155765097f650681135a60c6fa2aa74cc1490dd22525a7a65ab853579026750bb5fbc645ab3c796bc798dccf927663c9ce82134b9536a9ef38d54fc421f964d4c20ca8d5b9a5795bf1bb1c3857954d91c27140528fef1c366eb41d78bbdc773b58b81420ff36ddeb3349375bf1a3933c7a865e2e16cbfec0cd93567b09b18c6d2c9dae2500c7b19e42c62326a279cd75cd7aca7e9b08c08a81087012f75e278a281c9c482c149473cf5f8965acc8db1b74a205103a89686bfcc65d40576dab5c33960069db6c390138647b5301448627fd1bdbf68abc6979a03f47651a13c098386c6551a89fb9ea39696a8182d390388b12070d4e378b70c13a4f6af1fb860b7f1a42bd1c8373839432609032224cfeb9ee0814e5ca4b57af39f84d53a4f9a7a311421c9dc7e411c102c207a34c2161c7099e9cc39d5908ded696abe32a97b8a297c28b868792305490a691291f5e73ca8163e5b9a17e8d417b2f14aeb017a2757653b6b92aaa73aff638cb5412f1508b9c7aac9439787f2883043660aac7294aef5694c3294c1471dfc49be531611ec7863fc4c2f58c7141418b285b209f6738e45d09f5956b44d6106ed04b59164287efbaa28a63cd80c59636896104261c10ca8c2c8603fba2b53c531cf7a8da7e3abada81507487c28b9bb07477e0241c958584e6047ba1119783d62c4cac3c4563c628a5503236c7a997377ad53b9a4ba153645933856671aacca85d55ada82c39d82280de07100e1cace49a6dd09c22f2c1da1077b9dd437d55b0d7b6978446a19ab106ce18529608c2ed283c9806689b0624dcf10c6a8665948250af74182d9023895a577c5eb880359a046ca7a15297b3bc3ad227972ba80061570a7c10bb26cd87f05736a492405b4267fdaaaab8062a5b10bb65ac597d8c5a5e123a0f242ae2470c1f0d8829dd73fbecb53076aa093b73e68e35a3bb649ce4621bbdb7c95bc0dcf997b83c0a65be2015a5465fc1273b599c7074220786c306f4717fa50936bb22417a2247dea1aef76895522cfa8b20cbd9c344047984e9b67985307e8f64a15813cec89b8b004c1d61a884b327badac95a14a2d2af1a7a5b5ca6e3722d150cb4be7a376372beb7a99dc94654f652780411a43e619c0643d266a8b1aab982080b1b9aa52e007b1eb6b76b3147b14785652b5cd11586f6904ce3a9554f745947ff27e87e2c6acc205d7689d908068608053387600c6aa9ba285738b9372c75c9083566b23acc2e981457fab1306b04340969dd1081f074a2a33bb85b892750bd34336a68362e00302712410eb8fc8f37da6530a408b17fddb0fd602c2e40a7dc4c94ea843226ca79b167b180f3024a273c57f91cd69629c970617720497c4308e10f03a038544fff13a3afb83fb2291dbf177a003b0197037a3c9283de78dc911beacf30e6c4c6740300266c6ab69893aa9e112b67903df849a4bd59ba106030b62b61bc293fef997a8851d06c956631c266ad533791124a4e09bdb06c0ffa681cf2c6d43670e2a017b9a40c13e85bc1c24ad914003aa69439d401ba605d013a2baa0e0b010363574b71242745e9d709a3ff3b0a2ac7f374684bce9bcf0200db5a09b5d0c92cdc7bbfb3c24a79a8a4a0a9a64376a0793c1252362af170856046471b1a60eb33f23c59122d0aaeda79caef27df971ac8764986cfb2617fc3bb71355a56867c29795f46668f8166970b06c6ca91d8651ccdcbc23fc1b2f0a75c45fb3321151953315036d52322c9b6408152bbb595129f41a8b8570f02b8ccba66de5fc36d892457673a9a096c556c9afd11b06e1ca9cc8b3a9e9765e38e711d039612c4bb296061771e42efd68c9acc8ca61012f295251ccb33252e8b0e6486c5a5bc28683347571b8f0a42aec4873cd3549324ab728324030196035b29ad3043ab9008da6b924bd376cfb103fcbab9450b44c299b4e27165303786944009418cbc66fd9a570468dd85ab652d86402501d61f5272cd880056521f72a362170580675bddd505840378d96334a704282934527f70a499ae99db81516b1d1426d233dcf9855880022d72100e14858c0a226325338b33ab5ecc5a86e0ac4e8504e168c5e1a4788177878bd569d49dc60b1484f43134e2bd39efb207430aa564ab7a88cd40ecc00a10e4b6c663b61a6054323429c0722b2e4464ec0d43374234b4884bb8ddc0a28852600369635531ff943194cf91937b43afd418f8f964cf9c9cc66988407bcc7b5247a2372980035c8f8357bc3db948c0c4b391ab47636024dcb79f094c62ccb64893c0c45c1bc88cb00ba85248253606735547d424797b0bb302c5eb9631ac98060bc47341e69379bba5b5e44980970c699187f62731f2b1a4bb4c7a33f8a20758335bc8a3c4c4c0900b3c2cfe35356a58aae233b066466b34c814a4cb6b9f916581b0361e78a2971bbfc014a7476ab2f7c291ba688d5f75153c4ad7ba4c664a8002058c9eb195a3ca7ab70638bb114c3618bac3ab383dbf292705a478a35c31f06a1823b545366cb6900c59c036b063727504a55c2ac940606c7bcc74643644bde915d83c395023c8fbd069f9ec50e1fdbc8edb0387ad1074b11bfdf220edd7486082a4842d6c737c6a1ed5b98bb78cd6de1153480b3bf095b04a7cbccc19102964e34693a6e492fae134c9d726e49532236018dc517bd94232d717a408af43fd5c837a21cca33ecc2a3859eaf8a74b63c36fa70168f241e2ff52f7197a615d04357a7acca269e47848375bab1f82ac686903d44786d540a496e29642f71061ee76054b5aa6ae67cfa01704b386a657a6773b8509cc1b4e16bbb92cb204b5bc6638cc5dd868db40358dcc4c258915d1e93771a12aa7ca4b3bcd854ea2a111c09afbc60cc91f5abd63ca5ccd11ef2c1b06a38925eb9a4bb569d8c4b859ad278ceb006a3d44328636809a31c377c58957aa5408b488445bf1fc4ca378c733e410e3814c4300850fffb052df767743468c6a91d81dc3c4c34b4b5a06dfab7cb6a741c91107758859f2e1c2d06881612e05cd7444abf23c104b6a068988fb794306e90aa1ad2ccf76482f0fa7067467dc105c27ea7192d0c6fc50b4042934e81876e121c6c295a5432219345bab9ca566f0dfb6b9d4728ab7187f311ba22d55b4047b9b3a17632925ec31bb2322257dfea3d1c1b4331467904eb2bc1f7a4369aab9912531a6835358b016889ac910a7c398c18a1636976e04c7227cc9fe13d61a848eeb60d56635064ba07359730a0c269ed6cb25ca2908f524ae3c9bc860a062192421cdba741dca98f98ae0d955c78d141fedb59bee95957e035d5b05155f5792e88ce43342f410ac92eaa68cd055fe28c4a217b9c2da4ba64d4a6605565d41a00acf377eaf80881d9a5305766747cb076149866504db6b96ee4cc9d4bb977165f0b04d3c03c1f8150a265215387c7983d37463a3136a1b7c694b79d85075e5a897a948edceafc78b87b7fbb43b11f82831299a9ee660b3d40c06c5bef7b6508409daf847a64c8d30d0974fd3ba7476dc76c46b458a036d884 + +# Official test vector 94, seed: "bb4c0082ca4044b1ff60b036c9b0e0495d58667156786c530bc69d949a13bfaff53798e456423d7a0e162a60039367d7" +seed: 6fb2ec719f2a0dea152bf3f64b9d148f8ab8ba88f64e61f5db53e12d59f525574f797c007e4061f95c7d56cfc7ee5c49e849dde3fea8f25e7876df2a18515c34 +public_key: 5586a5b224aaa6428374da6bbed37b0f67c3b5352a5ec2bc072247d20c7e83d83ec162a3dd00b44c070577ebb614c97b06e15d7a41ccb6a45fb2205bb57ba4dac40a12ac5f6bb522ed863daf67379d230badf71844256cfc596d28957bae0c050b9182668857951a38628b83e2082659317ffdfa0e279644fed9877d6775e131682b998adb000ace652f13fb0b9aa57b9022b792bc4bae5ab5f07372bcf131ab93523ff42e5a328fe465520bc57d62f222e0a3623ad8b034f164b1800926ca8a850277d0054f34b941e6388349a87eb853375055caa0305309a06fc2016ba8a3c9bb06bbe7581946755e6c726e9767330d639ad4ca467ff670414a65eacba93d2b33aa628f9eb2949054c82e62774cc13f013998cf29465e8b83dce66928b2c9e1f4cebbb91e2d8b2278879073411358910ef23c66c3115af8ca4ed0b595c8a49ae8eb955a86a2549132cd65a2f6a44eece7b43a40629ef172b068aab1c2126fe058ad02183dea6994abc7daa71414666c57b4c40a17781ac4784e6ab2ecbb8fb2101fa1530a00032b5d1b51b57ac1537076faa54b3b9bbfd9dcac565209cc681b73d5a3c7138156b258321c05a494345c9aa72197c9d3a9552e437e891c437ba16c00c76f0a6252c8e4cebed86398957088596ce28c5880db1b90306958c12a45b5a14e1b05c161c5a3aa78099154a557a58e6c2c7758653e3209edb90110e40e037732a7e44d7a60736437c7a3e872c82b20478083b2592ea7418b75b002f1da834df8624f665df2677e0ae98c62636f603bc1d796935a11bd18fb851e8076c7e4c58b41abc71481608281ee4c572b612c08b8cadcd6b7dc83130f161edb26b1335662a5161478eb5d5a8c61faa175f54166ea2741d27c0496292380e93f6b77577b494c463c9ce8960bcec25f43f198f0552da73819bd7131cec101fe6448f7ba3fb03637b351af9e284da6677b53b71ffde41ee41518b18c39813a82ca041f2466321ba9531ad4b576cb8825978b565580d5f000b9a56a943c2cedec578f728785487abc0a8f2d28af8aa3237022125fab084cd19565816d15f8bc6936959eea23f8279c74946a8ba37d2eec75622c4f911c24839b78cbc8812fa55e19e10ede4931f5d16bba8aa44943bf9720395a8b1328648b887b28a98423e4322a69a752d1d2121d447c2f05bc91e52635d06bb1e05daab02f02b6ba9ea8944d9344ef68c23af10144b93a40c456da0857acdcacebf1782d63a0648497c91916a50b3d0688800b968f1e2200fceb4538f7520becb0fb86368ada208c0602e1ba5d2ca85da8d36ab8782a80436d69f65622279d8145aa5ed9671a28699ac9990d738c3b67ba500a731cda82965a01b4c16144383bfbf3334d159c31831f94301d6a0320a4c7a340aab3a18825516b819a285dbb82a28f164091516c2519b9b534ab8d116cf61303dfa4091fab8669a417a9862f90491d251277d4b7b0523b7c4e345ebb090e5ee581f1933e7168567a857dfaf916f7747550409889bcbfb7e32840537ecb7c050b18552fe5aabb6794b27505f3b721c0b96b738c844f816160d3c4349c4463f12d248a6605b52bb9f8b370e958db55b9ee0663454104c47781e8e0a6eceb2a2632acf0082c4e1806c0927a25e7ba8f1a395f1a352e72ccf72093a9587299e5bc23933395836bcc97832360a992b040a7b67d4e2caa3d227f60d4c8ae293070b1878c63c8e106267a8ac7bcc850dabb5904769fc487b4f417388ce6755058470a3a7fae41b56f009b01c74af2c0a7d252b30302a7b3585864c84c8aa4ac42e82b1ab44215191284799c40d5ac80079d30625dd09562e555167391a370fb6841a98ff2b85713b75ff58b984efaa29393540fcb20e3c1cdb1887be3a30fd3861d62999f2c376704983f969197c9165f19b498bc169966269e3af2300847c908a4738c8655f476238fba9bdb05c3e4f1c3aadc7432960603c36f759c69e4ba048c76561ab4831b40341ed5c05c7b8a853169f2d75713c97a883419457193b9889724d3a108c1c3d083404d93a25a98babfe33d36fccf4f6623b9e378fc5c731b0a20df7b5c28a0c86c065017d37a65d89e8e127acb630f4304739f19bb2a596bf950c996805f73d79ec0aa09dbb0561c3a3bdb13009f672b9f2c907c468d916c305d530fe5910a3c029a722a9e1e6048ef23454bb64b1c9eb2d1c1fb4c57 +private_key: 29450b5491a0266aa9fd363954b83ffb586f34256d0ccc6436225516953bd1982aee4224545abea8d68e9dd24b0f354f83978d0de0c5639acd6bd0a3c27289d20c9d55e56013aca5dbb7045d748077f4b9bc967dc2259cc79aa29a5a7cbe66b9484ca649042eee3b440bdb3f6475a02f61a85b2b373b91338940a2872213913ab6088b319d2b509ab46cd19aa454480d9560c0828a24b695cbb166471bd01a3bd406bba004e0c21f969675bf0884aca29f247c29f95097927490b5b3b72c30b59dda7d2b6a54693a1ad6ac033794cd0941be1c38998b488091a860a69c5e82248b5941851d8553f2159782dc7c2767c09b93671ec2c90684a4d3b27b6a88be09c50edc55b9291656177803461b4f312a6f4abc5ed1c97a6384356c549e070200245c6e39eac4267a77207293fed95fef2c29f3d93d2f1c6a609c07a3b8624bbc8da5c2538c25affefb815cc0675d88ba2c7629618a8e47b98433acb57c0b8e6499c44c311288c34d8566becbac15afc9a5a3d7c49ff25892a7a758b77e7540ac9e61ab0128cf301769dc65bd83542ee4b287849c75d53102ae750148d0839425a4b10243656397c16b05a9591817f117e6923d63584eb5e2c84a922d9f89b554579f9c526e6ab612a096a22760040a564649244ab8da3f066a4f0cd6906d83ca49ebae1fc49b00a5c36776c6f0911222602f7f2799fc3018828415d7c2ac0b88116dba3d0e1c62da01365e32bd111709fb7c07cf905e0510b9da4a61d7254d9a9c92cfab5002926954781ae86b0d88660c94e6591188c629a39e2d1748f2b44eb0961c7a480768e63d0560b65702c4d782193b7c9a89807729a3ca0c5c737e15506fe79912b05f25767fc53b772e952b6b900ef2b535beab49b69c0b958a42fd47b28dba99777291994598a64586cb86c8a98a12cc20322d2cb1a8819caf36bbcc387265b57819e496cca38b5c0b0b6f86c3b2d722d4eb3db4d97bf5aa2fe0a212f8f9b14e39495abb305a40c0c7ea77c315a2eed52fc31a75fe224bf08749ab8b7a5858860dd304f95608988abacf00bc0daa7f03b57bfed80503b366ada238312a155d398e26491abf1c5b10d22f8ee568d6f8867256684b0500d02a77070b8d54cb3504500a1935577cfb46113277933155d089c456d28f28aaaf0661a4a60486c4f7ba710253f753af6d75cd7b265f3365b2213878bce6c9f806c9df532ce2a5a656d072e67238e0c74978395552eb88a0b9b49b3205c41b3027d40b198184c67a8d5d3303d25987e9598de984a2f2eb69da7b843c6277ca144c2cac1babe34f119abeb5d6c1f6780d54cb511b2795a9118b4695749682cce3625cf7e85a00b82f59ab33184c2f6b6559084a1550675f72795e6ad74b22d57b903678ec4bc07da10a04b0c0ceb92a5e224661c9688e2a141d0c73af528826f65a330ca36a0b220bcc8021bcc1fcd408fdea0b2d709bfd368fdf1992f3d2841256647d2077f2a39c5770a11ef945823c55616cb00df3adae6478caec0ea05171aeb86eec42bb56c53ce27262a5db7e9aca343c036d8a7ca15ce23ab90312c8322e541773ace463a03801c3c44a7aa39723f2092a6c86c3f0c7b316865b50a13b84485eba71bdb2420bf351e21ba1b1169bf9414cdfe1235cb6024371450d9849ce8997e716bdb151119399884069bf964337dac8291c47abe351c914626ced0654e7a2cd65690e3fc67b3be0af7350c0d09ab978da207db5cc82902d6f3705f8b672384c0743d81a0de0871ac4a7fbc7bf1224a2f6e2b1cfd90f37e75f61a17f7fc9ad14b35ac0f79e6567a0208c0bf049a624566204301cd2582510f1c19de245b25394c8ea1405f7afd7a325bac60c93f700f77b258ba5b7177958fc8664e5e42d1600bba29b63b17046881a28dde4742dd7b8ef476f50186ab287a9f6c17321760a2332af65f136cd675b63695bbcc86081a10365aabfc9008db28b0123534acc645f290805d8b9bdf0636934b0b955555476b7604850ca5b3350d20b9269a3898fd45b161b165248830bd952b92a4c12721b67d724336c327a46753dea31a5c440f86c941660bc4e72ba51313d82842ff1e0175aa3c682a973f0861905fa9954770f83265f7f009474f118b081a24f9492d7d7408df21d000087b9e8cb88d5437c59835586a5b224aaa6428374da6bbed37b0f67c3b5352a5ec2bc072247d20c7e83d83ec162a3dd00b44c070577ebb614c97b06e15d7a41ccb6a45fb2205bb57ba4dac40a12ac5f6bb522ed863daf67379d230badf71844256cfc596d28957bae0c050b9182668857951a38628b83e2082659317ffdfa0e279644fed9877d6775e131682b998adb000ace652f13fb0b9aa57b9022b792bc4bae5ab5f07372bcf131ab93523ff42e5a328fe465520bc57d62f222e0a3623ad8b034f164b1800926ca8a850277d0054f34b941e6388349a87eb853375055caa0305309a06fc2016ba8a3c9bb06bbe7581946755e6c726e9767330d639ad4ca467ff670414a65eacba93d2b33aa628f9eb2949054c82e62774cc13f013998cf29465e8b83dce66928b2c9e1f4cebbb91e2d8b2278879073411358910ef23c66c3115af8ca4ed0b595c8a49ae8eb955a86a2549132cd65a2f6a44eece7b43a40629ef172b068aab1c2126fe058ad02183dea6994abc7daa71414666c57b4c40a17781ac4784e6ab2ecbb8fb2101fa1530a00032b5d1b51b57ac1537076faa54b3b9bbfd9dcac565209cc681b73d5a3c7138156b258321c05a494345c9aa72197c9d3a9552e437e891c437ba16c00c76f0a6252c8e4cebed86398957088596ce28c5880db1b90306958c12a45b5a14e1b05c161c5a3aa78099154a557a58e6c2c7758653e3209edb90110e40e037732a7e44d7a60736437c7a3e872c82b20478083b2592ea7418b75b002f1da834df8624f665df2677e0ae98c62636f603bc1d796935a11bd18fb851e8076c7e4c58b41abc71481608281ee4c572b612c08b8cadcd6b7dc83130f161edb26b1335662a5161478eb5d5a8c61faa175f54166ea2741d27c0496292380e93f6b77577b494c463c9ce8960bcec25f43f198f0552da73819bd7131cec101fe6448f7ba3fb03637b351af9e284da6677b53b71ffde41ee41518b18c39813a82ca041f2466321ba9531ad4b576cb8825978b565580d5f000b9a56a943c2cedec578f728785487abc0a8f2d28af8aa3237022125fab084cd19565816d15f8bc6936959eea23f8279c74946a8ba37d2eec75622c4f911c24839b78cbc8812fa55e19e10ede4931f5d16bba8aa44943bf9720395a8b1328648b887b28a98423e4322a69a752d1d2121d447c2f05bc91e52635d06bb1e05daab02f02b6ba9ea8944d9344ef68c23af10144b93a40c456da0857acdcacebf1782d63a0648497c91916a50b3d0688800b968f1e2200fceb4538f7520becb0fb86368ada208c0602e1ba5d2ca85da8d36ab8782a80436d69f65622279d8145aa5ed9671a28699ac9990d738c3b67ba500a731cda82965a01b4c16144383bfbf3334d159c31831f94301d6a0320a4c7a340aab3a18825516b819a285dbb82a28f164091516c2519b9b534ab8d116cf61303dfa4091fab8669a417a9862f90491d251277d4b7b0523b7c4e345ebb090e5ee581f1933e7168567a857dfaf916f7747550409889bcbfb7e32840537ecb7c050b18552fe5aabb6794b27505f3b721c0b96b738c844f816160d3c4349c4463f12d248a6605b52bb9f8b370e958db55b9ee0663454104c47781e8e0a6eceb2a2632acf0082c4e1806c0927a25e7ba8f1a395f1a352e72ccf72093a9587299e5bc23933395836bcc97832360a992b040a7b67d4e2caa3d227f60d4c8ae293070b1878c63c8e106267a8ac7bcc850dabb5904769fc487b4f417388ce6755058470a3a7fae41b56f009b01c74af2c0a7d252b30302a7b3585864c84c8aa4ac42e82b1ab44215191284799c40d5ac80079d30625dd09562e555167391a370fb6841a98ff2b85713b75ff58b984efaa29393540fcb20e3c1cdb1887be3a30fd3861d62999f2c376704983f969197c9165f19b498bc169966269e3af2300847c908a4738c8655f476238fba9bdb05c3e4f1c3aadc7432960603c36f759c69e4ba048c76561ab4831b40341ed5c05c7b8a853169f2d75713c97a883419457193b9889724d3a108c1c3d083404d93a25a98babfe33d36fccf4f6623b9e378fc5c731b0a20df7b5c28a0c86c065017d37a65d89e8e127acb630f4304739f19bb2a596bf950c996805f73d79ec0aa09dbb0561c3a3bdb13009f672b9f2c907c468d916c305d530fe5910a3c029a722a9e1e6048ef23454bb64b1c9eb2d1c1fb4c57d68f592a778a0b3bedd71c5d4f75c2e46b6088ca12a0a5e9596d5999259f13ff4f797c007e4061f95c7d56cfc7ee5c49e849dde3fea8f25e7876df2a18515c34 + +# Official test vector 95, seed: "121d90e70af6204445d0deb28ac0c108262719e9fd3476aca74bbfde89faf04d8d5f89a624e8a75db80431f0d10ad28f" +seed: 527fb88c8bd9a4d6031dad15e63878abd2b559e7e08d61f69e8e78fca964ee6ae32d432b4f9f751bde0496c580a181ffed762aa35454a02d3f1f47ee0394c89c +public_key: 56180d96474d83a849634866a5cb0e6e00b8cb964067060df339cb2ea05fbc6021057978ff3baf47ccca15d90147473e8bab23693b6b70872b27b4a4c0730c5374a260e7cbbe9a094ab50e6fab80c32875c2032a5eaa8f2347c313409ca19302a0437cdea621da1ca0082157ea362ef7907fdc5826f067ac4a4a1e4b997d240c7d3df9ae6db528159402d1943fad6743e6e18b345ca2c0494d9bc956888ac85c021153b65388f04c456608e41361a6d3525a1143f610c21b2a9a7f5a2e1a461552904e341ab427028e567741d9906982e4b563d980b68871eef012f2c3639a244cd300cd0030bcf4a2b1db5101c1d66ee28bc3bc276b7e9922d0253904f30bb676777a36a897d35d381292915a82f9b2b7705380277916e16a137030198032b865c823e80a58c12ab39639488d65b0c80a391102cbcb4811911c60f618323c13a0e967bac6561483026c32348502927f70cb2f780bb571f861cdd5394296436e37737a8ac6cbdc42a0f9b96941907be3abb5e7740e193d590c862130283f0711665a85fff5158c968578781a7b766cead81633b6a2560b0a740752d83253a04c7f17b90b63860c19f38b78866edbb79482d8af6cb858c8a38fcf1c423f10cbbd9131ed87116b611a75bc109ee57eeacb6b2e1201e488c785b87f384c86587844a921701205979c1ba17dbc1519dc0908c656d7734a5a354e05606acf7901f0c7590e3a324c30a905b2462da7cfe478a4697601618bc74070a9e30707219c53b48c14c01a8fc745098a27b799868166c26f51a12a9a24c9faa336f92692c141961ba4444dcba2a370a63f533f87ca2b1b9537987b7b71043d5fd090300a7d4673a38cb781f833897e94955bba19d428cb7f71710e98901b3597467795a84487bcc5a1180482fea1205a0a854481719c12b11054ad3c85175a04c27011c29c387d0e571084f625a6f73cb5986945cccaaaac7d9eaa305c31535877cadf213d5bd25801438717dbb5051532f5f135f2f79fbd093864439507446b36f349ce4748fe614463917864eb90f3f36742f026ecf32e82f1cb90017099ec78380b5aca2c7e82657557eb66c2fb633aca3d99962ef8927a3f3c9d8da538b89525310664dc2889410465e90b4d078c7dc8f030729555756c807fe228623a37a2b248ba55516caca65256bbffaa6cf6457dba32336a71221659358f955416074ad0131dc4d186bcca317d193a91d12900c477a00490cc464a119214df01882576b41ad7b6f29b34dbb3b03a5c77b2d4162d985530c908b186b7e168c2ad69830302283cca078f5816a9c79add9bbbca9b3fee02447dca3ccb82bac0ccc385538208e49742da9616a28bb3c20568838de02140eee3a7e5a94a82563a90720c62ba2f32f05ddea552f565b4e2597b17c3b8c24168d4484deff79a25b82ee1253049e619829508b01a7891a10db5c5a532f4880c169a38c7a0c99715a2a696bf66b678a0349ef02c7002a5e5ec3db2c3647b960fe9a343b540069a6c228e024719e269853535f5e841f78922dd85c3052188a2db0b2a453b5119311747386352a437d0a0e2fa474aec0bdf1090ec169cf473b9cd153c2131b2e7e001d3525957a487a38c726d710a6bf6a1f0027432c53a56a96c3a1a100ea69103fbcca441a3f43002dd47714d397f7a3a02d0137a0dc060ea0669530161c67334b8965faba455b81a6dcb37c8d2ba97c9496c3e3bc984c44a7b2611b51794ee2347cc489c07b4a89e8c5c620221b9c98c08eb5b245819a92cadeb684b82757e00039079e550a7c7a14bc856e0d347d28861921277bf18932183cb9c40cb07d67202a7838b500df71b1ebaa87202a0943d982aedf41260b38c67e25173dbc67be8b33d10724b08611857c13870bff8c0324acb67f498b599db59515ca863bb1016e87d07b747efe8c903f50b3f7468053587555163e7f5165740204b78ccf2bb11dc32ad1cea844073b7d4667fb55b93bdb4a708db296f3bbbc511119db4479737578859075c320e55b0a5185552cb9426a69b0bd11b4dff716d5cc208e3fb46c3c4456cd63ef1d598bd675d55b1adc177790da6509dea49aa958d2ce9a9e6ecb19fe96548a88f7b489433147dde00139007b6bdca9b3c6c0eff0a1832c10a257599fa50200b167829bb34ee72551bbf3a650c7a34ae6ed516d401d89486d438a0515a537077561ec79e1a3963ab +private_key: 38d11a53967017a25d6522c539d05bb58667841b27c88c5f684597c79950739b4b3e15976bdb84de829fab2a74e888a65a336b5cf51e57c3c86e6caa9d9a4e7eaa69f9b53a719031a0d078f2257522bc083184bffc57790ba35cac0333f26925e87696c7749cc1129bf1d411fbea5049fa56231217fe9c073e59cd389c7b8fb0240f568dc815459ad132b932956288c3d93aa36d1627ebf1947c707a7f19c9d637b4d4a712e9b61444604ea1711cf08a91ba112087143b8893abc4db933fe973c65cb1c6512519b38e7385a1596407dd4850aaea36f9d4cc75542e96578b7230bd775040d6c03ef4b5b79406063c75b863a51488d395c33262a62268c1d11d53b315820b5190a94c8792aa24f651964061aca4212f452e7566b21418a9c7d84075f609e7456f069c105cb41ed9f638fa417e73f55f4c01bb553c085b3740a3bccd2cb76fe56b1f1b4892b762c2ad3c6eae082531b5b50e265ce5e104e8479087639368c091d2e2087a10b5d5f92cadba3c1b540bbf7945d9d04982ac5bbaa342ac5817b3a982e98a5e99a249555205d827b5e3348b31dc34af06b84dd52bc6d771acdb3b77a41aaa951b7fa5261d56bad24932531c35820943b0b2984afbca41506c4b3481f8817c285136c7185d8aa4a22f48920719b4d525ba81381142e8b178a0019313bea431c7ecdc7aec54662f591be66b74d85070c68817bc01c50e248b347c6eb3a97a70da43f51aca3df1cbe1316f93c50f4d02424578c6d274074e13accc57bbb8222d87db597e6c880cd794a94597faa10fb4f901208244c788afaf18502e3b7fec113510470d39db48352a7331b24a3ee15f986364a0e42aac36bd6a82b78b803571f632a0a49e6a871a9ec17dcca396c1d57a49ec5b46a981f6ba316f181721b40f17266120c0bf64a9a1d9116e2f104a0728bdfd54570da246c512c102d964c3c8432839900ff26910992309aa78aeda610cda4cf12aabd3dc7a96b1c26337c1e2fc858db6be45321de76aca80e417c7410283634b3e613d6594b8748917b60333a1268e6f943746377ca9c5ab428a0b6f37b844c25a8b0bc52e25cdeca953e089b9d787a738911cb6f209bc3b85c415b1d0a3630115aa496227a5d9bbe4a67ff05c2c8ab29090f52a9ad33a06dcbcff047244e170a9fb9fa7298b06313b80d4b1ca0a61d1531effec12c77405e188053fc0aa1a0329bf1139cfaaa86341004a4a11c461a5ab38036fd777afec0fc8965ef19144f0f81e40065fb23986dae3569dbb5feaa79b4c867be5a536dc9379d0365b00e91de1ab9a9701011cec0721c2905ea049fc221f39a7a80aa11114e69e7bcb3822b3c61a46386c1994141918ecd7068370ba638770fd2831dc758496056d15a82c6e0196c152592a216749eb02d2099309573fb9298e6d1cbda57898ca8788efd280934b4b60e40584c365633bc7fd091db45a644936be33953d4675c2fbd270ecb82b3e550d2df36eb5d11f7f6726d722861468cc2e830a11c419646c28e4c0bedc9627a0cc83ab9b9d4e3b320cdb18c4165c3b32ae61a05aa0869778a51df37b9c125045c6899724152c7ba7a6536b3d9e92ac2c63c29189813f55b5919861f38cb6d30845ce353dd0e199503785ed6b43ab60c0b6233b64265c7a794ca19838776a65ee97935cd4a63862299297c15b6a17bb91cf0ad393972b867fb11dc1e24ec7e205a42925ad337874b3263a7008e6487ed08c14a8b7a973f6a340f2af81fa76691c6343577e8b83399ec1a356b78d1e92ccbfa54cb79a3110411ee82161578c6a07d5746734710ee8a65f69780c16bf600737be4b48c7c977cdc2a3a6769301328f7ae7238f297f16a897cb3b768401544b974007c64be131b45d454a24a21af8440792631d78fb3ac527112da6222ab0ae47490c8247c847b5aa9700c05f7abf8f084cdf97c2bbc11414aab6ae26a276145cab441240808d1c3069847ba4a288a01822c9aae799dc44328a749042ac06a39130c513235f2567a34b52858199fe59758328010ccb7d8de311220335b4a555342633e5ea60b0b599e483787d2417790282011a0b34d13151a02581d939423c364a0a348f81412d07738299cc7bd12d41d1642d3b861c661338a3568a956ec7a4b5d855733626b5164c8c2ef2a56897a656180d96474d83a849634866a5cb0e6e00b8cb964067060df339cb2ea05fbc6021057978ff3baf47ccca15d90147473e8bab23693b6b70872b27b4a4c0730c5374a260e7cbbe9a094ab50e6fab80c32875c2032a5eaa8f2347c313409ca19302a0437cdea621da1ca0082157ea362ef7907fdc5826f067ac4a4a1e4b997d240c7d3df9ae6db528159402d1943fad6743e6e18b345ca2c0494d9bc956888ac85c021153b65388f04c456608e41361a6d3525a1143f610c21b2a9a7f5a2e1a461552904e341ab427028e567741d9906982e4b563d980b68871eef012f2c3639a244cd300cd0030bcf4a2b1db5101c1d66ee28bc3bc276b7e9922d0253904f30bb676777a36a897d35d381292915a82f9b2b7705380277916e16a137030198032b865c823e80a58c12ab39639488d65b0c80a391102cbcb4811911c60f618323c13a0e967bac6561483026c32348502927f70cb2f780bb571f861cdd5394296436e37737a8ac6cbdc42a0f9b96941907be3abb5e7740e193d590c862130283f0711665a85fff5158c968578781a7b766cead81633b6a2560b0a740752d83253a04c7f17b90b63860c19f38b78866edbb79482d8af6cb858c8a38fcf1c423f10cbbd9131ed87116b611a75bc109ee57eeacb6b2e1201e488c785b87f384c86587844a921701205979c1ba17dbc1519dc0908c656d7734a5a354e05606acf7901f0c7590e3a324c30a905b2462da7cfe478a4697601618bc74070a9e30707219c53b48c14c01a8fc745098a27b799868166c26f51a12a9a24c9faa336f92692c141961ba4444dcba2a370a63f533f87ca2b1b9537987b7b71043d5fd090300a7d4673a38cb781f833897e94955bba19d428cb7f71710e98901b3597467795a84487bcc5a1180482fea1205a0a854481719c12b11054ad3c85175a04c27011c29c387d0e571084f625a6f73cb5986945cccaaaac7d9eaa305c31535877cadf213d5bd25801438717dbb5051532f5f135f2f79fbd093864439507446b36f349ce4748fe614463917864eb90f3f36742f026ecf32e82f1cb90017099ec78380b5aca2c7e82657557eb66c2fb633aca3d99962ef8927a3f3c9d8da538b89525310664dc2889410465e90b4d078c7dc8f030729555756c807fe228623a37a2b248ba55516caca65256bbffaa6cf6457dba32336a71221659358f955416074ad0131dc4d186bcca317d193a91d12900c477a00490cc464a119214df01882576b41ad7b6f29b34dbb3b03a5c77b2d4162d985530c908b186b7e168c2ad69830302283cca078f5816a9c79add9bbbca9b3fee02447dca3ccb82bac0ccc385538208e49742da9616a28bb3c20568838de02140eee3a7e5a94a82563a90720c62ba2f32f05ddea552f565b4e2597b17c3b8c24168d4484deff79a25b82ee1253049e619829508b01a7891a10db5c5a532f4880c169a38c7a0c99715a2a696bf66b678a0349ef02c7002a5e5ec3db2c3647b960fe9a343b540069a6c228e024719e269853535f5e841f78922dd85c3052188a2db0b2a453b5119311747386352a437d0a0e2fa474aec0bdf1090ec169cf473b9cd153c2131b2e7e001d3525957a487a38c726d710a6bf6a1f0027432c53a56a96c3a1a100ea69103fbcca441a3f43002dd47714d397f7a3a02d0137a0dc060ea0669530161c67334b8965faba455b81a6dcb37c8d2ba97c9496c3e3bc984c44a7b2611b51794ee2347cc489c07b4a89e8c5c620221b9c98c08eb5b245819a92cadeb684b82757e00039079e550a7c7a14bc856e0d347d28861921277bf18932183cb9c40cb07d67202a7838b500df71b1ebaa87202a0943d982aedf41260b38c67e25173dbc67be8b33d10724b08611857c13870bff8c0324acb67f498b599db59515ca863bb1016e87d07b747efe8c903f50b3f7468053587555163e7f5165740204b78ccf2bb11dc32ad1cea844073b7d4667fb55b93bdb4a708db296f3bbbc511119db4479737578859075c320e55b0a5185552cb9426a69b0bd11b4dff716d5cc208e3fb46c3c4456cd63ef1d598bd675d55b1adc177790da6509dea49aa958d2ce9a9e6ecb19fe96548a88f7b489433147dde00139007b6bdca9b3c6c0eff0a1832c10a257599fa50200b167829bb34ee72551bbf3a650c7a34ae6ed516d401d89486d438a0515a537077561ec79e1a3963ab873d11d816550a4c1b14b584703531dd7cf0d97269125dbef3d73e443d017f57e32d432b4f9f751bde0496c580a181ffed762aa35454a02d3f1f47ee0394c89c + +# Official test vector 96, seed: "b3ac6503206accc2a92cbc210d020a2654726911d11ce676aa04feaa08af1d20c654e4105883ae470ec3ab299075d420" +seed: ac6fcfaeeef795b6ef9e062f02bf42975fa01e7d91ba832f74e05269a72684d05aeda108ea4d6c6bc0fb958286850422bc357ca67b83c986048e0d0087fa11ec +public_key: cbf017d8e336efbb596130b73268680be4885255aa6353a39f04740be2c3910a9ba91700687088aeca7fd4a37feca45bf29a27824babb327c49f18539ed20c1755983e6b1e03f98f8610227362c9e12246d2176ddaf48dac31955e59a7d69a8dfa582f8c66b14db7259e6c4c63bb88c995a71fc44bf964b1650746ff672fc2716528741dd8174aa2326e21f025367a0f243ac63728bc6ab95dc22a9632e18cff13cc6e38a1f4a0a542259d41db0c1dc640e8735dfbaca58c3c7f18e39c74641d477099ff1ac96c924e366b16ae423de8bc9610c855eb686e8d9301f2c08e96e3a2776523ffb93cfa3726c1d03d0c2c634f1cbae6dbb4cb987be8eb464190056cdc29a7651c79773b1686269c1646a65786f667986e7a552278713fe5c5a4f9c23633c467b8b63b408c4229cea5f5a0664852729a7474695137c0961783656df45277092226e232d5eb929c8bb57781cded3b7d5266bf5c2ccfa992bb9d8b59746319e6b5803d00a84e2a99989c08bc9726783389fd506074606a0945c7e3e22500d58fe3a647213b19beb6174c72833dec8ecd036499e53b0a18a1d6e471712a1d64a903b1f3634ceaace56a906a1336c9d9708768a6bcb9cfc036ac22607810457e8560561a38c5cd84c6ca021a98c15aadc47e874778a81423d669ab411a72aa4a661deb2b8f4a06600baac967617bfc5dc8d12d44d9a7f80b46d9a40b91a66e3cfa0bfb5523c04922db21c4120717b436c6dc81030d13b867e707b9a3891791c756800adb41cc9a29260d98202472b733611037a98b454b6b5af423df236dc079941b160ff1c0b8ed1b14e787898da354cf79ca4fe506d5742b58141dcf624964397274737e4ed1aacb76a92bba8966ab24741163893587c94cbd4581bd0a110937946051c572f2232a149667794812039ba9e6525a298531e7479a161123da95b83ee746dcfa1d880130af080fd71480a4d51a48c48abcb62d4c7b44b712bc0ecc4eb53a929a1167f3c49be7b019002679123348af5b7ab18a36f86a23b309154c5307b003966c8755047718b32649945c7865f123ee60198af51dd591934ee02ef7ec218569129d03b76e9729dacc17e4407eeaa4820e238deb307d819528b932bbdd74ac25c0476c037cd8200ee9231533676f3e1b11a6fa2511a3160f10b26f2cba2966572450516be1a39ed8bf651b961e58be810bbe83957037f1671c128f91f302dfe1103d624b97b4c331db624fb354178047ad4b909ba93211908e35014d896144356c250df2248c5487ea11b329214b4c3b2342e64244d684ba914e020228e0d9b5b0283b5c96a22b510f31974843b21df48878652721bfea1b38054ba1b39ebd0a03746ab5d07ba3d80b5be050af1282bf1ef87629ea0e2f9a272bac24b7d3b464c182a8032dc2acc0b7ba3482c5cd7c0b5199522634f61d553534020671baca3534193b2a9585f47394aca1c8aff24c05a7a8b0f59745e56e12321fa1a7b38db38de3485f017626eea474e3e3c1a6bb5242f26de2529e517928e547423b79cec6452f14c17ac403c0a6e23d25d334ad07aabd8c60310082bb4a194d656b2e2b64ff3475fcc9226a526867ca7dd03c75351ab921eb35e445b144f4a7e743acca85372a03c4cad754f1d788a1c919efc198aef95baf7768dbc94f36d5a37db440ee403b9b8a339bcc50c0469f51681fcbb294a042147f895d9121701071a6ae8b85b3ca4a7f197f06cc5ed4e40c5bd1ba18f76a8010857bb0c3f8c15ef8f89fcf22afd560445c8576b8a46297f1cbf5896232040727eb40b78c97099a09eae192803bcdb153b7c9918b8c66a3e8ccb0a928b2505b3034886b452bc9f7719246d62ad183a292a75f4d6715a42153b8f8656b2c397428803725bd66239587506e9ad5694ee0592918a14346cdb0a9117b7969345bb11be07b82dc4361b580fabc4a91d919fc97251ad1a69938b507e066cfa6a251d98927f2bf2a9806163c07d1a96627265776105126e5ca5872c61e4bba95220ed45124e76b334df40fe0cc4f193baf6ce69581313616c0a9de56824f007d65692d0f675aafe086b6e2621bfba18ce1adc4337553c81b92ca4a9a2c9712416a168a7a9fd06450589641e952a96b122b4c4bb63721d6e76201f96e7403a908819bb61864f9225185678741da30f96e7973a83811b94c50bae593d1da6d3b306bf50669e590eee2 +private_key: 5cca6a37c37871e04cfa962d1716088fa90f49d176bd5077881b53d6f20da1027284e94a28058a0e249da3c36c5ad6af6056c4f8774af6343b19a0cf5f3a4c594489a64305d3196e71e390528141a735544b9ba54cf64523c39797153ae1620087264a5bc804cb864c92781ac4756c4a216d6d041ee6369436dcabd1b3a33fbb2fac37a994e2251aa9112c28ade1761151947314134ef0567962819ad9e47f56e7724ffb8967db192dbc50e0358d4ed578db4b88f76578196799340a21686c747b4763b9302eb4d5648cc83f75587627661a269801ff10662ae713a03b7ef1dc1918493885e811163902c7a8c5cc51c639c5750c13abc126431dd85d9706c945fb5d736224c5456d6da493651b148de081607116437a9c45e6614f76a5c6502b65a1ba5a31318893bba3b68e3cdc3680560d22c2b33745a4acb3a8af56452b7201cb42a0301c9a41848315212f60bb7d6cf7c8647cc7acf68b81959a8a6a91dfaaa41f3a679dd136d40046d7846f170bcba2648e08185a6ab380236158442299897814913196bd649a8b735d114135aa466804fabca21084c28844bf00cd18d6c8dd0b48a0f61139458f08f912dd28c4b4b6b012f6cef761740d97cc81341c80190a0659380ca04934e3b4426c7a22255815646afed165f68186da0206aec0b841828cd3130c59f3295ab80613e07a85b599bfa444364a569486075ab07815c74b4729a9281c6afef55fe7737f621128e18a355bb89c392817c348aecec895da19125af968bd1b4968240a025b051c49650594110e96547c10a127148ac162baf3625093c26577174586ecc30e4234b9b626c58328613b21bd4a8fbaca56ae9c9b943a7d2d79230e01caa6c6135900b33ee8925ceba22ee6b65fa09056e539e71b20c4815b448c70ba772302b9cd6e7546e756a85b41c409062348c334c6ec74c130a13a146757b8b566d33d7b0918ecec6acac9c579e5cc7e3a33c5da79d86a36b0e9b6ce1b22cdd696e1e793f6109da565137e2b666631225143a9c8b95d8d3a21c467c1dd2c0ce774a45006abea578844e09f8b982f0ebb53435c0941bc7cd7d27e8336cddd8332d62c32068623bf18944643634d814af239a12e3aa0daa027a8241297fba5bda40eb7630d1c2a4acfb7529963aa1f80ceb901b7159020b910c252bac2110a6da65732ae359ae3d0032494885c6a44874735d843cf2ac6a5e5f5a625069c0a49a66c8270b8e5a00d91293f0664f64594d7493f5399a3ec6a2c4f4a31bd604b04449c1b215dfb227f43778d9fe33f52e9c687452926e46a508c8a2d7a448af4539c05b4bf512b962017781c0e157686b748cb77b36a95c459ce5011da0c88f58a518932b5f7eaac67a27d89a60884d8a9f2729509db5cb76cc6f6236ddd0911d9c41f526086f3a24e0e160192577b8ac91ebc0860f7ac884161c6b62b872f129cb8fb11d56ccfe8b9adbec54ffd23b02e471284dbcf508c6a1912213ff754f1dc195f97b0bd798d8ae8b44114c4dfca0f76e479d39c4a19ac67445520ebfac92cc300fc62a94541b345f10b0f79c519c576c2037998564eb1506e6b91c8f606cac8f9b0d6927ab0e885b4704ac54cb14c67949f506000ec9e0685a9684b648a802cd8b5c8cd82860566b2d6e60e213429882ab51efbccbbf33f4f7a0cf57b6ccb8a27d95936a87814e6d80c4562c7a753c0a7e03b3685891e77338034713b7c8da4d097281753e54828ce951c60279a729376e991aac5101c6de3ae87c4ad3f4c75ddd517978bcaa4e85deb15c10fe701710067d25c2da778b4018c500c7368e58c550ab5825ffac4d58b87e745bf10d8118a787a5c5694bc099b38d89ac7f890d25497a8e521c8505e659506e0c65678279bc3daa95a82c806f04219944c5ef308315c69bc753d50490002c22e8eb89a65c93ac116692370595492cb626a8b5b64c291f77f256583bfe2a2372cbe80ac5704a2bbf3f0bd0a4515cd131814c6aafd39934adbab22ec3889572b423b643bd56cdd3ba2b8b20e98bc8afcc33d78c9bb8e466047961b03d31f94b783ee80a7506504ed3a723094c460d07adbc7b4ce258f9072c687e6346c850edefa4d3600cd616c6e8138ce6c3854a9452393a9266c2141b1d62d4111adf9833e2f2ba9be4289db4317cac169cbf017d8e336efbb596130b73268680be4885255aa6353a39f04740be2c3910a9ba91700687088aeca7fd4a37feca45bf29a27824babb327c49f18539ed20c1755983e6b1e03f98f8610227362c9e12246d2176ddaf48dac31955e59a7d69a8dfa582f8c66b14db7259e6c4c63bb88c995a71fc44bf964b1650746ff672fc2716528741dd8174aa2326e21f025367a0f243ac63728bc6ab95dc22a9632e18cff13cc6e38a1f4a0a542259d41db0c1dc640e8735dfbaca58c3c7f18e39c74641d477099ff1ac96c924e366b16ae423de8bc9610c855eb686e8d9301f2c08e96e3a2776523ffb93cfa3726c1d03d0c2c634f1cbae6dbb4cb987be8eb464190056cdc29a7651c79773b1686269c1646a65786f667986e7a552278713fe5c5a4f9c23633c467b8b63b408c4229cea5f5a0664852729a7474695137c0961783656df45277092226e232d5eb929c8bb57781cded3b7d5266bf5c2ccfa992bb9d8b59746319e6b5803d00a84e2a99989c08bc9726783389fd506074606a0945c7e3e22500d58fe3a647213b19beb6174c72833dec8ecd036499e53b0a18a1d6e471712a1d64a903b1f3634ceaace56a906a1336c9d9708768a6bcb9cfc036ac22607810457e8560561a38c5cd84c6ca021a98c15aadc47e874778a81423d669ab411a72aa4a661deb2b8f4a06600baac967617bfc5dc8d12d44d9a7f80b46d9a40b91a66e3cfa0bfb5523c04922db21c4120717b436c6dc81030d13b867e707b9a3891791c756800adb41cc9a29260d98202472b733611037a98b454b6b5af423df236dc079941b160ff1c0b8ed1b14e787898da354cf79ca4fe506d5742b58141dcf624964397274737e4ed1aacb76a92bba8966ab24741163893587c94cbd4581bd0a110937946051c572f2232a149667794812039ba9e6525a298531e7479a161123da95b83ee746dcfa1d880130af080fd71480a4d51a48c48abcb62d4c7b44b712bc0ecc4eb53a929a1167f3c49be7b019002679123348af5b7ab18a36f86a23b309154c5307b003966c8755047718b32649945c7865f123ee60198af51dd591934ee02ef7ec218569129d03b76e9729dacc17e4407eeaa4820e238deb307d819528b932bbdd74ac25c0476c037cd8200ee9231533676f3e1b11a6fa2511a3160f10b26f2cba2966572450516be1a39ed8bf651b961e58be810bbe83957037f1671c128f91f302dfe1103d624b97b4c331db624fb354178047ad4b909ba93211908e35014d896144356c250df2248c5487ea11b329214b4c3b2342e64244d684ba914e020228e0d9b5b0283b5c96a22b510f31974843b21df48878652721bfea1b38054ba1b39ebd0a03746ab5d07ba3d80b5be050af1282bf1ef87629ea0e2f9a272bac24b7d3b464c182a8032dc2acc0b7ba3482c5cd7c0b5199522634f61d553534020671baca3534193b2a9585f47394aca1c8aff24c05a7a8b0f59745e56e12321fa1a7b38db38de3485f017626eea474e3e3c1a6bb5242f26de2529e517928e547423b79cec6452f14c17ac403c0a6e23d25d334ad07aabd8c60310082bb4a194d656b2e2b64ff3475fcc9226a526867ca7dd03c75351ab921eb35e445b144f4a7e743acca85372a03c4cad754f1d788a1c919efc198aef95baf7768dbc94f36d5a37db440ee403b9b8a339bcc50c0469f51681fcbb294a042147f895d9121701071a6ae8b85b3ca4a7f197f06cc5ed4e40c5bd1ba18f76a8010857bb0c3f8c15ef8f89fcf22afd560445c8576b8a46297f1cbf5896232040727eb40b78c97099a09eae192803bcdb153b7c9918b8c66a3e8ccb0a928b2505b3034886b452bc9f7719246d62ad183a292a75f4d6715a42153b8f8656b2c397428803725bd66239587506e9ad5694ee0592918a14346cdb0a9117b7969345bb11be07b82dc4361b580fabc4a91d919fc97251ad1a69938b507e066cfa6a251d98927f2bf2a9806163c07d1a96627265776105126e5ca5872c61e4bba95220ed45124e76b334df40fe0cc4f193baf6ce69581313616c0a9de56824f007d65692d0f675aafe086b6e2621bfba18ce1adc4337553c81b92ca4a9a2c9712416a168a7a9fd06450589641e952a96b122b4c4bb63721d6e76201f96e7403a908819bb61864f9225185678741da30f96e7973a83811b94c50bae593d1da6d3b306bf50669e590eee255b703fe0b2aebdd29f6ceb606f15213da5f478ed4605a212f52358e2046d5b05aeda108ea4d6c6bc0fb958286850422bc357ca67b83c986048e0d0087fa11ec + +# Official test vector 97, seed: "59eff60b1ef6185db34ee1e3b1dd2f159106ceceaa79beb74923b4f5623d5bc52dbf5d2594a1f7c6c64d12cf144e9ed4" +seed: ba2fb9318d4dbe7488057c33e95e6f054583a2800c41bb83083c330a914a12cfe63f8ffda3565c2424c89b20974b748a65a5aba75133fcb3156dfb6626a83bab +public_key: 8945cc28753a4f3771a68a9000944d726479e1a79d88675fa13795fc086d79f82ea5dc7e2da5ac939a42728963bfc3659d50345694373b877b0504a864247addc746e98126cdc71d0e3b0c7f457c046ac8b8c1458ee70c82905ff5183d890845b21c66953c6402cba2e329886ad51a92f7c673995fe255bf9462b2edcc899125b1820125590024b6928fa0c79476ccc407312664b83c9c59a806989c3252683b139799561708732f57804a96c0b58c88cb4a83a1271a05a9a58a4c187b45cc893b9621e8c5543a02221efa2617b0a42bca1880959e70496cd1452d36191dea226b49f76418b1a44079c2d6392c37a319ca007b65f57743598f2c40a68dcbb603f11cd32c368a0688343a25f6a348c0b260b1946abbf15b3c9ba0ad1cb302b918e4285870c9444118598ad60dd6030c45f33239abc79a04a05a2cb8e62128a3a9ccb61248f1021c7ba5751dc60d50919862332bdd0bc371e4037063879fb5bb22290328c9194aa83716316b7747a5130a984a249e2e124ea0eb67396a3197fb80bd672c6e6cab6de2cca2e3ad70d5866fc878dab1cd654729ecf9ceb733a1b81890cf51c2ac112a52b6a4122c27b86cca81089afa1361c4015abe68c62d9a11bb10358459882f58461761a7ecd3b9b3b17e32a682a389c4328bbc4aab01f44ca93f150e72678160243130555ac9e964c784c33943b5ecd07aa8097be421b796305f05e196ae166559ca5c59a445bc98092be1182f8000d5c39b7c074e016433235aca94d7162b853e45367d42e1604b10702cea82d9004259d130ad5117ca24c6ed411d5929c3f7a6bb35cbcb2ca6bf08c06d1a1cb63aa54d4164a838173b82b45523e00559994e8ff5a9cab63c6fc3266998ca8bd5820e7b16f8f86ce149c355e49451c89624b4b1f2fa7f09c5a15bbbaeb6a641d561830ba25ea470c9d7c397499c9747994bb8818bef9c1ef7802fd6963dbafb6e6dc5a3ce1509510578b96983d08c53c9384e45e6a5bea7c943d11c5c46cef5d0566c4c1f99d00079b0641636bc31913034a134e7a4b0cb959ea4662be55157fe89a7eae1a976f30517ba7e019820984115e5ec2e7d00267240695f600b2eb4181adcad96c7605d5c750154a41124c6f23696845b9b5539ae30b1564bdb2b41c09feb96b31b0796fed8503028af11b02e68f342e3210845525a52268a1b0b4f7648600b455c5c824c49e2972371808bf572017331cc8bc0e11147bc10793e096144a4187b196abde288b134bc54c5b3b85312e7a9bb90135dca9bc7396615ac979de9800c26057ae3064090174437209ede210cb2c733302c4ae9c1ac1462024d54006835ac3f23611d1bcfc945a58401c6a6da42242983f4e712a5080bdd13633b1c98f32835f179a3d011aaa46b9b2fb810dee9495cb4451fe0ba20f71992a445e0c16486d06382c8cc4051647739762257a00d80956475b4521493df79a28319c2c1338c9cb3791980785c2a1ec4a11844b608a7c7c92b81015534a03904cd5a4777fd587ad8004b61ec40bc9aa7a4268ef445900522759cc5057baa2a5729bcfb3a0666126a90d56b7527c32800960d9586e93579eed18189f0a762518125a4317649a3c1883c6ed8b047b5444667b4d53ab5d5b952b10ca1b8aa4ca5e438ee3c2e79c2132bcc257d8585abb609ff870d25826a67075fc38c32cd1c6d78e56a4f18cb59c756979331f1786820ba297f4c26ce251c93686506b26805286cf5919ab660092e6c1825d746c8c9478b408aca024376233ab8c287d709d02f7b8c6d80b4430917fe546ba774482b9b77c20bccad85355f562152a1593cf2bbb02014df47b29d1ca5c1d300445cb4835b45bd59b92caa1cadfab9986869f5a7875967981f1267e615180bf7952a27ab3527a60b130d69e155ff88410b1a10a705b14df248cca801e3b7610baac9d92c75e4c759cf7c8f644b610a350a9a9b5b59eb798a1cbf42d02f211a27aaf05ab8e19baa600f3babca5d82c9388466c5aba81c32a7dabc9775e73a77432f9b96225db1698a2c7a6c9b6949c59d7796758d24c41872802a63bc9723b17f703903c84e425383051abb07e94a1f19a258a61c66b56f46cccf68fa4ad62c528cc1bba2d579913ab754268eadc4204b887bb764096783301fd30ef9d972acacc01977d137525d619df951b0f9a5008bd9cb4524c5ae7cec747696489a8fc0ef65 +private_key: ae7abea38c394ec61b08f8b73a42afe39c0510a45e50a3c3565941c54332e613c5687c6b7f1ac590c7a2472597e331a23f3122e0a12a8688a9da651aec131981aa6c623aabff1b682db2525543afdb53b461853aabcb955435178d9939c2e262554978b998aacc07728f29a6ee7c54f34738db084c81b6cee4914b0706ae0ce056eed5c97851a0c861a91f42938678ba9383b4a8dc051472cd38d2c85de9747d90ce0e46bb059688cd2cc90721187f56bbb695c43c61651bac8763572d78a4014ea4106a9916ff378cab1518801455683175aa75af0619a6eef774f25568dd35cbe312b80db29ab007ba069182a0369d8025ca8fca341dfb99ccb044b1ecaa19979957e2001af126df1159f13648bec2a71ac53a8cdc957b731c09d84249ec7a53b3507327b1fe36bb79a7668dacc9f898698bf296bb078d612603336109dc29664635b9fce33005c704eb3512df2c4ab3e63387126146a56c00a04954516e386b554eccc45a848c8ab79513e9a7e1e0692315714b292090b281678b70af0847d3211b97f89cad50aeeff5660ba620302724eb2403d4c0a8dd015e7362077e0944da2b5afaf2ba08687c25e491192659e48363143600ca16441a678c7fb40a76c08760c102247606f5d128dc0a13a8a86f758725d4205f1a2393a7479af603a2f173c841b27b51f90833363b87d8134a904dcbca542f76caeedbb57f73522f227f72056390939c10d28b52a824ed621d861c8080660472f01a3d692b1802a7bceb5cabc12dbdd649713227bf9a53f801420c0421cb48c3214755917ab076709231a27dca46a2a603649ba1aed077960e5ba1d44bb3f2ac2c0536b8dee5be0b7c682851553d902939a775d564b38ada0fabd429e105aba00433527b3ea6f847ee7c1667590f96fb7c4f2083c2d540582bc79dfc3e881905b8c16b5bc0c5c5c46880822cea340c95006d80b475d0485c1539880d5298fe1018f9302723d5b3e64515851364e8269a6bc824c562a29c801806289d82389945a4974d16865889bc05d42f57ca85a6499ff0e5534b9cb8041cc0d5f30ea82a04746b51d8242319d980d274102b997b70688f63014f2b473f14b344d9dcbb08c400355a53b923b7a5539b2c41ca08a31556c32c67303448b088a9ac95005c74385baea6a227cd535be3b58e97aca21ce97f89e6c634d175274b737c74a8feecb38bb587777b27ca372ee6c44592ac2f54618e77eaa6f11342de70ad66da080ff75d557b5e052bc4e6e9614f0b23c2b9a13e540637444585a81a5e90b2c1178881ca41a5863c45f42564200e7f9b82222430e7b185fea1a5337a2beb4bcd059cad0b2141fde13060ac4c2bb4b87ccbaddbacb43ea9bcd15a32e02ab9446c7086f64653f45fca9190b0037fb5eca9acb9c28b757f177a9ef74bb4ab8cc526d2b4074b99ef4b6b3fc85cbb343834f929496a043a037e7e3c1eb71323f5cb62a57b3b7cf64d639c2cad92623aca195a43b684058f342713eb661d78a59ba2b57fdd7a64d2643add5738dfa57e575a11bcb956d628c85d06051109740a706fb649203ea70aeeb4cc07e1cbddc2645e2613b6e90d5a12b0b9a81cb94152b106cb4d25830af5b76dd61d98bbb9a6d5cabfd13fdfb139a90286379c5aa772af1c10812da52b582437b6543665f522aa7ab8ecf57e584429cb74abff84b9281b8fe0fa540f542599529505e0bdd117a3550bb1fdc225a250a8781ba42d45a481e74de5598f4153650a4c85a005901a149c47fca69f1b8ed039884c74b39582cbea46b31061627368bbcd0c4de55a5930670274b6bb33a737c9b376144b81c16b9b23292f2d15cc8a3aada3cb7475c3425f8334fbd474a71a83ed957954fac29db49983c8a82bf41fdb0188152c5d20c6a9ad9bbb8f88693636ae00c4a61eb2be93f95a96441a9d7bce5b291a56d92640c4a22b1251ebe36379954fa49605216756b7d07943a176706a20f01362b96501ded810ccc709f54aa8744911811c2ce4e6490d6bb5bffac3f067278755bc8d472689720ad0f98801b6255bb399ec38272bc50aed950291d47ed97cc0c9c1542944afb7c313565c414e18934532aea2430c2c4aa95f31ae44b42e713387ba046aee62a3dd4416d0f4071ae6541efc7f8170995e376c41b57b7192c712a9be8945cc28753a4f3771a68a9000944d726479e1a79d88675fa13795fc086d79f82ea5dc7e2da5ac939a42728963bfc3659d50345694373b877b0504a864247addc746e98126cdc71d0e3b0c7f457c046ac8b8c1458ee70c82905ff5183d890845b21c66953c6402cba2e329886ad51a92f7c673995fe255bf9462b2edcc899125b1820125590024b6928fa0c79476ccc407312664b83c9c59a806989c3252683b139799561708732f57804a96c0b58c88cb4a83a1271a05a9a58a4c187b45cc893b9621e8c5543a02221efa2617b0a42bca1880959e70496cd1452d36191dea226b49f76418b1a44079c2d6392c37a319ca007b65f57743598f2c40a68dcbb603f11cd32c368a0688343a25f6a348c0b260b1946abbf15b3c9ba0ad1cb302b918e4285870c9444118598ad60dd6030c45f33239abc79a04a05a2cb8e62128a3a9ccb61248f1021c7ba5751dc60d50919862332bdd0bc371e4037063879fb5bb22290328c9194aa83716316b7747a5130a984a249e2e124ea0eb67396a3197fb80bd672c6e6cab6de2cca2e3ad70d5866fc878dab1cd654729ecf9ceb733a1b81890cf51c2ac112a52b6a4122c27b86cca81089afa1361c4015abe68c62d9a11bb10358459882f58461761a7ecd3b9b3b17e32a682a389c4328bbc4aab01f44ca93f150e72678160243130555ac9e964c784c33943b5ecd07aa8097be421b796305f05e196ae166559ca5c59a445bc98092be1182f8000d5c39b7c074e016433235aca94d7162b853e45367d42e1604b10702cea82d9004259d130ad5117ca24c6ed411d5929c3f7a6bb35cbcb2ca6bf08c06d1a1cb63aa54d4164a838173b82b45523e00559994e8ff5a9cab63c6fc3266998ca8bd5820e7b16f8f86ce149c355e49451c89624b4b1f2fa7f09c5a15bbbaeb6a641d561830ba25ea470c9d7c397499c9747994bb8818bef9c1ef7802fd6963dbafb6e6dc5a3ce1509510578b96983d08c53c9384e45e6a5bea7c943d11c5c46cef5d0566c4c1f99d00079b0641636bc31913034a134e7a4b0cb959ea4662be55157fe89a7eae1a976f30517ba7e019820984115e5ec2e7d00267240695f600b2eb4181adcad96c7605d5c750154a41124c6f23696845b9b5539ae30b1564bdb2b41c09feb96b31b0796fed8503028af11b02e68f342e3210845525a52268a1b0b4f7648600b455c5c824c49e2972371808bf572017331cc8bc0e11147bc10793e096144a4187b196abde288b134bc54c5b3b85312e7a9bb90135dca9bc7396615ac979de9800c26057ae3064090174437209ede210cb2c733302c4ae9c1ac1462024d54006835ac3f23611d1bcfc945a58401c6a6da42242983f4e712a5080bdd13633b1c98f32835f179a3d011aaa46b9b2fb810dee9495cb4451fe0ba20f71992a445e0c16486d06382c8cc4051647739762257a00d80956475b4521493df79a28319c2c1338c9cb3791980785c2a1ec4a11844b608a7c7c92b81015534a03904cd5a4777fd587ad8004b61ec40bc9aa7a4268ef445900522759cc5057baa2a5729bcfb3a0666126a90d56b7527c32800960d9586e93579eed18189f0a762518125a4317649a3c1883c6ed8b047b5444667b4d53ab5d5b952b10ca1b8aa4ca5e438ee3c2e79c2132bcc257d8585abb609ff870d25826a67075fc38c32cd1c6d78e56a4f18cb59c756979331f1786820ba297f4c26ce251c93686506b26805286cf5919ab660092e6c1825d746c8c9478b408aca024376233ab8c287d709d02f7b8c6d80b4430917fe546ba774482b9b77c20bccad85355f562152a1593cf2bbb02014df47b29d1ca5c1d300445cb4835b45bd59b92caa1cadfab9986869f5a7875967981f1267e615180bf7952a27ab3527a60b130d69e155ff88410b1a10a705b14df248cca801e3b7610baac9d92c75e4c759cf7c8f644b610a350a9a9b5b59eb798a1cbf42d02f211a27aaf05ab8e19baa600f3babca5d82c9388466c5aba81c32a7dabc9775e73a77432f9b96225db1698a2c7a6c9b6949c59d7796758d24c41872802a63bc9723b17f703903c84e425383051abb07e94a1f19a258a61c66b56f46cccf68fa4ad62c528cc1bba2d579913ab754268eadc4204b887bb764096783301fd30ef9d972acacc01977d137525d619df951b0f9a5008bd9cb4524c5ae7cec747696489a8fc0ef65c68e808974e356659cf3d88474ae8af1480f2c4bf5f053b0a8c211d43921f735e63f8ffda3565c2424c89b20974b748a65a5aba75133fcb3156dfb6626a83bab + +# Official test vector 98, seed: "dddca9dc31bea737d3f474e7560b37facb2f53c803e768ffaade7669ff94b1d4fbd17068cffd5dfdd24aadada4ef6b12" +seed: aa6dd1e5799cdf7af9c4fc632b3eb9d51d66e85c8e0a21ec98664fc51ab63c7dfda268813efab5204efa60f78bf81d320d01ac09ac06244f7afbd2d80fd356d9 +public_key: fab5cf19743430a247522566196826be35c3ba55053ed8c8ac04211931a38d5a100c7097059bc058d551672542a8f1a7ffe81e0c43b1636572f4608dfadc72f9a786c4c2b2d27c576d29461ad56369b7300d3b0a7890ca3d8407a8a1a90f796558843202152a7131919d9417065360440ab8516909087b2f4ea408baba0cd5c0af2a85634e88693b8c121dc8121d462650f2b417a0c44a5018bc2a70e68a590b757b4c0ac70bca25923049fda10856f62ca42701ab9a75d9991fe3d99856138112ba4f52da1166f410e3f15baf7c3062563dbf0626f76c4ce98ccb1f238a8870201654a6e551a5de9cc24fb36dff2334f2f7bcf51b8b6f8c2d07b4892a657e58637011624076040c02ec59924916f5e49956534b0b7a746b16663f33cef4440f2eb5be9fe4034db153d296a86d83bee3b08ae5341223193a7febabc53956049bc1e14819391c5be5e216377438b0fb56ad770335a97c8e574c015c66d99c59325a2edafc7a6b4ba77fb51050a2c400d754d71c0fac84781af78c03c094bd800fe25b7f7060bfb4252643d97ccc6002a1568d4af181e992b1ffa8cc17bb835f0b2e6b72026478729275b002636cb49c9edbf4373912961da0b913e6cfc1959b80e711cea276c10158dc43b6887042d8d58402cc54a671275fb49a7920c35651aa4d81aebdc772112420db0162b94648ccc519e369958ce40adc90413d9802e621b6e8ccac13d846151c19c6813259c5998f40710f3162d006c5d3a9b2d18861789aa7854831a0314eb74a03b84921ed73ae13db7298288ccec07eaef97716d14a8a296bc3d0b95e4a78e1fa2467c6ac961a73ce63085ca1a4b101adb7f2a4059a97a24bc2dfdb6115386de5e95486a46e6697a17a88510c97a0602205e008088d269082b2c1790c02912a9f03383a94d2127ce1a0d7f558434a6300513a14e2c4f6b33d8a159a06d09983688f75265a84637f07846f0c47441bc6a6a8e48142b39b4891bb5c321c8bd307dcb6326dbb960b532d88f08f8a299d914824e46189378c635cf2088ed8382fbb4164d01c867c1f1c4973116c3629b3cddcb40b1832a0f06b6d04ec8edc46205da3b28f50bd1730bbc04c5f927209a4369b878596a2e149767139e4a06493ea42034062ab1ab037728908c07f9bdc820495916c9114f7e95683c945c19354dc06c5b7888244ec179bf88ed4e68bd10483918bcea652446b7333e71a403e97446564361b5253d0b225d4155682123725f61ed5d4655bdb7891c6572758977f0b4e8de021e832ce6314c25e82392cbca5c794cd20241b87ec87a85a017774bc3da18e77e0b53a521b2eb0a7006b35edf5b0a85b44d3d78dfbb476861997714330c9c5ae5e0027d7298a64b62f2523670c618051629c9577abc2f456eb0ca33fc86e94d910d186144be3a886230cf3566cc09c2ccc76719bc349cfb70c35b24ea6b4bf1c0394527a529641a2b45b60da3a976d70012e48b5df60a7d8382ab149760cb5579f0673f78a52c01c8efd1a667d86635bf15035ac32805b56cc9a1cff506ca38b3df7a3b860985fed84b2b4f1c7f3a88122630f438c565660362a90887a9cb55090cc448c9088c6783aa890cb51ccc3c8cc7c097d59808f06675e1e826869abbc0644a612d471d5c106214abcc1115b106ab3405b1de14c664a773e6e5667d8177ed736a967710edda390f0b105f9c5ba3a2a61912a2414397030022035c533de16c634a799f2b72fc3112071e7aaebd1636a3603971020e2f90fb8113387ca17171b39104595e5500b50c99c37aba1fad50fed567d5eecc00db3ac14624675c76846b42327b9510ddb882b24be90c9661f5c46eb5b1991d25920c78f35807ec55ac2827776a54ac4ee272b469ac65aabc6ba199dbe33724e5866e24a8058d5908e30bf54325745907752d324490b766f6672c4c8443ff7647dec597276135a4789dbab39355175bf3a63ca6a359a879d648c0b388270680781d3e732efa5c85f1c020e4384875954b50403a4987ce54a6f24c83e541491b7d144012544b96b00b933c51704bcfc2b20ada6c481ab32d555898174526a266f70b7939054a88256a59c95a0ec2501cbd45f0ff2ad418b82ecb514f7ebc3fc33647f5c43c5026fb547a33bf2642c9279dc39ac6012a770267d6c947324c6d45b65393421bf4bd7068abb93ab3a36081a303cf37b90037749a046d478 +private_key: 52309729384894d97de3098b745a1f88166013ec7422b31ed4ab74e69c3b7b094dfe982a7db3cdc5d4aaf9e468d0471eaa8c8aa3148cc3a49cb1eb4e4d420b497b73573a839814032f655f87245dc6acafb9602774500919361beeb7b9fd4688fa8238c8c1116f51970394c39354a39212b9508815dffa2e87416269c88def88a639cb1b3560bae168be823918afd8af8d42c3ad9b43ce33428b6b19d4038cd03169c06c773ad1295fe5c06ad97b17ec93cd639732faa7b88029ed160652930595719e5c734420028d60c6180263c9c7db51a2bc5d52b232d0279ef9e7761c1a4578b2b2c21778ca806deef18f9c8778f0b5204d661425c3023c451de2f806c67436fd2b7e2ef208023abb81f87666c117a78b696d65630b1334ef853934a39d9d959ac8990b674534257012796352b0a41308a1104f82a09df85aca25137d597a33c088f942c496998a367a08473a49acb2bd38d27b7ab21fe80959f3bcbcd0488c5bd4c42928155ce5a91da1b437539a33a34ca0cb1c4d179540816f0d063664b599fe195ddc777ea8836cf5c20f8ab34e3c8c6026e58e8b032c6b720324a882a5512d502880b3d2a3df38cf5da7c5fef955524b451d5c7ff24c926d0382535c0ecfea73b4e736a25957c74084448324fbe462fb0c656b074ee596abffaa67b692b770e734f56c53a97bc846030fa6ab726ee7097a49a64f098aa3c763942001c7999131220a47751ef3ac3cd729238c671f5ff51aac89101b772cea01144e469510502103e70a67b08dd968b21818934693037f653c845579e25c5be3196e180447210c97a9a724863588d5f38d20a8c5123a6b2aa549d50a8b03dab4536bc658c8b9d8c782b3e02321c90525e56d3ea8cdf91a7340c88c8d90426414469adac2268214433c23cc078a12c5bfd3ab079db8ab6222cf6f47c005fb84775ac60a606e1b460879d19ddf619293113b80598e87658a025824888541c2246f93870271c767f7d099e70227b97091d0d4c72a1248e47c80b99b2d8072cfc0552bb82320a6ac00f04232c75050afb90f4295c98ccc09414b402782a0ed168d31c2cf913288e57245c8ab998d99b16ba26313d05d50e15617fa0e3aa1a32ff2717ac486ad72bfa679a5a63a047983af1b6544c8405a4513af232b00907c935f3b452619b91ba35c6e6297d5f4abb981a6654b425e612b431359c5b861189a6ecdb978ae3b9804740c7db22013b39da62099d397659d847e7c6a9121991db5abc317b8287f2c9f07d4bfd9c3780e29441865458df968187763b9eaa8c3c99c22976d77760f31b5c369917249a78874f2c22671446d289f996ba38f5235152c366bda9d50f66235484df4f6b0b8f243776bb09a7958668b77f9e1a537428395457873d6be96868ee474c83d969d43e0bfd6976e9a75c79094574595aec7fa2dea390202dcb289f7823a35ca79632343c96e916a097e7314efc002799047c3a608b62829d2669fa6f0a95f594533d910ce6594e9a8186444bc6826541f3c834af812a38a2d8a87c8128837f68c93dc49b664813511fc64cafa56e324556b2803e56503db153ecec99d274c889227bfe8a6b4ceaa578ad37684984a6de966b0f9cb8740c7c5232293030aec6c4828c29152ac2fdfb29ee8c72172105365b465d1bcc2c2a07269895397842f2a839467e49a422657cff06e2320ca5687c52dea39470a8b2b84710ec05bb7bc10e7f3542d4a9e5e2a377cd15d8189a4522b107c866ebc4b7777e602fa4a46981339879534a92b679be67de762b2b0d07a3ae14434220d749c0d3a556295757c747a248a3b2e172a9f7ea35f646c2c2bc3615aa110fee2ce88d24ba7d12f0fd24d209a6fc44995ddf957ebc80014c4c904947a5c7a58a503be4d18a9450c10a4b90e93b780d17c7073623296c62a3feaa30b0414e1c8566d65b95a7c98890b366913336130cb5adcae5f40518325cf2328680d9c3e430bbb2bf32754235a4777280c934d33c2bc571a637b965583678b8280779ad6a2ad9a65d849419de930327b5b00ebba96dc14093088038982409a1b9b19c8085a3bc9a21783b51ab266a996a512c4ebb550c0c871f58332839ccb02a6b1509a89f43a54d302c865463bb12f5d87c1f0989322c48fe1927aea1029e748593995a858514bfab5cf19743430a247522566196826be35c3ba55053ed8c8ac04211931a38d5a100c7097059bc058d551672542a8f1a7ffe81e0c43b1636572f4608dfadc72f9a786c4c2b2d27c576d29461ad56369b7300d3b0a7890ca3d8407a8a1a90f796558843202152a7131919d9417065360440ab8516909087b2f4ea408baba0cd5c0af2a85634e88693b8c121dc8121d462650f2b417a0c44a5018bc2a70e68a590b757b4c0ac70bca25923049fda10856f62ca42701ab9a75d9991fe3d99856138112ba4f52da1166f410e3f15baf7c3062563dbf0626f76c4ce98ccb1f238a8870201654a6e551a5de9cc24fb36dff2334f2f7bcf51b8b6f8c2d07b4892a657e58637011624076040c02ec59924916f5e49956534b0b7a746b16663f33cef4440f2eb5be9fe4034db153d296a86d83bee3b08ae5341223193a7febabc53956049bc1e14819391c5be5e216377438b0fb56ad770335a97c8e574c015c66d99c59325a2edafc7a6b4ba77fb51050a2c400d754d71c0fac84781af78c03c094bd800fe25b7f7060bfb4252643d97ccc6002a1568d4af181e992b1ffa8cc17bb835f0b2e6b72026478729275b002636cb49c9edbf4373912961da0b913e6cfc1959b80e711cea276c10158dc43b6887042d8d58402cc54a671275fb49a7920c35651aa4d81aebdc772112420db0162b94648ccc519e369958ce40adc90413d9802e621b6e8ccac13d846151c19c6813259c5998f40710f3162d006c5d3a9b2d18861789aa7854831a0314eb74a03b84921ed73ae13db7298288ccec07eaef97716d14a8a296bc3d0b95e4a78e1fa2467c6ac961a73ce63085ca1a4b101adb7f2a4059a97a24bc2dfdb6115386de5e95486a46e6697a17a88510c97a0602205e008088d269082b2c1790c02912a9f03383a94d2127ce1a0d7f558434a6300513a14e2c4f6b33d8a159a06d09983688f75265a84637f07846f0c47441bc6a6a8e48142b39b4891bb5c321c8bd307dcb6326dbb960b532d88f08f8a299d914824e46189378c635cf2088ed8382fbb4164d01c867c1f1c4973116c3629b3cddcb40b1832a0f06b6d04ec8edc46205da3b28f50bd1730bbc04c5f927209a4369b878596a2e149767139e4a06493ea42034062ab1ab037728908c07f9bdc820495916c9114f7e95683c945c19354dc06c5b7888244ec179bf88ed4e68bd10483918bcea652446b7333e71a403e97446564361b5253d0b225d4155682123725f61ed5d4655bdb7891c6572758977f0b4e8de021e832ce6314c25e82392cbca5c794cd20241b87ec87a85a017774bc3da18e77e0b53a521b2eb0a7006b35edf5b0a85b44d3d78dfbb476861997714330c9c5ae5e0027d7298a64b62f2523670c618051629c9577abc2f456eb0ca33fc86e94d910d186144be3a886230cf3566cc09c2ccc76719bc349cfb70c35b24ea6b4bf1c0394527a529641a2b45b60da3a976d70012e48b5df60a7d8382ab149760cb5579f0673f78a52c01c8efd1a667d86635bf15035ac32805b56cc9a1cff506ca38b3df7a3b860985fed84b2b4f1c7f3a88122630f438c565660362a90887a9cb55090cc448c9088c6783aa890cb51ccc3c8cc7c097d59808f06675e1e826869abbc0644a612d471d5c106214abcc1115b106ab3405b1de14c664a773e6e5667d8177ed736a967710edda390f0b105f9c5ba3a2a61912a2414397030022035c533de16c634a799f2b72fc3112071e7aaebd1636a3603971020e2f90fb8113387ca17171b39104595e5500b50c99c37aba1fad50fed567d5eecc00db3ac14624675c76846b42327b9510ddb882b24be90c9661f5c46eb5b1991d25920c78f35807ec55ac2827776a54ac4ee272b469ac65aabc6ba199dbe33724e5866e24a8058d5908e30bf54325745907752d324490b766f6672c4c8443ff7647dec597276135a4789dbab39355175bf3a63ca6a359a879d648c0b388270680781d3e732efa5c85f1c020e4384875954b50403a4987ce54a6f24c83e541491b7d144012544b96b00b933c51704bcfc2b20ada6c481ab32d555898174526a266f70b7939054a88256a59c95a0ec2501cbd45f0ff2ad418b82ecb514f7ebc3fc33647f5c43c5026fb547a33bf2642c9279dc39ac6012a770267d6c947324c6d45b65393421bf4bd7068abb93ab3a36081a303cf37b90037749a046d478b6481b87d7f462e656db85d6046534ae44d82b1cb737a0194eaac814c7b85493fda268813efab5204efa60f78bf81d320d01ac09ac06244f7afbd2d80fd356d9 + +# Official test vector 99, seed: "2a6f7386b815366f572aeb6c79e272cc21b7095fe09575f18072c9d677da23bc9c8a4bc393b7524604d299bedd260c8b" +seed: 195d6c86a3df4c21e3007d7f2768b43c74cb3060e0eca77f0a5d3271542b9a84ae77e0f9f21eabd8c0c6eea7767f4e10fde5c2d79b8400bf96b19014b457ec21 +public_key: 7665cd15516d767a980e05ba44d761fe17355c0aa302f3826dd25da4ca4d044c299dab608da967c1e253ba77108df51914a15541763f737a89fef62be1f7b4e1b8b77eb719a84377be0081f7d71a6e881e15578603867855d87ec04b5f1f133368e43ec6282fe5eb16935a04ec9916caa90031e40d98b0a8ced98979fa7742a20dcbe84c67223eb6925d7b1b12e07a47677b56e9916029204e91408635eba66a6a844de5ccff6aa63fe15190030b8771101b456288b170bb117584c996c8515262c684a4718f8b369011865c756827d3038d62355f4c994a539815f4d6b6dc9455f4d7ba24501029170cf1aa3b0944574f6642c446a3f121cd08c7bb67e7239da147e0e9c9b5c57b8f2182e00488341994f620c99978c818aba5e4516efe23690636cabf607c438cc288e944b3446b41a264b88c6e0371a08a1c02703c21a0bc5d73e6b95e7b5fb87c6cd43415aeb26f92abac0371b9a7a70ea51c88e12bbcdef7c3cd3a4bcbfa3bb83606b25c85984021122400272a616fc4071db20560654a7ca099a6d0754c43687d9657b1b816a04b8d4cb63d0e3765e228890e0907accb4734cc557fc96ef7fb6b463cc2fa5b73b7fc231f230028201483e66efdd4570365865c08028f96609377703a2300f7e1b9f4939475541e0cda2527b28aca7374d1827206426637965870e9b86cbc115d9a04c0e73e8b7a866c277da3c58e0d2094fa285e2d05af7ef64f8ea6146ec4321395b7f30a6e52171ba28984b1e49726b48ed259638f6bacbfc5c2a4baa3cc391f0be917f7ba3a05dc911642a63db03fce58bc6ff92af7616569d04415a26eff8c271f9921ddd302787959f5397b70d7a388f7569e010cf26b67fb2c3a2a52714f5666b9726cb775c28a79a41531213e4766c9442fa06498f6d5a1816b7338f9afb779a40f2670221bc5ef319786762fc78b1a25fc9db8e362f11c9f374b04204940877bc209b25ae7f461c40a0193f66a95ab7dcc80afed9402ab725dab23c1abeacad633c461a26790865c21a960d338a7e485cb2b42a8b0963b8689c9d4287643b8685a341333dcbbd7637fa2671c1048638a547815f07b255ac115c8bc32b61a369128c60076c3464fdbe2c7c0bc5ef1e383ddd2ae8b0457410c19ba1c486b702a9048049e85cd1e7569eac6b3be8287ec9c195c3bb0b4f28952823832c55257d05ebd8a8bff9c372095be66359c9ba7384080a7acd9567db7905c50c36734cec7519e8e57195247b48a65a1e34cb942d741d88b429d226a4097beed271dcbc8a035606e056a89a8487197039adde30f78bb17148a4f0bc84bf1dc0d9057c97b028296b9260e601ed1a675bca781c53bcbd6866b4ae108d059ada7c6b8615195336c2df2e71ce97528378b2fdc4b6501f2443fd4b6248429b67a4624769236e32c12e3116ef66ae2554f55c7be15319e803b8ce0089d3c04b65ec8340c483b2ae4c2b8ec7daa91b39270ab7ec04fee436e1c008f61c46fa854363287573c50c63c3b1f94d52feeba13aec5c926257592904b00ca8615469df5539e8f4c627b11be02e96d17189a80f37da5d08db81baeb7c34b5c58ab3ccb25af3c29cec9364175b6bb4a04b5958079e18d5440bf24538598c1c548327980297efe531d4c14a9360b8dcc173f6536b760b2a6fd59bae262087989269c884a966c658017ce65d14519a2c61266b344f6648abc0a657580130c6fa0f6565d8100f0532011945c3fa296de184750aa931582a90e6bb9080971cdd6b470f68db4e529ed61bf97f62bfac5cb534c1570db606cf0351e1866d7e199dc329d70316d7fd849d5c296d76a8db20306bbab609e7a9ac05c7896b150d6962d2466158f8697e532901e421d5ec00671344640623891a9221ea17ebcf6b290dc54359814a86658e2c0159c2374e1dc5f94dcb30ce01f3633129274585e304f0436396d66660f81c4cd273b94a3740f9c2fdd081bc309602a2cadd82aad35a46684547d01c74c38547176113a697b49e6c98c1c017b25f817e19c2a0302d083dc5c74c4c38b6706e94c10d178369b375df9c118130824fe99ac49f24a682ac23de429f8c7a6d1a89c36f82f0a47379e7aafadc744e1f20b9186c67784c3e6b823306896fca303baf61309cb498a216431862f00198c26ab6938487dacfaeec6906ae45303ec7dbc2889a8eefa511b82609b980dad54ebb3e7091e9d +private_key: ead08feb355828171b57c7a2c7328d0a736fc5b548308a22b8672c19c820192297e4762a8bea6c048a33c0248676f2bf0b8393b34667de1abaec665a886ac369320ce3188f66d6482cbb184ca6b189c70c531661e10784f4b5116ba5000d0b06714320d8b72ea88621093a0338e5b628f44194925219406517e36d14096b2cf5286f6981f8885efc1ca4074b2d5ffb118eba8f1e7aa83dc8ac1aa9bad3b5cd257465bedc943fdc9a88915aa573a2ff63bbc2e29abe33cd919bcd725bb24486b847f2cdcdf36fdeebc79c123151a02a7f4a42851c0c56e08cb5b6cd34309200e80e9344a229917dc5231e1608115f6120dcf177da2bbffcd8a389e0623c81baf62a3033f99ac0027540c93d2071380d5ac60d894b85d18b20f21aaa5151657b34d5b125557832fdb09dd1c5bedb2bcce9d3c71e742923ea341b1657ac7908ae474cb7340d2f917513958ef6fc9bc4997a9a91662300a610868840c7b868ac0755e0a3c16a9b8f2343c2308e5e256ec7c60811822545eb20c3b8077ae771bd4313208584551cc2463691ab1ab4d5c112fe951bc0b9c02e867377dbcf41114d1553912400d065308456c1314641adf2038a8625b6311c3b0f98aa1ae37caf188f4448a6b5a78b746a0bcfba1ea2016d34059a3dc34fefd9261d5308b4e03c5677895822bc96441741865ddf787545b80c509259265976f187833959229cfaa95765a41837b210661a1e06137014b08039c88be27b9d292ac3969bb9ac396fbcbcd3626f3ebc78fbd6462e673cffc06d490b7dee720e57130acb1a1edd9c4e64a2aaa2f92411d489c9ea00b68a7d30d347714059487b8f837c1bb5070260b2521642cef747c602398902e33c6022aff921a25e941955f81515a245f6d717d048a307020055e988d760b141e23a16f767260877b7551e9bc80828626829f94e20c4020a9a2688d1168ca5c3a9f752643a17237ba623b79f144a118f5cb41f466a27cca78a208815538290b8ac4b086cf626932869b43e4b5477834606d9bf8e21295d6284d0cc72e64875cf526b8c380731880dd00c20fc2a31496274b94aa87ad54de79aac54995c951a1371da09770b8446aa1e40b1cbcb57ba5f446fdf1260e9bca676dc3db9a24c5f99cc300b7b08c9abf620bb03e75d0a5b872bc79cde550f8b243940737cecc136918b61adfa167553a005e0c2fa3190a895c2ef4a53ff90a75a879cb0e9855f2826ad7a9608579606904411b25ab46c6181203756a93c7a9ba7c2d3b862889fbd153a394791d3c481fb64aabad314c7d637dc43bff1a6ba7c031698f245c29294a533700145a904b17f9f30853090a0f68574b2b4a095033257d205a4e59af580b362a5be3c0311abb22e665c9558f29ef456cb3aca8d3a149a01118f7ce93d87ba57a814cb7e7c84dbc614fc2614ebe6892d6037df49446d135a6cd05d224786d79ac87417626d831134b95d129a42bc4663ef09184c53c50dcc9d2dca8efc81254aa76a8e8370bb03ca7c30124d5c2247490c03488484cc110c9b1233e482899ca443f0a4b44a6fa073ac87e82688763ad72bcae0db87b1a5a629d27f8aa2b11793b47c82af1486c97e41b7aa308e1a23af4b68be5c849625224aaa0cafcfc3a21ba49e3ba168d16512a5968d5c0222696649d7674332f884f31259cf9b477d1445eac17c4b11afd2fbb6a68aaece5a47ac5031e5457d32cc2a601b6b91257b64ea7c30b6b32ef7b949893a3aa14ca0d1a153b50bba60398cc4090a9390f714541f34bb4c93a81f734809cc86b8fab6be5539c9f6a968ec207eb577b16116169565b86c21561936a467a435b88081e71925576350cc964f5b37fd73c421e7a076703fc308947cc5a3f2e21d328b8c23e32fc8f5c04faa6d72395fc7c8b2d8fa72c6f35c9d81271ac34c0ca2685b5c5571f7b9b9245133c58b3bf155e6668315d0899bac05dfb0b8661241f22772dd290bd963087cb94c9fa464788b8a87c637f327ccbd31a34328cb58b5c7f95aaf9f51aa5bbc284fb26b40cc438843a6ac41c82886a2236734dcd81584d8ce18184b90b22e62296ace4191efe679d4d52c12351e3d41bb2d815035d62380c45bf078025d4a12885ac092057b009d6c3105ac49641cdfe0c48bc41a6f14c0a5f31423ec378ea2098b48557665cd15516d767a980e05ba44d761fe17355c0aa302f3826dd25da4ca4d044c299dab608da967c1e253ba77108df51914a15541763f737a89fef62be1f7b4e1b8b77eb719a84377be0081f7d71a6e881e15578603867855d87ec04b5f1f133368e43ec6282fe5eb16935a04ec9916caa90031e40d98b0a8ced98979fa7742a20dcbe84c67223eb6925d7b1b12e07a47677b56e9916029204e91408635eba66a6a844de5ccff6aa63fe15190030b8771101b456288b170bb117584c996c8515262c684a4718f8b369011865c756827d3038d62355f4c994a539815f4d6b6dc9455f4d7ba24501029170cf1aa3b0944574f6642c446a3f121cd08c7bb67e7239da147e0e9c9b5c57b8f2182e00488341994f620c99978c818aba5e4516efe23690636cabf607c438cc288e944b3446b41a264b88c6e0371a08a1c02703c21a0bc5d73e6b95e7b5fb87c6cd43415aeb26f92abac0371b9a7a70ea51c88e12bbcdef7c3cd3a4bcbfa3bb83606b25c85984021122400272a616fc4071db20560654a7ca099a6d0754c43687d9657b1b816a04b8d4cb63d0e3765e228890e0907accb4734cc557fc96ef7fb6b463cc2fa5b73b7fc231f230028201483e66efdd4570365865c08028f96609377703a2300f7e1b9f4939475541e0cda2527b28aca7374d1827206426637965870e9b86cbc115d9a04c0e73e8b7a866c277da3c58e0d2094fa285e2d05af7ef64f8ea6146ec4321395b7f30a6e52171ba28984b1e49726b48ed259638f6bacbfc5c2a4baa3cc391f0be917f7ba3a05dc911642a63db03fce58bc6ff92af7616569d04415a26eff8c271f9921ddd302787959f5397b70d7a388f7569e010cf26b67fb2c3a2a52714f5666b9726cb775c28a79a41531213e4766c9442fa06498f6d5a1816b7338f9afb779a40f2670221bc5ef319786762fc78b1a25fc9db8e362f11c9f374b04204940877bc209b25ae7f461c40a0193f66a95ab7dcc80afed9402ab725dab23c1abeacad633c461a26790865c21a960d338a7e485cb2b42a8b0963b8689c9d4287643b8685a341333dcbbd7637fa2671c1048638a547815f07b255ac115c8bc32b61a369128c60076c3464fdbe2c7c0bc5ef1e383ddd2ae8b0457410c19ba1c486b702a9048049e85cd1e7569eac6b3be8287ec9c195c3bb0b4f28952823832c55257d05ebd8a8bff9c372095be66359c9ba7384080a7acd9567db7905c50c36734cec7519e8e57195247b48a65a1e34cb942d741d88b429d226a4097beed271dcbc8a035606e056a89a8487197039adde30f78bb17148a4f0bc84bf1dc0d9057c97b028296b9260e601ed1a675bca781c53bcbd6866b4ae108d059ada7c6b8615195336c2df2e71ce97528378b2fdc4b6501f2443fd4b6248429b67a4624769236e32c12e3116ef66ae2554f55c7be15319e803b8ce0089d3c04b65ec8340c483b2ae4c2b8ec7daa91b39270ab7ec04fee436e1c008f61c46fa854363287573c50c63c3b1f94d52feeba13aec5c926257592904b00ca8615469df5539e8f4c627b11be02e96d17189a80f37da5d08db81baeb7c34b5c58ab3ccb25af3c29cec9364175b6bb4a04b5958079e18d5440bf24538598c1c548327980297efe531d4c14a9360b8dcc173f6536b760b2a6fd59bae262087989269c884a966c658017ce65d14519a2c61266b344f6648abc0a657580130c6fa0f6565d8100f0532011945c3fa296de184750aa931582a90e6bb9080971cdd6b470f68db4e529ed61bf97f62bfac5cb534c1570db606cf0351e1866d7e199dc329d70316d7fd849d5c296d76a8db20306bbab609e7a9ac05c7896b150d6962d2466158f8697e532901e421d5ec00671344640623891a9221ea17ebcf6b290dc54359814a86658e2c0159c2374e1dc5f94dcb30ce01f3633129274585e304f0436396d66660f81c4cd273b94a3740f9c2fdd081bc309602a2cadd82aad35a46684547d01c74c38547176113a697b49e6c98c1c017b25f817e19c2a0302d083dc5c74c4c38b6706e94c10d178369b375df9c118130824fe99ac49f24a682ac23de429f8c7a6d1a89c36f82f0a47379e7aafadc744e1f20b9186c67784c3e6b823306896fca303baf61309cb498a216431862f00198c26ab6938487dacfaeec6906ae45303ec7dbc2889a8eefa511b82609b980dad54ebb3e7091e9d42a9b1d5b6521a7a4527116aa7c38f6ddf99acd4a7b9837317d99f83732bb7caae77e0f9f21eabd8c0c6eea7767f4e10fde5c2d79b8400bf96b19014b457ec21 diff --git a/regress/lib/libcrypto/mlkem/mlkem1024_nist_decap_tests.txt b/regress/lib/libcrypto/mlkem/mlkem1024_nist_decap_tests.txt new file mode 100644 index 000000000..bdacc5c10 --- /dev/null +++ b/regress/lib/libcrypto/mlkem/mlkem1024_nist_decap_tests.txt @@ -0,0 +1,32 @@ +[dk: 8445C336F3518B298163DCBB6357597983CA2E873DCB49610CF52F14DBCB947C1F3EE9266967276B0C576CF7C30EE6B93DEA5118676CBEE1B1D4794206FB369ABA41167B4393855C84EBA8F32373C05BAE7631C802744AADB6C2DE41250C494315230B52826C34587CB21B183B49B2A5AC04921AC6BFAC1B24A4B37A93A4B168CCE7591BE6111F476260F2762959F5C1640118C2423772E2AD03DC7168A38C6DD39F5F7254264280C8BC10B914168070472FA880ACB8601A8A0837F25FE194687CD68B7DE2340F036DAD891D38D1B0CE9C2633355CF57B50B896036FCA260D2669F85BAC79714FDAFB41EF80B8C30264C31386AE60B05FAA542A26B41EB85F67068F088034FF67AA2E815AAB8BCA6BF71F70ECC3CBCBC45EF701FCD542BD21C7B09568F369C669F396473844FBA14957F51974D852B978014603A210C019036287008994F21255B25099AD82AA132438963B2C0A47CDF5F32BA46B76C7A6559F18BFD555B762E487B6AC992FE20E283CA0B3F6164496955995C3B28A57BBC29826F06FB38B253470AF631BC46C3A8F9CE824321985DD01C05F69B824F916633B40654C75AAEB9385576FFDE2990A6B0A3BE829D6D84E34F1780589C79204C63C798F55D23187E461D48C21E5C047E535B19F458BBA1345B9E41E0CB4A9C2D8C40B490A3BABC553B3026B1672D28CBC8B498A3A99579A832FEAE74610F0B6250CC333E9493EB1621ED34AA4AB175F2CA231152509ACB6AC86B20F6B39108439E5EC12D465A0FEF35003E14277A21812146B2544716D6AB82D1B0726C27A98D589EBDACC4C54BA77B2498F217E14E34E66025A2A143A992520A61C0672CC9CCED7C9450C683E90A3E4651DB623A6DB39AC26125B7FC1986D7B0493B8B72DE7707DC20BBDD43713156AF7D9430EF45399663C2202739168692DD657545B056D9C92385A7F414B34B90C7960D57B35BA7DDE7B81FCA0119D741B12780926018FE4C8030BF038E18B4FA33743D0D3C846417E9D5915C246315938B1E233614501D026959551258B233230D428B181B132F1D0B026067BA816999BC0CD6B547E548B63C9EAA091BAC493DC598DBC2B0E146A2591C2A8C009DD5170AAE027C541A1B5E66E45C65612984C46770493EC896EF25AA9305E9F06692CD0B2F06962E205BEBE113A34EBB1A4830A9B3749641BB935007B23B24BFE576956254D7A35AA496AC446C67A7FEC85A60057E8580617BCB3FAD15C76440FED54CC789394FEA24452CC6B0585B7EB0A88BBA9500D9800E6241AFEB523B55A96A535151D1049573206E59C7FEB070966823634F77D5F1291755A243119621AF8084AB7AC1E22A0568C6201417CBE3655D8A08DD5B513884C98D5A493FD49382EA41860F133CCD601E885966426A2B1F23D42D82E24582D99725192C21777467B1457B1DD429A0C41A5C3D704CEA06278C59941B438C62727097809B4530DBE837EA396B6D31077FAD3733053989A8442AAC4255CB163B8CA2F27501EA967305695ABD659AA02C83EE60BB574203E9937AE1C621C8ECB5CC1D21D556960B5B9161EA96FFFEBAC72E1B8A6154FC4D88B56C04741F090CBB156A737C9E6A22BA8AC704BC304F8E17E5EA845FDE59FBF788CCE0B97C8761F89A242F3052583C6844A632031C964A6C4A85A128A28619BA1BB3D1BEA4B49841FC847614A066841F52ED0EB8AE0B8B096E92B8195405815B231266F36B18C1A53333DAB95D2A9A374B5478A4A41FB8759957C9AB22CAE545AB544BA8DD05B83F3A613A2437ADB073A9635CB4BBC965FB454CF27B298A40CD0DA3B8F9CA99D8CB4286C5EB476416796070BA535AAA58CDB451CD6DB5CBB0CA20F0C71DE97C30DA97EC7906D06B4B939396028C46BA0E7A865BC8308A3810F1212006339F7BC169B1666FDF475911BBC8AAAB41755C9A8AABFA23C0E37F84FE46999E030494B9298EF9934E8A649C0A5CCE2B22F31809AFED23955D87881D99FC1D352896CAC9055BEA0D016CCBA7805A3A50E221630379BD01135221CAD5D9517C8CC42637B9FC0718E9A9BB4945C72D8D11D3D659D83A3C419509AF5B470DD89B7F3ACCF5F35CFC322115FD66A5CD2875651326F9B3168913BE5B9C87AE0B025EC7A2F4A072750946AC61170A7826D9704C5A23A1C0A2325146C3BC1858826C6B39279C2DA7438A370ED8A0AA5169E3BEC29ED88478732758D454143E227F8595883297842E6AF133B17E4811B0F5713AC73B7E347423EB92822D2306FA14500A7207A0672672046544ACC4EA9C16ED7421A069E0D737A98628519C6A29A424A868B46D9A0CC7C6C9DDD8B8BCBF422C8F48A73143D5ABB66BC55499418430802BAC544463CC7319D17998F29411365766D04C847F3129D9077B7D8339BFB96A6739C3F6B74A8F05F9138AB2FE37ACB57634D1820B50176F5A0B6BC2940F1D5938F1936B5F95828B92EB72973C1590AEB7A552CECA10B00C303B7C75D402071A79E2C810AF7C745E3336712492A42043F2903A37C6434CEE20B1D159B057699FF9C1D3BD68029839A08F43E6C1C819913532F911DD370C7021488E11CB504CB9C70570FFF35B4B4601191DC1AD9E6ADC5FA9618798D7CC860C87A939E4CCF8533632268CF1A51AFF0CB811C5545CB1656E65269477430699CCDEA3800630B78CD5810334CCF02E013F3B80244E70ACDB060BBE7A553B063456B2EA807473413165CE57DD563473CFBC90618ADE1F0B888AA48E722BB2751858FE19687442A48E7CA0D2A29CD51BFD8F78C17B9660BFB54A470B2AE9A955C6AB8D6E5CC92AC8ED3C185DAA8BC29F0578EBB812B97C9E5A848A6384DE4E75A31470B53066A8D027BA44B21749C0492465F9072B28376C4E290B30C1863F9E5B79996083422BD8C272C10ECC6EB9A0A8225B31AA0A66E35B9C0B9A79582BA20A3C04CD29914F083A0158288BA4D6EB62D87264B912BCA39732FBDE536A377AD02B8C835D4A2F4E7B1CE115D0C860BEAA7955A49AD689586A89A2B9F9B10D1595D2FC065AD018A7D56C614471F8E946FE8AB49E8226591119FCADB4F9A861631378736B6688B782D58E97E4572753A9664B6B8536812B25911AA76A242375433192738EEE762F6B84315BB3436231E0A9B277ED28AE0050728346457E13405062DB2804B8DA60BB5C793D4CC0E101CBA2D9182FD7124FF52BF4CA28292AC26D678088953971DBA0B6FEC2C9659353291C70C5B9245A0CA253304AFD3C95102BEA66875C6201680B4BDA38687B648C28EB37478E3BC00CA8A3CC27204642B42B68FCBE7B21A366D0668A5029A7DEEF94CDD6A95D7EA8931673BF7112D4042107B1B8B9700C974F9C4E83A8FACD89BFE0CA3CC4C2FCE80A03D3576C222A792B72B1F070AB7F6B6F2B5CA2AF5054AFA70A896990159B45D1003E2A05648675E596016F1B71DD0F7BDA7E2097FC73B3A143D12C726020AC34958AD7062B92B9ABF3CA6BE5AE29F57135E625A367971837E6363D1532094E022A23467CF932E1F89B5B0803C1EC99B585A78B5865096746F32258214ECB38065C97F455E155ACC2DD005A9C76BED59CDA73837D303504E6C976A606A2BE7BBEC5948B91A349E8936688CC0279754B743ABC58666B19B6C3260051F19206BB962BB6633EB0048E32BAACC5B020D02C86CA9770AD469DB54A106AC73A35B8057422B3DB202C5A5B4E3D535F0FC99326C4B8B7B16F1CB5AF96803FA8C195FC0BCEDDAAF012A51728B76489082373C91E92C87ACCA795160782E3B0DD643544BB96ABC2708D49B759CF057AA223BAFD96A330BAF39810FE8671B4343C297DA1E1969C996216AB5106DA668941B160D4477017136CBCA5B5A8D44C4A8B1CF3EF79785E5AA25C3A1AD6C24FD140F79207DE5A499F8A1534FFA804AA7B3889CBE25C0414704AA57897F17862364ECA56258007248813912B836497F0359C2F7238A05D305A0EA152E72B44417A868134E91B3CA7931232FD4C25F8C2A492A339CDC0A138967211451F2562678FA14080A34436C42B07865AC036A81E97A7787A938025CAF813450368BED0C94B1857604526405D27A1C1ABC81B5B6EC13C71930A97D9232CF7021EF87A4D155328E62B583A83B4AF21F9F5750F8575150424F63B899D71CAD267C09E4467146E16E9B6C653F008C311375E2E006D4076A546B82F5314222F7C654317E79EC6035B73FAF491757E61C828326D53044541C4D4537ABD3EA1E67998C3382974CA78AE1B1960E4A9226B0219AB070F0D7AA66D76F9316ADB80C54D6499771B471E8168D47BCAA08324AB6BA92C3A70275F24FA4DC10E251633FB98D162BB5537202C6A553CE7841C4D40B873B85CA03A0A1E1CFADE6BA5180AB1323CCBA9A3E9C53D37575AB1FD9E7316C6FEECB0A14DF6F2DA56C2F56F55A89635CFCFDA47927AF1F0A47B2D4E4E61634B1B51D37A3A307A972420DE1B7A481B83E583B6AF16F63CB00C6] + +c: 0C681B4AA81F26ADFB645EC24B3752F6B32C68645AA5E7A999B62036A53DC5CB060A473C08E5DA5C0F5AF0E5170C6597E50EC08060F99B0C00EE9BDDAD7E7D25A22B226F90149B4CE887C72FB60AFF2144EA2A72383B3118F922D032A16F554289902A14CF7755512BB1186BAFAFFE794D2B6CDE90109E6582D39CE0C96197484B3FA07FC91D394FC8D88E7FC4BE002E2DB56F0C4D9D3FBDA274536A0B86ABC6E39BDA52931AEBB8F1084C5C1F7CB3177788B7F331B7074361163491D428E78BCBB57B630841AA987333377CF09569CFD14CC2A11C501BDF82C93DE05BEA20060DE89C686B824571CEF94AB3FDAFA8512619813669D4F53637FEFA4D028CB233E56930E2235F7E6034CA94B143B77AD4A68756E8A9184DBA61A89F91EDFB51A39211402473A5F89145736B2BF8569C705B0CDB8980A447E4E1EAAD3E7E0578F5F86B8D03C9DAFE875E339B4423845616799EDCE05F31B92664C5A59253A60E9D89548A300C1ADB6D190A775C5EE6E8A89B6E779B034C3400A625F4BBEDBF919C45B2BCD14C669248FC43C3EF47E100758942E75E8ED6075A96D70D4EBD2B61358224DDA1EC4C19C2A92898176FEB3C02EDCB9908BAE49BD94AF028EDF8CFC2E5F2E0BD375006986AD49E717548E746FEF49C868BCEA2790AA97E04061B75605CB39EFD463D7B3D68BA574434FF7BE8E2B84BFC47E67E9CD15F3ED450C61AFBA79A20B0B6F287777C72F4AD248174F1959477AA7A7C97F122C50447C7484F382BC47D81FCC9C7E892C8839D37B35394B53E6B2B1895ABB0DE8C98F2633DC4413A8D5735DFC9A64026B6F34779D6AC8AD99CC31AA898C2E7057F3DB8A1A8A98527A79E43552F28D1023E1F6A6B84855CF5E6DF889BA269F048946E84021C65C5A93B007B07741C1EE176C73949110F548EF4332DCDD491D2CEFD0248883F5E9525BC91F30AF17CF5A98DD44EF9A71F99BB732985BA10A723EF476FCF966DA9456B24978E33050D0EC90D3CE46378851C9ECFCFD36C895D44E9E506993082523D26185766B23568CB95E64108F89D1014747C67B6F3C8767BE5FC341227DE9488861C5FE811409F80957D07522A72CF6AB0378D0F2F28AF548185C3936777994466A019D33B18A54F380A33892AB4D4BD507B5A61D0D358341AC92F07B43B8F6AFC6991BB6A1EAC23CA6F73E91F2464BD119098D7E768E77ECE53FB899BEB42265ECF7B271F66546282D472C36239006BB0ABABCCA24550BAA0A601348C810FF5F9EE504BF7155DEE4141A11605A4F3509AC9CAEF6624D21DE332D5D50828B52E92885D3B90553B14463AFB1EDCCD3B569B5A7F00BB66769DADAC23AD8BB5D73A6F390E6FC2F6F8EE3CF4009A5C3E1EF60E8F040672D262E6490379BBC70495DFF237BECD9952CD7EDEB6D1DFC360B3FC8B0AF480FFE024AEEFCD4E9CE95D9B469C9A70E5110DA0BAC124FC3741DCF49116261796504D5F490B433C33C40EDCE2B75151DA256A868A5E35F86226B8151C91934CCC3DACA391DECCA745375660B6EC41AE5D810838CBEEFFA12557884412357B1008363D32B237AA1DD8E2D9C6367ADA09B2C95060206CEC3EED391FDC5DBEF6F08BDF0408E585AE5EBC8E9745D44FECA975ABBC140BB37B8ADD16FCC2956910DC72BB3F02E9A130C9A84F9CCB74D134CDF40AFCBA2009C8F0040239BC99220EF64C4DCCDE2E2E5C9B68602FBE8EF4C98B3468C79DF4E078511BFB8AA3DA09597A02511E7C21A7CF66A93843A94868F19E8552552E3ACDF6CB810634DB97CBC4BB569709DAD4845645446FA8D289FC59307B801E60CE2A91E06E9C22C16E2E59BDE38A416BB1B4AC5457438FDC5D64450A89ECB832C1BB279DBF59334681776AC00409846D09D6F687772E340850AB8673384215E12C8D0F531C451E58493E0EE415AD594DF38C34408C7ED9F0C392F1534604EAC3D9C15465A9A46632214B536990D78078E5BD7EAE2013FFF8FDD8B275C89D97C9353DF3C42A28E814D8468E2B48DB0976D88F5EECEFEAFB8F7F4AF291A728F6249ECF5622339269AA945329E919F8B441C83D5507F30DF0FD2B13FF806F522DAA11AF676A513C149C70F0D6E99A880450A54E0417FE3C1E513E9D920E30A8B42891267A2DC50AD81F98044920C099DF22C73998A25C581A5178C72B17AC875BC68548A0FB0CBEE38F05017B12433343A658F1980C8124EA6DD81F +k: 8F336E9C28DF349E03220AF01C42832FEFAB1F2A74C16FAF6F64AD071C1A3394 + +c: 4F90106FF7C3DC4E47417F31AB56B1C5E426C1ECD5878AAD2B705E75062DA5FA6F4D18B704C941C6C6D941FD21191A69210BC39E24950D9F851B6DE8CE30023DC7536439104D42245F3E04E6AA6763F8AC97ADBD04CC69547BCE0BF290FFB5D12946301174AF1B0868C14D4293FA9DCC5B23F809B02CC78DEFE7F27935B9B681E531FC21CCB2AF8EF6144D8498E63E0EE48AF8D4CEF7AC1F669AC740B06F79DDB58E794F2FC2CA832E05A0374C18A4F2CC78343EEA064ABC5F468F4DD11E0B6E8FA1D18A221D8241450C05EB9EDF90D9D7F666AC82E7FD44AF9328E0BC6004D5B114E80E9B980D18E081D771DFCB2ACFD40142A2EB33234F75733EAB7D8EE8A5A6F796681A4A8AF85CCE86971B821D4AD8371049E94E280B77B15D111A42AEADFC08D4F804BD78885443E81A393DF7C8754C460915846E09A0596587460038F55D06EC21434A1C2DF44D0C16706E8D2B83F0E7833976EF05BF1D9F0DDC9A37597E401B817C2BEC8E02EB9DF7591E239F25F8648E7F2F4F673093BD9CB703DA32B353F58514C6AB55748B194E52F153D52F5F33FE95C5F9F65EA97BA721E8DDF333B64D233A867A12701E00C5D8A9B5AE344F3D847C27C079DCC9C3B40EC4604A9F041E7987E8B930C658B9A132DE4E422C0E27553A2A0EAB8C859EB0E5677E83272725C5C1652E61B9BBF5C9C59BC2357A4D1DB9C607F34DC1BA074B84DFC69E4097A7AD2BA9A58000027296AD39FC1CE218A5EEC7ADFA8AA3B9100B0B603CFC83C152589E12E6BD9EE10C49131A701D315DFEC38E018328916F9FFAA7305CFB66781707D2D1020EB782F9F003DB4E46B87D693F62E8BDE170141FF71F26DDF5310C00C9163655F5217DD2C8B0466AC89DB55BD7FB3B0964BC9009E9686185117DCB50D6D0297753CF7F1217E819EE60E3F0FAEC4A5AF0C2EA83CCDE15CF045C6961DE8FF6235C9D93BA4C89B7A82A7471FCFB0B8EAD54D56E8A1DE21B3933AC5B4A0689EEF3598926E17BBB16AEC61EC30A2CCC0E0323EC282887C108C3A4E83E3666493D8653D0E92443808C79D770BFF48A49E65AE089FEC790BBA4C66354EF67A334C1EA5C6C5707B6928EBD1BDB6A940FA242C6EBD7F3E71272421C9082841A6CAD2894BB8AC85F105D8BBC9E6F0A3DF0D7C46F6E2F4CAB904ED157AFA85D4A852220A9636E1E8821643A9E4028D87A430432F09354B3973182385CF5ABFC8F84982BEE0BCBF5D18637399163A09EB45711E07C4458498C76979107CF91B3FC590EA4AD715D656D5E56DC32146580101C952E02ED7017960D54CAACCC70607196980ADBDAEA420A52C0559ED23C9514F8CA7AB7F3BAAFD2FAB58960A64128D5A50E9AD8DB7D23A90CE64C1BC349D118D3603358377F84FF5A64457FA1CF41B27094BCA72360BD429415B9EF9ACCB7A5D7B9E5F5FDCA8FCFA4592E91D7E5120DF7E3C6675AF2211BB94D856A5D2285FBBB36984A1345590930B13232565D54812A9345324C232653190323CC67C840E478D09E6DDBCF999F7AA3B556F80332E67ACA41EC0661088D7696BB64E9A98A0749FAA9854D9B48754023BACAF3C8081A46157C6453BDC89341D3092F3B5337874CE5DE559A56A2FFB7F401F6E28EECAF4FDE5B60DEA73D6B2182EF68E07A8297F3C959E17139B5DEDC72C7A0E103AFF866E89D1F62A1F6B97B61BC059BDE5A2A06087EF783A441F23DD191C692D03C097FF9EE831F7715C6E508BF475E79A8353E84B06A9356045C8FD09FBA35879069B9A3F478FBD051143C13D753BC45F3040E85985EFD6B149EFA9455A18E2894E6EA0BE58F451FF1156F93CC7117B5D091E9DD50D41BFCCD44F2C4EB7812AEFD13C8B68D7F0103BB6CA38D233B6AADD01845B7E44D13C1CB1577D6C4354B063991344787F8C0BE667A7440B98917AD64CC2EF2BC82EFC3398B3B1B238540756CE9FC5EDD26CC20E761D592A1A0530AA8BEFCFE8DADBAC99A417CA0827F4983FF5BE656669F2B5F985FF6B16C44BBEA131D1FCC70FC53BF31EF225D1F5D41863B51B57EA65C6164F7531AE492EFA64161B7DABA3EF4586F3459BE8A962367DC276597B98E91FF594EFE8849BAD4CF91B9E5F244CF03CA9615BE128E96958533544A56E735994B92E4EF0D5FAB54B78EC66641C7463F225D261C144F00A0270741D7A511994833635A8A9B670CBFBEF239BF83327E247943B205DA68DB94E3F3 +k: 7545CC458E0A274A83B13554224F0BD01D57CC4775AD12468D3FEE5B08C93A6A + +c: 26CC4F22E035BC00687D557655C46B6E1C447ACB824204FEF7582EB8DBC704D7CE72B0A5FFE54FB89BD7B779B5B1DD1573010B227473FDEFFFB74DF7DCC1E6B48B554563C6C23004AE2CB1996943821F480E91081F1A6765E08A8AAB7F203E95DEEA49A1129A676DCB21540D2AAE1B21223DDDF1453150483176F3EA3580CE631FC85508690D8DDCBC9513A4A5951A440232223FB2ED9E0E5A8ACFEE113D22548B8E98131EE1F45A33656F079870A146F12819BFDDF8792C3C9AC3BBEA3A92B8606FF2B7296DB9D9782C8E788AF4C961840041735DE456A35E5536D861CA118D67408E84D8BB9128B65F2C11C7147EAC928599979EF195A7979CFC48277CF1FDF4B0CAAEB3F8A172A3CA25A3A8C39AAB4495A70E0AFD3861C41A8C01FAD1E9D81281CAE1C33572BA4BCA9A5294000FFD040545B021AF583F56434ACCD4CB7B788517243B09737D355ECE53273FC0C492F251FA02E47EA846121DFF00CBF2767D4DEB25F705591D26FB1B6F839A58EBA4572745A618CB2EBE02CC0CB1C62AA9F0EFB794C385BC47E440BEB38BA742C7357A97CF33098E2EA4D823BD0B9699FB1EBFA806D64FAB18E106D4A97B23A889355C7A2635A9D3BB330A1B8EE5E707DC32C20CACFED68C8DE783562488A64400A4528EF568D833D73E456A9AC22431B2C22441EF5BCE3E77CCEC99D2D1C092ED8A28D686214313F683D4A020FA714459C36A257DDFF7B19B7ED05A16FCACA2570279A11E1439D07F2F23B88411404749C37836585182F31AD65CFEADCFEC3FA905CD4BFE2B6ECAE99D469F3EFC55615D45D19360EBB7C68C73ABD4562EEDA283776C887E70A971176DDC10FC399EAD6B9E247353C25289C0836C626E5376326FE5630C3098436556D61F5C75DA6057008A6E1D50B4F270FCB86F868D5F235428B4D7E13010D20175D4CF0759F56422CF955A721792DEB8EC887E5225F6E52CDFF40B8BD3FEE4DEBC7B363574FD1F3CC113A3B4281F4E8DC3AEBE4B67500ACB50B5DB1BB64F0634B19D4612F597DE2B4CAEEE8A3258DDF8436ACADF3677B46E7E5CF41071DEAD3FBCE2A73388E19AC0C7748E10E3F586E2EB844ADFC079EC0A2CD8C9BAC8E859460DCDAB688AAAA179882B91111A604F75198F55B17C79AD4BE3FDB493B59775ED449BF938B594D87A1C9F721D1C39868591496E62BDBF5CC2947DD81B65ED8CA0BAF0A64E924B5F4FFA88BE86C3594EA7472B822D2D84CDBFC7A2C5039FEC6EBB14FAE2D5D7E9CAF1C2B8788E7354BB6A12C4EA1ABDF0811417586F01553AFD9D8B1EA233066023BC45FA4BC064E7D289AE9DDAF1F985E4BAA86C55BA1F1866E010C55E166C3AA29A682A81195819B7165DF6CC72045D143135EDABA08ACF9DD9FCB8CE732F9CDF1A99C772A2EDAB78647132C33B80E7F03C84A044491B311BC6F3571E7935C6EDFB283BC59F29DD5CCFF9DD6A9640139B173E64F2755F6BBD977F15AF1524827DCE4C2FDF1EBB7C35F0F34800E5A07FC83821FA6CD41695B322F0909D55251372DB8B3CB147FBBF6264BF764B1A20BFA41EFB84D109D4E374564C760AAB66EE823970EE7BFC1D9DB860840BC4767E4A46F1855526A7D902D4FA954C7F337C7C1205FD4AAA70D7F5D904F1D0CF1DBFB63675991B26B590260714920A7249E75D21199D8C002BD702C5398C45A359965D367FA15A73B83197DB3BF3AE9E987479CD81283419E557F993884EA4F17996CCA39FBA8941EDD70FC86E3A46C84C656F77E9DFA5DB31D8761A8FC1D5A2FE9C1CF67DDA1408A212951A5A1D5E9260BF367FD824ECBE8534AA5C63F3E9E2EE4EC53CB42663A79706088A846614B10EDB58B45BF063ACEF64DBB5ED8808588B51A80EC327B95DB34A2107FA96776F1DD0340C7918D0B846883EED35F5730D67165D4A51DC50533458F045E1266CE5C1CA6A30D931DA81732A876987482F2DB58694C574731E92CE6F9083A5EAD8143F244A8DF04C6DE1B2B07ED86D5593CAFC2A7B3E819C03C70B7B32AC0D576AC2E2E5843A39E4D36EFACBCE679307A1998F9C9DED50BF39CD29A529A82F26B5B4538F9CBBD547B9E4D5F7F31B555A8FCA1F9ABDEF3483640DE77D558735C15A588D944F9D76B06E417B1DA873F38A21321CDACE8D4BDDC49EBA4165D40820BA19A437D65B337B8C037041631D09F8ADD1400524F4A3BC33F9213AC7926548B9C43A4BC0148807D9 +k: 1A9EC19662B68932E5DE4EED9C3F16A4AA8E6E4129F8EFC2E9C7F0B6E82E3327 + +c: B36564F2BBECFE4DD315E84612BD765E3F2E84F5D8D86FC0708F72FCAF284A0850708CE6E11D0BE154C00F930D18C0A8D8071B612556238A64B679A083B2FC1A204079EE19A4095E71E0EED695B3CA764F4F4E5D7366430A8933F0356DB074C2D68048E046481E5481E4F5A2F365EA9C4C7A6BEA51CDBF1BF31366F863327126DDD101F8220034FB4A3C68232C5CC84229EB1E35F19AC2016A8E4805A87797F940B72A472F129FF5B751964AEEC96847B0BCA5D7F391CA9053380DE83CBC31F341599FEFE36A1CD83B30A1B7CB588874CCC5F443F73ADFA2CE7E7271A5726272A7E5FC721E85D9755D672F5B2A0EAC8065D2C3835B7F0B2F7C77A27AAC438E345BAA378A572AA676632434737FA59A7E197135BD6AF2619A828AAC865D7F34AFB771BB55B5B7E93B9489AE98C694EAA26C6A86F41D0C53522DA4D90F2AB267675BABFBE963C4C68534A24D1EAEA2BE97702E28CABE5FD080DA6B3C432EB0E55F9FE8C1C0422A44F57002A1F96E6D53E8AB9539E909346D150082DF69F54D27017B9A7633B7BD9F7E6274B1F97D7CB4BF5FC2E34E77ECA1317E7854304C75C388CCD1386C694E93CADC856E136C2C0EE7E113A125C79443C5D1A80A9698BF58248B0903A45961603D1EA0E89E3C0650EA3E82368A6C477CCD1B0180542401BB1DE70E25F64A5DE41D62D0467353EE488E1F692EB60778452B53088473B084D0819B725268AAE752FC8CB56384C7AF9D319CAAEC958FC3EAEF57E0F35F1BFE1BABAA2C64A2D9813EE16F22A94C1C00B29EE82F11C47224A9C5424E647B9883918C9CF2CAF51B7FA825121C5D13ECEB5F66E4EA11526E0C37DBCD464C5BA78A36A31A62B2DECC7DF51C24843EC2325C74A771A7D73D35BF2AC4578932A6C2A7323375A2B7679188CFE804E5EFF4A04B7E14F8851770048F076B32BA4F19F4530364C0529EC3FB2D0DDABDC85DE2257F4DF05686AB498FDBEAE3A1439627DD8885E4C8744156C2B155BD2F965AF0F2017F163A6016C274E8532CA43C784B7AD4747A58253EDFB739D68E376D7ED246E5474454F463F4212090DF4F4D7F88C097B18180B05F2E89EEBB834B9BB6DD9E5F6036ECDD5908CA4962609C208A557A36B7FBC72158A6D86322F4303434F6AFFB34527E47E0599DDC88EAD31814646A81188E79E1B6D562E01FE1EF148FE8825758CFA5BD7B738E3BECDDDCA4C59093CA24581E531667DBA2C295B565951445E410FBC99D795887BD48AB87D6D413B64957993CD7525A0A0A5D393CA1EDF7788E4DFACDFA7B394B6163BB948C9C6779BDDCC8F26BC073BEAD0FC87236704A0DC0D89DEB4F8174E91D249C4DCD9260BC7C86CFB35B985813E1689D83083949927303741550CB782E256E79800F41B5C7D981D68E60978E5190A2C51C812DCC3952AA34212625834B2F8CF8CE8019AD6CE8F00FF910CCCF0CAF5A3596AF8DF947EFDE954F361665458F77787E528937BC52C59950746C783D8C5216570E6F0A944E6BD661F23C7A9AF3C602DF851EA2E5627186A6CCBCC470E07B290E4F754D5A8D6BAD8C34F39B4BA838CB467681B0173C33FA51ABE122BAE3DC06660950CFA5C228CDBA2F5EEF2613D2850DF9B5FEBE7333BE93F90E4DEE219AD18425DEE4006FA3009666C83DF7EDFB2EA4F99902C694248F9D51C7B6FBE53780EB218732C11368C33449D051489FDB01B1A1064FB06DED747ADE38F7A12DCDAA92D64DB4C2C43DFE53068A77339E1479C8C93192793B1C752FA7FB23B57DB5B428622D27CBF608CD7406FDB543FF3BD26FD7ED7269427C6B93491BE6724D071F58AF434FDAD2F0FAD5730A60F3EEF94C59CBC5884F36274C4CD984303EEAAD17E1785914DC804BBAF35406995E3D56094F0FDD71C7650A6C37393C0EF4C167CD2FBC28EB4EDD34B5383CA3D1B89D7BADB0270065B5AE2D461E6DEE53291230ED3CC3B616A7E8A86A4265A98C10A44066301470BBCDB257F35489BA5DCA320A390AF23CEF6ABA8B291538D9C4E965969087E394EDA44C060E28220BF72AB98F1C055159892DFF079D283C52997DCFDC2FD8291FFDF322809BE3CDC113DE9D495EA5F9FA5DDE5052192CA6F26BD510433B197131A7E954AEC5E58F0A341D7E4602BAE46BB1987B5C1D845E6AE5569DC2AFE0C7984DDD9B0B184CD6ABC0AADF5E13E0F110E8876D572200DD837FEF193278119B861C196C7522 +k: F098B5187D66F9687666207379D9A52532C38C0396F917827BE99222D0BE8762 + +c: 4B30E5256A941008BAD9BD14060445AD208769EDEA1C5B6E4ED506FB334A2378520B5EDC9217D626E1377839A18F2D21C0CC8902622E4AB79E83DEC449FFFD45A4CBF3AC253142D935DD310B5E4C5D591A9BD61795F8ABF00AA04EBAF96195B6CC7D7C3910FD7D75E25A9D0D79FA453178B06FC6B1E99F189CDA90276D6B69FBEA28D68CC82707A46CBEAB819239BE69BA76D749E27CAC9E5FFE88064B9972DB77C49679D6DDC6E6B03DAA0DDF0106B1A61141DF827E96AC542DC90A69CB316EB4F78C611C0155F9138F527006121DA16DB46531ADEC2FF599378A819CFBE3B079C9FE7E368B91A9E40F97A3E79A4F1F05574CE2AC3A525C206D9E55CE16D42D2F0F4863F896E808FE168B34A102BB81BD607BD02CCFFBA5C189497502A55F3E601F8F61B40A5202BAF9AC87D058E67B9E1CDEA0E4B02FF2DEED7477609A9AE2116512C42079D87AD74B05622E02979EF0A0F1D6375D93576EB6553FB1AC70ABDACBFBDB18735E949EC6D1667E978547A5CEAF2F4DCA6FF5D8346A960CE6925BF2B3F316238D6BC8ACBE67BC1AACD5A9A5D130A3D3B39C3BD7C1B06227A59BF4723AE9656D9922D9228A3404D4856E39702DFDC01C6E8CB6000E0779364BAD4F021BCFD7288CE7049D544E8423B2890C3083FDDB9BC720AC4C6A1A4EEA6BA1927B307E6CB72131B6B831AAD036A50A54608D106EDACD83EBDF104AA80C917314D295E903FDF36CD04EB786CF93AFF1279C2172002F7EE92DFAB3A99BF42C2BE7B7D0EDDD38029AB5AE18F5CFF8A2F1D2EA2EC7F34770FBA8A8BEEB0E1FF6F1C1A036F1BD84030004696BF4FB4161F252436C0401AEC911CBF1D7530D9D801B1B9B3A682329AE2F6930191E48189CD40706256B864D6F016597B4AA86FEE4F0E2362D8BCC743E98531EB2B335DE2DD299F231FAA808F6BC7D8F13DE8EAA30C5698D64E508D3534935B9941C2E40A458BEA82DAE4151ECF6DCD40320E1009BD9FBEE248F4EB6DB4437482BDFD83FDAF8367CC1845E64A23A310F904D5FAAD67241AA7748764C26EC881788D1EE0A39944071E5ACB656AB8CEA285C282545030EBBE6FB595E296E1EA37D7AE529B96CAECED11331D80C92D3DACDD7DC93237D815A9C6CEB9209C0BF3548ED1AD691929B2C1035E80A21477747E313049DEAD43A40B0960A96BF3C3E9BADEBC3B4D424FE7DC4DE5CE7788E31AEA3EC8965740D424CEB66D4A5678260051BFEFF09A3CB24C1AB7782AFBFEDE5EE1ED4EB14AD2A13142E8201CD1B52CE064F05ACFB019E21A73D84A80E30FAA48ABEFECA970BBF17FFA6F3A90AEF80EFA31C494E721231289143416AB9621737FC016380E6079EC6CD962BF7CC0750582EB218F869CE117D399DEF9AA66F7D2F07FD22BEB9E50B94CA5FC758C9DD4D2984A156748C52307731FC78F8539F8264BAD6DD56C0C23937A9A850E66BA298C3D39105ECACA9A573D887C9A4FE33D487F2126097B165594E1F8106C937758AB6EE75EDF39D2BCDE78AB611A034A72FDBEE67A80F3315571AB4DB94C56A19EFB63B8E7708566412F73D4974B160183FB5B6C44C8CED990B29C57BBEEAC5EABDCB11CCED9A17322B6EF197121B4094D7EA4A1B4EC44A68B447FE4C8119A6A33BFB66EA6844DB5B6094119AD1DE89449DE922B9A0D1253EA18C62418EB87330C6B33EEE02D4486F62A4D31CA24F098BE2F187CA6019025AD6E1C2FE69800D8BFA2C646F9FC6BCB3D369A78310084FF163D2065631C41748E7E3B25E8F2C9EDA2E107AA2046FE3F5DCC0A9A39FCE41813C8F1946C3AC07A22A6A56C4AFC626E68FF8CBC4982C1E60C3A9F288D1C4F2B8D7187EF2FAE30B77C4DD73499C2B3793B24014CFFEF6D80063DD1C1F3AC7F14FB61E5E81F850AB865BA873404BEB898FF7A2DCFA3B955DDB161B5781AFE8EF127BA2C8BFDBC2FB1C7D80FC650420214314023F6F65C17FC48927BBAE88D48D2E1976119C2F8310232942DD4C3AD4518D1E4DA9DD588691837122F5E5DE0FF1FA685DE134DFD1348CE3B5BE60B18BBF474074829E7D81AE087F149259122D47B728F369D1D8455EE571F715788C254F2EF438034BFF0A11F2F008E19B370BBEEE135A00DBE7F3C2970208F5F5D0E2765C395CA81B2FD80FC384AD046564229C759315B6CFFAD03A56996556E7714DABDE28F7A9BB5DE2C05B1F3596AF66C747D9A9313673F19AD4BAC6EAA7 +k: FBC9EB4E8D611C153AA9ADCAEE5781DA5C0112B3AB75956180A5CA40BFA0F53E + +c: CA9564B54F15561C8238E6CFD88137EBD4D277FD5D64BAFC33D6E575947F0FF9F93E3B0A4023DDB6FE480D7D6A2B9ABCD6E6E011EF37C0699A6D60D9AB4B05BC685B0A9AF7D3BD999C7AC1CDF017E6AF1DCF0313759CBB21539D7774C31D7ED8C039AC34D0C6A5F7590A3DFE193D73FA96B3458A364DE1555284D85A2BAE7BA9E57ABA00134E6B09C09777F2F1D7125AF858D81D14C71E34E8F668468997334B72E002920FD3FAD8D588355343FA949F1CC0BC263C7F7A7FEA6AD708DB756AF983B16A593EC224F7D69208938A4526400E326CBED532A777301DDEB5E539CFCE60DB8A022AFC52204C71710C204968FD1457919EB71CA15522AD56ED6B60404D62D1DAD0D06E4A2AD6BC746B28859A77226B774BF56BF7F019F2837F51509E9EBE9EB069DA27401CD1D7BF2A74CBE8341A7F213D061619F4E5F52984FE47066D910F1146CCD8DB48210FA2518D6B9FADFF16ED9D389292C07C8A7021F32BCD538AB06A6D5ADB13D7A96F65A4062A17E26B301CC8AD420732126D7CB801DD489AFF2D717D07A2748B4B01D162D228D5F1533CD5FEE8DFF8F032DFB270B61095785E44CEBBD4EA27158362D2A27582CE78594D4D7428B6AD958A9F1604EBA76A8CC0530E1001AC97E5ACC5EE670D5DC6A78AA45300A2BD5F0802CDEE564FA640A19FB554383A4E4CCF2E5BB3A41879C9428CBDB8DE1F4D3FDEFC18C2A8BAE42C096244279E57B307614C843B341BCCF530F6B187121DD83A9A160A3579C3188A98FE2F49A85A2705B9F76DEF04D5D04676D8319F243DFC99A5F90771B34D2A45EFF92C0CA8E4B542B8ED4C2AFBC92C26F8DD20B26B15F9E719AF22F571EE5B9573D5BD1931138D6315C5104BF80AECF830548E98AB23DFA44E5A23C6CF57740926D1E146937AF8D220684919FD89082E260286AB66F66F8A1B81BEE07A85907D07FCCFB9A1002CDD47A33535C9FC0938E3CDDED04D3FABE6326CBF5643373BAE1151704220E49E177C4D0C6168647E5976670DB7F6D0C12F169955E31F553A53A76093DA2A9A0C589F9AFDCCAAD9EC5449ACC01E12A70BCEB389AC104407415782AF2EA3C73D9EB2797CE6D3C005061C5059AB625DD7D273D4D92D1F4EB411A4033492F19921F60D0317AF286866B865E33B6235F0E3528228CF9DB242124F0A6375D50CAB3851DD2A3A022C1E636E332C90D97FBBFC2CF0B971AB1A89014BC2D942FDF015555431ACB3E7A6F258B816BA84892A1DFE3780A0E0C2E6C06149218E70D60D62573BB51856716C0DDA63A983C4008982E842E655E5767DD203DB3490E1E6BDBEC16350296D879F017BA695FC1CB3BBE516B741A67CA6CE09314AE27F718DF68DE698198289B457884FFF1E439F30D9117D19ED7E466084BD5A73E26B5E1567B148D4C7ACD1368B1CE2709B3AF233679E61914202D0DCFC81EF3ACC250DCEA602103C7E529FD6F31A186927E790E3DEE09DCE87DF694ADA7A3B7BB3BEC64456EE983E25DC6CA1CBCD752D72ABE6FDA2FC81A46F81E83AA9738D528C6FA3E69C453346D0C9A0734DF36BB7650D1D2AFA8A5C4C5A936D41258BD4193DA74FFB180CFF582A32D6F6ACB93836E009E8C880592BE61532215F1F6FA50E8FFBB82208A94D8510F70DC6633DC04F9D94C6AC46EDDD4EB36873E064CBBE65D343957CA7B75024EEBB56F589C3DD2253D68D12DC892ABB1FA4BF033B9B732E89A8B89541F04C6462F62F13B09C6705B31036294F1AC38EDC0C2298D7C6F4374C3B5C368D10DA8D371383CBFB4491126A83D1F75DF44F29BCD39349A9BF6526D14B339FCB440647A5FAB63A370089DF162DDBCEAC8966648DDAD6669E1EADC1C8A33E9B7378693E229C6B715F2F0AE54A67455E79FF8970F23E655E7A540D28958E2E102DC99B5CE5772D00831671CC6F7024BBAE8B04173E439054C96AB3BE918C40C5A8D42A9122CA29C56044D340420D2EAAEB738EEF70331D488169FE91B521835297D7326CA272B2614144EAA0B7A75CC7F3849138255B8A1D7DB875BC7C25D28EE5941DE89BF7B063046CA0CFF31A99D7B1846E01B519137B67647F024B3F6DC70045B6950EC6ADBD68F43F67464858D515D6E3EC5F99D9F1C849831BEB4224FEDB01236712E1D715F6A752D0682169A0E83F064FD6F081F338837FE654BCE7C8CAAA8CA90C8505945D9BB3EA58661102FF0ED3F0DE30C4013122D8CF08E0 +k: D970209BBE4676405E1CF15D053A04F93D800AF1B32EAEB1E4B644ED09ADE8E8 + +c: C18D7D95DB69D4FE1E6DB385024D83C01F4790E2BFD25DB3F5DD5A208ABE06551BE0936A84091F081308471E82AC9ED6BAA90824D5525701AE0B638003C21D5EBBCBC17FCA8F522BE4F9FE5ECF38BB66131578163D50994E532D0776B187498C5A85AFF617D4550345F3855F968A8964B4F3CACCFFEC82C92BC8617C78C98E10C91AB505A92CEFE0AD6C8B66406AEA4C3FBC5275047B3E983AD42BCD31838A39B92E1C61E9E62443DF3A45044819D9E289B5514D4F74E08FC3914C0B66D2352CF8B1FABB4AC9B0748A43547BECD29D447D01083803D34E8B7EC89B4F0D78B88AEB33E308989BED2D7A78E1C06A11F3BE808F0B9D9712C80D63DA10475849DDF6CB0DBB1007FCDEDCA3C4220386B78D9EC6E380B4F57731D964470B42CF7D4B4E6D98A12A9021121C8BACC4B132A274941DA57D824FCB60B83565F5CE05D140653DD4C70F385B55D485D24935F3631AC63FA12FF50BCF4E431EE4074B2A05A2A97354C7B4169B13EB225F1727F8424F7CA6317A04C355FE785248E67E053C4D4BDBBC47DC7760AC71DFA2502FBAD1180F2B095425198A26BD5A0F7DFAB70524B8F076E7C7F215B0536B0023F8A9F7784809FF4DA245C2EAC5F9E0AB85D987C5B6FEBDB3DF197347BDFB8D5F1547FD2A59D4B434FA7ECF8D8535903D3892868BA0632F194AD6E4D5A3B30E5A6B92F829642DD4A3031358F9F0D9D46530602A35CE455F0E360C14A754828972D85561AA835D87275AC510856D26192EA319FEB45709346929DA5C5919510CB2A482CBB0F1CB4BF6FCC0343F6DBDFDE734919EF335356ABE82F80786EF0CA22E5B03A05963E7051E1FA7EA4BC3141B5746D264BE1A32CCCD39DFF8F9E5E2AB4C5F51CEFEDE3C1CD118351F9A8ED30649D407FD31F6C4BDA3AF44888ADFC3D118BBD04412FF810A7E106EC32F7524E4750DC5F35A9C55541421B5E412E57BAF24622627F02633F524FF854F71011580598C5CE01190258310BB12D7DB5F95E9EBE5F72C97E89287C2F9007A9332EC51DEF1AA2F2CADA9A8A547C3508B4D294364EAFC858B98C60C5469CC7C3CE3ED659B5A54E889FEFAF825FC777AA74A8896C9447704CA7300FC5DF5810681E3ABE083C1285B3B97EFB0E21F78F45409D00B2E1680DA79439734190AFF0D68E062970F8F6B0F1E84A559B09ACD9938913FC26484DF2125FB6D7FC2E3F0DCBD72D9E5DEDBE7E44CE7D895CC9CF6945BDE0C52F92340F9FAD3009BC90D4C2D3DEF7C1F10A862F9D71681537FE4E2716912DAAB8C9DCBD81A083220F68B05F7502F3911B1B6E3B26DA14EF646DCE67852FAB6145BBE7E21725C21CBB2849C63D01AEAD932F8EE9345D8666786AF06AD0C89B08495A6EA95992301E2D8B6A14426971C7B31626BC93BBE76CF3DB9487B5BFC5BAF298F1A92FC3BE276983E53701F9A550E2961E6E2F07317381364719BF3FC741E2A5A0664D8873120D0C11287E92DB12126332D43F35407C01F7F85DF7916B651EE4A30D602E71227733EC9252EC8346361DEFC23397CEAD0C23AF44C77A4C97242C7FA9065BF0C81983AF3E516C1B8FFF3DD5A6C43B6ED5AD8BB3327A09B6B459168F3E497DCB65FE7593E8AB429B8EB2B31F76DF08A6A8F35EC4CA994037493A8C04A73D8191D682542FCBE16E657D3E477A7D25A1D650450E94FAF485CB76FE7110BAA902D74C335FEE1546D076163B5540D8495E16E909E1D28C15BFB421756B921778A784E16207BAD407B64B9CD83AFB0A602374DE06F5C836F4A1ADFD495012DA8D3FA4B829F735B31BAA6364A2AC11BD18E40628DCF82238D86B0B5EE9DF6D179103E1D12F5191475FE3008A5382CC24648CBB24F2298758823B7F93DF10B380C3179F07DC3277021E9EEA2BE5CED646260165B57A18C26E259F83576938828D4C7617623006682CAA613AAB770791874B55E2D0BB32DDB628919B42C09BB7DAE1FBEE8661CC13F8B6A47CF5D6085A2AED796E305738B508599673DCD03AFC267023814FB1DF7EB928D5762BBAB4515921D81C6CAF551DC6EA16C1D31125B99299ADE63FBFB9BC1CE46331394CE472DE6DCEFB2BF9B3828B0110246419C47D2A1FEF16097B943A310C0664A92A155C8273402E83CB94D7E733E4527E7525E9BAB219B69676804C1F67088184038668D55AC4F6E04CEC0EED4B05DE649A9C2064F241AAF9732B09B0EE4E5BB2C0386E45FBD44 +k: B93CAB6CB4C636B56EDF0DDA556D2AF2622AE197B5AB78F95249204A6E2E824A + +c: E7B361D043C4A0B3A780121E9648DCF38DFC10ED5E47EE4DB5523C1EE1F53552640C89D9D7EFB9DFAA8EBAC7AF137A850AE41A0FF8F8CE31FDFD3E671555180EE46AB58322FE4E5F525146F9D4CDD1D1CA01413C5AC7259E1A2604A5951755F47D1761ED16B26D3DCFF79A263BC38852007BD3F381FC3B79B46A4B372918AF3117180726117BDB33C063BF5EE5D69CB48D267929CEDC890B743DEA43205EAD46FFA69D9B30C1AA5F146CBA3B0B7C4D4A50FA8D120777F1661430DA1B9D1C1DB4E10C5C3C2436D381EB13DDCC61EEB3F9AB46B60D2FB714929139E9C27F8730684EE17B077BDC003500027FAC94DA80870B382EFE41BAAD902A491C29DC95A8F80BB075A4E61C8F100FA738BED869B48F897ABC9CCE08917B5073229A94F3790947FC1AB6C2DEB5B012D60EC156A8A041DE151EED8884EC616089CB08EAEE37C006F5BBD10ACE9596A34FB09345A14FC4EA674E4A74699BA5240FF1282ED1E64360BDC9F7336051A33DD48809CF0011BEB3CE8C681588AB29F5F26175A8A6FD7884CB96CE3964FF10A67FC4A4E14CA516162C16D8127CBC45BCF7C88C89C8602032298B53C19FD099809814BE0504BCFD2407F48F2F24C5ACB89DB4F54A018DD586D871C58CC0D998FB4B0E5F5DAC631BE8367DDE88ED711F069FC8A80EBB573A7DA12AD8F13A4CA1E8A22D9EB53C55B80F700C58E6EADE6CDEB35C262EB42C903AD854F843547B79464524833A05E3FDC46092E41D8E339E7662D1209D338B8A02994D15A10439C1DC02A5B0EDEA58AF197866F43269A57C747DF389EC597F523211770E9C7E4CEFC5E43EEF791897EE43CA6146F3F757B66B9E7592E728565325D1740A1736CD0E678BBAA043F4C355FDE27094F74FAE27AD8C270930DF637C652BC1957F958DB013C146F2A4C5F451AB58A55C2B638A82755C11991B049E82F8D3CD3E7D3571FD5A83B60280E92031B610FADAC9E5F61DA469DC4C51381C970E03F09CA560E5D69D9B32AD6C1DDB6FBE9F8FC0551A909187AD65AFDC067EC6AA01AD684AE4C4F2E1F64046083D3EB347A6B6B23BBBF14668B9650D9364A6A7666593DB86FEB59628A91169F8AE24F67680789D316338B2F27766A83957831D98C88C837215AE3BD49767ADCADE758320ACE76D7F39E2970EDD19657F0EC12583164C325F0A000D065036BA2522F960C87F9852F30BC6BB5419CD8C0A1F9757BD358E748CB244A5E677AB9F9319A43A9BAC847A566052CA42C1C1DB36A0D97F144BED3BC5F11A5C8BEF7A74A4CC67748F1DF53F8B4714E0A04256B36A814B08B78A9737757E3F1347F9E5535DF1AC98B08ACC1409278B925F3B6C7863BC0969520FC6183E216B4E8E449B0FB999F1C65567AE2064774454EFDA67E1749FB24A91B55DFFE7DB75C4E24E8EF2389214EC3E95972CD53234CDAF8958D651A7A95802E65499A8A7811A65ABBA90129D5EC4247D8183316EF818E79BE839BB3379E4B8F4EE9438BFE310105C91F8703AE94D8F9D53096E2341E74E0237DB2665F16954B9713DD9638B05970A9A96261586B04F9FF369028DCC43D35B51F95E69B0323A1CEACC4A5E2EF640CDAF3407BF5F5E14C9042FF299786BC55965EB7C8BB161487FCD7911BDC2FBB65100F2200E16C690F801EA6615F9130EB99DF816B188B06E9A3105B78212B76609DF190FF102CCC451746CBAD16464E8E2F647B75777F664DE86F5089C37E3A54A6AA8B456CB98B42DEB5529C06DA45C2D2A13060BE56A061CE210ECD307FF5AD5BE39CDD8D27B4A3403323D4F53BE35FB4E31670F73CCE74CF73CFBB29A5FC2EECB5F852CA911942066D826404B77251BE5BC5980D0A6E0DB4D753D86490D4250536DACF05D82064A28324B49AD4AD202CD0FC939BB7A3CD9FB1E3E196348EF336DCDBE4BC831DF5847070D0B2BE1C4910FE1C69F58C6A7A2E7FEBD51BE1D0E050D5D721D7537A0325E7ED30AECA75A2A81BBD86EBF91CAFE4483D2729271ABDBB65C2CD9973627D2820DC7ADE3E26CA2F466EB117B2BA98EC868DC728ABC6907D49E2495504133FAA7F8758FD23076D1A65A91C75512F89EE4E2F3E480D6ECB0EE90793F4F93FFB75DF58A7072C91D5A1D9EF0C3B1DDAE79EF576E6A276F78CDC24664897F07B3A20691601EAD2F499C50589BDBCEC74FCADED1A8AFDFC061C2712ED599D48A3ACB3D86515D664D0CF3FA349A1910CB +k: 2E85AE4441DB0930391278E9D6920D9AC77D6C752DB2628CBFE9D76228DDC954 + +c: EDD3FAB8AEB1240FB31B836CD1603E1F904BD1F87318DCB02A7DE18B4044385CDB51E343787E583CB043EE23899658420F9DEDB23CAB2BCD1013F573C0C7978521596631F6590105CB7B281AB1591B7056BE068DF838E0B1679F3B88D95208EF4B3019625EEA7704CE79F33AF339AB883B0C48B3C4413921F43AF2515A85023B5D98D06E619238C8D033FB7DD19611CC60CF395A03B0681913B299531B13728B278D353FA093C633710B65000772DD6D7CA59C85DB62196DCCE1B75559ECD3FB42DDD8E57EB4CF3B4E35B57EA3D6063221B81F1B802DD7D76DE308CB0A738C3B5833E9F4427AF3C3D79B521E7E665B052B9A365DCDFE5A688B06EDCDFA2143C938F852E32D6B49808CFFD01A8655B767034F8C638E8AF94BF3EB9EA39AED1D2D22E181888DD608BF9392FD73822303A41996F41D51A924FA6EF76A9C82709A21BEF1DD004693EC9468B335F9BD1FD94D5E6D89D570FC6D23B7F5CAD2975F418B8C4A0EB82EA2A3C979B1C15B0FB0A23F844764DDD49A8B89C0D4BC8C311BB43725EE9BAACC4796F58C0F1180A4F6AFEF45178659B35A74FF34A8E93A64FA4CD003269EC67C5BD528E015B2311B5E2D33472638CD65FC7D5127335EDA862BDEA05F4290EF9B370BE69DC89E7D71DD2522E669700D5D02D8DCD75FE2AD9EDC307225D61C7805CE1EBBC806A08BD360F86FD27B599582B22C57DDE77B08F7537482FB5D75BDB9F3F4EA07DFB0711C25AD1950058EAAA2E17D8F676BE6B72B1687383D8E0DD60A8277F6FDA202D6F8957EE21308AE81ABF72A89924DB44238B262D2FCE733E12E5413C31FDEF94860D5BB0FB0AEDCB1EFA8F87CCC76189FA5D8157FB4FB14652DC188157B2B746B596FE6F2FEB197DE139B80922C2EC14B58E743E3335893ABF85B99BC4566FA1BEED449658C5993CD08BF78F7DBFF808F611D6EB8F0BD7977E854BC195D711C03EA532403547B6ABEAE827481BB5D53C867710215835260097B6CA730FC722A74E230434B08F38EB1ABAF555CD4CC6CB9310E32F93E0ACAC1E915A4B57E0774B013BE7DD435B5C6AF6018944349841F84E8C28260149F266C99FC05E0DB8D5A63DE362CDE45F5BDFB6F30D55A84ACA22E8640A1287DA51714F2C8D4B184A5F671E0E907134E34D875C9A4709ECE3B7FE15713A0DD972505298C18A9D35956149EC9AF45C475016D7C8B5CBFFE2108882B86FFD380A79892BA1909489E016CF9933705E2FA72ACC8569501553401C397648DC47948935C0197D6F162464DE42BA537611CCB67A988030ABF6081946FDD1ED8C6B23691EA160E8543735894839F13C270B3E1F68607A7EECE09AF06A34F4FC9096D4EFFE4905BE56F3EB397C13472F6621F3EE45A59C8001ABF9302E036BEDEB2E0EC92A03FFE0DF52262621728C6791C4E7D8C226D17A04B6E7EB2FF8586585D639B449C85224EEC67E30537ABE85C8F7E2306DB80E968D8585CED3A9E21622BBC38D43A7D79E2457C67307CC208064D3568C476ED79359CD0A4B0BECA02FA702661056E187A51C2D154638F9000DF856ABB82CFE12C47543E46FFDBADD2DC69EBB3FF444E7E1E95235541015E6CC7A0429C82EBD6942C6420AD598C08080DCEC800509C142ED5A642951F491E748B5436148B90ACCBEC35D0D85FAF4E472ED3F1A089113808D3ECDF77EEF3E089FA5A1635B90EF99034AAA49D4D13058EAA5A8797E37C59CEB86C7CCFE1F574E1086DB9BE744BDE5067AD5D6C450FADFF2338DB110736FBBD86B41B29C29D3899CE60E9BEDF775416541350AAA9BD9B5D57573C542375BB0297912863C86AAE39D153CCB29F1811CDE58978951CE8EEFA6F9D10121AD1FB89F02AF8E96AC08DD10E3274E8CA79D910667166797468D3D3BD6D7EF5F2C6FC4F110268A2716CB273F29BBC347050BD98BDD88F30A96E7A9E840A55087F42A09B03D04E612640BA4D86BE87DA6D20ED0ECCCA2523EE7C4E9D2A96E7378BF71308850832769417EB6250FC768B0EDF92FD45216A235435A3E32AE5B22BF913027D81B0D5508D2AF88120A50206DD7837B79C45B21DB4FE59D23F4AB051BF012B13F6EE5B34C83C8D8CC9BB35266D0EF3834F52CE6CC5BCB7C5989198465A9E9DEE1A1F262FAB26FE0D0964E624869DF2607858815418F85A1F503BE5217794CED29D02E19D40C4BC8E65C46FE3815C1E548976649D4332B1841EA03022 +k: 5CDD11E1565AF6FBC0DC373651C6F2DC833EBBC54FC0FE2855C0C19EFDD6D877 + +c: C72FA15560FEE6B014E73F5F93C307F74EF9C49AA8F7DF578C002AF20419040D6AB6AC46F78FB03F56A9C5C95902D8CBCE34D79853EDF0C319AF5469E32D0B9FC3C41628970E0B3A6C408B509C74DFA218BD23FA7A11DEA2D2277B3522BEF6606E3415D0DD51556440CC1AF59CAE6F23368BCAC3E1509503368354D1E3EC9E91F8B2D377DCC323D578DEB222585E43F97A6D1855B576297F3EC39F5F9EA1B2F72A0E701DB35D633DBCC5FFF76A2D39AE9DF2A3F6326B7671A4C0BB7177897DFF4FAF9FE5CFBCC94966BD298EA2627CF19C1CA866E5927C6E41970F544479D9A6D814AB72E2963F959CBEF37BF905BE98D8C8F3C25FAD3983F71D0C0D27D9FF17E4B34C2F8664406151E92ECA980F6CBE8F8926638398C9BCE9C69A92A30CE82F28CB4FE4110EAC40437BD64D38412030FB8DB3A4242672807737E707E59A0ACFA782127EFCB7BCEC39DFEC55C3109F958E86E0D381C4E9E9FE43110517778C08A140CF440F209011768EE34E5742ECC1E4CED045922D698A29E5557A29C237885D8559F110E4B540FE1298B97920EDF59BC8EBCA11EB91F471B6647864B384AE5A6BB494942BB1F537301B39EDD6F664E4A7877C173614B09D981401D5AA98A8BA4BF1992DD7B7A65BCE7E87FCDFC7B29AB69ADDC9036D71BB9BC08F4E7D9A57B784911CEE7D0EE5A559332981B6475290FB4410D8BA1F00FFC4850031708EB6A83AF524447F491CC25F23FBED71476FBA5C64BCD50D88A3ACD2BE1DF461B11F6D537B2929D073FCFB9E2545E1B097A12F52C411B2AF6C20A27ECD1C084568F4A76A87A4A79F7711012CBEDA777D913CC6B15E6C4E9BCE2C773991946CB9CEFB7F105B15FD2CD3E721E6C1DF69B66BEDF2157ACAD45458FD8C9C1AF910394A13C300696BBBB5B1E1145076BC6B9E3D30A680EA29B6370618B47AF77108EDE6BFCEBFBCFEDDD27FD9F0DA6D289060095C4E309DC3D26DCBFB9E8AF34E12BDD335FAC434663D4D802C8B04AC884352D27739C4DF22F3D7DB38084BAE2C0A15485DF4E356DF2FFBB5BBACA78D0B4886909C4482A6366991776B788C0941437BF858DD83AAA50104D725171C09B7DB521AA65CCCA3CDAFB2E61CDEF66B55D80E201DF44654E7B1FFCA29EFC1E44A8CBA406C8DAC6207C0BD5DA964FBE137ACCD84405A94F5F51D82CE701DD16774BA5F0A7A2BED7F9BB9A4F25C3095D1F8980721A7ECBCE957825A9BE9F4F818E56D35909A3F9DE5487DA0011EBCF9F4D768B72D236042175ED599D731AAFCD45D3D837FB8B64304ED7F22A8C3949BFA25B83A8C05FE9748F63A38201B460E16FFE4329C8464C9BF07D45DF2BA9AE7A84DCFC4CAB7BE42CBD360F61051CD56F68A71FE9E78231986832C9564D02B973EA2D3FCDBAEC374612C1B74DD483F08BAC30F6C9306E7092CC8FE1D20B937AFA4BC605ED4398A8B81A470870E97EA7D51562111D04BF9D09D9BC07533FCDA1E8DA2F2823AD621DB169C99FB112E44FDEFD597B61160815A1776139B685DA9DF6B4C22F6FF6CA3CC46B3264E456E98FF1F301122C88D42928403ED0E0E5F49BB0B450429980ACEFA1A80DA26638B5D2310FCADB0836223CB0894E6FA014D351AE052A70AB5F515641F153509FFB90B8DE495B946AB8C7D7CFEF56D3C66DC871F1D3A38494EF6AB82066E96B9F2782D6B5931B78B7117C389D155759CBC1690897DA66E50D0865209887552C8A6035B8F6911760F8D0A450FB926096721D962877FBFD87D92C37C71836B8BB9FCE92B4637785DC8E8C1D379081C14C73872E676A1C854F1BB68649BD552B48D12F62B17E9A48CCAF63885899C7B781DC3A6D7DE7DA28E286C9FD644D3521F0320B7ECA8FD0AAFFFFF90DAEC85BA80868A2EC69CC73AE00AE29FF5BA37D94510CA19E1EDAA64F30CD79A58B42FC9A6402CE31AF54BAE84DFED8D0C76142A347542265B794A0AEF4A08B4B5DFCADBD56757ECD98F175D80B44121257964293F300FF750107C1B72463D4634EBEDF4705F76C908844763D0D6813FFBE5411FBBFE16C08F32BD1BB3FB8EA5C5339A1B0194DA543E64C1F8065CE526D2754EF95A287DDC97B790FF34EA37863BB166BF0BD99E3A961BC91C1A4F84B63700C9EF5D8D31CEC9E1AE33C554BE638D5C1217CD2DBA13CC143F969DCBF285407A9B608F859812E7F668D4538BE179D11ED767A6971A2AA9CBB545EA01998E +k: C751783FCA654B1FB5F210C6CAAAB9D5E46A969E546A0834D618A952DCCCF3E3 + diff --git a/regress/lib/libcrypto/mlkem/mlkem1024_nist_keygen_tests.txt b/regress/lib/libcrypto/mlkem/mlkem1024_nist_keygen_tests.txt new file mode 100644 index 000000000..8206e8ddb --- /dev/null +++ b/regress/lib/libcrypto/mlkem/mlkem1024_nist_keygen_tests.txt @@ -0,0 +1,125 @@ +z: 99E3246884181F8E1DD44E0C7629093330221FD67D9B7D6E1510B2DBAD8762F7 +d: 49AC8B99BB1E6A8EA818261F8BE68BDEAA52897E7EC6C40B530BC760AB77DCE3 +ek: A04184D4BC7B532A0F70A54D7757CDE6175A6843B861CB2BC4830C0012554CFC5D2C8A2027AA3CD967130E9B96241B11C4320C7649CC23A71BAFE691AFC08E680BCEF42907000718E4EACE8DA28214197BE1C269DA9CB541E1A3CE97CFADF9C6058780FE6793DBFA8218A2760B802B8DA2AA271A38772523A76736A7A31B9D3037AD21CEBB11A472B8792EB17558B940E70883F264592C689B240BB43D5408BF446432F412F4B9A5F6865CC252A43CF40A320391555591D67561FDD05353AB6B019B3A08A73353D51B6113AB2FA51D975648EE254AF89A230504A236A4658257740BDCBBE1708AB022C3C588A410DB3B9C308A06275BDF5B4859D3A2617A295E1A22F90198BAD0166F4A943417C5B831736CB2C8580ABFDE5714B586ABEEC0A175A08BC710C7A2895DE93AC438061BF7765D0D21CD418167CAF89D1EFC3448BCBB96D69B3E010C82D15CAB6CACC6799D3639669A5B21A633C865F8593B5B7BC800262BB837A924A6C5440E4FC73B41B23092C3912F4C6BEBB4C7B4C62908B03775666C22220DF9C88823E344C7308332345C8B795D34E8C051F21F5A21C214B69841358709B1C305B32CC2C3806AE9CCD3819FFF4507FE520FBFC27199BC23BE6B9B2D2AC1717579AC769279E2A7AAC68A371A47BA3A7DBE016F14E1A727333663C4A5CD1A0F8836CF7B5C49AC51485CA60345C990E06888720003731322C5B8CD5E6907FDA1157F468FD3FC20FA8175EEC95C291A262BA8C5BE990872418930852339D88A19B37FEFA3CFE82175C224407CA414BAEB37923B4D2D83134AE154E490A9B45A0563B06C953C3301450A2176A07C614A74E3478E48509F9A60AE945A8EBC7815121D90A3B0E07091A096CF02C57B25BCA58126AD0C629CE166A7EDB4B33221A0D3F72B85D562EC698B7D0A913D73806F1C5C87B38EC003CB303A3DC51B4B35356A67826D6EDAA8FEB93B98493B2D1C11B676A6AD9506A1AAAE13A824C7C08D1C6C2C4DBA9642C76EA7F6C8264B64A23CCCA9A74635FCBF03E00F1B5722B214376790793B2C4F0A13B5C40760B4218E1D2594DCB30A70D9C1782A5DD30576FA4144BFC8416EDA8118FC6472F56A979586F33BB070FB0F1B0B10BC4897EBE01BCA3893D4E16ADB25093A7417D0708C83A26322E22E6330091E30152BF823597C04CCF4CFC7331578F43A2726CCB428289A90C863259DD180C5FF142BEF41C7717094BE07856DA2B140FA67710967356AA47DFBC8D255B4722AB86D439B7E0A6090251D2D4C1ED5F20BBE6807BF65A90B7CB2EC0102AF02809DC9AC7D0A3ABC69C18365BCFF59185F33996887746185906C0191AED4407E139446459BE29C6822717644353D24AB6339156A9C424909F0A9025BB74720779BE43F16D81C8CC666E99710D8C68BB5CC4E12F314E925A551F09CC59003A1F88103C254BB978D75F394D3540E31E771CDA36E39EC54A62B5832664D821A72F1E6AFBBA27F84295B2694C498498E812BC8E9378FE541CEC5891B25062901CB7212E3CDC46179EC5BCEC10BC0B9311DE05074290687FD6A5392671654284CD9C8CC3EBA80EB3B662EB53EB75116704A1FEB5C2D056338532868DDF24EB8992AB8565D9E490CADF14804360DAA90718EAB616BAB0765D33987B47EFB6599C5563235E61E4BE670E97955AB292D9732CB8930948AC82DF230AC72297A23679D6B94C17F1359483254FEDC2F05819F0D069A443B78E3FC6C3EF4714B05A3FCA81CBBA60242A7060CD885D8F39981BB18092B23DAA59FD9578388688A09BBA079BC809A54843A60385E2310BBCBCC0213CE3DFAAB33B47F9D6305BC95C6107813C585C4B657BF30542833B14949F573C0612AD524BAAE69590C1277B86C286571BF66B3CFF46A3858C09906A794DF4A06E9D4B0A2E43F10F72A6C6C47E5646E2C799B71C33ED2F01EEB45938EB7A4E2E2908C53558A540D350369FA189C616943F7981D7618CF02A5B0A2BCC422E857D1A47871253D08293C1C179BCDC0437069107418205FDB9856623B8CA6B694C96C084B17F13BB6DF12B2CFBBC2B0E0C34B00D0FCD0AECFB27924F6984E747BE2A09D83A8664590A8077331491A4F7D720843F23E652C6FA840308DB4020337AAD37967034A9FB523B67CA70330F02D9EA20C1E84CB8E5757C9E1896B60581441ED618AA5B26DA56C0A5A73C4DCFD755E610B4FC81FF84E21 +dk: 8C8B3722A82E550565521611EBBC63079944C9B1ABB3B0020FF12F631891A9C468D3A67BF6271280DA58D03CB042B3A461441637F929C273469AD15311E910DE18CB9537BA1BE42E98BB59E498A13FD440D0E69EE832B45CD95C382177D67096A18C07F1781663651BDCAC90DEDA3DDD143485864181C91FA2080F6DAB3F86204CEB64A7B4446895C03987A031CB4B6D9E0462FDA829172B6C012C638B29B5CD75A2C930A5596A3181C33A22D574D30261196BC350738D4FD9183A763336243ACED99B3221C71D8866895C4E52C119BF3280DAF80A95E15209A795C4435FBB3570FDB8AA9BF9AEFD43B094B781D5A81136DAB88B8799696556FEC6AE14B0BB8BE4695E9A124C2AB8FF4AB1229B8AAA8C6F41A60C34C7B56182C55C2C685E737C6CA00A23FB8A68C1CD61F30D3993A1653C1675AC5F0901A7160A73966408B8876B715396CFA4903FC69D60491F8146808C97CD5C533E71017909E97B835B86FF847B42A696375435E006061CF7A479463272114A89EB3EAF2246F0F8C104A14986828E0AD20420C9B37EA23F5C514949E77AD9E9AD12290DD1215E11DA274457AC86B1CE6864B122677F3718AA31B02580E64317178D38F25F609BC6C55BC374A1BF78EA8ECC219B30B74CBB3272A599238C93985170048F176775FB19962AC3B135AA59DB104F7114DBC2C2D42949ADECA6A85B323EE2B2B23A77D9DB235979A8E2D67CF7D2136BBBA71F269574B38888E1541340C19284074F9B7C8CF37EB01384E6E3822EC4882DFBBEC4E6098EF2B2FC177A1F0BCB65A57FDAA89315461BEB7885FB68B3CD096EDA596AC0E61DD7A9C507BC6345E0827DFCC8A3AC2DCE51AD731AA0EB932A6D0983992347CBEB3CD0D9C9719797CC21CF0062B0AD94CAD734C63E6B5D859CBE19F0368245351BF464D7505569790D2BB724D8659A9FEB1C7C473DC4D061E29863A2714BAC42ADCD1A8372776556F7928A7A44E94B6A25322D03C0A1622A7FD261522B7358F085BDFB60758762CB901031901B5EECF4920C81020A9B1781BCB9DD19A9DFB66458E7757C52CEC75B4BA740A24099CB56BB60A76B6901AA3E0169C9E83496D73C4C99435A28D613E97A1177F58B6CC595D3B2331E9CA7B57B74DC2C5277D26F2FE19240A55C35D6CFCA26C73E9A2D7C980D97960AE1A04698C16B398A5F20C35A0914145CE1674B71ABC6066A909A3E4B911E69D5A849430361F731B07246A6329B52361904225082D0AAC5B21D6B34862481A890C3C360766F04263603A6B73E802B1F70B2EB00046836B8F493BF10B90B8737C6C548449B294C47253BE26CA72336A632063AD3D0B48C8B0F4A34447EF13B764020DE739EB79ABA20E2BE1951825F293BEDD1089FCB0A91F560C8E17CDF52541DC2B81F972A7375B201F10C08D9B5BC8B95100054A3D0AAFF89BD08D6A0E7F2115A435231290460C9AD435A3B3CF35E52091EDD1890047BCC0AABB1ACEBC75F4A32BC1451ACC4969940788E89412188946C9143C5046BD1B458DF617C5DF533B052CD6038B7754034A23C2F7720134C7B4EACE01FAC0A2853A9285847ABBD06A3343A778AC6062E458BC5E61ECE1C0DE0206E6FE8A84034A7C5F1B005FB0A584051D3229B86C909AC5647B3D75569E05A88279D80E5C30F574DC327512C6BBE8101239EC62861F4BE67B05B9CDA9C545C13E7EB53CFF260AD9870199C21F8C63D64F0458A7141285023FEB829290872389644B0C3B73AC2C8E121A29BB1C43C19A233D56BED82740EB021C97B8EBBA40FF328B541760FCC372B52D3BC4FCBC06F424EAF253804D4CB46F41FF254C0C5BA483B44A87C219654555EC7C163C79B9CB760A2AD9BB722B93E0C28BD4B1685949C496EAB1AFF90919E3761B346838ABB2F01A91E554375AFDAAAF3826E6DB79FE7353A7A578A7C0598CE28B6D9915214236BBFFA6D45B6376A07924A39A7BE818286715C8A3C110CD76C02E0417AF138BDB95C3CCA798AC809ED69CFB672B6FDDC24D89C06A6558814AB0C21C62B2F84C0E3E0803DB337A4E0C7127A6B4C8C08B1D1A76BF07EB6E5B5BB47A16C74BC548375FB29CD789A5CFF91BDBD071859F4846E355BB0D29484E264DFF36C9177A7ACA78908879695CA87F25436BC12630724BB22F0CB64897FE5C41195280DA04184D4BC7B532A0F70A54D7757CDE6175A6843B861CB2BC4830C0012554CFC5D2C8A2027AA3CD967130E9B96241B11C4320C7649CC23A71BAFE691AFC08E680BCEF42907000718E4EACE8DA28214197BE1C269DA9CB541E1A3CE97CFADF9C6058780FE6793DBFA8218A2760B802B8DA2AA271A38772523A76736A7A31B9D3037AD21CEBB11A472B8792EB17558B940E70883F264592C689B240BB43D5408BF446432F412F4B9A5F6865CC252A43CF40A320391555591D67561FDD05353AB6B019B3A08A73353D51B6113AB2FA51D975648EE254AF89A230504A236A4658257740BDCBBE1708AB022C3C588A410DB3B9C308A06275BDF5B4859D3A2617A295E1A22F90198BAD0166F4A943417C5B831736CB2C8580ABFDE5714B586ABEEC0A175A08BC710C7A2895DE93AC438061BF7765D0D21CD418167CAF89D1EFC3448BCBB96D69B3E010C82D15CAB6CACC6799D3639669A5B21A633C865F8593B5B7BC800262BB837A924A6C5440E4FC73B41B23092C3912F4C6BEBB4C7B4C62908B03775666C22220DF9C88823E344C7308332345C8B795D34E8C051F21F5A21C214B69841358709B1C305B32CC2C3806AE9CCD3819FFF4507FE520FBFC27199BC23BE6B9B2D2AC1717579AC769279E2A7AAC68A371A47BA3A7DBE016F14E1A727333663C4A5CD1A0F8836CF7B5C49AC51485CA60345C990E06888720003731322C5B8CD5E6907FDA1157F468FD3FC20FA8175EEC95C291A262BA8C5BE990872418930852339D88A19B37FEFA3CFE82175C224407CA414BAEB37923B4D2D83134AE154E490A9B45A0563B06C953C3301450A2176A07C614A74E3478E48509F9A60AE945A8EBC7815121D90A3B0E07091A096CF02C57B25BCA58126AD0C629CE166A7EDB4B33221A0D3F72B85D562EC698B7D0A913D73806F1C5C87B38EC003CB303A3DC51B4B35356A67826D6EDAA8FEB93B98493B2D1C11B676A6AD9506A1AAAE13A824C7C08D1C6C2C4DBA9642C76EA7F6C8264B64A23CCCA9A74635FCBF03E00F1B5722B214376790793B2C4F0A13B5C40760B4218E1D2594DCB30A70D9C1782A5DD30576FA4144BFC8416EDA8118FC6472F56A979586F33BB070FB0F1B0B10BC4897EBE01BCA3893D4E16ADB25093A7417D0708C83A26322E22E6330091E30152BF823597C04CCF4CFC7331578F43A2726CCB428289A90C863259DD180C5FF142BEF41C7717094BE07856DA2B140FA67710967356AA47DFBC8D255B4722AB86D439B7E0A6090251D2D4C1ED5F20BBE6807BF65A90B7CB2EC0102AF02809DC9AC7D0A3ABC69C18365BCFF59185F33996887746185906C0191AED4407E139446459BE29C6822717644353D24AB6339156A9C424909F0A9025BB74720779BE43F16D81C8CC666E99710D8C68BB5CC4E12F314E925A551F09CC59003A1F88103C254BB978D75F394D3540E31E771CDA36E39EC54A62B5832664D821A72F1E6AFBBA27F84295B2694C498498E812BC8E9378FE541CEC5891B25062901CB7212E3CDC46179EC5BCEC10BC0B9311DE05074290687FD6A5392671654284CD9C8CC3EBA80EB3B662EB53EB75116704A1FEB5C2D056338532868DDF24EB8992AB8565D9E490CADF14804360DAA90718EAB616BAB0765D33987B47EFB6599C5563235E61E4BE670E97955AB292D9732CB8930948AC82DF230AC72297A23679D6B94C17F1359483254FEDC2F05819F0D069A443B78E3FC6C3EF4714B05A3FCA81CBBA60242A7060CD885D8F39981BB18092B23DAA59FD9578388688A09BBA079BC809A54843A60385E2310BBCBCC0213CE3DFAAB33B47F9D6305BC95C6107813C585C4B657BF30542833B14949F573C0612AD524BAAE69590C1277B86C286571BF66B3CFF46A3858C09906A794DF4A06E9D4B0A2E43F10F72A6C6C47E5646E2C799B71C33ED2F01EEB45938EB7A4E2E2908C53558A540D350369FA189C616943F7981D7618CF02A5B0A2BCC422E857D1A47871253D08293C1C179BCDC0437069107418205FDB9856623B8CA6B694C96C084B17F13BB6DF12B2CFBBC2B0E0C34B00D0FCD0AECFB27924F6984E747BE2A09D83A8664590A8077331491A4F7D720843F23E652C6FA840308DB4020337AAD37967034A9FB523B67CA70330F02D9EA20C1E84CB8E5757C9E1896B60581441ED618AA5B26DA56C0A5A73C4DCFD755E610B4FC81FF84E21D2E574DFD8CD0AE893AA7E125B44B924F45223EC09F2AD1141EA93A68050DBF699E3246884181F8E1DD44E0C7629093330221FD67D9B7D6E1510B2DBAD8762F7 + +z: 007BF379B97DA0947F2E9BFDE3359E282C9CF1D2E68A80209B533104E90F432D +d: 2D229AB46354901491476CCE8FA96E4A5FBA65AB2F538FEDAA528E35687A782B +ek: C5712512984D94A039FC87739DFCAE09934E7658A82FB0895A060D54F900C5AC1161DA09E2D833D5B60E60FB000AF1BF4F43B059B8272E79AF4572349940209BB21BA3BC3B1B6ACC281A35DAA15923496D0FDB32A8505DC8626847627BDE759175F11B457539465CCE3E591933D8B458F561EBA446711CBDF2B604E53B7EE0E0C2C0A15C35AC2A2C91BAC918170E5372C542636D7526BAFAABD10CC6F4382B01C74AE28B47289AB5E463A584465C9994B739367C9F82639801A3681768E134185C9A0DEB8965079A99451418EC051D0D723FECE5B53488207FF7994082C16043B13D278ED530640BE0B4F9AC75B52429EDCA9BC4FA7BDCB43FAB630DB25A5EF576461313CCAD5B2E85E36EBF9594689201458C9B2D96261221C8D3C21D91F53D83F0676ED7A78A6177791557DDFA33FE39699C19339AA9ACD70B34D9036D5391AB57ABB2A5EA368675A565D24A796193351A37C69A5866F4C99482CE4BB3B7795B83E584761EDAC6BFD8CF2433AFC53641E4689571B999E8236A151B6E42855F7E9BBFB8040FFA59CDE707612C9C717F5827DC2B51766889784A6942E8957E6AAAA5D8413F76A37FE69F6259CCFFDC7BECCCC1DAE419D969620C0AC674367558F532EF697058250113DCA01C051A88FABE2CC65795949166857F0F89104A1187C9D30517F25F49308BE4634AAE29B30C8360FF3CC38B5A7BE717584C10A79929B36C1516DE545566B76EACE143E011A4FD42702E95139EB2A746FC04AC99C5E9F07344C83020C34165F9572CD86F50BB9A55B13C6DF33305C8601FE1B103057519BA43B8EC1BF37603C0495F40087CC68A808848429F64BEC6EB336C37AC50F2B5CAC04D6B59870E4ABFBE773664C3926D2954E3D57F2C8147683A519B7264DF40CAB6F3BF262B760BF794416A5D601776E5165FD50C4BA4B07C49AC494C699C4705254A450B36CB38EAF96D6B0270492B84E5A5C208D6ABED761F033138D3BC9FCE42C17B160696C7CA9726BBD2B1C1E42C92556A06A5018EDF605B2D789688CB85066CAA0528BDA4E32542621727301B90333C1E4393FDB539ACF8AFC202BBC42546BB88A04AF9C089717F4073360B567D3967620BD8ACD0BA1762C56603647DEE371F552C92C82A69B1E461E4D1572FBC881AB526B49358F21A69DD3C7CE32BACFEDA9D5CCC34E09B9443EB189F69798FC80B61011B76239EEDC7C77F1B78D3077C5549C48BA8BC720CC2C8B88FC85A9A5CB6C1DA0829C504A9FA502899926BF0DC8FF9C02DC9FC005676A84CF16E2B23B7A5946289E400D0D2387E36841A227B7F10822572BD62F134EEDBCF1A66B6FCC907F9E0AF8D349FA8B5C4251C66B3690BB21A3253F3916020934381B46F1BB9C5F638BF8C8B256300B62B5D6F3A7FF680B514F6B3352A1994C8511957976836BF65979E13002AF1453C1FC037669B3465A0366B7B5F94F92C7707675FB08B2632AEF3D725CC4B3B6496B4BCEA2C865C982F7946079287D63931C8940B130776F5A7629A64915BC4B1FB09CD4C9114B1018937A83047EB3F22EB7EF5C866E9909CC89072E69C973EB22BEE6A3B1E383DA4006CCA560100C72BBA81237C1C7AB0A48A0CC58ACCE826B735C8BA19A87C9AC74E77295A8B26BDBB7685053C5A1572A09425CAE97D7F246D8D0B85AF20350999356ADA86628A787482393FD85A2166245B442F64B5516D595C471BA4CB577644738F87853F65236FF46ABAABEB9236616CF5999EADC9BA80F1C0FE8B6C45BCB543AB8E9097AF977612CF5A4E22C274A278472FA93E2B817706E11813F2B3865851C96683C83B52D2369DF3F74C111B4F4B01202277A918660B9641691412B637B7991973035F77B02D75A2143813BD49847F082C16E31EC89A2F8A588B2D40519892C939D782FFE18BE5D0BE1B5A41D594C32E246F886C37D43145DB8334B0E3364F65A76E0533FE052535DC7945669019E7310587C4C71A3883E1123A9A5BEA542F6D8CAB83CB905D26C82EF72A84285A07687ED90A2A32083F1D8519AC6289C9F6A5FE994C96ACBE0303BEB3B7A5A7457BC0118AE7008A0AD860310CCEA57BC313595A68CC8B682328D8C4440BA57E749BA40E968D09A0783CEA0CCA59B43FE9B42F157F38B67ED0379802ABC1CD50288D73581CCB59E3768C9801138B658FDAA87AC02DF5B5386C2DEFBB8605988CF7B1BC6CDF5C8F1F770EBE3E49 +dk: 81D65577F87BECBC2A8975A7FB237049AC574D9C934FDC9764FB79597C0CFD236E8F516C3DB4AC0F627A02DC8426C051A6F0421B6A2689ECC469E92A0D816E85990E9298483902A6CAB76E74D476A9300E8121958306959AA362263C885B483E326285CF970BD84A694A553E9BB3AC3209AAE0F0521F3564CF352890289A530717F5E080A916613EB88304A7340A2413C20B02F62B58D68A3C97F57C8A11B1E58611A2A18B23FB3222E84D2ED287E002C1FDCA2D47C03DD5BC0B69210789241AC177907CC3916088B6D5E6B9B7C4C8C975725E38C5A3F54964057114D7CA565BB71F5C8C866A83F0E62AF7866D94C50E89B1BD8F1A8596B477AB743A427252D2128967B962F2E7590ED47670542BDF2162F8C2B1CBE434862670926330B90002E4C490B80A57CC4B02EC03B40CF6250E727C8E1C05E2C36E9E0AAC4FC0C4C4D89EEA2837408B53542513E5C898E62722415CB71B7A9EE7E8634A00028D549A2F912797C84778B7C5D4559A885430124A5D161789EA8972EC9A5298693F4857A4AC905E53A8866148117AA60D43938F84BA60F8C15B7BC88824611AB8EB74852155BFA82127D052B6138E8A7ACF28774DC2C798EA9097723BCD2EA4A0A1B38CB666830008A256F05057D126E9C440AAD52AC7C4B2E370914C2883ECB13AA5F53E43A25D59661809C960545186BB6931BB45561307A4D45C1A0EB80EB0B4166AB12EAAF8CF4D25CA4A8454B179246D3019B8EB5CD86B2BE40513C7828653BC08CC652FA59665DDDB0B94E4AEA22431F7557329434C688B5CC0789E675B0A9395AD2CAC7DDF166E0F5245DF835A00CC172B3A6192808741652C4025566C43177F5A9911B317009A38ADA45F8339693971AA1D773D6FA240F6D7880BB5244115AC2EAB5FC2408BAF4705C7E016E9B1B6A47567DF5298F47437F1C74949232EC496C3054B0A4805C8CAC2255950A8B7F683CF5B531C4C798554963875928CA4204AE8755AF433C2D52784A36404E1A368CC4FAD29BFD879565CA3CB52D56B3F273E7CEC08A1D7180F5037CA61B289828AA3838D01F9958388779ED2881FE894A9D3699542BC0A2C497F7251986B50EFF284474794C845A53E12205FCB823872640B1A8583856DBE11BD6DE49AFC0142AD940EE43B06D9D7141674212297B8478B784FCB8A886508451B376822726E00CD7FA1CA16DB9F591007B2689E0C827929612035F5150800692ECB83B244964FE6922402297F244E430A06AB897DDEFC70742BCA5AF7B634A1B3C8C719EE2909A99C19EA602B7E22C66001CFE5401440139DD6398B26141C9B23914E5940EB35105131451DD3CBEF8654F0483887004D22AABD57559DFFC11038D3BEDE5CBD44DA0119D87610E0CBE392415B33A35F57364C1177DC514AD94570140217982593CD20BEF5E43BD0638EFAD1478CF9943DA093AFD278037010C7086C04A53C0F607D8B867222DB98A56436E6FC3B28D7382116706DB679D9316C473C6D86F85DC40B0A0FE24D8905321336488E20739FB11652EB62C7A05CFDA115791CAE294A0534491CA5EA8F5BA6730E06AF33964469983770D13C858CB66D091B02DA5181ECAEB9C4A241A2222DAA77B6E5020530474C891D440BA6E3F2137B215526001BE17185F0048F3DEBA1ECF7BBF1A55EC9D57485969B43821930DA7672B33630209F8257B8DD749FA9F6C73CE3C903B2300D7304FBBBC6F5304F6DAB322117A621A851CDB66877A82C350B4F42525E16328C7B8A07948794CECAB06D7A7B13CB070C61A983647319E1B6B4E27FC900BD50F485B98121DB4180CB62AE4C3C68A8D59F18885EFEBC90B3F1C9F480B068DACDAD813A28EB200EAAAABD9A0DC5D72E9B4505778807AA6A52AD6142DC517443FC55CDFA56B2A6AACDB28B4B5045344CB418795241756943CC5BA1A4B73A2C90A2122121559FB15B015DB43B621B20F01A4731438B148395CAE4A7C36888FBF01603336991572753F35DEF2264D93BA831A46AD5FB3F663704617B712B81595A585123F03180F46285397551F27E98970DEBC2BF8298329BC87402869DF5B207C7415D1BA9615300B67FACB7A4AB1287E37938C2347C172F96A8826C944CA75C63488A9BDFD206B41C8E6E854B2D9C59D169361BA549254142387337A89C919C84512B2394C5712512984D94A039FC87739DFCAE09934E7658A82FB0895A060D54F900C5AC1161DA09E2D833D5B60E60FB000AF1BF4F43B059B8272E79AF4572349940209BB21BA3BC3B1B6ACC281A35DAA15923496D0FDB32A8505DC8626847627BDE759175F11B457539465CCE3E591933D8B458F561EBA446711CBDF2B604E53B7EE0E0C2C0A15C35AC2A2C91BAC918170E5372C542636D7526BAFAABD10CC6F4382B01C74AE28B47289AB5E463A584465C9994B739367C9F82639801A3681768E134185C9A0DEB8965079A99451418EC051D0D723FECE5B53488207FF7994082C16043B13D278ED530640BE0B4F9AC75B52429EDCA9BC4FA7BDCB43FAB630DB25A5EF576461313CCAD5B2E85E36EBF9594689201458C9B2D96261221C8D3C21D91F53D83F0676ED7A78A6177791557DDFA33FE39699C19339AA9ACD70B34D9036D5391AB57ABB2A5EA368675A565D24A796193351A37C69A5866F4C99482CE4BB3B7795B83E584761EDAC6BFD8CF2433AFC53641E4689571B999E8236A151B6E42855F7E9BBFB8040FFA59CDE707612C9C717F5827DC2B51766889784A6942E8957E6AAAA5D8413F76A37FE69F6259CCFFDC7BECCCC1DAE419D969620C0AC674367558F532EF697058250113DCA01C051A88FABE2CC65795949166857F0F89104A1187C9D30517F25F49308BE4634AAE29B30C8360FF3CC38B5A7BE717584C10A79929B36C1516DE545566B76EACE143E011A4FD42702E95139EB2A746FC04AC99C5E9F07344C83020C34165F9572CD86F50BB9A55B13C6DF33305C8601FE1B103057519BA43B8EC1BF37603C0495F40087CC68A808848429F64BEC6EB336C37AC50F2B5CAC04D6B59870E4ABFBE773664C3926D2954E3D57F2C8147683A519B7264DF40CAB6F3BF262B760BF794416A5D601776E5165FD50C4BA4B07C49AC494C699C4705254A450B36CB38EAF96D6B0270492B84E5A5C208D6ABED761F033138D3BC9FCE42C17B160696C7CA9726BBD2B1C1E42C92556A06A5018EDF605B2D789688CB85066CAA0528BDA4E32542621727301B90333C1E4393FDB539ACF8AFC202BBC42546BB88A04AF9C089717F4073360B567D3967620BD8ACD0BA1762C56603647DEE371F552C92C82A69B1E461E4D1572FBC881AB526B49358F21A69DD3C7CE32BACFEDA9D5CCC34E09B9443EB189F69798FC80B61011B76239EEDC7C77F1B78D3077C5549C48BA8BC720CC2C8B88FC85A9A5CB6C1DA0829C504A9FA502899926BF0DC8FF9C02DC9FC005676A84CF16E2B23B7A5946289E400D0D2387E36841A227B7F10822572BD62F134EEDBCF1A66B6FCC907F9E0AF8D349FA8B5C4251C66B3690BB21A3253F3916020934381B46F1BB9C5F638BF8C8B256300B62B5D6F3A7FF680B514F6B3352A1994C8511957976836BF65979E13002AF1453C1FC037669B3465A0366B7B5F94F92C7707675FB08B2632AEF3D725CC4B3B6496B4BCEA2C865C982F7946079287D63931C8940B130776F5A7629A64915BC4B1FB09CD4C9114B1018937A83047EB3F22EB7EF5C866E9909CC89072E69C973EB22BEE6A3B1E383DA4006CCA560100C72BBA81237C1C7AB0A48A0CC58ACCE826B735C8BA19A87C9AC74E77295A8B26BDBB7685053C5A1572A09425CAE97D7F246D8D0B85AF20350999356ADA86628A787482393FD85A2166245B442F64B5516D595C471BA4CB577644738F87853F65236FF46ABAABEB9236616CF5999EADC9BA80F1C0FE8B6C45BCB543AB8E9097AF977612CF5A4E22C274A278472FA93E2B817706E11813F2B3865851C96683C83B52D2369DF3F74C111B4F4B01202277A918660B9641691412B637B7991973035F77B02D75A2143813BD49847F082C16E31EC89A2F8A588B2D40519892C939D782FFE18BE5D0BE1B5A41D594C32E246F886C37D43145DB8334B0E3364F65A76E0533FE052535DC7945669019E7310587C4C71A3883E1123A9A5BEA542F6D8CAB83CB905D26C82EF72A84285A07687ED90A2A32083F1D8519AC6289C9F6A5FE994C96ACBE0303BEB3B7A5A7457BC0118AE7008A0AD860310CCEA57BC313595A68CC8B682328D8C4440BA57E749BA40E968D09A0783CEA0CCA59B43FE9B42F157F38B67ED0379802ABC1CD50288D73581CCB59E3768C9801138B658FDAA87AC02DF5B5386C2DEFBB8605988CF7B1BC6CDF5C8F1F770EBE3E4987A74BAADEC58CB97414E0D82652052055EEE3E3B64001A0DC6172A2A48DDD91007BF379B97DA0947F2E9BFDE3359E282C9CF1D2E68A80209B533104E90F432D + +z: E94F4E83E6CAABCA9E319D40F6CE0E3691B77C92D9E3766BE9B6F4B6DF2E640E +d: 1D65D0290B15903371D616D7AC3F2FADA8CB24E6C84D52C039A10BC1288C1110 +ek: F4A4800C492B0472295F4B65471C6170C96DBD90130867CC68369DF450214ECCA22420CE39341A321682C054719B33469BA78C5F0ACD0CF466F2A188713B5154B279E6A6BC1A91032D4948B2D521E3090E450ACBAFC250EC72B7E6DBA3FED99F22730B0588042F33C50F7A81F368ADCB348864AC6DE5479EB1A041F9E3B04304CA38694B5A5B0A674659D6F9BD49AC964ABC4BCC532DB8CAC7A437371DB665AE4CC5B68CAD6AE475472A05F21981998CBEECA435E14C72293127A12659AAA5572042A2789A3B8FCC1D81AA1B95929BDD1A8E13192CFC700AF0E99C6A839EA71297A2A496D9045FBB9425FACC6CC5111868D48AEF176B7462B321308AB199B02CB3A6783749CA845DAAFC1C1C3BB2BA6B0F6C29BA3B428F971C750223B84A5ABAB4B77285A04E03E78D686B38990208A0FA740D01BD05B828F0D36EF5B1056183B93F8238F4AB7AAF872CB7916BD63AA6288337DABA6A5593BBE431ABE3497314F9529A9B5A7B8212C4BC23989A87419903E7B9A2962B310F865969264F2C0A0E6BD99E21C15EB717626D642FC2C6375578780EE13D05A6B3581C70B32C96E4D4178A7920F3A012D3C4C9FCD16556E5965F12AD08B294582A3F441467A3185111E53DEAC9272869671C2CB435E0B60DE5AE0A1A2A53818667500E986395A997722A626ABFA5310E4A43379C15CD3174F4F209379626EF6C4A1F076C73539F26E7C4651317C4545709BC757A92BAF5F417F6B4235A3535D5CB9A6D903D64C89B857A841EA25747F7A0D207729CBBB3CA9B32CB1A38D2AAAD124658C216533F4380ED108040559C8C92CB343C30A5B6A156903E69BA14A3B3C4E9B8C73B2C1ACFA302DB96B9C724B28E6AB1EE489867AAB84BEBC3B417048DDB0304EA8910C55BEC887E59EC336BD96947DA832B213FCF8C68D9832EE0289DFCD8B91DB20BBC81C2833C144A044E917904E9968D0D096482549C55062C0DFA6FB1415FE491051BD9A1DBE65417CA39A0A5CFC79B1A8D909123D287B1E9B7F2A683CB864D693C65BD770C54FB6C243441328C95C6EC7EE5C0802FC0973CE88AD589353A430A543738FC9A5F9EB1730C7060A8279C61527B486669E1C2995F242DE5C42DD0021858C2A3E07250FEB268BBB38FAEF7BE2C4C6CC8B5CCEC0005627874666055091283B7E522B2D96F52A60B031BC6549410AB769BDDB15717A0557561ACE7082FDC463209E63F94919BF3C33BCD012AB9321A0134C017441B578410204A5BF70C57D572C7D7A17F12A2176668A8D9E0C9C216AE9F2466B4F961CBD1256F247EE3B0B23F2AC39ED8757E8A497E161B551CAE1A2C6B88629EE4788DEF79249606195E186398F01CFA070E8B57156922AE4823468DF5C7C5F9065F38639BC77B78A4ACCE5496459346B6D07C49128F0C9A08BBD3C448B97A31255F0B6A388BC8A221009EDDA1AF9C819840C67DAAC24F54D2220058C378E8A4A23825A49A5D4B631FB3080ACAB9BE2DE3A258EA76B01C47B4D8703CD22EB78B02AA2260302192021A0FC031A6FACB03A33055F25A2BB1D6698B4A8DCA9238DD5ACD6787C8912066EACA67FDE86FB6C14687B076D19450CCF75EE328BF9DD6ABB89030AD08BB917B738024022E69A243E779355850B18A7C97F99039271F6EC47418661779C0A528D4079C5ABED21475B864078AA92F69E64F7F12B0BA661B066114F1F43EFBA89B67C05518C15537115DA0909B4A097361586C064A82B6790766944BF99176D090AA8DF599AAD37922B16A2553503AF1B4D7B90FB967AD5A637EFB019E257A6CF2AABD470157352A3196B9339715A1B254B5FF37C8A799473CAC6D0AC6A4AB56BF03271831A33EBA29AF1AE689FF54A2431B5A3F3BA83DB5A51B0492CC2C0DE31962293539278A11B408BF50C0B6D82A9764280DE4F8155201424DDC63F58AB413813FFA011EDEEB4B8B005E707880AF88392A472AD487CB6B6CBAE8787F5F8B4A5822B269E74FD91635EDE9541B5C2A5C9A6FE15722AB2BB61F225D08A84D4A9577D52617EDEC650E429A45B0397147920DE7201925913F029985C229D1044DC1895BEA961F936165CB24BC9DF884F6F49267A19B9B623FE0095EED29B0C75805BD9AA29EE857A9970533344DA99963C057337D4C25D517A341CA4BDB86C74DF0B23A56762B5838F5C68FACD1433B948824CB86D88A1560E77F4EB4A2A95E140B648DB88D +dk: 25ACA925E757A4BBA64CE712864669DD8BC9A55007B2C3510AE778DC85A877AB08EC454C61F32205E76C509B81040466BC47C9EAE77B10067C14F241C2E992A16708D1C1604B0C3F5885BD2C86B7B1E8BBD90903B0CA242AE206A6D31846973FA38B9D09402A35E45E98E84D1B125155D86E667960CC058AB25C2B053352C64BC03A78CD86D53BC298A3D586A08C1506103B301AE502176804C328AE1F24CD270AA76CC223709AB7E4B8AF3F28043F5C21B8721F8C228B7F908ACD7C4F1DE5C8939B643B22BDCC1576B65901FCC0720C622C4FA5BADFB7442CF63CCC513A8C7709D3C399469907DF740DDB3104CEB9C92C33113D258AF7EB220EB9AED0B2C1BCBA70CB9C76B840276EF11FAD35BED30CAFE633CCC4E3606F758A0F993D27F80F84473F770565B371ADF5E61689B0402D681F0D93745D625DAD286356A152F689413FB89A569CCC39E71912B3BD345AC5643725969B896328B24568428E5C651401447B490180003CFA674A5093982FA465FFE017B62BB042CC9C67C955B3123B0755430666330547C333196322843744B9213C5528585B4080265CEA0A4931D77C7D81BFE73008B37ABD62082287608ECB2CA6E50CC4C9529E32DB7BB70917A5BC3F8BDAB897E52320395749629104F3B60E27A0D3C09508E422497B7D6F711DE43C315BD83836538F88C30B7AE4A5B5B122D9394E34479D698C8B535354C25B5BE572513DD24A64985D78517AC2F3861330663C1A2AF6C135E0E49E5B930AC6A6A81A203E0A3A4BD1642A304C654681A8769C6C6AB009690A7BFF3B5B9FB64B30C2AFB9280FCF10377601B9047BC6ED0A07310091A97A8016735695EC704FD8493273B2DFD8C1A372C6B7A1A91DA08D3F2767B372A688228135F69D77D1A20CB03C69482A7B67A1E59249FD098E19BC84CEC247922A52A3EAC641F9383EA19200E16874E876AFA5C2598355F5EC01CDA86BE976A7420061C8D9A2F1E341F1378FBBF31DDFE3699DC60637138DC3A19B5FE17D27F0352743C76477363B7C72CBAA2E0F83CB53A82EEBDACF0642C5C39868CDE28F5E83A08046C38B9A1367B2B68C50869E6A9B44379AF1111133ACBF3E51738D2ACCE510A1B5F40B5D17CF5B5710C70B20A1A4734934123C2BC8B1D3714123A4159021B0688484398CA1346D0B5A9CE6AB299F439CE0B83A29261E67B905B944C8E74041431738D4272FB11254CB483907998F364235668C960AB0BE12580908093C31C37BC769BFB285451FF96155102376B8803DB777C15683B963765F2BC40B29558275864B0668F4C269F36B1D6E935C16A2B160E6B9A922080039A2946198BE02A82DFC1B86B310539502B61BC4B8DB533D939B973830EDD6382DD02AEB876ED7332954D2B0F1831953614CE6622BC91C3729F7BC6C45780974B4A40C07B5E4614C858CFCCC4C42E32CB3492F4F36546FB6ABFF9C6AD8C96B54818B3EE3545D2A2687E14C13B29248C69403A63D79A886195C630BA97AA52539C8949DEBE323F68C53EF5AB121D4AA0AC10D2A28A90B39C03187761DE728FDEB17FEF21257DB7199D665D5A5C37823ACE4830F09B3440A345C3627A136FBB416033BB0E73AD9F1B2417075D1F0C928778DEABB59C03A8813FC8BFC8B27797CAE5467C6FC934AF36922F8983E4A8B4F9BA79E2C1B7D9D2297AB273289B8A1EE2CAF8740A201A9C6F2ACCFAC8A0DDF51BDF076521E22AB196811E0834E96AB84606A1E1F018868604BA32C832FDA967CAB1C3021AA4D59A3E731242D7792729CA646D8B976370C2F93332500A9AF32684EF6B6EE7B3690B57409C4A78AC92F9E58CBCF9854B18A737114045EF72C5B808DB039126A8C22C605287292AF93B932AE153EB932CCC06CA4B8DC18AE8C0237EB1122A1C0C1C95E4A5118CE674990707AFA146B5AE620FB44A3FBEAB22649A37495825485634EAA6B7565BFAEA2493D3605D9AB5140C27FEB1350C93998CA8C5E52B14BDB9679763C20D8CA516CB8B5F089BC30E5B9DAE631D6C571AA572F40922E13E8C9488375603605C1D3505FF27033F57040B904D4B71A30098A260169B49495A1B52C76E924FDA088ACD56B90565A49BA8E0A1C66F186367AA7710157CF4A28B2223C2D034079E5ACAA88DB0E9DFB585C7773142A43535CC6083B1EFAB0A8F4A4800C492B0472295F4B65471C6170C96DBD90130867CC68369DF450214ECCA22420CE39341A321682C054719B33469BA78C5F0ACD0CF466F2A188713B5154B279E6A6BC1A91032D4948B2D521E3090E450ACBAFC250EC72B7E6DBA3FED99F22730B0588042F33C50F7A81F368ADCB348864AC6DE5479EB1A041F9E3B04304CA38694B5A5B0A674659D6F9BD49AC964ABC4BCC532DB8CAC7A437371DB665AE4CC5B68CAD6AE475472A05F21981998CBEECA435E14C72293127A12659AAA5572042A2789A3B8FCC1D81AA1B95929BDD1A8E13192CFC700AF0E99C6A839EA71297A2A496D9045FBB9425FACC6CC5111868D48AEF176B7462B321308AB199B02CB3A6783749CA845DAAFC1C1C3BB2BA6B0F6C29BA3B428F971C750223B84A5ABAB4B77285A04E03E78D686B38990208A0FA740D01BD05B828F0D36EF5B1056183B93F8238F4AB7AAF872CB7916BD63AA6288337DABA6A5593BBE431ABE3497314F9529A9B5A7B8212C4BC23989A87419903E7B9A2962B310F865969264F2C0A0E6BD99E21C15EB717626D642FC2C6375578780EE13D05A6B3581C70B32C96E4D4178A7920F3A012D3C4C9FCD16556E5965F12AD08B294582A3F441467A3185111E53DEAC9272869671C2CB435E0B60DE5AE0A1A2A53818667500E986395A997722A626ABFA5310E4A43379C15CD3174F4F209379626EF6C4A1F076C73539F26E7C4651317C4545709BC757A92BAF5F417F6B4235A3535D5CB9A6D903D64C89B857A841EA25747F7A0D207729CBBB3CA9B32CB1A38D2AAAD124658C216533F4380ED108040559C8C92CB343C30A5B6A156903E69BA14A3B3C4E9B8C73B2C1ACFA302DB96B9C724B28E6AB1EE489867AAB84BEBC3B417048DDB0304EA8910C55BEC887E59EC336BD96947DA832B213FCF8C68D9832EE0289DFCD8B91DB20BBC81C2833C144A044E917904E9968D0D096482549C55062C0DFA6FB1415FE491051BD9A1DBE65417CA39A0A5CFC79B1A8D909123D287B1E9B7F2A683CB864D693C65BD770C54FB6C243441328C95C6EC7EE5C0802FC0973CE88AD589353A430A543738FC9A5F9EB1730C7060A8279C61527B486669E1C2995F242DE5C42DD0021858C2A3E07250FEB268BBB38FAEF7BE2C4C6CC8B5CCEC0005627874666055091283B7E522B2D96F52A60B031BC6549410AB769BDDB15717A0557561ACE7082FDC463209E63F94919BF3C33BCD012AB9321A0134C017441B578410204A5BF70C57D572C7D7A17F12A2176668A8D9E0C9C216AE9F2466B4F961CBD1256F247EE3B0B23F2AC39ED8757E8A497E161B551CAE1A2C6B88629EE4788DEF79249606195E186398F01CFA070E8B57156922AE4823468DF5C7C5F9065F38639BC77B78A4ACCE5496459346B6D07C49128F0C9A08BBD3C448B97A31255F0B6A388BC8A221009EDDA1AF9C819840C67DAAC24F54D2220058C378E8A4A23825A49A5D4B631FB3080ACAB9BE2DE3A258EA76B01C47B4D8703CD22EB78B02AA2260302192021A0FC031A6FACB03A33055F25A2BB1D6698B4A8DCA9238DD5ACD6787C8912066EACA67FDE86FB6C14687B076D19450CCF75EE328BF9DD6ABB89030AD08BB917B738024022E69A243E779355850B18A7C97F99039271F6EC47418661779C0A528D4079C5ABED21475B864078AA92F69E64F7F12B0BA661B066114F1F43EFBA89B67C05518C15537115DA0909B4A097361586C064A82B6790766944BF99176D090AA8DF599AAD37922B16A2553503AF1B4D7B90FB967AD5A637EFB019E257A6CF2AABD470157352A3196B9339715A1B254B5FF37C8A799473CAC6D0AC6A4AB56BF03271831A33EBA29AF1AE689FF54A2431B5A3F3BA83DB5A51B0492CC2C0DE31962293539278A11B408BF50C0B6D82A9764280DE4F8155201424DDC63F58AB413813FFA011EDEEB4B8B005E707880AF88392A472AD487CB6B6CBAE8787F5F8B4A5822B269E74FD91635EDE9541B5C2A5C9A6FE15722AB2BB61F225D08A84D4A9577D52617EDEC650E429A45B0397147920DE7201925913F029985C229D1044DC1895BEA961F936165CB24BC9DF884F6F49267A19B9B623FE0095EED29B0C75805BD9AA29EE857A9970533344DA99963C057337D4C25D517A341CA4BDB86C74DF0B23A56762B5838F5C68FACD1433B948824CB86D88A1560E77F4EB4A2A95E140B648DB88D7456EFF3A15CD68111A12974CB06566E9007C376E09CB10D47C73E43546AB16AE94F4E83E6CAABCA9E319D40F6CE0E3691B77C92D9E3766BE9B6F4B6DF2E640E + +z: EC54F6E1E7FB12B796D0E56BE6FE3BA6EDAAB49B08712318B27D229606D2AC70 +d: 22D19527844F3CDB8A342620A96E902AC7C36E54677ADA6FE8DB08DF4EF3B36B +ek: 0E4C2891EB5497C1BEA0A62A0AE207018A2C0FAA8991D76CD14C47916853C326123A3C2997BC27A0B7073F97881EDA9CA18996779064AB768749869E66C4CA6AA58A8B155371B4729BE2327165B103393B23941FC6941A2BBC3C9D1489D6692E146B73A428241172C1EE63161C82A6666B7F5F757BEA328CE6AB45D0D87FBD007333EA927C3810A0A1790DDCC14A607D45A046E23C043CD96196659337FA940E67C565E70CD7D45511BA4C01631D43DCAD1C09833D64BE170A0681E0978D1B4F27E253BBBC5A4C2377299041333A1FA1FA0329B9B6FF24647E3B03954A85BDD637697CA834C95E1A992011D52D2719AD5FC410A780291CC575E82A2AC229BD8C6C42D4673E958ACBB6DC6EA644AAE5B10D5D90907E82614881182B127A53356A26A62C8463B26E5415C131BD72B16D2BA1175FEC0B6E59723FF7CF917968AFC91FE0698F40F55A9C730A1A493314991CD0329083B84292DB23D706755CEB4CF645A706E43512432848639AA757C61E727E8112A06B590488C4917C74041B92C1F34194A849211785C10FF71D27917D45A3B2A67966BA454A3B4829DCCC3CA8493612AB1EB554469E9950B4DB78E8D96E2352CC1AB2895FB16362143A25B3171D4C05A2AA5E5DB845220AB77EBA1166A5842436B226966988BCA3CAFC7997B0A261F97AA24C70BEC48CDDD491A1D2CFCC4455D06AA956348478580D1C70008C0B4AEA3CCFE9EA6C37A3B467652179B446F4D060B532AAB668554ABB88974BA6AF174861D52124EB9D05E60E62E11D67F34F1747951C2C6CE385BCEDF5476B882571579937F57C5C605351D12AEF9C6CD9B8BF35E95F7AC70D50C62B3E68899C39173101AC8EA326DF755BCEDA4B746BACEBE9CB8B233AFAC73075738BE4EB905D26438C5A68D8A14645462DE90783CCBB841431A452B632AD672494377CCE80974247951711A94CB907611C7E96E501EAA13BF225A041FCCFC0318CAC430C58CA043719668E59B4CAB34E2FC2ADE662C7DAD744CB5963ED6A9EF2449A000A6080C555DE2B3EA80C5AB7091DC18C4811697FF6E0A6D2D98489FB211B6B786ECB0ED793448351B80668A46ECB41FB8A642F10A0CC41A1F836303023C33B3B54BA6C2599268C433C6C0832052174739267CFD80C74C3225AC4D75CA8235108165E69F233C213B5AC547794E7CE59DC8D21D76B2CE0CECE43578FD0A1CD38200DF0C020D39563B519BC138B39D819A7A8AAF7D9C931EA75FA9B69369A7A6038B4D3937F7EFB14CE779CC1227B7732172AD10DB932531E426938D067144B6BF4F67C3DB0135573C219552719CB67ECFC07A489BB81F4A0773988E5AB3ADF7C75445868673B6D255B72AA73B32EFC015EA83010F96148A289B10101990290843CBA81E27AC58495F12CB05F5A8454E66F5B10CF0425BB6A1A8580C4C4110304C4717C84431447E510B837C8D70C8B589241592A107E6920FDF8627357C3C0D931F1F69EEEF1C3C518BFCF4305C98A86CE950FA40195F04B79C1471D0389792502C344DA14C884890898262E8292C3E5912A595D0E561CB3594FB4391BB5F4B6571969C86A8457633A5D8212393773D5D736380707BE35895948AE4AE8A672A16BE1E536549A194427C24080BDE083A63AB65240936F3FCA52DCE473EC08B765246AABD6C1F9549C0236676AA2AD234065C65672ADA92281696CD10A1AF1580A88E602ADBA75BC84B10A57072D1695BAE791E26114FCB408576516B7741D0CA9038D2C100884C417F2739930C50E408CC0A83023E6B13C236965802F62B00BFDD0032F98BBE7084AE0B5C6A26613470A8BE5B6C6BAC59B9B725C55C71E4E8A381BF88A0341943B942228FA6E3B3BB614887846F05461D632685486BC73A8E1794483125E58031DCE0A5C8E175C3B73AE08C01D2EEC8677C32F7A2B0D620ACA1D128E6B42095D8B9179369EA88B5697380B4C13552EEA86D9F8188A1C9093B794A9538EEC3A6D5F621A9D991DA6974E6A804D00A2864450C5AE59C4FFE2AEDC23AC522939D5D2204168CD8F8C59E87723DDD4809D2913F6825043EA6C7C9340A91914FBD13C65384B06B955AA221D302112C1F0802F71443FA9ACA95CB236E64886B4B0332BAF527C4AC3A9B4D8956D5FC2904911B944EC3F9FA07267342FFC4CB9CF15CEFE7325CD4C34B9A742B4214F50A50E58B9BD03C053806F0677A35438CF5EFCD8 +dk: 3E793CFC068B5ED1B1E6D8ACB44ACF89C78CFCA91603E5182B598ED7937F9CA4973DDC1FD3A5023AC5A7C5B34DDD98B3CAFC2B548C9670C18EA16C15982B8B46F74D5A56AB08A1C517FB3543F678C3A97AB45A7A0FB9BFD12AA9BDA96E695674E5A78F3BAC74E033C5A3687A27A13D889B4A36BA339AA25730DAC64C464970FCB268F20F79F055EFC06964F6679AC56EDFB065C39B475370C98C4670387B97B2FC488E567E3B6109FCF28B764890B1E8529DC3BF58851EDA97358AA7B42C872EBFD832FF17B31E2471B091C3254707FC526521B9256997369927286B332CF3657CF3EA584F46ACDC2901B98A117C86430E00474611BA4043953685449D415237BA4E63D99F92835F3BC04C575008FF02885CE26027D914C67CC7F61CBD1C492C07AB1B278B68AB37A13A9C3CCF0BB84CA18DB371C8C4415D29A47F20DB1BC18B52AE4A831DA34B4A541C0D0C9EB17CB2675845CF809709338242A29C9E6239F7797A790A00CA407CBC536A079201C1E2672E343CCE0714A5E8C446D413BAD40E569280B2C2A255481A169A43F5AA501E61914EE35C2964B295914FC4158F7D3678D9B4C3869782DF96189FAB4FD7C171CF3210B7D27E34A593A5A215A4966CF73BC1045402ED8C0E7E548363600A871A0330B81B6CE482CF33C368956E1A49B848755B910A609B77389AAB1E6CF60D75555D21B16336589B474B059813828A8925C681524D9A5FFEF972736856ED169A5E6096E430466D03598619B3709CC91CF24DD4F55AD484B081356A2241B438C37CB250CDDE46072C16454706922F35C5267614943A9155169483D82CA716327501CE7DB313C771AA197367E8E11E5092A519DB2D26FA390BD8070390294589871EBB26CFD636D3D438BB9B0055A8C99F31AFC91245650483945C2C265170D6724102B0B9D0EAAA914CA85C941A6D90668A39582C515C5EC10200C1458D53B0A5B012B4D8B27F917D151C0896C9328903C49DB6B4FBC4526722ABD17C2CDA19A3519BC781C00DF97C5642798359DB358DC153B2885AD8C4BC59E94242BCB3436460048A248CA40F8AF3BF04799B603037567C0A85D65DF17CB9C520B4B56C01DF4C26BFD39FF4D27A1984358465AF96558054A89320434910A54E80D860BC38168D7C1E0F978720CA64C57B7ADDC98B713813F7098D548631BB062B069682E30547AE8BBE394551CCA1A506ACCF37A8B052E86F03DBBFB3025482EA1B2FDC2A9A9B077024B2F0827A33E7661C199201365A840A11F3F649A4097F630B7EFB734438E83C67284E12014282804C46049AE7438352A9AFAAEA2F843A347D753972728B4AF1954248291B4AC278A8813FF5083C582FBB1B8D4D49A227A49A99FA04827265F8C9902B98B299CA4A22668096DA77F7651DF1DC723CB98DB9B921ECDA5634451BC5B94663440F35A358FD8174057A38EEC579E49209B11CCD2DE729E704749E70AD13678BFD365CA26192965076F1F3868503C450DB964EF48061159B0841A06E9A2D51FB78C6033E5A063D30D2C160526531B3BE8EC561D32857136C3E1FF757D150A7E48B876928A1D4BAB34162180E94545285865A6C6988645D1A746C6C744B196C317E6AC95163353EDC381FB7AAD5E07993BC3141A64489762F6B9041CA438F2C135FCD737503A64FE1E5592FA68587B40A7F9913DC560D1104C1A08CAD82275B4AE0838B3BAB51283078D619B77C82980569C524A50158B8F3D352F3060530E9AF6CBC9613C67110773F1A6892E3A83D30B918DE545FA48B19A797BC2A7246D29B251A46325F453EABC1B8EF795A24E488F3C269CE04C3EBC8C0CAC82DF837B4EC46AD747721695C5C18A45EBB52BE0CF608AA08A759F236BC59357387006968C913E97856810DBF266E16F46DB5585D8DC6510A954D3C090B4283318633609A7B3625C54EFC975A127C625AD768F1C03D57584B7D2012E680CCB4EB7A1C822E4BC3182D0483A6D894AA77AC35795717674EB0FACAA0B9C172DB95D257058E7A31B7F6951A3ACB8AA531EE9516C097AE8981671E2381BB523388082D2B07CC9B576401A5C195C05FD1C0849D02869B2834772A1EE6776EE66A970CE2B9021193D13C2642A2A3271C093DC858424115B9C1628AFC31BCF7AE18783602813012750A4CCABB1E609C2A649E0E4C2891EB5497C1BEA0A62A0AE207018A2C0FAA8991D76CD14C47916853C326123A3C2997BC27A0B7073F97881EDA9CA18996779064AB768749869E66C4CA6AA58A8B155371B4729BE2327165B103393B23941FC6941A2BBC3C9D1489D6692E146B73A428241172C1EE63161C82A6666B7F5F757BEA328CE6AB45D0D87FBD007333EA927C3810A0A1790DDCC14A607D45A046E23C043CD96196659337FA940E67C565E70CD7D45511BA4C01631D43DCAD1C09833D64BE170A0681E0978D1B4F27E253BBBC5A4C2377299041333A1FA1FA0329B9B6FF24647E3B03954A85BDD637697CA834C95E1A992011D52D2719AD5FC410A780291CC575E82A2AC229BD8C6C42D4673E958ACBB6DC6EA644AAE5B10D5D90907E82614881182B127A53356A26A62C8463B26E5415C131BD72B16D2BA1175FEC0B6E59723FF7CF917968AFC91FE0698F40F55A9C730A1A493314991CD0329083B84292DB23D706755CEB4CF645A706E43512432848639AA757C61E727E8112A06B590488C4917C74041B92C1F34194A849211785C10FF71D27917D45A3B2A67966BA454A3B4829DCCC3CA8493612AB1EB554469E9950B4DB78E8D96E2352CC1AB2895FB16362143A25B3171D4C05A2AA5E5DB845220AB77EBA1166A5842436B226966988BCA3CAFC7997B0A261F97AA24C70BEC48CDDD491A1D2CFCC4455D06AA956348478580D1C70008C0B4AEA3CCFE9EA6C37A3B467652179B446F4D060B532AAB668554ABB88974BA6AF174861D52124EB9D05E60E62E11D67F34F1747951C2C6CE385BCEDF5476B882571579937F57C5C605351D12AEF9C6CD9B8BF35E95F7AC70D50C62B3E68899C39173101AC8EA326DF755BCEDA4B746BACEBE9CB8B233AFAC73075738BE4EB905D26438C5A68D8A14645462DE90783CCBB841431A452B632AD672494377CCE80974247951711A94CB907611C7E96E501EAA13BF225A041FCCFC0318CAC430C58CA043719668E59B4CAB34E2FC2ADE662C7DAD744CB5963ED6A9EF2449A000A6080C555DE2B3EA80C5AB7091DC18C4811697FF6E0A6D2D98489FB211B6B786ECB0ED793448351B80668A46ECB41FB8A642F10A0CC41A1F836303023C33B3B54BA6C2599268C433C6C0832052174739267CFD80C74C3225AC4D75CA8235108165E69F233C213B5AC547794E7CE59DC8D21D76B2CE0CECE43578FD0A1CD38200DF0C020D39563B519BC138B39D819A7A8AAF7D9C931EA75FA9B69369A7A6038B4D3937F7EFB14CE779CC1227B7732172AD10DB932531E426938D067144B6BF4F67C3DB0135573C219552719CB67ECFC07A489BB81F4A0773988E5AB3ADF7C75445868673B6D255B72AA73B32EFC015EA83010F96148A289B10101990290843CBA81E27AC58495F12CB05F5A8454E66F5B10CF0425BB6A1A8580C4C4110304C4717C84431447E510B837C8D70C8B589241592A107E6920FDF8627357C3C0D931F1F69EEEF1C3C518BFCF4305C98A86CE950FA40195F04B79C1471D0389792502C344DA14C884890898262E8292C3E5912A595D0E561CB3594FB4391BB5F4B6571969C86A8457633A5D8212393773D5D736380707BE35895948AE4AE8A672A16BE1E536549A194427C24080BDE083A63AB65240936F3FCA52DCE473EC08B765246AABD6C1F9549C0236676AA2AD234065C65672ADA92281696CD10A1AF1580A88E602ADBA75BC84B10A57072D1695BAE791E26114FCB408576516B7741D0CA9038D2C100884C417F2739930C50E408CC0A83023E6B13C236965802F62B00BFDD0032F98BBE7084AE0B5C6A26613470A8BE5B6C6BAC59B9B725C55C71E4E8A381BF88A0341943B942228FA6E3B3BB614887846F05461D632685486BC73A8E1794483125E58031DCE0A5C8E175C3B73AE08C01D2EEC8677C32F7A2B0D620ACA1D128E6B42095D8B9179369EA88B5697380B4C13552EEA86D9F8188A1C9093B794A9538EEC3A6D5F621A9D991DA6974E6A804D00A2864450C5AE59C4FFE2AEDC23AC522939D5D2204168CD8F8C59E87723DDD4809D2913F6825043EA6C7C9340A91914FBD13C65384B06B955AA221D302112C1F0802F71443FA9ACA95CB236E64886B4B0332BAF527C4AC3A9B4D8956D5FC2904911B944EC3F9FA07267342FFC4CB9CF15CEFE7325CD4C34B9A742B4214F50A50E58B9BD03C053806F0677A35438CF5EFCD8CC8CB55EEE0FF5BA0F84F958550BE099B0E692A35E0908A5FD21A36B521C0F1EEC54F6E1E7FB12B796D0E56BE6FE3BA6EDAAB49B08712318B27D229606D2AC70 + +z: 5B78F8D30AADB59FA617EF807D5C23113A9908342F08E898E02991CA1D7B934D +d: A00D1EE4147DD57B5E76C58A928DED0B720FB2FB6353780B380B5FBC76712E5C +ek: B3C014D82BC4BFA186D2E2A4FCFB57E2205FE91195E1ACAA18A3699D1BA700770482C18160082946D85BE262136B7B1F5BBC00D4D20A1351C66966CE3C1A06EBF35A43036A5498424C73BA01C250C61399CE951AF176C96F317B0A23395164075A23A6D6A55916F5032310B5E28B1B970C3AB75B4058C86DD9A73ACE89B9F5A272A86B433AEB9AD755B166105AE0095645910E0AD6045C075B82596140213DCD231C03D0786C186C95342C01265B03A2A113374307B49062727C82F2CBA44862C7691703374AD76B772DA400C283A1AAE348EDA9582B9B42196216A8218305309C367648F58785B74A9E4DC068318BCE4CA87000DC86ECC52F2D465762A58BCCBA755E7A881AE5704C643278E784E646C48AFC3F240A728C4A6D2B6523EA3499C9344294293497D3A4A3E2373BD2CB48B0575DA052253693D1DB696DA0057B2243525AAB17770D61D09D0F3554D10AA7A56B6CB9A81F59EC73A1FB9A08D7BB08D90F70117A2988409B870AA2F82447E14DE7B3C16503CE645BA54EE5C6E71909642A3F76620AE0D479A6440AA5E457A946A884D0C741A2C7F27C9EA9E716EE1C01154120E777930E991C63E0A3134B030A8A0E220758C074484FC7019C5AAC212246F990C41A5B5E468888A5280A23057CA0B23947F332213A86910912C090421D4A008CC219C9C571AB09A9C59C248FE71A2C928D83E6C4DD5929D4D1B8F0CA98F4608F89EA1D59F063D827123026C7EC093A6360590BF54BA041C2C21473DD89314321B334680CE65B5737857D5FB557F1967075C9889266298F332A19C5888A3497F0580B8BE1AB4F7A300F6248B4D99431E4B9CF163E9B969FD7B664AC8248789C2866D05D01C579B491BC50C8099C30A0E6076800B00CB27929ECC8C9B7C44B32781070188B747C6EC1997017E8435035CAC06B2E74D54EC8B64E2A9B9BD6351604D3875C394C183B4B7D362866C96A78569A9E88C2D8767FE0CC0C55C506E5A50B1FB9CC18910D9F22648681CA8C66529EB3665E08BDDD725146C343BD7B9E51D37F57B602E012A1096793931097228A1536715923CA93D8C41816E04FA27A16F6EB50BDEC8A26D99FCC1901938B7475731DAF85C2058832315B93E9DA81B415B707F95EDC44BAD6AC3016E4A16E787E3FC59DF904AC385ACF28EBA6EE61188883CC72E9B298F02D2D49CEE59B6DED348038C7055202B47CBC0B40774BA78CAE78079B9E8A9392CBB57CE4400E9214C3784BCCF94151D510B182403D990C2F8C984B6AAA3AFC21F9F6711EF91EEB008482845FDF60BB5917720EC9C774943E04A7A5FAF161ED557701BC26717ACB2CC059E1308E2AA76D04919B30A70CC698402FA58D927C8A02773815A144128C5BD183A38C3182BCF19DB7A3158B9393C767926F5737B6B60EDDC01FE8930ADC2C4414146A9968311C0B367647911F4AAA4443AD0648C634828C62C0BA01C161162B5EEAA78CAA9A1425F55950EAAF71841250008FE1CA3B8F8421FB4438E65AAC914AAADCB45FE303CD9165CF867A7E9304CABF0B3E1DA63A5FCB56F03753D7074525425131D555B5E583B303B6616AB6EFB68CD5994E9296608700BD3239B03AA6A662FC354E2A49314B63D9E1801EA5127FE653E459B90E94C039D812DC031D536C400A2A70B860A9AED7BCC286182933C62F7C1E73B615F1525F6A165DFD4461AE0B856B298B96CB6756AA2255949255E6C95C12A969A698D37B6FC8B7B16BF1AAA1734DCFE1160D319B25236F591C7CFC8A08FBA48B42586F3371B0AB061C92F9C0E3E350DE5941C9F380D876480C2623F526111D676AB33ACA5D66185655A94E13418576B632DB8A0D3830738C44AF9C979514254ED8C82E34AE5DD6458E2039690B8492C353E2F0937887088B4786BAE016104648C0544482C562E0D2AADE390DC03765C7C1353634B83AB66AC7E1306378B5032B3148BB799E8B4907188EFA993FE72C73E3162F2DA43F0EC7C2F1C162EFFB5659A947A3AC6203B1C825125023926115605CA1909D912A0108C0115FD75D967BACF32B656EA64BB1808D1C1B43E8D7BE02EB6432D89B59F9A3FD109AEA36ACED2A137214BDD8686D977A68A6E4B6ED6C916A8594CFA3700AF608CB6A91AF150077D5A40EA4471AC19A7177B1E6A6BBD8A357F416BA8935AE73829A5B035B79AE8D108ED5D05A089242ECDBE94664DA47F187D3D493AC23E7 +dk: 91200CC986B3575202DB535E04BC2E37A499076781ECFC2E5CB0259BE2A5618C1CED22128D194B0BF4397D6AB0E2F30F6AB23260BCCA10507CA7015C80D9409B4BC06DABC661D3A653208A505136926A554CE331E4B692105044DB060576C1C36A726C0E1379C463CFF2183166052813A6BC4B93365F2798825387209C8C53A1C2DE453887B20061E71245CA6C1C27809242C14215924FDB901EA035AAC45EB29B518D0477F5D8CCB7D39E16239EB0A5254F6380F328C1ACFBCDE08310804195B944AE8D98BC1D75325E062973D84C5AD958C14076720C4876A5B903E80DDFC7BD66E1B55356B896263FC3451E2A865212CA3B9C510FF0CA4865B6C1F2791C1A77A67336A429C9569AFABF535888D1075ED2B1A31CA78B9E3353020800FC18C1D47CA6C326529A375FDA667C06134986B891DCBA7F6AAC901768A156270A6E46490B33378EE75648BC4DCB1451A2212931F2096CD8500F23817975C25FDC164F41CB5D8A3613EC993A57711585BDE822B519683F8C9CB95ED701D6905F20A46E29C0C90C448B42742FD1BA05BFF590D2D97317C2473688A4B6AC63CC1CA28AD71FB7C5252C42534D27AF11D5947E1AB196CB2AFBCB41E0A8C50AE274D8CA1971B605520503E9C17AB6F41232FA9130BC951DC031A66A02A663756ADC7C15BC513ABC1592CCBCA9F5CD3AB29B2305B32D98C877217A1B92321930B34A096641070428B65FF4108A36C998E895375640B57788A72302931DB058ECB52F4D7A0623D74AC223C4ED6024515A364D280EE056760CB451280772AA0CADD1E0333AEAAB5357479D01696DE52AE2C8B71705706BF15C05064CA434280D4C8CAC411B0A390C6D6BBDF5E684BE3B850D3A83BC31C5C823604E533242E80DB57B2598CCAB30E53282F140C9897C85EA7BC9FC378761BDAB629E46336B714C0189E214EDB254512AAC558541D30CADEBB9665A1914A9D001F43504A0E0A566B311E746379F56558A760618C753A57B6B1A4251090795466A178A39904268A10F2451484C6B11C037953817AB156EF7383878B1BC38790CABEB4991EB2768A83F580945D46C49A8C0CA26BB99F72C40B73439253180DEE2A425C54C23FC6718A40611455BF4652F8CD91067B42131EC03CC5C0B59EBC5FF30B097D764306CB692ABB95D192CE44B1C0E981162F73997148DF270630AB6B37129813599239AFB46CDAA40CE472310EA67C2E0BA18765D34EC9FBFB82CBDB4BB6797B849BC778C9710BCD0BB2C611990B3232AAA4D1B898371738AAB9375813913DBD178A4CA2EEE4A8D09E72EDE6189272B1EF503AC8302A63396798FE5731C223E53E90EBA3805D1F8A65DF168C71408682C2790A167557A15E697A72CD2CB613B7371838EC85BBFB510B3344C3B61664BAA8B90079C30181ACBA83AB049808CE6421DB67393865C43D43C3825281492AA68413BA560B123E2140DC114060F93101CC08C63D848B172010C56C2F5377AB4B4A31CBCB265FA607F504147C0009EF812788A7EC53514460A8C8225A664348A5347291B73B423C8385CDCCD34A277913841F2C2434F2A34A2EB02B7270274E4AFB3F19933402E1A340D8A8B6F50EC4930086D462A85C9AA80950711C092BA7135A45CE30B37FBB21C574C6A1263D0554AADF36D9A6567716B914F41617047973D54C3F573805CD38170F004BD014989D33D939132A39B44D49345B857792B241B0A870396D95CCA133E7A7001579930DF70C201A71951E11257356129255A044678BDFCA5A7FC32001167155659F41B4022A9B15B37A197FC7C567CA63D74B4E9D286100861658139A98C868EBC9207237A5E4BC26EA867DA305A3C3A36083C9F79523B45F53B8FD40591304836B8520B227905413FBCAB24B22A7D1334452045AF354A4690455144390A381C1172C18D865C86B159AC944906F298A00571B61420BAA7E67787AC2256EC7217FB0C00C48960165CA6E4416059A4CAC2CA9535C8DD2265387B1E18950A7C917EC73AAD76A753E0D4A285B19089E264B6A53A35AC523FA955A4B48FCA59344503B12675B6C6C99593EC996DD9C456D842054A52DDE1106E89A30B5732FBF5C88BA98833A26FB47350D0509B17E8BA76878C2FB485B7CB5E7B4C73F6929FE09B54A09454A7145A4A812C26240EBF4126B3C014D82BC4BFA186D2E2A4FCFB57E2205FE91195E1ACAA18A3699D1BA700770482C18160082946D85BE262136B7B1F5BBC00D4D20A1351C66966CE3C1A06EBF35A43036A5498424C73BA01C250C61399CE951AF176C96F317B0A23395164075A23A6D6A55916F5032310B5E28B1B970C3AB75B4058C86DD9A73ACE89B9F5A272A86B433AEB9AD755B166105AE0095645910E0AD6045C075B82596140213DCD231C03D0786C186C95342C01265B03A2A113374307B49062727C82F2CBA44862C7691703374AD76B772DA400C283A1AAE348EDA9582B9B42196216A8218305309C367648F58785B74A9E4DC068318BCE4CA87000DC86ECC52F2D465762A58BCCBA755E7A881AE5704C643278E784E646C48AFC3F240A728C4A6D2B6523EA3499C9344294293497D3A4A3E2373BD2CB48B0575DA052253693D1DB696DA0057B2243525AAB17770D61D09D0F3554D10AA7A56B6CB9A81F59EC73A1FB9A08D7BB08D90F70117A2988409B870AA2F82447E14DE7B3C16503CE645BA54EE5C6E71909642A3F76620AE0D479A6440AA5E457A946A884D0C741A2C7F27C9EA9E716EE1C01154120E777930E991C63E0A3134B030A8A0E220758C074484FC7019C5AAC212246F990C41A5B5E468888A5280A23057CA0B23947F332213A86910912C090421D4A008CC219C9C571AB09A9C59C248FE71A2C928D83E6C4DD5929D4D1B8F0CA98F4608F89EA1D59F063D827123026C7EC093A6360590BF54BA041C2C21473DD89314321B334680CE65B5737857D5FB557F1967075C9889266298F332A19C5888A3497F0580B8BE1AB4F7A300F6248B4D99431E4B9CF163E9B969FD7B664AC8248789C2866D05D01C579B491BC50C8099C30A0E6076800B00CB27929ECC8C9B7C44B32781070188B747C6EC1997017E8435035CAC06B2E74D54EC8B64E2A9B9BD6351604D3875C394C183B4B7D362866C96A78569A9E88C2D8767FE0CC0C55C506E5A50B1FB9CC18910D9F22648681CA8C66529EB3665E08BDDD725146C343BD7B9E51D37F57B602E012A1096793931097228A1536715923CA93D8C41816E04FA27A16F6EB50BDEC8A26D99FCC1901938B7475731DAF85C2058832315B93E9DA81B415B707F95EDC44BAD6AC3016E4A16E787E3FC59DF904AC385ACF28EBA6EE61188883CC72E9B298F02D2D49CEE59B6DED348038C7055202B47CBC0B40774BA78CAE78079B9E8A9392CBB57CE4400E9214C3784BCCF94151D510B182403D990C2F8C984B6AAA3AFC21F9F6711EF91EEB008482845FDF60BB5917720EC9C774943E04A7A5FAF161ED557701BC26717ACB2CC059E1308E2AA76D04919B30A70CC698402FA58D927C8A02773815A144128C5BD183A38C3182BCF19DB7A3158B9393C767926F5737B6B60EDDC01FE8930ADC2C4414146A9968311C0B367647911F4AAA4443AD0648C634828C62C0BA01C161162B5EEAA78CAA9A1425F55950EAAF71841250008FE1CA3B8F8421FB4438E65AAC914AAADCB45FE303CD9165CF867A7E9304CABF0B3E1DA63A5FCB56F03753D7074525425131D555B5E583B303B6616AB6EFB68CD5994E9296608700BD3239B03AA6A662FC354E2A49314B63D9E1801EA5127FE653E459B90E94C039D812DC031D536C400A2A70B860A9AED7BCC286182933C62F7C1E73B615F1525F6A165DFD4461AE0B856B298B96CB6756AA2255949255E6C95C12A969A698D37B6FC8B7B16BF1AAA1734DCFE1160D319B25236F591C7CFC8A08FBA48B42586F3371B0AB061C92F9C0E3E350DE5941C9F380D876480C2623F526111D676AB33ACA5D66185655A94E13418576B632DB8A0D3830738C44AF9C979514254ED8C82E34AE5DD6458E2039690B8492C353E2F0937887088B4786BAE016104648C0544482C562E0D2AADE390DC03765C7C1353634B83AB66AC7E1306378B5032B3148BB799E8B4907188EFA993FE72C73E3162F2DA43F0EC7C2F1C162EFFB5659A947A3AC6203B1C825125023926115605CA1909D912A0108C0115FD75D967BACF32B656EA64BB1808D1C1B43E8D7BE02EB6432D89B59F9A3FD109AEA36ACED2A137214BDD8686D977A68A6E4B6ED6C916A8594CFA3700AF608CB6A91AF150077D5A40EA4471AC19A7177B1E6A6BBD8A357F416BA8935AE73829A5B035B79AE8D108ED5D05A089242ECDBE94664DA47F187D3D493AC23E7DE32CCA3941492845F6502143FBF02028F22B12F1ABADF29BD12458E5B698A875B78F8D30AADB59FA617EF807D5C23113A9908342F08E898E02991CA1D7B934D + +z: 384509DB0E97D4689A3CED953CFBFFA9D3B3B87CCB0C6A360FC0DF3CBCA399F9 +d: 2C34B1476753095D0C8A48A00136F358A98D1416E5069CBA4540C6E26FA3634D +ek: 6A04C9598C985A554021C437246C8E1DB67F69B6092F7A18BA3309245480FEA533B478726E4C761568A00DECB368F104B1E908F1E9BE85022D6998581428881C6C1B06A89141831DCEC1A139303FBFD04174F06E81D09DA38251ABC33C32422917EA165FE821793BB13D553EADD9AE86C750A7C307AC6467F117B778ACA8E1CB8360152388EC20742011FA66C786675AA4813C8CD58EA2FC9ADBC4AECE94C1193B1799306D6DE532EB32928BD5957484B6E38272172B902AFCC4207958A433058280713FF055A9FB0FE6A3C79564A75C32AF13B4338CE1ADCC5825E9475C66201B8E6393D493001C29A44BB20326DB06983BCBA96805EF0573DAB1A506C33150A974EC96462473CA7AC7066F374A131854EF01A99A30770B0B508CDCB2B5D2B5F2208005378AD0935243EA61C8D876A1602CC047871425CF33BC22E07A94C71737BE251E75F85594F523B4CB241E97AC0306B8663075B8B18ECE09332991C774E225D7722DC1E87052E19293F8B802E7366A3C76D388351B63A11AF5703B4862699124E574B0117788DD89C8D7D2BC34806DCD183F28784E54B2725EDC9A797B1A9F110C0C91154BC927B06C77335A07E372B5C10C4DC8C5BD80EC79BB68AEAF8BAC1C583D4055C5EC4592462C60165C636F2A5FC3F9A0035B0094755AEEC7B076A7C84F8C3DA994C9C2C10C1E17CE56943933D733944753DF2546342890BAF305BA3B08628727BBF492F7123CA6DB9E067A02A7FC20B9138E5011A9E08116E77382C9AA594BE18470D0B9B3CA82FC652398A3B7466065732030F8622AFB4C29A88B1F8539976902AE18C9C0EF10780D8B405EBB37D873C6FE4534B8AC444D8A7817F6CE0C36B8C53AC03328B8D4B30DDA4111A7749B6476516B56147B3B9841E29D20520EAFC9247D9C6171A1165C971941A06CE6F58EC0A5B4FCF21CA78857BD6B2F0706BE3F568E380C24E537C31D74B0202014A24321AEE877B7E457FB669903A30D39AC9188239BA29157ACC82AE671C75887C0F1C9AC11DA5974E438EFA438467755EDB0C949536274DA3989972356A845811273E5308DDD4A3774047E7F347330133322521586635622937867DC549E058AC1D65BCAA8C6DED93C52FC329DD038DD244428EC602D0B11D5707AEA029328B61BFDE51B4EE3BA4CA8561031BD939ACBC70276A309D028A7674C736668D1735EF83B555689DD5790852916F450812F0A809C183A4BD2AA79B74FFEB232F3D67EBD0B3F97037ED8EA8A7C6CCAA4D300F3E01F2B8661AAC39FAFA78197A2482ED4745C56C757A692B1900D7DF921D6C35580F9882CFA294DFA0DBFC29BA21C9F648515EB2A81D2BB0F75941C1C1C6541D949A5454D96FB486C79B11BD9B56F45651B3567C75A261CB5C0B077352486C37715CA8D4CB727B167567BC58A530543047C1FA2459F87C837623C5B2939FC53AABCD5B1B8271A67C95B3E33C2D9922836A25BD1E61692BB36FF87229779AB75A883B26CB6B27553FB5782DC3C62D70C4AEFE86A3A36934770834142398187983D766BDE4916EB76852D74010E221460C4C5FEC132AA77B618AA0F81EC6A8E83BE7BE37239F1CEDD206EB8961F0D2AA3FFCB272A0785A36537240274C9993C4904A731995A3019CF6133C714185A449376565A65B5C2B1DEC8896C1BC46A1575CDF80958F2B96329791C208F51B4A8F41A8356000E0F1C51EC584ACE4434BF0035B5127478C11D659B842CAC49AE873F8192659A5735F87B7517B118748A74B8020D2823A25952CA3F43C7D3614741E054DC0B5E5AC11C8FE15E7F908A7B64B3016A39218134FB3092E7482E7399310709BE369CA383E95AD08718CFBA21F9DBCC8E0600DAD2C39B368A24E79DB0DB02395949CAE835AEE683C4A6AA6024B3109C18DC2BBAD65BBDAA52ABA6D9487EE3194579494B2441177019C0BCB78F8A2FCF7BA875548C1C3603AE3A874D2454C11074047310D136AB4EAA348F05B4662989CC6896DAAA24A94154CDBB30FB5023A37779B1E29F71A841830274B733ACAEA69D84FBAD4F138861FBC35F0545489AC8342A4F6F8C584A8442447062D35BAF44B3C92A38CE11A173FD5A3D8D6B24BB390ACE212E41042E75D50E318C6FB037AFCCB2B069E2BA66AC1233D53031279ABA1683AE42A745D0002805374165EAB94A17EF6881F0BA9392CEAC27250E82622E6F40D3810AE40CFF1F8496 +dk: BC00ADC7652EA7DCA970F2C234A87D9C3340EF2994A79A71B7200F9168CF76D9A301B85A01E6AE69D8959533A53F4890378067A6068C2C8201D373BA49C69FE6EB1716FB6BFAA4ABCC071B191515ECB758EE859D40A12429DA703052947F4097E7E40180477C01B62944CC2CB7E63952921E1EBBC800E1A7385B01E528548A31B0BBD0A5B0641E9160C36236CB58A36555D88AF118C35EDA2276B38D5A8C0C091795C1254D69AB5D4DD309E376BDD7E4A3E1333B3FFA378FDA8E62525201F9458F53443A255ED79B71102A2F3EC347166CAB38361B3E668BEE7588AEEACB5436B1F8E360F1D73999E290BC25C036ABAD878890C54BC8DBB863F8E23E5323ABDB004141C9C3C0963B7FFB7EDBCB545114A61A6B58F8487A07F388F4F5C00E9CABD425B7BEAA2B9947A0482A21572B48E65C8FCDBA214C0204E246CC3EAA069DD42DAF7285ABB55DAB8B2A016805A1C17D46C131ABD4483BAC6B5CB8C36A810DDD100E4A66A58209CA60877E40E2BF58E37BE97C8122D7097ED173FB272AADEA18EF91120405435365BF670C17B99068226597DDD7C4A6A16F844616C885666AB482B7858FA31405B86789CDA046D6561E997689C0D0A461E776C7313E811AC02D1BA8A95038B12430748644D0B933C9E35F685229D97BC810B3203C874673D18E8E0131FBD368C47466A9882F4A41473166C2E240A82D36B983273208EC4008231773D57FC9D4330703565CA8759E7CA9E64130BC5493C9F52C93AB4A7B3754B0F55EE9779CD08B2BFAD71899B75CD274ACA7C2BA9575AE56DCADFF13A6E6C5266BB7AD0D8BB820660023E9BE0FF759202CCEDFD7C3F2048D6B345CAA1C82D479A4D4E2C48A1818DA022435BC3D64B38C811B0BCFC147FAA505AF13740B78945F973BFD2A21A6A040B65214F934154E722D7F195877C5476EE615344462C2A95744956DCB5B2657F27DC2C6AC14E92E8404082D8A0EB6E488F2E56FD0292FDE931057D534051700AD0CA85ACBB5C6C02077DA856931899BE82CFA0A794AD1182CD3AB5E5188C357C3A2D9BD130A62223293DD249E477271C9E14AC48017D013A1435A5976C4165E8932CA032493B33814F90830A5AD75E32F747B94B4C52BF5EB30F73C02BCEC5903BA01F99ACF8B9ABB671B8D219C029BA1A2A6E847E86091C08C00B3914DF8D075C3913C805104A3B4BBC798B9F1D20AFB8118B7F26C32633B39FC792B3358606054BE3693A6E7B9C6B6B3A848A2D0B2ACD1C406706CB590B4B79B82BB88415CFF45376B8102B644193FA1890040127B58BB351862F3227AF18A50A9A983387A8646C99860BA2373337FDDF25CF8916E00252AD07516D1BC5629245EB341B1ED4B63F93044B131C01E301E8FBA5DE8AABA76F70F7D2A3ED4F78AD5210B47D8756E334D32CAAD88C22DBC537FB766447B09A05F1685C24A80F8C3A3202790B277A6CDC836767793D81955BC90A3DB3B71BD8C2FF01A12A59541A666202CA98689528DF9179A26156A6A414BB8DB350393B6B0F35DC163CBA4C94242A33C9778BB35563A8D213A9914225A0C6876B75035201DD14048DE28AF97D77260476DC399B37DBB48F3C943F3C990ABA7068D4299F7D289C6D66D4243570AF38D8FE95384B27E6B0C01258262CD0465F5FB5F424CBC9C39CF5948804F7034C632CB8A7B4ABC3095B174951C42364B05396E140524B989A889CDCFCA4F222830A98B041338A0273478E3661A5D44214A52A54EC65E933011EB7148EAB94E58EC1C9CB9A0E61C788880B15413B8365A929342B667005D6A35BEC272955F5CBB633798094A0DD84A09B6A04B16BA9D1C005D6B1708CD4300D26B506748CB7B4CCFB59818FFFCAC2A141ABCC1AB85BBA36C69608CCA475BDB61A56BA2FD6B2F75F502FCBA8AE05B11B73A381A810681EB0B1F446007267F7C12526BC3B430CB4BBED0694C290B0EB238056B5C64C1AA072C97F7173647BCBEB75965BD71C0747503929ACA0FD98EFE45C744A4B5BCC748616A8B24C5BDA4F0B9FCD42767420971A00F32415976B5A4DE31C03B10858CF1995B7B8526FC352A0C99A57095EEE0B8E7E40364587623B00B1799C807289DCFAB746B06C3E2912A6D3778FFFA8C1B43A39A433708817E7058C03698268E9275BCF21FB73052874307FE56CC8A384E6A04C9598C985A554021C437246C8E1DB67F69B6092F7A18BA3309245480FEA533B478726E4C761568A00DECB368F104B1E908F1E9BE85022D6998581428881C6C1B06A89141831DCEC1A139303FBFD04174F06E81D09DA38251ABC33C32422917EA165FE821793BB13D553EADD9AE86C750A7C307AC6467F117B778ACA8E1CB8360152388EC20742011FA66C786675AA4813C8CD58EA2FC9ADBC4AECE94C1193B1799306D6DE532EB32928BD5957484B6E38272172B902AFCC4207958A433058280713FF055A9FB0FE6A3C79564A75C32AF13B4338CE1ADCC5825E9475C66201B8E6393D493001C29A44BB20326DB06983BCBA96805EF0573DAB1A506C33150A974EC96462473CA7AC7066F374A131854EF01A99A30770B0B508CDCB2B5D2B5F2208005378AD0935243EA61C8D876A1602CC047871425CF33BC22E07A94C71737BE251E75F85594F523B4CB241E97AC0306B8663075B8B18ECE09332991C774E225D7722DC1E87052E19293F8B802E7366A3C76D388351B63A11AF5703B4862699124E574B0117788DD89C8D7D2BC34806DCD183F28784E54B2725EDC9A797B1A9F110C0C91154BC927B06C77335A07E372B5C10C4DC8C5BD80EC79BB68AEAF8BAC1C583D4055C5EC4592462C60165C636F2A5FC3F9A0035B0094755AEEC7B076A7C84F8C3DA994C9C2C10C1E17CE56943933D733944753DF2546342890BAF305BA3B08628727BBF492F7123CA6DB9E067A02A7FC20B9138E5011A9E08116E77382C9AA594BE18470D0B9B3CA82FC652398A3B7466065732030F8622AFB4C29A88B1F8539976902AE18C9C0EF10780D8B405EBB37D873C6FE4534B8AC444D8A7817F6CE0C36B8C53AC03328B8D4B30DDA4111A7749B6476516B56147B3B9841E29D20520EAFC9247D9C6171A1165C971941A06CE6F58EC0A5B4FCF21CA78857BD6B2F0706BE3F568E380C24E537C31D74B0202014A24321AEE877B7E457FB669903A30D39AC9188239BA29157ACC82AE671C75887C0F1C9AC11DA5974E438EFA438467755EDB0C949536274DA3989972356A845811273E5308DDD4A3774047E7F347330133322521586635622937867DC549E058AC1D65BCAA8C6DED93C52FC329DD038DD244428EC602D0B11D5707AEA029328B61BFDE51B4EE3BA4CA8561031BD939ACBC70276A309D028A7674C736668D1735EF83B555689DD5790852916F450812F0A809C183A4BD2AA79B74FFEB232F3D67EBD0B3F97037ED8EA8A7C6CCAA4D300F3E01F2B8661AAC39FAFA78197A2482ED4745C56C757A692B1900D7DF921D6C35580F9882CFA294DFA0DBFC29BA21C9F648515EB2A81D2BB0F75941C1C1C6541D949A5454D96FB486C79B11BD9B56F45651B3567C75A261CB5C0B077352486C37715CA8D4CB727B167567BC58A530543047C1FA2459F87C837623C5B2939FC53AABCD5B1B8271A67C95B3E33C2D9922836A25BD1E61692BB36FF87229779AB75A883B26CB6B27553FB5782DC3C62D70C4AEFE86A3A36934770834142398187983D766BDE4916EB76852D74010E221460C4C5FEC132AA77B618AA0F81EC6A8E83BE7BE37239F1CEDD206EB8961F0D2AA3FFCB272A0785A36537240274C9993C4904A731995A3019CF6133C714185A449376565A65B5C2B1DEC8896C1BC46A1575CDF80958F2B96329791C208F51B4A8F41A8356000E0F1C51EC584ACE4434BF0035B5127478C11D659B842CAC49AE873F8192659A5735F87B7517B118748A74B8020D2823A25952CA3F43C7D3614741E054DC0B5E5AC11C8FE15E7F908A7B64B3016A39218134FB3092E7482E7399310709BE369CA383E95AD08718CFBA21F9DBCC8E0600DAD2C39B368A24E79DB0DB02395949CAE835AEE683C4A6AA6024B3109C18DC2BBAD65BBDAA52ABA6D9487EE3194579494B2441177019C0BCB78F8A2FCF7BA875548C1C3603AE3A874D2454C11074047310D136AB4EAA348F05B4662989CC6896DAAA24A94154CDBB30FB5023A37779B1E29F71A841830274B733ACAEA69D84FBAD4F138861FBC35F0545489AC8342A4F6F8C584A8442447062D35BAF44B3C92A38CE11A173FD5A3D8D6B24BB390ACE212E41042E75D50E318C6FB037AFCCB2B069E2BA66AC1233D53031279ABA1683AE42A745D0002805374165EAB94A17EF6881F0BA9392CEAC27250E82622E6F40D3810AE40CFF1F84963DA07CBAFFA3C26C86115A24F33F1FAF547933AD64AFA40EF5F0DB03D53B340E384509DB0E97D4689A3CED953CFBFFA9D3B3B87CCB0C6A360FC0DF3CBCA399F9 + +z: 63DAD9B127F98E72A3C65ACF4B172FDBD9B9C39F24F728D1F40EB02C9949419D +d: F742E7B69E27A57A43E1034CEB5834CAD57C380ABE259F432F96FAAF27F981A9 +ek: 0C25AFFB80C5BC12C3CA5357097716E75B025C298F040C5AB8C92F93A08A91953277A7CAAA1776440C9E3A5C819D7B9BD58AC0A53C83D9635D3A882C36CC3E48959D01E67A4E363273F05504274BC144C5D4B4774FC98638895EF894A78113362EC428E0314FD5119C40811D22313D42362176E001616901952C1100C59E33428EDF13C68086571E8A65D042556A6A3B18582F79B443EE22B53631C02FC03FA6CA4BF4BB0B8B97410443C0A3CC958AD42BEDB3118254C19752AA70076FF8F312E50433884A72F287266BB83A417134CED7C66EEC3A9C90043044B61C795CA69B8EFEEC56D808610EF5B6FF764A59D308E60B64B577CA70487D340BA3C8027C45766D270969B284B54DB8A29831939174A2FF274F7EC131858355C23624CBE7B6967288C0B660ABAB4C11C2106F98909AA7AAF50BB1CA0221E1CC00B31696DD05C3E46C7CF5A22B28E404B171A8BAB14146B740B946148591C0505CBDA8E2456809D019E6183D4B10E5F9C6122A7E17D579C5AC4FFC62CDC9AA88102CC386E50770E36A257BCCAB1826BC07D0CC58AF9C49291DB9A63753CE3F9C2AE190834AA77662BB5072F89FA29A2388E532361537BC28310A6A4133B5A0A4795304117839832C8AB7A397141B8A3C47A52689BCC26E3851BE6524CF2FACCD8037B69279021539BD084B31FFF084ED7AC403EB8BD3EB5F409B8778783697B5512C0B91B426714C426882F10DD165C91EFC240C2B129500595D08A5AF198FD8C6A1A9D497654A80EAD40E8B3347B7C51F2E220C1B950788139DD07B6F00B1789EB0A7AEA60844339F04DA7811824F9544320064725B809862447397786381615D3EF4AF575A4CB8FCCE137A4C85241A72BBC424343A3C916C6E51BA58768855C29EB17AB4C8C8C3F3A0174F5979AC02795B60716FE96BFCE517821C254F2A8DD8D77FE778B82E3A53C8592048104FC959B23FE36450913BB1265BF91978FBDACFB3601DDB978CDD77314C8102DAA75D1EB8266137CBC2956714294659809E029067D7D6CB6C93148FB102C34450118835C85509E3F980446767FEA734AAF7C8ADB7CB11435E7600842FF96ED8C75FEBD643BC1A34D1666D8B6B9EDB2B8C72AC5614C603AC200D00461EBBA069EC751CB3C36A60616C73CBB8B2C17798358CC4C588BA3122FAD04D97D51687FA3B19D465F6E9AF95C68AE5225FE04A14BDD61B54A502F820C9DB0256B11AA524F463C11A21F1610DBD800A3D690E0139000B026B7C1628FCA3365A358FF8AA01429CAB2106055144CF0597C2DAA1A623DB1A85730AA0046127287BC407073E9C7C74042DDAAB008CEA58B8DC7765C85844B3395561A4772B5D4D551ADF12687B18C63260518576440EC7BD699843F5651F5E04B25085448CD138257C2E2612733ADBA6FE7357F1C366FBB1457C2458C4F848A24A1BAD74B9A2AB1A603408C540C091C6A100850B4A327211A7CE336426E7B250D50012D7262EDA4218C3B1A55D50337C63A9790406A846CEC038B15D157DDD030FDB293B187A63BB38208F075599803E29149B1F097B1867BF65EC69ADB00ACEB21345E1ADE7E5A36E20B69062C5CCA550C95331F069CFEC59429531B4380A079669C777764DCA8ACD8087AC091CC2B6075CB9436A3B4C22AFACBC0CFB95D361C2232390515A21C37AAAA839005AB97D6962BFDC8959A51ABDD427A15BE830319CCEADF3BB23B59B63452F6EE2956D11C47E721FFAD1724CFA7C1ACAC3455C6E0A75834A23AAB786079947ACA32113A2223B2446790738B464A94683D47357E8847063539080987BC742BD149756541F94D5539E886C13FC1FB291BD1FD8445DC47347072D063A71F9224A85366D3364A1B97ACA267C717BECBDCBA78FAE3BB589BC8794FA2D20A8CD8D7B58124843B7E46FF0F629EF92105DC43DF6645ED57BBDA265874B63A193D351BBD0A5A48CB819979C2A57A486A109957487B51AB7D8283076585E6F06AF66A7B7776BB219911391B67380215FA2216FC061C441B87AF6AA077E77777AB3C7101911B3DC5C1D59952879C1DE1B8741A24C4CD28239132E89024C357C76BCA7CD4696423EB6C578C53C32098E8CCC41321C93CDF79A0DF21B6F69C3DE80C9EBD838B7FB0759165DFD7A6200B88588E992CC173E0A6B0B87554CD2C3C4D42B6B575C9180F1A418D8E400CFF37C23D4C3E3EC2627627F6BCDD1E1F45D7E +dk: BE49618EF5BCFD880DC312BFFDC519EFB4269D0B2391B89C01D6A6B05063346A4BBAFACFC8C091B64CC1AAA08D6F40BCB4043BAD7416858BB4121567BC380C042C2D90244943028DFACABBC6219060721832241591BC030410064E45149CF96C36A6A1FAEC889382340A5BBFC9193DBAF8A43CBA44BE25143AE10A33C6AF8541AC2503835E0743BD74CB899373BE77987492A071E57027C688A2123F56A5B3D268C1EB70A21F6A98BD239F9EE5927F21254FA5BF11F41578AA84770C78B9642E2F3C94EAB1CA5D10651F90A1E49033074B78B6F2C9D0D784C7A931E2EB8336F8802EAC29DE8737EF897FD0A31A04F76B30B5C6B68B7C3A2C3CF0C5B4B313A83F70A59A84901C8B819F8502F624368C493231C19340D67EDDE503ED9805A05A3E23102E6256117D9BA283619F0CB3373E743B2771A7D1B020949600098A40BBBBC364F6AE171BC6FBFBBFACF25B0BD37102D336EE1438022AAA2DEC0ABDA6689A4595A18161C7A9728A0C9B4F74A65D8A432A100B1F46263BF525024876B334CD8D9A1BAC2599F1F0AAADF04E7C83C7EFA4663CE59873533A0CB84AB8EA28BC9B808CE71832D45E4ACA223D7CAD92699B2DF37E080B6F3B6861C95A210362C5FB849EFAB8A845C25C375078247C397143C839F45569786E3EAB14A05679098B25785ACBA2D49C4FC47796271949795925A80EC53A8F7DF6A2A6488EB4E991CD7976584A2FE301CDAB93A57070148F8AAA81141BD932951EEA748D6066FE3B9D60143CAA0339CB8AC2530A0AD0EB444ACBBDA16B0E6A0A6E54885FAB6170A7723F4E3B23D18615B6AC580B2401E485C3543519BE6A5590C7469FF47A3DB91338A5AF6FD28A91720402F70DB8A491946192AB573A6E668CDC7B702231986C114EE18902C78A3D92D1CE616511A66999CF5C0071E615E8A7857D561B0B56C3C35560DDA90A18601B8650AE2520784D1257B3A7339C09B5CE95138E57B69FE90C1F97C03280C0806BC366E75E0D3CA2D355A2E2BA661EF0B96F556C50656724567745C1B650634A8DFA4699222010C59257C38C7D202328767663127DF2F294B00390F674C021B1934F65514AB125132B23A0A427919946D1A96A84491C353405F505937FFB8FC0813700E37C8151386E248C0BDABF1961B2859BCCD9B33960E424A87042D45A6AF180B2CF77B25B7912001C958EF55306927E8DE71488C0BB2C7C8B71767403B6185B41C22DE1BCA99AA86297A2A1E17015F553B967720B159160843DE88B3D033B4D5D563326547A404B352466C9A82415B08A54456B37037971B77A937A540A2DE05B91EA5E540996C8D15452467D0F81568DB2482019B783309F77867175A4CED0A0660FF2AFC1F09B09A03A7BDC1621A613AA4C2571B23FD7C1CECD5B75559C37CDB598AC108255479667E117F51B0E30866F20B087D9088765E7613F3584CCDA8EA7A13CF8E5583EA353661AB7A42A264F9AC6EC529C2CB7230CF45D2AC1B95D729F00B8792983AFECD44B3E88A197D34E2447490729BDAE7547B7119A970B0C3153B379148C4BB61472662669E2510C76549102187D891E56C20A3328C03AFB32760BBF09F604AB0B5C5DCABC83E80CB17A7BFE4B147F6670128A80E93B359191424C80C47CE001D926C6830962083B8BF1C03FF9F1A1034139D974229A581035E73F7CC10D56B281FE96755F214738B70AD6351F8F30CE5DC5555F6B69B806C5D2574553E7C94362A623F2C4B31502FF8094F6E08394C880EDA1299B2C03F1C696D80C3640584C13789E32192A27B38896884F6DF0BDE386A1A327C5C52314A4BACA2D7928AC761AD898CB4298905AA76ABE3C5B7BE75704317D44A9C98FE59C812C88A6E334C0163EDE8AB622F351D9F3926375291B5510C6E3AF2641A65FBA17C7778B9B2A6C2E5BBA6BA225EA40CF4ABA7639D488ADC0A970F6581213352A409065CA92AA8694916C57796B42C96C830FA84C6C70C2640C495F10A48D1A210BDB8BD0C20EF2074825651C5D9B3EC606351B34796FC578307CCCE54A2EBD648FF051CA6FC9AB0636CB6ACC49109343F1465052B57404D46EFDF856CF330E539402DF699E0576953C497A9D662E768ACDB8A9822E3A9271C401A364B1D060924B84939F7110B45012EA36121A4A91CD860258D559ADC0530C25AFFB80C5BC12C3CA5357097716E75B025C298F040C5AB8C92F93A08A91953277A7CAAA1776440C9E3A5C819D7B9BD58AC0A53C83D9635D3A882C36CC3E48959D01E67A4E363273F05504274BC144C5D4B4774FC98638895EF894A78113362EC428E0314FD5119C40811D22313D42362176E001616901952C1100C59E33428EDF13C68086571E8A65D042556A6A3B18582F79B443EE22B53631C02FC03FA6CA4BF4BB0B8B97410443C0A3CC958AD42BEDB3118254C19752AA70076FF8F312E50433884A72F287266BB83A417134CED7C66EEC3A9C90043044B61C795CA69B8EFEEC56D808610EF5B6FF764A59D308E60B64B577CA70487D340BA3C8027C45766D270969B284B54DB8A29831939174A2FF274F7EC131858355C23624CBE7B6967288C0B660ABAB4C11C2106F98909AA7AAF50BB1CA0221E1CC00B31696DD05C3E46C7CF5A22B28E404B171A8BAB14146B740B946148591C0505CBDA8E2456809D019E6183D4B10E5F9C6122A7E17D579C5AC4FFC62CDC9AA88102CC386E50770E36A257BCCAB1826BC07D0CC58AF9C49291DB9A63753CE3F9C2AE190834AA77662BB5072F89FA29A2388E532361537BC28310A6A4133B5A0A4795304117839832C8AB7A397141B8A3C47A52689BCC26E3851BE6524CF2FACCD8037B69279021539BD084B31FFF084ED7AC403EB8BD3EB5F409B8778783697B5512C0B91B426714C426882F10DD165C91EFC240C2B129500595D08A5AF198FD8C6A1A9D497654A80EAD40E8B3347B7C51F2E220C1B950788139DD07B6F00B1789EB0A7AEA60844339F04DA7811824F9544320064725B809862447397786381615D3EF4AF575A4CB8FCCE137A4C85241A72BBC424343A3C916C6E51BA58768855C29EB17AB4C8C8C3F3A0174F5979AC02795B60716FE96BFCE517821C254F2A8DD8D77FE778B82E3A53C8592048104FC959B23FE36450913BB1265BF91978FBDACFB3601DDB978CDD77314C8102DAA75D1EB8266137CBC2956714294659809E029067D7D6CB6C93148FB102C34450118835C85509E3F980446767FEA734AAF7C8ADB7CB11435E7600842FF96ED8C75FEBD643BC1A34D1666D8B6B9EDB2B8C72AC5614C603AC200D00461EBBA069EC751CB3C36A60616C73CBB8B2C17798358CC4C588BA3122FAD04D97D51687FA3B19D465F6E9AF95C68AE5225FE04A14BDD61B54A502F820C9DB0256B11AA524F463C11A21F1610DBD800A3D690E0139000B026B7C1628FCA3365A358FF8AA01429CAB2106055144CF0597C2DAA1A623DB1A85730AA0046127287BC407073E9C7C74042DDAAB008CEA58B8DC7765C85844B3395561A4772B5D4D551ADF12687B18C63260518576440EC7BD699843F5651F5E04B25085448CD138257C2E2612733ADBA6FE7357F1C366FBB1457C2458C4F848A24A1BAD74B9A2AB1A603408C540C091C6A100850B4A327211A7CE336426E7B250D50012D7262EDA4218C3B1A55D50337C63A9790406A846CEC038B15D157DDD030FDB293B187A63BB38208F075599803E29149B1F097B1867BF65EC69ADB00ACEB21345E1ADE7E5A36E20B69062C5CCA550C95331F069CFEC59429531B4380A079669C777764DCA8ACD8087AC091CC2B6075CB9436A3B4C22AFACBC0CFB95D361C2232390515A21C37AAAA839005AB97D6962BFDC8959A51ABDD427A15BE830319CCEADF3BB23B59B63452F6EE2956D11C47E721FFAD1724CFA7C1ACAC3455C6E0A75834A23AAB786079947ACA32113A2223B2446790738B464A94683D47357E8847063539080987BC742BD149756541F94D5539E886C13FC1FB291BD1FD8445DC47347072D063A71F9224A85366D3364A1B97ACA267C717BECBDCBA78FAE3BB589BC8794FA2D20A8CD8D7B58124843B7E46FF0F629EF92105DC43DF6645ED57BBDA265874B63A193D351BBD0A5A48CB819979C2A57A486A109957487B51AB7D8283076585E6F06AF66A7B7776BB219911391B67380215FA2216FC061C441B87AF6AA077E77777AB3C7101911B3DC5C1D59952879C1DE1B8741A24C4CD28239132E89024C357C76BCA7CD4696423EB6C578C53C32098E8CCC41321C93CDF79A0DF21B6F69C3DE80C9EBD838B7FB0759165DFD7A6200B88588E992CC173E0A6B0B87554CD2C3C4D42B6B575C9180F1A418D8E400CFF37C23D4C3E3EC2627627F6BCDD1E1F45D7EB647A2888D86D41D8661A91766BA969E80B9741B21D1EC6E349B52DE8191901B63DAD9B127F98E72A3C65ACF4B172FDBD9B9C39F24F728D1F40EB02C9949419D + +z: 0A755A829F05597B2F2A90974F22FB1AEAB42892101222967E3A0AD612CEEBCA +d: 3BFC9A057D979EC03A705A9CC406DD8A46C106941AF6777B1D7F79C1508D7B24 +ek: 5BDC0216639954EB53EF77250D2853878BC0183C0EB5359414CAC928E3ADE2E78213904D7DA453E96969A89259822C205FA46CA6703B6D324890E59F0C377C778ABB5ED2466AC929E8AA2E9D47A8CCE606F52B18A7C35C20F4C2AFC99AC327802B856F13BC1D9E3646BF2A2038C454095C147BD1474663274DD50041C9939EECCE460B7FF1605743D4243553A0752465E93C628324BB2D3783EB1B63AE85AA53311C5574071E56991211426DAC6F6AAC3EEA1569B04654D4193DD689A32432447E1A3F0F5595FB37A35FECAE5C55CA839A3CED94AE6FA436A7D34C2A81587CA84018933FDF39A931B03D81491624651A5F6AC75E08077FAAAE8AB023D6344557D15FFCB91C10B06BDA114C5C133F3782C309C347F2A4434DAA89F202817A227C1E1240FF41A4F3CCACFA497CDDC53AC5B0C55614907865118C2C7AC0D5031CBC106CB17A26B97755271C86E871BCC9590E1C2684F2C24A172B10844CA44346FB969CEBA1A02B9922F3AB68457CBB1F2BC6B5F5CC4EACB9D0072EAC617B31D27301E002E978925966B642B00AC53C912EA85DB59C5506F4724B2C356CEB40BD58AE51843537C537EC97B24475318A5B30AE750691765FEE1014644B1CACC77C9C334805A58DE18121FEAC6BDB61184D2C273AB725C32091CA3441E5140433435AEB0B51B9C57066C43F308A12F782BCA5237D7B12119CDC9AE2E7C65EBC66B3F02A0BE7361E08838114BF0D5250304A36935135C61597A03903EF215C6A223DF8A9515E622932F7A29CFA74807B145A20ADAA7987B0B981B7A62D115927504A090F61B37592A5B4E51B977821E4D92228531D2BA1523BAB3D6C850FB0660646892BE2A006DF51743FA383AC47572F651AB02A272A458B81441C8E774547E1773EE29A6A27BA4E839C8E023A13635922009B1111801872C391641F0E239ACA70CE3FC01E5C3736FEE2AB3F85C4AFE3A0BB2529D6EC047337819084222F0ABE8F859925708AE3E62815083196248720EC28174C01D716AD472A0CB2747EDB932F4A58ACE9E2BADFE468BA2A138EAB864EE00C034C1207F92F73AB084E32BC244951477549B2189568BA28553937E5F1CE6ED1B7F0C1012560296442AA6DA0879705A65D77460A86C0C06422A2E6949BB78B955355EEA2749BA0948ED094E5D9CE7C79B9F4047BF4E2128E41CA5AB1BAB1A87A2565CDC018890D426B37F01713DC923CD372605763C3B51A5AD58109F031BD665192F38EED496EAB15AF89DB622DB73A88BB6104D44C49577483F468658A9C72C1A2046252DF7840325978589A85F07C7572E44445F9A8854825E784706A25A70ED0CEC3F5A372C41C54185294975A70AB759B4250E1F2CB35E860ECC25932F55E6991041AC24D56BCCBDA579E421C905469052A34225AD50B69E191B4A36EB7DB1DC1216BB41524497B279230053E910EAB49859D1A99DB3C56CD70995BF031FB71B0AA40CDF031183E5B3D8D8799CFC3ACDDA54010AA6169A80D62479583111FEB337354F6BDF36A33279B7472800EB604710AB94A0D584942E41B78F2C387993A5EA079F3C74207F7972646CFD4E055FB6B10BC69B369D166143B8A8E7400134999F05C6A26DBBEC3B23D92CB90F77156A0C8A96CE93F73962C17F8104B52AFA2B68B62810F998577E07CB16FAC499F38AD628B57FC1C9CC7A568410478176BBC14C8C7A594A07A3568B503BFE26BAD88D2CAE92B90F1E1472E9697F930B6E775A1A9B93EF62757B2A28F6962CF2C1478626A9B65B5AB89CC24EE4C9F765B8071737C25F383DD57598D2289DEE439D28AAE91A3B21E389267FB3D146276B7810D126AA5D096A16F679E28D5C91A580777D9CEA13C46234653634ABD964C720A11A6514A7FB7F5ACB0992BFC7C16FA84CD9686ACDFF2283A89625BC65FEADC9171ECA359BA50BEE412D31414EE110AD1D8748237941683BF292618F740445C0B728D51347928559E569EBFE896DC6295F87517AB31A8639B50C0F3A08E96926816B7B17C8ACB476C4C67B1DF7631DF7540276C99053B102738BFA2876E42A028869C688C18AAA9B00DF0F3A74CD81D86D161912C09362AB35BD8731A48CB45CB92EE8A3374B811EEF93A37F17DD7D8AFF88958E13012E6F7BD6DC63E27BC47F506048CE24BB7411538EB4B969656DCE8DF5ACF28D1BDF5ECD14A44A98350CA45699F033EFA44D25E93FC2094C49E +dk: 18A2405BD102699A2B22168A31D2C0E7F946160428EE787E8C6C57ECBCA0FD170DF93BC66203A8F06A3292310EE08495D1BC0DAF2A2D92C243DAC2B558291276217430A08D11B9C5DA411F2D55406BD4182913086489B43D74C602780701295A4C0054765338695231E6798020E7CBF1697573474AB35B27817BB38BC2313E70AFB914B5ABCBB28B7124302B338B471FC89336D1C35FB6D59C007402D1D19A1F96682F7551D8527EAA07389E55A8080791178407301ACF22EB32E0F7119DFA0E623035364CB0243B19918792011023A086016CE39BDAF0868FB08A4E1753B00B444A807787EB973CE52F63650B12A6B51EF435048A9F7136A5A77A99238763F433C00813C5CDF8CAB21B445630AE2D733F7683701242751F5C17A4F15FAFA5AC7E5A231097AD06299DD6AC194D1ABE895A0315E834BB364C286C8CD0216BB032B59D797245F40D624872036BA369355AF73C6FA5540BEC829112F28294191096A8AF53D37C5DA8B151330098582AA06C5455408765D43FE5B24C9C0471C9C85243C205747A43ECE8CEB31CA87BB51B39D15433F99D6FA638BF02373D42A09079399B4CB0A371984061370078A677E166D3D7B82E3174B58885D280A1D44911EB0482C58C7216D5A22694C767B9CB35BB0A1B0271471C558546037BE5585D43C40F6705D8C0C4579025898A2E21A0C5B0A4A42AB290E1F37D58486631210EFA0669819A90742926CEC68B1801B44D597E2CC84661917C9BBB6E2FD4B00D11AC616A245088B6AE323332FA40CFC46845842B02328D6E9A9246632DB8FC960B9340DE367A25D3996F48943ACA2656250D823BC999250C357C718A7CAC1197868D68C70F324391A75EB88C09AE835FD732B9047AC4DE843A6D00BA1EF79AEBC350B1D3541B874C3105B901441BE9F9663C306E085B0B0F98A4132586111417346B85AB5C26FB0522AFCCCA2168308803243BD1C1611574533466A1F709027485D680BE09624B03944EA5399E62A3A8A005B74227041E6C394CA22DBE3A6666541377573AC5357106400B35473B6672A7D4517F1C91A6A1266D25809B57720207E4CAFD88751CCA82AB54593CA126A0C60771CBC49535CC9A83882DA67D6F94BCCF7A5B605215B874C4786B24995A83C679BC12E870C61A3820DA5B89C0863B369A6C79B13ED67099EA02CCA1B9523529992A215C525BD5D37A39E69891FABAB70594AF8119F356A85587604AF35CC3A01692047576D97456BC1BA23639D4452A91C40A732509C70C83CFB080CE2BA6F29A80B0066D10A96A038C72CA7B6860594EE3C7C592016E147C7FE478B90F8A4CBEC166A3C474758642EB76CA3B0A806B16CDA19013986B10A3844A0CF86455F2808429B371A0592129414FD31BA24C995E303C776B014BD35CC644095B7140F2AB3336D55DE6D54F9FF244B6CC8580111C7DB2492A32A073E0196FA256A92CAF6B431B6F6053E52C308D6C0F8D86001258B78290AAAA85C9B2059A931833A6C82825B332943ABABF65451272AFF4BBC0FC279B603CC1E97C18F40641DF91776EDCB7DE245DF98099A9DCBE5B1C6C67FCAE6FB18A4F950833197364D94D224B8D29AB8860199CCF8CA3C8D1217D99484A631DC29923AA582FBB2566A44BAA1FC037C139CA3AF90D9D0516E7B0732F552BF264325A121F20D393C8E794D1E32A3C12BF68C849A6548BB308753524CE72130F037BA1C02A50162CC10437A5337C6056E850E2319474AA21AC223F8330C43E3A0BE3B0A42227266E6639252271CB2023A55866B004B8B43CCF7E212457157893247201B1AA4728BA476AC7D3B303A6F3BDB818641151BAB769C7BF2A1EBF027A79F81214687D0886C99FD5A46C8B4A1F5697A98BC9667CA574A1CA283BB4F424237B37C96A5836709C7FC0717537CA95213322E3396A55439E1F8C7756A0625FC23CD2745E63A054C47259025C92AAD22E2DC52045A8467AC069E6E22B65D25C2DCA2BDD31AF5057B0DBE93E3D921341046E89E5618A62C562349F2A646E65EBB64091ADECE8CFE68460FF95842EA6648C89BFB0E5AB1CE11103904AA04C4F55F7C64DD810917B756B02BC1054A8DB7116D0718E584ACB47C679E39232E1C87934D84111B0087C04C86ADC5C7F060D5B639FD9B1BC85775461100FA6BACCAD22495BDC0216639954EB53EF77250D2853878BC0183C0EB5359414CAC928E3ADE2E78213904D7DA453E96969A89259822C205FA46CA6703B6D324890E59F0C377C778ABB5ED2466AC929E8AA2E9D47A8CCE606F52B18A7C35C20F4C2AFC99AC327802B856F13BC1D9E3646BF2A2038C454095C147BD1474663274DD50041C9939EECCE460B7FF1605743D4243553A0752465E93C628324BB2D3783EB1B63AE85AA53311C5574071E56991211426DAC6F6AAC3EEA1569B04654D4193DD689A32432447E1A3F0F5595FB37A35FECAE5C55CA839A3CED94AE6FA436A7D34C2A81587CA84018933FDF39A931B03D81491624651A5F6AC75E08077FAAAE8AB023D6344557D15FFCB91C10B06BDA114C5C133F3782C309C347F2A4434DAA89F202817A227C1E1240FF41A4F3CCACFA497CDDC53AC5B0C55614907865118C2C7AC0D5031CBC106CB17A26B97755271C86E871BCC9590E1C2684F2C24A172B10844CA44346FB969CEBA1A02B9922F3AB68457CBB1F2BC6B5F5CC4EACB9D0072EAC617B31D27301E002E978925966B642B00AC53C912EA85DB59C5506F4724B2C356CEB40BD58AE51843537C537EC97B24475318A5B30AE750691765FEE1014644B1CACC77C9C334805A58DE18121FEAC6BDB61184D2C273AB725C32091CA3441E5140433435AEB0B51B9C57066C43F308A12F782BCA5237D7B12119CDC9AE2E7C65EBC66B3F02A0BE7361E08838114BF0D5250304A36935135C61597A03903EF215C6A223DF8A9515E622932F7A29CFA74807B145A20ADAA7987B0B981B7A62D115927504A090F61B37592A5B4E51B977821E4D92228531D2BA1523BAB3D6C850FB0660646892BE2A006DF51743FA383AC47572F651AB02A272A458B81441C8E774547E1773EE29A6A27BA4E839C8E023A13635922009B1111801872C391641F0E239ACA70CE3FC01E5C3736FEE2AB3F85C4AFE3A0BB2529D6EC047337819084222F0ABE8F859925708AE3E62815083196248720EC28174C01D716AD472A0CB2747EDB932F4A58ACE9E2BADFE468BA2A138EAB864EE00C034C1207F92F73AB084E32BC244951477549B2189568BA28553937E5F1CE6ED1B7F0C1012560296442AA6DA0879705A65D77460A86C0C06422A2E6949BB78B955355EEA2749BA0948ED094E5D9CE7C79B9F4047BF4E2128E41CA5AB1BAB1A87A2565CDC018890D426B37F01713DC923CD372605763C3B51A5AD58109F031BD665192F38EED496EAB15AF89DB622DB73A88BB6104D44C49577483F468658A9C72C1A2046252DF7840325978589A85F07C7572E44445F9A8854825E784706A25A70ED0CEC3F5A372C41C54185294975A70AB759B4250E1F2CB35E860ECC25932F55E6991041AC24D56BCCBDA579E421C905469052A34225AD50B69E191B4A36EB7DB1DC1216BB41524497B279230053E910EAB49859D1A99DB3C56CD70995BF031FB71B0AA40CDF031183E5B3D8D8799CFC3ACDDA54010AA6169A80D62479583111FEB337354F6BDF36A33279B7472800EB604710AB94A0D584942E41B78F2C387993A5EA079F3C74207F7972646CFD4E055FB6B10BC69B369D166143B8A8E7400134999F05C6A26DBBEC3B23D92CB90F77156A0C8A96CE93F73962C17F8104B52AFA2B68B62810F998577E07CB16FAC499F38AD628B57FC1C9CC7A568410478176BBC14C8C7A594A07A3568B503BFE26BAD88D2CAE92B90F1E1472E9697F930B6E775A1A9B93EF62757B2A28F6962CF2C1478626A9B65B5AB89CC24EE4C9F765B8071737C25F383DD57598D2289DEE439D28AAE91A3B21E389267FB3D146276B7810D126AA5D096A16F679E28D5C91A580777D9CEA13C46234653634ABD964C720A11A6514A7FB7F5ACB0992BFC7C16FA84CD9686ACDFF2283A89625BC65FEADC9171ECA359BA50BEE412D31414EE110AD1D8748237941683BF292618F740445C0B728D51347928559E569EBFE896DC6295F87517AB31A8639B50C0F3A08E96926816B7B17C8ACB476C4C67B1DF7631DF7540276C99053B102738BFA2876E42A028869C688C18AAA9B00DF0F3A74CD81D86D161912C09362AB35BD8731A48CB45CB92EE8A3374B811EEF93A37F17DD7D8AFF88958E13012E6F7BD6DC63E27BC47F506048CE24BB7411538EB4B969656DCE8DF5ACF28D1BDF5ECD14A44A98350CA45699F033EFA44D25E93FC2094C49E47269D7A3C68DB2C273EA465A5A30D6CE94BFF775EF4CB5F323C7EF064701B690A755A829F05597B2F2A90974F22FB1AEAB42892101222967E3A0AD612CEEBCA + +z: 681F088AD6962FC397A1B9071852848CE9A7EDAE65A81485CEC87D0974707B7E +d: 7C43F2E7D9B1D8D9C41D9F315E052A254CE3A1F098671773B53717A95220AD55 +ek: 9ADB4E6D612D58585179C9965CF816553BCEAED61651C13CAE0672540BA9763333A25273B59864FB94AB650C6C41A6969EBBAAC0156A9A3621A1104EF578CF1185001316AF57F75C9CF401C4D2C9C8AA15BA8855C730577F128FA32122FB3B29E3813BA9C6CEA1B38BA069662C954794050C1F18C126542644D04EABB9656C446F8C08C6C6214AF2772264872E894086144B30712811A60C27E24C7C51A99A001D296B3CCB5CB1B9CBF4370208C23294442A9C229D1944B59C03CDD663E06CC73AC493D1D75CC1525993059EB4F61C6EE160AD229F3D015BCC919A90449FE8054890006E6BC98D19B602F142515371B8BAF9B456D04B3A429051006997A961422483B2D61857330F74D5117559213CD766E183210DF1100DA49DBD992A9FCAA1AC5834310AA9E9F44B4B2293BDDA76E22C585DB53CB904BD3292C84FDBC38D793136B12C2AF7A58D88C45B0212F0A083DB0929B1B070C74194EA0620A396BB43E6BA9AE43BAB85C589E93986C746EF4643DBDC1F0EF302CAB02512286F846702D4A3AB69FCA5D2B54C7B603CF5D4AE90705F0EA36A6479329B6461DF47026CA86765A79577F2AE1D8A2013E977FF49296247A3717401F7B961090165E34023E8E373CFC8CA5BE146A5690138532A01F9B18C138D9C7B110A66BC47161B708661FB5B5C507A9F3ED396A163A281B2809EDA52C78511C26CC8F478980DC429042A2CBE73600A8A06972260E8F2C387434FB0087435E711E14896B8841BC751A79FF9B3776217E53287270B26023ACD1DC95395F52546E94E287538D2E9539D8587DBE606748A7CDB76449EC2B0ABAC7170C439A4F2BD3F1A3F349B90DDCC13878024087AC33C38B64EE04427EA249D3C7845629CD8D0C82189814E6B2260CBC100B64039599B1BF91938C2B2C35CA2EBA70B8474522FA6C37A917D7B589F646266D2D07B348169F84968C466C9B90A7B00A6505F6A567D5A14BDD2477CFC0B515C7931B3BC1A7021DE7B2CC7C650097B0D2A94A7B024B207B6969E22C720683084CB998E0C422D1B2FD9969DA2BA9096358AE11A5E101C6DE23C8DC041AAA2F441F8693A01A872E6356D9907420EEC3F55B945E34562C0F3838695643DA00336C1CF1802199E093C07347F80F0959CFCA72CE65E2C675BF9CA8B01F97600AD177133CA15932C79C9781AD01B36F606DC74A648054AFE1B74352A4EEA2095A0120D7C5332D1B7A61DB284A3A0519AF63D891A2546D9748FE768604C27827B6E45E1AA1335AC8F2295A83A6AC9E42D0047AF55242EAB2534C7B38AB65749CD21B0441781E643BC16D03D0C437E03E33BCD4B92A9D32BAD6513FBF595DF30BE0475B69A632928A0B4E2A867E4229525953CF303C47CB83F609A1D20EA1D3146C80BF82061E9C5AD670E4288C01E889E95F937611B419C38563228BB9FA85D3E184109A004DEFA472848AC510CB81E18C5301B149B0264942CBB88F8995737C425E44F50F53B9B2A4C44FB0E5C7145775900D7708D51F21173A9170AB2902CB911BFB82D2D4B0333B1832F043A79A6A07530CA00E5CC58E6B0C2706CAE6A6A52D69C6C0B23C90812116AA971398D154404EC531F3712348D0AC62DFA9A1CC0B01C470E16693327AB9BBA8083F22B8314551712475E187400EB801F1BA34F78024A5DEC89B4C7811E68B30EBC91E08373BB92AC0FE8A861F4BF0A0B5877088371209D3294B866A86BB6B470344A069503AF99730773853236AA12CB3C2F679B45D0025876199C68E676298AB1773C92E33276A60C02FF7415EB10838A5035B7114E9834C5BCCA795330009EE57368B139F9D71135D1C86B0833D2CB81D660C56FCB3EDB848721C72A59A8CF45B6543CA7895E686C26A86A5AA7A8C1734C5F576D648482026391CD611389C44807EC771DEC4FE373B483B00D68F34AF776244EC07874A5C22C6C566CCC5C70369FB92A22B6BBC4F4144BDCE6C3A5051268DC8D6E8A2B8F8A8D48020804880FFA32BD01899CA9D3A70FD62A91B74ECEC51BB58594E7F162C7E94D44D64D66592880C55011A8550833A599375CF9207605784C11FABA854BBE6971065479B6D26589D2C756DB93C83E50936CC0C0089CCE8EE0A08149B732559586D07C4FAB56D7A263CAC656314268F55C64A1D6982E665DC42766D84206BAF103D14014221F2914A06162064F7E475811518022B301C262A125BB439D32 +dk: 92D719984988C65BC4E3E60514E25F64C70318D049A14B110C2196176BB7F9183946C24894F075DE191261544ABE9BABD3280DB7A41B47A937C9597EE995CADC33C1AF87CA2D740F09249CCF376B7D5CBD1B69179323673BD6CD8CD9A84C47B7D232A912F4752BD94B93914427F2CD20C6391CF71F729472095C5D1C3C57E03689D57AB4ABE677909A9895638B790903E5E50D2421117F6A23E7A5CD6A3053FBAA42F386BBD3D82D8B788FF7E652D5830EE676BA978C60342694150A5B28D8A5AAA66C8172AD93D9B3B334C0BB4672DEC182E4395157A0997895BC44C48F3B222C5EABCBF7F2C2973C61B09B3889F0891E35934D4116663A60F751C48E22186B72969EC3BAC346B505CC6699C86BE8B1836152CD6BA37962A23E29B256C555845EF24F52C43DF0C20326841C77E3B87D16C59BEAC267056F40F7117E44C5C957465C09787A52594D1565825243FDE9C568115029F3C378B99F8E28AF395A2119590837B06B75E293682441CD7C5773F5BEFE7CCA172B8DD6EC0E792999D3B40A0439336F2629A1DB78227BB870F44896E112D8094524962F68370AD7092F60375C7A986340D32CC52633B1A714529425DF69BC918A30BBD577E938B6C1D06519078F3D934B7CF77FEB7A179BD8463829AA37D6C449877823231D0EE81B51FB12751946AA1C594ED175607B36D1B7B94CEB8D23B6AA680B9A72857BA61A445AE80C1CF45EF70B44AF6B3C428C8A25689AB8228218C6C0CC858E6A98823E3673913B9163A339327609FD459AFB05CADFCC2943E45A965B54F1A065F68B1F153CC8912329C0F0C0DC605FE6E52905C8B3F1EA3BD0E99418C645A8E6622DD577E9F2BCFB649C1DA09FB8E20DF470CC6317613D788FB544921C325B7B3B7A0A1C3ECAB62B866A513609590E871B17D7866F8A96B838C33A562DD1D47787D795BCE61AD3A9CFBEA5B03290320612A76BC198B0B84D8953909183A14FB318840469E2A909FCFA2C8A9B59E12C77B14A6503829AE8D3B493FB9A6BA6BABDFA7BE215B23ABB5B62C2C6042A909FA9999CFC2A23790548B6055D57B3FCE2C155A6C6115B05855249BEC0887F00369F38379111846946CB25F39305054BAF669E75830A505AC3148299E5AC2B4BF59C68986408270A8CA3A87A70A380EA7AD5871E7DD3165A733AA1D55F1184441DD84183B1002BCA518F370D02D5806498482B4236C8E1B1BF07870C2C7E1D44435077905A5C461238970B603F234B9351FA4213E0CB8DEC764475534AFA18AF07518C573DB0D9790C873A33293424A434B9A933AC644B37B14435D0AFE71B443F83BCEEEC9574016214DA8E66ECCA10668684EB5D776C5B4B2C05C2E03598A602717A72EC4B18E5F550992ABB76A1994B4842FADA39FDAB9DADAB09D6BB9B46AB4EEE69AEBC419F1587B8D7061BE188623F4471852C9294146261A67345F5A2347B206D2870DDA681C44CCFB420708AA398864469B8E08E76081C41F5977893813653A744766125F27C28E6C1DE51978448BB8770B8660B6E4767458DB70990E24FAA35B4DC7571B5EB69BE48C8646586F0ACB48A3B3252A02EF48A7DBD44A5E19177069C6F3F678794B8488C313F70EB4AD6FC09BF078467D362A436411AA689885B987104BC50E00340F8294A06AB8C02B0569B1A6426C13CB9B651677585BA213F7C297A949096B27A02E9510C803EBA002EA423AB3C810595D71F6201366591B60091B305EC7E80371E6DD171DB235D389B480F9C32CC7AA52DEA7714D3004DF5172E034DED271B9C679846A6AC4BE4580E4414EE42CAFED11387CBC98938BA6A59A07E2238B2B54FF6F18D3F48C2FB0636B5CAA3A581948067B1FDB083E92A46EED9B090032655A9BBA2B207EED10D419991AB813140CC898D11B24566970A601326072E15A31D73C0A625FC3E6B697575D293D1B3142F12190B28AD4DB6278CD9A92E50AEB3B60E687A14D2C48623955724582373F16DDE3919A8C7B98CBC514977C5E96895FDB17A952279B8222548EA4B08D4659517A7809C0E786986C2D69A1F7963CE2672726C7CA4A91509856476C13B9488A2A429804815126954C2CAA43F1EA7877BB10346C022A1407CDEEA6322D74C760283CA8699B6433AD16A0DC2238B9714887ACB0315D67139573EAB39A403C3459ADB4E6D612D58585179C9965CF816553BCEAED61651C13CAE0672540BA9763333A25273B59864FB94AB650C6C41A6969EBBAAC0156A9A3621A1104EF578CF1185001316AF57F75C9CF401C4D2C9C8AA15BA8855C730577F128FA32122FB3B29E3813BA9C6CEA1B38BA069662C954794050C1F18C126542644D04EABB9656C446F8C08C6C6214AF2772264872E894086144B30712811A60C27E24C7C51A99A001D296B3CCB5CB1B9CBF4370208C23294442A9C229D1944B59C03CDD663E06CC73AC493D1D75CC1525993059EB4F61C6EE160AD229F3D015BCC919A90449FE8054890006E6BC98D19B602F142515371B8BAF9B456D04B3A429051006997A961422483B2D61857330F74D5117559213CD766E183210DF1100DA49DBD992A9FCAA1AC5834310AA9E9F44B4B2293BDDA76E22C585DB53CB904BD3292C84FDBC38D793136B12C2AF7A58D88C45B0212F0A083DB0929B1B070C74194EA0620A396BB43E6BA9AE43BAB85C589E93986C746EF4643DBDC1F0EF302CAB02512286F846702D4A3AB69FCA5D2B54C7B603CF5D4AE90705F0EA36A6479329B6461DF47026CA86765A79577F2AE1D8A2013E977FF49296247A3717401F7B961090165E34023E8E373CFC8CA5BE146A5690138532A01F9B18C138D9C7B110A66BC47161B708661FB5B5C507A9F3ED396A163A281B2809EDA52C78511C26CC8F478980DC429042A2CBE73600A8A06972260E8F2C387434FB0087435E711E14896B8841BC751A79FF9B3776217E53287270B26023ACD1DC95395F52546E94E287538D2E9539D8587DBE606748A7CDB76449EC2B0ABAC7170C439A4F2BD3F1A3F349B90DDCC13878024087AC33C38B64EE04427EA249D3C7845629CD8D0C82189814E6B2260CBC100B64039599B1BF91938C2B2C35CA2EBA70B8474522FA6C37A917D7B589F646266D2D07B348169F84968C466C9B90A7B00A6505F6A567D5A14BDD2477CFC0B515C7931B3BC1A7021DE7B2CC7C650097B0D2A94A7B024B207B6969E22C720683084CB998E0C422D1B2FD9969DA2BA9096358AE11A5E101C6DE23C8DC041AAA2F441F8693A01A872E6356D9907420EEC3F55B945E34562C0F3838695643DA00336C1CF1802199E093C07347F80F0959CFCA72CE65E2C675BF9CA8B01F97600AD177133CA15932C79C9781AD01B36F606DC74A648054AFE1B74352A4EEA2095A0120D7C5332D1B7A61DB284A3A0519AF63D891A2546D9748FE768604C27827B6E45E1AA1335AC8F2295A83A6AC9E42D0047AF55242EAB2534C7B38AB65749CD21B0441781E643BC16D03D0C437E03E33BCD4B92A9D32BAD6513FBF595DF30BE0475B69A632928A0B4E2A867E4229525953CF303C47CB83F609A1D20EA1D3146C80BF82061E9C5AD670E4288C01E889E95F937611B419C38563228BB9FA85D3E184109A004DEFA472848AC510CB81E18C5301B149B0264942CBB88F8995737C425E44F50F53B9B2A4C44FB0E5C7145775900D7708D51F21173A9170AB2902CB911BFB82D2D4B0333B1832F043A79A6A07530CA00E5CC58E6B0C2706CAE6A6A52D69C6C0B23C90812116AA971398D154404EC531F3712348D0AC62DFA9A1CC0B01C470E16693327AB9BBA8083F22B8314551712475E187400EB801F1BA34F78024A5DEC89B4C7811E68B30EBC91E08373BB92AC0FE8A861F4BF0A0B5877088371209D3294B866A86BB6B470344A069503AF99730773853236AA12CB3C2F679B45D0025876199C68E676298AB1773C92E33276A60C02FF7415EB10838A5035B7114E9834C5BCCA795330009EE57368B139F9D71135D1C86B0833D2CB81D660C56FCB3EDB848721C72A59A8CF45B6543CA7895E686C26A86A5AA7A8C1734C5F576D648482026391CD611389C44807EC771DEC4FE373B483B00D68F34AF776244EC07874A5C22C6C566CCC5C70369FB92A22B6BBC4F4144BDCE6C3A5051268DC8D6E8A2B8F8A8D48020804880FFA32BD01899CA9D3A70FD62A91B74ECEC51BB58594E7F162C7E94D44D64D66592880C55011A8550833A599375CF9207605784C11FABA854BBE6971065479B6D26589D2C756DB93C83E50936CC0C0089CCE8EE0A08149B732559586D07C4FAB56D7A263CAC656314268F55C64A1D6982E665DC42766D84206BAF103D14014221F2914A06162064F7E475811518022B301C262A125BB439D3225F6DF8F68FACBDCE4839DCEEDC2B96D6191CA1DB11F347EA0D66F8C2458A848681F088AD6962FC397A1B9071852848CE9A7EDAE65A81485CEC87D0974707B7E + +z: 40BBB2C581B2D694E369C0DA567371E8E53C328A59BCE775A625C9F5CC185E0F +d: C2E1A3161F3734F44F3C2F1736E149803F71321122242A1E95E55E5652A91F55 +ek: F93584C1B0237F83AE90B664950B471E763CB7939C28D93604C83F73A30F80B3AA8F948086A142A132442712CBD71A9D495587CAC62F98F922E96C9D0095B1502B42DA76B59B1C183338C1C06A730DFC2E889273326593362006EF948AEE1A521E159FF6283DF3D11DEDB1655FC706DEB2C6BE879D3605C3AA463355FC726CE84962500B72776EBC9AA3D960A8084C3182EB8A43918F80EBCE5425257C2237CAC811022792485772BFA51CC7171F86F4C847782BFF123763FA650CB1B173D1AC78F7C19E764F5039736A3B2BF37B67C9783DA9EA6CD0A96FD7DA758E411575F6744DACB42AE2148B7BC9FBF49B4D25CCE02BB906B025EAB98171B80D55C8A328D15C2668A8FDC3A463CA6508E1818437498AA27B04D8514795BC4675C1B94ACEFD54603C498056038D3445745D44BD6F1A4316191B905C650668A3E2402D74E560CBB7A667A27EA4D38495010A71085957421923E21718E611CD5205FFF6AB91C65407C67E7EE19EF0A885EB88B02901478DAB0456D94E4073576AF0542E33C9286048E491ACD2EC2A02E5181436BE7D829AFCA68FE0A78588D886DF77B6F1F94A959B2AFDE328B8B5888569AC34D23771F0AA12C7954EC82A6E71C1760654C34A926DE4B0F07025B9517B2A036577728C7E35653CEC816C3677F703B0EB3C18AEC948368009CB013E365A1E643244289B0AE11440877266C27C955C7773D4377BA2D7C6B8DA7D23C48A19EAA7374A5A9B931F42E144A6CBB8CA06BBD42396B02C6AD16BA6B1E36B2161903EA4A654A31C507825347B9BB177C655B848BD943162F41818F113E864B456D504573B8C4E5B8A07F14713612F78537128253B1B9712C417CCAFB271DCD9683EB82C55D171723A32A5D40EDF9252D01C7ADB6664D6467421920C5B345B2D93C3DFCBCB1DC538D23454068AAA2B85CE41574079136476CB1CA401C1134977E97C72D2C85C37E872CB725A2AB55BB6C37EF2E517608A95C14A970480856A8A5737A06B46E93D03D6384AB8562AF2C37DBB1D52737CA8C5404632C4E9AA714A4A5CD3D073AF069CCDA490C64C42974B57D3BA6C500588C39BCFC4B26CE6119ECDB6A2A47141DA96BA2331996EA93C5D7618F4FC9A27FB6F5BA336F6801938EC26ADE456FDE01D41C22E1424611FB4487D8A2DA212A09749524F004CDC76B8F6339B11041A3174B8FD58B2C6E7B0166AB4246347D25AC489C43288A23A7E59C3CE320E3FCACE6B6277400ACF9E924FD12C0805B70354F3AD8DE92644F8B4936C81CF301FB87A7DC4578628868ABF501626B045D48537F2212A3FA5396C1C857B1084B21B1EB968AD60B43181C77712001290300C9CC2A3D6562A00FCB4E5F11C2AE412DD29181A034725A0CC75E2BDFB851DBFC28AB3362B8CF378BAC9939D340317C64469C27D8F3675C2A962DC7A00E9F67BA1EB8094F0B205388C59223C7BB963D8E21D933B779B360706AC5E06033C1907A8C8EB6E6017C285A8827E28B8CC7A5891CA381FD50D5EA231FEB5A7A4E4380FB5067A6505FA627D19715667FC5602B041CDF9074A3C58BDB9C77CF23F6AD1005C4A6F2581695F444578A734F8FC3E9FCCC07A873A5AD04CB2C724F6820AB1C081306B429F92834FE8BFE401448431BEBC4C7335EA0EC7050A0A49459DB286B774069B161DCBF3BABB5430FF727A419B1AF2371E1441BDD53C03E5445391A401668B693C6503F35CA6CC7A04CA298FFB81CFEAB4B8DF400E1F670801E7014DFCC8B3D8BD953BACC1D61F184A07B383A8325C1251A56E8BFCA75C04CF8653082D52A8D6C944191155AE886AD9AC010AC50BBD2BBA9144785F02B7B7BBBF7F1AB8DF210241F4AEA1700D840AAD5E2761C4066165A43C487B3AFF68BF3370891933BF46C13BE82331F189B678150748AC609B3378C3581AFF91C9A4F2B9C040661E11A917F7A604100E5B9863B8D3B55BE32CC1F40DC47C4F02622863A560F25B03864502F4304F1401B90E4969EC110331A418770B1CA626B3A86659AE9B7B630C6DE1576286976453377663950353BC8067691BD1E1C24C006204E3502C171BD43C33271548EDDAA641677D8D1161152216A4944D480440E3B418042184194C6E39FBCCD353C58A6C3BAD16A33D666D601237F341B7AEF3C98F237E585C8E152B444DF15A768B20104AFC8CE55CDA630D36C048C7D5206708B4699726C1E2FC3A722CB514 +dk: AAE64B6CDBAC89352E7D1311EA15C4C43635D40B98F471A9BB1C1A0B086868D2651546A3F6C1A1F6FB8E75010B8661BE3EF1251737126DBB8157B6A1AD3611B04B95DFE46510BB94E7B0B87B55315A98AB61946FE926984FB5A4BDA10333221B92EAC1CFC2A15BE83ADF9297FF61CF87991EEF977A584A3D4CC765D710CF3C630687990A85F4CD1973861868A8FA1A1D3C26A777371CF6108D1B83243B058F729448ECA2A5665B2B6B032BD83CAD34EB5CA394C6DE96AB3552BEF3B28DB6390978DB65A30C6B0528ADA091C80D42AE470078C1D3C45EA21AB418A865FCC2FA4C3D78B76E84B3C3AFC0BD9B2721A092AA274B7A4BC3B8A9DC57332C81B0695522316755A5B7F1F992F5E22C00B29CDC6281ECAA0E74A24C0C56573AB8453F469872722C8796BFD1B64D8AC93F123C74740511A0B983C20C153F005BCBD04965EC95975858045681DB4B8B70327CCDFC9FF8377D599384C15875EE346FC08066EF3BC09D46016B8754B8C0B6BD944D2B157CFE3392A25B98D48850536B5BFE119F58A0739A48654CC8BBA8EC1C1AF4A197EC758396CE4C0C4E66D0BD43A03CD65A6028C185C6C1C59FCBC4EE7017568061BE551BC0BB3509102E8F14829B603BA1CB910DEC374CEA99C301851111A3DACB2292CB95ED1C8B53B965C6D33307B40C538C63872B83DF8C3922385AA8CA075FC118DBB323035C768149221E2C135291070671270CA5342B89044DB59346314F95B95BCB06D0A1F66645B907862C60B4C8CEC097CA87C7B3F2720DDCB0C5D317B443437CEDD32F2357015F9350778A360219B7FC178531B2442F114F2024595EC4CAB1F6CA26F827542096F8B08C4492156424504CF46DFCAB2DB7074FBA212F72284194C59240EACDE348BFC22394985A09874B5BDCF788DFB9B38031B1AB762BC337195597A662673514603E49C2A485E61D37691B31C46EF67CA30C79A6037726735861BF5A31FE102B448CAF32B7103D3549AAE16BB8186670FCBEFEC61D47E923E4460B8CDB029AF81C99F80456033C1B1351F7FC5932902E791C8D65466A36523BA6D58FD370905F3B21465B88C125B23BEBA9F3DA624685833B4A189CE2480D4739AAD85E3EF41E0683B0376C561AA6685F2289891114CA4C380F43289C201CC6FB6E77213E1FB813F1A12266E9812BE91EED08ABDAD5477801201F313CE6A11B9C155F8E07310D6C7769E637EB123524342DFBC67FC0E20A3D09AB9B5C06B149C39FA12E21870273C8C97FD56A1CD346F627593A01606043A18F35C6A323A22A48B3DB49923D3A2BBC92051BD4A9301CAA0D9A386569A37261CC12172839499F928A6A70806B9D8A24AE304D98876AFE6C3E24D500BA08A8F285C9633414825AA01AFC5E55CB2AB91A53DCB47DC7904F6EA77196A8BB9E057A092208BD81C2B9675E1C263D0BA024D2D92B5E85C164E149572B0288531B6BF4BB1E629D7295842A5709D06810CCC896E64A5516130959881B58633F8C411F5032AADE7879CA3385715C8E590B6AAED47D38A708822AA7570848439867D6CAC7EF7A76DD3B890662CE65271EA065302D3A4B4FAA2143F5530E890A1B80B75935BC3C06569C7365A4166AB4D7C1B26030C2A777A121C0099921C77AAE3644BBDA315429C06CADB33BAA3CA419D5064A5BC9C7BC6C8D34C7FB0A254409372B679FCAB46D47C16B94BB2E8253475C0CC5BA6C7DA39141ECE51EDB844A4EA4AC6E3866625679FFF71CFEE1477A918CD82B0883B67BAF2A383B436FDEE7C58AD372E698778866377561BAFA8C9B596AB48676B08E2BA9EE1AAE07BB194D841586662DC64B1065CC8A52D899D09C6F96286E272895F8865B54DA8B33FB67AEA1133E611BF9ABB459AA4442A60CD09A4E39006616C3981604662F7006E0C9130739A66E79BFD123C679A368B64C331C285AC1CC721512A52148A382C09474773BADCA77CDDCB6E4C40022CA10E35A6BB205239074AD6B6524C2329103D281E8CC479AB4AA2E5C2960A903C1E05B48F07B5C88C384533D93A9BF07EB8B7376163532AFAF32B4C481694C11C97ECA8AF0E714F0427D16CBC331E9821E60C735392AE047303DD637AE5AAD915232EBF481BD03ABC845372C60AC586009BC717B6D1A1E78FBB7ADAC5DFA89C410E786AB4422A87BA21A088EF93584C1B0237F83AE90B664950B471E763CB7939C28D93604C83F73A30F80B3AA8F948086A142A132442712CBD71A9D495587CAC62F98F922E96C9D0095B1502B42DA76B59B1C183338C1C06A730DFC2E889273326593362006EF948AEE1A521E159FF6283DF3D11DEDB1655FC706DEB2C6BE879D3605C3AA463355FC726CE84962500B72776EBC9AA3D960A8084C3182EB8A43918F80EBCE5425257C2237CAC811022792485772BFA51CC7171F86F4C847782BFF123763FA650CB1B173D1AC78F7C19E764F5039736A3B2BF37B67C9783DA9EA6CD0A96FD7DA758E411575F6744DACB42AE2148B7BC9FBF49B4D25CCE02BB906B025EAB98171B80D55C8A328D15C2668A8FDC3A463CA6508E1818437498AA27B04D8514795BC4675C1B94ACEFD54603C498056038D3445745D44BD6F1A4316191B905C650668A3E2402D74E560CBB7A667A27EA4D38495010A71085957421923E21718E611CD5205FFF6AB91C65407C67E7EE19EF0A885EB88B02901478DAB0456D94E4073576AF0542E33C9286048E491ACD2EC2A02E5181436BE7D829AFCA68FE0A78588D886DF77B6F1F94A959B2AFDE328B8B5888569AC34D23771F0AA12C7954EC82A6E71C1760654C34A926DE4B0F07025B9517B2A036577728C7E35653CEC816C3677F703B0EB3C18AEC948368009CB013E365A1E643244289B0AE11440877266C27C955C7773D4377BA2D7C6B8DA7D23C48A19EAA7374A5A9B931F42E144A6CBB8CA06BBD42396B02C6AD16BA6B1E36B2161903EA4A654A31C507825347B9BB177C655B848BD943162F41818F113E864B456D504573B8C4E5B8A07F14713612F78537128253B1B9712C417CCAFB271DCD9683EB82C55D171723A32A5D40EDF9252D01C7ADB6664D6467421920C5B345B2D93C3DFCBCB1DC538D23454068AAA2B85CE41574079136476CB1CA401C1134977E97C72D2C85C37E872CB725A2AB55BB6C37EF2E517608A95C14A970480856A8A5737A06B46E93D03D6384AB8562AF2C37DBB1D52737CA8C5404632C4E9AA714A4A5CD3D073AF069CCDA490C64C42974B57D3BA6C500588C39BCFC4B26CE6119ECDB6A2A47141DA96BA2331996EA93C5D7618F4FC9A27FB6F5BA336F6801938EC26ADE456FDE01D41C22E1424611FB4487D8A2DA212A09749524F004CDC76B8F6339B11041A3174B8FD58B2C6E7B0166AB4246347D25AC489C43288A23A7E59C3CE320E3FCACE6B6277400ACF9E924FD12C0805B70354F3AD8DE92644F8B4936C81CF301FB87A7DC4578628868ABF501626B045D48537F2212A3FA5396C1C857B1084B21B1EB968AD60B43181C77712001290300C9CC2A3D6562A00FCB4E5F11C2AE412DD29181A034725A0CC75E2BDFB851DBFC28AB3362B8CF378BAC9939D340317C64469C27D8F3675C2A962DC7A00E9F67BA1EB8094F0B205388C59223C7BB963D8E21D933B779B360706AC5E06033C1907A8C8EB6E6017C285A8827E28B8CC7A5891CA381FD50D5EA231FEB5A7A4E4380FB5067A6505FA627D19715667FC5602B041CDF9074A3C58BDB9C77CF23F6AD1005C4A6F2581695F444578A734F8FC3E9FCCC07A873A5AD04CB2C724F6820AB1C081306B429F92834FE8BFE401448431BEBC4C7335EA0EC7050A0A49459DB286B774069B161DCBF3BABB5430FF727A419B1AF2371E1441BDD53C03E5445391A401668B693C6503F35CA6CC7A04CA298FFB81CFEAB4B8DF400E1F670801E7014DFCC8B3D8BD953BACC1D61F184A07B383A8325C1251A56E8BFCA75C04CF8653082D52A8D6C944191155AE886AD9AC010AC50BBD2BBA9144785F02B7B7BBBF7F1AB8DF210241F4AEA1700D840AAD5E2761C4066165A43C487B3AFF68BF3370891933BF46C13BE82331F189B678150748AC609B3378C3581AFF91C9A4F2B9C040661E11A917F7A604100E5B9863B8D3B55BE32CC1F40DC47C4F02622863A560F25B03864502F4304F1401B90E4969EC110331A418770B1CA626B3A86659AE9B7B630C6DE1576286976453377663950353BC8067691BD1E1C24C006204E3502C171BD43C33271548EDDAA641677D8D1161152216A4944D480440E3B418042184194C6E39FBCCD353C58A6C3BAD16A33D666D601237F341B7AEF3C98F237E585C8E152B444DF15A768B20104AFC8CE55CDA630D36C048C7D5206708B4699726C1E2FC3A722CB514936B2729D96EFF6FBF9B05E34251304A92EA873A21654F70C4632113C36F62CF40BBB2C581B2D694E369C0DA567371E8E53C328A59BCE775A625C9F5CC185E0F + +z: E15F322315265F9B847960B7185D962761ED79C62286A0DFDB13DBF550CE0107 +d: ACB7FDB596B44A88A60ED74A3FAD9EF745BF5BFA4902CADB891EC5CA45F685F5 +ek: E42705D23A30A72638425280BCE72CD596BA2AA6B736A922740C52A0F470C0A1311ED82E15F4C5D865B6BE18B4810127282C1BE22A9BC580784EF371F18482F2E43777396A3E6A77FA284CBC6C663D63005DA53232B06A27D65547FA58E263C00AC701B3B6566F199F5EC172AD4BC12FEBA212C7159C90C589551110066D87E01D54924ADFE0CBEC921AC7B273B1FC400F6B81F23073D6AC0D7AC34F2DC60C08777C5559B013F23B91A743443B1B38375E91C254D8721F1AD2B02E9C566FAA294ED75BE16C0B0D82C1DCC8AB4A6C1D6E88B567C11A49AA055EEA87117A4C5B1C030F8ACD3AFC69D5FA8F082210E356A426C973A17492E8C3C64D87087A54589BF468071C0DAE016B6B51C52B628BEB986845B484FA213A27C6A1D505AE09D499FB92C17DF2AF010C71C1FA0FCD89A59EBCBDA4B7AFAB2CA68421AED1C464892C5ACFAA556DCC227929B6670904A01C5AB2AA0A5A246566C61A7BB9CA07630DD005CF8705B1B414CE8070A43D30CCB45572DEEB253E19ABCDE790A7F4BADD7863CB187FE8AAB9B0CC1C8309415F54AF4BA6BD6DC74C3AA13B0126254DA08F833C71810092E7332DD8CA4CC3199D4EB25405D310A3E9A6E65C8BFED0C6973A6F324CCC3EE16CC3E405D1C036086C5BE644A1A3709DB22A392EAC889CFCB6D9A03CCED44AB241AE735490EBE44A8B333C462891AFF72F2482C9B52B98106BB010A4CF03214330C5AEADB9B7314273D88880358A568DAA16DD8B496B6CA9C758B74F207B5001826391175EAA2DD9912E84B77EA257052065364949CE57365CC457854681729B389A7CC4782F7590EA6ABC49C40B4E23A2EF916F53240CA7BCA58370657490C52AC535E7CBA1CC58CAF52585DC148811264C2E6AA6728A254BBCC983D71716E82B7A53A2ABE376A5362E74F57BEB1979E2FA77998C869D6A799D0934D8475C8CB28AEBB3522387251D11352520C9A76697519B2DB6093CCC3A5A99D75E136C9A3D305F46F3176EC07FE4C30E25B21BDC2996DB413E0350AEE4A96125C5337AA70469F392942037674561D85969AC6664F6D92DD9B5108CDAC8A6E86E8BC1C1DF319AF330701E23AC743232680B3370B471CCD91761C110E309B5D77A48F4E06A681A2B38ACC3185946E7DB0D6EB1837D3199D83C676D667AD1CB51DC9982D3D36BCC121627D21AADF01928F32DF347CE495175F84641CC0704A24B7D099C416D3A56CC5CCD3ACA34F3F670B64C57AFD0591A628E4A19A83914C14212BB4D43AB1548CC772C25F38619692A5DD88730B093AFF5968B9AE60DC8AB8BE3D13F16928E4CD0CF604835F23B101BE7903876C8BB9970BC74A0E4752A67C4BE2F20C10BFB7765D863828565D190C5384273DED40E331168A4AC2A6CB8B0C5D600F5359BE70AB0B74C3C427857B34A9D2B7731DA6ABA7206253A67C22AAA10F7ACBFDB093BB7647B50D6AD449257AAA9CF29E5C5AA2982D6E0B67813BEF12B4E2A9669FB94394E34BD9583142456CA048763E0EABA7DDC48E3CB80736C6121F1888DB3CF85177942F322C3F029B427A6B8DB4976E1B80E9047BF91BDF2449F0B20C336E041B587182DD4A459C4800CA85308658E3BA78D66F47639AB1B70C45B43F70CF8197803BC1EC4A4424DD78C26039F4AC3C84F98A5AFB45A6970158E41296B925D33F68ECCD3B5A0B415F5B7CDE3473859DC48279255F9995561C205B244728DFC4F625316776267BD468BFBB287097911F8C2A32A0CBF14C3C708F9C4BF70C612C61FBA3720EC62918149165BBCA3CCD48CC8B272E538A1E818843B272DC694AD8E265E830034ACE5708CF22AE3D256745B50EC328CBF03760CA73E7E35241776864856BFD7C18577D411AAF99AD412CAACF44456228DE0176FA0E13CB925140F8A5BE9589F4B6B199F751B7A58751DB35680C78C69F83333155D80E08FA92A5B0FDAB909F9223D167333765D033213E3A65EB2B709BA200D861012D7145A9039C4A6B032D9D5802846441C379978EBA4B9970B275271292379B96717E48680FAE36DDC7018AFA8B3C1929AD62268F12AB87FEB92535A655158CE4957A1BE37C9922B4E08D57D85525D6F2B7698331FB3F1219D91A1272B7E92D3245E4649A8257BC362BA0E0462991A481A0A602809C46F4342ED40AD99FC74366406ACFCE7708AE11AA2C3436EE06121FE6CD52FACE80AA5FA2B65A0B1B28F8B28DE +dk: 8F841DB58339CB208908CA123BFA4FB00413A60A9EA76648FD69BEECE0B731042AB206368858B0AE798A7A26A1C96AA302AB998F352634CBAF93F81EA4C280830B8DE435CD4DFC3C3674CE2338AAF6543A57BAAE1232780B578BC3FB4230919CA56065A6E466FC19B9322404499199ACCCADB0236D6026BC927C58EA225D34A628721C746D2008C7B2A600CB94E5F93351088A1C6609CC350E5E0920D4D3139AC08A28A0A5DCFAACF057C3DCD933DB7A8159A657CE257481AA1AEA69BDCCBA961B82C56AC15A74DA139BF388610879EA716035372042984AE027C910E149FACC954762B75FE41214A7B808B168FA728F4D52500C88B2E96A121AC9249C3761A97C7333332CFFA182018A15D4B550A930BFE60AB73F20573345522162A5DF021C19F290567A95ACF4622A919AC20BB42B11BE06852094947897B4A7987981F989A29A13C31288B8C30B36244894CE502DA3967DC0636C94810A2A0B9EF72B215E936E330556F0309604B99093B246AB102553117CA48458E845CB87399A42499A0F7913A15358F334577D84004CF23522695EBC6630503B7ED77076EA7C0ABFA4218943413AD664F761C429011F8F0A66E5C22794F60E9FE2B995C004FE21AEF73AB339468735731A969A3E0E192998933F2864C6BC9A82B1A5A542CCCFB85CC629EAC5BF2CBF1F1438ED5109BE13B7F182280EFC07D937783FC5407215742329281AB7B8BA687DF328A3380CA3E4C09523B056EED254A4B7AE6C241EEE61A340528308D3C11F96A315D0B4B02BA47AC14388F2C005A0B15C75CC3D72717B2B13AE8A830AE7706064630A1C0B97858B75B228E7E6C12F1344F656A2D0405E3E932BDE3846F91AB60E183F2469C2A0B47E59E20B89303DFCF89EC1368243B03A4864C26D58B691026B2E627E9C36BAC877C048708B058B02B5327B3325423EEA5C52E311A6E208880A688D540127DBA7FF46CBBC35784BF538B5B04CE774BF5FF82BAFC844445719CE532D928339A19744E9F6391852B5B1E2C06F61CC2C28A16D3BB08081825F040CF0AA489751CE8C99CC0930379A426D3E9A15278B7D40021E5F890B06A767E65088311A8818B5088946CE9871A55D602B8FF389FD9B2E80060E053B82275436FC9690D1453B256CC510735CCE3331D109C1247B6875DBA71079A353293B624C6494762BE23B135DB14599F41CF3BA8EE07CA032E652E00B57A6214106C587B96097B45390A4431ED2B524C641112A95C65F93CCE87816E85B7955A91741650C4E8A944FA088CBF274E31244F77A4C50A98D44B96FB8625FFACCA584AB18740C8278A8ACA2E12989E60CE7A70145B394B7137EA86901D629C63ECB42BC59673DD73515DA3BE2C74D595B6E15AB4324786574D842A2518F2247ACCAE3012AE36CCBC48038BB5C69B3BF95D59016492E2E923CA562C8F8F444CDD3756A69336EE972786B88F2DB42DBB2309228279D6AA29474C2C94721556131DFD95E0520B0C23C2C1B49683D425EB313954154935CC06109182BE7C8A5D45A46B97196B6B794F4944EBE2052B3454EDC814938868FA1FC7ED4D76342591BA5EB96C73166AD311F7C80CFE7C149A2301DF1B8BB96C7742F03B5B3541A8E05418A7A3A89E1841B627D85CA7B6D56897DF5C5977A1E67C2B5D97894245620DCDA7B3183771081B4FD77476440013E417FBCFC4C38A51C1045219FEABD3C1258203A716FDC922F95CB71C15BAFCA2C777812C1AC390D540803B917D153B75D7A947AF328B620B93348CE7342212A286FB63812C2930920933473C95BB383B7AC054E4DF8CAF7D2A2C7C8CB3FDC5CA949177B40AF5DE102D9DB382D3C6D918155FAC94EE088A067C43BA21778D4E78FA0157C8457586E1AB6A07922FCE01407D63E7366BF68116EECEC8F01C262F766008C9A33C2A5A7C4575E95DB458E9C8289A30EA4E32E015856FCFC03C0EABD2021473B251C279ABC66D87EA1F66AEF5A8189544DE7A95C6F8544D8481786C72BF0EA329EEC4D2423846770707D922DDA38601B228E12451657725923B25CE29A10398B5D16492061D77E48EA023A929A4EC3634FA0073CB929CD1A42577B1E6F89CB9522A28B6A9248D243D423884E03799E6413F963462B7B3BF0276BAFE5AFE2F161EA76566FF4406649BA3C1B5811188FE42705D23A30A72638425280BCE72CD596BA2AA6B736A922740C52A0F470C0A1311ED82E15F4C5D865B6BE18B4810127282C1BE22A9BC580784EF371F18482F2E43777396A3E6A77FA284CBC6C663D63005DA53232B06A27D65547FA58E263C00AC701B3B6566F199F5EC172AD4BC12FEBA212C7159C90C589551110066D87E01D54924ADFE0CBEC921AC7B273B1FC400F6B81F23073D6AC0D7AC34F2DC60C08777C5559B013F23B91A743443B1B38375E91C254D8721F1AD2B02E9C566FAA294ED75BE16C0B0D82C1DCC8AB4A6C1D6E88B567C11A49AA055EEA87117A4C5B1C030F8ACD3AFC69D5FA8F082210E356A426C973A17492E8C3C64D87087A54589BF468071C0DAE016B6B51C52B628BEB986845B484FA213A27C6A1D505AE09D499FB92C17DF2AF010C71C1FA0FCD89A59EBCBDA4B7AFAB2CA68421AED1C464892C5ACFAA556DCC227929B6670904A01C5AB2AA0A5A246566C61A7BB9CA07630DD005CF8705B1B414CE8070A43D30CCB45572DEEB253E19ABCDE790A7F4BADD7863CB187FE8AAB9B0CC1C8309415F54AF4BA6BD6DC74C3AA13B0126254DA08F833C71810092E7332DD8CA4CC3199D4EB25405D310A3E9A6E65C8BFED0C6973A6F324CCC3EE16CC3E405D1C036086C5BE644A1A3709DB22A392EAC889CFCB6D9A03CCED44AB241AE735490EBE44A8B333C462891AFF72F2482C9B52B98106BB010A4CF03214330C5AEADB9B7314273D88880358A568DAA16DD8B496B6CA9C758B74F207B5001826391175EAA2DD9912E84B77EA257052065364949CE57365CC457854681729B389A7CC4782F7590EA6ABC49C40B4E23A2EF916F53240CA7BCA58370657490C52AC535E7CBA1CC58CAF52585DC148811264C2E6AA6728A254BBCC983D71716E82B7A53A2ABE376A5362E74F57BEB1979E2FA77998C869D6A799D0934D8475C8CB28AEBB3522387251D11352520C9A76697519B2DB6093CCC3A5A99D75E136C9A3D305F46F3176EC07FE4C30E25B21BDC2996DB413E0350AEE4A96125C5337AA70469F392942037674561D85969AC6664F6D92DD9B5108CDAC8A6E86E8BC1C1DF319AF330701E23AC743232680B3370B471CCD91761C110E309B5D77A48F4E06A681A2B38ACC3185946E7DB0D6EB1837D3199D83C676D667AD1CB51DC9982D3D36BCC121627D21AADF01928F32DF347CE495175F84641CC0704A24B7D099C416D3A56CC5CCD3ACA34F3F670B64C57AFD0591A628E4A19A83914C14212BB4D43AB1548CC772C25F38619692A5DD88730B093AFF5968B9AE60DC8AB8BE3D13F16928E4CD0CF604835F23B101BE7903876C8BB9970BC74A0E4752A67C4BE2F20C10BFB7765D863828565D190C5384273DED40E331168A4AC2A6CB8B0C5D600F5359BE70AB0B74C3C427857B34A9D2B7731DA6ABA7206253A67C22AAA10F7ACBFDB093BB7647B50D6AD449257AAA9CF29E5C5AA2982D6E0B67813BEF12B4E2A9669FB94394E34BD9583142456CA048763E0EABA7DDC48E3CB80736C6121F1888DB3CF85177942F322C3F029B427A6B8DB4976E1B80E9047BF91BDF2449F0B20C336E041B587182DD4A459C4800CA85308658E3BA78D66F47639AB1B70C45B43F70CF8197803BC1EC4A4424DD78C26039F4AC3C84F98A5AFB45A6970158E41296B925D33F68ECCD3B5A0B415F5B7CDE3473859DC48279255F9995561C205B244728DFC4F625316776267BD468BFBB287097911F8C2A32A0CBF14C3C708F9C4BF70C612C61FBA3720EC62918149165BBCA3CCD48CC8B272E538A1E818843B272DC694AD8E265E830034ACE5708CF22AE3D256745B50EC328CBF03760CA73E7E35241776864856BFD7C18577D411AAF99AD412CAACF44456228DE0176FA0E13CB925140F8A5BE9589F4B6B199F751B7A58751DB35680C78C69F83333155D80E08FA92A5B0FDAB909F9223D167333765D033213E3A65EB2B709BA200D861012D7145A9039C4A6B032D9D5802846441C379978EBA4B9970B275271292379B96717E48680FAE36DDC7018AFA8B3C1929AD62268F12AB87FEB92535A655158CE4957A1BE37C9922B4E08D57D85525D6F2B7698331FB3F1219D91A1272B7E92D3245E4649A8257BC362BA0E0462991A481A0A602809C46F4342ED40AD99FC74366406ACFCE7708AE11AA2C3436EE06121FE6CD52FACE80AA5FA2B65A0B1B28F8B28DE9213ED7BAA4999FD5812E87439CD569F1510F0536CB5A34D77C48FCD82BE86D8E15F322315265F9B847960B7185D962761ED79C62286A0DFDB13DBF550CE0107 + +z: ABD71039AE2E2700391011D9CC8265C2D5C9779002D54E1BDD9607402054CA95 +d: 0AA4E8D918201BB98464963B076E35337FF3265810723E01C435954DB18B14FF +ek: 0902C611CC1D7395142836692CAC578AA1AC7B12970599690FF9958A7048B7D276DE2088D0B06E5C3971190909C6F216287B2344E3922AF9A4BFC1CEB7E5AD35302E555A504B6B65F710356CC30DF957BD60E974FD31729EB63620E30154636FEBD84DA66BBE270151787B7A8B2BA3431491860C8837B5A93C35C62AE2BDBA43BB58D4126EE8139FFB5BFA110C4075C34F9AC648673EECCB59AF60CB8A6372B69C6E39D418AF88BC23161812486A5F2BB9B2D970B811C360329593CC31FA47BEC0FCA95C226E46A6BD5F39674458BD1683CA4673C39D158D9EE13E9736A6863229156BAE9340532D1A1BFBF98145930EE0A5229323468F7B5A9AE9755F6B603A4360CAEC054276BD3E5A4BF29C85F1DACA2C61A514C1449F94A63C4A3CCCA06D195945EDB3C0DAB07FBF75BFDE57A454C564B99C7DA3E5BA095A462C741E634B3D2DD9B7DF837E5FC076A0C363389C8248036EE55477F55BA27F17740E0AB891D0305E77A284ECA7F84CB3C5483FB3992610384E42A731DB8C3B65B6BBAFF04039D09A9BE4494637A9599CA7A4C42FCCA473D4E88B830A4D2358A324620F9B765A0141CB57DC1B70918053611B7AAA7D6D973C8D4C2CC135940C3CA9B7385823C8A86755717A63BD8EDC5712335786B21CA4106C3E6AB14381A87C6C6FB70635159077BE8369699823F54BCCEFEA3D3AD61613409B41C007947015364BCF42F184BF3BC8B03C6976749347EA7564076CAE9360F1CAA3BDF183889766FD428D13936B25EAA8156776C813705B79CF11030ABDE33B87FA4200544740598EA451AF9ED65CE3D0088F948AE07134BC2830253C9A680477C26180621BA679CB78F4E1304743A2AF124054499A21A9B510C78B2F875445B8AD58A559CF624DB8F8ABD1188812C122EAE81AB0F50435C77D72918E03DBAC7FC61DE848B4BC1729140602E738734B43CC62CB48B8131A2E257D82CB58F69AA6C4A348EA48277A0C8504D07323C61C42B68E5A212B01D66DB645BCBB6B34AF9B8AD7F709EB3720C1B79EF09352A078892787AE73D0B5DF546CC5F35D84940999D9CC59FB39C41762AD4AB260E6795F37372BEAC07005BF80F4A5620B4F23A2255D212746F4CFF73995E53C075C6790CAF4745A2AB8CAE2A89D94A601673023819166A709010C9D4A42CE9AA8C96381B1A7A236781C0C0F10C653F71353224242D3A8F0786A31703CD2063929393DAC152186C84253825481FC86BDFC70E3C5975D3A1DE8F23002126A05DB29FDD143A1F60222D7409B468138A8AAE2A34C1FFB6CEAA863CBC9666DBA1FE7138DE19AAED65256B15CBB08110E25FBC7209750C2CB225F6C5C97836AA04BA1B636BDE9235709483998E85BC1A28F713CA3935505E840A82284B879100389EC2D2A5778C990CCDE45B44D26A9AB74C28705807312681BD662F3E5437772CB7C383D72A53537404FB551CC87274294A85C8BB8484C8113E29708664190F923A387E81EBDAC3CE5890A2C440B9D93323E0588CE003606A5204B93288EB6B62F657C6E511059AC4B3DD57D402064B9C086DB955A7958C399F17AB353108E821A1C1084E11B20F2123C1CA6600AD330587988586C8F698BA258165FA3199A423548EED0B46535935C964BB4A0988B2346BD64BA7FA23D42FAAEF424901878012A772FC4815C26D54037F66F8BBC0E82C7753E16C40E1C17C2BC35F470251393B3B7E84534226DB0237DA2960CFDC99EEB4CA4AFEAA15B9271D9F74DF6CA5631935579AA5E189A715827220CE26BB1C07D719751560765E5A2296CB4BD9C44C4D6376E39A89AA8B70AF987AA0C3C10E714931059AFBC6B07B3523B1175AB9E0902BAAA56754A76C09C4CE232B5EED28F58F097BE3A0F5C290615DC7A4C4C328E413D8E43487E124F8C28444E70A7AE02B64D618D8831609CC939859BB100FC31513B90CE30B59061C38BD17DD57A6A2B0A3640E591524A06A6063259467D1F0821813411E62713A742C0ADE48FE3575338356F4CE99C1995667C34CD2582C0F9B7C4A3DA412C737253A3C3957929D5E4CFEFECAC09BB557231A11ED94F3C7A1BE5060313F540EE5576221386DA4C6A7CB71E307B395DB9C6D7DCB256C42D6F52908C565F06DB823463A634AC57299687641A556F5599F961B6E2F0A30053BE44150E1BEA7DC6D1A4488855127512CE9B2B1F4C07FFABDDF9E7FC37FB0A738DED0707 +dk: D4B51192A45D0D05BA48D20D7F8210DE386535D2A9204105AF184B50C81E89889DDF30942A9352C6723D2C94C31B709D452266772A8D69D2784C8332687507A1F678142C390737AD55C42CB7D37A28E9B9A18C374D220FC5A9560F655588439D69616620237225B543E6FB67ACE6B149BAA6AB5C45E334B65C87BFA368C581389B1246639B8550F9D94A61BC806850222869AB9041858DD30C16D0B62B53C85A345F26E3113F51C76F137FECACBB26C6AB1C3898E4AA73889039DD61CDEE46379812CB68BA0A03252199F102C661427088A89EB64D9E6CCE4E9929C19CB91BFA2A816340BE89A636339E67A124F659A45E6A061027533BA635854A0CAA45998E6BA21CC10E53A1A9BEB42DF0107F6765C7B9C8A8E98448CF2A6ACC6514765935064417C5E094B038123AF395B78746E4B66AB3E7BCEA783B4F4B5169478C78B82194961F80FC64AD314CD9D089C559815DD91533DC04B9359FD7936D7B8BB5BED435C77057316440926766F3A665F361BC9314230BAC46AEA6AC7EF648C9901DF017BBDE558668A606809CC717C49EFCE5B9F469BE1A0A9853451B130A952C137F6812978270A194C5CFD899CE2E656FE9CBBE8C3C769C700218489DAC47A07CDAA36EF22EE7125EC5223FD959C335B70C56AB8D52333B4C6A1C12DB76A4C02F7E7410CB646E75A5301F19A080561FDE627C9E42B275FBA0800715B1D77643A8193EFB61DDE898305B4B53140A76CC851FB956FE766C8450100A1C9EC0044C32BC17948C3D4CF44C70077447147BCA735EC9F2251A423F96D694F0F01ED4813713545A791282F7086B025BC4B133B86EB4856A3C99F21129AEC57175818360D678FD549ED769365E4720B3A4A433217DBEBA261C48B75C26828199904820C8FC80098DA6A0A9463B24FA5F43A445F33B38985637AA30CE6FC83D7127BFF9DA633E25A362323564D25622064AF20C16D90620AA0875D65217A389438D236EC8F2C18AE3BFC95296CB951A604B9FC15C69A5927F86D98582C3169BD16C7EE1403BCA5BB1C2238B93B5B0F4C6E3969D98325444A09DE2636DA4A046367358CBA66B28531616733FD816B32BB714CAD1B10DF570062223F6366424BB0388DC1A6CC9AD72CCAD22EC51C671BB859C4A3BCAC9525342B6EC97DB62ADE9949339DA5338D07EE433A868060570E087C34B8BF62ACF15F05657869556CC00713CAA9E5C2AF40474F472B3E117B9F8DC4D148183952A0553F49EEF609F3CF12DB7B102855677A443BD8C94429C9168BDC06CA0FB3781E450DAE94A96E4239DF01A74FB3C016B4AA3463AF3E18D8EC653E838249937B50DB57ADA1CC1215972B410AE459BA481836215E12655534A6F183ACE939DEE553435E9BDD00B4273F0A99CD42607E903E85864F0D27CB4A26474265E2E7A56A576971D69C657D237C05CA7C8070F0FE3A8A1AB8549866D32A253F7B4AEBE6521E557131D361999C5CD6B9837299A2100A52450C9AF85890833A9AC8A3B1B1C0B90839295BA6997BDF262AA93196AEA9F9EB1485E8415FF7006CAEC9A0548AFCF6816938A5E77D5A383F6B3C140786A3626207218883597BC3670903364BD275AE420BAE20522D5E69F9D292E7C5A6A3F3134F767004D052E1476B2A95B790B295AE6F68689828F69EC7965F495E7667E7B420EA2E5C738964FC0257E9D423B98C409E9A27B41E0B87A396EC079338019AE8DEC20DFE0477E940B6233C7D6244A201A0DA4B45AE785158C545AE6B28B49F799E030C762F0BAC8987E12F079D28C4BF7074BED316AB4580D21A8CEF4C30D637275FA2C6884E61B6843C4BC696E8615C47D573FF20BA1053C4259076153BB9314E6CA62F1AF91F594ABD444BBD2B3B203A075083AE8036109710F2B169A688CBCF6D563FAE94D3DF65BFA92B1D20546B5A3A0FF6B3FAB634712566B0E021D617232C8029EB2F76DF624C8DC77AB3789739AB12AE3AB59A7B612A40970D5526023F690C8F1A9BEB4A49F066AA8073E1F865DF9313A63464C65510E078B61320A34E3624E2A6A3E16B7BC3FD995436C92C28B18B149C26754C0DFBA3121778D8E345E6FA4CE8F104F71B77FFE64C0AD945F1F227A031522D07990F88BA91FECB244B5936E87298FDC1836E82C0CB178175CAC5A36C27D3B71EFF5ACAA39200902C611CC1D7395142836692CAC578AA1AC7B12970599690FF9958A7048B7D276DE2088D0B06E5C3971190909C6F216287B2344E3922AF9A4BFC1CEB7E5AD35302E555A504B6B65F710356CC30DF957BD60E974FD31729EB63620E30154636FEBD84DA66BBE270151787B7A8B2BA3431491860C8837B5A93C35C62AE2BDBA43BB58D4126EE8139FFB5BFA110C4075C34F9AC648673EECCB59AF60CB8A6372B69C6E39D418AF88BC23161812486A5F2BB9B2D970B811C360329593CC31FA47BEC0FCA95C226E46A6BD5F39674458BD1683CA4673C39D158D9EE13E9736A6863229156BAE9340532D1A1BFBF98145930EE0A5229323468F7B5A9AE9755F6B603A4360CAEC054276BD3E5A4BF29C85F1DACA2C61A514C1449F94A63C4A3CCCA06D195945EDB3C0DAB07FBF75BFDE57A454C564B99C7DA3E5BA095A462C741E634B3D2DD9B7DF837E5FC076A0C363389C8248036EE55477F55BA27F17740E0AB891D0305E77A284ECA7F84CB3C5483FB3992610384E42A731DB8C3B65B6BBAFF04039D09A9BE4494637A9599CA7A4C42FCCA473D4E88B830A4D2358A324620F9B765A0141CB57DC1B70918053611B7AAA7D6D973C8D4C2CC135940C3CA9B7385823C8A86755717A63BD8EDC5712335786B21CA4106C3E6AB14381A87C6C6FB70635159077BE8369699823F54BCCEFEA3D3AD61613409B41C007947015364BCF42F184BF3BC8B03C6976749347EA7564076CAE9360F1CAA3BDF183889766FD428D13936B25EAA8156776C813705B79CF11030ABDE33B87FA4200544740598EA451AF9ED65CE3D0088F948AE07134BC2830253C9A680477C26180621BA679CB78F4E1304743A2AF124054499A21A9B510C78B2F875445B8AD58A559CF624DB8F8ABD1188812C122EAE81AB0F50435C77D72918E03DBAC7FC61DE848B4BC1729140602E738734B43CC62CB48B8131A2E257D82CB58F69AA6C4A348EA48277A0C8504D07323C61C42B68E5A212B01D66DB645BCBB6B34AF9B8AD7F709EB3720C1B79EF09352A078892787AE73D0B5DF546CC5F35D84940999D9CC59FB39C41762AD4AB260E6795F37372BEAC07005BF80F4A5620B4F23A2255D212746F4CFF73995E53C075C6790CAF4745A2AB8CAE2A89D94A601673023819166A709010C9D4A42CE9AA8C96381B1A7A236781C0C0F10C653F71353224242D3A8F0786A31703CD2063929393DAC152186C84253825481FC86BDFC70E3C5975D3A1DE8F23002126A05DB29FDD143A1F60222D7409B468138A8AAE2A34C1FFB6CEAA863CBC9666DBA1FE7138DE19AAED65256B15CBB08110E25FBC7209750C2CB225F6C5C97836AA04BA1B636BDE9235709483998E85BC1A28F713CA3935505E840A82284B879100389EC2D2A5778C990CCDE45B44D26A9AB74C28705807312681BD662F3E5437772CB7C383D72A53537404FB551CC87274294A85C8BB8484C8113E29708664190F923A387E81EBDAC3CE5890A2C440B9D93323E0588CE003606A5204B93288EB6B62F657C6E511059AC4B3DD57D402064B9C086DB955A7958C399F17AB353108E821A1C1084E11B20F2123C1CA6600AD330587988586C8F698BA258165FA3199A423548EED0B46535935C964BB4A0988B2346BD64BA7FA23D42FAAEF424901878012A772FC4815C26D54037F66F8BBC0E82C7753E16C40E1C17C2BC35F470251393B3B7E84534226DB0237DA2960CFDC99EEB4CA4AFEAA15B9271D9F74DF6CA5631935579AA5E189A715827220CE26BB1C07D719751560765E5A2296CB4BD9C44C4D6376E39A89AA8B70AF987AA0C3C10E714931059AFBC6B07B3523B1175AB9E0902BAAA56754A76C09C4CE232B5EED28F58F097BE3A0F5C290615DC7A4C4C328E413D8E43487E124F8C28444E70A7AE02B64D618D8831609CC939859BB100FC31513B90CE30B59061C38BD17DD57A6A2B0A3640E591524A06A6063259467D1F0821813411E62713A742C0ADE48FE3575338356F4CE99C1995667C34CD2582C0F9B7C4A3DA412C737253A3C3957929D5E4CFEFECAC09BB557231A11ED94F3C7A1BE5060313F540EE5576221386DA4C6A7CB71E307B395DB9C6D7DCB256C42D6F52908C565F06DB823463A634AC57299687641A556F5599F961B6E2F0A30053BE44150E1BEA7DC6D1A4488855127512CE9B2B1F4C07FFABDDF9E7FC37FB0A738DED0707C266F50028D4382821B206CE45306AC320BAE56F49DFDD86F37E1B36C23DC86DABD71039AE2E2700391011D9CC8265C2D5C9779002D54E1BDD9607402054CA95 + +z: 177A8DA7AF8DB3F712E1653D05A47D61B59F4F4950549382E56F761D7126F8F9 +d: F43EC0E96A791317938761FFBE97332D5D85F52D22BDA6303FE7E7107DB608A6 +ek: F4C227FF124D62F0269297261583A7D7EB570E6A52C8B9240D1B1A79946FF3990DDD20AD71284E7B004656270DFBA0681DD2C5C41939D6391F4AAABA0ED3C6AC55B4907534DE05B775CC6284D53D045BB611F5BC62F603327C143E100B6678176A40A4949A923CA651F1D2589896BA74E41722B3A0C1C652BCC7ACA769119332A080211CCA8AACD4799513BB0906A063F2AC750C99A805B792699400F609960D177BC006227BA40CF1C547BD81C9F5D67947B6A7BFABA98415C81A4137CD2CBF024322633A8B1B242594581ED8720A794293FDB282EBA064DF25301FEABBBD14BA4FB8970B52B4E3574BC57218AEBC5FB9E731F5A85CFD1154B42575A0B3BEE2FC97CB691AE9F4361F11692D9CB07D793A3C6588ADF24FE098B0CEA860E0173C35223C678A10CD3752E97766B28BA562D1CB93935E97E73B6DFC3248217E44FB08684B5419D749D9350F143CC66E9921FA6C4180D43A721424C06864EA98CD3E60C12020AE7123ADBC2CCF40577BA4F87E10B755A1567941F98E0D0A0D26A9303383026D021F2284CE313AAC3C0A765D11747EEA8BC2832EC87B22EF31AD0D1409FC66A782B2B09AC43EBFE215862B6462996A3703525281BA8328621E436DBD533AEA69B62B429F83A78843051AA0D003C6F8BA224148E15A5AB39A6EAD69262627C7B0C46730C66D2109512D424849A53CE58B9FF463B87945CF9E253130A64CB1F18A2ED875D43026BB8AA2B87ACB00186889C082391C95273BB864E548ADD29A876B3445A471B685C659E213853C62E1A802E2B3C4C392575620597C7131F2764AE68B95AE190927E110A10A553E008F39054DE62C16912064F0B7711EF59E85E50E30395A36A11EAED23CB48A01C8F67729F6B638E3B6820A0E530ABDE31A97E7DB117B035897952F0A0473AAE5897A86725C53855AA43A16BB31BE7C564FDBA0BDDB44D6E64E7959C871728C7C5111D989CFB9026902B82544B528D4FA8BE3196C6318CA1BB791B7069EF2D225277C60B03C48C183484250B4FB0A5B05E260E8A9C958CA51F9BC69DA7ACEB006569B427D2A60C070D81C410114E753BF85651E3504418E747B8D787F0237B184834FF8689519034FF6956313120A0495267B754BA5015D8A134688B11160A2CDE5E8B18D4400AB95AC6CFBCF5CE72020C60761128CBCD5BD36817360663F83A7A263B9420A654C7280381092B4D295B3DAC03E918926B5C29BEB0478A01A39A8B0CCCEC05125D84D2872CAFC97A8627866DC7380DE17709FAC24EA1A0E00DAB5990A919E0262DA522CCAF9B0D3F11268D0A2B2BC4D85E641F64048A3557887A266A8DB13EB555608960E49618B1E39708B65151C4BB8D2154CE7B6A13F86B75367B005C9A69DA98B82ABB17EF9678EB50F3F097A6292930191A15FE075BC304D49926B3D71B675C26869B6BB93264F74702E17102DB5BCC881751120CB8D3E05215E4B34A505529BAB1A2A259B7BC7999404BD15272E44B9AA4BDC891E01A21B8A71B46725DD187E2041C07092CFDDC902D3DBAFC29379691644D0E15A8F7378298A8834D1C1B078384C140F460B144826188F51852AE0ACBAA1ADC4D86147C02F61C1B154193B2627C609682A6E656725774A2FC60DE52A3837537C421A58312A7E6BD1CB7B7661FDB3C1D9C51C3A6A44F260982BDCC01FA149697B24B00B76C5DA2908181E8CE21A28D9142F12659023536F392AB3781C74569DBA10506CB79BA214C49CD18A1D9A693734791FDB76360A142B71252B9020099B389AEA8A25796CA43BB5FA881277D742B6C7CC4651CDF47B91C73B7CC816B16F040DCEEBB3E27C68F0388ABE1A4B2B8B88820B30C9D03C1ED75A9E46774B9612C6C039C1F0404F40CAB35369BCAA80FA2C53975C63F75211B1154F94C3AEE4DBB3EEE500091BA629900A54245CBB4C92296769D979530371A0EEC19DC6718AFACCA91D219E37788802B5C162237A7274C3BE821BC969493E884DF2E915ADC3AD6F1919218C844AF94C983ACA8038CC3874C0C080161D5B4F1266420881C906C145ED15692E8C24F2574F80EB3265157EF3E63BDA96390AC160CEE8B6A79B363C290B4B35AEF49CA4DFFAC0F0423249F27A6CF77558F0631581B36E58AD1DB09F4781B8F813B0ED6578FFBA5A73FABA29D94B6F9238A9089CF41BEE300083ABC96CF379FBD0190841D981FE9CFAD1C7FAF23D2426AE +dk: 95937E82B41B65D97063375BF2516320419CE2DA063E41B62E50AAB029407A98044163C56670C75B368D6771AB590A40177073DF486D083C62C5698BC02B97DA59CFEDE6305E3ACC6DCA183093622EE80177BC507DCB8C5780A398FAB838A7CBB7126883A006A848B743FB7D0FD4CE1E4CA026FACC5F981AFDF0AD72FACFA69904BAA9944335B14B9521B492876FE30D07F81BDD7162AFD5A4BAB76E13901CCCA7700C45B385C11F23951DA37740FF58818CEC668992C46B5A478AD221A3EC989F77A5D9B1095F2A7AA0849A731AAD51A6B51B0CBEED2A8531B9A3D3C39E55597E1076AE4B4146740A8A16051A9EFC5C4E016695BA97A26AAE6D850590773D00449CA68A4E65D0463EC15DD46813A7810051203ACC7A42814A7121AA6B45EC9E37DC2F40AB96A1C025835CA7C8198F292390E3D5C9967865F2108DD17402DA657175C65AC47842E1473F9BD29DDE44388695109453B823E204A05A9B3AD6A398B69185028460F8230E3241E4012659E05AAA9CAAB8D8079C65919C8304EB6AA78330BDDBCCA763B91729F81B05BAC53BD31332FABC69D4CDB85CC0DF0B47961731D26A2FC1649A5B53A05CD13109479A75B48F67898C63713EC7883BC3744C9A60C23AF5320C645DE8C242C0B17EB97974CCF76D57180E40330663F9BC737A40C2202F47B22580F5CA070C4488B1B139D0155B1006A7B31A79F0BAB9239B9E4B7DBACB534790ABD0F28141D43CA52792503B4C0CE96B0F505A4E263D1E9429F631447719B8580C902385B221FA2C174866E8872D1B299706B860343BC9AAE6660B77C7E2BA5C8C1CAE4A054A60038743655378080044EC7D45D36411768595BC1D30A43AE3805BD77211E1EAB4C97C9A4F6408FC48551D880B4728388F55519757B9B258781AD2915D40C9DA27961145AABC1666253171A62425C8BA9667322C7C9599104C034C1168A50A47A44A7BD078B24726561488661CF70FB2B7242BC354DEEA94324622B55607F06221A65255C2924982964A2FAC5BBA75CAD6B4677DA45F96DB2F91FA7517AB968A66AF8800AD431423F03936F3614D3ED7236C8A32F16B4DED28285CD46A5AC06A42397A2CDAB0FFE1A70208A226233A84B4AA6B0CC8BC1A4913B44322FACAA7917D119556412880286405EB6C9A7E75CE74C75EDF794A067747AA0B31E99C1F68C25696207C90B97CB57C5088982129811E08773249C5898FD4B86D79BCA5A02C1D389530EBB1AA2ACA1DF1A60FE19649F7026B9229B39A60F29982EAA639D9830074CAC4C375295719C4FCD03A36D99DC6306DFF96A4AA1B0110D37A1E716DDCFB0A322134A978C1D0998CD5A8943B267E2B6B0D6936111BF630B0CC89A549405CB295038ACBF22B6E15788CC8966060EC4BD71255511826CF163A6C45AE24FA8536C39F8C19C7856A3700972FDB959AAD019C04269C97D7CA55121A567BBA5711A7F7E28A13F955DD06988AE2BFF90C4C3C605E0B200DCBF139E576BC367C1D151A8F7297B5C76CB826208EDCA1CB23183397A37A92B233F65494E6E3644A364EB8F05FD93248DABAB286991297EA1A87B947A8C0C1E32A9B336B44E5D045E4418C8BD366DF77C2AD90CA2D690C516B032060C32314CB7DDA818E80456E588248609E4E4BAEC2B30FC1E8A984082C23555093D375FF129CDE4498BFD4A40AD1678AE78C5647B6998212CB0010241703A781727FD755B5907B12350A853440B9019F7BC3738A1A2BB291A549A9892D74BD2FC4B13BBA718F9877BDBA32B7D07F0DF33BC0C19AB3C2B567D7110BD3592274723F5A69AFA632FE8C41AE7CADAA115E61B897C4444FA7099AEF0290A6A13E8D551A3DF565490A825DEB6D808AA7AF377B27355324C355C32358955B883F6BBD42C66801CC443BF34F2FA040FCE4B7237C4ECEAACA821AA8B248841D242B6EA5561B070E06F711528109693AA289740F97A4169758151ED57A15381EE35297016B0699C34F9AE039ABA26ABB11148BB4344359CF14466841C7CEE7B3541B6072BF021E3B8348E078510DE0839EC55C38290F5C5095B429AF7BC970CE46110F54967C42A2AF4A3CD5BAAA5BBB500EA382E9427FE02595B0E6811FE32E932BA6B479114F5B7224F98EFDE80CDDE06BC580B30A5175B9B38958393B3BF0573A7086EDD0A1F4C227FF124D62F0269297261583A7D7EB570E6A52C8B9240D1B1A79946FF3990DDD20AD71284E7B004656270DFBA0681DD2C5C41939D6391F4AAABA0ED3C6AC55B4907534DE05B775CC6284D53D045BB611F5BC62F603327C143E100B6678176A40A4949A923CA651F1D2589896BA74E41722B3A0C1C652BCC7ACA769119332A080211CCA8AACD4799513BB0906A063F2AC750C99A805B792699400F609960D177BC006227BA40CF1C547BD81C9F5D67947B6A7BFABA98415C81A4137CD2CBF024322633A8B1B242594581ED8720A794293FDB282EBA064DF25301FEABBBD14BA4FB8970B52B4E3574BC57218AEBC5FB9E731F5A85CFD1154B42575A0B3BEE2FC97CB691AE9F4361F11692D9CB07D793A3C6588ADF24FE098B0CEA860E0173C35223C678A10CD3752E97766B28BA562D1CB93935E97E73B6DFC3248217E44FB08684B5419D749D9350F143CC66E9921FA6C4180D43A721424C06864EA98CD3E60C12020AE7123ADBC2CCF40577BA4F87E10B755A1567941F98E0D0A0D26A9303383026D021F2284CE313AAC3C0A765D11747EEA8BC2832EC87B22EF31AD0D1409FC66A782B2B09AC43EBFE215862B6462996A3703525281BA8328621E436DBD533AEA69B62B429F83A78843051AA0D003C6F8BA224148E15A5AB39A6EAD69262627C7B0C46730C66D2109512D424849A53CE58B9FF463B87945CF9E253130A64CB1F18A2ED875D43026BB8AA2B87ACB00186889C082391C95273BB864E548ADD29A876B3445A471B685C659E213853C62E1A802E2B3C4C392575620597C7131F2764AE68B95AE190927E110A10A553E008F39054DE62C16912064F0B7711EF59E85E50E30395A36A11EAED23CB48A01C8F67729F6B638E3B6820A0E530ABDE31A97E7DB117B035897952F0A0473AAE5897A86725C53855AA43A16BB31BE7C564FDBA0BDDB44D6E64E7959C871728C7C5111D989CFB9026902B82544B528D4FA8BE3196C6318CA1BB791B7069EF2D225277C60B03C48C183484250B4FB0A5B05E260E8A9C958CA51F9BC69DA7ACEB006569B427D2A60C070D81C410114E753BF85651E3504418E747B8D787F0237B184834FF8689519034FF6956313120A0495267B754BA5015D8A134688B11160A2CDE5E8B18D4400AB95AC6CFBCF5CE72020C60761128CBCD5BD36817360663F83A7A263B9420A654C7280381092B4D295B3DAC03E918926B5C29BEB0478A01A39A8B0CCCEC05125D84D2872CAFC97A8627866DC7380DE17709FAC24EA1A0E00DAB5990A919E0262DA522CCAF9B0D3F11268D0A2B2BC4D85E641F64048A3557887A266A8DB13EB555608960E49618B1E39708B65151C4BB8D2154CE7B6A13F86B75367B005C9A69DA98B82ABB17EF9678EB50F3F097A6292930191A15FE075BC304D49926B3D71B675C26869B6BB93264F74702E17102DB5BCC881751120CB8D3E05215E4B34A505529BAB1A2A259B7BC7999404BD15272E44B9AA4BDC891E01A21B8A71B46725DD187E2041C07092CFDDC902D3DBAFC29379691644D0E15A8F7378298A8834D1C1B078384C140F460B144826188F51852AE0ACBAA1ADC4D86147C02F61C1B154193B2627C609682A6E656725774A2FC60DE52A3837537C421A58312A7E6BD1CB7B7661FDB3C1D9C51C3A6A44F260982BDCC01FA149697B24B00B76C5DA2908181E8CE21A28D9142F12659023536F392AB3781C74569DBA10506CB79BA214C49CD18A1D9A693734791FDB76360A142B71252B9020099B389AEA8A25796CA43BB5FA881277D742B6C7CC4651CDF47B91C73B7CC816B16F040DCEEBB3E27C68F0388ABE1A4B2B8B88820B30C9D03C1ED75A9E46774B9612C6C039C1F0404F40CAB35369BCAA80FA2C53975C63F75211B1154F94C3AEE4DBB3EEE500091BA629900A54245CBB4C92296769D979530371A0EEC19DC6718AFACCA91D219E37788802B5C162237A7274C3BE821BC969493E884DF2E915ADC3AD6F1919218C844AF94C983ACA8038CC3874C0C080161D5B4F1266420881C906C145ED15692E8C24F2574F80EB3265157EF3E63BDA96390AC160CEE8B6A79B363C290B4B35AEF49CA4DFFAC0F0423249F27A6CF77558F0631581B36E58AD1DB09F4781B8F813B0ED6578FFBA5A73FABA29D94B6F9238A9089CF41BEE300083ABC96CF379FBD0190841D981FE9CFAD1C7FAF23D2426AE2A959860220DFD26FEE86E0F4EB1D8E31B240EFFB9EF6091AA0BCF551A09B2B9177A8DA7AF8DB3F712E1653D05A47D61B59F4F4950549382E56F761D7126F8F9 + +z: 79E3B0D4F4AF344ED06FDE8BF4E104753E832294A3D2E4B66BE59149006A7B95 +d: 0596F1E214B29A0CB7A641EA0BB157FE01FAB73B4A9BCDC165FA44C8FD5FBF71 +ek: BF2A86AD3020C241CE4A00913BDB13F82266DD873742A3519E44C39F20874575A780370BDBC32F50F892366C3D3E5A3CBD2A1A9EDAC8D5468A4FD28D18281C4ADB485B033E76B3B604A5394EB6A280F81C93B86839C2198430558889696CA715CA0B901D762A498875DE991479A45725E12340953D95461ED32AA018E33BBA0157F3A6BD1BF07FBE2207D81166F5410AC20096E95B6F48E09190ACB51A86AD4C51AD1733729272BE79BCB14834A230F00C64E0416AF77C2F155776D6528BD0C9762B60350430A3BCC51DEA9966D791A3904A1F6284A32B4C865CC67C1B66A7F00BA3C9971AD846DF61348D2C418DE0901ED19D32582ACA784AC96A55AAE69D27B58973B4816714B2139C2DF5A380739C43CDF0A161AB8535F678FE344C5E4881BAB8785805C615711ADEA09B702201360B2479CC7FBA69868903CED7074D7F93AA7772B3359644B0A3A169A59C177CC60E8B4360978FC7C513A95C355643563BA0371D973F7A991AD099BF94239815C7041A312CC3497E9A40A5D3F9504BE107FDEA73D8769025D75479575F5A45974FAC400F0189076457A2A96D9BC2C1B19C5382C423B3333F0C9B7E26FCA8F2DB01265460A4C253EAC707B39109AF07241DD6A8FC5A9D18494C3D715424108114280F3A5C23CEF53C5507BDF3BA5EDA6327AC15B484793011241305462DADE02D4459419909075C09BA1044B896A28E17866FEBCC0A4970B1734C4EFA42780C380EAAB17C82B96D72CBAA83127FFCD7998071BDF8EC59881AC74177C1E194A20BF5A4DD71C4E03A82D6E40B70986D2A368C53C54BD7B0CCE1B5A161140E01047443497EFB4C4D3FE126686BA354B504B9537C27B21B56355BC0A91F82E94853801801AA5FD8287EB5A1BAEA773EDF16B376311DB6089AF1950A385037DEABA09ECC491F4882CD484604F304730C11EB3C561F36B85D1B1ECAE15FA1326F9EA486CE32978E9C267C70AA33E0113F4C3B618B405A160B4C93BF943C806FB41C62F83200B81AB2CC57CEE96364D86D4630BCA5A70064151545EA9D9A419E41242B6135AF3A516C8DA4447AB71478266E5BF69F2B846075C30F3368B30912BE48A00CA3365BBAE0597A93942396515A72B675C460BF4403872995AF19CC25C737F86B642ED740C9E5477C0154D05860A30C2DD49B14E8DA87600C4E8CA63401DA998D7689D9CB364397C4DD056474C2BEE16060D4408A3E19BF6FF8A331466209F0B428F0316CA89188B9C7B2AC25A7940DB7A1766799361BA984A1BB7E789B2438D6777F92A15CE7A2D156369AB819B116CD99076095C70D265651550BCC1F4307497BB77E75023AF91D31F4414B38CB64CB570AFB56701C17CB692A46A444455C8063A3616590AF6064BC337237ED1824CCD7CFB96B55FFF91D7D4714CBBA74DEE5AB48A28389458E2D43476CEA2B1A0B6EC499A83CEB8EB4C7539BD93D3AC987AD07A1C9F079850C1444D0B5C9CC619614301CD77776661357FA80F29A3CE4A8AF8DF55FB259B754504687508AC12AA81DB8CD19C93875AC5C4CF13E115221EBA49F3BE008D4B80E9EBB8AE0CA997313872010497CF9556DF06D8F766D2025B03099BAC8202C5D90B52C5397CF55BFACEB5A1C079CC02960FB976A735357DF16B90210194627A5089B1D29CA4FE8A03B4FFBB544A645C5FA95EB386408DC65AAD89CDF0285F3745EDA596D070356D350775FA7A088D732A61C1AC57306359B4A642B8AA8BB91A347152A916D33427DAB37143AE14B2D804B0FC033EE2B9D996853ACD202B2689AD945CDA48938BCDB2D8DBA5449C80891B103172381200A68BB7B505EC5A373E15DF301BB7547770A5B21A571CF4CE87B1AF38D3D38329BE9AD366159FF1919DB40233E86BB497652379B9099F68B22EA91552273AB1801CE6BA9FE7B07ACE9A81DBB09B11CC4AECA25B5090C6FD885B7E19941D8561A15CC35046EC191157C393168C80311432C899B0A0AA578460963E7767750560064B93AB148AEF2FC2FBB029C89126535C6BF2DC48A04748D23A6225EE6C3EEA9B68C65BCA2E9C804EA5BDC441BD05293B8C19D96E369B5C3459DABCB20565405824EC3F57475AA4E19DA21A8EAC0DD312E9FC10B56D6C6EF40A130844D8FD68769E2CC08288D770CD00556578D853FE4896886536AF0633EFF38C1439E3E7950091189960045B3B3B18BD45BE846AA63E4D3845BA0 +dk: C62AA41327AC132035DF838111878AE1BC660EB53459381290580906A45376761BEDA32D498611D642173E7CA019DA1AF1E60EE43601F1262D3B396FB5611FDEC023C891407AF4A8ADF85D4C010F7DE70829138F0F520EFFB4C8D5230253CA72A6FA3D4C4158A65C12FB9A36BA440A40B476D8C65CED2968BB18A11751993B725920399933F3B18DFA9A4ED87A7AB277DC027CC33A83E43B9DB68C8F68D72FEE7210E9E1471869B347C79B848C623834C586B341B23203D2CB1AE5E9CFB87A1794D43598EB0CC8836BDD42371AC9B7D0513F4A7840C0371D73BA88A7DBC5A5753020298E3D616A8DB46C81C80045A553984939D7593535D6BF2A330BE54A3D1CC0B09774279F952A59F673298C6B1C078E0FC87038D03304E0C4585577A6842815D9C9F41534F216B5B0474F1574BE15051F3DD69CE3E9870AB13FAAD180C82A1ADC2927A1D20EEA168A97DA7ABCFB617B7570009AC7D212B6D05483B7F54F7C201588A879235823038834685BA5C7649CA7931D3D2B155A3410A76900E4738A24A614AAF119D8AB6111E383BA33A4614823063C31EDB9B031953AF6FACFD3D65ED1557EC879B89F3709D177A8818094B35500A10B30E10C7917956A0181BD6B0817F0D85347430EE6724B5380BEF508AB3B468AB6C8868FC48A62F3445104A41C8C288DDC5746C84301E5315C603F80E9B83F6C16920142611CC32B18BD7AFC28D3D343AAEB8AE7133F88E388AE6C7C4911318A3957904AA51E2905D5A02C30CB57DA0551B4134182C060DBE80BAAC4981B410D1D5104D92BB47D3BB6846937CF6B961FE66BDB5C069A0304D91AA22D8898F8067295DA9BD6DC3408F3636DE5CC6948C9DB2B17DD4651F1419668AABEF031CD06FC63BB9749C4DAB8A160B5A4C6A13F3A4F8941712EFA60E5B426E1BB29F65940368594B681CD30D41377F58254964FF0AA4D3A5B553327762036757429CD47D57DD73698BA0C765B3C539CE41A04A58775E70D4EF38D2B9775D203982479937E5135FF1B944F6CAA0E87269E52B52DDC3958C99C668170879B7FD03427C4F38E147B6ADEA1BF0123B01CBB199644AAEA95B76DA7C5E60839C3EC0D50C4A01E79810BBC1220F612FE34A89B173C7E6042BD876D0EDC2D9A03559027AE0844492B539F2843A2A49C6E969C121CC64E4CDBC624167C22911A27656109643F695334F3C73694758F06E94CBC15385F181EA1B012D93C5AF375034514074C92401A455BC21C8B97AB7D8CA64B58C415B53AB4D322CF28F69882A4C0F5BC060AB09AD643311F29398205753D623EA424C7F2D38CF0E1074F1CB5A9E91B19D91A637A83E15B3DF5B7C7987A4D5FC151E9012021F00CA8E31069F9451E4B6E5D7331E85980077367990AA632009EDBE0432722A825829074953E6BB752C7D86490D7C760E7177F54806CDAC557C70C3DA151B9F30877B22FF8742BE8077C7C82A212BA077C148D90E86D5AFA15AE30362CB287D3BC318CC28FF74AA74536A73009C00E9B8A7F8AC11BEB5CB6CC965D672141DB7784B8BAFA395996FA4DF8C5C014C8B73C3302AA6542950A163AAC35D7C222B1A2CF5C9A820D682B6E98242B28B8B9D32E973B823027211784415BF27E2A0C60125295BC35007E21A3CDB4BEB6E26FF26069DC1BB675032FFFF93924870F0616BCF6679353200152369881182937565B3BF4711882C9823B800EA93CF7889B14F521C5A34C81A6354B70CF02D0C195853846505DC2E82B3F3651815480CB739AA49C55E0B763C9982C69D0669DCC76A3D262C304843FD322E973159EA358E5811D4C324914BB89DC7BB1BA61C4C2E9C25B0886B6F5ABEB827992B6798250975BE205B6252CE3DC5DC2E00D4CB427FB9338D6A19166C2978EEC81A645714765095E89799082AB42D08FD2305159B42C80B13F44AA9FEB46B8F3A5552BA534B9F26A2E5B2C00822CFA573106555C9E8C5B1475A38E4782675B9A6FFA294A7B0A2FB26AA8387C46C20363B2BE83E9AF100211B02701CC0A10220134DF6230874A83C49CA846E1106591AC21B82BB587583C33BC97BC62C53C316AA58C525750225C795424B780EA39E9E79588AA9556B2AB9BE98057046EEEC406FB4A81ED364964C1559EFA623307A891A9B7F06433681B2D5F583257E2968786A77CB6C9BF2A86AD3020C241CE4A00913BDB13F82266DD873742A3519E44C39F20874575A780370BDBC32F50F892366C3D3E5A3CBD2A1A9EDAC8D5468A4FD28D18281C4ADB485B033E76B3B604A5394EB6A280F81C93B86839C2198430558889696CA715CA0B901D762A498875DE991479A45725E12340953D95461ED32AA018E33BBA0157F3A6BD1BF07FBE2207D81166F5410AC20096E95B6F48E09190ACB51A86AD4C51AD1733729272BE79BCB14834A230F00C64E0416AF77C2F155776D6528BD0C9762B60350430A3BCC51DEA9966D791A3904A1F6284A32B4C865CC67C1B66A7F00BA3C9971AD846DF61348D2C418DE0901ED19D32582ACA784AC96A55AAE69D27B58973B4816714B2139C2DF5A380739C43CDF0A161AB8535F678FE344C5E4881BAB8785805C615711ADEA09B702201360B2479CC7FBA69868903CED7074D7F93AA7772B3359644B0A3A169A59C177CC60E8B4360978FC7C513A95C355643563BA0371D973F7A991AD099BF94239815C7041A312CC3497E9A40A5D3F9504BE107FDEA73D8769025D75479575F5A45974FAC400F0189076457A2A96D9BC2C1B19C5382C423B3333F0C9B7E26FCA8F2DB01265460A4C253EAC707B39109AF07241DD6A8FC5A9D18494C3D715424108114280F3A5C23CEF53C5507BDF3BA5EDA6327AC15B484793011241305462DADE02D4459419909075C09BA1044B896A28E17866FEBCC0A4970B1734C4EFA42780C380EAAB17C82B96D72CBAA83127FFCD7998071BDF8EC59881AC74177C1E194A20BF5A4DD71C4E03A82D6E40B70986D2A368C53C54BD7B0CCE1B5A161140E01047443497EFB4C4D3FE126686BA354B504B9537C27B21B56355BC0A91F82E94853801801AA5FD8287EB5A1BAEA773EDF16B376311DB6089AF1950A385037DEABA09ECC491F4882CD484604F304730C11EB3C561F36B85D1B1ECAE15FA1326F9EA486CE32978E9C267C70AA33E0113F4C3B618B405A160B4C93BF943C806FB41C62F83200B81AB2CC57CEE96364D86D4630BCA5A70064151545EA9D9A419E41242B6135AF3A516C8DA4447AB71478266E5BF69F2B846075C30F3368B30912BE48A00CA3365BBAE0597A93942396515A72B675C460BF4403872995AF19CC25C737F86B642ED740C9E5477C0154D05860A30C2DD49B14E8DA87600C4E8CA63401DA998D7689D9CB364397C4DD056474C2BEE16060D4408A3E19BF6FF8A331466209F0B428F0316CA89188B9C7B2AC25A7940DB7A1766799361BA984A1BB7E789B2438D6777F92A15CE7A2D156369AB819B116CD99076095C70D265651550BCC1F4307497BB77E75023AF91D31F4414B38CB64CB570AFB56701C17CB692A46A444455C8063A3616590AF6064BC337237ED1824CCD7CFB96B55FFF91D7D4714CBBA74DEE5AB48A28389458E2D43476CEA2B1A0B6EC499A83CEB8EB4C7539BD93D3AC987AD07A1C9F079850C1444D0B5C9CC619614301CD77776661357FA80F29A3CE4A8AF8DF55FB259B754504687508AC12AA81DB8CD19C93875AC5C4CF13E115221EBA49F3BE008D4B80E9EBB8AE0CA997313872010497CF9556DF06D8F766D2025B03099BAC8202C5D90B52C5397CF55BFACEB5A1C079CC02960FB976A735357DF16B90210194627A5089B1D29CA4FE8A03B4FFBB544A645C5FA95EB386408DC65AAD89CDF0285F3745EDA596D070356D350775FA7A088D732A61C1AC57306359B4A642B8AA8BB91A347152A916D33427DAB37143AE14B2D804B0FC033EE2B9D996853ACD202B2689AD945CDA48938BCDB2D8DBA5449C80891B103172381200A68BB7B505EC5A373E15DF301BB7547770A5B21A571CF4CE87B1AF38D3D38329BE9AD366159FF1919DB40233E86BB497652379B9099F68B22EA91552273AB1801CE6BA9FE7B07ACE9A81DBB09B11CC4AECA25B5090C6FD885B7E19941D8561A15CC35046EC191157C393168C80311432C899B0A0AA578460963E7767750560064B93AB148AEF2FC2FBB029C89126535C6BF2DC48A04748D23A6225EE6C3EEA9B68C65BCA2E9C804EA5BDC441BD05293B8C19D96E369B5C3459DABCB20565405824EC3F57475AA4E19DA21A8EAC0DD312E9FC10B56D6C6EF40A130844D8FD68769E2CC08288D770CD00556578D853FE4896886536AF0633EFF38C1439E3E7950091189960045B3B3B18BD45BE846AA63E4D3845BA001699FB3EF1CB24186CF884DBF62F4BC68D598BEB013F7C438C66E180500AD0579E3B0D4F4AF344ED06FDE8BF4E104753E832294A3D2E4B66BE59149006A7B95 + +z: EF0F95F630F41B3AF911A30E543822DFA6B7684FEE36956D2BCF8FF080C9FA26 +d: D7349F9AD546CFE9830E1197072B6ED9CA21E8E0423F145F1DB84A5AEBA230EC +ek: 4D09B276CC63BC453FF20B31FFDCA2FC3C34AEA706769A58AB6CC210551683C2BABC76B5CA69256816172BD926BA7C91A4DC12AC5A3FB087B6E1D3C0042BA5E0F98E5031A6E5077108153CCE342B1F832EFBBAC43A9C0B5A01283522271E649C3AE8C43C541C88603E58F99C1E8502DB34CF70AA48EAD6802844A7B25594308537BF657A07547CE1380AEB994F4F676FF6EA3B9A728AAE5B4E4FF34A5B68530C582194320E6BF76B997A8CF42819DE5B0D1C82491E741CEDA8AA6280094E332D95FA799FBBB769B2BF769798854899D67C1007FA29CD7245F727CB206456E4020F80A9600DE948DD2AB469C1883151A440C49570430D003C97642601CF010C200198ADB7ABC04379864C7FE6CC8BBC29CC1A6335869ACDE9DA9DFFA17C7B8747848CB7DF12B52E8C5EE7144F2EFC3ED00846B9F72598219793A6397E7726F8242B5EB92EBE2577E686B980F34859B07FD24084057B13A98880C93458D59BCD5AA68314EA18E80A94CD826FDBDAC1F05A472DE0872027C1CF924D5BDC9F236B1893DA61486757FC758806F580279919862C0333B15A66C138E4DC6ED50B17EAFABE9074AF14270C20806AFF0B58ED97631884435A55A8AB394EEEF5347B2640E6980C41A30A18E85A86074E03DBAC48855DE4E94538939A4264593B649E5BD981E0917C26D563D287A600EA89CEEA7021E754384157C8ABC5BE47C7DAF72E15787D1CE62723547B0AD86F852B150A25660A4A074E707884CA7934F9BEE2555A0F574B7F750DD293496FF681A09A4976671210FAC3C8C84A03F99F39A7B649A19F3E05A1D0E7A3728B253C5784F92CA7348A4BC086460A24B620845662246F1C0AB9BF91C8CB301D7DC362A3137643C92C8797CBA7E59A17DB9B99D08977D56A4F34AAEBC16FFBC8822822931FC73DC6BAB320972D96C16DAA41CCC89312E43275856856C4598313417C1B5261D9C1430A16C1D2F3CED08C862A21678A170A2E1A643E139873C878AA469F163C97AF7C7A1DA41034878D7E144DB826A7AE48B97A5A131185813D775BEA667CE0518B11429768F58BC30946766A6FE5B7BBCDDA7CE18C29F396307BB456AEC16FCB989F32660CA348A83FF36D1AF452C4584E117A3105C662135997142AB16CBB7C7D28560B087BA4B7B66A00563EFA3DA1C4764F8B7B5D128EC6202C505AC9446015620C359555268BF6AF74144EBB26351E98AF7DA51571F16A01B320595754C0DC23BBC75A8F036A5F6C3AD76907FBEC72530855891381B9F2B719429D4B6BC04F014F50FAB14131C60CBB279B61469E1B8664A38917CC308FE0C7AFF637DD4A76BAB66F08487739B20B9EF850F7F20DD83A1A47B53F00471A1617AD164AC1C04A8180BA68984B4F5DA9BBE1D0CA352509BC0211DA0B321789A61C98222508A03E0A6A7CF3849126435F36575D63B342FC2F02DA45FB8B5C9BBB6E064328550CBB6DA1AF16424A3AE9C1EBE566F4C4A883F966479C0BCB6585D3A2B1E14C3608E05AC5555454EBAF80E5C7BDE47B12F66118027E19F325024A5D51779C17D1B933A1CCE61003D018A3BBD67EA16B02EF997EF0678CB776479C52203875774C05B0EA9586FDE02964B8C3E1968B9940C88763822AE563D814BEEDE38A7D1653B2131558231AE3470608B51FB78CAA99C7252EC8AEAD74025CA8BD5C038283181E9381C73188C403A0B6F88B855FB5673B180F7581AD69513163379B34582128575DCA936A614A17C84C36222C3893D4B5F97829E132449490096605B61925844E31982BD601538739D8E7B378E180FA6A7EB9874CFBB8069447A96CB81169F3514CC20A93A42E0C9CC321EAC10B8AB21A893FC247BD557B6485A9C433390076573EEF854C2EF08AE116C58FC75CBC03BF8FE7312EA5305781CAC7273A78F01C73319B0B26670F26513E57660340563ACB16CEE7CE7CF0BA52671E23A44C85EB994A7A7BA15941F4C301D3B87E0D2A75D2EAAF1789237BB5B02930CE6AE5B965DC5E7277C8EEC0676C55436014AEFB8AA3B1BBA2D07B1F91487C99673A9135611BCC3B3546C42B23CE0A8099D6666FDEF62D402925B4561DEE3986B30C1C6278609496A474928D0A8351DF30C83CB4BF4BD826CB4319BD620C7AD5A7F1EBA1B8913A46D0365285A38C4C1574FA4287C02D71E91A43EF856ECCF60978C7B83099574EAE8C27A0571C4E51B320B34ED55E8B1E576E +dk: CA16BB08B42E527B707E18B2ADDC64F2FB9542C89FF37B4B9187C72DC602FD83CA619836032C19D3497D49FA2AD23C0939721984DA633C14BE7300029CEB1AEE6631F236060D378852F6B1453214D1C87806E42E956286D2356B7B42731B054829B72B6A89BA4C16308A00C35D59A717E72BCFE69DB53C77D6295243FB599FB3BCA5E6C179205E15EAC020826EE8800A97EA3B51400103A362D0669550D1B56C466535B148862258EF25C3FE14A16362B5C940362B30C2E9A660BA66837071AC18D802392BCF17E62AE718288D175B0A61A3010943131070F84374A47C2EA3E690F7660E67E1B813DA13B9E52BB422A2145482C1A536D0E81BDA906A45DA576D09350FE9C223BC31D89571FFAC999EFB71FA59B29B0431FCB68B1FA37DC9585012414212883B640A10E0937CCF3BBA568A2A519B1EB02B515A26335FB52A1D6B9D122C212A913520661A795855A4D65695D4469C3766FEBA11AA4CCB77B4AAE7608A82EA2E22EABD4105075DAB6D88591A2B2B5B11918C15735DAE6546BEB95656F195F0BC70A3FA3D6FE9898BA1284CD368666C8D8A51A7440411525C3F6C694CC586CA15EAC1CD4B88A1A8CCC713233CC5946C009799DA4EC0294CAFB09D94580EE4E705FB842CDE2429694141C0062508C79D69A2515B843204B3857F77A352764A88A5677C885F00A88615E3524C7A609547184FE029EE7572DB3C821C8552FE499478DA9DD708BF602B73F180B5C801C9D7465E77C7B42A97CAA3F4CD7B62BF0AF7A7F2BA6187129012E5C7443738572C1BBDDB784459B9921B9B39D020F169BB7FC6CCC2B71C231A27462BAA34531C3838A1C13B12F353326D870D541895E259208AAC459D44C7CFC44324AC3CC2B7610C96BFAD5806692CA9F567500894A073629D66741A3EB33F56720FC80305F60791BE328DC8C28AA10097CCC03500D1601C25CE03550974F12F8E384C8B310F32A5CA60DCCD230B89788B41CCD6825251C601B54DBEE636CFD491E5B071F8A1BB599144B402C007B80C73B3AA4E6A591AFA2F108C1BDABA34FCE43866661954A046F0D5AEB0F681602490B6118C2ABB67EFF83C349933AF394185F72BCBC80F0C1751688A42E247451DA4BCE4DC5BB5204121236623095B25E91B95E0B5C196699E2CC284B88FFB11426F8944AB174DB91484A2FC7787A97172596DBBE0AF50C68CB9726C11ABB6FF6366CC280A23D457B638A307328FB5E70403EAA029D2B121118AAAA39089E655857391C0D4A85FB7AAA84448CC12A4CE428A37D5B6DE999C7CA82879112E17EAC572001215EB8F3F07C153E6B251E699B3103855C747A6B2A1FF44ADEE996EE5F545373C972D431854DA74DD744CB3C7CCE52A31E332112D70736EE859CD47C381691C9275B8FBB46299A48BEC07506D65337BF64CC5F50E2C3A2FFEE688AF4B52A4DAB2E2E4267851AF5C2CB55255629036674E0185E069266667B9472C8DCDA95B4B16B5845940CB7A378E3CCE2FA9CCDB787415F58C30C46E691B6B6DC4A8B0C892DFBC7699599CE25812A478874568260AB482C5F69D7E773CD928BEDCE7067217C0454310B1694264E3A9D3E41300B87543B4235CF432597A5638EA41637CA894080437766C472047BF5BBFBAEA557B658174A576697613A8A73254DA332F6B232A65B9017928288A44FCF8889CE79718A329CED152E35B4E4EDCCE1B197DACC7942D59C2B0E80A0FC74FC726BB951898AA15CC1B106A383AC10EFB4D48445F9CF59C4BA17D5817618BB27879067FE2615EAD1A2BDABA6C17D422DCA06C3C4578B873B17714A6B8F2AFAF8CB445F04238C954B38B28D1028D451A25C3797872601B98543029F57671F52F8F25AE3C88144D011B22B88F9E60841C3BB52205A00EB24D3254B8C37BB845E10A14B528A8D6C1D07B7AE4E66E4F88C26D116A853B4E41ECC6AFFCA83068188189063030B5BA854541433CC454133FA2B5A3407852A64D9277883DA9AED1D982695854E8D3B114DA709E1BC3B926170C4A2ADECBCF8402A3D9253851274BFED70BDBC817DDE56A166B61DA0793AE0818159C0626BAB102CAC3EAA05D8F996D6EC01FE5E9061147A98EF4A5BA361508B385A5060D5FD0C462F340B943914D117B7EB032348003E89C3D888485E3FA9A3489CACD855F4E55864D09B276CC63BC453FF20B31FFDCA2FC3C34AEA706769A58AB6CC210551683C2BABC76B5CA69256816172BD926BA7C91A4DC12AC5A3FB087B6E1D3C0042BA5E0F98E5031A6E5077108153CCE342B1F832EFBBAC43A9C0B5A01283522271E649C3AE8C43C541C88603E58F99C1E8502DB34CF70AA48EAD6802844A7B25594308537BF657A07547CE1380AEB994F4F676FF6EA3B9A728AAE5B4E4FF34A5B68530C582194320E6BF76B997A8CF42819DE5B0D1C82491E741CEDA8AA6280094E332D95FA799FBBB769B2BF769798854899D67C1007FA29CD7245F727CB206456E4020F80A9600DE948DD2AB469C1883151A440C49570430D003C97642601CF010C200198ADB7ABC04379864C7FE6CC8BBC29CC1A6335869ACDE9DA9DFFA17C7B8747848CB7DF12B52E8C5EE7144F2EFC3ED00846B9F72598219793A6397E7726F8242B5EB92EBE2577E686B980F34859B07FD24084057B13A98880C93458D59BCD5AA68314EA18E80A94CD826FDBDAC1F05A472DE0872027C1CF924D5BDC9F236B1893DA61486757FC758806F580279919862C0333B15A66C138E4DC6ED50B17EAFABE9074AF14270C20806AFF0B58ED97631884435A55A8AB394EEEF5347B2640E6980C41A30A18E85A86074E03DBAC48855DE4E94538939A4264593B649E5BD981E0917C26D563D287A600EA89CEEA7021E754384157C8ABC5BE47C7DAF72E15787D1CE62723547B0AD86F852B150A25660A4A074E707884CA7934F9BEE2555A0F574B7F750DD293496FF681A09A4976671210FAC3C8C84A03F99F39A7B649A19F3E05A1D0E7A3728B253C5784F92CA7348A4BC086460A24B620845662246F1C0AB9BF91C8CB301D7DC362A3137643C92C8797CBA7E59A17DB9B99D08977D56A4F34AAEBC16FFBC8822822931FC73DC6BAB320972D96C16DAA41CCC89312E43275856856C4598313417C1B5261D9C1430A16C1D2F3CED08C862A21678A170A2E1A643E139873C878AA469F163C97AF7C7A1DA41034878D7E144DB826A7AE48B97A5A131185813D775BEA667CE0518B11429768F58BC30946766A6FE5B7BBCDDA7CE18C29F396307BB456AEC16FCB989F32660CA348A83FF36D1AF452C4584E117A3105C662135997142AB16CBB7C7D28560B087BA4B7B66A00563EFA3DA1C4764F8B7B5D128EC6202C505AC9446015620C359555268BF6AF74144EBB26351E98AF7DA51571F16A01B320595754C0DC23BBC75A8F036A5F6C3AD76907FBEC72530855891381B9F2B719429D4B6BC04F014F50FAB14131C60CBB279B61469E1B8664A38917CC308FE0C7AFF637DD4A76BAB66F08487739B20B9EF850F7F20DD83A1A47B53F00471A1617AD164AC1C04A8180BA68984B4F5DA9BBE1D0CA352509BC0211DA0B321789A61C98222508A03E0A6A7CF3849126435F36575D63B342FC2F02DA45FB8B5C9BBB6E064328550CBB6DA1AF16424A3AE9C1EBE566F4C4A883F966479C0BCB6585D3A2B1E14C3608E05AC5555454EBAF80E5C7BDE47B12F66118027E19F325024A5D51779C17D1B933A1CCE61003D018A3BBD67EA16B02EF997EF0678CB776479C52203875774C05B0EA9586FDE02964B8C3E1968B9940C88763822AE563D814BEEDE38A7D1653B2131558231AE3470608B51FB78CAA99C7252EC8AEAD74025CA8BD5C038283181E9381C73188C403A0B6F88B855FB5673B180F7581AD69513163379B34582128575DCA936A614A17C84C36222C3893D4B5F97829E132449490096605B61925844E31982BD601538739D8E7B378E180FA6A7EB9874CFBB8069447A96CB81169F3514CC20A93A42E0C9CC321EAC10B8AB21A893FC247BD557B6485A9C433390076573EEF854C2EF08AE116C58FC75CBC03BF8FE7312EA5305781CAC7273A78F01C73319B0B26670F26513E57660340563ACB16CEE7CE7CF0BA52671E23A44C85EB994A7A7BA15941F4C301D3B87E0D2A75D2EAAF1789237BB5B02930CE6AE5B965DC5E7277C8EEC0676C55436014AEFB8AA3B1BBA2D07B1F91487C99673A9135611BCC3B3546C42B23CE0A8099D6666FDEF62D402925B4561DEE3986B30C1C6278609496A474928D0A8351DF30C83CB4BF4BD826CB4319BD620C7AD5A7F1EBA1B8913A46D0365285A38C4C1574FA4287C02D71E91A43EF856ECCF60978C7B83099574EAE8C27A0571C4E51B320B34ED55E8B1E576E82D819925EC1B1F45E255B12DE1637697CDDD47F41DDAC13484983D75BAEDFB2EF0F95F630F41B3AF911A30E543822DFA6B7684FEE36956D2BCF8FF080C9FA26 + +z: DDD4871080BD4F761D972085851DE0A0408A2F5EEC3CD3786297A782402CA440 +d: F05117E932CA0E0C202732DFD4F674BF5848219A76C64A0650C27E2E55095513 +ek: FB28C9266161FFA370AF3C5C163A9B187A5D2499115A1120F2B84D71948E00A7969685C8FB6B8185566ECF337E1E20AF4E4A87D1F4BEEB1BBAEA51499960683C45B53057891A288E5A8393C4F19A06C222D4C9AFEE5AA984B6798D45A3F271793E77A5404677B08A1BC5D3CAB9D9A20A4880A11B71B7D4221C1302B8BC24FE65C4C63BC7D1B80D8BB40A7FB535C672BA32496904A9976B328A2002B14E9A071713CBD9B48E55359D451C3EEC47C4A7B9CE61AA5A9516C34009A8085A98725C13949644A72A338DBB7621530858FA1B40D6BE5DA89E9A422A08031CA3C003A0E31AFC4B36D97B4508BA3537DB1B16D1A5B5A98E6BC1CB70696F887940A60498E276C1C900036A30735B20B9762A3517C136A9DC20A8F5CD73BBB047A00DDAC6A6DB40BCAE42C1D6329FF54B9C37F82CBE6214C2A99E31DB80AFDA9BAF06916BD3CF83643D27828130495CA2FC67EA441E38A8032CF0003926901245973EA549EF48A9C65ACDD5E25D5F9834CCA805AEC7CD9F687D5CEB8C2CF04EB6A1356B68AA7AB9CCE7452A20C5344F11BA6197343886A80798098C63AC5AA6095FA2A1D2B0A07195ABB3E98057953AA0B20C00FC06FE553FEDE713DD4662DBDA4C7806B44904411D85C8B9C57912A72A2D25460467CA25027BC74C3066C7A941858EE4D04026914B45354D342B6643A280CAC8C9ED60B9AE021D38303799387D12A98419C26010FB9492262002B0002FDB167FB668B2D8C453987E83F570A43AABDFA5762015B9FC196FFF6542B189395BCB5C4AE598A858597622240E01856B17511C480627B4818C413ED065C68F359266008E888B9EC435A906C6721CF8964885A160C0512FC4B9B454A10E9954048B3212AA9C37A27D2697B1AD530FB33974AB25AAA9F33B85358454610E94410D47F85920F2A7F5D13C74CA4C6108B768A476C5BACB57F17AFADB60D437C21D397A09929B2E97915254A0FAB1848779726D766CE6C83639C4172DD5A1306CCCBB1491D56C1A5FB7CB5FC7836F0765246815F05A2A13385920D0B2C518395AA997E1D33A2AF588B7EAC1DEF4BA688555EC4961596873CD0A0A443551269C73F0B97B6F8CBBDD45BC5A15356BE370FAD74805032940AC0E9C2269C0FAAC67A647FED78E83094D08F58C23745E2BA70366F24A42635A944771C3E13C8EA25B8BD6B8B0783487F1A7A4A15776DAB44EF4192880BAE74C62DBA92A24782CB91237CEDA6E84A0C68244B9CD350DA0A67CA5477EBDFC4D40F59EAE1A88E9043653F5882CF614611641380CBAB15B6CB4189491ACA9D1BC22C56928A7B37E678A4819D48A7D27887F12B4E3878E8318BFFCD93B2B9C4ADA1676BB72B93DE19295DB59909315DB1209E3A02193C1126DC30BF77C6DF59AA4EF921020253FE2045BAE6760C206A7FDDB596EF802B1F3C620D353CDB008AA0A4B8393744E25A34ADAA31D2313B480C29DCC8DB110049DF796DF298CEA91015C9686FF3A300A7298F4B7237A893E02BC373641CA88F2345CCB4A6E7441D30B244814A665F08A18146AB65C3761BC5A87860B2E20482EC89D444180D10337C45C702D82A51DD036B5EAB0FA81B017BA82E16AACDB3A96A53775B9874EE8079CEA7845C3CABE0C847B7B4BAB1FE0680B12986D821968579D963703D90AB8DE020A7CF28DA8395887B2ABA5C09BD7102B8662554D1C472578A9F80CC15F431F18980BA1E26754243102D03D42E69C52AC25EB3A19FCF57FF9E1429E78CF6AE0A501AB3EC26C0D729B142636B873E9B68E277370366C0FE0543E44C08716C4F9B06546B1CB3DD243B505B1A15976B33788E8D1987F810D5797A8E9CBA8B126923A1A81855151780CA9CD4055D9495603A84CD7886BBFBCAFF499066496C967501DF3D861B97C5D250016BD3B3A18946C0CACAC1238CD235A6A609611EAE792E0560B831B636309517AF489A30269E172BBE7470C2D158F83C4B20F15C524025D6CF164200B3870663809A00E6A982835C87F80A68AFC1B5393B006D220A0AA26B9666690549523A0A9711E03B2419914FF76CA69A62671260B34F1C1A11A6E64067908839B87D2940D433162393A6F65B08E4CA643201023C63DD3C3808E9625CFF4C346491E34153937589310437069622208C646AB58584DF10F9930BA2F761DE4C2564BAE2B31A9A645135536FCB58B94489E4D993C9FBD4A89198AD91BE052B5E8FF +dk: A6247A7F4938C4589C972C928D7C65B74634ABE136E1C732A094A539E4892780BF56A5A7CA52AFFAC643B7168B997809AB95C8DD4740954164819C4D94453053634316F3186DCA4A03E813BCF763E6436E05DA840EAC0FB65B11D2D97EA80B156966C5A0DC43799B74F3797D483486E4647C8EA61569880774D68C9EE2A5907910839A95E8E33CB10B2AF59C22128B0C8BA9AA7D0B7A48E26C6E157D58122A63E571B059073AF35AF40282D1C8AC2ED5B15B2C980D6437C27212B5CBCDE888BD8F4B1B3AE398182243468C98F453569C417CF3C043BE9A9BBC03D058212523F0A6A2A263381967A562B63E7C1A83A4BBD1D86226B5083F8B54D93413350B39270C9E784430AD30752ACB0CE0F2B7300B478A3801C1133A84009106DBA42AEC03AE413F137812A35B4CB29207A7FC332BD07064019AE8CA3F6A723191058D88A460D40522FFE0841AD5507B1942434939260228CD993266DA1C35B920012C0E349C224D492DD6D197CE7473FA25187AB87C192A5382FC3DB61C817DF62221666D6D4858F807C852853EB1AA8A7DFB4A79935711698572E12485294DF538257F44AB92A60D5D23AC91F56E138025BE0C93F995BB3A9620ED0A7588857B4F847F996C9D7DF40BEB05C87FF79BCBF222956CCA23F377FC36140FA379CB89365532490D470C3C5B4CB8F3560A7A0C7FF9A19AA0B0E03C100B5090AB42A9C652399FE79716B61921DA7211ECABE486A3E95B3EC0E79A4DB614F5282F2C8087F8A1CCEE9417D4F99C108202C92499DACA10E3AA9B46D254BD8593316B9D220A96496372DEE61B51E93D51E9AAFDE006AC267037044E92A3440A469BE8AB36C3A70B070C43BF889F1DAA6E975CA464F32BBA725D75016B86C8089D9338C9816FDA6220169CBD445C7C78136E9F56A431957068373DD3480F7AF88ECE4941A2FC3BA9C2A474FC1D583A59AA42795365B6C0954F3AD810F55B5B0B959F414137B7C3AC0351812E9B00E8B6BE2953C7AA839F24F02D8CDB356CC64B5A361EEF29A2FE12117D9CCB86D4A399F51CA8D796A29778474838D903830706A854E83BD0267C7CD43B927B83DBB29C63E32FF5ACAF1A2A0C50609F4381C32E78B583808841F6300AC40302CCAB18A945FD0CB510588796C61540FC559800A7A1657736B347C50657E559685A226B19F62B34050FA4D76CCEB3A9BDF5A3815A7F4558AAF108958806C16A264132968DC63CC40342239E7640BD394CF418CC3298B7ABE9CFEFFC1714E96486CC73BA380E5A79900AD19558C68EF1BCC3DADC3E7829BC7BC09F407C6384E51620492E5B643B10B45E3BE52CA851709582C9DE447A501A07026528239054901882F5B74E6DC791AA9397DE9403D5519F1368084EC65D8010390F23C7DF604CAD8092E950901F9860A267578AC5043773616BD1792307AC8626201CE2A4FD5613CD97A074F3476094BDA4EC32A161855A4888223327978A8F74625C74A572C37C027E619C7D5577335B3D61E3B53191517C5A50FE62C63A08B6ED65C054EA98CE22C7464CA2DB3C23724C9868007133A235A36A7C56BA237FB58237F7C61E4A66F7B51A2751CF3706367413AD57A01B687107A513A46ED70025B41B785354BF986D4687369F97759D12551C6BB203A609F28931DDC076E6E38FFD083EF4E99B8C3919DE18BC7601260CE74EB75779FD1C6EDD4C843F770F6504B4C468A80C8C3C37D80902C736A15539406A7BF01206173066D29902348708799C2A7C88B751D62BD2760488357836B4019DA55B4A3050242791EF3C94AAC0A821BB71A90840B7E06F842398CD50282A15718E29BB4B75796AE81C76503629056CAABB2A0A319761C10EAEBA23BCD3033D911ADF754C25EB3923331BA0C332CF357758469D765A2C492565923872FB1322F5E1672E010DFEB7815B940595CB4FB6B64FDE59A63C689BE4B7828458B31BB5103EC4C8F1F905FEEC2AD1D10C7689C5C0528A56E4444C958107868E477662C25071E28404AFA86411910D33B618276A5CE51850F3B67584949F75651180298E3C791ACA85590E6BC59C0C8365DC6D5AE02D34D91B1E6C7BEFCA8C7F042070E32BD4883ED1D15128D516A40235A086A6D385784C457FEEB1C704C426CA4C48155445E414200A7CB6A0B9C0DF343CBBF95C7655B4FB28C9266161FFA370AF3C5C163A9B187A5D2499115A1120F2B84D71948E00A7969685C8FB6B8185566ECF337E1E20AF4E4A87D1F4BEEB1BBAEA51499960683C45B53057891A288E5A8393C4F19A06C222D4C9AFEE5AA984B6798D45A3F271793E77A5404677B08A1BC5D3CAB9D9A20A4880A11B71B7D4221C1302B8BC24FE65C4C63BC7D1B80D8BB40A7FB535C672BA32496904A9976B328A2002B14E9A071713CBD9B48E55359D451C3EEC47C4A7B9CE61AA5A9516C34009A8085A98725C13949644A72A338DBB7621530858FA1B40D6BE5DA89E9A422A08031CA3C003A0E31AFC4B36D97B4508BA3537DB1B16D1A5B5A98E6BC1CB70696F887940A60498E276C1C900036A30735B20B9762A3517C136A9DC20A8F5CD73BBB047A00DDAC6A6DB40BCAE42C1D6329FF54B9C37F82CBE6214C2A99E31DB80AFDA9BAF06916BD3CF83643D27828130495CA2FC67EA441E38A8032CF0003926901245973EA549EF48A9C65ACDD5E25D5F9834CCA805AEC7CD9F687D5CEB8C2CF04EB6A1356B68AA7AB9CCE7452A20C5344F11BA6197343886A80798098C63AC5AA6095FA2A1D2B0A07195ABB3E98057953AA0B20C00FC06FE553FEDE713DD4662DBDA4C7806B44904411D85C8B9C57912A72A2D25460467CA25027BC74C3066C7A941858EE4D04026914B45354D342B6643A280CAC8C9ED60B9AE021D38303799387D12A98419C26010FB9492262002B0002FDB167FB668B2D8C453987E83F570A43AABDFA5762015B9FC196FFF6542B189395BCB5C4AE598A858597622240E01856B17511C480627B4818C413ED065C68F359266008E888B9EC435A906C6721CF8964885A160C0512FC4B9B454A10E9954048B3212AA9C37A27D2697B1AD530FB33974AB25AAA9F33B85358454610E94410D47F85920F2A7F5D13C74CA4C6108B768A476C5BACB57F17AFADB60D437C21D397A09929B2E97915254A0FAB1848779726D766CE6C83639C4172DD5A1306CCCBB1491D56C1A5FB7CB5FC7836F0765246815F05A2A13385920D0B2C518395AA997E1D33A2AF588B7EAC1DEF4BA688555EC4961596873CD0A0A443551269C73F0B97B6F8CBBDD45BC5A15356BE370FAD74805032940AC0E9C2269C0FAAC67A647FED78E83094D08F58C23745E2BA70366F24A42635A944771C3E13C8EA25B8BD6B8B0783487F1A7A4A15776DAB44EF4192880BAE74C62DBA92A24782CB91237CEDA6E84A0C68244B9CD350DA0A67CA5477EBDFC4D40F59EAE1A88E9043653F5882CF614611641380CBAB15B6CB4189491ACA9D1BC22C56928A7B37E678A4819D48A7D27887F12B4E3878E8318BFFCD93B2B9C4ADA1676BB72B93DE19295DB59909315DB1209E3A02193C1126DC30BF77C6DF59AA4EF921020253FE2045BAE6760C206A7FDDB596EF802B1F3C620D353CDB008AA0A4B8393744E25A34ADAA31D2313B480C29DCC8DB110049DF796DF298CEA91015C9686FF3A300A7298F4B7237A893E02BC373641CA88F2345CCB4A6E7441D30B244814A665F08A18146AB65C3761BC5A87860B2E20482EC89D444180D10337C45C702D82A51DD036B5EAB0FA81B017BA82E16AACDB3A96A53775B9874EE8079CEA7845C3CABE0C847B7B4BAB1FE0680B12986D821968579D963703D90AB8DE020A7CF28DA8395887B2ABA5C09BD7102B8662554D1C472578A9F80CC15F431F18980BA1E26754243102D03D42E69C52AC25EB3A19FCF57FF9E1429E78CF6AE0A501AB3EC26C0D729B142636B873E9B68E277370366C0FE0543E44C08716C4F9B06546B1CB3DD243B505B1A15976B33788E8D1987F810D5797A8E9CBA8B126923A1A81855151780CA9CD4055D9495603A84CD7886BBFBCAFF499066496C967501DF3D861B97C5D250016BD3B3A18946C0CACAC1238CD235A6A609611EAE792E0560B831B636309517AF489A30269E172BBE7470C2D158F83C4B20F15C524025D6CF164200B3870663809A00E6A982835C87F80A68AFC1B5393B006D220A0AA26B9666690549523A0A9711E03B2419914FF76CA69A62671260B34F1C1A11A6E64067908839B87D2940D433162393A6F65B08E4CA643201023C63DD3C3808E9625CFF4C346491E34153937589310437069622208C646AB58584DF10F9930BA2F761DE4C2564BAE2B31A9A645135536FCB58B94489E4D993C9FBD4A89198AD91BE052B5E8FFF2F75EA69691E4E53E952F98536718602B96B7E5A2FB218648F9353EA65FEABCDDD4871080BD4F761D972085851DE0A0408A2F5EEC3CD3786297A782402CA440 + +z: FA29BDC28D989B8C4BE84706A3CF21B36A1C6E355C88A361C7664818E4BC8E03 +d: A405D9B07C5771A5BBDA2BE9F8A40D9566CAD7DA1761ED8076A289063DB4A8E2 +ek: DD0C664328C53E5B29F9A9CC55D97BA265A18C02AB73427307E78AC23C51A56478CAA21DB400A3AB081A0532729C40BE3FF9ACA2DA1799E29BB2A8325F1A9E7BB99D44F3C27427816B3BBAC0FB3DB6B23B7323A8CF4587D505B1D1FA9D71696064CB6A7D806872D68040714D94162658780295FC056B269D4F16AA4D98A5245C7B33462129130425712798C879079217CC3195E5CA67D137865181B6C2F92EAD04945E97720DE0CF7531BC46847D68E3C13840B94DB2242A048F0F22331050950B8A4B3FAB51A487134A2C9A95FB659342867D252FAF091D1D966836F1CE964428C63CA3950BBCC3D8A800191FF628680D23A8EBF6BE727225E4B91602E46949889D910CC46D6418411B394AF072FF49B894A1586AC7C1823BB89AD2997C726C3FBC65609CC37656BEC80A6B10336A346412FE34075DA69D829B8B937A87F76968BC93BF5D5639AD76448E084DD0D02AF4A7028D7C0892A9728CF1114622494D8B28D05065E6DA0813043504293A17D29273572E34A14816A01F5DF58BDF44AA1AE8CD0C6C6622CBBC07540405D5AAE8C77BB3418A91B982BAAB4F8B388224EC3E345764D9E66C2AFAA27B924A07039720D7B73084098457C488137B75339F1D7A6919A29FCAF71F4DB8A17AF6161488C02813191AA2B98FA51A6FA07BE8F288C51B538292683A4C52C7F7B2863C52C0843452B583CB583B98414B4CF97185082768855206871CC76A0A409802E0DC23036B3586D9991D241FDCE67D4986CECED74EA7E77BCC479EE4768952E0297568528AA1712468B267D474D069CAF9CB11E5B0CD23DA09D5095349E3614194B1C63596E7E65BEB6769516B7B0759C8FEA02C7AAA1466A7B41C759135965ACE8857074B95DD6A5ED9D36FDABB83341A841DB163C1332881322F5D2374EE11ACB0616A6B1CCD9AC7CA6673619BCCABAAE562D4C433147A2802C26B6431BDD73A455CF8CC242174AB5123BF9C26F8280E5755A4BDFC1A98CBBB92C152FD11655EE4459ADB2F163928EAF24ED09C72839145C96179D8C94E6B3227AC793F5FD990DD638ED150020934894684A38BB1AA859A3AAFC49EC5A53B8646CF60F5585F043CD71B13F9BA41DB563677B04EC6D8270FB55C78F8A58ED494D9348B4A774930C00752121081514596D5B86FC0CEFEFB4AFD2682EE056BEBCC0CC9446CC3C1A0F5F34DCCE8AFF0949FF16005D121275A5915C6D4B9407357AFFAA09CF6783ABB260FD53A333879433B45FF25B9D71A500BE315D2635DD4F42B47881803666441871083859D266B96C1327F96B40454D17ED5363A27CB612A69064B268DA9185B4506119D7A71FA1386AF6BA9789AC06E9A0F04DA5C6CF478F18044457418E0FC986681B81BE1A7AC1583AE95155DB64FDCF442E5EB39515B06DB280A23AA5DE2C19A1051A4F9404F712955ADD66A9D1A7E963BAE57BA75190B7447B70EC0170EC0C2CEF480132B375D3991B90B729F9A4356F062C00D030BF8AC4A82032D5F42B7D47B6009B274C4D2A5DD5553D29AC86F148ADE931A81534226EAAD33612AE89BAAB7729F3855339625742AEBAC2B042AF2F5B4F3A017A74342501C274832B314BCCAADF59DC52A0ADFC061F2256875D960CB654CD78BC46C709B2B9133F8801CD6766800E12516D80CA41011D68733901AC540533E0CE532CC82AEDB5CA0DAB476CC5A81188B54E0AC9FE66A1D977A6631519810128F98C3044BAA5991920C381BCF3D63B785701421733FA25C521DC10BA007040B917E55B863F95A1A3E924D3FD0AD3975662D38476BD3B47E46769820C3BF4705DF9A89DAA53A58AA77B65258A444B2002B681031BA765659D9C18D92D826733BB575705D6D7C7DE3D19240339AB4B12BBAD51ECF8638E6456E5CB350FD551E5A5C67DF050DC7E7866F4A10989C40BD3C22FE480343E07DB22734CE89870B6804273447A85169A170BC53B861B9545CC186501E8A541575A480562E5D7198B4D905B8EA51A48688A8E488A2A36F7EB15AAA398E6BF44B69622A14B3473B0AC09401223CE775761B8931D53D25E0AD51426970403B0A243E9307502574B1D6323C11F7CB5D855ADE147211438AA7FAB0DF89CEE8286618D8181DE196A311390BF171EDA88DAF1C0FBF540EF20504209482BF3B7D023100D8795634BC28CCE86A4131048041A23549B016EF00A31156458CC5808590AD8FD2EF59DFCC0C +dk: 73831E2C2993800A26266635B586921217B9AF812D5656B9CADA071A384F69D48A210660F51C4AE1F2A6F2E18AC7FC2AF9901318A56E36A483662579736943B7855BCD664BC7441FDEC83DAD5C54187A2FEE338DC9A4AA55780F07F3A94ACA4DAF9145FB099F05648DAC3C19EF450EFF4633500B9205424C2BC4081A017D52BC3302B28BC53668185B147B117C9A7C427249037CC165134B6A9A4663CB13AB0DA3B501C67866201485C5645D4006F929AA4A68831038961B61C950110106CC98C03287D291B080A7212BB4A7AF92AB3A2A06EE19200A531040949C5D57B2D8B09D637638B3690C4F1457A1E9A5BAF903DEEB894300984B76A03F0116D570CDE59981F10A2DD8590EC91765ADF252183C10FBA093004D5700715215427F2FC85D700747C8029B9CAC9A1A4AB8E0641D124540DCC3C1DDD62DBFC89D884C7DA2E515CA87A92DC99B1BA97B0596153EB53D4B8818D2644F638545D94258F5441D5C940A7CDBB3B3E66D3A886457316B15808F0AD71421C34266073B1500CE5279315A00A17FACAA04660A556266C3F44275C67B49793CC0679DE3B29BDAE8C9B15458AFB9B2395547C3DA2FA6010A8171001A50863376C172E64F51F87354C99465796789A854F8362C78588DCFCC98250C4524E51A401203E5D4680C5261CA3440C3077CCC6AAC3E809315781C9081629C4199D925679F02B70A200B3F8C98A3E0B1D3B0CF15442E55A76EF25C0B3734993510B7465C0081B82BA8136C7251C40EFAA6E0819046D1CBAE353A9C8547B9E160DFBCCE85627E2B16C0E5A51DBB50565B3A81DCD27FC9698BB742356CCA03CBA3678028534FD0B1B3C852F734ABE2452BC583A103C3C09445396F1A01F3FCCD951299509B2EE2A7468F15B927B0B2D435B56AC12C548C8107EA5D58682B481A568DB4A4B1209E9E36B879D31876F708A039A39DF58A0F0A2C04A19622C359FD395C99B3C5F497304CC11F5FAAB83842B7DF06344657243968156AC67E7938900D636BFB1C4224F677E6D119827ACBE0BA6E32C590AAFB140A041714B5BD3E06A2D7851BF91098C1647133118CC747AF18B8ADCF01C530C91E805966427A3EC4234272BB9D38A8908285C46EB759F176AE6B7395010878089A21C3FB5132AA789B92C7724C8217E9A5E66923552C4514A915C0B43499F8192324A50BE4679C586A646CB0B9808659792984726EE2420B5FB102B96A3D7898B7C98900913237D5D8885B9580556549C1B59CB4F4ACDB481D92A8CC5D447282F5C7BBA6BD0C7CA0D8EA2D3BDA78633C8FEA1561DE37AE94D51C24414F9178C224A92E79138FCD0337BF00121A51BCF5D27177B0CAD3A6665EB77033B10A00037B908062D381AE5C84C711D4B5CA9888180A0FA742B506D86C03A0C54CA488FA404BC0493C47D531D420360DEAB873C000A87340A2915073429C001A088B212EE46A80852C3B839561CFE5A336557EB689BDD3CB75C70C6FE279AB134A6ED3B20A03750C1CC30BB1D15FCFB37105B34F34026B660905D640BF06D097F0C06BB7E6C628BBBA9386CE6AC212A3370AC4FA65C64C5B235BAF13011E7928B896D78754335E2EF90AC5DB53DF83BFC6340D85D444D469C3B9A329567243E1A2B900A76C756C46E26C6936A0C772F88AA38C03D2137E2BA4179D228F04229F5AF755B3C7128AA16BFFB9354395B575D81EA4F266407A206C0CAF14D5151CC15C178B7D567B8C7DB637FB26A62C048CE9049710B07AD28B6168756234539952282D521313AFA65959432E7235C9991487AAE661B6B7108D48C9E4760D6315C14C1725CCF69CE69C2E407799DB8507A0C66CBE15BC65E4692CD5910B5975A3E3416204949C601F55A438B104026D36A71B5B1399BA6DED58166F210847D863D302AB4C915E969317D806643BB85912B9A0C07AC80FFB588ED86B359840D8B58EEAA0494266A11ACC201C6130DCD523A2C5CE2262A243665AAA45BA30D2CB06D4850CF65CBBFC772E0C20F9F652AB92950F0A3B33F448D6C014F5548A241B53B2C348E494C883409B99B257367BAC0CD42037921F8298647D91C06FB1589A17C1D0A99458938570C871B7C865C98734E1A88C4C112294913F3F0A35E8A26B17F85AFE567780B919C0D94C6ABC5D6EF1C4318A6EF21A1F8FA75653F612DD0C664328C53E5B29F9A9CC55D97BA265A18C02AB73427307E78AC23C51A56478CAA21DB400A3AB081A0532729C40BE3FF9ACA2DA1799E29BB2A8325F1A9E7BB99D44F3C27427816B3BBAC0FB3DB6B23B7323A8CF4587D505B1D1FA9D71696064CB6A7D806872D68040714D94162658780295FC056B269D4F16AA4D98A5245C7B33462129130425712798C879079217CC3195E5CA67D137865181B6C2F92EAD04945E97720DE0CF7531BC46847D68E3C13840B94DB2242A048F0F22331050950B8A4B3FAB51A487134A2C9A95FB659342867D252FAF091D1D966836F1CE964428C63CA3950BBCC3D8A800191FF628680D23A8EBF6BE727225E4B91602E46949889D910CC46D6418411B394AF072FF49B894A1586AC7C1823BB89AD2997C726C3FBC65609CC37656BEC80A6B10336A346412FE34075DA69D829B8B937A87F76968BC93BF5D5639AD76448E084DD0D02AF4A7028D7C0892A9728CF1114622494D8B28D05065E6DA0813043504293A17D29273572E34A14816A01F5DF58BDF44AA1AE8CD0C6C6622CBBC07540405D5AAE8C77BB3418A91B982BAAB4F8B388224EC3E345764D9E66C2AFAA27B924A07039720D7B73084098457C488137B75339F1D7A6919A29FCAF71F4DB8A17AF6161488C02813191AA2B98FA51A6FA07BE8F288C51B538292683A4C52C7F7B2863C52C0843452B583CB583B98414B4CF97185082768855206871CC76A0A409802E0DC23036B3586D9991D241FDCE67D4986CECED74EA7E77BCC479EE4768952E0297568528AA1712468B267D474D069CAF9CB11E5B0CD23DA09D5095349E3614194B1C63596E7E65BEB6769516B7B0759C8FEA02C7AAA1466A7B41C759135965ACE8857074B95DD6A5ED9D36FDABB83341A841DB163C1332881322F5D2374EE11ACB0616A6B1CCD9AC7CA6673619BCCABAAE562D4C433147A2802C26B6431BDD73A455CF8CC242174AB5123BF9C26F8280E5755A4BDFC1A98CBBB92C152FD11655EE4459ADB2F163928EAF24ED09C72839145C96179D8C94E6B3227AC793F5FD990DD638ED150020934894684A38BB1AA859A3AAFC49EC5A53B8646CF60F5585F043CD71B13F9BA41DB563677B04EC6D8270FB55C78F8A58ED494D9348B4A774930C00752121081514596D5B86FC0CEFEFB4AFD2682EE056BEBCC0CC9446CC3C1A0F5F34DCCE8AFF0949FF16005D121275A5915C6D4B9407357AFFAA09CF6783ABB260FD53A333879433B45FF25B9D71A500BE315D2635DD4F42B47881803666441871083859D266B96C1327F96B40454D17ED5363A27CB612A69064B268DA9185B4506119D7A71FA1386AF6BA9789AC06E9A0F04DA5C6CF478F18044457418E0FC986681B81BE1A7AC1583AE95155DB64FDCF442E5EB39515B06DB280A23AA5DE2C19A1051A4F9404F712955ADD66A9D1A7E963BAE57BA75190B7447B70EC0170EC0C2CEF480132B375D3991B90B729F9A4356F062C00D030BF8AC4A82032D5F42B7D47B6009B274C4D2A5DD5553D29AC86F148ADE931A81534226EAAD33612AE89BAAB7729F3855339625742AEBAC2B042AF2F5B4F3A017A74342501C274832B314BCCAADF59DC52A0ADFC061F2256875D960CB654CD78BC46C709B2B9133F8801CD6766800E12516D80CA41011D68733901AC540533E0CE532CC82AEDB5CA0DAB476CC5A81188B54E0AC9FE66A1D977A6631519810128F98C3044BAA5991920C381BCF3D63B785701421733FA25C521DC10BA007040B917E55B863F95A1A3E924D3FD0AD3975662D38476BD3B47E46769820C3BF4705DF9A89DAA53A58AA77B65258A444B2002B681031BA765659D9C18D92D826733BB575705D6D7C7DE3D19240339AB4B12BBAD51ECF8638E6456E5CB350FD551E5A5C67DF050DC7E7866F4A10989C40BD3C22FE480343E07DB22734CE89870B6804273447A85169A170BC53B861B9545CC186501E8A541575A480562E5D7198B4D905B8EA51A48688A8E488A2A36F7EB15AAA398E6BF44B69622A14B3473B0AC09401223CE775761B8931D53D25E0AD51426970403B0A243E9307502574B1D6323C11F7CB5D855ADE147211438AA7FAB0DF89CEE8286618D8181DE196A311390BF171EDA88DAF1C0FBF540EF20504209482BF3B7D023100D8795634BC28CCE86A4131048041A23549B016EF00A31156458CC5808590AD8FD2EF59DFCC0C3D74CF5CC0859F5089855A7EA2267CDBE04185599344C8E93EFCB5B3DC588FC6FA29BDC28D989B8C4BE84706A3CF21B36A1C6E355C88A361C7664818E4BC8E03 + +z: 08FED872D91297D8059743D3E7B6EE47548357E7F882B5BFE2F04314187ED424 +d: E66F17317C40783CE0594CFB5920FF86062591C5EA4254021495749642C0D968 +ek: E067AADA829618E4C683C404EA51ADB1A7A116C7A0AAEB995AF1BAB8D0751FBA714957AD6C7A0A9C73ACB8D347F9A9A469D85DD94B1B1E4AB74C94048F9AB578A2BDFCC75A213A65345129F78B26E3D901B3428A0F87952B91517460930386856AE25D00259D58EBBB403621335791EC6C2C6EC50711C07F56714B0ED3753F7459F07B83D1F838CA1875017B24FDC2CA6224B74423842ACC5C4B03D0658C7EED5A713A365CF523C9C2254E9C79059331BD730B123F53538955BC0FBA92FF9388192C950BC46C25339C82E98314D616B50993BB6241224AAE7EEB610EDAACC43ACD775941FD8088E03931F40C999D92360B74B86B857CFC6B5A74367DC72033941C78484031FFF53874308D52AA6FFA3491E0CB98366B8FF2866ACD1AC64B63770BC25BC33531175A4112D7684C01A8C4500F9FC083FE652FF78910B75093A34CADA85947D2602FF0716624FC9617EC71B9E87CACAB31CB3836A022523C3A3BF9F542EC306C22EB815E1038A48CC4F6596A1CB1482C7BADD7390D8DFB1FA01C5C30E458AD31BC5FA717503C0186F5A3B936C2D0AA7197733C2EB708F32B9FF611537773BC38B904CECB5D2BE29C988B22E415C7944726EDE09ACB76175448712F4BB8AE5AAF4498CF4189B0F0332FE774170F343A121071961CA130694B964033BC015F490B85DEA4A81756A95F3526A856327CA68F66E828A66B138C052115C0B6EB910BA703581617299855318BA9AFE6B152CC538836278D781771FA4C033A65AC5630B3EBA8B02A69717FFA1E73E77AFE06441D91CD45289927C40A1425AF113B179CC46C6606CA0EEB0D86765128A726AD50AE8DDC1AED2A07129ABBB3AA67B4E0192DA99D2C36686D3807E0B50CC9E30A82D97B0895B6C7670C01FC214DA38FFC54970D8399EDE259900A081954172F385E037C9B72B43A3ECC7FDB0510F6A930B837618ED756A62A0B3CF58B980C94210BCE63FB9CE88745FE8BC34D57248979398CB0C1C9B83AC979A107C955E97543756221AFF06C553A1F0E764AF19B93E0DCBBB9C327F76AB4BB890D179C90839430A749A2C43A66DC36394FF06DDC54070A2A2F152261E79597AC9B2AD32A39FA489382718E04DA6369C4AA0D4823BE87A60561CF49232C8AA20811EC7B29EC8A90A363F3B367CF9A81A08645C70A17EA41A1AC4C0E9407763D2A91B6732E46C6BA160972ED35CBE6000B7C1B83CA21623859CFB4317306593003B2A90BE01FB5A4030CC062C308C14924CA47A24FA5D13B82FA7153988DCD1077E2759FF250C198ECC4C860170E93BCC48CB009CA7535C62EE2A3AE61D07C828C68D19A55F6A7224F716E77A381E06933AC03A1B0D01B6D231E38D4A19EC9C6E8DCA42C218B290130BCB583F7E958FC3531037716B356948D726E602329A322A410945568BCACBAB75D65DCBB38B80CD20865563699838659E065CE749A6DF66542E8474BD140B50EBB5983F546FB393A0BF10C5891767B935E0F5171CC97A00607332088AED99B13EEF557CEF73429704244FA2B915CC7731BB9BD351FA131A726C837FE19047443A16BEBB02F4A5020878AFCDC72CB780485A793CE23BC6DBC11E04B0DBDA82F51B4327814471C01042A1119D5513408C119266A0476DB89B20B18EBB44A231CC5BC39C6BCFC4DD2A61EF9180BD76327AB05A37ECC4B2E8ABAAA307A6C58040484BF73B06AB4A65F7FD99660A759FA903A56DA3E8DEC389262AFF8BABE1B85168BD21762C86046290F35D51E4BCB8403F160D9DC4E00CA8987E46CE05A5FB04A112EC352B1B03219A4B50345C6F31915FEF4C2EF870D30A244EA4C20D82849628CB61ED677AC9890CB5463EB90BCCFEBAD9FAB23C26A33E6667D76C96220147685EAA84CCC3140104AAA4A559E51209DB124337A2795925C5E0230E7920D4E9338DA23ACCC8693D5952CF49AC26A74CAA6E05011E6385F787A7071CA08C61F59CA017ACBC15E9BAEB78837B99B93908A8CD6D7BD30CB6C23F9CE5E15204E0225B55C120B31C1276695C909C94AA1B5D0C0496278435352B50343A9974A55EAB5105FB4436570181F2B7AE82238CFB9C967F424C1D146BCF74A2349583D36C1F7629E70E0C4702C133F7475985B2DCD923465F39772E8AB76F3634C6A1F6E8088BBB0BD3A050CBF323F9EB76BBC4603617908BE85E6EA5E40A862180D9EF1380B7A859947562EF3A845669146 +dk: DDA5A4C182BC2917C5AEEB973FE853A397753BF576B753AD82583E6EF89CDE2B7B9B6B6FC65A349F66BCF4903902D22418E123BE13A3E6A29489362308452991448E53370B9F1315A83540D14A0CB60B9C80549556CB6F839B6062365693CA9665A01CD66574242092954B945D996ADDAA51F106A454002491FC0881D0489722979D90CEFD5235B9A1852D334B6ECB7CB3294C5B50A951E835DCFB24EF9BC124601567C0C05E1C194753CAB73A73E114C91C0341C7DCA0C904217F6BA200752FBD0B74E5503D141C17338AC6B6110E78F5592ED1B599B3A8FE65292779A473D95B3A1860DE955ABBC99349D0A4F85C97A32A154C89AF603799A438890E692370030AF4B69A3AFC91ED283EF4290524CC88E6E67D9CD00790F8B3E8626F528AC4A236570218B1710B82A86A308B4C4068E07422643BB8031E0D556700123F8F948463291257280CFCE2749812AC26A31C145667E9E94FEAE011C037C00E268F617ABC5DE656A8F8C858CA0A392201E144B9101BCD29401C98992E7F4ABDD02705E0F0AAE6D2BF2BF9081813CB1CF78454535146FAA994C666E628A4E1FB15CA5663551962380727A5933F91495B4EF290DE64A1D6D35CFD4A5279EC0460622C2E1B8409619D31144E674B4AE08951B25416F2839AFC4095D7257F34D54D3742997B77893C1C009C55A715D13BAC3092B9911F1BD962645C1A0A91639207BB98E15A37B570E39AA15011280E8B64B2E674CEC8931D26587D003CFC89498C997982AA60FCD8A3ECE93D784B0F9E7C10A6C380B76C1D6E91ACFD4672D4D9485B9C857B92C283B596D714A404444478117FECA0C14B641A0DD1B027DB7BF832316F0BBC256324BD4345C0A7CF3B98B2E6D01B1A9644F29010CEA70BBA08BE6877BFB1570CDC464A049C90C2B28C0A329904C1CFE6C92F076098C300288397CA65581A3BB8BA7D92A3D22C24E8691CFC610C9D3409B73CC2CE78A1C7E5AD07720CC30C984F73272CE4B43541AABF616714400D6D040609286AF1330F342A71BD3276454B3C33B5508817644DF14C42E93199E27FAD15309FD93BC8F88DB9078350797BE9CC027F03A7A18965682C83DDF182C411CB20EC3EF5C435973714255CC8CEE376654CB1AA6554BAB32F7E7587DEA22EB3C2565E760F503B6F103A54B2191FF3EB6E30126B951091B010BCB60C0A8A1C3FC958BC4DE5504A3C50BB6A2A5726B6B8E25024DBB7C02BCB2FE31D7CC581E42185FFA6503BD0A0D1C907FD13302EC37D191C141CCC0BF4D7A371A8C3389C5A799663709949B17195B4EC74B2DA225002CFB13668F83A1092A6C609522C07529BEA7A454EEAB74E15246AA17452451672A6314E5AA5AE0C57C2AB74653005A8F2B122859C0E8A0829CB0240BC0B5213AC9B035E9366BD3A4BC680D3CC45D96EDD33AFA02C747132001C0CA4FEAA29059AB0C1ACB1979B93C087B53911897B928422D0732E134DA0186794B4CD2E242C0EBBB5A7E10A82C44F874B749ADA0F91C6A26290B1CC49B7BFA150EE40886C9ACC8DCA75F813B13E732E94F85F6908C0523CA70C71A5BD394673D22E4648A443B25DB6DA4EB11C50A8AB30CB342A39B130AAD1A421B567601001B86ABA44A1311F05423A939B3F3404E5657476819D9E406FC265935542B48AF47FA78482C4443697358E784BB72B54B373E813E19186D5BA8997053189B314B5BB8DB699059CEC5FC2D58191B2A729D4A3BCA3AA7B377464939CC8E548A7789E56F67D08C1A0772C9836102321F659FF7B088E9968661609003DB687A295FB2BC6AA593DE4C9CFD6C55D2395ABAB916D3A8559451A6BEA299519654E8C8CBB56E455A85C37CA5A74FBF25252812F16B1B9CCA649718C00DDA596C506BB525159659C272FC1C7B5EC8272DA85D506959B231D1394A71D2C421E743964A58F38D52A60407FB8605961A63FA394431D35641991CB17DA5637732A5ABB2F34B81B7384974030ACD43886021A50B70924606BA1A295A489842FE3D10E92FB1507E240AE0B5616F8AA05299C94301E29A638A742028F9321F3955C61A59C021168FAEB17829025071B4015FA167FB6220DE0B29AA3BE2E88A171E32C9499B9B00BB867DB0C9915384F0A49BF3C5CFE539D22D3B998315CB8D09191634C248495C1977837A7B76C9B35E067AADA829618E4C683C404EA51ADB1A7A116C7A0AAEB995AF1BAB8D0751FBA714957AD6C7A0A9C73ACB8D347F9A9A469D85DD94B1B1E4AB74C94048F9AB578A2BDFCC75A213A65345129F78B26E3D901B3428A0F87952B91517460930386856AE25D00259D58EBBB403621335791EC6C2C6EC50711C07F56714B0ED3753F7459F07B83D1F838CA1875017B24FDC2CA6224B74423842ACC5C4B03D0658C7EED5A713A365CF523C9C2254E9C79059331BD730B123F53538955BC0FBA92FF9388192C950BC46C25339C82E98314D616B50993BB6241224AAE7EEB610EDAACC43ACD775941FD8088E03931F40C999D92360B74B86B857CFC6B5A74367DC72033941C78484031FFF53874308D52AA6FFA3491E0CB98366B8FF2866ACD1AC64B63770BC25BC33531175A4112D7684C01A8C4500F9FC083FE652FF78910B75093A34CADA85947D2602FF0716624FC9617EC71B9E87CACAB31CB3836A022523C3A3BF9F542EC306C22EB815E1038A48CC4F6596A1CB1482C7BADD7390D8DFB1FA01C5C30E458AD31BC5FA717503C0186F5A3B936C2D0AA7197733C2EB708F32B9FF611537773BC38B904CECB5D2BE29C988B22E415C7944726EDE09ACB76175448712F4BB8AE5AAF4498CF4189B0F0332FE774170F343A121071961CA130694B964033BC015F490B85DEA4A81756A95F3526A856327CA68F66E828A66B138C052115C0B6EB910BA703581617299855318BA9AFE6B152CC538836278D781771FA4C033A65AC5630B3EBA8B02A69717FFA1E73E77AFE06441D91CD45289927C40A1425AF113B179CC46C6606CA0EEB0D86765128A726AD50AE8DDC1AED2A07129ABBB3AA67B4E0192DA99D2C36686D3807E0B50CC9E30A82D97B0895B6C7670C01FC214DA38FFC54970D8399EDE259900A081954172F385E037C9B72B43A3ECC7FDB0510F6A930B837618ED756A62A0B3CF58B980C94210BCE63FB9CE88745FE8BC34D57248979398CB0C1C9B83AC979A107C955E97543756221AFF06C553A1F0E764AF19B93E0DCBBB9C327F76AB4BB890D179C90839430A749A2C43A66DC36394FF06DDC54070A2A2F152261E79597AC9B2AD32A39FA489382718E04DA6369C4AA0D4823BE87A60561CF49232C8AA20811EC7B29EC8A90A363F3B367CF9A81A08645C70A17EA41A1AC4C0E9407763D2A91B6732E46C6BA160972ED35CBE6000B7C1B83CA21623859CFB4317306593003B2A90BE01FB5A4030CC062C308C14924CA47A24FA5D13B82FA7153988DCD1077E2759FF250C198ECC4C860170E93BCC48CB009CA7535C62EE2A3AE61D07C828C68D19A55F6A7224F716E77A381E06933AC03A1B0D01B6D231E38D4A19EC9C6E8DCA42C218B290130BCB583F7E958FC3531037716B356948D726E602329A322A410945568BCACBAB75D65DCBB38B80CD20865563699838659E065CE749A6DF66542E8474BD140B50EBB5983F546FB393A0BF10C5891767B935E0F5171CC97A00607332088AED99B13EEF557CEF73429704244FA2B915CC7731BB9BD351FA131A726C837FE19047443A16BEBB02F4A5020878AFCDC72CB780485A793CE23BC6DBC11E04B0DBDA82F51B4327814471C01042A1119D5513408C119266A0476DB89B20B18EBB44A231CC5BC39C6BCFC4DD2A61EF9180BD76327AB05A37ECC4B2E8ABAAA307A6C58040484BF73B06AB4A65F7FD99660A759FA903A56DA3E8DEC389262AFF8BABE1B85168BD21762C86046290F35D51E4BCB8403F160D9DC4E00CA8987E46CE05A5FB04A112EC352B1B03219A4B50345C6F31915FEF4C2EF870D30A244EA4C20D82849628CB61ED677AC9890CB5463EB90BCCFEBAD9FAB23C26A33E6667D76C96220147685EAA84CCC3140104AAA4A559E51209DB124337A2795925C5E0230E7920D4E9338DA23ACCC8693D5952CF49AC26A74CAA6E05011E6385F787A7071CA08C61F59CA017ACBC15E9BAEB78837B99B93908A8CD6D7BD30CB6C23F9CE5E15204E0225B55C120B31C1276695C909C94AA1B5D0C0496278435352B50343A9974A55EAB5105FB4436570181F2B7AE82238CFB9C967F424C1D146BCF74A2349583D36C1F7629E70E0C4702C133F7475985B2DCD923465F39772E8AB76F3634C6A1F6E8088BBB0BD3A050CBF323F9EB76BBC4603617908BE85E6EA5E40A862180D9EF1380B7A859947562EF3A845669146A128CDD9B684F4A0907E80ABE2B7584BE10833A4DAF89DE5DCCAB7C001116B5208FED872D91297D8059743D3E7B6EE47548357E7F882B5BFE2F04314187ED424 + +z: EB8EA5E8C5EABACCFF162556DA53F0C02F72EE7A7DEA8E9EB70FC51C777645E6 +d: F8CF49DA62AA762EC020F3766237520E7FDA4CA3AC11FBE50E6C5F9CAB3CA7B8 +ek: 36FC681397CD63113EF7756444A3CD1FB693BEA7905A507CABA24AEEFC637104C90D311BCAEBCEDB1335AB26C82F255984118B17E28F2266C5D73818D5ECAC6DA8380189196C9568EC949DDF76694A4B39145758FE66A14301CD64A10CCFE46C3CA8419EE5766160465154680F8C435DC523F5136065555F503883165A525568878EEB4DC675445F300F50A1C42EFBB5F1C9A0A46684414CB4C8187255A2CBAD4321082698F2714F234678D4418E33A70CFD76313EDBADA57C82C65801C0DB89D4F7BE19857E31E16ADAE95F95CA0473082F7FAA0855723B5AE4186A6C26D482905C00689D1737CBA52583893995065B5C76C7FC7839CDFA9BACF1B8F7A68307B459CA96BD7091A06A83AE3F3146FA81296932291B2158E9B09EFADA0A2D5AA8F1DB2489E40E04B0C768335595960CCD586B78844F0E940F2007B3B9EB9747254D83C58443C2B7A347B86FAB1ED4354DA2D9669AA21DC2A938E0FBBA0EB57E4CCA4C2666B79559B70F9B61DA060E03C59850AB2D129064F8D6ADFDCB7C457235CEE9473B003DDC9252AED7C444644832A4AF310C431AB26292488C73C38BC03550F7569909417041E2924AC9338ED8251BF6CD18F2B9D1569FC688AD095A728C574AB8EC549AAC0ED13A6EEF5AB87EE622034CB87045997A6657AED6439AF8951946ABC47BB9BBB55A80C92F40E126D78B4353538B6995830044B6E7220030861E47A5CF0291BDCEF8ACECA5C9FB0B43901CB6CE99246D2A2CFBEA014F902046836CB0B58A6DCB79CB9275519A3295C134289880A0D6CEB91356428294AB0B11CA150B9E362872BC8C25E2A78748C9D245C2D36A05F9D87CB5D0C306A5C0DA74AEF98BB1DC45801B4B9EC5B73A0ABA407B0AB8065B23B8345A6147A258326450E399BFEB86E754561F09CEFD1C832E355939175A347303E0D7815C4056F862B08F7914051834423972C84010CAD31B34321066396D47D5C9A77B9F45111B93988C0692039B5A060805AE4365AF1F8B138CC83F2D681F740886C7F07CD153989DEA4A6B2A3597374F7D5BA8E7D01424BCB721071A59FAA49F74AEF15910E84CC138F09F31574DF9A7000175C80073A10CBA6ECFCB84FA680131B824241BB96FF17BF76C0243A03DE9D49895D640E841A07C2299A7C52E22D37C8EE1AF81847781BB2F25240CF91851A5634AE285825C8809C716B6DB795361CC374B87BF34687E18EB413D21ADCEA883D4837CE874693159BDD2920405FBBBE6674F19D0B3C3D6B6F4095A946A5F7E6B0C5B7252A8F72EA357BAEB475FEA0141621A607324B4B17AA13FB7AF2ED529E1728F4BFC083198628DE3C8968A9A92C8863E08AB34A00EFDC73EEE7A8F29F4906E848B8F56474DB2BDE054A660966C955418E8D387CEF43CCA3B5DFD949E91AA5D75C50C38C96BCFEA7740147FDCD8406C0536325A1B74576392EC1BB1B181D584AFD841B43B0034ACAC33416C8DA02777E1169AD4045CD51674342C468874B16B12CB13776E6E8C702D84C5D13933EC161EC10B82A9F339AB3B1D1A9519F342506A3C0E7DB20ED3D7029CE444C5FB4FDB88525AF4C565DAAED6A51B7776246CA880D0F72D5A40B88FF348E9677B37D19F0088997F77429EDBB63840070D71A60FB34FA5CB59F47B06BB03C3AEE80F393A9DE283604635411151222C696FA6401783431E9690BB8958135537332EFA805ABB5D69C9C8F9084EC38862A68082266CA6A0C3514A71727AB519C359CDBC663066FAC14600132D1216BE63AEC0CA96804096D22904F4194D87D35C6C2C0D5539C93BB909A5287C64DCC1246A48CD9CCD80311089CA694120ABFD5A7F16D06A0BE42C48878BE76253198A703080A463053D43867B73B67B26B99A551A3C0C41115D007E0EA0AEF1446FF88BA7FDD32261FC0776FC427C121B2D231E3AC843015B12583777CCD5AAC502A7FFF9B03FB614246848742342C2E0A871E1AD6D44847D0A5512566098C712AD89904EE051425358CA5A964643577B8C8ED09450E97B55F660C2F2F608FBD87CB59585FEC3218219B1C7C18200DD446402898E065879FB17C97914C1E83F262801A4E256E798598A176BBE952149F8AD5B992CE791559CE6AC90539C096A209B9A4F87AB73E158801EF2B939A511F416BD4DC195D406A55A66B3FEC2925C5474525026488ABE90196230EC15B09CC55CE383DA8ABED781DC5085BC8E58 +dk: 67973C3154342CA60AE94B0B60FB2CA4DCB70BF13BBEF7CC9B54790AB3CBD882385BBC888321366F4AABE4696D0126B724A3AB8FE40E03137A28D1B9DE280C49342B162196B13C364FBC5E26651702651A15369F1B83A25B945BF7BA7259A329F107C91E13802B0119CBE59C463B3A53B51837683A6E75674174210A871A1F582A6AF0053EB862BDDB6FE53B21924A7A783C4712AC5A6A38062D83A31DDB6537A82EC135616947A7D6456DB50C95DF678B113275238A1A8312100270A730435E06E554268921A04A9B7FF5025884486D817D4D81610C2805B4207A013A4E4B785CCC0052F70318188380FA554E41A64BE315B3294C3EEAACBF46DB8C87105DFAD68575044F59CA15A379579D381ADC65101FBA2EF3CB2F4A02BFEF8A5B28A51A2283979CD45B753C06D3653B9124A04AA64577562C34DBBDC9A5AAE358A5C73259568A3B18E48EB536C6ECB05A00DD727582B2F51C5562D53311C09D26218DEF54455EF86066B76CEBC41584173472A6008C55C94DE4261116CB21D325B514C83FD07C49C30967D23FEDA60CB9373AB9CABD3D528A99E6898E7A6F4E4C9644022060C30757F5AD961369D537551312172ABCC1C228B9F4F642C952006D7C45C40CCC96FB7BD28731A2F277E7284375D03A35F68101278E70AA882AD82940EA1E1DE9616AE99EAEC6BBED52B1B110502062783B102297A144A54C10F43B2D4C529398EB0739DA57F183B195A39E3178501C9539355B8E456760FAF99D5C3C55B1AB3CCA017C04B94581B18AAD4594236456A02B4D99A00412F818D6EC1387680847D10539E0C063A334A2A86EE1794B49DC895EF95C3D801AB33748417C8F60245E69A8AB68C9BD04BB28783293C52051F9C5A532008CA9C0063FC77519709F05358BCD28955C4A9ED3D9319E1939CED04AEF489C0EF2AFF1EA05FF2C8189093B14C6917ACBA94A8C546063B2FCDAA6C77C1A424A81F3717D9DD88C7A3C64FC593AD66748523744BECB2434822F23632D6E362E5F38C6329958AA20096BBB4FE4F43167301D57332BAE31110E186FA5C41597B92922C79CCE8C59FF341A08E56CF7A1B610605D910510DC03308967CC7CEC7A4328600C601566D8766B601855CCCA887BC84ECB05AA1529DF77058EC0760377BF8E3AB30FE477C33594873B59F02CA226966DC9841569564F9A5557BEC87C2C81784664CB2C8A0770C7C15DD61F48B762CAF11E9C189C9E9947D788A13FE554E76CB14A631440AB2560AA747B447B08E20A5C8BADAD31BD79FB27091938C4EC7AFF409E69730E152048D540958458C219C007FB1A7711D9401B86A10685A66E3C439C005563746221F50382825E3D6A779E692022B2B98150B690723B8ECA370283611ACA06B5881F38A7757A38A25EA06FB5176788C68C01D33822DC9CF7248CB81B7511832845CB06FBA36931CC07BDE6BD299A69A18945DF4057ED724292B76FC1A4432C1C16F451CD1BD796451957C5734B90574D809B69A9B19F07837028C97FC56B10CE6779E81CC4B4714A34A254A1100CA2044399658DD878BE873036B8639609786FEB608B5134A79FD74EB3D485F1D44F39854B3C6552965B4F08F998DFA4721B6107C20433AF509FF0E571FB58B8AB15727AE24AA189CCAB216953F72899D823886364994CBA31EA12AEE12B85460D056C761024987F7683B40A692959513C346E3674CA736226A748345D5931D3250949DBAA2F5BBFD7361E748A6D69419A24D3CCF7F7A849A4301497A2BC1588B021314B0784ADF1C5D01B562B89B3863A92D9103638CA305146912A3588F3A6A816224686268FA692031F427036043090A6B93CA944B4DAB10B63421E69C948619229D6323720C773B900A8393BDAD30547E0BE24D26795DAB3F1806779FA13B1A09A4BFA93BCEA34F522430E1BC923E378EF4631BF76A0F1D3B6A6D8BDD6811293F02CC2096C0257A957261E87220169330BE5559B48698EECC58D151C50C85CA19C9471E7754A8524A8C742495D15365189A2156046CD7A916C2816D9F1626306C6575114703091CC7721CB848CA66108746B1C10341BE8608FAC87B869519ED8C6CDB0530EAA6C801110B8BFB8C4C0184660F79AC2485BEA7AC2A2C3C683D483113C8B5747309FF1AC459CB83560C8800502942B09D3870036FC681397CD63113EF7756444A3CD1FB693BEA7905A507CABA24AEEFC637104C90D311BCAEBCEDB1335AB26C82F255984118B17E28F2266C5D73818D5ECAC6DA8380189196C9568EC949DDF76694A4B39145758FE66A14301CD64A10CCFE46C3CA8419EE5766160465154680F8C435DC523F5136065555F503883165A525568878EEB4DC675445F300F50A1C42EFBB5F1C9A0A46684414CB4C8187255A2CBAD4321082698F2714F234678D4418E33A70CFD76313EDBADA57C82C65801C0DB89D4F7BE19857E31E16ADAE95F95CA0473082F7FAA0855723B5AE4186A6C26D482905C00689D1737CBA52583893995065B5C76C7FC7839CDFA9BACF1B8F7A68307B459CA96BD7091A06A83AE3F3146FA81296932291B2158E9B09EFADA0A2D5AA8F1DB2489E40E04B0C768335595960CCD586B78844F0E940F2007B3B9EB9747254D83C58443C2B7A347B86FAB1ED4354DA2D9669AA21DC2A938E0FBBA0EB57E4CCA4C2666B79559B70F9B61DA060E03C59850AB2D129064F8D6ADFDCB7C457235CEE9473B003DDC9252AED7C444644832A4AF310C431AB26292488C73C38BC03550F7569909417041E2924AC9338ED8251BF6CD18F2B9D1569FC688AD095A728C574AB8EC549AAC0ED13A6EEF5AB87EE622034CB87045997A6657AED6439AF8951946ABC47BB9BBB55A80C92F40E126D78B4353538B6995830044B6E7220030861E47A5CF0291BDCEF8ACECA5C9FB0B43901CB6CE99246D2A2CFBEA014F902046836CB0B58A6DCB79CB9275519A3295C134289880A0D6CEB91356428294AB0B11CA150B9E362872BC8C25E2A78748C9D245C2D36A05F9D87CB5D0C306A5C0DA74AEF98BB1DC45801B4B9EC5B73A0ABA407B0AB8065B23B8345A6147A258326450E399BFEB86E754561F09CEFD1C832E355939175A347303E0D7815C4056F862B08F7914051834423972C84010CAD31B34321066396D47D5C9A77B9F45111B93988C0692039B5A060805AE4365AF1F8B138CC83F2D681F740886C7F07CD153989DEA4A6B2A3597374F7D5BA8E7D01424BCB721071A59FAA49F74AEF15910E84CC138F09F31574DF9A7000175C80073A10CBA6ECFCB84FA680131B824241BB96FF17BF76C0243A03DE9D49895D640E841A07C2299A7C52E22D37C8EE1AF81847781BB2F25240CF91851A5634AE285825C8809C716B6DB795361CC374B87BF34687E18EB413D21ADCEA883D4837CE874693159BDD2920405FBBBE6674F19D0B3C3D6B6F4095A946A5F7E6B0C5B7252A8F72EA357BAEB475FEA0141621A607324B4B17AA13FB7AF2ED529E1728F4BFC083198628DE3C8968A9A92C8863E08AB34A00EFDC73EEE7A8F29F4906E848B8F56474DB2BDE054A660966C955418E8D387CEF43CCA3B5DFD949E91AA5D75C50C38C96BCFEA7740147FDCD8406C0536325A1B74576392EC1BB1B181D584AFD841B43B0034ACAC33416C8DA02777E1169AD4045CD51674342C468874B16B12CB13776E6E8C702D84C5D13933EC161EC10B82A9F339AB3B1D1A9519F342506A3C0E7DB20ED3D7029CE444C5FB4FDB88525AF4C565DAAED6A51B7776246CA880D0F72D5A40B88FF348E9677B37D19F0088997F77429EDBB63840070D71A60FB34FA5CB59F47B06BB03C3AEE80F393A9DE283604635411151222C696FA6401783431E9690BB8958135537332EFA805ABB5D69C9C8F9084EC38862A68082266CA6A0C3514A71727AB519C359CDBC663066FAC14600132D1216BE63AEC0CA96804096D22904F4194D87D35C6C2C0D5539C93BB909A5287C64DCC1246A48CD9CCD80311089CA694120ABFD5A7F16D06A0BE42C48878BE76253198A703080A463053D43867B73B67B26B99A551A3C0C41115D007E0EA0AEF1446FF88BA7FDD32261FC0776FC427C121B2D231E3AC843015B12583777CCD5AAC502A7FFF9B03FB614246848742342C2E0A871E1AD6D44847D0A5512566098C712AD89904EE051425358CA5A964643577B8C8ED09450E97B55F660C2F2F608FBD87CB59585FEC3218219B1C7C18200DD446402898E065879FB17C97914C1E83F262801A4E256E798598A176BBE952149F8AD5B992CE791559CE6AC90539C096A209B9A4F87AB73E158801EF2B939A511F416BD4DC195D406A55A66B3FEC2925C5474525026488ABE90196230EC15B09CC55CE383DA8ABED781DC5085BC8E587FE45A6DB8C05EA8FFC788FD2F73C26CEF305BFBC9BF7C5B32466B5417DB33ACEB8EA5E8C5EABACCFF162556DA53F0C02F72EE7A7DEA8E9EB70FC51C777645E6 + +z: DAC056B9A373687E44CCAB8751BD334F4942696B9076155F9D0E5BC0E89D85CF +d: 08E36AE8586A59B8249A80D7F43506F9711FA4B00A49D182CE06DAD0CF985809 +ek: 3201469EC68BC7EB2BD457769C69C09F1646DA20B3DB7A8756962DEB905FE387084A58B069901A9FE1A0939C38E6E414E23B516FD0651E174DC0F6388DC2CB8D605D3D5B1F6AEA3425A03B9A903C846ACC128C87CD5A17A46BB474A0BAB64112DDF1C35355C58164B7C6F9B8A5879CE8E1CEB4FCC26EA55E4833A401B54EA5C29D92E03A8FD5AED6C51E2437C7A89221ED73B2BA3BC5DC30276A0692FFFA3E28B8CB9025566D54A3DD84A9004730B2009A73B354644045B44224D9D96B6A137D8F61513BF8555FAA8F61F00215C8C8841091F7647E53055E6762A504C121474120BC70BED5C4102C82813AF656B9248ED6F630BB269CEE33AF26D474C8B3CDD8D959D10A5D2AE221D5C20D9628A26F1A11EDE680F8C8333A54AF8D79B67AB0BD9DA1680927B0B31B1D6653410C4CC0C6E95164C33506D8CD19A73E1031C733C55EFCA33F76BBAB03182BAFECBAEAD364CE38B22B74A0A244A15725B232616EF2CC0A3010758A698880A23FD58BB2199A3946F5CCACCC2D61AA5985488C0EB60D465566B94C762057ACB163CA636B548254C26F139F51A96E492035B9D725AC16B94C537E2FD78B1641882AD20DCD6C5BB21B79921A59631130E7885340F5311F9973CBD31783DA443BF7566AB3BACEB88232F83E7077845061C09D425C7AA01733CC63D5B7C17C6B3309408D1FA31AD909BC1B0AB6535B0AB6064722D847B07811098C7316071A751623654605FA453FDDE8176B42B2ED07CDA4144640EB5984B301390C64D520071F1C66AD69C550AC41D74915DC2156F78127A704CD678A655C87CEB43748F0989AAE1730D3E4B3374A72CE364F1E2ABA2E5CCEBBA440FDA8AD50A749FD908AA1578C02B35342BB96C3350392C5C25CD71093BB2E87A3A466B697489A3C9E9C84805160A7396D001633EE00AE5641A893BB374CF5CF62417AFE67682C08A10E0A59B8346ADD006F2B40669042616D57936593A62D5578808A1E9D55B1EF4C90EB049987DBAB69B3C8C4A596901BA2BFA74DD4B937547A82B7F5290BFB79E5651B2B4AAF3692CCFBA987D5EC778E61281B0B388A71222DA27A90776E66BBAD25118AFDAC425F15599176C5D5F1B491FA1FBBD9005A0AB93AF1C8280292AA468FF0B1218726C52E4AC8FA403C91D12EB1134D6B08ADEE2A065F191DDEC390A1232D63306AE1C60AE1908CA2294ECAC6AB5257644DA45D70E96C6FAA5E1DD02AEC276C5EE2A8D36A2A13EA21359934C8285498370460CCC2A4C886C72A9FF17AA214553F6826177630ACC2F70619D64CE3F04DF17A6599E9AE5D2BB97B731432421012FB229124CD52BB9E2EA7B33CCCACBD9029A69AB76F00CE84A0C0D2C80F54A77D6064AE85465FA74271BDC2C62CB940E9C32A67F9C94AFB7322B93016E31C4E34993C7A65D58117495C44A8EBCEA635AA6C29889F3AB1E39661925136A06BB269483C1D291F90478713A91A178193B25877D416C03242682E76071B78964EA626C6A85E4ED8A45CF573BE56369B9476A2FC76713AA11573A083D0A0B89BAC15228A42B9BE2F8617CF8BBBA21562FEE3313066A8E86063EDF365799B7EFCBCC11570196B535D40F65F59C0972E057E2C70048CC10DD292611028277B325791B865B9D863972AB1725B6BF1546DFE0030CD85621F92472CB0064CC2CD11411127231181E6745A3580F6E8383150C8C098A3EB455F5CD05725719D0F844BE76743F7D962261A5FE5C29E46D58EEBCAAF0C40C04BFA43089C6236AB1AB574CF28A9178A4634C5848259191C21401C05A00A48D0420BB2737816CC72BB3D5BCB5EABD5531ADBB2E875045E861114D2C5AD5997B104A4F3BBA26A6372EA6062C8D6229C196E5B7A572F898D94A307BA051F899C16A34981B818034CA84A14930AF2D38BE095BE4B304FA1BB69DDB72AD605294BD273FD314A4D1940161B97626B5C725935D358153B4A1318F1273C7C6A93FCB372196593D9655F3C41FFD4B7B72B7131D7C2607A8763778556EC2D3E09969A4C968E92240077051446375B2C4C9BA9CEE84563C4491673667C026843C1602A9BAA0705E27918A27E2B01B9E756A77F7A304345117ECC52E81823A0A8170086B89EC64A39C60EA6A78363FB79E7C0B886B1854C5A929DF98077F5AD847650926273A9495000E688124118F1D83CC93D0E4D2565D307F4CD0C166E9083E8CB47F6979CD0C6F05D5A +dk: 6F148AB8F31718811FA8326B85A430341A9CB4827004D5897659554F661B37551033D7B51D416CEC7921FFE4711A575BA6EB73643B78856B9C230768B6369A9D9C7C91B7620E4A709D38A73CD7A2CE48712EC03F0C94070B783A4EB3186051A56D469D01152D3799934A69C672600E0B223740F937607B8923768B20F7CBB9712BFC633654119B7299770C764C471399BFF2CE457918F3C3AB3A323CAB53BE1F491EEA526EE95C12A50C2A3D8C75589BB6919B97D37AC96753ACBE493109F60957E268F8CC27C497A89C12CBC7109CCDEA54E174B7AB6C4E9D68326261280D582DF8E976B2F67617B69FD2D58CFBC44F641C9598B293182939D4AB384C6B7920266E6C7BAA133A1A9E841AD0018ECF6010F0D292D7699177864D063641EE8BB1A2C7CCCD7C33C5574E9C499EE9E7417A5C072596C4FB76C2E56950B0907BD653B47966420E866FC3FA367C965A1D096FDA16C3CC1CB651DC693B960443617C58D13FC2595FC267720BB88D0633579BE84DC0232D973AAF92140B20CAB7D4444A96EB6A4235C0665460470994D94005B659BA5A6A345E51677402B69D378A0444B345340BE80230C7730F4342833543BA8079692333128E45B9DC48830C1892E69AB37C632771EA677A47B1518815E4976367888AE552A397576A6838B26426A587828B08EAC520E47463D00D1EF5CDD50838A961832647561BA75D6B1A5C93121949C46CBEE11938C5718013724131C18B0BAB806097C14445FCD303BC8BA3FBE2C0AA2C3FE45A74F5E22F77D6B405A962B1F95CC1E0620E6239AD57042E139955C97C359B09F6990D1C7747DEDB6F02313BDA02839AF16D7F181BDBD3245B272988432B35916144BABDB7F3CBB8A4575677484822B76739577CF945FC944C21D4956B0B2E3C86195B5724A03A896552BEEF5804D583BA6B2B9A67106A47621DBF911E62F677F933527A0095D6F4C0D5C3392548C23584CF91888A51269D15606542E601D8A7B915418F164A6AFEAA7AF60345D7A603A018838237861EF1C99194323773A8A18591F7539821D57856C44D3ABC334D266DFFA64AAD3B56DD7C7B1ED2B5026142CF508D9F25A2CA6199F7937E6AFB66B1C486D5512F1F12754ED5B70871160B8814986C078F006962C956404B6E5EE9C486E786C3C448B902B1841697F1208313F8543B40566E18746EF181DA1195711040E7268CC474A1AF4388A8FA11AB9A54B228A92E569415D12C06B246F8180F4B80395C708089DBA946B459ABB598F6F32708B8316AA73DBFE15D231C2D69627D434CC1674778B4FCAF23227527B2966F0718AC1C9D6D3B374829C46D063A4794C15A189DDA693FB6C08E46C0B7970B8AECB8B52EC35428E8826CF6B1FBC9A988E13ACD089E4DB2967DF64DBCA475BEDA31DA74C3BEE4BF74568EB257763C371BD252A525AC3325941C62EB68BE79701C11C18EFBB1DD010F84BCAF5EBACD35C67671C968A6B5098E0535D7932002EA7739C85F45085247032DE8EBB7109B9A522112DFB89C2904C1B611AF46762E4854AE2652B4A5580B6D902C12788E2F6C72A59A0A5C4385CAC77777C64D9920A5827568734370E891A2638AC12BD164C15C01A3DA0292F325DFA4069068329DDCC25A3964A845694DD6AA99F17AC9C12DADB4431C8707949CBE2E4B9764B65BAA0451146725B6A7B6CD6726E819AA8AE2971E334A66B0501F210C0A1975110BB8647CC8299C2F7D4C16DE4791B25A36B2592E3AFA0D059B9D4B3B50D9981160C23EB96BB1EA0A984D922C1D31A9C105CF5CE64D86222A12773E7ADC01C99B5F4754610A2B3F24C66D8E3212B8584DDF7B68128B215C600336409733049A54A719D0E5A657AC223136B1C9FC5D3F33545A051902AB0FF4B1CE5DA81BC8B3A78EA40828348210F953250211F85C1F3196418A32CAC6158850EA8B44A0CB72EA5C0B165DA1A0751DA41D58514439461942E478D3A3951E3273F35B938A842EAF331471B9B1417672DB5CA82F246B937448A08AA720060C5F2BC084D3157C25CA2F2BB02E2BC4289466C8721D7198B01F92C3EAB020BB92B318E78074218A48180EE799948501B84FDBB447FB009436CD20A69378E4BD87831630329AC0D76460E5134C60561180274E8C94B64C5F17BC4AB39625B49A13F1887B9AF06E3201469EC68BC7EB2BD457769C69C09F1646DA20B3DB7A8756962DEB905FE387084A58B069901A9FE1A0939C38E6E414E23B516FD0651E174DC0F6388DC2CB8D605D3D5B1F6AEA3425A03B9A903C846ACC128C87CD5A17A46BB474A0BAB64112DDF1C35355C58164B7C6F9B8A5879CE8E1CEB4FCC26EA55E4833A401B54EA5C29D92E03A8FD5AED6C51E2437C7A89221ED73B2BA3BC5DC30276A0692FFFA3E28B8CB9025566D54A3DD84A9004730B2009A73B354644045B44224D9D96B6A137D8F61513BF8555FAA8F61F00215C8C8841091F7647E53055E6762A504C121474120BC70BED5C4102C82813AF656B9248ED6F630BB269CEE33AF26D474C8B3CDD8D959D10A5D2AE221D5C20D9628A26F1A11EDE680F8C8333A54AF8D79B67AB0BD9DA1680927B0B31B1D6653410C4CC0C6E95164C33506D8CD19A73E1031C733C55EFCA33F76BBAB03182BAFECBAEAD364CE38B22B74A0A244A15725B232616EF2CC0A3010758A698880A23FD58BB2199A3946F5CCACCC2D61AA5985488C0EB60D465566B94C762057ACB163CA636B548254C26F139F51A96E492035B9D725AC16B94C537E2FD78B1641882AD20DCD6C5BB21B79921A59631130E7885340F5311F9973CBD31783DA443BF7566AB3BACEB88232F83E7077845061C09D425C7AA01733CC63D5B7C17C6B3309408D1FA31AD909BC1B0AB6535B0AB6064722D847B07811098C7316071A751623654605FA453FDDE8176B42B2ED07CDA4144640EB5984B301390C64D520071F1C66AD69C550AC41D74915DC2156F78127A704CD678A655C87CEB43748F0989AAE1730D3E4B3374A72CE364F1E2ABA2E5CCEBBA440FDA8AD50A749FD908AA1578C02B35342BB96C3350392C5C25CD71093BB2E87A3A466B697489A3C9E9C84805160A7396D001633EE00AE5641A893BB374CF5CF62417AFE67682C08A10E0A59B8346ADD006F2B40669042616D57936593A62D5578808A1E9D55B1EF4C90EB049987DBAB69B3C8C4A596901BA2BFA74DD4B937547A82B7F5290BFB79E5651B2B4AAF3692CCFBA987D5EC778E61281B0B388A71222DA27A90776E66BBAD25118AFDAC425F15599176C5D5F1B491FA1FBBD9005A0AB93AF1C8280292AA468FF0B1218726C52E4AC8FA403C91D12EB1134D6B08ADEE2A065F191DDEC390A1232D63306AE1C60AE1908CA2294ECAC6AB5257644DA45D70E96C6FAA5E1DD02AEC276C5EE2A8D36A2A13EA21359934C8285498370460CCC2A4C886C72A9FF17AA214553F6826177630ACC2F70619D64CE3F04DF17A6599E9AE5D2BB97B731432421012FB229124CD52BB9E2EA7B33CCCACBD9029A69AB76F00CE84A0C0D2C80F54A77D6064AE85465FA74271BDC2C62CB940E9C32A67F9C94AFB7322B93016E31C4E34993C7A65D58117495C44A8EBCEA635AA6C29889F3AB1E39661925136A06BB269483C1D291F90478713A91A178193B25877D416C03242682E76071B78964EA626C6A85E4ED8A45CF573BE56369B9476A2FC76713AA11573A083D0A0B89BAC15228A42B9BE2F8617CF8BBBA21562FEE3313066A8E86063EDF365799B7EFCBCC11570196B535D40F65F59C0972E057E2C70048CC10DD292611028277B325791B865B9D863972AB1725B6BF1546DFE0030CD85621F92472CB0064CC2CD11411127231181E6745A3580F6E8383150C8C098A3EB455F5CD05725719D0F844BE76743F7D962261A5FE5C29E46D58EEBCAAF0C40C04BFA43089C6236AB1AB574CF28A9178A4634C5848259191C21401C05A00A48D0420BB2737816CC72BB3D5BCB5EABD5531ADBB2E875045E861114D2C5AD5997B104A4F3BBA26A6372EA6062C8D6229C196E5B7A572F898D94A307BA051F899C16A34981B818034CA84A14930AF2D38BE095BE4B304FA1BB69DDB72AD605294BD273FD314A4D1940161B97626B5C725935D358153B4A1318F1273C7C6A93FCB372196593D9655F3C41FFD4B7B72B7131D7C2607A8763778556EC2D3E09969A4C968E92240077051446375B2C4C9BA9CEE84563C4491673667C026843C1602A9BAA0705E27918A27E2B01B9E756A77F7A304345117ECC52E81823A0A8170086B89EC64A39C60EA6A78363FB79E7C0B886B1854C5A929DF98077F5AD847650926273A9495000E688124118F1D83CC93D0E4D2565D307F4CD0C166E9083E8CB47F6979CD0C6F05D5AA184CD5ADDE3E9D68D66C7AD3ADAD382D8642BF03B85F068AEE861FA55B6340CDAC056B9A373687E44CCAB8751BD334F4942696B9076155F9D0E5BC0E89D85CF + +z: 4D727ACABD44DC48980691E0268B5B3FC1E476B3FDF9571F5CBC8DDFD400AB99 +d: A491FF48028B67A407F1054D5B1CBA733B665DE667E22596EDCC31C227C2DE1B +ek: 3563BADA724011CA9F7154964DB8092AEA60242B273BA94ACD33B61BE47B5AC2115E95BDBE56B214E04166356496A698C81744C06B114E2B37CC441A9AD8C90B936E1D86B9E1D9B17F352B393B9A1DDA0FEBC548989C12C120C7988A460B151895961733F84111058116C427E75A8FB6798B9691626F7A5274F46BCF5A160F0BC59B01C5D5E634EE9C1FD5D665AB59A4B495030855C538C86BE779CCD8CC076D83407A5C9AA3757841DC30F47592233A3AA8F3A721A5902FF8225F51764D59087D5B928E34572C23C511E236ABA0CD710A7EA0FA0CBA999F22445AF63CA783205E4D935CC9304BE9E92364C97993A1BC4DE491C5ACA2932575C99153A0BAA814644DF6A4922F426268EA1F7D97AB7629462F0C8465900AF523CF2FA978CDA56F4FC936BDE529553B56735701FAB3453C1A8ED0492222022E7C799EA11837C952CFF9A059992B26CE774460DAC2D23803A913CDE96662CDD78B4842A09E3A09A8D6A5B4052A25D39F63A43D9B9473FF184EB9B49B78B7165C62141866C2D4D866232A952E89CFC422CA5E510390DB98DE3A5DD0E3728BD5076656941894BD2C85C1B4FC400A9365F744B7EED6637C694D7C3104329AB526193E0CB2BF5E9B8E5D34630C16B097EB027C33621F23BA78E4470DA48354C29C114C242EEB6C62D15395D40B716A6137CB5B5AE2C27CD49D176B5D70416E254753F1150D5D8807F07916330C69B5F236F0672709834523092746897CE489B3FC878FAB716042509AA96BCFB839544449280C7C1CC3F79A22A25BBF47A33228CF1CB619E2492A95EA5F3D12C80BEB2412B81D6EC7CF6147287FF36449205CAAFB3625CC0A6FD4AEE3898D8FE56F62B06F6A7B7F1325B83A30B72FFCBFC9A672767BB2659B1B6500B4A3629F00286B82F9597E6CB21FDBA9AAAAC5F24273B2AC22EA4023219C7B32FCA7694693A2208791E1AC33C00C0DE64E2241001DC04249CCBEB797A1C38CAE3DA81C07364374033917A04AF6A19BE424C07DF33237B9223B7C04890CCB57780126B9A68AEB5783993F6C08783DC254B14482AD37AC90609BF3B0CEC7B39DB4241E0D9502DB60AFAE068749A295BEF8AABF861EA1292542927F6DB939AB7365142A37962A46230C37FB9519642119E03C45CEAC2F0B40198D6211758346E2FB284FF807A4C06552D7B8DF604D2EC771D2F74D0A258261280C60E71C9FE66168DC9493539EC1F018A520C02E6B8562C55831C18900A1C55FCC6A772480BEF2C75322C1CD116483562E6B7A0D16D351E2BC58032B5267325183148CA61079B2E8A8AA293863E0946D6772716053DF4A0260E3A36ADABD19713B46E89ACD650EA7932050724356D1261DA37916E85BF552C8AA628ADB08383781245EDA4A82E27D099496A26B5C893927DF02BEA47742B3C40B0E31B5D621012D1BC0F3B085E5BA6228E9B5E875901F1711CD12516EAAA4FFB16AF44AC384E0AB5469B222666FDFE32B1F5A4F3C0C022F6B4ED770572DB6B9B7FB715CEBA1C0EAAA19FB2361D83DD2465375A2BBE2793255619592A6044B71CFCA2916B0C6C895A38D7A28245398465432878D96446BF71A6C21C0A62500B030BE6B528646C860AEAB7B28FCCD87381C61D7106B518E22A2A03F5B7F48729A50672A4B039FB67B9DB0A803D304BFCF83782BD5A10250A8C8D96A9EA993E692CDE5871C6BF79FED564C5834634B88280D3A4CB18025E332532BC65FBC169DE0308012C08A581A1A5C9B1A89C75162B990FDAAA768A35DBD9ACE608981D589116BC45BD7D49425C7B11B573B8F554976152C9A17C273E4A3CAC15D5DF6724C1605D9A77CE487438248178C10486FD7C7E1EA52BB5467B066245560A2C4523B53304445F956E968C5AFF602B7F9378CB290BA0B4707841D175C01AC0BBEB18435E03850FCA479C1E8B7CF0730A5F23690F862C1970A5E9A8DD3F51E0655B2CE7BBD4B38264929C9499BADB505625B7A7BF260597F1239176C4892E37C3EA0770068C49E14A8DCE526D64791B6E3A1EB70A8FDBA17FF8476CA5B1BC9FB533CE7B1F0373D760AC691DC598899A3798A0D6F967699CCA69420116BE625CFC8C23879215C320B354412DC7311E21A3784A3445134977E995282033BD0080B84487BBF23A499CC1D17172BD029406523707B671E25F9DD605C8473C42FB131B08A1E33F1E85055C2DCBA8B2B04F9B8C07D906384 +dk: 385CACF0957318BCCDE555CB6933660544AFDAF8BC43D4AED82135F8CA2131201E03C7A42C7875EF309F227684284275F590CAB8078AA51AB95A133BFD9910AD0218260309CE43360ED01926D13255D37FD837462FC685F64350CAD95F9B757B56C79564C57C10B31F25514C570C1EEEC1223AAC91353971D915635E3A0A8F4BC5E1F241B3F31F457B3984CC160E13AB6C46B41808CB067C8396D4425FFA0C2E208E95522D65D0583FE2C50F40C9888066CF3377D494BBCCA2CF5DB55ECF711AA48ACFD6F859F859992E5B57C9C56D9430C6360B076A8C0EDDD544F8BB5B7950A7DDC006E705597FC08AF695AF0765331CC8913D8944EC4262E195B6FAEBCE2A3B7472D44A320B1533AC3917FA8DF7283D33E999DE4756FD37005104C8E2D50C4356BB35A79C021C45A05C05B10688F5A53AB52255D9B6BF8FAA036F09923AF89CC6F66BDACAB817A6C9F88B2339170FDD478A7C674350209C2D0773A413134D9709DA988F743134FA89AFDA3C94C4F75DFEE2656AE2312DE6A42A0B43910A4CF061922456346039BB4AC466B8F9AD7867103C165041220C23F09F264383D183B66C7BA90B93BFF8CB9E736881EEBC21917AAFC9067F8814C17AD8A302184FEC862083D1B39C810B92E3CDDF937773CA9EAA2C342014CF4652A5E5D2816AF4B9586467CC702A4AF342DB0B5908AC2F9B0C4490A8962D011BCCEAB20EE46DE2B6B08D473D79E7A10AA52211191784551E7B289C2FC85318017844674AED2917B3ECCA9C814F9F988CA8A927029AC5A6E8582078220FE44AB8A63EBAD736C4496D726BA3A1B422F1265212503B686A5367279E9661702D21887AE81F283966A5C91A8638C63608CBB59CA80A679F2ECA74D828AB15592A15070CC6915D8B6A1A6CD13723D410276B6F6644A9D0610869347386012340A4C6B1207B57903527C010FFC1C8B59599DAF124999CC4FAE39164A5868107C198519B59FC38E1229021A901F569A009987D76606A1F66C88FD88AA4D552E7C277510316DAD731727928FBB4495560958042773E1B8252BBB14F3328E5079E2206743BFB18A799918E241AF3A808155262A8F9A1CB46C60696763AB1206666BE2659BD1C78B6ACA15FB1F823C6E15A70930D21BC07F306094715A62805C486513837C56F332B97CEA067318C0C8E222B5762968DCA48DAE6C8297C2FA322913EA947B06418096C22D1EC3F2CEC48A7F850BF01B5702A8085108FA53127DE0B949E6352365336BEECA65395106BE79AAA91623931828436A67C0C3917160837532E0949503F7891BED485B5056B211A1E354105E3661AB7A1BFF354BBEC695204F2A8EF55073FF27A313662C1E7C7F4E8AB46399D29E2BE910425CE92976B491A1696CA56827F4571C98B328046269379110A559B463F1B9770050F1750262542A6C6BB728B4332C555CF45468795F2884F10303E212D333A0445EBAC52D669DA8B1BC3033081D0516F01CF22C5BE8CA020C8F671FC27A71A518D08B7A2C1C3AC62D874293A1D33729626968638C85761E78ED704CB86F054BE86C35F6A5233253C0F097B34A557C3A0B7B5D16B0266718AB7BB5DC27AAC3A96BD0B807BE5392FB0C6804739800206C7287C130B2A77E5045D5491FA50C1C68629C538078A3091E7B967B4767C3758A9A4E871C6129D78F0B9BC7963CC110641F7C8350A860B611C3DEC98FBBB8FE4F40BD10BA1F9F6C7061B12E7541EFB527B8E4349469987E4FA42D8F4958D6243A1C032EEB5860DD0BEC0C9A1E4D88967B748BC536020524BF5D06C594199DBD6B6CBB795F64B0F6656655B9B36B7E84316D918E094078D1C4E03C75617197306192338747E32F46551ABC23E74AB757B12C85899C28238FC74C089E4101F0A42BD440E28BB832BD523F03C070FE065D7B96652D680DE68223971ACAF5B5C29B8AF836C41CF80AACE794800FD944B6224B8E207BE27AEF24BAA4B2436B28B6A85AA19612A4F11935DEC482D7EEBB006B35860D13A7FFB159F57812B518E2F3161A9E35C5B272DA3529284DC278664AEDF05B0E1D602BFB60436F026FDBC0A30F2579F1C4252021A132C31C73249065C5BBCF03A5D418DEBE578E5F4A9074685C68491ECEA6DC9EAA7BC819DD2C43F42049B92864A001D533741515EA5090F0870F455B03563BADA724011CA9F7154964DB8092AEA60242B273BA94ACD33B61BE47B5AC2115E95BDBE56B214E04166356496A698C81744C06B114E2B37CC441A9AD8C90B936E1D86B9E1D9B17F352B393B9A1DDA0FEBC548989C12C120C7988A460B151895961733F84111058116C427E75A8FB6798B9691626F7A5274F46BCF5A160F0BC59B01C5D5E634EE9C1FD5D665AB59A4B495030855C538C86BE779CCD8CC076D83407A5C9AA3757841DC30F47592233A3AA8F3A721A5902FF8225F51764D59087D5B928E34572C23C511E236ABA0CD710A7EA0FA0CBA999F22445AF63CA783205E4D935CC9304BE9E92364C97993A1BC4DE491C5ACA2932575C99153A0BAA814644DF6A4922F426268EA1F7D97AB7629462F0C8465900AF523CF2FA978CDA56F4FC936BDE529553B56735701FAB3453C1A8ED0492222022E7C799EA11837C952CFF9A059992B26CE774460DAC2D23803A913CDE96662CDD78B4842A09E3A09A8D6A5B4052A25D39F63A43D9B9473FF184EB9B49B78B7165C62141866C2D4D866232A952E89CFC422CA5E510390DB98DE3A5DD0E3728BD5076656941894BD2C85C1B4FC400A9365F744B7EED6637C694D7C3104329AB526193E0CB2BF5E9B8E5D34630C16B097EB027C33621F23BA78E4470DA48354C29C114C242EEB6C62D15395D40B716A6137CB5B5AE2C27CD49D176B5D70416E254753F1150D5D8807F07916330C69B5F236F0672709834523092746897CE489B3FC878FAB716042509AA96BCFB839544449280C7C1CC3F79A22A25BBF47A33228CF1CB619E2492A95EA5F3D12C80BEB2412B81D6EC7CF6147287FF36449205CAAFB3625CC0A6FD4AEE3898D8FE56F62B06F6A7B7F1325B83A30B72FFCBFC9A672767BB2659B1B6500B4A3629F00286B82F9597E6CB21FDBA9AAAAC5F24273B2AC22EA4023219C7B32FCA7694693A2208791E1AC33C00C0DE64E2241001DC04249CCBEB797A1C38CAE3DA81C07364374033917A04AF6A19BE424C07DF33237B9223B7C04890CCB57780126B9A68AEB5783993F6C08783DC254B14482AD37AC90609BF3B0CEC7B39DB4241E0D9502DB60AFAE068749A295BEF8AABF861EA1292542927F6DB939AB7365142A37962A46230C37FB9519642119E03C45CEAC2F0B40198D6211758346E2FB284FF807A4C06552D7B8DF604D2EC771D2F74D0A258261280C60E71C9FE66168DC9493539EC1F018A520C02E6B8562C55831C18900A1C55FCC6A772480BEF2C75322C1CD116483562E6B7A0D16D351E2BC58032B5267325183148CA61079B2E8A8AA293863E0946D6772716053DF4A0260E3A36ADABD19713B46E89ACD650EA7932050724356D1261DA37916E85BF552C8AA628ADB08383781245EDA4A82E27D099496A26B5C893927DF02BEA47742B3C40B0E31B5D621012D1BC0F3B085E5BA6228E9B5E875901F1711CD12516EAAA4FFB16AF44AC384E0AB5469B222666FDFE32B1F5A4F3C0C022F6B4ED770572DB6B9B7FB715CEBA1C0EAAA19FB2361D83DD2465375A2BBE2793255619592A6044B71CFCA2916B0C6C895A38D7A28245398465432878D96446BF71A6C21C0A62500B030BE6B528646C860AEAB7B28FCCD87381C61D7106B518E22A2A03F5B7F48729A50672A4B039FB67B9DB0A803D304BFCF83782BD5A10250A8C8D96A9EA993E692CDE5871C6BF79FED564C5834634B88280D3A4CB18025E332532BC65FBC169DE0308012C08A581A1A5C9B1A89C75162B990FDAAA768A35DBD9ACE608981D589116BC45BD7D49425C7B11B573B8F554976152C9A17C273E4A3CAC15D5DF6724C1605D9A77CE487438248178C10486FD7C7E1EA52BB5467B066245560A2C4523B53304445F956E968C5AFF602B7F9378CB290BA0B4707841D175C01AC0BBEB18435E03850FCA479C1E8B7CF0730A5F23690F862C1970A5E9A8DD3F51E0655B2CE7BBD4B38264929C9499BADB505625B7A7BF260597F1239176C4892E37C3EA0770068C49E14A8DCE526D64791B6E3A1EB70A8FDBA17FF8476CA5B1BC9FB533CE7B1F0373D760AC691DC598899A3798A0D6F967699CCA69420116BE625CFC8C23879215C320B354412DC7311E21A3784A3445134977E995282033BD0080B84487BBF23A499CC1D17172BD029406523707B671E25F9DD605C8473C42FB131B08A1E33F1E85055C2DCBA8B2B04F9B8C07D906384861D9A8CDDC54069D3E53E033E2530CF83C284A49AD15019F061C40B2D00AC7A4D727ACABD44DC48980691E0268B5B3FC1E476B3FDF9571F5CBC8DDFD400AB99 + +z: 4E638D8AC3662450E09D8500DED751060B7990D54F137508B9897277F65EA952 +d: 7B2EC50C53A67E0BCCBA98C2E319F5AB46B6E593D2465F14B23FFA03D0E5BE0D +ek: E8A65EF0C7C7D7391DAB233EB277243732CAA45B53315B645FF9721D8AB0CFE54FF717157663B9098C2267633EFE3544A88014AD15C7B10A4551CB5F9BBA3D74946371B1AA54E6419CA7B4611149B5F02C73819A8C625AC52618F771202338AFF05969ED670BDD0B9DB562B8055884CBEA7A208A2DA850A05484C6B84109A5C2B498E8B8640ACC6F7AA6E1D7A95415469CC1C06D17176146CEFBA58E2B8929770851EBD6CA5DBA444548C622673DFBEBBC95767BEE2B86FF5BB37CF306B2945071EC1FA80C7540C56A36EB684D71C5E8B90AAA8C2421E21D64E0638D63C96E2B0BD9457BD5062199A01253D240C712315778AF487AAFBE28C650532A493C1B3E0251BC0841392839905AAD3D12289506742073862E8549E7E87EC28102DB7B89EBE91627CB95C0928C921978CB8C94875A94F1557498132200B4B76AA3C3AC9755C3B6BC5E5C59C9B3C6F7FB2CBB5AA457904FEFD2C370E29EEB2417BC45977BEA02A0DB9DE57937372298102755BA5B007EC88340B28AE7B819F9E07182F76070043CF3AA7E9256CF1CC3A6442B1726EB889CAB193222BCD3D8141843C1EF9921B8254712C04529D38846F595BC011B3288BCE0231ABC96985145043B579BB0864F40EBA6A66144E0972CDB10A71E44A088112B3C7907E5591D6EE85B34D4AF8DC58633081BA1A0A6EFE133B4C70ED215A22F451A7117B8C5F6A3D3FC4455214F5DCB8C31370546B4C4BA365A25017A9C2296AA641CBC4745BCAA72D17C9EAAB0155627BB45770D6D259BDF5B044053B4C7C8784FC433E89942B5D6C807A0707842CA4FBB98693303C118C9F4952123582FC4E22BB853944BFC1584810153F3AF5DBB74BB2928785C542AB647E9321D724AAC9EB9091707B5075C700A4817CAA2C355D4C99B8C5037B5288FF5279725BEBDAA5CE23609E5320981F11C8A116501D5ADD2D2B057C41E469257057B7A9C508017245C20C13A0C104FE1A517EE4621C367CE283183C07675BBE5895FBA4F30CC406772635982CEBC3153D046161C7B8BC4D87B648236263A44ED50B92DEBB624528C7A984C4C5047737A8021665279E9CF30069AADCC3F4A9245700436E646AF721A612828A07DC463D61B70223C7658F22190C83405999D92889CB0E5020052C31066665C4A021643C20764C370B9A5D1975D47646E1329072335432A19A03590B071482A3774BCA0601D8DBCC35A63742CD127F6384AFC6A971EE8CDD3E13687588D84C358A5537E753B2736840FD4E76A1CD0C68F9A990E5644404BBA84491E5F3B6F23EC45DF91538BD54070A702E69B66BF6C88CBDB8FDE693A2487681379A2AF94C592472FF167BD17966F9DF67E8FC51152AC613512930BA2BC2F453EEBCA91399B6D8F12AE891B3DEAECCFF120751866369BF8902D439D19F77B264002E5901B1C939FD86CA623277E6B09A72A93B52AB00754EAAA74833B8E366C8F0752639437F83CCC00F92EB7057C43AB94A75C31D5F854DCD3784920A36CA0C2DE244D1AE3A9E578B98E0634635549A8932A6BEC1F2EB321572A060EB110AF473F3E04323FD868A241891227222414C663285B05777BE82585DF3AB0ACFC121A642C541B3C3D7BB3157302EF62A1229156DB3609678B3B3E2576902145E5ECC78B65CF69BC8A7E6631494B804C4C89A9B595A8D95C039A9BA356670A536220C1CB54AC5BFCB7CE0125606A40C4EB4BAFC4C43BECFBAC84812F70C66796D6407F887CB0DB41F0FA7062E255896582B2B218FD96B6E5581A6FC26ED40272836950CB348AFE78CB135ABB6D015F299377632C72A7BBB2CDA7CBEC689E7551168483085B6B7426EB6967F729AD695D4E09C49B7A0010F80EAB54CBBAF4B641C956231663DB83512C97067CC7BFBEDCA93CC9A739A813B48C4793354C2DC642F869307AA191B77C2BC72BB048300B54906DFBD45255E92D81A98CD87149FEC3A428540D4E03C757260F3731CB7C4743A37194054AAE5FD6902D48A911F661EAD29321722E8243CE62E75ED82657423163A86362CAC2931954092909B0082BAD382A013A5044FAE9A12BF300670CA5771042933764E700B43259B130F033B023CBDA36815E2C6BC7C0601CEB7586A95DA4033E80E32123AB86C6135222EBAC0EDC17F5549D5B66760E07B2B16BA4FD8040E642990128A39A636B19FD3EDA4611BC1CDFD552AD1DB338FE3700F0920D56F3 +dk: 0CC61046A844640446F07C1683D649F1168A00F1C859798944790CE1F884B2A99C177C579E314C91B33E483B86B64143EEC23F1587C8E038A42C85397A47CA7600C772D492E4CA5F7DC815100B9155449E72A0A526D24035FB20074941F0622FA9369E79D46378E45D5564245B0C10D9D873420895059428965CC22E064B349A4E40346F77A84BF7734C598C5775D39E1ECBCE2A6BCE6FA5CEA4F41A05949ED766C1A290299D9BB47DDC2E7A782F386C42D2AA04C991304BDB108801AB6802B04259757A63A88B7492A2FB2E93A1AE7646267F434C724134154C407808CEE0A7983C32727E44766E5C34EFD16C52086519FA0DC6C7098282555C069F76832F7707477F69566280BB6D406ED1714205B73A5711C449B91B4F8A2C2638B65221493BD940B5370A4C661F6F9C27AEA6A69DD0B61CEAA861E78328941091A95300602878222290CBC67E907D6C4CB2BD6623CCC5A23E46322498BAC5945E6B28283D7401B30401753859A2D4818ACC8D71437961DA02F2E8B5BA94B494E7A215F518C6BC8214C57237108C6B183F1551696A909C828A0E076341A5C141ED62A9987932D002A714366D8621CCDB0272E7923C6F3461AD341C145A864C6655C8E02AC0C91CC0613CE7D48027206C7D4988D82A1340A7BD337B82FA26400A4B97B5D819AF154CDFA639DA3A522DAA0F524B2B77FB422B8216FA83B8D94903452BCF5054A5081741B2E93F40548793B39B7197AAF027907B763179269CB06671B0CC2820F6015FA158CE93770A1A51CBF033ABA1A5C4363A1AABCA93F2800DC011B19B952774C4F90991001C19F3A688B2E01C934A7BFA705CD093AF85BA5D20FCB498E5C91B186378B63C04123D19A8C2B5209D7D8799EA7192BC3876D1943F17FB63B8185D89A37483AB74E62BB03C27BA845CCE57309DA7A8055642B9AC51B820AA8F61F88B819804DCD8C3CDCA2AA816BDABE9725BF83C61796ECB069D183600FEBC41114182338C97B67618DF818DCA151AED240E36C1A0DCA654886C6CD3731A92E3CE81D7CBB4BB1CCDD238C54C44E89126641AAEE1145BBC378C92C56E400B5DE838A18FB66D365501B406287ED8AF6D03CBCA4BB617B42DBEFB4A0435319A00133F4AB70631C1045515C6C23310F50406780F9E891187FC96736296B9E7AB1609C51A103AC34667925901EE3A9116CA97FB46B8325B13A64B008A88B03E0C383E152D7F8593B6638BA7F9AB500968A830042CBB50638A58AEC5B6BBC1938E5C7A605A80B161BC18841873ABB5F38ABCDDE99464736D3505C9EEB86E8A95747CF9CF3B9A52BB115505B156928A79DC9B9E1F110987D4808AA2C27B806D7B746014476E571AC2F416AABADB36CF994813887195CB63C15C678D480443CC0D2C60365E358F1FA9897A12279CE928E2CA8D67006D48592F54EA4CDEAC2748940AF558356760C420EB71DE2ACADB064586C5C01A698330266DC78C95DB8CB51907C6DD94B507C107E9FA7210C60FA5D8888A3CAD7AC1B6FEE59159D6212403B2B21944D0AC35B0137989F002D4F13E8B873F8B53B3ACB09478F4C00A7486AF0B5FCBD42E21654FF3DB786F2307E7E60236EBC89C36971E2920A27C5E7125BA1DC77B4F944BFDA8C4D3E09BC8A00B3099B6EFEC5F7F59AD925B79C3311A7F02433FB9133F845B58E0BEEF5611DE6890E45AA75645C34F832B08B7655CD6424F733FEDB9825EF3340A010E72781D16F8180F227110402816E6524D8B341EF5CBD098A8CBEB52C02B715D1789B0D38250EA6730E506E569A9E32A5A35C7341181B9E0C46296E91F3FE9C5A7159F9126BE378BAC03D467C7A39AD1605DDB2A3C7FF930A85C0710114ED2094956E005DD770699F4CD50767E53C15D5251B2621336CD6974CCD446C1C4028C62839EB699D869758E502CA158A39798688D95B1C4509EE9C57383209D69D105D56AB55A59955F78A65E49B5A4FC4A5791AE5D79118CE2B22AA9BA2DCB963BD672A6861D78C30D6873893E15C62A428BA3E77D09C94822693166E39C32E32666F4537E70A641181C13609F1C3535A91486FC3ACCCB29A0EC0133DF7917B71B8EE4509264788356E967335942014213E4862AA8B7691AC207A996711AD1AAFC30BCBADC0A35514F3FFAB45E53197E89B918AC75B504647A3684E8A65EF0C7C7D7391DAB233EB277243732CAA45B53315B645FF9721D8AB0CFE54FF717157663B9098C2267633EFE3544A88014AD15C7B10A4551CB5F9BBA3D74946371B1AA54E6419CA7B4611149B5F02C73819A8C625AC52618F771202338AFF05969ED670BDD0B9DB562B8055884CBEA7A208A2DA850A05484C6B84109A5C2B498E8B8640ACC6F7AA6E1D7A95415469CC1C06D17176146CEFBA58E2B8929770851EBD6CA5DBA444548C622673DFBEBBC95767BEE2B86FF5BB37CF306B2945071EC1FA80C7540C56A36EB684D71C5E8B90AAA8C2421E21D64E0638D63C96E2B0BD9457BD5062199A01253D240C712315778AF487AAFBE28C650532A493C1B3E0251BC0841392839905AAD3D12289506742073862E8549E7E87EC28102DB7B89EBE91627CB95C0928C921978CB8C94875A94F1557498132200B4B76AA3C3AC9755C3B6BC5E5C59C9B3C6F7FB2CBB5AA457904FEFD2C370E29EEB2417BC45977BEA02A0DB9DE57937372298102755BA5B007EC88340B28AE7B819F9E07182F76070043CF3AA7E9256CF1CC3A6442B1726EB889CAB193222BCD3D8141843C1EF9921B8254712C04529D38846F595BC011B3288BCE0231ABC96985145043B579BB0864F40EBA6A66144E0972CDB10A71E44A088112B3C7907E5591D6EE85B34D4AF8DC58633081BA1A0A6EFE133B4C70ED215A22F451A7117B8C5F6A3D3FC4455214F5DCB8C31370546B4C4BA365A25017A9C2296AA641CBC4745BCAA72D17C9EAAB0155627BB45770D6D259BDF5B044053B4C7C8784FC433E89942B5D6C807A0707842CA4FBB98693303C118C9F4952123582FC4E22BB853944BFC1584810153F3AF5DBB74BB2928785C542AB647E9321D724AAC9EB9091707B5075C700A4817CAA2C355D4C99B8C5037B5288FF5279725BEBDAA5CE23609E5320981F11C8A116501D5ADD2D2B057C41E469257057B7A9C508017245C20C13A0C104FE1A517EE4621C367CE283183C07675BBE5895FBA4F30CC406772635982CEBC3153D046161C7B8BC4D87B648236263A44ED50B92DEBB624528C7A984C4C5047737A8021665279E9CF30069AADCC3F4A9245700436E646AF721A612828A07DC463D61B70223C7658F22190C83405999D92889CB0E5020052C31066665C4A021643C20764C370B9A5D1975D47646E1329072335432A19A03590B071482A3774BCA0601D8DBCC35A63742CD127F6384AFC6A971EE8CDD3E13687588D84C358A5537E753B2736840FD4E76A1CD0C68F9A990E5644404BBA84491E5F3B6F23EC45DF91538BD54070A702E69B66BF6C88CBDB8FDE693A2487681379A2AF94C592472FF167BD17966F9DF67E8FC51152AC613512930BA2BC2F453EEBCA91399B6D8F12AE891B3DEAECCFF120751866369BF8902D439D19F77B264002E5901B1C939FD86CA623277E6B09A72A93B52AB00754EAAA74833B8E366C8F0752639437F83CCC00F92EB7057C43AB94A75C31D5F854DCD3784920A36CA0C2DE244D1AE3A9E578B98E0634635549A8932A6BEC1F2EB321572A060EB110AF473F3E04323FD868A241891227222414C663285B05777BE82585DF3AB0ACFC121A642C541B3C3D7BB3157302EF62A1229156DB3609678B3B3E2576902145E5ECC78B65CF69BC8A7E6631494B804C4C89A9B595A8D95C039A9BA356670A536220C1CB54AC5BFCB7CE0125606A40C4EB4BAFC4C43BECFBAC84812F70C66796D6407F887CB0DB41F0FA7062E255896582B2B218FD96B6E5581A6FC26ED40272836950CB348AFE78CB135ABB6D015F299377632C72A7BBB2CDA7CBEC689E7551168483085B6B7426EB6967F729AD695D4E09C49B7A0010F80EAB54CBBAF4B641C956231663DB83512C97067CC7BFBEDCA93CC9A739A813B48C4793354C2DC642F869307AA191B77C2BC72BB048300B54906DFBD45255E92D81A98CD87149FEC3A428540D4E03C757260F3731CB7C4743A37194054AAE5FD6902D48A911F661EAD29321722E8243CE62E75ED82657423163A86362CAC2931954092909B0082BAD382A013A5044FAE9A12BF300670CA5771042933764E700B43259B130F033B023CBDA36815E2C6BC7C0601CEB7586A95DA4033E80E32123AB86C6135222EBAC0EDC17F5549D5B66760E07B2B16BA4FD8040E642990128A39A636B19FD3EDA4611BC1CDFD552AD1DB338FE3700F0920D56F3771F1733A4C185573FFD9BC77988A1458D28A64F15512217C7B95C24D7CF48904E638D8AC3662450E09D8500DED751060B7990D54F137508B9897277F65EA952 + +z: 7459AB99D24C1254EEECC035874BF19A64EFC8EDC9D369C11F5DF4DC83AB5FBC +d: 16858AA7C92EBD72FB8CCD0A99D0435EDB2A6EB1B936DBCB637CF43F25D221B1 +ek: 379C74CE8940E12A1790659FD6C2431D7C1043A8049A3B0AC1000273A0A68EC34AC6435018C19F3A5A18CD28AFF1254C27E92E25149E488A5CF5C724873A7CDEE0182CB874E1564F6036CCC6E5C02FD19937D459ACAA589BC3706BB60E82C93047030524A73C3831232659565FF49DBAB60BC8C18E203B68DE7784D96B4C1969AD8F164EFD531F8A297F46425CBBD0C4E3C858A01982DD4686860B0253D1067AC66353F7554DF00A2FFC46858C6693F04499054458864A4A7AA82230A4B04C1EFF8A2B9C5B1A43F0038A027CCDF73EDA1B16CE878D14B27DBC2AA0019BAED2C86F9741A9DFF624071545A4CABBC2895D9E9602C1027D05EB1C70DC2365423A65740F777565503C53B31C9D7DD06DF115BC2CC1BA80D992D185C485A78FB6A0B725E2A93897CF04F1B421093FA098BAF4B829FED6CC07073F0D13502E430F892A5E344B431DDA1EC9270A0DB64CBF40CFDC78293826BF4701181594B89F8CA52F3168DB931E7242121A71747564AF2DF0312BA4659A8BA2106983957877673269313B953534824E035AB75A5007B7BB5832B37936683B23B563FAB86EB749819616AC467B42D4B11922A9719067039480849B13E125353F54179B5524C7B5905A673E54EC888614AFA7781B918951C2C30E89043119351965256B26CC5B8E1973C1E838C6297D1305D02351A1C2E394DDA666D918545BB8CB69CB8141645AC7CB606A0500E0F94961CC8B33A5250E191169C3B4CBB927438764B356928431A7D5E73067346C9EA02D7F687A9DF1BE9018473CC7442F801B43F2307FD2380329C5D3DB8802823864A8895C0262A97547682A61A1652F4611717C09AC6DF8886D67B1213739DCE29271F65564CC642851005E224D634C996556AE35E3CCA9A6C746F7609CBB526C9B9CB144CEF1F39DBCD11207F43FB7296193B12F1E7B043DAC724FF9A32581192E13166FC91F10CC5330D6A7C4F04BD3248C61D227E70543E041354D55B1E52AC1BDA0657ED3C6F5F3444B3775DE1B0C337409C34B75A5B9A58DA8B7445C2E3A6BCCF1E02A0C1A20DC619893E6370D35BA4CB615D5B2BF12885749865675B9A925B21EE138830E20B2BAD258349A44747A08FC962476A0A7A1676415539086A543A087737DCC8E2565161F8697043819206202AB240C00C496D5254E8B0610D6C55CE52B20B0F63D65092F95879736D989728AA6EC91588F60682512CC50BCAA756A12F13C6C502BBB6CF210A7877DE46831A1E91D7549B50AC391A439BCDF2135FE81C81B25874189726D77AF828876A4F34E19E33009B8217E511DB2A7724B251109646E112823242C964B933F8B4625EDCB1471DC714684045AE79811A56B113803EB272AAB94709421239B009C3D4CC8463906DE646E7374C865103AACD4190206C43BD2334D496005427FDA19CF31872A941C75A6B1663F6C57754CA0D9D8A23A1B9592A1B3FF76A035F89B72B29E6207D05BAC0C349608E71B2E4A3CB3EA7651A26B374CE516C787976691BE124AB671049F3B573905D19906CA6E9C5912F6311410CA3A7B25973895C0E8733557A463E311BA20191EB77B3EDDDA437BC75D5F358AC883B2E8242449834AB6F5ACBF0422ECB438AA4009BB678E88D033C701322DC01D0F9B47EC135A25CB2B491B7F45B33686788F603B28E0A215AA1AA49BC2B2B10906F70004DAEB16F4E5805DB455BD794861BA1F8D55BA6CE29591728CBA492B89255762B25DDB71557E8366601535DD38609652CF47506379673B0124796C3CA7EB384EA0830DBB318E553525DEA69187A2151A227016DC53684C1922A25A90107C64E04CE1C7AF8481A437601D7C4AA014D18CB397B4079C660736453B35A5BAAB9371F0B5D4F867CE15AAA8739F6659B12FB93667DA30ABA01CE923853DD26187BB20A845691AB48785B22767ACC0D7389BA260BF115873CB784CB4C715E67776759511DEEC2B565361B84A8833C7A16C16AA3F29750397B0ABAA9B73A580527100511686A19A7AE757833EF826F4D21E4C020618809A48B67156711E70D5171BCCCF997CC048BBBB2AE064FFB9143F66A2E81A9341831999D822AD947CE88CB153BA595D5B0EF5D08EB856929412B9D2E551C959482AB545B1A0AD8583B7C0D42A95A3A080B772C77424A1AA1852DCA0662BCBA7B96CFAC5B1B689F01A5CEAEB2A0D52EB0FE9BF752B36B37830846812FFB88D +dk: 2ED75F448A5247A0BDE73C1A09DA83F27512A9E1998A48C80A0962ED307C0F8C4D221584D3A90D6C7B003EABBA2A2013F4D74CEF9A84AD123E430B316C08AFB04A64EFB31278F4CFAF1156285679203A275B267AAF7786346B40566B5BEC24B122C89108683431D0A8E8531EC70116F648004A9BA3DA807E54755BB10B9DDE973DD1E62C1A6C752D09B18DC00178C52A6F0504ABAA2B3E54B1D1A495A9A38BBF29812C472D28A8386F04BC41F555263A8DF34536E1925434407B3F885F7349A2C20BA5F275BBA62039F77A0BDD236EE4A7205B660AC04A48D6EC0927EC8986C73539754545E96B3F681F461A5424B954C5C69F1899BB8301B0138BBBD934A764168951B0BB42043FC6A441BC329574C726E9D31286063DA4556C02087FFC473C3B4307986A59AA595139A46351FBAAC3E1664B5A4A74D5916EB3BCB0F570B330ADF4574A92589C782A3CA520C43C4BC7987367BC64B9EC1629C41C80223154FFA3161A158647468B8DC670DA26496FB53F1BAB59261B8B9A3A725AC992567ABAECD027856650A9D78FA4656E3BA89BFEB80F7007562AC84EAB2917E18432CC5A4BCB969DEA5C73F1AC620612574F3106D1646FC266959723004C425BEA6B8B8E6326365C540C2844F666A482116D16C1272D90A439567706159C90623B1A79B62B14860926568C32360EDC9C868211E0036C9A3979B6F39126A150A9259CABC8631D9214CB43A8564A6DDBF785AFD44EDCCC7D2428A92766AEBA969D9E065D05E772C6DA572F9B0A7C5A7C0E54020B331CDF321CE7E48EAD96C4EE5062509113E274578F50A7AD131641BB3CEC76CA79B39529F92886B40F22086A6F527623E37797F1009E082277CA420C3310C0F35F2BD61776B8C5FCE14136DA388FE6CC37F3A7496C0062D0ADDC91B8ABA38817F45A7996AE0F7BA41D32C1FC255A43A6BBD9DC6A65A6BB72A306A3446418A77BC58C1D3B1B05437C6F85D01A300C9FADBA40F8F4B8DEA2CC358547165A467AD12BEC5C80C4F7AD6F308550B419BB06AE54CA29011A55502215CB0397C005544404B9A413CF74F5AFAA532C909A3D00FD37146721FB0B35363B9C52B71511D6C45B719E33CC43E016770936BDF6D2056AC21FF65CC813321144B98C965530A80654EFB350EF973AD505791766BDB4734C3E1A0394A89902416C3DE269B9A99E4B6CC39D64BCFAD64A552728905882278A238B214B94F62856C14C6294B8FFE80F3E62B3C91A687503094C2849BE8254314B56CDD35617D61F27C9960388811C830290808F9D0B2DA6AA4728606F55CABCB92AA9384CC3E03537BAA41BE636C7EFB036B5114019E40C74984884DBB512D61CC8A973D8E6C8EAD45E235C7E6235C181C062E82CBD26A2859BD9B510514D83114847ECA0DB8554663B1D74E5084460C396E43F3FF47D379A4574C77E8F1C11CDC5974471663244CE2EC399AAE83CF96889BE7628ED028E477C0658993941AB737861A9F8388AD1309BBBB23EE72181A1EC7BF445B1FCC5527E9C0F7D278362548131CB2132691E232515CB5C5CB6640E01F8B75D96A9E60ABB6929A7582219A8A8CCDAB2C4A03A035B8CB416114FF7604692427B35C135DB956F6BA796145CAFFB066663293FEEB462EF5C4D8C521B86436F011157245A891F233AA122C51AAA0CB0D5100B01575EB04B9A1B86D6A1808357265DA0570DDCCA2766C5802333C64B0D9E5A254A8645328C394F85B337A447F17753BB465F584462B40518705094D891C6143114522BA327547B61C928CF50758FA5C0C6FB2255A51E13E9AAC37000053C180EC7A6E597BF57DC656123793EC0CB24E9306FC0CA5CB723C8F46174179923E819A1DC760229018D7348AAD75263DA565129A39006299CD979BC73062003D0773611B07141FF2265F8E5583284201A4111F5719BD4397909D892AE8AA438121C5DCBABB9413194542E6D98AF6655871DF23C6A7A43B6B6C9D0790F53705F419B226497BBE92A3EC6315C6A443878B283A252423B13505DA298AE100A6E34BDEB734DAF0588BD54B2D5C1198C653B34A8C4D0447C5B6B137D203BB2612E46AC4B82BB97931550F3F835B57B8521828718498A3405C36A345A1323924221505906723847571C6985B0A59F1FE15C961B5F11630D04CA79FFE22F371A96379C74CE8940E12A1790659FD6C2431D7C1043A8049A3B0AC1000273A0A68EC34AC6435018C19F3A5A18CD28AFF1254C27E92E25149E488A5CF5C724873A7CDEE0182CB874E1564F6036CCC6E5C02FD19937D459ACAA589BC3706BB60E82C93047030524A73C3831232659565FF49DBAB60BC8C18E203B68DE7784D96B4C1969AD8F164EFD531F8A297F46425CBBD0C4E3C858A01982DD4686860B0253D1067AC66353F7554DF00A2FFC46858C6693F04499054458864A4A7AA82230A4B04C1EFF8A2B9C5B1A43F0038A027CCDF73EDA1B16CE878D14B27DBC2AA0019BAED2C86F9741A9DFF624071545A4CABBC2895D9E9602C1027D05EB1C70DC2365423A65740F777565503C53B31C9D7DD06DF115BC2CC1BA80D992D185C485A78FB6A0B725E2A93897CF04F1B421093FA098BAF4B829FED6CC07073F0D13502E430F892A5E344B431DDA1EC9270A0DB64CBF40CFDC78293826BF4701181594B89F8CA52F3168DB931E7242121A71747564AF2DF0312BA4659A8BA2106983957877673269313B953534824E035AB75A5007B7BB5832B37936683B23B563FAB86EB749819616AC467B42D4B11922A9719067039480849B13E125353F54179B5524C7B5905A673E54EC888614AFA7781B918951C2C30E89043119351965256B26CC5B8E1973C1E838C6297D1305D02351A1C2E394DDA666D918545BB8CB69CB8141645AC7CB606A0500E0F94961CC8B33A5250E191169C3B4CBB927438764B356928431A7D5E73067346C9EA02D7F687A9DF1BE9018473CC7442F801B43F2307FD2380329C5D3DB8802823864A8895C0262A97547682A61A1652F4611717C09AC6DF8886D67B1213739DCE29271F65564CC642851005E224D634C996556AE35E3CCA9A6C746F7609CBB526C9B9CB144CEF1F39DBCD11207F43FB7296193B12F1E7B043DAC724FF9A32581192E13166FC91F10CC5330D6A7C4F04BD3248C61D227E70543E041354D55B1E52AC1BDA0657ED3C6F5F3444B3775DE1B0C337409C34B75A5B9A58DA8B7445C2E3A6BCCF1E02A0C1A20DC619893E6370D35BA4CB615D5B2BF12885749865675B9A925B21EE138830E20B2BAD258349A44747A08FC962476A0A7A1676415539086A543A087737DCC8E2565161F8697043819206202AB240C00C496D5254E8B0610D6C55CE52B20B0F63D65092F95879736D989728AA6EC91588F60682512CC50BCAA756A12F13C6C502BBB6CF210A7877DE46831A1E91D7549B50AC391A439BCDF2135FE81C81B25874189726D77AF828876A4F34E19E33009B8217E511DB2A7724B251109646E112823242C964B933F8B4625EDCB1471DC714684045AE79811A56B113803EB272AAB94709421239B009C3D4CC8463906DE646E7374C865103AACD4190206C43BD2334D496005427FDA19CF31872A941C75A6B1663F6C57754CA0D9D8A23A1B9592A1B3FF76A035F89B72B29E6207D05BAC0C349608E71B2E4A3CB3EA7651A26B374CE516C787976691BE124AB671049F3B573905D19906CA6E9C5912F6311410CA3A7B25973895C0E8733557A463E311BA20191EB77B3EDDDA437BC75D5F358AC883B2E8242449834AB6F5ACBF0422ECB438AA4009BB678E88D033C701322DC01D0F9B47EC135A25CB2B491B7F45B33686788F603B28E0A215AA1AA49BC2B2B10906F70004DAEB16F4E5805DB455BD794861BA1F8D55BA6CE29591728CBA492B89255762B25DDB71557E8366601535DD38609652CF47506379673B0124796C3CA7EB384EA0830DBB318E553525DEA69187A2151A227016DC53684C1922A25A90107C64E04CE1C7AF8481A437601D7C4AA014D18CB397B4079C660736453B35A5BAAB9371F0B5D4F867CE15AAA8739F6659B12FB93667DA30ABA01CE923853DD26187BB20A845691AB48785B22767ACC0D7389BA260BF115873CB784CB4C715E67776759511DEEC2B565361B84A8833C7A16C16AA3F29750397B0ABAA9B73A580527100511686A19A7AE757833EF826F4D21E4C020618809A48B67156711E70D5171BCCCF997CC048BBBB2AE064FFB9143F66A2E81A9341831999D822AD947CE88CB153BA595D5B0EF5D08EB856929412B9D2E551C959482AB545B1A0AD8583B7C0D42A95A3A080B772C77424A1AA1852DCA0662BCBA7B96CFAC5B1B689F01A5CEAEB2A0D52EB0FE9BF752B36B37830846812FFB88DD27339E75E5E384EBA68A71FE2E52EC7AB0C15CFE33BBAFC892DB62D84ED070E7459AB99D24C1254EEECC035874BF19A64EFC8EDC9D369C11F5DF4DC83AB5FBC + +z: 4CC1CA6B662A4CE499EBE66D933CEAE58EE244CBDCAAE3C1F45A0D6947802B76 +d: F788F3E21D62E74090582F310BD4FDC8065E56E8D946142B9B9CF8F338F330E8 +ek: 26160EB381AE1A868F10FA05934958B39790C5858085A82036224D2455823F11A3A5C537DB483A3AA7725ACA567CAC610B4618E3CC0381701FB60917F5DA63CF712618535210D102238A5768F876A17C4437AB8789662F426C5CE69258C3462D70636CD556AD9EF0A2CD9C1DC3C546A0B396CBE2C94BB24C40756815F796AEE7045B6082DCC49EA56849C639419871C480185E51E4AECFA1945DA10B43C366916531ABA8A01502881B76C6E6984F7EA6058DE460C1E3511A06631670B35ED6A8D5D7BC6589A62DE377BAD1582C085A3DB3BC47F176A27604035B9ED13853758A77AA1391E881214894013F1BAB687A699DF18B373A64073BCCBEE469E1C867D221C4675791F40102E1E2B12593152C87A47A9367833854EF5427DE49043308586673274DEA8C2AC8AC5EF5886D06205284831170BC6B9C0844248DF1CB40C5B627A29421AE900EF5F5666720304520ABD826AEC0476E0D32213D550D55442E863B0FB8ECB85A1CBDA002792F6C199838613780BA4CB22605B30372304F88897EEDFA09B6B0C4B4892C0A05746DB80F602C016230129C2B0C83351413D4C2197B92E608485301BFA2EBA2BC5C2E1EFB42109B0119F079560A87F01BC6CFF916E81A1AA4F520C0687C41C91A3BB5C4C1D712449C6E927C0490B2AB4B9422BF5655E332C4A1D1626E587F085A631C250C122537F5B213A0C231DC48CA7B88A4C21706FE701645F43A8A00CFA0F0A13900B3FB5C1B886C66F22520FD685AD0CC396991B0ECE81635BC27AD2813FC377E7A542D9A9602E22775CA34CE85B834ED755048286B82692E3F9AA15E89A8D8568FA2AC47AA32C748582B7889B447C079F404329FE03066E8A46412820EDC8B8878840DE54C80CC2851E08374A89FE8F7417CF90638726ECA61072C893CAF8C501D04CFD2F3BFFC094503234693C530A732324C0516E412137E2B39AFF1292B925205C972F1B6805E67A292B069E8CA73FFFB1DD2B1A5FB2057ABB67ED396494D123D05A579C23263B47ACEAC5862982B20E6BC5E32E03BCA175CDD8996044AA9D90B3A0488500DB340C06CC9B84749B4497AB6A3CDF05B58FD5850CFD911B5C58819D2444CB9386B18784762B16DF6BFBCE86BEDC9CA6EDC191171C88C5060648B419109C5BDDA9A7E98C48B1649B342B7ECA411959A9D62E5C0BEFC5B62F4BB6EE608CA18B43AF78784B8C7384ABC77426B5CD28EE70B93F808317230A686900C83512E2A83CD10749C3E5B7EE6826C1E01CC5FB27FC47B52DA462AE5EB65390A1A33CC9749941D530210AD070AB71487C2176B17621ADB11CFA1F3AA9C379C9FB0CDF00186608246C56584DB61AAA8C157A28B6161F23EDEB7365928C1EA8C962785C338E66FF1897B56154475E17F81C9845C4607E5294E21EA23EE0CC47E4BB9D3539D46D410A3149E098B539B196A2C90C06D5C103AAB08E1110D3F565AA8CC7E4F2167E6969BEDD5C3CC8A6F68F53E18931F8EF0723FE33A2789661C248B15A35ABD5919343AADC93BC6777539E952A3F49A3E34F51291709F6DBCBDCB65B4760B8795B7985DF8249EEA132A473CAB736E72D45A2A100FB560B70E600EB24AA596879F1B1A9DB705AAA489791A503E9463C19EDAA4ADAAADB77A6FB0BABE16973E63333F03B444C85C980D55727532765397B84870BB759469CEA72E28A75BBA8A5098B6A95750ADAB54361C802ADEA678FB6733D3766F7C50BAFC081A384A768E60AA2E6648ED81612778033C6038E7863887F19C1509518E61ABCFF77F1ED9459D10C53C0CC6AD60C95704138B9C579317714F393AE8287909ABAB7FA167B8B237CA52056A199D7558AD5F16821DD364B11B9307421D362BA42AA3002AD2025E347BCD7223EE4BA62C354C1CE9822C8C4B3B70A1708462453292C73ABB177949EA3106FE3075CBA15E2E143DD13A6600E55D801A440004621F6ACDC3CB8D53236FCCDC15B9F9CD321398AA230DA6722DDACBB98106367B3723FEE198E1AA7161C004C9BA1840F19721AA7D99B99A7057B1B33A28F2033904750ED1899551C1C8A9132D86B3781264CAC231C3A21440580A92F4C683CA90BC1CA78CE41B332EEA7D2F461425C9B91FB6867B4270AB785329218D74356A3B8423A044C3C6653B09E60821A1CA6032A0BC526228F18B9E38B3A7B69EA6C1C5C0C39DE56DA9763517FA3F65CEBED43C7B61282772DBC9 +dk: A0CBC9A9EB303971AE19D11CB1023CAE83B0578A8BADF6BBCFB444000041941120984930702ABE4D0442E79921D92CCD08364112D41433013110D74ADF2B53A8164582F56E2DF03FC1D283424A16603CCA86C8BB3211030574553A221A4236817DAB9935899201465FCED39A2E0845DDF09F2B346FD3FBB2B6EB72C7C6CB8EA1784A010AC17A79041408A1B7853BDA03161A478D48AC4D19C32F728C36D2CAC5C4784449A0BB5C02C4E506EDF7A7A1A8548F931FF36014A8AA651527A4AFF04AB5E52A29058DA78388192BA72D17A9F3428E784999C9F59ADC561CA971021C7C9DB552926D572F44F9B2B014ACA32A267EFBCB62D1962F48B6D867C12FA25723736088E80CD3024A2610C727CA96AA8C495A8688DD4C5F804C308D4A1693E6B2C676B3B44C127A4911F8522308E20EB5E816A8949D93303BBBA150744511A9C23259F663AB3444AE787FF766A3D76859637588C21634F7338FE98596911A92E1692E75D66CF37AAD1C02720DD47315B1AD9DA95AEDF383D6863D7F06214E626B3299A5EEA648CAC40067C5C271A81A8328C7612858BE4C736ABC35E3F982CD84C596685A3F974D61F450D130C1159993BADC5AEF7B71F9E1503BF2525FD2B191E95E35A852D65082928C47DD989646FC5FA9E92292EBB03FA4B52473B57FF59E52ACC2311844C59104F51147CB600D0DFB42205A225DB32CE6843557F61E3199BE1E8A237AEB1240B51113233C92E453FED3138501327948A68373457AD6271ABBB6CCF860DA15241F89C27D5074B6A7170407B3024708FB3689318AC024E0CCA2836D3D786737D298CA7559FDA75F38CC8CD3D4845A165E18EAA56547928B0875AF564F763C365839879AEB3962F520D37755A17983826843E55567CF2B45F2B59D716666528256651694FD4B5913D90A25637369779991E9246E6A59EE1437D7DBB62466A759301CD0F4CC551161C2662E0D0992DDF07CB4BC61EFAB0D4F81700C0694F971AF7CB0974367AA53A8A914770D03892B639746AF79179AB8405C08A5DF9525E5958D26C4543A82349A192A86D3529F660BFC49490B2147D9170FB5CB78FCB40863550E9AC42DD3215A2D86B3F3A4B0188A9F7F02949CA48A63DBA56224B436B2C22C085EF826AB521B0DBAA4A7ADE8355FA3C4BD708EA1AB68B1FA714D5841208BA9CF3611A9854F69A21E1B67C84903CC382B3663ECC2AA4B069A8639618536FB6B562CCA390C103645D9A06481666E92C1FDE91AD8291596286501B154C8E3AA6E0608E4CA6FB1512EBD25C9EB789E7765B342AABAC415B7B1E65FD38ACC880C61E1C01E96BB8FAC50972D536D49A20B46BAA303DAA481A39D68C71286495F248045B1B82020544B864C3E1951812D01169B4AB79510A284F058CFBC963431BA0FB7209BE995672A264DA3A6EF592EB121093D9B09F35A94BAF125C4F61508B1C339C6B58C5BA65A207571191253C3512503C400C70BEDD9859E363A7A1193CBB2C222782B77B62CDDD09F67BA9F4D632930E73E08F37F24279965C74BB402439E0A8289A43630983BAC924D0261BA07335B3F734428F538B2803DD47B26B2D5183533807CC43B67E79680E6C5E60709406B04548781CF497E8B890423F42186292FB8C988639C2F6DACC513014B91EA2D54393CFF768ACC42504DA84F21A21D372A2C7935334654856BD66C77423F10501CBCD39907EB7478FC0D7D0439C9739B43A363E324B319B219BD25BC1153AABA81B0F6A84B1D5A8C92885EBAC488099BCF47E91C8E4AA8EFACC0748B25B2969EDE004B4BDC3278B139C2445CDCA181FF8A3FD20777DA97CA9D182AC494336D424D87B53402596A0BA339611B5EF459B87C0163744007B008467387B44A680F3D916C8AD9352D7B6643509225874A05E03D2B0297739592AAA37772472162393CE7238482B51E8B6297E665CD9FEAC4B8664BA62CAB68FA25DA4459816922AD50AD06A347E40C4E5E55CF9A5CB738343DFE222FE46349E68A6526B1B1AA8CB5549BAEE622C2DB3C8806AB22F3C92449A67D3C7C5AF7A9C970839AA386A6D5518E00D8B11F42002F52C873DB6A4DB50047F815EE15C3D017676857023C57A017E431CE8555CEBA2BF48950F89095C2D278A1330D9F9416BE6442EC49A21C79BCFCF832677A4CEC8ACE26160EB381AE1A868F10FA05934958B39790C5858085A82036224D2455823F11A3A5C537DB483A3AA7725ACA567CAC610B4618E3CC0381701FB60917F5DA63CF712618535210D102238A5768F876A17C4437AB8789662F426C5CE69258C3462D70636CD556AD9EF0A2CD9C1DC3C546A0B396CBE2C94BB24C40756815F796AEE7045B6082DCC49EA56849C639419871C480185E51E4AECFA1945DA10B43C366916531ABA8A01502881B76C6E6984F7EA6058DE460C1E3511A06631670B35ED6A8D5D7BC6589A62DE377BAD1582C085A3DB3BC47F176A27604035B9ED13853758A77AA1391E881214894013F1BAB687A699DF18B373A64073BCCBEE469E1C867D221C4675791F40102E1E2B12593152C87A47A9367833854EF5427DE49043308586673274DEA8C2AC8AC5EF5886D06205284831170BC6B9C0844248DF1CB40C5B627A29421AE900EF5F5666720304520ABD826AEC0476E0D32213D550D55442E863B0FB8ECB85A1CBDA002792F6C199838613780BA4CB22605B30372304F88897EEDFA09B6B0C4B4892C0A05746DB80F602C016230129C2B0C83351413D4C2197B92E608485301BFA2EBA2BC5C2E1EFB42109B0119F079560A87F01BC6CFF916E81A1AA4F520C0687C41C91A3BB5C4C1D712449C6E927C0490B2AB4B9422BF5655E332C4A1D1626E587F085A631C250C122537F5B213A0C231DC48CA7B88A4C21706FE701645F43A8A00CFA0F0A13900B3FB5C1B886C66F22520FD685AD0CC396991B0ECE81635BC27AD2813FC377E7A542D9A9602E22775CA34CE85B834ED755048286B82692E3F9AA15E89A8D8568FA2AC47AA32C748582B7889B447C079F404329FE03066E8A46412820EDC8B8878840DE54C80CC2851E08374A89FE8F7417CF90638726ECA61072C893CAF8C501D04CFD2F3BFFC094503234693C530A732324C0516E412137E2B39AFF1292B925205C972F1B6805E67A292B069E8CA73FFFB1DD2B1A5FB2057ABB67ED396494D123D05A579C23263B47ACEAC5862982B20E6BC5E32E03BCA175CDD8996044AA9D90B3A0488500DB340C06CC9B84749B4497AB6A3CDF05B58FD5850CFD911B5C58819D2444CB9386B18784762B16DF6BFBCE86BEDC9CA6EDC191171C88C5060648B419109C5BDDA9A7E98C48B1649B342B7ECA411959A9D62E5C0BEFC5B62F4BB6EE608CA18B43AF78784B8C7384ABC77426B5CD28EE70B93F808317230A686900C83512E2A83CD10749C3E5B7EE6826C1E01CC5FB27FC47B52DA462AE5EB65390A1A33CC9749941D530210AD070AB71487C2176B17621ADB11CFA1F3AA9C379C9FB0CDF00186608246C56584DB61AAA8C157A28B6161F23EDEB7365928C1EA8C962785C338E66FF1897B56154475E17F81C9845C4607E5294E21EA23EE0CC47E4BB9D3539D46D410A3149E098B539B196A2C90C06D5C103AAB08E1110D3F565AA8CC7E4F2167E6969BEDD5C3CC8A6F68F53E18931F8EF0723FE33A2789661C248B15A35ABD5919343AADC93BC6777539E952A3F49A3E34F51291709F6DBCBDCB65B4760B8795B7985DF8249EEA132A473CAB736E72D45A2A100FB560B70E600EB24AA596879F1B1A9DB705AAA489791A503E9463C19EDAA4ADAAADB77A6FB0BABE16973E63333F03B444C85C980D55727532765397B84870BB759469CEA72E28A75BBA8A5098B6A95750ADAB54361C802ADEA678FB6733D3766F7C50BAFC081A384A768E60AA2E6648ED81612778033C6038E7863887F19C1509518E61ABCFF77F1ED9459D10C53C0CC6AD60C95704138B9C579317714F393AE8287909ABAB7FA167B8B237CA52056A199D7558AD5F16821DD364B11B9307421D362BA42AA3002AD2025E347BCD7223EE4BA62C354C1CE9822C8C4B3B70A1708462453292C73ABB177949EA3106FE3075CBA15E2E143DD13A6600E55D801A440004621F6ACDC3CB8D53236FCCDC15B9F9CD321398AA230DA6722DDACBB98106367B3723FEE198E1AA7161C004C9BA1840F19721AA7D99B99A7057B1B33A28F2033904750ED1899551C1C8A9132D86B3781264CAC231C3A21440580A92F4C683CA90BC1CA78CE41B332EEA7D2F461425C9B91FB6867B4270AB785329218D74356A3B8423A044C3C6653B09E60821A1CA6032A0BC526228F18B9E38B3A7B69EA6C1C5C0C39DE56DA9763517FA3F65CEBED43C7B61282772DBC9C49E09D937D24CFD29FF7B285F7B478AE4E219BBBD89A54C8B127CB0C65803144CC1CA6B662A4CE499EBE66D933CEAE58EE244CBDCAAE3C1F45A0D6947802B76 + +z: D16CC70224474A4D71E1F950C2D5CA72D8F08AF80E0C7F6E292C265A50CC30E8 +d: A72608DF0F025B4FEE7D94BAE77BE94CB974F20DD55006A70FD39F3397A8EF90 +ek: 44AC5FB94668AD165BC9B4B09C50148831B0BFC0563D97B66913AB32846C9206BD2BEA024FB44B6DF239A8A82AD42C5BB69A77A3195AB8A7BD5C3131C9079D05E248D84167B6F569C812CDB1212F0584AEF9C0251FFA0E23A407BD592C7829C5D2A673DF01696AF02DD2A07A9342157EE608A2A91241DBB3F8725CD5D8BDA020C9107747F82A0FC7A97AC30272B694257B135095B27481CC769BB0834586CF70CAA72C2696B105A4B6440FB4D045B61A3D0BDA48490B22CE215C985B313F7C74155015A7D079DE9A2EF4DAB3ADD1A1CB684CA377B428B90D2BBB0980249586056434E2088EE250D065951EF228362B1D8028BC793CC8DCB8805D86C5DA71B4C1396158C79711DCC2F56359D197ABDB890387FA795ED9288FD08851CC620D0357A3450B4C50CF61EABA54A44FD61203F557946027B36224148EB4AEEE709401296BE0B617604B6A48244938279D66CAC75F03809ED49421F518A3270F42273E37793D6162B626771D69C8A27AF27AD0A3B89B6C756068565FB65D245A88D180741A1AA507E116DC504C11358C7EB444180792D210438F96CCB3DC17D8E8B8E79918A106787509B8B570B093C325B8CB81A12A686CACADA32389B8207108E7AEF5447217843932559F1893B250DB8060D068D6D2B06999C36F412D47519C795A7284E3CDD42CA6304C348AAA96E72B8C64C37C92C34F78C56A58B32630812A95F53FFE4B3987B5146E0321AC254573933D03E7356628727F448CF3D9A328C1CA72B59B73AC3F0A3671FF58A604AA5FA7F63ED7C72965A833B5916266796757186784882CE8670CE4F717F057A1C08563B9832B89A759F2380C74821379B343E7E28BEAE6334CDB896587C2585508A78947A54B08055C3C6CAC9357102CDAE58748A337D511BD0BE93C88964720C3AB5367478A4BB82FC148539C1D54F54CD7B1605C113D4E526BEDC4CD8526892198336F344B1A59A83F3ABC890C9AC386954A6B521FC76FFC03B614C32E7F68868400142BD041347614A80A7A59F2511A28B1E6F74053842C8F0A49FA17C378FC0992E14282E394034081AA4164C2E9934E5C8246E334AC606B9BA723237144AB2AAA8E86B2ED33B6750CA239F82C9105CEC46888BD59B2AE6331F47501C01805BF867A63F1B211306009C7B60FE4AB7EC5982B1955059A5D69BB728FAB31681CB0418C033B676158501FD3011A3B6B44503378C2FA1C6EC254861532DCC16F78D743DD065C8F8781F798633B0CAE5172173AE78A02DA472C0BB4DDCB2EC88B70E69C24FF277837646802774C98D87ED20382E4A82C0EB905CCAAA977295AA085A26717578E04B27139B98D260155C0B6189A3A6AA77D0CA76B6409032D3868967C1A5B5AB747B2B1660715F15161E00C383B957062509C495C5B25C26B2EA26B3A74597B913D295728B33A9EC914A2E646ADF0968E07592E48BA1BF0817995B321F05A7DD8FA892A385ED4C052B0CAB7C84945FABA63F2099BBD960843F4ADB512A48991A38439B71D291512333483E8A511FB925A7A770E033EFE6A933F105DF2B5555BE5179F3B8DD8F216B0EC87AD297B5AE941BBD80BFB0A417824A420489CC9281DD1D545BF15C8459627C4E8684D018473EACB1C49C27564614417A9EF6984D708B1FDC03F08453A769C470156884DCC30C18A1970022B01CA2DD0928F50404A9B19CA41FC8C325323EAE97C484015289A5383B5A46DA19641A99DB8763B8E716DF656204616B07BA5C06EF11ABD428D9EC989D848A8CAF65B4CAA41A4F741A497A08EBC2FF8525149FB029FE867939255AB836DB23C87BE120559A99B64F4BE533C6F914149C45A221BE8A3F9C724FC9BB5782C9489346ACCF5CC69A94734C2AB332A272BF135E507163BB3019D9544151A56C1892706F86D40439BF311AC4A477BE17287F829015CCA7A2F416AA178493E9CC86E607C2266924256377E3171B1610F6CBC4654DB870E2A1A2F11774F6147810A44523036EEC6211410091AF54EC71ACC0212BB96CB3CADE37C55A67A3DDBB12FCB6E6DC758EB8B807F75CFB4E4AED460A67C9546C9D668E8F1A560A80D20707AA6A0CE9433BD8D283BCC743FCC9C9D23719C1A05A874339C80F079A5364842AC0F21F804B9BB5D6FF4387D19442C4BAD15A31FB9F5C9A5A0CF4C59A16FA309A69AAAC01C9F1F8817AC8B7DC0153478452C0A379D65A78BB3307E3CA4 +dk: 275C73EE58A9FFD22DD3EB2B1590CD79407D35E950370892C6B2AAB97392D8200DA10AB7188B9909B191D32073926860F5F5A4D2C21C52F4AF2EF5066BF182A7156D0400319CB462CEA5A2C65126943158823B085B6118449401D5C17A67D9A0CE2C5FEEF515787A423C7446EE795C14B61D33AC8BD06A3D8CA5A78AE5A4BCAB1E5BAA336A4B8DF423A9072A511A98993DF205971C70D84CADF5ABAF5917741B34AE09D280375819059618D748AC48CB425EC54F7A7435C40442FD594EB1C081AE4A80F9D023FDC968968A482BE95A9CD03041CB8B8F3918A5B7957E5CA6C95053A55CB7DA014B15425C6637000C131A664318834C09DE92BC04172209D945C97AAB3240A93559569D03793560AD9C552FBC467516556E4A07A1DCF2A2D2C5332E5074128207E4E4491A8866D760791A18CBC7939835F02DDEC71964428D80AC730FCBB0F0C206434746F75C2A4D95CFD4C398507729845C257D17549AA2983290558453445C3CA35B6BB139B007B003A890996ABF463D5E12CF3DF0728B8259A7854F6A06999C92868AC16C9BB78F571972AA122975C25A68C31B73710DD2EC07C2103BDBFC1A67E7370444CD2394913218816AEA4E1043BF53B83377D4775BAC602871C79A28AD930316FA091E5678582A552B6A5CBEBE25CB6F9C9002469E29F1833FB049D2CA7040499170F4B6BE2915E7C10081DB012DC8B9A8AA2F1FA6A6D3FABFD49B7873C234A21B0C9B572401F80908D7370C4A5BB1D04CF9218CCC5C8BEE0660CB2ABC39501E3F2AA441168B6BC9435A9599EC571D39A35B49FBA16DDC4A3C88828D4B89390B77006026E85A46335354B2B422DE7AAEF60087E2F975A7453FDD6C56B75181F317969F95B7A024A1AE12B66FDBBF27186BB0C0896DE69C5DA5AE4CB638E43A8FA8C283B92687DA372AEF4569826803613824A5DC288E94345209A4D2B42DCF2A251917735636669C3AC06E72A835042504CB6A83026CA4B1A10DB29F9C229575599295881A7358C5949469ACC8B43AC80B4D0CAAB50846CC999B42E0299159049DD370A9B52878AC4B64547E3EC070B4D370B19924D90C6EF153232CF12E64D0BD04E124C55CB2B8D1376A46CE2B91A225985F7BD72D3B316767B3BD3206C5C8B311122300225A02F0E53664CB02B1350859D579A09710EAB927C5207256AC1128C6B0E09C7BBA408A2DC34C1160A8B13766BAC2A747A6BF20B1A6A22992451BA49CB5B97F7597F98B95E44B9B598AA993073ADBD6A9B5C81E10E21AAEA573A95A6716A3298412BE1D661746BB81C2F17744D587E3522143091FA215AC2D9B7C3C00397A1C3807F24AB4E968B0EA1A0E5A6601B7274469CD1A52AE5FAB7BAAB3C4A6D1A5D27A873E21A14DF52AE2C344BFE21B0F8A71A0511828E86F1FB08141C30C842538C61C7ADEB9251E33C73CEA9E7C02CF46E3C3E548355643000D3B715F339DE10745141B8D2A201A4D8C514185A6DC06375E35750E246D4CF1C8937955631CC7350CBC4C34C22B35C4336B95A12478419B8309E0137317B6CCDBAF70630BFD711783087967A93E1F95321EC319CA31004CF677D44359465564A889193FE04A7F8944EF30B5C0B43903279F07E2C04D116BE8322E9FAA4FA2562025910A264A814EA488D72CC03EB5853B40A406E1A7631933EC725D4E71516C751C3C0A3560BC0AD97078ACE63E9FC41A0F2B92B6E46A0836A39AE9B67C6B6F23A2A098987F3B6500ED179C6F14A0E0564166C5CF5C322A1E5654F8E083CD5B13ECD761B727020CDB5EAC5B9DF509AC0D9BCFD2A2976E586F90FC3949AAC845440FB929B9D5743723926FB2E6290EF3ABE663565AF1CC74587CDCB3034F7692D9488142231BE8651C5280A52EF048FD4C1C776210A39463CA0127A2F9065D6AB320E253A1A0C596E8797887844D8471A32795E6DA8D5774648AF25194C3AC8447C534B61C77F364D3136FB358861B05465AB09077912F536500F35002DF56015441A341E30D6458289F47B578B1BFE4C574228B0D16890108BA7D4DBC7EA8C9A5118AA6F6E48ED8E19B19F6629114551442CAB1E88541F09E85B79E123C912C967CBD4C273C47485EF552ACF2744AF83D72007137342D33A00F41EC9E0FE8AF0B641AC0F3BE42984D4D9C2E4D9393AB9992E78913A7DC3444AC5FB94668AD165BC9B4B09C50148831B0BFC0563D97B66913AB32846C9206BD2BEA024FB44B6DF239A8A82AD42C5BB69A77A3195AB8A7BD5C3131C9079D05E248D84167B6F569C812CDB1212F0584AEF9C0251FFA0E23A407BD592C7829C5D2A673DF01696AF02DD2A07A9342157EE608A2A91241DBB3F8725CD5D8BDA020C9107747F82A0FC7A97AC30272B694257B135095B27481CC769BB0834586CF70CAA72C2696B105A4B6440FB4D045B61A3D0BDA48490B22CE215C985B313F7C74155015A7D079DE9A2EF4DAB3ADD1A1CB684CA377B428B90D2BBB0980249586056434E2088EE250D065951EF228362B1D8028BC793CC8DCB8805D86C5DA71B4C1396158C79711DCC2F56359D197ABDB890387FA795ED9288FD08851CC620D0357A3450B4C50CF61EABA54A44FD61203F557946027B36224148EB4AEEE709401296BE0B617604B6A48244938279D66CAC75F03809ED49421F518A3270F42273E37793D6162B626771D69C8A27AF27AD0A3B89B6C756068565FB65D245A88D180741A1AA507E116DC504C11358C7EB444180792D210438F96CCB3DC17D8E8B8E79918A106787509B8B570B093C325B8CB81A12A686CACADA32389B8207108E7AEF5447217843932559F1893B250DB8060D068D6D2B06999C36F412D47519C795A7284E3CDD42CA6304C348AAA96E72B8C64C37C92C34F78C56A58B32630812A95F53FFE4B3987B5146E0321AC254573933D03E7356628727F448CF3D9A328C1CA72B59B73AC3F0A3671FF58A604AA5FA7F63ED7C72965A833B5916266796757186784882CE8670CE4F717F057A1C08563B9832B89A759F2380C74821379B343E7E28BEAE6334CDB896587C2585508A78947A54B08055C3C6CAC9357102CDAE58748A337D511BD0BE93C88964720C3AB5367478A4BB82FC148539C1D54F54CD7B1605C113D4E526BEDC4CD8526892198336F344B1A59A83F3ABC890C9AC386954A6B521FC76FFC03B614C32E7F68868400142BD041347614A80A7A59F2511A28B1E6F74053842C8F0A49FA17C378FC0992E14282E394034081AA4164C2E9934E5C8246E334AC606B9BA723237144AB2AAA8E86B2ED33B6750CA239F82C9105CEC46888BD59B2AE6331F47501C01805BF867A63F1B211306009C7B60FE4AB7EC5982B1955059A5D69BB728FAB31681CB0418C033B676158501FD3011A3B6B44503378C2FA1C6EC254861532DCC16F78D743DD065C8F8781F798633B0CAE5172173AE78A02DA472C0BB4DDCB2EC88B70E69C24FF277837646802774C98D87ED20382E4A82C0EB905CCAAA977295AA085A26717578E04B27139B98D260155C0B6189A3A6AA77D0CA76B6409032D3868967C1A5B5AB747B2B1660715F15161E00C383B957062509C495C5B25C26B2EA26B3A74597B913D295728B33A9EC914A2E646ADF0968E07592E48BA1BF0817995B321F05A7DD8FA892A385ED4C052B0CAB7C84945FABA63F2099BBD960843F4ADB512A48991A38439B71D291512333483E8A511FB925A7A770E033EFE6A933F105DF2B5555BE5179F3B8DD8F216B0EC87AD297B5AE941BBD80BFB0A417824A420489CC9281DD1D545BF15C8459627C4E8684D018473EACB1C49C27564614417A9EF6984D708B1FDC03F08453A769C470156884DCC30C18A1970022B01CA2DD0928F50404A9B19CA41FC8C325323EAE97C484015289A5383B5A46DA19641A99DB8763B8E716DF656204616B07BA5C06EF11ABD428D9EC989D848A8CAF65B4CAA41A4F741A497A08EBC2FF8525149FB029FE867939255AB836DB23C87BE120559A99B64F4BE533C6F914149C45A221BE8A3F9C724FC9BB5782C9489346ACCF5CC69A94734C2AB332A272BF135E507163BB3019D9544151A56C1892706F86D40439BF311AC4A477BE17287F829015CCA7A2F416AA178493E9CC86E607C2266924256377E3171B1610F6CBC4654DB870E2A1A2F11774F6147810A44523036EEC6211410091AF54EC71ACC0212BB96CB3CADE37C55A67A3DDBB12FCB6E6DC758EB8B807F75CFB4E4AED460A67C9546C9D668E8F1A560A80D20707AA6A0CE9433BD8D283BCC743FCC9C9D23719C1A05A874339C80F079A5364842AC0F21F804B9BB5D6FF4387D19442C4BAD15A31FB9F5C9A5A0CF4C59A16FA309A69AAAC01C9F1F8817AC8B7DC0153478452C0A379D65A78BB3307E3CA4D4F2CEEBE65173867CDDEC350D15A72CF1FEE868A9B819DD1DEB4E7478C00DECD16CC70224474A4D71E1F950C2D5CA72D8F08AF80E0C7F6E292C265A50CC30E8 + diff --git a/regress/lib/libcrypto/mlkem/mlkem768_decap_tests.txt b/regress/lib/libcrypto/mlkem/mlkem768_decap_tests.txt new file mode 100644 index 000000000..fd46649bb --- /dev/null +++ b/regress/lib/libcrypto/mlkem/mlkem768_decap_tests.txt @@ -0,0 +1,1829 @@ +# Official test vector 0, seed: "061550234d158c5ec95595fe04ef7a25767f2e24cc2bc479d09d86dc9abcfde7056a8c266f9ef97ed08541dbd2e1ffa1" +private_key: da0ac7b660404e613aa1f980380cb36dba18d23256c7267a00a67ba6c2a2b14c414239662f68bd446c8efdf36656a0891a3cc623fc68b6572f7b29a6de128014411ee41906d08071f94856e36a832b40338d743516659bd25879c007a52bc9586f79876afac6c9a30d8fac243bd22425d6adce42ab7ed39014757a958bc8a74565f019234ff04b34893ed6d05501c37255239aae2ac19f8c75ac5900dae8300dbba710dc2caae1bca3a38c58342b286b8518f136ad15b9f7bcbb06a5607db375dbe976457c26c6598257531b2cfb6ee7f51591840804c38388376c27148413da9e92920bfd9a069e018bd272053da8775c0b739f761db2107cf35a434d69b07e5bcdb87434138b0cb556761ba522a5747b28747d80eb9d6cc673bee5769377b996d36ceb0c0c7ed9a658533324869c18a1a36f31470f14c5ae49ab070507f8249ce404b49c0a8c3ee42fea9631fa1a0d10d86b93f986e0e3a82e703b74e5ae6101242421a89aa07fe68588460baa368786486a72e4f24d2dd76cfc03b694a5ba91a755a0b98f3bf93307c0ab64639aea7a6498a3c3ddc571141abca4678cd2e2b857fb88f600caa596b44bc422250b2819e0515f0472391853700b01eff9453fd11876b7c759a07dd845caba4555264a82765193fdf81b620a1e1f923fb24442cd1cbe94175003ec06ce77a3c64493c199987a300c95c53c0089b5d65c92ea971b2ffa93b52a461ea2ac8c199c2f4c2b704297ce3c3949e0735ea8a14aa59e8dec0c878399ff70747ab244ce46b5f2230473323d25c66fe6b419b1f4a112e5214035256bc43ffd2b6b7b378769a6b47000bfb6357d45814baef3857d379e2fb8b5e5201ab26274bb1b70ad322cd0439b2db109cff0a2f8e600995571ffc38c590bc4c7615c69d0c98ef430f30861a77238ffc07061e475d6a30ad1b47fd039c3a447762db2211dc31d0acacfd55890a5824798f9aead7413dfe028b1012be8b6ca1026666ac6bc9440a449b51ad8bba7b0921dd4d8b4a578136d1a05db38cc858437b25161d1c3c28ee07bbcf2b249110d22781dc3050d8cc0090096b38a850696f86e9e6bab325271b2248675011968502881090497fac0af843c1aea76dd81cf29c012c66227b7f06d9961309b0262f732c9a4d0bbd06727abb8371ff2c11899a098375c460516b2cc88bcf628ede37d8f3b3342e4490a85606ec03da29b0256275382a3313dc041114801032c519f350c3e6abac3e33b93b4a19f7c5466e58cb1dc14b4a96c475729f971bdf173cdf354824d019427f95b3b4a4a4a958e476a6e6991ce6f06cb5dfca7d4380c3d920b5711ac1fcbaf4b9ac800b976d1ec766a626cc1900b66b3a9dc62c5c144527a296baf70433bf657c0437f87597bd7c8bbbe9abc37050931a4a86982a2028a74454c9b810c88d1701c8cc98a1d4ca107a6b25e962fe4b6b03c95453260b807228637cc9eb12acc0954959a52ae54d1977300aba0ba2c14609bb28c11d5fac5cac88297603283e867a3648366c724d9354cd7a196dbd9802f7b88d3fa001f9c9773225462235e91352a20791fd8b87fe3377ec6a3940b1130a0bb04e7410a34e2580d071d6c56202086787a6590f84393a8e651a1e685f22478a8954f007bc7711b930772c78f092e82878e3e937f367967532913a8d53dfdf4bfb1f8846746596705cf345142b972a3f16325c40c2952a37b25897e5ef35fbaeb73a4acbeb6a0b89942ceb195531cfc0a07993954483e6cbc87c06aa74ff0cac5207e535b260aa98d1198c07da605c4d11020f6c9f7bb68bb3456c73a01b710bc99d17739a51716aa01660c8b628b2f5602ba65f07ea993336e896e83f2c5731bbf03460c5b6c8afecb748ee391e98934a2c57d4d069f50d88b30d6966f38c37bc649b82634ce7722645ccd625063364646d6d699db57b45eb67465e16de4d406a818b9eae1ca916a2594489708a43cea88b02a4c03d09b44815c97101caf5048bbcb247ae2366cdc254ba22129f45b3b0eb399ca91a303402830ec01db7b2ca480cf350409b216094b7b0c3ae33ce10a9124e89651ab901ea253c8415bd7825f02bb229369af972028f22875ea55af16d3bc69f70c2ee8b75f28b47dd391f989ade314729c331fa04c1917b278c3eb602868512821adc825c64577ce1e63b1d9644a612948a3483c7f1b9a258000e30196944a403627609c76c7ea6b5de01764d24379117b9ea29848dc555c454bceae1ba5cc72c74ab96b9c91b910d26b88b25639d4778ae26c7c6151a19c6cd7938454372465e4c5ec29245acb3db5379de3dabfa629a7c04a8353a8530c95acb732bb4bb81932bb2ca7a848cd366801444abe23c83b366a87d6a3cf360924c002bae90af65c48060b3752f2badf1ab2722072554a5059753594e6a702761fc97684c8c4a7540a6b07fbc9de87c974aa8809d928c7f4cbbf8045aea5bc667825fd05a521f1a4bf539210c7113bc37b3e58b0cbfc53c841cbb0371de2e511b989cb7c70c023366d78f9c37ef047f8720be1c759a8d96b93f65a94114ffaf60d9a81795e995c71152a4691a5a602a9e1f3599e37c768c7bc108994c0669f3adc957d46b4b6256968e290d7892ea85464ee7a750f39c5e3152c2dfc56d8b0c924ba8a959a68096547f66423c838982a5794b9e1533771331a9a656c28828beb9126a60e95e8c5d906832c7710705576b1fb9507269ddaf8c95ce9719b2ca8dd112be10bcc9f4a37bd1b1eeeb33ecda76ae9f69a5d4b2923a86957671d619335be1c4c2c77ce87c41f98a8cc466460fa300aaf5b301f0a1d09c88e65da4d8ee64f68c02189bbb3584baff716c85db654048a004333489393a07427cd3e217e6a345f6c2c2b13c27b337271c0b27b2dbaa00d237600b5b594e8cf2dd625ea76cf0ed899122c9796b4b0187004258049a477cd11d68c49b9a0e7b00bce8cac7864cbb375140084744c93062694ca795c4f40e7acc9c5a1884072d8c38dafb501ee4184dd5a819ec24ec1651261f962b17a7215aa4a748c15836c389137678204838d7195a85b4f98a1b574c4cd7909cd1f833effd1485543229d3748d9b5cd6c17b9b3b84aef8bce13e683733659c79542d615782a71cdeee792bab51bdc4bbfe8308e663144ede8491830ad98b4634f64aba8b9c042272653920f380c1a17ca87ced7aac41c82888793181a6f76e197b7b90ef90943bb3844912911d8551e5466c5767ab0bc61a1a3f736162ec098a900b12dd8fabbfb3fe8cb1dc4e8315f2af0d32f0017ae136e19f028f57262661358cde8d3ebf990e5fd1d5b896c992ccfaadb5256b68bbf5943b1328626ed79d451140800e03b59b956f8210e556067407d13dc90fa9e8b872bfb8f +ciphertext: c8391085b8d3ea9794212541b2914f08964d33521d3f67ad66096ebfb1f706424b49558f755b5625bae236f2e0079601c766f7d960808f7e2bb0c7a5e066ed346de628f8c57eebabbb0c22d911548463693ef3ce52a53f7ff415f00e657ae1c5a48fa5ec6e4be5cf462daffc84d2f6d5ff55dc9bbe8bb0d725ec64fd4cd4bd8dba0a844e8b5ce4b6a28934d7f7a050991fe185b506b451dabfad52d52cb2114ca7d9a5cf986c8fdc1bc10ec0c1869e50c03c55a76192a1049aca636ba9020bdaa8d0f58c763b0b89845ca06d4c4ddc21433e16b9c62e44871fdbc05ba218af871fdd7dcfa464e60faa5265264ce1391bd9a8c5faa7626d5f159b9805b975710a3503a0b858a11c6a647cc0e19ac88b1be9056c95b4d2087d0951d1d2f4992491117e6347794ba54571ec49bba71af3413d38a30bf5872248d1f6d07c86baf782e73d2637f043d341a00921857d8b21ddf3e1d6310036ed27af49e5de1b900fe4de79808ff29f9570859612b15adc01fbb265b305b1e3a12ae419da5b74261fa284c101da3d8dca8b2e4521aca571ef44a058e844ff32b16d5aaea05f7f3af8e2ab16222e347662eddfb891d0ecc2a55c5638f9dde92d9a3d544a5f901ac501acd1ea6a010201fcb10ad702c425a94bdf5890d500a2a147eee1d1fcba8c3abe7c2dfe70f346f033d816a0b2791b4f0b2d956d9ee5971715399a5688302495e2e07c1c8c01527184bcd0c208bc159f2e13318c0bb3dd24a6a7fc849f83385ed4dba07fe1d7bd5640cc9ed5ccfdd68763cb0d0edf61b292177fc1d2d3c11dd0495056bcb12558aebcfddef9feb4aebc57afd9023c65cfe65a24e33f1b00111e92e63e011eaf0b212cf95743cd07f5189ece1f205b7f6fcb2e6b1961b5404cebe47c8cd13b8599d5b49e6d87eeda36e9b8fc4c00635896aa2b75896e336d1b612ee13db811e1f07e61748d920f4865f3f11741399dc6162c91ca168a02329dff821d58198712dd558abb099b3a0baf9da1b730b2aa73bcf58d74f357b06f7211c804b6c8af16ff3509fad1d35b14bfdced7db8a6a25c48e5956480724daa057cd660b67ee3e472574182679d485838a6476eac02141075c812af7967ba7c9185cc2abd2a4545b80f3d3104d58d654a57792dcfabbe9c0715e8de2ef81ef404c8168fd7a43efab3d448e686a088efd26a26159948926723d7eccc39e3c1b719cf8becb7be7e964f22cd8cb1b7e25e800ea97d60a64cc0bbd9cb407a3ab9f88f5e29169eeafd4e0322fde6590ae093ce8feeae98b622caa7556ff426c9e7a404ce69355830a7a67767a76c7d9a97b84bfcf50a02f75c235d2f9c671138049ffc7c8055926c03eb3fb87f9695185a42eca9a41655873d30a6b3bf428b246223484a8ff61ee3eeafff10e99c2c13a76284d063e56ab711a35a85b5383df81da23490f66e8ea3fcba067f5530c6541c2b8f74717c35023e7b9b3956c3ee2ff84ba03ccf4b4b5321b9240895481bc6d63c1693c1847852f8e97f50a133532ac3ee1e52d464 +result: pass +shared_secret: e7184a0975ee3470878d2d159ec83129c8aec253d4ee17b4810311d198cd0368 + +# Official test vector 1, seed: "d81c4d8d734fcbfbeade3d3f8a039faa2a2c9957e835ad55b22e75bf57bb556ac81adde6aeeb4a5a875c3bfcadfa958f" +private_key: a2b315a16cc2cba3500aca6746967dfb808d170c0583b1ad737b50ee3408fd1c793739845fc18297341662ca3630c11f7bf77710c414cc925a3c4734cdaab8f1f677b33694067b230acb79b30262f74b923afbb06ab880b75a609463b40d908115489f3942473dc8a555e2403b7c1dec411b9818b627457a583305301cc34c4cb1db2b12d6f10ceed4269fdc9a67402b89b71fb372a4ef593a17a56d329b10ae24c6b3e750704b0993cc64a71840399bce5d7b182b561c9cb2b914673b6a5337393c1d77d497f426cde194363b50683e1b2c8bd909621158fa8b0aa234a47ac702a95a96b37c9f2a233e69b9779ce793788a0c2ea25f9b5a9a8444afd6b62f5ad6860c8ab1267a0e57acaa53bb86c6428cd7139ba48954ec55bee3f83ac5a47ebd328f053182d395cb7576ca56a639b3663e92f79af13abc20b251fd903524f9a16cc32b631c83b1e7cf5e04800e193f1595c563870ea1fc996f3828b2abc626c59137511ff6f40122a25bc644b154267a0bc6c1067078c993b3d5d018f44c56363b9c5cc9b1ca6569cff876578b5e86703d30c20d733553550b1a8e669f2999b62720b6dbf1100ea550fe6c3973b6a396b50a03235142d75603240f78055f082b1d2f490dadb8b3a0cb0ebae99ab2179f2b38b274c51febfb57cc87291e34bbe5fcba818a3f2da4c3fc8950f51c1e806c5e6f4552f3e187d82a0cf92b7da3f26ae04b8c86f7a91b545670b409dde5863cc7b7e30b937b13accd1c68e808ae6827175bb8239904a88a15824bf6489d1044620844a6d92469a311942c21294ba5f26c18dd0a0e85fc85f241c2151815ef00b3bed322de98a7f7092df5a0a5d3d6b424b26b38e1931dab2402342bc12463aa96a0a1c42dbf73ba15278a22448a4fb6012c214def53b0fa233dbd096cfb2045a255c75a9931d7e3284f9b95f648071f00343ee580193627ff1981e982264e63940287860fa763663cacfb61350e7a4b53f7702432347f22596c678585e3cfbba07d782766c8399ac21b37a8b16a79e6a41ff606469947af07c226f79145174ba4ccb4bf226cd5cac54055b8a0815020135b94e6560ca89c7d837e737a73a0278f0e8b1b29806c19858b8337967d527d0dd6a25a5b0f2338b23ac6a4a0496ffa8672d17075cc9c3b20b24fdf9548567a85f707998a375bdd044038c09bb4fa1af3f08a37fb6b17ecc29c756ce9085edd76618b5c459bdc4e361199ada77bd1f91086f443dac6a9eca4ce9403b4c5cb1eb6d74ed2f79ce9ec032174748c64416b676d11fb28e8ccbe1fd3aed6d0c168e92e3f7096403a3fdbfb28505087c6db9f2e44233773b03e5166ae1669041212ccd58ee8580a2d6861a30b6814f6cb550a7d9314080413bef5c847c94174e590b765869d0c9c6002aa377bf77d7f068316050e62e72a7bd083403240c1088f84287849112a03ac8ddbe907ab574c4bcb356e9834d4fab5c28b200fe233a61599c14259464a24e3210a99c7c601a81d2ab07d65a9504bd68906285545241131100cd03b5dfb05b5b4ba29166c226ed4347c2ca99d327595f29cefbc8636161c4b755f87851675d5553308c70ef0a8fee3be05a27f53075ac7d1710ed3177c133793c140f6c47b7e53b96f72bb18447d277cc021c144a0f7a35e30b57386a78ac976376262320a5e7e1cb42e290de684462ce1067e920ee86c32418b130a5a41a0e8268cfa7e0db2b441cb927d7897c42b1d50f9b32868a35a2c04cfe91040e9a9208902f20c477e1b1ee5c290d2e5244eb1b4b7b4c6ad074533b58d9914a6aa8829f96789f5cb87607569983003f3a2461c33c81a3672af5924c4ba37e6827fccf86d8b4103fbe9c0f6226dd0a2145a6b7aec76b186466f9c67bf169039259574456497140c8cf4ac05091973ac8c08d809465785a677a032ac09ad1d666e8c48462813ce5ac75f184b38251c30e362b0e2501d6800c8ad103c8b773780b6717cf15c401139acd54b1598b2b7c79492a86631090268c70d875bc040cb2b75a386fa96b092b8cbc25c47f70aa76cd8b9afc12b42b536e27c5578831a96dbbab7138c3f247e955a6c08b4407d4708f1914bfa48af4b28533f747b860b7076c028e245c9727b42f3248fb0408b3ef0c4918ab76ab96daca81afb1211ab3a0329ba1a5b069a68934c1ce84c2f72839311257fa19e72c62fb5686b61416caf8b22d2b26a6dd01bb7387f88eb8606980a5e2259cbd56ca1ec051cfc66f96239991a2360d75dafa1534c8a05ab9c95e2e586853714600a3455511b62d94525d8b1a965ce69f986731888d1ecce536000e4863322a83e3c8475d9eba5414a65b0561d24a7b09dca6ffe23836058bec0a85671641008c831233c7890783dafe8c359a263e796869118c4e74002dc3b0ec5b1c4ac641bafe30eb2bb743713bfed2c1e79c4a6f46593006acb35f7031f194807b893aa7a9323162168d384d0e96f2f23368626a2e027891ac94f12f30a044b85f0322ce2b16517d36aa3f23b5f391be394b54ddc28e5a9775372869a7b50b4898c072c0669d43c641a3cb5e8c170ba63bed6ad1008615201305e292e1c818e1ef64f3e0c52fba67e7249c1ec4a140dc89ce0050647f1c19f5897c77b9059040b4b5b4282e0669cb4c658f48f67338413c92fc7412e444bc635dabc93c51b030784f21461dca210cc6a54fdc25bba09705baa77c1826636b16644a5ada51270d8317a787abf53192d40dc765bfb45c7dcae58481af3a49fe762b90bac1f6f69a5de8045981c67906b9f692625fcb6a4df2641688aba61fa49a84b47c96661e4701e5826c1108069c4b9c6e480251c4b021d11cfdaca12bbf9c09a0234186668e389454ac4046f5b2468aa2fa9b117868574e729574ee57ea7495af310627b85916d6b4c708374f9fb0c9c3aa4664c6651281d8eeb98132c1af13a816ca5b869f50b50b291efd466dea090918630c6fc77247c458aa82568a41dd9d4708af3bbca5a5716447e8c2c24ad788a8632473fdc4a257196bd2b549091176fe654d3694e10a118f7b66d1cd5af199b6e90b3bffa88a92e36717fd4bbfcc78b0e08634bc080c86885c92c8ef67aa4933c7df097891369bac5fc5d0c36737aa60971310adf02c257f76a7a7b3f7e132c2a71c52ff4affb6846391c0868241a3df13408d419a78bcffd49619b03a192c683900a244289c9f7b4564823900ceacffd9a9371260d5e57a8271196f4759eead0ceac318966e76f68de95ab9db2ba4fbf83c3b27092cd339cfe48d5ca0ba11591d04566f4ed24a57b00751eb9b1253231213f8a14f06f0fe1b7a4fdb7d1cfe44c161e577e5e8f0a003271531cf27285b8721ed5cb46853043b346a66cba6cf765f1b0eaa40bf672 +ciphertext: b3b339d73dfe8e3db262cdea792b4e3ecd712a75750a3b206800f11116637b58bc75ea61bd74070d7132309176608c33989fc510852c0f8d07e9862b79b069cfb3e5b78f277a74dcc832ada24f7d522e53a7cf16a7c7d952ed9f4dd4be4910d880e2e7c5b23c6cf9077e3d350ed3e7bb54ca7b39a9f68e98d2fc844c62f3eed092c8c008e4c2a28b3b1d9f34488655741ddcc440be7828ae39f25f52f57d8b1cfe3967af165e5affaddc8a85cd4939221762be2f71155c780ada5103976c77a76f838bc52a72544b22cfde6b6e843b4e552f1ba47419a8a8bf53c388537c1c08c272a02f4923d9edcc54dc767e6613c6f832889ec05ca805fc09e326d242517e91607005af03cd1acb242e630d6c20499dec187d8e5f6d421e2ceef7e3f74b751214fd58b6583bdc5ede65bbb643974d5cb45533f0a733a3353724e2d7e6821d99d317eec8781d3f1e03528fda480da8cd8e8adc51585a14acb5da154a68573b0566e5e49a53b4cb8061cdc795d13899032d549ac8f7c35099eb2ba0f0df4c9558444f4fe5f88bc46c6fca1b257c62d2116efd1c8cdef5717068405201c086da4143de277649f32538f537f8bf13a65c05747cd44f740736966422bd247f4be9a05acbcce53b9c1b0019096f93dfa86948d7b01d10952926b7a6e0e51792f9be6bab620b9fec660a2348818e4b47cd5934ffbcef5aaf20c3acf9494ae4df9d23f62a2571eca8d37fb1c8d29d5df0fa30c2f17fe3788032d124090dfbd000155ad8deca87190d66bcc9b1e3de392bacad79dc62be0d96eaf448feec5ef03544db3a782e5f9ffa20493d5ae6a58481d23cac7d3eaad57887bdd706eebf15f505d07e3592766710a658513598c94d2ff3eda5b5e900fcc9da8c012633c96a8b9e1da548dff60b1a763bb3f5ada6eea3290a01f7367f7c2384097ebee2960d904141b6c7bb30bf640350da34b9516d9f73100476e7bc077e0f88dfdeeaf9a2855448393cc26e14ac50b67065bb3694933bc64c622958a11637f9c995e17f15cfa663e7121c4ebd5fc1e153bea84c66843c90110e587462c623dc67ff0da5dadbade9b9724ff804227e188a00aa6c70bba00aaace8a035b96a595ee726fab666a08a4979ebd1e230a9c48afe7779cdd9f0d019e2400db9f686011ab05c4109db273c236646b481ac7251fd70d23188f943f6f282bf059279464645c9552de905996f2ef355a4d307448aed53728b490baf108a7d2579dc46e44334d1d99f310c8c953d4b3fbbf6b15a99b263775a1f9f0c0fbdfa260415ff4f61c263362c95fe9fa72767b8625f09b91c393fed48bc8f628ccc76b5ca49d9c01223ab4c1a9f25ac97ada8783b576575fa699140394e53daedf683ee53172ca9ff70c27a3f940675e3239e44a24804098486decb72ac8d41bda6e2d3585e2edc1e47cf1999fc67aa000677ba66ac22576ea087b6e7affd5c1617b3d94fdd314d17e6d37f9e5347807fe21fc5a9d75b3a25541cfe4a2d2c9efd00859d713cd6f67314cba4cc270fdb2e6 +result: pass +shared_secret: 5f0c5d9f39d3e724b5a2bd54e69e360f72ffab5d4d6cc5e572fecba80acd4796 + +# Official test vector 2, seed: "64335bf29e5de62842c941766ba129b0643b5e7121ca26cfc190ec7dc3543830557fdd5c03cf123a456d48efea43c868" +private_key: c22702a2a8b54046661fe48e8c686eac807794eb4a67454d68a12825c99c73b3620f1482eba71c724cb8edda16d05a2d630a4b7d967d33f42b352a07538a8ccfeb481776baf74073fee48709f01229d087b9f16d36e907ab792be2b86baca7c58bf31b63aa556613168140ad1cb45a70f3ad8f88ac7f6b42179b62707ba00fe0776ff45f575436ad70bdab0769e05587314ba7f1802b2ce6536152a5076a991eccb79a908351f62e38c75bc3db7b8702a104155b87129b2b3a6d3a157fba573c1b96b2b8ebc5327267aa47847259bf46f54c315b26748a6f49eb3721e772032b6f0dd48a44755eeea543624cb62c6965840caf314c81a7d49c1a2ab46d047ba45244b8b292f72252844335db158496302e1554086b4a2df68a1af1737f743b0bc4e07be5fa2edcdc4ba03cb61101327fdb6e99a2b1de800462431a5e45870f5bb61e058b21ea5a4f86404f99459b4c8cc5d91ae4e630ff1c380b3919c2f22f06f633fc062451b462130117e5f20cafc2760c434e404944fcc03d64d5aa8ad11eb2f727dc71917e6200f61b53ac7497eb198a417753482c3fe988c53883372d08ac11c5ae57a24b787a995f6acf6e359bc7121032e4bda65c618963b84785a86da1236289bb2a6b6716f2054dd43c77020d8686b47ca1b7ec2ab36c07141fb86937141f45d92219c25ed9c13d14c7ad682640a5f88b5574a283aa3709f26d9aa739f55c776526321942cc8115a69e790ae357765c7a05ab35266dec2de96acf5d126ca86763e18999e9513f5b5809130b7e2616392a3514638b39442a6e98c44a35005fa4a6b1488c9f181c4747a935626895f3c623ddb44e1d581a11465ffac0a0a1f2a5f881456654490a1b1bf1e4485a94841519babccc2ab594b1c2532fc92982db3994161b15194c265b679fbb768970f885f04ac06f62692c9576c81b8979f221e545b150c9a57f232dfbfa7d9ebc91f5aca92a3cc39ae922f1257f1973979b46ad1c967baa7002c36080a926467f277ac234c31c716ccb954b617694e7d228164a1be2e13b7b855534fb50b88c937a191ce493ceb19561d59b1f198b81c78371a58c5ca4f38bc6981faf61a9b60941978569162004abfb82ab729d4358c207a915d55458c13250ba813a8a5396cfab1157b4a266033050d31c1b74afc55c645bf256f00392b432a99092a30ecc456bba202bca14e5c741830c931ec377fc163b5f16b81b3897fecb961c6a0d8d97461cfaa8f4c48069648e8b48864dd9923b9b1bdd44290aa66290c151024285c3732a2b717c55072d2168ae92f001a1c44b54dc24a0145781923138875d8f4a0c76e2a79fab7d10a141c57ca9c8434c8ca18e9d0271ae62a391f28c53361c759914852859f1970caa124a1ffb3797723429874f3088197af94a9557cb66fb76fa84bbf5bc87552605ff00c67ef53c5e5c68c5800057f6a36b391386743bde6b4800b4aa1c1984eac8a728a729ad60a6321a22d6a9b27b56bbc7c65f7ae34304827e833aaa867766079074c8e020c32b87fc6564e5e4953df85b24991aff87b052847fe6371efb03a326a96514dc6ac8f42106f59df9b10d668111a1a9b08c7bacf2a42243504ccb9abd737593aab617c02b820292c46c8a8a92975a2e27292cf893a7f54a84a67022845d66236dca3c4844604b16879e849c7fe3475d03f82323d822ae2cb6763842a319114f5c77754613d5fbaec05aa801a03ac1989a725337ea38a668ea65cdb36343ec3d690ccdfa47ab1fe473247bc488d98e1e33175920a0f2272a03982c8386485bc2c4245884f1d941750a1d27fa85f0067f5c377532304261aa908bfb950894cecc1bbfd197ced78a641366b9199a4ba190446e03ae51549be7959c87a629abf24cbb7a58d01cad4949734f797ae300a78f45c70f668506977d7c85a0cf64c700a5b1f7879801bc3ac75584302c8bc81c0d7f6b237a9400681bacfc7192f9c653f8a9551f796ccfc262d3a438a551ad74c80ae9e3b5a7f12c5204ad44c21f488b7824a4b1eed79da9b44e60d8b225490c062b924da04f0ef0252304cca34bb4fc70ce6b1800fb6c5dc771bf7bda9e9db2b6c6046a1672c6f6f01a0406b903411c271b20e139a69138adfbf50c1134ae0899c166b1b1a5d818515b0dd94895a253059b167630f3a0dd3c64cf257cdf93596e54288c7a4580404ba8da541abb1b6aec7e530c58a61a64d9b9bc32d870bc105ef7063b9a97519b871a60d7aaf8c193e948c267c9c815063d6a603ee8d2249b386d94395804a9af8cd2184800c7ccfbaed98c4f9f95b70145b448387183f5cc8f4b5f35a949bc74706bd03db7645c2d084624844a55a0a5abb9244cb5b8736b835b512bcd912361fb660479b2c51b99734970808ba5c6db0169756cfc986dbda94915563c15a109aeb77c01a7cff55c8430696d6e83aea5d49292462d725c428b984d15e97ed4a76403094699e1336426b54281067e675788b3a4fcebca4431bfdc8a49c215ba11004a341516018419abeab2374184b0e2b7b7a54efc678e812588960a0d009418e5289eddcac582d3c73dd93e1234518da003648853c5b5a24b389e88300aeae78c41e62e5ee303a56b548375757cd42e21a7c59ff29a133868d1d0784197573464292547161b3a8689dc0c7de11139d407f0b5784d942278d49462965f21f72cb992add160620f6a82f70aa9a830190ce3c9fa8015071c2877483c2203bab7228ee2f37bbb17c1a4bc499ec249ffbb42e4989905a878dc873e456a7d9db946572936d8d81777d1b992c00db12a35df1348ce8c9d1a02898c7403d4107f45a6bee864375b623d30e0c191f8ad835a3f3709362cc763d63c2b91649d722825402c9ec1b1c7aa02b154d69e39da196e72a25928212fe0711bbb2fd2f9550a361a28d4295bf0c036d7b79be9130232060206c919f8b864f03d6f02348ed2c8001a30124b40c6d61dc3e18bcb27c60bd1324d8386da99c3e098cfb94b018031a4d6aa5788d27a75a67b630327add804adc21642d58080956a03f03c8193ac302c92e949cea31721813390382c814b2c5a6d34a1eb44b8b62aa77bf88b5067455fc0c7be967c21bc281ad38ea6978d228a83a820c57b4039175c910a450e300101cae45b0736a4dcbb0e6eb58491da31de3b65cba0a7c80c7815f677eea7ce5ec571bbf7c4516c65e4b2528e160959c815e1bbcad0a29ce59573d749453d9b6b52a951de9b889c79cb355c345631070b7c30f1934123c9ec68ebb324d254e5d246b14a0259e49b2ccec72b8c4948349bda55b63cffa9bf953993918b18cd6595ea6433b479e89b5cd3c9339e4468cbe82fcc97ca60ccb27bf6938c975658aeb8b4d37cffbde25d97e561f36c219ade +ciphertext: ca1e236472b3fec4e2afd4298eade05a462fc19fa22e6805b386282edba027bf2de8d13b825deb40fe10cb8c79be238201a81d7ec48400375019164b1515853e69144453f1999346ab1ff386fb3eca8149b5a2b7acd49a165e0cb7f7509e0ed5d9f279637b26570b16ff34f904a42244b15af7d3083e0cdfe3c03ea42f73c75de1860981b8a25756bdb18feed4bf461f765583f0772a81d40508498b54ca8477db0d7067a0d9f7d00fde68644fefa97c5e21e3f3ba7cacd67cfbaebd58930d7665bab99a94da09a2572b5b5232a366e556c766aaf5807004c6d3725ea33172eca8a6dfeb079b0de46ea9af3f8627ae8555ea18c0a0c12b211826768d8a8a1e57b1a95c9d98bbf1d5ec07348ade6f134712dfe84e434fae1fe9671fddc8bbd2b69a15704e8b0e62abd5492afc1835bb24013cdb83f62a68b329e8b340b904bff04b4eae972df87bed79df39313556b2cdd348f83f5bd248bbeba7ac06dac17156246083238f988cc196b5469a163d602b70b1901fd240b480d67484dc4c0e1280bbf6e528a4f3b6c734587e33a1f4442ff0310f6c83259f7b94a162a4a2a49e1047fac23a245b2db3cbcc94192d7fecf40eac4224ed4067533e8f2d468332307fa9f82c089663781851a2c3208a23cb089ab744f4aabc1c21717388bea6fb01789c4d77fd4b2e0395c841565cd8c9c2167ce483a363006583d895deda5351c1cbd0e182f59782e5e76ea45d9e8f38d683de8865e96e8360e811559c3e082edba99be598c7ced451c239e081183fd0aceaa3f75effe43a7c8700b1bdc51d0a5e1e482237d9bc8a301b20e558df1f8d520163edb8705924cd6b8971bbc3923f8067964e6c99ee3c60737ef170f5aabf6261e5b2e6430dafa73ac9d6084ddd0ed62ddf2a0d4e064c7a04260198b94fdd02ebcf817b511bd90f6243cba7ba91a8dfab6aa8f48bb67696f575da25234ffa79fa53a4b9de2ed0f15e9b20c52b764e26c5d2d0b13cd3ebdb5d560b373725556c7fd152f3e4040cd7d40ac9b4f4c49e3dc7f748601bb4611c14e03b37ed79658e2aa69e0b47f42710bed2e4ac6bbf37dbeec69a34b6045126a017732695c5474de44aca2f2670c0e36bd686d9095435359d173276ffd07c25900037c2a4974e6af401dd55523042bcf36ca27880775cdbfb6b095cf93b491dfb0f2fb0594d7d9e46a3303e3c0da3c5d39c2fabfebe6a3eb9e7c2af3022aa5148c84f9cf8f4899697c781497c70042030918353e56aa0e4bac6fd3efd8f41df94d5668802c9f63ce6fc51bc36820f0e60b2085642e502d093d3bc12849c553e05574a2929659cf3afa0f33eb117d79c3fea450996738b38ff162f77fce86949c0553269dd8fa3873615e7b75dc5429799b191cf209202dfe18230860637769df426881db849bfaf585180ba15f67410908ee6b4056acde46a1ee862ce0c696af377efca2a2878d0922bac97a53ae95cd5160f07fa978bb57ef8ed3edcf5ff907d25f50f80e488c7ab79b11333d894772a57d1a20d0c6d7224 +result: pass +shared_secret: 7f3bcc03a35a0030255264914e5d88a0c93611c7ca21f0609678a88ca42ce1c9 + +# Official test vector 3, seed: "225d5ce2ceac61930a07503fb59f7c2f936a3e075481da3ca299a80f8c5df9223a073e7b90e02ebf98ca2227eba38c1a" +private_key: edda9b4fa2880d5778280a51a25a02b4d08f44f83afcc7ccc3692af517738bf8aafaf53eb33004364aabc42bb0a640b12266bc6eac91d124867192c485209660d625c33aae9f38535903cdb178bc2ae557e71acee8208169d80c74044490b3ce4c06b2b68b44b2c0b47d3c9178344f7a7a30da49548656b011b74b5bd1b23a1b39f9f37dcbc91c697799748007f80b3d55f6cb81b926311636ff11cfbbaa31bb02689e9b3b983213c2b3cd8d4395bbd46dbd25b345ca920f9b3545f13d4b809daa02608b4c5a1e041a98b3320b91802544aaa98a4916c7c49da792f6a04a4d64afa1294a8e71abd47c4d96d9203c7610a10b762e91b386471c8eec6ef94259b8440c369153ab6b9d6b52994271a865e20ed1136435ca490264a541207707881ebf74be6259b913b38a2c54be4ea88de1dbb3eb59b91497a13304c54a23a3a1810674610255350967a612b55bc82a22aed447b09bbc6f92fb9427a4baa183406ee6ca14e35808e33bd339a9c428213aabc6ecf473c38b62aa7c6cc8b30f9a559565d413c8f504cc000fafc4420177c054ec19c9360c2e04504b8b7e7bd86b820b1996a815337043f65975401c76a863a2803b0c80a6062e827daa973efca23502faca371cae8b42c4518b52070b91ed07a5be9c9dd304386592988fb1162449ac12589115e7c14776977bb34aff985c95f40265c20b4cd6216702c9ad91345cf120ce0c2961872bb6e42547412bd226ab8fba97b8e074eb0746d61140e07a51176227c9559c4bea306be88e2b84515c528af3ba34cc71c06e7cac19b998b23c549dfa2e253a33ad23b905e1c55f96054c3c4d0ee68f4b447404b8a752f4a9cb6acc624a7985141055733f47d4220ef164f6c7b6573bbda39365890c0c0318827a701ac4670878fa11ff24b3c57b56abf09ed2ac5ba554a8dd184fd09695cb2c798ad23b86f0690d6840c77c53f98491845c0c335b601b26582d9758a244603035139c98b9a723872d16694a4b5165a22fc281142251855998cd6eacad79b8987f143b5a7a69feda51d66b1c0e453dafa5209a225c1298a8f922cecb2c6ebc63c762f285ff667469d1371cc5ac957a495b55834c3b3a4ee9bf2a85c5b7062742a940a686bf0149542b6a350fd2144a849d6d71ccbf7336fa06aa4f7aae89e586c4d093145b8265699f5ef000eedc0cedc96e3256072dda4fe71789ef1c4734e3205ae617aed6a8848083fef84c61128c00645e6b4319b950ae0322ad845a58bc4564d2bbcb9e08858aaaa8f547070ea54412eb5b608cb7883472d10abf2ce4143e461c1de11b5178cdd8924d93666ab8f44cecb954ac431ab89208d812cc29073e2de706953c2028fb236c731dd838af9d310c1538238743bb71fc3546a08fe4e35e965903f2fb7e1a9a2201f6a86f38b21f22906d659f4bb8a226ecb8a107b217ea41e542075d01cba7caaf1c97c014a97ab49666e0015eeac597717b1e1e8773838958dfd1796fe1a7b62583f575b1c0e676a916799bfacec28ba707974131f36bb2292ce4e99cc2046b689624e069ae46db94fd66a5ca083851940ba26341bb891fdc860d53741f084b2d9e846ec2bb5eabaa69a8d96a8975a1d6f33835a53225c1215d624156828088b63da622afa9fc5476b3603474b24d8394b93ab494ea3eb0f33ff5d91a33d34a2f666235ea009e35544cf135eff54e3575afe2fb15b6b59a4db843c25139ed345fa170003fda60b240065f761570471c4914aefb01c38fe36b3c7b80f77887a03b74bafb64d3b922701a86b027651fdbc777bc4d90d387fc15b8c12443af8636e35224c0430520bc984d71c56df26e84b683c1dba081b0a584b5793e725775482ec45b1db7c84949644d405579659cc31db130bd190d2247210c043bc8f227450ac206c13e8baa896e471f7cab2bdab29220c051ba354dc404767e812765c66ec19acba3b993caa2c0bc2367dd50846bb40d6587b51a76277f6865a5c69d885553ddfc200e970b9c0666c1854efc932af57a1f3bc0a805024efcf978f77b1dd739604b8a87b44b522ea80e87ca2cba7220e62c441a429d19b76425d51cd1e61e2a2950922637a1ab84fbf645a1f6413c288b731945d4029958d56db90aa01b712c83b73aa88581522757d505b83e61ae06eb6f5270021c61b7dabcb0229878d85c8f352a9a4349bdecb2ab0c2ab4039940a887b665f8b9dd10992b3b0493db6074fa85e1382a970953ebf113d4835e9f031d390836732b3ea6a89145183f72dbb095d7617a3abdc28912972035f1cc30aed3101d91c9eb397680c8ae222aa61e515a9396cefcc75c0cc255535a3f41212141c12558881e23798e1748bbb5464adfb167a2c44388044754a87a5ad1ce752c38b504bc443a24ff73a6cea4768e22681554b56dd59da1c7b88db126b7ec640c1bcae8a20b5f864ea6385dbba1c4ddd31775ca9f72ec6f137570fa9356de55c5c2ec92048a0cd9680837f98763fb35d1431805a7420d2bb803cc37bdc90fa921bd4d18b4f33419cf03ad0e2360d92192d7d87df71bae83d2b538741914892c0d778cfdf429be268a22f4043c29b62ff74fa770156d93127c3a7fe2c6c6c65470d1931f85a3af1a963bd919ca3c437b43d368e6e7a199407258b8bde88b4742192673499ac440b247d97225e7554482c6aa6567486074f15b19588c6d9de4619d4c493bf73f2bdbc05343a581e95197b64dcd8826442565bf629d5ce4045218bb908701a5e53b2d0679720598fa1b08f286b60e5c377ca7afafb206ed4712d6d16a47b99360426619f97db0059a15592353577765a8368d93928802704836c2279205446bbf7a2465042816d7907f143635b1434680156523b02cf1d8565ca5c7ceaa126a2753dc299c10e4968a4729991a0f5ce31c595629301c135b5810a712910a84ce1f2164c3aba248cb89c591ca0d24a7681c0a140672bf01c7f5c967f3e41b9a925af6ea75408a24684b725b446a30d0199f67af94b958c4b979c2a841b28878b5dc5154b79c944c7156538e6a130379674bba5438d64775fe1a87d3aca677541bf82c27c6d18f3bb182bc7494dc91b23c35392f21ac49e69e3c70454bdb16b2394d00a549734a1aa4790b01508be670841e09042e5a1a4a73c3b830ac5a35b826f36411639e20576a89197426005c08380c13a4a464892bc6992e236771e7b135aee096e9f65738c531b8e63c3f4a922a79222cf8b8309a04c3c7464a69982a072fb895714eb8f4e6d0a4c447ac97280a7a7b63bd585c521a49bf9230588ddd7034647a81f0f1b3e3dacb6e73e900f7c078cdfaa7119a5ede48c7685fdb7e0fe2f5de950541fd53a8a47aaa8cdfe80d928262a5ef7f8129ec3ef92f78d7cc32ef60 +ciphertext: cf094e965c6a8d943b28fd5520db2fad4289e6770ef897f6ba80f522a2d240e201267890a7ee3d7bcb86c9996cf962bb45f8e2cd7c02c42ca4d226858b07078890b65b297bebdf776402566cdce7b52e8dd7e9f920a07f8430b58869db5bb6bc73f47e4b1b58905743fc6a63a116d9fefd1985c0e317536c5d1fd40a99e493655b86be0567eaaac00c67a83b40fe4babb98823051f7e4c565c93392df3a67b214217e62ce0175aa8fa8e3d5a290f420fc03e4d259e76c5668219154f68e1c3f1b7b44468c3eb8001bb764ca252eeb5fb934989e89d4e3a507742ce31ec20e57ac42fb9222c18b674558814636cf6af142f525ec3c8a7d5838e752eac0de8fb1d77ef7e2a979dd2126ae587e7adecc8cc21da87fd661d932b277a154a7c7dbc4caf567199660f756589fe8f77a441e6f31248f28f046d003c4d7e6146f9829827838a3baeada58163cdcc31ec0a78303695a9d51d24d72527ca3896ccad6009f701e486e6d73c4a4ce1afb00cfbb0a1e729ca6e726e4c8a2164d51e97f50f65fba4a8624e679a77a458675382716e57b74d8ed323e06f0f0d5af1b5029870ceebf657944e337cb408a0352328564cfa19006773d1b794d9216901f5b2315150bfaafb04db04c7ed09046c2c66f24fbd68a0cfa6ac5b64363459a73e3f101552002caa5e83a1f91759b5f86ee50e915fca750bb5e95c2f8bbc6d5d681313207f91d524a1a510534d9b844f39c898f9941ec4713eaa9572d8963866cf69a6d87e98c54f7a238977751b31460ae699b922c307116c3bb2e90f69bb91c8c45527065eff726ff640eaa0016022c5f1ba2261faa37f9b34eb92eb5f55ac6c3828a90be3265be251fae5a1825035e8021b70ad05a78dc4ee186bc6af75bc7ad7575831daf735973e8505d4ffce88873167aedc55940d19710dc769fcad490129cbc84ed362472accf2ed445599b2ce72465b85b4e1d6d628dce3195d4a5fde5b95e0a2ec025d5678bb92a440110839b233ec4fb34a6bfedf9c1a1d64c0b5b20f502167b35745f83ca64857ffcdc91b1fcb3739048a48a3da1d2020819dd93544e2c448760d24862401850de85b61c438a23de01be16b5f1a433e9d3a1132c638ca97d7f7485af8176ec8f14601439438552ec3abc97d29f5dd1ef805bc46fc9b77befe95f0641a94c7ad1dabe80bc168fd04054ef38b85b094b2083078f04cac56742a4c2e505eb11025a104df668dd9c3756d901dece91a521881ef207e0307c0b87170e3faf188ad9b8c25704d41dd6b5111c1a594f5ff7dfc4c78e78868f7ee7dcae347a70abb7968b4ffe8bbdabfbf52c853a7fe165f4ba616a9e9b18d00af0093f1e06efccf8863f0c937a35218bd6d043384027c5972687c1078c31e4de6b1edfd13fb149cfc9787759351f5b1a3daedcab46367bf6b4ba159dc109f7f79c478da6d0cb7866cb372770bafe05bd95c8ebfa090f70d6f051430c0f2ff76a036679be20ec3bdd91b5323af2b3273a995126a8d5f413e4ede9f27ccf1dd8974bdabe3 +result: pass +shared_secret: c630736985fdb7830d7446e18b6b81fa4a707a6058964b99190120de85e7559c + +# Official test vector 4, seed: "edc76e7c1523e3862552133fea4d2ab05c69fb54a9354f0846456a2a407e071df4650ec0e0a5666a52cd09462dbc51f9" +private_key: 9aa91962f6556d921b81c4946aaa26b62ac53197a49e1701eff367d7ab00b27677ced51b9619541ec8a180db9a7ed7342c31000063578851bbe9095816cc689b701a0cf7acccc64abb1355807703a6a759a2d89ec01c9b8196573576c06395335bb39903187233a3c89811447e8346dc70ae390544145abb14004e6e132a43e59364b249b3cbc13084c9a3487bafd0bb66d9414f607e6cb33b35d990ddf40d87135c3abc43a5b431b72ac9981b753a4b17ea48c3ffab5917b387657bc537162631e76ef6eb68c670caeabcc613b439a1f265d1229f8226c1a76447b535a81bb311b58b1236324c20762affe367155678ab01bae2b3bbbe3519ccc6840cf305e432b5c92966f45809dde31b7c30c2ccd77aaaa236ecda9260c361e71c7292e10151d165bf6c9cc709a49182807543651a844fee7703876921af5537365c50f4ca07b2895725505db00c6a3d240089f51c7dab07dde7a49217a90bb46462b4957ab22197844335b620e0226d1df94ffb5983bbe8aa3197ceb6180ead6561bcd7914841af1b954dacb4c5ffa694a1a45064e2c3b0bac1d265abbcf2ba35b8b3b0f660d83680be5c12dd2437a46a3367d6bd94d40fdae51ce2ac800a0881b3b3a12995bad39a2ee4ca5e07446943f19aa5dacc7b8c9042950ab5ea60a4e54de2e8378589722bf711a1c92113471259b2070041287e51742ac79902e4ccea25712943285fe5896427c8eef2313277b91ae9cb55ac2edc49b2d194a325f6836d29812660209802c457266ce3688de79a40d5b6a4c2b606b56c0b2e13b262990cf23987e138742eda24c0cb551aab1024eb095e929be557b17326b2daab78c981bd26a393a175385acbabb1a87983c271175cada26b2495705142e0c4fee912d1e19d97f2ceeb1653b70c9003165d7d5a4a6e916bf0298dffd94523762790f0108610c1bff81a59ec4cc890a716a29f4ad24d75d53360c423d0c921e66b59d96347112c918ff680ed460c8d590db11992cf86caf3ea3baec9370456c6c354859c040fd1c126f736c92e50860694b29dea4c1bf31061ca259e83035c01a27ec57eca8aca80c6c932261e1f44b6af8a0c571a833a826d2c8b749832566230cac47644eedc9b288640e32b4dd75282764c152b87648f7baeba3a73c31c7e2984973e74a6a7236b3c364bdaf2a5fe64b4da0b49437102a550ce04f220ad907e8853028a370d0b501d6fa849858339f63b8beff42fb5986135090bce450455b561f5d2c1d0a846dae4b2fea86507aa38c2257eca186ca21b87364643ccb668f7d880c164c398f9c46bf75a9a7c975e463bcc0b9b26c4291839c43136614f9c9133793fed561adc63992bf968d4c373b8531e6af04d58476b33585c1e9ba49539043e726340c4cce9223519227cd66b5f3d05702b9600a2694d5b23c4042b603018cf25fcbe4cb86422420cec820ceb589b42791c010cc4aa306fdb55452a49c66071c81aa3bac6f014be88602a6b4c49db2a7a9a57e6c97bae7bc483f5a54be7970300bd2445758027311e4949ce43859426b23999a0568a55b2304a838546d3f4b6cf8303798837b229b3b1aa3b3ea60bf3a9aa5c8b79f5293556a45010b5a571dc246ed749711cb96f0cbb88a8c1c298c7837b2f2c3525f2313ee5cba7f6dc77413cb58ed86f75d26b39729561c28b795073c1994f69256eb0ba9c934146c4421419475d005150897a17d310bc52f43d50e8ca5706a774d5079719754c6336d1142d2387bdc1732c03e2a3a04a9dde91c46612b54ca6ab15921bc20ab4f2d21910629ff4e37516870d60ab8bab08ce45dc89ca6712f17869e645b702141ef5d64f67f62156ea90ef1c502024858e91c89de92056f3675c1a6eb2191e17300845cc3f7b52cf93c566ffa732c362a8e89c5b6f4a5a827b6259d26a31932e3141486ecc746027776a852faaf0c3c436c690e3664ffaca01582022a99130bcc402bb7234a14db7baaddf7981d6557dfc44788c7506be021359e1917837a3c3d5a598757e00f77b6b785436b6840a16151939774a10a7cb8089fda55e6ae49f30512d691716f29c8a9fa94a8a113632a20c71138851ea6ab3f84e6e18b8531119e36cbbc6d0229a491f6b3b7e20866dda8ccf802abf47a769676550e2fc52ce438c48946eeb22756734bd4572c501dcc311b26fbc9c8ed2100a68e44435520848590375b59687c94a685b6490e236193c722b7b4acb84ce9a69388d13a984f696b85122c3dc0a5c38c2992ba60a280c9c6783855093a9b886953194eea273225c1a3e10b9db18c548c05c392631dc47320f411a618c943b7a201c784885b62f7c56a6b698abf1c76a039b3e6f95c466dbc31b4173778a9d5770b68b8a8195e886e8191e043b909723209553bb942a96ec4cbda1382d02f71a6c009bdac062c791c12f68a1f0506478d1869b782bc8b0181de6ac62bc8dc844aad6403a2b907f2d1a992bc44313f711fee1bc70d326e7199fe411354db2c4ab2526d09227bcb42cce2650e341368fb493d6754715736f8151019df22b07e5b5bccb3d0d161ffbeb2e93731600c85b6ccc226c790ed5e7384e8c3555497c07ec074f2253713b1ef6927ce4c1a80da11cb609c826718a5474230d62a40b0824675c95d0cb05b7c77b1dc4aa2872b8083bb79e201a0c847061e18be1d2ab68b2bd55d24925db5f4479bc12dcbc834b0254b891bf373cf5c4971bb0811182527c72c2ee6479217c70214106b416bdf0d818acecb63fa6af4d7031bb50312023acf66986c71a25cd8a88d767844c312dd5198b965c3df3e244ffd64610eb0cb3431f98889e72e864590191692b8857675afd45b6cc31374888b40183720e1985d811098738b63a823bc7716f9ce94ec70738d7f5228199bb78b811ea912500c71e1cd93c955c0049519ffa8b523a7861b6b2a3dce97d82449b00b8961877488b50542221ba79aaa0d33b3a47025acbe47998952b08e27ac2fbce08d6bdac7b6990297504194bc0304871472cf3cb952d439646aa86c47986d160afd7f401c70bb200e6182f91872812c551e17ea8438ae4236cdd743159802b034443e8d7ba0a249b312ac91981927440cb0bdc8e4615974bd2450161614068206bdac3c2e69eea0912f8a4ca1af21ac4c033a6076e6d13039c97ca930599aa12b93d58c09d663de14158b72ba0803a1b7917b71284802340422310babf6572aec23ae33a54a1f9c65dcb70821393b95178ba5acbc0756dd8a02f8afd156dc73958bab2f2c0d24c2436f9f00b7267da9f8b2678c14626ec811aea11a24a4b09e428415f82ee836e930c3b77867aafc5e6728149e3f2bd1bbe2d3c64d38269a1ee8660b9a2beaeb9f5ac022e8f0a357feebfd13b06813854 +ciphertext: 137f6e52087c3672ca92c3eec5ddd9e4915b42239efac9fb1c21267e62f4421c1b10de7e404dace358d8403d7662d7079abb4ee0eae1ef912b84152c35c190b48ae0ddb4e8bbfc9d94ce328339ed810384bd7006f07c6b65a68cb10eecdc10de690f8885589f7d7269c659d54145d6a99b9d1ac8b6a381b3c9df8265a904781bd2a8aa5e4c44c5d68525a01c3915955b2c0a8412040cd371977caff50edd1bbc643caece877270385c211cb0d9a4436fd0d0368ba885d8121dd6db0a96175e52918360435d1ea75f9331426aeb8b870344a7e628ffe5115d731ac46238868a61f0a3939c359cda3cfdc4f853813f87036d32e36c94659c42e7e57455b6f0cf72dd6d0cfe6706003c9f2935c5f2f99aacdf881fa458003c61e9ace8c849070ea67349f23fcf91fd2a13cad14d8fbbffd0a66e93e1c427276d541bf8a763e435c17c5d0b40a53d95830b2e266352a92a7156c121f5875187c0f341b236f63ac8ed3aa9f7c04decdbc422723b360348038f44bb9c5e1c7c9a21ba4405ba57dff045c2393c246a430a04260db49648bfbf9da7c3ce14a2a47749b9ab028313d1524e085d90faba17e5958448c20c1c3b4514d83f47503e1de6c9422a4ecf5332645fffac205b8c46d8d0123d6a889f48cce238546a48b526064d638c12752137a4e0a9733cd4aca910d40dfac757080684500edf82e678191f1031f6abbe51a6ac0292755db514feab858bb919d4bc2dea14d1f1c3875b249442ee3d1959bd9ab288a01596f490c47b13fe8469c282e8233a6a7e4ffb48a4cb754ab47be470b6e837db29886f45821806b64824e1196707f28a27f5b09286e711688884f8be172ea0f3dc0f22f8c554ffb181d135cde9ea3b9cb984a9403f459d98b81aee62b9f259a0b855abf605e59e5ef2506fceba5699f4511284886065feddbcef499a5ba735049ba2c3fe812cd741bd4cee6a9e7f4c7e27fa031d4ed8588bafa9e1a724ad3d442b821c4e197d0e0fcf65b24e9a3fb4f22ce221346d811c304bd4b2fd91529c722ab08c19a9b06212f78edf8e61fdc7ac463696fd2b9bdc9aa14e1033523c0ee5b5043634a99f027e2155c6d8e7a489ca5bb6faed913a8211df109df805d07d5bac69f1c42665f54726d46d189f9846b6f15cc5b8a9d3dca6dec03973f54c43d9e97a68f4f56ac4d68280e061ed8b56372cd9f58806d142dcd6220d07bc12b6ba8f19a7196f270587190e1400ea90b91f3f9dd1853e1d1919d98d763f86f82e2eb1915bd8ae55f0e70df6e45bca23bc49af9631825da5c5e9179dc270331fa4f2b148e1b6358e88f83ffc464bb715fcffad465cb8ff1b893a6f985ba181495b43282dbb99b6f7c00ac74eafd2588d12262a21a3b1da5f642f686b7df77484f0486a5a88634e2bbc1ca1ee719a47481e76b5d0ebbae155985d14128164ae3881b0e626e8a96c70ead4822ef68402a7fe703103b8dc134c89fee2c4fac3bbeef7ddee0c8d5dcfb7336adbfb36df18c2632b2582db285d100b4501c75cffbabfe4 +result: pass +shared_secret: 41e078d0d0c4fe5df5c6683171d5c1c3f1ef152c4945f9cb299f74278ce4cc4f + +# Official test vector 5, seed: "aa93649193c2c5985acf8f9e6ac50c36ae16a2526d7c684f7a3bb4abcd7b6ff790e82badce89bc7380d66251f97aaaaa" +private_key: 7390b68a5071de21628a6256426aadd676c604479578d418ff77b4280c2901a29085e9ad9ca81c7639bae82274ee094fa38cafaef26fb27723c8c3c2b5276e28dcbd7131a5afb0bb238249963216cd81118a881dcf9628332661e0eb07c55465403b81d31407cc5b20b2041f5455c3fe8061edc7ae33e06982999e185106322564bbf9b03e309e1fa6bd61412f15091e9c523885b6134788a19d812a4cf4372ff35a24823a020c97cb59a9f5b698471483b04410107a2c2d8824d1ba5646a89e697738ebe6926c54874dd6a55ba2b89b64b1aec95f918a65c9e92d8fcabd58e25fb7b07fd880ab48f6581b661d4ea3cfda38875c9568a2162ec367bd78c2a7f7b3776511a8ae16981838bb3fc6006fab2457f2964bfbc5ed5c67da4987ec997d5eda305b389cb9234b39e23ccb316fed518f35c757bf77b501b983130282f598039435a6b402b679b14f5c1c2c69e32b1ac9421c888b6d935911d4aab56a4b39b3a2c6b8049f8584d74110fe63a1cbd633c63051953b9d12f36c5e3885dffa5d45309dcf56bcea5739a85441dde06b9564a4d1e416459a809964c16d574a42eccb18f51ccae7b016ecca4df2365596ce27958d1227a72a4ca336c412baa26afb154809243b5a448a9fc38b39dc90d2177f142b1959fbc767146dc8d17a3857b84e987479759997ea85ada8662035a939a30412a771b3893ab5184dc94106ef0790ab7617c57c8875d842010c08c142ac0f347709684302929d1d4371cff2019adc2c9a0a34b1f4a70dbbc3b18011348c7e725345a50197739a83a86c7af54960c11c3b03093cc3a39a7e2c8fb7f84e1d452029692bc4a872946a23cfe834254845d46bcf040267a93602b74a6fa9580b134500edb9bd2aca5cf1959991c8716e28c2ecb026a398444b853408b371ae438d4459a3a6bb00fb63175005cf15125136c2b069b9560d213acd3642c3b3c26620af85850922d27fe8f8cfb7b79afe08b9459a36281379c4169b73234c7649b8a0416eee2449ef7a1adce07910673d2ec3ba18e74914110e2bb7a9343b74d5551a80dbcf61d52367f387259408bb7b87d466593cc9b872766cb7021e9c741c040b397d842a80c952c91070838833efa83f36ec134be6156dbbb63e720b07d2197a4b4719f8a7815b682813a55e369721b88ac78144b738177d7788c2970e8591ab378bb4f26998845a8238a51352d33ed9b5533797a7e3d801b63a3542b11642ecc9e3808db74700cc622762a4132d8a4ee583cac8898005760351d6b70f71b52dea75c07a7d5970875e500ac13c14f1f2625d217ef13404a493526b115c6af01540629e07795fa78195ce23809911475e9ca00cb3caa0b5bfed575a6c33bb16351c60bb5bb050218f259811bc669ce68fe4fb1d6369cb7913013a16108d8204f0e09f351156713495e7a045175876f2836a4ef381b6a426ae55370ff4c8e740015687a8828c19426060581523bb184baa9972d946af2d2c34eaea9869304b095106fd759b2040908d175f02ca0a87762af4b57daacb432ad5558a41aadd2c49222460515178740c8f552cbd99653ffb4953d3218f8efa2fd6a1bf7ac7101cf320060c537e95381623872a2607a8447a317771b7e77466880e15c76a39356cb459b78e6821e69b2f0f817b236a04a7cb834a743f830934043856e0dcc376730b3afca17aab6ae2c59ebbd57f52d84cb107b6c5e536edc31e57c3cd404a618700aa1dd87e43d92d4e601ca8d998c927451e9205429c643b251e8307553fc755dcc06d9003c35c310780b31ecdb05764e3c479913063978143fb9a462b011446394a287888a61f4f57b6c0548718faacecfa6571381ce25c2d10c27386cc255086419275a3ca59bfcbec4c63e5b487c41661520495e7b54b9641a1e16dddba5794a42d42e86b0007444cba4db161c6547c69a9cc18b2923b2a388710578043b77513173f6eb0190854bd6cd2612d1048e79435eb17680e99bb932c232b1ac298591d98a881696b3a46e117bc4a50565ba52e4704eb1c23c057894878434c61789ee8a594f94ac55748e2b111170c391b6b8403099928a2c60a42383ce5cea5880701aa5b60e4c789c759c12703d946416ed316e48c62603920e2f640a347a2f305602f4138aa82b78cd08fa071ba1b9711a333a3d22244dad09aac8058592b1edf9193291c8854b18003c6cfea4a8728e7ab378905e3d04349fa5e4ed9baa17b41b0a7189ab5cd0e352f174a51f3518badfa7df523bfcb64c43fac3bc5b6532bf4ca91e245e1e61a815c865bc7cf3cf87891eb1234a49b624c0e1169c400cac05359b6a15c9f3201b21f02c3ff0a4b94980757688ae0c48d0ac5c3fb650ddc38a8167c87c51cabd1698f8e3654380cbc8819599699615ef5495efba00a7a2c805c1d49552183b37bdb782f652682e02b7e26893fd97b8a7025affc7062e99557751a6a1da7828d7a003d0c62c8d006fac92589594fd729c17f38c5c83bacfe5bb8add8c1749a7550765f872c22e3e8be9db4c50a915fec511c31900890192861366d9177612d731f1912ccef5534248408c31605ed8960a612234cc23c94275a0b77302f0b82b4d121bae15539c3111b9a21031314076199849302f4274fc54b284d95903cb543902aaa5cd39d034304ee86814c6119f7fbc17d35c68b151e9048434973ae06030cff855291c71d58740ea00254ed926ab8835234490bad7b51eab118accb66f4a6a172c9a26717376e678771b44d9d452dc93988b9c9b5af98907b17487bca1397b8547ac8382f8a28a78a91b1b105f107200e839218a74d16000e90334ffc8709976b7fcdd4b742dc6bd2667ba6ac24dc510314f6b98dd711bd7a7169798874225627f2c7aad1bf37e97a4771542e8c7898fa0d8bf4c0fd91bf598580df6c0ce231a96368c8b8435f5507429006883fa88ee4e5791c2685f61c9247e72378478492ec90778c5fb8aa4a70e6cd48890bafeb05798c13795c58b62b5ba8f7c522e78365089ae735a796825d9ea8c572a6544aea86b2e08ea9748cf6b5717103a6d1c02f5d87a5e1aa94beda8691d454de0b547e951afe05061399804bfb32eb7b0857b8851810ba48e92518ba798dd54135a74419217a687620a0c665a050318e3672cd616f6d41618005cba6ea47faec63daba709acc2489417fea39b74ca2b13d4a60ab61ba89b2cdf0912757e08214b0671d8867cd2794fb30a8983b410f149ba2ca7134d00f83ccc8d1d4e2f1e83c9d8d4b95e33927f84741e362d80c3ce5833b7f2498d841f4c7e076c64235d8bd63438f13dcd038f286b9f4242070a5bec4d8990075008667aad3a08ccf451b049fd51d7a9ad77ae14a81569df8c9bd3a8f1ebea86fdcfb823082 +ciphertext: e5c184d0e6eaa03a8e46165eaa4ac0f9ba855636b6ef0900ed320d1cf734f2964662080c1b756c073874d531dfb937b298375f594ea69298c3f7c894cbbdabebf99f5f0c9279df4a60fd58e0612d5146f7da7f708938b2297a75263af995393341b5db7d1ca67ed16571bc479cda54677205833b79cdf8a935be6d097996cf5329c90a1302c9a9b3d6fdcb28b725d8ced9e6fcbb939af5105a298b6801a4670a647a7982227e0e841bcf8d7b8e5e473f534328b5b47ff53a5ef4abd2e899b401887ab69e4290e2e59f0943756584612b7e508e3b270313f5db48a92b7020b9875b5ac8f95e439c376075f63a840a8c9ae9f379ff838eeef0ef6efaeae941ee2d9a74dc79237409e44a4cb994f59605a52f9ae85a350385dbf421582aac40cbf2a21b5a1157950d1993d037c0dfa54753232820cf3478aee60e7555a643dc34ba68078b2794874873b01e4842eb4e9bebdb3ef8c4d224d3703522bf76d5f92b6438914656b4f58b94f1ac72dd2b9aff350209128dc0c707c89dbfaae0cd6e7d0fbfb38e88b25ad92b3aa2f41f6b09a003882c6e1c857dec8d0c0c1a884bb176ca5a8cfa152be28cdf11ac95654118b355d8a0ce321f7e0baa42a7e1391292af8557d5017b76db0b320be34a129b0f6ad0aa56b1af43c49c74897ed0da8f9a5455c84340f5b929218c7f2b0891b5e81dead1d9148a9dce9397674085d7ab3735a199a0c0def3bdf917247b5f287d82838bc00cf7babeb56b00b9c737f7f470374769ab3a26b318e964e5cfe49e54845c99c64dc81133aadd30f0b1fa7bd44a55449383be1495b13e83074b4ad3857095270e2c77d2a516d021dc55f900d54d99f7720e4f696b9c12afa2cf990a6a4f41f32e3be28fba5d4b3dd8b22ee160f831886551798cdabb447b08f5286c4617f67e65485732a09039d1ac07d5e54b8e06ddd8ac1d5160fb6dcb6366b22154b144a59cd3ef76fceabed5ea7fa81a6b5b36590584c11ad304ca82c2ff2c1775c6459073f75055680dbbe80ead7e6bcaf4867d6251b6b75597b9b467d3077272f1034084d307731e5fbea1c40e2d5326e4581bdc3387e2f12c9d7fb31438c002483bb7854d3e3fcf2b80fe44a2129fa1de3fc475c64f6ff0c1722b801201b0b810c94004bbe43f7bf0f56f1b0be5268244efbdb3b8adc85b128f17ce218f01b5a22f41349114b45e1216039ac03de43d067ec7d033df560bce0f8f63360263d8b001963dc824ab6efdcc04406dd70f9b4dee6c129c512ae3e6a45b48344863298c53a9b80e514b9c14bf85c2f76c0ae28a4122e6134259763a6ea7133a594305f3178008d1e9502f070f1e1abd66559a5dfb5b951bde39d8dc444f79de7e548f700c81f5c0e4e419b085bc0bfd14c6f01f342823263a314c834f220dbc4993d29e2ea64653eab1ad2c7a556840a9fb01dfb02b6d37fb4d872714db07e8dcf88a70a834b72902b633ea7934b662cde95430c80967d94af21bf10d622e20a30d0af2ec18bec74e1d8d9d8af57d0031607c9c7a5a +result: pass +shared_secret: 7da491b5623a43ae17160a54e45e8328453cfe1acc692a1e300906ebd2a1d9b2 + +# Official test vector 6, seed: "2e014dc7c2696b9f6d4af555cba4b931b34863ff60e2341d4fdfe472fef2fe2c33e0813fc5cafde4e30277fe522a9049" +private_key: 2d8ba8d5472d324746fd3a4a9f999726cc13871a6ce75130aea07566332c05dc3b99c8626cd69917f025f6898a3112b7119c168bd86e27c6af08b292aa37745f993146dab93b159e9685cc09d750ebb58ddd2615236b298e8422db54b971192d69857d3cb1c910c948544b6270a1c5854936dfa643710b631c245e8b00c42fe15552a293b6f20278d82588bb164eb3636465cb0bf931b77c087a475dc35414c896069321080de41d58644f14143c5b75719184172eb2add8dcc059bb5dac9a22060283b5c87ca05b068405a9e2e4c7cb88941d7162667733b95a76d2e3ab9803b547047c95eb86995b1abfa050346788ef0c682405852bd9bd8f178e4adac309e8aca30ba6ab1bc5f8ca8dcc96291a616d77d31a0504229e206704db130e8b4480822833597d36db65cfd130d4796a254c360dc2799d256eae54b01a264af8020c4422aa837a61dd2c983345bc158bc878987ac4f22e49b21d21d47f32625ca0386637668517531ee2f13a5d0665c8d41ad19b3faa53793232974ec3193f2568c092595b009d40f3301f033f479192d016106be49303a1616347853b107626e49cd14c46be4660883b0b4d7725c0477887eb771e305ee2aa49beb1c00d6c42b5c33fdfa225db0640e973855d504ffa70b23c6c1869ba0dab69aa2cb75a02d9acd2f57f66c0983182a334e2796afb96ab2293751ace0f51219a994b2c5625f1ec7de1891840d0c6f0b300ad5146b5b682d5a6406455a475a799c0ca7c2d89c8bb759fccd178d278217d086dbce5a5946a0d6811518dccb37e898be658321fe262df3527fc5271e7b2b164099042900f2dd44491a72361bb0aef38106cf5ce7dba2316fca7ff2843f4f00a7ad94726f04bcb552dc8b24d6a644444ebc10cbb5dac08afceebc9dbf7910e031c8bb5038bcca34dd77fd8c7ceaaca6321715e639b5ae7573c0a0ba32668245a09aa278b86e2f2118c5bc6e9331063fac6d43c63d21728bb691233337668e7400fb08c54f98894c45a3548b74a7b1490a4b6009a05a9919195c20d835746d092bc6d3c02d2613e51832049631d3dac37d5951d50a2bbc5c35ac63a8d9c0318c2491ed5ec0ffcd0baea679150ab737003cca56556063b2abdf7286e887e92737f3651329235492c7221aaf0609c8b2f54a9c001f30d7314581ba821ba5b344463a88fc046d06a0eb422a524ccac23f7bd722c487d955c81836f7b49329b81231d371c7d3994bc54874e85bbaf278899c544236b49c04c688aa6170dea386d11b840634e75932b01716fb33459e63393f8da1281136f217bbfe8c10a14fb675e1a5074c1551530139c57312b4c9b5f4cca2219c4b35b63b1590ee6e3ad66d301b4609075737ff7a37aca7193d489762e75ada15ca43fa8be146232e5029b3f2a7d94f551ab625b8f963c79bab4123489317923eb54ad997b004ad53b3332b25cb27dd10a3576776eb1d77bfa10a9edaaa42c385cd5c871a4cc37e29a3da2e51683a78c09d63e64f6895930bb314080028473bc8c53ab6a2038dc1dc018c219108087c3b2bc2389e8609c0a8737f01c8dfee13e2014a77f2722e0f60d71f162ddf0c521f434d51a49befb613fb28fe9001d35c250791b0c611425c6bb62e8f60764db8466613486836fa07896314a6ea13a56e2f467483848c3451602e4c6ceb2cadf378d85654a63024c5e1aa3ba242136e5302881274c1316cb26004a549b19db794fac3f7c454fd8223f560636fa5acb56f0611911954131ad94ac88272b6cf4c89fa0635a7a838c38c92e1d640955453ea44ab5a6a0868cb9c071e51705e24a1cb1c4c9d8c59082757fc5cf95b17ff0064c0c47b021b244de30aeda11251fb170efb279154515b69cba0400875c78c1844503d411521ad54c651a738bc32da29ccfe992bbdd937827c6503735116ab5079dc04006fca98a66acb6519187fca7ca935c090bb8d31b6062b34513f01e157976183a1873db1c9e878a3eb37b650205ea5245fcb614887a8def4bb44b89cbd3c221e1a9b587a8c4a50633a9f386e6aa43e360649da46ab688116e01aa75943ce061b362d74ea824870a94cdf84b38d809bea8c994d2e10057b78ea6685fee45548e6bb681a32f5346ad5467558fe6c345e6258175a84edcb32b378ac3bb24e85739681234c0f1633c334df7d853c9d00dbde8a23d463289423536a44bfab94f2c76c113fcb086e5c4cf40193220c40b509065cc3ae5c861212b898699ce1c224a04a77bf165b0bb057c30d9cca16b4dc8128e7c197a4999372906cbf38386d66c27d1e36e8d504613c36d8f655d49750a72509f32f09580fa4518d9a34eb63ba76c063af7cacf158607890380c034e2429e49125c3f543c77c3066c374a43d24a7eea2608a12b845a4c42f7354699bb169bc720b175ce7c0d6e63843f543c0a84162e388fc21c313b3a5902430cab0a61d3e3aea195b13cec41e38539f41c6e22d63f5d60825d7182ecb31dc8a0a82a952b765c0eb279b75d20be877b8fb8fbc290f56efcf5240779bd2c639a67476fae730be123236ea68e4afa9d3200d0db30b7a771bb97fc1667e94cff70bd02f32d6b0b19548b61bff4a43fa5cb73ea11483b23b1394ad5812c8875002be49510656794033fb3150c7e13611126afa639355de9c04de445eb5c7430287815771a937707e88b3c8f42587f30baef55aeb7a392c14a4dc858abb9d537f8043c64100aeee6a597315bcdb65528286e0fc7ad5a59a066725cc965c562acb9d6330f28220bfb35b21cbb4321fbb556449c5e1108c46744e48c578937cc12c20df49b79ce96aea9b231892597b8a57683c495a9729bd7b969f34899116104abb00ee4049ccbc7c37ea5868ba5c2f4a3934d6599ceec340d6a488fc28d84ba371456caf9c52da9980904e253e54332505cb9322b1ce3c1904c739433d99fdb35461d4b3f949c8734904974c5cb7dd54531e86e7f9a69b8c78e137a77c0eb6b1ff468d0b2973819ca6a69b1e640af8f3b35af45183f5284425393472b3b7674503a86592947621dac8352a64427d313d51716ed6cc78bd85412d97561c910f31923361485d138b80585cf2a59a04896b3bd8c7ec2923ccd290c962c343561226a076e7e13a0d51233b68062d0e02512aa96fd701ecb80b7f45b210311246bfb594c5059f25c1167094f966c7d88da77ba3a71d186936f6007cb7cb4941c599103792edc82e3708e4aa9706da72ced51924d19ba561843c3a70f3f91b4ff04987cc4a914fc6ad33290975bc0b534d415efbe43f7d4a4b917723aae654e4412fd220548280b7a6ace9f2f0bc7b059fc103060346e53bc3c3161d884ef52db5eaa6df8ec3a0bc5ffa730db0dde8c5f38f266d5c680a78d264a7b96 +ciphertext: f2c88dfae11fef0a6f91126673e6f27bf378e78c4e3f96a8f7cfb1a81986926e1d74d0c7b47d9c2454941e83476abf9d9a7e47c46dd39f9cea1148dd5cd086ef9a4431864541d88e3faf97f272d98ff861382e007b4c84ad5a6cbfb01e89f6f869e6e04cc1bc86eaa782b6f0fd4319ce74eadd18b5d911b8d0adabbcc45f92c1d78e4bd21662049bf7c85145d180ebf1ba5ea49a216a1c8130bfb4e4f7a3a4490735dd4fd9db3c7b2e0b1191e44c4fbec765ebb6dc058ebbf08577f24ab2b7f1809baf9b16c5b63b5f63d72923140e477c24990028f2715a28375536d985d7914bdbdbedb02b1696e4e7dd95acd7572b579543e4cdcc2e2d66e64356a07c9a93e567b06465a50fc4bcb899333000d9ace41c7abdb06bfb81d553a0e743a8f36d0d30f675934dae148ff00b96951738d679cbd8b15d0bade8eba5244abcd3bffdab5d03b91f4383e498e8984f1795569889877f2a6920a02b9b741602d84766459895f988b31b678ada1593429636002a67eba87cd0a2f627ba249699e2cdff686c03874dd57f00beab2db22360a31ad7496c510f5c91842aeee3e432826e9b124c3bff3a6ed01f0f8f576bde8c1c81eec09082b94615086024ee3aff8ff87972ec80a0fd319218d8436b34b099987fd4e0f8bb9326c32f48b7c9a4e30b9f24845401de87d212d2bc26f0fe00d1f6273f3af8fecf9e45806f236657e63615ce16949d7ef40239b637dc01bfa604f7c296ce62f9b251808abe8b97e0de81b0962982936ddb9059008d38a1f5f178cc1f08c65b703f78b8f6caa4b436e48de6bdb76ad0cb38ca6a11a1e160cf15d443d2daa201ca450b01e79779d1f7bcf8b88ff031fb815dc2bb3018b609d6249b4887e276cf0abceec216ed529484842a26c91a1b6b3d36bb237c098c90952230a2efa628dd30b232eefb0727a20f088905cb183fd65f443bcbb1b61fd0e6b83068bbc144e5754a0c09bff18c7d20562c1d0afaee00c78dc0efcb0e7890afe8c22751ac7c10693681491e09371d0d8d05778c8152892958ea0790e18c8bd00d8e06f444fc46828d43997185476dac9005683c51eb483ff552028a7638e6a6d08d71ed5c696217cf47a79ca6b0c6194f1ae9b94f2d35c2fbc94495c557e59bb70b0126aa6c495f42f8a5f7eef82d8b87b9ba582956eae20501ff7902c4f9e451aca0ebd84c20c678b149d4f924be9a3953c3ce85e985d53ae3de46bb99cc9ad4f6eac2de214c0bd5ca21b1e8f3992e96ba1bbbc19608e160bc059a0dd1be05cbd41ca51d1118d6d1f2c83919b69cb051a3f01a3cad27b9326e793c69fc13f4c787a85087907fc8a48cd988f0796d384af60029c1ccae91a1824b676514e5d3f4ecbc2a372c9d953bc7d5ab900efb0476f18170fc0b01ec4c17797056752bb912b06d0e14113e6e961e85f758bdb11eb94b85232748a7f1d75edc6f0123b2f4a89c8778cf7768abac61d73c40e8971e841994e69ee80ee4a456dc02f7cff2911c1e13d078b63928b2c59026808422745078b9c361 +result: pass +shared_secret: eeba3c0571fa453fcd9f7f0d6baeb75d59ec9854c12846089d65bd8dadf9f6b0 + +# Official test vector 7, seed: "aefb28fdd34e0ab403a703b535296e3a545ca479c1d8148e2d501b3c8dd8b1034bd986f13f1a7b4671be769359fd2aab" +private_key: 6dfc120e15395ffc3fea71601c36939f3ccb68116ecb66a550a284c09bafe6bc93ee929efabc348b015ad58b34f589891d9a7e34630565751b15f42d93412f81f511ac6587ce0121d32a4760ac0b6c3779c6bb5b4c0a983b72397c544b15cc7aa38502d37132040889c575bb473b0fca1bc1c50815496606bb99a7dde8861fda4799955b1d026535021a01840bc82ccbac7b99f745747dcacbb0ab34036110cba31b58c0ba3273349f2927fc0b32128b1b41c256067642adea66cd35482bebc757d2005b8c5579c5844989551cbb7377d550b17ccfa6bac2ce6012701988ea580435e0533bb5879cf5715eb75c69322b9015a4824b33f2647f0b23b4343940965027ca10a58a8a4bfe883c5fc90f62eccb9eaa3dddf68b0c1671bb249a52898faf3397fe07d02aa723efa27261a44d721acc9c8b6556267f06e872e6888d03463c3f7133eecc26b01b96879c0b5438a1d218820c91782f6b19ec5bb96362c09d1c9329912c45618735424a05c64cddc9c8b53c556f7b4302226440c6909339603dbb5a66a76e0a898c53c700270bb1c375c2c91c222b4c54b0c2848ce5208e18864cec0cbd86507a1b87df6929c80a6bb0e93d6eb085fdc1ad97a713e3ba1470c1c33dfbcd89a802acb9c222052073230ea3179bb75cbf107525a938b49a552b8fdc21c262740a55724ef28bb4d63bdfe2ad28b3246b4452578646623ba78509a286c258e69480a835c2b9820cedec3767e12e1d7b324fa1a51558b31a914d9568bb22e72a1b55714488a699fa705a4ac58daa09348022f0d65df68b8841dc7fba2506d7fb2e137b8e6a921788b5661657c677283d16c16961549368129397492b1a849005917f695b2305e529871b61811b6cd88a535692c48e058f9cb826bc53411248a15c39b2e7ba40000aa9d5134cf2471574aa201e12601662b7d393be919979681abf59136dbf44a1b66704d8a68b23ec2bc1f9525b986b8a640a2f754702ccb321205c9ee916f7342fa86c8f48d817f9f72208474d660b5f23186357f43681d93440aa562ca93d3353154a42a4790a8811439a84a19f8a087b8614c6825a4eebe035b794caa7fa1ea967b63928965ae044f9740bd4986fd3eb78f2d42c76132c89d960bf32197c432452b6b2e117b248e511b8fcb0fd850a57852e071b6567c37263d3b45bd439095ba0572584bb1990c0d287cc826f13468d87d91725586707f1c29c5a7fd4e67faaf6558fbb8990463297d00a196407057316b331cc911911e7da8a82ca1c77159c4d654b74fb89e5597ce0640ce97861f37b79b47291676103d6ec6822770bbb40cb7332b841e7243cb55a934c488555652189bac26c508b438ed6799f2c108d4357096c63080af57fffd17731e41a217393c2198eead7adc7099e1b0154a010816073882fbc2409a678f1db0c6e5942298a5b2088a2abd39b8cfa8b2a7c6057482268c29b88566c5e97042f8866f469b69ae16db06c1657f91a66787e4a06597a6c0dd2300a914ac1cad196d5564864c5a597db2c62f4bcf64c4cab3bb077d331337a6b0e39c03891a64a369b202c1b51330ae01798b3834eb87cc5bf234e7e14b5a419b68c114fb0989d2a67bbd0da491d75113790b3e85bb887d46ec144b4d8ec8bed82bddda538eea77d818c7081b3bfcec68d496035b71280b23985c6d9cb7580568286b405f937e99a8ac1fb28a927940c0a7cbd36290d130a1c23a42f3a437c6291dce36e39e8cf2ea8b9613c1fe7571ac74bcab99bc452b9c5829b586e5544e27432f06ba9c96869f5b1228a0a70fcf95212b0b2b84b45f29a49b6572483807543baa6e4f8b7b40119a5d483fd20224932a3af6869f00c8e9c6c5bf4c53dbe092d879bcd7843475a3110a559454a7375ac0418c37444a16a164acc751f56b2ac97a1158c76bb9976d750cd23761265d16473429c3da3b82eac213876c20d639bf5951e94d939985abd149b99c249445f4c9cd7421ddf21c536bc8fc2029e65d5c7de083296d88bdcf04e38d26dac500ad4457cecf8a795322f45997bcfea18ebf807e84c659937cde6d89fb490765ea9713b768ce05099e7386b4037b961a81edd79add8fb9f8ddb71ee56c349b453d2a3bf22c56730bac0ce19c4f961c008e03ed3928c7d068cb6512dba564855289bdcbc2f2b179dc7631b9372872d05c4e373577861a67eab16cba898beb2ab70c69447a156df0b36ef9c451931b4b7212c8a850799563cad55bc89fb3460f0c56ab434c5e9abe9363f1992577698af0058b54bb5b9a7b42e8d148d9dccab2d1a31d661018182ce207c036ff201a95b755e041f2e1623bef565b01a27d870046018cf65c8324fdca0dad64883da659826bf82721c3712700f435ea40c872b83935bf6cdccb41fe29c81e2210477babe0012cd635079d5932d42038c615a476ff35a523c7761d4560554c8ae0532e8d23a16912a804908411bab5fb96b9802737db82ca0d40c1a3b9913d81fc1330cee7504e2a056a994c4dc70768bc216f66921d93b81973b46352796d37b4f9009312aa957a51692ae8a65d514ab5bf7b46e0964a8f827adc51765384e8c35c900c4899ff30b1b53be227a39fd8b3acfea46bed8832c38555252b38cc5cf750221e3490ddcb80d0d73422ff47623282d273645c316181a36bf787ac90ec326d758ae71e5863c66b914db005655b1ebb057f8444e2689ad91a69150f71000ad7908897b4a3ba94c881c20271532a9653071cbd55669719b5c613abf45b3335d734b718779d51cc5162a91e4f2622a94469e09a41e8a9dbb3667312bc8d5ab7839374f689b32afa5a25de333126a49555909cb27002b18333a6a0d255b905e417eb8460d8f7566b12c99d2900794f4c0b78451777a3789c834c785274b65881bf055dc1875c6392dbea82811e49c34a3b2978468e10ab7fd91793b2856666a7c28473afbb467e60ba603230c5ef681af07c1779c6598a20e051254384467868c0b21ab7d89604153aa680611b767f19956a3b16229bc31fa3ca4315048b90f9f3252c23c02c92a6cfca28c5ad6adeb242c26023b8f76a914f888d39b59fdd1042502a68c0b416e6853e9cb5894253a129a1016108e44aa4257c2b547292642c3ab2c5abf1b5967c8fcb377eb91fef8c0d4daa3f2e04a0f869ff4bcc458f4c118a4b59715c6f3dc25a304b2fc9877d1aaa3af43a512a680f3e1bdaa90c816b95c339331f5fccdc969363977a7b9695dd6b9ba34809bb613862a0561ec25ce0d2dc86f262dc0ed164c2ad357a709eda919cda2c4f8806ecea55c3d5c042d2dca3a3925faaa9112561827dceb0754580814a84be19b8799daf37400cfe59841afc412ec97f2929dc84a6f3c36f378ee84ce3e46cd1209 +ciphertext: b2032dd82ec001fbc4dc819809e198168d1fe4344b0167bea72705c7502e9e562be51f265dd4237c1c315cf8d94fee5c62e9e5180399eb6a387297dffa5e8ad6403dd9a867c97e8240e458cd65ce2a7458104c66cc560c8da6ed08add3c1bdccedd9237fc2893a8f7a95b5ed0866675f81be19843f4e49386adc94cf8a75639d05be7a24bad56ad7425f0c93755835ab2f13c4055b841cbee776ef0167e20170119c034dd3d1307838d96a6072f1f040e26f67307dab2adaccd957541c7416148dd5401118b08ab5a0ebc679c575c9b60a766d9d39bf193f43207968d8c39900b8d8bc452411cb17a6bcd668545c183dba966a2bd777f25856a55593d86caf1c61fc15889b477bacbc790348d6f531f59b59205644cd6754016a05b484a1006ed5e5e113b360f516b1be680e45d70cd18d374a932e26ec41f7eba1869ca7d967c5d89c508d86b575f099a5d61260766defaa8676ecf1dee1ddfdac67bb641c4fb49d05deb7641740fa1a48d3daaae62f185eb157f33296a4ede459c736a909676fa8fe8ff4063006786d7ac07924c356ce78b883b03cd976980a475402d98e94d2e6dfacfca1af7e56f473597b4f2fababe7a7eb58a51e3b8ec5c39ec37a28fc088db7575995368fb0135446f82abbc1e6196bfa8996a9012ce7a44b152dbc6158f00c5e32dfe9e48e7ed67f1864fbbd6ca4d6a53729652dec8d714c765ea836a48b4f6065e3fd6ab90615d902d4c9e2f733129a5ecae9bb29363733f83c2d73e4814c0eb3fc2f0fe0a0da2a0cebaa60fade528f0ea6d3a49e08600d24ee820655fd727f896086df69597ba643b87df8b679dec1fd72b0e5707d84720e64d7d1e0af02caa04061d7cb9ecd1c254b2f28e1f7022c3c830bb5a20bac0031779f485978d4feb62956d616c627f7f4f8e38cdf6f411b2ff9de990fb8770cd8df8b031b5653c7025391ecd977818c463630494d25b7d44da52106138e798206eadccca7ed66f4b53a193d0cdeae21b65e84817fe3dbc1284a24e961daee2b022f575f4476e5fcf45b63c32db6439e6abf13dbdcd3965089947ef2243a5f907c3d95f1a53567b202074e5b945c23d06d203e3f4320c02fc569fa87ce1c837aef80fba4b3b2ffdd3cdad4ae7948374ec8c7c848cc82fb22f23bade2b52eda30698829e1c7ec56d6987dea2741344563043f93b20d029ec1c9fa0732a6e247e053796efe1753341102550b28ba9ac83becc5c34e5a648609a5fde17945c0b998e602f03a9f7904795607fd7202fc08beaf9a12bc6cff261e1ebb285784f41fc724efeb51727819e5e4af459fb1919ffd56a7cbebb9aa12591edaa69c73f3a94164229356b1eb282841d087139f5ef99e7abe632adecdf309337c50f0411f2b5f854e1c7529586c89127fa5c375c4749aa757b7061ff154e65046a39514eeab18faf003d39760a538a517f1350dc33ab94197a40539e8aa1279a3d38c221b28fb61705dfcc54eefa1f40b253b1873a8aa4c468887bcc67d315a753192b42af190021f7903 +result: pass +shared_secret: 8bf57e5d1ce24e9942b1b3f456d184d4c0937b9b699e69c6524e93e140f39c90 + +# Official test vector 8, seed: "cbe5161e8de02dda7de204aeb0fbb4ca81344ba8c30fe357a4664e5d2988a03b64184d7dc69f8d367550e5fea0876d41" +private_key: 5edb8568e989d33924746212f1b7131e5a247c6b73d58a8fb30c75b7161461f7b7f5ba4b38b924484964e7666dbf6177aa2662b193704fb19e60376614bc92e811905a293cba30a81b4401fd067f4185c3a0e72b5cb260aea81924b85105a7403bd6c6ee09627c13ab53dbad06999d276004e290b41720a70202c5f1f4585a68c56ceba1d7b21e079552fc591c6c3bc8f49c089527288ce6be22ecc28ea6bee8db35a8024a03f77e5d7c8c79a825ecc4c002566335e9355c0a91e5ec451cd81c14f355ba3b82e0a29365723ff30cca66a845e849a96093cea945c7d242461a94b5c9595555932ce43107e000c251f13fdbd699dfe6b5d2a3aa3b7662f988c39bf4573c59b38046317c65ca2cd9304448afc62190bb32bee74220b32b85953a5036065d230c2d28c80f0a164eee4b72b599be3a3961a8a70491d4ab680a46615450eea25a2fdb2c7352b7ce36ab05dcc5a933404925854ea5330563b41d477a775679c1f8b3e69690913216e9c479434ab55af2996f6b431d01a9f4d7904c80c666d1cab7e90da6f125e14320d46861bcc11d50d9b21b0196902a7e26b720df911ea80716cc478cce204dd796398d108d04eb31ee3027b8f0197bb89079e87d2abc641d7030923052046504788bcedd194c5807cca3202bfd25bae48493ff273cccc55446b2bde23547c45a36bf295b32e18122a008bac4a83ea05260930061d6c1205498549567ad11ce95f105b6e18fa282bf33c5102e0c18f2f44837980d85b26273c450c5885233f101cb8ca85039afd9e5c9cad0239ec63eab8063a3a76d7069b5767603d7f0921729910dd29c814a08fc67587de5020057add33c04bdc40c82015af9c7a41ce541a4c11832459679cbbd0626a670246104a33cb4d4769069253fc2379835be32e61ce6f12593d453071cbd7df3441d30b8540c4a515279def5c44a8c397bb018e4e377bd84b1c09917df0058bb8916caa26a9417b314a79c536576d97a5d0091787c24154a1aa9f2f39a70577e9d61803be48e2bea7c245cab5073cec1b1403775922260005f43706950a261b99e22302b1e63bb45438d9da39c2ee780e9db6e0b6495d0fb966c9352873a342a914ef189854832ab4dd42128527e9251565ccb21f6646654e6b78aa3466a0ac82337b90ed86dce3b0b62bb376827a5a1b467c63114e597bc7da7016561be00970200f710ef523ca3988068bbbb9a1a8fc5a94d37b930ae0758bb3c1fe98c96f5a90c94aa649a4647135b9169e6b81f18a192b19015a50bd39159f1e8ccaa881e34f53ae469a51756c220bc827546b0b9632d2110b86c43cd1b04c35bc183d68c1837b3b08e0c2ad5920ab4093142738a5545a5fa97951d735aec4a3e090175abd999bb1b1ca1c7499e7c5d46242fd605ce6e18047ae23231c605b6a81b320261cfa0884bb87bca9902ba3b71fbd98c0a97a53989637cd2078ea5cfab93b33b1396028270974b50c4d6c8f4c8a0a610ca689c981926c9013ccb06ac855f229d5a832c3bfc8f78b1ccee078b4e893783934115923f26d747312450aed0731d99375ef6b8291b39ec146d0a2218c9084f1575b11fb4894d372bbca066a621a334086fb392affdf4384cf64735775144c098e6756148a30e8ce75a67137ad2455860252b764c15823c08358c45ac820bbdc3525543a66a22854bcb8dd8e1c920a10f67e9c8d8495865b3bf16c39ab0a86cc231a521f42316f7bbe4d019616c167e88a40b4532b1ea688222a48150c6e24859edd0210ea54e4e80654b86abaaeb52a022742fccbb336921d5807d0769bb5674141fb791c6025ead44c79cf8c1fe80987086cda07546811471cebc7eb7e8a5c554a6cc0062bc6c0b10900a8ee95239f844d26527423c30f4a1be90e29424263663406debab5025e11f00e09c24058f8077cc2313842a5ac74bba5e26cb78c4f8557cd38dc67286d9d25b18f005fbfa852c5ac738f33c24e07b26d635a09a3e3d12c9eaf432a06c4cc88b15ee7c4258b279631a9756e5086145cc2adca624410d58db0def549d2c13caa2d80ed4a088531221e9881f16e39659c3425b31b4e5c0462df53375870c2360b984a881ade524777489b8a184304372464ac7099b6afa24a9545b3ad02ac8b9c968d0b4b6e991cc0a83550dc70dfbba36de192bdb2a2239672f011bc2924622ca6c2c7c4c334ea05db489ca290390e5a18bf18b564a037157006fb9131b35983a9bd285d66482863c0cc4270a32b13e1299328acc2dc4e1812f1522a88177e813a0e6b52f11573873fc512bd004eb31cbe1446a3b3518ae2253ed3204c3e3c36439ab128c322a0160a5b40a27f3ae6121333400b050d60e9fcabcbc82ca7fb1b1399715a23417691542441923750abec3607b47b380835191d6f790a7d08f00ab209a6ba608cc9cbdfc6c8f4cc194bb22c630ae48899a058bae66f3b0cb12a0d2e3209d995010644fae989eb94cae8128585933ad0f7282940606785c07e882031c08a20f4a194be008aae8ae5ce77c17505bb0854579712f7f5231d1c32301053e9ae2a1866b634949bcb4c6952fb78376fc91bbdac8fdf096d1d987db5c71e39371f894adff2a099cab93d5353ba013aef5c58796f906e7a434590181a793ca012a6610c912daca06903b719e384c827ac62e2b2590f82f29d00bfeb50d66815fe13085395663f722399c187cc2784198b028e585b305e6126f6a003b05aba2c0a87eec6b186623dbb37dad789f7e8ba7ce01a792366117c308601664d6b7ce64a03a03090f55c5b59e66545bc0c9a29a29d2eb89eeea017026c2a4b88ccd12c96816af697c5b5f1896d340a60729984857072234c71aa5c8fed44f05dc7defa39cf409b063e68bb28b3789344bce267db328542a5530222203d6d8858e51caeb8c913163a97c0759a1d1c3562288dcd48d164004b08a1c9eb76f956ba5a562a84182caa6417e237bbe4e09a5bacca54a32c76773c84c14401a348108b2cd83377f6470019af3591b7c65bb33833517ce53f7701c4b1b2db8665cf5259b6052e73b41ee2641e9c998df327f750c44dec00ad7bc0ee69992da9455c2b26e4c7605dddbb3ed942542fa5c255b4f9d037a4264939c3a26f8a817d9c21aa958677193c13a3b1b76619a66b2a0b351601a1750ff9b78cd4506e1c19f04671fce65c5c34a6e8141628dd696b3d5b962497ed3433bcd707537ac4715a7192687826fac2fc0a60fcde02f78e69dd3b996b937332ad2161db433ef850b4c8a5bc8a48556a927ce345679d1595b8a12a0e85dc5da576cb9d31e5146967756cf7356926f2e20fc7c1fde9954cb2f593d96a80ab860da1804ddb5aa9b1c6a47a98f8505a49bae2affde5fe75e69e828e546a6771004 +ciphertext: 9dbdea90800c59e1d99410f1addae674dcb4c432b65100834cf0bba07cbef7edb65a2ec31e8de08ba9a4815f004927ff973caaf09d359700caaa7f45334b00d4ad36e8ed5d88e12c7b3297eb2c0c40b625dea0520ba4e1dee5905cf37aef7fb7afa89f0ada61d642d12c008af944677eda3c5a53936bdf6810e16087351658852898b87f5baefb5c145dcd293c621affb8bee2756a74aa1b21b68c2f45cc6dfbe807b361b108af0ec7c878bd342f6fdcf4045dc70e14ed394ff4b39b453b0fec567b5ad743064650869e10ac49a9c18d39a6030707186d5ef0207f8fe92a5546fb4d32cbe6df84b3a7f9b6bbca8a86f87012ed69847913afd448779376f507e8366bebaa137474a46b9ee67bb0795ed780e70f6b67fe931ee0f2865148b2ab8fc58ce52d516df0854618cd97b07c5b1fb2730e500a03dbb633fbba1f49883663c6402066304ee8b34174be6a24c075181af5f06978ec21745fc4501da8409aade82dfbcb9a480377d25b3a6e7aded64660567918a0b3860bc5d71d2927a7289aefa9f5cedb16090764b7e245f31f745d8c68cb60301bbe78f1839dcd2eb0fa0ab78f4298dfefef779242b0fd3ba730a7771bb52c549525152c002a21cd5a221543ba05792aefd6335ae8f5da830452be90fc46c151d656c949f051e911c7d0dce2689f31eb58ecfa3f7a1135a2fa548b323c59223c6abd3a9f3101ff19a67d4746a20b95ddd31f30e4a650c6f0065872372ddd26885a41e43a3e3d7a830aecbc19c43911cbaaef663524945a694d514beebff95f670dd2709e859404fcbb0c3626177605d2a544745f16248cd2dc1c4943be30c9b907012276bbbcc978ba2a0d9d1d247743b7872639183aba6fa37edd6f0dc9cf7c1e8b614517573bc3dc88886dc3fe8e74bb1035aef74016f03102df50a57e9d4c212fb58623fd630df87191163c7643dd76ad27f23bc5801e6af3311aae5a6cf2e02721a072ade78648342d662f5d15cbccd03a1f9cdc35c9fee3b27843c2f819d246cfdea1f9b6807f4873bbde71fcbbb361b2d17dfb699859b26403a25ac45f3ac9187272a78175ed4a9d55047065b6d59698f296f92cad6f361058f400fa9c0770a762a711657da59c020096b5f8c235a2a74895cba8d9d380004ce35ddee9daec03f24fa6755c969fd007031ea210c9c1e542319e1fe129cf5a20a5f3c039ad502f2bae423abe0f9db88edd1db6253b972c92fa65b749aa6bd48e621dd13eac98100a1d8c63d84830fda8e482d69497f49a738a3483d081cf18dad0c62755840828b00bf09d1ba51211dd623f14d7ba83b45a218603cd203d5016725c98a36dc1f1a87a21b83fa70c47137cf2f15b84096ec817e417347a395836bbbf095ef6b049889e88aed5496c36780cb0c2cd3006054c4fa03e3177491183e72180c916e50b41d9db580a4e1101e158e839720563cc3a63bb35491152bdbe8a710bf4fe27f054bf6bf51b22ffc72629711c5486a3c44786f60fd04a4deb2bfda694ff797b701a57c5ba38f9b5b8 +result: pass +shared_secret: 2f714d31bbc778518e2b67d264065d9731c12149cf931211e649addd6daf0b92 + +# Official test vector 9, seed: "b4663a7a9883386a2ae4cbd93787e247bf26087e3826d1b8dbeb679e49c0bb286e114f0e9f42f61f63dec42b4f974846" +private_key: 1e981c27e35d12192ff6ba764b9715bbb53b6afc9c3db6524bf480bb240d905622d8015afa41b9cc78a3f039269c9579d1bac3f6041827e883b3a073f22758a8112a36b91e2e1330d5ea0d5f91a09b7a2463a1a2025425b28ba10d85033b9a8fc3ca7ae949a8b5ea5c6f5b706ed22e949a1d5be2a573306b8e0c226634ae3b500a24b08c771456179bb24ad2c3024c5414fbcea4455cd781bf0fb5439f67285644309a8b6454d76463e69f27870e9089463d9abe0f450d72572fbdd678d6fac98c7989f0990d897913d0d1cdc6a378cefb0e202c4389626dbab6646b00be17377fc027c27f9694ef320b48ca51ba744d7c7c29555ac0c1c8cc134572893bbfbe45671225273db5b54659a67e41b2dcc744ab120917d3c952d9c847b038b53c36a369631493681b43512968069e2c7c140550bae5aaf35b64b9f9b8fd6c75e8063108e7237cc320ad32a8bf9a74987098e3e828f99bc54a5504cfbbcbd36ccab973ce8e4690ca8a37805657af89c6811b8c0045ca3ff373720ca1087259da8a27de2855f32c16e7d7aaa32c761d2241aab42db19353de53a2bd125cdae17468356d63256e22f6b2eeb95bc3b343ddb33164e297c32572c41459e5890777d8623e3a7df541945128004ce4ab73e25763e1236d1a99e5408a6bc59ffc308f2c810b4c18ac29d72581f46573843f75f57986979e77b28355e7bab59a9f71500689d0200589a2da8149beb260241bcbd147af09cb545ff104a603c1e22cae6476626631256e3720705287dc984fd4b3cf06583344011a4975cd490488dec64653d01b0394b413814f17b207e1a9bb5cb1661ba5c7439244267859f1544e50b03911188bee97a12b62052390cacbc9c83c713dae170cf927c8b4fb94d1b0c9da83088bc62e9e112bac46af692c77c57c0008e44c08b737944bac8c15901f2564ba2056c03660e7c6bb25c1c6075112a20338b8b413ef9c7421530741cb0df30c785a86ad78aa519ed65993578e65db2cb31c138ca6820a05231dd56b17668490d9393911c8e567060d368afd9bbf3d9369b6b2aa4393899111b72c8014f1d967d61286adfbb16beccaf0971fb8a2257bdac12b60372a61768ac242df6b575ef18df59c174acc51c26276da960f34219b8f50728290c99ac8c6971c9032c34fe682a58de45e4b2615bdd08ba6e11af9030e1968443a3b08e2877d04da6205a274565953ad6b7fe40565c0b680daf685049bccde9bb6616b325bf11e7069729a6a42544a0e13e90df4b5a42c2a340fc28960b7171b638173057519568a83fba15e40bb467b7e33d9785ae34f9e705f2211137e473b88c978d9a49eb4cca1b5d6b52d5b303a3a8151ab4654544fc791755efc094222ad8beb3057a24bf6f60bb6d876c5f7b8d7e6358cd1acec6254d97075bf02af58338f1a787dd335a70fba4c2ae3625a840ef18b53f8d8a2d051a2be6bba4fa6c40992acf1326abe29b852c7592e052045655a9acb5228b4cfd8c54a43fa2f76ba3fc7b10c603c958174894cc0277f688020013c7352b4b282389d9c178ae1af179c3d7ce495f82a773035b08e512eed8b309a5294b904c46012ad03bc6466d033a551c700624d0055421cc1cafd8568023753735c1bba67bbfd117911d0be47b827ed9773e4d50d8d11a5b6481357473ae2a766156b9a4e74169a1b3cd0bcb90eebc31f587d886accf3027c8f6620aee70741c403e4a72d4bba51af5b1362180158fa5867d25168871d599b04819635bbf096c4980cc336267ac6b956bc861e0a9864766a18d4b8b9ea61a0573fe60a5ce58a87cfa2974cf17d4f599673137dbc662eee9706ad9a85d780a911c209644980cea134545375c031b8e1082b4c201ea83877dcd7158435ae34d52376816719070d76c0683e0c4422750a1959932e88562ebc932bb7ae688c09cb703c6e567e6d898b6e135f483290da271d7ef16b15d12d4e0872ccb05130f52cdef878ea83768ad44885e5a2dd6b2a94493ca519c14efa09e9cc0739354cccb3850cb0c4b504c2eabb1128f55bccdc17c534b5e68b94526aa46888ae970372ecd49a7f03171872633e78997b51ca867852e638215be32eb2fb832c42038624035de54d7f4938ab78210c47bbbc931c336917c9d2a0d58454ded14fc7fcc6f5a97a6c3a5649689286f0ced68963cf24a05e9851fe1277fed36812e5984290701d5bbf138ab76f32b6043853415790a540878c3bb297b6bc7b000036007d8dcc7d32e6b7544c3225c2ca861052dd65c8f1d103103959ed0753e81258ec3770360aa924357315c18b33aa12ca06b24f1c59aad1b4ebc58f3f75b77c1b07bcb9a23fb0019de06109050b0ce30e8d6809c8a0ca70eb56e366033841ac39a6a198c5c105c85899e6403781c72ab30bf1d5917035b9fe50b081b6cc6103b72d423237189c583c702f7768fe43c182075a48828d041178e6a616340178aba89be3418c4e968f14b9396574b370f1c7d2858a1fd78b5351213b7c0a7e05382d0217457ba27a344546e197b22256b3f031c9e6b65ff377be25b6953a4dbc9a6e9aeb3b08c01358e2bcacec80033990f282b0bda655951a2b0ab83ef4459ac56a76af2b2d2669c0239496610a4274c9b3e5e998ac948b3e7427c8b380c1077480789b008054373a7fc65080f3772d1f6626e345bb417c9fbd97add68640dc12028258970cba5deaaaa32c7b022b0183c89b3e1be25606b3109ef88c9f07180c110703153a247981b5b465318abcd0a78ad1bcaa15b07edb66bd77a14b23e84afa6500bdf15b588009f05925a2fb430b0629bb4c2057f8a231760d9255746781c83ce932afe10b8602a80fc1a98c694e80333790b59e67722a7bcc2fcd9b61a56a5a8ea6b85b5861b44b521cb0b6adfa9c84f624ad499c0664aa97270d1a0209897569a64650c0a9b2cac1879e671d9f0413be9621b415641ed645fad52e2ce49f5a3bbe49655649a62baeb5634e50807f737dcef63a7fe0c5d2f573b9bc5914b97f28691f49045ec87767eef405c3b3c8c6089e03268a5f0c530f1682c4c022e3804ade91c20a0793265a45be711a607465709a24dee763ac192d0d57626561c3a6092f7777c8dba75516c39fb49c2353157aaff0787be318ce2c7385101e4d23c043742b9c5ba0d96419e192c20bd426de458585e11aa4d5c8315bbfba129a446c80b726060be07458991e973a394f163e54383d14d420ae0b4746a4b891d092db39b8e1c708768046cb0e3ca324d417302e861358385229492a291da3d601a3f41d29a75becb44d663e9976d61a687df88a8abcc6651446b81b7d136df42bfa03473c84dfd64fdb3b56047447b810cc094d400ab204cf9ae71e3afa68b88586ecb6498c68ac0e51b9 +ciphertext: 253b79d4c00753c7e617c2d0f419c63f496505e5d1787e2f30b58ffe0ec7d22999e50f1c5e6340eebbf4c08e441dc6569f5871e855e1e6db8f2554c205147d939068da6886fd9f0a6bf6a3b267cf7b50369a3199b73e2f87bac62e79ffc8847872974d5228c2f73413bad09e13bb4caa49624b96fb1cd7b8e4f16abaf591cc91693f014dbf3b9157af87644e45ee7c77ae0a3f8df413845ef65856219e53ce32cd2d6484b4ec97818b00a766924f05111b0d26fd58fa2c1d8de8f9612d31d68bbb3783291c6e28e5f13a5e93078564ffaf254362e52334da424cd82dd608d082074c2f31e581950db11f2921efd8e878ae591e10045469eb24e29f6e6c6d3e025c08855976c69f5b3d9c55ec4d7c6ffde8be339b75dad2cf924e113af854f0467ce7e639501b52000b0ecdd6ef38f6c84e1b0fcf980ddf3b13a9fa02227ccd41c28c8d74b8eefd7f4457df6ecb1c7a9c48dad6b8696d10aafa08ce0a5c12ef12696d50296395b5e88de5dff0cda475b989419bf14f745ba5c0a50286bc437d538e4049c6ce27e6b57d11891e85af7d2627fa594462ec09d988f8de48ee4f0dd2353928cfe0930745b7c591badd31a946e1497ad7dac6738f290ddccaded623117379556fd2e4d9d9a351cfa44d684c84878b307cd760583637eea8847b35a9d119ce9a30cc5d717be934480fdebeda223bb6c188b16827cafa4390adc9e50b52458411b931a540dd3596f1aaf2980097e0da5390803474fc5b1497ea0d22fe346fc3efaefe9285954c82439beefc0134775c2708695ecc7033fe80bb27d8917374b347d22ad56c7117459148bba9d37c5c9de61f2f78336b2fc3878232bc8c9b2ebd5428296008ce5f4ae86e08dd614bc1dcabd667037748310e3a30528613449d8229da41b03723719faed932b886f4b4de92d236a2248d0cefd3c56b5b9d15746b39ddb98baab417ab393d00e55fda4e83c954b2dcd0d0b2ed6314a9169e2dc7c7f47b2935d43a82239e7324244d3c42c3596a45c91b5c950a92fc250f9cdc11bdbba455de56810904e4991f7646fbe1d5dd503ae7dd13cc943a6791aa994748050cb59668e41c7c273838c2f294074a98bd0c1b865c3ac9d7730655cf304d6f00e234dcf51ff952caa586ad7dcb97a27a13b48d5a5b0067a21e73bb8720176013525182d35277fbd5f01aa928d478f0080055f2efcd9d8075f8cbf1c6464af59554361e9da4840066717b88726847b952a49073805a62e8f232a954fb7bcac13e1b2a444c4cfedeaee714c76359ffebe134674e3624207234bd5ea682477981c2b083396d1d33ed90dfc30245831207a38172a8826b9e608c24931d1e64a348f7b2b1511f3beb9f26b38dd96877d210c3484bff64dfac6fef55c250016bd8d427121d0eed2259b59b33f7a72015b35bddc94a473aa5601500483e55c29213023d095c26a06dd0647019f9d0057f64a638e63677cd1ab34ecf9d5f31e801a31c836fac22462c2bd520e5a42e8e0cbe2b6bbb7bcf21224215638ce5b46a2720 +result: pass +shared_secret: f2c29a0a4782d83f2073c7c37d90556b1a005f072f94063d2db8114430f36c8d + +# Official test vector 10, seed: "980d0ba7c8f8b23d0e948a6029ff2659810ea1360064663a8994d0333c8543ee5ff5d6d5c9acf446e61dc464f792b9d3" +private_key: 6423bec1793d33f81bdc6a591ee2bb7d7c9c29e43654600eeb353459a19199234ca950ca5e51b3c8b24c5a96c164086ea746c3b68582ee171c0a03cebac11b39ea6b1c5218025118ba696da2dc9ba9a87d197931261273de87bd360389016131e47b66b54216474cc8c68c6f8485201692a53d3cc06d6bb1a4cb19a69c435e42706b1068c8872412e1520f7a2ef7cb361dac74f339059108277de75ec66b76c7d432f84bc17e5c20f0a94764c66dd8738e61012960b9b2798b4c0dcb213c0672b5530818b82a6bb29277735451147fb4a4a1bac36949227479b74c358c2b3ca852048ac6d52872dc63187bf87f47a2c3024b41aae5ce52e56607b5541e67b9c528503013354038197a86a2cae824b6d282b37c8332a2bce5a30f2357022058779d5a2e266430b89b3fd752cb5ca26ee317c628061c33203787f2865342cb9012158c113e402640d5e900c6db4da9c1162ff9079b482a4eda56b63a626572734c417952ec894b10aec7822121a78150042ad321a70554ae6043a6f0fb12c411876ccb65bfabcae28b75126189fd8a1cc5510a95d36fb2318e96441ba4dc09631166905579429badfdbc6bd7c231c971837ff422327c5f769a1a89668da2669eaac1564ae75e7df44b9586011b6cbf7aba51ce68260b5505a99207438837a2c67b047896f9f64c1b2a54959061e92c8a73742962366c16b72ef3509b11748bb819adbd0b400964be48cb7adda5627eb578933a698ef8137e362308c32af7e93ec744984ac31dbb34bb8603b48965ac93891de258a9bf942c36ea4c8d7c23a3978eb5f176554bc809d5946828b0f4fa0c55744e702a715268b8dc684133738ab9cc9543a74164e9731854327d7361b636069ad00184b5b3ace48900bc0a28411c123b4c79d1a22346a10ba3488732b2a9e194bee742a36ab3c1ca9003a76e28439c6667c3d6a731873150ded546f132644ae4965ecc29a5c961f04612b194b0509b3157a80859c2a95c9ab2b5486b3fa8732bd4c18bd4b806148d64d22f38c7685c9934f7b990cc378106579f981c36d5c99a26dba6df2921c6385ca329127342cae148974d2b2faca90adb629020104e4650acf41c5d85036bcc30581f304a5db46b269424282776b6ca06bb3119a009ce22811e7a004c58b28f6ae24ee8e7499b331749db0aaa33710cc9737ef18dc1994218ca439a46367590086efb839589380560c6cebc4db59cace187700a80508e3c9fcce960637ccbb4c8a5bf3a6d3db865696a5a5e824f91b7cec516415db47d0b706b99a0cf5963875e89a08c5272df90987a7c374de99113b54bdc5063c462011e225f223a377c3a15ec81c376817aabb785ad0b5c2a0bc7e55525dbbb305396319ed108f7fc527be906f6e20b975b9eacf7c6cd574debd4027bf367518a0062260d0879b343783adcc44372667aac541b454a84b8cb6fe1db9589e43950761d82c512ba923819a4078cb620fb750464d10e0069516028b145628ff1f06927965935e5b23592959f9b39bc32bae290a583c24422b5545b22846e42cc1e45bfef5396cfeb544a865d7739cfa0891a01d1c2d36c6f341c24e677a8218640d12cca27792ddf9a488afa799e580ae6b08287fca4992854f318a4dd4188f7f334d83a3fe0d5709e89b4ac382e9873baf2525afb10a2785c5ad09c4b28b311b4579a79f06fbc91378109271383ab1ef7169385aa2e78b70d435bdb604494a246be23b1f26874ac9165ab451355f59686a33fc6cb78464cbd98021ad69c1ed12511ef99428e3b3685380dc2b16c0ab5cf46425984702e70fca396140a95e2c1bbeb245572049df3a4192a420fa52bda254fd55186aa960669f7ae2d69954aba444fb9c6b6cbc42b5ba82e262957089c76f48ba7362d6865259c321083c464bdc992bda9635cbc88ea89726a268a34d5cf1eb9aad5347350f67d1fea925f5677e393984818053eacace1844fc52b43d408761c385cb5491645696339ba086bc733c547546e540ead9b1a7942a0316cb635a856836075d3a87b84b1944a5587cb33c653e44b5bd764f6f8b06aa8688afa0526188fbba82707a326817087ea807e2ae51071d5badc027ddf781483d906259c30ee410b69060e4f47222481cf9dbb2075f330e4cca839b093668b82c02680c236167f3621921b863cab9a42e420a050986d481cabb873b6c19fa34b7e21bc6c029598daa77e30177357ba8b0e7696b692116a97ae2f535cb5208c93611ef5e952e76417fb974879337874f3c56d47a0d695797e1313e2fb7c3c6b2c32167f7faa9f10d18d512865f6a453e3e37c5bfa100631863b4a5f4b6c957eeca3bef28f62f98336c05770e001d8fc4f595921826cbad9825a76048aef2b4d97cb354784b4b6768377342685f87142ab06a67477b66a9457c48a2f779e0872cabed62d6e73278baa3406922f8ff5465af790e02310c9b8bf6e1b2987ca6521c55bbadb249ecc26afb244029312960a55fa45b448397264aa03530b9b56643a0d7cb9a73589955631883aba865c4d34fc5f5a6b8d596cb2c4db2b740645eb0a29647089ea2bc8a92bad95c15f52f5a2d24431d83ac4e701210c5b0ba3f31bd0086e47ab3f7984363ba00041c082d33064f1b27ff26958b85c46612c6556561a2e40600ae14fa70b4c1a81109fa6822c01d0c2786f0e17cf198009349704159866e557947b81928feb459b2337f3dbca2c82162107b5e34aa202b893c103ba5cf9b4580107c1f36b6ffb9ac34c2cee189571dc7f411349ad112d20f35a740c216ff98175563599d3cf6224ba230c2b2f087525059f9ab5b80f63110719972156aa30148bfe4c907b214f683c56a38a146e1c21e688c44f40bca8d4a87d3011bf64725360478359ace455c5e395625c95cc84ea3f0d004b2e3a4a12180a1463a234c4912f00be8324906b3805151841a1f4a5595621d66ca8b1863b6ae4869b4c93e2c6c94fa6af25f37e992cbc7ad23f6a274bec8b537f89b996439b762b2faca39d1f743db79451cbcba86de02a9d8567d8977d12066a1817bd9fc2b1bda75b9d6c78a39bc851654008b266c45361dce46fb2b02e4894c784f0b017428db0ba8f1ae54f3e8050381a90bdb073c186aaa458a2e8c682b919741836397e3c59e0ab75dbdc48976a6a474969356a75e171bfb2ca76e968191d970cd9e43d2fb2843b2a5e9d24cf4b2ca947e01f0c129a763ba55b9b92260c21113c03c7002bc8c6a2c544af711c18030ca984dc584e0b0627b3d23abd9c4d9e5087bcae2bfe6581eb7f9cbf532ba6c0cfd4113c5edd408adcd03d38b12f0b6ac17525c618d6d151a761a9eebc26358d6c42e7270ee2b77b6045385f3d175984a0e260363166c73b0c70c971644363 +ciphertext: fbdba17a3ec14cfc5f113b833e70ba6bee49a459173a7d71f6914316f042f06be6d31491389cb3d2661a460b91b84f5555d350e19f5725486b60f1e878143f20b6cfa3f9ad19c11d6cde78681efa2d75d9710a6721cc75cfbf8b104928796e5ad870a64688355654893a77ba7caa40ba960a55dc8dc524198b3a029cc9ed4ae7f54b36a0738affdcc523efd1d7b044dbbaf6149cfc90f548918d458e1ade92d771ace49df76798b12d91fab71c0699767b7d2a409e3a20e84c24402383acc9818a896e790d1f78703b16ac73f85d08f9467839f7d53b29696266f654eb5141477352545790b207d846ea55f175302b68973c992b18191bb8006834d249b3fa6175c33bf758215308c20f4606661a8ba0a9bfa754597e8bf794b2d2164d1d9f03da16d0aa8945752d65406c60e3569cc76a174854046c729d7a17de91a74442a80267db0e6ec081f4783c5ba636b73baadecad748792e3c4830ed4742e4820360d69a4ff732c277f06dea33fc765c07a77a9a909683e8c8e908a3a9ab4063ea3342ff69dc971ec4b5d89dc5a33b1e195cd648b6a0fb5d7ff1163624154c06ba0a8aee57bb8ba503160f5196d6fe274bca9b8e1ccd9b022f72bcaa92da257ead51409f547de03a6f1f643610ba9595be80428e1bd73e2125184cc6b9c97242a1f5bdf7253b29cbedac010d497c0512a56e4e501ef17619bd7ddfd929a09db29e3f4a5a3475729beeb6fc2bc9dc9c3aea7eadea3aa4e60590c2593f272f3157d257dad79e3dadc34aa8e740e139ece60e977952cefc808a11d530a22a10bdf00332a4fc43e4e31aafb686403b8f7883d580d0e46fe8c1c95e4c791038718fff25bb7563aa62d6245bc263f6fe0ef8ab63cc3cf8c47cab5e6147a0d8ed990f32e8abb2a79292cf85e5b269040144c47f824331d5446d30729b00bcee6861eb9f5cdaf901f64602dac1dda268b992ff5427fab223c223f0657177f7f0babbd161bd7027b27cb12798bc3668fd27c01f4d465312c3021ff559d9c930548f073bb7a84aac0d8ed509b3b0cb4a2bb4d44303aab75aa4987fae69d657a6c30ef1c82747455c3940d2fcbbb091ed6de1f0dd64740d2e21ac39e5ad22c5ecbd8340e7afed3445bcc41c92e938fda044f4e9cb145f0d5a86c87428ad01c3fc5280c273e6883c4889139a343155aac49dd257a13e3491418b1b926ec8e1b78212a81e313a50c8fa9473cc00e05a414a2ea1e14292c3b72b5706a7753e0e439adb63a93e5905978d3486bd5dbe3834b5253086e15c57902276a3d6f405195c43f6c317aa7a3cc2ef21fe89f3a7b4660f9f4b6357d60a129e265bc708b60ec2a1fa4f44ed476ca7f540ed4495e8ee4df67d6476793402b732546143b639cfa186f37b1a612dab0619cfe083bee29d29f5094697ef1b6781445b01ae64369b738a20b9387087481efd84035fac494af47158509c64333ec412407a549a36bcfe6d5c15b1668b8570c75110daa1c93779962315e0eb0af8c056b031a787253525438bce41121026c0 +result: pass +shared_secret: 13c99ded4db3e6618f5927d58c89afbe83c86a86ac2073421b2560b3f8be5aa3 + +# Official test vector 11, seed: "6c029462ca42ed520f10a579f52687101105e0b90c6e7bfa582a4c112b579d5ad0a0abd38f72abcfdcaaf5893a112bdc" +private_key: c062bfea197ad53bc1f0556d6dc8a863d46bcff5bbdbe919d96c4099627710b0417c889aca6964a75a336eb5aaae40674ef3a3f3f96d9207cd0988cfe76838bac93b4ec866fc4b6b1127bdeb5c9978ab3cbaa6999cb508358b92cb3a859754461bf25a471bca16ba9259b40b3cc31ba8831ee9c95904b9303be152827525db350f9ca65183b63a02b289192a224b781a6b11ce7a40bcab396feae20158536ba9d86568401aa68b42856427b9003053c15d7d36b9807960b94b5f3f366896c59298689efb101c8ae162f4b4b53d4bae816c01a56bce8c1232548007eb887a93703b66ea609869c7155ba0e8e509aa7c29dba60337d8364ab61de403a45f49041e82671ca0cccb5002efbbaf65a7b452a0237f1979a4988c524570815017f794a7bae806a651a732659a36938b86ab36f7536eb27c5d9b72cee990131c1a6b31acce8fb5473cd0cc8fc2605b3c06f24866a36138e1148f50c9a530c24911d031a0f1a2201137ea201eb8c3b788f15d3c0b0fad52bae069818480132992512bd5b57df93b288a6b9a18c3d1f337d733a6e1a7b7780b45f3813aa855c64b004ef55b89da05a85b1c0638f56f6d6c87ebb947273277a9c5392e489afac0276dfca66687709f69bc73f373c929c7cd37c01cd2437060cecbeb1d045671500743ca451f7d9871fe252ccc39c341860a25d47ca90b18adc3af22d849389022ddd3a6e887212d6c9ffeb47da0131f76c9cae0467c35968242118f0f41330cab99a5412642ea0817ea08f0d49380a94952956346087012ac595d85a2339779c956abb2b25fad4512ca46527b54954fb81bbf79ccc0801279db6d57d5c16da1374ac841b5b441be3944003c30a90c56ee10239e746ac6fb867a50808839639af13f36d516b5056605236f57572844d657ac209135569455d2349ed67f3715902c4b5894229eaab63d0ba964bbc6884c1b57346caae6f1bc953b62f73827ee67468644ac383128ff6a3e97ec0ca3689a50ec5aa40392bad95e88e241666b18bc7092f01b9c7b3194bfa77937839ebfd2495ff29cb659a9374a8dbeb51306a21553995ab9ecb83637bb702365690812c3d18196ea0069ebba9f952b6b468b0e9846f4f7af8c17054189cf5c2200140ad0551697387842dc20a4eab8a1f0380934eba5c34113962c652e11c97a0144348c3218d371380c476ce987870472d72a38a2475539dcc545693d4a17af010a8ff93873dc24051f7a69ee7c3297ca508c3229d9d215b95b369d4126862a03531bb1fd7092bba391d5541eb962b403b50565253a1b91c63901269d18bc41003bc75c876a277adbf709def9b54447641f01027174334d963813a678cf7507b5562d1028a63df2411f6a6d5771c60b4a26f6ba1971943248607d9ec3b72df5b98802ccdafba8a7b0661a662c87001c3646a888208cfd68996fdb37bf9906ee99a0d09693f30b1c924c919de4b7ae0359b2b159d648bb4fe41d197c8d8444c530995ce8c3aac17637f699ad24bc0153fc7572c759e741c1fb71982fc61921c4515fc260afc58fca4a92dc3b9426f717cc0b60c6535d1f34b4ef858bd12677eec80451791191148a0fe00343d0aff44250cba46b9b6263594c940d40b119341d9e23062c693509304bac635f93f91bd48b362989751078ab995408ddf6787ceb3f99c6802aecb703581dc6979c4d405dbc80a985f991f31924383428d4f5a2cad4acb5f95408a3406ec53425f175651952f5b76acfe2a465b30c1d56ca0e53953dac0ee2da352a687441f45dae26b37ce8008a99308639999d325ba89585656a6d59f51d10e46f93d099490c2385788c994238ea1155ed22c96a5c5035a3488be1c29e345ebcf6b1b7288abe95c29b272a7817704bd31589a42b22053226a43329183f6160105ed05e73203d172354fa176d3fd084ce690a8b6a4cef4035a3e06bc6464e8c913b88a48c81e58dfb1267ec6c1462d93433193e50d1b2d3e3828e90b6a412c1c45668272307f4b8294f37b84857bdaac6190706ca31380533c30643fc319c866534562036b37e825462c8442641c7817650333fb02ed6a2bcd6c1ad0689001098af3657363aa1b689a20683044d15275d0fc3c9aa720c8c4c6212fa70095a2243232cdd0b0fbeaa1c8e7b45ffc2870efa9bf56c8ee86659a618a0a96c42acb48ae125af911558f7cb20c9cabc4554c8fa6c70e297625286456ee625afa756145c41373ab4fb59b2782b4a406115de4966d07629cf8cc2283b4307e6a058db3dee6413aad72f89a7c1ab4131d8ea9df020b033b1473d92c4d89aa84f044e429a43b4e22fbb693a694bba3e315e78475437387b78b33261d786288b20440c44138c84f5592bbe74c1c2ab01ccd1124394082319780b24c593149cf660946f75a930f0a8f93a50ed01b5276ba96ab6ce5f794e638697ceca94d80585ced04310612a3c6cad80dccab1c1cbf5e08b2bd6b7df8c4cde4c4507a56cc97b456e10050bdb3acd6a7e00c1742aa4710e1674c59a8240680d04b8829752332324490ed6139b550c7a832862b2c831d4093db2b256f702850bba03053fecac41a61734229b2dba3210eea0c1e8d9a54c915f54b32344296ea64855dca92ab81aacc9e73153617d8464852e8208904ace7b84509b2266f9fac55bf68378d98d3fbc0a468543a8944b9975637162a4d50c7fdeb479daa8ba43938333b897a12c224ed1c790f967b2d9708c6b67640ca9ddcc1562613c2904c6f3856d13d904cd3094965abf1ed32ce52b7dfe4429ee68a8a3ab03446376d6da1de56a7a7fd30688f513fadc5627619a99d191bd4c0ec8bc1933c00757ab3e1f5826677b5e9bec2b151058bd9a6b5d2285122c23466312559c89a634abc2a5a11324cebbda8d167880f6d59bc5fabcc23487eda84f3543386e0b8d25422d5051816315532d2120ea4723809509bcd0c2edc1c93c275ade244d4f5b27f73b0941820da0183ca2b7af8480c90243af6334b36af00bda4c1e5f50463b8c350923b4696b7eb733762d189c9eba08c09050a4946388d736ee73c62f47cdffe453776730e88531f07abdd8699e8bdc9f05bb12f275c453866d46519ce2a592a1052c1e0c6b8f093f53a057d6d1bcf759abea90883eea68c5344a0ae96cdad42f0e756070dbb496535b9e7325c02badae5533140b0d9e013c75013ffdebc855734aa9947f1ca4b879c35b32c862c933479d884b2c675d3e1bbd26391d7c429db547041502307d975aee26905f7fdeb44f418d3d1fb5b081a3b06f87691170917a1e9f3c2cdc71c5534bb819e61a9d8a257ff2eb29598ae92eccfad38abbfc9bccde5ff95a1c812083bfa3b670e3eaf9b443702fb6db16ac1197656bbd61a8e25ed523b8d1e5 +ciphertext: ba4b796662f059b81f900442098ae7c3e5cd9c614f972d4237b2d968a3065ba203a31e13cc8c993eed58ada9b4f443b605ab5768cfa0f2f18d15a997ac911da943f27340c26082d9e2a14d5e1c7aa180d0409142b607383706b2ed5eb6ebf14cf2a18e8604d692d551ffb4cd6cee0b43648cd88a44e2735099de7bc95164a21173acb6ef167e00d16b7e16fe950614cb738e54eda7a50d6ad2579ed6bfaa65a9a84b9a7cc679e41b88093d42ec70683df65e568d5139561c3d4538c50946bd945c02d5272c5ca3d14482fe3c3b09d52ef42e0e521806cb8e902a7d7c25f6526d32e0ae2f585cfda19abf0364484b628669d92546eda69fc6a60845bc33c0454fa631bdd0630037e195e79bd0e0c0b998fb13dbcf55f2fe766f53cc740710f72c98156963b9e5c46a3da1430c00b05251455c984a9a28a5ec47aeca9f04563f21db0b5a4c058c6549082bbebe17542247c4b9642051c39ccaddf10bb0f9ea4a7331f7c7236f4d5664fe7bf04f5a4ba41bc954ca5424167b6501d82afe234b9bb61e22d6767a3342e8d380e9612685d5536e32dd26ac50f2658cad77660ded9f58fdbbd3db502a013ecd8c045cdec7732e225d5ba217dd9b98db1b4218a02931bde33115023d6bf1110f9f20e81acf521242ddc7d53b819ec0a78c3e4898dfeef5f1df1e75c5a5c208a29f4c5bbf40467559c492112652e8c742f9a4388a70fe499ec33f818a3e8e0822936c912f9f83a1b18010e3b1b2646dbe814f938abe76e2f21eb814a94f54b52704ca06c21c492a8eaae7fd263adc133ae4478fa32e3c0e9bafeb8021e3c79a1c695195fd4f089e1cce7ce6ca1d80de31f3810d012e538a39e4d1ef85c97aa1fd8f46b4774f687b9a803405dab5406d66a3979493a8aa3d49a1eb9c89b38086e154fee3b358d6b2ae9232e22af443268489cc44f2ad1536fb116c1906db03bfe9e8f0c79dc4b59fbdda7b1afd82ebb71f23a48d9d3910a2a728cf8ae1e9b62d56897e4e87037f4b79b07afab072248b7a8f67dc1940bdcf893cbff906871318304aa0e206bf30a16556773c656d206d85b3751bfba156065594bfa1a2c335cbe588d31648127e042a42430898bd6ec82e459612c6a354df1aa8819297ba49e40e97a74b177317bb76db3fd0f72ab9a62c6606c4633bf01153a64319959385aaa13a34dac6bedcd14d23c9319cee93a26dcef25ca7d082d99a0a9e2ab02c05fd2f316f8caffb0b72ffe656d6dd079372650b749d63847e29cf3401e59279bb276fdb0a4dcaefb217525b46ce9889281e4a4bcbacad327b160d833e17bf0b38c8c706854fa4f2e0dab16d33ad120d300e50c8f9a076fbbfe35c07753189b7d598764d24cf7f0a6aad0f0c63d36445cd62fa38989c215004f0f02a8a09a974619b208decfd60fc6a1ec781f426aa75e736c9ccb34dc98350f49e49b48430241f6798125110495d8bc79ffabbd3eb91040197124d6f80c9007d2631c8ab55fa5a98488a30ac84ac65a8c463fb49f8111f337231408daa73f96e +result: pass +shared_secret: 83302cab48eb0832bd8df0db3fce81595754772e4c951c444a1b2ee9f58c48c1 + +# Official test vector 12, seed: "db00120937570d62331f4c3f19a10465231eff46465cdee336a0d46aa1e7493df80f18617f9ffd0476cf7784a403ef4f" +private_key: 77996be8a7ae3546a363e340c57039fba8113adacf805385ead18c56b75320cc714072c4549a225c86ba31212146220eb217133a70c987e3819ff1b6364806d6750b9e293ea05013c1241e0760537d867640171741645f18d451670007ad4c971dd16dd3c55f8ddac186f029796979ed9091cbab1a46d093b1b89265b7a5bc81459dcc638ef08aa0bab48ff95e48c725fe90c8694274aa6365ea4bbac173a658bb3f2e646f9d4645a914b70cf92394586a3420c60ff2290217576c43518e1088b703cfbc3a3837794706188b5772c03685c43a33ae27410aed7825e2f2541ce67c07f15a71a5910422be6ec94631b1b465443b7215c30146c7049076ee1418e932c2a4061c1f1044b7456ed355851c41214ac25723ba486cd575b608359d2a948d85895eca59dab3cfcbb6a366815dabe7323ec05ccb9042c994b18335077c67187f352ab30a06d1d40007a1636af51602f936f7694a0da510badc59fa21b3ad033f9b03103f6655feb646f217809d00a521f6227876263b8b7663610f0392bdb9a5089362828bda10667a36af12bb9ff090cdbbcc6b1ca0e8259422f376a342944b118f74960f3d322bc11b0010ac32c49584003b2c66198acb0239d7a55f7aba6fd5546efec7a27c39c658d15332ab36f2988754f86f51c642fa087bcc935219e2b35ec7aa4194bfcae007e465cffa530c6b9982dcf98924f924591b2542b34fd28057e189a0448841b121a39ae17ea5d7101971b26301c43fc84edb0b8b0cb35d6e729955208f650610822918589c740667cb31b169ac104160647f50c77924fcc6ccf95ad81603aa8481cb4bceadcb3a6761b87831274dd8c5b6a7674f0412ec341589c303d6833fd3d25fee059c5ef269f7a910b3060fd60217c7a83a75c53115083fb68a9ae2da8f906c13522331b329c6eda84ece980284d9bd405b5a8ccc821b8aa99d49969871448d3921cb2c8c8c3b4e34ec07fdd299c532bb291329a4555c257a842d93badabc414778c76b7293e369597e7c092a3020ad72b5335a93cac4cd74d51fd3410da6caaa98085d107ba0dc3070a1284bad4398ae8b9acf58992397c9f0f9b2ddcac60bf539d0253d2d3377903a6963597298f97a82bc92f7160282e25387f57c4629a0a3482a563a0b1c776c18870b26e289b511ba601884864787cd922b84b7cdececc21e07120a9c5f23e5aaea649eff523ec0b54fb5face103a1a30714f6429421dcc4c3066abdcf33356c09109eccebd2a68acbcbdf3b162fb9a7b3d1c3743ac47b5dca488c561caaca4b2fb1a86ab91d00a65e97b213125836bf4190549c300f1a010515f0cf3c5acb2bd10a20851078df28999c831c14cfacc45d5872af85800431d350921e959a231c64103f332bdd55b3816c150b61defa324f7dba659e0ca30b9bc6138abc707be19a476f857ab9226cbd26a31e9f6a06d72369b6b5e21a7bf76538da8fa06fad879ab62c292a44e448b8252278eedf1bb283ac71b93b50d592bef275749c4c154bb669df436f081785988c42b99270c1435af451030fb08ec871285a9720646acc3cb015f63c87cc0bb74705188e145efe133b657a9cf360f48dc1e2fb11163ab31c6613a51307641e25662032561926a6380b6d6d90aabc5617126aa509168eca264ad67c5cccc5320c138e4053b4376924e6cb250b3a61fea8689804ac3179588a29196e05d0efb6915b3526d945cfc183dafc40d46537d907a292cd63b950659ffaa57e280ade8c09dd80655fe45979b612a6c6b1e350ba0cf433552e80f58c79d91f5cbff0717f3161f83b3c59fcc021bb5cb1922b0fa3c29984bbfc3363333f561dcb99395561590409fd7b56bb7db88e4162a61f8a81ca6b55af485d9b06645c42d1f706e9ef2b3d6e425285b4973202d46f150fdd4a6bad34a455b274814ac5c4053d680bfb4816578342fad152b798a1d592a3c88b45bdc275c45a862179557d437304151548a568159691282bc08f9280bdaf30559a3a177e6b8a62b101d8342c9d72452e05bbb1634cc1a7465e479f100b6f2952dab8ac806c27a8c555ec20a995c25a9ea8c090261085bd65c137a630e787da7a6b039c38573006c79bb5c20e39756e1a72e2c016f6cc997464546283d76543d9774345ac619f9200c308c25cea332ff25533b7983db495100f24a42e4a8df11504c4b96c017871b5a594e9c0b241b01e066043d07a366e343a08ac561ec5a08168a1c61755d5c33bd693608f42e63706bae5cc8c7f47aea360093fc78045517be49566f35728bd6a8230984a5e21133b63a9cb4a7fab4befe053e37bc78900141eb21189cf2abc0764b3cc507382c8db2320ea49c988c5aaa7ae896d10702c2082a59c3a457f382f44a1f2ce5b3d29a5a08d047537163916c5f6b22995541b87e1904b62a3585429d938a1b37d419bfc533cb918a424b5a1f73a65a8605edfcbd00678b6361399ac794f2cb0c9b26939b09baceb79ffc55aaa528673ccc4a5b844ad0873b4d6a31465cc479c30273aa2edd362625512012f83b42d52781c3bc947872c78378164cb0e077cf9ad87974c75ca527aed41a8b6993073d711c1873965448b14d307c5b218717b94ca27b354ff99de1f581e9561ec3cc196d1815a7a60a8c9a94cf4354140cc5e3b98bfdeb9c95c7c87182b878ba20939a0280e2c453567215a15803c01f7f03bb0b90741df964c4fa02f1007c466ba6b8f78bec07956611420220499a013ad3e3a874c4ad961b02e4c27a9ae71d57377dbffb556334797ec28c701c220129b856e747b90aac0803b2cbc7b0bb428583b810efe1727e0598cde9681429616c7b3f8bd8b691841a7a5405ad288f77b652a49c38eceb4088201b651a5c65bbc05e40a7a0f4151eb0962c34b10c1869a003cc4cf86d39036778b3ca32d0c500f7918cf027ef920b3718ab1c191618f294866b2fe77bab8c84118ce55157714ad2d054102a4d38ab73d1f3967e98351631582545c5a60b3aad50a7852c9d43b945668bb8b6781f56057ec058b2cfd6310506133e38b75fe3086d990d92cab098f06cd376531bdb8308e5a4d2e323c87c36e7ccaac87b00a7d4cfa3b3342d74a02d888d702cb44bc31201e41fe62c7511493c068a92717cc5513045bfa197d7f83db35798354797cca7891392ae9587245e92974920551d826101d44d9f73b3113746114ac94b8c8e291892be9c8015a0114ee44e26879c02084b0192194b922284956a8fc2b26e9071847fb901fdb6603c3bf7bbf5297bea11539fbe18868709fc57dc4d46d7d541594b53b4aec0d9f86a6377c63ff80150e40fc5347714c07591dc71c6beb8daaafc8e9a30597e4b52ffa87a54b83c91d12a5e9c2cd90fcac2c11b3a348240411a4c +ciphertext: 260ce3c51193358dec4426f6883ce12fa323c9c8e0dab43f69562fa5daaa585e720fd75dd126b0d45bc650abc220a11d6551e3ecf31d407551ae591cbafdb1fbf7d2ca3674d8a18b6887b5b55aeb5b47d5d739634483624207b2ff32a2932029f1868da248b0583b32ab13b87c57482bb2ceeb6155d870676a6591bdd33e018d9bc2a8bd644ae6d54bb4ea81a627f9b9fa74b34d359575e0307462608bff54c6c78d0cae95d223cd2c0b663eb414007c3ab47d57dc09932461d4b93eab0e557404a53f99ca160c8d9fce51483c68e1f95b10b11a4cbf062dc9caeb89c4199d5fb160c8dc1260ad21cd26319c95a1c3aaccba6f54cd8541bb937bdcbef82b657949e7dcd586032ae3b8b47e619884c78af2964167869738fc415a19bb32c23098b9b63098d8867ab98949feab0d9f2b1a44a79df81f51924c0c151fcd1356abf64efef5a1b1adf956b99efbce9093d4824dc58fd792613fe8234502d00062e552d3cf5d52909d980345e2e89fd42aedadd6a3e9861696fab590ae3c5e24e7a1b7cd40a3286b457c269f367f05c00f0d4610a4fb9b493ee9397181d669a143aaa095f13280d896d1c8746164137735f9d80b34577f3479501d3dcf98d9ad98f8b647ee7eec41d755134157533b9360a65b5d06955ded2dad2e6b6ae721380d3784f058dd92e321730b7828799939c6cff15c3b1e9b809f2e9bb630fc2f407b1429cbbfd27529e96757c0c9893e8f7c9a1a815dff37075db39aa30ce1eb64531004e4928679ca642f9c6448c67a1c12d1a5db91a1e5cea58da7cd7a8d9322d931f5bb5f18badd4a5348653b49a75734cf50640b7ded766d90f789325b95bbcbd756aa6306815673b3637d0ef9d1a61569371bfc84be0f804461d60fc4bc89c1f24f3f052b8036c4bfb72bd47ae757a8a3117e9ba562916d05cefec5ccc2912826e8ad1f12c1b0bd392ad3c22974e2549ccf683f01dcfd279050c9f6308398bcf9d3d7cf4ced38a65da0961f6a6af287af9519e3b0ec515ee56ae728efdfb0dcd02f6e352dee113bdf8edc077ba76817893e993133afa2913ca02ef4ee35cfe9fc16e4a140ac458cc0fbc674cb8f02babf7a0a2e53a8ffa4519e4d42eb372733d9a873db6a3c32f94960ec10193071b5fe625c0bc3764d0d2177be6e8503162c5b55fc2286e19e9e2419517b9a94e85120ece63dd7b7c7559aad80b544b66d2d3bc8daf2ae107af3228041ffad445dd66a50a6028ce0f5bde1e9f917c1bfa967f686c1428185be75218905f16595cead325c57746c6ed3502c6e8feac826535010de14ee30ae060a4abc6bda346171f8fb0d85196a11582ad6e30d48ba43356b31ff1cde5101e3002a91fe4c6e7b0a3b7e70cc1ffe1a5b9859eebc97c5d6af030f1e4a34b28493feb5021a9f9b304478aa1e8b0e6877e9710911ac6e04c3596a0d0eab24409ec26e4125251dfe38bbe3028118d6e079096616405059f954ca5a67dd9bec97d9fc75e4baa141b1a1fc75abcece72d1a510c09b07cff4c7d59a304778 +result: pass +shared_secret: 93ce6d06568d795c2a28d1196f53cbaa2cb05df1427ac76f44df09d479e14241 + +# Official test vector 13, seed: "bd26c0b9a33e3b9b4c5d7ea32d5bd1fc371015be163c86f584e49bfd5362c8d8341161cd1308115b2a03b7e5eaddd418" +private_key: ed1263888c6658d29766539e247cb2ded8bd4aea61e1998c090c96c40c513ce38507b3c1c171131ef280496b0324907d31b2b1d1e53ba4e2b3795c6b756cb113bc64dbd0b4f47978c048892f3a5b64241c3bbbb9bc7c593a8865f4923097180352d9600636b8f639704ce868d0b5069fa99a395c30cdc4b4ce3807caa07130cb5864610f7c5a6234930a8a519b3b6ccb63c7cb898565791b8a32c594fd826cd283cec434930b0161e183065dd48cdb392f0404120dd86253906605284bd8d16970382c5288c598f3220504c4bf05189695c0f8055a08c062c4889db96c1e960bb8eb9009f060cbd9818eea119886fb84592093610371a09358f351704be5b7ba18308021afdafa52af2a4b42b7021459318b15aea8d04d700766a00428d8d3ac383a3cfbd03e49a8ba99713c7191b61422769ef5594954a4d3f00a0359482de59d0b9c18c787aaf8bab676acbc9cea9cfca41b43946b52b262dfa8302ce58f749260dcd65e81b7055b660d9341a67a352de1084353252d15e02d2b8bcddedc11bda1cc3aa46ee307a1fc29019182b9d817c1a3d922bcdbb2a8eb5fc2370b9d1a36ccf94a5af3b52ef094cbfb63ca590e24e43ac2e983b7760a187714daabb7a7d02f961c3452298b0e93614a8baf42988721965b4a7b1efc3b5b6e1968e927ce28e08bc12cbfb3d23ee095836aa5b2dc941ff1e0568942b8a6d6b997ba271c37b25d8b1147e6515ff788861b7e3b454d5e66b22cd059a34696b430890e8a9e0007cd62a1bb1bb0897ac835dc26ade4528bde16c8a00995fa9362c17981c794793b199eb348606f68862fb29c1fb154ec28314e65983343c3897499afcaae97752616c87076a00d54eb8bee6b3bf5e5be83bc3eeb874594147369775d02352936e51d801335e0a656ce9c12eff64ba0941fa6a563274ca536c3bfe9c2662a39b4c3eb07482201c93c50c95b823788606e81791ef21b27bb4eece135f1c961fc0095c0dc83b5226204104c7a919d5b3489e4f8144ab2c0045b72ffe77a509a6cbd8061da15371c03a6d028cd88f13494e8699aec9ec54291c2e16f787718b730c7cf436844d7bce9302aad448c01213c1d14844845601dbcb556ca85eecc54d426621d846d01e62796c011a231652904a8a9e7a73b5a87dea3afe747662bd696913cbfdbc1bc31893d89f4af3ed249ad946b7c2a31c8f35a7b9c8ff01988a956634bb06329e176d2e6c38aa3c8ab27b9dee0135962aa08a909ca8196e8e626f123bb3883b9d86c23883c9dc9910cb9e6805c5859a0e08a7af64d610a332b30cf41871fe8da13b503156f6c031ea4a5c33cb5ef9384c8047c58532cb7da4c9275176536a5f4ca0cd6cca9b399a938ecbf61eb3dcb1660b160698996b3fa21714715299927723f3609d11526336b6ad0c2cf91491927d07aa4e0c7234c9249803a3f43460ac19597b4c47c9c4e64dc174a8241a913aaceb8a431973d552416e3115301a969c351ac9b8c798d83cad6c925b7d467b132071bb9af4a3c2c6cf6358101a620f857f6c55a9fa077ae25455ff1249c562ade011ac64b659d289616284259a2cff5144558d1149671b350b18d0cc20f0e164d47a8382fd07d96232e39c0a6ed7c794ee05d9b58740d13cd78ea15867a5c3cb14051223efcb36969430b45fb699c26caa918c3d9041589a1bde4484e95859a700c2510d6380c2a323e34526e22adb44a862c417b34d172269b32430c6b8a68cc3dd2bee2447555c82189e2562aa82df2a40e33b91d65b60d0ad93b127294d71002dd16b35701670564b1c07436dc2a001c751765dc93da79aff6177e9795b00c5bcbf66175357174032a2a742b3587e35f055268551c57af78090044be4200302fb0b16a40b80e092a1933bf99878852342cc6574c6230a9460b08376c42c51a48aca14d0e59294f3bcb464a74c0a296fb0182cef42b25b58711c6cc939c9e02c8302e2499640737ea07540ed89b5335a05c552472172e8bdb2f40c49a5b0295ce99a0f567af39169313c8b61ba77fd2143f97cc762c8b6be4c13300a8b78dd06011c144a1d747e1c3825cc1674b825838953574e8b6a16b3dfa8a05355c8977006c649b58d9f0ac2d704f774817eea95f6da97ab5ca71c521a277d9618881563f47792d99bebc73a74ceb5560070b75c3b8b2e2c9598195feb08ebfb5cb1d86a87f93465355a796520d0c24744c7b852bac418fd620d060118d135947d9b174cca55444096ed97fd6442dda02b4a3364732c6818c39a9d199b4cb5a4d3659c8c4851d39db9301047370351c8dc417bc1b86fa50486e759b87c4cc69a8a9ec282909c40f0b7ca0896c01f7221639b18fc3145eae4b4b8252b4af720f1a22c1e5cb980cea6b103082b31b0542ea8d64d8c9b119aef3524cad116689280a51ccc08c09a8c3313a82a581b55cae6a394efb5146ad9884344ab6904c7d5bcc75729a261239c76ebc83e2557f60d125a9578fe0b4ac8d57b08d729a8d86647708483407ba16344049f8b842496a64f84d5bf42540429ade11b10f567eba812aff9179e263a2899b770f8b3166da15bce789dee3cc7d1846f3204b26933d4803b74c3c3885748a417692f0f5ac2733804cd2a98f45547af8ccd28542ab3062211a51f454b28559c28d0751c5c6c31045a8aa41c79cd1cca536c3d6a779afd9175a006b663620bcc92b4ddcc92b61b88bd422f1dc7962a70569dacbbfc7ac9ce90f8d16c3b6973ab3e96b6539a145128631c6993c776fcf488f4ee692772645dc2cc1541874c02aba0564a46176005f6ccf2ab27893dc60d2d44ce1e5b6e317a38c032ad98bbbf79554ef2882fdb51115782ae862c9dc79a6a8293a39135460f96329548507d58c39a07ab9aa7fe913a7fbe4c466f693ee1006f6091346a4b75a2a506f6c787cab948fb76f4398b2110781ae27644211476364abe4ccc2f0ac6cc4e917dd391bd0b369ba862d5f396d8627285b0c5d9b3692ef8069ea601e6e493d841755cea52194b32b5f787f15a6478db7b6b41336000d2bdf3270f8f0aaadab89325b6a3dda4ea88021c8b61b6ba372186321f4f5575f2508625685db168830063860965a71a27ce34a7e934b9444d411da9a151b27b3ed738869100ff19099f0c2a8583b872c8a0745e455bf715b8f526cb4f378fdd931c8111d53a97379ab1d57684224780690b2c1b36bab3b0762b8fb6afcf39cdda151607a6537b985c37989299414b4c9b1894c6051242482b42289ab24793e2d7af2ca0cedbc27d0595b94c698bfa000840bb2d63e1946c2d52d0c837eb40dac0653a5e862d9fb8b832629cece9eaeb6d5feb48b6ef5da8aec87a9a79204cee2986867a2906eb851b734b8b22b91d6749b1a5f07c44e3b +ciphertext: 5aecef867809431a595f27d53e374f929c0927ddec2188336929346daee5287eeb67c5a916959b428b809e5c8215be769d63b7cbf828e3812a25818677109df91c1580d9a8e50f0875693123e66b7cad079584c20230ef01a0d0fd7b9ee936ff65a0261d25c60e7f9bb1b51ebc9d6cba815cc43c895661d355d12e96957acb905dc4eb18e45b46f45d23a35e8d0b4d5d71c77fa30fa244fe60f3d716ad8c8afe1781caa0668a8ca6ec94a1c31ede99532cbb042bce0a2e5cb13892e47bf27bc5d56f3ae0f156cbc5c90a290d244f1d5902c6234eeed11ce3e232cbca1cc29228d4848bee8fbc2ef61debe22518680542ff824774e38ce3c1d0225c6836785076a651653313ba74fd8dd176c3f8fdf4d102bbe0a5844d0e73f87eb04e9298e61eb8d18f335917e0f9610c3c17041537197c7041652aa39f7e06057d0c12479b07cf431308124ad8d9b22ddaeae2463070037cb14025e0d91592c8ee95b4e792a257aa73f64120c6c57729b4660f4db798087a053a40e0a144829f64468566c201264524ae339cf33d5e3e7a0a7a1f9ee75ef234cbe213db87807ffd3cf867d0a75bee8cabec8eb9858478f4470e04e7d36e54dea39e16dfd6fe882639a7edca290222db1d92d5c7207d436ec20b6e07a25e9bb2aff7c9a0629cac7121144e6666919258263d6052069747652ee973ba4db0bee6b28f85fdb3052fb6a498efd7fb82bcd2b4f5e5693d6462658d18ee04966b0d56fd1b9f560e1e29f8cf80e59f57e0cec307a9c37e7a578b98c5137982b7a085e67cc741efed81f795a40f550a15d1bb621ec702aa642271e5fc9a4f7d1bd44f39ae0a014b4792d4a8602c1699eb27c87e190911918d0f6e9e887d2ee3b7af9d19f3fe9e6bf78aa141d66328044cfe286affdbe0e1764fc5540629112b016a1c254b08749cbe45c10d1cab7991eb820167574fac5b33d971467fcd500eafbad1b9ea430a9d03971e0fabec59b9236e73ecee3166aa19d24115d63f698a1791bb6fdb4889c8e85c4bdf5f3fbd7ad66d4c733dafc073e6d5c18470baf3a685740f6f7aded2d39ecdcce03a0e097d86605fd856f6fe0d9798c1aaeca7ad1f2398b53892299797fd78f46c9c01654c91c2235110307b8f378a2a42e2970902ba96cfb25a307be48bcad1123eb0b80dffa628182a72d021ce9b26f91424ff400700d40a99d850385872d92ce7c19f2c41bcb932ddd85ea20b3eacf414799a6175b9ec819277481fd9b67b791c26b848a0ff91a8f31cc654921d70fe9eff42905f72eadaf698e31e90f4640a85a050f79b0a9084cedec141edbf20e07f48152fef5e4daec206bf2c81f1f3cbb7401c88ff986a9e90da3af08ec1de65e164df05b72ede33fe38cf772c48dc991d5118c06504677a5f806ddd17bdd13c318c023fa168795021a8d18127a79741bf31e5b953da85f1c76cc8dfe0b893563a7d5a8d792a8f148557c4ee87fdc9ef146c85541bfb95bb8d6db8e4f76686d992074941a62ed588f16826411146548cfae4f4cb80 +result: pass +shared_secret: 071db527a2ee8ce982527cb19355793859bb8557e7cc99dec58a53153eceddf4 + +# Official test vector 14, seed: "e2819ef86853bca1b9dee7ee1c1619988964f9a913e635aacf0d96ca6e0300d084329dabd8f149e24176d22757404260" +private_key: 263bae3c310cbd4b6423ac0195592363652d2c1b470a718073e18e08e412286a4df32501e9926d27c43de1135df1281b65c6738afb062d1a0823c01617da701b97a11c26055972b875d29d42985737502ed0551c85f11e2e9b28157049248691d750a4759184ab00b02595460a91acb77a6272d49273c35895ac796eb6406999b8d5b824617393fac877749ca787456211fabfd8c1ce7775ba14c51bfb2ca962b6a3acd7ad4084c90d000cef83aba7ec45910bbe37598422c8419585111055c99af87e08d5656dc5678b488fa9c96d366b5e6c2a5c8d900f40bc69db4a9fb9021723e043d42b089c68831a0525c14c8e9b192b14b83962b7662202cc753aaee4d18e23846e4ec1cdd9434a77a47a69596d8b5b019c60568a63734384b83a9406f461b9f940a9e0d3add5d21ef67c8d8f8c83259952c3cc86c35403fd713ef26a9cd239381ad4370414506edaa2da027b2821ac9a8c4e5a661f06038ff4b209acb4a71b916386a928a57183f9a5515b704aeec9654b7c17798c57c07911a038bb9b7715c0ea69cb3c9baf14a0bf881e6ca1905bd405e876234102c572db0b7c705efc93a49d82303de400003897c3f9196c758701a5946c947b32709268a9a265841408f038e280a9b441366f983316cb5fc5109c29b2320b156794ec3233a523bcc5b1e0ec6f0158c4346ac04078c244375ae8c8ab9b57296450aa75d8231ae3cbeb21a17f29c8d8fc628ff315bda563961a2014338d294743269c4876689eb938141d31001f932440b0a0aa079b6f3c82553c5350827a4a768c1fdb5e75253423d95043989cfeaba0ec544da71ac75a62a3d4d5600914972198cc95bcb1e4d04c1f4621ace5c02b1b0536b0350fc09b23ec125af05e92cc08362b6e1c1142484b736fcc46f4233ee2c52c2f810ba3148d74681fd5b158068cae9d701819a16917c81cf3f5a31ad1873930b59294c32d915791510ef0d8c8ac8a6cb4673493aa6bda6a6244810bebc286cc8020cb86cda351caf9e801d9589cf29b9cad0025ce563b1aebac4362b176c8a6c4349ff62124c53902b2c10636c88d612133e872759631b31d4ca637bb1670377ec7b97444daaebca78664188885c134fb04205a266895b7909e3271e141ad62090d5696a0221415e5a711a7ac0a9512a1c528767bb617bb79b9aa55b47cc2acb573aff4b4b5442bc573a8b9e937ad1205a4e6311834899caf3824eca782530186209c25d7e810c8f6c5b4559f436c7365642d28933a3a1234415b9728c061365c74b73ccd3e36222db3747c289d13942a32ca6fb1d7a75d563097e91399a2b967c3737962cd1fa0629f2b774d25a2021b458524b3c2f8344ebbbd2b7a70f7ab1574158e89117f3f8962aba45bb0cbc297ec3c2cc546096078894308310241b8ecce3fb787219c9e0b7443d622330877bf8c4c9637c6b9aedb75cb763356eb7772ba5664791d4f439e6a317b1066452d698dbd235fdb4ba5c37ba57ea8be97849345f7b3e8d56485329933b9b49f92a1a67b67c15c72a3b0cf05f36bfb2567f70ba9139cb6729212bb6b48b71590513bae6489b47c03220a72af6094045293ca3623842de85677c16aa910b9de06924dd3986df541109bab4be52b48818412eb1353680f2a3c3bd9fa7e55cc79c38207fdaba1833452dcb03763672212953c53532e6051ab040208acd348af507616562d96c7c04da93c8f21566df563deab2f18c9359b0b5391e8b03b485e3dc1a7c981b2a30026b0f83b84c4505a5966f648383c9abd16638a3e557ae4925fbf1c0125d91d97511175895082a78c1272792a50a5651239cb66b3f6c1376fe332260cc27ed5972c4b6ecef6462d3b712627928cda42ce150d3d96b7f032209ca92e9937517bf2b7c5f66e3b837ec347643a6a8a4d8c299de167395c84c2aa8bf1a8a4d5db29c2962701701ead468368b40e87da45dee76ff4b287950889692a838bba17b2b47c3140b7761cb389e447b2a540ae251d61808341dbb2b9aa5f04a69c6010431b28c17b980fd00499e274c9492840cc7a1e90215be92759db8b14ef41c059c546d4482343106adb27a802c3c3f8759a8fa20141fa63c65081d40090eb1abebac9c5708a9ba50656b4e7616151a4f1b0bd678ac18188450ddace2b99b3f170ac2635a62ad88320d17a9a75ca2e1bb52576274ee12f1f3b0b1696a247c70a6cda6264dc9e892cb08548c0c8824168f471e19078737169b4549b62b634a611ad53699a5550635faa7ce4589938501834f8c4856cb2e991bac84809b424cafb5ba089f14338780178d71b1cb7b1ed12c036f727fc2a94e9a62ecab6a95c8800aaa237cfb224af5c8fcc939443176ca4bca59ce54400dc7639e0630fa7cfc292604e6ab0bcda993a78107d108783d19dded13c2033297ff513fa75c4c6d65640206b43f33cac26950533b4b053190cb23e45587509acbcfc57acfadb6160f5345a599caed04eaa02937bd5a5620a5f24e6b194c52da021233b13cf950c270f8262972031790ba4cdb4524bd92781898427b6a1adc7a986f88ddf7b39be1c7d9700c87d52aea9140aef5c6454328f666a8f476b772784c3b13494dab57b06e320b2aa701acacdce41b8b3843e9913ccb3705dab48cb9d85ab5b36bbff148c5a4239b32190193112e1184d33b88ed1e6c3a9ba0ced62bb5e634b72187030bc8dfc1a3e80e28bfcd1828ec4a2e4888d68e4bafa3ba8622a87314432801325fa66c142760272e594de825560c7c19e881ef238bd9a38013f601885e02acec715b25730fb004009eba9111c125bfb0d6b2c154945575743cd66d85906981b24c1b2029452879608a34bce8e610501b6b12f32a1b3e99b76143cc1455485b3802778b7ed52210b976cd2ba26f1551c0fda036fb33891ac77c9265c30db5a513baca1524b8499932d5633b127ab98d8c07ca1704fbc8404957251f11dbeb7000b363255f5aae1261ea5b7c741445cc2852666c5437a4054f5d3a421799318098f5aaa5262b46187f60a09d98442499e30bc54c86838e256c24ae481b6bc33bf076b04bbc798f0615cccbe8eb66dd3c97da6a89394d4c7e07b8c4d5c70a01c9e7c43b8a37c3a09d728d9fc25d933028a504dced76c2a3900ca67369cf5b822107a9ddb2a168419ac87b036064786f500e9e0a279294df8a7c632484723ba28b38b52937b40e20984c46b23dd81bedf629da6a3512ec060fde7b8b2dc987395af460998230c20a9a08c1dfbf3824cf7a6fb4ed55ed1ff461d800b59a6ffd7287e1ee3fb94cb59c394504ff02338c9bb711d263140c471409f3c42813f38424698563d9550f85a168f2da2acf359556df4a2abaeb9dcee945829beb71185b4d6bd18b76e5668f253383a +ciphertext: aad2540e5b6286cdb234a4414a07402fdfd38141f26f812025e62b851d7d565a8bfe21c5879ed182ff2960c3122ba4f9e591060548a7a2fcc87b7a5f3dfdfa79912befac7451a912ba367a1882e4ae533754a76308921ce820d52d402413651641767dce967dda4e9cff0ff2f3f1a971693eaf6dd138e5817f2600e609f24b47d6fe41959dd01f3d22bfaa05b17a4a957780d581782da44c97f794a008ae96353d0421284451cfe3e6770f418661699a218296724c33b34730c25525b2f818e7f5c9ed42afc92f6c3c56b22b1785b01d3ccc2c74aed6faebd18b9ee948ae93c8cb0f13b5225c334b5f422ebece17e54f5403604dda34c02416aa79de4f3a3d66a411c8b64f38c5dd256d5ca2ca95e3b1c724b278296f719eb70683a2926c5b5f4b9b25d13f2b2706eb6ab79bbc48bf12118d0311993504baf3a92ef79eda66cd6922c01c491c37be3f21109a21da5efac144ae7fedc440b84ec7655631b5e1b3067e8b1f4dca235b3907eb6221b3e38d51a08c36090c307aec7a124cb35ef75345c82adea4a6fa3323607aa20fad721cbcc82d01dbd7d6863b69da9792faac75730a5f5dba4a24453e91319cf8e72c2b7a9498821b5159680dc51682eb4c339694af812e664f8d5210674f0a55543c5433a9cc6573eca7ca607ebfa5efffb0e23a009f404beff30a280d8de6a79845f6687c8f137fed4dab02c8984ab7f17a22b0168eb559423ecabccd6c822334092b94858849fcbc7cb20cc58f7646c0f8541066e654811185b0dc807a0c53c785fdb005474bc54280f34871b137b44848dd0cac5d9226b342a247461ca71b031fdfe17709cc11bc5ca6fe648c13f76f7f66549bec1be4fd8c8c1f05f8e494743a25dd52e3e346366051d102e7aba6dc391e529a5a1b09e5d141414e402002f1a81d2eaa27cccac6dff2c6e38f8b3584c998809c5e18ad500c3432801b08f2cbb3e7df907e9a57059122ad8ff49cca4ad18d197bd7de4834bd550b893347119e8d323af3f6696eb0f88d600b4341af25d266e955ccee8e493979ea31e978081dec549111c7bee584f5d0d18d432c52e8058566d1950928fec5d25f02c42329f68d8734533c1cca80a8adf8e74ef4d807b755e544e2096cc42d38517aa87189bfd4bad8dcc8fffee414c19073fed509191f56eee507623d8d1c2431b771d7a7b41226d532f9da0c837bb13268d542b493d027131cd0abb4dac1eb85d680f31ac8f91a3c00e889332e1459b7a3611b70e1c5492a8ea9b4438315d5cde863b834a8ec122ca6034c808e528dc25de3eed1ebd6d7426843017eb2b7cbf1b07d4794316cd3b14b2378d3c5cb76217ae46c958bd841b27ef7823e2b0537f1022b3d8322e85580aca303fbe54dd1d2a79eec2d48e083e77df8b4d8924351ab28c9eae2331a46c11a2d6b589cadd49ee81b060de91d04f5efb9515c5049f5b8e82597ec0120db12ea26a062653f3d62e96284e9de2e247dde2950efeeefb653cf710680eac92430aa11553d8049183f263e2a9f11f51b +result: pass +shared_secret: 598bd66a4a063652b2a6b25b8d1c3bab0251682ce6c362a8c680295f47f3d6d9 + +# Official test vector 15, seed: "669c4ef8a051ce201da65fc4bc34d398ec1f806276fc5d987ad71d93bc12dc8f107b58be6e8422a0795c88cb9a0e7488" +private_key: 4fd2be0ff2ba62ba7ddec6a73c032e9a15cd9db841b4791620989c38508bd6733c15c206c84402e286ba0f2b274b94ad18a5ca003d7689aab71ef8cbce7b75ce844622fc9f57b974f8991a89032206f59023002c938c6d66622a7033442c190134d06f04339fa61390ceaac12dec5d0e5275456873107a8cc1ea6d5e5450aab97b23a06e34c8a812cc29794897a20bbfe7790c3404c25dea2fea4c80f102ad1e750780dc79010811fe680bb1c8000ebc930ff8257f912140db9e0a9c5c7410388384591f500bf0aabc4258272deb2871bcbb85757e9afb2699f45142ebb80ba8ce2fd095cccc1952579a8a67bb57f78e2feb4e484a96854a8d4d16bea8c08d04f91f31779e0df23222f5768775c026148cb1895b970cab860bac34aa6612e8a5b93c5aefc78e408a0312fc027f7a509d6c12b55453e9cb2f4e5c4360a4ab1e350f8122a008f69cf2796f6b72a58e388921863ab2fb82ae627c60593a99a4ba7806572dca7179476b16d5aa6adc6ccc90ad700cb1304c2b299c1aaf09369cc2ce8a9c31cb799185c24ad16967fb1269d0dba48eb0a258d4c37f9484c9cc8d214232f88b919de59ffaf6c00029058efc1e4fe55a8457b16d3c49017c88909c0eef37973a6b2e55d19b8114b074d8c95a57c5d897c87f024b3bd8578c7921536b1b45c19484e220ed87bc647c57aad958e01c74a433074a660de8824060108b1c44cc45486f0ad2c00fb79a7d88a2eff62887a3171d132e441cbaddf2bc1622045562a893300502779c3cf072ddf61187d42da0acc451e6b56bba37b3da8f1b105483955c7b169f89db86e7fb04a493b69567bc5a8b8655c919f8a70d6ee1034c1478effab227622029f5997b14696f4bc4415b6771d3701b461e76d686c93699c96165b00a593d69827bb39a256a1385d8b77b2222a5c920a6864ba5f413800c95f2ea9c303a064a173c764437eaf13444ec34192911400506158a0ab1c56399c012c30a7290cc0b0d330bad27b8c0c80b7dab5ed21c38459a436b5a5b2b0822726815180395dbe69a472672fcfa17cc331ec910096480affc8c667bcc7a2ca92e6ff80b1735a5959810dd3a5fe9938836d1b50d772a11c1b126fa498009b730139c3a1c9a22d12a55f1755f81ab7442399c8bb509775a24b3987e4432fb3a4a22fc7da509578c34302ae845b818894c7a6283d71d42657544b558f74b7977d270be722b9a51bbbdc236deb8898c65a92457b260d3816f57030f510e4f885450da20977451b2a731ded6287fcba24b4c7f09e4a7532965774c0578eabc13d1b123542c1d1b6a710bb3b55038a28155528caf974769557318c617306f72acad23c7c475b9a568c70e7552b65917217677fe625b15548be7465b147c60f857a832d08ca770c83ca3b201ec1e8ca1ba25630997a69ee54921e7ba611ea1c0928c0c99d65d0c0a39f2e18f8ff9980044477899411410a48ac2c6c2893e83c19f7f1080edd9058270374f0aad2f794655f594b3cc15bbec6db0d647e45805318534c4da9484ea4d55464da7231bdfd31e9bb6c53e35a6f0764ed3443823f9991ca3aff1caa50edb522c42112ada999dca8a8e678ea1a8417d77920f723061c87cb29a55034626f03687751b2f1abac22b4c2b1ac19567f3324fca5d82b147af141a004514d831039a612ed69b621ffb4223109171e6351bb35177b85bb5063161273abf861988a1803e647820bb53b282bc6d04cd3e075a4a1b6755b97251901a81c7911437c528951d007d9ed82368d4c833ecf2aa1a806cbad08259470461f7774a922227e812689bcb59a3483c8346d130650e06383556c067f94d41dc1171941efcc96e3fd769623861bec9bbcca4a5ed22c10a36a59efb5d7153859df348ef9c3a2745cea329a73cb831441762820c7d996b88c1d453c775a16ab2c752e68bc55839d2e79544b87af56019f02b794b166f6dd60e8efb0b14f00d1ae800e37bbe5ff7c7d47a257adccd2949cdc3d9318a0cbaa34a14e080b968533ab1d9ab674c89774187d592b4c86461e84ac0e6808c96090abe6b0cf69a2056a1c4287b1cf3dab74f8ca66ae8421fa200fbaa4b11760ac7529b92db75231958e20a3f55b8a3396a10fe957361a9bf41941b90583d8d97cade8828b8a3a5ebc36730c19fa7346aa427c489f56c7cf3716928c9082b36d3f3b82ff1348eaba325ba8c49acb2673570dc5548229ba93a5c210b586ece088d6679c975b60e0106c0003625e42c1bafc1ac1be1c1779556a95ac68776ca01363961132ff75c2185339d79a426e6c0a0011a260acb7cc0583e71623b251cb8ec1049da730c2f9a26a61075aac24ab1da2732f708221a01b27c9da1b520beb7686843360a11a292568993c28bafc7088c1767b87523e9450873f9c73912cae517ca29c066631137faa16d217ccc07f840e1013440da2ddaec6b7161b29742a2c941c7573bb0b57a58a25b00db5012a3362774fb35cd80c6f0a095753688b156b510561ca47b436cd5576ee0323f2bb2967022fe391b9cab3f41477787a96ec6667337fa4ea29b44b7c9610ab69706e820557ac7c9f9c55ab4a04fcb05ecc4157b943bbafc0b0e42567f95b8b436838d363da680a42ee01cd5353dd4276b4dc625d492aec385bfebe9767a2731fa8b3ce9271cd8d28042b66714d98d0bc0675a54b3ea3c322830a5616816c43260f6f21947e3499dfc4f9d76a7977cb467899b455a12d8628e93acbfed99cd8b813d21a15024da9ef46b1ae4f6333dc8933b52a5f100bdbdf2b23987270d550493d949e83a269ab42027b34a12a177f185af5f76ac9f9b1cf9ea4eff5529e0247d3abc3ca08b3a1d081a8c75a1ffe4337711759d25b9cc673b0263177ea93b56667c15f82b483702973c6436d40953aac60929a36a911ad25ac109a10841fb95e1ec05962c5694cc3cd7372260ea4863109254c26a44f62af0957960634354f62c624c5723416f14966417681fec883ae47544b753340f749b487a095f89784f15a6e7945da56c9e0d2c358162213403609a1c938c98c68b70a0fadc5aa746ae4ea9868f19b9ebc3282ff592960b436a7a7301e4c7fa075ff50762b866c4a9f157ad25291347a9dba5cad62c35b28a3933f5269f33a0e6d403e5721a0d36bae734481c43918f9b13acea8f6a13b1bb584938284c10e3806ed935d8e543fd5bbbab0685f099c2adf254f4906d6e05590dfb1544a32ff3bb766109561ff31c164792b6b0991fa93c14a74086a585353c3e620d3ec5b1da6ff7959016b53093137c512dfc18bbccdbce67cf49fea044df5c767996681dd2714937d31c822f3c58cc34785aa7df05318b5f655efe36f1b678cf4b875108a18db2fa312261caf839f84bd956c5 +ciphertext: 05d490f575c5a991065a65008d6def6ce79b0c64ea9156ea6bad47fdd3926889bfd335784d7ef46aba3615e50ad4de994de59889aa2f9f8ed1de66b3caae0ad5079821b135781fa2b063198a83c0c19c3b9b479277fd1f0e7089ac711fdc5036b7e4f6d279b8b84de7724bfd425dbfae33485bd423fc10c2c576a4ffcd78eed1db45ec71df0fbf4e53e9161b174f536c88af832928d593f3e80fa353b33650a93bf4bdda6b94807b49ed507cabbc72eb3273ced31f8aa4a1c9d68ea5d7c337ca183be3cae57d0555bab6fa19b36f59c575d1b9a297eeb9c561fad4b2056a3c3ace6ed886dcd84fc4b52511cfa2e00fc49f7cfb2320e650825a2c8ca39e68be13f3514b0160e04b6d58e613bc2a70315807224496575f6b5d0934f6704cb6c3b728fb1857130aa9012511ba9344d6187191dd500a1b2427db1f5355342aa5e0a29ba2b94cee0fbf808202afc594322124cdc12fe49185ce8494950d08a4b0f6970d82e745d6a3cb726d13e77c1e5a94593c678baa1b422d71312cadd4e16df816ddb13a0d0990947c84322dd17a831f21261f82986453a1aba53e1b13a772d5d29c211fd2a37d3c1cbdce6812a09323dffdc404a964a6d842077fa744c971e4e0bc42852d0a37670837c2bdf99e87657c044c5f56a8918b163808139d00db7aff2b1768fa327a80649a67201b8c8ab04278544ed5666d6460e8a30b54283bdcf4748ff1e4328ca86eb42933831cd74d99e93b760f3dd2f0524c9c283a2d81886749e052afeab286830fec68628c4d3ed4f958678c03962b02a6b37c07e0d4ac3b3842731da4b309167fdb1cfb2ec22e9704df4b86479cb404cb31c69798bcb45eecaa31f2e80da2d2e6426ed998983e9569ad4df5a53077ae69060347012ffea15690f222f20bf917e2bb3654bbb415d38c5512888aa029df25ace2b15bdc22266b41ef0709486273c23fb1c6c4b7b45895af4e8c8358a4a40a2949142a9a773976f8ac4211d82c2f08d4d1ee348050cf24821c2aa14285d318dd83a876965358936cf7dddee74d9c9f24b656e1362a040e684b9aa38730701776a3d35a54b48a37c8f318c0464b448e9a184d8c104f1ca092d18984f5e7e65d1991bd24a237e8080f45b2ff4a973bf07c784a8e0c39b90d0bda10fbf3a1b34978de8feab4d1dda3498f1dc0b8d58c5047ade493f35899a582297b23b8807e105b373d03d21a031a8c9e2ec54a2ab4bc16ac9874a7de8342d346a57e13ac4e75e9b3543f4f6d7c394a1c3a669501ca56f571092481c09fc59f63258f5962b058aa821ae535b7290d42bd619d46f0a7fe4ac92f62261e88e53ccffb5089cd0f6f99836f8f703f9f82a906a191e00b99520b3d3e3a57f3f5a532806fef0462851d8feccb4c75beccb0e67e87d812a3704fb8047a7a5910fa609ebc0607de4ead78517d7c6e4032b018f107d945dadb329e170d99c7d14f05fb2f2c5d0be443454ead35186ab3283c05478aa9b71d7da66fbfb9ee6c47429a4d6ce1da77b526223027b2f1ed41ae66 +result: pass +shared_secret: 92bd980f79cbb34c67594c6922549b99962e54d388034ea61f892fe250581c4e + +# Official test vector 16, seed: "9debccfe818f6b5204db4ea09c03ec9a19dcf1629c1527685b8a29776bb1daaec45f8abf8f0adc9a8c8bd6e2df6d8048" +private_key: 999942a0ab8086204428a2098a205a297265ef3b725de17ce121512fba2225b20c2fd0147cd903dbf08722201c4575784a5370556715f8ec09eaba14b38863c5402b9100407b35375098a55f568ff0b4324b43098debb5085558fda00084584bbfe68d94280636809f8d408256913d32152710a132380243c74455b7f11532d3b88145cbd61745aa7683bd204c4e035d526a488465170fa86a099323fce43b78b4a3b959a1b1ec25d4593181dc22ba883a9f080316c23d07d1490daa68c8fa2f43533635439b5bab445a6c1df2a2c22aa84355556c80a9877ac9453469b02d998476d0cedddb9f3d05c7c6f99253ab62109376dd9b384b26786872030d95c23b3cb38238066978b55f2746124a98d90bcaf1c958e08b108f6714fe7658f6e0a67cb875522090856761d47189bdecb13c7746aae24c12294db2662a65d9241b513cf244223ec0ac4be18935c788e04421da1071611a3349843b7c760ce3568413756b7d838c3f3827e167b1db27bf0546606ba6bb7ff11a2e7b86186946cd00d0fa143122729efa29adef75c499f2c719e985e6014b110373ad2164ef7a85e78b7fe1dc25ed60027de464f3c133338404bcd89f2680c639d956be5a8cdc6254e670b5400139e0c136a132763f6c6664a6b9283b03ef18c809d94347187d91f97bebd0bde9134bf0414d219895cbba75c9b262e6e62ad70926816bc02818c71d542ad6e3bc2e58796d7a90a4ac200c1b135940b4d0346366763c2672ac70c03b56a62afe49a1ef043fe9657391b7274b6ba05e3184fda8125b412c46f986212ba2948b6db9130f54fc33f9574f7a82aeb209b6441886ed83816c173ec9826f8fb6c8e36237d6b32376344cf01311346b19eb502a6cc61811d6728ac3288fa5c576380ee2286839e4a8a01761fde8a2fb49a3dab98bcbfa9633a2bfeb116072c479ddd28891305bca71ae8622cc89dc4733846cfa56cd2ecb4d60623b92797bf8d8b2dbd2b74804c7cea19f40b67394c46b46906a44a5b669d95d4514a95f6327465baecb8a439114070884338485468b36b103c4af5ce9c1c9a09feb2a2f9b7324e703b23dc63192422e5b2c38228c36a3cccf39777d2015496972c6c618a296908cf6eb54169a479d5221679a7829e27c92c5550a4156d5631450753beb34cd4ba8ca8949a7390a4a2e4abce4ba418525620b7c9064d82f8d080a68f058d847bf69833cfe025f0e090e185234b6f6a260c7391c97b57222606bd0b488d37ad71774636c9e1ea8a449958c1b944e76f48fc8401deda708bc039a81c497c2e028b52a714b40679563263305bb432b3e120bbc561b121a2026569951986c94000235e96a2fbb70acb7a50a79c06947c02db12609208c101bab9e63d449c1c0a0faa336d7b0c1ba9c84b6518863267ee61624669938cbe07eec601ad3649675ca12cc307724db6ed5a60766f423c47100b75c41deb4bb78bcb19d4c486c098279d53ce0e6295086ba75525e22d3551450cfabc72c781008cfc5830d6c603311abbd81934e874b1c4a55e4884cbff57dc4ba0549724c7603258ed6b63456af9bfa0bdcb3ca86b09ec25aaf41911400e8bbe409604ba8919cc59b8916c8c8745c2e8042cd187009317a52773c57d435faf794021bbc709b8e7d688a5dfc686c15931221a9016c3bb461a487982ded37041ad0c1d032714f7379e2fb9faf5aa6d0f5469c7156800ba258fc5b25d0996b6735665a806a74b03d9819a5832a6685157e7285df397e23b13a543a983a5b24264c971a73708de1572852465732c94830719c197c7985c0a7c53525a1ae76d18e1e9112eb4b57c1222320a8156643cbc9535a27658a3709123cd61af7798addd888053bb0de254eff530296f9ae75b2ca756539b61c62decb0e9ae611678b5190503344229096c34990a61ce8b10ed3841d48d266cdc249acc96b7d88010899c453467213d8bd23e1764e0237480c34d8396ef57c1aaf781c042471d04077eff85338ab8caef22ed064bc38164070a00cc78b8074e7569a627b49e0416a705386601d3b8a6c10a4adcbb190b4877422304ffc776b4a129d4098c603896a6020725986cfcf0083fffa66eabab82db734f5d1b5766104e8a2b8b859b6cd166dec691ae331b87e794a1c9b083c14b50b85b7e97148745c9f8975733d4262e247473ce53b85d01c6de505a352bfc0c233a396c87f856981c83fb74542c9f3cee1276f3096486ef23359c51ac553931b80c6bd245b2114c4a2d344ab53765c02c82b41412afa1ad5ba6ccee9bf09e375eddc0cd55bb6c727be26bbbc4e7392293c59455084b1542c87578c63511ae3e384e027bc07ca7401cb0096d1205f4ca86d3c73ee8273de930799369133f83f4667a92e72bee2655b17120dee233433f9c68a50c57fdc8617ac1d03f0961d4a7bd17678d8729329a0ba0591ca84670557e15fc5eb4e8255007b8c4e48206f62062e1dd53bfc43af02405d2e300d4858b1b9c9ceb531a910c0bde877450a9aaa8878a2fa45089e184d1fec1cf4e3909670bc11e78da5d8cfeb86a4c087a1b73a6099c99836b3cc76366d35a9854b3b205f4b2b69666878614117163fefdc32b6db37fdeab0a0197f79db088c3a355877cdb1313a2f200e27e37e12b4bfba04691f82b1c2e8b8172c11e466cd8d01286f2a3a4fe5a5f920476a9278b9d25e420b77d489386f9c167f2731654b19fe4886867b79ee10c18f679fae87826a0b65b44a83da5a35e0723bda3467541228b80b35d5ab869b52b5dba9b8b309360ff1022d67bc93747c392469c28b288cb73fca74001e5bb47d5b0321e08fbf832d0a9b0dbdf566d3898e1f9aba7e3c011a14c3e918589282c0f167bf14470d1f6c774e6742e40a1452c70cafb941624c02ad201e6030bf3dc6a039e6465d6772d1c184c693bd16c3367f02730ed6beb95940ff783cf9e307f38a7f4f37754f6c4ed26a1c70c90741ac89e56c989b0260f7e1178b5b975d54aa6f420e97a7b90c3c74200359d561beae98b1af044be40a2ad8491f42662e2f34bde200c63ca48e7409727c8b2185138ae7859ce43558349a1f3e641df0c14428c0c12d0a49abb904cdf8ae5cf34d379024ed528e5d84a3d25920b7a94b61a8abf9e557ff61c784501fc9e332f2b652f16a0a11148b8e594d1f377035e124d637659d4485d909543818814fe7a8a173bc8aab7066d2c927c90660dc8d30364d60a31f1d94a9e5f586cd84c167e2577d3326e41a614382f4982426e93391380c4b03db38d0f7bf0ff66d2d93c251d3347c643ef3581d438af7dec621304e0091f797346ca18a41f39401e9d03200ef48beb6df7d92dda83e6b2ef4cce08c9134563063068a196d7b1a1a13623e48ae12528e +ciphertext: 69a67c3915a5e699644ee255ac7f4e73fcad84976ee94f610426c60e9e736a2217118ceb9042e6d031bffdc24d61a73bb158abe5d57d5e1b7f27bbacbbf87a71925db2aebd1bad3c9b3e4504310862e8e79ea2ff1833b13e815afcd9bd5de8aa8b6917ae7321f4bad138d2b88637366186ed0ed48d4abb743c1b6601a1b3091b47953087bd077fa3432fa9420d40b0619465ef46d9347aac5ac60ce8e0aeba6c200657d3e4e8fe9dd73ddb9768a1498dadb9d15b9bc806dd92eba218b5088944b394f2226b01a2a15ced5e1e567779ec5e8752fe51a3ec1a6af64907c8b058aec3a0f323c31140904695e5148ac3d645cc89d458509efbdcc9d2bd46ba57cdda957eaf5cac08dc18ccc20254988ef1f8a0c1ad578dd061010632606dfc7dddf116a96b9704ee90102e499a182de5c5b1973317489f2a95cc015c86b8fba63b9c259a4276155b1fc7ceeba6c0bb4101d8dba10a3a297df54631006a861efd0cec14f52952c96e99d147dbd0f71c6aae5ab362e31586a967fdf6418f65d2f3bb9a7f4ea58c4a193f8e3aeb6bc048f7479080374ec8685bd3c55c83f3d864afdb65e901676556204082b90afb06f861b81095bdf538e3524fb1c07b9c0dacd3a5fa4c69c47aee8f9b6d636e56a2bf166060a31ca1966bbd36b8495c5610f86f279741260f1580f8ab41e9aaee35128917c0a0264aa992a6d2bc4516743177cce2fa2932d9a327e11cff1e86fbc71c44e6a49cc55843b1f7b78243419d53b15fec0bef99c74574e88cd27495a5700f66ae30aeb3891f839829cc1b79600e17cb5d4af88b3a2c6118ae816d28027f6790799af0c264fd17331479213de77087f7ffcc0d3831aa82e4c0cd73328057a2eeb0651e2cd6e86858129e190ef97ebcc3873c2c8dcba51a83612af4a04144dc4b488be630de461b20b6e1a2f5f115942a5a4491f30db59e4480bc0784102095f0a612efe236cbf6a0bb8eee2b82b399d8f2d594f53574e7ca440a0ec1df010d1c08650fcb5e58607fc8a67a4d08632ed0d272e5b5002c6e782e3a88478bf0e9e29acbbbb21560f546c508faf5f1219300f0340573d6cb747d15f6bbdf2002c2dcc661a0e8bf53dcc3f05a4e8c691f21ef608ff1788266349783eebee6a409c31543a0bf3265a00305989c271ae5bdd42d5293e18af9005cf673d09508fba1580da112f658ef78eb770f2906071e9056142244da1f85cd8a6290eb82b9bd9de96fca1b5a19c27c82824f0d1961575196e0840a93d9cad6ef4e97e55f0deba61b9b84729091af782d041b38ab54f86bc6a3887a299c511521505d1199be958fb35194664a1e6025b85cab73b611f1646b6e3ec3c7acd3d5323cec2d52d46e68cf9ad52557c777e24db30dce32e04084bb789c6c2afe1b8def656a9e7ec0a1f11a6890bad7f766305dc34d39df64a797446ecf53ff75848e3a0737c269f822ba27fa2a158b11ae758c8d8164fc359941c4e8939364690359470be977101ffc685b088e22c0e887b669b0e933fe6f7574a6416149 +result: pass +shared_secret: b7325a08fa617e19260264bb02ed6b8ab2081589fd5dcc1e92b9d0d4ebfdb6b6 + +# Official test vector 17, seed: "8098ae7a92c10f707d405f7dea02c2efbef44efa132ba8aefe81bd45e543ecec74f10920ae48a40b0653d63532517f2a" +private_key: c0b38724691a735c3fd82033d0535c3758a5d4298ddcf542556b73ec6009c4640f5c26471849a2289c469a975839fa5d4b389e75f8423a4633ebd29d8d1a5c19e609f12240edf33ae9c07cf93c18950cb1dbb07963d69dd1e2447db0500255098cb88083a633c5181f75d53a7f0681900747c8eab98d3aac6ff35d2bb01c80a1cb4e5a654a852a07614da10c5ec8071ac3d6394b3a13d47312f03229604c682f05245cec41b3b55098090b6044a1a3c0af26ab4a6ba21ecd50a08d8723d32563c36aa8c3bb01fa3798c42aaaaadb9d0ac8925342264dd4072db982309c0460d7380f02cf5ec0afe3fa13c7297337dc205c0a1f8b3109363765d44a29f1a7bd2b17c24c3130c26a8b872575970239ef12352eb15aab0c9a96b5c51f47370aa5372bc97a22a4029ea0b9156622903354f5a1cb3d49693a198413380075174d2969a95831b1051ab40d1344d809cec691717579a1b7eb52c9087d9244cf9ae6bdc32766b694708d1ba22fc76b042a6f9ad668971b4767e6a54a95290b699a04788edea5c914e3cb431337c0736efe7244d139bbbba28ce82b72ae92a23121b7560c9db5b908bd12539890a172f4c68f381d1c7b562b1b5bd88046359c29dd933ba1ec1f47bc4c485c8dd599767822ca7c4cb300954821695eb5eb2f87fba33d61284b187ca6726a1be742286959e38456594763f5ea53b9a7959382c348c7449783b5c784522f44aa3c25bd21d48660f78f70a00e49e59bead90c4c8367c22981d8ca6b5c198cb5906b12c55915232afc1a4b1ce5c4ff346f5f536fe68ab9d816c98dd6c5ee103d251874b4cb0554f38ad0712ba687634882856d453daef102d3835cd81b5791a50ed5934a0734a81fc78c6ea23ab2d96b679866458c21ed50abce98875167361a62991052bfc7123cd4f9b5e0e98c4266536573742c431d9d343bcb9a8bc1e2a927496a71d73ab6195cd7194d31ba631d025570725e6b37abdd60a545d2cd2532b32a9548f1a319df6184614405832954d89a61dce3b5cbdb1ff691550117402c027da07b2b5bc20b25ca36b0e70d45771e3561526950a8216a7f09db88ee46578a107ec0a46f932751d77a167c4809c14ca056923d2f540692c9b8de07cc05a55aa5aca7607a5f5b071139620ad4309e2e3a2995a31059cb8f3d09b65f171bc3740df13cc63e51bbc33b7922951073ac3e51013b39a0464ea67a9d5a76546227ea7974e1b61847036d94e13201644d585cc7b4c9aa301980eeba05e9e21dcc5163f7802dd3557e0fd6aefa1305e2f84bc42c8fc057a4adb58d3545ca8d767ae622cf7bd3c3178b92c5e776695ba375fb841e12760656befcb915d6a51f2cac896d7380a879a41001ce067a602a73cdce00a4321aa880b7382407c3da7a3702f28a098719e3822d6d8c12c88b460e691dda17bc4f5b589f2b46fc773fefa492e1112cfac69392c80abc1084e68903be87b76364caf5fc82039015bef0c9fee65311407f970b695c8759287898ea39bba8f61fe9d48936b1935b2a2770d498fc2bb22df5980904759ba64f05230378266c8114a7b3a1a5e33129efb4a52fc163628c5c1a65a0441325b3f3b8bcbc7dea5c42c7897aa8956473d54ed8b6c56dc931d12a8092102490881b4e2064c5a9588e257834c1aea2668e69d907db5158c3cc7321d83b9703cb74864c1057660b718c3412cc47bb92612643313c356b6b2cdeac80ec5b657e78cb2fe9ad14c28747e45466847d71c49d1355aa845a5c0fb27160156d49a3af1d8b975d694186b06a5b1111ac504df3f91ce9a4b2e248697f9a972e7b0cd048c1b6f7581af20afae4c1b9333f60e73a0dd1ceb2e19887cc712d0bbb5c24054553c3c7c972e87253d4c46c971826e8955ac0017ca6d6550335916d6a939f5c167bd68c09d85650e89b40a4686ff0bbd921ac3e43641b1600a84bad0fec9524f09fc920916a31b081e88a36803715b1476e57ce39ec27fbb04256ca64fd11225e474b06bcac9657b31de3a39f4cab5b65bcd8896655eb924243972b0bc9b755b0c69b837030a07937652c8c14f71745572882d222ba1208327d3228f0778a215b8fe6f4a14a9b3a56ecc56f09c49ca31cda853db12a2fe5d395a00cce6621833e61c2cea5bd6f0bcc6ec6b479e334fa543229b619be566e8c00a1dc7837c7b5651b8b6a94412ccddb63b8213635a5745a54bb56198d325a59109c75d2b733c77738a1328bf1370ed99b7ed8f611e69c3ed82620ce95088a91c6c6d472294260a1c5455291188e010a9467c816938f9835c1a4fa01223494c885642e5c416c82223d614a108a1128e53d9b264d61d798c4ca9bf6abc72fe779346a3208a77542272b591a6ae781996ef17961284666c85ba91b2de5f0bf9af10eb91c5793e48fdf367f46f586e05b2dd65b262506043de419482071dbaa2568256a14825b8f094b796a527fd25b8071a4041a1be279c2e3f543021364a147cff6740ba448b7010b4ddba6aa90265a95905f141a9374970a1a071799d813ecd77073b453cb2b6d83ac9cb8267a5861b9e2f23d345581a074657554781e4782d98333f1237dcafa48087aa66de4209a9a78700b09d44a0b5c929ae6612acf6b5d8ad20404a161fdd3639e659bf88291d41711015432f0e7ac759a67e0324f94c1876314687ac377ae48a30b48ba9986714ef3064f087c953ac6f86430bba9cef9857b849315dc4379799092af4c5531fc13f63b186939040da2233be05371d448fa748d76f98c3f638a6bf5864b9bc5fbe496d72966e3004409e420bc4353a5d55d0610843d0b8e6ee5bb5d6c4dd1462ae99a43df586b398a15ff5b5ff58a4006987613f5caba694dc0f736f6d47af66673e8f308a6044338d23c817c0420e679ef621739e21a4a35140dd2928e79584f787671b118e9e71e1d9430b9a3210e11c266876a44c7082e7ca5f6dc4b8d931f5bfa302fc790bd424cc3643844418f6c090e2cf5bf60f08c489bb87315464d90006375c34a5297a238a117a8770cb9795776c11f8a54ff13adb3fa77df3757938c28d03a612324858a11a860235e0e15284e36035bfc0178db841c679a47b93e3b09a9f735955d6bce328a91f2fa64273917b7371fbf166c47e9683776aec02251eddc84032cb0a852594f4c7875792fa345a43a68a193c51492a39c306b02f22c60ce5a8468c3050cc3965e2982e32b938a31cab1f36c1da3ca723261be3a864e2912199262c46741fddca501df33d04a79f8e3017e6197ab24b062cd98486dce2a7ffb22e5798643cf9ba5fa06bb0ff42f4d610a7b3df7544d66b97a486967cd9b62ba0142ebb10b8ee4ee0f6aa3e88f7fa8a96067f8cdaeceeac90c2d0b5e277e56e9c405ec9420c30252 +ciphertext: 64f1a93ea3e3017634cdd1c24a7d5a1701bc1d9bef3a908e70df00b38a15eb30395503908dc45c0ad971f0f20f72c4a75343b371ecc0a7ca7f18eab8214d8782952aba2b088514a7b232ce93385efea00abcf98e0b0a94f592ed365fbb950dbdac46e374f3261197ca7a2e31b6f2971b120c5c8aa430eb03c314cfdf15602003129e22b827a20658834f04e9e618f6fc1125bb9b71fcbf2a66e884800e74bde13c3cc9c599ce9bb815a8934f60923732fbdf1ba1a9c034fd49d0d809940f89e6693efa4bd9c30093af1a3fcc3a62ab5efe2e944b83cd93a855cb4597f3f788322521e9e11e8adb20fef58ce1185717d97c593d7423fc0498dd49fefa8b40e6c14ed55522b71298c6cdb499de705e5824c8a00431c778d21b82bb7ef6ce728d669ed541701ccc6c03cfe0600098353c9449b595017f567913bd2d233ef9455884001b94e3fcbda4edd94b4a254a4cb88bb59441e1219540328520e8f68e9c200f069af82c2dd6f36cac81f087183da9d6a2d861d19396289f93a17649d811ee5240c5b7c0e8b69adc82675d2d1dfb14d1b62ffcaf6b83bb7ad220974a87833f6c12987d821b6b874a3cb998211b54e9e70c3bf0d71c1ee7266f562d0ffce4e10dbd025e9a40b3610af564c051d346e2eff83fdc73d80a710c36990041dbfe1cb242b66dfc4dad929108d00b5e9a1899a081326b6a2956e1e352a6234dea100ef8e671f94b10612396d5a8ff765e97ded64ddf55fbfb9f3e8fc202a1d5cd8c178feb5a01f0a5011e29e018e1c9bc26e49901984dfcbed1c059bc9d9fc22538e57719ae514ddbff7a2cc9e2151f7c7d944456c3398f65513e66b73efe8594bc3d38e83cee3a5a939f20e444be0c0b48520ff200f963fd27087266706eeb7a5ffdeda7be32a98ba2a5df7fdb763b7f15bd2506d39c62e9d2750b084b44ced6ef79d6582c61e6caff2dfd69c7849c89befa002817a52542b155bc51e6a1bb50134bec0d6e272cd6d086eabe8f9c46123eea3f6dfc129640d6739308c0c530f2f0a5ab7695721d34d464e5b98d5200e5a50878599b2482a15f93b44ef13d6ac3ad16e7fbdd53a9476398ddece997e77301fdbca0cb2d406bc9372117991ac6ec0900a191c9712af80f8f6d33462e13b3b9953dadbff25dc7dcfb428f0bab661abf3453274648a5c61f729a7e0cb46731181639d43ef13a0ffa1abedac1b434abd5896c80a3116e4593312b13d4f5bb2ae47873b4dbcc51cf2c31bffb5c0f6b33ce5de62ecbcb78f9a8c59aef6a9436cee773dd6e11c177589b1eaf41ee4d3e5ac949d85d8468461f9e1a9201d9d100a835fb094b7258181d4dd585a21dc9a20241aedb30e1b4ba738039cbf237f44cc57abe3fe2820903acce0d716eacc7e78d65f8a166b9da0f3a3db0aa97865ba6be3aff891f2917c55b5220f814022abdb809fc33e0c430b6ab8ba7af0fa94584acb88543f3bfcaec64e953344dd0015ea3fd35156e433c633254c971c842b367707ffdee668ffd328c7c12acc134ca505c87833b +result: pass +shared_secret: b400082a764291666c080ae9ea9f22c383f3c1e87b4cc56775a19c8ec29a4157 + +# Official test vector 18, seed: "d5f23808871544e9c1d6eace2028362b48e225312f77663e9f78cafeb512b908cd9e25875d61a16ec615f4b8ff826856" +private_key: d95b5c5667b797b1797a73806df8906819743e0322070c80d97b77242040a2c6154ce152e2bacf89ba871dcb835aa873133a331dd3450bb51893cbc5b072459026552001c56e6a9ec0da3ace136b5ee150946406f032a475d8cd05c31c14897445ebbb24cba8a9e9b9fc819d752a5f6830162c89c4e7e16dc3b12823739d44c063f55aaadcb03d02c3325649afa5a63e26a23f16cb48091b388f503f9eb6751d44bcf61989fa953c10a5b8ea9ca81c56a04498509f380c1675b273415bc9285d0e765b0222927a979ea9a47b9103c0b73326a35945ec1cc870a693980cb73722b855690bccca1df9290d15b6cc53db8b99a89395994e3f39c13c81b9f3a313a6ac1407585ae1015eb2298defd84a5258a2e62aabe709c8243679dd85b82c08a82021206cf0424b7cab4df614aa21c81d931fc5f0bab9f373fc4a98484bc6fd5606af987bf57842cc4461014c4c737b6a52234153986aafd737d4a834971b96a711693716cdd1639f822a43936b94b7421bdd660503f3034c0c2596e8155684abc1e81c218151e2d44845d781e4a54f33fa8eaa0cae0d96c3509c6e5a973272c0b7616a929a579d6d9b83ca8c6631b87f94457312d9c58f66b20c04297b881d11e9c97357a9b0e50572b3430722963869ca2a1688f623b5a3224d2afb7bf6f4ca115198beb213679c210067a32219cb9557042018467863c10a4b449bea2b486a85ebc0ba8da9a3ca50a632451a5754b7eb0b7067c2c939bc192bdb8315427146ab6fe7390ab60264b0875fd2603d09466acb2694091340bc8c6df3fb8eaef1664b533c0e377bfd0bca39f801f40a92989619c41756af7b4cc7551c8779558ad4031a6459e6abbd9fc68103fbb95182c9576135e154a619180b1a694e384212fa89963360791666968cd9aa5ed3bc0f72939c24cda10a9f2a62aa4cba9b9d677c5df1282e47c29a790bdbdb664ddb30cb154d01da8e87035d62a099a9e9a47f019d6a769579eabddc851416fc9a2f144b2d2c3fecf889f19a2acc434919a89d474ac628c03ed6050b3503c2ccb4612eeb831ceb76ec9798c2738429dc10386b36be606622d2152db389b200c219e4957bb6ac6f59739bb60de382c88ebc442fc16e5b55cfdda0c9b78a18b07a5e72ea3927070d7d15951f87b0e09bbc631bca04fa0d5f4630fd04a16d24bbcf351c806c07c32aa05b19009b66181413c202536d52b8946fd8bbc65215749359a3687cca6982c3ab0435da4edf454a69b23726c503cba4ced872311799c4ce57c0e1fc48cff587c4b552da83b5472353c711c6f220bb72540cfa651352287e88d0624df8248b17914f654a61ac0fc30856cad09f5fb984a8e334b5333c3010c1bff26fa7164058b2343fec330f4c2e93b07c7e568d6f437c0a307131c70e0821637519b1673a3846829ae11ca2801b5a5eab191ce686ebd2c2a8695f357bbcf18c95c51591b67aca77521de32b1426173a0e059686007508da93ce9089bbd43479183d0705496d1709ef41424219054be29ec816868a95146ac5106e261d6331a692306bf9013207d60a7f1519d0d7ccc03755eb5c31a2982a81339cee7b810727471d447df481b87da70f7651b7eff647a2eca76f22424d97bfe0b7cfeba385c55253559b0372fac0c533055ee490bed57446b637fd0c07c173b2c61345185a0288f1aa074accae383c75208fa03a6a175c3d19481e79ec833057a8d2c234ae9b01376c21bc75277738b17dea03eae594ea939e125c2592bcc95d3cb4f76a8d8383b318a48f7481b6b8419e8bb47cf1229c23c4800788cf91e465088a580762ac5d31616f114606c54efa9c0490298ccc23200154342dc7709a5ca5ca3a94b7a2ad8ea734b6e20a2d15acd47c6aeada3ef3331fcae173af5191ca8b74bee31f1b7506b595a3dee0899381111680ab02090429b93efb7b52a6884d401841a0d8193953a5a5f2417df927e5934c109722cfe18d0ff93a3df69d9cfa4d7f5801d3294771156e828924c65a18bc798006a1c8eefc3b4176634690c061b902738024c0ab981c3506d11b8f307c8f1cbc25ec764fdad76fb2117aff430c5a5a468f2966bbb877d2b8335ba3bfca985864f21a9912bea56a007e7223c7249b2e45a37db9c104438e76d16321289d4b07001241aa2f0a1a24d81c27a9adc0c768e1b3c72fa08e33f77c90f4cbdd530949b2b67da9a15f336b679937aa825989b9a450fa5f69304d37e585bc039a154257ee78907f689dfdb246d05c94c3057066d03a2f9825be6a52c3376efbea3fdeba68e13716d810b73662adda56bf30031b8f682c8ab08c4b0978bdf113b4432ec712ba306a63c327978224597c3b8155551997bb7e2881102d8b3eef786be65196ba84478c1c629f45a885db1aa4ca443d8a3300316608e8c2f71c6c7516ca5eb453cf9184bed2888ec592dcd53fed23b5ceb98cb575c474b51e7fd64d73d54f37b51fe1d432b2150ecd5b0dade606d83729586b2fdc60414a558c3c19122e47858675179c2229779b40cd882bfeb3059ffaa93552443fb70fcabb54a7015f8b6a0798b090fec5aef185cc95579aae5caa2b4923ddf65b2570c15b1b0464c086114975dbaac5a564cdfe02cbce8c68752000ee81a9eeac55d4a81be9b3c66aa3875761049565a46e305459fc7a47d75316b59a371cab01dc3bfe9108003d5f868b39ea617ce3091e3ab646db07ccc4a09367b352d1848b26e920100827c8d4c92f0c222d8482606233adbaba3005b58fd3248e67cc75733feb52a5acf5a41ab71ce0ab7e8fca8113261dd4b7297ffc9d37899ab40b0637c02ff1c73e81a02762fb264f51c849d387b9f7aea345b5e2ec44f2e0866b9574bcb13ea0d0aeb7a78d6dc7b5b0c9838297c05409bf90d86b3c1b59b92c998a8abf34fc490259289b431c5c5368acd762df8ca04e0235ae91bfd5332d67169aac2586deca4c8174386617ac98471366283f3d30a971c62f35322ac96a7b0c45779f6c17f1117a2f1b454e3557ce5733cf979156400c5a780a4da91ab8d99c4f98b141920731f361ec30950bd0c5653c83dba87658674c57473dafac42f293bee44034b9489ccfd5141ee42cd91b3c3cbacba092cfef6ba4b0a716d8162521b29853522356943c697a10948a50f27008d8a303254327c4570af822024f5b9aea82a62100856b2140015418a9ba3e77325b911a582e92a8b8e123816405ed8382820c0ce5ca491c0692b2b542b6a67ec87bb6b0334c1833e12aa958fcc0747802853f8536c1e24a0ea6e13ce23c96726b5cc886538ecdf65b7a485b73a34a72193af1ea3f884d820463601c7f843672bbec7d4f3029e1be4e1c0258c3a22ff5b50b2674cc094ba7018da2a61569845c17d26f +ciphertext: f3559c274dcc21e1deafae8b7eb2b8f482b16570c20782312aea16690eab1b983d149994a0777c22038b785274ab1811bdc0697aafdc49487f80f4139bddd82efb395dfc83712b4e53ee6de05016f3277afeb9e3aacfd0dc21264822e93438fee414f2d8284de2e1d958a328ddb5107532d1d0f29dc93a5b833600469231f513f0dbbb1b32c0b527f469bfd08dbcea4e578a841dbcd97d92360da0334e5a72bb4b1d3b936ea94435d94b23f3a3549a11c204e1f33d0756ffa92e7627588f5edace35988346621d7b2d407cb5c3fc89e45bcae6faa82b1b5865419b9447e77055d000de9b0d80fa551362b548b3f6cb76d2325a51097e05a75691070619cdc4766c0988325b6341805a865fada300b997a2345378d848cab9ee8a40c9447532089f47f2deacade37ab519f8f10c5cd7f326acee099ada48f74b12b799a41fef7330bd9bbf23e8fde26ec7a4daff7680e1f89f25760a81117c2cebef939d71934425a0ef295900c58c2eeef7f2cbc5bff1ccbb2158721067310e0640f9cf17de6dfeec8c1d0635dbf03d32b1c302b866b343cea1c9cb7b0a57a69f22d1ea050d3587b152dc05d6a838997bbd38f162743200054c1cce745fb9655fde5020a4fb1f0f8da267fd6d3936c78e28d832534e47325aa19f6ae0fab18b9357ff59370e1833b2fd3cd65ec1f36f0e506df4a517eb6298c2e5b1dd9a8ce9dc2ad97522b607c8d3596f47534f0a0aa98aef70a9721eafbb8c46aaba1e2b8b9f12dc63edde14f2414fb3af9f76f435efdf56a855e4f75e15d3f64c1f655484077d6221b928ce551c4854f6f2e249da98f1f493c7da414e7f8bb7dd3596bc8426d1c064df107959503801fb5081f9b0f9cafea6d0c76e10afa23a49ce3b0ea3c648d895bc6e1b39b6454a529edbeaf86f34f6b253e0e5104777ae4ee5d9f3885ae099adac63db65e43f6e2765c7a4d142a62069032e3f72422d71166fa4cb75e205aaa513e4e1a6b87a070ebce326e8f17abb2b81ee4e9c7233b5d4a3c1c8754268501482431cc4850f6693139af85ff841229d499e1d37a3c7abe1d80c31121cc7790fe9a9203f97eb5a0f681c734066c1981adc3b0d9fe253064cb546f46d92ae06cb0e871f964ac0baf8f8d1e8b5d1f3f6050374e9440067a6722c6ac370baafb51b5af44ca940373338beaf1b36421453757287f18841538c6ba9e1aed10a6e3f8df29f4db175a1e595a0d880d72c14217030a81f3e57bd284098fd93b5602e90012d1417a52a5c1ac4d0641b0b9f39217571a30b20a364045d7ac2c1f0ee778882c6889c828ca6e3d04d205148730e3d69834526d5607b554c6f4c34112f94a39b2044642b65c2cb7a28a0f8a34c59d11af9cee28ed98de8a3e65239457d087d425dbbdd8591288d4b1179de2e6af5c4c22e4ea30215a635f64f5e632d78a9475307927a595b88b5dc6b54c6eb32fd249ab9d5fbc66a2531341eaca902a8bf079c4bbe45d0dec6c014589182aaf13bc05be177be4be4b8aba60f744a21c664bfb1182d7e +result: pass +shared_secret: 03c7470224ba22fde280005d9a8f8354c49459e9a168cc282f9d41f4f0d2da2b + +# Official test vector 19, seed: "822cb47be2266e182f34546924d753a5e3369011047e6950b00bc392f8fec19ea87c26d8021d377df86dc76c24c5f827" +private_key: 9d897195e7139d5b6b8075aeb5d176b60bbbad949d5890c707f460341c12a79ac5e18a9126c7c2d0d59456d1ca072034706bc5444519fbea529b17b3306113f73c840ad3bc015862de98ce93344a849094ea71a6d5b1742fd2a811d389ca465419cb8aee9b2dc3961c4723a7bffc96acbc79dc4b17c99b4022655d7ccc0a645981b990ad8ab7b9fe6a69b511731c84a2df77c2bd917f1220235e91ae5fe91e30573dd67a16ccecb18f4b9116958f812c7fbccca50ed732b3b946645b409b74bbf34c3769757c0aa0a04d690fc2c14df10b334c089adb54cf6b731377d433cafba345dbaf06366eda0975aff207e0d545a31aada7f85369b62f7d1983997a542e899aa2651a0f3417b142bf1317aa9b766de2135546fb2224d5aa298bb4a90b4aa92a11ede75f441734283a2baccc2f2b851a6c314e81ea510c7a31f85855fe55ce0656a88ee689339495d5c293f483bc67e49c86644d08d896681cb2d28278dcfba73c2bc2e050c9e277ba7aac072724b7c02c2ff0e24a48ec9d8b46298d14657fc74dabf368c6b0272fe3a5ad280130936a2db57e5d971d18916ec39b9960c73e2bcb5697e9690900b9f25496127a58d50062ce88c0f3ac9dc60b9a9f82406e0b0f7c6898806807f6bb9e0945b7563136cabbcaac04c6b0ec8eaa60c26fa604b073a0ca8a925ac99bce9bce26fc7ab69c9a1509c7ae8c97e006b5b8f3a99db2850332986d65b17a67a1d2cc80d476cc3a90cd419920e302074925375987cb7d268ff1eb4adb07cc4d133c381b47c40b42311a8f21881f50ea68343483ed6bbf34344d710c7e0f769eca3388b84c62688b4cfec37104f0717cda20e21b871e267fd275826da7aa92b372fac774b1611b18e35dd6db3e52a58c015a8badb33c54a60aa4005d55eb16af7547d217670a621908a9b25bdbac84753495c244af191f7d73ac08c94b7c1b522916790a245d6de2b274250159f89bb47a1e7c0850cb97bc843a7a29e594a5428c2ebbcca5a989993934b9a36ed1e7561663a8c9d400ccaa7d5cf4484cbbc80dc6b3ac20926b3a49941903c4eb41fb988f0d77a8d26c2c68a14a0162b926f4bd8a26c45e76c706f68bcd738626a2afd235638f6741d229427ab4166920850db4661d4019fd7ba362065aced015ba3259eeaaa4acd2cf8b1189e4e1c4a3d67982d942ff2734e3434a45e842e157103890c7d3510134466884bc16d7078430e2048fcb58ff0717a5e6987999a5400973809c30cbcca50efc4ed5c1a37f3a0ec71842d88b35d53c49b040bea967a8466772e9e3486306a0cbdc449db2099c349970e8462093b398b7ba10b505a76c4aedaa4ea661af1a712a560417cee26c4b109d8be72b88467752f5cefcc752ab3c324d2684b1145f4e7715e9d98f0a1bcd3f1a567676a138213e202aafba10c15ac75b45e06a43987d9f6c07de147e05f42693d12f9a8877a2cbc7f2e81ff9540ac09bc620527e919542fbe53379519f35c70a4e0ca6f0253caacc2ec83749aeba42bd4a0fb6902946da8320ec2e7954bf2a184f94a31e58c505b1d1ab9c3a19aa8a3c1da7274838c768e21978982f95c41998058c9b58b861b1090a5bc3277a1346f2108db4c0399454010510677c6c12c76cf7149f35031c8df3b243140f9716a571f62a5365a0830169b612abf0075ab40132d51070aec5566fe953382ac3a3705b8566064af52b926b765bc039d6f86ab8b27cb93b809e670da4457bfb8b6be9aa54d9b2bc94eb0c3e15ba6ce2b08ad229a469312a5caa04c8a4fca7c76cf905c6fc4d32127d84981608810a4752b9f26baa12665bdf30882d2a38200798de4a5f1d3bbb571085ab091c03e896f25b8759e43795dc83c2069fcb2cad05b166def78d18b920e0e59853c66bcb11795f604963ac3af33b43f78252e06b39d11449012b0b35bc65c2562a66f7597302377eb13119fb4285d5613d618c2227a8a187b132b08bf5b154745451fa627e0587c24118573f3628e3da59e96c6a66d26c2880c95eb1abd96202b3673bd64a74d1b11396aa406d378183325c9d03b8294177d3d6439fa79a2a6457d9f81ba8134bc781c575413e40082c686ac2f59c3fb45a580d3a50add274add391a09cb6c559623c997da498c1d002b0f9b5254c26266757849e7598c941333d580a11a1c197617b23d98b7da60b6af0521e287f8b0cb21522236395a60af9ca4dc7120925a4bf497e2ed65bcce78a33555ea459197bd5a499bc7c2b788872916ab3b961f25094cc96659db67bfeab52260456bb775f56e492564456c5d25f3d0c9bbe7118615aa37b21547255112e590eec52928173292450abf2e834f6207751b068200875d7303e3bf7141f28aec8653a463a774dbc33772849385304b42c99d3e531b0376beb153a56734887c1cbe59b55bc3cbb32da63d908345b200cfdd6303f3999bc873db53342aae6ccc789b2a4c72c7d08a58feb9c939a3214aa3b2bd27ab108aa89682e08729cbaf93a68613a8f56b7764c23cf085f6a970d8abac213f7314128aa64da213d5a53d2475f7002a6c354c1181bacaed645fae9c7509a0b10c8317f714d37f3791c03ce39c79aa0548f88a69dd6f87dd49a8e63307331e00c5c5b5fd7d9804f3c57028c2d3fe65d87ba7c07624fa35754421c4eea618cda1c5434b09acd0754e04439240988ebfb5f6d6a43c0683a287b5686364fb9fc6a62551916046442004caa42428dac71ef5879bebb09c5dc919076620b9701a2d8af248672e2ac0107c62159511cde45120ab84993fbbe65022dcaa6369508212d7a915183555181b1b9610dd147516f2496eab20f727724d7178357f50e23691c29400bf461c389932e2e663faf31ac53273058ba675cc0c3367c4872383f683a834b4a522b92276f70022153aaf4622f24f439a0d382fbf5059744c487013501d41fe9a99966506f2f5651b3ab0fd0a73c02634dae9695e850c67b154455aa749922229090b621e259d1f193b524579690262f94c114d9c690e170e526a99f5149a2840129d22c740cb5b2a50ae7809388147b943a4263d50ce72a2fc2fb6efc85c065502642f015d6b83aaf0880b715983bac12fed75b1c973046c79f72436a420b790543349b917fc4c3b18db80a1ad346389180fbb9bba1a6a8a0f0a62e6c24d580a16580c682553134738d0cc1ce766c13bf74c82ef5c548f79de19a0f2a9236100a7adc1b2f1e1b1d0066b9352ccc40663d53b0af0df9ccd6353381e5030ac08c3920847f233164df98ae8ab017efb305fcc83fbd22ea59ee59bb27757389a4a68c898dab92d0f63c3340dfba51e00312a05e721932b95b11f6da1c0ec046899a777655233e4e1b5ca44e9afbdc67964bfd5d5e3dbb45e60d03cf +ciphertext: 262ecbd1c283c2064969cc4fdd0f4db58328c1d0415c0d279a737781571f37df0285542dbd69868d4dbeee51b9f7e73a4ebf5a2fe760ac58a594c1d451415eef1bd357d9d39c8c9e882880cf9f0fe8d750d35094aa8c8a7a33042d75d5885a7bca143e46db1c1f6ca6bfa81ab38263f74e78686101477c2f1cb733a0159e0b5fd1e3a82ea8b947f072ff363336bdfd185bf8c87f677db91dbd8f9ae2e40a3333dc817cab3ba73222443be7ed324d066c2cecbf48cb1a461610825ec8973327fa5c4291fc470db2634a942d59ce4ffb7c1dac2200131cff9ae5c5337d856bb5a959d9094ece3359f13aef1db3a81c32bb29fdb18550de8a90933402f9609576a621a5b8550a4d8bd025b08ee5fd29a83247285e50826cc778806871e9b4b2dc9257315001ba2ce2f15928b730b850fb96cb796ef7596c49c76baf598db30e3e03421dbdce7ff056ae786daff65355ad8bcac2d9fd09d659604381dc650298a9b0ca49ad3713569e6a5883b6165285d6ba97042ca40f823fc6a29c20777480e503dd5c731be8c3d5c4dd2f4b3331094a82f12f832dd8b2cd1caa43a4064cfe3556c4061cf53aabe3a463ca692d46008c4e212b475f8f127ff9f897dddb908da2cfd650db6289678d6fa52d96f08428fc2f69f19eac596da9c1ee228517f73eb45f9ce08cf0b56c2ebddfd42bf01b8b49e00fd6402bff5b456d7feee761a2b36aa31c363ae9635adf75979d2082abc115c8553a01c763c0c068c0b3d17b6690948392d5cc30c569c1ce7ff0bbd769251619559eee99523fe5e6b877e1b7b4b98a212b714447ac970d1b1f6411596c770b427c2b95fb0f4fece8dd3135bf3f8f6f4c69f673ff652a8eeb24fe64170663ec660ca27eeb43e878e8a4d509491ac22f04cf4cfdf389177fd5e5c029ad36caeda9f2a2eae6229b3a5051b4ca586d7a626ef4b2754028c0977d2cc6a803697a9d744713be696a0a643eba0f758ee467118e8954d273141a696eec5dd5bb3a4930cb825888bf95f65f47a2da8e4ae014264818db44634d149da01ebc065da3c7f25fd74ff61edee01c0fc86e19365c388b45170ef50bd19bc4528fdac7e4aa5fbcaaca5ac8f7c3600c6006924368654ede616e00a6d425eababcb41cf47cd508a004964a628222af4d8a049d7d0da51bd2e2c5a1d10935c291ceee529053a5d7126d544737dbfc866af9c7803b94d46388f7cb1c03428a8580f67e413d106e1bc65ca4794e22a97b9b30887a408b3afcc89bbf12e7c962fa7abc566cb5b4147ab1da02d2ac0dda2cfdf52f5e4a179e2bc308de9af848a676f3c3d026836b110da01bbe087c613ea6a364ab98d73628d1f9e4bc88d0421ade48692f641ab46ba6dd9c7d936475b98433dcffdcfe5f8eb1d7911fe4f584869413bf1cf5d156a02af1b79bfe3c8b2d01c0a3d76ef0203159adecfed5d418e36ce5def56f2a5b5400c018a71b9f8cc85ac6362d03742549fa6a84b74aa7d1ac71f5295c9e15a6fb48f84d0eef256357d6f5f00d2cd27e4092714d +result: pass +shared_secret: c31f7372e8c194a9589042477f34da3a60d591ea65e13bcccc07ba59402ede6d + +# Official test vector 20, seed: "81401db81138d6874e91b7c11d59596e4ace543f5a3471b6fb00999221765fec3ca057abe20f03b2d59003375fd71fe8" +private_key: f789391672b25e088e06ab6e0167cbfd56b01c01876cc67ea0cb13a4491472c4710f9cafb5d1068c207fa9875879dcbf60e78bb6236f2f00bc77f81b98d74da1f3354de5007c0b5243d15dc87282f2b2c298a5324f35cd2e6327a7008c51d2815d833e17f09b91a047d15b25e0c9782d34bc474a973ebb1585a23bdc22811448299a0a6d42669b31951da1f949e8573292089bf6b0b866f4cea0bb110fa5435550c11c477622b6c859691be5683198c198d2960f8932606dc3310f3193663abf161bcc6e1521a3c527b946a8cd20bb9c4b0627e9778e521ed5ebb7d727c79b687214c1c55b9a5da230598ec71dad4ab1833911e991531f0a32ed2a773d05a9c166cd4cf4c625f3665bc80bf1d46f88560800ec2c04a92fad947e406b8a14061642d879b6f14a4b2651d3e1c502322b256a7c0fe403038125c9f5412b5c0fb62bbc8ee41dcf071c5236c4d54621010a088970c956a5588696412d75b9e6f5a920481349634956a9a097cc8a0a5897a6fb60cc103aa1136131c5b30f4469a73c52d43578df35914d5436818a16d3eb44ef9760922c354356279b793a05a93214ac499b454e4b66ac1c1188e0c8375d0221c8b80012f21305b57ab023b822ba5de2d96f4bc0a2420ccc8afb3d9a983a59a46d4a32c3ee764b0d696669ea5b458816be782f3db39df35b6624a59f092782c886806d8503ea4c177e7385fed9c8d7416bbb9708cf8cc32a2b3e198b2c93bbbebb7aaf53f811ce50cbf173a92580861af698451c77fe1556d79a486dc75dbdfa3a09eb150f477c87857b0352418c4a66c57a0f73f60a16941ca247b4981c4aebd24985062b1fbb2f85323f87f248a71657760c8766900a1f260f2f9b2a4bb1073746ac6b73998b6171597b9d7fc42b873271801b6dd111162f7b2ffb55b044e08983f6ae95f731d0c32fb8d3108d4a048255a42ee290d33031521b46579c864cc04652e59252a3bcf315577c31695d6c8e44517b5ff76a75acc608b180a6d10842c4c92aa0ac13a5515d6c21ef25cdd3f81556f336f1da4e7fb89b73c195dfd5c772b5abf20223ce84c297b32e57a1467225314c37a27eb43f0df947b8baa3cd38b6c5cb2e5a99cc35b9637fdb1ea82c5fc3ab3c9db9cc9491b6095c499a2377a698b5b77799b1d00412d0c258d48e86801bf267cb01f17d335bbf4406463ed9c6575b10ba16622c888517579d68129603b0bdfd8284351183b6114ce424557eea2d2986bc238c85d2a1443af19b8d7051e84ac6ecfa8339d22deb23472a856b3056cd5b280c3f395f2b2370df8752827602d64bc033b26b1970c9c8f020d41c15736190db9a5ba1a87afe9575e7918e502382d9f763bc3c5b7313c8539564df19c1deab0ff7ac7d3c48981e5ab31691c0a52c4818611456481668ba8612f410b78c21a68505335b8f4519c7bab53328a700763a6d95163f75dc2ba489ccf92cb2ed1b72f2d904a54c35aa0c8397bb06cd676b28cb6d1e44502550c9d259a05204272b93600b09244423a63b4c753b69529d2b3d16114a836273fc702f17fcc046d7205e47c0903541f519641981576409a35fda1e3e76cceb8109ef446338424aa13a741b38acfea91a1c4795925026801c4c929171c164522aa3ac2361b8c80b8cd3e644f7d169f9a20380bc575968901ed7783b6969c57461dd879d4781bda106a913c629be512788d4c1f92a71f9f819ab7207d1a65499e061c5e0447360b4e70503bd58511e4c3333556b75f6a8945b8661d0572c764c82ca70ec870ccde0cc5810b816c10a46491e091c75f8b24eb975867e179d38345bdedc627a725b4d732b7b453d9b15710fe7afbc55beb26c77e9e8a58bfa764fa430f1901928fa4ea1eabe2ee827d44191708310b5e708dea4c5242a8949f658b548a2ad1badb9a6322c56697b513bc1c29872b56fe1e32d9271b44ea0b43bb896ca9a7358f45e1f1821fcb361c6ea91abca91ce95a75588402d1217d1e37a80b3c880aa83c31c5683783e3bc77bc231afc0172beb9957fd7228d8589bc171a2fe24757400cc7e9cab13d90a2cc12b771725e0f2180acc221fe5879a317fb93a10682044d6e22ac67c0722c1062ee70959333c08aaa16bd9cc1b624405f40b78411baf7bcb4af46b80ab021d7c8a02ec8d0417b759cb2dce94409be96f5b5abd1e207a9b906c71c18c763414b2d48d77c19d8e617dc4e41c3328ae39c18aa9aca985964597686c919584114c4b2429308e123fbe9a8fb86327054817bca07df8c7adb4e2a941742395cb6ea24c6106eb95cc0868f8a6452efc5aed297d933919b39a8da93137925b87ada9a5cbfc5a541c2395bbca59f95ab2c4a5352831f0d143dac60b418c2051390396326d49e27b7b6159c43b5de3e40d05956dab59088f417302588e38c1a21261c62abc8891e44ec4c7395421ac09e1b448bc2349dc88c571c74e470474935ec58001be48b854a13d9855b8c87131985c91484a695ce9931267c1d0d0b9ceb4bc7c4a11676c267958566d59431a630d4ecaa8beb98bafd22172a30e14c9acdba26922f0aae067c9a0e9b658630873139b9555b63a73bf8c65319d9423d4a927abe86a95b383a7c0c8c54170dcc70a535b1fd814cb6c87900ea94eed7b51cba571dc7b5e6370bf4928bbb27b1f66d770e43cbbf3ec0c615521e2b8adddb42971a12db3a208f6b690289b059913760471367b4154113c14606c046a9591aa744683c4024b857293eb0e02ec7c75270c571248c0aacfa7e47a35e72157877847db1efd73c0922cb211c4538d018c05382e9c97c3d98cb375f78d056196466519baf3312559315796ce3504731e811432a83294d75d8365391fb348f0136a7fd90921fc3844f57d286845d6d663e855b50d884f511a2020b09048298dc4da2be4a8398d260ca4735d84f2b66b2405d48032cf3174fb36b325e723af241d280863b4d2099fb429c0414433786d33f880d7a15d3fe019e75861c7836490ca2a5b0771ecf904f794c746b4244d99226899c847814967454d7a4aa0fa743e2d2838bc9461446b61d9b006b4240098f37021c7631131a84bd75d33374b9067aff5e900c4d0490995875606a7baf87b8f4960dc84a7eba96f4055ab6043c9fab61fbed883705893aa89899ab975284867f63035a392902a779c8df9cc63a1b944943691b770a9646cc731a93f6cb3dc3b183b71429770032d08a778217f9b72bb16ca81f07c66d436396038372aeb8edc031083d95399084751bb9f3d32490393b510796c16c630cd2d7e0666cab62b5d904befe6e93d8e755292fa875609f2f63bd194c87e6f04db7c83d8bb1b9d868bb7796590a2e5c7ed86cf2c5c2a898662bc9a81418720bbb632ef9cf0b845ed052d73 +ciphertext: 6aa845cf5cc8f06368e022af35d4fb1ffd740c05adccdb4f92b1f2b77b27a219dbf3e898d79dfd01d8bb73b1a9031028ba2d3ee9e02a2237bb106d1ebc05495c547fd93db7d3ca9b508a75525b13c5ede34944e8931b1c1b60329b96b49a080520442fadef089077289e7cf0570947f927449dd90c296a95306a6de4d801c06801117237feb842bb4cc9941a578fc6b06ca2763ec5f24ed083fdfaaa2bf77aaac924e1c4add5721bc9f23f918eeea2657f0e65f16f9c504282c18f588c6bcf684cf742acc6a96e33fc6bc100026753e9ffba26b4d73c915715a2827e92e19ecebb973f8fa664da4b6b464cee0024b05c3af87e28718eac5074e66992974bcddae43bb552d4be86650fa879dced0617f869a8b9933b0fdc7589c1d5125d58eaca6661d6a3d38d436a55e7aa6735514ada503df971ca3a507ba6c515b58214cdf146aef335f6e8427d794d576f9bfa677358dfe57663b0e1c5dd762bca16bef9d94fc8663c66d4465aeb8196ff85365cfb2c9b1315c2b444e5df7c710c68b08112aeb209cf8d166b9a7920005191a2530b8a8705e4b8ad5a913c08e2b68891583817bc0fb7c8bc0ab700275b81f32ebe4ae4c3c360ae7a0bfc60f3400fc1cd4b3da233476147790c8a63fd8c1d5be09bb516ac4ced4d6661897320186d7d150af8077db1d524444aee7cd374aaab5439621e0c4b5f72290dc24116afa792a332102a671547d38f9b93078be4ac7f3dd35c1eee5414a57db7a4187a6e3125142c81474c4deb9829f704835a4efc214184b1c88213e39ca70af72fb5e7d5ea58b43e829ed2b944787eaffcaf0ca13318a0d2c94cc6eca65d25d3c55038e270ffcc4069102acea6c5e6ec8de8b7c76e871dfd8b1c9a235d1bd2060e26c5a8fd13fb3017ea1fbfa72c608632abfcab1dad682adb2819dea4c7363c9ce3e1a117776712d2884968d9b56173e1fe46f8cb83a027e39693a036b749532320a9e5fad26dc90e91b44c53cf041dac798ebfa1a5cb444ee782d4788ab24880a6577398424d348ecdc45242b46b299840a9b01e11746eed2f975dd58cca828ba746764c5d1cb3a392eab866239a553c52e0e72e88bbe8063876c98d38956ac1ef62763acec6f8ed9ae6546c145090cd990149b7c57fe84ea4657310486e73d85d3f78cf82ef923685042f1c6cef7c7bbd53c809fb8bb535a3ed305c23810ba2a4f9f63da4b7a4cb45599869b57e4f4fcaa3db95be0ed98ac715a564f31c99aabcd8a37d2ec38ef929a15ffd16ec33afc8d7e5c6cae3b8cda327fdaf7bef466a24cf7ab348f798fd8a9e12e9a4d21a34f373b60926b7582d504071e0735affd8d41287ca37e152fb4bb2bd335f64d8372bc4a6ffd472849d7db497f1052599e7eb7a5acd0042e473d303dbd86241966d6990ed019b1d1000a592397495e1e599f15cee611ffbc9ed50af3f29a9d4b27ae92004ff02c0b37fdc04db01e0a07bcad738d73845074bb05b5952c701c5b1eb6a2af17ad5d20c1beb910fbe0c21d0c5eab751bb6d725d +result: pass +shared_secret: 9dfd08dbf59350ae2308096f935c6767daeddeb2c6997992d4a02c14b0e58c60 + +# Official test vector 21, seed: "30b5de5b73681ec08aaa03f6f2d2169525d25f4042a5e3695a20a52ca54927b85f8bb948fc21df7defc3910b28674994" +private_key: 0fe71ced368f0f36b7b8f1be4802ab897c8919617030a5381945883b69ba1b456a2704c52d3a24a3dc3e8c35c09655cfd6c2c0f14489a1db0a991cbcfda5b52d708fe30229c272acdaa3b7577cae68845776579ace017b2c0112adcc57ce39265eeb0c5b2585ef868b6bb56a74089fe2373294298809d820499342c7fc5343b85493f30e773668c790aa55234ae7a230fe2cabed5a55d4699b6e14155f5793300676533c230f529f8c762ff0520ddb9b78894c241181b69bb09e3f7645391367499c707cb4454353b8f6d86fefd8a3383b00d35089d6a62be348645d8c03d5e815810894b0e962e1c5303fa5580b8483b8556f55a62d49da3257f63e03533c10b74190134f1cf3530c025bb0035896628927e8c3c926b27ac05265ec90da933104232b0eaca457c9131f95069f40141db8239c483cfccc26a2f41f5b7533bcc26f4ae13ebd26986227bc4501a3f5d74d11da48bf1336a8483678a4be53154bcbb62d609733fa678fc2f946ca4c5de03741ad6b5becba4a9688c455c81b4aa528c2515c9cd33c2d071c1cd96b5b483797e9616b43bbee62088e5987eceb1a7b3217a31c37494568b40b453147644ff6b199465266911342b3cc7026b62338413827b51aa16ea0066c0e4228d0887775b89c4858a46e018e5368ccdac224ba600ec8329b0a75150b82b51fdc5eedcacb9589c870b48f02338dd3bb99501a6c6580ba52dc4f98b66564736c3f9ba887eb0351b60df54057245c8098dc440e76100d4a4d572a7f34f80d5742833f41a3bb9508359801ed187b2e94a97472c9da7374d33ab4bd425c7592cd0eb155f1d90ff1a03867599fa4c693472233f2f8c5cf86c89be5921e607566c226c515cc27447d7c6970eee6851ff06238ca9b8b18058f77357590b6e88b5cdd2c1ca7e477b25a21b2a586ba231dff318f972a1805b280df4445545a8c874053f740b462725007748dea3866df03c1b68b4d3eab9984837f0958a905ea14403a1f135c4eae2299acbc5986dc0cabe31de5459188365bb20aa917894967b39d535b5a022c5f2d02cf6431afff02b9a52162622249871b537e10cb53aa14d301b0ab13216528893b08bdf9145bc56451fd251dd0a926357303860909a1e132ffb58288752eb9cb5629591247d3456113279ca92dce372f877a42802c1dcdf175c2dc159a082c0727122618761d667b80a272244ac8b34b56004580627ba261749849c0a5986494ba851dcbb0bec8a75b1355656a824a6f37bce21cbeb1f5a36fb1639ee743fae1ce0cebb973d2a0e6ac024f434fac8882715146a5d0cf3f3ac4a6374a672b3dcc122f2ccc37d4d8a60fe34613e2b5f828674c8216eaf0402f319e3fbcc1bc9620ca698b42821312289a2f511733611ac45b0d1354b7fc815afbdc7ad8ab14f1e43f7ff73eb626944b97044021761d352468cb334e1abee2e7a7d07751a34b35c9f2492f258791763be524a00e37a3cbd31c86371cfb71388fea7e67a85c3914892d216aec165eede03cd02233a5c97af27c5ee0219c8fea7364933fda62a3702a05c207527d79a4aa44277e3ac03874c14588bc60f32b5cf60226d15377884c1b37272507915fe97be0c4aa282560ba5b2ddaf0b0019241e200929c660cf7770e111043c8dc4af1014f7ceba48a445815408b2823666c6b40684616d823c86787a412c26e521ac8c16868d7eb5646909027820444b8bff59ab46086631d5a0761a75a79d76468b74fd8c20cb9784929f2a78ad1882a094619325cdfd05de5a30d622551c840ac79b0b5b7a513f702cf58333f8b0382ce055a4c138c80764b8f882cf14324015212034581b2876efbc3ae9687cdd7f2acb964cc18ba90005730d55673bd519be3173d3e231166c7ac0193a4fd26085bcc6607d4a6f73367efb5ac1a1a063fac0207766da41901b8a61ec7e45bcdb73584b5891ef112251a84e9c07ae7c16f52362cef10aa3cd69927db4175ba47e225a220dc2653a58dc9854210087ecc2486ab13408f92bf902635d2ac331ec1c95402bb55b73b5cf063d3885fd1874d5b03100a993eaca11e978393ff33a31b6a98f72479ad9b88d3d1395c2726ed285b793c489e09a8a7bc744b361ec87427c399290d092a1d58a5007ab2209044895941088a81b1b44175ba3e7b038ed17b1b0cd5bbdd1bbea3f58812a51ae58216b1c18907f131a80897353a328435b927d377a45a6be2310cb22076cc428371d4b772ebcead61c765c875312cc91e73b20be811706caa4b52b089ea1e43d7b61cf4b705c1b7b3739fb92c53268a685c03723b4bc316f679f4d8b87375a4188382e711b1911502e502a3f523bd5531b30298815717ce2211283cd675ef106ac5d4c37a6809d7e3bf3e3c40c6c5092c34198659849713c090db27c78689c6d57ddc90c04bf1af5cd56b11c013ee7126958aba8ba7284ed58828f1384786379eb0bb2b8c50a504a3b0fb83eb5964ed6c20b908731ca5c13d980d9a1c0af7c7527da50262c65f7c2132355aacebc1ae5fa7059e7310d6d95da97871c50a17c0d1c68dcb6bd7a9a697b9bd9bf15a643748c83bc8b244058f0c93e7d1a99111ac6f046a5cd1713d977650935ca5925d6e10c84c7ac692527e27c8465ea46fce97c64dc66eb1110188c7a3afbc94c1423a845b3530e35540805c881b999a6b28ef185273e584b9acaf26746829fc6b1c88ac03578f98e71b67f5101de2233c841d2f303c52a500b3d1bbca883fe49b5a233b270bdca755658448666dff384efc9cb26a664106c49aa46c4237d9ae0ef37df159a0c9e880d7247566113c12bc4451f4c6b4946cf76c7b57f737032741a3047934b09e697acb2210b05b17047ea8a460e4cd9e7068b4202a8912812a04286208202de04d0c91b9d62992de76497dd0986917592e9902f33c4999916576eca4bc8495fc7233ea94671a3588adba1355804f1c475ebd788d683967aaf9b07a3cc9ec4c2c91a61e0456c18dda1a238132d2eabff8002c0ea6ad88d3ae3f4769e298aaf954550fa3cf86944184da2cc7303f1be393b6580cdc1a0e55bc3be7300166d570fc4b8644156cfd6c8975c29059c7a550d4b63d242b3e11b887a31bf764a911ac62801a6845d6589b0acc55e4c80cb37a3784ab8c048abe21204b152069fba2d6b75cad8ab3f133678889a99d346e3b49c0c41147deaac27bfb7c8aa3810e3b74bc0b205f02753a48457bd4b7b624a3fba1443217a88c65c5f63a0793951666453692c56b790391a7c9297e5224771c7a441d5363741dce698c33558c584f87ada29bf78a689417b645fe127d124339422be80a993e623d13bc59f3406a6fb6591121e25d64010c25a18676033e1d7278ac5f2d0b43a31f3a4156ae710465 +ciphertext: ad805761011ebcebc43ee0c2d4dd21a0b6ec492ea384e8112c989442a37034525a90bcb6873464137955f8b8e41189fd97c281236242b48028f6a76c0732efdb86e30a449b895b75f9ca822cbcba38abd856a21cd65685abb38d5260183e52e69f696fe09439dd3e34148c9df57482b55d5ad6993c1a83876bcd4baa2dd542f3683c2c8d62db6268947aac07d6642cb09984ea122072c8fe2869e5045d30bff4f0caf63b1d51150003c459916ca2c590905aadf0dc742a2e7f4da143bebd6ccd55db94642ca09a3e62246a3a72399193e5f925a643c75bc0c7cfbed989c448d5e000d4e433162785d2b95c7e7bde8f5b4975dc8b16f236e1f8118c130dea5fdebfceab87582eebb27fe46f313fbeb5c8df0ea6ee306e7718bef06615e624e1880ab21c3cfbb53fe3fe9809e50d8480e6f9752478109e2e736fd3fac84d9b8206c40eb17b9d4c5780bb8f5fb5839cf7d3790059b63beae82c8d1af8477544710d38db1e0fe2beaae07334684526d4f5386ca5b7b4416150c2e928c015d4c5f03b1c95eb12056152bb712aafa12b1af1d252f2eb1a65df5b71292780efc41de0b4d49ecfd2de375d2550aa1f6844b06ac59b8525d4a902177279fe435ab7e36dea4ef0bb969fc5e91a6a27aca3b6abc9992aa485e80ff8103ecde1fbaca9c55dc0c90e119c81d6a737ed1c46b46fd6e5c4c424913a6553baac92612dad26ec382485a6b03be0174c2ad6f73fa111e0a6a212834b5cb644aea780b18d7ec85deca92c93776572ec1a188d6c912337b2c3d136baeb6660d12007ebc17755df4e07758a89151248b4d700336c5cafe3515484dfc9a7eae2f283f87b474d18a9d25a97a4ee564f9459a0d93452b0bcd3de0ed8b6bfac875638d80bfc1c734d8c9a203844dd30f0a352f889259684d1ef983ce65738683135afb28a74346c4b225893c4148fbb1593efd3a3c297e2fc912ea5a91cca050bf2329d3c181afc83809a5d73a8be85346771ad94080aa694a2d6fdd9d3a04d6ebb0eae3840e96c78fec095d58dde728e1c04d2f067e2832af5b1fa21bfe97e6e58d980bbddbbf7aee88f2560da4bcd5804008f7be7275eb5eebeb5bf1374bd4d72ab894b0ce892d71397ffb0f6b053af026377a192089e8f64790c178cae6e15e213957f7ba3515c3a001b1e72288828433624bdcd49cc2be5cbfa9388fb1a39312a391abe6d870f377c1c166c5f1c0f92cfac3c2a7c2bad2d1897c592a25cebb15425e9e23cdce8e0276c2aad0ad092916225c39f7d94f9432cf1622a5c3a8cc4a457d3e17358cf171a7bdca13512ed376911312efd62167896a0027e3d727c2d6284dede2dc0c3ca3e7609495f12c2204ece6e512f17af6d9391997c5b0f0c15bf9975b38c770d466919a232f66b5a376870ec57abfb6e23213ecc203f6c426a04125c61b4316f5ef9231e4789d8b20840bbd2d4141a9a7be879320616eeac398ca8b76aa95af7cc0743a3a2f2c1a116c536e7547bc93169e11c66fc5d4ed7a704582ed38ae2660d37e0dc +result: pass +shared_secret: 03952e1a4915d112b87569d1f79a39f5d69a8dc11c96d70c529d2162a6024dd7 + +# Official test vector 22, seed: "e335df8fc0d890588c3e305ac92c7160ff199e07c85760a828933750e3fed8c83b0dbe802234481ecf890a32d7a2884f" +private_key: 3937043d61a4126a8c1ae01ab274b31b8424ed88cd180029be89cf1ea58b2a6325ffe8627b7bc4e3e8a4b3c60fc42573225946ca400235bb54494a386eeaae44f7bb8896c4f040836110c4b5796985108d116a76e05c984cfb2a9170811e7cb4c41a12e3601b9fb24bbd3cc0132c22d814bb98f049a8c155e38c242c2156c8b058eac343c77b11f550c52e9207a25213b40648fc70872ed8c050920c4c078a9b4576b60909bce496289168114a24111b7d15f10c06d7b719ac4c4872756d760970132bf15b08972c78f4f1a5a6a15364c0aca1c4721b3c82777878a861b751aba6a1eb75172c952b017ed03c9007541110a935207b037aa7296e73b998597240b60115333e50ba0c6b837c4cf26a027470770358a537481675a7fb7cccb901ce7836b75b010fd687691e96487bda2664756fd6057ffb122f69b26e3fb3ba2625b9fd9c41f4887cd0124df978bdc26b0c6f3b0f9416c38b2145361343c2f2b752c7a885586e4ac9955ff924d2365847c22e06c6556b7858f0d9318c037e03536ce9c5a16220967ac1c55e6c61f00a5902322c8b35bd190042425249f54a3229f90453b0942aa9a31f421463f514dc64024d5616e653c9e94bbae8e82fa914863338c65413a33e520243f92f1c3a888ea8121be984b4e4cfd08285e904c34465bc1477cef53757b1025b10d45415fa2e57931ecad301929437b837146fca445211b5719a933714a1c29b1eb52a3bb36603c072b4ee0b4775d17b7af9c6049825e2b654e1c4bdd8e56f531406cc5297d2ba2cbf19b8c43835d1c184eaa661d9b90a6e99854787c82d53b794d8624d2406e57693143736bb34284608c8b20a9d99695d8f87ae57c83d095a106e793fb7325b80eb26c8cc345ea2b17ed66e3d437631a018a2c8bb7cbc42761b95f2508f92732bfcf9343c4ac48a935fd9260ae0463bdfa69120ea90f3e9909b2541da03516f922e1e58411d1492686529cb030e1c9846f63abd6ae9a781853bcf31af495acf79a49767731eba21a3403140a707c106425c5bfa2ca326247515b229eac449b01227fb1b228c8637732d818c6579e4a5f0189a23793f8e39c1cad40aa70a3c6db8707aa76831dc26a446287d8a4e45ec1ff7eb00782596f7a7aeed5307e5c84039b4231ca6609912c6e4e71dad93012a21800914997f99970489380e12be57979cb6e49861c9605d02a14727a17e286b40712233141e2fd5b3834033e2b215ef44aa752201a65334ac223817e290d2c50338a2681d298061586ad704862770867b0493d0941c4925acda9b4185b64588e25f1015705a885faafb1518a70ab415cab51a25e3139644f31f1bbc0ab9573bf63230ab125891d58143ea8bcb858c7521100ff581ec7a97b351bbcf5b4161f3141ae78986713d5bc15a57e07f2bbb8244b11d81a0804a18ae63104bf75c755f70aa758997233154bfa942a47277ef20b312a68e96201f227a908dd7bc02e19391f73825dc44cd258b707b6da20ca56a2b32c0202308357e48945d79a38c0560271ff0ab2e8c1af246940a797cef018b62873474a38a595127c026699d625ebf0774334b0a953881fbc1b0f5c472f549818d44b63ea59541a826c49754926135670855bcfa888f30a50035208f5a75de6a8e3799cc4afaa7aee007788547e7b79c7507bed6a8522be18743c101463c9d0c28328a68b0d3ec380d04a20a31ab8ce6465e5aab4e2332f30870c5024718b1412c13b7094228e6f3a1a32440edba8f5ca66d968961a3f28705b9778713cd96974e42a50ee9eb61eba399cbcbccfc8786f7963c15d61ef8d194ccf37db2e16a31cb57ba79c9aa4a5da2593eb56c29498ab66f370d7b76971f797f9cd38ac3262226a64f91e03a1119b8eea00c103358572a1f4ab68f8eb4a5f889540913b23ff11768200694597d19218a2c30c3c25829467ac2d1b67f85d37522b22e7e44b950d152a8e087a3a35e3eb1c41fb15c7fc264c39272f01a0a2a91324a1ccbec627fa1ac81edb30ce0f84a727b36a4f9015a25ac67e3c76629c2347c2478d61b42bc413f6920f7b6774542bf25b92a7715745120ac1c4226e3b623860b4a42566829317e09d5868719a1e9babffba9517ac95a7c020882939cca54005f94791f37093eab5f2d15c1e7a09b9ec7b3738a197977c3ca0baf9f093271d00387841f2ab98c9cb16f19272d5e4b8d15e69da97517cf833475336d8850b5c3c87e4ef2c526b95e75060dc52c0292eb69e3f04294c854bfaa0f0fd5432dac0fbd03414b5a4a3b7c7cf36906fee8be6479c193b7336f4c870aca768d3ac2d84234b330a1f160b105214d469c8c1529bf31b3aac01a3ee1e231f389a27d4340b35a463ad002a7f8327dd5abed8b4256e87129b1be8ac475c32b97d11397db247a019533acb1a61c15b9aa4bc91d45af064a608b1926c93acb18b7c75d9798569a89a78463b51b5bbf038dae3c5cd133690ae80c1ad4541267bc10c83343a12439d6844b931a1cc79a0b5090214ca721f61e633600e8f76db52274c6c736e4c8b63089014a4012015522a9385f863507b1f1cc7c814cb47b00395724d601ad7bb27e4b0c43deab0664cc858d4a74576642eab3c76c211a58274e14f615ffe70084d7b7c0189d4d97a927a8b008b85888c57a0f6a307234344a5960836cbf6f4473ad988429a4ae3ba697bf07429d17c059a65d9e35a845735ba0a58e989307376c1e61f33023221a6611ca0465be5200363d49c53cd44b003307e5cc0c4f7b15e1545c72a7c3410ba1bebc8f7314b3b9d295c676bfe6aba9848554fdec9192f808329c60a793754bd6256cd030da12bce0d0765e51548aab0985ac86d1537ba49635641b3a26c05def260e94593b2e0558567c5da09b2cb122655bc4cd3e985eeda6c3f4322765e6a808ca387cc369dc11c9dfab64d4a30584e5329c905dc480801dd57d9ac8ab4087967177cb3163cf3e934a951a3e248a54cb922b6ca6ce9b4cb8bd788023e6425e75aedcc135cd3c59920c5ed0356fc0fb5a1ec0035b7c8271726dc8d63dbab3c78326a26c5b0f9f952cde7373aeca36cf6a438fb39c38a56124171593ea3bb076320bc8b5e74204777b7120ba97c3e803560605cf80c39324a0e3045d0f687e8f219a2ce70aac209b86d869febc5b51398341827204ac584c6b3381471937e68efbe5866a8569838251171647b4127514db9b84482d5b9a89119761c7f6508a099961376d6ae3706f6ca1c7c031f430190d6231425b14c6544cabe8701f8e475892fe31b587aa42d334fd189bdf0c87bedd5c16c32cc3867910f734bdcf09869c7604a59ce36660074f561e12da76eae84d11c4528382828f7a689a0d5cff87b8ca0bba97feacb39b935a8788cb +ciphertext: ff7b85d93c35347d0e98aa40f91253ba6c73520292eb3dfeccc37dac0112164fcc457e45f12e39aa2f7b94cb5e4038d229211c25cccaeebd8e7e08918d38b7cc302bb2015fd62a3b1fe6c56fab9294b926e425b6f8b049e8f3fccb7a6e4115df6c4ff9e8a9cef2ec7c7a03153f922ad5d85c6700092f131d7d88efcc76719ca35837678ba1781fe5ed8a106e1b37a5d5fb139d8fded8f980a64d54194ffd6d283d949973037261f7eeeef74ffa7795c7a47c8508dacd6dd346cbbd6bc2c6f978539132cb2a4c6f4e541cad9861f9069a810b3a465eb8f85b615aadc15305f7693b7188c9e486ab742bc024d7f8655ea08ec3d731c131da78251347eed4549cc36d510e9e6c761e4d30407e25664c9c6d1ac565f93216b99233da67132258fff4aaf0c9c2665a9afdc7c904404ce24c5a17a619a8c7120b43ae3f53a0da30caaec6d935e93d6f949292db368bf430a5891834558c978d23f2fccbe45d63c69dca748dfdbd05c72a9e116c2a5519c22d1ce1edd151e45c249d3660840381a3a27e9bdfd56479c31fc4fdeee7c2475d8aed29c8bdae54add3c2d91033f6d7a0ea2de783813b332bf3f2088df7111535768b8de8461eec59401484f404e59ea769b107b7ea6d9fbca55400ea73275a68ff616006c3000b7111cf85c96203e1286f6dba554f06b104295ecd4d78b4af5bed95a5ed586518e4e213c7cb61784a054f6098bc6594de6b34a099dc2999e726377eeee7f0b2fd02a718d0a605ef67d5cfcfb93b14f7a340140c02e1b843498378ca0beaefea89668dc03316c14da4cf3ce86da691d098e5d318b9095a2eee24c782e9f3576521c027ed063991544e8c65e6fa0a6edf25666a81223b9976651ca614939bf75c1586d586a6bf8429e7f174867acf873cbb6b6393d21b621005cbfaeff15f22b383de2ce9e2af54927b53ba29e406869f0b6bc172825e839459cd7420d05441f6b36541cbe9c46639b2d6f00867af7ae3cde974c00caa724fe3b48c928649e66e3792fbd5330cb6691f442617e63e0aa535952984373fd1f1016bd37de960065604b47ee621a8301fa5c087d2f4f5951b6eeda95e4065413da627b4aae73446c59044eddecd906c101efab00792026e706ecfb33615486623643e8ef5bd29e210bc2e1574adaf02766c62ad6f526b5a33836f2034ad787e9264abdfd068b5be29744d4fb3e4151494cdf007317bb161658e7e37b8994904de17acc7548fc02f08aadfa0522d441e1dd79f97a40c231baada2376197171a59812b4282ac111ffa4dd04f1c117815a965ef74de935ffd96fafa491f496b7648dcf365c18e8041c16b5068bc824474e0843201c84e538f6f9397a816124e3d58ac92081b4e13f55c95d8e0f1ca0de2218537ff4e677afd867a93ff339f10ebe8fc0456d9e7e8c5e2dbf6775606d8d6c946146340cdefe90c98145fddfc1ab102e8867e476645c693e8907c07508c433870eba5e466588289dc942bfd1091980c9c1e83d07f31dc493051923d9ffe9296570810106 +result: pass +shared_secret: 6d2e1f456c87d5a3c79456a6d35fda52f3e9cb858f85a5f7931f532fffe26dee + +# Official test vector 23, seed: "fbea1bc2c379f4f8fdcb0de260d31cdb064c9ea9b1d6dfbe91b3692add1d34dec9c9ffae7bf5e72ed2743ba3f9f2e43d" +private_key: e2903ded4136ae2736d2f6522417953c15774fd1bf9160b6553b0a6f8810e2208a9205833c5479562ac268b6618787c4859838020a1cf2d16d7f8cce4f18872c20703522463ae5c2cdeb4952d579a9c2726783562364cf8d86cd1254c76ce667df6155ddeca4572506240723ec8561d7c65ff953158ef4cb3be6ce823c5501db9e29d8c1fc23327b04067f755b87d984348acb362b22cd416d754b82e52483d8cb422eba4ba8e649faf56f30586f09d4acac0c3007ec6ca1732eae602a004b58368785325b06124156248b22d69806b6b2947a75cb16b824d35c7ec26a7a6722c4fb36a5aa538c16e4b6d366344d049b36e53a6980177f3989c301293d3450c8e2abdbc186972990dd933f9cba7ba31717bc3126d19a0fc3d090ba37c447db6143b63383745c866371c426171b667096e46e0c2942d40b4ac2f08f48b136ef09c82eb5bdb13a514876274bb20c6b40a600d1cfa0a8b29ddbcfaca547d1680067786d6e50a64b70546ae3af52451a08028976ba78b9275a2b011858e0cabff149f7854abd2b390d28a661c7a871467a2603c5ce29866839208b5386714618b6a2012fe2b4b9753c8d21bbe74c477f427e72181988d0a094c15a9c24a7eab46be919a71fd60879a67480178453f4aed9b63c11040d370322d43b4077e74d8f8966319042c9559b021cccdb0874009d61e3a3970c14b34a180cdfe0a2f9d5bf60954cb79b5b69169598fc88a9b11ea1287a8cc88f877659577433a97c16af3ca892d40cdba7642fc24f258a0207da5e818580694582b7b7982a7bbb5de714e7425b7552aeb394037827a98e765d96310d5014a7e69b3db3b6797bd60650e36e1ebb0342a77576f496a7255d936c5eab1ba3d9fb57d72305272a5e567c621746720878cdab13a9f5b0afa5101a6f7b844af1bbf660c584205bcecb22a74b79c5b4302f29bbc502b4a3c9854682c8b123a33d949d878b4ae609ac5386ab5896ae2b877338b3200e582f34fa450adbb27480296b0bc6e0e73c2ec1b633f56d1b8a54ea65ab7cb62e5e4a2c4e82a957194321e1bb39413c3990b74b54ce213008979146c47301e3c8489b257be7a50ae6d39a5cac1dafd41ef2a91b54756779e5a8e5ab79ce481ef9f80195ba808769a158e0b48b52669c01980338042d2a5e21362703827ad9433cfce6191c7c737deb92ca3053eaa80d9c9234f54715b31013cdd31afa49a24993669adb72ced3c7e3c02c76aab8ba56a29686a115f4b36deb2fe00bb42cbb6ba8a825d9888f6347a6e61a7892e06c8ff9b8fbf1270d02beddd4268fe4615f9994ef8b93c8615b6a63c9b4d752a46c51ebe9c4d97c160fa27f8cb62aa22344f14339875b6d0f920875c3b831186ee6f04c745756d57b875098a55fc1b060f353f606bb073690546769dc61600a671cac18b563aca5e6a8a887eb76bf88a33d814ce9f32db7cb5cc3d16636493421fbc550ac90a4b99611b39cef828dbf056c0f5043be8b003e260610f27a59a2765d57a13d2281d6904526b93d7745b4f8b98085397688ab559d073f88716dfe5a39d09975de107a3e6c68ee17b3b63a9b10ea6f4531bdb627bb07494f279052cbca04722bcc0014bb3993219236397dc26db4f73dd1859b06a852e89a4845a0943e5513e8a056ddcc2623034a4ef251e607268997b7e90471d5d0cfba5639da844f0c9a7227c8a22a83b9e805942b67019ebc45502c22d369abbe52a9aa6cbef78ab914337375d9c075854bc9a3484a0995a239121d918aa64b2ad76c6873790211162509ca2347366d8163803c3433d32068d0f8b64cf38c2370a3546083ed45716dbca7ceea50207736fa51c062a6a15ab8c124ab6b00334e03808c858ab4b20a368df787cde92169aa4100a2adbb4699510753b80a63b492c51f43a81be012fa13405ccbb0dcf1166ef55f450781244420a0ac9301d485ab561b9ab67f5805afff924c1f43a5b1628f60baca631931bfc6c9bb04d0fb3727d7ab6bcd6cadffe84ca57851ee201f8153ae6d64c0d2aaa432baaa0539a17e731cf4360ee37c0e38e0cd77ca85e817a827173bd9c0ad253a44fb244f47f956146b4281109297b05a9320953c022024373d60701a68450cca32883848c4cff3c64f548cf7912ff61a11f06030c5eb29fbf8bdd2b16541fa85b8683493e8239e22c01383985aca367d6cba52c7808ff12b79976b794c70471ba5cc7908e4168d5c916605337f26199c34519236a855ef063423d7777631bddf164b2375098a25c9fbe9a7f9344ac12aa0b65a1380946560123f82e033fe33638788c82e7abf79b2c4df9c6da2f4301d70465a3c05e3a485a26a3b8d98674d91594f24761f1654580719260c4b409b2fcc418a24082a11140d043a6dea028dea1a51e9224fddaab5f3aa64564b3c336586dd8587442800ead481c9d27ef08908b938945b7204557c38aee2753709b68088684637bd39f1b78c6929c84873822caa30b2584a02c93b085380524405caa5d9147e6c837bf0ccb1aea19db39471d1a573fd893028479391680282922b11ab4d78b407f7d68eb89b615c32593f2207a4b017fd1cb922778ca806b305600546700d9ecc70ccf292ca7ca0ce6b6fc2a79731f6a9e8b83c9492381ad561f657192bb3867d3cc663bc5ffb48c997403b4814c915616d03ca71d0e8a93ef0acab8a55a61a6a58d22845e27d6c453b79391dbe02797d390e262a6be41cb564152768a5b1f2b7306872bc9dd63327e22e518082ad337f0eb8494ea23e7c730f48e94d21ca9ca3f660d4f960a6285f1e586d04120a083b814ec4229717b23b73c0c14aa6bd45294601bcaa89429814ad6e8a6190289758354043eb6d81842a6f332524da9e63dc7570865695c043c9eb9c5925bf4c4b15bee14aa58a09c4d37c822ba891f2626a414d01a10f9fbcbde5609bf4d982e23392a4cc16c461260bc518717584bfb96e6960b6d4b673f61663be1b2babe74d46494ca9576f3200ae3ca8a58de308d8e99b65384ccc30aa1669898722b1a76c87dcc276474a74c2985e746194844c0e98f811dec520bb54a1b4572b0c39ad04820f8ea878baa9caf03018d4a196c5363f55373ef5a98890c719b7a019d0eb023e319241081694e74bafda502529020a8b8f1590b73d1bc36ccbc8d4bb76c44361309977270231a51a7999e65b923b1200366ef381b8fcf8c4c5d3add0c465f7db79f7563dcc67940312ca49981581a798ae477915f078f11023c50efef1acf4f751801bfeaa5ef93fe27771a40a3d377f0f1b1655f6ed13320e9a9a59f83fc58d7194ccc92bd78a45f97f721a1eb554499d0e4d5b37aefc23a8fc9ebbe336dc464489861db8253606971bd0a9008a433ed17752d04023781552 +ciphertext: 5d1369e253686734a5e45c65a04129cc5fcc91ceb595fec77e2850088fe1084c3f2ab3587897c3658661e3cffe185f4a0433034b56aeaa430b5a898a1f682817c406e4219566235f78e8b4b6927e63b3fc55bfde580c381f74e4d8b708fda0156e9ba2bd0eba3927601879af7762a6362ce233b87ddc0c61870a75812aaf92ef6cfbeff50ba7dcd21f0ff403c15e6cd1be9dba02f3f426d935c13cc703766115018155648d8db45457bb17026af70212994a87fff10632249c3e87716cbd1d13d8817fe5aeb748aae801970d8b21a575bd1dff893432740d6edd652fedaa89cc026027f72d71946e67eded2b0e84dfc0e6e103d1c4dd1120be5b09980fa35ab88e5d5714739387d18aa80d1743579e220ca410f404513b8bae90d64751306e70b78de2838406dabbddad7bdb5668a180ba02c1d44c20d12402a49492b4a4eb26c9d091316c504ec7d726b904d333e6ae33b0adc8673f577d23962d1e3453560c7a07bdd400d60473b978f3a6860af623130a1a4673d3ac6d7658df376a8ce2a91dcca9026ab9d1789d35e89a05b3c298d308fe7f20bea5db11d68794f2721dedb3813d3e3c58b487ec1a44f65d80b11e0d73500ca06dad337fbe26bddfa3b72f674a608e8bf692bf122b624bb8c98cd9ac5890c774f558c2141155f658806111b4e645b07bd23260c2b8d4c88eb97b418f734fb0909a95819e74dced41551a5fc4f9743d19b66a4afda8e23d0f08caf69b4223286ee80da4ba6cc0a8071434823dabcd984b086c4b0b5d9c25bfbb7a80a3c65b4c246cc6304d7967f5c42068655f704ca329a0b671b58c93a8775d4884f0e8f8debc053a7e03338eb133870f7103a434f2f27132a0cb9bf2bc102d42394c08a621ae13cfad170969a9a8937f6bc519d5d467e63fbd98473c6db0582734c23c19cd6ac4d56e106a945ab75b23166325f33d198da7a4f7dd9ba4917da1365f248e237dbee6c19a5022ab62d86ebe2fb8ad0a35f838be5ae0184b13bbb36e8564979f6b0a6548004956cc49bc94a104a57a26b989df283e0e6ecf26f50e896183391760d757dc78d7eeec296378694343ca84b7fcf751e7dac4a889ed170928a60360a5fe2d979a766b146c2689f2299d9505fdc2f91369e4b58b432c346bf1a96d085e7a364f898bbbb258a0adddc46a4d126cdc89b6bf7674cd7e980e4cd7acb2220aa9b3adf1c9b89953825d9e1e503476a0865a66b44ca2efc23eaaacad5aa4c66b97bafd6cff9a73b1df12e92f02c6fe8402197da45798309800fb3911a8890e66cf4f094e0c0d7703d6600cb1ffb2c1dd43a9058175c86dbd0f3d6a0c29979c3b6278e2db8956ecb9aba710a5f1c90bfea10fc27a9603f8b4d289fc465f7276c8745d11855966f944c85a0ca16a004543ca7e7258f8bb975a3221d6805eadd906572f02b999e9d190c189c51523bb7c7cdcd813aaf116e813e1ea0ca8ae6c8a80d569e02ba2d666f54ae85f5cb1f22983783e9c1fbfbea8619a50578c43c2601efd0b46cb640947cf1e4406 +result: pass +shared_secret: 5c7c5cafe1fd7f3d12431ae93815c03419ff95b132caf568671ec23bdc74381c + +# Official test vector 24, seed: "7e87fb886bc3c7c9fc12569f465d2ecd12532e76cc27c65644c8d3dd603b0cb2d036c5974e675058f271d5c82ad7a813" +private_key: eb9a0f50030024200b530580640112b904c9190bcc0f7b6c9b071086aba50212517eb401a356cdbb8547b1e06ceb0695f002c9982518e6258faaa84cb7b0885d1c9272bc8acef294c2aaba89696e4569cf3493cd69db0c9629c6af282a6828a0dba65f1c2802af72bbfcd102e9ec5395f0473d29b9bcd99d8c803aedea59aa5b11f798230917c5196b2ea9a950e3834e7f272b8c6760b07c8597025cf62b63922768d89955315c2f36907ecb89b97db098d7348b9643ba56582915b9558fa519bb1530d7b8461831c996731cfd2b4d46643c0de99c459b93279173a83b423a073367ba8e79904bb431760b969a4b7b98f10a0e5fd1aa75e52b59fb9af4123ad65b645aec03c7e2c35eab02e201b92c266b98c5932ea3b6029345f1f8085c955fadf2c840cca34cc801ce489415781cbfc598f1f39ca240257a0c173b6108482c9720f56afcf250c2c704c514214fe0155289470ea5470cc1a4eb5c999bf8567d688d5a4a2a7cc1c3381c68bec925ab312acf037113fa8c5cc43a75f3baf932672ecb3ed412b17b5520351918297525c5d352076ca04d2a3833d306a321b9a9b1564504b8e70aa8e9a91ef47001a42c66b33370db2ab3e9b43f32e926e7ac189252af3c9ac7bd420c35767e1b26b161823da4fbcfa11232dea1143718b6b9e6aad183311f756c04c15e8df99bafc854e751417c1aa5fd64623df434f2c70dbd8ab6d41395cdf4814bc99ebe5c1dd0777c7344c1504b7e2ff4b82d974e01600d1293c5ec2a4b34fc895e608ad7a32b2fa6cdeeb2b2867a8aef27aae73ca70a5670c3857501f5c4231448a4e7b4a9926c1ffb58b0aa73705c1eb1e70068d97de17b19a1814c34d746570bb3d142a6b7c49d52d78f501a6bfe37abdb1905a30077a21a1b0e5a14f6784db89197121143b851ce1d975db4f50ab75a8138e60a542cc41aaa6c55626d81535044d0a1865b4d6303c649b3545511440a320cf5260d0b85041f6c26f92a13f01c77bca3357c26bd0dd00084a54ebeb7330f59683597bb733182a4ec7b15e8656dda8bf0a8b38fc3632e00bcf5938706c55d94623dd9c11bb57036783593df9b85bd9b9b2c430d94c73a53b65da10a614d93c6da7cbe899a096ef3c608f747cb782955d0402d9831b9889f6a7708ffa7caf87a8dcb1a18b74c363037c890470d18805befe3a0bf058e64850d61614948f41a2f03446bc9c6d65750ba421e2bb8510f2a8789b20ae70c1331402a550480fad8c011494d7cc25c573b4b23ba4c96f99abc5a6d8ef2195284ba54678f15543243362c6aeaaec2812e76382dfa36c2b1704dfb559a27d5b8f7469596a28c9e2b0d426aad0c57b2407346a6ba267690cc8f30857d2858aa5b97e286017c494bcbf398ace755fb5b0d041aad180691c85994d331616e91a9bc4932122c35b55b8300264e5d3533f7518c59c4cc4cdc5c3894b48f247b1433666efc9934f18234535e18bb43b5ba5d9b6979bb14bb8d407d0e15704ac6cd1bea3466d41362a261e9e3c4cb73b625690f1bf755db67ac556528700a78ca973391b34d448abe2bc96447dc8f96239e6d06c41dca9fe04272e438b7437c6e0bab01797475adf9cf716430dc2b4a9ad16e790847ed9a831c0cc2acbaa793c41913a02db8ac1c6bf056573bb75e2990a6fcb732c3461ccb174dab8ea4c55781317e400ab4ef68138ff84c27fc0bc4c68e30eb664cc8bb32b617916c155d28a195fc39a1a0419af64a59c99664f744a375113228ba3730752ce5a06701112d7328649a3755b45ad6bc4bc0859feb014e185b2e18603ea0437b31432457b36d13a5ae96b03905bb2fd0d5377eb04f34a68c57448e7909cc660a31d9f9540af17324e4b31bf04f465665b5538f7351687f238d6c423c9237b5ca35618f092cf7da879d965b67b1cdb2467c9ef3862f260c04727594aa6286f4035f0b0eeeb4b141306cf7d9c4a6bb942b7a1e30b56ae958b16c3c1237603ae6f879dc9ca96a2439e26c0834369e8b041c6327254608ad3727cdf23b842a003b91d1aee60193ae1497d5b75e2a370147f052a08b1f86179bad52605df44f6c99c75df478017318c6ba017a1b4a8302888f495acf796e0745adb0292ea6b5526fe43f96e20d98fb756b2553a9493401d4a25b9bbac13b62967a228bb6446b2067063619af66383e6bc2b3d8cbb9e6969196bb45d665bce49284c5b50f934774d500c90134535930ad2169488c4ba8ac0854f36e085318a293bd65ea8e033c754ea44191d9ac8033c031e066b2021c13fa11a15222cab4829a5c47df7418761620aad92135169e0f008760ba30a289cd41f1325a4c90334978c5176cdc5496962443b118a641d6130baca422d89fac5c968adb461ab43729b6c9b1349e71116c0226b55fc00323d6a74c03282f24997949207d72ce58fa4d87a7413c3bbaeac91fb2131c418c11ba501701549efb25cdf560239223c90e1a2f99897fad594930848a1ba2494fa87bc03c57c7bc33463b77ef80b978724153a956779028b7a565c40144047747e124c7db801d309333d3150493c3b3ab68c34c939243454d90c3c4079174a8171c77a0b0c9e54277b5bbc5033eb1eba3cac86039492b4e75a23c8c51c88177edd639a55b56fc557b580b03935765cf586c95178c330319c70a8c15c95fc18a23da11798cf6c54f68bfb766a61a9c9c461b766b4a00608575c4309a621b28d27122cbbcc76c30a30286483ba85a68524c0e21591b7347a0ac0931e121eb3bb8d0fb7d9ec577a5821487619e196400c2169a42a71c7665505bf333ac70267bb50380b947ffd54745e41de5a30a27b78a62f43786ac88b2012de563cde100358065485a73505982a265a505ed85cadc02228ff90a03d088da7410c6179558d52ca36ba1d87353985189a709a1c0a7a10cd8513c4aa26d27cf802027aa8c5bb99c12a51b7f16e10838500132cc24d79c805cf11a5bac88c4bb0377ebcc4fe7c6ffb927ebe7234016bcc1765ae9e72e62d51f9cd91017f508ae207d181ab0c4dcc8d1c4742494876d118f40c84e2706914c65a161d184a5765aec67c9dcfa4bf3418e114c6f3cc34e94a149fc84b041853af9b213759cc5a181abd5641285613875367842f1a2549c09eb9b1dbd851365d58e6335c91ee7ade6c23135c1200cfc1de3f5cf6fd13967150f01053b943c3389bc4670da9857ccc32528920f781cbf16a9dde2299db9912e87321c02aac45c4820ba2e808666ee521dc4bed006527df29a124412a4a19aa26c09b490188ccba53900a2545022bda0815dd53b263afcc1f71d2501128c41fb3606af71c5e68f0752c6d3a479c5ff8563038aad865a817cab9ce98846ba75be9363718ecf5fea538aea90b2a558 +ciphertext: a38d892bddd188709af0e4b7ddf0672f8729ffcef2acf0be8fe4e246f83bf39ad529634a3720388c5e2295f5a071e27ed7d75d8932dd05e0182b92f98d16c4749e65d2aa96c6b45382d5c83cf6e37f30d395b289e11cfe8e108c50bb61c96749b2474492dbca1035f42dbf35f73e6d458151e37d1df2bd2d1e0965ff87f607897139450f4d17d4e13eb099c5c79cb2aaed233cc4c9eff06f38d2e910f648b07d5ceb12c30c7daaf85e3ec5906827e923658cae07f9b4e983b7d982c98fea5a3f46d5acb6bfec399e61fa7e2e64353c7ded3c7dd1d3b8bcebfe9a59c29f22d2e5dd29afcce64292480c6b6a7eb3a5f08abd7afa8641856ba7cb706355fdbfeb7db58f476a79138ffc03d945c5107a126233107fe54778e8aad57a905e97fcba09c242ee016dfab5fe3648e2dbbcf07b488e1f2d60da78307e3f9e318b7a8fc99cfbf67b3137afcae6bf9c1a7d005871bf59bca9ffed32467e04767b99b7e0e5f75c21f23c80ab76e0acde939500349e954578f0d7b0bb7972eb2e910e90fda97876d70886fdbbe3e6e4c04551eba13de33f9eb88fb9bb5c669743aa78450f658df9209e29a5d81e989aad45f006deca4c802366a18988a8f99481abccfd19da9879b702a7f6c4fe7b5aabb07e0958c4c5094ffbc0692abc928907283202e0fe512bd5fd78b49846b25f9a32a3d92d1125f9ba5620618ac27a25f6002990f6959e05658a2ab6fe88b6f055b47951fa9cdb27a8b6ff9dd69c30231c1751805ac7d98b00733ecc0309db2e856765ab9993d9d78bc10b0023b5ec237bc97bb944cd7de18e2fd0b1837f50109762c98e66859b4cf3d10a79e3a7b24f5b67e0385a68657f31d34b39f0c8c01135ac10ed79adbddb66f762ad4f20ae4d61b8b0e83d6f35f4fcf270b45364a459c9e276527365ec69bbf39c85ea8e8c24e7a6b5e4cba67fa8f476b8d57642cf1d6ffb1aee8bf475d66dd63c2d9141bc51d569037c0ae82638bbf9f5f66e04fbf21b8eb87c4ea2c701d05905441544d2934308ae1d22483e91e7fb9aa69ed86ad414764419781f249e215f4c3a273bb4b7ce2886f2ad8169f15c75705bed9ab8196700f5f10268c5d32790a8f0a26d5214151ffb62f1b3728279da8cedbfc9408a2b4811e408c5bb7b3ce1c01b8c22acc32796b5bf3963e8912dd997be5cb19c41a2861272efdc64bf799eb1e601c108e4394e8cf09137d58c34a2592a3fdcf2d969eed043518d17d8b160879c9afb8224dd0bd3d2840e833a908797b7038d250d18c3bdaad72496a5a445d1b36a165717f6af7f8b8b1919171d2e1c8365b94b23ea84a0344819c3828d8c8dba63046f15dd18f679a55f526e7ff78e066f4d06133957b73cb1e1660755229d3312a14a8f194dd0e10aabd845cf8f63c63e26360f30f1eabf02b05b20b3cb615083e6b1942e304893c308948e73084f5c88328f550ecb5f01bee599acc8db52f317f3d7790343b8a084e60926b785bf17863708b0d92a1bfb63a94cb97c8f9072965bbb84134ac114ffdfc6 +result: pass +shared_secret: 1427c322f72898a0fffd13f674719c9288d524bdd19e6a362533c1108e3a6d2c + +# Official test vector 25, seed: "ad1424e804f306c7ff513da4c1e8d445afca7bc942fac5c0b335733aaf70693712ecbde26ea726ee0f9fd9d52a83b1a4" +private_key: 878a1795956ec490aafe2190fe1a0018c9b51fcaa6b97c13da28a8c09a7fd0434596fc21d4e65bfee21efdf30059aaa51bc63c7d646f14f1aa487540380155b4e51fde096389c3a1b983373df0669553334da5ae1e9304619948cb85ad5be4219683033e33ba0f01750fc62ffe5331b4e3756e46cbca7b2fa45c26b8e6b8121719a6655f0952b9df797717ca88bd79a769938ac2f68d4347baa9dc2908757e19157953cc9522261118155df98419dd88556d961ef9855e20c86c4511cc7642c50bb4a35ab30e133b3548055c0ec585d9e1a390226749a739ebc5ca7834ae6776cdb6e461b5b736b11806e59521f010543568ad18097e8654c4cb7c9366db7990439b93a06e83391a62b90fa84a0b842500cc5bba4505ab41f60e8414768ffc1cb9e1b8334869723185aa5b141b94a21d276d3b769237e44f8ee373a8591ba9f6ca2bc852056334e41b1b3348c7687c8688c02b6d3acd484b4f2d9513bf181363a683547176cb1219fef44433899d93863e22274d7e157ee0188be6f53492655c801b4a29c7bde7048d798caf9c475665462732a51a080345fd0292b3b93b4c354a1f3c8b5680c9ef6bad9249472d761d25740e92e1c29e17bd38e989442b60a178ac720b935fa41baea41d1124183784941f510763001f20004caf2b4314cc6e3cfa7d3eda5e78451f27c7c49fb8253a93500ea757f1bcb4e97778b3866f9709083fba0cdf1031a0c667c5f65880d157bfe5986368ad80362dc1a596d31a488835b8e9b1a80ee55ddb146880a235ccb5c8dc64913a80c6c02c44e86bcd40e56737443c49d6bb4ac1501b264fc104a522784c5cc94c9e186ba7a22c329612985b6eced06e373669b691c620c4c6ea170c05c28d022158ad3053c89cae8b144c634ccde032503dd03beeb602e06165487ab4eb1292e484989f6135f50a08251bb5030088583187a57b10aac08b61b0911caa8685657bfaa40ff389310ab3b54efa8df4bacc32d112a2191a8068a390b1a8219a7954fb3cef743c22abb2c1820f86a7b3c8488788816493d300883b8370688b7d0560eca63430aaaa3f4b44d7ea887d70431c266e09c7769992328bc7b2a53734729297130a59e56c3d57893dc3fa7ffcb0070f7267cbe1ac7f2c18061b26409819d9526ee5dabaa47092ce07c2db567a72f80ce9a5284c70c6f6482701ac71c71454185099f62424c81b344fb83ab3475693d6797c5348c7985536550bfc1cabfb6806d1686139a8c920832ec675049f40a0ccca236375153a79c4ccb7380aca2e30038c8f2b745290bef444a71b73839707b524d07a2d1c4f4b00782e9c91447700594b30adfc7868eb546ac27fad089f7046ba8715c41e292415d274c3f03c5f57b311110000fc614bc30960b26edef3961c258240e333a8494b5aa3152c39c728464d6915c8016106cd34213e1137fca383d3b94d545bab479cc11231be67634beb00272b59728f628555baaf35e7bea2c664f616945629cc381042152ab0062902b6d5b3204266a98701f376a278778cb4281e47a6a82c6c1b0f2221577909f9297616f356be210f0f3265f6690ee5b1385ffa8f457a5ec860c01388480a09413181b9602909de7a3dcce34f39dabcbaa131e892a48fbb80f78961f9c440322b49edb03f0e554328eac7c0b3ceef957a82370a8e8169cb24a81595cc89f95d70179834da375d55a1d16a7a8fac8e7da64508c97f4f7a53066ac34d407b42a6be091696351b3fb1f12c05e5429cb0a14208336e110ae4b89fc9b91edd0037392948e7d3beb78b880d3c6d933a73bf909593a0654ea18a5cec051cd17c25abb7020487579a98f62b49c2969e3df7407f9bbf0b01237a0994cc7312b0992cba7566cfc2818db511d37b1f06781b3dab99db5268f527123a0366bf481faaeca57e16b37e27758c8b83125049f3f38681ba5438a795021652b5f81c02876c0f404b44f06976e368aa2cb923081e3dd07781562ae4750bc5f3809226ae6f100fb8f67faa433b66f8153d6a1b846c589b471ea6479bdb05c741dabf217a6177f2ae8224bd05b46de5f1a42ae20a1e641238f541fd282dff3821414890600a970811795c993c8ba5418a8732b6c8b8abf738fc5ca7d32aa3f87884021968a93cc271a490de61c5f8143be65485c9f34f0d433e492bbc5e215cfa037428a51d5921404d89aa0ba6181f5294d706786a30508c5990ad24c7bb6a70d6017207d3c03100a222396c44752579859e07315cf9c397549708901748c6958cbfd41e9d2880e9773ff03808480bb38c36bdefaa5f81f85700fac88ca85829e03d9bb845227a0a799b156d0952d0c54bd5b010c565a381b55885d26cd9e9b82d21a31354c17d2bcd43d93946bb58ed2a57c13509e9537fe879714c64cdbc842e93326aac0944cb3898335004d0fc9c81546086f29136227efbc798032aaf0cba0f3c6aac788886e03c87245964c99c18e62c008d646621d127856c7559370f5fa26301321bdcf502d1d12305002b2ae42e61209892d7b3afaa6cbfa9a38ac097cb26c4745a4eae395a1b10bf80829d1b216b4da59fcb4a2a57d4070ac2ab59a82b6af3b0682b53f9928f7759ce20e1a09042948ba966cee8bd176b2ec6880c063b3ed6d1160fb26714b3ae7b44a4ce6c759555c6e478c0a71a90b62a8cf8f282a4f7c21c31c5becac2595a766a977c886009e9414123e5723e101e667647bb9a2489b3acd17a81ffb4512516893ceba8838949e998043713bb41073013d487cba107f31c84480a0ce4378732d9446970716365278f70719da66ddd8283d62190530566904221b383441124b6f3d47103d64983898f8d83a4fef6489b0c08a11b82d30cc4d9eb4fd0d99085c875dd4801e3902405f0b292b8487a72867e67200c9231ffdb43e2048caaa203c7883218f9a1af7a365a19b0d2fa595a087b2afa1f16686dbd24a98b931a5999483d467d2d264b21ba527ca419b6523fc046bf7fa96bf0a277af5094f3362dc863b8bc2192e5d78173d77139d6ad07e091e7ea507f2a7a9bf982aac812f736c787c27b04e25d1cb74d5d01c3fe6aa2e7248921225632a5033fc6342495167405028d410bc42c8bdb498d9a5260693ba326e2230c6040f332454f3b2020280ffe6bb0b7021f4ea6bb4c06980b62a9b6c89a935ac206b13e091c3c6ae609417ab8c66b7bce94986e92596ee64b08a53844b706f84731755ca02c7c49906cbbdce97c64019a52f278c2f286eacd5a261f5b502251ec136ec0a3c697fc30e8b59807dff5dced3d6bef9c96bfe3e96e658787ba3f6ffb47de56322541a2c81f68e2825c74cb75ab01d4b719d6e1fb7456ac0aa1b97068f452cba64ebdc138bcf5d36b0a0fada2a3b374141eb9 +ciphertext: 33cb33056875df21862840d7123c9d3fefec700b24a5241c24492dc094f644b5b601b974ea625b315ea7efcc27a096acefb7be53e635497185de6170320d3ca22cf41c1634fb16460723ba0da2d9c2464ca557ffedf4150e0a71d7f0b7ac64568ca2eec8a66e16f02c92f313666e67e4a0de221b3617dc59fc32541c5839325c48e7cb0381e1366f8554c1569a58e0427e3e516a5bc575438c1b464900d2f05bfa20892d6838a726ec8ee5c6e2e847a781c606d6a28dc89db35d7346e41fe8742c15f22790848a95e1648684f77d21ecd2a7642be1cf37cc1999afaeda5bb025843b4dc9a2fdd1284f5ebe880c6cef05973ef6fb939e2d39c5083d9366fd862f6de4d761b67fa99b1bbefc1a71eab5ee2815452c411f09def608c236e2c13ab35122f24ae529a2bda8ae80f66d326f646b3e9cac155fe4c765f18b2aadc455902f0f9cca178a0215463008749e7c5a64d010959842e00e830bea02debeb3da2f3f7297e03f41e4d304818e5e7854ee3c578ae69bb1795b7d62657eab867f182db15cf79f789a31377afc0a8a0adc51d1a8168ed9c531798b66b8e50b2bc4c6209eb19b8fcfc9de357653bdede452dd7e80ae3a7bb4b9dd50f384aafa3a85c484b8d5044f296cca7428109f4d6370598a483eed28c58d6e401765f9679b980e4346799ce9834a60c145d74e58c166a487b4e94640041af88eec4ff9606ff0476b48ed3c188257836e2bc5770b313ab7782807c8f387aff9777d16d5ab2439b65e9fe9d01e8bf1d4df96c1d9537dd1ce1cb5f51d14d05332bbf0d83f20087088800d4de838945502ceb034f77fc2d7aabcaf3f362071199369d64e5ed25378d39aa5b39e53814a5aa7a3c302b2f4808d1477dd04f695104a17355dfac04ed0916097bb6b4365d7ef07b4b414729a52e75278434e2d69ed838405d4ccca22cc1fa61b57483d5634a1c1e250e500e6e5c2c4a3794c0e201a68d1fac6a27ac079a79e744727fbb3d5807100480bfbacf5dfcf594998bf8e2c99766d4309bc89aba138dbc9051e7f3396e9767651c27948e04097cf2a175326434be72e1afa89c0d42a80600cbfa275a8a53c860135d54a4076e9f7276007a12261ac24203a22ea0e2f414951560aeef26a00e193cf42ccbf49c4f27e2a4e497f814fc165637c4f1ad890f56de8b0b6973f8479aefa080afb0d91ba777c58fd1ac73215cc225df9a092301f23e5190efe8d3d634f356bf170959ad1dbed270df0cf2671bdfbb2d12c15006651910b3adac8bbbd57512ae149f0746cfd5f4d9e0e6b409db6ec314a21025aecdcac16fb2a36789127162f1eaed305eb20a506c61fdb3e5a8ba26b7e03481d461d17acb86741f81a19d6af0a18866d04fa346a3c6bb6ff72d828df88a1290c018d9585f3ce96fed7787d91d153a695852bdd272b29688f4077dc3d691397f5904d9c6320bd1a748ecdd00fe7f1114adb2e0dc33c34035a7aedc540ac3b44f5c4bd9bde63cf5343ad0bdc1b16adf13bbeace84d642253ef332a92ed483dd9 +result: pass +shared_secret: d399b5ff0756707f8d1a1c2a683465c9ad4899788420643d59edf78f79b28dc1 + +# Official test vector 26, seed: "7c33ca0e987226c8524dd56c811fa4d1ccf9995b1e4e4dd5b1481974e88cfabfbf6787775c2611cefb27ed4403ea9b46" +private_key: 4b11a51a0bac67897ea9cc5d7d071855bc8bb375a18d838016fcc506bbbc7af38473e4275eb5449b0a5b7145b49c700626f7b6e5a6907879c541a0c6f027b7403a5fc25b42da3a7c9308a51e863eb346c178c469bb27022cec566df469340205fdd84f4f0a79842913a974a7f50c2aeaf35e37673c4ae52e5820c7ea843109e403ba5329a9818a856050eff789d4b71acdfc34761c39ae130fdadc300bc6b3295380d3c6944213100e43788204a41c75395142b5b5bcce2ee71ba4b14ff09325c9d884bbf9199e132551a444e527bb98e6b12a8210c6fca2a054bf8fe346c2db0ee9e97390fa2699c60a1e9c4599cc37110460d27b8a5f741d58fcb62962a38143aee0377d6d440662506200fd44bf71631c479080660a9c6286ca3bc0d5f9aa44e7cf23342bcf37a9d710c86ae39e4795c796805f0198b25d0b87e4f77e01b970e2858d26542e92eb356c276e7e95bc77019c4e90bab92c139ae10ef59b44cf8cc7e9b5b59d710f4bf2b8a4a5c5881018d9f593fa5b4c745a3f12457171b735920250778045c0fa3e1378c4aca8388245484a232d1bb020ea665e60da9f28a10e9992022098286c918cbc40476e7c8bde62cc27ebbfd4c10dc76982781ca59d630e086771dbaa1338814496a7ab32913c837264c527080c9b6d39c25e623b61fc180a29aa3271f84a1bc50b7e678143939ae5fc17d33bbf52d95e53b525ff8a8a408acf61d887585b561c3a69b088388f88532c8482a20c445e40362d1c4a331211d8f999c3f2424379b560b5ab4e6b655ff16e0904136a27774ab93233217ecfa58501c1ce6feb7e448ca9f3c76a52511a4a10008cecad9742368b104521b1b4e5461bed4c1a78ec9265d23272c06ba6c492bbe9af2704b9043510ab869af5d9b63ebbb8c2d26051b9b452d5c1605a7c4d60ced3a930aeb63a865056e1f00e3fe450a2da299d3c1583e52ff109cb2837c6b34abf6b063afe82c86b2049d7335ba4762f8b9c039f49c3554c9ccfa95e9105aaa0419d39bc695c873ea42313973724f02729383b90780c55ede19ee06b631752c2c835b0c2f04666bbcbbda79077a270bbd670edf111f5d578cc1b4589e31c22bbaad3c4044c1cb67707aca78c6d7c3441fee377720a6ab1c5b13f3530bc73020200983a962c1403a20d388b2ba71e777c28c3fa066ef0bdc5c94e0df40188f06800cd3ddf1c34b139bba633cc680079042b934db02ff093bd38fc9779f694196b160dd35c0a51c9f56bc4768333b07c4736e5c41ce048582c69f066ae08bcc4bb3c58fae435f6b53f8b533af1309a5b91bf3301b4a315491eb60670b1cb7e60424451031d6786b1f13360c8119be05955c37336f49bd4c2a7e7b15fad1a6d2c52af63870daa148ab0f8476e7a09309b529450b7e75b95988a66f037574ea5b1f3ec3d2d8570a6c46320a30286196e363028923b8af1128847db9b42c618dac72698044144d5c205d14331e91e70f55da87a45ad049d7beacfaf079b148a9da5981e1b40c36837b9e344affb519f961c45a8270d6bb125f42bc5c5089d9c7324de600184336210f57603cc229489a4e27b7fc25cc0861962ff738f06c03d4422bf12855abf225b25b254873079185bb36d9c3ba85a46a5f605706979ebd66da03c15f1b4c25b886faca00b16e04f87b773d0b8724bb4947c615344f9466f78cae8d049876c9f7143154abc47110b0deac571bbe83577f577046830031a08b465b86e1c341c82660818cd2f8173c5c558975868f0281470f39e737b6cf964008e040382b290795254380b4850db27dff98838d9921eaa8146022937e36af6b030b8919bfea844d9d602ccb3547d5c07f612c12c3c179ffc30fe52c9273b5c0dd27934b5a41737817be0739425736bb0cdd267beacd0bd77085cd2794947051099c3848fe0aa2bcaa18f6a18afb626fdf1b977f376ea74a9cbd638932600efd84fc053650474c801b1a8ed941cc5444922915173ec1971698172f8a61730358c751d2d776d93c866c47802e2ac19c7c092aceb53996c20375b47413a66c06541b4343c548b4dc5341ea92b2266d9c0f1665719f62a72650414940bf3a20a260a5953d578d5aa48a2b670aff7512bf6937e49052c3ab8ba07016d06a9d643081dd52009b358ac13c3136cc65b0127e675bb55b8598940c054c8b797d37312a1ae48120934a559ba31042e160ddd13c744d7ac5dd614d198a33253b829016fae7ca51d397330ba1aac557a8fb56477224324924276aa52b7000f77db547a604f6d7189ef83071293465012b6133a6e1209af3009a867a46bf2868f8ab8a932784b76084998e37eaa4496c661a42e9802f5e1ca947c75bc4a572562733409757855031c9627152c02cd25a9b9725adae909175b27c53c6233e4480cd3a06954afed889ae97a091df86842483edfcb5df9a365929b6da98917ca7b025490b416a7abfda408f07429244a9202a23d23ea8ae96bc8ddd747d1eb9b79a3cf3610bc4eb56f9de38c3fb77db2740504e85107f46896202684db8103b1c488e9b731f0a2bcc40b563226d05946c9fcc1a4e287628bc4985189e05a5174709f00c43eda4897429773140b30bcc090ada25c91b8858f07068bc6c154030f048c1a7002ab58e157ee5b0e682877372426e193cbbdd3c63dec0a725c90d29411986a249cb30ecd981a92519ece4074f18ab92967220ac1c963503a295c570d7084c2917ec9b6a4663a931d6a505d11757ab2935fa708e9b6ad5fc1187f3717c6a4a818d57cf5395626c8a3917012fba13315902391116ff5015051dc8d07ec0716356d20a184458b4089a37fa9a713aa35c8ad1635a7fb49e6bb44cdf4628a3b84b9869dd760262cc487f44a361b9c1106553338cc5dd71c45c37a3bde98036f45231dea2a83001d82203b27aa054cd1bfcd215f477a7e43d31d946971b0d3223868922699b0d810b6fbcc834104bc0ba2cc7a50bc198616468c212c9b9dab2550282a9b88f8a1b6d006ba801544b62564dc05cad68d7f6b143222a5bb28bc9cb57788d417fdb73bd0778fe0529a35190b0912623df81a7387cef7d201aa007a199735bc3aaef9706c6dfa1b0256b872320459951111b90caf3202ceb8c10a480addf08dae881eecd0cec08a2adc61c20e8c15b60824653492e603bc3c203fc35ca536fb7c64084112c878741b83870620eda2997f38aff953217bec592eea7947e8be23fb627251c13fdc9bb0b705491151b8197cb07ec66dd1d49dab7f9d23aa8ffa435f2cc7a7a3a1cddab6e37ab7be45fbbc8aeb3fdfcc0b171aa975028f96cd47fdba421ac08e29a0044cedc29fce35eb85109da0c5da5f195b80fbb99c2e8b06926074f3f604b3f6195b5a5b9737876bba72 +ciphertext: 61d4f41e6582007daff044918721194b5897db5c463d6c48c80ac7c37dd0b829bee3d0aa6b7af4a6acd827bf30df2b87f4420c984548f057c1eb6e7b17b19e4f61aac5ff5b8d3357a2a7df2356d8ccb697004f762df71a854322981b85a6a753a633305a140c89bbb6b698db44ef4bbe945f03718f9a9f55bdfede24104a10273321c5a2289ecb78a8d2d99dea4aa57ceb1d1179f0c71c8bc2d2b16f7f41eced3819351a463f302c5b35b45658154326c8787c555fc0336be1aa05081f4d6aa6649f7924b0e8e0575259929befed461636751fd0e27ddb9bd92a1b2f8cb718961cb1005bde873cb4489d02068a5129e83162b5fe70a4567458176e9fd2f0a5a27b5ef74a081912d6fb9a83a07cae9cf9442e2d34d076008b99275a7d49fea0b8f0261c0f2743493493113c490eddeb07e43eade98b15cf24b9f7a081fde0aa77978c41a62f9eb78b90d914f0110cc8650c01de496c81a7c88e038cdcdd8105b800a2b5f313ff803fe776f237f94415e74d6e61727862c46d70eeb517a71a5a6f754d199cdd70ca4369a4db39c9c6112f4f9bee3987c72e855fa937137468fda364937cb62412614536b837064937a5d626906ce0e83b7466cbb1a2242c893df8606eb533295b044ffa108810b85877fb3b5ab3294731372fc55427536d60676ac3d161f04a0e77f919313ce0271aa303b08fb492a1895c5785bdcadc8aeba725fff3b7cc14552b367d265360fdfa1e69a6a5d773b2b07cf5fb8d95f7356acfb648c22745258d80726d0d0ad8f12982521b4de93f081e483956d5fa97648851fb00d9e4f64c3ee4f4d7a8c53767fd9df32ca9ea70cc1180287e5ef6a77e1d44f97ff955d4feeef98d68e83d3eec6216b6c1f534b3b95b8745408385326ae23410e1e7f5f06eee0494800bfd7cc5d0640f6b39eedaafe0b4d95d63c474eaee9c5ff4cbb0c87b7e8ab20b52796a0fe1836b6e8be2afea81164c6cb633fd6c7743adbbb64522ce69ba9b4f9cbc510022424d94945e0c865bc66e3b7ad206dcfec359e42d5455a933174bf720f97ffdfce647b6cc8a33e144821dfa35aefd3320aec898f6c194e2401a937c9c746db08075b0e1d9945c771b5b72b62d9f226adfbd7feb4a9c5ca838ba6fd4fe88521559cb10af57c08f512d88245df43987c1d6c9bb2fb3d82273b7190a46be158a0a1cf6beebfd951be29ca7fc2e16117e85589c22cbd88a1ee965c18933698d2dd948c0ca8776cbd6926eabe94ebb105e3c67f466c866d81bb03ddc8e11f0bb10e7d0f30b95d94cac0d5649d3fc44a5b9f6727c1b5e70791e134ec0a3e67303f6adb6ef3f57fc968aed10b13c731eb50189885b3f8076cdb2cbec95d9f2070d7e3c3e5a727ccb56653d82b1a1f7c237dbfff2b4527f97f6d383c7c4d8f5a4826521108376dd22745384524eaf90c7d91409fc003ce9cae1afa72562a7836921d3193e8f2ca8c1d35959a52e7199957f7d1b8993c2cf39988337882ba2c05a0eed718651cd2ca564b8daa895a9060d460a47cca663 +result: pass +shared_secret: 1a0ad65924728c415ee9c92d0dcd91396665a24c59cba878050390acf2eb44dd + +# Official test vector 27, seed: "54770ea1252ea2857d6635151194f5f520adea8a41e409ff498d40c271359858fe2b084d5b96bee087b8e8f4dd4e00c5" +private_key: 06e67b30992ac43a09b6572f7b4764ea9bba93b05cc3577a8f762279c1c9991044b7c57ffec6c73a8cab976031b32c33430807913524a3e5ce0e1627dc11495aa31a0712302cd26e7d980bdda08542d30fef9a1cdef2c302c61b39d119c09909b338529b89c4b52cbc5111c20a880b493b01902ac47feaa041a72426b4625da3a79704a239138eca642f24d382dde6a0c549676bccbc63010ea8f17dbca231e69ab7acc5a9d9081090cb653871532fe48879842e7dc41bfb8820f22367189b31d1f201b7c50e25466fe4891115c2c8337a637e964c5d88c5e752c9a247047bfb2b0df93a36d06d80c3230cb628ecb5997d999b1a70a5fdd8b9588678d1e892c330bad5aabe0927029f173b6beb512d59369739ac8f0b5fb1663a874426eb31cf1818199b984c6c01b70cb56c2317078c393e5a35cc749c7d06a29c08a3637854a3cad724e8c93199dccc115b5a02902f29b482c6f1560ea778abc9c0bfcab0f4468761e17c8d265b93ba7927a2868f78bcbe6374723646a82821a4925c548679ed3bc29fd6022ea952e7b8acc220aea82c66c75c1a9d4a2a7f793ebb969b877a85a3a1a886cb57c58b3d0e091c5d136dfde61f1685626d73bfab6b672e95628be27071897d880007ef364982ea4547b195bfd79323874000d8179876a61b0589fe769e7193378c61149627acec65616d701f08f654f486628cba1574e92ef7f96c44a0ad9057b2b175012dba705a4735db91cf96155146dc53ee32a8e7620d1f6c0d969007ba84b36fd2bbad660882467b6675b77d838b95aa32c6fb04f109b1c8eaa181c4afe3cc7e2e301c8c89cab8e4587fb472dce46f3980aa62a61526b79108d611c9c103eb05746d58ac6cfa58c4a474d2a54f96e8617453847cbb296038498121b867f9aac8776fe153bf3f8895a5d02df74c934e2309414597c176857955bc7bb3c5989157ea63bddba696cbe57fbff0c71ff637a54117939708db26732ba13b33783416d0cd3390a437e8cbf4c978989000ada7c5405254b9e9094c5b9c3d211f03e205e6469c478ca212136c9ee79a427b00370b2138b0c11cb435f93c4ced3326c3b1bf9a2991f9c4c285ab09453a2cae4797aee106fd95949f2007b8a6177a18bcfa717106688c7c536d955b3db2f730c832b19cf84b31462c6c4623527b7e454085aedb59aec591b69349b00668e170b2667358daaba2d959250cb0486f0448768689b2c5450e8ba2fa3a77e9e9080dda636ffa09081576fd2b0320e69cbf017d468309076884aef925f6a9938e76b52b453eb8c563411977551057ff750f1c206236679c09f98b34026b42a2c778407014396f9cab89940a3d66d76ee512b7f07375ecc039c4258a1c7a8fe521868a99c18cb78b17e78334e598a5260ca42163ba705295f28c36cb19a242216a56079826483698bafef6755ecba3b7091ee2c3c6afc9b9d2f42317a51e2a61bdc229a4b7051afc6472062a440cc7b684e200aea93232ba945d21007bcb58bca99b269c5cb46b3915197278c27bece1b9a4e6ba09ba38573987f30490f57c09e750c9fd87be933a91b9c59717e3b5c6fb660eac8556488d942b4bb00711b2c93e4232c1c7a08669776a3f607ce80434a94334b45589b1866bcc69bad27ba323a563f47bc34073496a468dee6013330bc9a219452caa35c1a522c45c498fd4ac5564627d564d3881c731a9856ff7619622aba6f928beb9b9373b1104e2cd2e6246bdd88268c1b512867ae4ccca21140f0c046b5e5817fd64a2f93383c3a5add2f62784e2c8e80c150a1c8e1a8a47232787ad529333a07e0c512332799d9896a6071bb4e4fab647440f82cc85630c629c2c2068037948b575a1693f81d2a045a9c5a5c2306e83b911ea1e86db5763f13ca6b02ca8905b50faadf5440bec7b49913b371f0c5786fc585dea2813fa9ced349d9fa32cb5030b5efc274522ca4c6985b9dbbb245465a8849c4c78688392b0ab5bca98b04c7bf988ea84292c8505fc7acf90199eab7c31c13252680c71c9c333e91a0adbc1bd00d023c8d7a7c9068c3fa9b3cec75234663a2b73572ecc71e53a8eb5889860a336f77bbcc1c854d0c3c61c65216373bf2603a0ee72af8f747bfbd7401bcb9d599b6cdb02c210010d0425917b72891c33c97e9b39a677010d22a784003e1b917dfa3273246acbb45a79c7848143f0b583781626ba02a94922490c7b3695a787d9ae22e5470d32cb68790d75b81c55d084a43c4399aa587e07829510220469ab5e6381517bc9059353b68160ebcb0edf969e8c317442c4058423c3356b34035b9761744fefc76145300908da3c13f95eb3065f2cbb911437cd24f815197c0dd3f9c87e3b54432c50de1c7549228c5f9c32ee8c19fc4cbb04514025645e0fd1468dfa274e59a50d62c560eb051eac35bdd148ef75b0b05357619490cbf08b0b13767557c5fdb310da985dfdb9c35580217067a8c68491ba64307a618d272363ea346629ea6885acc17733a801166fd404cca58b591b68b2c73a9e890a13bb173584d2b6db351133e75d258995ce46a8f798a44ddb8526633949e5442435c7b3c083875760c00614665c4a2ab92c378863a3755ddf681905ec2044c331c4b976f6ea5335bac739c2be9cf141a9f3ab3f669c5fc49d74f79ba066a7d03b0c2036247c86305bd45194a00e33a1179ccb8d05b374deb491bf5c1d6adc4506803a8c65b18dd6621a5820ca93c339dac2bbc098c22b4e1fca3cabe58ceab66da6a35191a29ad82c74abf1c823200bb197015e074d14f224fdf30a51bccc015a152b8443892b7450734b34e77356231c6a8016aac430db0a8954c7a416b43d49120fdc4017cb61c3bfe70fbf24773412b6a91375f381658d57677fe571c3bbc800cc80ac597a8f2c5cd1f19567ab1f4c797a68e6133507aa90d1ae096148d313b48096ab96298c33c3828d645a28098c777cc10ce068c035a71f7a2a36306fbbc311d3d14214c042871388dc899ca2116baac1aa5cb261af35a0e255b228498295f6b4ae171dfe21b5f66671af532253dc724a893b933829a0c275c20407898911472a02eb484d4ad5b8d274c00bd9377f3c497e6845161868434c968bd847ee90c2ecf600867cc790b005061c8d5c49339dd3ae23920e65da2a19d649aad1b722552e07f51cca7b87efa315b6191b31279509d78b0e974860ba9f635283412038efe3ccb2a0c643c68756149a03b50f6891b9fdaa099ed50d7a012c0175b9518c15649396d94ca1266979893e82811af8c142323fc3d38b8b5e554fd046d93317dc6d0ff28990721c3f94a93024ce01b01c0ca55d634c191c4280fa71600a8982c350df524cde514431ded7aec23576530894bcbf0ec0bfef0bb64f +ciphertext: 45c095544a69ea32a56f9b6afa5ba17216c47a7edc519cd2a8b54b4359629d49832fcefb5adb0807ee8cb2be0a0066b782a14240462bdada4016a5ad2bf71299ef51a026ba3d0318b7f1a662b45296b20a5a25a21bfc67cb9c9286b659c1b9ddd576494e63eb9a70369b04a0ed30b6757272b7a99a591868569fa52b775facee306d7f621ba1fcaa3a5058aa7e6a65349d4aad045b70b4a26e6b5a3952fb89600e0f1edf1fbe7dfa31838a37150ee51e1c1af5b2325a4cfb2df17ecc52f42ab5b0db2032a2d01d9a77f7aaa6865d2fda4373581734b78d53fb2cf3946b9ebb0a677f8b8bcdec169ca03e928a08d05bb019c18d98ec084066b2a4fa3fd2e1b4711a44dc786724ef7c58f4bb6314b0b1486933004f51c55aca5a397d9eaf8d5dc557cf04d382e969bf96400997b046af19d5fbf9d6ec87b69c071cd6ecfb5d7966b29e3cfd7e3b310b6459af89e93f5fe3bf9ddd8f84437661581b6403c582f22ffddfe741c0fc0ba51f1340f4f32bdda61cae7ac83ea2213018fa308b3b38ecbbbf5ac3b44068d7bab95eca5afc736fab9ff8eb937ba5c8a9b5ac5abf9f368bd581ba02e3310e254ad718b16dfbd900ded9759d909d61d2e25a27abe04fb63caf38f0d2aa0518463cac1c35b22206b4aac9de635b30400efa4ea7d0fb3dcb4072b779b211cafffe97ee756e7ad57554028bb2f515eb6bc095e64fa552deeaaff90312fb6e9819783870b0c3f83da7a3f16e38fafb9221833993aa5d0aa968cc0a4888a43e5c1e1794012789819fed28a6aaaeb023467dd152204f8f7543de435c31460013c082d6f3158da33f5ea54cb1f838c1a9648589c3b09a51eb8df1b5a6c8d82f62d7a946f6d198cd846049613d00cbb57199a00b506114d230a86dc6899b3ddbc6473e6a20fc90754bdec551d0f8a42f0002f14358e0285aec30db88433b1f6a6f70798cb97cc9100a657f401d4661f82383ceb83625197617c021ff076eb9b08935fba9d8aec0aa12aa06db57cfb5574c50bebbedf9ba41f68ba09b0bb1c73be5e29a1e467af5d2aa29cb84bfa639386c1214d6801cd2ebf6111452227bfd1323e6ff880539ce0eacf74da99c75a9fc6270985caed1ad906c8b1451f399ef09e4336d596a89f1d071b372068d38a4741250c5c38cb2a893c793a8cbdfd9d78e943f728ffedd5e0a9efc228f7dca5d9faaa1052569ad2b3ce85a9d5be96be63790ffbe3e7cb05333d8bd56d5e44080a52dc00b516ffdf77594ef0e92e591b949f3d477cb6d0f887bd43273ad0e945348cacaffd5132a642c1c43fe28bbf6ac7cab18b45b8910d1a107d2058af017e3fd67c7214e039451d52ab961ce2712df6ebe5cc8f3c00414e5a817d148528d0e08b3761b774589b00862c0e1162b463b1fe43d294eb2439e80e35edb261856099f32fb548d494eaa4014de2c5e223aac793a3a55da97be77e998ffbd51ae2ecfd1dbd0fc92f9fe99e510c329a6c74fee225db455197f4be18efe98edeef43dc6632917cdaed3aa8ac4bd6f613d20 +result: pass +shared_secret: 9104061d3dbfac187f3a9eed801545a52f1fb0c3979ca8315aa31f67775d1036 + +# Official test vector 28, seed: "cd6cfe94e9c0a1cc4ffdcd2d7876504be5f50f1d1ca5cf93482943465b268276056f2781f4de805c138976ca72621387" +private_key: 101ab759f6afcd596d4445b4e3a1907b3955f81641cbd1aaef79b22ec38af5a081a570b67dabb410aa3c78925c82384b5931908d147926230522da5cfed372e9eb2b94900625e74caf1098144572a3d9ba32d875c9184989c823a3f23da4144938b88836e9c708e52967b8413f206758f578b340b2936b798775b7aaa09efd567834e52afbb17bff8b11fa0435e6f55ac73219e79254e166cbd8dcb95f0874f26925dfcb93f9461b2a48925026651b0cae117483d65b3f57b90639a39b16b1535647079f12a0d897c51cf60291a165fb884680071656c407c9e09b31977042a2ab6783a9b448ae7d924243dbadc5b00c00303c9a12308bbaa51f024884126e01346665f67344d2698adc13159a316e4175dc532c75d40d6ce54916da9ae3f763efc74dc9a904d7d8941fa34e493a74e0f9032e44a84481916530573d4b372fc6790b3c357a6b6b075b87e6b1a82928037da41f265c7a493abae425c11b6514a96c6e3949520ea4b9a7a18c76c53016a0ce644237cad882d79c60739a4d2651a4e900463a224f1769a40d04cd1c2796ce2860844ac6fbc87b00379446a637f868b73be31c57f41830d3628babb45bd5b9712b33bf5637e897c6bae6cfc6717dd87ac5da5620ca04cae154bf58f61024873f4ca93738a444801cb5b61acbc6098b36747bf6926e78b08939116ac1604e5f61570dca65832ba04c8c64da99838be418b61805b1382cc899559a62b73230cf126a701a56aea6795e6ee95c2169ce82ca352a5c411d89881a3a992704143a06d01ba15f9f59083bb70c69fa5b7eb72036da024a3707bee499fa4057a52c36272579209215f21890216c0f0dc83b5dd38867604a6175c417962a8a8513dd5aac8e0a806bf24a855c89252c392f6acad0404f9445b0b781bd26e15f4cf4a7d815bdef3936001219955797c90191c7c794987c3d1d80b07c04b14ea5a6ad49bd4ec27720e68a8e855a042a8b223821dad9b53c00912ec92249ea15af46091714759d04b4734a5c60d979735741c9acaa7b62b413c439a3bc7a6510c9c5900af2177bc5104c0c079c67a03a12f923ead47e1ba85753f822c7334e25a02a1b155e0b4c22af82b353db202627b2e4949a3c874c7207c0d96480c33c9070723b9ca1a2111321fe22170544c255d3246cfaa6960264ac042168922153970a6df7a465690a7348c1ec77b997bba243ec7508c88b730407bac2a9b6040b83ba7e034a7388e78b010ba662d15eade2495ae63568a12349c57baaeba16a32c363245f599475f7e141d1d2462076abe3071fa2566c85197bc79b24876461f9a0082f4701eeb619cb5c4b1c169715729fe2e27d85890def829473d33f47bc7216030063466f2a8c9fd5e14e87374001b256a6b98d3c53094811108c1cb6101a6bb18a8bcc7bbb7b4278d030c7f04368d655c848d1a22d8a79fa787613b653cd0106723c9e8f81439083a7f022b9c98b6dc7d39c2c7b5b61f4c8dc06728741a641a9684808b20ff84a9b2a569784705ea2758c0176517ab47c22b408ab16ec20b849f1cbadd7ca82332107d41f7e6a6135365f86098fd9a66847e03641bac2f1c933baf967e94265d40847976b68c49730d245b5723b9f70d99d171745edca3a65045bf6e0625aa4955fd125d332ad33f9a3ceb2313ad50c97614d038547f22a135a33c06c61545b9a26b46c41d1830b83d0257fcba82b36510199224855bd1a837a369a2c823391b1f84e54959a06938513681d97f34eeaa7bc42eb13574b29fb785c457786ac69ca22f644a1d53278d4c2e0f325a1209a0ca40fc32b92e906650b484e7d92cee99a078f5090d2fb60f84b47dd44224228443d36219a081f9956cd7983ab223bcc094a0c65414cc2aba8564977b147088ef41aba589653e535847450c762517dfa462037c2c1457ef3d1909d0b79d66ac6ed9803ca88a7295c4a3ae53cc77c235cd8922b36ba8b837f375755326a960beab71aa1b33a8b64d6076f0889424b1875ed6316ed420db7e02d731b2b3065c7e80115fc1406c125b651c2b4ced28ae9c67cc505bae5b747e5722f4729602bd1aaf25ba333c29ca011ce36f55494204b0f70895938c9c4658044740521097d696c8efc045709369f88c1cd46bb763b957db8f48abf1a07f431845c94beb7a3a68d42af6c2c3095f829de51b37c134f977461aa2818073682def71a65291904f0c214b727fcc7b522c2a33f7a2e07a65926fa5661172103b390fde2814b21273b318d029a112fd389d0324506d280be8c49bb923412f4c430ca82f58ca8b7122907b986fe912c323b1758901007067153db7b16168f791610df534aec8050a58296f58b7549f0665e13918c784da2d00da79559ee006566050482b2a13baa4884aa83351753cd7a48e6385292a990ca559c8d630a7dd4947e428198b06242179c369741fc067dec411765c58364d32ba655350530a4aad934a1d14b76f55a19ab7f2dc60720124a2b69ca703030b2320dcbd459cadb6662fa0aeae170f880797e2bb0a2f24e8dd1442549ba4510153640ba7f093acaf41f67f55e4269260ce2aa28261d4dd4acbc2a4a134751261991e7b36183387893c5900e8a611894c76c26217a390f86e5068a947457db75e7214b8b05a3c87251cc2101d7e6115c908d2721aab224b038c1b9c348a3c04c081496928da726c0d140d363a427b93427f16841c97447698cd0f360529725ec86113594045e143659cc1a0667832f40aa7e059d0b1389048a75429886095b3ec5a646ea12a09424338c6ab729a27e595ac7784169c6e7c7bc208b07a44cee5940f85896a7285845a2a262da092d1b0295821975754898bab492530e44a410f35563a1e45775613192dc45df526cc19b6eed8186e6f706e233542a4450fa6c89bf993af5699dc0e46965417433d5b1882340a1294d4b229d42061bade4683f8557dab0603fab1bcd956b29ba8a2af60093654f09e70f07eb3398f7bed1354a7982416ac40860538c36722ce1b37322c4a888c2359080704490b613c9a5f7318566a37139563c40d58c055b827145bd659c8fc6b7908a071fcdf0b17e4351cf3bcd9e8cb9361985c70c49bad71f860b36ae120f62c06f3b34aa4942985d149db7b13e1412cc1ff59dae21cf50017883a0aac754ae6cacbe87a46919c05752877840556af8d56fcd848f982b415d333fd8640794918ead0121d12309bf622d9c97551f294c3822644834b38fa844a035cb5458aa7240f750287f95feb1696d88988eb0648c3cc0fa9d4277fd9af8c579271f4c7721b12640bf755e94ba06204982458a9be11e1da542ece4f3d284886800fc8e8e0e145e44aae52cfc609e6f47fd7a6f6af877190ff52256d0ac5b05b89c3f449f +ciphertext: 8ac1b83c47c4869e81144ba3963f3e4e1ea682e982500d19d73b368d60b66351c0da3211acf974bf952d3c6fc8a6586ef9ac89c7321263838ed84d8debd7fb67eb0aea8764d97cc371eb71970c0c189150b8665aadf4396a344ada63e29364f2a3f7199d5e1c0b5774bc87411e96a6907e193429c9cb9ed2f127e025cdf9c03068afe7647e1e433ce627b034afc329168bbcbd930b6cc52316b77697fe20797f178e3f16b45ec4a86cda556abf7c6da5d908b7975c6678edd0d4049dcad34c199f9617ebf5cde3dd3c84ff2a9f9f95248973a7c0cc5214aedb637c170b83a8cb740acb2e606a3cd524378ba26c6b019f3e8c4ac43eda767b9b135c52168cd0d548dfb0c38a1a212ca310905c4395dcd0c9e529e3aa5aefc0b6182733cb8dfb269c15d4890018f8339794d5e54939072b50c922d6543e6d3daba38d4dd1b3e9a8aaf4eae22e9f28b18d7b7e32d2f60321d3e4bc9be6cf80af16159ecd0683f840fe83112fddd0a1d85333069b818c270507668d1a0d74e018dd8b2d989502e4446acb04758cd4d00df4c05265d7702e65b34a6e2df3c77231bff33e93b9fd55148544d80cbe5b3a7bcac3a247a858eada0714003e2d9776c95dd3e2e869de54ac58ac8997d750ca6b29a9bc20fd4912d7889fda29334f7270c984567d222653e51105e63ff7b04cf5ec4de4a3e20c6ffa6b34e8a47a17936c684a0c57871a5852565f5872ce545521c832e6259e2a66234361e73b858129932e69b09eb5b7e7957bb7e8359e9257c205d1da5e455d3c3c64beada12d15e34a6ee44883054217142634a578bf42c9df1bd4b7d74d79b40fd93b3bee4e47b8a1fbe570c45061f55d6c181ec57e7cb7a845dff1bf48939ee9ad35146a0a7a9c0564628a4bd3b6443a2cbbdf82dfd11642816c130bdc4bae905028a584964c91482fbdba6b3daae7822549b04ab83087d12ba7c90b28bc418eb24165219b36c73aa32a4ee1b2fb97d421398b187a0bdc1fd7ebd508ef0afc01a6dfdf82cc37ed7c0bb771b792c6e4a5d4b4112c941b3b2066e1b6c63885861c0ecac6b20a206326283ea9d375c6aeccf179d5274389f0dc49183f36707d72ef6cd7adc3d544c7311f1983a44d2482154c77b43f0db3a1e4c4ac78a52b163425cdba002a29dc27bd9c191196e6ac0524841c3f11ea13782cd439b26b1a795c9f9629e0efd153af705bd8a35f1d70d3c5c8589475772307dcfeb6899f0076eb9a8f3272e72bfaee493ac1680ef2855741916733074a2be07b948bcb3690f965dabd4f4ad98ad5be62a6d4b23919bf3525a5c87839707e9bb7f61919deb787dba4345c1d58dd6771f1d7677e2fcbf827fab1508fed198af0264c47b2e385d5083d2f863619e368f4f3a154ce0caf496bf2970382e42876fba4797bcdecf5d47d8af4c78870c0afcfd0c7612f005af77cc8c268cdf9232a8ad5f9c373160125af1fece7654e0d9fa665bb1b59f73765d6cac9108ed7baed5a7c231fa4011ebb0bc37ffae8ea2b11e5f665d54b394b5a324f +result: pass +shared_secret: ca249f10d39267ec3725f56b90eb2e22cf8b577116af350f3d3c1e2cf090ff73 + +# Official test vector 29, seed: "265eb2de7099e4bd5614e5de7f0c2a05c78ef3e8e2dd4ae4cb70f3e5e59c8d1d88248303f07de0c5508652da66b47222" +private_key: b6a8be5c6c9e94c1b41a52cb1165b3e857604ea413dc11813442a518bbb3e1d84724109f9b1288f5f34d06c3aa30d913954c5c053486b60b254f3250e9aa656dd71553679f5f112d8e8c7f11e6b19072ab3784284dcb2988cc10d673a423a0c202f03cdcc74a43422a2fd3b934b67bceb074a349b8524786f6c126d72a384c0a84fcb8304af2c3d65994e5095274d2715d057b920ab40219ab156cbaf7c314fad57122505ed15a61dbe66cd83bbacdc9b3d3a1afb0d607d6e01a3e227d3109a1ea14696d84beb84c0cd02b2964762a36f153a8b82733872b0ba6103437a191a59439fc3e2ec899ba841de42bacae534bb3100854283175548ab055cedb836b49fa5841ca698571c4794c7648c65d5fba44b3c57d925aae29cca857301f61b6940bbc28b634bbefcb51037c301674297170469cd7ccf39a828d2110f8f3b9cec915c6423163d90b2dbbc644864a6f8761e83371e2c3724617b7ccc893561337bfe7832cc4a0636ab871f07fe9b93b7169029bebb7afbb02ab249ac3597e0ad052b233a454f6628c52c6727a4267447bf11064b61a1ba6a4b7eda764de23b0bec1b954d3c5882432e1ba6ef1b94eb1464086ec2a5ae0167eb8b5ea2b40c01953f223544e49bb5c441174537cf8953c74d318a5b4b6190881cdba5b1305b6a3e2528c4c8825107fe323ce9e979f5d33aa20712b6ccb5cdb449989922b8e571a71cc458537bbd8e9a696d644c713bd25607d4c26a39bbcc11d58a4154c1161bb1e771986a4d923dc9936806498cee91c3ffa819baa73d1103b868772340a1b1ab664ceaa82d60b328e2963259c039e12798adb66e62b827fabbd32d7b29e615ad76cb5690550af975c2edc1aa8849566cc8bd2639f009453d1fba689ba14d5c68d55ec1d90074de4b47a84944714a9c11d55b271727c64e566762459f7e381763981776665c3d908110a74b7977678e011c36058de9606ea225084331c0f2479de36c333c26122ba9fce2b360628b5b8919838829c2ce55b12a6b80a3a5ef01998549a1a26223a96916ddb8a0258b5ac936b74d496b8bd249412176b697182054b744301c2a3b10b2fcbcc11ccc89ff5b40f079817c186893bb044559ab646626f683191a03fd6f41506ccc6f49627c09a821ca427e8122ff91234d5d92318863aebe86466f108e9a51a37822a990bbba5e01292543e756b64a2191fe855844185a673c584a2c0897e1b73ead8ce548833c03447dc32bfe6f0cf615469ca61c376a3365fa6cb79c6129636c48ad68dfe2c1553f01dde270d1830096a03072095bfa24282f1d100c2673aca13c1acca01f158aa3a593d0b78458b75c8f34ba4f9391afe255dcc715eced306545a6a683191ee731cab1177532882d301a482677fb4c38d6b69201f0920162641f7f701290969d5c63eaf13a133563e95ac5e88a42f4d128b9c69b5c3f16b76a6731fccbe6f58547799bac3c9a6f3cc9a13ab0cd26a50bae9774acbb86ce8944fa01b16840a8b220d7886197f671e64a41886c80af2f66e899155b125181118697db62a4a4a0da162240e0218739cb439406219c679f9857dbfdc73d96a0f7a3181eeb3b38d8b31b7da8e65f30995f778ec5b4026a28ee770043be600f7a60b3b370bfa6a30c846c475127924071e3120879e2a158433a2a3a7791c204912da8576bc2722eb9e38139c198915986b58a9671fb054a81443553ad74563f587b226a9117c133ddc10dc0655a7d52d493b7b3db9584c49b4d1f41c06665a3d07383057ad70b69f85b6cb2682238120b830681794e042d910467a24091d81322a08aa1d83b0861113756615a119503af837eba16768046b7e64ab5940aad4da6e3165ad036959c39bc69070bd7f074776089aff76b33dcbb17bcbbe65b526c795b65943821d5b52ac1044cca52e3403a02604a1b4d9cc84e4b72b2c136de898a12451d8c74c280a67cabba42dfcbea68455c5f45bd3ec03bbcb3f72604df70737a01683369c8a57091742c60f089a673da350db8ba39c2a1108aa6a4e2a6f24b13d95f004801b240b50067dd34b60991db2a42de3dcb2c24034d0cacd24c890cac7a134bb183c92b5d66c7000a5a3f80898754827c9a7cc01a1550a9cb4f4f18d5959be0ef84c35b54468c55a15d274f996cb74449d1e5b2f88bcb6d00912a9305879bb156bbca9843610af2c5193363177d2b5867240d207819498a98209c109273dd44a4f2a06549335a63afb2660d212592c417b426268485a7e8693f865c0a7960e073153d5e578a74b34e9c3a57eb20fc825ba59e56359a627f358a4d7127be7d571c991078d9630e1262402a731b14b9f0ee4a3fa4494bde9aaf2d4603af1178b8b49a649056fe314caa92df6d816fba591fc4961cf0509d0dbb02ea7321ef75aeb20813e33a9717478be58b49fca3130ea2b54e62fd3243f4e240e54c08d26c5020a9512d2536c486772e725267bba974f3a451bd50f29c55c7189012473ae1e5a7ef35c0b479679f1a71fafb41ca6d16b39f100201bcf2515075a1c9f881a7ae4f4733b149e7c29973588c161616e9918062236332cc67f26a65fc72c78564312c429cd1f3854eb98c0ce91be6d9a24aed0ac65bc5d805490e1d8c86963c8adeb8755e0bcdfa473ee23037673773c46911ce0baf8c81bcd8047a9d19175f6bc31c2997c62c502b934d7651fc51562625538e24b235c4c38cdb82fcea4abaa963b3d67b3679b51a21cbd77228338a95b4d641b5eb26644a58a59abb0a8c0afc8894792b3c6edec9ccf7c29c620b9ca262c634621d225228f1503609b548f0418648cab5b9609e7486d57e5824c538037d32319427a3b077703a7368270c9b752217eb04b912a3843f4afa829b38174bbdd1cadc8c74697544f6229068344441ee2863150716339716ea6a8245a3c3c142b986b7462fa2417a413ab718ceb196f15f887a465c8f901c55db4718ea58c71926ea344c49635149014297275baecc90ad1c95c75281eb885264f11123ad8cd7cf1968e885220f0964f25510539be63263a4eb6169f7319f0086fecf996d2e852f139b500dc1fec8824430505a7702360d81823269ff4b2622b54b7f917bb44714660051c31d9b39494a64a86c15c516437c4a437f41c0fd5922dda52818336d93a8c750203fd859b06e127d8e33b52c34411e4199cb01cbd70b8ef0180b045119129aeb04398841bc8261444c963c3fc11c8dd4c78dc5a8cd902687e36aca5f2667abccdf2093e5ecb1a4f09769a8251104731ee68587d0a470e2ee6ab99d3af13f3177695d9e5b9151d87fed52e287992acb897a07b10ada1dd83409a5ccddabf9d7cfa50a7a2354f7e5cefa6f4a4e9a1c411eb9364506e9e1204a8acb3cb77fbd2c4ed +ciphertext: a63cdfb094b7b97e4a9d4f637a4b2892b308753a34686dde8ad28e5ea9dd44bb0f2b07c030c2bbe2587e1dc8c2247606fa5809d53982cb1bcc18675a7f6ee5323a12a87137236b6347ec7b6c5b188efb541b1f0809abfe697e5a3b8b6f864bbdff986ca416b6b5bac9a5b43358b47368f137a026f12984ad8b2df97ac5b43467526cf1c4766cb2b60784608998fdfd2929113be1c49b8498b03c8a690fe5a8b9797529bd14c128609e037dbe26d1b3fe26438866422c4aa8811dd420ddbc47218c9b923cec43baea872bd5277cf3ed48cba237480515e2e807e2a0999017ae70cc76cb134dfa894f780acd8d5470b055b2a96e58956dae51d001c4c9c8888bc6791f99284737aa613cb9d00dfd31b5d0649e0ff3f11718b89b398d0163227bda245ecc75756867de7beb78d6fd0bb0b713cdaa1d482a6436ba169cbd4783b5241ec44a5af9256ea6e7ae2463489dc80787022d311e900b42a09f43348c055d21af0d486d5b2c6db80f9a89b82adb93682f6e98539acea6520cd7d476b17ddc5697ffc64566445f0f90b8c187c0f904b812c592437472ae0db4b48a2b45f0d699272f7e8243a6e42e68c37c331e7b96dc676e532ddc01458df6fcb2efb17ca4b07039a0f80c7b03078752fbfa6527eb921350894f4d398238c9f8abbeb3aab93da79cda1792123d4af4562d29f05303bd90ecd47dd9940fa6bcd7377ada7b5ec3f0ab7965da90f73734b8728c4dbba594394e0461b291586a09850981b961ad327fc01a578a4cc49ca14d570d15a23989141c9dfef64fb1ca38ebc92654104b983f793cf9a553b6b422c88c7c38c524bd15bfe35559752f20074b0fa631f6d49f973b4553c81c206047f48b49a0fecb63a4868fd32e295e7a56a0e683185748bfa3aaa77676ada8b81ba5d1314574bf17a11c1b58700246a7b323f6ea0840a9db60c2b6ee1f49a06f6b6a11dce4a9d3e8d352fc82700169d1972f65273fd1148d7c9fa978167521922d614de3bef02ae3b17a183245ef9272c1a96329fe592db73821b899cdb93e4f33e31a47d7edf275c7b0921168de50c3984f7ab213682a031fcfca95194483a58053bd644268a2dd82b77ce458c37df183509e32bbd7a6fa64c04df4c91491cee59a2dbb7a3e1202d015d7276d145ec51c8a89e2abcf8125439af8b7a175326995a3f543754fb3b3b7c70094c71a37d1100b8c3bf987dcce3644964e3812b5b7dd913afdd98002692358364a1e9697a1dde2200c886ebd0b3f8faec32c92fdb2e8c83d7b04795baf19da6a54157e75bafe54026001c2e76a31d1c6f92f3906145e57ae1ba3a5c63cf59980f0b5e23555584dfc654167a5995fa4215f19469d1d729bb02523dba785c5ef873f244bc944c920da91bd702c56fa4026ee33cbbac7db1cafa48b2445491e415027824929e0e29be3809e9a3304ce69393b83db0e33155cbb3df4788937ec988c8fdaa704b5dcbf580b0cf125d7d1a540ad382508eaf5c37cdc2a44d63a18b586bbb633223933a49a65c47a98b9 +result: pass +shared_secret: 82a3856ca48c5dc582ac25605ab0c675ad646ee19acbaaab4ccb5350a3881b49 + +# Official test vector 30, seed: "806bbd111f27c2668318387bd0830f65ec21a51af01985ef48d03d64e1958ff7ee5133a4ebf6dbf36329bcaaf65f40ea" +private_key: 9d4548bbb50474e5909a3b1b9fe69c379117a840ace316a8fe3a0f68cc2488c4737f5469f025bdd6378875b173ea5b34119481b7a23388d20937eb5d85a566c8695106645ec3cb1bdc1400c1f3220669b2cc09ab752205ef2bc16961278eeb863d2c58df1c77fbc01d6f298b89049326314323a49b99c7064e8aa44f148616aabbaf76800101406ab7a34402a8da606aa9e2560deb8f00a14072e204febc3d2a48afb18608d03aa8c0a1ce1d591ee79676447a1657e19897f20b0b19a513daa2ca415ad65a2e77066606890c5de69e45367a668619e7e4a38ce656fc3702e5185142f65a6ba43d892b6f086ac0e6bbcbe0e04869eb48921936ead6c91ff3af5311b10f2622c1b137a5bb82b63247d6fb12200901e93acf5e3466ff8160d7677a0f9825d2ca85dababc27b24f3e52aa957b7371685e5fb56f1edb91d66c8ec23287846119eca062d9050cec162a8a6332cb4087d9270c7f022773c6664fd74b85eab209d15e6fa2145297232394138bc54cf4c6cd2841a65ef48cad8384a957b42885236821a3d152b631f01f1574b28990045da08eea352bdfa8bc79fb621c504dbed81b0577aeac881026322c0f295216019bb3a11569b74e91d019a6da89caca94879c801b331c115896054750fa6111207c0ab1d2ba8b328912bbccc2494a300356041c7ce28043880b56db58c78da121b41ab4d2127711c5088ed232b7b536bf00b542b15800accc5b3677802807f0b23878258d18071c1691ae63054d3aeb129798bad2f11b64238d7e83cec2717c023b5e7ee404555393541191afd8b7a79a88c36a2f711c3c2b79c64c405a84f2722643458f4c6cce4cb2556963926c42303c85d87861f4055673b7405c5b6760bb52909290168c50e7f599b798b2f6ea119f3a387d59025954c2571b095d6c761d2932d5a79761f25e52c8a64c765b2220a3ddc38039d7658b1cbdb770574f0464875b7e5c9585abf8b4b9ca9391c1a6ef647063046ddd857f7811c075250621228b80787879651f5843c175eb86883a73cdf97edc6c6b79cc917cb710744b44a9d455cec7a0c81919b600c755b8506003a86ed3276840afd59344091a8430d4705ddab1dd849b96d7238ea9bf63696f709532fd49b0833840e373336c8119a1e229e4881b23868ce260b3b3378feaac8730e69642cc068b4a6b16a0c83e4a484de007b6eb2464836242f7279a754a73e3a8cf378eea351fa7393a3baabcbe08b23ae9887b973b6c653b1bd06a5cf89326d223c365791888b7010795f0c056428425b0f647230c669128b9e0865152aab666561d43ba060decc51a4aa7a0e20502167b69f31d2e6b8b6c63135d91ae1b899afca84ca89bcfd49a725184a6be2289142248439aa568d9c18f492123301792a1ce41fc15c0739d88d05c5ae4508db9936717049df17384b261e8e1910a70cd56208689954a50a41711f9bb170abfed596fe077053603694ff7bba7f41789801df0e64119e962594716c585a30b13c44cf97d9bba5d577285827537688976933569cee793f24733656b97ad6475024cac8902760fba36ada22b9086187ac68dfd26ade8e66dc8773f4eb764d322732450675fa715cb02095b326bd0970713568b12232135a5896094834cf450d789ba498787368b4e15f1b087a704e8e327d631290177add97c0a0d84820ce367dc515fc362aaa98aa7911a867a3789f69a5b68bbbabf3aabd037b5160a3f3d8277ec47898ff3ba5ddbbca6980b5ad47c59236eb33b2a9c84b212e93d9e70aae78a4f9f6bae592ac2b5f96eee627971d27389905b215869d9f4b706c379aa802b5a99abf754ca9316872f033ecbd5b34f72c610c14037540a2c86ac7eab0c3af84729c48610615c9956751759660b3c7bab57146f7b1088501fe14b2f59141b1bc6302d88a35fe27e0cfa18c1a22a9eb517ca6060f25408d4299a7f46c458b3bc38c4794bda8f9079043854179db0071af69c9f074a83438874c882cd18b69b0b2009497b6fe94a9264470be8256b49b6c353374ad49c04b1276fd484338796e4389a523598f3776291512e25fbb5fe98591320c1bb47c6ef3b4bd1d62b6997b5561bae038854ceeb41b2925c1f1a81a702b57b2815f62aa9eb2625ff3512cf9595073ca623da43f32c21d63297a491b28dd8b1361bbc91b40b34a65f1a2b7db86b0b3bd21b26ca5795b795e355b45d1623b3a9731218174b50966d6937ed057fb10b631a51b7d42072a0845be8553e19901fb0eba35f5142c75857f642918bf24544355c4041102d8b197b429fe548433eac36c42077ed787f8e631edb856d4398a26d536911ebbd9f9c22769c756f858d180b6b51797fe9ec0833c908d9ab2730d937b76a0febb68fd84372c96c3c05197093e26d01219c15f898b2c7ac75d11485a2a413a065be744e0908b6340155a244838ddb14b74c578fca2d7e6c4e15e68421a568e7e39a4a04231926768ac4a061d67550a8512e780198738bf3e2420cf75680d1cac07798c01ca06102cb2ae5c9b99b62a7349fc8a2c558989b68e3789c2c7074b476d18212846c8a8d562166829a36587eafc95a362874e812aa951a6995f5a94d370afc9b64777a7e58cb54b62a95476ccd323073d6e466e6ab909b4b4cd840aff393c9391902f4c05bea833d254207cfe938669cbee478c57ff4424004003d151fe5e90413924bf1378419e08dbc46911e2ab2b7f45dcde5c549f679691632c3d9bae26b9fdb85c7bc3301a3900386873345974bdc007f869155df79cfc6f06c39d8bc9a99675382358ba25836a15cc222ae78e4a85a19c5da9912e48128fb37a7f386c0fc86afcd2869e292ca9b521e6ef9b12908ca5d800ae1a7a3a7070766e2802a947c7edb3452a377d9c1bcdb152d37db41ce7c74c36b32c59131b1b85f9b68a3b66773ee4a2b81f12509c33cdaab4caa563e9bfb3cd9c4c72354c1e88423f94169e18bab1a9798cb99031ff852e79229630c8f35459bf40c425af7cb0843498a3cc7fda53d932a07382018de07808aac2b4d60a1e242beffb89489ba69a6a26446180103c11f7b22361f651777b997b76ca8f5a25b97291058620ee5479e92aabb218444aee52e5c8294d578c709158f655a8930fc197f765fb3790bd62a5fe11b57f273775da27fc1b5128663c623f5175513b753543bd71aa045e77e4bd42b7e7baa5ab2c4d3c41f4db84af265acecd4906fab897b5abf5af66b4c4a0b4e783b417c6fadd71d34ea294ccf8b8c8012edb8badb3437b191165cd639bcde9eb71378e71fb551293a7acfc3d283541d985e0abd85eba5315a17d6c4a7e4f248673da60c341c29fef072d9b5a99f9c7a0a011e4dc10f6b600d611f40bba75071e7bee61d23fd5eda +ciphertext: 07ff98c23d28846d4b8593dc2723f03694a5fdf7ae5770307a971e8aa7a83db47b5f9606c68e1b0a9d8d10ae26be23993f8e804c6851292c6c54ccd1a178084f8ad379eb43cbb0974fa2f5cdac3eb90a06e844be6030af49e5405be461d01598f264260e42e5c3ac1b5d9ab05bb5ad77acd5fee7356e89f5a1822ab5afeff2474bc562990e71bf0e6e1b720e59da9fafdae4d67ac58534dd33612c66c468fd9a9768dd6d6a18ced44bf35cd2887cd664176f08f1c9b0a122b7330ccc37a7ab99d5d57ee7ec4b7ead85a7a789bc6e4124e4541687399e3feb3036554ff903a595ae2d09b1abb496390da90c49171fcaba63d32d5816b43c9efa88c1a9065056a526f139291024abbc01af22511032e93f89caf7f67bf180201263a9714f335ab3808c0c3c85a9b4c9daeff295f7600287db1cb6014f34c6878d60eead25ebd39c5b27b1d5b8067b419abafdfcdc766db126026110f2b52821edb2895ceefa379a509e1c29b885582c216a3e3a7e88c0b15fa53a1bc4a2c3811d5716bb0a68a0ce08ef73a1cfc7601eebd70471e18a9e63dcbadf4a2f514e3edfc9a0ffd5226545f9798fd1588d9101334cad0a84298abf9d892c2be45398c0c67a1c912ff6c5daf42343da7d2d6f0f4f37d5218d46565a47b83cfc84dd0a76a6c86eb77dd99fa003bdbdffcdb1005160803ddf0d499a362e3c31e77491b9253b4fe3325e217676a2b6f525ed75810c37ac6c09bc9df8f9c966184f5fa3a123fccc4cdf24b886c6d7f5fec31ea0611bb3c43a2cf51b50afab8cea581a2a9e9214e7981735e8ebe4eaa8e8a44db119bcf4243d0b1a86a2150e02be402d61b98ef77cb462c8dbf55c2153ddefd08641a0d76d8bd301a59103f65018abfac4a538c12723269589d5910f658eb3c6041fa8c0c5e7bbb389f491a0c01a1853917f393ae5d90ec14c1d71d7b1088b808818d430f83d76b1d6722ab89610a7d39f13d9931ccf3c90a91f28fa8d9b00120456239aaa0ea648c1c7221122c65c822e879731cfcba33720a2ab082029ad22b2499e399c11de442bf090f416023bca3c99396a03d1480ed3cbf78b1efa5ed494baacd544c2531d51c252983acdb3b405366f88ab5957ee476fbb006caed7cb148de870247f70502f75e52b89916a14d43d11f7bea21734e3e5658109db2096ec2941adb83298b36640d81a867118a2d2d6d29f713a7d359cd3965254f05cc272077359d8601231fe4e51f72136631e2ac8269a8732413fcd39e7d5bf0793a88b69c4d86986fd2e5d2220f7059efa44a2826326e5a775a8d88965078645bef91b8d4e0c70c62964c04eca0710f12c65f6e315af8602ab8ceb13db5e4658f08b4fd8bd041117f6d1c1a4d39d4af92ee05310ab0158d8db145fe91d87d1ffea0beef800237c02ba58e61df6bf2d09f3cf271d1ef4276e09d6a8182441c8f94993a31030c025c015e9b6e918c776464a1783b1c54b34b6d2338f35871f717414f85ade6d528695f6fb7229e1a9cc1c6ec8ef89c18a7abdc43147f32c +result: pass +shared_secret: f1e13731a14d39f474806b8c177e23e4e2301a3b839539fef9591a71e4f67d29 + +# Official test vector 31, seed: "ad540a9ce816d6fb1661e5483c44f6fdd00c9e7bd1a8ceda4b4c4d3697d4f78ed0a56954996ccb7da96ecb8f5cb15809" +private_key: b141b7d0d3c420b8548eba8e71f2a751882023a2938a0628fea97eacc45bd2fa0e89f485e57355e9c58b57746519e2538060924d9032508a508a8a36382254b5880e77248c6734c7f841c309830ce19898233116c0482888c03378b5946eb53e4a59b190b62dbba173d4297405f9cd189c76fbab0786fac8a0e90eb3e8ad689726b1f8b321175094260775e143cfea2c22a5aaec749e7c7002cfe8ab16345adae43b6ca04bdc21632f799c77da62755184c51b3535830277d83ed07574ff8a478c06a7dc817afef2684c00784865116fb8755cf13d19750e01aa165132c2844c1d27409d975bb2b0c97ffc7222db3b13d47c8a5ee20dd147307bdc65b3ab91bd6481e17686d2f1534c0c73fb633260930a92c25adebc2bbd1299185439d0811ea303551e0879d825ccb08b7e307ba37b843854215ebcca1eba3237d95080c317979da65172146645a543ba045f13851781028669c9b4ccc217d5ba8585a1495d652dd89b402c87043e285d3b0c72eac388960367a428bd3e7a903ffbbd83614df2b33180843375f1c9af398975faca439b0a15b2bcf804c340176400d1b80e399597372b53380df0c61ac2f0a1757616825c8a3f90cf227ca44fc88e8608162232b1b5b882017843a6b61af95193b6375951ca70ade7a525633c75333450cbb38338a493099990080d99a788426047426cc89146b4afe079fec981884a4bb1a27931074a88bc9bc1271c40f2a8b6a1bc0ca4a24d71024bc7acc077b97cc47531d21de9f94fa8dbc522f78f698c77078788f6d90f67a661095b942cc5a349076e79ea90139cbf9c2216ca4c704f9992fb7a213c0b97d2bc5fc3491a6cd3bc599c9eb4d1469c3a3efc14b7c6020c4a85481cd86d8c2b2f51410ab1cccd55458bad9422bae77c1d544cc52c94d0d22d2e9783165548baf519bd05b4909626da8991fb48cb82b0c3a25b34f3c57a537039dba031857b40023b6ab8baa64b5234dc5403bdf3aa647ca09bec6f32148e99db47c7d141edc70c804b722559caa7214184ba97ba9802a7604604e90510295b21204b22955402ea572a12122205ade2d1524e57b85acaceb767086ee1218fd51f4799be7364137b364dd2f832e8731605c9c69f4848b3237b51ac791d4a5a3ecaa5edd29de90412ca62c5556a6389ec98948735e162745f383c9c59a99764583d19c72255454b568b908a0e0828b7dd235dbf2268416c1be640289606609f0122c0b492169954cf201a7d654e21541eebe5448b0175d9b10314397a6632865cfcc055e566b476be03773781b35842b6583105200e1cad7475bf95355268aa1cfb1c7c16a68d2c38b92b6841c0b545c5e972dd7794110b5d34cbafc9678e66d100ab1c6a1e0b5c262148f730762086bb7fd017aea3069ef76c71c110db4c80cb2c4fdc8c779486223920731906cb4553a00a400a3878afa709079354a7f3e3795ae77698668fab278688f3b21558306ee6844801b625b017203ab715d110fd636f4fa3c2c3c56ed43879468c9cca379d3cc77197908c54875b0ab7b35ec8b774b5ad15d3ca75291b1ceb201a959b57215657606dbc9b8f1c124eb8a57c6146b1931c019a0a94ea266f441b6520b199161877b30c011788cb97cb439789a67d476d3dd265cae63cbe43cb63aa124b93071d6812bc662f346481f974a73b16a505c48b9608359a3c035135258029a18b0217461830785379d3355ff3968d3c63a46685902425660b232b11b93997e60ae0a5bb95a27d553081f393040b1c30ec87535ffc6fe528b1e9866cd1e69520e376e0071087748691dcc057b95cd4c60707d8b976d6a67af4869d960d5466a9f3251dde92cfe8a0b03ea2c43bf03fabc9c9b5d97ea2f558b2bc0ec1908335ca4f2607cb04380a830b245f8b43fd06098269bf9ce33fc07c1e68a05f63560d70544eea4c0bc528859a5b09683b8b3d3c6842e6458061b7ddc4b23ec6ae83d557e5c4b1848445fe253b35e52102517cd38030e6ea28a5e1a24bd09ac6b83c5dc658d11589900a7bb09a963480a2d76225ae55bc54108fb233785174b375a184eba110e05762e7f26139dca4cb197620156c06e47e5b74a0970bc6e18b1e1c919a6c0b10e7470d5ce09e2719194da0440ac3aacd86bf724aa841a83dcf64c8e1f7704397a4cd57bbabc9a0cf940e97e8921211006044228632382ef48fb5d3b65219a5a6983ad0e48ee39081f2ba1103bc9c6314090a31aa34213c0c319eead96b865cbc98327570b965bf00cb9bac18c640273d342cedd11d72e2078399c458068439a8a27e388d3f4bb285b63992b5a4354122ac298222e39d31cb886c4958f28c5c2f37384632b4db216b43ca6246051fd704b5969c07dbd525ac6a479e730f8b11c5d41111ac65764fd71a4f43be55c563cee5c26c69cdaa485d850c2126f2bb16f5766fe86bce17535198ce99c2a66918af96641b2ec74be2b61752076a2db330984ccd7021ce360a0c488143648389f492ba20ac566cf401383a496991497208b760d36da6896bb3587788597191c3347539be92b78cc6a2b0d8eb4188320ceb8aa6ee1018e9f78f4f8097ae7527ec947cb1b27dc8a86ee200020127531273983bf66746a7b731464a6b1524b18744a8c606648b2fb1a4339d5a15d7f6a5ea3a1c08122b773ab09564792fba2e28719a603c3ed0850f2d5045de3bb93dda7a84e692c25537ef695787fb0889107395f87c6b836e138bba9f4a711daa421a396f556c26e3778f4d364d5b1844118b367d78af37836fd7a9637f1714cd9a3e52155b0047468b5420cd5c6bb64138ba16863e18b4368542800b378537b5cf303cd2b191ccf783719142ffac1ad0585b1938281ceb5c86587c43b28c49d9111982ba7ac567e1fb64d8e3c450730305cc2e4e12cc698a728977cf1c9b373f051c17f1935177ae90aa8856a5a24d18a08aa942b4250a6447c35289cf0b334af45647e21b5a2153a8a05a38ac4c728a3350a15502cba347a876cc4bd12034935bb3dc14435930d912aac8a787db3ca33521637c5159b015920100b416d22c18d6a0a52612c7d75c15741b6954ae752c4d31fbaf1b483b6b6862e6a983d5465e3b7b80e1654faca5c669e77295f86263d344031b5ea7ab99e714c0a821042bd9512677ab9e89309f41cf47944da1801521402f211a6076490ae393818ea2056954b24a624e6e54acb7d5bbb32c14b339730af6a72647a66f761bbb78012a76540763cb29dcb9b8c27a3c1e43769c31af3ef54f7c8062d713cab3803437e759a01ee76fba1a5b21916dfe025b78fc6d4dd1d1541b51cd3eecca90ae52177431b33c708faf17b55a4d0a8a41c4f666854e9b13673071ceb2fd61def9a850c211e7c50071b1ddad +ciphertext: 90739b108d664dcc63c20ad1f2f37658b96f819a6f7801b7049e8c2bd4ee750da7d7f1b8dd47c2147ee4e282af69cc1aeeab6a8959c0a714aefb3625ba5c057c120943b5bc7b96b7bd2e8f7337bdf6fae024a2aa667c556c7f7fc62bb303e898a3f73fa2b0757302cbcf3097e56b123fb920ae88b49ea1f76008564f2f0ff54fc6e36979239d446ff38d85f84fa82a4a3624a98a37f29651613cfdc323e7fba7a913997fe19d0e5e0f825a89cb37e423f348a1d78159a90ea4aa0193c4c7ee86146e3352c80341757c2ace339fc739b33313bf3dc5b53941772e782eadcb558ed4ce7e14ec16334eca20c7d12024e47570156955b38a30e817eb139c00969005013f941bdb7da9476a29148599e679154c13b23ad1491e5c9c1b3f04e2ba290c3b7cff7bb019793f358abe6353bb6824bddd156e1d97696a8b7e32aa8a39226a29cecb496198885ff3e3671f9dec9f443c45d5fde1d1bf1ad9b54062566aa9fd87b318b6c74a2f78eff5205505321a71c3a6a1254a90c39c39d44783a8d3006744802cd64b6b5379bdd8184f6362709e8a6faececd89e25e88295e509dd8f20514c3487e20d5d32da32693146e23dac996f7b019ad79c6abc01b617f2669d92881f8565c95e3c6193c4e813fa11313221526b54c795841c115544b81903801b6507662f2fcae5feb9a4e6903411a69e5453ef822f8efc570e82b94c28a97038c32e4c08db304dff48ce7273cf1d8bef89fba35d886e05703dd5f839bb253b641fe631adaaf43e53ae0e62ef827636cb3cc7a579ce09a0b184621d147470ca5d92a97baee9dd4c1200fe0206fb50081472d9abd3b592c98cb799044b201bc2db832e83f0727018b60a69a640fd67f095d9f2e1bc42d33e673220d5f6d86b2f3e1d1d63ff39c9ed1379dc75c2b3265993eae102373945b049ae2be4b54c039029dc1680b89313ab027fa1196010d0ac8cf29ec39348a1e559eafb3d29d346802a8eb485dba3d6b9cb7ba93e1e4dfa79950d9756ef0dbbb4aaacb902a4c21c02a7a606b4214c8108949ec7c089aad9a63aed4778af6a779ba4b1df5039ceea017fe80fe590cb761ad940609c9716a1e21fd0db62039a9a21cd0d8b265e350f61a982eb167629c79483c5f23791f0b20b39c119acb3f18cfa9ce2aa03981deed204c9c4e9bfb8e404f1899890262c6183bab1133541a4248a7a7e70ace70fdc5bdb21be1aeb020117f635f2970b7497d23197969e9138a5e50f81a752b1a4b22f0199cb53503344d0bd4d90bb3c52dd3cb58cb96d477e8fbc237370a5a17f0665b942363370cd5d5801199015a5430bb23165fefe3eab656facfc5d023fb0f0016493b801cadeec5315383aae86721bde15061f17e4d775b8497b3de3684004d8c960dcca5ca0464a4f60a43893cc75299a477897c580d434c44507afbfc5760839061d481dd264f6a3f07347ebffceeebeac27dccda8d3cfd377a29426c29d57d2367a781801cb227695e657295113a6d91ceda67db4af71f0317a6ca9e206fe08f +result: pass +shared_secret: 79c5817a4ba25295cfdc817cd303f3465852b93c0c908fc4a79e88c45f3b81f6 + +# Official test vector 32, seed: "288a5f2684d862a86d2790afddddbac6fda934ee7d2e6da1508bb550838609e8107312b28e00a6c01706374ccd3aefa7" +private_key: 5e74b833c0808f44300017c6b2773ff7569ccc971250623710e01c79f2457f572dc1a8c9e23bbabf0b16de993a063931936a4d6f4a22e1961949ba5df2e3aa07693ed37b2b9d98668019123162be5a1c2907e35d0ecb258cb034e4489ff1616d5f6b83a7877e0cdc5ed4677d84924381b1aac175377b4b953863b296c601140281d9d5889f649d3a4c8c2ad662bce81753b85d26eb058b7536ab98afbd4a969ad26db781bb40d980afe249ae56aea88b59f1b28dd3f99ea3e6b8dff2bc91544f7173595fac70c0d50edec867b90188f165c8b1725a00a45406e18d242b2f63f7736f68c13c5b9606e700f9d3cc64ec0a94872adb04437cfb7ed2623eadeb11da382785c74d96c96647e482e8ab1c9af58cbcac5d4741cad8e6a80028219af15baabac6d2e884599c2b83a1307a03ad2d4791bcfc767dd36b810ca63a7587486749835514fcf4c0b7d3b06d950cb1b26b69b8abe466029fa2b66966501f6c812bb24834c3b72bca0a98913816737384d29a3e70327f86bcf85aa92d393a5d516b2aa49694e32845c559ceb89f6351b825baa599011efe9558da35a05b4537d01c6ce8b88eaf796b36a35c9ef41ddef86ef4bc695424bb63fa5cb4533abf2497d39057651b22a9806b20a9a4dd6075cdba87c04051219a8c7fbc564ca84f1d51baac7bbbb8bb2118990e5138726fe0c4ec51aa44780d5e66169ff17312d214e4d908e8461b2c004557f75ee749889fe23612875f02046ea6a6604c6c74dc746bb7c08ad8fc324be971359ca32e17864987712225257af3114be35a3483bcfc1135c0ec9a34b67ce5e20290b13d5e8a601e55633c154a83d65e1ea03d8da88bf5875429690f848bb314b664c851a266a880f68c8b69c184c773cbd73a3e32556207f432ea9126e6e778d76638607c341ab42b61d59d4be986e686474878a4d43c0877599689b35247061f98229384250e78408b76230a5485486ce70b076447bf96263c0058bb455cb4901d4c99a00eb316d4ec3540e6cd269b3093c6123d855fff761e2e394e4204366e7a132425978a0561a4e2347df685c5b6b7d291cb3e0970ddba9bf9166a91f5cfec7c751bc793a574181421c07e854103b4c5943cb3f89372e23cb98f75bae819c71de64a98b145794a6b006300f851c5581a30293542ee4482fa8987dd0a00bab3a9881a292618724d8c164281bca6a903caf5c52b31b3f341a5f3626d30443190422abd129f2e677682352c4c9427139a2b77a362043cc1af5737af761a62f27161018d76f8137df25c1872a25cb81243aca20fa738fba24d708c7f2d610422481f3ad74061c22141b7a448ec8bf7670ed198c0ea72456567108cf56991d47069e6a6639c2dca8c95086c8d3a5cc49e294400bcc2fcc39c5b673ad1e6248204969af47a4b036fe7478ea16349a4b49b857469d115be01c2662afc5880d5924ba498e353597157b559343848f2ccf4ec17951943b39cac83bb52c5665ffd1618bcd6446929cfda114ca3c554c6b9821b6b85084873a3b20e5dd8486aa7b591b1b6f7b83b585c9112884756386a35a04f60b74289e206f2994d8c56185b1698c0583717368f7ca58e7635090aa262cff0b93af222dac695d23b1a80b6c91017009cfa4925f3cca1b97d1a820b204a4ad5f4bb2147307a5350d0244ca20102b8f800c924bdb5667a5866303ed52e27c932a1d84c637c707537409fcb7515f195e557920ff79a3001354cea327f274edcbb99e66acda0aac52dc503717a3b24786afca70dd84c7c4ed1c1b3ac454c832caa687bef8a96bf6c1182f5c663c1ada4784654393d4c83219c149e31fb0ec1e9afc4297968c80209594aa567c65000a883b32e3fb82d9eeb4e9af65ca4fc0cc1ec794eb2b7ede1a5556474f3b023c45b5d8712109a2281f4527a4bbc8262c9bedd0758116643bc6a85f836825541767595c0b54516a330137f0724a1b232cf0a399e0478f732c543f81b9d05c7f5b086c64291b2d94cf02462df7c0f43eb06319265ae25656b462f1445ca5299166731b114e8458a0a0361b135e6002315b65b337304404a907f3c1d41ec9220055939e11f263186c3751f96d750f3a8588ee14f40b09178368ef03a9526a5444be096c3da8a7441638f64b4fd201e31b34f2c456ec89890f53c9a25b559b47856053227e3b36c16297949c6b11159a79a4344f0759c7071a738eb0f80c25ec2f0a2efe614c7766c9dd68fb488c4e514769d9b6be2d59e9c9cba6b5b1dbc9b0d8e5c7078663794fb4eb8c7060bc1b61286cb173ab6a80952424423746bc91bc953b67908bb34226eb382bd54bcbbf5c60e467652728186c357b3fba85f6b8553c79c730ba51ab90d06ea9edd407b89e0c0a4276ea3698ee5e6a8348a2f9f571c2b7b93f5eab702f1acc3480bbb223e68361fd89a57d1716fc8c99ff43734fc58969d35077f5bb422b859b271b085f41394f28b416565d2f90848216ade3cab7c205ef2f47d8b50b9152a9ba6032322e737089a1e5152387e3437d2190cb9e394bbb6857a1b1ead7a3d7118b0ab8367ba1cc09f910518420a46a18271408121db5dcb0670ed789d537ba3639c530a720ed9f40c023c75b1a8261b6c0192b14843252cb8d713c8736b34daacfa235c9a51468dbaa6f2e4507711344b5a722ae46a70e683c42a9056ecac5d143f9929006bb168ff2ac983ca8b1d99cfc1c8cd919b282eb921eafab2a778b227968f77ec885077ceb7bb5fa13884b6a4bac782b31f250569e0671396b780e810e4a34416166c18c4204ac4124c1020064a257c32369c892420510811f28872d59cf8db48f2a1510a5895a09c008be695699a4845210777146b56093d36960d6c36860cec578de3688bf338a28118a67833f5c4c7d93b8867d93ea7aa99a3743434d236d786cd8e617791bc5452c88e70f1189d5004e17146f3c69c60682c11e78b06b2c0815bb889a17a15eb1d985b601e6c04604cce34b13d82a328f61c2dddaaa25fd9ae0dc83962c0887e392a25c8657d61cc2ffc980d4cc4c9557e7dec446828b03e8bc9a1355dc32b1c06d504cf613235b6b9b1b04c0ed550545bc37e7000a2366786da49d637ceb5c4273041706597236be0a7213cb0394282aa998411e1236ab964a7998055a183dcc4ce765b8756760fff965d2b7c5adc272ef1d3b214b4ac9b543e0f24876e773edc54c105892cd882848fcb039e5223d0c68fa204cfdb793c5ee56659932cab213cd4eb18fa4b045103a1e865b0c567574e523be27974b08adec6d539f37479c61fe8d8c48f62011fbd5a1c10713d42a00a79ae7672e5e321872971f24ff71ed754178d6336b817736cbc5f7b1dd6eef5fe6332fb1a598f3871e5470d440fd2ea631da28a +ciphertext: c2ae583a3b4928851e1ceac877a2b061b9ce589c4a2eb6ddcb36e3621e558ab8ff4645e43144e8b58368c151f7eac2300b060e1e7a30718f96edb79aa71acfb804e3013cdbf19e10549594a37396e364c01f0377f675f4866c4be24a2cc513f07edb6ab0c205efe71eea5d9517c39f897ff4345f63a3c88c258582a4747a744c2330394efcff592ac8df852a7d9ff5d7ba994ea7935075a17bff2626849f1ef4b9097008753b814298c6d9603e7505cc0ca7bd69346edae4e9a360fbef3fd8f7b6d604c22677198578a52fd6f5e67230dd792ed9980bacce91e50214c58a2ac1e43f17e8f57670040a7fb86242a2e9fa63d8530a9fdd2059d690b994673027577db5740c8b1089deeea7bac8c2c658f77235cd9f021bd04d38c94c091cba130060850e8743dfec89b6ec2beb45f21a12bccaa3fc0cc130ca99befb6f14584f3a836f56d8ceccbf9f2e51a2254bd2621bdb7fa1829918fe49fe16a95c6d49c2a3508de93bae8a1ae832620e3929382a1c3ae8bc940df65dca1d7f7dbafa3b764422d07a8b3e5d7c0071aa20c36c87c624148d158e0ef3bf8edb698408cdead41dd99d76b2ef8dabfc2cc8331483db9f6c2a7053c1df415c7621bb3cf9ac8370bcbbc8b9305433e2b32ef8bebf615ffc1987879e3ba5bb3a6c57d42896d30cbbe63652c247c47002b879864ec0ae1e79477a5d7174ab3d10e03aa1eaf3688a287d0f0b57c923d2d3b63bc744f922bbbe6d7755beb6c4be7966034cbc917edd85d07a3a725c8e8fb0373582278a0ff79cfd0260138c7c1c890b7171ac99f7377f1f7ceed581d30700b70a9198dca6bf5406fd9e7b04ce809261a3dd0cc32e1e4c92ade1de79413e3616e371fc3a1530c85b687e93e326b98fc767b81c7409f88ff44647a6fa63a3d195b8733f2e13097502b1b712039a59cae990013251564d3421ec1ff48b07fcd5cfbb089210ece5f9841cad8f188b5774a769a8a8eb43c2e122db423630777ab36fb68443a72a76ebd9db6475765678d94150acd6a788f08f243879c8cc9ac27e766a631bffc106444e2f2faa91b5cc5b09cacc8a9f179200c81561c078554c9feb8aa018173b966349100f3499b1986875726ecbfb48abae2d2c205ace430e350a28db81f90d0c7b23526cd2809b721f34c0b46a1a078be7e2a3cea00996495c99911cfd759d6b0c7c6154b20a977e4a8aa7237bafd2f55c590ee6c85ea595d661d44d32f222ecc479305726f6347d58fe100141edacdd9b3cdf01785f6830b80db7478885201cbb445a1385877e0b5020a2acb849d1cf379002ee78d275f37cd518695ecb6a653eb1c1310d3fc5584e6ec663c495dac1dfff668cd35a4ba78f34cec527e4e6e81a3a9f78274729049b2f6713968ed0ba237f4c0d197d0e7d06447ca3dcb3c13e8feeb14fb68e1cc206fbb8e94fb6190a56669cb901dbe770f9b3a2b6497e1346d0ef60acf9e2c0ae082fb364b9ce7912abfdbf300f3896057a130c7cc089ba3fecb416cc40ce3149599a68aca244b38bc605 +result: pass +shared_secret: d92f866a744d0af51c8c2ba7b1fdf816e0334bff45182cabdfc722d75f8140c4 + +# Official test vector 33, seed: "4635dc5bb92ef98cdb6220df0dd717c7f8158375eaa2b78fc3f0b58e9c9653e92684cad3461d9158a481da3d14694c44" +private_key: c2bcc42efa0baf63bae062a1b1322114519cc504048ff26ee73b208d659518a286dc411c3097293d79bfe04790f8b87c1dca42059c447ca5a382733c27550b41a367e19175e084c49b9bc5b8d1ace0eb4ef2b220f187929171a10d5a9a46c8b89ccba3b2435720780f6851b01cb06ef5127100c4ca44c6188aa3af8e875b85317f47797d6d699e6d619441b26fee871863392ff455413ea78d53852d5b19361ce82432410adc6ba90793cd3330444b82a06da38a131a1ca91756848ca59e200c86001c21d19a7b5a40692a979bd351ff140276f176c9f189e3499d067cb054f9a5725236abba148cf05a539675331352834ca583b8029c764ebe829cbeb934ba76bf3e75a1a2b0a65b879cb0b881dda38487558adec31029783ba7ccc94ac879690049452724c3073106790748d57102236f4e9cc4159a14a042cc4c6986ed5c4027b28053d673f42811b4e54fd62507115b990849a9c3ea6153b405b6c73f27f6755db5c489761da376ca05031e027b6a34b12117ab8cdd1965cb958e6e0a7a8f9b8a780b0d06625ae7b8b5d2e97510c3c8a3b010b46506db23ad99f509d3342df563c2ccd951a7f0446d582ccc872aac034a27a90822506af8acc35f321bced03f1dbba19507c17688965b59176563088cd44dfcbca8a60baff382b15f812768c41d3aa6227c760e78fbc5e8191b01e697104164d8c1bdd2133aa222886263a573cb3d18743ebaf7abc486c5ad24cdd770250ff860acf05a88cb464088cf23c82f9a191833a780ef44bbf5a06cf1442fcffa547ffb354c8476c0b8135c6abff733c30f38a3ff331a836492ba26c668b679da54463b68573d566de97a2b4a53cf9621a6a5a7493ff190b5c9a7ea63019fd1c3a4dbc395d0b254c80f7b5668e6074fb0bccbab9811010b1c42d55982928d604ac9f3b5c0a3888cbce54cf0e1ae0c9914fb5474ec29492cd1bef2537c4e3837ffabb058993c3fd11253e87e15e84451269b6a48911ef15e4f82606a475cacf420ed6796ac04af07633b6ea63af927c611b07dd932bd0ce852c4b785f7348fe2906eafc76c3df8706735813ff796ae51837c198e2eeccbd0a64b45254209882351740fb6414363976ddbe5c302a29dcd832270732e2c6abea1969e8b17ce2b1807aaf2485e6b07e3a7419b5019b8172a3ea0b7907a70589a88cde16d1b043d7985860f623b95645ca1921ac8109870758016a5bdf37acaa273c18b6944d0911a0d255b4f9580e3b50383f93bb7871f3fc2b280f2871b1c17b2c74b9368773ab747ec2b87209910cfa859243b7a75288c163ba025fb667025433b12c471e7c9642c4ab105413e0641d7e961b3fa462ec797d6a9cec7ab1ef6a64b5d5869c4e6c3ec884afb87b2a8711a46014dad830fcc195dcc5b966252c5a350561b0359efd07df9a4b4bfc39ae6441cd70b57a4718d55a0bfd8f979c0d01e31787afbb1a8c2a87e5a7b70d8976ae4814950d00e998927039111eda21993c17fb107034faa658617568350a48dc4bb3b124b032b35ede2ba312162b57067ab245533177dae67894349327663c329c2a752002326b18cc60b1cd1098968d18168bbbcab459f4a4c18f63a7dd0e9ca68f43a6592484f27944614c35d121bf2390402bc93797055936a2d49699cdeec2f29413403aa1024d802d97c54aa316707c26a0b432821f63cd89a87f769597cec8356c2c399d3a34115cca89b9df6a55e4556a3b2150b51907ce67b860f697a65b199b370691fdcb31cf7937d1524bef41a0732cfdf464175c95d9092176ce52814d3a9231114cc31718755ccd3a7b3fe69b4290175dc440cd38c69faecb190ca684fb1001b5308fb4c1ff6a55b4be8814d602ec59c2deed654c93a45d55a3e020800e98aa786c76fcf33cea3a7bdbffa5037a171044b1b74d6094d1a3b606009b4fb0f060b6dd1d29ae67ab90c90c25db895c9515fe0a17bdd69c6773518a532ae8ac731e32155500204dae2c9284cc16f61b5a9e48334859357506e2c391d1bd38865ea489e492d8b847a6a50ba074320fa32074d89894324a705dba4e1847a5059645c77063809cbf3cb0555b6be4069c77b10a6c6f67ae1e7c09d603e87a34acd3b814d7b4798dc05acba65220289772abdbd89403e698f3556511e152bc0f77509dc36803b57d08129951ac44ecc49f43b7cfe8436baa8b5376999f6442293352e76ac592b95804217817ad5a75a76caa72172df9c69da4c170e937a69d93f12c7b533d4bce41b34d0cc8a1c969947db2c21a960d975ac029280ecbb527654a42385576286915d4b8f3fd163f0cb280736bee89786fa277c8487b0820416985855a95a10647059cf34c08915985c32321b5b8b45a468cd4253c662847eea36fb238098f059630cac83aa70cc9596cc1a0406e993b737c236e78cfbea1191d60fc6428fe7090997f1ab41c13e0c57a256a813bc559ad1e6ad10dc3cf43a64dae2955f03b46a09ac6ee30326d95d6ca8b80e61aab77579c017a1906279ac09766bd8a1b40b24d8bc4deefaab47f9c14a8441eb413dbd718e5122ae7beb94f526a31bda25d893a544670d994530d3c6ca29879085870f6d54192b1a7fd63193c7423be4867d2c134683ba25f9240e0fa2a96b47c5ac05b541c2980f51557989b3eba42dad002412f462acf75b141c5fc320bdafd3c11be291eafc04d6b5a1d4117c7703c313eaa30477253e938764364b25d859aca263962c5d6d898ada856b70e151dfa41289213acda6cdb5241bc7067bee5cb467c34d2b0a6ded6aa746290ee2e40b7be1294c583aaf415dd03213a3cb2e41f10731823e749acbc53767c12b93d8f32257a54c6a71b2041a167d685f0bf789b94b277f1b60af22c09b639ac72ca25b1c69b855bed6377126999c5708789091cedce768b253ccae981715c8922dc9562ea8a0ba102b02585281b15c7e44339cf630529c1b076106ee2b5c7be0181ce43d397a398c8547da703e2ab47bc15284f4c6a50dcb904ec9c1f60a1aeef38435997871e8501d4832bbb2a3354c70d9579f237427135329cda32573089687d9a9130375bf66ac321113a25a08aa75cb667635455a93eae7a0a6703a2dc0a85637681ecb097f1b16b2b331210b6288b13f5752bb6c731adab30ca051a817099095022892d923f571b8d879c8ddf0ab03145a32298dc6b644b25640d808006e3113accc6a0c1ccb05ec273e6b6559e287539c72d754ba9bc48c915acebb656e3cb7713e9bfc0bb6f311485ebaa078b78a737d81d38d368c220eb0e982fb0bd8a7ed97ed3d1dd05854a6542b24090a680b9aa9d6c65ef31cf1f4f5708affafeb2e398975d12195ec32a8686d0600e45d4a7f54219b0d7a3826d193a51b9156ecf2edd6 +ciphertext: 9741b66dca7f6250ac69e4d8ef7a7cde4421c8442651077d9a1ec366f49aec28e744cc924bd3cb8adb85564aa554a21d9ce485388293780d9a1e047c9da49823436a94461bfe2b4c4ac4d51af950e506c5bd4ca6da9c04262bb2b464b208c3686edfa29a512c2fe88e1de7faaa7176001ecfbe8303d779bb47bf92761e724cf12048708b21ae7dbdcacad7f977bc6a66264b648d7570460532966da05f9d950ce5fad36a9b0ee44e27ad922316833e6a18a8eea01c052a3b49eee2818634fc812c37837f0a09a42e65a5b124aff7f00c3b2e1e48523c643659a70a7651a92fc3f4340c3a5e0257859826f0fc9deab7f56258821d1638dc3ddf5fc1240469e6c7d4ff73d33758f39bea68f95449909551f8cf074b59e9d616657f2a6a336c1f5205e17f533c6b717e674f9774183d18446754d971d038d6cbcc51adc15f3e672fc612628eaeb8d0ee394a8044277b77bd1924046adfe1a5f12d778db4f09b8327497f6960d8a799935c2e9fe637570fe96280dafe0ae466cdf85633f3c926dca5eaffa5033227812aeffca6613138ecf47c1d5f06954b84feb8a580f964b1945448728ed02a0bfb6d7ec93d68eada6e34d7b4c084b36b4ef9dfcb5d7f04d0c10230889fc693303db3b45d4ed85d345ea161619b726de8a594ec59341e225401a0aa26a9937a5659e43d6af3232f985bb973857f88be76693343f34741db8cee47764c0dd96590d3abb71ed5afefc3b347540336a838703f658663c7d39cf338d8a023808bdae67f7adfccfb193e2324ff886218557504ad6dc63c86532a413b19c575001a527366e8d188c94797cc56a1c0b3184eb6b739700c9a36e03c3964ed2eca1de3b5c4d8b71c783ababc95a60e783a53e245fc7a8f6c1e7f0793b6660e250f1bb62ede38abd359b872cb033a434258c0255bb69af3f7529ecb5dbe342ddeac1e841ecb95bc312c8499b757c38d05592fdb5ff04e2b0cbf3ec766e6f6f37e7cb0f250a10fed900ab73eb61028c4e70aa8c9d763cbe9e13deff0fa2b0459962233f4ed514b8b8aec33e39cf7547aaa2b9f796da64c18e2245ed36b4e0d1dd62e3474eb4704016631f778906f4e7f6e9f45537cf8acbbc3df179090c1ec63732e2980abf292ef39cf7b87c320b76f8d6cd8f6141a21c321e72909506ec24d5ce6a46518ec59d22a809d5f54898f2df2270229e658878481a1789a71a94b28a865f5a2a48c18343d79fc850edb10730b7e0b7010631ecd9d24df0a8a1cd6cc8573f23ebc01ca355f44db9550445448d9f48c4f084c4b943a5828038b5753896676e09592eacc26a112da50957b153a23316fa6f4e70a84ac29c0969aa5fa6702ee80f57f18560b7dd4f6c81d0ef12f6735107ceac45a2bd8bd35f76a59c8d1e1859f2b1b13fca5fc58e9289e7f023e4f03bc571cfbc334f53bb23d2af3da31f00f476af0828f8240f71ba607cee6d125d3055a02307197544906ccfbb15ae8778dfba1cbdf33554c98a7c6069b9f3eb0d82316499832a878167ec9b11ddfd1 +result: pass +shared_secret: 53b3b4ce1e75cfe52d22450bfa763d07985dbc585166b4781a7e6542f9bc03e3 + +# Official test vector 34, seed: "5da2c51b4acf488c8bded5e985cc4702e4a7bcb248b5ac18aaba529f7f9cbf30efa776e99f76d5c1686e94f50fb57dae" +private_key: 9ca01438ccaf5ad79f0d253c6d29707c603905b40d1d3b93b269be9072ba04020672ec15ec059d3fa9598edca4f4db3164557b1737a0de750ef5c31572d80c5d82ab52184238c439862492403b1cc06c7efc7b94b41bb1718c6523db1e6f63533db04e4e91c405527a4ea866210731a687ce09d10e5e0945cef0807665bdfd797802092f0b6837d61550a1d481782045c99b7df6e2b9ac95bb44284f472b5ce1636b1b3662d732a82d76517b57ba46fc9bee14511be585cf0a6549584a361b7009a733c9595f01dc6290471e3d656371cb6d63c9bb25a8c5caf03a84f6684af3c7daa48b2850be6c4270412572f0c1ae74613752e6bf6d53c927f110f41922492780ad486de631565e99886a077c209b025a6561ba503599897444642db4750728e09d3ea6498d236153a743744217df5400876690e393b0f3e2a481c31b52d605cffa140651ceb93c1189aaa372e906a14b684bab42c82b2071133cc31892048c1ad57ab99a00680e03287516141c281d2e1978b44c84595a59e13647f11623ee2b822a36b4f41b8a153a3dcf6b6daa97b9240b25813343561750ab7abf17816d76616879e09668b9c277d1cdbad74a5e429074c07a3394ce72a99af63010be35611d296348a163cc2b412eba4873988ac341566d1c2e60191dc9603c62f058391392494976e073760c0a9fe058564d0334a14a4d8e9b41c2e7226842aee7dc263f35b47619c99ce66f6a546be0e716f8a61830c23f37f152607032d34a6ae3501a00818bca04cb9b7145673917b9252f449a7463565662513f92a5ad5bd4bdc6d63c7d7866019c0454956b92595efce15c900b6d60db94ece8c2f4bc7fd52240cda936a5ea069980837c32c777f60b2a5bbc41a540c0394a3ed53bf34b37d8e7627979cd52fba35b144df35cc975209f232a0d24000c826cb54d365d74182631a326ba0674b86b1af79a169ba6361d30737840bcc5f3798a9c5439541f6e036abefaa66a44a5d017855b48bab216170db6489d74a7acd5339e43ba3b6bb6d1411add611735b9083c75b5111b903965a4b56b4b27585e9670b0fa2c5ee631b6db0acd324710ece9a429c83b76bc417a087b08d989a44b3d9cd1217d835a12c62a437a34dd1568e25c6db41c4c98d0bb7cf7b12be2152c361c1a881b409730c4a9b82498245a8141a903c88cc7aef187628c226fa3ba83d2453ca397290a0cb7ead61047bc4d4f36cd6d70200a1a4139505e3a86885bd61cea052bcdd52a1cf33ff2411f4b9c91bccb7142c6657db694031649bfb8800885bb076a0eab3921e53b40c1b075677124b0187969db8384244f63c6936aac3f6770b9ede5c7129a8e55d46ad5d8636c80082c47611b5c3ad3b814db17157df41585e68f5ef027e9537d3375cf7df44bc807a7e88b8b9b083452a35a6a5844eaf3c4afdb3789806d658276c4a18361aabfe743c67b2c626f1cbb2a8cccee295e6dc7a4e695b205d4980151a89e404a2a1940b58854a7e12e0d221fca36592044492094619ebc7783dc1a12d8a6bdb95f697514f214a7707949c5e6ca4ab227800554d77639b9d2862bfc27bb686c701b0839402a33a60e0c253e32393e6a1c45003140d2b7cd56f34a39b95d90d51e8cecb49dc41a37e866c8fa1bf723c3e3815b1f388f63d791fe0cb8507020e19125bf0ba753fa89c19180a7505e15ab6c44e32f70499df5cb106f85bcc5dc4f20d9660c17307de05bc1eb6bdcebc52727ca3544772cc56a08b30c0c54a847b28387808a1747a23f6460054c582b4ca1e09691c64615a6ba3f89a05a18eccea06b550241047c1807f3323dec674f17056d71b7bea906463efaa0fa50b051723e0cd66cc7587df4b58d49fb029fda6e2e507d637ca7d489971d897b09148a6a2b47d3b4bc3a4ac0715b3abde096bfd8622ca24141683771ccad1094595b20c8af004d54873b0d42977886314fc889e5804474005527170c49882ca89648d24ba29cd30a7c2868f287345f4926f1141531d3a53cf68c8662247d47348cb1a102613ab236b67bb9a7cce47e794096c0a93d54f743cda16ea09c8d87c43e4a1b2cd9b0b5ea711f30b39812ca44da20b02cb4c8fe12343896ae6eb838ac648acb8bc8e887ac69602e7d81263315373029b2d6713705935a43177b9f9888115202ecb1a60e433d8de2bb42d235135224c7f795d342466b4c5bb8bc93931116479171800b717c033a304bc619d2a79a687e005d6215fb1e76ab67d8b46c72857a46d753674a7ef3962c90f2b62f51458204b71d95734533875819a495360ecc12b66005330593456c516ead7b3c942688a822bf0d92bf849bab6068480a0b0b4b8c3a451007dc2a733de7b51d835e5b7900ac836fbdf13a9ee82b34ccacdf6b8f4cd0594c80473040b633b7ceaa091259a21c5c881602c146e4444e1e48800a189239241813c13b724a02e6e7a70834493f794ae7991bbf1b60d4c0084c213471eb3598079adf95004942176f297ad3d55b5cfac5a3b385679ca6af26217ad8309547a0738328bc1a519712ba545ca739e8c253a65394817aa6874e432a95e5f35aa045cca1fc1c7bf467424a8d498274646c05c15b176c8a69f90a0a524b6e4b6053979499e7526ac66830d28b28ca2c6dc4061b1546a4e8d7348416c8a8fcbc0779c51ce855dfc54d94d74bee674bbc383adb248c07eb8889b0b44937356906a61b1074362754440856bb26b2fa906ebbb94ccc943fb39c00292843ed501f5f673762e3afbd7179e41835208700fef233793c0850c5b48499afed371e56e5a92a4109662247b72338db4769f9849f9516266acb133af5666b18131ed347454250cb04528c91b8334c2f5b3401cfb28e45824e73c1b6854b330c47c443d931b9e5b139f31b25d4458ac53a32025d49bb5d1a89b73bf930c74c233bba7afe30239a41587985726fa09d0a7a2ab19559ed380d9eec34b5fa83b73813a763beab0a1f7df5b87962709f255256a36800b94062d3af90990b2a43251ad9b0e400bbaa4a306520443ecc8cf45613a8fc1c61e6312cfa02d23c1547a69cfe43660d987a0210cf60965fca77c850503416c7c18a37bc10ca47f517abfcdc018ffb538f474404917dd65c8a680a667b1762b5958e43547fca1aa0da8907d7d3a25b430724477eb2844e54f35ae8f27598d568d413914bf66b70e37ddbfb7df01c08e1310932ba90ac2287187b022dc659c83b9f554871ae4aaeba7ac76f1254f174493d31eda27def0331de8e68f7b1568c4c8919e4de7a5005ce152fef9c8c88ec9e6fe12a1e2d742dcaf56c585651ed6edce4f410aca0fc83275b5acb19daeb149d248c0a21ea0bb6d6f56f12300e8584d8e9a34e0e6f52227281151ae4c305fb8f +ciphertext: 70fa89e37eb5689eb2b51fe7d341fe3f1e80e967d0fc12c5f7fa1b8043d02752df88cc6c54964e517fb1facae8ae9b8da1941266c4744e2fbe3a12a2cbc729ed1431c4bb333a61f0daf5ad7231ec741a9fac9a206d15c5e02ba5506a8f99a4ade752738d8ccb744d1635f609d4dfdfc54fcfa5b337ee36c93cb35ed056924cbb768dd089871663c471cdc52da3ef4f61476b9e600215cc248ebb6ff3a0ea7f410bd20f9dbaa1045b46b998caf7140e96468e5e7349fb0ed37eeb2ee46f352ee3dc2c074e258b11cec9782a1f475a2a0800f50c2e3fdb819d85f6cdb392f471f7e13cc5d2315d2a9ece5450758c2c8d83b79825dba1b230db7841fb3a6d7aa86fa08c5744c976a83e67d184b5289987d57990f8b7d38ced91410c49667c1398222cc7bb176808fd19f525102ce7a682d6bde33c91edc9bfd6844962731f1f6e1c24007e3e15f2e1b164616c1261c56032bcaaecb933dd653a6a2debe9649e0d4f3cf849ad6dfdc5d1ec65e2a04d0bd5fa5460e714bb5f8f68d2a8ec3f4470e55eeca2e879af6424340ad6ce9149f9c7f345c0d417884ea8d9f918f138aacdbb78dc5222db2b8357b3d685a633c26d14c75feba0734dcf404d29f6c057d8f076262d82ac513f8730a0d55fe8d59de174a34f697366c08569744c165631961fdc637ef3ebcf572f4b8517ec51e57a8f94637dab7130d4f7b976d16d933658c0b161404f74cff2745a719ab56e32a1b5912c8016c1f80523dcadbf9b8d5986aeeaa5251035e2d93344ec7284ed7baab5a083ef365cc61ae01f77a4b64f819eb5526172e20c39f85bd0c8eded7c20e0a8dfe3faf8d1f2834f2c813e4030899ef222fad3c1a91a9bacd7d8eac4b6d9cfcbc06e160b0e81082bea66aa34f7f76e2e6213405415e57854690243eba8f016e6caa73078b59e3e7359a15bb3f1aa096a974260ecd74524a582cd0b9db891969d7c17a2768decfa0ba0e49f57a54709d767e4e24851c719749748ebb8db80733f07460f4d00e3ce8474551aca82d148adc28cd2b8f0e61a5731bdc81cd2b79e4097a680edb6131a70a285a46d1a020c38e2f02a08bd59cd07767566f6e930e473d0e999b37bf546faa102625048db6be64c1cb94757dca3e739fdae0dae257d91a4ec2d5a5c418ae340ede0b6114d9cad63a39cbb64f85eccac201419bc2430271934f53113682586b307fa7f12f0a1ed4c507c4229cf7a4d27853c9c41fdb6286750b50b11d73fa0eca184b95ec42a4545e5cdd5c6d15d9ad02e6535e3ac87084bdbe1fb35f031ef5960f867982bc34bf7c5543c2f6d7be142082c91867a0ed7c35bea543a60bf12e25879326690a1cbf76f3a80ed8b0eb229ae70a665823363b87c044eb177d9c1ac3f87edbe0ee6329f8bb39cbe5417044371951ed3f9ef27b7088ebb97b5b6cf13a51fc08bd09143fdec693a9009987b424f0a0db914e891e880c16ca40bd05be1da299e9ec17762afcf808772875e3516050e4313ea66aaf8fa7e350a864cf9a73b7139fed5a8238224 +result: pass +shared_secret: e7165b66834d919f8c8737c7b4df17a0668c57a87b821af78fe68cbea325aab6 + +# Official test vector 35, seed: "4d2239e84b052109a78dbab6d80c51a86d38248105970476b74a0b78b9cfab6283e30d5a406fae1c7f54f8bae1110ee4" +private_key: 7079b0361596d968aeaac085c8f649ef02a20b947efa34800067938ff753bc0aa132d1a51944634ba6308e64848b60cf01ac01a7a13c5ac5763f2a07da294d955b5044f2b46e2b6f51d501c3949e32a64bf7ab5b6435986a1719812bcdba766380a0601c807ddb1a0c532017c0540b56e82c63da8276e665d0c4418101af9e07092a48422c960f7a818cb266141ce16f76dba6973b5da07449a2b5cd3e20650d753c044787a6154257785aa738418254281298c272273ee880099772c5a8d0491eba4930280f75664d6156928967c2f855053b63aca1141b8fb3c8e7720c0bd8c17d18a2c3a73902d6711c5ac31110a4008d920ef9c6cf918d0b457cc2373229516f2f0a9c70b91fd640c2959a3d95634736910c840b173fc4565912a332914bc4c6251483691ed7aba7906693eb54f36794bb0777e5b45f32756ea6889d6fb75c84845d99a5458b024257a6210c657555ab7cdb802351e1016213636c3b37af4b57aea9cdc5a336fe2b987fa5994c991c5b59aeda80a5dc1639a5dbc994e330f710752af651b11a2be27c57413704c0685973c67f969098383b341747ad8849b0d86715a2a296f0321f2e9c72b69431d4253970f25d653ccc2bf72d617bb861ac66781576a6f7aa70953d6d3c40dd659a373a1d7be285ace7c2e7c754d42c780ac5a8e9f7beac93610b9c56c64b28703b63a1684a88d76576743b650178c79b209d28a616d79ad68092b5b0cab578c4af895aaa20455000a07a9cb4bd57c04dc5ad159488b70a289f229e87552bbb9aa1f24aab37099d0db07e9ce14f500773d7326103405f5a516e0240647f556001d6cf77924c2eb3c546a25aa10a80bbb20d09faaa6115020e988a85093f2e15447b536b6c610776403afab7037b795a7fc93eab9639f400a383454e10a591ac0ca3ab344ca0892a022532bd79ae558710451175134801106c615e47ac6b333b1ff430a1d2a0b8230afca93d65e83049f01d00ad5e795902b8ec7dc496268584cc90bb8c88148bc5082b74e48b1fc2116d9033bd342b53215aeeea5788447c0c50b567b88888841b9d8c9e9488ba2a4a23a3f913e00631ac784f13c858e5b49b920b428cd24cd1ecafe553acd95982af5b8b8b00bcb1074f6ae52ea7eb34cb4482d4679efc337eab910d78210b94f7b5ef150814c01459c0154d67493fa276dbab403950a609b23d1fd37f23e6c40be57c2b9bac82d9923ae3cae126be2c0c54eb88c9e0307402971543b58b67d21760590c818b4c71855fe90080696644e074bf2a45237f037565e800e071abd930abbe6b6e4fcb8774aac945898ee8b74911726e316568068a1c545ca5e75c02c2b2872d478605341ee5b8b914690d9b0938940540a595744cd8bae7483d39d1511344ae19bc99fe5b5180f22c032b6bbe67bd507c6a9a22c2e19a8ea2cbc5436a8b307a9e69d237076a0fa8d52df9852205c4592461c252542c95e2847651011e1233834508a8b7b3d09c833e8837150ba67405ba5d651075e39590d74ead502157253a703c2d460cc21ef173e197200aa85e497c9e6989996cf2c29320bec0b671133bce293268fa9b4ee48c31c9957dd2319385301c2ba97338c99e33d828119174e1696955c4bc38dc838761a183d31e38bc21fd2b955d9002ac69ad96c03822fb4283c4216e93b96d86bbf81888b68b1e67741d4fc8af15d4642a7b65d7b408ec711055826bf634557c8a7ce4a32384592f3c5881aa530213c2435141505a8c0918186c1508ab11101b09397d82b31c85ab64f4bb38947726d2c717362858a0a3656487b0deaa38c8109e5fd061496a695581347d52aa7ed71c20d8a613bc54e8a49a92ebceab993b0fa81de448c156550aae181a537c38638c6320abaa08c50b7b54211dbc8124a487eff2b545ca3db8a07be7674b51a95efd08c4421cbf2aeb8cd92383851a044985aa9a062bf5267382db45519bbd747852ed1a590ca3a89602a6c65cc06c856e22484244fa15b928b13b91736b1680e18cb1f76a7209b76754076db872295ec76e246b1f58f80fe0610372938393288c85b2b2f2107fc39c7d805678e68a38e3e57c30ecb650dc15468674cc54aa8aaa424b5060a03bae4d74c8a43c951e6b53b2c8b1502459868a1b03a5c1395c1b10551c28a6756d251e1916c24ba33792d74eb88a5c84078f60c612beb4a7d94bca27e3377e53442284c395ecc235309d1281c53964bd34a067f225829e5cbfaed47da9e393895aa82a67ab5b44a92d8423bcb59265e73b84f549927427e9295acc8694d77020d0e4342d3c784b121250140db1c3bd38806351416c8f86b4abfc7a14911bc865baaf867f54e92f935b044b60bd5343c5fc9b2d1dc68735baa31ce155e37c1ed0c85162d2ae3492c44c29343b50351c64747f9765b6f9306bbb3e543334c987c9a1c2a5783a576ce94b8f10bc3539cd55f30b0cca01a5985eb5993d35b8cbb136bd769b13f0c5c2d40b34335a52bd34ab04f9cf3f6c313b6c5b9ef879c10c1e1b249cba2580f7da8bb06c003db8718f318979e358292b881f9ccf984c525b61a34f6681197a7834913230627b56388ea26cce0569680c968b31aaa97710c9b2cc019771a57f8b5739554e45048d59610ba990b2e1967648d3c87410aff7981a57e2bcce971b912c2bf633bb8ea55314f3327d3b4fcde33aa1e235e6eb603caa19ba83c98eea4196c78a80e8b5680227caf06ebb22042e9a5c63974650fbcb1531404c6862710215012671093911d67027d491a916539a1b84b3c966b89ed3b1e9980769267827731ece44826a3a0bfcf037d9fbb9bab4b85ad668fd1573c0e9b227fb5ad32c948037384145188b17620eb91cf6a6318f331cae3800164ccd138c8c75a3071a7c0166f5156d74171b5b854c0783f9905b88950c23ca8835e530c4037260500be9f00510b5357fd1b80b09aa06b7126ecc8bdb709e3e698761f756ad0624280778c0ca140c426f91c76f81b96cef425403c95bc00852359b638a8a75b3fcbea47990e002b346d5a9481083c4336d02191326f6ab5c5777f622cd4819bd1187cc6099cb7968474ed93c0b830bb301314551970b86a25da05dce97ab5db744c78536712c752d02206c8585285268c5842491f92636682b223b6bddd39c6070bfd74aae3f8ab1fbc357136028aa3542f006cfbe429001377d2112c5ae3805244b865ea863257aa671d0b146d04b89b233f70768a373043a59b9060b0943f56865e6a91bcdc54402574a0f1c143dd36948d781d2f3c44e2f08b52e339b6e1cb330c784bb2ca3538979b24246c2644907484719c531ea39f13c5a34046f8e5cc31646460817a0fce5836bdfe124a7448e7adf7b8ecc2652ac6d280e986682df71 +ciphertext: 8a123f400b8819e4a011a98e2ad172d55caa7112312c89312463d87f29007d0f2bc26bbec2154e7bc61de53f7cf971d2653d7f6bf0ef3c3a41f3ebc81a007fec27b2071a12e5bc55cbe4b1e74ee9847ae6ebf5c19f67989d07cae375209b78ae35b5fd1a064d8436db5cfb6f1acab16b1c9e49de8ab7615b8205a521c8fd597dedcfa9380fbe458be51760d097867e180a772ef77d6e2014be9e10cda64d88f7a8442bac3f736a2cdf37fc6255a09012e4f4a42a1ace90d99db9f85b9b9689698374d0fae43afc4dde391ddd631e90e85bc63616459f44e4fa6225efac89a2f3bb802c2fdc975405e09c33cfbd52f9a5b853ac7ff30723eeebcc626e46a70ae671f490c32bb3e9d5e32404efff4663bde8e5fa3f9868569d99abdb1e47a11e37e86306e4ed59f0a4896ba667ff57cc1fb140266239f0c1942e4f274bbd359042a4c377226fe963f88079953cba6f338efa8ee2c0f68ccbfad1f78eea6130ba4ad1fc7ce65b3f592eb322deb9729975ffcb885208c73d9dbc51c29544622de87a20991852a121721340c0ee5ffebc09fdebe504e0bb4151f4c59cd24f76eedd3a93f8fd8d6758aea16cf041a3f504085d21e806b2e727526d49dfebeab1339bddd4770fb1c92d3e109a57a204f81556539872b536426faebfa0e80c48531db54573af4d1b026314fd5e0e4665c61eef611dec983c285b479d8982d05ca59efb6128d38be68fe8812469cdb652a3d0bf883396cd57c173cba03e56566f1c7008523c614435c8d734b5c9772b2ce8e806824a1fcc7f20587e6051d46757d3334a345c97095522acf713abd05326d07dc1d2a845540c6a5ecd0b4f3805d39c4cd4d4f07f92806c14e6183eba32a5290a7450cb7630c3fe0e75ac0e9b875a949c4d3ba5cb8c035aaeaa364051a59c446e98b155e8b17ce8eaaa39fd8ae46d03b1b7cc53167d980366437082e5c072b029341be639297a9ba8ca2b2c521c932bdf5c687c030f575e80233f3f802c6d72b040f451771b9005a8f4da08b153dbcebf1e9bf14099ae15245d408f42e3196a28b6ae8ab6f242cdb7f23b0a67e0ecbc9756b38a5c32c40ecc120a229d4ef618eead86a39f5cd70ec99ac88fac2ed092c0601d153ae4d24093d66d910067ea368bbf4f6720e874282320614dde2352039d6a40b394c5a2d15fa00030cabbbeef0792d0d3cb7dd5dbd76dcf411ceea06948c5dc42e7a21e89c78f6dcc03688fabb2dbee392eb4aecb1988cad46a4505785758b762865ca03bd7dfea22fc19e83e584899b1aee47f509bacf994621e910447f89816065b3b976da272973a5a4b9acdf9087f2fd69b962f743e0f2bbc958c8d832f94400703662e2ea538149f413baf7d3e42b50d9d4acd8e2e12a2d7b1914dddd108f0e08d1bc0ef663179ea01b98e476e4e71ca7a54ecc6398666552f6fa6faeb19178c2927741d3de697f273fe5da558a281d245c3b68a25e395dad0c7b1d8ab4d731db6273dd1c535215f130e043ef491dfa4ae25cef994fc538b2259ebe67d +result: pass +shared_secret: 19599e218264837d06839b6cb9a09af3bc4cdc78f7d9c00fe030ee92ba3bd54c + +# Official test vector 36, seed: "ee762f5c9021c36446706a88ef16312f4a12c725cd7afff1484337c91eda8e89f7007f3705747d29907b3fb7500e5074" +private_key: 06f99e63362cf6dccc11a8854b1407ff12142d91a19d0395f3923abff155cb4807aa932e218232dfe932aafa673150bc9e7155794565aaf7375f7195f0c1c35279a51d613c6bc32cde086f61725c28324e9e392d1d3a91b0661f1524592f6772d4e012402c18ea162a3cc36b8f565152dcabe80691ea3b84d9eab83dfc429036676d1109d9e258343b418f840a1c53b47211b55f490202c4659126bcc5f4ce23f2906630026cec8418526efcc02b0feb7728a53a3298232ad37a424b4f980827e24ca9cef26115a100bd224b4a304914c83629049f7e836b8aa539eff61a60fa8154ea97c31259b3c629dc891c027c8e5441b5f164759b13980ee0a5baa71deb08c99e6340419b0f6ec82ee2536231e2634f9307781097f8ba2a22db4412c5bcdf764f0b58bfe176163e1b5667ccc45b39c77b3673ed4c70786a33b5aaafb5d5c12d4077baa3223e2614a7e917c7462f220545fbe9275b1a62a882797e5a96cefbadb309995c9b26747ab33e543b36080c29a4bafe68ae41911aa763a8d90162a1959dfcb7890a394ed40a5340f0b8a89434baeb9414ba460178b2c5db503a28bc8f2a42caaca2fbd6c77d758f30e14bb1075ffdf535fffc76d02ac264787e45340b1dfbbbc4513ff15abd2337b6d4543492160575f44ba1c793c3054bfe767a827875322ca753e200c717c47db1ad47f12ad103c28e9380be2868c8b32f7102c26b977760e67d98109921425611b9878e215494910730956bdc7a015506c45f919071042e921607560560237bba0c3190c759295ad059b7c99ecb62222a54563ba730a7d3a4dde375c9f931cd16c4344552ff984fd6aa9ede0602a840bfcb705e078cc375437d3927455aab6ea3872499b0795df7bfd436cda3368bbbdb990d6ac9d3f637be663e7590055e00558d0177f7c63e7fa292097303d68a34f240a17c7c0b80c5a69004c195d915dcc880acc9cab1db842c14722ea534b865488c41824017cefbaa5c1127aec9e535112764e713ce403c64a6a27662a254836327d5924846dcb646b79de5ac0bdeab9223f36f5c124e595165753656b0110241f6b805b0b30b1b698190b5d4f1ce112c93b4f6a190106c7be120d2dab2995578fe9c08db3bb36c99c2c3f2001c6a269f563edd088f3b50a39d508a67c75889012cc090217b321e99e95f4f310f8db2cacbb853297601895a3430405f828827cf151a83480b4276cb73996fd5d7b357a52573912ade3394c48b7709d50cb8f2381cf50eb0e14bdf5740836138e539a7fa6a4a94339cde3bb71ec34ebae4bf4763ce93d6041f62bd61c81868f81e8b88124e667cc83c0b226157560647996a2581837b75eb59d5a934bde44cb1e664de41184ac480323ca59f624662b17bcbc20424c565385958c99246d2383a9e2000f9b817fc57b7f32513d96ccbb6140510e11e224702893bb891350404f376b0b04a674b2161bc3c68e8901348a9a9d7742aa3a210319dac25a7ea909f2e877728914cbc2332bed4876f5453aeb3365879a0a24244c6172a8d267cdf9c10787740a5852e66e3663a879a35208a07959b9c5997e57a779e8679563caf551a597697473776519f87b0d7e03c1a686d705c55d1b1ab00264fbcf666abba49136b6e6ca0ac8636bb20d305bca62bdef6301aa51899d7341147b72c210afee6a3294a4ac8685b1b6003eafb7e94d91fd958b5c3944129198bf02a2e9491491a2bad9375cd9f184aab285e91c877884b101511775cb31f2a2a3e7337406d7662c8d8c83c1933f0e27b8b2b39b1aa8897440ea5142f22b218c77c664092996e39237f577139014da6da6870d848cf98b006c9633ff138323261e1d042ea645e60813c11f9489714c197607e568c8045f0244ff40fb86634dd469033456604f19255645898181cdb830c1a82c4eb1373ba820515b6a44596342ac8b912c217603cc92b8a2b52caa29972bc95ab334a93307d7b9aee013b22118eabb947b1a23150481fa1e7b9146b9ef5fabe9debc682003eed2534d9614d90466c80a73fab8b94d187a383463e7f6a380d1b34ae5473f58167e97794767a20bce5b6d5dca88b35695e0a2baee03abd55ba0fe768a8254d40836233fab358842675508302a337840167dee53eb3ccb531a7637dd1b9dac9a00432268002165f72a5aad8ccc7131ccdb1c986a7b29bd89311099fa3e9460553900e51560364bf9af461f1487cd9f0adeff5079b07240870c310ac4702e113f68433981242c153c49c43cd93493b52395b5db073ec936f3518b7f6954426b9757476cc1bd0c4ff870a2124a8f8daa3299ac21178235c260a018c169d083cf40842bb6a0f2d407861106b4e752091dacbb85677fabcbe180abdc6235d0e8c34737a5934f431afa670d000166f6c5e4516174a205f4bb6182bb24a54907be5360cb81b5333a937c4e40ff2579b0039c0ba3374664859e376a8515b390bb46acfb54bbd4aa6daab1dfdd44c712b311798c71e162f36f562017821cc96227cc431ffbc3634acc704937187b8200d9bcbb0c25df359c386e740195662ae24cbb24b181a23a2b4cb5e3a767701d3a80f7bb82133be97daa38a706c7e2949ce86587246bd5fabc774956019c2247f5748f0988087159d42b8c6b1aaa398879c77e32b0a5494926588dc537fe1f05a10741fd8814f191cbdc50cb2a0ba1ec053a789396208415c77c18d283510f410a722a187cfc552f63159648317ed696695413ec894ab80f4c106d73933e312996b23f073bdb9625727d8c0ff1818d9f78b91c4a6c33075f9a91b772138cbf6861937c53aca7b535baacd2bceec96223ba7747b4a7d50c36d3cb0297967cc447c3bffbbb723455e421ccfd791c48f8ba558692e2ce278dd351e28d35ec1039f16d8281bc0867d529ffa6544b1663a14b6843fd85feea2b00e3c8b2131bbaab0b2161493caab5464501ff6e30074a372dc6a905b9a1a66b637365b48af4b55e45ac4236781b71b130718941f06c17d84786bf1a033b60da7c6b0d4d385f3f323dbea84c0bb8fa720569d1959473b1af84459c0ec4ef133c0688323fe8503069bc15cbb391ba7041e665f652880ee367c97f34e7230009fc401d7a34b536529ef544233761bd2a01a9da338a215492252906f979290202e5c666bb31a74feb13b05cbbb341076674c02567c80531c5573fc6428b8ceddf3ae84b8bb7018a3ffb02906770c4528c73360a867c2701158927eb5a9fac60a2f401affc4c65198b4a5e1439001d5882496fa682185d21aa4ef95ac3eb5e675c7a4a4426f93b30fe432c2e9744430805aef6b75cf3011ff387e323558212b9d71ed71f044f779238a80dcfd7c992d84b2dffa67493e669243d4fa38c46b090bdf86bc548411 +ciphertext: 4730cd50dd082c8820ede968a7cfab0842f632a65a08757c67f05a01151cebd03e259aa45b446ee30753954b5c86240a0870440dc76badd33119e19a2d487f20499a48202362501ae0a106232ba9ea21b363066ec8886f8518080d736444f30e109c0354f17507e1074f7b608f16e814d76424647921aed1253dacd39e55abfca8ae74b25807cdca3b76d5fdefeb2a717ed54283022c607a22c419e236a971f96f075a7f6e46f07835732c2f9b3b32e722880b5d942c658ac72257dd0ac7cf6bc85ddf096971982a8ea480d8a7629b4b9c060c3ee287695ce0ffe1d26c385c7306044bdaad1c921fee6f93bfaf998b16fe9664a610f806b2ea0e7de8706bc1787ae6018584178893da14fffc1c99f03e8a9f54a2af50b8720f6f79be74dbfdc53324dc94e081a8c438f04a9742c0c2b1162c378a410df2be9d340f0719bca11c78dc23720a23718c1def9c31e96dd8f0d9503e43119b63390cad03fcd3d64a10130538b2cbcc9b786ae5c509b7d754a49e6784a8e66d0b80edc4a62aa5d7a6bf3a015e7df99e4f415f66b5aebb9035ee22255f2bacd84030a5128fdfa3a8343e6f84585eb47d30910f4e05f57e39230478a96f9e10920c0ad90fd32593932637f208c312e33cfa96dc2b7d3650570b7e3846727b5214ffc6c9eeab17e7343d9105a26df4bca08c6a0f28594c708c6281d7f34655370216eef77225b5ed78d4bdc303d5974a6fa92a9a75b12648f57f6f7feb9cfe8449c763138540f97c0339b52aa3c100421ca0094591a4e8a2af4fccef6ecd91b3822893e49f00a46bc53ce23eb05d489a4af115dd71a8e2eca292279b05c143cf877dc4bcce9fe75df54e39741d5d4d6a0aa594b2be511ae748ab03c9edfb8f46d6bf2a214b2d6f3d1da9f73ecfcaf564a231ae7f629b4236b52864366ea34bf23c295a921501db8f92d16c40f9651d8df6318ffc0d6f4b840f27bcc736d2e2494e65e81e1982df9d279440abc8b01108f5c92bc2655fd3d0ab0743baafcb19ac5108ec02e00af9fddb6301d9fccf2dae17152d1c06a43cc69bdce862d0a4f1290fdcfe857017c6e5802dc55c1ce2f999728df46144a55a18e54bcbe982465c8b0077dd93679363b56382a7ad1b8021a296ac90fc5fd403233397ec72d0ab74ce0ea77ca2f39cbdaa5aebc968130aaa519b0b80a141b65b3652824afb69185ad70c99e236af977f56b8e20b8401d13896b20d845270f21ff7ec1c0a86c79e4e15450ac94f18cd62e814a44d076dd7d3868a54412deb45b047aa71a9e596e385fe0cf77afa64c665c81935737e755cbaacf4ede409cbc858d63e32b004138234e294ff7cc01e637c54e719782c75cb95fda6ef4d86aa4e317745678370c76e47ecb77bbefc1a2e92a783c3d64f01f9b6d0bae50d15534bb98885562ddcf9738c9f08b4dcadef59fa856d9090a64627784dc670f03113d29a7f95a7b6162bcee928a5da0da186c7e13ae83e8e1a63bd168c3019aa59bea63cf967e2a17f2b937737c39efdf078273ff00c09f3 +result: pass +shared_secret: dc5f3931026bcedd2f57b65601f683895c365862d28a65356e94049773de2ae0 + +# Official test vector 37, seed: "d882ba69ac8bbc88715f1c6387531f53273a5dab87e66faa8221a7f628d2bdeee1cbc59c0e08d0add84520a3a70c1389" +private_key: 93b888d05aa46698878f187be0da6290127b2cacca5fe508c40a523aa56b923b5325fb7bfe0b3cbff11fefb8c9acf6b1add2a41d265be89baa96989afe97a5a749484d27b8761b6e9cbb2a957676743cc79b22a74bf92ac693bb54a31c4f269e5d00c470630f7c491a708b40bc7160415576db195fe78b3c33140882723387d4af2d120b0fd015b41b5984a8c217e818300831f1556c5489139f216a4ffa5799246e9151790b98c2b907b8cd917f8d981e7dbb760a725a30e34d997774c657cd4d2648e974510511583f15c5f0100872b91d0c1c89c307ab4dc31cde68c364a20712559a7c7c58d6cc0c8feb1645d85436a8188d7c171da14451685591380bc0a5417870645e4c633a2a430f23941c80c92694b8cea6674e97a032c89516397d42e44855b4ab29f484d4e33097754d0fcc672f452be0b3a2b752c2e2a87275aa89e65ca0efd096ec158f591557c7fb1b6e696ef2ba704006b7f6e811f2385dba947fb10c404b79b90e620a842a569dca77f1039b62403787cb36bdc8984c352c48635b552361c77b82eb67abe8ea1db025302a98b9b075a5569243a8725493f07cd025494b5c01cce508d594cd36f473b8416a9e7a8de0a99879c109161ab3adb78d01e1b2ba2809b7266575086cbb2622a4e708733bcaf322420a65873c624dbf1c20a07821a0ec02611a36f4501485a6399a91b888ac547c50120e5070e597a9a6a67f06a2039cd6ccf7246adc0576a3f4457cb9a4c4b46ccd846a77f416961072cfe64a32920851ab1a20555122942b7c3cad5b137f6885b39d66cfc4f5c7c6e63d2d45c8e184467ee336945aaca71442b1508bd9687f40a4b70db764bbf90510526ef1842151c56da153a100fc92efca3539ac6efac23fcd60665263cf435ab34336b08d2023eb147eaa00c5271459b026638b9c18d2d04e3b429ba38053dffa2b1930a7453146e798323dc5c5fda63ab285810dd734b9988691c8445098a2ed96cf2324067fc45d12f118b2726104404c2174097147cc6363c684215a12b4b34b161231331c56fab25f0418f5e55fcd8bc258349524004a7534b99051113efcb310d61556788e187c1f410b6563530d8aa4bd07690234d504b4a9795d8141d56049d8e1c019932d46219124596a64e20658f010724547e8aa25d55c042a8a58de53b10c9c26740812ce6952f765bfe6153e1b43582f5b7af3ab3881ec42b4f80163f89648c622ab625da6b730f47244d2391e32c2bb19da532c726f30772cd90b64f481cad12c86c6166bc6f38fb0f92975b9aa31b8acdbd5bf5e746891a7087849497feb4fa63c28a4836784ac8a6e631055260ebc0b33c5140fd3ecb5d82156f16aab8349411d1192fe578e3d359e22705439317b7df77d08d38e7abc8b146307bda7a7e00b8e0d51836b1ccd35611835755a72a6bcc069165164a1181920af68434bd639fe0764fe07d0b6871ccc617b5958c26763113c9062be342dc5e44fab720a30a44a10aa0458379c9d8719606a564df808e63581820606ba242ae664c4fef748ad311ac4156f597c39f17c93f88a74418b734e0caf607c4f9d72877c925c0f25410f551c2b3860fc26cae2f3a319815a239bc4fd627ded7181869719ce20c5abaccd8889286f2a77b388a58ebb7c53e79619762ae5111b6f352192288128a83202005adcf0b15c0640f2b84d2ed58ee806bd4fa22ad26c5c8eb9a035768951a579f8facd48428e508abecd418617fa5901fbbdacb6b539c148af327823009e86fa49b96c42d8ec5accecc423fc979c475fc9c63696c21d206301e9d54ad1088be167af34c57facc25d4bb49ba5677842e27c1fa666b0659c66dc412de949980ca6a707a0c21976822579a0fb1d697892fc87251354a17f630271cb3b10f5c578777a990361b467c1374897675748f763619e065104a31999a765815ca7a22103f3631879b790a862450c69af8d29c0f9a48e8dda82f2c03c0e12b62484c4ee35002848b030e41dcf1084b1f70d405677a059774e322c7b72265e32810e761d82956cc0194257f31157928b786b6fb6011a130620d2f51678d27de0965465d445e6777660865df9e73bc6858fa8155bf5cb4bf9c23527340c32211009144fe456950694b656a2a30c55647d17cfa1856981867aeb82af63f1525c31cf643b32ea822b2f389ad4255838a2bc2ff850cbbca834c87f9fba1c05ba251acaad9ad99075920653d29d94c399cc4a2e4c7a871e176a275b7ac0a4401d36b35113595d51b92ccb8618f3ca40b4900774a784644973477dd492c66d09ba9b074c3d0347dafa08dbe43a9b890f62a5b9caa996f9e362b9a2103942cb91915ce8e390af54a2578227a9389e922b9c382907853ba05eb13e7f03c079301db2135d95c934da5784cb05b9726a1c1e28b01f5c5edba7a340053ea51c32d0930653f46170025204c0adf94c2075631c55790895495f23ea104a60b88c8b627db4256b6892d1b7886f959a18ac238aea494e45aaefd72056f362e7f34ec5e20e9c9aaf2efa8683970e310390a620264ec1ac3af515c24409ef4a4b99d0725de1506c706303e2848e2904f8c4824260162e5392b5b0595d699357b190e237ce1e3692ed95b7710488ad285c04db243eea475520605cb98b98a1cc893a7f1d7492f038795da03f63a91ec925a914b3c1fd9a3b5a74bea6b6770a5b1400348f7002555ba8c9c95b88cd829eb179472245228c21afa2d39238c76cde000898b718884ac8108c06e81c02f264bb6c9c5c13081c09d431aae78a26d62fbd041f32fbc012d0c83fb9450448cfcdd8cf881036ac096396e311e923478c5a346cf5c930d01c84b04400b38759a18d3ba40e46c8af5f133258f353aaacbfa68b0bfe206bf7fa65b192a4798a0faa68b2574725dfb69ff108b7c155cf77426ef8a776f0455bcea85ffb91a74f7203bdc2a9d0096fe7ab57ebb4cf1dea1ca0c5c4f9e264d2d5a0fb64658bb3b1ccc93ea5814407b6c865bc2b2fa14311ca50016b782716841bf89474c10e182aa51c0416580769312419d1219261a548ef0aad81159e4be73bda9c8903b7a4955456a3a8b405a27c18968901d54f8a0ca16e41aa1d0c128edc33b069a1c1e4b22438beb74a996c8b30c1717f07092c46402b1d9b710c46540ab32f38381c95b7445704461c0589cb427606057c78f911fc72ba38d1b664767df30901b148b1d609601bec3e40e41136ea9edac60f1f097c49906f105c99c4b069d5325baf3e6882dfda254850ba1ae5ca738086b4bb3c91df05c11c1acb67a98dab02b962b6350a9e1314baaa272b6b13db3d1edc9f09d3addf07f6826a3556bf1f135cf64b6403e103afae34da038613e2853bbfc36baafa3c6a95347193f37c +ciphertext: 3f7f9fa76b2379cecbbfad6321d4d1616ae26488263ba56a63acfa042d737d74212b3522f42d3981ce88d95a3de3480c6e5ab26ab2fb12a6a3abbfd75505e1b7aa5b2311cc5d0b8a2dcce7631627efc9d18c571d72622e50be2ab8b9547e1162889febd65313a588def911d4f923d9747e08ba53cc7fd9e56e91e6f4c1d4b9b164a60950286d0026267920c52a33468ee15ee508a24a390a8daafe40fe5249c6a6640354df8a60e9639bd1cfcff471e3fa9baaba6b6bd1d82efea49cf089b4a7e488b5783a8b4f575bce13109fa9d95ae542b1e5c6b5ff4bfcaa17a84424856ebc2ca2d7b5736830cf35909bad723ac2c8096dd79cdb3e642d0c6a21f0b37bdfd72f0f4594bb309f4dd83dbaffb441f3dc9889a6d4132fc7e8b4186fc71d05efac20b3f994e0063575f62b5afa6bfefecaaf19785383b45f265dfc36a0fbddb402811a214e104d7a22f38d26f6505f70f2da88fc6150d914706f699bca9b56457d401b74f248f00221c7cc7dc92989b3cf331be103e4334a7ddeaa17c9f48546c04e7d0663681d1106a8260aeb63f0d9d670b56c00b62235683842294fd2dc934aed767db150f6529eb8f908a3fd7fdefbd02b960c05279da4c7cee95a81b90bae522735cedaefd3aef318107986d1b73977e254c6397b1bba132f52bd7ee7015648745320b8e9955be4be6e7e49b481ada501c814172b47b584dc538f5c6cc2c1fb83e8f8ce6efb68e34e9b15609a42995cfb06c46eb49f0422eb3b7e1a16700fdd9f1d5610a05d3503cf18eadb4c49d9ec571c485402a60c6bca3ba36549934217ed1aa770f6e68189fd81d852ae00d6b1e7f03cbb6e07d010b65a22be0c8228d9279e53ccd3147642d9f9bf57f177af63b332cf9ca0541362dcf20ec19f66b57b4b55292111360a3d8df17e135f4546d920b6997b2da5d42c20768dfccc4d3b813fc8ef8fb4e8c46d4d579e7ed6a94a112b0da4121ce3f0d71676c96f00bbb44b55c302af407eea78fdc94397638645bce49c7b71b0a54bdfba6764bed0961a5d7446898099d8ba071bd0814cdd020880b2b24f1b07ca235a425a7eef0c7fc13b2767884b247b89b1e07f08bb91b49399167b423e77323e8555bc8e5852cbe69b323e70094d7d80dc8442089c87d81fc401a1dd1154ebe49be3a313b8b2e870375e5dc12fd09efaffdaa4104228bfac5a8f2feaf02e6e2e4d786e687d55af881a0970b460c0dfc11861ea4279379540db02b8efaf12279656a876f758a7d1b45217e9290147392aad801413d1f36b3b0e7987adf276ee4591aba78fc994282e4eb85f7f733c4bb96c45912fcb43271274db783ab639edba155370548a0a4cf56cc910c93ba3fee673f6538a61ad5448cd6d43ee8e3b66f023a3b1ce3d6291b29d6b302a967956f9cdb4e09d4d5a91c0665a042df477b7ad48628bbf63ac726adcedad5e10bcb3bee5591ebc3567e2738a0d8048c9a2709bb2d158244c562c82342a5e44abe7fbb4e5ec8345404ae4b7f5260b7ab429e085b0a1ddc13dded2 +result: pass +shared_secret: 7dbfce1fc7d937884e7b3fa7c8eaadb37e1663f77d7c8659b8f43abadf16cba8 + +# Official test vector 38, seed: "6c3aff39f5d097096d882f24717718c8a702382dc4aaffd7629763fda73c163cf084807bbb0c9f600cd31a7135f48aec" +private_key: 7db7cb1612bd434144e3e8c45dbcbd0983a000da3ad94150800c6ba82929366027b9f3213cb2aea2e094ed979a179b95629b885a77b3006d6735f6ade15589f06397ee572a11c9a23e206168d10736e0a073b28240518febc2a88135b290231c78e5afe50a21bba9256280861ef75f0e97336f1b735ac69b0f652bb6d3b46d6520964671a8309df2a2997b36a4430c7f1af27443b869dab0973793a39014614f96b4b0f554737b77481c0d16288183b71dc9794f713098edf87bc947a96f542e2a6c11670401dd475e3214be00c0054c687fd3774263bc9fd3cbb85050a02d53c1cea22c6da3585f743d14984c64046217555f45d9aa7b4944d14cbd3dd69bb520c150453bcf91387a1ca4bf4353b15a9792ea89def5cd09a6658ed57af3cb2d2b1464af2bc28e016379569d7c352ce2d2c350f8c494807a8d239c2b0654bcf2cb866bb35da6289f5505f0059e4351a44810920cc6ac87c224be4902f2f002936c4dc13554ff7588c13a1ab7a12b23c273e7fa5e94b152beccc94e0a74d3580414c60dd2e4806a056235152acbd21e7042a3c3429436a52bdfe45be4247a0d24cbaa1821543bb6d860889933897b85397c94764dc2b1aa94555ff42412377bc6902fdef97295569c8cf1585ad8ab64c124af41a534ea4b2e5b6d76e33dcc5cadd7e376dec13652115e9733c1aec91dc9446fae1702a7420b45f32c719473033925d7996915f40fd1f13d11807811f1c991b0137524acef597686b61c146526564ca162935307cb6fe15606dc660a550c848ea8171c392f5a916738db2d90534a4332c303601d14b98cf5e7cda3009bf50809d194000b10b63c7c718d8299497228932758629b5529610bf56c7a33464b206888228a257eb8a8c149b8a0846df20c84722ca98a458c09ca598d752f8273326f27600c179f1a8cb1e8f14072dbc9866058a0f448a1556531e010582b4672cb9ff873865eac6096f9a4fa0225f4855ff15c7a31968ea1447caba5c295f70d5c7990057751dd91365c4c57b601cf45547153b2258a897bfa5b3d23c00d0be449ce5172fc513141caa315b397d6d77eaa67c6570a60a3b16f90f1087da1196b363ca47b830b4902c23c97b1ac33d464b5293959f1a007e51374b3f016f7bcce7417695dc015ad84b37e07aabbb0630c467206d2471509968f88914fe6bbba9742878632ee6655418535b4e45b5595c90b4ba088541e51a32f4cb920879268f56861dc40bc9f661e8f611288faa6f0c911bdf631de2bc9d53369f2b116a26ab2bff14981fb817a9b4d8ab928fa19a3e1b03f4b89cd459a64521300f5e5ae6ed8125f2544bb039a4f09483a799ebabb8839c4111f45a013276ff79a3ae9e5001ce451a0aaa5e84b185f8747ba35c58a253618a8593d155adfd05a5f755dbee456ffc3883ff715bb42ae09531fd6d88ecbb21d3138223326b8e9362e5382be38e7035701c2f0d72c678b47a79a891487bb3c9c7d6b823231da391b2b3c6751bb66b7a7e326526f3221a3a936ff82a09c07cf33763b3072b93a2426f2508b2b734e184b6f00488f378373209552a4701c43a746e207342e463c4e11bd5ab1b5f2e2b8691057d6162dd66a1bc97ccfac8537fe04b19e38680e8b5f005167b4ccbd4bc2a87c3a98d2b2af18738b8b44b1ff480ad69183c828bd372a4a3ce12ce72867a886733f3bade4144ab55b63be2902aef88ab4e129551540e8390357631233eccf23a0668886b39942c23f902265a84a08b07d11b85c096512c09ac3c82023f23aaf48578bca4b50426713c7e5270980c78c6643ef615c2b6ab57b98111a321e30d8a38b5a376f9a2c793ba196e293fde201ba7261e222080d951b4f249a47da98c2aa4b87e165de574efda9577dc815c847ad269210970975d8322645246cfcfb46a194a9b3cb2b91a20fd9107948d8777d0a14d6187c922a5beed80600991f3040643480286a580e932032a37b8c82833535f721edf44e97397e14931cf7f49201d80b75d650f204bd37416c643ba725d2b3b4f368b033589e01cdc10ccfe264a6efe01ecd3b8e92478bfd7c1abba973459346798007990a9edf57b081c73d699b7a758a6013106597ab803870c24e4c2e0d649dea9bc0e0fbc742571b7b6bcca714881db2597c3a45cf0794022b58985a61d582aa59b17e9c567e4b4268976943982705f389566f53c49526ab6c210f4e694544d307d2c8612d1ccc23658127e8b071e58136734082616ed011397bb781896953c73b5127b28437f38c27d663b05745d3fa37e9c2a07dba767f0859e7a30e9d48cce5f37632e817060ca46633c9b4f6735c3bcbb9185abf39ba9ad600718c6fb84b7c7b867b5e5c51c0b0cdb03cc83b49568a4a02ad831fc93157a4e5010ba81c0b6bb34afb908a77b2e8d106f752c39ac1a00a9467d58484bd273733947a619439576a98b4360811c97e73431901978d295148bb991433ac72b4cc3e5cac2a8f68ac9d9a3f5d53889343af7e6b02316831b7208939a88e613c0ec5d07861099488b08deaeb2cd295b6977c7c9b2630cdaa5b0a93ab7d98728b3ccec979b869d506b9c679ecb673b7d83df908aa58603275a36291ca60fb717b74406ec852b802eacf4ec3c2533315240624b5b7a8ec960ebeb04d970cb815fb059c458d02254fe8564f154a8c240086fd98ab6a4a4510fab5205a99ab873f3ec29b603a660061b8eb803b6e71740ef174db09bd6c3447197765a0907d31fb1635435601b0a8337972263857f301ae5cf56a23dccfa392020bc84e79aa6a37450389a616f6e626e001592f7a71fd00ad82f3ac9d1979e83955bcd1248e7c9f5245a22bd26479caca02f70303b8c978187f102bb949b7a709e94fc2069489601c2752222da41090578edfc1083e0a8bc9110b0e64623e320f0bc56c4f2b2bef38452ac7c2e17c5a72166a48d55ce5d3abca1a98d6eacf734249e8820e29721931faaebc3abc1a7453b5b01b52a27284995df4f07a3827bd9567cc31b2bb08825046226e059b52bf8b0f864793926b461574b73198b6b4a128f19607bf1205380127e6597ea4b099eba13b38fa376177cf8d090881a20164d804320469b15988759025f5089d7b98675d554ce4714c124c1c30775cff79229b1b99e4206cbf28bab4017077d4721c263542ea1742ac45cc500d327a3da9c46309ba09742305b25390c50abae20b6e8c8b3ae0208aade68d9e2004bd0c26d21c8096cb97a1a2ab02548ab8f1be5fdea37e49857c092ebd421eabeaf7d76beea2feb7cff7d2376a329549c153354b0187e658306a0c860b1fe6ed14686ca77d37b7c82d66ff62149406b762d7033947ae42ca53522a65fbafe18d3bc3e0cb66164e9a094fe4b44d8977ed +ciphertext: f9b34462ce03476f877e2fa98f7434d7ea6a0fc46495f492e331440aa092a8028b6b3e06fb857eb5eee420bad25e0d46652a7d57b7ecdac38dc83f1a6a863cb76a0f9e3ea1ea69c2cda8c76598566448d2359adb3e02f7c8ef17899d9fcac8f7e20721b646615691081e40f533b73bd1c8dc047d48098d68d1aa5727c859f599c0aa14de4034d2a71c45a58c7d546724b4176682e3ddfbdfeec5aef0b4b3a82b3f8966b140e7c55ccd7ad877abea237aa7537388dea3d6dd4fdaf389e1d1248234ee6f49b6bc78c33dc3186e461276be65dee9cc8c4f2b47ab42ed9555ad5f1318c93bacbb25040b66157a3ae1f2db69a8f38ce29a4673083dcefce7473ab8625b4e9ef06c2b8e2861e758b6061595231a234a5d3a5ec49f65e8b3426e39bd5f6c530f8966cb915c31f289bf80c6a4b75920c0c4885bc4916e77e57c40595760aa826668175738d140a1e9078ce650b8e18788fd9bfd5707038f43d44d08de4fa353f7d88737326b3e2b73e3a3188ec09ee52823c6e6af1b02f3097e8993281eeb6a7ad1d8968f8d6bf9b65ec20c0d09d4835f8bd76296f63fa0dca647dfe3e774c834383da48e6fa581e2aec974e26c91cc3f9dbba60ad9d9644fc2e63da59cdac87b56f4725ece40c0045d0db183f966385d8e330b480dce5ed8332257e3fb21c1cb6c24219e7a082e9f7088bcbbd4ffdedcd3cc492477f223e73fef322ea05fcfe14e9371aad6a8032f819cf2dea992c9b591f2bc10c8f9c6199bb07fcbbeeb6866dc6b590a630341255c73c7d3f9122bdc29b548fe4a8c570dfa63cbf0904a1e7753fdd7fc0ba63e5354c00d2b80724f015f7971ec272bac080ac459635950613a02b96d6e1a1e2455e0cb11fed44d28e6d7551e4ebbdc5a64588bd80834e391e3ec77e034499f53a23e4d675242158263b105fad406545298c26e17b26505583b3653b873199cfc9f5a7fd411a4f6fb0957cfa1fed917d94d46a977784badddcae2f6387e9139712dba33246c34724cc922369f3403c0c9ef00a1df5a4a82f22868fdd2415ac1597a1ad54587b20b3067b01b681b1ec6e4c019117bfd1d5a09e37ed83c3023f3b57bd420532b7048d02b92f1b3ea97997a90b78634c4cef2491505210113bee290011a73b662d922cd3ae2daa62bb4cb096a1f66dc83fb72ef4f4c5f96e94fa69b5722cc7b07b7a661b5802f22f6785d35c4fc969b7bbff0906af3a7b8c0908e73af5cb24e5c5e61fee36edf4ad46d44fb96c810738ca2098112d00da86248c251c56d9a2306ff33c8a6feb46e082b3507426f58f8b129c3cdae9c8f5fb05552b215dd90b0f8f2f33cbd2b99293a4f4867365a77234ea178ab1a8d1f7ff3396a251e22e9eb200c2acfc37422f4c81e7a1fd1c7761280ec136c65358226be94d0d62146f5fbaa6859de1ada3e7026f42f36f3a71260e2045036316bab93387ead34818059759354b15e5d3a5a0429b03c0a78ddce1be68ea7e4d3e6b79b49c925d3410569e903533880d2729075d5831ec38b8c6402c978 +result: pass +shared_secret: 09f64cee1af4d8738ab149d34a106ea7b19ac43e5a2536defe689824409050ba + +# Official test vector 39, seed: "cf520b92a2e3677afd003ec1ec6ef136a709d78f828c9c0dd4946efbd451c5faabfc83ca66f9d3d17ee4220553b7a69f" +private_key: 4284a3f8fb141bdc3c3eb0abe19b14e1c87cd6b667aaa115c1e4004a122459887fd63b38bac7421b0c3f4b19cb8aa591e6bb8d54039156627b305638e718c92682c05b56a9005338623a54d1fa92fd8b6630d4c1e0e50cabbbc3d054ba0f03443bc87273602234441ccdbb601d30263f260c567a096fc18fd719bb7e4c6d7113a7e4398d30f793afc45f484865aea22ba9119346374438a29c3b068223a4474f8a3c6fd4ac8c009226a346bcb72d61273ae1f65ac87060cfb129d7172bc452a3e8809f6763b0641cb9e1611699cc158c5043b8d4c995cbc438f549a4454bb147cb0ae27b726c1cbc906f4920b91ddc8531fb2ac06274519096c23975404253c6bbc00a816e5a0a20d86aba4380cfab92c5dd125156b7642e8552582114beb7b38a8b1050a42a2123470bb736b68011b809549c4550459b21ac656a301c0ef8723503b29b0d2370b2f4728cfb7ee17a1952a2354216155bb9072bf307f294bdc5760724dc75ccc315ec9bbf60e78cf11c27943289a0519d75b8aabeb895866c061fd02682e5c210a552e8278f8f296f7397a8da315a83d523bed7b99137078f1010d73c3b53321f0e5b0ebb44252404811ca113f7475f7a9b3cb9229e2e2b13b4f8abf5fa62aed176fba02361f24b9fb88d82147b2a299cf084cbb6c812fb2a1bd9b89a2c56a766350123355d3bda9774527fe9eb9af2c31b25a66b5dea238f27281516bac6e02ec69c8e5c9a9a9a180bbfb7a189b66043bc379cdb58f7c1ceec0a3ea4e931e854047c95565bf3bdc15098fee54b992aac09109197e82bdd28ae36b2c60e259788b53e8eea988d93bfae472499181176627e3d823af9e23870f771fad75b9938647ff39788a24b6c4a4ffb82399138387c9037b851ce74dc41182323ae935a0798126048c32aac4d7c7390691427ca53ca52eb65fe85ac44983f80fa7923419abdf8b14c834611d5908d742e373a7dba8ba8e3d35efd6c8fdc1c12e0f7c272a350fbd275d2eb1e0d836a4254c672251c06dc560f7a7ec7c80b8fa59475479f32a258294957d5d979a83cb6fc3c1ce6819f84e45c1e311b0e873f250283ec486323219a97373f5278a52aea7b88d1c7a43974e0402e58a55e6fc91b08381078f0285f898f4282ac8e5950d09343c7827df67a74ba1275e070c15ef44ffeb681c42b35c2c1b9c9d82cf07705fdec10e5f244759699ba6c5a2ca59b76e5ad5b09187a7bc3049389a94b2e25fc295310b30a9b3fb22ab3d9f893d9d696579648a77bcaa6b4213b23c65d4c303bc50aa0493c76c9387d186f85b0cea44488f0917612244c844450a81acb15e25aee3213e5bb647fd46b974bb45cfa21d6e1cc3af7799b32caacca0c80bc61a3f3991d367515276190e061b2ca956655514090b0667673e898a13e9c8573077641aca677c81eaf09cfe2dc78d0484af1557adfc9b32809aa5c6038020166b891920bc577f0064ed0b3112b727f800b22e9ec89bc691c883133a2b43a61c539701062e8512b9d1227e8eaab2985705418a8de6029832c2bc7eac2d5c0ab4aeb9e92324b83424b2a12c04b58681748aafc566d919862db6a516934ad61abbb17024665ba258f7299d7786ba6960a04f79b57c8b4dd8ab3b7e3203f2358221c9cc0f2a671ac1846e59b3d5c95576806b571c64746bd4bd541d4c55128b9a7d5208960a2b74a900a426013f6b48fe7fa1adcba5ec1e44594d3850c1a90e2a6bb341210039b48224b97efc62583f5882c71505a96284cc7cbe9873215697ba688546d3a6f97729b22251f479ab3f92cb08fcc3a9d962a661c6150ec6dfdc7560986bf808b4504ea2d44d595a8c34f4a564147cb798fdb6836cb448ca857d5d08242e233e3826797a4191e53cee0b375d395cefad91a395527ed094daff389a198c9d3b28b9e42b002fab4aef17b3089885e8017c047c35152a0e2709cccd7bf4d4a081d3160ebbc3d7a3ba977e221fea55e01823f2f61bfbeb9388d04103fa0c3330770c5ea5a882b26d14c4266b27722f29863b60c9f6984a5f0c2ee8b6f27385933994d8f9973728c5be6898012e4766d842cd1d7b360e415286c965b0b5277a5a1c5f731dd085df0f9579a31b5920227f238c389a723f8c31ea1c45afcfb6a62e555b0b2b766e78889dbc7a8a174fec48e328b4411338b26074002261e3c19c575b42f5a09a268b223aea813706900e785c3a05a98a5708d083c5e6243872ad78f3b456173267d61d57b2f330d01f7be8cac65b1ca46d8492f39c83338d92f3ea9a3cc7b502b115d5a7700e5885f264c384aa36ff52ba08ffa3eee17531915baabb5c9c04033aa091c36a0c5e99aaf0fa446a945a6fa281750bcbcf8e6666c799a43780b4024b97a6a0b14d9722856838d00890b9a982eba53f8254072f07ec00748a61ca18b0b516076382a9a52eb19ad329bbb81534da023cb03e00cb65046615c2d41e24d6e8ca6da872d46a1181133662735c6e382a615707e3d8aa89d49801f7908262c9ba7f1a49cd3c1ce9a5344f5b3df38bf82121cc9d4284da0c662d8b74ca9470051524ad108a2756bad834a1b1b2f5c01b29d640ad11c70643c0553721504ca90edd32cb4c693fd451564a1ca80f447378423888b3a2d30022997281aaccb939b0bf2f5643b036596983768758ac6b97da4843e9d8183633a65e35cc669592ba3a73e0213489ff186cbc66b8fc49fd2916322b30a6f2cc89e42715a8722c672c246822938b32ca6c47f05c21f9da66fb457206e7b58dda0a7f28b93ce24cd182b068cb951c5b29cfe1c30eb226a81bc06629133fa0a590de985e680550dc370108a7519a0b9da5b06170bc8a647c408477333e63972a7452cac811ef60cce2b8af8cc43b848cdddd7168b01ab9d138270604671d0ce57d94481eb1361d9a7f1c5906a11cb80f6454a2c358ad27086a5214dba5c5f69b003d9856831a8c13b9c28c7087efb8cd7247853b1a9c50b70d5e086a4e48ec77c8c6f4a83a11421ba4b0871692477a6b38f68c004f4beb011a137813ac02ccfe7b73271262fff16227da310aff06a8d23938444436da66d7ec6144ab44edd1322b27179901c3c1703279fc86163f804136a13cc925e47901514da5f7c68a23b23347d2b78ecb07ab4d81420662633b8a07d686aea3bb8edb04da7d2616efb147049c45e2a0deb0c85260862d4d25b47932b54487d6396c7f94193e40483c928460eb6b9b4349e1e4c0bd180111a72246c4bc20377a7059faffaeb0f304a1a64398249b1e8626fd1aa24ae11f67a7f23fdcaeb3494842ab47ca9355ece6cc643c3274c46efbd6e927b8b4d11ae8f80b5345b487a5c7101c8e376fdb140ee343106c093af7cb149b316ba79446ceb4e5e0cedb9b164f9 +ciphertext: 4e5a2814271daf633f5cf2f7a4b26ece3a9998020112ece4c2efc9d01de963e605fc366991cb0c46436a68f6ea28ff6b0f9c18f8a2963331cab1592a83a6bb207f4f12f5bf94f6939621c7540ee98418c66564c19922fd1d7d415f1dba2b738f6377e817848069d244c1efb59c971371cbea78c984ea42bb349ce3d47d4e66ab331e88e19602c79c0532df342cb3aac8c739f61c312e9e422357f497a91d02ec21fb79bc101b9933a6d214dc51c90c18a63077c083fd96eb09a8cc8cd240a273544714c2f12c05c0a3314fa08bdcd97276057c3f069b0c1169aea46f7c0c4d3af3ce46fc6f1a268cba433bf377800425f1cb9f2a3f67f3b6a6100f1f0b167982fb302040ec69517c9629b68328b52aa8bdd7ca7062a1f8e11e60a1ac034900bca5b84d956d92405d6b283dccbaa3297d1a760c7a5c9082938f641dbe982e14beb805d51157d1de7486f96b03fe194b25acf9222c8b86d99fbc75013ce126edcd4f51d846e2a883683f71aba14fec24476172eafaa0f4fbae56be9c14e23e913b9d60a7fbe6eb0ed093b0e2c67a61d1f160aee58f554d5d4a08e8d177b5c1df199cbc09d9e3a9bd0ffde82a7d4aa5bd638a008ca0b9036b245646e48f15ba54f6343c959f1008b5bd90465a74b7380ece0c60ba7f4f0ea683fd66442ac6e80593cff95903333bc32c5bd33cc380c0baab1ca1cbf993055140b3d15505d4598e3f0a51ab3936bb7b8188abff6b1700d4c324eb1c6442744161de85cbc43ba2a5afbc61ef8f64d50f0dab7dd7f35742d8646555bd6cf727772bdac602e4315920f825d0207be79a56390ee39226757a18ae0e68260b3f656873d518ea8e4e2bb3dbc6cefe02153378303caae4cdf13f29adffd9bf703e45cc7dba84f06e94b89b34d744a5d6e754e52e6cdc899fb7df29dff3e2842b5a3c1734f2280a01a61f4719e33f2a44218b603886a2bac8f97d3a43289e622b655351ea13f61395d96c6770d2067f7e2c3d50a9b45542747096177908fe2fc903f65c9c7653e95ecf39266de08293ced88484c95773772009ebebcf935cc894e45579372971f512646949edfdbba20dbfc8cd96605e8387b8fcaa452482a36ac052fafd5a6b9de4b7565cb0eb3e96f2164a066be4aff7cbfa5528d1ce00f3f7100e9e4cb195a6d714992476e0b7c28ca7397076939bb4d25742d1d81c64f23e7dc7ac129a094c7a0570a7720189ff9ad0c1b627c467d8ae30a094a84cc93ff199bbf2679b13532f08308c35e6ce0579e27f0a8eee34af2c4d8db0caf056566b4fe655d36a4db8daa7f2a7e5da5470118c6815673ccbbf05c221e1643d63c25ff88faf8659e03e5c0ceb7ab91cc3ebf954c7306740d0af9ebb61f03fed6e1756162764b342377e1e779a40d6dd68207c11f4297a791562d635251a3703cff46075e4bf384e657f1c32ec70764706835eba6628c708a6c8165ff624deb8baa4fae06c71171897cccec55ff89eff6cb72ffbb4db07e009b44f4762d41fed92589f7ed6b1730c3a350cb544dd95 +result: pass +shared_secret: 7104fe381d6d7995b4d550278a66a719b9e79d9bdc38fb0bb60212c4355cc520 + +# Official test vector 40, seed: "197e5d562de7e01bed4fc597db28dc6efdf0179f3a5bda5f94caa39d67bae730540534d59a7a06c8448f628da8b7859f" +private_key: 72a953d60437f6c7a3855582b211c7d6d97df18c8c53a787117758a3246ddaf89668d5c71e999418e9515a9c95926688bebc25e0f003496bc0804a66ff68ce3fd1820c5320ed9992a92b8227d5042c72c1c1839d74b790ddd371d477b29230a66526a81a0962a52b5b501075f50086f041924e6889f5f6a6a7c15826a70e3c7268b4f224dec35a73da9db8500def40ada4d7b210513acc63c753cab007981bfb876171ea867197ac97716bcb830462e59167616528e840cdd703ab4516b1e307fd5703da82bdecb0047ec49355a60ce27598d739cf9a493c9c388613b05cdb302aa7d82c0c934b95d602fbc810133a7d5c15639f52ca0bb93b06392cd8223e31a3af2aa19cf5406f5953705c3a1e649346ba530b2e34618f520382569d8755563802ca6a76164da8227d904d2e86cf653123c725c0d0b6c799a35a5c517237d405c8d945119a1c573a4b00ac224cc19115c301b8a73cd9fa72fe8366d596a3eb781aab80895704b8f298571eb3a10fd7b6bcf590bdc4461b6c1522dcbaee713bfbeace03b4ce5a8c3d0bb6a3d7e410d0e5640be91e43a134412313cb170a1ec771c73b91af1c5a20a2b097f2be408155d0e3905f1b043f8b888954384adb7916154f0683619ddcc74086a6981a18f9a51d38e44dd4b7690b37a0694c434f9869140a5f4764c968598462d7289146044118022651c6ff259aaf878c584524eb4abb65424c0d3649a76c3b2a9168ffd4c44c074d94632d615bb6a8e2a318c6144c949c27f2a7b9f914cf97025677ae31329f5fe484909689873c2987f6bfea1b4f04fb2aa7880c8e4065ced03eb5fc49df2bbd38a3aa2295c541c47faca59145eb864623baad417975fb4b5b2b3f7629505393bf590b7b21579e3f7477be32b2b7a2819ff856395a700353b6eee92dadd46703ca3be7b033770744b6216a6aa06ff38ca6f3c21bca7ac726e7a665b45c46e4b5e0ea5cef6728f1bb25a2503645b063be0244a4bb9bbf1562ee76c7c859984c878c2f299e2bb0438e11578301a39c3288d5a4657c88901789438d35a29d0446af5782d5263cbf13c831b32c4d052f55746f6d555bffb74ea5d71b136b732f0041bdea87c3a81c4af28db20c3b7d92bd355b340d234fd7a78d0b7057e44c509fd139f7bc84d3a6161295c0438509014c875b2b6b9da55e222183cc0ab15c8c1751725ff90c5a75608b96c5c18a43a315fa5d5411c5717660b5200fa01459f02171647394caccb11426c7f535545931550c6a7b7acb725525ae17ec946c062ad845105072be4ea32b12b67aa73cceef80c8f9d534ec9650131a138745010f96804c8267691824c336c41e2a9169b1ad7de971f59329e3b6548267c1ae1642c649b8ca704e7dba94d6a343ce998611745307501c2c90c5ee9795e2ec58bc825f81979bf9821c4a0b00ba2415e6ba54c36778959540e2b9797f925adc7cb54ab54f5a58c3210cb677aa8be0d6cd8d354666b70f30e7718fc107a9c3289c0407886678c4da7acec224bb85be78c23443c24be09072e03a8ce92aa8323303c09266801a6444fb6267853df12bb0e4d54e9af982168c7941e785d1fb9701db1e46da1359c53f6c9370e7700e7dbc3e120b4ef784b4d0a3b69a60403f5b9c4aa3808d7b832ab9939b2a5cd15bb36ba710f13c934f0b5dc5f125b4c4604d330608c0c608f14795f690d21ab54bb9a0ed443601f821b3c153dda33f6b102193a2343bbac83b938e521676ea2a20bad2b515c13bdba9c7efa9b8b460a8cfd6a54841bb306819b2ba7adc5b93951653c6d116c86c302e067b358631259012f1d230b892c393652fe9d778e755bb1d8bcb840c51eb93371c2cb377da1f0a33c13aa4aec4c9b79f492ebe34906b6777aba1470787bce5ecc92f494377555685e32b6d52afd230464469adda074d5a159a54e3493a3364d7443d81449006f0b88669b8f507493dfb67b1f012037438437982c868362c172556989272c8b338b8a56ac0af290c3be991c5b552b77a370c026b1c7b4044499036dff32c06bb4b1b73b66d2644d0709f59050fbdc62b36e7977a7278fdb26798d264241914391c71ae928d5c7c7800fca963f4a5ecd9ad5b1590bc941909e142be1c382d7a38b123cc23aa02c9273b5f377d97637091db6455447574bb0f26a250c63a6aedf6ce4ef9cc1c86424b226b06da65158114fdf2bca1c457f68248fea0ba9576bdfc380e45781bef85bfc87ace9f6b5c6f5805bc3403b9e9a86503396b109d2ca2916e16bc4c7a9c47270b77db678a724bb9e461e2f3adcad69ab78a60cbc52134a7557afa452eb758d4c357af310247f2b61db9c2edbb126d7284f38829861870bb494fc65b8b16d97cc5c9150d4c4318ec698cc5704f8011b19037232b1e337911565382450a4afdb8c8e07a7b4127a7d6d630c74098b528aa9cea5249a6a424536a6003787b7723027bc8dfd07b9519337d5125b8bb631502701ae2bb9c352a3407cb3903a617303a5c29cdce23c4ed747eb56bae79084ad705041ad27cc7441dd8d51ac4f5be1c594019143f41c56cf9b1773ee0cf9f116036aa65896420f82406c1b36009e12433e60993b691bf9295ba6621bec9060c82bd3d8c75d2014cb774a3eb8c8c7e698069437155da058aa4a6831c6cd0b47fb425c4f85c5481282107d4b5c61756dd3235ba61a95608404c11546a28c0191c5bf8473135a98c582608bf7c4a1387bcd92b449f888c6b9990a59725ea9c896fc58288c5905bd8ad06a80ac952106d42b298377a0da30db7f68df4119edf5b45d472c3b11c85ca1439d2ea0f074899c3155a51f26af1f52265553e2136ae3a69b529767549f146ecc6592a4448918a892af6a895a27a64480546db66c42b8a9dd029fcb2bfc14189974531c37405812295e0e85c2c44620bbac2b5376463a0490f628ba67c7bb7257bca690ce4fbae57b717423abe164a43ece7b30fc768779c5a82d3265b7a0d012383b1d8a6967a33969a5d368bbf5ca6137959093c9b321539236278043112c8ec819e1d9b532f5c7ad7506ab9c31cf2f4b95f978cf642b67b2995c8f56c272775023a438845ca46a6858b32201ca14f1bc19761452a0a6a2b6ae4bde620cd8685a89bd02f64eb51d7bb5d29e71f009a79bd060273ebc51a48bfb575afebb57215aa0fdbdc0d0ad91120d3799c8843d50068363b5c47b09572623d7ad8071ea1424799c1eaa7165343af0e808afcb39f5cc8a7f5e14bd573052725185dbcc71968200bd272d97f676c08e4a6053f4e0a7071d7abe99607e7573ab27768ce397a94bb7d29f5dad97d54054915eb66be41023e5d7052a10ed1e60e860576285483bb5fd36e2f944d32c4317bebc1e441470c1372046a790d79d4 +ciphertext: 9be30498fa5f736eef8c48562cc8232b5d16a725fc6ee4d5021ee5440eb211f690d413b3a7f6721b79839c1ccdff5fd07d92372a5a057c9e3689412134e4cfd35bc484d0d157f8b1009594733f8c4ecf3473a752bcd6ba449e4bf9ca2d768563d79749f251d2269a40f627e52be1b5ef09a1d45d1e5c3c01583085b45e637849c5cc0ee698c728682116c835bacd91c865a8010471786a23ac73548866d3429736880ddc0c0f9c3d840c9d46cf9fabcf9f8914967288b442ee741b9ab70064a3a3832f64397cf2b66aff37582c3098014205f219681f1c243b8c96125e8c6a9ca66de25bb74c5d725357cd08402834365061e76589eeb67b2008532bb264291b6e92adc1dc550533901c4aa17d5d8501365acb3c7d4dc219aa9ea089b4d4e859d258a6bdca93e9bd770a19a3727d98b3e7c64d2fe4915f5149a0ffd6beda15552b5b3316b40a9e4e91077e736cedb5edd7e9a1c55f7b4cf448d1f3902118ddd376187c67acaaa74323e57f367fa0bd800a5facc0689480f47b7c0e4a363aaf51c34b36b21e99f393263294b78eafa045d8b9a02920d51e7fd1feb3dd9572cf1061907e7147df40bf130326ff20812957de39e4fe68bad5536df9b14f4bccd8983ea0d6185b50bba47d74403916dda1b98183403d50c85ab2ea42268ff176346c2d8dac280638964f5ee4a4d13091a8abd8498eebaa3d3b9fe625040badf9730f46b1740b83e4cd71bf299a1d4ef738a3f45750327c2194ee42a6e4338350ca872e1a1c3499e11b34869b0a8b5c4ff91c485f6cc1814f41a28400d4eaa5dcd5c6097ce27dbcd200e8b016bef1fbd6ad51e29f3b677f66398f4a3d691a19e4871f497c0a89faff13b59f6041faa36493088766e8c11a30231b2de1080dd5efe323522418680f6ae888543a10ccb720a00c765104afab09806a2da4950b3eef4359f820244ec0864199450009e7cde716cafbd25d3a833cdeaa5f13a346f423752267b96a1d70c0af7cf8e30df4482438d95b73a82ae399a4e08bec89dcb80e948903daca79d347c9dca33c9efb30a8994a3428b255f4bc63ba1cb656c9ad148209aeb4024569922bd3cc7cbbeea34133b70cec836e53405b191855dc50bad0ee9e4ba62fb2750ad0d8d0671873212757ecfff10c479a805d52a7777c300350ec3cb4aff3f28660f1e0a7bc5c39d2fb0f944fd50c6c1f484ab01fb6eae7ac4cdfa9feb60734badae4eb075c7222382c559775229fff982ad0d64578b38a505442ee3add8a665c0c25c4d4e0d872f048c39a4e6bb1db711086b3db81d8ba2a39628a18a92a44c66628d966f11df04311a3fd13b2d1270bb59e0d377e69c169feaf8e0b74616e9caced4a296caa658c0389713d20153b162c1ebccb4e678261d22f095107471dedac0923efcf9935ea4a531211b0992fcdb24b2117513230d40943c3639d7613da960e54e5159df207b17a6e15d0bb4df2a491a9ecb56867be9334aebedaa93a1304d07282e100e3ea2855f6a1653f70c96a1495fbf78f2a7062c87b +result: pass +shared_secret: 79b1ce19715dd0a74ada36d31f63f3242716890a66d6348232c914c8e5c4c499 + +# Official test vector 41, seed: "f170583cb451d8a45d105457c02c01a33a40350616ed8515bd49067142f61efb00f07857e4fff3fe11e7164c648c76ed" +private_key: 32f2c581d0b288cb18c0512172098f6e200cf9e1aba837175da86a45d4b6bd985728f5bf966b284eb96e059a8b4a99c0406046d117640ca029ff7864516cc6d49ba33b640c313569944b07a10b3820c49ddf965187d6794f491734531700571c788243cdf2c620b676657bc6cd9743242b6688d22baaa432f9015f69a179c01652d6f1c3721b4a35841bcf620552e4100beb54f494586c73cc5727c7dc023976d20bcc248bf6da8b6e36878f51177ce3326e9989c95c5219c017f59806defc68f466213c131811ca618df02df0ea6fa759b095e259243c897a132aced9661c3c04584bbc4bb218ccc118a91072cb32691432540f73403af7c09e520537592965483f25394e51a57f2403cc6ac6471ca8633a3c00a049669a3061f82770b7a7cbe4638a8c98b686c499940a004e9c3a7e9c1d41a5081943579620003f738e2d9489d5b24967b6be64d3984e4c2b69394f99f7062caa8f9be60c6fc6c801e77fc2d9b2286674df0c20414832d4193a024b26448bc33c30405c134d78948c34fbbf5a442636b87bfd3051bed47f86b2083a4198c8b224d1f8c0b0f5769ed72a18027fe4a85d9ebaa57cd20f696193645c9b1e6251b695061a711eb95270f541a730842f56d24981881b5bb071bd15af02e8641d1a3d0c093d680a7b4283c4d9751ed3c9b5b86c001da05bf5970f42b86071aa81e4d534be3b4c92b2b14821a54d9817212cc1364525bfe9cbf9978429c7c1b3a3615aec75d4651ec85469f3442ae17b929bf8aabdf0539c2b783c30875f29b68ca5ab28579f3d7722126598801368ea9648017a77c7608e1e54c5ed0bc0ec48b1af037b23665c1e675de79312637482a9655a5e72c155581b79bc9b8125c5f32248274128a993a6543172a6570c4ffa6e5968239174c6ca9a72a8a793c5fc61362c424b525fe2c23f94aa4d4bd610f1a55e330a6a9b6056aa7605b6623f8962a996e806de090adb40cb34cb8d2c024b00940bbdd025be366d12bb0b78c6b88f4a28f01731dbc7c1026a2c68da6a5bbbbd1e6a898f36a19610abb9cb6f04b3881d85bf9300142ec300ffe20b1f33763b816d6dbac076373a21501495eaab2ff3b3d0044d03658590a4c73f5486dd055745511bb4d176c5b7cc66fb0fa500b5cf14700640b2679c80da38762af61a4442687af30d5fdc2308c9af02753aa8a93b294b6e541490af4c7cfbf60415d9be34f6b7f73c4b6bb4842b5c608cf90fd8c1beba947fd9fba4eb0513e8d35c8995473ac200051c6063a3022fd6a8db9c0377f62639982556f8676464c86d856e6a599d031c35a294014a5b30b4aa5bfe779c14b50d4f6a3bec6318d6312f028b6bbb237f203b4737a9cfddf252f9b90964c01cb736a832cc337e078c6b66b9733c4f8401b8181926f2c73bfeea63cf3b843e017f60e35e062219b2e76c9c830aa187bc8a863b58a8aedc9a9e443c93520b109709089f4b40c8f7966df7af854b4718b91d3061a6aa153d7d336deeac9ccf0072d6540970741167281eab315fa2857915144f73f9b508542492706e1d285ca9c58eea9c3118ebc21c8374c6374cfe7c846e9815007b602ae23e43f68b82811498d2bf5a357c62275609022877e48a8645bfe5dca2202ca92a9b07a6b33b49872ff21b1cd901020e4ac369fca24c00593be105483a24076cafff8220780c9bcc9150b3a65571fb426ec47a82974bb2a6ba13a13551d737e1ca2cfb50103e14269263caa5b15b16066ca63b867a250318fb7335babe4fd81a2ef56ce7b5beb88c65c2bc6c5a75149898a3d8a552cbfa6af1a463a19a071cb64280da48f3684d99e0b4adc7b48d039358f201a7baa1ffa4ae95fbb0d45776bf76523cd504a379377b740d26069e933748710a63781a23765a6659eb4718dac557a8553fd5be04230166782860a3012290b068542dab126a9f921aba2b61afd6958052baa7b24ac50cbf1f613abf761d3315692c49184cf3995cea8f161c86768714afd1185161b6da86c73a6b228b953dde1713108029d7a729811b85aa906f67978239c6b6f9f4a72656b9536b23691b27b3b2316176357c07b671eb562c41621c7552265914c500a21299b17dd258e2a04352b506138187611c19e7d8860741b110c57372a3be2be7a3b5a6c688390f06a5cdbaeb6dece153ce5181c8080e4f879fc063a68739032481c2cea4611291362165a63ef3c0f436230409c8e5e57c01651471694bb67729919920c6852bd78766a5f5c1b5db45c84ac14c764549b54d8b2404523b0c00052c5d3538cbc00bfd96b8034206714a645d447dc83844ee82c069f63b59587f53c3cb0047cfe63b4f6ef41513ac5194b91eab2a5ef4d7bc55e1762e9162f2fa009a9c437d2c93308ca411e8ad7f9c2a642636d5e89f93f5bdedeb78062032db389bb6fc77be489506a98022e83c9aa9b7bf65c561e1a8a95871e4ab1875535981466286175eed087e61ea034c9488fe953106aacb251c7fa044bafe474c2eb602cdb091687558c02778f4b562692349f9b132fb3a921f75a4ee6c33440ab76fa420bfb339e2f8c225bb85538cc4388522f9628aade183c1532baa778faf937035639a5367cc64c4c036fc25a61b4f85470402e85ebb245a43c92f2cfb0ca69879a0fccbff31a35f2b46c986c66386308fac63978534e5eccd137561a6b110d82a2328a90636b55b8d67337626115448ca7eda95a6d2740e33c6cba56a9f34a95a7bc8f304702e25315f81182e54b2656913939083c052664a9844535301fcb730dfc9c5571ba72f279a0412b98cf64c069b89acda010494498f92838e32c711f1712d8b34303b3d594681305b20d2f8ad43fb6598113415460a0326bbca4c1d658a1462aca2a619abcc5a61a99921ca82882e1569c3902769e208c61124e741630fea09ec58065b889890a667d25bad039c4846a77d17acb5e726b5717b00e0b3918fc767205028cc4b67cb29b49196b4dc288a3abcb112bba52f0cae6ef09cfbd74d939b73ee610f0afa6d8b345d3ee95749cb4373ca3f52f69ecd767893135e7dc4ba6d069c053b79fea0c69b5c1258609046c761c77322a9d4626de19df5543165958a447432d5237f399bb1b9a8923ca45521b21cc4b17d36e724f5a09772a7b8609c9c86140b03e8a10c54adc91204c686049a643db89b0c375a359c943d5961a803c6ad28512839f42326f53b22dc20455c843ad64753498e10145af06270a81213046196d2192d0ae3924f4dbffa093a9eb51025b31d268a74f44b849a4c408426071fe5e18c3ec8b5c44c20aa5a85b2e43c56e051698c75bfc27bb9b1722501a6502d1c0dac0aa7f1b0f89d7d99d5c3e0d10d6ef9af054d842375f695abb28e3b8eb495100f04306e92 +ciphertext: 505762f4bb1982d5097e0f7a5bdc8da4d943a9f9cfb960077d0c303dd0424867038ff99fcace7860f6c593cdd50bc8760b9477cc5ad473619ef4d8d8058c88a267bcb5783a1edb74f5ea36cd39f8c6910061eaa927f7a1e84b51a1ce6e507eb45730724e422c92f61a3f8743a590197b16e6050f4101b6c6d22a12c8f1a8de5f0f6d7c5dbddb65c27e98957905ed7e55d6e51a46dbe462d9b90ff0fbedcdddc99914d3a282e09564b7206c83e0cae6560053a5ba1a83a024650154f91107abbebdb10f734dd54932a6fcfa73d58ee23cdb936d74c7e9cf31e9353b6db031439e8dac753189945a9116358b797610e845e958f827e7ca0aff758d0dd5acc8a890d0771ad7c470586595f54c1ee8f1c4ff867ea4042a227ed80ab49c17ea5d2089c7b27ef405706fc08351945e21f72d7e4fb32e26e3bc21eb99145e3e357e4a10de75f348f4303ad45a83dba56bdfe92857731d55cdfee03d647c5a4ecef35b2ff54857cf1a8fd7a9a244a95917ea87184390d6ce6858afcc22fdb3d53137fde169e0a5852487d4f3ea78fd9d295491ee6fb86cba9f2e1355519994126e1301882964465eabbe07697627a22819667e8079055b8a6fc5dc35e0629a1b74d64b1912ea7f902cb1459a38a0fd5a9773933e0a10619fbe281e0ff7169a791179057df38e5424dfe9cddaf545750c2269c64a465c39ae65d5249f742b66d32033ed35781a099b02c2b5b7201a7b7c2a4e00af0c724fb1d6dc695cf261b60d24ec5a3f028c53feb6c63ee90e424ee5e467f3a0d693564676dd8f2fff3c6d45d5d7f095e44b1b5fb43d65cfbc524b001b967cfc8f1d80a198756c2dc0aebf272f71a4fdf3c4e7857461d7b645a11835b8ba7dd5545ecb5cd71113119fc7432d73f816bc91c1506dc5b4fe1448bc7fffbfafe093cda411044211bf365790c20ac1808f8bd99ef833e29f052935f35ce8620c0e113eb4153db9ca285f31b5c62e09e34cd41b427113e99b4157ad2b6b6fc269b6b350b540962601fd7dac7f6199d08bab7851cc1b5ae954288368cee962af736ad7567ed9a961dc0fd5dd428fdf6286e7265421a2b05f2278a89773b5c77d2e52611d292336f3ef4c6cb230cc91cfbc0098a41d1504253bd378d617b9020d9259bc1288d43adf5cb135cfde2d47d55479f62241de834f10334022b877149b7dee20f2c8b66d35ce27d2d48ed1a9743517d3991c45a2831be582bfea1328a09ae200628d5a0a93157abfe9dfe08d41c1101aed8e1d8576a4187cde5bf5a940b6a756b5872d8b1ffa9a33061fea423ff3d9f0c7a5cadab5f9e9f6845774f112c931ed33f020ad45895133e2f1f2a31e894660df8dc6aa7b27b15f1e868c27308450b4f496cb46d2f45d4322cda850d09e37a20e225d8678d1d1bad2044801e02c13ce351a84197b529f917d0c41f45b02e95400046b2e78dbfff61c638030ae94ef4187ed77234f21d01891c4070b7d33ab61d46926dce9b56bbf7e37eb39036706a0773f6b4399a2368c1f70191c995e5533 +result: pass +shared_secret: 66e872a4b3baa42bc3e8e4ee787ebe070a094f05d2a0792ae2ae60f8bd0ee0e7 + +# Official test vector 42, seed: "44a6774b2cac02dff210ff861a090561a453db311f47b6fedb81811872d5d9489f5fc4103010139ae53fcaed209dc9be" +private_key: f8108802536a5e0b192cd8a761c1163c02bf2c457bf4162799884650185cd6e7a978c74516e85541b212b90321a0014615a973226b927046cc24e709e988562964213a874ed5007d8c483336d80b2338313606c716a25d7fc8617a506899187ed9a73d835997de71904ff82fc4c59b12275677b90fb6c079ca872866483ebe326e33f369006b4341bccc759b6565816c8bfb3d00e11bfd7b2de14b9bdf163bba82852ee76037795df78b9a2182c883652e17621055397c6b7848b3a8365467669ecb1ab81a8747fa449f22aad5db231873bc4c40a45ea265fe45c9f8f43dcde1ab1573bf0716139549490acc91affc45aa816809d53879678d90132ff321b2c2f32892ea9e4a112258f8236623a701a453fcba1d26c3aeb37c50b72625887b5cd9eac2cae774783abebdaba500eb9445739eee33114852a841447fa19cc360e31c95012227aa11e35412c2b5716d7602cd07a5b48b35dfea154e6780f8573203d367bc9627f414879251738e3b8cb2e3c09956c798144fd6c9249b214cf25ab84ab0c7d0b03728b7847c485663470c41d59b76fc48f959199305d05117cea0e04c0c2c056ae740fd21c0cad76e70f55ed7a62bfd440a2b5601242837cc6205196971a5993dee6b51f399ae1ba47334985ca1e26245897ce954a7f393105e75cfa25302f17b45e04059803bae94251d9f51530012ba052cc8948463e48367dccc5842354e7fd7596122b56b6604fec0c58db228a2170cd64a2be9757d8be35c1a0975cc1267d789c774883de06bbd6572129b57a5e185195cf06bd70352574c68a4b71d2ef5580b57166c3746ec058302ba3da6f916f1ba4b572a82e289593dd57277c0c570c22d1cdab6aae39b16a68f5684a5e367c713e649ae802776f6c3488b494cbab596f73b1908ceb7c05c46304f4e26a54b388b61aa3c663a316314405049c67accb2a7ab62140915a09488627b3c3683c3aa198400fb6a53396f978b71189b7c4fb1ca005a79727c5e6d129af7220705222617807460948b33197ea35a091ce9ab5a2b9437f961b70c432b360be118a4b589c66af374f58668e7515b029a14a272ae4af399552796a4ea3a8d37c265b42e38c2c586792d6be661c9c4753d373004da166f69368f976bf1016550013388b562b43a00f801b2a77212237b5cf53c647714218b94343c0b06d3fcbe446514289a3bbab9a3678284ae46242d1b56bb0845b30817c669cbdda709576b91072aa38ae0a6cfe444c09239d189cac861667cd6449c0ba8a773c7106c6b8bb40b100b39a562823d33a180da2bec923d1e707d59d7a8e397c68029b93428bca352495966a79c299e531b9b59b437e86398b72157fa43391299770b7ab37c71b387401b5ed5ce81b88a26a7a9dc023635c932c26199b5c437536ab194074d1cb24f65285af6b03f6a9a7174a380ad03c6826ba5fb32c6e93c2fe011a0146717e8265b31659a806975bd589f7630461bd1b6c51a0a2cb6ad3f825c919533c24c807a9c6e3c780d0e333105b43044d7931920621874395f794483820afb55483e34abf3f0440f3253fc702e71e34270d38e4875cb9a6090dbbc53352128c18a948ee821e49bc9c690563a92728b610a38724d9a8308ac6b70d1c87bfeb07775d56703980c9a563040d1ba17297b1f253afc339ddc11a42cbb051ba2722854cbf45bb80cecaa81ab63ce32acfe953f9ac8648b95be8668822060bafbc10b59e72944185a57f790351a20de6679328169b954465f8cc028558328f3baeca98e42404299719d205cb17c745a7784b97c09130e26376778a9330c99ed84288ec3955df4076d0c9f5847af05bc58352c1364f34b0213a3cd05b2d79108af038e457a30bb5626b1dc404605678ac675201c537a8a6ad67a8e3e0b17a0e8632ca1714dd341831b2790591c1f39c530288dc8448527fa542d64192e407f2304747ca7cad98986c59622b2e63e076420916635a538871aba5469f36a5536356d176265191fc150a4dc7349f07c932c053ef4b6bd245448ba8173ca0896e51092e06537d2157b0c1624d3a29eb0d055d48a038c858e53c1045c392d6f59408df2bb19b35a87737ef90b9fdcc380af6a1ea122838c673e39f502a08908ac33276b4297c712b3c7541c7806c71dc76e9291c89cfac3a56c9c94852ec4a47bf6642349b95f69c43005fbc927113288caa2cdd6175b2a627149027e3688b436c336b51c8539cec3c5537de5ca6955543f984c73005181e916317262bd638e249cc928e048a20045907b79c441cfebf0b9106c8847b8088b4c41fe6b7356d7947ae9a9549305c9278e6e3a39060854b88b65cf9a20266218864c94377a475c0822d454ad8fb42c50a13f1be65dce1728388a8d4a81b372a1486a86b0e6d1abd445559dd3b827b834e2ab3744c0c5abc51bcb7551cc888de7f590ef780d7cc94225830732f47b6ab4777261944cbb3e6d943eab827da40a7b00d8960db1810d028529449dde0c00eacbaa321c14249b7113ba43968b79070b9117dbab36b44f05022bf25a9ec77c7a396415c7f24ce5e364b09a16308472e1d49ce92a41d3b868e4664e93279467745b9e04c39bd67cf0226d198110e6235a3a35af970a73a3472027e1c7368c867d23cbc1895790f2478f807b756516acc4c7dae3a350f26a0353930f4c23c3d982fb90176bc70e0e6b739fb67aada24d10f2ac30685c2d7606fd6bce5df369a0d176fe32b0e0e8cbf583b0e2019167640fa63c23d7223259441152b0c79d9b2012725b6eac08ba8438cb90309123abe5980b6ce6889d6b7d1c756aa7a90181a1422f5a6f803b1e772891a61ca657175f7b815cb3549d3ee613deb001c7ba200730b2771b5743d80ee48683d94015ac7221671a3a711468f8b3be5ecbc1af824dfbbacf87972874e847b399280eb649304a3687f43dfd769e13a4964892b5e635c0a2216273331da5c5b18ec0b406ab1163d4179af5aac5fc8273296e2433c8fd993f9340c5d365070cb72715188b52cc0426146c54a3687f6a57f36b0b1dd639c505bef4c71fadc68d62009bc6b27b3817660df31faad06e86b91aad252b80461200168290848f963010511763f8614f202a3a05680831b8bde86a18dd79248d46c144730bc7b4757ac95f34ba2cf0436bda09cf5a9285e7c924f3b514695300c33cc6d92c280ff81e72b549694aa7aedb46afd394a2d5826e657897fc53285905406430c2b7786e64ba44225985f95146947535aae744a3b3707467701a8bbd99b938f2fc7737f22bcb9f146983a07f72c30933b8e50425fefbf58d711f58cbf9fd8ebd2835a1b55469a2a1b993eacecd292e4c5f9e1a55e0489bceffb204d672a6215f4f3980a646d9f880817c52dd +ciphertext: 8d02a5fd8b7945dd8e00b27e4c2ed63c4e5566b3b2cae2f068baf7e0f8b816261f56aa61f545d41e18d5cb2f4017c97cb3b15eae810a7f6b82967420212a1f4b794b45d8f79dfd8b2ff1c21b50274fc9030b707191cd1c5b8b519873a2e53ee6b74d9347911019654a3482b80d5e9f15c5e6560bb8f7c6b3a41ddd398b254dba5fdaf91a5d37fc1df8c8fba39f75bc780def00847d929dc8f283b2ed381660ca7848eaeba9b9ac0020952945e07a946b8a4bbbed8361031315c8c5180cf072d039b63f7320616fe35dc1edc4d52635bdfd392a6b01964e232b409ffed11144b61cfb7dd477c1dd0daec06ae58c5a4bc0e609fd35972949c93cbe0382f069a39fb478ecbfced5a059a151fa09df4e2e80b3cac95129d9f75d905cf122608ff06548ed6d9aafac2e21a94079f2efdd3e569bb12b1d3d9db82922e7ab0c9eb43a83df5bf18a1d315048267f5055f04c10e1afe3dd4b8c4483e0639c08c6410acbc2c63e7e0b7e4258575ce0c85aeb6961705bd86d4c95281212b21f84e71bcb4d1bc9307d5fe07d0d530c1f404c1f2ba4ccf6327549a0f98f7fb31ec5da2858d6b3ebe63d27b51a4e3e08a10351dd521fc39945fdf515ce419de7f39c4878c5f71a1afd69a3b6b8951da056159011329d4aac3d5379f44a873a604cc60c5b6ab7422fbb31361a233c2cd664ead5ecfaae4bd71528212736ec659688d29831c01e3e5c03b5ee7bc2a4be63a129f9ff6dd8e0ace373d41e3f32fef73c54ce6d59cf15edbc276703df264c57532a6b30ffa94a32c36d7adc9af13e3a04bbc565d112bba7345c142dfd3a44798fa837492933c2f5f6fe08a43a7ad217ecf6c07509551f36463322ec364a23b444f037a53488c14f91e865285b1087d7d99f063248e22dcf798a2dc217c691e22f3e3d7d3a90de196e8d7bd18ccd0179ec35b2e350d5329af42177d7b731dbbcabbea1e6deb321b8f4f76f95db01c631df3c912afc1438e245151420cc60140451ec7401b8de1eb9cc652a008574ace90f8daefc8541b55be2b033af389226c4bcc9461a291ff6a3af15450936de9b7e923b021ef131b573e2ad16414bf874fb962a7803bb5d620e12b6839c7b889557158e79e4add1f4a243d0f3257ef397a4168a2311f3992ddb8981782caf922522faace628cca4f078f948a8aed18bb6f2708e810feea2d4f1932f6e6bb9c54a906f79e6a13b4d2f7f6f106b88e18fc955e1b4ecd5b1546c5ce295f7215b3b33fd5788e0e24306b8d1059ddba8e151ce1f5c6cc6defd3f9f9d811107511dcd882e5da61452433a24d2b0bfb7420a7924ea90a11106b5f5bc0ad7428fab53bd5fc955733b9173677e8a142f50f005cac94bd770f8397db0954fbd8d38f2031681c644362f48e6f9bf3da9cda3369174dbab9089e83fb4ef1814ec4fd33f4cff8529e9b482933de533ad2fbee4a6341f1c227a69f0c52e0a775eb0ffd8f88060b9555f0edf07791fa1709e769427833a5df7d92ea0ce6bcc5f26f280d1e8c551c7f29cca8ebf6e3d07 +result: pass +shared_secret: 56551e57abc7b80a842db9ee65aaf6e65b7c4ca10fc297e9bb0a6364e6255bdb + +# Official test vector 43, seed: "49e1855588b6235df2a400c4a70aedf8ab17b6e5e2891aa745f132fa2e7ab0c8117c1df37c39f5d57624eb77c2b4a091" +private_key: 257c04ec995fb9757415bac737300b03c991bc8a5c4be86cb0458f66a551cea67fde748c88113c07f09e2ea03efc14328381b21220741c12c1cdf9a81d3a28e9b7b4bcc88d0f38a700dab5beec59d6073ad85697d14728603b1190a81151061f3159293cb2096c093d72f33b1957cccf7085ab031f0e404b1c1bbd06831a9574b90db6025fca778d68151edc4bfcc11292f240d9e6226739036cf000dcd1b275d12316e605c72a2fccc55887220ec958412493c8aa4759dd0848ea0271c55bbbbd178642331e8c910a932a5a8d0a3479153a480c9b0ac58b10334c6b186b38526546eb31a0186e622520b2b60dcd00345222948cc833170427a301a26e920ccc6a71b979b7f8a02f86e983f1eb1b2aca4202100260a94b847ccedd8101e1b16041f96d72b8cec772c08bf5a75c5190f78b123e943e1693169eb726771a7c2826351b5a05a803134c24b72deb2a6f282b94689ee47bb47102926849821981322a03915086670896152a022036351a046bbb6d178bc7605f92254cb8ab2e24544650da4e29fc0ae9abbf0b2296d6bc7e99b4c1f9d50fe7fc7a130432bf98b28e142cb1924efe5324bdd2887a9a7b6a1c18dce15b5b127f17b5739b5c5e33e63fb2494fe403cbf9c2059618ab6fea5b1d78c4d0438fe94c447a4a2e42d974a44890db571ddfc288528b683a363a93a56eb6c9b1da246f64f0b0d3d6c38b4975f6ac2adb2c62a9d208812c0365f3a2aa39ac575595fddaae5ef5c7f7fa49d8b209784aa25c7166c92759f58421eb203a1e8291604c84d24565dc68ca7b183f78fb5a6869115bc7b7b1b33bf4e4afdac9af6dc0604070300f7273223aab0fd85401b923d6c6180c815853994ac22bc45e5b7961a176811780af4b0bd84a490a0a3ce1062204c535c9932be4137a7b6a1ff75579e72b75eccb806b67419119721fd03e59713920949e8f6b5bb278b7dfd40f1125ace9336b5bd5b46f5952d4fa0b780a875b87bbb8ba2096d940555c69e45602975b1324875e891c6c326539052c811ffc4417bc61205b430b522a1a7b4df509a4e2c9bb5a595333f29b986c113f57a9e0d91af791c8096c0330cb59c27b3b29c15b13128b86336cb0c270dbd80d451b08cfe35876594ac4011b621792458042e8906deba57ab57b9565344e2af27d87a68108a8487a817ab5c779683cb81b7bb258e598047505ee98c7d666766110256eac0694b3565b07124786966ca81f1ea5a8be616544d54f03c5bec6d81b392a723bb1176d94c75b47cd8a00aaa7836e1774824289803df38c0f6c74b4c42660d1b27e5036c647bf4089b3be19a76dd8ca518307ca92b3303253dbd9765bd26635f3bca865c215723c20358f2b4c487b008a7f0221359889dbac532deb2b38ec8f35a4a6af306597f09e1f84b808140dc31a36b1db11b13c23edc79ae5f1861dbc4eba427a62b153f721a543224caf3c54e15467057cbda9b1ae41fac0ca7658a542a87060a960d57f839712aa497f0ee03a9122315409279cc89fc6f5afaf72497f99ca8f3a18da1b7221321c87713bd484612204783117aa4f2219a9019c251c8f92d8bdb946b42068207ac04e0ea116a9d2cebb25391415630db5300bf51bbe19be36c8ccda4c9852a442d4259905628087c232f28871b05512dcd2b769179ad09a9313252dca243d73b387b279a1ca1151fda2781ab7757d2ca5c64052c8440bdd93acb5152203987bd5a693453957504242b3f8667d3c800e9a969372a13fd014715a0bff3a24c8f31a69c329a1c30ef37ca29903ce0943982413b0ba694ed53cb416f125151c8f036709aa2174ec365a56d608a2b54ec71183e2b4258e71adc09c81fe05065be2bd972979eef093cda03bbb82b6ee4180731c18fa997195d4917476427d7c07d99b663c4b50a9cbccb3c364df354685273b8b42b9e118a427c765b08036350a330be79b3ef4171b953faee56f719483717854b29aa3385545d3c9cd71b0a070aa2734f8327c095aff6b342584a570371ee7ca3f6a2a2bbda60c4e3aa264078b6c9bb206781f229b9a5cc2bba0c8933d01b469b4c687f5a1749513bfa3401cf1443ec0558c89c58cb795e3686640f6350420bed4b839ebc8106ff7043107c590c0bfb753c0aa2305e4920d1f639c3ed400a2836d3b638051b58ea9580390ab57dd7138421709759b89aab4279c5a9768cabfc44ca6a2f1cf5c039e2b0563a9048931f1565d164c13ab60e4c92ac843451cb75662ca03c47a652445b7ef0b8e622187387059a614cb08796d34758133050161743677594d51d02f290b3cd7f23d4cba1a64377baa36082249ad896990d79aa040a7858f1b3dfcb43adf040f1b245d216b2e23420e0b9613e9db6c7535063d05079c739f70759f7de0291537aaf5d6b3f4b6291c147855ea9a79ecb0ad80714520971011365dca81ab5bc0d9d70ade36a125ab2295858b79370fe21932504b9d583c787bf28762241a279663baa450172651f126bb20b85349b6344ad404e3093369569148a2a8cb7b7e08e68fda3408349b4761a171b0c2c85b37227cfa3d7c16a3950298c100955402919d14a71e7b231d60ac11e81a46515cf2f25fde507c0df59b352187af7059f3620026c84469610d0098895a3330f7638082d5b5a925afca637a1d160ecd2c83fc522a3bf40591fa5ecfbaa0a3b1859fc58b1d157c18b71d540b6aa398179bd65dc00866275cb0473964ffe5a8c638bf57304d32e24007b3c61429881ccb1a0403566bf3c46d8a19e852aac6f58d4ae32f45cc7b0f5181f18675920680c2c0ba8ed283fdf20c383bc08ccb7d46eb85204126be034374769caf39ae633924bc8ba6b7b89daf72ac4a86bf86008c02fa0fb18a5de6f8952eda2526fb1d994b4165149ed11b578359a7b9d0bdd7257a2d00b676268a38528fe34140eb408ed5b916c0c43d79ac29b0946702341cd7c20ee23c16a6b2cfd1f9107872b8965952a9a45e0e435c56695c819b71b9a6b6796553271c029d06cdb0308112a89ab4b714566a4b18d03c18d223fb6427c7b3144e64874c26a8ca418cd6f14e4cec2a0402698aa1af6ef63264806e4b42ad3dea298a404c1ec260935166418068edb71abec21040f9b3eff4389358b7cce70461ec8c0ae8873a45504e8688e266787421343699089fc31f84ec95a9f2264eb3ceda71261ca791d052a43808ba1f4706717a10fc4ac21b625fd324cd86ab8b3dc254da31bac0f9106028258adca5f754b309a6c7dd30e11b8701ef37e8715f03c0d8a32e9fa39d37e7637ba00940bce58a5d05a4840f835b8ce39703f77bb31f20b9ee4fd3795c2e326244208b288c64c049c6dfc0f1476cffd520b055756162f7ec94243de6b14ac0b9e5fb366c +ciphertext: d09bb378673304cb931ff7390ece8f2573c1cbb9275b8c26bbd0ac09db08c43c0a9b77ccade71a051de7be9616187ddb7cdcc3382ab8f6bc6f52dc344a20b519a7adde7abe4262e2f1642b96c687ff873ce23125c8b93323f213dcefde61faec8b976a27ad4994887e92f0f69bfa51e8e197ac378e324307593331ae293c91ba16d4359c7a3d43c6da57cd988389d014c3c2bb6e3e7ba6adf91d076a408efcd265935fb6332a77595f7ccf424ff11657962998e0851db1ce4c15db64b7db28986c272bbfb34fd20e239c7ef3beab2e101562c3dac28ba965fd5c49dab3085ed0cf327677041cb38b9b509d08f4140f7fb977bbf1e7bdd0b86bfe4d1cdeb112c3bee679bd29165dc9a81e7b1d9fded5b334ba7c3066203731642e3f1bdb606cfe2855c6eef1908db8ae2d3a7f4cce4e517817c696ac5f71f2c83db6f499d019ba3a1bd0038b7aa074eebe4e78e0a2ce7919bdffda15776489ea76a90246e5ef8acf9d38e44ae3eed809c1da8e2c805012ebd83e3cab063d6084b9aa4cc0c8fbe32b900128789ec63397d45afa6bdd7839c006ef3d9300cc4f8cdec1a565dfeb8afdabd1b2f16a67ac789348b6caa780d96f0b34bebba3ad00be9231a1ac55ed651259573015133549962b5288cc733431da4aecb190a8d43fab2ae764e770c735093ab4bb61562defa7ce3097c837f15c8ebb3097d0ad7e812e24467965938eabae899f82eb417132ef67e9aab3e8bb2c535edea8db70cdc450f8f4f100992e18af931fabbba58d9558afd20915266d71e92d8f92ec3f3fe455509e57bc590857edec1873fd1ce867ebfb06cdfb910607856964913181f86ec635a32266bb2b3c497723a0b9d056175f101d8258b60087a6de5590cc73f8b0e68fd04e187162eacdf2a5f0e8ce480ba8b45d1ac9e003b4cc1307dfc3e6e101a96585bb9533e6a6e4d0dbec742f73a032ee0b249e97791128f63c774c0203f4c19152302127ad848f427bd90c36126cc3a1f8cf3cd81484789e0f51339ecf4582f6b13c1f5268b126a99490115d544ee00e8512f819ddd4ae3962109b9c4361bfdcba56baf5fe9a541d646da72cae1fae5cedc8e8a165790a430be4ff41a547c2a1fe5bb2a13af50f631afb24a55e90356179d91c922f276a202c8f7a837d77710116a85686512fed7878ec011a60f40ce808bdc75f0790d2fc9aa3dde710b31843b5c1560c8bd75cc6539ad939bcbc72768e4d418e119f69f5fc7fc00bd5681c49aa0d1d2f8f4dc39768154c10482bc06a894b20b8d134602aa11f1be166a15dff347b5a695e52f2d44ff6c50f371ee169ea64db848e1909b6392ec4b77a0658fb1243bbeadc8095ea5e8d81283e366eef91b0b2070c2e168dffc97dfcdd16b566deae57ee6a163540977eaf31774db72d21742ddfc1824eede5a9e72e9917aed7e3000f0ac3f48ba0be24fa86f62bef852a2d3d02e61e3ee6137f41af011b6dc185127913adf5d387d6298645946d205cb188ff6939b0ac696e4d75d44189831803257d3f07a5 +result: pass +shared_secret: 30abe054c82a82299e7edd52870f461ff6048daab627b6c848a9d4f1c4641a0f + +# Official test vector 44, seed: "df0e41d2f6f86c1f79d31fd5878e7ab434fc0af3a0d5f47d2ab3fef31a42bd949b0e3629df9f575befbb62e829e51dae" +private_key: 8b814f850315f33901f955a7dcd2971bb73d44db90b874804457124002ba681347b4dc33910ba22a903f480859275523598a1ff7cb818f8cba2ed0668edc45f1997f3e76628767b63890c35d334f209b62a208700820c7a41689a4c81208b05573361dd30642baea86f25bbc87d1157f05368582aac0958e87fc84c431bb2eda3c479a9cf0984a90e668427046f2946e50a43e3889aab5d649b5a17242aa6d6350a1b72b971a748cd2a0a6cababd4f77b6fe905ef270bf222c1b5c2683165b9c87458f849405aca37dc8e99699128ebc6317274993d74c77cee907e536b1a1871d1f8a3505670cdab00080db31cd0ba9269c84d9ea565d194e22d3c11573685b166f02245efde45f04ca2d851aaacf47c711a536aa1855b7693161f27e51eb52cbc1b6322537868386715b16c4802d2fb43e9ee7c28c51a5fbbc1fddf670e02cc3e24bcf75389651268e4c78949e284fe9a2a0fd3428875c7d4ba669e1f7116eac952640b9966626a867348022709cb54b05704c136b5538ac7c6e018107a27b1040211562cb1183714a2c9a634a8bd547965fa04fb62441cf7601393293f669420dd0a04d18af0c0249a3b57e0905758b7073db3c80e2634366285a86d6aa7fa8561fd4a6ed745aa04872fa7ba732c514bf045445cc4455accc40e499f71a2d3a8ac73be9404f3736908745b1c40985e4920edbaa2bb8933053124c4c300f7302fa634e6c6830b3671fea4965d58aa5c653682e88ba5ab34361409f4c1656f1772643f71134ba1b1471192de503f97868e43a4d4e9a2bb2ec38ecfa1835f24b3ff1b850fb5f4de32f196377503c25ca0989703b72d72494a2217276c9a15b600bd4dc76585774b2512da602553807aeffc5c6e8f0187bf5613d35857e7b4a1a4b805946224b4a8989c0bd4fd445cf64910194ae3ac96cd0e22144b9ac51fab7ef671b6af68d7f5c2a3b48b82fb2cb49722cb5b668ad021240871307b185b6426451588626850080d68a917b2fc3720dfb33c365934ef37bb5e7359a6008ad72d255b4e921c6b1926b917cc00c03a286b8489a53b5a7429e1cbfc42507f33bbb5ce082b58cc550e03a41b9cca243506de21f3946019dc87683b35caca42fe8272861b4633044773e5c399f8c6423922d05c528af950b6f6b0445d98c5243c932451303222e8a8a55039b34c2bc643582871236553f96b80c9041400682f05c6795b64160006359270c4526baca74b515b224ab234a6b127c4612acbf82bd540226927675f5423cce59034f4596276647c6c8c3d53b54014b6596fcceb0c29609b50e1d599bc728a41db0c3e2a6c41ebc956fec70d2b58866c3c2665ab98b153052d917ebd9ba3ed037f62c8299a02f575742d7102fdaccce7759763ad2147df656ad878ceb1b7ad5b4cd3ee0a2320727a1051d74f84477ab5c2463cce42295f656978b470708a4a26f21949635a957e12bbcc9c8c83753ccd6781474b067099425c705d78631e69632dc5909deac940398b8a6918e2f69587a5992b354b54b7931d0b4c0eef60c61b46170699035ea014778a28d8a224196beffe96c06303e5f8ba659d0229df3b5ff445cc7019e8b54b4f4346c7107b651d0277d8a195c59ae8afa99db2599004da53ea126e94c903605aee44b3d56abab69438320c91918abbb1ea2b6953753e475bc33c159c590bed80760731565279c640d361de46aae78d0a837912c66c5a347c0946f6943866750c6ac1eee713cb8636e543b2f8a08857d53834233603391417a23c88b6003246a0c8ff39edfc7ab8759207dcb7c1d923ad891c31ef564e5f53c0447a25728c934303bec26875c44a26aa36e0324ca6423855bf2ca04e27cb8f42329a3a0e28a7285658fe1748a58c538ddb710c6d7839b573b30a5c4486a448dc0bab7c07b86279058578d4a56c781752e8ab270914534c51923a6d0c226967313695987314975dc7c7a101578f326d02a086513b2608a8b58ea5a63f2c6a1cbbdc847c312f5a2309c1749c349101a42757073224b0aca598a6a72cb308a010c327afac94798f8b4c6a1279389c12d1c3015b02e37a95705d3b2b8277c2c141bc8148c94244ec5c50e65790fd6e0842185a5f2ac1e72a21d4d652a63001c650b6c8d06cd758923d42479cba96d7eb396803c77be54c831063707a35067b87b2876a1a0844d11e1a895db70d596871fd1434798771b487aed562ee1d041c06505786205166812fa718424708a207cb4a6c25ee78b8b85e869bb82a89f647a813b97dc1abfb22b430d37adcb43b7bb1616dae73b0d606940e5af7d139f73b48b4618bfd5c22274d3a27c20195794344eac73b9a09de5cc4e59a2853a412eed7062dad16b0e1aaeef83221d34b3225868da033822248e5e40a692c20ae4cb112b9c4f9e373d6dc3393f385b5f65c7f14b66d7d0b31dd7902af39812d76d5ce73ebfa4c392b069be694bbfcc7b9c0825d158b431898c9cc9080d632196378049a5a02b43cf83d37e4a731505f23009661070038917a93c452004a8023b1da44b4e5cc53adcaea033c8759a3bb4bb52761191d76c95599a9dc2a2292bf37aa3803278726b660233e9b476748a31f9fb9f2d93b59b9cab33356782a976e05b083716262278349fb14b806a7cd3e52c1a6a6f603468c4b420cd544bfa916d157a21d15c1945b31f7c6285c30529ddf735350c92c546ca776cb44360cd62f05620f8b23b94a0a720270f122b0f22316050b7cf6623cc0658a9146861785c03fc4e0833c3565ca4ebc951f5145e2e434555d45c3819ccc4c2546673c18d70af49f0aeaceb83041556d52754c10b1d66b9c0519985e9b0aed559074743c8796881e5a189a4707b8923097669b2d9a162dcda33c3b825e004aa20b1749eb198299476bf45a519d341e9b507b1e411bd5382a6a84b6dc9c1bb437e98546074076ea76654ca6519f7a71d1f39c5328b16a5b182bed6b57ae058c3201554d612628274bff57755022b7e653dbb461958ca3eefa117b57299245a9917158f2409384a7b234ab390152b01d1383aad99747258c61bd24f7b12a0332c6d7b5ace324b4e1dd9b3f8574b17382bf387155f0abaf4fc8830b7774275821e91a939da83c9c189ec08774c739fff041d40d512b171c2d0ec7e404349bf5a64a876aaaf72c9c16a004578842bfbb6ff221debdb6ffc8a6de429ca0d7aa50071bc8d68c23c379364e56e4ac247a99523f8d90b3de4b049b526f8961621b98dc534b9a756aa9c4a1b2b4c7726e701ba03d885a39d59a76d92bba31013f2a4714ea3840293675aaefa1219f8794d114bbb004463f9c631729734cb430f26f38886537ee40771856eb77e4633504899fcb86c6a3d433d0b8d60e26f07bd61f1d4ed69bd +ciphertext: 5aa4685b76a5cceafa22c32ab22392c40633343d04040d943150b99eaeaa481849d61ad30d813096b80a057b7cf919a261945d81e9806710d31b288be2e4a4c64b1930f4846e72798a0eddb67b2c447eac1f14ca8e0af01e99e1091ac30ca410dcb7eb7c992f9accbf556e0f4744d89dcd2a91c6624324a18cf9b6cbb4f4d482a671d0989ab0ea45c8115aa5d66cd6ce7d8dbf66895a3620075db3e2ab8f3a6a511ce88c3006ce3aaa0237f1d28986b5ee5f0d77cafa7d148b43fb1b9900ef24c5fc81bd4be5cbfbc3433f6121aa82ea014f7ce1823106c4b7feb9f894fd84064def9af7984cce8ccc62d1902c630b98047d7242116fc5735e6a5dc1e1b014eeb0815c056505529de4c6174b06ace73c98c23099556802a3fba32c715a3a6b62dd4dff023ff5a51ff62ce9acb7b42c7b6a5cf2859e04d18c1e56c778986e3c81c6b44add109b09493f318ce089d7641d84ce257dc13060383015b9e39d3988a1a5b0305cb75b088a7c6b0192a2a54e9a3de472b86d9a8a9612a19686d4a757cff8a8eaa192f3feaa4bced756090d4522309ee5c60fd7644363831b97bc5eeb095d9cd64a5cb97fb2e01e51c71c8fc745020fb789323bd2e252a6c52024908d387cee4c23d2f2cc38bd82eaf1a85ab9646856c434d0750c578394ef48958585103469ad69fcd688a46479de7d227809ea8b7cf9330d4ec5be978a1d2dae5b070b64c014d339b2a180328dc2a36cf83d4f7d5a2675099d2b35c91df8e4a611f4bc400a6b7eacd4170b9cdb5d5dd82dafd8ceab075f63ff7f6c16374ebdf38014a668a6c327580aac261e2194a2ba711fbfca6f73f35b2ad9ae7c1e7807c7c038b37f09c8be31759dd48267df69d00a2f6d6d9b00ad0d34fda09fc740b664e4ffdbe2971a1b88d0de74812827058f702919f700327a153d467a479e8cc06b8fb6264d6f53e7b8d84ebe4060e998a4576624937438452ec7f82ffe78337c2e8ac8ca790be987ba3bfeaa8495cc46e0f914a01b8af50e6b4c420ddf78f5d79b19575558951a713e09a447cdc52965afd3ff472a14203d393f15ba0c77bc3784b800aa78c389e3956ace626f5a28c8b67f6d9d3b7ba5c6900673230559312d4c8fd5b34abbc05600300d66ea2c8760676c205bbd6e63b0104ca3e30da4f2d7337f2dc28ebaaa7255bce5b741286ea3317e73d060babeb383d607345a808754e4f2771ff3205eba4ea36dc7d5b7534fd32b8701844d2994befec0697e4d3227813625e5d3f46b7892c1ce63c7ababb97eac2b06dbda7e460042c5d075bfd6c8b9cdf8db87c5d416e0a67d44d27338f73d5fea074c94dd5dfb8b50a32ea3128fb3432df47495120337952b1dad75b4fbfab5612c42e20ca2706728af9d89daf053141b264c9039299972ffb75c38a16a737bd89f88d603b5d83650a1f585b72e0737818cceda2fe57065f0fa2c7358219227cfde2d97ea5b5e32e5325b08792967ab8c12772a8ba9167e41d86ba7bcaaf548e1c2b0701fa1daeb45a86f727e7d91cddae1 +result: pass +shared_secret: 4b525f467ee0d96c1f4b899a114936343ec21c74738b05555b2bab9a5d0b5513 + +# Official test vector 45, seed: "d3c9ebba6eb03ccb5c9b9d2c8d7f0cfbbf50841e24396cddf0e56525b38918c2fbe6c34cc1b93f7bcd4f4d5777e1a488" +private_key: 05e74ae857ac16003fd911741a1323a9621de488789eb612908928e0435aac49ce2097cd03ebce2c8c0aa232b19bc64e81d38750395af4499de139be5d8a4152b66a56067cd9a372c667ac143151676399b516377daba3bcf2a846074786f934c8c091921353779b91c1a201cc293a83e11bac68c3e68350a90c13d65628f379c1e181a8a9783b897102be367cd21629d198c39686c02339cb92278ad1d17ce563797e9b4215ca88a37a9379ac6ccc523cd94049225b900ce145950cce099700672300ba71b22b7a1a01d30ae26975fc53795d2b49a1620a80d0076ca983c0b8b87e96399fd6869aea85d35159d5a9872242515d230ae0965d5ed31cca22a35b33c5810ac4737481b2448f324b7c208387ac045c0b7c9b25a678526857c34a7748c443ced32bd4b7a2155ab7d67297c67080f507ae2309b66800728d661472692ac22063f3886e111a5176387fa410422bf571c79a4d8b764abbbb56ef845ceec23c8381671009c1e983465e090ecac84d3e7b567ca59e5af8477ea89dba3784308c680033c3ee65b670aa43fc6932dd9692dbc8839bd94c89e85e20b2b9ff015ef85a2c9dd7208db5815e73a4ed469d38a967ba42b2ced1c959e400aaa10957010a23fb7e086b82b1e1309b64977a77b9f6bc15c92149e3587c9bc5435d4a50a62c90dfbbc339b3467795bd3e125bcc6cc83b797d4d7a6e8701953a57cec99b8c7939697bcc488f0b6601dc2f31ebca4b15059f12962e153a164076a9f6ae88cb737b8ac4f5eca0fa8b3bc9d03f7b578c8de160daea49a0211c7b007a37cac38ee02d07aa48e355cbfc43a540d9096dbc5504949239cc0b82d94755c4ca182852d56b9b9819c42b6c22f3246cd4a879662cc901e4904ef791fb34c7423a23876204618276e45cc8893b15f5277b67c391177889d8868a8c14949b684467094a9e2566bdc58b00b339e3b91fb54b63e1f43dc57a7f107cc988cc1d65e456b85325fec11db5a7c947fb1d82631fecfa57dff3a1de5ba8bd0a5c2004cddf442699c4acab590730c8aebd853a51a8ccd68839f1ac397ac4a9b6f54316537bdb99879596bbd2f517b296906345a2517318b4146d4afbb7e1c1bf377337c6b84d3363b49a7a8937cb58db3524a2525f2f2984598797b835a41961b99bab237077a5b6dacdb161c86b19469e4b99c5b552c63c3f3fe3140770c369c49e6f696f11639d625647b3fb9a38a0cbfbc01231c2206975c0c7b931597881af2cc267da7f5a320eb4408df9e39d15a7558429390048331c2109d2c46ab7d16b0412c1ba8b6b1f9b58a47c3d54564e70440eeb43c80abc8d67792324287b3db329329267f53549b6a72d94d9bbb2a02b7c985ae8f4a5c39218cda99f6d461bd27723bb20af88446ea65a7b85c074cee48feeb881ddf9773c5c6740a178e1707c50788478d3500f6aac22b0be3ed5ad240a9a336378af185dc1519c0948cbba81790da7929ecb464406cf618cc019a84868745591496ca38ac57dc5010ba815b24507ace51edee75dcba3877179c4cec474101395d9f831241c2547487636d39f1c6082041ba679b7a1b1d5bd0b295eb137ab4b210d0149b4fb0c8df5515ca6d7a67393a9f5b57aa7c9ccf796828b704efbb194d5d895cec082f5dccb78b59a61090eada66093c84267079597c9881dfb2ca8fa4cee6682c4375eee25a08bc0766eda05bedb2cabf734c4243987012a44e86cc013b7e555bd15d45306479a78ea7d4fd7723d3b074860914e24395b264d35e57867f0229912c6ad0238587355b44c155bf7b5e5c872afeb136bbc32b1a950b3122f3a5b71d8c140940b1ee62a5543f3b61719896499721f5466f7b57b119568c960a3796bbf2c8877cf8a762d6a8852619abcfb85ec7c6e79652311490b03f61bb18a23fa100fee70a0fc693163b28ebd6505773324404341e6c79b0562207ec1077cbb64053a4447866efb1894a6a544daf283474c6e0e99323f962b5cf4667640af8351059ab42e0925431d864339258752a3b08ad52f985520a1247af44366f3377d5875589ea9a8e38455a3bb5ffc29083664cda47988f4f0c59622454a7109a6722a77703b0a69a4db2ac154d53a6bd60603e9be794b0b1b0b88da57a64802ac771134b1a4776d07703db8746e610331ec3ad3926891c05b4b738d3564b79b59287174696d119717d3650aab049b401466467ec352102ce597f6e867726543067acf511975828799f920bf139c176fea838144797e79441af218d9c2c0f15a350ef82d588b45b86a2c58464239c121ed2a7650d2841eb21dd6547bd32c0e4d654a3823c4051609ed49220c2651deb6b0e55a00d261caebfa9c17d82d5f23a111c391d06c0441102c2745875d6905ae21412c2c14ae51c5609c5872828ca8d09239b82abd602005cc66ddeab736db3cc0e946d6232177e6c012a8672bd62d0a4253dbb5a908c42341503b76d428a0c38f7e978d4fd2532d075c08d9cb3a440018b323dc3ac28bf8875e412745962e512c0e0e81b4919a813766bb020c831ce0c3eea5a496e57e8d598d3bb34733b6358cda44b1960e8890ce525578d100257ed8a916a02fa2d8b59478966835c0603a8f48715ab2544d0fc487a7eba7a96a6e3918b9c9cac54c841c2899cea0312b40f9bd93eb7d392a4cb889144c224a23244067a9712ed9cf52a15edc35895c7c121822468716704e3617ccd59aeff5120524495d44ae3019adf7d25bd7871b2a98a17ab6c68c789174a28a4863ad69362fc5982aa68b3c0cf35fd2d63d064556e55b6df0d636dc5ca56a928f19c61816349c6339c59febb2b8675807a6a9181a91620a684dba5c4c596a821b66014851966547d60690f7a805bccc4bf9620c188495795c3dad55c8e7529fedc92ee3192a68bb9250420f6ff04f939c82c8442350d40f9d518c10c53ed5c3539e373d0f955d3d451e7873a22af2aa87c08105c044613334e6b585aa864795e0a6af988affb2b2eae653be5c76383b66f5205e1df2b557b66b0f9b7063d3039510ad13a9b5ae6bbae433808db7275271917d75524eb2203202c1f0b4c9afb402f5798214c28667d28727f89b95d3294cf38c129a792b16161e6b9eca60c18ed802c72225d585c7f59059dfd74944f764035c073119395478651f88352c204f89222bfff7c8bedcbb6be1728ef74e54435b40b22276f1199ef34673ebc70047956a543f3d8569f334a5fb22b4c2bc34aa9a4b27a11795a730eb96003ed4662f2f0344da2b88e634672fe48e40ec83f4ae731342e77cdf4a3acadbc64e263f1afdcddf2ad63f2fcd19799a0a8f43ec867477e249ed5fe716f8ded5edaec5de3bf5b4d7c2f2e18e87f499c1968993eff196753db8045e2c8ba8 +ciphertext: 0924e57c036f105436d1eadfbaab67c55fdbd49ddcd120c08685ba7115c250799752ab883e52ef0d0c4d9bcd46bfae3b0b6df089894155bc34fe4b0db0a74fcc95cc5d56b9060070b8e475b96ceaba577832790c84eb87242cf30dbf9b9c2fd61ffc76f4894495b2f2060c10b105f9845287e9b84f10a187446714c968471550d772801214a50d9ae0d6ba97e60dd0e3935fa6e5b0425fcbc1c1c47645b5974f4906f3f67efb70ca30f01b30aeceb45bcb578e08fd006c641c5c23ad9956134de1e4b50941579266b95c092b96698b31eba48fa03eb2d38cd8339e17bc45df2a7bbe159257ecccfd09573190e53193fcc172585ba3ecc444c8bed87f0d9dd25383613e280185b145ae6be22dd90606edc02be32ec3c7c2759a9d2ba907eda6342aa9c4815edebdeeaa79538c440ebf3f7a3610e34aacd303d3338547dde1ace59f6749573847c1743694d29f99ccb1ccc6764e2555f51382973985f02db7aa11614a1202fed63445500a23b1285af9d6fcf633110caf23de2ae3a8310d7b574f49daab50988f00f7e2645bae92392c67e33c3bffd4551d5bd41bdddeda4cd105ebfacd6a56052653414d224becf74c68eefc15b1af21011add1126f949fcc8efc68f8e5359fd27c0662dfabedfa8481a04c4b355f2c1c31b0c9ee202391fdd4e3e206d96ee49ab52112a04203b8ff79a2db64f4034083b3854d7b1506c6fb2afa95c896432b969a62adfa1a017db9c3e7d3b76fb51e73f17c7cc762889ff2fb8b1066b2f05600d52bbebcc8bbb35b91e6eb9d270d80a995e59027af9acf9a1d0f80d028ac1f3bed3b3ccdc6be3a97ef00215ef569c000af549f4e31d5913ff376db11e4e7acf6745abd40fb3961a3758e375013c4b110e989474c91c8ade63f9252c09a8d760361b684424755c47a21d8aeabecec6d2bdc16d08a1ec5397cc1d0ea01c5ffb45b5faaa8043694cc073bf3632558eca1080388371768f41d23fc1a4017d0ce0bf51b4a85e6019c2a0c728e5c3a02e592287de10f43a2b9ae9e975afc4f6af27955b3af3416f4f89f818cfa602e44b8a6e32a57b07a567bc60accc98e00093d17d4b487a30301063118671c62cc5ff595fc8794c7c64386e4be6da9c580f3457630ec9e4d42be26ec0b9265891d2d36b92e3f13f0cc850b04f5079abbce1be7dea57d466dd858c0b6d5e15990a09c1f7d0ecdc46e63f857847b3535d28a6f05359205f45537f93820c7ac5e83f19326b8f727ff744bf2bcfdadf56a14412697ed028586fbaeab5aa16354cda157d5410c617520fc90c612c4076b82692364a32d9e7763d3fb16421f6c177122533afc75f915539a523c8db1ca9a64951183154111978610fdc9740466af73b05cd0dd380f39f94c429d01e0e4ae27ed1495fb9cbb90d0fc78dd28e23280efaf77e6ea6794bbf342f3801148aa241731680738de27ca171c6b2b0ab1099bfade25362f610022853ee07f68868b3a2abc899703d3553a6302d55d5b2f24112fe035bce7acae8fa695ebce771c458fe +result: pass +shared_secret: 6cba1b31809b333ea40f2f67bad438226d91bd61b08860357a840cbcc8fabfc5 + +# Official test vector 46, seed: "6b3996e8bc6f52879f2b7be012c44ad555707cb7e5fd8abb3457a298336d6fdc9eb7853008ff13201d5969a315c7e493" +private_key: b6f76178bbab01b89443c00292ac914d658044f13fbbd19cd4c0a385141c6a91208665bc45c04ad73185e6e3a0cd102a8cd20547c2335ebb3bd7e9ad50294b07d9a45e617473814ccd41078fb58d2dac1f872c6cb96c73d1aa4356a917c94704a36b9ef791c6c021cf9ed2270685c645a76141f6373b8ab6ab18963b580ae0134d8b175382847811a590080a3dea2b863e06a0990c93839906e2f942b864bee7410bbb17bc1db6373ec99b45754ec78531c205919c27a4f2445b8a777683819709c1c9a3660ccad39941e496aa791ff8d2671b74580df965d0126dc5c034b8b01f31179c1c4746d3820955206b447174eca321a5c22ae852b631e12025b5675385731ba9234ae36cd90c3e16fb5ea2494012b96498f02edc23cd0db74970961fe430129af1b94ad5b1bd95931aecb365fc257c7c1d1668164edc9d2b869a4cc95d54759182c6086785246794a6a0f81431d75fc7189416a9b1efa3832c187fea912474a8a4caa5c9d08b2386240a3d26755111a3a3e830266473b6e02286c10e23ba34ec08c1f643a8f2b74519631706690fbeb5be8bd581175412c1b83da81700ec92bd03b9516a779205c78f726126d67ac2a4c528663acd985296d187c7f6e231a95707d0f9854a4c051a12179678adbf8285b5e58251d08f2da015bcf219edf39f6be56e53b95be3165114616175a5ab44607612fc40ef814c9ba52b6c060c0f11adc8234d865282c3dc5e106753cf221ab2996ab9887ed5334bc7b83d6bb413e1fa9c074903f3c94c685c660ab00a6be85c384478cb42bde6715c9a3bb77b7acab909ce428b955476c85f153263874ca3a7429c6a79a0834c15237dc5fc7a7620897876a3c0970e1b7b789a13482a38c5455a187995960806304ce34b72e676fa589f9823c949981b6eeb887bf7c09ee147645602a640598bd29ac48c94daf0771f46acacaabb4bbb73e841b4be5ccc886987b56cc6e25a7260b3364ec4a897ac22816048756a530ad269759929bcb4ce03435784b25f6f87ca320060d2a1b3b800986cea76229b1d5fba58afa9ac3514289a9b7f63d80f2b48893b376018a0baedec2715b01d61c8cffb63b839c4129c8b97acd904a23a0cc5a38245802ef5eca812870a5717c667ca9bac328f08305621305e5d40980cb7a3f8bb01ec4469b7e17cb4657944a739448a461de11e3bea1d7141a6b7dacf8f41a8f9c6437a9c26ad5b2dffb4974bb7762c76715a9694d5d012e2254ea717369766c22cd9938ec0a4b5a88e7c45b03027926984081414cf7b3a15d46895c362a0a2928c1215601f665d675abfea867957f68178e6621871bd7ac1010abc494517804e68be80151c0aa332102822b0674915208afaa21efb3ba32b0aadc9778869bbab9ad2cf934a690f40917593667cc2ad0cab53c387957ee24960149b07a109465c5de3eb576d99481fec4ca5e8a0de36756f951896322d29c5adfd124c867a5286b59f0c2a0c632c6778a098d39c1e6029285a821c06958671651804e75de2d2414eaa19d0a18003c12f74d50655041aaddc6f5daa6dca8b46367c63bec73ce1e181cc166efe3baa2b986bff325187369982978cdfec651946a4995a20b48b035dbb5eb854a0daebc2831a4f20695579b52d3369af228842776a03c4d3284d763d1f663000930377dc86ab14486673a349d8073ff6ba44496c64467d5f531f5203a074ac7ce9090e59f1c308d2c755910af132ab81b50ad6d6c2c6716190696ae6a51433f61185a43cb1d23708d8286d066b61a6b7f9e13f8248c232d8315f40053fba0d7ffbb4ce60410899200a8a5e51bc1d8392cd56f41fbae85f35b110933a931084444036aab790cc09b84b7a235f34763b9ab5c9b53620f627778c661c4c45b36ebb3a4565795656227fdc280b327ee2f96c16e7bbbde89e9090318787b2abba7727a393cdc04dc38205e3c86ed5d5291a1149ee204b24661ab2ca16c1c0a35d3cca0d7c57f4e01985242c3b43869d9914312678710b039be4c2b775cca014b1d936ca8432a4614c4e67b69620fb49cbc787599c4bffdc3a2c786ba876864e7a5be33ab200bc2d087c3e6cc642f4a96771ba212778046b5823085c4068b209c54a5bd4153e4d986ed3512d09d40c37c1a2e57495e0a594f4430fdb1c88c4fb677b007d8804ca114c0991b90b5140761d59325502a1f0476e961a0c2b2ca78a82c8b5581d98da26de717f84c140fed0a00221ba71c34821374ad7c565ec20cefc949e98d1819702a4d38597c1db9239b9167dfc8651498927bb0e170c151e881577f58963593d3ae00870b8bb9fa3b77c468e8bd365dde088f24c2577c5aae2f24aee1552e4482352674d1d96b90880336ed44f6bf007b5eb67c52a10910a9a3fc82ab8d50aee17b667a27b4d014161f1a60c3084a25524693364ac1876cab0c93c01a153b03486e75c3a01728f625f9a7a6a99e78ea9b77b01490ab49c6dad9ca584229a8a890effe47ce0692aafb17a3db2b855a01666514e8a800a47c0cbfb4872c8c8a4d4bc52c8db43d3f7360d568f4f905ada2565a494901f229ed51bad9106bba6dc4fa7ac59a3a5a64d033be1e47c36c2cc9da10a2bd200b681c2caac5cb1eb03f36455241367d30019aac00afe312c5323cbb4575e271c01f09c6eac03ce1f02bcc4186768493f6cf97671e7a02db6047557306bb8ce086382bbab8312460663dc1bfd01b2411b3c49835690627f133935c27308be6b5d09844f477523521c2b1bb1c92b6b3c46c20cf97217683a3f2e46b0151511c7c9c4bf8620d4706ffaec98e524360986386a7b5c20c312c5b6237bd17271bc6c146124d190205f468dfb00bae08318350c1aa5910a07a67bf13a99a52a39b2b04fa56143c0c1290c5c412ce1647ba8242c851c8bea960c9c4879b83037886ae77b10e8126dd3b633a33a662076cea326765d6262619b8d0c8c3217435450070dbbd67404f5255b6557267178ed99cd4257768e728f3069bc29f8484a127d84098ff4325946371384463c4ff489cd8b6eeed0c5e3e92b1b988c41a31df71047cf78ab1ef9adac2a1ba3121672505ec77b0620617598f84d1fc7b00fdc65e7ab72274c86a424746dc74f53142be6423545d02d581933bb92058563279e522ad8507f4326699bf4831970775640887e875e1cf29a09843210a23976941af397a3c6c5605af133ba94126132311224388f340448a1252c5bc0197b4699aab73a4237d40204a46103bd605bc698111ddc3d6bc04804722c35600b001c554180d16628713bdea10cdf5ca1708c7c6e354b69720b4b4a0c358fe9a6ad3febe78bb2a71691658acae21a1c96249919cedc2369d8d739ab125e0d2ccb82dfebcd90240a545cdfe07511f2 +ciphertext: 2150f944148dec904a5077dd4d82ed0d72bee1a3dfb6d7674753e2b50cfd6727ae71811da5ed2ba0bb169aa8a4883d286dea2213ae9edab0b24c342348b20ff4c5ef3a56320ef7f2c104a3c5982ba4fc3afb68575223ec0579339be4ac6a2139e8f8838b75a0f8e90932eeef2633c8b14f4661a7bad5414513075cb8053afe34a2c1379f3a750f27d7c46bee74524245cb41a221c48c68dbee3e78dc5f9f3c551fd830d6a40d4d4fe75ec31d97b97ffc32e032a75e0466562b54fce7d2d370c65fafef8b66e9a4fb527c7b22213b22c137650137a64c53f910a2386cef26e29279c16652ccc0a81da0ceaf494f32391c915d79a94a8ab7e4fc3a4eebce4c5a0b4ed899f24881263dcd74e3b895d353faae4cf47a1c74299ad8d435cb2c927841a86e160e88815805fde2d3c9f487754b1fb8b9047057b5bcbae25754f90c8a0d1c7b8e9e8ac03936197136fd189f594b709d52112fe9ea335dc96ab2ec87c97d703994492da1c1cbd20994c1762bad07e5dec98c311156687128c76d2ff5a5c7bb65bae29343059f2c10df3e9239392769ad0f575bad34bd7213f897d3af45bd299e8d6b75753f966317cb5dd821b5a8d5bfca74871d210b2c184107fe9109503b71644c8af5bf09097f3a6f0b9f9e26df7615d503634533cf4111a5487f205f45610c777e2fe6bf75e2100c209ec650540e734d710f0a0a378905f59e8b6c19d4847bd2b02c4366958972a963d4afbbb18e55adc1fff12d07beaeb27598cfb98833d02870b902b0d9c587523792b443c453059537d0d0975b95b8ab9d94f41b6bc0e344eac841eb7656d4c610c80a8e0d0b659d1be91279ea59333ef5eeb4b42fb0a4fded5d313bc754605ab5d8740716bc1d5c9e18a998d04fc4031fe5225ab6046678777a740a998118fd7b09504695401bfd27fe44140484e8bba45e12bb2c09a3cdfa578da8c7e46bd7817ffe1bef08a5e9005950c25e2a6d467eaaaa44be9abfce7e8bdb55356a509c4df5f6aaa89dea332ba7c353a6035a4e4ad6b213366b49b4db22dc73f93a336f7dae65f20a662bd25939811d0df9851d21a2b7fc8fdfae07dfc136a7ed64c1a7b88ea62ce2093025acd1c0eda5352a15c5a95f197a611768bf0d59b72c77cdb03420ee070aec8fbed53cf2319f04b2e72d742c930cdd7b1e9864474c60757fe7cfde9c1d2760ba39f1f8ac5a2dd8edb312fa7b34e22c62c0a66c5d64cbc6c56fa0461a4bbc9105afc9c3be7bf62379a392e1ea49d62a2f91f19fe1aa1168138dd32d42be5b2c7214861ba4873726cfdaa9628f827cad22a2dbf34970fe8f4238b1c9d9af380f378d0273df041cad44f056ed08637e4a178120cf841cc8e8ed0e797587d11019b4b6756fc47803d0480bc325cf9278f78c3e00e534533c742328ac2eb2176cdfb782763ed50e510b92d56a14afa41e00c29e3e18dd037e2d6efd6e1d64e9b5760bf22453d850f9b3e2ed63fc9be5c45573d79baf8150976243bec8aaaa217aa02d707eebefc9b3710f56ab84ce72 +result: pass +shared_secret: 8087b456d37e6aff785a0ca104cb03ef71fa2d6652c52dcd86220cacf878afeb + +# Official test vector 47, seed: "730b65ece22de27d573ce3aea7cb021c415df210d228808d91d4f380070ffcb0778b683c71d4853deb569c822765f2a3" +private_key: 48f2003d718ae6848e47937d58e68162209b6c88892c931b4cc4b1ce0a0e762020495c60e89cc854f72444d21def3a5b96a004e2d9ac9b110aa8844dd02a4d8508b0ad3c480e37196e343ebc01c12cc2ce6616cbc395a8c7e02b19d25041165832584742a07fd3207dd3687c91d17e111a945985805fec8836231b7546263d96302473abfbe36fda05345950c7dea6affc45c87a3272e780a3ee920eacba1fa17500ab04a091fb355d906430cb4bfe66697a09cb08f992a3cb9b2f31624726b13223122c5694d9e0757b65b46682694c82b862aabf3811ad14db6a31b602030498993b8eb5364f3c9213e66c81744b018dc895fdfcb81a77672e71b320e3a2df75403d57c229e745310a7cf780291fe169da8290ed96a2056995fc7c59cf6cc162bb10678736a4f56af0430e6c22419a6c3535b22fcb837bc2214a1d83a6ae7414d6521149498b0e0841e7775f1e783b376c1ac39067db769af6e691c59683114c7420fba6723bb3ae5a137224ba7e816b5463902d21223064c8a8cb10f49abb765281ec372c647b862f11095b25a41705b9b327456a7859c7033691353eeba926ef880500f34fac746d9e59bef7b50457acbc33369f3f85af047bbd75a40cf62ba1ecc27cd5a6437bd28c37ea3739a784f068cd4cc68f0cc6b01e4933003c950985042b1609e0a748c9f87ce5099356ec846f9b40f6c13a6187cab40b47d04cae05d43c53956ff4553f62761068e9938f21a24734305098caf7c9022a8b52cdb54860419a532cb9750c3e439a742d9031076b99fb8a934c2c8a42430a8e65cca75286518cc08a6925c2e3b9fc854d8343b36d652f37c339b951b0f7d774b4da5171a96cf6981f1848703dc93f2ed6bfda065b7ec4056632a56a549353c12c0953757b2077e65c93c00673e88ccec700b6d2307a0609ae9035177fc41c97fc32d1b8bfe7266ab8eb2b9bdb9ec6692f7d6678633b030cc19905bc46960ba25ac8b9da762165485a7c07744d1b8fcc080993d0bf86496262f268f19b7dd7d7bddd4c947e1146f2196ceda5bb53137fb107560c4ccedb96351945bb8ab5092c9975db266e621c53c519caf639c80225248e6804d78108789b2238644f33136e853c26e1477827d3797d7c75a09044bc77b9ea05bad41a1da87a460e17779a5233a080377294a1ba3a99b4db42cd42893b937c369983811c14305cbfa0e57c3e4b19f0a77c4a2a6998525ece48cf45635c5672429b67630e603d1ceb5a22e429aff58c2ce61e79f6780d59575ca3309d559cbe6572e0671af2259a39063f628bbcdb74345af9caf02aaeb0a381e39a5bf08107811b243d130c482b0c74a47738d9a6c5d30538e64cc513160d9a8351b9ce82521ae1cc03c8a48f72252ef1b2a15e6785e639246cb8c196f9949ec094ff6639c8e216b90bc3c2099bb3093ae5242f252807bdb162b3232f3e7383145655ffb71ca43456f1a5137e7977ef214ecbc6113f198d7712178da090620a9d343025ac11595ab6b6844262822b128b8826fadc7b3f218d37941825733f43ba4cd99b63d26812772980679c3b14462b762ac8c3e8942a0b1d4ac1838a2795113c365a535d483658c4531a0ec63c010a2c7ec159add1cb33481d37e546d75b5398198a82126a7d306a26c7124518075ee6701d1ca69d16a867115582f22a7c382bab3acb5de50c34c13a5378b2b1415b5538987a77681597abab9a0b5bfc7bbd19550064489be9b897a54fd12c7229f0af5313429fc85f1936b5a325aea955021a969ae289657ba4ce7393477afab3ec0b6e46bb7a8570b2dd4372d51537ceb3023e477a36bc2b784444d0f71c3165395ae71f98921ed160be83e0572487691a43128352b3d82b223c67b33d8277b05c6c071418799583e2b87c9c2a81bb2a7658d67e637b99d5770e04b592bd5961f0c726d0058b31086ab1d23f4d200bbe6b418fd53a0131aaa5fc0380f70f1c90cd1dd5bfb3839cff013375f49919214e756856042bb10e1252a0108c1dc39a1f69bbc230a4e9c93a87a87899faaa210a781c91bdfec9a59080ae642aadfbe20f9ec600a2b297c3394a751354b6e8ac65ea45d3b66c57328249034738ea2541476ab0f2717940930c8551314851be98351d96acf6232e1960b97d930e3f424efdf706c2da2f652796caf344b86ab388f412853a5643a7932409b476d3c81c2a301e968dae28742d18232efa09b81177dc9ab33d7b2ed5e711c157bbb123506fe35c5132bd04ea87e173a7d8ab5b2e35a7eeb58ab3f549dd30228dc5197f778359b4b9b9b989b697839fbc013426016110bbe721c1c89c1d463248887491f0814c4bfcbfe7445144b88cb4ec535bb85a3016891b009dd4ea020e3799d56a710ff097b79384556c5d7d717436bc9626cc15ea509fed2bbb74c2636e8cb4e0435283c7159d8c9eb6e11e5bf977a80994278161671346b368372ab5612c85ad48db8a82067acaaa39bc0b1f49083e71e8727adca1f3c7cfacf907a71c3c73e6737bc51795c9761b5c36c87b46141400dd43874c4500606c616d90bd9d588905fab9b538c23a07b9fba6c0699259b6b81aca207138884886205955250e3e7b5d4d549a8b73c0ff41b88c305b7efa4178695abaecb97ba46dafe090a81c038ff373b13582665665b2058835b629f2925ed99082858152433bc3bbe90937c763d835638c3225e0c3485f9555d3e1556ffccb1b059dff8667ac445b474a17f360a2dbd895048b29fcc003f3c46768668b88bc0053bc3821a95d5d49cf1510894f1739c91174310b0ab2cb7836b41bc44aad9681c0067192d4a46c2fd60e2323b6fcdaa15a6581b4571b4ccc09fae5b24d8b11f67aa629e79652388ce04b9ceeb5029e80341ab6abbfe38b2584b55108a21ac64d61636ddb2094cba91c2b606cf3d2ba09d4863ee900decc2d594a042b5a63c822631533a14b6cccaa0775ea3210e3ebb22137a749b22c1eb129c872578feca153b312efe6238583793852485fc53952e4a513e64b8ac7b60241944d704246551d3372ab9e60bd8411729cab31eb908c5348c34db74f3ca60384e93c91479a52b321f8544dc13620f26c9fd324784a294197d9935551ccfbcb93f9f2ba8fda993a3598a5d37c36469024129c8f3a081c9b3a680a02ec450b0a805da455c5f696bf46681ba9f80f6b469af9b1c09fb2bdf618242f449cd017308dd80a9fa7a3a6aa25becb6f07b241f0f72b345664751b83b46a276ec74aa2569b79de21a5198e7f0c3bc2aa84e7f5c79f4cdea5b473ba2d344bf994fd3204f0066489947b572f76e1dfc2e24297b210ed0aaf228788a0b349d11689e064bdc370460375a778d1a31d01c42b66367ed8d9e8f84551002f552f0e52102b5d +ciphertext: d378efc5ef259dcf2434427ba3f28dcf6d906151fbcb67b9c8e4c3bb098bf2820b9670676b6931202f38370b6e36286ac1ec05f4381867232b34b4078cf6e55d41ad44431be7c35d169436cbd71b97f160017a05d9c642e87e6b4919abf40e48747acfcc10d21ef2c309b1be596b146a6e4e848548f2c8c97c9293eb03d92349d62da60ab60f890a7ff20ea7ee1724ac64ca927413677babcce28371604e79a0a2fa134e51c19d6ca02d89682233c85618874af6487685f21de8e85dc99603f5b4c49139f9a5621380c65411aa4254d5ae205d5b0aad42d8883afa7221209abd96a91197381dd9d513bec2cb06f33760756a0aed0c169c195be9b33609b0e40c3f1400f7db12d4a760b45bfd275796e674a9bf2c8752b98fd9f9aa98f08a62f20296376578938ce94d3bdfd8161211225a7ca25b4282ad6abcc8c14e40d4d3d4cbfbdffa435258f85a29e7add20a7c1ca410517207157199d02ffd31118f13d910be88dacb9e38e2eb3762a4b35f963a17db121037c1972580cf0e5634d322ffa43559c20b494ab94941a51d0673929e2ac1c8c8961120eddd8ea1092c33c756898ffe92b02dd7491cedfdda440326e2f818a67599e3a2e146ee5d151934fdba1cdc36eb42c863e841dc214584ce178cc9876b9411d6cdfa8c2d1335dafe8f9bfc435a7ec06c9ee9543b8f0d8cfca44ca0e21511aa2c592d107545e6c0a10dfd37a2e9d0059861f563b26e544fc96049f02cb9bca10a3dd39f440f0e36bd0a2b6f029aee917c3c8abf70a893e56999c9ed0281108f1d0068cb37abd7a7f09f3ee975743db549d824847ae0adb07f0882e02d0a45115ee6191ac32447a92f83d4aaabbe0dc55de5b260079645703603d8704c8dab678bd468463b82869802e999557b0f0164e2e790126e3f1e42efd67700365698e6fdc87b4d42603571df83cca98284a388650f4dbebb622aa190b51c827ea8f14ca0692dd0dce0487b6e186dcfa3daa04a17b07e0bf8ca15ba85152e4ec0cce556bbae3745c9c1a247d0fa6c10f9c8a6843a9f91b5bae12266e1e96d4ba7c2cdabb3093aa9bf2b9883eaa4ac1861f03ad4c9141ac88aded147390197fb82f764c789ed7bd893f680834d76908758c8fb51c508603303290500c6dbbe16c86e93efed13f27e1e0f90d2aedf9f40be308e0c988cf59cbf8d7de1c8bc5aa01afddd8c58afdeca6394e9d03655c7b4fefd13c75846dcc1304ca80a4a5dd985e24e7387d3f5968312624b4a1f1b45e1353cd764e552cd16713c36e0bd1aff6369bedf509b8835c767c53e7ffab9770eb6e0a8acd9208eff61410ba64124b62868a80096eaf3d5b453fa4aac6ef1dcf1924a04e444dfb88fb57742f2c7cf923cdcffaa4512e648d2db593c160219075bd4431943203f6e54833b425df5dd442e589c7602ee877271b5842b334b98e7d171e6fe244434c451604da7885628d7367eb94bed7bab93a261740127d57d9d6acf40172a75a32432de3037bf640654418f9d3e3e9f05d17b858df6a1d8a22e +result: pass +shared_secret: 6799d393f4000857868049c19a102e5c04c55a6bfe3a41abeb4fb6d5228cda97 + +# Official test vector 48, seed: "5522a5a891a9a9b5514f4556afd8df40b9cec63a01492f0cb8a1db073a285a963e4a9ff2376c88662f7d8d241f8acf17" +private_key: 3e3a14084387ae125d7f5a0e51841407d61f85d7574b1abea52b6315d07a404372c827aadd3aba668bab52d5943c59bc500b78bd77ccc7da7a3a6c8b613b9cf761bdd73a222bd11b246431d989a9b5d7b68f8c2364c8bb9380caee16bbafec6e4ee157655528dfd8399b3912b303481607620c941cf3a314cb7013a2526229c4bcabf7642596c4100023140a4ac869a30c2a20501ab4838581f42783a18b83f5165907985363d766edc0606594188427a979d171c4a52152fa4ecf0c4d4bfb10306b98ec4a409e2baf598124abb31e34bac176a29fe7316056accc59f38a268ba03b39bb48e0a763e340dca4c3f1d8580ce304f696144efb3db5975157260dcd26194b476c5c6552f9a39b4c556028493f0bba23c96ac03d03ce54a4680e8075cfe70b01bbcff4e3026fa3185f059d401552dd966e70032f7d198a17b8620ba30a39cb1aa3f84ec2d82d154ca88f392c28574cd8dc1025e832751769560569e9bb0cf3f7a4126800142753f7e4950908bfe86b468d095f422c1dfaeb3b196a1c62cc8b0beb47fcf6a456150b780b5648ec05387cc81d485318f1bca87bc6cfd30ae2202e342345159154c8b561f92565ee2c20d7e1c385a7a1d99cba75a3121e410d3145284c826c408455a068625d35b69ff944cb880601483b81f08ddf8ca0b8931480878b25e7c73a6795222b593bf517f0c25f6b862f970bc2a652ada653838c942a68098aa6931a9a858cd4251c19b07f69b208ca1c479777907fb752d24ca06c96b394232f0e1982f4d0b9c6c245da5275f75246f4d58472457ae842c6fa886dc2305b1e2654f1a999664c2e7819571be87bd2f8216bca5486615776e30a3bbcabc3b094d90c9fd24a083d03ccc29590647c533b278a28eb667bc71e2cd62cbeaa74821456278003b9fbc18cf23f2837c8326031bc8ab260a92524e9812d307004ca9f6d709a83b77d3b15b417b1cc7de93737c02e22d0ac4486157d0a8236612f0e25985847185007c41a5846dbea0987794eb2743c87020063277cd366b2c5105421c453257a63683a719a57bacf373b8cd90bb10542fc979c92267e04e0612cbc9fafd485933b42b15404002c8ca8930d295359ff299d5aa3a5b82acf26722542819389891509d24ac2d34d7e10aecac27edf022d499357d4d8548220148a082a504baf876414faea7ddb11639a073e87c3a273713305fa19604b33f6c362dc792a0007aa577a0f3740a246ab4226297a0e66c073564b954039dea916efd14b4a32afb361b80292c6b35244ec1b9fbfeca496b35c1bd5ad7e313575dac43478816868b094c1756bab5503723d39dc2ec6bcba3103b6107544f9bcc74e25355597b69425ae77f04c0fa9a17b1351c0854964261e60284507f0b2a89b4a76cb9481c986198c3fe8514c76465de4eb364bdbc43ec1a1054462643a0d1ff57d957685d0e70213505449119628e86c02f23e1315829cccc9f60a733b8414161673c66a0f33371ca0b10df9faa4f142c4b4300b79b0c18ce8cf76811e459c98b56871345a57844ab6a3749a3e14c18c463e5596836e8c436296a84fda143e69517b8176fef3c52606170194aef5b429057b9edc7c48f1dca18605bee3e26aa7a8102df0c61577a7cd4b9a04b17ac55708d8c6746289529337b9e267737d5345f4e768e0d6656cf23593a84eb0ec290c8ba078eb9f8d1cc8ea18280981cad0f46dd29c474fdc57cb5bc93e318537ca343bd03ea6a7a466b021b3db77021a8e20b94907ea294f47baad599d51d74219e38f883b36cb323a317520997988342a7452c3aff4522ebee30211444fe78854f9f853cd189be04cc1c800607cb4acccb650ae546323e7993bf2a203487becf8328a2979dfc5c3bdfc1b47533a9a629e5fba5a2234bce8eb37d686a75bc33eeb945d80d92c218548eff794ad6c0d825b57f6f12f0ef6b8201bc0d1fb0354f051ec1a217a9a0f0c77b1d6f76c1f25b01ff356fa390079d3800f1468d745a0dc852ac140307e700f97d557eb42164844b0b6d5a37bf1bc41db5aba156359e9b4ad5649189409be58b8ad5ac89e348099ab9ffe81c71d54853eba7b42167d478693c39837f76182e0c894e0f5ccf19643fbdbc5278b500d1b07f1e62ee797930c0cc4a41832ad093b28460c8700678bda847edc6bafa64ca182016f75366af8c330d201c7ac4327b2326d8b57997734bf909b0fa1c619155aab7bc5f4026079926d04619186c4334f48bdfaeca777e91d0b0b7fc4b180e5e19f0162c5d3146b5ac5ac820781209c455d195f17d541d6916f56838f7be838ac0293cdb63f28529df3fc7d54475062b90d3034c2583b00c942102f82b9553c1120891b77d61b8c86ba21b4a78f772c4049869b56442d33c642a5c0ad167747807d5f6105ccc21af8e06c85031a2a73ada9d59453017f131b55c1e0176ee29b021b7933606c5425078b7b49cfa99f24b21818e78a0e856747e4a7888a3d1313624af81c75eca6c3c43238bb078b94c2a9c57f0c4c66ec5b59ab93b73a1000630aaa28a79415320bcc8a96195934c9f14d5dc41cb70c1104a63f5fa29953495abf71b9359563f16c7bd6bc319ed7898fd00cb580902f2196b45311962cc17a9a9f002a916d9bbc1a452bd3e6a48ca05e50ab35bd828cfe66b483e96ca1d917001b46374c41c2d079fdd8257bc339a6e13a7fa2c0948056f6553803d10fc9f1c87725230ba3713903193f200a9851a78b61534b5a949d140c9b457ec66769c6544d79f0850c4cc8e4b78eae0b260dfc9cf0848e4e09cf52047d62bb8e7e6231f4ba49859b1dedbca0d8832bd23789c6fbc40d61485e5a951de68639e07e624a72395b9e25b603acb330a37b998b7a9ab3f973003c15624c6abce84050fc0166924a397708c12308c578105c1457de7cb41dd609c0c3333be5b9c3b93e2776aa0ab3a4054c98789a4bf419bcb6eb914c2179bae02b462b1126a3a28840b9e7170618c20e8527993623cd0c776e54f8b4eb237b4f8c075fa2175f11be86e2bdf3b9b9dff89b7534134620116e0ac025f6707b00b5c743aae144241b935ba61827909b591b44cb6f36107ef81a214c6aa5b9b3e1f441c774cb7102310c4031e0e4a213a8c1f1593906a0424d657cda7c10c1354b0d5a83d2cb9d0407073fa77abe480854c953eedc6cb06c75695665b92873552cc053a9bba0c99aaf970753299db3528276b56feb8a5bbf373d13c20c2f22ae07e9542206b296f3b101d07a3bd1517d9eb8db21e1f18e6da63acfce1e0dc597cef3abfc7d0aea99da67ce6c8abcf3ec4d93505d3be02c039e5a12538e5e59adb5a5d709b9b342938dfd5a08f656a6eb8cd20679930a31caa6a6331c4b133a6838c223ef9f769f6246 +ciphertext: 35efdcdb40a548a0269d389f25474dd39115feb706f9defbd935fd224b3564b3e5b327d7e5ae47ce9ce21f968ce4b20fa2958ac3abc36f9b301e644b327b2d5b74f26a929cb3f2a070d7a36932c1ab0084d7f8e9dcfb6632a601830a1bdb6d27811d35158315863f19a6b70cdbaa180e4e148ebe276a6bc52137c85334f743e84622263144c67e7efdbb1c6578b17025d9a144c2784eb9d9cbd4052c23d3de56d4c50624d969953d944658093c03a933c8f39f09487b1392ed0b7ffeaa8edc5dfd73349c640a75f132259b3a266513ceae23b6a9641d8a8b1d03d5f44f3ecf2111b43b8ca9b112b8d82ea0d7a4659f36c81516cbcf1f7695bf728ebe83298f8b5db14a2e8e7be0628b4f8f5d7253d18efa4bdd5725f5ef10876a9f3890b99f6beac54e9c881693aee29ee7618b04ca59dc31c7531d45156d109c1f28d13eb37aeaa8edc664ef4c7cbceeb95fbf2fe6ac4f5b3a81c185dfcec60ba16f0d6410f89732d2f7bd6a8b64d32fbbe4869caf86323a13e840470479d932fab248c1ec3d09733342c41d454819a335c3e41f87b56d92e8f2a6b598240ebe595604bdd4e18781e584523977e8f9ec732c525f8bbaab3082a97b0ba12b1fdd76851d732cb6b945e24f313861000dc4ce604217df1bc5f9947aecdb305d397f256b30607c4d4557e2d248715a47854998399fd0451cc61a138a24f238514052e26051385d4656811f83214dbf5da500467b16f9f3ed940446241166d0cc6755b518e16403da01681644dd5e58ad821a7590a3e65087a5f583c81b9cc6d59089c1710dc6ca282cbec114337ccf8c63a04e340ee93217b9d988370d6aab73b36f3ff9f4de4996ae9983c1851f06d18008cdc79dc82df1f29ae5c803a1f3f2dad2661d06060daba722f69970f18d081bd58342b329bfd3590347a022b9066bb95e5549a89f4ce681fc309751329897ef1b7a77c111191796574944755e5be70c4cc86e7a404a2844cd21983935577f583bc5e86902bbeb6fbdb6c90ff46a59136afaf006b81b0f8d8e5dd6c7dd9ba157d26ea5ffcf04693f7a338f923511cfb273a2f228323f195a42126ba6d2869aff9e6ad962c34853c67b5fed2abbc325fb5026cf9cb3617fdd147af37c88a768f5dadb5a03b7afe56ff4277d40f67edbf1ba78818cfb4416e5d8b9da09ee9ca4a3864577446b7877c833b8655f12554e62a1bdef2d8574fca989fa17df506c29254cef3712cb4576165fdb9437751cbca17b18e197931a9d2f060b7484784e02691276696289ee89911f805d0e658a75f5e13869c43dcbcdb2476d3aec985ebb8a7e367fdcb57acec9449bc856fa13aabd261743f88f5a446aa5cee3436aebacc7b386af14d4c0de976e5ff4311318d580a7ce5596b21d3e2b4d1f02397c797cd018ca12a8b8fa6dd90a4997846a3e02aa1c8977b992b59197e29db4c409013ad9c9c8f3db22085dbf8015d26fb456c9e1a453994421416858b180a4deb5f06d6052feceb72680b625d644854e72cb7465c3cb5fc9f6d67e +result: pass +shared_secret: dbbe6f3b6f5a35789697792e209428ba1f53d1b98ac2c0d1893cfee641e40375 + +# Official test vector 49, seed: "1853e72329353b3f89ae6a1b1ef700da8ed3c10d19f9e61ee9252e28ebb0e15802ee43083a12a0b7527088832605e3ab" +private_key: 1fe26897d8a471a69851d6bc3e69088da81dd3534ab410b3a3f55c8cf805341651896a61c919668c97b2db572d15b2799236545a4675d37c1ae6d96a8f640cdac13c66c98e849abaef549ab109085f0190bb5315aad870867630e41133087888231a08be1baffbc0a74cfb84f24ca020c401d79a6e615604fb1bc80b2410a0e9b251ac2714011702717f6ffb2e1a7a3ddab5acf7d3211091471fa02f0838cc14d281850465a6a51e2cb6a5aa8a9560461ab67338b30c43eb49bd5221c26d366b21db0e6f4194edd60ad499052b192c2202b6c7962e6541a8e124410bf0b4ce9964dfb153576960b1ac01966552f8230cb3fb267f57650c783f6765c4c396a864d1762df70ff2f67165a6bae7e8b6c20a63a3668b7fd76160dc0cefd968ceabc3827cb2fc191df6e1472f27015c65a222b0a007a33993ac3270ec3aafe4c869ea2985088269323829bc0304d0c21569a3a14095939224a40c9922f77bc59734b58385be242cc8329fd9a4117e38a72019301bf8c55082186b84724d541529c79d8dc1a54b2cc3b3512bac4127f683b5fb1ccf6d10539eab9c8ab4b875733a903acae2b725854934b4b28f09e966e8e987077076ba508432f02f17322cded648b206020f94171d8b82b413b7cb3573197c83c50b1387eb6caed48c26e33d8cac079fa55ad0c83fb7c045d640482c805b5845ba5a3767098c7058e43542f19e74d9758a025b008440b07a19a9fa9b24b8a4550a8a925bac6f60476ca877a459b60e285feb8a86458029cc31c3643a1949208491ec529e566d9e2b1118086cac7252740098fcd318f2b319a89ab1ea4657f06a5034ea2e4e2a9db6f06304fc27d6002f6ddcb487777d18b7c8994cbb1305a516383667c29a8144be189697e36b068b2b6e2556794e53526388ba53e10acc0373926898fbf1136420c50c01d063b7ba87233b312792b031ac0d8668afb43ef651495663263ccb99e03540015c0a9eb7b88bc888877a766f15c0f28b947aab9d74c212f80c78a6bccc9ec78c97bb5242e25790305b9c222373536c481137ffe5b9903196c85c4ea7620b854170aef2173e69af57ec93aa20168bb679140a4bb668719d8773a1c7bca0415e645006bdf7967ffb55717199dca172f70976a9f1ce41db56e088676377acecc04f7be426a57c71efa95fea2366562b61945a56e7502782c41e7ef46bc4427acaab204a8a8bd78c05471301ca4134d727bb025411e9836d14b2c7117b4e135401348697c0c66a8ac13476d67791247d97d34657514fc5829dede57c05a6404d8044dc2aa84a26bafe9bce4c1aaa8de6a43c007cc1f203d814ca06f0a4643c2b5a650e2061c1a5b7cb30684dcdab80ef3c03eb2a6a52b0c531305486a03c95aa0473a3cd7fa9861c8a9feff0c15e66094639ae7db30863a35730db258bc69b7cbb915918ce42b873c944a7907b7bc014357ae981861c36a1600050e019711360a4e227f5fa7cd54742e111028372057e982e4be277a2728b4e381333902eea825b943128b897c74c109475b3a70312c1830c7ccad8a6f60020149a2a4b843d19daaf10d426a074711b35cbbda9797ab756de92bedb7bb19ba174f7ab74aaf115cdaaab7d09c8e078c4a3954f40a2697092bbe4460f27c4ce6886628382606f395b55d1a29939a2f754a0b82968d3c865f30066c5e21e3e2839416570f5b54f24d347e2e10169571a3935307a4918b5d68ddfea58a90382e70012911729238a4919a7531242228995215fcc96ce8c1970faa902f79c7a7207a93613de0066c384786f5913b24040e6b4b48b6b679e5538f953540c25c18402be1c58762fe8bcee6a1e58d93b21165f95895afefba1f735b11fb7bbfcb40d3d54ba24ca7ef507973aab9017b66a3e271f980462752137d9ab0d1937226129bf48f68b700021b2fabe81573e49fc17819bbe46858b5c58b4ca7c83a57398a667b09c681b990b648e96ce79b72104b13e97611ee8528c9f64c376eb04925ba46d3c8ab859304ce17b9435309726045de17d8a7cae32aa9c80e1aa4058cff89010dfe22daf0a002a905f945accd2f9225739aff1863006b46f9ecba5243bc48ed1184bb9a57ae26c8cda147cacbb4a031112279dbe727fa6c467ead943269ab1e3c9657c19ba0b648c9d4a48c6163a0a79954c0c7ec63529cb8a65c851c39840bb1a7c584104016f16b43da179189343c3276bfeb5839d6622e684b421526d69517ad57b67494bca6db58cf6c95266170ddd9455a6867de052adc8909790659fa0dc0a1d011487b16a1e08bc82b22aa9444f123632ec889719e754993ac8319a72ee83a988a2c77d28acd4bb5ebc486c33b0af1d67a84a349480fbb2b0b252e8749401d8488df52356a75ba2883090dcb757451c9956888b43806431bf9ed956e34806bafc15fcb1cf2b45729eea12a6580c6d1c366a76187fc20fae7657f560973838abaa510fad13c59c5baf4773188859809d1bcdba937845759c9af40dd2f14bd7dc48028a77ff4165f2204fb3b0b9f585061616ca4fc405a0c8533c344334e511053a548ee86998e9094863b8bdc02aaf6bbc916481ac9337acbac10d90794ec239268aa376157b1955379d30c2cb4927a8077cba969ac398bc8521450efcc7e1cc617e69a66fd16b771a2497d14e35a61919dc129844379a314821c333a2f4443651a4cff234a3dcabad32610f5b54d138065d8a5a81fc5068c5060af125265cbc42c580f47b9fbda72a893329999958b026c5661ba116346ccd86633e0a603b48c8acab78662162a9f11c4349c5235a5ac46546b16b25e355b4408456f7339122b67bb48334836214e431955e979244c8c7864ba189eb24c818c15417cac84682f719c9bdd8479be5c643d937605383c6a9514118498d5b4e81d5b74a063fb53cc19a20a9cfa26e479339b988c40918c192435db1a3b2a7c6046376b97aca7a9bbb30335a0e8fd237f8833e89e41a1c67b8aa9b0d539486b1855b9fbb53b5103ab2d19606165acaa588b9d14a4e6a7823800d8a9334ff7456e75aabb81408b791c9c6bc3b5829c1ab241e8d310bb7b15a5b24123a2c691ef1b5dd80640a7b94892aa1ad7300797a3de52a66c794426230640b303e71f0b93654708bd81f706b0f71757c08fcc591525bb6c9a57777bf1bda0d81b4922a56586d21b04daa2684e14ee8c0cd542824205b2bac3c1232f2bd37109d621a25cf570573465a706583da17c39ff3ad13826b6d5988158a1602a361d7a2f86a9219450ff713e184c0f6ea4146b79b03e5ee3454a79f7fe853da745a27a1462668bb66c4348b7f4bf25c70527b360b2fd104cda48fe520a7237801f470fcc2bd9fd7bea8322859b850f7882d362947432913dd068c01 +ciphertext: bdc7562e2142743d9af81c76aa1fc1d52b6b46473fb7f97443903b44fa9120735320a1180c7b1631ec6faa37b011417b71bd14cc78f3af729e869d4e161d9d9d0275bc653a731f04bd7e9f2dbfedf31effbe8d24e2822fd7b534ab043e72002aeb28a1efebe22f078ec853f693fbd645d89050401eca963a0212fded375b9b66c1bc138fb13e6585b9574880da1c86cd34950d4d3122cbb2258f5d9a08ad788b67ffb535e6c6f49992f63f6f459bad7bc87b00227f3e8db542aabc9f5c8051c02eaf843c47b5490aeb92b9f4f50252f4d90395603c24a600e95b9406f7f66053a468c4d46d7c5b4347d5f13068a3253ce57ddb159ff3fab3806737d9e30a74ecca1408154211a2ad7fa5c3140ece83fbd56326aa4e7399633d030afa5a6720259a31e58e92ba5c55855a693b3e2bec092966be1adb99b5da4d6a345b3d4c55233a25b06422f3cfd76a416a1abd732ff279c094a0b3d598641b05cb8f35d7996175c5b15d6d478fd17f738b4ed2861334e9c125acb154b6540a01e7ee85c1ecdc4b354e8ae5c68603667b52344ccb24d5b2f2cd68937eca2fe5b398d072905e51fade88a44086779105277bd169ba53d1c4ab1d2502cd6ff3ea9ad8dbd9d8f8f4bd05e5ede3c22ba08366d30fe1b9bea9587b05e1913ccbe6d94fe17a0107adf69ced338256835e707cc312da14b594dd3e4f325e18921938062d9e97049b93a0115149b4aeeebc45605edb1e51bdd644594f3ce7293200787d972e2419a5cb8496bfd8afede88d188c2396af33953f335301c58421250da4a9ca1b247a3bd81ff25594dbd262b7efd31b53371d1ab4d267fe859c11e0915ed02649a319fedc1340e110ba52cc14ea72c1090145093a4c3760e023f499155d96a3215cb62b1be9e0aad7b8f75f7b94c82937327d37c3eed4e3ded7420e9f680e03c2e3b123cb9f14c98c758632f2abef5cdc7b16428c7e024208bcfc9e46bd4439eb4fc6d46cdfcaa7a9f3ab4ccfa72470981055277c9e9cf3ccc3739a33eb8f3f5e1cb0eacac8ca19b0541a6f449be5522d9b0d747677c45f60cdc98a156932f04d5247e90fc87f299a1efb12faf1ae375637a8d62bcefae6a563fc7d54a623c4d50a3d42ac70c2b1d24f3166c01b2a87d7d83be81e83087adc7c79d9aa80c85c90b552986d72f3ff2027b4bd3f716450c082e66a928d26930dc7e1bf504d88ebfd923a3f256b0dd512d6539939766ff588473ba85916177b6ccb9fb16de2c984b17b85a9a06b4691af67f8ae2dfcae468ae02c34bcade4e9ac9722bb260104a9d6cb488f599dddc9904351a9dfaef0a90f6b4adc94dbef5ca73ac1ff89c23f3706665ffc3af4a008e564ec34e3b793091129b794c1a6faba3b224dab1bcd2bb8a51eaf4b7d237fc8f9d6b9d713fd5c5d9551e0f9925e72b1606128a018d1535c9690bb8be25694b22ded91509ff965aba2b220c2506495b76a456bc881b7183e65f70c847e5fff569b5bd9b1706d64731a6a5ac669bc2adcf4d21e8abc76146805d574812069 +result: pass +shared_secret: 494550faf270431de90c96d2ddcb7c19249d5e85305b3b43626386c30b7aba5f + +# Official test vector 50, seed: "027c3d5847ed4470931141104f25b19ae76117cbb64b224ee424ffb782e9a0e988839e0bded0df666fe8e5fcbb5dbc09" +private_key: 6206ad862474f8463a601909e145bb7b68c12772311f5474c295a7bcb93ee331a5a891cce2a69af9e0820fc9ab484a6ca985090035970a587e860126801a87342cb627e769fb9badf4c075aa78cbb127ab20f34d22cc4299abafae49812a5190b95182eb635e844a5111490d754c0674c7a39d8b3323cb1bfd04a0430893b013555d253aa2739ab64808ee6c6b59572f40e3c1e42224c3b20648513172a7895a52b633f63292c04f3e61b25d064ed4834f854c932a897b7f093cc4ac98a22366b184480ba746968523c91a8a0e0980aa8a1d1dd3401966b27b7838ba246ea90432cd723793271cfbb4719e60912df891d7e4a9a63781e8b1bafb40431866ad153bc067d871ed8bb096152bfc1b731153711bb40876e835033861cf981b4de14c24f2542f84c94ea39cd757ac011c8fc5785a9021626f476df9cb687894582348c0ce00af7cd3bb01685f5cd73304011e1b989b1a509660301217130302705c4fb868c1123e0cd633514b4648a347557a9147f44ce88bcf8db4c8e18c826d34ac25c7b5582b3d1d552f2ae28174d0a84b5605d909a6051258d11a941378377f457700e2c8b3901ec33710d179639ae04d661aaa9b3caae38972dd5075d7ca40ff783bf79c1ff4e4ba037c16e3839b76b88ede1779d025841072cb21520f18ecb6e0c9bfdc0379ffa6c074a12c9482ae39b3b51c1c7d02b72d3b844e4d80a8ca3663dc7016e49b0fd686ce826205e463bc164b59bab5cb2ba3b973f7750e61a8697bb1368bcc98aa3d670b7943d7ae89e64f006783e8b67d0142bfdbe4a335a564357202d57566a8d97ae750bd61021cfc9b4fcfaa38f7b6cb55ca53f16b0edfb36ffc1bc4c347c9deb19e75873f2b41613b98c73d346e0ae0aedc0a5154342afa6a1872a73e1ef77f5d34b49f369c4529587c391fe885b0c50ca38f7227adc980df096254374553672992f84e7fc55712a1234fda91c4eb8172128e5c012d75e4ccb0b440afd1787f3a26e0230fe8a35a5c76515e4c4c6b335e60a0b417cc43109c45e6ba639a84377c204adffc0736144d43a005bd35434737c301ec15564b00ff6b8f8b83bf2d99b72a71419b83a39bc3a637276125e9037dd4741f515a41e71dfb75c94e29339a235107f3564e939828ca499986230312caf91045fd6363c9dbb7a822027fba5607dc12b4f19257e1c8832b95b537583fa6642593122eb2c0a25334da883160b9cdaf4776ff14cbe2aa7d28bc271ca7985c1b1f9324042272c1590b737b5963b8894d58670e535775e7c3bea20628b3292a43407cde31b0718678be28b05c11811e1b0016c456d63163549522ea65673e188a27a39783119d70106e9f35b437aa65cc685ae0a200a3b225516b9fd0f4687f3485cec27a7be012766ab18783cc77274c6487bd0ac369ca29a05aa0cd5ff8ac68e7b582392800fcc4ada35e2974bb1da5254ef6af37e487100b4500f82f5c76a14542c9198ac57d699f26005c37b94e7faa5ebd5c62f562351b58bdcfc15199849b33a1be9afb67cdfcb4a201a29c3b61274349f82916c9dbb38a206d81dc5036c51f70293dd51562cee893fc80b7e0abcd5a625470436af7cb7c3cb76309490df6254297f2bda4163313f3cf10a65afbe14a738352fd20b1931827758905dc32c20cf8adf6c081009ca396f270b23a5f26117862a13cb00b65f5a2850e8252053255b8232626b5bdcfe44e95c0b7b5b09802165b5310122a434c5456136cb3a77c3c7c23fc61271550cf15122fea612600aa722c8646a6760ee18ad6028850fa36b82156c09429fa188db2ec3dc229a78f92112b4357d3681aeb19779f1785195b65469c6d3af60ff063562817c4587225a10c8e9fd56c4353711f287469b87cb533b99df46bfbca625c4601aa86459b27778c7200f6a12ac8e8bc078231a37c87400a7429c476ddf7516fa4b7e27841abacceb3c24e92158eb168cd3dfc48ade061b2c02c33b2a33b59ac45a77a439371f3683aeb6a18b107bc34e7785e4146b3f668d9565cb32a23bea6af6daaae79b39a8f725e61f1355c6965d0ba0cf8da22ace189cfd0652213501b3b5f791061ca929e2fd057f357bfaa4047c28577d2105be1616044a6383ff9a087f4754926338e486cc3e76511c7946a02893d058f7100c98bf0af514a47a7630e6e2564b5459d3b52bac6884fc32c7961a34df387ab85c07965786d6bb731af75742147304a5cac936797ba658fdb88c1939c78565914ddb0334fa291fa3182e31a36d6c159ac637a0d3a37098569a009911f54b13efc46e403ba4bf0bf59499cac06c848754903a7b8a1b7549a13b2de5a2cb106a21a3a58d1d71ba30700d74243b1030258294ee022037ff9c7e752cf0fc60f582b6310d4637309ccaa3940e6617b72c0b0217924febb6f971a56a979212a452796a217909547598330557a9309161fbf7c59004d7b3a88a2c3066534153d99ac87dc5918401b860c1b4d5e763440389290d2b656c97cb9784b201a90553acceaca0f22b17852f391ded7094225053f88b6578678f178067ac944f1fb6c2e99abd946953a49b059babeae527408f520844323d9496e51e88f0899857a07b8bf8586ac7a8d13579ca934161d10c08e3b400f084cbe9c6f21e29523c41bac2187b7470f752b55addc6250c08338bac7fd0879620023899041576191b502c736115e65977de34c740c75a5c5f54ae4fa07a2943a7f5a3b8018461445c3ce938579680b68fab41ea2bb26e40eeb13ac84fc3a38b78dd66186558426cf59a1dd4958427bbcbbc13037c577b0e0551238a67f596cd0a2627965216bf733fe88718d64725ffa4b6e73077a37a4585159c887b2a2f5077d1b457c06102cdab7a0e5752263cacf7914ddf836b0e1a95ac4b941388bf7c5bd62f616726100f448001e1c6e4100bbb922b265942bcf37966a5b61ba4957dd02c484413084985d5b22b37964b5f66c11b27c25af757f08cb8ba3b3115a6839483454239bb9d0a1b6b1bcbba5060c3ae47fd0476107919281a508e0606b4ab51ae12b0866c21ca994817b87244ae55222c0807b02581856936ec0ca25e08c7e604e1f1379914702a9e209d7796ca44879a363cce71a0d9850c8ae8596e9b7157a71052602cdbf1c2ba113341fb8b612f114a82c6bb106c703603eddf80ed634be616884b9f2bb271240ab48126a40cf7c0958e0c5bb4f73185cb41dca542888720f8f930a66a66bb9c79acda38a22249f5240a5db0067a23151a6f02abac2477574d9b5d49ed6c25fc46576ca327d614492eebb65297f711f12a5ff123e6de59d1f16878e93a31612015fb961bc572f3e999cea7b534537addaba4ecf14f02ab317d36cb9f0f50222ced7cf029dff8a0d3d2fd9 +ciphertext: 258852ed700664326e1767409c86b549ab45251e00d64a1d830c9342e8e367f1dc43797f2e1c8cd4cf98a1f46566d40bd608996ee5199dce1b4da5ae6a8f0ac2cb4f39fa20b9d9c71335de5f0d3e7ad1057341c4b10ae98c41ac4bb60484acdfe44f7125de5ee18171b612ab9800c796e0a2f3be97b30bef0bbceeab109c46378ebefffe8ab78ec87542cb73bd3377e3b7cb4e08910e1b2c5371aaf53665679dcd90a9b7e817f59754e5185bcc76a68f476352d1ab3696ab8b191d3ed109680544484ad81d0151b976d498fee7187069c67b8d0e3f2dda521dcab2190fff6c0369232449447598c4a68a72883ba5546906f977f78d449234a0f9b5de71330978bec425839b528ed99468aafef2189aa5172a98a7bd8fd8eac32772fd7c0bba3dc6ae42d1653f12145fec4689248abba2b04e3bf9cad1d4953201cecfbe00287b3c5768136d2d9c5c18d72890998b487ae95ff9242cee73abe3005a8ea2822f3f81468eefa9954727a90b8551d9ab482f30583ef65409af625f14ca560fb3d88514b605a5ef6239f9db665ac18a2c5591fc659fa7769434f053ef3828184a0aab41fa58bfc4c58d3edc8a84b44a86eea9e6b0ff881a783c0e941ebde941cd6b960f91dac309fad4e10b063b0f1f3349ea6869c60593d211a54518ac61314ca497942533f75ba98486e0607a4c75c9ffe6a6c29bc7c6d5ce59de70a30214ef7e66c7000cf2830ddbf3fb7867d37bdf0ddd5e8233d441dbabff03e0f66e4465782cfdb527c209e559873c98db25b2d72280ced28cf2a1c951bc98d197b81f810351130a258323b38b216fe27866063809ae96bd3dcdb01890b732776556251d173770c9a3d98e3873bec11091033cb54d27d4dc585276847d37199754ab6fffb61fbac4a5f78d05f2a7873ba3dad729685686c67a6dc51d4e9a967ae8abfe406b864970b841e943da33dd8c284f5d159d7a6120fbb0e272807af4ba7b73e7aa722e81dddbb22ba1f7fc541be455e89511918aea71368c21cdc2c0b1e2989067fde5835c92766bb6fef7908a14186c7c68ae54f4e3e19bafe8c8f56b954f77c625fb1b98bc15b515c8411312bb1ad92274c9de168bd949361df97442bba52a02df06594506222654f849d08042181557caefd6e5a360e18f37ba03386c004df2c64847feed5839eb4ea417c4e0e75b5cc3db09b069f9416662b722b8bc9a0dfff96610438bd949c7b625629cf9249da3b7ee5b550812a0e7c7b6df121d59d4289c90f659a5624122d2b47bbfa6d1cfe099a7676807b1d61db21761f06bd21fef8af069e6478b9e4db55f324747863e24f52697ca20ed6870a247ad6cfa4067ae5d6232bbf1e4127bfd0f6fa96de1f9512f8c39f76500dbfefcf318ef818bf4edc9bd677f0edea6274a3a1389bdc7bda53e5fb34fc7ef0d76f367bd1f9811b276602d0d5035de19575e8b92161907989b69e90c12bce13aee5964b33cb04587026b9c2d52e9b43598e7c05a54893e7fa3d5fe97bc5bc01eb4fb267cd4b3b6d299c55c +result: pass +shared_secret: eec9e658edcad5a8a705644ccd35aa3d785cc258666ff749bdbbafae6700f1b9 + +# Official test vector 51, seed: "450751d4401737459c6d93e6c5f2fbcc4a3af7cd7250ccf404bbb817a67bab7b4c9d0ef4570bfe25cf919da331c31d88" +private_key: a8a66e47b025073a79d8e2817c64306dfb4da1390d93060be758ac111030fc2c3bf6147c63981ce6399f31e5941f65b96c13c9b09a0ee6a08c9171ab262a400a926a628b8ccb307f9bdc7eaa06424c071bc7105637e90421eb1c8db616ceb2972ae38cae319c3b181686a9adbea05305b258a2a2a965630beb687fb2f47b9a4a770d1370781b2526ca326261cdee50ca3ee802a9d5b8e1944b67fb4db24753756b9eb4289e81f1cdb1684c00c58c9977892eb7ca78b205678a352d3a7592e3970a124c9aec88b521bc26a368db678a45682d4208b9e1b099c5cb30506371c8a44b2113931e1bc1fd88a43c91b650c312c733c913835f7118b898a27b7a4a75f927a03fd914ce627d9e156b8153584f12b753e62a7148bb83f83f474985701c6d051110cf270da672a5cc72c85f560aa7b91d99539224159466387de5d39f9254b46735a0c30ac40f2b1a180a8ee30bacbd09cb45d52a4bb8336c269a78746f6a337f44604de7b76690d23e71fa307c315c377555dce8b26a945baf1225df553f518aa453b823fb618daee2aa5cf0a60414af7cf39aefa3a2fa2944d139869ffa51dc115e2ffaa1abc7438b776a7b2a869d03b05aa0238903008372a3975c36d8d6067caa75152a0305b6614c3815a589a332a860a0d1c6ebe2ad2d68b7bfa1687242960f8b8ddfab9b3e851d4d814c94371b4c9b26c3838eadf70daa5abb4952b01a44cf5426b28b4c8c2f66bca49a21e5763501708ac050b1f8d81b4bd0c0a0e5c171372c877c31882005d65580da2b33165b87eebca160c50ee970b8e1567c9ae1132b65a6bd414117eb4d2a458520a55876f17941f38045b117ce004c299208220c16d10c70124529ac8a10980cb481d069bf0319bd990e34b31ccfe87d3252bf51c2687b234246943b248104baa9ba21015ffc92877d550f5e0148c36bca544c1b1f613afed6aad1132a91aa823b1accccc3bd43b94c47b902ceea431abc8ee15aa32c1b3da6a605b0b5b8ca905c7492a9bf137f2805133275bd3cd98cd5453943058a668456e9a334302c5872307ae5db01de5b4808d477eed39efc00335f31116653cee8f81b6f147d4dd9cccb080c2dbba75b5310c0348ff8ac88e09895422c371358b248509df2d46089a5514f919ff271cb44bb70fb61bb2ed88f6d111dd8b38e155103955836be3812bb255da8db97da862c5a2491892251280c6c9dc779124c08947251f3574d3a5998f8ac8c68881927733fa59816c6aaa629d7893a3313a327a9e2401ffa5c8436f289e167ce68f4a4d232c84c23133d4b7f9b43b7e7ac8060d9bda7d11aa648add452423d91a0c7b3702da16bfed820c0f1420a842a04759f4dd336b1858d0af93b81548f2c8cc8ef064bc554b1cc6cce84968f8bf991649b59f5ab51a6e56375716e1d3074c5849e28f961d75b6f33275819342467e69498a713caec4e78f9b6c1ca774b026703167270e14b4209a9b5353cf6949eaf5c947b458038ab9761f6bcba06785852b78b050d83d70b5c845cce62cca1d8723b472907d6c8482224f10318219c42ee848425787640636a7eeb651e2a2bb5207928a68f65a6318743bf7b43c223549590463ac38acfed84aea13a9025b2ce04e31b6f647abde39d7b1cb988c37f2ab219c67839064481c2539f7c947a5187a850f61ba075a002e4621ebc290855c9e75818e3a99da9e50522976372ea0e6e201f8cf3c49e4a86c503c38ab764b2f45bfd1718f6b5c0d2e66181045be2a2a8a1e10becb8a6bae9569f42654187a9d9b24c8214abf933063526804d0998b89c884b1055a56cae82557455f3a47c677e8e262fe9569aca0c5b1c0cbbf768302099a4cf3960f9d432a0865031e2b65ddaa43e00aae05aa39152256061021669b8f2ba6bb31045e7e539830095216a846aa39d5b16bf69e152aa227c61287137e2b29d3931c6211510ea33325b2ecd20a1bbab9d30a7ad9bf83e3058520606641dd23b092831d29022542513070c8626a42386c8177c7bc1ffe5754ef5b3a2c41f91f1463b7b068816b058da287b4ac2ad82191d061630337d296a08a02030174a219c143224b4b1aa1324feb23e7d52ccdc757929342ebcc02c9a080aaff12763894928a16c1f7830d7dcb2ebd77837d97011001d83f3512f9578efac3ce1c0a17da13b375c44ac8c32e616aef48339c19a4f379c216feb9672c20d78262fa99887f92324bf667502517cd42b340b51ac0d0c71c2ca5d357554eed04c1206baee66707b10bf52a424fc7567ca023b605a0e160aba5be5aff753983b19938205188fb87a867b6cea58112a3323c2ec23a92a1c16b48f8cc7bc55c5b18a33b67580cd9383275e7b53d053aed3f41f1a74859f3536a3c07832d4b64d6a9bd591c4a1901c46490efd73c9aaec1466528bfda0af55fb7a28f4af2c332de8024f87567e1ef87dbf3061ad29490c658b8367b0b911ba3c3c91e48189c8bb1cf3a229146cb537958bc1b427add62348ba0b54718753acb2ec3a0783c58c8b6b1023580a3417cc08745feb9b3f19397fda09002cb019be30a8d3781c936847d5c7c5a8e9a7b5d8c18bc5877ed4a8d787a7b11a0464440da596a4250308398aa9cd482e0f685703058987b63e21c530b3b5367654bc30b86fe6f0645e328714fbcc0f666bb8eb28d7279339f622cb89b813c72dcf5944ecf68e4ce422744abe30261ed3e127118cbdc1d224e538b48d441359d673470978bd4b5913b6cf557760389b3f6991344d4b622c7a332239a50626ce553a6e0677bdeea96a3efa72931b6921a23be5cbba9f51166be80a542b5f341866f78225d50a608e95bdbaf02a599b7a2441537f5124b0d5150a19a7de9ac2de2460b80884512c970e7c700aa259982bbda59773c415844b272dc45807f9d641c9443717c61bf9fa9201568868655e0f791910b5077cb77a93e40b85211f9953014d953fd3f8780189840af9ae60da1fc6c48d19d88dfc689a8421c28f569bfc5184ed6a66a50202bcb51425202b6428187f0c7a92d2ad1e7a35d3bc7f7d7664cfe9765d217f766a3c068149964b7c9bdb328a7821a9646ad53a8bded2912c3c714ec81190c966c703a5b9b6bc74c89e2e0635d614624c5371efc4099c00576d05aa5552b862455fd14641e1e80f4b468cfca6cc37e032079617c6cc3c7cc68bc8fbb3329c9e28c1caa811cd6b8bcde9ab6ddfcc98f9534f3d7aaff2a508b3237070c39e22b43a424b2af4ea59c9920d24d6cda3885cad8cbc7a2e3b82554fefde1a383c558139f9e1808c824829ab0e51634cb33a2bc3fc22ff47b58d7879d703bdd661ad3c290a6d812485ef0ce8fff48a9254dd40b117941fa35a66bb50296327b725525deef70e128ca8045ec451 +ciphertext: 82948c08334a2c9684b91b4a759a0091481dc5a3c3b19a22688040bdddd36248e8b41a96790d155324a2bd4bcb600cdc60f64868ef7bbdcab3fd549f0fe04cdc8197314e6d688ad7ca05a492f95ed47bc2c79b2e547b77b2f403876c0063b8c6e0f7a613e2168a8b51585396fdcf250d7846c89ee8d4bafb1a81b1d797f10be40042339e57576f3be7f2540d31878f6c4155cdcefc60730eac27a83ba6945c38f1871ee0bdf60ce96f0b2098d1a0ce84881c4850c3dcdd81f14d87fb8e5723eec26966729b90445fb728b52d63c7378b976f781471b7ee614cc3dda55e4dfbf44dec1c772f559aff3baab16c7e333c6a573517ddfdc3f2741c144cfa3dec335d662d614340d19b2b8899453ebd208fec0a529112d5b71208336b2a327ee41af51309dab4e2bf4ce56542ab15b6f502c0cc61b0b7cda523dc6c4f85501ad788f2ce37aa3c26ccb6b9655026569ebdbea550dab8275d6acfe5fdaba77968235d81a9622c53233927b22d320edcaccad05f5c48ba398e298d77fd1f25983fd5625776d5ba3e3090c53f9e2a793f7873eb9eea54fc4075034a126a2e1124a4f843017f44401f10af382db6e67373850cb36b6ae5db7beb3db7ee690b998d7ed5c4c9eb9307f2916c3dc303e8e21d5b313f943d06842c41921e559e496a996391cf4cb1029ea5a9ddeeda82760764a37a04399de11265ae3ebf64b04c52a9581002a0b7caa34793c51ff74a18ff8c34ac83d97ce45530ad85e3716668c4fdde7715c5fb5f6806c64d353c8a2659d993f87f74b70021f95f06c50e155f7c5015d9cd6be713d758d6c7bc186a5f9299f3d8dcb280af932a0f90d152985824a809cde764d648314ad108f9de2e9006e6757fde0517bf72b7a8b81b2e79e4538de724b878cf385c4fa599bfcb984191053e497b83dd6d2b3c364edab43ca296a490314ad86795547872b64b58d2b57e4c39851892e3641b3316fff304257349389d5429a7611c606fc0552cf62e434a619d521296dfa66d368b3a0d17fdfd4b7d8c796b3e2d3338dfb3ab19ed43bd8011cb1d279eccd6cb39b4a3c63a7484e73215086c21d7f2965ec89d496ff6dc79378e6db7c678c2c829c68e7890172c5a0c9f63a5197c65546315896780cc92986b901594905933e9c777e041c94d5f0f5c53625d5aa00c99a0675d58d3f7ead5a866b850a93ab9b91222644fdd9caf14627fdf088f2b252274a44cd9e606fdc5d68bcb4a56667c84b2d8f1f4f51b20e5f9661a7cb19896bddf395bbfa6047e958653598df20d0bcb2182b6c9ea4406a37b2b6dad5447579981b5dcc0606d84398e79e8852e9424689bcf40adb811fd60bae45284e3c15aff38af28e018efefcfa8cad3e072f8fab8e1b31574bb807d31eb88c64000418f68884aa86f5469131bb78c897c9da19fa172f388e74eade31d4d234e84512d5b7ee239625b5f440f1065116c8f5d40e99c1c9ff8dc101d2741e1b8b857cbb98359b1269b738837cf5ea7b84bd790216213193dec928ba234256fe20b87b4 +result: pass +shared_secret: d5c5e6657d310b0ccef250c9664a02c846ecb241f2404ca851d8219f93cb0d27 + +# Official test vector 52, seed: "5de720f2d152bf4e1f96a61e7ae5f1bed6b8548e32638c2ccec9f43b87d1bb43dfcf334f0582984d27e440d519ab662f" +private_key: a3854bbdf04e2f617b377ba9d5c1652f27b377bc73f4828fd485afb4c2a7ef05a02b1a1f06a707d68799ba1094f1208e52c9c44ec15580c6599cb244cd2617714c7ea5b07648f91d2230bf35a6910371289dbb7a6329436c4ba502c83633b64f99cc16f6c641ff62254c65511584cbe208a080495762eab49d57253063a50fb45f61544d6ad39a4a0003c4e05d193a59efa80949e1400643962e896c0c9a0c2af30e586c0821388292768538137195009d907853aab7459925498cca238419977c36bbfd326acb9832afd3b46d934255a10a0aa0932a7abff1402da645c0d2cba5d03abc21e0c09f9ca9f28032207a707b21619f7521b9a228386c29a89c53c38b8bd2db9fa4fbabd79421551b6f4e1c489c0a3692e695c73b6f04bbb2be72516ebb523ad794e9101b4cc6b7b16c5f7c2a8e41aabcdddb3f070a5de22a52b80165b3c6872f279ff87ba6eea982bb741a768640d70797724841699c45ab10a522b74c53e55a8a8968afd6ba69bb39eb4489e47343f807424ebb8b4ac8097f43b2bab8cc37990ca185a19c9c6b28dbbdb7822517670ca050ba28d724176a7a3e887bb47bc4dd648b41cbc6b52656405ca5f4e7cb06e64477b2806fa3b52afb3533034cf4772e4a383563aa5a057a6738338f92d9070ec94ab05489e278bc6688a98c2ab7a18ab86397631751c47df75ba27a801497517845b99c0b692afb31c95a78f96267cbec760743cf92140f1ed46f1cd5840d13ce1df028238c941c6044511592d2520188e86690707092eabbe9505cfba46b710b642ff2a87fe7a3d5431773378e5efb378e627058000b4921ab6e6368677492b2eb2ee219ce2e6633286b73863451ca01cbcfa570b806b5d2d5a2fc237c44d0a84c0ac097b8b299446c63a47f2c93a87c95c4b02a3d160bce70125c9073ca35f663e0ec64a189565460b8da009778a8324de7211d072522476418a6c33c17046177359f9bbe5fe72d2ca483bab4bcc05440fcfa67c17c326331b65a04acf68c1ae870208f41c66057c3483c8b2870a3308bb90a5ca085ea8c15891a39a0ac3b09297c99320568504b4284a035be76380e368018394a66be5b2f45dc3ddbe6179ad60860123d55b28d270ba24cc0a49aa5a30bca256d7148ef466b468c06ccc8c2ce439e75953c07013999ab77532b13c9e477905997ffa42f6b28c90f9471ff6b2477e7b311b34c89277803747257791a7325cee25246f656cbf57391037a3e90d74729b16b1a5175eca2871ebc7e4994b3759089e215933144909991550cd812f8f29658852ec11b3b604aa07e47c5db88c98143467ab358db51b5372124af9c983e542e74ba6f273943a646065e603f11395d92ca09f1771adc29c6bc202a9ac159ef356d3934a3a9c073ad459e1de4bb1d81ba30143302013d7043776db346d2239dcc81305386628a2c1b364ccc606804604669ada153ce5a7e6367838a6cbc8971ca750342170509e4124c09846314185387ec47a501a0c5243adb14c39c1105938292f09aa117a5bfb4649f8705696097466f25b32c4a382c877d82d31abdd6b364b936f617b532b29c837a375846bc44635c8d55a5e5dbb44315090602830ad70b50a1cfb92723d9f945a651693bcbb0c7a385928129f004263fa16bef92ae400780966a8ae8750e574947cf6a607fa4b3d252c77cd9925ff3a89e762378ebabe4c413af52cf969068d86acb44683222f93bc50bc8f7058def77a3241173222359d25c3a87c817461210c6e4c30d4a428bea8b2d459c4d9c71594c597fb9c3bd17598afa098329bdd15b1c23222f0f39189fa06319bbac7d6866ed7953a2c933b3479235790942d6146a818edfd64227e78bb47168709bc5e490291234929206a3fa1c2ec9359888641d61897927f0440929294439095db0244a05c20f9678b69ca13268622d174a915a210b8908328b162454c1c0c3c36b8acfe4ba2c38e0279ac15898f393f01468eb23a8db1567ede8b493608d3194b2f2f82e91e739479c35a59267a1c84fcc5a1ac12289b3e5845d0c8e9969bba50211ee716774ea03514c3b7359892bd4b8d9db4fd006af53961687e5b0d0fb9e16fcb3764b1b0271b9803019048048cab04e60119c8a140b401cc8c5f5770863b066429e71c8ac3751536dd3cbf4e775c7778c15920849d4b1c1b6ca9ac63d3de47cda549ed009b4ee7759fdd66eb5555b199022846671b1a819aa732a23e6bbd27605b1fb22b1aa71408b2e55bb651c1a676e13a8e9cba2b65b246b6683ab20820ff40eab949eb219851a7c2e1bc1a4cb7b06cf526bff6b1ecb4b5ae4d05dfec33de9504d2eaa4538dc9b9bb39b051ab7d2239ae0b98a34f55474871cf9059e9bf463dda3895e32c27a534737677e40527313ec993144841bc756e9222d756c3c22e56ceaf336e107c3aeec9b1dc71131271392b4a4436a14292aa0e24957534856e30ccff827cb3fdb31aaa086298c59ab71278885308803591513870867a018e61d2705b48210240739ade4c7100210bbbcb524966a9123aac92cd711f5da3b5b614eefdbc39bb36cddf47ecb196840ac84a6c721f1fa2f031c022844a64c4433f414a707992200b857ada964d17c6ceef31186c248adbc83ca2a528738ac567c4c8afbaf8ba57b3f42700dfb8c563b5e494c6679e69acae47a9bb14c79396bfa2593d63224e29cabdd0991101496a0380ac19b759cb0220517aded8371ce74667dc827c1141a233709fc47bd5ea6664c0b6c2182aa9a088df3c92bb5e6047c7b03bd9c4347db41efecb80fbbac90662c0d56b8f91b3f3b7b3417d592994771ec3695e94cc3ac73747f279984b7350ed9b9400201ed35b785f0629225af64b05bb5b6016ea50a8689c9ceaaa234748400db67ef9514e7ba63c683b4f5f6b35869586f0058ba7b9c4bac500a0034bce3b2bda7c5fd5c8ad37c6466a9b877278b7773ac79809222f80eef341236053ad1d0c95862796a9702fd977e820420d611c66163c5cd6c5fdabab7ec96a51bb24328617e375367ee616ecdb46089c6604909d055033d53d828c7f8cd6de0823022babcf521aaa67959c1881161620e397b0a25682cbc805a96a84bb84a9a99acfb6012e2ecc2e5bc1518036e40dbc3347caba399178ca912eb8367c86070833137d1bca5b5b3186ad23c2e76a4cc467d092102ba081494bc7f963a9a6ae575d2c57a38371be5b164adf29f392014d11522535b0173126bfb82721e153e74049c1e170144484dddc2716b4c487aa0398ee9ccd2804df58fab8e2d32ac05bf22a845cccc2997b502ed631257065214ab9afed11f00ca5c18c92c4d6b917165fd1ce6c45c7fc62329b13c8d29844405db8ff6860de474bf727ecd19e54e6e1a141b +ciphertext: adf7eabf19b964073c8b23ebd08c9c3224a3a1d1b9bc80310f9b817c153fedebbfe44f6426dcb32acf9fcfb9f49521cbefab676b0ba60e476e6bc18dea3fc67c6acfb042f592a557630ee0152db0add3e364044bcb910ceb0b79a4c7407dbc285a7003231a8d4e3c044a84d2baa164949369becc15e7d91384217dad6848424ee5d80b086f1612969c1ad430876d6b9a40a9cf3bff43e508cfe569c74e0611bf3b83758116f17b2ea11660ef51df4d20180c9a786594016a3c8b5f88e39fdf4981a629c2c3f6ecdb521a5d1556e8ddaeefd1d1db2fe5a4787356a949ef652e84ee7c447fc020e8d8fdc42dea77607247fcb55d20f1ed3271adea64165a07279b077599be443f4db254cb8ec45b21010935b543401abf91a50570bf3bbd7f94c0e3b6579e6d8b1f34520de7cb471de174fcb3c1e6380cf7156db6aa4fa483a96297842342dea8c5d0e421958942e5d4b9d9a6867c104b5f21aa6f02398cc1db26304f2bf29c124e3d5c473b5f4b2ad79a092e35e00f7ab04f4f42605d2a8632432183c24f65df8f5fec2a27a7b65cf7f2705aa9f6c4acede1f407f4fc822b60ba72f81028e4a175683796f5cd7ab11bf95ec66002670a8a01564e276b83d0ba30ec9739e917dff07478c65b931d839cd560d3756c1adcd0ddd29af90a5887f126c6bb0a27ca5c8f2c131eb7f57b876a8fd38b53ee7b3aaee459c2cf10fef41e9c853950cedf0343c044392a4b1ec58335abe2a216466e213618f36b58e1529415ad8dcefe7eca63911bfba0a27e74af1b586e52ce4f1efbe58e46259bd6a82239e58208660889c533f905a7ce54f94a97c10bd85a8a30ab219040261f4abe3c47c2b356e704a626d51c316b5ec7a180bcb41c8ea3bf3bbb846a90672571848ffb6811869f15b3317fe836436f8d758eb0393a277e4888ff85fb94b878bd54717fcfd696772bb815781e0f39eb57ffdce6abbc4df932e9d4abf64cd6ee9619aed5b4660d705fd21338bb665683c69a0bd84e7127b5816b69655e661f00095bab6259d335500881536b4bfbe84fe75cd203a7cfc595df1fad1d2a93858f98c8eceec2c1b20dde8e0dc33f98e80636e1da8945e617a47339527acd51110e74bd90148d9d3772902b879ed70d89a0370e884f38fe73aa2d51088f384c5ad2786c2eb9a9cf1965438e9d15363fc1d4cd1c850af641cc8083c95687f38caa5b631591d26a753e8413d779cf83d254180ff636207b242f9ea9c9e2c73305bb1573dc463c526ee6305d9f1b45d95a7d0ecb917eb9ded46fa43884d1f50553b4edf08c02734cf289e86649d524d5abeaa8f5b3562e80c87658dd91e66e7e55502de100be9c66bc2275c40d9ea2fc160d6178b6526dd663f798c10cf7357d8df32f75a8a6d70e46bd5d5dcdb52aa72a1be365d85986f5029b18b15bd1bbb413b8ab84ebd87aa309fcceb6e30992e5983327c033556028d974ffb076759825dcb98d20686107c72d333d0205b201b31f2963c0f762079d6358518e9e2f19351edaa5d5b426c0 +result: pass +shared_secret: f62460025ebbb273f00207758a1215c3a8053d2ac66cee11c6760aeef7e35d24 + +# Official test vector 53, seed: "d71729dcbb27d7cb39e9e905025d3e55c8602efbcc483c9b866ebf82326157833169243c14550ad728bd1470f39c642e" +private_key: f1cbc95bf8705ee2aea2832134f8b633a20a3f3b6a82a2cc688728de320944ca5e74b42744e4b2bfd860ad6920f671c4ace706ce8903e0eb9f434364d1c09aa3f81303b195e704375adc01242907f12173077384493049a136821ca239c7889fee120aa015813f987611101bbba9115a026c3766264374ac28b0c9c422b844889df150caf94409fbe61f08daa4dc4b6bc3e0c866f82145fb813dc88bee809177b13c2db2ce1c3b8e8c93c8cb86aeff1383adf0afaf5600bfdb178fcb56c899569bd497ae05186f19cd9e6baba7cac85f6317792bc6da6c6222da77b100595e84a2c9a9b9d9b131c9a0514e9c8c59c3b1a12637fff8353d468239358834d11bb0fb0cf6f37a461132f8bb5559b26eb03c0e36872399ca6e5b18a05aeb934516a484116ccd72bf780379d82c396ad39eba5b48dda856e0c82f7b9c4ccc36b20054cf5d1b2f0ea00333527c6e6977a775aa2d58b180609ce57346f9e8a2b686b7d85cb4c58a2bb938b26dbbc6ccd685a6e309838c9fe2e335b74462c2f7c521490ea527af3dbc91034c74e3e94a69e42ffc290920d64f4d662ff436345c06c242749ab140121ae330f254478d851d5f34048c2ab65c8460e8020499c33b4cb9851985817c62282dd49da96064fb2881e18697696960d9a52f409a2e3136368c0c5146ac3ed3b4aa580c143ba22ea9255397203e95c4416161447698bdd6dc462fa5cbfce3933a3cc26b2ccd5295c3e3b30429493244f63b811640f2111e86b54146d59b2e761c793b4920939c88a0cd12c882ef8192fac7bf2af22c08580bb4e20226ab02428731b72a81cdfb654ef9286b73713ecb2c90341e78a8b0d6699f59230b298a658648109b003840a2424aca7d30d7c15d3704fb88c6f66592a04ab803e83eeeb4294b2bb5c6f957b65a6aa8c88a88f5337411404ac7cc76857aeb3ac07ef32d8bf0402cd135969669e2743ce7f8060cb06be964991e797923bb291cac6e78a8c55c65a85d402e2184491e474814086824836405629f0e68cd2f86691df301f00ba2ed971fda2222e1322101130ff1f1a2d870280dac8cb98a29f93870047915146aa8a486afc16cb4d01458edd0b4d5b027fe2a6c4a884ee93a495a5c15af938e5b37aafe655ec6220c0d88557801890e6805c80a3b5e0c395548a19f404a4a6286e041a95506be194a7ab1d7ac21f52932bb3b5f5393e5d5173d2c7c8653b9433344af489f7102199523bb401cc75d80c8ce1162a69627e3a743b3201534c9bc21243961f7011731c1a3e01fa3847cc08ba7d1970e2e70b3f0c4349e707b40bb9c4b5519b8642334a97574529fde05927b25b8c13bae1e456b87d90087551d0c2918a3658e9a9b7dfc105ad9f0cc7a180bd0d0aa5042702afa02fe67801137a1faba5813f2bbcec3b05b1aca701385e159031fe9043199b07ae02682a0861812749294bdd42b6d09330248fb52fee84e98b68b49830508197a06caadb913295095108f2ab2b4854fdbc44742c673d0f55626e726d0ba68ab3508b7304d767b7f868676ddb33c917ba37b5b0c8a831756383235b81e872114278c2ffb29668df706b38153bf7b39a388b9cfb38066177b0695a511b0c9e6c709cf0cad698035eda89cff189f730a05dabb3254297561072317010327d4222de388a7e95d8d0076665061705209d59984540471fc61032904b13dac27d520a2b7cb653a68a46623316557500cf4bb6f71ac9b5ca17d45331ff06507d5732829af25417defe7aca7364d99041448328f57d94f1af2572f7468da3b9f2e432064144f0396c1a8d95ce9951530a3b33b092d67590b307944095c50c30762435b76a5dcb3af494a5b112fee2567664a376f3b30c32172059631318821de71ad62b0227d9a91530a5ef2e6c2ecf925fb95302598b722a991e989a1fd198836fb340fe44849ca144545a5a14b46f464078529bb6dac09d148949e91cb0d7912f8701d84aa48ddacbc1aab0a4eb63f9ba41465f03f1bf4b4285cab3e315acd8a3f79c465d1d31fb50670423b278f042442e2b5797483f5a2bd21e83248e3039626006d7124a324281545b8c4356396f413a1fa67577c5d15c638b7d23199aa5343473dd5b45b66f41d451358f74b82a3c18627a60c08513d34e14e3f2a4b13d7332fd8014ff817077b7ee2db80a9c00eb1da79c2193201996036d214ee7b238d82afc2e3a226159ac05240e6683ad00a55a006190a279e116626b4f70fe345594d21a8d54b9017a76d6e2a61b9585bd5e378875ca26ac071d6b1546ee99d716cb8587b7a4e184c8119cb3150611389a8ca0bcd1ab6a7107942769cce08c00174a19305d438a7a475f2a29b28d230a016479f8aa8da24273c15094d3c0e10a8a0f0d3344169b81ca508e6cb662a4ba28c8693b9a27bd46a35acbc27a6b7cf30292064b4aef36bb29909af11d8924ee59af80b5871c2bdf0c53830a360688ab31a94cda3b12c0f61ce341bc0566ca6ad1cae54989aa3083707ea74680ac1fcb254fe3866bc9c7fc33189d3f4299a8a0a985ba3fbd51fbaa45d26aa352eaa710826aab8f600ff8a9554c842657a3cd2d6588f42063e9c08e9955ab7f3ca032b440c7889595a3454025853ba4070f1cd09dc26392b2657c526052373eac80c920c58c3a24827456be174842ed722487c64373b2457836f13c4065dd7b555f3914567cd87426e1196bb03c08c7a77c77d586f18e9603f45b1b9675bc62a4e71f215c3d7071729b0a8e9069f35ab73e55948f9c3e766c4f150394716b198721676495416e54841908cf60148a7104a4df00f21a10fcf508ae9438ba162291e5245afca757ca88ed577057f543921f670b262a0022a4ea4044318a4b1af8a99cdac8e1e550b732157e8ea9194970f786665c817299a7914b4c0b3394a57adb179bd3067897421a09410a34c658daabe6250047bf15b76f826bd371f0c504a2cf9106eca67816a4865b60a87d48ef4753f90132663fb26a5fa08c59394b6770ab13081aa200c79a6802ee826396cc9b3ea9cbfb482d601952752758cb7cd18605a9336735ea2322bc82b7bca773be27f17bb8726a8cfa9070b9aa6a77cdc0b64081cbfbab45c4314f855a953231c6fb6149bab90707b87239c2f7c7103bb9b2532180bc1f16670d90b7b77c6028c4d4bf92195ea54bee1150c25cc363c57f812a0754c9bf66470ad820e12133ebf44810b7318d2a79e5eb98c17c40b0ee10179f1b5b6870f26d27ebfb588f3a0d02e10a041ab4e3b97c35070f0da64f7e0e7076ae69b2ab51a956cfd04f889560d4e598328f6302a9762bda2b0f29fa8ee34fe48dc4847810fc6f44cc1985a3407f591791a5db4578b5972093a95bec3b8e70c1d542c9b5c9789729f8922 +ciphertext: e7a99c20e70cc337043c1fb4b4652347b827093a693543f2b31c03c52fdd4a2375f5a66055969e0754920a298b5335298e585c0e5831869e8714ab1b0f0d8a2dbc97d79bae54357dbcb5858bb60f55c1c739b63cfa0b57e6feb3213b5a90ba8aa94e1acf57b3fde306a854b28bacbdeae3b0610eb3d9595389fb2e29288586b39c6cd6cda86845241ded3e227792bca133a7f6b6bd2e03f5a215c63f0c682481a294b92b984ad8bf63dcf25f20dd344afcff545d8c89ea41ee0929095dea72aa2c007280eb9e12e8f7df68f43cd1392af717f01cbca7059637c7a5b869a5b3f26b1914ca8d12693c5b452c77c7ab8490ceb84a36066d26a84437fab7822512186d6069ddb363ccc3a66091a6c438667d6e423eb785b37be24c0b82524ed9fb67ed990311b010cbe63c51f6b0046c054bae7001439e4543d25511e9ae5b05f9fa0868ca7241322800e6ab6541e228fe2c4403863dcdf99bf3f01c117ffbdb4093c3fd4057f38752e878273a75567b5d8d7d23e62b7c9e478b12d8e0b910ed1c67377ec04496961892723109034b45dcac6e6d86128c1e6f7b92c45b695431406420ef8081534533182306daded5a36f9243e069914feb94fd4e21997c7eb259c4faa30d90e28bc81a2ee5033b54d1304046d8f110ea7e4008b4bdbd06c4b3031972164e9602e83143fd0640e51229f8243124ee1420d0895e30e19f4445553d236b48e65ba5f51a60a54d582e78b2b79a8f62dcdad61f33853d990ffa97f7e9e5f6a1882ea1c97efccb8c24737f897862eab1ad1be87bc7754cc69806cf53a123be63d6f08cd1251388fba7511e8457d8ba0c41410970706948cd42a73c534ec4141d408339411b480c21e60e06c4376fd0d818a287b9b2e235f7d86100aab7f3874af278561e7cbaaa269417fafb4ceeb0b0d08260db01e0b346e8e048a35508f4d888fc39d7250198c383258b735ef44c4951eb02cfa0e70d72468974a25a93858af6926c1c63f3ebbf279b8044279a4476d5fc6b190fd85d581138306b1340423bf70af7227698b740c5e106828591570269bd549cb6730674394f56e56474b76930e117dd16816c79923c31c1be831256ea63b91a4c0966bc15ff4e0abb910d088f4c5c6418c356eb076740f8d3a114584b61a52608129ba0f956e2038e9c1fb1d69f1757522c45111e26449b0f55407d09e51d50635ea272b18d029632bfed44272347b5d3c99b077ee34ef4f1c21104d9341c44aa1607eefa47d39b6af568f1615410558dcae8b7d546e0dfe88fca027d4f2bd6f249c5ec9b222a90edbf0914dafe124a56861329d09f567f8ddd477d8d73fa74119da2a40bd27a317bfc9ee8d0f2892cd201c55615466a68a16d9e39c107f053600618423a9a66e9d6acfb310c327780c47f72f45e09d27099ba53d4997aa14b5111bda61d5692dd9f73aaac26f07b590662dc5c99f6f4bb994861003dbf2d48b90da8860b911978b16098fd6cd7eefc4eeb90791486f2b4bb36023f1538cebcf9798a8ed2cd31758928 +result: pass +shared_secret: 74efee46e7b26f5022416ae9bf4a52a3940966b37fab0c3ee2e8fbb24ded6bf8 + +# Official test vector 54, seed: "a7c2c8edb3601396beb2df0657ec82fd5780a2723581a9e03dee1cdb018440439bb1142cab0487c5d136e9af46338ab7" +private_key: 61d034b4827c4405b4ce0226038c1e98f42cb587123ec8a44454c38d4407d5fbad7068c373ec34f303a6c4272990957c5803536618bf07418a9397ca03a81eb4490762da41aa5731a8b795e077ca1da336279132d785b9816819f58cad7804bbafa32fc501a5f68981c48b4e06a7088c2784e917b0645cc28116904eebc3417c525cc312a3102db9d97cee85827a1775751ca137e117a217a6fcb4546d946ced119c6b1c45a2282415e9c11d6cb18d22616be6917a38878281bade6241410a42047c156d0c6fc5dc8060d9046fa658727b8e4e045548a5909a9c7139391e058722c7969b0b48c737b3a092082bff215e98d8ae1b09b50c25176b2764bd414d84c57ec41a4b8c04c82eb22a2e52ad200a6e127968c844c8887c014ac99ba8f54067621601121de01c8f5b923fe089584ae181fe8cc353f12390c565332a7bd8953f97e75b2deb83fe53b3aaeb9f4a02ada9401fb339c9bbf09bc6b826d9d0a1ca5a563a8213b8858e91050994472dd9f1c81c831d8096b72f360a65e194c5b758b37528808b9b48a65c9a04b34ccabea12cac24599f2c366646581366b71ac7724f01d833a5e76126617bf7630886e44dede81bbbb44de625bd89e41ae0e28bf897202439c346a438b1a8b518698af80418548664ae3699efb8271e7c2ee995731d7309bedb87c2572a6b805f46654a92d188ce661b9e197203113446cc5fabe73a35b97cb417297988cd02cb8b3e0498130341dff42a85281f667abcebf576fa266f44b2368c926385cbbde21621094c492607cf58227c2a12a8ed79c6a726a7cad81b7e9a50d78417619ab575a3c54bc77f5a80206967029ab92db447b0914168d8b37be0438037e2bb3eeb95221a8db95b07fb252044760832513bb0a7032e493ed529267c278dce0b8d954b4ff0bb62785c6d24328addf3608c50c0b9eb5e3bc685fe198be984735764bea637b4f8a149bcf356d8a57d21b426b736cc8e9b396ac1577f41291f433cbfa04697180f623a6564c8c1f9723896437fe216715a30820db78f7f0a78ad2ac034f701ec129c95dc49d8eb3b7a585aa00046876a7456278bc4a617cf9b8f06e89af742c14de2a7516c65c83bc53c3335df6c00c0b344f79635f232420ec893d9e29a36986defa37403354624607e343b82660b3597eba841b250a15574b009716b4812d5b175b88929d3539e3fa97b3a16644fe6bac74c67db2832a9e8807eb9745ed0afc0025ee199b39ee3954a112ba484b3528838a4605ec659a046b1722da037f9e2b007c895217927d9aa8514ac263a08cde86720cdc012fcc84f7a089ca7c51f4ed71d7c1379fd34c713cb65ce3410214385dd6c91ca1b74a3b24bcd45b5ca097a02359a70008adb82921f7a79b30a8689053f0340453e6b9979c8c522f606eb4c72a30970c09562d9fb00899c2127311ab57653b5833035aab95c61c50680592db86718bc6a5393a96c07907748be2a9c2c2324cb1247876b9c3a53fc2340e32abe72b39ee59e284a62dac56964c721c3d305125a22a94b2b981a5f16f7ceb6a72007c92ee110362dda1deeb28d26c5a5ddb58b4b665f1aabc8a90628abb65e5769194ee98f61ebc4835775efc50cd5136a4981b339e1a1368287fc699e4d50bab5ba45320968fb7cbfb358c92e2564944571591211b510a5b044663ffc7deac3546a8aa060537bf36229bacb4c5d918726b5ae7dfaa45f153f329140106a80b3c54eaf273384dc8e47f58e68621f3be905ace09a76ec9839ac471f9404c196587cc95d90166a247029aae0802ae3cf6983355b330bc9c6a4748a6130aa510ca1afdb876ad0d7b2653c3c88079e14d7898ee482f34651b7a238f3f07bdb4989740861d358384a4863c39b8912259bd78653386801d2450cabb6bb7fc287c74b2cb24c5688b66f7952c289eaa5051b938fc833f343c273652e4a1a6ee6c35c8c8131ebb63c82d38046b41343fc0fc660168931c899088c92db171f75b1f691577e09ce56435ab060c8fc084068133cb67cbb0fd36a73d8a21200623ef324256b99b0f60841ba9cda515f62a978881318fda87c95664e4a5755c72026369813dc90c8d6c18f48d61c10e49a7e9449f95492f0e4ae14f6969b654fd39bbac79c7e0b507559d5137d2179b59b21dc60679cf1b455b94208d87514c008898a95747ca9b530164743a6f9f1878f7badff6a4b2023ca367944f288a399c52648f834c28014b0f921ef04127ff4ac656196c034c0db9a7e8ca64109b904b2427fc601732c12241cc32589790e3bb71d924c184edb521d3b090a90ce0b296365ec6911341ad4d8cc7c136c87469f1ff101faf3488f89b52e98b920a659375125b48c403b4ba3175bbc6cc5a2ccc206dcca0440d54c6dac74ce4674e46444dfb4b5070926074c089c28c5cb11cd4c9c715af34aac79644cf2ad471213889c5e7ba92d114150233c673e505376f21dbc999997f43ff9c3b0f8f1b3dec09a4ca3ac581b9192984e43999f0d34aaf32218b02c8aa2f21c579457f204bd18191811e7bd6e4aacca5aa7c6f41fdd192bcd24760a2243034021b192575bf811e1344a25e1629b019564c39b09c88ef9b1ce6761066030bab14ac202bb6a8d858c3fd316c4fa81d21904ae691f6fe7931dbc93afc09f18f3b278e4c453ab5081372c093a9a38ea1622379f56397ec6c47cb7067fef7225c952c262792dda68135e45c3c6cbad23593ffde806fecac55d682fb23839b37186d4a40b83641d9214b7e0490e305807745534de18b9d4bc5eea755cc117b68b7a30f76a9458708249f02dfd59691f0b720f257f1f96cfcc3573c5696ea33017af14a843b81ea58821db21b73a9b80ca187685dac1f8735ea219cd01c6688f5bcaf4611fb3b58ad65b8d7c8ba4ab950bcad9b23d5b2d0b718397e111feb25f1739ccdbdc5c41d943e977aff5209134722dd3d54b923b511661127b284ae9ba0c27f05aacb20181602d9bfb32c3e255e7f48735bab94e515529a9591d51be015a009a9094591c7e07a13c57e636b6e11cf4835a8180895a6581507805a1c7a39ab05633798aebcaae89e37d8d75b4f34c73c2184ffb567069f0b3911943c2060f34f10f835c8233a34b5618501aa36ebf678dae07af9a567ac7143567c92a89a94a0a4abde383706ccc3826a83dfab8ae7165c6c6555bc77a43b5b3b2b590c56ce25e792796283737c6f5b300a0cf06e0060e1634a434793383860d84a76807c2983c57522fe3f988486bc386cb335ab55689d6b449b7a38dbce911f512e4f148aa1567878025deeed7dab8e62d43c3d2096e4682692537c70ebab9e1561cba88b05ec0b9402bf02481ce4b27a52e87feb92c4399c7f2988d40e942e7496ad15ad2aa88 +ciphertext: 4d85b317eb5e6bfa5ef78c31fc794d40b33fb3f1bdfa125bc5372bf84c6485f60b0e4be11cc54a2b204c1e2f67820089ce68f5eb96ce78361612f2b08316c15c609dd8dbb0f30b4c25983410a9e144c7486f348036949a892057eb4e29e23a7ad87eb5219d5a684e116f34af7fc3b5e37e76d4801ed34f066117622cc9944468109173b105805c3520de565298b2cbb47dd0343faa575d26889c032b7a53bc0a9f0c90ecce39eec6b4730c370ec58d959091d06472279262b07129610e549da8a4fbbf7dfcd5fceb985e7c27a15e78d1228222ceace2072d10b774f5c07785e9975131eef0c0abd43b98fb34502247cd7cf239978224a1a805e60926641bb20adc9a94efd26be6853eff0edc12228106ed7a58fdb150cba5ea1b68fcd58f8e65781f2b5825b0c8093183f7f6f92b438c5d7e4cae70a6cc9fb9a184ce0f254dc84141b80f5d1d2ec7f2442f49d66efabad3bdeaf4dfbccc4c36e1b4118b42ddd66d692cfa64149e1cc204635c152a8ce0020a5ef8c7032da13880e8fd4297cc107c84a1fa6674049c4c1b25a4bc8996420ccb7479eef4f5a6b7b3320b0e798e2f36db5a2be278b430ba1baddceadaab67faf9cdff46b59b3f1b37257a63462abfe731b5f6ab7a59d3028a9efd88f93fbf50f108e2a1f42a2681fd1feed062a512c3510024db9f0e9bc4e110a2642f15d84a0e0016727c837d0a5ddb357a4f3ad9a926997ae405fe1284ddff6901205440b2d675625e1bd23d8d11b9e9ac03c5eb97585b995579581df5a6c69a06f6d9e09db3a356f4227ccd069366a6030d74508a20e936ee586caa9d649fddd1c29c02ae0488ab6309f7a25cc81f246871cdbce087d7e01b2fc1274800e6ba4a263f29c9563691bada0441202a7b065704f6aba0d91c5c9d4b53ace1ef361c39ed34bb94aaa815eae25d4952a0fa45308d871ea49fc8c1ebc5b6a0a93c31dabf41d5f3097a785143839b01e218495c1d075183f35181319793254b56c29e3f02a4f220852316f53e418a6aefe8d0dcd0fcd601627f09a39a0f0ed8359a4482356f7050c09da53f2b74e003d7c2e7054353847f772fd9edfd5f2565796e128a6926f3f053d2cb146eb8871a05a1b9161cca78559f1712bb9e004f0924c1fe51973e7153050592363a93ad12947ebc73050fd849407282360d876351133f4d37e7b5fb51baf97b9ba9cae783468558ad51717656687947684bb61b9faa87519eaaeeec7a637a1fc93cf63da5b2f6d53fe878b2543fcd215be1609142e3b23c51099dd488ffd3b0ad68302127ba97d062f9887276ce45df63d99f494b5fb22c467b674954a0c68bc85cd053af86cd1704e258eba6ba7812cb2b9c9a1cfabe67d52b7f9115773d3c4e3afba0fb4bf7b9eff6f220cd2a03d4cc7c5c9202fb4d80ffb78aaa8cdaa1d8b0a603bac25afabc0502a455005eccb3c24e2b4b05ce8e29ba69f52b3741679c359d62a1f4dfe424c8e77a5e7bbd5de5499d7763a9a709d828e6c0b144828a88ad4d6c5f724f7b3fa1ba80ba6e +result: pass +shared_secret: 92fd1bb6ea9f1a0a195b3ca29e457f4b3f401fb4521842196d9471f50f5c7249 + +# Official test vector 55, seed: "467f6158cb86b724039ff18c47950ae5c49170163c910fc9a9b30141f86e9c06ebcec91497bcd156d95758c9f0c6ef91" +private_key: fa9abdc750b445e2973d9c85b0599a6310583b93c146a61256592258e79664f8a22558cdf55c2ca0240d5b1425b6d6177956afedc12885e12714982872ca17eef52085dc965de960b29972f5828d3410506e34bc54bb2dda3c6a54b5aaa89466cd44afe56388c21b0fd19b744020cf83779359097c3e3086a904376b56814a454935bb53289c1cc4d08198fa6797149c74da0d21f99177093de6dcb8b5579a9641ceaedc74ab8c3e91f2804bfcb94eac1245b53e27bb5907219bbc6b7f61ab3a35a11c3cda544dac262b4289a4a930283b56d5779ee14c62f3a89308f1120e3b34ef87087e0c0ed6b55280031927682870e09db8800467fc82602b95d1f16d680562a2b866380a411546475d1a529db537c1f2b3e3f393c1919d6fb97877297cf2ab346273478afa7ee1044bf4d3353374051e0a4ed2364587e0694920a6cd6abef9f68d00b16c7b2a53d64bbb0645098ba1a9745a15323b2bebd956942090ef2381f8fb747f5964b4ea9a57b22659635dce7c55ff10b7d1c3a76687334542315a05a0931a9a5da734f6b647de025e05e480b5a27fde1116fe03630fdc074f542ab358341ba08fcb79b48cf4273b46c54219c16bc7943887cf451b1fe224bcff9121098a75b2d9b35e71ba2bd94f106800dac689d6002df6ab6528876c39a74d63dc41490077cb94cb243947205841f8b698cc214bc9b2442ab418d7f4a7bec2a793fc6975268a4cb66f304bc7cc142a81f057501c75baf9b3a5f94935b3991c228aa52266ec289ca3333d35dbaf59aab37d659423bc9953656317f48f025076240b15fd145e86db6ea8758b9b265ccab860cf5268aa627c02ab245f466923b91db6a240d1731642229f22946be1ec538a86b7df1a1f4801791ddc487c6acd7fbcbf9f457eedc81cf0a03ca0c15e4524748ff08b7ba020e1c6a4e8e573a6d9c996842f8122bd876c4f6b193f22a68af9111f302b895d2624f992aaff265c996171889661897856b963c92061c4c1db767ecc725056b473753ad6b9046afc82c60a8d7000ccb18b7a3831933eeb9eb02c76e379a5b326c72b0647addc393a6676e6b948bc465578e9b4ccd670bb31a39c5b1aa52c6737433e930b0c2db239ff2a55d8eb649b4aa69b56987e0273d8829db39ac057f89194186dce30b1b20b17f5592c5737cd12ec38bbd228dbf7863ceccffe9587bd485090e45d84c298f811af1925b37a4ace9c751451e326ece073c1503f54984e910ba12fc79f502391784b1bb3b41211e654655868a8d2b5aa4920b9fb2ee7605bd7e8a3aa668f9721212a860dd762113efc1e1ba93a4a10cae185bdf9c80c06ea30757b12768b29a4a3950d9175e15873f104413f22ad79362643599f7d6960f3d662d24255814c2fd7b445d35651ec7c0f873a2a2c255aaac51c41118e4cbcb6f91745150c51cb7a5d5987341c807cf8969c523913b8659dc5120c6d90782d463acc647f16976f641c54ff50bff3dc1194c56c3c71b6bb296f65fc99d20b92662a19a0d8748a90932d498b7e315be3388f87b73ca99611035224fad81792e8c7a3a23dbdf0a44ef9c0ec0c4ea68804d9c9078fc08ccb733287862e01f8712f30388feb2abbd0810cf2485b19b76208b41eb99b73d2b00d7884ac289c5b4632f8362ed9f238e07a34fd7b3acfc5973070c83e03b9b45c65f8eb64a08b88592b6676db235096694073143ef758fc84c9d3097266b66c9c34a6c5f876779936e345c3a07614e2795e65c0793ef3a22cb65bd06bbd90b391eb425223c2c395674d9841109b6929d353437dd49c7cd50d781cab5850363865689dc8bcf81a80c4269a05060965b80a56081c186a2f4bb00e2e942863fb8e507230c29215c98a78e37201c263783f703b17928f36656b99f9cfe31917f05c25f57063d728a4e2bc652e4193e52877b7310f7260a1985985c26caad60c9e6f01b54be183a7c2ae986ab2a85b33788674dcd42566b406be251837266ebc6261c3b62fff702f10298119d414b580bb4077791b7096a7471595d8659614c878d8097e7437503a7c7e058a3dd295d34ace86b9302b901100adb0e6140cbf44161ab33b9aac34a0dc6f1faba14d259c546c672ebb7f528a010d5585c21c00c4b19980c6490d76083a77b8aaebcaf7917a81b55a6f2a6be7941393d0a9ebd2c549417f38682def039b4944cbc6fc629bb3a3ade353ea2005115a665087c00a4b771ef0490748b370d8b4c4ec37cdd352562a11479597d8035c00824f48805000778a81d6a31a0bb8b6201cbd3149ef96428c79569c5cba273a9bb4a77eef98bfa54ba8267bc42c643c29577b2bea5802ecc038ab70fdb1b23d9272b7ec30cfe1791126a185c40a77c57ec3088822c808ed8b1866068035590460d6a9a00c50db70b19b765e7ca8229e1a66f4fb52d752b515eba35f64097ee85399d78ad4c2cff7935ccd269731ca2b3b3217a22203e3b9438cf0b396fc99b6113cbb883c16869bb114bb1adcc06863738541acc61458ec9ac98df381825ca80ad954562ab931d1bf47a1c45a5c1c72d90cc2d3b4cf6135b8b5454ec4967523ab82e9aabefc89780722b5aa12e47344bfbc8c3426802c77c02195255e71555d9045bac868c7d45c06b6474bba2f40fcbc480112176a83ce361dacf2b386cbcd270456e7563a873c55d752151b76b3fe3c3233c5199011aead401b88b9c36efc295fe03dee6015b1ca00c5bb06dfd2c2848125af903c298c5f74fc4b9937412ac70aacf07fb99488c797287c04335821cbd6475e91d66a7d89c2f67285321442c4e7ce61d0212cc16d74c211ed2a7bd829044ff82491d1cb1746430603a0091110f626804e0b32edb0cc827c8ba7c36f87cbc67cec250f65ad2fc621363bb715557848c5a01b256524271be7b6956b72be644aa0dd33925f64bdd3481615246e95294196d6af1aa5aef6880ce2a609715b50fa7737be749cead7c84977747924bc25792509ca7a931c3ffee7341547913ee695f8144afe83430bd5c96ce61f57610f78d6c64c3c33b468b6f3cac46f29b60f0705ae1a05e5c63d21a62f5dc7208d25a7f0c09d8f77a7a7a03d51d2061fb13d9ae97386fb6da4cb6fea0923937536511ba8ff00ba753897d16b76058a15b5c706121cc792076ebc2ac1ee492a36e65d12d23f6488245e998457d4337a2c62c731afa43085a94892bd30393b1c9fcfb380f9815ea491968d6514b8707551443fcdd5926991599da552acb4a19b6342d309b5027cb88909ffc8c83b1778d8aa46c9d07aa2594a7bfd47cb7ae17d30385f988dc748b843b7b7f569e58ccc9215503e1bc2f28f5019fc72fe6d3324c3da70fe850e80aa818301d60c70f3038153866dcd5d179e22db59b8991bb4 +ciphertext: ebc5501fe8979387772fe5f486b5ab466ab6080f3c0c2f1919488c60d46908ade6243b7240e4b4faa38d3ff8a7e5099f66a0a4cc90e696b663c995004254ce33f75092abcff3dbdf52ded59ea137444bf4766a108e95db38f3ec150c2e2be33c9357ecc6f1aba15f904c66873ce66c64a341f0692de732951b43f756afe823496ee48be44b0e5ddd98db7ec401f872088dd8c570e74ede290222efb031d865559083c7cc2b01f1ef63d3defe0f186258b0e1f3a750a0888b6bbfdad4975a1e3d2cfe0370257bcdaabd0c9661098e6d343f96639017a2fe0f8528db5995e9471f4ebe77f12ff032826690b3b9137b43946ed6a6e9fc9db0d3682f18772c9cd369c30b00f66c0b2c3d912401e83fdd1c221e296025ffc49c9a7de4400fb1e05b4551b96f6e5a760730fa998834355c9ff8644620df83735101a2ba982010fd456d6279731798ef26d179582bd6c2404df96ab1402225b8b5764caca763a3a4828712d48def1968e2157c6a7a15ed1b0472f0706b59680a2096efcb8595e42f1ffac5885da71542072624c8f480c1769fb420578146c118ba21e93f9712ed3c0303e631e4a7a5aa2d6f3b247d948e27cbe2d44e2804c3a8e9dfba678a0ff44c201945c0a46cf31bf8dbd6dad5a323e6f4ec52cedcc7c8c12f03693aa0a4ace4e21af890467b7e7e876b7d45f22120bc5a6043b1a8c322f035f16d9bb5d3a629b1b783e1e44d2c1205337077dc68262179c290bc4a2f291110e8bae9de1f76f45eed9ea69f01d692c25e8f33f66dc4acbc539ad9d5a062616c7b1eef940fa546729b7ee744d655fb21ed346207aec821bcb8cbd8b71ee0f46b2e718349b6c422547feeb0fb7767403b0dec26d3dfeb7bce5cb6837960972c53cffd753467cf88088fd5b88ba493244e593e5dc1c85e6a6934956719b52ef9fad4ba14520631a12284d85ecfe9cb93cc87110e6ef5623e03f91848b67d609fdb6b3867b354ab4ed1386af75182f78189704a470cdd8576f5485bff21bfa8d87e3b88e50986909b3833b08898ed5b7e46312364d9ba911219a49251410e76e0dd66aa451ed9c07c7dda1c7c7670667b40fa44e5bfe76a101dde80c6c411f7c1820b46ec9ffe2bfadd029ce14181191594835fbeef62eae04cd00537e6d5d743a9bcd7eb5b52bac2207d7bb3c42a631f9d73fb82948f74c2d0c59d99a366b600247234f619b609f1cb66328f15241d5908acdb63c905d5959e0dcc5fc83f7d1b704274ed17c2582e651200e70f265d816468fa1b5683a4604f7cf72d57ff9aa3c698f02de106e64d99b0551649bf519c43efc04cd8c1750265473d4a1fbff0b6597d670e9aaf63b53295ccb483defa0b49404f16fc18c033dcc1c115269c97eb7c44b89c76be473a94dab492b2d98c27e418671d21288ac7b7f82380c520675140f018773d586f4faac79a08cc50bdb525d138ec4bf6a0d730e9f1e559fe9e1158509001cf6d66cc4994c08c922b6fddf40d493a049f8f587ba0adb83ed5f045b82598eb7d2e6be9d76b +result: pass +shared_secret: e1a195eb1093af69edf107980f94adb3058378cb79dc807684c26c4ee1308533 + +# Official test vector 56, seed: "687c02de1041abac7b2c1e6ec2a7c3375552ed5edb10e3a8139c24cc76bda44d719d8121a81d47a0b762b4e9eeb85235" +private_key: 26424f439191e67b1755d6893ee31789b8c6985191c9c21c1ec7cb8c990f82ac49b7996b1ef48046f8b3093a36c27cba5c35b7cd733678c10ac06a5108609e47da30a048312f1543b8761714114d37a3c70ee09813e79f37e6402d584f51673f70c5331b89a52e61a51d363a8ad8081df227dd621b20469ded708bb64374e2678424787c57940617980def632a61eba801c1a079517302f3b02db4b136d588e2a41fca2729b541c9bef00940270e257c47103449bbd47eda9bc7a9b508d42076fe7734fa5454228958d7cc932ebaa0f8d12123e7ccfddb039a2a66d6d7a0140c6ce16b9fc0b6a0a3b7a0b50a06d8d397c9020f1dd1b5f4216565dc84e8911102e54b60e88abce7714ad29668f79b7f2a7b09e7c8a92480f30b072ec14e96e77e63342841167afe3421c37c2ff3f25ccad60c652c9831c5519390bf0ee9b2f108104d77145ca4b5245b66db6607afc0141324328d746787ecad7f5a0ffeb50ddde16ee1ab87440389fa0b9c44b75fd26c726773bb8049a77784860558107e069d3d0521c6015093787ac6f263d356130b9a39e5093f62d7b2f8e5411e61a18d44155fbb4d2ba7b09072cf6fe666109ab5fc078eb026490720c82b4990a28406a450268414ad4ff1791b370722258bf103507fb9a09b09bb4373465ce5a1ea263bae6b723036af268700d496724a42539cc9b7f7357cc7b6b33e11937a884dbd30888508bdc442379eb8b3682341b3b4b760a879fc229397e05879b003a06acdf3c5530a7b90013873f47139c2d96e1d7b67427467e64cba2965766603ca30e13f2e357e3e6945cda2906416370cd699b3da77889b63be284ad538269929914092b805aac7e9a04d0275c71df020ffa6002c1703ed674dc5633367bc086ce15e4e61a93de94023b823d1fa29bc6250b92a8a04533987a6bc510bbe84ba7fa1699b077c3a05992ddd52a19aa238b466c2801b3fe9f72335e15ec2342ebebc7694ba68e276719371b933dbba3fa07262870ea9521e95650444845b41258f6ca77915345c0af3718ea09f6ad604c9a4971e618b59551f5ef54e57aa138e52cc03313398c0ae03bb4ee5d36799618955789e80a78bd896aae9e87f2bc0a6b730a02bf82af19c541ca93449b127f883af13713bf5229238b19a216478a4880a7d9b6009719209f69519e5774cf48c8aa20b96e4b0f10a94027819204532a54c48026a5cdd5841e6c8a736cbc99f9caf46b8a90648a854f9c6ae37048c6671c5e8a1b2731019351631829c205959a4b4ae87a4c3234c63e653cb75c92237c4721c66ad05871b22d69f3435baaaf311491394cb1238b899973ef79f9c371f045b4145bc20ddb71d53fb50b25c46e674778fe9069197a9861337edab3de55cc28bcca65b2a5fbe1a2a67197bda012ecad40bc86593a06c833c82aad0b714428296248a8e49304cd3955081ebb2e717b36deaa928c3c09ce1bcab3114627a7886f64d69b206cb7aa8f978c13e84a6c6453efb1328684859ec20a9ff7a560d436977294daf2abc08b78ce10a22d5fccbbdb192d57534ba04c5dfba389c3bbba4f5191ee9ac7a344cd519cd39100012da9afba0bf9a2373ac534ada885cc71322e5b4a4b84c473610631d29c37a90908cf2c89d075928ccb3b9558a5453315acabb5a228d0abbb99d63b0294b68594a0a648367fe044e14347073562aeb475c17196a3da38896f2168996ca917a0423614431963b10b5a0d3b228aeca3b26363026d1a5a952b5333cadf79a59b93b5ba484bbe4618b41756a101429cba6407b44a2b001108eb30e92d60c093b4abefb63438c481dfbaf08442d607088ebeac83a950623e057c99cb0f9e31639cacc82852f4cf9bcc83228151b91cdb0423f610552b0c170203c7f2b345443bd7d274ab14cb67b328d914366ea9a220cf46333a41feb5193ded4a5d94c6e0a43bdd6b2a52c3c4c718591f11b32ad64930a638ea9f217e64a9e31526313133c02b5b0cab821544543fe24aefce70927d9248aec2937385c79cb85df91256e176eaf3a239b370d4ef56a90dca3935507a6a86d84b021312bc718662abd432c08bb4dca3614f357321b191a8522ac109a643a5a9a63419be6845e5f5837b6188de0c779fa01430b219470a20da019688802ba8440c60d8727394114db10343fbab0993ac5d967b658b1551a6570f7d9b283445cc278298b4740884ba72b338c45249ab74c84a1435a84c42533a0bfbdd0509d7a3bd0b0635f538ce72645650931dbbc6e2850cd2585214f5cc12f2a2d9c2820d6c0550be79d5276747e2c04bf976705227c842b872e294aff495e06502819c6c92de3622ea968b07c0646dc0301c009fcd5bf7f19a357693e032cc46b4777a1714d41a59bf07721a2490be2e3cc7e4a04fe48a8db361a5cc1390d921325875f80629c2abc4d468a40d9c22911b9bdfc6ba986b9bb7226227dc63d75351fa4613de3654475c5668d651f9f03a386179cad00100b35343f48b7e36a79dbf979cdc734d5855b90128fee10c9bf40acfb67332cc8c9ecc4a3a9a98bd30c708e7a630a0909dc8ba2b1721e42250b83623a1289960e7288758525d4088525ec25511bca906930602b5ee1d127c23205e681c9db3474aa774733100838b2461e45cbd603c3a74122b679cdb9992063e089d5acbf74b03469a3ce7993c6b978313a7a735e75bb94976b3539b4298cc47af58425c24310667b1315baa5937741e35309f1c70cb8c60e06ae1793502a316a276b2e21087305f453d8e99d08730e174159db09324e4cbaa067cb1e766e455a34159465bf1138a285cc386502d698538ac63de2f496b120be468a952b02c5dcfac5a997023b5b3d98691572103e158672eaa0a4e4f44fb6920ffd874f52748a630aa41d188ece499aab324e916079b3bc2427b35896b26b0d2564b2a875881a074706713d326306fc66efaa1b8d4cadc7c85b7ac211c4f61f68a124465397385b2ac7a09686935cde06638f156e6e4670f963ca82950d3207889446be69e2a0d7cabfb16141868a6187b5be7977c354fb27a8c9cb8197565480244bf296692a02701580a2b4ac4772b13a27c869123ac3b6cb6699698c11261f657ffb6c8d78102e0c60c004c0796f319330435a29abaf33dbbb1c566aea10349981409ac31c18aa48631a1f0657116821a2a36c2403870a3787a1e3f36349b3373ae729a859af3163c078c38ef38c464ac5ba1fa8150d9093f97c17106c99c632bc42a5ca0595508bfa7485b23bde8d12ad7bfc9c10c68374b70a4a46655b5a67d10697d2f9e047e603b8845c9ecb168576f9d8bc7f3c831b6ec15c5fa4f744315d3afdb8a246a56ee71465591831c371f2eb87467b0559dedd776ba063ee6d2f93 +ciphertext: ecddf4bca1ddd56813da6d33fbdec858e5623a15168dfc3e93d9114285eb4a7c75ed6c01bf62a6a1e9095e840348e68905092f8e9907a4d07f6d49c99ade01b5e5583cd93eb64695f695e99c9f646f335e37db423ac1c5376393195b6581ee7ef8db5a28f7e9dec1e0409aef29065c3b3f486753ad9cbd5491508055aff32616b3c1a3da59067c629eeb7029bb5978902886fef7d8cd0bab7474e4b6e0fc844ec6aacddbb8969810cac38a3b40d6b0927a033724ba6f77c59a173057042eeac0a9b1d4b89b04317d68feb1208607f8b5100cca617f96ab20845e1ad6b1be99ace6dfabccace157398b9e9a036a70b1fa755c2250446766baafd4d2b3daf13ad2ba8b727146ff87c463b06170bd7bf715b3f5892ca1a80a602103eec384da50f3fa5c8498be1029fc722598677bbab562ab9dab1eba0d6af783de2750568d7c4021ec95ae18413ddf4e9bbb13122e62581e66469259d79576e601a772c009714c28e3117ff2e9a24c321b1d892e5b3d42084f63c38a6d41f41032b405bfefeb9ee955055cf89bcc545ffcbf3bb3050f886637054ecb4d83e3aeb5c2a11b946386efabe4a7dc7dab6eb3d6944e8de6060894c7a81d515284d9a0c1a5bdb4d6e4d20e66e150635060cf7b3c5917dad5bb78a88ce639b012070e3614389f9e89f70cf2064bf375bd8dbb4744717e771cac29555f6300ea2077c882c933d366059dd55301ed24cabe484b23c28e5e4578baebcbd1c6595b80ba173a00e760cdbae70a0fc9b77974843c30292864fd68611382f4ff5adffa6c0585e45fadcae5bf870fc0fc7cb8a8a0e2c6f28d7b2f18a3b5f95e3ff82b002ca8075e3f9341082acb928b8a4116c2582147163d64ed111114b5c8abbf05b969dc74798479d345fa61bac4b625175e11167ad039205b70fd42426d0ded200cdef40b0aa37546f66c77d23de1d3f12da7030af08c8ecffa7617346de3bb3cfa66c5c9fe49da420bdfd80e541081d26ce873914afaa2180a683f738aff3f55930601df67dc7ee4ac20a60eeedadf36dab2115597f09235cc49d94db30b7f8550a223cdd0bc1fcfc78092fc52ab0d7651dce159dd5cb75ab3a7a79738f3e8572eba724e17fea9f70e7360fb279369015c26dd7838f117dcaaaf6b5a40bad8a04ca0c81e7578be8dd6378b6b594a64802c4bc0b2c36a62de594d2bf4ae5af1ea409c0ddf281fd250be74a173256f27830ca1dbb4d4914c7c2a179101c31838d4d2b131d6555130a5eacdbd4e64b8275a60e40ae253e44251d334b97a24f744f8b97400a90010f5232cd5b82181ec4b6b7bcedbe7b4a458ce772b508a435cbee00b784347fbac95a6493085fa21813dd7b953f04ad694936145f859a49c246d4d9c48cb94fa77bc9464c773a98df2e3e580ee6e81403bba5975bbfca547ee9afa1a48239498209d1d9544764cef4a9eece76078a72c4fa81c3ff788159ca33c733d6d06947580afa9bbfd3905cc2abf5430451b7a54e4d252bfcc449c406003966209594a2ff623978ba1ceee +result: pass +shared_secret: fa8721164f599caeb949141b24a124f2d576b3b58c1914af2b05da26b09bee30 + +# Official test vector 57, seed: "4142237070c216bcbe245a39bd9220533c97651d84832b26727855ad994a0760c52b9319ad404693e4248b8c5ff324b3" +private_key: 1023c0608301ab03cae768b68fb495c496b583b72006f0aaa985800df2b6ba238cf37748dfb231fff957ab744cd8c5710b301340426d66507f48a23df19878d9cb0ddfc06e1674c03124cdc4c1c70acb645ea55b22403190d813f287a5c245b4e7a31d11988d218988faebc195366760303ff99433cf07b68fb4bf6b8a507e902b0a07bd2f048f0393bb9f5b40ca588208faa73789a0107ca9c4d12239caca11500f3de39995d11911b9386e8bb22cc908e9906bbb247c96a0bf6ec14bb0e33113aa4ced8531beca2d415066cbd299a9dc920a935b1bb599c0c14a695253fbbc8ad7344122e8948f5b10e46138b28740348aa888ea0c18d53b875232c34bb0d44197352505231bbf5dd356b8955856a4c3bb4615dab0a07724065f4ab0ace46fc684a3dbbc9ac0e776e6d628af8a2794829567a95d2ac0699e3a87a46086781965df032586290d2edc5c57a7332a286bcf39b8af181424884863123d1145031ad069e0a56f9212c76378871848b121489773a623c69c139a33363bd032a40b4fa15637c01916c132754bea335771810303418f75a35d591f212a603dcb2f3fe9ce261acc082b4e38477ca9348dbf6bb981128be73c189147b21949666cca3db8e433fe66ca43206356884431266b9d1a92b1899217aa636d3c7d7fb11a2e9ca61abb586d20ac1e46198da618cc71bd52b922de064ff5211a2b53c51f206e025505d3273f3f682e1a873cf41433b77608739b55d457364c04315dd8b304604c2fa52734fb25ba6c69f9030008a310ea76b450281168a3201b9892e5b7926cf53c3e3a591979874248a361c5c1f601d0580351cd51a78392bc4134c708dc822ac8b9c032a80875b30eb69f9a636b2ab13c6a35ccf4d704ce40aed8fc2a3f47b50599b024f73444a09df092775f5a77113225b87cc295e336eb8668ca6b3dc1d7b5af00a75730c8c3a45f05f9a22c66143965466f5b7cca564b6afa4a3ba0a57dd5b7035651725010ac088727c5b7b5b91f173589e7b94463f70bf9813c28b405ee53c10e1943cb61ce66527d7c0529cc67b181ec6b4077ab764aa9455052495c9dadf033ce50c51a3893aa250f6e47711e96aecc69a13aa60b1e837c1ad98b5ad2931a9084c6c364b4a33de1a02d01d9155b527f036b35d5ec3d13b5bf49e8be9b0234f49400fb512e22a705e0b6212908b77f715b3813bbbe29539cb63f78075f0f3cc60821b4d24b5674e29af16647fe917452b85a1c887286a89afc31955fe8afa67aac2ab30295d8564ea94c720268ed866ad36c8bd634b2b6e6977ea1781a592e532b3f292b8fcbb10235246f8c320d6daab3a7fc26b63251dd98a12550166b513a8d66435789bd979436dbd263b18c15660693e6eb99268a3d80ea6c995234d7e08b7712b295543b0b3b9856c72cd2268f7f66a0c67c96a2a1bddeb26a4ccbaf9d7499a7a48a65982c8059851b79c735897109479108acc7e668bb16c8a530a7bf4f473841e17c191cbbf867b36059505446cb30c26ff5970fd21a4043854d96d9575ea25415c263028a2a4f35c824001eba5062e23098fc4556399241b8e48933e28c67068d34155507e23ccf4877bd170f38203fea3b9e2a289602301a00e7a56e91a766c72c04ab283d25787224a588eb4fe0c6b54d889d127a471a72c65f06375d1a545ad9b058a654324b5615138b2ec4a375989b3f1b60fd30bddaa2307205a103b29be6cb75f3567705a0c05eb845d493caf795554ab25fd03b379a6284988763698b1bbb4b3c1a54b9c2038e9ef30a3870a11604288b32336e15939fd181525909949c6cdf7737cdb382b1dccc0c49317213683b349f8da22db0b45e359b2f8e70916a0c0142fb264cb6bceb80afa3a36912d635d7b4cbf33a4a36e4c6714c551d70a18b967539b7a604c5182ee7673ce91d07736f5b97b407879e77050bcc089a14332138d92ab3e09b497b834df573dea32829b471bd5a73e61361ec699ee60320ccdc0e6fc983d3238a8d5abc3412bf48d67dd2e1b0c2692a4e705de666aaaafa9eca476a1b155d52459b563b6ef1549c51f83bee2963a93729d4746a01a21dc667b120d38d79a45a112067205c3edd378c7f65c940719f79389436a5595010678e1558ce163ad95593a751c737d4936ed9c7cfd41effb1abedc07564fa5238ea2d2908793e2a9a33e08b67ac3133402d42344f6d1c804536263661a557739cd8c29682549fff416c069a39cd48229e47066e02612988bf780256e25009ec5b1ef829bd39bc0654a0c8c3c113cf421f06965713849a83cac9f6415482d82074fbcba804b4c5f2b1fbd941c7ec8c4c691dee981392bb0736d43adb3ca548829a55bb9537396d7bb11922a9167ef01cb1aacdaf17902f671a6cf5487bb643e0a1cdfa3522860326d374ba8009833bb08eb09a2b3cab0d3193a6561c17d60b1cacb24cd3c26c455c040cf9ab0a7292bbdcab2d5b783d65bee7a666ebaa2764e98b7df61bd5ba546bd307ad7469e4ea85b6031224d9b1315720ccf95273c35767c43a3b27a31773c5b35c7e4aa0316c53cdb2fb1a60ab77c4a76f2af78bc2d6479b909eeb9c26ff97a47c468dbe7c439d232a914766fcf8772e7ba92b3182e362735c237bcffc3e940cbc5e6042df923eaec04d96e31cc3187f66735ff1e62fb5460895b22145787484e529a1d654a2d72cb9d81b4d283bb15682e8f9bf1037cc95e29cc3716fd89810e1bb95da871a2562645e0c60a27cb508c2885c19befc686db2e7a78aa66b934aa0d42c856cd361ee93294759549929b59adc1ebec3686e70c4a15c8d56dc23ad080945d4734b76b0a64b73de7b5d810ab8daf48542a4c13b8a14aef05c788448acaa51263cb31be69a91888ac66075c0e59ead1b29d6439e94253d20f965d9f0aca53a28b4903bd40a1310f0123ad221a45961527589e7048faa407028601e397a96b39728bf55437d335f1e14063d3902e923863bc90572891117516fba340263d6a0aaa0743e959da8f21ef9fb38431b36b1328a15696e97aa78ea97936f8b38bb1556d2625f5ac31e1b8cb3baeb1be7f808b6329a440045eea532624354dfb71dc321109d0058f24ba4729c375ccc0440948fd345561715654f60b378b477a208cb83f3afed2534c5ab6efc0a5761d46b6cc0a6ada55d1c92c7558bad4091772f65bedaf335ba37af34582e0bfbbc6609bdd3568001734520f45d9f4772d1d21d5080b9a7a2b2e72a0b6e030f1418beb28a229c8f63411446b83fde11b3d946c9bdabba08d495aee50911cc66291fd0d49e426ae85eaa6c911c4dca80caba6e28e5f645a54d8c016de51a2b98241a29230e05b7114ff0395cc6634db1eae8258072d09c09f291e92d6620b177dc50d7 +ciphertext: 2b93edc1c5e164af29c51f768f38811685e3c326a9d98ae6628eabf5bda5c6920c7fdb738643230ef509286db3cad01e0f817cb64cba6e8a89793212057a33c5ac88b19d148a11124b0f6a6c0a4b86f25096a8cedd3f5ca81e1851ce1df2b43525ab9a0a95e8cfc725c891583089904aae1561cb9ac21806662222543d7f827cf4b6b3ed7b45bb0c5a0c1f64d73c9cf4b833a59617c2ed3580581b886fadc3bf00a6625a1afb067579db0b984b16fb645e222ea52dcd8aeb0538a14927c32ddd1c845ac95802bf48e49ade7122567923de1d73e46867f9c9dafb8ce4ae5d6a0013d82e53674227b79263abdecc6b0e0fb7fc0a2660fedd5d4e2febee35300ad0e9cf0c7e7f1ceb18ccf38a682634fd6433bc141dc354b8e3279ff1547de9853d280c9ca7bf88f34b720633aae88272ec03e7622ce0ee3c2e2c66313fd286fae22b1da9b967d926d0ba0f63a3d02814d2ad22eb462243d574e6411904ae35c859366b7e09838e12676b1bd89743c990050ae185287f4f89c1ebac8f477c23022134b343868a9db57bacd273f873ff0e96c93f026126b97b6bfb9c1d1a21b10f1cf0694159b3b01f802193d5046bfdb224f4ee0bd520151fac75338ddfb669d5d3394e0b9776a158ece27de77187cb0baf7b2c1b29a0013071078c823d1c0faa784a4d5c8d6ca224c5fee58c13e983e3369e1832e72b43e4492c21b33477324595a29da0c3cbe2c2c02652b22ab1de0803042b08254a1f3dfa5a73cc6197e3e4fadeed10f3dc5d9a4c2378fd22aef84cc98dff20ca24118d9e3a54a0c23f96bc70b102593c2ec8fa781d6622395613fc57b06c175e7cb4823eb0e692a013a493fb83355a9404af9147b2ddd81f75e673599a5dff78b9e383d656f2f27d2e9849a70e44ed84da5f3d05bdf4d929ba24fd574fa21b479b88227b82888341209d9698a700a82b2cccda24c38ff12e32d8182dc9771842da3fe51a191e1c28002eda9a7a13a0f84988b356da88e270434dc8f36359ff179066393af3b90e06220e9eede70e27b13271edae76bbb1cfd9b2a69b931d9a640dba314f8a4907c61745ce418f816a84252917cd4f4ada572b89ddfd065c3bc7604f53776347835d237c53a5c1c26a18dd37c9cf382d836f32b9fe1709c1800aae66d4527a1f1247382d54dd69d0b365f56de2cc38cb302b001e7cfb0a8b7896b38c1cef72ace55717f465e2229d806311904fc47200708c209c6f1c2a1977a845a5e83385b47aa5ac695247a4ea9aa1b3b3c7e4a096c07ce6341ca9fa0c8ce26e8765f35c04d4c7ae8c814e3910f62e50f728bd4b1ce593dc651a455e0b055554f12d652fad10ae94c1a748d3f5067b02d81347bb4d80793d07b5e71ff36c3dd11455c054a23431a830ac8022b8fdd7c273ffe4fda640c89ee7e1aea9d11eedde7b7258ac5bba74fb864663c44f22d92b28c5fcaacb8a0213d71b7f86d8de1db6a5dfefa338a61166d9f9841794b3fba4a50a5d1bdb95058b2d31aee1f987f8840b829e65f382ccfce8c298 +result: pass +shared_secret: d479c2f5e622cf848d921a7155cbbade062d0fb3ce7535d1859eb03e18ac64f1 + +# Official test vector 58, seed: "bd334d7b7eb14e00e68863f2e5551a095f8af10681c28353fd19b9a7e70b8bfe266840860609008a567abc66316c77ce" +private_key: d77060c9fc07dc7287876347eef702737a25a8b192146a5bfdb637f936b280098224a38ce6311116518028cc005089bcce93c7c4f65451b893eb1872d5470342d3627e90110022b78ca23d5eb97ffd9a16be398271444d6b17c4c5cbc680fb9f65c844c86c40b291a3cc5a85096b3f150ac9cf1540d1a29ab0d30874db91d17894d234c6bb376b3683273d198c73cac396d942c7cc2c63b19204c15792071ea41383dc864d2619bdddd11431d0b7299aa720516fcada90aac7148fea3d63a14e95d01fb51c03d74bb49aabbf70ab50ef225795340086a0b95a9cb15349501f4c059b26abf18161151c21bcf30d325c1f1d348b58b3bb0da69da24c18d6c75df0f6b0e63414ae9739e9eaceea4b00f0d33775121e78742f9c6ab1aef5aa83b14d8be365270583c0c90847724e39978095c297799774ae05cbd4794882349c68f5a2a2f23877e395c5e14286c9774aa159703312ef63af3fb2978e22a5c1c0152b4139429783ea5bc90016701f1868c2cac0acf4649886b773e5c29dfb7bc142615f93216d2c3ec9eb90e772359614c57ca97c75b593ced123f6a8bf76854d856c65d5069ba084c75f10290d104f5c9ac498200190b72f004897a8d83b0db3274148443f1b14108615a3fa02668bb9baf1086503351ff1301e65085f65cba909bcc42b32fd5578522baea9f515e48b040a259fae266127bb6a8e338965051943c63ea536b5db2c3b6c8998d4287922d5657da1269e8071939b28aef119b0eb66a87378064162b1151e852cb00f927d6dec61bce0631a93c1b51379546453c63626f2a792d20c36aff9a3182c6e7b5833da416f29772b70216732c376a4f59176617c885816bbe72c38a1230f484f1fe4671fdc1224e1bdd8d795c2e0917692517c4441cd4cc3bcd71765212b2e4986c881b2b0e8a0405ba2f7676a41f4aa152003cc185be7cc22c9f402b878bf9d44cd32ca21cf92a720e35f81007345d3bf40b821f48b4b2d693eeed8cd292b636e7360f79237720625e966b9a5d99a7a452d2bc7066163a00647aaca62044938ac6b6598e9eb003175c2a29c46228c7b6464815e9a271a690e771601e252b251f411e6ea91f2f55ea0150a7a5405f536849af80e0840c322c5b339470196b16cbf24484f407dc84819373109a9676298ca273d82bbe4e24946e0617e33897f170bacf4b7a312245ffb780f4c5100109f8c4b629ac1042cb7a946293f740a3589e069987aaac2d996f5c9886d7125cb772a6d93761851076931180d87ae808a908d3c3c1203ba85739c6095b4fbec78066ba9da4433dc4928f4d73e03108fd8f531cd6ac47c088a64562e607c7bde3867691206ba9c058432466eb54a9414c3a3127208a512ab5973b5d118c51468fa70bef827649be94d0d97acf60b693d73b062249806275a5d475afbd943e96a512f45ce54343bb6f353a9b1540f420cf4f01bb3611a09925e430237712a8c2b91beaf7623cedc6988990ef8006bc0da49c57b5eb718409c8a06f81ba501090ea67519c261574b118ebbe1765a145309677ae4fc9ed499934e24500056372a25271f40bef480218d978d6457aac1f9761bb63679396490242558b2b6c617050fd902523a8c2450c193211551409a9ff92089c54b048b6a80127c7742ba34333bec498e28d729d6085fc7f5b6e5c4212a0aca0772af8f83200d422b49a80dfa17cf56d8277b792d7b4675dba3a7502674f595a45fe93008acad026410de336fa41ac0c725bf601280bf7b4d7dfb63789175b7748dc54846f3a8b28d055c69e2424704bd84f61c896a40447bcd42b96834c8429ca79dc4a4be300c7dee38a253e35819a43d833046f6437622094d003a3b9914bc6946bb4f4cba41246ca027cf2e599a54a23e8cca88086a6bf8aa92305185a8b232a0f45903224ba2d3276715640451bf49c350fbe5b2d95a5f55223a1a794bde26012bb48ccb4384b3027855331e96ba09c7e757bc71ae9ab2a1adf51ff01bbfd4c77a40dc3e24da767d8b456979913ae97fa9446413084a45fb7827a082eca1094a9437154b2c8edb48d7bb893ae3213b5a95f86bc9e146657ae653f1c9bf54f87830aa968b96b747b9aed4007ab4030ed652652daa9612d00f36bc2dd1299c8f2c84fb56045ab45279735aa1f57ecc470d7e66696a8b7a65bccf23b63ea1d595363466a4d24540e21bde05733154180d1a80652b166cc05af5a7cdb2158471d52fa5006a8ea25c98167f4574a8a47a00b7c031e667a7daf41b32c714ae1855ea9bbd0a1aa18bf64071c44f3783b30ce8301f20cbdc5c194d6131712386bb135af9b55c680790b5147f55a6cdb94075d0f0c289f42aa638623c16be446289d099777717b89922476d8c5511997419d8b5a44ac8c4a9589c5b39c03b045ac31a6e9967fa22c21f5bae213065867945ec746f776b0daaa96d85b61864fa94e76474beec06815b556faa81ace15c552558c0575c44e26cc4f919d3e26fe1374d2afcbb3de23a9be5b366c1a174d8b78ca462705ba70b358d57a751180c781b28075435b2528104ac0bbfe5912f8fda282f93b7e3292a64b83494563741789c98eb7e84d69c7cc2cb1703ab94aa71d7491c69b52949818245acc6ef07c11fcb68c336738fd762269b7ac562aa7401965f2c5b2909404b32cbc86671043ac334e283ab194bdaabc390b0b2e275bdf0cc2651d11207a53db1a2166b7526633cb779d88da83357b51c962f567d03917f0f2b5c3c3b9ba75699efb4a8a5736d98a56b1510cd6f233c2c05909a3ba6203c11ed72a0091785acd729dd609704e51dafd4342275564615b258691b59266a0ee3a8b261c6e9e9894b681806e97fbe3b25b4b133d804a0286a909752220c11c8644417f34597db43ac66159956a11541cb4348c23196095be01023e7b267c1e51fb0c11d9b787a519b3ca3f0ae08c79ed3f256a63b488e38040195983da72f9cfc03a9c5a7c428898291a9bff3cea8089a343b73e616c5e02227553511722b04a1604d5ac718ed753e8adc001fa47665b76f944c10dce0635e9c98dd91b9e6790da2b09ce323ab41cc7c29839784e6ba907979ce815f982585297b5170dc7afeb94524563510257d99131981128c7953ad87ca696d58250aab373ffa3476aac3f650bcf58aa6bbe85168b7c4012b3359a2b6bed702524b8498d3aaa04c7915211e1e013e1961b0e2e32b90e01e0b372446931a0fe6255b412581e2b5c0d60d3b7208a63449b4216546209bab2ad3767f9793d0be98cd2899da27f7d980122d0bdf593022e2903d69da169d8f3f65eec290acf30078fe51bcbd1aeaf412dfe2d31c7b10157c1100ced48add211a5c937b8d6079d8e271af3f949edc61f70e60453aef20dea9 +ciphertext: 6c3904a9d9575ad0a33c89bd440e63070bf0433261fc2b3beb68c1e244e489d6ff2605e48e89cea781bfac81251854e85613a0045b4da0b9535073384a36ca0ebf9ab4f3f5bcfc7682dfcd877ddfb07e5e108ae24faedaf75320fcad7edbda2a5ac5e7ca2882312699421b180b61e8f67bae67d03a241439cf6ce69a03b82d7c1d9c3e2e13fa4a83fa8151f790c2244d1952910c946dfcbc38da37a0d5970c23229860a144d374439e66113af1cee797dd7966da0cc64dc4c6586bd5d44da9513ebdfe3413199e89f359cc17cadaf503587b80313dac670791908e2f9e32bf8271cdafecf912b87ac0eb16987e4afeed57f3a83cfb62510b40fb8a0e1ba08e44f65c27e647b3f7b50e8142fc2d9a6cece5178c0bbccb8546cb31e7e5bfad1851dd63f4cc83758873c3a06dd420ae4c7bf28d21bbd811ce87bdecd9dd79d092b5aa35459dbab31c113c82790fb97633d0316fa9b6731cd03a888b32d42c460e7890c5d3873a9885f6dac651f22fba27c25060c70a1d41618c352747a4a5db855aadfaf8bb0ad62067e03ee027bb5ccf994ac6b95d3fe0d994083258ef220f0eb044019070bb9de46b39c31a6af5b63d4df8230deeed491838fef7f5f257ef95af41b1a96c44eebde9ee33a526db893f6c7fd9d85bcc562b3bff3cc293669fef93e0341bbb828153ba59404b1616ecd79b3fa048956873381f7cf298925d8272cf593afabea7de258c51fc2b5e7c0d9aef98e9de1441c07b460f320ed845f4e6efa1892e23a429cd37c71b80a4e79c92ea476af0eb3267ef787c77d5cc236e9ab87352c30deaa1e612a86a801e9e0db33f9b735561ee5e1e124773f989a83a199dcd99b342087df9e7c63fe7fd9fa6a8335ab7e2432d1cd7e53c940e293f49dce9bc005a58ac2ccf8c993641231a318e7778c8e3bbffad24312df5b6f8ec61a65607d3a417cb48daa55d76a805bffb102dab2178bfe2b8e720cf9aedb2bb4f17086f860a866164771b77b77f8d35da63d3c06d4355555284255fec035cbf45270ee83730dc69faeda7a190c45077265b1d2138891092b4d1903512cea9cea5f9cb081092f438fe80ce6b739a2b79349cbd023664d967c952ab2c6fb61e8c2981b4ea1653ca36d40674cadb7b14e37bce21a145cba822c81f93b22ab3c798baa4a3928d9d5327fcede7362e9d4cc0eb58496c27bf4b245e766bd097e9b839812b1bbc1c5dfc46044bc59aebfffd4afdcb7b28d1bfb9ce5a5c11d4d92d720bdfd0be1d5dc115a07d48f6c3fbb3428438ba14e9700246ebff56d6fa77213a06a550d69f38870af60fcae077ba78485fb59c054d3216d5cbb070c9ad6a800ef76b05fa5213a744501e366d8176787c7846dc6dac77e915d2432a6b08d1a8fb1c8f7f35a56f28aec6b2273488abb17a2386735b06fea6feb589bc25a96231d1017052dab972368c93a857e0b04a9ec9c840827c8f320a9e2eefe96e91c70f658ae1483fa651242d965fd9e67ef26e2c570f89efa24c624bdefc51f881b8bdf37a6aa99b +result: pass +shared_secret: 0dc813eb106eb0d4864ffc38432937a1db0d27745788775a8299e93d1c808f18 + +# Official test vector 59, seed: "a0264c58ab1f2cbcb212077fd378d340307accb31f1312137cf84e3d3135044d4eae8bd38bc3e540a0c14d46458f6179" +private_key: d98cab94a33c2a631d4bb8a0e314b78e68824f7b2156d3c481c32f35c82cdc5b2f0f41c2ae64295c246661dc0052209ca274b3aad8221ac955b0f30344f775b759adb1031bc5fc34e6eab6a8a10f7c576e848b2c78a31aa0f951ed8b917277153d4842317474693c5643ea6a9d49a8e5a9baf7c61f967c8679647e8c25ce3ff5a766f34b5e481dbf93550bd36595c51c51cc1c50dc278da95325f483209119942a604d3724328a28f18a6559ebc23a2ccc7d647ecfd866b17b2f2f63b31e1886c309211e7238d2c2510568262a48291a9a7a1d5c38aa61c0acfbc20e8c347c59c6cac9bc402788da55baf1a7c3c0093e4707699976bdca93646607322368addd9420df669079322edfd59bf09397c4e2392062b455d25044382e26510197106f681663a2616d7ec46efd75646952875bf708b2a20b9b7a688f256b078a140f170e3187b4ffbc2d742756c1ac1b07a29916f8347c6643131ac72c8c0840ca7f6c866f20d32dc53a448f193b4b81583da61837873b4239b9e690486c240315c387b6e5763ca226d86a028caa07f4c9963af99850f69401200f69c74a0024a4d9a7a54bb978e23c0f13474e978740422c606e7c5576702c25020415d263d9ea362f9556d64129ee182d22b76a8ae4892bfaa97b68709bf905379102a435500835871d192b48d64b5b31a5647c3634489cc2f33c6ca400371152d8148c0ea4acb95b96f3e2919ccc251e6bc458ac635470437165c2bd4a9efce81471d652deb6aa06359123b532a4c7c1a0ab0abbd193042c4a2d82b69df83045bb933eb43d1199a818f85ca0239ebefbb9294657dbe33dea89a844eb54f624c39732201db37ac46838bca17e0aa3b01448412bcb8ec98b26fd78cee583948a37bf2ce996ee852fe1d1a744f2098ca5b0720409fa592dde17432d424ba40a5362596393932c8ca7022435a763a367afb41818e12b88548392f9973619b41430cc48339a241cab26c68855b07ca4163169497e31831aaa57c3ebf384f3926b28374fc4cb2ae37173dae034ec61c48e804ac0a347d721c670357a7e78198d3b3eab02c168d26e3ef04d1468bd7ba4be00013266fb8fe3bb98a138b63a45167494c17b89c6a6e939d75584e755bbe8048fa2443c57f07f1f178965047e2a59c6815a5b92b6691c9c9dcb6250bb73725586b57c8239eccccc2fd418289a0406671d68e79e4118304637c9468b7312805599960c19a824582b5182dca37dbc63d5d33559a79beb56c60108c5655789bee1c42b75b73b9b336140b202b61ea32324134b8dbd064bd3293650c5b8e8f87793080e509cc7beab0eac8679ca5a723cfc119bc1a18e7631910a2f50601fa280084b98aa81c38907f0a685b3acdd630a3532ada83648bf858084d087c60b1ac73c76ff4477d9b01375a7cea52280b404564dd69c46e3a2125729463ca7fd724c35738094e627e5f1610a9a00ef7294f4549470b993d0447dfe34b8ac264c547a0b7a134d19ac2bff750cf2e4c80f32679375cdf0906346d64a56ec7648c4b7a20613c9b74301b12d40d1ac64f8318708820006d06e088811860a1cdb300187c694335170f6539df45834b93edfd4275e939fa5f828b6e471a5e09b352071c0a607e459c907fa29619ccfdb5147f56c208e20b3dcb82fa2304e40c46aaeb47c5bfca8a9079ecab4471d4bcf914c8ba459433ccb950772038f6892062535603b536da65dfd5c33430069a7f33a08092bd9c9617df3a5778b1d15a8a91c8b99bf5b0d4596a3f8a79d3b6994e823c20f102cb2353273471e2675633d9ab2c7668f02e7a68b2534489b169eaa92a8d78e4e182647f71758fc7f49a17fb400c1de30cc76664bd10b7c55885af696478feb919f3c24fdcc98991177b52ca647070cef77ab47c891b06575e5a0814311a75bbc9837a1c564246c163017696294533999b6700a1402552063a621205bc28823e539ad1c1795e0a23b6b47737ae839617548a514631319a78d99350eb77dfba97f7208d04ea980546a9e6642395c5177bb7b433dd47351b85e569091eaa30ce450c1b786c0272b91f9763478ac5410bc1f78175edef0021e8c0b4f074bce255ac2238a5d67b84b08a12984696e1ac7ad1131cf64bc64c5b0a1ccc94e3bba85271975c63f8d314d9f1a2d17835f873846c6858f9f285428478b2efc10bd7b49ffa006a6537684b0093a633d9cf9bf6bf97017690b4ce511b1898971b2978b6a1371e8aa70d970f8600bdd0109c84521e663845805235dd5849b192c12b49b43f824d9a16dba939609e166a8b05e4811b970915dfb527d803672c7a418293937a0c508272a5186203be64b4b1b33578d48be3e23913e73a385a8ada0fcc4cebb1070ca3006ea16f7da6eebf8b9e6637dee942cbe43395c8a7806f2c23d1c146d6359d268303a1229e5d513c79b2095892d553038b6a3431948195bac491a879c4dec39cb1b97374a65d5f066f6c66045a25b9b5889999889db34b1f42b4151126dd7431389a8331b9c123aab61c2122285530566ea23bda21cdedac78ccaa9ca1566ea1817f4791da6754379f9b0f8acb217085fa380910ed3ce4a52cabbe52d75472a63c88ddfb423c1ba6c1deb6ed3172cbc7244fb71300721aa13037ede787ffd546e60890131d8add25551d72881be0c8647aa10eb5cbb5f73c891868d4641bf8a692bcf0a5867091f4313bc976c989d1c184aea07eed11e36c215008b56a55ab5062bb41f7c5895837093671fbf7c4ec63505d15ca7efa5c6e45a5f5a757a4fda02f9f13c7926ba7c990e6dfc8b20ca1a2a9490a33210c14accde09764153bc9d4a2a68b7a80d9a91d3d47789c2a79bb212bc92812f8660f23a833d78a3f056ac030bcad487431a6357b8a1c13b512deec79ceebc37c6099b720445390277dab65346ea323d33c76e30483d51b9d01b5fdd55bb7d116b2dcca951292f3065b1628b1dbb86bd0cf5ce6a66ba1ab3717829019ceaced283c6b748b26425588ddcc47bc89ceb267ac7c03172b960160a6317d44fc5287c5e462911a8c995bb92ea1c81fed5baadabb569f9cf7c1cac71926f3e4a1a7411295a623c41240ea4e9011660227a785d989ab00a2c3091b02bd65a5b244246ffb97e23213f57b86aa21669541a60ed7014f1831839e41539dc8634d0125d61100ea4438af59434a25a1ec0bc99aa0edeb19d67ebccdd22ce5ff925ae364af7868ad6308a602033e0221ab609560144abec5a4792b8894337c866ec1a5df4076739fed133a74636ec9d904e88876b678088d8c70f3c7008cff1967030a528e748b708b0fb783577f249c04ea5536d2da034fd0d15fbac7a3cc8aa3239d4c52ce4c95afdeff6efbfacac10d294edc0e7cf4535059bfdba +ciphertext: af90dd989f1b2b7c11ea1d07916c07ca7571df9e020e7c40790f8791152429d8dc6fceb7791d8ccd016bb0ac0565f06af72670ed2e427fdb6aa6e8aa4575f25c48f97874d83b65433672538bb32301eb88f4538f68df4bbef7d8602606de0aa790fb7ed079b5d796d954f3fea0feb43c19c7c38695c5702d0a780127ec35b3084fc8378622eb854e8abfed625381237df67b0e2bcd4d9b6f44509c1d7e79a9afe582ef4737f6949e0f95b104ef23a854dad50adef5a50e340774121fb00c1bbae7c546be459a19218dca18b3274a48782d738fe0fa6a8c306efdeecd55b45f2a9d1c0e128168a4f5457c9c0662e724a933a3a0a417ab9d94e331ac80c5854c2b498fb95fa3c30e0795eb753ccbe5fd25c2645b9c34bc38585acb9a8c14cdde16e51cedc704db37d7892266e7476201c1170d7297e193e8b2d5bf10b89feeeb912e40b16854b9e1c2f9975c664ada0c3856a1d530df42dc1238694c30b28aa835706bf351b366a2facb2683063279d8e6106a98de212fa5d94e2a0e25208f3d6b85f6174db9b02074c555797884bff70fc8edcf89f4a553d04be27af73bb2f9718222949cd1e86cf8b8bd15915873f7f9cdd69c7b6c608cdd7331633be5b5aee83e9047af566f8bbf4a020326f566b8e3bd99e31d92edb35962de24caf78ae895c1ec087c33a7b751f9430e39bcf6ba317915326c17432989c5c6c7f0f15e121c9f14b6559d51f4a5f273a9f99a044f5c599418cac21f0d9f0e76f1e474252e75874787fbec4edae7aa86ed10e550db44e46208001d30ba8910c59cff6649c78cb4ede7e2ad4fe410362fd92c535b52cf507c559416d85533686e3641fd7b9218ebbccdf1425cee412f7030538353a785cdd918fd7e2ea6b451a436a286b8d5b341d51b1a523ad0f614868772b56625268c2c16b951f814b8b5d74ec12bba0bc5490a95564f5bb0c144d469fd93555df3a39c1cb53eb8c5c4289651951471b97d0893cd33237c0d26f27f09bc67759cf464094161ac956cf488a69ccd0bc9a38f18592f00fbc6acea75895480001276df22ace110170e2c1705aacf956c6177bba26e599e1656363f9ffe6f8526186b9b2ff7a0b612faf427980b5baed097bdc2acb71edfa32267581a6314c1b05470fd7844596795188b2dedf4e4fff047ae81d0816e82c3e4489f06d57e7b698ec099425bd998b446757d9386951161df04cb5ecdbb0c70204e9fa048936ceb62cf99f19afd9f077ee10e85bf22645469944318cfff14652a233c792df239fbfc52f332f9bb275cfdd43a5659dfa721c91791cd1a91bf0e503ba9f68f880d3d2792e2ee22eb8f7e6f1b52e851891683f3eacc39ce485f0a700c60d25acca1859d14bfbacf41a75fefa35494ce542b2ad6f2c84c15525388edf87ea701ccae772bdb7477f709c822f2b6625f8b1b86ab093d0d07867c584f1c14ff7c7a8a7ca3d1e32af4d76993cc0cd8b740598f40794786b411e76ae8707dcca465b679fff10efb4dc6d0826dbb5adcfa3ff8c0a7d53765fe +result: pass +shared_secret: c71d65ecbae83e06c622e28a4eff43c10041539d851149dbdf295eb121550d5e + +# Official test vector 60, seed: "99a9cdbfc674ab3ff2c64cded7d697a6e27a767434a47aff7c3fbf3c6a22d6043d27868955286a13efe3de36d22ec48e" +private_key: 9483b4fd275acc8cb660713ba7a57bb442aa743537e9e4b3dd73c5d3239cb876cdadd5a1dcd364327a7f8cda092d6841879b0fc7b64e81216c9acb87a4150a3fe7bab7058a6c6464fbb9ac71954e65647083f42acdb15829426c53c55a7984074dab019220b5f570211db614357ca0d3da2b648b2af10c0cd6008ac31ac8d995af6c44531d1125cb710a6bc4a573f04558a97eed49071f748310a9c844c63b491997109ca079613d96c2910b365eb343b3e405b749f33cb6a3502ed634c50196d364352aa06f5a149cebdc2e59d5b27c828292332157e98893494fde7bc51996562f13081f2ba89ec4b416c4732946b4aa26c5e5600a8b9b18278c51821ca36e153ab0a763dbd397693800a62a1e3682c9f71154aeb6772cb3368b6465400c7b4b200e571390165cbf56452072e38b797ba0465238f9e80652a0ba700951fed03fae6c91787c8b2c752a02a4ae52a16b4d1b057931174890656b53984ceb20b1b90d6fb10103c97f5dd7a0ee83cb2b34c85825766edb64e2135f897a6ac1b144ffd8225a9887d546c0d9f1b3d851003e810fa2193c856c7944315869349c93dc84616134c3901d1f137358984341069546da01864a16ca44025e78cb36744db7b3045425243526524f064f8b46c862a7660acc557d71574f227ea5d83ebf2c52db172b4fb7a70baa0df43a776a326cd2dc4367b89843a79205f34365f3b206798550c5624e241f03b41d56776c88636611fb1be2656fdc1c4e1ea84b0bd1b7c804bd53795db335531c896eb72558e6805599ca66ac7a77e4d9a1ff20349dcc76f78cae6c59b93a8165788216a7a611e2233bb4346aa01b47e5b458c970a0cac589f0cc8435b25d74a12d25f10dfb51536b465f085cb170757f8181c7b7c32176109a1a8bb3a59a4d545365960267746349caaaa182136e17f4a32bb040fd3038dada40c8443694789654db794f185cb7054c6bc50f9a24ac2edb5f34eb6a5b410561c0b12e803b998bada9e346785cb2c8e251989354540acbbbfc8517abb5071055ce7ac646e0197b89390516b9e56bb174d2b28d3aadcd0a51bf098f3325642e9b753015af338a8d309000c2313949b2b30314b924e5050bb278c2c4cd96520fd8009c8944569187a69a749b651039ca5443c30b7755782d1d5a289c4baec0f0b0e8153f3986a969e113cba21b41a06f8184b586fa312606419375387eb08980b86f97b382811400e82260d3cb5c74fa5e57b15c06aa2d8b250f92ea0ba222be524459a589a7ab46ac01a5564975cab66002c20745824c313d6167ef2c5a0266419b291401f6cd5b2497cc4cb7a7fb8c67a8761541cb281665f6da184da0ca520395cd492c86a3ae8aa91ba3d24d52322cefdb38be7a6cea16209cbc69e796a2c43b1581a015c2e37dcde072cc4012187276e81b54c20c6f95a6100093cbd9bcac7b75a904eaa9ec31338203c40cf28425ea9c5403ac6cba4cb8051cc2c5ba3f592100aa4188e2696211846bb68c4e39cebf26464b19812c98c0472a76e0a44b2631c01201546ac9982eb8334ac30a4be25342d48666ca41cb63423b9baf290499c27321b5705e8a70474b2ba392a34c17e1a4aac49da90cab751b0e5f50984a5058d467b5ff439fb0c2916ab09bd306661b18626746c8f4db817e3c4dd2c71041929dd7c5918a760f50715c6528c2d2e7c9b97c51e9009281849cfe4410b616ce03455c73580fe16634fda087387023e427902180c5e8276b797abcc47028cac91bc751c9ec4a9c39d682cb38b38882103839947b920ed453a766c04df7ba58f9714c6c370b98172a71fb7d254285e609551f31444e90c2b1d595472825fb9cca49d55c237a67377808ebcc1bb4848a75527ec467a7f94b8c4f8b1a16f789f3ca15f4f332fd0160ff6c4985b08b9996bd08892d5a836d50566bddc6adc6ebc7d3c95068c08682d54e70666f5f62b238f69bf86a3a48421bcd8b762625c06f03cd8e013561abbb2f01b1c314a6a61500aa02b9a54682325340ba328761140781885febec3a4090a5989b914a494d07e9793b703ed4b45af78c42f3bcb46cb4c7fc5352802ba0eab35b9f66c34c39259ae52d1b75b910a82fbb464d37f6befcaa811abc6485f41d38c8a4d1592ec69b5ce90c7cd10c0082c0b72dfb2e5a16b4c7ab6e65f58fbeb6c442fbaa2b4345b3a3326bccca3b5104730520383178589c4b4c751796c31aa061346620ba90d30b340c541f7cad17f86e05c91e4c21162f618b52117ddb572e1b90c0e19235a82a3e51b59c3b280ce3fa739bb70e4af9233831269ff87f3114596f317f28dc11b8b53d578a8ca85b290d31abb115b76c0a8748124fdb822f989c241b801c8b982fc733921d45853cf63880107704baa331b725a416471032a9289673f3ecad22050d9c5c9e2706a341553d168bcbad1a41a3c554260112336430fa16ca8fb98cf5d92acafa8fb427c460a27aa08358b36c5ab849ca2725b72c939fe0601d1e2abcc4434bd0ac835751315856922ed53cdc7b49468caca339aedfeb25ec2b97d43ba409693fba524ae4ecaee5b84b567432270644d6aa618669734e10c8b05a0d697b81d6c83c9f844cdc8ac755403044b14c288131e8c0c21c2361b206597782313d40bad1d56dbe159735491f7b800d6b14ca69d92bf2130badd1858b2cc4a408c33ee56fdfd719abb2a431132e15b89d83498b6bb5aeb0d7404e94cceb2a29fc392a2e466469e53da9c371e0155a774a298d515d70ec5e31aa070be92c3d6290f285a6034a97e389277eb393c5100f066c588aa33e66028976493bf41481b2eba07a720937bc02b5324d63b9487a1789a6baca91512c1a3a0a70b348c1596cce7997ed395b971442ebb3b0e2dbbf5608012030a172b259ac705af9634ad585916cd63ee1248ca143a20001a20cca0496734c2c52a59bb40f76411578e2c60f2364e8763ec1e5641c80a9d6235d4ff9ca73f4c4d6db9bcf3383d7d9a025ac76db1ca49710aa281c222a4bb81b1027d80c38c8365a39988a029a93b5dcb2b0f410fd1b63a54297c65b7de3f3a948f10988b507955aaaa2d3c699dc83ef348e3781c8723b9bd1c6637b94b6cd416427592c71311a16d449d15c0fb2753b338586f7260cdf255ca65cbc8c54101731a45544312099a66405b01eab124f116cab0003bde314b25690520a9a2131154271c89b97539035652c03b462f2635db501f9ab6983017f22b3391a67397066c86032a31080d329647a7c4f5ab89a47393636ff0671a4b06948c9f87fb580358d467fd3b5ed4c3fb678a44d92486cf091333c7f035541614729496d5dd45ce580f0d2638f1481d7cab000e33fa07de8dc9627a85e76fabb4428a3376e66300cf12a0787 +ciphertext: 00bf7bb6ebb760cd2f5c0704bac084e363ca6410903449755e70c085b8ef1785bd14afe673a70a8118ce2bd4d6b0d1e2c68b1d8d6dba69c1cc712bb753926d073941739c518f02efedd4c68be46638c3a1a9d097cf6513160d2954bf3c13e7ee2bc0583aaf627cec3c9658a0ec689964f54f81809958f31dd8621ecd0fa45ac4cee1773e16686ed2e50d9d4212c708f03e640e2cbc0f7f676b29834a5016971a2ddc1ea2038ec0f91133000a20af29409db0dccfa94b579ad89bff46a18b0f4f530535e45dbce9634c6e67f5308629421ee1101ea706a88bbf835dcd288c8421ba1acf5fe2945c0c657ef35af8febd7a663f8e07fd2d8a6d9588f58014caeb6f67c008806bd8b565f21f087dedd15e7c13e1c99de129c0e9be3ea77cdf2b64ee5fe46d2d7b3d4bd6e3ae489341e9c49618f16a9f6e23bfa1f37b34cc5885d8d55d7b7f816a0aa70c7559dcb6eb035360fbd157b2293e7242da423c83b1a67f3ad00710f23a4ae09c4602490271b24993da7535953b625ef455082ea5f75c5d8ecc8f280e4f564e1464d9802c7a0b4a903d3231cebb2a73fabc6090a6b7e98cbd5628e57914a143515b52b08435bed5bd9b030071c8feca74bee9f7e1ca4708198976beb8bce6a8fd9b5eab0437dd84d7a7f1188f19b0bcfb5f537b107007de82f879bd710cb9732b4752980049c97e7e5642b24cd59bab8af8feb51c64041023edfb59189942befcb4a95a2cf4b2c0e5712f34bfcb4ad08543a3ab5f102938b8c831122b193d6e24b4e5e9d46a8a88902d0d3c180a10af7d51e85ca83632c9848d6d6bb6f903a03bfe77531046531a037a9ff02a0cc45bb4b83bbef67989344e41f7869448e10ea1ea1e603f7bead5cb0c3effd793cd07204fe750ce6bd492a9effc45a15287a226de0df26cf784c1fd399b80dd9976823c7f95d241718ab6e8a362149c54ed1ef6dd3d569077d11e37f6fa74b31bbd8568579fde066e534e2134ad700f0b8a0de295134b4daeba035c5aaecfd5c8892bf5f68faac8fea4055423d9b9752db9b232275b2c946cff74fa0b5d9001b4bb54d778bf9d5f1acafd12b83c2814ec4c77dfaed6849e074c870a5b0e31e6bcd7c1dfc81a2707daa2df47c89701063c72d07f92f81862cd607d3113dff9a2c8097fc980e61f86b9a46d084a47423ffef3e20ecf50aa6ba84091ca9e7ad8bccb04cd9bb23e3681fefb1e1166c539e73ae41be71740e3583b8d881906bacaec5c253181f970e2ae7f533d839a8eeca99b8af1c0fc2c92d86329783b7dc44d1d137c02c35165fae49996d3a910e9a73bb79f17cf3b6b64c376eeb62cb32ef914917e729bf4845f304412a6aab7fb69e3af795ed9b525aa148c073d6fe225d98549ff7931e69427d7bf7a0e4c1a4bbc1229eac126f859e9178a910af8d774c4d1e10d7bcd80544f6aa96ffeceddfd4d7381105b51c62c3f4fcdfdd14066d976a6280122a168b03265af549376ee6983c424b2e867d38c7b44b6af76cb5acb962e6b31d49e656031812768819d +result: pass +shared_secret: 82360ffb5455f6dfdfc6bfc1a3999eb7453365ca311a0077c9d74968ed27b7a1 + +# Official test vector 61, seed: "c799d57b41f28c5c446dfc58a5ac6499c4bcf3c162afd2b09a16549826ec2a6f689e44bafc4acc82f5d6aec23f4a3993" +private_key: fb2abf16f6cdb674757180738286b5cbc25ee9eb1229f3781a8678ccd0c5d4219d49352913bcc4a404503d7282cc215ae337ae96c60fefc6a77e5c600962024e25328ac211d6d6c325746ec168777bb4489b04cd869522d44a62d1bb81dea56e8ef8384ac64fad710efdd327410c6b7d184fbc639e2f6c72d64b44bd303c06779be8c2b2cffbcb8abc582a2766efd9503745773ca2c4f92769cfa2b4e9052d06d1adab40137a2419891bc9098898935650197a0e3dba7f6ec54aa9b521624c48d265a667aa4269a12bea0abfc0e705fe422621848a6a87265f687de0669f56c63968569c1d807826ebaac30173586312f1ec53b0b52ebde2aa82f32ffe592fb90363cb3a281f49cf9e16b9ba4390072c5a796c4e4ac95ce2e14070014034a4a92f8c1fe4733c645b5dbec38129a4021d5c1afb9005c1756e37f431d89177142891827519d2874c9d1273967b176a311f041270cb3bc8d0779c3e40bf824102374a55fe5b2598d20d8d30249b59479946936fdc6b0e17a39d4684bd914479110e68c780f8468e3155be5acb0930fbbeaeaa79bd655592a28622cc0553a3123f2a9fe15b78c89501b0943731e71d2ab05fce4129b6324d66991114974dd7e79ddafa46879286d8d5ba285526f8767aaf45184e860e8e23ba7458aabfeb021ec68b19253a19204c7fbc81ca904cee1a2b7c38982c97a01e2330292168198101e0f30c1a429b3d243eea7114de5849e50249ac66bc24e482461895a9d28f4f181e5b036e7299832a14bb02435d9e087f7340432a632bdd84aada7a657402bc91b3b0a1075e39d66741e18855826fef247b6e1496e3866f9a2226c4d2a198c050ae706f007d1a4317b45aec0a1e7a2e359b695dc7523050c564b717e2b1005f570235129d913ab2e5fa99cfeca4b4262d48f0486e6b3c47a61946114c69150b068b92a8853c26a9c4c1016e67cc90cef8cdee024785e58586caa9f990b48546bec008956a1744dd9473f4a150445b8c46a1c4b171712c1b94a9743fba6b389b8852175b0b1d093d8d7c10fb079dbe65771a8120c1930f769b8fdbec6f857025c4c44771842d8d42ade8dc3712d9a9256167dca6c1caf1a95301cb6401afac63a7d0915059b6a7e45c0567c951a3096bf5cb44114091d497352fd2be702990608991feaa7302511e838c9a346ccc267caaa9c5221ef60b317b6c3a18a07ddc737e6221d28667c70caa3cd24533175aeb0a99bcf7cf60aab105385906fb1167cc26923a2f3c390fc2d150d3760d77b8954a61065814b6d134887b570ffa944f2d1299b6e6bae557cdb041b2b084792215cfbe30302f39573e6456f486b8dfc22b95f96b78098ffd343126671219244df0c4443f46473818c78f185dcd4765ecccaf4b67276f697d21108ebc16632be86fa48278d467021a1520ae6b0668fc7471c9262eb716cd307c98a1c205a83be5279b0143806d3aa443cc7e1a255d2df178e7e298d938c97df6260a278052b763e1bbc2f85b1389b78abadb449ce848b0eb8a5b44b2e881ac3e6bc66a2cbb9c998a0f3a2439816809b97d066b87da226907d581d981481fa8833d9aaa2eb6b5458288872c5974d9cf06cb6da269471e51cd2945b1d0a4700800708a0cbaa0e3347235004460c8f86188ae66af363ba5cee88b03a341f5255c329a7d119bcac87c46bd77a1b5966a3fb22a45d89c712909fa8c69967b1fa8878d89b8541b8a1ee6858932e0793c045deffa62250c0d0072a46328992ba7ac4fd72b48512c7448cedc902d9d69ca55626a09d1a700a92cfb1a6bd89291632c74af580e3b4aa932c8c6714337b1d72a3002c6b68b1fc981cd0686502189712f0c5327e1050ef71549aba312a59e9a342c9e76a96de6907cf235b6e3b5e36a9072ac95d856aa7014699ff48bcb7b298e5168cffa740e0a5bb1f65df9cabbd715096ce738bd39bad530a05eb58efa8b9e3dd426f1781a06179736570611c89a6f99b3c0aa5f4ab2737592082ff73dafd7671bcb60a87c5adf3445ca3381a279c6a4fb1724373827494e294ca5d83574e0877e4a31634abb106b81afd515402290318ca8a2511cb129aa52228ba4a64444b761c184a3a29b221e11cc1335e4b87c457710fa4fdee790614249fa060b0417cfaf9bc4fe88632a76766fc8c5ff424849cb91d4351ec621c2335a2d7813c01cc893c646986f7c2246b2bb05149ebda38f00acb65cb8bf53314561893eb0f1053b237915711b7577b18aa963315a3b024629689a52bdfc81e298c059380920aa5bc39759f2f56d2811c89c59acde3a5496f1a8cce9bf5266b363a40cc1b6c78fbaa4241340dd4563a5603413cb73ba1893bdbcb3ff93bb7f1132940998427769d19047bc051506b5b990074e8d1bbe2d988699b526726a91513988627c2301b44f206696353cab38f68ca111270ccc6cab887ac3b8bedacc12513ca349228b0d842bc193299ad1812b69c63c2b8233c20121d50793906c4014453e19a62da12c76f03667031f2bcb59a074cdd2417ba3789e7af38ac71335736890dac04f77e0b10529381e930c8c0031f88838efa47772a7b2541963b0c7b063472ccdf6228349cb5619c943067ad86019cd964c64767c838407eb32a4ed9c40581b63e0379d00adb275f6578f065894e8a47796489b994ab9471235455fe1f819f3cc2b378648ac625107805ec8946f1599a8329981a7775523f7c8ef7426d8a31d1d5cc98820186fc7b55076b14d2c7c1533cc3217354bb24661c162aa0895cdc4aaefa666686a0f12d1791adb7392b78d31d6bec44068c4f31cd60a768ac0b056c24864c03387715dc48bc86e1b51a649ce4945708951065f946e17c06f364590e4d16520fa2b47b230f1511fd02aae79bb8fa72791806b0d3e211de92455459066b410bfd4d437f0acbbfb02bfc5e93dc7904b649a6f9a7ab09e2679e13040c8e9754032cc3feb8c2bdc21d8f7aa56ea31370169ebcace98d54362ec24b6b6c63732b882984e58839a7f825b17871820ea9dd0dc8c5e7a15403888e80150cf5a12c5e26040708791d2074df71945d67f221b6d2bbc1b65d37559a7c248516cb4ccc19cc15f93ba6d6085bdd95568cab1069cf13138b83173ea7c58ebbea7516c6ae25bf5e07ddf29a0dcd64b455aa6e050c1d5663245318833cb95702bcab1a11fda773a73454e1055104f917b75d650dfe1c59e807314a096de713e35837ba4f2a5f3991f6ac18302647fe01a05c055ac9d19fe27027cad17633dc0f4693c1f79cf69756e79c9fae7c954a0caf2c6b326e9037042553968ff3007cdb135e368ecf440e4187e554af9d0ff272911ced339e2f8d320ac3cb0c52efdc753282f092bc39baf4a18783a48ea031a191865eb78 +ciphertext: 2b52c90e4ccad692e0389c6d3ff0fbf4fe09884cebab2d264766a85eb7119219267f4ec139c8c06b66b4c91f60fe6fcf20426c65fa14528637c68494fa9b30a08cdb8c85752584d824ea9be447f8756bf44d56d996d54654324450c5443d2b52abf3a69fcf0607a3b8ae4641ac07611b04a8281c29ef5cf94b25273e893386ab673c5fa490d9a36bdaa867ba7019893b79beaf3ffcfd47c3e93c87d517eaa6f0f2af0613427e4c72edf9b28bd3836e771fdcd21a7bb169c58f91e23f76f665b97549cf2dc8ba58ca617018277c704262c7652f91d8e7e3afcebc872f1f5b5b942b23124fd9066bd6b2451c6c0c353dda7e3a09853b88f98123c1a594f35a1fb6f319c010c1ebd76c95a32338e9a40312e0fcca84fcb0ba9e0043ff587d164da5c7d92386e7c6d3647b5168d8a7f9f8a13910043de109b2c9521a7746b67e3566e689576040c9970b04780e7c2b914e7e708a4b37311d5508a3ad15803555d33edc219e8a53f7bf992e8c023a29e42ecfa003312ae805960d2c40be7a781d48dd4f2e1522423bfd20f1c832fc98649652a650ca7ff33330894699cf891493c5064d7db9bd7927d81c543bc041f2dc503fabf2ba774bb743063001fbcb9767d72c5228bd44fc2ef048ac08d5b7f44d807e388ff686e73c14dca14df6c2296ca5ed2850889111db338f7393cef91bf8bf2275708a1fc0967968c9aea9f31b826f42c2feb9104006b336561adf7cb7920c2bd292f002332eb3ecb913e7019d46421a0f75969d12f8d518e7996f75a77baa002ea5e1007811f6ef47ef6ce9ebddc91622dd7d84e75a4b0d90d95a8b7b353c4c0dfc7a3bcea0971bd287905d1fae61fed39a1cad61ff0ac13f436182bbd2da83899c70e802e98a88a2d3e80e538a7370377e836d016fac084ab2378379329a346999aa6594a5271924aa72160dab6056707f29d6f1c5ed8c1208b83f4a0e4e7bea2c75d34d19d8a3e25b48238192395870d43c58309cf9ae5518584fc9f19fd2b6e94b307b7750192c41088d6e3fe9596dc34ddfec0495cacf6ca98f6a24b6ff8a7fb1de8f21ef6f04a6d23a3b7ddfc45ae77d3081d75a76eebc0450041168198e853c6d83f88a24e3fbd25e0c5631c34abe36360c3bca7a3dc522dfbd20692b4cfcefea9d3bb0c73aef359d3f58299140e815ea9bb17b676abd504973a827e792d80fb03823c9dfdc185f03165c3a0ed3819c8dd2877d33a206036c221ca0c4d0d2f935c88a33518ee5562bb1a0baa83dbf4cfb3f11561513fe479e9c9d9298e0bf36891f28773f4eed45a454af3a51fdb790f1d8e7723db1dda75ae7fc667a71310686d9350cf851d3e20faa35b2673a97997fa550faea6976256969975689360275d1e56689be0f127853ef4e45fb857bec018e87916b76393d04c6c732700eb11175205a30a31081f5a6446071bfb7740dbedfb55e5ed09450ad8e65941c85655423dfd60b387f3444afc5138f9e762351463d0d158d82394ed26de2fc4aee2a9bb9ab420ffee5896ccd44603a05 +result: pass +shared_secret: 77ef6dc5a6c8ff657070e418fdb3eb272c8784a9c38bbef950c8ac1de5ec5578 + +# Official test vector 62, seed: "f7ae036a0176a9de9a036a542dd2840033277c44ae936d10b768566216de9d4395cd42b116873b69d9804ba6ccbc05d5" +private_key: 218284084cc5e95bb4c8a7648d77bd0fa0b91235af9d447d8bf062d322bc4cd25ef1532433193509d4839baa0f4fb63143e64bb1d35408eccc80da5ccd6123344182ad9734602221c02b6cec762eb6416be03562497768d22146dfd3b04281a0542b4ce1070feb56a0b21165ba91b3b06a0dca42b15f556a5a6793de72c4548969f5f8102b49bb8cb47c8890afc022ba481837c301a619c69731743b971302957207196a56b1f071cb330a7d26327a55b296c8422b87456024c9363798a5fc94b5e026a4a3be75765b2827852908303e6ab4764c33569c657c864a39ab991b61a45de4c3d37811fea6bcbb6708cb27b83178c03571566d090647330cf9b91fa3d9b49fcb0090b226e38322603249005d3ccb00d0a65843fc3149a407b672b88aa3c6331cca33ca7a33136ba5bb4520917a9bcb673f22852240b7a577c3a78e2b0c36e32bffe4ce17ea5dbd016fd00745ddf48775e9274adbb45cb4946bd05b4ee0a38285cdc8760fdb871f629524d3e89438c5afa2ac2b5258c3923430ceb99993c9b95fab5ac7563e6e1068406860ac10bcaea63c609531ba80a637d395485111db501f78a98ac1c0241eab362ef092ec2c4306eccd5274a729b7909002831cd65fca5cbdc9440e95eb2b588c1430903078a625c9b67a4c5955c8ea25175ba7244b57290787ccab76ffb6262679b4b4130426d31d6dc754009573aee9443c4a9af619637be8c52e9486415565a6a3c3dee9a5c9f31d6ee716e0db5c219b01287a8a046bb038939baf2939a2a608674212b5743f6ff99c2a3496cbe21414c646d51399e7048ee398238beb8f0b33806ee33655573074abadfdb22df14952937cacc143c885aa0c7e144e172c1b4690cc6144304475bc02a3cdd84126e3fbbc0d5b6bcc875f89bb4883b7c841d6588a3a5b68a79613d4bb04486a2c10ce76378e07b19824d83ba89a649bb3936e6a060e84b8af0c91e1e6cf9e3b03c00320ecc5b493c88e93f9419c1aa71f27ba194c3022634ad0441f3f36280f6c2e4cbc68aa05a681aa4f16e978b0582e09fbcac4b849800616ff820b5764961e299f462a55a3083477fa15827937c7746e01c22cb1a878dba2ab1d1b5856aab05f3960e4cbc9754351c691c646a29bdbcbae01b670a7284c5a608b8609026a28ad2da69e1d5707770a6c5252917afa476d68ad7c5ca1e9b839aa887e2bc92520552523fac50f29559a803ca9da4fcaa58c1ce05e1d987b05d71ccd4a0eb184a9486819a745010ca92937a16c177c97743cb7fe680617279a0bf40f23a5456ae0346f38a5b346358cf76cf2549528815a272008d748a7a5fb3b9454cfef492b52d350b5710a3f5595e1d6473d2134070733bce526128579d7a80ead61611912644ec5171ba940398301ffb282a0150acf047c25892333514ce4595089c0702d7300a76470ff191b8b8634e56c7cb720ad8429adda29294e1a1a92e06be1e4c4b2a37af7a36515d58873972c1b40336132c0d29c0088989bb4c29ba0cba4b878c8c096c6fcc868efca2d03540f9317adb81b808aa3bd1a118d0ad70aba98792b830c7379012df373820c7e70a7805d357733d543eb657334096fd616c6d1097ab106ccaa3b1460e29047d95726801982a9349aa17edbe89d04a6ce4cc52b24d989327c855acbc39e6b9880a0783166af6d03043bd34eb427b4a8b32676a874b0c18da60759a5248ed4508abfd90723cb161e38058d4cc3b162c75261380c119c712639e50494bf195b0e6a9d4b22803278832d52a6cbfb542f451c777396ea0ba5c9d186c0786180a4a032d12bba793e2e29328c91a40de06b9b754a189c2a01404f2dc7011b036c969b1455f7a6c05b249e83009b52ca5ec643b92c0e4ec9469e3abdfc2b8dbf5638450aa498c345f126782a5c29ac7673a8db84b0f87086da21728067f3193eed391376317450a3acc5ea0322b189f56accb246bdb6ccaf7252c89be8bd846aa9d07995bf2c2c5be82385d77e566c90fd797bd9b2a5dba704d60341b1530cf3f60f231066a06590f6e3c90f1b6bcf5cb316b482c2817462ba2cd3ea4a5f0744db5128b6d07851e15266280414b6710fbbb7da113c8eaa45974c62bdb7b335315e5d093d11e5176f019dddba19b379399c7c88a9911e17d16fc5194b2a1998d219c4a5fb5531ea6e6ad37052a57fb5560ea39719c378b69c902acbd3324f9c29da73145b409a5f79c8629b4853f65d03eca0a8718dfb7295ae3483eee45bdb265638c0511864a0e471a34d839419ccbe42303fd2c51232246e0a6b81d9ab00c50a7fa656893693a8e6e245fa7b119a14336c9a0f57108ecf87a9c249c01d3a214bd42649e092e2c3c8c89a2e4d980b0bba5340330717a01f5b3abd426ccf6bfc3e5bf8969af7278b0c428cc39a36da6a7c0b8bd666a1d07bcd2845718b755d76fa61d3ca51b3b77486708606975fc377b6ee0596a6f37474b91549f6899a3c4e46a5309f035133aab371eb5599809bf32034a73c8d4c0240a306176c6b09135719ce9478d3f8136c189b715c6b4ce6612bdc973f40238994b763065d08308597ca22a3f4a43681cb500a680a476e1110005c6c6acfbc13c91abf636a7eba2a1f1280bf41293f3031a8abf8af4faa1d617a380e925861185a2bc37a806cb8bcf92354a26340481aa0e6230758a667020145057f8fc55b49b530ad5ba6f490c9a73b8fbde960a8d123c648155418b373b1189e10c9f91a4bb15592da329f61682f70e03143846b09c09da648454901ab938928280628d4a57a636397e5ca0f57dab388c65fd6e7bb5a9a0f3f95892973c990f393174bb8aa669bf28322f80a65320bc69b6460be565265e7b8af86587ad9b43f1c3e5a582773045bab8cc6e03329ab1a4e05b33afcf8009dcc67986831d0a60662b427ff5a7b9991017930524bf678c7d461e1bc95fd441a7693c3b842460ee186b3f973b35bad2fc258972c2c309490163109cd6c87a81a2d30bac5c6766e7d151da391a83a2a5e96904cf9f268706b23e8758f514072b43a6d7891a92e57ad6a9b82246a7f3459cb9cbb5e157a957b27c8192407e9820a906cbcad6794e16bae2b0664811400ca22941e576fa6fa1083571ba17884d5073c83b7a7a1ca53a90ac098eb7dd1627c2ec28d61f86fdba69308e27fa50515cdb19445405a3e6c720651ac5199a1085c8ef1995d8db0a43ecabb5229353316780f12258867c65bf257af667da224c271b02f52b8bcf4805bc2031fd9d999b3c825fff0f4c8cf37e52c6007bb4a2b63952a0c223185806aea6700e293f433a97e4b2c8485e6b4ac19ad493c4c16a10a2a884d58f5ee393308641a9a4647f230201e1389624a296b55192a9819fcb19ab77c25f95445 +ciphertext: 1e3160f57717ecbdd089c8bd9d1903423f6f4e6e07c12456a7fd0fd0fb18a48ff577960585daebec1cbc0ee508193dbc0d551797641b93539e55e6efa28cfb16372e6d2ee5056599b92d83b79f4b1897bcd79e1746f132c96e26eb689ba124d38e089c95dd5a965271d392850f9c89f9f4b02b23a747bb5055822ebb3302ceb9fe031dd419f967b2e4ca068dd1708903251b635a04e9af8cca62bc3e08c777255ae8a1a54c9b5474a5866f73c1db5baed82a3c5b241cc26401126bbc5fe31e2a732c7c0294b8237987c47d4141050db42d65b7b924dca224ca75902225c32b604a60269dc0a2607b9e0ba0be02e43fdaaf6e6d3d77e8cb45ed770a966772bcd7f4b2f529bbbedf80170dce8de6b29c71ae8506910f25386695c8eb9bc26f973ffc702f95a2d8bc2c5e543c0f70d68abc7640953259af277f88323b7b6b2f9fa4a4dd726acf97c2f251603bf7c4215eb8996ac763e65c3b5199f154a07531b83db902ab8b3a2e6ca0fe2432a7e8e6524b54a62fccb6168f6de050c1c3b4f2435e9083f796dad25d63d78d53ab346cbc2555e1046c10e2a4db1160bea5d6985312954bb7f3aa0dd77050f5152b9447e59644072480edcc1e03f2e689dd6657cc818afc79db2909ee8a789468241671ca59fbf771aaa3849285d45829e3530a319bdb59b8147e983e3141356ec7711755a255a65d917f681981fe6d3cae99eb767825ccb03ec0d6dc66a8fa2304ef441eb276edcd2c2a8799f79723b335aeb0118699f283e974de2fd19b3669a693652c7db737122f469dc7e13f968145c0b3ea897c6857783ee6f2dd934dff2f017f652ca7ed1dc67456c4c31d91fb38c1c9ed43eac6a5a7eafa49801717c86df8b071cbf3a3a24daef83fed9d5d2d933197a1f90564a74a32c4787406a37899e0542ada950d5f755887f45580fe0e7ee3d7a182a7a349ad80c3a4d7455e5f54712bba91d088c08a77eb569bca7c1429180ede008640340e189130e39be6c59d0167c040fd3849a16842bd67b90ec35ddb76b8e928aee99a404d9ae3701629cc5ae8282f5ccecc165a54b3ae806e32b9754245b4227bf10a93926d75da4c5765dbe2b0dcceda93bf6d8ea1660398c38c83c8a28b9fd57c6aca304b87c34d31e94ac2c4042f2c4d2cc20660bf51ef72bcc5958f3c6c1a1fad735790d89775a5cba879db78277d089bb18efe22354ff1e597bd83824b421c265d6ce4bd80a1fb3bbf0d8780526d30329c49eb123d21b2a88a68f9827ed27631571ba4d6b23655c2d3c325edfbf64cb9e1ff70ca33c3a1b1d303001cfe001cecd5464464f998ea6d319239b9e0f0b89dc9c2c89d8a15e0b510a5840c8c09d5f9cc18df4172e17b00ec65756cfe575ccd3e7cfdbb65285bf93c9e8127f9ea0c4b8df5ea9815a1fd78587635211bf1b8c97a70659df0423feaea6b33e3297ca0ea5e4c782d35369e6978d0edfc109dabe660a4a872ebd259cdf0b5200397e57534ef622de6183bb3a2e988c5b8239ab63cdf89a2581521211ded4badc1 +result: pass +shared_secret: b0978add3085e1c972bfaf86655a287946f3853cfb372f6fa5813a11b6c4e103 + +# Official test vector 63, seed: "d995d38f934b6e1a7ca77c9522e3d037676cc939b0c8bd4b84394b3dc91a791f09d2d97199258c9943da955e7f7b26fc" +private_key: 8d3542bfa71c67eb9c7a824d7179882305ad248622b6dabebf2c435436bb86777a43380bfe26126b1089399cc3816a435621643d354d7b4989646381b6393851822276641698a597cb173f0888a3db31529a41492a5201608a30cea5114ff52686e874a676c8c9a6a5b8429451c294842904f5d4327f6a3bc30b7ebf35be21aca79126b8c3827f7dba4474e308fd9b2f4a80982d93b4c6bcb05956b5295a59a6703e8b6c4e254606fcb353ce2c2649ab07f8e8275b8536e204847f774e5b7a94dafb15a2c5571d107ee771941bec00519c1b2ee464b12b0cb4c002320c0997e5c516f402960b33363c57851a72989a5570420da7dc1d5ea5c885796bb43a9030f105e58546510129c4506b89a62f03337890d89a40ea2ad1e62ba420a321180108a8a1abaa124c5613c4cb680ed621149315c734209530185ea709d6538ebd8c2eccc6c58a1755df1090881b1ca516155b3458800735f98282b1b1af72697c6de29be547cde7f64ca29b6070cab2f9246e068c99777987c86885ef65340e868196b040007784464cb9b7f30a8410b1bf363436e657b1bc2c62d5c14a8ac3d6b636f7714b641560a0e88eb5982f36c3ce94c14a7fb979ba5110a633a2b70517c0eb0e79512844b50ed0c1b41e68bc3f1224c4cb03cda780a5105e2ce01a4921193dd86ab7f41997f893a5947464e32b2092c48fdb1d84c71a74f087e25596cb21056349b15fc73b838bc679f49ab5041fa9d53049070de760b5f574b2d9ab48d5328cb799ae5efa0c17855ad57001f2cab922c4788fa6be39b1b9656a11be63c57cbca770e5217f54b5d61990c3409d0e1306667b228a27425605b9b5802b6b795ff5a5a423138c098b4758553c14ca7a198c9960e806b2a51ee39a0fc9c7136a876187963b02e6c6e4365a33eb1dd938ad6d2510f3c873eca835c9176b4ff5921ef52dd1f671a85368ca35b878347e42b3a3e42b731fd4051f37ad84f5a1b16c72512aa959e8b0c7107a5454ab96b585099b1db79745311a80ceb070c69b1fec37598fb63f32ac282611a5c37337a0c44c960c35800018e2e1c040978260b50cb51217a22104634118d4287e88045229998a7ceac32f532c48358ed48929d7133d67ba96087586bbb37107f5423dc56f84d390ff281ffb8344139caafbcb140d065912678f8ee44cc3c78c681cbe530637de1cab0d0112dc023163031f7cd70b4d7ac2bd43678989412b0804add344f6541e007a46fbd79dbfd4156892a2d18a05c34c028f46ade763103a079d03a3945ea614d8ccc84ffabcfd300acf38c319b32d92bb18a3870219307c0394546de89e738a9f7d88c767825823b2bc0c368990681d183a1d3078b3bd43cf2f47727fa8bc6a4607928090f57c74539ac06413567c4c968c9ca8c5da0632799526b3b9df7c6271aa4906371b46c0b134a7c1d5709d8548485bb2103eaa27bd515d409cc07db2530a569c1d617a218aa215b7a2bfb0999e791f35d07d1b5b12cfe53dee8a8edc91725b138b1fc7001955991dd32bb9196cf41acfdc773899aa1ecab0854203b421406eeb85820e2116aa746466c49837a69d8e18af5d82c3a0fa0777f9800a187f327ca08e0c1e29e13dfd0ab97eac95cb2439a4d5171062a42523cc5ec7caa414654394003942aeeb720d4320c10d609de9c397d0790c585398fe0c42374ac2d220bdc6f507fe62cc592bcab77bb0a5f4ce73a380ba3640b4e491343ab7a33310e7f04c130a70f75b75e6aca5306837e9ac03c84b01c3fa4f5032069f492cfeac1585054a9fc4271da3636639aef3a065f2857a32d590e416866e71ab92d2ac27cca217756b528776a6319014867816d00837e476afc08d5da82293d37042709567052370b553cc925043957eaa3c34d2810a28163e9f4807b492301a4aaa232b1834db5932d20d8866a37fa312ca9cb129116634e95d551764487c384cf00b35682927808a28660d92e51610c68edc994c76a95549c79c162487d445293f0758a43b525b04477c2c50a47a963531b727964828c5b567fb538432c92a8c5a0be6136b9b05c2e68353d5787a0a455dba373ce60f40c4b48be8723ff760ece23d135887be491157b6b4dc8591b5046735c5588cb405057b96de0097f158c67223c5a854be20238126f1203dc59ba6d5bee4d7aa52f1a92441cb23340820d9afe134097bc8512bba1d2097201d6b7952641369649eecb884a4c35848314d2618c283ba9b343922b7cc18bea9cd1a4a3597c146d433692d15c55172847b9cbdda7a049ee455e5e43f6b18a80e60ca48822b1061835431644ee1b307d581add3b21df3367350bde75b1366505b0c88302eb1c6b164290e29204fb005f81567571552a6e22638a0018bdc94e768a9ecc7cc20e50ebc8bc9774c7caea9a1fbe1cc6c925f3fe70fe2f523fa9017b714b7ba820968b3898c1410b7e46fc54226c2c15056ea0ee2c071635b70fea288b88c9cb43a1faad97671e763d04b173426224cf217b2937246ca012edc14c529a2e2d47bf3b15b96804590e5241254a3b1e6a29378522ca0b2598491509127869a1a73dc2f334386c3bc7542f5bab81c89e938071892709f3744ed560c77d43d6ddc2537c544a4f64b19d55917165001bb74d93a1437835442c83b989bbc22ca67e6f96fd44787b8865f759419a409b78f209dc87a89e3ec883441c3ea39627c2524c4f88625594c2b0b5798386866a2c9d45c2d50d438d61c571564040893ba00a7752eb28fbf6b737088103c2a0fdfc87d99b978d2521949683b7dcc98b644504c297905d2417649c0a60ab70b5c674783739fac213f1ac5c5d69f7fe32c5995073e846d12da57cf17a73fb70fe8e7013d681dfb393a4b40922a654473c40b50249362e4aecd22515f256250365660177bf345a2cbd0884933b45d7ac67ef3871969bcf94570adc7bbc2cc948f82b7731a8bf0f980a3c373d30a4e85e1482686ae98501810c28108670078830254b7ccfca27bb0c57c56490e1a5b593816923d722d7c433534980293a1ce65219e0245a2fa049d9fb10fb54917ad82019a51212f0086afa520f34799a0361a083211a415a42b36237d40a5138c5ecfd7c70f5b084a05156df817071b709e745eb3e0252be9b1d89247b6917c72bb9e3ee78dcfb819ef5308f2aa4375578c72d02c348b16fde51f80602d0fe50da8bb5be6598fda0bb8bb1987de7bc575832baf123948215b833821afb7087a65014511a50e800cf6714ab446e189261a2a3dbac768c1e9e232985c430516bd8e18c79aef56cdb533df23b37987c6b557e4c0f8fa9e466312f19e7e90cd0a67abe6a145cbca9d44eac9d531a532770837a854b4f5531f6e0c8d6c10183b30d3435498c2dd142951 +ciphertext: 37bbc380432e6694f627007ed8d97fbb1301d6b3b484e0e9748b2a8139a51cfdd6e4c610dae8a78c20619d5f9c2fdcd9e402c3fce6459fdf81d799a358dc312a792841a6888538f635ebd0e1efa47321c1ab7b83ef8a202385321201ea04de13575cc3e535a8e8f1d2bf01397150b0b0aa3d4dd9d2f569a4319f6c714f1ce71ef1521881c1413ec9cb86c02a71c7417e7745ec61de2605297c7dc0b04a5d65d21a22849c5b934c74b2acf39c7899b109e956902e8c89d9d72e664c5c733e7437d16a8535d5f7c8647359ba6b82872676531449899c1034a8e8e0b25c6ed1cba2b7525c303e91ddb814a532f265e88c1c4a07b9e0a602f4c50cbc63f14edeb72246611b65b0aa25462e76c99f84e10aacda4250d817901580a6a5b71ad65df385b8974ae98444cb5858e93f931836821b60aa3a61ee73c7aa7fa626583a0a448fc4d5965f6bb34503d1d9d2f083e38effdac841fbe0ecaa0f28f045dbd7c75cab756628d688bc7662fe2791df1674bf49b4c9d2a0ffc899deb2135aa358cd3d61252ff09a1460188d598b4c6409bb368f687b0a17ba5dedec59cfff68b83e0f27375f399cfaa3d43677bcce1cf338175871675128eda0ad04c03dba2974347f8500886a45961fdae190775256aab5a718a03e9b003d8b060afd8f33722a308f410a78323b06026d65a60d54012d09b4f7c730ffc53639bd36b510a5e24508f0f02f537f6b55a1e8f947b10dbef06ec6f5d1459d04c65db7db9a1789c160e6aa7708035f18db7d9b13d63cd8c248aafb2c95f2267d57539fd0a19d73643b481e9e8b8e309a6a546538f24cb99747bf56f62631d7cff279c4526b2b8652a5781728f63504a2935511b82f79704f2e6e6940a689ae13d6ec77202899deb2ed545b55188d0b132a42fbbe9b997d3aa146d44ab826fd548f7af1aaf8867b78d58355d072c9c46785850367819dd091ce58c1254e71f7d3129f0cd81b0161de7d5f455b1ca018ee5af5d7667a7ba14766429294d502d0d7d80d505e0f0dec5717f9532249933892f1986f077c5ab87470d583e16b79305f21bbac090cbb5e11d9bc7c854836b9dfe1f55b53daf9c7e059ea1c7a94dd7360404bfcddce0db43c050e5d866cb989b57c69997e7fbcc39960e2d86a48bb9ee83770ca896d9f8a3e74015bd0b8b9fe46fbe582553842a8b9fde8182f021cca6ea995190c3dddb92f6a6eb75786eed3414581a65b9d6097af2b4143df4430bb7c20cfb458d0226639c05f83f920050205d465a50ddc04b61999bf1d595422f5d0a4839d7ac808943fab948423600145ed175a1992fe37696885903e23db37f47d75fd690b7a3acde97335c83d8823d352c00dd0dfe3ec585c1d3b495f8b429e567463b870a5df1c992e7719ff348a541a39a60052ca9c78ae6fc1c07cdd57ba7c44ff595bff6954c3ac984c148ee6f2cab32340d495f56034e37f6f86612cd1115b1bdf495c0aa1fc2f02a5d6bd196de7dd7091485e842afd748e78972af4e3afe9b4b9bb5969ae08e608ae8d +result: pass +shared_secret: b888ef3a969e162edab17c3d3de9ca682de60a0fd6ac97e1b5a54171dba12a3f + +# Official test vector 64, seed: "5929f02a271725cb40200de32d9d03d8bea53b53ac83186c42c7f565ccb1ca508305d470850cf86e9b2c61a5b8ca1c93" +private_key: a89cac07514fd7ea49de1c8a4aaa75ccf901439529ee48160b4acb10885320b568b9377b475b180cec4c3ea2a1f6584df841b54bc8147ec79457896e24b3592a4864defc44f4e811cac6adec8c91c46bbe80d0ccd9f08e4fdb6fe1509e4932cfae8bbd3d299a389402c0e16e9f44bbb34729ec9ab7e56906491a538681607ea7af800abc2040b2411596c1e9669b2c57fed92d1de814b0351f7c99ba49613e8b8c5348d49142141fd104a6c43c66906c389903b91fccb4e3a4245049c134291b67d0c596894cacc026caf067014415d1335829795443c4924e38308da8b229c129c0ba43b98bcad09a20fe4143607c5117fcc1bb89bec1a32c1882b6c733ab4292158b71a76305856bec631532bf830309d7833e09095e008473ac0928db8202bc971821125ff288054348608978417314ca916a3f2596253cca6018c990c3c54c858c33438b28723889cdfa2a5efb9c20b11ed6228560f897c5b5adb6a3a505e4c7138c68cf550d3cf9c21ee12d83f9baa9778707075ce5ca7e319172a0a926e96b421d0c1a3abc2029a3adc2abb5163a51f07924ea727d979996fe4949fb7892a74c1649da7a382426ccaa0d825766abf51d8390bdf6116d107510a1529af44b37d6561feabb8b0704be246632f58a7968db7d3835bad6c49b29429b9a443571a1c2b1b1c8bddb690b387f5f9798ecbc84d0567d53676e93c38a38b63ea8620702c13be48ab37e02c303b2250c45baad168cbab8b87e7cb9f9e55073dc0d375a88ca92c0370b161bb35f4d4a74d6f1a4402bc32a0b50d8ab576834c15305a7ec70525d5b42fab77286dccde4d6cb79aa7c46f425209064622a86ee94a6f5f3a6f23536b63c9ab5f8bbcd148a30d46fef07c4605b2b81b75d46332b340b6719a735078c3508925f5fd4c1107c69a560cce9f74041fb521fa61a552a756bf638c88a61f103ba9adc02787a398bc35abe3993553ac0118124ec4c67a706c3fc60796ca531ee28ad89172ed5ca12bbc84cfeeb35885abdfb5061d6f774c17c1d5755c437cb7827d8107ca8b420d07331d762e73622bd22b4373ccf918c0b08a954d6ca33a1020127346b981cb750842b9edcac1cb9a6d482cd00a80136575017dac0b0345819a3a099d859c2da56a45523d3e776feca225e5a464300648845bec13b332f3bc78a497a41db4f8e88cd18694887a3babb3a97838519d3c0375e95cdec5596e0486c4a354085201e0ca9c6fbd1754cdaa05a9b204f602793aaae97d240ad11ab2c54cd0eb897f76cbd851038b09ab1442b081e6122e5b495570a7bf8363d3ae1c793a9206785b59204b1e7a46974f2cdaf9ab6d830457788921e72862a499f1ea938d08481ea103b9d6b0294bc0c5f90b6b0566ffa897592bbbc3738a0e69cc5e5a127c1622e6f245fa4607e49064aed22c7d082c62994b419807ec9d8b0c7cc3c993c3f1e2538ba21c21dc885fdc8beac5963ce9732c34a0c34637bb368a87bf2452463cd5e66275e94650d7766845bae2d79bb30336adab7aabe52774e5198af3c9ef532cc5c27780849b1cc8427eb1b451591aabc5cc5a7461a578a36ac371c66841c0ff05a90e41e79acb69c31459bc30dff0aa24452709407af616571fef73bf834c480630b9532b244d09c8f936e951961bce56157f237b0919097222df3bc6e61f47d846479a1a5bcefda59cdd8b067d19db6d9586fab2fda9b550c5170c2772ad5a4af4a67a19d215e45575e83a8ba5f099e4358a9e493677ce177f36a0f594912b6b850d3f719c155c01b68bf1dc89ccfacccfc6cc38a34ce5b4c48d2e17dd2946f493a357b1105265153c04a98992c949ed774588925c697284bc537b4d795de0463335aacbf80b10cd0a03a88256c220c3d0074ffc6c8c913c919aa19f25206a1cb7d40a50c6f55960a2298881a71a1dbc92a69371dc9a95d45a7bd6547be9414f4c31ebfd3553b89cfd9ac05727b06bbab300ecab599da76a62b97541cb3474b7390cc49942678add66d265772f55515e0623192668fe4c5273e3176bcdc52fceb081dcaa4ed699dedc59b01a29363070567772daddbcf8605bdd1268882a355ca4163ece88637e932c56c43405ac3844949c819646e394dbdaa475e62ac0463b8ce257520b3b4e141057449621b449c09c5b72d10464e59bdf2702a7f4ba1c1c6301bf51ec41bcbdddc4a069abe46d37c09050b28b073f2216a06d501bc38640600185227a63d224589a43391097226d67240619e2804589f4917db7391a4fab6778c91ef30aa41655e3e433854a52c9ce8130b802e82204bbe894517f1bbb4458616b0c309020ecfcc17f6b69cd0bc688963af0fec8f567a86ceabc9a0383681d3729a612987862e2972b6393c2c93a32861073ac3eb1cc636a52dcc23e6ea0af7d3af49f81858743962978245db5a70c34e90c64560b87ef29b5b568a716904c8326481db98c81cca47cec76e32003b36b26aece764c5551ac07c4bbce094b6772b2faa27b518ca5b96094d178f68a7409992ba7fb776117c66e97cb0be6854908aa8203aa916d26f3118842689a5347ba29d337599799691729b812961720cb80ff993d8a124e2027effa1baad40a17b564b0412681a6005888c0e27992faaa370ea3954775949a553b75aa35d5956373da54da7eb51c7e68c05777760c6b9b0a78ff2f34312876f2db27898d3aa4a187110402537f2aac7373751954f3bbc5445da3907429fbc817fb0a732bf4077d4630c93a4bf6785274019c5de6c3d8a66441620491a8537ffa1a50f0baac622cc765052ae0049eabb20d05b987b303d17714c4e79814dc5cc9593bab612359d0c7a3bc9614d0c8eb4e0a7c740520e077e2215bbbcb693a92c0293ca28b4d0ce316b5e14e165fe4745f9665c36a651a6a8ac11a162b4a111e40851ec2b29dba05590140d28aa945b42310659111a4033f972bc0163bc26a5872957c6977bbf8d727d65a8c806b4699050c994bb85651a40c6d590c337c680306fc231b7487305c4155654471c3003b93c206cda82c19f7b047e12b5cb94490f4bc850c4668b366bcb23bff1a744dd3362e94cbbc658178a012d9b784d12e965f4592067b636ed3ca3bdd89c0b30c8bf798f2282c49ed3835b70ab1ebc761b880e0779b5aa34acaea40c83eb0babd6ca11398759415252064c4e70b62d4cc813d346ca789eb86b5d3606bc3239758a62b5f76a709b602ad6987228433a01a8aeffcc22d0d315d59b15e8aca53b02fd160c62db910fddaaabbc4c2df1256095317cdff9f1e7ebcc48f838210130a5771b76066feb7f606a82cce122964da1be0b6872ee319832214ec677738c3fc3d8392cb53f36ed647364a04e37278a0e0a45b720f4a75c580c9920eba98d +ciphertext: 30925699a42d6bf2ab41628a20e814758a8700044fab7c3b14188ee52c8208d9641636d721d2ec32ac32436deacdf6e4786c3ea44353cebdb1827cfbd550d209461b6a14b1170893a28e84205734ebf74c171d70ca82b20b4260b3f86f7ad4c2acddb7f4c8aa82c55d6d55b8e43575ecb5bca8ef011ba9b9ac616dfc7b3e3030dbb7a0ea6b45e36155dea786c6c2643437930bd8130d8051e70506adbc396d64a68553140e91f47df35c19a79a096bebb25f0e420eddad682d21b374fbc606d5939a1d2493b43111fc71384f57b8c03817db1f9e4d0e4c5e7157a119743968948929d3b96e3ecbbd10b5f72a9f45e52f6145509aad69f8ca70d55b28edb2802a94c2cced9ae537259072b55298bd9ac0d98db002cffa8e94f9494fcb4b2da810b2244670e00aa6ded8ddba746957dcc34d537db9447577e19ab7ff1411ff6c68e7e40a3575b1389d8817a17c8cde4c93e572316dd029f4f21fe3e62d477f52480bbb527820175ceac30ee25fbed3ae258fc0786aca81ee2053e078c6bbb30d169782c74fe0ba4c8488e2ad4c334dbecfb2255dd7be3a95992e3f6a0ed5cb1f86e2b99a5a5f64ae5c810f8a6e72d2f27f8daf0c60a6d7e994cd231391ffc7edb3195bdbcd5f63acecc14b6c7f19f6d889616e8e2a5ce63c3bc0e2209d30988a1b689c968f9402b49c0f881dac8ab899433872e423ac06f5b35b483859e45b0f6fec52334d7582a6149fd984237c5f14369549c261e8e7246664b21e05725f953b21b49eb33b7eaf612a4231efb0abe4bd8f36b981f4f1ef5a57a4d27373510d1bf9c0a5b77625314a125633233c6902260e705b4995ae34b6f90eb1298cf9726a60441ba5c8d24c474ef73c02583632474956651700f318a88718519e8c7baf48f4b571aae56410d6e0d83a50ab3fb4115a1bc2272ad443b5bc5e6ae3daad6797257cf9868287486a217c631814db311226b6122d9acd2de042a95b03983261bcf902a82fc7f6c0db0e293bba27eafe29c6947f35c1e0180179b2d2872a85a63bca18a9ff5ecd144ceece9a48c68b8b6775ff1db3b9772abdf3dd6ab6d3d964da1adb4a035ed097cfafed937563125c95d7aa851d6b3387d15f7b0cf855d264a46a6732f097969872e5c1bbbac0e0853046473deea8a0ae4cfbfd1fac86d5620a3b4501fc961e4be1949e3a258bdee7d2abf4424f0a401dea2f5b0dbf7a8c82983eb1db1f69c827d4f24e36fabf34772bbce108cdc0106c074c2e30851f85fd47777e979716290eaa515e69390e6a95038fb018f240bf722fd947bffbf82373bdc8d7d78d739e119a5157294cfad5ed0899e864bb6f091e861bbe785b4773fd9b6f0ab758f2f71fe292179651da6046dff6e51caf05136e8ca7a2a60ed74015e6b8a3bb5637884d6df4ebe24b523548f5ff7ec6e42ce750a47127d5d7c312d15699722a6234d9f6a8fd51b9f3ad16a027c0a2d56efcd4bab05f5efa3ce4004ba9eb6d36329edf625c18dff3a94c5a430c3a00828a9080d9bf166a5973b60c9541 +result: pass +shared_secret: 2fc09a1852f458bc7afb58baea4d6e318bf6801e7804b98cfc250b0a1470c598 + +# Official test vector 65, seed: "905074033d7b75deb2d06a2f29144eb377b452534c5710632989f02d45312d156557e96d4486020826db200153bc4a8b" +private_key: 8a4487c253844156a9eb333c710c70398293058632014350817b2d98d68b4e0c536ee79febe01f3f423836e34436600866ca139193376db576f3920d47181eb7b2264cfa494ddb768bb10ddc002d55d25724d20f9d125cf6718466d7840941cd4783bbffe342f4a584cab59e0322ca151bcaa29bc76dfc0afc525e0791b3f9e6279d56cfc4775d84054b51e604d5ebc1a8922d783c840a9b00cdc58da2ec4a5fc1bda820622e5c10051c3c041571685697bd49ceecfa455e11af28e8a8f9c0b6c74314d2dcb8b571c5d78a7ca354567338344a305338897241d3991f3b4bf448479bb36f9fd3183c703f57f5903918bb71fcc701f586ea719e2e8183ce605575819514f4c59b72aa76bc6c0bfcb7fd19c51ef3612d45a9ecb396cf5b13c96a0bd7d3cd70a84a2ed11e66fa39c5967d080b8f7106bf00a81d208c66fa31c94e548e50849c992608db9c0ac1816ade777d36a04e6989ae0d5c1a703541f2f2ccd4570e9657cdb17202880c0c5ac3ab15b13552f91632255b02eb9db48973a3990495900acfd3b3301b38bfc4374758b0d6956241600033b55f30da2f8d1a046c27c80a403b935905f455943b0459a9a5046bc9cf54b82e175a34e628bf529a225ee25b07d73bcc4a80fd4580dd0ab679185718e5c196e25f4bc89c206409a5bb0d1c233837776832338a1d1b907e493c6240b0c6524a9e542b91f48080011b3ac1ac062bb528399b04c3bcf114a0f46424cef1c1bbb675b1999c8ddb883e7b40a1ba5ca13875bb022d8c088c810601ab2c4844aa916ec2348af4c28b552c08e970e535cb674b388bca5d3566a6edf10d10856b2eeb796bd8cb8b503f2bcc7cbecc528ed121bde4782f717e5f63658cb7251694bf0a4c2ea4d98abc70a4d87994a3317a206c34ae972a54e74d235418a5790cadc9333f2c9c349744bceb28d5bc7ae1521ab708cca937a9e10072f412a26037312145500eea42d04a549edba62185a93c1cadfbc4721fe827db83c4fcca759d575eff93848baa22d23b5a659cc5c3c3608684229bd736dc6452690c742a59b9c9e9adf6aa0fae27664a28c1490bcdf1865802a9ba2a6b49951b3753c12f3ed57fc88bae34d21befb269aa3663793b56fe162a2a47643ffab946f94cd012479f5bcd1a6a6b8019bcc4d38e180bb993d319f43ac809cc2bb8a63c9d2854ab569da8f7c0b1b24088056d799b49d6cc12bcd15ad75c5dade497ad0b312b9739214098bcf2cf90604a72013c3b52994a691105c4060657493947be3b0a6cfa91b83580457da7a6411a984cc661f0b7c59a012c5fa895096a354eea5abf893e2eb7389d0a649481421b13201ae66e3b3b4fbe6818d0f47ef7477f14e792b35ab3fb2737f9ea1c75a3001445920c2b1c65c38ea42a02d017c93924c4b3e7492574c368401276643549f5afb69177a4d807937102686958a1d564a8184624fc47e713b7d9728ae6cbcff5c52ba4966429b9c0dc659081156bc7c398d9a9bd4807907b307b1501a8bb518268897dc8610b649494aab4743e5ac392568b771433808476e6b32dda6940865c3e43077e0d9bbcee84cfcb523895b36c5596880f036648f37d483138bdf24c40d182ceba0dd3e26236509aa06326ff5cc174f51d963cb5e5b1290eaab649c91d1a03b9cb45400087248ee90f5b9509b9d44f27e814b55b5d7fd341bb663523cccca02c277f1a12f2e054008405dd7b8fb5b78f200266d62b00db2665a728b9231b99d957904d4278c9b99933972006c0afb2d46ab58810bd59492891a77f96b7e9d06eeac63cd9e3a2039a1f30ab0eb4e6a7dbe875253174f2519092761e9684c00726b8548aaf2ab3bf79c8255ec6c1591234672acad20c0bec4a5ff7b4ab4442c2982799d0203f1ddb53a260b95b51980025140556582a0c5dd9d20bfe542f79a743d45095b25c9565c1bfd1d82e5dbabbf37b934bd43a9af92ae5bac65570cd0586621708a30d8371dde11abdb8079616896533b90611a58843ca38f6105164b1de4b227b0c4b14749f5833c5f76cb5aec703b2eca6fa40c7bd224059a4938bf125653901d5d80cb4fa7213e9136d7c0a4f2059865911f68c19eff169af063e76887f192359e5e60516a92fb1842af25599aaf530b08a171d35be896590ef3a9b7878b4a3764a3bc2a800613ef1c2a31fec6ff7a8c8c4e0158202c4ffd35c1a45738d1ca197f23b8858a31dc60770e38796da35136500ec868e209217b9a10c7ae465848c82e815490da5becb32a55973aadc18afb2172c0d086de7e21d309226fd549219c0aae0c672bbe832c515811584ae3e4a59ba98a80e2a0386a187036961b4f6abeb6a84ae8b55b4e95cc9e812be00ba0925ce00ec3390e7936b52482b420b9d051f91a117122a0778c2434cb661ad59050342c63ce986e1b590d2b0b81ff4c3a1bb5a9ab4cebfa96c9f072ddf8332f5a3ad0a156fb5b6b35e38a595f30f2156815656cc487313c75952dcc12adb5b0528ca68bd53bcb1f750d5f24d15d54e83b165440528d83057fa12a983aaad4048c53c62c4a789b82728a94caaa50f7a7df6fc7d07c76727882fb8aab09811a611c5188dabc366494263cb8eafb78eb40a7f33763ea9b51318f0ac1a7a34be71aaf436ae4248346a7a25e2dcbaab226111d96d5d9165b946ae29283118bc34a46409f2eb37c469a36311caa843c112ea83c0364ec2b8b6e9ec68cb8485bfd87ff560912ff21c43d59a1476952e82a2d3f3a00cfb7c49a61e9216b728fcc30861a23e171c2c7954fd85528d911682066db1a062b50a5a11cc385db16d4f4b81785c9b8368575409738683847cd46f9389128414082c5515b5b3310658c54be69a6c3b02b5e0a1b6627e0512999862acc0b34340172a9a0b144627cac4d36fe8d71272e6ac69ac94d1f8c250515580b85d8ab300bb29b43b02195ea7c966947bff9cc323d017b48bb4f6a88b0201956e095b8092b250b53dd9f58ca90b28eab574034372d9f8305b39668bc90e2b6bb77257252b0bc36ee68ad25a7c883691a494c5626b5bd870c45a06ced4f39fc7e21958811a7b7cc93410b2fd8245b45b7462f72033d86ef2fb9b173397bbccbacaaa7177760202a8748b440f82d49218331c3760918c640dc58073883b5721548ed6e529d7f95e02a65cd7bbc3383317fbb166bf751f47fcc216513742596c2e9bb75ee80d2dc16d036b1d45102bc2275aa09b8800213f67dba3987a2f5efa1ae2c7868ce276c5110f462e65b39b2f4f753b3a3d41eeb50f7aa17723bb620b800aa3dbdab7fc31fcd120f19fe976236711e58b4ad172d25ce01eb88bc9d6d051c56564a0db11d7e4b5d8021c486b9c3114d7cbbeb7cd49eba8a61bc2bcae1f1bef30a1daf76d +ciphertext: 8c7069e91b0600eb165920b709b2d3e91971713faf427499bd83f286ae5c72662f583f78fc9401043582106b94c1c39c8f9348501f0c0fb580c3a40bfcec4eae177b1d73a76bf20ede2695a5a00de71403734584ac92653eaae46a696473e3b356addbe195d060888a9db895fb18f5319fa436b40b9c1d8e073fcf305b7de0d2feae428d32195c502eee3b5105b925460700ac87a55745bf1cd8481274ad8168a206b64c07f290f4433d8fcb9a068b5ff77d81d50b177605a96a3fdaf6566d6ebe5d793e8bf87be1db2ce45d61abd3613e363038cdfd4d600b37db3881b2c56f8f8ab7bc48dc86f82eedd207b7568c07dc0c5f1d656c0ec4e7c2f157587c7c2b76dc1cea2445e19b05064b9257a9137debc0ccfa0fbb723c3f320f5a8cfd1d032971336d1599d03802a74696101f8fd1b584102155c46a4c7283a6ec6e6bf9ad60e286277e05731e105b76ba4f992f37d30d59b4c224b0b44b74ea34113f6346a481977ebaffb36c291fbfaa058776effeb17e11896a22fdc1d7649a11e33cd7d22ea7655b641b5957fdf542acea5aa2d7667ad0392da7c596c8bdf38954247bcb6cb77a6e66b509dd55c2904ebc3188a1ba8e017191133c66ce9c656d7bec4464f542be009e3850a27ee58cb4a5374220226ce305cc45b98fd094dc9e2dab7acb5fca8d4563cb156f81800824031a6f342f6dc83da64184028a3a90d0d654eca4814f034bd1a452a41564cbf5f7865c9309bbdc34702a06a789709497dff45644cfe356ac9646c3ccd6ef51e48fc81b518e90d9c4f68035f1a878c893b6a7311aafa3f8a4ba6e194756e6c392dca34d51804022cd6bef7cc06eb69ddde31453387aab8c6925c7faa30bc6466d67c35512ff3094dd62c0b5a3316e8db4d8813a3bcbbb6f46aae9e17dea7ec7aab80dc9c099bf062e1006fca6cd8cb561850507e4a0760bbdbddc5a6efcdcebb861bff73e61bcbf51c7d150f5a2a531034899eb0c1975b2503722325d0229d710948d68968d662a8bf8e73a29d98c8dcb3bc128db82d1bf1894fd617d85ac70ec52214b348bc08cdba7a5ead6a7d97d2ef640bc06d71079e5d4626a4d7adb058170a07c224d123f8e0a11836696e95d5180e43169aa81e5b6e684b5d4cad7c29379de9eef671ad2d7dd8d4285a4983b2413bba4c1362a3ae57bef857d2acbf492e1ffbfc93d71fae367adcdc0bb96a76d31c4a72f5ac2164cc627f86b8dea3c175a34ca0c8b9c10b25ed2ff4327d9c683e3f9f92e69a41c59d7964d8396d06a100debd1b6d6e1051cfc17d8f8b3239ffae2d10f36904089654edbc130dc8a5838ef8daf78947800fcc084db7614afb6acdc3af16d9f2c80bee61f54d9b843d485382aca76fef93b64a33c20ec9cec415f49df42ab2799ef3b1a05c37584c9c5874def12329eb9bc047ea70927f5adeafdfa0f24e75ac4e7c4fce2d96f774a97872795036c69e6c412a4b4fc0dcda336d8eb9207623b7f263870a705df4ec5ef264c016caec1d496d5f9859c1f331d4214b13b1a +result: pass +shared_secret: 930131d3145d5485f06c16a9420a612330843e6524dd74654a85c383e28f2cc1 + +# Official test vector 66, seed: "a3e2e511afa7bb560446bdadf67d2ee2e16ffc7baeae7efb8c5455068bbd4e91bf9be9d98b280072faba7712c75b26d4" +private_key: 5a837a98d1b7d23c06ac804f9008924221681a5b35141311b383a995a75dcac87baf79b484eac622a6a594cb1ddf122030096548285bf7da99f27a8033f1ad1e442e3452913092a0f666ce6a910968e00b1785658c576fac3a68ac13abdb91255f6b5104d26750894e02a9610a632b558b4739858f72b9ced305cbf9c6929a7664ec49b6f6d18f728664953b77427180e6b2895ba6a56b391cb1263c5154061e1a4c4da221418b363f09c669c6918e911e793b92249885299923783ccee355330118199deb5a4c6890c5e61e45a2c89b3a74657686a9b1987834b309e074133a34a4a11ae92a9bb6a4af14c15b2705252fb69cdd159f5084159681183fd01287555a3ad3314871483c8040cc20894d4a5aa239cca6c733fe17220e55394c2a2063d30497716255bbabdef6c71a925a24f201b096a39ab3caa54438222b23f6c16f07910bb04a04aa1c8299053855f4a8cc852df639ce559abdb7e1a5ec9861491269bb829226bc1e99f392c1c6364d64886aea98f0e25c1f27862fa64aeb017b73f30aaf8cccf543c6e054b23b33bf926125cb263f844c70832aa6f9d66141903aac5b7ee78734949196c54a558210c91ef006e266acf833c77fd97f75b8800178b6e2b89a81764f9e851189e2ab41dacd5ec31604396d5811641ff21a40f9c45bc947aed2c629b457684252cb713de7d25955a66dd6e801bff34028101a21d10c3a6624c234b0640b4c26140e345b778a04929a596176d922dcf737f5198f677467f2990ddd5194fbb5bba6ac7a8f2c90801131bd1c9fc50cce2c802ad8da968fb71acd79ca2abb87991b90e2a76e5d547d96c4a300c32c0da3c29bb40d611b7923c4b6796b8dabe5a277ec1b444050f0b17221744e38582f95faca6807b566948203f00a0b4a8a77f724c067c5c464cb59b8547ed3b2851b9f8eda807317b5147533ab879a26b982187366bfc50266435dc2a96e8b104694f63c355435d6030aab601755b30b38e3434352660ce98e89528e9c54245846c58e914363d61d33d825b1c8c6ae439e6959743f3b6f2b762916f65f6e765044b4a3a6244c37b1b0a671779a840cdc5a7db3703a670c4f5e9c65c9bc814356b4aed09f60162ecd143f86e3b81071c917124615821e4c5bc98b312d2ff525d178a61efa0d465565e5700de4069d3c7864fd15aa9bd4c49242b0cff231aed9a270e41aa5c29e74787524a6085a129795ab5c9049c985304478578a907903aea16934f73dcdd17ed1fab3c629605bd1aef9d16b674a6411123a0ecbc718927b18642acef5a055d47af694c34b300ab6296dc2884984441eafc861ffd7767f306b7cc72f3580ad5214aa130a7e89c634c6b1923415c75dd0a256461ee6f94271027779d0b79c8b943ca32c2f62832a04cfc79786eb017f561c0c5eaa60bb44800e2ccccbd64755c8b6008bc89c52827e737dbb37ababe87980407c503cc5972a34c76913f37085c699b4a95ba473e21c14080d26315db9f17969f6b629b48de94309140104f7dbb4511a8977266101c26f5b1c78e3896e051202ebf9a5621797c775b1a2b3b7f3a53cfb9c90a545473000569214c151088a082a237a8aababa3b69bd3cd415cc1f9ac91c5e450ab970d5cc6678db12ae81962959a3d68d8a4fae40ed343cbd2e84322e2342cba7756328fb5c80a3fe07295db0e136621f8acb8eed4685cf21bb28a7fd34a9c6af4a8d1fbc8db21ac4d334afe1b71b87cc1ddba5501d38dd7e74c6c502ba04b8d1039322734418dc438fca99d0bf44f700ca473d07c0ad5094181bad2e90910c08478920461c750aaea6658112933753153aa9bdf090ef91a3f08e7c07278369df0bea9220b7d4c6b6f6a7135a5084aa54ddd270e9d41128d1944d8e7c3e1ac11a4089fe4541324db369445b5afecc41406b277e8bb93f310de57b55deabd8d2ccd2e9a417ed916ebba260e0baf95ebc0fbfc0a1b63b6f5342b3ed7c1ff4135f0a26c3daa7e2d60bbab8051123628abbb3cf9fc6369a46d4deb7ec0032847d7474356aec9a417cae8b62c9c7bf3b077eaf52c622b6a2bfa6ac49a9cebacce996a29f89acf9349363606a86a6696481233c73b273e847798b530b8662194896e22ebbd8f3640864791964069684338f453710d841aa83a2997316fc3ba06e7d6a3855cada69c35cc801cb49928ec66a56cb8a28deb2329d75c6545251ebb8526903a13f5174119b9c2037b06c165d2012723bc817297c42465cd77044436337591f239153629c3140b0ca85783d2460b207268f013988176f4c22d8ef5c096c93a52706931b4399a1849488665026a615e5955d972429eb32213ca16b587b0f7366192366f523732fb1127731cb06bc39f15f35b1283654bf361f403be5a9ab154f786080cb8ec42c8ec356847839de84a23c6e4321136477c12b20ca5642efc84c658323f90c2509b62df865e54072aac311a6d3b4eb9073b17f2291001a37e6ba438918a42663bb4d15896239f9f2b2d17a5c93c024ac595806620a8891b89f7297901a9b63e7c799cac22a515bfb3ca9a4772a5bc9a11154011e4dc0d758868a9f646d5390c631381e8566fd5603902c11686cca1f876322cd7793c338876d82008eb30f32128511a872db5cc0ac689c75266d5a9bdcd889f73dc92f1dc5076f373be64308012553d3109c7b5b2a819afdb93bb3447c878901813849c5fcca97b116ca1c2115961ac4b8c926303bd7f502eb299421cc9cb82f556327584118c6930e03f4368ab915c3df0a46b08518cdd280e17f86824958f0ca8079e857d8ba9a522a49c3f539c845968faf37e4beb443b577646967f4f824c2a706b3a7b74866aa4bfb83dd8e4356dfb1d9f4678a0a120cd2569101b034e36bf24a58c690b69ea27ca88db6645682c13b57d9a397b83772c5357082dbb6981674a772b6a94d0210b14a7703202cff38419297edf92a305a59bc51a022919b1b61bc853abca39721b83a794f1c27d17da71a205571573ce31ea27f81b744371274d6a8138b69ef967adcc75730a652f134b0f198b86a2a670a96c58d45295433851f61850d7b318245849a140a407a60080abbab77abf58d8c46f2580716a0bff0481b1973c804a406dd2bd08370ccabbc9fc7557b26534cda249ba1b3afaf2956f10b0b6ac0a7ef02252f5869a972142e06b86b64684b34b2592bc91b7c5b24c14d232b81880b3844409c6038e06023321dca0f2271144373fbfd47884f3ac96e4bee4dbfea5eedf79fb157b32e2818048bcd9b8e9bb89118362e59c75b4917014c242f75d6e3755c28f3081ecc9db44f6cc7cec9891756d74093716697781fc8cb5b2dca81e3f5f748d23c9d356a2209f6b2d60247b2e45c9808de497f64f124643 +ciphertext: 2ed0e760ce63fb59cd94fbb798e752d1d553c736e988de65e2716c30f329b7fa287ff0c677ed43f3d0d674776d84d36fe6a6513586a2e2bb915231481ee01d1ea06dc158456534e1060f32f06022190088e8fe3cebed9d3cacfcf7100c69d0da846df24011605cf42c2cb69dcaa578ce8c39ae68f2fd5704438753348b0fe6305350b1ec520d96aab367188162f8988a47987421fcb6d03d5e9f47fa6333b761b95aaec6a38593e512786975765247f2756ccf88d5238ba4ea61ebb18ab3cdf5649aeb67382c0a232b14489e803cb1050e1ef6ed88c6f1916524fa152bdd22b361722dd5d158025033682fe3caedd0809451b0f6c4c552f0ddf243ce5295133e424ad4fc7a7188763a08543bd3103a7480f467a7bed7a153d40a753dadf3e7af116cb594923e0c5c4c5d8ff27e0e073f84a70b1d1822ef61bad30d3ec51c9f183b6d2967a349e674d2e57cd8ee1a5ae01b37079aa4f2064ee5df394eb3540eb9b636f228f3c8f3b4a8fdba23405e36cea3e852c076b4fe53f7e877b1bda1d72396b93cdfa0278c4445b88e4d0a72aabbb646e6b87a01ec8b7739e7149c0dd373f818373b80edf7028b029eb1abba49aee7c4a0e3f290fe23e3a8487d6da923c61dff69b6bec01cd2efe0cf35ac6855fdb58ec2bddda165e99ee1de5e183ac2568ac47ec30668660d2d7613ab81824e049f1408e965b457461a7849df2dbf8276d53804cd7d9934e482dd6f3c6f167d6516c816271cfc18a6438aaafec7f87825dad2d605dfb26874f7226906a6e3514fd6c73ac0f8524007b7d5d32e6d540411b7d9ad667c5271f1c10834c7f64266d9da404bc197d3ea3ed17cc9fc8ed65e942a836c9ba4c2c167f4926158db053dc7efe70e008c2c9844533a1912c42266e7ef99f9769104ec6d7612854d3064878f02e86e65e51ce80ce5a854c4b92d0ef26a70e75770cdeda1e63dc2d7001b31fcba3a561f74d7bdd49e6559ddaded87590bb38ed03d9fb9e7f8824223fc12ea3642d42886c600f0f592fec815d454b7f0691c3b83cc3c8f1a014f5feeb2cd04720ba4a4f6577c45ea5058d20da7ba8ac58e6f8a594e7a41a91252073ec24c473050e82897357653a8b53440824c8eb26bf4e3140fa352819deaec7e3d5f8840fdc5305fa92ea8db24063f3835ea8682df449f06da48662cf06e569ec327d678953d99ee7d169c6207219ca1386af2fe4f527f6a59da051901ba6bd6798606e2435cb3da1760e135869972eb29216cc03da4c581d553765c2fa3388629fb7a8229a4301b7899e331eefcfed1adbeebf2f86699eaa9419159e669d85574bb76b1514f4092673fe4098ed54ee2873ae07cfd23104bbcf189f6c8b99b11fd2b40e03c284da6a4ced499dff116a64feefb1c07d16492481db67f72343df92b9e2a83246e8b5c31ac69deed48c019fd8633532ea972b992faa50715382e340a1cc829e4f64516a8a840b1c55688c409ca7fe79ef72cacc4ae564225592b66ddec1568b40dfc44e5895141362a3fe39e134d70b7 +result: pass +shared_secret: b276a4fb4cf77eab502dfdf56eae9f8a8ff5e7f5df3f6cfc80614b193c87f08d + +# Official test vector 67, seed: "074ab1a37ba5a0403d8f68d26fb787bc2c90f5ef88f2a6d286c3e6b168abd85d393d8225618608b8eeb301d26af53bc0" +private_key: dbb0bec6fa248682bf1eb3b226d9bb45a19beec69998797fe4d9275f1a6ba518ab41e117059338f8052945a36277678f84f761fcea21b49b9e2c85bdd2c78df17a04f121c423ba89cf15c90bf34ed5e341156206c2abb93b8924d6fbb1182ba029178be8b5b38ed868c86c54ae69b491f2450b96205484b7070aabfce83a6f0a024dbb837cf26ffd613d106c6fc6fc81f23b838782b72f7873c9f6735e71ba2d2c7f80c29efa2aab162767b414b71b1bbc5258aa61a984b2202e06286d8ae9cd14d2bd7b229e039613eb081bbedba792297cd6672241abbf5643703b098fcac273236687cd8ab0e4d21fe2e15d786c37a09741bc493bbc908f20eb7599e6a5a102030eab2ad69266ad30696eb1072793b6aa613734554f681678fb8068aab0c903580f6329baea7155c1bb09e846ab15427e0a092c3213ad42e3c1cbcb48cbca59aba88b9f60babd8087b461a2745c2973c04a8d11cbca9b3a74f7415d975004db90c4b985d990ac3e01bd72a446f2e13545052a99371e459c589ce203012182a2746d74e5b914b872678c999523b6c5ec790f986ca98c448117bc397643c339432ab2b058e340e098ace6c6a1b0e1472e8ba11cd898107ab9454a08b965329ce8758c199f10fa5c914cc236706e0a35cb5f2c4bc749b38e2184486a88be97127ec036fa78a5780b3f0515b391ea6598d1b998141d3461c141b54ed1770ea2938066d40dc3256bc6da09184b7957070391a1cc8629181954669da8c33c94511020750387417f87080907bc8e48332d293cbcfa6409e814b79154b135c5a721b447d45ed274731a30215f92004e30ab64fc87b061c8940ac9153957a21aa54ca9be2ac1acbd46283ca83219200788eb152273c61b860aac104f66e8043e7727216141097878d66a30eeec7820f6c1f140989649c2f2354b81597b298826225332aaf6ce5b6ca31ff986a665067272c6a190a454bc3654699dad2c3660e371571c8cd0b9b1e0ec5ad43106758c3b2adc01f2e46a95f662ea6733a62c2f7f67521065655c1c9e40615584b553a4697141ab010ee4a2ac76c4703043dc41a675309774c9279ca11c717ab9518074f9c77d10c4b973fc9e1fe1026c9c0dedf68db0d7bd63c67750db13e4120eddf4012ef42dcd7907b52bccba359374b48ac4988f4b6731c20295eee277a09a1140c30a6f6062dd152425d9385046417ce4808c7a44046b3c3773c90c40589524acca23b4755b23b267b2c5904cc3a634750b863bbb44243679483997a52a703ed867c57a0ac8227bd4115e88e9461481bf5ca1c6226283ab201844d25f2a094955d131305b5f1bd91789789f4790c193da4f4426693b9575af109b0824154f431ff1171e3c48686833beb3b3a4f31388f0348f6831acdaf70fb983502e8149b71511cacc7ffc0a411eea2e781656487139cffb9f7089388800ad6310015dc85502b5ab19e2cea1fab7eae59ce1429bbfc55471bc8644204596b264284c31c21b1e3e64909ec044b0342fff306486bac1c5c2aff2e52775e7338fc8b9c6d8a78538473ce1181b08048c6129eff7ad07c85bd24c2803c57a28eccbd3623713a5368c7228bfe0547566a43a1788e9e4489f8747167b6f08f7945e6597c9872b0cb4b1401288d7915be8e3715a8391a486047c15b4ab758c8d9b47541c3411417a439bb2144049744460810c01b778879425077e91ae06c1bb831c75e9d1552264a6543266e769b898b66644ca93f9da7735135d743c62a3876c0c891ab71c73c9b88b5cc14de0238c82103fa8f634902a01ce5b15e7823a36aacf6a05639a812221085b38b2ab933a12552c268ccca3cc07cb4e1ca03cdc02b1a5a8231a386456b26878b673644bc3c1613090454b582d5845268f381eb0e70128c1b06f356a9da736222400acea7c58216040a1affc5771081743b5f0721ef2b601a651d8a2658eb9c5ad8599c2f040f791ab5d93c6067ba30014af51766a41c70be6542b7224767301885a030a8d68a795e9924ed844cba1b696b18c5a64abc7ab83a163cae74ca186c01cafb53c05fa535d43786679a429677cd3f672b7c9cdf9224030b32c3a147ee0b2a8e50a0905a778ad9269bf04c2a801a1d986b15cda0ec2f51deec2005d450bc070c5e9e2a9646c3a6029beb907b632f17163b260fa5b75944b00d776862c3c362d06b7852ace9f93afbe9a4d77c548d04c68206277f569875fa677921c671fa887b98866e8c25815fc09d194adcdd34430e2c3725178f6c509fb359e5c3959d72b37a52c303490ae22138dc495bb2bf0c4fefccc89eb6b70764cf64cb2b02699e84a562f076dc4221153d8bc1dc0a29387a15da95eedc808c666b3caf04882188b5509106ba5ba1869463834b48dd9a2d7d6b46de1b83834b7db556a0b624869641a7b77c1f15291696798fd0cc1d01c417062ab36548f4f7b842e99a85a502d2ed70bb82037fcc6237f058d88ab2ded194bc6f65c723656474830581bb92f196e9fac65fbfb0e662c34cd1739ecc28ace01291f24701ec6a836a11f54d44fb50a9150d9401dd96c39b1b02ec73b86827fa1cc39d3ec5d5fcc4523a948a30bb1da4b3588f029c11234b9b571ec3593e82a0cfd428ea68b727622464fcc35e3dba3bf911cdb717ad690147ab70def66a2a66052a3844b7f6866c1b4bc80c106d3155d4bcb8c13239fc96241cb1b092696a50502a887547638499216fb31379a45bf7b43f92175fe282d98d7a4ad22844661256b711228a31fd2b01fa8f72dd357c455768a77cca28e6984913c352726176e2192de562781dccfda024fb4315eb5b14b9430bf0e783ad77a763b631f6c03c4b45aba24a88e85b70fc3b1c3049447e688c3f2145072460b838546572a42f4659a71a95392255765426451f137e8b4ca64b5c24e5cc74a816a988447ce07886cdc59eadcacf5cc5b17b4b0d058c0b3b610df489066e402ed63a5d155161bac9f2e82bd0e18cf46476935fbcc0daa0ccbfc72cae9b217d3adcb3ba7e0b759aab167ebf40f6cf92eddc17ec44508d051a6302372faa22a993386201827bdf3a1e932c093ba2cd1bb347096b53919218f321bd761abdc6ca5086c51b0c471a6c2781d1ccf20bb567ce472fc663ab10b75bdc6642832acab5c5d4db37a46572645a166edf46ac243805ac78e5c483e25624dab2aa705b9b3f6d01bee692351fb4301c562e30a513f6c73d55c0bdcf439f3f62f33e42f7f876f5314cdedfb4526a075924c59dc03d5f604585571f7e69c7c8f254bcc5af0ced187401efacef8d61e3843d6c8562cdec0e87d00c8ca8060da3f031ab663ddb43148eebd67969b7fd490aba5068af837be962f439f233593d193ce5e08f7d66efb3389885927b89d2523 +ciphertext: 1a7b2ba467c4e3689e34b0acd548a2f12c8d237e4db6f80323b459fdc9d57339fcb5ad82c1cb58e8fea26f2c2ce0927a06c6d8d320ca6b55092119b86fd3fe65650cdec9b478a55a4060907bb0ce8807d964223aea9308c02bf025842e030703febc2e3e11fb99bac1e31959f1f0c3d5a76826f3c2a0e0effe131db6f0245d97518cd1177386bd7e06a5998bbf082fad47d0d7665f87642c4c7da2ce9e1f3c99e1e8cdab1a4c0df0ea0afdff801cd61dbf6d089d68d3188fc3e0a9842b6b019b25dfbfd1a5901448670194047496b70a036abc0376b9f09443497f470bfd9f44f0546fbded6312c16bd3dcf5c5416d9c63df9fb35d22c789b361f069524ebe04e237dd25c8cbc483956fc7e449347ec0d417ae71e6298fea78beb98ca4a7ab69f974c00bdfeeb40c99c102ed61f1e3d2f0250f33d8c73d74612448881c0e4f19824da0670fbd504c3e9cbff4cf41784c3c77e1acc326247b63425443759a203084be16fe8b48a4f09912be9e9db95572ce110994d87ce406f04641b5f8bb17e95cc62d3a6fb2ae6b6371e510356cd68a1876a1d04c4fa0a4b7a2f9ccf7b822e4cb6700ec5071d935dbb67221722b6664278f62093f9638759cf8d6d7b48e08310f0117c1df0500aa58ca8c3f719b84d9cfb803d5f5603bd06928375f137f98fb3183bc385888efa604f8921a9d3fc793e47abe8d7c5f14f143ed6d98f3c0c3e714d2bc2d136895dc140cafcb083375445e77f3c458e4992b245194436d2b8c395e9c46c499c03d35f08d0526ba24072f841ea07f4225583b05045f61484cee17f85b95e4193961562ce7b75ba4739b3bfa1349818ce3756d4732a85095ef613ccc05dae62c8d6d7181e213a3a601f0b9e81e2863fb15ab07f88e7bb58eec3a647fff17c2ff56db3bf13d721e2e9646eb05a20f892d66ad04927cf63293f8db9e97e8cef9c26583a1aea7cdf4ccadd9c4832971d669543a29fd9deae308131f8caca69c3f2a42bbccc57aaf908789211e64f7b51776df405e12803f434758409ea9acfcf4c5f4461ec2df8df49d993766d50858d0f6b7d0def70b4103f0a38a78fac8031624eaa5ed815373e3ae522f3afa3dca39fb9a75e86474b81b6fbb994caaf62cd35928ce5f73606a88ed31643a6cc2285aceb3b6afc155aa0a5b4b92d6e2605a24becb65b15883df261f9b273ddad943202085cd780f4db60aff972af293384b9d85c6b3daf2a3cce8490b7af695308c097d07e41afdb0e2337cfab9bb097e61d6c9a038b7203b63b28c1224af0ae62241fd9e2a17bf0e12f45886096028993372f00ee59c5b55ad7e6e9f1048db860e0440445d61322e8805e15557e2cf4de9652e109cb35d8e652dc06bb19c2420ccc23abeb44dcacafd9829d34bf74d66c67e7e9adfb6c12ec99c5ef9c371b8169bbde8fb2ab0da650937fe4f7c145635d84096076c17c911a47da0f35ec71b1be995bf500ec1afe7fd6e8aa221d61ade2788e93aca60223dce21cc98257a2c8460bac2649c7f57af835495bc7c2d +result: pass +shared_secret: f4924920e64013fae72cfdd1e94b217eebd55a011f6b7542958abb297e4fd180 + +# Official test vector 68, seed: "cc0c86cc0abf86fa21899be1953913c00e7c46e6b5f730c4e88b3c034012763981d7f14459d3081638080378348856ea" +private_key: ed0c4dcbcc3304e1646a04b9675b94430b49a83bb1552c211f8928c47785c90422bb658f33890f3fe25078cb0c5d52ab737c647b2080e32164de411c489664d5ab23130c1b4a409c1c0296bce722bffab9d60ba4854c9887f0089567994e3375e438069bd40cf0e08e1de134c1f902d0abaccffa0e866122f28894f5275a8a7c2be316811032738f99b53af64c6b346fca072ebb38b665ea616687042b240c53501e18a424b5150b98a4897a168e5be9b9a1f04f0f14858af0666e177ba7f52be6508674ea48fa23313a71372be5a718a13d41f4887892bfc013889481339b2438f8516b24990d70c1159581a109fa1cdd460e6910465e71ccc362798670933052bb03e23768c3c255d0bc7f002e7dc299ac0145bbb585b9682978302aae26047bc8a2cac90589da65d604abaae2b36bf78604d33e23a67544a79fb8131970199116b5bef702ba74506cf72965d7d8bd8b438935c1c8a1e535806009ea22a5ef4b215003b67627358151238bd50391c8384a938e7098929b7870f87321903c819c6480c992cddef1c969e4a1ed4a98d367994394571ae93a61b4336d537140887c792290a196b01bc7c30e364618fa371ba975f49b4637f9bfcc7bb1ae789156c4ab2fc6cd62195a44c7572cf9239c3b951bf636b43cccae63b82cc2bc4bc6a03ba5a087c534339905f4280b7a79186b2652f3582c1865cb6ae4b334f75cd7f358f2bc69cd1b0d21a7ac35c926772ba764a72157e51e38cc66392a1bf409a068e033b00b4a4d04516873516bec242ce93ec073c366e8534e4b55fea906daf090eee9a1fa4a17e61a644ce54536f70871e61a2a728ccdd7c1e702869a28a2ade4cd234119229c9cfe80ac664bb2016125b3822ab240989e79a72cc26207ea4b139bc1bf5a257645b9b372763d4a318d4647024c797b8a1c2d49bbb4857cd1272f56b8342c46541000c84bd676bd533e9529072e77a8f73164fcd8443c3079c1ab5ede2305e6c5c22af691a25ace01436e43d56e204b4dae93cff827c061d1354acb6cd4070c92bb4b145bb0649a6fb8985e03e4a82aa178161a2bbbf23562b342f4818100b502c88904c196c08920aab3ea154c9535ddd8c9c12911500a38db80bb70c3794ee15f7a44097a7407851007b40801d16c417e5905eb994edaa2807b9c7bef6bca9065374b856f95f09fdfa2751c20c5a42a3adef757efb8276303a6e65c4cb17abf0f97c29581139fd655d4d80224275799645008f42ef508ac9445c388a989b3ac09627041741c30b433a0d0b81a59d237753ace7a89c1dd0689cee8663ae8497e9bb885436021d4ba553c706faaafe7c8478e346caf5280e171ba24672e850cb80e491be2195749a8cac30355f5b386e47a65b22592a1f7b09317cd6f3449bb22aba8c2711e979e898a2706d80fcf52af28a68f0f7a0f6c3221ca73918140447e166a00669929b915c4aa507e49672b45154c92239ef0190b086b65fa9e4ce7995e39166c8ba70b5026ee2745c2cc409e40c56294a9d4539101cace01a2861d31924d8c3f7e824fa8bc552bf6b70c042bef1192d1517091fac862776c9a33cec6939d89a30130561d400552c195c702bb9322378a12e144a0f956d743a9918c149231c6bdf338098c07f21064775b6700ed30fb2153478b67b0f344da35ca35e4b7c289a503d5ab9eab6e374279ec8ab67b2264d7b9b80d6bce26098a305734e44342a5078597f3bd574b931c3c74461c8da856239c24c576815f7f48cfc026baeae328a8207f5091cb7248615ac076f12763f8b63c0b75a1ef075b6e1c61b1c3bacb9c8895286e30729ce083b90df566ceba4c00e06214c295ab2b95e2b70032e04422572c87b475a63b53fa84ac9fe3c8bdd3cd06c13859b263d22a588b8126f2c615e3a705e0ba960261b47638a9e83c5bd3f791b362652290c5bcdcc4f3c93909431a4ef875c5e30f0c311e5e8344deec53c3b4bf584932f168710f66cbe718886e2ace059034fcecbe39d50d012c0ea26b8cf13807f1117f32661cf997145470c8aeda68022ccc43d1bb66732f5966c11ec221ac678bcba824f43c3eda94401c17c4877490e4393404db53a27b1dd3aab78e152a58f3741e1bb1b9a8202df64434ea9c5a8c9fe7584ea538250da92295d3a4abbc3e392a36cae9af1cc51095b2b2dd97ba7072acec4b7b83bb6d284c5fb3fb634ab3012e8825f8748022d8cef7367ae46b021df68aa8239d06c09fe0555e07dbc356293d41bc4f1e133ddca95d2298b2aea88aea5637d262390a79980220095d7116447c5d5b6ba2b962c794c899f45860658a0a530c7669134519a501e5a0759f9a50777a2a6dfb942f98b50067455a7b692fb1cdc2c10f64e9114b29cbe173ac4fc2adb95c550ae7a55387bf01ac3c45222fed7bcf9e240a6d9b0d088c032aa9714a6a55c692635b6911d92353c68794be250dcd65782a6674f87343a6654324f47f5ac9b384b22766d0c96852753a4449e08371d5128f31831ee766219e910b1f6267a57bc991da5b2b69a5a9212ba06ac917d45c9aa25bc1b513f7144217e84f1693360ea0690e51688a704c45cb6b1071a0e9a130abdb6cd3b52b8a429c33d126cfc10c73c928da9507aab00950f37e9bba0ab981394b137e337a88249100da175fe9299de1d1130381b3fcd265f7b36c00959b5bc2c150eb7dabf05bdf590e32e063a01a7cff6a9a22c56752c8b948502f3f8ac5ca444e10bb6bead1c7557b2bb2e37d55646455162806a7778b1938fcdb7da3e64c01c4a36a847b77958d27ab9defa6256b6a30a9b9962175c13721cd28e979e0d60196ba8c3c940aa4718d39a9b280486a6c2264640c4b09642499957be9642b6b545dbcc868098332fb103d75e38eb7ccbee64a341b38b0097479c019257be03d5d290e89a6a6f0b61039b128b46b02bcd750a9496ec4fb8dd6378e1ac77aa9f37a75d072d268c365725926cc76b58b9da040c173d7732e1401ab222553d6aec7911d052c569c59393997372e548086abb4de201ac1c17f25d76fb58c4ff3380cc5965720b989f4aa252623c215369076e771fac786e7f0ccdd917da64126fc610eb76948f97a5c3116869a11a46e612d9df04be0b1af0e8c8bb46607ea4bc4b4b04b3f79a30a2a154691a79217537b97a7dff6ab4edc9e2ad6cd97d3aef52837aeb232f799a3ce30a6adb88f6a0aa73fea00bf0146cd5447c6dc483b4955a0a3c241e7cc353c2c7085b84c5162a49e7d61a2d0e85a009833f3eb2305d7d435e2a4c81f358aa8d0dd50628096f43cabf1c47e7aaada59ded4fa8ce378ce1d9eba621ebfe8cc96a111aaedc4b6cf0f4dff8e56f68440836a072412a30d851ace2c7c6f02d60e7a8420001a63e6c6 +ciphertext: bef3076f55b44ea1791eae3b2b28d4fc20213f11983e57b7baab4f674de12bfd5fcc10ca13c4996002b08fe7cbaec7a5b6cfd2048af1cdce87ebf46a44167cd5e31619f89f61864f2b6a613d25781d4435ceab63a9e36a7e47cac50cce866da5b5646c45248c9d9fbea2ce0a676fe7477c09d19052d3705e75b119204c155be6eb2049a1d75d6299568c0c5531becd0a852303eab69b2d0a8cdcd54b9cf61df91db58e374a6af5cd82704ce859140794d35de86c7e8fa63b57821b9fcb3da45df3f6a39bc2f5f600358f83e30b9a492d1acd2351f6ef614b9a4393ff8c3961e62c754cfd1fa877534130892a90ffe1d91262daf0f23dc0836426d6fd2be36c979fe6c0d75eaf094f23cadafebeb5271d544afbc2af4bb54c4524d2bc6482d5f82b82551594cd0780d37409f1412bb7f9bfa0428de5ad074cedb4531187db0997adec9d23bbaabfc9b230b4c14dc9c1b1180feef555c012ff85f78d24c0f26443332b7c0ffd49e7d511ad1c97d304a22a1188cacb3b36130589d8dab536a6f107e0ee9c939ea9f95552a1b2c0a14be0fb38b6d8df01eb600de3c5c66996ea5de0ee68eb24a170b6e601b65bcf563b8639e3cac74f50c6729e38cafbfcdcfc48a019eaa19bf9fa44fe254283e0153d00c4d8232bd3a621b3ec7a6fcf353ad767783c1beefe4f233f1184a67fa2f552a70c18da11d04c941c2c8e5d5091dd60b3d420baf14a941be26fbfe9fd2866b07ff0e05facc01f34fb53597cbe5c8e9ebfc2c6de58884ad77825585c339e6b983cce9c08ab7d2b0a55977d0e555939338713a09ec9c4783f29fb8652a688b9f3914bc5118397d9002a041b0ca41e170c52cd1cb8076731329db332ad3dde234e8a7adf5ee3e27bc905474f6deb6ced6846213f1a58ed38b6969e7b2bddfe679bf0a0ddbe2c6535b6f4ed57b50e49787b99ff2147af091f5cd22e3bffae0eee925e824170ffc7332572bf330b0ff7478736661284a69ff0e43347f40af1bbb11366a1a03beeca2bce132e06cc6b7538f37573820723aea8926a3be13a7f7c73548697e3b4f87ac0872472bf94b8396671bbe1542c869f188663c30509c45deb7fea82312bc4c8c5952693901275414a9e7e3de7649a8abbb9ab172189fec7b79beffd7f752885dda73a9d1ce2f707454bb13905cebf361a338c13dc090eecbf90fcd873595ed951d1e289a98a3b8901976e8248e3a16ea05536be87129c1bff0f17696967b55ce7a73cc7e87452fd5f72a4ec7857ee82338d7b8d8aa2794f45a2c0b09fc3d69463e86c1678da047ac48adcb6178582c78ea3d48730466b524acc2c339b5bdb5bee3786c7452ef23a3e9c9501df43c27668b7bec57fa7df4198d04a6ae90a895440b5bea8cd2aa810c145e95c8ce51c017ae55341228a75c3167b93b4b0667d6a91a4b66bcd98c3598634730b78bdd9539d60b9eb8a5af2a046c2a8ca7c9618f845b941f920532fb0726898f8427148e4f5117e05969e88788ae6535d20058239b321bb33c5d6b7c1a54d7017 +result: pass +shared_secret: 412bafc716efe4ff928d9a86ea4665dd841e2f102a8363b994a0faad63251eda + +# Official test vector 69, seed: "6d5a7cc326ecf3983c4e7683f45263a37f692f3bcd2d920e1fd9584350119e74f9a3f905f70d3e20318c1413de2a0dea" +private_key: 2e497feae75af1f280abf2085c0321a00911d5008bf8a4042ba44691367fccfcc2d496cc40e113a0d056b5468b190c0e2e629f3264797f0c3b647865f4d782a9601df6bc5f03c1437a23b5d222bad406874f1459f1f9aa3ac061a20677d9d785535cbe7073667e4c916725af4d7302cf76bc3c23ab89666a2019625044a8bd954df6d68c2114b31efccb7d91af07f3ad3faa852d4162fd847ae7a11d8e11133089b9307806a9237ae3a9949043b10107acc9345c17697307e0c6c3ca1734f6cfbde73c6a09aa1b8159c51179ea8b93509b223668849b1b7c59118033f969b9d34b354b32bc0b7540d3ccd2995bc36abe44c0394ef5724b058d0a575947024ce6e72463389bfb36bb851864c38097fbac7204036de72cb0da94cd2f98a1e52c1e630748a7c05838ab53b2d33b0d541c1bd31a2ba803f4205616423534c982038622b70ba4778886f2d15aaa681d6468848fb0601d7097b99040e9e8a981749f741127c6a0000b0c32e28976ecd97514c2aa15f82979497e1da91bd3200d4b0ab373e41a56aa9aba24693cf9c7939cb8733c27a7707eda2aa4f3f304c5215edfa3cc3f785bc0ba83d9f291f8787fc0032f112133fce87441b473961cc87629337cd4acb5367432cbc7407585a3e2463de228895327e883604a19ac2c46389f1b0706f720db8c17f709a796e03d53046c4ab2013afb40ed73247d0c52b0f88e2c9100b1b31813346904978d3bf6bf13b4a6c54c3894f2a2266a9987a4c8505cbd94028ef7963c97d80575549559bcca5d78c99af532b31a382567a6b1e8c56babbc5863144fc81c6322806a6269215740af996b0adaa72f425169517d1e48ac1349c343214c52482b9d19aae42c4a6ddb550040b30ccc82e7d5578355b7313a1f84f872170a6107a52008aa47988a5a78a15a6d070e308c59bc630d1a1292fc2a41c86967b4a3b3ee312ee3c2327a80cb9a112b07b9b0e5858191164a7a87427a8423f7116c2e84377af5cef303b7e9069661f1047c15bc52876c45864dd78854d0f07fd2e530fbbb9b13a4034cc38e34344d5ec41cf544359b93ccb0338bcde09e9b938d5e0c2065126ae81581f62668afc819f705af3b82bca5921699602c6af9810084933c438d4de95a6691ca3ff425fa04b614bb973d899bb8748a7571b112545548f08ff98931eb555f8308ac724a8ad09a90f109219c3032f4013cdfeca92b4cbf23e528ab6abb29370361baa8f74c3a2ca8a29d6a893ec06e60979e351b4ff6247b8fe3923cf027c55363a9243cf9a237ff09c0666aa7b6c56b17a63fec016b4c15cc70c59dcdf3294cc0c72df53c9b0b00d2383e7f48335108629762793fc70642ca91dfa1ba6d97a1a36a55fa6c9d73246a3930b31fb644e34579c2866fc4c5671667b0dcf1aef82bcce732052d766673b398aaec441cfa73dfd3b463e8aa018c4272eb0c3ef15618f9acad61bcaf64017648539c766eabf8038f5467d446912c98836055496b1b7d777cc82eb255766568822704a12640ade87d0ba066b4f3405177c9e1e41f624c5ae055887d68c97be0b0eab254dc3756d00bb8e78676ff62a94f842e9f5774b4f07b723577c742bf4623b0adf246f87c53944cbc8e4458305ab8304a53b5c47b42911ba1b011c4da11c08b281e625f6f37815dbb1f3908c4c1646142b14d846b8400114face5cba669179ef121436a1975845652c5cb4ff62fa0073738f0264401adbb78b44e61619977804aca17deea16bad48655133144781b196c2a949bbc9aa8714758061465a9cfe09f2a1316ca875523e07fba515296309b6b7391b8d192012278d684b2527318f30a7c1e598a05027409f65a7f36b57f693a660c7a9f2b0bc38420128b87b005b5ce7631e4a10ff858831cb0112f5b6f04334565563e751820da374ce2819e4ed9bc5a959eedc4052c502abc54baf3fc0e426b77de7a274f81451070042e70c19a09421454141d2600df76a740423cb887065939cfb657a76785b35a5868401cb4d88ac8194769ad2499f2f20ed2a188e8e47e918cba7342b4c8893fe411b47b058b0070771161970c4331ef67be34bbc4781171bfa19d51e11612f93cda611f4ed88f85b87e8beb6359eb410e7175ef6171faa03e29e11ea8a6caf023c357a87afc652a00cd422020295bd34170068d31b7a058800026a49fa1f7523ebc5544389cab259815114d4b01d089d3cff6956f5d0b5a9fe652825b1150e21d11f562196892ca41941b46018ee73683e008525059496a07bb029737103b729b1fcc13ac3236b47c63a6ed4458a9724ef7b62361e75ba726be6774cf6b3572657b2a6abcb69182cd3b880328bc4f52c075c150bb22aab08cb2326815712ae20cf1f257b9e6ce0725782e9590191b2055a45c4467c5e7d70c35b8a61a48a317022c298b612782203a820f2161844f6a6fea58ca9f230713c701aad2700bdc951fc9bb8f560db9e99f2849afefea6c366c982f3680dea24891c631a1032d9d884a5ad9a11fa8331be85f1c91c6de2b4143ab403b153d9dd714db314c683ca24cc45f86c2276058be32ca1cefd4116ba386069856c6128ca86a63fbf6c15e876d63f738f847a32166b1592c3307d9c6190c5c42b7ab756ccb394c7c26c28fcd158bfdac9f04c99e30254d500cd0da1b9f2b74823f14283a888bdff45ca218b89b9450fba868ea9b1a5858509137160db31aa292863ed216aef822123c294a825e26fa3adee0291ab37c1462c89a4981949bb764f4222b3527dfd8a715682d159ba380339971857272c7bd7442cb73739c450b58cbeb6936b8cb619654037856935376acab92026bbad18c512dec4e19671180599e01651f008c3a04007cf02535ad7608e1e9257fbb04e419976294702e84341531b95e1b20c2b152a4d849649113c69a8f379b5d72aa86e01a4c5202ab2e276712f1131c411d4072cb45147c562c60080c56eff7aa7d90c4dc293b01ba935e345b88faba62dca043d94c4a666786c35f9318a579a9b67e429144240d206612a6d802fdc24aadcb42b0db4251e06df92a67e632aa4a29000a77cb2fd2959f851288464c824872ae6a9fa1bb3a71d8879e303c51445956ec8ae49c4ae6ac4de2047edbf3c0b23a29b8b86b83cb24530b0d17739331292bab85868e4a9bcbb2b4d4514e52d9afbf66172ae560c08c7f9cfc0c98ea4ec9c785ffe76ab5098e9f3c5ead6a7759b529661b50e0368246c5afbbb9b876c8072c1c1ca63a4e6607fe4286fd2062614fcfb544fca36edf0785c37bb6f5fc33e2b9d9d03a0a6c2853cbbda86e7039b635d4cc850f494d42b240acb54ab2316791e9ef5b45f1d2b28f7e7a15a005f92400ce33db073d49b53871594a88fc45e0f94207b5f0f2dc +ciphertext: fecf9ab93b18fa40d1b385b0932aae91f8287348567fe0cec26bd6ccc57741ac3a23439efe62a433071d450e20818cab881f8ae2ff3157734d81c1a5296c7c75e0baae6501ff0631453303c2250dee03eb68f57ebca08aeab1a28ecc829ed08b67b78e248b54572d307bfb0e38c8708bb63da4e421e96381741a6a893c2ebd13982d26e223fbdd194bceeb430b8aa6b2b15e7fb3691cf4d5145023fadaa79e63558a9875d94614eacd3ff5e143dd9d93cbffcb6b6472ece3e56e6d7253fd2300b6863f19eb8e222be62a91386d21d9046b78ca2e04a38a5f028b657e26d222ada33f4ea5bcf62c191811f34beb57668f4057fe21509cc139b56ec566f8bb79157177f0680d4e5c861a3a5838233085cd80bb193ac3e06039f1fdd31eb5a025fa55c895feed3ee6bb484de762dfd614bd79f03f25fda91b05e74ff87c61132b1ad280f58e3a8ecdbb043c46d57369143d1b14ff04f689d1ae905ea93444994c09d02af7ddf59c9873c19d38ba6a66bfc1afd284e598091e5ffe6e6c3d3f0a3cf600843e2b2ce86ba6e08ca9f9fa5340472641ca84fdc047bc3c09a18e09b88f8b835707b036dc18a9ac1d03bec88950648f08cf55c924c7610fa604b686943f788611da45824f150f4e8128fc2b31a470ab59142a016a1fd7b95361ec265e3542924524754142ddc7b4feb75e849ae194888067257dd1f00c8e7f532fd06af3dd6d87191613a591707851c1758b81d41857e9a746324f9e5fb64d9ba81c33e970de17553050f639b94be0f5c4677e98514eece20663ddab722e72a6768312bcab6f5c36f1ea51f67905f433c5ecaf4da8a1af5581351d62b3dd46bfd5db9df29980ed7e522f48f4619ade16c4f0662366f0c0c9bc12e08d7510f80bdfe9577f93542341f0811de4aceb46c04b70322813d5e1ad9068c017bf2f769753195004b29c3cab038dba1b579c59e18fdc00026baf842b5a57b91821cece116b88685fe95bda154e2fbde8f49b288a2b50a6844fc2066e8be7c277623f1d8afb734baa94e7bd58013ade0aa6752307950f7a5f233e86369c75b9e34ba32360c52d1b58de44fe2945db78368c1137af9f9fee9c53ae99092fbfbde12e23bb7cf3cfda6c9ca09a203f6360bca6ff06afb3f040ee198318bd14a7dad4da9741253d7df92f186c801708aef95d53131704fb5382bfeef8c5be3071a1e606b9566632f065e3f2764a0c6ccc0c6e0f34d0b4648bce1cec4ae3d8d798a8c29effbd8d0636d09fc5d14b8245708eea3fe701249cece51ebcf50578844da1221624499fe6c3e36e91a12e1cfaf5b2e7c55706424a94be9b0c23e11f3196857e5009f915255abbc7b62770a9c498c8d7d53d0bf88450c563450fd54bbc9e3a731b0ab5c8015b829735a20b01d764892ba436acda91f9068af1042ffc82d1529d8be20bed87d43bc9e0071c2dfea7d57242eea011fcc43e6a96fae7fc018746473deb9dd9c413afdc90735c0a7660ba81cdfca11237c81afc46ea4eef1af1bd654033911da5e24270ae +result: pass +shared_secret: c514d4086428200e118c1c297ce5ed865d7452cd7770363961bbb834f56c564a + +# Official test vector 70, seed: "f68fc0314dea88f66afaa76e6c9b6804b13d4876924410d1f526fac59a62e26c560b125b1d0f8b461f1fc2e351effb4f" +private_key: 65f04f655904f41a6a88535638821638039eb85517c3899ba016172b8b3120b90e4717c51fd0a6a1d8cb799562e1901128756501bb00d4b695e11ccb335b6fc4537b236c4fba1885d89b2de48427a65357c31990d9955ae7323b30244a0f296a259c5deac728403481f0745f275401c9482ffcc3cca44832bfc0799164cbccab87bf04b813b32801f2ca915a9b35d60e34e95a74e660441a686c89397c915290821989286168b6ce76e485c946179dc484ce6bb94c9c375a899afc6932cb9876796bada211b849101aa4c5b837453cf89a0642c91721b01abef1a78ad28006e25762a65d23664c79c87cf79cbf4ee38070905e8b561a254394b9a4a3d40bc23ca6a2e98bafbdb067a34c7f450a2ec9c419c8816fb71ca46d177e148541d3ab6dad4b467ed7ab1cc94b57413c31880a418c56d851ceef706534871ddbdc8033679d82eaa69a4c4872233ec12ba28e42870e4a43c3ba3e0e36cf7cb740fceb3af481904007051c137d702c890d126f7e6b1d401bb4e81a4333d7c8ee5cb8636a984841c67817411862af5e3605fe838630a680c773725495812bfc4531106ab13b52c2d357b3139f9495c2d4e4a77a07518fac187185b2be2355dba0066d8a418bd7aa5038c6f0d4a3e5a074d409a15fe77ba7e176cbf2c7c20b10116737b6232851e688fb3279d060c8c24005a73780e7713255e6498fb50c056222f376cffebc723ab180d4eab9aee52a1e08cc2a73b90419a056e32d660c7717884f897809df5c42921871a1e59ce36aa74cbcbd9fa3069897a0a76113ab6818482548db03455a58b127dc5daa0cce8a5b5f3f10a678d04b68fb46fb6a94ef87161743b2364098a40128dc3181c551cebe151389431972498317b52d4f5332d6b74210d783d9c461453347f820acb6e4a3315a2496cc683590b08b0503b31b97688a1f6cc957c6c4724faa6a0b982859e961c808aea88862c750c6045b57f53963d83448b228847384754cd45dbbe015e6254c055163a60c02b41988cc2511fe70963c632f8180333c532109047c65ebad0aa56d3bd136efc88b6dd832bd810cebbb9ec40cb44754bf664773d5466ff0b86848314432e085761c3d81e2669ab41d9e3c1ee343ca24bca795eccfd6942dcc27170a74a02415bb732ba880a5cfa922b10e4973067109a3b210b02b691c8aa4a931252546a77b206098ba78f6e4781660a29a00ad98307b76cac825a534003154002977ba8150d3847fcb513120f43b2aea6788e5c17bfab456d7b96a1ca2d217b86ba5b87400cdee144717f5b34fa842778c0917200482c99571a36a133097365b7e36621f51ab88b0d0b3aad022f39b4ef3ec1cd0459ec3c80e56524173a2047b099c304c71e9db708ee55895dc1b30cc8fb1b1887f312d70c8b399944b4de4be1542a27bc0569674a4097288b9c60982149270d57d766c09a47045527ac8d710bb41f8c34edab551d0c022a627c2078edf078b0464b81b46057296b5ebb3571ea000a72065ad11b5cd36accd5628283554f38b6aa39bab97a171cf0cb3664842686abe589a9321d7b911b371ec5a31d13a4e91c8118d504360f668591163fdd233a6bc5e65341703cbaaa931293cbac5d0f16c77155f91195dda2b52c1bc4ff328c3732799ea0aa8ed4229e9a239e5b5c5a02c1ebe98a381dc56e1d4b56deacda3ac52b1088805476c01609a0a2373a4bca788227172c4431b000005d855ca059b4e554d3dd2103cbc7854a12cda368ce202873f5747450c4fd994898dac5926765536662c81581ab4db18e9763cd5a747659440c9a33eac713cf907ba0d5a875b90882de31b5df825f337b46451705658915630035724c127c9c4b48572951770241993f777145573bc70125d35f1b03a121d09ba4388889568ba109f04617360826ad48f2765944232b1cf636fdf3c39c40ab87b4b50bffc1019eb0fecc35cf7416ddb3146e275cc7ae209269a7330977e9dba9caf79c99e30b8880525caaa84401cbde7ccc0fda4b250b7a2a651b3afc123eff52eec55650029af651b2014f4669de319435b7dbedacc173c3dd1f3a8597b80c9c3869d7389398a2404e790c9463f2634cc7351bac9d74b62b73e7e54cbbb3ab235c7c1ce298c0c0369de33224ab7b03517856e43cef2d39f1d325d1e221998c53631d32a57a880f24476a7e89f8c1b2d1c49759c322e993cc7effb2bab738f2648bd8133208ef26ffcac76393714859ccce0515d4a7192ded6ae5e828be6653b05cacf0df1b4816a972592089ff88fa421a490ca13c6789639c909c4db18ee43a01989c51b6005ed2548ae24ac8cec10bda7649e6c9359c45bf0ea0d39f25bb1ab3c3b5b88cda24caa8c7c7106616ba05da6727896d2a895835c9b83654b358e0d4728fec8a150b39283e345f3e06b4680bc632009eb85adb811277926662e531db27b3ca60843a6370c304c1dd21a94aed90c3663c0948bc12f0a32af533866f5931d5c74423246c16aa4f01808d06a6d50444ef8a3171ac641e9417e2e025390caaff16c6703680951b1a0e5abceb8fca9830c9ce1aa08d5803280f31de3cabc923b5a1a7c4854d841729194d3685c03f975a72440b5fa01b11868a48bcb73794c83644d1d39b9664c432c7b3bc311703ec01d268a34a8a1b3dc79b9ae07b8cd133b7d4baba7f39b4088043e4a35fcd08a9ef141b78cb1f64841ebf894827bbe1ec47509817ba27cb42222272a00a633e1b2ab344bd3778e4a579ac7d64a32e2356b1822c1334fa0e6acb05798f63192ee20629106130a1ac330c6cf0200908fb37184740e5caa5ad44067ac7930f696bc9226235d212d71f57ffc2c8c185c1f3d717271022f2d256963dbac5c5a1404a71e3546695eb27d73221892b5bfef114d6f88415875c013f16e48d3cdb68c2000a39a45263504e0a7554386d68a4d3992c9f6196015066d3b8282e8d3398d2b5f62d7af54698418862db3a84286f142a8cb44be011e0f2594d161611cb335bdb018d9e58cc71a363b29439d54cc6b293af33b0dbbcb80c7797819a96c1316a783f60f987a3fbe1acf80f22f610037d17247122c4ae2b2214638205328c43fd4bebce93d47c02b84e1cdee7cb48805396c24410d71ced4805f36a105b05c6564ec3450654cc0a12e62f7c0da79496ff2bc97b7b4809aa30d577a2f3428e48220239b1b97d9278dd26d93d186628812fc697d961442879ab64b4ba0be3c46f5e55c13222058b407c1694979897ca0615e8de05d85d3532060076acafc8e0aadd8ca7406c7bb316abfde1bcdd1662d5680b483287bbd3e61a91839cca9e761429186176b7bc64034ad43f16f65e9d8128601c28b1def8d393a0db283229f7c7383152a814e7cefe8ef9d9768c473 +ciphertext: 1776384cc4bc09db580462b981e07705f1b7af05956b2942cd71a270a994b3c9ef525863d3ca86596788374eab881474d88e87e329652bed8e0eaacf44b90515f0f729a206aca3d6ce76eae6d3cda5caa6ddee0e530d841578529750e4d0fcdf5f122b9f921a5a53ce6442a733ef5ffd7ef4e52c3aae93aab7f33ae33f3eed2a3ffa5a4422c368dc210ac246b0d73dcef478be9e15867ef752fdcd1db52b733236bc9ceb8660679f9e53f62c670c68d3effd8013649bbf5685a40a1199de8baa84e701eb4a6de909230f41946c9e08e7d9713e209899f0710228bd67b4fa66950d974f5cc4bdaa1c826030a7273787c1e1717639d0ebaffcaee389afb6f044bef662da9b6b4347b0b0aef9777f5324979e660ec40d43e0a17e5bc2090aa0bf1008ff02a129d3b1210614e99f607b521767c5038b138c7d188543297c405df6e10d618d41b8cd3a9a935e048233b6af27db097721ca8999d8b12602c0aa21716c25e09d1a1b6eb4e2e4a82fc680a1d8ff2fdccca10ce2e38ab36c48f46a5b419cae0bfa00a0a153015e9c908d8439b4accd8a6b6264eece46e97b507644c200e7f985cd6c3a0a024aa0bd18b44059ad74a8d6a1462cc9c9ddc532a803b251e73775435689f80d3f79690aded41b83d8f0ddaeaf4b1a85c1bcde9e17cd1c6635272c167ffdf4272ef8d6552afb7b54500426b2f612df941d540e596038bdb21d8a2188dbdc89a2a449a2774d1f0b21b8db290e96ce027c1f0c11a8484f857a069ef77e6b9fbe0ce163b4dfec7a11e49031d69a37b516b72ea4e1ce67ce493b8c052c30517ad79a540a0c0e86093663e7a4a4641d9d291b929c59c4efc47efb19fd7e0c3b6f2c1fbb9449fc18a9eedf70f71b70f92f8369f7624a2666ec7f26792b34b79c659f1bce8d9f86776401730ae70e7d4459f0e8d7e1afa9a1c41019d536f0e8585ce4f2e7c42eb34223607e9d8afe66707475b6a1e5e532344d8aff98d5e48b782510f064768d76f4e99f6bf716df363c5e2dfd724c78e5ab362e2d8dd3a7fe3b35410b25f6071cbecb3513fcf755312fd082ce57b1ebcbdfa6fff754a9f7662c115334325cfb37d21ccf5a096a221138e61e1adcc4548a7eed9b50d3e267d1bc6eb972e678b4c5f0fe3419f663e0d4525bb0bb5859de22550225f90a70f76fdafd551b5466d289a8fdd3f338d1aca2621157aef4c64ca9f256a8f88415a6293933672ec2bde631bc1723a362edc7aabe695ebe88d38de01f0eb15bf582eaff139b8812fdb3c7abdaa0f933b6724ab3fa77fc4358456c0ce509c0b98cadf2b9e8de3c9552d363495389a9b898b2b8d5fc97fb751ef087d69c8a7fc32b62d5ec581ee625cf4183921bc62685e976d41d9ccada44570d8919132114717ad1a119dda21664a955a3f355cbc9879030142b418329b39a0f392205c811d4baba6301d829d312f8a4cde5fa12052c02a4c75a706b8f317f963f01abe5d27ee0470afa619d97d7fb5b3b0669bd08b901bd9fb56fd4a5656d8d2cfde1d116676bd8 +result: pass +shared_secret: a175feba4c1bab576085bb12683d2bc44e98c75f543cee714c75391c559450ce + +# Official test vector 71, seed: "a229218b0d51f58d915df549901548fb0722f352c7470900e7e4d8399205764a319bbddbd06c00e8c5932722ee5a404d" +private_key: 000d8a738101a329832189bfaffb213cc5789003528b06754014cb91a09b7625359b2cbe463b356e298c95a6a24646ad6114900034c83f19599bd0173846b93153aaf6f9c1e1e11d41692bf5146a48810aa89604bc2b09b32230c6c44f5a0a0086b7c688008702517b4d807bc34b8a23e968a8316df5207f2788975f458cb0db5a37c80bb2823270a3130c18bcf793147ee0a5b63a499ff28e3ae290974ba44e8730f4e56018073e0ed54924e38865bc076a809862470525d5c32b74c81d4cb95278705f01b6c6d098b951a7eed095ef386eb8d47f0d7984102872706b352c12119adc1fde40259f5450c36c4327d31f09eb589281a590f1131494b50264719a740c6d0b1c8f9aa6d281b8eda923308b02dfdbb7c2451bf80a769c683f2fc02822838f6ae1cea8d81ac91c53f53041952b82aefc4122b24cc15b3a8cc2450860869fe622036512344132701b8043b387d37986482318c134af38014cc075756838415e1a461cf0313b4907ee6753ad625ef593c99fc70b88587095e66c03044af109bcef59a3caca13e027c2cf3b350d28c1610b9bee0718ee44c223ab522ae57b532526f003345440cfedd463a0fb1ac60a2c6bfc37c7eba6a7667475d278c3a4b7c486b68f2157e9bb7646045a7ab452cde7539c755e5fe390f0174153f1531d5737da4383202103f6e01339255a04d04c83fa5119fa0f0c15c2c2d50e41d9be98c66703903c73a05680f6c454676916d1c03da6bb45482c588c6cbe57ceeef924caec94fbd096cbd13528770995bc50d0bc02b24959f4d61de3bb6dd7fa1a47db7856d53c7623897a24acae7473439217d52a2ef34a3a6c793017d6b22a3845f8087589ac311d00be84197a8bd6561fcb8472924af6547cbc78395721c75538278579469cf38553e4066027a43d9584508c7fe8f87a7f122b484a1cb922b62609cfb48c7f3bab00fd709097c87f5ef401cb9520b55cb021211b23131b2ac07ee9da735b90a37a84747a26a0f0c7b28672bb4d3cc6e0f1c3ee1c418dcb26a663519907354d2bc106fb72a1607a0905886e292d3a77716590ca57b6459ee647906401e8b268d6e782f904be442858fde72513318c06d0715405229adb7632b5bb2e9923d4fb49a5f7b995ec7b2c971b0be3aedb622cbfc344d9c9ab6536b323a68a0ec97b5bb491fbb0ac20f48873443707da5b82d85f61c98f06626761a20436f20dd1e66d5e452874e9b1c6947ed270caf85a9be3d8250e539451f61b28014144bc184e7ab57fd496a1e3a9f2fc2bafb02cd837ac91f61a3ec39e9892293a6a2be5a91739c64418a173e02870f4845d3f56ae573c5daa9387f78156c7d42d2a2c7a051964127bad8b728fad010ff0944dd6c2807b748d62492494b25bd32261115014d91baefb38a3fa06070646c71e5c6e07e64aed181ec46bc0fc4284630a038813834ce3467a0b4b615496b80681149262b833247cfa8f4b4c364833b074a467eb1623fe475aa1eb6734774995e99745d40c5c149fc91264b3149ddc2318b149c45944370cc222bad6759454cc4ae66d30091297d6468f8734dcd43e3f078fa0955d69c90e0f97ca3de54b2f38005e8296c52a27e51a1cbb69bc1c3cad697588a4004634fc1c77215f0677879aab3e63b51ae7436c5b47370e226eb4ac15dd0281ec65c56b83b60ac42de17b1374d1680b76460e294d841c1062638cc003d043a26307c08025a594fa3676df03c87789a4499575948b2574f6931673936e971f2c79598a1b7b35d28103252b4df98c47f6afa057bd87b1cc516722fd72bae0f437479c1ec6f68087453e23fb4381e5930e5a19fc9a267565b1dfc7aab9c13441101e57d9a4a454a6d1249c3cdba091113d0f1b257d0986f23b4fceb35c95ab05e2911dfb2899398808582a6b1aa9950eaa9c87c8bdae7372d46c2852e85c629c25e05a169900b24cfc0a68661b6d44c74c658ab8c00c756861be79272339a60828b9f0b8a325850b41950f97849dece714c494ba9bb09b74ac16138251363b52dc166f220623982c19ef565f80583b84d0b91267ba98b63afa31160f65961181951019419fc0627cc48de9d6b2c689969548641009cdc56b02a140bbc4a995a7f2593e0213cdd2cadbccbca41947fc8033baa1754a8815ad52cc31940451f8a62dd6b39e22a6b0db8a0f953c6cbca43f9c1285315f59ab9980ebbf57c1457dd8361da04e0eda771cdb37a6a54c6a47719790976a957978e198446320aaa840e0f1c076260e75e9a92980891aa6245e003f1fd6363d0b6e5c73b476b77ef867a60b225a99a763d0ea80a4c61739875bce5c0f361322450c93040b4d6c08120827b8026ace0ec73302fb6824367ac89a0e7df45b850618612ace284c2da4421689d8c7034113f9a1b2342736f5f11cfdd7ac7f8468075a4a2d7960dfba9e264514a8d7c6d11c660cec1efe33c04b4681dcb31fbea47247bc83c581b174b0cedcf0bd0b7b622126cbe323986b75a407e416fc0032fa2398e504967ed021e993a955713a76365ada810f9bec7ad1a6929a466f08113cfd6919e014085d4148be060ebc014fb1fa3a1ff70a3ad94baac7be6c96bc0f28a021e39cc6bb8a6e16312255880a84778cbca55f4173b2070d527357cac69c22587208496af1715711f76d5c185807a13b2c791b91f54b23ac8b66b71b3e211e55180fe7a1bb2bba7f97da8f82734ef777b7d2653e66e814ed7871da35c95761a88a611bc383add9a329706212b9780ef5d53e933c99318ac47e26859f507bb50597c3ab1a252c77d22a817b402b80a63532f21a0f296c40bb8021732fa9da01bc60bc662a0754914462689de756a397e2384c2372130c5a6f05ae6c8b81ebc22125830f04d3740d2638d031a21f1653c4f664cd182b11887f4784c27954984af251c923b5c2ca4f1777cb3eeb7a13c351c07c4f5562b4a8a477fd348bcb9b8e6bec787c2340c02c0dcb236fe8d7c6ec8bc9d156b89bfbcbf4d0599838263ad5b90fc155051137d6800c898c8a50b82a4e3940bbd3bcde2013889bc4f3a7022d7c49370ac8d826a3aee946b79897bea8512d8b899a8c17e439760b58859393a5c264b5f1549940914fe278a40b6c9a8304775ba30c8ee4cf234ac56862ca2e935691e426923973c32b4f2408cf63c99d7b2c5f0c5aadbbb9cb98b53f787431fa73542c5569e5f5ccf0e4a868cac6529bbde42a5f1881ce0a729e6a531b0c401d4979a7425baa8b0392a8ca9374323ddf2794c237e38e45a43a5a34cca2875d19217ce7547d2eba6bca38635cec71b814aaac223f748d13158dbe8eb902d9125fdc22202c4d59251cbcb6d75eac6c76ced1b0a025b40a55440712ad8424672e761e9bc400d63812006f +ciphertext: 8ad5e238206e4068fe9be1a92e9ac82c41d247e864cf81e6006d6f3cbf6d7be8116cd5afc3764a34c2d8be6335745fbcdccc3753d787df7963565f8aa09faa473c3a31c86757e5747e5a309150ac618d96dcead932a7ab3bab72c6e2ce24069787052e998de0bc8f43ad84a48717f36e3cb6229839004f07f6c219375aa17888add3b069ca65d4b83b05eb9e83e2c2a053142dafaa26fea7e995f126079d20d1393df571160651a3602cd56422486b4dcb6ad4bb752eaee6af42128c17fcf72718c527d08817f6b2406ec25d8c86cb83ff644c3bc4fc9400d4f5f6b6c43538bfbb16033eb37428592b7c911139561872ecc14e0902c34dc540b3f232a2fb91f4b68cfe3f901f96e355c6ba7126617a8c8d231e58372912c876f8ddd6e1ffdb62934a96e9feb82babb4c3e4312fb6dd64550dadde1c3c82b42f129e6825464552281810809747f64887e7ae70c56d410e4b4349942be418f7e3ad2d85afceba02107ad44b7bd7f8505c50bd259e0bf20b8113f7eb6a209f2b97154b0198e579f66784fedbd5e100389c8e271ec01c0ddf5680c536d12599eda6196949df9aa66116d71014d79d3a632ac09aac8bd04cd07b2775cac35d158ce012a6f157265c06721ede539be6c87b6ca44e41eedf50bb79d54d3c77179ae8734941daeb930a299808d5c336bc954e0fc7341681c3c2c7a17f21eabeedab5febd906cf3c77f52387fab180a24799b9f4438810933d726a990cc0307e6f5ef94e6e7d7d074b7804d944c2f9c341e6d925ad96baaf83f4550fb30a89591cd8e66496dc59eb24405aa518337fafed03ccba8a0925be546672978d4e49f068e9fd6216cc9990ae4e7c785ae005409dd512d766dcbc8169412841521ad9a7cf48ad23c075cc27eaab6b62ca3f0a27f6583f1b6ef541b6a2035eac34b1ec3cac912d2dbe1daa6a5e7165b9093a9b8f2c0a3092af78305dbe137176dfad210382037a7233aedcd93a4bcf0b068406c0fa618cb7b4e2647ef019757fc412eb0b7f7e8b454ca0d46765928d2f7a468f8d4643553483ee671c9476ac712c9aef32e357867b95e5edfcb6d93f013e4b7d764dbd042e5133d5d5b083d9704872f841cecac31c46a4394998678d48e28d725d27d36f7e6130ea21ef6f825a2a3f45edae4b773a7b1afb981b24dfe59c181d6f3568db716a58128e546c16e42e769a62a5fc785b3be87aae4104c9737ad0aa5853ae9ce38014c51c31c0c404a0b67c7ba501766cf864f0c38eacb4701c0b658546d38b32726bc1e1649ea02ad05f4cf5c4fefe235e58e3e8ac3984a11974fbf0d440399e9aff212fec6334d5a1db23a63b0cd46157c7aeb39cb9c99be81efbedca1ce45e655ce37c3f10938904e5aaa6a144e5e2d838aa54a9a54c3e695e2171c1a512b423f94183eb3c28545ade0558697e3e0fa12ef1c5a15b123aa4d7c14c8d6fb60e5b508c083a5f93a35fbc9579f31d1968f4a9248564ecf4cf9ab4ab8eb016a82e3aefcbde9202eaed915519e346c25f04424d5f262f436b +result: pass +shared_secret: 9781578191ebf49b162aa768d093a332b9c849c11e240187cec2ee969d4b3860 + +# Official test vector 72, seed: "6960f21c7350dcf41b4770c551dc8692d8ba2c0b6e162c589166ff22e7a1ac0f94c2f48504a5f7eb0da094df427bc98a" +private_key: 4b390d378cbd58818696f39433e9a34a46109fe98b4e806a306119e2110a5ad3993f7646213c0b27dca918e624eb6090930baec770a838a501e8979c1e210f71dc4674999cb8b92cf0ab1011aa67ce5039446957be38a16dd683795621fde5ac77e94c07572fb2d95cd0169803db5698e47a6ef3c3b11766f095496ae846870a68d34b9032527902760ca97b913c42490486063f0ab27afa8b92b33d88fb6653dc6ffb3b55b3a9b5d3a9b5f89916a727439561afd8e172f5313ffebab7587649d77563df970a4030aca239b225c78177058c9ea3cc388a3f5f2732e1dc00c11b936e65833cc90f5597266e29846ba70ae0239820e47426b8a092792334f390e399469ef13ff2301f9ac94eb42386ff882a3be8ba23f473ebb271ab6c52e5b26c5eda203c0b6418250c8e2216285cc78c70a386f1935ec41740a114f5a32ef703b4a4540143165337f5bcb42743e574b93d62ae23081e2dd7c51e923ff1e25f4734395ad0ae016a6c45f8096bf2aad933027d1594d98175c91143e320c3122bcf16f10f7ebb251101882aeb94d6b8cf893b7c05373cc9bb3ee58b148d1124183c05c116b6c178a2c7756700e15b8108144f5024c9ca04a3dc2e476591a7c79970274f112c210d00c198860202a408453985a3d9b5488bc61f4c8c93741e6e733e1358605c6a2e30d7075008cd5297a5ef5a18081143d5907d88284ff284804b276a193352ad3ba5463383a024908fc05578d0521d57bbf7d03cecaa93ea1326582307725c62dc79b7e9b34bacd94ba9608463c72f68dc0eeef10bc3c52e9f295a65f460ad368092d3bbcb2c9f9e1b2783737e1c3b0ec0442aa7897ffc75471b18730399257f019fe5d73afbcca9b83932c94360612b297f3a84efe90278940e98ea2e746857ac73adedb6b4226667dc779285c6987ceb03ec14a00302444ddc02e76aa6d95392053b176258546fd0959c8a6d969cacbb809115b339d6a517578502a46b833f84712dfc01b7c35776595ad656059c4cbe72e637ca5c95572952fbc772463042d9ecc194f93c8b577a220116e7e58bbe5276a90324c5492dbe3781b623585a22a77b2cca935009eac03ff1947fc00562f1561457f0220a764b7d0c06ae3a4cab90276581445ad7bb07c817f4e3a05613541967388c3a1a784642c9952e8376c57d82a16bc98acb908521a366adf18dd95569af860994858236f5bdc7ab9655a95d28a956049c7365c84c34f33ab305a35fe3117a563b1947658988650e3c65a6551660650b33217295e79fad0bb567054b2c0c1fe5e3ca560b3a565a58d9054fcb171afeec538a1c01781870b19c63a49243fcd9b384635aff5b1642036220f15c3414a9c2f82da81b6e625c1944109a6a1ac06a07a9b8c85f86c043bbf62af18c05c5eb3bbbb3be723a8e04b9a1f875c0d645412eb8c51fb1c305c2447628c2f01b3b6a6a89d8c849f48832f7a9662b8c476bc426f54b509a8037a52023a5d02fd10394cee11aa1d5464ac41ce6961174a528e2e3677032ce03b79ce5620a3dfb3291e7bca9c249c27232bb535db78918c2a56303090e98c1503d211d95221e278764479a1eacd92e5c50b9d1a3aa9c547194275630cb7644bb5dbafcc65109cd59f7084e05cfabe4515255ccb724b3388239ce1ba8c631c1e8c0b444baaa6ac481db8b4d670ab65ca27f33a92a11c48f6ac038f0914637b749d8b962c00ac8ab0c019c92960ec3817f34840aa7b63b19826a12234a81c9faa8995d28c4d4c44a0fd2c51720cacc8751bf6c31caf045a79c6f9b15c2d406c11fc3b5df6638e1b83164175dca5a1260a88c74b4c2432a9b76c39d43597ce2e3ad1797c25f967868b66bcee9b6a4d1b53fd09540220c7ca75943c52e3d4a124453499c681c1fba4dfe80919bd9467bcc0ab34b7db6012b18b3cc4c679e325b82518baf5123c88786745c4a0600a302a2a367b717c3dcb4c32aeb4770fc93e0213aa54b2c6a37a326f121d907278203724ceb6cad8717fa3a2106217864274e6220061620052799ba22675db36863b2a447e5a62b3d2511ffc83bb34cab6cf7356a27c29798c00cb32bbe1023fe1221313cc7ad59144fbb98d0182bf0183b44990da81016e2995206f2b0af19c8e21b1afe8c98d608c0c7e52075137caf22c69dec4e0f1763c8bba263898b30946663d84b5e0808e6ab9a6df970d2568303704d4c651c912b7297a89534e324fae62628580becc3a2051cca9d5757d5e53ff8fc242e42b2adb06cb2547296ec8431fa6eb8f7384fa559f9284d528761f9a23e85a0bbb3e57b7a876d2d4934d33838906606e6da9a311c15cba30f39d05236892462824bc4a4b4d6b343e3594fd9d68972d99eb26538f9eb1fa7f0718aabcd5dfa5a670b0f8cd595ef7a082abb518fa34891a4ade983877a333e956bbec9a82a19650866981b8b8c406e22abd784aac085b6ea553e30409ed6b39b4f367ae45b9fe109c6ecb51f23d2a755caa347aa95e656cf45a15e9438b61031717b3551e9e3020ccc330f254e82d89b5e4839a9f8ae267b9365aa228786a371859d3847ae68713df98768a1c792adba39bd2359198224376cb9c011777efc4aae1c3d179583ab0952bcb5b1e8577a5c476189d3301bf87fd8a1163b81bdb4a8368934ba4867ae4dd03d40c2cb5f974a5c36a8d699546d831095e7b354490838a40900521da4a00d2fd7117e1060dfd363593ac11bd31ffcc08c1eb8806f249719751ea3eb328d3a36590919c2317429d0486266968cbc6973d483015b77eec543b7f971523589655732bdd1783365761d937266a420ef3b849a630ab5a4003ff09c116c1037f4576c58adecb5a5e0899892854b8971c9b76685164a14bc5c8b9bf212c6c7ab15b35e25a586e465ac05f3911da7063208c3df46923622402559ca963a39f003ac0334ab19d02ed58c990ad983318b33429acdc637a8393082684c517b75194506bbeb9686136a3c8a284c852ca747fb709d4533d133b5798b50c1e59f9e99781fca9f447340705c6cb7e2231e257f95d681805b8cdcf3147804405f30b4ee63c1aa9c367eabc3fc606306616eefe91026507780e6339b209cfb7a227596957b136e1cbbce15fb9a6fd9bc798c40f0ccb7651b150d281d78b3508939ba836ab719cc19c61860bd3c624827ac26639c05a39c88a1873204175bf297561723a16375dba51947b83e46e84899377411b2bf8b743cf8dc23fd2ca07d11aeec1990c42a7321ac6f01cd866f8719ef21bcc0e02346fc5d8ba3d3e7f1fcb52d37551212d647af97825a77f2f4b6a45ec1a579f9f83e89c025d8d6876db26874f38348604293273b38bddc18488024ec90e62a4110129a42a16d2a93c45439888e76008604c6 +ciphertext: 29172b06b0849e37c10c1a8a719b8111a2e5f7cd0b195e949d0f664220f0fece380d03ff20aae2d1f4403a795910536638f7de4b502d497bdca8386b51734a05dc23c64e5970ae9bb57963088669eb327c4238ba2cfaec2d177e5b199b82ad664ea184db6ecd35ee97f0a54f2f933f9a04383188671497a5592f4b84a8fa3e5700d28138b9d3c2c91d104a73037cf3ac5468460ab1df7de05a90e0fa6b4753059b5287dff997f0894825d3766176c2b9fdf767ba065e45e74b6c706e47459433140ac59663109de28defb54d4752147623f5621c3b48fc4368cee7253c128140d4b1dbd8afdf87b9d58454062b6b3262018e37ccbad6bf27f4f947a9711ced9a45644d3ba3b9d670324c639c9dbfe69c2d783327bf7a99aec3730057e1e1547818c67b0e96fd48d024590db6cce338b32b06c9ccf81ed967e2728306cd616d44884a2e079af7058a4eef82c48214e028bcda3b44ef696c1e08e441f28728e503465a138dd7fbbde562ed6bcee8f5a3742d23aa8c5ef32179a1c44bbe41fd153ad2aa57eabaad87fb0e022aaf3b19b1f3a649079b74e7a61e32128506160e7b5cbd31d56673764bff84aa46b99cf1aa3eda04191a769d5ef2d569fa4144f51cfb9c02cff06495f95ab8ed192fbe9b363180bf90a52c752f70f4a587381775544635c5a574244ec8a88db3b86ca46f30a481ae4179415d234596e2cd24ab966fbb670e9255eb1bd3c261592856fd9ce541be9a3b06e157c5e4e165cf91008c51d11ebb064de31e3f894d6d4d46caa0592df5dc0c236b546479119c842d3d52deb75f966a5d4050e01f7b16cf6b93fc8731e5055325ffda000114eb7cb6d7916088fbbb8ecdf4ad8cd229ff036b2a6a400ea1b375c576547cbb0ab91b8f6f4c71555836985b3cc979ff56938d9863c4b0b75b011ce70c1a60b77b67988237a2a6b6bbfb180d36981f70eee891b6c00ab1261e7a0db824981b5450b09cd96868c611f40a6e5ce6e12a31934e56fa334c3dab7515e7c185575b2798e2dc9c50273dac8bf1da90fd8d8d5272e5dd24b87f57bf47ab79c8094fca322e50fe3425b0c570764d95a7690785b7ef62c7f4d6154a898955bd19c808a3222c1ecf67f633267ff61e8ba97bb1dc0b648a1161dc2499beb5db7bd621f263884248b98b6fcc3d9bf3c4c4ea5a3f0fdb33534c15d84278f8b5f1d2e98661623ca1cf9cde7b8e834431ca82c4cf5fc2be458a1abbae90ae6802e6adbf6085ebfe11c1622ebbf2af755d8748478bdf1eca4059ade7275718a4df81fa74810ece57e38f10bcc954be61720da461f86f4ce2f3771d386d836bc7c720255dbf7aa6455170300e7ebc2773dd996859b53757343045178c7893aa36e4f231ab469af10cee8cd17b612c6347755b0e6d3a6aa451b34df9349228eb5c76e0ee3ab37633917a4c20554b2940fcfd041ad79c19634d9626ac3411c76e74756da3109062f04af2430de6301da1734ace93717b51b2eb1545d275d442edfa35ed905eb1a99dbcb468bfc3e5048120 +result: pass +shared_secret: 515dc87c21e6b134a577e4eeccf43a982ba7eac1224d701cf099ad07fee77cb7 + +# Official test vector 73, seed: "53df46012cad4a745b7a3c06e18ca95e0b839fd8161e3025749a0887549eb0ed6a44eeea08bd6060d6509dbf7e9dc864" +private_key: 5e49938e23a5c65c89d4c40917379cd2a5b5d32881a6d68c28b48a2e356de63896bad68acd4a474cfc288113afb2418173ac4b1c3255136c73a00c7128b59a50042bf4a3aef9015fdf0108b01cb701d2bf6597637227604841651e3a964326a23b038d0af855f307413236a3ef95b4433a0164ba6bb27a858ed9b22a31234480b7e559ae9194aee9945dad45b0a5e85bb486962cb19d8b52c7d4b473f5f566f2779ccd79739649665820bc0e8307457b9af5844870ca580de2394fb092edf512310b970f5377fb80118fda8517b5b16e212447e16e3a5a5de7587ff3b271533803b9282901192fb20cb298d666cea3c5386bc658c5c1de9673857a3091a413cc69b2c8e46382ac97a13a9f31c1a47f0b6f898a84dc0278bab1a7863746c03576231b59ad2610e79a933661b6f23c63ed9404de06791c087f42abb7c088ad15c54ab23c78305826cbf263d441bf62e23180a79ae14a1a1fb31e115b02a974ca7025ad0c634067d4082a835bd274a44a218fa4642caaf1c4d108570c13bc3137468a6037a0709f0c0069443c1e7fb2822a282d08b030539628448c5b0396cdb76c89ba0c13f8ab2902d44190a0342ed5acc88b72c3baaf18880561f95196f56889f1854b4cc348d6019f4a5036123c1650332fe47115105a085c2591c952b35289efaa90d55c6c888868c20075291435175c086edc5d07b01e4441b8b3867b8a93cc9ed07ad71b387ea3363064194363b77fd106ca5c13f6b585980664b2a036b730ca50610798e3b14d176e28066719581821272157d81ea550992bd76875c22736d7163b01b6e353cdfe05b63bf5ae02a68c3e105731d8af5dd90981a02715e061f8d3b94448115247bd23137cfc165dcd4c26d065a28b84cbdf4b17b1a9a27046898c529ba42217502abbafd68bf6990d2d1064a7aabd89075891678e2610120feca2ce72c0e1d8be55f4c0ebf7cb565b492d9a2370e93482201f25b5ad667b0b90fb31dc8024e4123be6733217488788980f5216116a702bd8c1ca18d0b419b785961424f6289f7a55a211615398575755b8535fb0aba1491f00517863c41f4fa1871dab1ba42599e8e54e8f4c6a54e20f5125c595e2099439b0402794b9fa3a632b4c789c9cd4613776218fcf066c22e4b12dbc90ff0b4d08cb7032c07603557ef6dbceedabca671b7b07a2cd1df6a89ea6a7dba65e145b9515068a15e7053d5a4b1323cb75a8ad0d6ba3885a7e77460cf19637c1b6c330725588091ec1f158484c6ebfe43b4e01cb5424bce33758ee10a438c0621c9217979c958ae89591f69d54c4a71719cd4aa76da6ac4ee4b472afe45412718e65a5807d452491e1a0788a570bb3723d438362f50c2b26b19dc696f492452ad13501c3bfc81766dccb5034ccc29d4c152499000aa458c961aa17d74cb5819a84135cbf8181832748917c951a468fe70c08c1333de71b64b7ab158255c20aa7b2ca8a912f898574568e27691f8b517425c1be2bf183401cc2afe08fa65a2a1135a5dfb9a86dd3985351b61de0228c112a35a889eab8a57273258a471551e15ad23328c6d00a3f78a1cb9c836e304ffec75ee1f0927962b642ec0694e50963a246d97a240639a611c414e180a227ab843cd49d4970af3b68c255512920773abae9a2e402b154b8159b63b4885736e63632313b2f99db66fd4307d411a66871c8ec859807205535d907c3c6541b283824861738acce081a14e8047a63cba2f42c71b23157c85a7763d3cebfe93aa7fa0a083284ecb7c4dc16c8119b5d90546a461a5b744b1084f120bee2b548801c381a9d561bb0c5c35336601d1cdc310a610c8df78de62477a6f26dba6038ad04371913b831c326c0537cae530469292ce41c40a81b92a5c04d69eb0303b4b38a5cc45fd2b0ee90cff0b81474d0406c8b34b34c1efb596a704ca4893949614762a30c54846023dc3a345268ce55c0be97139f5f733664a58b67656ea211a87de01f9cd902a9295355d13a15bc044fdc77c4c53f671a1438e283371b5db5f82fb0d789e877b6820771f0ebc64da864a01caff73c4a42b5416bb043e29c7b2574c6e214a352f4401d786b4d5351a2559b87ab00ba84511bac1a099b1b33e8cd45da078d447b23326574379dd3d32ddb22c6a4037fda719fb104c85f0264ba4a9ed0287a31a2af6d58291676a37c434ecb234e4e1c648fa0760da57abe45703e677fefd03687415132d03252291f02f3901d20427904511f9c11a7f07041302033054605e97fb719a2f70648a2c30a0b42899b195ea8e6cc96610943c3276698a34a61893ba8770c69cd55f1bc0f00ca0e04177d0469c4833fcc23a6ed339acaa91b6e081692340f53cac66af5a6bcc2391729ce4e1c88d5c2610b00454fa21e8faa6487022f19f2c81d5452d5170255108beaf3979ff9abc2e04c8e3669c6aab80e2b6464644ae2189c81fc92d50cc56039cf5de2325ae5163a1b63652222aab35e17430d16477537f867ba4ca0e9b1c83c61a562c6822e61bb1450426e9716a77c1934ab17ec69563b8299e6ab371d996849c8cf7a84ca1a9bb654e1ab20a81d65314595a52ba18076f8712532a81b00e19e8734968f87c03fa4763208862d9a3ca648582482bf0d5441fdb7c84ab237d9f8628ed2001a501339682f9b8aaf6606344b95342fa62e782c1d9560b6ad55aa332c1fd533a74d026a9c9757f0e91bfc96545d0b6477f31f95840ff0a4127b16c32b635471480523f93017577513ea96159ac60be179d3a09c5ccb6df44174de866cd7548339d314d160718f262edf32382915197bc2ac6e3a4f77229e22dacbdfecbe3f4b72ac6bc9d9354e7ed2c31ce7acd7f3a2c8b9abeec00613b1600c8992376b73f8c245ac9841ea06409454b48d8c3a152bb8d6168a3fa6423373651caa7aecf0a5971641bd66897e5991e793343b5190bac3107eeaabc71bc34788a345bcb9ad8a45a50a1dbdb1846bb76205b06e8aeb692b4200a596524954963f01c946131704f6b181d7781772ca6365824f6c6c22a1af3328a2c8978ea8d7c38f6a00f7a6b3a50c2507f103f72420bdf98dc19aace30b792851142d8b43319c93ccfa966d71cff9352f25fca9e8a3064cd96e42e9a2959c128fd532902419b81972838532cdfc08f34541459cc68955c9c2a431ba5126c9bc08039ca45533ad8108beba49bf8d56bd44433fe12a6c55c41f3cc20560b28cf050cc1f195c5e817d23d95e105a13555923cc21b13c9e46d34182974451bd97b6a3da440de6e5bbed681d6eea2c6822b361019afc8517ab7585926764ec7acff3c747479e837831429b97b7cf49ac3763bd9ebbe0a3729672816f3eba84c9638a79676eeac0f22c8a48e0c5d50a26ff0844c66b99 +ciphertext: 30a4b1190e0b9a5cdf304ab06e4654e9c02c055c4b487884c6c77caa6fcd02c4a01869738f01423ee82176d321a553889d4659dfa53bac9213386dd87e00d0ed8c763d73a4909b223922dc9bf600a30270c35aaeb8d6e5e21f47e893c28380f70b4f19114944e7413f657927314114915c0b7bf7dc289a21f1c6c9b3079342364899565b604348a97aa5cabce2570944d128d12dacbfe2dfe3b17146892f1956f0cbd14edd3d65531aacf5deb667c48c5c9b76f83238c49a750552bc4740ae517c6b82fd2444d9430f3ad1e4790f609db80727cc4db6925da917789a83989883847f3901f428d93ced25ffffa87e4b9940bef4c3bdf2247d7c17fe4227d8c3b5f9c3d99edb5f6bfc6c91bfacde430d0ae2554f82e0b53a67a8822deec1d5acd054af2869b992492726f2a7c7d7b9ea0505153d878b301db69919f39640e3edc5222bc98c68b844e7454fdc6f3bccc956843919a428b2c882675820569381bbcc03d9cb932a1fd616a0d593c8aa9c4119bdbd9b1dcb046ece8a011a91056a11d2b84321df7fcbbed5cd25a236668e5b7fe2adce9e82a9cc0039501e57826c46c37177c8dc057d74b190de9bc09bf2dd47a679adcc2a5ff518abf5c8b33b95e95445c778fa97e5dde581933a71bc31884c5b515dbec13c4672d3a5f04d7930f55512e951aa8106115ad291ca9eee526513ed9872b746f3057a2d0dd6255aaf3c16a32b8de76058c79001f7cd23dcac80fb2561eaab3de336d913802e968cccda34cec120f0721a9aaa2da3c36c1e372c382fb194889c41d680f6e1faff0c1ce8627489a693d5bded36acd30817aaf860c7691569b6549c9951e06910918b894317df93856d4a13bb52646e44a3ddccd04d1d9bb5c472d11134544b2b2bdb103706e7a858a559f2e9f10a8b3981f8f858705822d4343a2aac48d9c534fc211be40ca907e1c02271377e9c544e6036234a09387b457d4c5749c80360a403aadd35ba28999aa679a4009a861ae782a614918c455959329d2bb1d91d7503f2dcf0cdd4d16de8188ba669f1dab8514d6ea80f9e7ce3e3e556d3abaff2fb2f956b081e8ae1bd62534b0783f74c7d7797481d2687427b41579fed7f2194ac898300bcbd817270bdd5b06ce0bbdaeebf60f6a308d3dff2e74e521453752974ac951aae7337378c87ef11028ab476576aadd3efe613118c9e537005969676d4cf2b8b84bbf785a7ab61ccbf29586f2c4b0c3d3a4be23aa92af35df92dd23e8b8806acde4bc187879d29444e2b1ef31712ff714072f83b028d3f2cf1aaec3020865401245970f6391a45fade62f7f22920b8729428842e21008262c091178b84c3acfa870b43ba47f8f85088fdd326d8f4de12ea21c19f8b5fdd7df0988b43511ec21a9265c3a23ae79a3938d08404cd8105e3b039cfe5714e7060e6444c77296393c6bc88c3df42c0d644781be5f232479cbc5a736e5d403b190cd6c8d3f472255c02a7ff0505afb9942f6d346fd7eb717f5beada57293e3ef9282ad10ae9a3cdc3b04030b3 +result: pass +shared_secret: edc2c0314c7c5b2b071b85e373c06b31fa54dc499168d4b43b15f1d05b8b7ea9 + +# Official test vector 74, seed: "deb963f8b1d8fbdf499d564ba8d2d47915bb402da02f17031b37b4039a842afb9b7e48f37200605992bd2429427a7a4e" +private_key: b8f488e5f0c30b5cb5052115f097a6f20c0f6c4206522a50492991829251a189c53fd67ae08a467590a38099994bd5a0b5109827b888f5322bf6eb9c6d75911b2a721c92905f145514a3138ea132e5dac52851160c171e80b728a87b855a78ce550678ea20044db943c708962c25a86c78a29cfa801aa15350841989c00563fb46d299274f18430d66cb6ed9bc89145cdb262c18d5c095703e779c14ff34459ed12c13427733c59bef3c8a6c24b5bd5171712b074c797960e2be7bf2b58a8111ec9c01a3f938e83637fc9b59123880fd26a845d26de5fccac29657cd2c8831ba76168421b276120639a98f13a07f905c2266bce1f825d1c464bb2016665a2817c84369b7708f975641026321fb4c409531cb1a3827b80f2c94b1c4d36132b10e69b8c94502cd46c540902b96eba76a55e3bcb8fa037a217bd91816ee09ce30f19721f12432d7238fca919a2b4f718674d4558dc7095f0461a20b4aa1aa080354ac60fcc8ca2400b2ef73246514c41cf3945cd6a425959d1ad08b51e43c02a834df3c8e084b04b9695b2d1500e9d5761e86c95c7c1a0e12783aeb6f18e14e157881640204cf5a7a2ed815797a49e0696ee990448c312cb7a55a28fa1367b196001cce6a56796208100828be8c241cecfb82caea1bdd36b19351cd8bb1cab7014cb887bc6e232e74d036437a3222f56bd3e0893eec360ffb220c03222513293aec7ea6da408f9c12016ca03659791ed14241331e5ceca1b53a2453689f8ad819906cb19d731e0ba7abf0096998f18917e4794c4b15659678dcdbc8980b76a4d5c5b8567d55719e774a2d1c952612a9af1ea7c77f896f88242790d989edf3781588c10a7c50ed25821b4abd882370aa74bf299975e9c54120b786f5917135b69f3ab24465aa134cb1bd3fd61f27fb38692b5f3db5cedcb40b8530834c9abdbae738c45017cef302ff334c9e2567e0ca791175813a8382489b51015bcb8ad5cb37626dd3c48c745006f5133bc5557f6afa7ca4633bbb26524ae968df362f33c716ea9131df1754515083325bb3f4e91e40f2c598912ca1da3770e81dddf8980797277711216b93b41fe456307a8135829ce7d7af348a090758bace57af3f353cdda444629a596ee64d10a5881eaab061782314d218982602cfda25a926bec7d57228844adfc31109d210bb2c88809c47ad09c466141b66ac6a013280efe78d38e73d6eb9ba00f59841050558964b2916ac04757e968bae6bb715d94199f22a81f4e3247b7caebbe3cd9bdbce68c931357a568c39acedfb0093337d95d92dde215fdc5b6bd7e2b14aa29046d2a601a91f9d4635f985a393e4408d64be23052ddaa323c5d0235d4a578a63cf6c655d55f78397d72fcc0cbb490253b9a4ad0888c742ccb474cca41bf4b51c6693767ab872586da6b470ccf0066a038deccba3e229bef1fbbbe33b42a5c524533b08ea926469c9822255150cd0633df08b01670f0c134074f22dcdfb593e477853fb383a4b683c786139891f647c8a42680d89352004560eb1232fe173c47379119b29226691b015649253673187f98827d22aa0c168fd7a339992ce4fe717b6e797f616c27d49b8df377f1300ad643220db8315a30429a6cba4e1a93cf066b6c6284b85c1ced4a4b17634c2dd8c758ee3cac74b2402460d2fc12d98943de4dacb2f5912fdc41e8b1886f38c6619831677e2a32a63860d2a1e9b994bf4f9cdf0c3c83c5b044c14b83e57c59d55629a9704994a4793a7178b69ac1892a578802a69d22d609a7832b55e731a65a1f29753870f8f6b26443824be227f578c6d97c57e570864092a66c8184ca58b1b8f89ba9c2a3e7a17c1bcd851aa552ddbe301f2774e81397a57247362426807f370ff2b7f6f7b1f5b83c2f3475cb225b71ca0750f333d72a434c88a902d542cb8f50f6ba8ae5531ce60c5c29057c2a995ced8a34cc1db7005c478fa174874bbb82981107faab591b8c9581365e7205578c55fc06b5f588c65e2ec700e6473752708853a8c9a1acad3c08bfd67c553b9c603206a1d26276e66c53a166398db6b2e51754e2a67a54902cd5839b97c66d2421df86c42c7181f89d2afae41bc116212a7492688424a2c81b85bf616ed686e8d0183c1082dd61c1144417dd10cc0e29b3168144064d700c2a295c1042ae40848fb07abf2aa7cb2883fb19454a8711c72670d8c0b152dc9cd39a108ad9348089754703a608c0b544350879ddc71c09051f92ba755717403130dc4b95c19d3510363a5dd620cdeb1918af90dd1267aa9696eb0334810b9351df981a0749a7e0c253d399a0115ae515c97b63a1b0ca42794e00ef59912a357565b427dd5aa54b706b0df583e2fb68ceab61395024abba0a8ba4ab6bae958d9c13eed40cd20978eeb5ba041b837595427a644a850340168847acbb69b8d6809b849a7d6a6b67c170dbeaa41be8341c6977dbc025688244396503411148458aa2800c44195211a86763c54e45345ac258541926b4bced6a337df4506113647828b2d4e45723d68985dbc2772a6723a032bb3b84a140a95dbc480f1495118238e74376c3aa78c25e3703ce121e8576c22ea29119b1eb5b946d261cfdc71980af7961961074584a7ed970fef29172cd98a3ea5550f994f5d763b00fd37f9c0abb1459b825c6deac0b35d451a9eac64b03c3c0139806586c8e0f63b8f77aef5b207d2615d5f296894c9a1eb0b68d0571351e18a20084580d98aef13bc4ed039d132cf015bcbf0270d5b971f10f581093656a091af7f3725a2e16c8a74c541345ede689321a436ac488b23895ed3e81fb4f25b83964400ec33c529350ac29f4876128c010ca9c4b6d3e47d7ac798559251bbe4bbc7ea4ece0b76e9f519d819b286f14fcadb1231067bcb113ecbc737020b47587c491fd26541f47ee2b6bfe6908c73ebc3715c58aa93484a5c2692598b4945209d47258441c2cde253434a5a1edc934c9762b2740795857e255921296a8bd4542f82bb6ac7e293f9e4b7890810a2e46511e241162b2af6e38c2a07b15a38a494f8412fc40d60847f957b7839e78936b6c1ae906089a80ef5c58e2659be2643083922b22da53912055f26fa7ccf410abc42cf21448290b168cf7c8ba20b28dca959acc253bfd4b67e60c0c5f82728382c96f78b48b4a4c746c32c019bf8c3202c46a7a2c9c401700eeb1c013bb399d9b62eae9a4e68e4a4bec7b7fb92888ee9bb5f52aca49b2e3f6ac6b72b2cdbf2c755f85fd14903d8712fe0bf82ac0b06aae9bea06278c21e6257bc96af0379bca07c78331bb014bb0d6489c14f5411051f9667aabce54da7a8deb73b627e3873d9390a35e03ff73e02a217659f53d8c47556bf3d8c94040f630d63605e2d0f923579370c +ciphertext: ea2ebb121065a8def00bcbe87f29aa3fbbcba6435b50a8f16958f1bcaf938c7cb7580d196069a8455de58338736ad1d72cb7332f605349a7542982e525c1ad949f2ca7d3c894a8947d122bf8c55667aac75c6d64ffe2953b49a9ca83af87742187865645af50f1aa12042166c5b4a9262ce9691e08f9216d0120aa227b1875e7d27a28084be0aa60f5ee84fecdd7f6f1fb6f45674417cf11c8c90646276f76071d75fd05ba08eb5e83a0c9e6153d97c6456fee5640d55fe47d3f8b3c162962aaee0e15b045e9d3b319c61177a3e316112388af05395649329225b8c7576ad0bdadb78a81f1594ba0c163edb95040c1249a1f43917629bd905bc6a16cc21da6e9e16637392b56d397f4c5ccd814ea599b074925367cdba7f1667ba4c2ac8eec4ec976905ac46a45453830d6ff6fe4d3bd61bbb91fe99e3b5702d9223439f6d91dccdba1ff13b9d31cbc47ee42bfab33e3dc34bae64435ed2fae7ef112f28fa7ff754c82b9082aa944456e23ae2654e0b94186b1bb697d610b87659805b4e5a4e7c043191dfbce990c54caa0a6ab536a21fa7316f22cd8df0fb4532c45930fac927470b4f7d7353e8d000e53687ff1b3649851454194aa3acbbf4e1a1fc549d6a5c60d08a65cef540015643c7d6c1d409a093d7a796f57ca0706ca323bd3e0b26353ab1d7bd8ec8dbad952f3b85388b100367d6989de5396e2ac46d85b402094420a1bc3b0d9b440b49652610be14e36a35cf6502689ee03104af750f7f6f8216a8080298e260cfe7cc76cd84a4b7b46836eb78116ddf30c4227b984db4f482ca7411bb41e5b3ad934d2662bfb767be82b95d31f7ea00ca02d22b22b9c8868b740ec66bb221d4b401ea7cc9112680b166d007c3e279fb135e1b8ad761e2690b72f2a8dfa6aa844864e6330c433c287f246c7269ddaa947212c903d8f08edf7625599486321fc1cb9df6c896e4f61e4373aa58fadb2e095a2c23fbd9eb507d7e8c622833851cefd0ed94a388f2772fe8980d46822ae977b027591c73c113bde9591cccfe77440c476560f59255d7c7e1a566a2a41479b6168220efacd1a866fa3d710eb061412538c8fd95d9d308c4e3fc21312b33a99d7dd270d7d0983b3e60cf72e630118bcd3cff1ac38331857d75736c15537fc8e4cbc01f543e8bebf214b8a45f6b6888d9c551e0bb3dc84d3d4a3ea8eee1a453d8a53f06de71d127ac7a370a57a89ef88f5291fec70308e2c5fba82a2af93dddb05b135d7c37a04e25822682dce56e74ce34bc5b8849d5d40040809798ca4ff3b0fbc999cebe11d3d7479ca18342c82b27ade902e5f6070b122ecc7037fdbee985fea2a04732ba5f85817e19ce8cfe62d86339fde475a56f7e5f5b1f1f1e7c18829bdfc2658be9f603d44e5a4117e2b274b9e3a74dd2fd001deb4f0753a842fe1ff41799dd77b051851e8f4b8bc2fa53dd754c872c4fac00c18768ed6f0cd285ae91516e6288b18fb6e50fa88c7b97c6b898f3a6e4776e1321a9c2a939224a4c903ec117f84518f7bf48990 +result: pass +shared_secret: b3363e6e6dba3e41ac2c63895c461765bc8a0250880d3dd6e8a4479a7fd3921c + +# Official test vector 75, seed: "8e2995f1b3e43853b18916bb1212aceb05898e2b177a87abeb928ad7184e59695c56b2cccf5db80853c28a525e327d13" +private_key: 1e556e2047c1be5b68fa204c0f36add1b8c00e6b66c0906958635733f82238d1ac4686929e4664b5217a774299df70822cdab3e06c5468d8be7d8745f7569e5851317d6b6cea6909c70b72897395c57494aa20551b4501e45825018260dc315b71e72ed21049a91b01665440345a102efcb0c9329f7cf0c619941c9ea7a1651cb0591c53e804987395760ca688dd7c75bf2b255dd618c168b8ad735876e9066c7275f7eb8200970ec4b9c36e296a7be41fc8b64c35e9b15473337a3003dc62794a0aa8cdc71c65577085253220869fb2845358ea4d73ba898f123f7f0cbb58db2dbc26a98a5b8299b40318285a26573ff928bfbf75915ad0518965bd345c2072157748077c16f562067b154ec88694c1b71d20624f19b62e30844d930c91e95b28173f9df878d9507fa35812654353f99b93ef9ac6f61503229a72558570c9d5213db68347f8145a9798597219df160bdb0226ea8b569c894e2ceca7c3c86ccd66450fe13e5c4556db3c9ba3441b37e26ceb9c7fafc460ed1373aefaa3d593b7f317b2f0f8782b76c18eb11d0d804192627d8657bdb0e440490b6c196797c0459cdd791b82b329c6439d2460ccf37621a34b263b7b46f522c24c294be8b36c117418dab096fb874db3516e889b3e92569c32e17f3eec3c5b28766d3a2f4d06475bd666edf00bf0a514d8c06309934ce4a191805a38d7d69d0dc926eb58110e9c5bee187d0675b36af68f6de7a294fa7ca80486d1e561d28c8788a75cbfb718bc740d131a83f9e64f5b484de82775b2b8762dd568e8528e6f213a198a8d6a21b9ef668b49b87e8ba97ae468a379968fd18236c95c96f9c84b23296d5a9210869c5df05421e9c3c2b65975a93aba3eeaaf5d746fa679c5e93021cf93ce71a8b45fd44ed92bcf43d0172a8589585b9cdb7baaf1041e81772b37861fff4c60fc5b7e8d6871382c63fb3c7249c3059385c7d856cff293138a3b30b6b13614354a502c7bf922076d028affc5bd6d43706f5304fa2783a862552a5b2dd48471880529eb230851b6091b59139732102f66268286828fc767930c1b4a3bab3f14bb1490ba329401f8d95d347b3450d6cfd2c8355db3697052a4f3884df8bc28d3792fd09352daf9023b6484f8553fe15336a788550f6023d9c9a42034874cb0beb25a6a4517a1adc72bdab35293f16efd7171455b948103bee4fcb7d635723eea0a4f7a3dfa3838e7243143971bebd25ec82c0ef059992eec1aa37835fea57ab04347e86855e0ebbcebd828556a18b167b5a4c7baa945560a276ebce40d8b6c6b23b417fa8c39ab55791e703a3568ba28f022ff8cca8f6965792067ce23465afb4b3517b5aa80c3c7001e78b62617e87e3b27021636667e60a47258155f9a06a1f8c93f39420c141372015b70a3b69da51dfce42fd748c48916851d78c8ad5c5bdef8624df33600027495f6be5c6a78cc43b660767cc1e77d5b7396f31c8af0b35c9826c185569255fbbd7fe0533767c89fb43d1e282b0b9b348ef31d7cb15719a0c1db21cb57a1171046ba9409920f08a4a6d12855e113c427b2ccc4193c11781df61345229191b60283eccc3b05c49316c144a8b21e494d3ce1b11d58391bfb7bccb3a95a0322a62aa889781c4fa3c36f765586b2c2a20cac081cc08d06ce1cea6036463dccc34bc294a51f7b1a5dc0778c143f57b9ad2c8b41a3b3a7e3317fec687f50294158ab07441c119c299d421b3d6cd62019b4cfce69c9dc5509856b7cf087b66391793e7b2a77262db0909861b46b5d4c23fbf134ad43622357a81cb7c9f5ac9cf1c190b9f711164a9cfa4892927364d800ad7fa2888dbbaa21b689d4a20fd0ba43f27386f90026322705b0f1069b32760802581231c44db0a43753779fe88f3a824f2ed858211bc172d49221931c3e86188c287a093b1eff20af18c1004979221c85c2ebd5700473913d465359ac18deb3055075386ac3c330887879d5ca762b6b576b7f2d422f23889d51788cd84b77ae879b1eb7026dbcce20cc94f7857aea148213c1ce857277a7808857f47e45cb9b561b80895142463bcfab6c69a7712acbd64a3b6721aa9671aa934cb0c1bc52b464603779fd6ab10d57cca0a749f3a1889e10386cb7ab0bdb86ccb02ea614a0966a0ef2699da6b7282713874f36468c2014539bc804911053d1025133975e591e357a8d88a1c7138a200543a90f4aa250f44ca61870d206a236d1917b509638fb6442aa7b886a54fc21b7c40a1b7d027a09863ef94280c67a4693d28a0f842ef2268e0a67a11bdb4a18b3c459e11e977a5d143aaa82b80520f72c50d248073746662b78ff685086632e304085e9c7050a754b302338f7a2af0a223e45730de36074e1843876a6b1cab85e0d984ece18a3420aabf4d740f6039dd183c57279469bfb9f26fa4f6ae59db60532372b729cdb8bc8b26b9e511234177af2717538383bf2103726c79d84b4489d493423f7375c273a9558611b60c9fbec197047566ae9411637ca9dcb956962354872803891c728429fcd99c02ad020c11a2f1aac40b6fb13fd6c8508500fbfc34d752080536c150b402155e130c3aa1a4e914ada0740b5178c83a67fea746803a35c36a3cc034052143303bee180d8da097b24c89fdb16583b972a50c89b5ca27dd4aaa1002fe2316940a7ab294b02eca4c69957b3d02b538c239f18a342aee0c15fdca57d28930a62096567801f64c3452697d5f4a66781975b440ab3b27a5da41e889928ff41402b20b93f992db6d4216a4a2b169a6952816d61b93a82c5c0d5923152900be6b9236ab96d076b36d406b06793c7c8c85d69f423774c4a0c143e27673cecaa38c66c1dba02860cd305214a2637a90cc84a7aa6bb919e73c06ddb787b1b9117a2c6fd577a7eb417d5a34922767bade412bef212694373401554211c1213ac7bd1d1cc61f40fdbc65b89ccb3383c30476932d738b181b64e2bbc9508268c7061a4731c659d18749ec3b87c3741d1660d10978cc91ca44df588c8a0a7a68670a003ba23f03ae733067139083ed33c98dac4c06331e90b59514c7005e27f179a0ec8517931b678ec849789c656b30c4a736209e70151cd970ade5557f9e6872248b94c894220c0bd1b6a3a0149c1bbb8ba4c9337aba868b78199929044f44018fc261aca4bcf0f70cc1444411fc8cc3b6b7aa7ea9f8d06a30c7a61d89c19e7c50b84a278a921b74e2936ad07ae2b17344356a8e640a9a1392048cacc817bb0924682a027f2cf6ec9b36aad177faedba70e26db0e2958e3d520d23b10254587c9a546b5c0a567855039f6c1bca60414684e7bd1f8eeb7913f3a1795ba4bad4c9f684fb055ece19459eb464e91e126a7a6e3ed11ccee0046da234d964c985110 +ciphertext: 5be4b5826337373eaaf9e87d53baafddb421fbb420412bdac34c5a4c4a365e7815446854bcff6f7f793578f7a8506b97adf4256649e957c6f3dd74338be6592ceef2aab2500ad35ba05eac5c08b70f196ea618f20b05ea81b9fdb4d76cfaf91d6c243e0d93d315a7c86c420add20f23bdee5bc67421797216a78053bf7a7f5258d6ac69bd06329f473270c480877cdae2784f833356e388cf0a0bde65f97cfae05bea5c149c9fda694c5a9767de87d3c9c4c7a3878fa0c2355a78cb32a44d1b80a83a2fc198f21681ff05556222af755343c735622feb9d4df7a561bef9f4a5d3fd47cb6874ddfece4870da971425aff3d8e9ec8367b97395a8a994f96695e721bdfba993af105d365b42b29ea811da19d4bc3c288e1f768102f9eeaa0a3c7a5b5efc67f3d7c70dff5df5883fa3a85b60881ff7f37bd2b73f2c160e0fda40ca341868f7b630577c4c4486b96004c980be59340ed623b50405c5732d4749b37458d0b230e57072a97ceb2f7d236f7bab0792a3bc151a786f77d8f266dabcf68cac9c89515cf15dd262a0e594246b3568ab250ba1e874f52481ef5d48affc7ac10012267e19f6eb2f57ad7a16da8dd29e26f6ea83f3b2f732e9ba9799672ed967d029f0b66f032c28ad3195f5f071e0a91e21afb721fa32eedc62f80c5dbbadfb37498cd1779e07c0f28774ad21e5e7c91b4b9196449c0773478712e43b6dad9639695d99355116956e180074f41032c332a6445d97ef237d89cb198e0ae225c13521833ab3fcdd59662fecd184c6543a73261332e713061896578524726ef15def3cb125224d831352c73d731c8def727d1db7dc668413d2d99527340f9c3d7065d93cd3f6bdd405c9ce2f7ac58155b4009718199c3fcd1c5bf5d8f7247747b74818b425839e9b7e377769c36e241580a17437557d7818f38797609d5c66fe26eadc06611f3edef762f0c34bc729ccc9cea1e6190c57d51d872fb278a6baffd6c6f8a446b707b707195979fd10f84d3a51f7734f53633c83ef6a210748f382be3edfea8e01f247eb7700644ce9e80399564839b4e8d8ba34ceac158b9664acd9bcab6d81de3638cebe7a6035e0f3165ff882e2dc57b1caa11c9d111fac396b45ccbfffe67c37274d4859177470a3dbac95c69061c963959d58c6c8dd219c360361380d5e8bc8915123e98a24d594e2d8127e918fa0e41086ca306715859a80ee4e547d11361fcc43600d79f312f8b42d38efd3e6b008a8e5bdd381cdbb6ab046ab4c1352c38e16ef981f0b0f3aa1ecaf84e166e68492aff7ee3132d598cce0b118264753b65c39d1cda91d487584da53c9baf49c249debc9de95a390815b226503443ff147b8852dbce76c2289b8818248b15b8c814bbd2b8abc3be7001343f82ca2073f9500ca3f2262d5db43fc97deadbc9aacf0d1cb941773815f83cc24e0f0a17f84d1029027c08ae735807fec4e3735c8d3fd790f45edf2e4a80b984fbcc544c118686c8f0ae66e3fa50cca80cf858744f330f6dc5dffe6d215774ae8103 +result: pass +shared_secret: 8e648593c8f6f6f7a97ce7a2d151ada30fbbc7f3c4fc517d8cbadd71e6a17476 + +# Official test vector 76, seed: "9218943c51fd2de47e509aac67eff176795102f37d7a2017e3afd768fcda7877af38739b00fcdf227c2fd62eb635942c" +private_key: 243c03e7374a7157b1f0c02c4d542e2b31a45a902d908592f3f620c347511d650af8ca8932b70a3563ca126391f178c7c1477c9af532cf1897de99bdd7f07c0d304f90190ede5967898a0e7818622cd76724f77c4d73248bf67955726afde4c4e4201a21ea48401099b05b196b4c698565094b3421c2b429cb83a99b2a7bf5c784117b9e8f7c00d8f1c801b66f63402aeb49822a92afafa445f1fc7b3e76cdec3091cbd474d10ccec25539a658a1a48b6697252d28442a36e70578b810898045c0118468e6bd05c664e4c19440b88e0e847a15ca747e9990d995cd4172b5933b58fe7062b871ca02f539e74872e283abee046c7e15372e58455e4a6de59bbf716bbb62417b6e46296e68c501d4007e1a97b7d970b5bcb8a9586fc42433eb457993e7b15d7c35de95176b09065a1a3f61734b9d453ff0b0313dd8c0888a92f6270ea93ab6e9f15e9f6c207ca9512a41364ae6591c578ad93639e795cd00339cc5b67176f771fa6c5496cba3071b67ffb88b72993ecea38f4d8244d94676e55ab3e484b0ad4776be5ba4a99766d63128828b7497725abff8a932b1a697b6c0a27b3b69121607288dddc03a4c144cbf0a0b11886b2130174b99921b1920320ba515032ed7d536f5b352975697b8a05855cc78d7979da443a06d443d52b4931c554ccf03b43631213b68385e1a2c5f87c84e13b84032804f5929fca18c2ec8a15869905a216fe2852631e00b19b45a4a0b51243b118eb358435b9b46a0525426ba232439cee0cf6f8b164d72901cbb4f1b2750279c18aa255f5d7053f10c1750894c886b59c9ac43b881cd5e4476056884ab9a246248892c0c7a3ab8425d77c178b47c8ca5262949ce47c25b90cb90942b1aaf64825a7658c4e0bef219ba2e609eae90bb6983589e128325dc42d9422c72d0452c208b23297387a9b77ab8b89ba34266130d5cc35568ab1487c335fc9a91dce293d807ab73a41eec932c0e398a762881d2da7d558352d7b8abdab79687e3ca3db89036022adebabe39175232b36703749391c9b772a79396862972ea6c0b92387fa423fcbb6030f83d68c4a44600b25c547f7173376704a6e24c12a5906afc43bf539aa6aed0281d786336373a44147b1e943a9c0c7d8f995f61377134ec1f536334aaaac6ef040dad6a42feab2d6972880c602d97540a52305b24dc7cb243259fac61d2632285099a0ab740083178cbab0ee8f17599f115e106c4abd606ae5568f7a387a086b334f7aea5f92249d678add0c26f268ca769696fc14eb1c6ab8e182e5a727793d6bd94461b0e985d67e64f794b0def70c43ef927544081011a74a28c976c553ae2e0ca49c80926f460078886f49a55475c456f2bbb84270f22c5256241aad6e05b4a9a276e3357c1b92d5df09db23a783f19b1d9d594e064b09fc815bd43b5cb8b9ac43c64a2bca445b235f7bbb3cc0a7723d0a2e351cb4ecbb1b688ca217a500fb20cd37b1a0a2c4eb79775eab657425c8b264583b5c37bbcfa624ae1af5575571aa59960f37599d25cc625916ca149502766aa06cf31fa23c99b2099b9677ba327ca317e49e029eb33993068b022e00411462d7a548f4bb6b435d8ccc1305067f923c7a914d5d77fec8c397304996ce42773532b2798c4bb8a987e57b41b820c6f8b2c64181873bc6515b0c810109890b8abd9bc650f0344e3e7a672e269547aa4bbd0baf9f2b2f3b53b1910b255f7cc6cf0394ceba359685e9f6c77ddfbcf0217611d076ab2140a8dc58199a2a235955b69fc2520b192555c1bed2777ef623760cc71b0208dbf2a5d9841a231a60e2516c5ca3c6156a0c0862b54c311ce2b6b3f442c8082348833b193cb2b22d252a9ac88098c704d83f217ab2a8799f031227b95e1fa5d1a6410e3f025485338fb8338b5c7c4c0f6641b71644f11124b13c2dd21088684035a66a4c4451b5f66c9d5aaa7ace15eaaf03497ea2e1d693b77a4402dd1943e9c68cc642997a44d2f86a339c78912e678d0e314ff162c0e3c9ed8eb726ed910d1b26b99061c01142380e5074b5a46505863f6287dc18422b323c89966340ff7146fec18095147429148c24718301c106dcbb5a1b644e5a26ebb566b504a9b2984100bb6c40b45286d4c2841d774dc8915839c32ddb22adc41c0197431bf8c5f26c2329e6b2a0efb2b0d872c4b8b125d997937236caa455389c60f9e38ba3a662ac7349a5c872d84a353f9710c6c74463f220f37558458d68da5e67f1130cc5dd5ac4608220da2b8c9048bc805bb1f6bcf04379330025ca86b42cc361baab986c32a9e266bb1fa27552192a56b4b111564646b701dc4771b8f61bb5d41278a291920ac1d01649267344732a85109a3cb45b7b8e9abb8cec49ff602c819695f61011c7ac5957fccc50859432f324d6623459d7bcbfa20645b2a54c5a8ba0df27f93ecc2ed00821e98553f680623ebb221953d3d9b8d188044d693abb88bc965984b08d112ea6b4885aca190f9877f1bc123220aad662fb7f5b0afbaaae118c6108c98b31a5b6ff15aad0a87b172bb40998ec232a9d218bca9f03e88633914561c9ff65be6dcad01550903276646208248a56e5c3239f951585ee9326808a4e4f829a15996452a3328253ce2cb3613aa4fb02acf3030b64c6a27afc5863487b9538b53a2e1456168180d257f4403b41f16b415740abb024eb54c23d6a851bf9c54932259d1bb510964445067c68ae362dac6a7c3e29ed3080b0d21a76ec220c7d562340123f7a32c62184d2d707144a1565e432dff443940736cf628caa3607076783b2b29bea7058bd164219518aa77c2b303e07dffcbb00c930ef0f0632c10aafdf32fa7bcadc5719fdb591c7635c3af83198fe306076a9da2455963b91551a1618040b0eac945f788820a1442ccd10fbdbc763cdbbb6e221e8ad076880abd561c5059e23709d40996d41fa6f129c4758b62644c30c1c06d0080091b4d5a8705f4b0694507252ef1a5980a347846160ba3256475741d50a7ae465f1b444a25729ecb66585e51992bc781f28c180593c4e5882c243017440633007db1c637733a01bb8a994347d7602ed0b34261603b84b8c2e14c5c46167af459507152da216f272371a0981fdbe740daa78b9eea655d98cd14ec90cd383863ab5fe8137ebe820df5a007a288586e18a54b43387de9b73f9037f27384be092b09941262706dd6db377f733b31a49d2467605649b9609365232252a62555b1451674b717182870c1088f4b34061f3e8b9034af0cf2c5f7eeb665e064f5f27cd5e4c84531d45d38051ef98f7bfdde2a7116ff4010cf829cbb18512f7cf44237c02241a1f75fe3ba8d22bff03a8abb0a5010f400ae5722a75bdf5a2f6d5b546b34d73857cb1bfc7e587aa7 +ciphertext: 1c54b44d8a10785f4510f996ffaae6b98533eed8ebd71ea24f7d7669446a5e6db97d90bbd13879fb301ac3042218bc5362ca6c057ca9774bfbeeabda1e2510c44e269049858a0895e6420a46b6183af4b2c0678415698749b20ff5b8ad375270763fda8e841f3babd0082bec29f635826d51d93fed0097edb491e13d264101f6077f35960ff036c9db1822476d980c294eda6ac631f40a8aaf3c288c497d19a340e9d351c4449e017086574100a846ee41f9ba811f6d3b5999ed6cb37f0a64c89c605889a3dbfa095f9e24564b636276dea2e1bbebd3469add8a00b798b531c5d7f734c400806fc2a278388fe7395756c97c3816e4b3b5eb079f376b6f6c46494f93930786d5d2fe597d1a4187235a34c0948494be6532ce29df05790382ed06396b78b51cc95ce617de6ba412ae0374361363dce738a0b3924bc3c0bbc440c660d8c5a012a1a078c26397fb9989e3f25b243a4edcdcd55d4919903a81a0e41b51a59fc676a7672d035dbbeabc379053cff3a63823b359437ed1e148a703e80bd11ca6d483bf29f574f7a3cd4be9c8623472bd3b21455ed44dc092e897bae7b958dd960ce311200a8a9578df00fa0de56ecf00447dff9b18252dd4b2a25ce35de262c28411196c2e49f5a45bd074c0d7c498e42606068b517907938eb7e5b37785a4960981dc9005e5431bb50fe55e446817b2a18064d4029673a6089e06a2ca67693134af6fd75a196c5483127e5349728de459701d0745859e58f6504543755d969c1ecf912dd54e8167910e38ab419a161178db904dbf018ff0df9fb5f0d83315c533f6ded98a06a72cfdd82a19cdfd03109c161020c1e726e43c8354e61906d156fbd7e360d85ea6e896c6731d4acdcc10a8c3ac1c5432f36c9122cd6533f452f2afc46643b36de381d00b8fcb93c32eb7e8cf915f1dcca5cd1f9af29cb4b450408c48df5c2199f8df68ea23e228494bd2ac356e461aec65ffa568fea8c281067f3356223326459d7f746b42060f816256e948960d44703d23eb45d46ab0e924c50978baf55e5ae39bb06ea3a490f9989bcbfe9119ac5f3b83c5f41e079dee501516f4e704a20bd6312103b57f6c0bf56e009eb64132fc2999bbccc8d098027437ffa1cc0cac877547c26680cf0c4f107d8e3551ec06c5aa3791af10baa6b34a10d346da6278cdeacad19cf839b501a3381a7e68d3e01604d66b92079c39bf183bcda51dd0959236f345d0c98763fdedd9a58f5ec9b2978f2319fc61af19ed6ba74db442fde15ec92729aaa8c1fcc5598be852eb8083abf5483a654fac93724ac3c23a1db1c431e56645f505f136252066531c9b6d015b1480555292ba18b3f2e074a4c3b79ba5b831cf049bf37be83ed33026cce09ff36efa757673a928884dca31b8068b0a088f464270d522f9771b7a70cf87ead5956e599789ee9a15870b808b3ae59a6c417a54c4eeed8dd2247682f8c3aac4af021f918dbe3ab8f91b0b43780fafeb58fd043faab7ea49b5a4874c7722926399db78533ef9d41aa8 +result: pass +shared_secret: bcdd6f0d744d2a35147323a4a0451fbfb7d60d73c161c1f8c6a2b5e9f4239c65 + +# Official test vector 77, seed: "542e20078add5296050af150360f057f6b9ab3ba835589dd56987de805f900b906505b5390a0d86cba28038992dfc59a" +private_key: 77f83df8951068a026ba38b5e53487b6d6a39b69129e8b45498746d529cac78b4e9437565f39083aa50ad651b2d536bfeefb93f7ac40f4f4100b231564d4880140873d1c367da759b54c5cd9409382ec3183766a4beccedc375df891c75d4866afeb0ada4a161386b698bc63b5850cd3a1801a4a80f0053251664c7642971e0a0f415a0cda2c660a052a7876a5945c172fc87d8d8c9d06c9c30357ca3f8964b9b76b4544784c16981b075bf49653fb520f99a23e2465789e6b5864b969df900fef3c80e1bb0e12fc93b6cabcdfea9006e638f265880ac630823a0678c29069284a16020ff97404e6f4b2cee5ce8434b869177134f1ae861784b4f7332c4ac89cf8c36e7bce1a59b4682376b33300b7696e3bbb6b301cb3311934514babb29a187db5a4a656bd02d379f40694a6f1b55d1a08de840126740f14bc994da75f2fc3bffcf88fbd9b88f21122dd6b5ee5c2393a69803cd5cf67647e78b94bbcc81355e938eea2aac1053675251dddf380173316970cb1990153c9a0889c3cb05715a02597bfdcf925949873558ba5cbbc8782e57b3720959c19a21bc19c65a27599f32b0f91835c421eefcb3ceedca0b02659f4805d1a5cc916e2b46873cbf6c403e97123271725932b3bb40a0de7b08ff71919b249339a22585cd99698dc1f3413b15cb09142ea1a8d8b0c1f64b1b6fba5ed3068cc262d2067686276c302b20111cbb602f29756c32279dc578e20801d2a3abb762640409b8ba349cb72c9d3056aa788b023f15160832e100b7e48d14dc4b81229c744fc20c3a94918e78c668f1aaf01bb8b202a3c8dcc0f63d456b50461c44101a6338c4b7c725490af0563968a8184daa8720bb36dcca4ae3b3ba26927284c10093c079a4aa3b846a811ce237ea9033541d91fe5308dc32cb8bcb77b064bacd816bd8725569bc85cd7f63d34539c14b56534dc516f1500631a59ad1b985c77c262a0b70c3a14d9b6b81f2c88432568ae2a7ba32824abe9866738adc1761293925c694428ea9153fce0542362be09154b4e06b8a60b57f96176843b2764c3b5f55a1738b71bb2c87e371ab7a70560c245aadeb9742951959a25895d40b453376fdd844c9126c78f3a553b9c9b9d43033ee8c6ab13348058589ec1523321a823d32a97e0bb5270672e9990a0012842c38f3212101034ca8a863ae632b53a412537a40928c503a71b7b095163e222a757f3713157b8e8e369f2e2688d50728efb42229325f475482d167515d2656b1c131bca452892c39b8b2ee658816813bb66a0b16256271f8a23c7c0b31a45c4f42551a9a15e87d507d0547921a26bef229265b24bb96b008da638727615c8686f897925b6f27ada067736a7949bec8d23778708163da61c68d806067becc118785ea432a06c3a99f6648341e80b1c5956b650afd100a63474a32fa53e2a9b49ab935ff4616292d9278e839a70bc1cb7a61a49855216d5bd3c10774836469b48496f0590127850d20c52125150e25bc8388483847c92494c0b48e66aa8805ae8c3a0e7c5ae3ec64ba22381eaf7ac28eb0b76daaebe0b6b6e28bdd478002359c79811b2f47a3c45d938c2690ca38a7a2411c223855bd7fcb83d614266251e76684418f81e47490cf733359bb77d86b1b949396baa99c9d73485e378b6eda76318b961948497db54149f386e51648187c48a94fb603eb114a9408ba0d27f3c717694f9459ddab7c6d51a58c50a79bc072d7717781a6b12073577d3a89a405829850aff65023a771a5f5456ac5b3970d545043a2254178375268abca9a967f50db28635b1d01e7d1969080438368a4b61f63efd82a811f63909aa48a055cd9345c09191abeaab8237696bdf3512b7e8625212bfe5500bd7002066357954344fe361be074069a520a470eb64bc0289f85c981995141a246ee3c6673d9026b7b490a82819ee1825ad39284fc41a01c936d0280c4c681d62e47de8e339fc0a0f958b279ab95114209231faa8962754b12a22efb67ed1c42e8c144f74476f552a297e7573a81717144648befa3b6c6096f428c10fd925ba86b29c8890f2750d1e7956664a714fcc00c88a3cc259b503d3ca39942986d19ab6d76378858d679cc61ab40edc5a007d33813698a6ae96acbe95474b188bfd3208c885179de868dd027f12256b9fe84ff460b180c7655d514168c89a516ba4ddcc56c1b5325c9312e067949a57178251158eec2fde69bc9d61be726338830a86e8e525ec00152cdc0e86473e2b54ab64790735c3a945cc83b999352ad2587fb67dcf2c9fb3b921deac54dccc8201d36562f64831c8129e67b2ae78bfacba95f29c3d20942781e090ebbab81bc5c071b0bce826173f0cad6c101518b56dd03a8bdc872d338225bb16128ca8c7212867dae513c971b687297e4c098ff7c478f841a29dea278d1bbe55423321372a44937d2aba34b279c99e8847c5d4b51f54143de991aa16aeeab267386c7f286445acb87a98cc93029658bb0981048876f0884b526ba58f201257a2245849a57cb425cd2ca92a3cbcbf963a4f360e8616c082d8be4820323df715bf5344fcf85ba070ac3068ae91989e61600416d7cc28cb6d42a461dec083f6126c749ca457146d114c84fbc576a7dc8f9c2c03cf4a3cd2535a7a396f59d73259654254e5bcf616b4970770bc8a3d030c8c61d93eb08644159414dcc6428be73357531e50ba72b5eb99d9380bc4802339070366a19760c0b15e32a48ae0038453527b10c4ab6b1ae8497f49dc47e25a514258b5c0336a812525c5a86e22d73a9a8c3da5e88a468c3439464fac42491b0bc91cdace7cdb15166a01b62cb22b745c38ca32a9727c8c57537c72563edb4aa2b400b778115b36817f188e659b2bf7c999d108c5b2d252f6a3bb78737edea48c9bb91e917487e4e6156dca609aa97bf47bab00047602f296cf611299510b195ba59ae7bc245b8c9721901995b6df4918842017945c330290c6bb3c46d9104faf014db6728c4268627f8c884bf52e011344cfa795f864a474f9c015ab09c77911a8a52c1aa46aeed6560d4bb1f3b64d65028d373ab3d51a450e600a239767aed9cf25b5c85fc24cc794162ee70e13d88fd3459cb37a92d348a1956bba09e24513d5a5fa79b593a849a1930456f39fade44b583cbd7eb4ce058056df38cd0be15205161f53f2c8681cb9e00525fb59cfd86ba1ae81ccc1636dd69c81ef620651606326a41db9b68827378c2ec238e9179c02965f938a2d0aad893c30d27267e416287d7ddec314a79402a769c3d953f0092ef4f8b595f827b1b921723cedf55fe756ff5fb67d555296c6185d171ed8ba01393d1a735018a59b3bd23b49a95bc1fad20070fec930b6060bd827d742b077092e422268e15d +ciphertext: 93bd84aeaf924ef5a6cf9f0299320f9745d4b7a1bbaf8c0f7a721f150d740174f4650f48b2597b513f3ad8ece3b027e23e0bc83d7bdd6dcbcdb89b0c6d40fc2689db5a8f97978d30bc54e7c706597acddc24c23779cb36256e8858e3802bff79165020d65327150ada03eb85ced6577706a26d2e0c3fadb7ab480a10431f12d0946f1a62a70652684b15ccbf082c5bdc500af9eb2d1da194e8de691fefe76b479cc558604534d4250f9b3fadc5b6ee14cd723b3cee817ab6924d33e7cd8808db81aed732d6a388902137e041c078a519c530486c85e2f4b9e89d3e818fbb83f898644269051c3b82a43f6cc34587b4c47917924cc87c5090557254743e6f754c84ab36eb3ada3251195fa8987c2c876af3621d7b78d2fbbc99cf94a4bf804542efa4d16baea4d1dbe6c911177e3004f2d4a8b69ebc50246bc1ed56853870374d2d2ac73f4c14d668289957d89e7a057cf25fb2adda583f9420956fa48a7eb9d76005e20bdea9c5c16c8fb1efc6db068b8879d1ce28ffb3a70ccd1c8578b938732b2015faa17738ffae41a300edfe2c564a85c775fccdd01af5be1c42a81c2e76806b7ccaeeaa6a98fcc1890d9ab22b04d1c0d106db4d2053fb7da715c6c3851b1c6e3b13e9b9c7915fad5a81db1a823f6e9c08bccaec434e2e143b963fb7acbe6fc01b8c0f3be2bad13ea711fe426983566d5e31e782408280dab6b43343046e59f054f45498ec9514f2e5d9432b9b28f8b716cce2a02e64bf7fdfaa30f4e4b9d5a0fab8a5f2c1d4b5c278f83889f676549fcf35bf3836894839f170fca341e7fa9f88e0e3cdbb7a18565c0b5f696731d8ede4bc6636ce988f377536e88fefb71a38e76577eba3e3e9682cf1c796cab2a66da2fbae57df62c53315eef981b97d55bb0898a474b72698ff4d695e56a11b4d59ac3c33bcb1221c498ded30c88211eebd998fe8a96f9f92eb80c5985a5037f1a929f1f5dd446336a438cb3b75c7860749fdead56495af233937a2457a92ebbdf261c302880d44cbda673ba0a67a1456ab86ed38fe7a8e964a62569b1fff21994b193e74dc25d9a78f05d9677ac92a2fe830e1e4947d7def8c911d11bfa536c6265482e8f1fca1ad0f7f36e81a275b83d2b6b89d68b6bfab6436cacba6d12d33e6662c0155baf58f8f4ad3cb57b47ba63e781d94ee461a901a7171aaee49a69b25c6d8a0c49063f7e8448d60bd8de161cd778da0476529d5a0fb2c3dd9b4c90729ef6653d7cf74288cfc75cbc989c76bb7af8579578f5ebdbc833b31927fb6e585a37f13302db297d0b50f7e3e72792e3d3dde42151067679f155794ccf4e604f8bb8d1390e6e98b065f0a01c9f0ed0b35b451f1f8653cd1acdbf97c3518557dcdfcaca9f98c2e85aec32ad3084d79850319d1ea27cfee4b746f573d1450e036cf5001d532470eeeaf2d0895aec768f051e2c29f8300f73f64fa41973bc0d1d38b1c58bbd642807a49e9515cf5ea193e30a4da032659962e2d28d41c2aa6405cdd1627e4ab927303179807db7a75a2 +result: pass +shared_secret: 072551e254959ce9f2c67657b41122d8a98cde044bb2f60955bdc6e5dbe55277 + +# Official test vector 78, seed: "6a85a61dd08c0733fcbc158abb49fe0b0d96a50dcca140a2e9f5a254f1901985844613b1c656c0cb0112620591b88ad0" +private_key: b066bd9303c7bb0c4a4a01812cf463cb338cdfe80953fb0c90d2aa7a2c1e110443d80ba64f6a435051083af14017f02886b63c8f0bceeb544b86e74e85a16db9539de52c76a624086031c0a9b84380d02ce49b0736e2277995a63c43a2ada9a60883024d50314d919c98e7a4f34c167c830c717693fb4a2f4ab1c684bba76365403d6b3b27f76a4d9570bbe73b09e32d45b6b89616bb014c5fa995779144107ff6ab3b523ee121c3cf601ca7ccb13c7783eb8702d34695c686298824884c46012c16c40576497314a0d60675fa0b1190e13a816c75543c9e54867f9fa495a4e43f0cc964ea4b19c3541930e33a63750105149484094d30a28c6eb73de702238e09272cd0415aa3b19007c90ce6407a864703d9a9f1fa3aaa762e66736f7f692a7344ae84a544b6b289c2d2187d61ae6ef70122d180cbbc09a4878cc6e4b71f1962627746a9d33c0b7c3a78048af6e811a34943fb01c5b2a248ab256c729a8ae2a1cac87870bc880bef16bbdd0724e25a0257c244c2a59737da52983cb5ec02b44fc0bdbd40c8882470285654c61bb27a9a9fd0162594343f31307cffbac216481cab73bb215b73fc96507bea727e5505e31848306c6647f7875d708fdb57c2f5a428c4d3b462122dba423251b5aeb94a2c034c025c0b39fab66b1c10b01441b9f5d9b736272718b44894820aee4c5dca164080b4774cd6af8e7c5218065a6d03917f215d2f6595dd13141c9505da959cc10bbeab184396c2b552db0c9c7a878a10a63ad920c19c9145c2cdb4556d823cb6d1e48458d72ad9886daca3bf7265b4fed2b11ae1a8b73a1ba62a3a298c339f01cf70d7118a094de950723a9b0e837a74ba18a92410228d0803dfe49e740ac2bd50bbab741743795e292616999033c7a18765648441ba9725bc1b6275484741a625a9ac0516980b903ff40c58c348940817a40bc02b0f7487fb0a09c3eb6bced56580f09edd262ec2c251a0fb303e33202d27b509b31ee87304131518b0e17ae34158ed1565caa77013a7161bf1cb6159841f8566a4a8a0c6823892ba94a541b18db1a68c9a3ad1755a1648bdbabbaeb8c8ba0a105eae48cfce175a2070693138cf6cb3c3b09c2285540e83b2b5cef51e634b5902aaac61d63b5e72069eb52a977a3e8b442f6106c13b1108eff9ce87d387640b3eb1914e0587298aa10cba2b09726ab542e2101cd6620564b1ed8945c60c674f2233236bb744307aa7db84ed11ce1d01ac0cc9b86f463c13197c7c1aa3f443cb0eeca93a817319bc45f9a587cc8a2ef05b0eb2998aecac2920387695e154831c96beb5568d880d4e480087499f0e818002a7a2db2b717aa39b2fd755c1c7678cacbd5af344ad38578a894b9d795fe65b701d3a6322f15e501610c6cc1e6fe90cd5048c93b80632fb6e18d70ecd44b36bec3ef955813d338f3af7331774962a04318556551b18930f91b3eab4464572b39f996d71e4aa3b7179b07b7717c1373194cbfebb4dce5caba80a7a7bb5aefd069db471ba0641383b0a006978b3bf5bb14348b507a624fb44c41d4c8156e2765069281e2836a7859bf3473b10f24c8d371148077014f1268824859a82bb548c25ade15cc60128a58ab4301032776b6f121675622857b8b376d708b2a861306fe931126822e2e8672fa0b577e8ca3f16495af10aae456a734368677a87fd3c2199060dc1993690c1ae2b76959664a1df6cb2b3738b294124918596b0d69394eb1efba83895d0a7f3081ef81769437cb63b726d4236a65c87c3929b79fe34438a8931cf2b889cf100747cb58d373491e7cb62db266bfb3b7e745500fa418eac8cabd966dc388d0f1b3fba850bfec8c03a29182deaa5ec4256fb3b436f429cac87399c61bc98497a3aca07cec06a128231f945a4a335ab6d1a54a9a59db106c0fd61360ce8870d1cae99201506c9c96d4969f4b487e4d87ba1d45accb5a754585f29db0991376150c65927b20c9eb421366cc840d528734c8b4f1421fe30c99f4c55f1e25d18a1b012424cc9f6250064a61c1b42ac243b6c701e293055a9ea7c44855e575cb6217c381de770cf461040c20b2cea6c2a921c9be483ecc2718dac01c4a5a15b60bfd5222fc988c60b23504919137b1226d7b72fe4105154711d25790a9f64c95356a787058018cba996410aa4f29a62b6cf77439b5784b67390b96db77c1583bab490719d804e79b8954b948388514a7fb78ebbe7959599ca374a66558a8fbe7aac91e8a62ac623690a952e94bb91e64fe57ab4db066867ecc9ee027163a8010bf901489c10ebb736ae619dd0177fcd060c4657488bc50044e4c895191351ca72aff9698577bda5536c3fa75f0d9b586822211cd88d686ca8921ca65bf8081f8604277839cc9757653a46511876f7b98983fc052bc088bc85a686ab6bfd5c2b91da8ae210313949191d13279be375d3d3197fb01808a76caa8a843e178d0dfc116c041030f2047f4b35c0900498fab680d45fd0710d75226eddec6388d56d1c2263768603ac0ba9b68a21173704bd25b6b5181405029cc4b18c6446b5afe5431f0a26bf50b2f33b0aa4032e9f28ac9fb58acd85a670f393351b33df4079a5533c44a94e968b677a68931491310cd48ea1213dd416ab650b3294f06f91aa5004f622ba173795136eedf91598153b8d2935acf33709a8b33e4b32384bab51fa69ed123a4eaac726dc7041b486e8aa3641fb8d48f908c27866753b821aaabb9894b504f845fbea8766e82671506ff5b5012765a6a7b08f9fd3c10357523fb423e02024577235fe4694349c1188b1aeff482ba7a15aa188a8bbe7108ccb7ad6a469054a45c01aac131c6a7c4acd5c050184ca77b8466b6d1992de80242454169a33382972760de2b69c3c000b900d25f2cf4731224dd9a2b84562c15c04d3d1a9ad447ee9404888141a7da3a522f90b9071ad7af54552d0060af1a66a31b9457024a46b3fc1038a7c54b76053909ab07eb36c1dfdf897276b465155aed0e70f9a4b9398e54d267377fc298b9bbc053b281486f8436017c6d98b3249c167b17358c134299ae17426bc9f067849d7c55541a205c1359a41d7a5fea37e758a0893c18226a44bdbd27e0266096dc20da357c5d1a23956b796b305c29e87718f65b8331888cbd53fc2fc011f92c6f49c7f9901a5b17059b81cb2eaca2d348a22a91105f69140d122bf59d74c16a840e4b646f5e1cbd921a24a60a0ed6cad243303a1448b6750b4e451c5e0e41b3a12a73c36272ed86537f1d2f51a0e2b5b5847b0a2d9bbff0a051bd5227600ad32a2a1197d78798bbeb13ce2e92cd7ed94b410adc37b1b31dc060af11fec8a8be99c0e7b82be89bc3c1eaee6680aa4efd394e40c2b3f30523c8117f7c26a8969 +ciphertext: 2513e09060af8f52ebb2c83689895b5bf166ca6e9ce9db739a4533c90c5e9f40867926244cbc396051bd543194a0635e1753f2e1366a5844142528ce5398412429ff880f27434e22c14a64a45febf5228175f5f3eaa6c7d15a4676787ab733a34ec64d3e6d35fb28128a0e5ed59b11145a6402a92bda380a38fc3710104834b131ee928f2ac8143083bec3de7dee3ccc07f348a384f8f709829a05fe94e5bc144999ae09e2ce39a88548224c37bbf716b44851f453f6bd0f1052ee8566d444ff9f146785e3a09ce54d03c3d34398730474f314e62d5600a80b2de9fd468e4b8013a278b5c7abd613685bdeb26b3927d11053e55e5aef09028b36ea99df1471dee73dfe63e9f61c1eb16b32deee237a79be98ee3468de973f5a1f3cb411daec79b25a8ae3208503ced8b0604e939e6cf0e61d55a6d0884b38b08493f8544a221a250cd9f4d9328c2eb615dbbfe71fd27e2eb4219bc8de76472dd35809813b111366b6c4ad84b3024d0b084c9c6096ce3c7b50b6108aeb0714f70ce4fde2bd2d693abfd156e090455e9ff36ae938b99d68400587d8ae263058dc64a5386cfaffa9415c54c7db1d5e6a1341db0c724a3cbacad4b286a4f59a5db6435fe0ad19edbda0e608cfdf88cc3e00bcc864e2a700476114a5b7a3b492ce1f66b10ce5e3a46a93e39bd0101d35dd371bdb491c6d4b7f015b52cae6d85f0d71a2967e04fa58fb46b308315b44cc993cd49e5499c065a811a8df99ed94f98fd2f0841a3a3a6d3d89bf869528640aa7721e59f003179442e6cf20881e353435b994fba25acf21954ddb463340979d7d74f70cea856c0b4b2c9116f596ee60443fb3491f57b745258c462c3182da098e84868c6ebee511d2857d341c68a01cec442b87cf755d86373deef1934435eec9a3805d5f2074a9e4711fe350b14b79b42af8c5b884ce4a2097239f0c63bb3b96ca91b3823c11d9b79e508c30c19e1f63b3957332ef80318448e47fd122236b2666d6c66f532ba88394c61d21d784ce765c1307cfd5335c0bf04dddd81de4144dc445ce5c8094fdeadd4f488a7d463c14994c891a1bc9e04649b87fba42556f54a3dbbaa96b08f8e93f8f68a2c4c90d75f0df55515515f438ffcc084cfc69a219d2a2ecf808495b1568ac37cb6d1642bbeaafb9df7f4aa3a22739bc7c9219938f019f12438a74631762c7f8878ca24f74e7ec762df3a3f7e9f104e01db85c1e93130cfff87083671ed10aac6b5508ba479952ef0d5bc8327712c555fa47d15d32c5e252a5dd0ca6676227ca7c5a3bf3c102ca6e0d0d5e846cb52f1d85c2bd1c3c4fd3832eda5bbb7ac1e09feb84eb1cd22ae62e9dba64b10217272af5e5f00ca3e8a03303ab13e8ab4a16e9214d44fb37b11fad964f1de2e45ecb499444f81c563a2b3c599a5e334aae0a912e577a6a8badda3dd04aa33e59ce1797f91ca0662cf36275c5f8be504ee7f4051ad2b346f67c66c17845d0e0c4ae5b049bdf6c7a82ae84fde16223d7aad9a4e54e46a1f44260ca0e2e8bca3892 +result: pass +shared_secret: 88c0c1e22b68cd65e1eedd6d6208c36492fb674e26ba4e0d4e55f831a1affc96 + +# Official test vector 79, seed: "7f4a56eda151e7b097cfb8ef980440fff707affba91867c89522ced6c5ff3bd7f5f00bb49ddd615d9361a7e4efa42851" +private_key: 024755131769c7169f4b3a0b89f81f45e6a48cc2cb0eb87badd4ab94e9bc67e85ead80158c390dac09c40a6a8de8a95b21c5158a853442a908278a6ef80551a7c16a800242c7086144444e488bbec51c3cab83594bdc2457f0152c43a9577c51799ca7b03c9ce3cb4f5c6564792ab8201a3b8304ce4d8339a2171700d7a6ec1a03c337b639f7c804a50a6f41225c1143f9d8ac9698a3eb126b9da000bb2137489a165848865b487051b7665640b2e5e2b1b4633583589f30d4572306614df8080791040daa0106633a26237a244b6a18920d87653e8b516ea895a1f75bbfa912742bb540006a95ad20b95471cd4c282a64a36ab09a86b1f90f44d41753b0a8cca50d9780351f253a691824c785ad8be9790d48643bb4611792905e5b80d2717369e4786e5901c43366a14b3b423b11139349c9107fe3f55958fa8e4df6006b3607210b525304be6551ae57e826c913cba2503260a9493bbb3cc2319d791226c27a54233c48e7084ee9ea82376142bb419cfa6c0f51426cec39b554255f56b1cda42b4ac33391b08172f7a82574b6943f6a79ac51a5e6e254a0a5c80d46538c03705705abfb2b3ef63a756ab8ac03530aa6cccb005a05d73b687d45529edba35af03c411592f652c8f1131640b943629806cb21482f8913f436a06dc790b89b2f2a49245a51a26e107bd18624b51b406381cba1ab3e8879c401a30fc9f0c40beb557343735d0a44ba150d4cb404d752805085892b709f2a97abc413c81f7a1e14811745878d66e98f1fc176e4a3cabe60557e104d24733668985ef15b87e78b57d22c4464ebb4b9eb1b124b80c6328c3bb93349359777fb09a19c1f7de48274fca6d91bb51a97c49c66295bcc6c53933e1f327f2037c7bf9c80cdc5406fac0a9f067e7703a0aa79ac0eda8c14e4c7f6b05d7fa84ce9a487ab489227910d86b0b6a3a91e21eaa9493a986ea773af7c16cccb3b059aa724a02cf936a45730aa93ccbc2b3377014350cea39c36908f5167b08001061867c603f6ce64b081b2e46b1985837684b5e3318f4531c13f80277a35683cf599b373136ec3977afa12e1d32085330c0a6828a57c2902ab0ca679c2f7f9a844091b87a4754ffaaccff0c50abb01768927ae0b2eea885b54e92db59533ae6a6e9253c18c9184c1127220775da93c5964845240a7a3795b5df5d00baa34393d3009e641828c86173ccc1a9f9749a0f9271867b2d2a364ad7335edd1c02e131117a93b0f6113dbc9ac36924ee63cb954b60a325971501b3822732007629b00a965537c3fc07791af7a0c000446d15506c8404da9676a9907969d40627a18448f353735706015f05005403aa7a7b79ac7c5a3759b569b8b5d3b86bda01c4031a1f4e45cd663bad410123a973b2b6633da3c88ba0a26f0347901c6236ca76e1266440adb415fe5c7adbab8f5d8b3dd5bb4f88c3a1e450a4850629166102471294fd05696a54f516a0263e31a895010dc034ce6a72f6294a3cb6120d59c0e57827133a2b53f40b0d5f060e9480e77ea39e02a48f4327cb066bb32d2289bd97d10ec6615a6ce06088d6f63391952c89ae8bfebc43b554aa5e4b6a87cfa9e5b457c581a437422c48aa35df5c939694737a6f3b26ca06ad98a9a6ff2122b8889bb513558fc1a8701376ceca1f7d87a53f78f953aaf9f977c2ffb4d04f88e33e0ba7d83bc6fd27914a769ae382ba5f211b2f59f0001ca30b0a0ef138adaa485953cb8b6f6ccb56a7c92598c0c83ae97684c26d70d69210c8dd16ae08c4b3c1c30110a581669245529be92d38d9cecb10f22c83d01b3b3660fab4662fc559f48041167fb3e7960328c612a7e99a0c546b63b1b04f22b78b85074e6d32f6e04b096eb89da611f30267bd8760e05c238ea2a587691181112a39c88c528977f0399cddb7a7c8bba3ba71507b3db7131302407052cc4e8125e2bc035172a967a21a0582a05f8aae28228ddca417545144882ca3d644f6167ba30e91368879efac5971c8b1a7a9674e804c08e506ade53bcd778c1af4637584b9752aa1f16a4319d296b93e5368c10863a85cbb55c11c56338285b21cd740695757adeb2ce48b7c658a36b26b670e59947a0d94d022284bf0995d56666bd7968bed8858895c779a3318275afe42488953791e97cbd6256c29a6c6e4339a15d7a7c3da95edd2a562dcc2f6fe077cbd2317a914b975692ad1c3c3d956b26634fe1d2235d66226ba766a447bc87e8674800cd898b4b02c491658b97e25a4f836ab98a99c669b60aa4c30518a6644fb048a4e34822782644038ab04a3815c61da99816eaf388e495cde4a65c12f1bb5f02a1a1b1cede817952625fd2502f2a4b8bbbd4123e71462ee433ac923583c830cc54129bac51f96846d8fcacece9b19f6063734158008342c6f48234d24571e5777074170ae24b20d125f1ba311f4b33cdf91e3a2305fbe12e44ab54cc8c4eaf8553f697c00e8040e858569120bcd0166bcfe1a66e2500c3ab8acf3b58f1309c68772154602ba6c0968553ca553252d27a0b05733d81486d86c590291a643edcca9f8470d573880d5856a6b2cbcff2803713790d17297ef11549d5412713a3e4206b1b7c85483192164209f5b32f709aacfc4bae51f180edeb7e999ace2bf98d958514951362b08a6b529a2a7669c5492c0a61645542bc1dea0b707282a0797291b8c7a510884f12e92f3200ac5ee91686e109ecf245b2672f94c0a4525b7f43fba328099bfe4330888b186d026231d2b2eab7b971ba7680f0cb4653652f8aa8b4e01bb77461d792cd5e941a31dc02d52622b37c498e4169bc0418e23c5d32999726462d3a0a6449918b18db487f422849b67cf047bfcb0c6945bb87cd779dea915b64aa0975d313f8a740de77b0d40612459c2eb73a3fc876ac39c821a52761e13115d87bcd17052fea2b98d9d83ece9b1de7124c9738c0df539045279eeb21042a13791feba9d0e23445293eb3c2c194b76c5febb5582220ca350eca9b90435372f3c5baa0549ff847aedb815c244b27dc5866b151041e884befbc7bccca2fa098b592c5aef7f53e0d712bd2119214c15f8ab848a1864705d0511c50a9942535cf06952b0357445a9854240c026733ac8a39eb3c8bca2939d195763a572353da2956799448570a21d58623635f7a7461a913c24ad04d1495c1ee42c88b82942012b2d4b410fd1907799623f1b373b9c438d2b4c3fc48c054bc5206273f7a9a3dccc0ad8d40070ef20fe4cc99c8394adf63126006ee8cbb821b12a2a0a3018c4f8e52a50183fff79e84c694277cc3f47f319f88da508f841e536a056625f206fe499387d27307257682237f969c35d165453e5fcdc6f9df64526d9de698f2bd3e6bac6c7fdd86601b9ba5f4a5 +ciphertext: a93e454715b85fec95f1c8ebab9126e7b088bffa6eb8d220089c651cee97b49dde58f10f2709d6ca10a0edaf0d631e43e1e57eacba91770283b2b2386af871594867ad80b88a03d5554d151f7957391a8a675688485b2e7bf619fcecdd8be017498f2f1377d03f59482151e03f1f90bf7cc49a2192fea0509d50678f514835271e114ef1b96e453bd2a5342eee9632c0b2a54daa8a18777deb4e785d0b1b6dbf8d3fd5011c1dfdcf8dc6577bf5f0b35720412df16bca86f3d65ef0b1b01a2bbf50a036268d8cc23a9db6d0c53ed8885495059f8f0101806769836fabe5e72d8731b50c745b24944f00de44262b3f76bfd0e3658c9b05d93b98b6ce25fae3a326e59ee148d699687cba27efa3e49d719832c82faf13160b8313a5d9e8fc1c5c0f7589fd7d143b241216bd49cfb81eedbb5f732c3dfd9598198055e5946208939f9477e90febda986efba3e9e5ba2dde57e9dc864452d096642484e70a19623b6af6851641e6f41fdaca57b6bafef0b1584fb4db1864b852479c632db21089157e4442a4d7dc6eb5343d8b300c15dfedb908bee62ab57d8fd1be322412edc9f681980cfe056bae32a30d714b9e6397b1da7874c5f3a6d296a435377d0cc339485237adbc72705e054278819931f6a84a3335b9863af0aa6a3e0bde969289c1d3956da62f822dd6261661241e88042d672ac48ca1448a42f978ff134f45359e7eb734b0cb44a99fd542f961f58e0fb7a3116bc3be3394b9cf8478f01a35342e9a22bc9afca1f4eee22406cbd5ea5bd582d5b88e5bf0f11a46554323310cbba6cafdd0b3879ff49ef875bc6846133b8bc3243cb934bcd8dc8493ca3fcbd1d4ab06bf2e6b932eee6fee99b1c260c2199e801d68a00bbacda4d2f2facc57fc715ecc7f116b5fa02e131710377da8c414b9c41c3b2d0fe43b0829103407c229451990fcf1de8a5a84ba97798f2e0cfd9e2375f37d306179ad8004bf49871ad06881c2c1eb3524bbd2d547916dffb73af4a97c2cc4eb3e13fe7eac98a93cb0689ab9e1398f8df184883e20671bb4781c4eb0b78298f764a03624b2e2991c633c04edc8c23740153c23864154a0e49795c45abfcd89a619c0d5d45e54aec741fc5afef622f23c1406a0524de27872a72b43f771c618d81223ec284196849093bfcf5fa5903a1bfb843f7072b3bbb12cb1bc2ea13839bd6dca2b4c1d7f1c726c6359339d649f416e6a6132ae9008e787706d1b4dfb8f724cfc439e9ecf2c88114b2f23beb7b493a1f9980612d535fccd24626a0befb6a86c9561b96461d86db5c278c12e002e6992746fd282a6cc8e7b0be91db05f6bb256075f50e0f1676fc8b4844f931151017ee9a4423720203c4ba933be28f29f73e96e8c7b232bbb375b16c82dc53c697d2bfda5afa3d8c297ad7f3ccec05c5180e6637e060a6599269a88d09fac0c2a724e61d99965813a8c11746105b7ddc09ef377dc93f92baf2b524ed9c277a7b679334ebddcae51318ac4be3688b655635043b07d4bf5b79ed743af00ffab8c +result: pass +shared_secret: 56f717e4baddc2250873d667f73a442b05ca2f8714d4dc4d295f899217c92c9e + +# Official test vector 80, seed: "09fc004519bcf85b20d25d314a0dfc79e00cb6262a7dddf9c52473641afb8cfa0f5dd5f53558184caae9ec34b459e98e" +private_key: 2b006f1c2787d3f704935762feb046f67a0a59163ed30c83b577caf4667605730b11364a383366a74125df3526fbabb7aa3916e9a05586920f9b130ab980b2a940109552047e231cfc7a9ce7987d3d218c52a11c22953722e861a1f000385aaee23378c6372315e73315893fe0f027a44caeb37cc796ca1954b79adb22887b41b3e9c98a4c5a7101714f4cb78c9d3886393567016536a0706fa1c950dfb71af86b91610509738b3f6c192368416b1213ae508439c8c9c4f5382f926c6df08852e8955a04d5a8a30912c201483096bd202ba4b82855236b804faa20eff056e288cb699237a1e5150d027347bbc06412c972c0a783a1b794e7b2a3b45b7f842ad18b5520a143f4635059690df45b1f99bbbb0f18ad5be48006727fccf41d400430973b8f62481b73d611dbd13df47633c1a27b387398dc32af9e71a40c84cb48f131d8a7acf8d91ee2513f3f225a2d61b752e24a2860148ca68c3a75243200547fc054710293b7c7a939752959e6256cb29c0f0535055b18e2f78ec4da0bf9aa91caeb9b5c5150ad42a867c18dff50b2a1e8c2d31951d5fab52aac7d603500d9fb4b5f516fd26bbc51a622751636d2c2ba24ca5c3aac696edb821b237e7fbc2414e7cf2388644ff702821ac1e2068c76d0717c40bfc47c7f96077504d5b9b2c7a187c0c746e904cde556bacb9cbeaaadc865ba93d4837b42192b539e6de749692916df131f26c26f4b3c93fdbb33cc8b39d176a4b27351911b8b85b5567b839cc6ab5f65a3502cd994c812b72a2037e5e38f08ea97291292fe51185a603f94fa6ff6e247b8e3cc82a8b111dccbfdd715d7458b3d984ef4a17ba7314ffa8a069031b28e9b858e22900d364bcd095079c4c06a515599443ff5f434be754bad6aabece45a1ecc7dc5c95541223bf114ce60d663a3621b95826747b7005e94b8a84025fc43b8dc320964d2a610b7ce10b7c7d56c37dd647fe1920b876267cfc0607a35700cc51a3187b69c488d34816753607bc22b59aef9c3be78a2b7959ba69212be46c9411a4c1357493a73a50930020fc732acb44c036602c22341d5039dd99cc53333091e983c1c1ac47607b5e47727d1d8a313ca73e1b9c47a63a257e1a5c01ba55b802274ba8c3a35c8427c9130c71d77165e00f2a723da6febe7a17d89cd6319718452be2a80777f1469ac36356e73ca7ef420ff64661161b3eb459b33c694a6399015716d8d7b3b0669648d2331edd6a9e54933a5447946465fc21b51c31328a6763829100d02c9407a8ba8bd150e540755e210102dec9fd9a06744ba9476d0b6252cbabf718c4a917fbeac293408531c46ce91402c91b10a3994883dd83fd0c97a952441fd6485c8c34f8116b1fd392f706150fa0867bd0078b0e32ac7828b6b61624677b55c18aaeb494794b1632e686338315c92028b3828598a4ac462646349f17abe582440e39ab346052219537e909e8e80135303bfe731ba04caaac6cb89b3c37558243d97881587f45de25b128f9568ac45b4e3f39ddb861ccb0749ec3541619b164163c77b7397da453f57377c49c2a8a78c568e300a635612b7c95035f4c71ca174e7653ad15601bfa46be017610240b045032453b51ade516f190b29f6e7cc26755aabd20d4be75f2fa4c18303319edb00809152b33726b1e54c0f328c73c6805354925b43a6dbe0cadf00c9ce3b1d7fd9b47322c8b91844833250e0e99369e90c279ab48712b4e1c10c0456c754251cdae4cb4599843510be3a13277d775a3242a6232b1ca2979e6f260b3c4c86fc24bfd95255c765cdf6187854f0c9beb8cee6a8391f98475d6aa080a7a2c6147f70c2a9450901f705ab0ec23fc957619d611acc2319c6042e137496f51436a788334aa5a6d561a3e3a0937a37be9f7711c5fc6faa1024c434cc3e41a3865bc0beaa732c1789e7972f999007d4f7afdf953163197590e757a297919766428fd18ce1d531466a55109287c335bc26f946e06a4d51aa27b220001a46c2f4e339dd83511d135a9621c1ddf1083bcc9b24b994b4a3394df8ccfbcc743304383c300a9761859074a3d0e91cdd96a34513735a424238e71f42c328eedb1cdfb3ad704a1667c15045c534c448b429c474c494c7b37114911771d62c39d3f4763d881c0a21c074201301ea0eff13bb5df861ecd882a0350031b2af63572845950535e85fb323beebd613ba600702192d7cc1218309885ab9345ef32dfb757528229d73d57cc2328a5a86acc3180e392144c04cc45ca57573395ef38a95674b28ea7bc8684c8e6a81865a93256517be79fc456472976fea2538bb8b52a188cb43881c19ab47069b36968da1cacceab9bfc5c7985614a3fff7300e621e4865c5f8d30792099d3f793e58b591cdd87cfa36430aea876f30cca5d824fa29ab2b56ad3aca5d483c3c7ee90b4e028b7794592e1acae0fc721d355891c257cf821928104e1c994b8bc33eddf70c3cbcb5e272b43b5777b3921892ab198b4132ea4b200618b1e4559064d491487b1f0135c9da67a39950a5f13a1e6eb409c30957b04c645b052decc23a391a7692390de9085147c96c67f04ea8212c9d80cd00dc07b7d22826e01facca51dab91413e8cbaa24a66a00b4d2076d58c398ecf03ee56c40a1ac03cb02658e6240c41c6f06c174f3414e258a11478c7a76e05c156c1b164903b22991391955c3e75bcf0cc70d4cb79ea27638c54dcdcb1ef35b8f3caa26b0418f340597bed55d586981c77cc6093a889854a85132997bf706177099ee8b5ae44cc1f1f3c413fab7a51254490a6ac4175a99da866e5464283a74c5c300436ac1c7829c953128e5d17cb056af07b08d7f114e0be00f93854e09eb5e0be82a5a4c526030468f95bd82e08c2147736598a656476e5cb855e0c486d1fa0c661202a79b37357995ed445973959cf04116ed0c687227768a41a1b4f79b8080a740f012dd547403a30a36e62c9f5a1659abae73a165202122a330c61f492822ea25dcc22cb97c00a38bb7a4a493ae677cec267379c3a1b80ac2f4612221976ff4c7afc685283af88ef813a9beb73ef380be8a31c87135c6573c0d1d5807e63ca6f1418b947c1615233b911736b0870b766c9465cbb8b29573addb33f21a07cd890f1325c200545d5a21c5da1a0082b9c198158aa2b82cd5d94bf5718d39bac4d9096093c78a069b9210d305e9199d45ac09abe6a8033c971b2903874ac6408b3510d318ff4b464ef16ad3e56bd664cadab4cbc2eb1f13656c6547db33b5f529d253c85a728313bd36b9f09f6455b7594a10c1beaeb6ff178f3228defdd117e6ba75a34abb70e86f31fdb16d74d91e6c1b47a75fe6141a25f7ab9f875f79e0a82d6ea5cde5a017ab637d5fdb7c42646a1d71df +ciphertext: 4173f72cfd989bd103ff41f258cdcd0bcf3a68eb82c10fbb2639b06605ad14a7b2bbe670a38b3c953df61e7a3962ccd6d554fc12e8010bebf1a2471778c69b130f6fd4a205bce7157cf527cc7480e4dec2654ee466cddd7cc3b48d4799775979070722ad3a0873a38bb9d50bed48650e5c0e659c002e1a80e2c81ab18c5862dc734c15b146880018611651a4b9a498818fd650d8f160e7b93f8f669df8b1568e7248fca844e24113899e45a4e2f9d4af45965d2e20b98fcea2e74c21c2c6c8697533b545e9d0168a74920df3813e0e9631970427d59b16b52c4c221074cd6ed9f5cb07eec18de8b7effa7dac2be3ac2e75c2f394084e64a8bef17efba88cacec6b154f66a737d540503f015971d15fe8bf1b6071061c7d1a0713118f365aa0dfef865e8aa70403d9163981dacb6e9af1697745ef842e60616d9915b5d6e5279a3713b0472dbf0e02c9d3521d48ce21b47b531f942642c961a94170479c62dddb6f81dcd5448308df2defa52d2c90af853a55136c8b6b7263078054e24d42d90e24d78d79b76fc479891305046f6a51100bd553a9b37c90b31fb1dd905c420fabc6c3a96583010e5c3c95d8fe722a185fdcfa1014e454eca7eb1ab85448efa60c988ef0bbe8254e749bb0017e1def4527b27d288a896fd2a5372d20200d0a3e6b88428f9766d1a636449b0aa3d88e108638ad159810cc75a20611adac7c2f6402b50af48a13d2c2b80e4535c37e4c1400e3f39d896a578a035e922cd3a214a6d077cad36ba84186701c0b1c6d09051d808137f523190f538b76618750994ad5dda423754e63012bd1d0ce1476753eb16ca8d3af4c7fa329cf5de9666700f8a5a510677ffa2cdd590be997cbbeddd0a9e31df4a8d05b49f52d89b53055abed0f44a35a81f82e82963ef3a74fb1845e40aefcae153ec22d670e00b5c3c21d04d6738e9b3c36db72beb653231f8df2ded30772576011049d06e56f5cee436f02a8cab545cc55126fdc9a0e247263976b6d83de2f2a5174007f7f6a437fb02eebe5e2a616509d9792b16cfad57bb1af018a87f397c71c221761a3633c5d5f8ad69283911e017691fc76096656342ec0d9aa065069b0307194bf5d8471589af26f5f95895c8d5181f9ac05524d4425750448329b53b24fe6fdf3738066a4446522aef01d9ae6d800af8486e5287185f21f5811096996c00892695d0f08d4e7da2a4c019d5153539fce47f7d8d3618e7b5ebd3cb428a8c6503896a7ab1b536da764cac22f3571be53846a117a06e1d84d7b676c6bc7d0f51e9d356c05b29652248ffaf0b2d07511df249717ab8f766657ebfbfc57ffb521a9162d786ff4364bcb2ce620e4f50040dc829af95a2af4f9771d3ad297eaedcf41d54340bb17219996fb726aa9263ecebb5552ef87651d4b46c18610e4bebf46c3f6c490c7e9ef5352f5187017546ff2022c54a3fa127cadf3542c324880d653dfad52ebf0a630d9c992c7284b9bdde76b198d27ea99fc96c2031082d417b14834ea12faa69e310a30995242 +result: pass +shared_secret: 35f5517999e15ed842904d53d5b4747639d1165014ab77474c0dbc310e586186 + +# Official test vector 81, seed: "e3c41cca6f04cfe7732fd54de30cc5caac93e2f80e76aed7d24a962a3969c1b6a311459a3ec3e510e3e9b1e4291d4d7d" +private_key: 13276431f3634d420a374a0ecd8b81c035431dac244df1ab3405626490c7407599ccd4c146c5b79653bd845286aca5c7fc13a527784bc0b0b0171261409978a4754fb612203267804a524e81772ba34b99a20047f642363f928ae781c89a7374fbc0abb1373cb3485ee31a76da703a8d39c12668a6e0869e558612a481be9ab6ac8c00109f3a184f808b1be7566250cd36cb38b57771083c64cdea6fe5e9aa02f5cd1b6c08272078745424a7a11fece731fef736471674506b9bc56707dea19858860825a14fe820563cd70dba44b57932048bf50eb27b76d8405133172ea16a5b0fe77bca259cdd46414f13425616bdbc006ea23b21bedb23ea86a099dbc48b4746ad35830d694a218b0e233842566b9dcb18822f9301b8d7a6fc2a4555278828ab27bb74b1b3cbc19b343ea64904c35c67a1ba1ad4f9cd44a2b2887b4adad130ba263321469a4f50c6a6f06b29047a3e253a19e21f3c027c55091d7777aab2b955546b58bb212d87f9361154837460966a80881e967e379a1365aa96cad80613b2cb0a34979f6c1d00e7010fa2456807217abbb1df6849be50bef9a67c973bb14f8953e7597360c076d5290f0b1bca76f02d6a600dff97cf1df0ae59ac851c29a0f99b17759182002c8141d20166f8bf1979321c1a6234b608257b6bfeba7ef679b837d6a23673a122cb1e817b5fdfe9904b1a2f953906d7a585f074af3bd445a71b431f776008b133d6269caf16b306d444fd819b4d4783828266bdb13e0807409aebb11d867667522ea606a210f68d6288bc3a484cc4464706538712921e107885834b4ecdc44af3c866ee0504d191724e5704b8b20795b6520f0cc8f1d89ddc46572024294503735551330e887e6b71bb47e97aa498791b735733a8a81d962a68d32230f0c4403056b065b379a44ba61188c7f102511ac0d894b6457402fcaba82ff0c13da32ebe5785b44b937fc020ee1544b95228fb6447e862803c941705625e0758ab5d1c3e7d771780ecb188202b23972c9dca283beb4f3303064c922d8ec8081b9529edc163affc3f585274ab0143060527d2050b34842d15d1508afa2af069744d7620e02c2fac7954bea06a1ba04c28b0287bf71ccb809d7c966b9f94b05906b003b77a0730a787610340c600ce3b4f1ed9a4b5195355501b5720498ab185c75740f2184f5a16c18b7bb58bc120a030b5d20240d570545f349365a97bc387a6bbc2c001151adebc0375fba522b7994fa4a78ff6390507ccfb8b47e208b70bea1899512fb068a9db8b262235191f6403ca5b8517db25cb8b202085cf6fca6b6e55a75dfa7557a43116179ab5c1510f887db6a9c5e8ac41fd5010c11411d8f24529674a97fc666c565cb7469aa7c8ab943606880a9832dac41fba34f3aabcb1bb0050c66f4c5b53b6892a43ea98eff429f4f6206c06290cdb504029b29752cd75fa4df4a59c5919607616c074861f3c00c18f1ab27c190937fa9597c165d8d61281873bf1eb36bdaa9f95360e54f5b8b44542f618bc99077cf75c2fe4a04efc112eb2618fc3424ae296ba1ffb9a92726bf0bb7d74960868494bae529438c898ce0c95ae47415400aba6c47ca4b301a64b97777b7209039a2403758dec41fe4093b014449985121e134c925b37b11612a9c61e97d5863f81a83f903383a517d1ab1769921563b86069c9c20841481be7a75311cb1b2c74f4cc96d2aa916509cc24d33ca7906aad07938e701177b42158c19ff3040389894f5d4c9cbd608c8234cefac9bf75fa177d5669f45a195f420b189bb340ebbba649996863618366766b7c990c6001a397b00b71272cb1734adb60a5b1523fb46be42752eba4bad8d6b008883e2697747ada77635174d5f7abc89157acc61202100cf719c9b8c5bfd7409fa95641202384629b925c240be94889bdf96bdc176e4dd3ad75f7b2e4c2abc9ea8280f07df64a162d016db3a634071944f6468e00aba03255430375660bd2c413a0b3cc530de305948d783afd0a41b4a202fcbbb620d9bd47b1181859b66f922d0b5c464f71ac5682829c8c6f4875bce8c37c5212113cf77a8cf480660b0ad108a0b67c063ed52bba442567ab31b30858cb33584d5422ed7427bf085d163005bf182c90c96cbc89ca70591dd0606f95dc6acfeb3315274f7c4937ae511963e90e6d03646292743a4178a6f344c244194f989e1c34be06a09bd5086c73992da8528caaba4fbef1502c1abb01b145a7a825a971a001055e2b1841725cb06eb23625bc0d99f89c1998023d760db1960a751988529628b6aa54308a3c895688047a003c089ef4a3232fda6aea0194154339b75a0a25402212211f3eeaba98cb656925c34f46037a436f89e01bfe408c138601e3a490675abf367194b377158f131b12740636b92bb5d184c05a23cea0c66519b2e8b094610655699976538471d77bbb3a8613a3ea1ee7b22642d63611b498e302540ca71e9b5c1aad6bbf309a13f9ab5eb57a5670fa9244280867ccc48130c74c50219da3168a26a52001713ee7b81157a6392199fdb4a56631b2d17890e6b0bb82051b9a1c85ce8aa92a2557ffa499c8910f7e98c3b4681ebe6323f4794e3e7324330a710b6a87186c36ff04602fccb97a7842104547264437921b413d52229a1555226a3bb3f090bd8cb09df92f4b4093319c434c04a773acc094bb205062903adc121ff6c178aa5d02f4b401e2b43bd79966d83a014bc8a8fa8347e1a9e8c6947134b837f019b05124279b26f20414fe326f3464929105974a853961a6b55ee90ba8d730be6a51fde90b4c23753bd9728077b90bf1c656c0738946bbbc5a2d72f95d876437c659b1bc663f6ab2b9026ba0401ac168c05933dc0509f7390ce8a024a3a1267217bae20c0d26c9d824182bf67ac60c0b121184a42c89da7a1f2de023ee6c291dea37da360b6f912eb95727e0c83efe0796d603b1c4702b2532af8d34053e1c70f8b73d5874578b3a2a8108b12e603d8cc1637d54bccba48f73d08f63c12fb8bb2e40938456c46209b262d8f08fc9b576d463329057a7fcc86652008832712e15e31eba79cb33a58262f822b9b8abbe8c4a025729dbac6f4df64f14c9959993004e0a4398b7c1e049120d404fc2683d65e85cd279b8d9e9595e995631f3469ca25412a54535c569d80c2a09117733f529bfe9a9dc766c8da35bdf0b64d1c27d0fe31ad736c06a92186034468539a3adbbcf0e67af4e797b63a0494cd91d2b9b89f8d486236b9b24772383d81aaed73286e5dc6e35a1dd0121b0a362d8c94022a515340fb2b71b8aaccf14842a6d4ecb713612f801a5044147fb9e6987ad3863759de31e11eafeca9e810796c34e8cfce9d59342884456007b01ddd12edce6d10ed87e4c +ciphertext: 6c6860f7577d496c61de133295defcda33462d99ab13f9265a9daf5a21ac8db6e6403d0fac8dc4a8ad196a93f7afc736d23f2de65a506c97b27a3aea84fad37e113607e5883be0500719746c9aa8a0992e4109d0009f350e44990117f9b80083ba57bef99d7229f4bc425026b522eae09bb2c45dc2c14bff8c65a51b624874feeab6979193f085b7b6900aeacb63a2bf5fb2f81d0b48f07d392d83eeeab6540c9b1d4ff4b3068cb471bbda0d9d336ceaf458c6f6acc5c5bdace99ca483a310b6839899f421b15ada7520e35919b475128aaae3b7b027b872c5e91bab596edd00fe954d06e3e8fb8cea0ce36f98482d55688fea29c4717a07d01fb4c5f163cd85908c548b91c83bdedc4c695e0929b630aaedc2146a099d576821cd880fcb1a1a65a58c14e278d094fed63c67b7c6994cd9158aa9e15990e68945a679534035d06e1b58012fefd73461c0f41e0c0630f7f89fc8e7ac1e8e497a2dd15e3d82eca2b5eca09ab928acebb08854959ae39a37190b4e4c6fcf1d7cd03772f10b49e5662b1237a58b2b11f597c51f23c1d105896952c4b6ab6cb645758de8ed34458ee91a8a1682a8f8fea432ad3690f0ba73f980e4ac88833b5b0a85bcba239ee176f00b78915ef7467dfbd42fe23e06deccb70c3247382ebc16b85458d284255fe85bf0544977697019dd417d7577542541fbc4633cd3ccc979aeabab5f9394fc7c7ed15641927f2d7ed87f60e7306dae6ee40667ce715329a217da1334acff5425bf643c1174e9927ccfbbeda133fa2e2a1c9c7fe912f981a4452a3e34caeb6a9e898368bdb40b4dc40915d093e1417c330e024f8a9a235d21a5184a5eb890880eac4051630bad9664ae4927e2e2d34a408de897a2839bb3e43e88e4f078be3c699c7527b8279579807c9a06ea58f32bdd5a2bad5193bfeec0cfa62ca7afd99d9261342e4179449a138066bd563399c0b35538ad109c28afc5e16b2abdd46a930246b215d57bd605bffd1cc042ef447c448fc4843b13d4608876c85d473fc5a663b2112692401c7f833680766839350c127d78ac462c6fe132fd9b1672f94e9f08a18b13ab344b87dd947a8cd9dd43f805e0d8d56c1d11c17edf45c60c1f26c364df7830411b3c96d55a1586ca15220e68069041216a2eb7217113192b518cdb235272516e766cb7b9d7a2ec1a9c32a3d2c885887cbfbd4e893a11d68546419f1c0e0b8ec69a7c574c73bed6165e32c14363dec9bf27fa2510dcdf6cd0d8ea0a7c05f97493777f9ffd69287e0861a36df8e6b8c1b28513c2e1c47c8aed6797b5e6b345df7d402b64e280e951192eb18f1ccf76c49a18a7c06250e72ae7b5f6ce6bbf86d759eb9f3a23ab6b384dd584aa26688c838ac7da9ef292b927bb7df9b4db4785e345174b46231868f70827615de884e8e2e649eb5b9c204ae097feb997b05d9837300b94e95f4356414e0253520d2b49ea98d97ef119f5423a3de5224e33d853e67eb0eeea5a101aa5c5145eaeed835a6c13d80c25b0e551ed2f357a9ae8b1 +result: pass +shared_secret: a7159981a68244549b96b27991e1323013c353bdd9c8d6f583897c35923e87a8 + +# Official test vector 82, seed: "373fdde922cfc416ed96b444e445bdd0962e8989f6c50adf9912a89937c57217d3600b06c95440448e3f601ae69ca5be" +private_key: e5a906286950db6187780184cc302f14a9ad2f7a382d93403308b8676c20cccb52347a515303a2bd15336c0b711b3a31e8d0cbdb59bf42633823ac1df61c63633171282b537cd1a19a80160d97b9dba7322d935577031c081a035890be315b7a4275979691b612b764111ba6ac57afa50c29ee436af02131442c5704b585c663935ab698dfbbc882d23fb39c75370b8c199cb0da26be27e8aa6391b5fc30bdf077490bc677d6e631af504b9af2ccf7939536d819455b91ab172cf01639fbd47618b8708f460284abcfe6d21371dc3b00e579aff432c9417d33511d9a0170baa0a3695004edb18599118146d83ea548ccb0069a3379430dcc8e3d728eaea7433ed4a704987624d0994d454374f9218b2a08ec20b2b216482a1c820e8c5ce99413dd590bb042c9d294ad98408c407b88cf6b32bfe9b95f9a9d45a33184cc8b79cbbfb379639c9b44a128c211e700a59aa4ee034e1a3375dd216ec3e2447757c70a0b4ecb6b1677755c327914cc38b425925f9f910f4f618cfd425e5f55c4955b14b08c64f976068daa8e711a3d00ed0e47e222f201891f6c7c52f282a4d471cc199e68fb9bb8bc81766a457a6ababe254c4aa96546b96f56375e68c9a713072c5ca9b0d0d36b1f1b663613075e62071f97c6c2ab44e98a76dc767fe1c0789ef155bcc976cf1b879f1a151606b996225abf147e7cccb615243e0d0775e339c909e93477b9b66fb863e726a4f231cbb98435368abed797a00db8b4dea236e75673ad8b857206d03c50b0767961f67ba0b58a668a02680f57372cc8c175c6cac858497eabbb840a5d87389c7a623fa5707353438e7a4388a1c34236294370343f90c9b38f4ac28d187bbab21c3d656c4eda62dd8127771c8038b67c80d58edcf81f526344c48b29f73a5197b0b51fc29d19396b8b7295bf524d38371c71013263c95694138a27fb56670101b0f06f6b568b4c05c486043f53c44f321a9bd8827312e5537608b5a2d7123971081e8bb7a05ab1336a2b7eb487359bc8287c42add6b72e5635e9ea9455552eaee4c92812ac32e254a90669cf6728af07763fa3ba74ec0e1c8090f2706378bca30fa69c85e50a03e8326ea4917b6515fb887d3601c83c5b4f520804cd401d0c67cf229299cee141da094a5f117403f94465c62761ea05ed1016759c60b14c352b41c8ea619e5bcb167a851ef8842845abb4f7a6ad75fb610408324ea84c665b36672b5e58f985c3a45bb3f926f5c82d16d519303271ac83368d28b2dba2083350b6205c718e2bb4aa1518fcc3c76a9b02d678732b4bcb8dd4cd9c2526fa919ad5c9bca0c6171c1a7547772c957b74dcf877b1f62921c7a17a7a8382b81f44f2a6cf559b761bb58fe8031539c02bb3222332513921411c894819a2ae856b65c1c3b113b09a6ab06ad6033bd79227aeb397d90ab3cf5985bab7c826931184642ae25755f79667aee64918575118349ac0b19963549c17f71ee14944f98b5eed708b2aea5a305458f699505083bf54ec70b80ca1287715ac2046edea5ed722ab14fb8514e67e45343db7c91324357a99db343c735c918464b532aa2d9649d33a1cb38039b176bdf69470f1a1839562b94b3b7294a77c72cc5686335a761609caf862810ba70e00c83da3cc1c208cd893233c8ac3247b013417cecd467e9cb87280aa13b061bd0a661034ebabe9ab6e7a447c2826af3cba6798270a36f7431ae9119de2245704110d159aa438a6f1546a39286a7a179c5f286073d5b944ea2000ab61fcb9373a4a94dba5c9baa94056f35ca1810106f2ce65b579c4744f94955db4730265053b812634eb5156ea819069f6371040408a2036019967f4163c1ea611c02ba295a51581644dab07872d1a5b21a32d0ffa349e3739d961a9e9bc07b6d8cba3b945be491958813600e781ecf54912d70e37832e05784c5e12271a5aa5d628233062305a28493bc2b180d802423aa4f75cb6610c16e8798cec72253798b189eb217238b5d063224f78114715818ac4ab40d34042860bee445fa9b1b02dd5a7c7b6bd8b03768e7c38282806e5fc7a93a9094246a403111a39bbb89ca4ca33f9b381fc8d6447450d3b4f6c794b565b2735f8014fe35e78a94780bc1557bb380db47d25791b1283094ce08ae4ea9961882d134bc5579aa9fb44127e2670b85001d58a162e38680d3c8fd2d3517cd4b36aba9bf1930f3d4c067f2a5b4dd702cb9b9e138bbfa91c0f49a86ba283091350a2ab3c1f3c75ca20a4a160318cf88849ef2102e47211df95a2fa325573f60ee7ec5e70d3b88d291cf9110b9906401968462d2ace979a825b088f7c2b330fbb5f15b1b9f24b84a646cc6a9b27b03767978268cba750b5429823e7ad3a00a4e813052011bb0f47cbac838a489c568391c7d05457f4033814bb9d52a011ce787f0df2ab1bc885e293bf23900f3fa019238b7447561eb85b296930232b175379f289982312790bb65743cfe65017be280063c19b033c19eb988d5a827b64777eb8b13244a9b6763c63523a6af78672b652ac38f33f2a870c494b1dd34a9af239556ed9412a48a7b3501daaaaa976daa971c1565f37be80c33fd3126c7bb3aa09f47f4c9c503e2677325418ecd2058fc7518fc247b36c0c8f59427bd2311ca493510794cdb734cdf69c6b1a9d5c990424d819f35ccc8750b4750c43394605bb60b7c4dc39d8f71dfdf1c6da319f6d671aa170065102086665707b95ca4d241c26cb4acbe928d23318d372aead3a99bbd075b5186abe6590cf5278bf289050c13789f82476620472baaf258c78eeb7755f6c6b1a113d91da945a837f0c84b353f9aa1c223404a3c071a27c84a6ae90d31a0d254234a18656095bf989456cd9aec6a837df6880c9ba79476431929c9b22d9bac09acdd8d94b7a884e261037f1bb5335f98c4c491fece5ae0a485611a50224809d48aac84c16957221924d3c2d6500107e71bab5580339b0832e0292b89a3f25bb40fa0445f2b3122f97856f739aabd568d1b0851b47ac947b25d2da6910d05b44e26088901d487cbdf2f782c2e35193021501b2cd264a6526b4aa6dd439502601fd7b203b088361e6218c1b72854648f4023199e5aaecd51a33990b74e4366c07818efcad158a56ed623f63c20e5ea3c519350cfe16b0dfd3af10a45755641a388590eb95b6e5158ac5bc4aabe686140b981cc5c2ac896945a4be089201b56744c439630b56a15b4a3591acc88f3c4680311c24d80b5725bba86cdd22a3732c6a1bf7cb10f14d57ee8e5901e46b97e63848efdc76368b797da13cb3f23ccbd9ca6a75823d1ba14ef03664560f397133935103ded2d7480b9911136e2681df2ef881b51a092a9badbe72c9772c169808521c47149578621e28 +ciphertext: 5c2e0a97eaaca1d05377bee9a9f4cf0238030f6540802e2fae3dcc7911077887a4fdfd6c55272b80659dd86dc65f1f276ce11b1bb9e7967afdb9953976cd604e988aa1407896b2319618e7552894eac35c553ddf20e591510859354090d68b2665bb15cb352d4afba522f3eb03fd09e30a27c946f738e38eda2b6e8499413644efeca48031edc811f162c4a419eccad5206dfa59e00679a4ca5d2c056167ec2405c5241ace69dbf87b4444b213583e7996a4d349e32fbeaf611a22ab7631f2e908e0e02935899f248f9c2a0460ca4aa21e7dd79b5fd84681d1ecf7a951ee903ec1c4c92a1e928a09755e43fabe1236d383a6dfee5e75456ea6ffe1f9dbbe61df6140a432b59d6bb4a98626a62b581519a8ff93e360753f08bcaa4d61dd89f0fee8b201e9046a2afb4168215d65f097df589b12b8bdc469dad42ffa176efac5b903abc65df115d550f30fab8ed459660e34b49e0725b0b4ab2f797ae4cf6e7ae0049c539953163b040999eac7dc13ff238565626b8efaaa2ef0874dd044afe71c4c7871610ad497b82e086ba9ab31af88187393e4751fd85f5bdaa13841df1658e11827d44080094c95f3ae409bae7e1d9bf337338eb4ccc86f832817a12aeab3dda8a83433bcfbb15e989916c8dac1e758368f60d515f475d6eee6545ce33be1700e826500e302acf28e7eb8f6ed90154cf0eb1be1159013fe663ec45140e73f079af6189fec534535644557ee45870e683f040249fdec1e191ff1ab576569a2a0af75d5aac79c20a1f27b738a4d96d95dbfd8bce713031631a89a7f79ad4e9e78b17521485d07d5610d3b3554df410053ba70f8663cafcc2d6e50516240e347b5ff2e554567a7a8bcf2efa694193306727f5bcdb0c69dc32ae6bc34d555a3f801ff77c70f9bf6fa0ffaed06b1ff713c9de0502be15da43c3e7624f6256a0d59920a7f3ede109c0231dcb2801d71100b9ef431a018af4ed9e882c2df9095ce31443a962e1b39110ebdfe9ef4b575fbe5ab0d5d1fb309719ebce81687e21b85450768a4b074e1ed627c7bb2d9083862cb904a4724014e9efc5066e4cedf2612b66577852a28bfa879f76d9500791a87e884d3e7b434682c8a3dfb6aa9336a5dbe59da7091969407130e570151df14fed6a5a217bbdda35cbe20354292ad625ec1195d936f7692a123f51b90208e289886473d33cb2af68318059c4b98c9c9bb965876147e326a0d899af928fdd439a5283b550207c15511b215e0b8974b57d2bfd176a3d6b5c35949044741453576dd5474fa53f81919109c059e2f068f91109dcfb95c216cbf9e91b670a4249f8d91ca4e900e5cf8cd41096cced87c9b0452b476cc7049de394ba7d44908ebb28362fec85b08660965665c6256f63dc6ad9f6348139fcc7e989e664819cd46b0b788cb25b219da868593aa650903b6a5cec193c3a494303363e170021907c41ff4bde1ba4665dbdb57daa18c7618ae25a0af077136113512c1fdcd894a59f1ffae6d0a2631124f7691b5ecf0fcdf01de92d27e +result: pass +shared_secret: c4041a29c5b744e9039bf5155cb3ac0b799356829557a7aa3feb4b3585e6cf62 + +# Official test vector 83, seed: "16bef67f7ac3a755c59c816478b75fcc16ce5844db537791accd1ebd49d2824b105fd2e970f728c8f0cf16e439a9ae2f" +private_key: 2556bbc99ca8edb774f8b427981046c94cc902f20c2c9b1eed7555f800aeae621cd247555b383508a8a601720695b5469f21627e0aa9c7185557718de0a16b920454a642152c779be09307dcd0aa6fd97909e7227ecb7db209aacadb7d1bf5ae03cb2d14517861b2be3e0936b47b7cdd488e22956b7de9ca14b52e848c90fad497f6d1bdb42c799d8a9b51f0c9a3e3835181a2d3ccbbd95785e1e3930b410f955a311fa69ae39b9a240c50c221c61d687853658c611717eafc14f8a27f8cd190ffd433d9d863c530425da8072e467893c7b621260490f1497f4470b43507161b23729a5db94585a9d9c83a9554127ac9b7252ab4e100d346cbd7a496501979cd0b5317ea39adf970a490aa9f2b7e4ea8122900c1c882a0cb0162f9256cde1126df07bc4a30042c6587ce0b3102673e405b623416c06f9abd9bc62eb70cb794844a6a428ce8736ba9364882aac621d304b98799aea35287e023290335da841a51e4c1b2063f1198661a0c01315b2602712b47d16b5f2b19baf2a67fb13333dcbec5d9557ba4a2f103097f14be6c276f2a195a57b9b28b312c6967a3334851b075a7c3d2ac74d5897470286aeb4b29982b002d5751528c3ffb488ec4661bd58b275c229bacc62d85b8b8c560a02850ee24aca565ca30168721a182936ca8a6508226d64840903038c339c603233a9046733c0e15e016f6f080414734903bad3393c5671c5edee3cd8db0cc8aaa4927c78d51ab2309b1b053d700280a0bda9a5d268ac47d746ebfe01e6be91264fc6a180c1051a5a87038bce12a4d70930ba259cbf49039c0397845301f307922c763be3bf83fe34147e319082990a45102a1d328a0e90a8e56670577c14ad53426ce36b863e501062a5634034b98da407659b9e8f3a539907d511ace034ca15a91bc8ed3715be3c095b60b8332b6c068663d61781378c9f6d352adf794bab90ffdf330dfc77e492b6ca5bc53de21a81ac93db6b520cf3ab8b4837729f101b992c7057030271b4a7c6a7c61f399a2302155306ed3d8a0336c8081206f6dc09cd8b11bbeb89165321660a217d9f0bc770b2023832deb6492e961184827a2bffa27c13ac42844b3fbc14b0b96946427912432196e95ba949b29265b58fee38b93232afbaabfb1482f2307bda7a3004cf74fafba6c464840ced7bcd38aa764d67bf20a88e9a99549fb66ef1a53d1ec60ed744632c7875299b056c8c9375c6ef4f147ab9c8b1240822afcb68f028d4dc2be9da530c14a552acbac77d914c561c25284a9a4dcca04637048f29a99cab95117881da8404596cd0a28004a47a77f8623b4a2811ac6b90e5069d7dc82c829abc4b14ffe251507bc970f702341e382d9524672f88f33e16814977225659c8c321a0810a523d44190a7947a9b2eeba262fbb16a0ab35100385c238c55601363cc5996fcb46454c142c25046eb507d4f6287630babcf485bc5f19fd99051f12a3e683a7d89b21c2e903136b674bc0b1490d91548394738c417614077897ba9ba577f8ac9b584090d32973b4261c05385788be4b63783728d59cd5539413cdb537826aef3d304e8102c6a3b2e72e4185292c35ab60da55acbe3c6417e179c80f0024ef5113a2c42a4b21fef3306a34117e05c4f4736af0e8cc5ae6bc3f294188ae5397ef69f26303f9592a694e12916bb56e5aa43cef5c183e6ce00f78ef423c3a838ad2cd3c4f68c142eb23dd5f774054668eff212b2bbaf8274c7ad10cfcec5b10bb603ec6ab33c963ad2a22b23f7412f93715a3b0be0b1754ef383c2d52a5a16a22632c88a9635af81909d347e64715806f93e0aa26756b25a8f5984f8e298abc12be53850b83213960428562455d6a7bceef90355318b5bc78734864d1af0bf1393849ad715c711a5226065586b80f1357d961a9ba74999c8f47c7583675245749bc56152f1428910324f2706c8718208c4a13158360365337642279f5009ea86197109b78f0a037cc298f3085c46f68aab45379cf59cd504a9461b47268ba03fc7cf7b1aaf9d461bfb3a7e68b396419a44bd56462e7aa2bd82223a09c155d26dff3873a6052472d6796e24bb7daa3583711cc435a9b3d3463812734b700614396a6dac3c2d838ac103d04239c847241835768a2bcc3d6f8567f6c998b4e7ca8d30a81582686f211936087d3db54972615d4a9b0e1ab1765a18c753fb9513d097322154ea4a3f934c8fff8520af32ab05f26d1030888c0a1613ca74164793b5f798ee3c589684bfb115cd6740bdd5141f1a17393b191550192feeb3c8d2c0b4c37790091312fab615c6d194f076c49d01cb97190ed9d4a6bfe0957047933e2835353085ef611c6f9c1f86dc4366c45cbe2281b0910ae39aacb271c03260648f7c955e99367d1b130c85289d586272fa28807ccd909185dbd5999af47f79da95ccc4859e8a84b2983f0e9693b1dcb506d7b7aaf03f158759b8006511380b3aa4b46cd060f96c0e16060161698f26e073c2f74e9c5b31f9fb4df5dc0f3b0773470bbfb95135c39199f6f281280480ae88573284c44ab9b91f8942ad423783263927c5857d5832a6e1576c6a59e7b1a498ac2f5f71c51b4c9a36cc4d28c042dea588a4756740782b07cc245a069d42245943977780f11eac0c8221f9938fb05a5d096401d2a4bea8c9f46564af831c907c4fef6743ee482339212bea730113a930c0a5649951abba2c6a3afcc4738580c61a4730aac4dc3c84dea158365cc6c760b13ea10b194b2539a55da5f01ef6c55213815fc6479f1bbb67d5754161d4064ed1247aac8edc486a8ca1b311fc653da3be4fac0c81ac0fa54b99030ac2f824598ecc699a31973ffb34648183cce8cfe6495723975c7ed7cbc5281811462cc1ac48fd9c5ca3da126b8125179b651a95b7749bcf711a018eaa951cc078aff16bde9a2f5b180ebee3032b5b2826ec83af147af8288470b267a97c5ab0244d3fe538e986000de3807132937a811de5228bfdba209e642fa3095045266e11f46e99f1b1eae584dcb8805d7455d3435956cb1679b8afe26ccfa7224736998aed363c0d82b1d23b339a16abb5e60dd447bd78c80e6657bffef9bceb18a0c8e602936ba32d24871d6470c338921366a009fbade8f4ab940bbd22158ac5201f09157d0c010825b290581b4108573e720acaf53344fb876db0bbba53d14a26dab409f137535a794294814e2b3f8f42c09f323e072b2519588342448e24a769af363293f4c8786ba4b70330bb80f37de30dba857dace4b8291ecb2f6ebd5a06323b11a89242da833741e9c468302cc5af214ceda67ff8161b29bc300c4be8e1a4139437aead8a9ede3cd4ca6ceb14f7662be0c42779459f69a145c0e2ce9f0bd9a0cd1bf32ed5694cc9ae32 +ciphertext: de36243ef4f99396bce0bfc9d8d3d2165aaf7cf15a636550904066b0916c4c877408c24cdcbb9d976024c532da78c1fde5dee90f86729975d698dbbf24c908a81eb44082e49a713a2412352b90f4ed6ca485def0dd5dd122fbf5e8bc8b2d2d1b66c1cb06c9ddad615049b66ae4d8fa24ce3d78598d9a973ba08d5e9e24328743e887a9cf96876fb5ff48ff4d530d4516f912d5840d06efb6664270bf8d2d5d7ef22d637e1b5d47728a6948dca765b79de8d08b151df33b27560006026350c756da22797bb886261060cc95d1adaf05436670f6029e4256d033415d759a3da6012a6d85825a2fa925751cfaca26ec701629e348ab0d5e379fac5292284008e15959859fb2f8a9e137dbd35b71cbf02f5abe1a81c65b745aa2f9f6904ffe915072e053bc7a6aaf67b441ba16f911585f256b0f6aad431bc76193305f4225b6404c9c2336afa3f1d2a8767fd1199e05af964df23a027310cea75db011dacfa4b08157125f883f3e6c00bfa3328afec8f1c638bcc32484a3b039ce3cb2c87677166ab56e0b938e655cc72e87b2fa94a2bd28e1ec65b56cc684f67188a46cfaf2ed8adecf6b9ad2459393d56dfe2d7039467a35d325f52da2e26b436600507a53eddbf9323b8b465e7f0d1921d769ef1ad5d481eb06ea61dde7d25a2fdfaa33ad8028ce4d8275eb7b82c831e217d8ab122526626bdcde7d8208e648aad8cf643b11253b9bd2b84504653379cd8afbf7735ac82814a60e829d20dbdd819b23f840bf802d0c285c418b6beb444d4d916cbc9b169befb6f19bd963af3e3d9c66ad35c26d9adf5f3b36aa3e5c1dc105344d40c2865a6837b61f2ce00a2e2b80d22f6a696d5f25de6e35cee2f3776b2534e5538fe5c27fa1b0d69cc97559d19e99260c65306db59dac203a8d7fccb1b467346cb5e4823b1a0eb5d73890eee213ec5b4dbd16377f23008bd795245e159b46f911b985fbfa0df99b33efd4aa9096bef2497794efc029d719e9331a6c042f4e08f5f4f2cf17a1dcbfeee1e7948b5f57d7a0e1cd26abc8a22ebf0eff45d3e7c16b34f72e670c139b92785fc76787d92e1eda38e4470bb55456ff37418a99c6aed43479152e040e2fc69209c487639ea915e4076218f6352285a09582275985c6ee5d49bbe6e2d9d1b18a721e42136e164437d96f2a134652ef092f2e3969efbcd394d7f2c99f1c12edcd4514be7a9ae7f5ddd5b743c819e12756d2754502052a680b24528df8aebaf96034da78e5608252ca6975db90973a65150af5da69b762724660476fcb58dda5b117b6c988dea8690bce26a36c278a449919ab85fb9e79df56471ccc6118912a27f2447252e8caa25acd52707d23ea3243037b1722741f1dcbf47fedb9675e2914f631ee01205e77ce05ebdf4c9f3a5203bb719c4efba827ef57c89c619e0d682e33033c2c05ac04c5a02042e0f6ca1bc9d92a7e11148144d6c98101868dc35541ce69089f0e02ff3e9fce5da3d4088c04ce8bd380ff62118a2513acabd71791555c6027f50690c6967799 +result: pass +shared_secret: b8441852349193321f466ccbd3afa48bafe903288108312de26e9bf0de9f680c + +# Official test vector 84, seed: "d0611f9ae5be4da5d7eadc9109944348e716cb3daee545721eea8c892e7831cf2e54603146454cbfd92387739e9a78d8" +private_key: 76c9ab126b3d022c31745279f6e684083a496be39aee74bb599a8b6de9940a26535a2600d3ca572edbcc37d721b7614824a123b4c6c8a01a0568b8ab61045c3339ad02e68f16d16c17ac572f9ba77d279d38636c9134c501b7c00518bd0e3293fa3a1612d16488c7bcc4cca7fcb5595191cf0d43c2974c0d8551a72d252896a8baa7740c419a1270e6b7145b053ff828344b30d5c18be9f2c633799970c44bc49c2c485921b96ba685ac1bd9a914bfa026a35bc1eec70b8562c9d825a4c7d5a60470c61244c88681af5804b587141dbf72bcbf7604a0705d655b00b89b9045c0a291a355ce68a07f79847a181401c028590788b7a2c3d95b84f13993da06556a240b16887b78e43c310928459312f196bb04a7bee1e0969d72264db1ba0fdbb54ed8c49c3bccdc44a9d4605db677002a0cc84402968cc7759743bf2ab97f0a4a67d95b93a5c7c51ff91201676394e69acc8aa6c88c17535cabb8dc07acdb239b848a8bd88ed0430e3381a6a92b9ddf04955dd06e01717f9036920ddcb33e017fa3103cdcb955b3958347a162f0db95a3b2377c4c6027353266a91876f698ee53787dd73bb9978c7984713deb0017fa1df2b10feef4c7ae5734ecd7ce2b043793b1a19655950799243eb493eac103fe0a174d67b728b7097dec31bf1188813b16c1129a27669fc557c0dea7bdef1303ad98b81e8665ffb009fe5440478267ab2310a34c3f11c88ef8fa5736b91cb2972d1ba772aed1b9fef64af7e547bee627fd9232cec559d4ccb36e8702379231ee5a604cdbaa53db415e0588958321709cce82748fdbc257535584d8d89dbd7cc2d857ce3ab498c31b74fa305d8b145184a906b89a28a82b071d8bc4c52623c306766a150606b63021919759c76102503c03478dcdd7cddf71042173c91c70682ae684fb488f6378678ad114d8e6c625087741e868f1176cd09721e9812d7bf5c63e21974201d0f2844959c898581994ab664ff6784601268b4589c20b4c9873e49f03856debcc266764339329b327e375406a54a0b4c89439116fab279d6b2b9ad0a09ada94a1d572ade29dff802813699026732c30167480cc2230283801bb2baf3cb3cdf88e18f79852a13269c328a555955dc04733e48582f0768f40168f468c83060d0f1bc735ba197cdbba40dc50cd38c53c2a3481b763935b1071879d77967598b2aa8aa1ad34863a6db84dca6628907723f9891a4434339dbcc19213bec2463c5b37b82bc40821f5a33cc391cba73e3c7aa397c71b6f835c29d70c226628fad2ad7014345098a55502a6bc75003b449786b9534ac31e8b6871c7c98be6ca03a974a0936c4598438bfc953b691771c93b83b87579ddb6bc6f5721e2490fa9e0b36bb26c7607bd4bdc003ac9c2b0f41b7b9b5fbe9432b9d7c164d938b43698271a991d4a234fd1bbb28b07b5b5206fb75b4ee75bb3a28539462c01cbceb619b3e2814e5efc79ecda14462b46782308a5e61c2696b71cf367fa421cafd1c0af5bc6b6a7bf07d3b504c05c57f184700572a777bb0c32c7b82212d6c783d9696e96f11a9af791857526be109141793c7b92823f4b116196b8695c0b00a46d521b49241452331a4edf2a56e0264505c0682e248784527ec73160954a18dab4986fd146767bac1506885a7abbaf203fa7923cf3644b146a7687dc0f56329e3c64b052db6c14e3211cc560d9a70a1ba641224b2eb8e70e44b25b4b346f3037454aa69744d1777498c98ce741ac1008461868839b4149135b41817d135060acecca5af744e982142de574ecac5f1432a7d907628eb75439d8af02d37e5181681f1b249bcb22d52961d20458c860ceb3175730acb9b8c8500dc258fec13677f40506bc76f8eb31cc91a605e905ee839c3e0b771c32595a3238acc079fe6034769652e5cb492da0a3e8c0cdf13c899cd5838bb46a27e343bc62ccb6294c1619af96817d77ebc2e1431f997566485327cb9331a262153cd31c80d939d473b81feb0910e027b02c29cfd66fbed3cd09c11fa08744b9e0b62dc3093c2552bc7a770a0550cd601b2e6559851bbb5d8665865555ae510c2df9637c07790639c0af6b4bdbd567b704c267e6abf2b371f580686a1910bcc02b7ec3c08a7aca3fd121cda343a61c6c995742159cce5503b4996a7a6fab9e8dd5713bf62f3c0792628ab621741034208ca01c6130d3a3499a186fd69db4b3cb77417a12992e8e448fb75b73f4ca54fda42b2df2a4f9e14c39424bd1592b90968434eb8f52a6a1438cb7e589740c8b9b2b6123600b28ee954cf0d18dab1bb3fec8a0ff6379a4313325c7011f4c7fead33c8fb543c3c90b6ab35e01e31e2dd4262bcc92ba11ba055295b3f2a273620576813232876d1e9b18e22639e9c3759eb460390bcced9bb0e368c6cad846767c69349c59fde27405d8ccc900ac2ed762b1ab6381eac33f14aa27c047e5a63921030f8ee7055df00f7cd353bdc1487fc0875746b9deaca76fbc70ef5925ebbb994833a7eed732235b06e6ec6b28217c7d9a86a5396c80d43c22c56c19570238c70e7a7c2b6a77bca45785ccc31d8a880be379b05e45a1b9a8b3b2520826f888a8a025e28abcc4320bd1e30fdd17cbb3018a7a784534379c46639a21227d279b61da608bdf9bb9304b322f103a6a762db152548f192534a94df0ba1b2c97b9af8202dfc646a84270400cbeca95aada593d8f4719abb6cd4a4699787b92d63279fe9bacc0a989a59cb0ad279a567b8ca9536e8107aa7b81b2bf7730b9f4a470c8170655a0842602bc4610f9e7bbdc6acfbdc4732e4266083c9c91d41ed1f2422822acd01bab34c4789a63a700a5a135d65495841e69ca2f5334cbb1fc4c7d42b0f53bb63f888146163a51759c43349377ca824b32091e9b9c30e025981b82cd23aeb5385be7f398aa5025e87b605827328ebb32d6682896298f652243ebb3b8a6f759db824d3f577cfb8aa04627a80a03804039478abc2a627779d1c87fb23453ca254fb51c629f17c1edc8cd8c71aafa135051320f81c65b06711282ec6e7e4b021eeac0c3fc7ceb4b192897899f6c145f53bfa2d68a5b583002667d101a9c7e721f0da0711ca79df954126d9199fd6351be89225cc52d6be5c906860f6ac81c56477cd34c94ee43b920eb6cb62bcf27e5669f9160f0eb2ce7389b8da47cf8b22f46452961457dc39c54fde66a41f95cee1ba87682ca6342ab76f6bc262632282a22293ba7be9cc567700b5c13ac19f126b16a43bae7e4af067d280590ff759d4c3a502ab563080dbfe1df14ac06d254fc149ca4d94813f81c792060502e09a88ea694c5de863ce6a50516cacb1c3f44bcfaeb2ef44d2f608621e831187ce79b2d2f4a20f1568bbe76b0d3d5af36111714 +ciphertext: 36522827b08eb3be3116df1a5c1d91851520ee9eda2a3fb54e3258d536e7b5345ccf7ee7c44e8b141a73f6251067f67090cddd2ae032447a612c6c5ddf292e1cde9cfd07f19187c2dcf0a8e5c169aeb8fa4e9db1d013413e62a7e42f1ac46ca3475bec9f8d4bce5805e4ab86d2192ea38e9dffcad59f45b3f27785d3e7165beb443382778afcfb1282f686a2abd4764a21422fcc626baa1076425e3f986eb51de5ad135cdef25dedc61023ed178a90ae633d1374eedb067896a28cda873243eabc246d43e60eebce06a065e0311ef7236b3ca74f8d0aa1147292f08401444ac8cd66dc7c43852941e384cdfa297910084c0d7a100086f6f41d1e103e0eba1db3a4cb9980cf1c072e3818e2d7ca76fdcc6b73bf91f30ecc19715671ff775ff9426edc903568cb55c757ed7f785135a14d3c151a1e0899820b5db36e7db087b7682d98580c07a4bb55e24972574f989f663adee7b4caa447bae860badb99fda32ba516afb3c9fda27a7422898f0d2f85537d3732c57cf3143009215ac73056d13e254d4ba0399f49761e960078b78da2a709aac554f0fb929c40d2affca4b53901d9edb42032b33b18238086f469addf7d27cd36d55b5102001bc18f3d1d3662477c0d51f37c150be0391bbd15889f21537ed54f2a3e4c4595819d83a39d70b28c4cfa2692eae6e9e3a71ceed89840ac4246367af61a04f90c3bc886594199f3df25a1ee7f6960ec5144313b15a1aa22e5309800ab22f7e690d1dde2bdca0506b68ebfcc16ccd97f6d901d2cf71fb5acf85feb2df8a22679671f1e65955289f35445451cbaba874b5724fd9423591a479b7e2144b9aa1d84bfb577cb7755dd6ea893f077e05a4c9d2697674892b8f66ae9c659a39d7944bfacc6575c8ea3721bfbcf1ca63c07574f3ec4a8d78e42605789bd8d905d1ae70cd4e9a9350ffd007a81a43694e8d3ed28e028cd24168cd84cad519b0b58aea046b06d5674bb656ac23fb3aa258f1f87d34f69e8b52f208adf0f476804e5080bc8d94d666fab802e950ea6c6a1f9f0c201773b303abe37af0ef90527f372dc298efd1b0768867eaed3c4b2a60cfa94ed6cbc4ded0a394e20dc7e5ff857cc7fe7285ba7257c3aacc80c9058de86b265437d0c2c6e9d1fd55be37155919e2435888defa734d4ec60789157693717fb5754b60636427c9e58b5a1af828873e1a75fa02d0763eaadc967f3973f9cbd129d1c0cefcb1facc557f1d8379db3d2b5a133964421691363178e24a8c6178fe09fd5e22cda6d7be38aa32bff539693f1d714d52aece91e93d38500a6253283295f51dd365d7ff6ec1edb6869f8e556e8444ca00308769cfabbba9846574691b6479662a392ed93de8bedc1b03a01b1e1612f395247691865efe48ae0df8472e3a07b34ebfe390c347e7f42b5c6358d679c6a22c84a7eb8fcb60486243caead763cc2db255cec565e094622d272407b703dca27e6783fae2fe6b42c24a9f8ba6444794596538ac4c1666626b3d158370ccb01fab7eba48c7e2b6029be +result: pass +shared_secret: 9d0d9ba501da1b46775258f5c0904721906b237c3461da6c31d70da8575fac37 + +# Official test vector 85, seed: "fbc38d7614d7718e931edb850d2c6f0c5eea9ee889b3e25bd69ac255d5b91e885d93e808e66bf9c88c655dc594da5792" +private_key: 672a64b0079b3b7c18878338aee97b73d9ad10231709a4547941c0c5c1a6297367bce3b5d68b929f611c5ba26f39b199ca2a82bec9ad6318be48d75f9ec7cae3eb4d1732b8eb9a742216723b4bacea934113054af3cc752201859ddc1a990680fb573efc845a85dcab5c352dc701a45e5804a819644037bd095615e7389c2bbc49cb9bcf192b072b539d93fb993bb73f5f3b1549b13e5f90c8aa82991384b310bca58183116fa964dc1cc15c933dd9604ba6cb83c694132c628ac0901c5fdc45c808c2d06947008515ca95c77b486b1db3406665b0201498f721588335c55d2366eb7867ab2a8debc248df0caa3e637643455f7ce625f9f0b43c8787fad449f9214f78551f9556272f7a7040687eb185521a1a576f201373c61840b346d91b94ffca34df0045cfa4b5364432c7e2344a837d3c09c21ca23a957038d8eb30dc91cd9b25837155663b923b6f6766a4555475b04d74f350cb2640cc07cce818609033a8730b0e7c234d9b8b4f7d77cdc095c11e0c8ef16b3eb63c06f72514b57501dcf04ddc162096b99e6b1036ee0118975932041a5d5ef118e62b0429d4117d89b72924afd97770fcacaf9bf92824b9ada2674dd4ac40dc8471ace7102d13058a740246010a685b9814216a295538dec1a9289473aeab46c6e3cdff4335dec9055c5baa481918bcfb0a63cb7e62123e19f1939c1030ee95709dea6844fb978410989ae9b2666984e38062a1d066fb91b362120c7f3bb5488628376b1c827b50fb11b3e4a630c52a32d5a40e671ba0e99269ef09bf1eab049ca04ecfbbc213b74ac06aa790a85757a9be1c852199e7ca0ada5e07e7ccf352b3f3307631e30c604bba95d8aedbc44d12f73e7f51b4b8537e5db967d2738e3a13a33149c00ed24560753f34b85b85c535ce644b15e046b104b23b3c51562c47dbc92f2b44ad0f1890f98044ff3092498416996886c55cbe1812aecc6aa3d08a4f89c62708495eccf13c02a6b2b202732888297b3aca8861bba2e1cad6e7658686ce07da3580232b5b75c61ae1ae72a344293855f47a3aad11c4b716c211128091065a07439a40abaf2d62c674d40a6b1468b61ac2e22acccf25c0783b5cdfc60a47131f0bc6133c55b92e246b9c722ef680bc0ca12c7dc1c46128863507781937b9e02b5355d2b8399c31b6a80ec1137e5fe9ae01d980e0ca647a7b3678006c678147529a32df269dcc378416b14d61b240c4742247bc1b77eb905c6889fa022910a974f262733ee14b75b302e5148063e5ccf3984d073410bcd9096c38aa99c14dcf69aaa3fb32282352fb4a315b736774558753d7a1615c9fd5d30904e1186162a2dacc96003841934a40dd604983979838fb5382fa6dee1a4cdf3063326503ed665fe3ea84953b522872c36e7888864a0e55f3466bf20db1263cc0fa91660561c6f3171f45c2bd5652c95359e0150988f58ab5f69232008b62114195f570a3dc9c916073373540538a56e22b4dba234eb315bc15b3c89ab64a9962282e3c20baa7aa540c8273b83a39815131d24e3643353e5a4df3e986abea49bcb2b96be28a6c4998ce24278652c59f0c5e6c39a52a7269bc769dc6e3b75bd34e7be7c4f86a93506b0510310c0055afab2b0f8c4481d2316c876607a02b744637928897c26c1c5762524f42a00b27d4ab7c198334a13750b8bee321cf5021cbe4536246a0879890ce6f042de3955e373c113d7c2e2df360a8fb5c76fa7f1f594b64b562d0c3b524756b2f94667de31f9a67aefeca35d6641d17d167d6d955d6bcc1709297c9277cf614423b212e96281f6100074d2c2209f976df6332285b3c412a8f618c5b5175302952366a5c67462b07fb74cecc5726ca861e47d4c599819d26329568c139ecd31b22ccac2901d0bd347ba5f10a51b69dbbbca90b574405d8c0600617e682bf81472018284a70982773434d07286b319ca4e3fa6b24b25171093cefa559aa33ad3a0336a1a18205a07ec4463511d3be9ce0b05944819b9647ffd94337c94b7831694ba31cbf8c7af238c21dc1060799c09bb8aae0a084cab07c3bb8502275398e05058b142794309e3bb287fa32a016f46e9feb9115f09a313970293b25e7d25c4abb623c1959d6246d7e00ba79068ea03963d9598fb2b04879c3379397b086960c0d896e419ca5f7667264e1907102329474867cf43a426b1e117826ca542cce64adcbe154f36637de2cbdbdd6c1ad7794a0c18fa339993e873ea54c3f92a68afe0445305bc97b76c61b3bc693e30b2a2b18a6cc28add35cdcf601554b17df39998516549b823ae1596d2a88acb9433433926af62263deb704a561b2f2397381228fc5b15bd93c3911db634b19cd7217508e328113d565b475393d95c7abe5a94fd6c1cc1283587b97db55109a08b1ae1060cecbb15675a253ea154ee19aa9ec29ec33400e4946b89b5b1b4ccd41362a3cc75808408f50ca8662b236f1830656a432e2193bc4f09ad1fc6a82252174a6530b3b078808c8798c9e110820c295797580a74572adb025cc31c75017468cae17c697a79df023aa250c827c11a1491944b9d6156d24b1f0f53c12a1aaa5946bda21485cd18aac0034de843489b7cae9ea90197cc471444067d01f873175693224c5368e3f3220ae48832c0928e65195510b5d4eba93dd3b217b79481aebc34f2123ce42c0aba83ece60034ecbc0ec4420de32851a998207f770f3e2bf94b047779b6187e083f7e04458c243d9125dd1641ec413ccf0a02811ab65d7d954bf4cc0cae00c384889d1b23405419180ec83d9ccc170e0bd6bca3e2682bf3471024445329a515456175ef6c167da459da6f3439dab20fb28bfb9764d5d9b9af055b442399361e91f84965fbcb31a4db147cf5cbd37b955fa3b0a34b78f8f4b2cf584c1f3646b5d7887a99b3847ba9010a69c89f52653c2c4fd2a6cbcec2d00392a1aa44ddad605d8e1595d2ba305cbc86b24a47725810a761c45c6cd0177262b2c85beabc07f5086ea31bd443889ae657c9528abb2769edc8cc74bc80943f92e88402ec231823e15112ff5624c982be7669010e31ac9494334488105eb88658339db648f30b3a08b7a7b5bd1113a83055f673a8fd6ca10cb4ce3c32645fc42ed24420b222d512c68651a0b99875ef8e913b984c709221228e51bd2c2407cd49a06e83f7f12c15d33b0252937f857beaf9ba79045cba8264d7706270d4787f6ecb8922582b7321c26da7813eb1c61a80038289cc84a923e03d7ae3cb232d5e0c1e7715d7b305d86d34fe89069774bf4339a1249be49b1e5c52e639e5acd0fb97c7eb44df56df5250c6de7d171c467ce6887eaa4ee3d61a2985c1c4d203778597947d710dec806e36b0cd949fe460ef141213bfc525e5b +ciphertext: 1f5fd91c64602f502d1373cb97805effe1fa5470648fe8b403524d8031888ce5a0c69c5b350e7f47038279b9ccedb1a124ef224764dd81a80f376a282e858e2feb10f2062075dc206c9dd2f4880d83e4807dd4f03518f2fe0a57f21e554626db5ebf5aef9e7594b6c439a75dc4d6b86bf0011effd8fe05f7b07088817a2f8b669b71cd9db8c4c5981876d811601a7b6cb542fc8651ec0e7daf101cbe22137bc07df0be881e74b8b09af648a20067c1d98c995afbf286cc566751fd37b78ac33c2e1e41ea00b2d280d6b8a3d963835f84223a172cad0a37194cd8283515a0e8672a5c2cd315790181e6482156ec6ce6d361c381dacfeaff3bf013ac9ed98cc170297f4b1945ae1d535b6c6cd3032d48cdb5176a988371d2c606e4933cfadca235657088da565d528899e147b5cc202225410966e422d31048048ce770443515c403a456a60178e2e1dd77d9af89214df32355b22de9da57fe774b3fa2a70487db5acd94ae8e84a1648b502d3c47122b912d8692673a230b72a7852323b9e303a4fba4b92e28cae78816c9a51e4d456eac1f8619a8e31c37861ebf20364662a5bc485d55e026f4054ef6d01b2e034617b392b9bb8a250d2ba7f40c45205ef68ce88795cdfb2c5e8b829534d5b9ffa91a1ecaabeb08be329d5f4e99bc5c069cc969bb354a9a8efe99cda86937bce9f1b05ce27b2401acd985ac79fa0cbfeca06a6846c273dfaf87e3f1919cfe660c3cd2c2dce327d0804ebda3e5e7b43c9c80c9e1a2eddb342874ed9aacf3895bfb8d420d1377d44effa9a0b2c56eefc0e068d96c59b3028e82cca15e11d4bfb438e5c81afa6ac5a86b9d76f7b9f6b59a4bab581683869ab687d657806ef8ed1ce67b8e6186be98ac7fbdb6df7f9334fa5eb7dc24e5e3084deb1ad0b9892890c1751e5d3f2f67e4cde9fff46fb8a2b1a9348ebad7f6af4f9cbacf7ba0f5b46be61fd00ffadc0c466afc2e6e1330295846a2a681770ae8f2ce09b9b8c1e7e33a5a406b19f428708f55a0fbedbc9f2234a46088d4bd054ab8f5b2849724f0f6856439a4078c315d4fa5a0a7f5566503365f836c567e91beee69a204ef071149c85a9744442a1467d52bbe0f06fe4022f7ce152ea8a543249d7c1bfa48689178daf4727218b39324f0a8eca34f016880302b36dacf76b8ccc776878f0757b16705d9b44faeb02db311a8649fe9d41e377509b3aa8a5a487656391ce64960f34420bf5385b4d61a65e1053f9e0a6559e20eb839b709e8bbb8dad3ea772e5d1c41db14f260c90ad8e2b45306010fc46a0878cc1b3cebb440281da6862c9ddaa917ad5f5d472c1045c2416f7ae434489679d84235af9a16bcdad3f8a300778b5f247ac8a2c2fa3d7cd64759f263e3d8ada71fbbe3a785bf620afb1860e9db1aed284e7e471d7c7cb09b78443946268a50438e3520d86b8ef9d803c395307ac2260c075e95dc0d908b1367d11de1295d069e02ec7c734212d5d8df66b9245280b3d4d63b8b93b97226227eaf9a552a79d442a38eaf6942ba +result: pass +shared_secret: 188aa07faa2b7a19b6b7bfbd4cbb1ad829a7415d601fdc3b635528db136cac52 + +# Official test vector 86, seed: "1722219cb5db47374eb0af0232c856a57f026f1cb09e5a5799f4c333dd422ff6a0a67c4da502faae727fb2d45dafcf35" +private_key: 0bccbf3cf040d5b87d74815458749aace6c82dc66a6a7672e534a60474b566c4060ec61e23f5aa640245fb2817185b0b4de26ead3744f0373f4172a6095821bb873f34b94733e60dddb312a1ec916dc0c10aca85b65a9407547c133b1cc32205c7362f3e458bbc507ece9c7b13176f877336a7348b4d785c3de0641d000268a37929c254c826bb643117e36a3b28120eb67104d8ea4509536bb0d54d1d11720a31b4e20b14aa57a81f45b3133525d5a49eb1c59e9cb36774421149f734b3b7778e4b3a2ed20e5cd8a56636c100f7a704f5691d0383140a633ffbcbdc5324ff329f46e5afb27070eee32c5008637708a248593ec00884a87231b7c457d969ad8bb44841d5c76a35ab1fc3031e704cff9045f80b3a2b925af1714ff78b25e798218d163b17e154634c1141a39bf9d35aa7cc9bd2a56032032caf8a6c61319d524acdb42b1ffdfa0b6d70673de99972b21e046737b11850dfe62e30c40d2d7c212354ab529477c9345aaf8a0e840b7ba236c7a3ba508dc995e6dc4a80b77b6ce1c26f8ac42304c91c215698829137e446e49414fd91cf7b9034f5301a81cb4d3251a47c64979ea133ea16012b2c48fea9ae3eaa71f53272af878d356447c9fcb163c938225a53119b3cb914bf9b9b8bb40a2b99a6c4b6ab5055288639802df6810a9f28607ff0537b92a640ec4a2f222075ab917dd2bd49fb1debd6435257ac656687ff75bc70f7b62722664da57882fa1b336819d8367466e936a62724ddf9c6cf439d44282645d5b13d84754799ab7170bb13faacea545ec2e52394851c21c01aaa5b31f72247600a25eb05d00443b3b85c3c176450ced12a8f583716a93ec1cb9d8e03436f383a3af0322cca926dfb45554045fa903a5ae8be04bbcaf858a84ec35793aa9d03d3882ad873289a337e37aaad72b912882ad657bdccf82e65ca3e554ac1e16a44d609c62dc71356ac04536b7ed72ab0ffcc9981031f7ec68f7fa6c761d219a8a78fe7d527f82ba81592c89513b47bd41470e7110aca8b85b9042bf9b4f2e29221164bb21a0eaa30a624a285c15c92ffe3630f19c35f02b9b54bc0c2b958c1c088491b990018bb66996bfe868a55f9c000a72264a649e535bc5e5cc86b1079f556947a80a6352c6bae64a97ef3a1bb1b2886fc5e0d284f81534cc3c1a6403b8c2842cc5909bb642343fbbaaa17fa255723055f7644366c7f4744c01427b9d9d1935afcb732ebc6f2f6cfb8a6c492482e7f046b32a232c3d74472ca7cf64490f0f68f4da0b1d81650384a1288f374a2a9c0153805a2709da5d5154f79cfae9a564166c601d75d7fd3a434269497e41ad316adc65cb152148327f86134d085b2b809ce96b16f6c38e4b107a2fa3cf11b0dae7b37c4285f3f9a10e0009fc8cc1459cba60e38222648bd76a8c770282ff5c57b74f393a8d01c0ec05b4169bbf487769de35e4890382b376c030aa67b28a2a3aa4d8cc8ac6d96254dc7911ec48076247dc2db021880975a49b3995854c22b89f3b1b1d4993c43456bb647c8f83ca66d613bf3eb3b7da4a252a0a7e2e61bf82c20efb11a83d1b9d1e087520991636728318602d4f8c5b918763be1c1b1479035b2a52f4a194042a006b483c1cc248a969a9deb8ba9c43e80799f3e287b4263bda1a1055d152be8c84a4df5447b43295d0ba65d2a9b2d15a3b139507a3c2a44965e68e7caa4d9aeb4f67ced404305c81782ca49656775e10aa531f01c66793e198092e2b538df264818e7afdc94ab3cda837164cbaeec93fe2b8b59397482f084af51976bb6161c026761a22dd5a26457c648ed0817ff0a45fbc8c7e0e6c45767b7a720997ca60453785b73a43522979d06b365481a54e8124e9f4274950315faa27f5f8c50699164414398d72321a9d5c2181338de5187baa2c0c5097bfbc72945b15406eb1e88caa3ff92886a6a4fe2c8794700211ac32e1968643ae5a6c3aa309433cab3e48aa93a560fd18550f19831f6c74e811b8be5771244954da635a2fb6c314b9d77f1bf26fab613872d0a2098dff0b060516feea45293e28c0ed088bbfc0165a1906473063e97c5b2825100116793fb1dfc9447fe3227d96bc5e999cdf1f545c8753e4ab43d211c80ba9646e86651d928b0c9e64f5c2ca80b99914d878641a53a6a385acaab6d9b5690d11a8ef5a08c35e80c5df91463c76366282543b08c0bc3054ce07c32fc10ae021bdafcb744c20dd131c8d4146f1fbb282250941d8a1cdae68b4c5961a7a437b3251f144586aec15f505aa79305797a16cdf4c89209b02bdaaa0c0d367e2dc7097a9900bac5cf7063c3b2027ab05b204fbc997f333122798670e3488cf4bc64089a15a97f0c0a4ab5680fb9d5a9a815234e158316f31948b80ca33523e2303838d55ea2368b037a607b643ee8b2488ee456273158a3675b56967ce7b4a1bd2c22a91083e474ab9121cfa0f2bd1a24b27aa317c34b968df055deb839ef172ffd0489bc524109aa9897383f9cf0226810b56bc75b699187bbe86d465c7a44b65aa828c40ce76de88cbd6671093ca1689506657cdb6b3cc5a9a0293d16057e700a3bb7623e3ce1c8815b1d17066853b1cd807c0803f9a9fc2b62f637c99535a1733159ff79a863ba9203d57c80f0bbe02052e41004cd42388fdc695d9722bb0147c55510cfb9347127002fa9038f42551fe1656f1c4ba91c47e5fbcc5e83013864209290cf7d901213a26e1fa79aa7576c7c4103cfa01ec6e1459c9aacc449af7d10aca0a4171b284d4473c9af9a84546b03c7d5cea7bc723dc5032157b58431ba9a895d35f89274e827470babba0342567648ba84a51aa5a604b4c36a27c0b2710b2388b53085603cf62d9ea0a6a6864971323ed9e934d7471e65a4915ada5dd1e7482a37517cfa6255782ebc7b789c4a6d2aa746a811c0be90079f138dfcc812adac7c4bd862ddb83cf0d6b74b623b523318bc807163e6c98d777c7ed0628266bd53a29636b601e162466cfb700ed35b0966a7daf32e7dd67aa1c08e7cca8f18fcb7bd3104bb5408637c08eaca654b19523ac0a031b76968d71d9c013501a1350742467970c2813762c1b4219dc904202984cb49b33e91328b0350ad36b4a7650f7505b11b5c6f0520cccf788b87b5aef42b44b567c42555c74f40ce66cc9003730928e859c77099d8149c78588fdf0c347eeb6752b39b755122e715843ed2a859c02a81e7705127a52d53047f973952321d34d4278739c4bab50a5c344011cb196dba2bc5197accd11b3f6e5d57b37115e763177a6910c9866c85ed61c69a350302631bd506be010a3f42112ae4ea731d515d80c3a21fcce60cc4d945abce7683f8a03d3cf04e46970ff7d6a12494ae12558346dfc8fd9370bf944a0102 +ciphertext: 43ca59d61117e53738b410cbdee068783bd99064b5c2b5238843d7875a72220c28aa6835a43e8f3ed0235b92051e496e497c739e1af2e2a7765bb4a038d36edf99f0f8789f0acb8ace1e1f981d3cb4d881437dd6dc3dff995b5c53d3c8c0b7090057bfdc7945b2dc9e1977faec3879e200e53cbb02e90dbc8ee00e3ddf74546e58beea2a58eabd3f9f513425fe38af4876b8077f8e679584dd5744b9c6f2d4520373da8ad93dac74e6b91c2e186bd7b18f15ddeba8c179375414a42fe1548f33244dc3191227b59a3c9c494133894443614dc0811f8bece03633d38765e214d96da45f089182a1a6836d382256dc0937fcb91c4f38a2e388c327816b622bbc3e2e76123d43e4f3a7b4492009178258c924de1eb0ef07497d3a12f56f61a2667fe8a7d43388d892803a42ce48204948dd9e28d1382575972ea07cfc9727c0b57fbf7456ee01e377a246022d3adba2ea7b4eedb3cd16a8f12a381df1b359dbb3764eae94969b48f53191d8eb4777ee0987dfaed4ebf93486ac233e24554700640d19211c353cc660da14871a48b474199967c7f4daa130c75356d509919e33c17f8336748d2ef4a4787a502dc5b3fdffb9a124ef31f7197ae578834d64e8d1088f75f8879aff16075c48d9fc72f3facd3fce6802f7370fdcfec030c5f70f163c109062eecce2a366e3c5ef156e3443c010e1f2f520c60e1dd89998378a6859a594c65eb43ae734c864357ebbb0dd172a8c611ce8d8f073340330a57ae7bea54b9d62f778f963682a40f75644731366de60038f4a4d1eb46579ca1aa6ec09690eee7384000c35916a1c6461975ba300cb717df5f99de105fb197d2f4c540c5c87e44218adee452768631afe676e5423d4c1c8e0270c69dbaa56f146de0156c0674e60811965dd588ed266f9a0f1fe406894bc7099b26e098aad64585d7b7f57f4170526180f5eb10c10442dff1a3fe1298444391b4bb392e54e3d5549da4dd4de6be3f361d4b5c261abf61e181ded24aeff4070e2aa504f5f2f7b0e63bf00494bbea72c33a972a5d946aed66c3ca411179340246155fffb724ed2714426eac5e331eb5b7a196a16f22820e817448b36d75c2a90ccf453e2ffaea1c3f21ea8ef21908dc2f3346315c703d44467c7ee02316915989c22a6b8254d96dc56b99b6e7802e3855e07297565b63ff5dfdec11b216271dcf722fd46041df8b2ee07e27bcdfd36703d847e2b3074ccb7436b56ad9b33c68fb1a497d81b8236cbc6a585e1dc0507a15a30b3d2180c754a8dfce465bde430a2d24912dee434d59f6caf3bf2211f20262dfb5d5d0413b824e3cf05f0ebade427c741b0ccf53f84cfb488caf6f401ece816eef2f94fa85d72c445a4397d26280448140850990566ddd703e4ae232595e558b0ea45425de6cb5a1f100f2ecb36e9980d66def6daf65249e8487784ffa9425625030e8336f1c5cd9d0100631b5b5d0cd549302ecc86697c42cf39629df1bd5193bfc5a6a9a0ffd04400d0b928d35536e46cbc8f06adb7ec341af71ee4 +result: pass +shared_secret: 70df7eeecb6ad19b54498071e0840f4957e935a62feba82fe29531f79c2c1651 + +# Official test vector 87, seed: "ac139b78fd16ca0f26d6d7f9e15345c888d857b1910cf38d883339b37ead2dcac30f7cf10176f23ff34b4488eb79437c" +private_key: 88f007f412264252bd88a985188292640647b1b3cc05c76af4a6cf3675b42f4482d95993dbd327c8d4b863a8a52446c45e2019e983c05c5c95afc4a0ae860ff06189406c1555bb292a521ba8ea0ef46125e590ab804b42284b1b2bd3338e18a6d6077556fb4b4c39ced51a15568b9d0234112556385329375d55847d6ca3b3c3444a48282c166a218a1c21181b641936ee5527a9848567d5b2a0185e10ecbeaa87503a338e98c0abe960b6c0f129a8b5a532a3598d6a99d55b06cd37bdf8d7adfafac7291c00e07a2816c7ceb5d04461d503e7f382f0e2bcd3389d7dac197ee47ec1cb2261059300a70a34c4007b3579a26884fd771cbe0929dec5b2c7ba08047c99fac165905a7664f27536ca1a8995a976439cd67a7e4fec693ec8beb3ec2e1353c43538159f545bbed6612655762ae90f7785cb8c2051a4ba328ce09977d85434496c9eab763f796f77a94db4343888eb753f434a1906071ea765a07c7f21257d834681be97347ff20c45a207ff7968dc200b48909b62ca4e2caa8e90d1518e7373966b76b69b65b099814e091c2867374e4009b1a76355b2b04beca33f9949c3d700d1583f12a07ec7349c57ab810cd3471a818f8bd8c7e8656ad148561c82bfefb827c2423e92e792f6f79a8feaca75f663b765106b9376bf66b099135c1a553e5b3c0326b6774b384abee645b5cace1bda4efd521967678adf291b6e6602df992b13a0444e817576f9487de014cd563afc086dfe864c0f565a2304338e87232847c2c0885e008536e4cbbad69b78e73794999a5a3aa1096ac7789efb049f273f4e04a92b85304fda1bbfbcbbdc303607d85b4504b544597bea524b79c3c438dc25ca6612d434857971cf95d343ad31c7a8aa5875641d2773535a80cf0b331840a55290cca82b74be2f4915af544d397552d2678a9c771fc89b0f00d6a36bb6276c10c1de195a271b7cb34b971db38f27f071b7bb4c44358766ec23d9636e933b23907a08ef691e453958b325c6a9136e57d2555485ae036ba34a9ca1333bb07015821187538a58c2af375dd5a106c9e01d357b280f07cd7a08a6a9f6b7adc63ca50589cbf21a16e0b35072ba13d9792bc5555b87598946471eccb42e27c9e2a8641c5524cbd17642f41b38fc888914c5d3462da370738fb1a6bf61330f17147b87a8fd294996b3b6bb0997b3e9a076262e7206a879177cec22b51cf1b85535cb3d056e3b6190f528349b245e1fb524dd149d218c5b41b34cbd579c2e2b2eb328cc66233a806177a316956e37a69513ca6183621407075b61b655eb5e5e60ad1582359d954d859550c115c07f71304368546c926531a78479544a6fcc492ef728fe0183dfa6aea27b75bd9b1717262022d75d383c813a2247b065939d20968981ae67d343179118dd1682215631dd7179ba480e54d4a49df6687b1537ad841e668b36aee700301151eda7706adc6572465289588555d263bb484beb51a428dbacb9487a35830597457411c899c20995599c0d3e0759650040127b92c85a58b4d87682b310d165af1b7118e7332de8f90ceb223195cc1a421a1685273078fb7caa4438f7aa4b45087806776188dcccc327170949c45cfaae192c8fbfa0a033e4a6bf137a2d5c4408040972bbb41342a6f2f97c6bf7b5a05a92ef1c69a3e602f5062b4d651b9af148ebe566059454ae71919226742ac151fec6623bd5531699282cd0651a1bb436d113202aae301a6de6c132dd020cf0235944d0a041f6ad92e404f87432bf3a28035c4f6e236ca6e6b56d924800667f8816839549535f1325ceeb5b0e194b89a5800819215737a40988a43336ceaa914800278944ba54edc65071b63374fb041f07a66d5781ee8492d35221c53495248365cc438b4a65a745a64585242878997853597ce1f45371cb1f97f8638837bee3cab372c024ebe4aa52455283cc2249d82739ea481d685204a61840c856617a210fa431a31b27532b5b0868c2dd0a1e2947aef0575934905ec50c33193c8cbf15c5bb4a89b39c63337b3f4bb3b61b0581fe2362037bcab4c62ee14ac3d8a70486789a6d9641b4a112f1336d7e613b13502de7d1bdd103b6a712bd4c9ab0f5611ba825aa5b344ccaf940c5abc296088893626120b4aa3c73c3e27520b6c6411aa745cd4399bdb627ec584ae3e2a9081c4125cc37f20107f70161975355ae779d74062d4ea062a36a4b63a20e22f3af346a57b37747d3d68a486133857577dc3040342ab2c8a38c9702c66276b5439c82465304f22ca9a316b6c078bbd00a748d9689283aaa0fa584fcb922de15c170412ab5819a18019cc9221533a691503a79c71c43de9453922264ce5994c78a3ce43a1595cb0c761291200b9bdd8b6dd037326e5b40d43717e6507b5f7bbbf71800cc7a1143e7101995ca2c2a06d3a501229a913e3b350cd567e59a03ac54c35a8cb0e4faad7402cf6353a048461649d4171406503d0380f543aae846a21df31c561451fb8707b6f15ae138a8d11b53b4820e97d1293938680546000c7552dea31d4ad50e914cb85935cbcf18821d22b20d309023018a667424ac7aa71532aef2c69c0dc545e3e501e5706bc1c19b5179bd4c4ab22dccc9269560992637a7887b996a6754721a2ffa97be2b5fc2a512788334871577f7530bc06430e539aa7ee0acab022607554e2a3160c2026b8f169cd3537f523b4cb3096dcaeb4413f93e8dd26c774c98daa269cfb702d3592984a3304aa56809b61f5fa4557a08c8ab20a634bca903f456c6e835cbf23f647a47971c3726ca216014459a96531896c8bfe74fd0eb074d74a085bb32bd57857054629a3b19d0105f5aeb5e79d10b0ce0ca1189756bd74324acccebf80e849969bc008adb76ab38fbb47c59cbbaa33f22759d5f879f178a6ec6e37309a15d70c286d7549fea354b438b48d4e73d6b0584469433cb86a74be82ccee60e4a0ab3296a31fdb9a66116a765e2828f3caa12da7e0a4a0a54d1ad9d141b98413c45d277a4e0a11732b9e6a816e3f1cfdcb62d11eb09406b83c5746032e128cc2897e3243840652253b7865a079309b7ce6a1a5b2007b775a463199c4a90358b416435d69bc7c6ec48a155be7570b7fe2626515a09037a6d9dc449e344b0d570be3cb7b70a720156858d8656c296b54c7377456d22ae66402c6fa7a4d2921666171352f56cc03a76365723682c5ef77437a5d16bf343972c43b10f56c5770cb8e9c2a955e89c35d932dc466b0c198874bb242e511f4f4d35fdb1eeb7c0006fafe38c636dab4728b6725dbf53e59cb8866573e536b4017c02e31c8ed7455c841a5ccdb795fc200acaf1da2fb936bb597f7054814869cf7625e45647bc1547aff288dbb90699b2ad84893f3b755d9722 +ciphertext: f96a0a1821b72297b925d90cefc3897dfaf0160826a92ca95326c8de0a3f790f520c64b87b0f47df0a9f1b965f51610fb40e05aca0dfc83ee06684e4ea112b6386d00e1152e4601ebb8d90e8892d6b0544a9176d9ad6ec243995749c6ac9dc4c92a3450de5823f458538464f40cf99738623c4056e72abf449d12918d209c082092bc0df62cc599998fc45bd5f6a1b5a5e58e818bd555017edba520b8f7ff8db4390aa954fe592e48f1f24289092f1b7d174e32343a3a9bcdbbd1bc0f9ac32bc0ada8bea6aee13e49b42f51a7958ef5e5f720c7e7a628e5b93c84aa38fdf3694849bd6994435ee77f9f0ccbf397e8e0982e413be93bcc86f90ab1ce79b767c462112e0ef5ef64f0b096fcd68c6dc654a1c8ef18958a03fabf0b0e3146da24b05b0ca3dcbe899491a30c8e0773873e5d91677b875a333b5996556909c8b6decec93c7f116e86b5828469e8e67e843b04bdef173563be03afc1665ec223a9415450a64862a6291bd1cd8319864c7e3fb21a83f5a44cacf2e1ada9f51c45c9bdfd632a4b1a1df427a12d192c1fd9960bda088f945eecd2c688241fb003cfc47fd8ecadab8af704867266002eddae7d0d375eba342601e3390ac2189807684c94dc879783433fde5a9dae58f31d92f9d4b554bc02842614d0e89425fd293625214a136e183689e1e447130a19cfec4a02aea2f8395b302ad34406b5a98fafc1f8ca3bb145c5337603eb96e8d1b0553eaf63512994b7ea7e130d6d42a078763b3593e34a79db4fed6973e00516fce07ae7243cd840463f4886df76ea643a0d0d6501e3876d4f052cc704b45bf2647215e69808b9eeb118e691544b977dbd5f3915829742cdb1960ba4a5c75091d6d5a0cd894c7a25e19daa208be0cc82e8ba1e5d0ff6ef6a1321c7f42fc80a4fd0a42b0c93ff8e48b2b60d2dadc5c2052b2facc783526fb1c28dd506be55c61bbd693521b5043bb472112c878f5a82c12415582853cb0ca8f542fbcc8c459e0880be34515f2aa83b3ead83914ea582b8872aa7e7a5be89b46b23e0a5be37a354d73921c5fbc25d1dfbbb7629bf38b548342451307db877a807851df9bdb66498a3d5f2b3762665285cc23eab4fe4b1bb633c1debef9bdf8a22a49501ad4b508d0e32e68fff82478c4c6a8a3d8c7a2b78ace428d7282c92f55086744985365443d6c769d359571f98401762b736694e352019684790566517e93f51228dc56ad351e420128d8368c11a8dbc3640d372edb0bdfaf18770fc191017f2805c5a4657c22110b2b39d3c3c9611b7a000a186e44d213f9e0204bd142189fe115d39841779dbd9e4e24c04d234c5a9c300176b1199640382d4a6d2d6139a31873d3f9a207463760b81ae17b0d2e796a7848fee92eb44fb77a01668fe35a1ebd679f04a616b86cb95addba35678a7c2c70f90b2b75b3300d3f73d59cc95482e3ac87754780f96bce1276bbcdffe88b40e06ed94fd80e281c63efe1cf6811cff0097ef06f23a34dce62c8b904a948b5d9ef2d8e459a3e83c4f7a2 +result: pass +shared_secret: 8baaf439867c9761e78a64652a383e21682969d18f84dbae0d3a63095948863d + +# Official test vector 88, seed: "cc7152849c98d5fed2813275d32069e44824ecb14eaef425ce017448cd9a401c91c06d0f7eed6d22b7bbe8ba6c429ec3" +private_key: 53a58b52229950c6b8aab3bad4f53abd319322c80414d817966365de802c0f8888b1eb3411256bea64bcde19b9cf5142e5698316e8cad22846d3ea9a4008512ee83cf1c8517789366e358143832624213a30079f2e8b07641a6816c1052111ae088792c7c305e9c442a47697b312945d5ccb417ccaf9b1649bb74485f4c73ceaacb7a69e06647e531b5944d64586a089cc8892ee0094c230998a22c9a1b0230557c4bc3c454fe33e96b9c5fc74b2e051178bc1a0895a782f84b75457b81a905e50ab4cabc57b2fb99c5c9978a9a4b2915459fe8b474b66c73ec2a4f3048bc5387ddaa066c2dca233ab00019bc2b3a89ba4710cae9a8fe1937be7e26b63b039f7e324ec870f2ff3c886ac649048659896294e55c7fae52f50753117e02f93751708037410e3558c87382ebc052d1783314b5956804ddce8c378ec3a4681156fe044237004f2f58c59ec8b977c9dec63678d494a22b76e1d7b22092b16a39c696c7a04def98c258b774a4323ecd6905e3c0267304d94a59028e084d7f1aa0c926965f087f0d89275b88ed075c51ee424c4125cd153782e0bcab7f57e0c038bfb29798df5579c95bdc021bf6a005a599c3ac8317a26d94b6810cb1007b9e3ac9447399db970b5b77544636481434c2acd4a92a7575c227079813447939938125670e9027be04462ef7c00345a26efd3803a26710ba975798102f8452659d2b9bedb387fb92aa038a996c51c92681dfcfc2d5754bbe04b1681c01d53d2957b6327417c4a8f22b80468808d099055e781b5c4a594fa2c57b91a70dba9909824b46944cf553d15a8c0fff742f10127183c00e3c6814cdbb87b88915fdc92a273c364b18b9c16afa3f5ca251a417816a13214a3adcac650674c309923d74972a50114d951640610a9b4278bee19c2d520a23791a136bb0afc3565750295c93513b819bea7b0144472b63e2b76e1909816b88bba368a6e41331881923ee92adc1827d2c292195ac1ad64064272a562bc0c9a325731cc2992d373403b1867746c78a89773035d1f7bc833a0c9efd1142564cb53b494b226154e7cbf86e0cb85230c2d2b2499486050509bbf8340a935a53910bab694b229103158776b4a85113e3b8bf8438fb7950d2db1153627abbda1392560611c72871455125a4984dd743a2222a6ceaa88b3fab2caf9c7bf17adb2e9be841163bd3880c6c1a6860a8eafda0dc8ab3bda2051f6a1bb313332777ac5eec69e0f70ae83958d397a488727b57553a7c4b209e6c6a0d062ae0c988ab89786f764622879be2c227b7a717a3c7962acda48df3c84043a21d2d85564159fa7e7bfadbcc6dfccc335aa3425fa958de87a6fb0b55531b66deaaca5ca251c359535aacc818abf8fcb75a9423e2bb903d2811618f5a696f230ce50ba48eb786b34ae60e8b5d6d477c3d363e838030f586796272728c37eb82773ab186968a0c2d5e03717ca5918dc420be60f77d6aa7484c730bcacbb970de161c525973171e638b73a2b824508f038ac5c5c0b43098863485ebcb91c08b60a0c731842a569c92a077c06949d7865e3f7c8b6e96d9efbcc48c428bcb8ba049669494663d2bc5fe761b42089581ad73437c875b9d89f96675bf09809c797aa612a100811c3131b8b99b3785a4a32c4ab212b5c0217b18a55190890073f2c12521beb9410040129d5947ef96b72c92ae0f58ae1ac236a5426e7a4440aa42c4bd501af4823cb621c3e6374e368aba59c45932aa0addb3473e96854e8a706c510e17ba91b8b865de529cbd093bda7b6ff8b182ef71651035ea6d8b7c00a6f6efb8dfc0b192c44260a9479539c5a4c38cccc6b1b7ff3697e3759f8e1253cf71e2d7c9119b77090a99b3be67ad965919bdac787f116a67b1ae1c7230b957cafe398027596d510b2ce87a73cf8547977631d872ed714193ba7be01bc7e16260b5bb00a4227b976eb5f0dea457d3a493d19494e5219fc67006caa818eb43ab0d80693eb616b8bb9c87c5e899321d6719801a9982049c6a98c2a63800405867251e20c117241e222a1281745e3929cbebc2444b9b0fc0148b81b96f83b9517a2ab24171c5c55898948b7f16c6a1a09cb7dca509a3876aeaaa4ab299781582cebe73e9ba63390b35847480a9a305ca7b4043ca32fa6875b88085115681bfb806268a7ba33bc0dd5311266e672147b089943c2310136ec47ad1652c681a94ff9d09f87e851f1941ab4755538d50d99169ae1bb2bb70aadc0c87ba3d2cb70f1043be7272663740ab74c05899cd7881be63a86abc13ec4e014cd1868c5799992a58a60aa2bbdc6b5dffb8915c3aebe3c9fc8f70ddc8b9b8bd69fe4f1b60202919022af3df26369c190f5f518a6479decd8626e1c16a1094e2dc7c57a1a189b8b2ed0d4b9b0d90662f134cf4325a1867505a43e411c3fb4c4477c74b658d302fea66022505a25cc2a06713fbe1c2407f187e427a0dacc9c0d20a8ff3c4538a71a639a9029f1c826e8612ba30b2de1c63bbb0f70058f13973cbee40f371c490581c5a61ba074175b6488bc9829ad658568304256bfb88db3b10a4fa1744e220ba121772d94b35233cff9f8ca6053a364ca312fe1acde98bcaa937121806b40c972b1ac1e15700ae67441e399bb0641977d058020f205b258a29bd53fc277609c31150a0134849b6b7d4564d27735507ac25bb2164d4664c0b37cd5b9000d33201831c732aab32ef114902104bdb90b638b42960ac870c14e6220806292b9d6d3bcef1a9b6e859516651f9019cbba1c636ee550a72146ab17231f22a8e1eb68209642caf3814a0121565504859810f4a81cd8c5bf10716136e77fefd995a8956d6ffc0a38f841a0905b19589619649ecb2b24ab314a9a85bfa85cc236d19600c7440771a727e6745829cec312346b92c1685507be82a7d3638d36d4a7641a9a042617c09681e0da904a21207cd7b57f183640797142ebb3aad3470b82511bb88c8cd2af6de0a4f789161f7b2c00e2000c95bcb0d270d00c89c5f102b86650e2f8a4c46c052a817cbcd978dbf2c776cc98d53c1f7db97a0f42594ef18b2444a21bb2c1a59a61ddda53d0105489967488046ff8679187800587f2ac8946688cf49e81da406a2684d1a6495d33a8f12b72686482b91c2272215975a484e8488d2b19ae220cc1387594da69195dc47ac1127738bc03ee72772481892734246681b818b16f06943021363ae890ad5e213303d86f890478a91c6d0ae28e95b4ce2a861cbfd681a47a25545c2a29b75946d0f45ba0aa193ca5544686d9f9a802fc4cecdefea4a0b33387825115cba8b0ae7da0d1aada1ce4ab05bc2479b360b6c56dfa870ca825d82c2f1bf2e6aebde5660fa73356982e12999d8fdafbb3cb186341d0386dead0 +ciphertext: 3db10016c2e241fc73153aa86e26766d09c5f5dda88453093477f69b54282f90c00454badda5893ee6cbfe30e559d3f936584dc92c7f15bbacac3c97ce7992815e7cc2a108d7706f7ea8ae3df2e7b419daaeb41e12d97444b8803d25347c66ef410601d9ba341a1ab8a1351c4b59dfb3ba3ea5a63e69af64f135fcd051ce739a339cad1eadfbb6a01cf1de615406e4cff7c957375ce1db25a25250190f021005b0303a077ad8163b777eb9e3f5d5444432d8db403990e0bae063ae06a47fc561dd283a91f3dec6335cd0f565b406e818d1d57e9dd4b8c4983379ee60e3490d23f052b93b3dd4cffafcfe6353560969826d3c8765a1112d34c2c9b0f650c3d7ffed1c1fda47c7e998a0b71674d4b15597907435aa03584e4cef38a5524e7f2c0e270a3fa24f72aa7b84fe46001b7bdd7ef56046404774231e74058dd32f3486efe98c8bb91512a4eb9570f287895cf97b3abf9c71b175f7fc503275964d50c8511acbddc2374c11265da5c9b3c93e2765980d563d46ca5022fadbd370b76249a7ec1c2aec49d9271ec7a78f6e29000f3535ee273ae0b86747193c5b4eff608d6417134a2d0ece1971ff75df89b74d72efad92751a2751aca93691f2f08fbc560ceac102d03dff61ccce343f9074623fae090155002c01c4a70f9370088dbb1bfcf27d6247979f3fcf2a52abfb2238c4338d8a97618210427c425af435a5109c85b444076eeade7e4ca050f9f0aa63e132298fca9492fba45abee24ede0778113885c46b74aa00f14f8ed6a116d586521c7d8204619cac4a946d8838e704e7caa440bf86dd2b5d4cb3898f4795873448ba508df393f766a79e6523a55157cdf62dc2958fde888b3a9955ed6f690bc919f7c2137b9dfeae7cba52f31d6b1d1293b07611892122e8bfdfb7dee37cdda341bc3c916adf5d942417dd05febb73c2ab1b93209ff83443635db372cf0ed96f0b0d29ca7f6e0c9a85f3ca6fae10fd2ab30e99e4e72b7e7813977996370ca29338eab2a946fcadbe4f2a38b4a0c19ac0fe6e3e7681509adcacc4006a95a3166fefd558d2531c908758f79306159ebe95d4635910e257815335c4af464bd48123a2a160086f6eaf107674d248c70fc7c6fe452bd34638d01e99686216264b360adaa634c6efd771d34db91c458ef5fcb03b337baded312b0ee49bb1931f912c97799b5048e96a2c96e4e65762ef5a533768e270302a028c58439554218274f5c12b3a87b789f1aa9962c6065fe1ab97c1b259c32983f856fd8ade0449217e834e4c478c27cb53eb5a9ce7a6f639c5b2a0eeb2f607f3551c257c5deded63ab4ddd59d242743841041f2502c8a1765f9980065d8404b4bc2157baeb1c060d096b0bc9863a1387208c97f6718055216427b501197bbc6803e1937b3bc62d161a5f55491f8e87c31229849d7eaa632d50df9af1a95e913df81580bc858e7348a03606abd7447d0341802bb6112b499f53378d9a9c882e404ad1fbaa09a2f6e96c37d9f762371970150832f3e33d5533d6475f9230 +result: pass +shared_secret: 60b466221ec831f91a91b76ec6bbc29726f65ebcacc96f9e191f57a1399be186 + +# Official test vector 89, seed: "96d9a06f88ff2c2036fa8e914b89c765e4a510b468dee40f914f78858c811857efe9fd0e17c0048e7389e8d996b7e2b0" +private_key: f2b0b79aeaabcc2b79b4ba975e0baedaaa5c80d842364cc03524088c1ca3b752aff7a0ba70138dbbdc45a969c12e36819b4b101583a9e64407932796190751d393a651844f785a5fe92b567c2c2ae877bce902c887555f93b6235d80a23d049e3b9867f6164c1dc6ae80b8a22108625dcc31465703572b3a8d599f55e694f391496ac402e4b754f97b4203e30bf4267be95ca1047b2b67b36c00d6a9a86843b0508440d441afc56362cc3594b9b1093073d4fc6ea7c35901066b25305398f58485905c6f99b9f583927ae80f81a06b5c1404e04c361b236a3a6818613c2245a47dc1a613549611c627ae63e38100d1049e0c6a913287dc810d7546b6ad4891c63c230ef285ecf2a47716c8e1da751175b0d5d4c34b569b93d895461cb2382c71c4c5ac2e53493ef487dd617b7c643d7aa1608cd798854051b02093904c5f3efac3a39b98d6c69f4f02bb7bc62102e326d421cb72eb40411549b13c0b443568bc53070f381b962a5452b7aa8bcbabee0ad090e7493077b3d3db2f9d1b2833462a738629fa8174a449463e39cb097b6b81a95f01237c967c63fb3646a931c063e33a0457bbd8984cd02438a61ccd7af577c041ae58442d48591d7c65afeed9761736852a374281db883f07092dc2b1e52ca803b90eaa3cb130d86ddb67303aa9ceb6098ee45b2e34c1cc1f149cd9f6907fd104ad01865e84c6ed72567b2497b86c889accccefb61a35e9412bc25d18c438f658615793814d93c42ca9b8462568d3e389b08756843926a9a7c0b65b4c1191995bb309117c52a27545f67b8a18c270d8b7a96cda9ebaf08b546097d0dba23f543e9aea0421bb328c7cca3792b392fc53b31c411312a592a5604be84fe7f0b8f393a451ec73b7c831d3aac3d1a1058e17bd68658f73e6970601cbeea3c798417dfd3b0911b364f3bb650245581751bf75400226ab2a45ca5ab5d5c31dc018b5113676a7132c931cf87832ae85c53320bb18904b6d1cb9c87ba1ed007a80166f1e649a8a0c12cfea81a2eb4dd615794eb006dd29713e608bae25c1aa842773d82d7a624327e826786b38f184aeadd49808d5b2c650113b5c36cce812fd95156cc0a1d9c6990c637433f1c0179b47c7389e7214652df549f3724f112626b5d1418698a66de09e6828645b8cbc405a19a9a910d7ab16ad1384b109535dbba89023222f2335cc9c68aae9bedb241475d8c5140177494c7f1b273f64558647228d562131b4349368764afdb054c12c0341fc8f7279234c2170cb7434f370c601053d77355191e03f9d516bc40a53e450323fc76b465b13a6d66e8b0a61a6808822e21866f6bf7b77b9d92c2ced831a594028fe50a5a005d02133840e0696236990045b5920f1789e4bccfa90bf88b4a6266b04ae1854ffcb0ac0d6870e0a76ac5449bb9c9a9a8007ac28bbffe998adf5cc9df03e9ceb139fe293a3fc908366c179004f9f587265711c008a14a44b29c3c6699c2cc57dbc6c540274fe500082e0885db6bd71417e10a3b98c695fb812883d68c0e7770c1ba14d50e5493da79630f35e229997834207bc3387009b5201b4a6b53cb90bf60755a048de73be31338b4ed00f942acd6fa10040d836e12b650c1b9ed800414fe5b14dfca90fa6bb7e350684c3b08656374d54776c312a645987b9c80b28933550922990e2cc4064114ee12f93d3000164c333bc77d566cd91c904965367b2350b87a6b0b5aa7f8a746ffd4576d22083f23c0f3efc4d09ccb86dc4caa55365a8a406add3cba2127ece221c9139c6c273bd4d3b1bc1ec0626b35db44230662cc44af683c92176c5171337746f0f4900b7369df2b705b6387670b411e26288b8680f9cbb0a8ee01c9d0a9e4c61a19f1cba55459b78602dc14ba52a0b9de9da0cbf330d3e71625228a6a9e471d70639b05792cb8550b24ac159c5b069c30740d09065c9280bf2b4f86c1cd9b78357383b2bcc4e771661f4cb75c6589db317058e428398ea7bb88450f22525813058c609bf5b02a3098a619101c092f87aad3881eef6a2ea91a49dd3cdf1ca6952205e74f68ad5c06fc04163a70c0972c4ad752acfcfd5529b75328548c18748026bd7965f73076d4bb8f84159756c879a5919fa7286e0dc39f1884587ba5e124177eacb2a3e96410a64c2d5403ccb939e428b1e7149ca2b3368c11c8e1f38082ab06f39455d55d12e95c585f0098fe6dc44bbc97c1547600d79b193fa838e42cef6bab08d462faf017ee8414c9914316297cd56889207e13e71e544c6793b751174c5bb22294800785bb003589a899a562c6252ea679779522c03a0b933b07f29194c75b29693e27ddc6c4757cac5b9219d98137516c450884c374cfa8572f3b9e27cc706b205c398866df7972b8a44b7f975cffc3401212bda14c0bb9a50a5e5954f9534ee90c0f1f2328c618be5c2166be064d5d0a04392183fc5b3bde635992998b68b8c7bd7a0a1c3bc99975aab55aa39cc0e1d4c019ef73a53485349b58f4271aa29a4c8f8e97935981a83426b3bd0b5edd1cc10458579450ed4d065a93aa0fa734f3206718974ca6ef35191c930ef67819f535ea5e80e54659b1aec30534442e03cb9c4673679cc1cb205264ea53d20e383d98c08bff78447c3335a4c3bd6f0794ba019e1eb130faac0d2f4193a6476cf014ddc988e757b66ac5c95bb7767e6c32ea8027b5e5a00e62c582ebc4ae6738b9637355f62a053737014c475fa24b144b2b47eec97dab92f58bbaccb0c36670ccc9326287fea9fe7dc6a2ecc896652c9606943ca1a6e8688a821b69e33412025e26442aa2f70a68011f8be62db6e6283b9b85651fb8883acaa20885807237a51cec50cdd007b27c121feca8a2c026d82359de6d8b548d9a49a9914ce76584338bfc8f2cb51466414548cef544b82abcd277a6602887e4edc5e09a20b1ff343541c7ff3d4c0641109ed04cbdad8c2ee80ccc3723a3609454b733aec068fe6d28772e388255a87710ab88848722ccb2c3aba63ad04566b1ba4fdb2a2c07cc42c32b18e7280348c245e29ba51b10d4ae840b8f9858dfc68a73215ddd58df30729d2966d11d4a5b20a6d441071bd5083fbc050232b7e594b11c60a5f7ea438e015018d145b979428a899bb53a42a96e081f7da939cd0ca49dc3ee11b0dddf94430014ce96485bde669f214a3d4a88c6e4b3ffed1ab4dbc24c08224e03c47fa2a7d55997c2491717297155e1b1ca09898447ac0153435444c69b3b704d5b99189e346bfad6143bdd2780d2219878823ecff9df861e3a729f913ece36b46c0e9720fd4f96ab2cac1be382907e8cba0702018ca27b28ea8f93cc19c4809885a3b8b2809fd40008be70a6b184981101724bc3d5ec5e1956b510b82fd5ad0668a5a +ciphertext: 82be6534bbddcc94faf44142c820a882b94880f5264e2cf8f046d36cd8968f090fb2353773f09d560bd169849c2d56729e90b2e96f41bb2dbce40562b1141cfeb35b71f5db5f933ee12dafa086e3125e2e5bf00dd7e59a8438013dda8cc40329f8c3627a609a70d6b58a6a6a157ffcaa326d4a19d7b6b8e7db9f19fba79bbb38a2c645b369fc68450ae6c5f4acd529c248398cddd373824a5087b66ddceb5ee231dbb5950ae431fde9d15020960239c4a526da313ffb447bafc9cb5de05f090001f08bab33f8ea68826e8c057732a95d1ede21a1488e15939a05cf250e577452ddaa73dc4bc86d5394ca0ffaad331300d7d21e506bd3b430ad66db163ce5e2079be92ef4d369890ac192578a01fb1091ef7f26941832e424e114ced5598bdc6eedd0c7c0975079d86b781e8de0cac12929b38658189f53a72e66bd4105a5f7f55f7b31fca748598a230dfa86692b0afc55dc0be8160a8ff477a331cf19b03d1819e87f0b7d4bcbb973c43a3fd7378ecd65c9293a758e079e5fb073cb8ec24324e6a45d81e42cb002bed6590085736f30a3e07f7f857ed32fcdd33f0f93c0c22c78f2bffd1c4d3927d694dd0c7e3788953d1fe41c46ae574f22d14f974a7a4f7db391547b74824cf71fc3a34cb782163b46ee505208ab592ea804403dd5ff8d4b15b772e8aaaa132c1f8993788f07809f86036154e27d70adf575a6e7fd962df249fe5d1838b95e5e9484b8b2c80119ff5fe22685bbb6886e23ab3399dcbfc657773f7d7ce2c81b28c2ee7cf5b7465ba0ca6b3e66306e2bbf5ce75c3bcbecf6f520956c2be1412c4113cd9b3696e64978fccaaafe00492168ab764acaf64ce97bcdcd5fbfb234653a349790ec382f2a504fd67472aacdb5c53b20e24084673a8afa896233982de45f191b32d1e1e0bf7b8c41367d26b439c5c868bd4a179de485748900922c4c9d19455a7c9c7b9d3b67dcd6462b30d307d9fef1a20aaeef1b823038d8f39a83ddd30872da9d7a5980728f2b3bd39eaf1cf2a901c3844dd5a217c64c8cc5b489aeb95520057bb78de40578c86cfc1e051ce2da843942aade897468d65ecfe6c4cb88afdc148166d6b1a9a182b3c2fa4e50ea9e048a78cf1a432b812891cfb367763abf7037a5d06050eac00528967d7fe4c3f1bfec7e6c1b4690b2e7059d20bb8459e27db1b41a972c15f2f9e9a43bb751e8214e72c710011d3d0cb44c79981a0a6ed11d766b4bf071289c65e6234cba1f701697c71317833a772c520e99ca5d6ffcf9d09fc603d22390d6d73e42ce59f95d50dac5d81827b1d58a12daada7487052a0bcb848b8f90ad40141f8a05122fa7b9aef5f792c032c5229e53b3ec9e3ca04b24b02db5398cb9bc0214cfa715f192da527562fc521d483fd4ff440b1a0563135085c8911dfbe26258f4568fbb8117802dc120f9fb973ac309b5d1a1d0e159441af9e477943d331321eadb6a353492db5ba478a92055ccd69dd686b14797c51e6adc3470e62aa1369bcc8c8cbdf932af93e80eda2b2c96c +result: pass +shared_secret: 6a302778f406082fa285c5ee299d78b048e837c5012f42f9a80e8659b10defda + +# Official test vector 90, seed: "d26ce360d399bf7b89dc364aa7ac06bb513eab8f527383e93e30727edc3f22c262aa0ec70257b39edff0630dcdc1b79a" +private_key: f67c9ccc171f6d04bd584a4502f796e5395ae59862dde86fdf29192419a75e1b50222c8fdd18964d750ad5166ec56416c44715c22c29ba8b3f663517cca3995de71e8bfb5ebec66f19a4c7f8098908a93650e2374e483c731219ec68b480b95f4a81155703bde5aa7b5b6c57062c809f960a399a5e9d59c4e2f895bf30bdf60255edbc0d59350a2ca86c18fa200543a1f94b05c8cb0a07476fa556905415cf1de45568f07e37b37ce3e857f1d94ac9954cc9c9237439b9b0179ac0abaadabb2ada8559c80214c6a07a282627f949112218c13fc360e1fc589b6c05cae9c42df2a759760d2c5791f6e4203474a43836bf046cc931d133ebe82ec8b6414918110734318db61739568a0ab42b9642759c57333971c406c6ce9cea3c751c3bd9db336faa9c87108d80c152e51a543546548f1a7559681dd531adb919163c716ac791b5782175913b95f36bb1dbeb4ff0f443b4829deb738f76c8ba26e7a9c06a95a86543c2b95402f39180c08bd0e1ad1741bde9722819a910227b34121ca404cb6245566002174ade638533ab1d1ff9b37b9420813a28fda5b02460b1460126c80614066b2137798215266ee571759b7cb0a0e266972c4aad41612e743a8ab6022e5263d8576bb01959d2f23bf9102cef541896f2523f3422bebb252aa823b2291d3156195e05090c050966769d8774ab08d8314e29002e921aee609e40790b1531300142b9e3701058ba90be1757b5ca62b813a82a1a3654a130a8f38523d84d15d1a59eb5a81f918484037f5bba53a564399de86fff3a2850bc2946704e6721b023d01552737cced28415e819db6b6c103a71db13a9a0e4bfa74c24fcf8452630047b1a4f2c3851e7ba2fd6340e376b7451b767e5d3c1534447e0030ac023054eea4477b290ac861e16ccb00a079e68345fc626cf17a42818f3ba685377e7a1596b37791297691dfca02e02244a3372c4479e1076af237a030ab511fdf60981364d82d0909d81b0fc691a1589287ea99496fa16db4712dea0a12a1814196b1e12091344a27336d80f10b2a877d70550026a39f68aeb97606466735418cd47311ffbbb5affc90dca723518fa69615390401c8e047830f3f6b0059a9a9656a277d5b966a69e8d450bf3aba7477656e67b689f91147e3979f230996c566df9e0aa21b52e46868988e5a39f2461a5631ad35b7e049990a0f99bf39b9fef962ca8403c7453abbaccbab4215c0bacb8ba27a7427806fe2842ed930f4858b6af52098e3083e21078bed264ffa4a9cd911427b707d9832adfc28b51ab407c9c45c10c12ca15226f1036ea065388a1499ce967ca619af1d75c350a26e8673366377887f4b788861979a3218c2b5f3859c8bff841736b3b7f029f3c542dddfc271d3216f9ea9feabc14deda35399cc927d42cf17b544413826875338e8b1b7f9cab947700a55306b1a88fd5901fba92923c7c353fd5b2ca793640a57b42926858953b7b544317bb85e6189a2a162203645622885a22c8b595b36e221488c0cab5b3146ca5d04e6e218d8a215400972fed78c89a687abf95716041ce1f213ae42459470084712b863a0c574b1062f472466947296db330405b8e101c483077b1c397849032230e4c3b97c9c7bfd505e2aa01b3cbcda4096b37aac72b5b50a41aa8f6cc518181b70fd3270561bed0938d964972be491b6331a148317cd548124b7653f1709af074b1fe4424df4bb22ac91bff7c04489526e5e2c82f2973408c4828368b87a7c14a569ed7b58f8eb6cca19088c15031fadc0e5b37c442543e1eb944ea4a0541248496795bfdd56178c188f3642fc0580e70a62676555f6b3810dbc89b0a227a8ae554ddab721c954db21a87fda98477d0c2af2820b4691ffb046ad544b3d3919dce8303e2f27152170a182a756b981e6cbc0b0f00274b521c1782b0516743d17a7d7b4b29f8dab31c50739f68c57efc48ff5b1d3757cd13fb8249abbfc7b5a794e11e5b56b9f20c8e8a5718184167264bae901b3ae5005f796341897542c70545a9b6b260bc13cfe536416a0f5e8440907a4fa1e79a292ba20a461285584d3a2993f2bba8397756e1ac5050541806207fb8b313d0a6280b473c59abc9964b5dae58c6860337eb69396a24aa990349c62aaf8420b49e8a95af404b81870b3c9459acb62749e4ae2cd518e329776a6b68e33a7ac795330a8c1ddf2b326c3c269303bfdc9137ecfc9eda856148ab9dd0a920cac260e6b70a1b500d80d085fb9b91593254372c8e13b69b0d691a508a391b04478729ca19d75b566b472917614a53ca485c44e5600793a41a180697f20aca35501e7215a49f591d376a2dfe4a3e0bbcbf4652710d0ba75898ccee4c5b63514752ca8778f09d737337c9219f4b51a1277964c9e67b92888300cda37c382700a40fc185ab8fec55aa539cf115913c9c73af0819188965e57b326f6615682915363c54a267c27d625cfab0712138703cf709bc5c6b0cbb1d5d3884011c1b8ad8cbd1ba12bfdb8a80e9cfd1526d940233254b5dbc2bb17495b6466c0ebe684fbf331cbd99981a4362fd318b28015d9f3c3f1da328917cb140a0567b4782ec8bb1fe31b298b6533c39733304b5f7c74206cc688c144a23cc72aa491e48701cd7f14fb3b7767a679ba4f4c4e1b778019471bd78bf6b55c2eaf43351f85190b07a66c35ddfa67dadd28c30c5264e3c3ee88b62d2c12541d1595a519897a99bbee0207867af34b245b00185a60b4a9cb92eaee58b16f2977ceb180b32243839487ed6b88f6b94d2d4686ec7b7ea022e6d995c398896cd9876815a27ec77188640a4a4e64b65436440fac565caa10eba9d48824541a6165d0bb97a634e6715abeab2bd8f91c18a3a6e899738188744cb6b817d21cf092b64e68cb6c9747d3cc34d0d294b4770548d61cf53bac839b70f0350994ada273312545462bca9118848a343f2aacddb2207f84a66b08958576069c7b7b69c02cf4f954ce3252faaa0b7bffa5952c51fbccc7fce3b6a0c8074f72519930395d967603d327fb8231c1811712308b914a75539128a658a2eec38cb7081926e94a2903471b79b33adf94456fa6a09438dba6103062c1f5a5c66a8d15b829c8f01e7c1e21b10bed1aac6d142ea94334660bbf448511563b5564acd67f87a26f779527000584b61a65293cbd85ab5f3362bb96a61c922ffa77b8d90acba77869293a03d7cab81b688306546ac348b22e368b8d717bc969ed83a12000548310a929e9738b2448d1cd7d1cab551ae0e7b1c495565ee65f180aca4a38847375abe6cbfa4b55c7baf2651415d3f28d221b291b175340a07843b299a46e02e22657634c95fa08ed106ce84660e8a4c90bd2b22634e40769aa0090a101c5dddad45edc5 +ciphertext: 4c52cf2dce0479dd88f84c76afec867839243ca88c7e240185f1ab343f83a681f936359ffa2d7aa1231b30fa056f9d91e9e50ae7227207c481088cdd7f458d8211f192abddb839c74e6c0ebe22f62eec0a0b85e1e63b631f2e2356c7e549b8c9ef20c970b87169643bff25ebf27344af28808cd2a57c3ba4cc82a6d1f451e8030701de5aa0d0f11dfd9c69396ae6473953826f64ad592a959daf9513081c8059e93f40a24d007237b9f7dc7b423c2d3ec49cddc93b9d10be852d9d8e73df902961c6db0bb884e716b1688fab808f9af1f5d0071d3989340abc9f1c14b7ef8d3728e639ffa7731a5bfcb42d59cae23baa3ff1d95fb65817228393b4b9fde583fb73f464bd39ad825ac28685ed830e5bb2da33784b0bb3e6f310c9ca104da7a1282ea1a08eaf4bff5d6396fb589207a7093b29b310bde1e7e83365208539f4d631f59cc9dfbee095623a0793df4c7036cda1991504d4cea2a7d298adcc4e39f5e6a3519d162da9235d5ddf2962c422725836f59eab03421ca7e7aa4b715fbcf72ddad147cb517f01fdc0998d91562a2771b13809de62031a5972fffe4694774d60979ab51332e8bf3866b15d0268867e497f71d661346cc299d220abe1292eafc72e47e113180afa470a683d6d86cac6880f1f59a84ee590c58c8826a67066d8ac772f86c5094980767cdf8c1296b189c391d64c5682b1dc368f4c2e0d88a6adb43d3340c8d8e9ea1a34d4f4792544166406fd27a0f60038c242173c924f13699fa73be3c0fcb97215503e1a28ae548619684f66a15af654c0d38c9cb34c1c77f1f79581aef0718c6fcb92e04e4d28de7f83cb90ca1a80aa2cf84467b1b7752281b714aff8647539416083dd08b6d13396041f5176a27d7d91e2860fa87fa3b7c4293016c2640a98b3f08891fddddfcd130697c849d3fba3a1e31d11ca6fb5b68b12fd3a5b561d5416ac7a2289e3fe464e7cf0f30ea7f227505ff6ec6f1713a72dd195280c7305ec3469f9c55f4877a9f49c35505779fa1247b5f02da439ec8fc6ac3aff099dbe38e4d9681f65e39c43c29518be931add5086efdb009c74655f3e8525049a6ebe6ed70f85848a4962246a62a45580d3c315c5cf91794d48139874e63ba4116c27be153e0dca53abd22eb653e47c0358aafc19d466e5337d1ab2fe6ae1fd9ff85d6af44f5f8e09ed987c10cef5184cdfed10f16a30c8b34d0c9bd8d69df3d45b30432f578bc40850f12d88d21970dfd20adc0761bb8a37b2a0b9df20e14421311d0489fbbec1f8cc88b08872ab3e129c609aabd2e7d56f6467a176825612dcc9ff1926a28f5eb71174440206f74c219dc27604754f1db7363bce80cb6fef31ecc2f4e5668eaf745317397987dc34705ccd5086a8e64b83e9d4b3c1eaa85074c3c40a6b6fd48a25709846564d4863bf5f416669f1be2e92565e7c76451fd9f31eb81ecf9d57faf8b8b63027c7e7da8b0d140a07beb6e5fcd49a91a0908c33cc3016b165eb9388130426880df40b0a579d5cc63f6bf4b775e9368aea +result: pass +shared_secret: 88a46d35cf07e48c6528b95016aa0c414344e090ee897fd80f26b67bc0451c7f + +# Official test vector 91, seed: "c5856298c3cb6ac9787a0f30938537ab2635b96f6d19cc9522063360e7a5c88e644929d2879180e3e5bcad2422b7cfc3" +private_key: 619075d10644e5f5c9cea8446de5ab5c9ba99ffba41a77cc6698b06e59aff51a688abb284a6c26fbac9ddc31bff11956651c149946797bd265338376144b67693c60db18450db25d9354a1d0d99e2e7a5ba1a871e7e60df77115d7e08aa6b96133e0af9050b784834feb9bbcd0374c0116cd0339cbd3a3649a713ed3e1c185c73a693482db86acbb2688f2c622f8abc7e4041a767698131012f51b9719208b76cb019533798563a55fa7009786049c79c8e617246aa98c4ee0407e0b262ce771eac06ae8c4354630caa42b2c8495481bd640d7a65831b099d0142da3f3239f3ac555ac6440f5b14613147294b736d7b84c035ec8b8a478801c3460509989ac71ba5163618bf25212555bab461994d58c95c3c492df3992e47687962358ad8629b8b0c9f1a1aad180b2c84a7788953145a885d388253e77b274e9c7e9b5882e386dcc9c0b34747265444b8dfb06c6944d84a9c16b9929a19451e4f09954fb2858db2e73b0c940b2239cccc167a60c18212967d7c262c6b06d9566c65c9ea1a86d665a802f5c96d75b67b93c07cf914ec50691bf676276652422a21840db291175a58da6246d5915e321ce3089ada24791a7431dcf4117d3c167123bbe4e9c4670d3696cea143f7c1f12036c63c4699d4c5a32734e85621311c4b826666dfc4578ba4c953d2a037ea1bfa58780ec1678be56997b9375d74966cf9b01a6669ad2dbaa22a26b24a61e2f982b21e9a734c88a32035edb12832f8b59257a0a84b75cc5eb2f7d194d3e1581d9e513598c0cdec0450a255808040a69db3a151c3709c80d55b985e5634839700250389d5ab81f04757a15359a0ef9263f2ac8e152aea3d60e310868c4a71b01761a6c041346d840d1924468f41553f11a14846d694b3918856d0c485562a95071f31b83ec87f3a50ebd89146bf528592b32bfac5dbce78d14467fd873549d998a8f623383861640581627567cbb0310b19b0d554803fe4202e6d41aaf0c58e9f12b1c210e1afc9ffa9c6e18381030d9442a41793bdc274105abe23471dc2423547ca8c92983c0503d1a96b4cb44852b18c5c4f8ad53010c0f3b4f0ce61ce407556fd09814f2563d64134e082be7fa574059ca964b3ddb0053b89627a4194399d01eb24b5e4777c82f7394d95abb10c320032814288799cfd089dbb8ac6941252af08d0248cec9b62b124abbc4a09db3f6188e28a07329c26ac38dbf108cd7ca28dad55514e481969a0f797a341cb05f617372046a68a221b3cfdac744b6ab6a229fdb184dec4ba266952836077129d7c1dbe0859b573f610995feea652fa35c4026b26f194d9333091ddc0fb39648c1b1c6dd69275bda5f4d725de01068abb96c418c283ff65a4c5256df2b2698d82062616de5f93fc6d5005bd449b134361467ccce99bc2dba54a65a6234851fd283b9b77ab43dc40ab1d3ae8c749b9071596785bf53e34d76910384e1a2ce38586a628b7b5b4c50d325a3d340dfccb929996c601969445121d39839cc1ac168236f032a656a01016db1109d9692c81bcc192285bc4baf0ed03d9d68849f723dfc630dd91258a2636bf4aa3c5fb429b8a01074f1983de27ce91513dd44415675597c440cbeb434f8723891f33ddda5b9ed269034b722cfccceae14aacaa81038e45b53518216ca5c332bbe3117beb9ca69287a19dc7a078b412baae7cc5181a389b121bc4ac5d0ca67a97248d8f97d7526063cd88219c396ea11435e5c1d61dccc963444b35c99c86b87e40928b88c47f64b919a028ee601229e5a01bbe17b600acb7449a291b131543709a2b8a7d015419726563e366324588038e71fc3714ccd0a68fde524932496be0ba7adfb6e15dbb99f995419c8af3db630e22393bebb25819159abc78c435342628cab40a6350a8a86d1b1a93f6c9151f1895c4674cbf76313b1992d82c6db218339292622807557f458ce057ec1969578379b75d1bf518976b9c69dc22008371930f06b4d1d2465139bc0a62c1d13db9282c00549c45cb351518df67ca3ac881501c3272b9c6ea1a7c527b0ce8ab9124257484b341b2200b49029e2624eb37b15e7d5823a3ca608f09a5fc590dd14cd2cb15cd238735d25bab119b06026884ae5176bdccbab3550fed9b8d4a473a3d0a47a5c78b7b16b880911c7015a7ec281e3ea03274c6199b345db21c0b0c541962a965fba799840c01409463d138977d9bf8ee8bb3ee3b80e021ece71ca0c6ca72f614706e0941b60c3c8c263ad8187a5d70e98740a0a729a0d07123c5b95d553cb1fd086d853869b68b44db974f5161072d6b1f2a18c5f112376c434b9e777a597b6304aa0d1dc3d2f00010e481b9a9aa60e0acb9394cd554a047a6262e4b32191e875e1688456a1877012933ffa51adf131cbd47c28535595e7bc0777b954e094d6d62a5f67bd8b674abd34500da1a4c94bcac04746c4234314e16c1320c48d714481a43c486c96d183b3ea54b19ac54e971710a293121181a16f5bcd861835c78357ea4a6e8b9b785c085545c85a36b3963288851a15abac8a39a109d0d092ac3ec60a93077486d7920a6c274e91b4f04a7e90d724d1e47f65a9cc80f806b20c98d9867a705472738982f3c608f61095548552cc01cbdf10c34f10709a31aa47a27807c74b9533523912637b1a89d8383945dc9553e9911f4b012d6c397f74c250a70d43db4aa7da34df3c9490109fe7b1561cc25f0f37907fa567dde3ae9da24d425a7fdf35b2e61241400783bc2ba3b6098d6180b25194912175548453a669650e9007be369a2181e1a46763170fc995770627b6e48903f574f06037d580ccc1649ef6eb1d8be40392b86377532fe5b55bcd7177cd817701b4700b71a498359bcaca6393710105108c6c33894a41bd1e4a659b22c76c58c0d2f9648b8908397b2d30e9a4ea60c820aa12a58c3aac757ba835483f02ae08f7c9ad8b593d756a33835759f7024867b5d98477eb6cabc4b7397ff52c6719cf73d42f00a4b362073325d48651c2088fea27d540884851cf95f1a85626642f825265411f8b25067d98b5f595482d767b1c291a9e35100e49af47a71caf2214b592831d1024f56818997bcf035b1ce53c5213aa664e2226e83c50594354aa7974d39b09860b3560a534db624b9a595baf31bfc40978cb2903bb549eda3445241620006371b0f7a410e16c828c6743846ab3644413c8c995a4527f82460e112dae7a0d0a963b87e38a66e07290789200d6018cc7c454ba7bd5e56d7ce2d10ffa73f2a284bd579dd64e4229a9f36e58fcd24287c47316b08f9675fc6d1e3cc4e0eb62d31b6b4f10022d373d2718f3d20ee1cc00ef6892d9a0e15274a8e2bc08fe818b117ba28c5dfae74d54fcdf6f20052f79be333edc8dde +ciphertext: c108c9fe8da93854f9c97333667b60ac6d357747fdc46551636f9715885306d4e0ba5a53950042e82e2449d8f871c0e69fc5fb2dd0890c09e4bcd73800728fe9f3aaa7c15a7bff2197f3d9798f8c7a9308ee9b558c6698bb852d5bcad36ef859e9f20eebf91e4eba3ba96f35a3e15bcf45466b0a0c951c49b0191ec48cbf0dfb06c07cbec041a09f93e98ac30e40757531cc7eb29725b472e4ae51d4dfedc5b782a2bf0ae88db1f6a7367bf0fe7aeab49775ae121d1f568d3a69fda9f3192e6cfe5de967d884247040a6520902d2e1b0ae32f388f4d9235510b3df3b3f3b8fe69b4917bc1990a45fd6d8d8e5bf2cec3fdb9e23dfdd4248c026b73b2907378452223a10d8bbfce7d557a40da8b4b444f189e2895dbe530493b582f004ca49e1a5b103ddf607cd25a0e20d24cd72596349c7dbb9547cfb14f0ea75af088563ac29f2cf3c358cc5c2044fb22659950fd36c4a5d1cfe534e68949781c256a2d912a739c94378339823b039273c06719f9542d293bea4e2e2a69c5de60d55882c969439da1a1ef4403b4af0068e1971c9669a88003d6b7ed3f74228f0434156f05d7cb3b82470381d0c9cb5dc05c978c214cd9e8f7654ec16e4898aa61f3a56346d697ac3d04ad0c7bcbbc97e6e86b687370bc81fc843e329d2dbe7a3f370042893521117a270d635b816c2e4d651eabd4d8b7b3b64f27c0f04e650ac334904064730b24c4796f76008847d686c46a667c2d08a52641358ce681810cb801fb76572ae3034547185bfd449f7dcf9ed2214570a30726697df678cca570a4b137e442388494011c990e3b0efff39d4983abb2d510f0907913c62df29eecc5fff802e80f7d2314e6adf01f74b265a257d829e0b114adcf5c968540949af35dcf9e8b39d8f0a70480e0c90b5dba2a6dda831f856e7178929bc54e632e323d87815639b17cc608a269a37f8a0101fde51a04dc0fedb4da16470f9ddb9139454b5cecdacd9f5d1a2c693f72282113c5f20d397d0538dd4938c17badd0cf0655fc373bcdf75a140746b38ae9e006a7dd80209ad50cd7b84921e85385f8b863492c35bb7048e3c260a45daba6fc44a901880e8ee91533bb0931a48c029d773a463fc07f6d30d022d753b149a4dc0ea32089d100b57c8abd1e6f98de0e8d447128637f21c0912f6cb12a47c7224442d835219de4f466d0cd65ee82fa1e10b84b0b372a307b72d3de3f46df0a209486b83679902ec621d2ad4a81a0b2297f70c88c882e0666ffcff459b87966dd55a1dc148648e619ddef49947690745c7794445a2b8b0199d61469eec9c3fd23232cf0b792d52d2a0c0c54ea11c29392b13a7c69744d85aa2245592adc717dd1016a64e9df28864f267ab770e32aa66b3ef4d8c00903c2bd10d1287e3f4696c09b6e3be2f513d736cb2950935a2ac517eb5cf229aa6914b1cc360658d9e7bfe1bc2aa49ff36a26d05fcea924b8fefc64541aa3da90ca5e2828ebe8f9b4ed2f94b2885af83aaa73641f9201325d88f9e2a2076b87f532693fb40a2 +result: pass +shared_secret: f3c5586476f4814a2d3728a6f0ceed7d19d076b790d3675e48611c4b8df9702e + +# Official test vector 92, seed: "a28ead0a08e7228aeff602b16a1e752278b8ed1e91dac67994f5adc372e1d82f95cc390cd97ab9212275e0566c833fd8" +private_key: a46a88df4035c55137522295e986cb5e6605f7da81fc0b1f29903b3d283022db4f8046378fca124f5580a1dc4535e64dfea6c4fed63aa73960b4e14808383cbb12cf6f204d07f852a815a793eaac2f147d24c53e412a21a7550ef4e8122f46cdc9c560bf725545c82b743041c3933eff115d15746f3fcc5934c132af7a18b2a37fdce899e9c1cc0417124f0c279360c311a08cfb301655483d7f92853274c9f81683e5ca26283527647a0ef6d09225d4af7f1c1ca7563e824454b4a2cdfb5c582c498b4a1a1645553bf7dc30d6a56e0b7ca57510aa315818e527a64bc1b7841801edab2446863d48a53dc83203a0f68be3fc498b288e8457cf6f8132b367a9529bbb814151950c3619fb49d5888aa7424c30d415d08492a7ca50e76b56fb18bcc1ca99c45ca066340ff1e5beca8c51d6355504496e9e4a407ae57ee5a30f92ca1e0d3298bc252ed70114e426a76c5c08ab67304550cd7eb6366205b639b30da30978bce2c745283087c9ba87d3273df10e3e2573479bc205824aba06ae5fd6171355a73c771939e767412333685c6cf9cb622554af01672967bba8e043ad491568aee39e35888a4b996f6279223e820f20f5c95a6a66a972cea5bba874fb018cf05ae1dc60208510c85c6e3211583c4c21965b27817982e1165b6a59017b4bbf3db1ba31d95f14bc76c104c1097aa3372992026035e89895add31669481b6c558842b3bd1ab5bc9ac2bb6754b0a8b07419a35096b2365b60b317571674012eeb7157b233c4a1d309bc1c4c7fc047d5c3382dbb4cf65c9d9a24bda690c37d47ab27500ba5748a0294c8c9fb8acc8b3d938270a73c55de662544c7c576c73a2bd9cc983a60ddc0152be508d341a29595a40c7b617d6bb45d247128505a930a4bf9194ef4e27fa9d9cbcc55c8c9b4cf675876ceb2bb711798c850c3e85bb9e84bcc716195264737c03b4b2738188c0922d50ba49c01b4fbb85e48ac9e02739fbf556c5d5210283014ff280263d7c5353a0454d93195bc4b8ed41551b10a7a19808292c73fd63e61840d10f5c5b2853ee55265f78cb112b3a3521577c90b2744d855b758431e71816fd200b47791328481c49b24f991c9824742da7043ca2b47b7449126533adb1191d4ca1e3779515eb05e9c57c383a3bcdd991fae460ac8c6983e16484d7aa00aa12afb778004366765b3ab6365737e7a4227e7b5b7729bd9086ff4b64cc7ab06ad353c6bb24e05557fe2d60436f9596639abab693449247e881827f0133b9c1569baa2bf87486cb1fa0dbccaa179b397b01906847a970ca28f29f9a8ec0a0fd0a6c02c52a75bf7c3c0c180502590f3766e56556502b1a94383866082681d564b333b852b180c91e6873b143f8475a3b9d67c1421a871a1bdd3c073cdc16f4a717084b95528d43ddf2870ba2a9689310d761a6fd4179261f219de4500ad4b186d97cd1074b71ff893b3d4c889ccbc03264540a26b8ea3551dd86d77c29756c6972ab87ac9d07999f0bdac8a8796c8b83e9311b1a529c20a715e382f21e64f9fd0624792b818d93eb2e3be8cf8bf16793aee06a018eb86ae09292d5599ea78a2553a52793c7148f12762ba5df79b5242249684b1716b818498a5b82ecb47bc7c78372b75de587297848724335f44545a35fa11e6e1208ed4764fb8bd4af9712e21c8b3c99e5a04432ec7c0b3200384534aae227c6400883ac21ec5152380b458bb69c5ce909842d3b07ef2c539c44a2df2013aa97a08b511e444996144cff78ca394b5440f4aba566383b0375edb2544a42c4df25b6a96e0263c8962bf9b716bdcaab098b41f735018735d8a26ad7d93b0f17452bb64180a572f75091af0ba9b3499a134e90a167ba72dda62cfdc27e3234b1412115ad0463da2600dec2e7010b1fc914f3772c858c80608244cc014a31036a9abb68946b51354d07fb914bf22e17ea21854ab778b67b40cef331cf8374594385c28586dcfd5421d1a008634b006965f88d58a5cb449f52136d7f82cfd0aca3b6355117b15cb51240c6a239ba26380c55abe19912be90466cb701d4bbcc5e138c525bf28d23cb2e0452927873c17c7e431051f99a6f585b89facbf71f594b49ba84c7235978aaa2baa1f9e7496509009acf56c5d09a4c53b1cf2845a0d0555528c8c1d287ce7e0aa56e85adadb89440305eb942b1fda247457751fc1b5b8811fdaa95592a047e297b9418c52f0189ae8a21254f838deb89360292956749007ca73581aa79f37116533068d2425d5ecba7447b7cc5729d987564ee3cb2ccabb6c31ba24375304a70638533c67bc6e53c51b17559133d4aca5a6bf44c635615a9881e25e4d137393b76b5017254970b56ed13f7aea587458a43b3435bb018ff6082661da9fec065c0ec23bff1b919633806a835139da4c4d34c6f4567daf07536eec3d4d0347f3abbd7f32317c33c2660393af455c2dc506ca111f48da051d8350edf5590adaae9731c2e301a824721718968ce3e66be430b8db293a22859d68b353dd45467c85ab7f4baa0d5b2cdb83c94a895a58e09e9f249153f25fc6d3c7ef50b1929b197128a64de27c48041e08c26d64b8c229cb24f9e9667aea2a33531d19dcb6ada725eee88f063cbc749c2e90f989c8f0c7cf6bcda814bb2b321f1862b32cb8294e99c78ba21d86a402a1c8c3e7f9a11f09306e588fd1856b7f5c5eaa768dd72793a3a88d35e931de0bbe0bbb697010b2c75c3308649c1260648bd3a6d6e57c56e00d5de7270d2c26572aac88e08238658332879d5ffa005f7c8db415403ae73ae728a5f3bb228a326b05bb26a0c91544d98db8cc687c597ae2e6b142b101e9731ac8c20c7eca11887b7fc8886c304a162b30cbc510ce54ea5324dc9b82f39b0d971dfa69b81ad99d49bca9e3449774985f5051a7eeaabdbd33857741c11adb51744539b1095c1b32cc99f81a0ccc6dc88ba829b11025ca5dd3353639fb8148088763ec9e7c14370766b918e93d8839a8b0a34d3090933df3a86e3976d09776a0ec3229741b2155b6c7ac5431421c7b80812523155c9cc5d890268661501628231c1c660583829e7b3984bcc8ad20632c16993673818f7ba15a5064aa42cdb9f7b0e0708328213388b06a04d559fcd83a10913c15167363f997f62b6a03614c46b9acd703be1a1b641e7910ea273022168352c89cd7616d7746983b3b51d57770196a68a50125f1634faba0c752826ce0aa6448c86fa76c6a3e2390840b0c7f333650c53e0a998b66b533746765316f08a94e18de52516228102ff16993ac61abd8d7884c9d162fce2f019205a2106acc8e3e3465b6fa3912a06c764e625cbe3b95dea6c881c38c2cb5cfafac81b96a810ab749b61806b6d54c9f8cf4bf1be0192423288f +ciphertext: c408d3795c6f0f7a0988a41adc92be1b7b2c00660a14247df3bac9b4e8ca4090466f23a9189e7f0b5bf4a012409c5c12af873a3a847d7bd5acb26ee7269c348e6aa5ef8b573a9ca82b374a00beaadb827761008fc179f7562b775e3f4bc0d77177160ada66ecba30883ef41607a8268898ba1035ec901c7e1d33e55f68db91dfb45b7854ad2fb55cd05e0c72c425893b683fff38bc36278682beebe5953aac7551a6a70d0a0294e393c1616b7f2f63977f7bc4000664faa398b37d343683a8427938e89485daf409e5ef668705dfe003771075a9cee8ef0c28bbbc2d76c342c3dba1631acc1bff3bc9491ec686a68fd17ad432cf1f968ff3d83292a6ffdff0ce18750ba7014d0a8696f2e486367ce8fcd3cbb56eabdf699a966a156706f26c13c63a4941aecedb8c51045157a983e2dfd02085a3577cde0625da2350adad889a8d295d3a06d39cd42f42ee9f1b526595c13aa40f7e7407b0331a61e7f8c6fe070ddb7ceeac934a78d7df2715f5d6830fa5a68b84e089aef3a706cf8e47bf78d928759081fca7f59ede7b3b4a1d2f0e7dd4fe5c1e613c51f1dd25a282038d5d14d5a59efddfe980a9841bf7c8a2a7457c25805d93acad001cfb3a9cb0e6741045960f2d318e4a2da3c0f3440f4c43cf5af31d5fc80fb6f9a4b2b510a35d43ccb99ca15e20fdd7ec741b26111bfdcdd6a4dd12b2f2a63091d10ebd5d56e858111dab4f3c233f8425e749afebf296015fb2640fa42d559d90e697cc0bef441e0086ac411fd18c03008b25cdd4650b59f082f1ea6e38e3edfdd1cc848c0e80afdb8bf28e7ad7c9599b085456f01998a048b474499690e4258882ba276898a2ea93e1e68e7b8f4540eae2790e71e114e11c33ee917288b5eb8cc5b1f73b488916cbe2c504c24226b973dcc4676c8ffa422247067c8ad5e47ef8c3e8637619c94f6661d6111652fce115a2c9aaae625226522a81978905b98c659ba830e3efa0786be0166b6cf6d84707e29febd0c57447df8117d3b549d55127b22fea805740ce98268388057573a91600e7ff40061f3b0ec285d0ed684a8cf703014ba54238b28b07b539d63d8320a92eebf9f97b42b0330ae498456f507ceb200a953fb8f5cdc36bb3cd8cdf52ebb955269300642442e3a7aab1fffd31f85148de8f3b01ec857c7e10cfc336e8f5abe8f0e2e3442195c1406614910216225a53d8dc28d7199bc95265503a75341e6ad2ea37488a71c6c893f65b9265cac3d6f47ec3e49785a5f3f9a52e02af1fd7fb14e635bd9c3246adffdb7910420c9d91aa882dc700f47e575ce71c9d155262c123b529a2e1b87afcc8b5444f180e0ab6e0e272667a224f3d59f9809cd7a894e30012fe4b697836c478f8222fdccd3755828ef032906f0f0c03a463fb9101640c7ad2fc8eb4fa1112c7065b038732516626869e8124685bfe4e6fbe0bcaf6451f932d700c86498738fc43a1f5d71952caba8639cca30dadaec99c69e36e13a4935fcf13531f9f3095f06d877e9798c65fdc2b2f24ad08b1149d +result: pass +shared_secret: a828fc1446ff04a950e4f551e442aeba279f44de0ec5296fd981bcbe6ee90d8e + +# Official test vector 93, seed: "92877d706daf88ef3412eb143db8cd91bc047a9a43b7acdaa42523560dee4c172697be4332042fcab91135839bf74ab2" +private_key: 36059bf728aab04b86ac60b0f5c233a78a036beaa04a2873b71a3e29272e922b4537f97aef0700afa68b6da877b25b1ed143ba6ca538bf04662dcb500466a70eba596776c6d3662073f20c7582614eaa1517b5578378069f2704a4c5836a55006e054d623b6d04d48abd14570b4613f4c155f9d86c8c695ab9a2744e40794375c07ca62e1a3269104bb9ce60c8e2c6c3f9153ae3555a3a35a1717739ccb195e315400f3704c7c839614c4cc799a4ab250af448b70b871a3a1b8aebfa6278f6222c41aafd51bfd126032ba90e8d103e64e1036fa72dd9e752b72903d3b45443fa5302103d041b12b1a2ce0bf7406f81812807764ed435074a6a55dbce1065913deaa3e7164fcc6419a0d0cdbfc314ab66b2bd40a1e2e0af801b5e9a22023d1c797f49a345661e9c0352d9e880edd71b2e4a674265b3dbe4822738877f305f6e59bd5e4a4ba8aaaedfb28a87733411da7981f458f09a0d8bd55446aaa44f382b4bac9b08fa53b6932337b438744064c7dc9b5e95c61be3c454590df2a88565dcaea473bc3051a08bd6c238e36ea4d28064814c5d210c2cd8a8325230ec330063585b8472ad1415725b51950c171fa4c325c9a8795ad3585e515285678aa43470af7705d800bbfc14a9172b11275471f0948dfed89782d2a214095f11815026f202e18cbccfc75b46763cf37aa5558a34bfe51176b904025b16a08a07635455a01b69820541336a0397abc928e735fb969321216d17341cabb82d07a6a036d7cbebbaa1b7771497b329d67a9c247b6c31798d47347e41a425d7a5b3b1f38d914364a5176ffec86a8f743528179a5c544faba84c48387dd3264423bc083da506b356a51efb1d18da3a5ef2361ec43d2c80395d126097a7a5cc6a4354699017a7cdb02a4823f8327d729a89c1971f6a8646b92d1d38031e5c4a29733ab30063bd86abe6bb19b85687575b85406861a6a3c93085501f62088e245f25c450867c349700732578bec2152746c724a4da7b5b0a0a6df57a67341acd911d12e2774a78a6f003885cf26bfde0c8c1c24a63f33e5444ac342451e5f51820217fb20c14a64738f43a5aade60e3367c3d1695e409bcfd3e57885d87b4d19c3744ca797b74e1af7253613aaa5e9644279ccf963a8ab38ab07a1c8ec6558c3b6a285b38ea34acd49c1a74f3610745c8cc3da36202c6363079f3e252157c8882860a1852663a7b4416d33bea9a08157f61e5ae8bf3aabb7098b2110dba39e4a681eac0e765320d0fa6a6bec730a1848d5137a2f62a7b234180cb4b82568202b59713fa38d10d6c6aba1be37325db36896b80b0e6b356cb735c004d98caab7893e383da8a467c4a71c0e9316bd640f226a68ee2c138b8159a6147c9939ca45304b5df944b377ba4826964b2b86d50b9edd5294c3da3b2ddb02ce786eb02b79e8850ae923cf8b99211ba97806795c2bfa713079ba7728ba7b94b985728b83bcbd64f26a8d5594fbdc18764307a9f66a1e2b0d0d290cd23878adf03e2ebb9f0c48c9132835121c61709a740d937c8010a866f494af723d57b91b98034c6af9388d1b7dbf264f775462a5f581c0ca23c2d45f98c267951b40d36913b23612091000f49577eb8caf83744b7a6917006162efa4cfbd499b8c853e102c9639457f66812d58383e629a7522f1c683d48d8a216a0aa82454f29732077f4baa593de951857227b976a35a8013a622afe355144b63bbbe58265287cf6d605421e73e7df7301b59a885821ec0314ee76359d9d715eec1c2ae726fc0592ee01c1d45d6c94c76cff66bb3bc321358e33f16e1ad44b35e256bac5ab519e404c3cba647637537a524849cf952deda7940dc1c3a213d8c13580ebc10e2b458873ba5cb30c00d855530b0b5f86003a2c6641a72170b238feddb624f9660e16a9c545a0fe8102612979552f311a9417fcc8c8768280a4902a8ae696131c76338097f0c3a2f8731ca25d55a21b619d1c48550371cb2cac00e27c8ab9c8d7bb944e4bab625eb1bf7c55f0df84ce67c48fbb4438eabc818cc2871c619222a0c504c6898c31b9e859998911f4a29000e4063cc0a5d13975182c97047520a3fd7430117b5d0b2b088741690b5662a3b02978c5a2f1c330871957c5c73bb5a2fdeb0b5f3e5953b509b2887435b41badd607307941aad1cade20c4a22b80683b80dfff1bf82a4ae80eb0915190197c1ae23145522c86f86955d0d3b7b4b83b019123674aaac2b4138e4b36169b1784a4bbac8570aba1acb13ac0ab84a6bf987a23ec91f7c6c2dcd6b952c505515b4b4b1e7c749e693ef4a7dcdf8b7e2f89168991c0385829e46c7faea3c7fb18ebbdb333a4a16676aa81daa4ab519638807bc977729d4474f4c068897e77abe636df8525c35e7c691b49c72e50bbd8570d6b888041380a6a4b9a65868f247141ee137ba422807a57a9389cc195345968086359b36e5316c594a88959b7b006abb88d754bed942230b36945a141d4810050834caa24cf58747820a6aacdab186bba056bbc043da570f874eedd29718795ee19c9e8fd4378fa8a42ba6812dc51874cb0285420419d408e897a7f8fb9ad0238ec632674440b66e838fafd731b50092324a9b11a545bb9a9d7a242d54c6bf897a080ac0b06b57535e542d254ac581450d82d73ef779865708a2563c86e4cb3133cc5fc2e16dd2b043449a73e59a5c6a29a227a469ce406192ba4825e3503f3552f743bc3dcb945048a95c70209bf5c5efc76227ec7d947a19dfa0af12b078bc588c1cf9c1300961c59ca8529c357b9087b572a8bd2739a7a526f3d874e6e2a23c4242bdc652569c7ed3546e3e85b7865611c2cb7ad551142b2503e14c0fb8220755036f6bf95de3f1440598076db3410a4ac1e52c91f038956731622df255646ca02fe7cf1aac75d972a5d744512b4b498c666ca68660b984bbe6a1833e83caafb80e17ea49c484ae2b6475d2e276e0c9317c47090dc9bc134b606a6a1336a40881d76ebfa954dc550cac192082e1aa81f9a6d9162b038a021e09b28bd0b959884acc836a4a95100fc93071dc474e593a1d7ca409001b6c40c3fb13a5b6640a32da0b6db086f1691614d935c29b67d8d54732948dfa27296a63607c17973b764b9c05713bf0026bc0534b9187fe33690826a6c80014b2f97312d53b3b22aa1740b0a47ca8807145eae577c994b1dfeb19109b5b99019329fb6adae267c2759fdae64cf479462c4185ca67255971aace8351a94501d772b15890042363b3bb64b6373e44c5bf6ae2caed5dfc3e0f0dca2015579e6c6366833e834e34f198ab5a3504cfa0c6af6ab78de3a3ef5667e6065e084cf5d2a5bb32c06c5bef7b6508409daf847a64c8d30d0974fd3ba7476dc76c46b458a036d884 +ciphertext: 71f6bf72cb74390f988cc6a864a48242cee917f394d5b4da241299a2fab54da05f57393596e88605dfd86167372a80e04af7623b1ef0b07b0c0c9ae8d58389b27acc0bad8e741f2d8862229dd0f90dc927564203ac4627fde6a32d5c6ca4987caab90b659e6bdeba2b4b8de3a53b7599dcc8d8910c8cb5607a9cedaf72f5bee023ee24406e1f56c4a8aefa3be2d3abf378bed42d772a85d3ccad0b698ac6abdb856449acc3838737a5a09ae662c5a4d58c4ef6cfb1fc6fbc5b189751cb003eb8d41873f04ccddf3ff5b01c77e6700d859053d1f920d44a83f42b7982cfdea3d9a6a8c481f92360c8ff14636e55cd76896eca6a38f2944f6a24dcbf55a0aff14185ebf4d8ec0c24decb27450f6253920e112565c43ec742e942cf9d6087e311cfdad256ec27f22e6a246dc6be2c245670971d8cfa3537d6cae449fb07715f26562cd52c5d50ba4a2cda9c5f967a5e9dd72a115b9f096eeac949bf8eb3a331701652924266e8a6d6dbd93a8705a4d466a814da93c682e971c7ce8ae48f149ef51385d3f9521263a3f39fc33dfb3185d34f4019dd23456972296a82b6366b77820affbe68133f6b68dcde6a35f5787fb5636bd4babdf0dc8a590b93f90f91b52324fcbb9a529911cb31f892d2c81d3c735840032ec4e8c2893aea590fce1c9c6cf3ff5206863bc76a3153c1b49f6fcfffa467cb8eef2a98c115fe2a19c01ed361bba1417fc253ee07e7cdf7a6bd09eee099968e474dbc314685464202b3e8d4ebf6570ab30191ef3bc737544f927d6e1a1e4fea26f22845312c2f5bfdc8131572977c16655f30c4d257227ddd7c1006375827368bad4872ed2fd95249c6673ae8c6efdade12507d5d8fe278b65b8c9d0369f01ecc6cc6d8954b0ea19c1721ba535ed605c3777f1ca62467d163d832c4155f81748ceb1c501c42125d918ddab71d4bf5e94b3215f6fea85ae232528c6e5caa8ef8ad250930031bd62135f66e33861ff62571b16e51e1307ffec33062ee4c649c659bd0676e87857f015f9dca2989f4a30fa1ce540392ce96467063080d1667298406a0b1cdef7db896bb2a6ac9c07c435d25d019a3ab17021ab4cf2ba7eb03ebf33e00231abd2655bb69070d6bb6535dbefd40bc299fcc9b45c35780a6b929ac6016e61856f13d6f8afbebbf9fe70afaae59eb6549ec30c1b0db0abc7a88e1b917b123a1faa6a8ad5cce873e20a0c2bda1fd417e49b2afdd512a2bba0db0faae498227727564053f9bc7e89a40d04551c89abb48fdb723643a5dc191070fff978db5526064405f28e74f9769e531064eefb370edd18cc54e2c51505fa2a670358b074c618447c53a990d3b4bf4ec893d6e35f19bdc70fcc2e4a881772cf0cbde217b80bdfe495454ebfa204ddbe82d1d92e612db1a9b994145feb30f7c3a6241a0dd001fc8ff0ef025464925b0ac26df6356a95558eb5927a8d8f360eaf2d140ad74069a0a53aa9c3e4b54b5cb51c939e299567091a8334f19a6104439c96498f06c057f3bdb4a83880ea8d77fe254 +result: pass +shared_secret: d98b18f7b6717b8f6b3e331d6d8f9d3633eb70f54133a78e2345138420edf89d + +# Official test vector 94, seed: "bb4c0082ca4044b1ff60b036c9b0e0495d58667156786c530bc69d949a13bfaff53798e456423d7a0e162a60039367d7" +private_key: 30251db04b83a5b5969cd3354a375ca3003289d59f5197a01e2b103162bd63c0ce71e9c5b0259ab5d7ba48fc72fd3c90a5132d3b0b36dc9c411fa10bd5b45168aa6c562405d478487545b0c4034f0761897db4cd2dc13dec0253acb3051f71b170a731cf1c0e5f17cab24b64cc7682a2d4313bd23cab0849b20bb094e4570910ae5c58989a99880107ca4e617e66020043874eb861a0f72b50a924b8a4bb021504cf299b08b610bc14b0ba6226b162290c3bf6559db1ce5694bc9c75a8f4e3290900ae68e4a29a543dfcbc8e10e90472675381e0376aa408c858491be00fa782049766097a787337a616e04cc0fd8a57612ca816073c47c97d93c6a134db23b84198a0f196dd8c6ec88bbb5d08634c378b678455b005795518cd66ac170090207c84bfce5a89fe0cc1d16a3a60c810fdd780654277940a6e86e75b563b794649a29f0201d7a79930bb1a2b6177002560b5a06ca2d84dd8b45615923bd58543e53221c244ae917459149c13d15139afdc0ca0828ed5c32b2327a8bbf71e86a4071a579d6cd180a1f5248d3a148c318271a378921061041c186faaab73cc3465cc603b90138e125d909427f0c6c13c7b1af731bd7fc9c2eaa601880174b82a28a1d29db0bb708ff06c255bc17bd427275c2c12128c1253207808cf9edc6d3b106cd016821814b9ec498adaec702ad8bd24b894cb21b94de3175e2335b1e22b88c01fef553c42108f531c265f85bf7d0597d4c9b11465c6d8dccbb0b4b06259af20885458f58924b91edb64778d970a20a64f5f2c16a1736c1a81b350a14dc6f4ce1cc569bc8c197c897f4652c59cc7c9a106a2a4d8b826e057149167f2a30988504212b33322b4988e3987dc514968d4027f16c0440cbc1b4b48c18c974f8b20b6e5605d650c2c9b7e594665ba42ab96a4cd287a76e1e05f64c542e4753b2b8a7ac2eb52bd637ef9d50b4f077cea215859babbb2ec105ff5b5c37c0f5ed41b1e71a22f59922dba1d9e004a93dc69215669f530a04e45a878f14df4885be6d2ab820890c35c63061cc2f2582f575c364bf490e9365f6666a5247c950d7aadbe9bc3ee7638fdb981e574c9cf5960cb1c9fd504b6cc347c6a30bd6803cf99e003aa588caba4969b4329010c3ff6762a9ef273e6170ad64b4dcd9488c4e152d3d78aa5d91258e991e1228273372f5a4a01cb815ac2b69ef370838f28c50d82867761556f04c5d5d21abde15784dc486dab0d593069bc2401be13a7945821e2a18de2c331b9a8304613a181ac5a5ed121e0739994fa9b060c1411b261771a1321b62a614972a502a58b712c594b16ae82955817781dc858d645b354bb37e9835de8029b5ed9c430f7103857b25b888fa4bb7e36b30aa3a93d18b158a6365d598546eb025c7d7aa722b0494781c9d29121e071ab4ab73f86eb1d8aac4d5e66375d868ac6a6060f36b2a80730b541895e32c8b68882d945ae32d115e70a7e61f1c9c6945b9eac226ea551781a1bd48208a9e36d12915b69d04c278897ec79c7891a4bd44530d78b63c92640a0e07576322825998166817689799e070b2fcc7780acc596c42786fbebc5356185b008589f7363d863cc934446dd12420e6c5291a66eb2d2964860867e75349ba9999fe4be93262a08f868abb10652b51bd1c67c266156eda768e30b0c82f910eb96062177a882435c74353dda7279f2141d23a6440b900a8a476c66993477b999e23b40ede83b1e31781b4303e4bc5e0220cb0a6409c88aa8238b83d78792c5632751fb0d5246ca42fc89ce31a64069560bb87360bc2696e78062600f24db78ab630079a64c87900d4b7c9ef9201822b6bdbc69c6be718c3b2792ea32756e1a465325a763dba22861a423e65458272e77400375aab4dbf30d564a176613c264631d33f37cea0346e71649d1314862bb0d2b05711cf1af088a4c619048a7242d0be6a8b536c41a9368b22288ecd0ac7298335e5c91db419c2126a8df45b2e6d8793da63fc7e94d75d3bca2aa58f5b5bee0b43a462a12c34b93f68952b6e7abd89c97c293b0693192a44c0d4e69245e14983e87aa26da8c63517f58d66ae1610936e6a89dca87b6c70c1a78c66743b89b3c2eb854067ad97d74771f77b0906a9a7e78640de75a7b8273851dc55dece9b1941cca76cb2dac265e487585780928dfe7402710b6bd914d564568d3d4075e4141749990c40214ea51b71f855deb9349dae2108843b5cd9815f1e8458c020fadc1c65796b117f8b9851776e896891dc05aa0095a914457016172a17624a608cd49db55a42bcea68778a26a910eb566a2d942da58a4cea53ea7a67954b085eaf642405b1674309b68cb9bc3c04d67505d861a605bd6163f7cb49fb8cdcd40917bd59b94892459fa7ea64a4872f51b97e66e64f02818520164e20d5f952a3266840b4575fdb7625d07d00486bd433447d5e1abfa65b215e034aca74670d4b7ff61c36ac2a1628a20d79b352d1c82c1626233ba527967302131bc1ca837d9eb4238404a20a515fe98a9e6d9b34ec28f0b252263fc2bffaba508a6375aba51b4a36af23740d2d51705b2a1083b23bf5a6b75a214dfcba5eabb82faf49e4d326d369cab0f74c00bd54310a3620d570eee533a1a89a51a418a3cd14b25244f0c66c8e8e454e358364fab5997170a90a25f3816aa1b272b09e54435ab3096e8161926299acccae3d689eafcc7e220cc42f5a347173ec4c2510da02c3b4526d75c9b01d103b8914e41b03865e16be770a0e642251dc312cd10aecc6a9734ccc815da2bef09cd18c3a8ad6c0f90574f41075cef470039a62891ecaab5f033fcd4266a510589f7423b4992f488c3cbc450db074fdcc7cfb4a51c08e2359247c1f564cc94383892757a8164c8c985c28e288adffa9c866a6779faa0f0882abf650a4b9c5e0fb36e4e51a6442167aa97c8e25ba55a3b5d7f164f07b2917f57b16b751ac08167ae88cefa14668e7634d05865d1ea24d1013e1b270c9ee9164d18654646bbae973745e64f90e69064f38fe5744a6343ca04b1a05293c5dea9ceadcab0b1f07ca177cafff03d582b123bec8cd829aae8d7cba9f91d4c89cf9e9b52038638f54721f23c6b341419eba880368782d1a0990f57211bf31012148d74451ae1e79850b75d6efa172744cc6d77a46dd0272924bccef49053198b87e1ac122a0753950586d14c6b22bc12939f0661638b5191e6dc2ffaa147dac984cd004d6dcb637bb18b2f04c115f98cadfa79f64e6253cab64110a71d94db5762f8cb4d277e03b2435a473d60b193ed2646f4c5e157ff4357d3c26b7c4b45315f0689f135c85d952a64648b0a8cec03741fe04f797c007e4061f95c7d56cfc7ee5c49e849dde3fea8f25e7876df2a18515c34 +ciphertext: 4cedfca84ff4ab3bf3b2a94c3b87cc76668f469ac66f62ee0fd00f5774ec7ae46d34fd038c5b9ab28e988f98d4e88db9ccb5364f1fc824666a3e7f95e55660469d04b5014324cf9f77f6b731eb6cb71fdea7f5bc493b4313321a4967b45018ebb117a6668bf19597ed538149e41cd1980ab68486ad6c6391c291019854dc899327c21363ad651f0285e23e9d346206683fe9cb87b24aef767f17dbc1a1a8e3995c2dd4590dfe17077aedef6ebb4ab30159b127ea9d7e39d4b0498e59c7a8d927c0abd9f536110282d52ea16035021c7bc16bd0ccba1681242aac3afaaaba8ba52fed525a53bc8c05e6a74d219a6ba13f13d4983ba4ed151d4fe63b1b9aa6ff9b821734cb064d74d711af76c82496b5e718d2c8a334c887d4ceefbf37df4120be4e647c9aaa2936d8a2a82b3610788c9e341db471037970f9765d0816a2a728a82bb56025ddb847ad7899274e3122f5be8b126bacce82f29a15f7394de9b3526f1c8afa407a6ff90874fe1940d3d558285f0e71b793977c9e8893dd7d5aee01c47a34a01d512f235c184f84a7f526ef533583c968f3348f42a9dbdb026e054a747ac5cc7f7c61a5b02b04bcbc56b8432bc482b052cb471c6950020dd308f3e51ae575655d9176041178201f58198d37711f661cdc615bd0b801d1ca20529d448f15a99e831f15486e65a8a4f849d484ac122379aeccddabc499174059c5c52f60e041f4655b796ed5ec62e375d11d9f4d883e2291945b6aaa5a334dee61a08fd832e332282adfed2058b7a428ada4dc3d013e3ee1a2075e1c806b54825c197122c0729264e1faf761f561a04575ea0f171e40c9a4abe0a6652ee4fc4e8cd5f14cbac96a378ca4c037ed8092c1b149f005ef70240f4cdaed69752fb906b50942e97ceb9f8018718f250b792fd03772a2638aa4304f1bc772e248d1ac7137fddd30598660e67219ccf78f7a987622411b9fee83b4f1eca995207e7a42fe7b9f8878a710404f6baf41b019c71b34bd88a5f4da300f14db4bddf85353e54dce655831e5a487dc9ae72fbd3066d56cbf8b5122f7c8294db5d2ee56287ebd5bf4e01dec3f01c9a0ceb17539390f27ecf4ed2aadf2cd070d8ff50390c0f282b3f6cf6554453e94f11a019d2578c7e77f7f6aec0ca9100b12b28b6eeb48b8b8e579039519b2e8b078b3ed1f1e7c8a5ce0dc1290a970f4de5b64d9bfd944b9dd2fc1eb4b3cb0a1f2cf6e9ea7af68f6e1bcfd9a04964f16cc58e858800695d28ecc30eebc1f13f869ffc637a2799c47c4a5451e9b1481c1d99dc428da3fdee2fde40c04832f68ff05bb6f8c0011afcd7c929e06b4e3536d4648dad466d55e1937bccdc21567d586369880cc80bd0e41c37acf979fe382ee207403e0b458dc3da2f9f4e453e2bea70cb410898ff957fa2345c7299c2962d9020e87486690e6e6ae277d0a94c9f385c783f01535d87bc4b6bf630345c60502a67be236a6f1cb9d502dd61d377fc60acbb6c08594891ecf240113e6404d8e24359e4f1222e07752fe21158c6c8a +result: pass +shared_secret: b7d5919f0bab0e2715a97cab993656831bc8a3dc86c3bd32e64ccb4762f70499 + +# Official test vector 95, seed: "121d90e70af6204445d0deb28ac0c108262719e9fd3476aca74bbfde89faf04d8d5f89a624e8a75db80431f0d10ad28f" +private_key: 9c6b1557d747fbab1da3d8bc22301b37e5a5850c9e482850601c129a909da97a9090840efc118a287b19ed091e4f39b7657853502b4322b687a28532f6620bdca934361b1a5dbb0e9af71caf65280e6aba338ab888cc80cde458720ba6146c39a22bc2c8f9cb0078a54031614d60cc9c91c319e3241fdb73a78c4b5715b0cf9620e0449c8c67493a987659c19e8e9b6e2ed12ee5dc876de75589cc6d4294b40a0463d0a4899dd54a60ccbaf545166d693ce6ba3e073c63757ac06a9aa2e5e93385b9723eb339155c1e3a043779b193af883b91f78da091358c2c2dd7db9086598546c6886d1bc611c3b586a3304a473fff62371af33142b1a212236e63351903a652261093ee44209c72bcd1db9cefd7866b15b6c434c654048ca845ab31c65e93d00288c6563e35080522415e42a9d5d749f308c36c860fdbe004f6c38bbf15cfe728a2806c10af833972a6558fc204f052cfbed8b1f8649951e44949720364f752b4910616e57603342953e47f0046af76867c98fa0ecde6680b14bc14ea34569ab583c86c8f3b1af9f5ba2ec68935729f0e03844976a8c5b965f56660e60b2b93d838d3697b86d6cf3e8aa0bd6865dac093966a0793030be6a03bc9e472354471b367a27ed30e129a336df19114cba8ab99571299128b323721703bd11649fc371aeb1867c5079fe04b169501cee5b2a54f14884c5ac1b42588c5ba090382320ac8233bcc442ba2bcf9ec34446a716bf34f1c183a8829b22216855107bf6e9218d26010e63a72316cc5dd8994c4817880d4144a26a0967a25d0a82546098c6c55ba8078c0bed3bb91b5b2cb10c95b464852d7973dfbca7f6396dee46984f220431cbc969b0482453ff729ce625a3498ab299239465fa79b2d50c0cff698d2e4cff7b3182b88acc0785c69b406a3dc9504840a2a744dfcc29a99458f74b3ccdb753ef2e83065111c41052c539c83d1ac049d215ea5291110287e80977e3f578fc6dcba985327dea382c3bb9561444f64232137624e32703cc4cc12c63ba5d3ab496b7b493c1000858b8dd51368f1458d255ac57d829928dc2a0707660df753aa9c1b868703bf69013cd15f17a38496e51d63aacec4f594cff35dd027764a56b2751080d3d76b91da373636cba86395b992a7ce972c5e1101ed43176f5a5ba68801d0763762b92e499110648697389b98c5586bf69356b4623647cb0d1366b0804166299c4dd1ba0f29bbbb5dd393c40cc03967919cc32c62d6bdf9138e6b45184d445ae94825ae092df33caefb2b737e9a23f58126a6c52780e48f5ff7a14a7b255c9a474c752d9de424ccd4a8a05c79164779b8b452f3245926e2538f7299186259678298749412e96b444370bc583ac4a4d43dc7e1329d9630a7b3a79b0cc673789ee0d8026c93c17097cb83d515cecba69b13783fe1bf72338846c955b7b1af27128f0c1a2dfd0018def1c24fb16c29d326129213d831728acc4cf339cbb6d2a7ddc8b0eed4cec8850750bbb740ca89180b224721648f44a8cccbba6c2538006bc38fa34a04053dba971f165c5003d70bf9c0b7f7578d03093a3d496a0e9242b0c23a92788b668b1abe421080770078f97118e7c35dd589ce1ac805d953345881ab11467fe9883654870f7266d76755b0a368661001e627587ba42a2ffc1e2c90b154bb61c2cc3d82a3588d4004d112534f787858d23e8a182971229bb2bc77809a1b118137fb91bb09d2b39dc77773e291fbe2cfe8fa2cd4882379f9471a190f34018c5819ac4eaba7a4a24c703c8876f321267b3eaa58a90cb0271208c6631a773021b3960c14605b5e24b01c2e3c9b2196499dfa69d6a76f0551907cc79611bcbca6b1500d50854f719761a59e8bfac4d5b27a54791482ac5426f73b906631e784c3be822599bba514540efe6a7c13440ae97844a6c73ceb51c471f8014fe51fa94b271bf3206f56abfec55ed7002c27a9250fbc12c9f328ea63b3a2375ecd35634bbba0a4a0619d4571ebc7868faab83c6180dc3c129e8596ede2b64762ca7670282daa233620445bd64a44f5c395a212a088165fd16fc69c503a33b8689217ec00a738f74210d074dc3706e9a412b7982a3e0804458560ace39b54c114f8dcbeb9a1512eea2d8636bdb91c15653926b0fcab1978a02ef694086c062f097c32c9445606050e454a5ec2a43d5cb2704049eabba1933ab857acc1527c254b35cbf6fb4e267b567ca2a125b1552d1c83f408b12420b0b10c2e0aa430f695af478c9d1c54406bf400170a84c4c52e9657c1b4eb652938b4a281a809851a5f62ccf930a56b5588f6fc64b6fabc62b6a62795b3372637bd641bc55c76df070288678012247d11b09118c43fba2536f5daab402377791c906e4cbdd5291ec81a1e71a3a696c0165aa1adfb978be46a8fa5cc7c8ee30036c085888bac3797a1f189cc4035658ccaadc61432141b67bc09ce04685dae806c681729e71b62dcc56449101401d967157c093a8a2b442c3af483408791769bf7ce8910ca4f4724ffc93647375e702bacb559c11fb18b1d4a5371fa4bcc603c22254cdf2654b2873cf9e03591f4173e6a4cf86aa30e9480d49215ab503b2cf6bf42c4b314c7595c907bd4526569b3122234b9e27259619b520412b43b892a6770cc32c6c276a391a106959560687c9620d8d1a60a093f9982a46bb9365d611a86d064f3f82d81ba5c3a39578ea4583b8882efdb5e0b3517be2ab82863c68db0336f6a1b9e1777d7139bebd15af3b73e21332d471100a8a8cdc9d926d2d7c23bab39e015c65a072e0409609c0c0607ba94fdba9842146e8524cc6ddbaa3dc3c9153c667d2b4f4a4871ed642fb284c573b1735b24b9f14aa72f316d3e8b1d8bb415e28a895a7a55e5043eebb04dad9a1d7d2ca9c1973bbc485400b8bc3e897d9d977be1d6cd7d93607a123e43b56b55189586703bbb505185f167d9e24d1c1248a4bc4a98b9332666afaea93aab55b09cc95e8691872c48b3594a1930d82917823362dc6e5ca19094526c462b52d8c842183b214f710908369e9e1599c8e43ea7d890a7e5a8caa6953d774a2e6a1efb1529411228d3637f1b28437c0773a719cc85681cff772ef05b3bbe5753fa2aa5e414bdb599384fb6462565bb04da4c84e550b20163928c9673427b5d57864cd0ba25065246d3914338cc9be47b2ddb2d18888ff99a087d0012b789cc3d6c0c2d93567f7a4c87f1382c4c5ea6d084e524b82eab586ad8c8b05c9af5971a56a31f2b73ab45392bf60b762c5543dc3a259dd67fccec3ed3654c6559f5cedd022077b1a6a052f5287219393cd2e0366d0f5531b2f7ea8704d2900ce5e32d432b4f9f751bde0496c580a181ffed762aa35454a02d3f1f47ee0394c89c +ciphertext: 946305bd5c4c46c2c2e3592c19e4d3f97b8830ebacd0cb22e2fe91165488e41c1bc4d8df410c422d564fa276b2d09e6d121559d1bb4b9fe4882ff9b47735f1a560af691529288b6a495d22bde53975633f37e5cb4b06ec28d80e3a14d5ef441b965946981402a4bdf5ec75216a477c0286a7c93ac7c85d0db58ba93d15a2612206fdd1da3bbef4afffad79d76c0c52cadc27513965eb5e41a8a2bc0982c5b1e4ab48856704e9999d906f8e6c9e69a75659a5d8dea96cd6491c5df26f389a5b68b92ec913af9f05f91923522e00ddcf8ea0326cf8241048cf5d0e9e1e656191c36aec989dd3b321edfa110a17f4006a52edf63a8f8c6eca1fc446b1a5502edfb71a6381b88f3694683169156b18838c26a092007217e0050025a0341f32ac09b11b34798167810162194f396bc3a15ad60e3c0e879dc2d67940b698e7fc89b7b27fdfc8d6a99c46e80268f872c9eb38e31bb108495ba4c1f4c0b772354288cd49ad1141274860e0001cb434111e47b436c5efefce8af2da3390c32e3242552c4ce7471abff8b4b603a261ccaeb1219faa229f6cd7aa778c8a5daa1c6d3b88ea34ce1c53efafbc49f4ba04a7cb778b0a974575fda8775f4926ba1fc2ff1675be8350a426b525f9de7193640a7d2a78f6f98cf82c1c5011d1cd65bd27ff699d2a0e31d15daa817389e31fe278f3c18081f1d8855680763713629afe8ba120a66ab72bfd1ccb2c8d2253824e1eba4aa4c8e16bb938ace8ffefad97a795ffd759333467aa3f00cf8eacc2c05cef9ca5289afb1dc931634a069cd642a7c87c4b871c92e0ff08d7db7988f40cdf805dbcb9b23ee633408392d81daceee30d51bb00fa13eb9ccfb084deba4a4d1f49f9675dcc31f4b16e30dabbb54c56b413ec4b8fa8cd66321a0acebb34fed2200ad8ee25478851de2f7ae93bf00a55317829f87e03f7be1c92bb503c7d0fe980f983e1f65dbf6c7f9c04fd2fc611dad8f78b0dd11b26c11ad696c2d9478b715065893453ee5fd742c4bfe74da5679602c550a671241f77bf16da6fb34f1bcdc8265181488a2c0a81f02438f6c59b5bff3ddacf0175e3db1ce24af9b566710bdedbccd79013d6bc000c4aef91af28e9407ba43c0e0477ceea33b0d9d90deb875684ca797688eafbeb93eb65521ac5a76c66b6ba87c2ffe6187f2e88dec731b4adfaf27d79340f256258706c226f47b5bda71c0022f8ee91adf3d3e5b3c6539ecaebd5a57d724e7a9a9bfa7af1e2860c9ce790ddfbd1776b540255711c5e52f904d07c97ae11e6775d8cd8f7d8bb6301647666358fd9a1b90df2eafdd0601ad13adc24c9421914bd8225e7722ac8f55a5715579571208604e986ed90aa648109887b0dafef529f4f7a6b5c0d27f16e8038ed7059a003766e3748cbcd3fad459c4cffedfa44bb7a2aaac67cf8dbba63680c39921620cb5062238c7028f0cce8a587a8eea5da03b5ed363f4cb65a0cb7885babebd0834194afa46437437f6f324eb41348eff99145a1848b4e97753052de775842b8fbc6a5 +result: pass +shared_secret: 149e4e38a07d18c0b08edf9c47e425b56f7da87b2b9c855bedd29f6f0a8fe5fa + +# Official test vector 96, seed: "b3ac6503206accc2a92cbc210d020a2654726911d11ce676aa04feaa08af1d20c654e4105883ae470ec3ab299075d420" +private_key: 29013c0db356adc444062a6955267cbb8132d72a58bb1b34ecb955795ba52f1624694741fe3c646e734c2462547a72553c51559c2c88830b1cd43089e924080807b4daa964bb85cd5cbc56edea257ec59b9c808bb66835fee1ada8fab7db67268ddb23454680d3a7245be4917a1abeefd809d7906c1b8a4dfad2160313ab7c69cba472bef251c7e1e1ce8771c1c30b7db129b8a8140aae05780664ce800600dbc8ba42e1b4ae629424735b57529f35f9abaca9054ae346c9928a3ff7884485195d02369d046dd68a7129197cc91c3a911c0cc361c9b8fc44c0ac8d98c8a18b185b9e174bdca360f589343f9509121b7b3c8046f4d8086d471b5f1b3e20c6296936a2e78583640590d52aafb321a23215546309676dc84c445ab78bb5660137a50c97aa05b7b004e396619b632e855d80c6cde8973c055c65b7a06a90421e8ce484495820d9a66f878a19e8e1bbbbf86437545a5ddc4326e400c384ce96c4698f628f9703be9aa7181a361739f7701700c47eab9f1b805d86450094c76445413fd57b20d9794aac17b1ef33186a345351c851657a9ee61463f0e912dfd8ae113a378bb51bdf5b918b6344fd74c573430259b2b18f37ce9af0bcbe3807a0d94626dac6a22c4e31f3bae1eab69f768dd4a68405290566e20ed156b5ac5a73b1c08e64e68df973b9dc8692bbcb17692c496817bb1f0465cddc6ad25903bcea873ffbc9d8472487a92c8ce7148c25288d9687532035b81b584494524f796f99904c0bfa402fe265bb7aa143a0329f4a199692472f25b2b59a3a845654a88b9356526c25a740f39c3476020b99a601b41831cd832e3053a90b5cb4de61142f65b2a2babd9a45618036af6ba54c9a2b093cfb5bd7426056e09e6771af41d607cb9375846a4952ecc3a991225db49b31753f0839967ac9319b6c5d23a6365970a3fc4497cdf793196b6c9ad5280b949c825599b5d312b2f484939b960caa2696d26789f09b4d2ccf211cb3bc580acc4b0126380a6da109ef86385640667196a2c135a3fdd780d34513c0d35f78836d0f811945b7b617c024ba5aac93438397f216a4520213c036fdc81957630236323a56c72562236be7f127653269c2a6248357b134973ca90a100618279b1306907a9076f05e46a716cf79882707c942dac8200baf3a454d8e74258682313ce3252fd7a602a3114bdc50e33b29f18acea7180226532288ab678d4c6dc60a58366a61d6b124e247a39b24ba960b39a2da80637c9cf5838cbc5a5b7c1b7fc7e16777c9cdd1460c9eb32f1da32cad0c2437e3aa59f0020a106b06113f5e896730962d1efacb72084df7475eab9cb467ecc1f41177b644c9a68a961ea65d2323628e558d6b03abb2f5491c7c36244a3ba56191eff6ae71496da7372c5e1500e22a7796b2aff8856d75d3278b5117fbc42c71743bf7f24c78b76e3ea45ee2487a8f2899f2127d687b1f8dc579c2ea811d3c50d60c85f6e66457d88f91a63ab1ebc98a0b2167262700d35201975091b9ba30120c6eeca45992376a200d161a234be0c93b68661da9cf44a01071a8614dac8906d39eb475312b0c2e998ca7ab67bc77387e5b6cc8aec14d7ea894809c54e10649325881a89b132695adfcf444770c6ffab16e9211abf5d019e1471b843a3e7a38b5ce109a0a6796a0d822a926756f0c4a0fa03f53200d6cf37a1cb741f10219102b63425063d6a910b2fc574c49067a1a40e22ccb754926481b7f0ad0111943b3e67a570f0bc269aa50de26cb5f3507791b757370517d486d7a55a88ce86b42856705f6a7a48a8892e96ff20c304e74271e0b555c1b4b0d065a50d61bb2813cc3723009179dd2b4c37a0a06b2099c2aa0c4d256a2fe2042bf4b3db91b11028275b33b4484f2ccb9971df29703dd61c17dbc0319ac63d16080f5b5c460149ef751933ab60142404b66690a2c10a6e3aaa186f6c7e130577cb02ef4e043a6d4ab22ba85b5396a4d61aa1528becc59a1843a4d70283cd2f91457762ef34424b934be9a1547dbfbbcde21552f968c2c8692475632e78ab3d7330619e74d8c71bf3797844c717e70b51367963a7cd3c4869a85ddd213a8d34b788239056544692a7741124697d237d7e2677a908358d81da2cbacefdc511d3110e1152bf2d036c4593a0512523f80a26620ab1cd8b6b1d99a08f25ae3121713ac070833c544e42acfbb78d86476743923d7310c5a4238cce27773d3989d598affe6650c1166ad4ba0e034ccbbb5a75d69b113f2a1952a2cc6980c58ca6da32718e4484d562ac700d924545b6cef439234980611c99e69706054981349041e1962b272c4b0b8b416569952e4f98d4bb12de6a13bc1c903c5477b0ffaa1c0dcbd8e4abd4670832eba3d43d9c31147aa803c17bb32c65e3c350520297da9cdd6dca30ca025e85a051af5aa82d231c159a5026a0e8f2c16769105baf7708fab822b1777c6c53137ba11298ccc15d522400b7f85430de739514c90453ba97d9359807568417ea307abb8982707b7519a65b116466e984772f87a6346ac808c7b2cd22f08aba151e79ad8e45925d29294879a9dc00f60713e33091c42bc3ab24b65b488c764ec75b4117dde39ada784835d3129cbd7b777b1b69cc3293f07ade724639b761ca598464e6676e216874c9668b19aba660974c9918d52761acfa325031835b4d44b42fb91e431373781a2f60354e837458e69a89d830e00801178ba697f82a3a914345ecc1b5cb4b3357b6b7d41b708c5a7e4f862c44c8ffa90473495b70607386c02b4f0261e197124de180cc793355135bdf37cb36b9a180dacc2f6b09efd80cf35211a0371c59f396cd9ec226e1126d69a6ab8441faae9a1cbd18e17387ca0333f94acc7e35306a8b05f4dd185fc467e5e888159a50c6c9a51ca6b2deb9ba212822020d67552d4317449b51b21c37348c44e3880367574d5c195db588ad0189a80756eda780dda9a7d3c946b10d897ab8bb40d6441179b1b0d58271ea83000c5ad56175a23d20322d516b2a487c74a64eb3514c93b919d65cedf429bd37515fff66f4d72cee39a0081452f791b8054660da44937c4a443a09727ca5198322c341c12413c19b6075bb9118540bdc105313422cf9b8fa687540af66728fa9859a642bb9479b31257912cb5e0046dc9273199f27f4f3665aee6a7bdd19e0ab8baf1d2a868b465aef75f3ceb916c82bd81791e80158f8e5b358c218305d96a683a19c930c1903b5e0a4b15ccd8ad0b9e61da304ad616af46073a781ed8d08060c1678f48941d67b3685a39ee7491a53a20ea03e400a843c8cf4d04bfe0c0a3ce63dde01045e2669f7ae5da7905775aeda108ea4d6c6bc0fb958286850422bc357ca67b83c986048e0d0087fa11ec +ciphertext: 326dad83eb9507d3d8c6433d9c85dd37879c8edd4271eb110e1da941c4ceb58a44d889e67f4a0a339c5cf490d27949c6716d4aecbc49fd976a67e36663fd6fa0ff29a185ce1af8dbada61b609e8acceb07a793390177024eee8f1d360f4069f7a455bf94a7a639a8fbdfeaae04177a1dd2427d748a61a72f68e119e98c9437d243bd5c3b83e07a55891b400ab069ff19abc6770b7252162800fcbe0ca2aedc5de3773e9f961440ec5db16c3fac83941cbad8be79b263321aeb01ab0c7e35f2dc12b3f00ebbb6224a5c83a51c8173876f2f7bb793c7f965b8907ae1d132d741e1c795f30d3c796094e04158fe09bf981566acf64dafefabdaa988d6f6dafaa95f912d7c78f6ff1b589edc549c93d0241c028bc0b5db30810e560389e5eab0afef7ad8b4edb2df3e921796e8823518aa21adeb02e60f8a11be5a309a88a6f48b58250d8f7147d525159978df41230036695afd9d0ebb1bffbbcfbd45a74405472c220cdcc5026b1c84710d0d187817042058c65cf5a88bb8f6b99553b013ff77b9aec4c9362a279aa2fbaacda95cc65794ca2286492670049008d58c531f70c954af90d08a6498569902f001997692022099b53a6b4e2238bd2875ac7fb374cb27f41cb69a38afb0445254623c81148b5789981140697c8866a75d4c37089c2d536b2bc4d789f6dc045ae57a977f7bec2e0dd5907eebf606dd725cb0673ac29f16378a11bc71bc5ca0ae77e2c3c2a5be6a175dd70ce5c06e906b899b81ed5c0b6000a7f1468948341687465a671e6fa5458089e8795c0faeca5321b30edc70bc60a664ac491920b69effc3bc268176059f47f54e30c4c08fedad550e34087a0c5ab189426141db1c27fcbf348b33216b1b8a184367887b1f8c46baf4bd44a3125b60de3aba6e9baa2f3c593734c38c43f8c7a7bdf20d847f1a79708e81df8f6e1ccf61c41c40b74055d04fe8a7eb091ffa7938de90d71d2a0b5e790884ae8fc4a6de70aed6aed36fab4df9a4f4d768ea2b0f08a047d2276876073196e15909e8ce1f91184e41965f25673138d5c3358cac17d611ae9bf91e10485aa53c9b570733866c9338ed111b99c618016f8ca21b283cdda6c6fb00279e4fa2ac419be7b51bdfaef65246ffbb8a4a8afe31cb67ae15bd5260a3147a32ccb0c084a7435faa8e8278f6a3bd0648c86af6df4e767b6165666a69bbf9dba5f9baeff4348f55742f25e63367a3a7a3f0838d914186cbdfe83d7850ad0c1032cf116f8c937ed9c14b45ca6ab98850f40be73121ee0f29dd3400cd54a8b4ef9f96ec3b1a19dc5099ee276df4f2ba1a6abd46bcbd04722e49e1828c6a4090e7e204908a0cda22339c4c0e733501a389196b11966e0e112c6fadd0a28b05426a562a9e293be1ae19e9d85d401bcfdcbb98c057b4accdef69e8338169cda5f851216d1a462bdb145c83958b07f824da067783e1db1ae85a86b156478280e222dcc204b3b858374514b29ea52396ea28d2313346fa53a610dc2e588252b6dc42811e5525a94e2020ca5225 +result: pass +shared_secret: 38a1fcaf302905e18940605e49e5f44c747b06e789acc9c395211823598ef516 + +# Official test vector 97, seed: "59eff60b1ef6185db34ee1e3b1dd2f159106ceceaa79beb74923b4f5623d5bc52dbf5d2594a1f7c6c64d12cf144e9ed4" +private_key: ba593157e38d7e6735b6159ad0338a4f35cad3b7ae7e79c024b4b913a313d95059e2ac7273692ee4d6217090c1774b4ca473b09214a81a374e5d5350b51c4f52376e3c7a1622cbaa2226965afbcecf5b499ff7220d572db7d7916989cdd4d2ace6cc3a40949b02c52fceeb941ff6b6d2713de078753aa73836d72abfa96ddf790f0b8243c48247abe779db1bcd5ce01bfa061fe1b5436ae7cd7b7a3a65971e35360ac52b9c5b7214478c46f5864948d20396387333d7615f872bb94b0e7d71b2f831a2d30870feb190f42771f1f1b73ed88adf6bb732a1c159147aca38950060394cf04e7150308897b3b76706a17695943500e589b10b348bec1335cce863bf68ba50019c6d072e9a2aaebef070a7d65d5d2a8bc285b22dc91915008e2854a9b408a5e1f847fa492670eab6905a6367528efaf08a688cbc6fc86672e599c3d5ade10a4a92942d5705a03e881eda311cda81982e6aba55f29cfa835b6b19a7e0c39b48939344c1caa5882a7aa86721cb5674a14e62cb613f115e0cc36792467a7dd5701543898ce06223fb505ba4503192747d4295fb57508446c927b1c8378a96b4a56243d257c89993447cc183db3f6db7b8606c21536c01eaf14a7f2931da629365a0b1df157bb60424312155a8e80d049b66e9e134006c64bef8ad0b5a33fe857de7d244b4cc2f0d29a8d50c118540772eca4517712b4aca18f64c758e6698f701804cf0821c178d6d7ba43c2c694e8b4a8a356a8c26894de30658917bbc6331a6e77e6a327aac4ba2b19b02a79484ebf90cc2a235a8737802f7b71e6731f358156232a913b63ba94b932581162b622699659f66c984155187ffe53d8d6a3ee4d84e3b190088e001b3f3aca703a39551bee2a852aa4656f355b05b28194dc025ebca70ef90a47e96049f441082861ba5e563080b27035aaa0ac761c66b6b11978c18d1431d25ce69a6373d869d8ecc72b47550dd901aed51915e61acd36c50cda5ce545b7b3293263ae13880879bf96b7c6915074d46c636f4522f340b993cafd07c91fd646893dca37eda658dbbb52a3211a4e09dc20240a3f8c606a7b095715e5af180167b5807e3b414f69ec28874398b464e08254a60cd9b693b36643d82996ae2c82b8d26bacf106879091500b6a289c4c1a0a7b9c872865498bb2a40455e0ba3b6570a804204afd3942ee6b4169b8842508b9f6a5c1883a3ec98bd8119b147671003472ce1905981326b5057a6ad026843d323cc0593a132114d70cd030aa979d639bf22bcb286c13902cfdeb0beec163f8ab3c377d211b6d502ccc41137db92cdaca20ce5b83c2baa93d5c063db6d419537a7597d03a91f9d214869ca00ae46cab450ce11591cff53610053c3dacc5901a43959e55cc2751f792ac5ed288402782dfa4912989032295b967e4145d7046e76f4079338bc26d4c9f88203ee1412683899ddc534ac37608a6959efc72d7e24582fc9629a20059fb382e5891c85091de6c2600c98c58ea8205d2574c25c9c0d17809ef40d1db44e8ea895c40c8aa2448a6655442f0bb7a160aa8df8ba5faaaee0c19d16dc4d267279c0bba589972948f7c198e8cec71569e9863f968cb5df387c6a350a81f32ad9797c09abaa56083952c0c1b6ec9a50251f3c16859c2c91c0076750016ad3ec36c42941af9c13e4086b37f5373cd29ef4d46d6179c948eac2738bcb765bbc58c8c0fc206a4e30267ed62537dc5202c5a717926744b296b2983b8291495161c920cc1258f209640549e5e7cbbe13ba52b762c6767c92a95678e066631b57e256880ae56189b699691999fa294b71135a7537202e8873d2653eacabba9d3082a5f01353b77da1cb4220301b84a14848b94d68309c6a29035e7cbf083bce5e659c0a226274e8534f61021d1743bf66525aa7c62759c9ea85155e139a9cc20f6b0776d567a8f1e697b97ca60982555c0197bae535a0d20ebd00a7774550e928647c40598d16a45da0810399cf38865ceb5c2ed7623ae9f55987fa37cce79aae79030f8c3b90898f758366f7f591452c77ea7c3203c147e591304138568d2257d07689865447179c017b0560b3165673526981c65858e842d913a9c22c0a9aac9fa4e16ea6b128b0bc99ff863b3f40b2819ab2e8a04cb353c7ecb2409e495e617a410e638bcb370b2c887b8adab2b9f95e8e922baacb1d148610cc4748cbf31b88da477029ca130b152dd923bd7796d0128aec6706c204ada1b37dc0149a7c318d8356a4f8c9cf917443fef20b02096579580d82bb8659b18365ba3347b081f42b17c3e2064a441b1a3a876c26060d22c370f82424e9b156145e93894de3ca09e4fa8ba6524eb9ea94980a038b257fb4da57d4c8b40ae5465a3a9c7169ccd30b13295546846a6bdcf13c3230b5a961b1ecf578abfa8bac3542820053717baae30a545261b873f278cefb73edf8cb73b9272dd7552e381da64c055470c199bab07cdc3293c0577d9acd9d9063b536412ac7cdee30a1dcfb6e25dbcedd5425508a1091555998931326fa69c78b5021f818f8a55deee77db38229b4104980c230dbb872cd671fe776a09be47852204c6a339126e3bac2353d36c094506092aa597449241121332900a69f8ba1b79ec56f047cbbfbd6bb2aa08f6e606d54c72cbb758357e49b937590a1191d88ba26ca576ecd320caa1bcbff8533695aa486d222b5749bc8f4297bb7938d5b4cb4f46d6ee701a35a287dc16f7dc1347ee97830ec69cdaa91ee061d3f0c81bdc695cd6939ae56be11681847629ea555747c664b5e111a9ac5159281438729916d45b8f0d3ad0e0514619ca93a8a971e9433c9eaa731192c760c5c5e32259f569dcdf39bba4c1b7269bd98417abfb1521fcbb640030563118e0f35bbfd0665023863e275c7d5319a1087bb2f956d2dd3ade6c37aa09c36cd5aa9ed09b8999c4473665ae2b784197cc9268c57bfb78dfb054bd1278e044582cc3c81c547c50fe7bfc270bf6aba9fc159a5853045af3758a8d552c3881d7c2879dbbb0b79b5a5c2300b5a380ecd199e3309251f9647598b7376290452a575f4ea7071f2a0ebb7b3dd9057350abbc1707e25d0b68d734689f0ac4c9b3242fb703ea6bb7fc064e599ce8f9269a0d63a719879ac8c396d79221babb2c4a0b7d38ac5b7e984f2212c481a353ba6bd95039443658eeab625d3d00faff2509a2c208afbc6016bb5d8726dc74993ad329bb9a554bf61209cc20e521b628d9c89c8fa687eb7464ac51820225b65b2af8489ed896d11825bc4df67f7002453d16875ce21ccf49bcacca228846450ebb8f04a2a5ef2d919dfa47c4aa265f4cedd10cf74eef3ecc1e63f8ffda3565c2424c89b20974b748a65a5aba75133fcb3156dfb6626a83bab +ciphertext: 851033f1b0186cec6316ee0d2de8492c60f77e7a28e7fdd05da815a3d097b57e7648cc9a8bafe8989eab34df3c43d6984fd19b65becd0c48eca9ae5ea2f070df97a17beb6174ed74eae45153710a758c89c204a8718bf96e1a07f94bdf8efca4a5de6e75230e0f0110cfc0382361e36d286ae3c679c06e1acc9068ffc834c8f8b61e24215fc99824a988b06a4126899b085273272547055cce233c6934b0a1581e081a2ecefa722e3d7b2a2d610368bd14bea532e54795c2f28acc0950b1d1589f23c7967905eaf1548ac3804dedc3762f29e02d9933f1787d0dff3f6573fe88e78e5bef4311a0fc8a76265df4214a5996215051b4bc3fce8c67972631a9a1ef30bd0c85f228060879566def14aa169639c7c5d003010dab55f735cddeaabbf9d6a2b44bc904fa6efa5a258d09df75804cb993d689f621a635bdc3895107af08b831ed70ad4992f5613abc38eb34637110467fa1237b0614a5f370b9b9188892af64282728bfbf30cbc9855d2ff8dd016ca8a42a6bc8fabe0aa11b9fa6ba816cb6991aef25fe38e9bf9d677a95c4482bcf8cfda7ecc1f0c6c642f55a2cea0ec62aa232ac39c56a757b2026463d33109e04cf1c43a685a02a7e95dd9a628d495d2da75b95ea7f9ae1867a49a4326ac7e8b276667b6b0c1647e3370a0ce107a1110737fbf73a2a200331751f2714fc14f0b5f0551256e8f5c4eccc8fb0d95e867a021a8ff12bdf520ee6c8ce98a19233142ba18a6184d1eb92ed72810989a71fff33f712ed832ca6c3c9ab618fae23356a6078afcc812247b09032d58b5f9716cbd95a87b2a9604d15862348bbc388dc8af24415bec3797e03965e618b88b6fa44abf5f7dcb381b34b13ed9642e973edfade4f18c75b4d6bd437a93bd1740499720f68356ea2b23017c07cbb5eda895c67876dd914af22e0684734ff6ce2d301c4e79a68099e948e66b597b87c6c4fa4763eea673691d8377aab5fc4a166ba0eec69e7592cc4082182e69f7c3c9b6afb96bff870e34f56931a759ba44d25fe1b75250b5f2b6500022e00fa73a8276087e300dd1a96d520792625913671cc13ea00926199b4bdb55e5a21ba3f9fe0e9521c7fdf7a56b4d0d712a43dd4e1298b4c9e1691c243c6a1dc3d3d273014fe4395b6553abc4a81c4cf186e7868cf85db5579291b9730ca26ec09f7302b8a0b62dc0c5b3636fa8445ce0fd772c68d4898c83aae108698e809a79e3a341bc79c6ac8a1425bb7b66ef4556fb6c21906bcfe8252c173e2c637e1c86b0d3fa19fa67ee46c0bb85d94a480f24e99e4acce0a9f8ba64a2afa388dc9be4ed9d50f6a8107c44507b70dc7fda71af692c0e1743b15c998090421e454de886542b7002708f6a5180e20b2936868e84dd3afaec04ce4d628909204d757010fd682758857ce720257e01ef1e1c361646f740043f34b4dae7d8d02972039584771114333904353ecc45fc3b3428837e80d7b4df6c4923b122784acf27a5329ef474e2545baf052a2eb404fb18b13199ac35f19258782bcab37 +result: pass +shared_secret: 403543b0f8e519ba4ab878c40ab5aed412ea06bfeb2b864baa5ef4b81a42c454 + +# Official test vector 98, seed: "dddca9dc31bea737d3f474e7560b37facb2f53c803e768ffaade7669ff94b1d4fbd17068cffd5dfdd24aadada4ef6b12" +private_key: 632b0098b51f1dc64ab2b096e5ba16867caa3f5621b10c50008939adc17177533cb98244b0bc287309a67ba147c572adae003472437389d957f1d048f4b7c0e8d88469a6a87b771a7bd0a3fd1074f1b29080008fa72c9241e1b7622748d65bc6dd307645419a65fc5ba5d68e66c5ad250897b72c109541422019275b4cabb57a675eb3144be222f417aa85250c773b0689063e89802d6bb4010f4ba0cb57a1c69a5869e5a5508599744321f23496a6a9b8331786ffd2ca9b83b78469089885acc3f46b9f45437ceacf1a9707c394919801bb44f3abcc5a504f466890b15e902b9b97b8197aa19f25a41e0df87eb6b88c0c029aca3534f807837cc2c253a06c375c8728390263a6cb8d240e33c36268d283fe891e8b99bb935a33d15c0c588c82bc2905de885dafda4422e61b43bcc1b8731f1b6a85486988ae392d71aac97d326cd6115e26c23459c74ebf4ac2edc6209933a22e2162da6cca192271517687110c070d6a154a11054421bf8e3a9820f8a77794b3da4931a333928fd37e7c057117fb2f2fe9a19d65907801248a8009d0da2cbf572063ab7bee490f2c930c8ba0709579b9fc11079d48845de37a1af371c6947b12ac4a142250c92c63b7336967ca1797bac7b3a66e5a997672c4431c28a601cc1360689d1cb6304f8cc04f6c3e2f67a2a72746e5221b1d9a6018c4b6f0a6943ae927552968f7877f28cbbc9bcc410afcc780e06d6759aedf4a1b57d7cad7fc89b7b29e03810bd7babc8797768e930dfc3983aaea0a910a359b5c87d088961d529896183627277e707aa88a21096658663cbb756469542e9053f1102a73644d510b69da8b089c73ce4bf4bdc5b72ffcf4cd1c73ce0508393e409eae79c9fbf44b5e36c73d33af7fc9c084c52b3da21a57171eea865efa7c917fe92b52b40e36fc5cd8e961fd207fd7167c7d302137c5841352663a3931e96382966c58c3039e182cb1e0369813bc90312a9ac6026d4f8c24da0445b3687c27a8363d702ab0579bbd3a418fb6af26792bf96281b0373469d96e74803a5658a413f19a43f95e784b91586c14461134811a0c976c25a7b8491514a1ccf83904489585b841884c0ba39046508728dd02a9a3163ec17cb1422c3bd8194f845259952c1bc7da1616748c19e002ab8948bfb00f7b53446bd1138d7b87794423bed453e5a7bb0e915841984bad6cc970f9c95f120855203df5936a8871611ee897f9e050d5a3931c1219f61a8da6d75ba0e85c0a674cc39c583ad01f794b628ae221d9e8aaaada889c43b56602c73ed2cd5fa084c7b207a43360a8c58a3f405bba290b39723b63b10951ecad19dc266d045a49a38857941534f28e775269bab9a381a60e244543b3e26fcbcc0d47575a82da58aca50239da726e0570a8eb3f6714b2fffb9038d42345977fb3156ca1eaab577c0cf4516aeb81bd1f6b92276ac4cd37b67d1b6083e126cc32c91d28c531802e41f707ab740903e5213e2a378397a52793c0b8762d67d846de86520f8745a8112c80f48835a4033ba53ae0e7b43afc44994b13e76663d1e6a2519844ae08536aa055a428af5144be296b43aada192d142ec933546735a6accb4a5a99852ca751c24cae5738a99734408c884e736a271a17a9a5829a56e4ad6fd90402c18327f4b5b052a5d72585ad276a52228ea0794d4ae19235304674705176f76e909792b32b3f45f3c179464daa653c4885346b0921f72a2e186210542575e7abcc210bb7572c5ba97c475d8ba2810c54b9f23988725dd17967e9764513e1a34e55a9e32b05bd6a030425250a285fb331351ba4470eb2380318c9c7a56ed0664c6a16af63db6dc2a7c1c4e5a901c89ff7a589c099568c9bbb0482b04205595c242c66d99725a17468684b2be16b2757760b72a57974549c44c17bd2aa028a2c2d74b458c2bac3d34537ba095c34459b58aae4940fb3b68a73b28aca34cb018b92f65320bc3c04008394e17215abeb505b4bcd37d473da43569d557eb34b06eeca22c1264db881a6b37bbe9467899117b602304fdb72aaa60bbdba128214cc87fb980c1be3bcf9348bda62ccfa591328901c9b9851e9f9258e2a5f500053f9266891fc1ddf267c58c1aa7db72255f8c277d8535fe48db1d9b12cd97fde35c837d12f6b1c84e2c019e77469350bcb9c3791af132bf2ebc633f3c681e3801d0ba00a30672e955d84930c4012100c18b7a5a342d226341924034ac0953ce15584911d86c0689fd12d3dc4cb2d8748eec4abecc185ff63162e414e709cc3c5163de7b80e9e550d4a0b90de20b2fca850e3b11338bc3b5c369d616a2b64c764f78122abdb66860103371b773586463ea51366792872f36c53603cd876c4aea446e8811feb4417e3f21b94059f1d3c47584c09b128c549e48f6346cc3fa60ad19cb9b65359f04506cf52994ff5225aa24d68a00bc5171e0a492733e726eff02c2b956f9d6a6e7a8519e2b9c4c90b8db6b5447a0b589cb71cf0b74b899272a966c0b0da3824035c70c334818bcdfa2632e7a47ae8119661b96a6b4b17810a8840cc05bb3a0db2c6a60d10cb3e7ca365576250a380fa4b956ce066e72a0d7739a4b4e317988b64270732ff94c319a368cf0b8d8018a2d210bb37c695032a3b4da71e25e2287ef34ed68b5711ca99af1cc6b83caba7eb91d1f10eff920d9b41091e086487cc438e461344905b7e954121948ab8251fb0044e6cd8075f28b70a67132c8362b71b77298c2200e11b3013b6b2ec8b21e7a23a3cb9456567b3a090fbe642a1693501db47f8c4829d86bb1ae7accdd7763fc0b5e754ca5999a1544615dbb1acda7749c1d89073b130a4823600e322904c9599c31b67c963c307987fabc4e482910b57a56e2417eaf978008c9fa38103c15ab1a811b2b198a5b7201ef767a26a758400469ce0b1ca83920fbcbbc51c8697cc4b687d8ba41d45725551a09e5cb230532760cc15292c4ca9cc77f6e215d70c8f6e98b35fb21c5e0993588c8f76775f92c575c013270c167cddfc76de12261e84c1b506737a7448d00a6d07456fabb620d985607a32526d276846cc739276122bc14cae94543e11276805aedf36c404fc079117196383cef2681074f954249b859498a8ede375663755890613b15c2a8ff25ade0abc4d674a050369a596ac3e446cfc3171600367f89c9251e33db95c508e09a64f683fe7420c5ff73ebe5836ebec9e0ef1a39c02acd90275f5d9af9eab8c741023bc91806d255282846cb5fbcef030ee8e721d0566c29f469f5773938d679dbe17bfd7de66be5e4126f5151d1b086e26a88bd9f20710ef06aa0f834722b801f6b79c031f1f9213fda268813efab5204efa60f78bf81d320d01ac09ac06244f7afbd2d80fd356d9 +ciphertext: a1752c6d6ce4394f2ec75f83b811a7216e0c22f7de325c4f443c4b42b8b591eb1cbfe51016809b0056a3791bf89a2d1c1d7f33f487456bbcdf4c129d1896293b2a247fb921586e048698a53059d76bcb892c491d7bffb93cc79dfdcca78e19bba05bc9602f35e1e1ae7a39f8cbd5fd8fcdc78d2d4465166e1de58d9fb958c697a87f003cf53e39a5d74c800b2ff3a1ff5e55697b5717a024acb384aad7b9e0378edf0a32c84041b0411ea2536756354adc9c94e434d485625eda46c49df91e19897c73088252975d53124b0207ee6f0b298eac2a3b850d38f87e8ae34ed2092847beebd022a340b8397feea6b70f58048c9e0f7ef1871e3900665187a0bbf9020c8193bb72619b23173f2519aae103412c2938385e4d95263b0c6b1861bc8a9eb18bd45b649e2c88267375af062927cbdb36073c8baeb2c18566424b19d1117eed47a2ef5c9447548181a6e1278babf995c236a0481da77ce3fae728f1af4134a74934163765df41e05cdd81f5089b4be2d98be48055b9a15e2531ceff8e25fcafdf8c6947acc221e9a7d497ae3e6b948fdf5e424ef8cbc7605b14313f96d0b8b384e83709ddcaf9ee171463e4d99ec20a0eb4c935a9fc150f8f5cd7b8cd35af793fe0c6e8acdf937b8de68fc5c340e167c9cd54e3e5e62fe5faf9a3509c12377567f0f21175cb80dabcced8ae1b0673b78604763a64ef8a168614cabe7046a4551fa6058b4eeac3906d69642eff37ec1e9f4c1de1c3dd3ed950e6673b8a9f5478d136309781b6e758e4e8b0e1864dd1dd1f961012bd47f4163e0300e46fc39ced1aa6efc4c1cff10633b6740d9436f7c024c9835f647b868f9eafc7df5b99b4347b7b417973019308d564d5ee6724c630c891bbba50fbbe8b902d7d53761115bd4c6b0cd9f1a7ba657e8d75680294f35c0cebcccad433a633e1d01b8691ff74a7c2711ee7c1aed207fa3dda7dd61082198b870344b6ef33016c27879d22a8753993b2cd017387e5c23b18367e5eb3d3d356483cd4f8225a0b6d89853fc0a2869fbbbf3f6f4dedf302e0d8919fe06f5687ddf38847d2da1fafd710410fcd5b1bbbb14e1e6e3cec8e3749d19abcdba23c817666a4bba93a14db6955bd8d9fc9a96283719e6badb4086ba2b04d7c8b4292fcae74ab859b5f1d58a691f97b9bcfc987e4c1f7aaf46d7eca4948230b83d033b006862ba19170d524a3e1c79503c548396fb3a0e0d4ccbe0ba4a5b3f49e66113069ac7436908f3e9f0e536d4c6c54081e490dd965d34767a2f9e26ce5ec761f30b9c561729b4be664a9274320cca48fc35b0e878fa6f3cfa1531bd4cffa1c09a47bedd5fb7871a56581356f2fa247c11eb60c160d4da1393cb46185ee744e220de433e3afcc3103a58ea775e4c5b8581d4ffe4df3770cf7b1a4ec174d4346440dca66c1a3dcc4f2ee81451126e069e6575fed7f292f4f9fde60bf3b0ec9c89fd92a04ff36ba28e1270e1122554aa75083844d3adb275cdd15a04b71fd25eaaba2522c2745d46475367b349ca9a4077d +result: pass +shared_secret: f7a280462f93b619888b5a72da3749556e53ef4f4440df728c8db1edcc86cea4 + +# Official test vector 99, seed: "2a6f7386b815366f572aeb6c79e272cc21b7095fe09575f18072c9d677da23bc9c8a4bc393b7524604d299bedd260c8b" +private_key: 2feaa7e47b8e973ca66cd8be82e5983d295eee270134086481a92e55d3a282cb4e702b234e3a49ae7b532f6183e0b57e4cf688121a5da377aafdd36f1180816ed91c28038776169ea0a11937e229f7b57447f4295f457bdd89191d6a89f6a7146b55a5cd16c743bc3f3f60bdac4c1ee7727946157bf1929d6b7c15836c6b28445601497e07376426239aa3c0bc8135570d9623ad828f858a6ec5e4946f189864e87249eb574875409aa22967141380c633ece33567da5811b9a40759403becc297ab63622bb9f0b5cbf52378be037882ac9b25414817b4784101683b8696a6f9178323762bc419fe939ab0c8640422743b3a7e628382d36bc42afc4dd206a160dab1d1551b0e7a349e14b5b66077d6b85082306b1dd83ad0b16157e0c1b910a5d3fa562ff2c008804f6c1caa8f18336082ac4f8abce7d4a1e680361140b69b80574658c6f6f0a4d27104dcf29c55c74500db129e55114121764152c0eafc1e88350816057197466b50da92cc034996001a503040b7847fafa5950e8acda9a3c3eaa6b7e475c806401be2183100447d82284515a1a191d01ec7ea8eba84701feb15bd149af2e66cb3844204e3bca83976a088a291fb6c70425a09e42d292b1afeb0c0ac94361b5673ffc25a4b5812d211b0aad388fe1538a5929edcabb11e317de597b8db653cdc552938925a2be642fcb78bbc271584a8b27904c4fb6001304822cba9b96b9b0a79901668236494d68a455129e9869693dab64d4b13b7ca6fad71942b955c1356735b0a27aa037b420300983155c96903bd4b1235c21e8273416660b5b977ce37b6b44bbb09bd197a97cca98cb87a2ff1bc9c0a051ed98560b6b761055d84143f052a686bb3623da02a208b184d1426683484a7594aa22cc705173024f35b8e24977d421606197e0c21c9d145c316b7cedaa13202dc2cd4c62224e01eaf865f7b018a4a938920f848f436ae530a591a2617aa97143f8ab2005b9f9b734c82145c34567c59518a8ca13100ea8b4e3420d698450b70237765b62e433cdd2a842468bcdb42a639aa9644d89f4840351f3096f5c67cf17baad6cba5c79c002ae25a55f224e3b577111b4647e0cb0cb12907554fb96b77a8f267593a3f506b1cf53b6a01136edc0a684e2b8b4825066053c8c232b736c321f1708226fc3a131b1073867cc0872c53a85426ca1bc3756b329598072a352ab82fa8a61429a58ef21c2833d1bde2c1a919c75ad52a4162abbe2829b2fe93c7990ac7cfec8eea930fc5cb9ca13b2da2e80de600325d965982626f001371f59aabff88c74e028c49d5ac3c766efea499e2375a330c91385831e990cd69d6cc8a415a4e563eafa0319607b171b130ac842c66589dcae283af2b884beb6b6ec84e48f037afab54fc2c6486a7a13c9c3396d3b6512a576cb87599aa7aedc97275766d6a96af28327dedb27386923b98b647d5003d5edc718b0477a5164000799ca30c08e8f8a9ee728cd0b0aef4c16b1d61c751e32463e4b785223bee6227e3f88fcb469cf250a64bc7a3149ab3edaa730d6b4e6920b7b5c2bd55b97473b91c3c1c5923067c08db693c97ae832427dc6439576749df139e19d9580ab8c49eb15b80e09e6845335fe1c21f16c49f6b02f2450f4ac135a9eaa5e24a3e3f350a6982b5979a93120285dac88e01923060a795d251c1fedb130828582c95ca7340b2e8e105cfd64f63e63f85a955dcc4b12b0482d0994df7ec61b8b09aa4d1b8ceb94b769a2ae12031d16c05cada3a4d0350e8d970ccf716953543a984cdb086c425915858d454880c97505bbb9ac7cfa54055526689033c8241300e11d09283441043b91354d1c0dcb4a869f225c8ba5b290a77629004ba336c8975366002667c99b88b53a4b08ab564733b5d2a3011f944b2259845dcb6ab8956836656e3370f5981203943b343389f2a98cdc96bc1a996648580b7fe837817ac4db31a2d325a869950a32d99446256cb3d8b91c159683bc8c1ff41287ca54530e84082bbafad485c0f179781950a4722c9114485f6b403f3760678e3bbefda309adc41ca562dbcb739654abc6cb05216807e2fe18fbb485977380d8c0282e271c7f1f8c14694484b76241a1b0cf3928ad9e328357ab75fe909957419defc8e0da3469e7720a5e91df7c4857ed50b89d18ffaf6a045e2c950e178adec7a3d690fa23527d3d353d8731857018d7cc909d081cab0370cfcc8bf8f5463a4fa8706a1abdf2c6a7fe8c834a4ccd8b6c869c6bf93c808a43274620b30aff22bbce53a7ff85145779cba220dabd1b597f4515c1664a374a64ae18884b0919668a70b371e24d2ac1a84af7de3b84f804e105177f6a9b914cb5dce45c678c886b3b24e3649cb194c548fba4114f278a56a4310a7cf1cb16e8ecc0b0fb8a2685b30631753b7f87eec8578684a67634119fe8cb334b67b741305aee8762639a212b9baab4032653b1537327eba5b6fed245d17631e748532426c5a4f4646716521dcc72f4c34a38bc87a892650def1bf09991e4c175d0baa1bf6469277f75a2812aacb88534c491f4d3c884a4470f01b805efc160ec17f68b0b0eb9910889a02467232fdb268848a5d6969c91410775fe717c9103cffb9a2bc13b1bbba01abb92ae303abfefc51af169d25d29316e7a12a5bca6827c25df567ef0c20f13a6fd728a32e229f72b42e74470c88c105bec0a12a1810c3d2a3d84b89a8c9bf66cc305f0b0c3fb989c3541daf147d5b02813e7904cc18a5dbb6632af4a34cd42007f09ab4a88c1705958058bbd6f996fe7642a0b45b690317d0e658ea82094d6b8d55722123fc1bd349433ad4850b19a4f6616685767e67bc21333a9f667a6c422087398b3331c075cea9aea6e29e424653d5e7a86766613732343341491726869eda4f97f1982e62c4cf135b1553a0a842b35e8ac23f29a921039bf31833f12ca8c4f02021559e1ab5bc37d247a5078280f02956ba2e2f897b48e18a769908e6b8b15c63b5a780580d02b5f70749a5442c824a0f56cb00378bc0ea2b033fbc9d45d535ecc00f5579a687865702436d3065461a06c8b274561d938d92290a8c0bbc0cc746aeb253e4823f8bd7b6becb5b1f8a5403fcb40efa5f6c34c43620921a416aa769a6ea1ca15c765d0e53c70b0a719f7b47ff783b63701af5a9cfe704c7d99830734c1b1fe00a1d9166b11060baa09501715310b93ead6825ba9998d922ae362092349aa45abb04781a98b25989e8309c40698a2676b49fbdca7775f554d2448358e6a4bf5373892b712b63af3392fa95dea1a8b6f12914ed31f14f79c652eed4db478de7ebd263fe27052509fee10b50f2d053ae77e0f9f21eabd8c0c6eea7767f4e10fde5c2d79b8400bf96b19014b457ec21 +ciphertext: 381ebfb00ef96db47a1c412af508a5509ec6e92bb3eb0bdbc9cd3611ec6b875764aa7dc3aeb515709f9d3b4cfdf6209598233df9a84e13a1dd779cac72eba5c20c5659e8c12677eebd55584cd34bffa6572ef7e83479c271cf5131bb5070085c3e513217bae58724f5e4ff3d5eb3c21d6c46e18fdc7d95ce55c3e2e697a0c99bcd8734628e1a93f73647ffc721a0d325b4cc9ab028e1f3beb2006b46a61632d1b69f26514c0ffc18a5a7443d4719e46a55476511c868427df2cd91d9626ccfdf2b1232aa5782b698d0d5ba501ff0c993b92b263e4cadaf631522a5cc7bd293554598dc42056efe2dccc8499dd574616092461bacfef03a85c4100550514651c5fa70c7c172ad82e3844a7c5c940997ca9e9cc6333a0ef5dd0c60a97b93c6bd56f18f014182b3df3e1127411b58e2a095b8fb4a7ce43fb5ac658135952c16e8c4a2ca78b780b39518dacfdacf9e93ba28972293859644c411e37070c877e6a96dc08875d2bd92d54b60a56951af537f02cc4dec141eb68ed3ef48e4d598a0cc899488cd73d2b676cca349b2c2b70d9931dd672bcc7a15d41db475c058528c5e1f8902752a4840be08a733f277b5ae5829c36fbf55ba91338ff92bf7811f5c660e12d3d3699ad04ad1d54a21174c8c630059acc5f8f46662f0591769efb02a8bb6af57ccd05d53b96b987f2ea676bacacd6fa4be275503a726d6f1eb65438ccb9563ae9bf6dcd313f3b819eaed568ac05192886e7e2b19ee532bd076999ab8e3e489bc596f9904e7c35b0d93614c6afe2081e5d9bf545c711af029107183f1ba308d78c4becec16f49656fc03ec86d8ee25a39d11517be38d270601f888df16a70733ec3230b1cb537db4e5bc13e8b099f7337f9e3e5709ad3fb8ce2445c332b87b9f263d4cedb3f7d30f014905a214ae7223fe1263b99ed02bebc0f4a298b7b1f4722ce622f02a6e75754e567e1ceeec73ef725ed5e7caa497d5e67d133a08db2c42d876599c22e052673ff4ca3a9802dbe7b3e8f69dbc36e713e8caa0765cdd74a3902d5a23dc10a01deab09d05418ac3b30f7c06e594d550843794c4deabf8e805806583dc30f926ec191786c661e66283b01d995adde5e0d2f59fa044abcc55b78c05613d88cccbbbe8ccc19208569493831115000a8c0dc41ce0f3e7818f0d2cde58826ea8c562b84999f6a9c3d914eb109af6c804c16fc0648336e10427800a146339dd6cad05667e98a2ad35ed890095104ff45bd7c51121bc141866671d097006b491b1e6841fd34f0ae5f8298ab62a4dbff7ffaaf67e1fc29656b75aaa1a1949db4d8d3dd4cb2ca2a8fa70ed3a70db112bc261c2b58ae0ca834cb2c358278d5af6c72ff4c64fe0734f6932329d7a6c6a6ac19514401128e45e33f69a8c484ee7bf11c0e729970364490affcb5fd8ce9fae282848b7c36957b033253b8aac9b83bcb9ebd551ba3a1d1511a0847fb7657b2da87fec3a5e0e90e9a0af46d826c5c1a932f0158e5daa18397c51cd42d4e8d5c8571a065ca8568393c6a5f2e +result: pass +shared_secret: fef3730b905431d14aa7aa7bb1d253cd912335c590b8d7de1e7aa4e0ff76be04 + +# Private key not reduced +private_key: da0ac7b76d404f6e3aa1f980380cb36dcae8d33f56c7267a00a67ba7cfa2b14c414239662f68bd446c8efdf36657ad891a3cc623fc68b667ff7b29a6df1f80155eeee429d6d18d71f94856e36a832c4d338d743516659bd25879c007a52bc9586f79876afac6c9b3dd8fbcf43ceff425d6adcf4fab7ed39014757a958bc8a74565f029f350fd4b34893ed7dd5501c37255239aae2ac19f8c75ac69d0dae8300dbba710ecfcabeebca3a38c5844fb286b8519fe36ad15b9f7bcbb06a5607db375dbe976458cf6c659825763eb2cfb6ee705e69194d804c38388376c27148413da9e93afdbfdaad69f0e8bd38fd53da8775c0b739f86edb31d7cf35a434d69b07e5bcdb87434139bdcb556761bb5f2a5747b28747d80eb9d6cc673bee5769377b996d36ceb1cdc7ed9a658533324869c19aea3703e470f14c5ae49ab0715d7f8249ce404b49c0a8c3ef4ffea9631fa2add10d86b93f986e0e3a82f7d3b74e5ae621ef4252ea89bad7fe68588460baa368786486a72e5ff4d2dd76cfc03b694a5ba91a755a0b98f3bf93308cdab64639aea7a6498a3c3ddc571141abca4678cd3efb857fb88f70dcaa596b44bd4f2251bf81aed515f0472391853701bd1eff94540eee876b7c75aad7dd845caba4555264a82775e93fd08ec621aee209f3fb24442cd1cbe94175003fcd6ce77a3c64493c199987b4ddc95c53c0089b5d65c92eaa7eb2ffa93b52a461fafac8c199c2f5cfb714f97ce3c394aed735ea8a14aa59e8dfcdc878399007e747bbf44ce46b5f233d4743f3d25c66fe6c4e9b1f4a112f5f14045f56bc43ffd2b6b7b378769a6b4710dbfb6357d468e4baef3857d379e2fb8b5e63deab36f74bb1b70ae4ffcd0439b2eced9d0fda2f8f6d0995571ffc38c590bc4c86e5c6addc98ef430f30861a87f3800ce7061e475d6b3dad1b47fd039c3a447762ecff11dd3ed0acacfd55890a68f4798f9aead84e3e0fdf8b21efbe8b6ca1026666ac6bc954da449c5ead8bba7b1afedd4d8b4a588e36d2ad5db38cc858437b35e61d1c3c28fed7bbdffb24a2edd2288edc315dd8dddd90096b38a95d696f86e9e6bab335f71b22486761ee9696df88119d497fac0af843c1aea76de8ecf2adde2c77ff7b8fd6d9a6e309c0f62f83fc9a5ddbbd077f7abb83720ffc11899a098375c4615e6b2cc88bc06f9ede37d8f3b3342e4490a85606fcd3da2abd256275382a3313ecd411158d1032c519f45dc3e6abac3e33b93b4a19f7c5466e58cb1ece4b4a96c4767f9fa7ebdf173cdf354824e0e9427f95b3b4a4a4a958e476a6e6a9ece6f06cb5dfca7d448dc3eafdb581eac1fcbaf4b9ac800b976d1ec766b6f6cc2addb66b3a9dd6fc5c144527a296bb07d433bf657c0437f87597bd7c8bbbe9abc3715d931a4a86a8fa2028a74454c9b810c88d28dec8cc98a1d4ca107a6b25ea6ffe4b6b03c9545336db8082f8637cc9eb12acc0954959b5fae55de97740daba0cafc156d9bb29ce1d5fac5cac882986d3283e867a3648366d7f4d9354cd8ae96dbd9802f7b88d30ad11f9c97742f5462235e9145fa2089efd8b87fe3377ec6a3940c1e30a0cbd4e85eda35ef580d17ed6c66f02086787a6590f84393a8e651a1e685f22478a8954f007bc7711b930772c78f092e82878e3e937f367967532913a8d53dfdf4bfb1f8846746596705cf345142b972a3f16325c40c2952a37b25897e5ef35fbaeb73a4acbeb6a0b89942ceb195531cfc0a07993954483e6cbc87c06aa74ff0cac5207e535b260aa98d1198c07da605c4d11020f6c9f7bb68bb3456c73a01b710bc99d17739a51716aa01660c8b628b2f5602ba65f07ea993336e896e83f2c5731bbf03460c5b6c8afecb748ee391e98934a2c57d4d069f50d88b30d6966f38c37bc649b82634ce7722645ccd625063364646d6d699db57b45eb67465e16de4d406a818b9eae1ca916a2594489708a43cea88b02a4c03d09b44815c97101caf5048bbcb247ae2366cdc254ba22129f45b3b0eb399ca91a303402830ec01db7b2ca480cf350409b216094b7b0c3ae33ce10a9124e89651ab901ea253c8415bd7825f02bb229369af972028f22875ea55af16d3bc69f70c2ee8b75f28b47dd391f989ade314729c331fa04c1917b278c3eb602868512821adc825c64577ce1e63b1d9644a612948a3483c7f1b9a258000e30196944a403627609c76c7ea6b5de01764d24379117b9ea29848dc555c454bceae1ba5cc72c74ab96b9c91b910d26b88b25639d4778ae26c7c6151a19c6cd7938454372465e4c5ec29245acb3db5379de3dabfa629a7c04a8353a8530c95acb732bb4bb81932bb2ca7a848cd366801444abe23c83b366a87d6a3cf360924c002bae90af65c48060b3752f2badf1ab2722072554a5059753594e6a702761fc97684c8c4a7540a6b07fbc9de87c974aa8809d928c7f4cbbf8045aea5bc667825fd05a521f1a4bf539210c7113bc37b3e58b0cbfc53c841cbb0371de2e511b989cb7c70c023366d78f9c37ef047f8720be1c759a8d96b93f65a94114ffaf60d9a81795e995c71152a4691a5a602a9e1f3599e37c768c7bc108994c0669f3adc957d46b4b6256968e290d7892ea85464ee7a750f39c5e3152c2dfc56d8b0c924ba8a959a68096547f66423c838982a5794b9e1533771331a9a656c28828beb9126a60e95e8c5d906832c7710705576b1fb9507269ddaf8c95ce9719b2ca8dd112be10bcc9f4a37bd1b1eeeb33ecda76ae9f69a5d4b2923a86957671d619335be1c4c2c77ce87c41f98a8cc466460fa300aaf5b301f0a1d09c88e65da4d8ee64f68c02189bbb3584baff716c85db654048a004333489393a07427cd3e217e6a345f6c2c2b13c27b337271c0b27b2dbaa00d237600b5b594e8cf2dd625ea76cf0ed899122c9796b4b0187004258049a477cd11d68c49b9a0e7b00bce8cac7864cbb375140084744c93062694ca795c4f40e7acc9c5a1884072d8c38dafb501ee4184dd5a819ec24ec1651261f962b17a7215aa4a748c15836c389137678204838d7195a85b4f98a1b574c4cd7909cd1f833effd1485543229d3748d9b5cd6c17b9b3b84aef8bce13e683733659c79542d615782a71cdeee792bab51bdc4bbfe8308e663144ede8491830ad98b4634f64aba8b9c042272653920f380c1a17ca87ced7aac41c82888793181a6f76e197b7b90ef90943bb3844912911d8551e5466c5767ab0bc61a1a3f736162ec098a900b12dd8fabbfb3fe8cb1dc4e8315f2af0d32f0017ae136e19f028f57262661358cde8d3ebf990e5fd1d5b896c992ccfaadb5256b68bbf5943b1328626ed79d451140800e03b59b956f8210e556067407d13dc90fa9e8b872bfb8f +ciphertext: c8391085b8d3ea9794212541b2914f08964d33521d3f67ad66096ebfb1f706424b49558f755b5625bae236f2e0079601c766f7d960808f7e2bb0c7a5e066ed346de628f8c57eebabbb0c22d911548463693ef3ce52a53f7ff415f00e657ae1c5a48fa5ec6e4be5cf462daffc84d2f6d5ff55dc9bbe8bb0d725ec64fd4cd4bd8dba0a844e8b5ce4b6a28934d7f7a050991fe185b506b451dabfad52d52cb2114ca7d9a5cf986c8fdc1bc10ec0c1869e50c03c55a76192a1049aca636ba9020bdaa8d0f58c763b0b89845ca06d4c4ddc21433e16b9c62e44871fdbc05ba218af871fdd7dcfa464e60faa5265264ce1391bd9a8c5faa7626d5f159b9805b975710a3503a0b858a11c6a647cc0e19ac88b1be9056c95b4d2087d0951d1d2f4992491117e6347794ba54571ec49bba71af3413d38a30bf5872248d1f6d07c86baf782e73d2637f043d341a00921857d8b21ddf3e1d6310036ed27af49e5de1b900fe4de79808ff29f9570859612b15adc01fbb265b305b1e3a12ae419da5b74261fa284c101da3d8dca8b2e4521aca571ef44a058e844ff32b16d5aaea05f7f3af8e2ab16222e347662eddfb891d0ecc2a55c5638f9dde92d9a3d544a5f901ac501acd1ea6a010201fcb10ad702c425a94bdf5890d500a2a147eee1d1fcba8c3abe7c2dfe70f346f033d816a0b2791b4f0b2d956d9ee5971715399a5688302495e2e07c1c8c01527184bcd0c208bc159f2e13318c0bb3dd24a6a7fc849f83385ed4dba07fe1d7bd5640cc9ed5ccfdd68763cb0d0edf61b292177fc1d2d3c11dd0495056bcb12558aebcfddef9feb4aebc57afd9023c65cfe65a24e33f1b00111e92e63e011eaf0b212cf95743cd07f5189ece1f205b7f6fcb2e6b1961b5404cebe47c8cd13b8599d5b49e6d87eeda36e9b8fc4c00635896aa2b75896e336d1b612ee13db811e1f07e61748d920f4865f3f11741399dc6162c91ca168a02329dff821d58198712dd558abb099b3a0baf9da1b730b2aa73bcf58d74f357b06f7211c804b6c8af16ff3509fad1d35b14bfdced7db8a6a25c48e5956480724daa057cd660b67ee3e472574182679d485838a6476eac02141075c812af7967ba7c9185cc2abd2a4545b80f3d3104d58d654a57792dcfabbe9c0715e8de2ef81ef404c8168fd7a43efab3d448e686a088efd26a26159948926723d7eccc39e3c1b719cf8becb7be7e964f22cd8cb1b7e25e800ea97d60a64cc0bbd9cb407a3ab9f88f5e29169eeafd4e0322fde6590ae093ce8feeae98b622caa7556ff426c9e7a404ce69355830a7a67767a76c7d9a97b84bfcf50a02f75c235d2f9c671138049ffc7c8055926c03eb3fb87f9695185a42eca9a41655873d30a6b3bf428b246223484a8ff61ee3eeafff10e99c2c13a76284d063e56ab711a35a85b5383df81da23490f66e8ea3fcba067f5530c6541c2b8f74717c35023e7b9b3956c3ee2ff84ba03ccf4b4b5321b9240895481bc6d63c1693c1847852f8e97f50a133532ac3ee1e52d464 +result: fail +shared_secret: + +# Private key not reduced +private_key: a2c3e5a16cc2cba3500aca6746967dfc8d8d171cd584bead737b50ee44d8fd1c7937398460ce829744e662ca3631deef7bf77710d4e4cd9f5a3c4734cdaab8f1f677b33694068bf30acb79b40f62f74b923afbb06ab880b75a609463b40e9d8115489f3a4f473dc8a556ef403b8ceded5eeb9818b627457a5843d5301cc34c4cb1db3be2d70eddeee4f69fdc9a685dfb89c7efb47fa4ef593a17a56d32abe0ae24c6b3e750705bd993cc64a71840399bce5d8be82b66ec9dbfb914673b6a5337394ced77d497f426cde194363c5d683e2bfc8be9d9631e58fa9bdaa234a47ad7d2a95a96b37c9f2a233e69b9779ce793789adc2faf5f9b5a9a8444afd6c6ff5ad6860c8ab1268ade57acaa53bb86c74f8cd7139ba48954ec55bee3f83ac5a47ebe3f8f063e82d395cb7576ca56a639b3663e92f79af13abc21bf51fe9d3524f9a16cd3fb631c83b1e7cf5e04800e193f1595c56397dea1fc996f48f8b2abc626c591386eeff604d223af5bc644b154267a0bc6c1077d78c993b3d6ede8f44c56363b9c5cc9b1ca6569cff876578b5e877d3d31dfdd733553551bea8e669f2999b6282db6dc0ee10ea550fe6c3973b6a396c5da03235142d7560334df78055f083bed2f59ddadb8b3a0dbdebae99ab2179f2b38b274d5efebfb57cc97f91e34bbe5fcba818a3f2da4c3fc8950f52cee806c5e6f4552f4ee87d83adcf92b7da4ff6ae04b8c86f7a91b545670c4d9dde5863cc7b7e30b937b13accd1c68e808ae6837e75bc8f39904a88a15824bf6489e1d44620844a6e9f469b3e1943cf1294ba5f27ce8dd1ade85fc85f34ec21528e5f00db3bee3f2de98a7f719fdf6ada5d3d6b425bf6b39ee931dbbf40244fbc12463aa96a0a1d4fdbf73ba15278a22448a4fc6d12d2e4def53b0fa233dbd096cfc2d45a255c75a9931d7f3f84f9b95f658d7200d343ee5801946f7ff1981ea9ff64e63940287860fa763663cacfc6e350e7a4b53f770253f34802f596c678585e3cfbcad7d782766c8399ac21b37a9be6a79e6a41f06d7469947af07c226f79145174ba4ccb4c02f6cd5cac54055b8a18e5020135b94e6560ca89c7d837e737a73a0278f0e9beb2a8d6c19858b8337967e5f7d0dd6a25a6bdf2338b23ac6a4a0496ffa8672d27d75cc9c3b21bf4fdf9548567a85f707998a375bdd044039cd9bb40aebf4fd8a37fb6b17ecc29c756ce9085edd76618b5c459bdc4e371e99ada77bd109e186f443dac6a9eca4ce9403b4c5dbeeb6d74ed2f79ce9fcd32174748c64416b676d110bf9e8ccbe1fd3aed7ddc168f9fe407d96403a3fdb0bf9515d87c6db9f2e54f33773b03f5e66ae1669052fe2ccd58ee868da2d6861a30b6814f6cb550a7d9324d80413bef5c847ca4e74e69db765869d0c9c6002aa377bf77d7f06831615de62f7fa7cdd83413f40c1088f8428784a2efa03ac8ddbf9d7ab574c4bcb356e9834d4fab5c29bf010ef33a61599c24f59465af4e43eda99c7c601b8ed2bbd7d65a9504bd6890628554534e1322ddcd03b5dfb05b5b4caf9167cf26ed4347c2ca99e3f7596ff9cefbc863626ec4b755f8795e675d5553308c70ffda8fee3be06af7f53075ac8de710ee3e77c133793c140f6c47b7e53b96f72bb18447d277cc021c144a0f7a35e30b57386a78ac976376262320a5e7e1cb42e290de684462ce1067e920ee86c32418b130a5a41a0e8268cfa7e0db2b441cb927d7897c42b1d50f9b32868a35a2c04cfe91040e9a9208902f20c477e1b1ee5c290d2e5244eb1b4b7b4c6ad074533b58d9914a6aa8829f96789f5cb87607569983003f3a2461c33c81a3672af5924c4ba37e6827fccf86d8b4103fbe9c0f6226dd0a2145a6b7aec76b186466f9c67bf169039259574456497140c8cf4ac05091973ac8c08d809465785a677a032ac09ad1d666e8c48462813ce5ac75f184b38251c30e362b0e2501d6800c8ad103c8b773780b6717cf15c401139acd54b1598b2b7c79492a86631090268c70d875bc040cb2b75a386fa96b092b8cbc25c47f70aa76cd8b9afc12b42b536e27c5578831a96dbbab7138c3f247e955a6c08b4407d4708f1914bfa48af4b28533f747b860b7076c028e245c9727b42f3248fb0408b3ef0c4918ab76ab96daca81afb1211ab3a0329ba1a5b069a68934c1ce84c2f72839311257fa19e72c62fb5686b61416caf8b22d2b26a6dd01bb7387f88eb8606980a5e2259cbd56ca1ec051cfc66f96239991a2360d75dafa1534c8a05ab9c95e2e586853714600a3455511b62d94525d8b1a965ce69f986731888d1ecce536000e4863322a83e3c8475d9eba5414a65b0561d24a7b09dca6ffe23836058bec0a85671641008c831233c7890783dafe8c359a263e796869118c4e74002dc3b0ec5b1c4ac641bafe30eb2bb743713bfed2c1e79c4a6f46593006acb35f7031f194807b893aa7a9323162168d384d0e96f2f23368626a2e027891ac94f12f30a044b85f0322ce2b16517d36aa3f23b5f391be394b54ddc28e5a9775372869a7b50b4898c072c0669d43c641a3cb5e8c170ba63bed6ad1008615201305e292e1c818e1ef64f3e0c52fba67e7249c1ec4a140dc89ce0050647f1c19f5897c77b9059040b4b5b4282e0669cb4c658f48f67338413c92fc7412e444bc635dabc93c51b030784f21461dca210cc6a54fdc25bba09705baa77c1826636b16644a5ada51270d8317a787abf53192d40dc765bfb45c7dcae58481af3a49fe762b90bac1f6f69a5de8045981c67906b9f692625fcb6a4df2641688aba61fa49a84b47c96661e4701e5826c1108069c4b9c6e480251c4b021d11cfdaca12bbf9c09a0234186668e389454ac4046f5b2468aa2fa9b117868574e729574ee57ea7495af310627b85916d6b4c708374f9fb0c9c3aa4664c6651281d8eeb98132c1af13a816ca5b869f50b50b291efd466dea090918630c6fc77247c458aa82568a41dd9d4708af3bbca5a5716447e8c2c24ad788a8632473fdc4a257196bd2b549091176fe654d3694e10a118f7b66d1cd5af199b6e90b3bffa88a92e36717fd4bbfcc78b0e08634bc080c86885c92c8ef67aa4933c7df097891369bac5fc5d0c36737aa60971310adf02c257f76a7a7b3f7e132c2a71c52ff4affb6846391c0868241a3df13408d419a78bcffd49619b03a192c683900a244289c9f7b4564823900ceacffd9a9371260d5e57a8271196f4759eead0ceac318966e76f68de95ab9db2ba4fbf83c3b27092cd339cfe48d5ca0ba11591d04566f4ed24a57b00751eb9b1253231213f8a14f06f0fe1b7a4fdb7d1cfe44c161e577e5e8f0a003271531cf27285b8721ed5cb46853043b346a66cba6cf765f1b0eaa40bf672 +ciphertext: b3b339d73dfe8e3db262cdea792b4e3ecd712a75750a3b206800f11116637b58bc75ea61bd74070d7132309176608c33989fc510852c0f8d07e9862b79b069cfb3e5b78f277a74dcc832ada24f7d522e53a7cf16a7c7d952ed9f4dd4be4910d880e2e7c5b23c6cf9077e3d350ed3e7bb54ca7b39a9f68e98d2fc844c62f3eed092c8c008e4c2a28b3b1d9f34488655741ddcc440be7828ae39f25f52f57d8b1cfe3967af165e5affaddc8a85cd4939221762be2f71155c780ada5103976c77a76f838bc52a72544b22cfde6b6e843b4e552f1ba47419a8a8bf53c388537c1c08c272a02f4923d9edcc54dc767e6613c6f832889ec05ca805fc09e326d242517e91607005af03cd1acb242e630d6c20499dec187d8e5f6d421e2ceef7e3f74b751214fd58b6583bdc5ede65bbb643974d5cb45533f0a733a3353724e2d7e6821d99d317eec8781d3f1e03528fda480da8cd8e8adc51585a14acb5da154a68573b0566e5e49a53b4cb8061cdc795d13899032d549ac8f7c35099eb2ba0f0df4c9558444f4fe5f88bc46c6fca1b257c62d2116efd1c8cdef5717068405201c086da4143de277649f32538f537f8bf13a65c05747cd44f740736966422bd247f4be9a05acbcce53b9c1b0019096f93dfa86948d7b01d10952926b7a6e0e51792f9be6bab620b9fec660a2348818e4b47cd5934ffbcef5aaf20c3acf9494ae4df9d23f62a2571eca8d37fb1c8d29d5df0fa30c2f17fe3788032d124090dfbd000155ad8deca87190d66bcc9b1e3de392bacad79dc62be0d96eaf448feec5ef03544db3a782e5f9ffa20493d5ae6a58481d23cac7d3eaad57887bdd706eebf15f505d07e3592766710a658513598c94d2ff3eda5b5e900fcc9da8c012633c96a8b9e1da548dff60b1a763bb3f5ada6eea3290a01f7367f7c2384097ebee2960d904141b6c7bb30bf640350da34b9516d9f73100476e7bc077e0f88dfdeeaf9a2855448393cc26e14ac50b67065bb3694933bc64c622958a11637f9c995e17f15cfa663e7121c4ebd5fc1e153bea84c66843c90110e587462c623dc67ff0da5dadbade9b9724ff804227e188a00aa6c70bba00aaace8a035b96a595ee726fab666a08a4979ebd1e230a9c48afe7779cdd9f0d019e2400db9f686011ab05c4109db273c236646b481ac7251fd70d23188f943f6f282bf059279464645c9552de905996f2ef355a4d307448aed53728b490baf108a7d2579dc46e44334d1d99f310c8c953d4b3fbbf6b15a99b263775a1f9f0c0fbdfa260415ff4f61c263362c95fe9fa72767b8625f09b91c393fed48bc8f628ccc76b5ca49d9c01223ab4c1a9f25ac97ada8783b576575fa699140394e53daedf683ee53172ca9ff70c27a3f940675e3239e44a24804098486decb72ac8d41bda6e2d3585e2edc1e47cf1999fc67aa000677ba66ac22576ea087b6e7affd5c1617b3d94fdd314d17e6d37f9e5347807fe21fc5a9d75b3a25541cfe4a2d2c9efd00859d713cd6f67314cba4cc270fdb2e6 +result: fail +shared_secret: + +# Private key not reduced +private_key: c237d2a2a8b54046661fe48e8c686ead8d7794eb4a67454d69bef825c99c73b3620f1482ebb7ec724cb8edeae6d06afd630a4b7d967d3304fc353ad7538a8ccfeb481776baf84d73fee4870a0de32add87bafe6d36f9d7ab89fbe2b86baca7c58b03ec63aa556623e6824dad1cb45a70f3ad8f88ac7f6b42179b62707ba010ed776ff45f575436ae7dbdab0769e05587314ba7f29dfb2ce653625fa5076a991eccb79b9d835106ff38c75bc3db7b880fa104155b881f9b2b3a6d3a157fba573c1b96b2b8ebc5337f67aa47847259bf46f54c316bf6748a6f49eb3721e772032b6f0dd48a44755eeea543624cb62c6965840caf314c81a7d49c1a2ab46d047ba55f44b9bf92f82f52844335db1584974dfe1564d86b5afdf69aeaf1737f744bdbc5ed7be50affdcdc4ba03cb6120e327fdb6e9aafb1df9dd46253ea5e45870f5bb61e058b21ea5a4f86404f99459b4c8cc5e9eae4e630ff1c380b49e9c3ff2f06f633fc16f451b462141ee7e60fddb0cf760c434e404944fdcd3d64d5aa8beeeeb207f8dd7e917f7fd0f61b53ac7497eb198a417753482c3fe988c53883372d08ac11c5ae58af4b787a995f6acf6e359bc82fe032e4bda65c618963b84785a86ebef36289bb2a6b67170fd64dd43c781fdd8686b47daeb7ec2ab36c17e41fb8693724ef45e9f21acf5edace3d14c7ad682640a5f88b5574a283aa370aff6d9aa739f55c776526321a4fcc8115a69e89dae357765c8ad5ab45f66dfcfde96acf5e1f6ca86763e18999ea5e3f5b68d9130b7e2616392a45e4638b39442a6e98c44a360d5fa4a6b1488c9f181c4747a935626895f3d6f3ddb44e1d68ea11465ffbcda0a2ffa5f98e456654490a2bebf1e4485a94841519babcdcfab594b1c263ffc92982db3994162be5195cf65b679fbb768970f885f04ac0706f692c9576c81b897a0ff2e545b150c9a57f33fdfbfa7d9ebc91f5aca92a3cc39af9f2f1257f1973979b46ad1c967bab8dd2c46d80a926467f277ac234c31d7e6ccb954b617694e8eff8165aebe3ee3b7b855534fb50b88c937a29ece493ceb19561d5abef198b81c78371a58c5ca4f38bc6a8efb06ea9b60941978569173dd4abfb82ac7f9d4358c207b9e5d55458c23f50bb8e3a8a5396cfbbe157b4a266033050e3ec1b74afc55c645cff56f00392b53fa9919fa30ecc456bcaf02bdae4e5c741830c931ec377fc163b5f16b81b3897fecb961c7add8d97461cfaa8f4c48069648e8b48864dd9923babebdd54f90aa66291ce51034f85c383fa2c7e7c5517fd2168ae930dd2a1c44b54ecf4a01457829f3138875d8f5adc77efa79fab7d11ae41c57ca9c8434c8dae8e9e0f71af6fa392ff8c5346ec75a9e4852859f1a7dcab1f4a1ffb37987f3429874f3098e97af94a9557cb66fb76fa84bbf5bc875536d5000ec67ef53c5e5c68c69dd057f6a36b49e386743bde6b4800b4aa1c1984eac8a728b7f9ae6da6322af2d6a9b27b56bbc7c65f7ae343058f7e833aaa867766089d74c9fdf0c32b87fc6564e5e4953df85b24a9eaff87b052847fe647eefb03a326a96514dc6ac804f206f59dfacedd679ee1a1a9b08c7bacf2b4f2445d4ccb9abd737593aac6e7c02b820292c46c8a8a92975a2e27292cf893a7f54a84a67022845d66236dca3c4844604b16879e849c7fe3475d03f82323d822ae2cb6763842a319114f5c77754613d5fbaec05aa801a03ac1989a725337ea38a668ea65cdb36343ec3d690ccdfa47ab1fe473247bc488d98e1e33175920a0f2272a03982c8386485bc2c4245884f1d941750a1d27fa85f0067f5c377532304261aa908bfb950894cecc1bbfd197ced78a641366b9199a4ba190446e03ae51549be7959c87a629abf24cbb7a58d01cad4949734f797ae300a78f45c70f668506977d7c85a0cf64c700a5b1f7879801bc3ac75584302c8bc81c0d7f6b237a9400681bacfc7192f9c653f8a9551f796ccfc262d3a438a551ad74c80ae9e3b5a7f12c5204ad44c21f488b7824a4b1eed79da9b44e60d8b225490c062b924da04f0ef0252304cca34bb4fc70ce6b1800fb6c5dc771bf7bda9e9db2b6c6046a1672c6f6f01a0406b903411c271b20e139a69138adfbf50c1134ae0899c166b1b1a5d818515b0dd94895a253059b167630f3a0dd3c64cf257cdf93596e54288c7a4580404ba8da541abb1b6aec7e530c58a61a64d9b9bc32d870bc105ef7063b9a97519b871a60d7aaf8c193e948c267c9c815063d6a603ee8d2249b386d94395804a9af8cd2184800c7ccfbaed98c4f9f95b70145b448387183f5cc8f4b5f35a949bc74706bd03db7645c2d084624844a55a0a5abb9244cb5b8736b835b512bcd912361fb660479b2c51b99734970808ba5c6db0169756cfc986dbda94915563c15a109aeb77c01a7cff55c8430696d6e83aea5d49292462d725c428b984d15e97ed4a76403094699e1336426b54281067e675788b3a4fcebca4431bfdc8a49c215ba11004a341516018419abeab2374184b0e2b7b7a54efc678e812588960a0d009418e5289eddcac582d3c73dd93e1234518da003648853c5b5a24b389e88300aeae78c41e62e5ee303a56b548375757cd42e21a7c59ff29a133868d1d0784197573464292547161b3a8689dc0c7de11139d407f0b5784d942278d49462965f21f72cb992add160620f6a82f70aa9a830190ce3c9fa8015071c2877483c2203bab7228ee2f37bbb17c1a4bc499ec249ffbb42e4989905a878dc873e456a7d9db946572936d8d81777d1b992c00db12a35df1348ce8c9d1a02898c7403d4107f45a6bee864375b623d30e0c191f8ad835a3f3709362cc763d63c2b91649d722825402c9ec1b1c7aa02b154d69e39da196e72a25928212fe0711bbb2fd2f9550a361a28d4295bf0c036d7b79be9130232060206c919f8b864f03d6f02348ed2c8001a30124b40c6d61dc3e18bcb27c60bd1324d8386da99c3e098cfb94b018031a4d6aa5788d27a75a67b630327add804adc21642d58080956a03f03c8193ac302c92e949cea31721813390382c814b2c5a6d34a1eb44b8b62aa77bf88b5067455fc0c7be967c21bc281ad38ea6978d228a83a820c57b4039175c910a450e300101cae45b0736a4dcbb0e6eb58491da31de3b65cba0a7c80c7815f677eea7ce5ec571bbf7c4516c65e4b2528e160959c815e1bbcad0a29ce59573d749453d9b6b52a951de9b889c79cb355c345631070b7c30f1934123c9ec68ebb324d254e5d246b14a0259e49b2ccec72b8c4948349bda55b63cffa9bf953993918b18cd6595ea6433b479e89b5cd3c9339e4468cbe82fcc97ca60ccb27bf6938c975658aeb8b4d37cffbde25d97e561f36c219ade +ciphertext: ca1e236472b3fec4e2afd4298eade05a462fc19fa22e6805b386282edba027bf2de8d13b825deb40fe10cb8c79be238201a81d7ec48400375019164b1515853e69144453f1999346ab1ff386fb3eca8149b5a2b7acd49a165e0cb7f7509e0ed5d9f279637b26570b16ff34f904a42244b15af7d3083e0cdfe3c03ea42f73c75de1860981b8a25756bdb18feed4bf461f765583f0772a81d40508498b54ca8477db0d7067a0d9f7d00fde68644fefa97c5e21e3f3ba7cacd67cfbaebd58930d7665bab99a94da09a2572b5b5232a366e556c766aaf5807004c6d3725ea33172eca8a6dfeb079b0de46ea9af3f8627ae8555ea18c0a0c12b211826768d8a8a1e57b1a95c9d98bbf1d5ec07348ade6f134712dfe84e434fae1fe9671fddc8bbd2b69a15704e8b0e62abd5492afc1835bb24013cdb83f62a68b329e8b340b904bff04b4eae972df87bed79df39313556b2cdd348f83f5bd248bbeba7ac06dac17156246083238f988cc196b5469a163d602b70b1901fd240b480d67484dc4c0e1280bbf6e528a4f3b6c734587e33a1f4442ff0310f6c83259f7b94a162a4a2a49e1047fac23a245b2db3cbcc94192d7fecf40eac4224ed4067533e8f2d468332307fa9f82c089663781851a2c3208a23cb089ab744f4aabc1c21717388bea6fb01789c4d77fd4b2e0395c841565cd8c9c2167ce483a363006583d895deda5351c1cbd0e182f59782e5e76ea45d9e8f38d683de8865e96e8360e811559c3e082edba99be598c7ced451c239e081183fd0aceaa3f75effe43a7c8700b1bdc51d0a5e1e482237d9bc8a301b20e558df1f8d520163edb8705924cd6b8971bbc3923f8067964e6c99ee3c60737ef170f5aabf6261e5b2e6430dafa73ac9d6084ddd0ed62ddf2a0d4e064c7a04260198b94fdd02ebcf817b511bd90f6243cba7ba91a8dfab6aa8f48bb67696f575da25234ffa79fa53a4b9de2ed0f15e9b20c52b764e26c5d2d0b13cd3ebdb5d560b373725556c7fd152f3e4040cd7d40ac9b4f4c49e3dc7f748601bb4611c14e03b37ed79658e2aa69e0b47f42710bed2e4ac6bbf37dbeec69a34b6045126a017732695c5474de44aca2f2670c0e36bd686d9095435359d173276ffd07c25900037c2a4974e6af401dd55523042bcf36ca27880775cdbfb6b095cf93b491dfb0f2fb0594d7d9e46a3303e3c0da3c5d39c2fabfebe6a3eb9e7c2af3022aa5148c84f9cf8f4899697c781497c70042030918353e56aa0e4bac6fd3efd8f41df94d5668802c9f63ce6fc51bc36820f0e60b2085642e502d093d3bc12849c553e05574a2929659cf3afa0f33eb117d79c3fea450996738b38ff162f77fce86949c0553269dd8fa3873615e7b75dc5429799b191cf209202dfe18230860637769df426881db849bfaf585180ba15f67410908ee6b4056acde46a1ee862ce0c696af377efca2a2878d0922bac97a53ae95cd5160f07fa978bb57ef8ed3edcf5ff907d25f50f80e488c7ab79b11333d894772a57d1a20d0c6d7224 +result: fail +shared_secret: + +# Private key not reduced +private_key: edda9b50af880d5778280a51a26ad2b5dd8f44f83afcc7ccc379faf517738bf8aafaf53eb44dd4364aabc42bb0a74db12266bc6eac91d12486729fc4862d9660e6f5c33aae9f38535903cdb178bc2ae557e71acee92d8169e8dc74044490b3ce4c06b2b68b44b3cdb47d3c9178344f7a7a30da49548656b011b74b5cdeb23a1b39f9f37dcbd9ec697799759dd7f80b3d55f6cb81c9f6311636001fcfbbaa31bc0f689e9b3b994fe3c2b3cd8d4395bbd46dbd25b345ca920f9b3546fe3d4c8d9dab0f608b4c5a1e14ea98b3320c9e802544aaa98a4916c7c49da792f7ad4a4d64afa1294a8f7eabd47c4d96e9f03c86e0a10b762f9eb38657ec8eec6efa4f59b854dc379e53ab6b9d6c5f99437ea866ffded1136435ca490264a5422d770798eebf74be6259b913b38a2c54be4ea88de1dbb3eb59b91497a13304c54a23a3a29ed6757ed25545d967b6e2b55bc82b2faed447b09bbc6f92fb9427a4baa183406ee6ca14e35808e33bd339a9c438f13aabc6ecf473c38b62aa7c6cc8c3df9a559565e4e3c805d5cd1ddfafc4420177c054fce9c946dc2e04504b8b7e7bd86b821be996b8e5347d43f65975401c76a863a2804bdc80b6d62f8f7daa973efdaf3502faca371cae8c4fc4518b52070b91ed07a5be9c9dd30438669f9890cee62449ac12589115e7c14776977bb34aff985c9504d366dfdb4ce6f1680fc9ae9e345d0ef1ce1cf96197fbb6f4f5485efbd226ab8fba97b9ed74eb0746d71e40e07a51187ff7c9559c4bea306be88e2b84515d5f8af3ba34cd7ec06e7cac19b998b23c549d0aff253a33ad23b906eec55fa6d54c3c4d0ee68f4b447404b8a752f4a9cb6acc624a798524e055733f47e4f20ffe64f6c7b6573bbda39365891cdc0318827b8deac477d8780ae2ff24b3c57b56acfd9ed2ac5ba554a8dd184fd09695cb2c798bdf3b87fd690d6840c77c53f98491846cdc335b601b26582d9758a244603045e39c98b9a723872d16694a4b5166bfffc39ee4235e855998cd6eacad79b8987f143b5a7a69feda51d67bec0e453dafb5f09b2f5c1298a8fa2fcecb2c6ebc63c763ff85ff66746ade371cc5ac957a495b55834c3b3a4ee9bf2a85c5b716f742a940a686bf0149542b6a3510efe44a849d6e7eccbf7336fa06aa4f7aae89e586c5dd93145b8265699f5f0dd1eeecdcedc96e3266d72dda4fe71789ef1c4734f3f05af6e7aed6a8858d83fef84c621f8c00645e6b53e9ba5dae042fad845a58bc4564d2bbcb9e08858aaaa8f557d70ea54412eb5b608cb7883472d10abf2cf4e43e56ec1efeeb5178cdd99f4d93666ab8f44cecb954ac53eab9afd8d91fcc29073e2df7d6954cf0280bf46c83edd838af9e4edc1548f38743bb71fc3547ad8fe4e35e9669d3f2fb7e1aaaf201f6a86f38b2202f906d659f4bb8a226ecb8a107b217ea41e65fd75e0ecba7caaf1c97c014a97ab49666e10e5eeac597718bee1e8773838958e0de7970eea7b62583f575b1c0e676a916799bfacec28ba707974131f36bb239fce4e99cc2046b68a6f4e069ae46db94fd66a5ca083851a4dba26341bb99efdc96dd5384ef085bfd9e846ec2bb5eabaa69a8d96a8975a1d6f33835a53225c1215d624156828088b63da622afa9fc5476b3603474b24d8394b93ab494ea3eb0f33ff5d91a33d34a2f666235ea009e35544cf135eff54e3575afe2fb15b6b59a4db843c25139ed345fa170003fda60b240065f761570471c4914aefb01c38fe36b3c7b80f77887a03b74bafb64d3b922701a86b027651fdbc777bc4d90d387fc15b8c12443af8636e35224c0430520bc984d71c56df26e84b683c1dba081b0a584b5793e725775482ec45b1db7c84949644d405579659cc31db130bd190d2247210c043bc8f227450ac206c13e8baa896e471f7cab2bdab29220c051ba354dc404767e812765c66ec19acba3b993caa2c0bc2367dd50846bb40d6587b51a76277f6865a5c69d885553ddfc200e970b9c0666c1854efc932af57a1f3bc0a805024efcf978f77b1dd739604b8a87b44b522ea80e87ca2cba7220e62c441a429d19b76425d51cd1e61e2a2950922637a1ab84fbf645a1f6413c288b731945d4029958d56db90aa01b712c83b73aa88581522757d505b83e61ae06eb6f5270021c61b7dabcb0229878d85c8f352a9a4349bdecb2ab0c2ab4039940a887b665f8b9dd10992b3b0493db6074fa85e1382a970953ebf113d4835e9f031d390836732b3ea6a89145183f72dbb095d7617a3abdc28912972035f1cc30aed3101d91c9eb397680c8ae222aa61e515a9396cefcc75c0cc255535a3f41212141c12558881e23798e1748bbb5464adfb167a2c44388044754a87a5ad1ce752c38b504bc443a24ff73a6cea4768e22681554b56dd59da1c7b88db126b7ec640c1bcae8a20b5f864ea6385dbba1c4ddd31775ca9f72ec6f137570fa9356de55c5c2ec92048a0cd9680837f98763fb35d1431805a7420d2bb803cc37bdc90fa921bd4d18b4f33419cf03ad0e2360d92192d7d87df71bae83d2b538741914892c0d778cfdf429be268a22f4043c29b62ff74fa770156d93127c3a7fe2c6c6c65470d1931f85a3af1a963bd919ca3c437b43d368e6e7a199407258b8bde88b4742192673499ac440b247d97225e7554482c6aa6567486074f15b19588c6d9de4619d4c493bf73f2bdbc05343a581e95197b64dcd8826442565bf629d5ce4045218bb908701a5e53b2d0679720598fa1b08f286b60e5c377ca7afafb206ed4712d6d16a47b99360426619f97db0059a15592353577765a8368d93928802704836c2279205446bbf7a2465042816d7907f143635b1434680156523b02cf1d8565ca5c7ceaa126a2753dc299c10e4968a4729991a0f5ce31c595629301c135b5810a712910a84ce1f2164c3aba248cb89c591ca0d24a7681c0a140672bf01c7f5c967f3e41b9a925af6ea75408a24684b725b446a30d0199f67af94b958c4b979c2a841b28878b5dc5154b79c944c7156538e6a130379674bba5438d64775fe1a87d3aca677541bf82c27c6d18f3bb182bc7494dc91b23c35392f21ac49e69e3c70454bdb16b2394d00a549734a1aa4790b01508be670841e09042e5a1a4a73c3b830ac5a35b826f36411639e20576a89197426005c08380c13a4a464892bc6992e236771e7b135aee096e9f65738c531b8e63c3f4a922a79222cf8b8309a04c3c7464a69982a072fb895714eb8f4e6d0a4c447ac97280a7a7b63bd585c521a49bf9230588ddd7034647a81f0f1b3e3dacb6e73e900f7c078cdfaa7119a5ede48c7685fdb7e0fe2f5de950541fd53a8a47aaa8cdfe80d928262a5ef7f8129ec3ef92f78d7cc32ef60 +ciphertext: cf094e965c6a8d943b28fd5520db2fad4289e6770ef897f6ba80f522a2d240e201267890a7ee3d7bcb86c9996cf962bb45f8e2cd7c02c42ca4d226858b07078890b65b297bebdf776402566cdce7b52e8dd7e9f920a07f8430b58869db5bb6bc73f47e4b1b58905743fc6a63a116d9fefd1985c0e317536c5d1fd40a99e493655b86be0567eaaac00c67a83b40fe4babb98823051f7e4c565c93392df3a67b214217e62ce0175aa8fa8e3d5a290f420fc03e4d259e76c5668219154f68e1c3f1b7b44468c3eb8001bb764ca252eeb5fb934989e89d4e3a507742ce31ec20e57ac42fb9222c18b674558814636cf6af142f525ec3c8a7d5838e752eac0de8fb1d77ef7e2a979dd2126ae587e7adecc8cc21da87fd661d932b277a154a7c7dbc4caf567199660f756589fe8f77a441e6f31248f28f046d003c4d7e6146f9829827838a3baeada58163cdcc31ec0a78303695a9d51d24d72527ca3896ccad6009f701e486e6d73c4a4ce1afb00cfbb0a1e729ca6e726e4c8a2164d51e97f50f65fba4a8624e679a77a458675382716e57b74d8ed323e06f0f0d5af1b5029870ceebf657944e337cb408a0352328564cfa19006773d1b794d9216901f5b2315150bfaafb04db04c7ed09046c2c66f24fbd68a0cfa6ac5b64363459a73e3f101552002caa5e83a1f91759b5f86ee50e915fca750bb5e95c2f8bbc6d5d681313207f91d524a1a510534d9b844f39c898f9941ec4713eaa9572d8963866cf69a6d87e98c54f7a238977751b31460ae699b922c307116c3bb2e90f69bb91c8c45527065eff726ff640eaa0016022c5f1ba2261faa37f9b34eb92eb5f55ac6c3828a90be3265be251fae5a1825035e8021b70ad05a78dc4ee186bc6af75bc7ad7575831daf735973e8505d4ffce88873167aedc55940d19710dc769fcad490129cbc84ed362472accf2ed445599b2ce72465b85b4e1d6d628dce3195d4a5fde5b95e0a2ec025d5678bb92a440110839b233ec4fb34a6bfedf9c1a1d64c0b5b20f502167b35745f83ca64857ffcdc91b1fcb3739048a48a3da1d2020819dd93544e2c448760d24862401850de85b61c438a23de01be16b5f1a433e9d3a1132c638ca97d7f7485af8176ec8f14601439438552ec3abc97d29f5dd1ef805bc46fc9b77befe95f0641a94c7ad1dabe80bc168fd04054ef38b85b094b2083078f04cac56742a4c2e505eb11025a104df668dd9c3756d901dece91a521881ef207e0307c0b87170e3faf188ad9b8c25704d41dd6b5111c1a594f5ff7dfc4c78e78868f7ee7dcae347a70abb7968b4ffe8bbdabfbf52c853a7fe165f4ba616a9e9b18d00af0093f1e06efccf8863f0c937a35218bd6d043384027c5972687c1078c31e4de6b1edfd13fb149cfc9787759351f5b1a3daedcab46367bf6b4ba159dc109f7f79c478da6d0cb7866cb372770bafe05bd95c8ebfa090f70d6f051430c0f2ff76a036679be20ec3bdd91b5323af2b3273a995126a8d5f413e4ede9f27ccf1dd8974bdabe3 +result: fail +shared_secret: + +# Private key not reduced +private_key: 9ab9e962f6556eafeb81c4946abaf6b62ac53197a49e27d1eff367d7bbd0b27677cee5eb9619541ec8a180db9a7ed7342d4ed0006357895ebbe9095816cc689c8dea0cf7acccc64abb13558087d3a6a759a2d89ec01c9b8196573576c06395335bb39903187233a3c8991e447e8346dd7dae390544145abb150d4e6e23fa43e59365bf49b3cbc13084c9a3487bb0ddbb66d941506d7e6cb33b35d990dd04de87135c3abc43a5b431b72ac9981b753a5be7ea48c3ffab5917b387657bc53726f631e76ef6eb68c77dcaeabcc613b439a2ff65d22f9f8226c1a76447b535a81bc3e1b59be2373f4c2086faffe367155678ac0ebae2b3bbbe45e9ccc6840c03d6e53fb5c92966f468d9ddf3eb7d3dc2ccd77aabaf36ecda9260c361e71c7293fed152de65bf6c9cc709a4928f807543651a844fee87d38779f1af5537365c50f4dad7b28957265d5db00c6a3d34d08905ed7dbbd7dde7a49217a90bb46462b4957bcff197844335c6f0e12f6d1df94ffb5983bbe8aa3197ceb628dead6561bcd791494eaf1b954dacb4c5ffa694a1a45065efc3b0bac1d265abbdffba35b8b3b0f660d83680be6ce2dd2437a46a3367d6bd94e4dfdaf5ece2ac800a0881b3b3a12995bad3aafee4ca5e07446944fe9aa5dacc7b8c9042a5dab5ea60a4e54de2e8378589722b07e2a1d9f11357e25acfd7015ef87f5e742ac79902e4ccea25712953f85fe5896427c8efff313277b91ae9cb55bcfedc49b2d194a325f6836d2981277df0990fc457266ce3688de79a40d5b6a4c2c6d6b57cdb2e13b262a9dcf23987e138742eeaf4c0cb551abbe024fbd95f9f9be557b17326b2daab78ca8ebd26a393a175385acbabb1a87984cf71175cada27bf4967d5143edc4fef9e2d2ee9d98ffceeb1653b70c9003165d7d5a4a6f9e6bf0298dffd9452386f7910de1871dc1bf08eb59ec4cc99da717af9f4bdf4d75d53360d4f3d0d9f1e66b59d96347112c918ff680ed56dc8d69ddb11992cf86caf3ea3baec9370456c6c354859c14dfd2def6f736c92f5d860694b29dea4c1b03e161daf59e93d35d0ea27ec57eca8aca80c6c93236ee1f44b6af9adc571a833b8f6d2c8b74993f56633dcac47644eedc9b288640e32b4dd85f82765ce52b87648f7baeba3a73c31c7e2984973e74a6a7236b3c364bdbffa5fe64b4da0b49448ed2a65dce050ff1ae9d7e8863d28a47dd0c6ded6fa849858339f63b8beff42fb598613519dbce55d455b561f6dfc1d0a846dae4b2fea86507aa38c2257eca186ca21b87364643ccb668f7d880c164c398f9c46bf75a9a7c975e463bcc0b9b26d4f91839c43136614f9c9133793fed66eadc63992bf968d4c373b863ee6bfd4d58476b33585c1e9ba49549d43f7f6340c4ccea2f351a2f7cd66b5f3d05702ba6d0a2694d5b23c4042b603018cf25fcbe4cb864235fdced9fdceb589b4289ec010cc4ab3d6fdb55452a49c6617ec81aa3bac70de5be88602a6b4c49ebfa7a9a57e6c97bae7bc483f5a54be797040dbd2445758027311e4949ce43859426b23999a0568a55b33d4a838546d3f4b6cf93d3798837b229b3b1aa3b3eb6dbf3a9aa5c8b79f5293556a45010b5a571ecf46ed749711cb96f0cbb88a8c1c298c7837b2f2c3525f2313ee5cba7f6dc77413cb58ed86f75d26b39729561c28b795073c1994f69256eb0ba9c934146c4421419475d005150897a17d310bc52f43d50e8ca5706a774d5079719754c6336d1142d2387bdc1732c03e2a3a04a9dde91c46612b54ca6ab15921bc20ab4f2d21910629ff4e37516870d60ab8bab08ce45dc89ca6712f17869e645b702141ef5d64f67f62156ea90ef1c502024858e91c89de92056f3675c1a6eb2191e17300845cc3f7b52cf93c566ffa732c362a8e89c5b6f4a5a827b6259d26a31932e3141486ecc746027776a852faaf0c3c436c690e3664ffaca01582022a99130bcc402bb7234a14db7baaddf7981d6557dfc44788c7506be021359e1917837a3c3d5a598757e00f77b6b785436b6840a16151939774a10a7cb8089fda55e6ae49f30512d691716f29c8a9fa94a8a113632a20c71138851ea6ab3f84e6e18b8531119e36cbbc6d0229a491f6b3b7e20866dda8ccf802abf47a769676550e2fc52ce438c48946eeb22756734bd4572c501dcc311b26fbc9c8ed2100a68e44435520848590375b59687c94a685b6490e236193c722b7b4acb84ce9a69388d13a984f696b85122c3dc0a5c38c2992ba60a280c9c6783855093a9b886953194eea273225c1a3e10b9db18c548c05c392631dc47320f411a618c943b7a201c784885b62f7c56a6b698abf1c76a039b3e6f95c466dbc31b4173778a9d5770b68b8a8195e886e8191e043b909723209553bb942a96ec4cbda1382d02f71a6c009bdac062c791c12f68a1f0506478d1869b782bc8b0181de6ac62bc8dc844aad6403a2b907f2d1a992bc44313f711fee1bc70d326e7199fe411354db2c4ab2526d09227bcb42cce2650e341368fb493d6754715736f8151019df22b07e5b5bccb3d0d161ffbeb2e93731600c85b6ccc226c790ed5e7384e8c3555497c07ec074f2253713b1ef6927ce4c1a80da11cb609c826718a5474230d62a40b0824675c95d0cb05b7c77b1dc4aa2872b8083bb79e201a0c847061e18be1d2ab68b2bd55d24925db5f4479bc12dcbc834b0254b891bf373cf5c4971bb0811182527c72c2ee6479217c70214106b416bdf0d818acecb63fa6af4d7031bb50312023acf66986c71a25cd8a88d767844c312dd5198b965c3df3e244ffd64610eb0cb3431f98889e72e864590191692b8857675afd45b6cc31374888b40183720e1985d811098738b63a823bc7716f9ce94ec70738d7f5228199bb78b811ea912500c71e1cd93c955c0049519ffa8b523a7861b6b2a3dce97d82449b00b8961877488b50542221ba79aaa0d33b3a47025acbe47998952b08e27ac2fbce08d6bdac7b6990297504194bc0304871472cf3cb952d439646aa86c47986d160afd7f401c70bb200e6182f91872812c551e17ea8438ae4236cdd743159802b034443e8d7ba0a249b312ac91981927440cb0bdc8e4615974bd2450161614068206bdac3c2e69eea0912f8a4ca1af21ac4c033a6076e6d13039c97ca930599aa12b93d58c09d663de14158b72ba0803a1b7917b71284802340422310babf6572aec23ae33a54a1f9c65dcb70821393b95178ba5acbc0756dd8a02f8afd156dc73958bab2f2c0d24c2436f9f00b7267da9f8b2678c14626ec811aea11a24a4b09e428415f82ee836e930c3b77867aafc5e6728149e3f2bd1bbe2d3c64d38269a1ee8660b9a2beaeb9f5ac022e8f0a357feebfd13b06813854 +ciphertext: 137f6e52087c3672ca92c3eec5ddd9e4915b42239efac9fb1c21267e62f4421c1b10de7e404dace358d8403d7662d7079abb4ee0eae1ef912b84152c35c190b48ae0ddb4e8bbfc9d94ce328339ed810384bd7006f07c6b65a68cb10eecdc10de690f8885589f7d7269c659d54145d6a99b9d1ac8b6a381b3c9df8265a904781bd2a8aa5e4c44c5d68525a01c3915955b2c0a8412040cd371977caff50edd1bbc643caece877270385c211cb0d9a4436fd0d0368ba885d8121dd6db0a96175e52918360435d1ea75f9331426aeb8b870344a7e628ffe5115d731ac46238868a61f0a3939c359cda3cfdc4f853813f87036d32e36c94659c42e7e57455b6f0cf72dd6d0cfe6706003c9f2935c5f2f99aacdf881fa458003c61e9ace8c849070ea67349f23fcf91fd2a13cad14d8fbbffd0a66e93e1c427276d541bf8a763e435c17c5d0b40a53d95830b2e266352a92a7156c121f5875187c0f341b236f63ac8ed3aa9f7c04decdbc422723b360348038f44bb9c5e1c7c9a21ba4405ba57dff045c2393c246a430a04260db49648bfbf9da7c3ce14a2a47749b9ab028313d1524e085d90faba17e5958448c20c1c3b4514d83f47503e1de6c9422a4ecf5332645fffac205b8c46d8d0123d6a889f48cce238546a48b526064d638c12752137a4e0a9733cd4aca910d40dfac757080684500edf82e678191f1031f6abbe51a6ac0292755db514feab858bb919d4bc2dea14d1f1c3875b249442ee3d1959bd9ab288a01596f490c47b13fe8469c282e8233a6a7e4ffb48a4cb754ab47be470b6e837db29886f45821806b64824e1196707f28a27f5b09286e711688884f8be172ea0f3dc0f22f8c554ffb181d135cde9ea3b9cb984a9403f459d98b81aee62b9f259a0b855abf605e59e5ef2506fceba5699f4511284886065feddbcef499a5ba735049ba2c3fe812cd741bd4cee6a9e7f4c7e27fa031d4ed8588bafa9e1a724ad3d442b821c4e197d0e0fcf65b24e9a3fb4f22ce221346d811c304bd4b2fd91529c722ab08c19a9b06212f78edf8e61fdc7ac463696fd2b9bdc9aa14e1033523c0ee5b5043634a99f027e2155c6d8e7a489ca5bb6faed913a8211df109df805d07d5bac69f1c42665f54726d46d189f9846b6f15cc5b8a9d3dca6dec03973f54c43d9e97a68f4f56ac4d68280e061ed8b56372cd9f58806d142dcd6220d07bc12b6ba8f19a7196f270587190e1400ea90b91f3f9dd1853e1d1919d98d763f86f82e2eb1915bd8ae55f0e70df6e45bca23bc49af9631825da5c5e9179dc270331fa4f2b148e1b6358e88f83ffc464bb715fcffad465cb8ff1b893a6f985ba181495b43282dbb99b6f7c00ac74eafd2588d12262a21a3b1da5f642f686b7df77484f0486a5a88634e2bbc1ca1ee719a47481e76b5d0ebbae155985d14128164ae3881b0e626e8a96c70ead4822ef68402a7fe703103b8dc134c89fee2c4fac3bbeef7ddee0c8d5dcfb7336adbfb36df18c2632b2582db285d100b4501c75cffbabfe4 +result: fail +shared_secret: + +# Private key not reduced +private_key: 749db68b5d71df2e628b6f56426aadd676c604479578e4e8ff77b4281cf902af9085e9ad9cb8ec7639bae92f74ee094fa38cafafff6fb287f3c8c3c2b5276e28dcbd723ea5b0bdbb248f49974fe6ce9ee18a98edcfa6f8332661e0fbd7c55465403b81d324d7cc6bf0b214ef5455c3ff8d61edc7ae34ed6982999e196ed6322564bbf9b03f3d9e1fa6bd625eff1519ee9d5f3885c6e34788a19e9efa4cf4372ff35a258f3a020c97cb59a9f5b698471483b054e0108afc2d98f4d1ba5646a89e697738ebe6926c54874dd6a55cafb89b64b1aec95f918a65c9f9fd8fcabd59ef5fb8bd7fd98dab48f6581b76ed4ea3cfda38875c9568a226fec367bd79cfa7f7b377661ea8ae16981838bb3fd6d06fbbf458ff964bfbc5ed5c67da4987ec997d5eda305b389cb9234b3aef3ccc3e6fee5e8f35c757bf77b501b983140f82f5a8d39435a6b50fb67abe4f5c2cfc69f3fb1ac9421c888b6d935911d4aab56a4b39b3a2c6c8d49f8584d85ee0fe63a1cbd633c73d51953b9d12f36c5e3885dffa5d463d9dcf56bcea5739a85441deed6b9564a4d1f4e6459a809964c16d574a42eccb1805edcae7b016ecca4eff365596ce27958d1227a72a4ca336d4e2bbaf6afb154809243b5a448a9fc38b39dc90d2177f143be959fbc767146dc9de7a3857b84e987479759997ea85ada8662035a939b3d412a771b3893ab5184dca5ed6ef0790ab86e7c57c8875d842011cd8c24fac0f3477096843039f9d1d4371d00fd29aecfc9a0a34b1f4a70dbbc3b29de1348c7e725345a60e97739a83a86c7af54960c11c3b03093cc3a39a7e2c8fb7f84e1d55f02979fbc4a872947af3cfe834254845d46bcf050f67a946d2b74a6fa968db1355d0edb9bd2aca5cf1959991c8716e28c2edcdf6a398444b853408b371ae438d4459a3a6cbd0fb73e75005cf161f5137cfb069b9560e2e3acd3642c3b3c2672daf8595d923df7fe8f8cfb7b79afe08b9459a36281379c4169b73234c7649b8a14e6eee2449ef8aeadded7910673d2ec3ba18e749152ede2bb7a9343b74d565ea80dbcf61e5f367f38725a4d8bb7b87d466593cc9b872766cb81fee9c84ec040b397d94fa80c952ca1d70838833efa83f36fce34bf6e56dbbb63f8fdb08efe97a4b4719f8a7815b682813a55e369721b88ac88e44b748e77d7788c2a7de869eab378bb4f26998845a8238b5e352d33ed9b5533797a7e3e8d1b63a3543cee642ecc9e48d8db757d0cd7ff762b4e32d8a4ee583cac889800586d351d6b7107eb52dea75c07a7d5a7d875f6ddac14ce4f2ff625e2e7ef144d4a493526c1e5c6b0de6416f9e07795fa88e95ce23809a1e475e9ca00cb3caa0b5bfed575a6c33bb1645ec60bb5bb16df18f259811bc669ce68fe40bee6369cb7923d13a26e08e9fd4f1ed9f361e56713495e8ad45175876f2836a4ef381b6b4f6ae55370ff4c8e85dd15687a8829ce9436d605825f3bb184baa9972d946af2d2c34eaea986a3d4b0a6ed6fd759b214d908d175f02dada8786faf4b57daacb432ad5558b4eaadd2c49222460525e78740c8f552cbd99653ffb4953d42e8f8efa2fd7aebf7ad7e01c03f1060c537e95381623872a36d7a8447a317771b7e77466880e15c76a39356cb459b78e6821e69b2f0f817b236a04a7cb834a743f830934043856e0dcc376730b3afca17aab6ae2c59ebbd57f52d84cb107b6c5e536edc31e57c3cd404a618700aa1dd87e43d92d4e601ca8d998c927451e9205429c643b251e8307553fc755dcc06d9003c35c310780b31ecdb05764e3c479913063978143fb9a462b011446394a287888a61f4f57b6c0548718faacecfa6571381ce25c2d10c27386cc255086419275a3ca59bfcbec4c63e5b487c41661520495e7b54b9641a1e16dddba5794a42d42e86b0007444cba4db161c6547c69a9cc18b2923b2a388710578043b77513173f6eb0190854bd6cd2612d1048e79435eb17680e99bb932c232b1ac298591d98a881696b3a46e117bc4a50565ba52e4704eb1c23c057894878434c61789ee8a594f94ac55748e2b111170c391b6b8403099928a2c60a42383ce5cea5880701aa5b60e4c789c759c12703d946416ed316e48c62603920e2f640a347a2f305602f4138aa82b78cd08fa071ba1b9711a333a3d22244dad09aac8058592b1edf9193291c8854b18003c6cfea4a8728e7ab378905e3d04349fa5e4ed9baa17b41b0a7189ab5cd0e352f174a51f3518badfa7df523bfcb64c43fac3bc5b6532bf4ca91e245e1e61a815c865bc7cf3cf87891eb1234a49b624c0e1169c400cac05359b6a15c9f3201b21f02c3ff0a4b94980757688ae0c48d0ac5c3fb650ddc38a8167c87c51cabd1698f8e3654380cbc8819599699615ef5495efba00a7a2c805c1d49552183b37bdb782f652682e02b7e26893fd97b8a7025affc7062e99557751a6a1da7828d7a003d0c62c8d006fac92589594fd729c17f38c5c83bacfe5bb8add8c1749a7550765f872c22e3e8be9db4c50a915fec511c31900890192861366d9177612d731f1912ccef5534248408c31605ed8960a612234cc23c94275a0b77302f0b82b4d121bae15539c3111b9a21031314076199849302f4274fc54b284d95903cb543902aaa5cd39d034304ee86814c6119f7fbc17d35c68b151e9048434973ae06030cff855291c71d58740ea00254ed926ab8835234490bad7b51eab118accb66f4a6a172c9a26717376e678771b44d9d452dc93988b9c9b5af98907b17487bca1397b8547ac8382f8a28a78a91b1b105f107200e839218a74d16000e90334ffc8709976b7fcdd4b742dc6bd2667ba6ac24dc510314f6b98dd711bd7a7169798874225627f2c7aad1bf37e97a4771542e8c7898fa0d8bf4c0fd91bf598580df6c0ce231a96368c8b8435f5507429006883fa88ee4e5791c2685f61c9247e72378478492ec90778c5fb8aa4a70e6cd48890bafeb05798c13795c58b62b5ba8f7c522e78365089ae735a796825d9ea8c572a6544aea86b2e08ea9748cf6b5717103a6d1c02f5d87a5e1aa94beda8691d454de0b547e951afe05061399804bfb32eb7b0857b8851810ba48e92518ba798dd54135a74419217a687620a0c665a050318e3672cd616f6d41618005cba6ea47faec63daba709acc2489417fea39b74ca2b13d4a60ab61ba89b2cdf0912757e08214b0671d8867cd2794fb30a8983b410f149ba2ca7134d00f83ccc8d1d4e2f1e83c9d8d4b95e33927f84741e362d80c3ce5833b7f2498d841f4c7e076c64235d8bd63438f13dcd038f286b9f4242070a5bec4d8990075008667aad3a08ccf451b049fd51d7a9ad77ae14a81569df8c9bd3a8f1ebea86fdcfb823082 +ciphertext: e5c184d0e6eaa03a8e46165eaa4ac0f9ba855636b6ef0900ed320d1cf734f2964662080c1b756c073874d531dfb937b298375f594ea69298c3f7c894cbbdabebf99f5f0c9279df4a60fd58e0612d5146f7da7f708938b2297a75263af995393341b5db7d1ca67ed16571bc479cda54677205833b79cdf8a935be6d097996cf5329c90a1302c9a9b3d6fdcb28b725d8ced9e6fcbb939af5105a298b6801a4670a647a7982227e0e841bcf8d7b8e5e473f534328b5b47ff53a5ef4abd2e899b401887ab69e4290e2e59f0943756584612b7e508e3b270313f5db48a92b7020b9875b5ac8f95e439c376075f63a840a8c9ae9f379ff838eeef0ef6efaeae941ee2d9a74dc79237409e44a4cb994f59605a52f9ae85a350385dbf421582aac40cbf2a21b5a1157950d1993d037c0dfa54753232820cf3478aee60e7555a643dc34ba68078b2794874873b01e4842eb4e9bebdb3ef8c4d224d3703522bf76d5f92b6438914656b4f58b94f1ac72dd2b9aff350209128dc0c707c89dbfaae0cd6e7d0fbfb38e88b25ad92b3aa2f41f6b09a003882c6e1c857dec8d0c0c1a884bb176ca5a8cfa152be28cdf11ac95654118b355d8a0ce321f7e0baa42a7e1391292af8557d5017b76db0b320be34a129b0f6ad0aa56b1af43c49c74897ed0da8f9a5455c84340f5b929218c7f2b0891b5e81dead1d9148a9dce9397674085d7ab3735a199a0c0def3bdf917247b5f287d82838bc00cf7babeb56b00b9c737f7f470374769ab3a26b318e964e5cfe49e54845c99c64dc81133aadd30f0b1fa7bd44a55449383be1495b13e83074b4ad3857095270e2c77d2a516d021dc55f900d54d99f7720e4f696b9c12afa2cf990a6a4f41f32e3be28fba5d4b3dd8b22ee160f831886551798cdabb447b08f5286c4617f67e65485732a09039d1ac07d5e54b8e06ddd8ac1d5160fb6dcb6366b22154b144a59cd3ef76fceabed5ea7fa81a6b5b36590584c11ad304ca82c2ff2c1775c6459073f75055680dbbe80ead7e6bcaf4867d6251b6b75597b9b467d3077272f1034084d307731e5fbea1c40e2d5326e4581bdc3387e2f12c9d7fb31438c002483bb7854d3e3fcf2b80fe44a2129fa1de3fc475c64f6ff0c1722b801201b0b810c94004bbe43f7bf0f56f1b0be5268244efbdb3b8adc85b128f17ce218f01b5a22f41349114b45e1216039ac03de43d067ec7d033df560bce0f8f63360263d8b001963dc824ab6efdcc04406dd70f9b4dee6c129c512ae3e6a45b48344863298c53a9b80e514b9c14bf85c2f76c0ae28a4122e6134259763a6ea7133a594305f3178008d1e9502f070f1e1abd66559a5dfb5b951bde39d8dc444f79de7e548f700c81f5c0e4e419b085bc0bfd14c6f01f342823263a314c834f220dbc4993d29e2ea64653eab1ad2c7a556840a9fb01dfb02b6d37fb4d872714db07e8dcf88a70a834b72902b633ea7934b662cde95430c80967d94af21bf10d622e20a30d0af2ec18bec74e1d8d9d8af57d0031607c9c7a5a +result: fail +shared_secret: + +# Private key not reduced +private_key: 2d8ba8d557fd324746fd3a4a9f999726dce3871a6ce85e30afad756643fc05dc3b99c8626cd699180df6f6898a321fb711ace68bd86e27c6af09bf92aa37745f993146dab93b159e9685cc09d750ebb58ddd36e5237bf98e94f2db54b97129fd69857d3dbec910c948544b6271aec5854936dfa643710b631c245e8c0dc430ee5553af93b70fd378e8f588cbe64eb3636465cb0bf931b78cd87a475dc364e4c8a6d6943ed80df4ed58644f14143c5b75719194e72fbfadd8dcc059bb5dacaaf2070f83b5c87ca06bd68405a9e2e4c7cb88941e7e62667733b95a76d2e3ab9803b547047c95eb86996beac0ad50346788ef0c682405852bd9bd8f178e4adac309e8aca30ba6ab1bc5f8ca8dcca6f91b6e6d77e3ea0514f29f2d6704ebe30e8b44819ff833597d36db65d0de30d4796a254c360ecf799d256eae54b01a264af91fdc452faa837a61dd2c983345bc158bc878987ac50fff4acfed21d47f336f5ca038663766851763eee3fe3a5d0665c8e4ead19b3faa5379333f974ed3e93f2568c19f595c0d9d40f3301f033f489e92d026e06be49304ae616347853c1d7626e49cd14c46be4660884bdb4d87f5c0477887eb771f3d5ee2aa49bfbec00d6c42b5c33fe0bff5db0640e973855e5d4ffb7db23c7ce869caddab69aa2cb75a02d9acd2f57f67cd98328fa335ef796afb96ac2f93751ace106ef19a994b2c66f5f1ec7de199e841ddc6f0c3d0ae5e46b5b682d5a6406455a475a799c0ca7c2d89c8bb759fcdde78d288f17d086dbce5a5947add691e518dccb37e898be6583220ef62df45f7fd5f71e8bfb164099043addf2dd44491b7f361cbdaef48e06cf5ce7dcaf316fca7ff2843f50ddb7ad94727fd4bcb65fdc9bf4d6a644444ebc10cbb5dac08afceebc9dbf7910e13ec8bc5d38bcca34dd77fd8c7ceaaca63227e5e639b5ae7573c0a0ba32678f45a09aa278b86e30fe28c5bc6e943e063fac6d43c63d227f8bb79e233337668e74010bd8c54f98894c45a3548b74a8be490a4b600aad5aa9e9196dfdd835746d19fbc6d4cd2d36e3e5193f04973ed3dac37d5a5ed51afbbc5c35ac63a8d9c13e8c259eed5fcdffdddbaea679150ab737003cca56556064bfabd07f96e887e92737f375e329235492d8ff1abfd609c9bff54a9c00103de7314581bb8f1ba5b344463a890cd46d07adeb52fa524ccac23f7bd722c487d955c81836f7b49329c9ef31d47ec7d3994bc54874e85bbaf278899c544236b49c04c688ab6e70dea386e1eb840634e75a3fb027e6fb33459e63393f8eae281136f217bbfe9deda14fb675e1a5075ce55164de39c57312b4c9b5f4cca2219c4b35b63b169dee6e3ad66e3d1b56d9075737ff7a37acb7e93d489762e75ada15ca43fa8be156f32e60f9b3f2a7d94f551ac6f5b8f963c79bab41234893189f3eb54ad998bd04ad53b343fb25dbf7dd10a3576776eb1d77bfb1da9edaaa42c385cd5c871a4cc37e29a3da2f5e683a78c09d63e64f6895a3dbb324d80028473bc8c53ab7af038ecedc018c21a1d8087c3b2bc2389e96d9c0a8737f01c8dffee3e2014a77f37f2e006de72fe62defdc521f434d51a49befb6140bf8fea1ded36cf50792bdc611425c6bb62e8f60764db8466613486836fa07896314a6ea13a56e2f467483848c3451602e4c6ceb2cadf378d85654a63024c5e1aa3ba242136e5302881274c1316cb26004a549b19db794fac3f7c454fd8223f560636fa5acb56f0611911954131ad94ac88272b6cf4c89fa0635a7a838c38c92e1d640955453ea44ab5a6a0868cb9c071e51705e24a1cb1c4c9d8c59082757fc5cf95b17ff0064c0c47b021b244de30aeda11251fb170efb279154515b69cba0400875c78c1844503d411521ad54c651a738bc32da29ccfe992bbdd937827c6503735116ab5079dc04006fca98a66acb6519187fca7ca935c090bb8d31b6062b34513f01e157976183a1873db1c9e878a3eb37b650205ea5245fcb614887a8def4bb44b89cbd3c221e1a9b587a8c4a50633a9f386e6aa43e360649da46ab688116e01aa75943ce061b362d74ea824870a94cdf84b38d809bea8c994d2e10057b78ea6685fee45548e6bb681a32f5346ad5467558fe6c345e6258175a84edcb32b378ac3bb24e85739681234c0f1633c334df7d853c9d00dbde8a23d463289423536a44bfab94f2c76c113fcb086e5c4cf40193220c40b509065cc3ae5c861212b898699ce1c224a04a77bf165b0bb057c30d9cca16b4dc8128e7c197a4999372906cbf38386d66c27d1e36e8d504613c36d8f655d49750a72509f32f09580fa4518d9a34eb63ba76c063af7cacf158607890380c034e2429e49125c3f543c77c3066c374a43d24a7eea2608a12b845a4c42f7354699bb169bc720b175ce7c0d6e63843f543c0a84162e388fc21c313b3a5902430cab0a61d3e3aea195b13cec41e38539f41c6e22d63f5d60825d7182ecb31dc8a0a82a952b765c0eb279b75d20be877b8fb8fbc290f56efcf5240779bd2c639a67476fae730be123236ea68e4afa9d3200d0db30b7a771bb97fc1667e94cff70bd02f32d6b0b19548b61bff4a43fa5cb73ea11483b23b1394ad5812c8875002be49510656794033fb3150c7e13611126afa639355de9c04de445eb5c7430287815771a937707e88b3c8f42587f30baef55aeb7a392c14a4dc858abb9d537f8043c64100aeee6a597315bcdb65528286e0fc7ad5a59a066725cc965c562acb9d6330f28220bfb35b21cbb4321fbb556449c5e1108c46744e48c578937cc12c20df49b79ce96aea9b231892597b8a57683c495a9729bd7b969f34899116104abb00ee4049ccbc7c37ea5868ba5c2f4a3934d6599ceec340d6a488fc28d84ba371456caf9c52da9980904e253e54332505cb9322b1ce3c1904c739433d99fdb35461d4b3f949c8734904974c5cb7dd54531e86e7f9a69b8c78e137a77c0eb6b1ff468d0b2973819ca6a69b1e640af8f3b35af45183f5284425393472b3b7674503a86592947621dac8352a64427d313d51716ed6cc78bd85412d97561c910f31923361485d138b80585cf2a59a04896b3bd8c7ec2923ccd290c962c343561226a076e7e13a0d51233b68062d0e02512aa96fd701ecb80b7f45b210311246bfb594c5059f25c1167094f966c7d88da77ba3a71d186936f6007cb7cb4941c599103792edc82e3708e4aa9706da72ced51924d19ba561843c3a70f3f91b4ff04987cc4a914fc6ad33290975bc0b534d415efbe43f7d4a4b917723aae654e4412fd220548280b7a6ace9f2f0bc7b059fc103060346e53bc3c3161d884ef52db5eaa6df8ec3a0bc5ffa730db0dde8c5f38f266d5c680a78d264a7b96 +ciphertext: f2c88dfae11fef0a6f91126673e6f27bf378e78c4e3f96a8f7cfb1a81986926e1d74d0c7b47d9c2454941e83476abf9d9a7e47c46dd39f9cea1148dd5cd086ef9a4431864541d88e3faf97f272d98ff861382e007b4c84ad5a6cbfb01e89f6f869e6e04cc1bc86eaa782b6f0fd4319ce74eadd18b5d911b8d0adabbcc45f92c1d78e4bd21662049bf7c85145d180ebf1ba5ea49a216a1c8130bfb4e4f7a3a4490735dd4fd9db3c7b2e0b1191e44c4fbec765ebb6dc058ebbf08577f24ab2b7f1809baf9b16c5b63b5f63d72923140e477c24990028f2715a28375536d985d7914bdbdbedb02b1696e4e7dd95acd7572b579543e4cdcc2e2d66e64356a07c9a93e567b06465a50fc4bcb899333000d9ace41c7abdb06bfb81d553a0e743a8f36d0d30f675934dae148ff00b96951738d679cbd8b15d0bade8eba5244abcd3bffdab5d03b91f4383e498e8984f1795569889877f2a6920a02b9b741602d84766459895f988b31b678ada1593429636002a67eba87cd0a2f627ba249699e2cdff686c03874dd57f00beab2db22360a31ad7496c510f5c91842aeee3e432826e9b124c3bff3a6ed01f0f8f576bde8c1c81eec09082b94615086024ee3aff8ff87972ec80a0fd319218d8436b34b099987fd4e0f8bb9326c32f48b7c9a4e30b9f24845401de87d212d2bc26f0fe00d1f6273f3af8fecf9e45806f236657e63615ce16949d7ef40239b637dc01bfa604f7c296ce62f9b251808abe8b97e0de81b0962982936ddb9059008d38a1f5f178cc1f08c65b703f78b8f6caa4b436e48de6bdb76ad0cb38ca6a11a1e160cf15d443d2daa201ca450b01e79779d1f7bcf8b88ff031fb815dc2bb3018b609d6249b4887e276cf0abceec216ed529484842a26c91a1b6b3d36bb237c098c90952230a2efa628dd30b232eefb0727a20f088905cb183fd65f443bcbb1b61fd0e6b83068bbc144e5754a0c09bff18c7d20562c1d0afaee00c78dc0efcb0e7890afe8c22751ac7c10693681491e09371d0d8d05778c8152892958ea0790e18c8bd00d8e06f444fc46828d43997185476dac9005683c51eb483ff552028a7638e6a6d08d71ed5c696217cf47a79ca6b0c6194f1ae9b94f2d35c2fbc94495c557e59bb70b0126aa6c495f42f8a5f7eef82d8b87b9ba582956eae20501ff7902c4f9e451aca0ebd84c20c678b149d4f924be9a3953c3ce85e985d53ae3de46bb99cc9ad4f6eac2de214c0bd5ca21b1e8f3992e96ba1bbbc19608e160bc059a0dd1be05cbd41ca51d1118d6d1f2c83919b69cb051a3f01a3cad27b9326e793c69fc13f4c787a85087907fc8a48cd988f0796d384af60029c1ccae91a1824b676514e5d3f4ecbc2a372c9d953bc7d5ab900efb0476f18170fc0b01ec4c17797056752bb912b06d0e14113e6e961e85f758bdb11eb94b85232748a7f1d75edc6f0123b2f4a89c8778cf7768abac61d73c40e8971e841994e69ee80ee4a456dc02f7cff2911c1e13d078b63928b2c59026808422745078b9c361 +result: fail +shared_secret: + +# Private key not reduced +private_key: 6d0ce30e15395ffc3feb7e601c36939f3ccb691e6ecb66a551af84c09bafe6bc93ef9f9efabc348c0e5ad58b34f589891d9a7e3473d56585eb1504fe945eff8105e2ac6587cf1ef1d32a4760bcdb6c3779c6bb5b4c0a983c7f397c544b15cc7aa395d2d47e32040889c575bb474bdfca1bc1c518e54976d6bb99a7dde8861fda4799955b1e0f65361fea0194dbc82ccbac7b99f745747dcacbb0ab34047ee0cbb3eb59cdba3273349f39f7fc0b32129beb42cf56067642adea66cd35482bebc758efd05b8c5579c5844989551cbb7377d550b17ccfa6bac2cf7de2701988ea68d436ed533bb5879cf5715eb75c6a4ffb9015a4824b33f2647f0b23b4343940976df7cb1da58a8a4bfe883c5fd9df62eccb9eaa3dddf68b0c1671bb249a52898faf3397fe07d02ab7f3f0af7261a44d721acc9c8b6556267f06e872e6888d03463c407e33eedcf6b01b9687acdb5438a1d218820d9e782f7be9ec5bb9646fc09d1c932aaefc466e87364f4a05c64cddc9c8b53c556f7b43032f6440c6909339603dbb5a66a76e0a898c53d7d0270bb1c375c2c92cf22b4c54b1cf848cf5f08e18864cfcdcbd86507a1b87df79f9c80a6bb0e93d6fbd85fecead97b7e3e3cae471cec33dfbcd89b8d2acb9c22215f07333dea3179bb75cbf1085f5a938b49a65fb8fecf1c36f740a55724fff8bb4d63be0efad28c3f46b4452578646623ba78509a287cf58e69480a835c2ba9fdcedec3768fefe1d7b3250aea51558b31b9e4d9568bb22f7fa1b55714488a699fa705a4ac58dbad9359df2f0d65df68b8841dc7fba35d6d70bff137b8e6bafe788b5661657c677283d17ce69615493691f939759fb1a8490069e7f696bf305f5f9871b61811b6cd88a53579fc48e058f9cc8f6bc53411248a15c39b2e7ba40000aa9d5134cf257e574baf01f1f60176fb7d393be919979681abf59136dbf44a1b677d4d8a68b23fcfbc1f9525b986b8a74da2f754702ccb3222d5c9ef9e6f744ffa86c8f48e8e7f907f308474d660b5f23186357f43681d93440aa562ca93d3363e54b4fa4790a8811439a85ae9f8a087b8614c6825a4eeced35b794caa70aefa967b63928965bed44f984dbd4986fd3eb78f2e4fc7623fc89d960c04fe97c53f452b6b2e117b248f5e1b8fcb0fd95da5795fe071b6567c37263d3b45bd439095ba0572584bb1990c1df87cd8f6f13468d87e9e725586708fec29c5a7fd4e67faaf6558fbb8990463298edda1974d70583e6b43ecc9129e1e7da8a82daec77159c4d654b74fb89e5597ce074dce97861f37b79b57f91687ed3d6ec682287dbbc4dcb743fb841f7f43cb55a934c488555652189bac26c508b438ed6799f2d1d8d4367d96c73d80af57f00df7731f4ea217393c2198eead7adc7099e1c0e54a11d816073882fccf409a678f1ebdc6e5942298a5b2088a2abd39b8cfa8b2a7c605758f269cf9b88566c5ea7d42f8866f469b69bee6db07ce65709eb66787e4a06597a7cddd34dda914ac1cbde96d5564864c5a597ebfc62f4bcf64c4cab3bb077d331337a6b0e39c0399ea64a369b203ceb5143dae01798b3834eb87cc5bf234e7e14b5a419b68d1e4fb0989d2a67bbd0da491d85e13790b3e85bb887d46ec144b4d8ec8bed82bddda538eea77d818c7081b3bfcec68d496035b71280b23985c6d9cb7580568286b405f937e99a8ac1fb28a927940c0a7cbd36290d130a1c23a42f3a437c6291dce36e39e8cf2ea8b9613c1fe7571ac74bcab99bc452b9c5829b586e5544e27432f06ba9c96869f5b1228a0a70fcf95212b0b2b84b45f29a49b6572483807543baa6e4f8b7b40119a5d483fd20224932a3af6869f00c8e9c6c5bf4c53dbe092d879bcd7843475a3110a559454a7375ac0418c37444a16a164acc751f56b2ac97a1158c76bb9976d750cd23761265d16473429c3da3b82eac213876c20d639bf5951e94d939985abd149b99c249445f4c9cd7421ddf21c536bc8fc2029e65d5c7de083296d88bdcf04e38d26dac500ad4457cecf8a795322f45997bcfea18ebf807e84c659937cde6d89fb490765ea9713b768ce05099e7386b4037b961a81edd79add8fb9f8ddb71ee56c349b453d2a3bf22c56730bac0ce19c4f961c008e03ed3928c7d068cb6512dba564855289bdcbc2f2b179dc7631b9372872d05c4e373577861a67eab16cba898beb2ab70c69447a156df0b36ef9c451931b4b7212c8a850799563cad55bc89fb3460f0c56ab434c5e9abe9363f1992577698af0058b54bb5b9a7b42e8d148d9dccab2d1a31d661018182ce207c036ff201a95b755e041f2e1623bef565b01a27d870046018cf65c8324fdca0dad64883da659826bf82721c3712700f435ea40c872b83935bf6cdccb41fe29c81e2210477babe0012cd635079d5932d42038c615a476ff35a523c7761d4560554c8ae0532e8d23a16912a804908411bab5fb96b9802737db82ca0d40c1a3b9913d81fc1330cee7504e2a056a994c4dc70768bc216f66921d93b81973b46352796d37b4f9009312aa957a51692ae8a65d514ab5bf7b46e0964a8f827adc51765384e8c35c900c4899ff30b1b53be227a39fd8b3acfea46bed8832c38555252b38cc5cf750221e3490ddcb80d0d73422ff47623282d273645c316181a36bf787ac90ec326d758ae71e5863c66b914db005655b1ebb057f8444e2689ad91a69150f71000ad7908897b4a3ba94c881c20271532a9653071cbd55669719b5c613abf45b3335d734b718779d51cc5162a91e4f2622a94469e09a41e8a9dbb3667312bc8d5ab7839374f689b32afa5a25de333126a49555909cb27002b18333a6a0d255b905e417eb8460d8f7566b12c99d2900794f4c0b78451777a3789c834c785274b65881bf055dc1875c6392dbea82811e49c34a3b2978468e10ab7fd91793b2856666a7c28473afbb467e60ba603230c5ef681af07c1779c6598a20e051254384467868c0b21ab7d89604153aa680611b767f19956a3b16229bc31fa3ca4315048b90f9f3252c23c02c92a6cfca28c5ad6adeb242c26023b8f76a914f888d39b59fdd1042502a68c0b416e6853e9cb5894253a129a1016108e44aa4257c2b547292642c3ab2c5abf1b5967c8fcb377eb91fef8c0d4daa3f2e04a0f869ff4bcc458f4c118a4b59715c6f3dc25a304b2fc9877d1aaa3af43a512a680f3e1bdaa90c816b95c339331f5fccdc969363977a7b9695dd6b9ba34809bb613862a0561ec25ce0d2dc86f262dc0ed164c2ad357a709eda919cda2c4f8806ecea55c3d5c042d2dca3a3925faaa9112561827dceb0754580814a84be19b8799daf37400cfe59841afc412ec97f2929dc84a6f3c36f378ee84ce3e46cd1209 +ciphertext: b2032dd82ec001fbc4dc819809e198168d1fe4344b0167bea72705c7502e9e562be51f265dd4237c1c315cf8d94fee5c62e9e5180399eb6a387297dffa5e8ad6403dd9a867c97e8240e458cd65ce2a7458104c66cc560c8da6ed08add3c1bdccedd9237fc2893a8f7a95b5ed0866675f81be19843f4e49386adc94cf8a75639d05be7a24bad56ad7425f0c93755835ab2f13c4055b841cbee776ef0167e20170119c034dd3d1307838d96a6072f1f040e26f67307dab2adaccd957541c7416148dd5401118b08ab5a0ebc679c575c9b60a766d9d39bf193f43207968d8c39900b8d8bc452411cb17a6bcd668545c183dba966a2bd777f25856a55593d86caf1c61fc15889b477bacbc790348d6f531f59b59205644cd6754016a05b484a1006ed5e5e113b360f516b1be680e45d70cd18d374a932e26ec41f7eba1869ca7d967c5d89c508d86b575f099a5d61260766defaa8676ecf1dee1ddfdac67bb641c4fb49d05deb7641740fa1a48d3daaae62f185eb157f33296a4ede459c736a909676fa8fe8ff4063006786d7ac07924c356ce78b883b03cd976980a475402d98e94d2e6dfacfca1af7e56f473597b4f2fababe7a7eb58a51e3b8ec5c39ec37a28fc088db7575995368fb0135446f82abbc1e6196bfa8996a9012ce7a44b152dbc6158f00c5e32dfe9e48e7ed67f1864fbbd6ca4d6a53729652dec8d714c765ea836a48b4f6065e3fd6ab90615d902d4c9e2f733129a5ecae9bb29363733f83c2d73e4814c0eb3fc2f0fe0a0da2a0cebaa60fade528f0ea6d3a49e08600d24ee820655fd727f896086df69597ba643b87df8b679dec1fd72b0e5707d84720e64d7d1e0af02caa04061d7cb9ecd1c254b2f28e1f7022c3c830bb5a20bac0031779f485978d4feb62956d616c627f7f4f8e38cdf6f411b2ff9de990fb8770cd8df8b031b5653c7025391ecd977818c463630494d25b7d44da52106138e798206eadccca7ed66f4b53a193d0cdeae21b65e84817fe3dbc1284a24e961daee2b022f575f4476e5fcf45b63c32db6439e6abf13dbdcd3965089947ef2243a5f907c3d95f1a53567b202074e5b945c23d06d203e3f4320c02fc569fa87ce1c837aef80fba4b3b2ffdd3cdad4ae7948374ec8c7c848cc82fb22f23bade2b52eda30698829e1c7ec56d6987dea2741344563043f93b20d029ec1c9fa0732a6e247e053796efe1753341102550b28ba9ac83becc5c34e5a648609a5fde17945c0b998e602f03a9f7904795607fd7202fc08beaf9a12bc6cff261e1ebb285784f41fc724efeb51727819e5e4af459fb1919ffd56a7cbebb9aa12591edaa69c73f3a94164229356b1eb282841d087139f5ef99e7abe632adecdf309337c50f0411f2b5f854e1c7529586c89127fa5c375c4749aa757b7061ff154e65046a39514eeab18faf003d39760a538a517f1350dc33ab94197a40539e8aa1279a3d38c221b28fb61705dfcc54eefa1f40b253b1873a8aa4c468887bcc67d315a753192b42af190021f7903 +result: fail +shared_secret: + +# Private key not reduced +private_key: 5edb8568e989d349f4757fe2f1c7e31e6af47c6b73d58a8fb30c75b726e461f7b7f5ba4b38c9f4484964e7666dc06e77aa2662b1937050be9e60376614bc92e91e905a293cbb3da81b54d1fd067f4185c3a0f7fb5dbf60aeb8e924b85105a7403bd6c6ee09627c13ab53dbad06999d287dd4e39db4182da7030fc5f1f4585a68c56ceba1d8cfee079552fc69ec6c3bc8f4acd89537f88ce6be22ecc28ea6bee8db35a90f4a03f77e5d7c8c79b8f5ecc4c002566335e9355c0a91e5ec451ce8ec14f355ba3b82e1af93667f3ff30cca66a845e849a96093cea945c7d34f461a94b5c9595555a3fce54ed7e10dc252fe3fdbd699dfe6b5d2a3aa3b7662f988c39bf4573c59b38046317c65ca2cd9304448afc72e90bc3fbee85ff0b32b85953a5036065d231cfd28d8df0a164eee4b72b599be3a3961a8b7d491d4ab680a46615450efaf5a2febfc745fb7ce36ab05dcc5a933404925854ea5330563b41d477a775679c1f8b3e69690924fe6e9c479434ab55bff996f6b431e0ea9f4d7904d8dc667decab7f9dda70ef6e153f0d46861bddeed50d9b21c0e96902a7e26c7f0e0aeeea817e6cc478ccf2d4dd796398e1d8d04eb31ef4df7b90dea7bb89079e87d2abc641e7d30933d520475d4788bcedd194c5807cca43dfbfd25bae48493ff273cccc55447bfbde23547c45a36bf295b33ee8123bdd8bac4a83fad5260a3d061d6c1205498549567ae1ece960ed6b7ee8fa38fbf33d5e02e1ce8f2f44837a8dd86bf6273c450c58852340ed2cb8ca85039afd9e5c9cbedf39ec63eac8d63a3a76d7069b57686d3d8fd921729910edf9c815ad8fc67587df5d20057add34cd4bdd4dc830e5af9c7a41ce541a5dee832459679cbbd0626a670246104a33cb4d4769079f540cf379835be32f6ece70ef693d453071cbd7df3441e3db8540c4a525f79def5c44a8c397ccde8e4e377bd84b1c0a9e7e00d58bb99e6cbaf6a9417b314a79c536576d97a5d019e787c34e54a1aa9f2f39a70577e9e6e803be48e2bea7c245cab5073cec2be40377592237dd05f43706a5da261b99e234dfb1e63bb45438d9da39c2ee780e9db6e0b6495d0fb966c9352873a342b9e4ef18985493fab4de4f1295f7e935e565cdbf1f6646654e6b78aa3466a0ac82337b90ed86dce4bdb62bb376827a5a1b467c74ee4e597bc7db7d1666ebe00a7d20007e1f05f3ca3988068bbbb9a1a8fc5a94d37b930ae0758bb4cefe98c96f5b9dc94aa649a4647135b9169e6b81f18a193be9015b5dbd49e59f1e8ccaa98ee34f53ae469a51756c220bc827546b0b973fd221db86c43cd1b04c35cce83d69ce837b3b08e1cfad6afdab4093142738a5545a5fa97951d735aec4a3e0a0e75abd999bb2beca1c7499e7c5d4634ffd605ce6e28d47bef3231d6d5b6b8eb330f61d0ad884bb87bcaa9d2ba3b71fbd98c0a97a53989637defd78ea5cfab93b33b1396038f70974b50c4d6c8f4c8a0a71dca689c981926c9013ccb06ac85602f9d5a93fc3bfc8f79beccee078b4e8937839341169f3f26d747312450afdd731d99375ef6b8291b39ec146d0b3fe8c9084f1575b11fb4894d47fbbdad66a72ea334086fb49faffdf4384cf64735775144c098e6756148a30e8ce75a67137ad2455860252b764c15823c08358c45ac820bbdc3525543a66a22854bcb8dd8e1c920a10f67e9c8d8495865b3bf16c39ab0a86cc231a521f42316f7bbe4d019616c167e88a40b4532b1ea688222a48150c6e24859edd0210ea54e4e80654b86abaaeb52a022742fccbb336921d5807d0769bb5674141fb791c6025ead44c79cf8c1fe80987086cda07546811471cebc7eb7e8a5c554a6cc0062bc6c0b10900a8ee95239f844d26527423c30f4a1be90e29424263663406debab5025e11f00e09c24058f8077cc2313842a5ac74bba5e26cb78c4f8557cd38dc67286d9d25b18f005fbfa852c5ac738f33c24e07b26d635a09a3e3d12c9eaf432a06c4cc88b15ee7c4258b279631a9756e5086145cc2adca624410d58db0def549d2c13caa2d80ed4a088531221e9881f16e39659c3425b31b4e5c0462df53375870c2360b984a881ade524777489b8a184304372464ac7099b6afa24a9545b3ad02ac8b9c968d0b4b6e991cc0a83550dc70dfbba36de192bdb2a2239672f011bc2924622ca6c2c7c4c334ea05db489ca290390e5a18bf18b564a037157006fb9131b35983a9bd285d66482863c0cc4270a32b13e1299328acc2dc4e1812f1522a88177e813a0e6b52f11573873fc512bd004eb31cbe1446a3b3518ae2253ed3204c3e3c36439ab128c322a0160a5b40a27f3ae6121333400b050d60e9fcabcbc82ca7fb1b1399715a23417691542441923750abec3607b47b380835191d6f790a7d08f00ab209a6ba608cc9cbdfc6c8f4cc194bb22c630ae48899a058bae66f3b0cb12a0d2e3209d995010644fae989eb94cae8128585933ad0f7282940606785c07e882031c08a20f4a194be008aae8ae5ce77c17505bb0854579712f7f5231d1c32301053e9ae2a1866b634949bcb4c6952fb78376fc91bbdac8fdf096d1d987db5c71e39371f894adff2a099cab93d5353ba013aef5c58796f906e7a434590181a793ca012a6610c912daca06903b719e384c827ac62e2b2590f82f29d00bfeb50d66815fe13085395663f722399c187cc2784198b028e585b305e6126f6a003b05aba2c0a87eec6b186623dbb37dad789f7e8ba7ce01a792366117c308601664d6b7ce64a03a03090f55c5b59e66545bc0c9a29a29d2eb89eeea017026c2a4b88ccd12c96816af697c5b5f1896d340a60729984857072234c71aa5c8fed44f05dc7defa39cf409b063e68bb28b3789344bce267db328542a5530222203d6d8858e51caeb8c913163a97c0759a1d1c3562288dcd48d164004b08a1c9eb76f956ba5a562a84182caa6417e237bbe4e09a5bacca54a32c76773c84c14401a348108b2cd83377f6470019af3591b7c65bb33833517ce53f7701c4b1b2db8665cf5259b6052e73b41ee2641e9c998df327f750c44dec00ad7bc0ee69992da9455c2b26e4c7605dddbb3ed942542fa5c255b4f9d037a4264939c3a26f8a817d9c21aa958677193c13a3b1b76619a66b2a0b351601a1750ff9b78cd4506e1c19f04671fce65c5c34a6e8141628dd696b3d5b962497ed3433bcd707537ac4715a7192687826fac2fc0a60fcde02f78e69dd3b996b937332ad2161db433ef850b4c8a5bc8a48556a927ce345679d1595b8a12a0e85dc5da576cb9d31e5146967756cf7356926f2e20fc7c1fde9954cb2f593d96a80ab860da1804ddb5aa9b1c6a47a98f8505a49bae2affde5fe75e69e828e546a6771004 +ciphertext: 9dbdea90800c59e1d99410f1addae674dcb4c432b65100834cf0bba07cbef7edb65a2ec31e8de08ba9a4815f004927ff973caaf09d359700caaa7f45334b00d4ad36e8ed5d88e12c7b3297eb2c0c40b625dea0520ba4e1dee5905cf37aef7fb7afa89f0ada61d642d12c008af944677eda3c5a53936bdf6810e16087351658852898b87f5baefb5c145dcd293c621affb8bee2756a74aa1b21b68c2f45cc6dfbe807b361b108af0ec7c878bd342f6fdcf4045dc70e14ed394ff4b39b453b0fec567b5ad743064650869e10ac49a9c18d39a6030707186d5ef0207f8fe92a5546fb4d32cbe6df84b3a7f9b6bbca8a86f87012ed69847913afd448779376f507e8366bebaa137474a46b9ee67bb0795ed780e70f6b67fe931ee0f2865148b2ab8fc58ce52d516df0854618cd97b07c5b1fb2730e500a03dbb633fbba1f49883663c6402066304ee8b34174be6a24c075181af5f06978ec21745fc4501da8409aade82dfbcb9a480377d25b3a6e7aded64660567918a0b3860bc5d71d2927a7289aefa9f5cedb16090764b7e245f31f745d8c68cb60301bbe78f1839dcd2eb0fa0ab78f4298dfefef779242b0fd3ba730a7771bb52c549525152c002a21cd5a221543ba05792aefd6335ae8f5da830452be90fc46c151d656c949f051e911c7d0dce2689f31eb58ecfa3f7a1135a2fa548b323c59223c6abd3a9f3101ff19a67d4746a20b95ddd31f30e4a650c6f0065872372ddd26885a41e43a3e3d7a830aecbc19c43911cbaaef663524945a694d514beebff95f670dd2709e859404fcbb0c3626177605d2a544745f16248cd2dc1c4943be30c9b907012276bbbcc978ba2a0d9d1d247743b7872639183aba6fa37edd6f0dc9cf7c1e8b614517573bc3dc88886dc3fe8e74bb1035aef74016f03102df50a57e9d4c212fb58623fd630df87191163c7643dd76ad27f23bc5801e6af3311aae5a6cf2e02721a072ade78648342d662f5d15cbccd03a1f9cdc35c9fee3b27843c2f819d246cfdea1f9b6807f4873bbde71fcbbb361b2d17dfb699859b26403a25ac45f3ac9187272a78175ed4a9d55047065b6d59698f296f92cad6f361058f400fa9c0770a762a711657da59c020096b5f8c235a2a74895cba8d9d380004ce35ddee9daec03f24fa6755c969fd007031ea210c9c1e542319e1fe129cf5a20a5f3c039ad502f2bae423abe0f9db88edd1db6253b972c92fa65b749aa6bd48e621dd13eac98100a1d8c63d84830fda8e482d69497f49a738a3483d081cf18dad0c62755840828b00bf09d1ba51211dd623f14d7ba83b45a218603cd203d5016725c98a36dc1f1a87a21b83fa70c47137cf2f15b84096ec817e417347a395836bbbf095ef6b049889e88aed5496c36780cb0c2cd3006054c4fa03e3177491183e72180c916e50b41d9db580a4e1101e158e839720563cc3a63bb35491152bdbe8a710bf4fe27f054bf6bf51b22ffc72629711c5486a3c44786f60fd04a4deb2bfda694ff797b701a57c5ba38f9b5b8 +result: fail +shared_secret: + +# Private key not reduced +private_key: 1ea8ec27e35d1229fff6ba764ba7e5bbb53b6afc9c3db6524bf480bb34dd9066f2d90e5afb4eb9cc78a3f049f69c9579d1bac3f614e827e883b4ad73f22758a92efa36c9ee2e1330d5fadd609ea09b8af464aea20264f5b28ba10d95d33b9a8fc3ca7ae949a8b5ea5c6f5b706feffe94aaed5cefa5743d6b8e1cf26634ae3c6dda25bd8c771456179bb24bdfc3024c5414fbcea4455cd88ebf0fb5439f77f85644309a8b6454d76463e69f2797de9089463d9abe0f55dd7267ffbdd678d6fac98c7989f0a9dd8989e3d1decdc6a378ce0bdf202c438a6f6dbab6646c0dbe17377fc027c27f9694f04fdb48ca51ba744d7c8cf9555ac0c1c8cc134572893bbfbe45671235f73db5b54659a67f4eb2dcc744ac2fd917d3c952d9c848bd38b53c36a369631493681b43512978d69e2c7c140550bae5aaf35b64b9f9b8fd6c75e8063108f7f37cd3f0ae3fa8bf9a74997d98e3f8f8f99bc54a65d4cfbbcbd36ccab973ce8e4690ca8a37805657af89c6811b8c0045ca3ff373720ca1097f59da9af7de2855f33ce6e7d7aaa32c761e2f41aac4fdb19353de53a2be1f5cdbee7468356d63256e22f6b2eeb95bc3b343ddb33165ef97c32572c41459e599d777d8623e3a7df64e945138d04ce4ab74ef5764fef36d1a99e64d8a6bc59ffd3d8f2d9edb4c18ac29e7f581f46573843f75f57986979e78bf8355e7bab59a9f726dd68aedf00589a2db8e49bfbf60241bcbd147af09cb54600ed5a603c1e22cae647662674ef56e47f0715f87dc984fd4b3cf065833451eea4975cd490488dec64654edeb0394b4148e4f18cfd7e1a9bb5dbe661ba5c7449f44267859f1544e51bd3911188bee97a12c7fd5249dcacbc9c83d7e3dae27dcf927c8b4fb94d2bdc9da93d88bd6fe9f2efbac46af692c77c58cd008e44c08b737944bac8c15901f2564bb2d56c03660e7c6bb26cec6086ee2a20338b8c4e3ef9c742163d741dbddf30c785a86ad78aa519ed65993578e65ebfcb32ce38ca6820a15f31dd56b17668490d9393a1ec8e577d60d368afd9bbf3d9369b7bfaa439389921eb72d9de4f1d967d71f86adfbb16beccaf0a7efb9bff57bdac12c6d372b6e768bcf42df6b575ffe8df5ace74acc51c36f76daa6df352e9b905d72839dc99ac8c6971c9032c34fe78fa58de45e4b36e5bedd8ba7feeaf913de1968443a4bd8e2877d04da6206af74565953ad6b7fe40565c0b680daf685049bccde9bb6616b325c0eef7069729a6a42545ade13f9ddf4b5a42c2a3410cf8960c7e71b638173057519568a83fba15f4dbb467b7e33d9785ae34f9f7d5f232ee37e473b88c978d9a49eb4cca1b5d6b52d5b303a3a8151ab4654544fc89e755e0cda432fad8beb3058af4bf606dcb6d876c5f7b8d7e6358ddeaced6f54da7d75c00faf58338f1a787dd335a70fba4c2ae3625a94def18b53f8d8a2d15ea2be6bba4fa6c40a9facf23f6abe29b852c7592e15f045655a9acb5228b4cfd8c54a43fa2f76ba3fc8cedc603c958174894dddf77f6880210e3c745fb4b38f389dace78beeaf179c3d7ce495f82a773035b08f6efeed8b309b5f94b904c4611fad03bc6467dd33a65ec7016f4d0055421dcecafd8568023753735c1bba67bbfd117911d0be47b827ed9773e4d50d8d11a5b6481357473ae2a766156b9a4e74169a1b3cd0bcb90eebc31f587d886accf3027c8f6620aee70741c403e4a72d4bba51af5b1362180158fa5867d25168871d599b04819635bbf096c4980cc336267ac6b956bc861e0a9864766a18d4b8b9ea61a0573fe60a5ce58a87cfa2974cf17d4f599673137dbc662eee9706ad9a85d780a911c209644980cea134545375c031b8e1082b4c201ea83877dcd7158435ae34d52376816719070d76c0683e0c4422750a1959932e88562ebc932bb7ae688c09cb703c6e567e6d898b6e135f483290da271d7ef16b15d12d4e0872ccb05130f52cdef878ea83768ad44885e5a2dd6b2a94493ca519c14efa09e9cc0739354cccb3850cb0c4b504c2eabb1128f55bccdc17c534b5e68b94526aa46888ae970372ecd49a7f03171872633e78997b51ca867852e638215be32eb2fb832c42038624035de54d7f4938ab78210c47bbbc931c336917c9d2a0d58454ded14fc7fcc6f5a97a6c3a5649689286f0ced68963cf24a05e9851fe1277fed36812e5984290701d5bbf138ab76f32b6043853415790a540878c3bb297b6bc7b000036007d8dcc7d32e6b7544c3225c2ca861052dd65c8f1d103103959ed0753e81258ec3770360aa924357315c18b33aa12ca06b24f1c59aad1b4ebc58f3f75b77c1b07bcb9a23fb0019de06109050b0ce30e8d6809c8a0ca70eb56e366033841ac39a6a198c5c105c85899e6403781c72ab30bf1d5917035b9fe50b081b6cc6103b72d423237189c583c702f7768fe43c182075a48828d041178e6a616340178aba89be3418c4e968f14b9396574b370f1c7d2858a1fd78b5351213b7c0a7e05382d0217457ba27a344546e197b22256b3f031c9e6b65ff377be25b6953a4dbc9a6e9aeb3b08c01358e2bcacec80033990f282b0bda655951a2b0ab83ef4459ac56a76af2b2d2669c0239496610a4274c9b3e5e998ac948b3e7427c8b380c1077480789b008054373a7fc65080f3772d1f6626e345bb417c9fbd97add68640dc12028258970cba5deaaaa32c7b022b0183c89b3e1be25606b3109ef88c9f07180c110703153a247981b5b465318abcd0a78ad1bcaa15b07edb66bd77a14b23e84afa6500bdf15b588009f05925a2fb430b0629bb4c2057f8a231760d9255746781c83ce932afe10b8602a80fc1a98c694e80333790b59e67722a7bcc2fcd9b61a56a5a8ea6b85b5861b44b521cb0b6adfa9c84f624ad499c0664aa97270d1a0209897569a64650c0a9b2cac1879e671d9f0413be9621b415641ed645fad52e2ce49f5a3bbe49655649a62baeb5634e50807f737dcef63a7fe0c5d2f573b9bc5914b97f28691f49045ec87767eef405c3b3c8c6089e03268a5f0c530f1682c4c022e3804ade91c20a0793265a45be711a607465709a24dee763ac192d0d57626561c3a6092f7777c8dba75516c39fb49c2353157aaff0787be318ce2c7385101e4d23c043742b9c5ba0d96419e192c20bd426de458585e11aa4d5c8315bbfba129a446c80b726060be07458991e973a394f163e54383d14d420ae0b4746a4b891d092db39b8e1c708768046cb0e3ca324d417302e861358385229492a291da3d601a3f41d29a75becb44d663e9976d61a687df88a8abcc6651446b81b7d136df42bfa03473c84dfd64fdb3b56047447b810cc094d400ab204cf9ae71e3afa68b88586ecb6498c68ac0e51b9 +ciphertext: 253b79d4c00753c7e617c2d0f419c63f496505e5d1787e2f30b58ffe0ec7d22999e50f1c5e6340eebbf4c08e441dc6569f5871e855e1e6db8f2554c205147d939068da6886fd9f0a6bf6a3b267cf7b50369a3199b73e2f87bac62e79ffc8847872974d5228c2f73413bad09e13bb4caa49624b96fb1cd7b8e4f16abaf591cc91693f014dbf3b9157af87644e45ee7c77ae0a3f8df413845ef65856219e53ce32cd2d6484b4ec97818b00a766924f05111b0d26fd58fa2c1d8de8f9612d31d68bbb3783291c6e28e5f13a5e93078564ffaf254362e52334da424cd82dd608d082074c2f31e581950db11f2921efd8e878ae591e10045469eb24e29f6e6c6d3e025c08855976c69f5b3d9c55ec4d7c6ffde8be339b75dad2cf924e113af854f0467ce7e639501b52000b0ecdd6ef38f6c84e1b0fcf980ddf3b13a9fa02227ccd41c28c8d74b8eefd7f4457df6ecb1c7a9c48dad6b8696d10aafa08ce0a5c12ef12696d50296395b5e88de5dff0cda475b989419bf14f745ba5c0a50286bc437d538e4049c6ce27e6b57d11891e85af7d2627fa594462ec09d988f8de48ee4f0dd2353928cfe0930745b7c591badd31a946e1497ad7dac6738f290ddccaded623117379556fd2e4d9d9a351cfa44d684c84878b307cd760583637eea8847b35a9d119ce9a30cc5d717be934480fdebeda223bb6c188b16827cafa4390adc9e50b52458411b931a540dd3596f1aaf2980097e0da5390803474fc5b1497ea0d22fe346fc3efaefe9285954c82439beefc0134775c2708695ecc7033fe80bb27d8917374b347d22ad56c7117459148bba9d37c5c9de61f2f78336b2fc3878232bc8c9b2ebd5428296008ce5f4ae86e08dd614bc1dcabd667037748310e3a30528613449d8229da41b03723719faed932b886f4b4de92d236a2248d0cefd3c56b5b9d15746b39ddb98baab417ab393d00e55fda4e83c954b2dcd0d0b2ed6314a9169e2dc7c7f47b2935d43a82239e7324244d3c42c3596a45c91b5c950a92fc250f9cdc11bdbba455de56810904e4991f7646fbe1d5dd503ae7dd13cc943a6791aa994748050cb59668e41c7c273838c2f294074a98bd0c1b865c3ac9d7730655cf304d6f00e234dcf51ff952caa586ad7dcb97a27a13b48d5a5b0067a21e73bb8720176013525182d35277fbd5f01aa928d478f0080055f2efcd9d8075f8cbf1c6464af59554361e9da4840066717b88726847b952a49073805a62e8f232a954fb7bcac13e1b2a444c4cfedeaee714c76359ffebe134674e3624207234bd5ea682477981c2b083396d1d33ed90dfc30245831207a38172a8826b9e608c24931d1e64a348f7b2b1511f3beb9f26b38dd96877d210c3484bff64dfac6fef55c250016bd8d427121d0eed2259b59b33f7a72015b35bddc94a473aa5601500483e55c29213023d095c26a06dd0647019f9d0057f64a638e63677cd1ab34ecf9d5f31e801a31c836fac22462c2bd520e5a42e8e0cbe2b6bbb7bcf21224215638ce5b46a2720 +result: fail +shared_secret: + +# Private key not reduced +private_key: 6423bec1793d3308ecdc6a591fefbb7d7c9c29e436557ddeeb35345aae9199234caa5dca5f5eb3c9bf4c5a96c164086ea746c3b68582ee27ec0a03cebbdeeb39ea6b1d6fe8036ee8ba696da2dc9ba9a87d197931271f73de87bd360389026e31e47b66b65fe6474cc8c68c6f8495f0179fa53d3cc06d6bb1a4dbe9a69c435f4f706c1d68c897f413ee520f8afef7cb361dac74f349d59118f77de75ec66b76c7d432f84bc17e6cf0f0a94764c66dd8738e621ef960b9b2798b4c0ddbf13c0672b563d818c8fa6cbf9277735451147fb4a4a1bac3694a2f7479b74c359cfb3ca852048ac6d52872dc73e87bf87f48afc3024b41aae5ce52e56607b5541e67b9c528503013354048e97a86a2caf8f4b7df82b37c8333afbce5b3df2367d22058779d6afe266430b89b3fd85fcb5daf6ee317c62816ec342d3788ff86544fcb912fe58d1e3e402640d5f9d0c6db4daadee62f09d89b58fa4eda56b63a62667f734d4e7952ec894c1daec89ff121a7815014fad42ea70554ae6043a6f00be3c51e876ccb65bfabcae28b75136e89fd9aecc66eda95d36fb33e8e9654eba4ecd9641e66905579429badfdbc6bd8cf31ca7e837f04f3327c5f76aaea89668da2669eabce564ae75e7df44b9596d11b6cbf7aba51ce78f60b65d5aaafd7438837a2c67b047896f9f64c1b2a54969d61e92c8a7384f962366c16c7fef45d9b11748bb819adbd0b400964be48cb7adda5627eb578933a698e08e47e46f308d3faf7e93ec744984ad3edbb34bb8603b48965ac9399ede258a9bfa4fc36ea4c8d8cf3a3978eb6fe76554bc809d5946828b0f40add55744e702a715268b8dc684133738ab9cc9543a74164e9731854327d7361b646d69bedd184b5b3ace48900ccda295eec123b4c7adea22346a10ba348883fb2aaee94bee742a36ab3c1ca9003a76e28439c6667c3d6a731883e50ded546f23f644ae4965edcf9a5c961f056e2b194b0509b3157b8d85acfa95c9ab2b5486b3fa8732bd4c18bd4b806148d65efff38c7685c9934f7b990cc378106579f981c36d5c99a26dba6df39f1c6385ca339e2744fcae148974d3bffacb9dadc6f90211d4e475dacf41c5d85036bcd3d58203d4a5db46b26a4f4282776b6dad6bc4ee9a009ce239eee7b0d4c59bf8f6bef4ee8e7499b43e749ebdaaa33710cc9737ffe8dc1994218ca439a463676add86efb83958938066dc6cebc4db59cace187700b8d508e3c9fcce960637ccbb4c8a5bf3a6d3db865696a5a5f8f4f91b7cec516415db47d0c7d6b9aadcf5963875e89a08d5f72e09d987a7c374de99113b54bdd5d63c57fd11f2f5f223a377c4ae5ed8ec3778e7aabb785ad0b5c2a0bc7e565f5dbbb305396319feed8f7fc527bf9d6f7ffdb975b9eacf7c6cd574debe4d27bf367519ad06236dd0879b343783adcc44372667aac64eb454a84b8cb6fe1db9589e4395086ed82d5e2bb9f3819b4d78cc6f0fb85d465eede0069516028b1466f8ff2fd6927965935e5b2369f959f9b39bd3fbae39da584cf4422b5545c2f846f4fcc1e45bfef5396cfeb544a865d7739cfa099ea02dec2d36c6f342cf4e677a8218640d12cca2789fddf9a488afa799e68dae7bd8287fca4992854f318a4dd4188f7f334d83a3fe0d5709e89b4ac382e9873baf2525afb10a2785c5ad09c4b28b311b4579a79f06fbc91378109271383ab1ef7169385aa2e78b70d435bdb604494a246be23b1f26874ac9165ab451355f59686a33fc6cb78464cbd98021ad69c1ed12511ef99428e3b3685380dc2b16c0ab5cf46425984702e70fca396140a95e2c1bbeb245572049df3a4192a420fa52bda254fd55186aa960669f7ae2d69954aba444fb9c6b6cbc42b5ba82e262957089c76f48ba7362d6865259c321083c464bdc992bda9635cbc88ea89726a268a34d5cf1eb9aad5347350f67d1fea925f5677e393984818053eacace1844fc52b43d408761c385cb5491645696339ba086bc733c547546e540ead9b1a7942a0316cb635a856836075d3a87b84b1944a5587cb33c653e44b5bd764f6f8b06aa8688afa0526188fbba82707a326817087ea807e2ae51071d5badc027ddf781483d906259c30ee410b69060e4f47222481cf9dbb2075f330e4cca839b093668b82c02680c236167f3621921b863cab9a42e420a050986d481cabb873b6c19fa34b7e21bc6c029598daa77e30177357ba8b0e7696b692116a97ae2f535cb5208c93611ef5e952e76417fb974879337874f3c56d47a0d695797e1313e2fb7c3c6b2c32167f7faa9f10d18d512865f6a453e3e37c5bfa100631863b4a5f4b6c957eeca3bef28f62f98336c05770e001d8fc4f595921826cbad9825a76048aef2b4d97cb354784b4b6768377342685f87142ab06a67477b66a9457c48a2f779e0872cabed62d6e73278baa3406922f8ff5465af790e02310c9b8bf6e1b2987ca6521c55bbadb249ecc26afb244029312960a55fa45b448397264aa03530b9b56643a0d7cb9a73589955631883aba865c4d34fc5f5a6b8d596cb2c4db2b740645eb0a29647089ea2bc8a92bad95c15f52f5a2d24431d83ac4e701210c5b0ba3f31bd0086e47ab3f7984363ba00041c082d33064f1b27ff26958b85c46612c6556561a2e40600ae14fa70b4c1a81109fa6822c01d0c2786f0e17cf198009349704159866e557947b81928feb459b2337f3dbca2c82162107b5e34aa202b893c103ba5cf9b4580107c1f36b6ffb9ac34c2cee189571dc7f411349ad112d20f35a740c216ff98175563599d3cf6224ba230c2b2f087525059f9ab5b80f63110719972156aa30148bfe4c907b214f683c56a38a146e1c21e688c44f40bca8d4a87d3011bf64725360478359ace455c5e395625c95cc84ea3f0d004b2e3a4a12180a1463a234c4912f00be8324906b3805151841a1f4a5595621d66ca8b1863b6ae4869b4c93e2c6c94fa6af25f37e992cbc7ad23f6a274bec8b537f89b996439b762b2faca39d1f743db79451cbcba86de02a9d8567d8977d12066a1817bd9fc2b1bda75b9d6c78a39bc851654008b266c45361dce46fb2b02e4894c784f0b017428db0ba8f1ae54f3e8050381a90bdb073c186aaa458a2e8c682b919741836397e3c59e0ab75dbdc48976a6a474969356a75e171bfb2ca76e968191d970cd9e43d2fb2843b2a5e9d24cf4b2ca947e01f0c129a763ba55b9b92260c21113c03c7002bc8c6a2c544af711c18030ca984dc584e0b0627b3d23abd9c4d9e5087bcae2bfe6581eb7f9cbf532ba6c0cfd4113c5edd408adcd03d38b12f0b6ac17525c618d6d151a761a9eebc26358d6c42e7270ee2b77b6045385f3d175984a0e260363166c73b0c70c971644363 +ciphertext: fbdba17a3ec14cfc5f113b833e70ba6bee49a459173a7d71f6914316f042f06be6d31491389cb3d2661a460b91b84f5555d350e19f5725486b60f1e878143f20b6cfa3f9ad19c11d6cde78681efa2d75d9710a6721cc75cfbf8b104928796e5ad870a64688355654893a77ba7caa40ba960a55dc8dc524198b3a029cc9ed4ae7f54b36a0738affdcc523efd1d7b044dbbaf6149cfc90f548918d458e1ade92d771ace49df76798b12d91fab71c0699767b7d2a409e3a20e84c24402383acc9818a896e790d1f78703b16ac73f85d08f9467839f7d53b29696266f654eb5141477352545790b207d846ea55f175302b68973c992b18191bb8006834d249b3fa6175c33bf758215308c20f4606661a8ba0a9bfa754597e8bf794b2d2164d1d9f03da16d0aa8945752d65406c60e3569cc76a174854046c729d7a17de91a74442a80267db0e6ec081f4783c5ba636b73baadecad748792e3c4830ed4742e4820360d69a4ff732c277f06dea33fc765c07a77a9a909683e8c8e908a3a9ab4063ea3342ff69dc971ec4b5d89dc5a33b1e195cd648b6a0fb5d7ff1163624154c06ba0a8aee57bb8ba503160f5196d6fe274bca9b8e1ccd9b022f72bcaa92da257ead51409f547de03a6f1f643610ba9595be80428e1bd73e2125184cc6b9c97242a1f5bdf7253b29cbedac010d497c0512a56e4e501ef17619bd7ddfd929a09db29e3f4a5a3475729beeb6fc2bc9dc9c3aea7eadea3aa4e60590c2593f272f3157d257dad79e3dadc34aa8e740e139ece60e977952cefc808a11d530a22a10bdf00332a4fc43e4e31aafb686403b8f7883d580d0e46fe8c1c95e4c791038718fff25bb7563aa62d6245bc263f6fe0ef8ab63cc3cf8c47cab5e6147a0d8ed990f32e8abb2a79292cf85e5b269040144c47f824331d5446d30729b00bcee6861eb9f5cdaf901f64602dac1dda268b992ff5427fab223c223f0657177f7f0babbd161bd7027b27cb12798bc3668fd27c01f4d465312c3021ff559d9c930548f073bb7a84aac0d8ed509b3b0cb4a2bb4d44303aab75aa4987fae69d657a6c30ef1c82747455c3940d2fcbbb091ed6de1f0dd64740d2e21ac39e5ad22c5ecbd8340e7afed3445bcc41c92e938fda044f4e9cb145f0d5a86c87428ad01c3fc5280c273e6883c4889139a343155aac49dd257a13e3491418b1b926ec8e1b78212a81e313a50c8fa9473cc00e05a414a2ea1e14292c3b72b5706a7753e0e439adb63a93e5905978d3486bd5dbe3834b5253086e15c57902276a3d6f405195c43f6c317aa7a3cc2ef21fe89f3a7b4660f9f4b6357d60a129e265bc708b60ec2a1fa4f44ed476ca7f540ed4495e8ee4df67d6476793402b732546143b639cfa186f37b1a612dab0619cfe083bee29d29f5094697ef1b6781445b01ae64369b738a20b9387087481efd84035fac494af47158509c64333ec412407a549a36bcfe6d5c15b1668b8570c75110daa1c93779962315e0eb0af8c056b031a787253525438bce41121026c0 +result: fail +shared_secret: + +# Private key not reduced +private_key: c16fbfea197ad53bc1f0556d6dc8a863d46bcff5bbdbf9e9d96c409a6f7711bd417c889aca6964a75a336eb5aaaf4d674ef3a3f3f96d9207cd0988cfe76838bac93b4ec866fc4b6b1127bdeb5c9978ab3cbaa6999cc5d8358b92cb3a859754461cff5a471bca16ba9259c4db3cd3eba893eee9c95904b9303cee528285f5db45df9ca65183b63a03bf89193af24b88ea6c1ece7b4dbcab396febffd158536ba9d865695deaa68b428574f7ba0d3054ce5d7d36b9807960b94b5f3f366896c59298689efc2dec8bee62f4b4b53d4bae817cd1a56bce8d1f32559dd7eb887a947d3b66ea609869c7155ba0e8f5d9aa8cf9dbb6d337d8364ac6ede403a45f59d41f8f671dadcccc6dd2efbbaf65a7b453bdf37f1979a4988c524570826de7f794a7baf8d6a75ea732659a36938b86ab36f7536eb27c5d9c7fceeaade31c1a6b31acce8fb5473dddcc90cf605b4cd6f24866a46e38e1148f50c9a531cf4912dd31a1fea2211e37eb3deeb8c3b789fe5d3c1bdfae5fbae06981859de32a9f512bd5b57df93b288a6b9a18c3d1f337d733a6e1a7b7780b45f48e3aa855c64c0d4ef55b89da05a85b2cd638f56f6d6c87ebb947283f77a9c5392e489afbddf76dfca66687709f69bc73f373c929c7cd37c01ddf43716dcecbfbed045671500743ca55ef7d9871fe35fccc39c34196da25d47ca91be8adc3af22d84939adf2ddd3a6e897f12d6c9ffeb47da023ef76c9cae0467c359682431e8f104e330cab99a65ef642fad817fad8f0d49380a94952956346087012ac595d85a2339779c956abb3bf5fad55e2ca46527b54954fc8ebbf79ccc19de279db6d57d5c16eae374ac841b5b441be3944003c30a90c56ef2df39e746ac6fb867b5d808839639bfe3f36e5e6b5056605236f5767f844d657ad2d9135569456df349ed67f3715902c4b58952f9eaab63d0ba964bbc6884c1b57346caae7febc953b62f748f7ee67468644ac394ef8ff6a3e97fcdca3689a50ec5aa40392bad95e89ef41667be8bd7d92f01b9c7c3e94bfa77937839ec0df4960ff9cb659a9374a8dbec5e307bfe553995ab9ecb83637bb7023656918e2c4de8196fad069ebba9fa5fb6b468b0e9846f4f7af8c27d54189cf5d3fd0140ad0551697387842dd2da4eab8a1f048d934eba5c45ee3962c652f1ec97b0e44348c3218d371380c476ce987870472d72a38a2475539dcc545693d4a17af010a8ff93873dc34d51f7a69ee7c3297ca508d4ff9daefe5b95b369e5ef6863ad3531bb1fe7d92bba391d564eeba6fb403c5d565253a1c9ec63a1ef69d18bc420d3bc75c876a277adb07dadef9b5444764201ed27174334d963813a678cf85d7b566fd1028a63eff411f6a6d587ec60b5af6f6cae9719432496d7d9ec3b72df5b9890fccdafba8a8bd661a76fc881dec3646a8892d8cfd68996fdb37bfa9d6ee99a0d09693f31bec924c919de4b7ae0359b3be59d648bb4ff4ed197c8d8444c530995ce8c3aac17637f699ad24ccd153fc7572c759e84ec1fc7e982fd6e921c45160cf60afc58fca4a92dc3b942607e8cc0b60c6535d1f34b4ef858bd12677eed8d45189e191148a10fdd344ddaff54f50cba46b9c6f63594c940d40b119341d9e23062c693509304bac635f93f91bd48b362989751078ab995408ddf6787ceb3f99c6802aecb703581dc6979c4d405dbc80a985f991f31924383428d4f5a2cad4acb5f95408a3406ec53425f175651952f5b76acfe2a465b30c1d56ca0e53953dac0ee2da352a687441f45dae26b37ce8008a99308639999d325ba89585656a6d59f51d10e46f93d099490c2385788c994238ea1155ed22c96a5c5035a3488be1c29e345ebcf6b1b7288abe95c29b272a7817704bd31589a42b22053226a43329183f6160105ed05e73203d172354fa176d3fd084ce690a8b6a4cef4035a3e06bc6464e8c913b88a48c81e58dfb1267ec6c1462d93433193e50d1b2d3e3828e90b6a412c1c45668272307f4b8294f37b84857bdaac6190706ca31380533c30643fc319c866534562036b37e825462c8442641c7817650333fb02ed6a2bcd6c1ad0689001098af3657363aa1b689a20683044d15275d0fc3c9aa720c8c4c6212fa70095a2243232cdd0b0fbeaa1c8e7b45ffc2870efa9bf56c8ee86659a618a0a96c42acb48ae125af911558f7cb20c9cabc4554c8fa6c70e297625286456ee625afa756145c41373ab4fb59b2782b4a406115de4966d07629cf8cc2283b4307e6a058db3dee6413aad72f89a7c1ab4131d8ea9df020b033b1473d92c4d89aa84f044e429a43b4e22fbb693a694bba3e315e78475437387b78b33261d786288b20440c44138c84f5592bbe74c1c2ab01ccd1124394082319780b24c593149cf660946f75a930f0a8f93a50ed01b5276ba96ab6ce5f794e638697ceca94d80585ced04310612a3c6cad80dccab1c1cbf5e08b2bd6b7df8c4cde4c4507a56cc97b456e10050bdb3acd6a7e00c1742aa4710e1674c59a8240680d04b8829752332324490ed6139b550c7a832862b2c831d4093db2b256f702850bba03053fecac41a61734229b2dba3210eea0c1e8d9a54c915f54b32344296ea64855dca92ab81aacc9e73153617d8464852e8208904ace7b84509b2266f9fac55bf68378d98d3fbc0a468543a8944b9975637162a4d50c7fdeb479daa8ba43938333b897a12c224ed1c790f967b2d9708c6b67640ca9ddcc1562613c2904c6f3856d13d904cd3094965abf1ed32ce52b7dfe4429ee68a8a3ab03446376d6da1de56a7a7fd30688f513fadc5627619a99d191bd4c0ec8bc1933c00757ab3e1f5826677b5e9bec2b151058bd9a6b5d2285122c23466312559c89a634abc2a5a11324cebbda8d167880f6d59bc5fabcc23487eda84f3543386e0b8d25422d5051816315532d2120ea4723809509bcd0c2edc1c93c275ade244d4f5b27f73b0941820da0183ca2b7af8480c90243af6334b36af00bda4c1e5f50463b8c350923b4696b7eb733762d189c9eba08c09050a4946388d736ee73c62f47cdffe453776730e88531f07abdd8699e8bdc9f05bb12f275c453866d46519ce2a592a1052c1e0c6b8f093f53a057d6d1bcf759abea90883eea68c5344a0ae96cdad42f0e756070dbb496535b9e7325c02badae5533140b0d9e013c75013ffdebc855734aa9947f1ca4b879c35b32c862c933479d884b2c675d3e1bbd26391d7c429db547041502307d975aee26905f7fdeb44f418d3d1fb5b081a3b06f87691170917a1e9f3c2cdc71c5534bb819e61a9d8a257ff2eb29598ae92eccfad38abbfc9bccde5ff95a1c812083bfa3b670e3eaf9b443702fb6db16ac1197656bbd61a8e25ed523b8d1e5 +ciphertext: ba4b796662f059b81f900442098ae7c3e5cd9c614f972d4237b2d968a3065ba203a31e13cc8c993eed58ada9b4f443b605ab5768cfa0f2f18d15a997ac911da943f27340c26082d9e2a14d5e1c7aa180d0409142b607383706b2ed5eb6ebf14cf2a18e8604d692d551ffb4cd6cee0b43648cd88a44e2735099de7bc95164a21173acb6ef167e00d16b7e16fe950614cb738e54eda7a50d6ad2579ed6bfaa65a9a84b9a7cc679e41b88093d42ec70683df65e568d5139561c3d4538c50946bd945c02d5272c5ca3d14482fe3c3b09d52ef42e0e521806cb8e902a7d7c25f6526d32e0ae2f585cfda19abf0364484b628669d92546eda69fc6a60845bc33c0454fa631bdd0630037e195e79bd0e0c0b998fb13dbcf55f2fe766f53cc740710f72c98156963b9e5c46a3da1430c00b05251455c984a9a28a5ec47aeca9f04563f21db0b5a4c058c6549082bbebe17542247c4b9642051c39ccaddf10bb0f9ea4a7331f7c7236f4d5664fe7bf04f5a4ba41bc954ca5424167b6501d82afe234b9bb61e22d6767a3342e8d380e9612685d5536e32dd26ac50f2658cad77660ded9f58fdbbd3db502a013ecd8c045cdec7732e225d5ba217dd9b98db1b4218a02931bde33115023d6bf1110f9f20e81acf521242ddc7d53b819ec0a78c3e4898dfeef5f1df1e75c5a5c208a29f4c5bbf40467559c492112652e8c742f9a4388a70fe499ec33f818a3e8e0822936c912f9f83a1b18010e3b1b2646dbe814f938abe76e2f21eb814a94f54b52704ca06c21c492a8eaae7fd263adc133ae4478fa32e3c0e9bafeb8021e3c79a1c695195fd4f089e1cce7ce6ca1d80de31f3810d012e538a39e4d1ef85c97aa1fd8f46b4774f687b9a803405dab5406d66a3979493a8aa3d49a1eb9c89b38086e154fee3b358d6b2ae9232e22af443268489cc44f2ad1536fb116c1906db03bfe9e8f0c79dc4b59fbdda7b1afd82ebb71f23a48d9d3910a2a728cf8ae1e9b62d56897e4e87037f4b79b07afab072248b7a8f67dc1940bdcf893cbff906871318304aa0e206bf30a16556773c656d206d85b3751bfba156065594bfa1a2c335cbe588d31648127e042a42430898bd6ec82e459612c6a354df1aa8819297ba49e40e97a74b177317bb76db3fd0f72ab9a62c6606c4633bf01153a64319959385aaa13a34dac6bedcd14d23c9319cee93a26dcef25ca7d082d99a0a9e2ab02c05fd2f316f8caffb0b72ffe656d6dd079372650b749d63847e29cf3401e59279bb276fdb0a4dcaefb217525b46ce9889281e4a4bcbacad327b160d833e17bf0b38c8c706854fa4f2e0dab16d33ad120d300e50c8f9a076fbbfe35c07753189b7d598764d24cf7f0a6aad0f0c63d36445cd62fa38989c215004f0f02a8a09a974619b208decfd60fc6a1ec781f426aa75e736c9ccb34dc98350f49e49b48430241f6798125110495d8bc79ffabbd3eb91040197124d6f80c9007d2631c8ab55fa5a98488a30ac84ac65a8c463fb49f8111f337231408daa73f96e +result: fail +shared_secret: + +# Private key not reduced +private_key: 77996be8a7ae3546a363e340c67d39fbb8e13adacf805385ebde8c56b75320cc71417fc454aaf25c86ba323ef1473fdeb227e33b7dc987e381a0feb63658d6d685db9e293ea16de3c134ee086d537d86764027e741645f18d451681dd7ad4c971ede6dd3c55f8ddac1870dfa796979ee9d91cbbbea47dd93b1b89265b7a5bd8e459dcc638ffd8aa0bab48ff95e48d7f5ff9dc86a4f74aa6365ea4bbac173a658bb3f2e646f9d4645a914b70c09f494586a352dc6100ffa0217576c43518f1d88b703cfbc3a3837794706188b587fc03685c43a33ae285edaed88f5e3ff541ce67c08fe5a71a591052fbe6ec94632beb465443b7215c30146c7059d76ee24e8ea3fc2a416ec201d44b7456ed355851d5ef14bcf5723ba486cd575b608359d2a948d85895eca59dab3cfcbb6a3678e5dabe7323fcd5ccc9d42c994b18345d77c77e87f45fab31ad6d1e4d008ae636a05e702f936f7694a0db5e0badc59fb2eb3ad033f9b13e03f6655feb646f217809e0da52106f37886f63b8b76647edf049fbdb9b5d8946f828beae0667a36b01fbba0fd90cdbbcc6b1ca0e8259422f376a44f944c1e8f74a6df3e4ffbc12bd010ac32c49584004bfc66198acc0f39d7a55f7aba6fd5546efec7a27c39c659de5332ab36f2988754f86f51c642fa087bcc93521aefb35ec7aa4194bfcbfdd7e465cffa63dc6b9982dcf9892409f5592bf542b34fd38d57e189a0448841b22ea39bee7ea5e7e01a7eb2640ec43fc84edb0b8b0cb35d6f7f99562d8f6516e08239e8589c740667cb32be69ad1d4160647f50c77924fcc6ccf95ad826d3aa8481cb4bceadcb3a686eb8794ef74dd8c5b6a7674f14e2ec44e589d3d3d6833fd4df5fee059c5fff69f7b9e0b316dfd71fe7c7a83a75c53115083fb68a9ae2da8f907ce3522331b329c6eda84ecea8d284d9bd405b5a8ccc821b8aa99d4996997e448d49f1cb2c8c8c3b4e34fcd7fedf99c63fbb2923f9a4555c257a842d93badabc414778c76c7f93e369597e8cd92b4df0ae7fb5335a93cac4cd74e5efd45edda6caaa98085d107ba0dd3d70a1284bad4398ae8b9acf58992397c9f0f9b2ddcac60bf539d0253d2d3377903a6963597298f97a82bc92f726d283ef5387f57c4629a0a358fa564adb1c776c1897db27ef89b61eba601884864787ceaffb84b7cdececc21e17e20a9c5f23e5aaea649eff523ec0b54fb5face104aea317e4f6429421dcc4c3066abdcf33357cd9109eccebd2a68acbcbdf4be62fb9a7b3d1c3743ac47b5dca488c561caaca4b20beb86ab91d00a65e98bf13125836b04ea0549c301fea0115e5f0cf3c5adbfbd11bfd851078df28999c93ec14cfacc45d5872af8580053ed3519f1e959a231c64103f332bdd55b3816c150c6edefb3f4f7dba65aedca30b9bc6138abc707be19a476f857ab9226cbd26a31e9f6a06e7f369b6b5e21a7bf76538da80ad7fad879ac6fc292a44e448b8252278eeefebb283ac71b93b50d69fbef275749c4c154bb669df436f18e785988c42ba9f70c1435af55e0300bd9ec97e285a9720646acc3dbd15f63c87dcdbb757d5189ee45f0ee33b657a9cf46df48ecee30cee163ab31c76e3a523d7642ef5662032561926a6380b6d6d90aabc5617126aa509168eca264ad67c5cccc5320c138e4053b4376924e6cb250b3a61fea8689804ac3179588a29196e05d0efb6915b3526d945cfc183dafc40d46537d907a292cd63b950659ffaa57e280ade8c09dd80655fe45979b612a6c6b1e350ba0cf433552e80f58c79d91f5cbff0717f3161f83b3c59fcc021bb5cb1922b0fa3c29984bbfc3363333f561dcb99395561590409fd7b56bb7db88e4162a61f8a81ca6b55af485d9b06645c42d1f706e9ef2b3d6e425285b4973202d46f150fdd4a6bad34a455b274814ac5c4053d680bfb4816578342fad152b798a1d592a3c88b45bdc275c45a862179557d437304151548a568159691282bc08f9280bdaf30559a3a177e6b8a62b101d8342c9d72452e05bbb1634cc1a7465e479f100b6f2952dab8ac806c27a8c555ec20a995c25a9ea8c090261085bd65c137a630e787da7a6b039c38573006c79bb5c20e39756e1a72e2c016f6cc997464546283d76543d9774345ac619f9200c308c25cea332ff25533b7983db495100f24a42e4a8df11504c4b96c017871b5a594e9c0b241b01e066043d07a366e343a08ac561ec5a08168a1c61755d5c33bd693608f42e63706bae5cc8c7f47aea360093fc78045517be49566f35728bd6a8230984a5e21133b63a9cb4a7fab4befe053e37bc78900141eb21189cf2abc0764b3cc507382c8db2320ea49c988c5aaa7ae896d10702c2082a59c3a457f382f44a1f2ce5b3d29a5a08d047537163916c5f6b22995541b87e1904b62a3585429d938a1b37d419bfc533cb918a424b5a1f73a65a8605edfcbd00678b6361399ac794f2cb0c9b26939b09baceb79ffc55aaa528673ccc4a5b844ad0873b4d6a31465cc479c30273aa2edd362625512012f83b42d52781c3bc947872c78378164cb0e077cf9ad87974c75ca527aed41a8b6993073d711c1873965448b14d307c5b218717b94ca27b354ff99de1f581e9561ec3cc196d1815a7a60a8c9a94cf4354140cc5e3b98bfdeb9c95c7c87182b878ba20939a0280e2c453567215a15803c01f7f03bb0b90741df964c4fa02f1007c466ba6b8f78bec07956611420220499a013ad3e3a874c4ad961b02e4c27a9ae71d57377dbffb556334797ec28c701c220129b856e747b90aac0803b2cbc7b0bb428583b810efe1727e0598cde9681429616c7b3f8bd8b691841a7a5405ad288f77b652a49c38eceb4088201b651a5c65bbc05e40a7a0f4151eb0962c34b10c1869a003cc4cf86d39036778b3ca32d0c500f7918cf027ef920b3718ab1c191618f294866b2fe77bab8c84118ce55157714ad2d054102a4d38ab73d1f3967e98351631582545c5a60b3aad50a7852c9d43b945668bb8b6781f56057ec058b2cfd6310506133e38b75fe3086d990d92cab098f06cd376531bdb8308e5a4d2e323c87c36e7ccaac87b00a7d4cfa3b3342d74a02d888d702cb44bc31201e41fe62c7511493c068a92717cc5513045bfa197d7f83db35798354797cca7891392ae9587245e92974920551d826101d44d9f73b3113746114ac94b8c8e291892be9c8015a0114ee44e26879c02084b0192194b922284956a8fc2b26e9071847fb901fdb6603c3bf7bbf5297bea11539fbe18868709fc57dc4d46d7d541594b53b4aec0d9f86a6377c63ff80150e40fc5347714c07591dc71c6beb8daaafc8e9a30597e4b52ffa87a54b83c91d12a5e9c2cd90fcac2c11b3a348240411a4c +ciphertext: 260ce3c51193358dec4426f6883ce12fa323c9c8e0dab43f69562fa5daaa585e720fd75dd126b0d45bc650abc220a11d6551e3ecf31d407551ae591cbafdb1fbf7d2ca3674d8a18b6887b5b55aeb5b47d5d739634483624207b2ff32a2932029f1868da248b0583b32ab13b87c57482bb2ceeb6155d870676a6591bdd33e018d9bc2a8bd644ae6d54bb4ea81a627f9b9fa74b34d359575e0307462608bff54c6c78d0cae95d223cd2c0b663eb414007c3ab47d57dc09932461d4b93eab0e557404a53f99ca160c8d9fce51483c68e1f95b10b11a4cbf062dc9caeb89c4199d5fb160c8dc1260ad21cd26319c95a1c3aaccba6f54cd8541bb937bdcbef82b657949e7dcd586032ae3b8b47e619884c78af2964167869738fc415a19bb32c23098b9b63098d8867ab98949feab0d9f2b1a44a79df81f51924c0c151fcd1356abf64efef5a1b1adf956b99efbce9093d4824dc58fd792613fe8234502d00062e552d3cf5d52909d980345e2e89fd42aedadd6a3e9861696fab590ae3c5e24e7a1b7cd40a3286b457c269f367f05c00f0d4610a4fb9b493ee9397181d669a143aaa095f13280d896d1c8746164137735f9d80b34577f3479501d3dcf98d9ad98f8b647ee7eec41d755134157533b9360a65b5d06955ded2dad2e6b6ae721380d3784f058dd92e321730b7828799939c6cff15c3b1e9b809f2e9bb630fc2f407b1429cbbfd27529e96757c0c9893e8f7c9a1a815dff37075db39aa30ce1eb64531004e4928679ca642f9c6448c67a1c12d1a5db91a1e5cea58da7cd7a8d9322d931f5bb5f18badd4a5348653b49a75734cf50640b7ded766d90f789325b95bbcbd756aa6306815673b3637d0ef9d1a61569371bfc84be0f804461d60fc4bc89c1f24f3f052b8036c4bfb72bd47ae757a8a3117e9ba562916d05cefec5ccc2912826e8ad1f12c1b0bd392ad3c22974e2549ccf683f01dcfd279050c9f6308398bcf9d3d7cf4ced38a65da0961f6a6af287af9519e3b0ec515ee56ae728efdfb0dcd02f6e352dee113bdf8edc077ba76817893e993133afa2913ca02ef4ee35cfe9fc16e4a140ac458cc0fbc674cb8f02babf7a0a2e53a8ffa4519e4d42eb372733d9a873db6a3c32f94960ec10193071b5fe625c0bc3764d0d2177be6e8503162c5b55fc2286e19e9e2419517b9a94e85120ece63dd7b7c7559aad80b544b66d2d3bc8daf2ae107af3228041ffad445dd66a50a6028ce0f5bde1e9f917c1bfa967f686c1428185be75218905f16595cead325c57746c6ed3502c6e8feac826535010de14ee30ae060a4abc6bda346171f8fb0d85196a11582ad6e30d48ba43356b31ff1cde5101e3002a91fe4c6e7b0a3b7e70cc1ffe1a5b9859eebc97c5d6af030f1e4a34b28493feb5021a9f9b304478aa1e8b0e6877e9710911ac6e04c3596a0d0eab24409ec26e4125251dfe38bbe3028118d6e079096616405059f954ca5a67dd9bec97d9fc75e4baa141b1a1fc75abcece72d1a510c09b07cff4c7d59a304778 +result: fail +shared_secret: + +# Private key not reduced +private_key: ee1f63888c6659df9766539e247cb2ded8bd4aea61e1998c090c96c40c513ce38507b3c1c28ee31fff80497bd3259d7d32bfb1d1e53ba5efb3795c6b756cb113bc64dcddb4f47978c048892f3a5b6434ec3bbbb9bc7c593a8865f59f309728d352d9600636b8f639704ce868d0c5d69fa99a395c30cdc4b4ce48d7cbad7130cb58657edf7c5a6234a3da8b5e9b3b6ccb63c7cb898565791b8a32c594fe8f6cd283cec434930c0e61e193d65dd48cdb49ff0414e20dd862549d6605284bd9de697048fc5288c59803f30504c4bf15e89695c0f8055a09cd62c4889db97cee960bb8ecadd9f16dcbda8e8eeb1e9886fb845a2d93610371a09358f45e704be5b7ba1830812eafdafa52af2a4b42c7d21459318b15aea9dd4d700766a014f8d8d3ac383a3cfcdd3e49a8ba9a7e3c729eb6152f769ef5594954a4d40ddb0359482de59d0bace8c787aaf8bab676acbc9cea9cfcb4eb43946b53bf62dfa8302ce58f759f60dcd65e81c7d55b76dd944ea67a45fde108435335fd16fdfd2b8bcddeece1beaecc3aa46ee307a1fc39d1928fb9d817c1a3e9f2bcdbb2a8eb5fc247db9d1a36ccf94a5af3b52ffd94cbfb63ca69de24e43ac2e983b786da1887e4daabb7a8edff961c3452298b0e93614a8baf42988721965b4a8beefc3b5b6e1968e927ce29ed8bc12cbfb4df3ee095836aa5b2dca4eff2ed568a4fb8a6d6b997caf71c37b25d9be147e6515ff788861b7e3b454d5e66b22ddd59a34696b53d890e8a9e0007cd63aebb1cbd897ac835dc26ade55f8bde16c8a00995fa9362c17981c794793b199eb348606f688630bf9c20be54ec28314e65983343c3897499afcaae9785f616c87077bddd54eb8bee6b3bf5e5be83bc3eeb874594147369775d0245f936f5ed801335e0a656ceace2eff64ba0a4efa6a563274ca536c3bfeacf662a39b4c3fbd7493fd1c93c50c95b823788606f8e791f0fec27bb4eedee35f1c961fd0d95c0dc83b62f62051d4c7b9e9d5b3489e408e54bbfc0045b72ffe77a509a6cbe8d61da15371c03a6d028cd89fe3494e8699aec9ec64f91c3ee6f7887e8b83dc7cf436844d7bcea4dfaad448c022e3c1d14844845601dbcb556ca85eecc54d426621d846d01f6f797dde1a33e652904a8a9e7a73b5a87dea3afe747662bd696913cbfdccebc31893d89f4af3fdf49ad946b7c2a31c8f35a7b9c8ff01988a956634cbd632aee76d2e6c38aa3c8ab27b9dffde35a6faa08b9d9cb8e96e8f6f6f123bb3883b9d87cf3883c9dcaaedcb9e6805c5859a1ed8a7af64d610a332c3dcf4197efe8eae3b513e56f7cd31ea4a5c33cb5ef9384c8047c5863fcb7da4c9285e76536a5f4dadcd6cca9b399a938ecbf61eb3dcb1660b26d698996b3fb2e714725f99927723f46d9d125f6336b6ad1cfcf9159e928dd7aa5edc7234c924a8d3a3f43460bce9597b4c47c9c4e64ece74b8f41a913aaceb8a431973d5534e6e41e5301a969c45eac9b8c798d83cad6d9f5b7d467b24fd71bb9af4a4cfc6cf635820ea620f857f6c55aa0ad77ae2545600ef59c66fadf1eeac64b659d28961628425aafcff5144559eee4977eb351be8d0ddfdf0e164d47a83830dd7d9633fe3acda6ed7c794ee05d9b58740d13cd78ea15867a5c3cb14051223efcb36969430b45fb699c26caa918c3d9041589a1bde4484e95859a700c2510d6380c2a323e34526e22adb44a862c417b34d172269b32430c6b8a68cc3dd2bee2447555c82189e2562aa82df2a40e33b91d65b60d0ad93b127294d71002dd16b35701670564b1c07436dc2a001c751765dc93da79aff6177e9795b00c5bcbf66175357174032a2a742b3587e35f055268551c57af78090044be4200302fb0b16a40b80e092a1933bf99878852342cc6574c6230a9460b08376c42c51a48aca14d0e59294f3bcb464a74c0a296fb0182cef42b25b58711c6cc939c9e02c8302e2499640737ea07540ed89b5335a05c552472172e8bdb2f40c49a5b0295ce99a0f567af39169313c8b61ba77fd2143f97cc762c8b6be4c13300a8b78dd06011c144a1d747e1c3825cc1674b825838953574e8b6a16b3dfa8a05355c8977006c649b58d9f0ac2d704f774817eea95f6da97ab5ca71c521a277d9618881563f47792d99bebc73a74ceb5560070b75c3b8b2e2c9598195feb08ebfb5cb1d86a87f93465355a796520d0c24744c7b852bac418fd620d060118d135947d9b174cca55444096ed97fd6442dda02b4a3364732c6818c39a9d199b4cb5a4d3659c8c4851d39db9301047370351c8dc417bc1b86fa50486e759b87c4cc69a8a9ec282909c40f0b7ca0896c01f7221639b18fc3145eae4b4b8252b4af720f1a22c1e5cb980cea6b103082b31b0542ea8d64d8c9b119aef3524cad116689280a51ccc08c09a8c3313a82a581b55cae6a394efb5146ad9884344ab6904c7d5bcc75729a261239c76ebc83e2557f60d125a9578fe0b4ac8d57b08d729a8d86647708483407ba16344049f8b842496a64f84d5bf42540429ade11b10f567eba812aff9179e263a2899b770f8b3166da15bce789dee3cc7d1846f3204b26933d4803b74c3c3885748a417692f0f5ac2733804cd2a98f45547af8ccd28542ab3062211a51f454b28559c28d0751c5c6c31045a8aa41c79cd1cca536c3d6a779afd9175a006b663620bcc92b4ddcc92b61b88bd422f1dc7962a70569dacbbfc7ac9ce90f8d16c3b6973ab3e96b6539a145128631c6993c776fcf488f4ee692772645dc2cc1541874c02aba0564a46176005f6ccf2ab27893dc60d2d44ce1e5b6e317a38c032ad98bbbf79554ef2882fdb51115782ae862c9dc79a6a8293a39135460f96329548507d58c39a07ab9aa7fe913a7fbe4c466f693ee1006f6091346a4b75a2a506f6c787cab948fb76f4398b2110781ae27644211476364abe4ccc2f0ac6cc4e917dd391bd0b369ba862d5f396d8627285b0c5d9b3692ef8069ea601e6e493d841755cea52194b32b5f787f15a6478db7b6b41336000d2bdf3270f8f0aaadab89325b6a3dda4ea88021c8b61b6ba372186321f4f5575f2508625685db168830063860965a71a27ce34a7e934b9444d411da9a151b27b3ed738869100ff19099f0c2a8583b872c8a0745e455bf715b8f526cb4f378fdd931c8111d53a97379ab1d57684224780690b2c1b36bab3b0762b8fb6afcf39cdda151607a6537b985c37989299414b4c9b1894c6051242482b42289ab24793e2d7af2ca0cedbc27d0595b94c698bfa000840bb2d63e1946c2d52d0c837eb40dac0653a5e862d9fb8b832629cece9eaeb6d5feb48b6ef5da8aec87a9a79204cee2986867a2906eb851b734b8b22b91d6749b1a5f07c44e3b +ciphertext: 5aecef867809431a595f27d53e374f929c0927ddec2188336929346daee5287eeb67c5a916959b428b809e5c8215be769d63b7cbf828e3812a25818677109df91c1580d9a8e50f0875693123e66b7cad079584c20230ef01a0d0fd7b9ee936ff65a0261d25c60e7f9bb1b51ebc9d6cba815cc43c895661d355d12e96957acb905dc4eb18e45b46f45d23a35e8d0b4d5d71c77fa30fa244fe60f3d716ad8c8afe1781caa0668a8ca6ec94a1c31ede99532cbb042bce0a2e5cb13892e47bf27bc5d56f3ae0f156cbc5c90a290d244f1d5902c6234eeed11ce3e232cbca1cc29228d4848bee8fbc2ef61debe22518680542ff824774e38ce3c1d0225c6836785076a651653313ba74fd8dd176c3f8fdf4d102bbe0a5844d0e73f87eb04e9298e61eb8d18f335917e0f9610c3c17041537197c7041652aa39f7e06057d0c12479b07cf431308124ad8d9b22ddaeae2463070037cb14025e0d91592c8ee95b4e792a257aa73f64120c6c57729b4660f4db798087a053a40e0a144829f64468566c201264524ae339cf33d5e3e7a0a7a1f9ee75ef234cbe213db87807ffd3cf867d0a75bee8cabec8eb9858478f4470e04e7d36e54dea39e16dfd6fe882639a7edca290222db1d92d5c7207d436ec20b6e07a25e9bb2aff7c9a0629cac7121144e6666919258263d6052069747652ee973ba4db0bee6b28f85fdb3052fb6a498efd7fb82bcd2b4f5e5693d6462658d18ee04966b0d56fd1b9f560e1e29f8cf80e59f57e0cec307a9c37e7a578b98c5137982b7a085e67cc741efed81f795a40f550a15d1bb621ec702aa642271e5fc9a4f7d1bd44f39ae0a014b4792d4a8602c1699eb27c87e190911918d0f6e9e887d2ee3b7af9d19f3fe9e6bf78aa141d66328044cfe286affdbe0e1764fc5540629112b016a1c254b08749cbe45c10d1cab7991eb820167574fac5b33d971467fcd500eafbad1b9ea430a9d03971e0fabec59b9236e73ecee3166aa19d24115d63f698a1791bb6fdb4889c8e85c4bdf5f3fbd7ad66d4c733dafc073e6d5c18470baf3a685740f6f7aded2d39ecdcce03a0e097d86605fd856f6fe0d9798c1aaeca7ad1f2398b53892299797fd78f46c9c01654c91c2235110307b8f378a2a42e2970902ba96cfb25a307be48bcad1123eb0b80dffa628182a72d021ce9b26f91424ff400700d40a99d850385872d92ce7c19f2c41bcb932ddd85ea20b3eacf414799a6175b9ec819277481fd9b67b791c26b848a0ff91a8f31cc654921d70fe9eff42905f72eadaf698e31e90f4640a85a050f79b0a9084cedec141edbf20e07f48152fef5e4daec206bf2c81f1f3cbb7401c88ff986a9e90da3af08ec1de65e164df05b72ede33fe38cf772c48dc991d5118c06504677a5f806ddd17bdd13c318c023fa168795021a8d18127a79741bf31e5b953da85f1c76cc8dfe0b893563a7d5a8d792a8f148557c4ee87fdc9ef146c85541bfb95bb8d6db8e4f76686d992074941a62ed588f16826411146548cfae4f4cb80 +result: fail +shared_secret: + +# Private key not reduced +private_key: 263bae3d4edcbd4b6423bcd19569f36375fd2c1b470b7e8074ee8e08f4e2286a4df335d1ea9f6d27c43de1135df138eb65c6738a0bd72d2ad824dde617da701b97a11c36d55a7fb876df9d429857386dfed065ec860eef2eabf8167d49248691d85da4769e84ac0db02595460b9eacb77a6272d49273c35895ac796eb6406999b8d5c8f4617393fac877749ca787456211fabfd9cece7775ba14d5ebfb2ca962b6a3acd7ad4084c90e1ddcef83aba7ec45910bbe37598422c8419595e11055c99af87e08d5656dc5678b488fa9c96d366b5e6c2a5c8eaddf40bc69db4a9fba1fe724ed43d43bd89c68831a15f5c14c8e9b29fb14b83962b766230fcc753aaee5de8e23846e4fcecdd9434a77a47a69596d8b6bd19d6d568a63734384b83aa4d6f56eb9fa4da9e0d3add6efeef67c8d8f8c83259952c3cc86c364d3fe7e3ef26a9cd239381ad4370414506edaa2db0f7b292eac9a8c4e5a76ef06038ff5cfd9acb4a71c9e6386b9f8a67e83f9a5515c7d4aeec9654b8ce7798c57c089e1a038bb9b87e5c0ea69cb3c9baf14a0bf98ee6dae905be4d5e886f3420fc572ebdb7d7d5efc93a49e8f303df4d0003897c309ea6c758701a5946c947b337d9268a9a26594e409fd38e38da9b54e366f983316cb5fc61d9c2abf320b156794ec3233b5f3bcc5b1e0ec6f0158c4346ac04078c244375ae8c8ab9b67f9655daa75e8f31ae3cbec2ea17f29c8d8fc628f03e6bda563962af014338d294743269c4876689eb948e41e4ed01fa3f441bda0aa079b6f3c82553c53518f7a4a768c1fdb5e75253423d95043989cfeaba0ec544da71ac75b6fa3d4d5600914972198cc95bcb1e5dd4c1f56f1ace5c02b2bd537bd3510cd9b23fce25bfd5e92dcd8362b6e1d1e42484b736fcc46f4233ee2d5fc309edba3148d7478efd6be58068cae9e8de81aae6917d8ecf3f5a31bde873a3db59294c32e9e57926edef0d8c8ac8a6cb4673493aa6bda6a62459edbeccf86cd9df0cb86cda45ecaf9f8d1d9589cf29b9cae1df5ce563b1aebac446fb176c8a6c4349ff73ef4c549d2b3ded636c88d622e33e97f75973eb31d4ca637cbe670377ec7b97444daaebca78664188886ce34fb14f05a266895b7909f3f71e24ead6219dd5696a02224e5e5b7e1a7bcda961fa1c528767bc6e7bb79b9aa55b47dcfacb573aff4b4b5442bc573a8b9e937ad1205a4e74ee834899caf48f4eca782540e8620acf5d7f8e0c8f6c5b4559f436c736574fd28933a3b1f34415b9729cd61365c74b73ccd3e46f22db3747c289d13a4fa32ca6fb1d7a75d563097f9e39aafb967c3737a6fcd20ad629f2b774d25a2021b458524b3c2f8344ebbbd2b7a70f7bbe574158e8a1e7f3f8962aba45bb0cbc297ec3c2cc5460a6d788953d8320f41b8ecce3fb787219c9e0b7443d72f330877bf8c4c9637c6b9aedb75cb763356eb7772ba566489ed4f439e6b3e7b1066452d698dbd235fdb4ba5c37ba57ea8be97849345f7b3e8d564863f9933b9b4a09fa1a67b67c15c72a4bdcf05f36bfb2567f70ba9139cb673afe2bb6b48b71590513bae6489b47c13f20b7faf60a4d45293ca3623842de85678ce6aaa1db9de06924dd3986df541109bab4be52b48818412eb1353680f2a3c3bd9fa7e55cc79c38207fdaba1833452dcb03763672212953c53532e6051ab040208acd348af507616562d96c7c04da93c8f21566df563deab2f18c9359b0b5391e8b03b485e3dc1a7c981b2a30026b0f83b84c4505a5966f648383c9abd16638a3e557ae4925fbf1c0125d91d97511175895082a78c1272792a50a5651239cb66b3f6c1376fe332260cc27ed5972c4b6ecef6462d3b712627928cda42ce150d3d96b7f032209ca92e9937517bf2b7c5f66e3b837ec347643a6a8a4d8c299de167395c84c2aa8bf1a8a4d5db29c2962701701ead468368b40e87da45dee76ff4b287950889692a838bba17b2b47c3140b7761cb389e447b2a540ae251d61808341dbb2b9aa5f04a69c6010431b28c17b980fd00499e274c9492840cc7a1e90215be92759db8b14ef41c059c546d4482343106adb27a802c3c3f8759a8fa20141fa63c65081d40090eb1abebac9c5708a9ba50656b4e7616151a4f1b0bd678ac18188450ddace2b99b3f170ac2635a62ad88320d17a9a75ca2e1bb52576274ee12f1f3b0b1696a247c70a6cda6264dc9e892cb08548c0c8824168f471e19078737169b4549b62b634a611ad53699a5550635faa7ce4589938501834f8c4856cb2e991bac84809b424cafb5ba089f14338780178d71b1cb7b1ed12c036f727fc2a94e9a62ecab6a95c8800aaa237cfb224af5c8fcc939443176ca4bca59ce54400dc7639e0630fa7cfc292604e6ab0bcda993a78107d108783d19dded13c2033297ff513fa75c4c6d65640206b43f33cac26950533b4b053190cb23e45587509acbcfc57acfadb6160f5345a599caed04eaa02937bd5a5620a5f24e6b194c52da021233b13cf950c270f8262972031790ba4cdb4524bd92781898427b6a1adc7a986f88ddf7b39be1c7d9700c87d52aea9140aef5c6454328f666a8f476b772784c3b13494dab57b06e320b2aa701acacdce41b8b3843e9913ccb3705dab48cb9d85ab5b36bbff148c5a4239b32190193112e1184d33b88ed1e6c3a9ba0ced62bb5e634b72187030bc8dfc1a3e80e28bfcd1828ec4a2e4888d68e4bafa3ba8622a87314432801325fa66c142760272e594de825560c7c19e881ef238bd9a38013f601885e02acec715b25730fb004009eba9111c125bfb0d6b2c154945575743cd66d85906981b24c1b2029452879608a34bce8e610501b6b12f32a1b3e99b76143cc1455485b3802778b7ed52210b976cd2ba26f1551c0fda036fb33891ac77c9265c30db5a513baca1524b8499932d5633b127ab98d8c07ca1704fbc8404957251f11dbeb7000b363255f5aae1261ea5b7c741445cc2852666c5437a4054f5d3a421799318098f5aaa5262b46187f60a09d98442499e30bc54c86838e256c24ae481b6bc33bf076b04bbc798f0615cccbe8eb66dd3c97da6a89394d4c7e07b8c4d5c70a01c9e7c43b8a37c3a09d728d9fc25d933028a504dced76c2a3900ca67369cf5b822107a9ddb2a168419ac87b036064786f500e9e0a279294df8a7c632484723ba28b38b52937b40e20984c46b23dd81bedf629da6a3512ec060fde7b8b2dc987395af460998230c20a9a08c1dfbf3824cf7a6fb4ed55ed1ff461d800b59a6ffd7287e1ee3fb94cb59c394504ff02338c9bb711d263140c471409f3c42813f38424698563d9550f85a168f2da2acf359556df4a2abaeb9dcee945829beb71185b4d6bd18b76e5668f253383a +ciphertext: aad2540e5b6286cdb234a4414a07402fdfd38141f26f812025e62b851d7d565a8bfe21c5879ed182ff2960c3122ba4f9e591060548a7a2fcc87b7a5f3dfdfa79912befac7451a912ba367a1882e4ae533754a76308921ce820d52d402413651641767dce967dda4e9cff0ff2f3f1a971693eaf6dd138e5817f2600e609f24b47d6fe41959dd01f3d22bfaa05b17a4a957780d581782da44c97f794a008ae96353d0421284451cfe3e6770f418661699a218296724c33b34730c25525b2f818e7f5c9ed42afc92f6c3c56b22b1785b01d3ccc2c74aed6faebd18b9ee948ae93c8cb0f13b5225c334b5f422ebece17e54f5403604dda34c02416aa79de4f3a3d66a411c8b64f38c5dd256d5ca2ca95e3b1c724b278296f719eb70683a2926c5b5f4b9b25d13f2b2706eb6ab79bbc48bf12118d0311993504baf3a92ef79eda66cd6922c01c491c37be3f21109a21da5efac144ae7fedc440b84ec7655631b5e1b3067e8b1f4dca235b3907eb6221b3e38d51a08c36090c307aec7a124cb35ef75345c82adea4a6fa3323607aa20fad721cbcc82d01dbd7d6863b69da9792faac75730a5f5dba4a24453e91319cf8e72c2b7a9498821b5159680dc51682eb4c339694af812e664f8d5210674f0a55543c5433a9cc6573eca7ca607ebfa5efffb0e23a009f404beff30a280d8de6a79845f6687c8f137fed4dab02c8984ab7f17a22b0168eb559423ecabccd6c822334092b94858849fcbc7cb20cc58f7646c0f8541066e654811185b0dc807a0c53c785fdb005474bc54280f34871b137b44848dd0cac5d9226b342a247461ca71b031fdfe17709cc11bc5ca6fe648c13f76f7f66549bec1be4fd8c8c1f05f8e494743a25dd52e3e346366051d102e7aba6dc391e529a5a1b09e5d141414e402002f1a81d2eaa27cccac6dff2c6e38f8b3584c998809c5e18ad500c3432801b08f2cbb3e7df907e9a57059122ad8ff49cca4ad18d197bd7de4834bd550b893347119e8d323af3f6696eb0f88d600b4341af25d266e955ccee8e493979ea31e978081dec549111c7bee584f5d0d18d432c52e8058566d1950928fec5d25f02c42329f68d8734533c1cca80a8adf8e74ef4d807b755e544e2096cc42d38517aa87189bfd4bad8dcc8fffee414c19073fed509191f56eee507623d8d1c2431b771d7a7b41226d532f9da0c837bb13268d542b493d027131cd0abb4dac1eb85d680f31ac8f91a3c00e889332e1459b7a3611b70e1c5492a8ea9b4438315d5cde863b834a8ec122ca6034c808e528dc25de3eed1ebd6d7426843017eb2b7cbf1b07d4794316cd3b14b2378d3c5cb76217ae46c958bd841b27ef7823e2b0537f1022b3d8322e85580aca303fbe54dd1d2a79eec2d48e083e77df8b4d8924351ab28c9eae2331a46c11a2d6b589cadd49ee81b060de91d04f5efb9515c5049f5b8e82597ec0120db12ea26a062653f3d62e96284e9de2e247dde2950efeeefb653cf710680eac92430aa11553d8049183f263e2a9f11f51b +result: fail +shared_secret: + +# Private key not reduced +private_key: 50dfbe10ffba62ba7ddec6a73c13fe9a15cd9db841b489e620989c395d8bd6733c16dfd6c854d2e286ba0f3bf74b94ad18a5ca003d7689aab71ef8cbce7b75ce844622fc9f57b974f8a9ea8913f206f590241dfc938c6d677ffa7033442c29d135dd6f04339fa61390ceaac12dec5d0f5f75456873107a8cc1ea6d5e5450aab97b24ad6e34c8a812dcf9794897a20bbfe789dc3404c25dfaffea4c80f20fad1e85d780dc790118e1fe78dbb1d8d00ebc930f08f680aef140db9e0a9c5c751d38838459206ddbf0aabc4268f72dfbf871bcbb85757e9a0bf799f45142ebb80ba8ce30dd95ccdce952579a8a67bb57f78e2feb4e484a96854a8d4d16bea9cd8d0409f031779e0eff3222f5768775c026148cb1895b970cab860bac34aa6612e8a5b93c5aefc78e409ad3120cd37f7a509d7ce2b55453e9dbff4e5c4360a4ab1e45df822fa008f69cf2796f6c7fa58e388921863ab2fb82af6f7c60593a99a4ba7806572dca7179476b16d5aa6adc6ccd9dad700cb1305cfb29aceaaf09369dcfce8a9c31cb799186cf4ad16967fc1f69d0dba48fbda258d4c37f9484c9cc8d224f32f88b919de59ffaf6c00039d58e0cef4fe55a8457b16d3c49017c8890acdeef37973a7bfe56de9b8114b074d8c95a57c5d897c8800f4b3bd8578c89f1537beb46ce9485fff0ed87bc647c57aad958e01c74a443d74a76dde98f40611d8b1c44cc45486f0bdfc00fb79a7d88a2ef06f987b3e71d23fe441cbadeffbc173fd4566fa8944dd502779c3dfd72dd06e287e4fda0acc451e6b56bba37b3da8f1c1d5483955c7b169f89db86e70bd5a493b69567bc5a8b8655d9e9f8b7dd6ffed34c1478effab2287ff029f5997b14696f4bc4415b6771d3701b56ee76d686c93699ca6e65b00a593d69827bb39a257ae385d8b77c3ff2a5d9f0a6864ba504e4800c95f2ea9c304ad64a173c764437ebfe3444ec341939e14015d6159adab1c5639adde2c30a7290dcdb0d43dbad27b8c0d8db7dab5ed21c38459a436b5a5b2b18f27278e5180395dbe69a472672fc0ae8cc43eeca2dd9658daffc8c667bcc7a2cb9fe6f08dc1735a595a8e0dd3a5fe9938837deb50d87fa12ceb126fa498009b730139c3a1c9a23eefa56fe75608eab754f399c8bb509775a24b3987e4432fb3a4a22fc7da509578c34302ae845b818894c7a6283e7ed42657544b558f74b7978df70bf8ffb9b5ebbbecf36deb8898c65a92457b260d3816f67d3106ede4f885450eaf0977451b2a731dee6f87fcba24b4c7f09e4a7532965775cd578eabc14deb12364fc1d1b6a710bb3b65d38a38e55528caf9747695583e8c61730707facad23c7c475b9a568c70e7552b669e7217677ff6f5b15548be7465b147c60f857a833dd8ca87dc83ca3b201fcee8daeba2573d997a69ee559f1e7ba611faec0929cdc99d65d0c0a39f3ee8f8ff998004447789941151da48bcfc6c2893e84ce9f801d80ede9d5837d374f0aad2f794655f594b3dce5bbec6db0d647e468d5318534c4da9484ea4d55464da733ebdfe3ee9bb6c53e35a6f0764ed3443823f9991ca3aff1caa50edb522d5fe12ada999dca8a8e678ea1a8417d7792107f3061c87cb29a55034626f03687751b2f1abac22b4c2b1ac19567f3324fca5d82b147af141a004514d831039a612ed69b621ffb4223109171e6351bb35177b85bb5063161273abf861988a1803e647820bb53b282bc6d04cd3e075a4a1b6755b97251901a81c7911437c528951d007d9ed82368d4c833ecf2aa1a806cbad08259470461f7774a922227e812689bcb59a3483c8346d130650e06383556c067f94d41dc1171941efcc96e3fd769623861bec9bbcca4a5ed22c10a36a59efb5d7153859df348ef9c3a2745cea329a73cb831441762820c7d996b88c1d453c775a16ab2c752e68bc55839d2e79544b87af56019f02b794b166f6dd60e8efb0b14f00d1ae800e37bbe5ff7c7d47a257adccd2949cdc3d9318a0cbaa34a14e080b968533ab1d9ab674c89774187d592b4c86461e84ac0e6808c96090abe6b0cf69a2056a1c4287b1cf3dab74f8ca66ae8421fa200fbaa4b11760ac7529b92db75231958e20a3f55b8a3396a10fe957361a9bf41941b90583d8d97cade8828b8a3a5ebc36730c19fa7346aa427c489f56c7cf3716928c9082b36d3f3b82ff1348eaba325ba8c49acb2673570dc5548229ba93a5c210b586ece088d6679c975b60e0106c0003625e42c1bafc1ac1be1c1779556a95ac68776ca01363961132ff75c2185339d79a426e6c0a0011a260acb7cc0583e71623b251cb8ec1049da730c2f9a26a61075aac24ab1da2732f708221a01b27c9da1b520beb7686843360a11a292568993c28bafc7088c1767b87523e9450873f9c73912cae517ca29c066631137faa16d217ccc07f840e1013440da2ddaec6b7161b29742a2c941c7573bb0b57a58a25b00db5012a3362774fb35cd80c6f0a095753688b156b510561ca47b436cd5576ee0323f2bb2967022fe391b9cab3f41477787a96ec6667337fa4ea29b44b7c9610ab69706e820557ac7c9f9c55ab4a04fcb05ecc4157b943bbafc0b0e42567f95b8b436838d363da680a42ee01cd5353dd4276b4dc625d492aec385bfebe9767a2731fa8b3ce9271cd8d28042b66714d98d0bc0675a54b3ea3c322830a5616816c43260f6f21947e3499dfc4f9d76a7977cb467899b455a12d8628e93acbfed99cd8b813d21a15024da9ef46b1ae4f6333dc8933b52a5f100bdbdf2b23987270d550493d949e83a269ab42027b34a12a177f185af5f76ac9f9b1cf9ea4eff5529e0247d3abc3ca08b3a1d081a8c75a1ffe4337711759d25b9cc673b0263177ea93b56667c15f82b483702973c6436d40953aac60929a36a911ad25ac109a10841fb95e1ec05962c5694cc3cd7372260ea4863109254c26a44f62af0957960634354f62c624c5723416f14966417681fec883ae47544b753340f749b487a095f89784f15a6e7945da56c9e0d2c358162213403609a1c938c98c68b70a0fadc5aa746ae4ea9868f19b9ebc3282ff592960b436a7a7301e4c7fa075ff50762b866c4a9f157ad25291347a9dba5cad62c35b28a3933f5269f33a0e6d403e5721a0d36bae734481c43918f9b13acea8f6a13b1bb584938284c10e3806ed935d8e543fd5bbbab0685f099c2adf254f4906d6e05590dfb1544a32ff3bb766109561ff31c164792b6b0991fa93c14a74086a585353c3e620d3ec5b1da6ff7959016b53093137c512dfc18bbccdbce67cf49fea044df5c767996681dd2714937d31c822f3c58cc34785aa7df05318b5f655efe36f1b678cf4b875108a18db2fa312261caf839f84bd956c5 +ciphertext: 05d490f575c5a991065a65008d6def6ce79b0c64ea9156ea6bad47fdd3926889bfd335784d7ef46aba3615e50ad4de994de59889aa2f9f8ed1de66b3caae0ad5079821b135781fa2b063198a83c0c19c3b9b479277fd1f0e7089ac711fdc5036b7e4f6d279b8b84de7724bfd425dbfae33485bd423fc10c2c576a4ffcd78eed1db45ec71df0fbf4e53e9161b174f536c88af832928d593f3e80fa353b33650a93bf4bdda6b94807b49ed507cabbc72eb3273ced31f8aa4a1c9d68ea5d7c337ca183be3cae57d0555bab6fa19b36f59c575d1b9a297eeb9c561fad4b2056a3c3ace6ed886dcd84fc4b52511cfa2e00fc49f7cfb2320e650825a2c8ca39e68be13f3514b0160e04b6d58e613bc2a70315807224496575f6b5d0934f6704cb6c3b728fb1857130aa9012511ba9344d6187191dd500a1b2427db1f5355342aa5e0a29ba2b94cee0fbf808202afc594322124cdc12fe49185ce8494950d08a4b0f6970d82e745d6a3cb726d13e77c1e5a94593c678baa1b422d71312cadd4e16df816ddb13a0d0990947c84322dd17a831f21261f82986453a1aba53e1b13a772d5d29c211fd2a37d3c1cbdce6812a09323dffdc404a964a6d842077fa744c971e4e0bc42852d0a37670837c2bdf99e87657c044c5f56a8918b163808139d00db7aff2b1768fa327a80649a67201b8c8ab04278544ed5666d6460e8a30b54283bdcf4748ff1e4328ca86eb42933831cd74d99e93b760f3dd2f0524c9c283a2d81886749e052afeab286830fec68628c4d3ed4f958678c03962b02a6b37c07e0d4ac3b3842731da4b309167fdb1cfb2ec22e9704df4b86479cb404cb31c69798bcb45eecaa31f2e80da2d2e6426ed998983e9569ad4df5a53077ae69060347012ffea15690f222f20bf917e2bb3654bbb415d38c5512888aa029df25ace2b15bdc22266b41ef0709486273c23fb1c6c4b7b45895af4e8c8358a4a40a2949142a9a773976f8ac4211d82c2f08d4d1ee348050cf24821c2aa14285d318dd83a876965358936cf7dddee74d9c9f24b656e1362a040e684b9aa38730701776a3d35a54b48a37c8f318c0464b448e9a184d8c104f1ca092d18984f5e7e65d1991bd24a237e8080f45b2ff4a973bf07c784a8e0c39b90d0bda10fbf3a1b34978de8feab4d1dda3498f1dc0b8d58c5047ade493f35899a582297b23b8807e105b373d03d21a031a8c9e2ec54a2ab4bc16ac9874a7de8342d346a57e13ac4e75e9b3543f4f6d7c394a1c3a669501ca56f571092481c09fc59f63258f5962b058aa821ae535b7290d42bd619d46f0a7fe4ac92f62261e88e53ccffb5089cd0f6f99836f8f703f9f82a906a191e00b99520b3d3e3a57f3f5a532806fef0462851d8feccb4c75beccb0e67e87d812a3704fb8047a7a5910fa609ebc0607de4ead78517d7c6e4032b018f107d945dadb329e170d99c7d14f05fb2f2c5d0be443454ead35186ab3283c05478aa9b71d7da66fbfb9ee6c47429a4d6ce1da77b526223027b2f1ed41ae66 +result: fail +shared_secret: + +# Private key not reduced +private_key: 999942a0ab80872d4429bfd98b2d5a2a7f65ef3b725eee7ce22e512fcaf226cfdc30ede47ce9d3dcfd87233dec4575784a53705577e5f8fcd9eacae4b38863c65dfb920d407b35375098a55f568ff0b4324b53d98debb5085558febdd084584bbfe68d9438d6378d9f8e4d82579e3d3225f711ae32390f43c74455b80ee632d3b88145cbd61745aa7683be2d4c4e035d526a488475e70fa86a09a3f3fce43b78b4a3b959a1b1fcf5d4593181ecf2ba883a9f18d317cf3d08de490daa68c8fa2f43533635439b5bab445a7cedf3afc22aa84355556c80a9877ac9453469b02d998477ddcedddb9f3d05c7c6f99253ab62109376dd9b384b2678698fd30d95c23b3cb38248d66978b55f2746124a98d90bcaf1c958e09be08f77e4fe7658f7eda67cb875532d90856761d57e89bdecb13c7746abef4c12294db276fa65e9f41c5e3cf254f23fcdac4cee8935c788e054f1db1d71611a3349843b7c86dce3568413756b7d838c3f48f7e167b1db27bf0546606ba6bb800eeb2e7b86186946ce0dd0fa1431237f9efa29adef75c49affc719e985e70e4b110373ae2e64ef7a85e78b7fe1ecf5ee7dd27de464f4ce333394d4bcd89f278dc639d956be5a8cdd6f54e77db5410e39e1ce36a23f763f6c6664a6b9284bd3ef18c809d94347187d91f97becddbde9134bf14e4d219895cbba75cabf62e6f6fad719f6816bc02818c71d64fad6e3bc2e58796d7a90a4bcf00c2be35a4db4d0346366763c277fac71cd3b56b6fafe49a1ef043fe9657391c7f74b6ba05f3e84fdb8e25c5efc46f986212ba2948b6db923df54fc33f9574f7b8faeb209b6441886ed83816c173eca8f6f8fb6c8e46f37d6c3f376344cf023e1347be9ec6dfa6cd6e811d6728ad3f88fa5c57648dee2286839e4a8a01761fde8a2fb49a3dab98bcbfa9634afbfec1e6072c479dedf88923d5bcb7eae872fcc89dc4733846cfa56cd2ecb4d616f3b92797bf8d8b2dcdfb74804c7cfae9f40b67394c46b479d6a44a5b669d95d4514a95f73f7465baecb8a439124d70884338485468b36b103c4af5ce9c1caad9feb3aff9b83f4e703b23dc631935ffe5b2c38228c36a3cccf39777d2015496a7fc6c618a2979d8cf6eb54169a479e6ff1679a782aef7c92c5550b4e56d573e450753beb34cd4ba8ca8949a7390a4a2e4abce4ba418525620b7c9064e8ff8d18da69fd58d847bf69833cff0f5f0e19de195f34b6f6a260c7391c97b5732f606cddb488d37ad71774636c9e1ea8a449958c1b944e76f48fc95dededb7d8bc039a81c497c3fdf8b52a714c4d679573f63305bb432b3e120bbc562be21b3df6569951986c94010f35e97affbc7dacb7b5da7acd6948ddfdb136d9209ce01bab9e63d449c2cda0faa336d8bdc1ba9c84b75e8863267ee626f4669938cced7eed7dead3649675dae2cd3d7724db6ed5b6d76604f4c58ed0b75c41deb4bb78bcb19d4c486c098279d53ce0f6f95086ba765f5e22d355155dcfabd7fc792dd8cfc5830d6c60341eabbe8e934e874b1c4a55e4884cbff57dc4cad54a7f4c7613f58ed6b63456af9b0adcdcb3ca87bd9ec25aaf42aee400e8bbe409604ba8919cc59b8916c8c8745c2f8d42cd187009317a52773c57d435faf794021bbc709b8e7d688a5dfc686c15931221a9016c3bb461a487982ded37041ad0c1d032714f7379e2fb9faf5aa6d0f5469c7156800ba258fc5b25d0996b6735665a806a74b03d9819a5832a6685157e7285df397e23b13a543a983a5b24264c971a73708de1572852465732c94830719c197c7985c0a7c53525a1ae76d18e1e9112eb4b57c1222320a8156643cbc9535a27658a3709123cd61af7798addd888053bb0de254eff530296f9ae75b2ca756539b61c62decb0e9ae611678b5190503344229096c34990a61ce8b10ed3841d48d266cdc249acc96b7d88010899c453467213d8bd23e1764e0237480c34d8396ef57c1aaf781c042471d04077eff85338ab8caef22ed064bc38164070a00cc78b8074e7569a627b49e0416a705386601d3b8a6c10a4adcbb190b4877422304ffc776b4a129d4098c603896a6020725986cfcf0083fffa66eabab82db734f5d1b5766104e8a2b8b859b6cd166dec691ae331b87e794a1c9b083c14b50b85b7e97148745c9f8975733d4262e247473ce53b85d01c6de505a352bfc0c233a396c87f856981c83fb74542c9f3cee1276f3096486ef23359c51ac553931b80c6bd245b2114c4a2d344ab53765c02c82b41412afa1ad5ba6ccee9bf09e375eddc0cd55bb6c727be26bbbc4e7392293c59455084b1542c87578c63511ae3e384e027bc07ca7401cb0096d1205f4ca86d3c73ee8273de930799369133f83f4667a92e72bee2655b17120dee233433f9c68a50c57fdc8617ac1d03f0961d4a7bd17678d8729329a0ba0591ca84670557e15fc5eb4e8255007b8c4e48206f62062e1dd53bfc43af02405d2e300d4858b1b9c9ceb531a910c0bde877450a9aaa8878a2fa45089e184d1fec1cf4e3909670bc11e78da5d8cfeb86a4c087a1b73a6099c99836b3cc76366d35a9854b3b205f4b2b69666878614117163fefdc32b6db37fdeab0a0197f79db088c3a355877cdb1313a2f200e27e37e12b4bfba04691f82b1c2e8b8172c11e466cd8d01286f2a3a4fe5a5f920476a9278b9d25e420b77d489386f9c167f2731654b19fe4886867b79ee10c18f679fae87826a0b65b44a83da5a35e0723bda3467541228b80b35d5ab869b52b5dba9b8b309360ff1022d67bc93747c392469c28b288cb73fca74001e5bb47d5b0321e08fbf832d0a9b0dbdf566d3898e1f9aba7e3c011a14c3e918589282c0f167bf14470d1f6c774e6742e40a1452c70cafb941624c02ad201e6030bf3dc6a039e6465d6772d1c184c693bd16c3367f02730ed6beb95940ff783cf9e307f38a7f4f37754f6c4ed26a1c70c90741ac89e56c989b0260f7e1178b5b975d54aa6f420e97a7b90c3c74200359d561beae98b1af044be40a2ad8491f42662e2f34bde200c63ca48e7409727c8b2185138ae7859ce43558349a1f3e641df0c14428c0c12d0a49abb904cdf8ae5cf34d379024ed528e5d84a3d25920b7a94b61a8abf9e557ff61c784501fc9e332f2b652f16a0a11148b8e594d1f377035e124d637659d4485d909543818814fe7a8a173bc8aab7066d2c927c90660dc8d30364d60a31f1d94a9e5f586cd84c167e2577d3326e41a614382f4982426e93391380c4b03db38d0f7bf0ff66d2d93c251d3347c643ef3581d438af7dec621304e0091f797346ca18a41f39401e9d03200ef48beb6df7d92dda83e6b2ef4cce08c9134563063068a196d7b1a1a13623e48ae12528e +ciphertext: 69a67c3915a5e699644ee255ac7f4e73fcad84976ee94f610426c60e9e736a2217118ceb9042e6d031bffdc24d61a73bb158abe5d57d5e1b7f27bbacbbf87a71925db2aebd1bad3c9b3e4504310862e8e79ea2ff1833b13e815afcd9bd5de8aa8b6917ae7321f4bad138d2b88637366186ed0ed48d4abb743c1b6601a1b3091b47953087bd077fa3432fa9420d40b0619465ef46d9347aac5ac60ce8e0aeba6c200657d3e4e8fe9dd73ddb9768a1498dadb9d15b9bc806dd92eba218b5088944b394f2226b01a2a15ced5e1e567779ec5e8752fe51a3ec1a6af64907c8b058aec3a0f323c31140904695e5148ac3d645cc89d458509efbdcc9d2bd46ba57cdda957eaf5cac08dc18ccc20254988ef1f8a0c1ad578dd061010632606dfc7dddf116a96b9704ee90102e499a182de5c5b1973317489f2a95cc015c86b8fba63b9c259a4276155b1fc7ceeba6c0bb4101d8dba10a3a297df54631006a861efd0cec14f52952c96e99d147dbd0f71c6aae5ab362e31586a967fdf6418f65d2f3bb9a7f4ea58c4a193f8e3aeb6bc048f7479080374ec8685bd3c55c83f3d864afdb65e901676556204082b90afb06f861b81095bdf538e3524fb1c07b9c0dacd3a5fa4c69c47aee8f9b6d636e56a2bf166060a31ca1966bbd36b8495c5610f86f279741260f1580f8ab41e9aaee35128917c0a0264aa992a6d2bc4516743177cce2fa2932d9a327e11cff1e86fbc71c44e6a49cc55843b1f7b78243419d53b15fec0bef99c74574e88cd27495a5700f66ae30aeb3891f839829cc1b79600e17cb5d4af88b3a2c6118ae816d28027f6790799af0c264fd17331479213de77087f7ffcc0d3831aa82e4c0cd73328057a2eeb0651e2cd6e86858129e190ef97ebcc3873c2c8dcba51a83612af4a04144dc4b488be630de461b20b6e1a2f5f115942a5a4491f30db59e4480bc0784102095f0a612efe236cbf6a0bb8eee2b82b399d8f2d594f53574e7ca440a0ec1df010d1c08650fcb5e58607fc8a67a4d08632ed0d272e5b5002c6e782e3a88478bf0e9e29acbbbb21560f546c508faf5f1219300f0340573d6cb747d15f6bbdf2002c2dcc661a0e8bf53dcc3f05a4e8c691f21ef608ff1788266349783eebee6a409c31543a0bf3265a00305989c271ae5bdd42d5293e18af9005cf673d09508fba1580da112f658ef78eb770f2906071e9056142244da1f85cd8a6290eb82b9bd9de96fca1b5a19c27c82824f0d1961575196e0840a93d9cad6ef4e97e55f0deba61b9b84729091af782d041b38ab54f86bc6a3887a299c511521505d1199be958fb35194664a1e6025b85cab73b611f1646b6e3ec3c7acd3d5323cec2d52d46e68cf9ad52557c777e24db30dce32e04084bb789c6c2afe1b8def656a9e7ec0a1f11a6890bad7f766305dc34d39df64a797446ecf53ff75848e3a0737c269f822ba27fa2a158b11ae758c8d8164fc359941c4e8939364690359470be977101ffc685b088e22c0e887b669b0e933fe6f7574a6416149 +result: fail +shared_secret: + +# Private key not reduced +private_key: c0b3872479ea735c3fd92d33d0535c3758a5d4298ddcf542556b73ed7dd9c474df5c26471849a2289c469a975839fa5d4b389e75f8423a4633ecdf9d8d1a5c19f6d9f22f40edf33aeacd7cf94ce8950cb1dcbd7963d69dd2ef447ebd500265d98cb88083a633c528ef75d53a7f0681900747c8eab98d3aac6ff35d2ccdec81aecb4e5a654a95fa086e4da10c5ec817eac3d6394b4ae3d483e2f14ff9604c682f15f45cec41b3b5509819db6044a1a4cdaf26ab4a6cbfeece5da08d97f3d32563c36aa8c3cbd1fa3798c42aaaaadb9d0ac892545ff64de4d72db98230acd460d738100fcf5fcdafe30ae4c7297337ecf05c1aef8c4ed9363765d45af9f1a7bd2b17c24d3e30c26a8b872575980f39f01f352fbe5aab0c9a96b5c51f47370aa5372bc97a22b4d29fadb91576f2903354f6aecb3d49693a19841348d075174d2969a9593eb1051ab40d1344d809cec79e717579a1b7eb52c9087d9244cf9ae6bdc32766b694708d1ba22fc76b042a6f9ad668971b4767e6a54aa5f90b699a04788edea5c914e3cb431337c0736eff7f44d139bbbcaf8ce82b72af9fa2322eb7560c9db5c9d8be1f53999da172f4c68f48ed1c7b562b1b5bd98d4635acf9dd933ba1fcef47bc4c485c8dd59976792fca7c4cb300954821695eb5fbff87fba33e7ef84b187ca77f6a1be742286959e38456594763f5ea53b9a795948fc348c7449783b5c784522f44aa3c25bd21d48660f78f71bdde49e59beae9dc4c8367c22981d8ca6b5c198cb69d6b12c5591533fafc1a4b1ce5c4ff346f5f536fe68ab9d816c98dd6c5ef1d3d251874b4dbd554f38ad18efba68763498f856d453daf0ed3d3835cd81b5791b5ded5934a0734a81fc78c6faf3ab2d96b679866459cf1ee5dabce98875167361b6f99115fbfc81f3cd4f9b5e0e98c4266536573742c53ed9d343bcb9a8bc2efa927496a71d73ab6195cd7194d31ba631e0f55717f5e6b37abde6da546dfcd263fb32a9548f1b3e9e06e846154d5832954d89a61dce3b5cbebeff79e550117402d0f7da08bfb5cdfdb25ca36b0f7dd4587ee366e526a5da8216a7f09db88ee46578b1d7ec0a46f932751d78ae67c58d9c14ca0579f3d2f64d692c9b8de07cc05a55aa5aca7607a5f5b17e13a7fdad53d9e2e4af995b3e059cb8f3d09b65f27ebc384ddf13cc63f5ebbc33b7922a5e073ac3e520e3b3aad464ea67a9d5a76557ff7ea7974e1c6e847036d95ee3201644d585cc7b4c9aa301980eecad5eaffedcd5e63f89dfdd3557e0fd6aefa23d5e2f84bc42c8fc057a4adb58d3545ca8d767ae72fcf7bd3c3178b92c5e776695ba375fb841f1f760656befcc9e5d6b5ef2cac896d7380a879a4110ece067a602a73cdcf0da4321aa880b7382407c3da7a3703ff8a0997e9e49ffd6d9ce2c88b460e79edda17bc4f5b589f2b46fc773fefa492e22efcfac69392d8dabd1d84e699d3be87b76364caf5fc8204ade5bffdc9fee653124d7f970b695c8759287898ea39bba806f0e9d48937be935b3af770d498fc2bb22df5980904759ba64f0533d378266c8114a7b4aea5e44ef9efb4a530ce63628c5c1a65a04423f5b3f3b8bcbc7dea5c42c7897aa8956473d54ed8b6c56dc931d12a8092102490881b4e2064c5a9588e257834c1aea2668e69d907db5158c3cc7321d83b9703cb74864c1057660b718c3412cc47bb92612643313c356b6b2cdeac80ec5b657e78cb2fe9ad14c28747e45466847d71c49d1355aa845a5c0fb27160156d49a3af1d8b975d694186b06a5b1111ac504df3f91ce9a4b2e248697f9a972e7b0cd048c1b6f7581af20afae4c1b9333f60e73a0dd1ceb2e19887cc712d0bbb5c24054553c3c7c972e87253d4c46c971826e8955ac0017ca6d6550335916d6a939f5c167bd68c09d85650e89b40a4686ff0bbd921ac3e43641b1600a84bad0fec9524f09fc920916a31b081e88a36803715b1476e57ce39ec27fbb04256ca64fd11225e474b06bcac9657b31de3a39f4cab5b65bcd8896655eb924243972b0bc9b755b0c69b837030a07937652c8c14f71745572882d222ba1208327d3228f0778a215b8fe6f4a14a9b3a56ecc56f09c49ca31cda853db12a2fe5d395a00cce6621833e61c2cea5bd6f0bcc6ec6b479e334fa543229b619be566e8c00a1dc7837c7b5651b8b6a94412ccddb63b8213635a5745a54bb56198d325a59109c75d2b733c77738a1328bf1370ed99b7ed8f611e69c3ed82620ce95088a91c6c6d472294260a1c5455291188e010a9467c816938f9835c1a4fa01223494c885642e5c416c82223d614a108a1128e53d9b264d61d798c4ca9bf6abc72fe779346a3208a77542272b591a6ae781996ef17961284666c85ba91b2de5f0bf9af10eb91c5793e48fdf367f46f586e05b2dd65b262506043de419482071dbaa2568256a14825b8f094b796a527fd25b8071a4041a1be279c2e3f543021364a147cff6740ba448b7010b4ddba6aa90265a95905f141a9374970a1a071799d813ecd77073b453cb2b6d83ac9cb8267a5861b9e2f23d345581a074657554781e4782d98333f1237dcafa48087aa66de4209a9a78700b09d44a0b5c929ae6612acf6b5d8ad20404a161fdd3639e659bf88291d41711015432f0e7ac759a67e0324f94c1876314687ac377ae48a30b48ba9986714ef3064f087c953ac6f86430bba9cef9857b849315dc4379799092af4c5531fc13f63b186939040da2233be05371d448fa748d76f98c3f638a6bf5864b9bc5fbe496d72966e3004409e420bc4353a5d55d0610843d0b8e6ee5bb5d6c4dd1462ae99a43df586b398a15ff5b5ff58a4006987613f5caba694dc0f736f6d47af66673e8f308a6044338d23c817c0420e679ef621739e21a4a35140dd2928e79584f787671b118e9e71e1d9430b9a3210e11c266876a44c7082e7ca5f6dc4b8d931f5bfa302fc790bd424cc3643844418f6c090e2cf5bf60f08c489bb87315464d90006375c34a5297a238a117a8770cb9795776c11f8a54ff13adb3fa77df3757938c28d03a612324858a11a860235e0e15284e36035bfc0178db841c679a47b93e3b09a9f735955d6bce328a91f2fa64273917b7371fbf166c47e9683776aec02251eddc84032cb0a852594f4c7875792fa345a43a68a193c51492a39c306b02f22c60ce5a8468c3050cc3965e2982e32b938a31cab1f36c1da3ca723261be3a864e2912199262c46741fddca501df33d04a79f8e3017e6197ab24b062cd98486dce2a7ffb22e5798643cf9ba5fa06bb0ff42f4d610a7b3df7544d66b97a486967cd9b62ba0142ebb10b8ee4ee0f6aa3e88f7fa8a96067f8cdaeceeac90c2d0b5e277e56e9c405ec9420c30252 +ciphertext: 64f1a93ea3e3017634cdd1c24a7d5a1701bc1d9bef3a908e70df00b38a15eb30395503908dc45c0ad971f0f20f72c4a75343b371ecc0a7ca7f18eab8214d8782952aba2b088514a7b232ce93385efea00abcf98e0b0a94f592ed365fbb950dbdac46e374f3261197ca7a2e31b6f2971b120c5c8aa430eb03c314cfdf15602003129e22b827a20658834f04e9e618f6fc1125bb9b71fcbf2a66e884800e74bde13c3cc9c599ce9bb815a8934f60923732fbdf1ba1a9c034fd49d0d809940f89e6693efa4bd9c30093af1a3fcc3a62ab5efe2e944b83cd93a855cb4597f3f788322521e9e11e8adb20fef58ce1185717d97c593d7423fc0498dd49fefa8b40e6c14ed55522b71298c6cdb499de705e5824c8a00431c778d21b82bb7ef6ce728d669ed541701ccc6c03cfe0600098353c9449b595017f567913bd2d233ef9455884001b94e3fcbda4edd94b4a254a4cb88bb59441e1219540328520e8f68e9c200f069af82c2dd6f36cac81f087183da9d6a2d861d19396289f93a17649d811ee5240c5b7c0e8b69adc82675d2d1dfb14d1b62ffcaf6b83bb7ad220974a87833f6c12987d821b6b874a3cb998211b54e9e70c3bf0d71c1ee7266f562d0ffce4e10dbd025e9a40b3610af564c051d346e2eff83fdc73d80a710c36990041dbfe1cb242b66dfc4dad929108d00b5e9a1899a081326b6a2956e1e352a6234dea100ef8e671f94b10612396d5a8ff765e97ded64ddf55fbfb9f3e8fc202a1d5cd8c178feb5a01f0a5011e29e018e1c9bc26e49901984dfcbed1c059bc9d9fc22538e57719ae514ddbff7a2cc9e2151f7c7d944456c3398f65513e66b73efe8594bc3d38e83cee3a5a939f20e444be0c0b48520ff200f963fd27087266706eeb7a5ffdeda7be32a98ba2a5df7fdb763b7f15bd2506d39c62e9d2750b084b44ced6ef79d6582c61e6caff2dfd69c7849c89befa002817a52542b155bc51e6a1bb50134bec0d6e272cd6d086eabe8f9c46123eea3f6dfc129640d6739308c0c530f2f0a5ab7695721d34d464e5b98d5200e5a50878599b2482a15f93b44ef13d6ac3ad16e7fbdd53a9476398ddece997e77301fdbca0cb2d406bc9372117991ac6ec0900a191c9712af80f8f6d33462e13b3b9953dadbff25dc7dcfb428f0bab661abf3453274648a5c61f729a7e0cb46731181639d43ef13a0ffa1abedac1b434abd5896c80a3116e4593312b13d4f5bb2ae47873b4dbcc51cf2c31bffb5c0f6b33ce5de62ecbcb78f9a8c59aef6a9436cee773dd6e11c177589b1eaf41ee4d3e5ac949d85d8468461f9e1a9201d9d100a835fb094b7258181d4dd585a21dc9a20241aedb30e1b4ba738039cbf237f44cc57abe3fe2820903acce0d716eacc7e78d65f8a166b9da0f3a3db0aa97865ba6be3aff891f2917c55b5220f814022abdb809fc33e0c430b6ab8ba7af0fa94584acb88543f3bfcaec64e953344dd0015ea3fd35156e433c633254c971c842b367707ffdee668ffd328c7c12acc134ca505c87833b +result: fail +shared_secret: + +# Private key not reduced +private_key: d95b5c5667b798be797a73806df8906819743e13f2070c80d97b77252d40a2d6e54dee52e2bacf89ba871dcb835aa873133a331dd3450bc5e893cbc5b17f45902655210ec56e6a9ec0da3ace136b5fee509474d6f13fa475d8cd05d3ec14897445ebbb24cba8a9e9b9fd8e9d752a5f694de62c89c4e8ee6dc4cef823739d45cd63f55aaaddbd3d02c3325649afa5a63e27af3f16cb48091b38905d3f9eb6751d44bcf61989fa953c10a5b8ea9ca81c56a04498509f48dc1675b2744e5bc9285d0e765b032f927a979ea9a47b9103c0b743f6a35945ec1cc870a693980cb7382fb85579dbccdaedf939dd15b6cc53db8b99a89395994e3f39c13d8eb9f3b3e3a6bce407585ae20e5eb2298defd84a5258a2e62aabe709c8243679dd85b82c08a8213ef06dfd424b7cab4d06e5ab2ec81da3efc6fdbab9f373fc4a98484bc6fd66d6af987bf57842cc4461014c4c737b6a52234153986aafd737d4a834971b96a81e693716cdd1639f822a43936b94b85febdd76d50303d44c1cf596f8e55684abc1f8ec228e51e2d44845d781e4a54f33fa8eaa0cae0d96c3509c6e5a973273cdb7616a929a579d6d9b83ca8c6631b87f94457312d9c58f66b20c14f97b98ed11e9c97357a9b0f5d572b343082f963869ca2a1688f623b5a42f4d2afb7bf6f4ca125e98bfcfe367acf10067a32219cb9567d42018467863c10a4b449bfafb486a85eccdba8da9a3cb5da63255ea5754b7eb0b7068cfc939cce92bdb83164f7146ab6fe749dab70f64b0875fd36d3d09466acb2694091340bc8c6df3fb8eaffe664b533c0e377bfd0bca3908d2f40a9298a6e9c41756af7b4cc765ec8779558ae4d31a6459e6abbd9fc68103fbb9528fc9586e35e154a61928db1a694e395fe2fa8996346d791666968cd9aa5ed3bc107f939c24cda10a9f2b6faa4cba9b9d677c5e0ef92e47c29a89dbdbdb664ddb30cb154d01da8e87035d63ad99a9e9a4800e9d6a769579eabddc95e416fc9a2f144b2d2c3fecf889f1aafacc434919a89d474ac629cd3ed615db3503c2ccb4612eeb831ceb76ec9798c2738429ece0386b36bf6d6623efe52db389b30dc219e4957bb6ac6f59739bc6dde48fc88ebc4430ce6e5b55cfdeadc9b79ae8b07a5e72ea392717dd7d15951f87b0e09bbc631bca040ade5f4630fd04a16d24bbcf45ec807cd7c32aa05b29d09b76e81413c202536d52b8946fd8bbc76fe5749359a3687cca6982c3bbd435da4edf454a6abf3726d5d3cba4ced97f311799c4ce57c0e1fc48cff587c4b552da83b5472353c81ec6f32dbb7264dcfa75e352287e89dd624d08f58b17914f654a61bcdfc30856cbdd9f5fb984a8e334b5333c311dc1c0ff6fa7164059bf343fec330f5cfe94bd7c7e568d6f437c0b3d7131d7de092e637519b1673a38478f9ae11ca2801b5a5ebbe91ce686ecdfc2a8695f357bbcf18c95c51591b67aca786fede33be426173a0e0596870d7508da93cf9d89bbd43479183d0705496d27d9f04e424229d54cef9ec816868aa5e46ad5e06e36ed643ea6933d6bfa0e3207e6da7f25e9d0d7ccc03755eb5c31a2a8fa81339cee7b810727471d447df58eb87db7df775eb7eff647a2eca76f22424d97bfe0b7cfeba385c55253559b0372fac0c533055ee490bed57446b637fd0c07c173b2c61345185a0288f1aa074accae383c75208fa03a6a175c3d19481e79ec833057a8d2c234ae9b01376c21bc75277738b17dea03eae594ea939e125c2592bcc95d3cb4f76a8d8383b318a48f7481b6b8419e8bb47cf1229c23c4800788cf91e465088a580762ac5d31616f114606c54efa9c0490298ccc23200154342dc7709a5ca5ca3a94b7a2ad8ea734b6e20a2d15acd47c6aeada3ef3331fcae173af5191ca8b74bee31f1b7506b595a3dee0899381111680ab02090429b93efb7b52a6884d401841a0d8193953a5a5f2417df927e5934c109722cfe18d0ff93a3df69d9cfa4d7f5801d3294771156e828924c65a18bc798006a1c8eefc3b4176634690c061b902738024c0ab981c3506d11b8f307c8f1cbc25ec764fdad76fb2117aff430c5a5a468f2966bbb877d2b8335ba3bfca985864f21a9912bea56a007e7223c7249b2e45a37db9c104438e76d16321289d4b07001241aa2f0a1a24d81c27a9adc0c768e1b3c72fa08e33f77c90f4cbdd530949b2b67da9a15f336b679937aa825989b9a450fa5f69304d37e585bc039a154257ee78907f689dfdb246d05c94c3057066d03a2f9825be6a52c3376efbea3fdeba68e13716d810b73662adda56bf30031b8f682c8ab08c4b0978bdf113b4432ec712ba306a63c327978224597c3b8155551997bb7e2881102d8b3eef786be65196ba84478c1c629f45a885db1aa4ca443d8a3300316608e8c2f71c6c7516ca5eb453cf9184bed2888ec592dcd53fed23b5ceb98cb575c474b51e7fd64d73d54f37b51fe1d432b2150ecd5b0dade606d83729586b2fdc60414a558c3c19122e47858675179c2229779b40cd882bfeb3059ffaa93552443fb70fcabb54a7015f8b6a0798b090fec5aef185cc95579aae5caa2b4923ddf65b2570c15b1b0464c086114975dbaac5a564cdfe02cbce8c68752000ee81a9eeac55d4a81be9b3c66aa3875761049565a46e305459fc7a47d75316b59a371cab01dc3bfe9108003d5f868b39ea617ce3091e3ab646db07ccc4a09367b352d1848b26e920100827c8d4c92f0c222d8482606233adbaba3005b58fd3248e67cc75733feb52a5acf5a41ab71ce0ab7e8fca8113261dd4b7297ffc9d37899ab40b0637c02ff1c73e81a02762fb264f51c849d387b9f7aea345b5e2ec44f2e0866b9574bcb13ea0d0aeb7a78d6dc7b5b0c9838297c05409bf90d86b3c1b59b92c998a8abf34fc490259289b431c5c5368acd762df8ca04e0235ae91bfd5332d67169aac2586deca4c8174386617ac98471366283f3d30a971c62f35322ac96a7b0c45779f6c17f1117a2f1b454e3557ce5733cf979156400c5a780a4da91ab8d99c4f98b141920731f361ec30950bd0c5653c83dba87658674c57473dafac42f293bee44034b9489ccfd5141ee42cd91b3c3cbacba092cfef6ba4b0a716d8162521b29853522356943c697a10948a50f27008d8a303254327c4570af822024f5b9aea82a62100856b2140015418a9ba3e77325b911a582e92a8b8e123816405ed8382820c0ce5ca491c0692b2b542b6a67ec87bb6b0334c1833e12aa958fcc0747802853f8536c1e24a0ea6e13ce23c96726b5cc886538ecdf65b7a485b73a34a72193af1ea3f884d820463601c7f843672bbec7d4f3029e1be4e1c0258c3a22ff5b50b2674cc094ba7018da2a61569845c17d26f +ciphertext: f3559c274dcc21e1deafae8b7eb2b8f482b16570c20782312aea16690eab1b983d149994a0777c22038b785274ab1811bdc0697aafdc49487f80f4139bddd82efb395dfc83712b4e53ee6de05016f3277afeb9e3aacfd0dc21264822e93438fee414f2d8284de2e1d958a328ddb5107532d1d0f29dc93a5b833600469231f513f0dbbb1b32c0b527f469bfd08dbcea4e578a841dbcd97d92360da0334e5a72bb4b1d3b936ea94435d94b23f3a3549a11c204e1f33d0756ffa92e7627588f5edace35988346621d7b2d407cb5c3fc89e45bcae6faa82b1b5865419b9447e77055d000de9b0d80fa551362b548b3f6cb76d2325a51097e05a75691070619cdc4766c0988325b6341805a865fada300b997a2345378d848cab9ee8a40c9447532089f47f2deacade37ab519f8f10c5cd7f326acee099ada48f74b12b799a41fef7330bd9bbf23e8fde26ec7a4daff7680e1f89f25760a81117c2cebef939d71934425a0ef295900c58c2eeef7f2cbc5bff1ccbb2158721067310e0640f9cf17de6dfeec8c1d0635dbf03d32b1c302b866b343cea1c9cb7b0a57a69f22d1ea050d3587b152dc05d6a838997bbd38f162743200054c1cce745fb9655fde5020a4fb1f0f8da267fd6d3936c78e28d832534e47325aa19f6ae0fab18b9357ff59370e1833b2fd3cd65ec1f36f0e506df4a517eb6298c2e5b1dd9a8ce9dc2ad97522b607c8d3596f47534f0a0aa98aef70a9721eafbb8c46aaba1e2b8b9f12dc63edde14f2414fb3af9f76f435efdf56a855e4f75e15d3f64c1f655484077d6221b928ce551c4854f6f2e249da98f1f493c7da414e7f8bb7dd3596bc8426d1c064df107959503801fb5081f9b0f9cafea6d0c76e10afa23a49ce3b0ea3c648d895bc6e1b39b6454a529edbeaf86f34f6b253e0e5104777ae4ee5d9f3885ae099adac63db65e43f6e2765c7a4d142a62069032e3f72422d71166fa4cb75e205aaa513e4e1a6b87a070ebce326e8f17abb2b81ee4e9c7233b5d4a3c1c8754268501482431cc4850f6693139af85ff841229d499e1d37a3c7abe1d80c31121cc7790fe9a9203f97eb5a0f681c734066c1981adc3b0d9fe253064cb546f46d92ae06cb0e871f964ac0baf8f8d1e8b5d1f3f6050374e9440067a6722c6ac370baafb51b5af44ca940373338beaf1b36421453757287f18841538c6ba9e1aed10a6e3f8df29f4db175a1e595a0d880d72c14217030a81f3e57bd284098fd93b5602e90012d1417a52a5c1ac4d0641b0b9f39217571a30b20a364045d7ac2c1f0ee778882c6889c828ca6e3d04d205148730e3d69834526d5607b554c6f4c34112f94a39b2044642b65c2cb7a28a0f8a34c59d11af9cee28ed98de8a3e65239457d087d425dbbdd8591288d4b1179de2e6af5c4c22e4ea30215a635f64f5e632d78a9475307927a595b88b5dc6b54c6eb32fd249ab9d5fbc66a2531341eaca902a8bf079c4bbe45d0dec6c014589182aaf13bc05be177be4be4b8aba60f744a21c664bfb1182d7e +result: fail +shared_secret: + +# Private key not reduced +private_key: 9d897195f7e39d5b6b8075aeb6de76b60bbbad949d599dc707f460342ce2a79ac5e18a9126c7c2d0d59457deca082d34706bc54455e9fbea529b17b3317ee3f73c840ad3bc015862de98ce93344a859d94eb7ea6d6be7430dfa811d389ca465419cb8aeeabfdc3a6ec4723a7bffc96acbc79dc5be7c99b4022655d7cdcda645981ba9dad8ab7b9fe6a69b61e731c84a2df77c2be9e7f133df35f9eae5ff9ee30573dd68ae6ccecb18f4b9116958f812c7fbccca50ed732b3b946645b409b74bbf34c3769757c0bada04d79dfc3ce4df10b334c089adb54cf6b83e377d433cafba345dbaf06366eda0975b00fd8e0d545a31aada7f85369c6ff7d1983997a542e899aa275ea0f44e7b24fbf1317aa9b766de21355460bf324d5aa298bb4a90b4aa93ae1ede75f441734284afbacdcff2b95ea6d3e4e81ea510c7a31f85855fe55ce0656a88ee689339495d6cf93f483bc67e49c86644d08d896681cb2d38f78dcfba73c2bc2e15dc9e277ba7abcd72724b7c03cfff1ef4a48ec9d8b56f98d14657fc74dabf368c7cdf72fe3a5ad38d130936a2db57e5da7ed199e6ec39b9960c73e2bcb5697e9690a0db9f25496127a58d60d62ce88c0f3ac9dc60b9aa08f406e1bdf7c68988078d7f6bb9e0945b7573e36cabbcaac04c6b0ec8eab6dc26fb6d4b073a0ca8a925ac99bce9bce26fc7ab69c9a1509c7ae8c97e006b5b8f3a99ebf85043f986d65b17a67a1d2cc80d476cc3b9dcd41a9f0e41fd74925375987cb7d268ff1eb4adb07cc4d133c381b47c40b42311a8f2198ef50ea68343483ed6bbf34344d710c7e0f769eca3388b84c62688b4cfec37105fd717ceaf0e21b871e267fd275826da7aa92b372fac774b27eeb18e35dd6db3e52a58c015a8badb33c54b6daa50d5d55fbe6af7547d217670b7fe908a9b25bdbac84753496cf44af29ef7d73ac08c94b7c1b522916790a245d6eefb27435d159f89bb48aee7c0850cb97bc843a7a29e594a64f8c2ebbcca5a989993934b9a36ed1e7561663a8c9e4d0ccaa7d5cf4484cbbc80dc6b3ad2d926b3a499429d3c4eb41fb988f0d77a8d27cfc69ae4a026fb926f4bd8a26c45e76c706f68bcd738627afafd235638f6741d229427ac4e66a2d850db4661e5de9fd7ba362065acfede5bb3f59eeaaa4addfcf8c1e89e5eec4a3d67982d942ff2734e3434a45e842e167e0399dc7d46ed134466884cce6d7078431ffd48fcb58ff17e7a5e6987999a5400973809c30cbcca50efc4ed6cea37f4adec71842d88b35d53c49b14dbea967a8466772e9e3486306a0cbdc449ecfd99c349970e8462093b398b7ba10c5d5a76c4aedaa4ea76eaf1b8efa5614e7cfef6c4c1d9d8bf7fb88467752f5cefcc752ab3c324d2684b1145f4e87e5e9d98f0a1bcd3f1a567676a1392e3e202aafbb1dc15ac75b46ed6a43987d9f7cd7de147e0504f794eeff9a8877a2cbc7f2f8eff964dac09bc6215f7e919542fbe5337a5e9f35d7da4e0ca6f0253caadcfec83749aeba42bd5adfb7adf946da8320fcfe7954bf2a184f94b3ee58d5d5b2deab9c4ae9aa8a3c1db7f74838c769ffe978a8ff95d4e998058c9b58b862ced90a5bc3278ae3470fe18db4c0399454010510677c6c12c76cf7149f35031c8df3b243140f9716a571f62a5365a0830169b612abf0075ab40132d51070aec5566fe953382ac3a3705b8566064af52b926b765bc039d6f86ab8b27cb93b809e670da4457bfb8b6be9aa54d9b2bc94eb0c3e15ba6ce2b08ad229a469312a5caa04c8a4fca7c76cf905c6fc4d32127d84981608810a4752b9f26baa12665bdf30882d2a38200798de4a5f1d3bbb571085ab091c03e896f25b8759e43795dc83c2069fcb2cad05b166def78d18b920e0e59853c66bcb11795f604963ac3af33b43f78252e06b39d11449012b0b35bc65c2562a66f7597302377eb13119fb4285d5613d618c2227a8a187b132b08bf5b154745451fa627e0587c24118573f3628e3da59e96c6a66d26c2880c95eb1abd96202b3673bd64a74d1b11396aa406d378183325c9d03b8294177d3d6439fa79a2a6457d9f81ba8134bc781c575413e40082c686ac2f59c3fb45a580d3a50add274add391a09cb6c559623c997da498c1d002b0f9b5254c26266757849e7598c941333d580a11a1c197617b23d98b7da60b6af0521e287f8b0cb21522236395a60af9ca4dc7120925a4bf497e2ed65bcce78a33555ea459197bd5a499bc7c2b788872916ab3b961f25094cc96659db67bfeab52260456bb775f56e492564456c5d25f3d0c9bbe7118615aa37b21547255112e590eec52928173292450abf2e834f6207751b068200875d7303e3bf7141f28aec8653a463a774dbc33772849385304b42c99d3e531b0376beb153a56734887c1cbe59b55bc3cbb32da63d908345b200cfdd6303f3999bc873db53342aae6ccc789b2a4c72c7d08a58feb9c939a3214aa3b2bd27ab108aa89682e08729cbaf93a68613a8f56b7764c23cf085f6a970d8abac213f7314128aa64da213d5a53d2475f7002a6c354c1181bacaed645fae9c7509a0b10c8317f714d37f3791c03ce39c79aa0548f88a69dd6f87dd49a8e63307331e00c5c5b5fd7d9804f3c57028c2d3fe65d87ba7c07624fa35754421c4eea618cda1c5434b09acd0754e04439240988ebfb5f6d6a43c0683a287b5686364fb9fc6a62551916046442004caa42428dac71ef5879bebb09c5dc919076620b9701a2d8af248672e2ac0107c62159511cde45120ab84993fbbe65022dcaa6369508212d7a915183555181b1b9610dd147516f2496eab20f727724d7178357f50e23691c29400bf461c389932e2e663faf31ac53273058ba675cc0c3367c4872383f683a834b4a522b92276f70022153aaf4622f24f439a0d382fbf5059744c487013501d41fe9a99966506f2f5651b3ab0fd0a73c02634dae9695e850c67b154455aa749922229090b621e259d1f193b524579690262f94c114d9c690e170e526a99f5149a2840129d22c740cb5b2a50ae7809388147b943a4263d50ce72a2fc2fb6efc85c065502642f015d6b83aaf0880b715983bac12fed75b1c973046c79f72436a420b790543349b917fc4c3b18db80a1ad346389180fbb9bba1a6a8a0f0a62e6c24d580a16580c682553134738d0cc1ce766c13bf74c82ef5c548f79de19a0f2a9236100a7adc1b2f1e1b1d0066b9352ccc40663d53b0af0df9ccd6353381e5030ac08c3920847f233164df98ae8ab017efb305fcc83fbd22ea59ee59bb27757389a4a68c898dab92d0f63c3340dfba51e00312a05e721932b95b11f6da1c0ec046899a777655233e4e1b5ca44e9afbdc67964bfd5d5e3dbb45e60d03cf +ciphertext: 262ecbd1c283c2064969cc4fdd0f4db58328c1d0415c0d279a737781571f37df0285542dbd69868d4dbeee51b9f7e73a4ebf5a2fe760ac58a594c1d451415eef1bd357d9d39c8c9e882880cf9f0fe8d750d35094aa8c8a7a33042d75d5885a7bca143e46db1c1f6ca6bfa81ab38263f74e78686101477c2f1cb733a0159e0b5fd1e3a82ea8b947f072ff363336bdfd185bf8c87f677db91dbd8f9ae2e40a3333dc817cab3ba73222443be7ed324d066c2cecbf48cb1a461610825ec8973327fa5c4291fc470db2634a942d59ce4ffb7c1dac2200131cff9ae5c5337d856bb5a959d9094ece3359f13aef1db3a81c32bb29fdb18550de8a90933402f9609576a621a5b8550a4d8bd025b08ee5fd29a83247285e50826cc778806871e9b4b2dc9257315001ba2ce2f15928b730b850fb96cb796ef7596c49c76baf598db30e3e03421dbdce7ff056ae786daff65355ad8bcac2d9fd09d659604381dc650298a9b0ca49ad3713569e6a5883b6165285d6ba97042ca40f823fc6a29c20777480e503dd5c731be8c3d5c4dd2f4b3331094a82f12f832dd8b2cd1caa43a4064cfe3556c4061cf53aabe3a463ca692d46008c4e212b475f8f127ff9f897dddb908da2cfd650db6289678d6fa52d96f08428fc2f69f19eac596da9c1ee228517f73eb45f9ce08cf0b56c2ebddfd42bf01b8b49e00fd6402bff5b456d7feee761a2b36aa31c363ae9635adf75979d2082abc115c8553a01c763c0c068c0b3d17b6690948392d5cc30c569c1ce7ff0bbd769251619559eee99523fe5e6b877e1b7b4b98a212b714447ac970d1b1f6411596c770b427c2b95fb0f4fece8dd3135bf3f8f6f4c69f673ff652a8eeb24fe64170663ec660ca27eeb43e878e8a4d509491ac22f04cf4cfdf389177fd5e5c029ad36caeda9f2a2eae6229b3a5051b4ca586d7a626ef4b2754028c0977d2cc6a803697a9d744713be696a0a643eba0f758ee467118e8954d273141a696eec5dd5bb3a4930cb825888bf95f65f47a2da8e4ae014264818db44634d149da01ebc065da3c7f25fd74ff61edee01c0fc86e19365c388b45170ef50bd19bc4528fdac7e4aa5fbcaaca5ac8f7c3600c6006924368654ede616e00a6d425eababcb41cf47cd508a004964a628222af4d8a049d7d0da51bd2e2c5a1d10935c291ceee529053a5d7126d544737dbfc866af9c7803b94d46388f7cb1c03428a8580f67e413d106e1bc65ca4794e22a97b9b30887a408b3afcc89bbf12e7c962fa7abc566cb5b4147ab1da02d2ac0dda2cfdf52f5e4a179e2bc308de9af848a676f3c3d026836b110da01bbe087c613ea6a364ab98d73628d1f9e4bc88d0421ade48692f641ab46ba6dd9c7d936475b98433dcffdcfe5f8eb1d7911fe4f584869413bf1cf5d156a02af1b79bfe3c8b2d01c0a3d76ef0203159adecfed5d418e36ce5def56f2a5b5400c018a71b9f8cc85ac6362d03742549fa6a84b74aa7d1ac71f5295c9e15a6fb48f84d0eef256357d6f5f00d2cd27e4092714d +result: fail +shared_secret: + +# Private key not reduced +private_key: f78939177fb25e088e06ab6e0167cbfd56b01d0e876cc67ea0dbe3a459e472c4710f9cafb6eed68d2d7fa9875879dcbf60e78bb6236f300dbc7708ec98d74da1f3354df5d07c0b5244de5dc97f82f3bfc298a5324f35cd2e73f7a80d8c52df815d833e18fd9b92ad47d16bf5e0c9782d34bc474a973ecbe586af3bdd2f811458f99a0a6d42669b31a5eda1f949e8573292089bf7bdb866f4cea0cbe10fa543565dc11c477622b6c85979ebe5683199ce98d2a6df8a3f606dc331103e93663abf161bcc6e25f1a3d5f7b946a8ce2dbb9c5bd627e9778f6feed5ebb7d727c79b687215cec55b9a5da33d598ed7edad4ab18349e1ea9e531f0a32ed2a773d05a9c166cd4cf4c625f3665bd8dbf1d46f8866d800fcfc04b9ffad947e406b8a1416e642d879b7fe4a4b2651d4eec5034ffb256a7c0ff4d3049ef5c9f5412b6cdfb62bbc8ef4edcf17ec5236c4d556f1011ad88a7dc956a5588696412d75b9e6f5a92058e349634956a9a097cc8a0a5897a6fb60cd1d3aa1136131c5b30f4469a73c52d43578df35914d5436819ae6d3eb44ef9760922c354366f79b793a05a93214ac499b454e4b66ac1d1e88e0c8375e1ff1c8c8d0130fe405b57ab023b822ba5de2d96f4ccda2420ccc8afb3d9a983a59a46d4b3fc3ee764b0d696669ea5b4598e6be88ff3db39df35b6624a59f092782c886806d95d3ea5ce77e7385fed9c8d84e6bbba7d8cf8cc32a2b3e199bfc93bbbebb7aaf5308e2cf5dcbf173a9268d861af698451c77fe1556d79a486dc75dbdfa3a09fbe50f477c87857b045f418c4a66c58adf7306db16a4eca247b4981c4aecdf498516fb1fcbff863f3f88ff48a71657760c8767adda1f36df2fabfa4cced73746ac6b73998c6e71597b9d7fd4fb883f71801b6dd22ee62f8bfffb55b045ed8983f6ae95f731d0d3ffb8e3e08d5ad48255a42fef90d43d31521b46579c864dcd4652e59252a3bcf315577d3e695d6c8e455e7b5ff76a75acc609be80a7eed842c4c92badac13a5515d7cf1ef25cdd308e656f336f1da4e7fb89b74ce95dfd5c772b5abf31ff3ce84c297c3fe58ae467225314c37a27eb43f0df947b8baa3cd38b6c5dbfe5a99cc35b9637febeea82c5fc3ab3c9db9cc959eb6095c499a2377a698b5b77799b2edd413ddc258d48e879debf267cb02fe7d335bbf4406463ed9c6576be0ba16622c888517579d691f9604bdbdfe8f84361e83b71e4ce424557efafd2986bc238c85d3ae443bfe9b8e7d51e84ac6ecfa833aeffdeb23472a856b3056cd5b38dc3f395f2b2370df87528286d2d64bc034bf6b1a7dc9c90df1d42ce5746e90db9a5ba1a87afe9575e89e8e502382d9f763bc3c5b7313c8539564df19c1debbdff7ac7d3c48981e5ab3179ec0a52c48197ee45658e668ba861204e1b79cf1a695d5335b8f4519c7bab53328b7d0763a6d95163f75ecfba489ccf92cb2ed1b72f2e9d4a54c35aa0c8397cbd6cd676b28cb6d1e4450265dc9d259a05214f72b93600b19f44423a63b4c753b69529d2b3d171e4a846f73fd8dff17fcc046e7f05e47c0903541f519641a8e576409a35feaee3e76ccec9ed9ef4463394f4aa13a741b38acfeb9ea1c4795936df6801c4c929171c164522aa3ac2361b8c80b8cd3e644f7d169f9a20380bc575968901ed7783b6969c57461dd879d4781bda106a913c629be512788d4c1f92a71f9f819ab7207d1a65499e061c5e0447360b4e70503bd58511e4c3333556b75f6a8945b8661d0572c764c82ca70ec870ccde0cc5810b816c10a46491e091c75f8b24eb975867e179d38345bdedc627a725b4d732b7b453d9b15710fe7afbc55beb26c77e9e8a58bfa764fa430f1901928fa4ea1eabe2ee827d44191708310b5e708dea4c5242a8949f658b548a2ad1badb9a6322c56697b513bc1c29872b56fe1e32d9271b44ea0b43bb896ca9a7358f45e1f1821fcb361c6ea91abca91ce95a75588402d1217d1e37a80b3c880aa83c31c5683783e3bc77bc231afc0172beb9957fd7228d8589bc171a2fe24757400cc7e9cab13d90a2cc12b771725e0f2180acc221fe5879a317fb93a10682044d6e22ac67c0722c1062ee70959333c08aaa16bd9cc1b624405f40b78411baf7bcb4af46b80ab021d7c8a02ec8d0417b759cb2dce94409be96f5b5abd1e207a9b906c71c18c763414b2d48d77c19d8e617dc4e41c3328ae39c18aa9aca985964597686c919584114c4b2429308e123fbe9a8fb86327054817bca07df8c7adb4e2a941742395cb6ea24c6106eb95cc0868f8a6452efc5aed297d933919b39a8da93137925b87ada9a5cbfc5a541c2395bbca59f95ab2c4a5352831f0d143dac60b418c2051390396326d49e27b7b6159c43b5de3e40d05956dab59088f417302588e38c1a21261c62abc8891e44ec4c7395421ac09e1b448bc2349dc88c571c74e470474935ec58001be48b854a13d9855b8c87131985c91484a695ce9931267c1d0d0b9ceb4bc7c4a11676c267958566d59431a630d4ecaa8beb98bafd22172a30e14c9acdba26922f0aae067c9a0e9b658630873139b9555b63a73bf8c65319d9423d4a927abe86a95b383a7c0c8c54170dcc70a535b1fd814cb6c87900ea94eed7b51cba571dc7b5e6370bf4928bbb27b1f66d770e43cbbf3ec0c615521e2b8adddb42971a12db3a208f6b690289b059913760471367b4154113c14606c046a9591aa744683c4024b857293eb0e02ec7c75270c571248c0aacfa7e47a35e72157877847db1efd73c0922cb211c4538d018c05382e9c97c3d98cb375f78d056196466519baf3312559315796ce3504731e811432a83294d75d8365391fb348f0136a7fd90921fc3844f57d286845d6d663e855b50d884f511a2020b09048298dc4da2be4a8398d260ca4735d84f2b66b2405d48032cf3174fb36b325e723af241d280863b4d2099fb429c0414433786d33f880d7a15d3fe019e75861c7836490ca2a5b0771ecf904f794c746b4244d99226899c847814967454d7a4aa0fa743e2d2838bc9461446b61d9b006b4240098f37021c7631131a84bd75d33374b9067aff5e900c4d0490995875606a7baf87b8f4960dc84a7eba96f4055ab6043c9fab61fbed883705893aa89899ab975284867f63035a392902a779c8df9cc63a1b944943691b770a9646cc731a93f6cb3dc3b183b71429770032d08a778217f9b72bb16ca81f07c66d436396038372aeb8edc031083d95399084751bb9f3d32490393b510796c16c630cd2d7e0666cab62b5d904befe6e93d8e755292fa875609f2f63bd194c87e6f04db7c83d8bb1b9d868bb7796590a2e5c7ed86cf2c5c2a898662bc9a81418720bbb632ef9cf0b845ed052d73 +ciphertext: 6aa845cf5cc8f06368e022af35d4fb1ffd740c05adccdb4f92b1f2b77b27a219dbf3e898d79dfd01d8bb73b1a9031028ba2d3ee9e02a2237bb106d1ebc05495c547fd93db7d3ca9b508a75525b13c5ede34944e8931b1c1b60329b96b49a080520442fadef089077289e7cf0570947f927449dd90c296a95306a6de4d801c06801117237feb842bb4cc9941a578fc6b06ca2763ec5f24ed083fdfaaa2bf77aaac924e1c4add5721bc9f23f918eeea2657f0e65f16f9c504282c18f588c6bcf684cf742acc6a96e33fc6bc100026753e9ffba26b4d73c915715a2827e92e19ecebb973f8fa664da4b6b464cee0024b05c3af87e28718eac5074e66992974bcddae43bb552d4be86650fa879dced0617f869a8b9933b0fdc7589c1d5125d58eaca6661d6a3d38d436a55e7aa6735514ada503df971ca3a507ba6c515b58214cdf146aef335f6e8427d794d576f9bfa677358dfe57663b0e1c5dd762bca16bef9d94fc8663c66d4465aeb8196ff85365cfb2c9b1315c2b444e5df7c710c68b08112aeb209cf8d166b9a7920005191a2530b8a8705e4b8ad5a913c08e2b68891583817bc0fb7c8bc0ab700275b81f32ebe4ae4c3c360ae7a0bfc60f3400fc1cd4b3da233476147790c8a63fd8c1d5be09bb516ac4ced4d6661897320186d7d150af8077db1d524444aee7cd374aaab5439621e0c4b5f72290dc24116afa792a332102a671547d38f9b93078be4ac7f3dd35c1eee5414a57db7a4187a6e3125142c81474c4deb9829f704835a4efc214184b1c88213e39ca70af72fb5e7d5ea58b43e829ed2b944787eaffcaf0ca13318a0d2c94cc6eca65d25d3c55038e270ffcc4069102acea6c5e6ec8de8b7c76e871dfd8b1c9a235d1bd2060e26c5a8fd13fb3017ea1fbfa72c608632abfcab1dad682adb2819dea4c7363c9ce3e1a117776712d2884968d9b56173e1fe46f8cb83a027e39693a036b749532320a9e5fad26dc90e91b44c53cf041dac798ebfa1a5cb444ee782d4788ab24880a6577398424d348ecdc45242b46b299840a9b01e11746eed2f975dd58cca828ba746764c5d1cb3a392eab866239a553c52e0e72e88bbe8063876c98d38956ac1ef62763acec6f8ed9ae6546c145090cd990149b7c57fe84ea4657310486e73d85d3f78cf82ef923685042f1c6cef7c7bbd53c809fb8bb535a3ed305c23810ba2a4f9f63da4b7a4cb45599869b57e4f4fcaa3db95be0ed98ac715a564f31c99aabcd8a37d2ec38ef929a15ffd16ec33afc8d7e5c6cae3b8cda327fdaf7bef466a24cf7ab348f798fd8a9e12e9a4d21a34f373b60926b7582d504071e0735affd8d41287ca37e152fb4bb2bd335f64d8372bc4a6ffd472849d7db497f1052599e7eb7a5acd0042e473d303dbd86241966d6990ed019b1d1000a592397495e1e599f15cee611ffbc9ed50af3f29a9d4b27ae92004ff02c0b37fdc04db01e0a07bcad738d73845074bb05b5952c701c5b1eb6a2af17ad5d20c1beb910fbe0c21d0c5eab751bb6d725d +result: fail +shared_secret: + +# Private key not reduced +private_key: 0ff7eced368f0f36b7b9febe490fab897c891a6e7030a5381945883b69ba1b456a2704c52d4af4a3dc3e8c35c09655cfd7cfc0f14489a1ebda991cbcfda5b52e7d8fe41ff9c37facdaa3b7577cae68845776579acf0e7b2d1ee2adcc57ce49f65efbdc5b2585ef868b6bb56a74089fe2373294298809e8f0499342c7fc5343b8549303df773668c89daa55234ae8af30fe2cabed5a55d4699b6e24e55f5793300676534cf3105f9f8c86fff16fdddb9b78895cf4128eb69cbd9e3f7645391367499c707cb4454353b8f6d86fefd8a3384bd0d45d89d6b6fbe348645d9cd3d5f8e5810894b0e962e1c5303fa5580b8483b8556f55b6fd49da3257f63e03533c10b74190134f1cf3530d0f5bb00358976f8927e8c3c926b27bcd5265ec90da93310433fb0eaca457d9e31fa5d6a05de41dc8f39c483cfcdcf6a204f05b7533bdcf6f4bee3ebd26986227bc460ea3f5d74d11da48bf1336a8483678a4be53154bcbc6fd609733fa678fc2f946ca4c5de03741ad6b5becba4a9688c455d8eb4ab5f8c35e5c9cd33c2d17ec1cd96b5b483797e9616b43bbef7fd88e5987ecfbea7c4fe7a31c37494568b40b453147644ff6b199465267aee342b3cc7026b62338413827b51bae6ea0066c0f5ff8d0887775b89c4858a46f0e8e5368ccdbdff4bb7ddec93f9b0a85e50c8fb51fdc5eedcacb9589c870b48f02338dd3bb99501a6c668dba52dc4f98b66564736c3f9ba887fbd351c6ddf64d57245c8098dc440e86e00d4a4d572a7f3408de584f83404ea3bba5d835a8d1ed187b2e94a9757fc9da7374d33ab4be4f5c769fcd0fbe55f1e9dff2ad3867599fa4c693482f33f2f8c5cf86c89be5921f6d7567dff6c515cc27447d7c6970eee68520fd6238ca9b8b28d58f7735769db6e88b5cdd3ceca7e477b26af1b2a586ba33ed003f8f973ae806bf80df4445545a8c884d53f84db4637f5007748dea3866df03c1b68b4d3eab9984837f0958a905fae4404aef135c4eaf2f99acbc5986ecdcabf3ede5459188365bb20aa917894967b39d535b5a022c5f2e0fcf653eafff02b9a62e62632f49871b537f1dcb53bae4d40eb0ab23f16528893b08bdf9145bc56451fd35edd0b9f63583d38619d9a2ee32ffb5828885feb9cb562969e247d3456123f79cb9fdce47ff877a42803cedcefe75c2ece59a18fc0737e22618761d667b81af72244ac8b34b56004580627ba26174984acda5986494ba95edccbdbec8a75b1355656b8f4a6f37bce21cbeb1f5a370be639ee743fbeece0cebb974dfa0e6bcd24f434fac8882725e46a6ddcf3f3ac4a6374a672b3dcd2fff2ccc37d4d8a60fe34614efb5f828674d9fe6ebfd40303e9e3fbcc1bca6f0ca698b439fe312289a306ee7347eeac46bdd1354b7fd8e5afbdc7ad8bbe4f1e43f7ff73eb626944ba7d4412e761d45f468cb334e1abee2e7a7d07751a34b35caff492f258791763be524a00e37a3cbe3ec8647ecfc7e388fea7e67a85c3914892e2e6aec165eeeed3cd12f33a5c97af27c5ee12e9c8fea7364933fdb6fa3703ad5c207527d79a4aa54f77e3ac03874c14588bc6003fc5c06d327de5377884c1b47f72507915fe97be0c4aa282560ba6bfddaf0b0019241e200929c660cf7770e111043c8dc4af1014f7ceba48a445815408b2823666c6b40684616d823c86787a412c26e521ac8c16868d7eb5646909027820444b8bff59ab46086631d5a0761a75a79d76468b74fd8c20cb9784929f2a78ad1882a094619325cdfd05de5a30d622551c840ac79b0b5b7a513f702cf58333f8b0382ce055a4c138c80764b8f882cf14324015212034581b2876efbc3ae9687cdd7f2acb964cc18ba90005730d55673bd519be3173d3e231166c7ac0193a4fd26085bcc6607d4a6f73367efb5ac1a1a063fac0207766da41901b8a61ec7e45bcdb73584b5891ef112251a84e9c07ae7c16f52362cef10aa3cd69927db4175ba47e225a220dc2653a58dc9854210087ecc2486ab13408f92bf902635d2ac331ec1c95402bb55b73b5cf063d3885fd1874d5b03100a993eaca11e978393ff33a31b6a98f72479ad9b88d3d1395c2726ed285b793c489e09a8a7bc744b361ec87427c399290d092a1d58a5007ab2209044895941088a81b1b44175ba3e7b038ed17b1b0cd5bbdd1bbea3f58812a51ae58216b1c18907f131a80897353a328435b927d377a45a6be2310cb22076cc428371d4b772ebcead61c765c875312cc91e73b20be811706caa4b52b089ea1e43d7b61cf4b705c1b7b3739fb92c53268a685c03723b4bc316f679f4d8b87375a4188382e711b1911502e502a3f523bd5531b30298815717ce2211283cd675ef106ac5d4c37a6809d7e3bf3e3c40c6c5092c34198659849713c090db27c78689c6d57ddc90c04bf1af5cd56b11c013ee7126958aba8ba7284ed58828f1384786379eb0bb2b8c50a504a3b0fb83eb5964ed6c20b908731ca5c13d980d9a1c0af7c7527da50262c65f7c2132355aacebc1ae5fa7059e7310d6d95da97871c50a17c0d1c68dcb6bd7a9a697b9bd9bf15a643748c83bc8b244058f0c93e7d1a99111ac6f046a5cd1713d977650935ca5925d6e10c84c7ac692527e27c8465ea46fce97c64dc66eb1110188c7a3afbc94c1423a845b3530e35540805c881b999a6b28ef185273e584b9acaf26746829fc6b1c88ac03578f98e71b67f5101de2233c841d2f303c52a500b3d1bbca883fe49b5a233b270bdca755658448666dff384efc9cb26a664106c49aa46c4237d9ae0ef37df159a0c9e880d7247566113c12bc4451f4c6b4946cf76c7b57f737032741a3047934b09e697acb2210b05b17047ea8a460e4cd9e7068b4202a8912812a04286208202de04d0c91b9d62992de76497dd0986917592e9902f33c4999916576eca4bc8495fc7233ea94671a3588adba1355804f1c475ebd788d683967aaf9b07a3cc9ec4c2c91a61e0456c18dda1a238132d2eabff8002c0ea6ad88d3ae3f4769e298aaf954550fa3cf86944184da2cc7303f1be393b6580cdc1a0e55bc3be7300166d570fc4b8644156cfd6c8975c29059c7a550d4b63d242b3e11b887a31bf764a911ac62801a6845d6589b0acc55e4c80cb37a3784ab8c048abe21204b152069fba2d6b75cad8ab3f133678889a99d346e3b49c0c41147deaac27bfb7c8aa3810e3b74bc0b205f02753a48457bd4b7b624a3fba1443217a88c65c5f63a0793951666453692c56b790391a7c9297e5224771c7a441d5363741dce698c33558c584f87ada29bf78a689417b645fe127d124339422be80a993e623d13bc59f3406a6fb6591121e25d64010c25a18676033e1d7278ac5f2d0b43a31f3a4156ae710465 +ciphertext: ad805761011ebcebc43ee0c2d4dd21a0b6ec492ea384e8112c989442a37034525a90bcb6873464137955f8b8e41189fd97c281236242b48028f6a76c0732efdb86e30a449b895b75f9ca822cbcba38abd856a21cd65685abb38d5260183e52e69f696fe09439dd3e34148c9df57482b55d5ad6993c1a83876bcd4baa2dd542f3683c2c8d62db6268947aac07d6642cb09984ea122072c8fe2869e5045d30bff4f0caf63b1d51150003c459916ca2c590905aadf0dc742a2e7f4da143bebd6ccd55db94642ca09a3e62246a3a72399193e5f925a643c75bc0c7cfbed989c448d5e000d4e433162785d2b95c7e7bde8f5b4975dc8b16f236e1f8118c130dea5fdebfceab87582eebb27fe46f313fbeb5c8df0ea6ee306e7718bef06615e624e1880ab21c3cfbb53fe3fe9809e50d8480e6f9752478109e2e736fd3fac84d9b8206c40eb17b9d4c5780bb8f5fb5839cf7d3790059b63beae82c8d1af8477544710d38db1e0fe2beaae07334684526d4f5386ca5b7b4416150c2e928c015d4c5f03b1c95eb12056152bb712aafa12b1af1d252f2eb1a65df5b71292780efc41de0b4d49ecfd2de375d2550aa1f6844b06ac59b8525d4a902177279fe435ab7e36dea4ef0bb969fc5e91a6a27aca3b6abc9992aa485e80ff8103ecde1fbaca9c55dc0c90e119c81d6a737ed1c46b46fd6e5c4c424913a6553baac92612dad26ec382485a6b03be0174c2ad6f73fa111e0a6a212834b5cb644aea780b18d7ec85deca92c93776572ec1a188d6c912337b2c3d136baeb6660d12007ebc17755df4e07758a89151248b4d700336c5cafe3515484dfc9a7eae2f283f87b474d18a9d25a97a4ee564f9459a0d93452b0bcd3de0ed8b6bfac875638d80bfc1c734d8c9a203844dd30f0a352f889259684d1ef983ce65738683135afb28a74346c4b225893c4148fbb1593efd3a3c297e2fc912ea5a91cca050bf2329d3c181afc83809a5d73a8be85346771ad94080aa694a2d6fdd9d3a04d6ebb0eae3840e96c78fec095d58dde728e1c04d2f067e2832af5b1fa21bfe97e6e58d980bbddbbf7aee88f2560da4bcd5804008f7be7275eb5eebeb5bf1374bd4d72ab894b0ce892d71397ffb0f6b053af026377a192089e8f64790c178cae6e15e213957f7ba3515c3a001b1e72288828433624bdcd49cc2be5cbfa9388fb1a39312a391abe6d870f377c1c166c5f1c0f92cfac3c2a7c2bad2d1897c592a25cebb15425e9e23cdce8e0276c2aad0ad092916225c39f7d94f9432cf1622a5c3a8cc4a457d3e17358cf171a7bdca13512ed376911312efd62167896a0027e3d727c2d6284dede2dc0c3ca3e7609495f12c2204ece6e512f17af6d9391997c5b0f0c15bf9975b38c770d466919a232f66b5a376870ec57abfb6e23213ecc203f6c426a04125c61b4316f5ef9231e4789d8b20840bbd2d4141a9a7be879320616eeac398ca8b76aa95af7cc0743a3a2f2c1a116c536e7547bc93169e11c66fc5d4ed7a704582ed38ae2660d37e0dc +result: fail +shared_secret: + +# Private key not reduced +private_key: 3947d43e6ea4126a8c1bfdeab274b31b94f4ed88cd191df9be89cf1ea58b2a73f5ffe8627b7bc4e3e8a4b3d6dfc42573225946cb5dd235bb54494a386eeaae44f7bb8896c4f14d83621dc4b57969861d8d116a76e05c984c0bfb927d811e7cb4c42ae2e47deba0bf4bbd3cc0133cf2d814bb99fd49a9ce55e39cf42d2e56c9bd58eac343c78be1f65dc52fafd7a36fe3b40648fd7d872ed8c051afdc4c078a9b4576b619d9bce496299e68115af4111b7d160edd06d7b719ac4c497f756d86d97023fbf16bd8972c78f5fea5a7ae5365cdaca1c4721b3c82777878a96eb751aba6a1eb75172c952c0e7ed03c900764e110a935208bd37ab7f96e73b998597240c6d115333e50cadc6b837c4dff6a027470770358a537481675a7fb7cccba0ece7836b75c1edfd687691e96487beaf664756fd6057ffc2fff6abf6e3fb3ba2625b9fd9c41f4887cd11f4df978bdc27bdc6f4bdf9416c38c2e45361343c3ffb752c7a885586e4ac9955f09f5d2365848dffe06c6556b7858f0d9318c037e03536ce9c5a1632d967bcec55e6c61f00a59034ffc8b35bd1a0d42435f49f54a322909d554bd942aa9a3205fe46305e5dc74d24d66e6e653c9e94bbae8f8ffa914863338c65413a33f6fd243f92f1c3a888eb8e21be984b4e4cfd18f85e904c34465bc1477cef53757b20f5b10d454150aff57a3eecae3d1929437b847e46fca44531eb5719a933714a1c2abeeb52a3bb376d3c17fb4ee0b4776de7b7af9c604a8f5e2b654e1c4bdd8e56f5324d6cd5f97d2cafcbf19b8c43835d2ce84eaa661d9c9da6e99854787c82d53b794d8624d34d6e57693143736bb44f84608c8b20a9d99695d8f87ae57c83d096ae06e793fb83f5b80fbf6c8cc345fafb17ed66e3d437632bde8a2c8bb7cbc42761b95f35d8f9283fbfcf9343c4ac48a935fd936dae0463bdfa69120ea90f3e9909b2541da035170affe1e58411d14926875f9cb13de1c9846f63abd6ae9a781853bd03eaf495acf79a4976783eebb2ea3413e40a707c1074f5c5b0afda336f47515b229eac44acde2270bec228c863783fd818c6579e4a5f0189a23793f8e39c1cae4daa70a3c6db8707aa76831ecf6a456f87d8a4e45fceff7fbd0782596f7a7aeed63d7e5c84039c4f31ca6609a1fc6e4f7edada3d12b2e800914997f99970489380f1fbe57979cb6e49861c9605e0fa14727a17e286b418ef23324ee2fd5b3844d33e3cfe5ef44aa763fd1a65334ad2f3818ef90d2d5d339af681d298061586ad70486287d867b0493d0a4ec4925acda9b4185b64589ef5f1015705a885faa0be618b7dab415cab52af5e313964403f01bccdab9573bf73f30ac1f5891d58143ea8bcb858c763ee00ff581ec7a97b45ebbcf5b416103e51ae789877e3d5cce5a58ed7f2bbb8245ceed82ad804a18ae641d4bf75c75607daa758997243e54bfa942a57f77f02db312a68e973def227a908dd7bc03ee9391f73825dc44cd258b707b6da20ca56a2b32c13df308357e48945d79a38c067df720fdab2e9ceaf246940a797cf00e8b62873474a38a5a6ef7c026699e6f5ebf0774335bda953881fcceb0f5c472f549818d44b63ea59541b8f6c49754936e35670855bcfa888f30a50035208f5a75de6a8e3799cc4afaa7aee007788547e7b79c7507bed6a8522be18743c101463c9d0c28328a68b0d3ec380d04a20a31ab8ce6465e5aab4e2332f30870c5024718b1412c13b7094228e6f3a1a32440edba8f5ca66d968961a3f28705b9778713cd96974e42a50ee9eb61eba399cbcbccfc8786f7963c15d61ef8d194ccf37db2e16a31cb57ba79c9aa4a5da2593eb56c29498ab66f370d7b76971f797f9cd38ac3262226a64f91e03a1119b8eea00c103358572a1f4ab68f8eb4a5f889540913b23ff11768200694597d19218a2c30c3c25829467ac2d1b67f85d37522b22e7e44b950d152a8e087a3a35e3eb1c41fb15c7fc264c39272f01a0a2a91324a1ccbec627fa1ac81edb30ce0f84a727b36a4f9015a25ac67e3c76629c2347c2478d61b42bc413f6920f7b6774542bf25b92a7715745120ac1c4226e3b623860b4a42566829317e09d5868719a1e9babffba9517ac95a7c020882939cca54005f94791f37093eab5f2d15c1e7a09b9ec7b3738a197977c3ca0baf9f093271d00387841f2ab98c9cb16f19272d5e4b8d15e69da97517cf833475336d8850b5c3c87e4ef2c526b95e75060dc52c0292eb69e3f04294c854bfaa0f0fd5432dac0fbd03414b5a4a3b7c7cf36906fee8be6479c193b7336f4c870aca768d3ac2d84234b330a1f160b105214d469c8c1529bf31b3aac01a3ee1e231f389a27d4340b35a463ad002a7f8327dd5abed8b4256e87129b1be8ac475c32b97d11397db247a019533acb1a61c15b9aa4bc91d45af064a608b1926c93acb18b7c75d9798569a89a78463b51b5bbf038dae3c5cd133690ae80c1ad4541267bc10c83343a12439d6844b931a1cc79a0b5090214ca721f61e633600e8f76db52274c6c736e4c8b63089014a4012015522a9385f863507b1f1cc7c814cb47b00395724d601ad7bb27e4b0c43deab0664cc858d4a74576642eab3c76c211a58274e14f615ffe70084d7b7c0189d4d97a927a8b008b85888c57a0f6a307234344a5960836cbf6f4473ad988429a4ae3ba697bf07429d17c059a65d9e35a845735ba0a58e989307376c1e61f33023221a6611ca0465be5200363d49c53cd44b003307e5cc0c4f7b15e1545c72a7c3410ba1bebc8f7314b3b9d295c676bfe6aba9848554fdec9192f808329c60a793754bd6256cd030da12bce0d0765e51548aab0985ac86d1537ba49635641b3a26c05def260e94593b2e0558567c5da09b2cb122655bc4cd3e985eeda6c3f4322765e6a808ca387cc369dc11c9dfab64d4a30584e5329c905dc480801dd57d9ac8ab4087967177cb3163cf3e934a951a3e248a54cb922b6ca6ce9b4cb8bd788023e6425e75aedcc135cd3c59920c5ed0356fc0fb5a1ec0035b7c8271726dc8d63dbab3c78326a26c5b0f9f952cde7373aeca36cf6a438fb39c38a56124171593ea3bb076320bc8b5e74204777b7120ba97c3e803560605cf80c39324a0e3045d0f687e8f219a2ce70aac209b86d869febc5b51398341827204ac584c6b3381471937e68efbe5866a8569838251171647b4127514db9b84482d5b9a89119761c7f6508a099961376d6ae3706f6ca1c7c031f430190d6231425b14c6544cabe8701f8e475892fe31b587aa42d334fd189bdf0c87bedd5c16c32cc3867910f734bdcf09869c7604a59ce36660074f561e12da76eae84d11c4528382828f7a689a0d5cff87b8ca0bba97feacb39b935a8788cb +ciphertext: ff7b85d93c35347d0e98aa40f91253ba6c73520292eb3dfeccc37dac0112164fcc457e45f12e39aa2f7b94cb5e4038d229211c25cccaeebd8e7e08918d38b7cc302bb2015fd62a3b1fe6c56fab9294b926e425b6f8b049e8f3fccb7a6e4115df6c4ff9e8a9cef2ec7c7a03153f922ad5d85c6700092f131d7d88efcc76719ca35837678ba1781fe5ed8a106e1b37a5d5fb139d8fded8f980a64d54194ffd6d283d949973037261f7eeeef74ffa7795c7a47c8508dacd6dd346cbbd6bc2c6f978539132cb2a4c6f4e541cad9861f9069a810b3a465eb8f85b615aadc15305f7693b7188c9e486ab742bc024d7f8655ea08ec3d731c131da78251347eed4549cc36d510e9e6c761e4d30407e25664c9c6d1ac565f93216b99233da67132258fff4aaf0c9c2665a9afdc7c904404ce24c5a17a619a8c7120b43ae3f53a0da30caaec6d935e93d6f949292db368bf430a5891834558c978d23f2fccbe45d63c69dca748dfdbd05c72a9e116c2a5519c22d1ce1edd151e45c249d3660840381a3a27e9bdfd56479c31fc4fdeee7c2475d8aed29c8bdae54add3c2d91033f6d7a0ea2de783813b332bf3f2088df7111535768b8de8461eec59401484f404e59ea769b107b7ea6d9fbca55400ea73275a68ff616006c3000b7111cf85c96203e1286f6dba554f06b104295ecd4d78b4af5bed95a5ed586518e4e213c7cb61784a054f6098bc6594de6b34a099dc2999e726377eeee7f0b2fd02a718d0a605ef67d5cfcfb93b14f7a340140c02e1b843498378ca0beaefea89668dc03316c14da4cf3ce86da691d098e5d318b9095a2eee24c782e9f3576521c027ed063991544e8c65e6fa0a6edf25666a81223b9976651ca614939bf75c1586d586a6bf8429e7f174867acf873cbb6b6393d21b621005cbfaeff15f22b383de2ce9e2af54927b53ba29e406869f0b6bc172825e839459cd7420d05441f6b36541cbe9c46639b2d6f00867af7ae3cde974c00caa724fe3b48c928649e66e3792fbd5330cb6691f442617e63e0aa535952984373fd1f1016bd37de960065604b47ee621a8301fa5c087d2f4f5951b6eeda95e4065413da627b4aae73446c59044eddecd906c101efab00792026e706ecfb33615486623643e8ef5bd29e210bc2e1574adaf02766c62ad6f526b5a33836f2034ad787e9264abdfd068b5be29744d4fb3e4151494cdf007317bb161658e7e37b8994904de17acc7548fc02f08aadfa0522d441e1dd79f97a40c231baada2376197171a59812b4282ac111ffa4dd04f1c117815a965ef74de935ffd96fafa491f496b7648dcf365c18e8041c16b5068bc824474e0843201c84e538f6f9397a816124e3d58ac92081b4e13f55c95d8e0f1ca0de2218537ff4e677afd867a93ff339f10ebe8fc0456d9e7e8c5e2dbf6775606d8d6c946146340cdefe90c98145fddfc1ab102e8867e476645c693e8907c07508c433870eba5e466588289dc942bfd1091980c9c1e83d07f31dc493051923d9ffe9296570810106 +result: fail +shared_secret: + +# Private key not reduced +private_key: e39d3dee4e36ae2736d2f6522417953c157750debf926db6554bda6f98e0e32d8a9205833c5479562ac268b6618787c4859838021aecf3de6d7f8cce4f18872d2d70362f463ae5c2cdeb4952d579aacf726783562364cf8d86cd1254c76ce667e06e55ddeca45735d62417f3ec8561d7c65ff963e58ef4cb3be6ce823c5501db9e29d8c1fc23327b14d67f755b87d984348acb363bf2ce4e6d754b82e52483d8cb422eba4ba8e649faf56f30586f09d4acac0c3007ec6ca183feaf7dfa004b58368785326bd6134e56249bf2d6a8d6b7bf947a75cb16c8f4d35c7ec26a7a682fc4fb36a5aa538c16e4b6d366344d049b36e53a6a9de77f3989c41ef93d3450c9efabdcce86972990dd933f9cba7ba327e7bd4ef6d1aadfc4dd90ba37c447db6143b63383745c866371c436e71b667096e46e0c2942d40b4ac3fd8f49be36ef09c82eb5bdb13a514886f74ccfdc6c4da601decfa0a8b29ddbcfaca547d178d067786d6f5da64c7d546ae3af5255ea090f8976ba78b9275a2c1ee859edcac0fe49f7854abd2b390d28a661c7a871467a2603c5ce29866849f08b53867156e8b7bfd130efb4b9753c8e2ebbe74c47804f7e7228e989dda095ce5a9c24a7eab46be919a71fe6d879a67480178453f4aed9b63c1114dd3713f2d43b4077e74d8f8966329d42c9559b021cccdb0874009d61e3a3970c14b34a28dce0eda2f9d5bf60954cb79b5b69169598fc88aaceeea1287a8cc88f877659577433a98ce6af3ca892e4dcdba76430cf4f259ad207da5e818580694582b7b7982a7bbb5df7e4e84f5b765faeb3a4d37827a98e765d974edd5014a7e69b3db3b6797be6d650e36e1ecbd342a77576f496a7255d936c5eab1ba3d9fb57d733d5272a5e567c621746720878cdab13a9f6bdafa62dea6f7b844bfebbf76dc5852d5bcedbf2a74b79c5b4302f29bbc60fb4a3c985478fc8b123a33d949d878b4ae609ac5386ab5896ae2b877338c3f00e68ff34fa450adbb2759df96b0bc6e0e73c2fceb633f56d1b8a54ea65ab7cc6fe5e5afc4f8fa957194322eebb3a4e3c3a9db74b54ce224dd8989e46c483d1e3c8489b257be7b5dae6d39a5cbcedafe4eef2b9eb54756779e5a8e5ab79ce58eef908d295ba808769a159edb48c5f669d0e980348d42d2a5e2146f7048f7ad9433cfcf6e91c7c737deb92cb3d53eab8dd9d9f34f557e5b42de3cde3eafa49a24993669adb72ced3c7e4ddfc76aab8ba56a29686a115f4b36dfbffe00bb42cbb6ba8b8f5d9888f6347a6e61a7893ed6c8ff9b8fc0ef80e0fbedde4f68fe4615f9994ef8b93c96e5b6a63c9b4d752a46c51ebe9c4d98ce610af7f8cc6faa22344f14339875b6d10afd875c3b831186ee7fd4c745756d57b875098a560ceb060f353f606bb073690546769dd6e600a77ecac18b563aca5e6a8a887eb76bf88a33e8e4ce903feb7cb5cc4de6636493421fbc550ac90a4b99611b39cf08f8dbf056c105d43be9bd03e36d611ff7a5aaf765d57a13e2f81d79d4526b93d7745b4f8b98085397688ab559d073f897e6dfe5a39d09975df1d7a3e6c68ee17b3b63a9b10ea6f463ebdb627bb07494f289d52cbdad4722bcc0014bb39a3f19236397dc26db4f73dd1859b06a852e89a4845a0943e5513e8a056ddcc2623034a4ef251e607268997b7e90471d5d0cfba5639da844f0c9a7227c8a22a83b9e805942b67019ebc45502c22d369abbe52a9aa6cbef78ab914337375d9c075854bc9a3484a0995a239121d918aa64b2ad76c6873790211162509ca2347366d8163803c3433d32068d0f8b64cf38c2370a3546083ed45716dbca7ceea50207736fa51c062a6a15ab8c124ab6b00334e03808c858ab4b20a368df787cde92169aa4100a2adbb4699510753b80a63b492c51f43a81be012fa13405ccbb0dcf1166ef55f450781244420a0ac9301d485ab561b9ab67f5805afff924c1f43a5b1628f60baca631931bfc6c9bb04d0fb3727d7ab6bcd6cadffe84ca57851ee201f8153ae6d64c0d2aaa432baaa0539a17e731cf4360ee37c0e38e0cd77ca85e817a827173bd9c0ad253a44fb244f47f956146b4281109297b05a9320953c022024373d60701a68450cca32883848c4cff3c64f548cf7912ff61a11f06030c5eb29fbf8bdd2b16541fa85b8683493e8239e22c01383985aca367d6cba52c7808ff12b79976b794c70471ba5cc7908e4168d5c916605337f26199c34519236a855ef063423d7777631bddf164b2375098a25c9fbe9a7f9344ac12aa0b65a1380946560123f82e033fe33638788c82e7abf79b2c4df9c6da2f4301d70465a3c05e3a485a26a3b8d98674d91594f24761f1654580719260c4b409b2fcc418a24082a11140d043a6dea028dea1a51e9224fddaab5f3aa64564b3c336586dd8587442800ead481c9d27ef08908b938945b7204557c38aee2753709b68088684637bd39f1b78c6929c84873822caa30b2584a02c93b085380524405caa5d9147e6c837bf0ccb1aea19db39471d1a573fd893028479391680282922b11ab4d78b407f7d68eb89b615c32593f2207a4b017fd1cb922778ca806b305600546700d9ecc70ccf292ca7ca0ce6b6fc2a79731f6a9e8b83c9492381ad561f657192bb3867d3cc663bc5ffb48c997403b4814c915616d03ca71d0e8a93ef0acab8a55a61a6a58d22845e27d6c453b79391dbe02797d390e262a6be41cb564152768a5b1f2b7306872bc9dd63327e22e518082ad337f0eb8494ea23e7c730f48e94d21ca9ca3f660d4f960a6285f1e586d04120a083b814ec4229717b23b73c0c14aa6bd45294601bcaa89429814ad6e8a6190289758354043eb6d81842a6f332524da9e63dc7570865695c043c9eb9c5925bf4c4b15bee14aa58a09c4d37c822ba891f2626a414d01a10f9fbcbde5609bf4d982e23392a4cc16c461260bc518717584bfb96e6960b6d4b673f61663be1b2babe74d46494ca9576f3200ae3ca8a58de308d8e99b65384ccc30aa1669898722b1a76c87dcc276474a74c2985e746194844c0e98f811dec520bb54a1b4572b0c39ad04820f8ea878baa9caf03018d4a196c5363f55373ef5a98890c719b7a019d0eb023e319241081694e74bafda502529020a8b8f1590b73d1bc36ccbc8d4bb76c44361309977270231a51a7999e65b923b1200366ef381b8fcf8c4c5d3add0c465f7db79f7563dcc67940312ca49981581a798ae477915f078f11023c50efef1acf4f751801bfeaa5ef93fe27771a40a3d377f0f1b1655f6ed13320e9a9a59f83fc58d7194ccc92bd78a45f97f721a1eb554499d0e4d5b37aefc23a8fc9ebbe336dc464489861db8253606971bd0a9008a433ed17752d04023781552 +ciphertext: 5d1369e253686734a5e45c65a04129cc5fcc91ceb595fec77e2850088fe1084c3f2ab3587897c3658661e3cffe185f4a0433034b56aeaa430b5a898a1f682817c406e4219566235f78e8b4b6927e63b3fc55bfde580c381f74e4d8b708fda0156e9ba2bd0eba3927601879af7762a6362ce233b87ddc0c61870a75812aaf92ef6cfbeff50ba7dcd21f0ff403c15e6cd1be9dba02f3f426d935c13cc703766115018155648d8db45457bb17026af70212994a87fff10632249c3e87716cbd1d13d8817fe5aeb748aae801970d8b21a575bd1dff893432740d6edd652fedaa89cc026027f72d71946e67eded2b0e84dfc0e6e103d1c4dd1120be5b09980fa35ab88e5d5714739387d18aa80d1743579e220ca410f404513b8bae90d64751306e70b78de2838406dabbddad7bdb5668a180ba02c1d44c20d12402a49492b4a4eb26c9d091316c504ec7d726b904d333e6ae33b0adc8673f577d23962d1e3453560c7a07bdd400d60473b978f3a6860af623130a1a4673d3ac6d7658df376a8ce2a91dcca9026ab9d1789d35e89a05b3c298d308fe7f20bea5db11d68794f2721dedb3813d3e3c58b487ec1a44f65d80b11e0d73500ca06dad337fbe26bddfa3b72f674a608e8bf692bf122b624bb8c98cd9ac5890c774f558c2141155f658806111b4e645b07bd23260c2b8d4c88eb97b418f734fb0909a95819e74dced41551a5fc4f9743d19b66a4afda8e23d0f08caf69b4223286ee80da4ba6cc0a8071434823dabcd984b086c4b0b5d9c25bfbb7a80a3c65b4c246cc6304d7967f5c42068655f704ca329a0b671b58c93a8775d4884f0e8f8debc053a7e03338eb133870f7103a434f2f27132a0cb9bf2bc102d42394c08a621ae13cfad170969a9a8937f6bc519d5d467e63fbd98473c6db0582734c23c19cd6ac4d56e106a945ab75b23166325f33d198da7a4f7dd9ba4917da1365f248e237dbee6c19a5022ab62d86ebe2fb8ad0a35f838be5ae0184b13bbb36e8564979f6b0a6548004956cc49bc94a104a57a26b989df283e0e6ecf26f50e896183391760d757dc78d7eeec296378694343ca84b7fcf751e7dac4a889ed170928a60360a5fe2d979a766b146c2689f2299d9505fdc2f91369e4b58b432c346bf1a96d085e7a364f898bbbb258a0adddc46a4d126cdc89b6bf7674cd7e980e4cd7acb2220aa9b3adf1c9b89953825d9e1e503476a0865a66b44ca2efc23eaaacad5aa4c66b97bafd6cff9a73b1df12e92f02c6fe8402197da45798309800fb3911a8890e66cf4f094e0c0d7703d6600cb1ffb2c1dd43a9058175c86dbd0f3d6a0c29979c3b6278e2db8956ecb9aba710a5f1c90bfea10fc27a9603f8b4d289fc465f7276c8745d11855966f944c85a0ca16a004543ca7e7258f8bb975a3221d6805eadd906572f02b999e9d190c189c51523bb7c7cdcd813aaf116e813e1ea0ca8ae6c8a80d569e02ba2d666f54ae85f5cb1f22983783e9c1fbfbea8619a50578c43c2601efd0b46cb640947cf1e4406 +result: fail +shared_secret: + +# Private key not reduced +private_key: ebaadf5013d0253ddb530580651ee2b904c9190bcc0f7b6c9b17e086aba5031f517ec4d1a356cdbb8547b2ed6ceb0695f10fc99835e8e6258faaa84cb8bd885d1c9272bc8acfff94c2aaba89696e4569cf3493cd69ebdc9629c6af38fa6828a0dba65f1c38d2b07fbbfdeed2e9ec5396fd473d29b9bcd99d8d8d3aedea59aa6be1f7a8f30917c5197bfea9a950e3834e7f37fb8c6760b07c85980f5cf62b63922768d89955316cff379d7ecb89b97ebd98d7348b9643ba5668f915b9558fb5e9bb1530d7b846193ec99683ecfd2b4d46643c0de99c459b93289e73a83b423a073367ba8e7a9d4bb53e760b969a4b7b98f11ade60deaa75f5fb59fb9af51f3ad65b645afcd3c8efc35ebbd2e30eb92c266b98c5932ea3b6029345f108d95c955faeffc840cca34cd8d1ce48941588ecbfc598f1f39ca35df57a1ce73c7ed8482c9720f56afdff50c2d7d4c524f150fde55289470ea5470dcea4eb5c999bf8567d688d5a5afa7dcec3381c68bed9f5ac4efacf037113fa8c5cc43a75f3bafa3f672ecb3ed51fb17b65f03529e82985f5c5d352076ca04d2a3833e3d6a42eb9aabe564504b8e70aa8e9b9eef58dd1a42c66b33370db2ab3e9b43f32f9f6e7bce8935faf3c9ac7be5fdc35767e1b26b1628f3da4fbcfa21f32dfbee43718b6b9e6aad183311f756c05ce5e8df99bafc854e85e417c1aa5fd64623df434f2d7ddbd8ab6d41395cdf4814bc99ebe6cedd0777c7344c1504b7e2ff4b82d974e027ddd1293c5ec2a4b34fc895f6d8ad7b3fb2fa6cdefbfb2867a8aef27aae73ca70a5670c3857501f5c4231448a4e7b4aa9f6c1ffb58b0aa73706ceeb1f7d068d97de18be9a28e4c34d746570bb3d24fa6b7c49d52d78f501a6bfe37abdb29d5a40d77a22aeb0e6ae4f6784db99e97131e43b95ece1d975db405dbb75a8138f6da542cc41aaa6c566f6d81535045dda1865b4d6303c649b354561e440b4fdcf536dd0b95d41f7cf6f93ae3f01c77bca3357c26bd0eedd084a54ebeb7330f59683597bb743e82a4ec7b15e8656dda8bf0a8b38fc3632f0dbcf5938706c55d956f3ddadeebb67d36783593df9b85bd9b9b2c53dd94c73a53b65da10a614d93c6da7cbe89aad96ef3c608f747cb88f956dd402d9831b9889f6a87d8ffa7caf87a8dcb2ae8b74c363037c89057dd198d5befe3a0bf058e6495dd626e494804eb2f03446bc9c6d65750bb5fee2bb8510f2a878acfdae71ce3325dfa550480fad8c011494d7dcf5c573b4b23ba4c96f99abc5a6d8f0fea5284ba54678f1554324346fc6aeaaec39efe7648fdfa36c2b27d4dfb559a27d5b8f7469597af8c9e3bdd426aad0c57b2407346a6caf6779dcc903d857d2858aa5b97e296d17c494bcbf398ace755fb6bdd041aad180691c85994d43e616f9ea9bc4932122c35b55b8300264e5d3533f85e8c59c4cc4cdc5c3894b48f247b1433666efc9935fe8234535e18bb43b5ba5d9b6979bb14bb8e4d7d0e15704ac6cd1bea3466e4e363af61e9e3c4cb73b62579df1bf755db67ac5575f8700a78ca973391b34d448abe2bc96447dc8f96239e6d06c41dca9fe14f72e438b7437c6e0bbbd1797475adf9cf716430dc2b4a9bde6e790847ed9a831c0cc2acbaa793c41913a02db8ac1c6bf056573bb75e2990a6fcb732c3461ccb174dab8ea4c55781317e400ab4ef68138ff84c27fc0bc4c68e30eb664cc8bb32b617916c155d28a195fc39a1a0419af64a59c99664f744a375113228ba3730752ce5a06701112d7328649a3755b45ad6bc4bc0859feb014e185b2e18603ea0437b31432457b36d13a5ae96b03905bb2fd0d5377eb04f34a68c57448e7909cc660a31d9f9540af17324e4b31bf04f465665b5538f7351687f238d6c423c9237b5ca35618f092cf7da879d965b67b1cdb2467c9ef3862f260c04727594aa6286f4035f0b0eeeb4b141306cf7d9c4a6bb942b7a1e30b56ae958b16c3c1237603ae6f879dc9ca96a2439e26c0834369e8b041c6327254608ad3727cdf23b842a003b91d1aee60193ae1497d5b75e2a370147f052a08b1f86179bad52605df44f6c99c75df478017318c6ba017a1b4a8302888f495acf796e0745adb0292ea6b5526fe43f96e20d98fb756b2553a9493401d4a25b9bbac13b62967a228bb6446b2067063619af66383e6bc2b3d8cbb9e6969196bb45d665bce49284c5b50f934774d500c90134535930ad2169488c4ba8ac0854f36e085318a293bd65ea8e033c754ea44191d9ac8033c031e066b2021c13fa11a15222cab4829a5c47df7418761620aad92135169e0f008760ba30a289cd41f1325a4c90334978c5176cdc5496962443b118a641d6130baca422d89fac5c968adb461ab43729b6c9b1349e71116c0226b55fc00323d6a74c03282f24997949207d72ce58fa4d87a7413c3bbaeac91fb2131c418c11ba501701549efb25cdf560239223c90e1a2f99897fad594930848a1ba2494fa87bc03c57c7bc33463b77ef80b978724153a956779028b7a565c40144047747e124c7db801d309333d3150493c3b3ab68c34c939243454d90c3c4079174a8171c77a0b0c9e54277b5bbc5033eb1eba3cac86039492b4e75a23c8c51c88177edd639a55b56fc557b580b03935765cf586c95178c330319c70a8c15c95fc18a23da11798cf6c54f68bfb766a61a9c9c461b766b4a00608575c4309a621b28d27122cbbcc76c30a30286483ba85a68524c0e21591b7347a0ac0931e121eb3bb8d0fb7d9ec577a5821487619e196400c2169a42a71c7665505bf333ac70267bb50380b947ffd54745e41de5a30a27b78a62f43786ac88b2012de563cde100358065485a73505982a265a505ed85cadc02228ff90a03d088da7410c6179558d52ca36ba1d87353985189a709a1c0a7a10cd8513c4aa26d27cf802027aa8c5bb99c12a51b7f16e10838500132cc24d79c805cf11a5bac88c4bb0377ebcc4fe7c6ffb927ebe7234016bcc1765ae9e72e62d51f9cd91017f508ae207d181ab0c4dcc8d1c4742494876d118f40c84e2706914c65a161d184a5765aec67c9dcfa4bf3418e114c6f3cc34e94a149fc84b041853af9b213759cc5a181abd5641285613875367842f1a2549c09eb9b1dbd851365d58e6335c91ee7ade6c23135c1200cfc1de3f5cf6fd13967150f01053b943c3389bc4670da9857ccc32528920f781cbf16a9dde2299db9912e87321c02aac45c4820ba2e808666ee521dc4bed006527df29a124412a4a19aa26c09b490188ccba53900a2545022bda0815dd53b263afcc1f71d2501128c41fb3606af71c5e68f0752c6d3a479c5ff8563038aad865a817cab9ce98846ba75be9363718ecf5fea538aea90b2a558 +ciphertext: a38d892bddd188709af0e4b7ddf0672f8729ffcef2acf0be8fe4e246f83bf39ad529634a3720388c5e2295f5a071e27ed7d75d8932dd05e0182b92f98d16c4749e65d2aa96c6b45382d5c83cf6e37f30d395b289e11cfe8e108c50bb61c96749b2474492dbca1035f42dbf35f73e6d458151e37d1df2bd2d1e0965ff87f607897139450f4d17d4e13eb099c5c79cb2aaed233cc4c9eff06f38d2e910f648b07d5ceb12c30c7daaf85e3ec5906827e923658cae07f9b4e983b7d982c98fea5a3f46d5acb6bfec399e61fa7e2e64353c7ded3c7dd1d3b8bcebfe9a59c29f22d2e5dd29afcce64292480c6b6a7eb3a5f08abd7afa8641856ba7cb706355fdbfeb7db58f476a79138ffc03d945c5107a126233107fe54778e8aad57a905e97fcba09c242ee016dfab5fe3648e2dbbcf07b488e1f2d60da78307e3f9e318b7a8fc99cfbf67b3137afcae6bf9c1a7d005871bf59bca9ffed32467e04767b99b7e0e5f75c21f23c80ab76e0acde939500349e954578f0d7b0bb7972eb2e910e90fda97876d70886fdbbe3e6e4c04551eba13de33f9eb88fb9bb5c669743aa78450f658df9209e29a5d81e989aad45f006deca4c802366a18988a8f99481abccfd19da9879b702a7f6c4fe7b5aabb07e0958c4c5094ffbc0692abc928907283202e0fe512bd5fd78b49846b25f9a32a3d92d1125f9ba5620618ac27a25f6002990f6959e05658a2ab6fe88b6f055b47951fa9cdb27a8b6ff9dd69c30231c1751805ac7d98b00733ecc0309db2e856765ab9993d9d78bc10b0023b5ec237bc97bb944cd7de18e2fd0b1837f50109762c98e66859b4cf3d10a79e3a7b24f5b67e0385a68657f31d34b39f0c8c01135ac10ed79adbddb66f762ad4f20ae4d61b8b0e83d6f35f4fcf270b45364a459c9e276527365ec69bbf39c85ea8e8c24e7a6b5e4cba67fa8f476b8d57642cf1d6ffb1aee8bf475d66dd63c2d9141bc51d569037c0ae82638bbf9f5f66e04fbf21b8eb87c4ea2c701d05905441544d2934308ae1d22483e91e7fb9aa69ed86ad414764419781f249e215f4c3a273bb4b7ce2886f2ad8169f15c75705bed9ab8196700f5f10268c5d32790a8f0a26d5214151ffb62f1b3728279da8cedbfc9408a2b4811e408c5bb7b3ce1c01b8c22acc32796b5bf3963e8912dd997be5cb19c41a2861272efdc64bf799eb1e601c108e4394e8cf09137d58c34a2592a3fdcf2d969eed043518d17d8b160879c9afb8224dd0bd3d2840e833a908797b7038d250d18c3bdaad72496a5a445d1b36a165717f6af7f8b8b1919171d2e1c8365b94b23ea84a0344819c3828d8c8dba63046f15dd18f679a55f526e7ff78e066f4d06133957b73cb1e1660755229d3312a14a8f194dd0e10aabd845cf8f63c63e26360f30f1eabf02b05b20b3cb615083e6b1942e304893c308948e73084f5c88328f550ecb5f01bee599acc8db52f317f3d7790343b8a084e60926b785bf17863708b0d92a1bfb63a94cb97c8f9072965bbb84134ac114ffdfc6 +result: fail +shared_secret: + +# Private key not reduced +private_key: 879ae795956ec59daaff2e90fe2ad018c9b51fcaa6b98ce3da28a8c09a7fd04345960cf2d4e65bffffeefd03d159aaa51bc63c7d646f15feaa487540390e55b4f5efde096389c3a1b983373efd669553334da5ae1ea3d4619948cb85ad5bf4f19693d33e33ba100e750fd6fffe5331b4e3756e46cbca8bffa46cf6b8e6b81227e9a6655f0a5fb9df797717ca88bd79a769938ac2f68d4347baa9ecf908757e19157953cc952236e118155df994e9dd88556da6eef9855e20c86c461ecc774fc50bb4a35ac3de133b3548055c0ec585daeea3912f6749a739ebc5ca7834ae6776cdb6e461b5b736b128d6e5a5f1f11d543568ad18097e8654c4cb7c9366db7990439b94ad6e8349ea62c9dfa85adb8435d0cc5bba4505ab4106df8414768f0cedbaeeb8334869733e85aa6be41b94a21d276d3b769237e44f8ee373a869eba9f6ca2bc852056334e42beb3348c7687c8689ddfb6d3acd484b4f2da5e3bf28e363a683557e76cc2fe9fef44433899d93863e22274d7e157ee0188be6f53492655c801b4a29c7bde7048d798caf9c47566556f732b5ea080345fe0f92b3b93b4c354a1f3c8b578dc9ef6bad9249472d86ed2584de93eec29e17bd38e989442b60a178ac720b935fb4ebaeb4ed1134e8378494206ed7641def210d4caf2b4314cc6e3cfa7d3eda5e7855ef27c7c49fc8f53a93500ea757f1bcb4e97778b3866f9719d83fcadce01d31a0c667c5f65881de57bfe5986368ad8046fdc1a596d31a488835b8eabea80ee55ddb146881af35ccb5c8dc64913b8dc6c02c44e86bcd40e56737443c49d6bb4bce501b264fc104a522784c5cc94c9e186ba8bffc32a6e2985b6ecfdd6e373669b79ec620c4c6ea27dc06cf8d032e58ae3d53c89cae8b144c634ccde13f503edd3beec6d2e16e65487ab4ec1f92e48498a06e35f51ad8251bb5040d88593e87a58be0abcd8b62bd911caa8685657bfab4dff389310ab3b54efa8df4bacc33eee2a229ea8068a391bea8219a7954fb3cef743c22abb2c29fdf86a7b3c84887898e6493e3d0883b8370688b7d0560eca63430aaaa3f4b44d7ea887e7d431c266e09c7769a9f328bc7b2a53734739f97130a59e56c3d57893dc3fa7ffdcdd7107f67cceeac7f3ce8062bf640a8e9da5f6ee5dabaa57d92ce07c2db567a7208dde9b5f84d7dc6f658f701ac71c71454195d99f634f4c81b344fb83ab3475693d6797c5348c798553665dbfc1cabfb78d6d1686139a8c92093fec685d4a04da0ccdaf36385e53a79c4ccb7380adafe30038c8f2b74539dbef444a71b73839707b525dd7a2d1c4f4c0d782e9c914487d0594b30adfc7868eb546bcf7fad089f7046ba8715c41e39f416df74c4fd3c5f57b3122ed000fc614bd3d961bf6edef3961c258240e333a8494b5ab3e52c39c728464d6915c8027ed6cd44f13f1e37fca383d3b94d545bab479cc1133ebe67634bec1df72b5972906f8555baaf35e7bea2c664f616945629cc391d42152ab00639d2b6d5b3214f66a997d1f376a278778cb438ee47a6a82c7ceb103ff15789d9f9297616f356bf3edf103f65f679dee6be385ffa8f457a5ec96dc01388480a0941328eb96039d9de7a3dcce34f39dabcbaa131e892a48fbb80f78961f9c440322b49edb03f0e554328eac7c0b3ceef957a82370a8e8169cb24a81595cc89f95d70179834da375d55a1d16a7a8fac8e7da64508c97f4f7a53066ac34d407b42a6be091696351b3fb1f12c05e5429cb0a14208336e110ae4b89fc9b91edd0037392948e7d3beb78b880d3c6d933a73bf909593a0654ea18a5cec051cd17c25abb7020487579a98f62b49c2969e3df7407f9bbf0b01237a0994cc7312b0992cba7566cfc2818db511d37b1f06781b3dab99db5268f527123a0366bf481faaeca57e16b37e27758c8b83125049f3f38681ba5438a795021652b5f81c02876c0f404b44f06976e368aa2cb923081e3dd07781562ae4750bc5f3809226ae6f100fb8f67faa433b66f8153d6a1b846c589b471ea6479bdb05c741dabf217a6177f2ae8224bd05b46de5f1a42ae20a1e641238f541fd282dff3821414890600a970811795c993c8ba5418a8732b6c8b8abf738fc5ca7d32aa3f87884021968a93cc271a490de61c5f8143be65485c9f34f0d433e492bbc5e215cfa037428a51d5921404d89aa0ba6181f5294d706786a30508c5990ad24c7bb6a70d6017207d3c03100a222396c44752579859e07315cf9c397549708901748c6958cbfd41e9d2880e9773ff03808480bb38c36bdefaa5f81f85700fac88ca85829e03d9bb845227a0a799b156d0952d0c54bd5b010c565a381b55885d26cd9e9b82d21a31354c17d2bcd43d93946bb58ed2a57c13509e9537fe879714c64cdbc842e93326aac0944cb3898335004d0fc9c81546086f29136227efbc798032aaf0cba0f3c6aac788886e03c87245964c99c18e62c008d646621d127856c7559370f5fa26301321bdcf502d1d12305002b2ae42e61209892d7b3afaa6cbfa9a38ac097cb26c4745a4eae395a1b10bf80829d1b216b4da59fcb4a2a57d4070ac2ab59a82b6af3b0682b53f9928f7759ce20e1a09042948ba966cee8bd176b2ec6880c063b3ed6d1160fb26714b3ae7b44a4ce6c759555c6e478c0a71a90b62a8cf8f282a4f7c21c31c5becac2595a766a977c886009e9414123e5723e101e667647bb9a2489b3acd17a81ffb4512516893ceba8838949e998043713bb41073013d487cba107f31c84480a0ce4378732d9446970716365278f70719da66ddd8283d62190530566904221b383441124b6f3d47103d64983898f8d83a4fef6489b0c08a11b82d30cc4d9eb4fd0d99085c875dd4801e3902405f0b292b8487a72867e67200c9231ffdb43e2048caaa203c7883218f9a1af7a365a19b0d2fa595a087b2afa1f16686dbd24a98b931a5999483d467d2d264b21ba527ca419b6523fc046bf7fa96bf0a277af5094f3362dc863b8bc2192e5d78173d77139d6ad07e091e7ea507f2a7a9bf982aac812f736c787c27b04e25d1cb74d5d01c3fe6aa2e7248921225632a5033fc6342495167405028d410bc42c8bdb498d9a5260693ba326e2230c6040f332454f3b2020280ffe6bb0b7021f4ea6bb4c06980b62a9b6c89a935ac206b13e091c3c6ae609417ab8c66b7bce94986e92596ee64b08a53844b706f84731755ca02c7c49906cbbdce97c64019a52f278c2f286eacd5a261f5b502251ec136ec0a3c697fc30e8b59807dff5dced3d6bef9c96bfe3e96e658787ba3f6ffb47de56322541a2c81f68e2825c74cb75ab01d4b719d6e1fb7456ac0aa1b97068f452cba64ebdc138bcf5d36b0a0fada2a3b374141eb9 +ciphertext: 33cb33056875df21862840d7123c9d3fefec700b24a5241c24492dc094f644b5b601b974ea625b315ea7efcc27a096acefb7be53e635497185de6170320d3ca22cf41c1634fb16460723ba0da2d9c2464ca557ffedf4150e0a71d7f0b7ac64568ca2eec8a66e16f02c92f313666e67e4a0de221b3617dc59fc32541c5839325c48e7cb0381e1366f8554c1569a58e0427e3e516a5bc575438c1b464900d2f05bfa20892d6838a726ec8ee5c6e2e847a781c606d6a28dc89db35d7346e41fe8742c15f22790848a95e1648684f77d21ecd2a7642be1cf37cc1999afaeda5bb025843b4dc9a2fdd1284f5ebe880c6cef05973ef6fb939e2d39c5083d9366fd862f6de4d761b67fa99b1bbefc1a71eab5ee2815452c411f09def608c236e2c13ab35122f24ae529a2bda8ae80f66d326f646b3e9cac155fe4c765f18b2aadc455902f0f9cca178a0215463008749e7c5a64d010959842e00e830bea02debeb3da2f3f7297e03f41e4d304818e5e7854ee3c578ae69bb1795b7d62657eab867f182db15cf79f789a31377afc0a8a0adc51d1a8168ed9c531798b66b8e50b2bc4c6209eb19b8fcfc9de357653bdede452dd7e80ae3a7bb4b9dd50f384aafa3a85c484b8d5044f296cca7428109f4d6370598a483eed28c58d6e401765f9679b980e4346799ce9834a60c145d74e58c166a487b4e94640041af88eec4ff9606ff0476b48ed3c188257836e2bc5770b313ab7782807c8f387aff9777d16d5ab2439b65e9fe9d01e8bf1d4df96c1d9537dd1ce1cb5f51d14d05332bbf0d83f20087088800d4de838945502ceb034f77fc2d7aabcaf3f362071199369d64e5ed25378d39aa5b39e53814a5aa7a3c302b2f4808d1477dd04f695104a17355dfac04ed0916097bb6b4365d7ef07b4b414729a52e75278434e2d69ed838405d4ccca22cc1fa61b57483d5634a1c1e250e500e6e5c2c4a3794c0e201a68d1fac6a27ac079a79e744727fbb3d5807100480bfbacf5dfcf594998bf8e2c99766d4309bc89aba138dbc9051e7f3396e9767651c27948e04097cf2a175326434be72e1afa89c0d42a80600cbfa275a8a53c860135d54a4076e9f7276007a12261ac24203a22ea0e2f414951560aeef26a00e193cf42ccbf49c4f27e2a4e497f814fc165637c4f1ad890f56de8b0b6973f8479aefa080afb0d91ba777c58fd1ac73215cc225df9a092301f23e5190efe8d3d634f356bf170959ad1dbed270df0cf2671bdfbb2d12c15006651910b3adac8bbbd57512ae149f0746cfd5f4d9e0e6b409db6ec314a21025aecdcac16fb2a36789127162f1eaed305eb20a506c61fdb3e5a8ba26b7e03481d461d17acb86741f81a19d6af0a18866d04fa346a3c6bb6ff72d828df88a1290c018d9585f3ce96fed7787d91d153a695852bdd272b29688f4077dc3d691397f5904d9c6320bd1a748ecdd00fe7f1114adb2e0dc33c34035a7aedc540ac3b44f5c4bd9bde63cf5343ad0bdc1b16adf13bbeace84d642253ef332a92ed483dd9 +result: fail +shared_secret: + +# Private key not reduced +private_key: 4c1ea51a0bac67897ea9cc5d7d17e855bc8bb375a18d838016fcc506bbbc7af38473f4f75eb5449b0a5b7145b49d8dd626f7b6e5a6907879c542adc6f027b7403a5fc25b42da3a7c9308a51e863eb346c178c469bb37d22cec566df469351fd5fdd84f4f0a798439e3a974a7f51cfaeaf35e37673c4af5fe592dc7ea843109f4d3ba63f9aa8e8a866d50eff789d4c7eacdfc34761c39ae23dfdadc300bc6b3295380d3c6944223e00e43788204a41c7539524fb5b5bcce2ef7eba5be4ff0a3f5c9d884bb09ea9e23f551a444e527bb98e6b12b9fe0c6fca2a054bf8fe346c2ebdee9e973900af799d6da1e9c4599cc37110460d27b8a5f84ed58fcb62a6fa38143aee0377d6d54d6635d6200fd44c07e631c47908076da9d6f86ca3bc0d5f9aa44e7cf2344fbcf37a9d81dc86ae39e4795c7978d5f0198b25d0b87e4f77e01b970e2858d2664fe92eb356c276e7e95bc780e9c4f9dbab93ce39bfedef59b44cf8cc7e9b5b59e8edf4cffb8a4a5c5892de8d9f593fa5b4c745a3f12457171b735930f50788d45c0fa3e1378c4aca8388245484a33fd1ccdf0ea665e60da9f29bede9aafd220a8f86d9e8cbd4d476e7c8bdf6fcc27ebbfd5deddc76982781ca59d73de086771dbbae3398e4496a7ab339e3c847f64c537d80c9b6d3acf5e623b61fc28da29aa3271f84a1bd5db7e678143939ae50ce8d33bbf52d95e53c5f5ff8a8a408acf61d887585b561c3a69b088388f88532c8482a20c445f4d362d1c4a342fe1d8f999c4ff424379b560b5ab4e6b6560fe6e0914e36a27774ab932342e7ecfa58502cece6feb7e448ca9f3c76a536eea4b2dd08cecad984f368c1d4522beb4e556ebed5cea78ec9266df3273cd6ba6c492bbe9af2704b90445e0ab869af5d9b63ebbb8c3df6051b9b452d5c1605a7c4e6dced3a930aeb63a875d56e20ddf3fe450a2eaf99d4ce583f5fff109cb2837c6b34abf6b063aff8fc86c2d49d7335ba486ff8bacd39f49c3554c9ccfa95e9105aaa14e9d39bc695c873ea433e39747f4f037f9383b90780c55eeee9ee06b63185fc2c835b0c3fd4666bbcbbda79078af70bbd670ee0ee2f5d578cc1b4589f3ec22bbaad3d4d44c1cb67707aca78c6d7c3441fee377720a6ab1c5b13f3530bc83d2030d983aa6fc1403a20d388b2bb7ee778cf8c30ad76ffdbdc5c94e0d04d289fd6800cd3ddf1c34b139bba633cc690d79042b934ecdfff093bd38fc9779f694197be60dd35c0b5ec9f56bc4768333b07c4736e5c41ded48582c69f066ae08bcc4bb3c58fae435f6b53f8b533af23d9a5c9ebf340eb4a315491ec6d671becb7f6d42456ed31d6786b2fe3360d8e19ced5955c37336f49bd5cfa7e8be5fad1a6d2d5faf6397ddaa148ab0f8476e8ad9309b52955db7e75b95988a66f037574ea5b1f3ec3d2d8570a6c46320b3d286196e374df8923b8af21f8847db9b42d6e8dad7f698044144d5c206de4331f9ee70f55da87a45ad049d7beacfaf079b148a9da5a8ee1c4dc36837b9e344affc5e9f961c45a837dd6ccef5f42bc5c5089d9c83f4df7dd184336210f57603dcf29489a4e27b7fc25cc0861962ff738f07cd3d452fbf12855ac02f5b26bf54883d79185bb36d9c3ba85a46a5f605706979ebd66da03c15f1b4c25b886faca00b16e04f87b773d0b8724bb4947c615344f9466f78cae8d049876c9f7143154abc47110b0deac571bbe83577f577046830031a08b465b86e1c341c82660818cd2f8173c5c558975868f0281470f39e737b6cf964008e040382b290795254380b4850db27dff98838d9921eaa8146022937e36af6b030b8919bfea844d9d602ccb3547d5c07f612c12c3c179ffc30fe52c9273b5c0dd27934b5a41737817be0739425736bb0cdd267beacd0bd77085cd2794947051099c3848fe0aa2bcaa18f6a18afb626fdf1b977f376ea74a9cbd638932600efd84fc053650474c801b1a8ed941cc5444922915173ec1971698172f8a61730358c751d2d776d93c866c47802e2ac19c7c092aceb53996c20375b47413a66c06541b4343c548b4dc5341ea92b2266d9c0f1665719f62a72650414940bf3a20a260a5953d578d5aa48a2b670aff7512bf6937e49052c3ab8ba07016d06a9d643081dd52009b358ac13c3136cc65b0127e675bb55b8598940c054c8b797d37312a1ae48120934a559ba31042e160ddd13c744d7ac5dd614d198a33253b829016fae7ca51d397330ba1aac557a8fb56477224324924276aa52b7000f77db547a604f6d7189ef83071293465012b6133a6e1209af3009a867a46bf2868f8ab8a932784b76084998e37eaa4496c661a42e9802f5e1ca947c75bc4a572562733409757855031c9627152c02cd25a9b9725adae909175b27c53c6233e4480cd3a06954afed889ae97a091df86842483edfcb5df9a365929b6da98917ca7b025490b416a7abfda408f07429244a9202a23d23ea8ae96bc8ddd747d1eb9b79a3cf3610bc4eb56f9de38c3fb77db2740504e85107f46896202684db8103b1c488e9b731f0a2bcc40b563226d05946c9fcc1a4e287628bc4985189e05a5174709f00c43eda4897429773140b30bcc090ada25c91b8858f07068bc6c154030f048c1a7002ab58e157ee5b0e682877372426e193cbbdd3c63dec0a725c90d29411986a249cb30ecd981a92519ece4074f18ab92967220ac1c963503a295c570d7084c2917ec9b6a4663a931d6a505d11757ab2935fa708e9b6ad5fc1187f3717c6a4a818d57cf5395626c8a3917012fba13315902391116ff5015051dc8d07ec0716356d20a184458b4089a37fa9a713aa35c8ad1635a7fb49e6bb44cdf4628a3b84b9869dd760262cc487f44a361b9c1106553338cc5dd71c45c37a3bde98036f45231dea2a83001d82203b27aa054cd1bfcd215f477a7e43d31d946971b0d3223868922699b0d810b6fbcc834104bc0ba2cc7a50bc198616468c212c9b9dab2550282a9b88f8a1b6d006ba801544b62564dc05cad68d7f6b143222a5bb28bc9cb57788d417fdb73bd0778fe0529a35190b0912623df81a7387cef7d201aa007a199735bc3aaef9706c6dfa1b0256b872320459951111b90caf3202ceb8c10a480addf08dae881eecd0cec08a2adc61c20e8c15b60824653492e603bc3c203fc35ca536fb7c64084112c878741b83870620eda2997f38aff953217bec592eea7947e8be23fb627251c13fdc9bb0b705491151b8197cb07ec66dd1d49dab7f9d23aa8ffa435f2cc7a7a3a1cddab6e37ab7be45fbbc8aeb3fdfcc0b171aa975028f96cd47fdba421ac08e29a0044cedc29fce35eb85109da0c5da5f195b80fbb99c2e8b06926074f3f604b3f6195b5a5b9737876bba72 +ciphertext: 61d4f41e6582007daff044918721194b5897db5c463d6c48c80ac7c37dd0b829bee3d0aa6b7af4a6acd827bf30df2b87f4420c984548f057c1eb6e7b17b19e4f61aac5ff5b8d3357a2a7df2356d8ccb697004f762df71a854322981b85a6a753a633305a140c89bbb6b698db44ef4bbe945f03718f9a9f55bdfede24104a10273321c5a2289ecb78a8d2d99dea4aa57ceb1d1179f0c71c8bc2d2b16f7f41eced3819351a463f302c5b35b45658154326c8787c555fc0336be1aa05081f4d6aa6649f7924b0e8e0575259929befed461636751fd0e27ddb9bd92a1b2f8cb718961cb1005bde873cb4489d02068a5129e83162b5fe70a4567458176e9fd2f0a5a27b5ef74a081912d6fb9a83a07cae9cf9442e2d34d076008b99275a7d49fea0b8f0261c0f2743493493113c490eddeb07e43eade98b15cf24b9f7a081fde0aa77978c41a62f9eb78b90d914f0110cc8650c01de496c81a7c88e038cdcdd8105b800a2b5f313ff803fe776f237f94415e74d6e61727862c46d70eeb517a71a5a6f754d199cdd70ca4369a4db39c9c6112f4f9bee3987c72e855fa937137468fda364937cb62412614536b837064937a5d626906ce0e83b7466cbb1a2242c893df8606eb533295b044ffa108810b85877fb3b5ab3294731372fc55427536d60676ac3d161f04a0e77f919313ce0271aa303b08fb492a1895c5785bdcadc8aeba725fff3b7cc14552b367d265360fdfa1e69a6a5d773b2b07cf5fb8d95f7356acfb648c22745258d80726d0d0ad8f12982521b4de93f081e483956d5fa97648851fb00d9e4f64c3ee4f4d7a8c53767fd9df32ca9ea70cc1180287e5ef6a77e1d44f97ff955d4feeef98d68e83d3eec6216b6c1f534b3b95b8745408385326ae23410e1e7f5f06eee0494800bfd7cc5d0640f6b39eedaafe0b4d95d63c474eaee9c5ff4cbb0c87b7e8ab20b52796a0fe1836b6e8be2afea81164c6cb633fd6c7743adbbb64522ce69ba9b4f9cbc510022424d94945e0c865bc66e3b7ad206dcfec359e42d5455a933174bf720f97ffdfce647b6cc8a33e144821dfa35aefd3320aec898f6c194e2401a937c9c746db08075b0e1d9945c771b5b72b62d9f226adfbd7feb4a9c5ca838ba6fd4fe88521559cb10af57c08f512d88245df43987c1d6c9bb2fb3d82273b7190a46be158a0a1cf6beebfd951be29ca7fc2e16117e85589c22cbd88a1ee965c18933698d2dd948c0ca8776cbd6926eabe94ebb105e3c67f466c866d81bb03ddc8e11f0bb10e7d0f30b95d94cac0d5649d3fc44a5b9f6727c1b5e70791e134ec0a3e67303f6adb6ef3f57fc968aed10b13c731eb50189885b3f8076cdb2cbec95d9f2070d7e3c3e5a727ccb56653d82b1a1f7c237dbfff2b4527f97f6d383c7c4d8f5a4826521108376dd22745384524eaf90c7d91409fc003ce9cae1afa72562a7836921d3193e8f2ca8c1d35959a52e7199957f7d1b8993c2cf39988337882ba2c05a0eed718651cd2ca564b8daa895a9060d460a47cca663 +result: fail +shared_secret: + +# Private key not reduced +private_key: 06e67b30a9fac44ad9b667ff7b4764ea9bba94bd5cc3577a8f86f27acec99a1d44b7c57ffec6c73a8cab986d31b32c334318d79145f4a3e5ce0e26f7dd1e495ab3ea081f302ddf6e7da8dbdead8542e3dfefaaecdfffc302d6eb3aeee9c0a9d9b338529b89c4b52cbc521ec20a98db494bd1902ac47feaa041b7f426b4625da3a79704a239138eca74ff24d382dde6a0c549676bccbc641edea9fe7dbdaf31e69ab7acc5a9d918e090cb65397e532fe4887994fe7dd4ebfb98f0f22367189b31d20fd2b7d5de25466fe499e116cfc8337a637e964c5d88c5e85fc9a257d47b0bfc0df93a37dd6d80d3f30cc6f8ecb5997d999b1b7da5fdd8b9588678d1e892c43dbad5aabe0937d29f173b6beb512d59369739ac8f0b5fb1663a8754f6ec3ecf1828e99b984c6d0eb70cb56c2327d78c393e5a35cc749c7d07af9c08a3637854a3cae7f4e8c93199dccc115b5a03adff29b482c7fe560ea778abc9c0bfcab0f4468762ee7c8d265b93ba7928af868f78bcbe6374723646a838f1a59f5c548679ed3bc29fe6d22ea952e7b8acc32daea82c66c76cea9d5afa7f793ebb969b877a85a4aea886cb57c58b3d0e19ec5d136dfdf6ef1685626d73bfab6b672e95628cef7071897d891dd7ef364982ea4548be95bfd79323874000e8e79876a61b0589fe769e7193378d7ee49627acec65616e8def08f654f486628ccae574f9fef7f96c45adad9057b2b185d12dba705a4735dc9ecf96155146dc53ef3fa8e87fdd1f7cdd97add7ba84b370dfbbad76d882467b6675b77d838b95aa32c60bd5f109b1c8eaa181c4afe3cc7e2f4dec8c89cab8e4587fb472dce46f3a8daa62b6e526b79108e6e1caded3eb05746d58ac6cfa58c4a474d2a54f96e8617453847ccbf9603849822eb867f9aac8776fe153bf3f8895a6edfdf74c934e33d9414597c176857955bc7bb3c5999e57ea63bddba696cbe57fc0fdc71ff637a65ee793a7d8db26732cae3b33783417ddcd349da437e8cbf4c97899add0ada7c5415f54b9f9d94c5b9c3e3eef04ffd5e6469c478ca212136c9ee79a428bd0371bf139bdc11cb435f93c4ced43f6c4bebf9a2991f9c4c285bbd9454afcae4797affed6fd9594a03dd7b8b6e77a18bcfb7e7106688c7c536d955b3db2f730c93fb19cf84b3156fc6c56f3527b7e464d85aedb59aec591b69349b00668e27db2667358daaba2d969f50dbd486f0448768689b2c5450e8ba2fa3a77e9f9d80dda636f0ada081576fd3bd320e69cc00e7d4693d9076884ae09f6f6a9938e76b52b453eb8c563411977561d57ff85df1d2d6236679c09f98b350f6b43afc7794d7014396f9cab89940a3d66d76ee61fb7f07375edcd39c4258a1c7a8fe62e868a99c18cb78b17e78334e598a536dca52e63bb7d5296ff8c36dbe9a35ff16a66d79826483698bafef6755ecba3b719eee2c3c6afc9b9d204f417b5ee2b6ebdc229a4b715eafc6472062a440cc7b685ffd0aea93232ba945e3ed07bcb58bca99b269c5cb46b3915197279cf7bedeeb9a4e6ba09ba38573987f30490f58cd9e85dc9fd87be933a91b9c59717e3b5c6fb660eac8556488d942b4bb017e1b2c93e433fc1c8ad8669776a406d7ce80434a94334b45589b1866bcc69bad27ba323a563f47bc34073496a468dee6013330bc9a219452caa35c1a522c45c498fd4ac5564627d564d3881c731a9856ff7619622aba6f928beb9b9373b1104e2cd2e6246bdd88268c1b512867ae4ccca21140f0c046b5e5817fd64a2f93383c3a5add2f62784e2c8e80c150a1c8e1a8a47232787ad529333a07e0c512332799d9896a6071bb4e4fab647440f82cc85630c629c2c2068037948b575a1693f81d2a045a9c5a5c2306e83b911ea1e86db5763f13ca6b02ca8905b50faadf5440bec7b49913b371f0c5786fc585dea2813fa9ced349d9fa32cb5030b5efc274522ca4c6985b9dbbb245465a8849c4c78688392b0ab5bca98b04c7bf988ea84292c8505fc7acf90199eab7c31c13252680c71c9c333e91a0adbc1bd00d023c8d7a7c9068c3fa9b3cec75234663a2b73572ecc71e53a8eb5889860a336f77bbcc1c854d0c3c61c65216373bf2603a0ee72af8f747bfbd7401bcb9d599b6cdb02c210010d0425917b72891c33c97e9b39a677010d22a784003e1b917dfa3273246acbb45a79c7848143f0b583781626ba02a94922490c7b3695a787d9ae22e5470d32cb68790d75b81c55d084a43c4399aa587e07829510220469ab5e6381517bc9059353b68160ebcb0edf969e8c317442c4058423c3356b34035b9761744fefc76145300908da3c13f95eb3065f2cbb911437cd24f815197c0dd3f9c87e3b54432c50de1c7549228c5f9c32ee8c19fc4cbb04514025645e0fd1468dfa274e59a50d62c560eb051eac35bdd148ef75b0b05357619490cbf08b0b13767557c5fdb310da985dfdb9c35580217067a8c68491ba64307a618d272363ea346629ea6885acc17733a801166fd404cca58b591b68b2c73a9e890a13bb173584d2b6db351133e75d258995ce46a8f798a44ddb8526633949e5442435c7b3c083875760c00614665c4a2ab92c378863a3755ddf681905ec2044c331c4b976f6ea5335bac739c2be9cf141a9f3ab3f669c5fc49d74f79ba066a7d03b0c2036247c86305bd45194a00e33a1179ccb8d05b374deb491bf5c1d6adc4506803a8c65b18dd6621a5820ca93c339dac2bbc098c22b4e1fca3cabe58ceab66da6a35191a29ad82c74abf1c823200bb197015e074d14f224fdf30a51bccc015a152b8443892b7450734b34e77356231c6a8016aac430db0a8954c7a416b43d49120fdc4017cb61c3bfe70fbf24773412b6a91375f381658d57677fe571c3bbc800cc80ac597a8f2c5cd1f19567ab1f4c797a68e6133507aa90d1ae096148d313b48096ab96298c33c3828d645a28098c777cc10ce068c035a71f7a2a36306fbbc311d3d14214c042871388dc899ca2116baac1aa5cb261af35a0e255b228498295f6b4ae171dfe21b5f66671af532253dc724a893b933829a0c275c20407898911472a02eb484d4ad5b8d274c00bd9377f3c497e6845161868434c968bd847ee90c2ecf600867cc790b005061c8d5c49339dd3ae23920e65da2a19d649aad1b722552e07f51cca7b87efa315b6191b31279509d78b0e974860ba9f635283412038efe3ccb2a0c643c68756149a03b50f6891b9fdaa099ed50d7a012c0175b9518c15649396d94ca1266979893e82811af8c142323fc3d38b8b5e554fd046d93317dc6d0ff28990721c3f94a93024ce01b01c0ca55d634c191c4280fa71600a8982c350df524cde514431ded7aec23576530894bcbf0ec0bfef0bb64f +ciphertext: 45c095544a69ea32a56f9b6afa5ba17216c47a7edc519cd2a8b54b4359629d49832fcefb5adb0807ee8cb2be0a0066b782a14240462bdada4016a5ad2bf71299ef51a026ba3d0318b7f1a662b45296b20a5a25a21bfc67cb9c9286b659c1b9ddd576494e63eb9a70369b04a0ed30b6757272b7a99a591868569fa52b775facee306d7f621ba1fcaa3a5058aa7e6a65349d4aad045b70b4a26e6b5a3952fb89600e0f1edf1fbe7dfa31838a37150ee51e1c1af5b2325a4cfb2df17ecc52f42ab5b0db2032a2d01d9a77f7aaa6865d2fda4373581734b78d53fb2cf3946b9ebb0a677f8b8bcdec169ca03e928a08d05bb019c18d98ec084066b2a4fa3fd2e1b4711a44dc786724ef7c58f4bb6314b0b1486933004f51c55aca5a397d9eaf8d5dc557cf04d382e969bf96400997b046af19d5fbf9d6ec87b69c071cd6ecfb5d7966b29e3cfd7e3b310b6459af89e93f5fe3bf9ddd8f84437661581b6403c582f22ffddfe741c0fc0ba51f1340f4f32bdda61cae7ac83ea2213018fa308b3b38ecbbbf5ac3b44068d7bab95eca5afc736fab9ff8eb937ba5c8a9b5ac5abf9f368bd581ba02e3310e254ad718b16dfbd900ded9759d909d61d2e25a27abe04fb63caf38f0d2aa0518463cac1c35b22206b4aac9de635b30400efa4ea7d0fb3dcb4072b779b211cafffe97ee756e7ad57554028bb2f515eb6bc095e64fa552deeaaff90312fb6e9819783870b0c3f83da7a3f16e38fafb9221833993aa5d0aa968cc0a4888a43e5c1e1794012789819fed28a6aaaeb023467dd152204f8f7543de435c31460013c082d6f3158da33f5ea54cb1f838c1a9648589c3b09a51eb8df1b5a6c8d82f62d7a946f6d198cd846049613d00cbb57199a00b506114d230a86dc6899b3ddbc6473e6a20fc90754bdec551d0f8a42f0002f14358e0285aec30db88433b1f6a6f70798cb97cc9100a657f401d4661f82383ceb83625197617c021ff076eb9b08935fba9d8aec0aa12aa06db57cfb5574c50bebbedf9ba41f68ba09b0bb1c73be5e29a1e467af5d2aa29cb84bfa639386c1214d6801cd2ebf6111452227bfd1323e6ff880539ce0eacf74da99c75a9fc6270985caed1ad906c8b1451f399ef09e4336d596a89f1d071b372068d38a4741250c5c38cb2a893c793a8cbdfd9d78e943f728ffedd5e0a9efc228f7dca5d9faaa1052569ad2b3ce85a9d5be96be63790ffbe3e7cb05333d8bd56d5e44080a52dc00b516ffdf77594ef0e92e591b949f3d477cb6d0f887bd43273ad0e945348cacaffd5132a642c1c43fe28bbf6ac7cab18b45b8910d1a107d2058af017e3fd67c7214e039451d52ab961ce2712df6ebe5cc8f3c00414e5a817d148528d0e08b3761b774589b00862c0e1162b463b1fe43d294eb2439e80e35edb261856099f32fb548d494eaa4014de2c5e223aac793a3a55da97be77e998ffbd51ae2ecfd1dbd0fc92f9fe99e510c329a6c74fee225db455197f4be18efe98edeef43dc6632917cdaed3aa8ac4bd6f613d20 +result: fail +shared_secret: + +# Private key not reduced +private_key: 101ab759f6afcd596d4445b4e4ae907b3955f81641ccdeaaef79b22ec38af6ad81a67db67dabb410aa3c799f5c82384b5a3e908d14792633d522da5cfed372e9fbfb95add625e74cb01d98144572a3d9ba32d875c9184989d8f3a4ff3da4144938b88836e9c708f5f967b841402d6758f578b44db2936b798775b7abad9efd567834f5fafcbe7bff9be1fa0435e6f55ac84fe9e89f54e166cbd8dcb95f0874f279f5dfcb93f956eb2a48925026651b0cae117483d65b3f57c9d639a39b17be535657d7a01fa0d897c51c06d392ae65fb88468017e656d4d7caed9b31977043afab6783a9b448ae7e9f4243dbadc6cddc013d3c9b1f308bbaa5200f48851f6e01346665f67345df698aece3159a316f4e75dc63fc75e4dd6ce54916da9ae3f763efc74dc9b9d4d7d8941fa34e493a74e009d42e44a8458e91663d573d4b372fc6790b3c357a6b6b075b87e7bea82938d37db4ef265c7a493abae425c11b75e4a96c6e3949520ea4b9a8ae8c76c53017adce654f37cad882d79c60739a4d275ea4ea0d463b2f4f1769a40d04cd1c2796ce2860844ac6fbc87b00379446a637f868b73bf3ec5704e930d3628babb45bd5b9712b33bf5637e897c6bae6cfc77e7dd87ac5da66f0ca04cae154bf5806e124873f4ca93738a444801cb5b61acbc6098b36747bf79f6e79bd893a1e6ac26d4e606e570dca65832ba04c8c64da99838bf4e8b628d5b148fcc899559b6fb7333dcf126a701a56aea6795e6ee95c2169ce82ca352a5c411d89881a3a992714e43a06d01cae5f9f69d83bc7dc69fa5b7ec7f036ead24a47d7bee499fb4d57a52c3627257921afe5f21890217cdf0dc83b5dd388686d4a6175c417a6fa8a95e3dd5aac8e0a806cff4a855c89252c392f6acad14d4f9445b0b88ebd27ee5f4cf4a7d815bdef3936012fe9955797ca0e91c7c794987c3d1e8db07c04b14ea5a6ad49bd4fcf7720e68a8e855a042a8b2248f1dad9b53d0d912ed9f249fae5af56d91714759d04b4734a5c60d979735741c9acaa7c6fb413c439a3bc7a661dc9c6addaf2177bc61d4c0c079c68ad3a1209f4ead47e1ba8575308f3c7334e26bdfa1b155e0b5cf2b08fb353ebf02627b2e4949a3c874c7207c0d96480c33c90717f3b9daea21123f1ff3fe70544c255e3f46cfaa6970f64ac14f169aff153a7da6df7a46579da7348c1ec77b997bba243ec7508c88b7314d7bbcfa9b614db83ba7e034a7388e78b010ba663de5eaeef495ae63569bef349c57baaeba16b3fc363245f599475f8ee41d2df462076abe317efa2566c85197bc7abf4876461fabdd82f57d1eec6e9cb5c4b1c1697167f9fe3ef7d8599ddf08f9473d33f47bc721613d063466f2a8c9fd6ee4e87374002bf56a6b98d3c63d9492ee08c1cb6101a6bb18a8bcc7bbb7c4f78d13dc7f04368d655c849dea22d8a79fa787613b653ce1ed6723c9e908e439083a7f12fb9c98b6dc7d39c2c7b5b61f4c8dc0672884ea641a9684808b20ff84a9b2a569784705faf758d0e76517ab47d2fb408bbe6ed2db84afecbadd7ca8243f107e4ef7e6a6135365f86098fd9a66848ed3641bac2f1c933baf967ea4f65d40847976b68c49730d245b5723b9f70d99d171745edca3a65045bf6e0625aa4955fd125d332ad33f9a3ceb2313ad50c97614d038547f22a135a33c06c61545b9a26b46c41d1830b83d0257fcba82b36510199224855bd1a837a369a2c823391b1f84e54959a06938513681d97f34eeaa7bc42eb13574b29fb785c457786ac69ca22f644a1d53278d4c2e0f325a1209a0ca40fc32b92e906650b484e7d92cee99a078f5090d2fb60f84b47dd44224228443d36219a081f9956cd7983ab223bcc094a0c65414cc2aba8564977b147088ef41aba589653e535847450c762517dfa462037c2c1457ef3d1909d0b79d66ac6ed9803ca88a7295c4a3ae53cc77c235cd8922b36ba8b837f375755326a960beab71aa1b33a8b64d6076f0889424b1875ed6316ed420db7e02d731b2b3065c7e80115fc1406c125b651c2b4ced28ae9c67cc505bae5b747e5722f4729602bd1aaf25ba333c29ca011ce36f55494204b0f70895938c9c4658044740521097d696c8efc045709369f88c1cd46bb763b957db8f48abf1a07f431845c94beb7a3a68d42af6c2c3095f829de51b37c134f977461aa2818073682def71a65291904f0c214b727fcc7b522c2a33f7a2e07a65926fa5661172103b390fde2814b21273b318d029a112fd389d0324506d280be8c49bb923412f4c430ca82f58ca8b7122907b986fe912c323b1758901007067153db7b16168f791610df534aec8050a58296f58b7549f0665e13918c784da2d00da79559ee006566050482b2a13baa4884aa83351753cd7a48e6385292a990ca559c8d630a7dd4947e428198b06242179c369741fc067dec411765c58364d32ba655350530a4aad934a1d14b76f55a19ab7f2dc60720124a2b69ca703030b2320dcbd459cadb6662fa0aeae170f880797e2bb0a2f24e8dd1442549ba4510153640ba7f093acaf41f67f55e4269260ce2aa28261d4dd4acbc2a4a134751261991e7b36183387893c5900e8a611894c76c26217a390f86e5068a947457db75e7214b8b05a3c87251cc2101d7e6115c908d2721aab224b038c1b9c348a3c04c081496928da726c0d140d363a427b93427f16841c97447698cd0f360529725ec86113594045e143659cc1a0667832f40aa7e059d0b1389048a75429886095b3ec5a646ea12a09424338c6ab729a27e595ac7784169c6e7c7bc208b07a44cee5940f85896a7285845a2a262da092d1b0295821975754898bab492530e44a410f35563a1e45775613192dc45df526cc19b6eed8186e6f706e233542a4450fa6c89bf993af5699dc0e46965417433d5b1882340a1294d4b229d42061bade4683f8557dab0603fab1bcd956b29ba8a2af60093654f09e70f07eb3398f7bed1354a7982416ac40860538c36722ce1b37322c4a888c2359080704490b613c9a5f7318566a37139563c40d58c055b827145bd659c8fc6b7908a071fcdf0b17e4351cf3bcd9e8cb9361985c70c49bad71f860b36ae120f62c06f3b34aa4942985d149db7b13e1412cc1ff59dae21cf50017883a0aac754ae6cacbe87a46919c05752877840556af8d56fcd848f982b415d333fd8640794918ead0121d12309bf622d9c97551f294c3822644834b38fa844a035cb5458aa7240f750287f95feb1696d88988eb0648c3cc0fa9d4277fd9af8c579271f4c7721b12640bf755e94ba06204982458a9be11e1da542ece4f3d284886800fc8e8e0e145e44aae52cfc609e6f47fd7a6f6af877190ff52256d0ac5b05b89c3f449f +ciphertext: 8ac1b83c47c4869e81144ba3963f3e4e1ea682e982500d19d73b368d60b66351c0da3211acf974bf952d3c6fc8a6586ef9ac89c7321263838ed84d8debd7fb67eb0aea8764d97cc371eb71970c0c189150b8665aadf4396a344ada63e29364f2a3f7199d5e1c0b5774bc87411e96a6907e193429c9cb9ed2f127e025cdf9c03068afe7647e1e433ce627b034afc329168bbcbd930b6cc52316b77697fe20797f178e3f16b45ec4a86cda556abf7c6da5d908b7975c6678edd0d4049dcad34c199f9617ebf5cde3dd3c84ff2a9f9f95248973a7c0cc5214aedb637c170b83a8cb740acb2e606a3cd524378ba26c6b019f3e8c4ac43eda767b9b135c52168cd0d548dfb0c38a1a212ca310905c4395dcd0c9e529e3aa5aefc0b6182733cb8dfb269c15d4890018f8339794d5e54939072b50c922d6543e6d3daba38d4dd1b3e9a8aaf4eae22e9f28b18d7b7e32d2f60321d3e4bc9be6cf80af16159ecd0683f840fe83112fddd0a1d85333069b818c270507668d1a0d74e018dd8b2d989502e4446acb04758cd4d00df4c05265d7702e65b34a6e2df3c77231bff33e93b9fd55148544d80cbe5b3a7bcac3a247a858eada0714003e2d9776c95dd3e2e869de54ac58ac8997d750ca6b29a9bc20fd4912d7889fda29334f7270c984567d222653e51105e63ff7b04cf5ec4de4a3e20c6ffa6b34e8a47a17936c684a0c57871a5852565f5872ce545521c832e6259e2a66234361e73b858129932e69b09eb5b7e7957bb7e8359e9257c205d1da5e455d3c3c64beada12d15e34a6ee44883054217142634a578bf42c9df1bd4b7d74d79b40fd93b3bee4e47b8a1fbe570c45061f55d6c181ec57e7cb7a845dff1bf48939ee9ad35146a0a7a9c0564628a4bd3b6443a2cbbdf82dfd11642816c130bdc4bae905028a584964c91482fbdba6b3daae7822549b04ab83087d12ba7c90b28bc418eb24165219b36c73aa32a4ee1b2fb97d421398b187a0bdc1fd7ebd508ef0afc01a6dfdf82cc37ed7c0bb771b792c6e4a5d4b4112c941b3b2066e1b6c63885861c0ecac6b20a206326283ea9d375c6aeccf179d5274389f0dc49183f36707d72ef6cd7adc3d544c7311f1983a44d2482154c77b43f0db3a1e4c4ac78a52b163425cdba002a29dc27bd9c191196e6ac0524841c3f11ea13782cd439b26b1a795c9f9629e0efd153af705bd8a35f1d70d3c5c8589475772307dcfeb6899f0076eb9a8f3272e72bfaee493ac1680ef2855741916733074a2be07b948bcb3690f965dabd4f4ad98ad5be62a6d4b23919bf3525a5c87839707e9bb7f61919deb787dba4345c1d58dd6771f1d7677e2fcbf827fab1508fed198af0264c47b2e385d5083d2f863619e368f4f3a154ce0caf496bf2970382e42876fba4797bcdecf5d47d8af4c78870c0afcfd0c7612f005af77cc8c268cdf9232a8ad5f9c373160125af1fece7654e0d9fa665bb1b59f73765d6cac9108ed7baed5a7c231fa4011ebb0bc37ffae8ea2b11e5f665d54b394b5a324f +result: fail +shared_secret: + +# Private key not reduced +private_key: b6a8be5c6c9e95ceb41b5fcb1165b3e857604eb4e3dd1e81354fa518bbb3e1d847251d9f9c1f88f5f34d06c3aa30e9e3954c5c053486b61bf5503f50e9aa656de7e553679f602efd8e8c7f11e6b1917fab3794f84ddbf988dce0d673a424adc203fd3cdcc74a445ffa2fd3b934b67bcfbd74a349b8524786f7def6d72a384c0a84fcb8304bffc3d65994e5095275df715d057b920ab40219ab156cbaf7d3e4fad571235d5ed15a61dbe66cd83bbacdc9b3d4aeafb0e6d7d7fdea3f2f7d3109a1ea14696d84beb85cdcd03bf96486fa37fe53a8c8f73397fb0bb6e03437a191a59439fc3e2ec899ba94ede42bacae534bb42dd854283175548ab055cedb836b49fa5841ca69867ec4794c7648c65d5fba44b3c57d925aae29cca8584def61b6940bccf8b634bbefcb51037c301684f9727d469cd7ccf39a828e3ee0f8f3b9ced9e5c74f3163e9db2dbbc644864a6f8761e83371e2c3724617b7ccc893561337bfe7832cc4a0636ab872fd7fe9b93b7179d29bebb7afcbd2ab249ac3597e0bdd52b233a454f6628d5fc6727a4267447bf21d64b62aeba6a4b7eda764de23b0bfceb954d3c5882432e1ba6ef1b94eb1464086fcfa5bfde67eb8b5ea2b40c01953f223544e49bb5c54e174537cf8953c74e3e8a5b4b6190881cdba5b1305b6a4ef528c4c88261d7fe323ce9e979f5d33aa218efb6ccb5cdb44998aaffb8e67ea71cc458537bbd8e9a696d644c713bd266d7d4c26a39bbcc11d58a4155ce161cbee771986a4e9f3dc9936806498cef9ec3ffa819baa73d21d3b868772341aeb1ab664ceaa82d60b328e296325acd39f1f798adb66e62b827fabbd32d7b29f6e5ad76cb5690550af975c2eeceaa8849566cc8bd2639f009453d1fba689cae4d5c68d55fced90074de4b47a84944714a9c11d55b2727f7c64e566762459f7e381763981776665c3e9d8110a74b7977679fde1c46d58dea6d6eb2f508443ec0f2479de36c334cf6122ba9fce2b360628b5b99e98398f9c2ce55b12a6b80a3a5ef0199854aaea272f3a979e6ddb9ad258b5ac936b74d496b8bd249412176b6a7e82054b74440ec2a4cedb2fcbcc11ccc89ff5b40f079818ce86893bb044559ab646626f683192ad3fd604e606ccc6f4a6f7c09a821cb4f7e92ffffa1f34d5e9f318863aebe864670ed9e9b5ea389ffa990bbba6fde292543e756b64a229efe855844185a673c584a3cd897e1b73ead8ce548833c03447dd3fbfe7fdcf615469cb6ec376a3365fa6cb79d6e29636c48ad68dfe3ce5540deede37dd194dd96a13d72095bfa34f82f2eed0c2673aca13c1acdad1f158aa3a593d0b78458b75c8f34ba4f949eafe255dcd7e5ecee3d6545a6a693e91ee83ecac1e77532882d40ea482677fb4c38d6b79f01f19f0162641f707d2290969d5c63eaf13a133563e95ac5e88b4ff4e1f8b9c69b5c4fe6b76a6731fccbe6f58547799bac3c9a6f3cc9a13bbdcd26a50bae9774acbb86ce89450bdeb1694da8c3fdd7896e97f77ee64b4e886d8daf2f66e8a9e55b135e81118697dc6fa4a5adda27ff40f1fe8739cb43a4d6219c679f9857dbfdc73d97adf7b3e81eeb3b38d8b31b7da8e6503da95f778ec5b4027af8ee770043be600f7a60b3b370bfa6a30c846c475127924071e3120879e2a158433a2a3a7791c204912da8576bc2722eb9e38139c198915986b58a9671fb054a81443553ad74563f587b226a9117c133ddc10dc0655a7d52d493b7b3db9584c49b4d1f41c06665a3d07383057ad70b69f85b6cb2682238120b830681794e042d910467a24091d81322a08aa1d83b0861113756615a119503af837eba16768046b7e64ab5940aad4da6e3165ad036959c39bc69070bd7f074776089aff76b33dcbb17bcbbe65b526c795b65943821d5b52ac1044cca52e3403a02604a1b4d9cc84e4b72b2c136de898a12451d8c74c280a67cabba42dfcbea68455c5f45bd3ec03bbcb3f72604df70737a01683369c8a57091742c60f089a673da350db8ba39c2a1108aa6a4e2a6f24b13d95f004801b240b50067dd34b60991db2a42de3dcb2c24034d0cacd24c890cac7a134bb183c92b5d66c7000a5a3f80898754827c9a7cc01a1550a9cb4f4f18d5959be0ef84c35b54468c55a15d274f996cb74449d1e5b2f88bcb6d00912a9305879bb156bbca9843610af2c5193363177d2b5867240d207819498a98209c109273dd44a4f2a06549335a63afb2660d212592c417b426268485a7e8693f865c0a7960e073153d5e578a74b34e9c3a57eb20fc825ba59e56359a627f358a4d7127be7d571c991078d9630e1262402a731b14b9f0ee4a3fa4494bde9aaf2d4603af1178b8b49a649056fe314caa92df6d816fba591fc4961cf0509d0dbb02ea7321ef75aeb20813e33a9717478be58b49fca3130ea2b54e62fd3243f4e240e54c08d26c5020a9512d2536c486772e725267bba974f3a451bd50f29c55c7189012473ae1e5a7ef35c0b479679f1a71fafb41ca6d16b39f100201bcf2515075a1c9f881a7ae4f4733b149e7c29973588c161616e9918062236332cc67f26a65fc72c78564312c429cd1f3854eb98c0ce91be6d9a24aed0ac65bc5d805490e1d8c86963c8adeb8755e0bcdfa473ee23037673773c46911ce0baf8c81bcd8047a9d19175f6bc31c2997c62c502b934d7651fc51562625538e24b235c4c38cdb82fcea4abaa963b3d67b3679b51a21cbd77228338a95b4d641b5eb26644a58a59abb0a8c0afc8894792b3c6edec9ccf7c29c620b9ca262c634621d225228f1503609b548f0418648cab5b9609e7486d57e5824c538037d32319427a3b077703a7368270c9b752217eb04b912a3843f4afa829b38174bbdd1cadc8c74697544f6229068344441ee2863150716339716ea6a8245a3c3c142b986b7462fa2417a413ab718ceb196f15f887a465c8f901c55db4718ea58c71926ea344c49635149014297275baecc90ad1c95c75281eb885264f11123ad8cd7cf1968e885220f0964f25510539be63263a4eb6169f7319f0086fecf996d2e852f139b500dc1fec8824430505a7702360d81823269ff4b2622b54b7f917bb44714660051c31d9b39494a64a86c15c516437c4a437f41c0fd5922dda52818336d93a8c750203fd859b06e127d8e33b52c34411e4199cb01cbd70b8ef0180b045119129aeb04398841bc8261444c963c3fc11c8dd4c78dc5a8cd902687e36aca5f2667abccdf2093e5ecb1a4f09769a8251104731ee68587d0a470e2ee6ab99d3af13f3177695d9e5b9151d87fed52e287992acb897a07b10ada1dd83409a5ccddabf9d7cfa50a7a2354f7e5cefa6f4a4e9a1c411eb9364506e9e1204a8acb3cb77fbd2c4ed +ciphertext: a63cdfb094b7b97e4a9d4f637a4b2892b308753a34686dde8ad28e5ea9dd44bb0f2b07c030c2bbe2587e1dc8c2247606fa5809d53982cb1bcc18675a7f6ee5323a12a87137236b6347ec7b6c5b188efb541b1f0809abfe697e5a3b8b6f864bbdff986ca416b6b5bac9a5b43358b47368f137a026f12984ad8b2df97ac5b43467526cf1c4766cb2b60784608998fdfd2929113be1c49b8498b03c8a690fe5a8b9797529bd14c128609e037dbe26d1b3fe26438866422c4aa8811dd420ddbc47218c9b923cec43baea872bd5277cf3ed48cba237480515e2e807e2a0999017ae70cc76cb134dfa894f780acd8d5470b055b2a96e58956dae51d001c4c9c8888bc6791f99284737aa613cb9d00dfd31b5d0649e0ff3f11718b89b398d0163227bda245ecc75756867de7beb78d6fd0bb0b713cdaa1d482a6436ba169cbd4783b5241ec44a5af9256ea6e7ae2463489dc80787022d311e900b42a09f43348c055d21af0d486d5b2c6db80f9a89b82adb93682f6e98539acea6520cd7d476b17ddc5697ffc64566445f0f90b8c187c0f904b812c592437472ae0db4b48a2b45f0d699272f7e8243a6e42e68c37c331e7b96dc676e532ddc01458df6fcb2efb17ca4b07039a0f80c7b03078752fbfa6527eb921350894f4d398238c9f8abbeb3aab93da79cda1792123d4af4562d29f05303bd90ecd47dd9940fa6bcd7377ada7b5ec3f0ab7965da90f73734b8728c4dbba594394e0461b291586a09850981b961ad327fc01a578a4cc49ca14d570d15a23989141c9dfef64fb1ca38ebc92654104b983f793cf9a553b6b422c88c7c38c524bd15bfe35559752f20074b0fa631f6d49f973b4553c81c206047f48b49a0fecb63a4868fd32e295e7a56a0e683185748bfa3aaa77676ada8b81ba5d1314574bf17a11c1b58700246a7b323f6ea0840a9db60c2b6ee1f49a06f6b6a11dce4a9d3e8d352fc82700169d1972f65273fd1148d7c9fa978167521922d614de3bef02ae3b17a183245ef9272c1a96329fe592db73821b899cdb93e4f33e31a47d7edf275c7b0921168de50c3984f7ab213682a031fcfca95194483a58053bd644268a2dd82b77ce458c37df183509e32bbd7a6fa64c04df4c91491cee59a2dbb7a3e1202d015d7276d145ec51c8a89e2abcf8125439af8b7a175326995a3f543754fb3b3b7c70094c71a37d1100b8c3bf987dcce3644964e3812b5b7dd913afdd98002692358364a1e9697a1dde2200c886ebd0b3f8faec32c92fdb2e8c83d7b04795baf19da6a54157e75bafe54026001c2e76a31d1c6f92f3906145e57ae1ba3a5c63cf59980f0b5e23555584dfc654167a5995fa4215f19469d1d729bb02523dba785c5ef873f244bc944c920da91bd702c56fa4026ee33cbbac7db1cafa48b2445491e415027824929e0e29be3809e9a3304ce69393b83db0e33155cbb3df4788937ec988c8fdaa704b5dcbf580b0cf125d7d1a540ad382508eaf5c37cdc2a44d63a18b586bbb633223933a49a65c47a98b9 +result: fail +shared_secret: + +# Private key not reduced +private_key: 9d4548bbc5d474e5909a4beb9fe69c38aee7a94dace316a8fe4adf68dcf488c4737f5469f025bdd6378876be73ea5b34119481b8af3389efd937eb5d85a566c8695106645ec3dbebdc24d0c103f30669b2cc09ab763fd5ef2bc16a7ef78eeb863d2c58df1c77fcdded6f298b890493273e4323a49b99d7d64e8aa44f148616aabbaf7680020e406ab7a3450fa8db6d6aaaef560deb8f01ae4073ffd4febc3d2a48afb196d8d03aa8c1aece1d69eee79676448ae658ee98980fdc0b19a513daa2cb4e5ad66afe7706660699dc5de69e45367a6696e9e7e4a38ce656fc47d2e5185142f65a6ba43d892b6f086ac0e6bbcbe1ed4869eb48921936ead6c91ff3af541eb10f36f2c2be37a5bb82b73f47d60be32019d1e93acf5e3466008f60d7677a0fa8f5d2ca85dababc28bf4f3f5faa957b7371685e5fb56f1edb91d66c8ec33f87857ee9edad62d915dcec26fa8a6332cc4d87d937dc801ff773c6664fd74b85eab20ade5e70bfe452a7f323a4e38bc54cf4c6cd294ea65ef48cad8384a957b42895f3692ea3d25fb6320df01574b28aadd45ead8eea45fbdfa8bc79fb621d5d4dbee8eb0577aeac98e0274ffc0f2952170e9bb4bee569b74e92ede9a6da89caca94879c801b43ec115896054750fb7ee1208cdab2dfba8c3f8912bbccc2494a300356041c7ce38d43880b56db58c78ebef1b41ab4d31f7711d5d88fdf32b7b536c00db543be5800accc5b36778038d7f1bf3878258d1817ec179eae63054d3afbe29798bad30eec64238d7e83cec37e7c023b5e7ef4d4555393551e91afd8b7a79a88c37aff711c3c2b79c64d4d5a85ff722643458f4c6cce4cb2556963926c42303c85d87861f4055673b7405c5b6760bb52919f90168c50e7f599b798b2f6fae19f3a387d69d25954c2572bd95d6c761d2932d5a79762ff5e52c8a64c765b232da3ddc38039d7658b1cbdb87d574f0464875b7e5c9585abf8b4b9ca9392cea6ef647063046ddd857f791ec07535d6222f8b8078787975ef5843c175eb86883a73cdf97edc6c6b79cc917cc7e0744b44a9d455cec7a0c829e9b70dc755b8506003a86ee3f7694dafd59344091a8430d4705ddab1dd849b96e7f38ea9bf63696f709532fd49b0833840e373336d9ee9a2fff9e498eb23868ce36db3b3378feaac8730e69642dcd68b4a6b17adc83e4a484efdd7b6fbf46483624207f89a754a73e3a8cf378eea45efa7393a3baabcbe08b23ae9887b973b6c653b1cdd6a5cf89327eff3c365791888b7010795f1cd564294f5b0f647230c669128b9e0865152aab66666ed43cad60decc51a4aa7a1ffd502167b6903ee2e6b8b6c73e35e9eae1b899afca84ca89bcfd49a725184a6bf2f89152f48439aa568d9c18f59f1244de793aece410ce6c0739d89dd5c5ae4508db9936727d49efe7385bf61e9ee910b7dcd572d8689954a50b4e711f9bb170abfed596fe087d53603694ff7bba704e88a9dedf0e64119e9625957e6c585a30b13c44cf97d9bba5d587f85827537688976933569cee793f24733656b97ad6475024cac8a0f760fba36aebffb9096e87ac68dfd26ade8e66dc8773f4eb764d42f73255d675fb7e5cc1fd95c3f6bd0a7d713568b12232135a5896094834cf450d789ba498787368b4e15f1b087a704e8e327d631290177add97c0a0d84820ce367dc515fc362aaa98aa7911a867a3789f69a5b68bbbabf3aabd037b5160a3f3d8277ec47898ff3ba5ddbbca6980b5ad47c59236eb33b2a9c84b212e93d9e70aae78a4f9f6bae592ac2b5f96eee627971d27389905b215869d9f4b706c379aa802b5a99abf754ca9316872f033ecbd5b34f72c610c14037540a2c86ac7eab0c3af84729c48610615c9956751759660b3c7bab57146f7b1088501fe14b2f59141b1bc6302d88a35fe27e0cfa18c1a22a9eb517ca6060f25408d4299a7f46c458b3bc38c4794bda8f9079043854179db0071af69c9f074a83438874c882cd18b69b0b2009497b6fe94a9264470be8256b49b6c353374ad49c04b1276fd484338796e4389a523598f3776291512e25fbb5fe98591320c1bb47c6ef3b4bd1d62b6997b5561bae038854ceeb41b2925c1f1a81a702b57b2815f62aa9eb2625ff3512cf9595073ca623da43f32c21d63297a491b28dd8b1361bbc91b40b34a65f1a2b7db86b0b3bd21b26ca5795b795e355b45d1623b3a9731218174b50966d6937ed057fb10b631a51b7d42072a0845be8553e19901fb0eba35f5142c75857f642918bf24544355c4041102d8b197b429fe548433eac36c42077ed787f8e631edb856d4398a26d536911ebbd9f9c22769c756f858d180b6b51797fe9ec0833c908d9ab2730d937b76a0febb68fd84372c96c3c05197093e26d01219c15f898b2c7ac75d11485a2a413a065be744e0908b6340155a244838ddb14b74c578fca2d7e6c4e15e68421a568e7e39a4a04231926768ac4a061d67550a8512e780198738bf3e2420cf75680d1cac07798c01ca06102cb2ae5c9b99b62a7349fc8a2c558989b68e3789c2c7074b476d18212846c8a8d562166829a36587eafc95a362874e812aa951a6995f5a94d370afc9b64777a7e58cb54b62a95476ccd323073d6e466e6ab909b4b4cd840aff393c9391902f4c05bea833d254207cfe938669cbee478c57ff4424004003d151fe5e90413924bf1378419e08dbc46911e2ab2b7f45dcde5c549f679691632c3d9bae26b9fdb85c7bc3301a3900386873345974bdc007f869155df79cfc6f06c39d8bc9a99675382358ba25836a15cc222ae78e4a85a19c5da9912e48128fb37a7f386c0fc86afcd2869e292ca9b521e6ef9b12908ca5d800ae1a7a3a7070766e2802a947c7edb3452a377d9c1bcdb152d37db41ce7c74c36b32c59131b1b85f9b68a3b66773ee4a2b81f12509c33cdaab4caa563e9bfb3cd9c4c72354c1e88423f94169e18bab1a9798cb99031ff852e79229630c8f35459bf40c425af7cb0843498a3cc7fda53d932a07382018de07808aac2b4d60a1e242beffb89489ba69a6a26446180103c11f7b22361f651777b997b76ca8f5a25b97291058620ee5479e92aabb218444aee52e5c8294d578c709158f655a8930fc197f765fb3790bd62a5fe11b57f273775da27fc1b5128663c623f5175513b753543bd71aa045e77e4bd42b7e7baa5ab2c4d3c41f4db84af265acecd4906fab897b5abf5af66b4c4a0b4e783b417c6fadd71d34ea294ccf8b8c8012edb8badb3437b191165cd639bcde9eb71378e71fb551293a7acfc3d283541d985e0abd85eba5315a17d6c4a7e4f248673da60c341c29fef072d9b5a99f9c7a0a011e4dc10f6b600d611f40bba75071e7bee61d23fd5eda +ciphertext: 07ff98c23d28846d4b8593dc2723f03694a5fdf7ae5770307a971e8aa7a83db47b5f9606c68e1b0a9d8d10ae26be23993f8e804c6851292c6c54ccd1a178084f8ad379eb43cbb0974fa2f5cdac3eb90a06e844be6030af49e5405be461d01598f264260e42e5c3ac1b5d9ab05bb5ad77acd5fee7356e89f5a1822ab5afeff2474bc562990e71bf0e6e1b720e59da9fafdae4d67ac58534dd33612c66c468fd9a9768dd6d6a18ced44bf35cd2887cd664176f08f1c9b0a122b7330ccc37a7ab99d5d57ee7ec4b7ead85a7a789bc6e4124e4541687399e3feb3036554ff903a595ae2d09b1abb496390da90c49171fcaba63d32d5816b43c9efa88c1a9065056a526f139291024abbc01af22511032e93f89caf7f67bf180201263a9714f335ab3808c0c3c85a9b4c9daeff295f7600287db1cb6014f34c6878d60eead25ebd39c5b27b1d5b8067b419abafdfcdc766db126026110f2b52821edb2895ceefa379a509e1c29b885582c216a3e3a7e88c0b15fa53a1bc4a2c3811d5716bb0a68a0ce08ef73a1cfc7601eebd70471e18a9e63dcbadf4a2f514e3edfc9a0ffd5226545f9798fd1588d9101334cad0a84298abf9d892c2be45398c0c67a1c912ff6c5daf42343da7d2d6f0f4f37d5218d46565a47b83cfc84dd0a76a6c86eb77dd99fa003bdbdffcdb1005160803ddf0d499a362e3c31e77491b9253b4fe3325e217676a2b6f525ed75810c37ac6c09bc9df8f9c966184f5fa3a123fccc4cdf24b886c6d7f5fec31ea0611bb3c43a2cf51b50afab8cea581a2a9e9214e7981735e8ebe4eaa8e8a44db119bcf4243d0b1a86a2150e02be402d61b98ef77cb462c8dbf55c2153ddefd08641a0d76d8bd301a59103f65018abfac4a538c12723269589d5910f658eb3c6041fa8c0c5e7bbb389f491a0c01a1853917f393ae5d90ec14c1d71d7b1088b808818d430f83d76b1d6722ab89610a7d39f13d9931ccf3c90a91f28fa8d9b00120456239aaa0ea648c1c7221122c65c822e879731cfcba33720a2ab082029ad22b2499e399c11de442bf090f416023bca3c99396a03d1480ed3cbf78b1efa5ed494baacd544c2531d51c252983acdb3b405366f88ab5957ee476fbb006caed7cb148de870247f70502f75e52b89916a14d43d11f7bea21734e3e5658109db2096ec2941adb83298b36640d81a867118a2d2d6d29f713a7d359cd3965254f05cc272077359d8601231fe4e51f72136631e2ac8269a8732413fcd39e7d5bf0793a88b69c4d86986fd2e5d2220f7059efa44a2826326e5a775a8d88965078645bef91b8d4e0c70c62964c04eca0710f12c65f6e315af8602ab8ceb13db5e4658f08b4fd8bd041117f6d1c1a4d39d4af92ee05310ab0158d8db145fe91d87d1ffea0beef800237c02ba58e61df6bf2d09f3cf271d1ef4276e09d6a8182441c8f94993a31030c025c015e9b6e918c776464a1783b1c54b34b6d2338f35871f717414f85ade6d528695f6fb7229e1a9cc1c6ec8ef89c18a7abdc43147f32c +result: fail +shared_secret: + +# Private key not reduced +private_key: b24eb7d0d3c420b8548eba8e72ffa75198f024af938a16f8fea97eacc45bd20adf89f485e57355e9c58b5774651aef53816d924e9d32508a508a8a36392f54b598de77248c6734c7f94ec30993dce19898244ee6c058f889cd3378b5946eb53e4a59b190c6fdbcae73d4297405f9cd189c76fbbbd786fac8a0f9deb3e8ad68a7f6b1f8b32117509436d776ee43cffafc22a5aaec749e7d8dd2cfe8ab16345adae43b6dad4bdd2e632f799c77da62765e84c51b353593d277d83ed07574ff8a478c06a7dd8e7affff684d0d784875e16fb8755dfe3d1985de01bae6523fc2845ced284d9d975bb2b0c97ffd8ff2db4be3d47c8a5fffddd147307bdc65b3ab91bd6481e17686d3fe534c0c73fb633260a3da93cf5adeccfbbe1f99185439d19eeea303551e0879d825ccb08b7e307ba37b8438552e5ebcdaeebb3f37da5d80c317979da65172146645a543ba045f1395e7820f8669c9b4cddfe7d5ba8586ae495d75fdd89b402c97d43e285d3b0c72eac388960367a428bd3e7a903ffbbd846e4df2b33180843376fec9af398975faca43abda16bfbcf804c340176401deb80e39959747fb5348ddf0d6eac3fda17586e6825c8a409dcf227ca44fc88e8618e6233fb1b5b882017843a6c6eafa5e93b6375951ca70ade7a525633c75333450cbb38338a49309999018dd99a788436d47426cc89146b4b0ed79fec981884a4bb2af7931074a88bc9bc137ec41ffa8b7aebc0ca4a24e8ed24bc7acc077b97cc47532efede9f94fa8dbc522f78f698c77078788f6e9df67a661095b942cc5a349076e79ea90139cbf9d3fe6ca4c704f9992fb8af13c0b97d2bc5fc359ea6cd3bc599c9eb5de469c3a3efc14b7c71fdc4a85481cd86d8c3bff525edab1cccd55458bada4f2bae77c1d544cc52c94d1effd2e9783165548ba05eabd05b490a6f6da8991fb48cb83bdc3a25b34f3c57a547d39dcad31857b40023b6ab8baa64c5f34dc64d3bdf3aa647ca09bec6f32148e99db47c8de41edd7dc804b722559caa82e4184ba97baa8d2a86d4604f9d510295b222d4b22955402ea572b2fe22205ade3de524e57b85acaceb777d86ffef18fe5ef4799be7374e37b364dd2f832e883e605c9c69f4848b3237b51ac791d4a5a3ecaa5eedf9de914e2cb6fc5556a6389ec98948735e26f745f383c9c59a99764583d19c72255454b568b909ade0828b7dd235dc02f68417cebe75df8960660a01ef2c0b492169954d03dea7d654e2164eeebe5448c0e75daced314397a673f865cfcc055e566b476be03773781b35842b6583115f00e1cad7475bf95355268baecfb1c7c16a68d2c38b92b6841c0b545c5e972dd7794110b5d34cbafc9678e67eed0ab1c6a1e0b5c272e48f83d762086bb80ede7aeb3d69ef76c72dee0db4c80cb2c4fdc8c779496f23a2d731906cb4553a00b5dda3878afa719d79354a7f3e3795ae77698668fab278688f3b21558306ee684490eb626cde7203ab716eee0fd636f4fa3c2c3c56ed43879468c9cca379d3cc771989d8c54875b0ab7b35ec8b774b5ad15d3ca7539eb1cfbf01a959b582e56586d6dbc9b8f1d1f4eb8a57c6146b1932cd19a0a94ea266f441b6521be99161877b30c011788cb97cb439789a67d476d3dd265cae63cbe43cb63aa124b93071d6812bc662f346481f974a73b16a505c48b9608359a3c035135258029a18b0217461830785379d3355ff3968d3c63a46685902425660b232b11b93997e60ae0a5bb95a27d553081f393040b1c30ec87535ffc6fe528b1e9866cd1e69520e376e0071087748691dcc057b95cd4c60707d8b976d6a67af4869d960d5466a9f3251dde92cfe8a0b03ea2c43bf03fabc9c9b5d97ea2f558b2bc0ec1908335ca4f2607cb04380a830b245f8b43fd06098269bf9ce33fc07c1e68a05f63560d70544eea4c0bc528859a5b09683b8b3d3c6842e6458061b7ddc4b23ec6ae83d557e5c4b1848445fe253b35e52102517cd38030e6ea28a5e1a24bd09ac6b83c5dc658d11589900a7bb09a963480a2d76225ae55bc54108fb233785174b375a184eba110e05762e7f26139dca4cb197620156c06e47e5b74a0970bc6e18b1e1c919a6c0b10e7470d5ce09e2719194da0440ac3aacd86bf724aa841a83dcf64c8e1f7704397a4cd57bbabc9a0cf940e97e8921211006044228632382ef48fb5d3b65219a5a6983ad0e48ee39081f2ba1103bc9c6314090a31aa34213c0c319eead96b865cbc98327570b965bf00cb9bac18c640273d342cedd11d72e2078399c458068439a8a27e388d3f4bb285b63992b5a4354122ac298222e39d31cb886c4958f28c5c2f37384632b4db216b43ca6246051fd704b5969c07dbd525ac6a479e730f8b11c5d41111ac65764fd71a4f43be55c563cee5c26c69cdaa485d850c2126f2bb16f5766fe86bce17535198ce99c2a66918af96641b2ec74be2b61752076a2db330984ccd7021ce360a0c488143648389f492ba20ac566cf401383a496991497208b760d36da6896bb3587788597191c3347539be92b78cc6a2b0d8eb4188320ceb8aa6ee1018e9f78f4f8097ae7527ec947cb1b27dc8a86ee200020127531273983bf66746a7b731464a6b1524b18744a8c606648b2fb1a4339d5a15d7f6a5ea3a1c08122b773ab09564792fba2e28719a603c3ed0850f2d5045de3bb93dda7a84e692c25537ef695787fb0889107395f87c6b836e138bba9f4a711daa421a396f556c26e3778f4d364d5b1844118b367d78af37836fd7a9637f1714cd9a3e52155b0047468b5420cd5c6bb64138ba16863e18b4368542800b378537b5cf303cd2b191ccf783719142ffac1ad0585b1938281ceb5c86587c43b28c49d9111982ba7ac567e1fb64d8e3c450730305cc2e4e12cc698a728977cf1c9b373f051c17f1935177ae90aa8856a5a24d18a08aa942b4250a6447c35289cf0b334af45647e21b5a2153a8a05a38ac4c728a3350a15502cba347a876cc4bd12034935bb3dc14435930d912aac8a787db3ca33521637c5159b015920100b416d22c18d6a0a52612c7d75c15741b6954ae752c4d31fbaf1b483b6b6862e6a983d5465e3b7b80e1654faca5c669e77295f86263d344031b5ea7ab99e714c0a821042bd9512677ab9e89309f41cf47944da1801521402f211a6076490ae393818ea2056954b24a624e6e54acb7d5bbb32c14b339730af6a72647a66f761bbb78012a76540763cb29dcb9b8c27a3c1e43769c31af3ef54f7c8062d713cab3803437e759a01ee76fba1a5b21916dfe025b78fc6d4dd1d1541b51cd3eecca90ae52177431b33c708faf17b55a4d0a8a41c4f666854e9b13673071ceb2fd61def9a850c211e7c50071b1ddad +ciphertext: 90739b108d664dcc63c20ad1f2f37658b96f819a6f7801b7049e8c2bd4ee750da7d7f1b8dd47c2147ee4e282af69cc1aeeab6a8959c0a714aefb3625ba5c057c120943b5bc7b96b7bd2e8f7337bdf6fae024a2aa667c556c7f7fc62bb303e898a3f73fa2b0757302cbcf3097e56b123fb920ae88b49ea1f76008564f2f0ff54fc6e36979239d446ff38d85f84fa82a4a3624a98a37f29651613cfdc323e7fba7a913997fe19d0e5e0f825a89cb37e423f348a1d78159a90ea4aa0193c4c7ee86146e3352c80341757c2ace339fc739b33313bf3dc5b53941772e782eadcb558ed4ce7e14ec16334eca20c7d12024e47570156955b38a30e817eb139c00969005013f941bdb7da9476a29148599e679154c13b23ad1491e5c9c1b3f04e2ba290c3b7cff7bb019793f358abe6353bb6824bddd156e1d97696a8b7e32aa8a39226a29cecb496198885ff3e3671f9dec9f443c45d5fde1d1bf1ad9b54062566aa9fd87b318b6c74a2f78eff5205505321a71c3a6a1254a90c39c39d44783a8d3006744802cd64b6b5379bdd8184f6362709e8a6faececd89e25e88295e509dd8f20514c3487e20d5d32da32693146e23dac996f7b019ad79c6abc01b617f2669d92881f8565c95e3c6193c4e813fa11313221526b54c795841c115544b81903801b6507662f2fcae5feb9a4e6903411a69e5453ef822f8efc570e82b94c28a97038c32e4c08db304dff48ce7273cf1d8bef89fba35d886e05703dd5f839bb253b641fe631adaaf43e53ae0e62ef827636cb3cc7a579ce09a0b184621d147470ca5d92a97baee9dd4c1200fe0206fb50081472d9abd3b592c98cb799044b201bc2db832e83f0727018b60a69a640fd67f095d9f2e1bc42d33e673220d5f6d86b2f3e1d1d63ff39c9ed1379dc75c2b3265993eae102373945b049ae2be4b54c039029dc1680b89313ab027fa1196010d0ac8cf29ec39348a1e559eafb3d29d346802a8eb485dba3d6b9cb7ba93e1e4dfa79950d9756ef0dbbb4aaacb902a4c21c02a7a606b4214c8108949ec7c089aad9a63aed4778af6a779ba4b1df5039ceea017fe80fe590cb761ad940609c9716a1e21fd0db62039a9a21cd0d8b265e350f61a982eb167629c79483c5f23791f0b20b39c119acb3f18cfa9ce2aa03981deed204c9c4e9bfb8e404f1899890262c6183bab1133541a4248a7a7e70ace70fdc5bdb21be1aeb020117f635f2970b7497d23197969e9138a5e50f81a752b1a4b22f0199cb53503344d0bd4d90bb3c52dd3cb58cb96d477e8fbc237370a5a17f0665b942363370cd5d5801199015a5430bb23165fefe3eab656facfc5d023fb0f0016493b801cadeec5315383aae86721bde15061f17e4d775b8497b3de3684004d8c960dcca5ca0464a4f60a43893cc75299a477897c580d434c44507afbfc5760839061d481dd264f6a3f07347ebffceeebeac27dccda8d3cfd377a29426c29d57d2367a781801cb227695e657295113a6d91ceda67db4af71f0317a6ca9e206fe08f +result: fail +shared_secret: + +# Private key not reduced +private_key: 5e74b834cd808f44300017c6b2773ff7569ccca7e2516f3711fdec7aff457f67fdc1a8c9e23bbabf1be6de993a063931936a4d6f5af2e1a6e949ba5df2e3aa07693ed38bfb9d98668029e2326fbe5a2cf907e35d0edbf58dbd34e4489ff26e6d5f6b83a7877e0cdc5ed4677d859f4382beaac175377b4b953863b296d6d1150f81d9d5889f649d3a4c8c2ad662bcf8e753b85d26fbd58b7536ab98afbd4a969bdf6db88ebb40d980b0ef49ae56aea88b59f2bf8dd3f99ea3e6b8e0ffbc91544f7173595fac70c0e5dedec867ba0e88f165c8b27f5a00a45407ee8d243bff63f7736f68c13c5b9606f7d0f9d3cc64fcda9497fadb04437cfb7ed36f3eadfbe1da48f785c74d96c96647e482e8bbec9af58cbcac5d484ecad8e6a80038f19bfe5baabac6d2e88459acfb84ae307a03ad2d4791bcfc767dd36b810ca63a75874867498365e4fcf4c0b7d3b06da5dcb2bf6b69b8abe476d2a0afb66966501f6c812cbf4834c3b72bdada999e3816737385df9a3f7d327f86bcf85aa92d393a5e5e6b2aa49694f3f845c559ceb89f645eb825baa59a1eeefe9558da35a05b4537d01c6ce8b88eaf796b36a35c9e04eedef86ef4bc695424bb63fa5cb4533abf2497d49d57652bf2aa8d6b20a9a4de6d75cdba87c14d51219a8c7fbc564ca84f1e5ebaac7bbbb8cbf118a9de51387270edc4ed5eaa4488dd5e76e6a0fe7313efe4e4e9d8e856eb2d0d4557f75ee74988a0ef3612875f02046ea6a6604c6c74dc746bb8cd8ad8fc324be971359ca32e17864987712235f57a03e24be35a3483bcfd1e35c0ec9a34b67ce6ffd291be3d5e8a601e55633c154a83d65e1fad3d8da88bf587542979df848bb314b664c95ea266a880f68c8b6ace84c773cbd73a3e32556207f432ebaef6e6e778d76638607c341ac4fb61d59d4be986e686474878a4d44cd877599689b3524716ef992f938435de794d8b7633da5485486cf7db076447bfa6f63d0d58bb455cb5aded4c99a00ec3e6d4ec3540e6cd269b3093d6e23d855fff86ee2e394e4204366e8ae32425978a0561a5ef347df685c5b6b7d39ecb3e0970ddba9bf9166a91f5cfec7c751bc793a584e8152ec07e854103b4c5943cb3f89372e23cb98f75bae819c71de64a99be45794a6b0073d0f95ec5581a30293542ee4482fa8987dd1ad0bab3a9882af92618724d9ce6438ebca6b9d3caf5c52c3eb3f44ea5f46f6d304431915ffabe1f9f2e67768245fc4ca4f713aafb77a362043cc1af5737af86ea63ff71620e8d7608e47eff5c197fa25cc8e243aca20fa738fcaf4d708c7f2e7ed42258ef3ad74062dff141b7a448ec8bf777ded198c0eb7f456577e08cf56991d47069e6a663acfdca8c95086c8d3a5cc49e294400bcc2fcc39c5b673ad1f6f48204969af47a4b036fe7478ea16349a4b49b857469d115be02cf662afc5880d5924ba498e353597157b559343849ffccf4fce7951943b39cac83bb52c5665ffd26e8bcd6446929cfdb1e4ca3c554c6b9821b6b85084873a4cfde5dd8486aa7b592beb6f7b83b585c9112884756386a36ad4f60b7428affd6f2994d8c66e85b1698c0583717368f7ca58e7645d90baf62d0fdb93b0ff3dac695d23b1a80b6c91017009cfa4925f3cca1b97d1a820b204a4ad5f4bb2147307a5350d0244ca20102b8f800c924bdb5667a5866303ed52e27c932a1d84c637c707537409fcb7515f195e557920ff79a3001354cea327f274edcbb99e66acda0aac52dc503717a3b24786afca70dd84c7c4ed1c1b3ac454c832caa687bef8a96bf6c1182f5c663c1ada4784654393d4c83219c149e31fb0ec1e9afc4297968c80209594aa567c65000a883b32e3fb82d9eeb4e9af65ca4fc0cc1ec794eb2b7ede1a5556474f3b023c45b5d8712109a2281f4527a4bbc8262c9bedd0758116643bc6a85f836825541767595c0b54516a330137f0724a1b232cf0a399e0478f732c543f81b9d05c7f5b086c64291b2d94cf02462df7c0f43eb06319265ae25656b462f1445ca5299166731b114e8458a0a0361b135e6002315b65b337304404a907f3c1d41ec9220055939e11f263186c3751f96d750f3a8588ee14f40b09178368ef03a9526a5444be096c3da8a7441638f64b4fd201e31b34f2c456ec89890f53c9a25b559b47856053227e3b36c16297949c6b11159a79a4344f0759c7071a738eb0f80c25ec2f0a2efe614c7766c9dd68fb488c4e514769d9b6be2d59e9c9cba6b5b1dbc9b0d8e5c7078663794fb4eb8c7060bc1b61286cb173ab6a80952424423746bc91bc953b67908bb34226eb382bd54bcbbf5c60e467652728186c357b3fba85f6b8553c79c730ba51ab90d06ea9edd407b89e0c0a4276ea3698ee5e6a8348a2f9f571c2b7b93f5eab702f1acc3480bbb223e68361fd89a57d1716fc8c99ff43734fc58969d35077f5bb422b859b271b085f41394f28b416565d2f90848216ade3cab7c205ef2f47d8b50b9152a9ba6032322e737089a1e5152387e3437d2190cb9e394bbb6857a1b1ead7a3d7118b0ab8367ba1cc09f910518420a46a18271408121db5dcb0670ed789d537ba3639c530a720ed9f40c023c75b1a8261b6c0192b14843252cb8d713c8736b34daacfa235c9a51468dbaa6f2e4507711344b5a722ae46a70e683c42a9056ecac5d143f9929006bb168ff2ac983ca8b1d99cfc1c8cd919b282eb921eafab2a778b227968f77ec885077ceb7bb5fa13884b6a4bac782b31f250569e0671396b780e810e4a34416166c18c4204ac4124c1020064a257c32369c892420510811f28872d59cf8db48f2a1510a5895a09c008be695699a4845210777146b56093d36960d6c36860cec578de3688bf338a28118a67833f5c4c7d93b8867d93ea7aa99a3743434d236d786cd8e617791bc5452c88e70f1189d5004e17146f3c69c60682c11e78b06b2c0815bb889a17a15eb1d985b601e6c04604cce34b13d82a328f61c2dddaaa25fd9ae0dc83962c0887e392a25c8657d61cc2ffc980d4cc4c9557e7dec446828b03e8bc9a1355dc32b1c06d504cf613235b6b9b1b04c0ed550545bc37e7000a2366786da49d637ceb5c4273041706597236be0a7213cb0394282aa998411e1236ab964a7998055a183dcc4ce765b8756760fff965d2b7c5adc272ef1d3b214b4ac9b543e0f24876e773edc54c105892cd882848fcb039e5223d0c68fa204cfdb793c5ee56659932cab213cd4eb18fa4b045103a1e865b0c567574e523be27974b08adec6d539f37479c61fe8d8c48f62011fbd5a1c10713d42a00a79ae7672e5e321872971f24ff71ed754178d6336b817736cbc5f7b1dd6eef5fe6332fb1a598f3871e5470d440fd2ea631da28a +ciphertext: c2ae583a3b4928851e1ceac877a2b061b9ce589c4a2eb6ddcb36e3621e558ab8ff4645e43144e8b58368c151f7eac2300b060e1e7a30718f96edb79aa71acfb804e3013cdbf19e10549594a37396e364c01f0377f675f4866c4be24a2cc513f07edb6ab0c205efe71eea5d9517c39f897ff4345f63a3c88c258582a4747a744c2330394efcff592ac8df852a7d9ff5d7ba994ea7935075a17bff2626849f1ef4b9097008753b814298c6d9603e7505cc0ca7bd69346edae4e9a360fbef3fd8f7b6d604c22677198578a52fd6f5e67230dd792ed9980bacce91e50214c58a2ac1e43f17e8f57670040a7fb86242a2e9fa63d8530a9fdd2059d690b994673027577db5740c8b1089deeea7bac8c2c658f77235cd9f021bd04d38c94c091cba130060850e8743dfec89b6ec2beb45f21a12bccaa3fc0cc130ca99befb6f14584f3a836f56d8ceccbf9f2e51a2254bd2621bdb7fa1829918fe49fe16a95c6d49c2a3508de93bae8a1ae832620e3929382a1c3ae8bc940df65dca1d7f7dbafa3b764422d07a8b3e5d7c0071aa20c36c87c624148d158e0ef3bf8edb698408cdead41dd99d76b2ef8dabfc2cc8331483db9f6c2a7053c1df415c7621bb3cf9ac8370bcbbc8b9305433e2b32ef8bebf615ffc1987879e3ba5bb3a6c57d42896d30cbbe63652c247c47002b879864ec0ae1e79477a5d7174ab3d10e03aa1eaf3688a287d0f0b57c923d2d3b63bc744f922bbbe6d7755beb6c4be7966034cbc917edd85d07a3a725c8e8fb0373582278a0ff79cfd0260138c7c1c890b7171ac99f7377f1f7ceed581d30700b70a9198dca6bf5406fd9e7b04ce809261a3dd0cc32e1e4c92ade1de79413e3616e371fc3a1530c85b687e93e326b98fc767b81c7409f88ff44647a6fa63a3d195b8733f2e13097502b1b712039a59cae990013251564d3421ec1ff48b07fcd5cfbb089210ece5f9841cad8f188b5774a769a8a8eb43c2e122db423630777ab36fb68443a72a76ebd9db6475765678d94150acd6a788f08f243879c8cc9ac27e766a631bffc106444e2f2faa91b5cc5b09cacc8a9f179200c81561c078554c9feb8aa018173b966349100f3499b1986875726ecbfb48abae2d2c205ace430e350a28db81f90d0c7b23526cd2809b721f34c0b46a1a078be7e2a3cea00996495c99911cfd759d6b0c7c6154b20a977e4a8aa7237bafd2f55c590ee6c85ea595d661d44d32f222ecc479305726f6347d58fe100141edacdd9b3cdf01785f6830b80db7478885201cbb445a1385877e0b5020a2acb849d1cf379002ee78d275f37cd518695ecb6a653eb1c1310d3fc5584e6ec663c495dac1dfff668cd35a4ba78f34cec527e4e6e81a3a9f78274729049b2f6713968ed0ba237f4c0d197d0e7d06447ca3dcb3c13e8feeb14fb68e1cc206fbb8e94fb6190a56669cb901dbe770f9b3a2b6497e1346d0ef60acf9e2c0ae082fb364b9ce7912abfdbf300f3896057a130c7cc089ba3fecb416cc40ce3149599a68aca244b38bc605 +result: fail +shared_secret: + +# Private key not reduced +private_key: c2bcc42e0adcaf63bae16fa1b24ff1155e9cc514d490ff6ee74bf08d659519af86dd5eec30a7f93d79bfe04790f8b87c1dca42059c447ca5a382733c2765db41a367e29e75e084c49b9bc5b9deace0eb4ef3cff0f18792927ea10d5a9a46c8b89ccba3b243572088df695eb01dbd6ef61f7100c4ca44d6e88aa3af8e875b863e7f47797d6d699e6e6e9442bf6fee97e86349fff455413ea78d5395fd5b19361cf8f4335edadc6ba90793cd343d444c8fa06da38a132aeca91756848ca59f3ddc871dec22de9a7b5a40692a979bd351ff24d277fe76cafe89e3499d067cb054f9a5735f36abcae48dfd5a539675331352834ca583c8d29c764ebf8f9cbeb934ba76bf3e75a1a3bda65b879cb0b881dda38487558aded3e029783ba7ccc94ac8796a0d494537f4c307310689d748d57102236f4e9cc415aae4a14fcc4c6986ed5c4028bf8053d673f438e1b4e54fd635d7115b990849a9c3ea6153c4d5b6c73f27f6755db5c48986eda376ca0513ee027b6a35cef117ab8cdd1965cb958e6e0a7a8f9b8a781bdd076f5ae7b8b5d2e97510c3c8a4cde0b475d6db23ad9905dad344fdf563c2ccd951a8fd446d68fccc97faac034a27b9d8235d6af8acc3604febcfdd3f1dbba19507c17688965b69e76573d88cd44dfcbca8a60baff48fb1609ef768d4ed3ab6f27c86de78fbc5e829eb01e697114e64d9cebdd2133aa32f886263a573cb3d18743ebaf7abc486c5ad24cdd88df50ff860adfd5a88cb464088cf23d8ff9a29e833a780ef44bbf6ad6cf154ffcffa547ffb354c8476c0c8e35c6abff733c30f38a3ff43ea836492ba26c668b679da54463b68573d566de98afb4a53cf972ea6a5a74940fe90b5c9a7ea73d1a0dec3a4dbc396ddb254d8df7b5668e6074fb0bccbaba8e1011bec42d559839f8d604ac9f3b5c0a3888cbce54cf1eeae0ca9e4fb5474ec29492ddebef2537c4e3837ffabb058993c40eee253e87e15e84451269b6a48911ffe5e508f606a475cac04f1ed6796ac04af07633b6ea63af927c612bd7dda3fbd0ce852c4b785f7348fe39d6eafc76c3df8706735813ff796af5e837c198e2eeccbd0a64b4525420998f35184dfb74e4363976ddbe5c303af9dcd93f27083fe2c6abea1969e8b17ce2b28d7abff485e7bd7e3a7419c6de9b827fa3fadb7907a70589a88ceee6d1b043d798586106f3b95645ca2afeac91d9870758016a5bdf37acaa273c18b6944d1aeea0d255b4f9580e3c5d383f93bb797ef40cfb281ff871b2ce7b2c74b9368773ab747ec2b8720a9e0cfa859243b7a75288c163ba025fb667025433c1fc471e7c9642c4ab105413e0641d7e961b3fa462ec797d6a9cec7bbeef6a64b5d5869c4e6c3ec884afb87b2a98eea470e4dad93dfcc195dcc5b96635fc5a45d561b0359f0dd7df9a4b4bfc39ae654ecd70b57a57e8d56adbfd8f979c1edee31787afcbea8c2a87e5a7b70d8976ae58e4951edde9999f704aee1eebfe994ce7fb117d34faa65861756845da48dc4bb3c1f4b032b35eeefba322e62b67d67ab245533177dae67894349327663c32acfa7531df327be8cc61becd1098969de8168bbbcab459f4a5ce8f63a7dd0e9ca68f43a669f484f27944614c35d121bf2390402bc93797055936a2d49699cdeec2f29413403aa1024d802d97c54aa316707c26a0b432821f63cd89a87f769597cec8356c2c399d3a34115cca89b9df6a55e4556a3b2150b51907ce67b860f697a65b199b370691fdcb31cf7937d1524bef41a0732cfdf464175c95d9092176ce52814d3a9231114cc31718755ccd3a7b3fe69b4290175dc440cd38c69faecb190ca684fb1001b5308fb4c1ff6a55b4be8814d602ec59c2deed654c93a45d55a3e020800e98aa786c76fcf33cea3a7bdbffa5037a171044b1b74d6094d1a3b606009b4fb0f060b6dd1d29ae67ab90c90c25db895c9515fe0a17bdd69c6773518a532ae8ac731e32155500204dae2c9284cc16f61b5a9e48334859357506e2c391d1bd38865ea489e492d8b847a6a50ba074320fa32074d89894324a705dba4e1847a5059645c77063809cbf3cb0555b6be4069c77b10a6c6f67ae1e7c09d603e87a34acd3b814d7b4798dc05acba65220289772abdbd89403e698f3556511e152bc0f77509dc36803b57d08129951ac44ecc49f43b7cfe8436baa8b5376999f6442293352e76ac592b95804217817ad5a75a76caa72172df9c69da4c170e937a69d93f12c7b533d4bce41b34d0cc8a1c969947db2c21a960d975ac029280ecbb527654a42385576286915d4b8f3fd163f0cb280736bee89786fa277c8487b0820416985855a95a10647059cf34c08915985c32321b5b8b45a468cd4253c662847eea36fb238098f059630cac83aa70cc9596cc1a0406e993b737c236e78cfbea1191d60fc6428fe7090997f1ab41c13e0c57a256a813bc559ad1e6ad10dc3cf43a64dae2955f03b46a09ac6ee30326d95d6ca8b80e61aab77579c017a1906279ac09766bd8a1b40b24d8bc4deefaab47f9c14a8441eb413dbd718e5122ae7beb94f526a31bda25d893a544670d994530d3c6ca29879085870f6d54192b1a7fd63193c7423be4867d2c134683ba25f9240e0fa2a96b47c5ac05b541c2980f51557989b3eba42dad002412f462acf75b141c5fc320bdafd3c11be291eafc04d6b5a1d4117c7703c313eaa30477253e938764364b25d859aca263962c5d6d898ada856b70e151dfa41289213acda6cdb5241bc7067bee5cb467c34d2b0a6ded6aa746290ee2e40b7be1294c583aaf415dd03213a3cb2e41f10731823e749acbc53767c12b93d8f32257a54c6a71b2041a167d685f0bf789b94b277f1b60af22c09b639ac72ca25b1c69b855bed6377126999c5708789091cedce768b253ccae981715c8922dc9562ea8a0ba102b02585281b15c7e44339cf630529c1b076106ee2b5c7be0181ce43d397a398c8547da703e2ab47bc15284f4c6a50dcb904ec9c1f60a1aeef38435997871e8501d4832bbb2a3354c70d9579f237427135329cda32573089687d9a9130375bf66ac321113a25a08aa75cb667635455a93eae7a0a6703a2dc0a85637681ecb097f1b16b2b331210b6288b13f5752bb6c731adab30ca051a817099095022892d923f571b8d879c8ddf0ab03145a32298dc6b644b25640d808006e3113accc6a0c1ccb05ec273e6b6559e287539c72d754ba9bc48c915acebb656e3cb7713e9bfc0bb6f311485ebaa078b78a737d81d38d368c220eb0e982fb0bd8a7ed97ed3d1dd05854a6542b24090a680b9aa9d6c65ef31cf1f4f5708affafeb2e398975d12195ec32a8686d0600e45d4a7f54219b0d7a3826d193a51b9156ecf2edd6 +ciphertext: 9741b66dca7f6250ac69e4d8ef7a7cde4421c8442651077d9a1ec366f49aec28e744cc924bd3cb8adb85564aa554a21d9ce485388293780d9a1e047c9da49823436a94461bfe2b4c4ac4d51af950e506c5bd4ca6da9c04262bb2b464b208c3686edfa29a512c2fe88e1de7faaa7176001ecfbe8303d779bb47bf92761e724cf12048708b21ae7dbdcacad7f977bc6a66264b648d7570460532966da05f9d950ce5fad36a9b0ee44e27ad922316833e6a18a8eea01c052a3b49eee2818634fc812c37837f0a09a42e65a5b124aff7f00c3b2e1e48523c643659a70a7651a92fc3f4340c3a5e0257859826f0fc9deab7f56258821d1638dc3ddf5fc1240469e6c7d4ff73d33758f39bea68f95449909551f8cf074b59e9d616657f2a6a336c1f5205e17f533c6b717e674f9774183d18446754d971d038d6cbcc51adc15f3e672fc612628eaeb8d0ee394a8044277b77bd1924046adfe1a5f12d778db4f09b8327497f6960d8a799935c2e9fe637570fe96280dafe0ae466cdf85633f3c926dca5eaffa5033227812aeffca6613138ecf47c1d5f06954b84feb8a580f964b1945448728ed02a0bfb6d7ec93d68eada6e34d7b4c084b36b4ef9dfcb5d7f04d0c10230889fc693303db3b45d4ed85d345ea161619b726de8a594ec59341e225401a0aa26a9937a5659e43d6af3232f985bb973857f88be76693343f34741db8cee47764c0dd96590d3abb71ed5afefc3b347540336a838703f658663c7d39cf338d8a023808bdae67f7adfccfb193e2324ff886218557504ad6dc63c86532a413b19c575001a527366e8d188c94797cc56a1c0b3184eb6b739700c9a36e03c3964ed2eca1de3b5c4d8b71c783ababc95a60e783a53e245fc7a8f6c1e7f0793b6660e250f1bb62ede38abd359b872cb033a434258c0255bb69af3f7529ecb5dbe342ddeac1e841ecb95bc312c8499b757c38d05592fdb5ff04e2b0cbf3ec766e6f6f37e7cb0f250a10fed900ab73eb61028c4e70aa8c9d763cbe9e13deff0fa2b0459962233f4ed514b8b8aec33e39cf7547aaa2b9f796da64c18e2245ed36b4e0d1dd62e3474eb4704016631f778906f4e7f6e9f45537cf8acbbc3df179090c1ec63732e2980abf292ef39cf7b87c320b76f8d6cd8f6141a21c321e72909506ec24d5ce6a46518ec59d22a809d5f54898f2df2270229e658878481a1789a71a94b28a865f5a2a48c18343d79fc850edb10730b7e0b7010631ecd9d24df0a8a1cd6cc8573f23ebc01ca355f44db9550445448d9f48c4f084c4b943a5828038b5753896676e09592eacc26a112da50957b153a23316fa6f4e70a84ac29c0969aa5fa6702ee80f57f18560b7dd4f6c81d0ef12f6735107ceac45a2bd8bd35f76a59c8d1e1859f2b1b13fca5fc58e9289e7f023e4f03bc571cfbc334f53bb23d2af3da31f00f476af0828f8240f71ba607cee6d125d3055a02307197544906ccfbb15ae8778dfba1cbdf33554c98a7c6069b9f3eb0d82316499832a878167ec9b11ddfd1 +result: fail +shared_secret: + +# Private key not reduced +private_key: 9dbde438ccaf5ad79f0d253c6d29707d6d3905c4dd1d3b93b269be917fba051fd672fce5ec059d3fa9598edca4f4db3164557b1737a0de85def5d3e572e8dc5e8fab52184238c439862492404becc06c7efc7b94b41bb1718c6523ebee6f63533ebd4e4f9ec4065f7a4ea866210731a687ce0aeede5e0945cffd807665bdfd79780219ff0b6837d61550a1d481792d45c99b7df7efb9ac95bb44284f472b5ce1636b1b3662d83fa82d76517b57ba46fc9bee14511be585cf0a6549584a361b7009a733c9595f01dc629057ee3d656371cb6d63c9bb25a8c5cbfd3a84f6684af3c7daa48b295dbe6d4f70412572f1ceae756e3752e6bf6d53c9280ee1f429f2492780ad486de73e565e99886a077c20abd25a6561bb5d359989744474fdb485d729ed9d3ea6498d236153a743755fe7df64d0876690e393b0f4efa481d3eb52e6d5cf0ae5075eceb94ce189aaa372f9d6a14b684bab42c83bf071133cc31892049cead57ab99b0d680e13f87526e41c38ed2e1978b44c84595a59e13647f126f3ee2b822a36b4f41b8a153a3dcf6b6daa97b9241bf5813343561750ab7abf188e6d776e687aed9668b9c278decdbad74a5f4f9075cd7a3394ce72a99af74de0be35611d296349ae63cc2b412eba4873988ac44e566d2cfe6029edca6d3c63fd58391392494976e073760c0a9fe058564d0334a14a4d8e9b41c2f7f2694faee7ecf63f35b47619c99ce66f6a546be0f7e6f8b6e831cf3f38fe52617d32d34a6ae46dea018e8bca04cb9c7e456749e7b935ff449a74635656635e3f92a5ad5bd4bdc6d63c7d786601acd454956b92595efdee5c900b6d60db94ece8c2f4bc7fd62f40cda936a5fad69a8d837d3fc77706dc2a5bbc41a540c0394a3ed53bf34b37d8e7627979cd52fba35b144df35cc9762d9f233add251ddc826cb54d365d7428f631b3f6ba0674b87beaf7aae69ba6361e3d73794dbcc5f3798a9c543964ef6e036abefaa66a44a5d017855b48bab226e70db6489d74a7acd5339e43ba3b6bb6d25eeade7ee735c9d83c75b5111b903965a4b56b4b27585e977db0fa2c5ee73eb6db0acd3257e0ece9a429c83b76bc417a087b08d989a44b3d9deef17d835a12d6fa437a34dd1568e25c6db41c4c99ddbb7cf7b12cffe52c46ec1a98eb409730c4a9b824a8f45b8e41a903c88cc7aef187628d2f6fa3ba83d2453ca3a7f90a0cb7eae6e047bc4d4f36cd6e8df00a1a413a5d5e3a86885be6ecea15fbcde5fa1cf33ff35eef4b9c91bccb7142c6657db694031649bfb8800885bb077adeab49f1e53b40c2bd75688ef4b0187969db8384244f63c6936aac3f687db9ede5c7129a8e55d46ad5d8636d9dd82c47611b5c3ad3c8e4db27e57d04e685e68f5f0df8e9537d3375cf7df44bc807a7e88b8b9b083452a35a6a5844eaf3c4afdb378a8d6d668f76c5ae8361aabfe743c67b2c626f1cbb2a8cccee295e6dc7a4e695b205d498025ea89f4d4a2a1940b58854a8fefe0e3fefca36592044492094619ebc7783ecea12d8a6bdb95f6985e4f214a7707949c5e6ca4bcff7800554d77639badf862b0cf8bb686c702bd83a5dfa33b6de0c253e32393e6a1c45013e40d2b7cd56f34a39b95d90d51e8cecb49dc41a37e866c8fa1bf723c3e3815b1f388f63d791fe0cb8507020e19125bf0ba753fa89c19180a7505e15ab6c44e32f70499df5cb106f85bcc5dc4f20d9660c17307de05bc1eb6bdcebc52727ca3544772cc56a08b30c0c54a847b28387808a1747a23f6460054c582b4ca1e09691c64615a6ba3f89a05a18eccea06b550241047c1807f3323dec674f17056d71b7bea906463efaa0fa50b051723e0cd66cc7587df4b58d49fb029fda6e2e507d637ca7d489971d897b09148a6a2b47d3b4bc3a4ac0715b3abde096bfd8622ca24141683771ccad1094595b20c8af004d54873b0d42977886314fc889e5804474005527170c49882ca89648d24ba29cd30a7c2868f287345f4926f1141531d3a53cf68c8662247d47348cb1a102613ab236b67bb9a7cce47e794096c0a93d54f743cda16ea09c8d87c43e4a1b2cd9b0b5ea711f30b39812ca44da20b02cb4c8fe12343896ae6eb838ac648acb8bc8e887ac69602e7d81263315373029b2d6713705935a43177b9f9888115202ecb1a60e433d8de2bb42d235135224c7f795d342466b4c5bb8bc93931116479171800b717c033a304bc619d2a79a687e005d6215fb1e76ab67d8b46c72857a46d753674a7ef3962c90f2b62f51458204b71d95734533875819a495360ecc12b66005330593456c516ead7b3c942688a822bf0d92bf849bab6068480a0b0b4b8c3a451007dc2a733de7b51d835e5b7900ac836fbdf13a9ee82b34ccacdf6b8f4cd0594c80473040b633b7ceaa091259a21c5c881602c146e4444e1e48800a189239241813c13b724a02e6e7a70834493f794ae7991bbf1b60d4c0084c213471eb3598079adf95004942176f297ad3d55b5cfac5a3b385679ca6af26217ad8309547a0738328bc1a519712ba545ca739e8c253a65394817aa6874e432a95e5f35aa045cca1fc1c7bf467424a8d498274646c05c15b176c8a69f90a0a524b6e4b6053979499e7526ac66830d28b28ca2c6dc4061b1546a4e8d7348416c8a8fcbc0779c51ce855dfc54d94d74bee674bbc383adb248c07eb8889b0b44937356906a61b1074362754440856bb26b2fa906ebbb94ccc943fb39c00292843ed501f5f673762e3afbd7179e41835208700fef233793c0850c5b48499afed371e56e5a92a4109662247b72338db4769f9849f9516266acb133af5666b18131ed347454250cb04528c91b8334c2f5b3401cfb28e45824e73c1b6854b330c47c443d931b9e5b139f31b25d4458ac53a32025d49bb5d1a89b73bf930c74c233bba7afe30239a41587985726fa09d0a7a2ab19559ed380d9eec34b5fa83b73813a763beab0a1f7df5b87962709f255256a36800b94062d3af90990b2a43251ad9b0e400bbaa4a306520443ecc8cf45613a8fc1c61e6312cfa02d23c1547a69cfe43660d987a0210cf60965fca77c850503416c7c18a37bc10ca47f517abfcdc018ffb538f474404917dd65c8a680a667b1762b5958e43547fca1aa0da8907d7d3a25b430724477eb2844e54f35ae8f27598d568d413914bf66b70e37ddbfb7df01c08e1310932ba90ac2287187b022dc659c83b9f554871ae4aaeba7ac76f1254f174493d31eda27def0331de8e68f7b1568c4c8919e4de7a5005ce152fef9c8c88ec9e6fe12a1e2d742dcaf56c585651ed6edce4f410aca0fc83275b5acb19daeb149d248c0a21ea0bb6d6f56f12300e8584d8e9a34e0e6f52227281151ae4c305fb8f +ciphertext: 70fa89e37eb5689eb2b51fe7d341fe3f1e80e967d0fc12c5f7fa1b8043d02752df88cc6c54964e517fb1facae8ae9b8da1941266c4744e2fbe3a12a2cbc729ed1431c4bb333a61f0daf5ad7231ec741a9fac9a206d15c5e02ba5506a8f99a4ade752738d8ccb744d1635f609d4dfdfc54fcfa5b337ee36c93cb35ed056924cbb768dd089871663c471cdc52da3ef4f61476b9e600215cc248ebb6ff3a0ea7f410bd20f9dbaa1045b46b998caf7140e96468e5e7349fb0ed37eeb2ee46f352ee3dc2c074e258b11cec9782a1f475a2a0800f50c2e3fdb819d85f6cdb392f471f7e13cc5d2315d2a9ece5450758c2c8d83b79825dba1b230db7841fb3a6d7aa86fa08c5744c976a83e67d184b5289987d57990f8b7d38ced91410c49667c1398222cc7bb176808fd19f525102ce7a682d6bde33c91edc9bfd6844962731f1f6e1c24007e3e15f2e1b164616c1261c56032bcaaecb933dd653a6a2debe9649e0d4f3cf849ad6dfdc5d1ec65e2a04d0bd5fa5460e714bb5f8f68d2a8ec3f4470e55eeca2e879af6424340ad6ce9149f9c7f345c0d417884ea8d9f918f138aacdbb78dc5222db2b8357b3d685a633c26d14c75feba0734dcf404d29f6c057d8f076262d82ac513f8730a0d55fe8d59de174a34f697366c08569744c165631961fdc637ef3ebcf572f4b8517ec51e57a8f94637dab7130d4f7b976d16d933658c0b161404f74cff2745a719ab56e32a1b5912c8016c1f80523dcadbf9b8d5986aeeaa5251035e2d93344ec7284ed7baab5a083ef365cc61ae01f77a4b64f819eb5526172e20c39f85bd0c8eded7c20e0a8dfe3faf8d1f2834f2c813e4030899ef222fad3c1a91a9bacd7d8eac4b6d9cfcbc06e160b0e81082bea66aa34f7f76e2e6213405415e57854690243eba8f016e6caa73078b59e3e7359a15bb3f1aa096a974260ecd74524a582cd0b9db891969d7c17a2768decfa0ba0e49f57a54709d767e4e24851c719749748ebb8db80733f07460f4d00e3ce8474551aca82d148adc28cd2b8f0e61a5731bdc81cd2b79e4097a680edb6131a70a285a46d1a020c38e2f02a08bd59cd07767566f6e930e473d0e999b37bf546faa102625048db6be64c1cb94757dca3e739fdae0dae257d91a4ec2d5a5c418ae340ede0b6114d9cad63a39cbb64f85eccac201419bc2430271934f53113682586b307fa7f12f0a1ed4c507c4229cf7a4d27853c9c41fdb6286750b50b11d73fa0eca184b95ec42a4545e5cdd5c6d15d9ad02e6535e3ac87084bdbe1fb35f031ef5960f867982bc34bf7c5543c2f6d7be142082c91867a0ed7c35bea543a60bf12e25879326690a1cbf76f3a80ed8b0eb229ae70a665823363b87c044eb177d9c1ac3f87edbe0ee6329f8bb39cbe5417044371951ed3f9ef27b7088ebb97b5b6cf13a51fc08bd09143fdec693a9009987b424f0a0db914e891e880c16ca40bd05be1da299e9ec17762afcf808772875e3516050e4313ea66aaf8fa7e350a864cf9a73b7139fed5a8238224 +result: fail +shared_secret: + +# Private key not reduced +private_key: 7079b0361596d968aeabcd85c8f649f00fa20b947efa34800067938ff753bc0aa133dea51944634ba6308e64848c6dcf01bcd1a8ae3c5ac5763f3ad7da294d955b5045ffb46e2b6f51e5d1c3949e32a64bf7ab5b6435986a27e9812bcdba766381ad601d8d7ddb2adc543de7c064db56f8fc63da8276e665d0c441820eaf9e17d92a48422ca6df7b8e8cb276e41dee6f76dba6973b5da07449a2b5cd3f2d650d753c044787a6154257785aa738418264f81298c272273ee99dd9987fc5a9dd491eba493038df75664d6156928967c2f865d53b63aca124eb8fb3c8e88fdc0bd8c17d18a2c3a73902d6711c5ac3121da4008d920ef9c6d09e8d0b457cc237322a5e6f2f0a9c70c9efd74dc2959a3d95634737aedc841be73fc4565a1fa3339e4bc4d6f51483691ed7aba89d6693eb54f36794bb0777e5b45f32756ea6889d6fb75c84845d99a5458c0f4257b6f10c657555ab7cdc9df352fed16213636c3b37af4b57aea9cdc5a336fe2b987fa5994ca9ec5b59aedb8da5dc1639a5dbc994e330f81d752af651b12afbe27c574147d4c0685973c67f979d98383b341747ad8849b0d877e5a3af96f14fef2e9c72b69431d4253971ff5d653ccc2b07fe617bb861ac66781576a6f7aa70953d6d3c40dd659a374aed7cef85ace7c2e7c754d42c780ac5a8e9f7beac93610b9c56c65bf8703b63a1684a88d76576743b660e78c7abf09d28a616d79ad78d92b6bdcab578c4af895aab2d45510da07a9cb4bd57c04dc5ad159488b71af8a02f9e8765fbbb9aa1f24aab37099d0ebd7e9dee4f500773d83f61044d5f5b5e6e034d647f556001d6cf789f4c2eb3c547af5aa10a80bccfdd09faaa6125d20e988a85093f2e15447b536b6d7ed7774d3afac7d37b795a7fc93eab9639f50da383454e10a591ac0ca3ab344ca099fa022532bd79ae5597e0461e751358d1106c615e47ac6b333b1ff430a2dfa0b833dafca93d65e8304a0dee00ad5e7969d2b8ec7dc4a6f68584cc90bb8c88148bc518fb74e48b20dfe16e9d33bd44fb542e5aeeea5788447c0d5db567b8888894eb9d8c9e9488ba2a5af3a309e4e00631ac784f13c858e5b49b920b428ddf4cd1ecafe553acd95982af5b8b8c0dbcb1074f6af5fea7eb34cb4482d4679efc337eacaedd793edb94f7b5ef25d815dde45adde54d674940af76dbab403a5da60abf3d1fd37f23e6c40be57c2b9bac82d9923ae3cae126be2c0c54eb88c9e13d7402a7e543b58b68efe76069dc818b4c71855fea0d80696644e074bf2a55f37f037565f8d0e17eabda3dabbe6b6e4fcb8774aac945898ee8b749127f6e316568069aec545ca5e76cd2c3bf872d47860544eee5b8b91479dd9b0938940540a595744cd8bae7483d3ade511344ae19bc99fe5b51810ffd032b6bbe67bd507c6a9b2fc2e19a8ea2cbc5436a8b307a9e6adf37077adfa8e5fdf995f205c459256ec25264fc96ef84776ed11f1f338355d8a8b7b3d09c833e8837150ba67405ba5d75e075e39590d74eae6df157253a704cfd460cc21ffe73e1a7f00aa85e497c9e6989996dffc2942dbec0b671133bce2a3f68fa9b4ee48c31c9957dd33e93864dec2ba97338c99e33e8f8129e74e1696955c4bc38dc838761a183d31e38bc21fd2b955d9002ac69ad96c03822fb4283c4216e93b96d86bbf81888b68b1e67741d4fc8af15d4642a7b65d7b408ec711055826bf634557c8a7ce4a32384592f3c5881aa530213c2435141505a8c0918186c1508ab11101b09397d82b31c85ab64f4bb38947726d2c717362858a0a3656487b0deaa38c8109e5fd061496a695581347d52aa7ed71c20d8a613bc54e8a49a92ebceab993b0fa81de448c156550aae181a537c38638c6320abaa08c50b7b54211dbc8124a487eff2b545ca3db8a07be7674b51a95efd08c4421cbf2aeb8cd92383851a044985aa9a062bf5267382db45519bbd747852ed1a590ca3a89602a6c65cc06c856e22484244fa15b928b13b91736b1680e18cb1f76a7209b76754076db872295ec76e246b1f58f80fe0610372938393288c85b2b2f2107fc39c7d805678e68a38e3e57c30ecb650dc15468674cc54aa8aaa424b5060a03bae4d74c8a43c951e6b53b2c8b1502459868a1b03a5c1395c1b10551c28a6756d251e1916c24ba33792d74eb88a5c84078f60c612beb4a7d94bca27e3377e53442284c395ecc235309d1281c53964bd34a067f225829e5cbfaed47da9e393895aa82a67ab5b44a92d8423bcb59265e73b84f549927427e9295acc8694d77020d0e4342d3c784b121250140db1c3bd38806351416c8f86b4abfc7a14911bc865baaf867f54e92f935b044b60bd5343c5fc9b2d1dc68735baa31ce155e37c1ed0c85162d2ae3492c44c29343b50351c64747f9765b6f9306bbb3e543334c987c9a1c2a5783a576ce94b8f10bc3539cd55f30b0cca01a5985eb5993d35b8cbb136bd769b13f0c5c2d40b34335a52bd34ab04f9cf3f6c313b6c5b9ef879c10c1e1b249cba2580f7da8bb06c003db8718f318979e358292b881f9ccf984c525b61a34f6681197a7834913230627b56388ea26cce0569680c968b31aaa97710c9b2cc019771a57f8b5739554e45048d59610ba990b2e1967648d3c87410aff7981a57e2bcce971b912c2bf633bb8ea55314f3327d3b4fcde33aa1e235e6eb603caa19ba83c98eea4196c78a80e8b5680227caf06ebb22042e9a5c63974650fbcb1531404c6862710215012671093911d67027d491a916539a1b84b3c966b89ed3b1e9980769267827731ece44826a3a0bfcf037d9fbb9bab4b85ad668fd1573c0e9b227fb5ad32c948037384145188b17620eb91cf6a6318f331cae3800164ccd138c8c75a3071a7c0166f5156d74171b5b854c0783f9905b88950c23ca8835e530c4037260500be9f00510b5357fd1b80b09aa06b7126ecc8bdb709e3e698761f756ad0624280778c0ca140c426f91c76f81b96cef425403c95bc00852359b638a8a75b3fcbea47990e002b346d5a9481083c4336d02191326f6ab5c5777f622cd4819bd1187cc6099cb7968474ed93c0b830bb301314551970b86a25da05dce97ab5db744c78536712c752d02206c8585285268c5842491f92636682b223b6bddd39c6070bfd74aae3f8ab1fbc357136028aa3542f006cfbe429001377d2112c5ae3805244b865ea863257aa671d0b146d04b89b233f70768a373043a59b9060b0943f56865e6a91bcdc54402574a0f1c143dd36948d781d2f3c44e2f08b52e339b6e1cb330c784bb2ca3538979b24246c2644907484719c531ea39f13c5a34046f8e5cc31646460817a0fce5836bdfe124a7448e7adf7b8ecc2652ac6d280e986682df71 +ciphertext: 8a123f400b8819e4a011a98e2ad172d55caa7112312c89312463d87f29007d0f2bc26bbec2154e7bc61de53f7cf971d2653d7f6bf0ef3c3a41f3ebc81a007fec27b2071a12e5bc55cbe4b1e74ee9847ae6ebf5c19f67989d07cae375209b78ae35b5fd1a064d8436db5cfb6f1acab16b1c9e49de8ab7615b8205a521c8fd597dedcfa9380fbe458be51760d097867e180a772ef77d6e2014be9e10cda64d88f7a8442bac3f736a2cdf37fc6255a09012e4f4a42a1ace90d99db9f85b9b9689698374d0fae43afc4dde391ddd631e90e85bc63616459f44e4fa6225efac89a2f3bb802c2fdc975405e09c33cfbd52f9a5b853ac7ff30723eeebcc626e46a70ae671f490c32bb3e9d5e32404efff4663bde8e5fa3f9868569d99abdb1e47a11e37e86306e4ed59f0a4896ba667ff57cc1fb140266239f0c1942e4f274bbd359042a4c377226fe963f88079953cba6f338efa8ee2c0f68ccbfad1f78eea6130ba4ad1fc7ce65b3f592eb322deb9729975ffcb885208c73d9dbc51c29544622de87a20991852a121721340c0ee5ffebc09fdebe504e0bb4151f4c59cd24f76eedd3a93f8fd8d6758aea16cf041a3f504085d21e806b2e727526d49dfebeab1339bddd4770fb1c92d3e109a57a204f81556539872b536426faebfa0e80c48531db54573af4d1b026314fd5e0e4665c61eef611dec983c285b479d8982d05ca59efb6128d38be68fe8812469cdb652a3d0bf883396cd57c173cba03e56566f1c7008523c614435c8d734b5c9772b2ce8e806824a1fcc7f20587e6051d46757d3334a345c97095522acf713abd05326d07dc1d2a845540c6a5ecd0b4f3805d39c4cd4d4f07f92806c14e6183eba32a5290a7450cb7630c3fe0e75ac0e9b875a949c4d3ba5cb8c035aaeaa364051a59c446e98b155e8b17ce8eaaa39fd8ae46d03b1b7cc53167d980366437082e5c072b029341be639297a9ba8ca2b2c521c932bdf5c687c030f575e80233f3f802c6d72b040f451771b9005a8f4da08b153dbcebf1e9bf14099ae15245d408f42e3196a28b6ae8ab6f242cdb7f23b0a67e0ecbc9756b38a5c32c40ecc120a229d4ef618eead86a39f5cd70ec99ac88fac2ed092c0601d153ae4d24093d66d910067ea368bbf4f6720e874282320614dde2352039d6a40b394c5a2d15fa00030cabbbeef0792d0d3cb7dd5dbd76dcf411ceea06948c5dc42e7a21e89c78f6dcc03688fabb2dbee392eb4aecb1988cad46a4505785758b762865ca03bd7dfea22fc19e83e584899b1aee47f509bacf994621e910447f89816065b3b976da272973a5a4b9acdf9087f2fd69b962f743e0f2bbc958c8d832f94400703662e2ea538149f413baf7d3e42b50d9d4acd8e2e12a2d7b1914dddd108f0e08d1bc0ef663179ea01b98e476e4e71ca7a54ecc6398666552f6fa6faeb19178c2927741d3de697f273fe5da558a281d245c3b68a25e395dad0c7b1d8ab4d731db6273dd1c535215f130e043ef491dfa4ae25cef994fc538b2259ebe67d +result: fail +shared_secret: + +# Private key not reduced +private_key: 06f99e6346fcf6dccc11a8854b24d7ff22e42e9ea19d0395f49f3ac0fe55cb58d7aaa3fe228f32dfe932aafa67325dbc9f7e55794565aaf737607e95f1cec35279a51e6e3c6bd3fcde086f627f5c293f4e9e49fd1d3a91b076ef1524592f6772d5fde2403ce8ea26fa3cc36b8f565152dcabe80691ea3b84d9eab83dfc429036676e2ed9daef58343b418f94da1c53b4731eb55f59d202c4659126bcc5f4ce24ff90674dd26cec84195f6efdddfb0feb7728a53a32a8f32ad37a424b4f9818f7e24ca9cfff6116bed0be2f4b4b3d4914c83629049f7e836b8aa539ef06eb60fa8154ea97c41f59b3d6f9dc99ec027c8e554eb5f164759b13980feda5bab7edeb08c99e634041abdf6ed8fee2536232ef634fa3d7791d97f8cafa22db4412c5bcdf764f0b58bfe186e63e1b5667ccc45b39c77b3673ed4c70786a33b5aaafb5d5c12e4d77bab3f23e36e4a7f9e7c756ff220545fbf9f75b1a62a98f797e5a96cefbadb309995cabf6747ab33e543b3618dc29a4bafe68ae42aeeaa763a8da0e62a1959dfcb7890a394ed40a5341fdb8a89434baeb9414ba460178b2c5db503a28bc8f2a42caaca2fbd6c77d758f31ee4bb1075ffdf535fffc76d02ac264787e4544db1dfbbbc55e3ff15abd2337b6d454349226d575f44ba1c793c3054bfe767a827875322ca754ffd0c717c47ebead480efbd103c28e9380be2868c8c3ff720fc26b977760e67d991d99224f5611b9878f2e5495aed730956bdc8ad15506c4609e907114fe9226d7560560237bba0d3e90c769f95bdd59b7c99ecc7ff22a54563ba730a7d3a4dde375c9f931cd16c4344552ff984fd6aa9ede16d2a94dbfcc7d5e078cc375437d3927455aab6ea397f49abd795df7bfd436cda3368bbbdb990d6ac9d3f637be663e76add55f0d558e0e77f7c63e80af920983d3d68a34f34da17c8cdb80c5a69004c195e9e5dcc880acc9cab1db842c14722ea534b865488d4e824017cefbaa5c1127aec9e535112764e713ce403c64a7af7663af548373f7d69f4846dcb646b79de5bcdbdeab9223f36f5d1f4e5a5e65753656b12ed241f6b806bdb30b1b69829db5d5fece112c93b4f6a1911d6c7cfef0d2dab2995578feacd8db3bb36c99c2c40fd11c7af69f563edd088f3c5da39e5d8a67c7588a1efcc1adf17c4fee99e95f504edf8ebfcacbb8532986d1895a34314d5f8298f7cf25ea8358db4276cb73996fd5d7b357b5f574aefade3394c48b7709e5dcb9ff381c05dfb1ee4bdf5740846e38e539a7fa6a4a94339cde3bb71ec34ebae4bf4763ce93e6d4206fbd61d8e86808ef8b98e24e667cc84cdb236e57560647997af581837b75eb59d5a934bde44cb1e664df5ee84ac480323ca5a06f4663be7bccdfd424c565385958ca9f46d2383a9f3dd0f9c8e7fc57b7f335e3d96ccbb624d511feee2257d2893bb89145d404f376b1bd4a675bf161bc3c68e8901348a9a9d7742aa3a2113e9dac25a7eb9d9f2e8777299e4cbc2332bed4876f5453aeb3365879a0a34f44c627fa8d267cdface0787740a595fe66e3663a879a362d8a07959b9c5997e57a779e8679563caf551a597697473776519f87b0d8ed3c1a686d705c55d2beab00264fbcf666abba49136b6e6ca0ac8636bb20d305bca62bdef6301aa51899d7341147b72c210afee6a3294a4ac8685b1b6003eafb7e94d91fd958b5c3944129198bf02a2e9491491a2bad9375cd9f184aab285e91c877884b101511775cb31f2a2a3e7337406d7662c8d8c83c1933f0e27b8b2b39b1aa8897440ea5142f22b218c77c664092996e39237f577139014da6da6870d848cf98b006c9633ff138323261e1d042ea645e60813c11f9489714c197607e568c8045f0244ff40fb86634dd469033456604f19255645898181cdb830c1a82c4eb1373ba820515b6a44596342ac8b912c217603cc92b8a2b52caa29972bc95ab334a93307d7b9aee013b22118eabb947b1a23150481fa1e7b9146b9ef5fabe9debc682003eed2534d9614d90466c80a73fab8b94d187a383463e7f6a380d1b34ae5473f58167e97794767a20bce5b6d5dca88b35695e0a2baee03abd55ba0fe768a8254d40836233fab358842675508302a337840167dee53eb3ccb531a7637dd1b9dac9a00432268002165f72a5aad8ccc7131ccdb1c986a7b29bd89311099fa3e9460553900e51560364bf9af461f1487cd9f0adeff5079b07240870c310ac4702e113f68433981242c153c49c43cd93493b52395b5db073ec936f3518b7f6954426b9757476cc1bd0c4ff870a2124a8f8daa3299ac21178235c260a018c169d083cf40842bb6a0f2d407861106b4e752091dacbb85677fabcbe180abdc6235d0e8c34737a5934f431afa670d000166f6c5e4516174a205f4bb6182bb24a54907be5360cb81b5333a937c4e40ff2579b0039c0ba3374664859e376a8515b390bb46acfb54bbd4aa6daab1dfdd44c712b311798c71e162f36f562017821cc96227cc431ffbc3634acc704937187b8200d9bcbb0c25df359c386e740195662ae24cbb24b181a23a2b4cb5e3a767701d3a80f7bb82133be97daa38a706c7e2949ce86587246bd5fabc774956019c2247f5748f0988087159d42b8c6b1aaa398879c77e32b0a5494926588dc537fe1f05a10741fd8814f191cbdc50cb2a0ba1ec053a789396208415c77c18d283510f410a722a187cfc552f63159648317ed696695413ec894ab80f4c106d73933e312996b23f073bdb9625727d8c0ff1818d9f78b91c4a6c33075f9a91b772138cbf6861937c53aca7b535baacd2bceec96223ba7747b4a7d50c36d3cb0297967cc447c3bffbbb723455e421ccfd791c48f8ba558692e2ce278dd351e28d35ec1039f16d8281bc0867d529ffa6544b1663a14b6843fd85feea2b00e3c8b2131bbaab0b2161493caab5464501ff6e30074a372dc6a905b9a1a66b637365b48af4b55e45ac4236781b71b130718941f06c17d84786bf1a033b60da7c6b0d4d385f3f323dbea84c0bb8fa720569d1959473b1af84459c0ec4ef133c0688323fe8503069bc15cbb391ba7041e665f652880ee367c97f34e7230009fc401d7a34b536529ef544233761bd2a01a9da338a215492252906f979290202e5c666bb31a74feb13b05cbbb341076674c02567c80531c5573fc6428b8ceddf3ae84b8bb7018a3ffb02906770c4528c73360a867c2701158927eb5a9fac60a2f401affc4c65198b4a5e1439001d5882496fa682185d21aa4ef95ac3eb5e675c7a4a4426f93b30fe432c2e9744430805aef6b75cf3011ff387e323558212b9d71ed71f044f779238a80dcfd7c992d84b2dffa67493e669243d4fa38c46b090bdf86bc548411 +ciphertext: 4730cd50dd082c8820ede968a7cfab0842f632a65a08757c67f05a01151cebd03e259aa45b446ee30753954b5c86240a0870440dc76badd33119e19a2d487f20499a48202362501ae0a106232ba9ea21b363066ec8886f8518080d736444f30e109c0354f17507e1074f7b608f16e814d76424647921aed1253dacd39e55abfca8ae74b25807cdca3b76d5fdefeb2a717ed54283022c607a22c419e236a971f96f075a7f6e46f07835732c2f9b3b32e722880b5d942c658ac72257dd0ac7cf6bc85ddf096971982a8ea480d8a7629b4b9c060c3ee287695ce0ffe1d26c385c7306044bdaad1c921fee6f93bfaf998b16fe9664a610f806b2ea0e7de8706bc1787ae6018584178893da14fffc1c99f03e8a9f54a2af50b8720f6f79be74dbfdc53324dc94e081a8c438f04a9742c0c2b1162c378a410df2be9d340f0719bca11c78dc23720a23718c1def9c31e96dd8f0d9503e43119b63390cad03fcd3d64a10130538b2cbcc9b786ae5c509b7d754a49e6784a8e66d0b80edc4a62aa5d7a6bf3a015e7df99e4f415f66b5aebb9035ee22255f2bacd84030a5128fdfa3a8343e6f84585eb47d30910f4e05f57e39230478a96f9e10920c0ad90fd32593932637f208c312e33cfa96dc2b7d3650570b7e3846727b5214ffc6c9eeab17e7343d9105a26df4bca08c6a0f28594c708c6281d7f34655370216eef77225b5ed78d4bdc303d5974a6fa92a9a75b12648f57f6f7feb9cfe8449c763138540f97c0339b52aa3c100421ca0094591a4e8a2af4fccef6ecd91b3822893e49f00a46bc53ce23eb05d489a4af115dd71a8e2eca292279b05c143cf877dc4bcce9fe75df54e39741d5d4d6a0aa594b2be511ae748ab03c9edfb8f46d6bf2a214b2d6f3d1da9f73ecfcaf564a231ae7f629b4236b52864366ea34bf23c295a921501db8f92d16c40f9651d8df6318ffc0d6f4b840f27bcc736d2e2494e65e81e1982df9d279440abc8b01108f5c92bc2655fd3d0ab0743baafcb19ac5108ec02e00af9fddb6301d9fccf2dae17152d1c06a43cc69bdce862d0a4f1290fdcfe857017c6e5802dc55c1ce2f999728df46144a55a18e54bcbe982465c8b0077dd93679363b56382a7ad1b8021a296ac90fc5fd403233397ec72d0ab74ce0ea77ca2f39cbdaa5aebc968130aaa519b0b80a141b65b3652824afb69185ad70c99e236af977f56b8e20b8401d13896b20d845270f21ff7ec1c0a86c79e4e15450ac94f18cd62e814a44d076dd7d3868a54412deb45b047aa71a9e596e385fe0cf77afa64c665c81935737e755cbaacf4ede409cbc858d63e32b004138234e294ff7cc01e637c54e719782c75cb95fda6ef4d86aa4e317745678370c76e47ecb77bbefc1a2e92a783c3d64f01f9b6d0bae50d15534bb98885562ddcf9738c9f08b4dcadef59fa856d9090a64627784dc670f03113d29a7f95a7b6162bcee928a5da0da186c7e13ae83e8e1a63bd168c3019aa59bea63cf967e2a17f2b937737c39efdf078273ff00c09f3 +result: fail +shared_secret: + +# Private key not reduced +private_key: 93b888d05aa46698878f187be0da62911f7b2cacca5ff5d8c40a523aa56b923b5325fb7bfe0b3cc00ef0efb8c9acf6b1aedfa41d265be89baa96989afe97a5a749484d27b8761b6e9ccbfa957676743cc79c2fa74b09fbc693bb54b3ec4f269e5e0dc47073df7c59ea708b40bd7e60415576db195fe78b3c3324d8837f3387d4af2e2fdb10ede5b41b5984a8c217f8e8300831f1556c5499e3a02e6a4ffa5799246e925e790b98c2b907b8ce9e7f8da8ee7dbb760b7f5a30e34d997774c657cd4d2648e97451061e583f15c5f12dd872c9ed0c1c89c307ab4dd3ecde68c365bfd712559a7c7c58d6dcdc8ffbe645d85436b8e88d8ce71eae445168559148dbc0a541797d645e4c633a2a430f23941d8dc92694b8cea6674e97a032c89516397d42e44855b4ab29f484d4e33097754d0fcc672f55fbe0b3a2b85fc2e2a87275aa89e65ca0f0dd96ec158f591557c70bec6e696ef2ba704006b7f6f8e1f2385dba947fb10c404b79b90f7fda842a569dca77f1039b634d3787cb36bdc8984c45fc48635b552361c77b82eb67abe8faedb025302a98b9b075a5579f43a97f5494fd7cd025494b6cd1ccf5d8d594cd36f473b94e6a9e7a8de0a9987aded9161ab3adb78d02eeb2ba38d9b7266575086cbb36f2a4f7d8733bcaf42f420a65873d6f4dbf2cf0a088f1a0fcd2611a36f56de485a6399b9eb888ac547d6de20f5d70e597a9a6a67f07bfd39cd6ccf7246adc0576a3f4457cb9a4c4b46ccd846a7704e7971d72cfe64a33afd851bbea20555122a4fb7c3cad5b137f6885b39d66cfc4f5c7c6e63d2d45c8e184467ee336945aaca71442b25d8bd9687f40a4b70db764bb09d6115f6ef194f151c56da153a100fc92efca3539ac6efbcf3fce6d665263cf435ab34336b08e3df3eb147eab0dc5271459b026638bace8d3dd4e3c4f9ba48d53df0afc1a3da7463e46e798323dc5c5fda63ab285810dd734b9988691c8445098a2ed96cf2334d67fc45d130ee9b37f61054d4c2184d97147cc6363c6852e5a12b4b34b26e23143ec56fab25f14e8f5e55fcd8bc2583495250d4a7534b9916ee13efcb310e6e556788e188cef410b656363dd8aa4bd0779d234e5d4b4a9795e8e41d66d49d9eec019a3fd472e9124596a65ffd6590de1724547e8baf5d56cd42a8a58de53b10cacf67418e2ce6952f765bfe6153e1b43582f5b7af3ab3881ec42b408d263f89648d6f2ac6f5da6b730f57f44d249ee33cfbb19da532d7f6f3087fcd90b64f58ecad12c86c6166bc6f38fb009fa75b9aa31b8acdbd5bf5e746891b7d87849497feb4fa64cf8a4836784ac8a6e73e05536debc0b33c524dfd3ecb5d92e56f16aab8349411e1e92fe578e3d359e237d543a3e7b7df77d08d38e7abc8b1473d7bda7a7e00b8e0e5e836b1ccd367ee835755a72a6bcc079e65164a11829f0af68434bd639fe0764fe07d0b697eccd6e7b5958c26773e13d9d62be44fdc5e44fac8fda30a44a10bad458379c9d97e9606a564d08d9e635818216d6ba34fae664c4fef748ae4eeac4156f597c39f17c93f88a74418b734e0caf607c4f9e7f877d9f5c0f25410f65ec2b3860fc26cae2f3a31a8e5a239bc4fe6f7dee7e81869719ce20c5abaccd8889286f2a77b388a58ebb7c53e79619762ae5111b6f352192288128a83202005adcf0b15c0640f2b84d2ed58ee806bd4fa22ad26c5c8eb9a035768951a579f8facd48428e508abecd418617fa5901fbbdacb6b539c148af327823009e86fa49b96c42d8ec5accecc423fc979c475fc9c63696c21d206301e9d54ad1088be167af34c57facc25d4bb49ba5677842e27c1fa666b0659c66dc412de949980ca6a707a0c21976822579a0fb1d697892fc87251354a17f630271cb3b10f5c578777a990361b467c1374897675748f763619e065104a31999a765815ca7a22103f3631879b790a862450c69af8d29c0f9a48e8dda82f2c03c0e12b62484c4ee35002848b030e41dcf1084b1f70d405677a059774e322c7b72265e32810e761d82956cc0194257f31157928b786b6fb6011a130620d2f51678d27de0965465d445e6777660865df9e73bc6858fa8155bf5cb4bf9c23527340c32211009144fe456950694b656a2a30c55647d17cfa1856981867aeb82af63f1525c31cf643b32ea822b2f389ad4255838a2bc2ff850cbbca834c87f9fba1c05ba251acaad9ad99075920653d29d94c399cc4a2e4c7a871e176a275b7ac0a4401d36b35113595d51b92ccb8618f3ca40b4900774a784644973477dd492c66d09ba9b074c3d0347dafa08dbe43a9b890f62a5b9caa996f9e362b9a2103942cb91915ce8e390af54a2578227a9389e922b9c382907853ba05eb13e7f03c079301db2135d95c934da5784cb05b9726a1c1e28b01f5c5edba7a340053ea51c32d0930653f46170025204c0adf94c2075631c55790895495f23ea104a60b88c8b627db4256b6892d1b7886f959a18ac238aea494e45aaefd72056f362e7f34ec5e20e9c9aaf2efa8683970e310390a620264ec1ac3af515c24409ef4a4b99d0725de1506c706303e2848e2904f8c4824260162e5392b5b0595d699357b190e237ce1e3692ed95b7710488ad285c04db243eea475520605cb98b98a1cc893a7f1d7492f038795da03f63a91ec925a914b3c1fd9a3b5a74bea6b6770a5b1400348f7002555ba8c9c95b88cd829eb179472245228c21afa2d39238c76cde000898b718884ac8108c06e81c02f264bb6c9c5c13081c09d431aae78a26d62fbd041f32fbc012d0c83fb9450448cfcdd8cf881036ac096396e311e923478c5a346cf5c930d01c84b04400b38759a18d3ba40e46c8af5f133258f353aaacbfa68b0bfe206bf7fa65b192a4798a0faa68b2574725dfb69ff108b7c155cf77426ef8a776f0455bcea85ffb91a74f7203bdc2a9d0096fe7ab57ebb4cf1dea1ca0c5c4f9e264d2d5a0fb64658bb3b1ccc93ea5814407b6c865bc2b2fa14311ca50016b782716841bf89474c10e182aa51c0416580769312419d1219261a548ef0aad81159e4be73bda9c8903b7a4955456a3a8b405a27c18968901d54f8a0ca16e41aa1d0c128edc33b069a1c1e4b22438beb74a996c8b30c1717f07092c46402b1d9b710c46540ab32f38381c95b7445704461c0589cb427606057c78f911fc72ba38d1b664767df30901b148b1d609601bec3e40e41136ea9edac60f1f097c49906f105c99c4b069d5325baf3e6882dfda254850ba1ae5ca738086b4bb3c91df05c11c1acb67a98dab02b962b6350a9e1314baaa272b6b13db3d1edc9f09d3addf07f6826a3556bf1f135cf64b6403e103afae34da038613e2853bbfc36baafa3c6a95347193f37c +ciphertext: 3f7f9fa76b2379cecbbfad6321d4d1616ae26488263ba56a63acfa042d737d74212b3522f42d3981ce88d95a3de3480c6e5ab26ab2fb12a6a3abbfd75505e1b7aa5b2311cc5d0b8a2dcce7631627efc9d18c571d72622e50be2ab8b9547e1162889febd65313a588def911d4f923d9747e08ba53cc7fd9e56e91e6f4c1d4b9b164a60950286d0026267920c52a33468ee15ee508a24a390a8daafe40fe5249c6a6640354df8a60e9639bd1cfcff471e3fa9baaba6b6bd1d82efea49cf089b4a7e488b5783a8b4f575bce13109fa9d95ae542b1e5c6b5ff4bfcaa17a84424856ebc2ca2d7b5736830cf35909bad723ac2c8096dd79cdb3e642d0c6a21f0b37bdfd72f0f4594bb309f4dd83dbaffb441f3dc9889a6d4132fc7e8b4186fc71d05efac20b3f994e0063575f62b5afa6bfefecaaf19785383b45f265dfc36a0fbddb402811a214e104d7a22f38d26f6505f70f2da88fc6150d914706f699bca9b56457d401b74f248f00221c7cc7dc92989b3cf331be103e4334a7ddeaa17c9f48546c04e7d0663681d1106a8260aeb63f0d9d670b56c00b62235683842294fd2dc934aed767db150f6529eb8f908a3fd7fdefbd02b960c05279da4c7cee95a81b90bae522735cedaefd3aef318107986d1b73977e254c6397b1bba132f52bd7ee7015648745320b8e9955be4be6e7e49b481ada501c814172b47b584dc538f5c6cc2c1fb83e8f8ce6efb68e34e9b15609a42995cfb06c46eb49f0422eb3b7e1a16700fdd9f1d5610a05d3503cf18eadb4c49d9ec571c485402a60c6bca3ba36549934217ed1aa770f6e68189fd81d852ae00d6b1e7f03cbb6e07d010b65a22be0c8228d9279e53ccd3147642d9f9bf57f177af63b332cf9ca0541362dcf20ec19f66b57b4b55292111360a3d8df17e135f4546d920b6997b2da5d42c20768dfccc4d3b813fc8ef8fb4e8c46d4d579e7ed6a94a112b0da4121ce3f0d71676c96f00bbb44b55c302af407eea78fdc94397638645bce49c7b71b0a54bdfba6764bed0961a5d7446898099d8ba071bd0814cdd020880b2b24f1b07ca235a425a7eef0c7fc13b2767884b247b89b1e07f08bb91b49399167b423e77323e8555bc8e5852cbe69b323e70094d7d80dc8442089c87d81fc401a1dd1154ebe49be3a313b8b2e870375e5dc12fd09efaffdaa4104228bfac5a8f2feaf02e6e2e4d786e687d55af881a0970b460c0dfc11861ea4279379540db02b8efaf12279656a876f758a7d1b45217e9290147392aad801413d1f36b3b0e7987adf276ee4591aba78fc994282e4eb85f7f733c4bb96c45912fcb43271274db783ab639edba155370548a0a4cf56cc910c93ba3fee673f6538a61ad5448cd6d43ee8e3b66f023a3b1ce3d6291b29d6b302a967956f9cdb4e09d4d5a91c0665a042df477b7ad48628bbf63ac726adcedad5e10bcb3bee5591ebc3567e2738a0d8048c9a2709bb2d158244c562c82342a5e44abe7fbb4e5ec8345404ae4b7f5260b7ab429e085b0a1ddc13dded2 +result: fail +shared_secret: + +# Private key not reduced +private_key: 7db7cb171fbd444e44e3e8c45dbcbd0983a000da3ada4e50800c6ba839f9377df7b903f23dbfaea3ed94ed979a179b95629b885a77b3006d6735f6ade15589f06397ee67fa11c9a23f2d6169eed737eda074bf82415e8feccfa88135b29033ec78e5afe51af1bbb9f5638d861ef75f0e97336f1b735ac69b0f75fbb6d3b46d75f0964671a93d9df3af997b36a4430c7f1bff7443b869dbbd973793a39014614f96b4b0f554737b77482cdd16288183c7edc9794f723d98edf87bc947a96f64fe2a7ce16714d1dd475e3214be01ddd54c687fd3774263bc9fd3cbb8515da02d53c1cfbffc6da3585f743d14984c64046217555f45d9aa7b4944d14cbd3dd69bb62dc150453bd09e387a1ca4bf4353b15a9792ea89def5cd09a6658ed57af3dbfd2b1464af2bc28f0e6379569d7c45fce3dfc350f8c4958d7a8d239c2b0654bdffcb866bb35db6f89f65d5f0059e445ea4491d920cc6ac88dff4be59d2f30dd3936c4dc13554ff7588c14aeab8befb24cf73e7fa5e95be52beccc94e0a74d368d414d6ddd2e4806a05623525faccefee714fa3c44f9436b5fbdfe45be4247a0d24cbaa28f1543bb6d96d889933897b85397c94764ecfb1aa94555f04f512377bc7adffdef97295569c8dfe585ad8ab65def4b04ea534ea4b2e5b6d76e33dcc5cadd7e376dfce36531e5e9733c1aed9edc9446fae27d2a85fdb4503fd7194730349f5d799691504e0d2fe3d128d7812fec992cde37524acef597686c6ec1475f6564ca162935307cb6fe166d6dc76da550c848eb8e71c49ff5b9e6738ebfd90534a443fc3047ded14b98cf5e7cda40d9bf518d9d1a4d00c1db63c7c718e8f994a8ff8932758629b552a7edbf56c7a33464b206888229af57eb8a8c149b8a0846df20c84722ca98a458c09ca598d85ff8273326f27600c179f1a8cb1e9fe4072dbc9876d58a0f448a1556532fde0582b4672cb9ff873865eac6096f9a4fb1ff5f4855ff15c7a31968ea1447caba5c29507de5c7990057751de9e365c4c57b70ecf45547154cff58a897bfa5b3d24dddd0be449cf5e72fd5e3141caa315b397d6d77eaa67c6570a60a4be6f910ed97ebee96b363ca47b830b59d2c23c97b1ac33d464b5293959f2bdd7e51374b40de7f7bcce7417695edde5ad84b37e07aabcbd630c467207df471509968f88914fe6bbba9742878632ee6655418535b4e45b5595c90b4ba08864ee51b3ff4cc9f0889f68f56861dd4dbc9f76ee907ee288faa6f0d9e1bdf631de2bc9d53369f3cee6a26ab2c0fe4981fb817a9b4d8ac9f8fa19a3e2bd3f4b89cd459a645223d0f5e5ae6ee8e25f2544bb039a4f09483a799ebabb8839d4e11f45a013276ff79a3ae9f5d01ce451a0aaa5e85be85f8747ba35c58a253618a8593d155ae0dd5a5f755dbee456ffc3883f07e6bc4fae0963efd6d88ecccfed3148f23326b8e946fe548fbe38f7d3580ec2f0e7fc678b47a79a891487bb3c9c7d6c8f3231da391b2b3c685ebb66b7a7e32652704ff1a3a936ff82a09c07cf33763b317fb93a34f6f35d8b2b734e184b6f00488f378373209552a58dec43a746e207342e463c4f1ebd5bbeb5f3efb86a1d57d626fdd67aebc97ccfac8537fe04b19e38680e8b5f005167b4ccbd4bc2a87c3a98d2b2af18738b8b44b1ff480ad69183c828bd372a4a3ce12ce72867a886733f3bade4144ab55b63be2902aef88ab4e129551540e8390357631233eccf23a0668886b39942c23f902265a84a08b07d11b85c096512c09ac3c82023f23aaf48578bca4b50426713c7e5270980c78c6643ef615c2b6ab57b98111a321e30d8a38b5a376f9a2c793ba196e293fde201ba7261e222080d951b4f249a47da98c2aa4b87e165de574efda9577dc815c847ad269210970975d8322645246cfcfb46a194a9b3cb2b91a20fd9107948d8777d0a14d6187c922a5beed80600991f3040643480286a580e932032a37b8c82833535f721edf44e97397e14931cf7f49201d80b75d650f204bd37416c643ba725d2b3b4f368b033589e01cdc10ccfe264a6efe01ecd3b8e92478bfd7c1abba973459346798007990a9edf57b081c73d699b7a758a6013106597ab803870c24e4c2e0d649dea9bc0e0fbc742571b7b6bcca714881db2597c3a45cf0794022b58985a61d582aa59b17e9c567e4b4268976943982705f389566f53c49526ab6c210f4e694544d307d2c8612d1ccc23658127e8b071e58136734082616ed011397bb781896953c73b5127b28437f38c27d663b05745d3fa37e9c2a07dba767f0859e7a30e9d48cce5f37632e817060ca46633c9b4f6735c3bcbb9185abf39ba9ad600718c6fb84b7c7b867b5e5c51c0b0cdb03cc83b49568a4a02ad831fc93157a4e5010ba81c0b6bb34afb908a77b2e8d106f752c39ac1a00a9467d58484bd273733947a619439576a98b4360811c97e73431901978d295148bb991433ac72b4cc3e5cac2a8f68ac9d9a3f5d53889343af7e6b02316831b7208939a88e613c0ec5d07861099488b08deaeb2cd295b6977c7c9b2630cdaa5b0a93ab7d98728b3ccec979b869d506b9c679ecb673b7d83df908aa58603275a36291ca60fb717b74406ec852b802eacf4ec3c2533315240624b5b7a8ec960ebeb04d970cb815fb059c458d02254fe8564f154a8c240086fd98ab6a4a4510fab5205a99ab873f3ec29b603a660061b8eb803b6e71740ef174db09bd6c3447197765a0907d31fb1635435601b0a8337972263857f301ae5cf56a23dccfa392020bc84e79aa6a37450389a616f6e626e001592f7a71fd00ad82f3ac9d1979e83955bcd1248e7c9f5245a22bd26479caca02f70303b8c978187f102bb949b7a709e94fc2069489601c2752222da41090578edfc1083e0a8bc9110b0e64623e320f0bc56c4f2b2bef38452ac7c2e17c5a72166a48d55ce5d3abca1a98d6eacf734249e8820e29721931faaebc3abc1a7453b5b01b52a27284995df4f07a3827bd9567cc31b2bb08825046226e059b52bf8b0f864793926b461574b73198b6b4a128f19607bf1205380127e6597ea4b099eba13b38fa376177cf8d090881a20164d804320469b15988759025f5089d7b98675d554ce4714c124c1c30775cff79229b1b99e4206cbf28bab4017077d4721c263542ea1742ac45cc500d327a3da9c46309ba09742305b25390c50abae20b6e8c8b3ae0208aade68d9e2004bd0c26d21c8096cb97a1a2ab02548ab8f1be5fdea37e49857c092ebd421eabeaf7d76beea2feb7cff7d2376a329549c153354b0187e658306a0c860b1fe6ed14686ca77d37b7c82d66ff62149406b762d7033947ae42ca53522a65fbafe18d3bc3e0cb66164e9a094fe4b44d8977ed +ciphertext: f9b34462ce03476f877e2fa98f7434d7ea6a0fc46495f492e331440aa092a8028b6b3e06fb857eb5eee420bad25e0d46652a7d57b7ecdac38dc83f1a6a863cb76a0f9e3ea1ea69c2cda8c76598566448d2359adb3e02f7c8ef17899d9fcac8f7e20721b646615691081e40f533b73bd1c8dc047d48098d68d1aa5727c859f599c0aa14de4034d2a71c45a58c7d546724b4176682e3ddfbdfeec5aef0b4b3a82b3f8966b140e7c55ccd7ad877abea237aa7537388dea3d6dd4fdaf389e1d1248234ee6f49b6bc78c33dc3186e461276be65dee9cc8c4f2b47ab42ed9555ad5f1318c93bacbb25040b66157a3ae1f2db69a8f38ce29a4673083dcefce7473ab8625b4e9ef06c2b8e2861e758b6061595231a234a5d3a5ec49f65e8b3426e39bd5f6c530f8966cb915c31f289bf80c6a4b75920c0c4885bc4916e77e57c40595760aa826668175738d140a1e9078ce650b8e18788fd9bfd5707038f43d44d08de4fa353f7d88737326b3e2b73e3a3188ec09ee52823c6e6af1b02f3097e8993281eeb6a7ad1d8968f8d6bf9b65ec20c0d09d4835f8bd76296f63fa0dca647dfe3e774c834383da48e6fa581e2aec974e26c91cc3f9dbba60ad9d9644fc2e63da59cdac87b56f4725ece40c0045d0db183f966385d8e330b480dce5ed8332257e3fb21c1cb6c24219e7a082e9f7088bcbbd4ffdedcd3cc492477f223e73fef322ea05fcfe14e9371aad6a8032f819cf2dea992c9b591f2bc10c8f9c6199bb07fcbbeeb6866dc6b590a630341255c73c7d3f9122bdc29b548fe4a8c570dfa63cbf0904a1e7753fdd7fc0ba63e5354c00d2b80724f015f7971ec272bac080ac459635950613a02b96d6e1a1e2455e0cb11fed44d28e6d7551e4ebbdc5a64588bd80834e391e3ec77e034499f53a23e4d675242158263b105fad406545298c26e17b26505583b3653b873199cfc9f5a7fd411a4f6fb0957cfa1fed917d94d46a977784badddcae2f6387e9139712dba33246c34724cc922369f3403c0c9ef00a1df5a4a82f22868fdd2415ac1597a1ad54587b20b3067b01b681b1ec6e4c019117bfd1d5a09e37ed83c3023f3b57bd420532b7048d02b92f1b3ea97997a90b78634c4cef2491505210113bee290011a73b662d922cd3ae2daa62bb4cb096a1f66dc83fb72ef4f4c5f96e94fa69b5722cc7b07b7a661b5802f22f6785d35c4fc969b7bbff0906af3a7b8c0908e73af5cb24e5c5e61fee36edf4ad46d44fb96c810738ca2098112d00da86248c251c56d9a2306ff33c8a6feb46e082b3507426f58f8b129c3cdae9c8f5fb05552b215dd90b0f8f2f33cbd2b99293a4f4867365a77234ea178ab1a8d1f7ff3396a251e22e9eb200c2acfc37422f4c81e7a1fd1c7761280ec136c65358226be94d0d62146f5fbaa6859de1ada3e7026f42f36f3a71260e2045036316bab93387ead34818059759354b15e5d3a5a0429b03c0a78ddce1be68ea7e4d3e6b79b49c925d3410569e903533880d2729075d5831ec38b8c6402c978 +result: fail +shared_secret: + +# Private key not reduced +private_key: 4284a3f80be51bdc3c3fbdabe1abe4e1c87cd6b667abbee5c1f4d04b2ff459887fd63b38bac7421b0c3f4b19cb8aa591e6bb8d540391576f7b305638e718c9278fc05b56a9005338623a54d1fa92fd8b6630d4c1e0f5dcabbbc3d054ba0f03443bc872747df23454eccdbb601e4df63f36dc568ad970ce8fd719bb7e4c6d7113a7e4398d30f793afc45f484865afbffbaa1e9346374439af9c3b068223a4474f8a3c6fd4ac8d0d9226a346bcc7fd61273ae1f65ac97d60d0cef9d727fbc55fa3e98d9f6763b0641cb9e27ee699dce58d5d43b8d4c995cbc438f549a4454bb147cb0bef7b727cecbd9d6f4a2db91ddc85310bfbc16f74529d96c23975414f53c6bbc00b8e6e5a1af0d86aba448dcfac9fc5de1f5156b7642e8552593ee4beb7b38a9be050b4fa2123470bb736b79de1b809549c455045abf1ac656a302cdef97f3504bf9b0d2370b2f4728cfb7ee18ae953af354226e55bc9d72b03d8f294bdc586d724dc75ccd3e5ec9bbf60e78cf12cf7953f89a15e9d75b8aabeb895867cd620edf682e5c210a552e8278f8f296f7397a8db3e5a83e5f3bed7b99147d7902de0d73c3b544fef0e6bdebb54f52404811dbee3f7475f7a9b3cba2f9e2e3be3b4f8abf5fa62afde76fcbdf362ff4b9fb88d82147b2a299cf084cbb6d8e2fb3aebd9b89a2c56a76645d123355d3bda97755f7fe9eb9af2d3eb25a66b5dfaf38f37f81516bac7fdfec69c8e5c9a9a9a28dbbfb7a189b66043bc379cdb58f8ceceec0a3ea4e931e864d47c95565bf3bdc25d98fee54b992aac0a1d9197f8fbdd28ae37bfc60e259788b53e8eea988d93bfae57f49928e1776f7e3e8f3afaef3870f771fad75b9938647ff39789af4b6c4a4ffc8f399138387d9d37b95ece74dc411833f3ae935a07a8e26048c32aac4d7c73906924f7ca53ca52eb65fe85ac44983f80fa79244e9abdf8b14c834611d5908d84fe373a7dba8ba8e3d35efd6c8fdc2ce2e0f7c272a350fcdf75d2fbee0d836a4254c67235ec06dc560f7a7ec7d8db8fa59475479f33af58294957d5d979a83cb6fc4cece78e9f84e45c1f4eeb0e873f260f83ec4863242e9a97373f5278a52aea7b89dec7a43974e15dfe58a55e6fd9eb0848e0790df95f898f438fac8e5950d09343c88f7df67a74bb1f75e17dc15ef44ffeb681c42b35c3ceb9c9e8fcf087d5fdfce0e6ff44759699ba6c5a2ca59b76e5ad5b19e87a7bc3049389a95bfe250cfa541db30a9b3fb22ab3d9f893d9d696579648a77bcaa6c4f13b23c65d4c303bd5daa0493c76c9387d186f86bdcea44488f19e7612244c844450a81acb16ef5aef4fe3e5bb647fd46b974bb45c0af2d7eecc3af7799c3fcaacdadc80bc61a3f3991d367515276191ed61b2ca95665551419db0667673e898a13e9c8573077641aca677d8eeaf09cfe2dc78d0484af1557adfc9b32809aa5d6d38030e66b99e920bc577f0064ed0c3e12c7f7f801bf2e9ec89bc79ec893e33a2b43a61c539711d62e96efb9e2ff7e8eaab2985705418a8df7df9833cfbc7eac2d6cdab4aeb9e933f4b844f4b2b1fc04b58681748aafc566d919862db6a516934ad61abbb180f4665caf5907f99d7786ba6a6da04f79b57c8b4dd8ab3b7e3203f2358221c9cc0f2a671ac1846e59b3d5c95576806b571c64746bd4bd541d4c55128b9a7d5208960a2b74a900a426013f6b48fe7fa1adcba5ec1e44594d3850c1a90e2a6bb341210039b48224b97efc62583f5882c71505a96284cc7cbe9873215697ba688546d3a6f97729b22251f479ab3f92cb08fcc3a9d962a661c6150ec6dfdc7560986bf808b4504ea2d44d595a8c34f4a564147cb798fdb6836cb448ca857d5d08242e233e3826797a4191e53cee0b375d395cefad91a395527ed094daff389a198c9d3b28b9e42b002fab4aef17b3089885e8017c047c35152a0e2709cccd7bf4d4a081d3160ebbc3d7a3ba977e221fea55e01823f2f61bfbeb9388d04103fa0c3330770c5ea5a882b26d14c4266b27722f29863b60c9f6984a5f0c2ee8b6f27385933994d8f9973728c5be6898012e4766d842cd1d7b360e415286c965b0b5277a5a1c5f731dd085df0f9579a31b5920227f238c389a723f8c31ea1c45afcfb6a62e555b0b2b766e78889dbc7a8a174fec48e328b4411338b26074002261e3c19c575b42f5a09a268b223aea813706900e785c3a05a98a5708d083c5e6243872ad78f3b456173267d61d57b2f330d01f7be8cac65b1ca46d8492f39c83338d92f3ea9a3cc7b502b115d5a7700e5885f264c384aa36ff52ba08ffa3eee17531915baabb5c9c04033aa091c36a0c5e99aaf0fa446a945a6fa281750bcbcf8e6666c799a43780b4024b97a6a0b14d9722856838d00890b9a982eba53f8254072f07ec00748a61ca18b0b516076382a9a52eb19ad329bbb81534da023cb03e00cb65046615c2d41e24d6e8ca6da872d46a1181133662735c6e382a615707e3d8aa89d49801f7908262c9ba7f1a49cd3c1ce9a5344f5b3df38bf82121cc9d4284da0c662d8b74ca9470051524ad108a2756bad834a1b1b2f5c01b29d640ad11c70643c0553721504ca90edd32cb4c693fd451564a1ca80f447378423888b3a2d30022997281aaccb939b0bf2f5643b036596983768758ac6b97da4843e9d8183633a65e35cc669592ba3a73e0213489ff186cbc66b8fc49fd2916322b30a6f2cc89e42715a8722c672c246822938b32ca6c47f05c21f9da66fb457206e7b58dda0a7f28b93ce24cd182b068cb951c5b29cfe1c30eb226a81bc06629133fa0a590de985e680550dc370108a7519a0b9da5b06170bc8a647c408477333e63972a7452cac811ef60cce2b8af8cc43b848cdddd7168b01ab9d138270604671d0ce57d94481eb1361d9a7f1c5906a11cb80f6454a2c358ad27086a5214dba5c5f69b003d9856831a8c13b9c28c7087efb8cd7247853b1a9c50b70d5e086a4e48ec77c8c6f4a83a11421ba4b0871692477a6b38f68c004f4beb011a137813ac02ccfe7b73271262fff16227da310aff06a8d23938444436da66d7ec6144ab44edd1322b27179901c3c1703279fc86163f804136a13cc925e47901514da5f7c68a23b23347d2b78ecb07ab4d81420662633b8a07d686aea3bb8edb04da7d2616efb147049c45e2a0deb0c85260862d4d25b47932b54487d6396c7f94193e40483c928460eb6b9b4349e1e4c0bd180111a72246c4bc20377a7059faffaeb0f304a1a64398249b1e8626fd1aa24ae11f67a7f23fdcaeb3494842ab47ca9355ece6cc643c3274c46efbd6e927b8b4d11ae8f80b5345b487a5c7101c8e376fdb140ee343106c093af7cb149b316ba79446ceb4e5e0cedb9b164f9 +ciphertext: 4e5a2814271daf633f5cf2f7a4b26ece3a9998020112ece4c2efc9d01de963e605fc366991cb0c46436a68f6ea28ff6b0f9c18f8a2963331cab1592a83a6bb207f4f12f5bf94f6939621c7540ee98418c66564c19922fd1d7d415f1dba2b738f6377e817848069d244c1efb59c971371cbea78c984ea42bb349ce3d47d4e66ab331e88e19602c79c0532df342cb3aac8c739f61c312e9e422357f497a91d02ec21fb79bc101b9933a6d214dc51c90c18a63077c083fd96eb09a8cc8cd240a273544714c2f12c05c0a3314fa08bdcd97276057c3f069b0c1169aea46f7c0c4d3af3ce46fc6f1a268cba433bf377800425f1cb9f2a3f67f3b6a6100f1f0b167982fb302040ec69517c9629b68328b52aa8bdd7ca7062a1f8e11e60a1ac034900bca5b84d956d92405d6b283dccbaa3297d1a760c7a5c9082938f641dbe982e14beb805d51157d1de7486f96b03fe194b25acf9222c8b86d99fbc75013ce126edcd4f51d846e2a883683f71aba14fec24476172eafaa0f4fbae56be9c14e23e913b9d60a7fbe6eb0ed093b0e2c67a61d1f160aee58f554d5d4a08e8d177b5c1df199cbc09d9e3a9bd0ffde82a7d4aa5bd638a008ca0b9036b245646e48f15ba54f6343c959f1008b5bd90465a74b7380ece0c60ba7f4f0ea683fd66442ac6e80593cff95903333bc32c5bd33cc380c0baab1ca1cbf993055140b3d15505d4598e3f0a51ab3936bb7b8188abff6b1700d4c324eb1c6442744161de85cbc43ba2a5afbc61ef8f64d50f0dab7dd7f35742d8646555bd6cf727772bdac602e4315920f825d0207be79a56390ee39226757a18ae0e68260b3f656873d518ea8e4e2bb3dbc6cefe02153378303caae4cdf13f29adffd9bf703e45cc7dba84f06e94b89b34d744a5d6e754e52e6cdc899fb7df29dff3e2842b5a3c1734f2280a01a61f4719e33f2a44218b603886a2bac8f97d3a43289e622b655351ea13f61395d96c6770d2067f7e2c3d50a9b45542747096177908fe2fc903f65c9c7653e95ecf39266de08293ced88484c95773772009ebebcf935cc894e45579372971f512646949edfdbba20dbfc8cd96605e8387b8fcaa452482a36ac052fafd5a6b9de4b7565cb0eb3e96f2164a066be4aff7cbfa5528d1ce00f3f7100e9e4cb195a6d714992476e0b7c28ca7397076939bb4d25742d1d81c64f23e7dc7ac129a094c7a0570a7720189ff9ad0c1b627c467d8ae30a094a84cc93ff199bbf2679b13532f08308c35e6ce0579e27f0a8eee34af2c4d8db0caf056566b4fe655d36a4db8daa7f2a7e5da5470118c6815673ccbbf05c221e1643d63c25ff88faf8659e03e5c0ceb7ab91cc3ebf954c7306740d0af9ebb61f03fed6e1756162764b342377e1e779a40d6dd68207c11f4297a791562d635251a3703cff46075e4bf384e657f1c32ec70764706835eba6628c708a6c8165ff624deb8baa4fae06c71171897cccec55ff89eff6cb72ffbb4db07e009b44f4762d41fed92589f7ed6b1730c3a350cb544dd95 +result: fail +shared_secret: + +# Private key not reduced +private_key: 72a953d60437f6c7a3855582b31ec7d6d97df18c8c53a787117758a3246ddaf89668d5c71e999418e9515a9c95926688beccf5e10dd4496bc0804a66ff68ce40de820c63f0ed9992a92b8227e5d42d7fc1c1839d74b790ddd371d477b2933da66526a81a0962a52b5b511d75f60d86f14e924e6889f5f6a6a8ce5826b7de3d7f68b50ff5dec35a73da9db96dddf04dada4d7b2115e3acc63c753cab007a8ebfb876171ea867197ac987e6bcb93d462e591686e6528e840cde7d3ab55e6b1f3d7fd67d3db8fbdedcdd47ec49355b6dce27598d739cf9a493c9c388614bd5cdc4dfaa7e8fc0c934b95e6d2fbd8e0133a7d5c1563a05fca0bb93b0649fcd92f3e31a3af2bae9cf64d6f5953705c4aee649346ba63db2e3461906fd382569d875556390fca6a86e64db8f27e9d4d2e86cf664ef3c725c0d0b6c799a35a5d5e7237e4d5c8d94511aaec573a4b00bcf24dce9115d3d1b8a73cd9fa72fe8366d596a3eb88eaac8d895704b8f298571eb3a10fd7b6bcf590bdc4461b7ce522dcbaef7e3bfbeace03b4ce5a8c3d0bb6a3d7f4e0d0e5640bf9ee44ae344133e3cb27da1ec771c73b91af1c5a21afb098ffbe418e55d0e3905f2bd43f8b888954384adb7916154f0683619ddcc74086a6982ae8f9b5ed38e44dd4b7690b37a0694c434f9869140a5f4764c968598462e7f89156d44128d2275ec6ff259aaf878c5855f4eb4abb664f4c0d3649a76c3b2b9e68ffd4c44c074d9473fd615bb6a9efa318d6e44c949c28ffa7b909e5cfa7d25677ae323f9f5fe484909689874cf987f6bfea1b4f040bfba798dc8f4d65cfdd3eb5fc49df2bbd38a3aa2295c541c47faca59145eb864623baae4e7975fb4b5b2b3f7629505393bf590b7b21579e3f7477bf3fb2b8af819ff856395a700353b6eef9fdadd46703ca3be8bd33770744b72e6a6bad6ff38ca6f4dfebca7ac726e7a665b45c46e4b5e0ea5cef77f8f1cbf5a35d3646bd63bf0f44a4bb9bbf1562ee76c7c859984c878c2f299e2cbd438f1e57840ea39d3f88d5a4657c88901789438d35a29d0446af5782d5263cbf13c831c3fc4d15ff55746f6d555bffb74ea5e7eb136b73300d41bdea87c3b8ec4bff8db20c3b7e9fbd355b340d234fd7a78d0c7d57e44c50a0de39f7bc84d3b6e61295c04395d9014c875b2b6b9da55e232e83cc0ab15c9ce7527f5ff90c5a766d8b96c5c18a43a315fa5d551ec5717660b63ddfa01459f12e71647394caccb11426c7f535545a3e550c6a7b7acb725525ae17ec946c16fad855e0517fbe4eb3fb12b67aa73ccef08dc8f9d534ec9650132ae38755d10f96804d8f676928f4c336c41e2a916abead7de971f5a3f9e3b6548267c1ae1642c649b8cb7d4e7dba94d6a343ce9986117453086dec2d9dc5ee9795e2ec58bd8f5f81979bfa9fec4a1bd0ba34e5e6ba54c36778959540e2b979809f5adc7cb54ab54f5a58c3210cb677aa8be0d6cd8d354666c7df30e77190ded7a9d3f89c14d7886678c4da7acfdff4bb85be79cf3444cf4be19d72e03a8ce92aa83243d3c19f66801a6444fb6267853df12bb0e4d54e9af982168c7941e785d1fb9701ebee46eae359c53f6c9370e88dde7dbc3e120b4ef784b4d0a3b69a60403f5b9c4aa3808d7b832ab9939b2a5cd15bb36ba710f13c934f0b5dc5f125b4c4604d330608c0c608f14795f690d21ab54bb9a0ed443601f821b3c153dda33f6b102193a2343bbac83b938e521676ea2a20bad2b515c13bdba9c7efa9b8b460a8cfd6a54841bb306819b2ba7adc5b93951653c6d116c86c302e067b358631259012f1d230b892c393652fe9d778e755bb1d8bcb840c51eb93371c2cb377da1f0a33c13aa4aec4c9b79f492ebe34906b6777aba1470787bce5ecc92f494377555685e32b6d52afd230464469adda074d5a159a54e3493a3364d7443d81449006f0b88669b8f507493dfb67b1f012037438437982c868362c172556989272c8b338b8a56ac0af290c3be991c5b552b77a370c026b1c7b4044499036dff32c06bb4b1b73b66d2644d0709f59050fbdc62b36e7977a7278fdb26798d264241914391c71ae928d5c7c7800fca963f4a5ecd9ad5b1590bc941909e142be1c382d7a38b123cc23aa02c9273b5f377d97637091db6455447574bb0f26a250c63a6aedf6ce4ef9cc1c86424b226b06da65158114fdf2bca1c457f68248fea0ba9576bdfc380e45781bef85bfc87ace9f6b5c6f5805bc3403b9e9a86503396b109d2ca2916e16bc4c7a9c47270b77db678a724bb9e461e2f3adcad69ab78a60cbc52134a7557afa452eb758d4c357af310247f2b61db9c2edbb126d7284f38829861870bb494fc65b8b16d97cc5c9150d4c4318ec698cc5704f8011b19037232b1e337911565382450a4afdb8c8e07a7b4127a7d6d630c74098b528aa9cea5249a6a424536a6003787b7723027bc8dfd07b9519337d5125b8bb631502701ae2bb9c352a3407cb3903a617303a5c29cdce23c4ed747eb56bae79084ad705041ad27cc7441dd8d51ac4f5be1c594019143f41c56cf9b1773ee0cf9f116036aa65896420f82406c1b36009e12433e60993b691bf9295ba6621bec9060c82bd3d8c75d2014cb774a3eb8c8c7e698069437155da058aa4a6831c6cd0b47fb425c4f85c5481282107d4b5c61756dd3235ba61a95608404c11546a28c0191c5bf8473135a98c582608bf7c4a1387bcd92b449f888c6b9990a59725ea9c896fc58288c5905bd8ad06a80ac952106d42b298377a0da30db7f68df4119edf5b45d472c3b11c85ca1439d2ea0f074899c3155a51f26af1f52265553e2136ae3a69b529767549f146ecc6592a4448918a892af6a895a27a64480546db66c42b8a9dd029fcb2bfc14189974531c37405812295e0e85c2c44620bbac2b5376463a0490f628ba67c7bb7257bca690ce4fbae57b717423abe164a43ece7b30fc768779c5a82d3265b7a0d012383b1d8a6967a33969a5d368bbf5ca6137959093c9b321539236278043112c8ec819e1d9b532f5c7ad7506ab9c31cf2f4b95f978cf642b67b2995c8f56c272775023a438845ca46a6858b32201ca14f1bc19761452a0a6a2b6ae4bde620cd8685a89bd02f64eb51d7bb5d29e71f009a79bd060273ebc51a48bfb575afebb57215aa0fdbdc0d0ad91120d3799c8843d50068363b5c47b09572623d7ad8071ea1424799c1eaa7165343af0e808afcb39f5cc8a7f5e14bd573052725185dbcc71968200bd272d97f676c08e4a6053f4e0a7071d7abe99607e7573ab27768ce397a94bb7d29f5dad97d54054915eb66be41023e5d7052a10ed1e60e860576285483bb5fd36e2f944d32c4317bebc1e441470c1372046a790d79d4 +ciphertext: 9be30498fa5f736eef8c48562cc8232b5d16a725fc6ee4d5021ee5440eb211f690d413b3a7f6721b79839c1ccdff5fd07d92372a5a057c9e3689412134e4cfd35bc484d0d157f8b1009594733f8c4ecf3473a752bcd6ba449e4bf9ca2d768563d79749f251d2269a40f627e52be1b5ef09a1d45d1e5c3c01583085b45e637849c5cc0ee698c728682116c835bacd91c865a8010471786a23ac73548866d3429736880ddc0c0f9c3d840c9d46cf9fabcf9f8914967288b442ee741b9ab70064a3a3832f64397cf2b66aff37582c3098014205f219681f1c243b8c96125e8c6a9ca66de25bb74c5d725357cd08402834365061e76589eeb67b2008532bb264291b6e92adc1dc550533901c4aa17d5d8501365acb3c7d4dc219aa9ea089b4d4e859d258a6bdca93e9bd770a19a3727d98b3e7c64d2fe4915f5149a0ffd6beda15552b5b3316b40a9e4e91077e736cedb5edd7e9a1c55f7b4cf448d1f3902118ddd376187c67acaaa74323e57f367fa0bd800a5facc0689480f47b7c0e4a363aaf51c34b36b21e99f393263294b78eafa045d8b9a02920d51e7fd1feb3dd9572cf1061907e7147df40bf130326ff20812957de39e4fe68bad5536df9b14f4bccd8983ea0d6185b50bba47d74403916dda1b98183403d50c85ab2ea42268ff176346c2d8dac280638964f5ee4a4d13091a8abd8498eebaa3d3b9fe625040badf9730f46b1740b83e4cd71bf299a1d4ef738a3f45750327c2194ee42a6e4338350ca872e1a1c3499e11b34869b0a8b5c4ff91c485f6cc1814f41a28400d4eaa5dcd5c6097ce27dbcd200e8b016bef1fbd6ad51e29f3b677f66398f4a3d691a19e4871f497c0a89faff13b59f6041faa36493088766e8c11a30231b2de1080dd5efe323522418680f6ae888543a10ccb720a00c765104afab09806a2da4950b3eef4359f820244ec0864199450009e7cde716cafbd25d3a833cdeaa5f13a346f423752267b96a1d70c0af7cf8e30df4482438d95b73a82ae399a4e08bec89dcb80e948903daca79d347c9dca33c9efb30a8994a3428b255f4bc63ba1cb656c9ad148209aeb4024569922bd3cc7cbbeea34133b70cec836e53405b191855dc50bad0ee9e4ba62fb2750ad0d8d0671873212757ecfff10c479a805d52a7777c300350ec3cb4aff3f28660f1e0a7bc5c39d2fb0f944fd50c6c1f484ab01fb6eae7ac4cdfa9feb60734badae4eb075c7222382c559775229fff982ad0d64578b38a505442ee3add8a665c0c25c4d4e0d872f048c39a4e6bb1db711086b3db81d8ba2a39628a18a92a44c66628d966f11df04311a3fd13b2d1270bb59e0d377e69c169feaf8e0b74616e9caced4a296caa658c0389713d20153b162c1ebccb4e678261d22f095107471dedac0923efcf9935ea4a531211b0992fcdb24b2117513230d40943c3639d7613da960e54e5159df207b17a6e15d0bb4df2a491a9ecb56867be9334aebedaa93a1304d07282e100e3ea2855f6a1653f70c96a1495fbf78f2a7062c87b +result: fail +shared_secret: + +# Private key not reduced +private_key: 33ffc582ddb288dbe8c16ef172098f6f3ddcfaeeaba847e75da86a45d4b6bd985728f5bf967bf84eb96e059a8b4a99c0416d46d117640dbdf9ff7864516cc6d49ba33b74dc313569945bd7a10b3820c49ddf965187d6794f59e73463e70067ec798f43ceffc620b676657bc6cd9743242b6689effbaaa432fa0e5f6aae79c01652d7fec3721b4a3594ebd07fd552f4e00beb54f494586c73cc5727c7dd0f3977efdbcc248bf6da8b6e3687906ee77ce3326e9989c95c521adde7f5a8d6defc68f476f13c23e811ca618e0dfef0ea6fa759b096ef59243c897a23faced9661c4cd4584bbc4ccfe8cddee8aa1d72cc3f69153f540f73403af7c09f6fd53769f965483f25394e51a57f2403cc6ac6471ca8633a4cd0a049669b3d61f82770b7a7cbe4638a8c98b686c499941ad04e9c3a7eaced41b5d8194357973dd03f738e2d9489d6bf4967b6be64d3984e5cfb69394f9907d72caa8f9bf6dc6fc6c801e77fc2d9b2286674df1cf0414832d4193a025bf6448bc33d3d405c134d78948c34fbbf5a54f636b87bfe3d51bed47f87cfd83b4e98c9cff4d1f8c0b0f5769ee7fa190f7fe4a85d9ebaa57defdf6a6e93645c9b1f6f51b6a5d61b8eeeba5f70f64ea73094ff57df498198eb5cbd71bd15af02e8641d1a3d0c093d680a7b4283c4d985eed3c9b5b87cd01ead5bf5a7df42b86071aa81e4d534be3b4c93bfb1492ea54da8e7212cc13655f5bfe9cbf9978429c7c1b3a3615aec75d475eec85469f354fae17b929bf8aabefd539c2b783d3d875f29b68ca5ab28579f3d87f2126598801368ea9648017a77c86d8e1e54c5ed0bc0ec48b1af037b23665c1e675de7a3e2637482a9655a5f7fc15568eb79bc9b8125c5f42f48285ef8a993a6553e72a667dc4ffa6e5978f39174c6ca9a72a8a793c5fc61362c424c5f5fe3cf3f94aa4d4be6e0f1a55e330a6a9c6d56aa86d5b76f3f8a6fa996f8d6de19dadc4dcb34cb8d2d0f4b00a4dbbeedf5be366d12cbdb78c6b88f5af8f01731dbc7c1027afc68da6a5bbbbd1e6a898f36a1971dabb9cb6f04b3881d85bf941de42ed3d0fff2db1f33763c8e6d6dbac076373a226de495eaab2ff3b3d0044d03658590a4c73f5486dd0557466eebb5de76c5b7cc660be0a60db5cf1470074db2679c80da38762a06eb454f687a03de5fecf308c9af02753aa8a93b294b6e541490af4c7cfb06d515d9be34f6b7f73c4b6bb4842b5c608c09e0d9cebeba947fd9fba4eb15e3e8d35c8995473bdfd0051c6063b3d22fd6a8dbacd37706f739a8f556f8676464c86d856e6a599d031c35a2a4d14a5b30b4aa5bfe779c14c5dd4f6a3bec73e8d74eff028b6bbb237f203b4737a9cfdeff52f9c9d965ddecb736a832cc337e078c6b66b9733c4f850eb81829f6f2c73bfeea63cf3b843f0e7f60e35e073fe9b2e76c9c93daa187bc8a863b58a8aedc9a9e443c93521be09719d89f4b40c8f7966df7af854b4718c9ed316ea6aa153d7d336deeac9cd00d72d664d97084e16738eeac3e5fa2857915144f73f9b50864f4937d6e1d285ca9c58eea9c3118ebc21c8374c6374cfe7c846ea8e5007b602bef3e43f68b839ee499dfbf5a357c6227560a1ff877e48a8645bfe5dca2202ca92a9b07a6b33b49872ff21b1cd901020e4ac369fca24c00593be105483a24076cafff8220780c9bcc9150b3a65571fb426ec47a82974bb2a6ba13a13551d737e1ca2cfb50103e14269263caa5b15b16066ca63b867a250318fb7335babe4fd81a2ef56ce7b5beb88c65c2bc6c5a75149898a3d8a552cbfa6af1a463a19a071cb64280da48f3684d99e0b4adc7b48d039358f201a7baa1ffa4ae95fbb0d45776bf76523cd504a379377b740d26069e933748710a63781a23765a6659eb4718dac557a8553fd5be04230166782860a3012290b068542dab126a9f921aba2b61afd6958052baa7b24ac50cbf1f613abf761d3315692c49184cf3995cea8f161c86768714afd1185161b6da86c73a6b228b953dde1713108029d7a729811b85aa906f67978239c6b6f9f4a72656b9536b23691b27b3b2316176357c07b671eb562c41621c7552265914c500a21299b17dd258e2a04352b506138187611c19e7d8860741b110c57372a3be2be7a3b5a6c688390f06a5cdbaeb6dece153ce5181c8080e4f879fc063a68739032481c2cea4611291362165a63ef3c0f436230409c8e5e57c01651471694bb67729919920c6852bd78766a5f5c1b5db45c84ac14c764549b54d8b2404523b0c00052c5d3538cbc00bfd96b8034206714a645d447dc83844ee82c069f63b59587f53c3cb0047cfe63b4f6ef41513ac5194b91eab2a5ef4d7bc55e1762e9162f2fa009a9c437d2c93308ca411e8ad7f9c2a642636d5e89f93f5bdedeb78062032db389bb6fc77be489506a98022e83c9aa9b7bf65c561e1a8a95871e4ab1875535981466286175eed087e61ea034c9488fe953106aacb251c7fa044bafe474c2eb602cdb091687558c02778f4b562692349f9b132fb3a921f75a4ee6c33440ab76fa420bfb339e2f8c225bb85538cc4388522f9628aade183c1532baa778faf937035639a5367cc64c4c036fc25a61b4f85470402e85ebb245a43c92f2cfb0ca69879a0fccbff31a35f2b46c986c66386308fac63978534e5eccd137561a6b110d82a2328a90636b55b8d67337626115448ca7eda95a6d2740e33c6cba56a9f34a95a7bc8f304702e25315f81182e54b2656913939083c052664a9844535301fcb730dfc9c5571ba72f279a0412b98cf64c069b89acda010494498f92838e32c711f1712d8b34303b3d594681305b20d2f8ad43fb6598113415460a0326bbca4c1d658a1462aca2a619abcc5a61a99921ca82882e1569c3902769e208c61124e741630fea09ec58065b889890a667d25bad039c4846a77d17acb5e726b5717b00e0b3918fc767205028cc4b67cb29b49196b4dc288a3abcb112bba52f0cae6ef09cfbd74d939b73ee610f0afa6d8b345d3ee95749cb4373ca3f52f69ecd767893135e7dc4ba6d069c053b79fea0c69b5c1258609046c761c77322a9d4626de19df5543165958a447432d5237f399bb1b9a8923ca45521b21cc4b17d36e724f5a09772a7b8609c9c86140b03e8a10c54adc91204c686049a643db89b0c375a359c943d5961a803c6ad28512839f42326f53b22dc20455c843ad64753498e10145af06270a81213046196d2192d0ae3924f4dbffa093a9eb51025b31d268a74f44b849a4c408426071fe5e18c3ec8b5c44c20aa5a85b2e43c56e051698c75bfc27bb9b1722501a6502d1c0dac0aa7f1b0f89d7d99d5c3e0d10d6ef9af054d842375f695abb28e3b8eb495100f04306e92 +ciphertext: 505762f4bb1982d5097e0f7a5bdc8da4d943a9f9cfb960077d0c303dd0424867038ff99fcace7860f6c593cdd50bc8760b9477cc5ad473619ef4d8d8058c88a267bcb5783a1edb74f5ea36cd39f8c6910061eaa927f7a1e84b51a1ce6e507eb45730724e422c92f61a3f8743a590197b16e6050f4101b6c6d22a12c8f1a8de5f0f6d7c5dbddb65c27e98957905ed7e55d6e51a46dbe462d9b90ff0fbedcdddc99914d3a282e09564b7206c83e0cae6560053a5ba1a83a024650154f91107abbebdb10f734dd54932a6fcfa73d58ee23cdb936d74c7e9cf31e9353b6db031439e8dac753189945a9116358b797610e845e958f827e7ca0aff758d0dd5acc8a890d0771ad7c470586595f54c1ee8f1c4ff867ea4042a227ed80ab49c17ea5d2089c7b27ef405706fc08351945e21f72d7e4fb32e26e3bc21eb99145e3e357e4a10de75f348f4303ad45a83dba56bdfe92857731d55cdfee03d647c5a4ecef35b2ff54857cf1a8fd7a9a244a95917ea87184390d6ce6858afcc22fdb3d53137fde169e0a5852487d4f3ea78fd9d295491ee6fb86cba9f2e1355519994126e1301882964465eabbe07697627a22819667e8079055b8a6fc5dc35e0629a1b74d64b1912ea7f902cb1459a38a0fd5a9773933e0a10619fbe281e0ff7169a791179057df38e5424dfe9cddaf545750c2269c64a465c39ae65d5249f742b66d32033ed35781a099b02c2b5b7201a7b7c2a4e00af0c724fb1d6dc695cf261b60d24ec5a3f028c53feb6c63ee90e424ee5e467f3a0d693564676dd8f2fff3c6d45d5d7f095e44b1b5fb43d65cfbc524b001b967cfc8f1d80a198756c2dc0aebf272f71a4fdf3c4e7857461d7b645a11835b8ba7dd5545ecb5cd71113119fc7432d73f816bc91c1506dc5b4fe1448bc7fffbfafe093cda411044211bf365790c20ac1808f8bd99ef833e29f052935f35ce8620c0e113eb4153db9ca285f31b5c62e09e34cd41b427113e99b4157ad2b6b6fc269b6b350b540962601fd7dac7f6199d08bab7851cc1b5ae954288368cee962af736ad7567ed9a961dc0fd5dd428fdf6286e7265421a2b05f2278a89773b5c77d2e52611d292336f3ef4c6cb230cc91cfbc0098a41d1504253bd378d617b9020d9259bc1288d43adf5cb135cfde2d47d55479f62241de834f10334022b877149b7dee20f2c8b66d35ce27d2d48ed1a9743517d3991c45a2831be582bfea1328a09ae200628d5a0a93157abfe9dfe08d41c1101aed8e1d8576a4187cde5bf5a940b6a756b5872d8b1ffa9a33061fea423ff3d9f0c7a5cadab5f9e9f6845774f112c931ed33f020ad45895133e2f1f2a31e894660df8dc6aa7b27b15f1e868c27308450b4f496cb46d2f45d4322cda850d09e37a20e225d8678d1d1bad2044801e02c13ce351a84197b529f917d0c41f45b02e95400046b2e78dbfff61c638030ae94ef4187ed77234f21d01891c4070b7d33ab61d46926dce9b56bbf7e37eb39036706a0773f6b4399a2368c1f70191c995e5533 +result: fail +shared_secret: + +# Private key not reduced +private_key: f91d8802536a5e1be92cd8a762dee63d0fbf2c457bf426f799884650185cd6e7a978c74516e85542cfe2b913f1a10e4615a973226b927046cc24f7d9e988562974f13a874ed60d7d8c483336e8db2338313606c717af5d7fc8617b5d6899187ed9a73d835997df7e904ff82fc4c59b12275677c9dfb7cd79ca97f866483ebf3f6e33f369006b4341bccc759b65668e6c8bfb3d01feebfd8bfde14b9bdf163bbb8f852ee76037795df78b9a228fc88375fe187fe055397c6b7848b3a8365467669edbeab81a8747fa44a02faad5ebf31873bc4d4da45faf65fe45c9f8f43dceeeab1573bf0726e39549490acc91affc45ab8e6809d53879678d9023fff42eb2c203f992ea9e4b2ef25808f46623a701a453fccaed26c3aeb37c50b736f5887b5cd9eac2cae774783abebdaba500eb9445739eee43e1495fa841447fa19cc360f3ec961ef227bae1e364e2c2b5716d86d2cd07a5b48b35dffae54e6780f8573203d367bca6f7f41487935e738e3b8cb2e3c09956c798144fd6d9f49c2e4cf25ab84bbdc7d1bd3728b7847c48566357dc41d59b76fc48f969e99305d05117cea1ed4c0c3cd56ae740fe2ec0cad76e70f55ed7b6fbfd54da2b66d1242837cd7fd5196971a5993dee6b51f399ae1ba47334985ca2ef6245897ce954a7f3a3e05e75cfa263d2f17b45e14d59803bae9435eda05e53011fba052cc8948463e48367dccc5842354e7fd759622fb56b76d4ffcdc58ecff8a227dcd65afbe9757d8be35c1a0975cd1f67d789c774883de06bbd668fe29b57a5e195e95dfd6bd70352574c68a4c7ed2ef5580b67e66c3746ec058302ba3da609e7f1ba4b572a82e289593dd57278cdc571dffd1cdab6aae39b16a68f5684a5e367c713e649af9df776f6c3488b494cbab596f73b1908ceb8cd5c473d4f4e26a54b388b61aa3c663a316314405049c67accb2a7ab621419e5a09488627b3c3683c3aa198400fb6a53396f978b71189b7c50beca005a79727c5e6e1f9af83fd7063ff6188d7460948b33197ea36ad91ce9ab5a2b9437f961b70c432b46dbe118a4b589c66af374f58668e85e5b02aae4a37fae4af399552796a4ea3a8d37c265c4fe39cfc58689fd6be661c9c4753d373004eae66f69368f976bf20e65510e3388b562b44ad0f90eb2a88fe2237b5cf53c647724f18b94343c1bd6d3fcbe4475e4289a3bbab9a3688f84ae56f42d1b56bb0845b318e7c669cbddb7d9576b91072aa38beda6cfe444c19f39d189cac96e667cd6449c0ba8a773c7106c6b8bc4db100b39a66f823d33a180eafbed9f3d1f7d7d59d7a8e397c68029b93428bca45f495966a79c299e531b9b59b437e86398b82e57fa43391299770b7ab37d7eb3885deb5ed5ce81b88a26a7a9dd0f3635c932c36e99b5c437536ab194074d1dbf4f65285af7bd3f6a9a7174a380ad03c6826ba5fc3fc6e94cffe11ea01477e7e8265b31659a806975bd589f773d461cdeb6c52ada2cb6ad408f5c919533c24c807a9c6e3c88dd0e333105b43044d7931a2d621874395f7944849fdafb55483e34abf4fd44103f53fd8dfe71e34270d38e4875cb9b6d90dbbc53363ef8c18a948ef8f1e49bc9c79d563b9f728c7eda38724d9a8308ac6b70d1c87bfeb07775d56703980c9a563040d1ba17297b1f253afc339ddc11a42cbb051ba2722854cbf45bb80cecaa81ab63ce32acfe953f9ac8648b95be8668822060bafbc10b59e72944185a57f790351a20de6679328169b954465f8cc028558328f3baeca98e42404299719d205cb17c745a7784b97c09130e26376778a9330c99ed84288ec3955df4076d0c9f5847af05bc58352c1364f34b0213a3cd05b2d79108af038e457a30bb5626b1dc404605678ac675201c537a8a6ad67a8e3e0b17a0e8632ca1714dd341831b2790591c1f39c530288dc8448527fa542d64192e407f2304747ca7cad98986c59622b2e63e076420916635a538871aba5469f36a5536356d176265191fc150a4dc7349f07c932c053ef4b6bd245448ba8173ca0896e51092e06537d2157b0c1624d3a29eb0d055d48a038c858e53c1045c392d6f59408df2bb19b35a87737ef90b9fdcc380af6a1ea122838c673e39f502a08908ac33276b4297c712b3c7541c7806c71dc76e9291c89cfac3a56c9c94852ec4a47bf6642349b95f69c43005fbc927113288caa2cdd6175b2a627149027e3688b436c336b51c8539cec3c5537de5ca6955543f984c73005181e916317262bd638e249cc928e048a20045907b79c441cfebf0b9106c8847b8088b4c41fe6b7356d7947ae9a9549305c9278e6e3a39060854b88b65cf9a20266218864c94377a475c0822d454ad8fb42c50a13f1be65dce1728388a8d4a81b372a1486a86b0e6d1abd445559dd3b827b834e2ab3744c0c5abc51bcb7551cc888de7f590ef780d7cc94225830732f47b6ab4777261944cbb3e6d943eab827da40a7b00d8960db1810d028529449dde0c00eacbaa321c14249b7113ba43968b79070b9117dbab36b44f05022bf25a9ec77c7a396415c7f24ce5e364b09a16308472e1d49ce92a41d3b868e4664e93279467745b9e04c39bd67cf0226d198110e6235a3a35af970a73a3472027e1c7368c867d23cbc1895790f2478f807b756516acc4c7dae3a350f26a0353930f4c23c3d982fb90176bc70e0e6b739fb67aada24d10f2ac30685c2d7606fd6bce5df369a0d176fe32b0e0e8cbf583b0e2019167640fa63c23d7223259441152b0c79d9b2012725b6eac08ba8438cb90309123abe5980b6ce6889d6b7d1c756aa7a90181a1422f5a6f803b1e772891a61ca657175f7b815cb3549d3ee613deb001c7ba200730b2771b5743d80ee48683d94015ac7221671a3a711468f8b3be5ecbc1af824dfbbacf87972874e847b399280eb649304a3687f43dfd769e13a4964892b5e635c0a2216273331da5c5b18ec0b406ab1163d4179af5aac5fc8273296e2433c8fd993f9340c5d365070cb72715188b52cc0426146c54a3687f6a57f36b0b1dd639c505bef4c71fadc68d62009bc6b27b3817660df31faad06e86b91aad252b80461200168290848f963010511763f8614f202a3a05680831b8bde86a18dd79248d46c144730bc7b4757ac95f34ba2cf0436bda09cf5a9285e7c924f3b514695300c33cc6d92c280ff81e72b549694aa7aedb46afd394a2d5826e657897fc53285905406430c2b7786e64ba44225985f95146947535aae744a3b3707467701a8bbd99b938f2fc7737f22bcb9f146983a07f72c30933b8e50425fefbf58d711f58cbf9fd8ebd2835a1b55469a2a1b993eacecd292e4c5f9e1a55e0489bceffb204d672a6215f4f3980a646d9f880817c52dd +ciphertext: 8d02a5fd8b7945dd8e00b27e4c2ed63c4e5566b3b2cae2f068baf7e0f8b816261f56aa61f545d41e18d5cb2f4017c97cb3b15eae810a7f6b82967420212a1f4b794b45d8f79dfd8b2ff1c21b50274fc9030b707191cd1c5b8b519873a2e53ee6b74d9347911019654a3482b80d5e9f15c5e6560bb8f7c6b3a41ddd398b254dba5fdaf91a5d37fc1df8c8fba39f75bc780def00847d929dc8f283b2ed381660ca7848eaeba9b9ac0020952945e07a946b8a4bbbed8361031315c8c5180cf072d039b63f7320616fe35dc1edc4d52635bdfd392a6b01964e232b409ffed11144b61cfb7dd477c1dd0daec06ae58c5a4bc0e609fd35972949c93cbe0382f069a39fb478ecbfced5a059a151fa09df4e2e80b3cac95129d9f75d905cf122608ff06548ed6d9aafac2e21a94079f2efdd3e569bb12b1d3d9db82922e7ab0c9eb43a83df5bf18a1d315048267f5055f04c10e1afe3dd4b8c4483e0639c08c6410acbc2c63e7e0b7e4258575ce0c85aeb6961705bd86d4c95281212b21f84e71bcb4d1bc9307d5fe07d0d530c1f404c1f2ba4ccf6327549a0f98f7fb31ec5da2858d6b3ebe63d27b51a4e3e08a10351dd521fc39945fdf515ce419de7f39c4878c5f71a1afd69a3b6b8951da056159011329d4aac3d5379f44a873a604cc60c5b6ab7422fbb31361a233c2cd664ead5ecfaae4bd71528212736ec659688d29831c01e3e5c03b5ee7bc2a4be63a129f9ff6dd8e0ace373d41e3f32fef73c54ce6d59cf15edbc276703df264c57532a6b30ffa94a32c36d7adc9af13e3a04bbc565d112bba7345c142dfd3a44798fa837492933c2f5f6fe08a43a7ad217ecf6c07509551f36463322ec364a23b444f037a53488c14f91e865285b1087d7d99f063248e22dcf798a2dc217c691e22f3e3d7d3a90de196e8d7bd18ccd0179ec35b2e350d5329af42177d7b731dbbcabbea1e6deb321b8f4f76f95db01c631df3c912afc1438e245151420cc60140451ec7401b8de1eb9cc652a008574ace90f8daefc8541b55be2b033af389226c4bcc9461a291ff6a3af15450936de9b7e923b021ef131b573e2ad16414bf874fb962a7803bb5d620e12b6839c7b889557158e79e4add1f4a243d0f3257ef397a4168a2311f3992ddb8981782caf922522faace628cca4f078f948a8aed18bb6f2708e810feea2d4f1932f6e6bb9c54a906f79e6a13b4d2f7f6f106b88e18fc955e1b4ecd5b1546c5ce295f7215b3b33fd5788e0e24306b8d1059ddba8e151ce1f5c6cc6defd3f9f9d811107511dcd882e5da61452433a24d2b0bfb7420a7924ea90a11106b5f5bc0ad7428fab53bd5fc955733b9173677e8a142f50f005cac94bd770f8397db0954fbd8d38f2031681c644362f48e6f9bf3da9cda3369174dbab9089e83fb4ef1814ec4fd33f4cff8529e9b482933de533ad2fbee4a6341f1c227a69f0c52e0a775eb0ffd8f88060b9555f0edf07791fa1709e769427833a5df7d92ea0ce6bcc5f26f280d1e8c551c7f29cca8ebf6e3d07 +result: fail +shared_secret: + +# Private key not reduced +private_key: 258cd4ec995fb9757415bac7384ddb03c991bc8a5c4be86cb0458f66a551cea67fde748c891e3c08fd9e2fad3efc1432848eb2132d741d1fc1cdf9a81d4af8e9b7b4bcc88d0f38a700dab5beec59d6073ad85697d157f8604be190b8e15116ef3169f93dcfd96c093d72f33b1957ccd07d85ab13ef0f4d4b1c1bbd0693ea9574b90dc6d25fca778d78e51edc4bfddee293ff40d9f6f26749d36d0dd1dddeb276eef316f6d5c73affccc558883fdec958412493c8aa4759dd0848eb0f71c55bbbbd17864243ee8daeda932a5a8d0a3479153a480c9b0ac58b10334c6b186b395f6546eb31a0186e6235f0b2c6ddce0d34532f948cc8331714f7a40ea26fafdccc6a71b979b7f9bdff86e983f1fbeb2aca42032dd260a94b847ccede9ed1e2be6041f96d72b8cec87fc08bf5a75d5e90f79be23e943e16a3e69ec7f6771a7c2826351b6ad5a813e34c24b72dfbfa6f38fb94689ee47bb4720f926849821a8e322a039150866708a6e52b1ff03645ea046bbb6d178bc86d5f92254cb8bbfe24544650da4e290cdbe9abbf0c2f96d6bc7e99b4c1f9e5dfe7fc7a130432bf98b28e24fcb29f4efe63f4bedf887a9a7b6a2ce8ddee5b5c1f7f17b5739b5c5e33e63fb2494fe403cbfadfd59618ab6fea5b1d78c4d0438fe94c447a5afe42d974a44890db67ede0cf88528b683a363a93a56eb6c9b1da246f65fdb0d3d6c38b4975f6bcfadb2c62aaefd8813cd365f3a2aa39ac575595fddaae5ef5c7f7fa49d9cfd9784aa25d7e66c92759f594f1ec2d3a1f8f91604c84d24565dc68ca7b183f78fb5a6879e15bc7b7b1b33bf4e4afdac9af6ecd60417d30107f73223aab0fd85401c9f3d6d6e80d8e5853994ac22bc45e5b7962ae76811780af5bdbd84a490a0a3ce116f204c535c9a3fbe4137a7b7aeff75579e72b75eccb806b674191197220dd3e5a7e3920949e8f6b5bb278b7dfe4df1125ace9336b5bd5b46f5952d40adc780a875b87bbb8caf096d940555c69e466d2976be324875e891c6c326539052c811ffc4417bc61205b430c6ffa1a7b4df509a4e2c9bb5a595334ff9b987ce13f57a9e0e9eaf89ec8097cd330cb59c27b3b2ace5b141f8b86336cb1cf70dbe8dd452bd8cfe35876594ac51eeb621792468d42e99d6deba57ab57b9565344e2bff7d87a68108a8487b8e7ab5c779683cb81b7bb258e5980485d5ee98c7d66676622df56ebcd694b3565b17e24786966cb8ef1ea5a8bf6e6544d54f03c5bec6e8eb392a723ccee76d94c75b47cd8b0daaa7836e1774824289803df38c0f6c74b4d4f661deb27f5d36c647bf4089b3be19a76dd8ca5193d7cb9fb3313f53dbd9765cdf6635f3bca865c2167f3c20358f2b4c487c0d8a801ff1359889dbac532dfbfb38ec8f35a4a6b03d6598fd9e1f84b80824ddc31a36b1ebe1b14cf3edc79ae6fe861dbc4ebb4f7a63be53f82ea5442f4caf3c54e15467057cbdaabeae41fac0ca7658a64fa8716da960d57f83a7e2aa497f0fed3a922f315419f79cc89fc6f5afb07f497f99ca8f4ae8da1b72224fec887e3bd484612204783117aa503fe9aa0e9c251c8f92d8bdb946b42078f07bcd4e0fbee6aadfcebb25391415630db5300b05ecbe19be36c8ccda4c9852a442d4259905628087c232f28871b05512dcd2b769179ad09a9313252dca243d73b387b279a1ca1151fda2781ab7757d2ca5c64052c8440bdd93acb5152203987bd5a693453957504242b3f8667d3c800e9a969372a13fd014715a0bff3a24c8f31a69c329a1c30ef37ca29903ce0943982413b0ba694ed53cb416f125151c8f036709aa2174ec365a56d608a2b54ec71183e2b4258e71adc09c81fe05065be2bd972979eef093cda03bbb82b6ee4180731c18fa997195d4917476427d7c07d99b663c4b50a9cbccb3c364df354685273b8b42b9e118a427c765b08036350a330be79b3ef4171b953faee56f719483717854b29aa3385545d3c9cd71b0a070aa2734f8327c095aff6b342584a570371ee7ca3f6a2a2bbda60c4e3aa264078b6c9bb206781f229b9a5cc2bba0c8933d01b469b4c687f5a1749513bfa3401cf1443ec0558c89c58cb795e3686640f6350420bed4b839ebc8106ff7043107c590c0bfb753c0aa2305e4920d1f639c3ed400a2836d3b638051b58ea9580390ab57dd7138421709759b89aab4279c5a9768cabfc44ca6a2f1cf5c039e2b0563a9048931f1565d164c13ab60e4c92ac843451cb75662ca03c47a652445b7ef0b8e622187387059a614cb08796d34758133050161743677594d51d02f290b3cd7f23d4cba1a64377baa36082249ad896990d79aa040a7858f1b3dfcb43adf040f1b245d216b2e23420e0b9613e9db6c7535063d05079c739f70759f7de0291537aaf5d6b3f4b6291c147855ea9a79ecb0ad80714520971011365dca81ab5bc0d9d70ade36a125ab2295858b79370fe21932504b9d583c787bf28762241a279663baa450172651f126bb20b85349b6344ad404e3093369569148a2a8cb7b7e08e68fda3408349b4761a171b0c2c85b37227cfa3d7c16a3950298c100955402919d14a71e7b231d60ac11e81a46515cf2f25fde507c0df59b352187af7059f3620026c84469610d0098895a3330f7638082d5b5a925afca637a1d160ecd2c83fc522a3bf40591fa5ecfbaa0a3b1859fc58b1d157c18b71d540b6aa398179bd65dc00866275cb0473964ffe5a8c638bf57304d32e24007b3c61429881ccb1a0403566bf3c46d8a19e852aac6f58d4ae32f45cc7b0f5181f18675920680c2c0ba8ed283fdf20c383bc08ccb7d46eb85204126be034374769caf39ae633924bc8ba6b7b89daf72ac4a86bf86008c02fa0fb18a5de6f8952eda2526fb1d994b4165149ed11b578359a7b9d0bdd7257a2d00b676268a38528fe34140eb408ed5b916c0c43d79ac29b0946702341cd7c20ee23c16a6b2cfd1f9107872b8965952a9a45e0e435c56695c819b71b9a6b6796553271c029d06cdb0308112a89ab4b714566a4b18d03c18d223fb6427c7b3144e64874c26a8ca418cd6f14e4cec2a0402698aa1af6ef63264806e4b42ad3dea298a404c1ec260935166418068edb71abec21040f9b3eff4389358b7cce70461ec8c0ae8873a45504e8688e266787421343699089fc31f84ec95a9f2264eb3ceda71261ca791d052a43808ba1f4706717a10fc4ac21b625fd324cd86ab8b3dc254da31bac0f9106028258adca5f754b309a6c7dd30e11b8701ef37e8715f03c0d8a32e9fa39d37e7637ba00940bce58a5d05a4840f835b8ce39703f77bb31f20b9ee4fd3795c2e326244208b288c64c049c6dfc0f1476cffd520b055756162f7ec94243de6b14ac0b9e5fb366c +ciphertext: d09bb378673304cb931ff7390ece8f2573c1cbb9275b8c26bbd0ac09db08c43c0a9b77ccade71a051de7be9616187ddb7cdcc3382ab8f6bc6f52dc344a20b519a7adde7abe4262e2f1642b96c687ff873ce23125c8b93323f213dcefde61faec8b976a27ad4994887e92f0f69bfa51e8e197ac378e324307593331ae293c91ba16d4359c7a3d43c6da57cd988389d014c3c2bb6e3e7ba6adf91d076a408efcd265935fb6332a77595f7ccf424ff11657962998e0851db1ce4c15db64b7db28986c272bbfb34fd20e239c7ef3beab2e101562c3dac28ba965fd5c49dab3085ed0cf327677041cb38b9b509d08f4140f7fb977bbf1e7bdd0b86bfe4d1cdeb112c3bee679bd29165dc9a81e7b1d9fded5b334ba7c3066203731642e3f1bdb606cfe2855c6eef1908db8ae2d3a7f4cce4e517817c696ac5f71f2c83db6f499d019ba3a1bd0038b7aa074eebe4e78e0a2ce7919bdffda15776489ea76a90246e5ef8acf9d38e44ae3eed809c1da8e2c805012ebd83e3cab063d6084b9aa4cc0c8fbe32b900128789ec63397d45afa6bdd7839c006ef3d9300cc4f8cdec1a565dfeb8afdabd1b2f16a67ac789348b6caa780d96f0b34bebba3ad00be9231a1ac55ed651259573015133549962b5288cc733431da4aecb190a8d43fab2ae764e770c735093ab4bb61562defa7ce3097c837f15c8ebb3097d0ad7e812e24467965938eabae899f82eb417132ef67e9aab3e8bb2c535edea8db70cdc450f8f4f100992e18af931fabbba58d9558afd20915266d71e92d8f92ec3f3fe455509e57bc590857edec1873fd1ce867ebfb06cdfb910607856964913181f86ec635a32266bb2b3c497723a0b9d056175f101d8258b60087a6de5590cc73f8b0e68fd04e187162eacdf2a5f0e8ce480ba8b45d1ac9e003b4cc1307dfc3e6e101a96585bb9533e6a6e4d0dbec742f73a032ee0b249e97791128f63c774c0203f4c19152302127ad848f427bd90c36126cc3a1f8cf3cd81484789e0f51339ecf4582f6b13c1f5268b126a99490115d544ee00e8512f819ddd4ae3962109b9c4361bfdcba56baf5fe9a541d646da72cae1fae5cedc8e8a165790a430be4ff41a547c2a1fe5bb2a13af50f631afb24a55e90356179d91c922f276a202c8f7a837d77710116a85686512fed7878ec011a60f40ce808bdc75f0790d2fc9aa3dde710b31843b5c1560c8bd75cc6539ad939bcbc72768e4d418e119f69f5fc7fc00bd5681c49aa0d1d2f8f4dc39768154c10482bc06a894b20b8d134602aa11f1be166a15dff347b5a695e52f2d44ff6c50f371ee169ea64db848e1909b6392ec4b77a0658fb1243bbeadc8095ea5e8d81283e366eef91b0b2070c2e168dffc97dfcdd16b566deae57ee6a163540977eaf31774db72d21742ddfc1824eede5a9e72e9917aed7e3000f0ac3f48ba0be24fa86f62bef852a2d3d02e61e3ee6137f41af011b6dc185127913adf5d387d6298645946d205cb188ff6939b0ac696e4d75d44189831803257d3f07a5 +result: fail +shared_secret: + +# Private key not reduced +private_key: 8c8e4f8513e5f349d1f955a7dddf971bb73d44db90b874804467e2410fba681347b4dc33910ba22b9d3f4808592765f3599aeff7cb818f8cba2fdd668edc45f1997f3e76628767b6399dc35d334f209b62a20870092dc7a41689a4d8e209bd557346edd30642baea86f25bbc88eee57f0536868faac0958e87fc84c53ebb2eda3c479a9cf0984a90e668437d46f2946e50a43e3889aab5d649b6ae7242aa6d645da1b72b971a748cd3ada6cababd4f77b6ff9d5ef37dbf223ceb5c2683165b9c87458f84a4d5aca37dc8e9969a1f8ebc73e7274993d74c77cef9d7e536b1a197ed1f8a350577dcdbcdd080db31cd0ba9269c84d9ea565d194e22d3c11573685b166f02245efde45f04dafd851aaacf47c711a536aa1855b7693162ff7e51eb52ccceb6322537868386716be6c59dfd2fb43e9ee7c28d5ea5fbccefddf670e02cc3e24bcf75389651268e4c78949e284feaafa0fd44f8875c7d4ba669e107e26eac95274db99676f6a86734812f709cb54b067d4c136b5538ac7c6f0e8108af7b115df1166fcb1183714a2c9a634a8bd5479660ad4fb62441cf86d13a3f93f669420edda04d18af0d0f49a3b57e0905758c7d73db3c80e2634366285a86d6aa7fa8561fd4a6ed745aa04872fa7ba732d5e4bf045445cc4455accc40e499f72afd3a8ac73be9404f3736908745b1d4d985e4920edbaa2bb8933063e24c4c300f83d2fa634e6c6830b377efea4965d58aa5c653682e88ba5ab343624d9f4c1656f187f64307e234caeb158ee92df5d3f97868e43a4d4eaafbb2ec38ec0ae936ff4b40feb850fb5f4df3ff196377504cf5ca0989703b72d72494a32e7276c9a15c7ddbd4dc76585774b36efda70f553807aeffc5c6e90de97bf5613d35857e7b4a1a4b805956f24b4a898acdbd4fd445cf64910194ae3ac96cd1fff144b9ac51fab7ef77eb6af68d7f6cfa3b48b830bfcb4a8ffcb5b668ae1fe24097e308be85b74f645158862695d080d68a918bffc48fddfb33c365934ef37bb5e7359a6008ad73df55b4f9f1c7be926c9e7cc01cd3a286b8489a53b5a7429e1cbfc435d7f33bbb5ded82b58cc551ed3a41b9cca243506effef3956d19dc87683b35cacb4ffe837f861b4633044773e5c399f8c6424affd05d5f8afa5db6f7bd445d98c5243c93255e3043ffe8a8a55039b34c2bc64368f871236553f96b80d9d41400682f05c6795b641610d635937dc4526baca74b516cff4ab234a6c1f7c471facc08fbd551ff6927675f64f3cce69d34f4596276647c6c8c3d53b54014b6596fcceb1cf9609c5de1d599bc728a41ebdc3e2a6c41ebc956fec70d2b58866c3c2665ab98b153052e9e7ebd9ba3fdd37f62c829abdff575742d82dffdaccce7759763befe47df656ad878ceb1b7ad5b4cd3feda23217f7a115ed74f84477ab5c2463cce52f95f656978b57d708a4a2702e949635a958fefbbcc9c8c83753ccd6781474b067099425d7d5d78631e69632dc69d9deac940398b8a79e8e2f69587a5992b354b54b7931d0b4c0ee06dd61b46170699035fad14778a28d9af24196beffe96c073d3e5f8ba65aedf29df3b5ff445cc80e9e8b54b4f4346c7107b652edf77d9ae95c59ae8afa99db2599004da53ea126e94c903605aee44b3d56abab69438320c91918abbb1ea2b6953753e475bc33c159c590bed80760731565279c640d361de46aae78d0a837912c66c5a347c0946f6943866750c6ac1eee713cb8636e543b2f8a08857d53834233603391417a23c88b6003246a0c8ff39edfc7ab8759207dcb7c1d923ad891c31ef564e5f53c0447a25728c934303bec26875c44a26aa36e0324ca6423855bf2ca04e27cb8f42329a3a0e28a7285658fe1748a58c538ddb710c6d7839b573b30a5c4486a448dc0bab7c07b86279058578d4a56c781752e8ab270914534c51923a6d0c226967313695987314975dc7c7a101578f326d02a086513b2608a8b58ea5a63f2c6a1cbbdc847c312f5a2309c1749c349101a42757073224b0aca598a6a72cb308a010c327afac94798f8b4c6a1279389c12d1c3015b02e37a95705d3b2b8277c2c141bc8148c94244ec5c50e65790fd6e0842185a5f2ac1e72a21d4d652a63001c650b6c8d06cd758923d42479cba96d7eb396803c77be54c831063707a35067b87b2876a1a0844d11e1a895db70d596871fd1434798771b487aed562ee1d041c06505786205166812fa718424708a207cb4a6c25ee78b8b85e869bb82a89f647a813b97dc1abfb22b430d37adcb43b7bb1616dae73b0d606940e5af7d139f73b48b4618bfd5c22274d3a27c20195794344eac73b9a09de5cc4e59a2853a412eed7062dad16b0e1aaeef83221d34b3225868da033822248e5e40a692c20ae4cb112b9c4f9e373d6dc3393f385b5f65c7f14b66d7d0b31dd7902af39812d76d5ce73ebfa4c392b069be694bbfcc7b9c0825d158b431898c9cc9080d632196378049a5a02b43cf83d37e4a731505f23009661070038917a93c452004a8023b1da44b4e5cc53adcaea033c8759a3bb4bb52761191d76c95599a9dc2a2292bf37aa3803278726b660233e9b476748a31f9fb9f2d93b59b9cab33356782a976e05b083716262278349fb14b806a7cd3e52c1a6a6f603468c4b420cd544bfa916d157a21d15c1945b31f7c6285c30529ddf735350c92c546ca776cb44360cd62f05620f8b23b94a0a720270f122b0f22316050b7cf6623cc0658a9146861785c03fc4e0833c3565ca4ebc951f5145e2e434555d45c3819ccc4c2546673c18d70af49f0aeaceb83041556d52754c10b1d66b9c0519985e9b0aed559074743c8796881e5a189a4707b8923097669b2d9a162dcda33c3b825e004aa20b1749eb198299476bf45a519d341e9b507b1e411bd5382a6a84b6dc9c1bb437e98546074076ea76654ca6519f7a71d1f39c5328b16a5b182bed6b57ae058c3201554d612628274bff57755022b7e653dbb461958ca3eefa117b57299245a9917158f2409384a7b234ab390152b01d1383aad99747258c61bd24f7b12a0332c6d7b5ace324b4e1dd9b3f8574b17382bf387155f0abaf4fc8830b7774275821e91a939da83c9c189ec08774c739fff041d40d512b171c2d0ec7e404349bf5a64a876aaaf72c9c16a004578842bfbb6ff221debdb6ffc8a6de429ca0d7aa50071bc8d68c23c379364e56e4ac247a99523f8d90b3de4b049b526f8961621b98dc534b9a756aa9c4a1b2b4c7726e701ba03d885a39d59a76d92bba31013f2a4714ea3840293675aaefa1219f8794d114bbb004463f9c631729734cb430f26f38886537ee40771856eb77e4633504899fcb86c6a3d433d0b8d60e26f07bd61f1d4ed69bd +ciphertext: 5aa4685b76a5cceafa22c32ab22392c40633343d04040d943150b99eaeaa481849d61ad30d813096b80a057b7cf919a261945d81e9806710d31b288be2e4a4c64b1930f4846e72798a0eddb67b2c447eac1f14ca8e0af01e99e1091ac30ca410dcb7eb7c992f9accbf556e0f4744d89dcd2a91c6624324a18cf9b6cbb4f4d482a671d0989ab0ea45c8115aa5d66cd6ce7d8dbf66895a3620075db3e2ab8f3a6a511ce88c3006ce3aaa0237f1d28986b5ee5f0d77cafa7d148b43fb1b9900ef24c5fc81bd4be5cbfbc3433f6121aa82ea014f7ce1823106c4b7feb9f894fd84064def9af7984cce8ccc62d1902c630b98047d7242116fc5735e6a5dc1e1b014eeb0815c056505529de4c6174b06ace73c98c23099556802a3fba32c715a3a6b62dd4dff023ff5a51ff62ce9acb7b42c7b6a5cf2859e04d18c1e56c778986e3c81c6b44add109b09493f318ce089d7641d84ce257dc13060383015b9e39d3988a1a5b0305cb75b088a7c6b0192a2a54e9a3de472b86d9a8a9612a19686d4a757cff8a8eaa192f3feaa4bced756090d4522309ee5c60fd7644363831b97bc5eeb095d9cd64a5cb97fb2e01e51c71c8fc745020fb789323bd2e252a6c52024908d387cee4c23d2f2cc38bd82eaf1a85ab9646856c434d0750c578394ef48958585103469ad69fcd688a46479de7d227809ea8b7cf9330d4ec5be978a1d2dae5b070b64c014d339b2a180328dc2a36cf83d4f7d5a2675099d2b35c91df8e4a611f4bc400a6b7eacd4170b9cdb5d5dd82dafd8ceab075f63ff7f6c16374ebdf38014a668a6c327580aac261e2194a2ba711fbfca6f73f35b2ad9ae7c1e7807c7c038b37f09c8be31759dd48267df69d00a2f6d6d9b00ad0d34fda09fc740b664e4ffdbe2971a1b88d0de74812827058f702919f700327a153d467a479e8cc06b8fb6264d6f53e7b8d84ebe4060e998a4576624937438452ec7f82ffe78337c2e8ac8ca790be987ba3bfeaa8495cc46e0f914a01b8af50e6b4c420ddf78f5d79b19575558951a713e09a447cdc52965afd3ff472a14203d393f15ba0c77bc3784b800aa78c389e3956ace626f5a28c8b67f6d9d3b7ba5c6900673230559312d4c8fd5b34abbc05600300d66ea2c8760676c205bbd6e63b0104ca3e30da4f2d7337f2dc28ebaaa7255bce5b741286ea3317e73d060babeb383d607345a808754e4f2771ff3205eba4ea36dc7d5b7534fd32b8701844d2994befec0697e4d3227813625e5d3f46b7892c1ce63c7ababb97eac2b06dbda7e460042c5d075bfd6c8b9cdf8db87c5d416e0a67d44d27338f73d5fea074c94dd5dfb8b50a32ea3128fb3432df47495120337952b1dad75b4fbfab5612c42e20ca2706728af9d89daf053141b264c9039299972ffb75c38a16a737bd89f88d603b5d83650a1f585b72e0737818cceda2fe57065f0fa2c7358219227cfde2d97ea5b5e32e5325b08792967ab8c12772a8ba9167e41d86ba7bcaaf548e1c2b0701fa1daeb45a86f727e7d91cddae1 +result: fail +shared_secret: + +# Private key not reduced +private_key: 05e74ae857ac170d3fda1e741a23f3aa7fede488789ec6e29099f8e0435aac49ce2097cd03ebce2c9cdaa33fb19bc64e81d38750395af4499de139be5d8a4152b66a56067cd9a372c667ac153e51676399b516377daba3bdffa846074786f934c9cd91921353779b91c2bfd1cc293a84feebac68c3e68350a91ce3d666f8f379c1e28ea8a9783b8a8ed2be367cd226f9d198c39686c02339cb92278ad2de7ce563797e9b4215ca88a37a9379ac6ccd5f3cda4d49225b900dee45950cce09a7d06733d0bb7eb22b8aea01e3dae26975fc53795d2b49a27fda81edd76ca983c0b8b87e96399fd6869aea85d45e59d5a987234f515d33dae0965d5ee3eccb2fa35b33c5810ac4737481b2448f324b7c208387ac045c0b7c9b25a678526857c34a7748c443cee3fbd4b7a2155ab7d77f97c77d80f507ae2309b6690d728d76e47279fac32d63f3886e111a5176387fa51d422bf571c79a4d8b764abbbb56ef845cefcf3c848e671009c1e983465e19decac84d3e7b567ca59e5af8477ea89dba3784308c680033c3ee65b670aa43fc6932dd9692dbc8839bd94c89e85e21bfb9000f5ef86afc9de7f08db5815e73a4ed469d38a967bb4fb2cfdec959f4d0abbed9581eda23fb7e086b82b2ee309b64977a77b9f6cce5ca2e49e3587c9bc5435d4a50a62c90dfbbc339b3467795bd3f1f5bcc6cc83b797d4d7a6e880e953a57cec99b8c7939697bcc488f0b6601ecff31ebca4b25d5a01f962e153a174d76a9f6ae88cb737b8ac4f5eca0fa8b3bcadd3f7b578c8eee60daea49a13eec7c0d7a37cac38ffdfd07aa48e355cbfc43a540e9d96dbc5504949239dcdb82d94755c4ca182852d56b9b9819c42b7cf2f3246cd4a879662cc901e4904ef791fb34c7424af3887fd4628f76e45cc8894be5f5277b67c391177889d8868a8c14949b684467094a9e2566bdc58b00b339e3c9efb54b63e1f43dc57a7f107cc988dced65e456b863f5ffdeedb5a7c9470bee8273efecfa57dff3a1de5ba8bd0a5c2004cddf54f699c4acab69d730c8aebd853a51a8ccd68839f1ac397ac4a9b6f54316537bdb99879596bbd205e8b296906345a25183e8b4146d4afbb7e2cebf377337c6b84d3363b49a7a8937cb58db45f4a35f5f2f2984598797b835a41a6eb99bbbf37077a5b6dacdb26ec86b19469e4b99c5b552c63c3f3ff3e4087dc369c49e6f696f11639d625647b3fb9a39adcbfcdde232dff06975c0c7b931597881af2cc267da7f5b4fdeb54d8df9e39d15a7558429390048331d3ed9d2c46ab8de6b051fc1ba8b6b1f9b58a47c3d54564e7054deeb43c80abc8d6789f324287b3dc3f9339f67f53549b6b7fd94d9bbb3bdfb7c985ae8f4a5c4afe8cda99f6d56ebd287f3bc2daf88446ea65a7b86cd74cee48feeb881ddf9773c5c6741ae78e27d7c50788478d3500f6aac23bdbe3ed5ad240a9a336378af185dc25e9c0948cbbb8e790da7929ecb464406cf618cc019a84868745591496ca38ac57dd5d10bb8e5b255d7acf5eedee75dcba3877179c4cec474101395d9f831242cf547487636d39f1d6d82041ba679b7a1b1d5bd0b295eb137ab4c3edd0149b4fb0c8df65e5ca6d7a67393a9f5b57aa7c9ccf796828b704efbb194d5d895cec082f5dccb78b59a61090eada66093c84267079597c9881dfb2ca8fa4cee6682c4375eee25a08bc0766eda05bedb2cabf734c4243987012a44e86cc013b7e555bd15d45306479a78ea7d4fd7723d3b074860914e24395b264d35e57867f0229912c6ad0238587355b44c155bf7b5e5c872afeb136bbc32b1a950b3122f3a5b71d8c140940b1ee62a5543f3b61719896499721f5466f7b57b119568c960a3796bbf2c8877cf8a762d6a8852619abcfb85ec7c6e79652311490b03f61bb18a23fa100fee70a0fc693163b28ebd6505773324404341e6c79b0562207ec1077cbb64053a4447866efb1894a6a544daf283474c6e0e99323f962b5cf4667640af8351059ab42e0925431d864339258752a3b08ad52f985520a1247af44366f3377d5875589ea9a8e38455a3bb5ffc29083664cda47988f4f0c59622454a7109a6722a77703b0a69a4db2ac154d53a6bd60603e9be794b0b1b0b88da57a64802ac771134b1a4776d07703db8746e610331ec3ad3926891c05b4b738d3564b79b59287174696d119717d3650aab049b401466467ec352102ce597f6e867726543067acf511975828799f920bf139c176fea838144797e79441af218d9c2c0f15a350ef82d588b45b86a2c58464239c121ed2a7650d2841eb21dd6547bd32c0e4d654a3823c4051609ed49220c2651deb6b0e55a00d261caebfa9c17d82d5f23a111c391d06c0441102c2745875d6905ae21412c2c14ae51c5609c5872828ca8d09239b82abd602005cc66ddeab736db3cc0e946d6232177e6c012a8672bd62d0a4253dbb5a908c42341503b76d428a0c38f7e978d4fd2532d075c08d9cb3a440018b323dc3ac28bf8875e412745962e512c0e0e81b4919a813766bb020c831ce0c3eea5a496e57e8d598d3bb34733b6358cda44b1960e8890ce525578d100257ed8a916a02fa2d8b59478966835c0603a8f48715ab2544d0fc487a7eba7a96a6e3918b9c9cac54c841c2899cea0312b40f9bd93eb7d392a4cb889144c224a23244067a9712ed9cf52a15edc35895c7c121822468716704e3617ccd59aeff5120524495d44ae3019adf7d25bd7871b2a98a17ab6c68c789174a28a4863ad69362fc5982aa68b3c0cf35fd2d63d064556e55b6df0d636dc5ca56a928f19c61816349c6339c59febb2b8675807a6a9181a91620a684dba5c4c596a821b66014851966547d60690f7a805bccc4bf9620c188495795c3dad55c8e7529fedc92ee3192a68bb9250420f6ff04f939c82c8442350d40f9d518c10c53ed5c3539e373d0f955d3d451e7873a22af2aa87c08105c044613334e6b585aa864795e0a6af988affb2b2eae653be5c76383b66f5205e1df2b557b66b0f9b7063d3039510ad13a9b5ae6bbae433808db7275271917d75524eb2203202c1f0b4c9afb402f5798214c28667d28727f89b95d3294cf38c129a792b16161e6b9eca60c18ed802c72225d585c7f59059dfd74944f764035c073119395478651f88352c204f89222bfff7c8bedcbb6be1728ef74e54435b40b22276f1199ef34673ebc70047956a543f3d8569f334a5fb22b4c2bc34aa9a4b27a11795a730eb96003ed4662f2f0344da2b88e634672fe48e40ec83f4ae731342e77cdf4a3acadbc64e263f1afdcddf2ad63f2fcd19799a0a8f43ec867477e249ed5fe716f8ded5edaec5de3bf5b4d7c2f2e18e87f499c1968993eff196753db8045e2c8ba8 +ciphertext: 0924e57c036f105436d1eadfbaab67c55fdbd49ddcd120c08685ba7115c250799752ab883e52ef0d0c4d9bcd46bfae3b0b6df089894155bc34fe4b0db0a74fcc95cc5d56b9060070b8e475b96ceaba577832790c84eb87242cf30dbf9b9c2fd61ffc76f4894495b2f2060c10b105f9845287e9b84f10a187446714c968471550d772801214a50d9ae0d6ba97e60dd0e3935fa6e5b0425fcbc1c1c47645b5974f4906f3f67efb70ca30f01b30aeceb45bcb578e08fd006c641c5c23ad9956134de1e4b50941579266b95c092b96698b31eba48fa03eb2d38cd8339e17bc45df2a7bbe159257ecccfd09573190e53193fcc172585ba3ecc444c8bed87f0d9dd25383613e280185b145ae6be22dd90606edc02be32ec3c7c2759a9d2ba907eda6342aa9c4815edebdeeaa79538c440ebf3f7a3610e34aacd303d3338547dde1ace59f6749573847c1743694d29f99ccb1ccc6764e2555f51382973985f02db7aa11614a1202fed63445500a23b1285af9d6fcf633110caf23de2ae3a8310d7b574f49daab50988f00f7e2645bae92392c67e33c3bffd4551d5bd41bdddeda4cd105ebfacd6a56052653414d224becf74c68eefc15b1af21011add1126f949fcc8efc68f8e5359fd27c0662dfabedfa8481a04c4b355f2c1c31b0c9ee202391fdd4e3e206d96ee49ab52112a04203b8ff79a2db64f4034083b3854d7b1506c6fb2afa95c896432b969a62adfa1a017db9c3e7d3b76fb51e73f17c7cc762889ff2fb8b1066b2f05600d52bbebcc8bbb35b91e6eb9d270d80a995e59027af9acf9a1d0f80d028ac1f3bed3b3ccdc6be3a97ef00215ef569c000af549f4e31d5913ff376db11e4e7acf6745abd40fb3961a3758e375013c4b110e989474c91c8ade63f9252c09a8d760361b684424755c47a21d8aeabecec6d2bdc16d08a1ec5397cc1d0ea01c5ffb45b5faaa8043694cc073bf3632558eca1080388371768f41d23fc1a4017d0ce0bf51b4a85e6019c2a0c728e5c3a02e592287de10f43a2b9ae9e975afc4f6af27955b3af3416f4f89f818cfa602e44b8a6e32a57b07a567bc60accc98e00093d17d4b487a30301063118671c62cc5ff595fc8794c7c64386e4be6da9c580f3457630ec9e4d42be26ec0b9265891d2d36b92e3f13f0cc850b04f5079abbce1be7dea57d466dd858c0b6d5e15990a09c1f7d0ecdc46e63f857847b3535d28a6f05359205f45537f93820c7ac5e83f19326b8f727ff744bf2bcfdadf56a14412697ed028586fbaeab5aa16354cda157d5410c617520fc90c612c4076b82692364a32d9e7763d3fb16421f6c177122533afc75f915539a523c8db1ca9a64951183154111978610fdc9740466af73b05cd0dd380f39f94c429d01e0e4ae27ed1495fb9cbb90d0fc78dd28e23280efaf77e6ea6794bbf342f3801148aa241731680738de27ca171c6b2b0ab1099bfade25362f610022853ee07f68868b3a2abc899703d3553a6302d55d5b2f24112fe035bce7acae8fa695ebce771c458fe +result: fail +shared_secret: + +# Private key not reduced +private_key: b6f76178bbab01b89444ddd292ac914d658045fe3fbcde9cd5cda38524ec6baef08665bc46cd4ad83e85e6e3a0ce2dfa8defd548cf335ebb3bd7e9ad50294b07d9a45f6e74748e4cce5ed78fb58d2dbcef872c6cb96c73d1aa4356b9e7c957d4a36b9ef89ec6c12ecf9feff70685c645a76141f6373b8ab6ab18963b68dae0134d8b175382847811a590080a3dea2b863e06a0990c9383a9d6e2f942b864bee85edbbb17bc1db6373ec99b45754ec78531c205919c27a4f2445b8a7776848e970acec9a376dccad39941e496aa89eff9df671b74580df965d11f6dc6cd34b9cdef31179c1c4746d49fd9562d6b457e74ecb3f1a6dffae95fb632fef025b5675385731bb9f34ae36cd90c3e16fb5ea2494012b964990dffdc23cd0db74970a6efe54de29bfeb94ad5b1bd95931aecb3650cf67c8ced1678e64edc9d2b869a4cc95d54759182d6d86795f46794a6a008e531d75fc7189416a9b1efa3832c187febaef474a8a4caa5c9d09bf38634da3d2675521ea3a3e830266473b7fdf287dede23ba34ec08c1f643a8f2b7451973e70679dfbeb5be8bd5811764e2c1b83da827d0ed9fbd03b9516a779205c78f737ef6d67ac2a4d5f8663acd995f96d187c7f7ef31a967d7d0f9854a5cd51b2fe79678adc08f85b5e58252dd8f2ebde5bd0feaedf39f6be56e53b95be31651156e6175a5ab456d7612fc40f08e4c9bb5fb6c16dc101eadc8234d875f82c3dc5e106753d03feab2996ab9887ed5334bc7b83d6bc4e3e1fa9c0759d3f3c94c685c660bcdda6be85c384478cc4fbde77e5c9a3bb77b7acab909ce428b955476c85f153263874ca3a7429c6a79a0834c15237dc5fc7a772d897876a3c0a7de1b7b789a13482a38c5456ae87995960806304ce34b72e676fa589f9823c949a8eb6eeb887bf7c09fee476466d2a74d598cdf9ac48c94dbfd771f46acacaabb4bbb73e94eb4be5ccc886987b56cc6e25a7260b3364ec4a897bcf2826d48756a530bdf6975a9f9bcb4ce03435785bf5f6f87ca330d60d3aeb3b90d986cea7622abed5fba58afa9ac3524f89a9b7f63e8df2b48893b376019adbaedfcf716cded61c8cffb63b839d4e29c8b97ace9d4a24adcc5a382469dfef5eca81297da5717c667ca9bad3f8f093d56223d5e5e4d980cb7a3f8cbd1ec4469b8ee7cb4657944a739448a461efeee3bfaed724ea6b7dacf904ea8f9c6437aacf6ad6bfdffb4974bb7762c76715a9694d6ede2e2254ea717369766c22cd9938fcda4b5a88e7c45b03027926994d81414cf7b4ae5d46895c46fa0a39f8c1215601f665d675abfea867957f68178e662197ebd7bded10abc494517804e68be8025ec0aa3321038f2b06749162d8afbbfeefb3ba32b0aadc9778869bbab9bdfcf934a69104d917593667dcfad0cab53c387957fef4960149b08bed9465c5de3eb576d99481fec4ca5e8a0de36756fa5e8974ffd29c5adfe1f4c867a5286b59f0c3adc632c6779ad98d3acee6039f85b9fec0695867175e804e75de3df414ebae9d1ae8004deff74e5d65514eaaddc6f5daa6dca8b46367c63bec73ce2ee81cc166efe3baa2b986bff325187369982978cdfec651946a4996af0b49bd35dbb5eb854a0daebc2831a4f20695579b52d3369af228842776a03c4d3284d763d1f663000930377dc86ab14486673a349d8073ff6ba44496c64467d5f531f5203a074ac7ce9090e59f1c308d2c755910af132ab81b50ad6d6c2c6716190696ae6a51433f61185a43cb1d23708d8286d066b61a6b7f9e13f8248c232d8315f40053fba0d7ffbb4ce60410899200a8a5e51bc1d8392cd56f41fbae85f35b110933a931084444036aab790cc09b84b7a235f34763b9ab5c9b53620f627778c661c4c45b36ebb3a4565795656227fdc280b327ee2f96c16e7bbbde89e9090318787b2abba7727a393cdc04dc38205e3c86ed5d5291a1149ee204b24661ab2ca16c1c0a35d3cca0d7c57f4e01985242c3b43869d9914312678710b039be4c2b775cca014b1d936ca8432a4614c4e67b69620fb49cbc787599c4bffdc3a2c786ba876864e7a5be33ab200bc2d087c3e6cc642f4a96771ba212778046b5823085c4068b209c54a5bd4153e4d986ed3512d09d40c37c1a2e57495e0a594f4430fdb1c88c4fb677b007d8804ca114c0991b90b5140761d59325502a1f0476e961a0c2b2ca78a82c8b5581d98da26de717f84c140fed0a00221ba71c34821374ad7c565ec20cefc949e98d1819702a4d38597c1db9239b9167dfc8651498927bb0e170c151e881577f58963593d3ae00870b8bb9fa3b77c468e8bd365dde088f24c2577c5aae2f24aee1552e4482352674d1d96b90880336ed44f6bf007b5eb67c52a10910a9a3fc82ab8d50aee17b667a27b4d014161f1a60c3084a25524693364ac1876cab0c93c01a153b03486e75c3a01728f625f9a7a6a99e78ea9b77b01490ab49c6dad9ca584229a8a890effe47ce0692aafb17a3db2b855a01666514e8a800a47c0cbfb4872c8c8a4d4bc52c8db43d3f7360d568f4f905ada2565a494901f229ed51bad9106bba6dc4fa7ac59a3a5a64d033be1e47c36c2cc9da10a2bd200b681c2caac5cb1eb03f36455241367d30019aac00afe312c5323cbb4575e271c01f09c6eac03ce1f02bcc4186768493f6cf97671e7a02db6047557306bb8ce086382bbab8312460663dc1bfd01b2411b3c49835690627f133935c27308be6b5d09844f477523521c2b1bb1c92b6b3c46c20cf97217683a3f2e46b0151511c7c9c4bf8620d4706ffaec98e524360986386a7b5c20c312c5b6237bd17271bc6c146124d190205f468dfb00bae08318350c1aa5910a07a67bf13a99a52a39b2b04fa56143c0c1290c5c412ce1647ba8242c851c8bea960c9c4879b83037886ae77b10e8126dd3b633a33a662076cea326765d6262619b8d0c8c3217435450070dbbd67404f5255b6557267178ed99cd4257768e728f3069bc29f8484a127d84098ff4325946371384463c4ff489cd8b6eeed0c5e3e92b1b988c41a31df71047cf78ab1ef9adac2a1ba3121672505ec77b0620617598f84d1fc7b00fdc65e7ab72274c86a424746dc74f53142be6423545d02d581933bb92058563279e522ad8507f4326699bf4831970775640887e875e1cf29a09843210a23976941af397a3c6c5605af133ba94126132311224388f340448a1252c5bc0197b4699aab73a4237d40204a46103bd605bc698111ddc3d6bc04804722c35600b001c554180d16628713bdea10cdf5ca1708c7c6e354b69720b4b4a0c358fe9a6ad3febe78bb2a71691658acae21a1c96249919cedc2369d8d739ab125e0d2ccb82dfebcd90240a545cdfe07511f2 +ciphertext: 2150f944148dec904a5077dd4d82ed0d72bee1a3dfb6d7674753e2b50cfd6727ae71811da5ed2ba0bb169aa8a4883d286dea2213ae9edab0b24c342348b20ff4c5ef3a56320ef7f2c104a3c5982ba4fc3afb68575223ec0579339be4ac6a2139e8f8838b75a0f8e90932eeef2633c8b14f4661a7bad5414513075cb8053afe34a2c1379f3a750f27d7c46bee74524245cb41a221c48c68dbee3e78dc5f9f3c551fd830d6a40d4d4fe75ec31d97b97ffc32e032a75e0466562b54fce7d2d370c65fafef8b66e9a4fb527c7b22213b22c137650137a64c53f910a2386cef26e29279c16652ccc0a81da0ceaf494f32391c915d79a94a8ab7e4fc3a4eebce4c5a0b4ed899f24881263dcd74e3b895d353faae4cf47a1c74299ad8d435cb2c927841a86e160e88815805fde2d3c9f487754b1fb8b9047057b5bcbae25754f90c8a0d1c7b8e9e8ac03936197136fd189f594b709d52112fe9ea335dc96ab2ec87c97d703994492da1c1cbd20994c1762bad07e5dec98c311156687128c76d2ff5a5c7bb65bae29343059f2c10df3e9239392769ad0f575bad34bd7213f897d3af45bd299e8d6b75753f966317cb5dd821b5a8d5bfca74871d210b2c184107fe9109503b71644c8af5bf09097f3a6f0b9f9e26df7615d503634533cf4111a5487f205f45610c777e2fe6bf75e2100c209ec650540e734d710f0a0a378905f59e8b6c19d4847bd2b02c4366958972a963d4afbbb18e55adc1fff12d07beaeb27598cfb98833d02870b902b0d9c587523792b443c453059537d0d0975b95b8ab9d94f41b6bc0e344eac841eb7656d4c610c80a8e0d0b659d1be91279ea59333ef5eeb4b42fb0a4fded5d313bc754605ab5d8740716bc1d5c9e18a998d04fc4031fe5225ab6046678777a740a998118fd7b09504695401bfd27fe44140484e8bba45e12bb2c09a3cdfa578da8c7e46bd7817ffe1bef08a5e9005950c25e2a6d467eaaaa44be9abfce7e8bdb55356a509c4df5f6aaa89dea332ba7c353a6035a4e4ad6b213366b49b4db22dc73f93a336f7dae65f20a662bd25939811d0df9851d21a2b7fc8fdfae07dfc136a7ed64c1a7b88ea62ce2093025acd1c0eda5352a15c5a95f197a611768bf0d59b72c77cdb03420ee070aec8fbed53cf2319f04b2e72d742c930cdd7b1e9864474c60757fe7cfde9c1d2760ba39f1f8ac5a2dd8edb312fa7b34e22c62c0a66c5d64cbc6c56fa0461a4bbc9105afc9c3be7bf62379a392e1ea49d62a2f91f19fe1aa1168138dd32d42be5b2c7214861ba4873726cfdaa9628f827cad22a2dbf34970fe8f4238b1c9d9af380f378d0273df041cad44f056ed08637e4a178120cf841cc8e8ed0e797587d11019b4b6756fc47803d0480bc325cf9278f78c3e00e534533c742328ac2eb2176cdfb782763ed50e510b92d56a14afa41e00c29e3e18dd037e2d6efd6e1d64e9b5760bf22453d850f9b3e2ed63fc9be5c45573d79baf8150976243bec8aaaa217aa02d707eebefc9b3710f56ab84ce72 +result: fail +shared_secret: + +# Private key not reduced +private_key: 490fd13e7e8ae6848e47937d58e681632d9b6c88892ca3eb4cc4b1ce1ade773df0495c60e89cc85407f545efedef3a5b97bdd4e2d9ac9c2edaa8844dd02a4d8508b0ad3c480e47e96e343ebd0ec12dcfce6616cbc395a8c8fdfb1adf5041165832584743ad7fd42d7dd3687c92de7e111a945985805fec883633eb7556f63d96302473abfbe36fda05345a5dc7dea6affc45c87b3f72e88da3efafdeaccaefa185d0ab04a091fb355e9d6430cb4bfe66697a09cb08f992a3cb9b303e624726b13233e22c5694daed757b65b4678f694d8fb862aabf391ead14db6a31c6d2030498993b8eb5364f3dafe3e66c81745bd18dc895fdfcb81a77672f7eb320e3a2df75403d57c229e745310a7cf89df920ee69db8f90ed96a2056995fc7c59cf6cc162cbe0678736a4f56af053de6d2f419a6c3536cfffcb837bc32e4a1d83a6ae84e4d76fe149498b0e0841e7775f1e783b377ceac49d67db769af6e691c59683114c7420fba6723bb3ae6ae37224ba7f8e6b5463902e3ef23064c8a8dbe0f49abb775f81ec47fc647b86302ed95b25a41705b9b327456a7859c7033691353eebb9f6ef98d500f34fac746d9e59bef7c5d457acbc33369f3f85af047bbd75b4dcf62ba1edcf7cd5a6437cdf8c37ea3739a784f068cd4cc68f0cc6b01e4933003c950995d42b26d9e0a748c9f87ce5099356ec846f9b40f7ce3a6187cab40b47d04cae05d43c53956ff4553f6286e068e993902ea24734305098caf7d9d22a8b52cdb548614e9a532cb9750c3e439a742e9d31076b99fb8a934c2c8a4253da8e65cca85f86518cc08a79f5c2e3b9fc854d8343b36d75ff37c339ba5eb0f7d774b4da5171a96cf6a8ef1848703dc93f2ed6bfda065b7ed4d5673fa56a549354defc0953757c2d77e65c93c00673e88ccec80db6d33d7a0609ae9045e77fd4ec97fc32d1b8bfe7266ab8fbfb9bdb9ec679ff7d6678634bd30dce9905bc46960ba25ac8b9da86f165485a7c07744d1b8fcc18d994ddbf86496263ff68f19b7dd7d7bddd4c947f1e46f2196ceda5bb53137fb107560c4ccedb96351945bb8ac5d92c9975db266e621c53c519caf639c80235f48e78d4d89ed878abf238644f33136e854cf6e1477827d3797d7c75a19d44bc77b9ea05bad42aeda87a460e17779b5f33a18d377294a1ba3a99b4db42ce4f893b937c369983812ce4305cbfa0e57c3e5be9f0a77c4a2a69995f5ece48cf45635c577f429b67630f6d3d1ceb5a22f4f9aff58c2cf6ee79f6780d59575ca3309d559cbe6572e077eaf2259a39063f628bbcdb74345af9caf02aaeb0a381e39a5bf19ed7812bf43d23dc483bdc74a47738d9a6c5e3d538e64cc523e60d9a8351b9ce836feae1dcd3c8a48f7235fef2bfa15e6785e649f46cb8c196f9949fcd94ff6639c9ffe6b90bc3c2099bb3093ae534ff2538d7bebe62b333ff3e7383145655ffc7eca43456f1b5e37e7977f02e4ecbd6e13f198d782fe78ead90620a9d354df5ad1e595ab6b6854f62823be28b98f6fadc7b402e8d37a4e825733f43ba4cd99b63d278e2772980679c3b1456fb762ac8c3e8942a1bed4bce838a2795113c365a535d483658c463ea0ec63c011afc7fce59add1cb33481d37e546d75b5398198a82126a7d306a26c7124518075ee6701d1ca69d16a867115582f22a7c382bab3acb5de50c34c13a5378b2b1415b5538987a77681597abab9a0b5bfc7bbd19550064489be9b897a54fd12c7229f0af5313429fc85f1936b5a325aea955021a969ae289657ba4ce7393477afab3ec0b6e46bb7a8570b2dd4372d51537ceb3023e477a36bc2b784444d0f71c3165395ae71f98921ed160be83e0572487691a43128352b3d82b223c67b33d8277b05c6c071418799583e2b87c9c2a81bb2a7658d67e637b99d5770e04b592bd5961f0c726d0058b31086ab1d23f4d200bbe6b418fd53a0131aaa5fc0380f70f1c90cd1dd5bfb3839cff013375f49919214e756856042bb10e1252a0108c1dc39a1f69bbc230a4e9c93a87a87899faaa210a781c91bdfec9a59080ae642aadfbe20f9ec600a2b297c3394a751354b6e8ac65ea45d3b66c57328249034738ea2541476ab0f2717940930c8551314851be98351d96acf6232e1960b97d930e3f424efdf706c2da2f652796caf344b86ab388f412853a5643a7932409b476d3c81c2a301e968dae28742d18232efa09b81177dc9ab33d7b2ed5e711c157bbb123506fe35c5132bd04ea87e173a7d8ab5b2e35a7eeb58ab3f549dd30228dc5197f778359b4b9b9b989b697839fbc013426016110bbe721c1c89c1d463248887491f0814c4bfcbfe7445144b88cb4ec535bb85a3016891b009dd4ea020e3799d56a710ff097b79384556c5d7d717436bc9626cc15ea509fed2bbb74c2636e8cb4e0435283c7159d8c9eb6e11e5bf977a80994278161671346b368372ab5612c85ad48db8a82067acaaa39bc0b1f49083e71e8727adca1f3c7cfacf907a71c3c73e6737bc51795c9761b5c36c87b46141400dd43874c4500606c616d90bd9d588905fab9b538c23a07b9fba6c0699259b6b81aca207138884886205955250e3e7b5d4d549a8b73c0ff41b88c305b7efa4178695abaecb97ba46dafe090a81c038ff373b13582665665b2058835b629f2925ed99082858152433bc3bbe90937c763d835638c3225e0c3485f9555d3e1556ffccb1b059dff8667ac445b474a17f360a2dbd895048b29fcc003f3c46768668b88bc0053bc3821a95d5d49cf1510894f1739c91174310b0ab2cb7836b41bc44aad9681c0067192d4a46c2fd60e2323b6fcdaa15a6581b4571b4ccc09fae5b24d8b11f67aa629e79652388ce04b9ceeb5029e80341ab6abbfe38b2584b55108a21ac64d61636ddb2094cba91c2b606cf3d2ba09d4863ee900decc2d594a042b5a63c822631533a14b6cccaa0775ea3210e3ebb22137a749b22c1eb129c872578feca153b312efe6238583793852485fc53952e4a513e64b8ac7b60241944d704246551d3372ab9e60bd8411729cab31eb908c5348c34db74f3ca60384e93c91479a52b321f8544dc13620f26c9fd324784a294197d9935551ccfbcb93f9f2ba8fda993a3598a5d37c36469024129c8f3a081c9b3a680a02ec450b0a805da455c5f696bf46681ba9f80f6b469af9b1c09fb2bdf618242f449cd017308dd80a9fa7a3a6aa25becb6f07b241f0f72b345664751b83b46a276ec74aa2569b79de21a5198e7f0c3bc2aa84e7f5c79f4cdea5b473ba2d344bf994fd3204f0066489947b572f76e1dfc2e24297b210ed0aaf228788a0b349d11689e064bdc370460375a778d1a31d01c42b66367ed8d9e8f84551002f552f0e52102b5d +ciphertext: d378efc5ef259dcf2434427ba3f28dcf6d906151fbcb67b9c8e4c3bb098bf2820b9670676b6931202f38370b6e36286ac1ec05f4381867232b34b4078cf6e55d41ad44431be7c35d169436cbd71b97f160017a05d9c642e87e6b4919abf40e48747acfcc10d21ef2c309b1be596b146a6e4e848548f2c8c97c9293eb03d92349d62da60ab60f890a7ff20ea7ee1724ac64ca927413677babcce28371604e79a0a2fa134e51c19d6ca02d89682233c85618874af6487685f21de8e85dc99603f5b4c49139f9a5621380c65411aa4254d5ae205d5b0aad42d8883afa7221209abd96a91197381dd9d513bec2cb06f33760756a0aed0c169c195be9b33609b0e40c3f1400f7db12d4a760b45bfd275796e674a9bf2c8752b98fd9f9aa98f08a62f20296376578938ce94d3bdfd8161211225a7ca25b4282ad6abcc8c14e40d4d3d4cbfbdffa435258f85a29e7add20a7c1ca410517207157199d02ffd31118f13d910be88dacb9e38e2eb3762a4b35f963a17db121037c1972580cf0e5634d322ffa43559c20b494ab94941a51d0673929e2ac1c8c8961120eddd8ea1092c33c756898ffe92b02dd7491cedfdda440326e2f818a67599e3a2e146ee5d151934fdba1cdc36eb42c863e841dc214584ce178cc9876b9411d6cdfa8c2d1335dafe8f9bfc435a7ec06c9ee9543b8f0d8cfca44ca0e21511aa2c592d107545e6c0a10dfd37a2e9d0059861f563b26e544fc96049f02cb9bca10a3dd39f440f0e36bd0a2b6f029aee917c3c8abf70a893e56999c9ed0281108f1d0068cb37abd7a7f09f3ee975743db549d824847ae0adb07f0882e02d0a45115ee6191ac32447a92f83d4aaabbe0dc55de5b260079645703603d8704c8dab678bd468463b82869802e999557b0f0164e2e790126e3f1e42efd67700365698e6fdc87b4d42603571df83cca98284a388650f4dbebb622aa190b51c827ea8f14ca0692dd0dce0487b6e186dcfa3daa04a17b07e0bf8ca15ba85152e4ec0cce556bbae3745c9c1a247d0fa6c10f9c8a6843a9f91b5bae12266e1e96d4ba7c2cdabb3093aa9bf2b9883eaa4ac1861f03ad4c9141ac88aded147390197fb82f764c789ed7bd893f680834d76908758c8fb51c508603303290500c6dbbe16c86e93efed13f27e1e0f90d2aedf9f40be308e0c988cf59cbf8d7de1c8bc5aa01afddd8c58afdeca6394e9d03655c7b4fefd13c75846dcc1304ca80a4a5dd985e24e7387d3f5968312624b4a1f1b45e1353cd764e552cd16713c36e0bd1aff6369bedf509b8835c767c53e7ffab9770eb6e0a8acd9208eff61410ba64124b62868a80096eaf3d5b453fa4aac6ef1dcf1924a04e444dfb88fb57742f2c7cf923cdcffaa4512e648d2db593c160219075bd4431943203f6e54833b425df5dd442e589c7602ee877271b5842b334b98e7d171e6fe244434c451604da7885628d7367eb94bed7bab93a261740127d57d9d6acf40172a75a32432de3037bf640654418f9d3e3e9f05d17b858df6a1d8a22e +result: fail +shared_secret: + +# Private key not reduced +private_key: 3e4ae4084387af1f5d7f6ade5194e407e6ef85d7574b1abea52b6316dd7a404372c827aadd3aba668bab52d5943c59bc500b78bd77ccc7da7a3a6c8b613b9cf86ebdd74af22ceeeb246431d989a9b5d7b68f9cf364c8bb948dcaee16bbafec6e4fee576565f8dfd8399b49e2b303481607620ca4ecf3b3e4cc8de3a35f6229c4bcabf7642596c4111df3140a4ac869a30c3af0501ab4838581f42783a18b83f5165907985363d766eecd6065a4e88427a97ade71c4b5f152fa4ecf0c4d4b0be1306b98ec4a409e2baf5a9ef4abc3ee34bac177af9fe83e6056accc59f38a268ba03b39bb49eda763e340dca4c3f1d8580cf3d4f6a6e44efb3db597515736ddcd36e94b476c5c6552f9a39b4c556028493f0bcaf3c96ac03d03ce54a4680f8d75cff7db01bbcff4f3d26fb3e85f059d401552dd966e7013ff7d198a17b8620bb3da39dbeaa3f84ec2e8fd154ca88f49fc28574cd8ece025e832751769560569e9cbdcf3f7a41278d0142753f7e4950908bfe86b468d095f423cedfaeb3b197aec62cc8b0beb47fcf6a45625db780b5648fcd5387cc81d485319febca87bc6cfe3dae33dfe342345169e54c8b561f92565ee3cf0d8eec385a7a1d99cba75b3e21f5edd3155f84d8f6c408455a068625d35b69ff944cb98d601483b82fd8ddf8ca0b8a3e480878b25e7c73a6795222b593b05e8f1cf5f6b96ff970bc2a75fada653838ca4fa68098aa6a3ea9a858cd435ec1abd7f6acfd8ca1c479777907fb752d24ca06c96b39433ff0e1982f5ddb9c7cf45db5f75f85f46f4d58472457ae94fc6fa886dc33d5b1e2654f1a999665cfe7819571be87bd208f26bca54876e5776f3da3bbcabc4bd94d90c9fd25ad83d03ccc29590647c533b278a28eb667bd7ee2ce6fcbeaa74821456289dd3b9fbc18dff3f2837c8336d31bc8ab260b9f524e9812e3d7004ca9f6e7d9a83b77d3b15b418becc7de93738ddfe23ddac4496e57d0a82377eff0e25985857e85007c41a5846dbfad987794eb2743c881fd063277cd366b2c61d5421c453257a63683a719a57bacf373b8ce9dbb10542fc979c92267e05ed612cbc9fafd485933b42b164d4002c8ca8a3dd295359ff299d5aa3a5b82acf278ff5438e938999e50adf4ac2d34d7f1daecbcf7ee01ffd499357d4d854833de48a18fa504baf8774e4faea7ddc1e639a073e87c3a2747e33050aea604b33f6c362dc89fa0007aa578adf384da246ab4226297a0e66c073564b964d39deb9e6f0de4b4b3fafb46eb8039fc6b45f44ec1b9fbfeca496b35c1bd5ad7f3e3575dac43478816868b095ce756bab55047f3d39ecfec6bcba3103b6107544f9bcc74e25355597b69425ae78fd4c0fa9a17b1351c085496436ee60284508fdb2a89b4a76cb9481c986198c3fe95e4c76465de4eb364bdbc43fcea1054462644add1ff57d957685d0f7d2145d544a1e9628e86c03ff3e1315829cccc9f60a733b94e4161673c67adf3347eca1ceddf9faa4f24fc4b54ddb7abdc18ce8cf779eee459c98b56871345a57844ab6a3749a3e14c18c463e5596836e8c436296a84feae43e69517c8e76fef3c52616e70194aef5c4f9057b9edc7c48f1dca18605bee4ef6aa7a8102df0c61577a7cd4b9a04b17ac55708d8c6746289529337b9e267737d5345f4e768e0d6656cf23593a84eb0ec290c8ba078eb9f8d1cc8ea18280981cad0f46dd29c474fdc57cb5bc93e318537ca343bd03ea6a7a466b021b3db77021a8e20b94907ea294f47baad599d51d74219e38f883b36cb323a317520997988342a7452c3aff4522ebee30211444fe78854f9f853cd189be04cc1c800607cb4acccb650ae546323e7993bf2a203487becf8328a2979dfc5c3bdfc1b47533a9a629e5fba5a2234bce8eb37d686a75bc33eeb945d80d92c218548eff794ad6c0d825b57f6f12f0ef6b8201bc0d1fb0354f051ec1a217a9a0f0c77b1d6f76c1f25b01ff356fa390079d3800f1468d745a0dc852ac140307e700f97d557eb42164844b0b6d5a37bf1bc41db5aba156359e9b4ad5649189409be58b8ad5ac89e348099ab9ffe81c71d54853eba7b42167d478693c39837f76182e0c894e0f5ccf19643fbdbc5278b500d1b07f1e62ee797930c0cc4a41832ad093b28460c8700678bda847edc6bafa64ca182016f75366af8c330d201c7ac4327b2326d8b57997734bf909b0fa1c619155aab7bc5f4026079926d04619186c4334f48bdfaeca777e91d0b0b7fc4b180e5e19f0162c5d3146b5ac5ac820781209c455d195f17d541d6916f56838f7be838ac0293cdb63f28529df3fc7d54475062b90d3034c2583b00c942102f82b9553c1120891b77d61b8c86ba21b4a78f772c4049869b56442d33c642a5c0ad167747807d5f6105ccc21af8e06c85031a2a73ada9d59453017f131b55c1e0176ee29b021b7933606c5425078b7b49cfa99f24b21818e78a0e856747e4a7888a3d1313624af81c75eca6c3c43238bb078b94c2a9c57f0c4c66ec5b59ab93b73a1000630aaa28a79415320bcc8a96195934c9f14d5dc41cb70c1104a63f5fa29953495abf71b9359563f16c7bd6bc319ed7898fd00cb580902f2196b45311962cc17a9a9f002a916d9bbc1a452bd3e6a48ca05e50ab35bd828cfe66b483e96ca1d917001b46374c41c2d079fdd8257bc339a6e13a7fa2c0948056f6553803d10fc9f1c87725230ba3713903193f200a9851a78b61534b5a949d140c9b457ec66769c6544d79f0850c4cc8e4b78eae0b260dfc9cf0848e4e09cf52047d62bb8e7e6231f4ba49859b1dedbca0d8832bd23789c6fbc40d61485e5a951de68639e07e624a72395b9e25b603acb330a37b998b7a9ab3f973003c15624c6abce84050fc0166924a397708c12308c578105c1457de7cb41dd609c0c3333be5b9c3b93e2776aa0ab3a4054c98789a4bf419bcb6eb914c2179bae02b462b1126a3a28840b9e7170618c20e8527993623cd0c776e54f8b4eb237b4f8c075fa2175f11be86e2bdf3b9b9dff89b7534134620116e0ac025f6707b00b5c743aae144241b935ba61827909b591b44cb6f36107ef81a214c6aa5b9b3e1f441c774cb7102310c4031e0e4a213a8c1f1593906a0424d657cda7c10c1354b0d5a83d2cb9d0407073fa77abe480854c953eedc6cb06c75695665b92873552cc053a9bba0c99aaf970753299db3528276b56feb8a5bbf373d13c20c2f22ae07e9542206b296f3b101d07a3bd1517d9eb8db21e1f18e6da63acfce1e0dc597cef3abfc7d0aea99da67ce6c8abcf3ec4d93505d3be02c039e5a12538e5e59adb5a5d709b9b342938dfd5a08f656a6eb8cd20679930a31caa6a6331c4b133a6838c223ef9f769f6246 +ciphertext: 35efdcdb40a548a0269d389f25474dd39115feb706f9defbd935fd224b3564b3e5b327d7e5ae47ce9ce21f968ce4b20fa2958ac3abc36f9b301e644b327b2d5b74f26a929cb3f2a070d7a36932c1ab0084d7f8e9dcfb6632a601830a1bdb6d27811d35158315863f19a6b70cdbaa180e4e148ebe276a6bc52137c85334f743e84622263144c67e7efdbb1c6578b17025d9a144c2784eb9d9cbd4052c23d3de56d4c50624d969953d944658093c03a933c8f39f09487b1392ed0b7ffeaa8edc5dfd73349c640a75f132259b3a266513ceae23b6a9641d8a8b1d03d5f44f3ecf2111b43b8ca9b112b8d82ea0d7a4659f36c81516cbcf1f7695bf728ebe83298f8b5db14a2e8e7be0628b4f8f5d7253d18efa4bdd5725f5ef10876a9f3890b99f6beac54e9c881693aee29ee7618b04ca59dc31c7531d45156d109c1f28d13eb37aeaa8edc664ef4c7cbceeb95fbf2fe6ac4f5b3a81c185dfcec60ba16f0d6410f89732d2f7bd6a8b64d32fbbe4869caf86323a13e840470479d932fab248c1ec3d09733342c41d454819a335c3e41f87b56d92e8f2a6b598240ebe595604bdd4e18781e584523977e8f9ec732c525f8bbaab3082a97b0ba12b1fdd76851d732cb6b945e24f313861000dc4ce604217df1bc5f9947aecdb305d397f256b30607c4d4557e2d248715a47854998399fd0451cc61a138a24f238514052e26051385d4656811f83214dbf5da500467b16f9f3ed940446241166d0cc6755b518e16403da01681644dd5e58ad821a7590a3e65087a5f583c81b9cc6d59089c1710dc6ca282cbec114337ccf8c63a04e340ee93217b9d988370d6aab73b36f3ff9f4de4996ae9983c1851f06d18008cdc79dc82df1f29ae5c803a1f3f2dad2661d06060daba722f69970f18d081bd58342b329bfd3590347a022b9066bb95e5549a89f4ce681fc309751329897ef1b7a77c111191796574944755e5be70c4cc86e7a404a2844cd21983935577f583bc5e86902bbeb6fbdb6c90ff46a59136afaf006b81b0f8d8e5dd6c7dd9ba157d26ea5ffcf04693f7a338f923511cfb273a2f228323f195a42126ba6d2869aff9e6ad962c34853c67b5fed2abbc325fb5026cf9cb3617fdd147af37c88a768f5dadb5a03b7afe56ff4277d40f67edbf1ba78818cfb4416e5d8b9da09ee9ca4a3864577446b7877c833b8655f12554e62a1bdef2d8574fca989fa17df506c29254cef3712cb4576165fdb9437751cbca17b18e197931a9d2f060b7484784e02691276696289ee89911f805d0e658a75f5e13869c43dcbcdb2476d3aec985ebb8a7e367fdcb57acec9449bc856fa13aabd261743f88f5a446aa5cee3436aebacc7b386af14d4c0de976e5ff4311318d580a7ce5596b21d3e2b4d1f02397c797cd018ca12a8b8fa6dd90a4997846a3e02aa1c8977b992b59197e29db4c409013ad9c9c8f3db22085dbf8015d26fb456c9e1a453994421416858b180a4deb5f06d6052feceb72680b625d644854e72cb7465c3cb5fc9f6d67e +result: fail +shared_secret: + +# Private key not reduced +private_key: 20ef6897d8a471a69851d6bc3e79d88db8edd3534ab51db3a3f55c8c08d6341651896a61c919668c97b2db67fd16bf799236545a4675d38ceae6d96a8f74dcdbce3c66c98e849abaef549ab119d8600e90bb63e5aad870867630e51e33087888232ad8be1baffccda74cfb84f24ca020d4d1d79a6e6166d4fb1bc80b34e0a0e9b251bcf7151ee7037e7f6f0bff1a7a3ddab5acf7e3f1119e4720bdff0838cc15df81850465a6b5ee2cb6a5aa8a956056eab67338b30c43eb49bd532ec26d366b21ebde704e94ede6dad4a9d52b29fc230fb6c7a6fe664ea8e124410cfdb4ce9964e0be53576960b1bcd1966552f833dcb30bf77f57650c783f6765c4c396a865de762d07e0f2f67165a6bae7e8b6c20a63a3668b7fd76160ecdcefd968ceabc3827cb2fc29edf7ee472f37d15c65a223bda007a33993ac3270ec3aafe4c869faf98508826a3f3829ccd305ddc21569a3a24d9594aff4a40c9922f77bc59734b58385be34fcc93f9fd9b4e17e38a72019301bf8c5519fe86b84724d64e529c79d8ecea54b2cc3b46efbad5ef7f683b5fb1ccf6e1d539eab9c8ab4b875733a903acae2c7f5854934b5bf8f09e966e8e987087d76bb5d8433fd2f184ffcded648b216d20fa4e71d8b82b413b7cb3573197c83c51be387eb6caed48c26e33d8cbcd79fa55ad0c83fb8cd45d74d482d8d5b5845ba5a3767098c7058e43543fe9e74d9758b0f5b008440b08ae9a9fa9b24b8a4550a8a925bac706d476ca877a459b60e285feb8a86469df9cd3ec3644ae94a2d8491ec529e566d9e3be118086cad7f52750d98fce3e8f2c3e9a89ab1ea4657f06a5034fafe4e2a9db7fd63040cf8d71dff6ddcb487777d18b7c8994cbb1305a516383668cf9a8144be189697e37bd68b2b6e2556794e53526388ba54fedacc0373926898fc0ee4652dc50d0ed063b7ba87233b312792b13eac0d8668afb43ef75e495673f63ccb99e03540016cda9eb7b88bc888877a766f15c0f28b947aab9d75dfe2f80c78a6bccc9ec78c97bb5243ef57913d5b9d3ff373536c491e37ffe5b9913e96c85c4ea87fdb864e70af0fe83e69af57ec93ab3de68bb679140a4bb668719d8773a1c7bca14e5e656dd6bdf7967ffb55727e99ddae72f70976aafece41db56e088676377acedcd4f7bf4f6a57c71efa95fea2366562b61945a56e86df782d4ee7ef46bc54f7acabbf04a8a8bd79cd54723d1cb4e34d727bb0264e1e9836d15bfc7117b4e1364d1348697c0c66a8bce3476d67791247d97d346585e4fc68f9dede57c05a6404e8d44dc2aa84a26bafe9bce4c1aaa8de6a43d0d7cc20fd4d814ca07fda4644cfb5a75de216ec1a5b7cb30684dcdab80ef4cd3eb2a6a53bdc5323d5487ad3c95bad473a3cd7fa9861c8a9ff0fdc15e76d94639ae7dc3d863a35730ebf58bc69b7cbb915918ce42b873c944a7907b7bc014357ae981861c36a27dd051fde9711360a5fff7f5fa7cd54742e22ed2848fd57ea8fe4cef77a37f8b4e48e334adfeeb8f5b954ef8b897c74d1d9475b3a7041fc1830c7ccad8a6f71df014aafa4b843d19daaf10e4f6a074711b35cbbda9797ab756df9fbedb7bb19cae74f7ab74ab0ee6cdaaab7d09c8e078c4a3954f40a2697092bbe4460f27c4ce6886628382606f395b55d1a29939a2f754a0b82968d3c865f30066c5e21e3e2839416570f5b54f24d347e2e10169571a3935307a4918b5d68ddfea58a90382e70012911729238a4919a7531242228995215fcc96ce8c1970faa902f79c7a7207a93613de0066c384786f5913b24040e6b4b48b6b679e5538f953540c25c18402be1c58762fe8bcee6a1e58d93b21165f95895afefba1f735b11fb7bbfcb40d3d54ba24ca7ef507973aab9017b66a3e271f980462752137d9ab0d1937226129bf48f68b700021b2fabe81573e49fc17819bbe46858b5c58b4ca7c83a57398a667b09c681b990b648e96ce79b72104b13e97611ee8528c9f64c376eb04925ba46d3c8ab859304ce17b9435309726045de17d8a7cae32aa9c80e1aa4058cff89010dfe22daf0a002a905f945accd2f9225739aff1863006b46f9ecba5243bc48ed1184bb9a57ae26c8cda147cacbb4a031112279dbe727fa6c467ead943269ab1e3c9657c19ba0b648c9d4a48c6163a0a79954c0c7ec63529cb8a65c851c39840bb1a7c584104016f16b43da179189343c3276bfeb5839d6622e684b421526d69517ad57b67494bca6db58cf6c95266170ddd9455a6867de052adc8909790659fa0dc0a1d011487b16a1e08bc82b22aa9444f123632ec889719e754993ac8319a72ee83a988a2c77d28acd4bb5ebc486c33b0af1d67a84a349480fbb2b0b252e8749401d8488df52356a75ba2883090dcb757451c9956888b43806431bf9ed956e34806bafc15fcb1cf2b45729eea12a6580c6d1c366a76187fc20fae7657f560973838abaa510fad13c59c5baf4773188859809d1bcdba937845759c9af40dd2f14bd7dc48028a77ff4165f2204fb3b0b9f585061616ca4fc405a0c8533c344334e511053a548ee86998e9094863b8bdc02aaf6bbc916481ac9337acbac10d90794ec239268aa376157b1955379d30c2cb4927a8077cba969ac398bc8521450efcc7e1cc617e69a66fd16b771a2497d14e35a61919dc129844379a314821c333a2f4443651a4cff234a3dcabad32610f5b54d138065d8a5a81fc5068c5060af125265cbc42c580f47b9fbda72a893329999958b026c5661ba116346ccd86633e0a603b48c8acab78662162a9f11c4349c5235a5ac46546b16b25e355b4408456f7339122b67bb48334836214e431955e979244c8c7864ba189eb24c818c15417cac84682f719c9bdd8479be5c643d937605383c6a9514118498d5b4e81d5b74a063fb53cc19a20a9cfa26e479339b988c40918c192435db1a3b2a7c6046376b97aca7a9bbb30335a0e8fd237f8833e89e41a1c67b8aa9b0d539486b1855b9fbb53b5103ab2d19606165acaa588b9d14a4e6a7823800d8a9334ff7456e75aabb81408b791c9c6bc3b5829c1ab241e8d310bb7b15a5b24123a2c691ef1b5dd80640a7b94892aa1ad7300797a3de52a66c794426230640b303e71f0b93654708bd81f706b0f71757c08fcc591525bb6c9a57777bf1bda0d81b4922a56586d21b04daa2684e14ee8c0cd542824205b2bac3c1232f2bd37109d621a25cf570573465a706583da17c39ff3ad13826b6d5988158a1602a361d7a2f86a9219450ff713e184c0f6ea4146b79b03e5ee3454a79f7fe853da745a27a1462668bb66c4348b7f4bf25c70527b360b2fd104cda48fe520a7237801f470fcc2bd9fd7bea8322859b850f7882d362947432913dd068c01 +ciphertext: bdc7562e2142743d9af81c76aa1fc1d52b6b46473fb7f97443903b44fa9120735320a1180c7b1631ec6faa37b011417b71bd14cc78f3af729e869d4e161d9d9d0275bc653a731f04bd7e9f2dbfedf31effbe8d24e2822fd7b534ab043e72002aeb28a1efebe22f078ec853f693fbd645d89050401eca963a0212fded375b9b66c1bc138fb13e6585b9574880da1c86cd34950d4d3122cbb2258f5d9a08ad788b67ffb535e6c6f49992f63f6f459bad7bc87b00227f3e8db542aabc9f5c8051c02eaf843c47b5490aeb92b9f4f50252f4d90395603c24a600e95b9406f7f66053a468c4d46d7c5b4347d5f13068a3253ce57ddb159ff3fab3806737d9e30a74ecca1408154211a2ad7fa5c3140ece83fbd56326aa4e7399633d030afa5a6720259a31e58e92ba5c55855a693b3e2bec092966be1adb99b5da4d6a345b3d4c55233a25b06422f3cfd76a416a1abd732ff279c094a0b3d598641b05cb8f35d7996175c5b15d6d478fd17f738b4ed2861334e9c125acb154b6540a01e7ee85c1ecdc4b354e8ae5c68603667b52344ccb24d5b2f2cd68937eca2fe5b398d072905e51fade88a44086779105277bd169ba53d1c4ab1d2502cd6ff3ea9ad8dbd9d8f8f4bd05e5ede3c22ba08366d30fe1b9bea9587b05e1913ccbe6d94fe17a0107adf69ced338256835e707cc312da14b594dd3e4f325e18921938062d9e97049b93a0115149b4aeeebc45605edb1e51bdd644594f3ce7293200787d972e2419a5cb8496bfd8afede88d188c2396af33953f335301c58421250da4a9ca1b247a3bd81ff25594dbd262b7efd31b53371d1ab4d267fe859c11e0915ed02649a319fedc1340e110ba52cc14ea72c1090145093a4c3760e023f499155d96a3215cb62b1be9e0aad7b8f75f7b94c82937327d37c3eed4e3ded7420e9f680e03c2e3b123cb9f14c98c758632f2abef5cdc7b16428c7e024208bcfc9e46bd4439eb4fc6d46cdfcaa7a9f3ab4ccfa72470981055277c9e9cf3ccc3739a33eb8f3f5e1cb0eacac8ca19b0541a6f449be5522d9b0d747677c45f60cdc98a156932f04d5247e90fc87f299a1efb12faf1ae375637a8d62bcefae6a563fc7d54a623c4d50a3d42ac70c2b1d24f3166c01b2a87d7d83be81e83087adc7c79d9aa80c85c90b552986d72f3ff2027b4bd3f716450c082e66a928d26930dc7e1bf504d88ebfd923a3f256b0dd512d6539939766ff588473ba85916177b6ccb9fb16de2c984b17b85a9a06b4691af67f8ae2dfcae468ae02c34bcade4e9ac9722bb260104a9d6cb488f599dddc9904351a9dfaef0a90f6b4adc94dbef5ca73ac1ff89c23f3706665ffc3af4a008e564ec34e3b793091129b794c1a6faba3b224dab1bcd2bb8a51eaf4b7d237fc8f9d6b9d713fd5c5d9551e0f9925e72b1606128a018d1535c9690bb8be25694b22ded91509ff965aba2b220c2506495b76a456bc881b7183e65f70c847e5fff569b5bd9b1706d64731a6a5ac669bc2adcf4d21e8abc76146805d574812069 +result: fail +shared_secret: + +# Private key not reduced +private_key: 6206ad862474f8463a6029d9e145bb7b68c1287f311f5474c295a7bcb93ee43ea5a99ecce2a69afaed820fc9ab484a6ca995d90035970a587e871ef6801a87342cb627e769fb9badf5cd75aa78cbb127ab20f34d22cc4299abafae49812b5e90ba5e82eb635e844a511159dd755cd674c7a39d8b3323dbebfd04a0430893b013555d253aa2739ab658d8ee6c6b5967ff40e3c1e53ff4c4cfd6495e3172a7895b5fb633f63293cd4f3f6eb25d064ed4834f854c932a897b7f093cc4ac98a22366b184480ba7469695f3c91a8a0e0980aa9aed1dd3401966b27b7838ba246ea90432ce7f379337ecfbb4719f6d912df891d7e4a9a63781e9bebafc4d431866ad153bc067d871ed8bb09625fbfc1b731153711bc4d876e835033861cfa8eb4eee4c25ff542f84c94ea39cd757ac011c8fc5785a912e626f476df9cb687894582348c0cf0daf7cd3bb01685f5cd733051eee1b989b1b5d96614de21723d3037d5c4fb868c21f3e0cd633514b4648a347557a9147f44ce88bcf8db4c8e18c826d34ac25c7b5582b3d1d65ff2bef8175dda84b66d5d909a6061f58d11a941378377f457701efc8b4adeec347e0d179639bed4d661aaa9b3caae38972de5d75d7ca40ff783bf7aceff4e4ba038ce6e3839b76b88ede1779d02584117fcb226fdf18ecb6e0c9bfdc0379ffa6c075befc958fae39b3b51c1c7d02c7fd3b844e4e8da8ca3663dd8de6e4abdfd686ce837fd5e463bc164b59bab5cb2ba3b973f7750f6ea8697bb1368bcc98aa3d670b7943d7ae89e64f006783e8b67d024fbfdbe4a335a564368fd2d57566a8d97ae85dbd621fecfc9b4fcfaa38f7b6cb55ca53f17bdedfb36ffc1bc4c347c9dfbe9e75873f2c4e613b98c73d346e0bedaedc0a515444fafa7ae872a73e1ef77f5d34b49f369c4529587c49efe885b0c50ca3908ff7adc980df09625437455377f992f84e7fc55713bef34fda91c4eb81731f8e5d1efd75e4ccb0b440b0de787f4af6e033dfe8a35a5c76515e4c4c6b335e61adb417cc43109c45e6ba639a84377d2d4adf0cd836144d44bdd5bd35434737c301fce5565bd0ff6b8f8b83bf2d99b72b7e419b83a39bc3a637276125f9d37dd474205e5a41f7edfb75c94e29339a235107f3564e939828ca499996f3041fcafa1d45fd6363c9dbb7a93fd27fba5607ece2b5fe9258eec8832b95b537583fa66425a3e22fbfc0a25334da883160b9cdaf4776ff14cbe2aa7d28ccf71ca7985c2bef9334d4237fc1590b737b5963b8894d5877de535775e7c3bea216f8b339fa444d7cdf3eb0718678be28b05d1e811e2bd016c456d73e6354a5f2ea65673e188a27a397841e9d711d6e9f35b437aa65cc685ae1bfd0a4cff5516b9fd0f4687f3485cfcf7a7cfde2766ab18783cc77274c6487bd0ac369ca29a05badcd5ff8ac68e7b58249f800fcc4ada35e2974bb1db5f54ef6af37e487100b4500f82f5c76a1464fc9198ac57d699f270d5c37b94e7faa5ebd5c62f66f351b58bdd0ce5199849b34aebe9afb67cdfcb4a30ea29c3b61274349f839e6c9dbb38b2d6d81dc5036d5ef70293dd51562cee893fd8db7e0abcd5b6f5470436af7cb7c3cb7630959ddf6254298ffbda4163313f3cf10a65afbe14a738352fd20b1931827758905dc32c20cf8adf6c081009ca396f270b23a5f26117862a13cb00b65f5a2850e8252053255b8232626b5bdcfe44e95c0b7b5b09802165b5310122a434c5456136cb3a77c3c7c23fc61271550cf15122fea612600aa722c8646a6760ee18ad6028850fa36b82156c09429fa188db2ec3dc229a78f92112b4357d3681aeb19779f1785195b65469c6d3af60ff063562817c4587225a10c8e9fd56c4353711f287469b87cb533b99df46bfbca625c4601aa86459b27778c7200f6a12ac8e8bc078231a37c87400a7429c476ddf7516fa4b7e27841abacceb3c24e92158eb168cd3dfc48ade061b2c02c33b2a33b59ac45a77a439371f3683aeb6a18b107bc34e7785e4146b3f668d9565cb32a23bea6af6daaae79b39a8f725e61f1355c6965d0ba0cf8da22ace189cfd0652213501b3b5f791061ca929e2fd057f357bfaa4047c28577d2105be1616044a6383ff9a087f4754926338e486cc3e76511c7946a02893d058f7100c98bf0af514a47a7630e6e2564b5459d3b52bac6884fc32c7961a34df387ab85c07965786d6bb731af75742147304a5cac936797ba658fdb88c1939c78565914ddb0334fa291fa3182e31a36d6c159ac637a0d3a37098569a009911f54b13efc46e403ba4bf0bf59499cac06c848754903a7b8a1b7549a13b2de5a2cb106a21a3a58d1d71ba30700d74243b1030258294ee022037ff9c7e752cf0fc60f582b6310d4637309ccaa3940e6617b72c0b0217924febb6f971a56a979212a452796a217909547598330557a9309161fbf7c59004d7b3a88a2c3066534153d99ac87dc5918401b860c1b4d5e763440389290d2b656c97cb9784b201a90553acceaca0f22b17852f391ded7094225053f88b6578678f178067ac944f1fb6c2e99abd946953a49b059babeae527408f520844323d9496e51e88f0899857a07b8bf8586ac7a8d13579ca934161d10c08e3b400f084cbe9c6f21e29523c41bac2187b7470f752b55addc6250c08338bac7fd0879620023899041576191b502c736115e65977de34c740c75a5c5f54ae4fa07a2943a7f5a3b8018461445c3ce938579680b68fab41ea2bb26e40eeb13ac84fc3a38b78dd66186558426cf59a1dd4958427bbcbbc13037c577b0e0551238a67f596cd0a2627965216bf733fe88718d64725ffa4b6e73077a37a4585159c887b2a2f5077d1b457c06102cdab7a0e5752263cacf7914ddf836b0e1a95ac4b941388bf7c5bd62f616726100f448001e1c6e4100bbb922b265942bcf37966a5b61ba4957dd02c484413084985d5b22b37964b5f66c11b27c25af757f08cb8ba3b3115a6839483454239bb9d0a1b6b1bcbba5060c3ae47fd0476107919281a508e0606b4ab51ae12b0866c21ca994817b87244ae55222c0807b02581856936ec0ca25e08c7e604e1f1379914702a9e209d7796ca44879a363cce71a0d9850c8ae8596e9b7157a71052602cdbf1c2ba113341fb8b612f114a82c6bb106c703603eddf80ed634be616884b9f2bb271240ab48126a40cf7c0958e0c5bb4f73185cb41dca542888720f8f930a66a66bb9c79acda38a22249f5240a5db0067a23151a6f02abac2477574d9b5d49ed6c25fc46576ca327d614492eebb65297f711f12a5ff123e6de59d1f16878e93a31612015fb961bc572f3e999cea7b534537addaba4ecf14f02ab317d36cb9f0f50222ced7cf029dff8a0d3d2fd9 +ciphertext: 258852ed700664326e1767409c86b549ab45251e00d64a1d830c9342e8e367f1dc43797f2e1c8cd4cf98a1f46566d40bd608996ee5199dce1b4da5ae6a8f0ac2cb4f39fa20b9d9c71335de5f0d3e7ad1057341c4b10ae98c41ac4bb60484acdfe44f7125de5ee18171b612ab9800c796e0a2f3be97b30bef0bbceeab109c46378ebefffe8ab78ec87542cb73bd3377e3b7cb4e08910e1b2c5371aaf53665679dcd90a9b7e817f59754e5185bcc76a68f476352d1ab3696ab8b191d3ed109680544484ad81d0151b976d498fee7187069c67b8d0e3f2dda521dcab2190fff6c0369232449447598c4a68a72883ba5546906f977f78d449234a0f9b5de71330978bec425839b528ed99468aafef2189aa5172a98a7bd8fd8eac32772fd7c0bba3dc6ae42d1653f12145fec4689248abba2b04e3bf9cad1d4953201cecfbe00287b3c5768136d2d9c5c18d72890998b487ae95ff9242cee73abe3005a8ea2822f3f81468eefa9954727a90b8551d9ab482f30583ef65409af625f14ca560fb3d88514b605a5ef6239f9db665ac18a2c5591fc659fa7769434f053ef3828184a0aab41fa58bfc4c58d3edc8a84b44a86eea9e6b0ff881a783c0e941ebde941cd6b960f91dac309fad4e10b063b0f1f3349ea6869c60593d211a54518ac61314ca497942533f75ba98486e0607a4c75c9ffe6a6c29bc7c6d5ce59de70a30214ef7e66c7000cf2830ddbf3fb7867d37bdf0ddd5e8233d441dbabff03e0f66e4465782cfdb527c209e559873c98db25b2d72280ced28cf2a1c951bc98d197b81f810351130a258323b38b216fe27866063809ae96bd3dcdb01890b732776556251d173770c9a3d98e3873bec11091033cb54d27d4dc585276847d37199754ab6fffb61fbac4a5f78d05f2a7873ba3dad729685686c67a6dc51d4e9a967ae8abfe406b864970b841e943da33dd8c284f5d159d7a6120fbb0e272807af4ba7b73e7aa722e81dddbb22ba1f7fc541be455e89511918aea71368c21cdc2c0b1e2989067fde5835c92766bb6fef7908a14186c7c68ae54f4e3e19bafe8c8f56b954f77c625fb1b98bc15b515c8411312bb1ad92274c9de168bd949361df97442bba52a02df06594506222654f849d08042181557caefd6e5a360e18f37ba03386c004df2c64847feed5839eb4ea417c4e0e75b5cc3db09b069f9416662b722b8bc9a0dfff96610438bd949c7b625629cf9249da3b7ee5b550812a0e7c7b6df121d59d4289c90f659a5624122d2b47bbfa6d1cfe099a7676807b1d61db21761f06bd21fef8af069e6478b9e4db55f324747863e24f52697ca20ed6870a247ad6cfa4067ae5d6232bbf1e4127bfd0f6fa96de1f9512f8c39f76500dbfefcf318ef818bf4edc9bd677f0edea6274a3a1389bdc7bda53e5fb34fc7ef0d76f367bd1f9811b276602d0d5035de19575e8b92161907989b69e90c12bce13aee5964b33cb04587026b9c2d52e9b43598e7c05a54893e7fa3d5fe97bc5bc01eb4fb267cd4b3b6d299c55c +result: fail +shared_secret: + +# Private key not reduced +private_key: a8a66e48cdf5073a79d9ef817c64306dfb4da149dd9316dbe758ac121d30fc2c3bf6147c63a8ece6399f31e5941f65b96c13c9b0aadee7ad8c927eab262a400b9f6a628b8ccc3d7f9bdc7eaa06424c17ebc81d5637f9d421fbec8dc6e6cfbf972ae38caf3e9c3b28e686a9adbfad5306bf58a3afa96573dbeb687fb2f47b9a4a770d1370782bf526ca32636ecdef5dca3ef8d2a9d5b8e1944b67fb4db24753756b9eb4289e82fecdb1684c00c58c9977892eb7ca79cfd5678a352d3a7592e3970b1f4c9aec88b62ebc26a368db678a4578fd4208b9e2bd99c5cb30506371c8a44b2113931e1bc1fd88a43d9eb650d3e2c733c913835f7118b899af7b7a4a75f927a03fe9e4cf6f7d9e156b815358501fb753f6fa7148bb83f83f474985701c6d062ee0cf37dda77fa5cd7fc85f66daa7c9ed99539224159466387de5d39f9254b46735a0c30ac40f3bea180a8ee30bacbd09cb45e5fa4bb8336c269a78746f6a337f456d4de7b76691df3e71fa307d3e5c377555dce8b26a945bb02ff5df553f518aa453c8f3fc6e8dafefaa5dfda60414af7cf39aefa3a2fa2944d139869ffa51dd1e5e2ffaa1abc7438b776a7b2a869d03b05bbdf38913d0847fa3975c36d8e6d67caa75153ad305b6614c48e5a589a332a860a1dec6ecefad2d68b7c0ae68734f960f8b8ddfab9b3e95ed4e8e4c9447eb4cabf6c3838ead07deaa5abb4a5fb01a44cf5426b28b4c8c2f66bca4aaf1e57635027d8ac15db1f8e8eb4cddc0a0e5c17147fc877c31893dd5d65580da2b33165b87eebca160d5deea7db8e1567c9bfee32b65a6be4e4117eb4d2a458520a55877fe7941f38046cee7cf0d4c2aafd8221ce6d10c701255f9ac9ae0980cb482dd69bf13e9bda9de34c3eccfe87d335fbf52cf687b234246943b259ed4baa9ba220e5ffd9f877d65df5f0e48c36bca545ceb206e3afed6aad123fa91aa823b1accccc3bd43b94c47c9d2ceea431abc8ee15aa32c1b3da6b6d5b0b5b8cb9d5c759fa9bf137f2815e33275bd3cd98cd5453943058a668456e9a334302c58733d7ae5ebd1de5b4808d477eed39efd0d33604ee16653cee808ec6f147d4dd9cccb18dc2dbba75b63e0c0348ff8ac88e09895422c371358b2495d9df2d46089a551509e9ff37ecb44bb70fc6ebb2ed88f6e2eedd8b38e166ed3955836be48e2bb255da8db97da96fc5a24918a2f51280c6c9dc779125cd8957f51f3574d3a5998f8ac8c6898e927733fa5a8e6c6aaa629d7893a43e3a327a9e35deffa5c8437ff89e167ce68f4a4d33fc84c33e33d4b7f9b43b7e7ac8060d9bda8eeeaa648add55f423e9ea0c7b3702eae6bfee8f0c1fe420a94fa04759f4dd336b1858d0af93b81548f2c8cc8ef064bc554b1cc6cce84968f8bf991649b59f5ab51a6e563767e6e1e3d74c5849e28f961d75b6f3327581944f467e69498b7e3caec4e78f9b6c1ca774c0f6703167271ee4b4209a9b5353cf6949eaf5c947b458038ab9761f6bcba0678595fb78b15dd83e7db5c845ccf6fcca1d8723b57f907d6c8493ff4f113e8219c42ee848425787640636a7eeb651e3afbb62d7928a68f65a6318743bf7b43c223549590463ac38acfed84aea13a9025b2ce04e31b6f647abde39d7b1cb988c37f2ab219c67839064481c2539f7c947a5187a850f61ba075a002e4621ebc290855c9e75818e3a99da9e50522976372ea0e6e201f8cf3c49e4a86c503c38ab764b2f45bfd1718f6b5c0d2e66181045be2a2a8a1e10becb8a6bae9569f42654187a9d9b24c8214abf933063526804d0998b89c884b1055a56cae82557455f3a47c677e8e262fe9569aca0c5b1c0cbbf768302099a4cf3960f9d432a0865031e2b65ddaa43e00aae05aa39152256061021669b8f2ba6bb31045e7e539830095216a846aa39d5b16bf69e152aa227c61287137e2b29d3931c6211510ea33325b2ecd20a1bbab9d30a7ad9bf83e3058520606641dd23b092831d29022542513070c8626a42386c8177c7bc1ffe5754ef5b3a2c41f91f1463b7b068816b058da287b4ac2ad82191d061630337d296a08a02030174a219c143224b4b1aa1324feb23e7d52ccdc757929342ebcc02c9a080aaff12763894928a16c1f7830d7dcb2ebd77837d97011001d83f3512f9578efac3ce1c0a17da13b375c44ac8c32e616aef48339c19a4f379c216feb9672c20d78262fa99887f92324bf667502517cd42b340b51ac0d0c71c2ca5d357554eed04c1206baee66707b10bf52a424fc7567ca023b605a0e160aba5be5aff753983b19938205188fb87a867b6cea58112a3323c2ec23a92a1c16b48f8cc7bc55c5b18a33b67580cd9383275e7b53d053aed3f41f1a74859f3536a3c07832d4b64d6a9bd591c4a1901c46490efd73c9aaec1466528bfda0af55fb7a28f4af2c332de8024f87567e1ef87dbf3061ad29490c658b8367b0b911ba3c3c91e48189c8bb1cf3a229146cb537958bc1b427add62348ba0b54718753acb2ec3a0783c58c8b6b1023580a3417cc08745feb9b3f19397fda09002cb019be30a8d3781c936847d5c7c5a8e9a7b5d8c18bc5877ed4a8d787a7b11a0464440da596a4250308398aa9cd482e0f685703058987b63e21c530b3b5367654bc30b86fe6f0645e328714fbcc0f666bb8eb28d7279339f622cb89b813c72dcf5944ecf68e4ce422744abe30261ed3e127118cbdc1d224e538b48d441359d673470978bd4b5913b6cf557760389b3f6991344d4b622c7a332239a50626ce553a6e0677bdeea96a3efa72931b6921a23be5cbba9f51166be80a542b5f341866f78225d50a608e95bdbaf02a599b7a2441537f5124b0d5150a19a7de9ac2de2460b80884512c970e7c700aa259982bbda59773c415844b272dc45807f9d641c9443717c61bf9fa9201568868655e0f791910b5077cb77a93e40b85211f9953014d953fd3f8780189840af9ae60da1fc6c48d19d88dfc689a8421c28f569bfc5184ed6a66a50202bcb51425202b6428187f0c7a92d2ad1e7a35d3bc7f7d7664cfe9765d217f766a3c068149964b7c9bdb328a7821a9646ad53a8bded2912c3c714ec81190c966c703a5b9b6bc74c89e2e0635d614624c5371efc4099c00576d05aa5552b862455fd14641e1e80f4b468cfca6cc37e032079617c6cc3c7cc68bc8fbb3329c9e28c1caa811cd6b8bcde9ab6ddfcc98f9534f3d7aaff2a508b3237070c39e22b43a424b2af4ea59c9920d24d6cda3885cad8cbc7a2e3b82554fefde1a383c558139f9e1808c824829ab0e51634cb33a2bc3fc22ff47b58d7879d703bdd661ad3c290a6d812485ef0ce8fff48a9254dd40b117941fa35a66bb50296327b725525deef70e128ca8045ec451 +ciphertext: 82948c08334a2c9684b91b4a759a0091481dc5a3c3b19a22688040bdddd36248e8b41a96790d155324a2bd4bcb600cdc60f64868ef7bbdcab3fd549f0fe04cdc8197314e6d688ad7ca05a492f95ed47bc2c79b2e547b77b2f403876c0063b8c6e0f7a613e2168a8b51585396fdcf250d7846c89ee8d4bafb1a81b1d797f10be40042339e57576f3be7f2540d31878f6c4155cdcefc60730eac27a83ba6945c38f1871ee0bdf60ce96f0b2098d1a0ce84881c4850c3dcdd81f14d87fb8e5723eec26966729b90445fb728b52d63c7378b976f781471b7ee614cc3dda55e4dfbf44dec1c772f559aff3baab16c7e333c6a573517ddfdc3f2741c144cfa3dec335d662d614340d19b2b8899453ebd208fec0a529112d5b71208336b2a327ee41af51309dab4e2bf4ce56542ab15b6f502c0cc61b0b7cda523dc6c4f85501ad788f2ce37aa3c26ccb6b9655026569ebdbea550dab8275d6acfe5fdaba77968235d81a9622c53233927b22d320edcaccad05f5c48ba398e298d77fd1f25983fd5625776d5ba3e3090c53f9e2a793f7873eb9eea54fc4075034a126a2e1124a4f843017f44401f10af382db6e67373850cb36b6ae5db7beb3db7ee690b998d7ed5c4c9eb9307f2916c3dc303e8e21d5b313f943d06842c41921e559e496a996391cf4cb1029ea5a9ddeeda82760764a37a04399de11265ae3ebf64b04c52a9581002a0b7caa34793c51ff74a18ff8c34ac83d97ce45530ad85e3716668c4fdde7715c5fb5f6806c64d353c8a2659d993f87f74b70021f95f06c50e155f7c5015d9cd6be713d758d6c7bc186a5f9299f3d8dcb280af932a0f90d152985824a809cde764d648314ad108f9de2e9006e6757fde0517bf72b7a8b81b2e79e4538de724b878cf385c4fa599bfcb984191053e497b83dd6d2b3c364edab43ca296a490314ad86795547872b64b58d2b57e4c39851892e3641b3316fff304257349389d5429a7611c606fc0552cf62e434a619d521296dfa66d368b3a0d17fdfd4b7d8c796b3e2d3338dfb3ab19ed43bd8011cb1d279eccd6cb39b4a3c63a7484e73215086c21d7f2965ec89d496ff6dc79378e6db7c678c2c829c68e7890172c5a0c9f63a5197c65546315896780cc92986b901594905933e9c777e041c94d5f0f5c53625d5aa00c99a0675d58d3f7ead5a866b850a93ab9b91222644fdd9caf14627fdf088f2b252274a44cd9e606fdc5d68bcb4a56667c84b2d8f1f4f51b20e5f9661a7cb19896bddf395bbfa6047e958653598df20d0bcb2182b6c9ea4406a37b2b6dad5447579981b5dcc0606d84398e79e8852e9424689bcf40adb811fd60bae45284e3c15aff38af28e018efefcfa8cad3e072f8fab8e1b31574bb807d31eb88c64000418f68884aa86f5469131bb78c897c9da19fa172f388e74eade31d4d234e84512d5b7ee239625b5f440f1065116c8f5d40e99c1c9ff8dc101d2741e1b8b857cbb98359b1269b738837cf5ea7b84bd790216213193dec928ba234256fe20b87b4 +result: fail +shared_secret: + +# Private key not reduced +private_key: a3854bbefd4e306e7b377ba9d6ce652f27b377bc73f58f8fd485afb5cfa7ef05a02b2aef06b7d7d68799bb1d94f22d8e52c9c44fce5580c6599dbf44cd36e7714c7ea6bd764809ee233dbf35a691048ef89dbb7a6329436c4ba502c83633b64f99dce6f6c641ff72f54c65511584cbe208a080495762eab49d67f53063a50fb45f61544d6ad39a4b1dd3c5ed5d193a59efb8d94aee400643962e896c0caadc2a03df587cd8213882927685381371960d9d907853aab7459925498cdaf38419977c36bbfe3f6acb9832afd3b46d934256beda0bad932a7abff25dfda645c0d2cba5d03abc22edc09f9ca9f38d32207a707c2e619f85f1babff8387cf9a89c53c38b8bd2db9fa4fbabd7a4f1551b6f4e1c489c0a3692e695c73b6f04bbb2bf7f516ebb523ad794ea2deb4cc6b7b16c5f7c2a8e41aabcdddb3f070a5de22a52b90e65b3c6872f279ff87ba6eea982bb84ea768640d70797724841699c45ac1da522b74c53e55a8a8968afd6ba69bb39eb4489e47343f807424ebb8b4ad8d97f43b2bab8cc37a9dca185a19c9c6b28dbbdb89ff51777dca15dba28e7f4176a7a3e887bb47bc4dd648b41cbc6b52656405ca5f4e7cb06e64478bf806fa3b52afb3533034cf487fe4a383563aa5a057a6738338f92e9d70ec94ab05489e278bc6688a98c2ab7a18ab8639763185ec47df75ba27a801497517845b99c0b692afb31c95a78fa6f67cbec760743cf9224df1ed46f1cd5840d13ce1e0df9238c941d6d44511592d36fd188e866917d7092eabbea5d5cfba46b710b6430ffa87fe7a3d553e773378e5efb378f6f70591ddb4a2eab6e6368677492b2fbfee219ce2e6633286b73863451cb0ecbcfa570b806b5d2d5a2fc237c45dda84c0ac097b8b299446c63a47f2c93a87c95c4b02a3d160bce711f5c9073ca35f663e0ec64a18956556db8db0d9778a8324df7f11d17f522476418a6c33c27d46177359f9bbe5ff7fd2ca483bab4bcc05440fcfa67c17c32643eb65a04acf69ceae98df0904ec66057c3483c8b297da3308bb90a5ca085ea8c1599ea3aadac3b19f97c99320568504c4f84a035be7648de379de8394a66be6bff45dc3ddbf6e79ae6d8611f3d56bf8d270ba24dcda49aa5a30bdaf56e7e48ef466b469cd6ccc8c2ce439e75953c080e3999ab77533be3c9e477905997ffb4ff6b28c90f9471ff7bf477e7b311b34c8927780374725789ea7325cee35f46f656cbf57391037a3e90d7472abe6b1b5e75edaf871ebc7e4994b3769d89e215933144909a9e550ce8e2f9ff965895fec11b3b604aa07e47c5db88c98143467ab358dc5eb5383ef4af9c983e64fe74ba6f273943a656d65f6d3f11395d92dad9f187eadc29c6bd3dfa9bce59ef356d3934a3aacd73ad459e1de4bb1e8eba301433030e3d7043776db346d2239dcd8e305386628a3ceb364ccc6078d4604669aeae53ce5a7e6367838a6cbc8a7eca7503421715d9e51f4c09846314185387ec47a60ea0c5243adb14c39d2ed5948f92f09aa117a5bfb4649f8705696097466f25b32c4a382c877d82e3eabdd6b364b936f617b533bf9c837a375846bc44635c8d55a5e5dbb44325d9070f830ae7db51aecfb937f3d9f945a651693bcbb0c7a385928129f004263fa16bef92ae400780966a8ae8750e574947cf6a607fa4b3d252c77cd9925ff3a89e762378ebabe4c413af52cf969068d86acb44683222f93bc50bc8f7058def77a3241173222359d25c3a87c817461210c6e4c30d4a428bea8b2d459c4d9c71594c597fb9c3bd17598afa098329bdd15b1c23222f0f39189fa06319bbac7d6866ed7953a2c933b3479235790942d6146a818edfd64227e78bb47168709bc5e490291234929206a3fa1c2ec9359888641d61897927f0440929294439095db0244a05c20f9678b69ca13268622d174a915a210b8908328b162454c1c0c3c36b8acfe4ba2c38e0279ac15898f393f01468eb23a8db1567ede8b493608d3194b2f2f82e91e739479c35a59267a1c84fcc5a1ac12289b3e5845d0c8e9969bba50211ee716774ea03514c3b7359892bd4b8d9db4fd006af53961687e5b0d0fb9e16fcb3764b1b0271b9803019048048cab04e60119c8a140b401cc8c5f5770863b066429e71c8ac3751536dd3cbf4e775c7778c15920849d4b1c1b6ca9ac63d3de47cda549ed009b4ee7759fdd66eb5555b199022846671b1a819aa732a23e6bbd27605b1fb22b1aa71408b2e55bb651c1a676e13a8e9cba2b65b246b6683ab20820ff40eab949eb219851a7c2e1bc1a4cb7b06cf526bff6b1ecb4b5ae4d05dfec33de9504d2eaa4538dc9b9bb39b051ab7d2239ae0b98a34f55474871cf9059e9bf463dda3895e32c27a534737677e40527313ec993144841bc756e9222d756c3c22e56ceaf336e107c3aeec9b1dc71131271392b4a4436a14292aa0e24957534856e30ccff827cb3fdb31aaa086298c59ab71278885308803591513870867a018e61d2705b48210240739ade4c7100210bbbcb524966a9123aac92cd711f5da3b5b614eefdbc39bb36cddf47ecb196840ac84a6c721f1fa2f031c022844a64c4433f414a707992200b857ada964d17c6ceef31186c248adbc83ca2a528738ac567c4c8afbaf8ba57b3f42700dfb8c563b5e494c6679e69acae47a9bb14c79396bfa2593d63224e29cabdd0991101496a0380ac19b759cb0220517aded8371ce74667dc827c1141a233709fc47bd5ea6664c0b6c2182aa9a088df3c92bb5e6047c7b03bd9c4347db41efecb80fbbac90662c0d56b8f91b3f3b7b3417d592994771ec3695e94cc3ac73747f279984b7350ed9b9400201ed35b785f0629225af64b05bb5b6016ea50a8689c9ceaaa234748400db67ef9514e7ba63c683b4f5f6b35869586f0058ba7b9c4bac500a0034bce3b2bda7c5fd5c8ad37c6466a9b877278b7773ac79809222f80eef341236053ad1d0c95862796a9702fd977e820420d611c66163c5cd6c5fdabab7ec96a51bb24328617e375367ee616ecdb46089c6604909d055033d53d828c7f8cd6de0823022babcf521aaa67959c1881161620e397b0a25682cbc805a96a84bb84a9a99acfb6012e2ecc2e5bc1518036e40dbc3347caba399178ca912eb8367c86070833137d1bca5b5b3186ad23c2e76a4cc467d092102ba081494bc7f963a9a6ae575d2c57a38371be5b164adf29f392014d11522535b0173126bfb82721e153e74049c1e170144484dddc2716b4c487aa0398ee9ccd2804df58fab8e2d32ac05bf22a845cccc2997b502ed631257065214ab9afed11f00ca5c18c92c4d6b917165fd1ce6c45c7fc62329b13c8d29844405db8ff6860de474bf727ecd19e54e6e1a141b +ciphertext: adf7eabf19b964073c8b23ebd08c9c3224a3a1d1b9bc80310f9b817c153fedebbfe44f6426dcb32acf9fcfb9f49521cbefab676b0ba60e476e6bc18dea3fc67c6acfb042f592a557630ee0152db0add3e364044bcb910ceb0b79a4c7407dbc285a7003231a8d4e3c044a84d2baa164949369becc15e7d91384217dad6848424ee5d80b086f1612969c1ad430876d6b9a40a9cf3bff43e508cfe569c74e0611bf3b83758116f17b2ea11660ef51df4d20180c9a786594016a3c8b5f88e39fdf4981a629c2c3f6ecdb521a5d1556e8ddaeefd1d1db2fe5a4787356a949ef652e84ee7c447fc020e8d8fdc42dea77607247fcb55d20f1ed3271adea64165a07279b077599be443f4db254cb8ec45b21010935b543401abf91a50570bf3bbd7f94c0e3b6579e6d8b1f34520de7cb471de174fcb3c1e6380cf7156db6aa4fa483a96297842342dea8c5d0e421958942e5d4b9d9a6867c104b5f21aa6f02398cc1db26304f2bf29c124e3d5c473b5f4b2ad79a092e35e00f7ab04f4f42605d2a8632432183c24f65df8f5fec2a27a7b65cf7f2705aa9f6c4acede1f407f4fc822b60ba72f81028e4a175683796f5cd7ab11bf95ec66002670a8a01564e276b83d0ba30ec9739e917dff07478c65b931d839cd560d3756c1adcd0ddd29af90a5887f126c6bb0a27ca5c8f2c131eb7f57b876a8fd38b53ee7b3aaee459c2cf10fef41e9c853950cedf0343c044392a4b1ec58335abe2a216466e213618f36b58e1529415ad8dcefe7eca63911bfba0a27e74af1b586e52ce4f1efbe58e46259bd6a82239e58208660889c533f905a7ce54f94a97c10bd85a8a30ab219040261f4abe3c47c2b356e704a626d51c316b5ec7a180bcb41c8ea3bf3bbb846a90672571848ffb6811869f15b3317fe836436f8d758eb0393a277e4888ff85fb94b878bd54717fcfd696772bb815781e0f39eb57ffdce6abbc4df932e9d4abf64cd6ee9619aed5b4660d705fd21338bb665683c69a0bd84e7127b5816b69655e661f00095bab6259d335500881536b4bfbe84fe75cd203a7cfc595df1fad1d2a93858f98c8eceec2c1b20dde8e0dc33f98e80636e1da8945e617a47339527acd51110e74bd90148d9d3772902b879ed70d89a0370e884f38fe73aa2d51088f384c5ad2786c2eb9a9cf1965438e9d15363fc1d4cd1c850af641cc8083c95687f38caa5b631591d26a753e8413d779cf83d254180ff636207b242f9ea9c9e2c73305bb1573dc463c526ee6305d9f1b45d95a7d0ecb917eb9ded46fa43884d1f50553b4edf08c02734cf289e86649d524d5abeaa8f5b3562e80c87658dd91e66e7e55502de100be9c66bc2275c40d9ea2fc160d6178b6526dd663f798c10cf7357d8df32f75a8a6d70e46bd5d5dcdb52aa72a1be365d85986f5029b18b15bd1bbb413b8ab84ebd87aa309fcceb6e30992e5983327c033556028d974ffb076759825dcb98d20686107c72d333d0205b201b31f2963c0f762079d6358518e9e2f19351edaa5d5b426c0 +result: fail +shared_secret: + +# Private key not reduced +private_key: f1cbc95bf8705fefaea293f134f8b634bfda3f3b6a83afcc6897f8df4fd944ca5e74c4f744e4b2bfd860ad79f0f77ec4acf7d6ce99d3e0eb9f434364d2cd9aa308e404be95e704375aecd12439d7f22e730773844a3d49a136821daf39c7889fef2fdaa015813f9876122debbbb9e15b0f6c3776f64374ac29bdc9c52fb844889df25dcaf954d9fbf6ef08daa4dc4b6bc4edc86608f245fb813dc88bef8d9178be3c2ebfce1c3b8e8c93c8cb86aeff1383aefdafaf66d0bfebe78fcb56c899569bd497ae15e86f19cd9e6baba7cac85f73e7792bc6da6c6222da77b20d595e84a2c9a9b9dabe31caad514e9c8c59c3b1a12637fff8353d468239358835eeebb00bddf6f37a471e32f8bb555abf6eb04cde3697f399ca6e5b18a05aeb934516a4851e6cce7fbf780379d82c396ad39eba5b48dda856e0d8ff7b9c4ccc36b20054cf5d2bff0fbdd3345f7c6e6977a775aa2d58b1816d9ce57346f9e8a2b686b7d85cb4c59afbb938b26dbbc6ccd685a6f3d9838c9fe2e335b74462c2f7c52159dea527af3dbc91034c74e3e94a69f4fffc39d920d64f4d76fff436345c06c242749ab25de21ae330f254478d95ed5f44d48c2ab65c8460e91fd499c33b4cb9851985817d7ff82dd49daa6d64fb2881e18697696960d9b5ff40aafe3136368c0c5146ac3ed3b4aa581ce43cbffea92553982d3e95c441626e447698bdd6dc462fa5cbfce3933a3cc26b2ccd5295c3e3c3d429493244f63b811640f32eee86b54146d59b2e86ec793b4920939c89adcd12c882f08e92fac7bf2b0ffd0868dbb5ffd226bbd2428731b72a81cdfb654e09f96b73713edbfc9044ee78a8b0d6699f5933db298a658658e09c0d3841af424aca7d30d7c15d47d4fb88c6f66592a04ab803e83eeec4f94b2bb5c6f957b65a6aa8c88a88f533751e404ac7cc76857aeb3ac07e03fe8cfd402dde35969669e2743ce708d70dbd6be964991e797923cbf91cac6e78a8c55c65a85e5dfe2184491e4748140868248364066f9f0e68cd2f86691d03d2f00ba2eda7efdb3ff2e24ff10123dff2fea2d98df80dac8cb99af9f938700489e5146aa8a486afc16cb4d01458eeddb4d6cdf7fe2a6c4a884ee93a495a6ce5af938e5b37aafe655ec73fdc0d8855790e890e78d5c80a3b5e0c395548a1a04d4a4b6f86e14ea95506be194a7ab1d7ac2105fa32bb3b5f5393e5e5e73d2c7c8653b9433344af489f721fe99523bb401cc75e8dc8cf1e62a6a6f7e3a743b43de534c9bc2124396107d2183ec1a4fdefa3847cc08ba7d1a7de2f7db3f0c4349f7d7b40bb9c4b65e9b874f334a975755f9fde05927b25b8c13bae1e456b87e9d08765ed0c39e8a3658e9a9b7dfd1d5adafdcc7a28dbd1ddaa514f702a0ad3fe67801137a1faba5814ffbbcec3b05b1aca701385e169d31ff9d43199b07bfdf683ad86191f749294bdd42b6d0943d248fb52fee84e98b68b4993d508197a06caadb923f950a5e08f2ab2b4854fdbc44742c673d0f55626f7f6d0ba68ab45d8b83d4d767b7f868676ddb33c917ba37b6bdc8a93e756383235c8ee883ee4279cfffb29668d07d7b48e53bf7b39a388b9cfb38066177b0695a512bdc9e6d7d9cf0cad698035eda89cff189f730a05dabb3254297561072317010327d4222de388a7e95d8d0076665061705209d59984540471fc61032904b13dac27d520a2b7cb653a68a46623316557500cf4bb6f71ac9b5ca17d45331ff06507d5732829af25417defe7aca7364d99041448328f57d94f1af2572f7468da3b9f2e432064144f0396c1a8d95ce9951530a3b33b092d67590b307944095c50c30762435b76a5dcb3af494a5b112fee2567664a376f3b30c32172059631318821de71ad62b0227d9a91530a5ef2e6c2ecf925fb95302598b722a991e989a1fd198836fb340fe44849ca144545a5a14b46f464078529bb6dac09d148949e91cb0d7912f8701d84aa48ddacbc1aab0a4eb63f9ba41465f03f1bf4b4285cab3e315acd8a3f79c465d1d31fb50670423b278f042442e2b5797483f5a2bd21e83248e3039626006d7124a324281545b8c4356396f413a1fa67577c5d15c638b7d23199aa5343473dd5b45b66f41d451358f74b82a3c18627a60c08513d34e14e3f2a4b13d7332fd8014ff817077b7ee2db80a9c00eb1da79c2193201996036d214ee7b238d82afc2e3a226159ac05240e6683ad00a55a006190a279e116626b4f70fe345594d21a8d54b9017a76d6e2a61b9585bd5e378875ca26ac071d6b1546ee99d716cb8587b7a4e184c8119cb3150611389a8ca0bcd1ab6a7107942769cce08c00174a19305d438a7a475f2a29b28d230a016479f8aa8da24273c15094d3c0e10a8a0f0d3344169b81ca508e6cb662a4ba28c8693b9a27bd46a35acbc27a6b7cf30292064b4aef36bb29909af11d8924ee59af80b5871c2bdf0c53830a360688ab31a94cda3b12c0f61ce341bc0566ca6ad1cae54989aa3083707ea74680ac1fcb254fe3866bc9c7fc33189d3f4299a8a0a985ba3fbd51fbaa45d26aa352eaa710826aab8f600ff8a9554c842657a3cd2d6588f42063e9c08e9955ab7f3ca032b440c7889595a3454025853ba4070f1cd09dc26392b2657c526052373eac80c920c58c3a24827456be174842ed722487c64373b2457836f13c4065dd7b555f3914567cd87426e1196bb03c08c7a77c77d586f18e9603f45b1b9675bc62a4e71f215c3d7071729b0a8e9069f35ab73e55948f9c3e766c4f150394716b198721676495416e54841908cf60148a7104a4df00f21a10fcf508ae9438ba162291e5245afca757ca88ed577057f543921f670b262a0022a4ea4044318a4b1af8a99cdac8e1e550b732157e8ea9194970f786665c817299a7914b4c0b3394a57adb179bd3067897421a09410a34c658daabe6250047bf15b76f826bd371f0c504a2cf9106eca67816a4865b60a87d48ef4753f90132663fb26a5fa08c59394b6770ab13081aa200c79a6802ee826396cc9b3ea9cbfb482d601952752758cb7cd18605a9336735ea2322bc82b7bca773be27f17bb8726a8cfa9070b9aa6a77cdc0b64081cbfbab45c4314f855a953231c6fb6149bab90707b87239c2f7c7103bb9b2532180bc1f16670d90b7b77c6028c4d4bf92195ea54bee1150c25cc363c57f812a0754c9bf66470ad820e12133ebf44810b7318d2a79e5eb98c17c40b0ee10179f1b5b6870f26d27ebfb588f3a0d02e10a041ab4e3b97c35070f0da64f7e0e7076ae69b2ab51a956cfd04f889560d4e598328f6302a9762bda2b0f29fa8ee34fe48dc4847810fc6f44cc1985a3407f591791a5db4578b5972093a95bec3b8e70c1d542c9b5c9789729f8922 +ciphertext: e7a99c20e70cc337043c1fb4b4652347b827093a693543f2b31c03c52fdd4a2375f5a66055969e0754920a298b5335298e585c0e5831869e8714ab1b0f0d8a2dbc97d79bae54357dbcb5858bb60f55c1c739b63cfa0b57e6feb3213b5a90ba8aa94e1acf57b3fde306a854b28bacbdeae3b0610eb3d9595389fb2e29288586b39c6cd6cda86845241ded3e227792bca133a7f6b6bd2e03f5a215c63f0c682481a294b92b984ad8bf63dcf25f20dd344afcff545d8c89ea41ee0929095dea72aa2c007280eb9e12e8f7df68f43cd1392af717f01cbca7059637c7a5b869a5b3f26b1914ca8d12693c5b452c77c7ab8490ceb84a36066d26a84437fab7822512186d6069ddb363ccc3a66091a6c438667d6e423eb785b37be24c0b82524ed9fb67ed990311b010cbe63c51f6b0046c054bae7001439e4543d25511e9ae5b05f9fa0868ca7241322800e6ab6541e228fe2c4403863dcdf99bf3f01c117ffbdb4093c3fd4057f38752e878273a75567b5d8d7d23e62b7c9e478b12d8e0b910ed1c67377ec04496961892723109034b45dcac6e6d86128c1e6f7b92c45b695431406420ef8081534533182306daded5a36f9243e069914feb94fd4e21997c7eb259c4faa30d90e28bc81a2ee5033b54d1304046d8f110ea7e4008b4bdbd06c4b3031972164e9602e83143fd0640e51229f8243124ee1420d0895e30e19f4445553d236b48e65ba5f51a60a54d582e78b2b79a8f62dcdad61f33853d990ffa97f7e9e5f6a1882ea1c97efccb8c24737f897862eab1ad1be87bc7754cc69806cf53a123be63d6f08cd1251388fba7511e8457d8ba0c41410970706948cd42a73c534ec4141d408339411b480c21e60e06c4376fd0d818a287b9b2e235f7d86100aab7f3874af278561e7cbaaa269417fafb4ceeb0b0d08260db01e0b346e8e048a35508f4d888fc39d7250198c383258b735ef44c4951eb02cfa0e70d72468974a25a93858af6926c1c63f3ebbf279b8044279a4476d5fc6b190fd85d581138306b1340423bf70af7227698b740c5e106828591570269bd549cb6730674394f56e56474b76930e117dd16816c79923c31c1be831256ea63b91a4c0966bc15ff4e0abb910d088f4c5c6418c356eb076740f8d3a114584b61a52608129ba0f956e2038e9c1fb1d69f1757522c45111e26449b0f55407d09e51d50635ea272b18d029632bfed44272347b5d3c99b077ee34ef4f1c21104d9341c44aa1607eefa47d39b6af568f1615410558dcae8b7d546e0dfe88fca027d4f2bd6f249c5ec9b222a90edbf0914dafe124a56861329d09f567f8ddd477d8d73fa74119da2a40bd27a317bfc9ee8d0f2892cd201c55615466a68a16d9e39c107f053600618423a9a66e9d6acfb310c327780c47f72f45e09d27099ba53d4997aa14b5111bda61d5692dd9f73aaac26f07b590662dc5c99f6f4bb994861003dbf2d48b90da8860b911978b16098fd6cd7eefc4eeb90791486f2b4bb36023f1538cebcf9798a8ed2cd31758928 +result: fail +shared_secret: + +# Private key not reduced +private_key: 62dd34b58f7c4405b4cf1ff6039cee9804fdb597e23ec8a44454c38d54d7d5fbad7068c373ec34f303a6c437f990957c5803536618bf084e8a9397ca03b8eeb459d762da41aa5731a8b795e077ca1da336289e32d785b98178e9f58cad7804bbafb3ffc60ea5f68981c48b4e06b7d88c2784e917b0645cc28116904eebc3417c525cd3e2a42dfdb9d97cee85827a1775751ca138fee7a217a6fcb4546d946cee1e9c6b1c45a238f415e9c11d6cb18e2f616be6917a3887838ebadf6f41410a42048ce56d0c6fc5dc8060e9d46fa658727b8e4e045548a5909a9c713949ee0597f2c7969b0b48c737b3a09218fb002f5e98d8ae1b09b50c35e76b2764be4e4d84c57ec41a4b8c04c82fcffa2f5fad200a6e127968c844c8888cd14ac99ba8f540687fe6022fede01c8f5c9f3fe089584bee81fe8cc3540ef490c565332a7bd8953f97e75b2deb83fe53b3aaeb9f4b0fadaa5defb339c9bcfd9bc6c8f6dadda1ca5a563b9fe3b8858e9115d99457fddafec81c93ed8096b72f46da66ee94c5b758b385f8808b9b48a65c9a04b34ccabea12cac24599f2c36664668e366c7eac87f4f01d833a5e761276e7bf773d886e44dedf8ebbbb44de625bd89f4eae1ef8bf8a7f02439c346a438b1a8b518698af814e8548664ae3699efc8f71e8cfee995731d83d9bedb87c267fa6c8d5f46654a93de88ce76eb9e1972041e3446cc5fabe73a35b97cb427f97988cd02cb8b3e0498130341df04fb8538ef667abcebf576fa266f45bf368d9f6385cbbde226f1094c492607cf592f7c2b1fa8ed79c6a726a7cae8eb7e9a50d794e7619ab575a3c54bc77f5b9df06977d29ac9fdb447b0924e68d8b37be0438038efbb3eeb95221a8db96bd7fb35f04486d8335e3bb0b7d32e493ed539f67c278dce0b8d954b4ff0bb62785c6d253f8addf3608d5dc0b9eb5e3bc685fe198be984735764bea637b4f9ae49bcf356d8a57d21c4f6b736cc8e9b396bce57805ef91f433cc0ad469728df623a6564c8c1fa7f3896437fe216715b3d820db78f7f0a78ad2ac03407d2ed1f9c95dc49d8eb3b7a585aa10d46876a7456278bc4b6e7cf9b8f06e89af84fc14eefa7516c65c83bc53c3335df7cd0c0b344f79635f33f420ec893daef9a36986defa374033546256d7e343b82660b3597eba842bf50a15574b009716b58e2d6be75b899f9d3539e3fa97b3a16644fe6bac74c67db2832a9e8807eb9745fddafc10f5ee199b39ee3954b2efba484b3528838a56d5ec659a047be722ead37faefb007c8952189f7d9aa8514bcf63a08cde877f0cedde2fcc84f7a089ca7d5ef4ee7ed7c1379fd34c713cb65ce44e0214385dd6c91ca1b74a4bf4bcd45b5ca097a02359a710d8adc8f921f7a79b30a8689053f044d453e6b9979c8c52206d7eb4c72a30970c09562d90bd189acf1284eeab57653b5833035aab95d6ec5078d592db86718bc6a5393a96c07907748be2aacfc2324cb1247876b9c3a530cf440f3fabf7fb39ee59e284a62dac56964d7f1c3e3d5126af2a95bfb981a5f16f7ceb6b7f007d9fee21d362deaedefbf8d26c5a5ddb58b4b665f1aabc8a916f8abb65e5779e94ee98f61ebc4835775efd5dcd5136a4981b339e1a1368287fc699e4d50bab5ba45320968fb7cbfb358c92e2564944571591211b510a5b044663ffc7deac3546a8aa060537bf36229bacb4c5d918726b5ae7dfaa45f153f329140106a80b3c54eaf273384dc8e47f58e68621f3be905ace09a76ec9839ac471f9404c196587cc95d90166a247029aae0802ae3cf6983355b330bc9c6a4748a6130aa510ca1afdb876ad0d7b2653c3c88079e14d7898ee482f34651b7a238f3f07bdb4989740861d358384a4863c39b8912259bd78653386801d2450cabb6bb7fc287c74b2cb24c5688b66f7952c289eaa5051b938fc833f343c273652e4a1a6ee6c35c8c8131ebb63c82d38046b41343fc0fc660168931c899088c92db171f75b1f691577e09ce56435ab060c8fc084068133cb67cbb0fd36a73d8a21200623ef324256b99b0f60841ba9cda515f62a978881318fda87c95664e4a5755c72026369813dc90c8d6c18f48d61c10e49a7e9449f95492f0e4ae14f6969b654fd39bbac79c7e0b507559d5137d2179b59b21dc60679cf1b455b94208d87514c008898a95747ca9b530164743a6f9f1878f7badff6a4b2023ca367944f288a399c52648f834c28014b0f921ef04127ff4ac656196c034c0db9a7e8ca64109b904b2427fc601732c12241cc32589790e3bb71d924c184edb521d3b090a90ce0b296365ec6911341ad4d8cc7c136c87469f1ff101faf3488f89b52e98b920a659375125b48c403b4ba3175bbc6cc5a2ccc206dcca0440d54c6dac74ce4674e46444dfb4b5070926074c089c28c5cb11cd4c9c715af34aac79644cf2ad471213889c5e7ba92d114150233c673e505376f21dbc999997f43ff9c3b0f8f1b3dec09a4ca3ac581b9192984e43999f0d34aaf32218b02c8aa2f21c579457f204bd18191811e7bd6e4aacca5aa7c6f41fdd192bcd24760a2243034021b192575bf811e1344a25e1629b019564c39b09c88ef9b1ce6761066030bab14ac202bb6a8d858c3fd316c4fa81d21904ae691f6fe7931dbc93afc09f18f3b278e4c453ab5081372c093a9a38ea1622379f56397ec6c47cb7067fef7225c952c262792dda68135e45c3c6cbad23593ffde806fecac55d682fb23839b37186d4a40b83641d9214b7e0490e305807745534de18b9d4bc5eea755cc117b68b7a30f76a9458708249f02dfd59691f0b720f257f1f96cfcc3573c5696ea33017af14a843b81ea58821db21b73a9b80ca187685dac1f8735ea219cd01c6688f5bcaf4611fb3b58ad65b8d7c8ba4ab950bcad9b23d5b2d0b718397e111feb25f1739ccdbdc5c41d943e977aff5209134722dd3d54b923b511661127b284ae9ba0c27f05aacb20181602d9bfb32c3e255e7f48735bab94e515529a9591d51be015a009a9094591c7e07a13c57e636b6e11cf4835a8180895a6581507805a1c7a39ab05633798aebcaae89e37d8d75b4f34c73c2184ffb567069f0b3911943c2060f34f10f835c8233a34b5618501aa36ebf678dae07af9a567ac7143567c92a89a94a0a4abde383706ccc3826a83dfab8ae7165c6c6555bc77a43b5b3b2b590c56ce25e792796283737c6f5b300a0cf06e0060e1634a434793383860d84a76807c2983c57522fe3f988486bc386cb335ab55689d6b449b7a38dbce911f512e4f148aa1567878025deeed7dab8e62d43c3d2096e4682692537c70ebab9e1561cba88b05ec0b9402bf02481ce4b27a52e87feb92c4399c7f2988d40e942e7496ad15ad2aa88 +ciphertext: 4d85b317eb5e6bfa5ef78c31fc794d40b33fb3f1bdfa125bc5372bf84c6485f60b0e4be11cc54a2b204c1e2f67820089ce68f5eb96ce78361612f2b08316c15c609dd8dbb0f30b4c25983410a9e144c7486f348036949a892057eb4e29e23a7ad87eb5219d5a684e116f34af7fc3b5e37e76d4801ed34f066117622cc9944468109173b105805c3520de565298b2cbb47dd0343faa575d26889c032b7a53bc0a9f0c90ecce39eec6b4730c370ec58d959091d06472279262b07129610e549da8a4fbbf7dfcd5fceb985e7c27a15e78d1228222ceace2072d10b774f5c07785e9975131eef0c0abd43b98fb34502247cd7cf239978224a1a805e60926641bb20adc9a94efd26be6853eff0edc12228106ed7a58fdb150cba5ea1b68fcd58f8e65781f2b5825b0c8093183f7f6f92b438c5d7e4cae70a6cc9fb9a184ce0f254dc84141b80f5d1d2ec7f2442f49d66efabad3bdeaf4dfbccc4c36e1b4118b42ddd66d692cfa64149e1cc204635c152a8ce0020a5ef8c7032da13880e8fd4297cc107c84a1fa6674049c4c1b25a4bc8996420ccb7479eef4f5a6b7b3320b0e798e2f36db5a2be278b430ba1baddceadaab67faf9cdff46b59b3f1b37257a63462abfe731b5f6ab7a59d3028a9efd88f93fbf50f108e2a1f42a2681fd1feed062a512c3510024db9f0e9bc4e110a2642f15d84a0e0016727c837d0a5ddb357a4f3ad9a926997ae405fe1284ddff6901205440b2d675625e1bd23d8d11b9e9ac03c5eb97585b995579581df5a6c69a06f6d9e09db3a356f4227ccd069366a6030d74508a20e936ee586caa9d649fddd1c29c02ae0488ab6309f7a25cc81f246871cdbce087d7e01b2fc1274800e6ba4a263f29c9563691bada0441202a7b065704f6aba0d91c5c9d4b53ace1ef361c39ed34bb94aaa815eae25d4952a0fa45308d871ea49fc8c1ebc5b6a0a93c31dabf41d5f3097a785143839b01e218495c1d075183f35181319793254b56c29e3f02a4f220852316f53e418a6aefe8d0dcd0fcd601627f09a39a0f0ed8359a4482356f7050c09da53f2b74e003d7c2e7054353847f772fd9edfd5f2565796e128a6926f3f053d2cb146eb8871a05a1b9161cca78559f1712bb9e004f0924c1fe51973e7153050592363a93ad12947ebc73050fd849407282360d876351133f4d37e7b5fb51baf97b9ba9cae783468558ad51717656687947684bb61b9faa87519eaaeeec7a637a1fc93cf63da5b2f6d53fe878b2543fcd215be1609142e3b23c51099dd488ffd3b0ad68302127ba97d062f9887276ce45df63d99f494b5fb22c467b674954a0c68bc85cd053af86cd1704e258eba6ba7812cb2b9c9a1cfabe67d52b7f9115773d3c4e3afba0fb4bf7b9eff6f220cd2a03d4cc7c5c9202fb4d80ffb78aaa8cdaa1d8b0a603bac25afabc0502a455005eccb3c24e2b4b05ce8e29ba69f52b3741679c359d62a1f4dfe424c8e77a5e7bbd5de5499d7763a9a709d828e6c0b144828a88ad4d6c5f724f7b3fa1ba80ba6e +result: fail +shared_secret: + +# Private key not reduced +private_key: fa9abdc85db446ef973d9c85b0599a641d583b93c146b6e25669f258e79664f8a22558cdf56cfca034dd5b24f5b6e6e77956afeedef886fef714a8f872dae7ee05f185dc965de960b29972f68f8d351d506e34bc54cbfdda3c6a54b5aaa89466cd44afe56388c22bdfd19b74412dcf83779359097c3f3d86a904376b56814a454935bb5328acecc5dd8198fa6797149c74eadd21f99177093de6dcb8b5579a974eceaedc74ab8c3e92ff804bfcb94ebce245b53e27bb59082e9bbc6b7f61ab3a36beec3cda544dbcf62c4f89a4a930283b56d5779ee14c62f3a893090ee30e3b34ef97d87e1cded6b5528013e92778f871ed9db99dd467fc82602b95d2fe6d680562a2b866380a411546475d1a529db537c2ffb3e3f393c29e9d6fb97877297cf2ab346273478afa7ee1044bf4d3353384d51e0a4ed2364588ed694a2da6cd6abef9f68d01be6c7b2a53d64bbb0655d98caea9746ae5324bfbebd956952d90ef2381f8fb747f5964b4ea9a58cff659635dce7c55001eb7d1c3a7668733464f315a05a0931a9a5da734f6b647df0f5e05e480b6af7fdf2ee6fe03630fecd74f64fab358341cad8fcb79b48c04f83b46c54219c16bc7943887cf452befe224bc00aff1098a75b2d9b35f7eba2bd94f1078d0dac689d71dfdf6ab6528876c39a74d63dc414a0d77cb94cb243947205841f8b698cd2e4bcabf442ac4e8d7f4a7bfcfa793fc6975268a4cb66f304bc7cc24fa82fd57501c75baf9b3a5f94935b3991d2f8aa62f66ec289ca3333d35dbaf59aab37d659423bc9953656317f48f035d76241be5fd145e86db6ea8758b9b265ccab860d05f68ab6f7c02bbf45f466923c9edb7af40d183e6432f9f22946be1ec538a86b7df2aef490e791ddc487c6acd7fbcbf9f457eedd8ecf1ad3ca1ce5e45247490fd8b7cbdf0e1c6a4e8e573a6d9c99694ff822fbd876c4f6b193f22a68afa2eef302b895d36f4fa9faaff265c9a6e71889661897856b963c9216ec4c1db767ecc725056b473753ad6c9d46afc82c60a8d710dccb18b7a393e933eeb9eb02c76e379a5b326c72b0647addc393a6676e6b948bc465578e9b4ccd670bc3ea39c6beaa52c6737433e931bdc2ebf39ff2a55d8eb649b4aa69b56987f0f73d98f9db39ac057f89194186dcf3db1b21be7f569fc5737cd12ec38bceff8dbf7863ceccffe9587bd485090e45d85cf98f91eaf1925b37a4ace9c85e451f3f6eded73c25d3f54984e910ba12fc79f502391785bebb3c4e211e654655868a9dfb5aa59f0b90bffe86d5bd7e8a3aa668f983ef12a96ddd87fe13e0cef1ba93a4b1dcae185bdf9d8dc06ea30758be2769bf9a4a3950e9e75e15873f10441402fad7946f643599f7d6960f3d662d34f55815cffd7b445d35651ec8cdf874afa2c255aaad5ec421e8e4cbcb6f91745150c51cb7a5d5987341d8d7cf8969c5249e3b8659dc62fdc6e9d782d463acc647f16976f641c54005ebff3ece194c56c3d7eb6bb296f65fc99d20b92663ae9a0d8748b9d932d498b7f3e5be3388f87b73ca9a6e1046ff4fae8e792e8c7a4af3dbefda44ef9c0ec0c4ea698d4d9d9d790cd8ccb73328796fe01f871303d388ffbfabcdd810dff485b19b76208b41eb99b73d2b00d7884ac289c5b4632f8362ed9f238e07a34fd7b3acfc5973070c83e03b9b45c65f8eb64a08b88592b6676db235096694073143ef758fc84c9d3097266b66c9c34a6c5f876779936e345c3a07614e2795e65c0793ef3a22cb65bd06bbd90b391eb425223c2c395674d9841109b6929d353437dd49c7cd50d781cab5850363865689dc8bcf81a80c4269a05060965b80a56081c186a2f4bb00e2e942863fb8e507230c29215c98a78e37201c263783f703b17928f36656b99f9cfe31917f05c25f57063d728a4e2bc652e4193e52877b7310f7260a1985985c26caad60c9e6f01b54be183a7c2ae986ab2a85b33788674dcd42566b406be251837266ebc6261c3b62fff702f10298119d414b580bb4077791b7096a7471595d8659614c878d8097e7437503a7c7e058a3dd295d34ace86b9302b901100adb0e6140cbf44161ab33b9aac34a0dc6f1faba14d259c546c672ebb7f528a010d5585c21c00c4b19980c6490d76083a77b8aaebcaf7917a81b55a6f2a6be7941393d0a9ebd2c549417f38682def039b4944cbc6fc629bb3a3ade353ea2005115a665087c00a4b771ef0490748b370d8b4c4ec37cdd352562a11479597d8035c00824f48805000778a81d6a31a0bb8b6201cbd3149ef96428c79569c5cba273a9bb4a77eef98bfa54ba8267bc42c643c29577b2bea5802ecc038ab70fdb1b23d9272b7ec30cfe1791126a185c40a77c57ec3088822c808ed8b1866068035590460d6a9a00c50db70b19b765e7ca8229e1a66f4fb52d752b515eba35f64097ee85399d78ad4c2cff7935ccd269731ca2b3b3217a22203e3b9438cf0b396fc99b6113cbb883c16869bb114bb1adcc06863738541acc61458ec9ac98df381825ca80ad954562ab931d1bf47a1c45a5c1c72d90cc2d3b4cf6135b8b5454ec4967523ab82e9aabefc89780722b5aa12e47344bfbc8c3426802c77c02195255e71555d9045bac868c7d45c06b6474bba2f40fcbc480112176a83ce361dacf2b386cbcd270456e7563a873c55d752151b76b3fe3c3233c5199011aead401b88b9c36efc295fe03dee6015b1ca00c5bb06dfd2c2848125af903c298c5f74fc4b9937412ac70aacf07fb99488c797287c04335821cbd6475e91d66a7d89c2f67285321442c4e7ce61d0212cc16d74c211ed2a7bd829044ff82491d1cb1746430603a0091110f626804e0b32edb0cc827c8ba7c36f87cbc67cec250f65ad2fc621363bb715557848c5a01b256524271be7b6956b72be644aa0dd33925f64bdd3481615246e95294196d6af1aa5aef6880ce2a609715b50fa7737be749cead7c84977747924bc25792509ca7a931c3ffee7341547913ee695f8144afe83430bd5c96ce61f57610f78d6c64c3c33b468b6f3cac46f29b60f0705ae1a05e5c63d21a62f5dc7208d25a7f0c09d8f77a7a7a03d51d2061fb13d9ae97386fb6da4cb6fea0923937536511ba8ff00ba753897d16b76058a15b5c706121cc792076ebc2ac1ee492a36e65d12d23f6488245e998457d4337a2c62c731afa43085a94892bd30393b1c9fcfb380f9815ea491968d6514b8707551443fcdd5926991599da552acb4a19b6342d309b5027cb88909ffc8c83b1778d8aa46c9d07aa2594a7bfd47cb7ae17d30385f988dc748b843b7b7f569e58ccc9215503e1bc2f28f5019fc72fe6d3324c3da70fe850e80aa818301d60c70f3038153866dcd5d179e22db59b8991bb4 +ciphertext: ebc5501fe8979387772fe5f486b5ab466ab6080f3c0c2f1919488c60d46908ade6243b7240e4b4faa38d3ff8a7e5099f66a0a4cc90e696b663c995004254ce33f75092abcff3dbdf52ded59ea137444bf4766a108e95db38f3ec150c2e2be33c9357ecc6f1aba15f904c66873ce66c64a341f0692de732951b43f756afe823496ee48be44b0e5ddd98db7ec401f872088dd8c570e74ede290222efb031d865559083c7cc2b01f1ef63d3defe0f186258b0e1f3a750a0888b6bbfdad4975a1e3d2cfe0370257bcdaabd0c9661098e6d343f96639017a2fe0f8528db5995e9471f4ebe77f12ff032826690b3b9137b43946ed6a6e9fc9db0d3682f18772c9cd369c30b00f66c0b2c3d912401e83fdd1c221e296025ffc49c9a7de4400fb1e05b4551b96f6e5a760730fa998834355c9ff8644620df83735101a2ba982010fd456d6279731798ef26d179582bd6c2404df96ab1402225b8b5764caca763a3a4828712d48def1968e2157c6a7a15ed1b0472f0706b59680a2096efcb8595e42f1ffac5885da71542072624c8f480c1769fb420578146c118ba21e93f9712ed3c0303e631e4a7a5aa2d6f3b247d948e27cbe2d44e2804c3a8e9dfba678a0ff44c201945c0a46cf31bf8dbd6dad5a323e6f4ec52cedcc7c8c12f03693aa0a4ace4e21af890467b7e7e876b7d45f22120bc5a6043b1a8c322f035f16d9bb5d3a629b1b783e1e44d2c1205337077dc68262179c290bc4a2f291110e8bae9de1f76f45eed9ea69f01d692c25e8f33f66dc4acbc539ad9d5a062616c7b1eef940fa546729b7ee744d655fb21ed346207aec821bcb8cbd8b71ee0f46b2e718349b6c422547feeb0fb7767403b0dec26d3dfeb7bce5cb6837960972c53cffd753467cf88088fd5b88ba493244e593e5dc1c85e6a6934956719b52ef9fad4ba14520631a12284d85ecfe9cb93cc87110e6ef5623e03f91848b67d609fdb6b3867b354ab4ed1386af75182f78189704a470cdd8576f5485bff21bfa8d87e3b88e50986909b3833b08898ed5b7e46312364d9ba911219a49251410e76e0dd66aa451ed9c07c7dda1c7c7670667b40fa44e5bfe76a101dde80c6c411f7c1820b46ec9ffe2bfadd029ce14181191594835fbeef62eae04cd00537e6d5d743a9bcd7eb5b52bac2207d7bb3c42a631f9d73fb82948f74c2d0c59d99a366b600247234f619b609f1cb66328f15241d5908acdb63c905d5959e0dcc5fc83f7d1b704274ed17c2582e651200e70f265d816468fa1b5683a4604f7cf72d57ff9aa3c698f02de106e64d99b0551649bf519c43efc04cd8c1750265473d4a1fbff0b6597d670e9aaf63b53295ccb483defa0b49404f16fc18c033dcc1c115269c97eb7c44b89c76be473a94dab492b2d98c27e418671d21288ac7b7f82380c520675140f018773d586f4faac79a08cc50bdb525d138ec4bf6a0d730e9f1e559fe9e1158509001cf6d66cc4994c08c922b6fddf40d493a049f8f587ba0adb83ed5f045b82598eb7d2e6be9d76b +result: fail +shared_secret: + +# Private key not reduced +private_key: 274f4f449e91e68be755d6893ef3e789b8c6995e91cadfec1ec7cb8ca9df82ac49b7996b1ef48046f8b3093a36c27cba5c35b7cd733679dedac06a51096d9e47da30a048312f1543b886e7151e4d37a3c70fed9813e79f37e6402d584f51673f70c5331b89a52f6ea51d363a8ae8d81e0ff8de7feb20469dee7d8bb64374e2678424787c57a4d617a8ddef73fa61eba802cea07a5e7302f3b02db4b136d588e2b4efca37f9b64ec9bf0dda4037de257c47103449bbd47eda9bc7a9c5d8d52d76fe7734fa5454228958d7cc932ebaa0f9eef123e7ccfdebd39a2a66d6d7a0140c6ce16b9fc0b6a0a3b7a0b51ad6d8d397ca1fdf1edeb5f52e6565dc84e9aee102e54b60e88abce7714bdf9668f79b7f2a7b09e7c8a92480f31bd72fce4e96e77e6344f841167afe44f1c38cfff4ff5ccae6dc652c9831c551949dbf0ee9b2f118e04d87e45ca4b5245b66db76d7b0dde41324328d746787ecad7f6adffec5dddeee6ee1ab87440389fa0b9c44b75fd26c726773bb8049a77784860568e07e069d3d15f1c70e5093787ac7ff63d366e30b9a39e5093f62d7b2f8e5411f6ea18d54e55fbb4d2ba7b0917fcf6fe666109ab5fc078eb02649082dc82b4990a294d6a56df68414ad50fe791b47d722258bf103507fb9a09b09bb4373465ce5a1ea263bae6b723036af2697d0d496724b4f539cc9b7f7357cc7b6b33f1e937a884dbe3d888508bdc54f379eb8b3682341b3b4b760a879fd2f9398ed587acdd3a06acdf3c5530a7b90013873f57e39c2d96e1d7b67427467e64cba2965766603ca31ee3f2e357e3e6945ceaf906416370cd699b3da77889b63be284ad548f6992991419fb805aac7eaad4d0275c71e0df1ffb6d02c27d3ed674dc5633367ccd86dee5e4f6ea93de94023c8f3d10afabd6f50b92a8a04533987a6bc510bbe84ba7fa1699b077c3a05a9fdde5fa19baf38b466c2801b3fe907f436ee5ec244febebc7694ba68e27671947eb933dbba40ad726297deaa6fee9575d444845b41258f6ca77915345c0af3718fad9f6ae6d4c9a4971f6e8b5965ef5ef54e57bae38f5fcc043e3399cdae03bb4ee5d3679a6e8955789e80a78bd896aae9e87f2ccda6b83da02b08fbf19c541ca9344acef7f883af147e3bf62f9239be9a216478a498da7d9b600a7e9209f69519e5774cf48c8bbfdb96e4b0f10a940288e9204532a54c48026a5cdd5841e6c8a736cbc99f9caf46b8a90648a854f9c6ae47d48c6671c5e8a1b283e01945e6328f9c205959a4b4ae87a4c3234c63e653cb75d9f237c4721c66ad0597eb22d69f3435baaa03e2491394cc1f38b899973ef79f9c47ef045b4145ccf0ddc7ed53fb50b25c46e674778ff9d69197a9861337edab3de55cc28bcca65b2a5fbe2afa67197bdb1efecae4dbc86593a06c833d8faad0c7e4438f96248a8e4a3d4cd3955081ebb2e717b36deaa928c3c09deebcac4ee4627a7886f64d6acfd6cb7aa8f978c13e84a6c6453efb23f8684859ed2da9ff7a560d436977294daf2abc08b78ce11af2d5fccbbebe92d57534ba04c5dfba389c3bbba405ea1ee9ac7a344cd519cd3a2dd012da9afcadbf9a2373ac534ada885cc723f2e5b4a4b84c473610631d29c37a90908cf2c89d075928ccb3b9558a5453315acabb5a228d0abbb99d63b0294b68594a0a648367fe044e14347073562aeb475c17196a3da38896f2168996ca917a0423614431963b10b5a0d3b228aeca3b26363026d1a5a952b5333cadf79a59b93b5ba484bbe4618b41756a101429cba6407b44a2b001108eb30e92d60c093b4abefb63438c481dfbaf08442d607088ebeac83a950623e057c99cb0f9e31639cacc82852f4cf9bcc83228151b91cdb0423f610552b0c170203c7f2b345443bd7d274ab14cb67b328d914366ea9a220cf46333a41feb5193ded4a5d94c6e0a43bdd6b2a52c3c4c718591f11b32ad64930a638ea9f217e64a9e31526313133c02b5b0cab821544543fe24aefce70927d9248aec2937385c79cb85df91256e176eaf3a239b370d4ef56a90dca3935507a6a86d84b021312bc718662abd432c08bb4dca3614f357321b191a8522ac109a643a5a9a63419be6845e5f5837b6188de0c779fa01430b219470a20da019688802ba8440c60d8727394114db10343fbab0993ac5d967b658b1551a6570f7d9b283445cc278298b4740884ba72b338c45249ab74c84a1435a84c42533a0bfbdd0509d7a3bd0b0635f538ce72645650931dbbc6e2850cd2585214f5cc12f2a2d9c2820d6c0550be79d5276747e2c04bf976705227c842b872e294aff495e06502819c6c92de3622ea968b07c0646dc0301c009fcd5bf7f19a357693e032cc46b4777a1714d41a59bf07721a2490be2e3cc7e4a04fe48a8db361a5cc1390d921325875f80629c2abc4d468a40d9c22911b9bdfc6ba986b9bb7226227dc63d75351fa4613de3654475c5668d651f9f03a386179cad00100b35343f48b7e36a79dbf979cdc734d5855b90128fee10c9bf40acfb67332cc8c9ecc4a3a9a98bd30c708e7a630a0909dc8ba2b1721e42250b83623a1289960e7288758525d4088525ec25511bca906930602b5ee1d127c23205e681c9db3474aa774733100838b2461e45cbd603c3a74122b679cdb9992063e089d5acbf74b03469a3ce7993c6b978313a7a735e75bb94976b3539b4298cc47af58425c24310667b1315baa5937741e35309f1c70cb8c60e06ae1793502a316a276b2e21087305f453d8e99d08730e174159db09324e4cbaa067cb1e766e455a34159465bf1138a285cc386502d698538ac63de2f496b120be468a952b02c5dcfac5a997023b5b3d98691572103e158672eaa0a4e4f44fb6920ffd874f52748a630aa41d188ece499aab324e916079b3bc2427b35896b26b0d2564b2a875881a074706713d326306fc66efaa1b8d4cadc7c85b7ac211c4f61f68a124465397385b2ac7a09686935cde06638f156e6e4670f963ca82950d3207889446be69e2a0d7cabfb16141868a6187b5be7977c354fb27a8c9cb8197565480244bf296692a02701580a2b4ac4772b13a27c869123ac3b6cb6699698c11261f657ffb6c8d78102e0c60c004c0796f319330435a29abaf33dbbb1c566aea10349981409ac31c18aa48631a1f0657116821a2a36c2403870a3787a1e3f36349b3373ae729a859af3163c078c38ef38c464ac5ba1fa8150d9093f97c17106c99c632bc42a5ca0595508bfa7485b23bde8d12ad7bfc9c10c68374b70a4a46655b5a67d10697d2f9e047e603b8845c9ecb168576f9d8bc7f3c831b6ec15c5fa4f744315d3afdb8a246a56ee71465591831c371f2eb87467b0559dedd776ba063ee6d2f93 +ciphertext: ecddf4bca1ddd56813da6d33fbdec858e5623a15168dfc3e93d9114285eb4a7c75ed6c01bf62a6a1e9095e840348e68905092f8e9907a4d07f6d49c99ade01b5e5583cd93eb64695f695e99c9f646f335e37db423ac1c5376393195b6581ee7ef8db5a28f7e9dec1e0409aef29065c3b3f486753ad9cbd5491508055aff32616b3c1a3da59067c629eeb7029bb5978902886fef7d8cd0bab7474e4b6e0fc844ec6aacddbb8969810cac38a3b40d6b0927a033724ba6f77c59a173057042eeac0a9b1d4b89b04317d68feb1208607f8b5100cca617f96ab20845e1ad6b1be99ace6dfabccace157398b9e9a036a70b1fa755c2250446766baafd4d2b3daf13ad2ba8b727146ff87c463b06170bd7bf715b3f5892ca1a80a602103eec384da50f3fa5c8498be1029fc722598677bbab562ab9dab1eba0d6af783de2750568d7c4021ec95ae18413ddf4e9bbb13122e62581e66469259d79576e601a772c009714c28e3117ff2e9a24c321b1d892e5b3d42084f63c38a6d41f41032b405bfefeb9ee955055cf89bcc545ffcbf3bb3050f886637054ecb4d83e3aeb5c2a11b946386efabe4a7dc7dab6eb3d6944e8de6060894c7a81d515284d9a0c1a5bdb4d6e4d20e66e150635060cf7b3c5917dad5bb78a88ce639b012070e3614389f9e89f70cf2064bf375bd8dbb4744717e771cac29555f6300ea2077c882c933d366059dd55301ed24cabe484b23c28e5e4578baebcbd1c6595b80ba173a00e760cdbae70a0fc9b77974843c30292864fd68611382f4ff5adffa6c0585e45fadcae5bf870fc0fc7cb8a8a0e2c6f28d7b2f18a3b5f95e3ff82b002ca8075e3f9341082acb928b8a4116c2582147163d64ed111114b5c8abbf05b969dc74798479d345fa61bac4b625175e11167ad039205b70fd42426d0ded200cdef40b0aa37546f66c77d23de1d3f12da7030af08c8ecffa7617346de3bb3cfa66c5c9fe49da420bdfd80e541081d26ce873914afaa2180a683f738aff3f55930601df67dc7ee4ac20a60eeedadf36dab2115597f09235cc49d94db30b7f8550a223cdd0bc1fcfc78092fc52ab0d7651dce159dd5cb75ab3a7a79738f3e8572eba724e17fea9f70e7360fb279369015c26dd7838f117dcaaaf6b5a40bad8a04ca0c81e7578be8dd6378b6b594a64802c4bc0b2c36a62de594d2bf4ae5af1ea409c0ddf281fd250be74a173256f27830ca1dbb4d4914c7c2a179101c31838d4d2b131d6555130a5eacdbd4e64b8275a60e40ae253e44251d334b97a24f744f8b97400a90010f5232cd5b82181ec4b6b7bcedbe7b4a458ce772b508a435cbee00b784347fbac95a6493085fa21813dd7b953f04ad694936145f859a49c246d4d9c48cb94fa77bc9464c773a98df2e3e580ee6e81403bba5975bbfca547ee9afa1a48239498209d1d9544764cef4a9eece76078a72c4fa81c3ff788159ca33c733d6d06947580afa9bbfd3905cc2abf5430451b7a54e4d252bfcc449c406003966209594a2ff623978ba1ceee +result: fail +shared_secret: + +# Private key not reduced +private_key: 1023c06093d1ab03cae768b68fb495c496b583c7f007fdaaa985800effb6ba238cf37748e0bf31fff957ab744cd8c5710c4de3414f6d675d7f49af3df19878d9dbdde0cd6e1674c03124cdc5cec70acb645ea55b234d3190e8e3f287a5c245b4e7b3ed11988d218988faebc1953667613d3ff99433cf07b68fb4bf6b8a507fadfb0a07bd2f048f0393bb9f5b40ca588208faa73789a0107ca9c5eef239caca126ddf3de39996eee911b9386e8bb22cd9d8ea9d6bbb247c97adbf6fce4bb0e33113aa4ced8531bedafd425d66ccdf99a9dc920a935b1bb599c1ce4a6a5f53fbbc8ad7344122e8948f6be0e56e38b28740348aa888fadc18d53b885f32c34bb0d54e973535d5231bbf5dd356b8955856a4c3bb56e5dbbda07734d65f4ab0ace46fc684a3dbbc9ac0e776e6e6f8af9af7958f9567a95d2bcd699e3a87a56d86781965df13f58639dd2edc5c57a7332a286bcf39b8af28e4248848641f3d1155d31bdd69e0a56f931fc76378871848b121489773b6f3c6ace39a33363cdd32a40b4fa15637c029e6c23f754bea33587e810303418f75a35d69ef212a603ddbff3fe9ce261acc082b4e38477ca9348dbf6bb9821f8be74ce89147b21949666cca3db8e433fe66ca442d6356884431266b9d1a92b1899217aa636d3c7d80ceea2e9ca61abb586e2dac1e56e98db6e8cd7ebd52c9f2de064ff63eea2b53c5202d6e0265d5d3273f3f78fe1a873cf41433b786d8739b55d457364c04315dd8b3056d4c2fb5f7340bf6ba6c69f913d008b3e0ea76b45038e168b3f01b9892e5b7926cf53c3e3a591979874248a361c5c1f70ed0580351ce5ea7849fbc4134c708dc822ac8b9c13fa80875b30eb69f9a636b2bbe3c6a35ccf4e7d4cf4daed80cfb3f47b50599b024f73445ad9df19f775f5a77124ff5b87cc295e336eb8668ca6b3dc1d7b5b00da7583dc8c3a45f05f9a22c76e43965466f5b7cca564b6afa4a3cada57dd5b7035651736de0ac088727c5b7b5c9ef173589e7b9446307dcfa8e3c28c4d5ee53c10e1943cc6ece675f7d7c15f9cc67b181ec6b4077ab764aa9465d52495c9daefd33cf5dc51a3893aa35df6e47711e96aecc69a13ab6db1e837c1ad98b5bdf931b9d84c6c364b4a33de2bdfd01e9e55c5f7f036b35d5ec3d13b5bf49e8be9c0f34f4a4d0fc6efe22b7d5e0c6f12908b7807e5b3813bbbe29539cb63f78075f0f3cc6092eb4d24b5675ef9af16647ff9e7452b85a1c887286a89afd3e955fe8afa67aac2ac3d295d8564ea94c730f68ed866ad36c8bd634b2b6e6977fae781a69fe532b3f292b8fccced235246f8d4fdd6daab3a70cf7b73f51dd98a1266de66c5e3a8d66435789bd979436dcdf63b19ce5660693e6eb99268a3d80ea6c9a5f34d8ed8b781fb295543b0b3b9856d7fcd2268f7f66a0c67c96a3aebddfbf6a4ccbaf9d7499a7a48a65a8fc8059851b79c735897109479108acc7e668bb16c8a530a7bf4f473842ee7c191cbbf867b36059505446cb31cf6ff5a7dfd21a4043854d96d9575faf5416cf63029afa4f35c8251deebb5d62e33d98fc45563a9f41b8e48934ef8c67068d34155508ef3ccf4877bd27df392d3fea3b9e2a2896034dea00e7a56e91a766c72c04ab283d25787224a588eb4fe0c6b54d889d127a471a72c65f06375d1a545ad9b058a654324b5615138b2ec4a375989b3f1b60fd30bddaa2307205a103b29be6cb75f3567705a0c05eb845d493caf795554ab25fd03b379a6284988763698b1bbb4b3c1a54b9c2038e9ef30a3870a11604288b32336e15939fd181525909949c6cdf7737cdb382b1dccc0c49317213683b349f8da22db0b45e359b2f8e70916a0c0142fb264cb6bceb80afa3a36912d635d7b4cbf33a4a36e4c6714c551d70a18b967539b7a604c5182ee7673ce91d07736f5b97b407879e77050bcc089a14332138d92ab3e09b497b834df573dea32829b471bd5a73e61361ec699ee60320ccdc0e6fc983d3238a8d5abc3412bf48d67dd2e1b0c2692a4e705de666aaaafa9eca476a1b155d52459b563b6ef1549c51f83bee2963a93729d4746a01a21dc667b120d38d79a45a112067205c3edd378c7f65c940719f79389436a5595010678e1558ce163ad95593a751c737d4936ed9c7cfd41effb1abedc07564fa5238ea2d2908793e2a9a33e08b67ac3133402d42344f6d1c804536263661a557739cd8c29682549fff416c069a39cd48229e47066e02612988bf780256e25009ec5b1ef829bd39bc0654a0c8c3c113cf421f06965713849a83cac9f6415482d82074fbcba804b4c5f2b1fbd941c7ec8c4c691dee981392bb0736d43adb3ca548829a55bb9537396d7bb11922a9167ef01cb1aacdaf17902f671a6cf5487bb643e0a1cdfa3522860326d374ba8009833bb08eb09a2b3cab0d3193a6561c17d60b1cacb24cd3c26c455c040cf9ab0a7292bbdcab2d5b783d65bee7a666ebaa2764e98b7df61bd5ba546bd307ad7469e4ea85b6031224d9b1315720ccf95273c35767c43a3b27a31773c5b35c7e4aa0316c53cdb2fb1a60ab77c4a76f2af78bc2d6479b909eeb9c26ff97a47c468dbe7c439d232a914766fcf8772e7ba92b3182e362735c237bcffc3e940cbc5e6042df923eaec04d96e31cc3187f66735ff1e62fb5460895b22145787484e529a1d654a2d72cb9d81b4d283bb15682e8f9bf1037cc95e29cc3716fd89810e1bb95da871a2562645e0c60a27cb508c2885c19befc686db2e7a78aa66b934aa0d42c856cd361ee93294759549929b59adc1ebec3686e70c4a15c8d56dc23ad080945d4734b76b0a64b73de7b5d810ab8daf48542a4c13b8a14aef05c788448acaa51263cb31be69a91888ac66075c0e59ead1b29d6439e94253d20f965d9f0aca53a28b4903bd40a1310f0123ad221a45961527589e7048faa407028601e397a96b39728bf55437d335f1e14063d3902e923863bc90572891117516fba340263d6a0aaa0743e959da8f21ef9fb38431b36b1328a15696e97aa78ea97936f8b38bb1556d2625f5ac31e1b8cb3baeb1be7f808b6329a440045eea532624354dfb71dc321109d0058f24ba4729c375ccc0440948fd345561715654f60b378b477a208cb83f3afed2534c5ab6efc0a5761d46b6cc0a6ada55d1c92c7558bad4091772f65bedaf335ba37af34582e0bfbbc6609bdd3568001734520f45d9f4772d1d21d5080b9a7a2b2e72a0b6e030f1418beb28a229c8f63411446b83fde11b3d946c9bdabba08d495aee50911cc66291fd0d49e426ae85eaa6c911c4dca80caba6e28e5f645a54d8c016de51a2b98241a29230e05b7114ff0395cc6634db1eae8258072d09c09f291e92d6620b177dc50d7 +ciphertext: 2b93edc1c5e164af29c51f768f38811685e3c326a9d98ae6628eabf5bda5c6920c7fdb738643230ef509286db3cad01e0f817cb64cba6e8a89793212057a33c5ac88b19d148a11124b0f6a6c0a4b86f25096a8cedd3f5ca81e1851ce1df2b43525ab9a0a95e8cfc725c891583089904aae1561cb9ac21806662222543d7f827cf4b6b3ed7b45bb0c5a0c1f64d73c9cf4b833a59617c2ed3580581b886fadc3bf00a6625a1afb067579db0b984b16fb645e222ea52dcd8aeb0538a14927c32ddd1c845ac95802bf48e49ade7122567923de1d73e46867f9c9dafb8ce4ae5d6a0013d82e53674227b79263abdecc6b0e0fb7fc0a2660fedd5d4e2febee35300ad0e9cf0c7e7f1ceb18ccf38a682634fd6433bc141dc354b8e3279ff1547de9853d280c9ca7bf88f34b720633aae88272ec03e7622ce0ee3c2e2c66313fd286fae22b1da9b967d926d0ba0f63a3d02814d2ad22eb462243d574e6411904ae35c859366b7e09838e12676b1bd89743c990050ae185287f4f89c1ebac8f477c23022134b343868a9db57bacd273f873ff0e96c93f026126b97b6bfb9c1d1a21b10f1cf0694159b3b01f802193d5046bfdb224f4ee0bd520151fac75338ddfb669d5d3394e0b9776a158ece27de77187cb0baf7b2c1b29a0013071078c823d1c0faa784a4d5c8d6ca224c5fee58c13e983e3369e1832e72b43e4492c21b33477324595a29da0c3cbe2c2c02652b22ab1de0803042b08254a1f3dfa5a73cc6197e3e4fadeed10f3dc5d9a4c2378fd22aef84cc98dff20ca24118d9e3a54a0c23f96bc70b102593c2ec8fa781d6622395613fc57b06c175e7cb4823eb0e692a013a493fb83355a9404af9147b2ddd81f75e673599a5dff78b9e383d656f2f27d2e9849a70e44ed84da5f3d05bdf4d929ba24fd574fa21b479b88227b82888341209d9698a700a82b2cccda24c38ff12e32d8182dc9771842da3fe51a191e1c28002eda9a7a13a0f84988b356da88e270434dc8f36359ff179066393af3b90e06220e9eede70e27b13271edae76bbb1cfd9b2a69b931d9a640dba314f8a4907c61745ce418f816a84252917cd4f4ada572b89ddfd065c3bc7604f53776347835d237c53a5c1c26a18dd37c9cf382d836f32b9fe1709c1800aae66d4527a1f1247382d54dd69d0b365f56de2cc38cb302b001e7cfb0a8b7896b38c1cef72ace55717f465e2229d806311904fc47200708c209c6f1c2a1977a845a5e83385b47aa5ac695247a4ea9aa1b3b3c7e4a096c07ce6341ca9fa0c8ce26e8765f35c04d4c7ae8c814e3910f62e50f728bd4b1ce593dc651a455e0b055554f12d652fad10ae94c1a748d3f5067b02d81347bb4d80793d07b5e71ff36c3dd11455c054a23431a830ac8022b8fdd7c273ffe4fda640c89ee7e1aea9d11eedde7b7258ac5bba74fb864663c44f22d92b28c5fcaacb8a0213d71b7f86d8de1db6a5dfefa338a61166d9f9841794b3fba4a50a5d1bdb95058b2d31aee1f987f8840b829e65f382ccfce8c298 +result: fail +shared_secret: + +# Private key not reduced +private_key: d87d60c90cd8dd7f87876347ee07d3738af5a9be92146a5bfdb637f936b280098224a38ce74ee1175e8028dcd05089bcce93c7c4f65451b893eb1872d557d342d3627fade1012fb78daf3d5eb97ffdaae6be398271444d6b17c4c5cbc680fb9f65c844c86c40b39ea3cc5a85096b3f150ac9cf1540d2af9ab0e3d874db91d17894d234c6bb376b3693f73d198c73cac396d942c7dcfc64be9205ce579217eea41383dc864d2619bddeeee432ddb7299aa7215e6fcada90aad7e48fea3d64ae4e96edefb52cd3d74bb49aabbf70ab50f02f579544d087adb95a9cb15349501f5cd59b26abf28e61152cf1bc03de326cef1d348b58b3bb0da69da25ce8d6c75df0f6b0e644e4ae9739e9eaceea5bd0f0d337762fee7884ff9c6ab1aef5aa84be4d8be365270583c0d9d8487f4e39978096cf97799774ae05cbd4794882349c68f5a2a3ff3877e395c6ee4286c9774bae597043e2ef63af40bf978f2fa5c2dde52c4e39429783ea5bc90016701f1868c2cac0acf4649886b773e5c29dfb7bc24f615fa3f16d2c3ec9eb90e87f359614c57ca97c75b593cfeef3f6a8bf76854d856c65d5069ba084c7602df90e1d4f5c9ac4993dd190c7ff004897a8d83b0dc3f74148443f2be41096e5a30ad3668bb9bb0ed965033520fe301e75d85f65cba909bcc42b32fd5578522baea905e6e49bd40a259fae266127bb6a8e33896515e943c63ea536b5db2c3b6c8998d4287922d5657ebef69f8d7193abf8af0eeab0eb66a87378074e62b125ee852cb0109f7d6dec61bded631a93c1b51379546453c646f6f2a792d20c36aff9a3182c6e7b5833db4e6f2987fb712e6732c376a4f591776e7c8868e6bbf7fc39bef30f484f1fe4671fece225eebdd8d795c3ed91779f517c4441cd4cc3bce7e7663efb2e4986c98eb2b0e8a0405ba2f7676a41f4aa163dd3cc185be7dcf2c904d3b878bf9d44cd32daf1d09fa720e35f820d7345d3bf40c8f1f48b4b2d693eeed8cd292b636e7360f89f377216f5e966b9a5d99a7a55fd2bd7d66163a00647aacb7fd44938ac6b6598e9fbd03175c2a29c46228c7b6464815eaaf71a79de7726d1e35fb25104e2e6ea91f2f55ea025da7a64d5f536849a08df094dc322c5b33957d197be6cbf2448504d7dc858e9384ed9a9676298daf73e8fbbe5ef4947ed617e33897f27dbacf4b7a42ff45ffb780f4c51011d9f8c4b629bded42cb7a946293f740a358aed69987aaac2d996f5c9886e8ef5cb87fa6d9376196ed76a4ee80d87ae808a908d3c3c1203ba85739c6095b4fbec78066ba9da4433dc59f8f4d73e041d8fd8f531cd6ac47c088a6466fe607c7bde38676a2fd6baacd5853f466eb54a9414c3a41f7208b5e2ab5973b6eee8c51468fb7dbef827649be94d0d97acf60b693d73b062249806275a5d475afbd943e96a512f45ce54343bb6f353aabe54105fdcf50decb47eea0a9f5e440f37712a8c2c9ebeaf86f3cedc6988a9def90d6bc0da49c57b5eb718409c9ad6f81ba50119dea685e9c36e574c1e8ebcee765a145309677ae4fc9ed499934e24500056372a35f7204dbef59df18d978d6457aac1f9761bb6367939649034f559bfb6c627d50fe9d2523a8c2450c193211551409a9ff92089c54b048b6a80127c7742ba34333bec498e28d729d6085fc7f5b6e5c4212a0aca0772af8f83200d422b49a80dfa17cf56d8277b792d7b4675dba3a7502674f595a45fe93008acad026410de336fa41ac0c725bf601280bf7b4d7dfb63789175b7748dc54846f3a8b28d055c69e2424704bd84f61c896a40447bcd42b96834c8429ca79dc4a4be300c7dee38a253e35819a43d833046f6437622094d003a3b9914bc6946bb4f4cba41246ca027cf2e599a54a23e8cca88086a6bf8aa92305185a8b232a0f45903224ba2d3276715640451bf49c350fbe5b2d95a5f55223a1a794bde26012bb48ccb4384b3027855331e96ba09c7e757bc71ae9ab2a1adf51ff01bbfd4c77a40dc3e24da767d8b456979913ae97fa9446413084a45fb7827a082eca1094a9437154b2c8edb48d7bb893ae3213b5a95f86bc9e146657ae653f1c9bf54f87830aa968b96b747b9aed4007ab4030ed652652daa9612d00f36bc2dd1299c8f2c84fb56045ab45279735aa1f57ecc470d7e66696a8b7a65bccf23b63ea1d595363466a4d24540e21bde05733154180d1a80652b166cc05af5a7cdb2158471d52fa5006a8ea25c98167f4574a8a47a00b7c031e667a7daf41b32c714ae1855ea9bbd0a1aa18bf64071c44f3783b30ce8301f20cbdc5c194d6131712386bb135af9b55c680790b5147f55a6cdb94075d0f0c289f42aa638623c16be446289d099777717b89922476d8c5511997419d8b5a44ac8c4a9589c5b39c03b045ac31a6e9967fa22c21f5bae213065867945ec746f776b0daaa96d85b61864fa94e76474beec06815b556faa81ace15c552558c0575c44e26cc4f919d3e26fe1374d2afcbb3de23a9be5b366c1a174d8b78ca462705ba70b358d57a751180c781b28075435b2528104ac0bbfe5912f8fda282f93b7e3292a64b83494563741789c98eb7e84d69c7cc2cb1703ab94aa71d7491c69b52949818245acc6ef07c11fcb68c336738fd762269b7ac562aa7401965f2c5b2909404b32cbc86671043ac334e283ab194bdaabc390b0b2e275bdf0cc2651d11207a53db1a2166b7526633cb779d88da83357b51c962f567d03917f0f2b5c3c3b9ba75699efb4a8a5736d98a56b1510cd6f233c2c05909a3ba6203c11ed72a0091785acd729dd609704e51dafd4342275564615b258691b59266a0ee3a8b261c6e9e9894b681806e97fbe3b25b4b133d804a0286a909752220c11c8644417f34597db43ac66159956a11541cb4348c23196095be01023e7b267c1e51fb0c11d9b787a519b3ca3f0ae08c79ed3f256a63b488e38040195983da72f9cfc03a9c5a7c428898291a9bff3cea8089a343b73e616c5e02227553511722b04a1604d5ac718ed753e8adc001fa47665b76f944c10dce0635e9c98dd91b9e6790da2b09ce323ab41cc7c29839784e6ba907979ce815f982585297b5170dc7afeb94524563510257d99131981128c7953ad87ca696d58250aab373ffa3476aac3f650bcf58aa6bbe85168b7c4012b3359a2b6bed702524b8498d3aaa04c7915211e1e013e1961b0e2e32b90e01e0b372446931a0fe6255b412581e2b5c0d60d3b7208a63449b4216546209bab2ad3767f9793d0be98cd2899da27f7d980122d0bdf593022e2903d69da169d8f3f65eec290acf30078fe51bcbd1aeaf412dfe2d31c7b10157c1100ced48add211a5c937b8d6079d8e271af3f949edc61f70e60453aef20dea9 +ciphertext: 6c3904a9d9575ad0a33c89bd440e63070bf0433261fc2b3beb68c1e244e489d6ff2605e48e89cea781bfac81251854e85613a0045b4da0b9535073384a36ca0ebf9ab4f3f5bcfc7682dfcd877ddfb07e5e108ae24faedaf75320fcad7edbda2a5ac5e7ca2882312699421b180b61e8f67bae67d03a241439cf6ce69a03b82d7c1d9c3e2e13fa4a83fa8151f790c2244d1952910c946dfcbc38da37a0d5970c23229860a144d374439e66113af1cee797dd7966da0cc64dc4c6586bd5d44da9513ebdfe3413199e89f359cc17cadaf503587b80313dac670791908e2f9e32bf8271cdafecf912b87ac0eb16987e4afeed57f3a83cfb62510b40fb8a0e1ba08e44f65c27e647b3f7b50e8142fc2d9a6cece5178c0bbccb8546cb31e7e5bfad1851dd63f4cc83758873c3a06dd420ae4c7bf28d21bbd811ce87bdecd9dd79d092b5aa35459dbab31c113c82790fb97633d0316fa9b6731cd03a888b32d42c460e7890c5d3873a9885f6dac651f22fba27c25060c70a1d41618c352747a4a5db855aadfaf8bb0ad62067e03ee027bb5ccf994ac6b95d3fe0d994083258ef220f0eb044019070bb9de46b39c31a6af5b63d4df8230deeed491838fef7f5f257ef95af41b1a96c44eebde9ee33a526db893f6c7fd9d85bcc562b3bff3cc293669fef93e0341bbb828153ba59404b1616ecd79b3fa048956873381f7cf298925d8272cf593afabea7de258c51fc2b5e7c0d9aef98e9de1441c07b460f320ed845f4e6efa1892e23a429cd37c71b80a4e79c92ea476af0eb3267ef787c77d5cc236e9ab87352c30deaa1e612a86a801e9e0db33f9b735561ee5e1e124773f989a83a199dcd99b342087df9e7c63fe7fd9fa6a8335ab7e2432d1cd7e53c940e293f49dce9bc005a58ac2ccf8c993641231a318e7778c8e3bbffad24312df5b6f8ec61a65607d3a417cb48daa55d76a805bffb102dab2178bfe2b8e720cf9aedb2bb4f17086f860a866164771b77b77f8d35da63d3c06d4355555284255fec035cbf45270ee83730dc69faeda7a190c45077265b1d2138891092b4d1903512cea9cea5f9cb081092f438fe80ce6b739a2b79349cbd023664d967c952ab2c6fb61e8c2981b4ea1653ca36d40674cadb7b14e37bce21a145cba822c81f93b22ab3c798baa4a3928d9d5327fcede7362e9d4cc0eb58496c27bf4b245e766bd097e9b839812b1bbc1c5dfc46044bc59aebfffd4afdcb7b28d1bfb9ce5a5c11d4d92d720bdfd0be1d5dc115a07d48f6c3fbb3428438ba14e9700246ebff56d6fa77213a06a550d69f38870af60fcae077ba78485fb59c054d3216d5cbb070c9ad6a800ef76b05fa5213a744501e366d8176787c7846dc6dac77e915d2432a6b08d1a8fb1c8f7f35a56f28aec6b2273488abb17a2386735b06fea6feb589bc25a96231d1017052dab972368c93a857e0b04a9ec9c840827c8f320a9e2eefe96e91c70f658ae1483fa651242d965fd9e67ef26e2c570f89efa24c624bdefc51f881b8bdf37a6aa99b +result: fail +shared_secret: + +# Private key not reduced +private_key: d98cab94a33c2a73ed4bb8a0e314b78e68824f8bf156d3c481d3ff35d8fcdc6bff104ec2ae74f95c246661ecd0532d9ca274b3aae8f21ac955b003d444f775b759adb113ebc5fc34e6eab6a9bedf7c576e849bfc78b3eaa0f951ed8b917287e53d4842317474693c5643ea6a9d49a8e5a9baf7d6ef967c8679647e8c25ce3ff5a766f34b5e58edbf93550bd36595d5ec51dcec50ecf78da95325f48321aee9942a604d47f4329af8f18a6559ebc23a2ccc7d647ecfd866b18bff2f63b31e1886c319f11f7f38d3cf510578f62a58f91a9a7a1d5c38ab6ec0acfbc20e8c347c59c6cac9bc402788da55baf1a7c3c0093e4707699976bdca93646607322368addda4f0df66907a4ffedfd59bf09397c5ef39216fb456df504448fe276ed1981d6f681663a36e6d7ec46efd75646a5f875b07d9b3bfdb9b7a688f256b079ae40f27de3187b4ffccfd742756c1bceb08af9916f8347c6643131ac72c9cd840ca7f6c866f20e3fdc53a448f193b4c8e583db6e837873b4239b9e79d486c34d315c387b6e5763dbff6d87ad28cbad7f4c9963af99850f694023ddf69c74a0024a4d9a7a54bb978e24cdf13474e978740422c606e7c55778dfc261fd416df63d9ea362f9556d75ef9ee28fd22b76a8ae4892bfaa97b68709b09d638aed2a435500835871d29fb48d64b5c3ea5647c3634489cc2f33c6cb4d0381e52d8148c0ea4acb95b96f4ef919cdcf51e6bc458ac63557d437165c2bd4a9efcf8e471d652deb6aa06359123b532a4c7c1a0bbdabcde93042c4a2e8fb69df83045bb933eb43d1199a818f85ca0239ebefbb9294657dbe33dea89a844eb54f624c3984ff01db37ac46838bdae7e0aa3b01448412bcb8ec99bf6fd78cee583948a37bf2ce996ee95ffe2dea7450fda8ca5b07214d9fa69fdde17432e4f4ba40a5362596393a3fc8cb7d22435a763a367afc4e819fefb88548392f9973619b4153dcc48339a241cab26c68856bd7ca4163169497e3193eaaa57c3ebf384f49f6b28374fc4dbfae47e73dbed34ed6ec48f8d4ac0a347d82ec670357a7e88e98d3b3eac0fc169df6e3ffd4d1468bd7ba4be010e3266fb8fe3bb98a138b63a55e67494c17b89c6a6e939d75584e755bbe8048fa2443c58fd7f1f178965047e2a59c6815a5b92b6691c9c9dcc6f50bb73725586b57d8f39eccccc2fe4e828aad40677ed68e79e4118304637c9468b73138d5599a6dc19b8f4582b5182dca37dbc63d5d33559a79beb56c60108c5655789bfeec42b75b73b9b33624db202c6eea333f4134b8dbd064bd3293650c5b8e8f8779318de509cc7bebbdeac8679ca5a723c0ce29ccea18e7631911aff517defa39dd84b98aa81c38908fda685b3acdd73da363fada83648bf858085dd87c61beac73c76ff4477dacde375a7cea62f80b404564dd69c46e3a21267f9463ca7fe7f4c35738094f6f7e6fe610aaad0f07f94f4549470b993d0447dfe34b8ac264c548adb7a134d19bcfbff85dcf2e4c8103f679375cdf19d6346d64a56ec7648c4b7a216e3c9b74302cefd41deac64f8318708820006d06e08881196da1cdb300187c694335170f6539df45834b93edfe4f75e939fa508f9b6e471a6ed9b352071c0a607e459c907fa29619ccfdb5147f56c208e20b3dcb82fa2304e40c46aaeb47c5bfca8a9079ecab4471d4bcf914c8ba459433ccb950772038f6892062535603b536da65dfd5c33430069a7f33a08092bd9c9617df3a5778b1d15a8a91c8b99bf5b0d4596a3f8a79d3b6994e823c20f102cb2353273471e2675633d9ab2c7668f02e7a68b2534489b169eaa92a8d78e4e182647f71758fc7f49a17fb400c1de30cc76664bd10b7c55885af696478feb919f3c24fdcc98991177b52ca647070cef77ab47c891b06575e5a0814311a75bbc9837a1c564246c163017696294533999b6700a1402552063a621205bc28823e539ad1c1795e0a23b6b47737ae839617548a514631319a78d99350eb77dfba97f7208d04ea980546a9e6642395c5177bb7b433dd47351b85e569091eaa30ce450c1b786c0272b91f9763478ac5410bc1f78175edef0021e8c0b4f074bce255ac2238a5d67b84b08a12984696e1ac7ad1131cf64bc64c5b0a1ccc94e3bba85271975c63f8d314d9f1a2d17835f873846c6858f9f285428478b2efc10bd7b49ffa006a6537684b0093a633d9cf9bf6bf97017690b4ce511b1898971b2978b6a1371e8aa70d970f8600bdd0109c84521e663845805235dd5849b192c12b49b43f824d9a16dba939609e166a8b05e4811b970915dfb527d803672c7a418293937a0c508272a5186203be64b4b1b33578d48be3e23913e73a385a8ada0fcc4cebb1070ca3006ea16f7da6eebf8b9e6637dee942cbe43395c8a7806f2c23d1c146d6359d268303a1229e5d513c79b2095892d553038b6a3431948195bac491a879c4dec39cb1b97374a65d5f066f6c66045a25b9b5889999889db34b1f42b4151126dd7431389a8331b9c123aab61c2122285530566ea23bda21cdedac78ccaa9ca1566ea1817f4791da6754379f9b0f8acb217085fa380910ed3ce4a52cabbe52d75472a63c88ddfb423c1ba6c1deb6ed3172cbc7244fb71300721aa13037ede787ffd546e60890131d8add25551d72881be0c8647aa10eb5cbb5f73c891868d4641bf8a692bcf0a5867091f4313bc976c989d1c184aea07eed11e36c215008b56a55ab5062bb41f7c5895837093671fbf7c4ec63505d15ca7efa5c6e45a5f5a757a4fda02f9f13c7926ba7c990e6dfc8b20ca1a2a9490a33210c14accde09764153bc9d4a2a68b7a80d9a91d3d47789c2a79bb212bc92812f8660f23a833d78a3f056ac030bcad487431a6357b8a1c13b512deec79ceebc37c6099b720445390277dab65346ea323d33c76e30483d51b9d01b5fdd55bb7d116b2dcca951292f3065b1628b1dbb86bd0cf5ce6a66ba1ab3717829019ceaced283c6b748b26425588ddcc47bc89ceb267ac7c03172b960160a6317d44fc5287c5e462911a8c995bb92ea1c81fed5baadabb569f9cf7c1cac71926f3e4a1a7411295a623c41240ea4e9011660227a785d989ab00a2c3091b02bd65a5b244246ffb97e23213f57b86aa21669541a60ed7014f1831839e41539dc8634d0125d61100ea4438af59434a25a1ec0bc99aa0edeb19d67ebccdd22ce5ff925ae364af7868ad6308a602033e0221ab609560144abec5a4792b8894337c866ec1a5df4076739fed133a74636ec9d904e88876b678088d8c70f3c7008cff1967030a528e748b708b0fb783577f249c04ea5536d2da034fd0d15fbac7a3cc8aa3239d4c52ce4c95afdeff6efbfacac10d294edc0e7cf4535059bfdba +ciphertext: af90dd989f1b2b7c11ea1d07916c07ca7571df9e020e7c40790f8791152429d8dc6fceb7791d8ccd016bb0ac0565f06af72670ed2e427fdb6aa6e8aa4575f25c48f97874d83b65433672538bb32301eb88f4538f68df4bbef7d8602606de0aa790fb7ed079b5d796d954f3fea0feb43c19c7c38695c5702d0a780127ec35b3084fc8378622eb854e8abfed625381237df67b0e2bcd4d9b6f44509c1d7e79a9afe582ef4737f6949e0f95b104ef23a854dad50adef5a50e340774121fb00c1bbae7c546be459a19218dca18b3274a48782d738fe0fa6a8c306efdeecd55b45f2a9d1c0e128168a4f5457c9c0662e724a933a3a0a417ab9d94e331ac80c5854c2b498fb95fa3c30e0795eb753ccbe5fd25c2645b9c34bc38585acb9a8c14cdde16e51cedc704db37d7892266e7476201c1170d7297e193e8b2d5bf10b89feeeb912e40b16854b9e1c2f9975c664ada0c3856a1d530df42dc1238694c30b28aa835706bf351b366a2facb2683063279d8e6106a98de212fa5d94e2a0e25208f3d6b85f6174db9b02074c555797884bff70fc8edcf89f4a553d04be27af73bb2f9718222949cd1e86cf8b8bd15915873f7f9cdd69c7b6c608cdd7331633be5b5aee83e9047af566f8bbf4a020326f566b8e3bd99e31d92edb35962de24caf78ae895c1ec087c33a7b751f9430e39bcf6ba317915326c17432989c5c6c7f0f15e121c9f14b6559d51f4a5f273a9f99a044f5c599418cac21f0d9f0e76f1e474252e75874787fbec4edae7aa86ed10e550db44e46208001d30ba8910c59cff6649c78cb4ede7e2ad4fe410362fd92c535b52cf507c559416d85533686e3641fd7b9218ebbccdf1425cee412f7030538353a785cdd918fd7e2ea6b451a436a286b8d5b341d51b1a523ad0f614868772b56625268c2c16b951f814b8b5d74ec12bba0bc5490a95564f5bb0c144d469fd93555df3a39c1cb53eb8c5c4289651951471b97d0893cd33237c0d26f27f09bc67759cf464094161ac956cf488a69ccd0bc9a38f18592f00fbc6acea75895480001276df22ace110170e2c1705aacf956c6177bba26e599e1656363f9ffe6f8526186b9b2ff7a0b612faf427980b5baed097bdc2acb71edfa32267581a6314c1b05470fd7844596795188b2dedf4e4fff047ae81d0816e82c3e4489f06d57e7b698ec099425bd998b446757d9386951161df04cb5ecdbb0c70204e9fa048936ceb62cf99f19afd9f077ee10e85bf22645469944318cfff14652a233c792df239fbfc52f332f9bb275cfdd43a5659dfa721c91791cd1a91bf0e503ba9f68f880d3d2792e2ee22eb8f7e6f1b52e851891683f3eacc39ce485f0a700c60d25acca1859d14bfbacf41a75fefa35494ce542b2ad6f2c84c15525388edf87ea701ccae772bdb7477f709c822f2b6625f8b1b86ab093d0d07867c584f1c14ff7c7a8a7ca3d1e32af4d76993cc0cd8b740598f40794786b411e76ae8707dcca465b679fff10efb4dc6d0826dbb5adcfa3ff8c0a7d53765fe +result: fail +shared_secret: + +# Private key not reduced +private_key: 9483b4fd275acc8cb6617e3ba7a57bb54faa743537e9e4b3dd73c5d3239cb876cdadd5a1dcd364327a7f8cead92d684187abdfc7b64e822e6c9acb87a425da3fe7bab7058a6c6464fbb9ac71954e6564708304fbcebe582a4f6c53c55a7994d74dbbd1932db5f68df11dc6e4357ca0d3eafb649bfaf11cdcd70d8ac31ac8d995af6c44531e2ef5cc8eda6bc4a574fd4558a97eed59d71f748310a9c844c63b491997109ca07a6e3d97cf910b365eb343b3e405b749f33cb6a3502ed634c60e96d364352bad6f5a149cebecfe59d5b27d8f829243f157e98893494fde7bc51996562f23d81f2ba89ec4b416c4732946b4aa26c5e67dda8babe8278c51821ca36e153ab0a763dbd3976948d0a63aee378fc9f81e54aeb6772cb3368b6465400c7b4c3dde571390165cbf5655f072e38b797ba0475f38f9f8d653adba700951ffdd3fae6c91787c8b2c85fa02a4ae53ae6b4d2bd57a4ee7499d656b53984cfbf0b1c9dd70ced103c97f5dd7a0ee83cb2b34c85825766edb64e2135f897a6ac2be44ffe8f25a9887d546c0dafeb3d96ed03f9edfa2193c856c79453e5869349c93dc84626e34c4aded1f137358984341069546ead1865ae6ca54d25e78cb36744db7c3d45435f43526524f064f8b46c862a7660acc557e7e57502f7ea5d83ebf2c52db27fb4fb7a70bbaddf43a776b3f6cd2dc4367b89843a79205f34365f3b206798550c5624e34ef03c4ed56776c886366110bece2656fdc1c4e1ea84b0cdeb7c804bd53795db335531c896eb72558e78d5599ca66ac7a77e4d9a1002e349dcc76f78cae6c59b93b8e65799fe6a7b6e1e2233bb4346aa01b47e5b458ca7da0cac589f0cc8436bf5d75befd260edefc5e536b465f085cb170757f828ec7b7d3f1771d9a1a8bb3a59a4d545365970f67746349caaaa182136e17f4a32cbd40fe3d38dada40c8443694789654db794f185cb7054c6bd5df9a24ac2edb5f34eb6a5c5ed562cdb12f8d3b998bada9e346785cb2c9ef51989354540acbbbfc8517abb5081d55ce7ac647fde97b89390516b9e56bb175dfb28d3aadcd0a51bf098f3325642e9b753015af338a8d31add0c33e394abfb30314b924f5d50cbf78c2c4cd976fdfd90d9c8944569187a69a749b661d39ca5443c30b775588fd1d6af89c4baec1fdb0e8153f3986a96afee3ccbfeb42ad6f8184b586fa312606419375387fbd8980b86f97b3828124d0e92f60d3cb5c74fa5e58be5c06bafd8b35df92fadba32fbe524459a589a7ab46ac01a5564975cab77dd2c20745824c313e6e67ef2c5a0266419b39e401f6cd5b2497cc4cb7a7fb8c67a876164ecb281665f6eae84eadca520395cd59fc86a3ae8ab9eba4df4d534ffcefdb38be7a6cea26f09cbc69e796a2c44be582bde5c2e37dceed72cd5de2197f76e81b54c20c6f95b6e00093cbd9bcac7b75a904eaa9ed3e338203c40dff8425ea9c5403ac6cba4cb815ecc2c5ba3f69f100aa4189ef69631e846bb68c4e39cebf26464b19812c98c0472a76e0a44b273ec0130e546ac9982eb8334ad3da4cef5342d48666ca41cb63423b9baf290499c283f1b67d5e8b7d474b2ba392a34c18eea4aac49da90cab752bde605d984a5058d467b5ff439fb0c2916ab09bd306661b18626746c8f4db817e3c4dd2c71041929dd7c5918a760f50715c6528c2d2e7c9b97c51e9009281849cfe4410b616ce03455c73580fe16634fda087387023e427902180c5e8276b797abcc47028cac91bc751c9ec4a9c39d682cb38b38882103839947b920ed453a766c04df7ba58f9714c6c370b98172a71fb7d254285e609551f31444e90c2b1d595472825fb9cca49d55c237a67377808ebcc1bb4848a75527ec467a7f94b8c4f8b1a16f789f3ca15f4f332fd0160ff6c4985b08b9996bd08892d5a836d50566bddc6adc6ebc7d3c95068c08682d54e70666f5f62b238f69bf86a3a48421bcd8b762625c06f03cd8e013561abbb2f01b1c314a6a61500aa02b9a54682325340ba328761140781885febec3a4090a5989b914a494d07e9793b703ed4b45af78c42f3bcb46cb4c7fc5352802ba0eab35b9f66c34c39259ae52d1b75b910a82fbb464d37f6befcaa811abc6485f41d38c8a4d1592ec69b5ce90c7cd10c0082c0b72dfb2e5a16b4c7ab6e65f58fbeb6c442fbaa2b4345b3a3326bccca3b5104730520383178589c4b4c751796c31aa061346620ba90d30b340c541f7cad17f86e05c91e4c21162f618b52117ddb572e1b90c0e19235a82a3e51b59c3b280ce3fa739bb70e4af9233831269ff87f3114596f317f28dc11b8b53d578a8ca85b290d31abb115b76c0a8748124fdb822f989c241b801c8b982fc733921d45853cf63880107704baa331b725a416471032a9289673f3ecad22050d9c5c9e2706a341553d168bcbad1a41a3c554260112336430fa16ca8fb98cf5d92acafa8fb427c460a27aa08358b36c5ab849ca2725b72c939fe0601d1e2abcc4434bd0ac835751315856922ed53cdc7b49468caca339aedfeb25ec2b97d43ba409693fba524ae4ecaee5b84b567432270644d6aa618669734e10c8b05a0d697b81d6c83c9f844cdc8ac755403044b14c288131e8c0c21c2361b206597782313d40bad1d56dbe159735491f7b800d6b14ca69d92bf2130badd1858b2cc4a408c33ee56fdfd719abb2a431132e15b89d83498b6bb5aeb0d7404e94cceb2a29fc392a2e466469e53da9c371e0155a774a298d515d70ec5e31aa070be92c3d6290f285a6034a97e389277eb393c5100f066c588aa33e66028976493bf41481b2eba07a720937bc02b5324d63b9487a1789a6baca91512c1a3a0a70b348c1596cce7997ed395b971442ebb3b0e2dbbf5608012030a172b259ac705af9634ad585916cd63ee1248ca143a20001a20cca0496734c2c52a59bb40f76411578e2c60f2364e8763ec1e5641c80a9d6235d4ff9ca73f4c4d6db9bcf3383d7d9a025ac76db1ca49710aa281c222a4bb81b1027d80c38c8365a39988a029a93b5dcb2b0f410fd1b63a54297c65b7de3f3a948f10988b507955aaaa2d3c699dc83ef348e3781c8723b9bd1c6637b94b6cd416427592c71311a16d449d15c0fb2753b338586f7260cdf255ca65cbc8c54101731a45544312099a66405b01eab124f116cab0003bde314b25690520a9a2131154271c89b97539035652c03b462f2635db501f9ab6983017f22b3391a67397066c86032a31080d329647a7c4f5ab89a47393636ff0671a4b06948c9f87fb580358d467fd3b5ed4c3fb678a44d92486cf091333c7f035541614729496d5dd45ce580f0d2638f1481d7cab000e33fa07de8dc9627a85e76fabb4428a3376e66300cf12a0787 +ciphertext: 00bf7bb6ebb760cd2f5c0704bac084e363ca6410903449755e70c085b8ef1785bd14afe673a70a8118ce2bd4d6b0d1e2c68b1d8d6dba69c1cc712bb753926d073941739c518f02efedd4c68be46638c3a1a9d097cf6513160d2954bf3c13e7ee2bc0583aaf627cec3c9658a0ec689964f54f81809958f31dd8621ecd0fa45ac4cee1773e16686ed2e50d9d4212c708f03e640e2cbc0f7f676b29834a5016971a2ddc1ea2038ec0f91133000a20af29409db0dccfa94b579ad89bff46a18b0f4f530535e45dbce9634c6e67f5308629421ee1101ea706a88bbf835dcd288c8421ba1acf5fe2945c0c657ef35af8febd7a663f8e07fd2d8a6d9588f58014caeb6f67c008806bd8b565f21f087dedd15e7c13e1c99de129c0e9be3ea77cdf2b64ee5fe46d2d7b3d4bd6e3ae489341e9c49618f16a9f6e23bfa1f37b34cc5885d8d55d7b7f816a0aa70c7559dcb6eb035360fbd157b2293e7242da423c83b1a67f3ad00710f23a4ae09c4602490271b24993da7535953b625ef455082ea5f75c5d8ecc8f280e4f564e1464d9802c7a0b4a903d3231cebb2a73fabc6090a6b7e98cbd5628e57914a143515b52b08435bed5bd9b030071c8feca74bee9f7e1ca4708198976beb8bce6a8fd9b5eab0437dd84d7a7f1188f19b0bcfb5f537b107007de82f879bd710cb9732b4752980049c97e7e5642b24cd59bab8af8feb51c64041023edfb59189942befcb4a95a2cf4b2c0e5712f34bfcb4ad08543a3ab5f102938b8c831122b193d6e24b4e5e9d46a8a88902d0d3c180a10af7d51e85ca83632c9848d6d6bb6f903a03bfe77531046531a037a9ff02a0cc45bb4b83bbef67989344e41f7869448e10ea1ea1e603f7bead5cb0c3effd793cd07204fe750ce6bd492a9effc45a15287a226de0df26cf784c1fd399b80dd9976823c7f95d241718ab6e8a362149c54ed1ef6dd3d569077d11e37f6fa74b31bbd8568579fde066e534e2134ad700f0b8a0de295134b4daeba035c5aaecfd5c8892bf5f68faac8fea4055423d9b9752db9b232275b2c946cff74fa0b5d9001b4bb54d778bf9d5f1acafd12b83c2814ec4c77dfaed6849e074c870a5b0e31e6bcd7c1dfc81a2707daa2df47c89701063c72d07f92f81862cd607d3113dff9a2c8097fc980e61f86b9a46d084a47423ffef3e20ecf50aa6ba84091ca9e7ad8bccb04cd9bb23e3681fefb1e1166c539e73ae41be71740e3583b8d881906bacaec5c253181f970e2ae7f533d839a8eeca99b8af1c0fc2c92d86329783b7dc44d1d137c02c35165fae49996d3a910e9a73bb79f17cf3b6b64c376eeb62cb32ef914917e729bf4845f304412a6aab7fb69e3af795ed9b525aa148c073d6fe225d98549ff7931e69427d7bf7a0e4c1a4bbc1229eac126f859e9178a910af8d774c4d1e10d7bcd80544f6aa96ffeceddfd4d7381105b51c62c3f4fcdfdd14066d976a6280122a168b03265af549376ee6983c424b2e867d38c7b44b6af76cb5acb962e6b31d49e656031812768819d +result: fail +shared_secret: + +# Private key not reduced +private_key: fb2abf16f6cdb67475728d738286b5cccf5ee9fbe229f3781a8678cdddc5d52e9d4945f913bcc4a404503e7f82cd2e5ae337ae96d6dfefc6a77e5c600a7fd24e25328bdfe1d6d6c325746ec168777bb4489b04cd86a5f2d44a62d1bb81dea56e8ef8384ac64fae8edefde3f7410c6b7d184fbc639e2f6c72d64b44be3d3c06779be9cfb2cffbcb8abc582a2766efd9503745773dafc4f92769d0afb4e915fd07deadac5de37a34e9891bc9098898935650198ade3dba7f6ec54aa9c5f1624c48d265a667aa426abefbea0abfc0f7d5ff5ff621848a6a97f65f687de0669f56c63968569c1e8d7826ebaac40e735873e2f1ec53b0c5febeefaa82f32ffe69ffb90363cb4af81f49cf9e16b9ba4390072c5a796c4e4ac95ce3ee40710e4034a4a92f9cefe4733c645b5dbec38129b4d21d6ceafcadd5c1756e37f431d99e771428918285e9d2874c9e1f73968be76b4eef051f70cb3bc8d0779c3f4dbf835ed2374a55fe6bf599efdd8e4df49b59479946936fdc6b0e17a39d4684be9e447a2ede68c780f8468e3155be5adbd930fbbeaeaa79bd655593af8622dcd553b3e23f2a9fe15b78c8a5d1b0943731f7ed2bbd5fcf5ef9b73f4d66a9e114974dd7e79ddafa46889f86d8d5ba2865f6f8767aaf55e84e96de8e23ba7458aabffbd21ec68b19253a1a2d4c7fbc81cb9d4cee2afb7c38982c97a01e23302a2e681a9ed1e003dd1b4f9b3d243eeb8ee4de5849e60f49ac66bc24e482461895aadf8f4f28ee5b036e7299832a14bb02435d9e087f744d432a73fbdd84aada7a65750fbc91b3b0a1075e39d66742ee88568f6fef247b6e1496e3866f9b3ff6c5dfa199cd50af7d6f008dea4317b45afcda1e8afe359b695dc752315dc564c7e7e3ced05f67d2361f9d913ab2e5fa99cfeca4b436fd49fd486e6b3c47b6e9471e4c6925db068b92a8853c26a9c4c20e6e67cc90cef8cdef0f4785e58586caa9fa9db48546bec008956a1744dd9473f5ae50445b8c47aec4b27e712c1b94a9743fba6b389b8852176bdb1d093d8d8ce0fb079dbe65771b9ef0c1a3df769b8fdbec6f868df5c4c4477194fd8e4fade8dc3712d9a9266e67dca6c1cbfea9540ecb650eafac63a7d19e5059b6a7e46cd567c951a3096bf5cb44124d91d4973530dfbe702990608991feaa73036eee838c9a346ccc267caaa9d5f21e06dc317b6c3a18a07ddc737f7ff1d28667c70caa3ddf4533175aeb0a99bcf7cf60aab1053859060be267dcf6924aff3c49dfc3de50d386dd77b8954b7ed65814b6d134887b67dffa944f2e1f99b6e6bae557cdb14eb2b084792215cfbf3d302f39573e6456f486b8e0dffb95f96b78098ffd34312677e219244df0c4443f46473818c78f185dcd4765ecccaf4b77f76f697d221d8ebc16632be86fa58f78d477d21a25f0ae7bd668fc7471d9f62ec7e6ce3d7c99aec205a83be5279b0143806d3aa443cc7e1a255d2efe78e8ef98d938c97d06f70a278052b763e1bbc2f86be389b78abadb449ce848b0eb8a5b44b2e98eac3e6bc66a2cbb9c998a0f4af43a8e6809b97d066b87db2f6907d581da8e481fa8833d9aaa2eb6b5468f88872c5974d9cf06cb6da269471f5ecd2945b1d0a4700800708a0cbaa0e3347235004460c8f86188ae66af363ba5cee88b03a341f5255c329a7d119bcac87c46bd77a1b5966a3fb22a45d89c712909fa8c69967b1fa8878d89b8541b8a1ee6858932e0793c045deffa62250c0d0072a46328992ba7ac4fd72b48512c7448cedc902d9d69ca55626a09d1a700a92cfb1a6bd89291632c74af580e3b4aa932c8c6714337b1d72a3002c6b68b1fc981cd0686502189712f0c5327e1050ef71549aba312a59e9a342c9e76a96de6907cf235b6e3b5e36a9072ac95d856aa7014699ff48bcb7b298e5168cffa740e0a5bb1f65df9cabbd715096ce738bd39bad530a05eb58efa8b9e3dd426f1781a06179736570611c89a6f99b3c0aa5f4ab2737592082ff73dafd7671bcb60a87c5adf3445ca3381a279c6a4fb1724373827494e294ca5d83574e0877e4a31634abb106b81afd515402290318ca8a2511cb129aa52228ba4a64444b761c184a3a29b221e11cc1335e4b87c457710fa4fdee790614249fa060b0417cfaf9bc4fe88632a76766fc8c5ff424849cb91d4351ec621c2335a2d7813c01cc893c646986f7c2246b2bb05149ebda38f00acb65cb8bf53314561893eb0f1053b237915711b7577b18aa963315a3b024629689a52bdfc81e298c059380920aa5bc39759f2f56d2811c89c59acde3a5496f1a8cce9bf5266b363a40cc1b6c78fbaa4241340dd4563a5603413cb73ba1893bdbcb3ff93bb7f1132940998427769d19047bc051506b5b990074e8d1bbe2d988699b526726a91513988627c2301b44f206696353cab38f68ca111270ccc6cab887ac3b8bedacc12513ca349228b0d842bc193299ad1812b69c63c2b8233c20121d50793906c4014453e19a62da12c76f03667031f2bcb59a074cdd2417ba3789e7af38ac71335736890dac04f77e0b10529381e930c8c0031f88838efa47772a7b2541963b0c7b063472ccdf6228349cb5619c943067ad86019cd964c64767c838407eb32a4ed9c40581b63e0379d00adb275f6578f065894e8a47796489b994ab9471235455fe1f819f3cc2b378648ac625107805ec8946f1599a8329981a7775523f7c8ef7426d8a31d1d5cc98820186fc7b55076b14d2c7c1533cc3217354bb24661c162aa0895cdc4aaefa666686a0f12d1791adb7392b78d31d6bec44068c4f31cd60a768ac0b056c24864c03387715dc48bc86e1b51a649ce4945708951065f946e17c06f364590e4d16520fa2b47b230f1511fd02aae79bb8fa72791806b0d3e211de92455459066b410bfd4d437f0acbbfb02bfc5e93dc7904b649a6f9a7ab09e2679e13040c8e9754032cc3feb8c2bdc21d8f7aa56ea31370169ebcace98d54362ec24b6b6c63732b882984e58839a7f825b17871820ea9dd0dc8c5e7a15403888e80150cf5a12c5e26040708791d2074df71945d67f221b6d2bbc1b65d37559a7c248516cb4ccc19cc15f93ba6d6085bdd95568cab1069cf13138b83173ea7c58ebbea7516c6ae25bf5e07ddf29a0dcd64b455aa6e050c1d5663245318833cb95702bcab1a11fda773a73454e1055104f917b75d650dfe1c59e807314a096de713e35837ba4f2a5f3991f6ac18302647fe01a05c055ac9d19fe27027cad17633dc0f4693c1f79cf69756e79c9fae7c954a0caf2c6b326e9037042553968ff3007cdb135e368ecf440e4187e554af9d0ff272911ced339e2f8d320ac3cb0c52efdc753282f092bc39baf4a18783a48ea031a191865eb78 +ciphertext: 2b52c90e4ccad692e0389c6d3ff0fbf4fe09884cebab2d264766a85eb7119219267f4ec139c8c06b66b4c91f60fe6fcf20426c65fa14528637c68494fa9b30a08cdb8c85752584d824ea9be447f8756bf44d56d996d54654324450c5443d2b52abf3a69fcf0607a3b8ae4641ac07611b04a8281c29ef5cf94b25273e893386ab673c5fa490d9a36bdaa867ba7019893b79beaf3ffcfd47c3e93c87d517eaa6f0f2af0613427e4c72edf9b28bd3836e771fdcd21a7bb169c58f91e23f76f665b97549cf2dc8ba58ca617018277c704262c7652f91d8e7e3afcebc872f1f5b5b942b23124fd9066bd6b2451c6c0c353dda7e3a09853b88f98123c1a594f35a1fb6f319c010c1ebd76c95a32338e9a40312e0fcca84fcb0ba9e0043ff587d164da5c7d92386e7c6d3647b5168d8a7f9f8a13910043de109b2c9521a7746b67e3566e689576040c9970b04780e7c2b914e7e708a4b37311d5508a3ad15803555d33edc219e8a53f7bf992e8c023a29e42ecfa003312ae805960d2c40be7a781d48dd4f2e1522423bfd20f1c832fc98649652a650ca7ff33330894699cf891493c5064d7db9bd7927d81c543bc041f2dc503fabf2ba774bb743063001fbcb9767d72c5228bd44fc2ef048ac08d5b7f44d807e388ff686e73c14dca14df6c2296ca5ed2850889111db338f7393cef91bf8bf2275708a1fc0967968c9aea9f31b826f42c2feb9104006b336561adf7cb7920c2bd292f002332eb3ecb913e7019d46421a0f75969d12f8d518e7996f75a77baa002ea5e1007811f6ef47ef6ce9ebddc91622dd7d84e75a4b0d90d95a8b7b353c4c0dfc7a3bcea0971bd287905d1fae61fed39a1cad61ff0ac13f436182bbd2da83899c70e802e98a88a2d3e80e538a7370377e836d016fac084ab2378379329a346999aa6594a5271924aa72160dab6056707f29d6f1c5ed8c1208b83f4a0e4e7bea2c75d34d19d8a3e25b48238192395870d43c58309cf9ae5518584fc9f19fd2b6e94b307b7750192c41088d6e3fe9596dc34ddfec0495cacf6ca98f6a24b6ff8a7fb1de8f21ef6f04a6d23a3b7ddfc45ae77d3081d75a76eebc0450041168198e853c6d83f88a24e3fbd25e0c5631c34abe36360c3bca7a3dc522dfbd20692b4cfcefea9d3bb0c73aef359d3f58299140e815ea9bb17b676abd504973a827e792d80fb03823c9dfdc185f03165c3a0ed3819c8dd2877d33a206036c221ca0c4d0d2f935c88a33518ee5562bb1a0baa83dbf4cfb3f11561513fe479e9c9d9298e0bf36891f28773f4eed45a454af3a51fdb790f1d8e7723db1dda75ae7fc667a71310686d9350cf851d3e20faa35b2673a97997fa550faea6976256969975689360275d1e56689be0f127853ef4e45fb857bec018e87916b76393d04c6c732700eb11175205a30a31081f5a6446071bfb7740dbedfb55e5ed09450ad8e65941c85655423dfd60b387f3444afc5138f9e762351463d0d158d82394ed26de2fc4aee2a9bb9ab420ffee5896ccd44603a05 +result: fail +shared_secret: + +# Private key not reduced +private_key: 228f84084cc5e95bb4c8a7648d77bd10adb91235af9d447d8cfd62d42fbc4ddf5ef163f433193509d4839bbadf4fb63143e64bb1d35408eccc80da5cce7ef3354e82ad9734613ff1c02b6cec86feb74e6be03562497768d32e46dfd3b0438ea0542b4ce117dfeb56a0b31e65bb9eb3b07addcb4fb15f556a5a6793df7fc4548969f508e12b49bb8cb47c899dafc12fba481837c40ea619c69731743b9723d2968fd7196a56b2fd71cb43da7d26327a55b296c8422b87456024c9363798a5fc94b6fdf6a4a3be75765b2827852908303e6ab4764c33569c657c864a39ab991c6ea45de4c3d388e1fea6bcbb77d8cb27b83178c0367e566d19d64743dcf9c9efa3d9b49fdbd091cff6e393f2613f49005d3ccc0dd0a65843fd3e49a407b672b88aa3c6331cca33ca7a33136ba5bb55f0917a9bcb673f2295f240b7a577c3a78e3bdc36f3fbffe4ce17ea5dbe0e6fd00745ddf48775f9f74adbb45cb4946cdd5b4feda38285cdc886dfdb97ef62a5f4d3e89438c5afa2bcfb5258c3923430ceb99993c9b95fab5ac7563e6f1d68406860ad1dbcaea63c609531bb8da637d395496ee1dc6def78a98ac2ddf41eab362ffd92ec2c4306eccd5274a729b790910f831cd65fca5cbdc954de95fbfb589ce4319d3078b6f5c9b67a4c5955c8faf5175ba7244b57290787ccab76ffc6f62679b4b423d426e3ed6dc754009573aee9443c4a9af619637be8c52e9486415565a6a3c3dee9a5c903ee6ef7e6e0db5c21abd1287a8a046bb038939baf2939a2b6d8685fe2b5743f6ff99c2a3496ccffe414c646d51399e7048ee3a8f38beb8f0b33806ee33655573074abadfecffdf14952937cacc143c885badc7e144e173ceb479dcc6144304475bc02a3cdd95ef6e3fbbc0d5b6bcc875f89bb4883b7c841d6588a3a5b68a79613d4bb04486a2d1dce76378e08be9824d83ba89a649bb3936e7ad60e84b8af0c91e1e6cf9e4bd3c013f0ecc5b493c88e93f9419c1aa71f27ba194c3022634ad054ef3f46f80f7cfe4cbc68aa05a681aa4f16e978b068fe09fbcac4b8498016e6ff92db5764961e299f462a55a30834770ae6827937c7746e02dffcb1a878dcafab1d1b5856aab05f3960e4cbc9754351c79ec647af9bdbcbae01b670a7284c5b6d8b8619d26a28ad2da69e1d67d7770a6c535f917afa476d68ad7c5ca1e9b839aa887e2bd9f52065f523fac50f29559b8d3ca9da4fcaa58c1ded5e1d987b05e7eccd5adeb184a94878e9a755d10cb9f938ae6c177c97743cb7fe78d617279a0b04e023a5456bed346f38a5b346358cf76cf25495298e5a283dd8d748a7a5fb3b9454cfef59fb52d350b68eda3f5595e1d6473e2e34070733bcf5f6128579d7b8deae6e611a1f644ed5e71ba9403993d1ffb282a025dacf047c2599f3345e4ce459508acd702d83d0a76470ff29eb8b8634e56c7cb82dad8429adda39f94e2aea93ed6be1e4c4b2a37af7a36515d58873a7fc1c4d33623fc0d2acd088989bb5cf9ba0cba4b878c8c096c6fcc868efdafd0364df9317adb81b808aa3bd1b1e8d0ae7daba98792b93dc7389d12df373820c7e70a7805d357733d543eb657334096fd616c6d1097ab106ccaa4be460e29047d95726801982a9349aa17edbe89d04a6ce4cc52b24d989327c855acbc39e6b9880a0783166af6d03043bd34eb427b4a8b32676a874b0c18da60759a5248ed4508abfd90723cb161e38058d4cc3b162c75261380c119c712639e50494bf195b0e6a9d4b22803278832d52a6cbfb542f451c777396ea0ba5c9d186c0786180a4a032d12bba793e2e29328c91a40de06b9b754a189c2a01404f2dc7011b036c969b1455f7a6c05b249e83009b52ca5ec643b92c0e4ec9469e3abdfc2b8dbf5638450aa498c345f126782a5c29ac7673a8db84b0f87086da21728067f3193eed391376317450a3acc5ea0322b189f56accb246bdb6ccaf7252c89be8bd846aa9d07995bf2c2c5be82385d77e566c90fd797bd9b2a5dba704d60341b1530cf3f60f231066a06590f6e3c90f1b6bcf5cb316b482c2817462ba2cd3ea4a5f0744db5128b6d07851e15266280414b6710fbbb7da113c8eaa45974c62bdb7b335315e5d093d11e5176f019dddba19b379399c7c88a9911e17d16fc5194b2a1998d219c4a5fb5531ea6e6ad37052a57fb5560ea39719c378b69c902acbd3324f9c29da73145b409a5f79c8629b4853f65d03eca0a8718dfb7295ae3483eee45bdb265638c0511864a0e471a34d839419ccbe42303fd2c51232246e0a6b81d9ab00c50a7fa656893693a8e6e245fa7b119a14336c9a0f57108ecf87a9c249c01d3a214bd42649e092e2c3c8c89a2e4d980b0bba5340330717a01f5b3abd426ccf6bfc3e5bf8969af7278b0c428cc39a36da6a7c0b8bd666a1d07bcd2845718b755d76fa61d3ca51b3b77486708606975fc377b6ee0596a6f37474b91549f6899a3c4e46a5309f035133aab371eb5599809bf32034a73c8d4c0240a306176c6b09135719ce9478d3f8136c189b715c6b4ce6612bdc973f40238994b763065d08308597ca22a3f4a43681cb500a680a476e1110005c6c6acfbc13c91abf636a7eba2a1f1280bf41293f3031a8abf8af4faa1d617a380e925861185a2bc37a806cb8bcf92354a26340481aa0e6230758a667020145057f8fc55b49b530ad5ba6f490c9a73b8fbde960a8d123c648155418b373b1189e10c9f91a4bb15592da329f61682f70e03143846b09c09da648454901ab938928280628d4a57a636397e5ca0f57dab388c65fd6e7bb5a9a0f3f95892973c990f393174bb8aa669bf28322f80a65320bc69b6460be565265e7b8af86587ad9b43f1c3e5a582773045bab8cc6e03329ab1a4e05b33afcf8009dcc67986831d0a60662b427ff5a7b9991017930524bf678c7d461e1bc95fd441a7693c3b842460ee186b3f973b35bad2fc258972c2c309490163109cd6c87a81a2d30bac5c6766e7d151da391a83a2a5e96904cf9f268706b23e8758f514072b43a6d7891a92e57ad6a9b82246a7f3459cb9cbb5e157a957b27c8192407e9820a906cbcad6794e16bae2b0664811400ca22941e576fa6fa1083571ba17884d5073c83b7a7a1ca53a90ac098eb7dd1627c2ec28d61f86fdba69308e27fa50515cdb19445405a3e6c720651ac5199a1085c8ef1995d8db0a43ecabb5229353316780f12258867c65bf257af667da224c271b02f52b8bcf4805bc2031fd9d999b3c825fff0f4c8cf37e52c6007bb4a2b63952a0c223185806aea6700e293f433a97e4b2c8485e6b4ac19ad493c4c16a10a2a884d58f5ee393308641a9a4647f230201e1389624a296b55192a9819fcb19ab77c25f95445 +ciphertext: 1e3160f57717ecbdd089c8bd9d1903423f6f4e6e07c12456a7fd0fd0fb18a48ff577960585daebec1cbc0ee508193dbc0d551797641b93539e55e6efa28cfb16372e6d2ee5056599b92d83b79f4b1897bcd79e1746f132c96e26eb689ba124d38e089c95dd5a965271d392850f9c89f9f4b02b23a747bb5055822ebb3302ceb9fe031dd419f967b2e4ca068dd1708903251b635a04e9af8cca62bc3e08c777255ae8a1a54c9b5474a5866f73c1db5baed82a3c5b241cc26401126bbc5fe31e2a732c7c0294b8237987c47d4141050db42d65b7b924dca224ca75902225c32b604a60269dc0a2607b9e0ba0be02e43fdaaf6e6d3d77e8cb45ed770a966772bcd7f4b2f529bbbedf80170dce8de6b29c71ae8506910f25386695c8eb9bc26f973ffc702f95a2d8bc2c5e543c0f70d68abc7640953259af277f88323b7b6b2f9fa4a4dd726acf97c2f251603bf7c4215eb8996ac763e65c3b5199f154a07531b83db902ab8b3a2e6ca0fe2432a7e8e6524b54a62fccb6168f6de050c1c3b4f2435e9083f796dad25d63d78d53ab346cbc2555e1046c10e2a4db1160bea5d6985312954bb7f3aa0dd77050f5152b9447e59644072480edcc1e03f2e689dd6657cc818afc79db2909ee8a789468241671ca59fbf771aaa3849285d45829e3530a319bdb59b8147e983e3141356ec7711755a255a65d917f681981fe6d3cae99eb767825ccb03ec0d6dc66a8fa2304ef441eb276edcd2c2a8799f79723b335aeb0118699f283e974de2fd19b3669a693652c7db737122f469dc7e13f968145c0b3ea897c6857783ee6f2dd934dff2f017f652ca7ed1dc67456c4c31d91fb38c1c9ed43eac6a5a7eafa49801717c86df8b071cbf3a3a24daef83fed9d5d2d933197a1f90564a74a32c4787406a37899e0542ada950d5f755887f45580fe0e7ee3d7a182a7a349ad80c3a4d7455e5f54712bba91d088c08a77eb569bca7c1429180ede008640340e189130e39be6c59d0167c040fd3849a16842bd67b90ec35ddb76b8e928aee99a404d9ae3701629cc5ae8282f5ccecc165a54b3ae806e32b9754245b4227bf10a93926d75da4c5765dbe2b0dcceda93bf6d8ea1660398c38c83c8a28b9fd57c6aca304b87c34d31e94ac2c4042f2c4d2cc20660bf51ef72bcc5958f3c6c1a1fad735790d89775a5cba879db78277d089bb18efe22354ff1e597bd83824b421c265d6ce4bd80a1fb3bbf0d8780526d30329c49eb123d21b2a88a68f9827ed27631571ba4d6b23655c2d3c325edfbf64cb9e1ff70ca33c3a1b1d303001cfe001cecd5464464f998ea6d319239b9e0f0b89dc9c2c89d8a15e0b510a5840c8c09d5f9cc18df4172e17b00ec65756cfe575ccd3e7cfdbb65285bf93c9e8127f9ea0c4b8df5ea9815a1fd78587635211bf1b8c97a70659df0423feaea6b33e3297ca0ea5e4c782d35369e6978d0edfc109dabe660a4a872ebd259cdf0b5200397e57534ef622de6183bb3a2e988c5b8239ab63cdf89a2581521211ded4badc1 +result: fail +shared_secret: + +# Private key not reduced +private_key: 8d3542bfb7ec67eb9c7b8f4d7179882305ad2496f2b6dabebf2c435436bb86777a4348dbfe36e26c1d89399cc3816a43572e643d354d7b4989646381b63938529ff27674e698a597cb173f0888a3dc3e529b4e492b6fd1608a30ceb5e14f05f786e874a676c8c9a6a5b94f9452cf948439d4f5d4327f6a3bc30b7ebf35be21aca79126b8c48f7f7dba4474f3d8fdabff4b8d982d93b4c6bcb05956b5295a59a77d3e8b6c4e2556d6fcb353ce3cf649bbd7f8f8f75b8536e204847f774e5b7a94da0be6a2c5571e1d7ee87e941bfcd051aceb2ee464b13bdcb5ddd2321cd997e5c51604d3960b33363c57851a72989a55715fdda7eced5ea5c885796bb43a90310ed6e58546521ef9c55d6b89b6ff03337890d89a40fafad1f6fba52da32128d108a8a1abbae24c66e3c4cb680ee6f114a3e5c744f0964de85eb7d9d6538ebd9cfeccc6c58a1755e01d90882beca526e55b3458800735fa8f82b2beaf72697c6eef9be547cde7f64ca29b6070cab2f9246e068c99777987c86885ef65340e868197bd40007784464cb9b703db851db1bf363436e657b1ccfc62d5c14a8ac3d6b636f87e4b641560a0e88eb5a8ff36c3ce95ce4a7fb979bb6ee0a633a2b715e7c0fbde7a6ef844c5ded1ceb41e68bc402ff4c4dbd3cda780a61d5e2dfdea4a3ee93dd86ab704ea97f893a5947464f3fb219fc48febed84d7ea75fd87e25596cc3ed56349b15fc73b838bc679f49ab514efa9d5304917dde86db5f574b2d9ab48d63f8cb799ae5e0add17855ad68dd1f2cab922c4788fa6be3abeb9657ae1be63c57cbca770f5f17f54b5d61990c44d9d0e23d6668bf28a27425605b9b69dfb6b795ff5a5a423138c098b4758553c14ca7a198c9960f8d6b2b5eee3aadfc9d7e36a876187963b02e6c6e4365a33fbedd938ad6d35e0f3c873eca835c9176b4ff5921e05fed1f671a85368ca35b878347e42b3a3e42b731fe4d51f37ad84f5a1b16c72512aa959e8b0c81d7a5454ab96b58509abedb79745311a80cfbd70c6abefec37598fb63f32bcf8271ea5c37337a0c44c960c35811de8e3eec040978260c5dcb62fe7a33ed4645ee8d4287e88045229998a7ceac32f63fc48358ed499f9d7133d67ba96087586bbb37107f5423dc56f84d390ff38effb8344139caafbdbe40d065912678f8ee44cc3c78c681cbe530637de1cab0e1ee2dd0f316313ef7ce7db4d7ac2bd43678989412b18d4add344f664ee007a46fbd79dbfe4e5699fa2d19ad5c35cd28f46ade773e03a079d03a3945eb6e4d8ccc84ffabcfe4ddacf38c319c3fd92cbe8a397d21a3d7c0394546de89e738a9f7d88c7688f5824bfbc0c36899078ed184aed3078b3bd43cf2f47727fa8bc6a56d7938d90f57c74539ac06413567c4c968c9ca8c5ead632799526b3b9df7c6271aa490647eb47cdb134a7c1d67d9d8548485ccfe03ebaf7be5e5d409cc07ebf530a569c1e6e7a218aa215b7a2c0bd999e89ef36dd7d1b6be2cfe53dee8a8edd9e725b138b1fd7d01955991de3fbb9196cf41acfdc773899baeecbbd854203b4224d6eeb85820f3ee6aa746466c49837a69d8e18af5e8fc3a00ad877f9800a187f327ca08e1cee2aee3dfd0ab97eac95cb2439a4d5171062a42523cc5ec7caa414654394003942aeeb720d4320c10d609de9c397d0790c585398fe0c42374ac2d220bdc6f507fe62cc592bcab77bb0a5f4ce73a380ba3640b4e491343ab7a33310e7f04c130a70f75b75e6aca5306837e9ac03c84b01c3fa4f5032069f492cfeac1585054a9fc4271da3636639aef3a065f2857a32d590e416866e71ab92d2ac27cca217756b528776a6319014867816d00837e476afc08d5da82293d37042709567052370b553cc925043957eaa3c34d2810a28163e9f4807b492301a4aaa232b1834db5932d20d8866a37fa312ca9cb129116634e95d551764487c384cf00b35682927808a28660d92e51610c68edc994c76a95549c79c162487d445293f0758a43b525b04477c2c50a47a963531b727964828c5b567fb538432c92a8c5a0be6136b9b05c2e68353d5787a0a455dba373ce60f40c4b48be8723ff760ece23d135887be491157b6b4dc8591b5046735c5588cb405057b96de0097f158c67223c5a854be20238126f1203dc59ba6d5bee4d7aa52f1a92441cb23340820d9afe134097bc8512bba1d2097201d6b7952641369649eecb884a4c35848314d2618c283ba9b343922b7cc18bea9cd1a4a3597c146d433692d15c55172847b9cbdda7a049ee455e5e43f6b18a80e60ca48822b1061835431644ee1b307d581add3b21df3367350bde75b1366505b0c88302eb1c6b164290e29204fb005f81567571552a6e22638a0018bdc94e768a9ecc7cc20e50ebc8bc9774c7caea9a1fbe1cc6c925f3fe70fe2f523fa9017b714b7ba820968b3898c1410b7e46fc54226c2c15056ea0ee2c071635b70fea288b88c9cb43a1faad97671e763d04b173426224cf217b2937246ca012edc14c529a2e2d47bf3b15b96804590e5241254a3b1e6a29378522ca0b2598491509127869a1a73dc2f334386c3bc7542f5bab81c89e938071892709f3744ed560c77d43d6ddc2537c544a4f64b19d55917165001bb74d93a1437835442c83b989bbc22ca67e6f96fd44787b8865f759419a409b78f209dc87a89e3ec883441c3ea39627c2524c4f88625594c2b0b5798386866a2c9d45c2d50d438d61c571564040893ba00a7752eb28fbf6b737088103c2a0fdfc87d99b978d2521949683b7dcc98b644504c297905d2417649c0a60ab70b5c674783739fac213f1ac5c5d69f7fe32c5995073e846d12da57cf17a73fb70fe8e7013d681dfb393a4b40922a654473c40b50249362e4aecd22515f256250365660177bf345a2cbd0884933b45d7ac67ef3871969bcf94570adc7bbc2cc948f82b7731a8bf0f980a3c373d30a4e85e1482686ae98501810c28108670078830254b7ccfca27bb0c57c56490e1a5b593816923d722d7c433534980293a1ce65219e0245a2fa049d9fb10fb54917ad82019a51212f0086afa520f34799a0361a083211a415a42b36237d40a5138c5ecfd7c70f5b084a05156df817071b709e745eb3e0252be9b1d89247b6917c72bb9e3ee78dcfb819ef5308f2aa4375578c72d02c348b16fde51f80602d0fe50da8bb5be6598fda0bb8bb1987de7bc575832baf123948215b833821afb7087a65014511a50e800cf6714ab446e189261a2a3dbac768c1e9e232985c430516bd8e18c79aef56cdb533df23b37987c6b557e4c0f8fa9e466312f19e7e90cd0a67abe6a145cbca9d44eac9d531a532770837a854b4f5531f6e0c8d6c10183b30d3435498c2dd142951 +ciphertext: 37bbc380432e6694f627007ed8d97fbb1301d6b3b484e0e9748b2a8139a51cfdd6e4c610dae8a78c20619d5f9c2fdcd9e402c3fce6459fdf81d799a358dc312a792841a6888538f635ebd0e1efa47321c1ab7b83ef8a202385321201ea04de13575cc3e535a8e8f1d2bf01397150b0b0aa3d4dd9d2f569a4319f6c714f1ce71ef1521881c1413ec9cb86c02a71c7417e7745ec61de2605297c7dc0b04a5d65d21a22849c5b934c74b2acf39c7899b109e956902e8c89d9d72e664c5c733e7437d16a8535d5f7c8647359ba6b82872676531449899c1034a8e8e0b25c6ed1cba2b7525c303e91ddb814a532f265e88c1c4a07b9e0a602f4c50cbc63f14edeb72246611b65b0aa25462e76c99f84e10aacda4250d817901580a6a5b71ad65df385b8974ae98444cb5858e93f931836821b60aa3a61ee73c7aa7fa626583a0a448fc4d5965f6bb34503d1d9d2f083e38effdac841fbe0ecaa0f28f045dbd7c75cab756628d688bc7662fe2791df1674bf49b4c9d2a0ffc899deb2135aa358cd3d61252ff09a1460188d598b4c6409bb368f687b0a17ba5dedec59cfff68b83e0f27375f399cfaa3d43677bcce1cf338175871675128eda0ad04c03dba2974347f8500886a45961fdae190775256aab5a718a03e9b003d8b060afd8f33722a308f410a78323b06026d65a60d54012d09b4f7c730ffc53639bd36b510a5e24508f0f02f537f6b55a1e8f947b10dbef06ec6f5d1459d04c65db7db9a1789c160e6aa7708035f18db7d9b13d63cd8c248aafb2c95f2267d57539fd0a19d73643b481e9e8b8e309a6a546538f24cb99747bf56f62631d7cff279c4526b2b8652a5781728f63504a2935511b82f79704f2e6e6940a689ae13d6ec77202899deb2ed545b55188d0b132a42fbbe9b997d3aa146d44ab826fd548f7af1aaf8867b78d58355d072c9c46785850367819dd091ce58c1254e71f7d3129f0cd81b0161de7d5f455b1ca018ee5af5d7667a7ba14766429294d502d0d7d80d505e0f0dec5717f9532249933892f1986f077c5ab87470d583e16b79305f21bbac090cbb5e11d9bc7c854836b9dfe1f55b53daf9c7e059ea1c7a94dd7360404bfcddce0db43c050e5d866cb989b57c69997e7fbcc39960e2d86a48bb9ee83770ca896d9f8a3e74015bd0b8b9fe46fbe582553842a8b9fde8182f021cca6ea995190c3dddb92f6a6eb75786eed3414581a65b9d6097af2b4143df4430bb7c20cfb458d0226639c05f83f920050205d465a50ddc04b61999bf1d595422f5d0a4839d7ac808943fab948423600145ed175a1992fe37696885903e23db37f47d75fd690b7a3acde97335c83d8823d352c00dd0dfe3ec585c1d3b495f8b429e567463b870a5df1c992e7719ff348a541a39a60052ca9c78ae6fc1c07cdd57ba7c44ff595bff6954c3ac984c148ee6f2cab32340d495f56034e37f6f86612cd1115b1bdf495c0aa1fc2f02a5d6bd196de7dd7091485e842afd748e78972af4e3afe9b4b9bb5969ae08e608ae8d +result: fail +shared_secret: + +# Private key not reduced +private_key: a89cac085e4fd7ea49de1c8a4aaa75cc09d243a5f9ee58e60b4acb10885320b568b9377b476be80cec4c3fafa1f6584df94eb54bd8e47ec79457896e24b3592a4864defc44f4f8e1cac6adec8c91c46bbe81ddccdafd8e4fdb6fe25d9e4a3fcfae8bbd3d299a38a4d2c1ee6e9f44bbb357f9ec9ab7e579d6491a53878e607ea7af800abc214db2411596c1e9669b2c57fee9fd1df8e4b045ef7c99ba4a6e3e8b8c5348d4914224efd104a6c43c66906c389903b91fccb4e3b4f45049c13439eb68ddc596894cadddf6cbfd670154e5d1335829795443c4924e38308da8b22adef9c0ba43b98bcad0aaf0ff4e43607c5117fcc1bb89bec1b3fc198fb6c733ab43afe58c7ea76305856bec63163fbf8313d9d7833e09095e008473ac19f8dc9fd2bca7e8221f5ff298d54348608978417314ca916a3f25a6f53cca6018c990c3c54c858c33439bf8723889cd0afb5efb9c21ceeed72f8560f897c5b5adb6a3a505e4c7138c68cf65dd3cf9c21ffefd83f9baa9778707075ce5ca7e329e72a0b9f6e96b421d1cea3accf029a3adc2abb5163a51f089f4eb7f7d979996fe4949fb7892a75ce649da7a3834f6ccbadd825766ab05ee849dbdf71e6d1085e0a25f9af44b37d666efeabb8b0704be246632f58a7968db7d3835bad6c49b2a4f9b9a443572aec2b2bec8bddb690b387f5f9798ecbc84d0567d53676e93c38a38b63ea97fd703ce3be48ab37f0fc304cff50c45baad168cbab8b87e7cb9f9e55073ecdd375a88cb9fc0371be61bb35f4d4a74d7fea4402bc32a0b50d8ab576834c15305a7ed7d525d5b42fab77286dccde4d6cb79aa7c4604f6219d64622a86ee94a6f5f3a6f23536b63c9ab5f8bbcd148a30d46fef07c4606bfb81b75d4643fb340b6719a735078c35099f5f5fd4c1107c69a66dcce9f74041fb521fb6ea552a756bf638c88a61f103ba9aecd2787a398bc35abe3993553ac0129ef4ec4c67a706c3fd6d796ca531ee28ad8927fed5dae2bbc84cfeeb35885abdfc5d61d6f774c18ced5755c437cb7827e8e07ca8b421dd7331d762e746f2be2fb4373ccf919cdb08a954d6ca33a21fd127346b981cb75094fb9edcac1cb9a6d58fcd00b8d136575017dac0b0345819a3a099d859c2da56a465f3d3e776fedaf25e5a46440d648845bec13b332f3bc78a497a41db4f8e88cd18694887a3babb3a978395e9d4cd375e95cdec5596e0486c4a3540863dee0ca9c6fcde754cdaa05aabf0507df793aaae98df40ae1eab2c54cd0eb897f76cbd861d38b09ab1443bd81f7ef2e5b495570a7bf8363d3beec793b9f06785b59204b1e7a46975ffcdaf9ab6d93d457788921f7f862a499f1ea938d08481eb1d3b9d7bd294ccdc609db6b0566ffa897592bbbc3738a0e69cc5e6bef7c27ffe6f245fa56d7e49064aee2fc7d18fc62994b41a8d7ec9d8b0c7cc3c993c3f1e2538bb2ec21dc885fdc8beac5963ce9732c35adc34637bb368a87cff452463cd5e76f75e94650d7766845bae2d79bb30336adab7aabf5f774f5e98af3c9ef63fcc5c27780849b1cc94f7eb1b45169eaabc5cc5a756ea578a36ac47ec6694ec10fd5a90f4ee79acb69d3e459bd3ddff0aa2455f709407af616571fef73bf834c480630b9532b244d09c8f936e951961bce56157f237b0919097222df3bc6e61f47d846479a1a5bcefda59cdd8b067d19db6d9586fab2fda9b550c5170c2772ad5a4af4a67a19d215e45575e83a8ba5f099e4358a9e493677ce177f36a0f594912b6b850d3f719c155c01b68bf1dc89ccfacccfc6cc38a34ce5b4c48d2e17dd2946f493a357b1105265153c04a98992c949ed774588925c697284bc537b4d795de0463335aacbf80b10cd0a03a88256c220c3d0074ffc6c8c913c919aa19f25206a1cb7d40a50c6f55960a2298881a71a1dbc92a69371dc9a95d45a7bd6547be9414f4c31ebfd3553b89cfd9ac05727b06bbab300ecab599da76a62b97541cb3474b7390cc49942678add66d265772f55515e0623192668fe4c5273e3176bcdc52fceb081dcaa4ed699dedc59b01a29363070567772daddbcf8605bdd1268882a355ca4163ece88637e932c56c43405ac3844949c819646e394dbdaa475e62ac0463b8ce257520b3b4e141057449621b449c09c5b72d10464e59bdf2702a7f4ba1c1c6301bf51ec41bcbdddc4a069abe46d37c09050b28b073f2216a06d501bc38640600185227a63d224589a43391097226d67240619e2804589f4917db7391a4fab6778c91ef30aa41655e3e433854a52c9ce8130b802e82204bbe894517f1bbb4458616b0c309020ecfcc17f6b69cd0bc688963af0fec8f567a86ceabc9a0383681d3729a612987862e2972b6393c2c93a32861073ac3eb1cc636a52dcc23e6ea0af7d3af49f81858743962978245db5a70c34e90c64560b87ef29b5b568a716904c8326481db98c81cca47cec76e32003b36b26aece764c5551ac07c4bbce094b6772b2faa27b518ca5b96094d178f68a7409992ba7fb776117c66e97cb0be6854908aa8203aa916d26f3118842689a5347ba29d337599799691729b812961720cb80ff993d8a124e2027effa1baad40a17b564b0412681a6005888c0e27992faaa370ea3954775949a553b75aa35d5956373da54da7eb51c7e68c05777760c6b9b0a78ff2f34312876f2db27898d3aa4a187110402537f2aac7373751954f3bbc5445da3907429fbc817fb0a732bf4077d4630c93a4bf6785274019c5de6c3d8a66441620491a8537ffa1a50f0baac622cc765052ae0049eabb20d05b987b303d17714c4e79814dc5cc9593bab612359d0c7a3bc9614d0c8eb4e0a7c740520e077e2215bbbcb693a92c0293ca28b4d0ce316b5e14e165fe4745f9665c36a651a6a8ac11a162b4a111e40851ec2b29dba05590140d28aa945b42310659111a4033f972bc0163bc26a5872957c6977bbf8d727d65a8c806b4699050c994bb85651a40c6d590c337c680306fc231b7487305c4155654471c3003b93c206cda82c19f7b047e12b5cb94490f4bc850c4668b366bcb23bff1a744dd3362e94cbbc658178a012d9b784d12e965f4592067b636ed3ca3bdd89c0b30c8bf798f2282c49ed3835b70ab1ebc761b880e0779b5aa34acaea40c83eb0babd6ca11398759415252064c4e70b62d4cc813d346ca789eb86b5d3606bc3239758a62b5f76a709b602ad6987228433a01a8aeffcc22d0d315d59b15e8aca53b02fd160c62db910fddaaabbc4c2df1256095317cdff9f1e7ebcc48f838210130a5771b76066feb7f606a82cce122964da1be0b6872ee319832214ec677738c3fc3d8392cb53f36ed647364a04e37278a0e0a45b720f4a75c580c9920eba98d +ciphertext: 30925699a42d6bf2ab41628a20e814758a8700044fab7c3b14188ee52c8208d9641636d721d2ec32ac32436deacdf6e4786c3ea44353cebdb1827cfbd550d209461b6a14b1170893a28e84205734ebf74c171d70ca82b20b4260b3f86f7ad4c2acddb7f4c8aa82c55d6d55b8e43575ecb5bca8ef011ba9b9ac616dfc7b3e3030dbb7a0ea6b45e36155dea786c6c2643437930bd8130d8051e70506adbc396d64a68553140e91f47df35c19a79a096bebb25f0e420eddad682d21b374fbc606d5939a1d2493b43111fc71384f57b8c03817db1f9e4d0e4c5e7157a119743968948929d3b96e3ecbbd10b5f72a9f45e52f6145509aad69f8ca70d55b28edb2802a94c2cced9ae537259072b55298bd9ac0d98db002cffa8e94f9494fcb4b2da810b2244670e00aa6ded8ddba746957dcc34d537db9447577e19ab7ff1411ff6c68e7e40a3575b1389d8817a17c8cde4c93e572316dd029f4f21fe3e62d477f52480bbb527820175ceac30ee25fbed3ae258fc0786aca81ee2053e078c6bbb30d169782c74fe0ba4c8488e2ad4c334dbecfb2255dd7be3a95992e3f6a0ed5cb1f86e2b99a5a5f64ae5c810f8a6e72d2f27f8daf0c60a6d7e994cd231391ffc7edb3195bdbcd5f63acecc14b6c7f19f6d889616e8e2a5ce63c3bc0e2209d30988a1b689c968f9402b49c0f881dac8ab899433872e423ac06f5b35b483859e45b0f6fec52334d7582a6149fd984237c5f14369549c261e8e7246664b21e05725f953b21b49eb33b7eaf612a4231efb0abe4bd8f36b981f4f1ef5a57a4d27373510d1bf9c0a5b77625314a125633233c6902260e705b4995ae34b6f90eb1298cf9726a60441ba5c8d24c474ef73c02583632474956651700f318a88718519e8c7baf48f4b571aae56410d6e0d83a50ab3fb4115a1bc2272ad443b5bc5e6ae3daad6797257cf9868287486a217c631814db311226b6122d9acd2de042a95b03983261bcf902a82fc7f6c0db0e293bba27eafe29c6947f35c1e0180179b2d2872a85a63bca18a9ff5ecd144ceece9a48c68b8b6775ff1db3b9772abdf3dd6ab6d3d964da1adb4a035ed097cfafed937563125c95d7aa851d6b3387d15f7b0cf855d264a46a6732f097969872e5c1bbbac0e0853046473deea8a0ae4cfbfd1fac86d5620a3b4501fc961e4be1949e3a258bdee7d2abf4424f0a401dea2f5b0dbf7a8c82983eb1db1f69c827d4f24e36fabf34772bbce108cdc0106c074c2e30851f85fd47777e979716290eaa515e69390e6a95038fb018f240bf722fd947bffbf82373bdc8d7d78d739e119a5157294cfad5ed0899e864bb6f091e861bbe785b4773fd9b6f0ab758f2f71fe292179651da6046dff6e51caf05136e8ca7a2a60ed74015e6b8a3bb5637884d6df4ebe24b523548f5ff7ec6e42ce750a47127d5d7c312d15699722a6234d9f6a8fd51b9f3ad16a027c0a2d56efcd4bab05f5efa3ce4004ba9eb6d36329edf625c18dff3a94c5a430c3a00828a9080d9bf166a5973b60c9541 +result: fail +shared_secret: + +# Private key not reduced +private_key: 8a4487c253844156a9eb333c710c703a8f93058632014350818bfd98d68b4e0c536ee79fecfdef404f3836e344377dd866dae39193376db576f4afdd4728eeb8cff64cfa494ddb768ccedddd1dfd56df5725efdf9e1f5cf77e8466d7840a4ecd4783bbffe342f4a584cab59e042fca151bcaa29bc76d0cdbfd5f5e089eb3f9f6f79d56cfc4775d84054b51f6d4d5ebc1a9affd783c840aabd0cdc58da2ec4a60cebda92d622e6ce0051c3c041571685697bd49ceecfa455f1eaf28e8a8facdb6c753e4d2dcb8b67ec5d78a7ca354567338344b3d5338897241d3991f3b4bf448479bb36f9fe3e83d7d3f57f5903918bb71fcc701f586eb7e9e2f8e83cf6d55768e9514f4c59c7faa76bc6c0bfcb7fd19c51ef3612d45a9ecb396cf6be3c97adbd7d3cd70a84a2feeee66fa39c5967d080b8f7106bf00b8ed208c66fb3ec94e548e50849c9936d8dbacdac28e6ade777d37ad4e6989ae0d6cea703541f3ffccd467de9657cdb28fd2881cdc5ac3ab16be355209e732255b02eb9db48973a3a9d496addacfd3b3301b38bfc4374758b0d69562427dd033b55f30eaff8d2ad46c27c80b4d3b9369d5f455943b0459a9b5d46bc9cf54c8fe175a34e628bf52aaf25fef5b07d73bcc4a80fd4580dd0ab679185718e5c197ef5f4bc89c2074d9a5cbdd1c233837776832338a1d1b907e493c634db0c75f4a9e64fb91f480811eeb3bceac062bb528399b04c3bcf114a0f474f4cffec1bbb675b1999c8ddb883e7b40a1ba5ca13875bc1ffd8c088c8116d1ab2c4844aa916fcf348af4c28b65fc08e970e535cb674b388bca5d3566a6ee0ede10856b2eeb796bd8cb8c5d3f2bcc7cbecc528feef1bde478307e7e5f63658cc7f51694bf0a5cfea4d98abd7da4d87994a43e7a206c34aea7fa54e74d2364e8a589dcadc9333f2c9c349744bcfbf8d5bc7ae26feab708cca937a9e20d72f51fa26037312145500eea42d04a549edba62185a93c1cadfbc4721ff8f7db83c4fcca759d575eff93848bbaf2d23b5a659cc5c3c3608694f29bd736dc6452690c742a59b9c9e9adf6badfae27664a28c1490bcdf1865802a9ba2a6b49951b3754deff3ed57fc88bae35efebf0bf69aa3663793b56fe26fa2a47643ffab946f94cd11f479f5bcd1a6a6b8019bcc4d38e180bb993e3e9f43ac809dcfbb8a63c9d2854ab569da8f7c0b2bf4088056d799b49d6dce2bdde5ad75c5dade497ad0b312b9739224d98bdffcf916d4a730e3c3c5f994a79e105d4d60657493947be3b0a6cfb9eb8368d457da7a6411a984cc661f0b7c59b1efc5fa895096a354eea5abf893e2eb7389d0a64958e421b23f01ae66e3b3b4fbe78e8d0f47ef7477f14e792b35ab3fb2737f9faec75b3d01445920c3bec65c38ea43ad2d017c93924c4b3e7492574c3695de276643549f5afb79e77a4e8d7948ed2686958a1d564a8184624fc47e713b7da7f8ae6cbcff5d5fba4966429b9c0dc659081156bc7c398d9a9bd4807907c3d7b160ea8bc5e8268897dc97edb649494aab4743e5ac392568b771433808476e6c3fdda6940865c3e43077e0d9bbcee84cfcc5f3895b36c5596880f036648f37d493e38beff4c41de82cecaddd4ef6236509aa06326ff5cc174f51d963cb5e5b1290eaab649c91d1a03b9cb45400087248ee90f5b9509b9d44f27e814b55b5d7fd341bb663523cccca02c277f1a12f2e054008405dd7b8fb5b78f200266d62b00db2665a728b9231b99d957904d4278c9b99933972006c0afb2d46ab58810bd59492891a77f96b7e9d06eeac63cd9e3a2039a1f30ab0eb4e6a7dbe875253174f2519092761e9684c00726b8548aaf2ab3bf79c8255ec6c1591234672acad20c0bec4a5ff7b4ab4442c2982799d0203f1ddb53a260b95b51980025140556582a0c5dd9d20bfe542f79a743d45095b25c9565c1bfd1d82e5dbabbf37b934bd43a9af92ae5bac65570cd0586621708a30d8371dde11abdb8079616896533b90611a58843ca38f6105164b1de4b227b0c4b14749f5833c5f76cb5aec703b2eca6fa40c7bd224059a4938bf125653901d5d80cb4fa7213e9136d7c0a4f2059865911f68c19eff169af063e76887f192359e5e60516a92fb1842af25599aaf530b08a171d35be896590ef3a9b7878b4a3764a3bc2a800613ef1c2a31fec6ff7a8c8c4e0158202c4ffd35c1a45738d1ca197f23b8858a31dc60770e38796da35136500ec868e209217b9a10c7ae465848c82e815490da5becb32a55973aadc18afb2172c0d086de7e21d309226fd549219c0aae0c672bbe832c515811584ae3e4a59ba98a80e2a0386a187036961b4f6abeb6a84ae8b55b4e95cc9e812be00ba0925ce00ec3390e7936b52482b420b9d051f91a117122a0778c2434cb661ad59050342c63ce986e1b590d2b0b81ff4c3a1bb5a9ab4cebfa96c9f072ddf8332f5a3ad0a156fb5b6b35e38a595f30f2156815656cc487313c75952dcc12adb5b0528ca68bd53bcb1f750d5f24d15d54e83b165440528d83057fa12a983aaad4048c53c62c4a789b82728a94caaa50f7a7df6fc7d07c76727882fb8aab09811a611c5188dabc366494263cb8eafb78eb40a7f33763ea9b51318f0ac1a7a34be71aaf436ae4248346a7a25e2dcbaab226111d96d5d9165b946ae29283118bc34a46409f2eb37c469a36311caa843c112ea83c0364ec2b8b6e9ec68cb8485bfd87ff560912ff21c43d59a1476952e82a2d3f3a00cfb7c49a61e9216b728fcc30861a23e171c2c7954fd85528d911682066db1a062b50a5a11cc385db16d4f4b81785c9b8368575409738683847cd46f9389128414082c5515b5b3310658c54be69a6c3b02b5e0a1b6627e0512999862acc0b34340172a9a0b144627cac4d36fe8d71272e6ac69ac94d1f8c250515580b85d8ab300bb29b43b02195ea7c966947bff9cc323d017b48bb4f6a88b0201956e095b8092b250b53dd9f58ca90b28eab574034372d9f8305b39668bc90e2b6bb77257252b0bc36ee68ad25a7c883691a494c5626b5bd870c45a06ced4f39fc7e21958811a7b7cc93410b2fd8245b45b7462f72033d86ef2fb9b173397bbccbacaaa7177760202a8748b440f82d49218331c3760918c640dc58073883b5721548ed6e529d7f95e02a65cd7bbc3383317fbb166bf751f47fcc216513742596c2e9bb75ee80d2dc16d036b1d45102bc2275aa09b8800213f67dba3987a2f5efa1ae2c7868ce276c5110f462e65b39b2f4f753b3a3d41eeb50f7aa17723bb620b800aa3dbdab7fc31fcd120f19fe976236711e58b4ad172d25ce01eb88bc9d6d051c56564a0db11d7e4b5d8021c486b9c3114d7cbbeb7cd49eba8a61bc2bcae1f1bef30a1daf76d +ciphertext: 8c7069e91b0600eb165920b709b2d3e91971713faf427499bd83f286ae5c72662f583f78fc9401043582106b94c1c39c8f9348501f0c0fb580c3a40bfcec4eae177b1d73a76bf20ede2695a5a00de71403734584ac92653eaae46a696473e3b356addbe195d060888a9db895fb18f5319fa436b40b9c1d8e073fcf305b7de0d2feae428d32195c502eee3b5105b925460700ac87a55745bf1cd8481274ad8168a206b64c07f290f4433d8fcb9a068b5ff77d81d50b177605a96a3fdaf6566d6ebe5d793e8bf87be1db2ce45d61abd3613e363038cdfd4d600b37db3881b2c56f8f8ab7bc48dc86f82eedd207b7568c07dc0c5f1d656c0ec4e7c2f157587c7c2b76dc1cea2445e19b05064b9257a9137debc0ccfa0fbb723c3f320f5a8cfd1d032971336d1599d03802a74696101f8fd1b584102155c46a4c7283a6ec6e6bf9ad60e286277e05731e105b76ba4f992f37d30d59b4c224b0b44b74ea34113f6346a481977ebaffb36c291fbfaa058776effeb17e11896a22fdc1d7649a11e33cd7d22ea7655b641b5957fdf542acea5aa2d7667ad0392da7c596c8bdf38954247bcb6cb77a6e66b509dd55c2904ebc3188a1ba8e017191133c66ce9c656d7bec4464f542be009e3850a27ee58cb4a5374220226ce305cc45b98fd094dc9e2dab7acb5fca8d4563cb156f81800824031a6f342f6dc83da64184028a3a90d0d654eca4814f034bd1a452a41564cbf5f7865c9309bbdc34702a06a789709497dff45644cfe356ac9646c3ccd6ef51e48fc81b518e90d9c4f68035f1a878c893b6a7311aafa3f8a4ba6e194756e6c392dca34d51804022cd6bef7cc06eb69ddde31453387aab8c6925c7faa30bc6466d67c35512ff3094dd62c0b5a3316e8db4d8813a3bcbbb6f46aae9e17dea7ec7aab80dc9c099bf062e1006fca6cd8cb561850507e4a0760bbdbddc5a6efcdcebb861bff73e61bcbf51c7d150f5a2a531034899eb0c1975b2503722325d0229d710948d68968d662a8bf8e73a29d98c8dcb3bc128db82d1bf1894fd617d85ac70ec52214b348bc08cdba7a5ead6a7d97d2ef640bc06d71079e5d4626a4d7adb058170a07c224d123f8e0a11836696e95d5180e43169aa81e5b6e684b5d4cad7c29379de9eef671ad2d7dd8d4285a4983b2413bba4c1362a3ae57bef857d2acbf492e1ffbfc93d71fae367adcdc0bb96a76d31c4a72f5ac2164cc627f86b8dea3c175a34ca0c8b9c10b25ed2ff4327d9c683e3f9f92e69a41c59d7964d8396d06a100debd1b6d6e1051cfc17d8f8b3239ffae2d10f36904089654edbc130dc8a5838ef8daf78947800fcc084db7614afb6acdc3af16d9f2c80bee61f54d9b843d485382aca76fef93b64a33c20ec9cec415f49df42ab2799ef3b1a05c37584c9c5874def12329eb9bc047ea70927f5adeafdfa0f24e75ac4e7c4fce2d96f774a97872795036c69e6c412a4b4fc0dcda336d8eb9207623b7f263870a705df4ec5ef264c016caec1d496d5f9859c1f331d4214b13b1a +result: fail +shared_secret: + +# Private key not reduced +private_key: 5a837a99deb7d24cd6ad8d4f900892432e681a5b351423e1b383a995a75dcac87baf79b484eac622a6a594dbede02ff030096548285bf7da99f27a8034fead1e54fe355f91319fa0f666ce6baed969fddb1785658c576fac3a68ac13abdcaef55f6b5105df6750894e02a9610a73fb558b4739858f72b9ced305cbf9c6929a7664ec49b6f7de8f728664953b77437e80e7bf895ba6a56b49ecb1263c5164d61e1a4c4ebff1418b363f09c669c6918faeee793b9224988529a9f3783ccee355330128e99deb5a4c6890c5f6ee46afc89b3a74657686aabe987834b30aed74133a34a5beeae92a9bb6a4af15ce5b2715f52fb69cdd159f5094e5979ee840ede287555a3ad331497e483d8d40cd2d894d4a5aa239cca6c733fe27f20e55394c3af063e3d4987e6255bbabdef6c71b9f5a250fd2b096a39ab3caa54438223bf3f7ce6f08aedbb05ad4aa1c8299053855f4a8cc95fdf639ce559abdb8eea5ec98614a1f69bc8f9226ccee99f392c1c6364d64886aea98f1ef5c1f27862fa64aec0e7b7303dbaf8cccf543c6e054b23b33bf937ef5cb263f844c70832aa6f9d661429d3aac5b7ee78734959e96c54a55831dc91f0dd7e266acf833c77fd97f75b8800178b6e2b89a81764f9e95e18aefab41dacd5ed3e604396d591e64200feb40f9c45bc947afdfc629b457694f52cc7e3de8df5955a66dd6f8d1bff340292dea22eedc3a76f4c234b0640b4c2624de345b778a04929a596176e9f2dcf737f5198f677467f2a9ddde5e94fbb5bba6ac7a8f2c90811e31bd1c9fc50cce2d9dfad8da968fc7eacd79ca2abb87991b90e2a76e5d547d96c4a300d3fc0da3c29bc4dd611b7923c4b6796b8dabe5a277fceb454d50f1be7221744e3868ff95faca6807b5669482040ddb0b4a8a7707f5c067c5c464cb59b8547ed3b2851b9f8eda807317b5147533ab879a26b982187366bfd5d266435dc2a96e8c1d4694f63c355435d613daac7de755c3db38e343445f660ce98e8a5f8e9c64f45846c58f9e4363e6ed33e8f5b1c8c6ae439e6959743f3b6f2b86f916f65f6e765044b4a3a6244c38beb0a77e779a94dcdc5a7db47d3a670c4f5e9c65c9bc814356b4afdd9f6026fecd143f86e3b8117ec9181f46169fee4c5bc98c4efd2f05f6d178a61e0ade465565e68ddde4069d3c7864fd15aa9bd4c4934fb0d0ff31aed9a270f4eaa6cf9e74787524b6d85b1f9795ab5c9049c9863d4478578a9089d3afae6934f73dcede7ed1fab3c629605cdeaefade6b674a64121f3a0ecbc7199f7b1874facef5a055d47af694c34c4ddab6296dc288498454eeafc861ffd776803d6b7cd7ff368dad5214aa130a7e89c634c7be923415c75edda25656eee6f942720f777addb79c8b943cb3fc306f832a04cfc79786ec0e7f562cdc5eaa60bb44800e2ccccbd64755c8b6008bc89d5f827e737dbb37ababe879814d7c503cc5972a34c779e3f47d85c699b4a95ba474ffec1418dd273e5dbafe7969f6b629b48de953d9151ed4f7dbb4511a8977266102cf6f5b1c78e3896e062fd2ebf9a5621797c775b1a2b3b7f3a53cfb9c90a54547310d569214c151088a083af37a8aababa3b69bd3cd415cc1f9ac91c5e450ab970d5cc6678db12ae81962959a3d68d8a4fae40ed343cbd2e84322e2342cba7756328fb5c80a3fe07295db0e136621f8acb8eed4685cf21bb28a7fd34a9c6af4a8d1fbc8db21ac4d334afe1b71b87cc1ddba5501d38dd7e74c6c502ba04b8d1039322734418dc438fca99d0bf44f700ca473d07c0ad5094181bad2e90910c08478920461c750aaea6658112933753153aa9bdf090ef91a3f08e7c07278369df0bea9220b7d4c6b6f6a7135a5084aa54ddd270e9d41128d1944d8e7c3e1ac11a4089fe4541324db369445b5afecc41406b277e8bb93f310de57b55deabd8d2ccd2e9a417ed916ebba260e0baf95ebc0fbfc0a1b63b6f5342b3ed7c1ff4135f0a26c3daa7e2d60bbab8051123628abbb3cf9fc6369a46d4deb7ec0032847d7474356aec9a417cae8b62c9c7bf3b077eaf52c622b6a2bfa6ac49a9cebacce996a29f89acf9349363606a86a6696481233c73b273e847798b530b8662194896e22ebbd8f3640864791964069684338f453710d841aa83a2997316fc3ba06e7d6a3855cada69c35cc801cb49928ec66a56cb8a28deb2329d75c6545251ebb8526903a13f5174119b9c2037b06c165d2012723bc817297c42465cd77044436337591f239153629c3140b0ca85783d2460b207268f013988176f4c22d8ef5c096c93a52706931b4399a1849488665026a615e5955d972429eb32213ca16b587b0f7366192366f523732fb1127731cb06bc39f15f35b1283654bf361f403be5a9ab154f786080cb8ec42c8ec356847839de84a23c6e4321136477c12b20ca5642efc84c658323f90c2509b62df865e54072aac311a6d3b4eb9073b17f2291001a37e6ba438918a42663bb4d15896239f9f2b2d17a5c93c024ac595806620a8891b89f7297901a9b63e7c799cac22a515bfb3ca9a4772a5bc9a11154011e4dc0d758868a9f646d5390c631381e8566fd5603902c11686cca1f876322cd7793c338876d82008eb30f32128511a872db5cc0ac689c75266d5a9bdcd889f73dc92f1dc5076f373be64308012553d3109c7b5b2a819afdb93bb3447c878901813849c5fcca97b116ca1c2115961ac4b8c926303bd7f502eb299421cc9cb82f556327584118c6930e03f4368ab915c3df0a46b08518cdd280e17f86824958f0ca8079e857d8ba9a522a49c3f539c845968faf37e4beb443b577646967f4f824c2a706b3a7b74866aa4bfb83dd8e4356dfb1d9f4678a0a120cd2569101b034e36bf24a58c690b69ea27ca88db6645682c13b57d9a397b83772c5357082dbb6981674a772b6a94d0210b14a7703202cff38419297edf92a305a59bc51a022919b1b61bc853abca39721b83a794f1c27d17da71a205571573ce31ea27f81b744371274d6a8138b69ef967adcc75730a652f134b0f198b86a2a670a96c58d45295433851f61850d7b318245849a140a407a60080abbab77abf58d8c46f2580716a0bff0481b1973c804a406dd2bd08370ccabbc9fc7557b26534cda249ba1b3afaf2956f10b0b6ac0a7ef02252f5869a972142e06b86b64684b34b2592bc91b7c5b24c14d232b81880b3844409c6038e06023321dca0f2271144373fbfd47884f3ac96e4bee4dbfea5eedf79fb157b32e2818048bcd9b8e9bb89118362e59c75b4917014c242f75d6e3755c28f3081ecc9db44f6cc7cec9891756d74093716697781fc8cb5b2dca81e3f5f748d23c9d356a2209f6b2d60247b2e45c9808de497f64f124643 +ciphertext: 2ed0e760ce63fb59cd94fbb798e752d1d553c736e988de65e2716c30f329b7fa287ff0c677ed43f3d0d674776d84d36fe6a6513586a2e2bb915231481ee01d1ea06dc158456534e1060f32f06022190088e8fe3cebed9d3cacfcf7100c69d0da846df24011605cf42c2cb69dcaa578ce8c39ae68f2fd5704438753348b0fe6305350b1ec520d96aab367188162f8988a47987421fcb6d03d5e9f47fa6333b761b95aaec6a38593e512786975765247f2756ccf88d5238ba4ea61ebb18ab3cdf5649aeb67382c0a232b14489e803cb1050e1ef6ed88c6f1916524fa152bdd22b361722dd5d158025033682fe3caedd0809451b0f6c4c552f0ddf243ce5295133e424ad4fc7a7188763a08543bd3103a7480f467a7bed7a153d40a753dadf3e7af116cb594923e0c5c4c5d8ff27e0e073f84a70b1d1822ef61bad30d3ec51c9f183b6d2967a349e674d2e57cd8ee1a5ae01b37079aa4f2064ee5df394eb3540eb9b636f228f3c8f3b4a8fdba23405e36cea3e852c076b4fe53f7e877b1bda1d72396b93cdfa0278c4445b88e4d0a72aabbb646e6b87a01ec8b7739e7149c0dd373f818373b80edf7028b029eb1abba49aee7c4a0e3f290fe23e3a8487d6da923c61dff69b6bec01cd2efe0cf35ac6855fdb58ec2bddda165e99ee1de5e183ac2568ac47ec30668660d2d7613ab81824e049f1408e965b457461a7849df2dbf8276d53804cd7d9934e482dd6f3c6f167d6516c816271cfc18a6438aaafec7f87825dad2d605dfb26874f7226906a6e3514fd6c73ac0f8524007b7d5d32e6d540411b7d9ad667c5271f1c10834c7f64266d9da404bc197d3ea3ed17cc9fc8ed65e942a836c9ba4c2c167f4926158db053dc7efe70e008c2c9844533a1912c42266e7ef99f9769104ec6d7612854d3064878f02e86e65e51ce80ce5a854c4b92d0ef26a70e75770cdeda1e63dc2d7001b31fcba3a561f74d7bdd49e6559ddaded87590bb38ed03d9fb9e7f8824223fc12ea3642d42886c600f0f592fec815d454b7f0691c3b83cc3c8f1a014f5feeb2cd04720ba4a4f6577c45ea5058d20da7ba8ac58e6f8a594e7a41a91252073ec24c473050e82897357653a8b53440824c8eb26bf4e3140fa352819deaec7e3d5f8840fdc5305fa92ea8db24063f3835ea8682df449f06da48662cf06e569ec327d678953d99ee7d169c6207219ca1386af2fe4f527f6a59da051901ba6bd6798606e2435cb3da1760e135869972eb29216cc03da4c581d553765c2fa3388629fb7a8229a4301b7899e331eefcfed1adbeebf2f86699eaa9419159e669d85574bb76b1514f4092673fe4098ed54ee2873ae07cfd23104bbcf189f6c8b99b11fd2b40e03c284da6a4ced499dff116a64feefb1c07d16492481db67f72343df92b9e2a83246e8b5c31ac69deed48c019fd8633532ea972b992faa50715382e340a1cc829e4f64516a8a840b1c55688c409ca7fe79ef72cacc4ae564225592b66ddec1568b40dfc44e5895141362a3fe39e134d70b7 +result: fail +shared_secret: + +# Private key not reduced +private_key: dcbdbec60af5878fbf1eb3b226d9bb46ae9beec69998797fe4e9f75f1a6ba518ab42fee7059338f815f945a36277678f84f761fcfaf1b49b9e2c85bdd2c78df18ad4f22ec423ba89cf15c90bf34ed5e341167fd6c2abb93b99f4d6fbb1182ba029178be8b5b38ed868c86c54ae69b492ff450ba6f05484b7070aabfce83a6f1ad24dbb837dff6ffe6e3d106c6fc6fc81f23b83888fb72f7873c9f6735f7eba2d2c7f81cf9efa2aab162767b414b71b1bbc5258aa61a984b33dfe06286d8ae9cd15dfbd7c2f9e03a6e3eb18ebbedba792297cd677f241abbf5643703b098fcbcf73236687cd8ab0e5efefe3ee5d786c37a09741bc493bbd9d8f20eb7599e6a5a21fd30ebbfad79f66ae3d696fced72793b6ab6e3734554f681678fc8d68abbdc90368df6329baeb7e55c1cbd9e846ab164f7e0a19fc3213ad42e3c1cbcb48cbca59aba88ba06dbabe8d87b56ea2746cf974cd4a8e1ecbca9b3a74f7415d975004db90c4b985da9dac3f0ebd72a446f3ee354515fa9947ee459c589dffd3022e82a2746d74e5b914b872678c999523b6c5ec790f986ca98c448117bc397643c339432bbfb058e340e098ace6c6a1b1ee472e8ba11cd898107ab9455ad8b965329ce8758c199f10fa5c914cc2377d6e0a35cb5f2c4bc749b38f2e84486a88bea7e27fcd36fa78a5780b3f0515b391ea6599deb99824ed356ec141b54ed187dea2938066e4ddc3256bc6ead9184b795717d392aecc8639e81954669da8c33c9451112d750387417f97d80907bc8e48332d293cbcfa6409f8e4b89e54b135c5a82eb447d45ed274731b4df160afd04f3dab64fc87b16ec8940ac9153957a21aa54ca9be2bceacbd56f83ca8321a3dd788fbe52273c61b96daad1d4f66f8d43e87f7226e41097878d66a30eeec7820f6c1f24d989649c2f2354b81597b2998f6225332aaf6ce5b6ca31ff986a675d6737fc6a29da454bc3654699dad2c3660e371571c8cd0b9b1e0ec5ad54ed6758c3b2aecd1f2e46a95f662ea6733a63cff7f67521065655c1c9e416e5584b553a4697141bbd10ee4a2ac76c4713d43dd4ea6763d9774d9f79dbeec717ab9528d74f9c77d10c4b973fc9e20fed26cacddedf68db0d7bd63c67750ebe3e52fdedd04d22e04fecd89d7b52bccba359374b48ac4988f4b6731c30f95efef77a0aae140d3da706d62dd25f425d9385046417ce4808c7a44046b3c3773c90d4d589524acca23b4756bf3b267b2c69d4cc3a634750b863bbb44243679483997a52a703ed867c58adac92f7bd51e5e88e946158ebf5daec6236f83ac3de845df5f2a094956de31305b5f1be9e789789f489dc193da4f4426693b9575b01d9b0834e54f53eff127ee3c48686833beb3b3a4f31388f0348f693eacda07e0b983502f8e49b725e1cacc7ffc0a411efafe781656497e39cffb9f708938890dad642dd15dc85502b5ab1aefcea1fab7eae59ce24f9bbfc55471bc86452d4597bf64284c31c22bee3e64909fcd44b044ff003e6486bac1c6cfaff2f5f775e7338fc8b9c6d8a78538473dfee81b18d48d7ef9eff7ad07c85bd25cf803c57a28eccbd46f3713a5368d8ff8c0ed547566a43a1788e9e4489f8747167b6f08f7945e6597c9872b0cb4b1401288d7915be8e3715a8391a486047c15b4ab758c8d9b47541c3411417a439bb2144049744460810c01b778879425077e91ae06c1bb831c75e9d1552264a6543266e769b898b66644ca93f9da7735135d743c62a3876c0c891ab71c73c9b88b5cc14de0238c82103fa8f634902a01ce5b15e7823a36aacf6a05639a812221085b38b2ab933a12552c268ccca3cc07cb4e1ca03cdc02b1a5a8231a386456b26878b673644bc3c1613090454b582d5845268f381eb0e70128c1b06f356a9da736222400acea7c58216040a1affc5771081743b5f0721ef2b601a651d8a2658eb9c5ad8599c2f040f791ab5d93c6067ba30014af51766a41c70be6542b7224767301885a030a8d68a795e9924ed844cba1b696b18c5a64abc7ab83a163cae74ca186c01cafb53c05fa535d43786679a429677cd3f672b7c9cdf9224030b32c3a147ee0b2a8e50a0905a778ad9269bf04c2a801a1d986b15cda0ec2f51deec2005d450bc070c5e9e2a9646c3a6029beb907b632f17163b260fa5b75944b00d776862c3c362d06b7852ace9f93afbe9a4d77c548d04c68206277f569875fa677921c671fa887b98866e8c25815fc09d194adcdd34430e2c3725178f6c509fb359e5c3959d72b37a52c303490ae22138dc495bb2bf0c4fefccc89eb6b70764cf64cb2b02699e84a562f076dc4221153d8bc1dc0a29387a15da95eedc808c666b3caf04882188b5509106ba5ba1869463834b48dd9a2d7d6b46de1b83834b7db556a0b624869641a7b77c1f15291696798fd0cc1d01c417062ab36548f4f7b842e99a85a502d2ed70bb82037fcc6237f058d88ab2ded194bc6f65c723656474830581bb92f196e9fac65fbfb0e662c34cd1739ecc28ace01291f24701ec6a836a11f54d44fb50a9150d9401dd96c39b1b02ec73b86827fa1cc39d3ec5d5fcc4523a948a30bb1da4b3588f029c11234b9b571ec3593e82a0cfd428ea68b727622464fcc35e3dba3bf911cdb717ad690147ab70def66a2a66052a3844b7f6866c1b4bc80c106d3155d4bcb8c13239fc96241cb1b092696a50502a887547638499216fb31379a45bf7b43f92175fe282d98d7a4ad22844661256b711228a31fd2b01fa8f72dd357c455768a77cca28e6984913c352726176e2192de562781dccfda024fb4315eb5b14b9430bf0e783ad77a763b631f6c03c4b45aba24a88e85b70fc3b1c3049447e688c3f2145072460b838546572a42f4659a71a95392255765426451f137e8b4ca64b5c24e5cc74a816a988447ce07886cdc59eadcacf5cc5b17b4b0d058c0b3b610df489066e402ed63a5d155161bac9f2e82bd0e18cf46476935fbcc0daa0ccbfc72cae9b217d3adcb3ba7e0b759aab167ebf40f6cf92eddc17ec44508d051a6302372faa22a993386201827bdf3a1e932c093ba2cd1bb347096b53919218f321bd761abdc6ca5086c51b0c471a6c2781d1ccf20bb567ce472fc663ab10b75bdc6642832acab5c5d4db37a46572645a166edf46ac243805ac78e5c483e25624dab2aa705b9b3f6d01bee692351fb4301c562e30a513f6c73d55c0bdcf439f3f62f33e42f7f876f5314cdedfb4526a075924c59dc03d5f604585571f7e69c7c8f254bcc5af0ced187401efacef8d61e3843d6c8562cdec0e87d00c8ca8060da3f031ab663ddb43148eebd67969b7fd490aba5068af837be962f439f233593d193ce5e08f7d66efb3389885927b89d2523 +ciphertext: 1a7b2ba467c4e3689e34b0acd548a2f12c8d237e4db6f80323b459fdc9d57339fcb5ad82c1cb58e8fea26f2c2ce0927a06c6d8d320ca6b55092119b86fd3fe65650cdec9b478a55a4060907bb0ce8807d964223aea9308c02bf025842e030703febc2e3e11fb99bac1e31959f1f0c3d5a76826f3c2a0e0effe131db6f0245d97518cd1177386bd7e06a5998bbf082fad47d0d7665f87642c4c7da2ce9e1f3c99e1e8cdab1a4c0df0ea0afdff801cd61dbf6d089d68d3188fc3e0a9842b6b019b25dfbfd1a5901448670194047496b70a036abc0376b9f09443497f470bfd9f44f0546fbded6312c16bd3dcf5c5416d9c63df9fb35d22c789b361f069524ebe04e237dd25c8cbc483956fc7e449347ec0d417ae71e6298fea78beb98ca4a7ab69f974c00bdfeeb40c99c102ed61f1e3d2f0250f33d8c73d74612448881c0e4f19824da0670fbd504c3e9cbff4cf41784c3c77e1acc326247b63425443759a203084be16fe8b48a4f09912be9e9db95572ce110994d87ce406f04641b5f8bb17e95cc62d3a6fb2ae6b6371e510356cd68a1876a1d04c4fa0a4b7a2f9ccf7b822e4cb6700ec5071d935dbb67221722b6664278f62093f9638759cf8d6d7b48e08310f0117c1df0500aa58ca8c3f719b84d9cfb803d5f5603bd06928375f137f98fb3183bc385888efa604f8921a9d3fc793e47abe8d7c5f14f143ed6d98f3c0c3e714d2bc2d136895dc140cafcb083375445e77f3c458e4992b245194436d2b8c395e9c46c499c03d35f08d0526ba24072f841ea07f4225583b05045f61484cee17f85b95e4193961562ce7b75ba4739b3bfa1349818ce3756d4732a85095ef613ccc05dae62c8d6d7181e213a3a601f0b9e81e2863fb15ab07f88e7bb58eec3a647fff17c2ff56db3bf13d721e2e9646eb05a20f892d66ad04927cf63293f8db9e97e8cef9c26583a1aea7cdf4ccadd9c4832971d669543a29fd9deae308131f8caca69c3f2a42bbccc57aaf908789211e64f7b51776df405e12803f434758409ea9acfcf4c5f4461ec2df8df49d993766d50858d0f6b7d0def70b4103f0a38a78fac8031624eaa5ed815373e3ae522f3afa3dca39fb9a75e86474b81b6fbb994caaf62cd35928ce5f73606a88ed31643a6cc2285aceb3b6afc155aa0a5b4b92d6e2605a24becb65b15883df261f9b273ddad943202085cd780f4db60aff972af293384b9d85c6b3daf2a3cce8490b7af695308c097d07e41afdb0e2337cfab9bb097e61d6c9a038b7203b63b28c1224af0ae62241fd9e2a17bf0e12f45886096028993372f00ee59c5b55ad7e6e9f1048db860e0440445d61322e8805e15557e2cf4de9652e109cb35d8e652dc06bb19c2420ccc23abeb44dcacafd9829d34bf74d66c67e7e9adfb6c12ec99c5ef9c371b8169bbde8fb2ab0da650937fe4f7c145635d84096076c17c911a47da0f35ec71b1be995bf500ec1afe7fd6e8aa221d61ade2788e93aca60223dce21cc98257a2c8460bac2649c7f57af835495bc7c2d +result: fail +shared_secret: + +# Private key not reduced +private_key: ed0c4dcbcc3305ee646a04b9675b94430b49a83bb1553cf11f99f8c47785c914f2bb658f3399df40ef5078dbdc5e5fab737c647c2d80e42e64df5eec489664d5bbf3131ceb4b4d9c1d0f96bcf7f2bffab9d60ba4854c98880dd99567994e3375e448d69be4dcf1ed8e1eee34c109d3d0abaccf0adf877ef2f28894f5275a8a8cfbe31681113f738f99b53af64c6b346fca17febb38b665ea616697d42b34dc546dee18b4f4b525db98a4897a168e5be9b9a2fd4f0f14858bfd666e177ba705fce75d8674ea48fa23313b7e372be5a719ae3d41f488799fbfc01388958e339b2438f95e6b24a9dd71dee5968ea1090aeddd56de6a1d465f7eccc46f79877d93315fbb04ef3768c3c256ddbc801dfe7ecf99ad0e45bbb585b978f9794dfaae36d47bc8a2cad9d589da65d604ababefb36bf78604d33e23a67544a79fb823e970199116b5bef80fba755d6cf72965d7d8bd8b438936cec8a1e535817dd9eb2fa5ef5bf15003b6762735826ef38be5d391c8384a938e7098929b7870f883f1903c819c6480ca9fcddffec969e4a1ed4a98d367994394571ae93a61b4336d537140887c7a2f90a196b01bc7c30e364618fa371ba975f49b4637f9bfcc7bb1ae789156c4ab2fc6cd62195a44c7572c09f49c3b951bf636b43cccae63b82dcfbc4bc6a03ba5a087c53433a9d5f438db7a89e86b2652f368fc1865cb6ae4b334f75cd7f358f2bc69cd2bdd21a7ac35d9f6772ba764b7f157f5ee38cc66393aebf409a069ed33b00b4a4d04516873516bfcf42ce93ec073c366e8534e4b55feb9d6dbfd90eee9a1fa5ae7e61a644ce5453607d971f6ea2b7f8ccdd7c1e80f869a28a2ade4cd245ee9229c9cff8dac664bb2027ef5b49ffab34d989e79a72dcf6207ea4b139bc1bf6af57645b9b47f763d4a318d4647024c797b9aec2d49bbb4857cd137ff56b8342c4654110dc84bd676bd533e9539d72e77a8f83e64fcd8443d3d79c1ab5ede33d5e6c5c22af691a25ace01436e43d56e204b4dae93cff827c062de354acb6cd417dc92bb4b145bb0649a6fb8985e03e4a82bae78162afbbcff3562b342f58e8100c5d2c899d4c196c08a2daab3fae54c9535ddd8c9c139e1500a38dc8dbb70c3794fee5f7a54d97a84d7862dd7b418d1d16c417e69d5eb994edbaf807b9c7bef6bca9065374b856f96fd9fe0af751d2dc5a42a3adef757efc8f76303a6e65c4cb17abf0f97c2969ee39fd655d4e8d22427579964500804fff508ac9445c388a989b3bcd9637d41741c30b433a0d0c8ea5adf37753ace7a89c1dd0689cee8663ae8497e9bb885436021d4ba553c706faaafe7c8478e346cb05f80e27eba2477fe850cb80e59ebe2195749a8cac30355f5b386e47a65b22592a1f7b09317cd6f3449bc2faba9cf711e979e899af706e8dfd05faf28a68f0f8adf6d4ff1ca7391824d447e166a00669929c9e5c4aa507e49672b55e54daff39f0dea0b086b65fa9e4ce7995e49e66c8ba70c6df6ee2745c2cc409f4dc56294a9d4539101cace02af861e3e924d8c3f7f8f4fa8bc552bf6b70c14fbf01e92d25e7091fac862776c9a33cec6939d89b3d13066ed400552c195c702bb9322378a13ee44a0f956d743a9918c149231c6bdf338098c07f21064775b6700ed30fb2153478b67b0f344da35ca35e4b7c289a503d5ab9eab6e374279ec8ab67b2264d7b9b80d6bce26098a305734e44342a5078597f3bd574b931c3c74461c8da856239c24c576815f7f48cfc026baeae328a8207f5091cb7248615ac076f12763f8b63c0b75a1ef075b6e1c61b1c3bacb9c8895286e30729ce083b90df566ceba4c00e06214c295ab2b95e2b70032e04422572c87b475a63b53fa84ac9fe3c8bdd3cd06c13859b263d22a588b8126f2c615e3a705e0ba960261b47638a9e83c5bd3f791b362652290c5bcdcc4f3c93909431a4ef875c5e30f0c311e5e8344deec53c3b4bf584932f168710f66cbe718886e2ace059034fcecbe39d50d012c0ea26b8cf13807f1117f32661cf997145470c8aeda68022ccc43d1bb66732f5966c11ec221ac678bcba824f43c3eda94401c17c4877490e4393404db53a27b1dd3aab78e152a58f3741e1bb1b9a8202df64434ea9c5a8c9fe7584ea538250da92295d3a4abbc3e392a36cae9af1cc51095b2b2dd97ba7072acec4b7b83bb6d284c5fb3fb634ab3012e8825f8748022d8cef7367ae46b021df68aa8239d06c09fe0555e07dbc356293d41bc4f1e133ddca95d2298b2aea88aea5637d262390a79980220095d7116447c5d5b6ba2b962c794c899f45860658a0a530c7669134519a501e5a0759f9a50777a2a6dfb942f98b50067455a7b692fb1cdc2c10f64e9114b29cbe173ac4fc2adb95c550ae7a55387bf01ac3c45222fed7bcf9e240a6d9b0d088c032aa9714a6a55c692635b6911d92353c68794be250dcd65782a6674f87343a6654324f47f5ac9b384b22766d0c96852753a4449e08371d5128f31831ee766219e910b1f6267a57bc991da5b2b69a5a9212ba06ac917d45c9aa25bc1b513f7144217e84f1693360ea0690e51688a704c45cb6b1071a0e9a130abdb6cd3b52b8a429c33d126cfc10c73c928da9507aab00950f37e9bba0ab981394b137e337a88249100da175fe9299de1d1130381b3fcd265f7b36c00959b5bc2c150eb7dabf05bdf590e32e063a01a7cff6a9a22c56752c8b948502f3f8ac5ca444e10bb6bead1c7557b2bb2e37d55646455162806a7778b1938fcdb7da3e64c01c4a36a847b77958d27ab9defa6256b6a30a9b9962175c13721cd28e979e0d60196ba8c3c940aa4718d39a9b280486a6c2264640c4b09642499957be9642b6b545dbcc868098332fb103d75e38eb7ccbee64a341b38b0097479c019257be03d5d290e89a6a6f0b61039b128b46b02bcd750a9496ec4fb8dd6378e1ac77aa9f37a75d072d268c365725926cc76b58b9da040c173d7732e1401ab222553d6aec7911d052c569c59393997372e548086abb4de201ac1c17f25d76fb58c4ff3380cc5965720b989f4aa252623c215369076e771fac786e7f0ccdd917da64126fc610eb76948f97a5c3116869a11a46e612d9df04be0b1af0e8c8bb46607ea4bc4b4b04b3f79a30a2a154691a79217537b97a7dff6ab4edc9e2ad6cd97d3aef52837aeb232f799a3ce30a6adb88f6a0aa73fea00bf0146cd5447c6dc483b4955a0a3c241e7cc353c2c7085b84c5162a49e7d61a2d0e85a009833f3eb2305d7d435e2a4c81f358aa8d0dd50628096f43cabf1c47e7aaada59ded4fa8ce378ce1d9eba621ebfe8cc96a111aaedc4b6cf0f4dff8e56f68440836a072412a30d851ace2c7c6f02d60e7a8420001a63e6c6 +ciphertext: bef3076f55b44ea1791eae3b2b28d4fc20213f11983e57b7baab4f674de12bfd5fcc10ca13c4996002b08fe7cbaec7a5b6cfd2048af1cdce87ebf46a44167cd5e31619f89f61864f2b6a613d25781d4435ceab63a9e36a7e47cac50cce866da5b5646c45248c9d9fbea2ce0a676fe7477c09d19052d3705e75b119204c155be6eb2049a1d75d6299568c0c5531becd0a852303eab69b2d0a8cdcd54b9cf61df91db58e374a6af5cd82704ce859140794d35de86c7e8fa63b57821b9fcb3da45df3f6a39bc2f5f600358f83e30b9a492d1acd2351f6ef614b9a4393ff8c3961e62c754cfd1fa877534130892a90ffe1d91262daf0f23dc0836426d6fd2be36c979fe6c0d75eaf094f23cadafebeb5271d544afbc2af4bb54c4524d2bc6482d5f82b82551594cd0780d37409f1412bb7f9bfa0428de5ad074cedb4531187db0997adec9d23bbaabfc9b230b4c14dc9c1b1180feef555c012ff85f78d24c0f26443332b7c0ffd49e7d511ad1c97d304a22a1188cacb3b36130589d8dab536a6f107e0ee9c939ea9f95552a1b2c0a14be0fb38b6d8df01eb600de3c5c66996ea5de0ee68eb24a170b6e601b65bcf563b8639e3cac74f50c6729e38cafbfcdcfc48a019eaa19bf9fa44fe254283e0153d00c4d8232bd3a621b3ec7a6fcf353ad767783c1beefe4f233f1184a67fa2f552a70c18da11d04c941c2c8e5d5091dd60b3d420baf14a941be26fbfe9fd2866b07ff0e05facc01f34fb53597cbe5c8e9ebfc2c6de58884ad77825585c339e6b983cce9c08ab7d2b0a55977d0e555939338713a09ec9c4783f29fb8652a688b9f3914bc5118397d9002a041b0ca41e170c52cd1cb8076731329db332ad3dde234e8a7adf5ee3e27bc905474f6deb6ced6846213f1a58ed38b6969e7b2bddfe679bf0a0ddbe2c6535b6f4ed57b50e49787b99ff2147af091f5cd22e3bffae0eee925e824170ffc7332572bf330b0ff7478736661284a69ff0e43347f40af1bbb11366a1a03beeca2bce132e06cc6b7538f37573820723aea8926a3be13a7f7c73548697e3b4f87ac0872472bf94b8396671bbe1542c869f188663c30509c45deb7fea82312bc4c8c5952693901275414a9e7e3de7649a8abbb9ab172189fec7b79beffd7f752885dda73a9d1ce2f707454bb13905cebf361a338c13dc090eecbf90fcd873595ed951d1e289a98a3b8901976e8248e3a16ea05536be87129c1bff0f17696967b55ce7a73cc7e87452fd5f72a4ec7857ee82338d7b8d8aa2794f45a2c0b09fc3d69463e86c1678da047ac48adcb6178582c78ea3d48730466b524acc2c339b5bdb5bee3786c7452ef23a3e9c9501df43c27668b7bec57fa7df4198d04a6ae90a895440b5bea8cd2aa810c145e95c8ce51c017ae55341228a75c3167b93b4b0667d6a91a4b66bcd98c3598634730b78bdd9539d60b9eb8a5af2a046c2a8ca7c9618f845b941f920532fb0726898f8427148e4f5117e05969e88788ae6535d20058239b321bb33c5d6b7c1a54d7017 +result: fail +shared_secret: + +# Private key not reduced +private_key: 2e497feae75af2ff80ac0fd95c13f1a019e1d60d8bf8b4d42ba44691367fccfcc2d496cc41fee3a1dd56b5468b191cde2f6f9f3264797f0c3b647865f4d782aa7dedf6bc5f04ce437a23b5d32fbad406874f1459f1f9aa3bcd61a20677d9d785535cbe7073667e4c916725af4d83d2cf76bc3c23ab89666a2019625044a8bd954df6d68c2114b31efccb7e9eaf07f3ad3faa852e4e62fd847ae8beed8f2ee33089b93088d6a9237ae3a9949043b10107acc9345c17697308edc6c3dae734f6cfbde73c6a09aa1c8e59c61e79ea8b9350abf23668849b1b7c5a1e8033f969b9d34b354b32bc0b7540d3ccd2995bc36abe45cd394ef5724b058d0a5759480f4ce6f7f463389bfb36bb851864c48d97fbac7204036de72cb0da94cd2f98a1e53cee630748a8cd5838ab53b2d33b0d64ec1be3ea2bb8d3f52d56174f3534c9820396f2b70ba4778886f3de5aaa78ed64688490bd601e7d97ba9d40e9e8a981749f752ef7c7bdd00b0c32e28976ecd97515cfaa1508fa79497e1db9ebd43ddd4b0ab373f4ea56aa9aba24693cf9c7939cb8734cf7a87d7eda2aa4f303d5c62e5edfa3cc3f785bc0ba83daff91f8787fc013ff122e33fce87441b473961cc87629337cd4acb5367432cbc7407585a4ef463efff88963f7e883604a19ac2c46389f2bd70607f1db9ce7f709a797ed3d53046c4bcfd13afb40ed83f47d0c52b0f88e2daed0b1c3e813346904978d3bf6bf13b4a6c54c3895ffa2266a9987a4c8505cbd950f8ef7963c97e8d575549559bcca5d78c99af532b31a382567a6b1e8c56babbc5873e44fd8ec642f806b6f69215740af996b0adaa7304f516a5e7d1e48ac1349c3442e4c5258fb9d19aae42c4a6ddb55014db30ccc82e7d5578355b7314aef84f872170a6107b5f008aa47988a5a79ae5a6d17de308c59bc73dd1b1f92fc2a41c86967b4a3b3ef4efee4cf327b8dcb9b2efb07b9b0e5858191164a7a87427a94f3f81e6c2e84377af5cef303b7e90696620ed57c15bc52876c45864dd78854d1fd7fd2e530fbbb9b13b4d34cc38e34344d5ed4ecf544359b93ccb0338bceed9e9b938d5e1cf0661f6ae81581f62668afd8e9f705af3c8fbca6afe69a7dfc6af9810084933c438d4de95a679eca3f04f6fa04b614bb973d899bb8748a767eb112545549fd8ff98931eb555f8308ac724a8ad09a90f119f19d3d32f50e3cdfeca92b4cbf23f5f8ab6abb2947d361baa8f74c3a2ca8a29d6a893fcd6e60979e351b4ff6247b8fe3923d0df8c55363a9243cfaaf37ff09c0666aa7b6c56b17a63fed0e6b4c15cc70c59dcd03fa4dcdc72df53c9b1bd0d2383e7f4833510862986f793fd7d642ca91e0aeba6d97a1a36a55fa6c9d73246a3a3db31fb644e34579c2866fc4c5671667b0ddfeaef82bcce84fd52d766673b398aaec441cfa73dfd3b463e8aa018c4272fbdc3ffe5618f9acae6ebcaf74d17648539c766eab08d48f5467d446912c98836055496b1b7d777cc82fbf557665688237d4a12640ade87d0cad66b4f3405177c9e1f4ef624c5ae055887d68c97cedb0ebbf54dc3756d00bb8e78676ff62a94f94fe9f5774b5fd7b723577c84fbf4623b0aeff46f87c53944cbc8e4458305ab8304a53b5c47b42911ba1b011c4da11c08b281e625f6f37815dbb1f3908c4c1646142b14d846b8400114face5cba669179ef121436a1975845652c5cb4ff62fa0073738f0264401adbb78b44e61619977804aca17deea16bad48655133144781b196c2a949bbc9aa8714758061465a9cfe09f2a1316ca875523e07fba515296309b6b7391b8d192012278d684b2527318f30a7c1e598a05027409f65a7f36b57f693a660c7a9f2b0bc38420128b87b005b5ce7631e4a10ff858831cb0112f5b6f04334565563e751820da374ce2819e4ed9bc5a959eedc4052c502abc54baf3fc0e426b77de7a274f81451070042e70c19a09421454141d2600df76a740423cb887065939cfb657a76785b35a5868401cb4d88ac8194769ad2499f2f20ed2a188e8e47e918cba7342b4c8893fe411b47b058b0070771161970c4331ef67be34bbc4781171bfa19d51e11612f93cda611f4ed88f85b87e8beb6359eb410e7175ef6171faa03e29e11ea8a6caf023c357a87afc652a00cd422020295bd34170068d31b7a058800026a49fa1f7523ebc5544389cab259815114d4b01d089d3cff6956f5d0b5a9fe652825b1150e21d11f562196892ca41941b46018ee73683e008525059496a07bb029737103b729b1fcc13ac3236b47c63a6ed4458a9724ef7b62361e75ba726be6774cf6b3572657b2a6abcb69182cd3b880328bc4f52c075c150bb22aab08cb2326815712ae20cf1f257b9e6ce0725782e9590191b2055a45c4467c5e7d70c35b8a61a48a317022c298b612782203a820f2161844f6a6fea58ca9f230713c701aad2700bdc951fc9bb8f560db9e99f2849afefea6c366c982f3680dea24891c631a1032d9d884a5ad9a11fa8331be85f1c91c6de2b4143ab403b153d9dd714db314c683ca24cc45f86c2276058be32ca1cefd4116ba386069856c6128ca86a63fbf6c15e876d63f738f847a32166b1592c3307d9c6190c5c42b7ab756ccb394c7c26c28fcd158bfdac9f04c99e30254d500cd0da1b9f2b74823f14283a888bdff45ca218b89b9450fba868ea9b1a5858509137160db31aa292863ed216aef822123c294a825e26fa3adee0291ab37c1462c89a4981949bb764f4222b3527dfd8a715682d159ba380339971857272c7bd7442cb73739c450b58cbeb6936b8cb619654037856935376acab92026bbad18c512dec4e19671180599e01651f008c3a04007cf02535ad7608e1e9257fbb04e419976294702e84341531b95e1b20c2b152a4d849649113c69a8f379b5d72aa86e01a4c5202ab2e276712f1131c411d4072cb45147c562c60080c56eff7aa7d90c4dc293b01ba935e345b88faba62dca043d94c4a666786c35f9318a579a9b67e429144240d206612a6d802fdc24aadcb42b0db4251e06df92a67e632aa4a29000a77cb2fd2959f851288464c824872ae6a9fa1bb3a71d8879e303c51445956ec8ae49c4ae6ac4de2047edbf3c0b23a29b8b86b83cb24530b0d17739331292bab85868e4a9bcbb2b4d4514e52d9afbf66172ae560c08c7f9cfc0c98ea4ec9c785ffe76ab5098e9f3c5ead6a7759b529661b50e0368246c5afbbb9b876c8072c1c1ca63a4e6607fe4286fd2062614fcfb544fca36edf0785c37bb6f5fc33e2b9d9d03a0a6c2853cbbda86e7039b635d4cc850f494d42b240acb54ab2316791e9ef5b45f1d2b28f7e7a15a005f92400ce33db073d49b53871594a88fc45e0f94207b5f0f2dc +ciphertext: fecf9ab93b18fa40d1b385b0932aae91f8287348567fe0cec26bd6ccc57741ac3a23439efe62a433071d450e20818cab881f8ae2ff3157734d81c1a5296c7c75e0baae6501ff0631453303c2250dee03eb68f57ebca08aeab1a28ecc829ed08b67b78e248b54572d307bfb0e38c8708bb63da4e421e96381741a6a893c2ebd13982d26e223fbdd194bceeb430b8aa6b2b15e7fb3691cf4d5145023fadaa79e63558a9875d94614eacd3ff5e143dd9d93cbffcb6b6472ece3e56e6d7253fd2300b6863f19eb8e222be62a91386d21d9046b78ca2e04a38a5f028b657e26d222ada33f4ea5bcf62c191811f34beb57668f4057fe21509cc139b56ec566f8bb79157177f0680d4e5c861a3a5838233085cd80bb193ac3e06039f1fdd31eb5a025fa55c895feed3ee6bb484de762dfd614bd79f03f25fda91b05e74ff87c61132b1ad280f58e3a8ecdbb043c46d57369143d1b14ff04f689d1ae905ea93444994c09d02af7ddf59c9873c19d38ba6a66bfc1afd284e598091e5ffe6e6c3d3f0a3cf600843e2b2ce86ba6e08ca9f9fa5340472641ca84fdc047bc3c09a18e09b88f8b835707b036dc18a9ac1d03bec88950648f08cf55c924c7610fa604b686943f788611da45824f150f4e8128fc2b31a470ab59142a016a1fd7b95361ec265e3542924524754142ddc7b4feb75e849ae194888067257dd1f00c8e7f532fd06af3dd6d87191613a591707851c1758b81d41857e9a746324f9e5fb64d9ba81c33e970de17553050f639b94be0f5c4677e98514eece20663ddab722e72a6768312bcab6f5c36f1ea51f67905f433c5ecaf4da8a1af5581351d62b3dd46bfd5db9df29980ed7e522f48f4619ade16c4f0662366f0c0c9bc12e08d7510f80bdfe9577f93542341f0811de4aceb46c04b70322813d5e1ad9068c017bf2f769753195004b29c3cab038dba1b579c59e18fdc00026baf842b5a57b91821cece116b88685fe95bda154e2fbde8f49b288a2b50a6844fc2066e8be7c277623f1d8afb734baa94e7bd58013ade0aa6752307950f7a5f233e86369c75b9e34ba32360c52d1b58de44fe2945db78368c1137af9f9fee9c53ae99092fbfbde12e23bb7cf3cfda6c9ca09a203f6360bca6ff06afb3f040ee198318bd14a7dad4da9741253d7df92f186c801708aef95d53131704fb5382bfeef8c5be3071a1e606b9566632f065e3f2764a0c6ccc0c6e0f34d0b4648bce1cec4ae3d8d798a8c29effbd8d0636d09fc5d14b8245708eea3fe701249cece51ebcf50578844da1221624499fe6c3e36e91a12e1cfaf5b2e7c55706424a94be9b0c23e11f3196857e5009f915255abbc7b62770a9c498c8d7d53d0bf88450c563450fd54bbc9e3a731b0ab5c8015b829735a20b01d764892ba436acda91f9068af1042ffc82d1529d8be20bed87d43bc9e0071c2dfea7d57242eea011fcc43e6a96fae7fc018746473deb9dd9c413afdc90735c0a7660ba81cdfca11237c81afc46ea4eef1af1bd654033911da5e24270ae +result: fail +shared_secret: + +# Private key not reduced +private_key: 66fd4f6569d4f41a6a885356399fe638039eb865e7c3899ba026e72b8b3120c9de4717c520dda6a1d8cb799562e2ade128756501cbd0d4b695e11ccb335b6fc4537b236c4fba1885d8abfde494f7a65357c31990d9955ae83f3b30244a0f296a259c5dead7f8403481f0745f2764d1c958fffcc3cca44832c0cd799164cbccab87bf04b813c3f802ffca915a9b35e6de34e95a74e660441a686c89397d9e52919fe989286168b6ce76e485c956e79dc484ce6bb94c9c375a899afc6932cb9876796bada31eb84a2deaa4c5b837453cf8aad642d9e722cdeabffea78bdf8007ef5762a65d23664c79c87cf79cbf4ee380719d5e8b66ea254394b9a4a3d40bc23ca6a2e98bafbebd67a34c7f451afec9d4e9c98e6fb71ca46d177e148541d3ab6dad4b467ed7ab1cc94b584e3c3198da418c56d95ecef07d653497eddbdc8033679d82eaa69a4c4872233ec12ba28f4f870e4a43c3ba3e0e36cf7cb740fceb3af58e904017d51c137d702c890e1f6f7e7bed401bb4e81a4333d7c8ee5cb8636a98494ec6781741196faf5e46d5fe838630a680c773725495812bfc45321d6ab13b52c2d357b3139f9495c2d4e4a77a07518fbce87185b2be2355dcbdd66d8a418bd7aa5038c6f0d4a3e6ad74d409a15fe77ba8ee76ccffc7c21be0116737b633f851e688fc3f79d16dc8c35dd5a73780e87e3255e6498fc5dc067ff2f376cffebc723bbe80d4eab9aef5fa1e08cc2a73b90419a056f3fd660c7717884f8988d9df5c42921871a1e59ce36aa74cbcbd9fb3d69897a0a87ee3ab78e8482548db03455a58b127dc5daa0cce8a5b5f401da679dd4b68fb46fb6a94ef97e61743b2374d98a51ef8dd3e81c65ecebe25e38953e972498317c5fd4f5332d6b74210d783d9c461453347f92dacb6e4a3316af496cc68369db08b15d3b31b97689aef6cc957c6c4724faa6a0ba8f859e961c808aea88862c85dc6045b57f53963d83448b228847384754cd45dbcfde5e6254c065e63a61cd2b41988cc35e1ff7d963c73ff828d333c63f109047c65ebad0aa56d3cde36efc88b6dd832be9edcebbb9ec40cb44754bf664773d5466ff0b868493e4433ed85761c3d82ef669ac4ed9e4ceee343ca24bca795eccfd6a4fdcc37e70a74a02415bb732ba880a5cfaa2fb10e4973078ed9a4cfe0b02b691c8aa4aa4ef52546a77c2d6098ba78f6e478176da29b0dad993d7b76cac825a534013e54002977bb8e50d3847fcc5e3120f43b2aea6788e5c17bfab456d7b96a1ca2d217b86ba5b8750dcdee144717f5b34fa842779cd9183dd482c99571a36a143d97365b7e377fef51ab88b1ddb3abedf2f39b4ef3fcecd0459ec3d8de575f4174bfd47b099c304c71e9db708ee55895eceb30cc8fb2be88804efd70c8b399944b4de4be164fa27ccd569674a40a7f88b9d6d982149270d57d767cd9a57d45527ac8d81dbb41f8c34edab552ddc022b6f7c2078edf078b0464b81b56d57296b5ebb3571fbdd0a82d65ae1eb5cd36accd66f8283554f38b6aa39bab98ae71cf0cb3664842686abe589a9321d7b911b371ec5a31d13a4e91d8e18e5d4360f6685a1e63fedf33a6bc5e6544e703cbaaaa4ef93cbac5d1fe6c77155f91195dda2b52c1bc4ff328c3732799ea0aa8ed4229e9a239e5b5c5a02c1ebe98a381dc56e1d4b56deacda3ac52b1088805476c01609a0a2373a4bca788227172c4431b000005d855ca059b4e554d3dd2103cbc7854a12cda368ce202873f5747450c4fd994898dac5926765536662c81581ab4db18e9763cd5a747659440c9a33eac713cf907ba0d5a875b90882de31b5df825f337b46451705658915630035724c127c9c4b48572951770241993f777145573bc70125d35f1b03a121d09ba4388889568ba109f04617360826ad48f2765944232b1cf636fdf3c39c40ab87b4b50bffc1019eb0fecc35cf7416ddb3146e275cc7ae209269a7330977e9dba9caf79c99e30b8880525caaa84401cbde7ccc0fda4b250b7a2a651b3afc123eff52eec55650029af651b2014f4669de319435b7dbedacc173c3dd1f3a8597b80c9c3869d7389398a2404e790c9463f2634cc7351bac9d74b62b73e7e54cbbb3ab235c7c1ce298c0c0369de33224ab7b03517856e43cef2d39f1d325d1e221998c53631d32a57a880f24476a7e89f8c1b2d1c49759c322e993cc7effb2bab738f2648bd8133208ef26ffcac76393714859ccce0515d4a7192ded6ae5e828be6653b05cacf0df1b4816a972592089ff88fa421a490ca13c6789639c909c4db18ee43a01989c51b6005ed2548ae24ac8cec10bda7649e6c9359c45bf0ea0d39f25bb1ab3c3b5b88cda24caa8c7c7106616ba05da6727896d2a895835c9b83654b358e0d4728fec8a150b39283e345f3e06b4680bc632009eb85adb811277926662e531db27b3ca60843a6370c304c1dd21a94aed90c3663c0948bc12f0a32af533866f5931d5c74423246c16aa4f01808d06a6d50444ef8a3171ac641e9417e2e025390caaff16c6703680951b1a0e5abceb8fca9830c9ce1aa08d5803280f31de3cabc923b5a1a7c4854d841729194d3685c03f975a72440b5fa01b11868a48bcb73794c83644d1d39b9664c432c7b3bc311703ec01d268a34a8a1b3dc79b9ae07b8cd133b7d4baba7f39b4088043e4a35fcd08a9ef141b78cb1f64841ebf894827bbe1ec47509817ba27cb42222272a00a633e1b2ab344bd3778e4a579ac7d64a32e2356b1822c1334fa0e6acb05798f63192ee20629106130a1ac330c6cf0200908fb37184740e5caa5ad44067ac7930f696bc9226235d212d71f57ffc2c8c185c1f3d717271022f2d256963dbac5c5a1404a71e3546695eb27d73221892b5bfef114d6f88415875c013f16e48d3cdb68c2000a39a45263504e0a7554386d68a4d3992c9f6196015066d3b8282e8d3398d2b5f62d7af54698418862db3a84286f142a8cb44be011e0f2594d161611cb335bdb018d9e58cc71a363b29439d54cc6b293af33b0dbbcb80c7797819a96c1316a783f60f987a3fbe1acf80f22f610037d17247122c4ae2b2214638205328c43fd4bebce93d47c02b84e1cdee7cb48805396c24410d71ced4805f36a105b05c6564ec3450654cc0a12e62f7c0da79496ff2bc97b7b4809aa30d577a2f3428e48220239b1b97d9278dd26d93d186628812fc697d961442879ab64b4ba0be3c46f5e55c13222058b407c1694979897ca0615e8de05d85d3532060076acafc8e0aadd8ca7406c7bb316abfde1bcdd1662d5680b483287bbd3e61a91839cca9e761429186176b7bc64034ad43f16f65e9d8128601c28b1def8d393a0db283229f7c7383152a814e7cefe8ef9d9768c473 +ciphertext: 1776384cc4bc09db580462b981e07705f1b7af05956b2942cd71a270a994b3c9ef525863d3ca86596788374eab881474d88e87e329652bed8e0eaacf44b90515f0f729a206aca3d6ce76eae6d3cda5caa6ddee0e530d841578529750e4d0fcdf5f122b9f921a5a53ce6442a733ef5ffd7ef4e52c3aae93aab7f33ae33f3eed2a3ffa5a4422c368dc210ac246b0d73dcef478be9e15867ef752fdcd1db52b733236bc9ceb8660679f9e53f62c670c68d3effd8013649bbf5685a40a1199de8baa84e701eb4a6de909230f41946c9e08e7d9713e209899f0710228bd67b4fa66950d974f5cc4bdaa1c826030a7273787c1e1717639d0ebaffcaee389afb6f044bef662da9b6b4347b0b0aef9777f5324979e660ec40d43e0a17e5bc2090aa0bf1008ff02a129d3b1210614e99f607b521767c5038b138c7d188543297c405df6e10d618d41b8cd3a9a935e048233b6af27db097721ca8999d8b12602c0aa21716c25e09d1a1b6eb4e2e4a82fc680a1d8ff2fdccca10ce2e38ab36c48f46a5b419cae0bfa00a0a153015e9c908d8439b4accd8a6b6264eece46e97b507644c200e7f985cd6c3a0a024aa0bd18b44059ad74a8d6a1462cc9c9ddc532a803b251e73775435689f80d3f79690aded41b83d8f0ddaeaf4b1a85c1bcde9e17cd1c6635272c167ffdf4272ef8d6552afb7b54500426b2f612df941d540e596038bdb21d8a2188dbdc89a2a449a2774d1f0b21b8db290e96ce027c1f0c11a8484f857a069ef77e6b9fbe0ce163b4dfec7a11e49031d69a37b516b72ea4e1ce67ce493b8c052c30517ad79a540a0c0e86093663e7a4a4641d9d291b929c59c4efc47efb19fd7e0c3b6f2c1fbb9449fc18a9eedf70f71b70f92f8369f7624a2666ec7f26792b34b79c659f1bce8d9f86776401730ae70e7d4459f0e8d7e1afa9a1c41019d536f0e8585ce4f2e7c42eb34223607e9d8afe66707475b6a1e5e532344d8aff98d5e48b782510f064768d76f4e99f6bf716df363c5e2dfd724c78e5ab362e2d8dd3a7fe3b35410b25f6071cbecb3513fcf755312fd082ce57b1ebcbdfa6fff754a9f7662c115334325cfb37d21ccf5a096a221138e61e1adcc4548a7eed9b50d3e267d1bc6eb972e678b4c5f0fe3419f663e0d4525bb0bb5859de22550225f90a70f76fdafd551b5466d289a8fdd3f338d1aca2621157aef4c64ca9f256a8f88415a6293933672ec2bde631bc1723a362edc7aabe695ebe88d38de01f0eb15bf582eaff139b8812fdb3c7abdaa0f933b6724ab3fa77fc4358456c0ce509c0b98cadf2b9e8de3c9552d363495389a9b898b2b8d5fc97fb751ef087d69c8a7fc32b62d5ec581ee625cf4183921bc62685e976d41d9ccada44570d8919132114717ad1a119dda21664a955a3f355cbc9879030142b418329b39a0f392205c811d4baba6301d829d312f8a4cde5fa12052c02a4c75a706b8f317f963f01abe5d27ee0470afa619d97d7fb5b3b0669bd08b901bd9fb56fd4a5656d8d2cfde1d116676bd8 +result: fail +shared_secret: + +# Private key not reduced +private_key: 000d8a749ed1a329832189bfaf0bf23cc5789003528b06754014cb92ad9b7625359b2cbe463b356e298c95a6a24646ad6114900034c83f19599cede73846b93153aaf6f9c1e2feed4179fbf5146a499edaa8a6d4bc3bd9b42f30c6c44f5a1ad086b7c6890d87035e7b4e8d7bc34b8a23e968a93e6df62d7f2788975f458cb0db5a37d8dbb38f3270b3e30c18bcf7a3e47feda5b63a49a0ff8e3bef90974ba44e8730f4e56018073e0ed54924e38865ccd76b8d986257d525d5c32b74c81d4cb9527870600eb6c7dd98ba5ea7efdd95ef386eb8d47f0d7984102872706b352d2fe19aecefdf5df59f5450c36c4327e3ef09eb58938ea5910ee41494b50264719a84dc6d1bec8f9aa6d38eb8edb9f3309bd2dfdbb7c255ebf80a769c683f30ddf822838f6beecea8e8eac91c53f63d41952b82aefc4123bf4cc15b3a8dcf45096d869ff6f20375e2354e32701b8043b387d379864833e8c134af390e4cc075756838415e1a461dfd313b59d7ee6753ae6f5ef593c99fd7db88587095e66c03044af109bcef59a3cadae3e027c2cf3b350d28c1610b9bee17e8ee44c223ab522ae57b5335f6f00334554dcfedd463a00bebc61afc6bfc37c7eba6a7667476df78c3a4b7c486b6902e57e9bb7646045a7ab452cde7539c755e5fe390f0174154fe531d5737da4383213ed3f7fde339255a05dd4c83fa51190ae00c15c2c2e5de41d9be98c667049d3c74ad5680f6c454676917dec03da6bb4558fc588c6cbe57ceee09f5caec94fcdd96ccde352887d995bc50d0ccd2b24959f4e6ede3bb6dd70aeb47db7856d53c7623897a24acae747344afe7d53afef34a3a6c793017d6b22a3845f8087589ac311e0dbe84197a8bd6561fcb84739f4af6547cbc7839582ec75548f78579469cf38553f4d66027a43d9584508c7fe8f87a802ffb485aecba2fb62609cfb48c7f3bbbd0fe7d9097c87f5e04d2cba5f0b55cb0223eeb2323eb2bcd7ee9da735c9da37a84747a26a0f0c7b2877fbb4d3cc6e1fec3ee1c418ddbf6a663519907354d2bc106fb72a26d7a0905886e39fd3a7771669dca57b6459ee6479074d1e9bf68d6e782f904be442858fdf7f5143e8c07dd715415f29adb7632b5bb2ea9f3d4fb49a5f7b995ec7b2ca7eb0be3aedc7ffcbfc344d9c9ab6536b323a68a0ec97b5bb491fcbdac20f48873443707da5b82d85f61c98f076f6762bfd4370fded1e66d5e55f874e9b1c6947ed37dcaf85a9be3e8f50e53945106ec290e4144cce84e7ab57fd496a1e3a9f20cfcb0cdfcd837ac9106eb3ec39e99aff93a7afbe5b9e739c64419ae73e02870f4845d3f56ae573c5daa9387f88e56c7e4fd2a2c7a051964127bad8c7f8fae1edff0944dd7cf807b748d6259f495bf5bd42f61126de4d91baefb38a3fa16d70646c71e5c6e07e64aed28eec46bc0fd4f84631ad38813834ce3467a0b4b615496b80681159f62b843f47cfa8f4b4c364833b074a467eb26f3fe475aa1eb6734774995e99745e4dc5c149fca1f64b3149ddc33e8b149c45944370ddff2bad6759454cc4ae66d3019e297d6468f8734dcd43e3f078fa0955d69d9de0f97ca3de54b2f48d05f8f96c53af7e52aecbb69bc1c3cad697588a4004634fc1c77215f0677879aab3e63b51ae7436c5b47370e226eb4ac15dd0281ec65c56b83b60ac42de17b1374d1680b76460e294d841c1062638cc003d043a26307c08025a594fa3676df03c87789a4499575948b2574f6931673936e971f2c79598a1b7b35d28103252b4df98c47f6afa057bd87b1cc516722fd72bae0f437479c1ec6f68087453e23fb4381e5930e5a19fc9a267565b1dfc7aab9c13441101e57d9a4a454a6d1249c3cdba091113d0f1b257d0986f23b4fceb35c95ab05e2911dfb2899398808582a6b1aa9950eaa9c87c8bdae7372d46c2852e85c629c25e05a169900b24cfc0a68661b6d44c74c658ab8c00c756861be79272339a60828b9f0b8a325850b41950f97849dece714c494ba9bb09b74ac16138251363b52dc166f220623982c19ef565f80583b84d0b91267ba98b63afa31160f65961181951019419fc0627cc48de9d6b2c689969548641009cdc56b02a140bbc4a995a7f2593e0213cdd2cadbccbca41947fc8033baa1754a8815ad52cc31940451f8a62dd6b39e22a6b0db8a0f953c6cbca43f9c1285315f59ab9980ebbf57c1457dd8361da04e0eda771cdb37a6a54c6a47719790976a957978e198446320aaa840e0f1c076260e75e9a92980891aa6245e003f1fd6363d0b6e5c73b476b77ef867a60b225a99a763d0ea80a4c61739875bce5c0f361322450c93040b4d6c08120827b8026ace0ec73302fb6824367ac89a0e7df45b850618612ace284c2da4421689d8c7034113f9a1b2342736f5f11cfdd7ac7f8468075a4a2d7960dfba9e264514a8d7c6d11c660cec1efe33c04b4681dcb31fbea47247bc83c581b174b0cedcf0bd0b7b622126cbe323986b75a407e416fc0032fa2398e504967ed021e993a955713a76365ada810f9bec7ad1a6929a466f08113cfd6919e014085d4148be060ebc014fb1fa3a1ff70a3ad94baac7be6c96bc0f28a021e39cc6bb8a6e16312255880a84778cbca55f4173b2070d527357cac69c22587208496af1715711f76d5c185807a13b2c791b91f54b23ac8b66b71b3e211e55180fe7a1bb2bba7f97da8f82734ef777b7d2653e66e814ed7871da35c95761a88a611bc383add9a329706212b9780ef5d53e933c99318ac47e26859f507bb50597c3ab1a252c77d22a817b402b80a63532f21a0f296c40bb8021732fa9da01bc60bc662a0754914462689de756a397e2384c2372130c5a6f05ae6c8b81ebc22125830f04d3740d2638d031a21f1653c4f664cd182b11887f4784c27954984af251c923b5c2ca4f1777cb3eeb7a13c351c07c4f5562b4a8a477fd348bcb9b8e6bec787c2340c02c0dcb236fe8d7c6ec8bc9d156b89bfbcbf4d0599838263ad5b90fc155051137d6800c898c8a50b82a4e3940bbd3bcde2013889bc4f3a7022d7c49370ac8d826a3aee946b79897bea8512d8b899a8c17e439760b58859393a5c264b5f1549940914fe278a40b6c9a8304775ba30c8ee4cf234ac56862ca2e935691e426923973c32b4f2408cf63c99d7b2c5f0c5aadbbb9cb98b53f787431fa73542c5569e5f5ccf0e4a868cac6529bbde42a5f1881ce0a729e6a531b0c401d4979a7425baa8b0392a8ca9374323ddf2794c237e38e45a43a5a34cca2875d19217ce7547d2eba6bca38635cec71b814aaac223f748d13158dbe8eb902d9125fdc22202c4d59251cbcb6d75eac6c76ced1b0a025b40a55440712ad8424672e761e9bc400d63812006f +ciphertext: 8ad5e238206e4068fe9be1a92e9ac82c41d247e864cf81e6006d6f3cbf6d7be8116cd5afc3764a34c2d8be6335745fbcdccc3753d787df7963565f8aa09faa473c3a31c86757e5747e5a309150ac618d96dcead932a7ab3bab72c6e2ce24069787052e998de0bc8f43ad84a48717f36e3cb6229839004f07f6c219375aa17888add3b069ca65d4b83b05eb9e83e2c2a053142dafaa26fea7e995f126079d20d1393df571160651a3602cd56422486b4dcb6ad4bb752eaee6af42128c17fcf72718c527d08817f6b2406ec25d8c86cb83ff644c3bc4fc9400d4f5f6b6c43538bfbb16033eb37428592b7c911139561872ecc14e0902c34dc540b3f232a2fb91f4b68cfe3f901f96e355c6ba7126617a8c8d231e58372912c876f8ddd6e1ffdb62934a96e9feb82babb4c3e4312fb6dd64550dadde1c3c82b42f129e6825464552281810809747f64887e7ae70c56d410e4b4349942be418f7e3ad2d85afceba02107ad44b7bd7f8505c50bd259e0bf20b8113f7eb6a209f2b97154b0198e579f66784fedbd5e100389c8e271ec01c0ddf5680c536d12599eda6196949df9aa66116d71014d79d3a632ac09aac8bd04cd07b2775cac35d158ce012a6f157265c06721ede539be6c87b6ca44e41eedf50bb79d54d3c77179ae8734941daeb930a299808d5c336bc954e0fc7341681c3c2c7a17f21eabeedab5febd906cf3c77f52387fab180a24799b9f4438810933d726a990cc0307e6f5ef94e6e7d7d074b7804d944c2f9c341e6d925ad96baaf83f4550fb30a89591cd8e66496dc59eb24405aa518337fafed03ccba8a0925be546672978d4e49f068e9fd6216cc9990ae4e7c785ae005409dd512d766dcbc8169412841521ad9a7cf48ad23c075cc27eaab6b62ca3f0a27f6583f1b6ef541b6a2035eac34b1ec3cac912d2dbe1daa6a5e7165b9093a9b8f2c0a3092af78305dbe137176dfad210382037a7233aedcd93a4bcf0b068406c0fa618cb7b4e2647ef019757fc412eb0b7f7e8b454ca0d46765928d2f7a468f8d4643553483ee671c9476ac712c9aef32e357867b95e5edfcb6d93f013e4b7d764dbd042e5133d5d5b083d9704872f841cecac31c46a4394998678d48e28d725d27d36f7e6130ea21ef6f825a2a3f45edae4b773a7b1afb981b24dfe59c181d6f3568db716a58128e546c16e42e769a62a5fc785b3be87aae4104c9737ad0aa5853ae9ce38014c51c31c0c404a0b67c7ba501766cf864f0c38eacb4701c0b658546d38b32726bc1e1649ea02ad05f4cf5c4fefe235e58e3e8ac3984a11974fbf0d440399e9aff212fec6334d5a1db23a63b0cd46157c7aeb39cb9c99be81efbedca1ce45e655ce37c3f10938904e5aaa6a144e5e2d838aa54a9a54c3e695e2171c1a512b423f94183eb3c28545ade0558697e3e0fa12ef1c5a15b123aa4d7c14c8d6fb60e5b508c083a5f93a35fbc9579f31d1968f4a9248564ecf4cf9ab4ab8eb016a82e3aefcbde9202eaed915519e346c25f04424d5f262f436b +result: fail +shared_secret: + +# Private key not reduced +private_key: 4b49dd378cbd598e8696f39433e9a34a56e09fe98b4f8d6a317ee9e32eda5ad3993f7646214cdb27dca918f6f4ec6d90930baec87da838b5d1e8979c1f3edf71dc4674999cb8c9fcf0bbe011aa67cf5d39446957be38a16dd6837966f1fde5ac77e94c0767ffb2d95cd0169803db5698e47a6ef3c3b11766f095496ae846870a68d34b90335f790286dca97b913d4f490496d63f0ab27afa8b92b33d88fb6653dc6ffb3b55b3a9b5d3a9b5f8a9e6a72743966eafd9ee72f63e3ffebab7587649d77563dfa7da413daca239b225c78177058c9ea3cc388a3f5f2732e1ecd0c11b936e65833cd9df55a7f66e29846bb7dae0239820e47426b8a09289f334f390e399469ffe3ff34def9ac94eb42386ff98fa3be8ba23f473ecbf71ab6c52e6bf6c5eeaf03c0b641835dc8f3fe6285cc78d7da387fe935ed4e741bee4f5b3fef703b4a464d143165337f5bcb42743e574b93e6fae2318ee2dd7c51f9f3ff2ef5f4734395bddae016a6c4508da6cffaad943d27d1594da8e75ca1e43e42dc3122bcf170ee07ecbf5120e882aeb94d6b8cf893b7c05373cc9bb3ee59be48e2ef4184cd5c116b6c178a2c7756701ee5b8118e4506df4c9dad4a3ecfe476591a7c79970274f113cf10e0dc19896d202b4d8453985a3d9b5488bc61f4c8c9384ee6e733e1358605c7afe30e7d75008cd5297a5ef6ae8091e43d69d7d88284ff284804b276a193352ad3ba5463383a0249090cd5579dd521d57bbf8dd3cecaa93ea23f65833d7725c62dc79b7e9b34bacd94baa6d8463d7ff68ecdeef0edcc3d5fe9f295a65f460ad368092d3bbcb2c9f9e2bf783737e1c4bdec054faa7897ffc75471b187303a9f5800e9fe5d73afbcca9b83932c94360613bf97f3a84eff9d278a4de98fafe746857ac73adedb6b4226667dc779285c6987cfbd3ec14a0040f444decd2e76aa6d95392054be762585470dd959c8a6d969cacbc8d9115b339d6b5e75795d2a46b833f84712d0cd2b7c35776595ad666d59c4cbe72e637ca5c95572952fbc772473d42d9ecc194f93c8b577a231ee6e7e58bbf5f76a913f4c559fdbe3781b623585b2fa77b2cca946dd9ebcd3ff1947fc00562f166e4580df30a764b7d1cd6ae3a4cacadf7668e445ad7bb07d8e7f4e3a05613541967388c4aea784642c9a5fe8376c57e8fa16bc98acc9d8521a366aefe8dd95569af96d994858236f5bdc7ab9655a95d28a956049c7365c84c34f33ab305a35ff3e17a563b1947658988650e3c65a665e66075db342e7295e79fad0bb567054b2c1cefe5e3ca560b3a565a58d9054fcb27eafeec538a2cd1781870b19c63a59f43fcd9b384635aff6be642036221fe5c3414a9c208fea81b6e626ce9451d9a6a1ac06a07a9b8c85f87cd43bb06fbf19cd5c5eb3bbbb3be723a8e04b9a1f875c0d645412eb8c520bec306cf447628c2f01b3b6a6a89d8c849f48832f7a9662b8c476bd4f6f54b509b8d37a63df3a6edffd10394cffeeaa1d5464ad4ece6a6e174b5f8e2e367713fce03b79ce67fda3dfb3291e7bcaacf49c37f32bb535db799e8c2a5630319de99ce503e3eed963fee27876447aaeeace9fe5d5db9d1a3aa9c547194275630cb7644bb5dbafcc65109cd59f7084e05cfabe4515255ccb724b3388239ce1ba8c631c1e8c0b444baaa6ac481db8b4d670ab65ca27f33a92a11c48f6ac038f0914637b749d8b962c00ac8ab0c019c92960ec3817f34840aa7b63b19826a12234a81c9faa8995d28c4d4c44a0fd2c51720cacc8751bf6c31caf045a79c6f9b15c2d406c11fc3b5df6638e1b83164175dca5a1260a88c74b4c2432a9b76c39d43597ce2e3ad1797c25f967868b66bcee9b6a4d1b53fd09540220c7ca75943c52e3d4a124453499c681c1fba4dfe80919bd9467bcc0ab34b7db6012b18b3cc4c679e325b82518baf5123c88786745c4a0600a302a2a367b717c3dcb4c32aeb4770fc93e0213aa54b2c6a37a326f121d907278203724ceb6cad8717fa3a2106217864274e6220061620052799ba22675db36863b2a447e5a62b3d2511ffc83bb34cab6cf7356a27c29798c00cb32bbe1023fe1221313cc7ad59144fbb98d0182bf0183b44990da81016e2995206f2b0af19c8e21b1afe8c98d608c0c7e52075137caf22c69dec4e0f1763c8bba263898b30946663d84b5e0808e6ab9a6df970d2568303704d4c651c912b7297a89534e324fae62628580becc3a2051cca9d5757d5e53ff8fc242e42b2adb06cb2547296ec8431fa6eb8f7384fa559f9284d528761f9a23e85a0bbb3e57b7a876d2d4934d33838906606e6da9a311c15cba30f39d05236892462824bc4a4b4d6b343e3594fd9d68972d99eb26538f9eb1fa7f0718aabcd5dfa5a670b0f8cd595ef7a082abb518fa34891a4ade983877a333e956bbec9a82a19650866981b8b8c406e22abd784aac085b6ea553e30409ed6b39b4f367ae45b9fe109c6ecb51f23d2a755caa347aa95e656cf45a15e9438b61031717b3551e9e3020ccc330f254e82d89b5e4839a9f8ae267b9365aa228786a371859d3847ae68713df98768a1c792adba39bd2359198224376cb9c011777efc4aae1c3d179583ab0952bcb5b1e8577a5c476189d3301bf87fd8a1163b81bdb4a8368934ba4867ae4dd03d40c2cb5f974a5c36a8d699546d831095e7b354490838a40900521da4a00d2fd7117e1060dfd363593ac11bd31ffcc08c1eb8806f249719751ea3eb328d3a36590919c2317429d0486266968cbc6973d483015b77eec543b7f971523589655732bdd1783365761d937266a420ef3b849a630ab5a4003ff09c116c1037f4576c58adecb5a5e0899892854b8971c9b76685164a14bc5c8b9bf212c6c7ab15b35e25a586e465ac05f3911da7063208c3df46923622402559ca963a39f003ac0334ab19d02ed58c990ad983318b33429acdc637a8393082684c517b75194506bbeb9686136a3c8a284c852ca747fb709d4533d133b5798b50c1e59f9e99781fca9f447340705c6cb7e2231e257f95d681805b8cdcf3147804405f30b4ee63c1aa9c367eabc3fc606306616eefe91026507780e6339b209cfb7a227596957b136e1cbbce15fb9a6fd9bc798c40f0ccb7651b150d281d78b3508939ba836ab719cc19c61860bd3c624827ac26639c05a39c88a1873204175bf297561723a16375dba51947b83e46e84899377411b2bf8b743cf8dc23fd2ca07d11aeec1990c42a7321ac6f01cd866f8719ef21bcc0e02346fc5d8ba3d3e7f1fcb52d37551212d647af97825a77f2f4b6a45ec1a579f9f83e89c025d8d6876db26874f38348604293273b38bddc18488024ec90e62a4110129a42a16d2a93c45439888e76008604c6 +ciphertext: 29172b06b0849e37c10c1a8a719b8111a2e5f7cd0b195e949d0f664220f0fece380d03ff20aae2d1f4403a795910536638f7de4b502d497bdca8386b51734a05dc23c64e5970ae9bb57963088669eb327c4238ba2cfaec2d177e5b199b82ad664ea184db6ecd35ee97f0a54f2f933f9a04383188671497a5592f4b84a8fa3e5700d28138b9d3c2c91d104a73037cf3ac5468460ab1df7de05a90e0fa6b4753059b5287dff997f0894825d3766176c2b9fdf767ba065e45e74b6c706e47459433140ac59663109de28defb54d4752147623f5621c3b48fc4368cee7253c128140d4b1dbd8afdf87b9d58454062b6b3262018e37ccbad6bf27f4f947a9711ced9a45644d3ba3b9d670324c639c9dbfe69c2d783327bf7a99aec3730057e1e1547818c67b0e96fd48d024590db6cce338b32b06c9ccf81ed967e2728306cd616d44884a2e079af7058a4eef82c48214e028bcda3b44ef696c1e08e441f28728e503465a138dd7fbbde562ed6bcee8f5a3742d23aa8c5ef32179a1c44bbe41fd153ad2aa57eabaad87fb0e022aaf3b19b1f3a649079b74e7a61e32128506160e7b5cbd31d56673764bff84aa46b99cf1aa3eda04191a769d5ef2d569fa4144f51cfb9c02cff06495f95ab8ed192fbe9b363180bf90a52c752f70f4a587381775544635c5a574244ec8a88db3b86ca46f30a481ae4179415d234596e2cd24ab966fbb670e9255eb1bd3c261592856fd9ce541be9a3b06e157c5e4e165cf91008c51d11ebb064de31e3f894d6d4d46caa0592df5dc0c236b546479119c842d3d52deb75f966a5d4050e01f7b16cf6b93fc8731e5055325ffda000114eb7cb6d7916088fbbb8ecdf4ad8cd229ff036b2a6a400ea1b375c576547cbb0ab91b8f6f4c71555836985b3cc979ff56938d9863c4b0b75b011ce70c1a60b77b67988237a2a6b6bbfb180d36981f70eee891b6c00ab1261e7a0db824981b5450b09cd96868c611f40a6e5ce6e12a31934e56fa334c3dab7515e7c185575b2798e2dc9c50273dac8bf1da90fd8d8d5272e5dd24b87f57bf47ab79c8094fca322e50fe3425b0c570764d95a7690785b7ef62c7f4d6154a898955bd19c808a3222c1ecf67f633267ff61e8ba97bb1dc0b648a1161dc2499beb5db7bd621f263884248b98b6fcc3d9bf3c4c4ea5a3f0fdb33534c15d84278f8b5f1d2e98661623ca1cf9cde7b8e834431ca82c4cf5fc2be458a1abbae90ae6802e6adbf6085ebfe11c1622ebbf2af755d8748478bdf1eca4059ade7275718a4df81fa74810ece57e38f10bcc954be61720da461f86f4ce2f3771d386d836bc7c720255dbf7aa6455170300e7ebc2773dd996859b53757343045178c7893aa36e4f231ab469af10cee8cd17b612c6347755b0e6d3a6aa451b34df9349228eb5c76e0ee3ab37633917a4c20554b2940fcfd041ad79c19634d9626ac3411c76e74756da3109062f04af2430de6301da1734ace93717b51b2eb1545d275d442edfa35ed905eb1a99dbcb468bfc3e5048120 +result: fail +shared_secret: + +# Private key not reduced +private_key: 5e49938e23a5c65c89d4d4d917379cd2a5b5d32881a6d68c28b48a2e356de63896bad68acd4a474c0cf98113afb34e8173ac4b1d3f55136c73a00c7128b59a5014fbf4a3aefa0e5fe01ed8b01cb702dfbf659763722760494e651e3a964326a23b038d0af855f307413236a3ef95b4434ad164ba6bb27a858ed9b22b4ef3458db7e559ae9194aee9945dad45b0a5e85bb486962dbe9d8c5fc7d4b473f5f566f2779ccd7973964966592dbc0e93d7457b9af5844870ca580eef3950bd92ed05e3310b970f5377fc9de18fda8517b5b16f3ef448ee6e3a5a5de7587ff4bf715348d3b938f90129ffb20cb298d666cea3c5386bc658c5c1de9673857a3091b4e3cc69b2c8e46382ac97a13a9f32cea47f0b6f898a84dd0f78bbbea7863746c03576231b59ad36e0e79a93376eb6f23c63eda4d4de06791c087f42abb7c088ad15c54ab23c783068f6ccff63d54ebf63ef3180a79ae15aea1fc3ee116bd2a974ca7025ad0c634067e4d82a835bd274a44b2e8fa474fcabfec4d108570c13bc3137468b6d37a17d9f0d0d69444cee80bf822a38fd09bd3053a6f8448c5b0396cdb76c89ba1ce3f8bbf902d44191ad342ed5acc88b72c3baaf1898d561f95196f5688afe854b4cc348e6d19f4a50371f3c175d332fe471161d5a086cf591c952b45f89efaa90d55c6c888868c30d75291435176cd86edc5d08cdee454eb8b3867b8a93cc9fdd7ad71b387ea3363074e94363b780eed6ca6ce3f6b585980664b3ad36b83dca517ed798e3b14d176e2806671968e82137f157e8eea65d992bd76876dff736e7e63c0eb6e353cdfe05b63bf5ae02a68c3f1d5731d8af5de9d982bdf716ed61f8d3b94458e15247bd23137cfc165dcd5cf6d065a28b84cbdf5be7b1a9a27046898d5f9ba53fe7502abbafd68bf6a9dd2e1d64a7aabd89075891678e272de20feca2cf7fc0e1d8be55f4c0ebf7cb565b492daaf370e934833def25b5ad668bdb90fb31dd9df4e51f3be6733217488788a8df5226e16b8dfbd9ceca19ddb419b7859624f4f6289f7a55a2126e5398575755b85360bdaba159ef015e7863d4ef50ae871dbbeba42599e8e54e8f4c6a55ffdf5125c596ffd99439b0402794b9fa3a632b4c789c9cd56e37772e8fcf066c22e4b12dbc90ff0b4d08cb7033cd7603557ef6dbceedabca671b7b08afcd1df6a89ea6a7dba65e145b9515068a15f7d53d5a4b1323cb75a8ad0d6ba3885a7e7756dcf19637c1b6c3317f558819eec2fe58484c6ebfe43b4f0ecb5424bce33758ef1da439cd621dafe7979c958ae89591f69d54c4a71719cd4aa76da6ac4ee4b472afe454137e8e65a5807d55f492eea0788a570bb3723d43836205dd2b26b19dc696f59f452bde3501c3bfc81766dccb5034ccc29d5ce524a9d00aa458ca6eaa17d74cb68e9a84135cc08e81832748917c951a468fe71cd8c1333de71b64b7bbe58255c20aa7b2ca8a912f898574568e2779ef8c5e7426cebe2cfe83401cc2b0ed8fa66afa1135a5dfb9a86dd398545eb61efdf28d2efa35a889eab8a57283f58a57e552ee5ad243f8c7edda3f78a1cb9c836f3d4ffec75ee2fd927a6fb642fcd694f5d964af46d98af40639a611d4e4e180a227ab843cd49d4970af3b68c255512920773abae9a2e402b154b8159b63b4885736e63632313b2f99db66fd4307d411a66871c8ec859807205535d907c3c6541b283824861738acce081a14e8047a63cba2f42c71b23157c85a7763d3cebfe93aa7fa0a083284ecb7c4dc16c8119b5d90546a461a5b744b1084f120bee2b548801c381a9d561bb0c5c35336601d1cdc310a610c8df78de62477a6f26dba6038ad04371913b831c326c0537cae530469292ce41c40a81b92a5c04d69eb0303b4b38a5cc45fd2b0ee90cff0b81474d0406c8b34b34c1efb596a704ca4893949614762a30c54846023dc3a345268ce55c0be97139f5f733664a58b67656ea211a87de01f9cd902a9295355d13a15bc044fdc77c4c53f671a1438e283371b5db5f82fb0d789e877b6820771f0ebc64da864a01caff73c4a42b5416bb043e29c7b2574c6e214a352f4401d786b4d5351a2559b87ab00ba84511bac1a099b1b33e8cd45da078d447b23326574379dd3d32ddb22c6a4037fda719fb104c85f0264ba4a9ed0287a31a2af6d58291676a37c434ecb234e4e1c648fa0760da57abe45703e677fefd03687415132d03252291f02f3901d20427904511f9c11a7f07041302033054605e97fb719a2f70648a2c30a0b42899b195ea8e6cc96610943c3276698a34a61893ba8770c69cd55f1bc0f00ca0e04177d0469c4833fcc23a6ed339acaa91b6e081692340f53cac66af5a6bcc2391729ce4e1c88d5c2610b00454fa21e8faa6487022f19f2c81d5452d5170255108beaf3979ff9abc2e04c8e3669c6aab80e2b6464644ae2189c81fc92d50cc56039cf5de2325ae5163a1b63652222aab35e17430d16477537f867ba4ca0e9b1c83c61a562c6822e61bb1450426e9716a77c1934ab17ec69563b8299e6ab371d996849c8cf7a84ca1a9bb654e1ab20a81d65314595a52ba18076f8712532a81b00e19e8734968f87c03fa4763208862d9a3ca648582482bf0d5441fdb7c84ab237d9f8628ed2001a501339682f9b8aaf6606344b95342fa62e782c1d9560b6ad55aa332c1fd533a74d026a9c9757f0e91bfc96545d0b6477f31f95840ff0a4127b16c32b635471480523f93017577513ea96159ac60be179d3a09c5ccb6df44174de866cd7548339d314d160718f262edf32382915197bc2ac6e3a4f77229e22dacbdfecbe3f4b72ac6bc9d9354e7ed2c31ce7acd7f3a2c8b9abeec00613b1600c8992376b73f8c245ac9841ea06409454b48d8c3a152bb8d6168a3fa6423373651caa7aecf0a5971641bd66897e5991e793343b5190bac3107eeaabc71bc34788a345bcb9ad8a45a50a1dbdb1846bb76205b06e8aeb692b4200a596524954963f01c946131704f6b181d7781772ca6365824f6c6c22a1af3328a2c8978ea8d7c38f6a00f7a6b3a50c2507f103f72420bdf98dc19aace30b792851142d8b43319c93ccfa966d71cff9352f25fca9e8a3064cd96e42e9a2959c128fd532902419b81972838532cdfc08f34541459cc68955c9c2a431ba5126c9bc08039ca45533ad8108beba49bf8d56bd44433fe12a6c55c41f3cc20560b28cf050cc1f195c5e817d23d95e105a13555923cc21b13c9e46d34182974451bd97b6a3da440de6e5bbed681d6eea2c6822b361019afc8517ab7585926764ec7acff3c747479e837831429b97b7cf49ac3763bd9ebbe0a3729672816f3eba84c9638a79676eeac0f22c8a48e0c5d50a26ff0844c66b99 +ciphertext: 30a4b1190e0b9a5cdf304ab06e4654e9c02c055c4b487884c6c77caa6fcd02c4a01869738f01423ee82176d321a553889d4659dfa53bac9213386dd87e00d0ed8c763d73a4909b223922dc9bf600a30270c35aaeb8d6e5e21f47e893c28380f70b4f19114944e7413f657927314114915c0b7bf7dc289a21f1c6c9b3079342364899565b604348a97aa5cabce2570944d128d12dacbfe2dfe3b17146892f1956f0cbd14edd3d65531aacf5deb667c48c5c9b76f83238c49a750552bc4740ae517c6b82fd2444d9430f3ad1e4790f609db80727cc4db6925da917789a83989883847f3901f428d93ced25ffffa87e4b9940bef4c3bdf2247d7c17fe4227d8c3b5f9c3d99edb5f6bfc6c91bfacde430d0ae2554f82e0b53a67a8822deec1d5acd054af2869b992492726f2a7c7d7b9ea0505153d878b301db69919f39640e3edc5222bc98c68b844e7454fdc6f3bccc956843919a428b2c882675820569381bbcc03d9cb932a1fd616a0d593c8aa9c4119bdbd9b1dcb046ece8a011a91056a11d2b84321df7fcbbed5cd25a236668e5b7fe2adce9e82a9cc0039501e57826c46c37177c8dc057d74b190de9bc09bf2dd47a679adcc2a5ff518abf5c8b33b95e95445c778fa97e5dde581933a71bc31884c5b515dbec13c4672d3a5f04d7930f55512e951aa8106115ad291ca9eee526513ed9872b746f3057a2d0dd6255aaf3c16a32b8de76058c79001f7cd23dcac80fb2561eaab3de336d913802e968cccda34cec120f0721a9aaa2da3c36c1e372c382fb194889c41d680f6e1faff0c1ce8627489a693d5bded36acd30817aaf860c7691569b6549c9951e06910918b894317df93856d4a13bb52646e44a3ddccd04d1d9bb5c472d11134544b2b2bdb103706e7a858a559f2e9f10a8b3981f8f858705822d4343a2aac48d9c534fc211be40ca907e1c02271377e9c544e6036234a09387b457d4c5749c80360a403aadd35ba28999aa679a4009a861ae782a614918c455959329d2bb1d91d7503f2dcf0cdd4d16de8188ba669f1dab8514d6ea80f9e7ce3e3e556d3abaff2fb2f956b081e8ae1bd62534b0783f74c7d7797481d2687427b41579fed7f2194ac898300bcbd817270bdd5b06ce0bbdaeebf60f6a308d3dff2e74e521453752974ac951aae7337378c87ef11028ab476576aadd3efe613118c9e537005969676d4cf2b8b84bbf785a7ab61ccbf29586f2c4b0c3d3a4be23aa92af35df92dd23e8b8806acde4bc187879d29444e2b1ef31712ff714072f83b028d3f2cf1aaec3020865401245970f6391a45fade62f7f22920b8729428842e21008262c091178b84c3acfa870b43ba47f8f85088fdd326d8f4de12ea21c19f8b5fdd7df0988b43511ec21a9265c3a23ae79a3938d08404cd8105e3b039cfe5714e7060e6444c77296393c6bc88c3df42c0d644781be5f232479cbc5a736e5d403b190cd6c8d3f472255c02a7ff0505afb9942f6d346fd7eb717f5beada57293e3ef9282ad10ae9a3cdc3b04030b3 +result: fail +shared_secret: + +# Private key not reduced +private_key: b8f488e6fdc30b5cb5063ee5f097a6f21cdf6d5fd6522a50492991839f51a189c53fd67ae08a46769da38099994bd5a0b61d9827b888f64ffbf6eb9c6d75911b2a721d9f905f145514b3e38fae32e5dac5296ee60c27ee80c7f8a87b855a78ce550678eb3dd44db943c708962c25a86c78a29cfa801bae535094e98addd563fb46d2a9f74f18430d66cb6ed9bc89145cdb36fc18d5c0967d3e77ace4ff34459feefc144f7733c59bef3c8a6c24b5be5e71713bd74c797961efbe7cffb58b9ee1ecacd1a3f938e83637fc9b59123880fd26a846df6de5fccac29657cd2c8831ba761694f1b286e20639a98f13a0809d5c2266bce108f6d1c464bc3de6666af817c84369b7708f9756420f6321fb4c409531cb1a3827c8df2c94b1c4d36133cede69b8c9460fcd46c540902b96eba76a55e3bcb80ad47b2e7bd928e6ee09ce31fe97220ef532e7f38fca919a2b4f718674d4558dc7095f056ea20b4aa1aa18d354ac60fcc8ca250db2ef83f46514c41cf3945cd6a425959d1bdd8b51e43c02a834df3c8e085bd4b9695b2d25d0e9d5761e86c95c8cea0f1f783aeb6f19ee4e157881651fd4cf5a7a2ee8e5797a49e0696eea9d448d4efcb7a55a280ae468be96001cce6a56796218e00828be8c34ececfb82cafaebdd36b1945ecd8cbecab80e4cb887bc6e33fe75dd36437a3222f56bd4ed893eec360f0bf30c13f22523f93aec7ea6da408face2016ca03659791fde424143ee5ceca1b54af453689f8ae8e9906cb19d83ee0ba7abf0096999fe8917e4794c5be5659678dcdbc8980b76a4d5c5b8567d567e9e775afd1ca5f612a9af1ea7c77f896f8834f790d989edf3781588c10a7c50ed25821b4abd882370aa74bf299975e9c54120b786f69e7135b69f3bbf4465bae34dbebd3fe6ef27fb38692b5f3db5cedcc4db863d834c9abdbae738c56de7ce03d3ff334c9e2567e0ca791175813a8382489b51015bcb8ad5cb386f6dd3c48c756dd6f5133bc5557f6afa7ca4633bbb26524ae968df46ff33d7e6eb9e31df1754525d83325bb3f4f9ee41ffc599aefca1da3770f8edddf89807a7f7782ef16b93b41fe456307a81368f9ce7d7af349ad90758bace57af3f353cdda444629a596ee64d10a5881eaab06188f315efe89836d2cfeaf5a926bec7d57228844adfd3e10aefe0bb2c88809c47ad09c46624eb66ac6a023f80efe78d38e73d6eb9ba00f5984115d558964b2916ac04757e968bae6bc7e5da4e99f22a81f4f3f47b7caebbe3cd9bdbce68c931357a568c39aced0bd193337d95e9fddf2e5fdc5b6bd8efb14baf9047dfa601b9ef9d4635f985a393e4408d64be2315fddab3f3c6edf35d4a578a63cf6c655d55f78397e7ffcc0cbb4a0f53b9a4ad0888c742ccb474cca41bf4b51c6693767ab872586da6b470cd0dd76a038deccba3e229bef1fbbbe33b42a5d5f4534bd8eb9f6469c9822265e50ddd633efd8b0177df0c1340750ffecdfb593e477853fb383a4b683c78613999ef647c8a4278dd8945f00466deb133ffe173c47389e19b39f2679eb015649253673187f98828effaa1ce68fd7a339a9fce4ff7e7b6e797f616c27d49b8df377f140dad654ff0db93e5a314f9a6cba4e1a93cf066b6c6284b85c1ced4a4b17634c2dd8c758ee3cac74b2402460d2fc12d98943de4dacb2f5912fdc41e8b1886f38c6619831677e2a32a63860d2a1e9b994bf4f9cdf0c3c83c5b044c14b83e57c59d55629a9704994a4793a7178b69ac1892a578802a69d22d609a7832b55e731a65a1f29753870f8f6b26443824be227f578c6d97c57e570864092a66c8184ca58b1b8f89ba9c2a3e7a17c1bcd851aa552ddbe301f2774e81397a57247362426807f370ff2b7f6f7b1f5b83c2f3475cb225b71ca0750f333d72a434c88a902d542cb8f50f6ba8ae5531ce60c5c29057c2a995ced8a34cc1db7005c478fa174874bbb82981107faab591b8c9581365e7205578c55fc06b5f588c65e2ec700e6473752708853a8c9a1acad3c08bfd67c553b9c603206a1d26276e66c53a166398db6b2e51754e2a67a54902cd5839b97c66d2421df86c42c7181f89d2afae41bc116212a7492688424a2c81b85bf616ed686e8d0183c1082dd61c1144417dd10cc0e29b3168144064d700c2a295c1042ae40848fb07abf2aa7cb2883fb19454a8711c72670d8c0b152dc9cd39a108ad9348089754703a608c0b544350879ddc71c09051f92ba755717403130dc4b95c19d3510363a5dd620cdeb1918af90dd1267aa9696eb0334810b9351df981a0749a7e0c253d399a0115ae515c97b63a1b0ca42794e00ef59912a357565b427dd5aa54b706b0df583e2fb68ceab61395024abba0a8ba4ab6bae958d9c13eed40cd20978eeb5ba041b837595427a644a850340168847acbb69b8d6809b849a7d6a6b67c170dbeaa41be8341c6977dbc025688244396503411148458aa2800c44195211a86763c54e45345ac258541926b4bced6a337df4506113647828b2d4e45723d68985dbc2772a6723a032bb3b84a140a95dbc480f1495118238e74376c3aa78c25e3703ce121e8576c22ea29119b1eb5b946d261cfdc71980af7961961074584a7ed970fef29172cd98a3ea5550f994f5d763b00fd37f9c0abb1459b825c6deac0b35d451a9eac64b03c3c0139806586c8e0f63b8f77aef5b207d2615d5f296894c9a1eb0b68d0571351e18a20084580d98aef13bc4ed039d132cf015bcbf0270d5b971f10f581093656a091af7f3725a2e16c8a74c541345ede689321a436ac488b23895ed3e81fb4f25b83964400ec33c529350ac29f4876128c010ca9c4b6d3e47d7ac798559251bbe4bbc7ea4ece0b76e9f519d819b286f14fcadb1231067bcb113ecbc737020b47587c491fd26541f47ee2b6bfe6908c73ebc3715c58aa93484a5c2692598b4945209d47258441c2cde253434a5a1edc934c9762b2740795857e255921296a8bd4542f82bb6ac7e293f9e4b7890810a2e46511e241162b2af6e38c2a07b15a38a494f8412fc40d60847f957b7839e78936b6c1ae906089a80ef5c58e2659be2643083922b22da53912055f26fa7ccf410abc42cf21448290b168cf7c8ba20b28dca959acc253bfd4b67e60c0c5f82728382c96f78b48b4a4c746c32c019bf8c3202c46a7a2c9c401700eeb1c013bb399d9b62eae9a4e68e4a4bec7b7fb92888ee9bb5f52aca49b2e3f6ac6b72b2cdbf2c755f85fd14903d8712fe0bf82ac0b06aae9bea06278c21e6257bc96af0379bca07c78331bb014bb0d6489c14f5411051f9667aabce54da7a8deb73b627e3873d9390a35e03ff73e02a217659f53d8c47556bf3d8c94040f630d63605e2d0f923579370c +ciphertext: ea2ebb121065a8def00bcbe87f29aa3fbbcba6435b50a8f16958f1bcaf938c7cb7580d196069a8455de58338736ad1d72cb7332f605349a7542982e525c1ad949f2ca7d3c894a8947d122bf8c55667aac75c6d64ffe2953b49a9ca83af87742187865645af50f1aa12042166c5b4a9262ce9691e08f9216d0120aa227b1875e7d27a28084be0aa60f5ee84fecdd7f6f1fb6f45674417cf11c8c90646276f76071d75fd05ba08eb5e83a0c9e6153d97c6456fee5640d55fe47d3f8b3c162962aaee0e15b045e9d3b319c61177a3e316112388af05395649329225b8c7576ad0bdadb78a81f1594ba0c163edb95040c1249a1f43917629bd905bc6a16cc21da6e9e16637392b56d397f4c5ccd814ea599b074925367cdba7f1667ba4c2ac8eec4ec976905ac46a45453830d6ff6fe4d3bd61bbb91fe99e3b5702d9223439f6d91dccdba1ff13b9d31cbc47ee42bfab33e3dc34bae64435ed2fae7ef112f28fa7ff754c82b9082aa944456e23ae2654e0b94186b1bb697d610b87659805b4e5a4e7c043191dfbce990c54caa0a6ab536a21fa7316f22cd8df0fb4532c45930fac927470b4f7d7353e8d000e53687ff1b3649851454194aa3acbbf4e1a1fc549d6a5c60d08a65cef540015643c7d6c1d409a093d7a796f57ca0706ca323bd3e0b26353ab1d7bd8ec8dbad952f3b85388b100367d6989de5396e2ac46d85b402094420a1bc3b0d9b440b49652610be14e36a35cf6502689ee03104af750f7f6f8216a8080298e260cfe7cc76cd84a4b7b46836eb78116ddf30c4227b984db4f482ca7411bb41e5b3ad934d2662bfb767be82b95d31f7ea00ca02d22b22b9c8868b740ec66bb221d4b401ea7cc9112680b166d007c3e279fb135e1b8ad761e2690b72f2a8dfa6aa844864e6330c433c287f246c7269ddaa947212c903d8f08edf7625599486321fc1cb9df6c896e4f61e4373aa58fadb2e095a2c23fbd9eb507d7e8c622833851cefd0ed94a388f2772fe8980d46822ae977b027591c73c113bde9591cccfe77440c476560f59255d7c7e1a566a2a41479b6168220efacd1a866fa3d710eb061412538c8fd95d9d308c4e3fc21312b33a99d7dd270d7d0983b3e60cf72e630118bcd3cff1ac38331857d75736c15537fc8e4cbc01f543e8bebf214b8a45f6b6888d9c551e0bb3dc84d3d4a3ea8eee1a453d8a53f06de71d127ac7a370a57a89ef88f5291fec70308e2c5fba82a2af93dddb05b135d7c37a04e25822682dce56e74ce34bc5b8849d5d40040809798ca4ff3b0fbc999cebe11d3d7479ca18342c82b27ade902e5f6070b122ecc7037fdbee985fea2a04732ba5f85817e19ce8cfe62d86339fde475a56f7e5f5b1f1f1e7c18829bdfc2658be9f603d44e5a4117e2b274b9e3a74dd2fd001deb4f0753a842fe1ff41799dd77b051851e8f4b8bc2fa53dd754c872c4fac00c18768ed6f0cd285ae91516e6288b18fb6e50fa88c7b97c6b898f3a6e4776e1321a9c2a939224a4c903ec117f84518f7bf48990 +result: fail +shared_secret: + +# Private key not reduced +private_key: 1e556e2047c1be5b68fb2d4c0f36add1b8c00e6b66c19d695863573308f339deac4686929e4664b62e7a784f99e07d822cdab3e06c5468d8be7d8745f7569e595e317d6b6cea79d9c70b72897395c57494ab2d551b55d1e468f5028f60dd3e5b71f7fed31d49a92bd1665440346ae02efcb0ca3f9f7dfdc619a4ec9ea7a1651cb0591c53e804987395760ca688dd7c75bf3bf55de6e8c168b8ad735876f9d66d7f75f7eb8200a7dec4b9c36e296a7bf4efc8b64c35e9b15473337b4dd3dd6f794a0aa8cdd7ec65577085253220869fb2845358ea4d73ba89901f3f7f0cbb58ebfdbc26a98a5b8299c4d318285a26573ff928bfbf75915bdd518965bd346cf072157748077c16f562068be54ec88695ceb71e2d624f19b62f3d844da3dc91e95b28173f9df878da5d7fa368e2654353f99b93ef9ac6f625d3229a72558570c9e5f13db6834708e55a97985a8fe9df26dbdc1ff6ea8b569c894e2ceca7c3c86ccd664510ee3e5c4556db3c9ba354eb38ef6ceb9c7fafc460ed1373aefaa3d593b7f317b2f0f8782b76c18fceed0e8d41936f7d8657bdb0e440490b6c196797c0459cdd89eb82c3f9c6439d256dccf386f1a35bf63b7b46f62fc24c294be8b36c1184e8dbbd96fb874db45e6e889b3e92569c33ee7f3eec3c5b28766d4aff4d06475bd666ee0ddcf0b5e4d9cd6309934ce5ae91805a38d7d69d0dd9f6eb68e10e9c5bee187d0675b36af68f6de7a294fa7ca80486d1e561d28c8788a75cbfc7e8bc84dd131a83f9e64f5b484de82775b2b8762dd568e95f8e702e3a198a8d6b2eb9ef668b49b87e8ba97ae468a379968fd28f36c95c96f9c84b23296d5bafe0869c5df064f1e9c3c2b65975a93aba3eeaaf5d746fa679c5ea4df1cf93ce71a8b45fd44ed92bcf44ede72a8589585b9cdb7baaf114ee8187fb3796efff4c60fc5b7e8d6871382c63fb3c7249d3d59385c7d856cff2a3e38a3b30b7be3614354a502c7bfa3fd76e0f8affc5bd6d43706f63d4fa2783a96f552a6bfdd484718815f9eb33d851c6d91b69e3984fe02f76f68286828fc767931ceb4a3bab3f14bb159dba32a4d1f8d95d347b3450d6cfd2c8355db369715fa4f3884df8ccf8d389ffd09352da09d33b6484f8553fe15336a78855107df3d9c9a42034874dbdbeb25a6a4517a1add7fbdab35294fe6efe7e71455b948103bee4fcb7d635723efada4f7a3dfa3838e7243143a7ebecdf5ec83cdef059992efceaa37835fea57ab04347e86855e0ebbcebe8f8557ae8b167b5a4c7baa945560a276ebcf4dd8b6c6b23c4e7fa8c39ab55791f7d3a3568ba290df3ff8cca8f69657a2d67ce23465afb4b3517b5ab8dc3c81dee78c6f617e87e3b37d21636667f6da47268e55faad6a1f8c93f39420c24e3730e5b70a3b69db5edfcf4ffd748c48916851d78c8ad5c5bdef8624df336010f7495f6be5c6a78cc43b660767cc1e77d5b7396f31c8af0b35c9826c185569255fbbd80ed533767c89fb43d1e38fb0b9b348e03ee7dbe571aadc1dc2ecb58bee71046ba9409920f08a4a7eef856fee3c427b2ccd4e93d1e781d06e4462f9191c6d283eccc3b05c49316c144a8b21e494d3deeb11d58391bfb7bccb3a95a0322a62aa889781c4fa3c36f765586b2c2a20cac081cc08d06ce1cea6036463dccc34bc294a51f7b1a5dc0778c143f57b9ad2c8b41a3b3a7e3317fec687f50294158ab07441c119c299d421b3d6cd62019b4cfce69c9dc5509856b7cf087b66391793e7b2a77262db0909861b46b5d4c23fbf134ad43622357a81cb7c9f5ac9cf1c190b9f711164a9cfa4892927364d800ad7fa2888dbbaa21b689d4a20fd0ba43f27386f90026322705b0f1069b32760802581231c44db0a43753779fe88f3a824f2ed858211bc172d49221931c3e86188c287a093b1eff20af18c1004979221c85c2ebd5700473913d465359ac18deb3055075386ac3c330887879d5ca762b6b576b7f2d422f23889d51788cd84b77ae879b1eb7026dbcce20cc94f7857aea148213c1ce857277a7808857f47e45cb9b561b80895142463bcfab6c69a7712acbd64a3b6721aa9671aa934cb0c1bc52b464603779fd6ab10d57cca0a749f3a1889e10386cb7ab0bdb86ccb02ea614a0966a0ef2699da6b7282713874f36468c2014539bc804911053d1025133975e591e357a8d88a1c7138a200543a90f4aa250f44ca61870d206a236d1917b509638fb6442aa7b886a54fc21b7c40a1b7d027a09863ef94280c67a4693d28a0f842ef2268e0a67a11bdb4a18b3c459e11e977a5d143aaa82b80520f72c50d248073746662b78ff685086632e304085e9c7050a754b302338f7a2af0a223e45730de36074e1843876a6b1cab85e0d984ece18a3420aabf4d740f6039dd183c57279469bfb9f26fa4f6ae59db60532372b729cdb8bc8b26b9e511234177af2717538383bf2103726c79d84b4489d493423f7375c273a9558611b60c9fbec197047566ae9411637ca9dcb956962354872803891c728429fcd99c02ad020c11a2f1aac40b6fb13fd6c8508500fbfc34d752080536c150b402155e130c3aa1a4e914ada0740b5178c83a67fea746803a35c36a3cc034052143303bee180d8da097b24c89fdb16583b972a50c89b5ca27dd4aaa1002fe2316940a7ab294b02eca4c69957b3d02b538c239f18a342aee0c15fdca57d28930a62096567801f64c3452697d5f4a66781975b440ab3b27a5da41e889928ff41402b20b93f992db6d4216a4a2b169a6952816d61b93a82c5c0d5923152900be6b9236ab96d076b36d406b06793c7c8c85d69f423774c4a0c143e27673cecaa38c66c1dba02860cd305214a2637a90cc84a7aa6bb919e73c06ddb787b1b9117a2c6fd577a7eb417d5a34922767bade412bef212694373401554211c1213ac7bd1d1cc61f40fdbc65b89ccb3383c30476932d738b181b64e2bbc9508268c7061a4731c659d18749ec3b87c3741d1660d10978cc91ca44df588c8a0a7a68670a003ba23f03ae733067139083ed33c98dac4c06331e90b59514c7005e27f179a0ec8517931b678ec849789c656b30c4a736209e70151cd970ade5557f9e6872248b94c894220c0bd1b6a3a0149c1bbb8ba4c9337aba868b78199929044f44018fc261aca4bcf0f70cc1444411fc8cc3b6b7aa7ea9f8d06a30c7a61d89c19e7c50b84a278a921b74e2936ad07ae2b17344356a8e640a9a1392048cacc817bb0924682a027f2cf6ec9b36aad177faedba70e26db0e2958e3d520d23b10254587c9a546b5c0a567855039f6c1bca60414684e7bd1f8eeb7913f3a1795ba4bad4c9f684fb055ece19459eb464e91e126a7a6e3ed11ccee0046da234d964c985110 +ciphertext: 5be4b5826337373eaaf9e87d53baafddb421fbb420412bdac34c5a4c4a365e7815446854bcff6f7f793578f7a8506b97adf4256649e957c6f3dd74338be6592ceef2aab2500ad35ba05eac5c08b70f196ea618f20b05ea81b9fdb4d76cfaf91d6c243e0d93d315a7c86c420add20f23bdee5bc67421797216a78053bf7a7f5258d6ac69bd06329f473270c480877cdae2784f833356e388cf0a0bde65f97cfae05bea5c149c9fda694c5a9767de87d3c9c4c7a3878fa0c2355a78cb32a44d1b80a83a2fc198f21681ff05556222af755343c735622feb9d4df7a561bef9f4a5d3fd47cb6874ddfece4870da971425aff3d8e9ec8367b97395a8a994f96695e721bdfba993af105d365b42b29ea811da19d4bc3c288e1f768102f9eeaa0a3c7a5b5efc67f3d7c70dff5df5883fa3a85b60881ff7f37bd2b73f2c160e0fda40ca341868f7b630577c4c4486b96004c980be59340ed623b50405c5732d4749b37458d0b230e57072a97ceb2f7d236f7bab0792a3bc151a786f77d8f266dabcf68cac9c89515cf15dd262a0e594246b3568ab250ba1e874f52481ef5d48affc7ac10012267e19f6eb2f57ad7a16da8dd29e26f6ea83f3b2f732e9ba9799672ed967d029f0b66f032c28ad3195f5f071e0a91e21afb721fa32eedc62f80c5dbbadfb37498cd1779e07c0f28774ad21e5e7c91b4b9196449c0773478712e43b6dad9639695d99355116956e180074f41032c332a6445d97ef237d89cb198e0ae225c13521833ab3fcdd59662fecd184c6543a73261332e713061896578524726ef15def3cb125224d831352c73d731c8def727d1db7dc668413d2d99527340f9c3d7065d93cd3f6bdd405c9ce2f7ac58155b4009718199c3fcd1c5bf5d8f7247747b74818b425839e9b7e377769c36e241580a17437557d7818f38797609d5c66fe26eadc06611f3edef762f0c34bc729ccc9cea1e6190c57d51d872fb278a6baffd6c6f8a446b707b707195979fd10f84d3a51f7734f53633c83ef6a210748f382be3edfea8e01f247eb7700644ce9e80399564839b4e8d8ba34ceac158b9664acd9bcab6d81de3638cebe7a6035e0f3165ff882e2dc57b1caa11c9d111fac396b45ccbfffe67c37274d4859177470a3dbac95c69061c963959d58c6c8dd219c360361380d5e8bc8915123e98a24d594e2d8127e918fa0e41086ca306715859a80ee4e547d11361fcc43600d79f312f8b42d38efd3e6b008a8e5bdd381cdbb6ab046ab4c1352c38e16ef981f0b0f3aa1ecaf84e166e68492aff7ee3132d598cce0b118264753b65c39d1cda91d487584da53c9baf49c249debc9de95a390815b226503443ff147b8852dbce76c2289b8818248b15b8c814bbd2b8abc3be7001343f82ca2073f9500ca3f2262d5db43fc97deadbc9aacf0d1cb941773815f83cc24e0f0a17f84d1029027c08ae735807fec4e3735c8d3fd790f45edf2e4a80b984fbcc544c118686c8f0ae66e3fa50cca80cf858744f330f6dc5dffe6d215774ae8103 +result: fail +shared_secret: + +# Private key not reduced +private_key: 244cd3e7374a7157b1f1ddfc4d64fe2c3ea45badfd908592f306f1c347511d75daf8ca8932c7da3563ca126391f178c7c1477c9af532cf1897de99bdd8fd7c0e3d4f9029dede5967899ade7818622cd76724f77c4d83f48bf679567f6afde4c4e53dea21ea48411d99b06be96b4c698575d94b44f1c2c4f9cb83a99b2a7bf5c784117b9e8f8cd0d9fec801b66f645dfaeb49822b9fafafa445f1fc7b3e76cded3d91cbd474d10ccec25539a658a1a48b669735fd2854fa36f7d578c8e08a8d45c11e8468e6bd05c664e5ce9440b88e0e847a15ca747e9990d995cd427fb5933b58ff7d62b97eca02f539e74872e283abee046c7e15372e58455e4a6de59bbf716bbb634e7b6e56f96e68c501e4d07e1a97b7d970b5bcb8a9586fc42433eb457993e7b15d7c35dea5e76b19d65a1a3f61734b9d453ff1bd313dd8c0888a92f637dea93ab6eafe5e9f7cf07ca9512b4e364ae6591c578ad93639e795cd00339cc5b67176f771fa6c5496cba3071b67ffb88b72993ecea38f4e8f44d94676e55ab3e484b0ad4776be5ba4a99766d74ef8828b74987f5abff8a933bea697b6c0a27b3b6a2fe607288ddecd3a4c144cbf1adb11886b224de74b99921b29f0320ba51513fed7d536f5b352975697b9ad5855cc78d7979da443a06d443d52b4931c554ccf03b4374ef13b68385e2afc5f87c84e13b8413f804f69f9fdae8c2ec8a15869905b2e6fe295f632fddb19b45a4a0b51244be18eb358435b9b47ad525426ba232439cfedcf6f9be64e7f901cbb4f1b275027ace8aa255f5e7d53f11ce750894c886b59c9ac43b98ecd5e4476056884abaaf46248892c0c7a3ab8425d77c178b47c8cb5f62949ce48cf5b90cb90943beaaf64825a7658c5edbef219ba2f6d9eaf9dbb6983589f1f8325dc42da5ffc73dd452d2d8b23297387a9b77ab8b89ba3426623dd5cc35568bbe487c335fc9a91ddef93d807ab73b4eeeca3fc0e398a762881d2da7d558352d7b8abdab79687e3ca3db890371ffadebabe39175232b36703749391c9b772a7939696f972ea6c0c9f387fb4f3fcbb6030f83d68c4a4470db25c547f7173376704a6e25ce2a69d6afc43bf539aa6afedf81d786336373a44147b1e943a9c0c7d8f995f61377134fcef536334aaaac6ef14ddad6a42febbfd6a7f880d7dfd9764da533d5b24dc7cb253f59fac61d273f285099a0ab740093e78cbbbdee9fe759a0ee6e106c4abe6d6ae5568f7a387a086b334f7aea509f349d678aeddc26f268ca7696970ce4eb1c6ab8e28fe5b7f7793d6bd9456eb0e985d67e64f795bddf07dc43e09f8554d81011a74a28c976c553ae3edca49d8d926f460078886f49a55475c456f2bbb8437df22d5f5634eaad7ed5b4aaaf76e3357c1c9fd5efd9db23a783f19b1d9d594e064b09fd8e5bd43b5cb8b9ac43c64a2bca446bf35f7bbb3cc0a7724dda2e45ecb4ecbb1b688ca217a5010cfdcd38bea0a2c4eb79775eab657425c8b264583b5c37bbcfa624beeaf5575571aa59960f3759adf5cc625916dae49502766aa06cf310af4c9abf099b9677bb3f7cb3e7e4afdf9eb33993068b023fdd41156fd7a548f4bb6b435d8ccc23d506709f4c7b9e4d5d77fec8c397304996ce42773532b2798c4bb8a987e57b41b820c6f8b2c64181873bc6515b0c810109890b8abd9bc650f0344e3e7a672e269547aa4bbd0baf9f2b2f3b53b1910b255f7cc6cf0394ceba359685e9f6c77ddfbcf0217611d076ab2140a8dc58199a2a235955b69fc2520b192555c1bed2777ef623760cc71b0208dbf2a5d9841a231a60e2516c5ca3c6156a0c0862b54c311ce2b6b3f442c8082348833b193cb2b22d252a9ac88098c704d83f217ab2a8799f031227b95e1fa5d1a6410e3f025485338fb8338b5c7c4c0f6641b71644f11124b13c2dd21088684035a66a4c4451b5f66c9d5aaa7ace15eaaf03497ea2e1d693b77a4402dd1943e9c68cc642997a44d2f86a339c78912e678d0e314ff162c0e3c9ed8eb726ed910d1b26b99061c01142380e5074b5a46505863f6287dc18422b323c89966340ff7146fec18095147429148c24718301c106dcbb5a1b644e5a26ebb566b504a9b2984100bb6c40b45286d4c2841d774dc8915839c32ddb22adc41c0197431bf8c5f26c2329e6b2a0efb2b0d872c4b8b125d997937236caa455389c60f9e38ba3a662ac7349a5c872d84a353f9710c6c74463f220f37558458d68da5e67f1130cc5dd5ac4608220da2b8c9048bc805bb1f6bcf04379330025ca86b42cc361baab986c32a9e266bb1fa27552192a56b4b111564646b701dc4771b8f61bb5d41278a291920ac1d01649267344732a85109a3cb45b7b8e9abb8cec49ff602c819695f61011c7ac5957fccc50859432f324d6623459d7bcbfa20645b2a54c5a8ba0df27f93ecc2ed00821e98553f680623ebb221953d3d9b8d188044d693abb88bc965984b08d112ea6b4885aca190f9877f1bc123220aad662fb7f5b0afbaaae118c6108c98b31a5b6ff15aad0a87b172bb40998ec232a9d218bca9f03e88633914561c9ff65be6dcad01550903276646208248a56e5c3239f951585ee9326808a4e4f829a15996452a3328253ce2cb3613aa4fb02acf3030b64c6a27afc5863487b9538b53a2e1456168180d257f4403b41f16b415740abb024eb54c23d6a851bf9c54932259d1bb510964445067c68ae362dac6a7c3e29ed3080b0d21a76ec220c7d562340123f7a32c62184d2d707144a1565e432dff443940736cf628caa3607076783b2b29bea7058bd164219518aa77c2b303e07dffcbb00c930ef0f0632c10aafdf32fa7bcadc5719fdb591c7635c3af83198fe306076a9da2455963b91551a1618040b0eac945f788820a1442ccd10fbdbc763cdbbb6e221e8ad076880abd561c5059e23709d40996d41fa6f129c4758b62644c30c1c06d0080091b4d5a8705f4b0694507252ef1a5980a347846160ba3256475741d50a7ae465f1b444a25729ecb66585e51992bc781f28c180593c4e5882c243017440633007db1c637733a01bb8a994347d7602ed0b34261603b84b8c2e14c5c46167af459507152da216f272371a0981fdbe740daa78b9eea655d98cd14ec90cd383863ab5fe8137ebe820df5a007a288586e18a54b43387de9b73f9037f27384be092b09941262706dd6db377f733b31a49d2467605649b9609365232252a62555b1451674b717182870c1088f4b34061f3e8b9034af0cf2c5f7eeb665e064f5f27cd5e4c84531d45d38051ef98f7bfdde2a7116ff4010cf829cbb18512f7cf44237c02241a1f75fe3ba8d22bff03a8abb0a5010f400ae5722a75bdf5a2f6d5b546b34d73857cb1bfc7e587aa7 +ciphertext: 1c54b44d8a10785f4510f996ffaae6b98533eed8ebd71ea24f7d7669446a5e6db97d90bbd13879fb301ac3042218bc5362ca6c057ca9774bfbeeabda1e2510c44e269049858a0895e6420a46b6183af4b2c0678415698749b20ff5b8ad375270763fda8e841f3babd0082bec29f635826d51d93fed0097edb491e13d264101f6077f35960ff036c9db1822476d980c294eda6ac631f40a8aaf3c288c497d19a340e9d351c4449e017086574100a846ee41f9ba811f6d3b5999ed6cb37f0a64c89c605889a3dbfa095f9e24564b636276dea2e1bbebd3469add8a00b798b531c5d7f734c400806fc2a278388fe7395756c97c3816e4b3b5eb079f376b6f6c46494f93930786d5d2fe597d1a4187235a34c0948494be6532ce29df05790382ed06396b78b51cc95ce617de6ba412ae0374361363dce738a0b3924bc3c0bbc440c660d8c5a012a1a078c26397fb9989e3f25b243a4edcdcd55d4919903a81a0e41b51a59fc676a7672d035dbbeabc379053cff3a63823b359437ed1e148a703e80bd11ca6d483bf29f574f7a3cd4be9c8623472bd3b21455ed44dc092e897bae7b958dd960ce311200a8a9578df00fa0de56ecf00447dff9b18252dd4b2a25ce35de262c28411196c2e49f5a45bd074c0d7c498e42606068b517907938eb7e5b37785a4960981dc9005e5431bb50fe55e446817b2a18064d4029673a6089e06a2ca67693134af6fd75a196c5483127e5349728de459701d0745859e58f6504543755d969c1ecf912dd54e8167910e38ab419a161178db904dbf018ff0df9fb5f0d83315c533f6ded98a06a72cfdd82a19cdfd03109c161020c1e726e43c8354e61906d156fbd7e360d85ea6e896c6731d4acdcc10a8c3ac1c5432f36c9122cd6533f452f2afc46643b36de381d00b8fcb93c32eb7e8cf915f1dcca5cd1f9af29cb4b450408c48df5c2199f8df68ea23e228494bd2ac356e461aec65ffa568fea8c281067f3356223326459d7f746b42060f816256e948960d44703d23eb45d46ab0e924c50978baf55e5ae39bb06ea3a490f9989bcbfe9119ac5f3b83c5f41e079dee501516f4e704a20bd6312103b57f6c0bf56e009eb64132fc2999bbccc8d098027437ffa1cc0cac877547c26680cf0c4f107d8e3551ec06c5aa3791af10baa6b34a10d346da6278cdeacad19cf839b501a3381a7e68d3e01604d66b92079c39bf183bcda51dd0959236f345d0c98763fdedd9a58f5ec9b2978f2319fc61af19ed6ba74db442fde15ec92729aaa8c1fcc5598be852eb8083abf5483a654fac93724ac3c23a1db1c431e56645f505f136252066531c9b6d015b1480555292ba18b3f2e074a4c3b79ba5b831cf049bf37be83ed33026cce09ff36efa757673a928884dca31b8068b0a088f464270d522f9771b7a70cf87ead5956e599789ee9a15870b808b3ae59a6c417a54c4eeed8dd2247682f8c3aac4af021f918dbe3ab8f91b0b43780fafeb58fd043faab7ea49b5a4874c7722926399db78533ef9d41aa8 +result: fail +shared_secret: + +# Private key not reduced +private_key: 77f83df8a5e069bdf6ba38b5e53487b6d6a39b79e29e8b45498746d529cac78b4e9437565f49d83ab5dad75eb2d536bfeefb93f7ac40f404e10b33e564d488024d873d1c367da759b54c5cda4d9382ec3183766a4beccedc375df99ec75d4866affbdada5ae61386b698bc63b595dcd4ae801a4a80f0053251664c774f971e1adf416adcda2c660a15fa7876a5946ce72fc87d8d8c9d06c9c30357ca3f8964b9b76b4544784c16981b075bf49653fc6fdf9aaf3e2465789e6b5864b969e0addfef3c80e1cbde12fc93b6cabcdfea9006e638f265880ac630824ad679cf9069284a171fdff984d4e6f4b2cee5ce8434b869177135feae861784b4f7332c4ac89cf8c36e7bce1a59b4682376b343d0b7696e3bbb6b301cb3311934514babb2aae87db5a4a656bd02d379f40694a7feb55d2ad8de94d12684df14bc994da75f2fc3bffcf88fbd9b88f32ef2dd6b5ee6cf393a69803cd5cf67647e78b94bbcd8e355e938efafaac105367535edddf3801743e6970cb19a0e53caad889c3cb05715a02597bfdc09f6949873558ba5cbbc8782e57b382d959c19a21cce9c66af759903fc109e835d5feeefcb3ceedca0b02659f58d5d1a5cc917efb46873cbf6d4d3ea8ef32727f5932b3bb41adde8bd8ff729e9b249339b2f585cd99698ecef3413b15dbd9142faea8d9bdc1f64b1b6fba5ee3d68cc36fd2067686276c303cfd111cbb603ff9756d3f279dc578f2d801d2a3abb86f6414d9b8ba349cc7fc9d3056aa788b024fe516093fe100b7e49de4dc4c8e229c744fd2dc3a959e8e78c668f1aaf01bb8b202a3c8ddcdf63d456b50461c55ed1a6338c4b7c72559daf0563968b8e84daa8720bb36dcca4ae3b3ba26937f84d2dd93c079a4aa3b846b8e1ce237ea9033541e9efe63d8dc32cb8bcb77b064bacd816bd8725569bc85cd7f63d34539c14b56534dc516f25d0631a59ad1b985c77c263adb70c4ae4d9b6b81f2c88432568ae2a7ba338f4abe9866738adc186e2949f5c6954f8eb9e53fded54246fbe09154b4e06b8a60b57fa6e76844bf764c3b5f56ae738c7ebb2c87e371ab7a70560c245aadeb9742a5e959a25895e4db453376fdd844c9126c78f3a553b9c9b9d53d33ee8c6ab13348058589fce52342ea823e3fa98edbb537d672e9990a11ef842c38f332fe01034ca8a863ae73fb53b5ef537b4d928d5d3a71b7b0a5e63e32fa757f3713157b8e8e369f3ef688e5d728efb4222a3f5f475482d167516df656b2ce31bca45299fc39b9bfee658816813bb67adb16266f71f9af3c8cdb31a45c4f42551aaae5e87e5d7d0547922af6bf02f9266bf4bb97bd08da6387286e5c8686f8989f5b7ff7ada067736a7949bec8d23778708163da61c68d816d67becc118785ea53fa06c3a99f6648341f8db1c5956b75dafd20da63474a32fa53e2a9b49ab935ff56e6292e9f78e839a70ccecb7b6ea49855216d5bd3d1d774836469b48496f0590127850d20c52135e50e25bc8388483847c92495cdb48e66aa98d5ae8c3a0e7c5ae3ec64ba22381eaf7ac28fbdb76daaebe0b6b6e28bdd488d02359c7991eb2f47a3c45d938c279dca38a7a251ec223855bd7fcb83e6e426635ee76684418f81e47490cf733359bb77d86b1b949396baa99c9d73485e378b6eda76318b961948497db54149f386e51648187c48a94fb603eb114a9408ba0d27f3c717694f9459ddab7c6d51a58c50a79bc072d7717781a6b12073577d3a89a405829850aff65023a771a5f5456ac5b3970d545043a2254178375268abca9a967f50db28635b1d01e7d1969080438368a4b61f63efd82a811f63909aa48a055cd9345c09191abeaab8237696bdf3512b7e8625212bfe5500bd7002066357954344fe361be074069a520a470eb64bc0289f85c981995141a246ee3c6673d9026b7b490a82819ee1825ad39284fc41a01c936d0280c4c681d62e47de8e339fc0a0f958b279ab95114209231faa8962754b12a22efb67ed1c42e8c144f74476f552a297e7573a81717144648befa3b6c6096f428c10fd925ba86b29c8890f2750d1e7956664a714fcc00c88a3cc259b503d3ca39942986d19ab6d76378858d679cc61ab40edc5a007d33813698a6ae96acbe95474b188bfd3208c885179de868dd027f12256b9fe84ff460b180c7655d514168c89a516ba4ddcc56c1b5325c9312e067949a57178251158eec2fde69bc9d61be726338830a86e8e525ec00152cdc0e86473e2b54ab64790735c3a945cc83b999352ad2587fb67dcf2c9fb3b921deac54dccc8201d36562f64831c8129e67b2ae78bfacba95f29c3d20942781e090ebbab81bc5c071b0bce826173f0cad6c101518b56dd03a8bdc872d338225bb16128ca8c7212867dae513c971b687297e4c098ff7c478f841a29dea278d1bbe55423321372a44937d2aba34b279c99e8847c5d4b51f54143de991aa16aeeab267386c7f286445acb87a98cc93029658bb0981048876f0884b526ba58f201257a2245849a57cb425cd2ca92a3cbcbf963a4f360e8616c082d8be4820323df715bf5344fcf85ba070ac3068ae91989e61600416d7cc28cb6d42a461dec083f6126c749ca457146d114c84fbc576a7dc8f9c2c03cf4a3cd2535a7a396f59d73259654254e5bcf616b4970770bc8a3d030c8c61d93eb08644159414dcc6428be73357531e50ba72b5eb99d9380bc4802339070366a19760c0b15e32a48ae0038453527b10c4ab6b1ae8497f49dc47e25a514258b5c0336a812525c5a86e22d73a9a8c3da5e88a468c3439464fac42491b0bc91cdace7cdb15166a01b62cb22b745c38ca32a9727c8c57537c72563edb4aa2b400b778115b36817f188e659b2bf7c999d108c5b2d252f6a3bb78737edea48c9bb91e917487e4e6156dca609aa97bf47bab00047602f296cf611299510b195ba59ae7bc245b8c9721901995b6df4918842017945c330290c6bb3c46d9104faf014db6728c4268627f8c884bf52e011344cfa795f864a474f9c015ab09c77911a8a52c1aa46aeed6560d4bb1f3b64d65028d373ab3d51a450e600a239767aed9cf25b5c85fc24cc794162ee70e13d88fd3459cb37a92d348a1956bba09e24513d5a5fa79b593a849a1930456f39fade44b583cbd7eb4ce058056df38cd0be15205161f53f2c8681cb9e00525fb59cfd86ba1ae81ccc1636dd69c81ef620651606326a41db9b68827378c2ec238e9179c02965f938a2d0aad893c30d27267e416287d7ddec314a79402a769c3d953f0092ef4f8b595f827b1b921723cedf55fe756ff5fb67d555296c6185d171ed8ba01393d1a735018a59b3bd23b49a95bc1fad20070fec930b6060bd827d742b077092e422268e15d +ciphertext: 93bd84aeaf924ef5a6cf9f0299320f9745d4b7a1bbaf8c0f7a721f150d740174f4650f48b2597b513f3ad8ece3b027e23e0bc83d7bdd6dcbcdb89b0c6d40fc2689db5a8f97978d30bc54e7c706597acddc24c23779cb36256e8858e3802bff79165020d65327150ada03eb85ced6577706a26d2e0c3fadb7ab480a10431f12d0946f1a62a70652684b15ccbf082c5bdc500af9eb2d1da194e8de691fefe76b479cc558604534d4250f9b3fadc5b6ee14cd723b3cee817ab6924d33e7cd8808db81aed732d6a388902137e041c078a519c530486c85e2f4b9e89d3e818fbb83f898644269051c3b82a43f6cc34587b4c47917924cc87c5090557254743e6f754c84ab36eb3ada3251195fa8987c2c876af3621d7b78d2fbbc99cf94a4bf804542efa4d16baea4d1dbe6c911177e3004f2d4a8b69ebc50246bc1ed56853870374d2d2ac73f4c14d668289957d89e7a057cf25fb2adda583f9420956fa48a7eb9d76005e20bdea9c5c16c8fb1efc6db068b8879d1ce28ffb3a70ccd1c8578b938732b2015faa17738ffae41a300edfe2c564a85c775fccdd01af5be1c42a81c2e76806b7ccaeeaa6a98fcc1890d9ab22b04d1c0d106db4d2053fb7da715c6c3851b1c6e3b13e9b9c7915fad5a81db1a823f6e9c08bccaec434e2e143b963fb7acbe6fc01b8c0f3be2bad13ea711fe426983566d5e31e782408280dab6b43343046e59f054f45498ec9514f2e5d9432b9b28f8b716cce2a02e64bf7fdfaa30f4e4b9d5a0fab8a5f2c1d4b5c278f83889f676549fcf35bf3836894839f170fca341e7fa9f88e0e3cdbb7a18565c0b5f696731d8ede4bc6636ce988f377536e88fefb71a38e76577eba3e3e9682cf1c796cab2a66da2fbae57df62c53315eef981b97d55bb0898a474b72698ff4d695e56a11b4d59ac3c33bcb1221c498ded30c88211eebd998fe8a96f9f92eb80c5985a5037f1a929f1f5dd446336a438cb3b75c7860749fdead56495af233937a2457a92ebbdf261c302880d44cbda673ba0a67a1456ab86ed38fe7a8e964a62569b1fff21994b193e74dc25d9a78f05d9677ac92a2fe830e1e4947d7def8c911d11bfa536c6265482e8f1fca1ad0f7f36e81a275b83d2b6b89d68b6bfab6436cacba6d12d33e6662c0155baf58f8f4ad3cb57b47ba63e781d94ee461a901a7171aaee49a69b25c6d8a0c49063f7e8448d60bd8de161cd778da0476529d5a0fb2c3dd9b4c90729ef6653d7cf74288cfc75cbc989c76bb7af8579578f5ebdbc833b31927fb6e585a37f13302db297d0b50f7e3e72792e3d3dde42151067679f155794ccf4e604f8bb8d1390e6e98b065f0a01c9f0ed0b35b451f1f8653cd1acdbf97c3518557dcdfcaca9f98c2e85aec32ad3084d79850319d1ea27cfee4b746f573d1450e036cf5001d532470eeeaf2d0895aec768f051e2c29f8300f73f64fa41973bc0d1d38b1c58bbd642807a49e9515cf5ea193e30a4da032659962e2d28d41c2aa6405cdd1627e4ab927303179807db7a75a2 +result: fail +shared_secret: + +# Private key not reduced +private_key: b066bd9303c7bb0c4a4b0e812cf463cb338cdff8d9530bdd91dfaa7a3cee110443d80ba64f6a43516ed83bfe40180df986b63c8f0bceeb544b86e74e86ae6db9539de52c76a634d8613ec0a9b84381edfce4abd737fff77995a63c43a2ada9a60893d24e5d314e9e9c98e7a4f35ce67c93dc717693fb5aff4bbec684bba76365403d6b3b27f76a4d9570bbe73b09f3fd45b6b89616bb014c5fa995779154e07ff6ab3c5f3ee22ec3d07deca7ccb13c7783eb97d2d34695c696f98824884c56d12c16c40576497314a0d60675fa1be191ee3a816c75543c9e54867f9fa495a4e43f0cc964ea5be9c364e930e33a6385d105149484094d31af8c6eb73de81ff38e19f72ddd415aa3b19007c90ce6407a864703d9a9f1fa3aaa86fe66736f7f79fa7344ae84a544b7bf89c3efe87e6eae6e07d223de80cbccd9a4878cc6e4b71f1962627746a9d33c0b7c3a78048af6f8e1a34943fc0ec5b3af48ab256c729a8ae3aecac87870bc98dbef16bbdd17f4e26ad258cf44c2a59737da52983cb5ed0fb450cdbdbe4dc8882470285654c61bb27a9a9fd026f594343f323d7cffbac21658ecab73bb215b73fc96507bea727e65d5e31848306c6647f7875e7d8fdb57c2f5b4f8c4d3b4632ffdbb4f3251b5aeb95afc035cd25c0b39fab66b1d1db0154eb9f5d9b73637f718b448959fdaee4c5dca164080b4774cd6af8e7c5218065a6d0391802e5d2f6595dd23e41ca5d5da959cc10bbeab184397cfb552ebdc9c7a878b1da63ae9f0c19c9146cfcdb4556d823cb6d1e48458e7fad9886daca3bf7265b4ffdfb11beea8b74aeba62a3a298c33a00ecf70e7e18a094dea5d723aabde837a74ba18a9252df28d18d3dfe49e740ac2be5dbbab84e743795e2936e69a9d33c8ae8765648441ba9725cceb627548484ea625a9ac0516980c9d3ff40c58c348940817a40cddfb0f7487fb1ad9c3eb6bced56581fd9edd36fec3cf51a0fb303e43f02d27b509c3eee883d41325e8b1ee7ae44e58ed1565caa77013b7e61cfecb6159841f8566a4a8a0c78f3892ba94a64eb18ebea68c9a3ad1755a1648bdbabbaeb8c8ba0b1d5eae48cfce175a217d693138cf6cb3c3b0acf28564de84bfb5ce05ef634b5902aaac61d63b5f8fd69ec5fa977a3e8b54ff6106c13c2ed8eff9ce87d387640b3eb29e4e0597f98bbedcba3bd9726ab543ffe01cd6620564b1ed8945c60c67502f33236bb7453d7aa7db84ee1ece1e0eac0cc9b86f463c13197c7c1aa3f443cb0eeca93b8e7319bc45f9a587cc9afef06bdeb2998aecbcf920387696ee54831c96beb5568d98dd4e58d087499f0f8e8002a7a2db2b717aa39b2fd755c1c7678cacbd5af344ad38578a894b9d795fe65b701d3a6323fe5e5026e0c6dcee6ff9dcd5048c93c8d632fb6e18e7decd44b36bec3ef955813d338f3af7331774962a04318556551b1893109eb3eab446467fb39f996d71e4aa3c7e79b07b7718ce373194cbfebb4dce5caba80a7a7bb5aefd069db57eba074e383b1ad06978b3bf5bb14348b507b6f4fb44c41d4c8157ef765079f81e2836a7859bf3473b11ff4c8d47e1480770150ef78824859b8fbb549cf5aeee5cc71ef8a58ab4311d32776b6f121675622857b8b376d708b2a861306fe931126822e2e8672fa0b577e8ca3f16495af10aae456a734368677a87fd3c2199060dc1993690c1ae2b76959664a1df6cb2b3738b294124918596b0d69394eb1efba83895d0a7f3081ef81769437cb63b726d4236a65c87c3929b79fe34438a8931cf2b889cf100747cb58d373491e7cb62db266bfb3b7e745500fa418eac8cabd966dc388d0f1b3fba850bfec8c03a29182deaa5ec4256fb3b436f429cac87399c61bc98497a3aca07cec06a128231f945a4a335ab6d1a54a9a59db106c0fd61360ce8870d1cae99201506c9c96d4969f4b487e4d87ba1d45accb5a754585f29db0991376150c65927b20c9eb421366cc840d528734c8b4f1421fe30c99f4c55f1e25d18a1b012424cc9f6250064a61c1b42ac243b6c701e293055a9ea7c44855e575cb6217c381de770cf461040c20b2cea6c2a921c9be483ecc2718dac01c4a5a15b60bfd5222fc988c60b23504919137b1226d7b72fe4105154711d25790a9f64c95356a787058018cba996410aa4f29a62b6cf77439b5784b67390b96db77c1583bab490719d804e79b8954b948388514a7fb78ebbe7959599ca374a66558a8fbe7aac91e8a62ac623690a952e94bb91e64fe57ab4db066867ecc9ee027163a8010bf901489c10ebb736ae619dd0177fcd060c4657488bc50044e4c895191351ca72aff9698577bda5536c3fa75f0d9b586822211cd88d686ca8921ca65bf8081f8604277839cc9757653a46511876f7b98983fc052bc088bc85a686ab6bfd5c2b91da8ae210313949191d13279be375d3d3197fb01808a76caa8a843e178d0dfc116c041030f2047f4b35c0900498fab680d45fd0710d75226eddec6388d56d1c2263768603ac0ba9b68a21173704bd25b6b5181405029cc4b18c6446b5afe5431f0a26bf50b2f33b0aa4032e9f28ac9fb58acd85a670f393351b33df4079a5533c44a94e968b677a68931491310cd48ea1213dd416ab650b3294f06f91aa5004f622ba173795136eedf91598153b8d2935acf33709a8b33e4b32384bab51fa69ed123a4eaac726dc7041b486e8aa3641fb8d48f908c27866753b821aaabb9894b504f845fbea8766e82671506ff5b5012765a6a7b08f9fd3c10357523fb423e02024577235fe4694349c1188b1aeff482ba7a15aa188a8bbe7108ccb7ad6a469054a45c01aac131c6a7c4acd5c050184ca77b8466b6d1992de80242454169a33382972760de2b69c3c000b900d25f2cf4731224dd9a2b84562c15c04d3d1a9ad447ee9404888141a7da3a522f90b9071ad7af54552d0060af1a66a31b9457024a46b3fc1038a7c54b76053909ab07eb36c1dfdf897276b465155aed0e70f9a4b9398e54d267377fc298b9bbc053b281486f8436017c6d98b3249c167b17358c134299ae17426bc9f067849d7c55541a205c1359a41d7a5fea37e758a0893c18226a44bdbd27e0266096dc20da357c5d1a23956b796b305c29e87718f65b8331888cbd53fc2fc011f92c6f49c7f9901a5b17059b81cb2eaca2d348a22a91105f69140d122bf59d74c16a840e4b646f5e1cbd921a24a60a0ed6cad243303a1448b6750b4e451c5e0e41b3a12a73c36272ed86537f1d2f51a0e2b5b5847b0a2d9bbff0a051bd5227600ad32a2a1197d78798bbeb13ce2e92cd7ed94b410adc37b1b31dc060af11fec8a8be99c0e7b82be89bc3c1eaee6680aa4efd394e40c2b3f30523c8117f7c26a8969 +ciphertext: 2513e09060af8f52ebb2c83689895b5bf166ca6e9ce9db739a4533c90c5e9f40867926244cbc396051bd543194a0635e1753f2e1366a5844142528ce5398412429ff880f27434e22c14a64a45febf5228175f5f3eaa6c7d15a4676787ab733a34ec64d3e6d35fb28128a0e5ed59b11145a6402a92bda380a38fc3710104834b131ee928f2ac8143083bec3de7dee3ccc07f348a384f8f709829a05fe94e5bc144999ae09e2ce39a88548224c37bbf716b44851f453f6bd0f1052ee8566d444ff9f146785e3a09ce54d03c3d34398730474f314e62d5600a80b2de9fd468e4b8013a278b5c7abd613685bdeb26b3927d11053e55e5aef09028b36ea99df1471dee73dfe63e9f61c1eb16b32deee237a79be98ee3468de973f5a1f3cb411daec79b25a8ae3208503ced8b0604e939e6cf0e61d55a6d0884b38b08493f8544a221a250cd9f4d9328c2eb615dbbfe71fd27e2eb4219bc8de76472dd35809813b111366b6c4ad84b3024d0b084c9c6096ce3c7b50b6108aeb0714f70ce4fde2bd2d693abfd156e090455e9ff36ae938b99d68400587d8ae263058dc64a5386cfaffa9415c54c7db1d5e6a1341db0c724a3cbacad4b286a4f59a5db6435fe0ad19edbda0e608cfdf88cc3e00bcc864e2a700476114a5b7a3b492ce1f66b10ce5e3a46a93e39bd0101d35dd371bdb491c6d4b7f015b52cae6d85f0d71a2967e04fa58fb46b308315b44cc993cd49e5499c065a811a8df99ed94f98fd2f0841a3a3a6d3d89bf869528640aa7721e59f003179442e6cf20881e353435b994fba25acf21954ddb463340979d7d74f70cea856c0b4b2c9116f596ee60443fb3491f57b745258c462c3182da098e84868c6ebee511d2857d341c68a01cec442b87cf755d86373deef1934435eec9a3805d5f2074a9e4711fe350b14b79b42af8c5b884ce4a2097239f0c63bb3b96ca91b3823c11d9b79e508c30c19e1f63b3957332ef80318448e47fd122236b2666d6c66f532ba88394c61d21d784ce765c1307cfd5335c0bf04dddd81de4144dc445ce5c8094fdeadd4f488a7d463c14994c891a1bc9e04649b87fba42556f54a3dbbaa96b08f8e93f8f68a2c4c90d75f0df55515515f438ffcc084cfc69a219d2a2ecf808495b1568ac37cb6d1642bbeaafb9df7f4aa3a22739bc7c9219938f019f12438a74631762c7f8878ca24f74e7ec762df3a3f7e9f104e01db85c1e93130cfff87083671ed10aac6b5508ba479952ef0d5bc8327712c555fa47d15d32c5e252a5dd0ca6676227ca7c5a3bf3c102ca6e0d0d5e846cb52f1d85c2bd1c3c4fd3832eda5bbb7ac1e09feb84eb1cd22ae62e9dba64b10217272af5e5f00ca3e8a03303ab13e8ab4a16e9214d44fb37b11fad964f1de2e45ecb499444f81c563a2b3c599a5e334aae0a912e577a6a8badda3dd04aa33e59ce1797f91ca0662cf36275c5f8be504ee7f4051ad2b346f67c66c17845d0e0c4ae5b049bdf6c7a82ae84fde16223d7aad9a4e54e46a1f44260ca0e2e8bca3892 +result: fail +shared_secret: + +# Private key not reduced +private_key: 024755131769c7169f4b4adb8908f045e6a48dcfcb0eb87badd4ab94e9bc67e85eae9de58c49ddac09c40a6a8de8a95b21d5e58a853442b9d8278a6ef80551a8ce6a810f42c7086144444e488bbec51c3cab83594becf4580de62c43a9577c51799ca7b03c9ce3cb4f5c6564792ab8201a3b8304ce4d8339a227e700d7a6ec2ad3c337b639f7c804b5da705ef25d1e43f9d8ac9698a3ec1f6b9ebdd0bc2e3748aae65848865b487051b766574db2e6efb1b4633583589f30d4572306614d08d908aed40dbad106633a26237a244b6a19afdd87653e8c5e6ea895a1f75bbfaa1f742bb540006a95ae2db9557ecd4c38fa64a36ab09a86b109e044e4e754bda8ccb5dd988d351f253a6928f4c785ad8be9790d48643bb461189f905e5b80d37e7369e4786e69d1c43366a14b3b424be1139349ca1d7fe3f55958fa8e4d06d16b46d7210b525304be665eae57f8f6c913cba35d3260a9493bbb3cc33e9d7a2ff6c27a54233c48e7084ee9ea82386e42bc4e9cfa7cdf524f6cec39b554255f57becda42b4ac33391b18e72f7b8f574b6943f6a79ad5ea5e7ef54a0a5c80d46538c03705705abfb2b3ef63a756ab8ac0363daa6cccb006ad5d73b687d45529edba35bfd3c411592f75fc8f123e640b94362a8d6cc2e482f99e3f436a06dc790b8abff2a59f45b5ea26f1d7bd196f4b51b40648ecba1ab3e8879c401b3dfcafdc40beb557343735d0a44ba25dd4cc4d4d85f805085892c7d9f2a97abc413c81f8aee159ee745878d66e98f20ce76e4a3cabf6d557f1d4d24733668985ef15b87e78b57d22c4464ebb4b9fbeb124b80c73f8c3bb933493597770bdaa1acef7de48274fca6d91bb51a97c49c76f95bcc6c53933e203f7f2037c7bf9c80cdc5406fbcda9f067e7703a0aa79ac0eda8c14e4c7f7bd5d7fa84ce9a487ab489228aedd87bdb6a3b9ee21eaa9493a986ea773af8ce6cccb3b059aa725bdfcf936a4583daa93ccbc2b3377014350cea39c379d8f5167b0811ed61867c603f6ce65bd81b2e46b1985837684b5e43e8f463ec1409df77a35683cf599b383e36ec3977a0ae3e1e3f08543dc0a78f8a58cf902bbdca679c2f7f9a84419eb87a4754ffaacd0fdc50acbd17699f7ae1bfeea885b54f9fdb59533ae6a6e9253c18d9e84c21f7220775da93c5964845240a7a3795b5df6eddbaa34393e4dd9e74e828c96e73cdcea9f9749a009f81867b2d2a364ad7335eedec02e23e117a93b107ee3dbc9ac379f4ee63cb954c6da325971501b382283f0086f9b00a965537c3fc07791af8adc000446d165d6c94d4da9676a9907969e4d627a18448f3537367d6016fd50064d3aa7a7b79ac7c5a3759b569b8b5d3b86bebdec413ea1f4e45cd663bad52de23a973b2b6633da3c88ba1af6f0347901d6f36ca76e1266440adb415fe5c7adbab8f5d8b3dd5bb4f88c3a1e55da495d629176e0258ef950dd5696a54f517ad263f3ea8a6de0dc034ce6b7ff6294a3cc7ef0d5acde588f7134afb5404db0d6fd60e958de77ea39e02a48f53f7cb066bb33eff89bd97d10ec6615a6ce06088d6f63391a5fc89ae8bfebc43b554aa5e4b6a87cfa9e5b457c581a43752fc48aa35df5c939694737a6f3b26ca06ad98a9a6ff2122b8889bb513558fc1a8701376ceca1f7d87a53f78f953aaf9f977c2ffb4d04f88e33e0ba7d83bc6fd27914a769ae382ba5f211b2f59f0001ca30b0a0ef138adaa485953cb8b6f6ccb56a7c92598c0c83ae97684c26d70d69210c8dd16ae08c4b3c1c30110a581669245529be92d38d9cecb10f22c83d01b3b3660fab4662fc559f48041167fb3e7960328c612a7e99a0c546b63b1b04f22b78b85074e6d32f6e04b096eb89da611f30267bd8760e05c238ea2a587691181112a39c88c528977f0399cddb7a7c8bba3ba71507b3db7131302407052cc4e8125e2bc035172a967a21a0582a05f8aae28228ddca417545144882ca3d644f6167ba30e91368879efac5971c8b1a7a9674e804c08e506ade53bcd778c1af4637584b9752aa1f16a4319d296b93e5368c10863a85cbb55c11c56338285b21cd740695757adeb2ce48b7c658a36b26b670e59947a0d94d022284bf0995d56666bd7968bed8858895c779a3318275afe42488953791e97cbd6256c29a6c6e4339a15d7a7c3da95edd2a562dcc2f6fe077cbd2317a914b975692ad1c3c3d956b26634fe1d2235d66226ba766a447bc87e8674800cd898b4b02c491658b97e25a4f836ab98a99c669b60aa4c30518a6644fb048a4e34822782644038ab04a3815c61da99816eaf388e495cde4a65c12f1bb5f02a1a1b1cede817952625fd2502f2a4b8bbbd4123e71462ee433ac923583c830cc54129bac51f96846d8fcacece9b19f6063734158008342c6f48234d24571e5777074170ae24b20d125f1ba311f4b33cdf91e3a2305fbe12e44ab54cc8c4eaf8553f697c00e8040e858569120bcd0166bcfe1a66e2500c3ab8acf3b58f1309c68772154602ba6c0968553ca553252d27a0b05733d81486d86c590291a643edcca9f8470d573880d5856a6b2cbcff2803713790d17297ef11549d5412713a3e4206b1b7c85483192164209f5b32f709aacfc4bae51f180edeb7e999ace2bf98d958514951362b08a6b529a2a7669c5492c0a61645542bc1dea0b707282a0797291b8c7a510884f12e92f3200ac5ee91686e109ecf245b2672f94c0a4525b7f43fba328099bfe4330888b186d026231d2b2eab7b971ba7680f0cb4653652f8aa8b4e01bb77461d792cd5e941a31dc02d52622b37c498e4169bc0418e23c5d32999726462d3a0a6449918b18db487f422849b67cf047bfcb0c6945bb87cd779dea915b64aa0975d313f8a740de77b0d40612459c2eb73a3fc876ac39c821a52761e13115d87bcd17052fea2b98d9d83ece9b1de7124c9738c0df539045279eeb21042a13791feba9d0e23445293eb3c2c194b76c5febb5582220ca350eca9b90435372f3c5baa0549ff847aedb815c244b27dc5866b151041e884befbc7bccca2fa098b592c5aef7f53e0d712bd2119214c15f8ab848a1864705d0511c50a9942535cf06952b0357445a9854240c026733ac8a39eb3c8bca2939d195763a572353da2956799448570a21d58623635f7a7461a913c24ad04d1495c1ee42c88b82942012b2d4b410fd1907799623f1b373b9c438d2b4c3fc48c054bc5206273f7a9a3dccc0ad8d40070ef20fe4cc99c8394adf63126006ee8cbb821b12a2a0a3018c4f8e52a50183fff79e84c694277cc3f47f319f88da508f841e536a056625f206fe499387d27307257682237f969c35d165453e5fcdc6f9df64526d9de698f2bd3e6bac6c7fdd86601b9ba5f4a5 +ciphertext: a93e454715b85fec95f1c8ebab9126e7b088bffa6eb8d220089c651cee97b49dde58f10f2709d6ca10a0edaf0d631e43e1e57eacba91770283b2b2386af871594867ad80b88a03d5554d151f7957391a8a675688485b2e7bf619fcecdd8be017498f2f1377d03f59482151e03f1f90bf7cc49a2192fea0509d50678f514835271e114ef1b96e453bd2a5342eee9632c0b2a54daa8a18777deb4e785d0b1b6dbf8d3fd5011c1dfdcf8dc6577bf5f0b35720412df16bca86f3d65ef0b1b01a2bbf50a036268d8cc23a9db6d0c53ed8885495059f8f0101806769836fabe5e72d8731b50c745b24944f00de44262b3f76bfd0e3658c9b05d93b98b6ce25fae3a326e59ee148d699687cba27efa3e49d719832c82faf13160b8313a5d9e8fc1c5c0f7589fd7d143b241216bd49cfb81eedbb5f732c3dfd9598198055e5946208939f9477e90febda986efba3e9e5ba2dde57e9dc864452d096642484e70a19623b6af6851641e6f41fdaca57b6bafef0b1584fb4db1864b852479c632db21089157e4442a4d7dc6eb5343d8b300c15dfedb908bee62ab57d8fd1be322412edc9f681980cfe056bae32a30d714b9e6397b1da7874c5f3a6d296a435377d0cc339485237adbc72705e054278819931f6a84a3335b9863af0aa6a3e0bde969289c1d3956da62f822dd6261661241e88042d672ac48ca1448a42f978ff134f45359e7eb734b0cb44a99fd542f961f58e0fb7a3116bc3be3394b9cf8478f01a35342e9a22bc9afca1f4eee22406cbd5ea5bd582d5b88e5bf0f11a46554323310cbba6cafdd0b3879ff49ef875bc6846133b8bc3243cb934bcd8dc8493ca3fcbd1d4ab06bf2e6b932eee6fee99b1c260c2199e801d68a00bbacda4d2f2facc57fc715ecc7f116b5fa02e131710377da8c414b9c41c3b2d0fe43b0829103407c229451990fcf1de8a5a84ba97798f2e0cfd9e2375f37d306179ad8004bf49871ad06881c2c1eb3524bbd2d547916dffb73af4a97c2cc4eb3e13fe7eac98a93cb0689ab9e1398f8df184883e20671bb4781c4eb0b78298f764a03624b2e2991c633c04edc8c23740153c23864154a0e49795c45abfcd89a619c0d5d45e54aec741fc5afef622f23c1406a0524de27872a72b43f771c618d81223ec284196849093bfcf5fa5903a1bfb843f7072b3bbb12cb1bc2ea13839bd6dca2b4c1d7f1c726c6359339d649f416e6a6132ae9008e787706d1b4dfb8f724cfc439e9ecf2c88114b2f23beb7b493a1f9980612d535fccd24626a0befb6a86c9561b96461d86db5c278c12e002e6992746fd282a6cc8e7b0be91db05f6bb256075f50e0f1676fc8b4844f931151017ee9a4423720203c4ba933be28f29f73e96e8c7b232bbb375b16c82dc53c697d2bfda5afa3d8c297ad7f3ccec05c5180e6637e060a6599269a88d09fac0c2a724e61d99965813a8c11746105b7ddc09ef377dc93f92baf2b524ed9c277a7b679334ebddcae51318ac4be3688b655635043b07d4bf5b79ed743af00ffab8c +result: fail +shared_secret: + +# Private key not reduced +private_key: 2c0d6f1c2787d307d5935762ffbd46f68ada59163ed30c83b577caf466760583db11364a383366a85ef5df45f6fbabb7aa49e6eaad5587afdf9b23daba8db2aa5de0966fd47e33ecfc7a9ce7987d3e2e8c53beec22953722e861a20dd1385aaee23378c647f315e73315893fe10df8a44caeb37cc796dae954b79adc2f887c4eb3e9c98a4c5a71027e4f4cb78c9d3886393567016536a17d6fa1c950dfc7eaf86b916115d9738b3f6c29f3694e6b1213ae508439c8c9c4f548ff926c6df08852e8955a04d5a8a319e2c30e483096bd202ba4b82855236b804fbaf0f0fd56e288cb6a9f37a1f5e50e0f7347bbc0651fc973cda784aeb794e7b2a3b45b7f94fad18b5521ae43f463505979ddf46bef99bbbb0f18ad5be480077f7fcc04ee400430973b8f6258eb73e6e1dcde3df47633c2af7b387398dd3faf9f7ea40c84cb49fe31d8a7acf8e9eee35e3f402f5a2e6eb753ef4a297de48ca68c3a85f4330d5480cd54720f93b7c7a93985f959f6f56dbf9c0f0535056be8e2f78ec4eadbf9aa91caeb9b5d5e50ae4fa868ce8d005eb2a1e8c2d31951d5fab52aac7d6045d0d9fb4b605e6fd26bbc51b6f2751636d3cfba24ca5c3aac696edb821b237e7fccf414e7cf2388644f07d3821ac1e2068c77dd717d4dbfc47c7f96077504d5b9b2c7a188cdc746f9d4cde556bacb9cbeaaadc865ba93d4837c5fe92b539e6de7496939e6df23ef27cf6f4b3c93fdbb33cc8b39d176a4b27351911b8b85b5567b839cc6ab5f65a3502cd994c91fb72b2d37e5e38f08ea972a1f92ff6ee85b6d3f94fa6ff7ef47b8e3cc82a8b111dccbfde7e5d7458b3d984ef5ae7ba83e4ffa9ad6913eb28e9b858f2f900d364bcd095079c4c06b5e5599443ff5f434be754bad6aabece45a1ecc7dc5c955422f3bf114ce60d663a47feb968f6747c7d05e94b8a95df5fc43b8dd4fd965dfa610b7ce10b7c7d56c37dd647fe2afdb886f67d0cd607a35700cd5ea3187b69c488d358e67546d7bc22b59aef9c3be78a2b7959ba7afe2be46c9411a4c1357493a73a50a4dd20fc732acb44c0376d2c22341d5039dd99cc53343d91e983c1c1ac47607b5e487f7d1d8a313ca73e1b9c47a63a258eea5c01ba55c9df274ba8c3a35c8427c9130d7ed77165e01ffa723da6febe7a17d89cd631971855fbe2b8d777f1469ac36356e73ca7e04f1ff6466126eb3eb459b33c694a63990167e6d8d7b3b0669648d2331edd6a9e54933a5447946465fc21b51c323f8a676382a2ddd02c9407a8ba8bd25de540755e32de02dec9fdaad6744ba9477ddb6252cbac07e8c4b9e7fbebcf93408531c46ce925dfc92ceda3994883dd83fd0c97a952441fd6485c8c34f8116b1fd49ff716e50fa0867be0d78b0f3fac88f8b6c6e624677b55c18aaeb494795be632e6863393e5c930f8b3828598a4ac46264634afe7abe68f440e39ab356d52219537f9d9e8f9de35303bfe83eba04caaac6cb89b3c37558243d9798e587f45de26be28f9568ac45b4e3f39ddb96eccb0749ec354161abe64163c77b7397da453f57377c4acfa8a78c568f4dda6366e2b7c95035f4c71dae74e7653ad166d1bfa46be01761034db04513f453c5eadf5e6f190b29f6e7cc26755aabd20d4be75f2fa4c18303319edb00809152b33726b1e54c0f328c73c6805354925b43a6dbe0cadf00c9ce3b1d7fd9b47322c8b91844833250e0e99369e90c279ab48712b4e1c10c0456c754251cdae4cb4599843510be3a13277d775a3242a6232b1ca2979e6f260b3c4c86fc24bfd95255c765cdf6187854f0c9beb8cee6a8391f98475d6aa080a7a2c6147f70c2a9450901f705ab0ec23fc957619d611acc2319c6042e137496f51436a788334aa5a6d561a3e3a0937a37be9f7711c5fc6faa1024c434cc3e41a3865bc0beaa732c1789e7972f999007d4f7afdf953163197590e757a297919766428fd18ce1d531466a55109287c335bc26f946e06a4d51aa27b220001a46c2f4e339dd83511d135a9621c1ddf1083bcc9b24b994b4a3394df8ccfbcc743304383c300a9761859074a3d0e91cdd96a34513735a424238e71f42c328eedb1cdfb3ad704a1667c15045c534c448b429c474c494c7b37114911771d62c39d3f4763d881c0a21c074201301ea0eff13bb5df861ecd882a0350031b2af63572845950535e85fb323beebd613ba600702192d7cc1218309885ab9345ef32dfb757528229d73d57cc2328a5a86acc3180e392144c04cc45ca57573395ef38a95674b28ea7bc8684c8e6a81865a93256517be79fc456472976fea2538bb8b52a188cb43881c19ab47069b36968da1cacceab9bfc5c7985614a3fff7300e621e4865c5f8d30792099d3f793e58b591cdd87cfa36430aea876f30cca5d824fa29ab2b56ad3aca5d483c3c7ee90b4e028b7794592e1acae0fc721d355891c257cf821928104e1c994b8bc33eddf70c3cbcb5e272b43b5777b3921892ab198b4132ea4b200618b1e4559064d491487b1f0135c9da67a39950a5f13a1e6eb409c30957b04c645b052decc23a391a7692390de9085147c96c67f04ea8212c9d80cd00dc07b7d22826e01facca51dab91413e8cbaa24a66a00b4d2076d58c398ecf03ee56c40a1ac03cb02658e6240c41c6f06c174f3414e258a11478c7a76e05c156c1b164903b22991391955c3e75bcf0cc70d4cb79ea27638c54dcdcb1ef35b8f3caa26b0418f340597bed55d586981c77cc6093a889854a85132997bf706177099ee8b5ae44cc1f1f3c413fab7a51254490a6ac4175a99da866e5464283a74c5c300436ac1c7829c953128e5d17cb056af07b08d7f114e0be00f93854e09eb5e0be82a5a4c526030468f95bd82e08c2147736598a656476e5cb855e0c486d1fa0c661202a79b37357995ed445973959cf04116ed0c687227768a41a1b4f79b8080a740f012dd547403a30a36e62c9f5a1659abae73a165202122a330c61f492822ea25dcc22cb97c00a38bb7a4a493ae677cec267379c3a1b80ac2f4612221976ff4c7afc685283af88ef813a9beb73ef380be8a31c87135c6573c0d1d5807e63ca6f1418b947c1615233b911736b0870b766c9465cbb8b29573addb33f21a07cd890f1325c200545d5a21c5da1a0082b9c198158aa2b82cd5d94bf5718d39bac4d9096093c78a069b9210d305e9199d45ac09abe6a8033c971b2903874ac6408b3510d318ff4b464ef16ad3e56bd664cadab4cbc2eb1f13656c6547db33b5f529d253c85a728313bd36b9f09f6455b7594a10c1beaeb6ff178f3228defdd117e6ba75a34abb70e86f31fdb16d74d91e6c1b47a75fe6141a25f7ab9f875f79e0a82d6ea5cde5a017ab637d5fdb7c42646a1d71df +ciphertext: 4173f72cfd989bd103ff41f258cdcd0bcf3a68eb82c10fbb2639b06605ad14a7b2bbe670a38b3c953df61e7a3962ccd6d554fc12e8010bebf1a2471778c69b130f6fd4a205bce7157cf527cc7480e4dec2654ee466cddd7cc3b48d4799775979070722ad3a0873a38bb9d50bed48650e5c0e659c002e1a80e2c81ab18c5862dc734c15b146880018611651a4b9a498818fd650d8f160e7b93f8f669df8b1568e7248fca844e24113899e45a4e2f9d4af45965d2e20b98fcea2e74c21c2c6c8697533b545e9d0168a74920df3813e0e9631970427d59b16b52c4c221074cd6ed9f5cb07eec18de8b7effa7dac2be3ac2e75c2f394084e64a8bef17efba88cacec6b154f66a737d540503f015971d15fe8bf1b6071061c7d1a0713118f365aa0dfef865e8aa70403d9163981dacb6e9af1697745ef842e60616d9915b5d6e5279a3713b0472dbf0e02c9d3521d48ce21b47b531f942642c961a94170479c62dddb6f81dcd5448308df2defa52d2c90af853a55136c8b6b7263078054e24d42d90e24d78d79b76fc479891305046f6a51100bd553a9b37c90b31fb1dd905c420fabc6c3a96583010e5c3c95d8fe722a185fdcfa1014e454eca7eb1ab85448efa60c988ef0bbe8254e749bb0017e1def4527b27d288a896fd2a5372d20200d0a3e6b88428f9766d1a636449b0aa3d88e108638ad159810cc75a20611adac7c2f6402b50af48a13d2c2b80e4535c37e4c1400e3f39d896a578a035e922cd3a214a6d077cad36ba84186701c0b1c6d09051d808137f523190f538b76618750994ad5dda423754e63012bd1d0ce1476753eb16ca8d3af4c7fa329cf5de9666700f8a5a510677ffa2cdd590be997cbbeddd0a9e31df4a8d05b49f52d89b53055abed0f44a35a81f82e82963ef3a74fb1845e40aefcae153ec22d670e00b5c3c21d04d6738e9b3c36db72beb653231f8df2ded30772576011049d06e56f5cee436f02a8cab545cc55126fdc9a0e247263976b6d83de2f2a5174007f7f6a437fb02eebe5e2a616509d9792b16cfad57bb1af018a87f397c71c221761a3633c5d5f8ad69283911e017691fc76096656342ec0d9aa065069b0307194bf5d8471589af26f5f95895c8d5181f9ac05524d4425750448329b53b24fe6fdf3738066a4446522aef01d9ae6d800af8486e5287185f21f5811096996c00892695d0f08d4e7da2a4c019d5153539fce47f7d8d3618e7b5ebd3cb428a8c6503896a7ab1b536da764cac22f3571be53846a117a06e1d84d7b676c6bc7d0f51e9d356c05b29652248ffaf0b2d07511df249717ab8f766657ebfbfc57ffb521a9162d786ff4364bcb2ce620e4f50040dc829af95a2af4f9771d3ad297eaedcf41d54340bb17219996fb726aa9263ecebb5552ef87651d4b46c18610e4bebf46c3f6c490c7e9ef5352f5187017546ff2022c54a3fa127cadf3542c324880d653dfad52ebf0a630d9c992c7284b9bdde76b198d27ea99fc96c2031082d417b14834ea12faa69e310a30995242 +result: fail +shared_secret: + +# Private key not reduced +private_key: 13276431f3634e5fda375adecd8b81c035431dbcf44efeab340562659dc7407599ccd4c146c5b79653bd855f86aca5c7fc13a527784bc1bdb0181f61409978a4754fb72ff03267804b5f4e8187fba34b99a30d47f74f36409f8ae88ec89a7374fccdabb1373cb3485ee31a76db7d3a8d39c12668a6e0869e5596e2a58ebe9ab6ac8d1de09f4ae8508d8b1be756635dcd36cb38b57771083c64cdea6fe5e9aa02f5cd1b7cd8282d787464f4a8beefece731fef736471674506b9bc577d7dfae985896d826ae4fe92d563ce7ddba44b57a4fd48b05dfb27b76d94d513327fea16a5b0fe77bca259cdd46414f13425616bdbd0d6ea24bf1beebf3ea86a099dbc48b4746ad35830d694a219bde233842566b9dcb18822fa3d1b8d7a6fc2a4555278828bbf7bb74b1b3cbc19b343ea659d4c35c67a1caead4f9cd45afb2887b4adbde30ba263321469a505dc6a7fd6b29047a3e253a1affef3d0f7c5519ed7777aab2b955546b58bc3efd87f936115483756d966b8d881e967e37aae365aa96cae8d614bfcb0a34979f7ced00f7d110af456817f17abbb1df6849bf5dbef9a67c973bb14f8953e7597361cd76d539df0b1bca770dfe6b7dddff97cf1efdae59ac851c29a0f9abe7769e82002c8142efd166f8bf1979321c1a6234c6d8257b6bfeba7ef679b837d6a23673a122dbee817b5fdfe9904b2aff9549d6d7a585f074af3bd445a71b431f776009be33d6269caf16b306d444fe8e9b4d4783838f66bebe3e0807409aebb11d8676686ffea606a210f68d6288bc3a484cc4464706538713afee107885834b4ecdc44af3c866ee15d4d29e724e67d4b9cfd795b6520f0cc8f1d89ddc46572034f9450373565e330e887e6c7ebb47e97aa498791b735733a8a81da6fa68e3f231fdc4413d56b065b379a44ba71e88c80ed3511ac0d894b64584d2fcaba830fdc13db3febe5785b44b9380ddf0ee1544ba6ff8fb6447e96f803ca4e7066f5e0758ab5d1c3e7d87e780ecb1893dfb23a7fc9ddaf83beb4f3313d64daffd8ed8d81ba5f9eece63affc3f595f74ac0e430615f7d215db3494fd16de508a0afbf069744d86f0e03cffac7954bfad6a1cad4c29cdf87b07edcc8d9d7c966b9f94b05906b003b77a083da7887ed340d6d0ce3b4f1ed9a4b51953566deb582d498bbe85c75740f2184f5a16c18b7bb58cdef0a13db5d30f40d67d545f349365a97bc387a6bccfc00125eadeccd375fba522b7994fa4a78ff6390507ccfb8b47e208b70bfae89a6effb068a9db9bf62245e91f74d3ca5b8517ebf5cb9bf02085cf6fca6b6e55a75dfa7557a43116179ab6ce510f887db6a9c5e8ac41fe6de0c124e1d9ff4529674a97fc666c565cb7469aa7c8ab9446d6880a9832dac41fba34f3aabcb1cbd050c66f4c5b53b699fa43ea98ef04faf406f16c16f90cdb504029b2985fcd75fa4df4a59c5919607616c07496ef3d0dc18f1ab27c29d937fa9598ce65d8e6e281873bf1eb36bdaa9f9546de54f5b8b44542f618bc99077cf76cffe5ad4efd2efeb36e8fc44f4ae296ba1ffb9a937f6bf0bb7d74a6d868494baf5f9438c898ce0c95ae4741550daba6c47ca4c3d1a64b97777b7209039a2403758dec41fe4093b014449985121e134c925b37b11612a9c61e97d5863f81a83f903383a517d1ab1769921563b86069c9c20841481be7a75311cb1b2c74f4cc96d2aa916509cc24d33ca7906aad07938e701177b42158c19ff3040389894f5d4c9cbd608c8234cefac9bf75fa177d5669f45a195f420b189bb340ebbba649996863618366766b7c990c6001a397b00b71272cb1734adb60a5b1523fb46be42752eba4bad8d6b008883e2697747ada77635174d5f7abc89157acc61202100cf719c9b8c5bfd7409fa95641202384629b925c240be94889bdf96bdc176e4dd3ad75f7b2e4c2abc9ea8280f07df64a162d016db3a634071944f6468e00aba03255430375660bd2c413a0b3cc530de305948d783afd0a41b4a202fcbbb620d9bd47b1181859b66f922d0b5c464f71ac5682829c8c6f4875bce8c37c5212113cf77a8cf480660b0ad108a0b67c063ed52bba442567ab31b30858cb33584d5422ed7427bf085d163005bf182c90c96cbc89ca70591dd0606f95dc6acfeb3315274f7c4937ae511963e90e6d03646292743a4178a6f344c244194f989e1c34be06a09bd5086c73992da8528caaba4fbef1502c1abb01b145a7a825a971a001055e2b1841725cb06eb23625bc0d99f89c1998023d760db1960a751988529628b6aa54308a3c895688047a003c089ef4a3232fda6aea0194154339b75a0a25402212211f3eeaba98cb656925c34f46037a436f89e01bfe408c138601e3a490675abf367194b377158f131b12740636b92bb5d184c05a23cea0c66519b2e8b094610655699976538471d77bbb3a8613a3ea1ee7b22642d63611b498e302540ca71e9b5c1aad6bbf309a13f9ab5eb57a5670fa9244280867ccc48130c74c50219da3168a26a52001713ee7b81157a6392199fdb4a56631b2d17890e6b0bb82051b9a1c85ce8aa92a2557ffa499c8910f7e98c3b4681ebe6323f4794e3e7324330a710b6a87186c36ff04602fccb97a7842104547264437921b413d52229a1555226a3bb3f090bd8cb09df92f4b4093319c434c04a773acc094bb205062903adc121ff6c178aa5d02f4b401e2b43bd79966d83a014bc8a8fa8347e1a9e8c6947134b837f019b05124279b26f20414fe326f3464929105974a853961a6b55ee90ba8d730be6a51fde90b4c23753bd9728077b90bf1c656c0738946bbbc5a2d72f95d876437c659b1bc663f6ab2b9026ba0401ac168c05933dc0509f7390ce8a024a3a1267217bae20c0d26c9d824182bf67ac60c0b121184a42c89da7a1f2de023ee6c291dea37da360b6f912eb95727e0c83efe0796d603b1c4702b2532af8d34053e1c70f8b73d5874578b3a2a8108b12e603d8cc1637d54bccba48f73d08f63c12fb8bb2e40938456c46209b262d8f08fc9b576d463329057a7fcc86652008832712e15e31eba79cb33a58262f822b9b8abbe8c4a025729dbac6f4df64f14c9959993004e0a4398b7c1e049120d404fc2683d65e85cd279b8d9e9595e995631f3469ca25412a54535c569d80c2a09117733f529bfe9a9dc766c8da35bdf0b64d1c27d0fe31ad736c06a92186034468539a3adbbcf0e67af4e797b63a0494cd91d2b9b89f8d486236b9b24772383d81aaed73286e5dc6e35a1dd0121b0a362d8c94022a515340fb2b71b8aaccf14842a6d4ecb713612f801a5044147fb9e6987ad3863759de31e11eafeca9e810796c34e8cfce9d59342884456007b01ddd12edce6d10ed87e4c +ciphertext: 6c6860f7577d496c61de133295defcda33462d99ab13f9265a9daf5a21ac8db6e6403d0fac8dc4a8ad196a93f7afc736d23f2de65a506c97b27a3aea84fad37e113607e5883be0500719746c9aa8a0992e4109d0009f350e44990117f9b80083ba57bef99d7229f4bc425026b522eae09bb2c45dc2c14bff8c65a51b624874feeab6979193f085b7b6900aeacb63a2bf5fb2f81d0b48f07d392d83eeeab6540c9b1d4ff4b3068cb471bbda0d9d336ceaf458c6f6acc5c5bdace99ca483a310b6839899f421b15ada7520e35919b475128aaae3b7b027b872c5e91bab596edd00fe954d06e3e8fb8cea0ce36f98482d55688fea29c4717a07d01fb4c5f163cd85908c548b91c83bdedc4c695e0929b630aaedc2146a099d576821cd880fcb1a1a65a58c14e278d094fed63c67b7c6994cd9158aa9e15990e68945a679534035d06e1b58012fefd73461c0f41e0c0630f7f89fc8e7ac1e8e497a2dd15e3d82eca2b5eca09ab928acebb08854959ae39a37190b4e4c6fcf1d7cd03772f10b49e5662b1237a58b2b11f597c51f23c1d105896952c4b6ab6cb645758de8ed34458ee91a8a1682a8f8fea432ad3690f0ba73f980e4ac88833b5b0a85bcba239ee176f00b78915ef7467dfbd42fe23e06deccb70c3247382ebc16b85458d284255fe85bf0544977697019dd417d7577542541fbc4633cd3ccc979aeabab5f9394fc7c7ed15641927f2d7ed87f60e7306dae6ee40667ce715329a217da1334acff5425bf643c1174e9927ccfbbeda133fa2e2a1c9c7fe912f981a4452a3e34caeb6a9e898368bdb40b4dc40915d093e1417c330e024f8a9a235d21a5184a5eb890880eac4051630bad9664ae4927e2e2d34a408de897a2839bb3e43e88e4f078be3c699c7527b8279579807c9a06ea58f32bdd5a2bad5193bfeec0cfa62ca7afd99d9261342e4179449a138066bd563399c0b35538ad109c28afc5e16b2abdd46a930246b215d57bd605bffd1cc042ef447c448fc4843b13d4608876c85d473fc5a663b2112692401c7f833680766839350c127d78ac462c6fe132fd9b1672f94e9f08a18b13ab344b87dd947a8cd9dd43f805e0d8d56c1d11c17edf45c60c1f26c364df7830411b3c96d55a1586ca15220e68069041216a2eb7217113192b518cdb235272516e766cb7b9d7a2ec1a9c32a3d2c885887cbfbd4e893a11d68546419f1c0e0b8ec69a7c574c73bed6165e32c14363dec9bf27fa2510dcdf6cd0d8ea0a7c05f97493777f9ffd69287e0861a36df8e6b8c1b28513c2e1c47c8aed6797b5e6b345df7d402b64e280e951192eb18f1ccf76c49a18a7c06250e72ae7b5f6ce6bbf86d759eb9f3a23ab6b384dd584aa26688c838ac7da9ef292b927bb7df9b4db4785e345174b46231868f70827615de884e8e2e649eb5b9c204ae097feb997b05d9837300b94e95f4356414e0253520d2b49ea98d97ef119f5423a3de5224e33d853e67eb0eeea5a101aa5c5145eaeed835a6c13d80c25b0e551ed2f357a9ae8b1 +result: fail +shared_secret: + +# Private key not reduced +private_key: e5b9d6286950dc6e87790e84cd4dff14a9ad2f7a382d93403308b8677cf0cccb52347a515303a2bd15336c0b711b3a31e9ddcbdb59bf42633823bcedf61c63643e71282b537ddea19b9de60d97b9dba7322d93557713ec082ad3599dbe315b7a427597979eb612b764111ba6ac57afa51cf9ee436af12e31442c5704b585c663935ab698dfbbc883df3fb39c75370b8c199cb0da26be27e8aa649eb5fd3dbdf077490bc677d6e631b05d4b9bffccf7939536e8e9455b91ab27fcf01639fbd47618b8708f56d284abcfe7efe371dc3b00e579aff432ca4e7d346eed9b0e70bbada36a6dd4eebe859a1e8146d83ea548ccb0069a3379430dcc8e3e7f8eaea7433ed4a704987625dd994d45437409f28b3ad8ed2db2b216482a1c820e8c5ce9a4e3dd69dbb14fc9d294ad994d8c407b88cf6b32bfe9b95f9a9d45a33184cc8b79cbbfb379639c9b44a128c211f7d0a59aa4ee034e1a3375de2e6ec4ef447757c70a0b4ecb7be677755c3289e4cc38b4269f5fa0aedf506e8cfe4f5e5f55c4956be4b08c64f986d68daa8e711a3d00fdde48fff2f30e891f6c7c53ff82a4d471cc199e68fb9bb8bc81766a457a6ababe254c4aa96546b96f56375e68c9a71317fc5ca9b0d0d36b1f1b663623d75f7fd71f97c6c2ab44e98a76dc767fe2cd789ffe55bcc976cf1b879f2ae51606b9972f5abf147e7cccb615243e0d0775e339c909e93477b9b66fb863e726a4f33ecbb98435368abed797a00db8b4dfaf36e75673ad8b857206d03d5db0767961f67ba0b58a668b0f680f57372cc8c175c6cac858497eabbb840a5d87389c7b6f3fa67d7353438e7a4388a1c34236294370343f90c9b38f4ac28d187bbbcfec3d656c4eda62de9ef7771c8038b67c80d58edc08f0526344c49bf9f73a5198bdb520cf9d19396b8c7f95c05f4d3847ec720e3263c95694138a27fb56681ed1b1fd6f6b568b4c05c486043f53c44f321a9bd98f7312e5537608b5a2e7e23a8ed81e8bb7a05ab1337afb7eb487359bc8287c42add6b72e5635e9ea945565feaee4c9291fac33ef54a90669cf77f8af07763fa3ba74fcde1d8d90f37d6378bca30fa69c85f5da03e8326ea4917b75e5fb887d370ec83c5b4f5218d4ce5ded0c67cf239f99cfee41da094a601e7403f94465d6f761fad5ee2de6759c60b14c352c4ec8eb6e9e5bdbe67a95eef894f845abb4f7a6ad75fb610408324ea84c665b36672b5e58f985c3a45bb309f7f5d8fd16e5e9313f71ac83368d28b2dcbfd8345db6205c718e2bb4aa25e8fcc3c76aabd2d678732b4bcb8dd4cd9c35f6fb9e9ad5c9bca0d6e71c1a754787fc957b74dcf877b106fa21c7a17a7a8382c8ef45ffa6cf559b761bb58ff8d31539c02bc3f2243f513a2e411c89481aafae856b65c1c3b114bd9a6bbd6ad6033bd8aff7aeb397d90ab3cf5985bab7c826a3e18474fae25755f79667aee64918575118349ac1be9963549c1707efe14944f98b5eee7d8b2aea5a305458f699505083bf54ec70b80ca12887e5ad2d46edea5ed82fab14fb8514e67e45343db7d9e324357a99db343c735c918464b63faa2d9649d34aecb48d39b176bdf69470f2ae83966fb94b3b7294a77c72cc5686335a761609caf862810ba70e00c83da3cc1c208cd893233c8ac3247b013417cecd467e9cb87280aa13b061bd0a661034ebabe9ab6e7a447c2826af3cba6798270a36f7431ae9119de2245704110d159aa438a6f1546a39286a7a179c5f286073d5b944ea2000ab61fcb9373a4a94dba5c9baa94056f35ca1810106f2ce65b579c4744f94955db4730265053b812634eb5156ea819069f6371040408a2036019967f4163c1ea611c02ba295a51581644dab07872d1a5b21a32d0ffa349e3739d961a9e9bc07b6d8cba3b945be491958813600e781ecf54912d70e37832e05784c5e12271a5aa5d628233062305a28493bc2b180d802423aa4f75cb6610c16e8798cec72253798b189eb217238b5d063224f78114715818ac4ab40d34042860bee445fa9b1b02dd5a7c7b6bd8b03768e7c38282806e5fc7a93a9094246a403111a39bbb89ca4ca33f9b381fc8d6447450d3b4f6c794b565b2735f8014fe35e78a94780bc1557bb380db47d25791b1283094ce08ae4ea9961882d134bc5579aa9fb44127e2670b85001d58a162e38680d3c8fd2d3517cd4b36aba9bf1930f3d4c067f2a5b4dd702cb9b9e138bbfa91c0f49a86ba283091350a2ab3c1f3c75ca20a4a160318cf88849ef2102e47211df95a2fa325573f60ee7ec5e70d3b88d291cf9110b9906401968462d2ace979a825b088f7c2b330fbb5f15b1b9f24b84a646cc6a9b27b03767978268cba750b5429823e7ad3a00a4e813052011bb0f47cbac838a489c568391c7d05457f4033814bb9d52a011ce787f0df2ab1bc885e293bf23900f3fa019238b7447561eb85b296930232b175379f289982312790bb65743cfe65017be280063c19b033c19eb988d5a827b64777eb8b13244a9b6763c63523a6af78672b652ac38f33f2a870c494b1dd34a9af239556ed9412a48a7b3501daaaaa976daa971c1565f37be80c33fd3126c7bb3aa09f47f4c9c503e2677325418ecd2058fc7518fc247b36c0c8f59427bd2311ca493510794cdb734cdf69c6b1a9d5c990424d819f35ccc8750b4750c43394605bb60b7c4dc39d8f71dfdf1c6da319f6d671aa170065102086665707b95ca4d241c26cb4acbe928d23318d372aead3a99bbd075b5186abe6590cf5278bf289050c13789f82476620472baaf258c78eeb7755f6c6b1a113d91da945a837f0c84b353f9aa1c223404a3c071a27c84a6ae90d31a0d254234a18656095bf989456cd9aec6a837df6880c9ba79476431929c9b22d9bac09acdd8d94b7a884e261037f1bb5335f98c4c491fece5ae0a485611a50224809d48aac84c16957221924d3c2d6500107e71bab5580339b0832e0292b89a3f25bb40fa0445f2b3122f97856f739aabd568d1b0851b47ac947b25d2da6910d05b44e26088901d487cbdf2f782c2e35193021501b2cd264a6526b4aa6dd439502601fd7b203b088361e6218c1b72854648f4023199e5aaecd51a33990b74e4366c07818efcad158a56ed623f63c20e5ea3c519350cfe16b0dfd3af10a45755641a388590eb95b6e5158ac5bc4aabe686140b981cc5c2ac896945a4be089201b56744c439630b56a15b4a3591acc88f3c4680311c24d80b5725bba86cdd22a3732c6a1bf7cb10f14d57ee8e5901e46b97e63848efdc76368b797da13cb3f23ccbd9ca6a75823d1ba14ef03664560f397133935103ded2d7480b9911136e2681df2ef881b51a092a9badbe72c9772c169808521c47149578621e28 +ciphertext: 5c2e0a97eaaca1d05377bee9a9f4cf0238030f6540802e2fae3dcc7911077887a4fdfd6c55272b80659dd86dc65f1f276ce11b1bb9e7967afdb9953976cd604e988aa1407896b2319618e7552894eac35c553ddf20e591510859354090d68b2665bb15cb352d4afba522f3eb03fd09e30a27c946f738e38eda2b6e8499413644efeca48031edc811f162c4a419eccad5206dfa59e00679a4ca5d2c056167ec2405c5241ace69dbf87b4444b213583e7996a4d349e32fbeaf611a22ab7631f2e908e0e02935899f248f9c2a0460ca4aa21e7dd79b5fd84681d1ecf7a951ee903ec1c4c92a1e928a09755e43fabe1236d383a6dfee5e75456ea6ffe1f9dbbe61df6140a432b59d6bb4a98626a62b581519a8ff93e360753f08bcaa4d61dd89f0fee8b201e9046a2afb4168215d65f097df589b12b8bdc469dad42ffa176efac5b903abc65df115d550f30fab8ed459660e34b49e0725b0b4ab2f797ae4cf6e7ae0049c539953163b040999eac7dc13ff238565626b8efaaa2ef0874dd044afe71c4c7871610ad497b82e086ba9ab31af88187393e4751fd85f5bdaa13841df1658e11827d44080094c95f3ae409bae7e1d9bf337338eb4ccc86f832817a12aeab3dda8a83433bcfbb15e989916c8dac1e758368f60d515f475d6eee6545ce33be1700e826500e302acf28e7eb8f6ed90154cf0eb1be1159013fe663ec45140e73f079af6189fec534535644557ee45870e683f040249fdec1e191ff1ab576569a2a0af75d5aac79c20a1f27b738a4d96d95dbfd8bce713031631a89a7f79ad4e9e78b17521485d07d5610d3b3554df410053ba70f8663cafcc2d6e50516240e347b5ff2e554567a7a8bcf2efa694193306727f5bcdb0c69dc32ae6bc34d555a3f801ff77c70f9bf6fa0ffaed06b1ff713c9de0502be15da43c3e7624f6256a0d59920a7f3ede109c0231dcb2801d71100b9ef431a018af4ed9e882c2df9095ce31443a962e1b39110ebdfe9ef4b575fbe5ab0d5d1fb309719ebce81687e21b85450768a4b074e1ed627c7bb2d9083862cb904a4724014e9efc5066e4cedf2612b66577852a28bfa879f76d9500791a87e884d3e7b434682c8a3dfb6aa9336a5dbe59da7091969407130e570151df14fed6a5a217bbdda35cbe20354292ad625ec1195d936f7692a123f51b90208e289886473d33cb2af68318059c4b98c9c9bb965876147e326a0d899af928fdd439a5283b550207c15511b215e0b8974b57d2bfd176a3d6b5c35949044741453576dd5474fa53f81919109c059e2f068f91109dcfb95c216cbf9e91b670a4249f8d91ca4e900e5cf8cd41096cced87c9b0452b476cc7049de394ba7d44908ebb28362fec85b08660965665c6256f63dc6ad9f6348139fcc7e989e664819cd46b0b788cb25b219da868593aa650903b6a5cec193c3a494303363e170021907c41ff4bde1ba4665dbdb57daa18c7618ae25a0af077136113512c1fdcd894a59f1ffae6d0a2631124f7691b5ecf0fcdf01de92d27e +result: fail +shared_secret: + +# Private key not reduced +private_key: 2556bbc99ca8edb774f8c4f7991d46c94cc9030fdd2cabeeed7555f90daeaf7fecd247555b383508a8a6028fd695b546a02e627e0aa9c71855587e8de1ae6b920454a75fe52c779be0a3d7ddddaa6fd97909f7f27ecb7db209aacadb7d1bf5ae03dbfd155e7862bfbe3e0936b47b7cdd488e22956b7de9ca14c5fe848c90fad497f7debdb42c799d8a9b52fdc9a3e383528ea2d3ccbbd95785e1e3930c5edf955a311fa69ae39b9a240c50c32ec61d687853658c6127e7ea0ce5f9af7f8dde90ffd433d9d863c63d425db8d72e467893c7b62136d491fe497f4470b445d7162bf3729a5db94585a9d9c83a9554127ac9b735fab5fed0d346cbd7a496501979cd0b5317ea39adf970a59daa9f2b7e4eb8e22a0dc1c98fa0cc0e62f9256cdf2ef6df07bc4b4dd42c6587ce0b3102673e405b623416c06f9abd9bd6feb70cb794844a6b4f8ce8736ba9364882aac621e3d4b98799aea35288fdf3290335da94ea51e4c1b2063f1198661a1cd1316bf6038efb48de6b5f3be9bbffa680be3333dcbec5d9557ba4a2f113d97f14be6c276f2a195a57b9b28c4efc6967a3334851b075a7c4dfac74d589758df86aeb4b29a8fb002d57525f8c3ffb488ec4661bd58b276cf29bacc62d85b8b8c560a02850ee24aca565ca30168722ae82936ca8a75d8226d648419d3038c339c613f33b9d46734cde16fde6f7fd80414734903bad3393c5671c5edee3cd8ebdcc8aaa4927c78d51bbf30abeb053e7d0281adbda9a5d268ac47d746ec0fdee6bf9e264fc6a181ce051a5a87038bce12a4d70a3dba259cbf59d39c03978464def3089f2c763be3bf83fe44e47e329d82a9da4520fa1d328a0e90a8e5677d578ce4ad544f6ce36b863f5d1062a5634034b98da407659b9e8f3a53a9d7d511ace034ca15b9ebc8ed3715be3c095c6db843fb6c068663e6e781378c9f6d352adf794bac9dffdf330dfc77e492b6ca5bc53df2ea81ac93db6c5f0cf3ab8b483772a0ed2ba9fc7067d30271b4a7c6a7c61f399a34df1563d6ed3d8a0336c80822d6f6ecd9cd9ceebbeb891664fe661bfe7dafdbc771bf02393fdeb6492ea7ee84827a2bf0af8c13ac42844b3fcce4b0b9694642791254fe96e95ba94abf9265b58fee38b9333fafbaabfb158ff2307bda7b3d04cf74fafba6c464840ced7bcd38aa764d67bf20a88e9a99549fb66ef1a53d1ec60ed744632c7875299b056c8c9375c6ef5fe47ab9c8b134d822afcb6900f8d4ecfbe9da530c14a552acbac77e9e4c66ec25284a9a4dcca04637049ff9a99cab95117881da8404596cd0a38d04a47a77f96f3b5af811ac6b90f5d69d7dc82c829abc5be4ffe35e507bc97108df341e382da5f4672f88f34ee6814977225659c8d4fea091da523d44190a7947aabfeecaf62fcbe6a0ab35100385c238c55601363cc5996fcb46455ce42c35d46ec5d7d506f87630babcf485bc6fe9fda9d51f12a3e683a7d8acfec2f9d3136b674bc1be490e9e548394738d4e7624d77897ba9ba577f8ac9b58419dd32973b436ec05385788be4b63783728d59cd5539413cdb537826aef3e3d4e92dfc6a4bfe72f4e8539fc35ac6dda55acbe3c6417e179c810dd34e05e23a2c42a4b21fef3306a34117e05c4f4736af0e8cc5ae6bc3f294188ae5397ef69f26303f9592a694e12916bb56e5aa43cef5c183e6ce00f78ef423c3a838ad2cd3c4f68c142eb23dd5f774054668eff212b2bbaf8274c7ad10cfcec5b10bb603ec6ab33c963ad2a22b23f7412f93715a3b0be0b1754ef383c2d52a5a16a22632c88a9635af81909d347e64715806f93e0aa26756b25a8f5984f8e298abc12be53850b83213960428562455d6a7bceef90355318b5bc78734864d1af0bf1393849ad715c711a5226065586b80f1357d961a9ba74999c8f47c7583675245749bc56152f1428910324f2706c8718208c4a13158360365337642279f5009ea86197109b78f0a037cc298f3085c46f68aab45379cf59cd504a9461b47268ba03fc7cf7b1aaf9d461bfb3a7e68b396419a44bd56462e7aa2bd82223a09c155d26dff3873a6052472d6796e24bb7daa3583711cc435a9b3d3463812734b700614396a6dac3c2d838ac103d04239c847241835768a2bcc3d6f8567f6c998b4e7ca8d30a81582686f211936087d3db54972615d4a9b0e1ab1765a18c753fb9513d097322154ea4a3f934c8fff8520af32ab05f26d1030888c0a1613ca74164793b5f798ee3c589684bfb115cd6740bdd5141f1a17393b191550192feeb3c8d2c0b4c37790091312fab615c6d194f076c49d01cb97190ed9d4a6bfe0957047933e2835353085ef611c6f9c1f86dc4366c45cbe2281b0910ae39aacb271c03260648f7c955e99367d1b130c85289d586272fa28807ccd909185dbd5999af47f79da95ccc4859e8a84b2983f0e9693b1dcb506d7b7aaf03f158759b8006511380b3aa4b46cd060f96c0e16060161698f26e073c2f74e9c5b31f9fb4df5dc0f3b0773470bbfb95135c39199f6f281280480ae88573284c44ab9b91f8942ad423783263927c5857d5832a6e1576c6a59e7b1a498ac2f5f71c51b4c9a36cc4d28c042dea588a4756740782b07cc245a069d42245943977780f11eac0c8221f9938fb05a5d096401d2a4bea8c9f46564af831c907c4fef6743ee482339212bea730113a930c0a5649951abba2c6a3afcc4738580c61a4730aac4dc3c84dea158365cc6c760b13ea10b194b2539a55da5f01ef6c55213815fc6479f1bbb67d5754161d4064ed1247aac8edc486a8ca1b311fc653da3be4fac0c81ac0fa54b99030ac2f824598ecc699a31973ffb34648183cce8cfe6495723975c7ed7cbc5281811462cc1ac48fd9c5ca3da126b8125179b651a95b7749bcf711a018eaa951cc078aff16bde9a2f5b180ebee3032b5b2826ec83af147af8288470b267a97c5ab0244d3fe538e986000de3807132937a811de5228bfdba209e642fa3095045266e11f46e99f1b1eae584dcb8805d7455d3435956cb1679b8afe26ccfa7224736998aed363c0d82b1d23b339a16abb5e60dd447bd78c80e6657bffef9bceb18a0c8e602936ba32d24871d6470c338921366a009fbade8f4ab940bbd22158ac5201f09157d0c010825b290581b4108573e720acaf53344fb876db0bbba53d14a26dab409f137535a794294814e2b3f8f42c09f323e072b2519588342448e24a769af363293f4c8786ba4b70330bb80f37de30dba857dace4b8291ecb2f6ebd5a06323b11a89242da833741e9c468302cc5af214ceda67ff8161b29bc300c4be8e1a4139437aead8a9ede3cd4ca6ceb14f7662be0c42779459f69a145c0e2ce9f0bd9a0cd1bf32ed5694cc9ae32 +ciphertext: de36243ef4f99396bce0bfc9d8d3d2165aaf7cf15a636550904066b0916c4c877408c24cdcbb9d976024c532da78c1fde5dee90f86729975d698dbbf24c908a81eb44082e49a713a2412352b90f4ed6ca485def0dd5dd122fbf5e8bc8b2d2d1b66c1cb06c9ddad615049b66ae4d8fa24ce3d78598d9a973ba08d5e9e24328743e887a9cf96876fb5ff48ff4d530d4516f912d5840d06efb6664270bf8d2d5d7ef22d637e1b5d47728a6948dca765b79de8d08b151df33b27560006026350c756da22797bb886261060cc95d1adaf05436670f6029e4256d033415d759a3da6012a6d85825a2fa925751cfaca26ec701629e348ab0d5e379fac5292284008e15959859fb2f8a9e137dbd35b71cbf02f5abe1a81c65b745aa2f9f6904ffe915072e053bc7a6aaf67b441ba16f911585f256b0f6aad431bc76193305f4225b6404c9c2336afa3f1d2a8767fd1199e05af964df23a027310cea75db011dacfa4b08157125f883f3e6c00bfa3328afec8f1c638bcc32484a3b039ce3cb2c87677166ab56e0b938e655cc72e87b2fa94a2bd28e1ec65b56cc684f67188a46cfaf2ed8adecf6b9ad2459393d56dfe2d7039467a35d325f52da2e26b436600507a53eddbf9323b8b465e7f0d1921d769ef1ad5d481eb06ea61dde7d25a2fdfaa33ad8028ce4d8275eb7b82c831e217d8ab122526626bdcde7d8208e648aad8cf643b11253b9bd2b84504653379cd8afbf7735ac82814a60e829d20dbdd819b23f840bf802d0c285c418b6beb444d4d916cbc9b169befb6f19bd963af3e3d9c66ad35c26d9adf5f3b36aa3e5c1dc105344d40c2865a6837b61f2ce00a2e2b80d22f6a696d5f25de6e35cee2f3776b2534e5538fe5c27fa1b0d69cc97559d19e99260c65306db59dac203a8d7fccb1b467346cb5e4823b1a0eb5d73890eee213ec5b4dbd16377f23008bd795245e159b46f911b985fbfa0df99b33efd4aa9096bef2497794efc029d719e9331a6c042f4e08f5f4f2cf17a1dcbfeee1e7948b5f57d7a0e1cd26abc8a22ebf0eff45d3e7c16b34f72e670c139b92785fc76787d92e1eda38e4470bb55456ff37418a99c6aed43479152e040e2fc69209c487639ea915e4076218f6352285a09582275985c6ee5d49bbe6e2d9d1b18a721e42136e164437d96f2a134652ef092f2e3969efbcd394d7f2c99f1c12edcd4514be7a9ae7f5ddd5b743c819e12756d2754502052a680b24528df8aebaf96034da78e5608252ca6975db90973a65150af5da69b762724660476fcb58dda5b117b6c988dea8690bce26a36c278a449919ab85fb9e79df56471ccc6118912a27f2447252e8caa25acd52707d23ea3243037b1722741f1dcbf47fedb9675e2914f631ee01205e77ce05ebdf4c9f3a5203bb719c4efba827ef57c89c619e0d682e33033c2c05ac04c5a02042e0f6ca1bc9d92a7e11148144d6c98101868dc35541ce69089f0e02ff3e9fce5da3d4088c04ce8bd380ff62118a2513acabd71791555c6027f50690c6967799 +result: fail +shared_secret: + +# Private key not reduced +private_key: 76c9ab126b3d022c31755f79f6e684083a496be39aee74bb599a8b6de9940a26535a36d0d3ca572edbcc37e7f1b86e4825bef3b4c6c8a02ad568b8ab61045c3339ad02e68f17de6c17ac572f9ba77d279d38636c9134c501b7c00518bd0f3f93fa4ae613de6488c7bcc4cca7fcb559529ecf0d43c2975cdd865ea72d35f896a8baa784dc41aae270e6b7146bd53f08f9344b30d6ce8beaffc633799970c44bc4acfc4869f1b96ba685bcebd9b9e4c0bdf6a35bc1eed7db866fc9d825a4c7d5a6057dc61244c8878eaf5804b58724edc07fbcbf86d4a17d5d656bd0b89b9046cda291a355ce68a07f79847a28e402ddf8590788b8afc3d95b84f13993da06556a34db16887b78e43c3119f845a3e2f196bb04a7bee2ed969e8ff64ebeba0fdbb54ed8c49c3bccdc44a9d56d5db687d02a0cc8450f968cc7759743bf2ab97f0a4a67d95b93a5c7c51f09e301676394e69acc8aa6c89ce7535cabb8ecd7acebf39b848a8bd88ed053de348ea6a92b9ddf04955edd6e027e7f9036920ddcb33f0e7fa41d3cdcb955b3958348ae62f0db95a4bf377c4c6027353266b9e876f698ee53787dd73bb9978c7984713dfbd0170aeef3cedfeef4c7ae5734ecd7ce2b043794bea196559507a9f43eb493ebded3fe1ae74d67b728c7d97dec31c01e88814be6c21f9a27669fc557c0dea7bdef23d3ad98b81e866500ced9fe5440488f67ab33e0a34c3f11c88ef8fa5736c9ecb2a7fd1ba772afdeb9fef64af7e547bef6f7fe9f32cec559d4ccb36e97d2389f31ee5a604cdbaa53db415e05889593f1709cce82748fdccf57535584d8d89dbd7cc2d857ce3ab498c31b74fb3d5d8b145184b9d6b8aaf8a83bd71d8bc4c536f3c306766a25d606b630229e9759c761035d3c03478dcdd7cde08ed42173c91d7d682ae684fb488f6378678beee4d8e6c625087741e868f1176cd0a7f1ea9efd7bf5c63f2e97430ed0f2844959c898581994ab664ff6784601268b4589c20b4c9873e49f03856debdcf66764339329b327e375406a54a0b4c89449e16fbbf79d7bfb9bdda09ada94a1d572aeef9d009ef81369902683fc30167480dcf230283801cbfbaf3cb3cdf88e18f79853ae3269d3f8a555955ecd4733e48583fd76905de68f468c8316dd0f1bc735cae97cdbba40dc50cd38c53c2a3481b763936be071879d77967599bfaa8baead34863a6db84dca76f89087f3f999ea4434339dbcc19213bec2463c5b37b82bd4d821f5a33cc391cba73e3c7aa397d7eb6f835c29e7dc2276f8fbdfad7014345098a5560fa6bc85d03b449786b9534ad3ee8b6871c7c98be6dad3a974a0936c4598438bfc953b691771c93b83b87579ddb6bc6f67f1e259dfaaedb36cbf6c7607bd4becd03ac9c2b004ec7b9b5fbe9432b9d7c164d938b43698271a991d5af350debbb29bd7b5c5f06fb75b4ee75bb4af853956fc01cbceb619b3e38e4e5efc79eceae4462b467833d8a5f6ec2696b71cf367fb5fecb0dec0af5bc6b6a7bf07d3b505cd5c58fe84700572a777bb0d3fc7b93fe2d6c783d9696e970eeb9af7918585f6bf1d9141793c7c9f823f5be16196b8696cdb00a46d521b49241452331a4edf2a56e0264506cd682e248784527ec73160954a18dab4986fd146767bac1506885a7abbaf203fa7923cf3644b146a7687dc0f56329e3c64b052db6c14e3211cc560d9a70a1ba641224b2eb8e70e44b25b4b346f3037454aa69744d1777498c98ce741ac1008461868839b4149135b41817d135060acecca5af744e982142de574ecac5f1432a7d907628eb75439d8af02d37e5181681f1b249bcb22d52961d20458c860ceb3175730acb9b8c8500dc258fec13677f40506bc76f8eb31cc91a605e905ee839c3e0b771c32595a3238acc079fe6034769652e5cb492da0a3e8c0cdf13c899cd5838bb46a27e343bc62ccb6294c1619af96817d77ebc2e1431f997566485327cb9331a262153cd31c80d939d473b81feb0910e027b02c29cfd66fbed3cd09c11fa08744b9e0b62dc3093c2552bc7a770a0550cd601b2e6559851bbb5d8665865555ae510c2df9637c07790639c0af6b4bdbd567b704c267e6abf2b371f580686a1910bcc02b7ec3c08a7aca3fd121cda343a61c6c995742159cce5503b4996a7a6fab9e8dd5713bf62f3c0792628ab621741034208ca01c6130d3a3499a186fd69db4b3cb77417a12992e8e448fb75b73f4ca54fda42b2df2a4f9e14c39424bd1592b90968434eb8f52a6a1438cb7e589740c8b9b2b6123600b28ee954cf0d18dab1bb3fec8a0ff6379a4313325c7011f4c7fead33c8fb543c3c90b6ab35e01e31e2dd4262bcc92ba11ba055295b3f2a273620576813232876d1e9b18e22639e9c3759eb460390bcced9bb0e368c6cad846767c69349c59fde27405d8ccc900ac2ed762b1ab6381eac33f14aa27c047e5a63921030f8ee7055df00f7cd353bdc1487fc0875746b9deaca76fbc70ef5925ebbb994833a7eed732235b06e6ec6b28217c7d9a86a5396c80d43c22c56c19570238c70e7a7c2b6a77bca45785ccc31d8a880be379b05e45a1b9a8b3b2520826f888a8a025e28abcc4320bd1e30fdd17cbb3018a7a784534379c46639a21227d279b61da608bdf9bb9304b322f103a6a762db152548f192534a94df0ba1b2c97b9af8202dfc646a84270400cbeca95aada593d8f4719abb6cd4a4699787b92d63279fe9bacc0a989a59cb0ad279a567b8ca9536e8107aa7b81b2bf7730b9f4a470c8170655a0842602bc4610f9e7bbdc6acfbdc4732e4266083c9c91d41ed1f2422822acd01bab34c4789a63a700a5a135d65495841e69ca2f5334cbb1fc4c7d42b0f53bb63f888146163a51759c43349377ca824b32091e9b9c30e025981b82cd23aeb5385be7f398aa5025e87b605827328ebb32d6682896298f652243ebb3b8a6f759db824d3f577cfb8aa04627a80a03804039478abc2a627779d1c87fb23453ca254fb51c629f17c1edc8cd8c71aafa135051320f81c65b06711282ec6e7e4b021eeac0c3fc7ceb4b192897899f6c145f53bfa2d68a5b583002667d101a9c7e721f0da0711ca79df954126d9199fd6351be89225cc52d6be5c906860f6ac81c56477cd34c94ee43b920eb6cb62bcf27e5669f9160f0eb2ce7389b8da47cf8b22f46452961457dc39c54fde66a41f95cee1ba87682ca6342ab76f6bc262632282a22293ba7be9cc567700b5c13ac19f126b16a43bae7e4af067d280590ff759d4c3a502ab563080dbfe1df14ac06d254fc149ca4d94813f81c792060502e09a88ea694c5de863ce6a50516cacb1c3f44bcfaeb2ef44d2f608621e831187ce79b2d2f4a20f1568bbe76b0d3d5af36111714 +ciphertext: 36522827b08eb3be3116df1a5c1d91851520ee9eda2a3fb54e3258d536e7b5345ccf7ee7c44e8b141a73f6251067f67090cddd2ae032447a612c6c5ddf292e1cde9cfd07f19187c2dcf0a8e5c169aeb8fa4e9db1d013413e62a7e42f1ac46ca3475bec9f8d4bce5805e4ab86d2192ea38e9dffcad59f45b3f27785d3e7165beb443382778afcfb1282f686a2abd4764a21422fcc626baa1076425e3f986eb51de5ad135cdef25dedc61023ed178a90ae633d1374eedb067896a28cda873243eabc246d43e60eebce06a065e0311ef7236b3ca74f8d0aa1147292f08401444ac8cd66dc7c43852941e384cdfa297910084c0d7a100086f6f41d1e103e0eba1db3a4cb9980cf1c072e3818e2d7ca76fdcc6b73bf91f30ecc19715671ff775ff9426edc903568cb55c757ed7f785135a14d3c151a1e0899820b5db36e7db087b7682d98580c07a4bb55e24972574f989f663adee7b4caa447bae860badb99fda32ba516afb3c9fda27a7422898f0d2f85537d3732c57cf3143009215ac73056d13e254d4ba0399f49761e960078b78da2a709aac554f0fb929c40d2affca4b53901d9edb42032b33b18238086f469addf7d27cd36d55b5102001bc18f3d1d3662477c0d51f37c150be0391bbd15889f21537ed54f2a3e4c4595819d83a39d70b28c4cfa2692eae6e9e3a71ceed89840ac4246367af61a04f90c3bc886594199f3df25a1ee7f6960ec5144313b15a1aa22e5309800ab22f7e690d1dde2bdca0506b68ebfcc16ccd97f6d901d2cf71fb5acf85feb2df8a22679671f1e65955289f35445451cbaba874b5724fd9423591a479b7e2144b9aa1d84bfb577cb7755dd6ea893f077e05a4c9d2697674892b8f66ae9c659a39d7944bfacc6575c8ea3721bfbcf1ca63c07574f3ec4a8d78e42605789bd8d905d1ae70cd4e9a9350ffd007a81a43694e8d3ed28e028cd24168cd84cad519b0b58aea046b06d5674bb656ac23fb3aa258f1f87d34f69e8b52f208adf0f476804e5080bc8d94d666fab802e950ea6c6a1f9f0c201773b303abe37af0ef90527f372dc298efd1b0768867eaed3c4b2a60cfa94ed6cbc4ded0a394e20dc7e5ff857cc7fe7285ba7257c3aacc80c9058de86b265437d0c2c6e9d1fd55be37155919e2435888defa734d4ec60789157693717fb5754b60636427c9e58b5a1af828873e1a75fa02d0763eaadc967f3973f9cbd129d1c0cefcb1facc557f1d8379db3d2b5a133964421691363178e24a8c6178fe09fd5e22cda6d7be38aa32bff539693f1d714d52aece91e93d38500a6253283295f51dd365d7ff6ec1edb6869f8e556e8444ca00308769cfabbba9846574691b6479662a392ed93de8bedc1b03a01b1e1612f395247691865efe48ae0df8472e3a07b34ebfe390c347e7f42b5c6358d679c6a22c84a7eb8fcb60486243caead763cc2db255cec565e094622d272407b703dca27e6783fae2fe6b42c24a9f8ba6444794596538ac4c1666626b3d158370ccb01fab7eba48c7e2b6029be +result: fail +shared_secret: + +# Private key not reduced +private_key: 672a64b0079b3b8ce8878338aee97b73d9ad1033e709a4547a4ec0c6cea6297367bce3b5d68b92a07eec5caf6f3abe99ca2a82bec9ad6318be48d75f9ec7cae3eb4d183fb8eb9a742216723b4bacea934113054af3cc75230e859decea990680fb573efc845a85dcab5c45fdc80ea45e68d4a819644037bd0966e5e7389c2bbc49cb9bcf193bd72b539d93fb993bb73f5f4be54abe3e609dc8ab8f991384b310bca58193e16fa964dc1cc15c933dda6d4ba6cb83c6a4e32d6f8ac1adec5fdc45c808c2d069470095e5ca95c77b486b1db3406665b0201498f82e588335c55d2366eb7867ab2a8deccf48df0caa3e637643455f7cf6f5fafdb43c8787fad449fa2e4f7865ef9566f72f7a7040687eb185521a1a57703de373d6e840b346d91b94ffca34e00d45cfa4b5364432c8ef344a837d3c09c21daf3a967d38d8eb30dd9ecd9b25837155663c9f3b6f6766a4555476bd4d74f350cb2640cc07cce818609033a8731bde7c234d9b8b4f7d77cdc095c11e0c8ef16b3eb64cd6f735e4b585d1ddfd4ddc26f096b99e6c1d36ef1ee8975932041a5d5f0ee9e63bd429e4e17d89b72924afd97770fcacaf9b09f924b9ada2674dd4ac40dc8471acf7e02d23d58a84d2471eda685b98152e6a295538dfcea9289473aeab46c6e3cdff4335ded9d55c5baa4829e8bc0bdb63cb7e631f3e1afe939d1d30ee95709dea6844fb97851d989ae9b2666984e48d62a2dd66fc9eb3632fdc7f3bb54896f8377bec827b50fc1eb3e4a630c52a32d5b4de671ba0ea9f69ef09bf1ebbd49dad4ecfbbc213b74ac06aa790a85757a9be1c95f199e7ca0ada5e07e7ccf45fb3f43d7631f3dc604bba95d8aedbc44d12f73e805eb4b8537e5db967d2738e3a13a33149c00fdf4560753f34b85b85c535ce644b16ed46b104b23b3c51562c47dbd9ff2b44ad0f1890fa8d44003e924994e6996886c55cbe191faecc6aa3d08a4f89d6f708495ecdfe3c02a6b2b30f732898f97b3aca896ebba3eecad6e7658686ce07da358033fb5b75c61beeae72a344293855f47a3aae1ec4b716c2121f8091065a07439a40abaf2e6fc674e4da6b1468b61ac2e22acccf25c0783b5cdfd6da4723ef0bd6e33c55b92e246b9d8ffef78dbc0dbefc7ecec46128863507781937b9e02b5356dfb8399c31b6b8dec1137e5fe9ae01d980e0ca647a7b36790d6c688e47529a32df269dcc378417be4d62bf40c484f247cceb77eb905c6889fb1ff910a974f36f733fee4b75c3d2e5148063e5ccf3984d0744e0bce9d96c38aa9ace4dcf69aaa3fb32282352fb4a315b736774558753d7a1615c9fd5e3d905fee8626fa2dacc96003841934a40de6d4983979838fb5382fa6dee1a4ce03d633275d3ed665fe3ea84953b52297fc36e7888865ade55f3466c0fdeb1263cc0fa91660561c603e81f45c2bd5652c95359e025d988f58ab5f692330d8b631e4195f570a3dc9c926d73373540538a56e22b4dba234eb315bc15b3c89ab64a9a7ff82e4cf0baa7aa540c8273b83a3a8e5132df4e3643353e5a4df3e986abea49bdbfb96cef8a6c4998ce34f7875fc59f0c5e6c39a52b7f69bc769dc6e3b75bd34e7be7c4f86a93507bd5114edc0055afab2b0f8c4481d2316c876607a02b744637928897c26c1c5762524f42a00b27d4ab7c198334a13750b8bee321cf5021cbe4536246a0879890ce6f042de3955e373c113d7c2e2df360a8fb5c76fa7f1f594b64b562d0c3b524756b2f94667de31f9a67aefeca35d6641d17d167d6d955d6bcc1709297c9277cf614423b212e96281f6100074d2c2209f976df6332285b3c412a8f618c5b5175302952366a5c67462b07fb74cecc5726ca861e47d4c599819d26329568c139ecd31b22ccac2901d0bd347ba5f10a51b69dbbbca90b574405d8c0600617e682bf81472018284a70982773434d07286b319ca4e3fa6b24b25171093cefa559aa33ad3a0336a1a18205a07ec4463511d3be9ce0b05944819b9647ffd94337c94b7831694ba31cbf8c7af238c21dc1060799c09bb8aae0a084cab07c3bb8502275398e05058b142794309e3bb287fa32a016f46e9feb9115f09a313970293b25e7d25c4abb623c1959d6246d7e00ba79068ea03963d9598fb2b04879c3379397b086960c0d896e419ca5f7667264e1907102329474867cf43a426b1e117826ca542cce64adcbe154f36637de2cbdbdd6c1ad7794a0c18fa339993e873ea54c3f92a68afe0445305bc97b76c61b3bc693e30b2a2b18a6cc28add35cdcf601554b17df39998516549b823ae1596d2a88acb9433433926af62263deb704a561b2f2397381228fc5b15bd93c3911db634b19cd7217508e328113d565b475393d95c7abe5a94fd6c1cc1283587b97db55109a08b1ae1060cecbb15675a253ea154ee19aa9ec29ec33400e4946b89b5b1b4ccd41362a3cc75808408f50ca8662b236f1830656a432e2193bc4f09ad1fc6a82252174a6530b3b078808c8798c9e110820c295797580a74572adb025cc31c75017468cae17c697a79df023aa250c827c11a1491944b9d6156d24b1f0f53c12a1aaa5946bda21485cd18aac0034de843489b7cae9ea90197cc471444067d01f873175693224c5368e3f3220ae48832c0928e65195510b5d4eba93dd3b217b79481aebc34f2123ce42c0aba83ece60034ecbc0ec4420de32851a998207f770f3e2bf94b047779b6187e083f7e04458c243d9125dd1641ec413ccf0a02811ab65d7d954bf4cc0cae00c384889d1b23405419180ec83d9ccc170e0bd6bca3e2682bf3471024445329a515456175ef6c167da459da6f3439dab20fb28bfb9764d5d9b9af055b442399361e91f84965fbcb31a4db147cf5cbd37b955fa3b0a34b78f8f4b2cf584c1f3646b5d7887a99b3847ba9010a69c89f52653c2c4fd2a6cbcec2d00392a1aa44ddad605d8e1595d2ba305cbc86b24a47725810a761c45c6cd0177262b2c85beabc07f5086ea31bd443889ae657c9528abb2769edc8cc74bc80943f92e88402ec231823e15112ff5624c982be7669010e31ac9494334488105eb88658339db648f30b3a08b7a7b5bd1113a83055f673a8fd6ca10cb4ce3c32645fc42ed24420b222d512c68651a0b99875ef8e913b984c709221228e51bd2c2407cd49a06e83f7f12c15d33b0252937f857beaf9ba79045cba8264d7706270d4787f6ecb8922582b7321c26da7813eb1c61a80038289cc84a923e03d7ae3cb232d5e0c1e7715d7b305d86d34fe89069774bf4339a1249be49b1e5c52e639e5acd0fb97c7eb44df56df5250c6de7d171c467ce6887eaa4ee3d61a2985c1c4d203778597947d710dec806e36b0cd949fe460ef141213bfc525e5b +ciphertext: 1f5fd91c64602f502d1373cb97805effe1fa5470648fe8b403524d8031888ce5a0c69c5b350e7f47038279b9ccedb1a124ef224764dd81a80f376a282e858e2feb10f2062075dc206c9dd2f4880d83e4807dd4f03518f2fe0a57f21e554626db5ebf5aef9e7594b6c439a75dc4d6b86bf0011effd8fe05f7b07088817a2f8b669b71cd9db8c4c5981876d811601a7b6cb542fc8651ec0e7daf101cbe22137bc07df0be881e74b8b09af648a20067c1d98c995afbf286cc566751fd37b78ac33c2e1e41ea00b2d280d6b8a3d963835f84223a172cad0a37194cd8283515a0e8672a5c2cd315790181e6482156ec6ce6d361c381dacfeaff3bf013ac9ed98cc170297f4b1945ae1d535b6c6cd3032d48cdb5176a988371d2c606e4933cfadca235657088da565d528899e147b5cc202225410966e422d31048048ce770443515c403a456a60178e2e1dd77d9af89214df32355b22de9da57fe774b3fa2a70487db5acd94ae8e84a1648b502d3c47122b912d8692673a230b72a7852323b9e303a4fba4b92e28cae78816c9a51e4d456eac1f8619a8e31c37861ebf20364662a5bc485d55e026f4054ef6d01b2e034617b392b9bb8a250d2ba7f40c45205ef68ce88795cdfb2c5e8b829534d5b9ffa91a1ecaabeb08be329d5f4e99bc5c069cc969bb354a9a8efe99cda86937bce9f1b05ce27b2401acd985ac79fa0cbfeca06a6846c273dfaf87e3f1919cfe660c3cd2c2dce327d0804ebda3e5e7b43c9c80c9e1a2eddb342874ed9aacf3895bfb8d420d1377d44effa9a0b2c56eefc0e068d96c59b3028e82cca15e11d4bfb438e5c81afa6ac5a86b9d76f7b9f6b59a4bab581683869ab687d657806ef8ed1ce67b8e6186be98ac7fbdb6df7f9334fa5eb7dc24e5e3084deb1ad0b9892890c1751e5d3f2f67e4cde9fff46fb8a2b1a9348ebad7f6af4f9cbacf7ba0f5b46be61fd00ffadc0c466afc2e6e1330295846a2a681770ae8f2ce09b9b8c1e7e33a5a406b19f428708f55a0fbedbc9f2234a46088d4bd054ab8f5b2849724f0f6856439a4078c315d4fa5a0a7f5566503365f836c567e91beee69a204ef071149c85a9744442a1467d52bbe0f06fe4022f7ce152ea8a543249d7c1bfa48689178daf4727218b39324f0a8eca34f016880302b36dacf76b8ccc776878f0757b16705d9b44faeb02db311a8649fe9d41e377509b3aa8a5a487656391ce64960f34420bf5385b4d61a65e1053f9e0a6559e20eb839b709e8bbb8dad3ea772e5d1c41db14f260c90ad8e2b45306010fc46a0878cc1b3cebb440281da6862c9ddaa917ad5f5d472c1045c2416f7ae434489679d84235af9a16bcdad3f8a300778b5f247ac8a2c2fa3d7cd64759f263e3d8ada71fbbe3a785bf620afb1860e9db1aed284e7e471d7c7cb09b78443946268a50438e3520d86b8ef9d803c395307ac2260c075e95dc0d908b1367d11de1295d069e02ec7c734212d5d8df66b9245280b3d4d63b8b93b97226227eaf9a552a79d442a38eaf6942ba +result: fail +shared_secret: + +# Private key not reduced +private_key: 0bccbf3dfd40d5b87d758e5458749aace6c82dc66a6a7672e534a60474b566d4d60ed6ee23f5aa650f45fb38e7186bdb4eef6ead3744f0373f427fa60968f1bb873f34b94733f6ddddc3e2a1ec916ecdc10aca85b65a9407547c134becc43fd5c746ff3e458bbd5d7ece9c7b13176f877336a7348b4d785c3eed641e1dd268a3792acf54c826bb654ee7e36a3b292fdeb78ed4d8ea4509536bb0d54d1e1e720b3eb4e21be4aa57a81f45b31345f5d5a49eb1c59e9cb367755fe149f734b3b7778e4b3a2fefde5cd8a56636c100f7a704f5691d0383140a633ffbcbdc63f4ff329f46e5afb37d70eef3fc5008637708a248593ec00884a97f31b7c457d969ad8bb44841d5c76a35ab1fd3d31f7d4c009e45f80b3a2c9f5af27e4ff79bf5e7a8f18d163b18ee54635ce141a39bf9d35aa7cc9bd2a5603213fcaf8a6c623e9d524acdb43beffd0adc6e7d673de99973cfee046737b11850dff6fe30d4dd2d8cf12354ab529477c9345aaf9ade840b7ba236c7a3ba508dc995e6dc4a80b77b6deec26f8ac42304c91d2e56998f9137e446e4a4e4fe9ecf7c9d34f64dea81cb4d335ea47c64979fae33ea26d12b2c48fea9ae3eaa71f63f72af878d356447c9fcb163c938225a53119b3cb914bf9b9b8bb41afb99a6c4b6ab505528863a9dfdf79eda9f286080fd537c9fa640ec4a303ff075ab917edfbd490beeebd6435257ac656687ff75bc70f7b6282f664da578820aec3378e9d8367466e936a637f4ddf9c6cf439d4438f645d5b13d84754799ab727dbb13faacea545ec2f5f39495ec22ddeaaa5b31f82f47601af5eb05d00443b3b85c3c176450cfeefa8f583716a93ec1cb9d8e03436f383a3bfd322cca926dfb45564d45fb9d3a5ae8be04bbcaf858a84ec35793aa9d03d3882ad873289a337e37aaae7fb91298fad657bdcc08ff65ca3e554ac1e16a44d609c62dd7e356bcd4536b7ed72ab0ffcc998113ef7ec68f7fa6c762efe9a8a78fe7e5f7f82ba8169fc89513b47be4e470f7e10aca8b85c9d42bf9b4f3ef9221164bb22adeab3da625af85c15c92ffe3630f19c3600fb9b54bc0c2b958c2cd88491b990018bb66996bfe868a55f9c000b7f264a649e535bc5e5cc86c1d79f556947b8da6352c6bae64a97ef3a1bb2bf886fc5e0d284f81534cc4cea6403b8c294fcc5909bb642343fbbaaa170af65733d55f7644366c7f4744c01427b9dade935afcb732ebc6f2f6cfb8a6c49258fe7f046b33af32c3d74472ca7cf64490f0f68f4eadb1d81650385ae288f374a2a9c01548d5a37d9da5e5e54f79cfae9a564166c601d75d7fd3a434269497f4ead316adc65cb152148327f86135dd85b2c8d9ce96b16f6c38e5ced7a2fa3cf12bddae7b37c4285f3faae0e10d9fc8dce459cba60e48f22648bd76a8c77038fff5c57b74f393a9edec0fcd5b4169bbf487769de35e499d382b376c030aa67b28a2a3aa4d8cc8ac6da6f54dc7911ec48076247dc2ebd2198d975a49b3995854c22b89f4beb1d4993c43456bb647c8f83ca66e6e3bf3eb3b7da4a253ada7e2f6ebf83cf0f0ceea84deb9d2ed875209916377f83196d2d4f8c5b918763ceec1b1479036bfa52f5ae9414fa006b483c1cc248a969a9deb8ba9c43e80799f3e287b4263bda1a1055d152be8c84a4df5447b43295d0ba65d2a9b2d15a3b139507a3c2a44965e68e7caa4d9aeb4f67ced404305c81782ca49656775e10aa531f01c66793e198092e2b538df264818e7afdc94ab3cda837164cbaeec93fe2b8b59397482f084af51976bb6161c026761a22dd5a26457c648ed0817ff0a45fbc8c7e0e6c45767b7a720997ca60453785b73a43522979d06b365481a54e8124e9f4274950315faa27f5f8c50699164414398d72321a9d5c2181338de5187baa2c0c5097bfbc72945b15406eb1e88caa3ff92886a6a4fe2c8794700211ac32e1968643ae5a6c3aa309433cab3e48aa93a560fd18550f19831f6c74e811b8be5771244954da635a2fb6c314b9d77f1bf26fab613872d0a2098dff0b060516feea45293e28c0ed088bbfc0165a1906473063e97c5b2825100116793fb1dfc9447fe3227d96bc5e999cdf1f545c8753e4ab43d211c80ba9646e86651d928b0c9e64f5c2ca80b99914d878641a53a6a385acaab6d9b5690d11a8ef5a08c35e80c5df91463c76366282543b08c0bc3054ce07c32fc10ae021bdafcb744c20dd131c8d4146f1fbb282250941d8a1cdae68b4c5961a7a437b3251f144586aec15f505aa79305797a16cdf4c89209b02bdaaa0c0d367e2dc7097a9900bac5cf7063c3b2027ab05b204fbc997f333122798670e3488cf4bc64089a15a97f0c0a4ab5680fb9d5a9a815234e158316f31948b80ca33523e2303838d55ea2368b037a607b643ee8b2488ee456273158a3675b56967ce7b4a1bd2c22a91083e474ab9121cfa0f2bd1a24b27aa317c34b968df055deb839ef172ffd0489bc524109aa9897383f9cf0226810b56bc75b699187bbe86d465c7a44b65aa828c40ce76de88cbd6671093ca1689506657cdb6b3cc5a9a0293d16057e700a3bb7623e3ce1c8815b1d17066853b1cd807c0803f9a9fc2b62f637c99535a1733159ff79a863ba9203d57c80f0bbe02052e41004cd42388fdc695d9722bb0147c55510cfb9347127002fa9038f42551fe1656f1c4ba91c47e5fbcc5e83013864209290cf7d901213a26e1fa79aa7576c7c4103cfa01ec6e1459c9aacc449af7d10aca0a4171b284d4473c9af9a84546b03c7d5cea7bc723dc5032157b58431ba9a895d35f89274e827470babba0342567648ba84a51aa5a604b4c36a27c0b2710b2388b53085603cf62d9ea0a6a6864971323ed9e934d7471e65a4915ada5dd1e7482a37517cfa6255782ebc7b789c4a6d2aa746a811c0be90079f138dfcc812adac7c4bd862ddb83cf0d6b74b623b523318bc807163e6c98d777c7ed0628266bd53a29636b601e162466cfb700ed35b0966a7daf32e7dd67aa1c08e7cca8f18fcb7bd3104bb5408637c08eaca654b19523ac0a031b76968d71d9c013501a1350742467970c2813762c1b4219dc904202984cb49b33e91328b0350ad36b4a7650f7505b11b5c6f0520cccf788b87b5aef42b44b567c42555c74f40ce66cc9003730928e859c77099d8149c78588fdf0c347eeb6752b39b755122e715843ed2a859c02a81e7705127a52d53047f973952321d34d4278739c4bab50a5c344011cb196dba2bc5197accd11b3f6e5d57b37115e763177a6910c9866c85ed61c69a350302631bd506be010a3f42112ae4ea731d515d80c3a21fcce60cc4d945abce7683f8a03d3cf04e46970ff7d6a12494ae12558346dfc8fd9370bf944a0102 +ciphertext: 43ca59d61117e53738b410cbdee068783bd99064b5c2b5238843d7875a72220c28aa6835a43e8f3ed0235b92051e496e497c739e1af2e2a7765bb4a038d36edf99f0f8789f0acb8ace1e1f981d3cb4d881437dd6dc3dff995b5c53d3c8c0b7090057bfdc7945b2dc9e1977faec3879e200e53cbb02e90dbc8ee00e3ddf74546e58beea2a58eabd3f9f513425fe38af4876b8077f8e679584dd5744b9c6f2d4520373da8ad93dac74e6b91c2e186bd7b18f15ddeba8c179375414a42fe1548f33244dc3191227b59a3c9c494133894443614dc0811f8bece03633d38765e214d96da45f089182a1a6836d382256dc0937fcb91c4f38a2e388c327816b622bbc3e2e76123d43e4f3a7b4492009178258c924de1eb0ef07497d3a12f56f61a2667fe8a7d43388d892803a42ce48204948dd9e28d1382575972ea07cfc9727c0b57fbf7456ee01e377a246022d3adba2ea7b4eedb3cd16a8f12a381df1b359dbb3764eae94969b48f53191d8eb4777ee0987dfaed4ebf93486ac233e24554700640d19211c353cc660da14871a48b474199967c7f4daa130c75356d509919e33c17f8336748d2ef4a4787a502dc5b3fdffb9a124ef31f7197ae578834d64e8d1088f75f8879aff16075c48d9fc72f3facd3fce6802f7370fdcfec030c5f70f163c109062eecce2a366e3c5ef156e3443c010e1f2f520c60e1dd89998378a6859a594c65eb43ae734c864357ebbb0dd172a8c611ce8d8f073340330a57ae7bea54b9d62f778f963682a40f75644731366de60038f4a4d1eb46579ca1aa6ec09690eee7384000c35916a1c6461975ba300cb717df5f99de105fb197d2f4c540c5c87e44218adee452768631afe676e5423d4c1c8e0270c69dbaa56f146de0156c0674e60811965dd588ed266f9a0f1fe406894bc7099b26e098aad64585d7b7f57f4170526180f5eb10c10442dff1a3fe1298444391b4bb392e54e3d5549da4dd4de6be3f361d4b5c261abf61e181ded24aeff4070e2aa504f5f2f7b0e63bf00494bbea72c33a972a5d946aed66c3ca411179340246155fffb724ed2714426eac5e331eb5b7a196a16f22820e817448b36d75c2a90ccf453e2ffaea1c3f21ea8ef21908dc2f3346315c703d44467c7ee02316915989c22a6b8254d96dc56b99b6e7802e3855e07297565b63ff5dfdec11b216271dcf722fd46041df8b2ee07e27bcdfd36703d847e2b3074ccb7436b56ad9b33c68fb1a497d81b8236cbc6a585e1dc0507a15a30b3d2180c754a8dfce465bde430a2d24912dee434d59f6caf3bf2211f20262dfb5d5d0413b824e3cf05f0ebade427c741b0ccf53f84cfb488caf6f401ece816eef2f94fa85d72c445a4397d26280448140850990566ddd703e4ae232595e558b0ea45425de6cb5a1f100f2ecb36e9980d66def6daf65249e8487784ffa9425625030e8336f1c5cd9d0100631b5b5d0cd549302ecc86697c42cf39629df1bd5193bfc5a6a9a0ffd04400d0b928d35536e46cbc8f06adb7ec341af71ee4 +result: fail +shared_secret: + +# Private key not reduced +private_key: 890dd8f52ff6435fbd88a985198f92640647b1b3cc05c76af4a6cf3675b42f4482d95993dbe3f7c8d4b863a8a52446c45f3de9e983c05c5c95afc4a0ae96dff16e89407ce555cbf92b6feba8fadef57ef5e69dab804b42285beb2bd3338e18a6d6077556fb4b4c39ced52ae5568b9d0244e12556385329375d55847d6ca3b3c3444a58f82c166a219aec2128eb641936ee65f7a9848567d5b2a0185e10ecbeaa87503a338e99cdabea6db6c10efaa8b5a532a3598d6a99d56bd6cd37bdf8d7adfafac7292cd0e08af816c7ceb6dd4461e5d3e7f382f1efbcd3389d7dbce97ee47ec1dbf261059300b7da34d4d07b3579a26884fd87ecbe19f9dec5b2c7cad8047c99fbce65905a7665ff7536daea8995a976439cd67a7e4fec693ec8beb3fcfe1353c43548e59f545bbed6612655762af9df7785cb8d2d51a4ba328ded9977d85434496c9eab763f796f77a94db4343888eb753f434a1916d71ea765a07c7f21257d834681be9734800fdd46bfd7ff7968dd3ddb499d9b62ca4e2caa8e91de518e7373966b76b69b65b099814e19ec2867374f5dd9b1a76356bfb04beca33f9949c3e7d0d1583f13ad7ec7349c57ab810cd3471b8e8f8bd8c7e8656ad148561d8fbfefc8f7c34f3e92e792f6f79a8feaca75f663b775e06b9376bf66b099135c1a553e5b4cd326b6774b384abee645b5cace1bda4efe6fe967678adf39eb6e76d2dfa9fb14ad444f8e7576f9487efde4cd563afc086dfe864c0f565a2304338e97f32847c2c0885e008536e4cbbad69b78e73794999a5a3bbed96ac7789e0bd59f273f4e04a92b85304feaebbfbcbbdd3d3607d85b4504b544597beb5f4b79c3c438ecf5ca76e2d434857a7ecf95d343ae3ec7a8aa587574ed2773535b8dcf0b43e840a55290cca82b74be2f59e5af544d397552d2678a9c87efc8abdf00d6a36bc6f76d1dc1de195a271b7cb34b971db38f28fd71b7bb4c44358766fcf3d9636e934bf3908ad8ef79ee453958b325c6a9136e58df555485ae036ba34a9ca1333bb07015821187538a58c2af375dd6bed6cafded358bf80f07cd7a08a6a9f6b7adc63ca50589cc0feb17edb3517fba13d9792bc5555b87598946471eccb42e27c9e2a8641c65f4ccde764204ec38fc888914c5d356fda47d7390bea6c06e330f27e47b87a8fd294996b3b6bb0997b3e9a07636fe7206a879177ced2fb51dfeb85535cb3d056e3c6e90f528349b245e1fc5f4dd149d218c5b41b34cbd579c2e3bfeb328cc66233a816e77a316956e37a69513ca6183621417d75c6eb655eb5e5f6dad168f359d954d859550c115c0807e304368546d9f6531a78479544a6fcc492e07f9ff0e83dfa6aea27b75bdabe71736f022d75d383c813b2f47b065939e2d968a8eae67d34318aee8dd1682215631de7e79ba58de54d4a49df6687b1537ad94ee668b36aef7d0311e51eda7706adc6572465289588556df63bb484bec5ea428dbacb9487a3593d597457411c899c2099559acdd3e0759660d40127b92c85a58b4d87682c3e0d165af1c8ee8e743fde809ddec2f3195dcea422ae685273078fb7caa4438f7aa4b45087806776188dcccc337e70949c45cfaae192c8fc0ada033e4a6bf137a2d5c4408040972bbb41342a6f2f97c6bf7b5a05a92ef1c69a3e602f5062b4d651b9af148ebe566059454ae71919226742ac151fec6623bd5531699282cd0651a1bb436d113202aae301a6de6c132dd020cf0235944d0a041f6ad92e404f87432bf3a28035c4f6e236ca6e6b56d924800667f8816839549535f1325ceeb5b0e194b89a5800819215737a40988a43336ceaa914800278944ba54edc65071b63374fb041f07a66d5781ee8492d35221c53495248365cc438b4a65a745a64585242878997853597ce1f45371cb1f97f8638837bee3cab372c024ebe4aa52455283cc2249d82739ea481d685204a61840c856617a210fa431a31b27532b5b0868c2dd0a1e2947aef0575934905ec50c33193c8cbf15c5bb4a89b39c63337b3f4bb3b61b0581fe2362037bcab4c62ee14ac3d8a70486789a6d9641b4a112f1336d7e613b13502de7d1bdd103b6a712bd4c9ab0f5611ba825aa5b344ccaf940c5abc296088893626120b4aa3c73c3e27520b6c6411aa745cd4399bdb627ec584ae3e2a9081c4125cc37f20107f70161975355ae779d74062d4ea062a36a4b63a20e22f3af346a57b37747d3d68a486133857577dc3040342ab2c8a38c9702c66276b5439c82465304f22ca9a316b6c078bbd00a748d9689283aaa0fa584fcb922de15c170412ab5819a18019cc9221533a691503a79c71c43de9453922264ce5994c78a3ce43a1595cb0c761291200b9bdd8b6dd037326e5b40d43717e6507b5f7bbbf71800cc7a1143e7101995ca2c2a06d3a501229a913e3b350cd567e59a03ac54c35a8cb0e4faad7402cf6353a048461649d4171406503d0380f543aae846a21df31c561451fb8707b6f15ae138a8d11b53b4820e97d1293938680546000c7552dea31d4ad50e914cb85935cbcf18821d22b20d309023018a667424ac7aa71532aef2c69c0dc545e3e501e5706bc1c19b5179bd4c4ab22dccc9269560992637a7887b996a6754721a2ffa97be2b5fc2a512788334871577f7530bc06430e539aa7ee0acab022607554e2a3160c2026b8f169cd3537f523b4cb3096dcaeb4413f93e8dd26c774c98daa269cfb702d3592984a3304aa56809b61f5fa4557a08c8ab20a634bca903f456c6e835cbf23f647a47971c3726ca216014459a96531896c8bfe74fd0eb074d74a085bb32bd57857054629a3b19d0105f5aeb5e79d10b0ce0ca1189756bd74324acccebf80e849969bc008adb76ab38fbb47c59cbbaa33f22759d5f879f178a6ec6e37309a15d70c286d7549fea354b438b48d4e73d6b0584469433cb86a74be82ccee60e4a0ab3296a31fdb9a66116a765e2828f3caa12da7e0a4a0a54d1ad9d141b98413c45d277a4e0a11732b9e6a816e3f1cfdcb62d11eb09406b83c5746032e128cc2897e3243840652253b7865a079309b7ce6a1a5b2007b775a463199c4a90358b416435d69bc7c6ec48a155be7570b7fe2626515a09037a6d9dc449e344b0d570be3cb7b70a720156858d8656c296b54c7377456d22ae66402c6fa7a4d2921666171352f56cc03a76365723682c5ef77437a5d16bf343972c43b10f56c5770cb8e9c2a955e89c35d932dc466b0c198874bb242e511f4f4d35fdb1eeb7c0006fafe38c636dab4728b6725dbf53e59cb8866573e536b4017c02e31c8ed7455c841a5ccdb795fc200acaf1da2fb936bb597f7054814869cf7625e45647bc1547aff288dbb90699b2ad84893f3b755d9722 +ciphertext: f96a0a1821b72297b925d90cefc3897dfaf0160826a92ca95326c8de0a3f790f520c64b87b0f47df0a9f1b965f51610fb40e05aca0dfc83ee06684e4ea112b6386d00e1152e4601ebb8d90e8892d6b0544a9176d9ad6ec243995749c6ac9dc4c92a3450de5823f458538464f40cf99738623c4056e72abf449d12918d209c082092bc0df62cc599998fc45bd5f6a1b5a5e58e818bd555017edba520b8f7ff8db4390aa954fe592e48f1f24289092f1b7d174e32343a3a9bcdbbd1bc0f9ac32bc0ada8bea6aee13e49b42f51a7958ef5e5f720c7e7a628e5b93c84aa38fdf3694849bd6994435ee77f9f0ccbf397e8e0982e413be93bcc86f90ab1ce79b767c462112e0ef5ef64f0b096fcd68c6dc654a1c8ef18958a03fabf0b0e3146da24b05b0ca3dcbe899491a30c8e0773873e5d91677b875a333b5996556909c8b6decec93c7f116e86b5828469e8e67e843b04bdef173563be03afc1665ec223a9415450a64862a6291bd1cd8319864c7e3fb21a83f5a44cacf2e1ada9f51c45c9bdfd632a4b1a1df427a12d192c1fd9960bda088f945eecd2c688241fb003cfc47fd8ecadab8af704867266002eddae7d0d375eba342601e3390ac2189807684c94dc879783433fde5a9dae58f31d92f9d4b554bc02842614d0e89425fd293625214a136e183689e1e447130a19cfec4a02aea2f8395b302ad34406b5a98fafc1f8ca3bb145c5337603eb96e8d1b0553eaf63512994b7ea7e130d6d42a078763b3593e34a79db4fed6973e00516fce07ae7243cd840463f4886df76ea643a0d0d6501e3876d4f052cc704b45bf2647215e69808b9eeb118e691544b977dbd5f3915829742cdb1960ba4a5c75091d6d5a0cd894c7a25e19daa208be0cc82e8ba1e5d0ff6ef6a1321c7f42fc80a4fd0a42b0c93ff8e48b2b60d2dadc5c2052b2facc783526fb1c28dd506be55c61bbd693521b5043bb472112c878f5a82c12415582853cb0ca8f542fbcc8c459e0880be34515f2aa83b3ead83914ea582b8872aa7e7a5be89b46b23e0a5be37a354d73921c5fbc25d1dfbbb7629bf38b548342451307db877a807851df9bdb66498a3d5f2b3762665285cc23eab4fe4b1bb633c1debef9bdf8a22a49501ad4b508d0e32e68fff82478c4c6a8a3d8c7a2b78ace428d7282c92f55086744985365443d6c769d359571f98401762b736694e352019684790566517e93f51228dc56ad351e420128d8368c11a8dbc3640d372edb0bdfaf18770fc191017f2805c5a4657c22110b2b39d3c3c9611b7a000a186e44d213f9e0204bd142189fe115d39841779dbd9e4e24c04d234c5a9c300176b1199640382d4a6d2d6139a31873d3f9a207463760b81ae17b0d2e796a7848fee92eb44fb77a01668fe35a1ebd679f04a616b86cb95addba35678a7c2c70f90b2b75b3300d3f73d59cc95482e3ac87754780f96bce1276bbcdffe88b40e06ed94fd80e281c63efe1cf6811cff0097ef06f23a34dce62c8b904a948b5d9ef2d8e459a3e83c4f7a2 +result: fail +shared_secret: + +# Private key not reduced +private_key: 53a58b532f9950c6b8aab3bad4f53abe3e9322d8d414e8e7966365df9dfc0f8888b1eb3411256bea64bcde19b9d05e42e5698316e8cad22846d3ea9a4008512ee83cf1c8517789366e35814393f6252e3a30079f2e9bd7641a6817ded5221eae088792c7d3d5e9c442a47697b41f945d5ccb417ccafabe649bb74485f4c73ceaacb7a69e06647e531b5944d64587ad89cc8892ef0d94c33d998b2fc9a2cdf30557c4bc3c454fe33e96b9c5fc74b2e16ee78ccea0895a782f84b75457b81b9d5e50ab4cabc57b2fb99c5c9978a9a4b2915459fe8b474b66c73fcfa4f3048bc5387ddbad66c2dca233bbd0019bc2b3a89ba58edcae9a8fe1937be8ef6b64bd39f7f3f4ec97df2ff3c886ac6490486598a6f94e55c7faf5ff50753118fdff9385e708037410e3558c87382eccd52d1783314b59578d4ddce8c378ec3a479ee570ed44248dd4f2f58c59ec8b977c9dec63678d494a22b76e1d8bf2093be6a39c696c8ad4def98c258b774a53f3ecd6905e4cd2683d4d94a59029ed84d8feaa0d9f6966fd87f0d89275b88ed075c51ef4f4c51f5cd153782e0bcab7f57e0c038bfb29798df5579c95bdc12ebf6b0d5a599c3ac93e7a26d94b691dcb1007b9e3ac9447399dba7db5b77544636481435cfacd4a92a7575c237d79813447939938125670ea0f7be04462ef8cd0346af6efd3803a26710ba9757a9ed2f855f65adfb9bedb387fc9faa038a996d5ec9278edfc0cfe5754bbe05be682dded54df957b73f7417c4a902fb80468808d099055e781b5c4a5940afd57c9ea70dba990a8f4b46944cf553d15a8c0fff742f21ef7184cd0e3c6814cdbb87b88915fdc92a273c365be8b9c16afa3f5ca251a417816a13214a3adcac650674c30a9f3d74972a61ee4da5e64071da9b4278bee19c2d62da2389ea136cbdafc3565760f95c945e3b819bea8cde4457fb63e2b76e29d9816b88bba368a6f4e33198e923ef9fadc28f7d3cf92195ac1ad74d6437fa562ccdc9b3f5731dcf992d373404be867746c78a89773035d1f7bc834adc9f0eee42564cb53b494b236e54e7cbf87edcb8533dc2d3bf4994860515d9bbf8340a935a53a1dbab694b22a1d3158776b4a95e13e3b8bf8438fb7a5dd2ecee53627abbeae39266d611d7f871465e25a4984dd743a232fa6ceaa88b3fab2caf9c7bf17adb2e9be851e63bd3880c7cea6860a8eafeaddc8ab3bdb2d51f7aebb313332777ac5eec69e107dae83958d397a488727b57553a7c5cfd9e6c6a0d16fae0c988ab89786f764622879be2d2f7b7b7e7a3c7962acda48df3c84044af1d2d85564159fa7e7bfadbcc6dfccc335aa3425fa958de87a70bdb5563eb66deaaca5daf51c359535aacc818abf8fcb75aa4f3e2bc9d3d39ee618f5a697ff30cf5dba48eb786b34ae60e8b5d6d477c3d363e848d30f58679637f728c37eb82773ab186969adc2d6ed3717ca5918dc420bf6df77d6aa7484c730bcacbba7dde26ec525973171e638b74afb8255d8f038ac5c6cdb43098863485ebcc9ec08c6da0c83e842a569c93ad77c06949d7865e3f7c8b6e96d9efbcc48d4f8bcb8ba049669494663d2bc5fe86eb42089581ad73437c875b9d89f96675bf0a8d9c797aa612a100811c3131b8b99b3785a4a32c4ab212b5c0217b18a55190890073f2c12521beb9410040129d5947ef96b72c92ae0f58ae1ac236a5426e7a4440aa42c4bd501af4823cb621c3e6374e368aba59c45932aa0addb3473e96854e8a706c510e17ba91b8b865de529cbd093bda7b6ff8b182ef71651035ea6d8b7c00a6f6efb8dfc0b192c44260a9479539c5a4c38cccc6b1b7ff3697e3759f8e1253cf71e2d7c9119b77090a99b3be67ad965919bdac787f116a67b1ae1c7230b957cafe398027596d510b2ce87a73cf8547977631d872ed714193ba7be01bc7e16260b5bb00a4227b976eb5f0dea457d3a493d19494e5219fc67006caa818eb43ab0d80693eb616b8bb9c87c5e899321d6719801a9982049c6a98c2a63800405867251e20c117241e222a1281745e3929cbebc2444b9b0fc0148b81b96f83b9517a2ab24171c5c55898948b7f16c6a1a09cb7dca509a3876aeaaa4ab299781582cebe73e9ba63390b35847480a9a305ca7b4043ca32fa6875b88085115681bfb806268a7ba33bc0dd5311266e672147b089943c2310136ec47ad1652c681a94ff9d09f87e851f1941ab4755538d50d99169ae1bb2bb70aadc0c87ba3d2cb70f1043be7272663740ab74c05899cd7881be63a86abc13ec4e014cd1868c5799992a58a60aa2bbdc6b5dffb8915c3aebe3c9fc8f70ddc8b9b8bd69fe4f1b60202919022af3df26369c190f5f518a6479decd8626e1c16a1094e2dc7c57a1a189b8b2ed0d4b9b0d90662f134cf4325a1867505a43e411c3fb4c4477c74b658d302fea66022505a25cc2a06713fbe1c2407f187e427a0dacc9c0d20a8ff3c4538a71a639a9029f1c826e8612ba30b2de1c63bbb0f70058f13973cbee40f371c490581c5a61ba074175b6488bc9829ad658568304256bfb88db3b10a4fa1744e220ba121772d94b35233cff9f8ca6053a364ca312fe1acde98bcaa937121806b40c972b1ac1e15700ae67441e399bb0641977d058020f205b258a29bd53fc277609c31150a0134849b6b7d4564d27735507ac25bb2164d4664c0b37cd5b9000d33201831c732aab32ef114902104bdb90b638b42960ac870c14e6220806292b9d6d3bcef1a9b6e859516651f9019cbba1c636ee550a72146ab17231f22a8e1eb68209642caf3814a0121565504859810f4a81cd8c5bf10716136e77fefd995a8956d6ffc0a38f841a0905b19589619649ecb2b24ab314a9a85bfa85cc236d19600c7440771a727e6745829cec312346b92c1685507be82a7d3638d36d4a7641a9a042617c09681e0da904a21207cd7b57f183640797142ebb3aad3470b82511bb88c8cd2af6de0a4f789161f7b2c00e2000c95bcb0d270d00c89c5f102b86650e2f8a4c46c052a817cbcd978dbf2c776cc98d53c1f7db97a0f42594ef18b2444a21bb2c1a59a61ddda53d0105489967488046ff8679187800587f2ac8946688cf49e81da406a2684d1a6495d33a8f12b72686482b91c2272215975a484e8488d2b19ae220cc1387594da69195dc47ac1127738bc03ee72772481892734246681b818b16f06943021363ae890ad5e213303d86f890478a91c6d0ae28e95b4ce2a861cbfd681a47a25545c2a29b75946d0f45ba0aa193ca5544686d9f9a802fc4cecdefea4a0b33387825115cba8b0ae7da0d1aada1ce4ab05bc2479b360b6c56dfa870ca825d82c2f1bf2e6aebde5660fa73356982e12999d8fdafbb3cb186341d0386dead0 +ciphertext: 3db10016c2e241fc73153aa86e26766d09c5f5dda88453093477f69b54282f90c00454badda5893ee6cbfe30e559d3f936584dc92c7f15bbacac3c97ce7992815e7cc2a108d7706f7ea8ae3df2e7b419daaeb41e12d97444b8803d25347c66ef410601d9ba341a1ab8a1351c4b59dfb3ba3ea5a63e69af64f135fcd051ce739a339cad1eadfbb6a01cf1de615406e4cff7c957375ce1db25a25250190f021005b0303a077ad8163b777eb9e3f5d5444432d8db403990e0bae063ae06a47fc561dd283a91f3dec6335cd0f565b406e818d1d57e9dd4b8c4983379ee60e3490d23f052b93b3dd4cffafcfe6353560969826d3c8765a1112d34c2c9b0f650c3d7ffed1c1fda47c7e998a0b71674d4b15597907435aa03584e4cef38a5524e7f2c0e270a3fa24f72aa7b84fe46001b7bdd7ef56046404774231e74058dd32f3486efe98c8bb91512a4eb9570f287895cf97b3abf9c71b175f7fc503275964d50c8511acbddc2374c11265da5c9b3c93e2765980d563d46ca5022fadbd370b76249a7ec1c2aec49d9271ec7a78f6e29000f3535ee273ae0b86747193c5b4eff608d6417134a2d0ece1971ff75df89b74d72efad92751a2751aca93691f2f08fbc560ceac102d03dff61ccce343f9074623fae090155002c01c4a70f9370088dbb1bfcf27d6247979f3fcf2a52abfb2238c4338d8a97618210427c425af435a5109c85b444076eeade7e4ca050f9f0aa63e132298fca9492fba45abee24ede0778113885c46b74aa00f14f8ed6a116d586521c7d8204619cac4a946d8838e704e7caa440bf86dd2b5d4cb3898f4795873448ba508df393f766a79e6523a55157cdf62dc2958fde888b3a9955ed6f690bc919f7c2137b9dfeae7cba52f31d6b1d1293b07611892122e8bfdfb7dee37cdda341bc3c916adf5d942417dd05febb73c2ab1b93209ff83443635db372cf0ed96f0b0d29ca7f6e0c9a85f3ca6fae10fd2ab30e99e4e72b7e7813977996370ca29338eab2a946fcadbe4f2a38b4a0c19ac0fe6e3e7681509adcacc4006a95a3166fefd558d2531c908758f79306159ebe95d4635910e257815335c4af464bd48123a2a160086f6eaf107674d248c70fc7c6fe452bd34638d01e99686216264b360adaa634c6efd771d34db91c458ef5fcb03b337baded312b0ee49bb1931f912c97799b5048e96a2c96e4e65762ef5a533768e270302a028c58439554218274f5c12b3a87b789f1aa9962c6065fe1ab97c1b259c32983f856fd8ade0449217e834e4c478c27cb53eb5a9ce7a6f639c5b2a0eeb2f607f3551c257c5deded63ab4ddd59d242743841041f2502c8a1765f9980065d8404b4bc2157baeb1c060d096b0bc9863a1387208c97f6718055216427b501197bbc6803e1937b3bc62d161a5f55491f8e87c31229849d7eaa632d50df9af1a95e913df81580bc858e7348a03606abd7447d0341802bb6112b499f53378d9a9c882e404ad1fbaa09a2f6e96c37d9f762371970150832f3e33d5533d6475f9230 +result: fail +shared_secret: + +# Private key not reduced +private_key: f3bdb79aeaabcc2b79b4ba975e0baedaaa5c80d842364cc03534d88c1ca3b85faff8adba70138dbbdc45a969c12e36819b5be01583a9e654d7932796190751d393a651844f785a5fe92b567c3cfae877bcea0fc887555f93c6f35e8da23d049e3b9867f6164c1dc6ae80b8a22108625dcc314667d3572b3a8d599f55e694f49e496ad4d2e4b754f97b4203f3dbf4267be95ca1048bfb67b36c00d6a9a86843b15d8440d441afc56362cc3594b9b10a3d73d4fc6ea7c35901066b263d5398f584869d5c6f99b9f583927af8df82ad6b5c24d4e04c361b236a3a78e8614cf245a47dc1b6e354a6e1c627ae63e38101eed49e0c6a923f87dd9edd7546b6ad4891c64cf30fff85edffa47716c8e1da751175b0d5d4c34b569b93d895461cb2382c71c4c5ac2e53493ef487de6e7b7c643d7bae608cd798864d51b12d93904c5f3efac3a39b98d6c69f500fbb7bd6f102f3f6d52ecb72eb40411549b14cdb443568bc63d70f48eb962a5452b7aa8bcbabee0ad090e7493077b3d3ebff9d2bf83356fa7396f9fb8e74a449463e39cb097b6b81a95f01237c967c63fb3646aa3ec063e33a0457bbd8984cd02438a61ccd7af577c14eae5854fd4869ed7c65afeed9761736852a374281db883f17d92ecfb1e52ca803c9deaa3cb130d86ddb67303aa9ceb6098ee46bfe35cecc1f149cd9f69080eed4ae0e865e84c6ee7f567b2497b86c889accccefc6ea35e9412ccf5d18c438f658615793814d93c42ca9b8462568d3e389b087568449f6a9a7c0b65b4c129e995bc3d9117c52a27545f67b8a19cf70d8b7a96cda9ebbfd8b556d97d0dba23f543e9afad421bb328c7cca389fb392fc53b31c41141fa592a5604be84fe8fdb8f393a451ec73b7c831d3aac3d2bed58e17bd68658f73e697070ecbeea3c7994e7dfd4bd911b364f3bb65024558185ebf765dd226bbfa45ca5ab5d5c31edde8b61e3676b7e32ca3ecf87832ae85c5342dbb199d4b6d1cb9c87ba1ee0d7a80166f1e649a8a1ce2cfea81a2eb4dd615794fcdd6dd29713f6d8bae25c1aa94f773e8fd7b6f4327f8f6786b38f184aeadd49808d5b2c76de13b5c36ccf8e2fda5e56dcda1d9c6990c637434fec0179b47c7389e7214652df549f47f4f1136f6b6de418698a66eed9e6828645b8cbc406ae9a9b9e0d7bbe6ad1384b109535dbba89033f22f2335cc9c68aae9bedb34e475d8c5150e77494c7f1b273f645586482f8d572e31b4349368764afebd54c13cd341fc8f7289f34d2e70cb7434f47dc601053d77355192ed3f9e5e6bc40a53e55d323fc76b466be3a6d66e8b0a61a78d8823ffe866f6bf7b77b9d93cfced93ea5a5df8ff5da5a005d02133840e0696236990045b5921fe789e4bccfb9dbf88b4a6267bd4ae1854ffdbdac0d6870e0a76ac5449bb9c9a9b9dd7ac28bbffe998adf5cc9efd3e9cfbe3a0ef93a3fc908366c17a0d4f9f5872668eec009ae4a45bf9c3c6699c2cc57dbc6c550f74ff6dd083ed885db6bd724e7e10a3b98c695fb91f883d68c0e787dc1cae4d50e5493da79630f35e229997845fd7bc3387009b5201b4a6b53cb90b06d856ad48de73be31338b4feddf942acd70bed040d836e12b650c1b9ed800414fe5b14dfca90fa6bb7e350684c3b08656374d54776c312a645987b9c80b28933550922990e2cc4064114ee12f93d3000164c333bc77d566cd91c904965367b2350b87a6b0b5aa7f8a746ffd4576d22083f23c0f3efc4d09ccb86dc4caa55365a8a406add3cba2127ece221c9139c6c273bd4d3b1bc1ec0626b35db44230662cc44af683c92176c5171337746f0f4900b7369df2b705b6387670b411e26288b8680f9cbb0a8ee01c9d0a9e4c61a19f1cba55459b78602dc14ba52a0b9de9da0cbf330d3e71625228a6a9e471d70639b05792cb8550b24ac159c5b069c30740d09065c9280bf2b4f86c1cd9b78357383b2bcc4e771661f4cb75c6589db317058e428398ea7bb88450f22525813058c609bf5b02a3098a619101c092f87aad3881eef6a2ea91a49dd3cdf1ca6952205e74f68ad5c06fc04163a70c0972c4ad752acfcfd5529b75328548c18748026bd7965f73076d4bb8f84159756c879a5919fa7286e0dc39f1884587ba5e124177eacb2a3e96410a64c2d5403ccb939e428b1e7149ca2b3368c11c8e1f38082ab06f39455d55d12e95c585f0098fe6dc44bbc97c1547600d79b193fa838e42cef6bab08d462faf017ee8414c9914316297cd56889207e13e71e544c6793b751174c5bb22294800785bb003589a899a562c6252ea679779522c03a0b933b07f29194c75b29693e27ddc6c4757cac5b9219d98137516c450884c374cfa8572f3b9e27cc706b205c398866df7972b8a44b7f975cffc3401212bda14c0bb9a50a5e5954f9534ee90c0f1f2328c618be5c2166be064d5d0a04392183fc5b3bde635992998b68b8c7bd7a0a1c3bc99975aab55aa39cc0e1d4c019ef73a53485349b58f4271aa29a4c8f8e97935981a83426b3bd0b5edd1cc10458579450ed4d065a93aa0fa734f3206718974ca6ef35191c930ef67819f535ea5e80e54659b1aec30534442e03cb9c4673679cc1cb205264ea53d20e383d98c08bff78447c3335a4c3bd6f0794ba019e1eb130faac0d2f4193a6476cf014ddc988e757b66ac5c95bb7767e6c32ea8027b5e5a00e62c582ebc4ae6738b9637355f62a053737014c475fa24b144b2b47eec97dab92f58bbaccb0c36670ccc9326287fea9fe7dc6a2ecc896652c9606943ca1a6e8688a821b69e33412025e26442aa2f70a68011f8be62db6e6283b9b85651fb8883acaa20885807237a51cec50cdd007b27c121feca8a2c026d82359de6d8b548d9a49a9914ce76584338bfc8f2cb51466414548cef544b82abcd277a6602887e4edc5e09a20b1ff343541c7ff3d4c0641109ed04cbdad8c2ee80ccc3723a3609454b733aec068fe6d28772e388255a87710ab88848722ccb2c3aba63ad04566b1ba4fdb2a2c07cc42c32b18e7280348c245e29ba51b10d4ae840b8f9858dfc68a73215ddd58df30729d2966d11d4a5b20a6d441071bd5083fbc050232b7e594b11c60a5f7ea438e015018d145b979428a899bb53a42a96e081f7da939cd0ca49dc3ee11b0dddf94430014ce96485bde669f214a3d4a88c6e4b3ffed1ab4dbc24c08224e03c47fa2a7d55997c2491717297155e1b1ca09898447ac0153435444c69b3b704d5b99189e346bfad6143bdd2780d2219878823ecff9df861e3a729f913ece36b46c0e9720fd4f96ab2cac1be382907e8cba0702018ca27b28ea8f93cc19c4809885a3b8b2809fd40008be70a6b184981101724bc3d5ec5e1956b510b82fd5ad0668a5a +ciphertext: 82be6534bbddcc94faf44142c820a882b94880f5264e2cf8f046d36cd8968f090fb2353773f09d560bd169849c2d56729e90b2e96f41bb2dbce40562b1141cfeb35b71f5db5f933ee12dafa086e3125e2e5bf00dd7e59a8438013dda8cc40329f8c3627a609a70d6b58a6a6a157ffcaa326d4a19d7b6b8e7db9f19fba79bbb38a2c645b369fc68450ae6c5f4acd529c248398cddd373824a5087b66ddceb5ee231dbb5950ae431fde9d15020960239c4a526da313ffb447bafc9cb5de05f090001f08bab33f8ea68826e8c057732a95d1ede21a1488e15939a05cf250e577452ddaa73dc4bc86d5394ca0ffaad331300d7d21e506bd3b430ad66db163ce5e2079be92ef4d369890ac192578a01fb1091ef7f26941832e424e114ced5598bdc6eedd0c7c0975079d86b781e8de0cac12929b38658189f53a72e66bd4105a5f7f55f7b31fca748598a230dfa86692b0afc55dc0be8160a8ff477a331cf19b03d1819e87f0b7d4bcbb973c43a3fd7378ecd65c9293a758e079e5fb073cb8ec24324e6a45d81e42cb002bed6590085736f30a3e07f7f857ed32fcdd33f0f93c0c22c78f2bffd1c4d3927d694dd0c7e3788953d1fe41c46ae574f22d14f974a7a4f7db391547b74824cf71fc3a34cb782163b46ee505208ab592ea804403dd5ff8d4b15b772e8aaaa132c1f8993788f07809f86036154e27d70adf575a6e7fd962df249fe5d1838b95e5e9484b8b2c80119ff5fe22685bbb6886e23ab3399dcbfc657773f7d7ce2c81b28c2ee7cf5b7465ba0ca6b3e66306e2bbf5ce75c3bcbecf6f520956c2be1412c4113cd9b3696e64978fccaaafe00492168ab764acaf64ce97bcdcd5fbfb234653a349790ec382f2a504fd67472aacdb5c53b20e24084673a8afa896233982de45f191b32d1e1e0bf7b8c41367d26b439c5c868bd4a179de485748900922c4c9d19455a7c9c7b9d3b67dcd6462b30d307d9fef1a20aaeef1b823038d8f39a83ddd30872da9d7a5980728f2b3bd39eaf1cf2a901c3844dd5a217c64c8cc5b489aeb95520057bb78de40578c86cfc1e051ce2da843942aade897468d65ecfe6c4cb88afdc148166d6b1a9a182b3c2fa4e50ea9e048a78cf1a432b812891cfb367763abf7037a5d06050eac00528967d7fe4c3f1bfec7e6c1b4690b2e7059d20bb8459e27db1b41a972c15f2f9e9a43bb751e8214e72c710011d3d0cb44c79981a0a6ed11d766b4bf071289c65e6234cba1f701697c71317833a772c520e99ca5d6ffcf9d09fc603d22390d6d73e42ce59f95d50dac5d81827b1d58a12daada7487052a0bcb848b8f90ad40141f8a05122fa7b9aef5f792c032c5229e53b3ec9e3ca04b24b02db5398cb9bc0214cfa715f192da527562fc521d483fd4ff440b1a0563135085c8911dfbe26258f4568fbb8117802dc120f9fb973ac309b5d1a1d0e159441af9e477943d331321eadb6a353492db5ba478a92055ccd69dd686b14797c51e6adc3470e62aa1369bcc8c8cbdf932af93e80eda2b2c96c +result: fail +shared_secret: + +# Private key not reduced +private_key: f67c9ccc27ef6d04bd584a4502f796e5395ae59862dde86fdf39e92419a75e1b50222c8fdd18964d85dad5166ec574e6c457e5c23cf9ba8b3f6645e7cca3995df7ee8bfb5ebec66f19a4c7f8098908a93651ef374e483c742fe9ec68b480b95f4b9ee55703bde5aa7b5b6c57062c809fa6da399a5e9d59c4e2f895c03dbdf70f55edccdd5945da2ca86c180af10543a1f95bd5c8dbda07476fa556905415cf1de45569fd7e37b37ce3e857f1d94ac9954cc9d9f37439b9b0179ac0abaadacbfada8559c91fe4c7ad7a2836f7f959e12218c13fc360e1fc589b7cd5cae9c42effa75986dd2c5791f6f4f03474a43836bf046cc932de33ebf8fec8b6414928e10734318dc6e739568a0ac4fb974f759c57333a7ec406c6ce9cea3c751c3bd9db336faa9c881d8d81ce52e51a543546548f1a755978edd63eadb929e63d7e6ac89eb5792e75913b95f36bb1dbeb4ff0f443b58f9deb738f76c8ba26e7a9c06a95a86543c2b95402f39181cd8bd1eead184ebdea8ff819b9e0227b34121ca404cb6245566002174ade638533bbed1ff9b37ba4f0814af8fda5b0256db1471ef6c816e4067bf137798215266ee67e759b7cb0a1ef66972c4aae4e612e743a8ac6d22f5f63d8576bb01959d3ff3bfa2dfcef64e897ff523f44f2becbf52ab8f3b239ed3166e95e15d90c15d966769d8774ab08d8314e39d02fafeaef6d9e4089db163e30024fb9e48de058ba90be1757b5ca62b813a82a1a3655ae30a8f38523d84d16dea59eb5a8209e8484037f5bba53a564399de86fff4af850ccf9477d4e682eb024ede552737ccfdf8415f8e9db6b6c103a71db13a9a0e4bfa75cf4fcf845274dd47b1a4f2c3851e7caffd644de376b7451b767e5d3c1534447e013dac033d54eea4478bf90ac96ee16ccb00a079e68345fc626cf17b4f818f3ba685377e8ae596b37791297691dfca02f1ff44a3372c4479e1076af238ad30ac5e1fd06da81364d83dd909e8eb0fc79ea1599f87ea994960ae7db57e2dfada12a28e4197bee1219e345af7336e8df11bfa877e7d5510f6a39f68aeb97606466735418cd484eeffbbb5affd9ddcb7f3518fa69615390401c8e047830f3f6b0059a9a9656a277d5b966a69e8d55dbf3aba7477656e67b68a0aee47e3979f33d996c566dfaedaa21c5fe46868988e5a39f2461a573ead35b7e049990a0f99bf39b9fefa6fca94d3c7453abbaccbab52e5c0bacb8ba27a74288d6fe2842eda3df4858b6b06fd98f3d83e31d78bfdf64ffa4a9ceaee427c7d7d993fae0cf8b51ab407c9c45c11ce2ca25f2701d36ea065389ae499ce967cb6e9af1d75c351af6e8673366377887f4b78896e979b3f18c2b5f3859c8bff841736b3b800f9f3c64fddd0cf81e4fe6f9ea9feacce4deda35399cc927e4fcf17b544413826875338e9beb7f9cab9487d0a563d6b1a88fd6adefbb9f923c7c353fd5b2ca793640a57b439f6858953b7b544317bb85e6189a2a26f203645622885a22c8b595b36e221488c0cab5b3146ca6dd4e6f2e8d8b2e5400a7ffed78c89a687abf9571614ece202e3ae42459480d84712b863a0c574c1d62f57f466957f96db330405b8e101c483077b1c39784914ff30e4c3b97c9c7bfd505e2aa01b3cbcda4096b37aac72b5b50a41aa8f6cc518181b70fd3270561bed0938d964972be491b6331a148317cd548124b7653f1709af074b1fe4424df4bb22ac91bff7c04489526e5e2c82f2973408c4828368b87a7c14a569ed7b58f8eb6cca19088c15031fadc0e5b37c442543e1eb944ea4a0541248496795bfdd56178c188f3642fc0580e70a62676555f6b3810dbc89b0a227a8ae554ddab721c954db21a87fda98477d0c2af2820b4691ffb046ad544b3d3919dce8303e2f27152170a182a756b981e6cbc0b0f00274b521c1782b0516743d17a7d7b4b29f8dab31c50739f68c57efc48ff5b1d3757cd13fb8249abbfc7b5a794e11e5b56b9f20c8e8a5718184167264bae901b3ae5005f796341897542c70545a9b6b260bc13cfe536416a0f5e8440907a4fa1e79a292ba20a461285584d3a2993f2bba8397756e1ac5050541806207fb8b313d0a6280b473c59abc9964b5dae58c6860337eb69396a24aa990349c62aaf8420b49e8a95af404b81870b3c9459acb62749e4ae2cd518e329776a6b68e33a7ac795330a8c1ddf2b326c3c269303bfdc9137ecfc9eda856148ab9dd0a920cac260e6b70a1b500d80d085fb9b91593254372c8e13b69b0d691a508a391b04478729ca19d75b566b472917614a53ca485c44e5600793a41a180697f20aca35501e7215a49f591d376a2dfe4a3e0bbcbf4652710d0ba75898ccee4c5b63514752ca8778f09d737337c9219f4b51a1277964c9e67b92888300cda37c382700a40fc185ab8fec55aa539cf115913c9c73af0819188965e57b326f6615682915363c54a267c27d625cfab0712138703cf709bc5c6b0cbb1d5d3884011c1b8ad8cbd1ba12bfdb8a80e9cfd1526d940233254b5dbc2bb17495b6466c0ebe684fbf331cbd99981a4362fd318b28015d9f3c3f1da328917cb140a0567b4782ec8bb1fe31b298b6533c39733304b5f7c74206cc688c144a23cc72aa491e48701cd7f14fb3b7767a679ba4f4c4e1b778019471bd78bf6b55c2eaf43351f85190b07a66c35ddfa67dadd28c30c5264e3c3ee88b62d2c12541d1595a519897a99bbee0207867af34b245b00185a60b4a9cb92eaee58b16f2977ceb180b32243839487ed6b88f6b94d2d4686ec7b7ea022e6d995c398896cd9876815a27ec77188640a4a4e64b65436440fac565caa10eba9d48824541a6165d0bb97a634e6715abeab2bd8f91c18a3a6e899738188744cb6b817d21cf092b64e68cb6c9747d3cc34d0d294b4770548d61cf53bac839b70f0350994ada273312545462bca9118848a343f2aacddb2207f84a66b08958576069c7b7b69c02cf4f954ce3252faaa0b7bffa5952c51fbccc7fce3b6a0c8074f72519930395d967603d327fb8231c1811712308b914a75539128a658a2eec38cb7081926e94a2903471b79b33adf94456fa6a09438dba6103062c1f5a5c66a8d15b829c8f01e7c1e21b10bed1aac6d142ea94334660bbf448511563b5564acd67f87a26f779527000584b61a65293cbd85ab5f3362bb96a61c922ffa77b8d90acba77869293a03d7cab81b688306546ac348b22e368b8d717bc969ed83a12000548310a929e9738b2448d1cd7d1cab551ae0e7b1c495565ee65f180aca4a38847375abe6cbfa4b55c7baf2651415d3f28d221b291b175340a07843b299a46e02e22657634c95fa08ed106ce84660e8a4c90bd2b22634e40769aa0090a101c5dddad45edc5 +ciphertext: 4c52cf2dce0479dd88f84c76afec867839243ca88c7e240185f1ab343f83a681f936359ffa2d7aa1231b30fa056f9d91e9e50ae7227207c481088cdd7f458d8211f192abddb839c74e6c0ebe22f62eec0a0b85e1e63b631f2e2356c7e549b8c9ef20c970b87169643bff25ebf27344af28808cd2a57c3ba4cc82a6d1f451e8030701de5aa0d0f11dfd9c69396ae6473953826f64ad592a959daf9513081c8059e93f40a24d007237b9f7dc7b423c2d3ec49cddc93b9d10be852d9d8e73df902961c6db0bb884e716b1688fab808f9af1f5d0071d3989340abc9f1c14b7ef8d3728e639ffa7731a5bfcb42d59cae23baa3ff1d95fb65817228393b4b9fde583fb73f464bd39ad825ac28685ed830e5bb2da33784b0bb3e6f310c9ca104da7a1282ea1a08eaf4bff5d6396fb589207a7093b29b310bde1e7e83365208539f4d631f59cc9dfbee095623a0793df4c7036cda1991504d4cea2a7d298adcc4e39f5e6a3519d162da9235d5ddf2962c422725836f59eab03421ca7e7aa4b715fbcf72ddad147cb517f01fdc0998d91562a2771b13809de62031a5972fffe4694774d60979ab51332e8bf3866b15d0268867e497f71d661346cc299d220abe1292eafc72e47e113180afa470a683d6d86cac6880f1f59a84ee590c58c8826a67066d8ac772f86c5094980767cdf8c1296b189c391d64c5682b1dc368f4c2e0d88a6adb43d3340c8d8e9ea1a34d4f4792544166406fd27a0f60038c242173c924f13699fa73be3c0fcb97215503e1a28ae548619684f66a15af654c0d38c9cb34c1c77f1f79581aef0718c6fcb92e04e4d28de7f83cb90ca1a80aa2cf84467b1b7752281b714aff8647539416083dd08b6d13396041f5176a27d7d91e2860fa87fa3b7c4293016c2640a98b3f08891fddddfcd130697c849d3fba3a1e31d11ca6fb5b68b12fd3a5b561d5416ac7a2289e3fe464e7cf0f30ea7f227505ff6ec6f1713a72dd195280c7305ec3469f9c55f4877a9f49c35505779fa1247b5f02da439ec8fc6ac3aff099dbe38e4d9681f65e39c43c29518be931add5086efdb009c74655f3e8525049a6ebe6ed70f85848a4962246a62a45580d3c315c5cf91794d48139874e63ba4116c27be153e0dca53abd22eb653e47c0358aafc19d466e5337d1ab2fe6ae1fd9ff85d6af44f5f8e09ed987c10cef5184cdfed10f16a30c8b34d0c9bd8d69df3d45b30432f578bc40850f12d88d21970dfd20adc0761bb8a37b2a0b9df20e14421311d0489fbbec1f8cc88b08872ab3e129c609aabd2e7d56f6467a176825612dcc9ff1926a28f5eb71174440206f74c219dc27604754f1db7363bce80cb6fef31ecc2f4e5668eaf745317397987dc34705ccd5086a8e64b83e9d4b3c1eaa85074c3c40a6b6fd48a25709846564d4863bf5f416669f1be2e92565e7c76451fd9f31eb81ecf9d57faf8b8b63027c7e7da8b0d140a07beb6e5fcd49a91a0908c33cc3016b165eb9388130426880df40b0a579d5cc63f6bf4b775e9368aea +result: fail +shared_secret: + +# Private key not reduced +private_key: 629d75d10644e5f5c9cea8446de5ab5c9ba99ffba41a77cc6698b06e59aff51a688acbf84a7cf6fbac9ddd3ebff11956652ce49946797cdf65338376144b67693c60db18450ebf5d9354a1d0d99e2e7a5ba1a871e7f6ddf88ee5d8ed8aa6b96134edaf915db784834feb9bbcd0374c0116cd0339cbd3a3649b7e3ed4eec185c73a693482db86acbb2688f2d6f2f8abc7e414ea767698142de2f51b971a2d8b76dbd19533798563a55fb7d09796d49c79c8e627f46aa98c4fed407e1bf62ce771ebcd6ae8c435473dcaa43bfc8495481bd640d7a65832bd99d024fda303f49f3ac555ac6440f5b14623e47294b736d7b84c035ec8b8a4799dec356d509989ac71ba51646e8bf36fe2555bab461994d58c95c3c492df3992e47687962358ad96f9b9bdc9f2aeaad28db2c84a7788953145a885d398f53e77b274e9c7e9b5882e386dccacdb34747265444b8d0bd7c6944d84a9c16ba9f9a19451e5fd99540bf958ebfe74bdc941cff39cccc167b6dc193ef967d7c262c6b06d9566c65c9ea1a86d665a802f5c96d75b67b94cd7d09e4ec50691bf67627675f423bfe840ebf91175a58db6f46d69e5e42ece3089ada24791a753edd05ee7d4ce67123bbe4e9c4670d3696cfae43f8cef12036c63c4699d4c5a32734e867fe311c4b826666dfc4578ba4c953d3ad37faebfa58780ec1678be56997b9375d74966cfabd1a6669ad2dbaa23af6b24b6ee2fa8fb21e9a734c88a32035edc1f832f8b59258ada84b75cc5fbff7d194d3e1581d9f5e3599cdcdfcd450a25580814da69db3a151c3709d8dd55b985e563483a8dd250389d5ac8ef04757a15359a0e09f73f2ac8e25faea3e6de310868c4b7eb0186ea6c14e346d840d29f446804e6540eeb14846d694b3918856d0c485562a9507103ec83ec87f3b5debd99e46b05f9592b32bfac5dbce78d14467fd873549d998a906f338396e64068e627567cbb13e0b1abdd5558d3ff5fd2e6e4eaaf0c58ea0efc1d3ede1afc9ffa9c6e1848e030d9442b4e793becf74105abe23471dc34f3547ca8c92983c15d3d1a96b4cb44852b18c5c4f8ad541edc0f3b4f0cf6ece4075570dd9815ff563d74e34e18fbe7fa574059ca964b3ddc0d53b8a6f7a419439aedeeb24b5e4777c82f7394d95abb10d3f00338e4288799d0dd89dbb8ac6a5ef52bfd8d0248cec9c6fb124abbc5ad9db306e98e28a07329c26ac38dc01d8cd7daf8dad55514e48196aadf797a341dbd5f617372046a68a32eb3cfdac744b6ab6b2f9fdb184dec4ba266a5f836077129d7c1dced859b573f610995feea652fa35c4026b26f194d9343d91decdfb39648c2bec6dd79f75bda5f4e7f5de11d68abb96c419cf83ff65a4d5f56df3bf698e8f0636e6de5f93fc6e5d05bd449b134361467ccce99bc2dba54a65a623495efd283b9b77ab43dd4dab1d3ae8c749b917e596785bf53e34d77aed385eea2ce38586b6f8b7b5b4c50e3f5a3d340dfccb929996c601969456ef1d39839cc1ac168236f032a656b1ed16ecee09d9692c81bcc1a2f85bc4baf0fdd3d9d6884a07f3dfc73ddda1f58a2636bf4aa3c5fc4f9b9bde075fe983eef7ce925e3dd44415675597c54dcbeb434f97f3891f33ddda5b9ed269034b722cfccceae14aacaa81038e45b53518216ca5c332bbe3117beb9ca69287a19dc7a078b412baae7cc5181a389b121bc4ac5d0ca67a97248d8f97d7526063cd88219c396ea11435e5c1d61dccc963444b35c99c86b87e40928b88c47f64b919a028ee601229e5a01bbe17b600acb7449a291b131543709a2b8a7d015419726563e366324588038e71fc3714ccd0a68fde524932496be0ba7adfb6e15dbb99f995419c8af3db630e22393bebb25819159abc78c435342628cab40a6350a8a86d1b1a93f6c9151f1895c4674cbf76313b1992d82c6db218339292622807557f458ce057ec1969578379b75d1bf518976b9c69dc22008371930f06b4d1d2465139bc0a62c1d13db9282c00549c45cb351518df67ca3ac881501c3272b9c6ea1a7c527b0ce8ab9124257484b341b2200b49029e2624eb37b15e7d5823a3ca608f09a5fc590dd14cd2cb15cd238735d25bab119b06026884ae5176bdccbab3550fed9b8d4a473a3d0a47a5c78b7b16b880911c7015a7ec281e3ea03274c6199b345db21c0b0c541962a965fba799840c01409463d138977d9bf8ee8bb3ee3b80e021ece71ca0c6ca72f614706e0941b60c3c8c263ad8187a5d70e98740a0a729a0d07123c5b95d553cb1fd086d853869b68b44db974f5161072d6b1f2a18c5f112376c434b9e777a597b6304aa0d1dc3d2f00010e481b9a9aa60e0acb9394cd554a047a6262e4b32191e875e1688456a1877012933ffa51adf131cbd47c28535595e7bc0777b954e094d6d62a5f67bd8b674abd34500da1a4c94bcac04746c4234314e16c1320c48d714481a43c486c96d183b3ea54b19ac54e971710a293121181a16f5bcd861835c78357ea4a6e8b9b785c085545c85a36b3963288851a15abac8a39a109d0d092ac3ec60a93077486d7920a6c274e91b4f04a7e90d724d1e47f65a9cc80f806b20c98d9867a705472738982f3c608f61095548552cc01cbdf10c34f10709a31aa47a27807c74b9533523912637b1a89d8383945dc9553e9911f4b012d6c397f74c250a70d43db4aa7da34df3c9490109fe7b1561cc25f0f37907fa567dde3ae9da24d425a7fdf35b2e61241400783bc2ba3b6098d6180b25194912175548453a669650e9007be369a2181e1a46763170fc995770627b6e48903f574f06037d580ccc1649ef6eb1d8be40392b86377532fe5b55bcd7177cd817701b4700b71a498359bcaca6393710105108c6c33894a41bd1e4a659b22c76c58c0d2f9648b8908397b2d30e9a4ea60c820aa12a58c3aac757ba835483f02ae08f7c9ad8b593d756a33835759f7024867b5d98477eb6cabc4b7397ff52c6719cf73d42f00a4b362073325d48651c2088fea27d540884851cf95f1a85626642f825265411f8b25067d98b5f595482d767b1c291a9e35100e49af47a71caf2214b592831d1024f56818997bcf035b1ce53c5213aa664e2226e83c50594354aa7974d39b09860b3560a534db624b9a595baf31bfc40978cb2903bb549eda3445241620006371b0f7a410e16c828c6743846ab3644413c8c995a4527f82460e112dae7a0d0a963b87e38a66e07290789200d6018cc7c454ba7bd5e56d7ce2d10ffa73f2a284bd579dd64e4229a9f36e58fcd24287c47316b08f9675fc6d1e3cc4e0eb62d31b6b4f10022d373d2718f3d20ee1cc00ef6892d9a0e15274a8e2bc08fe818b117ba28c5dfae74d54fcdf6f20052f79be333edc8dde +ciphertext: c108c9fe8da93854f9c97333667b60ac6d357747fdc46551636f9715885306d4e0ba5a53950042e82e2449d8f871c0e69fc5fb2dd0890c09e4bcd73800728fe9f3aaa7c15a7bff2197f3d9798f8c7a9308ee9b558c6698bb852d5bcad36ef859e9f20eebf91e4eba3ba96f35a3e15bcf45466b0a0c951c49b0191ec48cbf0dfb06c07cbec041a09f93e98ac30e40757531cc7eb29725b472e4ae51d4dfedc5b782a2bf0ae88db1f6a7367bf0fe7aeab49775ae121d1f568d3a69fda9f3192e6cfe5de967d884247040a6520902d2e1b0ae32f388f4d9235510b3df3b3f3b8fe69b4917bc1990a45fd6d8d8e5bf2cec3fdb9e23dfdd4248c026b73b2907378452223a10d8bbfce7d557a40da8b4b444f189e2895dbe530493b582f004ca49e1a5b103ddf607cd25a0e20d24cd72596349c7dbb9547cfb14f0ea75af088563ac29f2cf3c358cc5c2044fb22659950fd36c4a5d1cfe534e68949781c256a2d912a739c94378339823b039273c06719f9542d293bea4e2e2a69c5de60d55882c969439da1a1ef4403b4af0068e1971c9669a88003d6b7ed3f74228f0434156f05d7cb3b82470381d0c9cb5dc05c978c214cd9e8f7654ec16e4898aa61f3a56346d697ac3d04ad0c7bcbbc97e6e86b687370bc81fc843e329d2dbe7a3f370042893521117a270d635b816c2e4d651eabd4d8b7b3b64f27c0f04e650ac334904064730b24c4796f76008847d686c46a667c2d08a52641358ce681810cb801fb76572ae3034547185bfd449f7dcf9ed2214570a30726697df678cca570a4b137e442388494011c990e3b0efff39d4983abb2d510f0907913c62df29eecc5fff802e80f7d2314e6adf01f74b265a257d829e0b114adcf5c968540949af35dcf9e8b39d8f0a70480e0c90b5dba2a6dda831f856e7178929bc54e632e323d87815639b17cc608a269a37f8a0101fde51a04dc0fedb4da16470f9ddb9139454b5cecdacd9f5d1a2c693f72282113c5f20d397d0538dd4938c17badd0cf0655fc373bcdf75a140746b38ae9e006a7dd80209ad50cd7b84921e85385f8b863492c35bb7048e3c260a45daba6fc44a901880e8ee91533bb0931a48c029d773a463fc07f6d30d022d753b149a4dc0ea32089d100b57c8abd1e6f98de0e8d447128637f21c0912f6cb12a47c7224442d835219de4f466d0cd65ee82fa1e10b84b0b372a307b72d3de3f46df0a209486b83679902ec621d2ad4a81a0b2297f70c88c882e0666ffcff459b87966dd55a1dc148648e619ddef49947690745c7794445a2b8b0199d61469eec9c3fd23232cf0b792d52d2a0c0c54ea11c29392b13a7c69744d85aa2245592adc717dd1016a64e9df28864f267ab770e32aa66b3ef4d8c00903c2bd10d1287e3f4696c09b6e3be2f513d736cb2950935a2ac517eb5cf229aa6914b1cc360658d9e7bfe1bc2aa49ff36a26d05fcea924b8fefc64541aa3da90ca5e2828ebe8f9b4ed2f94b2885af83aaa73641f9201325d88f9e2a2076b87f532693fb40a2 +result: fail +shared_secret: + +# Private key not reduced +private_key: a46a88e04d35c65e37532f95e986cb5e76d5f7da81fc1bef2a9d3b3d283022db4f8046378fdae24f5580a1dc4535e64dfea6c4fed63aa73960b5ee4808383cbc1fcf702d4d07f852a815a793eaac2f147d24c53e413af1a765def4f8e22f46cdc9c560c07f5545d8fb753d41c3933e001f5d15746f3fcc5935ce32af8ae8b2a37fdce899eacecc0427e24f1cf7946dc312ad8cfc4de655483d809f853274c9f81683e5daf62845f7648adef7dd9225d4af7f2ceca7563e824454b5afcdfb5c582c498b4a2ae645553bf7dc30d6a56e0b7ca5761daa3168e8e527a64cceb78428d1edbbf446863d48a53dc94fd3a0f68be3fc498b288e8457cf708e32b367a9529bbb824e51950c3619fb49d5888aa84f4c30e4e5d08492a7ca50e76b56fb18bcc1ca99c45ca06644dff1e5beca8c51d6355504496e9e4a407ae57ee5b3df92daee0e3f98bc35fed81ee4e426a76c6cd8ab6730465dcd7eb6366205b639c3dda30978bdefc745283087c9ba87e3f73e0edf3e2573479bc2068f4aba06ae5fe6e71355a73c87e939e767412333685c6cf9cb622554af0177f967bba8e043ad491568aee39e35888a4b996f6289f23f9fdf20f5c95a6a66aa7fcea5bba8740bd28dfd5ae1dc602095e0c85c6e331e583c5cf1966bf7817982e1165b6a69d17b4bbf3ebeba31d95f14bc76c104c1097aa3372992036d35e89895ade3e66958eb6c558842b3bd1ab5bc9bcfbb6754b0a9bd7419a35097bf365c6db31767e6751efeec7e57b233c4a1e3d9bc1c4c80cd47d5c3382dbb4cf65c9d9a24bda79dc37d47ab286ddba5748a0294c8c9fb8acc8b3d948f70a73c55de76f544c7c576c73a2bd9cc983a60dedde52bf5d8d44ea29595a40c7b617d6bb45d2471295d5a930a4bf9194ef5ef7fa9d9cbcc55c8c9b4cf675876cfbfbb711798c95dc3e85bb9e84bcc726e95264737c03b4b2748e88c19f2d50ba49d0eb4fbb85e48ac9e02739fbf556c5e6fe0294de4ff38d263d7c5354ad454d93195bc4b8ee4e552ceda7a1980839fc73fd63e6194dd10f5c5b2853ee65f65f78cb112b3a3521577c91bf744d855b758431f7e8170efd0b47791328481c4abf4fa9ec9824742db7d43ca2b47b7449126533adc1e91d4daee3779515fbd5e9c57c383a3bcdda9efae56dac8c6983e16484d7aa00bbefafb778004366765b3ab6365737e7a4227e7b5b87f9bd9086ff4b64cc7bbd6ad353c6cbf4e05557fe2e6d436f9596639abab693449247e8828f7f0133b9c1569bbafbf87486cb10adebccaa179b397b029d6847a970daf8f29f9a8ec1adfd0a6c02d5fa75bf7c3c1ce80502590f3766e56556503bea9438386618f681d564b333b852b28dc91e6873b143f8475a3b9d67c152ea872aebdd4cd73cece6f4b7e7084b95528d43ddf2870ba2a968a4edd761a6fd41792620feade55d0ad5be86d97cd1074b71ff893b3d4c889ccbc03264541af6b8ea3551dd86d78cf9756c6972ab87acadd799afdbdac8a8796c8b83ea3e1b1b5f9c20a715e48ff21e64fa0dd62489fb818d93eb2e3be8cf8bf16793aee06a018eb86ae19f92d5599ea78a2553a52793c71490ef862ba5df79b5242249685be716c8e8498a5b82ecb47bc7c78372b75de587297848724335f44545a35fa11e6e1208ed4764fb8bd4af9712e21c8b3c99e5a04432ec7c0b3200384534aae227c6400883ac21ec5152380b458bb69c5ce909842d3b07ef2c539c44a2df2013aa97a08b511e444996144cff78ca394b5440f4aba566383b0375edb2544a42c4df25b6a96e0263c8962bf9b716bdcaab098b41f735018735d8a26ad7d93b0f17452bb64180a572f75091af0ba9b3499a134e90a167ba72dda62cfdc27e3234b1412115ad0463da2600dec2e7010b1fc914f3772c858c80608244cc014a31036a9abb68946b51354d07fb914bf22e17ea21854ab778b67b40cef331cf8374594385c28586dcfd5421d1a008634b006965f88d58a5cb449f52136d7f82cfd0aca3b6355117b15cb51240c6a239ba26380c55abe19912be90466cb701d4bbcc5e138c525bf28d23cb2e0452927873c17c7e431051f99a6f585b89facbf71f594b49ba84c7235978aaa2baa1f9e7496509009acf56c5d09a4c53b1cf2845a0d0555528c8c1d287ce7e0aa56e85adadb89440305eb942b1fda247457751fc1b5b8811fdaa95592a047e297b9418c52f0189ae8a21254f838deb89360292956749007ca73581aa79f37116533068d2425d5ecba7447b7cc5729d987564ee3cb2ccabb6c31ba24375304a70638533c67bc6e53c51b17559133d4aca5a6bf44c635615a9881e25e4d137393b76b5017254970b56ed13f7aea587458a43b3435bb018ff6082661da9fec065c0ec23bff1b919633806a835139da4c4d34c6f4567daf07536eec3d4d0347f3abbd7f32317c33c2660393af455c2dc506ca111f48da051d8350edf5590adaae9731c2e301a824721718968ce3e66be430b8db293a22859d68b353dd45467c85ab7f4baa0d5b2cdb83c94a895a58e09e9f249153f25fc6d3c7ef50b1929b197128a64de27c48041e08c26d64b8c229cb24f9e9667aea2a33531d19dcb6ada725eee88f063cbc749c2e90f989c8f0c7cf6bcda814bb2b321f1862b32cb8294e99c78ba21d86a402a1c8c3e7f9a11f09306e588fd1856b7f5c5eaa768dd72793a3a88d35e931de0bbe0bbb697010b2c75c3308649c1260648bd3a6d6e57c56e00d5de7270d2c26572aac88e08238658332879d5ffa005f7c8db415403ae73ae728a5f3bb228a326b05bb26a0c91544d98db8cc687c597ae2e6b142b101e9731ac8c20c7eca11887b7fc8886c304a162b30cbc510ce54ea5324dc9b82f39b0d971dfa69b81ad99d49bca9e3449774985f5051a7eeaabdbd33857741c11adb51744539b1095c1b32cc99f81a0ccc6dc88ba829b11025ca5dd3353639fb8148088763ec9e7c14370766b918e93d8839a8b0a34d3090933df3a86e3976d09776a0ec3229741b2155b6c7ac5431421c7b80812523155c9cc5d890268661501628231c1c660583829e7b3984bcc8ad20632c16993673818f7ba15a5064aa42cdb9f7b0e0708328213388b06a04d559fcd83a10913c15167363f997f62b6a03614c46b9acd703be1a1b641e7910ea273022168352c89cd7616d7746983b3b51d57770196a68a50125f1634faba0c752826ce0aa6448c86fa76c6a3e2390840b0c7f333650c53e0a998b66b533746765316f08a94e18de52516228102ff16993ac61abd8d7884c9d162fce2f019205a2106acc8e3e3465b6fa3912a06c764e625cbe3b95dea6c881c38c2cb5cfafac81b96a810ab749b61806b6d54c9f8cf4bf1be0192423288f +ciphertext: c408d3795c6f0f7a0988a41adc92be1b7b2c00660a14247df3bac9b4e8ca4090466f23a9189e7f0b5bf4a012409c5c12af873a3a847d7bd5acb26ee7269c348e6aa5ef8b573a9ca82b374a00beaadb827761008fc179f7562b775e3f4bc0d77177160ada66ecba30883ef41607a8268898ba1035ec901c7e1d33e55f68db91dfb45b7854ad2fb55cd05e0c72c425893b683fff38bc36278682beebe5953aac7551a6a70d0a0294e393c1616b7f2f63977f7bc4000664faa398b37d343683a8427938e89485daf409e5ef668705dfe003771075a9cee8ef0c28bbbc2d76c342c3dba1631acc1bff3bc9491ec686a68fd17ad432cf1f968ff3d83292a6ffdff0ce18750ba7014d0a8696f2e486367ce8fcd3cbb56eabdf699a966a156706f26c13c63a4941aecedb8c51045157a983e2dfd02085a3577cde0625da2350adad889a8d295d3a06d39cd42f42ee9f1b526595c13aa40f7e7407b0331a61e7f8c6fe070ddb7ceeac934a78d7df2715f5d6830fa5a68b84e089aef3a706cf8e47bf78d928759081fca7f59ede7b3b4a1d2f0e7dd4fe5c1e613c51f1dd25a282038d5d14d5a59efddfe980a9841bf7c8a2a7457c25805d93acad001cfb3a9cb0e6741045960f2d318e4a2da3c0f3440f4c43cf5af31d5fc80fb6f9a4b2b510a35d43ccb99ca15e20fdd7ec741b26111bfdcdd6a4dd12b2f2a63091d10ebd5d56e858111dab4f3c233f8425e749afebf296015fb2640fa42d559d90e697cc0bef441e0086ac411fd18c03008b25cdd4650b59f082f1ea6e38e3edfdd1cc848c0e80afdb8bf28e7ad7c9599b085456f01998a048b474499690e4258882ba276898a2ea93e1e68e7b8f4540eae2790e71e114e11c33ee917288b5eb8cc5b1f73b488916cbe2c504c24226b973dcc4676c8ffa422247067c8ad5e47ef8c3e8637619c94f6661d6111652fce115a2c9aaae625226522a81978905b98c659ba830e3efa0786be0166b6cf6d84707e29febd0c57447df8117d3b549d55127b22fea805740ce98268388057573a91600e7ff40061f3b0ec285d0ed684a8cf703014ba54238b28b07b539d63d8320a92eebf9f97b42b0330ae498456f507ceb200a953fb8f5cdc36bb3cd8cdf52ebb955269300642442e3a7aab1fffd31f85148de8f3b01ec857c7e10cfc336e8f5abe8f0e2e3442195c1406614910216225a53d8dc28d7199bc95265503a75341e6ad2ea37488a71c6c893f65b9265cac3d6f47ec3e49785a5f3f9a52e02af1fd7fb14e635bd9c3246adffdb7910420c9d91aa882dc700f47e575ce71c9d155262c123b529a2e1b87afcc8b5444f180e0ab6e0e272667a224f3d59f9809cd7a894e30012fe4b697836c478f8222fdccd3755828ef032906f0f0c03a463fb9101640c7ad2fc8eb4fa1112c7065b038732516626869e8124685bfe4e6fbe0bcaf6451f932d700c86498738fc43a1f5d71952caba8639cca30dadaec99c69e36e13a4935fcf13531f9f3095f06d877e9798c65fdc2b2f24ad08b1149d +result: fail +shared_secret: + +# Private key not reduced +private_key: 36059bf728aab04b86ad6db0f6cf33a79ad36beaa04a2873b71a3e2937fe922b4537f97aef17d0afa68b6da877b26beed143ba6ca538bf04662dcb500466a70eba596776c6d376f0740fdd768f614ebae517b5578388d69f37d4a4c5836a65d06e054d623b6d04d48abd14570b56e3f5ce55f9d86c8c695abaaf744f4d794375c07cb6fe1b3f69104bb9cf6dc8e2c6c3f9153ae3555a3a35a1717739cdbe95e315400f47d4c7c839614c4cc799a4ab35daf448b70b97ea3a1b8aebfa627806f32d4eaafe5ebfd136d32bb9de8e1d3e65fed36fb7fdd9e752b739d3d3b45443fa53031d3d042be2b2afce0bf740708e812807764ed435074a6a55dbce1065913deaa3e7164fcc74e9a1ddcdbfd3e4ab66b2be4da1e3edaf801b5e9b3fd23d1c797f49a34576ee9c0352d9e880ede7eb2e4a674265b3dbe482273887803d5f6e59bd5e4a4ba8aaaee0bf8a87733411da7981f458f0aadd8bd55446aaa44f48fb4bac9b08fa53b6a3f337b438754d64c7dc9b5e95c61be3c45469ddf2a88565dcaea473bc315ea08bd6c238e36ea5df80658e4c5e3edc2cd8a8335f30ec43d063585b857fad1415725c5e950c27efa4d3f5c9a8795ad3585f5e5285678aa43470af87d5d90dbbfc14a9173be1275471f0948dfed89783dfa214095f128e50270fd3e18cbccfc75b46763cf37aa5558a34bff5e176c9d4026be6a09ad7635455a01b69820541337ad397abc928e735fb9693222e6d1744ecabc8fd07a6a036d7cbebbaa1b787e497c3f9d67a9c247b6c31798d47347e41b4f5d7a5b3b1f38d914364a5176ffec86a8f743528179a5c544faba84c48387dd3264423ccd83db5d6b356a51e0bee18da3a5fff361ec43d2d8d395e1f6097a7a5cc6a4354699017a7cdb02a4823f8327e7f9a8ace971f6a8646c9fd1d48d31e5c4a29733ab40d63bd86abe6cbe9b85687575b85406861a6a3c9308550207fd88e245f25c450867c34980d732578bec225f746d7f4a4da7b5b1ada6df57a6744eaceaeed13ef774a78a6f003885dff6bfeedc8c2cf4a63f33e5444ac342451e505e9212e7fb21ce4a64738f43a5aadf6de3367c3d1695e409bcfd3e57885d87b4d19c3744ca797b74e1a07f63613aaa5e9644279ccf963a8ab38ab08aec8ec6558c3b6a285b38ea34acd4acea74f46e0745c8cc3da36202c6363079f3e35f157c888296da1852663a7b4416d33beaaad815706ef5ae8bf3aabb7099bf110dba39e4a681ebcde7663f0d0fa6a6bec730a1848d5137a306fa7b244e80cb4b82578f02b59713fa38d10d6c6acaebe383f5db36896b81bde6b356cb735c004d98caab7893e383da8a467c4b7ec0ea3e6bd74df226a68ee3ce38c8e59a6147c9939ca463d4b5df944b377ba4826964b2b86d50b9ede5f94c3da3b2debd2ce786eb02b79e895dae923cf8ba9f11ba97806795c2bfa713079ba7728ba7b94b9867f8b83bcbd65ff6a8d5594fbece87653d7a9f66a1e3bdd0d39dcd23878aefd3e2ebb9f0c48c9132835121c61709a740d937c811da866f494b07f3d57c9eb98034c6af9388d1b7dbf264f775462a5f581c0daf3c2d45f99cf67951b40d379e3b246e20a2dd0f49577eb8caf83744b7a6917006162efa4cfbd499b8c853e102c9639457f66812d58383e629a7522f1c683d48d8a216a0aa82454f29732077f4baa593de951857227b976a35a8013a622afe355144b63bbbe58265287cf6d605421e73e7df7301b59a885821ec0314ee76359d9d715eec1c2ae726fc0592ee01c1d45d6c94c76cff66bb3bc321358e33f16e1ad44b35e256bac5ab519e404c3cba647637537a524849cf952deda7940dc1c3a213d8c13580ebc10e2b458873ba5cb30c00d855530b0b5f86003a2c6641a72170b238feddb624f9660e16a9c545a0fe8102612979552f311a9417fcc8c8768280a4902a8ae696131c76338097f0c3a2f8731ca25d55a21b619d1c48550371cb2cac00e27c8ab9c8d7bb944e4bab625eb1bf7c55f0df84ce67c48fbb4438eabc818cc2871c619222a0c504c6898c31b9e859998911f4a29000e4063cc0a5d13975182c97047520a3fd7430117b5d0b2b088741690b5662a3b02978c5a2f1c330871957c5c73bb5a2fdeb0b5f3e5953b509b2887435b41badd607307941aad1cade20c4a22b80683b80dfff1bf82a4ae80eb0915190197c1ae23145522c86f86955d0d3b7b4b83b019123674aaac2b4138e4b36169b1784a4bbac8570aba1acb13ac0ab84a6bf987a23ec91f7c6c2dcd6b952c505515b4b4b1e7c749e693ef4a7dcdf8b7e2f89168991c0385829e46c7faea3c7fb18ebbdb333a4a16676aa81daa4ab519638807bc977729d4474f4c068897e77abe636df8525c35e7c691b49c72e50bbd8570d6b888041380a6a4b9a65868f247141ee137ba422807a57a9389cc195345968086359b36e5316c594a88959b7b006abb88d754bed942230b36945a141d4810050834caa24cf58747820a6aacdab186bba056bbc043da570f874eedd29718795ee19c9e8fd4378fa8a42ba6812dc51874cb0285420419d408e897a7f8fb9ad0238ec632674440b66e838fafd731b50092324a9b11a545bb9a9d7a242d54c6bf897a080ac0b06b57535e542d254ac581450d82d73ef779865708a2563c86e4cb3133cc5fc2e16dd2b043449a73e59a5c6a29a227a469ce406192ba4825e3503f3552f743bc3dcb945048a95c70209bf5c5efc76227ec7d947a19dfa0af12b078bc588c1cf9c1300961c59ca8529c357b9087b572a8bd2739a7a526f3d874e6e2a23c4242bdc652569c7ed3546e3e85b7865611c2cb7ad551142b2503e14c0fb8220755036f6bf95de3f1440598076db3410a4ac1e52c91f038956731622df255646ca02fe7cf1aac75d972a5d744512b4b498c666ca68660b984bbe6a1833e83caafb80e17ea49c484ae2b6475d2e276e0c9317c47090dc9bc134b606a6a1336a40881d76ebfa954dc550cac192082e1aa81f9a6d9162b038a021e09b28bd0b959884acc836a4a95100fc93071dc474e593a1d7ca409001b6c40c3fb13a5b6640a32da0b6db086f1691614d935c29b67d8d54732948dfa27296a63607c17973b764b9c05713bf0026bc0534b9187fe33690826a6c80014b2f97312d53b3b22aa1740b0a47ca8807145eae577c994b1dfeb19109b5b99019329fb6adae267c2759fdae64cf479462c4185ca67255971aace8351a94501d772b15890042363b3bb64b6373e44c5bf6ae2caed5dfc3e0f0dca2015579e6c6366833e834e34f198ab5a3504cfa0c6af6ab78de3a3ef5667e6065e084cf5d2a5bb32c06c5bef7b6508409daf847a64c8d30d0974fd3ba7476dc76c46b458a036d884 +ciphertext: 71f6bf72cb74390f988cc6a864a48242cee917f394d5b4da241299a2fab54da05f57393596e88605dfd86167372a80e04af7623b1ef0b07b0c0c9ae8d58389b27acc0bad8e741f2d8862229dd0f90dc927564203ac4627fde6a32d5c6ca4987caab90b659e6bdeba2b4b8de3a53b7599dcc8d8910c8cb5607a9cedaf72f5bee023ee24406e1f56c4a8aefa3be2d3abf378bed42d772a85d3ccad0b698ac6abdb856449acc3838737a5a09ae662c5a4d58c4ef6cfb1fc6fbc5b189751cb003eb8d41873f04ccddf3ff5b01c77e6700d859053d1f920d44a83f42b7982cfdea3d9a6a8c481f92360c8ff14636e55cd76896eca6a38f2944f6a24dcbf55a0aff14185ebf4d8ec0c24decb27450f6253920e112565c43ec742e942cf9d6087e311cfdad256ec27f22e6a246dc6be2c245670971d8cfa3537d6cae449fb07715f26562cd52c5d50ba4a2cda9c5f967a5e9dd72a115b9f096eeac949bf8eb3a331701652924266e8a6d6dbd93a8705a4d466a814da93c682e971c7ce8ae48f149ef51385d3f9521263a3f39fc33dfb3185d34f4019dd23456972296a82b6366b77820affbe68133f6b68dcde6a35f5787fb5636bd4babdf0dc8a590b93f90f91b52324fcbb9a529911cb31f892d2c81d3c735840032ec4e8c2893aea590fce1c9c6cf3ff5206863bc76a3153c1b49f6fcfffa467cb8eef2a98c115fe2a19c01ed361bba1417fc253ee07e7cdf7a6bd09eee099968e474dbc314685464202b3e8d4ebf6570ab30191ef3bc737544f927d6e1a1e4fea26f22845312c2f5bfdc8131572977c16655f30c4d257227ddd7c1006375827368bad4872ed2fd95249c6673ae8c6efdade12507d5d8fe278b65b8c9d0369f01ecc6cc6d8954b0ea19c1721ba535ed605c3777f1ca62467d163d832c4155f81748ceb1c501c42125d918ddab71d4bf5e94b3215f6fea85ae232528c6e5caa8ef8ad250930031bd62135f66e33861ff62571b16e51e1307ffec33062ee4c649c659bd0676e87857f015f9dca2989f4a30fa1ce540392ce96467063080d1667298406a0b1cdef7db896bb2a6ac9c07c435d25d019a3ab17021ab4cf2ba7eb03ebf33e00231abd2655bb69070d6bb6535dbefd40bc299fcc9b45c35780a6b929ac6016e61856f13d6f8afbebbf9fe70afaae59eb6549ec30c1b0db0abc7a88e1b917b123a1faa6a8ad5cce873e20a0c2bda1fd417e49b2afdd512a2bba0db0faae498227727564053f9bc7e89a40d04551c89abb48fdb723643a5dc191070fff978db5526064405f28e74f9769e531064eefb370edd18cc54e2c51505fa2a670358b074c618447c53a990d3b4bf4ec893d6e35f19bdc70fcc2e4a881772cf0cbde217b80bdfe495454ebfa204ddbe82d1d92e612db1a9b994145feb30f7c3a6241a0dd001fc8ff0ef025464925b0ac26df6356a95558eb5927a8d8f360eaf2d140ad74069a0a53aa9c3e4b54b5cb51c939e299567091a8334f19a6104439c96498f06c057f3bdb4a83880ea8d77fe254 +result: fail +shared_secret: + +# Private key not reduced +private_key: 3035edb04b83a5b5969cd3354a375ca40d3289d59f5197a01e3be0326fbd64cdce71e9c5b0259ab5d7ba48fc72fd3c90a523fd3b0b36dc9c4120bedbd5b45168aa6c5634d5d478487545b0c4034f086e897db4cd2ece3ded0f53acc3d5207eb170a731cf2cde5f17cab24b64cc7682a2d4313cdf3cab0849b20bb094e4570a1dae5c58989a99880107ca4f6e7e671fd043874eb96ea0f72b50a924b8a4cbd21504cf29abd8b71dbc15bdba6226b16239dc3bf6559ebece5694bc9c75a8f4f3f90a0dae68e4a29a543dfcbc8e10f9d472675382ed376ab4d8c858491cfddfa89fd49776d97a787337b6e6e04cc0fd8a57612ca816073c47c97d93c6a134ebf3b94e98a1fe96dd8c6ec88bbb5d08634c378b678455b005795518cd66bce701adf07c84bfce5a89fe0cc1d16a3a60d8e0fdd780664f77940a6e86e75b563b794649a2a01fd1d7a79930cbea2c6e77002560b6ad6ca2d84dd8b456169f3bd58543e64ff1c244ae91745914ace3d25e39afecdca18f8ed5d3fb2327a8bb07ef86b4d71a579d6dde80a105f58d4ae48d3e8271a378931d61042ce86faaab73cc3465cc603cade38f1f5d90a4f7f0c6c13c8beaf83ebd7fc9c2eab6d1890e74b83af8a2df9db0bb7090fd6c255bc17be4f7276cfc131f8c1263f07808cf9edc6d3c1d6cd016821814b9ec498adaec702ad8bd24b894cc2eb94df3e75e2335b2fffb89ddefef553c431d8f532cf65f85bf7d0597d4c9b11465c6d8dccbb0b4b06259af20885458f58924c9eedb64778da7da20a64f5f3ce6a1736c1b8eb351ae4dc6f4ce1cc569bc9ce97c897f475fc59cc7c9a106a2a4d8b827ed57159e67f2b3d9895d4212b33322b4988e3987dd5e4968e4d27f16c0440cbc1b4b48c18c974f9bf0b6e5605d75dc2c9b7e594665bb4fab96a4cd287a76e2ed5f64c542e4753b2b8a7ac2eb52bd637ef9e5db4f077ceb2e5859babbb2fce05ff5b5c38cdf5ee4eb1f7ea22f59922dcaed9f0d4a93dc69215669f63da04e45a879fe4df4885be7dfab820890c35c63061cc2f268ff575c364bf490e9365f6666a5247c950d7aadbe9bc3ee7638fdb981e574c9cf5960cb1c9fd504b6cc347c6b3dbd6803cf9afdd3aa588caba4969b53f9010c3ff686fa9fff73e627dad64b4dcd9488c5ee52d3d78aa5e9e258e991e22f827347ff5a5ad1cc8e5ac2b69ef47d838f28c50e8f86786e556f04c5d6efeabeee5784dc486dbbdd5a3d69bc34d1be13a79468f1e3ae8de2c331b9a8304613a181ac5a5feef1e0739994fa9b061ce412bf61772ae321c6fa614972a60fa58c8efc595be6af8f955817781dc858d645b354bb37e9835de90f9b5ed9c43007e13857b25b888fa4bb7e36c3daa3a93d19be58a6365d598546ec0f5c7d7aa723bd49488ec9d3aef1e17eab4ab73f86fbed8aac4d5e66375d868ac6b6d60f36b2a80730b64e895f3fc8b68882d945ae33eee5e70a7e62fec9c6945b9ebcf26ea551782aebd59fd8a9e36d139e5b6add4c278897ec79c7891a4bd44530d78b63c92640a1ed75774ff8259981678e7689799e071bffcc7780acc596c42786fbebc5366e85b008589f7363d863cc934446de1f420e6c5291a66eb3df964860867e75349ba9999fe4be93262a08f868abb10652b51bd1c67c266156eda768e30b0c82f910eb96062177a882435c74353dda7279f2141d23a6440b900a8a476c66993477b999e23b40ede83b1e31781b4303e4bc5e0220cb0a6409c88aa8238b83d78792c5632751fb0d5246ca42fc89ce31a64069560bb87360bc2696e78062600f24db78ab630079a64c87900d4b7c9ef9201822b6bdbc69c6be718c3b2792ea32756e1a465325a763dba22861a423e65458272e77400375aab4dbf30d564a176613c264631d33f37cea0346e71649d1314862bb0d2b05711cf1af088a4c619048a7242d0be6a8b536c41a9368b22288ecd0ac7298335e5c91db419c2126a8df45b2e6d8793da63fc7e94d75d3bca2aa58f5b5bee0b43a462a12c34b93f68952b6e7abd89c97c293b0693192a44c0d4e69245e14983e87aa26da8c63517f58d66ae1610936e6a89dca87b6c70c1a78c66743b89b3c2eb854067ad97d74771f77b0906a9a7e78640de75a7b8273851dc55dece9b1941cca76cb2dac265e487585780928dfe7402710b6bd914d564568d3d4075e4141749990c40214ea51b71f855deb9349dae2108843b5cd9815f1e8458c020fadc1c65796b117f8b9851776e896891dc05aa0095a914457016172a17624a608cd49db55a42bcea68778a26a910eb566a2d942da58a4cea53ea7a67954b085eaf642405b1674309b68cb9bc3c04d67505d861a605bd6163f7cb49fb8cdcd40917bd59b94892459fa7ea64a4872f51b97e66e64f02818520164e20d5f952a3266840b4575fdb7625d07d00486bd433447d5e1abfa65b215e034aca74670d4b7ff61c36ac2a1628a20d79b352d1c82c1626233ba527967302131bc1ca837d9eb4238404a20a515fe98a9e6d9b34ec28f0b252263fc2bffaba508a6375aba51b4a36af23740d2d51705b2a1083b23bf5a6b75a214dfcba5eabb82faf49e4d326d369cab0f74c00bd54310a3620d570eee533a1a89a51a418a3cd14b25244f0c66c8e8e454e358364fab5997170a90a25f3816aa1b272b09e54435ab3096e8161926299acccae3d689eafcc7e220cc42f5a347173ec4c2510da02c3b4526d75c9b01d103b8914e41b03865e16be770a0e642251dc312cd10aecc6a9734ccc815da2bef09cd18c3a8ad6c0f90574f41075cef470039a62891ecaab5f033fcd4266a510589f7423b4992f488c3cbc450db074fdcc7cfb4a51c08e2359247c1f564cc94383892757a8164c8c985c28e288adffa9c866a6779faa0f0882abf650a4b9c5e0fb36e4e51a6442167aa97c8e25ba55a3b5d7f164f07b2917f57b16b751ac08167ae88cefa14668e7634d05865d1ea24d1013e1b270c9ee9164d18654646bbae973745e64f90e69064f38fe5744a6343ca04b1a05293c5dea9ceadcab0b1f07ca177cafff03d582b123bec8cd829aae8d7cba9f91d4c89cf9e9b52038638f54721f23c6b341419eba880368782d1a0990f57211bf31012148d74451ae1e79850b75d6efa172744cc6d77a46dd0272924bccef49053198b87e1ac122a0753950586d14c6b22bc12939f0661638b5191e6dc2ffaa147dac984cd004d6dcb637bb18b2f04c115f98cadfa79f64e6253cab64110a71d94db5762f8cb4d277e03b2435a473d60b193ed2646f4c5e157ff4357d3c26b7c4b45315f0689f135c85d952a64648b0a8cec03741fe04f797c007e4061f95c7d56cfc7ee5c49e849dde3fea8f25e7876df2a18515c34 +ciphertext: 4cedfca84ff4ab3bf3b2a94c3b87cc76668f469ac66f62ee0fd00f5774ec7ae46d34fd038c5b9ab28e988f98d4e88db9ccb5364f1fc824666a3e7f95e55660469d04b5014324cf9f77f6b731eb6cb71fdea7f5bc493b4313321a4967b45018ebb117a6668bf19597ed538149e41cd1980ab68486ad6c6391c291019854dc899327c21363ad651f0285e23e9d346206683fe9cb87b24aef767f17dbc1a1a8e3995c2dd4590dfe17077aedef6ebb4ab30159b127ea9d7e39d4b0498e59c7a8d927c0abd9f536110282d52ea16035021c7bc16bd0ccba1681242aac3afaaaba8ba52fed525a53bc8c05e6a74d219a6ba13f13d4983ba4ed151d4fe63b1b9aa6ff9b821734cb064d74d711af76c82496b5e718d2c8a334c887d4ceefbf37df4120be4e647c9aaa2936d8a2a82b3610788c9e341db471037970f9765d0816a2a728a82bb56025ddb847ad7899274e3122f5be8b126bacce82f29a15f7394de9b3526f1c8afa407a6ff90874fe1940d3d558285f0e71b793977c9e8893dd7d5aee01c47a34a01d512f235c184f84a7f526ef533583c968f3348f42a9dbdb026e054a747ac5cc7f7c61a5b02b04bcbc56b8432bc482b052cb471c6950020dd308f3e51ae575655d9176041178201f58198d37711f661cdc615bd0b801d1ca20529d448f15a99e831f15486e65a8a4f849d484ac122379aeccddabc499174059c5c52f60e041f4655b796ed5ec62e375d11d9f4d883e2291945b6aaa5a334dee61a08fd832e332282adfed2058b7a428ada4dc3d013e3ee1a2075e1c806b54825c197122c0729264e1faf761f561a04575ea0f171e40c9a4abe0a6652ee4fc4e8cd5f14cbac96a378ca4c037ed8092c1b149f005ef70240f4cdaed69752fb906b50942e97ceb9f8018718f250b792fd03772a2638aa4304f1bc772e248d1ac7137fddd30598660e67219ccf78f7a987622411b9fee83b4f1eca995207e7a42fe7b9f8878a710404f6baf41b019c71b34bd88a5f4da300f14db4bddf85353e54dce655831e5a487dc9ae72fbd3066d56cbf8b5122f7c8294db5d2ee56287ebd5bf4e01dec3f01c9a0ceb17539390f27ecf4ed2aadf2cd070d8ff50390c0f282b3f6cf6554453e94f11a019d2578c7e77f7f6aec0ca9100b12b28b6eeb48b8b8e579039519b2e8b078b3ed1f1e7c8a5ce0dc1290a970f4de5b64d9bfd944b9dd2fc1eb4b3cb0a1f2cf6e9ea7af68f6e1bcfd9a04964f16cc58e858800695d28ecc30eebc1f13f869ffc637a2799c47c4a5451e9b1481c1d99dc428da3fdee2fde40c04832f68ff05bb6f8c0011afcd7c929e06b4e3536d4648dad466d55e1937bccdc21567d586369880cc80bd0e41c37acf979fe382ee207403e0b458dc3da2f9f4e453e2bea70cb410898ff957fa2345c7299c2962d9020e87486690e6e6ae277d0a94c9f385c783f01535d87bc4b6bf630345c60502a67be236a6f1cb9d502dd61d377fc60acbb6c08594891ecf240113e6404d8e24359e4f1222e07752fe21158c6c8a +result: fail +shared_secret: + +# Private key not reduced +private_key: 9c7be557d747fbbbeda3d8bc234deb37e5a5850c9e482850602ce29b9d9da97a909094defd1e8a288be9ed19ee4f39b7657853502b4322b687a28532f77fdbdca934362bea5dcbde9a07edaf75f80e6aba338ab888cc80cde458720ba6146c39a22bc2c8f9cb0078a5413e614e6dcc9d9ec319f3f41fdb73a78c4b5715b0cfa6f0e0449c8c67493a98765ace9e8e9b6e2feefee5dc876de75589cc6d4294b40a0463d0a4899dd54a60ccbaf555e66d693ce6ba3e073c63757ac06a9aa2e5e93385b9723eb339156cee3a04377abe93af883b91f78da19e358c3cfdd7db9086598546c6886d1bc611c3b586a3304a473fff62371af33143bea212236e6345e903a652271d93ee54f09d7fbcd1db9cefd7866b15b6c434c654048ca845ab31c65e94edd288c6563e45d8062f415f4fa9d5d749f308c36c96dfdcfdd4f6c38bbf15cfe728a2807ce0af833972a65590dfd4f15fcfbed8b1f8649951e4494a8fd364f752b5aed616e5760344f953e47f0046af76867c980adfcde6680b14bc14ea34569ab583c86c8f4beaf9f5ba2ec689367f9f0e03844976a8c5b965f56660e61bfb93d838d3697b86d6cf3e8aa0bd6865dbcd93967ad79313dbe7ad3bc9e472354471b367a27ee3de129a336efe9114cba8ab995712a9e28c3f37227d3bd11649fc47eaeb1867c5079fe05be6960ecee6bfa54f14884c5ac1b42588c5cad9048f320ad8f33bcc442cafbcf9ec34446a716bf34f1c183a8829b22216855107bf6fafe8d37de0e63a72316cc5dd8994c58e7880e4e44a26a0968af5d0b8f546098c6c55ba8078c0bed3bb91b5b2cc1dc95b464852d7973dfbca7f6396dee469850ff1431cbc96abd482453ff729ce625a3498bbf99239465fa79b2e5dc0cff698d2e4cff7c3e82b88acc0785c69c4d6a3dc950494da2a744dfdcf9a99458f74b3ccdb753ef2e830662eec4115fc539c83d1bcd49e2e5ea539e110287e80977e3f578fc6dcba9863f7dea382c3bb9561444f6433f1386f4e337d3cc4dce2c63ba5d3ab496b7b493d2dd0858b8dd51368f1458d255ac57e8f9928ecfa0707660df753aaaceb8697d3bf79d13dde5f17a38496f5ed63aacec4f594cff35dd027764a56b2761d80d3d76b91da373636cba86395ba9fa7cea7fc5f2ed1ed53e76f5a5ba698d1d0763762c9fe4aaee0648697389b98c5586bf69356b56f3647dbdd1366b0814e66299c4dd1cadf29bbbb5dd393c40cc03967919cd3fc62d6bdf9138e6b55e84d445ae958f5ae19fdf33caefb2b737eaaf3f69ef6a6d5f780e48f5ff7a14a8bf55c9a474c85fd9df4f4ccd4a8a05c79164779b8b452f3245927ef53907f99196f59688f9874a4e2e96b44447dbc583ac4a4d43dc8ee329d9630a7b3a79b0cc673789ee0e8d26c93c17097cb83e5e5cecba69b137840eebf72338846c955b8beaf281f8f0c2afdfe1de8dffec250be6c29e3f613afe3d93e728acc4cf339cbb7dfa7ddc8b0eed4cec895d750bbb740ca89181bf2482e648f44a8cccbba6c2538006bc38fa34a04053dbaa7ef165c5003e7dbfacdb7f7578d03093a3d496a0f9f42b1cf3a92788b669beabf5fe08087d078f97118e7c35dd589ce1ac805d953345881ab11467fe9883654870f7266d76755b0a368661001e627587ba42a2ffc1e2c90b154bb61c2cc3d82a3588d4004d112534f787858d23e8a182971229bb2bc77809a1b118137fb91bb09d2b39dc77773e291fbe2cfe8fa2cd4882379f9471a190f34018c5819ac4eaba7a4a24c703c8876f321267b3eaa58a90cb0271208c6631a773021b3960c14605b5e24b01c2e3c9b2196499dfa69d6a76f0551907cc79611bcbca6b1500d50854f719761a59e8bfac4d5b27a54791482ac5426f73b906631e784c3be822599bba514540efe6a7c13440ae97844a6c73ceb51c471f8014fe51fa94b271bf3206f56abfec55ed7002c27a9250fbc12c9f328ea63b3a2375ecd35634bbba0a4a0619d4571ebc7868faab83c6180dc3c129e8596ede2b64762ca7670282daa233620445bd64a44f5c395a212a088165fd16fc69c503a33b8689217ec00a738f74210d074dc3706e9a412b7982a3e0804458560ace39b54c114f8dcbeb9a1512eea2d8636bdb91c15653926b0fcab1978a02ef694086c062f097c32c9445606050e454a5ec2a43d5cb2704049eabba1933ab857acc1527c254b35cbf6fb4e267b567ca2a125b1552d1c83f408b12420b0b10c2e0aa430f695af478c9d1c54406bf400170a84c4c52e9657c1b4eb652938b4a281a809851a5f62ccf930a56b5588f6fc64b6fabc62b6a62795b3372637bd641bc55c76df070288678012247d11b09118c43fba2536f5daab402377791c906e4cbdd5291ec81a1e71a3a696c0165aa1adfb978be46a8fa5cc7c8ee30036c085888bac3797a1f189cc4035658ccaadc61432141b67bc09ce04685dae806c681729e71b62dcc56449101401d967157c093a8a2b442c3af483408791769bf7ce8910ca4f4724ffc93647375e702bacb559c11fb18b1d4a5371fa4bcc603c22254cdf2654b2873cf9e03591f4173e6a4cf86aa30e9480d49215ab503b2cf6bf42c4b314c7595c907bd4526569b3122234b9e27259619b520412b43b892a6770cc32c6c276a391a106959560687c9620d8d1a60a093f9982a46bb9365d611a86d064f3f82d81ba5c3a39578ea4583b8882efdb5e0b3517be2ab82863c68db0336f6a1b9e1777d7139bebd15af3b73e21332d471100a8a8cdc9d926d2d7c23bab39e015c65a072e0409609c0c0607ba94fdba9842146e8524cc6ddbaa3dc3c9153c667d2b4f4a4871ed642fb284c573b1735b24b9f14aa72f316d3e8b1d8bb415e28a895a7a55e5043eebb04dad9a1d7d2ca9c1973bbc485400b8bc3e897d9d977be1d6cd7d93607a123e43b56b55189586703bbb505185f167d9e24d1c1248a4bc4a98b9332666afaea93aab55b09cc95e8691872c48b3594a1930d82917823362dc6e5ca19094526c462b52d8c842183b214f710908369e9e1599c8e43ea7d890a7e5a8caa6953d774a2e6a1efb1529411228d3637f1b28437c0773a719cc85681cff772ef05b3bbe5753fa2aa5e414bdb599384fb6462565bb04da4c84e550b20163928c9673427b5d57864cd0ba25065246d3914338cc9be47b2ddb2d18888ff99a087d0012b789cc3d6c0c2d93567f7a4c87f1382c4c5ea6d084e524b82eab586ad8c8b05c9af5971a56a31f2b73ab45392bf60b762c5543dc3a259dd67fccec3ed3654c6559f5cedd022077b1a6a052f5287219393cd2e0366d0f5531b2f7ea8704d2900ce5e32d432b4f9f751bde0496c580a181ffed762aa35454a02d3f1f47ee0394c89c +ciphertext: 946305bd5c4c46c2c2e3592c19e4d3f97b8830ebacd0cb22e2fe91165488e41c1bc4d8df410c422d564fa276b2d09e6d121559d1bb4b9fe4882ff9b47735f1a560af691529288b6a495d22bde53975633f37e5cb4b06ec28d80e3a14d5ef441b965946981402a4bdf5ec75216a477c0286a7c93ac7c85d0db58ba93d15a2612206fdd1da3bbef4afffad79d76c0c52cadc27513965eb5e41a8a2bc0982c5b1e4ab48856704e9999d906f8e6c9e69a75659a5d8dea96cd6491c5df26f389a5b68b92ec913af9f05f91923522e00ddcf8ea0326cf8241048cf5d0e9e1e656191c36aec989dd3b321edfa110a17f4006a52edf63a8f8c6eca1fc446b1a5502edfb71a6381b88f3694683169156b18838c26a092007217e0050025a0341f32ac09b11b34798167810162194f396bc3a15ad60e3c0e879dc2d67940b698e7fc89b7b27fdfc8d6a99c46e80268f872c9eb38e31bb108495ba4c1f4c0b772354288cd49ad1141274860e0001cb434111e47b436c5efefce8af2da3390c32e3242552c4ce7471abff8b4b603a261ccaeb1219faa229f6cd7aa778c8a5daa1c6d3b88ea34ce1c53efafbc49f4ba04a7cb778b0a974575fda8775f4926ba1fc2ff1675be8350a426b525f9de7193640a7d2a78f6f98cf82c1c5011d1cd65bd27ff699d2a0e31d15daa817389e31fe278f3c18081f1d8855680763713629afe8ba120a66ab72bfd1ccb2c8d2253824e1eba4aa4c8e16bb938ace8ffefad97a795ffd759333467aa3f00cf8eacc2c05cef9ca5289afb1dc931634a069cd642a7c87c4b871c92e0ff08d7db7988f40cdf805dbcb9b23ee633408392d81daceee30d51bb00fa13eb9ccfb084deba4a4d1f49f9675dcc31f4b16e30dabbb54c56b413ec4b8fa8cd66321a0acebb34fed2200ad8ee25478851de2f7ae93bf00a55317829f87e03f7be1c92bb503c7d0fe980f983e1f65dbf6c7f9c04fd2fc611dad8f78b0dd11b26c11ad696c2d9478b715065893453ee5fd742c4bfe74da5679602c550a671241f77bf16da6fb34f1bcdc8265181488a2c0a81f02438f6c59b5bff3ddacf0175e3db1ce24af9b566710bdedbccd79013d6bc000c4aef91af28e9407ba43c0e0477ceea33b0d9d90deb875684ca797688eafbeb93eb65521ac5a76c66b6ba87c2ffe6187f2e88dec731b4adfaf27d79340f256258706c226f47b5bda71c0022f8ee91adf3d3e5b3c6539ecaebd5a57d724e7a9a9bfa7af1e2860c9ce790ddfbd1776b540255711c5e52f904d07c97ae11e6775d8cd8f7d8bb6301647666358fd9a1b90df2eafdd0601ad13adc24c9421914bd8225e7722ac8f55a5715579571208604e986ed90aa648109887b0dafef529f4f7a6b5c0d27f16e8038ed7059a003766e3748cbcd3fad459c4cffedfa44bb7a2aaac67cf8dbba63680c39921620cb5062238c7028f0cce8a587a8eea5da03b5ed363f4cb65a0cb7885babebd0834194afa46437437f6f324eb41348eff99145a1848b4e97753052de775842b8fbc6a5 +result: fail +shared_secret: + +# Private key not reduced +private_key: 2a0e3c0db356adc444062a6955267cbc8e32d72a58bb1b34ecb955795ba52f26f4694741fe3c646e734c256f547b7f553d5e559c2c88831becd53d89e934d80807b4daa964bb85cd5cbc56edfaf57ec59b9d8d8bb66835ffeeada8fab7db77f68debf3454680d3b7f45be4917a1abeefe8d9d89d6c1b8a4dfbefe60313ab7c69cba57fbef35ec7e2eece887ec1c30b7db129b8a824daae05780664ce8016d0dbc8ba43eeb4af6f9424735b585f9f35f9abacb9d54ae346ca9f8a3ff7884495e95e0f369d046dd68a7129197cc91c3a912cdcc46ec9b8fc44c0ac8d98c8a18b185b9e174bdca360f589343fa5d9121b7b3d8d46f4e8d86d57eb5f1b3e20d6f96936a2e78583640590d52aafb42ea23215546309676dc84c445ab78bb5660137a50c97aa05b7b004e396619b632e855d80c6cde8973c055c65b8ad6a915fee8ce4844968f0d9a66f879ae9e9eebbbbf86437545a5ddc4326f4d0c384ce96c469906f8f9703be9ab7e81a46e739f770180dc47eab9f1c8d5d8655d094c764464e3fd58bf0d9794aac17b1ef43e86a345351c851657a9ee61463f0f9e2dfd8ae113a378bc5ebdf5b918b6344fd74c57353d25abfb18f37ce9bfdbcbe48d7a0d94626dac6a22c4e31f3bae1eab69f768dd4a6840539d567ffded156b5ac5a73b2cd8e64e68df973b9dc8692bbdbe7692c496817bb1f0465cddc6ad269d3bcea873ffbc9d857f487b9fc8cf7e48c35f88d9687542d35b81b584494524f796f9a9d4c0bfa4030ef65bb7aa144ad329f5ae9979f472f25b2b59a3a845654a88b93575f6c25a740f39c34771fdb99b6d1b41831cd93fe3053a90b5cb4df7ee42f65b2a2babd9a45618036af6ba54c9a3bd93cfb5bd84f6057ed9e687eaf41e6d7cb9375846a4952ecc3aaaef25db49b31753f0839967ac9319b6c5d23a6365a7da3fc4497cdf793196b6c9ae5f80b949c825599b5e3e2b2f484939b960cbaf697df678afd9b4d2ccf211cb3bc68dacc5bd12648da6ebed9ef8638574d667196a2c135a3fdd780d355e3c0d35f78836d109ee945b7b618ddf4ba5aac934383980fe7a56fd214cd36fdd8e95773d2373f3a56d7f562236be80ef8663f69c2b6f48357b134973ca91ae00628f79b23d6907a9077fd5e46b7e6cf79882707c942dac8200baf3a454d8e84f5878f313cf3f52fd7a602b3e14bdc50e34bf9f18acea728d22663f288ab678d4c6dc60a58366a61d7cef4e247a39b24ba960b39a2da80637c9cf5838cbc5a5b7c1b7fc8ee6777c9cdd156dc9ec3ff1db3fcad1cf437e3aa5a0dd30b1d6b071e3f5e896730a6fd1efacb72084df7475eab9cb467ecc1f51e77b644c9a68a961ea65d2323628e558d6b03abb2f5491c7c36244a3ba66e91eff6ae71496da747fc5e25d0e22a7797bfaff8856d75e3f78c6ee7fbd4fc71743bf8ff4c78b76e3ea45ee2487a8f2899f31f7d688bef8dc579c2ea811d3c50d60c85f6e66457d88f91a63ab1ebc98a1bf16736f700d35201975091b9ba312fdc6eeca45a9f376b3ddd162af34cedc93b68661da9cf45bde071a8614dac8906d39eb475312b1cfe998ca7ab67bc77387e5b6cc8afce4d7ea894809c54e10649325881a8abe32695adfcf444770c6ffab16e9211abf5d019e1471b843a3e7a38b5ce109a0a6796a0d822a926756f0c4a0fa03f53200d6cf37a1cb741f10219102b63425063d6a910b2fc574c49067a1a40e22ccb754926481b7f0ad0111943b3e67a570f0bc269aa50de26cb5f3507791b757370517d486d7a55a88ce86b42856705f6a7a48a8892e96ff20c304e74271e0b555c1b4b0d065a50d61bb2813cc3723009179dd2b4c37a0a06b2099c2aa0c4d256a2fe2042bf4b3db91b11028275b33b4484f2ccb9971df29703dd61c17dbc0319ac63d16080f5b5c460149ef751933ab60142404b66690a2c10a6e3aaa186f6c7e130577cb02ef4e043a6d4ab22ba85b5396a4d61aa1528becc59a1843a4d70283cd2f91457762ef34424b934be9a1547dbfbbcde21552f968c2c8692475632e78ab3d7330619e74d8c71bf3797844c717e70b51367963a7cd3c4869a85ddd213a8d34b788239056544692a7741124697d237d7e2677a908358d81da2cbacefdc511d3110e1152bf2d036c4593a0512523f80a26620ab1cd8b6b1d99a08f25ae3121713ac070833c544e42acfbb78d86476743923d7310c5a4238cce27773d3989d598affe6650c1166ad4ba0e034ccbbb5a75d69b113f2a1952a2cc6980c58ca6da32718e4484d562ac700d924545b6cef439234980611c99e69706054981349041e1962b272c4b0b8b416569952e4f98d4bb12de6a13bc1c903c5477b0ffaa1c0dcbd8e4abd4670832eba3d43d9c31147aa803c17bb32c65e3c350520297da9cdd6dca30ca025e85a051af5aa82d231c159a5026a0e8f2c16769105baf7708fab822b1777c6c53137ba11298ccc15d522400b7f85430de739514c90453ba97d9359807568417ea307abb8982707b7519a65b116466e984772f87a6346ac808c7b2cd22f08aba151e79ad8e45925d29294879a9dc00f60713e33091c42bc3ab24b65b488c764ec75b4117dde39ada784835d3129cbd7b777b1b69cc3293f07ade724639b761ca598464e6676e216874c9668b19aba660974c9918d52761acfa325031835b4d44b42fb91e431373781a2f60354e837458e69a89d830e00801178ba697f82a3a914345ecc1b5cb4b3357b6b7d41b708c5a7e4f862c44c8ffa90473495b70607386c02b4f0261e197124de180cc793355135bdf37cb36b9a180dacc2f6b09efd80cf35211a0371c59f396cd9ec226e1126d69a6ab8441faae9a1cbd18e17387ca0333f94acc7e35306a8b05f4dd185fc467e5e888159a50c6c9a51ca6b2deb9ba212822020d67552d4317449b51b21c37348c44e3880367574d5c195db588ad0189a80756eda780dda9a7d3c946b10d897ab8bb40d6441179b1b0d58271ea83000c5ad56175a23d20322d516b2a487c74a64eb3514c93b919d65cedf429bd37515fff66f4d72cee39a0081452f791b8054660da44937c4a443a09727ca5198322c341c12413c19b6075bb9118540bdc105313422cf9b8fa687540af66728fa9859a642bb9479b31257912cb5e0046dc9273199f27f4f3665aee6a7bdd19e0ab8baf1d2a868b465aef75f3ceb916c82bd81791e80158f8e5b358c218305d96a683a19c930c1903b5e0a4b15ccd8ad0b9e61da304ad616af46073a781ed8d08060c1678f48941d67b3685a39ee7491a53a20ea03e400a843c8cf4d04bfe0c0a3ce63dde01045e2669f7ae5da7905775aeda108ea4d6c6bc0fb958286850422bc357ca67b83c986048e0d0087fa11ec +ciphertext: 326dad83eb9507d3d8c6433d9c85dd37879c8edd4271eb110e1da941c4ceb58a44d889e67f4a0a339c5cf490d27949c6716d4aecbc49fd976a67e36663fd6fa0ff29a185ce1af8dbada61b609e8acceb07a793390177024eee8f1d360f4069f7a455bf94a7a639a8fbdfeaae04177a1dd2427d748a61a72f68e119e98c9437d243bd5c3b83e07a55891b400ab069ff19abc6770b7252162800fcbe0ca2aedc5de3773e9f961440ec5db16c3fac83941cbad8be79b263321aeb01ab0c7e35f2dc12b3f00ebbb6224a5c83a51c8173876f2f7bb793c7f965b8907ae1d132d741e1c795f30d3c796094e04158fe09bf981566acf64dafefabdaa988d6f6dafaa95f912d7c78f6ff1b589edc549c93d0241c028bc0b5db30810e560389e5eab0afef7ad8b4edb2df3e921796e8823518aa21adeb02e60f8a11be5a309a88a6f48b58250d8f7147d525159978df41230036695afd9d0ebb1bffbbcfbd45a74405472c220cdcc5026b1c84710d0d187817042058c65cf5a88bb8f6b99553b013ff77b9aec4c9362a279aa2fbaacda95cc65794ca2286492670049008d58c531f70c954af90d08a6498569902f001997692022099b53a6b4e2238bd2875ac7fb374cb27f41cb69a38afb0445254623c81148b5789981140697c8866a75d4c37089c2d536b2bc4d789f6dc045ae57a977f7bec2e0dd5907eebf606dd725cb0673ac29f16378a11bc71bc5ca0ae77e2c3c2a5be6a175dd70ce5c06e906b899b81ed5c0b6000a7f1468948341687465a671e6fa5458089e8795c0faeca5321b30edc70bc60a664ac491920b69effc3bc268176059f47f54e30c4c08fedad550e34087a0c5ab189426141db1c27fcbf348b33216b1b8a184367887b1f8c46baf4bd44a3125b60de3aba6e9baa2f3c593734c38c43f8c7a7bdf20d847f1a79708e81df8f6e1ccf61c41c40b74055d04fe8a7eb091ffa7938de90d71d2a0b5e790884ae8fc4a6de70aed6aed36fab4df9a4f4d768ea2b0f08a047d2276876073196e15909e8ce1f91184e41965f25673138d5c3358cac17d611ae9bf91e10485aa53c9b570733866c9338ed111b99c618016f8ca21b283cdda6c6fb00279e4fa2ac419be7b51bdfaef65246ffbb8a4a8afe31cb67ae15bd5260a3147a32ccb0c084a7435faa8e8278f6a3bd0648c86af6df4e767b6165666a69bbf9dba5f9baeff4348f55742f25e63367a3a7a3f0838d914186cbdfe83d7850ad0c1032cf116f8c937ed9c14b45ca6ab98850f40be73121ee0f29dd3400cd54a8b4ef9f96ec3b1a19dc5099ee276df4f2ba1a6abd46bcbd04722e49e1828c6a4090e7e204908a0cda22339c4c0e733501a389196b11966e0e112c6fadd0a28b05426a562a9e293be1ae19e9d85d401bcfdcbb98c057b4accdef69e8338169cda5f851216d1a462bdb145c83958b07f824da067783e1db1ae85a86b156478280e222dcc204b3b858374514b29ea52396ea28d2313346fa53a610dc2e588252b6dc42811e5525a94e2020ca5225 +result: fail +shared_secret: + +# Private key not reduced +private_key: ba593157e38d7e6735b6159ad0338a4f35cad3b7ae7e79c024b4b913b3e3da5d59e2ac727379fee4e6f1719dc1774b4ca473b09214a81a374e5d5350b51c4f52376e3c8ae622cbaa2226965afbcecf5b499f07f30d67fdb7d7916989cdd5dface6cc3a40949b02d5ffceeb941ff6b6d37e3de078753aa73836e7fabfa96ddf89df0c8f43c58f47abe779db1bcd5dfdebfa16efe1b5436ae7cd7b7a3a65a7ee3546dac52b9c5c8fe4478c46f5864949efd396387333d7615f97fbb95bde7e7eb2f93ea2d30870ffbe90f42771f2feb73ed88adf6bb733aec159147aca3895016d394dfd4e725d308897b3b777d6a176959445d0e589b10b348bec1335cce863bf68ba510e9c6d17fe9a2aaebffd70a7d65d5d2a8bc285b22dd9e9160d8e2854a9b408a5e1f847fa59f670eab6905a63685f8efbfd8a688cbc6fc86672e599c3d5ade10a4a92a4fd5705a03e98eedb4eecdb8e982e6aba56ff9cfa835b6b19a7e0c39b48939345cecaa598fa7aa86721cb5675ae4e62cb61401e5e0cc36792467a7dd5701543898ded6223fb505ba450329f747e4f95fb57508446c928bec8378a96b4a56244df57c89993447cc183db3f6db7b8607cf1537cd1ebfe4a7f2931db6f9366adb1df157bb614f4322e55a8f8dd049b66eaee34006c64bef8ad0b5a33fe857de8df44b4dcff0d29a8d51ce1864d772eca45188efb4adae8f64c758e6698f80e804dfd821c178d6d7ba43c2c694e8b4a8a356a8c26894df3d6599e7bbc6331a6e77e6b3f7aac4ba2b1abd2a79484eb09ddc3af35a8737802f7b71e6731f368e5633fa913b63ba94b93269ee62c7ff699659f66c984165e87ffe53d8d6a3ee4d84e3b29d089fdd1b3f3aca703a3965ebee2a852aa4656f355b05b38e94eddf5ebca70f09da47ea6d49f54e08296eba5e563081bf7035aaa0ac761c66b6b11978c19de431d25ce69a6373d869d8ecc72b47550deadeaee5e915f6eacd36c50cda5ce545b7b32a3f63bee3880879bf96b7c6925d74d46c636f4522f44db993cafd07c91fd646893dca37eda658dbbb52b4fe1a5ed9dc30f40a3f8c606a7b0967e5e5bfe80167b5807e3b414f69ec28874398b464e18f54b6dcd9b693b36643d82996ae2d8fb8d26bad01d687919e500b6a289c4c1a0a7b9c97f865498bb2b4d455e0ba3b667da815fd4afd3942ee6b4169b88435d8b9f6a5c1883a3ec98bd8119b14777e00357fce29d59823f6b5057a6ae0f6843e3f3cc0593a24fe14e7dcd030aa979d639c02fbcb286c13a0fcfdfbdbeec163f8ab3c378efe1b6e5d2ccd4e137db92cdaca20ce5b83c2baa93d5c063db6d419537a7597d03b9ef9e2e4869dad0ae46cab55dce1169ecff53610053c3dacc5901a43959e55cc285ef792ac5ed28840288fdfa59e2999d32295b967f4e45d7046e7604d89338bc26d4c9f99fd3ee24e2683899ddc534ac37608a6959efd7fd7e24582fc9629b3dd59fb382e599ec8519ede7cf600c98c58eb8f05d2574c25c9c0d17809e04de1db44e8ea895c40c8aa2448a6655442f0bb7a26daa8df8ba5faaaee1ce9d16dc4d277f79c0bba589a7f948f7c198e8cec71569e9863f968cb5df387c6a45da8103fbd9797c09abaa56083952c0c1b6ec9a50251f3c16859c2c91c0076750016ad3ec36c42941af9c13e4086b37f5373cd29ef4d46d6179c948eac2738bcb765bbc58c8c0fc206a4e30267ed62537dc5202c5a717926744b296b2983b8291495161c920cc1258f209640549e5e7cbbe13ba52b762c6767c92a95678e066631b57e256880ae56189b699691999fa294b71135a7537202e8873d2653eacabba9d3082a5f01353b77da1cb4220301b84a14848b94d68309c6a29035e7cbf083bce5e659c0a226274e8534f61021d1743bf66525aa7c62759c9ea85155e139a9cc20f6b0776d567a8f1e697b97ca60982555c0197bae535a0d20ebd00a7774550e928647c40598d16a45da0810399cf38865ceb5c2ed7623ae9f55987fa37cce79aae79030f8c3b90898f758366f7f591452c77ea7c3203c147e591304138568d2257d07689865447179c017b0560b3165673526981c65858e842d913a9c22c0a9aac9fa4e16ea6b128b0bc99ff863b3f40b2819ab2e8a04cb353c7ecb2409e495e617a410e638bcb370b2c887b8adab2b9f95e8e922baacb1d148610cc4748cbf31b88da477029ca130b152dd923bd7796d0128aec6706c204ada1b37dc0149a7c318d8356a4f8c9cf917443fef20b02096579580d82bb8659b18365ba3347b081f42b17c3e2064a441b1a3a876c26060d22c370f82424e9b156145e93894de3ca09e4fa8ba6524eb9ea94980a038b257fb4da57d4c8b40ae5465a3a9c7169ccd30b13295546846a6bdcf13c3230b5a961b1ecf578abfa8bac3542820053717baae30a545261b873f278cefb73edf8cb73b9272dd7552e381da64c055470c199bab07cdc3293c0577d9acd9d9063b536412ac7cdee30a1dcfb6e25dbcedd5425508a1091555998931326fa69c78b5021f818f8a55deee77db38229b4104980c230dbb872cd671fe776a09be47852204c6a339126e3bac2353d36c094506092aa597449241121332900a69f8ba1b79ec56f047cbbfbd6bb2aa08f6e606d54c72cbb758357e49b937590a1191d88ba26ca576ecd320caa1bcbff8533695aa486d222b5749bc8f4297bb7938d5b4cb4f46d6ee701a35a287dc16f7dc1347ee97830ec69cdaa91ee061d3f0c81bdc695cd6939ae56be11681847629ea555747c664b5e111a9ac5159281438729916d45b8f0d3ad0e0514619ca93a8a971e9433c9eaa731192c760c5c5e32259f569dcdf39bba4c1b7269bd98417abfb1521fcbb640030563118e0f35bbfd0665023863e275c7d5319a1087bb2f956d2dd3ade6c37aa09c36cd5aa9ed09b8999c4473665ae2b784197cc9268c57bfb78dfb054bd1278e044582cc3c81c547c50fe7bfc270bf6aba9fc159a5853045af3758a8d552c3881d7c2879dbbb0b79b5a5c2300b5a380ecd199e3309251f9647598b7376290452a575f4ea7071f2a0ebb7b3dd9057350abbc1707e25d0b68d734689f0ac4c9b3242fb703ea6bb7fc064e599ce8f9269a0d63a719879ac8c396d79221babb2c4a0b7d38ac5b7e984f2212c481a353ba6bd95039443658eeab625d3d00faff2509a2c208afbc6016bb5d8726dc74993ad329bb9a554bf61209cc20e521b628d9c89c8fa687eb7464ac51820225b65b2af8489ed896d11825bc4df67f7002453d16875ce21ccf49bcacca228846450ebb8f04a2a5ef2d919dfa47c4aa265f4cedd10cf74eef3ecc1e63f8ffda3565c2424c89b20974b748a65a5aba75133fcb3156dfb6626a83bab +ciphertext: 851033f1b0186cec6316ee0d2de8492c60f77e7a28e7fdd05da815a3d097b57e7648cc9a8bafe8989eab34df3c43d6984fd19b65becd0c48eca9ae5ea2f070df97a17beb6174ed74eae45153710a758c89c204a8718bf96e1a07f94bdf8efca4a5de6e75230e0f0110cfc0382361e36d286ae3c679c06e1acc9068ffc834c8f8b61e24215fc99824a988b06a4126899b085273272547055cce233c6934b0a1581e081a2ecefa722e3d7b2a2d610368bd14bea532e54795c2f28acc0950b1d1589f23c7967905eaf1548ac3804dedc3762f29e02d9933f1787d0dff3f6573fe88e78e5bef4311a0fc8a76265df4214a5996215051b4bc3fce8c67972631a9a1ef30bd0c85f228060879566def14aa169639c7c5d003010dab55f735cddeaabbf9d6a2b44bc904fa6efa5a258d09df75804cb993d689f621a635bdc3895107af08b831ed70ad4992f5613abc38eb34637110467fa1237b0614a5f370b9b9188892af64282728bfbf30cbc9855d2ff8dd016ca8a42a6bc8fabe0aa11b9fa6ba816cb6991aef25fe38e9bf9d677a95c4482bcf8cfda7ecc1f0c6c642f55a2cea0ec62aa232ac39c56a757b2026463d33109e04cf1c43a685a02a7e95dd9a628d495d2da75b95ea7f9ae1867a49a4326ac7e8b276667b6b0c1647e3370a0ce107a1110737fbf73a2a200331751f2714fc14f0b5f0551256e8f5c4eccc8fb0d95e867a021a8ff12bdf520ee6c8ce98a19233142ba18a6184d1eb92ed72810989a71fff33f712ed832ca6c3c9ab618fae23356a6078afcc812247b09032d58b5f9716cbd95a87b2a9604d15862348bbc388dc8af24415bec3797e03965e618b88b6fa44abf5f7dcb381b34b13ed9642e973edfade4f18c75b4d6bd437a93bd1740499720f68356ea2b23017c07cbb5eda895c67876dd914af22e0684734ff6ce2d301c4e79a68099e948e66b597b87c6c4fa4763eea673691d8377aab5fc4a166ba0eec69e7592cc4082182e69f7c3c9b6afb96bff870e34f56931a759ba44d25fe1b75250b5f2b6500022e00fa73a8276087e300dd1a96d520792625913671cc13ea00926199b4bdb55e5a21ba3f9fe0e9521c7fdf7a56b4d0d712a43dd4e1298b4c9e1691c243c6a1dc3d3d273014fe4395b6553abc4a81c4cf186e7868cf85db5579291b9730ca26ec09f7302b8a0b62dc0c5b3636fa8445ce0fd772c68d4898c83aae108698e809a79e3a341bc79c6ac8a1425bb7b66ef4556fb6c21906bcfe8252c173e2c637e1c86b0d3fa19fa67ee46c0bb85d94a480f24e99e4acce0a9f8ba64a2afa388dc9be4ed9d50f6a8107c44507b70dc7fda71af692c0e1743b15c998090421e454de886542b7002708f6a5180e20b2936868e84dd3afaec04ce4d628909204d757010fd682758857ce720257e01ef1e1c361646f740043f34b4dae7d8d02972039584771114333904353ecc45fc3b3428837e80d7b4df6c4923b122784acf27a5329ef474e2545baf052a2eb404fb18b13199ac35f19258782bcab37 +result: fail +shared_secret: + +# Private key not reduced +private_key: 633bd098c5ef1dc64ab3bd96e5cae6867caa3f66f1b10c50008939aece7177533cba8f44b0ccf87309a67cae47c67fadaf0d3472437389d957f2dd48f4b7c0e8d88469a6a87b87ea7cdda3fe1d74f2bf90810d8fa72c9242eeb7622748d65bc6de3d76464e9a65fc5ba5d68e66c5ad250897b73ce0964e422029f75b4cabb57a675ec3e44cfff2f417aa8535dc774bd689063e8a9dfd6bc4d10f4ba0cb57a1c69a5869e5a55085997453f1f23496a6a9b8331786ffd2ca9b83b78479d89885acc3f46b9f45437ceacf1aa7d7c39491990ebb44f3abcc5a504f466891be5e902b9b97c8e97bae9f25b4ee0df87eb6b88c0d0f9aca3534f807837dcfc254ad6c375c872849d263a6cb8d34de33c36269df83fe99ee8b99bb935a33d16cdc588c82bc39d5de885dafda4422f6eb43bcc1b883ef1b6a85486988ae49fd71aac97e3f6cd71e5e27cf3459c74ebf4ac2edd6f09933a22f2e62da6cca1a2f71517687111cd70d7ae54b2ed5452ebf8e3a9820f8a77794b3da4931a333928fd37e7c057117fb2f2fe9a19d6590791ef48b9dd9d0eafcbf67f063ab7bee59df2ca3dc8cad709579b9fd2ed79d48845de37a1af371c6947b12ac4a152f50c92c63b7336967dae797bac7b3a66e5a997672c4431c28a601dce360689d1cb6304f8cc04f6c3e2f67a2a72746e63feb1d9a6018c4b6f0a6943af9f7552968f7877f28cbbc9bcc410afcc781ed6d6759aedf5aeb57d7cad7fc89b8bf9e049edbd7babc8797768ea3ddfc3983aafada910a359b5c87d088961e5f9896183627277e707aa88b3ed96658663cbb756469542f9d53f22dfa73644d510b69da9bd89c73ce4bf4bdc5c7fffcf4cd1c73ce0508393f4d9eae79c9fbf44b5e36c73d33af7fc9c084d5fb3ebfea5727eeea865efa7c917ff9fb52c4de36fc5cd8e961fe2d7fd7167c7e4df137c584145f663a3931e96382966c58c3039e182cb1e0369813bc90312a9ac70f6d4f9cf4da0445b3687c27a8363e8dfab0579bbd3a418fb6af2689fbfa6f81b0373469d96e758d3a5658a414fe9a43f95e784b91587ce4471e34812adc977cf5a7b8491514a1ccf83904489585b841885cdba49d465097f8de0fa9a3163ec17cb1422c3bd8194f855f59953cebc7eae616748c1afdd2ab8948c0cddf7b53446ceee38d7b877954f3bed453e5a7bb0f9e5841984bad6cc970f9c9602fd8562d3df5936a897e611ee897faed50d5a3931d2fe9f61a8da6d75ba0e85c0a674cc39c583bedef794b628bfff1d9e8aaaada889c43b5670fc73fdfcd60ad84c8cfd7a43360a8c58a404d5bba39db3a7f3b64ced951ecad19ecf66d045a49a38857a4e535ff8e785f69bab9a381b6de244543b4ef6fcbdcdd47575a82da58acb5d239da726e0570a8eb3f6714b2fffb9038e4f345977fb3156ca1eaab578cdcf55e6aec8ebd1f6b92276ac4cd37b67d1b6084fef6cd3fc91d28c5329dfe4107d8ab84d903f5f13e2a378397a52793c0b886fd67d846de86520f8745a92efc80f48835b4d33ba53ae0e7b43afc44995be3e76663d1e6a2519844ae08536bad55a428af5144be296b43aaeae92d24fec933546735a6accb4a5a99852ca751c24cae5738a99734408c884e736a271a17a9a5829a56e4ad6fd90402c18327f4b5b052a5d72585ad276a52228ea0794d4ae19235304674705176f76e909792b32b3f45f3c179464daa653c4885346b0921f72a2e186210542575e7abcc210bb7572c5ba97c475d8ba2810c54b9f23988725dd17967e9764513e1a34e55a9e32b05bd6a030425250a285fb331351ba4470eb2380318c9c7a56ed0664c6a16af63db6dc2a7c1c4e5a901c89ff7a589c099568c9bbb0482b04205595c242c66d99725a17468684b2be16b2757760b72a57974549c44c17bd2aa028a2c2d74b458c2bac3d34537ba095c34459b58aae4940fb3b68a73b28aca34cb018b92f65320bc3c04008394e17215abeb505b4bcd37d473da43569d557eb34b06eeca22c1264db881a6b37bbe9467899117b602304fdb72aaa60bbdba128214cc87fb980c1be3bcf9348bda62ccfa591328901c9b9851e9f9258e2a5f500053f9266891fc1ddf267c58c1aa7db72255f8c277d8535fe48db1d9b12cd97fde35c837d12f6b1c84e2c019e77469350bcb9c3791af132bf2ebc633f3c681e3801d0ba00a30672e955d84930c4012100c18b7a5a342d226341924034ac0953ce15584911d86c0689fd12d3dc4cb2d8748eec4abecc185ff63162e414e709cc3c5163de7b80e9e550d4a0b90de20b2fca850e3b11338bc3b5c369d616a2b64c764f78122abdb66860103371b773586463ea51366792872f36c53603cd876c4aea446e8811feb4417e3f21b94059f1d3c47584c09b128c549e48f6346cc3fa60ad19cb9b65359f04506cf52994ff5225aa24d68a00bc5171e0a492733e726eff02c2b956f9d6a6e7a8519e2b9c4c90b8db6b5447a0b589cb71cf0b74b899272a966c0b0da3824035c70c334818bcdfa2632e7a47ae8119661b96a6b4b17810a8840cc05bb3a0db2c6a60d10cb3e7ca365576250a380fa4b956ce066e72a0d7739a4b4e317988b64270732ff94c319a368cf0b8d8018a2d210bb37c695032a3b4da71e25e2287ef34ed68b5711ca99af1cc6b83caba7eb91d1f10eff920d9b41091e086487cc438e461344905b7e954121948ab8251fb0044e6cd8075f28b70a67132c8362b71b77298c2200e11b3013b6b2ec8b21e7a23a3cb9456567b3a090fbe642a1693501db47f8c4829d86bb1ae7accdd7763fc0b5e754ca5999a1544615dbb1acda7749c1d89073b130a4823600e322904c9599c31b67c963c307987fabc4e482910b57a56e2417eaf978008c9fa38103c15ab1a811b2b198a5b7201ef767a26a758400469ce0b1ca83920fbcbbc51c8697cc4b687d8ba41d45725551a09e5cb230532760cc15292c4ca9cc77f6e215d70c8f6e98b35fb21c5e0993588c8f76775f92c575c013270c167cddfc76de12261e84c1b506737a7448d00a6d07456fabb620d985607a32526d276846cc739276122bc14cae94543e11276805aedf36c404fc079117196383cef2681074f954249b859498a8ede375663755890613b15c2a8ff25ade0abc4d674a050369a596ac3e446cfc3171600367f89c9251e33db95c508e09a64f683fe7420c5ff73ebe5836ebec9e0ef1a39c02acd90275f5d9af9eab8c741023bc91806d255282846cb5fbcef030ee8e721d0566c29f469f5773938d679dbe17bfd7de66be5e4126f5151d1b086e26a88bd9f20710ef06aa0f834722b801f6b79c031f1f9213fda268813efab5204efa60f78bf81d320d01ac09ac06244f7afbd2d80fd356d9 +ciphertext: a1752c6d6ce4394f2ec75f83b811a7216e0c22f7de325c4f443c4b42b8b591eb1cbfe51016809b0056a3791bf89a2d1c1d7f33f487456bbcdf4c129d1896293b2a247fb921586e048698a53059d76bcb892c491d7bffb93cc79dfdcca78e19bba05bc9602f35e1e1ae7a39f8cbd5fd8fcdc78d2d4465166e1de58d9fb958c697a87f003cf53e39a5d74c800b2ff3a1ff5e55697b5717a024acb384aad7b9e0378edf0a32c84041b0411ea2536756354adc9c94e434d485625eda46c49df91e19897c73088252975d53124b0207ee6f0b298eac2a3b850d38f87e8ae34ed2092847beebd022a340b8397feea6b70f58048c9e0f7ef1871e3900665187a0bbf9020c8193bb72619b23173f2519aae103412c2938385e4d95263b0c6b1861bc8a9eb18bd45b649e2c88267375af062927cbdb36073c8baeb2c18566424b19d1117eed47a2ef5c9447548181a6e1278babf995c236a0481da77ce3fae728f1af4134a74934163765df41e05cdd81f5089b4be2d98be48055b9a15e2531ceff8e25fcafdf8c6947acc221e9a7d497ae3e6b948fdf5e424ef8cbc7605b14313f96d0b8b384e83709ddcaf9ee171463e4d99ec20a0eb4c935a9fc150f8f5cd7b8cd35af793fe0c6e8acdf937b8de68fc5c340e167c9cd54e3e5e62fe5faf9a3509c12377567f0f21175cb80dabcced8ae1b0673b78604763a64ef8a168614cabe7046a4551fa6058b4eeac3906d69642eff37ec1e9f4c1de1c3dd3ed950e6673b8a9f5478d136309781b6e758e4e8b0e1864dd1dd1f961012bd47f4163e0300e46fc39ced1aa6efc4c1cff10633b6740d9436f7c024c9835f647b868f9eafc7df5b99b4347b7b417973019308d564d5ee6724c630c891bbba50fbbe8b902d7d53761115bd4c6b0cd9f1a7ba657e8d75680294f35c0cebcccad433a633e1d01b8691ff74a7c2711ee7c1aed207fa3dda7dd61082198b870344b6ef33016c27879d22a8753993b2cd017387e5c23b18367e5eb3d3d356483cd4f8225a0b6d89853fc0a2869fbbbf3f6f4dedf302e0d8919fe06f5687ddf38847d2da1fafd710410fcd5b1bbbb14e1e6e3cec8e3749d19abcdba23c817666a4bba93a14db6955bd8d9fc9a96283719e6badb4086ba2b04d7c8b4292fcae74ab859b5f1d58a691f97b9bcfc987e4c1f7aaf46d7eca4948230b83d033b006862ba19170d524a3e1c79503c548396fb3a0e0d4ccbe0ba4a5b3f49e66113069ac7436908f3e9f0e536d4c6c54081e490dd965d34767a2f9e26ce5ec761f30b9c561729b4be664a9274320cca48fc35b0e878fa6f3cfa1531bd4cffa1c09a47bedd5fb7871a56581356f2fa247c11eb60c160d4da1393cb46185ee744e220de433e3afcc3103a58ea775e4c5b8581d4ffe4df3770cf7b1a4ec174d4346440dca66c1a3dcc4f2ee81451126e069e6575fed7f292f4f9fde60bf3b0ec9c89fd92a04ff36ba28e1270e1122554aa75083844d3adb275cdd15a04b71fd25eaaba2522c2745d46475367b349ca9a4077d +result: fail +shared_secret: + +# Private key not reduced +private_key: 2feaa7e47b8e973ca66cd8be82e5983d295eee37d134086481b9fe55d3a282cb4e703bf34e3a49ae7b53306e83e0b57e4cf688121a5da377aafdd36f128d816ee9ec28038776169ea1bee938fff9f7b5744704fa5f457bdd99e91d6a89f6b7e46b55a5cd16c743bc3f406dbdac5ceee87f7946157bf29f9d6b8ce5836c6b28445601497e07376426239aa4cdbc8135570da6f3ae8f8f858a6ec5e4946f189864e87249eb574875409bbff96724e380c633ece33567da5811b9a40759403becc297ab63622bb9f0b5cbf52378be037882ac9b264e4817b478420e683b8696a609e88323762bd4e9fe939ab0c864052f743b3a7e628382d36bc42afc4dd206a160dab1d165eb0e7a349e14b5b76d77d6b850833d6b1dd83ad1be6158edc1ba1da5d3fa5630ffc0098d4f6c1caa8f1833618fac4f8abce7d4a1e78d36124db69c8d574658c6f7fda4d38ed4ddff9c55c74500ebe29e65e1422e76425fc0ea0cef8845d816057197466b50da92cc0349971dea513d40b7847fafa5950e8acda9a3c3eaa6b7e475c8075debe2183100447d82284516aea192edeec7ea8eba84701ffbe5bd149af2e66cb3844204e3bca83976a088a291fb6c714f5a09f4fd293beaffbdc0ac94361b5673ffc25a4b68e2d31eb0aad388fe1538a69f9edcabb11f3e7de597b8db653cdc65f9399f5a2be642fcb78bbc37e584a8b27904c4fc7dd13058f2cba9b96babda7aade668236494d68a466ef9e9869693dab64d5be3b7ca6fae7e942b955c1356735b1af7aa037b4213d0993e55c979d3bd5be236dfee827341676db5b977ce37b6b44bcbd9bd197a97cca98cb87a30febc9c1ad51ed98560b6b761055d84143f052a686bb3623ebdfa209be84d24f6683484a7594aa22cc705173024f35b8e24977e5fe606197e0d2ec9d145c316b7cedbae3202ecfcd4d6f225fdeeaf865f7c0e8a4a938920f848f436ae530a591a36e7aaa7e43f8ab2005b9f9b734c82145c34567c5a5e8a8dae3100ea8b4e44f0d698450c8df37765b62e433cdd2a842468bcdc4fa639aa9644d89f494d35203d96f5c67cf17baad6cba5c7acd02bef5a560ff5e3b577111b4648edcb0dcef907554fb96b77a9ff67593a3f507becf53b6a01136edc0a684e2b8b4835d66053c8c33fb736d3f1f27d8226fc3a132be073867cc097fc53a85426daebc3756b329598072a352ac8ffa8b6e429a58ef22cf834debde3cea919c75ad52a4162abbe2829b2fe93c7990ac7cfec8eeaa3dfc5cb9ca14bfda2f8dde70d325d9659836f6f001371f59aabff88c74f0f8c49d5ac3c766efea499e2375a330c91385831ea9dcd69d6cc8b4e5a4e563eb0ad319607b172be30ac94fc66589dcbef83af2b884beb6b6ec84e49fd37afab54fc2c6486a7a13c9c3396d3b6512a576cb87599aa7aedc97275766d6a96af293f7deebf73879f3b98b647d60d3d5edc718b0477a5164000799ca31cd8e8f8a9ef7f8cd1bdaef5ce6b1e6ec751f3f463e4b7862f3bef7ff7e3f88fcb469cf35da64bc7a3149ab3edaa730d6b4e6a2db7b6cfbd55b97473c9ec3c1c5923067c08db693c97ae8334f7dc6439576749df139e19d9580ab8c49fbe5b81ed9e6845335fe1c21f16c49f6b02f2450f4ac135a9eaa5e24a3e3f350a6982b5979a93120285dac88e01923060a795d251c1fedb130828582c95ca7340b2e8e105cfd64f63e63f85a955dcc4b12b0482d0994df7ec61b8b09aa4d1b8ceb94b769a2ae12031d16c05cada3a4d0350e8d970ccf716953543a984cdb086c425915858d454880c97505bbb9ac7cfa54055526689033c8241300e11d09283441043b91354d1c0dcb4a869f225c8ba5b290a77629004ba336c8975366002667c99b88b53a4b08ab564733b5d2a3011f944b2259845dcb6ab8956836656e3370f5981203943b343389f2a98cdc96bc1a996648580b7fe837817ac4db31a2d325a869950a32d99446256cb3d8b91c159683bc8c1ff41287ca54530e84082bbafad485c0f179781950a4722c9114485f6b403f3760678e3bbefda309adc41ca562dbcb739654abc6cb05216807e2fe18fbb485977380d8c0282e271c7f1f8c14694484b76241a1b0cf3928ad9e328357ab75fe909957419defc8e0da3469e7720a5e91df7c4857ed50b89d18ffaf6a045e2c950e178adec7a3d690fa23527d3d353d8731857018d7cc909d081cab0370cfcc8bf8f5463a4fa8706a1abdf2c6a7fe8c834a4ccd8b6c869c6bf93c808a43274620b30aff22bbce53a7ff85145779cba220dabd1b597f4515c1664a374a64ae18884b0919668a70b371e24d2ac1a84af7de3b84f804e105177f6a9b914cb5dce45c678c886b3b24e3649cb194c548fba4114f278a56a4310a7cf1cb16e8ecc0b0fb8a2685b30631753b7f87eec8578684a67634119fe8cb334b67b741305aee8762639a212b9baab4032653b1537327eba5b6fed245d17631e748532426c5a4f4646716521dcc72f4c34a38bc87a892650def1bf09991e4c175d0baa1bf6469277f75a2812aacb88534c491f4d3c884a4470f01b805efc160ec17f68b0b0eb9910889a02467232fdb268848a5d6969c91410775fe717c9103cffb9a2bc13b1bbba01abb92ae303abfefc51af169d25d29316e7a12a5bca6827c25df567ef0c20f13a6fd728a32e229f72b42e74470c88c105bec0a12a1810c3d2a3d84b89a8c9bf66cc305f0b0c3fb989c3541daf147d5b02813e7904cc18a5dbb6632af4a34cd42007f09ab4a88c1705958058bbd6f996fe7642a0b45b690317d0e658ea82094d6b8d55722123fc1bd349433ad4850b19a4f6616685767e67bc21333a9f667a6c422087398b3331c075cea9aea6e29e424653d5e7a86766613732343341491726869eda4f97f1982e62c4cf135b1553a0a842b35e8ac23f29a921039bf31833f12ca8c4f02021559e1ab5bc37d247a5078280f02956ba2e2f897b48e18a769908e6b8b15c63b5a780580d02b5f70749a5442c824a0f56cb00378bc0ea2b033fbc9d45d535ecc00f5579a687865702436d3065461a06c8b274561d938d92290a8c0bbc0cc746aeb253e4823f8bd7b6becb5b1f8a5403fcb40efa5f6c34c43620921a416aa769a6ea1ca15c765d0e53c70b0a719f7b47ff783b63701af5a9cfe704c7d99830734c1b1fe00a1d9166b11060baa09501715310b93ead6825ba9998d922ae362092349aa45abb04781a98b25989e8309c40698a2676b49fbdca7775f554d2448358e6a4bf5373892b712b63af3392fa95dea1a8b6f12914ed31f14f79c652eed4db478de7ebd263fe27052509fee10b50f2d053ae77e0f9f21eabd8c0c6eea7767f4e10fde5c2d79b8400bf96b19014b457ec21 +ciphertext: 381ebfb00ef96db47a1c412af508a5509ec6e92bb3eb0bdbc9cd3611ec6b875764aa7dc3aeb515709f9d3b4cfdf6209598233df9a84e13a1dd779cac72eba5c20c5659e8c12677eebd55584cd34bffa6572ef7e83479c271cf5131bb5070085c3e513217bae58724f5e4ff3d5eb3c21d6c46e18fdc7d95ce55c3e2e697a0c99bcd8734628e1a93f73647ffc721a0d325b4cc9ab028e1f3beb2006b46a61632d1b69f26514c0ffc18a5a7443d4719e46a55476511c868427df2cd91d9626ccfdf2b1232aa5782b698d0d5ba501ff0c993b92b263e4cadaf631522a5cc7bd293554598dc42056efe2dccc8499dd574616092461bacfef03a85c4100550514651c5fa70c7c172ad82e3844a7c5c940997ca9e9cc6333a0ef5dd0c60a97b93c6bd56f18f014182b3df3e1127411b58e2a095b8fb4a7ce43fb5ac658135952c16e8c4a2ca78b780b39518dacfdacf9e93ba28972293859644c411e37070c877e6a96dc08875d2bd92d54b60a56951af537f02cc4dec141eb68ed3ef48e4d598a0cc899488cd73d2b676cca349b2c2b70d9931dd672bcc7a15d41db475c058528c5e1f8902752a4840be08a733f277b5ae5829c36fbf55ba91338ff92bf7811f5c660e12d3d3699ad04ad1d54a21174c8c630059acc5f8f46662f0591769efb02a8bb6af57ccd05d53b96b987f2ea676bacacd6fa4be275503a726d6f1eb65438ccb9563ae9bf6dcd313f3b819eaed568ac05192886e7e2b19ee532bd076999ab8e3e489bc596f9904e7c35b0d93614c6afe2081e5d9bf545c711af029107183f1ba308d78c4becec16f49656fc03ec86d8ee25a39d11517be38d270601f888df16a70733ec3230b1cb537db4e5bc13e8b099f7337f9e3e5709ad3fb8ce2445c332b87b9f263d4cedb3f7d30f014905a214ae7223fe1263b99ed02bebc0f4a298b7b1f4722ce622f02a6e75754e567e1ceeec73ef725ed5e7caa497d5e67d133a08db2c42d876599c22e052673ff4ca3a9802dbe7b3e8f69dbc36e713e8caa0765cdd74a3902d5a23dc10a01deab09d05418ac3b30f7c06e594d550843794c4deabf8e805806583dc30f926ec191786c661e66283b01d995adde5e0d2f59fa044abcc55b78c05613d88cccbbbe8ccc19208569493831115000a8c0dc41ce0f3e7818f0d2cde58826ea8c562b84999f6a9c3d914eb109af6c804c16fc0648336e10427800a146339dd6cad05667e98a2ad35ed890095104ff45bd7c51121bc141866671d097006b491b1e6841fd34f0ae5f8298ab62a4dbff7ffaaf67e1fc29656b75aaa1a1949db4d8d3dd4cb2ca2a8fa70ed3a70db112bc261c2b58ae0ca834cb2c358278d5af6c72ff4c64fe0734f6932329d7a6c6a6ac19514401128e45e33f69a8c484ee7bf11c0e729970364490affcb5fd8ce9fae282848b7c36957b033253b8aac9b83bcb9ebd551ba3a1d1511a0847fb7657b2da87fec3a5e0e90e9a0af46d826c5c1a932f0158e5daa18397c51cd42d4e8d5c8571a065ca8568393c6a5f2e +result: fail +shared_secret: + +# Private key too short +private_key: 7e9530cee74463359378b5b6adfe7743777bc4 +ciphertext: 0cefbac2497ae8c8d2baaad5b21399e8d7477dc7cf929a8a3d4119b8446d0f9e11f4ac898bb12bd97e575abbc087c837f54335901c395a29db91d437fa78b3bfc19aca90fd6585250a325f69c6fcc6d8138bd13891cb9001cc65d41af0cfcff617ea111c53e0f51a9e23a190dc5447adb5b2df414d23da142a37f73eb966cdb7f001f02d973e11aed2ac5d1d941a0b1d8d344c575f46b9b075dc96a2c96ec0257b70a312512e8c6a99be2d86633c7e2109da03b2effeb74132b3a4bfc8eac5947c2e730299e4be00b1ace403c13e0b4516d38916a2c2f53d02b736ae384f09aac95d03c1f2557f95109f6d9381f5f4bbbd0de6e5a413c630269d8bb25955c8540db62fa1eba362a6114431d388e21647734b9aefb187fab0a6dbdf77ec78d0a14e9f0397629a219f2ecfca2e1e7f4d29b5d252435d3f3a81d74717de4cd1d535e6d6891b0eddb1df081dae81277b7199fbfae4be7a369cff05bdc9861d28bd27298b3dcc3dd1f223fdc2e72e19bc1244212ee144c3e809c73d3401141d8ebd9eb6de3b5b6408a0b6911d9b96448a36e5ba98cac4d302bcb7a4f1a695bf9004b77de46385be8ecbb403da0cb64dc3175cfc059a32442608189ad4c777edff92e0ea06c1dc2392f728cc1eae193ec744a5fc1905ff07b19897b0693866c6e490c082a0768ba73a8aa9ca0e4d73e687696632d8126cb1de6c7bcd4eba095a01cd6494c8ca064cdd77609a897cefb993bf93445951ffd7c72fa41c6e065b2045344cc21b61082117c0dda9352ff1c3f4bb864e102b3441a40b8e4387aa87cf13ddca9281f147530dc60badb0f8e088dc157e564ae7c03795fd08a2a6401ac05e89ca039261245042c1016332d04a70c7e16eb8b3a21db58159baa028a0fff748bcb48776805b860db1eaea518469c68566bf073fc99f3dce0d09c0c62f6af9f8afb645120018496d3f6e4322b8367f4eedcbe91b6d4cc668386afc2f04b17eb2897e12df103636cb03b74488b87236dd989c7f73dc9a91173b685ee40327119caff4d422be1da25d114ff5c9424061f92a82420abe15f24defed9827d5a80e17f85f8e8a5ec7eae3db1ea52568333494218e501690527f694e5e91d99e0f64ff8a1ec78257fbb3fbf5bb7ad2ea78a21dcea4d92e941310490f7a02be85a1f9aa3006957a176099685238a43514005ddd2d12431e230c86317cc577d2f82f1fb71ba8f0488f126504cbc6dbaee9b435f6509f3d3aaf55bbea285a3e34b026d53d8452bbaedeebeb3e53d2d6558305a0e01dd1fb5d1e4db2df3fb91b315bd829f814bd58b83e2abd349518ea9450af97e6e9fe2bfb7e9b920746a3d3d87756b6446e09fc8d3356d1a13618d2822a2d942bcf0b27fc8b474fb55a1952e93180a31a0cb07f1c1df7e395e952578f85f8303fdd62297aedc9d2c33a4be7188af442c15a7b3f64e28df27049d440281810c983e2147c2aaeb4ed5b3edcc61eac26bc61557788aeb3a9419114b141d77ca638871fdcc4dc7b89ec19fb26d318340931efd867 +result: fail +shared_secret: + +# Private key too short +private_key: c099330493dc8f01847fad306aef182cd674178f588e1ef101b06881e76b38f2793bae89cf8d721f6a2166f1a432b70619c08cb002f768acdc5a628088ae775482482b9143c722b4264d81a0fac41789552508a548a3a50270a4124b25b88dba61a34474fed80fe5550d67f2c06110114f33a2093287e3fb38ed332d49685dce2a7a0922a8d4e84bcb5128747794593a96b60c0a0e57244ed5c317f799034bad47b4b5bdf57c92553a68389fc41210182604a6352fca425aee183c631108bc9ab3e97a2bae33b6f520bb2b7624b7e1c7710354f57203264929a83b41ff839c58018e61041bf2e45278ea64218cb817a4a7ea9a4c740c4209b0a3e0657de0887b2fa37f30a46914db917a7447c1a820bdb2a064a59aefc073cedb437c9039c9a6cf49b864dc0c853d6a1f53e728f895b1604a25c4941fa667267960277e4171c4c32182ab968a307d3147872e4938c257bdbf39cd30e605c318a9869677f7a887e91c61b9645494f95510f8928abbb4f61aa964f8ce1844915361071b0561e815a3cf033d9005cfdacbafec630e61106b55818639a1c1b1560942ab859a3970dc2a3a14cc3a51d7b401100ee19b084a09 +ciphertext: d3c7fd2477986daedd3f2d29fa7cfe526facb195cd922d0def5a0f7702f14c3602779afaf1d9424a88e936d5ce6004a0261ecfda7f5ac7aea76d3e11257572c7c0fb8221144b52c6e5ecafbb82522f66bcf3ded8822f5653bc338d85ce5e92529c2ff8cd5bc0347209b3960aee10797b640dee8613e1eeb1959839e7b884cf82d75683d175c647bf59262329348454977fc0fdd47f1418b805145ee1e820230522c3c220e655d8fab5a46ff318913182447f7593ef61f2f8cd2c2a5d2e70c5c065f43704655cf898a35d7fd273b0f118fb127214df654e46bba40182b72eeec210485286c22f779c5a220db02e2ddc70af83f06e005318c050eab1ad703b8800afa1b9ee2553c82166f4b849602ccbada9ac016458d03c867655cbb46bad42f66aac96c5ce5f37a9bcfc16dd08d74b7454adff3fae1ffc08a4f7e05ec4d2290ecf8523f33b728951c0e6e9dfb3d6931baee1907a32fe28cf0fa49b8c19f290d9b6e0e026e18d978410344957ebfdee60c827bf24ec678fff22298d707db9262df9da20fec00bfa75e9f8a9581dbce08ab1a431b7a3ef62af40f40ad9b0ba1aefd333632dcfeb56de808a276cf0f4e42386a4fb9c6f075dd68aecad812003f9b032d49ba4f6907a2e3ede7a9b0e803b390f3ed811e1f13783b9edd1d5b4b846b77a7f91f505a8f2977aa28f84d3ded43bc17a2989c41cdda34109042ffb288b4c49823f511b40884ddda5bb52b60af80aa2ac9c61bf224026dbf16d8fc67f6fdd472c8629fe6e1b2f6d0fc0285e947babd3c041ec569ad99f740e492e146300bfd243a25693f6e2025012e5fb6b7ec64e209a657c22ae3b54319360343a09b5055df2a06d29b62b4bccb78ab8399b4a7f5168909340a33b753e12399e674774ff5220ff7829646d982ac7c51dea40ec30a2b0b2e1715df3fb647afcb0a1f321b1b81d0ef7485716a664047a7730ca8e6fc70d082dd7abe0da67be322aa0a7c51684447242ba9eeb2c6df4241a25bfc8e2dbbef0efbd3313741627dbaf5105ed3f7ec62612a4626fa34982f04af64c1f9879b16a6bc4b8ae9dc3cacb2b6ff703b0a9269b5795243041205f230d0fac7b8905e839eb2386c69538eda4450b4cfe65d9db2e55100235c018ddd1f8f00bbf709b21f899b2a70d6e29b80d06cc0a5ffbd0a2ff62b35fd2401b13be4a59b66999086fc285d5aebadb76dbc9b6e101c917f3414dd311ae9341e6246d73f7c2db1e47b15419eb18dd9317580e17e5d419c6cb51d451b1b576842e10d7677dd35dcda2d5309fba98416696e0c63925189132e258bca588ab6fcc28dfc800eb3bfcf57b9099090979b27b0fb64fd25a15331850b1165299f9c10f39c342776a23bfb53c180ccb04c14c05b58ba16ddf18c029307451dfd8b34c0a6b73c70c629f5d175718cf17ed1f807a34da9fe8dd04c9d8cfaf1c7919542369652cd801fc127d2507fc156a49d4cb5671964d15bb6bc44e342a2aa750d086c99b856b966bfae44410e8ddea513e7c92918a83315f654028 +result: fail +shared_secret: + +# Private key too short +private_key: 39196fe2f9c1f9958a2a969d39b9429b49d1b04341caa7d1103e5e50a518e930427258655d8959a1c1abb34e931eda1462aa3b3f422f952239d76efd1703ebd6705052273dc329 +ciphertext: 3db6e85b424d50198641c791d93d8b85b16514913e02fb99d4d48381c02fcecee62637c0b542aad39a06224fda7a0f55a3f7a2c97a4facf95feebb8f959da200cd2b48b670afadd67fc8984ff7548a86baf80d94fc901f957327b1fbbe366be489954c8de2a6ba3f381f99bc2ab3fe7b2d4a34eadc8cf9d158364ed80d5e4fe75cc6862c0b21c5d5392e61c1394d4e968a5d64f0eab08e810bd693ffc2d6a22eeaf4631adcb4917db92b8976f0ec03797397cf5346f631f591f05a624f32a7e366fc11b59e1f5b4f3fa633232e8b5d6cf85c9603ec5beb3bdd81a00d36bc5e2d75c17341c2e372eda079a66b21d3d83e35713c722d8845f0f289b5b903bd17b4adad3c852c0edee236d9f9eb5e74df9146bab9965ba628676d903528ce5c5249621c2d3571f7d01bd5099a0b11c121bdeb1c35c83420945974e3f102c09f4f2c5bbbb95ad4e662a6befb0fc7f13e2386c7450561f5bc7d824749c3335523b4439c3496a9ca022366fd94821b7a4907679ef236f06114304dad9ef38f769ed5094754ce1b5368388e2ec2f00994b9bb2452e13c6fe6beccccdfc37cb7b0a201114e0253242059ae800dde78212dc8535e268e1e869199643606371ccd060419b2a10cf2eca8645e97a9d32dd4d35c253c01a9de987b294d417b8a0b12c536ad70bd4720bc867846ff90447531db3541e86aabbb2dafb84bec8347dcdf466991b0269c319ab82fea3ae215eb255df41ef87316d22e2d843b0bd2284356232a116f5f424faee0201c7841049847775d76db3bc138ecc47ef1125d3ec21e56a0a966c23b632a03f1da52bd7136f5c3f512dfa2e9bcf91139d61d6d75825c6db7813fcebecb39da5cec1f8db73efe1ed2719aebbd8e2bfad3a4b2f63e9047e9529f565b50933589d491a25fd50ab756017e8d9aae0471c1bbcf669e0ffbd071186f2b85883771917a0748290ed17542eaee27dabfa547ae55437c0e85cf099a4f2660403757b0c8e2fe28614aab3f1d65e1b9907d6c1bdeeec2bc0a293973587589e0e353082f07648f569749063b1294b102bec8a6f9cd8c27628cef4c26f0485c06dcc059507933ecec15204649845f054b83450416b63ab3d8498b32b3eb50e7ff6cb4926bd74b6d0d6635721d72251bf4992b6a6b7e808cf55c6a69f9ada3af5effafc5f024062d6e92c4efa008d46903e643949178ca836bd5bc6fadf49a9110f16038c13da9a901ebf6703f8b06cfa2d648282e96581a52ccc78b3000b75f241622845322e32c2e6a08e54fb756bfc583e3e197e72d8a64781356dd3b928297af6e90ca7272960e6fe51c057e8369bd8cf415ad898551b688b6feed04d85448ff7ade72b5f3d31285c3aeeed57f3baa62d7620313286ae05f26d9c07c080e514c289767787ea53f105c32ef6c97400ca4fd76f9e3438047e0f261a8c17032e3c01f5ccb2bd1670679125c33b9a26e22af9a4d7cc8e12a4b9a4d3dd9025df59a96869a03f71b3434c418cfb57579cbde2a7a43e8271adac4db62b091573361d2 +result: fail +shared_secret: + +# Private key too short +private_key: 3cac6e4a97fdb50c90d996e6078eadb32f864b802d8b6047e37d029505946419c9302b50147c7c49ab00ac5e9b3bc6c2ab77111b1271387169d7453a956b40a74d48a280eea91d84a2aa22a42ae8c055b567857787362181b40c9449b6158677d3c53729c8bf8b2b15e418f589b0f97b5a7e76740748165585b58877ba6f332f5a956e61b84143bb89870883bd7c4d2a05517d74c410e37c9f63b04fa66dfd318750974c06821fbcfca4017a568338047760a1e1e778ab714fc7539a7b1165f43b889f7c60823151c407c8e1fc8ab8aa8c226983521b9c1739a0df7850023268eda729ad131ef0b8a0c821c81c266a7686480cab2bf95666535cc247479de7f57275327a92e2371a3633c7d84678b7b962b9c6785751253b1200c7cdb5aa810d1c06a2735632fc3a5f964882432d8cfb17186855f1514a72b09abf3a45d505261b4741ea7842971646c96c05c9b5b59d765a4b233825a5217984137991990082274c4b9d6949b67d1a584591cb08594cfad9a1d7077037a3641d6994057c1336f3bed24a4f2a2c59e0a406c7aaa032d22857226791138f848a065d0b5f8feb412815a58af078600a8d8fcac57e9a56354c7079e04461d83e0d439dd0d59525e8845696bf44c50c0606cb1c2c2e7372ad28828efb905ad42a376ff9051536aa37a1b79ee7283e3712fe629ddd1bcbc43005dbb42f13dc99676c58505153e1ec2c76127697e655348213775c06d69444037a895c04530352991b6095fc8cc8dbd2afd329914418aaab4acf206c13b1e76dbf672051e493af149288516eff760db0b21c6214b30c452a1670ab8e0981ae1352f0280f3618260416735b78c33e72c9950750d42c6f964937d9c832258433e84178e7759bcc5c498579ca4aaa6f83e3c71833681b356cd1b3ce39fa1a914909e2d82e1a8ca10d5535d77120269738ba693c532c20a461c0adfc3f462575873ca7b91582d6d036687369a3f287ae4238072b12b10baab73c7440a1c37ea143afbb8dc7ab84d2bc5d0f114a04141c3a0943e75c10119085b0a02dc2b2793e255a9b83beaf7688e1276f19a4b2ad3bb71d71735aa85a932a5eb0a340bfc2cee3d43a8d38516d24ce38660a68952573177e24221dc2784535cc32a04bb208f1b272ec053a9bc42de662638b837ce557ca3ab763aaa69d72a889b4012057bc437673217931e828b249c9bcb2cca192bc62b9551d32437967681337c79e5ab0396700caecabc11cd46210212e3c495b36677dc09676a1236eb8cab37689a030238f3b4c86b2eb1a184796925b0fa1d366bf60c100a84c46244f99410b259291ea7192c43a740d1747c78b6569e7a830e91ff6605e0c1c79400bbdd3b5cd424903cda7199324b520d21d1989a8db008be120376d966c152a405cec5801396772c4c3067891e4307903d01e0d290a1449c07081a528b576f0b4256e1c5e8e8ba754438832491fe0ebac974896275633c00c6132e61e37fa5aaab240900886a10b8dbbb299abc61e5e5b56068199ad694ee3bc85c84912458bc5f7e8442a0b73d1cb5aadf367745297d501849886b0667cb3fd2840ec5a31d696cb5776bf023c04905b4a8ddc33bfb541597b1e5c88193d6c22be40a799a67863eb0f2a66a54ff47886e5c3d3ca2919143a8eac7096910a65 +ciphertext: a25775f00ca72592c892c841d8d7aa3846e96f80d623995dd0be7b0a9483f9323b444b6ab12bfe33543a231904e70ef09326d72f2f1638f320eae3a83b876b3a0b7c3c484c75df06b71c956c56350e2842008adb54bee17c6677522518c97bc1f93ad5369c24227ea1f4208244bee479e04e4885ee1769dca10e337d32daa43962c564af439c12cd5e3abdb069c300c753c7cab39fa268d3191e00b6302df407e9f5992207d7666c2892555f2d404b0c2a6f0458ea7f3c46511d96a13db996b247876548f3319756655249cf8436d5ddbdb301ec158a428d5fd5faac464dcbebaf2416994d6396add4794f213fd176a25b20b879b63e9f139a339be75a296ac0c04adfd5a40fa62b7756766d5c51cad04f9948dbfff4eb2a866385e064e92ddbeb406763664e82ad07184b7e83b8de31c1f47bb0b6795b517375574f61e4fc88ab7c99aa6e1392e0041e8fa39f09c411869c0f576a14de58b5da1f96a76d01f927579b461f94ec4e37def35b60e11beddaa6886d5aa3fe8798a722fc4ece0d4ba84bfdbce92c10b20943c9614399d4e7c85227ad209e2fa4e113cf6816d655b0270bbe5edba9187e3144b368876f8b892d223e71f13bed8d1ffbab194819cd0cf7f633ac118ca328b452fbf34177d09746375dfede185f906338bb6fa8db74116a6ccc5d51798d956698efb756babdc448648491acb2b0728f72982576cba7bfb60aa28ac49506a0a54779b138e30d487cf562a4cf2063497534d8bd54e55cca0b4897da50ac5a8521bab25223c81dafb3d88efa61ca6af06ea27074a4d368a462173d04703bf383a6d398611d83fd09a07641fd9fe56544017edbe36273b1f67ecc5df4c5810bc8dc237a7d473cf106cfab6ae60e12a8115baa19e9b55c30505e1dfd3946bf2af27d618aa2f66f8366c7e45345f570697c36d8e9a3680110127bf5e3a51c109672d6545eaa61652776494d805baa610321fdaaf2a77c27352a271fc32ddaef300b3dc39971a129a2d4e453e2a021439245a67ae4c2e8015d8a2ba916f500591cc93fcfad2b2bd7334f441dd67e935781d83586ffd8ab3464c224ecab396885cbd11c0bc7dd1bd0972e89c6e3251a8ee7d2937286036029e56767c8718853d2f3527e3c6522c1cf6e6435dd810c0899acb4c54661f06be0a8aa01d0f1d9d5dd68d26d14018c953be9fb2d9eabacc3b8efee87cc781b21823719355135d54e48e75a314615e9b619e11e8778ec21dd8b7a6ef2a85454dbf11d1a122669064c8bef1c135eb8cce95b927cd4ce09a9c5da5308f7c2b87e970485333698cdbd3c66e9950634f4553234c677d219b8e957c8c2023ca9177df212535440141b60dfdafba45b7004061492d8a3f1d8cefce286a77d98a6c0acb1b07c1e2d69fbcaeb8c8baa5c63978a7b815783fa33c73f8fd910c552d2f71cc3f0237ca22b05c83dc963b04e7dd28d78f92a6bb9d3607d43609d39040229767b00e55b52bad50799b8cd32da2ed2de13c02650c5de9f1f1c360e18a5d40a0e264b5455 +result: fail +shared_secret: + +# Private key too short +private_key: 55f7b55660aba5dcb8578a4771010ce258a27ee41a28664b8800cc25a85982b60fa468bdf567c55835a98237b8e4261fcdf61c7c82bcb014476f3005f7306fed9387f0b9b8a5f06afc1c048c83ce455c4987a093870a0a20f05b7c609743627bdab05bcf12870e362ffa690aa61347cd396c3ba205b33bc12b5470d6564b9277c78cab7b8d2235b72928b16abb3a044ca4541cf1d95e1c214db52a2ced7c703b8787f6d91ccc63ae8fb22e03bba98eac637ad33ace0a5461aa81e6007de3504fafda02a06211125a0d32cbc3fb03c3381cc8c2f074800c6c9be1733b4a0e55827cb752519eb04298e3367ea3cc5eca1745d0bdf95943e0fbafa6f60b2be15a37bb3499b41f890102e4832ceb2c918679489aa7792380693ed535c28713c2106e55897126a376d3782cb6800e00f499a6acab15720845267d0cd128ea0027a886cce28489e314633ce130c0c89ad5f0b88a7ca9b6067f0353c5333a1f5da234e8a89fde88c18464a18b1260ab1183bcf0bd83ec69cf48bee677b02ad9330cc90c0609c1599b3829047bb1cba14f708985b47c71e57f91471a05d656c850c8e53b4b32b0cbcceb6a6cb1c9216874f5881bd2da9d23c113ed686969d13be6dc3d66d04909f1526b929dd25caf90d6193a6c9a841bb774c7b01a053e219a24b76295c11ba48721c35b160747cc92d4f4141099a550eb91f3803c688b95cb682da4d64fa910aa045c6637a7141ab2681d573b353c0567d96e5d53857a567eaa8b0991413bc54364d1acc1065944d2dbaa5188ca86f3878a9b7dbdd2af0a958ba04c432cf57836a2002051cab832573a0823cde77a81c7bfe2a558d0402634a65a1dd55bee5479ac313f27fb8f30690767a59ca699c5e44a2ffe160aa7179d6ccca5300118e0a1107ba2ceffec26e8b29996f7baa1a3941f7b9441e3885c402f5d361c5fec1e62385283c134e824cd50471b5963c679c04f45513dffe95152dc9a8e4c994a7365543bbe8c81856c072733306693985f319c7b5e8b3bafd603f4e419f7c624a5f6c2a6ec26bda1c64f1baec9849a959b6252ab829065be2fa43a5652cd6b21c75c91b6e78b2349886cec56b1792498d7614338db838242792490211857a53ab58634f87c68a374ae367cb75c13f9ca0d9c719e5b839fa89b32d9315633f570ce97288210af279a4cf826ae2359b0f567429f602b12387c0fe3af6145715fc70343c356bfc807ac48490e372176953e7eb845e16943125b174514ca2d151bc0cb78ea837f614b9c68b80862c508395b2dd92a44c306cdcf861d1d235be8d6ca0c914ec9f20f791b699cab28bfe2b2d6918fad717e1b8883b6748f90746026e03932c97ca4b91294d78a68013570ca0477c39217131450d858bf193034d3a2df08053848205c0595fcb87b3771802ef2cb7d747623fc7d4b30034df068af0a9e75044ef568b799816c7229962fb8c7dfc251386955b64245efa76232e270c7a34597d1aa6cbc8df11a20ad1c2d01f6395325c1f641baff1c2c1f041a2684710ad2011c585682656f651186550778d6f36bb0d2b71e4651eed556c3ac3375778e874cb6e9888537325032591063cc478ddbbc0bd0b8af739391e4c143550e604803438c87b0931d1eb5bd0f83c08775056ec564f3d174b12abb19f54050451e704222190904e1da6118cb165ff5a62b079a962743777c589513773a061f4b134410a67c40043183f7193d561107 +ciphertext: 2b8b1b6e479d5cd0c29faf7be645a667e16ccd0ad20031a3f5dc81abc4e79148f9a40277dab716767a200dd4faf573365fc79ed22bc291a57feee14ba5844c6d11beec87caeaa3c2df683747919dbf7bb9a22383a0087c3889d5febb78b60eb3b381525180229944245ed333099290516074e5c5f515dd74b2fb3dff816fbc7eafe8443d37e0d501e675883aa38979fde4ddbdbf7dc7de7966a7c4e7987c30636e3ac51184a4afffa45786c3388854ff1208a86f6a6af8c7fc094668f9f669e1efa91d235659f923ac51f3c7bcc18d2e15ef1a5e5d98617f98923304a7644bd5bdab25791ef29590e9b3a63c1731cdc0790af1fbfb74b0572b22d7116c97bc180606b7e80f40c58da3d3cc405496c180b9452d83618272ab79e38ab338ba036abd9560053fc58f2b1d30706bfcc5512a2006cb0476436a7a5d557406255b129fca3f734c964b8339a3d07f3f2d9ce96da61f54501b05bf8b311060fabd73b15c1a572fccb9931b917085080d781a94c0a9b2dfc612d077640ae4ae8353b2b60898ccbccfe6f6de2f73a990b39f5935168dc0889cad5be488f3796cd4a9f235da617e35a5bd0e0b67c5b51c485c29192f6ba063c6c66b5248ad7d260438f508d812767aedbff2d06ac216ec7d494356089e5342d07aa15314d2f1d6073c234c0c49a3c2dbcde6b02d59aa9faad95ada3f3b3d13749b842e62d5036468151415057aa472330a346ed3d29848da754d2128267dabf8f5e4c54ce3f5121d3bb721b66064e60fa6d85bbfa3bfea4dc027b9a046b5c4da0a4b14e655a33067115a90b27fb0b0126dcd41e12860f4e92e4b7ececaa91a17e3df0c8eb30d80b75c651e23ee1b9362acf185016c54a3bfefa659af29eb3815c8764b0f5137fe71af10c321bed49d4a228bf14f65c97c6af7178813c4373c9e0d4b1d26610a36ba7cc3fe72b233891213688a6ab61b4ae2762f29bf40d1530a6391d99dee367e30c05351e75eafa181b1a518c038202d3cdc6189982bec6e56bf7bcdd998b1ee2e02c5523aa022c5b70b0dfe78986c9ae542124dc5acba05315b4ef81598c28d1575aceb6415fdaaa852ff38ab6ab9e357f9da348b6d0de6b008ea0af211212a7fe9ed4abafac5863e982f1a604c75f9c01350f7ded29496a7526fee9a7987562d2025c937b195192b147a510564fa359d2ec846fd7673dd288300436be16f487c977553c699cb038e589f936dabf882c123fcad7d9faaf6f6821b5fcd609a9e44db343f54a367c322381a6f56af81f9c74d5ddeb7fde45560485c37dfb5ffe6a12c6f792f4d083d0535afcac1c19f2d3399629f57f2bddcf8dcbf209e3c9269a68dece4b0d1c7140ee5e5437e5b36edc88d4fa946fa8ac194fddd74ee7903df9d890b51af955a924d9c472fce38584492dfe2391559c553f775cec8e4f7995fe894d5f71d1c7abd7a57b3789371e8659d2c9bdc78c99ee3c9c6d4056d00b120d254c3aa8faf7c2302a80bb50ff5f250381c28d211de8db3417e37b5d2940f080485934088 +result: fail +shared_secret: + +# Private key too short +private_key: 0c08e048f94462268719d72409c1a54527367b8bc408e13580e4638d0fe319ba300212e7236bfc0d6ca26b37f37b0b65abfc229cbfe6be23a20bda3c8503f6448c44a0d0d5cf9b440a2b5098f8acc36d45a59908bd659430f1f67eba624b9e57c7143b74685bbb40aac7c5617ec7116463d959eb24cf51b4abe390ca1f6ab7646130f673179b377fdcfa1733389145995c971243458680a961c538839416f4b6a0e5ad639922b0362eeec3b01563117872b6804c23e8eb3c2364b69cc7468bb68fb1b728431c23194ab80e16bc7be20eff257f1d04a775497abcb14608e0a4a62cbcfb47ba0087 +ciphertext: 44b1862b852e3dbcabcc3d90b7d40b244eaac4237c79a784621c35ac60328df6dc184fb0b1865b3d29954f7da28d7415d52fda13e7bc12d162726cc5c40efff6ade83cb520457193cdc994521b8a2749e9c37cde2c7fbe2e0a387937ca6d60b03991dd0ba27113356c227dacc2fa2a1d4e3a2fe7f2cd1968187373dfbf9c56bff3414182e01d73481f9b5138bb6160f1c13e5a68049d12e3515f4e5c905581e95d8773695d7079aae3dc0181a21e676c37d91fe2cf91f5f8877a929519ff2be45b6d29fceb10af689bdede17610f74985b5886269aceb81e2a59d84b8eb5be0881a7920ac20fe6a149c2855db4f3df0417e950cbb82d2d92034fc2346a3b4caedfc422a2f62e716283e164b352618d4cd81f4fba0948f1a7e544aada3aea65486b385a05a46373d904337574d0c29a6056b04ee92fa7202c6cda7b103f32f1d14d8c18c3cd10d3b4cefa9e94eb61be3184b736a01218bdc4fc23bba91b516a214e414fae96a42c845e7fbc85dba2bfb39d08773595a719ed284f8c729fcc7d6b08a1f4af7e55cfb3faad8637e8356f9bb44af87ff79ff2e1b2fb62981e502229a2dfa277776654980bd09c7b68ae8ff0b06eff3f087b84a0eea270abbad8ca0e05eabc1c19c36e01e5c7dfde21bc601b7e49ba0ad31767f358376715973c7a7b3242102d22bf6af648504cda61e50b741df9699440de8c149b29a117dd3829523698064e315eb02908f167c3b9d969e2d7ffa122f2da789600f1c5096bedeacfde724a5aa8c81377d5545b2e07b349c18900e6eb50e36e8c607f50358c95ea41fc8dc5e91968c83d2f4d233271f3511c0a593592944628eeb686ffa3b6cd2e5af1518519e96ff3426f1d4e7fe9f9c71239177712e29a42d8de7ec5584a8ac09e0ca2dc39e00d253de5ac39ec339ffa679a5c0079c861a7e2bc1ca3b06d9d4cd3b373062339c46e9f454736361b1a6fd4831adee6a467162c1205b34cca796c1f2def06b9c92f6bf3fb51de09e80d1d9941f80cbe6eeb2af15c4d17968fc028a4d4bc53c557312fb06f170e34fd4e13b66202272965e34d4ff5e063824bb3b03ac6dbde9fcfc7043b8d20a86fc55feb3ae3e6acfaeeb10c0cf4cec207253438918ac6cf5244d729fc2c56699d40db6412786df3a1e7367b3fb056ecf4454a75a90b3d5f51717008dd02c45c4ecd91ffe1786c09d26412af4322d765b93959cb064c2e163895cbfb3006970c82f71a168377085b3754e869be34ad8cec6abb81b76aafd59351d1977586a83b6af84032370a4a39ce4e6b0a4eef242c6c1241408d9679d27beea68c5a93982513122f8ba0ce00c9f27a37415828974953b9c720d86b2cd1bab636f8f0a9bb7ba4c36cffc1f4f8b938f571ef6b9520cf59e2a3a4138d0697faf11689fc50126bc172b0a8932a950e10794432ca3979529cdb77a4732a158fdc958c72dcc34e2283d602a88ee0d44173f5f920fe5e49c5fb0355126dba3f8c5c1e492dc4bb3d3585526a67c47e20135ad90a29b114fa68e5b8f6014c +result: fail +shared_secret: + +# Private key too short +private_key: 25aec01394caa332d7664e6f5c17404b2e2de451d8842b86d5044f7cbcda696a73dc84ca58976175100a7684a7175b931270a582b9d8cb625b6b1cf644809110ccb4381931c368e69acaeac5be1209ae9cc9a074d10a564ab1cf14a9ab480baca64fa6503426b5ae5c340889349fb3a69a15422791c5500b55af7cfa17d8eac6e047b5116bb6e79a630d3b4ad3b5629659c38d45b34db6616af83ba557462c3967b72750db9ab64474a72d00687edb557dc00f4ed3182023ace6e6697d1638401c80314aab00b2b38983190da87b36f75919f46734cbc59f08052d393160f04ca0aa5ac2721350f2046bb0a1ab5623cf891b041c30fae36a9fdbacde3508f5a8cc4765b37076c7c9b577307457ba8a5e48375b03eb78e79b22d56c0490392b5e882ec5e00cb6042436056a880474f1da8a6e82adf1186b6366a9bb1083a8e675a0864e5aa641052357ebaa38ee85683d7c1eb3a7ca47d91f69d55d4a053d2f793e57da793f9527b589a2cf32a734c14705f57a98d618d2d29d0a1978e3154a936151fd73c7789468d999a17fc548dc9c7b7d2832b2596793106577d5afd4645adf2872dcb06b3c4016f038c876ec4765b37eb35492ef9a2cf3747d245737d90046c7951ad5934319317d41f7c21750cee62a34d28b6fe754742a1c833174449694a024fa7e79333171cb8ea041c660755bd821742dea4ffc76cf73224edfc786f66a5a3c1b8269c454b7ca40fbd00556c327b31407ca55294b98a1fb2c96abd06c73776c647422b4b27debc387251022883263dc5479459776e30c846ccc4706999789200307c82ba79b7809a42fdd34733bb5bb8d298b3bbc2813e07e5ef1238b7a15a4372ffcc85bd58869fbf3cf65a685e7f07cc4025745b568bd0a301e48a74fc07396c24d54f2bb061904fa40ae56c7749f63b64180510d1c2490c09c69d124a6db28c393313b7a5bdad593a981687e885043c99f93545c90d6b819fc5f9fc53ce341194bcc230721b5a5f27d27237d61d9b2c4e328436912305b5b1990611cdc2d07785705e02513dba593e43b17713de7ec659d20ccc5d52b679310d2129e25758b24781cdac7c116a118be31a12f29a2e8905b5f0ccf2fba760df24b6b5577a2585c1a67c6bcb8aec121b579e932925b7fb26a04a7a99b47030f1c1382c456a945d33f9479bac0b882b7581e87a336c650c08b74cde75794e0a52335e828f51c4a46738d0e17357d5643d9e33b5e4196f75c144b22a8edc78ac0722ee50a1bc6e47bf134ba4de043bcd6ce73e8039ee96fd18c8959e8460c726f5ecca5eea87d23e11691b60a75d52bed03003d242cfc49482ae8c2c7d406d5a495b00636dd888ceb384ce04264177350f7a1a1cc668929174614655b22f26139b5c1ece66f8d62baf123ab5e0918261a8cd6e2c3406798b4e386dceaa31d5518c4fbb8e4a6922e1ab15349992ab40deee75071447225c0cd020271e8c56895968aac55506151b6a4716d10f80c1184c69b7667fcf6cbe682507c35ce5354ca0449cdfb6086c7c898183422ad742907e935caa164031a92395cb0b66438f6aa7f54518039ec822aa120b58c9a45ac70027331ddf49dda428eb92711151c1a712b7f128419fa7076f6a12bf7e79c54e91d81a3894526c913cc5379f2942939c77c517390dc7580f242adf7526d90163e20babacabd958c00194241ac45b29030696bbb6e5be80f9b90ba1d3ca86219a72f4bcbe56192294a6f6bbb8e3b43b0efc93f64e7091735ae81d04501283be856c9a62495e0b753ddc522c2886542947f0ca4b8f14284de31a304d47213cb6b1a53aa634b1d23d4cb2970365b0a88a40c57d61617c0955d52a04d70fb0201a02b2893937912bb9482a0fe780a380929ab0664a2d108673246acd366e0184d8cf72181379ae4b677d348be3f6632fb96abdab34263db15aa078231a75c22f32b9f3319ad97a7e76aabb0a7b9d781cf6d850a5d28a1ea774877da9785ba7c90c38bc19227f1d803957b9f2e784552d64cb1040f243996dcec2c3db645ec078e6e3872f8cb23b032be6926156773064f749018292b98029a22207c0e698dfa4b56a22a +ciphertext: b3605851d498a5771765a858120b33eba379f672f11f0cf974270227c5e109b840dc9bde9d2be215884dded745e2573bafc8b19b8f498cf3f1521692995cd2517da90d903913ffaac619c3f5ae07765def1d1f065060fed15731f3b4ee96c1b85157d07c1d57d68b9430b0beac8970399c49035a83ab85d1562da3803d9d9dada3130dc5ebf7ae8b70fa12f69b3fa39433dee289f100b6dc5570d76dd2100a7859eb7ebec5b234bcaca4ecc033c274a6df20759573dbb12d67dcc9205c8ed53455663d43d7033f1c879b82327ce9971a9d83d2ead8b2b89a1dad51048c383625c93f5398800376ce678f829677b8290c673209f0d6297458f95a6bf8a1ddbcbc1eb259139d25aa98282c083c6adeb46871b80a957ccd9de80c3f1272022829fa9a9159ddaa04855b99957e30207141d06e93cae7bd6b5863ca541ccfe6845673fc61fcecabc2b65089ad6881b6b6e1e31ceca6a428f8d053669c6c29f54b86eedd4ec21004b67cf95185b56b42e2fe1ba8f7ef1262d908fee8c8a11d2df0e2a26863c181f0e4b9a31f862f602d908ce45e7aad4a44f9829980e93763cf6b37faa8a4e351aa9b1bb88f3299eda9587f3b870887daa86e7bf57a2d7a6b38673b954bfc501badb0eb0550a0fcc7132479a9de1e961d5e06eaf82cd074ba2f36a837e7e9f9e4194e207d1cef74ee3d20764c7a0c2f7beca779eca04693411ef59ad781766c7b1bf432863baa9bc6cd352bce1ca3035cbd795b55c1de3449c9fc21b3c6cb81bc31ae76cfeee5d2465d0f608d19ab0a514ca0f7eac74027a948c976cebeee367afec95e282f82cf946b608b3a3e1a370ff991d9d3e71840ca5f503f31d1d0167a8fb7d2150b2339e0a33a1e0b09ad69c06ce1b0873da797d51773162cf676f9d9bc4cc87c7ba1bbab7a7cf1bb4bd04c2360fd37af3dd2b107386096db91a9b0b8e293c2ceb5f46af97924ddf6d32d3fbc868be2d33b46982c38105fb1be39b7b545fe9c389535bcd479db9f1e4758723303bdcf58276c247b3ff7fb4a7f364d63ab5940862b26831cf144f1a6552ff166be714387246486a3537c560c97c759aff3a675be06d75e1b90d03db5565b8ff9121fcf32da0cf8b382b72c16cb1de8b956695528cbb87e52a26d72119dcc28af49b530739cb62dfcc6a5bb9f8f37472dff3cac7ad579a48ee86bf46e53ecfc920666d6596f56610fb803f8be6a90b61d5526fd476d0a12129bff40418e7d4d28a585e4cbfcde7cef1d6b0b56fb36e0158e9d3ace9c622d978915d6ca5947b2df22213878a6c1151e20fb5a9f1ba1c640d87ae5a3c088798f1323f767d5fe43387852c53d8f22603bc305ba5bee7247e2e1891de9ae8c12e793e6f811038d8abe92538ab3f2e1dbbb7d3e4ed6704b1309b74773d2e8601538c785b3bf37fd714df13cbc4b6908c536a22afb164400a909333bf4db492ed69802980c5bf84306e3a6611a3f65d8e1f90db7fc1cf2077cc9aba2e953465cfeed83505a4f8f1ab2c1100d2a505c282a2da126d91d +result: fail +shared_secret: + +# Private key too short +private_key: 3f7f29ce488c5bf877baf95076f6b00dfb4a1c6d5924caa7c5191a8f06783e05258486c236460c8d14a67d2aa8261919bcda710ff0984264e6947f43afeab6bb1ca265fd15178fd9cfd12074283c98e6ecaa551066178b4edee63fa4e3b6574992bb955a71c9738b909bf9ec6699f26162e1cda6884d45e6066720a9b00a5282d11908c472ed602199071400c78b46b66d214432cfc60a691b3d98329339e1369a4a7f04ccb25a238f0ff16117452746d50eb9f747e6684f74851d0aa6228db106c4a83580c4c2fcc29ad90c2d1f3bc768b9ad79e150daf141edd60d66366725796228e2546ed71c2f541b45401040688863205372818c7c23c9591b697c2683f8784b78e5a8bf284873c81e8977032db9629c428a787bcbb5504961a705bc1859b81422fda5141ed80d2b0257ad065da3379fa90c0c76daa465762933b822f7349182461a58833bd6782432210df4f596a2592d8930c46d37031a477f849a5ef9353ba7b1bc7c28b8c8430e0897b153d79fe992190f27644fdb8ad729cac7b64814d7974d18c3990748435abac6034c0d582425334fd4d47f57f21bd0c5a06f85658bd89fc0f70144347865a4507b7c5e7908aaeec19e8275936cc22756c30959c400d291a102f996da72ad86f245b1cb013a2c01905232476980ead340ab78488a558572712feac612b271216369ab3433c3bc7294b3506f9b0c0f8c72cc0ba2448d67b63cf7643fb35e5ec36001e88da945294879c0eeb95471940541d6bb7d7a0392cca878e011f45b191954131a4a560bd8b352949cca90b6b5b776021390b00c5a90168fa656326ebc31beaa8562c75330f76e7c70b41ee59ede630eca9b7dd99aa02ceb718408488eb2c262736925042981c203b0756d61f5c208288eb0a148a2395465c234004dcdc334a94dc4327cb6a726089fa0d140d163a15d179632a484ef2018dbc345802c16cca5a9fc2a018cc42832a5b7f060529c657d398c79ffe025b2f3b774985d7ceab4192321e4c0224a52b310380535ca59fd67b46264813d53c750e22e1c096cf323ba173c60c70037341153efdc9ea42398a7731e119b936caca946686f5ac4604b9b4c94f42228b9a852cb4fb554718ec7906dbc02e0238517f2647180738a018002ac2cbd45167196caff3679510a5bef8705937c3826293ebe3767e8ecadb9313b104bc52239a4aaab1b68851aaeb5865e3284e03bc824613211327b20b7ce07bc997c94014d16b75f4b023c228f39eac6c72c2dfd14415c8b04db4890809c695c504ba3097bb4854a4f922cc2c7b83383bd71b38c7d0c5ab2d8a9303698cf750d4e145a9e1ba2c3602a68f33212387c354524f8f3a4a375af28403d30eb5f68857745d6ca7de020599004906ccc4d753b8ae42fd1107f72794de7e37871e08ba2d858eafa84d82538bb3a802b3035808c53f46871963435456430653b2f3836337ed0c2793068081ab00e8b088f98866bd52c57c80217b7213d5c2a3e49a4413cb10a672ac3f42540c74b0f66452061267b93a7ac4a44de1a4c8dd03feec42d63655866c05000e49f3ce4a927334209a245b15065a1107daed71149756ac68a9ea670862e0862b4d127874bc745887bffdcb533947671603db9ac3dccf05f7b7b9627e58eed3744e73a2e4510c1463948a35320c5c475c33862ac36b42dc345f650c54cb60b91211887052200fa46b903c8f1a497956a074f1b0c01941e4e6b5696313111f816f6a8a27cecac0572727170516b1488f3346ccce874ee30bdcae0aab494559794c601879f4a30a6dfa4985fc47174a347216715e630330f31ba5ea1ab2d11448bc38c62a453aa80ba084334c35c5d5d1a29c192535fa4ca37e165fb5ba9482b7e038282ab561c6627562e4333771818e9980a34a949a3d63cd912021e7c2fda237cbd593c0647bbaff949f800a4fd079bf62417620152a9e1824135aaf34071206a969c761676b427d7c866148aacef3946dae41430932063718b1f3bafe4287156296aae2b698625bb82794dd987a017d93e4fb73131b83f79a875b8c41bbbb4ac78651de41c674700a65ab5b748732e76921178963ff3a9c5cef47d64843ae4d02feea35b915589eb897fe025ad918875c6150d7b270c8028a9f434a6a3754711856ef255149dab982cd724231c8c2cb6c073db95877a92d7fa23e8aa0123f25a88bc8cd7737e79e738ef8175580252e9f7abbb9a6afb28721b869c5e4b3b08a5438f5148373406735213163b496a40715a3c7253f43d55e38a059107634924221829a0c84e4bea69f68a5eecca37da2289ffe52475100686234c152c57c6e50ba704849983863335cc62463068d2a059b86417f6c0767695c9955cf34062096a34f8881d9687aedf6bbfa87c90b9db4bed286251847780cb7f206cc6cc8674a63231ae88bc227948fcd03ddac075c73a1a44d977fa212eb3b6469b7c63084801196050a11940de21a159151bd4f4775927600da231cc8c4b338449007b08bf48a969ec4a1180cb48d11e0dd64f96f8584087a1b64b2ca7ba0cbfd44aa3f048096ba95749020acaba51c55ae7894c507a286e122506dcccd3966e2a35901ec83e +ciphertext: 778b7d3e5dbc15f2423cac1170db19a0c6e9916b6aae719d707aa9d04948e8a87650b59cc3c25e8f6af643959b28f6d6d913b5e5bf8aa8526670e6c487ca11614686215bcc5d23edd7a0149be4377ef48ebb9346ebe3d8b340bb4f81e6bc15a3f2fce15e6e7819443a7b451ce3780a2a94b2f1dca8ca9eeb1b9f71c9c6ebdc76537b9595b13e0457334ee33ac4d58fd01a2497025588c5693a3cf34af71a6f733dee70e71cf3c67efe217d64c2ef1dd3537fc34152242bacfb6e2d0ace260a10b7c4cf1e5bb5a89c3a12c5d4fba6fc03650877f1d640120937a84ff3f1e9ebda037886896b6d53cf49fa1ff64a46e0083581263a4fa00e8abaceaf66cf9ea6fc10288b63f86d633b76574b2a711db5798a0c6148487cd4d987aee924025d7e1265907a11c6340f2bb1e73ae181ffe9457e88818029d8a45a78e2da2c769fe8beb8c73e2b13e3d764f93fb9fc012acd8075e5f0f8c07c06db6bf49c41e75b981db1e279052f73de021a4444f5b7ef23ea0581730e5d868e3ad7d4df61d8bf592d144b4a8b7f7e5b899065de105b69119ed8381f8e993677d0ed520e4543d8306091c8b6e357c0494a79b7b2db9b4b0aed2813d482dc8f2f07c6c72f5d4952262cee65e9fe4af7bdac7a830fea05533d39d199b34a3f74654166f77ed2abcb7021fca469e948edefa8565bd4186b294cb7aa0ab3e087d0f9b31f36c3d14fc6ae4b3c57ec846d61dc0456aa35f5e4699414e3da53c4f3f39e9718cc7581bd2701c150f2c3133e44a7c8c1e5727388275986f8b23ac9b3cf5ef51833b6c36dc4bb6eba24eb572ef4653f63157aff0ebdf31332028b6589816a4f733fc1ff1d6058d3fbdc81cad16764c083bf7c2cea95c1e484410f5047db86cdb0476725ef6ec2680b143df05c2caff088864f6e8b5f2fea22d76c7f0070f64ecdbb19605d7a4439b65b5ecb662d91b468711bad5bc369e77ef367f1da649c8a8f37bbd62092422dce04982ffee62305de5a6751cca0284b5a274405f31d9f9a37f2270a7768ba490ebe847a24bb085c7cebe61333b1a105b55c8cb1287090b8ab648cac108b09e7130c5a2f4d7719445c0cae5df19351f14054ef2c00ff92bb3b56fd180e81dceaa35f745679ee164853490d208c97bd87f5e85a65cfca4acaa49b62a5c1a3e4d47a7391c937b670ea263ab1c3243fec2c3ebef7e96a58bfedfc357e73541b2f717cb64f392e9fb970e7ff39eac566f291df314848513b8deb492aba0f1781dacb9cd39f0eac4476d27dc72f302edf05e86f483dd74a7589e9010e14069e9ff63eff56d1e2a550af157243e72d4292462eb5e5c1c82e758ab300ed3f929732f4bd7ae10c4593b64acfc8759d780ca4002e3d637a3e2e58baf6e29a2af14d17f6be4d687e046c8dab23a0cfebbbd7412590799416ebbe46310e6e36d4b57e50559e8396cdbede4a938baa5aa494fa639bdf57f4285201515405abbe5751cc3897f326203722441769350da4855dfc083f8861f4c1c05e5f162eacdecdcb01d20509 +result: fail +shared_secret: + +# Private key too short +private_key: 71e63acc22cc564839ef9cb227574c1e046ba5623346b6749aa14b7ee376358b7ca8b61b870ba3f430bda65449e9c92599e50f77ca5a59b548726b75301377615b6a58b8c1b9a04849d77b36c9ac66a868f9749159e65da7777571f2979188024aac287fc9abb4fba7b045616f65b91efb2b1e +ciphertext: 05b37a076f10d98c35ec9c8e869c4624f369d56eb2a13ae88dfe3e2059fe87eeb6569417e7994b599e1c08cfb7612b1b6a09ff9522f8ce7023caab258a8c4b7bf5b233916c900fb98919eab240be011686f35e1f0ee2335c34ff5a8c86a362d33c6c823c33115e2842f0a667b3ebdcd58250a9ee2ca989e64783c7461b7e143d2e022611383e9e1fbc27118a6acf8818792d9a049ed220e6eec9517e1fd76a1fda9d793361d72b4e7bc4920696c7d1a133a2269542505a1acb97ba61d5daf79a216c84d6021baf48afc4800f550045587ba0bc84521ce031b33774f2ed68cf1bd9caf331433ee248ad665e34b88de9b57b2b5b9419b6ec21acab44e208a051566aa1c61c03073202bcbae82019b4d25bbb674f4bbfb2828afde961d272cccd5ac18e73fbd2ae6e1d3000987be2323f4937efc14d8e50335df8b1f83e18fa7eb2e6650d8b2f04e772251cb310e4801914fe700b2e535600ff470040fb2b532b845dd94db9f3383e886bf712c58a108fb5c572435e7ca5fd6fc20c68ed363dc3ce6d8cb3f3583e04ca0c25e8ea46c111c13d4c6193a9b6966787e88577f97977dc19bca84c6a1e7820195fed2cb9064242e48defcb9e2739f4920f186f8fc796e33fcfc9e0186d7468b584a956b7cc68e3de682041637c287da7122f6af10ad8c30c09fff917e6ed81d41675693bf492b6538fc22fc73172bf5944bc353aaf6cabb46ff3071d51938b090ce9542f4d0b94db8ed2c2c8a104bd4404c0878cafc340223921e9c574e80f609b79c42d8085e2106c8c03709badf41992b5176a8abda1d2665e936ce503c9181a8ce4ea13fd8f48fdb41da2606992b7209c4da5cce01fc6e228ce9a53bd2dd8fb2d98fa4fc3bd1d8d5c53d0be15e28f8bfd589d164021b316ab2288cc567969bd359f99917509da8de2a517d977bab1ee24fcb9c869b52265fffd3a25c7ad6cf7b26db062d5bf33a9fa1ad4f8db934899792edde045141a82dfaaebe121451a2d320711631dc24273f625805b08f6e1d9d698a540a14b9ced487800dadd782bcc2a50d6bb2b2cc8df81d2415003fc6b04ee398740d9cf4e2f49115a18153df530720b88bed90b859f796de168e09762396e54253b6fce2bb3f461a9fcc1b1d1357bf1553921e10c383bad00b06ffdab2246c7efee4416202738ea95b02e4059f39d0307c13c6fc7abc280e05b63dfe5d18397efa0c8fe3dbb1aa0bc5b3345a50c0d5590f1d8b338b90e50c092756df1d85cf97e68a4e74b7b77b0e479b3bed27c859aabf09a7bb8258566d85b7e7e63f8ec419ad1f816c2055988d0c77f5aa06baf5aa7a11621928e081c919560a52c20fa7f6f36ddcf27002e2d0aee57bb13055c45654c92635d85d6322c1e66428137959d946565de9120a487ea47e9a3e8dd83f5a2db6fe91d11a827122fb5a5ca0f7983b8666d9271607271d5ea1c8c4338a7d45332dad9735ed4266e0e057180fdf739aacd1fa0b412e696d7802c258f12a7e5198d1f866a7e699a967a5457a8b49e9819bf9673 +result: fail +shared_secret: + +# Private key too short +private_key: 1068aa3fe1062be5ba85529475a04c190db7ac9a0757ef9a7df13666b5569be200b354c137c8e88266d97e0e17a95737b6ffa57e34a8be8402a39132cf3584220a580a1a63a1c9945ee44a8191b34319526bb9d18e7a936354004ffdc73ece1056ea523a55bca094884bedc47f1a17abf339c3a8bc84a6f6cda7538700c3ba83477f89f4abf239b18c629ababc338bc265b83932384cca33fa6981a80d21f71afda1a59b20b448430bec4087cc234038ac202d1410f47219eed49a32e68fbc635c75f48e27a44dea503f5ae09b42c858bc444913ca25f7fb3358939f4610bb90924ac9f3b2d73bc72bcb8f050a530351b78b17623dcb6c5738500e45621214c9470695666991cdc02dd9897ef7703ee6fb43970bd06708b0f203c66e0574a0a3a900dbaa044000fd939b7e623de359bb1b9b44902b31fb8a0958b1b9dd894e45eba1a4c2910eeb5b92811fcdf38d054165c9b953b3d4a49eebaac077917cd3c8df0b9201d308c682874b0554f80ac026f21e7c4ac9a9a2a0a0737fb47c6bc7d910a81b8668a5992e97337e980ee72977e0e8185c956aa9b6a7fb175562c286ff5971713774f9f065a27768c9dc4f47c9788fe07094a9ae52428ff5256db2d3356ec96d91230292949ef4739c4f097e09c3a18f0a5493534f7ca1378cf6a66e34bff3a03f34003094712bdea1480801adbdb96bb1c80df0eb78bdd98c7ac4048d066dc87701515b305080b9c964b18669bd3542a1b4414e7e34392ab439b7327acb730d40b2aa6b5a29b654014a36bbef4530ef162cf9cc57f169a62f25a7b382a67a92ace9f9b08fb46994356facd62463555de41baca6e42e6be354b4064c12b83f456c1d8766a49cd1ac8666bb7a0a2ca7c36c9bcb8905a528f57cb90548834d418ca539b833f9af3a16174c12cd45142008c79adf5c612fb89da63bc1f37a288c99c8479abe3af1a6d8241c61115dfacb52d5b17b73894a7308606fababa7255177160454e4477060bd6a265f57e75cf41c709dd5915112cc57b024bc586e97308f96ba2540b08ea377cc46473d17124e1d944a98e0aeb2e11e9b0342f797bafd1a1d25f719d9504778da5814009d71864587d61bd17a79d73154dc5293baf93711996bbae59f01f7478f5b0c864018defa1a6dd31b5438a5809c27e1e94dcfc149b7b83392a46b2c48be09e986a559acd3065754211a72ca574a2b636bc543802b6d6f894fc184882d733ee375675324250703967da5ad42b68d60549e1feb443e651f0f3787eab88b91733ea4351c99336f06305119144808a25f +ciphertext: d3f355b69436337b72d62cd37f1af766b18f6fda8b0af6607813d9bdac42ef622f56ea5b6679f64c79c7a1bebb28be1bc4b3f25f4a288ed5841f7164ff5a718bbcbe42dad121aeadf27d2fa854068bc36fae2dbc838527dcd794551509b66899562ea59585879504d42fa65bd4c687f1e26bc5d1a17bd93d7ba85cf292e0a500e5931531252fb6b647b428ceafc607f1fab76d908cba9c1b4dcc8509855d0d807ca8f3ad266a2f5b7c5e734d5e5f53530d1c1fc32de5db731555b8aa871d01464b0e63ce65db659a37e11af909d2f79290fbe2d915023a7e87d5cdfaa70db27e6283fac2b0c3ff88bfbb56a2781bce5150d28d2f87b0fa74c289d5cbbe19cd9035cecfca63535683ac477454fe794033cd509c8e5e8821603ca0d85c515898283e485af9c7ad5911d5c778093310c1e1ce8fe5b593c38116a16066997052551dcfe4d5942e095905df7b4678d595b9e63f76da3de6cb8366cd30c0588c10cd1b20326e61d5e83ab358cbb48935acfda374a8ba8386e86fddbc1b5706c150026597fc11183aff4138bf7eba56911f84d2dad936ed7daa42f262751b05fb1e16cfe186c515fb2ef4e4a006fd5ca7cf7b078de563ab57ae9a70cfceaee7626c63e8925d947cbb50345de4aa46fbe38fadac4bbdfe1a2e70a90869ca0c6179cbd0e98ab29a92a7cc8710fe5f5c574534f9a275a36dbd249b6522fa91790c0fa85e40892846e6d57f59b38ee8e6cd68af6aca41b5f76ec46c141d64dbaa032abfcb999abef801e366d3c7495e58156edb52deea93a18d8ff0b8c69e10b6958fe622f56be6782679d5976eef2cc9ad6f09e844637f722c4c742d9b26ec34cb227185a239bd2d7550c812e1435f7b4c7223d99e550a5ce9e87e978cc68d397c72aa827a4a4e370a6446ecb48796d8b94035b1e8ad0a652e7d4a9c1a9fa7caa188622162c855737bb0e8cd3325b1b3314587c805a290f981df7cea99d241dffa7278c25f2f9be717419f4b594f9bc6a6190e0b5b9e0f232fdde5d17df56b648175efe1162e6c7208369fdc70b502fac1c45b91325d1d3bb248bf6d73fc17335c20de9b11ccdb16a0dde8c99cd1a1fcba31f51c17b7631099ddd00628884f0e2d941471b571e48262c6f21c5091f43741b69d14d65ebb89283ab75ddb54e6b18e17e0966def2b71a0e8dfd1fd65cd74a3b964ac5ee9f6fea5118525e7770f3a65f0bf86669d5483b627ec0c20fa6352e78f02bc4f39b1ae3c8b4a20f637e14f9db5e26170fdb9adf6eabb4aadee9a60da05c902b0204ee1a2076a1bc175468e50df140251fff37ff1a98844e091efd8d7d276e9b3f0cf29831a3bf3e9bb1eb044fab3eaf7beda9437a751a86e6ebb6117e805d29fc2292fdc78ae6ab70b7475ccc75152eee45230cc7085d79faccd30c7e2bca0a3eeaf5733266e79e4421ed6354d4fe2609ec7f0acc544586658ac6a6af1cdd4d42bb294116d788a7684611e9906a36826f98db10f519fe8991488fed35897193d03e48d1676920f0045530cd1a7c37d9e +result: fail +shared_secret: + +# Ciphertext too short +private_key: f2737e8ec66101d22d18b0a9f6c819d7dab43390b89980999bd092ecac6006790a87261ee1a378585063d18a5d2b733d7a8587a0f5a553920261031a907a7234633618aa2a754b274e33b10a584dce462c2347be05173beadab6d0aa62a5aa906309b9802c4f47ab4196f0676bf109800492481a37a8a5b36f3237b8728527414d1bbb6956259875437cd142978f4230b7c6201d56c9fb558e0f0447407a138837a10aa745ab598da2d2979dc5b2dbba0fcac50d93db1d294972adccb2a38c04fb7970e5d1ba88e7935712917510b8f36cb3c70492c7448ba97992c481c4d1e91d6a3043efb6602cfb6867b2c20105ac3c7a9a4429c17a06abc487312f18299b6711f98ab72c874447058663b72cd0f479e09551e6b420d0c30402b33e601336473a168993ae80211e522768ab21bc0e7bb6738b968e81258ab650bf932284ec62bf06bc00d92fa4d981d9061db5841809fb9b2af396174520e5fb4bbb6c24104c9f20bc2c44b85f77838185f55493f8656af738ae239ba20001aee25d91b48e0408c4f120838b5a1379007e23d24ca2e92bf92b36cb64b8e2a03e27361af49229cc4bacc8c33212eabb891443ad4bcfd401792ea08a84b674590757a5a89243828eb7eac0a152c2ec7954c4570bfd073cabd6087a021d6c16bce866b37eb16748e37ca14b51a7a0a1bafa1b976baa4a7282956400eb044a616b6d29401083167d98d793e88998f6ec06cc3b0792a5a9cfa217d89c80571bb0aa4b5080c75417858d75557b4ceaa65ba63607fc69d5a818acdac2e289b2dd68b5cc48cc29e75924d548da76be40c543c38b23bd9cafb911aff086254dfc65db27846741ba38d6ac93d601d4610e3e50991d7782b581340b6240a8958227f888fb4c94dee6122ab6663d6aabe52061d6ebb62465abcf6a234ef40af8c41671187a47e10d95741990b91a7c65b0a0962b7a4bacc43203bcbb5bb98b85d1d0cee762a789f52396627b717c6657d0a260230981754255744bbb82118c164590bc8fc3ca3fb6b616673b344397a6a8730705406de764702c2b800711752df828b28c368c592ea16650947b905d4a876291bf3cca76a81748e1d86e4b16a1ad64cffe2156ce7b135f6ca1d0151d0a69989417bb70004379f534a319056351b5cb4b773be81298736b7ea0481c921b57a9a6a2259d633a75f471ce9c05043b95bf14d71621480604c2736ee2b78c6b3d13502a0e848a5fc31f5eca41df7472f35b37173ca5ae785049d051d50b014d952ddca01ed8ca6986663b9c3194be64c2d0c22ac9604ecf313f8f2578657a63e752abc757a2b7d6135bf25238960f8d1045a04bcbe959585661a5b839196539c11ce30d63a67f34bab2c2c214122845036c274c133bbde7acd33837d6565c446b5006d358ee87489b127505711d854cad959734e64944b7d77d46a1539ea38e02b00763b0b5f9c709d4b71dc9707e3669109df6c492b88d04fa58584a513ef0629fc8ba3f007851dabec9e4c219a811fcb24fcd610cc2e9833cd7ad9738797cca2bba05770630bb7961ce621bcf313b5fc1f63939061ebb078054785d86f169e0f87f8501c2618099d77ba3c8021e2ee2a04f0c2a3420593d4bbbce711948b7540fa5264f1b98ac13bf1737b42c0a518b81772151374bab8a4f737d14539356f9935df68a27bbcbc87070034b07c8ec039ebabf32a099644a3b9d6335f342590ca93d2310a6cccc21cf133d38bcaf756c619ff394c68710ac5cb6491393368c0613e3affa7310b6c19a1bcac6a6631a4083235dbbc0332961b88a7620cb27502044ec455216ca0b68f4cabe831b326019ce39466dc399f4073a4f9bc78c90bbf9455bdcc5af36c99a9af16a55415242e0c8899878f7eb9b6c7c17b0d1354ce4759f38c5ca37053ce6aa814577704803f3ea048d988dd3b6b9ffb097055a007ab041b098980febb4e73178b6d025afcc55f9562ab68ac2506a2d7ae52cf626b135029d98c29d5cd97eb13753ce195c5a990924cba3c4702189226926984db3f9239f75aa0af0530bf0330228c773871e8af266986931308205bfc72a8f176da3f195b2861115d6629db6b05085574b379d6a38cd88256508151b84694d1be80c57348713fb78475a67efc00fd4fca087596983471183a94ef4c1bd808840518a3e48a533e28ab975ba4a5d6689110c02101654e684787e584734fb220875017b5b6495097ea757ba0f94a034fac947a8a000794bfb4654aea605fe998590e94815b972d1f6088e1994fa8663a272c99890ac54364dfff2b7642787b1b0b4544229c3f1c1e5bc3357129f1d1434bf57477b52cebc7c19a7c8b610b37fcf596c81c33f2d94aa8aa2b553e988a259bbb810a19cc878750b5e0c244594c3564553a36603613c311874a4197a0a9a869c5a04a4b03222bdc7302c36117d1b94702e3666dcf4a9d26c669e7ca291541d47652cc9c60a71dc4fee4cb27683cc6cc1100d3217fd9a5ff6d33d621aa8a00479f4aab5df865387358ad5191a3998b1451c9b6ac99513b49a104bb03ce95f2201376ac33f7a951d67cbc71fa70aae1b49b185af82db1310823233f3c2815346d83009a8ea605f4425e8010769fb001b23039c6b96ec316142eb2d7c6173d0fc3a8f232768b282970596897645b497a0a1506ae7db4ab052480515844ca12038a9203deb9c98ec8000e0ad8a1315d1788d713146de9548dc4697f4ab091eb085b4179d1eb96677e271d9973e13b9caa16107cb860b92613b73e5391f773ca0ba3e58690df1597632f905f1303b52b4105b53b6ae3b3a9fd35ab047a38b6794bcf3529c67496b701cfde7982654731df08125a799d6e576116900518826b8b87622a7b1da53c6af817a3141539795277c9b8e39962713d69b30e36df5376031f53713c7c7f76b9feb357778800818c0b972f478bcc9011bb29414f0cca8c40e28b88a0865af4d43a0df74751c422965428d6df5bf6ac8a264678792861fafb8ae3ea14bba961c0903825c0c1485aa80c0c9bb9360accb4328ca4a22fde23ace3acbd5c885240a048c8c11d0271b5ef47fd3014cadba7861c92e5ab4c4f5f704f371316445ce14d87ca6f3065323328d7a8717e6093de506b2837823b57a7905c884395b0fe0b2456c57396309c23bccd985bdb7f240cda8237e2704cad8966c35bec681602fe13918a1b5d5006887684bbb2c7cf9107a52d5be4f0106b3756966a97d3ed426d396bb9db0ba49e7ac56ff6921cd10af4a5afe98b20f2386226ba3cec2edb781e53615c9859f4538d9a842d65b886e827d5ce0c72eba229deecfb018f69b1c63777434ffa7a53c61c80ee946e8d9f731facde93115d1e27e2319004a45802c2bf328744eced7dc1493 +ciphertext: 310f51ff9f3ef32c3354a6264b3527c185e0c166349da57afc0506b31cf56edc1af73e46b608a52bccce3797c04ae2ad2723b2e355f7af8ef8bf776549c9932cbde982660c9a7cf7044041b0a2a1a771fdc7a3d6b7f33e6ebb618331d6d745710a7d664032d3bef3d32ef6ba41abfbae95ccb7f255009c5bce2907901c3669940c90390c40d2e97797eab3c81ba525bc3d90a5df8266fef16317c5db08886d845357bdef7bb535c320c2c71f2fe6af37b29466fa10e1d67a6cc0cce9662f864ece0ca8972fd03a251472a494a366d31cc18d0c1459903ad4b6d9480f197fd139d280343f752c8803e78452c8 +result: fail +shared_secret: + +# Ciphertext too short +private_key: 82799033a18065ccb7bf807e53dcb6dac671d16aa24ef0c7bbf0c6050a99cc442c850aa1fb260108a79c9e8b8c0dab124026be24635905b5c4ed123890778f81bc4fe69c7fb8a0273b2c8d03e698c56bcf36c3b41deb53a77695b1f0af391c9d19350740d68511728bf5941d5ab785690067fe7929f698b352270550c7ae3cc6025ce94190879f74f31a0b355a40aa1fedcb4be6881dd355723e7c0ca00c796738ad522c9913884b27d6511a0856079272f061a211ea2c3c039a6b7cc653b01b00950ddd5c78529b98094b9b54d62f804b7418032dd63b5e3c136e1590a07699967d226b6f3492a2d4a0d9403c597276fa12039280157762c121f2064c5a669583097e7666b63b3a1d78a0ee688246f903ad09791d7bcd4992640df43b1d760c2c7140cac25b363c5675539a43f70e55238a6ae80381e77b2d26c81be81a61764f81b9cc87c7a6915903dec7028c37abd62c231ac7a6f76b80e19029de178b4c146cb3b15b1e03af451173389934b1fbaa429c2c5361a78331003544bb6b4c5926188810426c7cd24bfe989596a90f3b1a205fe178098006cbf3562c932e96252d957018a345781d3c98bcc06c4b4b25eac07cd9f463eef70c16b25890e19ee72b50bea2260a1c423ad56ae7818d7c0927006c6af815cdec9906037202835a4839b749182771effa424521a5156b4246f213723145906159a3b53bd616cab476998a34a77623c28f937e80b19aa68a7718d6b439938324c601e1554b257313055a28539b743b5b1b7740a9e349a78a86027b9b66d96c6b901255a45279a21a1007bc984fe331c682cc82ea7be1fa5dde6793fe424ebafc451266ce5366ab709175940ccf4e8b1c1b92692c4c6617bbc8e9c10e8ecb7c6d78a1a8238c75cc1062d577a8f81ae165038c42a28f4c1cf911c1907a0f2b6352e9cc29362a1cfe93151562473ba062e462afac60c907231ed9d51a2b55c0fe3b66e4305eacb56f7ab79a67f264a3c7065de85771cc3a08b06b1c627004308cb81729d2830d767439e69956ec84972204546eb9299c2333cd58792cea5deb761c8f63aaf074a6a8c2109ed935fba645211aa646104e473987cf4c761470cf1714729ee700b3aa7b8755611f5a2c7a14a49dc7741be7c9cc34445658af8175855aaab26a9a5c290881ca831d37e01d89c37c1f6b030e81777351b2c11171e2382b0271321238c29d5430af61add17758cee8ad8f1b5190e49625b2064da1316d8b479cd474904a0e80c622009036f1b241da06c7e0a67d7cf07a87fa788d07b3ac50cd13f232625b66eb64aaff79bb04264ac8b175b4c815dc989ae4b5a45d06b18c6510f63b50eb79396ef6b179aa84df7b864795b211954a15697781f68266778fc8053ca534904c947fda24883608a68b20a76f62414ed3b197a220dbf2209edb7336232d08aa0ffa439f5b26562a58c80f0a4b3bf96963daaf019036d46a890b742eeca6b2bf139c99e7cef96858e20a8dd5d364e0078338700223c4003ce44721f6015c2670426734eac57c78035bdb3355eab0b5e38773288a0f63a4084de5b71c12c366653ed2219310e1c725b95605d1491a392d8e6363b2ba0c3f3c250f5159d84b315da188e383015ffa0540f09b926b3abf69af60322afe01cb9f3a68e47a69d4829ccd921bce110e819526531c05aae01f5932b8d5e20e09d85adffba616b8cf09097e9973308d43c81283648deb5e78051341b53aeb496edc100b5e98132bd37fb1c2bec01355dba88e32252f35a86390721267288567a6b97a4822fb7091887b3b62fa7f52f2b607fb7ebcd3aa7544c315974f41d89bd988be5bb60d7b4c44ccfc7bea9b02b9860eb81a55346bb875459f814b8dbf834bb26745b36b3ba239b924024303d28902d066d1347566353815a33eea1429c222883d273abc3a14a0803002ac7bcc6c59ad5c040efa14d596a33c169801583b4a8719f28b8d2d98c6336a4b8a42ad88957be0a2c226e955cc5953ccd8a0eefa25065070cc0446ba1312d84bceb5568cd0b6254e1b31c430931c6c6485894a98c6a4c94b32ba6705c6408bbef4c34950b55e187866a47a65d2999fc68d00b944def3bfc83b6311b5bfeb2278700c22afbc3c06323718bb52f48b0b20286b04b42e1ef7c5f74248f78ab6bbdb0da0a6cebc927269674704c2b97d6cc915348c97eb6fec4c56328456153a6543ea9c66b9361516341c7a1e97fa7417083291fc181e586eb92385fd108106f557249386ab13b51e922361aa8edd020cc7e4068e2a0fa4a4216bf40c2d179af0b091f84960ed7a157576316dfa870425ab39099cf0f549ebd8a6a8d47bff2005d08a63ceb87c9e7c4d255865f06537a772579382318e3ac0d0eaaac4696d93307f29969b20eab7a82307af73557f131ff6aa29e0c36f52456646772f9df634a0701038f367cacc4a36ac955da2c8cadacd85412eacb91c69067f8250691ca3411181a543fb0f7ebab8d372b62f142b6cf25ccc75cefb15421d34882d00353a485616984cac114080c01d104b432eba2f1a054db07a6a15e4c0142b23468100eeb97a4e4b091456c04344b97b1533b86964349a7557c827bc19a22779aeee756d7635be86d3c7d3e97361b575be79214f051edaf1bd892818f08c5557e5b4b6bc88e2b7ad02a22e117c6772e89d6f7611aea482fc692e64f076c053cbb076470f2968b978ce798c221bc5b863e43679223e723b8f4e9448ce516ff4b890b759665eab69a353afa42658acd7a6276b1a0a7053655674b8e052559b880281525fc71e9311348615c0e541aafc987f68186387d0bb1cbcc3d9ca72faf7ac9b59c05e5843d56284c7d02d6ab916f453486a4632d3c82a19535168684c01ac02ab331aa36945ff65aecb4957c69a51bcc4ae48f27209f984b3844e4b42bb5b4c454e34754cab37d98a4a6b90370f0c0e5143c2d3dc1794d3960dd6b7a3bb7a231545b8d4a3040ca72e0b8d61326b9e970af5c0598c2995aa4a93a10a020ea4c14710ae5d92b1994858efb3216e887ed5b6bcfe964906477691348d2bf4b32685bff9ca90d63c8eb47a7b6c25942496a36759479ecab385853477502c97b681ac2880f6a30886781d3fb1129eea73ae7481d606aa71a358ea7b943e423e7b362c3823b33444281116530f9104cdccb7621bbd90889481059966ab975d1893ed57849d66b859eb192b9324a370ae0e236594d76da5f8ad87866be5853ee1d8201ef7004da5b5674cb5d63a1b1e1a1c813275be2bfe63c832e91aa86a3da1952eaf7171b3eb82eda55eba9ab16aabd1c0324e7013248c05ffdd23594c114da5f5e7b33ee63f7958842d32c0c463d56bf65dfe67e63a8e4983b33f880379ae53764dc1cfe0de4c +ciphertext: d9f3ef33 +result: fail +shared_secret: + +# Ciphertext too short +private_key: 5ea77ff76c64be5a2df0969378616abc3396c1bb8766c8893120ae98c52fe555a56f1355b3330cb05b818bb75fa5c77d2f40a674cb039d73cc7b1931b0a0b236f892eba8b71ef8a398b48853c792571b199165be01c77aa75c98f4d73c51327411952efa5342552580037449334570a434c33109b113cbc2e88155a9c94e58fa5fa1b937c4208f336912642737e1f7702ec31cda7a90d23a2919c298a5d4c7b96381b1c3bc95997aa0fa4a9eeb3a2a0a936f93251225cef3ac2d5ad19a98f150069b81ec7370c0263dd388cab57a8721599072b281f4a61580c83e25e4c6686a94f44642b5522b33898d05ebcc4f0a830e5ab494f611f3b26b0668abbdd818902c2e53a08854f5acba3032ac496f4b87b39481c1cea9c143f4a536ac09f9958ac60ac1da87481f2baa0643b4379c53a50bb4fcf37e053b3228e23a7654929408a269a24d3c1835c2e71e3bb71850945930057196007ea8dc0dbd6761a730bb670402dc8c51f03a346a8079ab368291411c58bc95338194fd57a4a55b53732c2e59a1b89cf92081fb36d2f4a6a76a5197c492a711a78ad821fdd6b611575cbae7b02b93b9079456ad82a3764263f080139cba7752fa7367228042736f52288ee508c77416873f6b1d2219593892c1bdd36412c85d2a1a48bfb7cd634b950e71711904cdab1980ff911a7ec37e1be57ecce6aa039390c6866dba8b1943a89a834b64733a0231e6595d70a0a77b1b19f86c7b62a2995783f40b49fb70a3b924afb017a206c2773075650eac5540c13a4ef230a95b422cabb8b41c3e1a6649856421cd63236292b4bf47ab5be75923a52204a834aff4221313429e3201cf984f17aa2782a00353957da7b5c6af16b6294510ada54d83a63ec68b4164253f112b03dc5b3effd38fb63088e4f17810f545c38b566e55a47f05a3511734fdba11d0aa3e4a679134cc1d6a346e721814e9e85cd2097d00e1360b191371d83ce65a9dc91554e7cc9843eb21f42306f6cab2eedcbee3b88e588177db9a2b109364776a08db4707ad4341eee1485ef64f951b457484c1007ccf205371e0aba3a011973ed2a2b3e60dadd1b5358bbde860b646081e57b96f1e908ca114c8b04316ae2583345c2f2f807de401962174ab84ba0cf6521b6311cf17e0a23880a79f40b821226f3e93c362570b05a81f88f2c5da458941591b4d60c485cb72e4787b04193c38c978cdf84f110991154576e31c9ffd3334962bbafd520d20257442fa7a37363fd88851385945d3167bdf2421f1d03e8b89bb670443402049bd2970a6f464a3aa0536c43fe5c73532532b50ba00b0729ebdda9cc904c5369918cad5b761190f7bec01534aa49cf7277b5229c5d6488d401660c70952474a94a278e18780a3098a25fb2440114a977ca4a349389c59be27aa7d08a95d94d40335918f96c7c36ec70bdcf109e116306848b30a3b28c259bac9a608e9673573d58dbde0cdd4516e655865f9bac1ae23ac5b014a8bf768d72cb07e86b7a9076737d5404ffbb6a74a872b1c8082180068b7a64bf91042f6a3e9bab66fc5a17811cdd1e487f3da95fa680d3e5682e625254647162b9812b552adb8484cce0444821793b725cb87144e2181ccb4099790c729ed2ac41629a8009967de36c0f6c306f1820605395cb9125d80805388453c9bc8b7b20407dee0080a811944117fed70a3c98ba04df127e1a0cfa2ac72da60b59c9a36a9fc9fd438c9cbaac54537320478909f6657b4a54bb12c7ce7e626c30975379162132c5106b12ee5a88305383e339bcc138b2fa628136c178bce47a0e8e2b48b436e83d1641b13bd444c87d8bc21ceea4432d6bd7258c87167ba2b310634d484d5835fa463973c80b598f20e54d8345452ca70a6bf0c20a040c8083b16109be6af6a5706dab36611d6443157219cecafd4b15a9d30a9b127949f05bbefc20350bc9493b23c50376e02b0628bb8caae9292cc487942530573aaa1e362320e652760121df50009a8fa7a3f741faa9b454d28b559aaa54508cbed96a498670bf6882184752fcc482a3343a20ba2a6e27b735f991dc3b859a6a493c01407c97341794943421b98d1e14d2946c7643b706424aef4b883d4cc721b39b821e18ed63544ae329400322e1614330501a3ff0227809c467f8743db4c794fb07671397ab6ba0b7b77960f67a5a51b99b19452a1f5adaf124978e615af237d436bb61a051cdb6032bcf67080e73023aa47cef6acadd48aef33644a185734a65751a15efcc933f70a272c7a4c0de2a6bea9529a5c23bf921ac3641065b974628aa1c867ab9b3599921bcdfc2c075dc955e2f6965857cf3d6c408c7b34304944f3f47cfbe4a6f99059d198577fd1c696758c8e76b13155752085637364591a876984986871aa8a79a1c3d6c7c6ca736cff8a45a3f0b5f694cc0faa2e32369fbd1458d25355240c82438362578077cd430f8e911539c016b7f61693db60ea16b8fa34bccdbb65587189cd0c4cc5e647ba5315a4102fa8174cc41a44968ca16a7b41834396cd942533f41b24971d7eec17bde883dbbb913952ac50ec04ab727ae4a06c3e4c43dde72a3bcc98ce5c3302755abcd58dc535beadc915e49a05407a9e459604e03371c7604b82b13a1bd5bd71e4336ea0410cb83d6d6439f9da6959ca6a5dc89cb3bab09b7a7b7e4ab075a08ac4c56a3f70bdbf102562da804ee97d873980f2c429009d68332703fa83c1f0b2ca7b615b176920783a6ca62598e43bc277428e2e34175983c007537f29375afd8b30329205574071d7d254e010a9668218e2ab3218aa35a9d54a17d2295f02c22645bb448b271a8195121b4ff3271a8ae57c0b372f5c464b4b3a57a297118de763cb017501b33f318073fcecc01b56b490f28f29db73fda4184d28c2b8364bbd3c5598730084a358ba9b8534878a08a431d1807fc1d40a7a044fd63542865846139a57d2da482f278ee9ea6d3db27216f070f32738df0a10f90815fcd131e4aa68b8cc16c6a42157438ed36ab5aca94902882638999fb367348beb083a0390c6e641394c5da4644326caae519aaa5e332bbe38270c69a8559034c6d37599c2008627178cdb4f8e149e05f66def993fe7b75f34f213f5e701fdc8b8cf71b2acd3470c9ac723a46fdee11f2828b4faf68f799203003919fee7a0618b437939cd8643421017a4e7f38ae52989ac05322eb96c1a037d659784414190194a60a6c39690509d62f6c0ce29cc2e25085ba455d594bec49690cdf6fea21b7d9a3f2083a38f15ed7c4030a5adfc2a53947540c00424a7017a05d21a69b30061e37fe72cc1392f9e7974348e8996a68a247a358e65ec0422b6a8bfc77cff0f4dade8d6881ae14b752dff539a255438a15f078df6 +ciphertext: 59a643f5add197b39e9328195fbcc681868e8b1047d84a7d2ce8ad7bd0818f7e6c556d11419469281ee47aa86faa170cb755f64c90542b463ae85c6590c99fceb456746486c60be32cbf138519c6edf7bc77e86e30d54c8c2b6c3a84a72609f8ed3ba87b33f65a521317780227712991e721767b279ef7c7d8eb5dd5cdbebebc907fb47c4b48a2cc00439b1cc2cdf64a04bbf876c065408a0cf099977174e8a77a16ac9845944a1d361c22b631048fa015dda24b19763ef23a8b26ca1ad7c4bb3b095be661815886a72d2fdc81134968fda083b14858f288b184701e967bf605a3ec40feaaef97540bea502c16166a42c48dfc352c198f9eed34d7b61d53294dec724e512fde187e05ee05b4eb85b5c9681ae3ac477b24a6b86fed26a7efff64d1293151c604d2f23189232a +result: fail +shared_secret: + +# Ciphertext too short +private_key: d833cdaf6b09e6aca2788b53484699bdb5b777f82dbff192cb7bb667862f4ba680e4aa5217bb84acb938562659a16a1a530335acb1bfa0642194ea38440799c0da87598aa1388a4602f42d6ea99bfe46446960438a904ef2505f7dc04bb8638b6dc47b54372bb3b335df46298bc5b4882a8a2bf01e7c3058ac4766b250b863132eb5f0a31620befa507a0514ae38b4cfc853ce967a6c4e6c90e70b895768bc03b7bbd6326f8db7b0bd2138ed61070536cb16fa54ee414a7235681dc386f3378cf3999c09bb4dca1204dffc61cec143342414dc88ace216777db18f0f5c00bc923cff0c5a4161b38d663ad67633ad512d0d6478eaa49ec503b5415b5532a8ba5ab04f31f80546a780ce15109053a1763c67506c74abd6cd34a3b92e2ca801a82021cbb758f838e8c9047df7bb193a4f93ab61cd51a766500f22d5023b43cb421a80c7a381f2ac1e0da44c8192b756e66ee13718ea07b144da0ecb21a4003cc9be332914db1bac40082fcc69c488646417818f008b4bf3a8902a56ab2b8473a0bfc9d3ae3c64ab3af855a31a48b885bbdb177bb9049cf4c50323734fed575c22058027f10f93394d3fdb562ec2850a63527f4c5ef2197993a5622550777475cff014176c1078ac2b0a8f7b4cd9f043245564eb335d6e909383875823e0a1f0f7802ce87c3d862764d675f0f85dccc40a7e4b9603e817d6798070e61512b520ddc3422007a19591c4758208cd59532d13339c20a7bb8b9dad054dccc8990050678c40591734521ecaa3de58c61760c888713d8d9067be14506440a1e17a81d58c59c2085e05687e391b60983567cee8cdcd13c0661a782405b788775063e47b97c28d69d18e1d377502e17b29f23db36498f946c3d4c50c3d07b6f81c3e36fc068480041d125ac626b5867a80f70a45605705d806c95a177175a29848f5547a37bf696c7995eba596f406710b4242b31f55dc68fd31c7ac7312de011de3a5812f2681bf213d53a90951c595b9725694ebabbf9c821d9969406320479014e1c751f47cb79c17bf3ad775b61bbf254b3df074513b6ca25082bfb1e079063571ba553eae864830033da63baa0c3026df042dce265d760a3c9d165daa701c696861e985af3b7729e5242fb9022de5770607072b64fa154e7216f5a94e098b03a1c585486425fe4c4b62fa36ff3310eba0531f43398cb8b17bdca7b18c98ad01aa47152931d67a636c79cd478c66279724a25bf0007a8f332b6a4b38b673a244a37cfed46810884af783179361a3a8211bbbb8b3669ba0801362cad94a36b5253b06bb4ad17beb2468209b10f1679da74462fa709164f43e6e84af9a877e8f25b653227592a376c2007ccda6ab7598625fc18020d866377ca860a17ca2c875db90b67fd1587971825b40cf58da652f539a7a95ab5f6929d11388393b9d3c5245e25aa7f0a1aacb480cf177cfdd072f6d3623184129ba966c5a97b579f58b1e524e98d1aabbe276c09b67422507ee561ea253491e38bf2ae18af62138e84249be3a6116ca3e49f770fe50227a082fceb536909b0933c560dae02fbea3662e39c6855652b71a7315f75f05598331b799da5a81b2948274391b6c3b9842255b4e8095a63631c9fa919fc761e4a33e6e3ab9d6394ac17994a3da441e1c93600b8733a840a7baa2c7ba1488f0a34f4c9368f25bc5c58ab8e109c79a416c6b74b06513a26a40ac13ab63d2711a17bc36cb4b81e36ae0083c091559f70c36d37257e7e2432727af2d198024a2c79a9a74dbf23d49c9b84b5b4a9f765f7243afb32ca4a5947ae50b5636a8cbf75c2b8087741b53cc5ee318ed589566f5018724867c56ab5250a46f6840b066ba78693a9ea409ec57584c90b9e22762ae387a72478dcf1b07c8b68661a8a8b49a5a8ea4c0e465454835bc93d13681561fb955822291c127a800c26115bc99830554706756690cd04544626ab3b4b7b93702e3192764a53fae648556294f5b64955fc26d6c92564553809839c294ac9badf954ae2b9520e13abd411dafd90193dc1b7be751b7134d30dc80d6f667f71062fbea64f9323ea63785550346acbc2aee0a4bc8bb77c22b420711567f445859202980b97b6af73ce73c4e7a6530ca039da0341674535811f628af1608039bbca0983b44b8c70cf28841ba720d1972bf941d56b28a95284b1d7492ba270ff5e26c9aa99371c62951b06995c5b9e60cbbf2b9ba19674f8ea5055886bd76848aa784c8648b696da83bd9f9514c5b997cd02035fb4922da70aa223cd76250145b8a3cbc56363827b7346ccbd28a4233725b110116f194430c8c25b32085054a1e4a9880f8a5c3654ea6844a861b3806f06042ac9a02676e3401629734c943c954cfa06935c7b2361a1441673c548975f3c59b9d7ccd3cd4272f8c28dca209ba4b9898097d128baaa4e3bcbc238fec3961df0018644c866fc3ce1405c1e6d27590eb44bf7b2f6ea78cd16b29fc7b97ae76c22cc3a748d5797465cebee06b51663a904b3ce4976dffc1138c2337b84714a0d308566987bee7813f9c6a24d16e99ebac32457b13c07bcd90ab87f47fe4a661953a17c51cb156400bb57082d3069d9302bf1a3a09a4e6414f2c958cb5629670b5047a15a0120fe333a8075ab459a03e6888124cbcad76e91cf87364d93cc1731091a183a430b2353de50db2a13ac4680f631339124a5464c30844a607a41c2352e64f10166dfe92a0db38a71e952c4946c6911b703c29c4c219279db091ef57cbf81252c3fb486516170d7580efe55f706b264ee728b69807e64048130a7fa5670772564ad3034ee41a2dc909cb8f3263e8b6bf498c29a71c807614bafed39266c68249f93764e000c16263f343a041ca3a5a68bf7b3a6b954460b5b6203ab34754f122a9309b6e97a846a1418c9ab65d442e50ec515328626c745c69826e4929b2e6a59c721c365bba17e749cd82c29a2af7bc15c64108d38dd05163d35516811737480c0d837c1091a4375a3c5a8b444ebc78186f16c6d2763deaa42811d6770dec425671ab6630adbd7743b725307ef3329d9c5619bb5f63d414f1718116e5b0d22b12f37793b8d14f56444178444cca6bb91997adb3858263271d384136ef6679833784967100e698226045cb29d16d1b306f79475113b3355d68514c2870bbd7051a93743f5aada773b88c62c53a4c75a40092649647de3608f8d9626a28a669b53d84510c6a65c40dc46909f531ce07ae56a8122e2111679988f1ab0ca36b8a8be9b4cc9957df02716c9cbdbe72dec037ada8617ddccffeae5bdd1ecc1973c4b5ca540f1ec9ab2f13dd796c86aef9bc30d0dee4c3a5e37f154b5b0a6b2672d3944f48d7ba79bdfe223a0df0303581c94dde083450c85ecf4d50 +ciphertext: b27620547b337799a4b619fd95f0d14a78bf9151cc5697 +result: fail +shared_secret: + +# Ciphertext too short +private_key: 32f34b401033dec93341c19d3fc84374d98762cb0a30f49f5f36b463824da2a56c3806102e192b11c7abe98ac289c49e3f1b7a1a7b6b7113b63a65335af14a90d8987f08770ce8228020b5505cb07844aab8331c9a3686789014938c10bec980f45a1e657a6c0708183515c744f32e5c7638958c1e7f7812bc1ca68ff4382f956ad4ec846258b405e2cc14ea469f1a8b61082167f45a5df439637c7154a478418698162b95732805fd262e7a36b568a58740e40e8ae1525352c968888547ba623397c78f1999eac615a243104779545e158eaff5330f0ab0e97a1b9c930aa300466ef2c9117030ee178d67736fd3668813dba04706aa5a919730527eced87c82f09b421317b9c85f6cbca17ee886b25a31a1eb3a293966016602895b58db39371f1046a814bc0fcb1363ba4a32b02751b16b5abc8741344973fa10c6cabad8439d33746b29f84663eab43fb821466a17cc843916a600cad63ae8b9a0957477f0d932b2dc65e2e52c72428f6c1128a4abcefbfc1e3340927e869a4b070e771938b8da43dd523ec4a96b5cac9b33361feae19966ca6c5795248589cd5727327341b3fd546477993aebe9a3a1d5114061cf2cf667bbb57dc68c9dc10106888616fb9caeefc367b86b89b14c3adfe5a980a418fac81857388983ebce5bb676a4d22e1e777cab60b058646a8bf2220b364aec0ca6ab47859f0838e115c0692b62ee6a0d659b7d6201b32b71c2ca443c731812c43763673208579112a53b1956a62373528b65cac5d1915efe84c35073913b71c7af857602ac72dd4722859a7fb212b9b4178703f4b693a715342aa9b43ba4a4a733b1eca429cb6edb4b2284c30a55a1175f692d3b081c2a24773f5c50a88cc433d78ef400a903c37aa1b107de872ef6218c9464605ec50961e8bb38f2467f62475644b401c97bcc24b929faa92da623a6f87c22b399aa3563c73936f839751c463ba5c78ec1cc31f7b119499b63cc57089e481fb0401fc1c4698d17b67b0aa839a969cfc9ba5f80b9660583c259b5b2c54ad7331116aaa9bc1931f32681402b117bc38e262bcd3f38650049555fc8af0d722d7c75b263249b13e6a2b787bde8eb83f553a39e50a85db5bf50d57a70e29721c61acb658a8953947644bd758196a9304f321b2dea8a95f482078c764d4ea6068b230b78f27535e1740feba3173204d5852d5b9bab19f50dbf76aefff6a5875052d68884c513b22155862fc476433c42cd78735d9311657b57c759bda4c378abe5388da75b90f1a27e07a945788d2a468c2c07692f8437251b840e8229f118a7160a1c2d3a5b68420701d6b437e539b37205b3b686b1768fcf3146cb4bb890d84312706f53aa63de9c65ac32573064855b8caf564198dcb1c8fb330fe7813e9648bd5e593a86ba17ca1518d062842eb104bb73cf12b59d272b9629f0ce1fe5c2f1e70bbf7687488bcf9766a17fba687a630e1ea2637b3a96f5c4935d3c72ed954adc285305e78d371136a8c3c8c5aacc5f209c34c750b7654c8ce87846c780be223a595940804429f743667608a602ac267faa683c27200173a6d0410e906730a8538da8e227e7a06475c2a6c1cca586988cc6317482954368eb83bcd28de940393d437c0e5b35d9820281d56a7ca165078136069ca60aba6a0d018d0a177ccb6c497092c44de387e724759baa264098af3e39a1ed8306815801f3a1c2115569cf3a8023e415dce1131aaca2e270261ef322d530761a94bf9f015a93786518e637ac23044b59a2a3b87aa120c8e05650d020a845b8b5bd1098e1658a66fb7744f483e5863461807d3cb29151095603c53f7faa6fe5527d6c1553c59567d07ba1bc05c8951039a53b37a5e8baf56ba69337847a0a1fa6f00710c5545056888e0cb2ae1634f4bac7467caa2e261aea4c1ac47c9206925bb13954eac901b7f5a8e698a275e85ceb85bf69e4b9258b4dbbc1421a075aefb009c7acbdc96c9842732d87f20f49165eb53c5838314a18904923f42d25eb7bb7b69efaa244dad9329a12af28cc324ca0a82211c39669302b07ca0e6266e81830d9391b26861ddf06c3fc57c098ec7a0ada2c31e2bc1a744712891d07bc4c85d6c587108e0428506e77793701ad588858b1291193f27df11921a1db2d74e633f2c5ad16e0b054483645f1c2947186823989a35238f19b786f6096a5ac4235abaf1a471d11c58c12002e29771078e305fe2794f0ac4c5f5167e620c107a9381dd05b52579bec7b7f6df42457c7cd60fb421690c48bc4994ec2227c56a9acacc74d349abfac1d7b7923b85a01a2609eb8fb5a30482d39282284331a94166631fb88c9531458545c09752d87e737afca2351a612438213d2b4070ce983cf6991540293687baeab15a1bed2859c89a7ba9a161309b7f6a560010984d97080bafa483f2942cb70ac62d4372e255a831b936c672eda52529e350bc9997c5fdbae55e517c2642256577026191fcaa3998ea0ce80777b92706372997d759857bf97c675286bd595221e43aa93273f94f2903bf1b5326c697834affeb3b60a4143ac4a3c10c839ce85ae07562be80230fd5a969e7c3c45f9420948c6d2e83aaf5541a66a550b34b569750f18ab591002917fa4c07fd88254672d388a41c2491d333060654b736ce8cd31ec7dd1189aff416c8bbcc3ff9403f8f33f47304e2b11612c719252b9056b12b1c4daaadd59559de4c7a2907787501115a9796b91ca9da779b9888afd4b4d456c33959b64e3fab77e9189e9d687e1a19533f6641f388292209496b26258357001d62651f1c276b00a58f55e3bb94e7100352fbb085314a09d7b074d534a8ca23d83313adad5b5695a92cd6817c0c4a786e4a84cc2cccdf1b3e5e72289b7a69ae68a6aa09204c704a252bca50628aea475dda3399be0b99f7bc4ef7c651031c27b575ac96171ebc99173a12b3b60cce72517d672ba3e1b5d09937e6f448cad58ba5ceb97430a61bb26c5f2f139e491702b759e06fb5eb74c81d3a710c919b4087c2035127da67c216eb88b2a086a2cf759d90c6bcb669dc4e9102f0868c184aba60cababf223047ca97ec3b4d7d347a2379b43680013a846b969339099a15ed538361045aa7699a7a90b693400379a906ed8bf4730747e9b9789097a52090909d1b0013755a8540d88dca4fdbaad3d7045044a2e5a80726fd285f9c83fbf23cb9c6c798c53631962688ab10029a6316657558ada824524ccbae9b8333a7ecada383fb2465035acc81bd753c5ad23503b0767ac2ce039f67fa29579ff4c6fd12221c17085f737acc6fdb68882fe46e09b204df79d5f81e4c458050f9ac70482538a57637a822efb5625bef5639463dceb90e569861dd289eb7497e22f561e93502ad61e0d +ciphertext: 226a87712fe40adea7600033fc6dbc60c9c14ea9d454143c430fcc22fb92d350f58372435e5e0bc011dc7d8c6926450098c7800d8d2b42bb0dc42b04a55b7065e81f399a0f48996a2fea70693f81b67bd5b01f7073ba25539e54c3d19057484258f6771581e4ed7f4838d2f7362370cb930a637182fa9cfbc84631abf3a6d2e5db5588cdb817fd94fde84f9ecd3afb562698ad89e141dd204b83865aef10a65fc88f1af70d1aba4d0c186e110d8f5dc8f14107b3fadbc3fbfae1c48f1da65ea51c700bf788bd4c1f77a065432f7080c59f95ebc743261865a0f831201051a66b0666de09322e70cece35fb40d898a1e891a79742815470564f23c8d5b1679b62 +result: fail +shared_secret: + +# Ciphertext too short +private_key: 7bc645186041c32a6fc98499e9829522702841f4bbad64b73c193053d6acbddc2e25b941213541543c6a3193a6cb2abe27f279f67063a56b97ca8638808a8d6e38cca782ad21e16f591b75947808ae230cc5d3b9adb364a2c75162c5c429c69f37a459b9a756aa3b48f888cdd30308ec292945650887d34243060e98144e5355c851e9073c79a77ed1841cacb233c58031716d5be4a40b9cac381431810440ae0b290aa378687856679ccff015cf8af933fdc2766918199c252dc50294ed5c17775a97183841652418e4c25b44b7cf376a8858e71d76b1618c597dc7dc82eeb7afdc61290f4c555d0b7f7c30b3a9c17193e76d869136a01826e29a54bab6ad93dbbf987645ac4a422b1a6ce738746e367c53eb2be0a72b11b3b510b69fdc23bd0f825bbe3b72f6706097854b590cbc1b45ba8da2a2f7bb29ac14971cb04a4eb6b0969c0d83819a5159274cc16bc4068753f5016e705a99d7895f220c92a09f1fa2b8d33193bd34b9ca9044e7a28b2f0c87df759285907ddc04c3227c6856dc669bf67589e14d6f4515e957506b73110dc20baa01027339ca44b8212039cf44d2a401227058dcceac8c7a2695649985c240563b71654b4eda444c2061620c73c4a6b79ca89e666844c533c771219be6326efa005a99f31d9dc885d74c020b02b542180216f4994dba44429449bc4536db444b2cd70dca2b4a32643cc8d67c87f862c8178bc6833da0b2b1fdc84681e6b34a7852550ab59275728a0b1a735756e24711aa840835117519d426e7ba28f65a23a0cbaee09c10918866e8591ba3ba23b8cc4e00457f9429b93a85a37cf86bd7fa750a8317d8e9562e57014ec96442cb96bc8a0e3f69281952259d2891abe9bad1197213096bf90a6fa90449014b2fb9d4b8011137b3349786bb109fdc045b075013eca170f48b7a67acfd0c6bc287c66e9803ce354e12490d537451cbea61fba868fd584cbc4b49b19699ae2c4f0b969329e85a96d235bc5a5561fa2a1dd72c2542a96ed2ca5d45461f1a24f8530ef9a7356f630ffd07315a693424b4ced56481617103c9c7b90e531c86c14a0155735003b0c36baadf1103a927887c40909f4372846b2f39fb12ef174b12a7c976e71d4517bdb24a5992c635ac588724d63162298f40f2677103c4f783c57e61939c2b2c1d3bbd31a5686213a2f3a97578486932b00c892ca61a0a21677cc444779a997caf3fa5056a861a485c430c3cac73e7abf29b853df8004ea924d3956a8dd2196697498d23b7eb0964244125c733a2df213ac059052200427d41be97027feb43a45a3871172b7b00fb4393165b53c76337767616808826016437f14a90f7c106509c9427869ef092af9c3740c5004d9b331c37660f1b11e9528cb29bc142b581c7512a0176886c8a39fb7108b9b15a268b8e63441169ec4d2202373bb1495ca08487244e008d5233024f03268ce3e47a5137bdef2a058afc16ef4228b7698dfef31e6de6881bc725d75815129543d4a0cb9eea2178124f01426775cb7facbb234fba2339029d7ff39868d41d2bfa31eaa5771af20d606494d140971b1c65cfa68fcf40522f8b9b88f864f4c7681a5816e295083daca1c7b8ccd71bc79b6763ba82675d78c6332bcee6168efb0607f05348aeca071a15583b079a48610da2db336a324e17457624616243fbb9b4d40354492af7d52909ab35caa8490faaa7469c59ac0b287110a8bb04968ce4aea10acaede2801c060270e53f570294b75536ff1535222bb755d3be6d839066409604fa7b22440331387477700ba097c89ad66a667200957c0aebe93f0043a283c040050c1288250973e871487a2294e0b99b14232b187676abcf9cd7a921283629db375183090c3aac7a6c3eebc26f69cbcbabec87c726ac8029447140292003ccfe729f1825ac7fca7a6e7a558244bacf68593b3b8c36598f5974907ff37077e61051fa0e2cf3ac067b65a3b38474cca5ae276ea719620667c7ebdc5473391f4ca12a142a20686566d2050011d28762e81db3e68bd3653f80bba30846aef5a610468339e14242a8a3b8bf26277d35c5cf080c89fb0ed14bb34f588fad7451d15c79306c859c61676e865fcdf54324e9848e445604e1504c5191d6240ad10a956e1950adf11882036792448997ca6cddd7a211599aff79942f479da83a7625436a18c4a04b8cbacfc35428a497f6d5ce031c59e9c81a387a9d181616f86269af563c17038281892a70b51119845792886cf50a6d25e3157ee1a1c5dbae9d70b53e282b6bfa277de403c15bce7ad48a6926465791a473c662a6d81a9f901f41b35aa88b939ea02926d78c6772902209b3a837c74d3833f3bbc161b03477c0c66f31cc71c0b1bf35317134825b589d07391de7cc212e53cd2e64548c30367744b6d82106395ba4d87ba336162695fb72c60a5e3933ac0e5a1dd27460fd2330a5c6443c097a25367e3ae4322bda60cb602a2456487226179bf5a0950399ba093fdde134fc5a003461234905cf702459f60b31533797a72985f4c146f906085ec3ac71770f8106cae9896dce412826678e76465b81125044a44e20453a5443ba6a506c27a38d4a2c50b0d0a67ca85159293c30f5ac3f32bcff9424d5426308257a48e48b8e76b48be255d7d32e29869ad946c4e8e9c5d62279f0cbb9e95c291698a1ea4056858ab5780382e0a20ab0f60391e2b1adcc0738d23a0855c32c44ad22055a9ce078a1b432eb02804e2c40b57b8f800129c733337f5787a336189ca86612bb1aa7e72cbc6432a5f18611738284169df3e0663b121263523e6bb123f1793b4c5091f9988ddcc53263bb2390e99f898947dc0cc23b5592bb150c7b083d17c0bfe097ac54474a9089adc7bc8b3b0438ee897dd384803ad40787524712873c469549094cb5e4653a0e886dd7f20e744b06746bc19b468daf747890404772447ed71a30f3d72257eb399700c90d0b6495b5b20855438d02180a058842c96b7061122b48c35fb0cf16549a39a3ab7396178d712384a2a9a10c3ba17141e489ca4b88c08e10bbb856c9fb4bb020fc85cc2747a7cb3827ac08b2640a5aaa273e467bd4706b8050c89121abae8a1c0f829eacd49b17740f5b72b188275cfd6cadb60246e1c099e3d3c837e840338446da042f60c57d14bc225a54b32bf39e2be2b51e034a32f160ba9366fa16397ad373e32cc2939b8d50b0acec2966c1ca516142a998d1c6d0c8b245b17e23555911b576cefb5e36aba33ffa940bfc42a2c699265497a6ede26214e4df20071eac7e077c50cc03588c06bd0ef20be8414beebd32b789bf55f95dfc03f3dcaaca4507d8509ee75522a0309cd19aebd84e1ff4989a0392b5052fc6490b251f2c5987fb4023b33e98 +ciphertext: 6bc987f4b7b85e14671904d8c90f281fc4310b603ae1047a58213e475b2608346a8619ebfde15b53dbaa4f05032da123702191d579d91ca4bdab6ffbf8573a96557ba6427f93fc94841b7f072b509e59b43f7b08d11a73d3909a8c48fec38daffde8767aaa1fff9977ff +result: fail +shared_secret: + +# Ciphertext too short +private_key: b70c2da5913c6db6b03d05aabaa5a362571379941bba4c17e21c3cda47838e018120a5a8a64c5bed955d32f75d2cd68f19974cb7932056830f6ec6a5b25a06fc0b7ffa0526af04797e8c12d33924b7abab73467d97c24a1b9a74f36869e0ec7a2e08b7322666b41c85bb8cb5b5fc4b065a7582904d11e5c27e608aea2a313a9641d39014d9d95a742ac77233aff7f2ab4f881581dca232801df31a544e8102f246cd3aa40ec130b8ae404416a86ecc87080b5575cf09472799486c8725f2567c2fca5624fa7160e72944c7c7e9644362c69bf444050b557721267c6e2490874ac74e327593e461288cc558d154fbf7773d680179847c24a6b5ae551ad69c90830c228ea7b33d1c83fa055ccb1b2408f14147845a189921149239d434c06ee318e4e60e903410b576b269b1b8fb4ab94239ac868b3fd85839ab908f621b79a95741858b4c04b66ca7b9b85b094c3b290e90b632f52232902636f776c28ab216e8fa0088e33f3d623b3bdcc29d226b396b0d76a4413f2a02c787a2df61628ac294658b6e41882068c9b2e7f2c883550e0750a5e12c539e929e873310f3079e3fb2900f466090ab0c1af80fe75a8f4f77a00e5aaad3c66d02511553091c2e06a6928b0178eb3267753b0428b53a60403825826ffb52088bb07337ada46c36fa328316021f42fa181c04a3232acce3254153d2b756f32f29786681ca57b353c4defa2945312973256374d6738f493bd3c31a49194b321ac7748a284fe11a88e718c7c794e046893213003e423206d7c66ed828998cb372aa04d2d130a1585aee345532c994cc7b50c12477b846c7c746926260bbc53a848aea30490466ce2009a7e5967b5c6558800af71135f62c434bf9cc7f7205b5542a086b334ce3603b3ba59b0b4b5baac82e9a16457285befb615d941554651d1055138457894554c8e5c18435d4669f825822490498abaa9875508cf87ce9e439d0305a3cf2ae4a279a4ba87a771b7a710aa9be298a31dc570920aec28cc789754c15c2c7214317834458adeb68fc9633b7f6468a0c00895c9a6d8c58c9377c72186d4001c5952a04026b0bc4a6023246b728e654aa3c9ad9a91d8a6c963ab5576450558a27227587b918d634a98a1946f6c4d85a943de4641a8c99170902f6f467e1e0ad77a9b271fc4d7237722a4b11e0d639fcb1af65b4cebf07c41256bc4cf43d4096b90008bb1363bc9b502513f00c57641fd8282a417a1eed9b14926a43675c3884c9479775b4993554aec59f20856388808190006114838f990b4f651b90d64a7f34e319b9e9b459fc8c6ad5b322661ad7965cbca52fd2c698405469025b7b56c4b411b355ba287fbcac6a008cba3a857fdb125fb715403ab8b15609711e3262ae0c3691a5bfe8f59128084204671f4f0c5a4252ce613c169ef5a01f6b1bc96c2cb9a1839d6c1176693b9c429056fab404c55d27899054dc750bf558d4a1aefd739a3ce053adca0cb06c69216b4a34839b0f739b4de608cea440356635b6f65e64639d2a1c1a5306a003c35eeb9a0b8851764510c14ea73c39c6bf187c5dbc8c1ef1b19458cabdbcac637495588960742290adc1390147340467db61eee61350bb039100358eb7c64df3309f24ba95c91bf574a26784123b24208ea6b489045e9b60bf6f4888a759b8b2425183eab9d74ca4ce1b3381f93eceeb48f3b2c02d6a09324376ac3081e86b94b4c690581c9613a37397146ef8086de51b970306661b4a2f9ccc98ad22870f726f0de044c50c137d034adf35203ee0b20c4ba6c4d3cf90617a8dd5039e855446f9bbaab792eab9af67163561830b5f37cbfae56ef1c1aa1727b903541d82d38cc0715fd6ba6f6fe287e1f8bf2196af4529afee417ae4987b80f7a866874d08907197a3b2fb5247781bcbbac491e50a15b4e50ff910ce0453967f353438b910a5a1805a354355f3393bd51be4880e41874cfdfb9e4f786bd4c47bea17ce85346cab6b64b865025943a9cb22a09001886d39b0a1ab68f7498a67d7bf4b01879d9907e9600e6553976b45615367c0b481720786cfd6ca1e62773c284980c7b096e7da21521097e60a0b4e3c4a4c913b542117cc9b2245a6189dd47c49891194db9d82a8aafadabd3c866ed5f08846b4c0bb82b13d8cb2912228464981e0e85ed6c807e2e68efae6b0f5f20b640380adc239f6e51e688b3db4628f557ba8237b240897b1c4251ebe66293ff62497ca0dda2a614e197ffe4b24e744250a46cf57f117597a0c116c34b1f895b4e8b9406b12de701193429b0e0221c8e441c41cc83dc858119aa18fa94db995a30122417d855db6fa7ee6606f968b8e117317d5669c0d967678887d097b02159438e6c8917a1817aba288d0c8561a0c6f52ec115f97a06d2420ba6b1a5be746fdec26e6381dfb8a04705981aff001314614f44c6322c67b58c7ac4653c15f717808cb6b901509b164933c962f6d1b16c2b146e992b68651647e9c456232993882297d761f6769782b18c011cc745deb9da6521c21521686798cba4701ddf67a9af203ea519855180222f36f6c2791c82721d8b2874334cf60519efd3a3af9d2285923b141130f58f6450c644ecfb573a14933b01c5a9ad37381fbbf2e49710acb0e9c523e46a33b7dcc8ad14317c86b2c9fbc465a4b3b379970def4122bd019d2f051fcd37f2a4c56808c3c5cd545dd09b4524c63235a0038fa68099143aacaa5aa447c432544deb48d4e08cf3a25346e7caece529c30e8bb634b6540ea46568c07aae62bacb01a2da199d5638a54281c09909f0259c46398a2538353e48173dd2b8b695217b3f6c8f30a65bf6367b3f41c9fa861166ba6756c535e55c1c4f7384e6905e79619fdd9a9bf1b63441b4cb0858f442709498c04ac7bba7bf74670aa2870018c9694417c92886e95a5bc7914feabb0c50005c929670d055662ccaf0058a109db8d044ca828d70edba27f7a98aa22d58adb7c7729366cbfd409d5306a9db5418950c9e7e963fe28763b346989964dd9b808da272e5ca195d433425f785154d5416df734c8571b16275985c13fe20b8c45921879ec92fc168bec2c4c41486592407970a674b2659f3100a95ecb89f4920ec11260051105c4fb93e2c0bc6a31a6725ccb511b2c8987746becb36cd7505b0cc5acb141e26862db7728ae66632b65ac9a739bbb0c99057c169b75a6bbe80f18da1d96a370d12474cc57cb9a021359e800617176de3439b2696e0671528a6ac7f9966706052dff60a4f7401a9279e1cb918a92fc58ae46393767d664baf44b74ef13d602cf497a479a827a082e516572965bdd0bb760746f53d41e1b9f1e71cebb1448f52782f1038cd22aca84778ebb5d9c3b10b1b597d3ea3bee7c36e51b67 +ciphertext: 95a91b23401270e4614fe88e693d465f1f801bc7743e631eac05074d515923a7b0bcd6cf1c78087c6c42c5bb713cf765d3b04a4e651cf211e975cb72c7a3b241e76585825177b429749d268e17baa70ee0c13b0b4a49526bccc8b220ec054d660779bfd23972f3e080f0be9b02e7cd19cb89d88d6b5fbbe36caea000bb0c90ac8f2d4bc0ac7e8791ce8d572f51ceb0634991f211c0dcbbdc815a12488104f18f1599e0273dbfc89b835e8a542769a0e35c805adf4644c3a3af84b16135691589da56b7ea17d36f25969b0e3a714435d59c82db0c7473a0db7c45f04fa750262ac9ca257d84bec7942286bb3dc8f2202419c7ef19d026fda070817a1dcaedcc3db05b65a857f86ab29c41494aeb5419a5e918811a378242c753e60f34fcb24e44fb8c3a3cf968087c4266c85518cfd37359738d3762bbee816969b8f6f1a070561d74a1386264c23abbe91f450553e01e973926d5b8e1ab14353529d8f1abf2cbc0b6ff1e45579987ba46c6d3c2 +result: fail +shared_secret: + +# Ciphertext too short +private_key: 5c813aa7d54e2b5127983aa133f3a16cd235617cb4c1903174fa0c581ac6b94c7aec2283e5608950e61fd6b7abc9c7635becc3d501551b39bbea868211f1992a0a54c44c06bd9b15f9abc9d0317cdaeb454a3179fbe0603203959c900845466240400bb93788ec294cdbe335e401c9e7217370d979dbbb36373bacf89c656c945e52c461b77152338b7868a36df88a873d239bc5194c5e82614c615ff9a5bccc1c47ff56a2c9ab55d488ab75f471e3494be4c033481254644ac46fbc6016288e83248406153269d26e78b5299ad9698733cf067818a546bcb7c40fbada19327c6b23704ba36438771a3952478cd70c7b819020e14175e35459ba4c7d46b50973e3989d875f15772433108a633473e1847692298e48b466f672a2f2a9458401b8473684289c275fc699cbb169f7db5c5972902efb843557ab031a4ab9d611be628069ccbda0dc7e877a0fd11ab7ab68a315e0351e368d4df00345f72b69598ee365b9dd943f0ac8865a1c7a23c30f8f27a24ff64587263cbb5c5986bb7dafd07b8a5a5bb3c890261848a0763e3c5bc3d0a3bf3b31017514410cd5ce1a02c8f3a88f1c5829b8657ddeca19d2c4381984cc73cc165737a40518751ad77e199b84ba3c3742f84722ba8943cb8e894362d4e36467981590b87972f941a3a238f1340f29d0728704b2f7348477751f2675cef34bad8e8393ac8574657092a8569d4ab2b1ef474388e30253d124a0e286d0a2311a772b2d567843c5a5c28072f0b8ccf823b5a98023d8ab3928c293afd4ca4fcc8f51a566c0e9371be8859634018e68cf072b438ada2055731b24d5b698d76f2ec1c674d4379949944701243c5a5582c0a65ddb9b446491ea873753a1815b80477257272ce16edee5c2a107535de827aee7b726970035179ff47567b121a7df6093bfe78087f562ebfb68a119c93b59b861cb3cc167849db217104bcd7019a68b196f7aa6604ffc234757c2a2563be576ca024cb01512c0acd3779c130fe0f5c02a3c8b3fb3bd15ca945e877edd1771d30c54a6363d99112791b100315156443a4554bb4dbae788c1ea80835a476fb0cbbd83ada4d9c6e3b11ef20cb2404b9616876e7b7b600d015dd6f4c65b234dfb200343f836f113b6a5189615d9cb2436bb6af556397bacba8996bd623452b16411566d4722bdbca133df8cb98d716f7f02a01397c52ae0a869205aea1065a8c1b4f3169edbd575fcfb26b6f38ee88a9f82b25eedf8c10f58c6f11b91eb580644f0a3e995ac60f49a7a6243ff50c304a9a8c1ca341b36ccffe86dec2c1dae940c3ff239e97aa06222add856c8bce4254cd47a4f849440e4b4960b015de2c89a48c93ea7cfb44c5dc5019a8d917902982fdd7188a93ca14a93bb8f03bd74823f5d7cc4ef6030879bb9615c9fb641aa810ba9c0bc268b6b7e8ba2a9ce94b7ab942572a96386558142c934dec339f9248864005d5ca5631b9b06f203c89d78ab8b936b5c2b575379bfe4446719988148bc5499f6b24a92428665227537bdd67c9670d04c08d991d564567b4cb6f204c89d849c7e0890d85154487a20f6b65d172367a996a8c65aa2c9d686fbf610c7565e25d6a6153c0c24c3616d5c6182356fb906a11b239238814709771c9d0430615a26d6e337daa4b269d4a0485a432ad0ba00d076e3498b00fc55b2227d04f77ec5889b166277b6817e53404b823b1f1dea40d5867fb99acd4f9bb69c6cbb0408b93ed2190b1c1184972e8893876cb282baf3c029f43bfd154e13e94c9879ac413b9c806a40e7c56f0586b26e57691e3c19a7fb45a4837649b16ef059c8481b7186932cb461a385c6c541231901eb3f20aa65653088b65067d707206c505153f5051b1856e9b155fdfa31857025f35c3b4e842327e9a9b50c04961014d3b40aeca37e81d2cf45f646e25b37f8ba4d1f73c45ef41d03c4a4bce76d5d28981cb68c809974f1ccb09798145d5437ca9949085a7a6d9044d8417e01586211c24942f124f711aed0c61dd987b3e8968ba7e85bb1d926bae3138fc6c46db3345fe667910566861c8e829b87f6db5559899255460c0ec01d16aacb3408c13f349e58bcb8a8f1a9d2e83c61694876327c6117bd2d62b739151464995e722115393163e749ba2f3559beab39eb43bd5d67bbad95151acc388ed175831b239974bc4c19073649c48b85cfd4b89ecd444063038bc8e7a0b3b852f1e250118085fe90c7b2343a4ce566a40a1a4cf29695b29da1611a38f2a38ce59958457162182207f86292b54ab40b7c313b7871f27955b483982717c036132d3044114610faa7be176174c5a22712312b0f6928d68c0c88a94bb35532db357a7ee9c836306d2339a4824072330594a6b7b974a40480b39cabb77efb97a8f87cb266dcc0e6a70c263175e82bb5d85956f52576f12498571b10e957c43027a29926c106009858dbb37b6530fe33a127dc41b89caf7143ce4ab0133ca310cb553cb1437857bb3177e1c73bc5b2db787de1b85c78dbbd3290699ea3ce629c421c7972fce96b930ba3888b8119a258c68300e5cc036a1922788c24000c2bacbb9e55336826fa868ad5027b66c92b425fd2b69aea223ed2bb18c6a534741b32f3862f7bc37d1915972b65a1dbeba66a011274cb6f90593a16eb063a01ca2a08c1f9e987730b2770a41b33f383ecc5071a74568212c6acc74ab2262e3ac470a68b2da320963711b45eec0335602e0f264b3ae76caf0b4beae9420d54ae084bc03ee929bf2812e6d83f8e70796d941616bb64c26b7816ac3a9eca7ce226414c422b1547204c460d539026d97621f2347ab4582f63f77537614d3056396198645f75707fa155269cccb5c3b6f02a0da4d03c385327dd74132f3cc13384cff84376a720ab3bf825f969c86b75bc25c0326da77eb5600667a21e4153ce70393bb1b460461976176085f0c3521fdc2ebc3164c1763305831ac9f8b635e6883694b9358b4151938b9158772b8aa608e83e3045b2d4b819d524764bc121d88bc54a2987cac2065a4094e6e86bee7a26825968ad4a4df7859f11e8358248180deb39a2148ec0c3a10bd92b5cd92f2106bee9c64cf69c22094584f031245b31cd07d280fd9860da806da0a6c31df3a421c3cda2711257f5959b211d7b8881c38b91426695e5f481c656620e5762a271bd7546170fdbcc7daa1cbdda41b137aeb49685f953c82391c2443bcf47f27b6bb066cc056c812acbc43302802b54edb353d9023d49ec442879ac0f20661bedabd2cb1f96185435e4ead42acad8d942bc15278e85045fca630bc2dce38ff0bd549d283bfcedaa151bd615b798834d2c8b1e52a79784a390ee4a479f469d52cc407eb065df1cc3210922ea6a569861b8def505a209959925 +ciphertext: aa058dd940688d7055ba16b375b90ccdd7df701b0146265ccd99e19452b6ed0a687d4a9e0c86cb5d63c8fb43b028beaf7ee651d3dcc92164a58730fa0ae279d9c12c88b0a9e56f778332f71f438c422899f6bb03a6dae0bf43a98fa4b2efca42a80b28082bbe60697229c6a8b6cd7a5ac2c82328e7cf9dcb79c5d6cb92fec98e709a7cab134eb4aa3b6f99981b381e6ad84f150091dd934efa01f8d184660f6f70db0b233d3a623f296d66791e40642954cd3ada39481aedb060b063b16c9aa70dde1afe0a9e1a25a240dbd57244ee22b1e7053d926e60fe968fbdb777dc71cebaf7226fd3ef44219c4e8a184220fac785c9f341433cac361811cb0f7510acd81935a1ade1ea8df7 +result: fail +shared_secret: + +# Ciphertext too short +private_key: 8a21b34ba2c65d2c256bd946deb08502b23c4092742b41bc9018abf77845a4ba0dfa8a0b5de27a114c1bb4172341aa2dc3113681f39ef21a981c4b329ec04bac60a75672363244a19887156ea3af1b75c55bbb5227b31ab90759465c9c7f2b0f2a46a8b3b41ba5fca2d12a83006d01e8e10cb4b34007c65e6e3a4bcc9ccbe060a36bcc2b31583ab2710585f66a9d138d6ea90379193046295988e71b6482bbcb60625d554a02a45253f90901543daca1a03e127c25f56fc178c9a8853b59489e417012960a3da884313dec2e4ef9ce5967afaaca0fb391404c956be1e6205580709c233713d47d8c698ba8cac953fa7823696ce5d5b15af70336ca5c28079e981612f3f685b6d0cec672452d3c4aa7f83563f658dec03c74b73d13bb49d0d47213436eb8e4364ab49726870b43c5c4e4c31096b2945364bf5aa736dfc3a4de831caf8024e29c0f0590974567323c04a987ba3ee1fc49e6f67e4478a5109303e1dc90e8e93099161c1c7c411c117a05aa63abec1665047917106394c2210285b15279a23f39b3279471455a55fbca5e84b098a4967c5db49e0c892826588c27576c589b658ad614bc69bb5f443ffde17c775b5f1f360c7024a742e92bed72af09425f10013e642bb45c2349b686c9bf5a302177076105ca10f70e9e88a3d55bb0a2ac5613b47356bc326c4438b5c7bb582ab3d3e31ea9b9ba10241cd58322a1d8170d23b1b1741c43db6e4a598266b6aa8028ca03d987be5a2a4b27a8b19c980f426ba8308d86470aab79ac01a61cc21881415a4d429c4153314a6be1032b47b1c00bc2a5985b4e4c5d8087bc5a9b083d87397d7b845200ad2971a67260bc3c556aed8328e74a95b4b32198b98cede847bce60796b83925d21083f2060cc54a4a8a29e129328a60a4b6e371b693b2019468d733a6f6e574bfc34d00b878587c40be298b1a100b7bf613a634648445a1e7d8991fa2ce0f0aa0a20c4acd4c60cc787462b31a95da4ffeb09ea8c61de3c096b46992d49b3bcc060746db5415cb75f4149eefc33c883c26b2409fa9f95a813080d82c73ec627008faa57555a2d414a4f721c010463663440763109549a83088b4bbf356916ce26a0d064c395c231cb2423ff856f097a38cd3736771bfe473bef364b5528418bbf978fc009c3a351716679cf7127f1c40bc79eba2bdc19a96629118a43e9211a2defac0831b6f228ba55aa1aaa0f7c703a601f90394d8c171a0264546bb80b6eb768acc5bff276ee31a557147b72fb817ae41cf3cac6d86489a81d870500ba0846b964032afd2530cf4c00158c6370cc61e37e033cab8ceb63a1434695647c819a597ad1ed0c528406fa08a303dca62ca217976a16402669f97d4b048a42ff00843233271d3b17ad3b0615b5a694a61c939527ed74cab08c9bf39318df45aa18512145b8856854112e9a44399b7057661853df760d1f3c68743956749bd2d080039e7362be6938409cc845ccd3ada23db8b6101c941e716583f949a539583079c81b5c02507f1075717b8b43c2de288938aa7afb943c5af746b0664c67510b9ea25c15fe8c25ee5194e7c640512b61e5394784a93e498720c2cc941da01befa9e32813cc6654a082476e422205fa5a295a5a94f7027d95500c2484cfb88af84257e6d962d5866c1d9969d0a35cffc20a3e1ab82ce804664c6cb93308d0fb061a52912cffc61e2b16228933e7d6b354a2c6ccc54368881a7bfa1cf9b053f19a8b678158806952f6c375669006bfe41c5cd9867a4817407734910a07fb823cb7e6b98aa089305e8771d9b9c87c793311c8ea631272ef1910de6947c28a5052532e7b63e5d61974eac9e83d85e711c2ac5a0816ae274e2a60f7aca1bb069a578bc2180b8734f70346c1787e0182d3957caa0f61e57489cc0e07995307bdee20aab32229ee05d9423b4b54541cf5c4959f00a37acb67a28b40b91bbdee87880e74d7ffb256dd098ac121fd5c3116827802116784a0a79a369bd680c1dbd999ccdbb38309928e626433f56acc67041aa705f1cbc7c4e9ba362ba68dda40f38899c6610b703612fdbb845adc37c51057241c7045e86433a2109f2461f14837a8a3b9509b03549722d41a137854201f1894e46d73682301413eb9f81421022dc7cb58a84e928b36db75629a23f45377447504a72444acafc6048c7572c3180afc2643f225bef36273f97450a20c0bf71685e1180620859a3b635d20593f71c059633725ab999cc994cee209eca47595be66c425a5666960c4ea67752bc3136727b49d75b7f8bcda6d35b22595bd704a4fce50e34fbae4b3b9d2085b2eea695aa787e0632020c881588bcbc93a43439cb79b0ac676acb9d3f9139c1c4b837c59b08265cf5f610e9a54467a77549dcc3da55c980614be843aa4c1a5eafe2307f5710244637570106e0e0139ef47f4116529a578fc4db5b36e1648f541676323e8ad99885bb2ad024ce60069ba3673c1cfc055acb9eefb5ceb35a484bfa207450ccb627006e22982c5ac38d7c078eb522064b115a1c1175512afe789888a9a87f634f5e5863194787f0895776f1618dcb712c975f8aa885d3db7b6eb9978e15a38e155972a1c92057cc4ca478080a678f7a0c6da94a60f9a6199b4e2009c352d057a2f89ea24b104eb519a7447201e42475a88349a371daa038431134fff062c1054f9ee4cc0eb97402c0444c991bc748a032d052e7a151d119a4fd8b08f1c2719ae74a71f257cb0aabc29840b95365f47142d5a19b6b000919e511c07b29a4d39df01a8406862e2078a20344132f5331b6116f9c02984923b168d6a66f6125b08b34affacbd8348387572e8d1171e64a6ff0e49ea7da281f6cb5bc5480d9a9606b9b650fe451d592567be70232d2c8e18a123152b7fd904f3e75be481401ea77c5bdd0c872962c04e0227538316a9b310fdc6a2e720a2c41c3c6709e12acbc66680e1bf95c6353098b69545f076d645a77868a9e0f711de5b0811d0b1bb41cbc0e73908abc9f2a855f80079e9bd7c00a685dbc6c13b0050a29f483f9e24b8db3a1138c91bc833b6336ad3bc982ccc74672f60376f5bef066c7a3a335d0a3105a3a8812329671946c1e95891a46776c003e95d41eaab40f0bc7bcf632ae614acb883a59e056aa25b20836e1120cd85721c7051a480d6eb41964ab242f9a6af68634df846981e0999b99249967c1f4883a303b7e4dc239ca9a97f1b9843116a2b981bf72955fb2906b4f51869c933d98f6792fde068f211ff67ab74487c53baa7a92d6b5f4e707e4780f87c38d43c69d2c04794bd20a55b0bc15ad636c4de26ecc3a94484cd221df27c3fc9f1e7d73d44ecc0715e998611f3af8f7e5238f6383033842d4edf747fed8f24c13171413 +ciphertext: 7fa22cceb79756ad5eac533580ff041373fd909b0677668e453e7dfbec746cbfb654177ad71890f220e472d9b09f15efd19f489bc6b2f1ddf0a5910291285002d11b237e213e0d4a049f733096a3f7c9716cbd149a58a0983f509bc1f032f4253bfbb40b3158947c +result: fail +shared_secret: + +# Ciphertext too short +private_key: b7517bd817baff981528366a6a69956b22a9c12389eca88e903915169b75f8078b72c4c688a3bdaef438495359542aa76b3b027526391e141ff00cbaf790cc1c41a16adb2c99407d759c936c823859f6c8985b8cfba3cf5ec7194534a22a4c3a66c7c12218760309c1dcf1ab6569ca007c68dd70cb0935ae79249ddbcb721e371d280b1bff729bd34b7182f4ac365174cd940575e140dd30176e739678972311cc8477f92187b0095bd22f1ad687167962c58473c6816eb845a16c3b716152ae4301c18fe85797104d8e019e11976f0c3a14cea69932c9569dd8884f075a188c245ed1154d105441d74485069617008b76836142eb0eb52c02a2c18e9e9215b71143c3d530ec787b264243886982ae6aa128d68f4e5900a9dbb15e2189daa177bf4601cbdc4bbae7439d72ba2fa9bdbdd57ebadc91c30783d883a1d6477d48319b0f8722e5809a04da62dca28a7ab2511c76699dd553009434bec779a9518fdb8815527bcf4142a763f916480ccc812b81fb98a56aa97181568bd694bf975b2f2069caaf935a138987cb23c4c8923540db63db252995c806156c3903613930eb3c8e2191b69781142157d7a25c77bb1b6d8c4b1723772772ac0ab589c3d0498d097cc47991caeb734b6b59a380235bd7790c858009648435b86c2ac99b648220ad63701721733525a70ba892d0d1892879a7447bae21d8aff33bc28142678cc2c63b20004f126ba2804ca4e59bc7b567dd9bb0483b052008b524a209028233b8e3a223774158429d6e3744ac3b924c048b37d70d61b65f2f4b5eb2f79520660f1e3008ab6b0fe7d25bfd203c65f8133d1a287d47523ec66cf501cc84969b4e602d3677ac713b2e9f054241b6b7f67ab4fa9cbd421819baa6573db3184867a9ebac6b3c054483a8b0ac435e3a6a25f2f0b76dda203cfcacfe28abe72433b2ba812d4c673ba0324f564ae2a95cc2432ec8303c12149eed345b3851cd60980a68db2168a5703e561bff6805601506b7e88090f864a370650af9547084405c329a03ab0eacb0401d4b90f84216db8a19daf580dcbc0762d78ce098a99f28223cf77079a7b107f4ca6e660ffc8761925b7119bb86ce987891b39cc4443c5e4040dff7111f3a1586cb5658722257d2c14b7a56e16b3496945c4511a1f19a84d2815f8f19868596ab9df54a09437d53713e84fb76cf0c1a56368ef3923082e408c24a0b0c84946574944a48a3fbc5a587a096e2e727439ab0c4d4b8c15036fe8025703101e3f6cad409c76394612137169ecb8a7c7a0abaf5a5f0653d76e40be4da5548fc8553498475905cb7ebcb66c96da7bab8336511bf06082087ca3510803663ba3892116a4594138a24b631351ef5b6fc3b43b3d3215448bd2d59972de1826919480c653100a013178b7d24e473724ab631485b9ef0553d6a6db802cc9ae32b114992977cb800109dafa99c7287574a102f5b4028527c6d54209da88690bdd343e7301ca9c4b9592bb1a7f61e3e95115ce3500ffba825e9372c1846ee135c7fe426e700797fac66c518212148a017020d4d3a730eb91664929a441c994e1b284f3a32196b26c4aab59c02c513d83955955708d75cc62cb276f5bf4e314375a4c340468cc77c73c3fc2c62176c18422be4365f43441914b72733272321dac9784c9c61266f8b643f2892b36b83a3a26789c91566af124367a79e6ae50938dc3daf050f5ee5c978f456075a866de441df0c3ccb7a18c47ab024a82189f02c612c1758a87b8675c0319347a88b39743625bf97a43264069c28365c88579ceba527d38092b916f661c25b7158c1499a94295c5a7a0205d12fb9759b4e276a25458eb09c08c828cc06389449e53d5224c8b1a38af5d3690c5976f5231275d5791313ca50bc85ed0993f2563eda704910cc683745abcc09b5fde1c8c3210dddb73ce6a4ccf5929d78e7248375b4209013cc13bb1a32bdbd3ba63449c4f3f18d9a804e14f83c10a63223b932aed671d2b98c987266bf26b4a023023c98a3d3db57807242475659ebf06f23c921b899083c6725bf843b2a1c5e38bc6e82fbc6eee958b3fb13a8da7aaf670d2292caecd6881e16c021ec43324597051c9c77a411ab0005d83b6624846f9e735f0eea7508383fbd941e99f22ce13c2a82960a1c63961be12c3d96c6179b3ca6632fabfbce5a067d4ad01c599bc7614c0cc3650f0d64684a9383be62728363b614ec39b81a899d8503592698c98ac6416883f4b68da982790e4c79f7d3c6765064c69a1c8c91863ff06b72c06ad0870e884ab1cd070acc266b3487864e1267ffc8b7b0022d7f76652136b04b553b3e1a95496081e4f05d8ab53ce771b76684bba5a630eeba39d9386a1458049683ba9922967f897e2869babf750fe264bf7633a3926b5b01f6156f0a5c78328c6aab546ac4983bf4b05556665a3c7b19cc3d0ef34f65b3bb043b5cb594605701364dda6b1982b04ef36509a4cde57214ab359a37bb134ba967091a81b8e969e493ade401407061a38b99a6a0d41782d3aac24b17d5498e2bd1b09c86811ac888416750bc7a94a783b1b637b1684cc6e7fb46f0269755b4457700ce8f0250e5796ba16cca12116cddb2c02e9075e94470b4e410fd3ccfb030744838840f7202510c62e4da058bd6043a06b1512cb142f2c2246672e5da970cda6a4d421780a22e58bb059dd3afb235c2c9f279b13cc6f352c3fbc0470c90a412469e5c5ba84db80cf9c03a4120baec9cc65041cadba42dfd33cf62139dd47a9c53f0c4eeba075b206faf048a26d65067e12b4c06aa64370cacd4346cb7b959eab916fbca233a1293627e849c8b855660f69427b9f065e789c64dd28005189ddac16a2f0456aaf5891727bafde2325594bf5f81a301d20192536dc3e482eb37a395890cabd25a56d2ab4534b8e18ab0c8c1c1944b37175abfecf285aba29be69a3bcafaabcddab4b54cad721acfa4674c5212253515649da40c6a9a92aba2338e26786dc259788b05d9f5a58d115afa929d1924788ab74fcbb5b8a07764eca76cb9187b2f51aa10cc7b4549bb6aa876356a94410574c41a1688c926916475521c7c7238aa82b9176abc84e99278fcc9593871c24a659559ba915d01938b5cbf9b501d86c9af20e2b02f826ce0ac62edf767e03b6a4c5858acd98d08e64f0becadce50ca097c59f5a6857e0a738d574a9b468eedc984779797c3573670316813c2a994c5b6a41aa8cf85750cf13e7c746fea094a7a7200bce1d1e557bc084f8dacc364926385d966ed71939f118331559d56e63a72de86bb0dfec804461bc8adb2dae0fd6318a9da9f674c9b47e86f3f66cc5d7c450105316a4893db60d390c59ab679dbd10e3cdbe4268d649f40d432cd35d8c2 +ciphertext: 393c9377e58598b01344defdfcf73e6860614816b0e76cc36182c6934bd346b3c1ed18276bbeb5febfe4c2e749b036799bef518b41584c69fa4bebf2f327c2d59701acc02537328c5c1480fed6dcbbd392d61be4c5335514e19063b734792bec54752f1b7db08103a40d47e95e67842bf94038abd539f5c5260ad9a77f46f0f6b8f684bb0e1d67ba8aaaec7362ca9abbd27ff0d3d0973abf297a8f72f2024b2f4a1ef6fd1b5e821adc5e663595d431a8538a29caef9297e99dc6b9b4e029053219160281ae450a93dbde54c6d7d90206b1eaf673704ef2b054fff2d0384267feb2a2d5e3a9d365e34b27dea8054793725f0b89f00b1a42db6274a3797e051689a9c14faac8343ac154cdcba987935d79f99fdbf3bbf17f24f546fdd4a542c9ecba0b70e63070dc81df6275ab66fa6c421bb30c4cf9774b776f11fe038df70be62403ff3c2c3f107c38b593e2382dc7954319448afbff7a4c7f9b3dcb02dc1bc57d1d6a107fa9a4f628c596a409bb8b05e5b6404cbdcaae452cf536868dbc2e2821a1fc510228b80feb98c3508ef64b3cca80a435c6e3b8a21a8f85926773afaf3f7a66b0c1ce913f48ac5bccb0e0e1d0c01b840bced4d1be33a865e403bf993ceab8605fabd57d2217d70cc75e36a6d5d9c2ccb0db2e4d25d06f2a62e9bc385768a704e2e766cbabca78c478c7c5b046d64dfb1084d8eaf7a30c91517f1598467ed3eca0dd899c084db31823a4c451f8da2c0a56a00ae822da2f1780442bea11ca6665cbc9766198d15cdc8280a240756ddb5088bb181a69705bca8abe02d0ec521e3cef87bbeb9ba63399137f17de1deb8b5175bd114fcb48d3f0a818b7b078dd9e98dc7f1ec791e5a27df367fa7c19f16e60559824cdb8787fd81c67dc90f4835dad4abdddd222d36a9a6f03a475900886692f4b93afc7adabaf1ef7335cd9a04489ca74fab1446b85494a5c49c882b6cd4b69408798e202ca5f7d0e45 +result: fail +shared_secret: + +# Private key too long +private_key: c46450723b1c2a293dc7783a9f81b13729bd9c68c0855a2b391788f48ba3df318952231c94170bd91204ddb4accd4169c2b0bf5791c0e4a039486536e977afa8c7cc02c1b3c4a19d53facd9cf89ab44534db37ae3f76951cc4acd2c52c84c443486b9281c5b92f5c528366235416436a16b2fbd99066a2c8607050dbea1fe9c3b97ce967c431391ca22a61358248230aec63a41ae4a2388b51e95a4b60617712d1768f477b82f3ca3f25bcbc713e320203e2bc685d4331b76b0cfe5497d00b6aed242d2b93587d411129686e4ec5766e3b03fec6548f088e958b6b20899ea0aa2f3b0c502a00459fb9bd26e13011342122532959331fbde54e792c4286a5a1e52b97913b01d146045b4790d2f7c2a2b890fb57b6f9c1987baa2e9d51aeb9f87939dcc0d026c33cf6590ef48d8a76859fe62bb79337bcc2574b61578841892b42c918b513e8bb8bf8977385f6b2b90b44dafaba0e0459052c27fceb63398676a03300ec092745d532791066d45c0c5f4b2d918b73bf751b33ec6f9cb589fa37bafe42343a7710d192a54fe0a63b71c5c3aa5b0a17a6170b49228b15e6f2b46c79af110215079040748a876b449a1d9a59018988e9e254d9b7164f3bb2b87072519c712061b21a132b5eb4cd5e617ff201810eb84ca33331d037b714c72686057c0c066c7cd249e5b079581cb9c1ea4ffc523d14d6ce38449df9943f3ec82814745aaea81c1e374261a08be727c5ac9981ad841956e9b7cd14c2affab6464cbf6e5c0f29f21b11a37fd79024fb1bc9c1d375e5639ba5c50792a46880527eaad85ef3b709a0c15f15484d23302586807b00f6823043be4cd95ab30c52ce34412f15afcf249af6a1bb34568c1c91aec4f843bcb7bf6420af002aaee06a9854e9858b769bdb21aba3d152b3d5c1bc696ad556abb78706a137a7a70829e58c7ebe5c5cec429f7855897904360bb76241e5c16e917a2c3ac4cb1a7a7627ca45f908df2c2d19ca98f5b5b830d11e4338470ed53c1fcac0d558430b3693f0896c1adc36f3e44cf1e2345cfa8032f70b82f22852807342180d16c54f22114f9834555078bd537667ce9893bd762061d33f705912966c71d46574eb49008673256463c51920a9e37876220631f99338baf3bb530ccecceaa54ca3543ac720fef68e09333630f181d9da264577b2f8a76f4c7125c5265730e5153595916ef77932ca9d1136766dd15b2f307c7dba365458a4eba73996c391f0d77fcc27554aa55de338202db8ac41ec36f26664be6a0b84817979f800660704a9b08c54267fbcb4c1c2d25cb0d786dc57098143c287a5c23ed253ed5745387c0b3bc24349445833704024325889c9551342018332bfa14ab214a640ac830a07ec7ddd61001fd6878e1c04a80101b788933d391cc1553052e558165a6f5c498f2c067012bb43abe3a5c182a6fdd478e60516473777dc99c742d68bf0fc9232687470d0a39663a17cd7b259bacfacaaa9e8da455ae7a9f4206b6fd2948efa7cccb33ae85378eab5cc58727494e368d61c3ec845947577383ec5c5c0bb21791b064e0204e3f85c1b5728fecb6f61a66e10ba0f3a007a0ddcae16ab9958b07e3a021a32455e35505d06395f17d432d13b77d6ab58f6888a09322eeaa44292fa94ee5559d10a7c53947a22830e650c0897386df3a03d6f0313c9e94ef1360f03647e9556cfbf87c0158c7b655587b8929673c352d730205a59994348ad985a0249325e54565172c9c452b0a1e5db5143d69107142ed102993979262ab280a3e6ad43dcb0c14ac09a632d14602cbc38a9587c153a13b8c7994d2a7a7fa0632e723914bbe31d42f1b6bb2499457455a619c8b203cc17854de00573876737b14ab796259586431e8ceb529722bd06e21767b2a9e8a9a5c3e8484f8879ff219d1098089987857bd526a093a7f412469157098c00396e983d82e9ce92e6cf4650b3bd22ba985445d18bc5e4b836d7f5798a4ccdbed04a1e4888658b5c1424c1b968ab7a2b67d6f887968207d4d254d1b8ab8102502a9b0a3ac349de1c604d6424daa01bc0e69ade45c82405bf1bb49326073edd8b12386485e99943c1fa14bbc42852f4b9e0b31d9f05aaf067718ff37cb36b971b2a6d353b3d5ac37b37c224ffc88df2b44f0fb68cbad3847bb50e2bf1556533c4be0c8637a50f69933fcf61a69f34bbc3cb8174b577066447808aa9d95b5abe6356b622094561a617bc153fe0abef4793451623f4abc49b504dcb52c8a881357d53257b2452b5f8585498b281ba765903368be0973d511e1370639e75872a1050f8a5b4e9e095f3ca7c0d7acb9691621d0a9464b056b2160e061159f63ab4474c2edb67890405019c80ce4b94bef0349f575568c4e171b5cc0cd784cad0697ba7370dd77a00549c4f20091c2f3b6c4d90681cc30d73ab6b0dba661938ba3a067d7d70641d036a7ec94d61817baff62e8f225023dba7c8797e9963bdb0f9cc46c292bf148fbbda871551a116f781db3612edbc8bb0e63d91b9496f691cf080bb0fb027e63218f8fc49753aa6466bc33c3347273a06bc6005ea799d404b626ff9a35b034ad78a0f032a4977243e1d8839e13879dd78bcf8a42ab1a4c9a95924d9f58298f7ad891b9be151a41d7020beabbfb613bfa279c14676ba8e04cbd1f0cc80e344245a125e638847877b913cb6d8f0a0a6c74c7427601aa6251c77c5a82171567247914135db657bba29a6d65914b3a8b8ddb549f7750e8e03c5b01046e76b2382c1830e3360d4246ef9673d2625117da1824ec995775987efd56f927c67d2f775a2022f43206a12cb02b0cb508538bbb32054ed613a01d4198029b06c8bc4de11abe5aa1a4d73ace4395a98f630487b83f1f0ccd0da1829918924c653451531f97a8beb8c5b792436e67a3c84d544695c2e98490de6d458aabc38f1934cdca1086ab843bb2aa35bd3027b625229927019f23f9bfb77e4eac152e064c9b7c07647a032f99e59e79dda921b7bf652b578702394c10870caa7915f0d98313e1c32dfbabab0c60be894458c1619373889642cadc347b2e35b9735b36616250d4206a7e38c51279b5809f8cbc14212c3f5aa21243b6d85806b8cbc5ae87003ac283e4715328bbafa3c6dcee95f6716923bac8891c493aff594d1ba7bc51a1d19d26bd37b633337779c01ca087c88cf58b080a82b76d4a255905e926bb45a5c3dae700e25833a627606c75cc7145a5728597f9d07b0192b05e4103db4e2cbd59bf77b696cc177b29604c61b33cd4266b021abd8338a99af37f35c5387a6dd555a6d355279622ff5f78bcf8eade1d130bdc4549cae4b98dbc533bb287846bb4d7df0510a1fa29fc1f84ee51f36c2b9ef4c4b9922c0f2fa048e4a0e799cb5ae7111bbc2466b6f0289e2 +ciphertext: 17680d0ed196554d94b4f6b0955a4e9fa8084e39eb1a23fa1e36a28677e6c5ac12185fad84e3ba740b53c902c7da4c4159a444a8ac05a0e5ecccb207a691e30e6cb013ff513f17031a036d013c7abf43d4848464bfc56f51eeb3ddd05116294bc20df43b76bc255e722d804e029069fcb160d7791312d468ee9b1589b0d2051ae92f4f0953e989cd75839388f494c576e59d0a53b9920bcc59b9479eaae93ab2aa0cb64c33316e9311b389480520a0a3b242120e318e36512ad71363c198cadb7c2362eea4765e4ec1de2d60441fbcd2fd145ee8e14219a2000b1bba5d33cca88de2be96d9bb9160901ac37f4d35ee8d5da312ede8d99eb4d32e93cbdf4cda405aaea562d9ba7d578aa0511d00824594b5688754db24ef829870b1de02157b693905492c80b46ce38a8f05da74bbea4a5d99065b5628be2471097153cdc9d0bc24fcda546c9b4cd805ed2e8be49094c93ee4bee777e8f803877345234497edbd454d301d099a4f2cb93d1fff64b5132e7fd30b2460ccc09d2aad5f3c080e1b6d359626646711cba9620f2e9bb98dc378968b69f6c6a790198efe0e9b7d7cd024ee40d4bfd63e479fca4d7931eecb097af053c9bd8000e8c02846afccde63c155c91b91d0f46d05ae77a8c4899068ab451630027e9562d9ee236f8d8491448923ee11f8c2e2d4cd936ec261e44f86ee9aaaaf2ca76bf8059708dc8378c5967728bc4d3364fa02b6f07967a9aaf5c6609887143dae1c97708f7699b217af2d75e8a11adce10047d2f828ca6358dfcf86ab48afc3dd2444d99cb1e8e0f98964dcf506842b1e2834135646ec98ba4f9ddfca94d3cc378362def0006972785502c05e8aaecaa211e92ada98bb11f2a5a901de9f7c3df358c1751528baa905b507e3c8b64d750a970cf0fb42f59adaec1e4dfdc5b0dfdecb36e83e7869059b695739756034aa51e639f030a8712b416739150f6222af572698f00c4396de5b7ca93ce019aee7988821ec83bcecfbdc58014a463262b9f6888cbac367b03101c7e172cd9b6488d5f77ebcee00510d8d3c5d4bc7c26673f46ecd61fab3d4db2639d37cf3b0ca27f43a77f01a1551240419577225ed6dcddb409747f1561a1435d53fbbe39ac4f49befcd27f306c8df6ff0a4ba552efaea449e01e661cf08a88671df57b6ffa9fc6eafa4c88e3d98b2941871553e47292b8a187c70c6a2e75773130c2bbf5e16d73bc4caece7fd83179a3c99de2685c84b53d216b71e8dfcb889d0d1cea5570aeb984e6961699361794ea6d441d10f6e18c85d9b97ec009a6a8707dab118d56e319f7c6e4a17f2086646cfb1341c4b758146f6276de439845fd8e6677555000307ea364a4a1500d44eff98dc91210007ba6ce01d9b3a9846a6e5edd74fcac30ba4c4c244957ea3e2a956691a4242fd9423084191ac71fb06afc6443da82604cf2b77087b34dc42e36b72e360f1b9f36261eafd8c7b517a5ab20a34605e12f4e7a320522345f4d4d703427e60d1b63e1f576fc11e8dc8cf4c705e5274a87a +result: fail +shared_secret: + +# Private key too long +private_key: 0cc1c61ba3aa0fbb09e574014ca97df7e4416a759d76dab232082cb433c60fc97add814497ea9382898dc6b93ac1272e11e2414013bb5fbbc9b1975fd1e40a1b8501bd919856b40d99d6ae1a301121520e90a42eb3b5c6ea7b6f0487b14030239b99bb14367bc4e7743054aeb1a839483baec15bb6dc220db54b2423b6a425323adb9a1deffc29e9c34457a593ed381ba40a2f7a0c0425769a18b303625807142c098691165bb1ca02158b953a396873809d7a1ffce4c6a5f5c4488b7c28e8182ce07358811bf6686d078b7424a7c3848b5e39a3b1ec1119eec9040ef70330855753f21f9430c872705a5d22313343256c16037e4c25c5f071245c0a1826322ea1c59dc3a2316b6deff9cb304ab0bfa3bacd6219921306fca7c1ac808cf17c15ae16cc0b46b6cf57108b3b5881189ee96a5e39481ce1bb992d984cbb213a266850d10244f65a12df471df1cb0f6b6c06cf492b54fc6320413cd5d4cbfad0a709e9753ad06b28fb51662839fcb22d45e5b7dc2bb8a3562711d4cacac5c39b030d83f46b22a76ea383658143ae23ac8f897342692aaf4b8497fbea9a1e7b93b73975bb7c9c81042c5045bd2a8a0b7ef2b429a59d8e18a98b473256370a31944d6dc8187be2788db1494d791d916690ed746693641252daa82248bfc3188b9a4c92e099557e242b3b39841be012f2e09bc5eb9421875991f792b851a111839bd58ccf69319353b57789575b2de625fdf4680e95208c31bfd4c42f497b8ceaa18cc855a356e93dbcaa79c3891c24906420285917a73f8be798123c2e2d9890d9772a33d2bed641ad43dbcc8f9b47f15567cdd11cd36ba0ac1071b375183133019bbb8169f6077ad21ee11699ece142aaac57195220cc85244d47987a46600c77aefa6c6c60c29e4318544be2530f57cf05a44d366924d788bb88279472a99a9b93a2ad02b9760a8399d4ac17816072dc060084b0d243acea68c18cd115c7f77f19243d43865c3321c77a8982f16ac5e5404749004dfee959de8a1502283a50c88d0d5b75c6b8448443c3af2baf788a6d55c368ef57370c69c4f31846f809af182b8a112c9bfa2211c11b18e91a3d8c9363e779a28b25b7f368158ee29c69b96e361a61f35b021a183abefa78efc330449764996b3ca047a9ed8c273be7a96232aad975a6e8f20ceb157c3f53a324b76758ac9b84b70fcda9b2514885b972c223a434d80567d0a0c82c1767f6550daa566d60c7c250c01782a237b0d4781560b866dc2f3c9851c067bb7dd981d9a03fe0178e85270a76637450f59ed5920855c10aeb36c8c5fc61aef323c183767160a02832b9f7bb71c797604b5635debc74910a555753cc37b180d55014797a0a5c0c5fab3150e54b72569302b85c0537b71575205685f966cfdc631650cdc757c4865757e98911ec56838eaa8f4ab04f4ae8091b9a5699624c03d71ef7484af79c6829353b3337cefde7563a9a49aee4812d158e2c88556a4580855c4cc24c2632a361d74ab05fd7415e452f9b6944800591e791725f6a3565482cc3a3045f211ccf0bb0923370c9a6623519817302584dc5693d033114c13125011f5125118e6669bb8834ab0165e4cc82a79ca3de77171021628d56a4afd54bd0f54896047a9874513109ad9bb0ac08f429db211cbb83900c65778cd19d8e029fae74cebdeb07125502b5393fb798060d310db320994d530eb3bc590c8a0e983a2c2805666f6b71c52c96b8d70d18630ea53c644ba0802ea3bda814200e28a6141b40be14a57ce23fc9ea7ad5320518803a3b781ca3038930a45927d69b9fe75c06a985bc4b0b1e0848cc4a107681b78de95700b76415eb6a15ca05537ac59ae55e1b4bc9e7ea386957b028dc4a9fc8c955c7087eeb8e6620ca110c98f2e411407cb0b0c2320f79436c7c5741d7a81f808f77b9c9ced2b81b260abb849696d82f22f93c234b64cf5817c3ac483cf53f051b1e661c7292d19bd8a15385295561a979664b4037139d58c163fa9789668c556c4994b21064992b099b899a1ea2b83cb90a31b5974967a79b222cb53b32c8a85120e30c72a106b69b1d39c5b5fdf4bd8e70cb03abadcd42411db26568c9bc09fb854937297c0a17b8f25330375a6e588579daa71ff9982150cb58c88c70c21bb084b45c2762a53604dcca0e8a185a6ed39896281212f25b0ae50205178b1a60394bc72e04294bc873a6e9989eec065685a8263591a5b1e46fba4789721c25f4cc08f4aa8c30f20047f286fae16c22096338494e75f17b5752b8d7163943086053f5c5931631e575ad6169cd774cb63e78a79cbb4f28709fd7886af08c222c94503b273ac5aa0f51c1becbe62079b83e4903a14a5239f948546523b3b4ab7083571df235a369c628b38a54f62832f53412e52568f0d23af6b4877a164923e22d420287d4b20255f45e56b8afd4b059dacb271ba0a5e2d2543a638ceacccca60c0d8cc25c8ea97fd6ca5960f0bc2a0a5bde7c403545537f7b7f7d43b4d7a618e3e97940948c0a21184af29ac68a89ea971b1fb898398767ccfb572323acf4c57609b0601d9043fc1a164a4515e8b56cc0f31f908666472a00c4ca2f647baa1feb0df5a1348496706d28736e48cad27c3284c74245137a361549a503559ff04a5d2856b023095a9068fc24612b8872d3c4c3748ab1295b07d42598ccac5928ecbf6c01b806acbc6d8714d728c7f5475807938bc9e2694cbc0ca625c4f8f3ac258646ed971a403a3747d47550d3a02dd243a2f9004798c65a398962868f35f81fd4ab8ec18864d2759e6ef436166515efd738398523998698f04a2084a53aefc00396269ccd31c65ff59dca22b5a2422e79e24cb0973c41843095a78a94263235b8c52008864babcd77c4635cc36d33fa2ca951c713fb6ce9d4ad003c76a28757a1829177394c6439cafd9003f7ac02da9c91950c23e1999bffdc7e4ee35fa787a461850a4c06b7ed903780a6a185a40355a39b9e1cc49f069ba238049ba867c09584a6d1cd1ac57533d01376537f28fab46efc00727580a74b1eb8b89afe1062fc648e24f92f7a9774ba03607849c3f2c9a44620af26d746ad2485b1c86961dca0d960742b4aa7210b6d264c982b0090ad2c74bc19c308ebcda01226f6ca9180bc58aab01bef6b743bc2cbba1904a84677b4537028246eb0c61aa7d4ca238065abb99e5ee0ab1cc429c2f64f5e2b9bd3da2c6f145f1749015a53ce41b633717a3d718a5ad6616b5b736c27155c7dbdb1316f231bf164ea9f06b3250b9aea6506300c65d006b5524a3d2b61abfabe9625cee8bb624e907e65f5879ab1459a275f2d9e924f014d5cf7f79d8a46b73f256d19beabc074728e12fb1fdf0973e31cee5b79b48855c1951cd3813999801753b8fbd824565da62b7d81165eea69fbbdaa31f88c +ciphertext: 7fa51bcce66b2fa2453a5725e917ebb7e6041772fd23a777651c28e89df63d5628daa2e1e438fc9d29601dea612f34811b884b6c3c97e8976953228588cfdf8aec123aad5062d4a859d19cb2f632eb92414bc8944c02e41c9de410d20d627071d9205cd2b011425c78cec26d7eaa53c1f54c454a331f325b4d70560a80b73a8075e21cbf87aa5732e072b10b6cd5cd94e0a4c401934a6774f64d5d6cffef023f42f9e578ba34df63859d9f911f6e92318d29cabf704f1ae17a5d21c9ef6a7e8d8590045c7c41dc515c625fb31cdea7a9bb1960b0713c21b89e2a8978a8704d4fa519b5d415e2c544725bf502ebed2ec4b5b8f320f39e14eccc6fb31a5252d7aaadd68b6dcffa29e22c2548865d2042d5c7b79fb7b009ea6dadbaaf03dfbffd7077f3edeee1b06ddb8b61d37fa662b147f72c74e75e31633a960eb5187fe0ed277822691363285f5e8512907e8ad5be6c0679d48af6453cd5b68e8a53efdac1a3397e01f7880cac5db9dc5dbe0c195d2cac8e8efeefe7afb04ffb5dfd93639f2b17173d08e95faeccb8cfaf97520adb0daa25f0a0152037159594017e32287395cd3f4f10a3691cf4a6a5d0faf0e6f08a3b1e1897d282b1d07a690b2eb5d20f2d039c23bb901d6d6c2bbb1ab33116625b682280f3a46bc300a58dda7bc82e738a98a113cba82a9927cabc16ef49276648e58b4d4551fb8020fd16a9c08dae03fa28351b5bf782ddf641663343f38bb68c06e1c4024be5342a04dd0bab9a32493b89b610ef4b87717278fbddcacb90d7a8606a3666d68729b6a757a08cdd981ab50820c0021ee5eba5704ed0df25451e1458020078d8fcf05300a5d0e9dd883a6554a2a40a0035bff4e9c460642a73ff44808fd0595e2e054b380586df8246cbc62d2df0d0447a455d594b5cb0acccbaac097f4a9af43d8b8a45575eadcad14165e420892f254e45000311296183f90765d1a83bb71537e27088d0031717ec5accc29d0df0c08c0a787d57273e7ac8e4c21314c4c466e32edc2dce92bb03066958a28719cfad1daefbdc5784b9c0cd57fb1f4924bb03341dd4648d6700e5d14d791dc64684a8e2f31a8fe2c485e70d04067715c870ed6f201a546a6d9d254682ab8132c1dab0d22e2656497d428a0b63814237327bb8bc81f470a15a594df064bafd919676e0b92afd7fc8a288d8bd91e28b86112642c0be6d487d3055383552139d67ba9777482979e3960a187d97fa36513416f03b2191cb12c011bc46bb513fd43bf3bc9e04b560bb9683d9fe5cf3239a5691da548adc84287700a52bf910b570ba5d56ad96f11c2df7fda7cfa07119ed65dc4dda1a01b797a455b6ad2c9481a79a25c9327e7eed218eb96ca60ecb46252e05288981d8beb3f67e1f0cb1dc5f86c3bf04e5f13efacd5876137d986af6084ad752ac8e02e5cc674ba93f60847bb56bd879cdd86e2dce6bc01b4435d688f67173809e231c3255f383d031a9ce53a0003bb482b763123bfce23ddd65b0899d000d0009e3661ad8edd4447c9c926a +result: fail +shared_secret: + +# Private key too long +private_key: 472aa3dddab9f8377dca6495a321c3afe3608b01a7eae63bfb091045e9b0ef33989cea9af054bcd3b7961ec7b21f92bceb100511a42f264503bd885286474f74f47723ea2e878cafef0879af17c296d18827f08357fb27d6a45ccd404f25e82874410038049431053630219823b27fd77524e40148d518b6adbc39c21ba5f0644510d078abbbc725cac510a3b17b2801bbb220c79602c763623a6c0c69d70fc2d05e70b898d8f8862c576fe74c2857a4acfe655a9993a984260ce4faa3bfdc36d4b1458bc1bc33c2a95f545d0b318eed72310ebc57ca2c393484aece8b0fbd99828e2025ec592b3427b212650ed7e07388769630927b8d6b674c4aa013a0b7bf43157032ca478c3c7a1c1e5ea106de8a226eba6fc52a53770b0d79a8b861dc54219597189b8f30b154bc749db784a0c91caddec80273c93d33a9b2a3e4778050b0aa9430e8076d8a7958dca88a44e0111bb006345102c668c7dd35c6444a9cdab91d5161647498355c17328a7a1721e4957232b82226b29a735315585690820ee8377a4fe877d02655a0f59aa7e9337ae97e313b242ce23c59531e5dfca74c9167c32bc973d66aaa645dcfe6a058218ab508838b46537fe822f7d036773a757ea4b4f9d5179501a6ee31434f31c499f36cf34bc0f6728a28146bd5b9b665bacbbfa8751f0275782a897e9ca48126c0ea1a950e3bb9eebb8397da3168e75218f97f8e2b0a86a68adedac733138c7de4c8a1609b49bb7cf9aa06c6f98f0294136bc1682233639c969ad3641ddac94bd270614da96aabb1b20c35631822c8f6c6374e9052b7434c7b2949af840f90d6854b90158c59727c6b815a2b0085772b9f72098edb2383e2074381cca1ba285db45b47345fb2051958e90827492a1ee98f5c479d4201cb609b3fdf033eeaa0762ddaca1c270d860128cff146297b14825a404c092260103998d622a40c5cb37519bf533f18946c830c36505bcc163cce505ac2f4ccbfa0a9600cd7c5f7382a9227a94055b8b012179a4633a6399c1bf737305c01e0e3cd76abab5c70c9a8071db42487a31285c38c5e46038c802498d14946c75148a1d631bee349b81b9f68eb50930aba4c65a688652403f125aca3bcb7ba66dedbab21475a7189a967684361420712a2827f7988b9640768d45aeab9cbe4d5415cc9310b946aff2814ebd98f75999d062228c8758666f68287f773e5548e0f845d8cc13a49341aa3cabc65b901ad1898a04390a4796c349b9310c2cbdf2048639c5102d43863375710954db7d97b42320f91658caf665a4c0bbeb0cb9863a4c39e5535608347d0261599797e87274a7f140a3f639040ac7e72f5cd62b8817e2a77fe818fffacb7b167518407a60f180d96f2990fa88fdf86722d4a3f0c45ada388ae5963473c162cac5586cc36a7da945c2d042d426392739b7e1ea62f5b3cbf4f7a35a18b7e5448580023a6c8828b66216a33eb6b5c0a21bdb4ca7920536a83bc0fcb4279858a58215b93bc2ab1a25d3df18b3d7407d5d39cf1b0bf586736bafa8df397386366684a7001ebb18b8b0467e0f14b4a87adfcc75b8f471e536aa39d7298d2306158a87e89005d5ac8a4a6d0210a927c7a126aaada46491163916451ee2a1e156700e265b3a6c63905f9577ea59d574108f51b8ff392946d7a6e17ca06e9485f78908439bba4aca66ff697b532e23663ab988f25bef647391dcc02a5747902c104127168bc3a0d11b1ad794432438081ca3a42f0cc9f572c63e6734bc239627cb68f2d2009896b42880b0258f411fd377ea21792fdac62cc6c5f4fa28ce7541a40aa7bf371b4dee939b09c9a6d272a77c3258272ca9ddb45396c1175b7c4b9a8c300468e07a30c93e50aae792e94ca6e8e27a6c092a6fcd183648a79b1409607d67e66a4ca64a89b3e6634c0b30ae71c4d3ea15345da7bf9f1a7f876427294cf45449628552e2024c28f38bb22e24be2090065002edfb78dce08055dabbf93d630673ca8a51c7ba62c5c0f25c21e5a3dff947504b09094f82312c7b9eaa469bd96344467713d6b1157f9b49cd054235421c212cf24fb15c141068d77cb2e0c9d77c1cb37325ef70c88930572ea38844ea33f0822acc268273a514be98a22ea5063528ba605259309a0c0385c6cb3d8bd468508b02abded183ce0e62267d72f24d73156b74805172e6a76396dd64bfac4cbe9096d482a8d0f519d0d200f21901787f902d1c5595a3a8dff419520749e429166f3f48164697d8fd32c7f82590d2babd5e34062356b7e18a6aa785e04c2a9ebd66b8e746a95124d45b143c7e8875ad6026520021bf2478a030bcb7125234377877b07eca6095b863096ca5f87dabe1f178171271d9249499246093fb6bbdc99aab5774e945b649d9b5e965c032bd88db623b45498807ca582bd91c039638fbfb080dd49120cdabcaf7280d1b3c85ce5c98f0a5b1f3494e7169e0854a941e3ca06e7719d749f29970ef78a986a024a2a0711cbe448945451d2c6493cdc0dd36172316800f2717e8a33a7c4c6ca0ea54b510aad09c225c41c285100753b709a6942c4cf4aa2a68b01c5155a1d24b9019894fb255b872a39d29609294a580d812d7ce1b077b926b596a4f0094cea2422eab1229be255617103c6b5b330eb77e705c155fa0b191b9ebf81c90fdcb3d152bbe8196878d6c8b9c66e95a5be6ab967613046e99a558046cbee8827c53988fd071dc8eaa4b6f98f3b906fda771b390caa396932dd8747acd731928a4570330aed2860be025966198e6c554fba1c8956306109c5af3a196d08f0625666c17cb800c579b8ca0b86308a2611ab601de06b2ed739e6e27161ec93afd0b3ef82a31b256b48e6856662a70f6112a1297b86b399fe4b52f6514eccf265a3137dcaa11286b8555c87196971a9afd8929543c123775a8d91cec8d7498df3cbfc7bada2b6b0f7749db1909812eb62e7a54d6fa46e99ca628fab4094101d50378d77f7a1b80b9e6cf102e2014bd0d51bffa2364f52b5c6c39da34343422badc8e81e474a29d4cb452c415cd94bacb25ac6ebc52d81084f88f5278f333dab8082cbd93a2ac7b84b246100eca0af96b9b6ea754ae35074182785b45b5350b935940a656675ec884a747210854940a5ac08148cbda23b7339616fced229c098c44f78b7b190524ec034b433b9d78c5026baa632633f4217407657a241132e2f6a8dcf066e71a2afaec8423fe0a04b403b8dea4cef3abab517b264131b8213b4e52588687d3d1195b171f75d20640b44d597320a4afba95722a895d950368fb22757b4271dcec084256a59f162846115a5eb582f070a88040cbabea78186da7396ffd939addb0ad3fae21e07e1ae91c5d95908e2a778806fc69ed8f7b6c07db39d8a24a476e37ed0f2d201ebb66ba71a27772a19a3783fbb16e346a4d4 +ciphertext: c7224cff9e05657edd50bece56b015a8d1ccb1e2dcc4bf51b4d3136f8674d289481b578334a8046003c85f06acf32d0b5cae4af5a4aa11d56825b704ef5dfd4801f8622f3d6a91b38983dfad5ee248b754ed533053e52157605cf2a0f5b80dccf1718e58d6b50195a9037da0c495d7ed6baedf912cba4e0f46e7b2ad4b2708f7b26de261c7906db9d552ee8d8cd6fd4e3ceb47a35ce1c669914593ee374ac0932cd1b5b8f60742ec17ef6953f7d69366affdc6d9901a24a9f81b22f9635b53a8141624f9f0cefb9ef0ab2da6123c0a81cabf322d7b1459a12a9aeb64de260a5aacd3d1a064a07df9c1806f67927484862cbd53c83d28de9f394059018c605fc9a24bdacee729d63a76538d061aab2bc723527d00c5eac85e0bae3c6da5f64d6a2d5d249e91a77f6748c9dde4289006e01bbd7b6943b6dc844e48f60b6cacdcacf324c466811151e214dd801deb517c4a9614ff7108a1eb5e52adbb1ebdc2b83c56056752590fbe442cd78bf13733e063754df73adeed48add5e9414cb2490ae2c0de0474b01c6a6b477eb852d379294d5ab4fb516cb140d1664e2d7463e01f28693c8c5e0cda384d673dbc8b09009623f4327fb3c2064b03f052025a59af9cd90b3f8b3d00732ae67e18186b9c0fb069d65f779495f93feef8c041885dc8806bcf1c32482e9e5be9ba385f297e904f8a54cd0bc7d5eae8ae3e6b4d53ad0ff4a5a6f5f9798bf7e6c4b17a9fc5b49a2ac489d9979238fcba9d7cd51da29baa929de384a26cc7fcfbc0333154a7a35e56a5a558b49541a8d53bcb5cdbd56664b0e50dd49c4727d786ce08597f9d73ae19a1ef7479394cc60bfec69f533845f6ec9d371bb1c806f19f708d11efb2f7bece174eee6ed85a9ceda4184910a8fce370758096560866be23fc235c06d8e1373cf35ad367daa527a72104ee28a41fab08b415cb44a36b21bd04ec022e4c2787b6d91fc31c374480a8b92812a49bc651a1a7dc3282bab377e653c93a36a14c8a24a6ed3875180cf50d01e2e0a3a96f1d9c523169abd707007803601fe501f1c6b108ce242a55011fc50bd9aebc99cae5c61cb0911f444c61d5c23f83c0471828b3bf60667493c914996e07a168ca38894542e931b6ba8ec3ad5c3e37a19b01ad19c7786ee47e6136331e0863516ae745042927842c336ea8b93527e97e300ede73f0a0523d050fcb338c3f7524e0fc2960a148348cd48851453e29fb95fde84f9fa750364b7dff6247cbd23a1a76af04f8d4a57db84d785489990b41eb5506457702c27f3d3eb63a6cf1a17453b920213cf9425d86cca45a835809ecca64d690b74c2e46b0be3c8f8182878d84af5e6873eb69f39473360785f94ef425a823f9feefce7a3ff5ec1d30cacff8e8725e234b3f0f6b491e3cbf5d20486da5bd77781a6f6ef3ff753eebedfd60e2105f9adbb50196689438aa081c33abe763c60ef18d7e0bbc53bfd8f484fca6953d7bae90534e453bc2595e44d79a062be8bf1a1997f76d6862914105f2db8506214927e8b02c +result: fail +shared_secret: + +# Private key too long +private_key: dc1942f5269a8ab282175231004076d01b88921740e4b5c083b2134c32b4879a767ec18169811097f8431626072219b1b51a5b4655107e6c06e616024e932933275e51f147d7f28e17d25f39db9ef7b526c9a64b21ea29d68547a1406c42e6ae7233be1d3634d28b717ca8ab8eb160ef93af4ecb167f35628203539669ccdb90ccde15a51b2287110b78dc9c30ba288310a998fb3471cae81195c8bfaaabc00de7af50e33b49812fd77818555691f5ea01f0f78d7e344c59364d54d72439924071632ae027aad56a0e6d91a3bbdb8d881ba9c3376e320a8d4fb0c75932bc1f46c399d9ac09072c20653a7e71c7a8161cf688c35ac51789913c6cc5c99d5522de758da743890000ad2c32a6378822b64b5beee9b89353701d636ab0bb836faa4e63314053174d3225027cc4cbf1f80e78a694d6f01daac95e45927716972da89a0d27b26c2a52112fea4649801980db1ca76b792025b868f2a2f53bcb50861df38091fa505fe13513a5b176e1e9153f9042e7839e4b1ba13d27121cf396bb23423a2b2e6a56158615445032446712ad52c98909d27dde513f397931795437f3027e18385f46cbaf014c89a69a65ff41021a581c2b06a3efeba1f3354310363f4149bbde4375b37903f5240934403edd8b4e0691449d184e89c63bf1716270403964d6639d2b51fe05a86b54b2f80ba57a4509e9353321e12677701750134581a12da3e01539952395b55085f22be7fc539f31ac3ed1bc285bc68b467fc12445b2567d67dc2f2f2c82f7e0a47dfb479c4b46b9e6680c50b8c6c0490e538410f63cf5c85466f9a41db1994195a63182498521caf7e362762900628687af434d17d556f1899eb5984dc53754e004858b6537fd224187206aad8c35b374a3df40b97bfb4c19300ceeb28580416fbac5114ca80a906157131b9af1dab9fe6b206f33068d06435156acd1d84728fababbbb961860c6e8506a1ce39a50592f5e66c855a992aa73aec9658571f023278b592c0229cff575a039c77fb91e44fabb1a39c97ee3950b0a9ddeab8239d7cfd3d807134c7782e27aa406b912289852d53297dc48eea63f0767250d429c0a66861e30ae735301961cba066a7e8fa98b1e290ce531be7483b975506741f49dac762c51ec007e31364f12ad064c19ee356cd0324f94368d9aacb7cec21cca375e45138b5248a9976c170cb4af5facc4b9888e1e38387361c806557229ec385360275065259f7a754c087c739876389a8f48e289ba2709ae8c6f192027c6ac5a14e2c92e144bb80087a96b5ff60b304d97120be22ae4799af1976cc26892db02bbf682cb5684399354ae76e65e189c74f2f5145c12210d250888d2a381565f4a510a8ca026a958471a8cca11752fe575147a654ee330a9db2a01f52926eac461e549cf9b085505f009bd2b373be9578ce5c4708c312d274fff350e8197c34e5c595e699493252a042c6cb4b71c2dc49b22e2b8b1ec82330aaf4a0b08dca58fcf2cbe178b588a401caa6938018acff1bc11601a96df116242d0c03662bdbaa98b5c45070fe798660b7bd0a4bb7d4877eea1c62b17894995602ed72e84e07f0105994c4c0e557977d899aa3036a225a4047f346952f223d16134c6c5424bc4875e704156005c97db5302d8082e9ab208ba70dd34cd2d4247ba3acedb945a68ca02c285ca61c07e0b25646e72a5647a3eff560932bc0c03fa22beaa1beb7691d4960c7e4592e1487073d3c299bb1b5818af80569e6d4129cdc21cef7b76cc00208723a494c030d8a045b9da9f1573a19bc940588bc3325062a04bcf5c1cb0d6e96cb11700c6323a84101588887ad5ba3f374aa196b386ea1947708b469b91be8c4695f3538fb3655b5a814f25629e34b29147509401151c4639b578c2b298a7cf9de24b0aa3276650bdd2a24b6dd579a2c91d3fb31109258a61250a6593a28f1440da5286ef386ad9db2a9c6324688535a5fb66351bb8d5979988581d8b8c20af53021cfbbdd5d793efba7407257d1162531087a0f3a102acb49612faab4ac7827fa31bcda42947155966b5c411c74378c8b2a890c3c6046574a5aab60537271cc20b728a54c2ce9ba8a289946f30d2552d5098a758bc9f667907a621d673a86ac61cb6c08315a001ed71231a7a17781442d8179f46a7a062762cf9a2a12760c900458f23955e2b19488df6c9ffdbb63cbb454265862f313acb7b67a43839632b3789f4bc806c9f250c5a7be1c3543b8f7e59811c0330f721459a28b6b6582b1344743b8190c361b5ae6b860938277715cf949cb328ba294dd4674f7336a86c0d8e026102ac8b45c7a4cdd7cbf3e521d2427864d921ab2b56ac224df9287ef38c26f99636a05010d4894e7d43ab73a31272395fd948b6fc682cb3e751538b91add34da1cb77efb205ed873459617d5393418cac5e963b05d9c17afce2a1d4817c7ec8cedd4c128d03aedfd4489397b1dfa568444620ace8626339ac1f149a458669030c66c6ab35c3c5166ce733eee8caf7bbb96f90b2072bccf33b9b0620a79d2840dc015f26e14db690af60b10adc38097f81b81b900da02bc21a965ea455c284f02b9f8881b342c53ee1c1ebda8a4d6972acd990c744c6d4302a7a5195a3d79dd4421a3c813ae8db7404f45669f43e6810c425680a2168990fb08867a0b61545c20c98c434bacb29281416522f0e75037d5436ca158b86c79307089da02258e2a6c663885e962a43c69c05a8d277345b6d8b85c7ea8c086eab45b65871fb125b53735dde0c330566a336248be6ec0465989158eb9560935133e60401e688edd2bf96e9670a6960000076b19279510779de4c87a8da98dca4b87d11b372166f97639e77922e74ca359937cc2edb1998b245ad23c81d44ce17c2cefb42a850e7bcf8b4118fc2439fc27146b6c26184c3aae95db7857dffc30b10bb48de657975ba57fb4ba722aac62a73c909558b06d751e2b1371bd79be7111f26e1b31db30addabb92f4219e965c74be4108a6ac062c885eb83369e378a3459cd12191517884e0b5aaa429363a5b91a504bba1c28914b701b1270c693f41fabe318c25c747f5c2714e6b253f62a561c44545a2709ea767099b8aa65624e92c6a4343d5b786595b4809638909a3a79b25289270a6cdf035b2a22b164322600082a64f6374ca32f68cbab1a985fd4551b5d617a2a1b6428a256bcaa2d5e004865058e16128ed03149557b6d291a5e6de2be8a363f619a86db8758000c75ce88dc75733c6542616e7e04c7f2b8e9dcfd44fa3d25970fd2d0bcd302fedd590893966d2e9be499a422ca81383f85b15a4aeb9b6c7d00e1724165ae40f1b528cbf835f0e64d787a09c4e5cdcfd910d016b2f3717a98e7bbab9e4483eac9f365b9921888544812339d3a203c6ac4 +ciphertext: dcbd91003dfa696cb94ed5d5d3556e95d6d2f7769dc09ecae14a20828a291272dead64f7cd1ec5054c5250144f7a217e271b37f16e12ffbefa09c95edcb80dc67f1cca10bc3b3249c2bc7aa3150854ef8b35c86a0d8ea4d90bee72fe032bd3e267079189f120f71d36e75f052f02068274383666dadb4925f557e9694fd03820222f80528a95d8d9009fc4da5913d77b20d5a973b1c327af7f7d6ecc2d96edd37ff01b0ea6ff57e7ba0ef4d4c5e66c258c55ec5651a9e1aed311c4a3978f6088b785e6eab416b767823f6a454a66e9a710babc71205e88e30107cce4779dae3b158c057a12a387ce9f19717ee00189da9c1be736f5670188b00e74876612271b87fd853869b097dd4c127ce86b5e967d62f800bd59217cfc7d7b991311de4eb7e62357f313a47d055cf5d39b6651ee5c598833a0dd9c9913061cb4d1d1382f506004c94645b77e818b7dfd8868c91e8052391d3a3aa90c965ffa7180c1b046a35dfa5608400723cb507d67b47dec6d02d299477ffbb0f04e217984c074c6e259cd60c42bfe5408418fb41e17e868817c268f4470eacaf71b51ca8577429404f95f31ecda57d6f329aee695230d55b3d02389a62ae9dc35eae38247ccd021cab143a1057d749b7c58080b112e2943295d0a5e67eb50a10b4c1b674e39075bfedac748a0d04d2b2fa9287a1f57b678154841eb3b30990647c26399dcd0529b28c172f52cbb43d5b63f9e3a2bbe49545d91efcb042d1a70e187986e12d1439393d2d97a2668676bf510b40fbe04aa7a110d33964e2c19560a0c2343c4ae31fb21c1e33b5e63f2f34a4e7fa5c05099e8cf1d39f82a9ff5c363e541d76e0ce006bb63e59fed90f927239cd6423b57565549957ee356dd86cb5bcc3daf04f688e87f33bda03999c4f493a792e7684eec17601600352dfa843d781510e1dd2e6a3f57672465e7a4399c6c55398920ba8f8b5e01fce45a08ce9efead33440050af8e449ac0750f82d93cf9f076d071d84bd66cac6c3ca839f481a1778c951effc65ca228407b40f36b3b115e089c4cd489cc8257cf269e7595e9393803e4c41a425703781eddd0dabd49c11db8e8714e967d9b2e57d62f959660bcbb0ac906d42ce21d9811328763a7dabc07bfedba13b500116761b5104a85b029f81e369f8318a0de69444f21932401bf8f0363ae2bf75e5ad1ae46fd01111a5d0c127858c992cd86920eb4927e2d4bec364d2a81252cfec2e9a6382abb9986ef49f3aae3ce0946c16c178838054d5636624cc1363e372b6d31ab0cc1283cfb2f517b385dcf960befcb66d752c834bebbc617525d39b80df62a52600b5ff9e264fa9daf5b0728930ebe3fecc4f50dfddf800b6693bac52964b8b92b5e05c734de8a82d8fbfc40d8218327c56996ab512f1533627fffc73f7d487b5cfa38b78e02248c85eceebefbafb371cca88b84c63eaa63d720824cc369ec88db55a290089d0155f923a183db8a09c0c258f8f7b5fa9ce1a5055e7d978afd77e977adebd8794f00e6577f8a4640c7 +result: fail +shared_secret: + +# Private key too long +private_key: 59639c74c22e319888131c82dc48c1958bb00b3195c7287a2b7032522b793bd82758f87180a32e29558c59e2bb5f477b472ca37ed7c018952439898fd7db680674723c387a483b4db42519212017f2d8bbf603b72bc0c25c3269d1c366ae8a04bb4b7d1a2237abbb001de23acc743187f14b2c679129c7b7641023a7b67b4e34901191a43b2b57ae8baf7e38c280b540202783fe66b2110b91c2f18bef931e31a22d8f617b6a53694bb67ffb8b51d98c276f435823e58ee1eb747f4b124f3c35b457816303807e80ba55314fd25b7b0bc456430b8209a4b21a87c777a1ba17c60a32811b55ea8b8e4abbf4032dd2570e3e8192f1e3b89e9257130a86a999354d4275db312170d528a24394ae113ac03b60375c083344177309c264a25a6fa1b04db73569794bd52b4b63121af8402c16388dcbd23b12f95461b3055fc9b4a6b2187eeb0e3899ca914845ece68d51fb39e1c277a46304df9584a38946bb4221bf6b37e1b269468501d11727c95425c4967905101f79f9c0005ca835aa9dcd7ca7eaec14017637ad49568edc180130adce17c11f412ea16239876929914a2bc90c7b1161c4a1e1559f649118f7964bf708d39a705a831fefaac442973491482169223611eb68f6626962f20dd0c9556953a3be26bfa491c2dfc93da3496591757edd2c6ea7d29683f64bcb0904fbdccff06b85065a8e23c369a6369f993264f58acb7d717a3bc70638779493435fe6c99349c855a687c51a5622c6547dc3f583651455fb2bb076eba8c0b831c8ea8b54330d9c4010d8e443a07b2959f68954e5c3cab72146a73ce0b46e27727aad274e20e2abc4f41312c429aca5a3f2b17fcdeb375af4117ff13dba84427b90a4c0f6a44ef0a7e7c326cb119be6ea5da80333de525e50fac95276bcc5e9384fa683fb820d67568402f87c8f519b24099c38f11a5e140454a97896376c681759c79323d3f200e0a388631a1ace40c784e608aa9478802b3ff0fb7bd904722968be6480560ce0c8ecdb3c3fe8ce97b0458f25447492873f705c0f4b52c08181a19573e0070216c67022d79fb0f86bbfb3af3255373332312d42c200a90650fb751a39806431c1b6913fd774215ffb4ae7b6b9f854cedb3a381a2082611367c0cb1413397d3daba2aab8b1be3a26e7078ce3223686f61dcd89ab11d774183b1b19b1cb71db0a58e17edf52a4aec478cb847cf87594aaf41e0d89498c835ae138b566a78ea741265a741d5ec736215b44d1e224a1e751d02c1d3c394835146c375a1837a186a1f7a2c416091f6b30831890786a4704eab687a27219430df2433bbfe688d66a8ef1d05190011835899b07dc5faf0c938ae864ade2c221b2b7cd7b950c32602d591803e030d2d7873439a344fb85c1b386d39a4f3e3893b122c62c05bacc3353a559c8240057301740ae883be5f7243bf96b33bc67f1858e8f5aaccfe0889fc88e40ca322fb01aa820a5c87714cc43a4ab231222d85d803b55a54495d4b93e63c9206b01b3ad7800d544bdc740ced95417b60aae370a1d97c2adc74209b31726d1c851fba77aab6b914eec556b5c35e5da3c55e48363f42b52a8c393eb8472757dfa6a324b7b88bb149bedb398c5f590e697538d1514f7971c4757818de7675d8204b1c6175f2b140e678d11e6821717b8148a5037062f777011a83273fdfb4fc5893bf11bb5057c35f4f63ee9d172220842628949df8491c424a9ab855ce953ac1fa5c454653ab4b0a298a3210044cb06d39527a4333b3608ced2c05863a749ea950c5553d3e34aec02b7286587c3a468db16b58b6a000752c1659a8c120b0bb00a09c1cc7a6d70405a612f09d593646c489e2c8d234b809fc38b653c54db9a965e549f7ad0c871301e07dc71ce785f10f56db5d44b8d817a8e272bc5998e3b2b5b8e2b8e9a9311764897ad6a4a04bca6a9146a637509a82c6c8478ce4d7c0242894936829d6f32732573039151510bc8a044279a71f353ef992996a81eff98bddfb45c651498c4f3010ea4babcf5636bc07099a3760b03ca1192aaefb3322fa3ca1ac2cf268285e6ba594bc53903e8cb9cb71c89182dcd47910abccd9546830f471d9fb41566414ae2b996aaeca78d9192a9137f58c8532a9123510938ced61d33f5b85b7389f5c4c1b1d86f23b02fa078bb79631b06e0ce389622605b4e9b4322462141dd2a0357fa923833c646454ff6e65b8ef0570202c8f1b43e02d43529798422c9957f57963171aab151150576a38b5c0548528fa060b6dda001a2c48d45447666536d01257e095106f34c113794ac29464bb2f32162300f4fc18c1c46a03f0a3f812131f090c66d5a7d54a027494a64be09496d2388ff88bfa1f6a536a8119e85b5469a61c4f1579b34cb5c2cbeada7606c60966eea1ab8dc3887ebbde7793930aa4c55bb196b6205e159bd4b5343257643fa4a231ada0f925a7fe3b97078ac303c7c056c7697f96679e3c520c9a22df0bb0d45a937787cad6838c38dfa73b5b39670e1c7b2413cd8344f06fbc00f428db5068ef0993f5b77728b6c8bf171816f37c141ca608fb1a7d338949214873988526be77e900c7754651af43c2fb3846a85c70d639b80b7da90226246f8e3524c64700790b9db260d3279789466785ea25a55602423a6801cac63eac4b93281443217b4e7b403bdeb5581cc90d5700f7e76c8310cade4779d0cb3ceb2c35a85707d6236878156b55774a4ec3794ce4659fb5c531fd385637958c3c74ad10a33a315203fa093b8414824b14cb2e4cde1c65dc305517c303d57237e91b9b064e726b209637cc26477f2bd2f4162e35071b3d9622f5b739ddacc520baa41417d5d7c8564cbcde84a8f0a51ad31403ea419cf2895409a43bac3c2cac5f54631b693eb86303ba7625707324ad58c27603c52d97f3e42b52185ca85b1503bd2c91b57745b48c0285119a459b2913b1f34a36ba215a4c9f1316a990054042b14a69b0c940fb26055d0a5660a5b45398c8907a28a3c95ac68c3723309108cb283df868ade11028552225b82488cd9ceafd0af0105bd200a6a00bdbb7ba7c96cc6230232567c60ab53f0556c63bf0f47873544c340553438e304d6cb1ca9fb0b4ea05e32729c060a990ff21ba04198b5d296893825a4b3c0f5f6ca09501c15d645e29c346b318130869966406711818ae754c9f81755106c59a267a15f70acd374c94b54993dda7e8de484ac339a70e1b504d990332444a448a0fa196aca7527b8156df7715bc8a4f58c2d78f038bc8844e668f943872ea2e32bd59aa57362cbddc4ccba834cd071ec4051c64272c6ab22be8fc679df4f18b8258a65ca8606661c8173bab7c63436961be7bf3fbdf22ce5dfc9ca24334fc79219bf6096805aa24ca71197e8134055fb611a79e489cec3a6 +ciphertext: fe0db242d5dcb3762ec27e9c414fece011e9730eb8bd5eb9be826083a8794e2d871e3a1fa8f390f72a19ce5fe2962b34749a4c817e0f9e4135ae2ed032462146346e850ee02e416c8b0a9bdb6be376f42097c61005d89bc64e0f7aa105801b8de96913a443a8f627d3f6635461a1fe35b46746f1994cf748329f6b44a156f1abb7cbd5a20e6adcf132b63c17341a989f19b1296d0a933bd57b380b2fdb54863a6b5dd0a90cf28c0af29e02b2c5cbde8ff5a84d14d9a570aa0049f83c2c4c67309c5b1600bb9e9dc0ddf7b5e9e02bd3364e1cb35220cb1902377fce9e1cd9e9c93281052e49890afec836bdb804b0d373c929fb8c46c672efc4ae9e3ffbed4c96c6912779f3a1e184f74d25a3cd4c4b548abb1b742e7ff6fcfb96ca4659e7be37469e5e8a34a5837324a87571a5b27c965151bbec4d933c109079db604d7a0fe47dd2bca28de8f6cb8ce06387026202ca95d290bee98744a620763ee8426cc1f18c27fe29cf70bced92af71867d40607fb71802a0ad0fe6896868849797d63bf756e8fac5c3f9a8630007722e603db8dc319260bad0c81c071ecba2fcecff14fdd7089622713258b93c86cc7c3daae69393068cb60ac216e23596cffed75524bdb63987ea6f72f86a64470937f52628ea50988e3ac758fc5fa081f901f04b8538ccbba36bc421a9f596c723b72fc9c55508580f52378ef4bea1d5d2fbfb59374f58f7ece5610ff3eeea6af20986f8cf3572cd1108cb019adf99ae2d6e19dd58f83f84aa65a2c4e0c624cd2fce3dd8a1a035489a206311b5fa9df00ddf308c14f0d06411cf2a253c0c979be75ef80b750ce15cfd10e5732111c127c247375a1238253796b3fbeca738e6799315e95f37a5ad796cac2c3d35586eabf80bf126ea34e77f1b68ff650989ae8ebc832c9840e47d0f0b1469cc40665ca9534341c7395cfa1c7040838828bae940c427ce609e25a3d5bb4d3f24a71dd5a02567846fac8f2c513165423346d4a8211f95f4f267b0d31f19cb2486cac3afb52fb8964fff2c6f2b99e5dfb03c24cd477cb4c71ac72d5209beeb6a23e656bf562cf85b79ed8e6f7a5ae107bbed99819490c065f58570cc08f04d9d85c67a8bddcf9f6ba9fd8d9106e894d8ae8cb233700563187780b820e94b4e40dd8f713a82abfdd55d6b1ae26953d0ae259b4945b1ca7c5f7104169f99c85f17c621d3efc8f40744cec2dd39be5b6d7fd8cc8502a6645639e4d26ab9f039b817b99d9eef0d2ef83defccd1a52e12aef2d3316fd395364c081306e34ca98745a49cb3fe8d9adde2dc404cfe93852b2eed784ed313be9f1332c309e8cdc07cb6ded5c09512f19b3b29c10d08c32e8c4e48d64af13fac60ca53194ec66be6c676f0117c409f75f706fe594f51b171baedee2f161bea8b7b6eb9d6df0caea76fbe253915bea94ba491a437dfec798d6b95935b95907408978b49568ecc66034931985599285332c4322b74e77a818df940c7752e3d0c56c7f4e357db7f8281a8d8ab1ba26a7293f6ec6168a696 +result: fail +shared_secret: + +# Private key too long +private_key: 6b505c9cf71ca708ae3dac65326c62a6a027538cab7ca2cef9e316f67649395c2e55cc666b6a8dbbc8575e0a106ee39f9ecc7aefa5c2c5b918d1967e8ed2b035d9348164284a8747bbe15290669515690f979605564a0d7b204d30268e00e48bd1352943d217bef6121fc7cb591752c3307fe30300aeecb1b2a09f5c0a89621040cab75d2cbca440176dead7029306bafc6867e7a973692cafee995a50792b0a78b2f3d96d32c278d49abaea176bfb66ac853410f2fc6bcce28749d252ba4747fa6852b937775b206e2564079eb9647327cea6c6cd096171af411ccbb75c5932868b868e01370e338a64ffb59211910d5c17a0a2b532fe36b40ca17e73360048c13924c56ad433312b6c3f9611265bf7b64718b88bcc0d9b32b0d9e133f413693a3c1e19b3b3423ca2bd724d7cb4561f8c9a18682d42f9a9f9798d37fb460c573ec13c5955e2025c180a47b310d436755e5123b1924f530cc8e8712724922bce51aa5ffc007094b50d3035cfd34b11952a5f6640ef898f798ccac4f6b3e543ceb24aad022587db4242c81010e4f43d9f108406673370d1991e673041f2ac5db6285c2a936bdaada581b56a8acf556786a9647b59270c3d6b2550e1cc72c3623151ab4b870528c2c8ffac26387b667e551cd2acaeac8a39c876bfbe5a7cf196474aa266e2b90c6729a572ec98c5324d14044c0ac5cbd98c8cc327080fcc241ad2078118c3c9535b1f0520b2f81f18396dd3a8117d4694214447f709b005538547cb7e113196cf35c528687f13b75137b13ea5a1954a9879aca568a9397a8fc561dbcc06306658ba44caa9b09942b3a7ad56848de44be1758e9cb79826cc8a3040a619ab7b8c6848f91546593337093820304b814185809228b8129c553a2669cf2bae7ca61ce79c88878393a6891e44a85180154a30d92a0ada4c4f1886e455c7a7d405bb4254ef3a88954956de0a33b27219362421912114a8e9a19f79981f564c0c4689e25075d0d554e27753270a23ddd85544ec5b8fd45bc0668aa3b55a1d37aedb1cb95885ab37f1bb00d1c43a2860b85526759b4389f69982dc08f2813569e03c9559735d2b66fd3a4ec5151b20250451403d33a81c2a987cf1634afc450bdce27ccee2b3e651c8179350792ca3dc84052a4453a10297625616df258255daa48ccc63472313fdd85bf1072b23c064ebc98d4d28a930866bcc0c02c1905fc81b433c138b2c9618f528ba99970af40b044d586c6c6379416c7494f129c7e383bb9c9b40729858a99f009ac08b99095af526d82c4fc0d7c461e363e554669c0034373397c6f6bd9639b77c0a3787173275a08ce0ca8eb509b892f3342564c46618c7c381cbb692c9052c68ae802f6cb99b5a708540c9cb8ba52cae8223acb8bd198baec0c9a52e30ab7db911460b22f47a1e179041bb8018dfe897ab92408246b0e69993f0e465a73b3ded986f2ad0203047a63dc0281adc9546254f57eb0d3c358b066610dee84c8ccc66ce8c974bd983ff50ce545901393a3a085b5213c55f5a315865d84eb52a1dfa5257489c1645648da195927677587049335f03b87b322f3b07caaa5100481c8564ac07c608ab4c715ea3ba3314f210b6fb29fb122e12b53f898a8ff2ea7c8df062bb25b8e06682ceea21d70784a38577a159ac28b314e609998119a16930bd21d303df686fad983c483750c8636a065aa5897820514624ddc102251802997685e76338867c83de45065f169166220405616616948a4d0a8a0f6060297a69c6876bbca9bcf802bf9d5761a7971e780bc5a2433b10c4cec826bcab114867503c405a004fd20e565a3338d97161b3b3984554e4e05cb2d23cabac6eba6927eb1c283d4a93f871809e067ec99177dbe52557753da51c104ae22f89a1b854a9423a29089f4187479453f2343e6f96a6c128a3720a436e90318d1114d8446991d3756cc9790543014d8a3c7af277f57b91eac94bdf7c1e4068c529725e6d3ab36eda0231fb14f2835bf77ca23a58cc69011ee13b65f293ccf944b47d8232c7f51300f52a7df93009498f572479d2c6a0b23a3967c3c057f08ebb79c59ac6b0727564b61288f5bc04a5945a48619aba794be2e3a218c25281c0536c209839d9717f7a4466b61a88a7199ae0a728d2bad1c7c4bbbcb39579264902bd60d7636ec2949303aeda3a5a26030a88b685a7c3bae4674e995a9afd37ca5517abb383bee659bae84c246ad770d4aa2c058354c52556dd989fb466642967a0d7e0785dc59e4d381341d36ebf320884e1a99bbc14bc021297ebaee127665df632f1068c9f3b0a10ea7aa82cc5c6a13232d9332dc504031b7e6f2948ad2997078618383a5fa119b916328fdcca5da63a711904349b398fa5339f71344e4ef432703b687ac52c4355720b8605efdca1aeb33aee43ca48e58571dbaab304ae25fa574b1891e2a82e53f08e69498048d102f5e4cc5521c903e3c10807b95746b205634289c64c4c42961d25102755588e22568b125a94c71846f315bb96a64fb815dcc51471c83881120b8c5a4494fa8132a83220d620897b1eacfb673759af2f2335945b67db637c1c735ed53ab381b49e3a650b4de572b3b3cefc241917d2489bf798bf244a67da95f3654c1715c01c7249bf69362e4a313a4956bd746a37e51466b790b8801ca79772f2864cde7511bee6243ed9c07c73060e750e82a033c82bbc15a52487a48b20b50db705c0818371f79c6fac3c61a2ca4597cb0fa467406c4a16c856cead8959210c44a858bf8a97bb73154e5e971d498087f34c251f9628caa9b519937f57a7ae90742791679e27d395a9ab4f9b83802463264bda072211cc290a19aefb0395563ce42a5038891c750419f854a003440e14fb96f8056cbcc77244501f6ff75887989f9b1bc7d8fc479c3b67c4a952d26663769bb49cc6713797c3c0f744ca846e32f0c7b3889bafe34e1a46bd62099fc9909a602b64785693fa6b8f6459b3226ac556f8c5d4a854b43589dddc561ee2141f41a9543c76643545b52bc61ff88a832c72152bbfa9e98be2bc95ae13b8ef55c4481b530017053c197ea5c893639396a2fa336bc9964c436f3d155ef114c59243b5528836f61aad9245b894229bf5e70ab0141ffa0688b53131a9dc86b534a72c6a74a4b5c668aa7fee30194f4ccb5d0264b681b2f9e8a9c30292a4474be8961778435e7a6c3ce5d275bd89524db765498520d7692b58d49c37e28e04f44b9bec57b4409e1792a0410c9a3428ed1dc6f065436afc8b695730b315c65f248cbc3c088e88f520e5f92e7bf97ce9983314b76739ea744f77a817792f4662ea02382bc55794856f60fbd61c1d49688213a953a73ff332475f2e44df9c77f572e9cead0cb7d1317a66 +ciphertext: 84a9f911760143a305d86d66b2e3af72fff10330cdd1752991f52894254c739e4c418af8f01e9f602e2fbd906162e8d3452953ddcdd86c7de078ee404915dc85b4a984f106cda7fd9cd9c69eef2f42e8152178e958a24fbdddf1bc620f2d558bb96b3477a74a8d6ba1f1e6b099dc00f355a70a2d56dfab6d7e6a574dc9647c8d33801ae860c0fb470a659a58742932154b2f05d7637796ddaf93ecaf1147c3e378d4be5d8c72d86806e11149cd7d27d8a92b7b72765042592582fe7443134c6ca82d3ed2800d5ecab8c1a51ceda52758472d1d1bb5e84a8c250dc2d380cebb673568099bc6ea6e89fd7a5afcc4b6b7f3eec38c05346e903764b06479f146c7efdc57e88251d5d36c5232bddefb268b189c9bde92b0c1997eb22de1c1b5490e481df891f86e4302bf238d44a9663aa3c2baf4d23578359e1ee128bd8f967a2f7cb8f1ec8a7144fa959ddace07f6efd4ae49c61b90656eea5c7e6733811a852a11a2d8828dbb4cb00fd1d6ee7836b7881e06d44e74bf3594e029602f08eda09067397b863b0577ddad51b69678e24895ad93c8c1ea38b2e7ef413c04be22709adce0a060b2c525cb663f1c5c3c9e0372b93b86966c62d649a2c499db2e9e2b18b8dfa585b5601dd0866518c0d8fbf6dee08a74ab00acdbaf84aefcf1472ff6dcfc438fcb0f5c23ad05a9b2308aa84046406465dc1a116141e96f95b0c25e9ce3c7895a46c29d916a9b9d4c9cdd2689cf2a93b0cd962ea28019612bc1c6c9757a3d23946e4eaef8ba6a8ae3f6a1022f895a0fe0dad4a58afb8c70e38b3661ab25908d3fb062f70bc0dc9b9a235ca41ab35fff001c8480044d6f0ea527ff854104e28041dd6f9624a4686b5489651191c6353b2340598b45402d6ed679449ba463b066ec15bd0af0428c8b066c84749389413bb0763b8f6673bcd77664603968b87703d3d519192c49d03b66d71d1dfea3505b21b576aa98d4ae866b0f29d85b324adabe6cc623b93fecd884f8a928765f5a3703d63db4ba2edf430987be4749834b7dea02edbe51b64c0f282c8e5d8308ffed6233258fa8b4323228157a74050e1a339cb7d1ff2d8845afb316f191a59dae948e1df55f56ebc1c1855648a9908e16348fec0b9c47b152aec6f20825d2db4ab073dd9c60f59d03c0c4684dc406759910b28780e268bfef08692d1590bb92841d42d920e012607319be118f3853ffc28acf91e3f2d871728945bd8caa08101922c37a250a0432de950b8658fd5763b79655c3e08c9a1fd2b3d63046d2cbf5f799d17f34635c93defc8331a782626247a0f5e7846c7cb76bbd6d41fae5e5e6a608041a7633e145a3789d82d28e55f64ea9a4ea0dfb05bdb1fcb060e872e6db636d646e6b7fde060f0d42327bf67aae02053458dcf76d169be16ee49d5f1fe3f5fda7ace5e86c22e52b76895c5c77dce6f5960994e224d7b8f9bb5dd466be4f7d3d513a8e45f3ae58bf77c52ebe6a174c59931ce8a9f5ac826598bae7c8435344061f1e200286e7e22bbc2e0769cecaed +result: fail +shared_secret: + +# Private key too long +private_key: d2aa3a89f51fe9c386c648577a1694fa916d741bcc01e11a6f778f228c17ce6308dbb7494af295faa81c842a0d7db244eee7c390c8c1e4ea0ffc5bcd49801e330c487206090c6a7841375d4dd44ed071bec425abe248982ea274fa546f1b1c8751f97875d35f64654b85a33cf77a54afa12a7bda2a1598066853157849954890751a9837fa0846c2b454bf628e7e5c0379917de5f7988d818ebe339d262314ab2445aa02085634179b93c050dc7552206c3ddc82205bcff870c9de13c40405b0a3ca13f115c6a9eb7c74733ecd687e0b4a9e8cfb9e4fd8bf1885645298071c3c229ec3443e91b90df5703612372f134ce18794a783aeabd422a9fa63bd74139e265712581ea8067b58645160567a169902e22b09fdf70c3bb106144556ecda73cb7323fdeb97faf122554829c96b56ca40819725346bd10ef0f32123ca7a62852db5e1a5c42528fda4a2a8e1955ba10f0b263f6bbac650f2671d6b0389b332b604a943989e51f56e8b8038f608d0ec7830d820662c86514dcb9a83b2ab7d3a50d2813e70b02f8c8369de2440ecbb68a3a07985269640b52a121b860b93389e162dbc23a0616724f93aa21a039044a5a421294442d27737a58c01697b750619e11b19916b823108353cd69e29a1060fe53843739000c104286c8e3015c6b34074dec6591627b1857286664962ea4249df8183abc82592844899ec8590f879e6339ae32bcd5e1a1245986ce936104982903a512ac9726e8d07bc664086204378b5f7b867aabd066354e0066a618580d62b6a313ba44f636b5956327fe35e8512b0ee344fb95ac0e2f86273767ad823424dc3741bf4012b3991e24b32a502141a497d95a869b03939c8ec192c2a4e7f865a383b8b07c40e23e1aaeb1a85501000a7fca548050e9811c720ab739750304ae31c70eb07be6514d1b2ad69a43006545dba78186c3a9bf978065fd3b8dc5aa021002ca1d65f02a0793ae251e91858d28767c1927e3bd8026f6c9d60b09b0e9a3b02f4950c8a40dfc5afb93c014efb9d7710409b97ba0faa156404aa34375a4ce98a78685db7b3b60ffc0d262037a6a3cc49f2697424225bf82772e9cf5ae58b35235a1b2c246a0ba31f669fda373493b0b7d2265168779cb178b6d27a4afcb91866abcb1d203ad1a889e1e65c14c2ad3aa83b212802a1ac937027bd79600838fc6e23473f394c36d53972d25793c6537b6ac1c7de2a7be47a2ddaa4867b49b04d122c7df9519e990f4c9500c01c375f0a6e6be537fae2631080b00a46b097e570b293ce44d34cbcbc18de439ecf87794e0bac97e3597706325c63c5efe61b5eb3093a2437cf02c8e82754131b183ed88ab4f0c0cd6c40a22875c3033f1e34cba412ca3523bd9839b727a143eeec0b5fa8c885fa1e2c794898981dcf6040c151835e3120ea2327df19711fa8b1f5f799d6cc0bfaca2349613cfa8185681b120f63912f3b3e2b87b220670670ba5c9f307d9ca383390343e21b0811659113cc43a0f8b56c82cea5245361e0a47e6c9bb689471d50516dd808d8f4214d44974e14695ed4ce2df541553a9646c19933084813e52c6a563b60779c5ea771366513b0293fe32b4667f79129733cfaaa1e0b78a8a18327d6353953da62e60a84771a3e9db13307ccb7ded546e60aba043911da610c7f617fe71a0dd6973c1ed75a5e12499198bc9bea365fc552b8d1b352c057393c476cacab623330cb90580b97b12754051eeba4840c0935b763c5ba4cfcfba775d1bf433933cdf50aaec7284a798f1f04ba22764d91b44ac4317920c99d1ff0ad1e62bb783bce1c69319e30a45e8545b064165c24af7afcaf8144040a2378552bae1be596e59a203c15cd7bcc0778cac5cdbb935b87c52bfc0c76bcccd67b97f4150b08b16f6fd97e5ed975ca2a53a5d9155c48058ffb0029345d33681c01f7364152a7e2f4787be046113a9c24c0851f940bbbb624521260be8762f981164fd096d1f08240996509154dc4a30bf3e965fb11c0cefc1b6b97254e6c90061b113e5b59ec56bad410867162905027456af398f07589f7b2a28c3679d76401036c56b4ca2746baae37da0ef8c7387d583c88227494a86f1363683470c5d9072926150cc25a5875da428c630c02a4747f1a7eddaa542427ab46b7be9bd7a6028a3a0349522c56629339ac918aa6cad3b331c0078e18567d450799263e8b8a003ac80d495c5445295637c1c2e20773220a4f7ad23af0da41f3359299a5ba8dd1025543859e407ba4f644adac4fe118770c19334e010f0eb88d3eb804cc2a2eb802614969be0f59a25b2a429e79280b50b04295a3beba061a7502b6391d59ab1fbe8348939c779fc3c7c067981bb188d21c05816a48f2796c386bceb639597e8c5d6b89105207457da72cb9a4cc58cacdeac96ec693a0f3d4c58019712443bcfc4185defcb93e2193cf93bd88e20d528b17f817739c222957023639847e1980aaebba8f5f22cff3193bdfb3886cc40604035b52252f470a8bb4097156144c7b149c429524cee65df24cb4fddc983a4c6fccc598e6e530e764ce005258f8586fd2977e2d6c404916cfe455995dfb23997ca8ac4a92ee00025384498083173074165e97c9cc4853823c0f1c3421fdf4a8dd5123124a03dad45d7325a843d68a7eeb7eae616cd47866635c8c1a82303fdcca1a17a84d643840f16d0f4261d4bab59ad411baf73c5ce64805551dd95b0bb431322cccb5cb30038d583f61f07e2a2ac433d98299f56cd8a809a1a97c9769c3a7a5a7cef5bbcb7b026dc23e349981743cac34521326723659b321bf4b0c7e201de87a68dd87359abb105691bc4b31260c1924c30b67287454b829625eaa7d83179e33a99bb58626fff01016c11817e6447f81c639285867e0047ae56fd0fb5bf7429246850aa115544c463edf33a046611820a5068fc82d1d108cd340710850b48f1a18bac7819914061937059b68018ee01908210f0d989c2087a87c465f6da24d0e785d18521d505c3a7898053278ad6834315787b6fd7ab867aa7061e867a4fac4946602478b42c8a2400de78937c90cbbecce820864ef86c0b58925a3033e0fa25398107b25a37f03c3cc97f64b14f853a7b47c53e58bf2d202474bb6564570a618cfa5f47a8d4b7858773761d5c6dc9c777d3079a03cccce627e05221bc54b643a01cb0c3bc3d58085c85074785554459187b15912bb101ddfbc090ae30a88433444f816ff649def14ad75324bc5b64526be16a426fa7d792aa9bde6019dc8b4067836a0b55f835fbbe8ffb09bdb5fd06d3d1463fe2c0348c6f2cae5cbe3e39fb91679a7159ad279818484f4223debca8ab3cdc38ec3bddb27231c454ca335d9a4df69a925660c5bb6cb34eab79fabbaab +ciphertext: a7507c7026f8f9fc8bd6ebb390fc34948a17594c4a96c2fdc6e4e993308484790d99cfb866e515177de14d2d4ebeff07233e6674c7c7c9668068b0bc7189885a271c34ba65e903fe416c29a5008f9672c7580f77f34de4eacd4dbffeb6873805f1871c8a83fb59750df92a6f93ff8d3d517e277cdc9592d2613d3bda745bfb814351b379bb1b7a6fb08c0d10b13ff34e467989774e15e43c4563dca244066bb91f2a8f13ab6218f4aedfa24a11a47f4cf397cc0694cd97e1ed042c7bab88c38361c58d2259687a905564a3c1de91309c0dc46962c1cb8d7929eb2a7032c3ac006e061211d0cbb0e6edc547b38ef364c39946359daa00598b56d8d12024217ac58d698455edf338a15a8fcef9e38aac44010455f9885d95e9a94817e2daa6e166b70fdfa7e842dfc5c7f17e1fa196816638fcbbddc8f5bee8919d9614953429f2224a5f1f983bdd20cc0128bf0e9bfad0d3e40a9009cf206680864e64644236dce9f00651e17c56069cbe4420a7979fdc56b70b093fdc5c54360c95dd4245770e237cbc01666eb29b6d891c1c025a8a75891fca5a481d158f9c18d5685fa86d351d9b085dc7a6099cede6dc303a0cfcff772e95e71aaf953a2393dd7afbef659fb03a1132db0ae1e17cbf8743ceaf0677bbb837b1414e5859f636928ce81da547ef3c5de08e96651e41c297ada12f4887b206e8ce0a060f2d1c084371bfdc7fae1cc841c465fb8a396c216df2dde81d05fdd084b5cb9744faba375054e580abd00c451f49d817367a51630f31d0f6ab9169668384808fc366e377d4c7431f5d85a68840a276409b70e3fdd203e27bc01c457ab581e7eccb94f5d2e3b14fb6c75ad38748443d86173e5c4d03bc83dcf8c2cc2e9564a6f0421fe57d4fa27fbb68ce6ed48459b1bc03a83552fa48cbbb1f30d4f9d3f62f6cd2d4df35d792cb18e9c945fbe152c172c87f0cc6960abb2b02c7269b04a2bb30f4e9373e48e22558c496a2214d8b287bce63901ec0dc942b51965717686a15a7bc6a4b0b9cf53f8e6b05af86de113d9ae04a36e44b81572155d0953d8d9acebe78bbe318c1123743adea7f78dac5d3a48f77db717bbe929f9d4a37a3c7b7352a9685a9437c4be221f7d57bb7a3fec00e0c8849c717efc2e51306a5b81ce341907b39b83a205ff4a1e4512bef4a41fd2006d75d96429b810814ead6d492aec907c90fffb21b6fa4f0a5c25af6ba75403078a54e09e30e7cb5e735caff626f26880ee9c8a34057dde256084a23edfe23d10bed56c32658f750bd821f96ef3ccc76f39971fb0de9b1a38e825e3d9577a0aed90d53322f656e7d46c7331e236d14f6378fc995837906a407bf20aba3c9fcb36ba5076994e0b1d409b1aa3f00d13f947b6d82f1310cbe159ff5ad184a7e4ae6d5fe2fd5ade6647e8b515c221c7a987d1913c6b850fde8bbcda12d58cc15d94ab1d8a58f3add7dd89732de8e8ee8231ca6baa29c434e3805051eaeb13c8b3075a896e7246ac8d09d84843a0b4b86b73f3577a709dd7c5681d1d6 +result: fail +shared_secret: + +# Private key too long +private_key: 0b106288794d1e175623d54d024262892b5ca9e7b0a0790b2572180bb9aa5c231678818c27d459621313f4739c6b6b83c14222238158b5f42464a74d25a1473ddc72b410419252575b4cc3e7581fd0963924a890927197a263a7501c17a3b1b0296418abd981ec5aac8ce4a8b3dbc7fa0c1eba0b5d74f2ca5a85056a4158aa0939496b794a91ba3bf391b88a9ecb772c0295776ca015ff662f796207d151a5d2a562989a17d507946081343f72ceb0f2c889aa159ea141ca3a344843b30268adf07639dda5cd1908743817b47593af4cc18b8120a19dc60b4781974d9324b35b45ad773756035679409b55a61c9b68526f84047367b1599ac6eb8788acaa5c54492e65bb30f62487739a70a74a3aa6dc662bf9aa57170345261a87361ba205c96dd001f3b617f8f0bc7d863d83b15978d9144d139b3eb20ba1b150670c809a7cb5ec24b31110991dea260e30a1ace4b0bb746f455a28a8f51b86254214c15d204883bd021cc3b589ac35ba0ec41599f9c8a2e6006077b80d4badbe0b480c947df7abb506c46dd288859f3b399ff11c5f054f57fb819ca0c65ee40fb3504a84398fd68cb4c00aab31962232c29f4d7b80123634129b9d8493bc0650ab9eb9944b995e13d76271999f1f165839247869d34167b28e7fb00b01aa4f8558106e4324afe637f2c1639e8bb39727202dab4b619172d2b3afb5584eb5369bc5983297c293f0304cc05abf4425b408835ded16abc8e605073354cbc5a6067276d9a5ac84826c2cf71bc184211df050b4c48994aa6c9bf91b058c8b4a115d1c6638b4d10a346a5e82ec805f9a47d2826608033737d90458a7101a6c91af5c1caaf7c036b07deb511f8f41041322ab7f2b17d8f42ff105c20b2c9a09c736a914989632419338604df607e54c0b034779bf71524b867a8b0a32d91384c694821ce9a58af7cfa8ac17dfab42f1939ef51b6171832fbaa33d69971910e092941883164ac5ffe0741c3917897879de523a25d80555640d22b4262c993abc7368fb964980fcc45a948343862552446c173c899a27a13c608f11c4848a036523d69f17c0b602c289b7946960978a7c3284dc569d94368e6c892024ab62bd8a7b70e686193a4cb553aadf8b4cc59c28a3e15fdd2522fc9864385a87b25c6942f745458b7707c0168fdb1b7f58c285f6030cb0868bf389f34bb70bd2cbfdb67b5bdba257288967e61605683c897b55f8f00f2741bebc9ca6647431c788aa8714898432a9dfb4133b6ac72c80b2b95691f5168158f7221b1c923e9c30f1357904f674e6e19f1c923496f5212c980ca32bc40f04a9bb174b2a9486dc6b492a2abb8071c74d8000973661275383e43531e18ac26c1332b51a58ffa275de43525641142982c53e728d31278abda6671b541e2d9b69db6b75bc083e76507af16b33351702229c201b692381a13590e2016ac351e16c61ebb071ac487099171cea552e6e687f1b468ae3f9771c57048ce5bd52f348a030508d6b4122e2cb7a65a93f94867cb0cc4b36241dcc015e53bf52e85203338f648a312efb1cc5877eeee7cc56f0771b64982ba534c609862a02709a3a093399a6c1f968ea593d63294cb5f395cd8682b1f989b9b960279b13786ba7809b091905a98b2887de44421a115b9afa38ae611ba64bcd14abba616192cbc87556d6c6cb997f22e4b3f08a01e39b7e20100318e30846caa3f9901d70580e7168bc148364f1871927437aa0394fffd980eea80cab0958cb386a13646bc879baf3c759e2c7582b331a456ac1d89b9460732c6b67b221a14d6e21c7689b2238424b2dc35448067cebfb586e236da0f580a5f09d2190b90960ba997c0c57a427e537a5b7272f9f6a466a1b1342a922b707b387d89ec2c19aefb3904d6978c0c9410af5c6f56bc6fc639a179baeccea8ba9a2476d4624c7cb61a5e96f0e8279687504f3f821446c7fadc4ba669175f5b3bd41480c7f24124b3ba3bdf68ef804bae4196f303424a6063fae9852e7dacb6ec74856f14c5fd6a56d496be7c2bf8a908a144a2cf7a253e69050bae93c3ea86ea799304680922f2b5d7cca446f732c2a4a95f7819df3057b93d049d1b7326cfb3ce67cccba9412e643408274a984812c4c4a61dabba04b6383c61467241b4da06054090713507abe53acc23a41ac4ab15424549693d91d432291c4d624034670ceb775bb40b25ba361a062027d0c2da9235a939b2bd64077a4a069e80b8efeec5303762c943a734213ab1425316c4724bc67a29ebca660b219ea9cad6e17ca6846103a764d9f6322dab55b119c443db10101d7636c629430383213a318e4d900f1f61fd1d572ac6113bbeb71e6070bbf5b68b01614deec3d15d1cbf718be247c053b59ce5c37b3db34aeb091131fc71959c07b27e713990724397268d4f10341ec14424cb235239138b1cd7744ca3af43d3fc9a41cac0475c97858a41fb67ba25ef6479080cd763157e831cac2b923592a7c1f996336a63031664e51916a64231febc26c5602b73d81368663b744777281b003b7ab673a993efde2ace1820c76bb0c47f7c69f9bc5c7868d332a5f8c22b73d0a71fa7397921cb13db0b52c960db669318bcbce0e794ac8a16cec912dd6b6cf837172fe10822911cb03ab7ab427842ca5a85d924d95e07251f69c09b7b38d2ab901a97d753a947305b911c800f92a2b4117a02bd918670003c122427162bbcd3ccae75ac030a1a010c31f859a25b4111b2e4043d8b588cb43c5b4674b0336636af5b62041495c295c4c7479e521b1aac743ca406a20574c9226a4664381e005b8809b80882243ed537997e312793c2f12bb22ee0c86e946338daa8177f5526ad07adbf36f3a901ac7d53920747b48abaf81fcc7132588cd64a12a134d1158c423d91ea1d2ccce76ae40d4bef93497a1b025e35969aa351ebc15ba3521622c379fad893cac6a2910086f997a8c3755b292e74cf96aa7ddc806185174c4bb610d72643a3a830cb1c6b1a9bff41aa2e850cdc90a09a93aac8dda13f7c8b5d61c9082680750041b04ba45fd458063c8525d11808b2a20543817e4437fef351c5fc991878031d6172d838a80ca501721583f3c51b2f07c37dcd5603641c291113fbba403037ca85fc0264ba95b01d803b71566f30c162b6046998c443af804bea4c0edb5680819795448915943b553e05c7be6addf403ff9e9cc1d580168254b5fb87190d743b6833e3a3a7d43db3da4034f047582f229964d3a100be941cad5870e106661d476796a53b0dcdd34d92ed7966194bd52d9393eb2490748ba7b86e647ef4c96b193e4e758c31edfcd913039c2d046a72ed39fe4e3bcffdb00f32bb6035910e85cf52db3160dd064812d3af252d98287ae1d3bf4a70b8289466a970ed23f2e57767c221b84e2aa0eafe409ad00f8c9b0 +ciphertext: 342fd9a1b0d8d171a535678f6c22b54713693f988ad0c6f339d07e14398d012ad97f298b2d813d9ff5681ef0f976a7552049b8343b2ff7fee67a1c23062de7ba1f75040b1acc7adc5c36624ff28fe593f6530b423d34d6afc9e9592731b046e497b36cdaaf36a8976cf490c90da3f961e5a21bb148cacdf17f6317faebbf84320b51e3c645dd317fe97d6372f31aed68ccc00876b8c3cc52bbe0a0a1272cf8d3f4a4def45f59e244e285bb3f0bfa7ce102144740c25aaa01652620bbadca20f3887f69fc6c6b269ed9836ad2d74c35f2ca10b67b640fe00a8704a0f940aa49a5f63f181af51c4a6a32ed21a1f49da5c383146c2f5f2e14dbdfe23b87339b449889acbc749ce5cb3504660f0f82abf62bb84bf1fdceb17bef616b475bc630ce1988c3c7165aace844059754cb9a41dbb1c33b7f5807b2f78766e688082bfcacee6791889416d1b3ec3e1d75d30ba79609f584d466a5aff9868d8a507974dc87cda0da74f4c7160339583619020857f87dfe0b24f1a12b66af95efe9d110d230457aee8f3613829fe89579ea97f247526c2303753275b6fe50de98910bb193c52a22c3ce61fbb29d2e8e6f85ff801ea51035c07c61e901d1ac855c35d82375ffa350487440043af7432d26c4b7ca1180e7cb12fcb2f0c2b565523300836c6480ef5fbd76f521f9c3ce116fb5bac4e163d6d0d43f0a293cfd84a363cb5375d158465f6155e3bf7a6c882bf45353f1a6670d5b4db77e0f5b18720aa1f86e4582fa28369bd1a3db57d82245b2a6e6b3353d9920c7c31b763bfeb25b7c9af7ac12c00520f911b1071118aee3819b71907461cf8022b65ecc5828a4c64c62e9016d3cb090fa0e178196e3d4ad073559a24a037d29c429087fba25707702b31975589563969b1635e1373a5acc92da9c533f6380f53624d7974f6e685c142482806201af55ff7ef07584511163fdac984e3d1c8e268be5e381cad29d1e698fffab558e731656edb488431a55307a4a021816d559ec64732d6cadcf8d36e5c88a8f51ce8ed1e3a3a107b7b5c9a0cd771300bde6c7430745a7ce2876baef4f68c843e7fc440f9c0d4ff6dc3c975d861158851d5e34eaf36a081a7a739255a67bb6ee0f5aa55039dac4d6de1f34ebdcf5ac30600ecc569200febf2aa4939462f35a51b3874fe4107e8fd02e3e6d92ea0843fe752d8ffbb669f56a05d22c91d3538b7878a2423f288405d34f964d78c95db8e292ec570b26f42e3eed18473b81099a93bd7f4a53e5396e1c34d6bf1baa38418d52d297ae579bd301a4e4514f02693d867cea13af7a63d0d05e5a74e8c341d62ead505bf4c84d829f2c37a570c4598514bbd7240b0d3e9d084e1c01299d085668e3a40e1f0414323620b6dc744bc9bac6938f47e88d88abcfa071da2ddef517b175ef695288a93ef06d86be941785760f231a4d309f78de52aabdb6e34f823e4d8760255cb0ec3e06be1772cfe3286fca2c5cc8f00ec9d843590ca5b830360932ff5a3c593c4fa416e392192b2b887dfade8957 +result: fail +shared_secret: + +# Private key too long +private_key: 70b81ab3b36bb1073b3fe5038297a394b93b6359451cf0324515c6f2632efc971f40d90f82255d9bc7abf76a44712616639b25fee447fc0918fd7252e1747d23a4a97407b5b5186e07d3977f010f1efc8bc32290084967e1118f72ea2a6779903c4575653598b1779c19cb8052e18336a1563188b0c465446174815f12411eb59f8d811aebc733f1c859627a7524557cb1a47dfd9a25812ca09cdb6b02f93bf905c9302b6a620ca2b0e859cfc68bc7c435623c7a0fe57b9879bd43c406b3c76b3408a4ff477566e1800e541eae0c07f8a54e298c23164b6d00d90dfeb63b7994ce11509b9e923e8d09071f0ab95186c2e7c67270e5abc7d313ef7b905eea9813a0a56c9b9665c2cba4712fd7a2091cfa657b42c476c06a7929ac06a7cae4db3bf370ac15d7300f83add1a47fa27a15d3118063741b09c55a37708a96a62215b2bdb46b484173a2541b33198588746a9e332a90e5826a81853c10271dd2f0a1a4cc20c7f0cdba05395b7a8046e39e73eb33812191126ca390897fa18300bd86bf2ff58250584b03c498b1e158b5719af9d7b4665ab15594211821863fb203915b41a8f42905872a7669bdff316a9043767a4a4c0583a286da48e3668b4fb9cfc754b8d8f7888b9c87215163ebe477e1dc1637921908c62e372387dac356b1173d16ba05fd389896a6bb3b3bba4c4caaee97cffeb1144da2cbf70c713a16c77b02c361c778f6c09487013183645fa9c56e1df932bea13fe186565c1c7b1d01078af5ae08971e6d7b95768a5c166c28d0e229e88b859846265b9965df2b925163aa8c6c829c9c5ccfc7946d73173f4b09032048fe0532a4824ffd7049eeb3175dd747573b65a1937d7b5a851ac90b5e324641846c5a7b85f54a0e205894f9e860cdbca362cba963ac29129a6f0f1963fc4b6b1834a65615b407e7a0907579c51a024dd369f8f751507ccf635a624f4280e3b46edf32ab14425555f61677c5acabc87dfed746d6435432c5c29d8815ecb8c13c79b74208ca1c7119d820a1abb10271563a904883e31a0fbee29e38e534abf09f6f7516e7453a1be85c5bc197d56b6a0b641f1b961fcbdbb049728018b00d7b08a2831557c76c2b889275eb3aa922d78717bcb321bc538601677cc91b7dfa5ee6896038471709225385457d8ca46bfd0218fe32341bc0b29f0a9d94c007ca69c1226b123b8cb8224ac53475caafb05bab7b0c28a811063111974647771c1849c17aeda4918530106e646880928ec2843ecec4c7ebf37250b621f948b895a9a88c58a3852b86f873cef4fc3f698b74788367514a98d9b75355221344d83537020244ca4d8b0a85f649801279ad7901481e18413ab015f0b6513598234a521d73131310b24543a71d8c9532e67102c1b9330d9712de1b80161a049f988e2e4065512961d1b10f2096bb822a94bc081971753ab51082f3cbcb3876acc3420e84c949bf7330be927af6f872bbc40ad4fa0e355a160b2cc524b09c0bbc0d6155345dda0f2188ad845746ee8442d3149e53f9ab309428b79a54a8fc908b42c1548cb5a919c4356707e5387aa7b21c8d1c3683e84e5a046cc820a180285daab218ad4ac8d191a689790021479462c0b3d5881058d1133672167f3416ce863713f5b0d7c04b3737933e865e4062398fb3185322c3303c144cfbbba19245bc01ceea203225e7769654ca9ea60f62e1885a526f76e10d6543b7a6536fe85b0311fc53566a3eb7636bed40cbca64817dbc877f252a22d60c2566bd1acbc0d336b88b172b0de1c2c6db6714e19fd0a722615b4a93576edfb1be15b06bc8d7820669c2ceb9b627e5536cf274dd35795de7cf129b8106a858c10900538016be484787970f57d174aa071592c365c0673b8f099fe05c186b76800d3c6d1986c9d100bc142c309b8689438335956181f24c8f0cb3c3e416b112c53e7949154584182688b09f7040ab88b459e82f93dbb9905441bc91222fe657c6aa8abfb1acff6ca9b243a834265a0e33122801a90e9115fc296fadc547e148665bfa12ffa799e96604c7745998d111b9c0bd928a5f7311b1de37358074130a561cf67c517a916e462483c9033f8d78203ee70e01760a48cc94dce7535b83a4b293cdc2c54c01f51f40d233ee735ed13535f14cc028650fb038877b327ffacbab3600a0c5287e2ca01929148cf0fcccbcd55e6a042fe8a14d98441536e95216a395dbcb7867b6c45d079bda80343c1b9f8f61ca7ae82b50e9481b0442a4dc71c3848f460074a33275b70ac7885133ba8cca389643c4120cf54800cb1c2fe66a5b5ca383b8e493eda72c673367eaa019a75c879bf32370066f5d228207c612a49257ca2819814716521a44a306d04582b898278b9877c252004bd455a811151cde6894ac1bc09ad5380d859b4e12908f7412a273265e29597b86cdee47c8b437356b5113de11ab6b928379e73ca274bbfd37025d28cb501673eab500da889b0ca1322ca41ccedc2469d3a648cc59ee355b50776b181ba233354e643ab18b1b8804235eb7ea36bea8c495c23c3de050a28c3421c8ba517078384a8960fc15b3375c0ba8548872b8f07909c6d05b3c125054245fa1c53e59434288ec843c32bb8d69b259c25aaab47afe7b6cbef11ebd6c7a0189264868342b076ea57b1481137d3014bbf2b11d9a3a334d44a402d2aff2d4aa87ccb4fb0263c5d06146d378fe0a39d7931969027b7681688e55abc1a461ae44409f43337403801f1059577276ebb1a1dd3398dc22b1f93a5ba68ca8a9ca2d2acabb37d323109c75f29b0b286b0289fcc1d21c87afb924c82b9f92d0a42ad5a4a06907e355a8d9b0a07f7c82cca71e0cd647a44a87a40844dc046271d6b0eed0c083a40df69b3b56da75600126210a83617b635be75f7f0cb48ee376b6255def29af07711336dac02db9042194a56b3667dc699ff2166be568117034c774f9b481296ea943b1ad5a7bf3242d5761571ec969cb2601892a3431f326730a4f49b0a942ec8e053b88f47c930f242e861a8bdec21f258400fdca979e8ba701a0116e1b7c6f8a0eaa8235b7d93562c1283a83397a042c40a0cba93b6f17ea64038952fba57ea8598c80c77bc06513428c2295e971d72565a729c4c9949abce138b0c591ff2420a2c014360226d155523500a5cf66454ed535d8591d0bdc7765421ba029b716268bf2f4c573d02c1f652c5619bcbb318e23b8146fd78368779890438b61da18bc827b7b64ab286cb3947b8c976c1b37305071e04f2435c26b312b28279c6f6a0881ee5c037c0a5abaac091450516854c777e936693f67e03e0d24d4578d2b20410bf68e8e296a97118445a483cd24dc70350db4db912d0df7c6bbc43455d3f063b4868fcf92540362e976931e3168daaa165fda43dbba4076f5 +ciphertext: bf67a1f5c5518972c7c27a6f7b70709f0114c4d9f40a7e61903a2e56168ae0071296e5ccfda53de161a9e4f891d0b547a5bebeb75326672631a7f99e3ed105f6b3c806763d6a50cf18cc7137cbae617b5e816c8de2be02bcb3e24bafbee702eb001a318ae6d763159c58e88e13b6058810489b47df039ca207b3ad76ecb5731804f53d68867d14fccf667b287b0e309f8c9a5ddb6d433d61094c146622331c6c5b215d48de636a99b5d8e74255f1917104b8aa523daf8028994ce9268e27bf5b7bfa434392d68b2a7b6841bfd52f2a7780e53350ab0119aa03f3f062a7fa50f0d38a7a8eb253fdfeed82c0e3a88220d6744cc50f62c3ccded933c263e1f705c247943625ca68d0561b5f7b47dc2915e45674363782e124dd12f26600e3929f91c2aa01e18966d28f02c22cd2f0d1c7dccdb2c3b604bc32b33d3adf68e3edcffb0c64f29ff7f7cb09b5e7ba2634f1f19bbae94d543ff9c65137f7deb42f1a4405bfb045d45f7d61fb1c97629aad68d48de73ed29dab497a84336b2386a4714dd377860221ef736d22fed6eebf998d756d51e7706707af0e3a6460108836149aa9b903764e5b53cf92b8a1f863e6c4d87c8df2195e646feeeeef266c488ada31ea1791b82e79d6aa00c95867623104aafb9c27226c79224129a9e5f4d30ac7c570a140346f5fc15f1e39596e9209243f966c15155200cf0984ad29710468baac8e97d469d8f95ca24deb41838481857a9a6f763a6a58d783a29eed4fe21a3381795cc644decd346c47660228ba9d1690079568aa8eadbec731e6c9e537c514fd270bae5fb99f2aa37287a6df6d7c1a34386690b1b3b48a28ccde38aed78c377d7d4003e523911099c20fc852f3ad05bb2c6ffeecfee7ff26baa112923edc3fe3c545bab5f949ae1d102971780a7c67506763c7764d564213c6d1bfc899bc7c8cee77261357ba9fc32fe58fe1d1b80705e70ef431eb882f83a55092a96dbfcd468d9e1c2bfaef065d9092d1e0d9d2366d2d5296e9b153b7be9b592b6d20e4b061debdd7d3a8b3886e52634da9e126810388c5100ecf72e5d444f1b114bae0404b1f950dfa0b3e334557135f83525f1318fbc5d1cb80630167afc4590f524aa2f7c86d1cbcc7c62c295176feb6d96c2dc58f86358964877ac19416b68b2e6d74a2eb4ba408975286d3d9d3d0f7ae4e90eeb96489a2af7e2bdd6c2294cc8dbf887d130b3d7941a20195d77e99f3b4cab1fdbd71f84fce8634056f81f064ea80010f62beef3b9078516cb9252bb12857be6543ab017f34092fe7f6facd6cdd19aba1cbb77eab029a86ffffd33efbb6c03ea0facaaf0135ff27debed0931b212456a33918f915bda10bf7b06ce6196774b9c6ec7224b1f3254b72979c36c36428da188a698f721890971f6a79d1a2b771eede9d330a392fdc3f33e34669a43de152dd12f2c79a0a47fde61a71728429a8e2f83d0202837d86a08b77d9b62758fe995df235c3c8b3cd9a184b089e0dbd669af25a7e06ac94bf4e3db9735c3ce03f235064 +result: fail +shared_secret: + +# Private key too long +private_key: 6b3b61ed404607c7b83cc40f1c00c5516c5d71b550133370bcb02c719a0f3d1c20784964e8a01fa0cab6c5267119333734dc5e775a2d65c49ef16ab26b784d0e4657dae903eea134e5b17dcc49908763cdbd2b67ee059650487462d00cfe7587ead8442971a2bae95ed9f8898c03537fc13861119702bcaf3ef423b6c82a9b90379e870337f54433893264daae2c232f6f3c005724a99b022cb18528ea436b1b4775f4f904b200abffc6221c8989b795babec47580c6cae02c9221b5bf6e0b2ba65c0c49005a28ec892ab32879148749d114549669b767355b605a686bc2f18aae4e8620ecb2c334d985924134c5e28c3b804a871254d808afb1a16c35a31e518418c92c72aa54a685019a44d31a6efa61ef23654b8216375ac5f33b89a8eb555778c91394ac6a5b9a5e9c15a460ce89dc0b4ad369adfb680cb64ce7826a21088b402a0bc85b81e1269bd2bbba65e5ba38ea0b4f2b0e587b6c8262094f7c5de8b69355631dd231011a57c958263c131075ba21a374041081553802670f936910a2501e036bb2d7d674c0534b8f0ccf8d8c43d7892458997d6306b24d883443a4b61b244fcaacb427b64372b74eecb76fc2a203f19713bd6a85fc6b8c6fa391ccaa9510423d76c5922a586aadb4740f870b8fc4504af982baf70e7580088bd7a26904c305ea5074fcccf6fb8dbd88747094bed0f149c76269e0e0aeabd39f51b70fc299a8ec1976d5088daa85a5e1314e99256d44086d35d13f8276c3eac2b30df594e51a54ba78942461327b2b3ec06baeaedc278619bc64bb56fd7c03b5f1626bf352caeb9dcc265af7e714b70996e7531c84555807f82d1577b541ac0d1f8c931b1c536d5ba351b5c69fb8514fe611a4ccc341e1cf7f365d83c890ee4059ba28b0a7d19cbbf7aa4da1ca868c83fd1713d952c7b2db814772679dc871fdf0641f877f7362a8da297653070fab8b0106e0a2a63657727a7304a02e9870a3fc531c2341a566d59b9ee40ca1b87208d66af4bbb6dee9061a0b8ad113c5597b4eb24224217599f0e08de933365aea70fbca3027a44b9fd4b9e1f9bf42d7bc671671c0b85bda1801029b1fe7358e02f53dd08420d27476a11b561c551a44744bbc1442c9995ff7fb1b0f24ab2289cd5f015b4e2cb0b4ea5e96202fcb15635309206aeb5609473b074aba3ea245591c16197596db32877915243403c48ebb8b1f67953fb1aaa8e0899c142ebe7caaade83e80bcbcab3715ba149e55570155e27be6a17b973544cf67303ff4381d822fcd03521bf31d599b5a0d112574e84e81e993ec8784ec993ba016c01fea021df073910a5d4ce1b09dd1748428a3d64a93895825bdfb7fc10371f7a9764683b5870451fbf3cb8db6c852e20cca678b8d875da453917cc5b47d803442d5cacc3bc1a3cbc7eae5a02113c2d0cac2daf404ac614196a5217a841908b009bfd296b0cab254626aca450a35723d2f78ac23c05b48d64379d997df47426e8c0de6d723b3a977bb37643480ae5c967201e133174ac6cee8cd63b3b4a93b2ae9188cea0a52c3a93824184abdd1710f906ef93770d20b69e100cc50949ecff373391a110db88685212ffae29662999c6b172de6587b028504e625c1d89818b1010683b31587fb1df3927426d06b77653af8b425f7475bb6ca9b555568f8f9a14adbade5730a594139ead79acf173d8c49ca1c099d3de268f6363fb9a569d0a27487a4663b0c8c14022da6b157d8968eab23610f1921db219d12425bcfb24af9dc4ec9839b2ec56c7e609c96fa0875da57b1e9070db837a4928f114252768954760a5fc7b09c7d523f29029bb89a686d8498a3ca526df0338011347884645ada68ad561d51e577dca06462d7ac6b9291bf8a84410719a05829728b8737b3a9377b056d80a3bd74932c7a0b0ca02adf1671d1c3109ee5822dc2cf1c036ecc9948180b0d249847f3fc2640c61807c9232644c42da76727d88481909bfb2554e9e4ba2f882b50144f1dc70cefdc766fbcc4c8ea4dfb5153caca833864126771c8ab80532887c382cb70f1774ee4805d0ee34f03a90d2bf779ae6244d7786ad9a82048e8819c9b1b21608e69d6c463915a59da1434c48732a12d38ec3b98d91168678658292dddd1821daa0cb675ad11f61d0bc27ef8103ab6d84ac8178404237be490cc95278227d22396c7b4f65a7bc2dc4365fc4dbc609bcaa02d44a21308d708efb6591543007edc109e5c67a236014fc667020b64094374f8c1af000244ae3879dfe59831c88c145619e0a351797477f6c2c249d0a70e717e2890cdfad0c9f398434fd04ab5922551731e43f68d250b1a9b8a6368ac5d7c354079595cd4491732f6a217e56ef4316820233e18b5b1f632ab65c947b953170cc81b6d95100cda3cececb0bd9b5bbcf932f34a08dd040676ec5a6af221c936260a364bac628f10e64f49d28512779572a240748bc1ba106a045abd423b244f74a6e551ca14758af10a2b52e087ef8699430b5fcf4315788592f6017a5f8414201caa8fd9869f112a09734c343935ea8549a77301290c69c3c12477898d1e59a1278a712d6c5609fb7a52152b8eaca1f0d2488acaa29ff360acf08b8ac8cb33e5499f263851d72ee3c34ca738c760397410eb27284a9127e073557258a6f9bd50fa4541062bceb4b002220562d4b68ff0113913a8535824ad684a5c8c896925092fb35fcfcc6f1f03570525520c350e3ae6371ed02329a0819e85b6e81c01e5e6102d9236998b85e6c862f2c93f2ce83b597221617bc0180c27527cc42bf54d75a5a693dcc92be9a152c555d15a7f0d43b0c033b3b0c81db0a226ea20aaf5717a4394a7560712046bc7a4c413f5267c008067a194a78cbc4613b342d7b54f2a156a0c7073cdb3a8d3878b982baa646c2a026c5bd26398b1f4635c1a000f544557b560306aaffff45cbd94bd5ac88c94e67cbda2a42db366b209c871126f53a63f8db82f94b303c1cac529301884249736333456f02b3f1027881003b01b477ccb3e74306769e36b481c151d33cd836b0ce1561058055e5db4c1bf1372e4a3917d556b8fe2a65b385262cb08faa4c720d52c7bec5e2c630985bb2be2485bf76b9428bbc8649235d86956d2b10529109a585486dc622290b1959a6631aaaca599fba837692b533703e363b514121625eba105c38fc7116aad9672120036681322c5534dbce36d871052182ac3f59403ccd960115b1dd10aaf23ba0d1a097959571025df9357043793d33d9718b4d61a52c92768413251be32d77c615bab149d1d5fe85a6d2958743e121822cfe7ce7a26e0bcffbd616802ace0681669e8b0deabf61e3312a1bdd23d81647b94f09ceaf385e212241ec964c6f0890be494df30fad68bb02efd167ab7468daa8a3f2761016ce4e51ff8121050a1c1f1 +ciphertext: 99e4f2e5ee9b3ca4b096358df37595c943ef56fa1d49e0263751b3267aed0f902d061275ca8461ef93b3fc90e9d0ab4ae4a4f84c88d97781d0eb64bdd9089788d40793795687d688b96f59856f36ed44d2e037354ae29cb1c9be88fddb984b83c5b703ed6aeff221c8dd4c6e00e86d056c12e0ae0383a6760e1415b2e9c4d1a1812abab7e28c67dffa39d015a66e5deabb030a9abc0a3708cdbce3c9eeb601fe2ccee1a874cdc77660890803841ee307d7a93677390b9361569ed189d2c86b39e15c3ea4c4dd0b1b4933f08deb96bf9ff941d25b8e934225b850596ba5264b5d5555d28d5413fbc9e7d926046e38dc32b4afe1e3a2ae0b9e8b7f40222742cab3f881c0d66de197cc65f610c78f451c4fbab7a5ca4ae68e4f80c973ade891617ef84d0f27a3baf442aa77325058aefc3a6c349cab9ff9c992eaea9bbbafa7c5b45cb8f0aa3dbbe3d1ee1b42b1dc427b569ac6c673c4950058597efee33edc8c0b006863ddc4451d04874b68c5ea025a03ea84560d75af2fd4d61fa8c1885e82991f9b7e2295ce5a64c62b244f62156b3d7fcce5478844288d8e0f281bdf10602e2e21f3a23c500da300fc5b046145ffa6837489617d2cf8b901eb2bdda2ded25811712503d21735e31f9ccb0f39b5df7591d6cfa691a88f2a6838b24fd1f6cbdfff7b27cc37552760287ac735458c3e207773742ee4a9d469fe6422f2c9311800b3699e061ff23ac70e9280bd265ecbc4a792f01960880da8ce019cd5ca0d257b6dd08247d3e897e1b4054406027b1cd8b3cb1a61b8162fbf666b6d6da2de5866d6667d1fd2c7db64b679b09333cc2fe758478b1c5ef2f46324e7046239fa3d4a09977ac4aa7443014b33e0878d832f59ad2c934ab12a873167982a8e4884610e52cc57b905f029d19871bfd42859420f5c02b37fa5aad6a10886e5bbe18e0509771047d00f304a7c6a027f8f99ac09306fa7df36813b023cc971b67333f32a83f4c355e27ebe3ad09f27bb44de1568dfc716a6ba0fe4cd2a5777ec0d1cc82e9cfecdbddf8876deb2f136bb09943922f7014505e421058b8761c37a330cfa564d1ce875026f963a71125ae5bfd3ede4d0a03f714753351571094c93664bd90bfc58f4f8f7af06b141d1188af8b7a5cd0f655090d4263048a0da21064d020978c3c11c3768218a9030511d2225b7c642dc95914cd4b4d7d0fa0cfeb0a28965904df3e3d74ae5f2035940a0eb8958e0fbb58336ae412e5fdd68c8f0991f394169c6beb65f792f9c5e67f7f4c0983a62672bf5bdf5dcb5eefb2edca9db572e4ca6866838b6617937ea74b0ab0d5308a30097b407e6eb8fbd4a3b302b3db4467cf7b8bdeb9d9a4ba2212c4accf7c3328c50d241ef8e74ae07f0630eca9036a1486b2bcfd216b8f9d5ebc9376b4ec6c5fdcf57b1be2feba8c1ac9573df2edc28346237e0f97aa03dc453902f5a2d9a2945e9edbc3bd05be4479de27b787b24b34707906e082d1f5990503690891be95877dd17bce80b51722ad5acb87672cff9c336b9 +result: fail +shared_secret: + +# Ciphertext too long +private_key: c13658b2ac2d90ab9a0a291078812be8070da7c1cfc6facbff051ad23c6057330171398130212a10a7b4593506be941ff1290adad08f96d9bdcaab210f2a702664aa23126aab228d239b1d5c290654a3b042d715e2dc2cc2e0283a26b3bc94b290e2a4da42660262ca823056cb45427a795200e85994a264f2bc828a68308d772dae793bcd1957d5968a00f504bdb622c37495cf388d5d697b58b2a5554964c944504e128a9df5911fcc0658fa8569225d8e301d6b859d7fc26c12044a4002166343a623232d64da3e344aaacd3464f70a1dac05350b5a3f97cb126a8bc02554b86787b64336462ce087f2a716a0c20510655650876e47829cc65ca3761b0a20003684aab83b0a1d7975b45fdcc2362b49f5207561b7642d58c79b413aa6e673e4f050210374d5d601f475997a5b1269c00ef4240424dc32f7cb65d4f703a3ecb2eba52ec3928bf0d3b8813002a0963b171b963e1a4da1aa5de3eabac8dacd97d7c67f4aa43933aabc4434ae12b658456938386ed9a25764585c15d70656c37a1a5a717b51ce8e8140a31b911b36ac1b0568d3c125a66885d08aa9a7f8483586803b87a5ef9126b86b3b7ed48d6d582bea1790051a9e14099be709b39826b279a100d4b9cae3a2580ad6a57d45c9e93bcd5fc12900ea0e18b692f5d419fc984ac70ac4eb0b21e753267c049a7a8c584cba88002ab495786f0b35a7e15b5257b446c8e28186317cda718d9d01a2542850735c27e91a942c72354c99b5a57b40890399e8f67072210379e2c538db2c12b32d6a3a4b3c36bbd4c016de2a4667caa2be828a8bb80c9c618f226387e4689bb34b64faf3027b791e0a233ccfc77ed4d870907b8784286c241487960a4fdbac40eea80d3132cfd77934dfaa37ac729625e9ca6ab94d7da03384a76596cc6e8c6bb1dff1ca55675c62e2994787b29957adcea980e6e69e37fcc045520cb5f08639880329459269c50db665a18d9c2de7459b19a722869cb27cd9979b2b5a827c41266c30e01678fc07cde3455c5617b18be88fe72734ae43becafbb1c37c09ab992db59bc4bfd177d0f6b619b382111613fca1a55c281e6912c08b94864bd3bf9432733600ab4288b287f8bf2083c0128925f7fb2b60153ba0b0338852a6c9e116fdb5465a9345681791767b7537d05415794c2ea04514356ad524c8a200327394a5b43a94d53974210a19831b1e0af7a34ee4c1cc982f4d7c519fc7aa036038a3829890838327c43ebc174b9ad70e638c0338f5c491b9b6b3e56f05268e7508779e80ccbca380afda3b83c69a74d251b33630b84146d0d97d5fa75dc731732895be5019015cd00dc34c474da14f00d89e9ce872d9185afa107e8af162fd102874a27786d76bff230d79f597dc2c6dd396357ec6ab26f3c0cf0350fd8611ea0bc51902136437ae70ebb3eee31fe5bac035f9a63eda5fc6616b31b2abd3d9bdd51188ee80bf34907f51cb003da444a197cbd8577ac0070c6994b16778233ae1aac6e590e7ba86841a3fd72a90ed72a929dc72931921d7083832a5016ca84111580357a18bb66088fd2807d38b25b291a6ced0b5b9a8b2e32b70455903ae2a54db95620217b8a9887395007c3f392caa21149a7b77bd478b6dd3b2ad1a9957656f854a268a7b8adbd41f28db11c1652114e8280dc598d4102ecb964ed40b9c8a696c9f0b2d4b858ee5344e50b30e17327142bbc01e36ac5481adb80971aa736ad3d07313e325c03974e1f67ca7160da2d57dc62abd64d4af28dac958da4b15431e0428829bc480e2724f7644a96815588a121aa58474a8e6c33443c0b3a29a5cd0ad49c34933b018a24c6a918b07a2781feec38648eb9b38c81f23092a936b6b1890543a0b2afe2b690fc69c98a87fd3b6bea4cba39a320807c237e05667dbf1392185838a48012e18374c674a7ed5132f9438894611ea78478fda4b9f900d983a15b5bb9743d36ba0a532349a42e873b5b195c9fc38735d3c60bad431873ab11bd68febdb199310b4abf3a19f84bb39f08c999b56553b2ac3a30e12aa0438926906f83f0c91749458a18d176b0e358d4e44bf58fc883d819386aa11a86a64f731a93eb2a6beda295102c44cd22646c68f2d75695071aea68036efd181099c8c615650ff6b63a9178901f9362ba75fb5d01b58785a70714f0b4707aa30178e673d0b3c2a1e18cf12658c2e87b89bc21823d66be3b0727553724f32aacb99492bc96c698c2060f2c4abec10cf8a522cc5ad4f9495550c5040d845ef163af2e7909e21b164a661a8f70dfd419f1e9c408ed4a5f3619259d3ca6a336b7c3c2c8fa149285442c5f461a398a6fbf1829bf53b4e05c40c09c98edc2069b5c1a1bb270e482bfa7c43b55505ab7b72b18a20be313aed86479bbcbdc09128d970c0e32a505c138e6c68b6b5fa2968139489578c72132071e7448059485ebb2151e5b689c44d0eaac13c637308b31469acb969bc68af2005a622a5f8f5621212b4ae3c3ed35a01c34a08e19449a7a8906283ce83100eabd634ae9121a36b17bab105b5b0275cb0b3e1e006b49a53abf11a1e4a35ee6c2ad66a29df046e424b4729a089e182a9e28781bf3c525d578c4a0145acf55bfc712168485b02aabfb01a95c9e6c4ff187b2a234f7b0a92b1fbadc20105a0833d88873908e013ff14ca00a44be33877d7a86fd3887a4a5528081126d469c60f60b500887c1a8826572a899bb7bbd59c347a422dfed7487ca50ac464ab02a20fb6eb8baf7a197643ce5ec58d9e9b7b9bc838c3b740216819630b8cf8fc227464a7c754beb43328bca446bfb2854512417d479b49416e6ae283c97a5baed11c83f821cc52353836630d8c8dd4c2a98f72897272698b34415ec785651b18d515a7f180b82892362deb09587b1aedba202f8279e3106fe5dc4dba808b01e41c8b63c361fa33238013e554268ee22976003192998e5d672b710639859cad6d1b106cb303a5d219e5251043ea10d5e9bebe7383a236535a659fc8b253421385ed8b23acf69d0bdc52dd2197237499d0606f78012d1363100100bca1a160aa6c805b815e6786b7020239d07b74a92c27be8448de8b794ca1965ae445ee2702eb41a515c42ccd080c020852974584c6955b98448959d274ac9a36bddc57c3b525765664cbcb186e80c0b070ca1ff899967c9fc667a9f6288959a651cd7aa5c4b30922ecb5ddb8852530bedd339a27f06293c024fe6583b902019e1023ca580b855427c07c4a3ca4d1df6e6bc58bf532916680b7547485b7c48f60bb81e362f47022491f971d3400f5f893674970fe3736861d5cef1170fb4eb12de87a7ae30f8fee17115183fa11715c296d1e75806175b305dad7b7f53b991b17935881975ebdc118e5e3ed +ciphertext: c4be3e6e2ac78baef00a51e4c1ffa9539c35ef9053a78dfed5462d4f1cd63f3f96cfde208631329ca4f46a84305a43f789133b6b91d9509ef2b3cd5ae2ae0f0e95417e3b05128875774e838e0374dc1242a437ab180b6c76dd62c07b85e8a58ae7f7e97dc8a84818907820a320bcea557e8e48305abf29c2c586ccb13852a71fbe44c3681d03663ce80356a606906a6fedd10d0c32ff6db2bd7889d3e23f73636b47b43fda96986183da351dbe4ac65e542254082a769872a7d3ec78279d01a6a66e9bf366c6d8dae79f764eea5fb8d0c48438126ef046ffabe2cc544f4f1ac34e8bba5e5f7622321b5fff3b0413bc79ee8411575bfc8ccffcbb95b0cc588c75c363a1d0f37541499deb96e19470c68ac74826aa9d06d9ca12b42f8c543e620871f925b12727b9daf75a28624876a2c224fdb65b104d42a8d216f2cc35cead8ceb1a4a44e7b235d2a37561233d3786b64c95da7dd4c289e8c82c3340e1293c78becd765d132acc222959e69ce1eb4c5adfa624050bf4ed585956526b1f0fd15043cebdc4de7433795357bdc84a0467498bcfa4fd48f7ed0ac81dcddc3c2ee03edc576de7766f86017a4bac33bd2611bcb3d6fe1aa463fb84ea519bedf10349d692d86f3218f41827cd0a26813194342c7d9f939dd3e6474cda4c76d242e6d7eba36dcba76ef0a26cff85cdc53c905a72409a8725f7bbb7a04aa49913007f33e41a6e6ec3de45308f21a876eb5b60ca0e6f2d5c71dcc54fa200b7e96bba23ad5239def73598d9c3f79e0a39dccd6967a741ed9b4305c32f3e499f5fdaa88ef57f61e31f6c9fd2d81fcedf77a20a0b34107b26daf3f4e7db6bb9b830ae7042b3a9fe0f7a3f7347c96ded20612074e377b57dd613ca14edb8d2ef2a1d091787589fc751b33f6f9a7c7c2e6bdde97a1de369c9a29e32fe271d170a4ef0b56b6d2c9341f52b51b84c717fab072493e34e81ec06649bdd6d1f237e08e846f63e6f86a37c1d0cf07f27ded44304a52074664621951b8f022c0f1f3f40de6febe4e7bb690c227e31fb2eebbc86679149e6f4f0160469a5acb114a2e305dfaaab73cd7c2545bfd6118f18d8a3b683aced09ce59e62e9f1670f67a4610c74ec4e262c0f8abfa0142c86c40703ad3292eefe584c1b91f4f1d00d9bfdc9687ddb87cc8fe04db53a647402e56a013514e8eb84d2e0c6e20dba1e188be8c981e9995b6fa60b56354ce6ac9455cdfc93ae6a5979a8a9f479b8cf16ac1eb6eb764d8927494dbd55da9050d75c29b5409b082c38033c532a336709a268c3e2cbb302b319e30cfe2a98a4a89dbaaa95fbca58c1e03112f77df3d514a585605ad66a54386ef8ed6056d0484a22ee926a7caa20eb3eb1bbb0bd46959e64acd25c347cc1b14e56618ac7131e989da5f22c20093f05506870811576e9386baf15b4840b31c0ad23acdc5e0ce20ea368c7de7f99d8d74d50ca356ec9b3409f1a3c059bbe5d2b7b988775fb1acca239ca2a78ae912413864bbcbd397309e4e7a36b61c943a2ed63038800eeb09 +result: fail +shared_secret: + +# Ciphertext too long +private_key: 5e42026541944e174d2c38aef3443052b55459c302d97610743429f2c1be0268c498178972c105b0ba3b77b23c7b4112db8540a7559f6ea416c722336fc26e96118b3d6575d44010a8310111557c95e2ac33e92462e85605d1a315ab0d99b36c61f420e10ac118432cf7e81c00da79e4e083c965969e452b57507a88e17f68484f11b06a38859dcba1560fc8b406018dba8b36743c7f9010064eb1714b266c953b93db773438d82707f39ada181be9517efb18c4dc107b5cac6f35d16eefd81d0f6737b7bc99a362b964237bb022c3b1f0963100522be19a0e8b58d395455f284ac9626c156c0ce5c64ba9cac9090856d7aa98d9c30c653b24fa08bf4aeb28062762ab44a4cb9c61488091ac50a58cb251646815045c00a9d74413361408683705895f5c69725e5448490cceae432374c627aa93b984646faed638af24948346a57dc4cf9e9296e3f4a394331b4f871c3b97b5094a56960a443ed7a285648e1954b1a9fa65807a11af8c55a028bc6da11e2e6053ee7b9ee24c0625db764df5a7b361ced39567fab7c1c756ccecd79e8e7b30705bcf9ab814a328c45e3644b3f0ab84125f012161ad70173630af7afa0f2655198640bca3e350de141bc0756d3de2b40648309966726c694e3b0b4097847948f3c071f9ccf292520e9b9bef207fef800c33e3bfe612c6b6313800918c93f990c2718957e67048821269642733b58841b08ca688721fe4728eb08696c133b3a61370bb3be080708a4ac6c4ba4449f89b3f81bb332565b8668e90dba8c1779fc9b85a77d481f6b5014d6a2ffe8a9bdbf9b062542011b67fad7321029bcf7ce8a0f5b6a9b1921da91b5c7bf15df9c3034c4a6a28623da7954754650f44c2240ee40aec251ec6457e5cca3b15a80d7640791bc35218d6aac3382cfc567a51833381343514821e05301938196b70d51488238b62494446852d3c31acd2a3c6f188a593a640cc901f93e9ac9593571dfa5dd2b638571cb7b0b1846d418840212fbe12b6ec5566f95b382ef471c2e06c16b0b4b05a34015628b1fa3b7772621dd4c670570a80c105ff12b98376b313707c13c5901b2223cd27867627ae27c622900c3f4fc6470c61cc31abcf08257e8097c275f18d4ad093b17c63e43b4bde9c2f32b0a39d976bd8891fb3503c58e75337a7a7e25c44f9e116d9a56bae977ef2fcaa6da61e53560c1b16cdee1c5356f178cb2b0987d868473512beeb3a54a28f19da2443316e50c7011a8a2c6e6babe1438d66f07fc00886112915d16c30b776834f66a860333a357802925c4f73788561934f53a876ebab075139c98b528da66a06ef7703bc83aa44c23fb163c470dc64adcab787db268a9accfa7793fccb5d54485d4f59cfbab7397d446dab9230ab52802ce12ad863aef9e3c46753cb0c77825f12018f98c0d8fb341bccb513c176c06b8060643aa575249d0127c0145c271321fc169872ca2c9e016cbaaa4e40269801b84bc83413c1e51707753c8a7926e39ca820a184adfbc72e33cb61e1acb83013d2cca280fa268282b075f5bf2a5bc0c92c54acac24bbbc809713695418671eeb177072800d9b7973d216c4e346a3c4395b753071747e95a273a1f307b3da1bf08668b5aa92a5ab846573989a2a72bbb556b5965818553c8f2517ef268bb118c33391a344ca5de64b1a618211aef727b6858d5ca4abe81b73ac5b3f2de54209977fc87574495a334cc486f795b221e6bb0cd360b23cc1d091bd387345f8b07483269f6d2a75c3ac82d74cb0a3e183c226710ec12d3eea34ebe803603b972593c5872accdc352bdf6ba1a6820b5db385a2ac46c8c44bb8e94653455fea805f9948a593b766487287f61572f1d3b74cd55981b61e7ddb9f0c42b07ae432f05227c6650e806659d2031949b8865d51551c017419128938597ff82129fa25256907b163b22615da1fd48270a744a74828ce61030082434ae0a7454efb8117d140f4c925fe89967bc915cf4c6b74798625a3867f50ba9f30a9039c93a9534d8192b7d733916dd693d06597786223c64ba918bb1f14ba50425ab6d51920b18268e21ca1e0c51978671640eb48dc0c5d42495fd58c5db60922d5ab5a30548c18d6549da285bbd0c244b189991172395301e8c3483ea217dd324b37d2b635ab5b90b82d9767c8fd2b86dda51eb75b674dd827acd13a9ac82b622ab38a5b8dd3e66054d14d32fa19d90c9f37400d4e14b8508acf0e701b9381af9ab91a06901ba87204eb3035dcfb9324c43a701b678a3858817780b21cb7d75c20a1046df891cc36a5328135577a5b159c0a3d66f85656f178b7cc8d75235cca9a9227d9c4f3752539e04a2f123d6e4451a1091dec575a753227628058f8fca22b1391b9221b364b17d7d88f162c170db390a780353b6c0c93137a2ed32037c85df41887144165e6b11324750abb75a612442b3c313674e0aa0de42cf41a95742759daa31c331c64f0e77cd331b553f00bd993c3a945b2cf5728dcb67d8ebb3e8a07c314b6bdf7069a05942a451846372c6df1e0537d4cac8a99229e126fd96bacf7007f8b8524f994b121a155316a723aba19cc314167c21ff24980c5704f305bc050689f2566c8f4114b5e6c5552f32abf88a97e87170222920b6358a27950b59801aeaa45a9b5ade516bfb6d47139c0c5f3f470b4b354263559854a94a9120d88e42022aa0494250d48160407ea6dc138800c7984fa974441e370dfa588927900af1650f3521e2b55c4689060088bc73f9c615db2beb8aa4870a8c3dbf03b44757126326bccd660ce5473a9e277f3ea05191019de0852c6765278d4c6fb523956404b0104c6d1c386d310c180327b559b6408937980f58d23131d4cc737a1a697990aafa707c53f9caf3b692d6d2b4d16718dc4f5ba2b04b82727c656a62232a18e6ada0eff3c810a8097cdbabdbc2309faf6aee9a5ad7248ab1237c241ab01b1056049d49949bbc11279bfde27a57fd5406137b5ae945e9af506cbb8893cb459c8887cad0960fd453801865146336b3d50cf832b59b4c06d84bba54803ae29e628b4240e4d64a6216a2ab2b3c702b00abf179980796e27931e2cdc4aaa91a93c8a2638e94c4b1bca07a226fa791e5ba752c465224a440d95f092e6ca2c7428cade474235aa74ef4623f6053464953c4cd2779270b34b534a41a1a6cd91b59ef39dcf034d1b22815d71c1ede306bcc28eaf714127648e5dfa4dc4ea210b5b0a5b94ccdd32156ebcbac4528e2d5d539c5d8746b0aca6136878817f281431f1761b3d46b10f218fb79c8602903918698e58c65bef6867bf3af443e2c1aa050e38b2dd1abce197dec89b827dace101ea2d0942f26e76e7d157d298cb773b82180423c86a3216f3cb1a08 +ciphertext: 4c7a075c0f2e8c3e7b60e91e995fa680c0c5d1d65aa4b9b9f7e6189d991991820745e80f09a3399cb6847e43a766fcf0e8e55d0746d549067d1b6a2120678d9b543a01413aa481bfa1ea44b09303df438dd85cb0f0c268ace7171942b869d73c6cbb1bb9cebac3c353b9f08b119eebe2af46c1fd7e97f8f8526284e69c088cbc94bf06a7b596d13855508491b88cc971456c472559d911b8aa8205c58e462bfe6a412b46ce5e273bf3f5de37f1ca9f34a08e6a25f7277808a176e6cc041998333d55f6e7d7b6ce336e5a392c8593a9917f22e0180a761d85d3189304c725dacc2d123fe6c70422f67254211ce221133d36598359ae46be8be8606322299b10d5942596c1f87291580eae59f0bd9132e98ffaac0d1c158899ed88432e6c9ade1a7673455bc96b34e52925cef14b3e64a44bdc2234821a08dc9332d1dd32e1e780501e1d918e9d2f4ed2e2b6aa17d3dd786b73ed2bdd8df19ec5fc40fe1d27c58f2c00f02f6a7f3063aa748f6254fc8033a91abee02d0057c3ea9070c42bfdadb36c00c421009d6d62e201c968becd039bae8df405cee9ed40673d3a1abf837efe0270fd0e639b4e682416ff569a97886fa0c0990233105db561a476a8f218dbb36244f17475c8816fbe58080b5a50d06b94dadd5bf3ba8cc52e5e4bed5510226a5005d285eba37a5213abe165c85b5727411dd27089e4f12cc89acb14188db166130f1df407d727e96f9aa527a9b21f0a4e4f2c6b55fbc3f54990cb3a547ceb8d593c0be6944bc749a325959bcf3af75d2ce88edcce6dfeb238fd83287e406ee1138e6f012b47a7fe44c195fba58a839dd631d41b17147e0a45b6e330a6eb23e68e04fa289f4505ddf19a3680c3bdcc8124a6b08ba49a2443b894d4daf070d3ba2dff3bd6dde24e6fb7f416fd3e2dbe2e38e7e8c139595b0abef62fee1ff9e24e8758e81a54e39b52a2d1e3c55d4eafaf541b44d3b6b7d7056c8bff95c14baae1be094d5f43945f34da10913adce353ef4b407d4d85adab51919ee209964aa3776bce5febbb8210dfdd0d48f00680195579bbd5b615b913f52098dca6a96a286b8147de03cafa0af08215356ec3aab74148e271315c8c4a2fec4f3e62f175e40d4f04bb29dd2110be7e062a9b4318806ce5bcff7413febb63042f433c97e71efdc9e669047408675397b26aabe84ffd9b6615aaaf75f3ff77d1f47985fd8c6b10aacd290b81d7cd2c7481b52edea024335081d810a64f91e4a63dc301a4cafe0434da882306fc95b21d6124fd3a634ab4d37dd4a72e131379af837fbcc227bfa596d688139aeb2cac0eaa132d30f5287eff79285533f4f518263b836f4496bb5674fd9f2503c24a28dd51b41a463bd687a5b8e4c689bc1a89ef3fc930b1889837c2ed07ab4a0cc79f83d6efd20b97dcfa9ab0188a16ade77b4545609cd3d9eadcd308c3ac65b751d982175ef7c125b9132ade7416b6a5abd58f6eba67d22eca893a6702f75a2326820b2573cc9adac81ce23fe9c3fbbed3f3ec4bc3740579fad76fa252d161c03e82 +result: fail +shared_secret: + +# Ciphertext too long +private_key: 7570ae22b889bdbb319e55486dc253e9216d99fb7e3c2753f87648242004649934901074835b55ba54907df4370a8cc69cf65380b517631972fa343d9ed38e343046677a59b91760939965201013f6c996cc72be8d4cbfcb859a9a0a916dc980976ac7aea5b1e9756d150197ec4ccb66d495dff7b8d6881a40873004e736e359404cb59b98bba5de6282496024e2d1ba31650f85c6560320b4ab88acc12a2a3e45aebc667f58753ff7a6bd9e240570c3c13d7a15b85481bf49c9af46a9f3f9886b01a62538a5691232a9e268d6a99102b38b2b8b7954515c7a8aca6af7409ee9cdb0a36a18d12f15c17dd5844cdca90278286180cbc707069cbb562bc46ba25b097e7df498508cc9f3bab5e5c05035337132f33f76096d18f0520c103ca7b8607d669c9be90226a9534dcc2030aa51391a474f1a51a81ba6cb28bd05b4a0fbe0326f894740b038438c1a45415a35bba6d2738a94988895448879916101288c40ba1fc46854718c60b3432122563a65369fea424f1ec2a2d3c20235241ddb0627a150b871a15a9dda08fadc7d3114cbe0924792a281d234af80bcb162748e41e869a9f121c4c007923392368159091a72be641d94194050fa42947325a2f3c8052408ad126957a7c9d25833b5f9a4a92117804519eaf876882abe63c36b39f8062f497ec7e77b349a8b2b801bd7408709c27259b40c213708e73077839c6b7c7bc7853204e73c31dc9a81fabc99d51284c4994a1ac2bcb1aa4737c8a219806e7dd84fa0ea525f370733276856e7c1e82cb61ac1004c616934a14c2294aceb165f54e427035358b27b78ff449c05e0acb1a972b09c4209d28e0e48b97c5cc8bed4c3897a5328665b0814499e68c63a803e29cc840283ad5218ba8bd61864713ee5470f09e0742a6186aaa3cabb15907c10c3e988614e30b928030c637232ee6213a3c559c7dba35097b18d866563186c401a87768969d978703fd396a688170b990fa4e0867bd77b3a800bfed64f3e06522059a7079c676b7c80822963a053ac98178bed5539a0f001ab55a9e1698948b8889d1423b2142f8d43a453748b0043ae0f014531eb0226f19982441ea789562bd1180a2c285cf2995d4bbe0bebab716a68146a668dac98fc168d6ce9c93969a72ea070c01145784a1956e97e9ee63c903c233bb84f4a40c5cc8a40c5556e8d2c56c92c03c4d77b3d32b221f86dd8526ef592a0069101bd2b5fbd0a3bcf6c6bb6397f6226b202ba5dbe291178d20754a0837295c3fefcb3b20acc5e554f487c938938244a824a03c5aa45b54d28893d0dea93cd66458206aa92086362084de10b885482a42c7145f4f114b9d22707830901917f68e820fa84990253a2ecc92f7cc10b1498a494c67b395b34357aaecd3baa04276b925aa72f613a29f7b84a10a70d971dfa187651e1110d860c55d77d56367927d96a26504298c4a10102c66e22bac48031c7387c118c4e42c923c5ea1deb946fc037c2f1165f1d6333aac64eb648a2ab016a0590cf238254b2487b5e7b8d8d716c7b35aa5d47c2ef583dde8b0e20bc4db1f3379ba675d2e8b5c436296bfa98b9fa892a7990bac9ca18660fd0c36718688ff1e64c1216674878a56eb11bcda00301fa12a5ab3a36f334b769604b0098f23464242ac326626bfec64ceac0ce26971883b53223669c07746ae30c0ca14aab533629d608205ecc1c951c5b257790141632e6c2bc85b70ecb6b1a9eb692a05c77ebf4c4f72b2e0c287dec983f5b9a4f357b29fa1083dd03ba94624dd481c51b2a06850c04ca6757f921ae0895887af845525c673f4130f7329eaa72c50a7966204302e6882be0715b57e250fbf5b398ba96fa715614e414568c1062126eb4bc3cb020469a506879c110a6e6b0e55c9ccb5372f37a1b61bb48d2e8032c5995d4a005da7b4b4b01af53ca53be67bf7a20734131693c2562943643d911bb45777b6e063760c35bf3b4767a880952b1556df67898c3290bec105f769b07151e60584956f0bcf1da8dae81179475a08dc293c7c690e73977798959c37263f9c37fe3e64fe4bb38aed691f77526104592b98c135986243e85351de317e3cb4831b13ca7213a0c0430ba6b0a4a6ac448888ba1a18ef7c98e080a3a26042f36d794b590717cc8ccf06324dbc52c062a2dfe89cdbdb22c2b11614876229a96be78229177bc4aec9317b0f062937303746788e568a19f9330429c5a6935856b317e1bf3031939bbbb71b9f020c900144018a8430ee6a325843a28b271977bbdafb2837d4abb496a4d70264d6565380be21ccd232fce4043bc8c6197332cfc574bd032b095d09c805811bc2851fea5ace9f061de350a4aca3d00ca786c16cd6859606ea43330b18a70c1a1f4938b8ba0a79eab30af795f8eb51992a12425ab02d6f514c38ba18c43b22c05ba268b2575d316c8a544a8d69a89e9520f40719e297eb2114f7357871ed0a9235312b2db28c82bca88977a5d2a9c77209a9452784b517881eb269e83cc7a276cf3a861e8f2cc13999458bb9e2517579f5147eeac6d08a3cace8070c9ac6504a3907557613b07147a8c3b5cf33a8d628eb0d0852f9b2f0514b5d043983099a289b92372d5ad1eac77b711500594a32354cf535c9dad19853124c6fcca6e856985e9a741b7114a08510ddff202c59321faa08198cc93aaf95a34409ced03a22e23bc141b306179beba3a4616673b20052a58fccd27e20f791a218b27a33a450a6242b4e32b114f091d4a545b29ec0f58b224781a0172d458977186a851cc54bb01e5c19a2279b603cc54faa98ef0b697fccaba20c93594f01f521aa80d887cd17cae1f1580d9b991a93328ba900afc902111c67e2049c17bd5648c7935d2e9be55e7c49ff9215dbca10e7bb3597938845401786a5483751796941d19bc4bc5950917a9bf0f4297aad521d14236b87b6e25ccb37211a36b5b2655cb2e5a8528733b350a66c2bbd529d63b839ea89df394c65a1380ca509bd5e5a946e7ac8c6634cc49645e44c4ffe16ce81aa8d54199c53b8fd5c652abd279c19271afab8af967b8aa813ba0b09d3ea8437fb7a7b1c978b3db9c215b7088655a6d40c3d24ac7b96838eef1cd108720bbd6cb9d594a5b488a353370fca36d7541b196261bf4407d10e8265118546a1406fc40071d680e755718d7594cc3144abcb64ec1e56bb496ca49a49fe2280480a224631108bd946f7464b47fcc6d0d903c93b68d784b078d867344f2018202c5ea537a58c58f0066cb42f9e9872d53581d185fcecce32a28aad3dbd3ee749ec6efc4b27bc6b7911c86cf1e2c0ed5b82de0aa9818f323a65a7ae23fdfb8debba9c8b9408bc1bb2d8621eefd59024e39ef59d8f2205cae5dccf97278a5554d20ec +ciphertext: 091416d411fce290c9df8d6c95cab83b1161c9df5ac7a4166226d1b1c211939b0f1dfe59a9a983364c67d6bd265cf6827429ac5bad5a741559672f6b3897669f72fbe7cd084ccdf5d0cdf8f35d91e9d46902aa0d8dd6fd1847710628f2c85b82fd9d94936d8663f3ff820f302e264ad77755d9b8c04a5f146bcd3a24c5abd145e1235e89667ec4111f5af6d260695f9008ddbbeaa1a55d1935286f6aecd38822de74ab156d5516cd0a3838907f4d16ad864d1c131f04ea7add6d57d035d8bf9e4b7e6e641c8b6422a95bdc624a7fcafef7546ffd0be26ded64b772e9469201c0defef69050cd771c38eddc21a54262bc1e8053e4bff0a9939d46e43995a99a945c87c6297600bb839744b8eb86cdc3b22008262057c167f677076843478f1158625dc7bee211edbf26cb160dcc3ef4ffe474df28a924d971dfa9bcd06eb5c0629f67306a911d1e5c0b6b22e5e75f104b40a9b7a5d5065e621698554abfccf93e45fd5906f7c4861442610f2c09248648f073ee4380218cd6da1821038df3c49be9d5b46f62be9ffd4c5b96735452e53b248a2f573baba341c96348905224f1d2fcbc2f8060dc6ab08cc217c9a792722d9c87045b72ae9d3e3ef87c599a1c6f058d3292c1296023c7bfab1c25c3263f9be10f04e8b062426be96bdd8ca996c0fd453931e972c20adb2d7c4dabd0196945081fcbbdd14ec826b388bf6c5159ab10b87112c3882e93fd4fd8551d8d9e6613caf0cdea93300c3f3b66d45512a5a322c129e60c9e267f2bff1a98e07846a40e248e929455e97521a27c853e291cadc41f913bd963c6f5f3ad650f97905302ce6e21e333d6b12c40b8797735aafa0cd45b90ae72e0a7e3c763ce3ddb929f8f8f7fbcc6122a6d45508ba1fccd787a346c868a812715c1ce4d596a1b98071f3ff075e425b9b7d1bdd9ada601ddda26611e6d1a342a4a8e438f7677f1fc90ee2d8b65169b325a0668a38b93a78d8e17038abebe83abdbdd37fd8c7cd8700c72c9244c77bc9dea3ce0fecfc3ee44a5a17bfb1837645d79faee860bd5e9f3416d701a8d4487b5266bf4eb53ef9884e0db9630fc64bf9ccf9920b6dcc1dcaf79cbafa5efe62febd8baa560908b57c8dd51616151b538ff8be3504b232ef77aa739f2aa5f45e6cf9c2da97f4ffa3338b15ab88fd1c75e9239d668095df55e466ee071e607a5692b62fcee426443ffec0e84078786feed437d5807f152a7f2ec57a3bbc3eaa105a4dc3e2c3988c64f80990a71352aedb9947929223fe6d1d26c9bc44eb2961bbac7d488b1832538e1be0632d8f3eb40239285db8a12172f195b9738cbe9a10cac738925d03ce65d676ce7a1c1007a7b043a6adc1d54ef8a42db7624ae7211a3b6a1c3f15ef2dd0f218601385429b15eaae32e2af93b777862d0a6a94756037bc3bbea1e78a6b5d1dfd10a0c8d23efc55312f06969cd0afa9a893b6b22fcb81b791e30020ae75849d66d702608a4bb7ba054142898b818051de54d23ad0368129528479c48381ad2de893065e4c59b3b427b35b8f0803399fe1bc78a5349114f5f181bb9c5b82ae0d5c8 +result: fail +shared_secret: + +# Ciphertext too long +private_key: f8cc0186b8ae38329fe6956c21c7b801c331ab010e4aeab234c7762fd798fd92baaad556a69cbbb5e22756507b629661c2f67a80a972273aadd70c54974c6b2de53454bb123ce425619c2edcd2b4fea9c4f6978c404aa1e788640698b8278247940b3cbd476083c27a0dd966d631cea890339b11205680c8a6044e45f8bec92c425f1b8fd9676d29512a9e5636c46438e10b6af36696abc9899b68cf40c7386a9087171629dcf60e8e560f5039205e7b0e72926572619f872b0776e8051b12c9fca93e08d300f2f47d7299181fc509bbdbb4a6480fb89310e695b91ba3893950453cca42c3e29ef5939541fc084a4a28d2980af4e8090ad0091563c69f0017561b9950644ed3a793e79a90f112b33e510f892c9711605ffc155843fbad64145f3fe1baecf993c1477e1aa7756097c49be68e4ceb9d3c285f8f93b22bab2fecd401c8115800bd1e2a9630b18c3072101b403685da95b46bf4257f89a7b7ca1e39d296851304ee454368089dfaa77f239b91816a192f6138546678ca34967ceb0a047a9325f61ab29320c4752498c9840b747c4b536716aa0c677abe216379b167b7b9d0886a938270ab099dec80e4d198c1ab9e6cf599b23a2865338b7b9935efc0831af0b115b92c91c560bc28a0f8d764d04909c5d21da54212af415e05715a36d19a4b3813a1206376156548c00500468ba1a53e90c88f6f81c8463087f130675107561e96ae2385c5f321246ff4bcde915a5ae0500c46708ca31381b5575f9380138acb080275ce6882cbbab3b552475058b7e5fc8881ca82bd910bc57006ffd48e91944cc02a296517af313cacc4014b9d87b253d7b4b441caa4f891df1103fc82110989c953938bf24738ebaa04afa7a898e326c97c60d65597af16bbac233cf6185788cbcc30b93d818cb9242874af8447680b36317878a82c6aff38342a1585a2d36171b90294d21bdadc5bd3767da55682d13508b037af177510f0f2563b239fb4976f38f54e0c936c728ab525212d89949f6f018b65e567a9338805c236a2c9ab251766c1a13c4d882068cca55df552beb250143963b98c9612b779172656c8d4cbddf090f012b7361103a38a20c11c22a8b10f9756241b27127df381b0e9164a8c8a11168f90329da044cd0e0834642a139cfcc460a4507c589ecf00a3bb033c5728b2ebe15d0328c625191e9ef30bdb4a5ca9e952effc438177a3580267d51caeb8675b49a01d2e5917e54a15b4db8637accd962c117a930a6dfa394a0c26412453ef15241220959a932598293a32e3cd64ec2bd3093626054e53f26d94bc5f6db55b840bae68e989d6b0332f18a443304a02355c88d95c90392c4bc778ca9458dba17a5e034a434629f772b77e5190538817a70a39d6433e14ab41ae9a9841e17a994b6a0baa866ccc06b66c38328c99e3277669d571ab035f287b2491d6a28a6a96a60b740ea3cc564030b44ba91f37c8f3c29d315829e73c26c8c9749f8aaedfe7811e943309267b5cb65a97d8bf4fb3ccf6ca9dfe058c4cbcab4892125e885528742631d48f421a60f5d34a60299b7f344dcf6cca63eb5764852d748952acb83e04c8660f803f3105aa7443c5e232640ae11eca781ccac2833893398043148880291fea825e9cb0935ccc878052a9e22d6fac0f6f3093ef59a16f250e08c7424ec5bec5c61b0fdb4b70f68e87acad7cd041436950c9096a50c140b565320c012a52556f907672739274add83a4548566d668bbd7618b1429ac5696c9eb6756e233449269676f3ad2ef98f2818c1ed539918029d1e3363a210cac5a6a780b0a1c8ccc7cca776dee732426acb2f32ba8cb2444cdb6702225fd207b436aa8a69300d21ba18b1ec40a4116228579def0410cc780792f54871da4d91370b23417b13870bb5f38d98f5af69613886fac95fd826dac3395877952c0bcc757ab8c78ca9a316c24384106ab4bba56c036223a423dc88b8f262950057a4aa5e4004016164c7cac7268c54759b68030bf70518e23b19073735e80ee25848ef311ac7671dca328979a75594a1c93e7b851f613d354a3a992a3a02927db9f62ef8da678ad69f01818bdf45c801334bf3a169bb3aafb7a45f59e39a9f11cc56e70e3a695537f73c94d879631966d014ab6d94a06af10a1ed35d93dc353ae1a0d9f7b40641c97f47324a3ccc62a6bbcfdb155072b0f7820640f18db30bae6ec3762594992245632d7735994a3a611166126915a3447fd148b9169149d131354337bae70197942620dda086ec37798f2346f0eb8694a7b7a5e1a096b66e3fe17821880ccdb0c353b347ff1780ae235401f889828a37f369053d8058b6da5ff8aa6984764b23600912395cf5357153b49f8a9099944b3a4a933214e37cbdc053ef9ab05a1488327c8483156c40c3c2e8a06600b261aa38a3d430a199d02bf7e086283583d6853a975276f7314aab7a148ce18d78865537b6900d5453dc031313b63f9adc519b758964d48eacd119b0b480e129539587ad6d98050c718d9492840fc3cbe2d21efa48234bf0007d9b2bdce0a45f5639d3f9725776c7e30ccbed598042681c10c424534c2465654e63763369c147c5e60a33c43cf0bb73be043800ecb5e9bc5005251b0ae500a89351a10775466c9541e159d1dca6bd4bb854ec69b6e553ec0936d4d6841061c145232aa1b43cc79c92a89ac85312b54330798a5980d57406aa74310f42745f200e44715ea26c55e068a636fc6b15731af1c612d294630242a62f7c364ef24386440ce8e39d4151b4f8f933b03a12fe986899d812885bbbd82224e9f45f07c152dc363691f393459a9c46db236270648de1490eb8a6160b187992c295791457d32742d0c5e144cbf5e38289527f1d51955a526fa48a216b55574480c4a0d5900a4cb66162652e813273ebc95ea82e432892eef21f17366915956d13c20ade663d8a047d68a23e01c782f348a6c14034c3b4bc25b256a9696826647f5405536b9638a0e54ea9c1286adc05e072391f35893eb2cab0257c377021750c3e4906487e3c6b26b6c50bf9501579261fa812a9513d2979531cfba3d8d62f8b0221763623be55cbb8d42421a29a674c1e758474ee750f34e50dfceb29a771338f516ad2662881c4cd562198bd3c2017ac5159b63536dc88188b24936c2fa29a005b538511b8582f7bcc8fe1a0d39c9c13a86d4b51a4ccf99480011b11eaabd5f4b2a689c2a0b7bdb793704e4b86d861bd5a868d0fcb2e4b6247a05060d3ce61f7a950bbb05c42620402cd1d8a18c88cbdd0327b00fdfe91c93f8e9c2c4dbdf15f48a6d8d7a6ce78959ad6e66a40999b57a6c36703b543b9358716020d14307fdbfe089e2b4a70e29c575cbea1f8b097a37c2e7773b9d26bec16 +ciphertext: 74d7ba54010958c5f139208fda77d92a10a10365a526d621af3b613a3f9a7328eccb9207cb28a0f2801a3e4f4d1f9d0c1b8ce5ff82e7e29079e8d93f93bd58b31cb13ca0d24875ed2b5b56b3fefeb15bf7a951e53d1804ddf3f8ff4af57dda862abf03e2757438eb8568b40b9e88360255455556a094c76afd1bf7d19b29b47def094b6bb5428e868cab19f011b4c518cabffa5893ababd9e9220a4d28cea0ddeed178c8154bc5473718d7fdfbedfe34c3ed0b37abc352bcdf9b44a94ea34e90fcd80fde842c386635ffe77bb054b23601e3777e31c0347f9d28711f0ff90d6fbbe365403c84a6b65303d5d2bd60911529967e06962d19fbf59478b87f4a85eb7725b938423ffcc068141e8b2e095bec6a4b2c2ccef2f239ba6e83c33c312d5dca7d18ef31395884fbd0f49f0ee7749c2a598deaa843004a346a9ac962545c6ad10f586d1eaadec6a77834428207fe4c799fd649789b9a724f8b5dd573371d25b44c93d53e003c87ab784d7d4abdcfba98b44b91aaf8e1f5b850b4a5f6074f7307764a20a80c58abb81131f19349e4c3bd0e5c098df2ab821b331fb4d6ab838adb64b6cb1ba9f37b4cf06bfdf633e03a1fc8e11a6ca919eddd08069ffc943e92de8edc85e6f0829a2777575e968c6ecebf6fc3c072d5dfe9b3651c9bbb6570dccedf971cc4d4b9767abd343eb5374bd147544e00f65f711725d1f9afd45d9e45421dd70095a3240b3ff480319b31ec78731ca0a31b81ac3df8c72e48b2b53a2e73c5acc2d8447883e2db2ec164784c2c74ca4fa32d941b588caa600cfc766fa3326f865830dac01b74e924aa32ec98851856603b308474a5b172b9eef6cee08fdc43ae1f64747bd90de6457c61b8c31a7a231d50f5cf5ba2602063b93f8e03650ecd61ceddd37d7276cd74a1d84f2e8039320c4e934a71ceb077349ddccd46bade299dc48b9113b21f4e0df32548e04282ff8254772a23de5aeeba33fdb4b31422dcb669b537ab9c3fc8dc43ead07b21c8bae771045491a6df36b0ab7b7279561bebfbc19c11b5ad80ab9511547251323e8519f22c54706f3f0aeae2294da6c56d4c3029c108bd2cd991834e08c0a5ed3036a0b26c9d61bc7ee012f34c2ab79d83a6dbb8b532af48efd0176f10309acbbf011522f6470123e1b2591b99d91f37a3fefa926a401ac47243a9662541bd1218766a56335a1b3a5da2ca18ab33ee26d09679ec4426746ec3209fb25e38844434910683d28ccd7a4bb2c99bcbe3aced00888e0fc3738c2209e2bc7a7b2df8870ddc8ff6343875b7523f9013f7bf77be6f12ffdd858710cc1a91b1bc845bc27664da5e7c8440feb4aa3f7a370c18c1eb183404b153c3446d2524b952b5f31327be8f23e17bb056e7affe24e1e5983d43d9a9985e0a190f8df316a691b4ed5a17a784ca56f425a8cff0e5244310c235734814dc4b47e5e0587cffc97baae270890d26c3053bf70eaf4470baf69542544d56c82a3760487be24b745847540e38f68b09c43a565b6dd64e5df83c8e490cd15cb533f7169afd07e690f2 +result: fail +shared_secret: + +# Ciphertext too long +private_key: 111a083fd56e95f7322d7c69aa3cc6cc93ca870ca875736e0eeaa0b18ab24a842d94974164d9960c89291600917844901951bb31b41195070979931eecf823a2ac29d86653da3301c7913d43464a20b034426807d7d49f0dab403e544d33a570c18354c7b4333ac7154e9135a0e05de9d51e2c113e3edc6fb72158cda1b87268a7bf4087ddfbbd2951aa46c276746cbaef600235999b958c7436625724e7a606d6712bb196cf2a73a59c781980ca97f23a51c9af0a783ee0c47ac013c9cba7370ab82da1182df50380e9060b3c5877641304e23907d020103eb2604fd042723889f83b356ba29a6e133065fa4c95bc73831267444759d5aa400becb91cc191effcca22d315f7a8452ac47049904ff5923a93428cdba17b2a443e60658da675c71a48cd178719d2fbad5373953291a86a7963a5573f27b38f787b7950eb149d7a028aa2bec0a6588a45bbf9b8351f10cdd3c51b911b9b28411f00a47b02531ae6dc55db71b09f63275d48ca9647937d116cd65b2fa4b8684889b434258f468a810421323a3c7878508373502d64174d0d3c6f986a1f89d51cdc551d48644c65e36898813a6eec0a1a77585412699c1506f2e40233450143224d017aa031f891e2805972d82ec7c1025f1aaa57862180b166462525b3887fd5253b261c6314f867f15b363cb3a01fab8a707a7227927e317baee1824db946c66d3855fb324989591e3329b76e1a67ad046780297cec629545914819f527e4d431c5033dc1c5731bdb7e585a31e14b90604565a785cf62a675b98b5972eb641f2c169e4519b55371e7b43ea0279f1a6407e0b127f2090febf36aacec9821619c50b54bdc8b42a0d61bd12a5e8494abdc5a066e8863f3e126a829329de1912455055da7a18195b229d171d2db7ad940cc226c9f91533bf8b65f65d88065e9beea841635f85b2fb51c6b351aced841093773e115b8c927a0a05682d5f76aed041df83cb577e1229dc7bc1bc5aea0d97518d02ff4d4375e486edd6576f318c3760306d37a6568d340471524c6bcaf6a4a9050d312768132b2a7549558282ad0132f399d80c2153b6cbcf074393b999aa4a0c48ed7b4bbfbac391b120921b8baf65ace8130a730a6cd6c7613e99ad8b60de947acfc2a43d8140f492b3af248b9a1344c9762b44a133947c4b60f8037fab099dcc0c519d90fdd589040ba183ce937ec6a117f44a35cf275714a05b8990bd203ad54936ecb544db301b90fdaba1b60021d821dbc9a9081c788683b4ed9b1c49076ccff78385216ba64ab3eb6852a3020b7d3b9160dc44ca42b7eee7ba23698ab2aa259cbfba9ca04c39a2131dffb7999d61edff1c00cfa623f57cc718b7c7ec43539ec4c438b0dd750c9d3238e03442391a51d6c600cb97526a6106f11473981c1264642394fabc46850cc64568523a176e951314e94968323c2d0e7963b833bfaf492f65053df87952cb3033fb6989bfa904caa028db171336ac4439ca48af08743d1625aa2cbe4dc84d67b35238213d9c7131823b9e0a9922df9921d140a28f48028856086dc9e48e15095381b36518412335d5435674302a8e1516a89fabb957895b4d42aa9884f9b99bd2c769166e65188727e063007ea944a9cd7c38009120e364fb93004c4ca99b004c5f4885c0c130c9a346273da014ab149229604ecf521a4b5bddc49cddcea0b98db45f722287644a6ba335812bac01dfa8c06164d97e1185c9a14c51a1ed4122135037a93f7390945596612913583a4ede39d6603b53e120b4eb2c5ffe10fb1906d7464cb0f472165186887c98588613d18e44b07c2cc4f1100b0888554c4aa757c9bde6c4c02e40ed384cdae5c242608361b95ac52724f8ff68a0e0c4e49ecac4f60b4182510a4884982181ddcc5842b585d3db16e253c42f9d0ab39d97fde5a2fffa5054ce68e139b0fed995336b1a7e2e897df36079781735dbb286965b642b6791dc6905d973e6760c07acb541c9bbf2507085c25c6d88779cbb521edc06c5e8403c0b00067fca5a0785577667a2a65b5c5349531d794bcaab294f987f257b92a33979800079ab979774b350420a10ca77226b3cd54bb193dd649628721f46a449dcb029c6a1ec319538517798ff318e6a6cbf416a08fe3af4ab1c3fda65c19222dc24179a471c42a892cfe4879a98cae30fca9da86b6de39486c81c2fbb043aa516be714a6edc0cc2ddc79ba5c3f05c2b5e62607be6253e8f45aec8376844775cb778aafc672a43928450a26de71b8a26cb2e0f8cd83649641421f90bc34f162327714c3f93a8c871b6574b51c42d84b8d877e475459769b679be41ef21ba60c006c7a078296278cf1256b3a119e7f951acd27581e8141344655b21c06baba1e5d057692a4ccd6e7228f60c8ad5ba86ce90a3af7c493072ddf3871ea12cf1523477d0acfefbb3eee2440199792c86b79e05aceb9a9aae841ad9be76deb4251efe4691575542b5b52757b1c8e38bc28da68c3e447f70111ade8a4c5fc7a02c1a4e41732b2a5cb81640f3bd81ebaa19e7277102eb5354c3abdd7037077e2137fc716287445d7d94f6dc58c0c214b69f3c658680e957606cd131a11e448e5a99a3e297e6a662f974b7b283518bce80046f596ad3b462dc37e128a192e653e119199d4e41783a0555c7774d5528a899a2e4d425407961c619c8509f86fa250062ada7215c13a36f24487109716e09b0f942b980aa35848320ed72415a23e0e4bcf3b7a3cc8060bbb10b8a20baf764a420e691b8ef332953238de42c345cacb903c0140bb67d5b03d2e806647658f5cd73af886bf261470cfe7cbc5e346874a0bbb645b54a3c4db41520c2a5a970b4800165001d0562f984154c4647e9a3f98d07589c366297ac6bf979112a58f1ca92bdc8b857c6bbbb3e4697b9ac2c2a97ea2e536fb802a4daac9efca179f88b70ab6962a0b009eb24ffb0a2d551c8cdb9b1117927fcd2b3f4af1448e4383c28c7274b23aec38296b979b40091495d924ac09b83ee141e5e93951a8c64e2000c34b84077c6d545a2c52195fe463c5463710ed159170e5101f850fa3d6b71986b049eccb0e05222f3bac17e28fa7b6a9dff6ccf8e4c4a7c86f283b1bb82136be077bc2835a738b2a254a71b7a43daeec3199a2b3eda10282fb90b4510c3adb84459537ee32528744b62c916815365a84aa167381be97a3442e422c3411b46bd46caa418249f97862ea48cf11579edaa322a71ebcb09a7a8842776a1025033367c9a38e921f25a9b0fa9b0f5e43bc2d32c9053ba61af4a0a36b8c6508ef32ffaaf24dfd1a521fb2f6321d4e8c9cbf9dcb415d9191d6c9dea9cf17d78725a3b729b2dbbefc68c462c4184e3096ed25774d236960ca5796f62e5e59599b972dbf +ciphertext: f7f1f6edf4d6138eba6c6eaac7ebde910268c2c96f0f8a6e1c681fa07ccc9a05ff1fdc748297345b311bbf708882bcaea47a8ce5a5fba70b97f1fd7af2d7ee9d4533a3cab9055386638cc6cca30cd47475cf9a64eff7d2d690d9096580b9942dfd9b2492a8b0b5bf93d330a99e99b286a386bbbf62a9fa4ce5fb08e3ddd082988e85fa4b047c45777f0d238219e99059da2744a9531d036505181e4cdf406449e7d77bb6dcb50ab7decee2c750300169c6fba49b9aa15f1ef2d78d6fadb9ffc6e5558b10521ee856a8f6445959b4a480a3e511e270801c782e4839fb152198c4e45223b7b1ecbe9447e15bd1d8f3ae6ce641f106f3d95ddc11b90846b88e4c241b0527374c0c541ff0a01b017e5437f8fe60fea2a8a5ab15c79a00b7371af198ea888cea09b28c01418f1b663ba5e362734c3b65ac351d608a5f962f0b019e437dcb0d3998f99ffecc2380021196f6be129d49cfdd25d39729c0eadeb3e56a5640957213b7a8cfacb357faabee5ee2b8fce36b55277a75b8e99a0a788ba3a2e638e172c98672e8d74a8aa455bf9082cb6d35b0bab96a611359e5d7b101a88b8a8a78a35f3d8c14571e1b6eee0643af315db2465d674045b033dccb0d7829237f7a7e89418c05309492ef6dda317c538e465854241674b375c6f409760914dba95510cd17453e534b43f46ee2f0c0cdeb0b2aa3ce0b39139f2ac761a841941aad9e50118d06c9d7ba42c7240c49933f841a999610edc3393503cf2a3f726161d750aabf52cc3578df52f7d04de9f36f4bdd03e07b00add772b1f04a6f2b753d0d9a5835f2da2fc25a1f0f8ae8b0e682827a48ed3b1bdab99e2e1a93a653cf3a7335c33ef0edc7b0f360905fe659019022eb1ca0666a5de9e1eb077fea62dea90c6f0000279ce015667e5167cb9571909cb86262fdb3fad9af07832a005de0e22fcd1c27cebc54884246a6f64196e9bca6bd768d987989b9820f4b4ceb79fc96946bd2706f6a84badf99c49db4521d97955da754b25c596047ec5284dc5b958e162bd19a2c0dffd2759e5d29e439e88d3f79cba1b110c64a1bf300678b84f67406fa09e3e8aedaca768a549c8a271093e84b855f0bb60bea30ace88ed2d8038efdfa1391a914bddaf312289a4b57e88a2191ccdda38e213cf20f7197c68877f1ff215569f6e934587e4349a7593b54f04dfcebb45c5af5f342daeb2bdc47c8eecbfbd502d86b5dd104cad111a735a650c6bb9256dd87f7df7ab26d2e37582f0991ad7b1739a8add536175941c4219daa546b3f2841f71ce36d7484613b197f4178943b6e8aa6e79a567396a3e506fd0de0ac70aa191219e9706550daf242477d3d5b9c9f96b5ee2629b5f8f4e0a73348d9fe65f152e35fab0efa8b00391655464390dc3fc7cfa66a2eb665fc80f6fca2781e9026feb29cde1f0d0c5f14669cdb1c5b4f7b9012a8d31eedc2a9c450340d6d5f9cdc2664e608ca340529b11cbf2e87a9ea10421bfd471e40d7ed939a7513826c04d97badb00a10f76aa080eff4f5feac9b6ae1c177c1e39ee963d8f2d76963e9cce1 +result: fail +shared_secret: + +# Ciphertext too long +private_key: f8083c12979e6a796e2d678f7c091bff420e4df505147570488cc8fff874d9c970c2ea07eac444a874a813637d4e264826342ebb282e76689195db522a238b4d8a102d0750a191a2abb1141922aba3ab82ae57c03714a36df4b7a42401daa7059edc38572aa1ffd8835805b68653bf27554aecca3700689e34066dfc4923279947e1156d95c73e2a84b1a094218c08c2d77249e5c98f8e5129f2c5abbaf74767c9b3d7393757d668ae2c4d61cb4811c4a743ec83178a58b2558f0afb9fc2a784b0a01b9863249568a25e21a7cd08cea1dac821e815e3eb7f145548ab718e22156278402afa631d7e5b7f79910cd5a13c9549ce1901b047f14c47f55487784abd5c08fd10979d06cacb8a87df165fe4527f6cd5ccfd389838db322db858fcb9a5728b28163b76bb19c1317c20f952b9cdccca27c56b5d62b799b0a484152f8d2b73795ab81efb6f276c5a8b0cb8611652ecd91259083189216bf905446ab40538790aca7048941c671f1b509c2737a2a204d4e0399082bde379c03babbd8a602648d9844737c2308904fffa229820197e1a3db050414c1b760b4a4c0c4c198db078dfac5e2a5205b88c4e02d4a280537e09501c6f3a4e9f884bec9420e5b6a59f4b9bad694cd9501a4fd7b4b1e87f929ac90480a41250c377f207602bbcbe613784178adb87ad5d4138908351fc20375a990c20bb840f00ab0d421580332ee0b41544909a3f8c34d09c5a583c97c7064a15a240f9554f0e0c88997aab06a0952c2b5c44b68922f624fd568d1b904af862ce02cc7e22d80004e07602f9cec96922e1baa700339ae122a7834559e79220002b6d21092daed3a72477bac4881a91055d16245dffca053696c441c9025060266cf974d77243eb458e0085ac32b347583613f0d361d7400f0ef2af97b62433623ec536856358bd6ca97bf8c60aebc83ffa5c1a2094c7111039b6c35a9c8a1982f9bfd3a076fb81b7ae15a4e789c3c7c2cbe7213a4e954007b2974419c9942bcd14d27b4a0b2c7fe587b18703f8db995820c34deb64c632bb694758ee4128745c281871bb45e0b6a6080d0477a81e6698d8201f62cabfa3c947eafc0a73ca522f88cb4904726ce2c7a8c31dcb68373c5b5158829b4b53a5ff2a30c7ba0bbe3301a1e3b8d49c8d68115b5e274c08f46d648a480a3a55f49ca565953bb091622f05627db7c71c402f68a29c00b234ea76941c178adf08829216379fe8842bc24701c9209a135f9c556f714690b87073a9347b3056c219836a27047bb50b6eaa840563b098d55967a87a65d16a4fb9fb3a7ea69e8275b624f61ee1a398b78712a1fc98167280d09a9f06e416dc586bda7343cb3a5713d69d63803d204779e1e23673f57f681c1e49b6700b705466ec65f0e102b72784bf15a396492cae8b0e94ea50dfd5908ff1c756437e52c8aa300c2265a9cb9e629cd577975ba9492cd8577dc57a29a20e379b8639a718b60a7edc71b546cb2893ba92cbda2e9030ab937b8b405643d38abeb96150f7d22789c7a370892b05947a0723bf2d284352699201712f68872d4cd962dfa4cc69a91943f23f8db990b8772b8f99450508567b5783f0f37878435f5e119e0e437947928642bc81b0a262bf04ae9518039b27cde2110f363705e0802b02194cdc85a5c94497f4024cc82cafa3998ed82523a0469fb38bb27a9bae4619b6cd7029a5283dd6f611f48255b155cd5fb7907ca9559303b14fe52bf4f2171cec5ad683387da0c63e41b9e0869d62961e3387a12c7378ee9107ecd3a91b35836329614eea4554272c9f24021cab36db015bfc7735aa75c3d255cdff6a648a977acf91bbdf10a400244e63db51bf5bbda9552ab562859e72449214c278e96f41ec121f20ab81b19323006111a07f7c6066a4f65ae7a4c4e067405b5051a21a07dc7a7257e47e2a87c4d5796b4da779e3185c6d4ba882a90134bca09eca90b8c57cc33548a490b1c83a6f87506f3a969d184072d5295e0eeb74c5704465c660d21451bd34919261b327b234a5d44772c319ba32650a571880aab94d04c757b5b0be6882acf71c313a9234e35aff6b9992cc82de4232888764ae1ca828da71eb6b4f18387dbe423a000684b01aa4214098b0ab9455845b1e18ca4739b802c49c698b9a0b360c9b4a96b6c80abc678912e9c523863f7a2686a9b29e64e9b3b9d9a5441cb5da223efdac2e264c111d0824855a3a67775734b0a0292521e2726ac706a19bc40fa485714ada047c561ed1f61dc05c7efadb894d5a79b1bb01e7f9699610638dd76e70b972cc728807984faf7a6e13676cf5c37d2dca9933695ac76b732009cdc5b29dd5022f9dc6bf8af1818f962e93a6be9f812ad135a6530010e1c8bc6fe8443a1b07d3ca6f97d9a3fb78187f972ac5073def8b54f3680d4b2c96e1dc860cb0054a5047090b41113b66003365a44a2eebe8a0d6f280ef30141a77c22dbab48d932d3d7a5f0b9bb4d35601ef43318bb82529b84bec326fcbd5736fba66221c9d3643199e7ca9d214510d999cd908c06d4b8359213af8588c41224f005b5d9ca4b16653afe17b640ee0337d9aabb6748785115d9837979658beae2399a9707f0a3b202c190a7b592156e7427a4ac4d4ec00d0b35ebad1b8d4c5c6775917be5273446786d26c0831c6ad1ca8456a7891e087316b7c575293bcc9284c9d93b48a4ca6c135625df10e8da31f2507561d090d09e51211492d150336e232330d4120f5b255d8a4509c338cd114baac84a7ba360ec7c133815366ea46709b5945d5ec5df5e3abeb92bd52f759ecc5671b1483c42a9c712b5b22b11748083433fb601d92152a399f0bc2077014bb7438b3355abc3690146e120915820a4f1a3578b26aeed9c71c7c069484496faac5812379785c2ba1107e8fcc502c9c99605199416278bdb594e9fb731d853ab370b260d9566be76f26413da3d483e8b6bf11f04e89db16a73241f66c29e96a2f1d971f312296977a6779912a0a89b12bc85ace095d3a567a6086ab27534f3ff46e5de68eacbc19c2a533bbc508959a291a36979a57bd1df69eeb748b0bea0db074016dd1acc2284fe24a8293a00bf02487b3749ebca202c5cb9863d962687b6752ea620a5a5d3f6717a46a2286b12885067c8e5481982c0266b762a301772869a6f0819a6567a90234509c7b4051208597f96830ab45e2367b749ca16afca03b74c691095516f4cde22091495a07ac8677b856cf93088cd3007d6aeb7b613523b747f03d08be1373162095f599b7dcded91b19768f9e7f1ef02834036d0d0c9abe8c675468f0831be365e3e0887ff70005910f59e9e087ade9d6e07efd557a90c5e4c8f652a9ecc2cd5993781fdb5f8439018af1b5424f910093cd2144 +ciphertext: 53ea8ce61c0ef1ba35a45e4b61e9e8e18ba97bdf0868e5d65d9d81cd5ab33104b6b2e53dd83bc1e3d02b12f5a8aac5b134cb5829a876651882b7e0ced516754062c79b7ff1cc57cd221b97c90ab0f75f1db4b5e1173e93c12b2ec1bb9f44c0b1a7bac6e308dfa978da22bd5f4c05eca050dcdc35b1489cfd1652028cc50adf77624d824952b9831e2a2e821b9539039b3d1b093c2909258c9a79ca68132b2a8b5b27f4fa0a76e629771fc31e4ee0b6246421ddd742c69dee53029d121ca0268df013c0f0cee458fa506bc34c28e5d8c0f91004bc7bc6745db4a8c2678c27e3b83c95bf7c9cb76400dc26c18639e5ef68056283d30d669d29bb2752f531ab246792d9b94585eb1e723e960bc25ef974337913d5b61bb2f11ee56695ec8671bbb34fe3187b7001f4c435ba009f36400ecd97924fbdc3bc2e9d804787a25cefdff85aa59d527541d9fb0f48536187a8fe6a511b841f46b291c34e0df5d64213d83c66b0ba1816980f986fbb561197551a552288d8f5521d566505e1b862a7c2a7ee46eb53a6d5de7340322635eab34ed031151c855d38363246021fdf2817dbbc8c9d4d28b2872166c83c5f9ff5c588b1749f93c1e55f13a810beef232c472b6fac674610087d87e5365bdb5ec2b3a9cf2f1bb7ec5d2358845bb915c6df43dcd863427ea0034d6852a9c49f22b723bd2fb085830af8737c3f30385015ff41724c979ca28fc7f869175f486fe04b231b443bb61d8199d2cf745d0c2df89eb6f09db5a8b1c977da9f9b14a7f1a2824a02e9b31cc3b9fb3e57db25364c04ad10cbab72bdcef82ddc9f723c8413b4ff422c32dcb62b7f7dcd61807803b1c732f16b1669aee5651dc83af90f05e465332361400b7e768fe5c237b7d884a887a83a9a1fedeceff2733c59ad6f871325af5a97a2a8b586961f31cc187cb003285e72d579bd2ea9facdce8f4d574f94b2419ae3598bc97c7006a1686cfa18280c40883f3662a031b81cfe5b937b8a56292bae4d9b44dc7857f88cfd3f94a8add5a25aba829fe66708807d40fc4639850d0f8c047cadaf620302d3f2d8d1b57bf28edd729b92ed3b721a6ecea4ea653e1650ad692431a68ce1f8f5fbc165530668ade2499d19d4c64c0aa62dc17d9a07d1bad14c5a05e7aa5ba679aff8f4c244ab9da738221120f6d054045061643b8a6b57af705b08423fe81447de3e85a02c255f0fbc289d0096e7e3e1fdf96ce38c83f851af23e6b321dd0b7a69b92f93fc637d82a9782708a19f004f27d3d11dcc5147cbadbf1eed5bd1d6bcbcb02d8286530af0758722bc795a055c3f9b7eb7f0d81059d079baa5a996e567e976cf3d6a1a3ccb2118cc1969c5473744109b5d87abcb30f244675d467a14c3d47bc5b6b8a35003d81e92221745ce393519014aec65010656a96fd78f102af2c05d87fb391bab02ce49cbfaa421c00f011c7be6ab0e8796a93620ac00d00ef3daf075ed176e794251b6be1f2c9083dcf34b8922e43fbaa4a30e7801a22a6a5f97093ef5089e8882021ffc8ec10a914a45d06fa3c1eb +result: fail +shared_secret: + +# Ciphertext too long +private_key: f4a3c341d760c15caca9b376dfd3525623141425b63bf4415e285ce5b09547579e27348143e9b0c7da8aadc0882b8332054004ae5019d0123464b06b4157be8b2847cfe91afe24c6c067b7ad102b486c295ba92936b473dce33e92b772adeca3b09b95773012b1b5189c7c6b7e397e04359d78571b5244cb8a2b78b74ba1916187912655f458877e22a5cd8672875c888710523c5b575a673d963649bb5b30f0b5209e3ab572965b30140f6ff76eafac9309a579f2e0b6b51089610c6bb4486e59080f0c074e79a32252fa06c2005e218160b03642eea12a76f6ac7a3b64fec384da8507a558315dc4ac98e8364098a7693a270159345e200d45e6597c31623c4c3436b03f9190c3c2ea2c49c81a07123daac1b4bd40a60a849baad9aeaa7928bf6c39d5f61c11d81034c39d87f7cc10513d00a50d4cc548ec316023f902f18aab28f95b116760caf8b5d1cc3dd73a8b9a5521de348f5821790c3924241924a64449c7ea01a5d0c3a3104508b356af411c87cb0eece4992de083cb282f498b23eadb5cfa08b6066a122a9abb15a47d9d213fd8808e85003268d687d0675e60447f10d11368823401f18b3c27a6cf595de744c4144b9005ac4bbf72c79786240f4680acc3c55e52b73347beb614cb8eb8485aa75d459a8e616c72377140fc3c35cb5448308240b72045b0188ebb86a6b8f25b745620aa50725860989a211a29c87d4ab3435763b4e4a40c5ea774ee024598605c051c177d73058d371d6717b880197ad060b1fd925e3b69aaff326045f608f2c50f08e5a33496bf1f147680e652cbe5564471396e871ebe495865334158a9742042937d091358f59de4660357c2033445cef1da40b500542faaa02fe495dba5bc49f77808036dca962cab5883552cac6a8465b3f04ddc7743e1558186e8c71b5b246b095536474f5e753a5f979d8fb17054c6a8ab6668960514ec464df4b8608623c50e53b6879aab644041ba0010f4e586cbc24de1b11fc45366373a6114555aa56518e98b5faa05222ce5045072cb9a1cc255e9706d5950013984e882b86e603e1002ab6d6436804995dcd2cf9c1360f7223c803a5d6bf68cff3b8c21aab8996a5ab67015bcc18fa05511da4c25a6720664660bdf494b320638b96b20b5e0c876e86bc3767aefa2b1adb15faad19fcff16ebebc04b764c0e18c06ce682dc51a41422278e604632f68730e8c51ce961ce8336e5eba489fd696d33b505845c5651b284655bbda454c4da337e4c3a36734191d098439d0716a751fc41ba93c155f5c9720b5c9417a669a147ca2a0ca8027529045071581e6c75b7b987d1b596197c1843ac545955dccf38cc610bf7869c2cd8516d541ceefe4aebd7005267ac902647a0f95856847b727f19de139095449153c83667ff674bdb81a18456da24986af17b92761a168411a6177060e01656a2b127ee84f391c91fb4647e27533431277cb69221a9b65d8d4aefaa50a7f2acbadb5782f485a3aa013066639dda561d4a02145e21d982b0a12db74fcb28d4d187bead6cdfca92d39e02abbc95348666fe9203e20e66d9b841371488d11bbb356142df77654e5a0ad44053f7e6cad9f5209c025516678c821c153bf967b0ccccffc9b08e9204391688551890a3117989dd02ee0a61de04292cc933957ac885c932244c47345e43f21299e61955b13501d581617c178b16f298e1d59386c37a7cec64d214b33d37aaf4160af23db14309c22abb08d4b6b1d66173c10061482808d9b781e9903949951658a6c42ab13554ae533f8e65cfb5978c0510e65ca88c4039782d67d640a319b76929e677862591cca367cfa047259c98272e3205647c93cd94d6d063fc19c4f85f56d1129a35c9977dd286988a92f26b6731ba8a55f038900082681332f5701b26b853069610000a892e9917a0c124eb9a6cf73b005ee54adca19579751754763b8a29abfae796673cabb128acd834259d9da9bd20aa11b3b6bae1941017a66b3073e88f81c2188358a5a6a29949a7e334a2b9a843c213586381d36db8922a39793533a43b0471b1474de30715ccac408787519b01ad2e7bef127082315951ed68e2a349a79b64b12ea00db4344e4a3bd66f44fa51347a4809395246a135b38db42bdeef6b87d084ad307cc56e4757af854a7147f278a2143650ef17063ec1b7e174a61bf9652e05492c4e67538576167855ff2069c7c551422025ddb790b222893d2cbabd22c2689d43fb714278b7aa7b730688ff18122338b108729151850e506ab646c2b460045f83331450578974075e55259e7910e2cf8259dbb3520e51ebf0807add9b3c8b1ccce976e73e08caa95474e742982168abcf1148a13518df40664e97c54703d3d9c2ffaf06a3b3ac6b4c58ac206c04d727834a89a2d79017465c432f614af72abc10330e0da4ecde3a1aba43ee415830d984f0e99c39eb77dad642b0bb852b038b43ebc8997498cab009836891d83c32cbe41bfa42b018e265db8d75869c08a16664714c43cbd9b2dd3a5af9a7cbead98c9af0575c726910494c882c7acee77c01459233772526f82082b9035f90b6f49db1a5ca8c60a938cde57b4bf23c3a179208af691d31133713c8ba0bc16dcc6c6f012125b253a22d554855985c1b15639c78241a3617853b077a1a842761efe0bcb1bdaaae7794f91ec05c4e94a44544b07d300dfbb9ff61730f68ba94f34a952e5b37c3a0824523ef76c07ff5c907bfb147f20440e85240af73a5638a2db9898fb855777b20429473f0ee2ca886c4e35e72be3c34ead78a895711bd9e26177a50e5306b8ca2a775fe1b8cdb7387ed14200235ea9e7587625296e911a50f08a8b8703cbf12b72737161caaccab8885ffb4324d6ca69284fb28a82855220c34339420114892629f6e23afb653242691188cc3ef96a7fb8cc7accc37e0acc4b2923a9e5991cef3a74efd416976203ec6a2e1af12962d00483b895a4559bd1198330371972ab23c7221bfebc3ecb7902ff543415049c0444177f84543a717218049dc5178cd3ab0e21769e40c350e039a02ee616943cbbd5d396fe01ba63f834cd850968115c347ccc9f794869222248b016b0aa036de256f81a88e0bb97ff682071117acf5635348b0b4d34abd173c0c3ca940a5097a9aa1394b3b028870676593ce15283d5394a3bdc0888989383201e95438a323a7557887553304faa0c1f6441930443a023a7c5b7ec64a4f5aad1fc12b9e3bf14c7984fcc44eb1530729d73f702c4d9457503e3575b207b017f6029b29c57fce8166e457d0af15d769f91c1fa8f77529bff9ef1378bccbe595ce6c7b812415da33a27c1d0da86d151204bbfe19adcae426ccbc269bcb58c92acb6544c1fbf17ede65abd4716ac135c +ciphertext: 63974695e3472678998979e77accda3dd1d3c5667c47c090d7b51ec923fd5e22555d55f0a1f91be1cf635e54fb8d4dfad61d911e3bd34d33f6169be1fa13c28556b17a37c2871c7847a2a7796d422be9ab5ed8b9b4936878ca26491b733b27654a39e80280691717077323b6f9eeff713e49e1efe98fc65d865cdf24b5725ab6adcef6ba3e0a4803c3bef5ada99c411042dba7a679aeb9d22bb606568bcb73d42bf8c9e26efc7f0492186ddcaa76265caaa268acaf1c13c2c8f154f4478de17a7f7c689c791f99e077881293507a42ea37ccf006c89a4ef69879f5a0b75ba11ee4c42d49ac9cb5f414aaff9e2d0af12dae5f4c5525d3218e2c27d80028017c9322d2c619dbfc4d3dda9efbe1e18d132f3fea43be802ff41e110aee94a2b8b18614df42e6669fff13bfd6ccd38ae2a706e97e5c18aa9e69daca6279fea6ee3cce805ebff5bde2b2ad682383b6ac3b9cc491b73465f58126fc79c34127c5b7d9d187da0d5cd4ea84d6d7f02d752d9aa803079ce72387ec6de51a1ff031a01e6ccda083f46e93fc7e477505ab6315e5a94e0db8373bf5673ec39b82634c7517c819f5087b4ed7b1e8ff0bb25b22bf1dbf024b21bb7c868b0ab414521258b819df9123e8351239ea8e3c22e2bfb83901b47c563f66238b1cf5c07cd1e9464c82b08b783a72158fe1ee7045d0706f7d5558421d23717ebf9eb2a947814ce074796f7aaa237d37a01af0a6fd8d4ddfcfae4c9fd5cf5e0ce8808591b386579ebf9bbda378c4ebc0c83b653b2ba67e8c9a0026496e43bdf357cf3e7be4715b0a9eff6c89b69fe0b643adba1b65d516d281d91f83d13c77479a2413e1920e7083d7b4f71f50f8a49430f55bd1ad3f6d99a121f7245a556403e24101811dc201b67746ce9910064619195de1c36285bc5cef80b683de33a8e69c75c9b38597ac54fa99b5a6c5bfe48f2c558e19a537c01a4ff192e259bad9f26a7aafaeb6ab6c428bf944fb70804da2e2bd34f4c3e10e6051ad15fba46fe52c2f7c1d345e5506b4aceec4318c7887098d39a7ae1a12180c3e700a34e26a302dda1ee2ef04f3df0a78d5be7e18e5f109a619f9cf033d92b36bb3cb5cb2bfd866083ffec0b02eaadb12884367cdd7512722ac975318c325d5a034ca8b109c62324fbbc41140433ea119e59488166fa559a376d0a8afeeebbcb75b6e3a9a2f33a47e692e573d16b3f32270c66ca222b8e5238832362c84b4f501f9ee5c14051855eaba14f64b87b5d133d7c55b51cd7f2a5aefd3034aeea647db7e24b176f3f82d492966a4e5fad52cd424dcec15893a2cde2442dfb94bd6ecf9353cf1fdd80999fcba70fe35b7a5175ea6463a1229da63d406a47a46afcbe2ec698b35f64dd7270b398572c59fffa2cf249f5d9ace044e025dcc0ad8d61399435e89b6bb85046040a3930d1cd9233236555789546dac393815399a30c90f10a7e383890f9600db03124a3b1311783c2f4af993b0b0ed8bdb3d1b8db791cb01c5523f4ff1dc7ed46c37bc4e1e57cb14db628250498a +result: fail +shared_secret: + +# Ciphertext too long +private_key: 23c97ab4f30c9df7b37d090399a9b7a21c69c1169e012259332939f809c78160a4c2b31b91b5c9f2a610eea91f12281d0086734cb62a71372ad2eb04b83495432184d56b113457b3b592ba0a283e5cca5c8ec88c9504b69e9941fa015e40b44894874861820fc413bbd702014fb2915a915cc3b9b44bc2559900afaab68f06e6203bd46e2436a1cea509fd0944d3604e0e6a052645a5fd3118152024351a21893a500970a2edf07b00ec055ec9833f8c8ef6053cdcd483fa8acda6604c1fb4b562e5a2d4c8c4dbf50b3662b48716b4b5b19daef8bac3f1602e628f51c5b19f73cfd25a4471c157c88b0b7ff05f1b23aa067968feb9cc0e0b9860f8661017cfca9b74c9c13a50db99b6507ad3260654f49d5b59a8a7f55e29f9297d309ec615a645f1c29644c8784cc46c016cc0cba9c2d8a344a6ae964b7b5a0136bf83941b561ca26bbf84333fea5c90727417432a937519692e6755a4879b92dbac66e0b6ed0537d431bd353904d453a5588c7b6f62c58694ce7832ad7008a06d266edaa16bfdc080afb86f832c07d8937b29b57d08a462b9b889f009980c3aaa76c3178d6b375a396ca6a2b6140004f348496fb322d246b3a2e32df394294a7a2047f5b3a7f46636372b57c2caf76638b2880c526a8099312458617b40e38f3a8cb9e0bc9423b9a430327b4db91bbe16ab70e626749cbcfb6095962185037972e16221a0495e50182793f41152a63cebf301b59a27829aa1ac2c869da694876a74f829a8909931c2a5700f3522827bcfa59cc9e266c993d0a635b97fb0bc9afe49855361640a58c548034385599163d48027f81523229311857621132c508aceb161c81413257695837484cf3a33499ab702c7851867a387432b38c2d82390b90961c88b68c5c392bc4d226765a2807238e070c694687b685d10d18838c40da1f27851e52f1266b6b12193f093c9d6caa9c76b59c0d7209c812b94813943579d68b4086cf3b79510198be90e5677b55a3726b93b03b3e9c585271086f73550294148a28f3bb1b7623abc8b5b37bba49f207b6c0284910005c93ae234a3457dbde8c44cea1b76334a21a6b10c5793b67ca2d417b55a4a20b6630cb6ccb18272be4f8977614b87305249bba06072f02a28a02d638bb8a52765da941793a2937f89546de60f55d159ad72434e926554fa6692323d9db1a8e9f0ab35d493977a26a8796203fbba0f130b962bce76090def606df9533f1302ca8b234dec8c00cba793b20668cd571711413729722a3381cc60877139c42e8f072291412547d88c7af35919432a1d1a3b698745f3998e08b1770f666f344b11be62679cdb6722880eeec08d39db8da1794398e183f9ab1771f350b62a5e3ab88d1bb8369b693fb5271c0908b7ac0aa7481c94787287e70a57a4a819564bbcd8f81497c4215f1016ea4188e86485d5b7680961c6360985a14136f92892f5e27686191ac5f390dd70ad5e7c6b05ac759ad26c310288905469e22c27b0a08301d7808fc027f63588d59711e68955884380576175a2315db0c8cd09ac1dbacb3d82e4c66abaa51e486f2e6391c56bbae1574dc599b7ea087dc14ac3c77cb4085808f96cc77cd57fed160c0497587dc40c0bd5735e419ae347abd7cc542ad30ac3d34063c552bb5c5c6884c1427938253601974b6f0c0b3c46640a92d5c3ae858bad3441ffd34e5bfc3042d26eade194bc8a3f46dab79107cbf231c0841c32670a41c9d02b2be7790304cb1f37008c36878ea008ca07c7ac806e0c4c7cee8971e7a25c714c269247045c0841ea3b26487a55bd81167a9970c5095be2c3169e0828dd962c1694884f361912a936514599333b4298f8166a8bbb1eb579a63b0ad256ba12f562a1968fba500cdf5419b8a55bc8d189da288ecc253ee791ae73001dd16b1984513e0aab0d21e87f23f914367abff2951528383851033bf1701403e28da1c56ac9cca1b5a3c722444d4f23c393982a982c9d3bd916dd447f0eb7baa59b26671cc0b9dac3576a7ab72c2e1f157fcd0b1e6bb49a9f62ad09333cd8e32e9cdb91ea3a5d0b0a6da061391d1ab48e724f93284ddf06991c7c7c971a28218716fd82973e24a58f0103c6a87899d01f602258fbda5f5e296249640600264b9e04ab1266c716b83a46c280249b1a02ea8c4cc6aeb9c55d45eba1c400cd4fa0cc1a9046600372311b68a820c6349490d9c0271ba4b6e4dc3cd4945235889f33b2a594c18a6b25887816227a9b22d5b40c253a24cc54724e5809ba0500c36826e016320c6579261ac5190420a9b4ad7773cef02875b6f19f922c0f585c20ea4c6dd363c5dfe55c32a2ad7421005ef2a0a0466001d8398e41c8b3b5554f0732760b8578eb7e49fc8cf3a6ad52486cac370195705ca479b498116f367c16da099f48a182f4a7498d25477847c578db562a772e3006c02e7c1cf6c169fa495ff9066c8c1b6a0d790f2c8630f4b7352fc6bfd4f230403299f26c98b6f269e9f8b54878481aea78d14097881c9b58ca9ddc626c40d3939f3979e4a35de29447232cbdea0973c8f1c738402511727357185a9687b3153b09d563a3e737843cca2b95a9b82e7b23acfa3ebd47c7deba5a12b43a4468ae4f482884a85a592c2aa61a7bc9cc7e6cc539a5ab800f484b9ce1c03f3314ec1c7631d34edea5cc327b92c2675d3fd72196795d1ca461b9f77d5594bb4d380e9a669191112b6bbb8679593f33295f50094703c5c11dd883c3cc67594250199ab9010aafb9fc377c337b43a6b80ac9bb0e67c8e5b90b5317b07c602d54019c882bae6d04ca853c08a3118b71296c5f1c7e89055152870f24382d6c1a127f278189d6c9f5750cfc435903065cc6492255447092537aca35a7c7f59c1fa86952cb5580a23befd21e1483cf7cb9115ea3c844e8812e001d2618396c19a773c3bd43c5a743579674cace3d7885053868f22b6aee875412681a92c637fcc9b53836742d281026660f04aa35f3abba38412a6ee4355a362927574d64439b1439867ef02e4e2520f3a037e7221606787ca057136fc65277d30048dc02b5d696a7312cf4fc5237d7ab8a827ef0342f4531705343c9512bcbfcdaa010ea92eea39a78f3264f821cd09c5b3d80bd5a7ba05d86375b857faaa9832e115ec0a9021609ad901224e83061145a9333705d4c603e20aab10b0b44bb2b9fd4185f0c510fdf33856ed888fa87129debbb09d8406be63bbb9c8996238518356905a4020aa517a9d3522d5c18bfdf7fc6c86d129179ba82e41d31703e1306ca6a7aa3fc67600a51826fcf600b5d1f2318dfd8a1642c3b2793062afb8d9af1e127c9bccaff11577f3d69d50d8e05b66a0a51979553243a2a5f911385d3748f8628d1917d283eb0750829 +ciphertext: 598d2b2e7e3456bdc8bbb25e8cbd009bf6df7b5c466ae93f8839b12709c5847bacc127330bab0605057605f49a00b7ad9c6452a4666f4ac91eacf6f9f95700c519714ddad10a8401fd5b666b3ce8d3e7a26f45dec4f4909b2381f38eba4b4cf818cf462908468f185e723754b1e568593768a078364d09ca0435425dd733a7f42f627d57213f023c61fe65da374b066276a4377970dfc2521e182385715434d148f49d8930c894bed5f0e49f4ee08d4279ecfa4832f36857549a46d2cc1978fff3ad898c393b6e0656a0dc540cd2395f401a93511698c358b7ae80e7484d81baac1a576440fceea80e6e51d78f4274d81fed3962ea146cba4aceb886f07b868451b7ccdb1f25f42fc16f5739a103de0df6e5ae058ce99d8c4f9486385e08a27ded873c5a0e2de558983836c0176302c22516e425a681e6ebd59251f74b3ef5cf3b247d03162e8b9852b231985952a36c856c1815ea6d844903809ff971a797ec220935f3204914916ec6356e83a73e626e0385fa919031b91156149057b3fbb878a6e9ae4531079c675cfe09c173d66b0717b7f6f740d9071c9545da538b6f1225990a30b3645185cd8134ce8a2142c162fe5306e9582c2d86eb6dd3ce179a73a24fbf8a0de8eff9525d11f169bb433565afb31c27472f165f2ab81e7e2e09e41593f3b6e7914b4b0bd48e23e86824d226728985750af82496db4add86624716dfec149d8ae859520d6a27853b171db909bdc37e9c5d5d2212698d254074a1aaebc25114de210853ab76504d8269b78efb5a791b6a44b24fe7b1705836b23f9516054382dd830117fc06a12d457359283d1dc07bda95fb71a50acabbcdb50c501c6be745179106a101c6aa33182f435bc60f1f7a1b5249d35874527e4ede6f47405a16f36ca5e45e7dd9a6588f8aa9097f2b206fc37ddcd268cd0ab939647d791c65c4dab7b40c8946028c8b4400bcad935318be922f874c619970f3f5a7857e161bfb59bf41ad7ba5b939af0a7b888ac8c1b09390b646c89ce431793933df0897467b766c9cca33a42290a774a79f4a8e2e55f979358530e917739d7b48e99c4210f8b506451e5553138f8ad3d6528f2a6f04e450b6f41e240640550d198e3e54d7addc7f29ba110e8d244db555b5007ab82b09dd44d2a3adcf8e607eb13f8cda9578bb1b679eef313dd54a654c29d89be24f2b80721cc23eb14ad9e41eebde91e95f55f2c4d059723f4bdac35e7d599450309b8b16ef6da3028af31ae62a08c91b956ebcbb23d9f7b07e5929cb630d2eea5d5b724bce44843ec7585980a145ba7b58f51237362aa26364f6e31ddd964641b5dc0a31270317192db909fbc728465d0142ac0d267e2f23e472126b71aa12c5398318f1f1f671e76dd5dc17861fab0fa3222b2390bd469202ae1c8d1b69a6ec4b23d742d900fc48b0c301da43c2b8c9c890aa31c6cbb652db8d5d8dbb66c842f4df79071971e1a94adfd83e6f180b7fcc5b07f3ed4b8c03b4971bc6155ec4b249efd8de6811b81ef90a6ecdfc941e985d731ab93436fb2c13d9f46546fdb40b05 +result: fail +shared_secret: + +# Ciphertext too long +private_key: 32fa70ec626cf4bbc2f47c833015858dd154e29c6b3307a19752110860bcc2e6bb2067965862109b43907b0126adbcc02cb48a8e50b78cb6478b19520b446fcb8043ca66b70178416d6c62fc75c1942a530e815546975f180c58d9b90dd9937da8f686ebe85189cb4589fca0c7cc9c58dc98ea7019128bc9f9ea4c613a71b0799e39ec4d4091705bb97482731559224804208a8fa523c18668c7581abd9a8aa801abf3c7868fc232d5638e022bc87f4877ce11cdf1e74dafa0a235853f2cf444f9422f30d02a7ab36b873547840153693ab52209838c124f1943bff7a519cd822bfbea2eee400ae9b87dd9573ccb43366c09ccc3cb680cf49a70705b43479753811bf29b1dd7407a43ab8518b4132bd35f99b780c50b3f54a66e16015ef6c84f95564dd7fbc2b318bd2556a68b585feb32af1b00c536c3840f8678d7f3c8a0b5a410f7cbbbcc3148b7462035c1b9672bf55940d478596c3934bad014b210c95f5103b2a13c20ea54fee0bed9cc057d1c31d296448c4c58b9151e5d84c421766783db20d88a94c31b4d26b84b12c37343c34f46b4706209515ddb571c9927f7c8bd47703c388a5944842a53c65fb081075193a1801c45acc20378a764421712b9b0c4d12498d33c78035017e5fc69fbf795fdac471d549404bb8b4bc39bbbc9cfd4ab7226c495c7e262824193bc862d1a347075ab4a854289cff898ec1b68f45671fac064191ca675f836e65b736b681b12caa39e3b978e11cc98187d279754fdc638ed9a258b48cbb2bc5b5940551aacb6445a07cfaaa85f781860b5981117cec8573b978abc3263529b6cbd1318c5dec087edd667a0f00ec66ca4c91bc7caf3222bd79d2c9216d7ba6928a4ce3a852b6485409e243d096415e2859a826008f38a753b9372bd77ba14e1b6501ab731257291175b10895961b5bfdc56662077cf67591d7d1817c70b01a7c32954891ef6588da84b6c0258c27c6860120a91dd8b78ef6bbc683bada173526a7173ff9b0990f3bdb4e21e81019b276b4bca5290318494c7040072d2a03f6c949d396ef5aa93de29ac5aa2b1c5a204e3aba83daacddf1b3661f253d5da0dad14cb1bb7c62db9226942c5e578503d89b5c7a8b075932c93bb2867a25a77d5b203b019b0b8ba8e28a388f104bb5b3f2e71bff53c892a2a4092d3513ee250f4a242e17c640fc82d4df773b4fa671e45a755056ef5b1a6bb0cd0a8049e6f37a22ceb53b8c19b77d5ab39781fd70c7cb2a90588ab9fcdb520ad926a893ac30fd1088b892672033b06b14ccf65721eca99a1d32ea593b228cabee7265a84867cf1623edc2c9b7069b37ad53c16b68cf481132ec23ef0483eadab813265b625e7bfc6667205a112fdb87f54117c9bec9fb63bbd574ac0914cce1ba616007155d129959f877806faa4d02b322665b166b104110153229674243b30fd1c43ac7161c9b89b70454419c15074868fb4051572d14328b1436fa51a56c458ba9037f684a4c4193f43513b16a391ca97c7f02a23e083301f618c54d185ffa0bb398a954195878c423d9ba36291e55eaea2192495265ca21f9f0346fd61939508a509703d52886c4b613f4e49545ada4cd90026623073cdd7867c40bdcda66b7294c0f4995d3f788c517c8fd90b45baf43dafba51b02a8909cbcd3cd4ba9b1839edbb49905c0a17a24d06e6a3dd4b44c749c6261693dd69132266aafdc73c6c5c26b2b2206a957554c728d21b2e34b64a21539f85a550957928c022962643c1b92256f1147a9ddba955f8432b7aab18445e5a52c70b483167635dd702c628e661e632b080514bea115b0b98845c67aca882a038404d8685826460a57fb9bd0758458820a4ddb6071c502412205caf401c29a158e6a6099bd75259b97849f9cd3892399c8c1a47d382f50b31a17a98c8f96017b2a1588aaf4e03060ef48f88fb17b0d1a5f0fb3c80da5d40e108eb7ca178c7a53e34cefcc2326a74155c8b7715eb4e98f824c407afe7452c442792411b35e5921ba4051eba44935c762d12f202482734c9020e7855532642821fb5393551bde5c7cde7e393483b8906113ed1dc9051b66af89a8967f0177d8803f9f9011e1883ce439a60128fc3658516c1ce2f33a9a25c76b696a28c198d3ee2325394c3cc2a50b2123fc8ca484311685e22c7df9744ef8242789710c2bab8017c8204c4b17616abe41009e1a8a59c9ca376b1ab2f8b11a4897ba367036a63b826e3043c060d0a0337b4d613e9463295a3cf3b54c4cf5528a82899df6bbc67152d9f6b8be5c0b9d7502e6b2969acc2919fbbb67a2b667053c261b9a1f55945be4ca3e4a88d583c7435ccadb9880cb69b78d9c47091d2b7f6b94292845162199548ca898583ca12363187a6290a3a9934e98c2fe7c0adc4618b483db891506ec5ac10d05364f2b88fd36227b4c43b153364a54738a57be986c33dbb38dc996358314b4a5c7c5ec92103198302e658c3384171f55e56751f9294735a79c5add335b6cc08fc97466c0aacb4469a3b8aa34342a63c3361182044da264bf39580f02b1972f9657aa575dbd253f11331f8c50541eb2466e1c8e8078da7d7aa340b6e25d57922c07c6c082e04f3584213b24ae75c39d129dfe57f889a0a38ca36954cb551bc24f424ad1a6a704db903e57a52f1e380cbaa5287dc9a23026d227cb88f7c5a8609302605c79dabc956c741e0d966753465b406ba4ef3168b1202c376aaba8624c9300eeba104e8d837a379b995e7a37bca53e04549d5f168f57b4591354b8fc302781905054379a6721367154660e58e21e7335e67045532a5461c13aee3103111840e941594c808d2259817373ff7916f4d6c3533646504c03c6268c698f24c068301202103192422e5144ea12871eccc6850f87846ac87a3e5bc8ba040f769780f2794617648d5d91e1eba50b8d27e80519a6e78026468346ddb06add526d50170083510e9106109136386c324e9c1bc773731b8ab5204d65929c57901e9bbc6b03a7a4004ef1a8d52d08ba8737a113077dec93e4b9623b1284d77810723055bc9140c42e078affc01ccd0049193b155fc15b4d507ad80bf03a61f680017b10ca868508879e38de5524628220170574ea4fbbfc03c4012ac964062ac6cfbbba800811ac12d43d086920c6192b588c04953b272bd3fb0c0873267e4c4b6b8d47a82e45834923c2548b7b0ea9eaf9a6b269606a994c4e1011e91b45e82e17de844b3523ac497597514ebc3e646acaab96c0543575c702fb982ae63f0f8ea9a73530d03ea4232b84b65c88a7dccc4c6118c54514828774917bd0204a0847b52170dfe67cdf0329eea587c96203aba599f1691dcecd088a3c3a380d1627e179ce48a82dbf7b8caa767167fba3d4b08 +ciphertext: 9d5b14d4d5ef3ad5e2e45caafdba66db9e5edacfa7842a3c539d44912ba41d32ea5be2f43d88b4bb7981d3a92bde08898f03d81176fdfd2c64107fd22e8fde3a7563ab5d8c880665330cef8ddb740693b82ee00244d071122186bf80f057f16d6ad92bcf8f274b50dbb17f39c62c216c8758cd1a31981319f757840f758f345373a0bc49e89ab9f6ce166f0c8bd29f3c43cbf4a41c45774f025729fdd89e4b979ee709f41f6b1fad1e7b9e99affe91da14b44f324248205a9a6bda3adb68e2e881e13d54c0d8b473ef5e6e3ad8825aaba97bf98f34f49bb789da6ff5a7b0d46968b2e3cc177200874d62c6f213a8cee09c54e895e5f623f0ffc6ff040a985c8431a4c8492956ec2b9a5660792c319d6c20650a9bbfb8c3713d18b789949a1e66d7d98e74255ba34ebb2153a3174ea7a97c00bd1954d9fa04d830429bc369fa462f0a7f583326e7af69c30c1fc2732d9d408d6e114d722e1d5758add34737ae4e152485490d055a50167e8c86138530b34ee3f0af3cec3bfbe0d38251b77484262e95f83f4e64e1513e1dfef4de1b3f3953018ea3c18cfabf167f5f373548285c5d4ff0d5155be71c72c9742be65fd0a2b0dd5559070bfb41c122985d8261b345b93c881151aefe88d33c84169c02b8aab8385408f8aeaa54813609ee3b7ef1c648f86deee2677b66023a12d6750001635478c9bad930dcb25b71757bce47e0b1f47110cf5ef3e338dc778c593522d42cc594fd83e70d54706ab0f232739918a3de20c9ee63e2c1c3088b7d89db8202ff58789ce403e3f6883f321c8572c50b51cabb0aecdac7f4af3343d900acf7091c5812baebd4cc67663b0d467c3dac9c4b1cb888cb47af0afba0f9257629474128c0d836d03e95342da377f94e8d854a96617ed587448373ddc553a2c919b79e9a8ee676eb918e753da19f7f5fb416452feb6af253c81f5ef97ed29c64b1d2b535b2a006edb043ae0012f818ebfe47bca95d83bc653a3a974c9f0d9a0eed7588ec762c685658b83facbd62a057e13d3c3391e01bbfa1daaee71e17b39b9f301df918ccb0b17c6f41c8b459e870a03c8cc33f428574b5105d15fe57bab6201594462bf87dfd805960fc42955b1ac1b6aa542bcef8d2d53ec89b1ac55397d792b74535e1671a56a4ff5d0a093f09ca22045af7eb75044c94c890939783756f8905f9af8ecd1c793865bea82cf29d757e11b544424c311deb871ab7e75841a8e96ad5547b72357a89336eea474276e7beb11dd36cf9189d06b988fab2ac62f5a1d0fe05e20e8313039e34715077a00fe87876378967200511b2053018f1d3c157901afd0308ae861d1d78eea454814ab083ff0184189ed6c6b0bc2ead449be8b7c08005db1abe3d76ce18cbd87007c03ee4f3671cb5a35b2a441941c724705c80c8601c3491c5ef18bf575230a01480f6f15db394e663dc47e4d8dc956ad5fd76d7582192bd2f8ce26bcab75cd8909533448e0433d0b80f242aad4c25f68b918ca3cdc123f27af27ff9bb70d2abba68ee25d975bbcf051d5ab1da6cd341d8693119 +result: fail +shared_secret: + +# Ciphertext too long +private_key: 7795b8c3791bac51a990d4608d96689df7646708147fb5616b646b62b22dc17320c443a05101b167608fb499cc09603a2995cc57a591aea256d2493f9f2222b52a1fd73c5eed35c7ab766bc7474db5381bcbd74fd61a49591254f593cc0aa4a328127af6e94f9a99190c939e07a4524863932c907d54177846b28ffd9c57a0f71fe4e86a41a39033f89ff118203512159ca0b8b7a3b0ea5520d016b67de32f7e990afadbae2270b4367944bbd17f8b9101835a9e1d4186da6472e44b8ec4575027819b819bc29ec7c96d475ba988849a4c0a8768afc769b8fda3a48dc21463a63b458711bdcc8b014934cb2b980f794880859500b5ce0fc46458ba05141a6e9d6cb927007fa266549e78661c2a2296f38d698085e99254a2120c61a06d55b52bc9695f49f32b943394cf756e2adcb23c46a1d3a9b92874c61698119ff585c8978a71c4402c2a19ced92084c873645c865c60af737385320426bea892baf517d3a7817c7ac4cad176a2191606f2c7c6e1345854a8b1e08573f090c6d495b0262dc4c42c1a34829cf08c3c8433ca913017c6cc2865965b18c52d302f4f414440e59b9f51873a52179bd413040464092bcdd06939a15a7aa5dca6a62694cb93cba1b46672e137fc00b802251ac2d22f21d92bfbc28f930918092c0e6498ac51382f9ed45ea58641f1a8af863cbea3310da71b941575990334ac4aea23f1bba2cdb0b63c80aa5cf29802d0ba4f8798924229366aa9f472ca78a2c4c5f003dfe8cce5a09d3e8c7b01a9864a823a090bc135f37f4da1200766a02eb51b6ef9a79eea61cc8378bfc2225e520203f08a60a812f81a7484043aaac9ab134a360100068302436e172672004394124ba232537c7bbbb4321c2b0b32799c2a41229480643666552472416aafe319bae237253a86b401c26edba221fbb9811a183af713264c46ff555871085ff1f39da59b72e80bce30c020dfe833ce8b172e2b4a38580f5c76a18c4967ac8416a73a438980a8b75718f55506f3e13aff553057f0aed6708cb3d4c4cd74cb4f8b5ab19195aba572493b314b131b865ccbafc18057cb47358b134405bb2019a5ddf8c2880645bcb8a18c59631433b8962479d9e3c112e24ca6ea6ca80b44e75629ffcb17ec89677a316fa58515889aa8fbca92ceb97de2e0b5f5238179a08b7db49ccd1673aa200641b5a419d954e1737f1327b1c6f3a694fa0544e1363fca01f93a81aaaa18256532e2a45a938954df863075753a04d6cbb7dabd362164468324995969423cb3fac19abd0b24052125d996a5917374ff9a9a7afa46d422a64d1b2ae39a1cc34b014af45c60f36a3eca01f6994ba8010bae3ccb9d754af1e36dc6c5a7031345ea3966bd9c21ee144891292c11a31cdc7abb9f091120fb761ec518dc6b3568426651e12e5672a29f2705f5e2b20759a3668a06abdc66035b56b56a0bc15c84e3fbc400f380302282810862de636547d11448c7097c389600f107f007a5514c720112576134634a10ce3f614b267a38d7d6ce3491c0e32b015fd29832632b3075a0fc560c8d6261575156b538a78b7396bf72ca5eb492c7b504bcb63a1c07aae668892e51694f6a30ab3078bfb434c51a009cd9a7631776d44a5d766783e120acd4580eb869127d54be3495781df99e80477ec800396aea6de802add6c170504229761b94c8739ea7c74eb2b1a7e495a912d29de1e838518134023b03695b388e69ab26894ee403a6243638603917cf79499b34732d7ac8a146aba23023247a5842c46bc236a0fe466672395bbb397d58635b7b100200ea9e8d3cbd8b6a965ec63301858b17137c5af567ff63a59b011437d582a07b16726b6efa6c49be31324331bae6b98df0247607160fb14065c8e98234a46d96e84f5bcb76e4423769235cf7e978ffc81c0ef9a09c6377329c1777412da3e694590963dd4100b404c2f1624b13918f555047e5a19c493998838647947b6de106b4f4cc04a5d72602dbbc5a52a446e1adc77336e28b8f848329ee4a89b4926f52b83efe2123d38a6a48f25878a7a4f98c44de310a0b930a360602caa0413444cdad965a0d565337158488738adc9c459d976fe244760d58625b804c723b7d48f29062d39aa0274bf2318f4feb39e0fa7447d54ac6e1912f84099df0c3ac85cb312163b179a4e21962f5105205a29e43aa69182b16433755e1384c20c039be38ca91e901f9e1958f048935191b7cf6b04b090182b21c4e93b687627db628ba2f036d1745550c863a90f9bacf63bc97691e79e84908819fc436cc71568ec2a0b1e5db5aa97c99f4facbb94c7010d3a240346cd1d75985e5902447badef7bcbc2930410051e6277fb40907c965544a3abadebc09016248dcc3891ef82cec26001a9bb459da61c9aa6a27cc295ae464ae87386fe46fa0a069cc7b83d9bc834b487727a262e1a990d77b5c06b99112413b5ad955e8d82b2b0910d724ba57759eca068e96c8332359c29bf23161c1b1bcf54120a63136d54275f021bd22a5777235b451bca9963315730a429207d30bbe894486d8e2444c818e95e00f01ea077a94b06e506117a8bbc1425631f912a979c70d510129a44c7a01bad819bd286c3e7fd504268c86bcaa23ca3a1611062fa7338c506525956854b0d8c10e1bbe078923c3c5042f750225e88314f92d766805dbab5d6f907aa6c7aa6f0bcef4b38551228d5d196cf7e55717ab78fc4aa63d49a62b6a54f7b4b96a513fc7b22198d16090741f155aaca512a63e228535492ea0e77d3da59ec12a916cc09f32282946c199231160dbcb6d04806ff46745c6e8b88193a2fe817214f09a4fd5707b786f038327ed11b6cca79bb48c55785b645a8a4706d51c8267cd80a78dfbe81932d384cf29b420927fbafa2d3bfaaa8f049819a1896f3792237b92d74ba006d73f0376c671bccfb490703fc6b6aac060effb712c110aa1b759267c28d5a78eed47578b0262a11177fab908f7228dc0214e5813afb8765d67859145e38d75788aac096d20722cae5a157f074764aa06a3bc686de3086d613f85ab486850c192960bae975d20f51ebca65639655acf5761044884816b10f939bf7ab80beea6854bd854cb8593da802e8caa5d11459b0c935416266eb35096efdcb156f330774c626cf406374737403801d546474fa456e976923f5798a53aaca404271a80a9c55c209b830d7ac7ba1c341cac5544623573f8b9505d65330372182701ad0ae855c19c64d9091f286ca7aebc575c104d267b4f615167c06a282941b991ee518b60d12713a33830a15e323a01f3e584b677dd68e20e378da7e922e091c8ed59c9d83724fcf6cde0a9fd694370642121598dc9fe98734e034ab9baff8c41a46491d5397b70296d12 +ciphertext: 6d7841fd5f38c56eed4696017cfc6be2c33fdbc72f89da93e8698e034392cd90a893d594390354d2693192f06e8ac92005c84c88360ae345fcd4e10e4f7dcdfbaf5564c358534868214dd4fd211edc7c1889357e3d9d64d7edb6cefb54bdf680da259795b458f6b7b9fda36072377a7fddb5bc529cfc9e6eea1cf534ba644736b17c29325547e547e54f2cf9c8a09810519ff1e8e4d393ba6883fa48be76b207b5635d2792a08fc211572cca759430d8350ebbf85e4f8036781345fc136ef9fb3ea8066f35a3c37d0223bed1557d797c22db33725d9ce20bf81e8d30176125de299f8ee4f04044125219775793035bea0e1edce1c7267184735eac816f30402dbc4879a3545921f3a5ab779c30808d4a6d5f42d4e7acd123f3ce31187a70a2dda7cb5a3f1b22fdfa880dc26446bf9378bf996513c03daf821432268a6415a17656e78f775c1917ce358e6e72edade061ce2e1dfcd04ed8c0cc0eee8e97c7897160e33d13c48089b96ce751a36b416f8fead2faae53d707f5d8b82f64d18ce08411d285b2ecb90b4fb8b81351a0597703b6c6fe5bc130d26e7c67f205e5244ceb27c5dbd30ad454e4223483cb6fbf39d38e2cd181eea3df4b9d66156b59087d97a7f27a04c5cb1537810f793700bf43a1d14070737ad08138aa43a89cda1ce09ba02edce1bf61808d55ec3ab542a389266ba4f222d92841d670b7f83939065711b85b62d5fedd051304d2203471988c20d01f6a48e6eeddf11ea3d57556fa116311239769ba442b20dc1a9bb5a6c4a4c9e2023f38394cea27d960e10c643a30821ddf3ae8395805846ae8d6f7851bc29c3fba4a48f839861b4a2a2a64d5d539ce37150b728cf529203ec7844cea27cdb56fbfaefdf4c18186247e58c3ab4deab221bbbb9079f14f7581c26b86b808ef800a919c04b7c61d5c1c8974adbb1e7e331e6fa0f0221007a0d944eb78818f36ab1e57abc0d6921c9c91d5ea229ad03080771394fc94ff354a2a28bb7f0da656f4e0e2158d4f76db75db9990d8a3a4c7cc397deab160339810aa89270fe22e4656abba3b8ebd6024e80402bfafa7a83b6017ff09fd5f957732e57c70c6d182716d7bcbe848e6d50ce40a86eab4df217144131593c48511194a840bbeb19ed46d101596618bd9998feda45237662e78f021e81916d1375a90e17393f33a9051238a06290b3504832507e01012cfa842d22ff67073fd8be38e9e0c130b08953359c1c21d09c7275c510909b54eea597c5152f79d869e48d091bcac1d97978e7e65761f501559195830d4721407ad11d0d5f74ff25ee9ae2e24fc2e5cb5dc63e56a29d2f64ccffc1922c3949a0342d13cc54b0bd6230c4ccceb52bc362996e76571b4b2c3d582a2335588267a66b63af0d33f3ca3dac3a6e444d62b288d4464307bde5974f26170168a0d7ba4e38d4578830af9960de08a9962fa4716c835dc2a782facb3524f0e252f6265e5d7dc43598f46aca579b776b0068d0a186f0bd00b0e540c466b62b64b507cfd801433b615d6e9d8a0b391cd220714157b657f487e51e659ce62c40e426bd1b347b5 +result: fail +shared_secret: + +# Zero secret and error +private_key: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a60e1a95e846cdcac4c779702db2e7d39055c815cffa89c71595bf461924ef21fd867d2b0695ede50dbb4994a8ca35e185f176bf1f28b3854d6e5f2dca7c8cd11536217ef54eccc82ada15ed86ba2003e177f270bb5aeee52f9436e31a379d2 +ciphertext: 7d3db5cd14b6db21e23580dcef17133205df090d24fb80487306aa6d894143dcd9bf9c47f9ae2634d4c2bef2400f839d42fa417a2b53baca917ac3e8e6c62083d8d1e849603ad45a6522f8e1058b328e38f66aec79c96065470ab0d15947dc61aa1ee1bd4a178c957bf81b8247c68425c4bc3f2e243b8ccc50fa0018ecbc215f3487b4f54a0fb18333ea2da8e2200a608a83554ac5649445a53da1177a3a11f69fe12c6ce093ac3cadb9be5ce9e6fb895345dea2a4cf386ff6ed2d477719af3bcaf2dd34f2f6746d039f82063fc589e5322b02dda783f524bf59fe9ea30b101ffd83be9d1965ed3eb16c52df822425f9029209e303df1725842e94fd806476e684f6f53fa74ae4960f498088b5eecf024b24eca054cff625feba4d133e6263b07617a467e0d9c0bdc0aa8e1f12620ade63643fdb573a798ebd81e1b0cda60a08ade91c92c3ff8c5877593ef0a90e6c20fd9bbcc3797d3dcc7a5bab85ec1e08471c73c3a19dac7d7690eafe2ecf5d19f3d0d3de2b700a622d1ef40631dae81f725849a2fc8a0225598b5941d74da237376e3c4cb72749e3bd76a81701d79f1423b2787a5b4276ca277e5279a820aa9abf164d921ec41a5a3598f13665c19311d0a75a0968926ef664869b8b2e6628db1887ebb2a7ec06432662b9c1494eb399142b2f05b6ec71d37ab33392f755f2a9c772f60a802648e3e54494c6006067f95946c09c6db484c526a4bdca4a663b329c45d7888cf8cf6cb20192b57b21f06800d711d1a79301d05eed76bfe406f85c2bc32e8680bbf7742719686f59564e39ad7f77e1d6226efa41e5918c4e4fefd8f24e7d3bc885af5a3e4965dbcac0b0ca594df119af883309ff10183b2f6d26a43f0cb9df9284c04e5780ea2bb2c160bcfe25a764fc0789bf40da40f7001c5d92e03ab1907e9287c7879c3fd3d30a1fbb3f4b5684d73b8cb0e7e0b8cf455ccceea2c5e92e8f90e0a1f99ab2d2353c391d20d9d9fcca8d449ea1b2d7b2e161bc198f34aac1a9221f5e6178be1f15dd26fb5973ef7b56a9214ffba6683071370e619ad805f6fc3aca3dcbea742c975f72d3c1c8b6f7a0fb86e9b4dd4fb76c5531d8d5a48be510e3c3454c2ae8196efd398bf117c2dc8c9891c8ac7db5317d4c98b5b300d6422ff8ad7c0b748d8dadedbea0a0742afc0383f6082c8428c97f49f1225a40e9f10ff3cd42d701d7a8d4d24fed319fd3b601601a9e9eea1552c1d169b4b7073b3212bd86ba3efe733b549950ec4b71078b3f7c09880a810492463d8152b11ef165a1ac29b81a17b844ef04bfde87f9c090a1453299c231c7453376f3a676f75e4836ac80ac294d69da31f60f1e470888808008088888000008000088088880880000088008808080880808008888888800088008088000088088800800808888880008008800000880080808880880888880088008080808008088800000008000880800800880800088088800008880080008080000088888088880800800080880880000880808888080080888 +result: pass +shared_secret: b30f8bbff487ef7613d1676569986a72ed98afa9f37842013a2467a9ba6d013f + +# Zero error +private_key: 76da327e31334a81297ac41a07b9c1d4e04ef3fb8b06e9bc13071c98f6a80523801d0c6e5e7848d143a5dc011eab319ce6308bde406c4ca459fd3c20c5c76dab11c3eff0a060f52d6c677242b6019ea40c0709d071f587c06557d0cc36f7c428383834b69b877308c55e8c816d8195f614336e50357da66fb3f03de7c3742fb23c2398c7868690648122afe321a0b2b55abb99306265b8e9c4be1771b7727775a25adb2108a8d62bf5c18571267e6c1b5dfc547019c331532a40550579e79426304b52c88cb722da72d63a8da549731d5625a6e28db6ec22f3d1733df7775d5771857382bbca11dd271fc35b4854f58b6ffb25fd42286823790b1bbccb40c105e38092f5a744e19d7b758ce2a5379fcb1f401aa4db967fee4bcfd73811b214516a098d1cc726ba418118e14970aaab00293bdd9b18de001075e2a1d25183bca677db703b010a7f3166b7a4bc374b913394c504463a42cbac84ea799d70db4ac0db6dc3da8c78149bae1cc5e4b65f701bca315866d6a67e9bebbea36ca91fa694929cba572c60a1d1006c95941a640d472bc2b30cbb635087170381a4328cbd462964c80692f224ca17575fd7cce32425d6fb19a363cd114524d8c4106cb628253bca70377aa242751b626447fc43de18333dc21c841c236eb0b2073a2a8f9a268c931669daa4c9036228394fc8a0a2cf809a1a2929a5ccc98f924a9b7282f922c5ecd96cd1436b5b21692610a44747a2435807c50581dad25268d737fee3834a54967e76c3e7f537023b57f6a7b58c191427a12282e06421289448c97f7cb042ca66927a417e6747b3dd501d119cbd4dc43d18174aac099ef85839c7d9425d87a17cd77ccd568bbf4bb0fa8ca4e5005f9ae815a307471219a9aaf60bea631e07162a1818c3c5da6c29385fbeaa76ff4804beca79d1f842c46b9fb29c81fc4875afa0b178564d26b26cb21aaad891822ecb471b76a869b83838388b9f5839e0c344a7eab55c392c99019a0841b20dd14f36875853c6150fa46c2572828f51b9636b00bad5940912923252be3c49190577c928d5bcd6983bccf00875db487287ada1849d3339069195380c1a3ea34703792251e5c7877523c1b6278f9e40cfb1614a04c01d966c41bea36a10492edba56a90e370c1995de2203aff43002446a30f3771af65924b8354e0dc2fb4aab0295925a23576e4e9770740845ba541eb23610125c782c6c82af506d9a25d148373f5f48537d7b0df7c9e72f10938f9cd66aa6b2dea9322412eb01cb04de39797f78efa29186af03d90588d8488914f94033b644663269435e2c26b47297af4a324526301f2cea3446c2507717e83c29c8a53f277cb739851bfc94db3db6c6d2a35df897ad06420452281d1659e7aa89e3062abd2a1a7113cb373e6856b7acc402abd86418c554858eecbc2b38b8b9920cc0fa091b891c8a4248cbec13d52984c6512a025ca69b34477dda65e12b7839128427c42832a1c5f31e5c3ec09497667ca7e0059c5f43889460344fb6985441afee726b58172e2ba2312aa10639737325cb82e2947299b94aa8bb021857232878b45b03f9f0ba5b0ab75c1773c471ab51e666231c3c37f1bc4630628a9b1272fb9af1c398b2065bb3d95582d63859ec7006f9c80b1d0c26c22666dec1784f76b4096b4fc5892a49c925ad388a3e31ab2bab228c91985b295b730861ae72cd0f733a0ecb85d26844ddc8d28766dfaec97486105a4281663c67585864367b7521e968357940bb31ac0658ba60e23baf9d5cf4b2600ed8b19f6a7c974fca655b0b2e5bc019c8398bfda6bd6442e51d365c3839e6e4cc124cb5529782692bc68a58617517a9d6a316ad9e93695e48791897a0ee3010c43809d0a6f5127ad9f43578d5842ed91902ae068ce3ac8cfa419e0dc8c90b0cac51a47a2a16162c515d0b98099a02c7bd82cce9532590c2588955c8c37c5d957736c25cdc7329f3951653747b7b8f9b1da32027121a53d62b949e9b15a7a29d07716a74486ca28bf6ce3b8bed381cc391890f2259e60a12dcacd293908c97c503606a78a4c035a10a966415788033cf870234986820ac71db9e322392652547a6f5836c138b869dc409c16d67f1deb186454ba33e6c45cb24e969734d4da25946a427346915d598a0cb45986fc73dbd63c387421bf95c11f6a0956a76697d6216485352da8932f697e8a02c293bb76688c550c63ca633a18f1e07bdc07951a996cec3644755c4a0f55230c48844ff6a82511976e4a0a17a499e768207df0c309b814e30a099a6511d6f3a499994a821c9dd41872860a977e7406cc2b3b69768b7ea720b2f5858df28f97b77f05d2361c62b100271db35c660493b12b66938845c1c799b5231251980a99ccab6356a0b445e86098108126812121176f13979e59a1029cb040bf36aef192aa622523866ab99459a01dd94535477e1755101478b53ec165c3197d0110a7b4b4892a3bb82831b300e55807c44df5f6c1571ca125b74bc33863603501abf51120acb848eb1daa2a7f50e640fedb74e01307f68798e98acee0e91bffd8150f2bc9780956b4a2697a825da419aab3d3946797762aab8cca9a5a65dc2edf507e8a9474d803c8fb637e05c94cabd721eef5716ca4410e69220c4a22deb89c82526a5b506bdde8789e2359352c07cbb90f3faa867c538d1926051e3c318939302dd31c34e894e3917e4ddc60f3ca9d3775242003ae7642035267757438a5deeb96c46489670abb8918c3c4b42ec7c7c3f2bc74f1269989080782c8941a2838439c3425d88f0d5537282a677ae1102ed695dc447668113481f89e60659f1e017dcd3336ed47710a8721cc421b024595a86125af941203392fb0f9cfb2fb7af950772319070ac60f97c2932ffa71bba6a94d47c695bca3922835d86a94cfc360ba637939034a7850579c7c5e6ef90cd7ccc983d28f357ac379a6b7d6f328bb0283d79356d6b28041aa0151d16605798fb65652ff270114f29241b8774f94553351536526aec996be9396282c66c77b63399310019ad8474912bff5bb1503d481bb4aab4fa23824c68ae5058230ac2ba43a4805ca8cf6b07b810ba6d415c4bad388d17373b4535af6234e42187d33ba51dc75a8cdd3c80870cbbbba89277c1b79e631f959c8f45689fdb7a6e72a97257aa188f8548da934533076937a140ac62c598a40adcb0bc0e0af7af639efa4128d10b8dc0197a12ba1e3c9c68b461dc3a7ab2975482c62810a60e1a95e846cdcac4c779702db2e7d39055c815cffa89c71595bf461924ef2d1eb791335eb534d3f66b1e40c2a9eb888bd36454b2a069805f787b8530ad7c511536217ef54eccc82ada15ed86ba2003e177f270bb5aeee52f9436e31a379d2 +ciphertext: 8d0f4960c3b07ce8148731d6f2424e614145f9bc98adf02c0c9faf944c708502d96b8142b0823b6283faa03ab500500684ab8646951f90a09ddb241f5afefcb2a75c3bbe742961ee3dde84518933dd19dddc08fe0c2157743a5d464738f430fcb0940e3b12d8a2458234cf3d2dc475fbc589d90f5918dc8c1be0bae511d6bfa0c26598529a3646453019008df6bd4d2689ec76d5b0bf1efcad50bcdc1945bc670b24db9e0fdf1880aa9d90687bb1f4d4186ab444d2cd1c91b7a7c57324aec0e96240f9d817929f6b91d136447e46cfcfe0d6e11ab16d47dd095252e13d61ba2ba1f5ea4fedcdc0cc16b2780edc9b4e4941e8b2dddf791da9f8aa6b67906c52fd368e1808035377af67def8840fc44bd11896e594deca14d4cb942b28df99583081a3e9c0f5c8a989d781a062765214ca381cd65683faff599eb6db4752fc667014a8dbd7d2fbd64016fa33c7c8d39a36265f300501d52ad4c532abd18f43662e9a0110b5c54797f1148615e52ebfd60b07f9dd61c5f22f563620735a5c55dd3173366b0ec207722afa4e7791453f522a898b9fe97759e6112e096185e40b7447c112d508ef6f8afd64b0c2bf1f75cdaa42c9db11f0d997c38dc5417fe39d2f99f00abb50b66cf1f9ba5472b05605d492b8d483b7708568753bf415938a3c26ccb361873d0a1d1d42820cf5ec6986cce388b0356b40ba6d572f19be691a654356dc7e90b31bd04e8ba9e27fdf179037c0c8e2d4440eca4d849bc85d61f2df423bd09d90ba00766e5e6ba946e53a66c119611d5b017032c5a39c9a533097dcae083d3832821668b1633ba1aeab81f556d61dc96d3052b6497f7cc349b548f90fde55604c33ce018095d72e8c1a2468da1c6c5f679234636352e5ac1b08c7508a887b1fed6fe466520f88cb5951b86a4aa6c94398db200f4ad7e51b3321af70124f7f34823c4af599ccf925c3002d297760bf4baf7fd1465e95cc824853562623540c544c8d46a4c4e006837983f976d47cbce04b703dae965111948159ef0c95093df21d80555016265c582b19b0dc8403e4e297c980129485311ee1ab7ee9e4f37f627ab239f5c6158a7434b8c6a654dc305e338b2e7c9da053d6932bf4640c2215f68e2020658ec82ace46300fab43412d12b2cfd7e09954acc0e7b928b2fb791f68f7fb455230292eab955b4818031e65a54bfea008ee5605205fe4d68b26de0e60e99ee5acd069a23e5d83ba43745985bb0cf05da32028e66bba8516889e6dba565a006624433c6cb23147008dbd238163739adca132ee73b4eb0415a3b754fbdece10f926f7979c6f85d0a6e9ee0e881f13f50c657cbfc345185f55167c215d35dd0a0f88c3736119d1c5891fe5555dc3350c86e2df0383aa876ed91f03207811e0d6d752669b8832de3836481c33d416f63ac05234a996d7330b00837c3f267f09c74f0b4b85a2bf0b0ffbcc23ec403fb621f7f94ff5b14db6bc699545f15e448223e677906f8d4eef5a162e0b2d4b95e205b57ec7fb50a03c7ce1f53d7b +result: pass +shared_secret: 6f68f7fde8fdc93b27a91e7989842c6132d60007d2bb9d99fbb91d4e1c79fcd9 + +# Zero secret +private_key: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076da327e31334a81297ac41a07b9c1d4e04ef3fb8b06e9bc13071c98f6a80523801d0c6e5e7848d143a5dc011eab319ce6308bde406c4ca459fd3c20c5c76dab11c3eff0a060f52d6c677242b6019ea40c0709d071f587c06557d0cc36f7c428383834b69b877308c55e8c816d8195f614336e50357da66fb3f03de7c3742fb23c2398c7868690648122afe321a0b2b55abb99306265b8e9c4be1771b7727775a25adb2108a8d62bf5c18571267e6c1b5dfc547019c331532a40550579e79426304b52c88cb722da72d63a8da549731d5625a6e28db6ec22f3d1733df7775d5771857382bbca11dd271fc35b4854f58b6ffb25fd42286823790b1bbccb40c105e38092f5a744e19d7b758ce2a5379fcb1f401aa4db967fee4bcfd73811b214516a098d1cc726ba418118e14970aaab00293bdd9b18de001075e2a1d25183bca677db703b010a7f3166b7a4bc374b913394c504463a42cbac84ea799d70db4ac0db6dc3da8c78149bae1cc5e4b65f701bca315866d6a67e9bebbea36ca91fa694929cba572c60a1d1006c95941a640d472bc2b30cbb635087170381a4328cbd462964c80692f224ca17575fd7cce32425d6fb19a363cd114524d8c4106cb628253bca70377aa242751b626447fc43de18333dc21c841c236eb0b2073a2a8f9a268c931669daa4c9036228394fc8a0a2cf809a1a2929a5ccc98f924a9b7282f922c5ecd96cd1436b5b21692610a44747a2435807c50581dad25268d737fee3834a54967e76c3e7f537023b57f6a7b58c191427a12282e06421289448c97f7cb042ca66927a417e6747b3dd501d119cbd4dc43d18174aac099ef85839c7d9425d87a17cd77ccd568bbf4bb0fa8ca4e5005f9ae815a307471219a9aaf60bea631e07162a1818c3c5da6c29385fbeaa76ff4804beca79d1f842c46b9fb29c81fc4875afa0b178564d26b26cb21aaad891822ecb471b76a869b83838388b9f5839e0c344a7eab55c392c99019a0841b20dd14f36875853c6150fa46c2572828f51b9636b00bad5940912923252be3c49190577c928d5bcd6983bccf00875db487287ada1849d3339069195380c1a3ea34703792251e5c7877523c1b6278f9e40cfb1614a04c01d966c41bea36a10492edba56a90e370c1995de2203aff43002446a30f3771af65924b8354e0dc2fb4aab0295925a23576e4e9770740845ba541eb23610125c782c6c82af506d9a25d148373f5f48537d7b0df7c9e72f10938f9cd66aa6b2dea9322412eb01cb04de39797f78efa29186af03d90588d8488914f94033b644663269435e2c26b47297af4a324526301f2cea3446c2507717e83c29c8a53f277cb739851bfc94db3db6c6d2a35df897ad06420452281d1659e7aa89e3062abd2a1a7113cb373e6856b7acc402abd86418c554858eecbc2b38b8b9920cc0fa091b891c8a4248cbec13d52984c6512a025ca69b34477dda65e12b7839128427c42832a1c5f31e5c3ec09497667ca7e0059c5f43889460344fb6985441afee726b58172e2ba2312aa10639737325cb82e2947299b94aa8bb021857232878b45b03f9f0ba5b0ab75c1773c471ab51e666231c3c37f1bc4630628a9b1272fb9af0a60e1a95e846cdcac4c779702db2e7d39055c815cffa89c71595bf461924ef2e866bee46434ba9cf83567a32eadf682184ad0feb178fc612796d9b870e80fdf11536217ef54eccc82ada15ed86ba2003e177f270bb5aeee52f9436e31a379d2 +ciphertext: 591416ed43f689aa76a117f623b7647c6ebade29bec5e089f06a7ba3048178df0aa0c26680f99d0186432f9fc3987e0a511f2bd3d075603d315956b2319b4a61c250c09a5f8a49445050e6c2260daa43a6e12e7f25bde3a94fba40f990c950bd30f9229d5c65b6bb4e13fb8ea50baa866cdda065636656941dcf58907f6bc45c778dbb8e1e8a9bc1eaacbd3ed5c034136afd74228e70c4cf735a82c696ba386a451cecf4b43a71340012ff8676c7d5b4b80e0e59f1c548a40e7c4d25b8526bc4fc14aa9fa7935c9860efd43095538dc081982ae2c81a96f9634685f506bf7cfb1fa7fde39594c5252fdf753818be40ec6191fac29f9512ab94e8c03ffaa7990e3b788ec43d749d78da8f729803eaa864efdba24dc3db1a65d1110922f612ac60c3cc731d65f8a1ee946ab348d5ca8f4d749d5b07d0ec91c0f74923533f86640cbb30b470650d2b710c690651c99c03caf4792d923e5a094ce709678efad3b474e803a87b7d390ef05ce6fb2b84eee8c31f9cd325479f78ed7dcc82d06d390c616019ad6bf8d7c18cc5f719afb06ca331034d620b108da68656c2c5bcf206046cf954ff9aab6f76833312f55b0ae36330035afea8e4b9c3fb522599d7158f3584d7d0d70e4557568b7838e437f04bb41d4f8e8d41969fc8dd2d35fdef69b85d331fffbc5d47e1fdcd60e8a10979f35722a430c55e9564126182a8d9140e8cff41386b6e81a1033a9b40d75ca6aec60beb7e3080223dbde023eb59decb9054663fe1170f2da33c352c86b10c4cba4cd79878a7c4e83745764355b3c1a8b4a61384e1e9db00bcef2068ac7d4a4e67a1aea96c52ae35f998eceaef3db46b43b85dfcab0a2994dc700868125e3460e2f9c11a0402432e34a0193ac2cde8fbda0f1a81371b43f271f737d7af2af211f5287389989f71cff7c107fadf8010bb837d3cf2ac884653ad9854caf494d5196d4fbe49585525e50b009332eb86303ba5cf5ca11cd19b687b5f3ab06c2e36327c89e0ce03efb32a813190a1849382e82cf554d86caa9cc2c9385bc3b203d20415d0282543ed33ccec14b2275014a13121aa206a98ed60261e22acf4a8eac9c853e96f99d09ad7c0c46fc8e93db918818ebf249f871dda0c5220c4a46475266d2dca6b609167e120930861bce88859a822f18d044befb231ea1e6c7459bdeb14b6e988a85c50b4969215451d96a653ca2990c8db43f44df0809dd894b072037e647251aba319267f7448b408aa959825d79e011a5792ce8dccfad35553e4fc662867811081836a839927a4060bc9be4ddc69391e0824bb16d6376f03077919e3525a6865410c71a5fc8e86b9cbe9043a294c90650888808008088888000008000088088880880000088008808080880808008888888800088008088000088088800800808888880008008800000880080808880880888880088008080808008088800000008000880800800880800088088800008880080008080000088888088880800800080880880000880808888080080888 +result: pass +shared_secret: 1ef65648be69ac3ca3ade1382a2b4a4ba1c0c7a04eecbcdd9e34af67665bbff2 + +# Random ciphertext +private_key: d13875ddd0b807227dcb5288a8991b7140752a20a8117970cfcaa91c04c4b46483d81c4133a08ae5cc0334e94561b597e111097dea36292ab537395be5d80788cc4d2920ae28789c831b09774a5d8206731b966b3794ccc03b50dde90e32359f731c3ff518972dca5fd29a5843a79d63804158bc27631bb53f18a6ad31c88a8c138de0823e3797c82a5a89c2bccc3ab20bb88b5a60b845321ffa3929ecbbca813c945366967781a2a9966e1ba5016214691160617236b45a5b7ca745416680412944ca2d69841947287d5a4ca53775683728e07956eea8439909c6437cbd2366ae58ba4c27a35381fa9f5b380105d3060f14aa81b7163a403754a962579731cce213d3e43f842c9a33f26578539356b3ceb4bc40f558a933b779e62b7e91f71d78e9b21aba5813abb14cd6b43aa169e2fac8de37ca4b335edd818fd25593f6dc33c2f283cca6a8d3188e60c66e5d9122d7888befe9863225bbb607880724801c7b4d7dc8110b06805da0a12a926a143c80f35c052e203fbad9525f7679ea485893fca4e55a578c6429e4510e70c0a44de4aa1400322b2536ba2b4ebb8b947a3a169eab6cb8f099776582514a74dea155914ab05ce220e8791ba01aa4a5c95af319972c802150da50446997026612b783bb9de66ee39491a30153bcdab1fd85b959fc153ac79e2de429d8d929c867073364236f5a51aba4a4d98a5a61282e6bd6caad860de637a3d123abef01b536d30abea07a199ab4ad4871a6b19b7e4401bcec928c320ca339b49b864c33e50aeef15b01b683bcac709d860cc36413e9b8bfea3128d1f20d0cf279d017022cb1b9b2c0c676b3c869641da3358a2167c3ccf4088a9508300139034993849258387a1b46074dd5a27761068df09a388b0bc99c233d5ea711c877a14e30c57ac41113d2c319a1ca11c20b73e1208fe27076cbb31971917b14c661774f386b863e78abc3ec8cc870a06604a5a31ccf4b8637bdd2b6d9d4b4aa2a41dd75a71b62934563530bdb87f6c4b4660ba0da795b9924cf30e63edbc02c0215c92904af43c35cfaf00c308240688b17ef78c766837ec73a13ba97b2c8444e7e4960eba097ab02838940ccb387b20adb8021d064835508b5bc9da7e10a400751907598e7615ad8217fa301bed4590d576353aeb20a66b1cec3990f97919b27c48c97cabec0025033e66d2be8063c188c44d4c76465cf2f07ccc0338f0161a897922db40757fad600ac02126bba3f5054b41f34692715c1783c1ac761a791b89f1a7108f71cc9a8cc45635762b1b2b78ba103b4dc2bfc6bcd56e23b4128b0ffb5b1dd040910552300046897f7bff91aa949f7010a64ce77cac12088af69d537f302aa9490ac668a00256193bcd9af76bc65ee8a0c72209e8624cf0417365e610526e224ca5c9a09dc3e9fc81290b1988a1bc8e2dac11e62ad7ec75436da67d05a9f562a3f1e976759b857bdb142baa9ca7c77a4c39131eb7b135590b886b54735d25e4a96a0ea22660438bd7f9c812352b6a19cac7565c5dc7811a8f001d4616dddc57610473086640f2f663b5cb29a20b05576f4c0a2d6183e0b059b5540aaf240dcbb68d5b05ddd5abfbb7348757a85657a993ea6a913d277a8632ddaa4336e236c2109b41f72a2e9c432541376d90c13ab6c89b15698710169fadc583ddcbe54e239220a212e2998cf52aa264b553acba6341a897d06c929719558d189ffc105e9f0577cb5bd3088ba251797e3c75885c6872a13c43ffa04b8c7082c9646ccc7395d17b5075972f0220dd318977ecab921947dbd3a9f1b7c0ae155c1166384c2aa86f5a018ca8b20fc154d185a94313b2980cb4596786cc128b4c6e55da31ca48a019ed6443b781a91b50b3bfda0adb78ba095783ac73b0ec422272521cf93986ad83a108136ab5f9438b8b19d8442a43be77ef4a1c00c860687e138bb2aaf7cc39cebca70415a7e5770242c1364a672a5db569cc6e0aa50a685aef343c4465b28d55f267b8eaed658df4945d11b96c6dc38e3614b18430a5864b43234819f933bcea4569ecc9f47fa03b0b9585e3282c55c5f4af2ab4b5124325bb89fe0b5a2311e77d9b6b4f5cdc4940f807ac1d8503bb9b3615e82c4ca4255457327f7f734bf3ca188130ce2f4b95ab132d2146437a1921c3875b78ac538f79cabc4cb15dc94d4c89238f3558df2113165baa2e0cff5a889e73a9c1b949aa6b00379db3ca6667f9b0043ccd8b0e0a948cf314405d7253d54cdfab11ed7778f60198c097a46a763161dca044f90716ffa80119a3e5ff229a01b9e78f0176d407fb6329b4b66b8be35b4c5a838f39395aa744690c83b16e382879b7f6117895ec2baa24b7215580165458fab1c21b7661b1f2b92ad73a941873e68d135adf4be7eb9b23ea60908f6c3d0602330e507fc09586945672cb69c5e77806d300f4f472dddd813188280191520db2401b3b1699f7acf35196b95645be7ac4f87fa89b46862470730f1d952272a6b0508c425c97a09d010421463b8938c1f19b401da54a33b27b645aa613c0954980e9f8a161336cb79693ba645af106a7d916ca1cec284e65b2fc461c222b98a927a7643f70f087994b2b1caca0874d234625072aa9081c3dcdc3c77077a836088dc538f7a8aa1b0942c2b19522bcb6122309512059d942a25235206a82c8c10984a7a5790e7dc9e29e7bef8718dea15ba5176a318696ccfeaae6b3bb7ff68977b0588ac8b1a0932009cb029b22059dd6b8b7356b19353922a63b7ea823b8b1346b8723abb57008ed8af968ab77a2485f9a74c47d6ba5e026a20b9914e04196282a02be8a67ce77654341775dc2b5de8b5d92416b83a9d7529b333eb2ee419a83de47a37129a929c72f2b6cde0a51694128724d6bbb6b37a9a06134aab5e09652502e8b1dd16b74ed37da1b28004c33c3c5732059a0d08a5259b82208968bdaa02033ef90aa688b9bb976f0443464b5a0784c49b4e469272097f98928751b78969e81dba80a0627c887d5222a70571cfb385fc8a6bc1368484a7bb86e809b5b14a7c90b68b5cafe353998ae2666de75f3d57cf373438b7822b86b3cdbd3cb80b3b599a372220b52cbe6b57ab7610c7091f2239ad20397cc32b07560b4aa4061249859f5b86458c528acc072a9bb0956f19be82658025a6365f245b505a3ef0d925518c86d3905084519600b4c715034e0a2b309897b288eaa79ad0617a7a9858436a3472caaa9b4b1bb0b10d554f21cc0643f76105f702b0045d9b0b044093bd2f0946d77bdcf6e6e6ac9d0056f390a94f273f14a0cbeaa8cb72f8d2364068400870e1d9939d32be7354acd94e9e399d5e20903d1674047e7e7a1649482e1d9b0de92455cd14d0049bdcb7cea4b867ace5c8922b +ciphertext: 542acf1e3c7dd990f1879ef5b5aebd32055618c4e5b958995f0b22a78f9e2bdd8dd0cda23893c56f48a20d4df878e1cdbd39f50310f2ac0cd502e761329da00d49e7b8721f53af649ef7edfe74f259ffefd492f13b1ac396eb65916e02b3348560ca426e9b93beccad58bcf0c5804f0a10532635fcb74e45c1f8eaa83d56e78d8a7ee5aadcb7e06eddef900b484632bf1bdb0e1a4ef8b6fe34789934d9baa887ec5a39dbc6416f66008751aa193a9c313ef8a57a515bfe046953fa6a1329a770e9e1bfdc33f3a68dbd5cec1c2a55a0e41093583230ac35386645e6dcd166f25706efc779fec0cc4299e8e7501b93a857378713475782cb0b31ab645940f4c875548345ca0138372719c3cf9022034f17c28bb90f6090d4b8be957ec63c297a0ba95dc02f8761c18e7a948c1c20158230e2f9ff809cfd01b9d020b7164f8a3c54a143594d7d35b8e1ad6cb25d96c11c1b7f47f62a8d90c0e2b3d1460b86a463579e7b44ff74b6a29f30521588a26887797c60d86235e0bf4c2bc7166bbeb275996e1f50cfc36641710a52fe08fb5dda30f6129d3a304e336ff0d8698515b2cc450cffb45cceea7ef51a989d036c71367a4d26cd6025479d2f7ae58e700928e176c59b3040b054a09312d9fe529ce784a71513b44c1cd4073209a93a4df73b7097da88cea0b31c3e77e70abcb4b2ba5edd8db8f47ce844750158ddc5609dde43eac393eb5909d9415ee4698d923d8ebc28612f8b0676565010360b9406091ddc881fb6a992b70645b6898d13a8e3e449be589cf17bf9312e5cc58b03d3c181f7f176b67bea210337d6c52913f8cfe145da9426434c1fad0da7911bdb35e68b86b5bc6717dccee9222c4842c28fb13115278f1249b213498791082bab15d32f59481b29b9512945602eeba8af490af99fbb841bd1aead2b4f6f57f19dc970e83bd3928ea2d33ca3c3e50cd5d68e6ef516371cbaecb6b73f57fd5ae5b38a74f20759dcf217066081fee51f0fe8a93aabeab4717f05395e304e86bedbe11d462c1cb9d4e32e75b35fb707e7b509e43b450d6025b2d3e84e00f3d92b717578e820a33788013b2bda42f2701a9c6044ac2082e0387e141bc97a60bac45e0c1f4787bb5b892cb190e4b6776f5139082850494bc5ac56a6f759a0505ed4757009c35a4d36bad276185f1fc75399043168b22cc668a4b1202e03407b9fbb6a0799ba6a396ea78e137f7c68996f18f1636037179c4b920ef68526fc9008aecbfc0a2b02432e2b15832b35a61f438e06ce977c4d447612c13eebd0549edf316f64f5e7f3ccb0b46d19b79d103c1ab8f1551b6b3d22ab75a85660af2a9eab9c734875fef1d526da819829b66d65c8459a1aa404ec83842aa97a595e0271630644ade4df047f06778fe1bd1466bd413279940f15b9b848fae294bf4964286629682abed221e1ede635f315273854d57f68872bd9cb503545ef7b949b36df853eb7a4f47805406555d361aeeec6b77a0b6030b5a124f34cc121a927740aeaa6a381083f4e645b0d +result: pass +shared_secret: 0483742b451a5b2364318ed5cc233ce07dbb3fd4ec9386050cb8cf0adc8d41e9 + +# Random ciphertext +private_key: 1d184d45e296cb177aefe9b41996c8f1169d18c2a9c3261883391023c9c5327c32e0124a48b05cd6d91f2e0bae0e17aba9381a872c185e25313c8c71c245c7c90a3e130b8b4bf599e73b063058b59e502605f4a4186a8202a603cc77a765c4167856c9195c9727d719baa7ace6f671b5e86482664346ab8d5251156e6a435a8886ab03c61067af054cb16eb211c0438824cb50dc951fd4ec6e27c203feaa094d26ce879c9e022743d6c8b5b2d4a311b00bf6b4009c8a1da79bc2d3919848e44fef6894b5958c4455c08d6504fbe61a0f3365e5d789287bbaded67d6f4060fee9940210b9f9e5381689b746923cf5b80115a85065e956724ca69f922566e90b25d439fc14334586a8e17c8fc0f28adf90a68f411d76e52d578949acf9742d823edd347f5e3704d8e2c64971a3c1337478dab4e03944ac68475055cfde70942a6ab5cfb928098624df248344f798e79a8446a62d541b11ef279ae0eac8d1fa5b5b724b5f862fc4c97d81394d3ce19c391019f6eb898bd9544201a1e996697c354093f544d3cc3696f3bc67b46af2403ba0bbc92cd63bea1469ba860c0a66664ff43b56714d5509b9a855a53c5039b9a0539a8cae0b0c0ed7b368ed4c0dfcaa0b44440c82503b98614487a4468ea7a5cda1cd35ab7b0a720d4ae3b46f9670a409964820908ca160d9dc0dbd340afb9a309893352d27ae1339511cfb3924e6bdfdcaad015a415df9a1f923c9c3093286c82ecdf73ac914af21813acea38b984b055fe244c6d2715515cf490bbe98b3ba84c0ce4c066865b49686cc0dcb787e60d66e8b17a32d84049d2ac3f7b50b1870794cd1749b7a74727799628a5ad968264694987ee72e5165b07b7cad4bf3af0893b615b6caa91a332b73c52cd85f8fd88d93f2c411a112e2d25a3f13c853334f109b19140a8e5f534132c5af9d86aebe6010c4bb054d238c61c025916519a50a35cb2958a93b9cc9db0554ec830c08a56be813d2e6770a14623845c2f5208200fa80e36989c776c8dcf3be67bac91cec8afb4b4a4fcac5c372a2dddbc192e7c7140b79c4323c8686cb42871959639f43001a1e504360ca058c336eb757368f83905f95866a2c86f1b20d70341b42b5482bea31225593bce1527157258b625fb029967b135df517124e16a97146cd53803904405e2fa71ce4a3797e586cae9b4c55f226320727a81b8bb5d323e7291c01797fa1195d6292c16a77044e71bda6c920e006c0892ac70d48acbab321b79ab7af131df129ae500185cafa23e0485a38780114e10908f1bc6a420b4c84808956a335a11de114971c9a2701f2b9eedb833c5a0d2bd3190d14a368b0cd5e5b44ce430a5ba2c8bfa6a79e477de71c54db86ce2bfc071d9051fa8142a86acea7b8801ed3ad67450e1c8aa199cc848bf4a6f6b3994a9108d73b4876d59bd1f02a5a91a5f317b38b322db1e966f028600f79a71dd42de95749788754450521d8241324e732b655540e92173a460eda82178e125c3db14536356ee730a9e334648262cdc43c634682bf2f50089b5990f24065694549643b4262bb17105c642cebb20f121c6a736b9805640cf795f6963e7b58aeb920a8ad7a0f5afcac055095210b9cdd3a8477b9320cac3cf1f76cd8b90545a6a6f07a741c655bd0e905d26548ffeb2b2fa218c68280add1afd2770a1d7517bb6965de62a5b971ad6f9064b31465fcf5b0b8c75dcd293ef403a512857da8a7b56d78c4b055c40354c52fc18cc02bc621d37e1036bcdd778776143e201a1216445851d9a91ca359037a9beeb0608bd02a3fd5920d375cda3b5ce1e21b3f122f82a6c317ec63d060b98fb40832261cdc925bb3eb9f15fa330eec8b0041a5992a31fbba9b8cbaa26bd3ad7682a59a452dbeda20052c6cfbc1bd85c53f6925b92b78942141b28fc5a1e220a630d14187cbc8ff95c358869840a432e6e14a0ee75e921c93d3036b3f16c44c45124c27adaaf37453cb2e236524c39a80edcc3bd8e1befc444acfdc33a4cc14a6c8aa9db16c86e84a58b26c4c7c05c2a712b3005880ccb604989a07698015094fbf2b4ccdb76eb9046724e3336a891a358a6e57f95fe243185a3bb1d4f7a6b7470374e8935be677b593a0a6c93f0935182ccbb3d2a59b97baa7adf87e415c20b6a711888a13b6fa60968bc0c50c6e84cab64b88c07d88bf8c3706d1b92ab32514834320d936c660f95d382a2753042b6e55919a95c7120354997767e3bc92024369f4d717cab060f39a16fe1004d8a06fd9e56d5979650eb80063231b06553c22b007764395b1c23b1bf1cdaf2aa432203c14983ace961c3eca74ed025ef45050708a941f18537d2b49642983a0599af73a5407570f91d5879ef3568a707932e8c7860b2e36702b7fc946104122771a3c47f164057a95af2a5746f18c2e1628d3dc0b58f14489f674a85455ed0cbee96ba850a2ae4cf82e7be6c1ce318f4753aa5cfb41693c23a467b87f72963bf51b3632333fb49b51297621f66236aa80fa257b8f6284998837535c9d3d14016729ca68896527b883ea8601f03284f7151f00b35738798f9fdb551820294145416bd59091514d276497c2b0a05a593251c72446cc0a843b605f52acde9b20df8c17fdfb43acabb64116607c5c37ad1b90734abe6fc66374a13cc29c939824afc06a29280248c6003ae3501eef4660e72a81e75a8b6082c523db0e22e7463826b165a1784c707fff31cc09753228556d7f19632eeacdd8d78ba7c2999f2b84294c8126c84a54e632fd2a8a3a8a0cf383b1b56a0609e599a3850bc3f5bab7fa93a5300bad02604e39974a354df572371500779638730a0cc1b3b8a3ab49aa0bf533f5232e9bc3813ff50d9ad2be9377467402714e145e3ec60807e638e7964c39369eecd1b092a1c6fe51186cd9bd1475c21542ca4063c2971a337747cfa283a0b01bcb0b6cac3510a96a583b03fa2b755cc203a3969c30581de231f9a11e78a440de77bd590cc7241c86950835902033d2aa4434e0093fc588b95955eb94ca3a93c61a582928729064ea46656949510a41bf915ba443b3be6788c3b3ab94f76a1b26c32096733265cf39c2121c413066789420b43f46870854261d5b22923e0681c8f52a2b41cd28c6417866bc6d040c9a630b63b7a2e47640eec5897676a13db7691ff38b34f65bf9a893448b1ce1142974573ce1d8518cfb2b66e3240b85b6965c2a03ec7381d7315bb9cb0b41b216646c53081c6cb342efc1cd89fac523331027cc324821ffa0738c9521a9ce4e63b3138cba243423c374ca54922d7232a6927bc6e1e7389acc1f12607651710e04dda26064fc13b873e623b60440ded913ef40fa68b4079833a9e34b24965c61d3a0ebf9866c9ff613a2af4a +ciphertext: 2036904d3d5f2c54ffb9debd5e80a77fda6ac9d3bdbe6ad673b9442507f68cc10d98116d37e8dbcc11d42b7787436801e52ac957040fce6ced2daae1d7b254b82e5aa8ab17e519956f40613d4bcad0171ee7850ae5adffcd61d10ba83486e8bda501e9a8e004b7b478b885b0fce034c9ce1673dabca43d12def5d81fd52ab8316aef232d51f751c574b05ba66dbd93a4012f9ab31e571148e7c649b4a437596250c5e8c91bc675b42c0c480723071fcf1a6e9612b684d78c25b8f645c127de0b9ff04ad51362b612869ef64507425b89eddcb4d3d69f693b0e0e0c4042f74545e4ab11fafe4aeb97f1c3b02d4f20c8e0be11c3d9b6ae778cc90ce2b029d2790348442c52562e73442f4e558019fe9a59c15d552801130a32d4cb6e4cf8ffeada36799490d3d33f29347a4518ea89bc127bc80da6d883a8db9700edbf62a8815a7542ba20a58724a50eb33cf25af24a974a0e85436a259c1ee27cfd8435e7588533c3e7f2b7ab02b6561bef18048dfe4217f6bc9767d481a7053e96539147854ee48b93ced985af30685d7ff3a0c1e7cf0a45b893d7d8badfe9e9e97ad772b8dd6d60f75ffb9b9c3b0661cc1c5b2296ca101528a32075bdaec375f20feadb56e1d8fa011f588795379748aa34ea25a8bb7564ee250a2f648085d04a9c8cdd0ccccb7d8bdbeb03318588da507c614598bf0c7640f9c6a15771b8edce1acbeeb4b1c5ec60769391e0b5ed616e8a49f054bed4e39ab9c0922f95f9f93319251721b6ac5ac90b61ec4d6cf25a55e36a7b2eae23bbf287a98de7adf1102b9cd45e3805fa8590cc39fe1b23db203c6e789dc9d78751a2da38509875cc3f755135bf4a27a0bcb7a0d1706a2c197b6883702f68c80b8634dabf75ac987623ef38d4cd7ef648e57a4df13dac839bed8959b558ad338636c3e04e67859cd28edd68d8cd47f8381b5ec5e92ddc6b07f7ff6d02f2edd8a1c4aa01a22821a90a9b11913f0a549efdb82df28370bd2186e798c47834cd23d1a6662e3f4eeded40f6ced0844c4b797d67095d3669aeef795ead942599a99b4d84164f42c312b215a4663c98c316ebb0b599f016d90931adbd41ad7cf5375a891e2f86da9da068ea44b9d4f2dae558622add24abf0ab1f95ec797082aa3c92d1d727f96b31bb2d0bb6764610a7459d30c90526db4e636207a26256cb3df10362bcbbba133d66587200aad59e1beba2fbe5df63d4434324bfc7daea0951384ed4bfb07e668ad2876ff781e133acaee564f701a721a6033a3928d8edd599cbf26bb0209b76bb5dfdf421dae28818a8925d3395c60ee3fa6e1b2ba1975b2d995f1ddcd8ba2e8cf2e14ba099b5ab34adbb63cd4f75bba2bc3a0a1bc147f0a1f3aee817f6d4b5a24e88792a9b64dd967e0514ecbf536116724356b38ff7b67933f777be2ad9baa93ceb7b101a27e6017ec571d5666078617a07b0f5b2c61325ad5fa9cb05b5342c8d38f7c76eaed5531801376486a1a2a507ba48af291a771aaa8fbf75f3b15f438010a3c5cb2195262395 +result: pass +shared_secret: 83979b9c20391249e9a0630a7220c29414dfbb2528b8faf2bd3802abf0d97453 + +# Random ciphertext +private_key: ba011806ca45a423c099dc7ca9216d4de853815480db82cf5a75a4e6292bbedb183978556cb34ee88687acb682ee4aa16dec17f6b95ac19744cf6c2d869bb2e373a2ac307fb0f2af69f44f11a90907d08e17238ea571ce31583f74669dabda081e7826fd7b42edc6261fd1629508788355a8616b84b472a33d863291316f7a49bb450b4920c0aab213299663a550d94385fa3e71c42fc600864ecb3c3980050d4558cdf827e957ba06b76013e2a65b38cd9e772a2aa6b46f516d3df31efe950add7b9006bc39ab266cc3058a9f852f918104ec868293498d42c3c6cb9acfa197b1182b7c76070430790251b433224888e8163a9b4870bf18c351ea9187a15aea31b42aab1200ed1299e99d0f2b9c2e82781632346d7370ca9a2584288fb6d9913b97810f7672fc47cd519a80ffe99fc15b49267b5a51348014a9a2a8e6cab5e763765a99570271c9c698d734458b16140fe85b3e6a4bae97aebcf017bb343bdf78893085765530b9be64a472f91e66d1886ca16c8857771858abc000382bc82f7f8a56c8c54caf5ccfb5b1a0c14081bb46416a1bb345a10c3bd803b3503bda040192f31eba489452eb7e9bf46b95f34534a916b13a1170a9ccb52c0aeaa28750a6b145ca75295794c2d9a4c6e433af210658b34157ec1c0889a7323a9c7b62af3a1094528b5ac644b66141688e2033a8c76b5b2486853a9b35661d2d69ac5180c4565c8c320b4c68e99524ea0e85202633c1409c056540ba6a7750041c57509806b430e8215e817e25a632b8fc5054b0b8f8a544cdeb9254f72abed823a176173d64c7894882fc43b10c69acac857e739cbf889bbefe5377b9186a26277c6b81472e3363d4817887a449b46998c363260a1c6363532ad63019e1781dfb8a413bc80a55e043c6d506cbd4cd9b9533241b10b5d9970112b0a0267bb6fc7f38627cef722f7bb79639e5732c27c5687025ef77b43fcb79b9a972a4fb55ccb56a98034d07cb55cf0535df6771fe577b342939cae475b80a0485fa7430ea17c52008bdc2cd691b772ca01e2a510fe4e6929a6ac18870506e4b703dd3c2be98ae0efc1941c1ce527221695a9a8752bcac45c863661b9221134ffb231409699cac71353026a2b893d4c56af718665f8573eed718ccb410f364c9f0b846622a3fe4e209e219bbbb44496e096f4cba269b091933691f7bb44365672c740bc13577a16bd5c4b3e2a36f217429d81ccc670ccb5bbcf740a8aaac30b1723b24098fb6771cb23379d98c9c16516bc6d66bd1ea86d5251818968ddc097bbdb5c38a2a6c1d783bb56bb51dc092649a4f34b0ca5800124ea18c1b74741f3bb4ebf90391c58ae779cea9e8004ff837487aab71447fa59b674961cbf1018fd313c53e90bc1b3b50d04745b46859fb891e4b7807ff7c46929211b0194b547a9255106695e25a3d2268af07c0ead72ab58351411c6b9031360371b937532301263766a868f9c2359eaa36e7d643804c48e4c59e7d36140a6cb5adc316babab1eab03fe99365cbb138fe3b3c6986b20deaa7afc1837864b03212ac9b6a6164d083273b0fc525948e349742e19770390d54529fca603cc8669939a3436d831e4d3666d51c1ad0a8031aa8aff30c9c6a0c6ffa51705f8b0b6233c253f5534e96ced5c03f98fc55b3a57cec7692ed295a502391f53b4de1750ed5b70057722dc8743abae7a01239601742846af35d8753326983cac140c60ab52a88aaa73da601b6b84bb38c524d638e3a3aa323d5674bf2ba8ae20bc32511ec4626d51c79d9a796133b4f92588ede04b859c4a3dba723c2241fea5978fa389fb2d9a0db0043a03a92368a2d86ca87bb810421320fb332ac467394a9db6f6744a58df07670d05fa820c7af90973fe875601b7564f5b323934d883b16a7f970bc59cd752a7da6386f3066544abbb6b80b5eeef01eaccb9204731defc57dbdd417dd89cdbfab5552425cd3993f9e044d87537c220c34db556e188726ab1187a1cb1b156168ec4894ee28ae401c992c87b39270c347c37bf8502581f51a1b47ac2bc38565a40d1cf095c5d444e7558a16833e55f96691776ff4d761ace02786f69821c639ba970334b6c773e55870b609e71617a3c693231720aca38e86149c7c651b66897a93a404d6f7324b32675908d0fa646d650126ec89304f1a1b0389a2722b7d602938fb835516546c977630027b0184f329051a77d16b35d263bbc44c548ec849a69bcca5b948e0205c28873fe5ea3f7f1b3562759e0cec4df4b579444c082955cafa652d811294b7950d56ba623cb145ae1acbb0b3c736c570308091bf89004086cce7ea5b0eb750dd60c68229bbc9da04023cba012941a1d28e0780bda636317a0a8905880788b611c43abfa1f5c8b8d0a216f300da0206c423b245d21803b39a4d686a7e03cb409b874db06469080089dc97cd2c5c55f14f066ab9cab92c0cb97601d6c28d143219132c60b6a49fd311700cbff499758d93614952be34cc33a916497b59c0f3cb2f7eca2f17777b9d87ceb86022cbd35dfbd67cd7a4870ac08fce123fe198c9f0474d65e7c5906765759091c15cb099ebce6a208e8977bd31031752f68349a646afaa9f4ba7b5600bc5b688705bb043249560cc17b437b001b35328a7d0476fc858e3878c8cd4c0a6878fdc85a0ba09cda430a2cfc0ca08b72480288d2d905019319c5848b798a86965bc94e8a3acdb132c2de073ad042b4f297a0a1c6b5622b20f0bcf1b3c6e93a08c223a62c09567d8a02740790f97b8436e862c9d342a950024703b7a92081e78e97bbfa0951ef6bfb99cc3fdea33987a0611c0505e159275a8c7859146ea766af0653581b1a33bc80ab53bbadce74c9920018448950a1889d2a2823e440524f2046d6337a6c423b3452b7ae63a18b2b891307c1e0742518b1adf948d6b75334010ce10a7716e66059b7143d0f9a4bd4c71cc57542c214c33286940d445062135e5c3cba4a9aa6d355e531686685cafdb98c244041dbf401c83712b2c614d23c66bf20c63d51018d3ab38aa4b4876c15d8f7467e03c8ffad978437b648cc972c1d796535c2304cb13ac140b95f7878cb59472c370626193075c91a369305b2091ae027ba12157d3d10a3a271727d3710e90cbd9fc7e4ce70454e4275354b359f87ae9179d2e15ca81c076630314c98586def08f05300ff1526d10d1585ebcb9e6876c4db215eb3857f0d0677c51ae0ff1169d2a1872f09dc9468461109c3bba6e188f5a12c776d6e8dfa580dbc582b8877afe751a69b117be2d7da98f91ee072da11aa820e93a7624aab39ecd233c3cbf2450c6c58c82e8447f64b2b50040bcb2cb150ce09f04a2b867682356e033b1811c2ed0dee885674ce196bb5ff3aff6ae +ciphertext: 78c3ec20811d7388fee659f579cb5b4aacd7d217aead43fa1cdbd063d9deaa331cf6222dc834fa8a6ce74c36659206eb558c1a7d533ddc4bc9d6d363a07597f6a6c9102be7209e5cad6b613e70967ba861c5dd8cd419ca9e532aeda76c8ea1c7d9da58c0320a52378d01a48f4141d0fab529d494f86b80b2f1d5b36afb4ad90f25f4290c6854d2d2e44d2d7506101f4a18de268d388789e5f2f89132afbe6ff855e24185ee01d028d4d9ea6b3220764fa7d5b2d9a24433e848c91dd8f1e5496cb88820644359c20ae0be33a0e749700f30f0a484fb18d695883b493255acfbc8a285bf477f8f102212b8613e8cb72b59e6456aab7a6c767a26aa8e8a6c9443b5dade8101e6afec8d7d4eb3bf9f068c68f206277b40bdc7519f719bdcef914e481303bfce7ed672bd84c32080cc83db38ae032c5e4c47d0f9883e511a540b90d254ca6e26efaaa6dde4cb53074dfd568f73d38122959ca47f9a2ee58bf593835c9df43f145f5c9bfce2c44d2047b8fe39bb9aee898d757cdb1a11136f8a558fc15968f181c9f496952bdbc60638c05cc2f159842ec9879d6130a4fe867e49c8c294f4d97130365293fba41d79dcdc6e8d20568294c56cd28a2ce4887b2d7a2ea273b61912be611fe8b9f0029c304d62d2a8b4de6adafd62d50bcc5d497e542e9065dfe03a4e57fde3dafc007446567576bc34b6ebf844ea8ee7e88d5cd79d1c5b76a631d22778818dc15ceedaedccf88ea551705f52444d4a8f4c1cfb3859ae5c4707341fd7723786d9ec4024c7d7b48efa44cac071b40c61b45d0bc707ced0565ecaac81e4bb567684f0974ad727db1b218396e1c2e733acb8ac1fc09cada03dfae5b995b8ffe8b866c8019796d3eba80268b3f1341e2ddd9162a1bde8566d58d39cb7cef1c7b32d28e5da23dcfe39d24ba929eecc8e35620d26acfb625200b1f2cd102eea2f4036256a31a91bc8b237f82b17c7109f87520e709a849b694343ef60358456e69ee3831a8386d3889e963f9a9a39b796b12c0443eb11c53990cb0e113f677a2f97a2305f007c07b682526d7dfffb92c51efc7404c44eef5ef33c7131695a67184e876f4fceb90029a17a543c8dd24618fc0530a32eccf727907b00e7b5e9d86ab96427702c99cdd1fe59f7d7b4c38eda17226646528192077299a71607a823242937015828ddf1006061344d65b2a6b4bef4fe42814ee5b97bbb7044694f2f7c0540b2aafebb13a48249ddb91a0603783c45947de5beba31e6b10d26e231e6a9f50b8307577874bd39d7ff4c3e3c2ce647ec90463a5920f934a6b7c7cca4faf96e54f3f9b9814444ee9dd031704edc5c6e7dced1bca24971dedf55ac2ff16c12037d10bb4f31ea649d134965caf76b13479d4acca397e629e15727eaff7b6a81f06271d94a6c2cfe59227bbd9063faecc9d611f6d8140a55236fbc1eac5dad404bbe7a5f02acc1dd4fdc7dc1a93e0bb6a6548096744e39e3810d7e19245ec38d9cd779842eaea9d676d65522748299029f92f0d5df94d823bfc7 +result: pass +shared_secret: 560ee82de0d28ffdc1644150918fe6261095c4d8a1b15894faeff7f2d46575d6 + +# Random ciphertext +private_key: 9242c1dad172ceb70a1b682a278c97b757646c7b71d7dc2fef2030ceb9b4a0fa7490c85e52f233510240e5db134e6acdbd78786697b80328c827b627370bc4e05ba96155255c3c246f863e7f025623556a77b76f3a82045939a0440b8fd2e7cdf35194aae1587a5177c7252e761675b8ab577445456faa0283818139f40365720271a64fcdc0c529ecc935a7cb56b39f0f2a6a10e12ae853813ad707fca83076782fedf946fcd80e56b7c6faa822c6a02358941517232607fa7b9b6447f2e0b4306a8241138f9548964f8c45e8431f22e7a3a00093cc30b347d29f7b416aecd125d3f42658b15dcd0bcbaa2b311d4585ebe85a3c1721d210232d920c89b43ab009cd1d145e0a1585b35172ec36692fe079c99bc4c61c60809b94f853a312f4b665549bd8551a66a6cbb7f82b60a20de6ec0e6a001f3364530d9c7175fc1a9ee076bb378394d9b361b21dbdd08c02e111a0086bf2d27a9f648cd412a4635781ba42cfea82859cc35dc6673a96c80a7096b670e787890b72ddc77845396c7c2b5773827ccc092a3ae67b08a82598066792785547e6b6cdfb0a32c741bd7a6dcbc990a5039671a7c056c17c1eb817d35962d209a8078c5d01c559cab1b5ca249bcc1704d94585c3a41a7fa12c7843a8ee964507f5a0f384c0ca321a066b84d69a37a7f29bf4527062c8838c493581a3078fd5277f9a448dc822c16428b8375f9382727f91248bfc0323c38feee695302b21ed6347384b0a24483b4b7c470a291757c0362be13b85ba7713caa1de02403e2a1bb5804ac0005d6553ce3d12ac488bacf6cccc77bac4a752bc2bd40e77e473d5e5b01707b89420857fb567c6da067c78bd7ca02f1ac3135244a30a072ab46a523ec614724b37b92397b64207f2c2c750455ade00c0229717638a39ab6b37a6e200114052f13045f4f135a5c5aa4847400392244e360d32779ab83369b6aa09e7f93b06107009738c04361c17d4a7581b997d5a94a4302f6282ca8a2609fad0a0720584ab40160d453566958dbb7925e2250980bb62f21cccd03774ed2979c73abfcfda3d8559b9a786b8a6e82ea4a4b61131659e7324c2f52541d19a6523268e847f101355802a0e5605803ad1b6d68bb5427600ceab91f0487d879cbe89224e8b587d7fcb20045a0c883c7c5bf5ceae27627ab3a8999ccbd84745df55049893bd5dccbb6347abecf7054ef7ae8ca3358729070bc00ed80023171482f8037e5307191e1ca340252e24f586518600a9389e55a140803484c7a6bd9267874d390d7d0c789eba2445db38fb0379b9057e534707a25a510c852e6eca713a922b27869c84a296d87bba8da49ea95ac395c23f8cd2be12cc269c00a79f834c617a5f373baebef6a89af318a5cc552df281431bad0148a5c07a762b52afccdb2ce2d929ac00241ef7b0a676cd717803add24365054a8a13561c3a90a031b737d8178ab371d4a81642728a780aaa0a6ab8d63071c3a71428a11ccdb6194285722b5c6b1353c19b6a12bb977d6e7730e0ba0d4b8c382a4081c9a8556028b6b7c4a6bc21b6ca7b92ab3a20fa0547e3e0aa577654092a5f388995991c52305b8d8313a0a0c4c50e97cc3f9913cf17ab8cf14a78b76ab0e63d6431c58e17c2064346632c5df12ccaffb8ad3f20825488706736bbf725cb1b506b2bf4b33693a93727b6ff60400b3a6f348888dcb99c2326276be43a50887317f0723a93b401fcbeecd1abd0a7c21a296530e368f964165be620fb239c5d077dd4a33462d10123140aaafb26db33545070a9b4468eb104c84bd5c47e84c8f49069656bcddd8c8e70c246a632a699817edb7969f1857b2c678ac292970995c9ae02c184e64cadb1a44f281030412ed2052e024744595acd53eca7f976353820137aba8533dc6a13f916a311cb82a13da02c1ba044228bcc2b5e70bc8914729c4114e506a775746dc2032504173545fb17c55cc233e11c749662a40a42287a5707d3c6dd4227c4f2c66d35c5a1576aeaab7db8f515b8719f1fd4aa86b92a774525d5689d469023579b6ad8c9ae81475acab9212b1c8e548090ccb51d2cf7ab28106adf510a7cb87b3933217f71333d031d90d43ef9c61d53aa513ef3433b6a0aef9432dc665aa1f14123fa5d8065b38fa7cbae271cbc5b2e52d824495aabba4bb5d06ac780c0cac18a6895735e2ad8c3671c79e27c8869fc23092663aa464396639aa224a16cd6cbac5b4a1fc9c1795c44e7715126f7559ed190108617bfd8c6fc839d027676305cc39e760be875cd9ffba1ead1a07d049cbd269d1c172228f2af91f5b8798929d93529f3719082e60326725ef7eba0999a2c45cc6273449e1e50137b371aef04a273babbd9236704fbc073f679576794873b5884aa0a6939c856a2bc0e50b8f9ebcd11bb441b6459708b06dd0a0a29458b1ea56d5a5980695cb4f6db9375b42cea5b710d82aca4b4534e91cf0a860c50d291a8eb1704800e03d503d6c5865ae8a9bfb398a34b22ac85ccfc98c2cde47f4e604e64c27a7842788377645313679c0b5e2244b72c761f83cc078ffbbe32066c79f4001750780780980245077f05c022c52d98d295dfb7a84ecc763ae37525401b6637161124320b56042a044bb1759b0f136a8bbb8dddaac40a1549482a9d6195c38371119de266fe3aa7da810d70e47959f86496ab2879cab92ed41df570c9e18a4bb4dcc73ad296adb72ff0c40b21c691c2a81cfbab2cca2c3062762d52a86f3917873050ab17a57edfba7d52f087eea09527e15a6aea2f8862898a2c6b2bd9642825423fe39cca5616dec9776da423c9945543e595fd55c4f932c649b82988332b1e478cf06c876378a790c433ac340fc37970a2185fa770934e69b00363a00742c6f6b19a7a8652a0bc00a596052caa4c8301c29b8b6104509f8ada238b461fc4995f89f91ea685841ca197d90117df97cacfd511dbf24217b0922f32604548079bc29884994c90961a5ac386cfd6620849a4fcd1b40d766ed37b29c3612db737bf83e780c2376e833b5fcd44ae4aa8242423227de94940f592b1e0451d4c9862bbcd5ea684b7b43cbff15d67e516d9c039c0eb5540aac3176ca029a74a9e925139c76278bba68a4a002d960b05475c1b41bb8dda15123a35dea286bde7a68da4c757423a2d7b6617fb128f5a6a12c24d3e29382daa045de64b06995e9c8002c3b4306d236d4bebc2b304cc93b87e203500ba2b7ef71455d2500666892f1bf7adf6c34bfcf9af4958b7cd180e4948a472d394049b1dbd301e0bbe82834e79557ff67cf5adfb85783abdbe377675ac3b346e7b78a1e5b9a973ac1b2446b7c3123c2476ab3fa0d00163bd9cbbc3bc5fbd9afc31e665d6d4950e89dd8e6a9cbc778255c69f +ciphertext: d1c30ae263bc893b6c0475e3ab25a8d4649cf2bbba7a721745636562b6794a997219d65563534e62f170a093dc52396f85d57f29d2486774fb5cd3bbdb79e09587736aec48ce664c13fc71eb4a0b0d45a94354da57f89ee8294301e6f1e42971347e99c12329a24b73cfbd07ddc629ed87dbb8ae1dd82a696a526e63721cbf3010d5e327a6b4854327e9dcb8528585320a4135bec448901a14b7037da06a7699dbacf03919f776990a847ec127890f2423ae7e86863e90732a40928711f5dcbc38eba531e5b12234fbbcebc6f5181e23463807fc8f7d8677f514aeac12afaf988c68d8afd5917bdb15bfe9303acb804f0d1c126e848aef4351000619bfdc31bf74441116bc9d1ae5771debce8131058aae07ba87c503a07f85e21ca25910d10fc9872b56f8c7d68aaf2c8e525dfbc9c50570c0747af243741d3dab4765587d8c25d393acb2417675d1faf59851bf853d6e6c3a6f789ffff296bcd2001331e8e79143db36b0fd1e4fdcc6d98593e19a69c3caeb71358ed8466ff2294acc9a85df4b81dca83ab0bf508eb6321d294001f95afad4bab0e9bb2c51220864b5f2b5b17db45257a0f89d890703a84f9f4284fb1ad50bbb7b933aeee30d8f872c200dd003d9f48a8ca490501241f964d3c70a544a71dd8871ce438104b80bb3dd3da8e3f0663caeaca97f15c89627da17ffb69a3a16282cb9d99166625a52cd6ad4ad911c81f5086a445b8574daad901d7db029b9efffcf93bbab71fb9a1ec072f67e7628dec0d21102c05e24fa8b9b97a3f64175e55329cdc64cce560e442c836a7e627038a5fa81888919d42f4c4f5ed7132552a21361759274eb2dc866f8de9c325bf4cc4a6fb3c9a4d1ada4a0d1fcc3828f93ea8d54e4dabdfb6b57bfc926466d51ff7471835a474866dc9da441568e8d22bb55c36c494d9ee6c34b908ac4f513623f4ca74e29c9343ea47f73bc5a937621b61f409915219cf3f21e4eb3b437d0e9d7d0e6416a1a2c0828bdbe8a3794f20348c4d72b20a8e3d13044a0500cfe1181a7b5a7ef144906d18a273b7655a13eb822b2063dca8324e7594761a3dbf2555603d25c6686dbdcb0af2747088721e70e18272dbeddfb02384c3326b30c074a78729954378b6b49202f29f6edcbe45e9eb26a8b3295d791423a933ebc310d29e3a8cbbdb0f09cd3dd1e985f798556f4e9d599e6f54c78f54ce8c3d84a0ccbb8ec8ba11c01a8f1569804ed3d009179e1cadba10266465e2c156dac73b8c4170a58505fa484d3470f0ea752829c59fd489d6e0306b1bb1f87f372918f399cbcce15f4ca31f07d2638547be292a1716cc32d2c786277fe6cd859ae46752002e4bd318fe9884387b8a8453f6f54dfab9041e776f9c6cfb4fd71865bdf735cabdc2e474a1188a3bacadfabb4a3f01342679f937de7c7e7438d54ff0dea35a7899a672cc0bbd92f9098fc28804236c0eb9ef98e88263bc4b7bdd2377e9df62667b424c0b791871325885e9d588da86ceff1492fb4a4829a171f2473e2d14b5a861fdb34 +result: pass +shared_secret: a9d1121a137441b98f2d6abc730eec6cf3ac8231bee94c5462ef3cbbc34aafbc + +# Random ciphertext +private_key: eeeb04ae497d88a85333f81fd034b979cc177bbbb50b18259c1a2b09fa80d4fa4be1809e246c4330a7cb3d0337328c64dac306c9f340c65a00cd809f7fa2c8dfc25266cb8e7ffb0e1386a362d1c13e79cb0b1785ff60060f06229fe9122b7495676603bfa631943237f737cc2e88b24226bb72515349db157747b94f6ac0dba4358b3006e17b139e06ca26971f11d3a20e1029dec0c1ca7b0eb81b5e8bd4950fb85df8a363aa09908e710260cb553425747eb8957125be68524e54c54e1a92ccc32378a0f220eb34496ea20f12c30d7f622282668fc570a232c891f55c98ac1077089485e450134eb56dbf9226310113db701344e4b20418105e8b8f07a4443e161b1c6299ee41218da08ef7aa4e2623051f612f65716405d23419276d9d7275a6e3ba2f504009a738b0645d7e5179f6a360335423bb78571cb465ca21043272955086cef4e4944ac9796e69285140405b1639dae15a496a5dadc57984831a6a0919c863b8029bb770567b92c3886711197658214997b991173774a722e8d22710db3932244772307dac08025ea885b159c6e511c4ab6997c0e28a71c76354c7b7cf044024a41416c63abba78525562dd76275bec906109c88db0623f5b1c3310483d7d9c25dfa9a94d55521262eb1e75562813f23d07c3d156f84dc631eb00a72471023f101e76312dd354de22bb600b47d942a8d6ed1cd8c140ae2c966b8d560f6c71f1e57143afa3cd7b17c13db90b0e733f6b01a27917c38096a342cc84c9145b544823d90c2a6c9c9a2402b95232fff63bf47f64b81156ae1b0351694885916ae3c88bba7c8ac42bc55d5b3cd0c9a325818732c663688dc41b2650f23f1169b39402a394ae8d840ff01a96368c0f3b307f53a3745b4cf51c29a9c16c5e44176bcba6e4b946df8d214b55abae3d1514b82062d12c95af8617893426954a359411411385e604baf9bf1b337b1323f5a5795da6f2d0998bc102a56fc4ec560cb004835c7d5372f78a3e6cb4636290876f9ccc002b0ec8c67418aaed1dc3326e2c99e7b998755a6dfe10f6925227bc76e2e866129f3c13ff4a42f1671dbc37213fa6aa7335a8996619a08a6211c60b599091ff67fe657307c55058a7a7f0226a1154a3964f449f08268bc6721bb720a5d6236fbd717b101790182814c61757c478f384b3ffa9342e9c103af724cd9189fc041956dc44004252a0b23a4bdb61124d52f952832f57aa7fb46bdf4c26203737f920383089c69eab27d68524b230079ccb21e3f4b2f58627c083299433a529cd7203f09a26e9b9299a1c9378b6db019898c946e414ccfe1b6b1761094a31a3701fa359153554177a76c29cae59c71cb601ab0c9a8a25674ebe34feaabcfec37c71e42c39a8753ef406a02274174e24794b08652931591ebac4cf20c3f8878d2f0c8ece73082e2615f918e718604cc55609be6149a576f79d451416302ccb64b27eb577964199ac298de0314faa87e2925a94ceb3dd144abcba086ebb90ca37b0cad5bc14ad66b40369e10e6823f5c1023a02ea2a77480009cb1336a09d313ff207b45bc2630d2c6f4b5c5e6867d54b2b957ab978a220370c88d91a2b7498a9ca6f48d9f932233645c5dd884b01408d599c31c515804e6c063fb198fd58f456ab026a7a24c121e4bd0cdcac44ff7b2c7e1bca187d874fbcb50d3753c310a1b6a78200afb0e8ef339a15559d0f21a091a2352c19f1db74dcc15cbad161dd7e75acdd05a866c63bea03537db36233c30e0bc0dfff845e8f19a2233c1ab7301e96c00889b0e35078c7134c351a05c86f8b03a9484eef962bd91c8684356aae768076751da83bcd5e640002ab7dbd3727de90de674b3a9cb3046353aa8a9b3081a6796b433e4476739e9c5cb9bbc59718368ec59469c794b83b76c5542c0537605233245ab1ebf730ac0a2c8aba65cba69babbd8a84a5a9ceb50ae68410bdc29a450e1a4ef5a2cb948805cbb1382a1649f53585ca1cca64a8df443b2dba15dcfa79ea37461d06319f0e877e404b09f27bd07ca8d374c15d0f06351f40fb638cd96c4089d2608ded21765fa3462f80320758f130822292550c76b187c872b974547f47456fb43b065753666e34d537c1b337897420773450115c2c82eb3d7421a29ac56f5a2344b7070ac358eb98d1d9474a5d869a93b301c1b2e104c0ce8a09932868dc8398eca8525303b50aeab60aff32d033267c1f09017949d312c62d2d351e2a96f8286182b2382dab82719763dfcea86a4389d944ab71f2173eb7ccb24c322be691215d31e6a287e7e73764d841272760cc6599fb4e926eff77c7e2267f2438940ec2e52396e4e0178d88397668c43a395b32da812b165757e93ba4050acb9a197588b50bd6656af514386c88be69310f2659c83304d0e7ca6cb866ab6055b7b95af16829cc8d63bb0c10ef1a352767cc722c06a32706efc4aa0fc467512120e382b4da930367fb705dc9a63a10392edf814cd2c9c1f497483c9164ce14ce9687fd4c28b9be7189359969647787da9a4c375b0e8eb704b25a5098c8690e6243280174dc35d9869c019138afff93ce4359aafc8bb7e4c5de6f66d0da0369ef56850d2c93a1c06402a5d6221ae8819a2c928672ba34d16baaf2584219a27ad8e64b553e046e6d94b907c3cde96760369b01e9658df423d852801538745eaa17829388c05202e4de9ac53386fd3a5a765ea835c8497565571fef02f6f05838d882694c9403a700891cbca8de70479aa7cc3b138b53a80a61624bb8b5804bb665464acce866ffe5190c8eb61c14bca03703c1e13cf646b9749a3ad350c91aab64e42e2b12b64155df44a6ce7515ba191d696a0f2a82beda645a9ebafd01c5bcb23934e7abe4cc5710a10c7c6030213a43a174076c7d5b83b047256076808065d41e07de01cc748478e4b9722f630a4c76565142c4274a6aba6112c360b0919a6caffb6905a3a3692dcc64b5c3b61c45cfb004f07b115d3064cfe90cf49f10564173738d88d73010adbe02db0fbaf2c101fc7542311ab3b23193dbaf612b6064e7c41729a6981d1d56d806a07c9f500627961b053491f67b12fb9381d1bcd6fc152354b9a3b4774b4d144c0979daaa45fd4e963d6f362150a5a57c68d360b8fa7f658f779572421160ceab442c06e667b88a5b25dee5b0cbd9352ec0157ba255bb2386fe2282dc757b0bf9008337a51cc9054753ccee7d2adbf3691487874e247b169c4a38f268ff5151bbadc242584c19e5918a975d8e380b1c31e84468b6b9559fe642574284c44420466a11063f97ad118080033f37f6a3ec5c577390f684faeee9f458c960d65c09b34b05c409d461b032b69edb4159adfc163e9e34e9eed04221f62dcad381aa78eab653f6a9afc +ciphertext: 88d74278dbc5a94b5d37fb5a172029902f48b84ed6eea29d26e2094d5553790afb59d992cefae6532d5f224c96dae06a9e39641260fe6d9682a74ba9ac11ea1721eb79f7345adda7d1f2f5b12b69a0db708bfdfeaee55613a7dfe67ff8099d9677bb633a9ddff300dae09fd8b9f722c2fdbcccdd163b549ac2e52bb8569935cb030d0e032a7a2b59e9d518892bda8e9f4b569f8892d02a32a547311ac32c5ce16467e11b1cdd25ae274c734dfd84836146e7755dd0de590daf446213ed7da37358f1a49964fbb65d5b512b9bcd2be2fd24e4ff9263971962776c3eaa8b7a5af83a5291a7e19d8ca0fb7516f4e5bae5b064678f839e29f8f85ffc3e16245d8f7a117f7b32b20825f8efc5778232cc1be8702d56ce61d5e3a54f7aac7f25fdebf5fe7c953e03f103c6fc9563a5414b321e0fe4f739d7bb9c51177766dc89ab66215e1526b35eda38b91da4ee26b2d6d2935d912267df162176028dfa448a748b66299393f5bcee9ecbaff19bd40f8e2bd07c8de938d8d1f1ffbedab2a4bf8f9cadef421ee7ae07d0c60d89ea81f18e1c8c36a6adc473b1b9684f325832a2b5e067a9f275d2881a3d569a8c9ff5a41ba2109f03174a8e28f0c4396647b69fd3547d345e3dff677a56f7e9fc1facfa393f0138133f9b173d571cc43ba3174ae4f7ab52a3437ae127be2a352e99a6a176fff9d60ee2683b5e7be29d4043da6d139d879ca57e903d0ebb59e2fccc1059a10e583a2c3e2d549aa940c8f586b7b4b33f575e133f5d01941bb138ebcd8e5bb1772804818ab602b7bfe50ec5439ec3249ea21636f6b3db85dd17879f8102fa072537a8913bed1e11655dbdc88a49cc95454b7792fd3b51aa2fc361ab6efe6b3f146cdd476300cfc0dd44deed24d89464b6fe3ecd3beb341aa45ffe1612034b2907ba2865ed681251e87bd14e46ddfbf59e822dae952de16da4812c083c14ca6998fe7d46827d73bdde6e79fcaafc83bb0f3f168bb36559e6ac3ea6c8ea1381c180805b6ec6658f822518b380c7c8eb7ba961f35ee8cc7133eceb952d6d48e0c58f7be6e5ec78297865f09653ab1a2af694334ac2a9da3a1131a6bab197d72b3e1acd1c7082d61e643696ff56dbca20c3dfacdcded9d0dca5535188080b85135fd2d4ceabeab2e3d81413949ac4385eee258f54e12a5691532b8f860070952a7df55cf5d84fe7baf9f13a488bd32fa8754f7851cffe67252f89bd164c38aa6cb5c48a68bcb3b350a01f29dd8d3d7429bb774cc42868c6b835f1cd09fb9fb5719180b662adcb9d44ca2c2032338e38228de0c429c1d92ffd745b0cb1502a3af031ce1793b76125a2c97fd14857dc4bb6f214e99e2ad9b6c505e2c120af5ae41f3490698dd3b6a454033e121821331045c92059ccb2beffb0c8f48c9c7909431488d20e6dd83275e7dd05a65ee2e651c119bc16b2d29394f12ce4b65ffbc94a8dfa2f3868fdfeb6a88cc9c6ba68ab40ea58dec5c94bf6d57f15dd7bb79d39f62d969a3313ae5adc4a4510ed56bf9b58a229dd77 +result: pass +shared_secret: ddcbf4a8e934a4eb0941d6e3032d16c60a551a285e9a4782dd34daa156837f2c + +# Random ciphertext +private_key: 4a0bb822b4ba67065c985ca54e4628932728dab6793487926a3a537d98aac5cb368fb9838ec7c83e3979000a3042d406b2d27a12eaafaff883022324b21932241002eac470ad5c3931a2afbf00b3ca56a78939c90a27a5e6b95a08895e5156be16e78ba34283f643418b475f7ec8c99245281833ad398079007929766a934748ba9707859b750fb8b5bbc5e50984f48f4a73532a8914a3aa6fbbf217ba7773fba3888f3a3902537d4e416ca8ab9002a991eeb48c98358697c9be83272ad3714c12f3360df35608016689929180a40e0d5125335b5fce7abc017c0fc7fa6bb48916ec8788e9199d1190b665221ba9bb559c3b8fe5e1487c8151f829ade2b1821336b0a329699069536f054076359aab624bab0b43f486aec6c54fd9babe38f2babe38ab68d4ce967ca372d61095fcb7e50a3f6d1cc24e9357589764c50888fcb56a32930fa154acf8104292f821bdbc8efed06447c80bfdd426c484b7f2389477723dbbb234f089bc95cc4df9b1c4c020518f5ac0f377831f2a4a368c73fe67c21bc10094401821e18cf2cbce5330bf9b39399facc794f54687a880e21ccbfb79a6b4d5a337590fe3d13701c77b77cb449d2b53da65b25c082b8ba9b61174ae7b64b5e6f4bf6072b653f4ac8eda0087ca57d7f6a523a0ccee34be3932a3caec12bd69be32b87ac0ab413b367703331b552405c98c599f267ffb3731aa8a42ea4c9156003160780ac2ca0169ba28a9d1850fb1c02ff79a9fe80e84c71a856a8b6a56b35aca6633f84e321c3b232c3f156252db93bfaa3284fed302c565b1c0e08f2e37bb68d8bc8718cb05921321a547c0511bd2d9823c88827ba42f50922739a69dcb10683c3a357ec87243fc93dd1b0811982e0f2a33ce948982924782823eb1d8127cf258b6053289897be3807bb6cb357feace6213b9f547c737ba71eb8382587341567aa1e38082ec375e1029cca9a7a23d2b797946ad761b27ec374fc6eb7c9523333254b86c3b8da7a2cc82056a80c02491831f0ab3a55e77118541497b7151b77405fec5057ee9afe3254c7be37e0c153b6f66b32b67a2977292bfa81af46718e00566520981479038bc95004ef317ddb1192da9061aa0aa39a30498a2be4662968c558bc664729ff99c1b716241f43eb85902c7e45312128e070029d91532c5c321614b9485b21437329e13bbbb305b39ac4b3b60228b66614a8c725d56887de7ec0e4be155ec2907c9857a6f942e48b29a9ea3b6e83049dbc9b36a9b50b82901c65ba47ae9790174b9af087e8d1042ead17f34a7408cc68d8c1464eccb69c4d105f79c8fd7e26863527290fa9f0a686451721f9b59496e181ac8a42b4d4b132ee2c6fa217705a8b200d554aa374cf4d930d57127b44a381e6996e9451c10c95d34c17ec504be64a5353b764c465c939b865f15c25d53324c8d6bbeb5590d6e86896d58a4d11c9508550ef1298bb5149be5d94bbc13ad4fa1c39b20324c37a54de5225d5324e99a2e28f747a1985737c763e70b94201184d6b375ee672676c57eb10accc254049fc2c696fb9212443ab6080cd763b32db9b4441860c2b10324352106476ddabca56968448a723f5b25bc8f81968b00472f2c67ed306df69b16c4dc0ede9895bd5824881815bca9588a3b4dca0c8cb4d29e20ea353c714f490a97f45aaf9188a00b95149e2b078fd81c4a7c92fc845f7b09a41cc48e950b10b5314870069d64f2889725a5bb4740207b6bb31c23e2379c5e5a9e2ee1ba50772a41cc5496e7b45810634917a14e040716000735ea3f58b2c21c546f1dc4affbac5bf46042d26a9ae2db55aef3ac7600911ae3a2ad2488bd26a2b3066699895a8f773022a950b24cb55d972452e3521c6305e6eb8b4eba1a37c1cdc9d5c9e53021e32356a71a506e9097152abae7615528fc8a28e6332eeb451c7bb04efc860e456ade42c6e26c607e981b21080cad07acbc1a9b6acc9b30fbc3b1c518c969340dbbb1ce464842304fcc7c874c3c1846e532ee4ac9e4492fd36a6f78626f2b5bbd9d40714915a4be0c5d844c6eb61c4c2fe47237f437ad1b2cd9fb00cc836aca216a0978a8ee83bb96994aaa3569d0c0730403358f710b9c61794a86676e9a39777873c98957c5b232b83490d029a7e1dbcdf8c954fee577eb6a3da0204e78d400e60809578a193e5832b466c360000aa7fc40ba32aa25d496e5d6a6c88698e8968aeb63a589947d30d3c3c3e1391188337cdb9224f92325e594af1455d36636c1507e3f93c9ae3780c671a9e30b49abe49497095c34c7a0c1b15fee4c222f44927b23a5bd193aad012cdef19e6db803e0445b99127b9779a369d52618fab558339e19ec61b31422afa50b34d8a9100a169c359a22485d8d08b5ef924c3b9472e6dcc375d04a9f793d5b7ccc63198d871ba87845aa823c05a281b5e543160743cf57b890c9c22afff996b1108b124c263a5b321b7b25503878369b54c5f93ce95627e9c8a0a971bed2b158e7257420f55a5c48b8d2670735f50303eb2e1e0a0b2e0174932596ac7194a82332585b443b828cbd2a9479e459ee693a5d60247cfc26ff899d936bafafe8b80ad4be46a99f34626bc247491acc6edd6291f13b1939531cb4166a5a3228f08091378959e3845dd489446d16a967693556c31909276d3d3945fdd0522775c55419b3ab4621bf880f8156399a2c98c2710bccd83263944477a149ec7918f5ac9671245144903bae23053c527a8fbb3cc0aa1834ac5fee6cc91cec48b1b8270934965237aa670c46d1e194a2f638545100ea59b0d5b75629f53f0084bc2c635a78061791d687e228631459ccd543ad442a6c190c34c1385abaf471262bc6a1a0839d8367a4b1876be7349514162cfb5109767a1d073c16c00881ab0aee398aa752049b49a85539220cf5743458cc2f9336a771604f07c4bab42f0bc19d55e70c72c217e8fa1fd70498de4921e06432097bbb40d75bd8f71e6a71134ef9128c65be3757164955c65bbb55ced02874aa4630d365bcf424b585225d3bc422f917e26a30474b5062513175f65c682c502be257dcb1190ac7428c778d71e442e30047a07c2493185b7962ac2ae91ed4da280a46342fe6685da45d93b55168bc2970598e07ecac7af871df893f05470d5e8794523317f7857118ba9651dc69acac973b843aad67373a1311c12b434085a4f21b4b3483aece987a1fd06fdda727e354315e713bf804baf5250ff398476472ce57ebbae9bc256231789053fa9e796acc28e310858ab4e177b2a9352fd78c5574a2ca5691cc0dc328ba45efa77127a819800465f5b12b5f3db23b8d6b56858f00af1fcc3eed3073ed97a2d5c30d0b2df6abcec95bb27e2336fdfceaea5522bf1cc5804ea06903 +ciphertext: a3332a7d121e4fe145c2788bd6199c27c4ade8d0705795a0a0d8c7fb392940599d936addba522349f4e07a451075d88362211cc692ab4e7af11294ebe881ceb263667bb291b5d3d419424daccc5d275bd2d10c7a2f8f22ef0c117cd12741fb3dfc8449d877def1f9988d486d21a084c60faf2402ea80f2e03c85e58ea23b0f0b700b8f3ecb3e43373b6e307391a0af9bb81b2e351d1dbc3715931f094d00b64bc1683501cfbef95de190023f0150c543e91184597b57c1a228418eb7a185558719ef1527d9b8bfef2684037f18fa987ba982ef99f135b827971639b4ce4cf0c5f2bf031a687590a29201fa3382668be4ccd3b807fbffe54e01176faf7d92163d1cf058d56e84e8890a6b9d1bb7ea5be4428a84bb41f5f481cdfe533046f04d6e83f5b9fe9b0a383e9dbafd34aa8acf1b6e66edc6d062a0cf0de5dc16dd5597e87d8fe84cfe182a1218a554acb449d3aebefe41c7d7827402b5e66a6572735bf21b1cb3d1c01f51c2b07dac5fc024e6ea9c690ecb66eca01e65ad4947b69155f7bb297058363c5f6cd093564a240500bf5f7d2579a3c7f4d9c97325fd10e2842056a4e246a30cc2d5f0c5b95904550eb81d9ea56dad663a766a79685a7cb64e4b784bc37bd123ef66ba43ed61a9456a0a4177c0e1e4112181caf2903d6b57575c34f5df89232204edf02268168b44f0c2acd435f7ba45cf2113c3fbc0303541b1c7554f1b68a01436becab80e86e88493f658755ef88e0db8c2d7379ead05de98aa787af70614b95b660ae28f53ebd12f582d1ae367d7570fa9777bf3d05aba1b7b75abf863ea0a5ca91d42bb4d282b213666c87630ff4a9615b35388d7a6f507cb4f1fa8a30d98eeb08843d7628864da17ac38e42eb9adb9045a2061173cdb246a5a55f019dd1bd5ec8c4357ed2e45dad105b6afa74580d5bbcb9151153ce50d7ecd0bfd88d22a57c373e6246dd665d7d8a917730970308fe7d8cae9a63e03ccec6696d59fed80e2ba99dfe417fef7fe2261caae76c5db20392fe3add53102787a06ea9a851f595be131654d08bd011726070074058f2e04b282a85f006f935576c9b1b6c1609bba178269bc8c6d4caeb45df28e827ec75f3dfd09348e3b92141c2f6384336c16497bea7e8694170e57b0ed67a0dae1b869f9361ca50b946eefd4e5503bb93d5c4eefe0e911f7fe19f8a68ac2efa942a1712609dff5bdd04d202ce423214d61f75dec6d3d86372c0b4ea1572b8225b5eb16ac070254b94dc6108f52bbae81a239a521587a9f15ba38c5207dee5ec0ec28666b0578dc514bd57d50534ce43b92814c4025b9f6105a05da50385f20b0f313990edf80ff3fb4cd97c1d5da137851fba5cd1d846ba384a7b36efee3f95d195761deb8f43b4715d99e37e88efa1c4f1b75f1d3ad2bd508809eb2dfe127e977fd378b83c90a2182764cff83be78263bcecd78ea3cbba374855339d917db298cd747452ed3394367e255f53a4cf4e9c4c2838a1483b980bd613f3c0687c01db555ce991cb14cc42af550 +result: pass +shared_secret: 54893c7f77cf00610344e4abdd8300f1598ae8efd2c55d8b038ccd8116b61962 + +# Random ciphertext +private_key: 692c09d0a98cb5186349e8aa1c470fa782773643090515513e7b4f7312b5e7d44269828353c35f867136186b175bf5060b2b2e6ec89ce6637fcab899fad22dd132ae5f994063b815e4c44fd98baccc5c1906ec42164248b4ba3d522627d72474cb855c16731f0d73c82bb7c72e46086bf58926531ba3f04d1e656900b1ac5cab320f7188a7eb25d0143f83d55d63db9394451ff1b02358d74f49e479b602828b673f1ed208c2d357238519d0f8784f9474abb9341a212bddd69bde0c4d1c7a8672e33f8a753b1ba464c5601c313239c6096e361b0336720762177e792837110a9a18b7a4b3545a7d7753a324cc9b08a6ac1b2abc831c62a0c5a65957286c598cf73d1b409aa1342b043bbab8b85ac7c849847521663ba60f8a9ef383cbd8237a4f84af8288630db82351f298e6455345640346827f8d1258b4684fbd70810e18bc7e9902771c3aa3e8ba4cc3ba2c03c62d6aadfaaac83ad9773688453d19b703d49de5407ebed71dfa4a33bd2b963e7313f2f6541c3b0cde665590726000a2944ec49259a3ba09ec63ae22a2146b32dc829e065b8692ea682102c8f4635383c6355449280949757e688fd8c6cff614b6d2c34681b60716b156c9a90d2c64765596751d1447b9abc0604b17b170708ab563cf78475a035a145740f0f20da96bb9a4ab2dcc99a249f780ecf6bdbb4667fc0bcc8301c3a7c940beec573efcc601d1181ce0022aec8c9e69ce79e3569acc00afd5ab94e99bd7379f041274916683f24ab27c143895734f5642aeeb10ab6708c5f1550302390c45637b03ba7813db84ec5a6c1c770f02197111eb30710ac9a59736da514a42db88ff4722da137594285c48c97ea515cbf46957a17930ea27bb20c73b6c29203e4873542a29e284b0bf3c313b6165bc44c093b456375b73f68b19f998602796ab2f6b91554a396b9a891f36942c910663c23fead8b3e4326cb3b218a01c7dbb5833817020945a775d244ce606a3c0d328ee79922912699ed32e2070cf2db097d406653b614af375c2b55715edc5477a36346603b4b59a705fd384db7a1a9cbb2d97f45df99208932a841eca36842466eb53c29ae841bef88051e50f98760bcf034c6f551da9c2bd9b98460e171d5975c421d91a05119032f65269d1b02596816b1018c9274eb9a9a844407699bc52ef3c2ea5b8b0fd062e91e1168e29389340c1c300af2a0067684a4a41a62386e9033533173d1c79d3a7c6f9f0ccf1d57ac021305de28acfa10b7937683bc05025a942e8b33dcfb65771e919a882456ce78ac63193e0a897e8da9f20335e135472ef66c3ca6766729777732445edaac10231368cfa9a3962a4f577c73d901cda54b39ce12cb0a321662b3a88d2c200d181cb0c2f22fab71da087bfd065809cb08dc297aa166da80c0a79d08565f32d843009dea19cb9e89ac588aa51a704203565d0c279dae29dce44b703b544b9a7bf4cb2946b9903d610a4b318883c7c2c8ea169031974fb65bfb567154678adb6690a7f294202c27ead49bb9dd155be57457204115f8c3f87fb87c6c4a773e52502497b87673e6a2287b3a48e6076575013023bc464f2708f3c4c23964a3d408a2010f71f98606316730a3a1a811eec6f13340fb240b9f4bb2f1128588219485931c77eb37fff100d38faa1bae12ab6a096428b65fee02227766ccfe346089b0e8a674e7c50116525bc5cb402fb691984135da52b3a2f697477fb0db481a41487c574791f7cbb2c8c896d25a05b88a71c3706cbde203989278db9230d38071ad632ca2609a01f2298e1526b2e163b4b3c576c55a7e61cbb7f933aa8c52286865b1ab9816b023ba8c70394d70f98429afbb16a1fb961642ca2ff692951538f16f44bfeeabb0be3c5e1142e3c3772f3192b28c5ce9c65764d13053bc4014f0b3d6e953337dc883f9c13f0897f78a0a4e31c8b075a34066bcea056bad2a1156397ba8f53b4b1a69963bc3c0b14c329384141f44396b91c8e146eff13717bc032669706054ba00597bf3c35a3db114992fb2e9ed81a9eb5a8526a91e79cc077969baf05cda19933100104a2c9aa0da897e7911675f24e353b4b64e261a2882536f3be9d95615787142de2cc4694b2d240b4ec582509a26b31840a803c20c3607cfb2c505231a10ce2a1c830a285627a077b9b222809a5436fbca63b15334e35dc0eb347c26b165f869b1266bc9c0c3c02e147287ca523b8819b26797e50a8ce4d6ac5927c18bf2884f5362e3636cdb7128d06fc0884e4a329a18d4a1c10a9c8bb7285399d490210228f5f662f9e5a2401151c3980bf09b67fa5587975613d314354c810c8871ca22a703469d94f1b9516f5e03acf015d65e01e749ca989dc9168b1868378ca24133c44b5ccf43bc0557c5e2a2266eed7628f093d8ba2578421266e0cbba665a9a26ac0fa7164a7b33b3a262d43b9993e773284fa4dd793c8e3c0b8c7949992a89bb28084cefcc6bd5cbef74876b580b750e18554acaed8555ea49c347d779fea8696dfa801991773ee0b26b5408de45c76db12b4c4939bebb074490a2f9cf209304195cfaa815a128a53cbc6bbc02174d52479f36a77624f63331c601c9162697c34fc654fc02b8ee894b370914bd5bd037a23c17bae5a5980e4aac8cd323b217b80ad6a265e0bb08fa22754a7b8bf663a08cb88edfa23b866bb38712d370902e7e91254b6ba64e47587689bef9a9facf60d054a4460e9696097710cd51444b1713b380a79323b6a74a90c33b5c3c42a57e213ab5aad68672a6740c3db9b80facc58af547ad785bf10512a6604170c0778c2250b9901131b74694c5b67a6fc14c3f43e39e94b953b2981f753bd5a42687146e6c7789601621cc3b7458ab07db728e529751625cf23db74691882e8d3156a33ab4fbc6ce15910b9c86557c3bd11b1929bd51b368341c494762ef35c34d040d38415bd6185d3509df5b094020ac1df80b5a31334bad7ce4ba66ee331182642acbcd45137843943a35e1f73b8d6233d70f3bdb07c57d49511cb4a11d763271e69a73742cf3b7b71625b4010dc23309606e1e3bd3280125fb84d541711988b22792ab6ea2c165c53255546c65350cfaeb744336621d91a91b7b4a432905aff9150bdf6b910a96c69f6c1774c677cd5a1b3161256c91686d79029554909103671f29c8a2a4e666c516243b970e34654e4a6f2c08347d17f4f5cc8e856c69419c82c695239359d0fdb0684470df9267862520813c99ded3117f4f26df33e2166018e205d32e12ba152cb0c56ff6bc70cfa5b691f76752dc3f0f1e38bbcabf1df7f402b8779a280c6ff6d6c03afc5240894a6ed28cf78e3ee8e3f60f939b11ddcd2dacf4d7863869d9625f7cb6b5ae2b782a988a0245044b29b +ciphertext: 8f3c3c0bd7ab261fe7816a9e37c7132fe93864a447226c84d69d8f5e6823f60679d2beaaf8db5c9b4564882a4b696441c5abfb3e9c84c177363e203dfa1d9bdad52748d97813c5e4ef7e62619b005a5934962210d88009b0678f1b8662ad7dfcb10400a93406cc809ea06810c21d58f0282ccd099b616f846bf7c093972e84403c90868fa13ada9f7fec375e464367ac59f7ee6bd971f6eda3aa1a8780aa22364acc453e9a0c60f22640d7db10119f87c4a20e04697b6681196e9475134224d6ebf7cccf87f72c721acaab099c66f4c0ab6669f1d1c74e31f6e5ce13ecfe006684a7b670fe9dea8eab1016252a96f50a20540895c6d0d1c869466b62c35ed4b6e5659dfcbd0da8db530518bd89ba1eec19b01073e7f51ca548b888a586e7100cbc6a8e436aa94a6dabaed9d889093c56b7c89d80233eedc8127facbd91e3b517a8c8dc1cc20bfe23773ade950a79b053df9e1e25765b06cff75ac4562748d55161c5425ac5c8ff824d4b6331cb729bad065f30d9be54fb69e8b01fe712f041d156946accb855a01af8465247240b102d1e50540f744a266bb35245ff6ca3f72183f4df551efb148cd717b1446b01ab774eeed39ae847b8d61c04538f452f54de89138bed8f553eb781630ceb5f80338b9af3d1919f5742907062caf83ea89973262b41825b0fce41b6ad6cbebcc17839a6ed1cd671502072524d409aaf6d149c71ceea7980fe65a568163dcabf38a9facb26abaf2e712429bd463c7d4d25410ec4a59213db4017e9c19ffe993cf08f797d20ccfb1d9351c1ec24b06277e3055f89fe5c5044f16a046222d3484e34a03410542ec15a0eb73a86fa25b9d36a239d0fb03e8646aa60a435cad13f806f7c806094da905acf7c2150da4d462429a11e2f4cbd63994614ff7d292936e74ff3a1d936aef30b133969dbbb9430918361ac3ccc52347d4b6a5c963011134b6985d2a542df1aa59c789beed11c036a1df3e94ceb4417f521689e339ee341d79945b20a4e3dda4d34dad8608ed4cb5fff2e33cccb698a18b743cc29d8300a93a709b0b88abdcfe335f92de475c0e477e2f4fb3e75407d8922790bca55e517550861a7e63bdffa31f96157836019cfaead37d9675a71c742a32951526fa01ae9ffdeeda1537faeca534bf9ad0d3f2968d1d4a017addddc7ae547ee7d9b2d9d05980ceb1171fe3bc5c26895e4c5805743e05f52710798de8a7e9846139dd0d56d3762029e9b8fb2b4dd3e9b8a33b77118b79ad5a2c2d665e10dce38c2de2695fb54cb84027c2178881bffc1a12eae5506baf6ace611764fbe9647c752a8653fae47fe31d36870754921c66d2bc2f8f919ba727be30bd2ceedb541d412fd211b926bad736d0640f9f8a8c111a1ceb26976d5cf92fce56242834a1a999498f1f17cf96736d21dbefe9528951dda9631566b5696a846c0fa9757992072aa401cefa7127d189303519a10218f62d62e79099a9e4efcf032e496b41f2e6031a011a68c9720ee1b6b3edfef1d5567afcfb65e7b9c6649 +result: pass +shared_secret: b794ab6a6b7844d506eb46737dc78c260b475d8a18cb8156ccf5c883eed5dc9f + +# Random ciphertext +private_key: 4b3c0d878500059c78c4d84511f75a2b08cfca15b50f7987f2041d8e32813476906602bc2617c27f0b2d80222eb81bab471522d25297ba3b5701f0a194c235bea804d3d42d158306ed005e7125ab43eb5da7912d8351cca0147c9ef608408bc975962bddb771afda1bc3f7c89f96c16b563481d822dd9366c89141e1f18e86072ad2665dcb14366ffc3eb6eb7560d578de0a531d5574be436a12a79f920c12078059191aaebde713a5aa497c5a487d19aeff2170f214241a665cfd1811a5cb183df1cfb0e6187499b0f6937303a9a1ee049da180a16d6103d7747f79d5758f7495342403c34737c190321259380a0c76b6040a477946dbc30993e4685c72593a0213678b3fb6405bc6d525cbbc4924145f7997572993bf01567e38b418599a06c669abc093982b25c0e9f57e4c5670da618006bc522d26600f99108ce87a90a95c536a0de3b45b96612772695b0e48c6b2156c1a35a86ac787f1c76d44280a0d521ab3d522ffcc6fe796c037831d7119cf6f6c16acc696f424aeeea34090b589aa8038f6316736a51e231c874d7ca8bdba75c8923e84d47da8acb1a21aa28a618425d311d707896794413abc4220d61b13523c678a56d02a4123522a344431fda295303c1da13365d91bb05307c063323c04917bc55122d63b4c6ea122f51935f592597ef26508dc5b3c360727eb520793c61f927ef2669d40c0153d437c13b782c29763c63189b9613d70f09665a2591ac885a23367fd2050479a77e2c7ac6e8086b6e84665d35c419b82ba2491059026d70b0bdc518795799f5e69c23165ba53450e8583901cc78e23c67e2b0c851e2023e787bc5bfc10de8a6689a18662d9549dacc0814931eb7612b92450630856c66b4b3589857055467d3317a720a80125c6465b878e7966db0ac5c7b15f315c6e8fbacba1982b275c0ed7f23ba67a6982807ce1e978075659d299b78f057a588942779b7b9f942cec8b41e5bb3d5222050d119665a68c95ba15f7c10b4ea53a07f859afab08a880bf59fa67d050b5e343b3bc68295d146b81617bd038160f3ac092e036a687b6b2583389480469eabd3227a57c2b0c2ea76e8019ba4dcc36a2446c28e65c18dc72427aa81bab5bb710439a4a05e629bc2ee94644a6837bb7a3b1780600687da0a33670a2c41035b25ad9be286063c19182e40524d253bccd4b21b8a18b24cb41d484c48ae09025013bb0551db253abf22218ae629894eb35b966a8b1237447f663ef8b421535cd70e0979b193e867a9066d75cfc142574f81f45239f350b1e1abb8b25c3bfe6ec9c6cc8a7bd31ca9c26704d370e16f46b02e3c03021c0d16916ce66cefbc7c8bb39ce0ad89825234483c0009091876efaa0556486df9ba97b5521f441ba8b6a0c9a2284107b7729c1a28e99617f81ce40d493ea021ddb7c45522242cbcc684029a1cdf405a1533527fa8502011c62d03aa0c79afb821a4fd2aca877736c29c1d5b67141a71982bc84bc85a1bb742a2338bc17bb1ccb7784134c8c7149bfe50072de0027a85c10af184a00869a14588fd9744fae66b881465a72f518f6d648c29b50f523690bcb45cf8822231b76cd9451a31583f0b024c852211f059b099581edb31b6c0911018715c570182f237096539376bb24000b43e0529001c677a8252a702099db983a13a66153c007e63c8686a333a3404dea49a645119a4de6c9bb8b5693916d80cb0aae165cc8159ef4208224725610caad928526f4d85d279009ad3c0933f1ad64c34356fc7ddbbba63b95088f6c610360a2b5315f6a307e16a2b3694b4f658acf39f9cbef92c8b490b8645cb7d4a2bf2f5b6397a0c4932385c9b404d8c259b7b26e5d80687b2a5ce2a8b3eec3c798c023cfd8c384c31c4a39605b8c0340694911543a4608ce66cb2dbcf8bd11873228a595263c8e36861c21b31faba34fe7784e5cc77eb5478e8c867cba8181f71089234b6a2fe8a6e89333d6e5c09b30151c6209494767d0e423dcb56f0069035da890c94cb1eb948f52a74f18878eb7f4463e03245ce33f4615c7ca6c37c464c2eea4380d4b768902c3e1d732778319b21a381a28880b3b3aac157598e6b5f51bc0d04705e9451aaec18f695cc830eb1cbdc1626cc0795f019b715657f68b7a429abd58992b65d58463b8c959a7336a21526a889188254789f683e2470db810b8a537aba1f82de957962187aff87404acec6a889846e5d4b2b332ab829792d2f7142717a45282b117666ccfac721555a34b889d958a678650cab8824121f647d120775e49c78d6baf9c345ab721345990050398322f17003df915cd03ae93a572b53989052cc738f7676e19734adb08b58399e3246198cb799cfc2ddbe19b2c8368a3c42c33f415ab20b0c82801b2a8063147370634be1e40ba63fb29d7f6a63b97103e6bc65379a12a49a12366adec360e507a04c07c2506dc0e404cb1c6ec3208cca9a4fcbfbdf3c1910c7f96e3a22731b3708540769cb153cca17b19bd8b24a0ee475ab3f9065c9038b56450b9e70a0604a046abb0c0993eb8647388a515bf4367b7780a554a4bdef7afc1a334163b0e71db09d4b125f7d4000f1cb421d60882a682e59b0d4f4849bc627b70088980d3ca2e5b850208c77cda3e399c85c43486828b1b4db1cdb34658c8d727286341b9aa61b5a12352cbc0f707bced52846858b09bf527014a3a059b19fce1382147608b5cca2c091a7c12b576032746123ea55bc4dc97ae7cda6c97054cb8107be6bb7e28518fd4f31ce2d1a93b421e58b4328675a5995696fe4a58e5c839bb8caa54139b4883c379d11443343af24c07b3286d16648d2cd6c3a5e078c5f5adb7aa9b80919026a2900c0218a0d6201d61cc1a6ca9aad442bb94bb9051024aa8079eac80a5a4cb7fe109ce40bcde584711880f969a003c2ac79d4a3a1fd0c5daa975ba2b81f0f9005872bd14c18eb07b9c450900194a8f62d42a668451bdbb8c68803048f684e501222f0285c898cb9f7aa5c8e7bd3b91b0ea8c46de221d558c06d698c95cd7756944b64ea4c0c46390ea2c6c556a67fd456c6e12698fdc3501b9076a8b2107446aae620e1624b387a07da3121097aa50fcdc02cc06cf5399aca369289d4351261943cff2c6ca07490e717f0ce7390c093e02b8a863d18f3f5186338cab03e55980420cfbb60745c11c5ce6323dac9fd540180113bd83ca1632b44ed72c06014bb275d519068390d96ba17ffc18b17907dfb87256c99674a53a658be2b0507388ecf3ff8a1924feb5dd45dcb2b53cc8a673509491ec274e7315cd228164c469a7544c8a88cc1a529996279bbbd84e899de2fb7b7c0c20211eadcf7576162664a1deafd5b003bd9f09614e07c0bd0d96da003a8fea91c4ee0bd3 +ciphertext: b34f9ec31bcb31d121a4845322e2fb19a9fec82ddc4f3fc9b027698042f5da9cdc623b95fe1098a2f7ab61313f76e0e8d119b5ee1bc5aadbc4a70582f40d5bae56ae8515f712d4bbdacbd4e01e9406f577b0336f76345e67a866f4cdbfd8a8c341341b4d5f169900379e90a68cb5d3f80f4f2d9c563473d4891f0cf7f181ccf44855a295420b8c9d93a2b2b759066f5fa4f14572fe31febb882a950b295345a25ac68ead21c497c924490e604d6643c790ad356fd907c948aad261b2a206618543a2d05471e7c63352c90c29d3fa19e52c04b1f147e7319e796c997e2c6de273a6a417c1942defae5f361215ffc1953795579fb37028acf68a4acc6cde46a99bd81d6d54ca9781c903e772c339fa75286334fbd3f0a2e5640a3508ea00353cca5660f01bde3d1f8739b14f5eca89d2a99d3296c94db7a4782dfb2aa33e676e6e0e1de0e758f3804b39fc79089b47bf0ff7f4357fa86ef6c5c5de0a3a7f67d16ccb0c1e26ae4de28ef3ef8be7e57b4d1df58787780c750e7e114e71cc57f23037e999510f727c9eaeb50024728d332e4f393d05337c3e997c5bd3b2c6575a0339dd80818bf6e65920bab775212475eeeb02edfc1f307ff092fad3671f37d95de70c354f02c88a0ff2b14debc6ecd8ff8a3cf9a9f3d96aec075d706da2e9eea5e93bf02dbf9bc385b1c7b5c4f20015540b06ff086e4e91eb9a45d43b0a73f45605991f22a7cfe34fbbb6302d31a43d07cbfba9588ac6d93dc5058fe152e50895d8cbb3741bc79c77ff13c0b26d331503b4fbd491a5633a9d3c95b482ac86342075670bad0fdb6b5463e038b4f100f9acd8f9fcd651e1e514bd9c4b7e5f1f152526ae0f0f7aeb8c195abfc4030f66b5920800b4d4d04fc9f4e8178013d1d0f915bd9b92923699570baf512c66a79b5897380ad4938b4802ebd30a005afc57af45327de2866c73dff619efae173687ef44bb8df3ebc08ab29f1cc22f4831f75ee70b681ebd159164fd1834513c382bf47d15025dc6e85ea69a2cbc4b74d753d4c014714495540ff3c1c598cf593aacf905a2dab3a034ff81affd95344d64dca032b1f95612e5d7be6cbde26bbbb092d7024b3efccc7e3a9efbf5493a1bf2c26b824f37b2817a39e7728b687ee73d0b329e5106cda9e0eb986027d75a9607e9516cb86ab0753fbf675e157b8893bdc565174600c54ff7e81310579d1b849e215669437b4811fd0950e5482c70d29b22ac55b175562534b1300639a2079c295e66f4471fac9eb54ea6b83ec3cb06ae560545737d184be403fc13a8f1c31ed374f1b7ebb878d084341a5c62fbb834f6d7a03374b832af4c762c8959c15ba620922e9f5e2de7e03adc1e22fa9ec3c76f9f2ac4ee5628b017e3efb526cff693aaaee13fa36c5098998bcb62f5827927afb363bab182ebc987aa70588b56fc6951e60354b95705d634744684a453666609752d8c8ae29764ec02b4bdef9cc702549ca7890640af7292b7eab518cabf8cd231b83e119b79ee6cf12ce7fb51acb6f7da7163dc +result: pass +shared_secret: 822255fdf2b40392a52e30ea1010f61b8d9e13d0843a859136e53c6a87803cfb + +# Random ciphertext +private_key: 397871dde35d0bb36b316932a918460b45bc49064ec4abb23282b033b23b66934f0e18b0a392a82c7cc20d9138e24ac0b64b4f5c9b31ac81a155e6371bac4cf676185ffa66eff962228647c9b92a2b0b0282741ad3a260b273c4f1c114d86b53fc68475e96b0be6900a7e459208a2ce66b1bc5eb79048a463d316e953790147ab52561b434029d6be684c53b719c592b4659a2fdd301bc7b925dd5cfc8c1bc63932f4e15b710eb49c154658d98bf3ca5a88a237f49c315e9441a18018925cb8ad910bc903cb69aa9888a747a1fb86786db6b4234451d18af2089b8beac1a7c881fc88b9c3ce1673662b1d1d93237d33910faa3cba744aeb97bb77951d32794cf72b455c69794f89238141eb394645b1841cf932ea7031a97e0622f24700de346b86991962516aa5855baa61e9c245db9d710730cb26be6125e5cb87a267004a1af803330f130389060ca85a85a6b765fa8b2068244383a37b649005b3e049a270bb3f3974fcc894bc9c3150182af115ca53d81ceae629e984a75178491bfa677bab7592610cbfd2cbc6bf47bb7010ce4d09846594d93b38fd9a18f438336e5b79848cccb47f63c84586cb0816ce6584da7bacadd2294ca21283a6b920c771e09a8878d6b7c86149938a8617d48cc9d3681275b2e9dba36dd41596185650d540e77a73284805aeb2488e9e956fc780b2a6a7239f813487551e4c7ca6e799cba8a1ffcdbbf03b05c63744787e7ad5dc3bedf7b6ffb279add14c73f38b617f04e50b8568c105698f23693942a84375fdf23ab71f4b9a3a70804cc43fa2c1758a2c90f351de4507323f75c50a28e1f6ba96bf5ac9806a370f49f0b8aa8fc9352d776ce92eb64f43ba5e41715ff9ca43d054090ecb20a4c5313f7692557584e43c6c7e7915656a7c000928c29beed139919d2484e5745381b86e3061de246a1bc4aa9ae2b7097c784343ba03d4c75a5431281152d70103a35b41fda217695e0b62eb68dae6b7ec7bb99ca432a5cb91efb6c0b0d30741a0b17e42042889676184149a583c565fa5168b658045a90b2b6aee21996a8327699d895e419587cb3a8069785cbe3186524443d344a0ce66b60c24ab8dc1bfadcb4b86643a4c48b3bac7657a13f858613441500940a857aba8b95e3af00401d3a33a372e7054c6b6bfcb33ad91a2a7dfa5391848a26ec5b43911ac6b6a7256138173519e59a4ae6b70872750a1568ad835ba755d44840a7c474038ef80a4aaea67b66498e2b9cae9a7644be3cc3bfc0c99d94c9135b566a4a2ae107b3352ba298370d61d532b6e05e67db410a097b8f43a3ff6ccdfdf033a4e054e1b5cbdd0a2081a2b84c86690b28a497733337fb572c4b6a074717a88752388c520826717d15249f701c233865d4d9c64b5b8b0511c227a87b5da6661981c01447b34cf96f359536e36847c1799234f95b2b50719721830c039362276e5f9ccfcee93567a7afae3075a87165c17505863442884969a26821e2b160cdf03c0f41bfbf6b92798243913a2d166b8e152ca8982241362232074cc6e52b2fc8d55b65b5b4c52a04814b41d5eaa6ace874548027c5f02b4d9a955f9a4f8c2c701bc19294ca1b74aa26e8492511b36bd033025a394f6f2a4e84f70eb09a569fd463aff27d3789218b06760e3037165c90ea9b87a72879f869105e299ec5f715acf02e760ba49eb300c36209b96522fa355591f465cc5107e691975bd905a484333b21a79d3cae1569491b60a9cad6598c67ae93968ac11a3a98c638a2b65abfc929f446215a310221ba173c5201fdf1144c590e149831003810e17a89d07aaa0935ac41e776942cb610144f848787b96ba5a5a29170d6c5bfa950b9742a7ee81ea8dc5b35c88af89b3e9b876af5f0875d855ebad786a5033d6bac49713bc0a9b485f802429641b5a3f55dd5159894a73fd6c504919971cc487107f557813b9942d132fb1433f24c2a0d442a6dd125d5d5b3be091863ca34593483f26a8cab32a6dc7358d095818687988f8a1c1fd50b9a4c7fff3c7f2cd9314210a67e5866fd480fad325da1435e1c5003811ba92e754f4deb8d35b53bfce5bd874398ff3a1e34971cc9744fda8acfb715cda52074e95094a96bbacb98ac7a25a429c28ea8591b3471a2f0faa1518215e3131dbee552809b0aa78c094b7b41c1f955d5d79bb6b739d08035aa2ba7405c258e2261d2c283c9f470e55bb21c431644d2966bb300a4248809b66d31d9bf81f4779980909b0a8f6e89693655073159c90a77a60dca9963342a46d69beca3293e9a2360b044ff3ccd6266c291d93c7cb6248d6514d6097060e179ec62c633a884590a95d17a8db7f89077400574fa5702bc8e210ca7252a6d5c03b0b1278fc7e3b879a3a52e1cbb051677569c3c577a72c0179b99e547efa6723bbb85a81798a020a86e260f488a50f12c454412cb5d3bc7d6614edf0026d5a992b9fbb332971937ebb7a9b017b34025c0f4bdd4e5b2ce3546e41b7d04b582bd522de021448c4233b91913581bc4c1b28ce309abf6a4331e6a1a585ba270046adda1c4d1e887fd3220549963fb16b8f9b233566a7eb081b3267cb877a218321cb019799f701cc9e93255431960084036e8e9487a03aee7330979d896434b839d154ef8c840bc04a44fa199ca83595e9c1b8e9226611cade541891c98c2b06aad7afb3bc96a8456507e66738d77d9a302cc573910bdad713061a7c3420576343b2705216a44c13f713701072875bd042559e13e92a73c963ba4ff90b24838ba673767630859a8a367639c98e7b1125c22917b638b7dc526eff758a2f5579f3228a9ea48cc05785658963cab07f2da6a4059ae21759ea4314cf0d1536a09a623e131d6550b46034364a55ff5e16f83e622519564b9012e781145611a9b447873c599a71069cb83729482926cce702edfe32d2da311986a4d30007c109897f48093b5e7b74ba6554cc4cfd484a6e7909a7a5b6eaa980f20dc3b96b21a8d938d757c7fb3db0e0d2485bd94a4c409165c535057bb2f140b7195750842035090ac48324ac6dd3a24d2e1a99d39b10eba71b1a66ff986a841a00b16410c7dda484834cca2ea813d59608760bc68940783283ddca29c0e402cc397ba228238f3565b67cb70876a929a94619eb98448e61c4da86c336616d44c5c52b1371712307226b7c6cc20c47622b3949a968a0fd31ac0ec52a034f952b50c6c6cf539e929aebb409ea1b0440aa4ad732927f4869c29606d465ccd1ad7d1ef8d767f813990ba43d4766a73429ca85c72c593adac1f3c5c7b3bffdf694a4e13bea3992111772c7d179c64b6b9ab8c20d492c8a04d5bfedc19a6fa4a1436778320b4a906531aa225f830c1467a823974226337d0d27700a6f0fae0cf +ciphertext: 3f65a74eacdd023bcff1a27d6c23a8e2a3a186874bec8fa4d351a2ab31dc56dba5742784beb47b640a74656f10175a0215e82c9ec86a6b1c32ebf9c1d5153e8f26fa8fa2e9c4c9e54f66d025eee9c8dcf6dae71afb6b9c40f951b810ac4c8873fa60ecbd800efa86b6a528504defb434ff3dc02e03a3926f1bf88af42445b00e023ed5d08d1f2ef3531b16713f93a0a82666fe83605cff715a0eaa4652352bb5c6875449066567e313434d58348facc180fd516c121e500e475f9cdd20308c358c5b6504da818d80126c2b203290ac355f1ae10372c27a04a5b24cb092dda152abc052b927fb332630dd712b74f96707b4626858c93edd5d08328e6fb9c8397a339f4b1f34f715af75265930002a8aeae099808d1da69ecb6dd4eddcad7c1962be136fffdf03be5a0b689252638285b2b6f30d5da86bb24cd4c182141d3acae716766577663c2cdcea6d27bd59a1c3161894cdd0fbe91e35220a597196e37ba7b9b48d4b6fca7eccc9b9c6f1c7d26436f2ec2028dc0a541fc180f263cddcb26d9c8ef80b732ee66a806ff317c81d51242f81a48b91662a78c6b430160a3c358d9be74b671af5b2f5d1088ca951780d9b528a7c014b67f11b711732008ec8e30e2d70548afc2792eb52460c37cdc8caa77efcffa0b8412d0730b79ef953a9b90b112aa871dc65192d988abc8b3aa8377eaa76ed5376f850712b2dbe0cf67ae6bb215adfeee94eb2eccaef0a6b57cce7a721daf0f9f22e26f71d52900bfb2eaa0a2edc96c81af6d03a93da2ee83582ad542c9c81f7c5c6a37b484082d426b36e6a26ab4fda7fdd82f692fc186de8148efffdbbfedc7565192e74ed37d5494daf224632850adf2df1e11d9b64f8bb8fdcb4d1ca8b662271332b2f87ccabfc7da0243b84a7726cf2681c07be79d1b0e2de3322cc4f5f221d10b030d51c410ec6ae2dcbde994fb86ef7ff8565f51d4e0fee2a0a10d93862fd275a11e46b34182db8d12e01cf5992f23145a0ade46fa3ac1ef566827b3537373ea431f779f267ac781e519025d84e7e8552852d42b3420cb5316e0e68610a5c7ad4decc5760f75dfb20fa67945be93e95a025c4476b7f7a9257820e26ffc88109de705022d0990d1c210070ea338ccce7143059919907bd70b0db618ff3defcbf7c9ff885ff03ce8e92965b0f6d3ac3a48ac6297136077530bbcb06445d953f118b648dd172a5290902700ee9fc8ed8ecf4cad560262c2539ded77ff6beadf90080e5cba8fd39554733d2acb6a401b1b3e458b6a10afa2dfd346fe7f978163c8f280d6973630604864fa6519608c148bc86b6d24ef4c7dda82cfbdfd6a0abf4a17076b817ff87d972c6d69d4300f17f2bcfb48afe82f0c433eac03055d0d4a09341ece6f706a3976aa928d95a70a9995601cab1c2f12c2a75fa87a0c23407d95249f18b2aceac24470297dd0aab16b2a1f50722c55f50a024341784daa2e23787c12191247f4acf2cd806fd76053699aca7b44d322679dc763cb7419c54375f9a46ed63f74c36e03e46 +result: pass +shared_secret: e4863d639f68345af3cdbed85e317ec8b87208a25ebaec91633fecdc0b97433f + +# Random ciphertext +private_key: aec603e5263f4a1b9bb8a571b8a487c8481df8189a7e1aba81d60dd2a1b4587276abb883d3873e4dba1914492d143366351acc522976beb196611726c05956121167844650d944b60cb67c210c0449243c0f052193c8b6b423817403cdf25594ae854d4ba0b08c912a09262559713f1fab1212625a3fe421e3f91313493405210954fa7099f83db036ad1b17665ff3a5f6faa448507eb68b570611558aa7076d480b0e1c7053d55fec55328d01a7d8104afcda67b5218ef7549b1937a1627b59e16a34821335d6748464910991582f1009afaee11667195968118f0ec30133ab24f97940c3f6ae87b47cb5d0202d4922451a625c28608e04a21e9a88af924752d0364ee37a23d12ca83a61f37b158f101b290b13c598bd943bb75560aee7f55bb91a739e8c0eb2570713d534c6b2b0c7a49ef6034f88e59d1afaca74553e65062a04d5140b2a836027b4443ba60bb5cc0c4b5927252a0d3c6ba634231ee406e0b15520e68fe7194940535941bb3833042b2cd2b2c372595ff0a39c6018361c2804b69240931a0e7ac89717a1aa3ab8cbe9c207e64c7d862e093a185fe33208992fc4d0bbbc570b62f185a2b173600ca0a0d81e574ab34b00b1aedb63d4587df4d709f3f852c7c76df2a826fc0649462275d6b5c8f0402ef9f03ee3a9cd7286340c0c737c339e2f530230797d9e654b447118950354b058752b549236440c892473274414a6b7c7bd5456cbd3937cc196d7bb928874777d68c4d20a50da021e83e4caea31175fc25b4f951385034349f251e53c252967728d7ac9f8792322196095eb859fb574ede423abc813f3b71471d1a3b9f35f7dc270a45ca88bb742f6618b48e266e1b549066a8b19b5399c340a584c8856f40f78f02607f4a9a32a388b0a4f491402133b0022f895fc3a13f30349b9c74d00b731d746b68365a03f264c68d33305b643b5a79eb3817e5c8cc1d194c1a06767c81a8d36d319d107862593aaa2a028a16124fa3030d11770818a2bfe170b5ec2102df5945b229da0ab89703a1ebac51aed655dd09c05ca8b4ab8a8b076260ddc090522129180b4bc51e79d8de032bad6286c30538d8ba1b4a51cc91995479b22af9c54cfcb26ace06c80c6721298b81ab575254602d74a89bca3aec724722f526372f54be864171d3b07651880b389cdd57073953a851bf1cdb9fb9f7b834bbf4310a7805aa67516bdfb81675440918c538e2b3a4b86b4808740af72742c1c3259cc20f1bc89470781deabca313118900424c526c9c367b829fc957d41b20fba45667714f939c0b0b02afe6b94e45ba4618498ac2ba4653ca3624792fbbacbeaf5a49afbcbe09428af705d4bc7bb56e2299bc0303ca0ae2b50597327c6b2935b179339ed16199767675526c2b407d05d9b25d6675744e3690fd57915aa063d452a1d9c45918b37bc3833261caa19e67873dca72da87efe50c102d96baa3aa316a1165344ce0a753a0e1c7e96755b4e579028e937cbd896aa07a6ce047b3539cc4c8b57b58964513ba3984111b1aa4b453c2c138c093ef2806817509d42170b279ce0008306ca5dda45673f6363595041ae210637608dd396998506113371a1cb2724e9f96c23d380231a19e8805fd76c0c5ef82601d5164cbab05c63a96ad69e257251d30a7a22e7056c33ab24fa476e92a512940f7773c455409cedd695878bb59b8201c585307d1b87c092c9a3ea1270636592cb2f2061184a768133648dd5f20e7cdb5f820b81e6747fb27a867abc9164b208896b59a93b1e761330304a591a46194ad85f4731a9b476729132750cd61bcc6c06a52456b9e70790b1b213cc30c6974e60e40f8d39105b526faaea53fab7a1738a40ec6b4ceae085616171c5c415c62a71a18a31cf3803d47cb29448a3ec416cc03baca39a28cf4518b0a03751199cb8e93eaaab40f2587ace17ae2fea9da403845e0b504d281fb60737cd691188cb965e31ad4e22173c415abff02d79212a2a4292bfa33238d7963fec731d4885ac631647483f2000ce54f7bc22f7c2b15aab25d2771e62883e1b2e45760b03ca272ce78380b042661ca6f447379e190a08d83955c610bc4a9f66a999095a3d9ef9b40fc597daf3358bdc4dfd59c4a6461378c25755324c04159d90e69d3aeb1002835850711568791e48f1c2e68102ade46135a61828aa9912b83260489b19758b6fb1aa40dac5d4709aa4572a103a5010f2190c2c2faaa0ab77158cb7b75fdf2bc72b4c248e8661e2b76caf497758b4c61cc4474f4acf5af8a69362ab2175a69539bc64c1823d0b0c27b964a5e4498266a8b6fb9c7eca00ba6324229a1182128eab5ba7783370152633dac85f0d93a987082ee2788970a71daf925cae4aa176491646569cefd88704e14a17355f61fb8a3bb19c4b33132ec5498ffcae27100b1453ae8994bf9204a0ffe9bb77e63c0d7511d9d466853ab4bc106bd6975cb52037cc5b536feba35168b75418630dfc2badfc09cf424cea4cb4e8b0ab304c1ab8ea21c3ba719d8b13ec92c3c5dba6ac67a3414809b8b00ca675804ba83767b60dc3b542cc26b533833bb26557b7a30d2505c3a2f889b2f02427c1640d432abe5942840c4f99730d7969bc5056cfa8795871b857530a58ad5337446a81ad216ac37bc2f7d80425f32b9d6a92b7c97c97170c5da43bed66272a610a9a6ac459c914ed3481bc5a47469088c6b96792084bfe84284869a7f9f08a7df9c3e1f4423216ae314a5fe2c9901ba1a69b23736ce6380eabad057b8380b289d0e8c571555e8c3896f9298847057c42736cf2095f04e695697045e858541be873c4aa852649afdb9aa4c4b814be75170549cd51e4cbf661a5d684c5e986ab6c5b2531a00d34c447336812e73213e7314e25452786545eddb14dac2775d1b8206f466cf28331ae00398ec9cfa6eb69cca3bc2db90468f45f6e6c6096286620a0a9000189c2486732292cfc809b9a970008a8107113911148cc231a0fd0411194c212c559326806481048aa75d4ab7ea44ca3a46f72e49981a855bad509686c35467865d4b690a88b38f396210be88c892157390a1dc06841af0a9e0b0827f4b71e5f5b68d0d0a054073f62251c6c2ac3dda857699373d60b283fec466e2671674973d082cff735b0d35157e4fc1c4ca249efc9315bf60925cab0c5dc7ac9e534e118b08a48906883ac572a8a02c35426a01fcdfba95294ce34a36d8c2c92561008c3d85b5db313946a11ff9ba45586489615391546bc8f69e2bc030898abbf1bfe48592a1f79801ed39ae5f04f4aa0ea99c15c6dbbd7e466735e7f8fc27c082eb4eaa4d6f146a7747809a0e3bc2ca3f695dbc072134d67f2d4c55d939741894ba538a0b7643bbe840a92170207d225aa +ciphertext: 6a09b4a4f5c7f9d08d4dcb12c46960bbc4ace0f99696b181be447dba0f84c8340fceafe4c1f4843672b0ea8f952f81d25a8874ae726405d340ee9c00297b85117f30ac4de4b68cfa913310641f54c700c9379eef6b0417f17f1186f7fdbe88d439f5d2bdba170c4e744a9c4c3d6f9112018fe0feb67392b0539f3c72738779fd986d33c1697516b60729cf3539b26c0dc8c7fb923d9a482e6ddeefb4ccbcd644f3f35b71e247a1d784e904c13b0408aba79016f095b1568067c0bb7f8dc77c2cce87128e7df71fd5c645c0d5be57a0d5f8d4e4da7240ba10110e45db4931691dd43054a69aee7889575ac21514ad05e0cf59235ee25e9a696ac78008ab7421f8672cbeb123b7e43f44397f9c12a52066e9dc752e4e415dc14866701859e89e3383d58e87d97320b0a8d7e55532da19a7c7610f788af5b969aba829bf968fa892611f5debee9c5ed7c000bba5141289148308c1d0f3318adc27e9b73c0ccd38c86996b39ebe4733e1b3fe74dc384f75e7f2c0f5a6f497065109c43f3cbe5438f38a049f410505dbfed98bc0011fa3e5c6b0da063058fc7942599910f29cdbd826a34a078c22ab52f43cde7cf85e987dbbb9c39ff2116755e3d571a355cdc3a1b120940a2ea3d70690927382a7e22d1bfec3b8423a71db3f8875f0275c3ad01d5409811425b224583429672e5a80d0f7ad1ef4bb2b8e97c878e9bdf820292528dffd99d5cf4f2d4bd08076abd00429987812d35cf4dcf8c1d0c2af6b6f7eefe42e533b702382aa064107c979667d2a501c5129235524cb7a79cccbb28ab725376f246b262b23dde0ac20e29ec6677278ad62668abf356667667255d5c08dd2f7f9eb89f8ae4af57976b2499762fbd07f35b5137e21b6c298d82276e31607d86480eb449b6f6ba268d739ba6e656a189c010e593ae058dc2fe2e4f94d864fda7a2b0cd863be16b20266d1485ed997c4a9791f8ff4cdee24616d1f853bbdfdcd835a0591a099e26b47601eb379c5eb032cf72b2d0369855354254f595998800af5bc0f09434edf252cca91ab921738b816d6b3b08d168bc3b0523f10f7ca0d6762777a2ef34b049a8cbb6140eef689145a86ecddad542783247c2b439be003820bb7d4922c26207133bde6b89c79bb2f26cb324abf011dfc9b19450336feae29acc7d9df4f39204429b0b4e2e4bb4a1bbf6fea04418eeb9ffe10a34f09f86b2d2f2aecc46ca43aaf08ea52374a69319e3c332d286c3f2fb2482239fd0b550f73673511386a9c052ab47f60adb1a8683160f140a196dffdf8430dc97e5e21e9ecc82792db9de624233b7a621851813af23ed418c6c2c155a822de0f7cf1ca76403078a00c76ae2ad4a992cbc9a5e17e91896899988eed8157ee391a4397b36f899574794568cb62bcf45e4a5178d9d7e5c6ecdaaf8b5bf714ee1da2dd902c14aa2243a16cdf1cd9bc6889ae6ffb04be1213338183fc5208ab36a2708cea71042412f98181ba0500b76c17c375762bb07812ddbcf693185aa385252cd810793b331a8b +result: pass +shared_secret: 12511f92b1c44bf6e2c5330640b54b83d09bd9560f7ceae43fa6a8f5a2386911 + +# Bit flipped ciphertext +private_key: 6129a59df21a91b158eada8658d5bff7d43f7bb5043a0732f713beed65b1ac016781500a89007d8b84344741a718bcb1a6dbb6000587a9e79f5bdc1d88a8938a3b3f5370001a25a6c9b062061924b6166e41d4705c75059f20628811105ce59ea2942e4341871eab6f8e4c2e5a5ab4c4b87cee9cc333a678cd784f1b354395654ef4eb28e858665bc47cae896b99b17781a888d47191ba157f1a912270296e8185b2fd93913c63b5f1652fec382e79979a1918aa503b159b90b8c7b9109337bd23d9461943cd8b15696a2c3334b08bf9cc271d139b4b1126d2ea0f8927ac52b8b5918735a57b0c6fd09183a2c41390692d20afe351912e595c042bb37b073f5a125f3bc650fc5592dcfab63a4a40ef1c671a65c3e41953dc37b69fd836fcd1358b928cdd27069d66c104973d4eabbb6da18eba403bca36376a242002732e302ab16f7814b187295dc966bbeb6711f9c055b00896d8af72094c0ac94caaabcc7f99c2fa5845cdd12fa3a06582f4226b86b58fc4380d9663ebf567053c3d08764674805a72028b86271f3b4b73f814a933e76ef3083e4824a277599aa1005e234b3b53a41378f97111b8639abb367e325511dcb7234813226b0f3df53ce263b0302c62071bbf8c324ebc595a279c67352b9d2d041c73436259c7317720386f8c22cb591d05cc419be8151fcbab6ae07bc3a2bdac2ba990450fcee002b7e455e95614776232cd560a171112eb036bcae20d6f5a4df130595acc0f68a3a4b2c38a49957679ccbd870a6ea401a4d1f024e8168b48ea8302d799e908cabeda135ac0bdc097ab20a06da0c1061077cefd1a67fc08503fa1347e35a33d73b43408bc1c1a72e8c57c12a104aa9b30a8619df9916c7793876508167407ac3465359e5b9ea76131026aabfd739f4d252bbc361e2bd0b6b7d4c619c5702b127f6c975cb93061114a401fe07d0c44bcde864fa7511c681a659d334e5941ae5ad3694caa03c928807c979b55a32c7dc4c8cee8aa555c792bc547c4e4c388e09965118d46494f291113155062c220b30c887b6c4892fe2c54517272d602482f554f3a42053f04778796c9f9ca2b3485c7b8062668d0439cb89d5140718913a5bce9612a555b80381dd228ab09309471e21da2413d29c953df821e250390e49a14ed7b4928977d8fe7542941be0d127110f8c3f47032f789344b144028b6cda3b939cbea5beb8aa178d80ed1dcb4e2138d56690dc1d1604a687a6963b14d725eb66810aeb869ef5231b75c8cd2d48ae179c99ba23855506134619cee516519d7ad2e54bf18012cbb64b1176b7d190a75679c8e19681bcc611a9c94caf9bb4a575ac6482798139c6518fc3b11903c4b0a7afb4a0bf8d3389f15c21c394591057ea00a150f5a9ecb8b9ece5763fd14a6d99026b15718145c15b6368feea62bc981cf42a5cf704470f70277b16a0cb67cc283402b1d271cb61678a84c00e305997891679ce990f9130db109bd59601d3c2c92e1e02a629b8058d1480d9496c8d1b50b8350c17aaf58845aa3334c78c85c14a1732f42cf7c588dcca54ee2574dbefb73ceccafc3123dce933f6df02ee8fb19dc523baea7a906f526fa7b1fca7aa9f865320c4b19d54690080b427cdb35bc46231f156be9b1c5d2749e6118857df5877278cb83c83805048d1120bc6e7105c8b8b5c86a9927e13b8d8338de794a6667ae0192cc805173b735456597ce25f21af4b4b9b6710c419c20e91b5ba4a3ad19e84ab7413a0c4b043cb7c5ccf32e2c27aaf28420622bba58bc9d129c4f80132994263db305abdc748a14273c496b2f96859827e8b45f0116c615a82e1415f0cc92827378a8cc48d8d740426c2deb5b318db110935b12ee1a569e917494988ab4c08967b17e58003dbc5c8eb88872bef520c0436861c5690188b0d286440826505c928249b2947ac399ffc376ff1b28b4f1a9ec3ccfdbc0a6257610882762f0c70e5537aec5f4bb32c9af7231b199a78d23116cb81a086b349747b789e3ba21439821006b4f0e31ab25962751b4671b8b8c96740b6d0a428e8995f1926e4f1538cbc8b69c661ed4119db4b1759a5591edbac6e9b79744316d1ca3ab98f8532881c9b56c0565aa5d8ac26d0bdc95c507137eebbe49f2c6d80614f2f53ae3f77f32fca79ff96d58324428b4cf8b0445b6b38a8ce97617880b082c80857965d9192ce75b3e782772e4288353cb2d201c170746b4c5aa9c2a5626934a8123660ece678da5c53e12d56270a2c9b4eca18b391d3f632e3a7ac058f1737ef457f3c3c030f9c1012c5ef78286da171238e164f6fcca46335cff5a3fa8d202863156b9b99626f5361ef3cc08a91b74d618233c9618e13317a63e4087818e601e3f7c661e602c7614647e389cab276710c05986b2a4253b99b45c9c569894e0616610988c75e1533a184e7ad099d9f3cb3ab09013b45550d24b78e6858445915e1c60d871b2c1d181660837fbf5c37b2b062958760499474907b4e556b95bc73f850056256770297a81e90607a651691da505e2abc436990c3817adf5b45927f74d2013a141c44b80a602848467be6b444b8b1b513793f7f944f5c3b7a30caff1e70fcc9759c32ba92cf4a8e07c0972c67d2dabb56ddb0441dc04c0885355898667fb61f24a87b267466e3c48bf4688ab08205cb445c50b852468b3c1b159d73777fce6438c1830f3b8ab1fe116e7567ea447618ebc4b1ea59d41b3959ea32a23d028b8889ca07ba45f4a54bba405dd102d7f29b9316692d2ab8f3d7b82064453cfba933f71889091776ad34ba8a556db480a6c7b4d0b89977c4ca3f363ac572b5d5c007e05a703e4231154b3531c32cecab787fd258912880b0e20a29af1add5384859b8b82b253b5504033c3b6daa96a599d36acbf400b58678dc2ab071a18e439b98fd525dc507450a95aa8326788ec06972d227ae1097d4a71111c5716b97756c9a57dd6275eb581e4147a26e1801cff689ca1a15523c6a43244670ec0ced9aa28322484a5b6cab0721ec808367c8c931724d07c41facac10382697d843b98fd1735ebabd1bd4cb1c9389101874b250c6f0842c58fc3141545062f3c3e62a4f3f292e015aca5e6434083b68c3c19afbab939281a2def918bcf3beec35275d9436e39850fa23057feac3e3dcadd70941f4f5c0d7f8a205fc926d155eaa151a3958563f178718646cfe7b8cb70341ea8cbcbd3aae125806ec41a73b4676e7e9cb2b0a8b11b06d636c09ba378680efbc7733618fdbdeec4d633d2a74a9109235307dac3dc58836233522d99132fdba4bb393ef70036655bbd8d89d0b0366c40d35e1145ed3edcc705811568b1b91376ac7486036995c3088f66641357cbb4b78df57965db17ba4a4c561da976b +ciphertext: 2c3950af249007129e7d7af3f435503bacf70f70936005d594d520a5a326f30908696a20c2a5c16597496d4338dc321f4a8244226a22545eaa4389c7a9f651d5ae287ac7be48acebf87e9c8a2b947faff342b025712891544a274be1d2b7d4c427d0d5c49ca25e02668e5ba06ea55b689a91951f6c99c1378a1e6cffd7d9f49680621ae85c9a8b5a547e6d8884262b2298d92b31fd61499198ffb031d488507bfd494e582af632d0a237cd9e9d5d079b7068298845ce47a097277b4253acc239d2dc1c708cbdb694158973494512e8f7ea9650086c58e5a6071bbdec04ca9a6613e3b9c433cdff0d441d2df4392bfbee0fa3e8fe153cc45c1489c031561cc228f104e5797bd4125f4cf2f2753dee2e1cbb279bcc85da4536d6e9af384ed1e14e95c71dc3b32396330972206c2f96a74f85c97a639a7103e7c221de65821c2d3f88b48664eb1deb0a321703c3bbaca3f50d2b05d3f2b4ef379c463cb528ff2e9491cb6b9101bc4cb4b93c5f1a60212dd8ef6f8d30d642f0e505f2c9094381aabb3b3f79037eccbc136e9a2eec082b3a4a558465b877fcd847403bc173100e50e9ed47c4e6205207143d98bfd7be4a4037e36aeeb1ff96dcf257725868c0ef138cacc2fab33cad86cf6dde9d71ec843fcb7f124e956b92e2162b962123d2e6e999864fecb1d683c3d779c8fa6487f71277d3257c0c1ad29d51d0327bd3b32e55aab71cbfdb372d4621d6dd2604c5de323da32b4705e90d2cdcc45b22fb5e960ee6ece08259bbfd8f772fc6638d7eb48ac6496f67f2cd453cca693a6673421944fcdb226c2b5cbaac92dd054d2820d987e34f3caf617ed6a9ec03f35d17ce52e25b6f1999f57cb1ae69001e75652e656c02ca8ae0f06b4f99447805c4d71d6adb283696bbd566a5602808fa6036a7bd7c636ed4bf7a3a035f941b058287cd7b400277dde91a8580222fe03b00249abc1d3f6cbb4029c63671e1cb5cc145e3d7222751579cbaac7187080e4e75ea48e3a1bd7ab51d1328565601944e5363e243e173ff70efa17293bc1f0fdf4458d67c4b0f40e129593a607126413bf4a006c7d6d31f130f6e4c64e9ab20727f05f66fecb90513fc589a54b5589ed3d06e37188f7f42ddf7ef4b5e1b902009c2f239f9af5b2cd19013cc487aa3a3d7b23dfedaad47340bc4b11cad33c8f335a5246db8d71117722167a3908f2519894d457fc762f0d435d550ac97e394be75a647b676648b3e8defef1a951974492ee5ad6a813ef642963b86c3c866c6d331b9e2c400552a8540b01c5f9a58f506cfc7181c91e4308854e839433dbfe89be00cad46f477c75fd95cdc0ada28dd6530ad75aa0ed65daf029339cca77505c7b65de647d316c630837f0e5ab6bd4d9c4497f91311fb412445f7120cbfc2bf7f8001dd7e456280dfb8b0122195761a7d1f8a927ecb6e2b090fccd33e6c49a56f6e80048f8e7b09a3a3d50db70a561f4aab2d730cf7864de24a2ce926b0c359a2145cbcb44db12ebde465521aa34269d5ca81a918f556e2 +result: pass +shared_secret: cefc2442a375c0a9468db9b9ffd5c5a08f178a187a943a6875afd9cc20ffcead + +# Bit flipped ciphertext +private_key: b5c8993f174ca68823a2528ee29016f3a86fdaa574469b08329981e072b8809bbc21ecaa0090a5c7185385454fbafc0c2d6b5ecb51630344c3d1b00b5386ab8ac98c03b6b8b45567f1258748d6477297008e748534d175be794dc869c9f2e8c9b16a16391b3ba0b7bdee315e8e430b61d2604ab45dfe7a935048966c3075c3f61e87438a95053f21184245d60569a523fbf1aea5dc43ada2bc8f927b5b851f33993fb88108b9b11fb3499607a8c02bf8bc657c50b82024b897201f563761554c154629ff12bd98c1beeec8c54dc793205797591b11565126984a2aadc4cc96397916c75ec012b11c74be26ca20dfb462606c58b616c6e7f6a9e90893ec130486b8b68657c9afdc6c4ed396e360bd20c1670c27c991a0b30692732dfb995330740954718e15cab169717a268175b5ad5748a416000e0437b1667238f1fc291bf659f0a310ebb0c24d4b43608c14ef8ca8010863ba80c2e426214ff0b93e0ab8cfa108d3958a0f3575865c52ff851420b249d5587f13878b8d67c5679a986a9c9f2e0024d9d9285952a180e7b835d55016a83593921a3993756aa0c294b3978b19b3384a282c3c5ccc7666ecfa98a4f48e8b7278a3a3ad5b998ed58146acba5b996538c5d862483c2d60c6c31e80b4fb97a883623839a895a3cb46bcb807e487bea3337e5ad12f6aa245e3557e5df6505e4a96b85c2aad46ce91263749c15042f3caef3772e5ab884d936f4f3928af5546826a4c9d08ba9dea3721d852fc56a9cd77c3688600a8f880dd651a4522a0e1fb59b084c187b1bc4c91b6d433b8e499775b959dabf7c0de44cd8de994cf48a8cd2331679977512269ba9937069c915210b8472702219529c8a26ffe45af586025fb03c4c14855c5611666a523a6f081affa7d246b7efe670b79585b0095c3cf02214ff6c8cb9797a584c48da65437e81ccb76682ba2783b452c96e9a900138dcb2a3f7f75083e70cf163896e4d2944e789551093031b9882e8008b261aa01ba786d7651e97c587bfac0d9575752f66587459bb12cc476b4b6cfc83d36bb49bd78162701711c8730d15789e2d69c5d9cab50b31ea8d4166a21c370eca17bea7e38ac6b13403ec281599b81270c963ba48a275bb4339507191d8a37b1b5a788287d51450fbe08afa3b34a9289644563010aea8f3f00015085b974e836735a688850c613080c0503bb7ecb7a2c32bc39799803948e11abb24a266efb8497f85c45e9004ba0e4be2e0c5579c50535f94d3f2a4621d55428d5bdc75bc2125b7fab69559331080b2aba4d5b111bc49d614326d7a5abd902c6ed6819f86307de2bb7b7eaaac0d68a6d7908b59046ec1900894294b913ac06d120a0b78543b73f4fa53435d5c13b05b0d3a21f03c84b06ac9381a270cb5561dff0b32f6b6edc3a36de323593dac185d250565a83f40a87549b806dda95f3000726b489b26b43fcb58b882107e6d72a13074bf5521b35311b912801aa4570785897b6dc953b495f4c4b84638a46f784631393726f254fe481c04dc0c1749a6a02cb0dd017b1471201742884a9da9505896a7d60902d01aec308ae56535ed8596d14d3a3eaa135380c8fd8d8148a7caee083b3b3e94986877743ec78140bb5b797bd21912aa529c754b2054f987b2ab38df56995ac3541c4a59c84f0ac2af9ccf8f0899c423a0ed518461c39001a2909338942861786db858f787d2baa8354610e2fb5338d690d10737068bc904d447237ac997865396793470b6bb6b2c6c3ff4a5e6f322f1fd414532a0220f85fbc7768155a592047c028a5181d875754d3490b35c8caf7bf61863b6fb0bd1549c4266530bcc09d61fcb44440cec749bba775a51b92683da67d4e6878fbd47668b8c867da635c78646ac94009a0c6f21a8c49e5b94c0710d4e957aeec68a935781df63ceae1252465ac62face3d024f9e64cc880c6675e564efb84ff9449339fb4e13457e0bf5003cd11dc3112acc1a6d764c69d42a9e5c11ca72867f2d23851ba60d04f344c221c177c09cb6785ae6234bd3d467b3c31d67203320fcc2a7b1189ee6cfa8210f27f845bb05c456da1e994274b3534e8833371b74ad3606a18de4b803c4ae5231c429161b839cac9d360980b53b38e8309bb58be232c90b9b98dc09a51390207c30017b168c6a95221884bc7919c38f9499ab9561a0b061ff68cd9209000b496474d092faf435d4d4a6a34742c135b8fd23ac63d1b4dc370f9e6c68ca37217a1cc4d702a5e8990d26457f912a6658ea7247038079d379aa655b0e340d71f2141a84718aa589eebb31f8656c9d2730d0259e0200909dd89a35979c34690f9830540a8002b75884439b8e8de42080014f0172147c867e6bc68a23e74dc8a16c2a7a59a059afc5821b0f6a23fd2640f9723fc247b7fe50cf2b1548ba4b7d7a37b83c85237f7278f8064463039f230546f2da5ce492798d8bcd9f942aaf53a0e2743aebc0713fba1407b5858f904234fa2391133019857f6a319f60eb6777639a8d1594343044cc1c70159379aea06ccad04073b8322427ad1acc30c11b526e95062b62c7a5eb81a02a0bc7f6aa11dbc7d0a834cb2675fcb94178e036f9c0beac64b48ea16422530f5d474aea90897ddc2144e43f9cc5587e551b6e26a710e58d8695a05f70659c1a90aa086833b8125d51575fba2105a44458655a753cbb3a3c45f1e77424e47a57eb92ee007fa185c00cf5006cc858452a63688831165a9839b64716783017f62d4646b30346b91f4425a030824a50af8f6a38a78a45fd4428fcc136fd4764b0f798d45100cdb859e925a8e8005c56c73049e90a090a411ad8778632542f0a4103181c5a119c9859af76ca39d051a218b34d75b99e696c4d05246e43a829db20ca9574c6f22691dfc92183e81f2b2922f7dc41327517b3d70f5b4156abc464cd776a1bf5c17285a4773086e7d0b9054ab3e3860b45f572a6aa7720c43d01f6c62cc270fdc35e23268222bcc3a769a3ec39857b300c93c52ad7b05ab0e9544f21196fe62a9a16a04487526ce24e8baa4e5123cb2c8a7122da5d697686bab49c8046442a92bd34b663f926a24f529c8dbaba5dda288ef580b43c8c525aaf92e5992495486d399398493a77b2354307c4e8a365d5832171c0c4797bbf1c4c0a30778a9fb2677372b51e1ba06e2ba214e003072cb321523a1077c047426b4f68bb7ff87679934e3d94c5e655c21506617d539b1e534e43a650130b2413ea604d07c2b8b035722e370f26d6f900e66500b4fd1591565024d3e4d0b7f3d625bc98e4d6151d6e470e8cd2d515163ad172ecc559f3d9f58b63a0d69dd1f31727b8b332e70752da70a68ad68f34aa279c731c2bed5bace26b636ced453492fd80cb48e34792f12f +ciphertext: 6bb81617e71b20e8c41c01b290cd167f67d9956637668b5ceff84cdd596383a345577c79a552d4c4bdaa106fea04eedb5b1c6e676bdb0c74e38bb8ea5e63f439da5e7910af1c4909a69f71e39b88b97712246fc7ac4e0554f7aa59aca6206d64e00d61b143e8572a2e342cadcc0b155fd8520d5bd82fa07d896eabcf0cb1dc09f92e95b0d2b9f2a926de4fa3465c04dbd30370c3673225d7f4844ec53a262629c09ecda64ba6f680ce1bd2f03afd37830ccd263321fc2b183b6e5f3ca484fc12469a1b032e8ae26b9b2b3232a24e0eae90f61857eb88735a2c3d66a1b4f1a9a403f3f75c1fbe119c9617d2479371e2f027dfe552326f60be989387e13eeda8b57ec553d05dfb6e7dc333f883717834b73256e352a7ea47757f03772be068f8394d3fa8f168ead2ee9b24948367e8708db0d3237685caf7f89ca359c05b449fbac2a0791ff3245af4fab1ff4436f6d6387806c8c9fff2032ff06362a7cbe7bf581d5e2b606a7142696a48386a230c4d123a203673611152b81dc3e7be6d8763a50dfbdaa75bdcf6ee61858608645f3b29863216caa3d4b35b43480a8bac59249e7197b3822b0ea006806afa774688226eaf50b8cbed3e0d8600fe483955c7e4123f9fc22f178012f329efede7d923b4f3c6218735b74a2534aea1ff46e9d0a9ad3d1899366dff7c49b3b583cf74209f111ccb8466abe08838de40affc734b0fd368f35a61d8a391ae5cee9f409ddba8232af453f7f80d00d0132e5ed568b610866251018b94ce9b1fa032499a20d85f4d7377a7f1f44cea9141981cb278ac6d1a82491c2997f672a821f49d0468df731a4342393099be646caad205f7704f77bf6ef5c4a4f816caabe5fe16275a3d6d038e35913230c310360d5030b16ba9b5c4d6f199c7f351c5e98bbcfbea3fb2e1a666bc9854affbe889e50a582763614775ad8e1cbc4d2cdd9857fa358dcf41fe5ad108ff3688fa5a8092033e2a8c73a3ad175fb187b914bbc34cf3b4384d8113a0879c13403414e0f8c8e4d3fab3815e54e5438256f5bb0360b420eeb32f645bc0af3a765f686641e18747457db53aa614c98c5204bb9dd3bce0ab46751151a44bf78e851a38e2cc965a1ea7ecf9c33462d85b81a13eb710990a3b2a88a8387a09448e2483b3465ff156af0d02cac2a8428772393ffa4e98658f6fa8217382a645505367a16fd8efe9f1e7324effb8064dc856c6b44fa5676e47030a2cdfb1778d3839a93dd74773b1fac5e9fc1b3f8e8dfdd66fcef8965795ec33f9bccbd6620a626b54627037160f53c5c5feebc53bec3fd355851594d15ebc15e21d5f3fe9d6d2f042daae91ae8b27a6c8739bec77d90cbb6319e361b947fb4704f6172d2abac531ee9719211989b543dca1abe3828612b6622fc6d677bdcc3e5ce957808817b4822097bfa3a39c5180979fdbb05c90429bf373e7e893a27f11c6cb7b81d23f7fb9c8d3166312653a01195f3ddf0fdda770df2a9878cf1e79abf08fa9194cfa74a18b9845791bfa5961c3fe28d88b38 +result: pass +shared_secret: c3c12c77af63d29b45f5f98beaa18f47a6e76a652881d65508314b5f4dea071a + +# Bit flipped ciphertext +private_key: 36fb8016c6b86941994276324e236d8290542961532f7b1509f757fab75bca32b564312051e8cd1bb600b3c3b69b193997752936a758be2aafcf359aad358160212b61d598e974944a4015051068ef5cb7dff84503442b9c15b2d1c507d5d9abd3e16945800f8dd51dbd55b5748b14d3b3be01786481f35f6e95ab6422a62fe6ad0f5a2010d8a80c3671bbd6c616734af6955b9d81beffa99c7c0b892b239bd0d19747e5208a437072f3cc32929828250f044a17f3b77b22519cc13b9c76aca1cfe244483951d97226607113e2072b99e17c319165d506182610ccdf9493b66cc643057f77164613422b0fd84c0f9aae0c2340916300031ba352a36efc711760505dda50890a91cf2c8908eb88b32937b6d49ca5345c14f9912b3111467bc14192b40278261dbf782be4e71663009e3f808b58614c25fcb3ad70b0ebbc9e16a408df247ac33c75f1ec49da188987a038ad62a5312949e0321f10d8930e3abdef4a71d0e4522d432825c625bb02bf792143e169028a76ce5a9ac3d4f70c3fb19668a84e0fa4106444bbe7868279b64e9b30c1f8c23b51e7113b8a4f7a5744290b4f69295deb30655f5b4406ca0b09435befc2af839a3e77a181270bafefb4a16d12bac0294c66b9a6fc61aba8b24f6d2c3345fc0c910802f0ac8328a9524b9b11612716d7f2a5f3998a448a9c20db648ea9886dc309078c8b53e9c4e43580dbaa44f95827f67695b7db41cf063516b64587b340c0e957b75311bd86b05718b4ec757d5f601a10b839f96424e80c3de0f5bb2087211087b402f5072a292eb25478eab1b0081561bb486a9ce4a4b1c83b52f104dc92ce0055230bd51eb416468177adf6a0bc625b4b5228338d2978168213e0d3c75dc954f626559ce8c8889b7283283b88ac5947660073468c8e4b6897c6692528c9a187a5a87ba5dbd13de1590634fc454c09b4c0b676ae7b4025490f0f6496e33cb5780015a3485696b2b8467b24644a9225c843cdcacaa7f89edff35285f144dce9c0c1375329e3a4305152afd5359cf2650cf356c94b5425151c07f44c338cc990e41b5c76503bf86a283627bea29cf81a1207698b92ab196c978864b77f531008236478b07a4007792e4f94818079b8107c0146e711a84c4b7e13105f803ed7815ab18b5339884c76cb17e7582162690037c66829055d0be2039df561b434a1c810009cc38506aacc964bbee47c92e9a577ca3547607b6f673251cc7a05633a7bb38c49c5bc734dda84cf2a2c50eb32fc798613654a4498b1cca6c4416130459606429177296381a9c1060c501e19095474f61c37079681b528da5940c9cb697f849765db415539c4db479d94884625c736da62b7ef998262a4697ef8c0718c9ab706bba8c0b6afd479a9b38499dbad39e716ef83a5a01c904b9595de9b7330b25e94fcaa5d2733de87b723d99494e7c3183761cadb6277d69190525fba46094657c202e613399a391252b7fc16714050a09ecc93c283203e517829f0b354d00a0360a2dcf3cb7afb402fd9554f934df0070eee8b93fa13cd39c7732804319ad13a528018f058cf7d4078a0743c61e683050c0fca18cdcda72746041d80019864363252a87a0db17d7810b1b7047222091308f1c60ef260b381914c7335db3723bdd455c6ba93ad0958374b7fb7c832c78aca0aaa685c9081e9c56c3a570885aa25302911646ba4714b79847c2bc177501ac4191b92b6a3c8ced316a74c73737c703d6c9ab0c7bb4e8a1118476848688a8fbc33579466cc15121a86371b287319a4929fb9d7b69efa7a3d79991d0b10ee467679308343d44c164544fc140b7dd1b7551795f5bb009d47a696243ec7130564298df7b3303aa30a12a97862c422a7e33795a8739a698c10516b869bc3a71c6435e8261f7ccda3700d3ceb3b1a8c522a2c8654c1777a1c12fc03ae41d072e5d2268e495947a1b3e9b64c01e86de80b0d504898d11b547285cbdb1c22f359b08d62c7081cb21ad6a4860b5ef871b90e98ab2b128e4f93bcb3c76c6ae286a98a16ec7932a5a1c42a52b3845875ad247aee8cbb2da13eeeb770df8228cfe9cf890b946bf27b9a5c4b20a41f1eb7be7c039bdbf918c6b5095b224baa8bafed27bf758448ecf354ecf86d7bd8076f493a3d6a1eda689e69e03b28e9c42d69623f353e77e688f310a27159ba0f80c7d6c1c602b602798b988ad79d3637c92465c2bf9039d559baee685b9ce76d87063ce38c5924b20638744cc4155483143ea1d28136fbcbac67bf387743eb8b35627c8b9f4bb8e78a19c4e586f0e5797cf7615c70726c4c68b5cb63b749219f22a8614b407485c573baae3f9b7c05892e4a9b1889158dcd198db9c5072996ce06a05d01ec5ae8ea85fd6389e877a660c2a744e2233e2084246a45a33855c8393f39418c626622b8139db8fbc107a0ae39247000354c732597955bb77c173fd73a47a350b46466c8e151a0680b87c25003d99ac0af11915dd218ba63672c8120f98a8e4bb63ceec7ce65b1b64ab40c912c324dbb9581292287231e84a21277430e3e6c3bd8b835b547c6b70b524a28933c00051cb9348c69738965856fcc7be1ea3874ca5cbbc9035f321ed76a8fe49ca5cac359f581b31d7b9b14c6b2b6a305c092300a2b42df9b14f0c908f63201e078229de5a80f3b7bab937bd5d16711a0699bdb7ac0fc3542f87b615c61acb5417623ad2693771794a6edd22d22866637a1940ac89fe0db3416daaa4eb58d12c4cd2ee11d1f803e4af00d7f97074e31cb79883bdc22358954139d0a6f13a406834c16f4904c58724a2f0759a0c9bddaa54bc4283d70330bc43616fb111c0b5626dce2b3ac0384b69a9b28153d3fbc7ee78c72c0b8067772c32f45c554b234f54bbc6927322a67a87ee1573ca84d722229555449982948976c7a5b0225bc8536fd692d8ef537e1083219618f48559c32092846eac462a045d2041b9c1ca37de4a51aa89ead054da9534db5b97b146622301a502edb7e9a2c426509639425c4366a14cd100c94bc1ec78656c195bc608ba47cb30f70d34516c0b7c2fa99cc58599d6038e002b55bf408cf641c9c7cc265e8c4b218b94af1a57533c37ae15d577c72669b99e74375129bbee92c67cd6c405912199526c590e96333801a8688188313cf52ea1741d191c1a209cf73583c3aaf1228a9efc153b0610752d53d6908a8663bbf4f6307c98c23c6b51edd8557208518ef04abdbd1a3df331e3c2478efb36b327ab9d707c1df4ddba43d14571ac74c83aadf7eaf7de0ccb3e951c0ea28a387b5a0a0fc623ec208d8b040f40844e7df31aea917b2096e78efc7f21a5a107ee483326c786f3f8d1ab73e72a4cd1a0cc37f59299e9cce622f072ad25cac91c699 +ciphertext: 7ace9d0d1855c06c6874d7576edcdc15bee22ccc1d84c946cae6136a9bcf389a097ab64511c6c7237e05f70b81eaa7206f3191c4fe156306e7591a68917298dcccadf451fed7e897a0fd7c0da188080e2fa9ecc231351ecab33bf9647023c4fb2ad3ca5bb4abd0e7ca661e36bf896f4167a7f8d86282dfe7442d822536cce510e550185c261e357c4e9d3c6bf1115273d82d40cef236b948f59bd120678d2dd14c7a2aedb9b2830d540d9c3c665028f46e0c7a5148436e90388e48d7583fac6d61993f1a2e708db2d5979f1a7e125f29dd6c35d8caef22b2e03b484fed758985094790f6f122cc5946a96a2501389207788498a905f41ddf0d8e0119428bf01244db9952ca2379c24838906b0235e567bebf805eec41adfa3287d8ac3c7faf76d8e04c5e0f9179f3934575a069927ec77fe255a65406c2dd81367f853ccaf7ac54e221c1919cb483a251f8137483450df330585a7b23da996c97e4a2ded9b6c88c4bdb8f546fc0dd01f35ae37696d8b48bde2efd856a9bff17cfdf33bd5043db70bce4da71933c55b170fd227a64f70ca3e26a46e40a2bbe622db663a7a26d43137004cf261c4c1ad2001561c8b9cbb98996e9b2be9703ba90926707c933e1c8a093e85c83e7b69da605f8b05caac0c5c94173b47c42213c8109416b9b6f46bc5a88168ffaa98cedbae4ee3144dd6c042f6fc9b07f5687136c762cb0b5c11183e160083f5296bff0022ce1a1370ced0ff83f51a93c792c71002ebdd06c088d3dc2c93b5004fb5fdc8b2cf72671d5ceeddd5904f7b3922b4a27b4564ef5f6fa40436c60271e9680d57a7edcf4913da6460e202ab6747646215211776e7f8938b34fe9dfd920d22746e608ad3bac8610e48eab433f566cece5c291b35044a58af799c3f58623ba4334b7731f7da1a10f5464c95e8a06f972faae0bc7a5019a82b3802d086baa0862a5ead284e144b71b2dff35555076208ad33b4f03240b75ea8463c7657770557c6a636d42d5ca6bdece22dabcb9c6c065c3050a83ae5d5c5d265a146ca3a1563dcb5b69d549c6f2bd53a65443b0bbdcc8e0c00715738d758ceba8ddcf42c3d4ffdc75e7ac94ab3ef1b92a8090252ba0e748f663e64b76582673d3725d2910d7daba68f279b4e8e8ee77437ac333a2fde32fdca637acb2711e86a331a86bc2c4c4851eccce769d0cd0791f1109ef4aae510e482b84e4ecc378d3af48fc400ace42f4947ff3a28a43147f263b81bd69226514bd4c5c6685de198c1967bfa3516c8af00592ef9e10ec4af71ee8a6796473f406125bb1fa90ff2a9b4136b0863e8619c2d1033c4418df4acaa54edf1e7291314c92653a87b8caa3ad963ba048cfd8894ef0156a4f46892bf03ae019fe33293e19d62b425be4fca3677d1edcaab92aa27c13d37d7fdd8ccdc26ba4a129d30fbfab18f7cf4fd9ed392d6c71bac7a8e1075b9d4aef6dff1bebc09469efcf610bd71d86fa8e8b0c6c5f483d527f9867921a2cce5ca2bef47a957089463fdf7b7010634196956c29314fe0 +result: pass +shared_secret: a5db5c52a2a72ca6fbaf0454047ea11c7b5de92aee5578b5564c1b975e8aa992 + +# Bit flipped ciphertext +private_key: 62082bf28a00a0041b82c22f3bf03e652455b574026e5c0a99e86c7196cbce741cfbdb59935653ac1ba0fa57924b404738118c44e758f3162ab19b400a471829b8acfef3617fe89796ea3e033895f0200813e3a5da9a13fdf32255518e18e00714397da36b6e4c612f225965ef9b55683a64df4c63f5e5263a57116205714e468610563d6192212d51a4c2d286b529bde729252000b7d3c301f05aba34bc26beb15da9fc422d696ab078c8eec039feca90f78c3cc4b4723f44756bf71360e286da309834d7aac09c56837c33b40abb9ca11ea53c30633046b4a960b6bb31b8f36c8a053868735d86363af937c9b7d37ceefc1bdbc207ed9621b6d6250b5bc3d0662ce11970b55a603aa1ce92f24cde2072ed2413ad9cb19de1b98a33bd250a2e1c927e393636fbe2a494362e01d874c4006252d969d3bcae80551144c46b80bc6b7f6c0ddf4c5bf55a83803468c0145dcf60a9b0590ec4ec4fbee0c4eeb3915e7419f3f149f87a95e4c62c0cb83fa4eb4cb41756626964e6d6adeab67a0a5aa39cb3a6b72252e7705e3bd6c2ef2142a300b27e3cb2332485e0d674934a23fb395f6b80404ec6a1ce5374377a9d83f5780cab977445ac60835c8f24b222015aa1e41baef5652e2ca6df935a03736c2c648c887c4f370661c80baed6dbb5b9e9920b9192e017a22fb324c89a734de70968c68765d10664785102148460579c12b261f16121f1157d6e6c237a45146456357d1973be5b2717794b2b079806412453b956dd577088a3c3208625e7f18ec5b4bad075b6069198fd420b89872201a82e6cb6849d6623bc2430500b4c282a1c393a72308a01a9fa65329261919a6509e568c53315efea43ca251e2f727ec9053d98633379e04f4740bdb2c8c23a6338477bc4a7542ca5001e1ff658cd076539fa6e94a5b61154adc6100a965a7df84a577922bc15b04d6a4ca3a4ab7e77314d68436455a4936d3b441ab76ea09054d9b51f4f9662fa673f06a2001e9594f36058bd9329fd262ead8c90b6c09dc1b0a72755c3830a534a67a001564065e33b36f46c31cc0f7235464653af4ebb5fe2da9f1dfc12f156b6b75b2e368b82f230a19eb1ab03b22caa7007e173cae0713728cc701142548a27a74a45a57d668439dc5bfe77a3d1d289f65b2eb907be0b2749e5b6134d537ee1a240b9dc59216645c8901848a5284d66a00dd6a14892a32ba611a939c3e1b4a9436418b2038e4a58bb9526595a524d1975bcecc284d527666964bf449268fcd53943517e09c993041554fd83704d6003b4a80153dbc341bc322df418fb79779a19527736aec17372f82653b8e7734e71c87de7cf1149576cd86e6d7c458473bb66b004494b1db5e0ccfb4a0b6b8107c04420dd6259d3ca805145cf25299a409793d7c6250a2448a013983502be17cc5aa813b6f897323dab30255809a7f32bc849c0782340715c1b3b400d223c267e62a620025ef016661ce16c251111ec465243212e4d34334c27bc81956d9db642cf134217942457bb1d0db9a5a271c63b29ccea597e66e70c510419a70826e5f538e5828269c4b28a078174c235ba32b16153c1fde49900a3243a2356cc9b970b82cac324195774791f03b27451af5a54a8895520c016b53669add57c069bb6356881670cc96c8604bbb6183fd7a29fa858c665747e5a315aa601a09d8a7c4e290ad9148b3ac78ef5c348c9713fa83acbf5bbcf93ca4b80d1b23f704c0b0613eb55ca4cfc49fe70200e126aa8888468b066f01467738b4c5959c7d736697c7c43bf49c2914b9e17f0272ed3a4f4c28bb09655276b2ce02aaa09917fc4e4a44db67afa509b3177cd846736e7a14855325d74498be3d7a056117f7c09adbf319bd74c18efc24ee1f722d5ea171d6279a4b65b40d0239ff403343998abe5a3cde4175b0a96ac05468909642c1b39cea004982074a4074c86f8a80e0698ffe3c03a6b9df22cb3cfa157f259aa3d319fdf84b8b59aa86196a0c7fa190bb4a5c4761807939588e9c7b95a57aba05ea4d85cf322b6f0354787d12f62242c742c019ba23d86c05a0e8787d156c2d691ce17377af7ea0b47040a169c912f803302dc648bcb803976a2ee28cbf9520266b3307da387b0a73a6f70982a806b3167ca86a747a4fb18211b4094734e34cb06d7b176b3f61c9ff62de649058e72617b95881e614db8d98bf4992cd70aa3bdab34e9a9bcfab84917e7ab9b1795729c3c6ae521b56a889b54c60c8c41e7ccae9e43932a9acf2fc87731388fb687ad137c2ac2468941141010320bad00808a895191ba65e88aa43bb45a9ea2603f84111066c40ad71480a22ad474192c27811050c7cb277e53f2ceacd73f8a177e2da0c711528873a5cab45692a531a85ef14b10636ccc9a886130b8f0688db14b5728075fd88a1d154804a28404bef0cba8f0b11d3a165a403042fa1a73d15955f1529fd447c53b2e714412db95590bb457bdb9537a211c39f3616e602697ac69348623a0fa66dc49c0a6992186c2782b6b5595768933933fbdf48517b766101917ea4c7b57394422239749899955b2326bebc35f88917beb95500c9998c13765f753f57b08a191addc2ac3901b8b2e86b57bb0b779a952ee57a4e8f6a1155c2e3ba37c03944a7fe0785f9c4db684a43a56802cf986fa203102c8b50a61845d1b15a2b207d7b012bc27a530d82f2fc30a9fd627b5dc953e008e2e8244f348966657646f42358f4052271ab6980ab237a92390b171fbe11b87116c0a20b833f57b323234a978a3be53acb2f695afdc10aa305ef5f39b62589d8cb312ec73471d6c4673202968d1a77e1baac343212cb8cc21e3bdcd530d64c2631483aba615384a312c93b00543a439ffa763fb141437eb86a5964eb04b9115b88437598908b4c4ea46476a5b11b33203ae294f929c6858a2363f35920d43bd5f645ae0861c174b5f71c94a8b27399c73c9bf80cacee89c699537a690b49421811f39abac2a76df286512e65ce83ace85ecb4375a6c0c1206c7b20f0f63adcbe86c153a1154c56a2c0374eba3598dba5b21ba0905bbc534693f5fa85dba6071dc93613d200909d9985c2746b1636a2e703401dac8a911c53f176b35e91acd84c235435a9ebcad2a939bd6e129c79a59d4863b9df12884748699c989467c57008a0e5d8ab31bd4967d16c8b8eb47033b22c6b37ce15b8a4263b016d5caf3d0c783f11b2cc08b607092aab7839314887c76bcd0c409cff35009d3683aedb4b725ddfd6fd12e32e91a51160d3775ef7ff3f39d707d9ab24f2168b5b5d508167a19c6fed755bb7724840bceb4390fe650ac654d333019074edf59df0cb88ae4110a6b14fbfc53537c5c826a8531b465a13abde01e6be7290384656604 +ciphertext: 5f11706146c01697308a84f1d8a529dce54df57c6f0b72ea3288aa39ab3957d5c9986d881899c93e2292e8b67d0b197e4958042a7eb73cad858ee1b04ed09c81e26b1ac955f626dc4c5be81c5278377e1bfa1f93b5cdb685ef4e79ccc58b8319500b11d6aecec0287464c2342130f6fd6607603fb398a7f2333ca0ebe3175a1185de6e481e70f14bbb9134b2b5977a3ad8381688698ee8ef808534d51d0fc0a528ba607fd0733bcad5b57764621a6ce351bf5c40ff3349cdafe96b2e9529c1a6be60d099aaa4be1f45b51f53fe8f1aa05271d1085d06827cde896a6e434fa4e1338954f4860e9372fcd4c59865173d16975e4210b3c6d02fbd4cdbb6eb2628f4c94a97320add9c710989b50b8e5c65d697241eb8d426661db731f33d1a2088b078bb07bb854eda22692b24d506633f7c17068ddcb3111856b5f948442c81787bdee2c78d2b26142cc10772fcf1754c847f4ee764abc65e9c95952ccf92988afdae6d2da1010838a9ee584715f94f080e3e1280611e8a9db39a9a8522b0cdbefb2e5020fc9dd06bfc5187ea6cf8b05873011c67bd95e40289f11b3ad513077dbca4d97e7439238ecdad11dcde930ba02c29df03e8bef7c3e0b7cfbb396c93da47383d9b0dd08cb8685cdc24b2ee2339113f591629c9203e4872955eb4359dfc01f18bd8b0d78f0e5565f2f2c1039168616c1e1e6cdd24376541bf1637103118d8c452aeac39558c2c8277f88c7eb0deacca502dba457c511788355f898153be603bc6f3357b7a7ad0f0ff465eecf84f315060192decb9bcc641dacf029f08b83770c32d6216e318480d469643fe7a1fc0db751abece0d735b05a611953de48b88290f0819a02fd94e17bfb51714633997043b806c6f5e7fe265aa38c3a59e78a723dfa34ebf211408aaf227cd0a7d1ec929dc5989fcf697131b20a4f3a7695ad4f7058e9970094cbdf51aae4261c3e2a81c2f1b39e1003a2b5a4f8014638f0134cc558cc35bfae23f4791e78449e3b5174f8a60e2cd1144775ed1dba5e6b314829310393fc1ad570a3fb2579e922617492af1310efc59d82a02193a5529f2629feb02b4be85118ba367b522aa59be898b0e4c8dc435b3712d994ee1d49e618d159e0663311f8ebc403b0a1d9fdc11c0cf3c2878dd4f8358ccec171acec8dfb4bb3f1923c06312e146cb172643e1f565a8a3701acb9fb0e223eee082d33b0b6f47d7e2398fb03270fe8cd789ea228ade6c19f4fabc54c984900e868da3cbd9ad6d9156cc992fb39f9fe2c441a59c71757e8b347ba8da3db4b57901f3bc6fa8a61e20780041054a441aad28fe8462672459487212d2bd0581963922a69c298d240ac10622955be32309d3867445ab168649619172124933ebaf01381b337627978f2555a349eb785da12dc060fb22021d287a27adf356dfc90cb4eff0dc648314ce3ed7d9970297080812c8f37c3bfbb59d352c35847ed850132ac86b49e8a1007aab2eaf3c508d945067a64daa8ed1190b9698c412f2287a79875d9c1ac4ac6cd7 +result: pass +shared_secret: 955369fbcb23d97a304f2b300844d6efa71463f587cac9114ad2dac1c0450cf9 + +# Bit flipped ciphertext +private_key: ffe40c01a9ac36036ce474a973e909eea4c82dfc10949959ca623a0b50ab65762057070acf0c4323f4a80de34319f5272418675c34270e28cfbdd2ba001c921d5ba15194b3258b50208c16fb5acb48a5402dd266fed4c90235a9e087384460327e00396766cb10c7a7026505145c852d2598c7f2798e6a9be4b82717e1042652cf89a8cee7d8c33bf92de809152bc60f2ffbc029dc75762955612b19ef8acb8608548221af8b0678f4cb4e74186e4de85905d942b13a854ae0b304360ed5e0553ba3994ea55d77829d345557a3e088b2638e5483b4f6290356caa1fff5858ff02f9d7501bbc8234ec0160e07bdd0f23f34c43bbf758b6fa0cbee4b7672501fc2b98471449957c857c6c2306e97322bd672c8d4a2d1720621e6009365ac73da6af3e21966b034aa411a3d4790e28a4505113a87102b962795cbe5178521575b69c6bdab5cfe78b012510a298426ab9935b6218d739261a8b7047d475290d9369d740bf1eabee7870f8ca5a1cce933e79476cef1415c132334215652e730a2d00078f22553038d44f40938f38899d31b4982b0f931bd0a388433e0a0fb828bbfa47f324ac0ace4b5780392e03caa81ab5d5af84c2ae48e79c5464f311c7af721b1e261c8f1a2fe473a4700c6ee70bdee467121b94a8e0c86d191230f4077883cb6ad45b90e2414ce541812911bfb6338f8458976670da4c3c98f484a8966cee2156d3480013af95a14b9b8b0bb6499cca3fe14c265361f9da7ce2549606ea87d5c1278f5f5296bb16156041093886d320b26309c83e01307b8a81e5e3a7c1be170f02a2405c6b398658d759354974a4539e85236131028a28dcc09ae0376cf3b33a341350cf6719b4845b07e926dbf83a6da90a303512ab916c8fcb84befca44e707a845f759e6e32beff4bbeb32681322666a29459e39764877b33168855df729001d70432b609a87882ed59c3fa9c20ff948b95134fca63d9376445ed4ccb1e903b8da38b52621649017910b2edbb53b803c23cdb5904455721ecc8e3be02b684403ed2a035536be61e6385f957d72a6404543971bf63905fab1b0cca6c2b65bc5a55a2b19a94828c8a7c6adb4b9ca94c81ce5b35eb7e650d9456336b04e661b4a229c7b10a8289ee7b7e458bfd9991643338c7255100a9c50372cbf50bbc54ed5a6c7028a22e7c18f6a0e312478e8412366422a33ea77c1b7aaa401af9092050a03423d677bd152750eba3c9f1114d5385a954268d1b365cdc221f5c8490767612488be57da705223285c1980542362eaf49a76e427242c8e0742b1999206e61a0a6f0766704773c1a80a0bf239a6d2be7385b3cfe75028b765e7f829b66448acb990895bca7922ab81a8461674abe90a917cd08cbd9a6f64e89b756a4f2fcc3429e75d8cc45bb5b587d131b6f27c3406946f57da7477314f66b32d20cca77a687f294b63b0e3a2eae4625dc36852d6a130c3afd620bcfaa986bccb550c62871e546391741ad3978a2bd212e7a461b2f90067d49cd4f79ef0dcb3faa14eb8c460b9b9443bc924c1f224a8b60a14d050d557bb16d952a705a0bed728cc9b3bae822767d63e3e05993f14837d5730ad371af284c4b2751f51194a3ebc94d868bafe70060dfc6fc5c97375861f1dd2cebacb80aae32dea78a8702cae2ca67bdd580b1a81a156d7af6e91bba5d21bdf294732125dac416632ba5241b3a16db337352b755ee53803ba89d9d7b974174e0fd75bcd2c65b0e06d13c48125331a3ac8cac63b96ac0b5107446738d4cc27abafd6d79966508dc4b1bc96c62df21907ab4b6117e868ab21c03d14bfeca573e9741b4ae01f9687b3db07a2a80c3fd1212ec5f9608278ae24671b871abeaaf16f37e8687c120ce04c726f1919bdb91c4656081ba9351811a11a7451e9b982aacac5564b02b490683fc91d4aa68ee6a89466a13ee3d52623c6a3baf48415ba36c281ac73339bcae052cce5069b31b9b9f549d7743c5430145b5b8ccca7bbf8d468e2a2292e5a9ab2365ec7b595799132df88c663837202173679146bc24cb727644ba6785c63b44e994b881b754cfc07d0c08446a6e15a32f01264e86a6bc9595d898dd11246c2e4a6183c9f533905b907c94a307b7aa876bb752fc49866060bb59b3160b044326baba854704ebe55b42ebc5b8e0387ead15d1571bf4f116ba7e99ea907a4f7114c67b1553c5c5c85f193c4bc7ac5a956a79547d6c0becd374d19b6ab118517d01a9eab66a36d38cccd3565db1ca2b8559e2e703385c8cc2a879f54c16c9af0486fa7661c1bcf15f45a15493b3eac3324d8657e503d8b516bef969871d7280b050827cbade36a2fed69b4d939cca0fb47134815ecc4831aba0c3741025ae5ce239cb9d5d33b0db83a5cf6143c8ab0994a491a2c34a5785997984c5f9850d8f64ea30cc169b167146547799a77fa96b235e3562a7998fa6c319d997c1e2c9dc7f12dbfc04ddca067167206a7046be7833abe9862d8f7c611356f60875b3b4b33cb748979c18876298b2b2b8301b51ac8165653f6a6aad6458b754637e1ce2c90cc9118968aa804ef55b71d37855f77a6ae79b322d1bcc1d63ef21aafbb2724ac8c17800577418563bacb06b48684bc2b27d8f10deba29f5d0ba1bd18a90af44cf970bd16cb927af934574c0e9524aaa0356fbdc515f3e4ac5ec9be903615bf6c4ab2d1183ad7bbc5733610d2770e3c89f209b6036a33c1824e22254791437cd88368a1fc445ca71f057ac79c37963857b73cbb6b5e9aa119c5cb51c81b5911503ec9ad6f28c73f70cb6a7336e7e13701671b886b670c3bbeb9728c2387b038420083d22537753955696c26f13d8791819124b81d980f24535cf14b498a5c485c523b920669e9c34807360f2885cc2f63a160917ff59000eedcb7d809c6bec6305fdb6fa3458b7524c0365167c19a9fb879bb716835f6a40b760737f8ac3336a48ea03514b0eb2bcdb23f791353d090bf214910dc7c80ab878030bbc96f39918af224af967e293412b6d458d6f25b9d223cc0365fc32cc1a9583fb23a7f9ff98de2da3253e5612b02b00e58c69dcb88befbb9b8183f1bbc2597f65c277125f9047e32544c7fd60889685408c30282041acae2ac90795865b4a1a8f293f0b92447ab46e3d1481ec9096743c3dd36162fe437e1a70e55c7544f6807d62916a06864fec410fbe67593c3034e78acc704a65396c7b22177fcb87cb157ca3eca0fb899a8a652491ec80024f84add49b260426778a2fd1da268f391fc2bb28ed50db033efe2728c0b0a682cafdbd32f2a8529268815200a08852c724dc2c05632b1ee7d271d050e06bd917fe6fb18c4afe8481086ad358ce7a53e20788500ad424163952272968204ae63125ca906449b +ciphertext: 82e37d92c8e676129c4f9848ec5d6091cc1b7d6f9f94cd7ba7712409100d9f5a61cb8a88cf0cdc3812e509f04fc4f1c9fa944cbe62ce5074a77929110002ab2603f95d18d3ab443ffb90fef519b14e2db80591b02a01b304ce59ec608df080c3a97d45250d56cec6bd8cf6456f7d6092764e8bd7a67c878cb8392bb6f4b7c3048fd8701054cbb20b2e2ccc74d9a6ecfb7a6e45e7ad1c87c435c687c761072afa9ea262a10dd1ba5996c7915d8d26016df43115247025fc9ab40ae786a5e4f1fbb7288f04a011764e24603d953abfc0a4236dd44294a08fe572ac730cd51717870fd85491eb4d5ba261c930e508eda896836907bba5629743a1eb6bdd2eb1a4bbeba28d6ce876ee29f6c3c4051f0b38391e81e44d12be6028a5878f037f53828ccbbd2933d326ea79a9ad24a376877a49cc088294fe7fe801d0b0a2413246d1cae363945f859be2618106cc0fb199bad97e015e7ca654bb3567fa599c5a39f8f2e6c6c304fc81d7fdd9aca7710babbb21e1371043c2374d158d3de3a6e103999bbd0243b1db3efe2b849f985b850b98c8e8513765e280d6861c0119a18ec6765bc5da5a0f97339d593c94315ccda810215aa817ad4751ea6ae4759bede914c8421e4c3d2044bf1f0ba6ebdaecf999c46caee6330aef35211f0d75bdae4dc142bdf5517295be71ab384ac378c42078bd608e88161957aaff5e2edf49bdf5a3b773cd72194c5425f72c54da2cf9493e670629ec5459ea388db17844bfd2cafcdbf3a857d0fddfa14b2ccbdd5f582a31f80bdaad837e09a07cdb42c16508ef7013f7178690383420ce6336ee49a8ba4c08293e620c865e81650793b1b6b8f2fa8333bb8962a8da0622f38b359f810da0ab0c191200888b0a72d5efe4142b189f805dc3e1c46717afaa59f9bf5a56e2ab751b7374c07b4e094df4897d62c57d81c01c0d32783de9f018a96348aa8c09029484ce2cfad9e260ab86fb862e0bb8846ca920e463ba82e61be3f55ad4f72bff438ed7c5ef749eea4f593ae122fa4ec97990f392d5e11dad3a352f540b414c457c54c9964f0608612f786ffc4acf002e86a00be1fddd05636b74232584dc2696da0c1849757b397da85442bd50be66aec2a41f5e0a3bc8b9206023189e3ebae3c7a1110d032398c629ddcdbb71c6e1a875adcb5021d626422364d4e2427523195729f5910b3c467653b5783b6fdcd015f0f0090648fb80f774b0c790644eecaebcc6785405be5c83870e1a318487438e8a047a4f1cb9c27dcd2d6768772ece50b6c65f74f4b96da295458c8bf0d2463f85021310f6dd89784e7dec58e4df3ffd237ba75831e2d21afeef0a1c0eaf9f8be5448db9d71bbd600300a0aa0e9387c9cb6c38a1cb86c49cdd4d6b069198525f24e70a8f8a50eb5df94166f4d926211acccb300c6e42a079b3e8d08213c4452b6b844e72df6d855634a5545dd15c3bef36fcf69a81659813fd33a9a8ec574844b73988cdaa86dda3ce9a7dc6f67fac122c8068c47e5114f3c0cbc374838c6834a3d5 +result: pass +shared_secret: 4f55a6c4ac54c6cfbd94535c6a91d420882532687b09d178977ccf13add81422 + +# Bit flipped ciphertext +private_key: 52e172d7a2ac8195b0fb0401f4b351ca3bbf277b6f8bc051f191b94b1cb25d0a807f81051172a2eca18295b0145464413680b1493185662c26ecb77bee37a32617003f2b551a6c601e702626f04a166b637558709abc39322c5e8083533977b83b0cc27d90c160f064c5b545e0101e07a155e2c4a901b032f582ac27a98a1bb9938fc112fc8bc3c56829402004aaeb3aeb271f0186c11759171a40221a027499fa328847676f4b81939a7356218fbb640ee7aa5653f59dc2852181b610d756a30e7a2f0de47efdf76ef64b329864b9d65842e44b18a1529432252f44bc261ff08847e029dab8bef9b69936900fcc7b1cb36c1e0287c816490f8ed514ceb859da495c81603864810694132be9802041daabae8c53fdbbbc585439cf935992704da2f23ad0e3494e123ac4a6c3bba38ce2393e8b09467fd808ef25b8bf720f40c61120182d1e18b9b7898c5a772d6185344c353dfd2ccb170a2c709247180bb055130bd3747964465e41196d3fa7cd4b566ad30b8384c0659cf437f6cc789755c281b4438569187e6c4b736154cf763d6f0550c3a9437a25837d6752859bb859a91c16699fed065deeac967fd727aed671fbb459e7d4b7b02020f1488385e60c8e58a9257c903844c9bc88634166b2285123e8cc9593733a19e5535845586bfc6b00c9c920438c08a84fde04079751093c6683474430b3664039b273ed5047dc6c792a8ab7accabe6808743bcbaf6c49a810b388693874326b904b265c5ea41fe2f62edadc04020026aa157d5de6347cf250b4c93e51b71891424f31813b7414a50ee9441de3c12d77cc84f6ac0fa11edaf34172893268a9b2d0dbafb6bc3049472572b754d52b2e66fa04d5fa19e5818dbcfbc649b07d3216720c331b57003c3ab37484e70e48caa0086616fdf4ce0bc61f3ff25f312b90a7994e3dccbdf0a203efb2620bc69a9967b7c20ccb5be0cf380aa4528414e1365c1b1284486006d53a9109b72b9693824f4a7e982550c3826b2e675f9f16a8dd4665fab07dbdcc064846512be581e2fba1899b94c910bf3cb7b0e18bbf82d92992aba5e2e0b7dfc8289bd00504239c015674cad4befbb245c4ac15f2c698f19874c7fcad86d46fe58cbc07c515e9d89beaab0f60710fb73b201b384127c0bc62d481f2411e5f17b3fcba3a5fa790bf7a87dff9bf039cad15c5172e91497789119b6812a9c6a1030abe16d10287ea383b0894ae55a3194814e772877d285383eab60db0250aca58e9b966f3d532fe798059643f6f46c79989ac3953978f14abf7f12f45494fd17870ad0c1a53c53f28f2b7d6d22501633b70c5b169655eb9509b0ff72af0c7cfe2da4f04450c09b34e806ac619599b6cab292daa2a377a59bbdacbb1a2b092d82d685780f3a68c97e0431e2baa7fd30cc635317c0749dcb88b714cb5f052075fd66e96f00c8fec3c2aa9489275aaa92a2991f12c960abceae76978ca9a0178290e6764a01a46bef399acac64c07ab23b8797a7ba0ec4dc01f3790b964b2b2b2532bf64a74b3043d5299781112a6f5c4b2e096825cba18ad765c47c874a557d887731650aa812a5aa883c418ff5447d1538009967dbdc65f946a1b5b5865d344eaef9351b7c87a4146e2573a0042aabac234d1d3a5333b8b0c1ba56c0bbc1da53a211845d9d089b57a4ca204c4ba09501fe088e6fc8405eacbc15e227bd0c9f3d8a125c0c23a726a20dc64fe22bc71f5347a471cc86d693c993a32e264e1d463cd62c42dee1bfc9b334b71a0222244310f63e4809926be803bd70b7579968d0aa0d56b707ceeb19cbf2088e0270e329c925442becf8669516cc04044bba667ef6ca1d74307a814bc033a1095a973df78cbb628108976047879465bcd27931212fe2e21acd44ae15725352d2267920126a41c0041273c0eac489b32f36aa60e384089ebb4de2693978da1c25936b884714eafca93ad1af7efb5d792374f42ac7e6262cbd676f956b323059913c821ee59b30bee278a463674fdc9082ba6bc5299e83ab5dcd2bb2d3d6975ae797f49632427277f26bb77eda69765a95bfd3537f676dc61b179fd175f27ab30dd2bf461c83cb0268e73b355fb109af122e6fbc934f28a12482977dd07bc87628b224069011a79466924f9a8204bb4a9615a550986380176d6222c44d64b8f9401e605b4a9fc87ab884c85d6604b5763a47da5280221fcc4a18d3fc3e8a0c2fda44657887946da25899030222c522765b34e0652c7b251822e8b99ee900851ab16613c926833a2d4b5cb7b71a9399ba4b50ab51d0c54989440e23630a0b3a5d649a9668ab77876a7d5a7c7d447aae03625a9752feb8a1ebd42a4dac84cd2bae7e8277202a3a25a483dd981deb05b107db809225bdd0caa0713a86699996ffd8cdfe0a3c34028c6859cf7f9a043030708e8a96de896c9c5a33926bb453605778d2b45fb4bac1c9554dc41904641481cb41f0e53167666dac8918e453369ac412aca8306d7b57ac1780eab4a262a96abf389aa22553bed6bdad78b2bd427879a9182cf431b8f503543c481ad18da5458b82b2af44745f55469d1645969e162d51810288e08e0c52668372a680681219c16bb7f168d9592402f0cbea7c7a9099b489427b6a922ba57bc097f98447491f551b08d7b207d8554a29326ed83900c99a23efbc6c463b6964b4104f56ca4dc804fcc03f650a065272c21eb6c74b301e1e8c3858704d5bf34bcaa9c2f077531c90a04785b0aaf3298e93866b6c8952e989aeb9c3761907f2c8579920b3cfcc6b993579b3a4548f544761781e7b60cc89f30103a91237b363a6457dd747b6f38b4d42e93362303d11742b9b415e2d09c04450199b578cea9c6d5678371d3534f9e3ce8c47c8729805087855bcc9ca96634a3c49604a2c3a2caab9d4ea1a99421270b5a02ac717b6d70a36c71aa0f061734a2e85920397d00230c523cee713cbaa0b38aca0aa955781d5c2a7149c5ef77d746badeebb8dadf5777b012d2fc24f7f90412e16a15ad9b4e39a27a522aaaa8ba3b965ca620385c370254b3a7d98312d29334181d92c2a573d20d05f33bbaf63cc5cc6f96950d80e9b03baab738f837b10e1fb43482018b01a1a64110baed717c0158188a8832366518f491b7db355e96890133ac1d54248d5765e2790459433a2cb3313b168239a88c9a7f4cc79d2a778673722b8b04cd437da80c3d257a8da5cb4958c6d2f95a969dac287e853342790cd289a2b118432185f5a1114cc46e80763e40cc090d51dd73b573dd3b187c8462da1777614479269d37f3cd2f9f4771085641b05e45c8daf9359b0e539a2c93700ebe663d274eac139d5a6249a8d980a807e8d7a9325a5cecb74d55069f213bb4dbd95297795ce9daf +ciphertext: 8222de379dc5e2a96c7387ca7ecbadb147b3c0d435ac7057cdc69296c7b11a5bfef22b106374f3b5c71b3be9d19c2eff0e8681806197536da0c1878548820d9888bee9a073291d07a38df2a4f806ecd052eae6961cff847216810ce487d25c871a2fe47102abe276a0e554a64c36b7a7e272434859403ac177167515984b9d4f61bc0b965d4983e316ab19b190b08ad779d7df7c23f65d1ef050e604336456e7ace8c180adaf6610451f5124ab3c76c92452001df9e8692ee2083e1fd5b3a30e9a9260edc05a156ac92d7aacde6a255135ba911fdedada6f2b9034d1d8898c5d053aace83a6a0e8fd6eec846e57ba89e58eace31428c32a005ff5793f4071ab05412ed9217d436c3465dc51ae1b34a58e3ec2c144c524d051e8431f885c01dead4078286fe60e046cbf65d14611ec2b6b48044110f3f8471deb3e8c969ee3d6702780331fb727154dd1ddbce62cdd55276ce24004e581a950f6902ed86f0545b5baca9efddffb5b7e2d7f96979482288a03f8ef6f2ae9022b3f6ebee5b64081ba1bc8196194b14ca45e5e14de92f07f617feee1deeafd08165296e59e0bb645c494f4832472c90ff88a97fa1061d5cda1e029dc6956122e3bbf435d5985f11a4ff0143c19884b699c9aea74610e77a9c861ed3cb9d3c7dc249938d1438139823ebbe891c7eaa11d9f1b44aba9cd4a7a9c413f2c68ac1e9a05b32633ccb2a6110491b291da7ad846966ceeb19fbd77d978c733c694a5c70c136498ef2f13f7c746da68f04f454a30296d5b6c8781a8c35e62ae57f8334a7bdfd74db2e7be049a63074075e0b461394b6571634daa6f3a73c943d4222564e586dd58123bf89456ebe0ca139a0c62799c032daec878dadc90ef105f5d8edec0bd8605313d08e797836c32ff281741eb127b12beef215265a3cdd100dcd0705b22cdf0075e2746e6df74b2ffd7b2fcca205706791bdabc067d3b57b0e36ea82c7ca1f80dfb34de36dde852fa2bcf3a62a9d25e77ed81eee157316226c03df56c51968d2c3de44fe865157a426cab8bdbc681f61b662bcc472a29756395c0aea691f75e252e174a7739240b2387a644bdb76a04ad5830f0a5bed3fb33ead956ac722ed0ed79986a0fcf2e7d9f09e2b36c17e07dfb2aa47a04577f01f425c3d6129f31f8ffe2bba077fa3f39a2e53c1f7b94ca0454798cba4e35436ac5261b5b3d3316966e82a05d87b48fbd90ca5c503c8550b46fc677ba1ecd0c4c1e0ec309dfab192118ef93862088273637b197fbeb725e5352f8857599e6a836c0fd2b16d912e314dc4721222c630a43c77d659887ba5a7ba2b1fb002aecf4c0b2e289124e806f97af2a9ec4ba91af97257801b665af9c85525f9ddef950558843bb9c1a31985929b5de412e4fddecc68c9b77fa5044b99ec0ca88935a9c9952ba673a30351f76d0fbc90549445dd5e2fde1eda2533579546008557d03f67ed57afb95cade5375e24037a5f4f13e004874f30f8fc2906678c94902ccc8eec1e3a0b1f58e92f2d5e312a6eaf26fd +result: pass +shared_secret: 7574902e5f3baae97cbb16c58521bece405f5d79f960bc055cd6f45767b702b5 + +# Bit flipped ciphertext +private_key: 4d07379f1703b1a9ab5db0c82428c41ce768d6518edd08cd153ca8c1cc4c696777345781713b362cb3749ef431f608c050b4256e1ab22476c2ca3c95b6a349cf7531d3d10ddd8a2ed27c8d757bafb05c6d46e4264fa3241f518afd51ba075211dd2a2804db677f372753b3ce3eca0a76b12230540bdba57c7bf313907359e32c5632e6cbebcbca9ddc4d3d415c39041c6b050fc3a4405f7bc780568e66960f71668278e71b7bf953b60c5d93014bb5c700371bce49609ea9e6c54f529643aa9274b3a6921128049abe3958cb4b042b754cc1fd28ba1ce69db8c65d295b819bb963b66ac3fc58554dc9c7b71a14e85866f827596720c4ac34970f55b0a0f889af3a202c9318fb08c684db195b868c0311ad704c5641552555e27741363b7bea9cefab932b301da6592092282f94fbc6a6556f384b3bd1eb814a079e7d87b14d8c4131c458618c94e5245f5097865f975d04425a443ca42f8296206a24bd71533ac0613b145abe569564f82f74c5b04b81af897bc27ffc11a79a8d94c112df930bc3db406c9c9a27c627dfa2bb39e482978a9a354c6933229a9e630568a7c06ab26551d0c5023c4f90d07e80c5aa0f4b07670c4523f142ad383ae3808fedb979671739782881f0e83aa6d49915c65a942077cd722dab5ba599614fb903afc2d050e6827334b408d4ec06b3c44784c90a8d86bac4744231b8b544ac99411153a1540766938120fa46c0592524315d4fa1854bb50eba842612496b2f55206854871fb204ba299057145f09b0ab5b8667f5ab3a9c348f41c97351f962ed0b3a28794871db6168e27b69e27911c7175dfbb8f40020652a4024d82188aa1b8c276369ecae07fa306f358ba120293cfb9e36a18f06078cf9b965e1a6349ca01b41d4b59f171975e68e9c698fa036242061b824db5e74d86e477c42485a013d1270c45839561c9af8ac158b4249b041afb15017d200cfcc6ac785f3318adc7e494ccbe093256b24724ff9b6f98c15ca8841f50c2d1906b5975bb56c27ad6e92c4254b10c2340be31693cd6242be4c1a007103d9f62f6d3068c1c77b478789b7cac854c9863dbc0eaf088ce670196096712c3a772c904fc5caa357626f60142f06704d8f5133e776c1232461a7e8ac39d1004b8119735646712cc81ef7bf93fb3776585ac56a6017416aa1470bf8e40fcfd0b79e265c61e2a51afab61b4c1dc62067f6e685795c45acf17b03a55562115418cb381ca5bfde783349d78a79acc91e0a5dfdc468da963c2c11054833c60676994bbc12a644a86c2a0f765333b9625b74c093855b2487d5cafc65718da6cd21eb69d5173be275adf7443a0896c55aa3c37dec24d511574d1c2c8fc5876bc9941f28a49cdc1137aa2bf045068f943579679df093936277815a758fa6476ce2767080da6b30019ed8a88179a1bb015733f614861070a6d1d51075310a220238d93229d051c32ab25fa69348ae8cb798ea510d760d962a8684798cc7242733171f8cc1269df34398043620b9cfa5c324053c5cd75444d3c4a18dea60dd297fe9179cc4677070970a90592566370af8592ad76753179c4c0b354fce644f8a2894221473ab3bc585324075c57d9e07a4771211bf1412bc9428d9f25e56553bdfb997564866ee083a29981e8bf64c9fcc5a0ed67ce9019361334c431cc6e02983e3ebbd34b93cfa269b4b202fdff84631d27c336a90d56acc3a6254dc8acf08f31d92365ce5389184f7b35df62b2be59d2a07b29ca511a9616b1932ac0d52196c1967690563901b1cea23aeb9e4c941e0470672695304bc8a07b79931983aa31824a141a3590f80a651ff0c8cc4228349d835750cb4515871535a4e879863d6c2a67dc2be51b2916843a4451c5f66606713b9b4a3e6bf00a22e64a96edbf14737f875b7c85320d9bef1817af24b0a0639b0f22b012f386972cb6f7aca389cc44c636c38179673f4e1013e5a963378544dcc0429fa9c5eda8cbb541c88c005acfa54e66339fa903294bb7079f609562a4d497c96c08a89cf564ff4c1341a73666a932ade7a279960839fa87309c7027810758de0b94bb903ce56bf58c0cb301c83b95831d6c307a06c329bf46f48ea61700804f2c03f88bbcc215b3745f75d5c4703389224f8f567c1fb1f0a2c2ab0cac18fd4816fe7be8753011d6955075283f8140f4d6127cde88611496e606248f4bb170e2ca57a735c93103c75c657e2ec817a511242c101e709330c700dc4fc015f622e5b7a0643c20c28c3a91cb72e458a7c3c206fd4a6c53b736036778062f087db81014c321d82c94fa5545fbd618d4815cf89c78c4bc6c12e00674aa05177e50983f02cd1c7bc238386d0a7ad3e998404a409ffe8224ba69301516b31064cf7b666b2b8b8be96a10c8a3288906e99974900e956a14cc12811828fb51b55685ce8cb1adad6b063ccac7298572e165e3b0c42f1845b4df5b845b72cef041dcf23725064628a2978be8584bf1bbfc87b0e42295e73e0007df05ad9e98d0e8158928124caa5944c1b79c5b6060966690d28804047672b1bc2cb3242be2c5c9b8a4cd53aa9b30c5975559222d00a18044646a8608c8b17902972a9fb0888d22cdef56b664a18e1f5689e731538c19a51921111fab6ff6aaed3e701fee2774ec225f27961abb6946d33c524186353245fb622b62eaa36fc4c02b33c6521d44f715babcae56552e060b2772b0b560e80c2146106a1c7ea0009a718d67b8cd672ab82ba0378d17c3c9029eee6b8e34a11a73b1f372c973c4a039893cbb4e84c963c4624c10398eb1dc0aa9c7b0c066878247d1b7aad55ca00738baa34047772afcd5c5ca054b0cc040d89e68730a46737061b94fb0983c496dc62b64461ae6d87765b3729d157519f48aba8478162e27848518f51f329ec05c04839341d62c0b7d203fcb824afca633aa9bd3406253bf11d206ac46163197a674db930198ef69377c4cabbbbcdb2cb34ee910db852598be0c5e1642737910456d577c91c057dc686ed2cc91bd4140ae314e73123ce6849f1ec3a16d3be1f9a2456a44f8ca70e86ea452f14a3a9bc235eea8f8f53a426b1020519b44b594e02b27b108bc3ee5243c5f747c2b747ff7ab42543c27b7a5bc30ca14ffc6c6a5bc0907603b2a489b735605aa65f71450cc5f188b766c636014b36424d77a7afafc66642961bc55a579ed755a543a7ee194a15e8590c58553d98c20a29200201b570eca860486cdb8c5349434085d6cc05e3c4df37c21d05010f74d224e1947c8faa0a1a17c840a55b09daa3191a0b421f4ec9fd297ffad6701c58cc01259fa43f7dc33a5dcc621cfb93206521a2690211868db998834f7a69485ab536f1aa85afd7246d1c350ee5b293c6bddf9d9d6199ce49 +ciphertext: 211381914f3a38f4980b186cb0ac14ae7240b714bea8d7aaeadc7f9ca756401c4d2f63a323ed033ae28c1b652f62ed7ebee0ded16fbee5f0c8fffc563e3ceefa74c6786452d45e00528c34d66769bdce91311750560cdb67f30790973701fcf3c707c672b398c43f656b01469c89bd8801f66440662ffed68341c13ff76664192f74dab5f35d191dff5c9347a65e93168d173a683960601c311562c5fd3ac77b8f4bcff8739bc38fabe0a1d92bdbd1a6f7dd75502a1953ea7c7c1610c90e1dc95592ae4e15e639245d1639101be9d8f5d067e944059fffdf83144d4a0438379be0ddde7060e736a424776085f7e318da6ce28c29a220c22b7b5f4780404ae57144d38886b94c89bce83d24b5435195b574b16f8450938b4b357f9472ef309304aa6e10b5a01054446679e86e162352e5b93e8c3ea7bc1ffbb685f7ccf97518666dbc9953a8d95df9b04992d913e7a9a6544c2413b349746f4a49896d3c8c05342228f2b557a50fbd9bbe4422979f591f2db954a06094f34fe5de34b581ba2658ffe1d24f4230a20106e4adfe677361c225b6bbf7e9a7b4237608ee37e9bec564a461171e8d8fba11d3d5030962fc35a5461d57c1c4aeef63f651b32bf1c198b3e3a53aba9f937fd22ca77c5b6b0fd0104587bb5c7c553370bd0805b2a58e38b72c016d14f418e43ebe2ee8e56e861e6d24b834124445198303ab36a2fd1bcf68ecf41cf3cb4d431eee43015d373434d0d2210839a87c0f92b2f66569c72f28e489134a46d6c83915998fa07144f6f6a0cb59397fa1a875f9936aaa1d3c57b32ae53c47216e7a158e795c97ecbda0ed91f4dc440e071601b1ba54c3a97d23fe513cc7f5d8c29206fbbbccb5dd447a05457b9453fc947895a0ca5995eec4292b9049a9d51010cb20c1e8bb2c3724bbee2c8f9bb3e09435964bd9ad45bf034beea33cbf9f949788a514dfea1f43319b361ae77c758e228eeb4fb591eaa64c2203ec098e4b833ee7c24eb07cc3f0054fe9fe05caf0421b2958a469b86bed766bbd131e7051e45a36787f2376f397a25fd17e62c28edce0761795a0c9757bb3511146fc9b77b97f37b18b8e29a29239fdbf5150c197e9523a315f0aae889ccdcaec4b80fd62bf55df5ca7f1dafd4d4a24a9140e448da70e6eac3e2f40286f85295c7fff9a0e551eea47fbd4df40c848006b4e5f574ae6e3ff2af30890288eabb9f14873e79d816574b1cc1c1d8b383c3f6a26c662bb8f1811d4859caf572b188cffb25466c9a90bccf7f4718abe023dd349828868f4ecafb265fc5fa2831261c97fb28c4a23ea4613f5f3d3307ecf3e48060abc18232b0726330bdfba924dfdc125da665aa15eb3a075888586d8d2d206e53bef5f940a03e17ad68eebdfcff20534c887daa65263dfcc4e002f14852b630d0c62de70f6f142d8806fa5532708c16b51bf545b7d61c561e9c12e56ed82e252a4033184b3240db6b151ece2b6a7df9bcce77c6b8f4420b34b4b4a22f57b2a6a4b770376bd3cf02f15a96746ab99ce19d7 +result: pass +shared_secret: c3d3de7e8a73ee49c43244e9e97032d4af6cf0d6898e72f0c4821096bd61349f + +# Bit flipped ciphertext +private_key: acf0b6a7b2c487920142e3a5afd48ab700b371f43ce76bbbafb95c88dca20ab64cdb59259f707d5f265c08d16cca321d09f0652e56b69ad61f270455fd1727c91aad6e08b5d417bf132366c5e29f2edc601b3788ff4965c82918effa192aa768a44875de25527cfbcdaad50862f75b4e530f37a300abb85159ac505539ba82b70b0367c830cab1dc20aa4840487cc5c262138e14a51a0304981fc161a8382fd04688c3246375a96be6226d14b3145234933c85b0877a4c8509861128b86d81bf8c496daf898c67569de4ecb264a93ef5482f9fe89a397011fb607036eb0f6da2b535899019a9763575aee3b6966781572ad98cec6713d76078ef45ba446623de745736fb314337a1f3f121f71094b38572ac350a5c12b5279198b6635445051e6d251cdd1a0996b6906da46d8b8c363ad1c19b89b5fdb835e6bb7bd55c5a6e5733c0d712b323c411f6223a2c76542551c50229ada7a2eae65bcb99bff7135647bb5980cca591a305adc89fcdc43feb51439a2926c50a39f57c284f2a309fb5bc4836c6212c2802033b0dd0090b2656303108576256440993419c97c1333f5458af8b38238889971f66523c4c6f3d107d23b872f81b25e0d50191b9cba9578f5a15c8b6723704a49852c3adf2d530bb2682c2146f30f3c2cd53060f0206c9ab815eb5c0e507b26a8463d3b0745849b3b6bc4bbee45fce57cc333b7ae94c27ad68a1399724f2708b3a6b9130d47daff900ac9c281b42abb0f670c72bad8e57b364ab9b2f68686bb505898328ba3537760684ec09ad34da1e3b47c85882bfd49665d4a030e8e283522b85612a29dd03a3ffe31bfdfa184cf8a9f6128dd432b561dc8bf51533107814741917e96284d8b1ab75a7ab5645c9042070e019451e9421938964739431c621c9d0a9c9b6ea0eaa8cadb503ba93615a23fa44671a5f5da4a5a8770eeb6b3ae8fbb771b31338ab07343550bbac8a68040691cac42932434306189a2754c6721ee4ca35d3ba4a501b755857638cf1b287a6a7d3aba4d7e01f8587c98502a07c22187709170df2be5c353ff41b989b567493e42ec38668b42c4ebfb304a18c4890f85977e392a66a8f051c04da44478b502e7c0568f41221c0c3a53a9900b1b9094955b8128b3862a4b0b6bc71c532909fcc94a75697071662f4fc1c789cca1393971d7870c87c5d280c746c459b965069a9648df70b03d0aa7c8aba15cd344d8edb0c47f7431cf49150e401ed389b3d84c208441787c11d6b9a09440b778179b26480a2a6b377210c3d7b46bb0eb20f164c5b966359b7730653cb8f97629c6f798535d9690c3590809bc07eb6b7e098b4fe204338d6626a6c178727ad0be7654d8a5f83a1a45e6c2656752d1c3625a047b9fb88b10ae9674c157c3c4c67d02392982ab589e83717019b06f8af5a87a837452d7a470601713c081b920bfca4469a5f16a0bae6d53b4ce319d47214a39aa2e0c1341c8c237359a3f83ab9c3a25beaa4a6d872077c136957c933b6b203566ac80649a209ba2b743282da0a7d5e03cbc2982c066077a5b739a63b32c7180e7b086a4b63cabd857f72584237749be7224acd3c0d1be466440c113a885448656d79fc8608c343cec71223861320023ebaf4cad67811b05c0bd732a4cda7c1f8c81fd0ec136789af71e7ac24e40f20613ffc207e9d4231fccba9cea06e647517856678c09176829c69bdc24d593a26c757cf490aa33d7331c75161d553c2535bc4e6f45144c154b53154423bb505e548ab001adc7454cc195047bc03eb9950b097717629c92324ac862a8ab24450b13762843704d285b331420ef037a5c1270bfb8390ababc165480b242089dd33138f56bbfe0cba199778b188782987a5de695e6cc29a91e77480833fa9b59603029214b25ff6fc49465b036da523c578578dc48079883cfd25bdb037c7dd6889f6fc73a6543c53d536c0f8256856828a65a1e7d06620446dc4c7406152aea9c39483b860b05622f38996be235514940e24381006a353ffe6634932803f1463d254384e2117e5114d64883da17067603c0e32d5b7bca8161644735ba865a84267c06c02f7ca92a2588395ea117f150cffc34c14f3a8f6f234cf25225d88876e036e466676970bca33e23924d61cb0367a70ec4f11760b8f856ccbc9afa8bb2966686377d161181b5e247018023a6529ac3fb6f2acd6a42455a10ea9f9a409689bb247c442826edda56afb2aa49e9c81a90c7cedc96c97196c333b213e446787ebb8f0b64fea52b2052cb572327f6f4168a8e59928e5b4ce60c384ccca554124d227940f4cc0c405482d28a783386d41450066e961bd6a2531738f84b82f6375699fd35b0c764c31085382732b2002b3a37928ae9849d69c83f656a691d2995876099da8533d284463ea08ced96e65f90ff2b72e88d03cd06768bdca549913bf1c5c1035ea58e915c52ca219a0ac6497267c07a5a995b49b94a978381c2a557c0e8d202c32d1b0f83646f3039d64e0c6ce4944181abb0b069314d465cec3976426639cbb2f243a475851c504b6c8b66932f602378bb326c85269e40234d06836ffa784bcd26a30430ce295b9ffb2702e340ba4954084a5880f7bbb0104bc3e73c4fd0900a036a7883320439aae54749138e5c54b1a55fcd6a27c0629e51837f110555d74cf1752757aabb3aea3c4639ca3cb4223e6c0cc2e849745332056b843e7b0b6b63a4f1dc0424c4bab658a1ef2565e11ab98aaf00caa0ab8b1008a2a7b03ad4c86b989302fe0a76577a7f612ca45d7b98a1b5f5c20c723c1cd1dc4820cd32d9294c3bd6aa8b8a96901424b7fb69ca16b51c51264f9629799178070772a304a164e28bfe63b0e789b146f26863aa31a5200cf36a74b45b7b2708b7ed677c47492055e793d654b5fca260baab98fa1f50e4557997c7845383a3c4521885fc570f0d70eaab63866a179cad216f78722d3869b28f4ac036345d8c1c9df947d5a2155b31c98ff2b608f265070aa8f6cd63589c5c7f656ca01162377360bd6c9637511943155b0506a892b599a1a495e25304f2ef3b2dee80d47b57e5ae2b39c1907a4d77b1365c2f3eb66dad40d2ecbc2a0426f127ca82938b497014181451f902b355602797d0cd01503a25744025db12f0a6672e250a6cb4333cb50998babbd01473af9f5397e816da21aadf3009049c356e8c4b72db64a1437c5ea71ba7c7c776b46c4cd46b1f0e96d917580dfab4c36f351a847140c6504ddd4987d5db6b2f18f4b01893411dc984bdc51253178383ac2885c8daef5c03257ba92b5529e44cac448a063bb8c5b2b540536017e176514a29206860c0e7aed3987ab41cdbb2d50a62d85e38482b01af69a14890e73789cc93bbfdfb192eca7b1f8d5 +ciphertext: 2179ea5bdda93b932b2350fad179131a81e28ba77e801c0b655d154a84224eadbd9d53fadbb23677061ccd4ebaa86d140c0b707d558a0a95fc15e038bdb161b399de90699108442119d4c7ee060db4bbd012321b019b90f68cb16ea9dee5d887e2af20a076fa8b34d978c4cc5f153d85b43da85c7c0579726bffa3821049d9af853dd10ec3ef06c5a0d03bfc3b168fad552328fabf6a46d3368e9bd8706c88847964dd4c710bea3337cb50d291be480601ee8bf61daebd52f76b9b18d7947d777f5a14fc60eca1327c929a0a23904e9c61a99710db3b86ad00ee2ea786a41bab1b05cbc7480b2a2cdc5f2fd56311ba5e47ac7a404fae36d9ccc614c881dd16f9e47d3c0a6e989a08d413fb472502806197da90611c2bf2e906c4d51939913da30d6799506f4a38c05d4ab9b089254cd87770eeaa65e31c1a2bf835f6abbfc96757275b92e692307e368b23482cad3c553ed99b164dd70501284bb7f72f409c4a03d7d130f0a1a4a80d5c284baaf2caa84014a84092db47541ac04c76a2c5d4e8e5ddfbf8691ff20ecdbd6e4cf2aca0edfc1597963640f7620b711ddc6ab7c740c7e4fe5861d32e6daefd9ff04d3168d0f88129bbeb07db9e67830e2dd3d7058d1376333bb8917210187a09aec2f4c8991de07f405c3a9bbfdd9ff687da7f2973a837dec60c3102394845c8caf78761afcd01dfa71ea140f58a75c948abe4946927301f663549f4117463e486360b9e704d29496b92aa40560276ab434db3fca2fdeb358d0148b3a82343aff5673a9d2a9416bec1f0816c7680893d74bb3bfcdea709c7921b425669e43a0ee76b7f31bb49798a8b7b11df068db94da9c1cfdbebc2b2aa9976ce2e67f408e2edad233549887f703132396ad5e956035fcb4511f140fe63c7bc402e08239e45fcbd64db854a2f292ac1bf33e7f41dad14cf3b1f2fc8a104ec2138c4aa6be32e96814a8fa56fd7e1f5e85f8b6989bdea9f32af37e73c78c6990ca8ad210b7159a96b2d9f798c85b1b7c8aac71979009dec29431679b131c66a4ed1cfcbc78668c59d01eb8ae29228d23368135fa24d158afec61f9c75312d2d887bdcfb09492284441c2cb7cd19a8f1871444e8bb7fb98f2eff695bdbc76556413fecef673cfbccc24e7472f7af5a62b6e29806d67325e03a459c11ee10904806f7be63ce623b2e7cf85d0935eacd24b3055b47579b7314b1c73603f83afa69539ecab4e1942c1bb3e26da1125e85d5a49b02d7cbafda8693d0c3e0dfa10934f001002c52590dc7df7cbec3722a58d77e828f1087eb003c67bd251129723242e822623f86f49703bbf575733a17e63bb4a8466131d829a377a7296e95a14bfc2ca17230bde0afb5f9199e9f7992ad655c458e57c46500f7f84c92d58c3a55ce4c0cb2cf8992d66949b1cc2f8c21333704a45ee30fa3d4ebbee75c0c5cb873e354375a61a76f4a7a78fc788b3a19d9ddbb85909baf88dd06f33ba580b3007cd45ab9fe0a32ef79f69235a0791f9a7a713e3f433e9a7adcd4ee2ad3db +result: pass +shared_secret: acbb4c519a7f495fe3fec1dffc2db71ee441028f7f2ae77cb379015e414d56a4 + +# Bit flipped ciphertext +private_key: a0a987c353709ea019be302bf2e9516aab92fdb2c233ba0fd932665e1a89d334607b71b262047c669b1f4af803f9494c394c8e81c97039569bfc9c678804ab99c039a2fb2a7cc5286839b2a268c322e59709d78fadf427f63a21fa345acfdb86e099aab5a290adb6afe1511db358754297ab04639974a9785ec72dd8c0c8206591f74b410f3b3100353a74974a60b766af55b3ee6c4b19e2360c93aa12ec41688b46ad082a99f7802284b6e7335bbda1cb87279a16745419b664d4b693e6895a4d094f5721ad8e2083f09995e5bbbd7729c667e04d893569ecf8b62dbc015564a1ca0651fec9c61fa7cd90618aeee5645cca0720656351576014a8c375e281ca6823b5b66e3287a30a9aac3bb59a93e539fbe349220a56ca771f62f31040782ff5b31471488cdbda8d0e716c83489eb606c862ebc1f280c703da522e78625182c462d0bffcc291e550278a8563ed8b74d6a0cfb7117c34412271e43473b5bc7d382896f26e0bb9500cc53d5ac67094c28231ca9a59d02fcd880783c271c6fa86a3d7872946b1138762e9621cc3b70297559aa2b3b9d1467a82f67fca9772c7e61f65f87f61e2383394048b744fd5755037134b10e9726d49713033579ab7999a29819c901e4b9b323e101411240778fc64fb9ab922cb84557b5fd1a7c8271588917016509769ec61b6c3c3bd5a7c534345113f67b4db309f2149b4847889e4eb570079183a801e6243c53e3aafb3790c9a6c70332c5006b9a577659c7c1a3f7fd4afac88ca49fab129f0c566526660f3779a62aa0ca33f8ea1ab894260eb114b5746b6c1955176007bdf7bc4f78c013c1a347e87a248214e70e9a61ab955365bbf44c11bbcb9635839b937ca016ad770f094038c5aa1980120799c6cd2373ac66ab9f070beaf952f17f5c7153a75f9c69502347a93092116a632b2f73b9b70188941420b535180b9cfbc2033dc13827b8b8fd32cc43ff265f1152ce0d51069287d26781afae947edd865f2c05c64927a5ba3466c4473bebc1df9a45b58a21011f17b568b9b16d50d4d953848b8824a02bdf3858aa5e64d8d9932ccb79e6700a3e5a5202616786a237c80209d43bc61f4129d37baa25f64aac616ce3711851368a3f2d30a91ca7d3044b3c4229816634b97a50cc8861712d5384ed46e87d2177b7275c599a9c7959b7294af46c47d5ec94b4a513962f8909fe540af5616faea565353a9b8568a6c9330faf49c5d1742c9b09995235d687c8a41806296b44d348112f15b07417610d7f66afcc0cb04844aeb49ad180706e1e76801168c9ea45a9a224b8e509cd82a9072975836aaa37f26264611c98174cf7a78b5bca66535b1bcf38ba5143931f0cb8ece605bd8c015b8a22a01310f79a06dfdf925007299eca95522147a276ac2bcc32bb2b09664386cc926c288b79e3c1c532c46b1391b8d44f5ba7f2c8f98c08311631f4806bbe9b123a2c81322f1c6d4e3c8bda03647e3aaaa0a1afbcb0098653e1c978693f12057218b8ec072727910221410f282768b7b4a4c4286d9d4665b4c6913e56ed11bc9bc32837fd14a4410c792a65fd5eb7e6f27093f92795d41acfd14729a6b9cb37494c6f58ba682080a4749f7b135110694acd3bf03b14fe306051115463495a8d6131b410799ed9a9d09c7932d74b84e3c76521192210454c9cb357a290f2d737c48cc3b9470873a42b19eb2458529882710ab14b5791df147fbe8a26785b4e8d74a35274fd793b1cbdcb09143ac39a111d8c71b94ac3e7963bcac170214a0733b15ca4ef376af7a1810e6434ebb95987cb536b40fd644ad88dbce6b359efa10c5076b22b972a87ed6cb20dcaa9f9a9b0ac12c2c6c47fee7a4b20646cf9127ae570e06aa06ef478de6e472c0794e0cabad83738488001181d72dd63b8cf9884584183b895a5bb0c2142fab16b6e90f3c36b256b942deb2b3bf29c8f889c838f34d458a64d551cd95f61e01d9567694046e9a553470008aa125518a677c881b868b185b065e7a5c4e065c941c48776944b2d78789ad5349ac779950079afc9b044ef6a9a708a0167740f5b45d503b3db2982158d83671f37f265459f3c7a8ed1854ecbc43148c6df4ab9709faa35999ce4912c68c58053e00716c80987651a2bdd72057b2a1a220356f23a068e46bdd7cb52a534d43129a5f063bff4c0949807193098444a5a249844aa0d50ed4833d93e0397dc49c4bac5ff49099e5fb57af023631f7b6a987b0e14772cd33433bd89af9fb1e13d721d36100c09cb7fdc8658974a6f85b89d3d9918a05cb2e6930e9d7265d407f38e132287c4eb2391ac875b0373084a3b540c7823bd9cb91e9534be9a23aee8c449122780ec67145200088b22c4fe22c132a3563d52067c542d35a42824499dc690126844daec2283493590ff3c7f7614a57eb1353f1a6cfe45a903625b3ea599c4954750c2562b504435c81012a202b9c6162f7252e704620a80ddb696080cc721e5868aa277cd26bab578a029a51c22f16437be320195c2c3d321aa6d197ae5cb568ab751bbcad6d60879136502b00cfefc9194f4b07884339ee460771f624b61612e77588766715a6a725e0895b63a4a2f54a1603cbb5297cc0e89213582a8fbb4c635620c2822c84867334bb132bacc3c16859bd3f397f02eaae95168c3fe367c067c6f4e260b95a91dd1605a36bbcd184bbc77a5130917d7401841ce3bc6ce6c870ba15eec3005b6437a1c8351b61824e1659134182330c5a02250b34e30e206bc64b309ffe5a930f53571f4c028abbadedbacf4b6a54ede415bc90391cf99e75131c733415124b1eada42b76e96a3ef8bbdee21836b3646c5ac6e70065fc2c52414a64ed7476b640270a9701fbc61a4978c076b58e2091907528080a168ce9a2ce9aa672f5846c80f99281c99ca297368cc8b6c7e21e28083c09a140ab523ee564cb3060039085b906db20853a9ba66011bc060fc9a97eec25cf34c56a9354a2fa3cb46f82cb8c69b1aa6c447fa9b172097bf07ac8718606756ba3e3c9cce8dc2a9558565c41c0e7e96b84259f61e08eddb967f9244ef4e461d5600be8a1371edc71e6678f52619625e84ed4cb7beee25c4d68a665bc246b3351cc781870c760b2fbc2fb469a42e02c47a6b0c37ca248373518d467764315bde763988005b3e448296881534066b4cba4113335c4650bac7829215a468bda41ef0b0846819aff441d231c20a04290e986ae18643f0604a64396057ba99c65086a222f52b4dc061e12bbb25639289439ee97ecf6350639536761256e1a13f768b15a0e9ee3566aa459d9c5255e8b4a3f31c88f61b27a2f29ab854d7595496b702446d5653b79317045e807ffbba9ffcead4faf3288e5eddf041415e7a6590fe691 +ciphertext: c595ade60560be9b568600c9dbc321096c99dfcf841f6d2677f522aa7a237dc4759fc9ac301f14bd6b86ede4d9c7b5be728ec97652cb572b5f3ed6e79724b566546b72cb6aced191cd3d933bb5958ce4553cebc1724e13b1be8f20fb19842e92408091ad7a55bd7cd4f19f7a4504096443ec9218cab541ca750f89126a6b0ba47434e7462460154e16121ca3e58aea045a2b78dac37f6e5f6ff7b688c57a17222208137f32bb70f9152085c13c3a8fc9a988bcff1adba668b8f9c1502ff14f4977ee469c1984e3804f80256125833fdcd5cf63e55a9cb6d2099614a4c14db3f083171fae005b3422b8eced46086f79f922a5d508b12cb6753f1ddc0b67d76adfbe9e9e670b3daa881739fda1831da7e2455e63ba40dcd01bf76f22e76f0bfb25e170a749cbb195fcac60314d6d430e87654eb2164db4434f2250480a0c95d5ab6dbc46b410df3b060f614229efef22bb4d1e0aabb400b0689507de4a71b07e4b691a8f1af7d786147fb6c0129b2c4aa98307ee01f986885826904fbdda1b52bba6c227eeb6be3ae82f1eb4299e7fce7d84b36f8e33f3941f29389a23863b922da1f3a07a2d2c7a7bb2b87f6aaff382829663dd137771fe8552723e413deddb4de758d527ad0b7140ee8a1e8bcbe5d2b51de4e0e8d0f04cb167e69652d841eab788d23420a7f877ae8e070499a612f9799ff4566c68b232ca26d39f93804848db0a09f4774e452551aba18858080e596f139eed1b2ca0aeb6d0c90b7904a6d5c5449f66580f1210fe9301a4f02be681a3a57d94ffd62c88f9a2e71fca8b46257faf593e6e07b8ec0f8ebb7a8dab422ce2c4e0c5e15e10086ee0cf564958f7786f0b9708c7a15107bd23979c3155e0f9604d26a1c53c7fa0875a73d11644162190f238e5bbea38d9b6657e621df799248245dac3fefb198db7a3097724fdb91a6cea0d008450927a1abd99b43aef10f7823fc8a7a8c052cc3e256a279089c57b84800f301b5cded958c0198277adb1f0458f9dee75ccab4f8fef0dc3a0ecda732557c1c069b9b6686b729fba0e5af0664f0b9e6ea287a77b4faa71a7edb27364729074f933051c2b931e54e982d95495d5ae5f08a25ab86e75fc8fc57c3b116236d801b7e66a8ec48aef7c775bd179ca25d1ce4f0de6a09e3a26c2c6561691414fd884105d8e78e8797bbcd4fb6afb2aa148ef229cdfbc3310ecd0d5fd8f2684e5a6737803594614d31bd681a30e65aa9f6236b60dff5d404f1ae113c9077bfb3b43d12c68df40c46a9c4a65202308fbf8d7cf2ba41ff4ccadd8865b5d6a64faa3977f3cf1a58e76a70c83e8315cca6bed740a8730d375a7f024e155ec4ec3692951fc87cc34be14a67a41804d31d865a3c2844e5343a3b314d05e3d94960f8108db025e6c96524e77928cbd6bfaaa66f8e3166dd3ddcd7aff4a8629586fa44fd89c2b836da6c15e56324dbb7448deab4ff16bcd69f4cfc7d7a2df9b911ec3eedf6a8a7f7013059688183d118f4c64c0bd41352d06f02c2afb4488b0b096ba76de +result: pass +shared_secret: 67efa9e9d933e418eb2c7a07ac2b8ba1673964b056530046ec8bd152e5cf9b4e + +# Bit flipped ciphertext +private_key: f93a34da82bd58c8be9a7c300a19773eb63ff9631ec824ae99470cdac5b06478cb8ab4b2e9d4201f524d1e669c4f76c287e109c0fa0ed101303f86ac07d5c35de5ae67a4420493c37d640de8ca903a245f54f4c2fa9966929bb381b6334545142ffa73800869ca813419ba81e157c672ecc2243c1ca77868341553009d2d8c812c54502ca29721ca5b597b515fee1b8ce0b4a6c8f1553d5aa77409560db5756399792c48ab3e19b3a32b987cf87bc7482c34d233b102b8a1e7c4798a8462e70bb3d62bc08a7c86f682e1645c391764aaf91f8af78f98f71b7447a85e5391819356fcd26fede59c47dc6759f48429c831aa5472c1ac3e494a46a6859f7b2977175567443b8e45119ed1e7c48f755ca9b073ea0c0558ca113ee612a7807621aa39234748cd55b9cc959bd92300e44c10a89454a93761d647842c48b46ee5c8820340fda634666785daab4906b31159e5bee398835e831cdceaa8b96c1e62006c2e6722de851849250c210151c0861562c2a455017775400d52ab94c68c656d37c6f3976a2c4100723b795fa7a77ed78a23e358f8e4a195b293888c30c08798eb446b4d26a906f76b583c35dc546101a698f0c242af680442273022e2a95d5bcae5c7b6a580c7a25671712b59341581c16b7a2d04658ef9b583a64acb9835c5a03c96861c410496ac8bb009b45d6725b34f7b36f138b4e91172fec13417f728fdda5bb9da9a49f7473894646c55c53822b90c07cc8a735d4f8a025765bb37982e0139c1ddc38f993a8522217ed8f30503a54483da6a73398d9c43bbd9088d0801a3e8e164d054881ba4b2e9e12c6487a4460b269b077dbd784e903b23de448a449291c4537018eb0655f57d3874bc64c1ada6ec4427da1c4a61316e2527cc80a859d893d1300065bc1b5676a4102c1e811112483c04f589854a5a791c4653a1acce65d6740e4baf1a9b03a3212c776ba01be059845c6860691f71059d9bac652ec8754de45cbf23647d18021f107a55bcae89128c7e68aef3e4bda7a8c85230bdf4a06475a96470932d44994175d5cdf1e45fe56298034c51f2e12eb1508d9b425f1af6999f810cb3b5a0a42b607c550f44198563d8c13ea9715683bd56472eb46791bb8b700486419c05395fd19204415d87b9a2fd722fb2b742c566827e2777bc2abf559a937f77969b21a46569ca7358b5fcabb2f296a6358cb0b511120ea99c5d200b75215d63a24e9fb9c21a3471e9926b976095a01b6f92d990a3d6837182615ef75a9919cdca763fe6b40bf2663d6b2445daf693ea3b0a275c55661994ade2196f9390756a86496b76abd59df8b93883fb3216e36b0f586c598c8a6a251644184dd1d0253c1591170943e6604c5157792e988367ccadd490c97e0278d7653a85473a07c1c273acc4d6f4c9bcfc0c285169b3d2709d183864f939c39b443014397365392bf47d812165d6d49379a8643d24bf17f9cf73f48063fb8633f63940220771d26560e27dd6e067b0ec80bfca563b3341f579aca0b478e8232864650911b76789e3ccd44b98dbe56e58918a22c8b3f9db3496d0b4f1372be238025c93654369314d6012e6f37937622b7f2c5becb12ce68878eba43cd63abda428cc4696a46abab941188077a64909b40f1c25ca0d504af5e48f073c6a42e400f1234901234f3942031604195cb068cb69c11238c33e076370f6a668064acd6255559a0a245c15698301273044bd34631514bc3ee4701eb9bde710761458887312aab7954297e1810476615942bb2b7777c6d91f5850cb16a15bec05c2dbfa3f88a2bfbb6721fb192ed42068ba945f80526143d763cc285279c48f472155e45a95b6b8c469e108d64904b62a52eed19361f0704d102f47911273c1ae308ca1286143c5c060228538a128211098a4012c6371426bae148388f7ce7eb511ec58a8311634dbd947b790b6d2ea4699f579cb2282f6e9b390755bfc4318b753ca3639a72e31c69a3115673663f336620af04892814a4d37cb7b2958d0751d87e009a9ccb5ee6ab862a1132700c352369536070a44f400d935783b987367c676ba60934ac8a4f4401e8ab3714882a5343cac52b431ae699caf14b1fa585669aa5339841d67165571d9aaf311052e616de24526fcb91ed84b96cdf9b4fdd8328c5813ec818a12721935a0367184cf86f435bb65a4b74c1e25111c9228819612a2891447fe56305be23e627374cc49930b102b9c4601fb7983ba0ba42495a8d92905d231c885f9c6fef5a213d1c7b3fc5b5f52ae5145bc123492a44b8afd13095f091fb73824f60071707997201b1b767c69156ab52ea98101088e0996a015cc16e95137ce729ccd563d6e02a01212539a44321e070e4714ae92e6af931cb5015ab96d2a727ba042a66a8963034616fcb007da142699c2fec7cc2c11a0a5ecc98c0aa2c2c9aba291907b09bc408501b515b4dfd2531a87021a088cbc37875213ac86c9c51765136fb4a9a3d9caaf4a5b861880655c9e5f509be2b96f13c7398c09b990c54dead456f04972144710ece1cecaf853d2bb226e35cd11a672ede78c9fe8a20e020500862210e8c4a3b3473e21a2b39b888fd17497c15e2739920b44ab00857d682b94233527db012ff07875ec184fd52ca208d64154257d5b755ad31baf9760885c4c53bd462aa57a4f8b911911b4afd046426ea4342c9aa970ab525995a90baa3936dc909eb29aa40479f1f6acf7d298b65447976487e27b38b5841d9de74f284149d87616f7360aed7b6f365a74bd217300ed702174232a88a0a0fbc59d3287b6319d37e873faf06397f503684a71698b227d94b1db905db540bbb0dac82934be9ba5cb03427ed1fbce1be0140aa7b0a1e322b3708b61e64420d01e8664250a7056efc40ede1910303631cdfbcbe9124fd8b3a302d9a3876291a4197252db5ee4212697191bd501a86dfa011e98b841a97e332914ce8135db5a8c64057842b466e7b54727d94686904a93084462fba0108780667b167d4bba660bb9db805f37237c51741584a16eb8cc56b2a98e2ea4c03d1b5f223a5f8dd6b2f4fc3f3fc2c856444025d1043e1348a1ec29542934e47a17e02b372863b1063673269831da370cec8a4104835df2fb6fccf48e5168c7f090ab64d79bd6a520a7fc26a939be55c7612eda70d96912080c8b963297f80104d5b57952c0b976f2904b726b3cd4ae0b7bb3600403b4d91cfcc72fbdccb32c477e50b7a198cc3a95fc0755c6932a184d94c72f1bc481473f9400280fb102da9ab408023e11c6d096f8456a226d96a4452509602046ffe11099c758bb5588332e38a8a436c9b9e81738efba08396a6c4600e4912eee10aa277a5bc25505fcbcaf9a017c9aa66bedf10ecc5907154ba75d +ciphertext: 730a15d5a5a3cbbb90726d46e4b4fc662a1dd502b31754803c87aa5594165dae6146d56f4661ffb25abcaa9aa830e262d0afdd72a32067c52c51842e857e22bc375e90d783a22813562e42fbf24870300cf26cfb38e4fd0d2e3b9efd61e39346571265aab2b52a777f98143c32e3b8421ced5b3ee024bf1d9d6dcc565b503bfffb8bd6ced4f7a156022b3dea37c4dd0fa8433d3c71494cf0a5d5ab7c3a2a7203d2eefb38773ed3d36455867ec3d5088bec82ade249c971053eb0445a3cea079b61d543416fe71b170044603c7c5397febc97dd8c185005226246e14d5fc09939c7458c27d88dc3e0530e0dad4901cfa1c02f7a646927d65f3812ea0e9b136faf5e9a8b9608c9451a061ad04b070f8bf6638ad9b5d4a82c78397429313a0873790e7b47933b027ecb1f0ad7994fea752d5641be5b06a77ed987fd2a1f41f3a05546abf6d0aa8bc9aae8a66ff982647786bbdfde07bbb7a6adc17b8c56d48707c367fe2055f1f1fccbf407b5090783b2dc8391c0387506ac307fc4fcb029491a97437a1b501c9f7625633c6ce0e83a21a7b7aba296ef65d6037bf63e3b95eadcaf98cd2d1f971c86c35cc2f350b733fea27a005c4aa3b5ec59cd3d3ab39b1a92dfa3067a421704e1d99d1aca2fda0060f5d96c1085cf5f38b25b43b68c140dfacd547aeebb65fb7af5708fb737234494dc4334b46f219b82911f1d0782990cb69dbb7fe80593b0108dc5602d29ca8796feb128e4f93ff4dc0a99facd0268df07ccc54a003ef60dfd98c1ae42055329a9342a55bd555f0189018fb0b318ec0473adf9452a17318d4ddba332d8011beeb48b2e24dd8caca083b24ec6577ec637cc031af261491831966483cbaa6d05c11cee9a40d835530c7558eefd85267be3ced7225b93407e6cea997a277ae5f344018adba0921b2587a3bf8baff9d388368c9d087155a87b0c1ec746b8d18871eb2fc4c41e50b991024d816298b8bd8c515bb3d17e0daff751dc76a02061a9c17010ec196fe6ed0786d5f5dcefdb03c5a559593e0abefc0391a10c0ca52d0c291cd836ea3acca25a3b3057e02872a0d79bdc0faa10de532979415308fc88142a461ee26ff0b78181ea8395382bce438eefb8e558381eb3db844d98a747a6db41ec2d6d43cd2d6bc51de2a699254fde0980e0ce6287b1489ecadad94482f629004b1a7dfebd1f48f6b5997a59d6de4c6f3e68fd8cef1c014d7b7ad4fca70c402573276fcae7914f93ef3dde8ab56e1f81b38735394e365bce6c1fda1e1970e6a427473a9e8915fbde312969ef689dce25d9abf28ec85ec57efbc1ae5ba0fedb3cee33e7c595e86c00d998736e9a2589843832c57f216b25f5db32bc014142a672b734b12f935d09cff6796b22ddb690e00e3c3092453ab45528512ddb9f4c10836bbe2f30af45d670591048a2bf9d6779ca10cf8d88c2dd9d6b3217fa7db62accecdfc1583f470a2d46cfba3beaa8a032d5c3f40bd0dce231c407ab1cee868f16afaafe5234aa237170093def8d252c3a71f68d +result: pass +shared_secret: fe61122c2de55dc4f077f00b10b4fd9799580aafc85947e030d6f996f2797c80 + +# message all 0xff +private_key: 17ec419ada2c0d918b5567032f1548c1478b029621bacab901c8031a8014d7f1335e79131f2ac7fbe7c30553649b0b305a1695cba670a8a90ffd980715ab36697b21ca0a43bb9b4dc33ca3b20c2ddc095e23ac6200e8542ff64900e19b69a242aee490e5e08331da623bac61193a5ae08055c78211bd3110620855c3e879729c9d0abb5986c30fe02a3e2e6614cc027a03a29952007e07c743c1f378e0f6cb50a334b5ac1a415665d5b310a91a8d480a5e50450fc6848f4aa407c594a65676c4c74179b1fc4f8b15a8234c85bfb61dd5b7b8578a87b6f4a4fb1a8a5536202f4b211de7b66489c589d16a57a6bc56b6c47654591a234ac4c2cb72f49a356c44ac29142701046616a1695b4e9ca191ce58c5901ca792440c8f8092b8714464141105549795e392008763c8a059087249e5c652e82a0c4fbcc2fd8a09b6d13eded3b994969964d2054a6204f6a7383bac8773e8934679c48926b909228b59e78ba2eb26ac553cb9b3a8c0b0458cab9b19f840ceb5090dda91b26a83f51c9eb4a75ca8829c56332860017b82c3a26600338d7c444432c0fc709e3f9767064b638a6c0da4bc1e74a60265c69ee2abca73841d73296f6471afde11a15c60b949a88c197c5fc9c2b24f89c91d995b1ee40e749c19c4292d18e28adbb86cea7704a1a36632bb9e523c3d1c677e243369f53527230088c2e73476e881ca696cf23a4ebd29633256150c3371a19616b117778b76806112c8b4a75aa28c85eec1254cb8b2dc36654d45901581661660c167f216d3a34ebe3590688b738f55a976eba4de297352606f0bf99fa0235a21009cfd302e37938e44e16f80b8abd2b62eaf41068437cf1b02272e9a5a5838193eba865f0696b5cb9304337be5961d4b835ef0ec1cc3ec8d6613aef36c3a512773fc9c09a2dc0fea5110abc794cf4239a0fa9f5632751ac00586ec8fe4800dae5b58d44774ad9b17fb65c9e6faabe2902d293347a75c9da54b33fd436571c4963216b876153044414f3116884b389a7873b36281397b53a00c1b218b6010db253c984204e3e81ad04642bb31539773af30c0707269c3cb214cf59733bd3109ad190ff7599a8afb4863991feee1bbf595459eb6bb771b1749d32d03a3aa56c0c4efa81ef52ccd5c946d7d593cded8828089b97c9b4b171333a047a9a671b85bc64619f741fe47609231b0a661276fa144d2c892693a506e8c198f33c3f1152dbd494136e9b560711e7caa49b3e2cb43b3aa1773249a85be2b6820981b4db6a330fb370f50fc6c21877f4b9654cf2bba395c7300d9b6880c1c14a080eff83f7ec0177770223945bbcd51a5505822fc275b70451113acbe7e656de93c6afb3189eef27ced706f88861060754e7a938dd1669233e5ac5623398f523a3375be4c71798b87bd7c95918f74787ab6911ec25d33543d3a58cd9a892dcb2a9f566b54832172531c7765fc37c0047e0e9a0629a89557a81a09f3ce365970e1f367cfb3c8b0f7b4b9e235c72404af31965254247afb1b10951cf8310439ca71b0b5c8c78aaf9f7b147a3a97c41c18bec41690f44e9ecbc04ba551186bcf3d0a137fc4c6b8902c8e95b04395b91b1727722342f93933095183a724cc1631c132372a8bbb5d7378c8387a32b279751b3013594501d0e2b97088489441aa69e8008da493fcd748703b60fa62afb52b7ab4ea9323b16cdd5968cfd453180a5b190747ac960a127cc7802c623883aaad559ad49aa42c9243e6b9a434a193e69432f7f0af6ac35ce99c3546f6a5ab8401cea70b0b36cdb2147975697d033b49b0520d41f0808218c9b2178718305389f553553bb471e20a142980ef86bb241856929b0fb579681448a86cb800b69724fe3296235090438414294a79916a694624c77834297e98723ff17dca811460a4cfe524b578211814c8092c9399a0c0becbc472ad177a4c75acc7872a308255386605e0f813a7d5b827b1b3455a94ec58bafe0c3cd6e51efc5a2caf270df950a241ab7844db00da17313e182ab180cf994c9f50c57f51f75ccd03809217bc2009c82d52a62f284320e84346c8b8ab307843526d3a772dabc129f578283ac25e1500267dd93a3f729d21bbcdf1f9b9b7c20f358a18be0a84cfd01ddb8b1b9b54bca275bd4b41bad32964861a1195aaabc9e891b216352ff18b87231c032cbe6ba8c32d190d675207c684cc3a855623a5b3b54c8650c8c075bb2072a01565519962701ce67098eff18d99fc39742b1306a67a3c095d5c3ab9d48b9ff7ab3615d976d6c601b61c7dffdcb1c4f374e9c998b1004a6dc7beb69c5966622b8352351b2194e8809a00f93514b27eb57562e7a6a95b88cc4627215cf30ef9a8099aa1c1c08a3586d88bc6aba898c438ce8b359132b2cf31b83499af96a69b3f952cd3c6047f88a9430534d09a42c1f1cb57d50f2eca9747ea8132d3977d0c160b5a0172221a97b86681374f2ecc65472c087211bd1e2c4de9e706b808a471692d6a04c233b28ce3c921fd222f403096c7a285b23abde54b338cd18432e056e444bc0ac49074a3c3b7bb842c2c9f88b01bf8773afb1a81161a3bd4ca6c8570558dd3657a396d7eb564e080187299bd224454645471ce7aced999b31164b3af63821c86069e95007b305b6e551a1bdacc0ddcaea4f93819948295ac45142730372ab1aa71536c60051c6b6f23e851ee282ed16cbf5c77674a635a5fe992f8d97e4ba39a272ccd2111973790875bb94bb6cbc6977acb4f8b700533440964a5962632a3fc5dd219b0b50c441794cd7ef15e649b709f4c62cb68ca9fbba191832966d1a1820082779a82968217d963c26af89690735dc42a077b33bf6765b0f2b59eb59b815011a90a9090106a6d8ae52b1b5899313361e3634b5afc90c32cbeca86542f19819f58a8e38270dce6a3f6953c8e15c645591d89e3baed52c1b0a1bcfc7cac1803bfa306b3a426ab5bd185634a4d0fa92c70e7ae2b538bd5c68ea442849a319cc749682bc398522607b9e05a2db54b1fe02c89c33cc020567d6a66b3a78212641c0a36cdbc3a43e38274d9eb86aea22b3652abd6a83d470ab36f2a9dae663dc2e512bc26703b93927d7b901a96c0858b4ca004cf9b359b8ffb3fc465445536716feb7aa866a266831e66a9be595661fe382afc472a07b6c664b00a212b57a4bbc70a707e0f808ae8573394d3414e5943a6f8ca6d1b9771968cb3a904a8772952a451b5319c6bfc62712a5a6a86482336c95ca4eb752481cc6fd4b22342e7c9ebd27dff8f94d268de99b246d34252184fcad377f5676cf58b8e8bc19701c0786eaaaaa80f04c6098a5e8f71ab315bf67363c4f9f4b5e160e78c9fe8d6d03f9697b1706bb5c347148e96b3b172f94cc6a8db +ciphertext: cbca6cc7f2b281d1c67eb91825e992cfba3592461868200490dcffaa23122655ab6bb977fe78a9246f9d69ffa22e874b706608dc3784f3e4498cca9fc6763aa2ae90571246a534e0d4c163c04d2bb806463c5f450b7ad8e7335a8c22b78d852c36ae6e544261299fd78b34071bac18e33e9fff3fbacdd9f1bcbc02560286f9b3b1ac88bd50211f8de3542a74e55ec1ccf86d3655b38b91604756b5228bfd8d5fe3e45328bc1c47bfe4c6aa26352373854dbbddfcb62a17b1593c16070029c771b0d6bbd120e84fcdbbb8a2dedebe673a4fd5199ed6964b899199c574668d2647343dd26001a57571ad67321aaa719f7be7d986ac4b2b2d2ac076f11119d4bc115d6cb5e0ae5024c1b51c8375307238ff3e76fca926353e82ad34845243a761d292f4abd515cec17d2af9a6d5b5bb1a7f63e3fbe7f8dba33ff216ddb2a0908157562cdd9ea6771c1b7b9b23916a88a4aef66d931ede645cee5ae9edd095d17726d568fdff8eacfddc6eb790c7a66107104902fd7acce80827857fb403a62e3076d3e2e7ae27b1fa1aee615a7d3d616f909a42b82a5dd8903b4c7df2b06f52e17b11c52854b1f34ba26a1fe5478f48b5d68ae8a276dc49649114c553141bfd7461a6bbde2a0733f55bd757004195f81fed533f134c8ba4446b1007ad2a1813ce94e40c5d10b3f76bcfbacd9cc560359fdbda99cc9f6e07fed62ba32c30e3be23013cd362557bd320031a1a0fa8bcb4c6f26b64bb9584a0fe5b6e9762f5394dda413ba0987873e9ed91717c96c6d85122a240728a56857993869568ea1f4f3a22a57ed9d7ede953477fd469e6d5d936019dbc45b204ea70f27710fdde4047cac39e268dab69959914eabedf5750fa6a99549f25b1bd4d01e7a6f5d86302bf8a0e21c3d2383f6db0e6eca94fe67e35a092ce19e196c27165646d43199a7ae3c8be21318cfe08bb551fa42fba6012f9adaef6530122d027f4056ef433524866617d2786e5cc1fcc6f8280b7f69a542dfd749b38c8df68f66b99b5b0038459b9a51cb5d3eee654f4ec506a4c58cb82cd53a883f9d5d60e3c2fad5b47e183e036b34101df037095cf5c6af3933fba043eda0104d02d49d327be2809031b4907dfff8fcf44062299a7fca50229be95eac0b2b7b397857c5dc489ac2edf94b4b6164294c2d611d3ea5293501932411fc6f3f76f34f6060597a29978416c5a10dad6d030bdadcce38c077fad1e353317057c9ac7e44587dfef6f849531b27d90aadf8f32591d0c462aa4312246f01aca8e5a58451b6d8400436fd72d99a96d8b8e9310da9d23813615743d01ede049c4e7152da854282d5565ac3266801c8fa6afeaa28fbd3662921d05634fed09b32564970c5a3c9888a02b7897edbf15a453d385cee14afc68ccb4782db627b214f7d83f1d4c3e6039b80fd0506397d78e6c41e1283f3e8f2c8b0648b6fefd453148746324890a33307a982a1e929df0e21f50f486d1673c2f0f838e2835c9733fa3daf4abfd41b5b3c256f3151f51bc172006803777b0 +result: pass +shared_secret: 0ca2714e446dcf6d2bd14bd66f674b8256d9b44e75b9671055f63249ed807865 + +# ciphertext secret and error zero +private_key: 17ec419ada2c0d918b5567032f1548c1478b029621bacab901c8031a8014d7f1335e79131f2ac7fbe7c30553649b0b305a1695cba670a8a90ffd980715ab36697b21ca0a43bb9b4dc33ca3b20c2ddc095e23ac6200e8542ff64900e19b69a242aee490e5e08331da623bac61193a5ae08055c78211bd3110620855c3e879729c9d0abb5986c30fe02a3e2e6614cc027a03a29952007e07c743c1f378e0f6cb50a334b5ac1a415665d5b310a91a8d480a5e50450fc6848f4aa407c594a65676c4c74179b1fc4f8b15a8234c85bfb61dd5b7b8578a87b6f4a4fb1a8a5536202f4b211de7b66489c589d16a57a6bc56b6c47654591a234ac4c2cb72f49a356c44ac29142701046616a1695b4e9ca191ce58c5901ca792440c8f8092b8714464141105549795e392008763c8a059087249e5c652e82a0c4fbcc2fd8a09b6d13eded3b994969964d2054a6204f6a7383bac8773e8934679c48926b909228b59e78ba2eb26ac553cb9b3a8c0b0458cab9b19f840ceb5090dda91b26a83f51c9eb4a75ca8829c56332860017b82c3a26600338d7c444432c0fc709e3f9767064b638a6c0da4bc1e74a60265c69ee2abca73841d73296f6471afde11a15c60b949a88c197c5fc9c2b24f89c91d995b1ee40e749c19c4292d18e28adbb86cea7704a1a36632bb9e523c3d1c677e243369f53527230088c2e73476e881ca696cf23a4ebd29633256150c3371a19616b117778b76806112c8b4a75aa28c85eec1254cb8b2dc36654d45901581661660c167f216d3a34ebe3590688b738f55a976eba4de297352606f0bf99fa0235a21009cfd302e37938e44e16f80b8abd2b62eaf41068437cf1b02272e9a5a5838193eba865f0696b5cb9304337be5961d4b835ef0ec1cc3ec8d6613aef36c3a512773fc9c09a2dc0fea5110abc794cf4239a0fa9f5632751ac00586ec8fe4800dae5b58d44774ad9b17fb65c9e6faabe2902d293347a75c9da54b33fd436571c4963216b876153044414f3116884b389a7873b36281397b53a00c1b218b6010db253c984204e3e81ad04642bb31539773af30c0707269c3cb214cf59733bd3109ad190ff7599a8afb4863991feee1bbf595459eb6bb771b1749d32d03a3aa56c0c4efa81ef52ccd5c946d7d593cded8828089b97c9b4b171333a047a9a671b85bc64619f741fe47609231b0a661276fa144d2c892693a506e8c198f33c3f1152dbd494136e9b560711e7caa49b3e2cb43b3aa1773249a85be2b6820981b4db6a330fb370f50fc6c21877f4b9654cf2bba395c7300d9b6880c1c14a080eff83f7ec0177770223945bbcd51a5505822fc275b70451113acbe7e656de93c6afb3189eef27ced706f88861060754e7a938dd1669233e5ac5623398f523a3375be4c71798b87bd7c95918f74787ab6911ec25d33543d3a58cd9a892dcb2a9f566b54832172531c7765fc37c0047e0e9a0629a89557a81a09f3ce365970e1f367cfb3c8b0f7b4b9e235c72404af31965254247afb1b10951cf8310439ca71b0b5c8c78aaf9f7b147a3a97c41c18bec41690f44e9ecbc04ba551186bcf3d0a137fc4c6b8902c8e95b04395b91b1727722342f93933095183a724cc1631c132372a8bbb5d7378c8387a32b279751b3013594501d0e2b97088489441aa69e8008da493fcd748703b60fa62afb52b7ab4ea9323b16cdd5968cfd453180a5b190747ac960a127cc7802c623883aaad559ad49aa42c9243e6b9a434a193e69432f7f0af6ac35ce99c3546f6a5ab8401cea70b0b36cdb2147975697d033b49b0520d41f0808218c9b2178718305389f553553bb471e20a142980ef86bb241856929b0fb579681448a86cb800b69724fe3296235090438414294a79916a694624c77834297e98723ff17dca811460a4cfe524b578211814c8092c9399a0c0becbc472ad177a4c75acc7872a308255386605e0f813a7d5b827b1b3455a94ec58bafe0c3cd6e51efc5a2caf270df950a241ab7844db00da17313e182ab180cf994c9f50c57f51f75ccd03809217bc2009c82d52a62f284320e84346c8b8ab307843526d3a772dabc129f578283ac25e1500267dd93a3f729d21bbcdf1f9b9b7c20f358a18be0a84cfd01ddb8b1b9b54bca275bd4b41bad32964861a1195aaabc9e891b216352ff18b87231c032cbe6ba8c32d190d675207c684cc3a855623a5b3b54c8650c8c075bb2072a01565519962701ce67098eff18d99fc39742b1306a67a3c095d5c3ab9d48b9ff7ab3615d976d6c601b61c7dffdcb1c4f374e9c998b1004a6dc7beb69c5966622b8352351b2194e8809a00f93514b27eb57562e7a6a95b88cc4627215cf30ef9a8099aa1c1c08a3586d88bc6aba898c438ce8b359132b2cf31b83499af96a69b3f952cd3c6047f88a9430534d09a42c1f1cb57d50f2eca9747ea8132d3977d0c160b5a0172221a97b86681374f2ecc65472c087211bd1e2c4de9e706b808a471692d6a04c233b28ce3c921fd222f403096c7a285b23abde54b338cd18432e056e444bc0ac49074a3c3b7bb842c2c9f88b01bf8773afb1a81161a3bd4ca6c8570558dd3657a396d7eb564e080187299bd224454645471ce7aced999b31164b3af63821c86069e95007b305b6e551a1bdacc0ddcaea4f93819948295ac45142730372ab1aa71536c60051c6b6f23e851ee282ed16cbf5c77674a635a5fe992f8d97e4ba39a272ccd2111973790875bb94bb6cbc6977acb4f8b700533440964a5962632a3fc5dd219b0b50c441794cd7ef15e649b709f4c62cb68ca9fbba191832966d1a1820082779a82968217d963c26af89690735dc42a077b33bf6765b0f2b59eb59b815011a90a9090106a6d8ae52b1b5899313361e3634b5afc90c32cbeca86542f19819f58a8e38270dce6a3f6953c8e15c645591d89e3baed52c1b0a1bcfc7cac1803bfa306b3a426ab5bd185634a4d0fa92c70e7ae2b538bd5c68ea442849a319cc749682bc398522607b9e05a2db54b1fe02c89c33cc020567d6a66b3a78212641c0a36cdbc3a43e38274d9eb86aea22b3652abd6a83d470ab36f2a9dae663dc2e512bc26703b93927d7b901a96c0858b4ca004cf9b359b8ffb3fc465445536716feb7aa866a266831e66a9be595661fe382afc472a07b6c664b00a212b57a4bbc70a707e0f808ae8573394d3414e5943a6f8ca6d1b9771968cb3a904a8772952a451b5319c6bfc62712a5a6a86482336c95ca4eb752481cc6fd4b22342e7c9ebd27dff8f94d268de99b246d34252184fcad377f5676cf58b8e8bc19701c0786eaaaaa80f04c6098a5e8f71ab315bf67363c4f9f4b5e160e78c9fe8d6d03f9697b1706bb5c347148e96b3b172f94cc6a8db +ciphertext: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008088808880888000808808808000088000000888000808888808808880008800088088800808808800000080808080088888880888000888080800000088000800008088880088808080008800888080088808808088008800888080880800080000808888808808808080088000880088888880008008888000080088088080 +result: pass +shared_secret: 309d56795b2a044fb483648e7f54d27bd98d02b2f8e5d6a51f49f2130c244218 + +# Rho leads to frequent rejection on matrix expansion +private_key: 00208080e8b3938b09aab715a0b7a09314c3d2aa03e900528a209c655886bf0180a0775a1ee133e543c17d7c24407131f0b813a9287c5c9939d43ba2c1f064015c1babc910d1024bfb46a3fbb1ae13dc5d8bb4576787a592495786a53d4c172cbd3b2cac6a2f5ab68fcfeb2a67a997d809800615c043e4bcc0985de9d671e6e0c8b071a20264c457c13b1f4734f234142e86c23170821d068210b29358694d8ff27e89c59264a315b6591d97d90ede633b68fbc36ca96b823a4bc66144b541cc118b0d60a66c89124d9080ae30f44b9f4793cfac65ab8b8cd65ac81cd95de566ca2c19906a955a04047052a699e8a132e2e48aab916278c49ccd1ca0076b5254784a23f7a8c164229bdb9b46e1c7bd4c74639053cad5226c598918687fbc50323f086238366c4ad9172346626b54ce142053de67ce8867cf599587d0a47aff0a7fc113140c18c40bb31e2340822cac294aeb3a02652b424ac9f1008a592ccf70170246e689edeab03dc0249ba59fcc6477fb668038443bf9a743255310df11b4c90a97bd212a74d5142bc6461a135ce7376995372a1bf919e3db20f22c683f488395a95e31ab13aa707c59f22e85d892830bb550395633f6c87df28401865106b5cffb75729391767522ac236072250c6f4dda196a90bbdfa183113c5fe2e31ba1187b4f682399f3c6c0288977904ab445c0c1b9caca030aa639b35029657c1608e3a654cbc39f8f096414d278059a6f56c8c838b1879b00ceff668190213eb15184a57706bd8c9111667f52a656d161bcb5e7cb8ef5beb6756371ba4297397eb6d0c850aac1e01025001b71a874a25e3ac16450228dc33691b3112de319f69ac29f2a1cdf02a0cd77319931003910331a6268f42669f4a90e79bb820e5c98aa252dcbd056318a050ab71f5d60028fc41594688cea4a95b32529c39c582ae828016644faf4b7b1fa6fd9c305807c43dbba54d44273669bcf956c197ea3462a30be3aabb1a6654dc4a72bbae53982ebb986e249d9438d66b65fa15b723267ce1fc1200bc26656d7c4e1839e02927a96304460a34a9c0a22ccf15c7390afed4a612ef236f9d00c22d04cc1dc362c08afd0a16536985f69f6a15d6585c410ac7a39599c683b9e67a33ee299a5000c7e4acde611bd6c817b1aeb1373835a245b916620be6ce8093f88635cfb619a963c99785cc5c354e5d025f954071e380876408fc5ac7fbbeb4c532b1f1be67ebfacac4cf907be9485c6da8da380809ee102af0c98beebb088c13d29830e7fca4dab8c1e8cc87a3b4198c50686c82626c41414d50878f403c10ac905f39a901405b93366a575338ed7d66c0a27c9dbc4af2d217688dc3909db8878000af307a989234174363f3cc35c25a42d7361ccadeca25a484a01967be2a65bf4998d57943759528d54e498ab18514a5665b87c98339c3fc01baaa2953abc1aba78778b26d54bdb2ab69dd705d6953dea404adf8c82d29b932e144f48a2661dc2129e6a2a1bc5242552374a504e0d135e6cfc9fb91a492e443c608c6e5342361aa8205ac744ecf974b667a6528938b6085492298e97ea827d5a4274ca359a1811c71a574dc986f4262b2e29256c4b52c9a22c3f168988ccca1c63473a75acda757b3ac6ad26221ef4f671e01461ab865f59c26f22c61de17800336b18365a190e7a123a34193f375e9f9643ae99889eda085d5317d5887e6b2c8999c133e20c49b3294aa0e064dec63c7a00acc1c08fabfacc28203e616b5a06f02e66e87fe1789725e8538b405323b9233fa61771980626b98b014ccbb9573d57d85dff1b000b38502af474add3a32f1ac7c1ab8adf93350ef1939ea376226a37c9675fa33503fcb753a1c86ca8c10e10ac74658944af239b48b97ca2b85ca4034ca7d662c91237c63c6b35137fd0429562b5856fc11662d0777c111ad9c6c34bebbd61eb6b538378b0123033c11ae1f0715553ae62cb27f15ab26b46ce4e540d39679ad9613fc91a35ca1073497cba5c57cc2c77bc75e7281e518f7640ad48451ecc32bb26bb2512fb76c9f6c46dfb6dad9c7be4762cba596184f37259143983e906002b34acac2be801c837c53771b048dbbca14b6c33e9ea7886c3be529a488aaa4deb590fdc96aa62a68f67abb4073b2f0f13a874fa7065e3c16a8b549987c5f2733ac4bca74be87f2e14cdf7d8916d47b69652244552a7d74b846961333a5755ec1179eba27b598333a07aad70626429153b7609a131e63c6bc94c32e345b9b293345598ae20a6f6cb25ff143f68e28013793183b5c9bc8a9d289967ccf613ad510a63c94c2b6b32214a9248fa89f85949ee3cbe0ba3a778ac7b754498dc3a79a95519606171608840587040a70aa1331899bb1082802c2aeef31ca2a773ef27382c2a84eb04ca518a83af9b44028c56427013b7036e441c20acf86ae09a82b8fb6ab2a234853a7b3ea386558a0bdfcb4487455a95c30cbcd54a6df965c2830f37c41bfef65013671411db77b8d69f6d386fd254ad7e175ceed98cc1e16190965b97e7375ce1105a491875007030c01cefc43e7a45615b665e073b0ba41a8309fc7cd70a271e71a36530c80ea227a9b57645899003c60e97609aa0761e60e8aa1f414518006cf1c62ea53826d53981f2264bc6c24ae072a2699886b75912ecc880ad6939b6a40d539232fa155b0d101aa7791cf74a1fa459ab8c8cafbe2911289312ca990fba952cb0253b71a792a5d9c6bfb31219e898c7125197f7b7a90aac7d527f62bb5fa7e00e106961d1babcc582590989262f1a1463e44d839221717b49b28980ea8b81f5f2cc44252c771b47d5550e3d68a8f5599aec848347ca728eb6c93b717fd6dcb7d8e338a6543d3a434245a44c2191a550794783212f44a94e46a64117f0b98157015fb0c6fb7564847703674945ca3b272e14aaa3a02cb8eb7fe3445e45940315b4408c5b4400812b0b48925862cd5c27abd9a2a0c3656290b11f6a342ec589720135a47b555aba0b098b37539cd0a05e729165d82b82ca1988dbb5bae64c7cb44a3bb190fd701b7927257a0c564fd2762f0c999341600bf86ecac593f7320e4f77bf720a42399c3b36642885b5b53a527a7b9606de8703805a72a777b1bf3674de08419e3ab4e424678e42ac87c15ed6c49afff1c246fb6b80d1182f57b6360203bb6640291a0b9d067aad6b8e3465a84275b923ea4853f799a7d31766bc84b5a0230aa43b9a3153f509b0ad9c63b00b4f68c75e29a6cf40d7000000000000000000000000000000000000000000000000000000b80a908a7f6edcb4bb86f2a0ec5da99c374870127a29b670702bea6a13ae462811536217ef54eccc82ada15ed86ba2003e177f270bb5aeee52f9436e31a379d2 +ciphertext: 515463ea5284839dc84869288f9c03f0e384e56fe04c60cd7af8bdf53057698a984c2ac336de2932d3d4ba3d2073b481a125bd6cfae82da6ded2b0e8fbf7f579dfe5d590a6c03a95b53df59baaf4f0dad94a7b821cbf9c1c809b5d089d38be1c30d455ef44fef503be587c4be0929e2cbd931d10f1a8027ef2d14e15a931f3881a2bd914adf3fc93f97ceeaa8a521762540307ce5a670313d828d5ac71680d4f46bb1ba551ed7fb47e4b82e6c6b4713228038d5011df91b07ea0fb98790924b4cb859bfaeb309ffea5c2cbbf3f12fac5a063e1fe7bbdb0de70683837b180a13e0cad655b6fcd1f5b635d3342dc84298269c1de8ce6b39452297fa6bffca90ca6045cf304c4691cd052148dfb0812162e7e000dc5c18c21209df9d9f0fe7dd8d0962cd0ac01402a7f8170265af8804747857d31aa7aea612900e9067ba8970e1a60ae3ab1105b1eff223c755c045b81de79659d001b7c45ce64dfd2dc16853276b50053988337ef88e4c70ef5861dbcb8a7d6d1b2a5fc5f044160be5694e12201fc57f0c8e3ed5e48c83c2815d78fc68a118918615b2ea0898eb7a33d446c449aa92c82131fb80267666d9e11425c9bb8e10f745828b72570194465c7b2eca785228244e08c06e0d8f20222221f5dec81fcb478945564e2e53ddb68dbae7c6b1540ca7f4087d2833a752d97a69cba3f604483a6eda26e8f5ec27f3ca84730237cf1bb30d70aee528eab3e4493c7f5787f5757ca6a3ab5c278c631584bdbcebfba318db0fcdaee34cfac4422b448f00006c97abf3175c379fcb16f5b150e398355212d8c60ecbfcb3503824565bf841743bce55fbb2606dce0b45a5e2c1fc9fa20c1847e9173de2d8dbbdba840b42b002cf5c0c1d34e709816806e525ca217e37cb2d23e3c268fc4b31608f89ceda1c78c7d3c6b23863f2c6b80747dea4fd11ddbbb8421728c4dbd97fecb9bb652150278a3a3dd388789d2edf85baeff8f6153317a9cc9b72af8f69f260ca96cf602e2831cdfbc14958bf62968e7c019d7c71f6ad55fb51cfd9adf82894e56c05f6b19304cc04d2906b935639f2e96b56768abe27199b5af84268ee89c97f42925bd3350aaf8832d1f7b2225515759ef64d2d75ab29039b549774a3ed7209e1e0e50656794b315ce2bfe35e20a33bf180ac724b9a47cb9198ce2174f6b9cff075f94ede24074f169f15a8eadb54d5cd8241efe8bdac98ce02706ab86c10089ea23470e048c0f9bab797c240b5c499f75ffef8ee6da533642301c897f66770fe1860a01e82449c4259f54be74a46d96ff5c78f0c07d43f66ab578a795a5f3fca06a1d3cfa16449a278da74a5eb6f0494ebee89d4ce6dff6c008e10953b9df95f0e2e7310d33239206598cf4a729e1466f3718534d914617d260298b45a5314d045516a15701c269ec948b681a4b3dba464878a193731e174ea8902873b7132eeebacfec09ccbce7f50835116ce5b0a9e10fbc7c76559ce0044ddc494a9224bc197c494510f2c44e43b037798c1613416f2240394f +result: pass +shared_secret: b177b87b89197809b36026136b06fc1d749dee4cd4881b4ecf113f28df2bd4ac + +# Rho leads to frequent rejection on matrix expansion +private_key: c5f6c739c640b093956cfb9d54272b3c704d3b364ff1c68510b875c8c29f30051b5f60b53f6341082252746b8d4eb52b3f77c818d42ac776ad393072d458a28b186da2b61cf64bc6d8b424afb49a3b2528d4863c876aac69b7c7fa95314dd36ab5f021ba8c575ca458c469409b71b31f3a8e371937405067951c084b6a832ab321642c82f33395b0701e5a677c3c783a47d7a6e474af454c1b31b174ce5285e90608e1932493e44bf48b921d6a58b1b86ec2a38b8ba2a1fe884c0fd608af3986270391d1a42843637d75194722d31bc81b2b507ccc0fdb309e59549a874d09239bec5a41c4e9bb48d6968152ac9d431cc3b290371296b8056ed56898b272b948e556926478291cb0eb1bac50b6718e98b74a1777e685b7b6d7cd6b22bb5846c69149b4e7b292a4153763b768cd5a67b65c3d059464ccc123ac086f9f41c3395a56ff3152fe149d76ac2fee2079653326bdd82dd6f66b6687a7fbe00d9832b09135756c5819b1f66dc44c7b32c2496f63cf077ab51b8626d0918030134b8384c565f0715167b21fab697e84c6838a71176748f12334078c27dda3133bd44abd69bf631badb5f2664f2857c033102ce8284e4b2beb9095cbb40587bbbf457054f4d11bf938af207c1cdc5217b0e9797bf9ac88f3943873c8b66883d2ba5ec7e6696d50a69ba55457853bc526819f1a6fe09973fbd19832312b554653b8441e5eb01884e94a355732e3da645eb849f520bb2bb4327d560612852152f8cba2f77db8d21922da08e60bb9e3b39b9b85bbeb9b1715982d292b8f1017cd3e60447278cc0257898575a0eab1408122bb3fba17b62a31902a567a0821d42086aa6417c259a1dbc93b25003fcdec9f6a5507b4b732a43c444c5825a05119cd089fb2e569f70b4d5e6919faf15d6eea641f5a2875763f42b3991f7c89fe473cc057c148ac58b6c88dce537da8632c10ac851f8916fb7b6ce89ba5053b8d95d29ea5d36c91981042c4aa1330aa098a6ab256ade08592a05c95021606adea0ab637824214009c2b915be450a1f7434ea2c7f562a4fe21139c2652ca8785af3208f4927abae698dd435e90e7474556af9b907f6d73c4ee64897dc74c6a876eba1b598e784b8094232dc62bf1119ef764bd1a3bb2d4fc7de069273a223abe5269a1403873087906db164b58435ef41d7d78b36087062419123c8b1d54da918f34920d3302ddaa300797b32c1c81b82798e421ab2589964334714a75cc84548031d5810fd87890a1932c98bad37c860bb15663cc0e91880af1947b8a26be9183b648b714f763b81652786682c210301852776aa673a1fde470afb56eb0b0114895638c609d8d55585d68c165f7aad64c1406a165788c3364667f0a3c65aa300fc4585e959abbc5e1b316aa108a1cbf703965a74475147a2d323b7295d185571000e43b9120b76fb0105ee7a385965026e8f8309d4badef88b433a59090f88bc4eb4ee2f6c1f0d880057b477e628bc35b023a4c9ab682822556afeb32b6c9088e35c107e2a43506c43a986a0420f5164167519c4029b47bc81e93c1ec149e6083b13589bd2a9c64fc6247ec323b8cb73cb9f9ccfb8bcf25617a87a3c2d8b5158ac8661dfc789e92cc2597a577981e1c300ed316423494735483aed71b9f85903dfca56970907910317d72a309adc2cfb0f062d4cb215a1caf67f4543f499001ec9db4db066d9989b600223d3830bf1818809881efb057a7626ed7948f2dcbb9a1582d6f421e08571655916d3a99b14ca30145e3330b31086d5a039a89ade149c9f362cd03c1919b4abe4178713a8400c0d0a21f866cdeb55b1a4202c79a5a26874004eb8a2681742f5bb97ae578faa58e856a8d186a07826a54c1495503d9180073275f139bc1a3749daccec551a809981520aab0c19c3bb59571e9cc0942799f71b502475397e9508d673b14652b65644565a436bba2aa8fbc4802663608e97a2da50249f6187217e01d5f4812f889b958d2ae4af89b255836795049b87bc45ff47549532c00499964e046191c26bdcc8eff1553ff488124d709dae90df510204f234923dacebdb46e5efa933c693c00b4823e276b5d78af2b336309919168fa38a224415ee61a6f729958f5605d57b748a09993f8c809212393b381f1e7c139844dccc37273488562a28fa232b51b6b22de4c0b4c909a03231078f2cb05581cce12432d44a66ea24ddee28ccb2a20a31130822cc74112686599ced4320878826ca51a9e892a5be735260be64c11697fafea1cfe152eae96a4d3acbf21594af1b5507c417679e6bd85e169319931922631e8042c093a6269205b4e8121fad69ea1f4037282852afcb3ec477cf7d25343c59e94e74eea681502c6939c297367dc3502e21724a77f2535a70d383a24d29e872aca63d9cbebd9b737fb2d565968bfd2a27d44061aa88cee5869e3fc96e337033de554ba4229d9ac62743c509ff3cba9c25e7ce3913e9812a5b9ae281c1374e86f653b7d78216af6f233e47a5b9830c5e3c3b932d2604c45c7777898d9078bcea38138a170fba8b41012648983b6c6e1cdfea72ff838922fd55cf1e62688798b6d425d20f2ab12c75714e8b3ec0028441259ff5aa175184731d98d2e7215c87970141580e91cc6cc2561de55387e63346acb04a6f017c9d7cf7ee39b26dcb012fb59eda233efc411aaecb51a6037ed4ab3dc227a4a977100ed804aeab9f7f585c7f5b76f441ef3b2b5b96434a647012fa13c1fabc08d1b46cd8a05753b7f7bc345847151c4a40ffb19238c122e7ca6220ed8acee34129075aae84b3732bb23257b33892c80309b89a0f33b1d7a4102d55f81b1996c90c5258a880e2aa0e80700803b9a80952316e654cb6c2349a0c88117b5f60138a571250ab0cadf7294457646215ca866487e6b8590fa926c2b5c367d1a234714a733671fe6f8b966b9b96b4296692981bd19b519a4a951eabb0d40751d916f03b3223ae4b12851b0d1e7486543272e71097bbaafce2a82642252d650c82f38a4a40b9360d789e00a3a903b71b6b91bb4bc17a67b864312c4c030127de12552f97dd814ce03ec14ce737ce3539a8f71b369c8947a759d18dc2b76aa0edf820d512615e8a7a8dbeb4d7aa92e8faca354f7192f7a42257b92fdfc017de9016a969efea146d1516316e31ad40b5829c06fac16b2c6d425b0b5aa17623af5a26ee4e0587f6c67dbac006c236f0ca216eeebc201c107b2879a247a60b1a7be7094ac8ea62841cd0933ae00000000000000000000000000000000000000000000000000000041186490472ac37b8929cbe8238e5f6f3994006c05bf47d88f1a5b571caac8082e8541047591efe1847559704339d0ddba611d0ff8017cdc84e61184715c93e2 +ciphertext: d8e28962213efbabc8a9e3efde9de2573855032cecc3be756c87151a368e15e8c734155213614c931c083fa04313898680f70839229ee7f34eefcf639bbd35f3c375e49aaecfcd3b0b506a1708f4d8c26a69a46483c5db50201db95c0de02f67fff0811b43d58cfa1f2a61838835ba909e87e58708b07ed43c69b1cf67655baac003b6dd004434d22bed1aa21796d3c9c1085a2c04ce5c03797023545a1cd0d6dcdec111b896a7b34b36c24be3bc890a65d3b1f9fb96fc56928d456b845ed5b526865d9d588df3a977cf7ad0277c5e02ffb8ab67360d0009279eae50e8b038d43390000c2805875e9978879288c827fc3fd49305d3ccfa9c7fdb63833b5765b21f70d52ccf2802644332f961029dbec5c0ab56ff9fc72dc3df3b97311ba4058eee91b0634459a59213df74385ecedd341fd0b7235b9d7e061746149ec12cb1c6fa8b28bf995672f1c7cd1c01b80d2be48493988f0a43bba9ba45b6098fa8ab08ff8941aa8ffb2b7fcc82b07afa401f02f562d6b4656eb0fe8a3f8c2e97e45372c35a8b97041e4d2bc92302bd4fab1bd989e16e5ba7c315a8a2441c0607368c116159b005fc18504f12c96d557857e35726f9a4bf2c0012453663cea4481f3b4efbbde568664c54c1be3e346a499ee98e06ce2534b5d9bbcfecb804b8f4ce6b876e1ee00c12ca97b90940334d6cc0fd4cd010e3d83c7c4ae91761d8f73d699d2086e7fd635a028b1ed094e50b633d153f71161094b9aa230cf1bc005a9b2591c4ed06ed9b1695479bc67c41b0f7f3e25cfab21f06c4dfc68fdef64ea5b86ba05fad5b8a5316593c9ff8a9f3636167cb3148e97af82869e42e1bb3f110ffd711478427796256d82a665ef33745ea2b949a4aa55ab56e86d2f5feee5f0b203ff6354399a0ebe00c36d09060e467b434db070e77e9a125ea82362dc76cde94202acc71b47777e6821dc477a466caf6ac724761a1ba63020393ff2c33b6c0e14edca3527e897e184509e48424526534c4f2ef34a91a28711c53675eb4cd3c0419c747e2e67ac03ca3015e651dae27bb559993b2f0d20f0179300e5e69580323534d1289117ad6ee3ba03e3cb5f6bae436b9ef634a8c7be8e8c5567c5576657d1820f83c6578385d7911de91585a28d1d4c681ec03cd69081b40bd5143387fd020a9dc5cbd5fce0e8baed3d16ad548435db9adbe14566052c2d8d93d0b24bcadae084ba69ec63735cf19a6d46d534efa4c65bca47ef83f94d9fedd42578f794549bd5331b9aa1a2fce0c6d83a6e392cd4695e13245f8c91f3e76b187c55ccfc0c0a6344a6c89fa6544a86f762df3c59da21964ba4aed245647c56817a600ea3ad3fcc3c104197e2bc7e09fb81d9f8fb7ef559514da710f8093989f51c5c6dfe18cd821917aac8c7e9bdd9c61296ea839b8a54e466e49454e212314f39d50dc762e6c4c5623a88ddd423536aa51007bf6c56e3697c3879fcc6f2a55f0246a032dbbb073a1048f91d0264845c405c5063852cb507e4c9f3646db75c99abfadb6cd50f7a1 +result: pass +shared_secret: 8a746f85a41b6c46e0ef358c9407c702c86fb907e85f86de98d6f7bf7d6e9866 + +# Rho leads to frequent rejection on matrix expansion +private_key: ea53a046a53b7e3298d588b38c403e67b5620c5c73a438ab7357660362ab3822b5e774a9dae973c83a96db79b550dc176f9b0182d37f12118bc96a4982249a352219a110704e4a0ddbe545e4f55cfc2c50d54cac33ecb6fcbb3ac2a7bd4e41282476797a3c24f4ac4f60c33da281cb1313035c9c804d755267894d867469dbfac7be52a34f55c0dc642354e52967b043a0e0167c806581b51519e04af675147578c79f492da3ac0748352c6e5c7ff462008cb42e9817155444b214c3b93ff3ae7d44b5c2b659627a833cc18ccfab4fe6d6513dfa67cec499cd7a0d052a5f9ba378bff75033e69ad053c04b74c8cd756c7cc0bd494129e069cfb4358324066415bc2a4d1cb8401867c9954aa8a33f929ca279696cd515bff0abcb6c8692aa9cc076861e2bf27ec360983f775e9f166964d0c43c380366f19d3f868a7e038752d30e389c0c057b6d93a9ae64746d5b3a146d31269b94c7a753412be68d09d820be6890e5db1ec3eab1acb14cee8a317ee7ba0eb6027f13a540b07c12cb1164bc7d295c16eef4c8d9773bd2d32ead764f58fa48abc2a5491bbe00e07965017ebf40c973343704112bc90849d219c70b028ff3769e720c4599098d172674358bcaa8947ba6b874e3d94e623122ffb3984a0b571632be1c540cc5da45ed1c57da1054abbc4456678249a2589544c3dfdb6330ab35416ca49c8046c9446150660b45e05b720722bf390e307445dd8a3e23253cbf633c8ccb098976a68e481ee86b86a32865d9caaf385842cdd071b0974e807710e2b44c598a4a36bb2af048b0fd30bb6c64a539513ed2a5a9c6cb16129cb88d6bc62389b4846a2a0afc532eeb0f055aa85ce7b43f8099cbf194e664c59e683e535ca809d40f72d4a3d5e287b5ca3880d4af1f1523b60c8f811a17b2881602ec0393d54988d63a1620a48ab25a5336b25ca25d5b21425ee54673062020f065693665c68399691748ed8c2b6ea47b89391e7dbcbb3e4bb8bc0972916aa0ee5b90292b23618c5e9a68bff8476fec1c7e382b1cddd45069263a507c44b97663a9c8b4bc690c89d25893c4caca0caa7633bc66f449bc06603fb747843b0a8ce11d46ca100b3243a8617904a2ae48db08ba24bacd5b946cc96b834491a246850c44a0f049bb3e099b3353b28c3889bd4520ce75749b745e65e6442d970e917362cafcc9cd1a6194d9ba41f29feab98320e10234c1b0fa367f7c3a420052a9ace9a0787bbc420832db814e8f86804fb74090146f899a624ee9739ed55c40b3716724b8a8164b8b976130d89e15dc24e2078f24a953b2781b7d36a12334356a6998870a0128ab5152a89ddc84aca3475f8cf849bd762ea7b23bd2d743a9d3a9a2c2ae4723b5c1a3b5349a2d4bd2907d89ab8fe80624838130697bb1d45f873a3416164f862630e96075fbc5192be26755eaa1f33026a1f201a05b6b57ccc83fe9c191b13016a921532c4558b44ff0a26c864c3102ca921c299b38199f7162938387c3598362e5f616756bb5aad68c68e0a34ce96684597712341f391ca6696538582ab0dbd532c7757b5b24b0413145395123f0c4668cd538782b0f65ecc30b687efa78183de47f53b73831210c513c54febca5d4aa88217021609b2499381632883e6c690d720297f130a546b8c101487a31579bfa132c9b06aaf8b6583e633487752aa9fa26551650afe52d67d182bb035848e30696d1be1e56c687eb6387043e28e6a381b4536eb18dbfaaac8f6123ae066ed7568fc1fb580facb933875eea026d182329214cc62f75383d68bccc63788d228f88d17d3aab08f91c19ded4b19a876bc19984075a529dd267b823b7c83bade5e6a782013f8de263e992031e8a32252035e6d292f6d98e022c632d115ef2c60d53e47345e470aadc7816cb6c43f0ae1ee2bec3786b6b159b8d2a958ae567f364c70e4987f237a5d7dcada9066df63018ec4b21f0000f4674a4ca155e761c41c6a54490b3c64c42b2777cbdcc5cce8543a5f9a605e7aac50012c7c2088721d69910f9b3fe26013f45c68b7b04069b9d41555b5d7339c371389c95ca419b77d2c5c1a5b068846972ddab9cafd26308f790ee0a8e7d73ad4c12c4256b237a9659a6ca866197a2ccf39c005c47b4102ebd47607181795cc66a2b677ee68b02a5fa4be222c5f2a5b44436be13aa589044b574997c5f085ca099bfe8b2554ff981d2872a78d6a08840caf9a9051609c586409923a989ab4bc1521b8d23ba04f30a3df77378ce88abf81309de61646ae15e7bb62c8f300b5a7952c5d4881bcc2a81e64a6c612f7c6a9eb8007a2742b4bdc8bc0b5a0218479506c746396867b1a869038943147ccab4a9c735fb318a7b84efd56ed70b05e8a9cd05a650e2fb7ef5c48be6d39222082080b74aa7f4ab869b4e189710770cbbc5a70193597a0282a02445c5f5772750e505b968bf5c665ef2eb79c01a8e12948ddeb641fae4c4e8d7a88d13433611553292910e831d786b0dbf5cc13f77a881f82c98263a86174223184fa96a2c53f1b77c0c12c11c54cbc37776b568b4574b458494ee6b8e0c356a4195bacdf2b11876bfd3a84804a3001a37967b40855326c261d778cb544d346127eb7091821a5bf5eb3c6215b3c7933e05205754635cb4b15a89f827289c20844a6f7e4a817bb140057991858a6091157fde0717bd2428b50711443195f4a9b462eccb9c2325a092439452aaea85521556a17102223a65452c5b152c8b476db176cf76a6575188222215d32b5c08a80e80bb84e7007a350776165c1ba259a2eb06c5a3b36d27ba4b7530a104d2a18cd896dcbabc020a6de3f09bcf24a1e5e5772cec886f5102c71930dc00a07dc71f56fa905cf8acce66a717279ef7718fd9d40864474338c0729f4cae12d2b0bfa579f742c5de322225b0c633359108d8644c47b539d3b6f99cb8bcd42d39208fa5dbb87e600ac3cb1179a63936881748eb99a7bb8631d65dce2078edcc4abf0608575977ff4a805cd81b5679899d36227d1479d25a52072c07e7ac65148559ed558ccb164b9822b5f80575dceb5166121f4ef56c32950ba46217f0dcccd3f4ab8b42b4b0213adc08a5136a404f4532449915cdbcb3fba8ba3aaa7f32a63371f5c09ea1cf1094b205b2681b476375c481a5f336f38251d4bcb652c2a849daa65c827d5163359292b8e4b98a6e6c38fa592fd068197661282d457df84367f5f46815905203d635e9540811b66b990045e4e42532862012ae783c1d000000000000000000000000000000000000000000000000000000666980dcae61cd9d2602a64f618f15dea5431543375dbe5fc600d68e360d30d35ea63afb095b03165e6f3b9488778fdd771036713df7b893ab8777554eb05f64 +ciphertext: 1ea478e56a462e1f366f167cd818372a44d1d0311631d74a6e2ba29a86357bd7e066489d32f4eedb2398e2baf12dc4e90188b81cbd961047889a81c4a2f1c040a4527fef9518029458d524cbdd897409255258a9da92edb0d9bbaac73705614171db771c68532750750a70af8acfdcba1ebd423858b01ce3ecc821f9359c043b37dafb9574c5f4abda2cea0d09c0fedd0cbf40041a613e4de883ec725de57a89a2d0a9ced380acd54bea2eeef2abf769f81d92b302911b4ce0d865b5636372543e218e52c5a1ef0872607e4422a6c10aa77022120ce4875e9b11273281044b5d200a61e3c29a69f177a6fe530399fbfdc4edd2f0aae57102e66a4c48e549afb78e503c90517b7d741abbc2dfea9681ab74bbbe5bab1f25bf4be19964548fe3048cc27be264ad196e837e2e0fdd8475e6909d0d464cfc8df600c1a71523582378d1d70224330c852aa2f70b9536f1768736e95ef8ba0b5f595b683ff8a0a2e691522784a38c44171250719ce54cda4216052df02d164034acd650cd47d465be69399b9a148a5fff2974b7b42beca2039ad52358626e2b8d808b6a52d8b7eae2fd92a7d5b019b018f473b712c2df01295ce33cdb56cead9402adb1f245682d29af706c270d16f63edef39a49e9346a2a647aa8e481e5f72ac87aa5348af2c655c074ecaa0394bf531d9ba5851ec692f577e09918e4013ba53d529dbddc98dc041cb5e11598474f34e5356877c4adcfeda2bc44872ab538b908521088e06a166b58424a462dcbf88ba92362f691ad015083d83aa686147e635842fd2dcf58faf92d94a104719dbf7e5ea19522d395eb4e1092bffabc6aa314de0549381b8ce4b416e102c3fac0adddb2094fd1eea9451d6c14295446606f9e65ddac902a1fcbe65fdda0c1cb5322af2805dbd33633e5d5ed3289bc133983920491728c9b851b46e04c7dbc6a2bd24bfd63d3f5236ca8b2fabd0ae30506c885deb0696317929f3c8aa27b6320ee241d434ec50f2d2423d7c958c6fbfd04b059b3e98214faceb96ed5e3b8fcccf169c7873fb87c1c236539cd1297cbc9f8c3e66408666a678d80ad6e29b85df490fa0e83686aa3261cfa5e123f3fc7dab946691524bef770da4952ce4702d1d854996d9c2e30f8bd88accb0ef4917f3d5f9aa7cc51e566b9f94a3fdddc7640a6bfa0c7b6bdbce57c7fd76102dac7de2761aa971c949020cf11981d55d5a283a1b9943b2692b3a280b6312e32ed52d4f50a38f366b91cec8167f6fe4769f1403ab0750671257194b62b856ee5459d095298001e381d36df7e2c1a5c10241ed4c278d3d477bcbc1973728d7934f9ecdb0ead0d26ee993ec91199bccca33fac5881ff093880b727e2226658ad44c4edfc74b0c3893cd281923724482e1897215d3cad17f1b27dcaba869971f7e24adde068943faa11b45f88cca96997291126523d7ae9f956908a0003e93b39d1b88dabe66ddc777629b8a6202bc0adb7e97f754b0546d5bfdd2a13ad7b316d199b10694de28503e77d6a514e376bea64 +result: pass +shared_secret: 144bfb50c676e6c8efda24b8f5c94e9305dd281e3a6493d877f3face684df1bf + +# Rho leads to frequent rejection on matrix expansion +private_key: a7d40e120206cecb9458a1464b96c447db086780708c7435e40bafe1ab8cf26caced91b888711b8b95414e080c2be24d7a622c2e0410fb9c795a25a50554abe8b9049f9890e29531cca88e4284a5bcec559f939061b003510c8a23991cf474ba6676b0599c86dcc0976f3b61cb624954d3914bf28e109193ef1b9efdacace8574dceda34905485e1a79d51c8ba06722150d8a243d69f671c18b1c2a77c990699b72ef5b1c4aaa121a8e5a6cc971178127024166f2593893bf3b9e0db273040b0821051cab28af5196b8937538a680b39251b08051502c2a3d5504f78b767dce91e2116280c3532e9426b93d8cae3e9abc5aa4832c6bfb02a71559bb689f82c22835fb314a5e6d44bc4085eb39ab41555103033a0f4b6aabfc5246c93c07840254989301f88776c06c9f808369e18445058b4d940783d57b7d7901b0d63a6e6512b31a63ce0704028d936462c18eb4bb78accc3dc56884d9837d8632a258c4e998cc536248aacc62f7b9b65191a28a27a1cf44a0d512875ad5112e034c0adbcc67edb84eb000bf3621e7c1c5cad1cbd06f848c5d8c3601b07463b5c0e33cd260a2ec99a972c47cda74229f6292221391f37d20903aa76eb6966195acac6373a41db78b8f7515a473ba04397c2e94a26a6acd8f2cccdc572d4b60e56880fd0295152e18bc79699feb1a0b6f6c7ee19545f4124eeda5755a85d79fc2dddd2848216576e9ab4d07b7ecf77a74937cc1605602c62003dd5abaf601b55ab0cdb37bb3110290f829a742c5607ab24a50000f3191f435427b5345ef884b91811bc44fc4c6de32bdb0a73edf80c8783a5a6b6a2d06657b16104cd62ad847206ec1b87729260e91b2afde6b0f13a87025c10bafa88e1fb1a66b98a5308a2c4f10874324179a2729df786627271ac5a945072beadf878035169c543c0b07acc49241b7feb406f524b71c787ed757a3d48c233bb75d97c42e03b9973cc680169520e400b00879cf2bc9119325586719f22e1b2de163184b2c43735b2c1a8654c92138b90c458421f681136e0d6c417b20a5f8c126d3672a4073942855b127a87ce96c7e34861923b3ea9bc9f0aa277746927f0777814862b0845c3bdc12309241f387cc6f4ba4a9688b947ec8b5603ce88ccac5c35756d0031ab4a5e32f6ca97184df2acb38f724fee64a6a688c69f6b913576af98ea2487db097d7c81dbc2a29a381b2345495160c348e8207e313929dc08412304f6a01c90f6889e23b7974bbd6f081f52dba8baa716b53769e6f71b962156cd44a3f50563efb3b65741aa26e42a3720ce737c7a7ad5c875663bfe36bde03b106647ba1ef098569bc10a0940cd300d58571dd354ca5ef714733bafa4308b3c4b7528862664a8656d16c9c3837355e39072db20af20025306390ef32931e793e33333cfd893c6227215027ab7ba9cc0212ebc749abbc62be483b3e2406a5ca10d7fc534166646473c27979053928aa5445c4c1c26cde40777aca39f5a64161c322135fa176d44b694341a0d3a05de662ef0e1aced53c4ea2762c1333da3f987fac65ea63a17b55c3f681c568d648966eccd095928f2e32af2fcb0674ba3a50350e282c99af149ab1b3f52d3b9f838b1aa8cc52a278678a38ca0034edc7b238f66c60b9ac1f309147c4cc7c78c393ec196c5b04c7906cc476b6931c494d0e4b11187948019cb75b0abdba480d61b6a58f4b8d9158486a7b94c05521fd7a1d0e8ba9c5a9612a8351f1b82c6db939ec326f34c13ba5497d7632e076c363157b156a289486a0b8a1b01a7154059149093a59cbe69ab6d8a67673b808fd217fada63f92402261327f84cc85ab50cb93517f4f3697e7b7c684064bc474ee617363f11711e4a7d5a422f68834abdfc685385877444cfab3b42a5e7649e0893d953b0db408bad47a6d8d061b884551e8031d4d2c207c93ff984b71a46c8c6b8174f22604c4a6d2d1c125117a281d37c2e001bdd6c42c3e3b90ea3c4386a7add997018a7330b0c2745f075ec10441870a890722d003d252923ca79ec870291329795072ed804a8045a34651191e824810b4c70b8a00e2c1504ea929364bef4027597f12a5c392889295fd6526f3d36572470a6b48188602093aebb3feb5b54db342bcd70c7ac881da4874f1d058dc3db26fd736acf9377ac64803a4b37743c6ea55969e13579872a6237d374adc29b5eb11a1d9b3aabc0377f550555d367cc7bc0c1b960a877a80a391aada5486c620f58182090436a8e26ac140292e547031ffb16f33c2a3cd2277a50903ebc67a22997d599a0037bbbe73057ef3296c7d3271cb17b13cc844b2aca8cbb1329b4886472747c026f63a1c4131c97dd8253c2a05e9a414b78c3c4fa2a6003712512310ab9b19090d7cf127b29aaf59923db8f33150fe2c34b0ddb8d3989513fd7b4a10495c9d86927b2cb505863b7bb3640912a39d0903db082ee47c0e8a01ab22b256682bbf6bb69b4b2394fe7aeaa939f4b624906b0c1b67665e6560f82c55b6b188aa7762ddd224e9648cc7c2c2e08589f948cc3f2f0b09150879a47a0e8bc1782c5befd0734120069e83814e34c663f115802b220f5277798076863e54ad0496aaf55baf21b5dcf60aa6ca42ef46c3c30052d7b78acd9e40a7079aa437908495c2506549750704577695f70725ef3eb8e98d88683501b3ac08ca8e5b4364c8c68eb5c7e4c690db96ee7194e5cfab7db691a67914c3fc3c219c56e52081f9ccc592de13ee5e266df71a350a63f1a63aa4984b2f4319e3399b058b4b56528bd14191e0657a76476392e9a5d84d83e87a3009b800004f60f4b4ba8d0bb2beac7362e762b417824e1539a2c39be5db8013060c76cd6453e313bbfe87a350982dc04ad7da459dbfab6c3f52b5a779c33047ab4f9ca16238d0049200d394cf44b92caec54659221e2e6b6078ccebb35b6bc045aaa331c8f29b55f3654e51b0ab20c16eb331843d2ae43749f5632056e101cf2ba7bc2921647aa0875f099cb7ac083ea662ecb0be57c383554464ea40f1248802fb9a48ddb4ba409b6db621b5395720b215efe32c47bdac84c5aaaf05c61c4dc2781a87b00710202fabbb077cc93602df8868756334362d3564baaba98c6c80fa15da5b2c924b8c85c918fa0d18bea758fea9b750da0c37751370b4300a1b6a3d7da6566375155793a97269cf4f87172832aee156ac1f18fc1179003637b3aab85db0b7b4b152b4fba7f990964d56c2dbae99d070419690a7b4293c6f3450000000000000000000000000000000000000000000000000000000817dc205a979273e6bc58838c286506eeaa89ba33d4e1971291f3a4da3a37988bac5e523fc2f73973b46b1727891a6077329e10e94acd027c9dfa38ef4e21e4 +ciphertext: e60755df5f91c38cab8e8769ae6c40bac77397480afce10cb1bccb30c8b8729b1bcb2d6be360089e8edbaa14ecaf528c488704870a6b9b299fcdfd910431cfb7da36eb755ad9fecaa91754a28ef2461886a0fea6c757f8e5298e047d5b61ded088a8c04787d32650a9124ade453b9b233832d699e5a71403ac186aec624d25ae3f8154c9b7c1a3723847c9b6e9f97870e81a6fac4888629e3b81e7df3d8a56f911d1559ff6f5fc15eeedbab77b70231d9e4a640ba4e1fef23fbcd073ae4c1793ad824b5c30287f24c52522e6d315e2d90c7fdf692c795b7634c3d935c98012075e0d263e917aa5c9f05ea049e1a8e8009b65c26d53017cfe5d2ca2212a78a5039e12e2b0490c2238dd693978f1d75551539834a954dac8f745a1fa48218eff905a592d0548bd927a5104185934f16c8c46dfe581f6c6ceeec019c73d0a0c041dce578ec5919b9ccc7f5df84822c4f5e82c0e020c6a9c326fdd74626da86fffc3a1067d3081d3c8ab58b3613a9d0f3013eccf6b3e5bc34bef9da1672bfd11d9b51222d109e5d3c66244d9723a4d4e1be1520a15d58f966349fdeaeb587790e2a0d87647f2445b8673be9045940b01647964e3e611433fb126e5619f8cc96a7f2f6bcfaed300592389ff60d40315ab87fd91215249b911166e648708b3c71f412c2b06fdb3fec91d287dcabe7c33b96318381fcde852017cd911bfb0e9bd09fb481af1494ab51c9057d77cdec4d615207d7637c007d2f2515bf532b7402a496d0687a82cf6a603348501585fe9fa987b47e06393f377832f16a6e3bd2022e45a81174a12de22b2a5af4ec78a55c2ca1488c564af9becdbcf2f7b635d88dfa14caf10fbe1ae4fd89c4d57eb04b35b810529b3fe3aa10d202b14e0c2417b1c2cb2adc02474fb4bc74d813dfec562e17c43fcfc1a35df1008c6bcf73a71e67525c78da2b0c5480edac41f839f8f67bddcc14b92d5a04412327a9e1cd34d5c3f5ef6cd1a59af4526d05996fc049a39db14dafd81d96a8f1b80d77a4f330747dc0bcec5214992dbe7fda726e4d0413ddac4ad0f583018a378c844c56d9ea0329904945cfb4f55cd0e0f4ff2358eed74675791d74cb7ab3ece8eefc771106dc4bccc7525e3118b8fb13956125402b310596c5ad0eea3ac8ef75f8b63bbe11ccdf7aad66d05ec052ed9b54becc2fc7ae185c9c752209d29c76bc02d1d05b693e12e660f18a326cc42a4ef4b6dbde69f4c4676c4bfbfd1bf3dd75c262e2f5ae9b4db247d3e824d1d87151c40a7ab56ad5fe9deb8ab40137860e87fcc972e12f6eca84c284eda1b925a2dd4b36eeedac18f1052f280ba55ce11f55b0f45443b4943fb0fa7354068259667defec383e380768276f97af4a0bb7dd2ef1669e69345d08155a0ea23846dbb9397cbdd023d5dbfc4a544572e82f21ad601f31cb01def894978cdb210b3617e65493f898bd6492adf5acdfcde3474f6aff97a86497b9fb6bfdc51882d3d5a3a35c4c80ca1c21fa3031a3985c7a2e34eadaf1ab6182c1a471721ce2d +result: pass +shared_secret: e3f0f3e54c7a50d4047b6fafea1311637c76e6a426940afc55a432bb7a23956d + +# Rho leads to frequent rejection on matrix expansion +private_key: 610c36a286cca4815c657bc2f28b854aa8602890bd6ec2700d64b495b50d049c5963b8294752942d11c1d0182ba6704e54c003b828bc58b6ca3ee0823607c3c00bd0471b4df571c51db3003e4cbe6166c0caeb747f79573f5b8b80d12ca78bc1d3e01a318bac91fc863198afb70cb9256a330faa06639caa7ffcc1248b367bb6b0bd905ab0098b79b85ac5dc083ed43ed8b248dbb72e5ad962b3201c92b132b2961d9867b48208896c11afdd929be2792839674b18e4c1e99a7df714ab7ecb58570281ca80a92f148bc492797564682b560f1bfa42b2f7734047cfd6375d3dc05846da1d3511cb3c8221d38226f29ca52b07471a41764f86ac3418a96aab70fc8454d6823f8b7c6211d216d08c67eec474a3cbad8f3587e22670ae5a9938651f3b48011341b6140ba393621accdc3f606b080579197c48967f1c8d11026d8f90b0697869ea49cb9db086ef687227b2549ac689b564326a2280d8384698185afb25941ba0365b0c1939148ed6e1bf0ef5c764832178d47a01c3573aa268e168b740194a9b36ac2580a7bbe1625900befef3adc6fcb356100ddeac4393d388fe647c3d623d1e6a56a96073bec59f5fa39581245e31aa33cfb865bbc28e9f2498bad34a5bc65c517bb8cae19b6d1864fd7a0c48aabc78d0373a84c168f33ff13a9586aa349a185e3528003e804c8cacbccf0073da46567f7c3ee6a55eba856851234b4f3725e1bb3609e50cd4c9c96ff947c4b048dd7c64b3498d23c234e9bc45230b8b0c797946d0980dfc7bbc5773620b8330262ab6247fca5684c9fb8c2e692c3f654099a7a93d0aae62d24eb594544a81431f295bbca7b15dab7bcf728e3dc61f6354a459a120c371030f3b622569a78762b1cb08248a455e0f0847e1531d194acb0507bb53e9c0e13c8b2f45ab06362be3d9bb58ab6d90825a15211f81f4987000cf74355a28ba08443b3fd9d26b70039955773f9f840207f696d0e7a4989c4b38cb23df626e53b7ccf7c1bd96bc3f68c20ba180a482799d2cf975e0a39d5fe863df954665509b3eb63c257b8c9e39050bc4a739468e716cc289a79053453a28906d003535536439d418736a95763ae222c8870b66f1b5a9978c29d238658a3e773063dab55125e851983706c3ec68d7fb1d595b55292885f758a8df752fd3d97a8dfc33a228c896a44bc039ce1a2069810b1304d44522b1a5e43756cb843b5ef515d89c310f442f585259e5d460dcd578cc51ab49e63a7cdc2566d77e6959a7d24150cf0b413d335efa65385ae13b482b9b4db4ad2518b71704098d7481d2233e2ab201dcb4a1b3604149710de3cb247f29ce8ccb2ec062b014708f397482dae5936bec37663c849c9baa9d3cc88146b88cf970e574694af03fb78205e205435221b32e5513989047e62775f1ba5aa89a10c9d35cb566328eaa5748e9c5057446f96cc691d80208940cfea984df8817d4507aff0a0a96b8c6729329775c8d75935d7624cc0a06ab7a950f2b73ce4d90239706403c0651dda56544ea59bb06a99f00bd698a8c3f127fb4a3759317a05ac244a07342f9a47257e5649dec2c7050188ea669a97c137f707f4e5b4c57945f82c1b0b2040476d73acb54724cba00bb3c06376046b4f295572947b7fc5597b38596655f25f6603255aa19ea7f9fdc5c9efbc5b1343b9d214923121da4fab101076d9144b2881ab988092fa858a407db97248516981a9d4c336df1395c8920496f487c60d46a97368103bb9af9b62162ecca0c023b7bcb71086c1b1ba92efa1b0521b472539b0a87030b7477bdc4d980be20ba45c0aece03c49de971a6f9c8f7522c1a4a6df1225e836640966348a777bb325c4f4b972d484a74c1c743ba88b7d9a3305755992eb5723cc8280aea6ed64b827a0518e7b4cd2cf56bcd97023195a7aca9486ce2b50e35a967da1f8c39c9fcb895cd9895e116b6f58555ae82609fb703732452dd60274ed87adfe293b5a2be5554ba0c455836c98267e77ba6f5b5dd90134e126c703cc1648cc827754c9c2928073493332b6394511e1499c0818866fa0951f8c1400fc51cb9eb6cf37b4a3eb3959ed2af6995c480844291766a66d81713aa6351555068324f84262c9460cbe041598f519c8b387b442a6d6c873508ecccf6b2ae4e89bbd1306f962915a2d759e2e8184df59620d8bd60fb2464ba40188666aad85279423cea249db21b34525b55191375c2f19dfc811d3b77ae56b9366262834c2b1dd500ac17828bcd44c024e90e06e9a7a9607aeaac2c93d48236d114d352859d9a559b9b6e003cbb9a07c65d0a9f264288083609434ba7ab3a826a821bf2db0306a84f386252f7c56011b96fab3b3fe2ea43536a3cd39c2f11d1bc62e03365211e82e4b5287740aac771cd772575c17f0c712c6e1485e8f4cb8e11a89fc4a0296b567e835b6f18946cd3887b56bc4bca9327c52239ab34925c2440ac7cfe6644c9c8058f840143d782ec82793a234e9ce9a2d2f7c96085c6899436cb9c97ba4bc3187b2ed5e622c212ab557bb828e196e0336474e1231ae72f16233ac7f844abf5434d457aef124963c85c25b7414df98bbff69008c27b9f25ab2d9990faba0bd9c00f7d27944f718fbbc1446b3a0e98611af4c22e4ae958ee993f8abc59e3c41252b160de5407a498a0d4f90505da3e90a4b2f8697e99ac7e7c769250a5bc489a74b44cae15a59be7f5922705ad8deaa41d4cbbcde7919c3360e2892914640d19765edaf3203ec950035550072a53b379982b3a3d1d18763f9b1601854679965ba34b1b073809ba675e09997a8519510780b593638dea00cba3598855125ac71c91ad671bca1499037b7791f32fb82134319b1ec041475a238bb5c4ccf3524d613c8aaa096217b5afcd2c4803720b549c8916bcbfac990ada5509c9362488d66f80b2556964a856c06b746a6a27877c0a213bd501b939796ef0cac630705d44e66a1d3c2517f940bbfc711ea1c5dba3a491b61fe4649428c6007052517004416b0201f2440d467733d923277d54bafd729d84e2440270a259c14d88a4564fc9941152b591aa644fc93abf08371ac162b9e180c0fcb2783653e5137a9faa04ba137113697b11e419dbd708f18b2fb5f20409448f31906c2a557da57621ad4242524a8f9f754e199a2b62e87132a33af47166dc614dc7034935c4b21b7c102d71762239c03084bf0e381524a94b6c22a7e499baf0ab6c9bbc8573909c8e99ab09a44e6d3b017dec2cba8b60c13400000000000000000000000000000000000000000000000000000037d9447735ae18442d1b8db2c77e3cd72ae226b0fdbe34ce9a0b82d721e8517de42ed33e0da5856106580e02aacd0aa1546d3df0571d17452d22f186d011981a +ciphertext: d388adf22faa385735ac4630979b0d692aab8fc502ac7f8a0e3561400f8d04a4447cc9ad1003d530ad2f7b5da076b02bf291aa837ba4212d43bfc514ee60a422c07471572340d7fd5fd127dd82283a4e0d145e294841124d0dfef27579119d8a9eda24bec0aedce586026d1107568831363fee0187f8a0bfaeb384bc9ec4282d03acc461e26c4b2826b15943d95d96ed7cb72c53665e19ef8b4641f6eef759a1d7fe860cf72c342b3d3e2fc784269460e0a1ba6c394a9c24db5a4c5f6ac523a155491d149806d73550b2b9f8f00074dd06ba24188a3bbb5f3370f398011899758365850054928429a7565ca5b9935f5e1b2600a779152dac16e78486a716a393cbb917f060c83a5a0cd56f1ce4de12bf088cd5e80e540ae97a2ce2b8ea35b3a7011116c7131aef928c23809b3ab4a464497d4be034543d5ff1112c6ea13242c4b60503607b9f4de544cb49c4580518e15ba51c12518312cd44dfcf39a4c544c71a84cfce3f70b789e4814ffb36c1e0767f15ffdc82ae5f0800bd8e2a973b8f30f34ffc792c9f7db5a91c2e0e02461ecaeaf2ae5d33e879f01475e102f85609acd1a8f0b1fc57739c331c25bf0caccba793b659d90483c220bd9cbf0691c5a4f11fa0c87fd630243a9f6e9d6082017dfc84b6ef1cb1fc793d14aad856fbbe051c724557eac7c8f123fd50c0c8368d48f153ab93da02b09fcbe5a91eaf3ffc9a7837b1e68170cd544057afff19163d3ff479b1d2be4f834a5b8ea082e2e37d9932936e5b3ead4ac83201a504ef4bbb6621349fb473aa38bd0370ee39105c5b635c1b149e263f5513867abab92c00c4019e6206600829f1b3ac1c849139cd4e04247801b2d126bfe94c6c019916247ea2fec03598aedc84197dcf7db900653fbb5236c52b640f1b489d79ccb4e4d062e77b6f9772218f64b02b3c29044c62279f11755791d8600758850cad537800e77d7727a63802e3a256031c94f3cd3f7cd20e10a781a29c2f699a3b4425ba4198d3e9fb3e5fcc726d99bc735ff16e2d1eaed171fe4ed00b0fccd81a8d08dd5d4a6c72bb8909ab98c35e0efaea3e9a4ed31ab0c6ddab06444150d36637077275796802b792354567f2af4dfe79bbc095f2bf801db578ce720e8e4fc9ff772d016bf400e5d330560aa5d91760f3dbfe7c0a175f7d0e730665ac079b4aa29f9b51a20784bee6020be8cd3862b3d992863d25a8215e1169f5eb4cfda064cbba34e1344009b461334490f7261c9a6a4457fcfe7b8536c59a8ee36703e8b439feafa9b4536119b863a91805706dbeb6e79a9aaa8d3c959acd75ed03cf0137546141fce29dc5723db5356661b62a5e2addc6cf479cbb4b6214e44b0674381fcf8d23bff22ab413701d8613cb03e140e85e6c00f75204a6fb1ed29ce15ec90cceaed7e216876b5e5b21b7e99da01f6c2c6318591e57e188548dc9a98e14a61c472d9726cbb09635bf99b32fbad21e4777804565d749b380924d7d5de3ec6be5b4b2cd2b784abc179b478c9237e111ce04f99706bd85c7 +result: pass +shared_secret: a8006ea55b49d054de26ec8780ee0928650ba04f33699616396fbd980d9bbd72 + +# Rho leads to frequent rejection on matrix expansion +private_key: cc389888219463a7a5f6c2ca3014accb3bc26f2318f593876de6a49822b6c1e694b7e5aa9140a0765b6334ec762c8bb018d28a99004081256159c836f4f800d0c9aa4a7136fcd89ba7cc1d6a32b23ed181b3fc118ecc60096a4ce8261ea2c0a6ca49baa28b75d1b40215367e6a33a1c177937bf43a70c3889f6aa239e20e499bc7a836694a0bc2912cc7cf211ba20c12d5ec312da2815ef20c8565712b22a927451271040cf4daa44d79705b97993584424e7b3224a5583e5b8eaf640e85015676517113f53a415220fde3638b9c0a38115e668545305ab298b9923bc16de5b9137b30a39a2c8b5fb75e4d1168593a8eb0e067bb9343f1a030e5228bf0b3a49169393cd14f73c2b8221b1267627d80b97d30544b02a4c7bf06099194b2d646596aa439d82a214e6cb9c5ea1ded727c8143755cf881415b6357661a90d5ae759475baa6076eb478a5826f86f9868afc47ac3a02a0e84579a25466a63d933b071213c886790c320416d9422d280745758779635ba6f848440b2489144866e8e018200cb8305b3060926d7e7213089a06d044176b053f3bfbcecac7840dd7844ec29eb17bb2caf321a5b17848c16a678552727a3d70c34f024164b3c4856b0a4ecbc78d345187c6e09f055273bb775078b43ecc534a40e66592b607b56b5f9304aeb048375ac71c30464e979a656f1728a7b700e3b33e5026bf40198b94455d2be37cd65867522b20bddb5ecb7a010191254b8a403f37c4577a613ea30678daab55508b16d6020f074504f928dddac1e8367faf6199715048c96a8fd6bb225715accdcb012cc856a76057b6b72b09a4aeff5b8ba278c54a750596e82bda45be19014e8ff52df181435ed9ac8c402147b539ffd984c291535b7bc8b26c5036352520730195fbaf40033fac450843e808b9ccbf03b40a9ed657f6ac4af8b65b4e389280633d79799e0226b28b356fc2e39f10a80452dc934caac7c3c521f0c5544e7821a403688f08378c3086d3ab8f7e4036ad516778da606204aed3ca1ae8c42e11038a64ec78a5fc5dcd0475429124b5d665e4acbeccca3a296a8e878b917b886ec7f029491c661bba684ac4229cd71373c829055b602db0518a481230345a34a709010a03e4b197273510a0a24465288c327c10c75434d9473208a7964db7792ea81c5fe0c4bd967c3f0c98765ba7d3faa4e6097f09e9bf10638fb900a764e4a0bdba2f19165bd69832681310a7a2585bf06322a3238dd26a4807af44faad999397d4aa14e76c2cad5326ce573d7ca04c03db769dd01a65583ecbbb991e7a31b59238f8741845f1adb5992607184dfa19a9e8840ed9e1622ab93031e2b448860d411a3d239277052cc8ea71046a0b1ada191a020c322d776c6655ae71964d86314a86a47b6a367b8ac5a4aec75677226de0c1864492c88fb70a53187cb76835d5477346646a9da97301156a3ffcc231f9a0da760dac142674e5cea882364dd74fab66901dbb7eaf037008c52073054cc2f94ec845444054058402515bd206d496bfa02c442c746ff3e662b899c34c40900902c4f8ca146458522c6a7af772b2df483f9d840fe07464b0c66fe1036c070c6f70278e9506342663b07529247b16971c5c222e297e1951c5424665e24b2f8c0a98fe5988a202b02db7021b8caf6f390469cb3a3a44b1bba8028572290ad3987c84380706046d3147f2a098f6c11912d204ca7830b49946da095d77e4b55fbc763df31a6731b9bfe871f8f383d3645a44b18e8b59bf1841c48da75a66a1322a70c186d7751853949a83af71494384221876695a35eb526b3431b4c02a00503d962c1e35898cfe9666b5b71aa88309266ac0cb7c50121707c06086e4d7aaa918ba75f2ac0502a43d985eaec44c081b7aac733c065b2af38807477501dfd6a84436bf9609b5ee21c78e2c5ea1e2053853b0ebb570fec357fbd227123683292c58d082b4990c7b8a9b8a15b1a72017844b572eded48d2f902621280cc4d0174e0a04c712b558184ab893bb70b39f7e92b5c3ac61c4e0a4070a78a6b0bed6170a0e07606fd15f0dbc553c64672ca3b8c30821d6973a5176aa2a0343fa15a75d26953b965d64d94b6e3c5873fc2ecd13199f9caee6672847a87dc7d31534870502c3a0b9493aaaa5441099b29a2c0078854e13f15e1da411cd086a12f587ccd03038c049e8ba7532db25d4a855a1f7696a0737c1fb5e2130a4f3ca0ae1a45429a44ee55604e31858db353241d620818a5b9698556833398878825f22a2f0b739d39c07242aa2d349002979929af37c74457683f940e503ab5e475035921abc92b5850b39f6d2052f811a869c11aac93fb6e063e7b495a958670e276e6e64bb63268bcd01064a782ba3443c4e0255e3db3e55ba7082438bc303c94146bc67270a12265eec0637761c47ef5c19fdd22d4685c335146998a4ab70e6b3a9f63c7f95257cb7a7ac216c480568056a825ba6b6a25b084a604349bc4fd668a0c6bccf84db88fbd504aad20b68b67ca7d7c9881b948af06ba3f172456b250850aa03580de5312bd85b9ff9e746fb26c8e3da128e2ca463bb010a6872bfe975947b9b00bbbae5e53cace8380d1c3b34e71b35517764635f1c29be58b9aeb4704b2bd58f81a7a20ed1a0a505a994b0a8e71a72431991541c9b39d4b7de179df2ba5dbc12af93f057358301d701c3fbf119d1f450ba9900c483546e3cb55716ab5f193dcbc6c175697d9403816b263bbb71930f55081d8c945db976ff8b130ef1164d6bc8d0d1b2244a08b5903587932bbdbb7d60a29ec8016c9cd30ec7b81b1bd527b59c063c134340d35495d89f3d46728159874b8cb8edeab232885d635c1e46f4653c70c95aeb0370da4529d319a812c9b9d210f8655222ab13dae5c0f9bc3b6b55a23edc15b132c937c0833beb8058529a1f2a880d7b198c947c65db8a0423848720248d7cc937346bf0e01996032106192c58131335fc52b6817c97250d71f613a0217fec98b713a08998b8932ce850097361f077683147740a8a18cb16367fc1cc8771bb50fa550c667fa28822ca407399634eb42a79250483663708819c55fae2c4cca04ebfbb7582bc84ce27c2796955d334af342589ab196b3d03ba7b58bb209017c69a95672138b526245137265948239476496a6100d9ec7092d931f8009bfff9a7dc22908074c3e41a8e6ffcc199fca488753321467850514ff99606b7a8b975c03b05e3c031a99da72bc953db617dc41d664cad9913000000000000000000000000000000000000000000000000000000dfcd8e31042a2b903abc95630619551d24aaa4eb3a69f40224dfb4ae4538a303c975767ff083234b2979bb109a24a27bca17d170abd8d9e6ad3c3ba19e306bce +ciphertext: 852e70f6d10dcba613c39fef87c4147fbe2af99288ad6c18b6e266dad0746ee662ad0926f4c0ebd669b27b893777a545d12744de0ee34da7b38568eb1809245f9a03547704e353ba537f35d5784c37ca5cbf3696975aee1ead6b376960131f6e73250307390b74a10645cb38c7c16a7bff98324f994e6e3a8d7a0c0ceac903e8be98892bab7d7691ca83233d61a31c2295a134682176787a40a263f9d8a97c9b262ad343f3823739bac811f95014f6403c0bd8a7fea4064454333e8eb63dfff6b3a9afe291217b0b0178c075cf04ee3a0895606c422e24b634237c1ee72784e14af8bfcc232ebdbcd2b493efd28c9a849bf47737e20948ae7a399907b0f2a5ac9ded63aee710a30f76327f3e1ad042dc12776fef148daa0acafed5598650eaf46dd53998e6c38ed318ce56bd35ed18f99a34fcb4f427b3de31f4fd0ce2bdce0f80248ff2370e08cc2eec3e6a71783aba779abf38a8bcdac9abb75d80625bb4420e2bca3cf4d8867bab62d6b884ae9e6f98099458158947e1169685b1a6f7d6f554bffab3dad8488e0a159232f3777cf85d9dd4399a89f1610943bb7279514e0fc3737ef8ef9ba12a4db6d11933db6f57c48b54db03470b0deb7dadbff48d75ccdf374f8bab3b7d3752c8dc4b513070fcd884d94e435e63b4b40c15abf109ccc5d9ab51c4d069685550baeacf37a6736daebad595f96e2f82c5c458a27e129af4dde2eac2a5768f5e4a4970a0bc68bc4d0d32fbc275d1aa988ea425838297722b826852735c4931b97e145be9c6b399bbf4e970c83e98bd5c1be7942c6419b0819e600015ea82ca0d55894b0ace32f24b2652424b85b0f86755f1f8db64138a704cb6ec6f3e2a4a5e708713398101e0cf8d6029ffccdddd03d8a8074792232622e00384ee5b9db3535d7ebb14713a32806861877ed3ad5b293980b68f0408eedbbeee9bf449698f0ecee6635f0a8905d378d083f80a482334d30443c139cf5a1e2ea7048cc4a1829ff36f9e0f674ca22d794c2d7e9dd3cea60318788e56b3e6670215b82acdd4c9534fcf5545eac516261dbe4bb2e7fc38face7c59668487507ac122d295ca90af4035760c9b89ec44f432e8977583ea2da6a21249f667fbbb5c4307bd3f2e47ddfc8aeacb54bc33d1365ca3b6f75c0b50917e2c84849f1898a3e1c76ea67b21143f39d4002026b0e2686908bb9fa502a88c7b5c747f57c13b9704452c1ceb14a5342e40cad9987bfb32c769f110d3d39cd41178e248d51fe7d7f1c55a5f64764814495cf92a4155640a4d3411a74597f4c8571dd0662ac2ccf0ec3a82750c0ba5c3745247b7f09b62dd9c6484a1e0a0199555078d3a750784c96be465053f3e024189cfa2875b3763971b48b5c8ecd155f879f494d9be7f4e27417a6fbb8843200eefceb4334341f8a5a0e98769cc977979b405fb0efccbf442008f7cfa18b28b48ab56682a91d8362b6b5df54db3dcdfa25d4740a13ad8dbe014b210ec14af156b34511896e64d08f37b2cf2a383466351270118846b6fe505 +result: pass +shared_secret: 8da6007bf6e536286b9f65fec6f014680d193306a55d37978cb56b245e256eb9 + +# Rho leads to frequent rejection on matrix expansion +private_key: 078bc69561af0cc77acc291fcb063e1d7c82bdd7cc31d5b44d1aa746e261f2a592d4aa9165c2c3755aa457b886cdd55840767f4fa0b19e45410872cb1db3b8b5829c4ce9b2a8969330cb5bba2397119310fa072b7053b35fb135d04977b9ab4766c4c1ecd9695957473f10c679d71d2f6b57db2ab0726022bfeb10b61807d35447a141255bf5b3d0e3bbf5cc3ae74932d87268e172978d78b99daabcb16b44bd578f6dac130c2528fbc89ffa94b48e6785293023e2605a8533a5ac17c15f34b1e30501729a78d3b8ac6e4a329e1006e0c0735c737283856d7cc7663cdaa1610b1045b7423ca8ccb59ca6b1c482dc02ba117c17588809ef8506f09a7162720142e397c6ac0f8fdb02e4c1c557050af941ae8165ae01d9228f767ef1ac3d72f27cf9a2282a6c379a669d01cc0a6c560b21169557b88771008dad62641f435e0780234e86c1ead05f14c0ad68b6b1041492a166bc4a278b0d352129556d55f37ef8969b596c5e41f8597878c8c6c83de675019c022314215eac667a7b559146478a4a5634ff193f6b83673072643efa59c27650fec168ff17109577083bfa8493f38301528f27681405693345e523ea4398055606d4ccad9df967fe59428ca7502f046506756a6b9a78182383db4baf05014fbb20afaf148456126fa393abfc480edc92465d93aaa158c2a8493882b24c564b607cccb2c8f6cbb43abd722c74c2c63230946acc091c48b865cdb33edb712c670648b07c06691687685218ba48648fa3054ae7a6a663aca6aa4e66506516100c8f2caf9c0645f2554c10c480e798b9c96756e42cc8a7f626c2759d21555342548e0490420df3a8124b0566b1804933b68225359cf66caa599c55573b70d488d16185496216cc09090de382d570795efa569aa5bfa8f4a60665cd30d63bb36cc5ac050310ba9bbe4b3af2f9400296bd344cb72bb623c757366ef1369c968578eba52a092dfef34aadf552a63b1495a5b78168cf6e58b218a3ae64310d16734d5e72b2036bcc001ca07533085548809bf114a092225aec9cce6950a953773ee37ad3467bd5ea0b4cc4c6b0695a774781ce17004cd48e36116776db19565367c92a94488ccbf4ca3c3960524d1b13d6f77399ac625de5a2d09954cf867011f79bb4c3682cd40f133a9d67778a24d7cf1a5b71b7b81dfe335d0fc392a8b12b234950ab79cac94776ad1b713e99b0f394aedce739a15334f19042f4861e739c839ce07da145808260b159625b5a742258779440953c743c591659b9d982aa7da028c7eac4390b47b243ba23e8ae4fd9c98042a0c2d25a6688c9ec774cd7e95899fb7f081035b0c4217c2903688ca7e4466e66ac4e3ca938fd58b4d6bb732a36aa8e097fd75976d1200d61a5c988c12702698b1cfcbd93157d3d1c6e76d316b00b4e462588bbf3c480d8374df3cf66a16f9dd2ab721954e02a9f8eea4380c381da230f10c2c7dec02b057177e157cbd5304ab1d8160a323fd5892fe1649c2e270dbd3777035912dc0802f4d18a56356b52946f30c516838028f7f39cc22466ed277a5adb6864972e1063b1af0709dfd60136b16a3d6c863a68895677c488eb1d879a69a5341a695212066ab848609cbe33170cc2bf4fcc4e0ec002da4250cd5320095843f29795b36b634ac922e3796ae428c894b1703332b83d9759027588f1ab2539180b75da984246a745ab595c46ce9852029995997ab27fa2b94e165025e7e7061f2cb35a907eb6ebb0e1d2a29e139f179078dbe13abf1787c3282fe45a1578e5752b6950e7428ff2693c6e6c4ad9b960f024a7e1f41783f7112489112af688b762819b222e1d6246717b730aa9b224ea64a1a45ace60257522505e69bd1b2235f8d71f8ba5b5ed425ffcdba742379a7e1c28af1c8b35994324051d7b46a6047b77762c158fd5977e57bd4f398d4f1a70175897de6c8a3ff6ae90373065233d7c4a0e5dcb8b0731914b37cbdd29148be2649f055df6bb82fb398a630a6c556c3fc442ad78e24bd1406a35d82c5f582610bbae17d118b3f0347bd84f7b8a6deaeba8c698c456502eff6203594966c1f7413a056064d09bdd273b0ce56e506c0cce2267df24a13d7a0cb5513273f37438b568c569681314c3b6db28e05478e075abfdd53cd9291614c2650dd58b40f66b10e3a5cd11ae650aac35821d5ff612d1662a3714962b3411e5996e3ca3b839a58898848ebfb869e9b214635109129c333e931b22d34c63c96a74c3745be124c153512c060ccc6a36d244139f106bcd78808db7cd0dbc3e5b452ec753a643107a5f946b8f319a0fd28bf86c08bd16cb0324c44a0ca5165174f4681b6fe85b21791bbe1b11874270069839213b5829aca7861ac642e4757437742898416e2988c3277f9ce35f82218e9eb72afec300b9e59bd1b10349994bcb34c9fd2b31ff7482ac4c75b693af46a581dd85cf33d21e600bbc2921ba49053cd5d28595799fe23541a7d6b4e4e6b59f761e0339157d5a272406be1a776b3eb2c3d33055626712b304c4e651996f26866dd8a99c607f0a044a4ed4c04eac8122114eb6f567e1133a7d385b4edc71d19655668a86cd64503f0bb1cfdc06d9d387e55296c4a76a71b78e64daa58440264a8a6e73d2bb8c028ec970c3fd7535bcd65110967cff563ee9c5777a465003fa7ad97230c2c76bfc41b5c9d26d9a7c3605905fcd99b36ad5c6ff585513f633b26617f144a3dc4c70cbb40b7c3b8d0331014fbbb7f3c59179d226dcd4758ccc3cab8679085103e8949ea10c796204ae993750104a2123ebb902aa8902b6241be505a9e3a6734191734bba77c969e92a9c0894367dec1f0d50ce5046ad6f3aabdb138f5746a737082bcf6b8d0777b4bce1a9a35b2e0d794ef713736b4966d1322594eb8e90a5af2b42c2d7874296401f4e6a66c088a73580362031c9b0119d22dc9e6b649ff220919d42167f5ab863603d474051e3c424a0f8516ec0652545c6bf0831cd8aaa992c120d2477f791ba1ff56ed2bbc2e39266cf618580b7b19aa94755869d7834a7d4a87e234c25c0e595cea31a8715bd76d3bf5e6badfc4a758d7bcb88b5a018228c234836a0c77bed231a64249a064402d5f0b66276113022b3bca4486efa97103560751b108a5a10579c73c1e06b0eb117ba5a635b459e2f3887734b83dceab3ce9a7dc758265471b795221958359ff3ea282bd2c099436fe3d3c5b2000cf0db36a63123e9c897249130d1d27bba527eea241d8c930ff80d000000000000000000000000000000000000000000000000000000535a9913e52f1282c372204cb9bacfdb259c053eea92cc8e75bdc797a5b16148d48790195fff2c19f221b7cd8637576cec18c29a4a51cd07c82eed4974c36e8c +ciphertext: b931ab298f4492e30329ab86e3d92e6241f72c568f8a2744d493c2b02b8d5d41470f0d73ffc08deb1812a6f4143f97afee2682f6d4809a0ef3e97ac2ae4468a5d436c5549f751b440167f86cf238270eb8c2e3d3d9ac004fb9ef5245d32b4740fe79543c073b41c8a1773f11b41c04ea5eaa467758660c17a6b38cf19b151e9b6c68fc35708be261a9e7cc45d771853132a5d7059e3b6b9bc94755f451452f444377be5821aafcddb7e708fb80f31bf1a89e1691009e1e36b09d754870e24fdc640afb41ac6c4260b68dece256aa9467dfbd29a25ab901bd1dbaf2efc055263f06780a73fea14bafb12f14ea2b6516c97b1a9f56713554b218613510ed7637940272b502ef32c3f99718efa3fac323207da815c6c5d04823dd28f99049ec50fbc590f519d843e0cece45713e42ceffd48dc1b7a739124c698acffd4fcf1390351af06ac1212be3abc5f8a51369c57b0108fc593c5d7185686c6a27363416e53f1d578e7066456e6164c030328ac53c2ea6fbb6ff508be8c2f973d3a43476831c94a7e85de88b71fa77be26168f82ca3620d1024e2bf998340271a4e2df0654ef1b6c9d5a8d95ace50a5f5ca3d321a9286210a21ab97d64066390e287d85345d22f6b42d597c5ca8888c1f871e34a4d1d7e89380abc284afe3f1f7784d47f75c674354825791191b2cbf5607ad26931bc0bd05ad2113d5c93c9e0e71a8b6c69ae4df3383baf71877bd3274de23d68ae57d54e3679b40950c73fcd38c1b8ed7c58f887e5cbc74bd388f77b72875828667b143571f6d0b69cebdf828b49d6f4a6d9dbbdb2188e1b0b30eea6a5b9970962f00f8b8440dda64629988de710a3e086e6a220d27358272b680a91195115741c77ff04c0bed30a2c47422664669aee91d263a196ad48dc24bd386dd9df5724965f2af73bb7a406bf9d17f3485f140b52fdbb06b9153bd96cf0be8ed4c0024571f859c8492ed4d970e700e11360d4cd51b3cb29decc38944a895978824ee94ee6ccb6988337755c07491f43526db47e557636740b393d460b3434fa70833c490ff59aa62e0fdff9a0e664dea7425ee586c29c7648a3ce8ebe5b441f647596af140a87d9525643bd97707cd910e17cec76ed33f4dec0c5222ca182654c8b5ca12d5801ea4c26bc7ab9877d9f838d8455b59c5590f4c602887e219a12077f9639be7a6f5d227d64540f3636c46cbc1461e665f677b0183c5ce13f77d923b368d05030b04c16ceda5d511fd0db061ef3b626e50767cce8a5cc108486e941b7912d944a7a0e0acdf050eab2f600c242c250bcfdb93ab9218a4b495457dddb959e0a8f976bbe147674d5ee92ba71491812ed10fb7de3e607d6ae67344e0a611a6e82a1b66e0528598b30daf398c98d5370e6a1630b7d10d98b12a1470fff4c04a1859415595362e29c3245164a2f1124189c3c0e7b0c875c658fab040c5e0ab690193e3eb1951f24ef0f39bf51fdacd68b65b445266b758dea04de3b3d3137c9445351e9fb80f394b76f24383c49c747e9b15814 +result: pass +shared_secret: 46f591e3c6491c7e12d58a7d06ea5354bbb77337572b70d94e4badf7ce394e08 + +# Rho leads to frequent rejection on matrix expansion +private_key: cc4a14e75a6b1bf87f11a240424645dee23657db9819ac274780c2d7d8ac64f2cb82530b40a078791a2ae70aba868253bdc3045b6254c4e29024894cd13723edc7461a37403609b48f79b8e8b1018981bca9f68031dcaf87528a6b065d8cb83c142ba20d68a728a3866ca88e6836cab209ab49bb234312916e432fa51152c763a62cc53da61480691b07a073be74aa6c2b88468bca8302a23d1d6405ddf4aec2f88ab055b18e2b1873862af6539ca83b1c270b6a563cbc7a220cdc8106e6e5595d63a26c0cb86ff11b48066721634b43b361b57a5b4ddb2967d232d34cb750026b362cbd20188260c6a856e9493ae09c462bc4c8663c7903112488b06b2a996dc6668e382e9cdc93e52a1a368b07d8388c9531afff0cc4c07ab423bac717dcc888e213e3a75d69a633f49745bab10f62592f59d53ef19b6a62f0b24216aaed9c91203b7ee65b9d097cc1e2676deeeb576ceb4fa4a867ab7310076a912a41292c658e8f75a98603612558352a5b7beb404fd2bb6de18c7ac838464b6399182536509624e1e25a7821b71edc57c35541cd115ec52c13a739c3de231ada741274272383cc78bc9869d37282f5980209543c92b76ddf99c3d45cb7409b5e44599b75412d8bd122460905c250a94dd4052c0b0a91c9a906aa3652180fba9212046b4f7ad14f7c304780d553f19487b8b7413de732ba1296b41a2d94983d4be93e540a4a4137a030629e97fa640c21ba5b7b5537a03a2a958ec3a888590a5c14a904dd74c83631264644cc6689a245f833530124f7d10e2596a8be227f270941faa75300bd731c145f781cce52247418595ef67c94a170676cda269e51c7ddbc63b6765b010aa061cc576696c84345c35c491d3e4626efc8b73dfcb481c11bbf8c79c6a3aa4e54c43a44141f5c35932486320567ce37adaf5241bfd8c44ec140d30823b58223b02742f3e2bf5864756d528ea36348c1c2293d8ca050b6307d71a20a036e0060697b58a0ada53eee5a6990a9cfe283436cd36a02dcb1a2b7200a267c3f133ea6423bc001baeca953515214e2766f066cae531212dd3551e22bbb1c705f21753ab60a70f364bf1949901d9a0415a36567614c1aba2dacf2c5435b4ee66193c5e461596719790aa792d5a09ac474343509ee36ca048751bd4b0c644b2b039b1320b2294df814b419c3ac55541be5cf4b93593aa4c099142de9e13699a40709d70070aba9227b6c14f216d434c9bc16112b8b4237f838340a5c317a618a91170709bae6a7c13cf96851f72a8761736c452df27758afa4b02fd55b3493b1bbf96dfc45ac743718978b7de8a017eca45dea633dbc417f856781c856c87516429127c6a3d335f162ace0982235ac79ba0ba68edbc1eafb9ed7a3597ca7a612a9bf3ef2b0d1d7c238e98714a434b8b08b35e3885e007501f9bc06e841921521d47999db3ac3937468a54b95b57a2bbe34aeb48ba57f0744021bc684456a8ed413b9192057eb77a5502dbc89c5964c0383b4c9034396da209279199ab5830abe9386b2e811c222a6ccb0cb23732a95676fd5c0376505943ef8bd67a95defe0af7cac395a743bdc3119b1a74771343bad21c53ec80cafd7548ae310293027d62960f8569c9dd09912b200bcb155e7f388139675afca87b0aab4e4e2535207b4d1123062772bc8aaa028597d15f02f1240b3a4aa96c1b344b0b892bd52b3856ccf6ae94028574f13c09418eb998f741c1607461bdb8cf4094c795acada2c015bc2b5f4da99bc85b6715b6bd57aba2d016220ba2db3a9ccf6524474e0c3cf0003376b2aec2b031cc4a224b66e139397e338a8a1ca0ad7c8a8356b09078588955157fee40e4ea1177f7c13261427eb047d14a826fbdba1cf607547a93a61c8a5ba200abcb676deba97fab023f5234b46c99cbbb38f27fb68b0a2b89937be4f61b3bad5446b74542b52048ec9310b1a2c30c25c569a2fba55be118472f6147dd65b171c654e8c3acc53637a2f409dd14b99ab1a772d755bf34a43fa745f7d2a55600a8873a5cf852b1f6356bcbc2a70d134471c7720918528b63270e729472d1093ef72629c521e49508a3e584f81250717f73909e36e231b0883d9c474ea0dd64400d26317fb8569106983b4bc3d0818987adb741d547fb15235811819493c1a92f665352a92495acb6981aa5fe83fbcf620045275017bb652ccce8b748eb9354bc374c131a74854f9a2bba3173b1c4004607a2c975e3ca635737a7f5bd35c8798174f6bc30473c5e700b42a96054de8237b1927f999351f370f1e241d89083ab9cb09a9e908fa82a0a3ec9f37375f30eac10e20ae566b4ebf811513825baa99c7a9265f73b2833808a52a755bb106afce71721e71c693f29b402b8e483000e1a6375ba0848881c817b47d3cf8a2d64a757eb80e02109a8e0a873eda7333e7847902a4f4c44e533a8a8039516549aa7f172579e063d73999eaf47c13d73749796dd022cfcc9522738127a1c984d9d3755c29bfc6b52c08297662e24ab77790c056101bb2916385bf418222d752408ad1843cf6bd80353a2068ca714c082ef86503064274f94065926fc59c107ec5594b365606b20bc010946f60c7516c4e59c33a527ca3229b2cc35459bcdabb9dd8170b1b319571b535d514f37b3de62a906a05bb90320b88b989d3204511a2151bf39425a1572c192d8be2b695f18dff4a7ba7206d4409c9e51c54f5797ff9055837d2459dc85233d3c95a597f7596580a83ca3cd6ced5278c24142f90b653280b54fba3159147cb08095422d4765112030f5a696a628d8a67b90d27762665274c338540d7a32894523bc53dbfa760146b32edb938461c14792216a4b94615615afb151604f31b518c37ccd502709325a2013aaf22ac49a67350067f405809addb023e9a13d6734ce5e71f802a147c191536eccde7a67295bc86322a7fb83308f40a5517b61a790a8fccc469dfd752a45416f352b6eab11f0623551b49a5ec2754a674c1847bcfce66c9f80946eb65a419c06747c2a037a492d11947afac79db877af9750a85652f6b06447216bd69418a86169614e27b3579a8b3b669f8eb8b84c252574c856d91b081043710d0abca178b215854f867c5b0da0266977fa1e75d29d560015755f64b867f011369ab7189a916207c99deeab286e635b4aa6521da156c310cf4a592926b33f49062c94129a9547ae24a7e0bfb6d4f67bfefaa68cce739f46815afe593e8ab3a63a90797c01aab7a5f0e73a2d589000000000000000000000000000000000000000000000000000000b7fed2a7dc9aff1d845fd0f7f86e39a5d5e66f376a9d68ffeff6cb718eac8503a9e4a0d3487b6714e18bcc9d1daeb3127164328a19d5cf60822f3fd37a24bbed +ciphertext: 87147134ba6c085c2b878dd751b77273438b4e9efb50696b22e725bca466abff4ba40a150b68401f043b73127177e579be1d727ad37ebb79b2f5d3ba038d4a8a6b74633f31bffb103290c0694beb9c4cefcf47fb2f33ffb3d8b6126665cee64c6eaf385a816167d149a328df0efd29c4bf324e4f3769f8d7dc784da38bedcd8a653a42b0738661d3799db5c9a8c65b88849d07b27c5c88032a3b090026fa2d818a4e26672fc81a97769e432b217df4c551243354131100947f91df1cb442200a08eded975c39b74da9c22dca588f8fe63cbbb6470e3b029eebfb5ecef2825e834fdcfa2337f55571506498dbf2c97fc02baecd0d14ddbbbb4bf48eae0de95d42cc8b364d6703574a0faf12f72df2482b78b005d800e31bf1492f4250254a0a48990505300d90baf577191d8cb6161a4b39d18c84515f26216af074d110bed4b2af846ae9b13fc485e55f9a72f7347efb147045f27c914a415fffa32ab9f8251a03fc7efef160da5dc25e5b5ff12fd5e999fb7e55c9014a9866e2018d09a4e5b3a3c1c833985e3bfe3cf484a6910248794e636822c40f6a7ba6cc35baafd7557e1000da487574bc7f252c9b82b19febc1455de0b9b79ad1f69931180b47367c8f621b46fc09d8a6d43d91078121956eb44ee1f1548f8d3513a300c626aabe660ae38fc0625ad42afbb5786694b747c65fa38292cd5127f20d8ef0039daeb8963d8639a17a64012357d1612910591faf05e842e23f14faa4b01cb657bb4a4cec7a11d35cc2dacd5556ae116a1dc53a82d1f9ce151a41dd05c953407669f86730f9ffb68478179306d56009f2e937e77995937ff72df576c552672893f1f4021d1be8511ed04d02278c9628b0ecd3182a32ffcd9e37ab0795cb161b50ecd0f97aaa90a9b4af816dcc21ec5f1f54e7170a4167dd2017325888732138e854aaf7e2eeaa964d974cfd3fb810386937e92ad92cb4fd0b730004918aa6eba5b64d1df55f9c2d0d4c2db8188918b7812a71592d4a0924fa67b62e3feeb78106e491cbb7ac9d456c3bcd747db26ebd3b822944bbacb1e742578b35b4d6d9f49efca4c929276ca6015739a0b4a369a7961babe2ac95b3df89214630218182aaff57be9268367282e4a040accded4cb93170cfd765535e26d2ffcc4e6eb6832ebe880497dbe5edc3c724b659727d5aa9b067719b6a9f02616504cd3eddf0d56e33766856b4542132560619866958f8aa54d434d302f9280208fcd3ff42bccfeb450d6ad4f0dad91208d357b2174fa67df22ea7b4b3176843bdd5e581654fef45c16017fee95b92e5a1f33cc6e3eb1db250e7c6485d368f8fe9e53f5c863edb436d7ea007af06570d3725f07213f24989a637d9481ee38e26a4713450d122849990892bb2f95abb6c402053a9d41bc8b9cc9281bc6a45e295997a1523942f125c3f899f9722397dd1678d3d30e43c20fb0f57ba95e6d825adb66ad7cd23c7a921709b921bf1bdf0c22838ccadc9866c61880de260f32aae94d6fb6e5310e72ef8d881c3d5aa08 +result: pass +shared_secret: 05c30333e58ef628d111f6aea0cd8eaefb393f4e1b9ea8ce21c16decc506a407 + +# Rho leads to frequent rejection on matrix expansion +private_key: cca22002e0b84e0c0fa98c902c2a30f0d9303a411db91a26576834d4f1645c181bba750c42ab6bcf401739f83fe2a4a3aa1a3f5917418003aed863875fc044dbc99c70b27758389fdd3cce51d5a13b21afe1219f0bab5dc3b15952591e6f80068b30870ed644de082476e7b32d3a531ff8631914c7a5c106a5acbf8672ab4a304afb71b1672cb281438f0fdb1db0f52948e8b0a1422ba10ac5e0a480e87bb844072e7a134dcce36f27274775fc6a8bc611b2a33cf85a4820e18b47b24188030fcaaba998d84a68424c07f4503abb553ec33b4be2af3557aae2797649da014dd0264d00ce74431e46f8969276b24b359c6750c5bc15a6318c2d06898ec5f473380a68302a91eb562fe4f10596012e5efa83f4c55a19912978a6583e4a884e36af1b9367e69ab0566c3cd8c34eaea615f49c094bcbc63d52a21d74c02462cb0bb7c77cbaa03df988b60cba880771a7c179315a9f6ebc6e9b8c90bbf17f737508b1691ef1952363e9499b5007a9c84838c2a149478e4be76c0368a8220b9a3ac68ef6560dba6b3f68257b6719551d83c38f73654fb392af0c1c2517851fc160c343cf826aca2c5614726c774c758e1abaa9ac04ae0742799060970909cbc2f78ca739c71bf6528f0695ea6175a4ac13555c3bcb9920bca3a37d363ba622666e54a4e779cad5059612792d610257a689975fd664dc5081d5ac4586c60e99b9a2a17ac612e5a794ca4dc097a71f72bce02b4907d69d801a22fd7b88f9e4ab284076037a0f6ac803bd7b243b835e51873919d3b77de041bbdb9c2917338f0c42a54ba6f5539d60e827387a9e7c156155d693b85701b53278139b29858785cb59788ed981d77556d27390285bc3f9408cbdc717895815d31641d0c31f2d911515f36743c40f4f3517432c620892149b518fecc80cd2d14c99730e0c940dec155930dcb5ef861b7c80b55c2223f7066b625c9fe5f0cb04f0bcb880119de142ce511affc01d483ac8db8b73e504b242315533d9c02cb64d15445fe32bb0c8e19383f82854981a9ea465b05c77cfd66d97a2b262bb37398cb4654a0fc8146c00b7608f061a216b9becec17f686b93d88309a7ac04c2447030b41ebc6a95fc52466d36dfd461bb046172f3b83fd10bf79c281202a60aed8467748a986100b97742c8d70c8de523c1d700489c391096c1b92654064cb7e35d7b25f29818ff39fa523c88bd69b8cf41689a414288c492f2a83f7b34a4d95770e6144b7731057c73a077a471e7b378fa48464c426ce5a6566e7c862131ebd5a1b3df013641a878fd702d167ae3f369361666514d98f325679c22aaddb56406e148e744960ee1395866acbe095542a6836571959a80238d037260fa053a52cbbc2cbc035e78fa9c306ebcb61ce33422584009271835ac3845524794f18bd7e1b4c034832fe68ba24a162815404f65c0af0944c9789b1d92767268c801a0444fff50399b3a192131e965523bbc2c75c286c96450c3f0733458bad7831205b1b4841a617626b4bee232cd1f220edf53b59bc213a055d956591fc3518a1974582f79a66dc8892ba71ccf7a5fae1c01841428525c32dd2b433445118559cb5447e3c851a0cb498cf99c2d359999fa3964af3214683995edbbcb52acd7830454cf669b608c3cda86752d97e95c16c99b258ae01735c94a7bcfb585f451d58a0673103b203e32f64dc94b301363cf1542202074458b6d6e8cd0076327718531ba40f2543a1a91b0fbbc76a93ba4c6685bba5560a9d6c6c42897fff8594ec665e311ab39edbc99580c35b35796b0c3b0d89b8658a1b140979ecd28e87f135b5b781374a766cc18f1fc03a7a3ac7f5fc0c639a2ffb43bbfe74c709b303abb1432614bb3388baf38980f18a141d502797674d76bc8159a8062c79146f24973d090bd70390961ba5ef62a5575abad1219e5bd2c3a063acca14702ee58a32a593c5236bbd4ba938a339108c8cabf2a08516408444584ecc4124991cba6219c7f031ece14288097ae7ca9fd370a52ed7835388403816bb1bac26d56809e9ea77a788c8d6bb215b0caeda1717884913754c42190cbf10387e56f92bf46209fe448312d930cd735770b6ba940cacd71a04d1692044a1930b0c11b701c851a26c2462b0451930180415de6a1addc504724042bb832faae8576f2316fd718657d7ba8c975f6584cc91c9cef5609a433b6cb1f08476363687944bc58c888a00925cdb862df89cf96b5a9e7948c53a51d02001e0a97bcf4735d99554bc86106f0970869a4470794e20051723f40ec64625ade826bbb9bdf962a0190c708c0946d96263ae580e0968b01d03c31d494bc002737d990bd0252662bc34337b1093b97d084baa73eab8636615a832b7df2a9c6196495ca7422ebc208d6048e16c2390c1c91325a30f9ba64b06911fe41b5ce35f62c1567029018d34775b6a0c8f70081e5c12d0c73dd6693b34e29c6c669fc485c6b5004fa06a7fc2d2c995bc15b477a1f7463d12016613b24332e4729f8784f9024c2b4c2e91a9055cda9347f7cc02f532c3e80620fbb124f0b8da57abc6e421606b2422dc450c5b97ba040d781a0ab4ba5cb7998aa5ab8a0681339dd4b8c1eb77ff830a4e865f36897899d003bab7395f5b580b78b0046014181c640341aa0a5920b1609245f140bc7a31fa942157569096495affa32248c4a67ff5456fd8189b5593412539173c6fc898118b2b98535401ccccc1fa7945eac36bd248cd081925c941937213263c81274bec5773abb1c4607373029c6fa59723b893fde7b77124929361467aeaa1a86278e6b3c47a68cbc28781ad199c68bc09f3538f2933aa011b800f9609f6887ca4fb3857f869c1ac3147a842359065b6a59d999465ebd4228735a5c7f984cc93928d4c7c44ec4d90d55d66709ef68827df87abcdf433f79342ad4152e405ae69f56689747ecbbc0b23d55c5f86b5a699a06df3573d8715c6e667bab949da615dc1f9620dd28d2eb1ae6674506ddb212b315b7c89b050e48fb76a4946b7572e6a187dcb4130c80f38328037e2ae7477bcfaa71efc3531b2438800744116b96a0f48a1e549a33d19b0a05c206baa07345ac3427578650a97ea1150ab66cacbe848d39c0c744612b4d0738075251f7bb508113126a6b0e93b67bef50e07843c271614a4dc8799bcbd633a1879195f570907c05310fc91ae2e6a7ef474c6cc1112653589b32393d1bb6d741c19d616b6a93c2adcea5762d35aa285702882463b1d5cb9de000000000000000000000000000000000000000000000000000000f81db56542740a79d6677b9acfa5a3841151471bedddc4d62cea3558b2ef18fc53f53a49ff45b0ae588d417a63a599670cd391c5e9885c972593d09350bd7523 +ciphertext: 738318f855b7a4cf13603f7cb528da3e04dbf38e61b3947e9c98d96d4733e6a2096a06afd90b4ce3eebdad11c4635d9e1ae8e058908df28e936cd049100ce5b69a29f80ab7e827c3be492bd854d20f9b0788fd3c933f3827add6ddfceb81a95f116d48adbdd6f543bc312fd5fea9f1fff44f97ac89b1695ca27f6afdd4a01eb80182830f4e1fe457f1dd7ea64c496f49b4904e47be3919a0d90da460ce60c8a6d66bc8d3ff55a8a580899eed0597981b9118c7deebbb746d015c8e117814f9abd649d6616bc075239cd7301413c4815eb880f7162666f296e06e4df2349272058d8f13e7255707830e98acc340195c0f0b61080fa8aeee33f1ef7a02e3faad19f1ced92c3941751980f5dd3c33b933423ec450f16543f480b6c3773764cd09a469db5d4fda16c64a0b80105f796adcefea0cf17fb41887e29d56b86d35574aa8a04992160408b6c30bb6370ad3b2eb0b8d772ef1680f1160e4fd3a6431ae5eef86ba8a4550b9344e2155e7606f211e85160642e83a923c76989d5f131986ba424c2d007b22d3efb868fcbdcf0b78a41b59d34c9fb24d3d65b9fa3bb87e36601ce99ecce01cc44bc120e983aa0142e6a56a3a6a19ca75c73185d48bb6179f8dece198e59ab821dbb83c429336e81f90b562f3da63c3fc910a13b8bb04a8e53ec067377fc1f1db752e9b2caf3827870e01f5f632734658a2c69da353959e5f00574d595bcddc551bb728bc13267acb7cade43b21b244a54716ba3b765ae331fca979948ded2c7fcb9a773d6bbd4509536d29b730712dec068353fdcb9d267b5ef0f905f34823a21a1be3df2657a078e678f6eeb6e0ab1c65c034b329421bcbc8f505a58a78d250e1a003d13d928cd6d305842dd127cfc805b02280d6f6146446b551ccbbbac16a4f1316359e5c2b801a31f674ec5a48287d7818f7e8e56f53c77a0004d8cabb530f95a54477fe5ed63dd47bdbc3d3d26194d9a488a909fbd4a3ec97163c7b8fd0467c6bc20d1cfd03046200baf232f6f5a6798300b70c197f1f616d12cdd17691406636fb1094a2e3e4343beb84f9a67146921397ae9be4160c1c81886db504591122ae7c90f1131572e54152ee1a203f521405bb928af9441a63fcb5445c5e9b2afce13800750babfeb6fa88994a8330d8d51061642698f02380d853bf2a57a8eace6b1d52361820342d00bfffc2dbfbbc3c0a8699c5f80fae249dc1bac232383b6eeb243d9e960809fafa5bea564fd610ca7c399c4dbf5000e4386f4700a561450d02d92d8b5ccf428306a9e57eaff931b31a4ca17e4d6a179db2abe53452560649f5b8f1858c0f66bf64fcd440b6384dff5e62f8983d46d924d85a4b449543ef8d5e0c023353aefc8f552e186b84378a1c34375cc28d83a62b04addcd057f4d83b42926f811b2f9e0bdf9d59cc1f65dbed5835b60404c048b386a3d09e0e7700735fdcb124c4238e1874f99703a685645cbd5cc3506799984d0ead93cfdcb6507d0cd757d2c0f1e350b17a1258e65965c2c6c092b6d4663aa3 +result: pass +shared_secret: 10198ed9166d13a1ca423fe3b36244be9b94fe16deb306ad742f505ace69e1d3 + +# Rho leads to frequent rejection on matrix expansion +private_key: 16997ff80976d1506b23c012e387ac6ca0a792f7481ac3c9775317ee3ca5267bc7180ca884d28bad6b5a05b045f33a9b975c6c98908d670550b874ca70a77424e48bf097256434b9d9b96c8b8149f02ba5bde9b813eb2b60f20da4440b4cfb05716bbfd86255a1e82941d2816caa7253e7368a4bbf4bf546f40b1bafc65bb994c34f7337e82818021797a431cfc664699bc22b92561fe3d1cd6306b89a36380920abbb466477549d1bf14364221c10f51fc3f7240de4c99b3bb3eeb9ac1fe12bb7c97888e8386da4a341a0be8f78a7b7c49f2184376c3c3784289a6bd9b6a03a110c228f72939b86c7a87dab3e093c0ade693a0e5331c48b761b070476f55cc45ba1dda14dfde01a011776143a4d29d48b47b0c6cd2111bf18360a7438f384a28d772177f648773b961a86637c946d7981a6b9f571a4c29aad07220fe081f1f18700f3c99ef28e76819f8d7c4c43d754cea21180c43357f3430bcbce1fe8952c691cfe9a7483026386a479eee4025a838df5c563b9f5a1882a2d7209a68d231ee82260a7eb4fc157936deab52618cba32772fa1440fb675220f4610d749a5b3b142f31b404d94d2bd816cc4773ec83aa1445a37b361e52b10960827e94171dce3c12cec80a1ec65aa6f117fe937673a78cd7767dadd3cebe0217f13c903ca25d6a681116b206acb46949b18f671a63fd2581a6c0978738460cc51df3711dc1215dcf75525d30559ab6bc52e16fa513753454888189348f045aee8a32e98cb2dfd708e7d42818115e5c61711a0c43e85a13657aadc24b5b30a04a43cb97bafa433204c18536337758c0db6154d4fac670fa3af148b52f24aa731c31f98464ca9bc975e97fd665710ee2c56b024fb8d7c7f4a20cc9d510f8eac38f96129c97b17c890417a21465d05abca02754ac3614e964f1a24393d05ccf5cb9500852cc9231656ca899f3538df30984475209f84ae8b99983e844b06ba4cd8a9640a513cee439ae13ad57d3846aea4fa165b68c6c03c05c835bcc5a63d45cc5568aef94ae7798bf29aa7f38e275c902236e63872a274e4776cf1928c492036166d04eed9ca64aa16ebb4b11fc3ba802c6b249e4b53f90112b587d36c6bfb0733a2ee3003419026a10a4c54c2be294b2031a48fe895c2c9920b3772f127338a865a82c3262dabac113c235d433b90d401f5557bb1bc68359020f75742c2008c2bc8862416910f53772a55376ef05a5eca853eb1ba5ef841f243b8d98b11e94483ad7e72fd7360a3641159e481ca50971a6e8aee73a0d4f24b25430ccc0997c631308fe2aaefcf79af5d2045932043d95933919b21ef87865b8550742a513d67af756c5958465f582983a777e9032ac43164e552358861a0ebc458e55865fc3545fd01b0e7565877ed3229f8267369c319abbb017a87ca662c635519ff418682af39ba387aa38ec37396b4d6ab505219314f4448d0f572f4330cf33fa1369872649c922bcd228c294b3213a216e59752072b8e026700ea63061855be3d6037c0cabe0c21f5be948ee4b18dd935ad358a5885a0331db2e496995bd47c3ff2b679e0abafc02804b6117271a2b00e33bc06250fb30ae2036716d30a50aa07e45f244e1f0100d7493cab527e162b7b5b390723c83ffc170e3e153b16285676101d66999fab321e9577d9f284fc3531e50715e790a2714e404232640de9bb0a4649e344ba2c33977f20c4488463a0dc58c1f71055b353a749a54db7b9dd1321d1f2812ce8a90a503a1e0e36ce0ab91309424b896bca7d39575bb6129e0460282c76b3937313839ad8672d4a13ef0f9c738c3c473f38be4a84de989c745576ad6f3bf7933879f69b8d72b93aff64c3d29292a794db4a140029519b99abd78017e5d84c578369a71089ac7b93c97a114e74a62c98b0b7ad707e60b0332b82af5d346f8373c11c83bfe543d8fb10cb9f128f1509ac3e02ceef44e52070305853fab0831bb05bc4ab8b311a2867a051b2e43a8254c787fd437838160ff13b752255e52a466b8543865dc61a40681b1e74eb7504442e943f99b7a4a695119628dd8603f9ce29bb9ab9202cbc52b78bea806d0d2305b442943c3d812e2d2cf07f2c2df778c6d6794114189162c537a9540a0bb75660548ffc56b1a5598aadc5055067f87d545f87b5bb232ad6497bf5f68110d16530bf80380410b67a47b081587fa78acc0621e70624605456aefd9ae2849c715a89a00332779216a6a8b3418196e23e76f919c6d4476b4ca606fa212258bd520e9d9162b066ac4e12568b532d584cd091606eb9a2f91882daaa2815230bc21ac33e8a8408be21b13c1cf90ab1e6f753843f6b5fd3446f93a2072cb3a94d5090e870ff2d788a94c912837899c2b04598c0085409acd1767214c822cf3579637c8beb94ff9b6327ff47ef5618e70a5bdcc76c287551ee2ac24229507b0d87b779cc59be8cc4d30ae0e161ab62a05c7eaa9a209152f37c798a2b1c76b2265dbcf930b131ad88c65224c4a5a2d1712c2a631c2982bca5afa6029e52824920c3c7b3093988d998001bfa23d9b01c91b111cc0fb7accb88d34f34bb7829192d21923d15faa81267e284b7aa18df181a02932a56dc4662f19148d055a91f8a3d97407ab9257108b7447e24a24c12a65fb1331dc2d06f60561d7bac9c993797255340c6770025f776270742c88ee4a899609304d75b55dd2c303b97cff2871cca3bb9cc8400b930087571dbb4c73ea1460bfd34595650098f38548906c2a8154b4017626a6b8a1db4b2a221c010937fcc8c06d6c7132688e1f2bccc869ca8f881303a52bc6313149b6450de00728808143f438be904c8de5923d8a02482a3a201b050d4b1735867eb8e7bf11d5023668c37c867d156ccadb2c383e113dace4a090aa9c1cc530cd17a94fba6c6ef062eb357e3293b343b169c6e169209b0faf0bbd5e42c3b6c077b1728ebb2a1e44d431f7c34835d9b0021871aac86d0782448d08236d94c0f69a46090b6c5916339baa15222a0496600dbf012c20faab5c7b7613c85a5c759d178c6a9b1596d291ce6b975363e47331b16735db2fee1027ffd018d8f338d712b2a79729fd20392c837fe40b3bb0ec9f11fa566e426637149d9041088419575db0734d854d0a0c769550a8dfb80da3cb9f4a7ba9b4c84e45b3457007ba2f380d19098d4f915023ab00e0872dd6485e1b365802d0326bda7c75e7346b001cfdb5710d1746bfccb0946151abeb7122baa4b79c4f6cc10828771cc9160000000000000000000000000000000000000000000000000000000982bf7a037500daa285465a7b1fc2d22ac15a00c1fbbb2c84d7da1bcb2b7bc9e366c059f5f26e6dfba8db203c5b27beca8fedd3de2664f6bd5c3e2ac9fb3891 +ciphertext: 37abc2d961d3bba2efa196b62a4f9acbcd14137a7253a9b30fadd1455c22014f3542558291c55a8a00cb44aabb2d0726210b887933dd24955282fb51d17d1838b6804186de8130529c251621677d8464131c99dc5de3879df80b5130df5409f0d75526357ceecb0be3bc1709ffd3df917e38680bc53017f934179ba3467674d8231f6513c64f4f06507a2e3d10a4f2e145d759a23897dcede141e5b13b235b274074eb976f84edda05d507b23f248dfc3ee139f4309ba099fcb250d7c4d0eb61ba359fec9ba74186c5956f118c90417931aefd5adbc179f58282a1885679f21d2ca69a30dadccd896b2e84b4497c347a17a9e3bfb9bd8804c3b3c7b689e1ca00d3d32e1efa17edd4c9c8a9c8f1ff06d991142c193489e1de0e4bce1e989491a0e1eb2447fdf301b5f72a31601a119315af7bb534a088707920f8ec8a951f22929f90e601e231b7e5b46e930d19298afc429fbc0a68a6227757b14fe547caeb56826e008786e5cb4d01feb8ffa890612127c17474a50671890c5ea51460973b3944b66295b917f0bbd0c188e37e6d85d3a2aaa1f8e0045a2d954fd6d22a36ea5f6283652feb40a694e5e46d1953de2e17a090d60fc16dfae7b0d0ab5bccb33ff90d13860be15cd4f1e4c12233a009537920f4b4738ef1e5d40c67e9aa6b07f921ed1100a1e6138c779062ffce429167c4f204fef3b6912f3b35eb44c9efbe164ce5c939027d8e9bf77ae311a6df1fdedb4b5fde5aff35dc94bf023048507371ecc567a1a7ffd9aec53e2301e2c8f9660890c61693fa638cb62d94fb436709c7e619248a8ddd71104d4b45f15c1878a847aeca848f7826e319856c09c4418b9ca0893b983734daac815a97985e4529cbc455855122f8754ced61b89d43df961bd6ffb1c6a7a74ca4a88bf7c2bbe9ff412b8f2a41294503425a3c39a64627a41d70499ae7cdee4fbc33f042e7cf4fa04d7f60452d6ed80076dac04c7fc2c8c9d79d7f7ac8f125b3b7b12dc36b6a50f9316ef24843594ff5d0f42e6bea4fd893d7f59d5d219f119cd682438a917c28166ceb2e96cb5d7e096889543fa145ca760827f9734171ca2c46f49f195e38784bdc6890d953b6edc4d04c4cc635b34847563edb6371e1cf168b47a506b324e66783890f5e21780a94f3d0a9d3021bd426a6e8c5c748661cb11ab4e4101db18f077bb973207634a674c7940863cb87481884a173aab7d5929b5a77127299868c4dc275669a1827a16788a0adaa52e85f52a349ebf4bd8f864d052e1b6978605a6d368dac7cdbdfb13f90ea6d2039e375928d8b9fdda278d896d847faa28a9a1723b16af26110922c76bad4154ce7807e5a8f7720b7b28ff4e097bcbc70bb8f7bf25a565d8a81b81f7569ab3e3d868abb474845bc2e6850ae4c3caa887524cb34950f8434baad75e7ce00808f1381d93d6f6f6d8d85c86b55678e5bb819dd1283485f4e1dab73819d8882e5149fec4e34357f881bdbd0345a6868e520c6c51bd9b355765cb129248cec784e7658e33f8929e0d4 +result: pass +shared_secret: 2bb1532ce907d285b2d2860eb9bb5070a41ae73585743b26b948cccd1731ce66 + +# Rho leads to matrix containing zeroes +private_key: 00208080e8b3938b09aab715a0b7a09314c3d2aa03e900528a209c655886bf0180a0775a1ee133e543c17d7c24407131f0b813a9287c5c9939d43ba2c1f064015c1babc910d1024bfb46a3fbb1ae13dc5d8bb4576787a592495786a53d4c172cbd3b2cac6a2f5ab68fcfeb2a67a997d809800615c043e4bcc0985de9d671e6e0c8b071a20264c457c13b1f4734f234142e86c23170821d068210b29358694d8ff27e89c59264a315b6591d97d90ede633b68fbc36ca96b823a4bc66144b541cc118b0d60a66c89124d9080ae30f44b9f4793cfac65ab8b8cd65ac81cd95de566ca2c19906a955a04047052a699e8a132e2e48aab916278c49ccd1ca0076b5254784a23f7a8c164229bdb9b46e1c7bd4c74639053cad5226c598918687fbc50323f086238366c4ad9172346626b54ce142053de67ce8867cf599587d0a47aff0a7fc113140c18c40bb31e2340822cac294aeb3a02652b424ac9f1008a592ccf70170246e689edeab03dc0249ba59fcc6477fb668038443bf9a743255310df11b4c90a97bd212a74d5142bc6461a135ce7376995372a1bf919e3db20f22c683f488395a95e31ab13aa707c59f22e85d892830bb550395633f6c87df28401865106b5cffb75729391767522ac236072250c6f4dda196a90bbdfa183113c5fe2e31ba1187b4f682399f3c6c0288977904ab445c0c1b9caca030aa639b35029657c1608e3a654cbc39f8f096414d278059a6f56c8c838b1879b00ceff668190213eb15184a57706bd8c9111667f52a656d161bcb5e7cb8ef5beb6756371ba4297397eb6d0c850aac1e01025001b71a874a25e3ac16450228dc33691b3112de319f69ac29f2a1cdf02a0cd77319931003910331a6268f42669f4a90e79bb820e5c98aa252dcbd056318a050ab71f5d60028fc41594688cea4a95b32529c39c582ae828016644faf4b7b1fa6fd9c305807c43dbba54d44273669bcf956c197ea3462a30be3aabb1a6654dc4a72bbae53982ebb986e249d9438d66b65fa15b723267ce1fc1200bc26656d7c4e1839e02927a96304460a34a9c0a22ccf15c7390afed4a612ef236f9d00c22d04cc1dc362c08afd0a16536985f69f6a15d6585c410ac7a39599c683b9e67a33ee299a5000c7e4acde611bd6c817b1aeb1373835a245b916620be6ce8093f88635cfb619a963c99785cc5c354e5d025f954071e380876408fc5ac7fbbeb4c532b1f1be67ebfacac4cf907be9485c6da8da380809ee102af0c98beebb088c13d29830e7fca4dab8c1e8cc87a3b4198c50686c82626c41414d50878f403c10ac905f39a901405b93366a575338ed7d66c0a27c9dbc4af2d217688dc3909db8878000af307a989234174363f3cc35c25a42d7361ccadeca25a484a01967be2a65bf4998d57943759528d54e498ab18514a5665b87c98339c3fc01baaa2953abc1aba78778b26d54bdb2ab69dd705d6953dea404adf8c82d29b932e144f48a2661dc2129e6a2a1bc5242552374a504e0d135e6cfc9fb91a492e443c608c6e5342361aa8205ac744ecf974b667a6528938b6085492298e97ea827d5a4274ca359a1811c71a574dc986f4262b2e29256c4b52c9a22c3f168988ccca0d849d09133648875d99c8a2d199343e2069be06914b183e36f76206920fbb9294e3f17787c4595ab553ffe18287896cf6452e149cad67b901767a6e37740624d12b4657072571b9ce524780e2374d1b381e211159eaa9e8f5ab21315e3ae48041f50eb75430018199290325406bb65eca0088fc5e0b72ae2522a1e65962afea8cdc2c1ecd1a8efdf38d12ca5d4bdb8ba4d50d5de96f25034707aca01a296e63033a58200f32079cb8cab973026934180857d054dd75371700ad89102434f2438a823048900ff4fbaca832065ad99fecd12a742c286c067a93ca6de6e85304572a4bc2729ee2b421a41316c0bd766087eb2a88d50cb182559da4492a0324afcfc519e0c1c83336913881cdc9504ead243878caa6783557eb26599fc56fa26c6209f31222b7bda6db9b50341f5741b6f029a00440bb1af6b4e07a46ba9626d2a3475fac7bfb2047a9b3139c225c36bccb085a3b60c51a6227230df260d8f47ae6598ae065395e5abb6d5478ee97a9eb1a369ad367b075642997513159a1bd426c19542c86da7de7d626c7828dff7c9a6b53006ce03cd54c4f709c231f70829593358ab2515bba53da61c71c9b5b1df2029fe3404a6a1b7bab3be1299577c86997e48d38a17242e75847a23a8ad5a7511bc87a0261a8ab0e07889a53323ccec92e497c930dd57e43f39fd495b5cc2268cadc2918cb8ca24aa28c110b84c5b2b075c2effb3d44b6351cec34503c94e8aa016ac837f504aff5f68def8c8e0324754736950f28bc4d38bb6115584fb681b1b05f8f8ca69f924d25ca3f7715c72fcc1706f83f8538ac14b79581e103cf385dd8962d012309ce7774c687ace4d8372d1ca7acb1cf8f27545c07b6204140737316cf8971b3448127434156c9a4d35352dec27dfa82bd5e72522517bed633a3686ccb64759396db9ba279a5e967c5284814058a2ad44b8b1e9a7786ec1cd7f63a7ef72bc1f5c35ceba1a0fb934a2a547c86a6e00a51e9f89ff8eb68e3a48e7ba03418072cf0fbcde0bb15a6ec0ae648c012203bd6d83e3dc917b7914ca31505e5aa62875aa96c4b4c5cbc5b368b18f68264cab71332a38680826895d339ca656d358a0d40db12ec43733e60a287ba3998e7aab76972ffdb3139b30abc0ab3a089a6223a04c92a9880b89daa915130fb21ef6127fbe74721677d129793fd035d6fa2a1f1719a710a5030abbb917bc659b57f166304a0474daed828e8145423a87abfb36822d8211d9508a6d53994eaa9053c1a69d03dfda68593b1b9ad2b3cc4591067658f8d62347e022205823942c0981ce6846bf02fa16a8b20f39e1a53caa21a8f8ab4667b00c040228b262724d7a95e1718af48ab870675a4ae537d364378560b4dfba04146381f4977647a333df3e718ced96d66051c3f5c2fadc67f29596c3687948f455c3b7b13e2789b518866968788758c2a172b0de0fb370722571be5259c76b06c101250a49b542375a97907d393328afba0dc21948d96861b5cc8059b5feaab36aed39a1180a2bb11ad797752edb36a5cc98ca13c4e90e48f91404212e9ccd4a76569d661735bc9709b0aaf7b068a09b598c96557ec2695755c53a7a70509d0294a55a1707e040b2a8564a623c5ab9094000000000000000000000000000000000000000000000000000000d4a83033492ea7388d0d03b115ff3bad6b0a7c4970d30342a3e5c3bf11253ab611536217ef54eccc82ada15ed86ba2003e177f270bb5aeee52f9436e31a379d2 +ciphertext: 37fa90752936a8099c78fb7599926bdca1d3ee985af00c51add7e3ff7b282d26b1690f34cd3a8997ead23c2ccdceb07ec9df81ed6a8967b848c406340dfbfb9bfb223b6dc849ca5b1969f7aa519a011e33cf10e641fec3c0411d22508a18bfb316946ff41be61a16a75bff04d87c44f33bb3ff9faba915ef3e94ea4bdf1a6a296bfdaeb3dc50aea22c4ddf77b1b53b753f3c228876c6aaeeafbd5c59d748b5e596535995e075d5e47370e5b0b570408b1f8ca0bc0c6d60099c6a465c5e6600deeca2dffe0eec616d97d9eb534671251956505e1c546975c8f125ef2a50192d5106be103fa8b475a407a1a0452310e8b1d78c1147640e3873ecc21811678c276185f24e5c6742423a8778f5a2d74a3fb7ce6862c5481a079f7574864e23886658b2108891480a481b64fa372d5d628948c202a4232bc0f8bf80ce2eb4f90fa47b6ff1dd55a6c02a41f6a7c68ee7f83a2fa094789ea8bdfc70126de68a61b5f8ff5b92601f97ebf53b3e196fbd595dad44490722147737f54d9e69835a98d42ec10cf1524dff2a267156028a60bef51cda83abb1f5df8a5672aa336c02d6591aeee7a4313b4e6dc2e06404158a0714bef56df074cd290fa8a16daa8a1fc8f49ec7067be5bb5856f23afc6b2ff72a2a64c967c374a7917c3552ad54124633285b5f0cedb49795a20116b692b8ed2b49b0d421eef3c51cb99f7aba701b0387059f34f71b12d8517e7495eb0433b69340bce1c755449f1d08789ef7cf9d0bd528c262178af413d4f40cef52392b87d805a4d88677b1b8275640b066e46fdf1ff25264fb5f4eba7e9e1fc2965a27108bc32dfc4ce565b98577f0d1bfe37471d11c3afeece6a411b33ccee3692f32c22f077401135713e33f5f868ac1852120c170336581521834e762070b403f49e08e52ed0458866fa7df50d8d3b5fa8e33e931313aaeca6bafee1cbfb2743762314ce70fd9fca8fc34b402ee5a2ca330f60725d5b81a6d35e1c41f6d8c88939859e3f48c654dd8b9cbb4e9e0afb8aa3344f6abf18b6f5d011d8905e12f4be7e7d4081573649d157d4cce8b7b2c5e13875e0d2c7dc4bff5e9d436ae112338390acd59c7b7e5a086cd3b00817a1a377681a73531d4f1efc7ebaaf6d528e984d9609c81714efb89b3f0bab8505bcbcdc5535dcea227d3507d38cf72133c252f5b425cb800ab6198ef3b33391bd5043ec17293fa73eb8f3f972e64c5dddc851f50f5c48175117e533c87903f2d215a27c01f6050795109d200f5e39793554b35b2a339695bfc55d1d32a06336749c09f0ece1e197dadb485e2d544823e013cb84a11cf44ac7fb4f74dee147e4fb805059fe67fb1eb7daea7be1c5e7a050236ea8079a6cd1578715d8510a53c03a94ffde8a21507086d007145080e07aad2e7398cd98305536e6f3a0a67f83b16698232591337d0cb465bb13c3570df161e97f6e1deb3b6548aa7ff4a30d145f64f2571bd7f748f3044afc5a8d3e2f01113430ce83dd59b0a627ca759551a635a68838246af6c304ba843 +result: pass +shared_secret: 359de9eb5f1a17bf7215b7c1ab7cc320d7801f826f917755a79f413876973ef6 + +# Rho leads to matrix containing zeroes +private_key: c5f6c739c640b093956cfb9d54272b3c704d3b364ff1c68510b875c8c29f30051b5f60b53f6341082252746b8d4eb52b3f77c818d42ac776ad393072d458a28b186da2b61cf64bc6d8b424afb49a3b2528d4863c876aac69b7c7fa95314dd36ab5f021ba8c575ca458c469409b71b31f3a8e371937405067951c084b6a832ab321642c82f33395b0701e5a677c3c783a47d7a6e474af454c1b31b174ce5285e90608e1932493e44bf48b921d6a58b1b86ec2a38b8ba2a1fe884c0fd608af3986270391d1a42843637d75194722d31bc81b2b507ccc0fdb309e59549a874d09239bec5a41c4e9bb48d6968152ac9d431cc3b290371296b8056ed56898b272b948e556926478291cb0eb1bac50b6718e98b74a1777e685b7b6d7cd6b22bb5846c69149b4e7b292a4153763b768cd5a67b65c3d059464ccc123ac086f9f41c3395a56ff3152fe149d76ac2fee2079653326bdd82dd6f66b6687a7fbe00d9832b09135756c5819b1f66dc44c7b32c2496f63cf077ab51b8626d0918030134b8384c565f0715167b21fab697e84c6838a71176748f12334078c27dda3133bd44abd69bf631badb5f2664f2857c033102ce8284e4b2beb9095cbb40587bbbf457054f4d11bf938af207c1cdc5217b0e9797bf9ac88f3943873c8b66883d2ba5ec7e6696d50a69ba55457853bc526819f1a6fe09973fbd19832312b554653b8441e5eb01884e94a355732e3da645eb849f520bb2bb4327d560612852152f8cba2f77db8d21922da08e60bb9e3b39b9b85bbeb9b1715982d292b8f1017cd3e60447278cc0257898575a0eab1408122bb3fba17b62a31902a567a0821d42086aa6417c259a1dbc93b25003fcdec9f6a5507b4b732a43c444c5825a05119cd089fb2e569f70b4d5e6919faf15d6eea641f5a2875763f42b3991f7c89fe473cc057c148ac58b6c88dce537da8632c10ac851f8916fb7b6ce89ba5053b8d95d29ea5d36c91981042c4aa1330aa098a6ab256ade08592a05c95021606adea0ab637824214009c2b915be450a1f7434ea2c7f562a4fe21139c2652ca8785af3208f4927abae698dd435e90e7474556af9b907f6d73c4ee64897dc74c6a876eba1b598e784b8094232dc62bf1119ef764bd1a3bb2d4fc7de069273a223abe5269a1403873087906db164b58435ef41d7d78b36087062419123c8b1d54da918f34920d3302ddaa300797b32c1c81b82798e421ab2589964334714a75cc84548031d5810fd87890a1932c98bad37c860bb15663cc0e91880af1947b8a26be9183b648b714f763b81652786682c210301852776aa673a1fde470afb56eb0b0114895638c609d8d55585d68c165f7aad64c1406a165788c3364667f0a3c65aa300fc4585e959abbc5e1b316aa108a1cbf703965a74475147a2d323b7295d185571000e43b9120b76fb0105ee7a385965026e8f8309d4badef88b433a59090f88bc4eb4ee2f6c1f0d880057b477e628bc35b023a4c9ab682822556afeb32b6c9088e35c107e2a43506c43a986a0420f5164167519c4029b47bc81e93c1ec149e6083b13589bd2a9c64fc6247ec323b8cb73cb9f9ccfb8bcf25617a87a3c2d8b5158ac8661dfc789e92cc40da241478b798a39e11830b402803ee9c4decdca918a7276f2168cce60092c29bba4cb8f532bb209367748599501572dceb9560ca00bc841e442a41e15b590cd63fa7921b344018f1a223e9e44ec933877c330d2b72531729ac91746e26c61381c80d98003265c306040c85fb95be547a46e3c01671401a42237da688795dc8c9acc86208c36911295ad22b05a2717d810076b63b632eb254491a414128377de53f941cc7ea1018bd83cf7e6a76d85211af63cf2ec856e636a9210b04a24abab1355478d132805802725345c43a981c2cc3fb0318db62531a045d2ef57680b547bfdb9d5d356464592f47c2360cd249e73a0f59fb470f4491a9e55d6fa9a982b97ee235adbbd8039beb9f07ac35ee5cc6243897f5c81bd9db5591c7225e90587279b35c5a1c075ca5b7106510559eec9ba2d2e7143c01afee598283403a6d7597a38b01bf1c02582035ba743e1aa20c49983779ca8279bbb53d5115534916184c5edc70ce4372bb25c48a2355c22a5b15e7563554e9a0e6f5afdb3aa3a1cc5b32b67ffc13756d65309dc95d561c91d45a1fe57a83f9c4ae8716bcd8708efceb851e4c3cb3acb4ebc7993d1056a485bacdb50694a81d12dc098d39a1f407468e215f6e055498d215f6f4bb8471121eacb2a324635a07864199a0199b0b6276a8a4e5b9ff0ab9ad13474ea6b2ca46b2c41027644a416771cafa07a1ac28519bbc0888f3878262c871b138aa109966040447484b3a999b7b4a75ad185475ac46ed92a373070e03a90f8e1ba97a91b5ace881377a51c24bb1fa85451cc94c72517f3d72024e7b421666cd3814066ccc5d70595efa756bc3760688123e9c3aceeb270a30a23261ab23e30c7f0785a360e8a0bbf5401450114f80580b03ae0b503419a25861331d58c11ec1c21d47ca9dcab60a56a5baee20417172a4535bb6de18b151bcb4159aab3fe69a31d5adf64c530726677db07dceda5d94a7427c189344027fe819c50f10ae70e550e154bc7e5a698c324096e9cd1e78053c6a05c7c11e9b2b532d19a87dc08dde0c73f0d3357f732c441462c8476e5dc5881d55465893438e60350175178213c0b1d8b503782d786b63c1e66cd3837bbc4c891a364b42130c1864c675097f65b6acab701de01124ded8aef4f70479eb996c5558cff287ce1826ec962bbf554abb282442a1bbcdc210ca389c50105eb253ae05c1477ff0523c85a294e084504616d7f75ce624925dc0c00b9c3f2f1363d2b05cbcf165f365390376b9d1817cd24560604c1512720b09d25a82f7179b74399fe46db356253a8320b393b068f064db6a353ada951411390171b47dc29bc4f05a2bf99aad4087ad54be6602bc7db23ae34b27d594b83e798f22fca1fdb56333374f892487e7289cfb01be4b8b03f0d9c2a589ab101494517264b6ba494cb0490a1871d301483a4c647e5c88be907c7c92abd813865606728bb95aa9058bba6cb3953b012cbc2af7a4770eacb6f2a7b9e8e94833e0592717be06517e9d33389b993a53833f9ca20699cc3dff64995ef914c05bbfe154951b7221fbc779740b86cf59ceb353233288911b1242c579c508149ed71052aba9bb79903e23c75258a445611c9deb185efb25524bd60000000000000000000000000000000000000000000000000000009c1b1fb64c47e73550adb98b72060f295b67b70d01eb99fe6c7c4922ee2362412e8541047591efe1847559704339d0ddba611d0ff8017cdc84e61184715c93e2 +ciphertext: 06f9463d5e9d8718bd3f56e92a41b4147298b758e670e938ccf1b048a6facc0709e58ded8fe9a88a11ff81007e066c6038388b7fe0e5496c02edd8c28509f584b9d58604c7a01f3196f99d3bb5fe1e9a6d2ebb47b2d2e0da69071b0f4af22dcc830745229081c266780c1c5dec5af5b74b9a2355274ee0d0b0243ab75a5f59f09dfcc2bf305f5df0ba6fb24c01c9bfbc38749681dcd401ef1f38d2bfc29ae990835c48a80f56b0869e84f7524f7d469ad2c63aee4137130575cacc87dc8fada26c4b2195644b54db3ebfee1e4fc3f13ab744dabfa044ed7cd099ac836b8faa41e510d3995c129429e2f4c8b188b612ef32eed540915294be069d64c662bd301381a430123a6ac2dfcf2c6ea4eac8dc5b066d7cca6af8f399add96abb2154b9167f57fba21a145288ee90a4e47595738d7c32be27cb1b0e5e16cebbfcf5323bd0b719a641ca98bec4b148128e3fa11963070eecc2329efbe9bdfed16df4fed34cfd03e65a59e20bd3c7b8f012e88b8262473c7a36d00a381bf37c15ee6d709f9f4f0042080d4f67cb6f4777f92a2f0a4b07bff9e925a7d7ab581ce46f055f35c1963d283e4a210a59dad5dfc7a679cd828ad96382046816848b1789ffc84babaa60991082418286bd281947c7b664543af16b8ade454d3d8ae5b416f82cadcd7eefc5b135bd6ed577e8d85848419ea73c3e0ad7276b3ce8773e9881384b9d48ddb6eee9d9aba7dd2a3e0ac8972e301d9cdb0f25893c90e68f2d1ff8ff892c6b59bae088dfbdea3135e74501236e416a01c770bb3c77c3a634a29ee6d99a0f954171078c1eb44d76612d25d7e51fe3756df2c87482a709384825f52dce92884f8a3ea3ebbe219e0bb36327660b1b7c44583bdd924bb4ffd6baa933034e92a5feaa13b3bb8e8e4c0a54ce58f4a48ce0c8baa273e963d74538c55d2414891bcea9789764247e64897c25a8b154d2ef8d1356a77b8a5909c9a53d45d2e4d7362e96edbddf27bda011a439bfefcb09bd46bde933b5375bdcbabda95933f859c0c43cd60f21186439701b7ab4f19c8bcd63ab3adee01ff5c2c47867297297ff823c814bbba614e87898bd0bad020c6f51440037a687bbb96c558ddc0f2a250b836bbb36d88009a2575728eabbd15e3dd14b47c00586f371e8e7d964d2cb7c7acf1bdb0077ef2f79ad0c20e6134b54a8add35540cecb4a1db7bd8bec65467745c2dd4763d7c67d9a53826c42f67176354d472bca647540b404c0e84ab05e4d474dac551f0624ab099d24fefa1066f495e0bda8439291e4c18718ba9ee97c16c385309c0d9505e51ab5651470148223603cba76d767ac5131a13f097a537eeba099a18144692b718cfba31b748a72b69f03d8226bf5f8ed7b5ca93b40f7e64e5a56e6edf2829b61e96283518594414603e7acb8e5cbeee0a8e9026196afd72dd3448ede9819a89a580992060b1852af4e2d3451ff7518f18c75c4e4c453f2d7dba5cdd60f5f4686b5e2ef272ea958867501a3e29a9746bfb41f42d08ab860d862b6c0f4c0 +result: pass +shared_secret: 9cf796413560833a3c2e39edb3f4f4bbe551109a4c0b9a25c42777d7d89361c7 + +# Rho leads to matrix containing zeroes +private_key: ea53a046a53b7e3298d588b38c403e67b5620c5c73a438ab7357660362ab3822b5e774a9dae973c83a96db79b550dc176f9b0182d37f12118bc96a4982249a352219a110704e4a0ddbe545e4f55cfc2c50d54cac33ecb6fcbb3ac2a7bd4e41282476797a3c24f4ac4f60c33da281cb1313035c9c804d755267894d867469dbfac7be52a34f55c0dc642354e52967b043a0e0167c806581b51519e04af675147578c79f492da3ac0748352c6e5c7ff462008cb42e9817155444b214c3b93ff3ae7d44b5c2b659627a833cc18ccfab4fe6d6513dfa67cec499cd7a0d052a5f9ba378bff75033e69ad053c04b74c8cd756c7cc0bd494129e069cfb4358324066415bc2a4d1cb8401867c9954aa8a33f929ca279696cd515bff0abcb6c8692aa9cc076861e2bf27ec360983f775e9f166964d0c43c380366f19d3f868a7e038752d30e389c0c057b6d93a9ae64746d5b3a146d31269b94c7a753412be68d09d820be6890e5db1ec3eab1acb14cee8a317ee7ba0eb6027f13a540b07c12cb1164bc7d295c16eef4c8d9773bd2d32ead764f58fa48abc2a5491bbe00e07965017ebf40c973343704112bc90849d219c70b028ff3769e720c4599098d172674358bcaa8947ba6b874e3d94e623122ffb3984a0b571632be1c540cc5da45ed1c57da1054abbc4456678249a2589544c3dfdb6330ab35416ca49c8046c9446150660b45e05b720722bf390e307445dd8a3e23253cbf633c8ccb098976a68e481ee86b86a32865d9caaf385842cdd071b0974e807710e2b44c598a4a36bb2af048b0fd30bb6c64a539513ed2a5a9c6cb16129cb88d6bc62389b4846a2a0afc532eeb0f055aa85ce7b43f8099cbf194e664c59e683e535ca809d40f72d4a3d5e287b5ca3880d4af1f1523b60c8f811a17b2881602ec0393d54988d63a1620a48ab25a5336b25ca25d5b21425ee54673062020f065693665c68399691748ed8c2b6ea47b89391e7dbcbb3e4bb8bc0972916aa0ee5b90292b23618c5e9a68bff8476fec1c7e382b1cddd45069263a507c44b97663a9c8b4bc690c89d25893c4caca0caa7633bc66f449bc06603fb747843b0a8ce11d46ca100b3243a8617904a2ae48db08ba24bacd5b946cc96b834491a246850c44a0f049bb3e099b3353b28c3889bd4520ce75749b745e65e6442d970e917362cafcc9cd1a6194d9ba41f29feab98320e10234c1b0fa367f7c3a420052a9ace9a0787bbc420832db814e8f86804fb74090146f899a624ee9739ed55c40b3716724b8a8164b8b976130d89e15dc24e2078f24a953b2781b7d36a12334356a6998870a0128ab5152a89ddc84aca3475f8cf849bd762ea7b23bd2d743a9d3a9a2c2ae4723b5c1a3b5349a2d4bd2907d89ab8fe80624838130697bb1d45f873a3416164f862630e96075fbc5192be26755eaa1f33026a1f201a05b6b57ccc83fe9c191b13016a921532c4558b44ff0a26c864c3102ca921c299b38199f7162938387c3598362e5f616756bb5aad68c68e0a34ce96684597712341f391ca6696538582ab0dbd532c7757b5b24b0413145395123f0c4668cd538782b0f65ecc30b687efa78183de47f53b73831210c513c54febca513c4781290679e16c822f2246004c38ee6ab27fcc694e665ec690515542eee6350d4a13740b417d1b91883537b2bba248a61108a818d80c5c67b1c3265c124f9e56be2a13129121e030aced4585189d58978cc3750815688763bdb44a0ee46c678999081d42ca342b414cc00539b6d19645ed18ace96a46c2453af3af9b73ad649febba71e40802e3871cb3661c2c7c1480b9e15625fb61c322f0141268583f4c9b19950018c70a55ed500625cb207e9219d2c9cea134c6f32a606393e94923e3fa5729ad2264fc8667d140d232a3b68a93caa9098fe242f99305a0fcb3413ec8b22472e66754edbec064e89245301bbf48a8994d36b4093401943a427cb5388132d3543944e656ae51c72118821102322a8f7246368b5d9e4756fd45d5886477e476e641b10d0f196cb6638f6c30ac2e6ce57230d4036cb23d14e8ba30d66e92656090199f1652003af17393b1fa912df25b6fba7bb3fbb5037915e46c8217cc88142e14622f028fadba21455b00ca96b2d039663f0aa6d48b0b5b3672203b76330ca4a14434b877cf83a818e71b97b77a4eb99858542b316c809f1630f9bba7e00a265ef2b6b2aaa45611726e1ea7d96a50f5cab524b138288f74b8575256fd7504740a256e1bf34318733f6b7a53aa30536bf0e5079e5b0395189262027cbd497c350b1ad89f4aaf88b219de48801c7bf97486824a7b7bf723f516293f2f786a6989a35c192eb8b009fd37f950cc6e08592a1350c680952e92887b5759249cc70bf477277cc18a9e95da3579bc4bc42761c505504372eac4cee71b4d82c787356983380666b3718b288948372c11fc855b3950e633a70762490ca13c11c6b824478a293f5161c782c4ffa5fd0a64b5522c23979b2434ab52b783a37098ba2da100da063dd3191c29c12bab3927ca721263cb518924483091070981a902518df41ac1280bfc7ba2f2703cfe2f8cde65427818215fe57b68669ca97c977af38845433295e770c4bd4cc308cb203d823c84639cc9496d31424ea778b0f215430437deae7b8c6906bd4fcb589d251b637030f9607e9bba487fa0fbeb9545eaa8353c738a9f02b78e19774b84ab8144f20e39c62a16032d924658262c75b91e5a471ffb95ca40b5c1d388be8b55e09f4980a274ef5a5cdf5137c1afc0325913bb1ac608a210ae92220f4a47d8ec6806dc6b5efc67ccd677d5be615bed15cd76625ee4300f1e8aa9330952d49aed6b14c8550204d2c3c61828cbf36322fca4faa3190a6635e2f0809f45b5064929c14e0762d62a3c8839663fb8b9a135b715440d81836bf40a6cae8333d4496e4703b4ad50482e8ba9f5163838271bfb66d1fb462d51418e2792cc7370f7806d0ce7b7b4a66af2af770f5a253c46001bf82988a4c0c008b8bebe64bcbca680d3136e48bac4f030cb495095af7cc418b3acaf95bd6b636a4f92dec211c4b2b4e8bb90969681c61ac380c16ce7dd0aa3236957415b29144737c5b9124575872950a23c5315bd3b0ccf2a608e6a0d3659cd1053938cc1e68c131095cca20c4b2b358c65192b3d812cf73e820f89ab1c5b4c4c2270e7b465e2253c179d312bdf77f22252d3332cf685abeac1c4026f95e9b9b79c5a3842a49b4ac59000000000000000000000000000000000000000000000000000000fc068f82a15745766e3ec7df374ddf20df18b64e7ff18bd526fe226dfdb92d545ea63afb095b03165e6f3b9488778fdd771036713df7b893ab8777554eb05f64 +ciphertext: b812896d14f191fba331fe20ae245f968a421c46ae8e3360f380a9f0a00d50da4247b232f5181ea946b494e9d99f82e7fff27d8ccbeb6fa8dd5e12f12d2afb02004f2bf046f23115aa3f7e9e5bab06803c4df1d6a0bd935c882721d09a3b5c41050afe0ae3706fc83f87c49fcc22ca331fedf7787ab7ab0ac9f04fe405f21d3384b1f377332feebd65e11d7989f56cf7430ae8441072a4a8e9c8be24a4a1fcf380dbc0a8543d2159de861281493516d3fe7f0819da15d259aa2159c37d325c884217a03c83d8f4d5c1b9f2af4e734aca05ed1d3951d3bd5c021a4e81069678a210ee5f5c9404b52ffa495ebe6b05cd02cd84ab3f3795793e03d26e83a647921c2c970170c0ecdaca8d2e5c469b1a3309e46dcc9122623b6f41771131db303eadbd7b7df5c86bbd6ab0060df29c95a0c014da4939271a98c12ed92a91d8b3a37e2236ba269e7df73f7df2fe447a20bfc56e6b9249485cd71a9fc83af54946537872649949b49f3d98425453fce02defb6d09790322afe334c53ca802510a87f543264e5bbce4665564d23695a08161e28db4c90bb6bee38c00c5d3cc2e403e225afe39ed45ca3c23a35e64769486e4e38b122e3d1bd2bc8d1a38f689e5ccf26db07c8b7c14b19431686ef783382d02080b9221d2a15b41db02a63db7b5396e4b516d241ea0ba533c6f1c90b67d0e6bb2bee066015dd7c42f0226809fbd81a8a56630b93aecd63bec94c168142bc64f0086e02ddeafe7615192575e74e174cf7e2c4df95b55ae810d5cd5cc706605800a0417bbfbe3097890621721939e01e51f46dff10e0777bb93e0b87e8fb88c5100b47ea0c1f356fe669ab2ede1f6eab8a52b45815f9698e86baf38c35ee99f5d3613be4fde9febaa6c33f3a493a37eae52530b8ff0282671a01a13ab74b547c4bd7ae87666c20f857bc4fdd2eeb15a09722cf158083d7a31cc13dbc53e0fd2b2957f5032761e777474f17188835bd79090087ffc0ebc01af02e4d0e0be1d532eefee9ff92afff8cca34286cd6e9c03b2c41b2080484c725afc5aa3c76d4c807e8c5beadf261061c4df268b4d4e6e24ea68f2fa085153d37be084e9d69d2bc48c819f898ab482c0b80659ff473e8b186cd5304c62b4b3f3b714c628478b8a29cfc5be37773cdcc4558986d29578b5dd087ce0d989a70616d380c3c5f68410b3a7a0fd247b7a3d9c9dec0e8f13fb1fa1e6cc579e31a202afb994d6fb4e40e6377dd2ba3247e5150db44d4515d31296f00bd2ff2838d5070821396ffcfb424bdba4ba3e9bcd2e02fe85f5feaeb0106fd8270a47aca634101102c08dae778d40d070d1ff0542414d71a7dcacb25536b4462014e5093710ead409aa1ba2c21c1716cfc4f1091aa39b41c28ac9cd3293c00c853a267cab452473fac0c84bbfafb4e2754a1c1ba244fe1ba8fa356e78f89a94501e068126acf20ba176586adfc0c03535eb6fdb1ddd41c6272d0e8c49f039dfccd737c284351ce14b2f7e0d01639d502d519fa9cfab9e41632b79353ff861303508f +result: pass +shared_secret: ce303d3ea30cdad19af0a9f428943317278b22f4c7c229aaca25d0709b23e6e5 + +# Rho leads to matrix containing zeroes +private_key: a7d40e120206cecb9458a1464b96c447db086780708c7435e40bafe1ab8cf26caced91b888711b8b95414e080c2be24d7a622c2e0410fb9c795a25a50554abe8b9049f9890e29531cca88e4284a5bcec559f939061b003510c8a23991cf474ba6676b0599c86dcc0976f3b61cb624954d3914bf28e109193ef1b9efdacace8574dceda34905485e1a79d51c8ba06722150d8a243d69f671c18b1c2a77c990699b72ef5b1c4aaa121a8e5a6cc971178127024166f2593893bf3b9e0db273040b0821051cab28af5196b8937538a680b39251b08051502c2a3d5504f78b767dce91e2116280c3532e9426b93d8cae3e9abc5aa4832c6bfb02a71559bb689f82c22835fb314a5e6d44bc4085eb39ab41555103033a0f4b6aabfc5246c93c07840254989301f88776c06c9f808369e18445058b4d940783d57b7d7901b0d63a6e6512b31a63ce0704028d936462c18eb4bb78accc3dc56884d9837d8632a258c4e998cc536248aacc62f7b9b65191a28a27a1cf44a0d512875ad5112e034c0adbcc67edb84eb000bf3621e7c1c5cad1cbd06f848c5d8c3601b07463b5c0e33cd260a2ec99a972c47cda74229f6292221391f37d20903aa76eb6966195acac6373a41db78b8f7515a473ba04397c2e94a26a6acd8f2cccdc572d4b60e56880fd0295152e18bc79699feb1a0b6f6c7ee19545f4124eeda5755a85d79fc2dddd2848216576e9ab4d07b7ecf77a74937cc1605602c62003dd5abaf601b55ab0cdb37bb3110290f829a742c5607ab24a50000f3191f435427b5345ef884b91811bc44fc4c6de32bdb0a73edf80c8783a5a6b6a2d06657b16104cd62ad847206ec1b87729260e91b2afde6b0f13a87025c10bafa88e1fb1a66b98a5308a2c4f10874324179a2729df786627271ac5a945072beadf878035169c543c0b07acc49241b7feb406f524b71c787ed757a3d48c233bb75d97c42e03b9973cc680169520e400b00879cf2bc9119325586719f22e1b2de163184b2c43735b2c1a8654c92138b90c458421f681136e0d6c417b20a5f8c126d3672a4073942855b127a87ce96c7e34861923b3ea9bc9f0aa277746927f0777814862b0845c3bdc12309241f387cc6f4ba4a9688b947ec8b5603ce88ccac5c35756d0031ab4a5e32f6ca97184df2acb38f724fee64a6a688c69f6b913576af98ea2487db097d7c81dbc2a29a381b2345495160c348e8207e313929dc08412304f6a01c90f6889e23b7974bbd6f081f52dba8baa716b53769e6f71b962156cd44a3f50563efb3b65741aa26e42a3720ce737c7a7ad5c875663bfe36bde03b106647ba1ef098569bc10a0940cd300d58571dd354ca5ef714733bafa4308b3c4b7528862664a8656d16c9c3837355e39072db20af20025306390ef32931e793e33333cfd893c6227215027ab7ba9cc0212ebc749abbc62be483b3e2406a5ca10d7fc534166646473c27979053928aa5445c4c1c26cde40777aca39f5a64161c322135fa176d44b694341a0d3a05de662ef0e1aced53c4ea2762c1333da3f987fac65ea63a17b55c3f681c568d648966eccd095928f2e32af2fcb0674ba3a50350e282c99af149ab1b3f52d3b9f838b1aa8cc5b08c45bbdb5d4053b675fc7ffba8cab1f105c8095a0a209c4f16447198cda9d73c62bb98dbb3c86e8761978bb77a5c7a28f03f10d8558cab3c71d498429786280383f944b75c7139e533bcf7019fbf953dcc00c884446e8bc3ccf75b3dee9190526662b33527600296aab664ef58c5890111c4d1c04262ac22985181c80f3906cf11f38af489a75cf5596757a8ec56cb3d3a7c2594441113c427f7b43a019ce1bb1756a9223b8b15c3cb649e93497fb34ed17b7c4d185ea1e9a5a6dba569f1414aec8bacd1adb784c714a7b2b89989bab281eff81ed093373d5c6d3f36ac3952aec99ccacdb0634928668264bc70303fad4a746592778568570ff75585422bf3cb6a6960946432928a0b39e5bb017840c7c4d99b8b25a0c76349766b0d39f7076a839abf883252743731b53c3f650a32b0297e806addd02999d61086362322c840d8dbcd820ca008e5ac150b7932f081491415c1c3300e0976e7f9c14fc045be34983ca26b71690d216989a01b03b6930fff0964fdd98b2ac6bbc408d0731a501ec87a93e19096fa3161870bf7964ab5d6a5ba764ed8206815d83045b24db9a9483bb776dbc3ad85435d7cd449248c4058e3568bda4e41061ee5f0bfb0e29867491bf796140e8a2194572c23f75922c4ab0014c9ee5a98663ca78741a4b15335d14a3fc92a24b05b5233a43914b274ad531e94656309249f79fc93c13652933529e72690e1b8b7c6a21c756614307229135977fab1727a497617c695b9299d81358354c9962d231183d8512adc5f10e56a053610cb042cc4fc2e485099b973b320c090a4459f8dc279beb9568f840932c77d28ebafa40ca22bc60adc785449800c8fb71e80ba9a67c4383049b36fc89f0248a688298453e480ec525dd45803dac94ac380c468ac2c85015560965b7c7838e59a8f90cab718246dd4a0578fd41438e09716d3530a3272618b191c521887ca38aa8c994c93820f78673f5cc95ca93e3eb976946b8785ec3f12641d41f60db3085931aa365970190b93c37625332fe92e4532519d8825c46200e8b576592ca557794e370144d378a62e5c54cf6820f1671934db0b6c47ca8d302bf18a8b82152926853df7d255da51cc7a19657ed77377fa4eb8b2a929b46ff18910d1832b71842cffc3849a66107702ac7a86630769889fd90d8ea22788805876321ca2158ec7bc878c568822c0bfa03c10c9f5b5a8076357c6b934b75617a20606712b0e8cce40f4ced0d17defa628bab4751e56b3ad040be6e3264e6011fde7c4cebabee0701c6023c218d07b47ba4ec811b286ec3031f5254302be6b776666897b3062649252c5f7c1bb0dfab6b4f13155c91f318963109421a4a33306eb0b66da38fdbb541bbb3e2037c1a0d4493e0878aba23e7138bee255b3423009ecc8920a3a4b86932167b1affab27a8821598851bee698665a2130816b66b7e81842819ea1560a0c5292be2cc7d5428aaf3b7ef5002d5145aee9a82c9d44bdd0842adf54b38d9213e904052905adf3255828147fb64960c9167b17126d61b05007c759c938cd2086695e0636b25b69312a70235b6e201c23e2f9a9ad696716f53333d004fc663d5c0b0776f875ad988aa6c6230218cf6806353409000000000000000000000000000000000000000000000000000000c624c0376c3309778d9aafbd0bb50366caebf7b7b46b4e9aed69b929a277342e8bac5e523fc2f73973b46b1727891a6077329e10e94acd027c9dfa38ef4e21e4 +ciphertext: 87099f26e8493f157e405f8cbaf679f5fb0aff16ff9e2c2fa8c263c6819287da7484cf93e0a6cca4d0a94d0f710081c0bfab292981dec83558b651abca873980d077e9febdfa82398896e88560e805948d84ea38cc77554e9421dba3a85ba24f3328ffeb4de0bfd1da900412a71903908e3b8cacf00ea86f21e4eb124167b3ec769a8a22498ec6cf26cd4b1470e95c37b3716462929ddd9e247d3f23b98b3efed529066532b8f6042ee8eb6ad00233329e0b634e300ec2932fd6631b1bf14d7e992f54b985b51cf1b05f5ce7d9f7458bb3b530fa3feb7ca1a72dbb8c4b01c0f03d8b45e550514fa4fba32705c95316960bf50d64e3f07c48bcdc31265f0fadb5f348799fe0364c93765e2bb4688704f3027e69689861dbbd65bba05f158fd329c5474386f9ad7afb65b297004664ebf3cb7ac1e8a34e33ba15ac0c92e7abedbfa96fe4c68ff6d7a4d1dadcf56824285883d74370e2840cefb887b7b934fec461c50781dfcae2bdcc9983e0b34c3be81a0dca5ff0ac834f5bf71b4e6135c79c27a525bda87c2c1c05e5e2addbca7c43e49ad11ea240cb09bd77d22e7e9d0ccc4d638feff6fe9bc04300202313197a9a53b99e67e96aa72ebe3200758c1f17b05c0b793dba17278f3e79563a532161190eb3a0724524b210f26038ccf08d55c0bf29b95917c0bf97df6872438b25d6d90091ada34b46ff2df784370c8bd3a523687902dd9a1d70f9aa9b1a06dcf4a1fdb740ac3a0c25c3840bba2e5c6cd1dbef9aca23d5f29ffc00cec2fd9dbcc187cd2d3c690f436e6265f8cc6857b3ddc1cc1415877d83d80337fc4c4e38808b9e05b14173497330077fe4c38699523491d4a3248e5dc4c401a3a29054c924c744f7514b7a84e91ca6cd2cdd5cb51c4ab4f2dd4aa0027b294b299896b558754264ab10b0c0306465ddd4e88f2e42b580801746452467558d3238d21a74ddefcbdcff5d79886b101c57c0d4d1bd4af284aef20f558928ae0768a07f397c5f9f7f334a446755a22549cd7fb1efb14bab48513e52c454e57c381518ff6d3d02278abc01bd0d54d53e77d361bef85c33efbbfb295bbe3aad332d5131e8cb5cd90a960bf2d429524b45abd686ef95882ffe6751da4f750a367fcdf0e807fc204834d6957ba8fbcc0e9e3d4922c45085aad54b08934e0d909b334d3952cd479931c75c5f4aa1ec286099bedbe5ec17123384e83dab7230ccf5fca4f085ff348197d837b752c2bab7f0fed29e6347624c51059a48dce7f4eebe03b5bf9b15b13ec85e8acdef861fbf93f17e377e950dbe9d6cc96ae83e94a3c5848dbc2ccf6090882f048a174bc42107cf9bb0df711551e2d550e74d2d416453be7fbdae5a24ceddc7dbec4329b4a67d187461ebcbd9845c5ba04967ee59da4bf822460053383935cf1bb1766a7ea5568f16ccf8400d9a73fc86a7570742d76d4f52d20ec80b8ce2a937d53fe88f60bd3deefe27642fc7cd7d79cbc59fbadef2ed189edb3239a948aae68bb2bccbd42c872dabd7a261625af4fd0b92c1 +result: pass +shared_secret: 53865f61850687872fbe708ccf896f7f24ea01283510faf76481abdb0cc17e89 + +# Rho leads to matrix containing zeroes +private_key: 610c36a286cca4815c657bc2f28b854aa8602890bd6ec2700d64b495b50d049c5963b8294752942d11c1d0182ba6704e54c003b828bc58b6ca3ee0823607c3c00bd0471b4df571c51db3003e4cbe6166c0caeb747f79573f5b8b80d12ca78bc1d3e01a318bac91fc863198afb70cb9256a330faa06639caa7ffcc1248b367bb6b0bd905ab0098b79b85ac5dc083ed43ed8b248dbb72e5ad962b3201c92b132b2961d9867b48208896c11afdd929be2792839674b18e4c1e99a7df714ab7ecb58570281ca80a92f148bc492797564682b560f1bfa42b2f7734047cfd6375d3dc05846da1d3511cb3c8221d38226f29ca52b07471a41764f86ac3418a96aab70fc8454d6823f8b7c6211d216d08c67eec474a3cbad8f3587e22670ae5a9938651f3b48011341b6140ba393621accdc3f606b080579197c48967f1c8d11026d8f90b0697869ea49cb9db086ef687227b2549ac689b564326a2280d8384698185afb25941ba0365b0c1939148ed6e1bf0ef5c764832178d47a01c3573aa268e168b740194a9b36ac2580a7bbe1625900befef3adc6fcb356100ddeac4393d388fe647c3d623d1e6a56a96073bec59f5fa39581245e31aa33cfb865bbc28e9f2498bad34a5bc65c517bb8cae19b6d1864fd7a0c48aabc78d0373a84c168f33ff13a9586aa349a185e3528003e804c8cacbccf0073da46567f7c3ee6a55eba856851234b4f3725e1bb3609e50cd4c9c96ff947c4b048dd7c64b3498d23c234e9bc45230b8b0c797946d0980dfc7bbc5773620b8330262ab6247fca5684c9fb8c2e692c3f654099a7a93d0aae62d24eb594544a81431f295bbca7b15dab7bcf728e3dc61f6354a459a120c371030f3b622569a78762b1cb08248a455e0f0847e1531d194acb0507bb53e9c0e13c8b2f45ab06362be3d9bb58ab6d90825a15211f81f4987000cf74355a28ba08443b3fd9d26b70039955773f9f840207f696d0e7a4989c4b38cb23df626e53b7ccf7c1bd96bc3f68c20ba180a482799d2cf975e0a39d5fe863df954665509b3eb63c257b8c9e39050bc4a739468e716cc289a79053453a28906d003535536439d418736a95763ae222c8870b66f1b5a9978c29d238658a3e773063dab55125e851983706c3ec68d7fb1d595b55292885f758a8df752fd3d97a8dfc33a228c896a44bc039ce1a2069810b1304d44522b1a5e43756cb843b5ef515d89c310f442f585259e5d460dcd578cc51ab49e63a7cdc2566d77e6959a7d24150cf0b413d335efa65385ae13b482b9b4db4ad2518b71704098d7481d2233e2ab201dcb4a1b3604149710de3cb247f29ce8ccb2ec062b014708f397482dae5936bec37663c849c9baa9d3cc88146b88cf970e574694af03fb78205e205435221b32e5513989047e62775f1ba5aa89a10c9d35cb566328eaa5748e9c5057446f96cc691d80208940cfea984df8817d4507aff0a0a96b8c6729329775c8d75935d7624cc0a06ab7a950f2b73ce4d90239706403c0651dda56544ea59bb06a99f00bd698a8c3f127fb4a3759317a05ac244a07342f9a47257e5649dec2c7050188ea669a97c137f707f4e5b4c57945f82c1b0b2040476d73acb54724cba000674c3adf498654b7d8078c405881705953d58fb08954a73cbeb43d564894eb48e104763d35563358693f2f2442ba8a01c38af0d94be822a1bfb7560e75abff623401fa043d4f10f8cf688b20c56cd18867712688c992f18617331631527cb4c7b0a526aa488b5122553e332280ca64deb0c0ad36db2267b633b3f8bb8a83551000e1ac17f7b426813caed005892a7077c4bc02f703befabc0f6b324b1422ec290ca42f630bd441d1f119f1c633b2031cc759322a4d762265c5e642462c0b38ae5339747a62062e07aacf8aaae3725424c4f30f38e1c727f40e53788c68bbfbcccd8db7364388a46a366b53bae89f09d64c7c1955357e256586dd5cf508967cfc97b0b481267566b7eaa00dff67158f81cfd8a406dd8c0095c2c6e4c9e03a466ec79232885145ab0a321149879a25c77378dd1e231be71519122b4f1394e1998081f271840a245e1774012d508bcc0830c5901cfb7cbc178875fab73b4aca397d13da45b9e93342d4f5aa813048d46e0b56c8a9ad7194fcb6046da9b9d16d56da6399315c924f18c527437c9fb03ac3774ccb272614b0cc55968ad346187a5f1716a944fb3946783a6511a6997cd482ead064356f843bd6b6379f6c662c9c655705c6265c8702729c3bbc022a8828312bbc7c7b90c373448a59cb67ca2da3771882130043488eedb9c91b39917a1629918580381972c34a0e7abaf372527e1902088e1354c5353c900a0a16536435124a9e51369bb46d226170a064e91e85dd6d987956820b1446a6181535d3ac8a994341ca43b0cf06a83825a85a5ad192582554864561c5bb2915287a502c39b8b54abafce465abbe7092a83384fd35d91d5604c7a4c14395cd57713baac0d7f906ac9274a8bbb34074b3f96fa8fa23831ece3975f3011a815bc7a4c1a96849d386511e61a9ac187024eb50135aaaa0ae2347a804e55e4b3d3e3c678da9e5997419c836948370d1af0a1c1c15d70f4711e825244b1521345304af589877b64afc28ac625a237a3226e1873101345e9ebc060a255fe0862de4800097a89fbe07aac5c1cb983049c369c8f0924c8320df70ac9da023cba2b1e40757a3323833d12229ce607a63275f305c3b8bb830dcc9f63bb479969cc0cdc30afc75a8308cff8e59d5b2a20d46b200dbb7d80e011bb726e33c968e3ba8809771269a096e85260828c1fb0a719fc638442b2935ae4cf82a2c27bf471e48264ccf912d4f09910ac12c19077a8f52bf3b2c8fb4ac7ace2ace1250347c3beb2d89299673a6328c8483805be327079f8552af16117d12550042b7eb635cb0a8c0d370ab508a7789235fb81bd60b882c8909140eb487c5acb092c024a9c6c8556b832c36bd0dba31565b70c35c2ea4cbf7a1b42d2d7184d37b3bb180b9e1078a793b7fcb2bbc97bcd8bd7cb3c0758f398a482565d185abfa4310c3a84b77b9280e7a6222098aa627497fd13abc2130ae6d34ea6c626fec532f1eb4ca97266eb95a728434ea1987e7e666ad09c0f08c6c581dc733f962fd04780a7565355083b12a56a7c4ca774b3cbf4cb762949631d8bbccf7b48e2ea459343a6beb3a2c38b64990a01971579014b41a3a90c06eb3bf83c502388a5bfbb0c9be9beee4f3c26cc000000000000000000000000000000000000000000000000000000c4ee36b1f287cf80a73521ada9ad4a1b7879d18d9264224ffb630b088865f8b6e42ed33e0da5856106580e02aacd0aa1546d3df0571d17452d22f186d011981a +ciphertext: f557aae24c7a8527f8a1ee03310c78172826128ca814882e33e4af6612c938d174209b287ae8a53adeb6fa0aa25fe6d19f027367239cfb89bf0dde0f99497ef7d7477bd332264ba237ec0e1035440029fbb5064ddcf9bfbd136e92f1b35a0a2cba8405ba42b8ce36cd2a686bde2fe338a013c230b1f1a99113c01babef6881f471081c9b9fe25f28c0fbf828c243284e6be4c0feb138729ac4a6d6b2869493abdb39a08563b2bbabcdabc3b349f74708b714f7e11243d90a69f68585b21de1cf742ed7637fdb5248cb5fee5a3245136e85dd5042163f2417e58a634224db95d004a4e9665ce10dd120b80df855c5ca5e464875752a70857511a705be5f3edda976ce536a5a83d5173c194d0a9ecc24f83a6b6c12bf06521f9494dc56d3a85df270518bf930474d9fbc3c77b61a1799db7146d5865d3d71e84a64e52deda9e16cb73ca1babc487a5b653664278f6256954397300b150b9159e5ef19c71e45fdc1919fb99508606e180305f7bf11f9c772e49e7a0890cb5b0264749035c3725e3f6dc99710889f8501b71872ed3674557e5fbbed85f819fdd9f6d83f1c40a04afeb67452dc3a44c77a90bbe770ec918557923e61fa704b3c08012873a0c672e511241612de52cfcb8c8e129f3b81f3ee76d99bb42398eaad6a1028b0c618b6c0c2afc7713ccc226d4c853227cc6864dec677e39dea238d79066f427c2cf7e9597b8b5a0c59536ea78485511b3c804be288c57d894322dcc2ebaf11d2da207c71381dc654a7458cd22c34703e0b720163ced269283a7a3a50f5e31868ed996227f49d8f0e02e6eca130356cb125f948eeaa0aaa8c324401f5931298fb20fb0ca6cba46bb98b02575e7abd822838467ccbf1d80868ee866bdbed1f7d84eb1604abe5f88a39041a18d301967260f8589cadb4e35c39cd50fbbd6a3922234732f25231ddc0df32fd80289fa8ceaebb0d19ee014200b3bc9f896e1e2585a0f6ece96a9983cdebd5738fa4b10a90536d820ba5f91b3fccc8e77a8bd01a56721608d402e4171cd91a56ffdf9236fb75e7041903a327bb2f8c487fdac2e369a4895b5affd68bb2967c2bf4f46144e6bfa796731ffa338eb9acc96374f2db1429b5568e79cf9cc077e74b3e048894c3b0686f4f071203c2ac7dd94e029ad9b9d8ff680d8bd5de38491c43ae7917c18b4cc50cb9793dc7da034cae15b8740b519d8c673d276488b8bc9c3c6fd127a7e9bced8385f39538ae500d76283779a4de8c360a976bb237822abb96dbde0408f9f9ecaa639af81c941460ea2c19541ede082e0635fba083de29c5d460079d6ba038e961745a0837edf37f7b0548c65fc6f8eae8706e54056b6b2819b79231139da08c6f66a4455be50ad702f1469770e30ba9b108b84d77d30e0fd4a220a4f4bdb7d07878ec837553f4210385c760fb7f180c943a965df8b3118e3423e28f6172a2c9f9c268342e1a0cc63e158c51abfdd23efc929b8dc17274063ac8c3e4a9f1b3ac373f7f279257fdbdf044e14861f4ceb75bac6710 +result: pass +shared_secret: bf9eb969821d6b129da2e353e7ee8619859fa2e1480599b3546f305e56c7be7e + +# Rho leads to matrix containing zeroes +private_key: cc389888219463a7a5f6c2ca3014accb3bc26f2318f593876de6a49822b6c1e694b7e5aa9140a0765b6334ec762c8bb018d28a99004081256159c836f4f800d0c9aa4a7136fcd89ba7cc1d6a32b23ed181b3fc118ecc60096a4ce8261ea2c0a6ca49baa28b75d1b40215367e6a33a1c177937bf43a70c3889f6aa239e20e499bc7a836694a0bc2912cc7cf211ba20c12d5ec312da2815ef20c8565712b22a927451271040cf4daa44d79705b97993584424e7b3224a5583e5b8eaf640e85015676517113f53a415220fde3638b9c0a38115e668545305ab298b9923bc16de5b9137b30a39a2c8b5fb75e4d1168593a8eb0e067bb9343f1a030e5228bf0b3a49169393cd14f73c2b8221b1267627d80b97d30544b02a4c7bf06099194b2d646596aa439d82a214e6cb9c5ea1ded727c8143755cf881415b6357661a90d5ae759475baa6076eb478a5826f86f9868afc47ac3a02a0e84579a25466a63d933b071213c886790c320416d9422d280745758779635ba6f848440b2489144866e8e018200cb8305b3060926d7e7213089a06d044176b053f3bfbcecac7840dd7844ec29eb17bb2caf321a5b17848c16a678552727a3d70c34f024164b3c4856b0a4ecbc78d345187c6e09f055273bb775078b43ecc534a40e66592b607b56b5f9304aeb048375ac71c30464e979a656f1728a7b700e3b33e5026bf40198b94455d2be37cd65867522b20bddb5ecb7a010191254b8a403f37c4577a613ea30678daab55508b16d6020f074504f928dddac1e8367faf6199715048c96a8fd6bb225715accdcb012cc856a76057b6b72b09a4aeff5b8ba278c54a750596e82bda45be19014e8ff52df181435ed9ac8c402147b539ffd984c291535b7bc8b26c5036352520730195fbaf40033fac450843e808b9ccbf03b40a9ed657f6ac4af8b65b4e389280633d79799e0226b28b356fc2e39f10a80452dc934caac7c3c521f0c5544e7821a403688f08378c3086d3ab8f7e4036ad516778da606204aed3ca1ae8c42e11038a64ec78a5fc5dcd0475429124b5d665e4acbeccca3a296a8e878b917b886ec7f029491c661bba684ac4229cd71373c829055b602db0518a481230345a34a709010a03e4b197273510a0a24465288c327c10c75434d9473208a7964db7792ea81c5fe0c4bd967c3f0c98765ba7d3faa4e6097f09e9bf10638fb900a764e4a0bdba2f19165bd69832681310a7a2585bf06322a3238dd26a4807af44faad999397d4aa14e76c2cad5326ce573d7ca04c03db769dd01a65583ecbbb991e7a31b59238f8741845f1adb5992607184dfa19a9e8840ed9e1622ab93031e2b448860d411a3d239277052cc8ea71046a0b1ada191a020c322d776c6655ae71964d86314a86a47b6a367b8ac5a4aec75677226de0c1864492c88fb70a53187cb76835d5477346646a9da97301156a3ffcc231f9a0da760dac142674e5cea882364dd74fab66901dbb7eaf037008c52073054cc2f94ec845444054058402515bd206d496bfa02c442c746ff3e662b899c34c40900902c4f8ca146458522c6a7af772b2df483f9d840fe07464b0c66fe1036c070c6f70278e9506342663b07529247b169780002535317ab0223bcad8c9d0c6876dd03beb06403e50606a33937515359663546cc0bdb16a4a9d6ccfa0315882739380c591e4b3302d807f76256f441b99acca228f17c904f88143840648971cf03735ae9ab070b6c4057c6865c88964748d8e1c5fe919037f3853abc58a3950cd307c39f8db6b9c6794d6d921da4b5ea23391d916b7f2bc8b50061eed220e901495c9744da194790cabb66a3b34eb020af87532a7967a5ab190f1898cd402c093e4c0a7967460d5b0ca0bad973ca86e533435536366370388178d28349aab06090ee40291263c16d26551a03fac734b0f17c2ecc693bae40475f7cf5edc778060186e5811a3dbac9d34b9f478c2b7e1c7654938cf8031e433ce38c47dd5e9aedabb6eac802123a82c6aeabaabd76a254c451460639fa646d87576ba154fe0b024eb114af1d2b17e245c442ac9a82bc948db520ce2c887d57f0621270b819aeea5422129372142ac87c1762e6b891af95a47912029d09118f97c5a67628dd2997c669523c542393b97f74c4974395a857bb9b47b39d22b00d5e946365a2dda868934e514b35954ead55a76d812cf619113719b322b72d6d94187ca4d3a26847437b2195a1a034b530ec0b8c7e1401be0308237094abc79fc9c92d79675f590347d7b706361556f2c00277289ba296aad73c9f3f654d1893062735869255c68357a97558f0af74a44879ccdf7122ba5bfc5d21d805430432abee64c7f271a930db3aaf5f78d8889b59e654c18ecc915db8df2eb7930426bf64b62088406c4b5948b984d29f149ee897c1bb8664a8617183a3c477994aee870d1089cc77079369200eb944a79f5aa8c5315da8a7571a6ced0850b2a71a9ba6221cf14be48935e12c8a4cb7630b1661c3504885a065ab5e3c1f78327c779122d772cf64c4b3a63aeb7b7b2c11cbb8ba98e5c340b8634bf743731f0942b8c333261a8b9e5d60c91a707d3e4035e30bef3bb6089e5017d154279b89303a2a10709bc8a44ae248827c477c7568013db462b34e8a8d7731340f7658486c3e83631e21938c4c560e00b521e76695d09844a0a35a6b758e711687debafc31532d2d6a41e512e3ca5bc88770fe49a794292c0437017082c5d11b8a6fb36401fc92aa5ca7cab8b550fab6a74119b5ffa8a14069f58f81231f2a646eab240fb56e0bab328c4637d3559c9b7351f4c7f68eac27618a874790f0ce75e7c32333bf534d0512fdc837d7fdcb49762cb3c8529b8538fa725476e0939394c9eedbb73ccaa0a8879b2c029b9dc350e911278720240ee262830c41440b89e18446f195c7fa50c8a94b02ceb5c93d2eb27f406b80e758da7f99eb320cb28b2aa6465b50c6c42b9a77390b521f3e2830f789a3882298c649722748edfa9c8ff2b7abbe61aeac3171cf16ec0997952323d11bc29fc1a76e022cf2a07300e3a87fbd47047c1504e8516c4e2358113b8ab8078d6466ca802ba3141287181777ac12618081892529a0d5879f4ccc979286ddd4c3112145dec7a711548214d62b92c238e82b4cf1cd6b78cd94d6490ccf69005d9ea13efb1cff0028f6c1543c501255495118d76137fa4c12331800c5250a71a4a8ec01a30bbbcda5a038c682f2b85b6885714f6ec2e27fd00000000000000000000000000000000000000000000000000000049f9b6cfa4b1a8cf67a3b1f225a621065805a3939f4ae4a6d1111906e9c6b7e8c975767ff083234b2979bb109a24a27bca17d170abd8d9e6ad3c3ba19e306bce +ciphertext: 7a47d5eee9259bcb9ff2d28b7ecb9b5cf70cc36298f0578b0b8fa211f51453fccfbefa32711bf6e83b796bb7927185afd4776069ced5de3731a1b4783db069092607bdceda88782b7c7bce5f77bce5bc70aa9edec73634c6d55b6c7e66a80a1628cc5a0ac5a83141bd060c5e790c6d1e2d604b948df39289825258a575d559e1c06090ca398332b5df350870abdbf17a5aff739c49c50bdc1f92df4555f4ac757f5e98e43b287873a6ee4f35970785b7e43213d5d49078504d0f2d376d590440eebce8e86cd12a5f1669ccf0be6e8eafa396ec1407be8a02198a287649865cd0b6c149403f6d4866bf117e2f9b5f3353ef662b64381acb92bff6208dea2c65f49868404a02b5286dfaff50472d24300497d8b673098a8ffa09a3633d91853491be3e925b18a6f81d757da0585c948afd41081c654853f3c7d6befd41ebafa1a2393bb1415e312d0930da60f010775d4f86076c19f2957da96a0ce4903b9ca5f7ef18d33c681a4252e58e2eac4a1d292ab9952b0339313cf5ede08f000b3bac1344fbd5a23ce63f810c993285816e42a2c13b35ee685863d691bc1dcf61ecc4b2ae54a2732873c065170609aa0654279cbf77f790056f337f45d9ef3be9b278565decd4f86574322da9d37e4e6afa7165cd2b5d1d96fd6a27570e1797ca8ec1b64db363ee5bda8d756ae024ae1061826d90ffb68440aef1aff662c801255906fb040cec10e4b34353193e3476612ca6467a19a2635ed3497cb565b8d765642a8cccbdfb2fabea1e2a64fdeff5ad9b8cebd9505872132286731bf566bb8caf5016ff4eeda1fc612593cf812d69b12dcdfe5ab34d03a8804feb9f79683f3ea44da7293ae812f68d6a21cb0b66bb610cedb2976531e6b174d8a1cb46dab41d87c3ccf4e23c5f0860f0cf118fa50cf8429d239d80d81311e090a2533f88c707a64ea25cbaadecf72eb202c647fc1bf3bb76cad5c05a305fa2e67b4ff8fefc82d9b1868aea7dd7aec33d60a4039c08f0f10aec4826d3e1b8e0b845082fbb95fbae30293a92d5ac73856a72ff52040b5f5844b61af07de922d65319b943cbfdbcaff62390f3b162e64956320aaea0e2abbbbfb9678e15ec9dde1509edb4643d997b25db8ffe372ac7845dbf2a0d703340cba5bdfd9225526f249561a16e21fb899a71293750b122fa22e23424aed5a72bbce45995050f6940a51e495931fcdbb289bcab11607eb21a18f35ba5fccf786f04d536c165d4d3f5055b661a31f43deb64575aff3c2b61556c20ed98939517179e86902083ffec6d42c6f744487cc4fda790e87a73829b8849990a4c3c0b5ab5c0ea8f0567729bab9f2ffb6f032403ecca6e4bacf608851dacc924ba6b8051bf48aeeec8c5ca87b56e3cf440521e72f569ec80e07a8683fe06f4a584e7faaeb2ce6c8031755648755c75475a2d83941d96b269dfe365cabdcbbf207e79e00075dc4259f96cc9fdb3429418072c93ab4f9322246b3db1f436e579d1f541306ce036a8effa25efe0fd0b2a208d340cfd70cb1506 +result: pass +shared_secret: 43e175ccf07fb358c9b4a6117c15c327b88d4d8b95a645fcf1ed096f0eaa17d2 + +# Rho leads to matrix containing zeroes +private_key: 078bc69561af0cc77acc291fcb063e1d7c82bdd7cc31d5b44d1aa746e261f2a592d4aa9165c2c3755aa457b886cdd55840767f4fa0b19e45410872cb1db3b8b5829c4ce9b2a8969330cb5bba2397119310fa072b7053b35fb135d04977b9ab4766c4c1ecd9695957473f10c679d71d2f6b57db2ab0726022bfeb10b61807d35447a141255bf5b3d0e3bbf5cc3ae74932d87268e172978d78b99daabcb16b44bd578f6dac130c2528fbc89ffa94b48e6785293023e2605a8533a5ac17c15f34b1e30501729a78d3b8ac6e4a329e1006e0c0735c737283856d7cc7663cdaa1610b1045b7423ca8ccb59ca6b1c482dc02ba117c17588809ef8506f09a7162720142e397c6ac0f8fdb02e4c1c557050af941ae8165ae01d9228f767ef1ac3d72f27cf9a2282a6c379a669d01cc0a6c560b21169557b88771008dad62641f435e0780234e86c1ead05f14c0ad68b6b1041492a166bc4a278b0d352129556d55f37ef8969b596c5e41f8597878c8c6c83de675019c022314215eac667a7b559146478a4a5634ff193f6b83673072643efa59c27650fec168ff17109577083bfa8493f38301528f27681405693345e523ea4398055606d4ccad9df967fe59428ca7502f046506756a6b9a78182383db4baf05014fbb20afaf148456126fa393abfc480edc92465d93aaa158c2a8493882b24c564b607cccb2c8f6cbb43abd722c74c2c63230946acc091c48b865cdb33edb712c670648b07c06691687685218ba48648fa3054ae7a6a663aca6aa4e66506516100c8f2caf9c0645f2554c10c480e798b9c96756e42cc8a7f626c2759d21555342548e0490420df3a8124b0566b1804933b68225359cf66caa599c55573b70d488d16185496216cc09090de382d570795efa569aa5bfa8f4a60665cd30d63bb36cc5ac050310ba9bbe4b3af2f9400296bd344cb72bb623c757366ef1369c968578eba52a092dfef34aadf552a63b1495a5b78168cf6e58b218a3ae64310d16734d5e72b2036bcc001ca07533085548809bf114a092225aec9cce6950a953773ee37ad3467bd5ea0b4cc4c6b0695a774781ce17004cd48e36116776db19565367c92a94488ccbf4ca3c3960524d1b13d6f77399ac625de5a2d09954cf867011f79bb4c3682cd40f133a9d67778a24d7cf1a5b71b7b81dfe335d0fc392a8b12b234950ab79cac94776ad1b713e99b0f394aedce739a15334f19042f4861e739c839ce07da145808260b159625b5a742258779440953c743c591659b9d982aa7da028c7eac4390b47b243ba23e8ae4fd9c98042a0c2d25a6688c9ec774cd7e95899fb7f081035b0c4217c2903688ca7e4466e66ac4e3ca938fd58b4d6bb732a36aa8e097fd75976d1200d61a5c988c12702698b1cfcbd93157d3d1c6e76d316b00b4e462588bbf3c480d8374df3cf66a16f9dd2ab721954e02a9f8eea4380c381da230f10c2c7dec02b057177e157cbd5304ab1d8160a323fd5892fe1649c2e270dbd3777035912dc0802f4d18a56356b52946f30c516838028f7f39cc22466ed277a5adb6864972e1063b1af0709dfd60136b16a3d6c863a68895677c488eb1d879a69a5341a695212066ab848609cbe33176cebbc9157cd2d0228c6385f0d9aa0f99335c9cb777e96b597551a0a644a34d3a419b3ad5351876d93490598a90f31a3a2a227119b7cb397988c8971a0459b2c811ebc8a19a094457c118f6db50b7b1ba6de5aa85e316f71866d759cab439c71d90691f1d27da41779f2c3380c600196133f15938125583ac7650eedb0b069004073205b49943a4fc00ab5ec5e68ea5299b95b303b1cb08b687c0b533ef3a98a7b0c3b6419a6cb825874c4ca5688dc5cc5ba5c49448b479b84baba1344a29493fa3828e953b3ba64b087ac9f5b9a3f12cc6cf9942612606998207a852b35f42ab80f1ac8bada3f107b37cc6c1b8df40391b1afafe848a92853c9b32b9ecb758b88c8f76a9b5e866e8c359f3fa29019f439eb0c9b5d4b2a516877de0295fe7409dc79caa4da5f6a87a26f9265581cb6d141c3d0e597f385bc77f966ae1c01cf29cf0bc536ddb0a8d75c8c5db79e967c899b46bdedb9528f596de02c120fa2702f73b3756aac59a750ef97ae2a7213ee95797f2149af542b992405c9d79e085521d2e303c14146180904f41937cf4180edc666d70238030b4b6572af377693677a5762ea7775c34b9314c10489518525cdea77cfe8b24233dcb477e9cf48acce10911dc9517587b409742b06e3142ca7a54f36d6ba225bb933632ff06802779563fc43a231a11b42b91feba135d7229f1d29781eeb65d93537c58525c4e48b85083b3226937acb2c7bb3941f95664c254c18bb9f91f54f69263a1d590c64f51f0d8789cb60cc9682082bb399fd87279fe4039c9bc69202a309faa488e26a4e3a5d64ea4161b9a8bef9997346ba46da3414965c4ac84ebad1c2f067a3ec5a0866e4a5a26a7403bbbc447c3b13e9c282ea36307c83a91b25b8b565155146fb5a5146e01c21f4aaa3dc7082e93a2dd95e7364b6a97cad2b0bc27d0aa3f393195250118f9c635f41ce82cb1c8ac2158b3101e3f44132a271a545240938bb56d11520e2474678391d4abf7200b775b27dbe81970ccc517542222a67b693d151ecf5485c198838a2cea0060da6285c6f0321472710d62a78c42c9edf07518704157cc5669c3ac775635e09356304819d718abeb0603886c67d8c0c523691a22b987af137a18d20ba3af239de79cb85672d8ed6beb818c5b09baea6c456ae3a4a7481343aa890a94a15a6502399a0101da2448f55666aca18d0259d95838135097273ab117a60cecae8108dab28d6945cd0a30099645892737c3238974588bc9b4384615917e8ec0c10076b2249a42f1841252533376830f1c2bd85456f4e8577f7ec1bfc7a92165ca5a83b85ed4c0dd0652b0ccc9bf5fc6946f710b0bcc42c9529de51bd99166eb4030bd1c394cce0835dcc311cfb6e3c951643f5736045baf1c3a7f11603cc168b6a47ca7eb909c6d9806543380c603a09d435f7695e6b117b75538d92fb03fbd92d05c7461b113eb5dca813c43efd7835525a228005076b969e9446be37c707ae0025e54863fcd72462b6aed873850cbb92cdbb209246945df26c6412cc16214155e57bac92562c5c14e1da60f9e036172cbec09caee2d14242d16b1b1b9659a7705a59b23fd93e6eb23442825473c820df8342bc33177f39451149340964c3ccd20000000000000000000000000000000000000000000000000000002201b62fed0c7f34d9f72842d1c5e796bd86e451f91f03e9cc73d31f8d7cdb16d48790195fff2c19f221b7cd8637576cec18c29a4a51cd07c82eed4974c36e8c +ciphertext: e4cc5f39086d1886cc8362e6210515fec1d8474263af5d7eb7b5ac9c1bfc65109de928c818728fc17548bee754bf8df9f972fc2f5943291e24d0911a1963bc3e4999b6de2add2e5c15b3100a83be4647f3fadba3d61022970ce43a6d0cf5a84b387b5d05847185cc862eb6b71b5a8ef9747a12e399866b3839e73f3a73e38877a1faf8b88c3283f22f6fc2dce6fe43118ff68ca6cb9e88471dcad4ab28c657e30462f64a34a108bec7e3b6eb988c6bdbdf4a300d476c170879ecd62ceed6b530575bcae1f23da95ae486b3322470523429052a3059eb75b699a9941a028da267b970eb0a8d444296e421abeaac7106f0a45dfcb30a69d5336ea98d999e65bfa6a2cf43bd302512f086f8441d92c11937b2773b1cf33b82076a64b8327bf2f94f7ec3e83037dc543bcc8bfed37e3a2ef05e009745cf504f2e261fe194c256292d86d935c7c971dc4c32653fe88fa2dd822fc37b644a3d5dfbe5a710551adc671f954beb44da64c06b9f5a0fb78c1d1b3f94dd2c0a41829fdef6395da7493d18423b52bac69b26b2773d0c4242d5172722780843911f864959c14c4bfbd83ae4c19602460428f9f111e43fdd3c64f9eed410da10348444e6af25f0f83970fb23f0f5515c68041ad694cb9ce9621dc504b564a4757dc4d8ead6db23a889fea5a7982fdf403e609f51758ad7bb78dc6b69a53e32b808fcfa44b547d7b23fdce81ae90070e8cad630ea8000d8f840af81c6feb308b8a5135db80c2963203e9a13d2c5b4926e68b8893113c309c3bb4cb48f06fb87313d414b9fac19fdaade98e1b396d789381b057a293de05fd96454f4394b122de31d72bde9b39a3c171c4e1a036d7d94b8e59506dd16aa28596513c3a0e6d2618fe8d39671c28f33630745b3e671c872a01035da1624c6516b57226aced46e63c0a5c6f791f188ddc8b0c4637695b1b711a92ee422225f5509d9a53e894c959438fdd81f692b930ffb29bbd9b7418c97ce03263877390f86bdf59b617622d181061e9f146c6c355c7d8c16924f99d9b135174935fbb63b09d06734e41eacdb7c55f561da81126487732cc6ae18a1d8df377f865fde5db3289f0a77359550ff31b7778724449db57483c59a94bdcfb7680476a9a5a38cdac1c1033be8c1f4e6689bc7551a7d01912bc00e804b6e9e6b4e84e096b9ba4f07f0d67a3baea5e2fda3224387e298a144c06d78f26948ee7c88c11c121b4ce69ff2912c93ee7cd96ce4faf7ed6412b3ac238c05c9378dff1051e3a48c16a3daa8597ee0ee83fc0b95e2346f5195a2d8af8df16c9608fee9c1fed1d5ba11f31513431d304a3382f18c9ffce39a7c637caddd67153c18ebec8138b7cfe9e08c9a7844e879424531f47444b1cb48bf2cb4c92756a1c03f1d37d1f6a2a22967e5a719aae38732dd5e37f795591ac91faec146131b354ec31fc0e0f80d02c79cb6f40f42f3ef1d0ec6ad1cb208fd6e56ace109c1e5a82079eb7b6a32d358963ea06f7234221e84b67c716d7e523b502de542fd468b130b9ce5ee +result: pass +shared_secret: eb7106b4bbabe9796e68f15931ea311dd171561dd000bba4a80cbb13c17e9709 + +# Rho leads to matrix containing zeroes +private_key: cc4a14e75a6b1bf87f11a240424645dee23657db9819ac274780c2d7d8ac64f2cb82530b40a078791a2ae70aba868253bdc3045b6254c4e29024894cd13723edc7461a37403609b48f79b8e8b1018981bca9f68031dcaf87528a6b065d8cb83c142ba20d68a728a3866ca88e6836cab209ab49bb234312916e432fa51152c763a62cc53da61480691b07a073be74aa6c2b88468bca8302a23d1d6405ddf4aec2f88ab055b18e2b1873862af6539ca83b1c270b6a563cbc7a220cdc8106e6e5595d63a26c0cb86ff11b48066721634b43b361b57a5b4ddb2967d232d34cb750026b362cbd20188260c6a856e9493ae09c462bc4c8663c7903112488b06b2a996dc6668e382e9cdc93e52a1a368b07d8388c9531afff0cc4c07ab423bac717dcc888e213e3a75d69a633f49745bab10f62592f59d53ef19b6a62f0b24216aaed9c91203b7ee65b9d097cc1e2676deeeb576ceb4fa4a867ab7310076a912a41292c658e8f75a98603612558352a5b7beb404fd2bb6de18c7ac838464b6399182536509624e1e25a7821b71edc57c35541cd115ec52c13a739c3de231ada741274272383cc78bc9869d37282f5980209543c92b76ddf99c3d45cb7409b5e44599b75412d8bd122460905c250a94dd4052c0b0a91c9a906aa3652180fba9212046b4f7ad14f7c304780d553f19487b8b7413de732ba1296b41a2d94983d4be93e540a4a4137a030629e97fa640c21ba5b7b5537a03a2a958ec3a888590a5c14a904dd74c83631264644cc6689a245f833530124f7d10e2596a8be227f270941faa75300bd731c145f781cce52247418595ef67c94a170676cda269e51c7ddbc63b6765b010aa061cc576696c84345c35c491d3e4626efc8b73dfcb481c11bbf8c79c6a3aa4e54c43a44141f5c35932486320567ce37adaf5241bfd8c44ec140d30823b58223b02742f3e2bf5864756d528ea36348c1c2293d8ca050b6307d71a20a036e0060697b58a0ada53eee5a6990a9cfe283436cd36a02dcb1a2b7200a267c3f133ea6423bc001baeca953515214e2766f066cae531212dd3551e22bbb1c705f21753ab60a70f364bf1949901d9a0415a36567614c1aba2dacf2c5435b4ee66193c5e461596719790aa792d5a09ac474343509ee36ca048751bd4b0c644b2b039b1320b2294df814b419c3ac55541be5cf4b93593aa4c099142de9e13699a40709d70070aba9227b6c14f216d434c9bc16112b8b4237f838340a5c317a618a91170709bae6a7c13cf96851f72a8761736c452df27758afa4b02fd55b3493b1bbf96dfc45ac743718978b7de8a017eca45dea633dbc417f856781c856c87516429127c6a3d335f162ace0982235ac79ba0ba68edbc1eafb9ed7a3597ca7a612a9bf3ef2b0d1d7c238e98714a434b8b08b35e3885e007501f9bc06e841921521d47999db3ac3937468a54b95b57a2bbe34aeb48ba57f0744021bc684456a8ed413b9192057eb77a5502dbc89c5964c0383b4c9034396da209279199ab5830abe9386b2e811c222a6ccb0cb23732a95676fd5c0376505943ef8bd67a95defe0af7cac395a743bdc3119b1a74771343bad21c53ec80cafd7548ae310293027d6296030fcbc7549ba7ccb22607740c4a4ae9c72a7c9d75f27120e6551a24baa69b07859abfc0a3f81ae50b410cb4b13f4d3174acc7a36b3cac768430678b86030a92506bc3a37bd721320f658bbd2798bf78135c8a29c5c3b7eabd292aa278a0f58620a89c8b502b3cf9b0ed7d3606f612651f28f5d39646b5b6a16cc57b4574b42fbc5dc6b15b92723ede862ee02cddfa891a7b243b4b8ccab0969ad050a35ba05a8d650c2b19a77f8c97b9c15386233cb543063645dcf1c976d79999b5b16e095724e872c9a799246e9c68388573db17fb137a936aa3629e68398851bab14cba8d1c0be8c213453863a470b6e4a640adab4c97375d72422c1e55d6c892fd117999c9b0a000b7a51064505b237055882c3733020fb6375e48d1a07454cc6b2a7c40bba61c10062a9c1957037310aa66a1d560a61d2e2362d912ca5953e8c3a33967b6121b9a888ba87c388bf1b80064b8b75fbd6afc7dbac45d45cb3d9410aa9c56ab369cb4b3ecbc43942d344a3a6785049b78329610a297512bc9a2920bca6aa08e44467572c2d93b513fa83c97b1a29c161c00bac6484659c67e74ead90095d19481fa476bce539459321aa258da0e2579b06cd91e88bdd297447db2f5b836d2c3613d25a8cd00331948a93cfb6bcf5e374f9f623f571b330ca63ce6210c7d229d27256ffa9a32911aeb77024ccaa5145ab493eb29a2e2a134f7bae4c39ab6a162bbac174ac12b1df51bfd02c159eab2dad955ad3a978f85449a9f7b253a74b4c81adbdfc3efd90ca2d7c8b63e574a09bbda6599f98761ff0c1b14ad429512a46e3c1392a800594f95cf3603a760cbcd6c7ba86ec1c9c74c232f31a56f8a3cfd29f05914ad5220bb4dc23900b55ae5607e00022fc0002dc363ed67c5aa49abeed31994e3440253b82dc937ec718273e25293c01305f4c2c47ba47a5558c17fa2f9640034eea6e2f2955189677eca2af91aabe48fc93ad497ed05208d8401d921a5aac231964fc169673289b270ceb9c745ba2b07dd402d3961c2653c27a697087a58a184a9d8b4a34e355063da16bacabaab34c0f6a35ca4500b7e7ec51af92480f726b034b6246295ea017ac5d7586d2b17d074c7ddb3cb5e9597c35692e405a900a535958fa713d0ab6c9466baab305e83597d167783e22b7099bb913d932672954724631225b6b7c1b717388746ed51050d26f4ab89c56e12697a9ae925c5d91194097da004b7925a90cbb849a2e8e250532fabf1c9bcbdb15a5f17395cb93c7e374461c254ca69c3567c01468aa02d3e445a1dcb194303cdc3c580ebabe6d95aae182621dc52e18055050274f024ac6a5180a49dc0fa5033f07295d00b70a5a93be6ac1a412c4217fd177a8c433f4b26cfb14303d42a705984a27c305e1f08da46213da399eb658c14eb03209e601e38887f2c5cb2aa4384a1790ed16a19032cfa3f368a9c1218abba6b0b606baf73d58b4c771baab5481ae971188a4a323352a2b0f0c3e45e808e88b2ab20942c14496abacb28c313f246b807ce73d7b09a612382ad295c74bda7ae1249dcfb534143acd4ac6a68f7573bf256a946395cfe4463e76bf8b0263559b9618a859f46bc3aba5ae34f903038a1df1e02603801be7c53f12a500000000000000000000000000000000000000000000000000000019d4dbdd018404448fd2208e2433d1344c4488d6553afc581dc2cbaa10459f8ba9e4a0d3487b6714e18bcc9d1daeb3127164328a19d5cf60822f3fd37a24bbed +ciphertext: f28a06a7b862171162d64f9df3702b7336c47af5e15b1ced699164ae57797974e7fb78276e883360e2b51016d72d69164becd785570d9906641b0650c34bd1c556013688dfd9f2858c1a2151465e5ab51aa40c595ef4909b9c0de1eb7d4ae92467721131e5ce21f7365788798d18682a8035e14d2e769ca10589531ec5243e077a60abfae9bd0c03d8ecd7c4717c90137515c764ae0540a99fb2bb4057342eadca362c1b540d97d59408b2131df36a950d0a257eea95796f9230d649961d1cee9bbd30d1b88bb3680075a4c5976efeb95211e184db3665c7e184a912bcbcd3ccaa249c722b89c35d7374256b5490bfce5a449c2ec93793f0426c4655ec82f5b4492d44cef93e55802eb64d3fefe0d3b450c9b72df7bd85997c6c6b94033102091d4829ba10ec59dd5ca88feb328c39748d26bf44c5b5310d814c4cd9a1291a041169b0ad0af9dad279dd80a5f465bdc74c5060c2b226dcc04f8d8c03cc38a4eb1437c8500c9707170bea771fa27343b0efeb485c0c2b0b5fdd2d0e9c450a05b9d7f554031125e336484d235643f429c015dadfe10d050734e2dec4b915c3350277ab2bfc38479dd3f773f6d54a397eb7825a398e415664ec884dcd6d958c5794d53ed9f8bc8d1de0e48a12ba149626bb1bda6710b48e1803347412298db17c224f8279dbcd311a4e67711fa0a8de2f7d4234ec25952a415c96f4d3a92e8b9dd6d37d726375145d0dc68afaa08701ad5af5a9a029cff366e01f6bfc1d63069d8c2b00f9db8f1794d714b36e6e783b6a2fcbed61d16eda97803602bb0211cbf5b8895c2a451407fa4937369f0deb8807759b16d81f215b69a257e207396df441eee6f8069a9637cac41aaf6155dfb45a7402596370faeb1ef9bf633aa5eb96a207cd3ade1765a597d4f277b6f7c33b36e816d2368a19af20df4bcddc15381f2d8f04e4650157ec4cc0943ee080d24bd771bb35c0f8269be961249ff8a5a315c1ec1ed4ffe5a4210b5455f6d367c2df5f0da09d20eba91c6dcf63b215b39dca326fbc4649d7862b56927b41db2217459c23a9a9b9e83d79fd6f34295f3853eee312bfd30ee31d02fe026eb56adb6135fd51a8c9da35c171dcf5c999b1ccd78de1b9574b029cc0a845b196330a3e32309d61294468cd40ac3d51011eec5e1af1e397c0f6d2355e4a5bf69391e7e90825c524d76c688bb8cf495d2dd70d316996d3b0fcc8d1008427413f0498e63d5001e4ec571bc0e68c37947782e48d71feaccadbd1d99888bb6c4f22e9eee0800c09ce8ddee3af45272b4d9a3ff372ff1a7fc3f5fff8fc2eb3cc909fe273eabe09983223dcbe0cdb6641b5c905be7bab920a21ae6f43beacac025fe07ebd3d5065d49dbd0ba5d603f2c534b6533049c62628bbf3002c0da4da81f1e0f4e957565d79c4b1896b6de04393629fb453512f1e1d39b1462ce7f693ab482224dd376b0602dd2fe0ac592d7d0fb92ec5657af2317255ae3f757b01aff57e112c61f53b850d41a0d2964121a33d15db32dab2ac7583136e +result: pass +shared_secret: a39c5a7a5e9f4aa4a81e5463048c7028d0a2df5491fa678d38161dbd3a08825b + +# Rho leads to matrix containing zeroes +private_key: cca22002e0b84e0c0fa98c902c2a30f0d9303a411db91a26576834d4f1645c181bba750c42ab6bcf401739f83fe2a4a3aa1a3f5917418003aed863875fc044dbc99c70b27758389fdd3cce51d5a13b21afe1219f0bab5dc3b15952591e6f80068b30870ed644de082476e7b32d3a531ff8631914c7a5c106a5acbf8672ab4a304afb71b1672cb281438f0fdb1db0f52948e8b0a1422ba10ac5e0a480e87bb844072e7a134dcce36f27274775fc6a8bc611b2a33cf85a4820e18b47b24188030fcaaba998d84a68424c07f4503abb553ec33b4be2af3557aae2797649da014dd0264d00ce74431e46f8969276b24b359c6750c5bc15a6318c2d06898ec5f473380a68302a91eb562fe4f10596012e5efa83f4c55a19912978a6583e4a884e36af1b9367e69ab0566c3cd8c34eaea615f49c094bcbc63d52a21d74c02462cb0bb7c77cbaa03df988b60cba880771a7c179315a9f6ebc6e9b8c90bbf17f737508b1691ef1952363e9499b5007a9c84838c2a149478e4be76c0368a8220b9a3ac68ef6560dba6b3f68257b6719551d83c38f73654fb392af0c1c2517851fc160c343cf826aca2c5614726c774c758e1abaa9ac04ae0742799060970909cbc2f78ca739c71bf6528f0695ea6175a4ac13555c3bcb9920bca3a37d363ba622666e54a4e779cad5059612792d610257a689975fd664dc5081d5ac4586c60e99b9a2a17ac612e5a794ca4dc097a71f72bce02b4907d69d801a22fd7b88f9e4ab284076037a0f6ac803bd7b243b835e51873919d3b77de041bbdb9c2917338f0c42a54ba6f5539d60e827387a9e7c156155d693b85701b53278139b29858785cb59788ed981d77556d27390285bc3f9408cbdc717895815d31641d0c31f2d911515f36743c40f4f3517432c620892149b518fecc80cd2d14c99730e0c940dec155930dcb5ef861b7c80b55c2223f7066b625c9fe5f0cb04f0bcb880119de142ce511affc01d483ac8db8b73e504b242315533d9c02cb64d15445fe32bb0c8e19383f82854981a9ea465b05c77cfd66d97a2b262bb37398cb4654a0fc8146c00b7608f061a216b9becec17f686b93d88309a7ac04c2447030b41ebc6a95fc52466d36dfd461bb046172f3b83fd10bf79c281202a60aed8467748a986100b97742c8d70c8de523c1d700489c391096c1b92654064cb7e35d7b25f29818ff39fa523c88bd69b8cf41689a414288c492f2a83f7b34a4d95770e6144b7731057c73a077a471e7b378fa48464c426ce5a6566e7c862131ebd5a1b3df013641a878fd702d167ae3f369361666514d98f325679c22aaddb56406e148e744960ee1395866acbe095542a6836571959a80238d037260fa053a52cbbc2cbc035e78fa9c306ebcb61ce33422584009271835ac3845524794f18bd7e1b4c034832fe68ba24a162815404f65c0af0944c9789b1d92767268c801a0444fff50399b3a192131e965523bbc2c75c286c96450c3f0733458bad7831205b1b4841a617626b4bee232cd1f220edf53b59bc213a055d956591fc3518a1974582f79a66dc8892ba71ccf7a5fae1c01841428525c32dd2b433445118559cb5447e3c851a0cb498cf99c2d359999fa39692a59b6806bf4af964b370a7a5c3b2681cac9561bc4f59c0f32151e25ac4b1c80452e7cf2544824ebbc8d33ba3ade7ab1a585a98a51cf8632a02295284f2acb78373b0078081a291477510e7f6569751cde2106f8a064a24ec6a921103b8e5b820410f15e51ec7a49de77799b16c58d0c350f83a5aa63a286220c9ae97c2455780d917b2a7d6738735be61964574805f848c1d0a689060e591d60c7f057c92896a71e5109c07c0aaddd3622b672109664fadc3304118afc71644c2b7844802529f38b9a2212301dc2d2e589e7577ca2454a7fb78bab8165ce4f94cf8f121eec4531afa5fa02251090caa9425aac327af64601fdbf19feba983b0f55a22616048c646cbf08091b315dea5637fc8aed7b4418e09a70dd90ae1004d8162b5d58c24eaf7cfb47b26ffd98c48870c583aa2a5a6b5385b51e5f46236081cf9317c662498cce911b1c736e02503650761fb528d33d6708a4bab573456c2f01a52a024996a80ae0311dd56aa532709be25ac0e9b7862205e300253bd31210974b44477c3d0c62ab02b1f7d8bc910e5ac0ff29af6c66f05c48edd4601edb547ece62f8c4944af201221886da1f36cfd937e98d6a8bb606507c5099a76bc91a38812b822da60afa0d1606cac59b267ad4f47782a882a8415b9cef663ca89240c474ea265adc9f71eab97cd8215c10a32cc45287ed53180e0982fc6aa3db2b0cef48640992a33365454761ac072f765e84a46504304d775929222a6fe7a3c790b48bcc255ff189b5391add20c4581e4c59d09744a56a1941734fd24a81a968322b33da31234cea9387d31a9e9374cc4203a608285de5996b62143aa9a4dfa5a2cb0066d2bc4be6885587a4408bb3103a24b2561729021458b77951c8b8564ef0a08add70c3b7a1afcd3b4d5d3be685ba1439aa66a2393531b86a707576da189ec3885f5756c851abe689024bdc2671d926ca511b7c3b41e03c79c2b3caba27bb31f5a3184e16055c8127ba7b0d87216f81318a0d88f1665996a6b47bc7808daeb799935ac67653c59e23178da6a7cf40f9ca22246ac56db9417e5062d487c1b9ae3664109a9329567bd8c577d8cc0ed65cf1b6887ec3836fd16bff20a7671cc37b0921129b410a5e22b01d3477da0230ee5018a571f7519610c4badf145c5c4f5a29357a17f245f24e3bec0d22937457c38955f0aaabfb4d80bccf57909892e120546868b9b556289cc5594c7cc083e808f66e20d9c855d4cc936db566a4ada6e46b680df8b91898a002d9494a30127855c4cb843a8080205fee96f101b9c06104191d0bf92273fb0cc6f089a202984c0ea1c46d1f3b037b7c9b557af96e89784d990a66a1634888dabe6058d03c8b857605621a0b031a52cf26385a55f72d36555b87c5f2a36fdd4a72820ae20e90025a077e82c20cc7a8ce4f64c12940976d34e49b1200bd2b11b94bc5fd379f88779133a2f6453797f5c34a7b916f4f3bdc8c10de83b08312ab49f34cbca4917311401c7581a3cc02cbfca9b1da3cccba54c1ef7992335b25e282ec7677698c8ce94a1846443b1ea9261ff688f467212977493b27a43aebb681450ad64f31e158a5cb98a9ed43554c807090c22a1f343605bdac089362c0e2bf23a830000000000000000000000000000000000000000000000000000009aca1ba802d896abf9daa0d84b46b63742699b4ebe792d40deb9e4eea6e5755453f53a49ff45b0ae588d417a63a599670cd391c5e9885c972593d09350bd7523 +ciphertext: cbfe4560b3b067abd9cc82c2c40676f02b730c5280fb13645666b719e7d9d5527e029f3d75a3024502b338be060364a41981db3c7f52c59426b43fa835fc2fccd92a26c903adb74de93c2dbdf590996ebf1a9e2003e77cc896e2afce50d15bedf3fbcb65675f125745fcb1804e25ef99b6f792578520e82e599c5e83a500428b191bd93798b73645ffd10c9beb3abf33535bf149a3471f85f55789e3f73b55425185449c60bdf62c01a8fb1936f50db5d436066824b378902a81c5edc3b74b3bac3c58eaf3a993b3b4c1f2a0027cd7156b7127412294214fc7aae635edf26f6e5f8034464abc05f4059de6cabc5e4a8fb83a8c25bc88e7e9bee1a8cf312434410ead60d1b482399422621006ab52127df15f7385d62480bb0fe494843775aba4049ef94cceb78e9dcd3318608d3fff2e75e29769cfd8df0e12a77ba6db5f54d69be74a2b03d62db822a8cad7f20ad4655bfd73c62064d23fe521d37daafcf143f693eab811d28da6d0929be3cdf61a56e487289c02151f11342756bd419553186ce79bb17d5d5754752bcb72349b65cd64b8fc6066656a9cedda0aa9a09f567cccc23e547cc9ad86f636233be7815dea220e29863d830d0ef9b0a13a62a56237e2c6f443e61410253957ce3b0f95dd422012e1b84d32ec17f534f56641e7fe92ed181d830b4d0f3245df6ad891c26bfa116d40460c497d8fbcb6def0ee530ff4422d132726751d724cd84f8dd19e286e0a4d891af0e4a913352b9afecfbaf0210077c5be9ee7f5546700754f7f0dd2c2600f113c747d2a706009a8838a7b2b958324842f8fe3933b8e522d63d772a3bd0d5186342a20ff3a5e7a5728fcbb3ec18d0c90e5fd2430359affbd9648d1ca2400a55a99586807bf18041fe7af6f51120ec366c99fd4994f20e540e31caa71d5f95e60a921cc62db1fe6f9219a7705edc1a7015e7ec126a22f7ff0c9bb4aa3a1126d83ce4987ebbda148fa5b3cc07bd7c78f26699486a3dc690920fd21d75fedc4b631841b634641594fbd98ce2d8376b179da29f925a31589e04c74c4fea00db64289e30ac9e58043955ccabd9515e0c2a88e6b50dabdec8b6f574a6c44f4a0ba4d00478396852263376574706e5f92220492782df64becc8149b24feaf808c85723b7911961051468d38bb94421a18364e2c158035172e9368810d2f68f64499b6b407bf775223a3f345223ea3c1c5f456f48983d994fe4da62d0eca318b130bc8ade488a900b7746633187bf12a598f6f144c55738d4831f0ff3802a6a8f742d7a9f64f95f2401194ffade9def6f73fdc67b386115c9d905719808f41e2035947cde0bbbb44d92e51258822bb4e4493a7a4b0ce64f8620b3c54078985a3dfd4cc2b3b5ec3fd870cd6ae095c39049ad69234966c5f1f70140f88c75f11f03fa25c3d673e5ddc14f79f567bdb29a2fff88e11660327559bd0d2511d21a8ff1957c0beaeb1a26f280b3f1146be891b39ce13010c77b775d11552e59dbfabbb64409553d3da222902d0ac1e78b21677ef +result: pass +shared_secret: aa50a536b37f28e5f80904269d0555a6172d717433bf9a680e75e98af3209a91 + +# Rho leads to matrix containing zeroes +private_key: 16997ff80976d1506b23c012e387ac6ca0a792f7481ac3c9775317ee3ca5267bc7180ca884d28bad6b5a05b045f33a9b975c6c98908d670550b874ca70a77424e48bf097256434b9d9b96c8b8149f02ba5bde9b813eb2b60f20da4440b4cfb05716bbfd86255a1e82941d2816caa7253e7368a4bbf4bf546f40b1bafc65bb994c34f7337e82818021797a431cfc664699bc22b92561fe3d1cd6306b89a36380920abbb466477549d1bf14364221c10f51fc3f7240de4c99b3bb3eeb9ac1fe12bb7c97888e8386da4a341a0be8f78a7b7c49f2184376c3c3784289a6bd9b6a03a110c228f72939b86c7a87dab3e093c0ade693a0e5331c48b761b070476f55cc45ba1dda14dfde01a011776143a4d29d48b47b0c6cd2111bf18360a7438f384a28d772177f648773b961a86637c946d7981a6b9f571a4c29aad07220fe081f1f18700f3c99ef28e76819f8d7c4c43d754cea21180c43357f3430bcbce1fe8952c691cfe9a7483026386a479eee4025a838df5c563b9f5a1882a2d7209a68d231ee82260a7eb4fc157936deab52618cba32772fa1440fb675220f4610d749a5b3b142f31b404d94d2bd816cc4773ec83aa1445a37b361e52b10960827e94171dce3c12cec80a1ec65aa6f117fe937673a78cd7767dadd3cebe0217f13c903ca25d6a681116b206acb46949b18f671a63fd2581a6c0978738460cc51df3711dc1215dcf75525d30559ab6bc52e16fa513753454888189348f045aee8a32e98cb2dfd708e7d42818115e5c61711a0c43e85a13657aadc24b5b30a04a43cb97bafa433204c18536337758c0db6154d4fac670fa3af148b52f24aa731c31f98464ca9bc975e97fd665710ee2c56b024fb8d7c7f4a20cc9d510f8eac38f96129c97b17c890417a21465d05abca02754ac3614e964f1a24393d05ccf5cb9500852cc9231656ca899f3538df30984475209f84ae8b99983e844b06ba4cd8a9640a513cee439ae13ad57d3846aea4fa165b68c6c03c05c835bcc5a63d45cc5568aef94ae7798bf29aa7f38e275c902236e63872a274e4776cf1928c492036166d04eed9ca64aa16ebb4b11fc3ba802c6b249e4b53f90112b587d36c6bfb0733a2ee3003419026a10a4c54c2be294b2031a48fe895c2c9920b3772f127338a865a82c3262dabac113c235d433b90d401f5557bb1bc68359020f75742c2008c2bc8862416910f53772a55376ef05a5eca853eb1ba5ef841f243b8d98b11e94483ad7e72fd7360a3641159e481ca50971a6e8aee73a0d4f24b25430ccc0997c631308fe2aaefcf79af5d2045932043d95933919b21ef87865b8550742a513d67af756c5958465f582983a777e9032ac43164e552358861a0ebc458e55865fc3545fd01b0e7565877ed3229f8267369c319abbb017a87ca662c635519ff418682af39ba387aa38ec37396b4d6ab505219314f4448d0f572f4330cf33fa1369872649c922bcd228c294b3213a216e59752072b8e026700ea63061855be3d6037c0cabe0c21f5be948ee4b18dd935ad358a5885a0331db2e496995bd47c3ff2b679e0abafc02804b6117271a2b00e33bc06250fb30ae2036716d30a50aa07e45f244e1f0100d749389f5b871bb5473b52efb4ba5b2a8317c7255790b7e96937f9c95466431a268b0bbb12aa639d418775a56d3595231262c6602be765498dfc0b5cd404a630cbf46e06cb235ca7064a8b7e2471fe34ec3db94c8ea14abf797d5259ea7236391c3b7ddd3c3aa1745cc6857dac8a42693274507985c32bf65535d6644463753c00e18ba859b86b654916c9b14be78a5d11a2fbcf9ba9225566b600b0edb3637a18319027aa494a9631c6958221703579d75b9cb09d21c34409a3d2b342c05bfa4b82b19444612395bafd8ce0bd772b303bdc37c1e57a26c6efca874fb244ce314f63b6635c7af1be1a3205498204505a80138bffa0e79b60f58675965578719813e31b352390ab04376b45344bd8efa65fea466e8c78d45680be0e1381ca5af4cb666749676b2eb1e02d003dee20f4298b720aa6895a80a17f242a983c97a43981122043d444a5af3066816c7a07c7c880b2b2b8958323711e5551c91268b1ecbaa3342418b322766334d5d4691e0111d56e48637c012bd04a9b06524c30752fb7834a2506db7ac7ead1b72cde45dc793cf875085f67a055f6cc0f7b703e29c578d0329dd2a01ff05ce9b1a5a8b993621611fc51356b5d4a55c4a6ca3b5046d7b9e305494c93177c2e78ed1bca1110c7221ccb07ef99b3aec74a8f083ee5a897d55515a5117b1c244c0898738636e577ca59d16cd1c44299d41c311a8728ff38bc476b1027426bea27795396e2bc24e0ca43e17cc8e63bab9463b42bb6812e7b840a9943ff11210aaf11568c85978816bae1457ff364923c846548b5908b2737514c625c8c11a0898924ba682b3c8c30437e8b23477d06d89d39f590c8e2561c698362e99224450217cd0a393ccf870a84159273083008345b2973e98d78089317f7993c299b7c64ed3309b5b6594a236bb8c1c67cac692a2a1746987ed6ca84d5a5a4003b1b1347a9846656a36034d7a148cc8157afa6c915a05a81b1d88568fc3f62b9996062bb99e43447bb22a5b29473a728c929d57b6ff774f5364c9f4145944b979bc549c1d5b0e9e676b2d493f799875762360ab9bb4b322484bb78fa399bcb889c08c94638d95518bb8742bb2a801233adab5bb95903f355126629aa87477b19d3135af8695f3da81df3559d510a7da3cc364939c8b507c99096630601d60999278b731824642c6a018c22c82a60bc9e0203e0b8139dff977c2a903b812a0a6c79c9bf21618b4ca7a836e20346f64483c277750d38b0a204baa8b258db85b3222a5cbbeb599af8ccb19c649ae048d97153b5a7c974738a08c1c653292496287682670cf30197142dcce7fac5694f58bb9e23c9b496f0a939636d6522129038e99179c8cc37697c83e908aee62a1fd266a613853fa12180407a222682b49bb41c9c23c55c63cc7d115da6cb53bc688fa178f632b0b9042631999b6de6165322a817ee3037bd33e6d6024174439119993e1776ccf6862e104019cf739ebe62e0dd10628dab37946c0f1e762ab4bb94fc993cffa89ba245d7e48055c43a8819c4701bcbf44044210c451fd4c5a82231676ac2941278ffd12c686bb21547a1e832a48cf991bca13433d4a55fb485f04546c8a3201dec55d1889942d1928250867ddbf1a9138000000000000000000000000000000000000000000000000000000d5caa2fdfd51a2788de89e6d3e77f6abb8f38693cb010deed4069f451284de44e366c059f5f26e6dfba8db203c5b27beca8fedd3de2664f6bd5c3e2ac9fb3891 +ciphertext: 0802659cbd143028c3d5f499c51d88e361522a2a6c353f8bad088b1f0a6eb02f94458508a80aa98ec29952e405f754a77ea9cbc07ccc41ff66fff5c4664910a6363da480ea8f0de3e7bda007593199494e6be43c713178b791119adcd4fa712e077eb46b39d1bb073ba7f39b56885906fed63a0d6a1be4bfc2d512a17ae327fea8f1f8ddacc103fd8a1131908ac348dfd01372968ce3ed40ae90f747be9294f8e3c356f425dcc5002e9363189969f3316774acfe7982361e6f057a322d667032c5e1b235cb44a7e7be4cf46d3f6b59154ba303abd608e75e55214ac4993683dcfb5f4cf3d99b31b43a054325cb6fc3614b76ba18c6f40ca3a289c6ed338a5ede7677f6a57cc4d1c0ba121feb6cd170419a7c9b85c63233ede2db86d8a52018e2f00ca1ac31157154dbb539cb65090b2eb3a5ddf6195dcd25a2c3c8ada060d2a9fcf43bb1e67ac25dcbe67709f00abc94b9ffcf754fe742addb0b928df78122f0b86a2a3b7db85db4a9596f53048cb0bd2e849b97f99f1dc4deb86d4333a891f1e5e205637a31956cdf6442632618e97b8e2f71f0d97a88908925fd1f19956d34b67b258c49058c9a162626066731ac4c8272682c6816e7a513178ab4468772185d461ea5db42ceeff258be448ae8337f1c8ce44771bb79d6e7736949db9b68307388c7a28781a0b0180bece5e0f21d99309621d6ede5031cd791d591b7296f8fda67af0563598b463e19aed4576c369dac22c7e74ef6c1be036a74e9483bdf534cbfa78455a84568a7a2ec9a43b0be67ea16758cd60c999cd72a8b14dbe544bc142eae6ebe838091602535a127f7c1d6ddc92c07f5852158da2ccc90551edac0f043a951e5c47259001c8fe9ef8a9af5d4e40422dd8b0244468a5a9f0fc62e300f0b80069993cb0b5fd6555c5feb71a9e07fa121c82dca7d9df561b967436dadf5752e9cad9bf587a3e6c18d6fcdb00aa21e6698617ba0166b52f4406b7b184abf053a713e55e4b6d5148651fb29ce1297554a254df7ed1c97c2e30e6afb19289f1e8c94831211af2fcf6e3cdd67a04a65c19ceccf08e80f649b5120f6f6efa2af36c53884ab9a5fb5ce24971b9c907a130605bd996e6a7e4b8fa852d421c5cc46d05148957288a98ede63b556c96b6056496736b1f1832463e5ce4ca602eb3c2e86712cf4d8e44942554d930ebfa9eabaefe29358f23939948616c5ff831f162826732c25c319155808eeca9d7cc5e3325b01bffbecb7520a72b3b71e4c50d959f45b6a79789dce902ad29e3a66373bc1b40a821c6f0e6057c9427f30f3a7cad672542aba0142ac6b371fc3da667a5aaddfecd70986571b49bec52c59eaceac305dde821d248da99058e3a23df496fe51cdcb45501b02cf5338df7fe762990c2a6dcefb23dc1e5a257c14962501ab1e479881ffe5868e00074cb8fafe6477b16530854da6223153680571865a6ebc058e64c11f09236886c736592e73a41de2c093e88348631cf31de6440ae21bcbd045166d3af8539d77f2aa1b202056d23b +result: pass +shared_secret: 9f4a910d1fcff86f96149e88e28cddd95526ee64c491291e72a2719f97b2beb9 + +# Rho leads to non invertable matrix +private_key: 00208080e8b3938b09aab715a0b7a09314c3d2aa03e900528a209c655886bf0180a0775a1ee133e543c17d7c24407131f0b813a9287c5c9939d43ba2c1f064015c1babc910d1024bfb46a3fbb1ae13dc5d8bb4576787a592495786a53d4c172cbd3b2cac6a2f5ab68fcfeb2a67a997d809800615c043e4bcc0985de9d671e6e0c8b071a20264c457c13b1f4734f234142e86c23170821d068210b29358694d8ff27e89c59264a315b6591d97d90ede633b68fbc36ca96b823a4bc66144b541cc118b0d60a66c89124d9080ae30f44b9f4793cfac65ab8b8cd65ac81cd95de566ca2c19906a955a04047052a699e8a132e2e48aab916278c49ccd1ca0076b5254784a23f7a8c164229bdb9b46e1c7bd4c74639053cad5226c598918687fbc50323f086238366c4ad9172346626b54ce142053de67ce8867cf599587d0a47aff0a7fc113140c18c40bb31e2340822cac294aeb3a02652b424ac9f1008a592ccf70170246e689edeab03dc0249ba59fcc6477fb668038443bf9a743255310df11b4c90a97bd212a74d5142bc6461a135ce7376995372a1bf919e3db20f22c683f488395a95e31ab13aa707c59f22e85d892830bb550395633f6c87df28401865106b5cffb75729391767522ac236072250c6f4dda196a90bbdfa183113c5fe2e31ba1187b4f682399f3c6c0288977904ab445c0c1b9caca030aa639b35029657c1608e3a654cbc39f8f096414d278059a6f56c8c838b1879b00ceff668190213eb15184a57706bd8c9111667f52a656d161bcb5e7cb8ef5beb6756371ba4297397eb6d0c850aac1e01025001b71a874a25e3ac16450228dc33691b3112de319f69ac29f2a1cdf02a0cd77319931003910331a6268f42669f4a90e79bb820e5c98aa252dcbd056318a050ab71f5d60028fc41594688cea4a95b32529c39c582ae828016644faf4b7b1fa6fd9c305807c43dbba54d44273669bcf956c197ea3462a30be3aabb1a6654dc4a72bbae53982ebb986e249d9438d66b65fa15b723267ce1fc1200bc26656d7c4e1839e02927a96304460a34a9c0a22ccf15c7390afed4a612ef236f9d00c22d04cc1dc362c08afd0a16536985f69f6a15d6585c410ac7a39599c683b9e67a33ee299a5000c7e4acde611bd6c817b1aeb1373835a245b916620be6ce8093f88635cfb619a963c99785cc5c354e5d025f954071e380876408fc5ac7fbbeb4c532b1f1be67ebfacac4cf907be9485c6da8da380809ee102af0c98beebb088c13d29830e7fca4dab8c1e8cc87a3b4198c50686c82626c41414d50878f403c10ac905f39a901405b93366a575338ed7d66c0a27c9dbc4af2d217688dc3909db8878000af307a989234174363f3cc35c25a42d7361ccadeca25a484a01967be2a65bf4998d57943759528d54e498ab18514a5665b87c98339c3fc01baaa2953abc1aba78778b26d54bdb2ab69dd705d6953dea404adf8c82d29b932e144f48a2661dc2129e6a2a1bc5242552374a504e0d135e6cfc9fb91a492e443c608c6e5342361aa8205ac744ecf974b667a6528938b6085492298e97ea827d5a4274ca359a1811c71a574dc986f4262b2e29256c4b52c9a22c3f168988ccca947895240c96489219f575bdf7b6305fe7ba4db674f8b57be7d17947b73ba481a51737962bd0ce801254d54bc9d6d5bb184609d844501eb81ad43007fd3513e7e6aabde15bfec8b74ef67be8e4b61b4358d4828914033d65f89915e6c27e5676c98423f0d2508c343e049cb8044a4a77666a3475a52a4c73f38acd49519486e511ee7b8797b35fa8301ba8fb793f6906304842604b5608fba93f3505a765ba5c329289fb4a69347501c686b5d126ddbc58f5b8c5bbf044a1a58926d77ee9a7bb0ffb69f1986cf10719b2379130872b8c6640ab856622eaa08b298adf98115e68615d9627f339c4f08ac67fa464ab5b4824ca3765e33a16f7706ab7c1deb31b262a3e14870ee4bc30a746171f3c998fc73663320ea3475564c25e9fd869f1e3b94ec15ea8f355e6944b874c469e96050b0ca62985912a4b87c4aa5434e4929430b06f220737cabcb771b6714497cb07b319e57165449bc7904201012fac808013836dde3555ff6462a77125a6a0c6f4aa0822006ba5357ffc494602d87866854ec8b646ef5a545430bbf155cb4e9c36ce2c42b6e48fc26296b2c1415cdc8d06c38ec4c37f9e16afd6fa232fa396832a26c7562fd55b80bea977fdb5b7a5f95e221401a932687e535b0213056297391d36b0cb320cb3358e1ff19a2d239a8f5a75cf40a5b4130ac2972c1a5b9e4fe799394c23196805459336deb36367b6b2c81cbbdc56840ee0058ed799c5c735df07a99043201c2427a4699f5ccacd3c86299e458f3783628258677126556c485406d0678d030afb082b88676745189800fd9d6267b557a3936e262baed80ce471997b0147b3556a8f74760e85391300ae4f84c494a09da042422f196dc0ac3a65687d33ba4219788037a14fc4087b585842290593dc853c68d70c410b98117249654c3332685de518a3beebb5469c4d2a624855124025544afad7a26f5234bba21b8e772c0a58572608857336a9ad070b6b01990fa4bf797902d0765c83604ee4767e11e4bf45ab7dbc9ab7efc180789070380badd67b96f0c90cb95a4152144956309cc0ea6771655ef11579dd703caa09c1e314493b758e8a12a8e7dc8336c29a2a9198873b2065caa6c8ec545c03827b39b210544668e9884353791348bc74032d4a7a00396744813baa1a83b0d1139ceb18c75f6cab6b13cb8722647a730f67219096b50375a105a5dbc960142648fca49aba468ad77a031334ae650ba879a859e80901a70fc2d80083c2b0786a589f1b65e0f83527b60d298b8b93a177901b78c61bc6ba296a342a412f1c48250340a0bb5e2b227b42451aead12b196540c9f001907a40bc68821b040607f918d9199693395d4f828de0502c8c601b2a787d15dabdbc764ad9022cbcc87fbc4a84c22840a39cc610905423a5c4211abe722b69ae78803fbc56b5f3671491495ea9a7b067541954650582a1a6358af04419c4d2acd16910a03a2c04a1ac3ac6138f162d61e6258c863427a8937b65c183734b533c4bf0e52c3c06cb5422c2bdd063e405d08bd7a82dc731c2e526a5d19156b19b68db05421c5d099334bba29da2d953164c6cb5c6860de4adbd60525dc96e1d261786d79f09819d680598a900c42c3042e336828a1700000000000000000000000000000000000000000000000000000001a391043e522eb6682ef71d7ce5fe4a7b6be5a0d5507ad3083378ef190a50a611536217ef54eccc82ada15ed86ba2003e177f270bb5aeee52f9436e31a379d2 +ciphertext: 2a7190d8db048ee0963d59eeb251bed93d3223db4415e438d40fa06cfb65c5dbc9cdc219a8e007434870fa10c8d64f0aa3e5016c67378b670852af5615e23b612f08d0f83d26d4f48e108b6e6a639649d618245055270d7e6f47c48152ce42effa918f74118dfabf87a497a412a0cc464e99d2460e0dcf6a16b99e8f35224894defa85a02ac162e122a4389a7c85668781c6d682422bdff1edcb442a73982c4512111c54545fc8cb65d1fa2ee1ab685cd047aed9085af1144014810959fa49e7c08ef15bb7c97e8306e7a28404c9c26e21b053e9fb6ce86a76b13fc28df94f3719bd55dd281ad1b8289f8c53175838fc406a7d705c4a91a2a0053507fd7176c1efe28bbcac57f555504f5b2ad0a7e8e9d941fc80080f6615130284e428fa18740af5fdfbf848b4c772e38347ea7cad57a72cf02e41b114de1380238a6fdd35d20e1847e92c64a84039fc3564a7ff85ee6c4a7f5b05fc90f95cafe52747b34e3a9ae91b28c659f4941f2c9ad595700c31b0dedb53d6a2d4fead5d754637e89c4aa7175f17882aaf775d850287460e4971dc112c498000f4da174aa4f4f3f3202ea9e119cee357caf9c1fa9623fd1033df981c09a010dc44a71a7d43d55c328eaf205586b225ca998c066623993046eaf93d827a891f1e997fba4008db106e430ec7528286b2b2032d299acf11fd3f8fb57aa2cbb2642412546e09fe139b377ce8f6e1890be4a23f50de04b5c93b701a8679ea102f90f4766d603a164aeb7270ca85faba085f15eabbe1c89ff2edd4b50227503cb31c34f645323fd38c7bffec6a825621579b565339624b434abc090ccc4c1227bc63d4bc1a6e2535cb5b299ef03061f9bff77052fd23984d7d6f63d986cf310474feaf338791b158c542a361c9c222f4012d4981247f4cfcdc3a2cdbbeebf9aecfb97e29f9c328be170d5da3539b277d3f4295c6ed3712627b5176b7ad1d2aed1445ef2e47e46d251b74b906f6dc3c3d9f54968245845f2fcb33522659508bf54e6358dd3cc43c2e097b880371c6cae243b11f36f8c34ade6ff113da5ea0868c4f8a5d0eafa3fd5ac8f5bfe776f5f72791d654fd845d0ee6c9d28fd835dba5c367af22ef2232526bbef604c163417542bf6fb768ce2c29000ec626cd56acd6f3dbd18b5485b710e4456f2a01c25bc0af5aa330a5f9d45bdfe985710351c167556acbe0fd0b7bddbd3a86dcc7d7ad63130f33b651afc897a7fb2a724c205867c4dbc86d53e68b1679626c750fe5335853a3489821e52402d0b1ed47c69992179c663ecd914e77b0c94e870ba17929d53e567d444e592e580b23c160933fe3024a49fa8656236d3917192c44b0c5a30d79a121ff12411dd6b3d443a5490276dd379fa9e3227b1756981b1cc0ce44fbb939de802d16ef81bbb98ad6add920c42d908c72b7abfd6e946dc16598272be95c72a05658070a211801b6ba7b04248898272e6a348b26e93207185c2d57600493a313ad162561da704b75b52388d84b240993fb3a4900a2951bd380589fcb +result: pass +shared_secret: eb34705a8743c042134c4f17ed6fe334ee260a7e77223af5bf77788ddbe5cac6 + +# Rho leads to non invertable matrix +private_key: c5f6c739c640b093956cfb9d54272b3c704d3b364ff1c68510b875c8c29f30051b5f60b53f6341082252746b8d4eb52b3f77c818d42ac776ad393072d458a28b186da2b61cf64bc6d8b424afb49a3b2528d4863c876aac69b7c7fa95314dd36ab5f021ba8c575ca458c469409b71b31f3a8e371937405067951c084b6a832ab321642c82f33395b0701e5a677c3c783a47d7a6e474af454c1b31b174ce5285e90608e1932493e44bf48b921d6a58b1b86ec2a38b8ba2a1fe884c0fd608af3986270391d1a42843637d75194722d31bc81b2b507ccc0fdb309e59549a874d09239bec5a41c4e9bb48d6968152ac9d431cc3b290371296b8056ed56898b272b948e556926478291cb0eb1bac50b6718e98b74a1777e685b7b6d7cd6b22bb5846c69149b4e7b292a4153763b768cd5a67b65c3d059464ccc123ac086f9f41c3395a56ff3152fe149d76ac2fee2079653326bdd82dd6f66b6687a7fbe00d9832b09135756c5819b1f66dc44c7b32c2496f63cf077ab51b8626d0918030134b8384c565f0715167b21fab697e84c6838a71176748f12334078c27dda3133bd44abd69bf631badb5f2664f2857c033102ce8284e4b2beb9095cbb40587bbbf457054f4d11bf938af207c1cdc5217b0e9797bf9ac88f3943873c8b66883d2ba5ec7e6696d50a69ba55457853bc526819f1a6fe09973fbd19832312b554653b8441e5eb01884e94a355732e3da645eb849f520bb2bb4327d560612852152f8cba2f77db8d21922da08e60bb9e3b39b9b85bbeb9b1715982d292b8f1017cd3e60447278cc0257898575a0eab1408122bb3fba17b62a31902a567a0821d42086aa6417c259a1dbc93b25003fcdec9f6a5507b4b732a43c444c5825a05119cd089fb2e569f70b4d5e6919faf15d6eea641f5a2875763f42b3991f7c89fe473cc057c148ac58b6c88dce537da8632c10ac851f8916fb7b6ce89ba5053b8d95d29ea5d36c91981042c4aa1330aa098a6ab256ade08592a05c95021606adea0ab637824214009c2b915be450a1f7434ea2c7f562a4fe21139c2652ca8785af3208f4927abae698dd435e90e7474556af9b907f6d73c4ee64897dc74c6a876eba1b598e784b8094232dc62bf1119ef764bd1a3bb2d4fc7de069273a223abe5269a1403873087906db164b58435ef41d7d78b36087062419123c8b1d54da918f34920d3302ddaa300797b32c1c81b82798e421ab2589964334714a75cc84548031d5810fd87890a1932c98bad37c860bb15663cc0e91880af1947b8a26be9183b648b714f763b81652786682c210301852776aa673a1fde470afb56eb0b0114895638c609d8d55585d68c165f7aad64c1406a165788c3364667f0a3c65aa300fc4585e959abbc5e1b316aa108a1cbf703965a74475147a2d323b7295d185571000e43b9120b76fb0105ee7a385965026e8f8309d4badef88b433a59090f88bc4eb4ee2f6c1f0d880057b477e628bc35b023a4c9ab682822556afeb32b6c9088e35c107e2a43506c43a986a0420f5164167519c4029b47bc81e93c1ec149e6083b13589bd2a9c64fc6247ec323b8cb73cb9f9ccfb8bcf25617a87a3c2d8b5158ac8661dfc789e92cc33e5bf55f1b014715eeb1340e17172a3414c573732bed83d3318b40e32a5f4fb064a8988dba93c5f1aa8249b1d0d0393ec765cae519961c109f607306b8322125b0eb6bc000a061b2222b58faa86fa706e27803b02b79aa4e9b26e37130cf14b903a70bf042f4d72c091297179f3a1567b1cd98bcc4be1c38a75139df8c422769289fa73562a8429e88dc60571e933b22d8a9471cb7bc11a6b74e0b62643574f91413e9913229584dc8936016cc5f5560a044488183a53822c77f5b26ff9f2c289e7c88795301e095efab2b84f90350524549c855dd9928dd735a0da461450a31ee2e3b285698b5049000b58344e393a33ec7b114acbb6c69ee40b62b986a7a70a6bda64ac03423517360df820cc2f5a0e279b30fc77a41b220d6ee3ccdd4802ca3447d5065dbcbccc0b3a79e932c1225acc8c02c906c49586037e6a16c5b6c64e6e6c338937ca94c77d9cdab427a258804768e739ba637725b7f98ec064b645e23710d50e1a563719b190d8127e8d8557165a7e61770008621b211c1ad9f004a97556d41511d2a8a290490a0f6b289d3c35cb8830f5f6c4d60b9cbda14b50677c210b6539229d44c7376159c4d4f4b7e1557e1a25a51f6456bbb983177599f7f1ced0b15c751b1046a1015b4acaf53c8e43c7ae7a14202a54a7e3037027fc5e8736a4d7d9145a56cf65b862f03b3a9848c8c2704295f328a6cc83cb17774cf20f9db1162fe604c77100ece175ac3a9f3f297c72b7a3efda073fb6397e0aa8fe60c9e5d26281699c911632d055434ef4792a87c96d17228611828c0282ac82abc3041fc902c09a1c918fe20a0506788a31cd01583847373db827b87b7c29c519ae2071185910b4f586be80488ee85a31c63857fe02a11bb270337b6b92a32103197f260b0929e289f9c9308056a7539394c0071df82591428bb8a2b734db430074f9749da3bcfc46163c3b5f31430e4556b91efc1f62aa912361209746909eca91b40ccc815c1274762b9c697cb7659dd200a29a641db2404b954a1c17994d5b3a49af157f7d645df88863f145734d7262cbf8a640d2b31e601124717c6f456db325b1b4b344bf3a922f624df598756f8a2c2acb0c4e62140ffa4cacf4c6e03828ec903acdecada6d0074b2364057584b3f0530bb587666a88d2e354ba68bee404227d7a963d8bab4c7545b95a984d117ab3f576fb1ba4e912b468889762009eeb83949d39613ae7054d9c76ea556ee4a8286bb489e4da9e4bda4db0714104da37fe1777adb632c57020164331bc29abeb356344081e3907c467657ea53a1111d45ee2f416f945396e6c63df328575808640ac5b1d5a711a5523cb7a18263224ae615840f9c448274409369b2d66b135e57648f07333fa326045681dd20cd9bac300c834ff582c1be9223f427bfb13731b27175c1028f55736ea50a7adbc819c742c22328363632f1917cf5c89441b841c3532693c3718a1fb693b28c103ca3ab9690502965f907b82cfdb4e0fa2884ba7ce8b0768ad36a32ff60b4db45edf64a5d02018836a8230c6a2f8a037b72261f4436b987066bbc90f65f2c940635cdbf1b4c5a853a1113c86010bb7b558f9a773cab0434399874e01afe167908045c34d3f452196000000000000000000000000000000000000000000000000000000794a6406d252e3b08bcb62b3bce496a88019d6769334ea4c56acad3af1c5da402e8541047591efe1847559704339d0ddba611d0ff8017cdc84e61184715c93e2 +ciphertext: 0b52af120747b8cc02ce11b70f30e159c9f3028f0b44757f23deb9b62ec75c61d64dcc774729b5ed59c23cc809a88d075021e7799b50024bd9ebdd3ccf710f17dfa89423d20542a44a97ab3bda0bc0825f76f8f481a52e66c344c024d0350e4d28b49bed05dfa166d8a5ec175e43a2a535abc6dc4decc1cb9afd9f05634d5054fd7b4c17dac997a70798c5c712b276e56e2af4543f9b9e5ce362d2f5f7c2f5af150c9782af88ea561161a6e5892c6a7d22a367dd461971cd801e9c5f2e2fdfa70f39550d06157e66e0806143fa56d5a9667e038d0c818b2be48de10408c67c948ec5cd1c543fc92d76fe299af65f94edd82f0be2ab3cca31272592549699555dc08e1de7097e20b83fe3eced16446d90f79ab46ab702804cb3a0358c927b7d126799f52c47e613a2730680713e8056135a26bafdd8a9e38d8c30e628a090878037da0afd82b9fe89a601d3641b6514b0450e3792fbc60d3e78c7316301b2e3dad4422c85b4afb1d1af20de6938a1d8aa2625b637ebcec8754ab5b66aed8b13b669c81f986d158cdd9bc82db0eaff8c80895d9289e30f0595131bb9aa1e77fbba451c1988117e2ce8b4e3cfa6f0b5c00d894753a9c93d269d477b1c86fbfaafb1dc083c7ecf3c688b36b4107a2c800f17d14acaaf795fe9ff913f702d188a204a26a3c301e44a84c5e32e9c8efb7236943849dc442bba5552fb34dd7e7c486959fdc8df5d380b199a9d637c1d11091406b3e3d2ab587794eafef76f6302c1356813109acf1dbc7380f6eb082a2e5cd4e53f93dc277372230997a0858229f9ffec2691d39f748dcf1c911f8d49d281bb9299582e1dabcac1119a7bed289a1d5ca9b471542be7e5bae58d275061eed3ab92dca9e444061d641f3e128d9d44757b350bcf673de1165abf6e10f87d101562eb6585baea22583fd8193da19f15bd88ee614523305e2d996b04db09aa3ddb422c7b9dfe93237e3c85043469916763bd58132835795d4c6d01682fbd877d132589ff21de3e4882a927971ddab6e2b31a01f3c32ea60f506bab44f8ae74cbd33e551cd7d52791155f390b409f169f2fb2166719265c6d4fab72abdfaf530842ca86e6f2d6a04ff0c96335ea20564f6328f4a10caa1b9ae6a2873a966e2d2ad2819f3e398a493d878bfea76b4372d2b24b93edc9f1e2438ac6f3fcc1944ab99c3729c3526bf1069b866f7b630c5b6ba7e10696326bc0096aca3a6e526e484b8161716b7377f9c5ac7401a850374c3adc7057d0f783eed9c98a3004ccd529a5f0846bb6cecf98c55470a7b55d3c1be06cbe3a3fba17f118dfd68aecd0ba783cc7489b7ea3bb8fac98e70c1e8f047deefc3760dbcf6571305eb1cc3f88ae3fba08359217ba391c1990d33b89174a5e896d655aa36909a4fb65495651ce122870b5e870edbc4b0dc9d72dfdb873cb219d1d7b5143993c01ab6929baf37ae6de2d920eeb333eb55a0a32a1a9ed2d4f29f9dca34969b268a9f26aa6c0d8378aadb5f206beb4f607f308ab64a9b1669c87fb74a55f +result: pass +shared_secret: 4ef9b4bb13acabdc211c3e0860f1b2dbb4ad467478f8fee194ac57a869a4a8cd + +# Rho leads to non invertable matrix +private_key: ea53a046a53b7e3298d588b38c403e67b5620c5c73a438ab7357660362ab3822b5e774a9dae973c83a96db79b550dc176f9b0182d37f12118bc96a4982249a352219a110704e4a0ddbe545e4f55cfc2c50d54cac33ecb6fcbb3ac2a7bd4e41282476797a3c24f4ac4f60c33da281cb1313035c9c804d755267894d867469dbfac7be52a34f55c0dc642354e52967b043a0e0167c806581b51519e04af675147578c79f492da3ac0748352c6e5c7ff462008cb42e9817155444b214c3b93ff3ae7d44b5c2b659627a833cc18ccfab4fe6d6513dfa67cec499cd7a0d052a5f9ba378bff75033e69ad053c04b74c8cd756c7cc0bd494129e069cfb4358324066415bc2a4d1cb8401867c9954aa8a33f929ca279696cd515bff0abcb6c8692aa9cc076861e2bf27ec360983f775e9f166964d0c43c380366f19d3f868a7e038752d30e389c0c057b6d93a9ae64746d5b3a146d31269b94c7a753412be68d09d820be6890e5db1ec3eab1acb14cee8a317ee7ba0eb6027f13a540b07c12cb1164bc7d295c16eef4c8d9773bd2d32ead764f58fa48abc2a5491bbe00e07965017ebf40c973343704112bc90849d219c70b028ff3769e720c4599098d172674358bcaa8947ba6b874e3d94e623122ffb3984a0b571632be1c540cc5da45ed1c57da1054abbc4456678249a2589544c3dfdb6330ab35416ca49c8046c9446150660b45e05b720722bf390e307445dd8a3e23253cbf633c8ccb098976a68e481ee86b86a32865d9caaf385842cdd071b0974e807710e2b44c598a4a36bb2af048b0fd30bb6c64a539513ed2a5a9c6cb16129cb88d6bc62389b4846a2a0afc532eeb0f055aa85ce7b43f8099cbf194e664c59e683e535ca809d40f72d4a3d5e287b5ca3880d4af1f1523b60c8f811a17b2881602ec0393d54988d63a1620a48ab25a5336b25ca25d5b21425ee54673062020f065693665c68399691748ed8c2b6ea47b89391e7dbcbb3e4bb8bc0972916aa0ee5b90292b23618c5e9a68bff8476fec1c7e382b1cddd45069263a507c44b97663a9c8b4bc690c89d25893c4caca0caa7633bc66f449bc06603fb747843b0a8ce11d46ca100b3243a8617904a2ae48db08ba24bacd5b946cc96b834491a246850c44a0f049bb3e099b3353b28c3889bd4520ce75749b745e65e6442d970e917362cafcc9cd1a6194d9ba41f29feab98320e10234c1b0fa367f7c3a420052a9ace9a0787bbc420832db814e8f86804fb74090146f899a624ee9739ed55c40b3716724b8a8164b8b976130d89e15dc24e2078f24a953b2781b7d36a12334356a6998870a0128ab5152a89ddc84aca3475f8cf849bd762ea7b23bd2d743a9d3a9a2c2ae4723b5c1a3b5349a2d4bd2907d89ab8fe80624838130697bb1d45f873a3416164f862630e96075fbc5192be26755eaa1f33026a1f201a05b6b57ccc83fe9c191b13016a921532c4558b44ff0a26c864c3102ca921c299b38199f7162938387c3598362e5f616756bb5aad68c68e0a34ce96684597712341f391ca6696538582ab0dbd532c7757b5b24b0413145395123f0c4668cd538782b0f65ecc30b687efa78183de47f53b73831210c513c54febca5e1b4c439d04b5c35913283bdfad965fd4749a9eacd65d1182e83b448bc3d8f25b525d57db01394cd2b99fcbb6b3140c46c9685916cb4d572a78f59af75342188156fe6b991a7780ad5366104630700d585a6b93ef15a8025b8a32c57681ffa88c1850fca4b65928970549aa668477547b30afea83bd3cb6efa038e451688d6932d342336fa074565775680790404770a520b0845a7a09caa5ab20326c8db671541305ef9264e0074505804ca2b7bce041b69c20d0c67a50bb46e57cc920d4405e4960ed1b20a14fc8fde1626f7607a77cbb9e7835f1407b83ef53c66e3145d764cd297badba3c290957180f650844c31feba01ed2631cad26057fb610f302636500e3337b073e33b50fa647eda24425021c5c1c8eec6163ddbb6419aa3be57bffe37cca885b8456652f7c00ea65c78d2db431a28883577679485611a9cb77f95339436787f1369110203ecb1859fe49662bbae39b6bf736266e1670940780db319c969570c719499ef871e87ab61cf435114551295ea4fba96ca5939ace7a9b712635c09667a2ca87a241380edf030abb8290d1856b520aa75e52fcd3316ecc31a8c71136480c41e7c6074207be522155d66a70d73c913a62fc4f77202203c3fb58171706d55455adcf115314b71ae00745764877d44321df625916a5eb5a39bc915a7adb5c16835817ba9438d8772273038abfc29104909da051dc542719d19007a786189e2cc9ed9268486068a1a531c108659ba37383a9585440dff07116f4b5fe9b1a2dd73320b2051216009a498c2c64b59aa539244e487464475918075ee807ee8bc9bd413af46f80717f31365653b1173693f1c5992b45770c515323c74296a0ef3e8b52be344f1000f22971ac19233f25a4c0df631a2d2b14fb5cb85d6ba9c55a5dcf42be1f18f9be91134a64c57a723f02a13d2e4029d6baa6d0aac1dd5cd6d483c3b7bcfe7f69202d321d4423962a304dafb930cca0671eb6ce7a0754866827a94af22b26985e264af1278cf481193390a2e870b413884c3da9928caa8ea5595a4c4aa2d4a6f3a9956e87c87ce699f04640d2d699a4ff314abf653674b351c69367a7c6041b87aaf8a47ce07857244b71c16112db463dc3239c3908bbf715b86a2b7edec09080c1840a2687c4b57854238a2555d9d2469e798cfdbc6ca06470bbe3659e1949df3f8a6ae42822c8702271029689b4ae1573b66f5541177ac5e05118d4364f43c79d5d2cde2567811617b06965cae7491aff33d5fb4bc24fb8a69f4c0c651cd53084938a56e792c29d941abfd448a38830f9b482b26fc0f5f8a25a2c570c51a62e605cac0a0b19d3b3d5478bc879896a3e01d5e6a97a8cc876bc96ff3040a81c87afea285a35b3375d5b8f95665c1bc6896e46b09d4a5b13a48eda54cfb168a74349887a93ed9e5a1f40a5e37e2a97823a2aa7c5cb028a3e30b19d4b94857090a3e8276ffd45eac0240dde5a80f46ae14f184fbc29804726ca50462ee2583cb92953b22839a27aaac963013b13c1d1847130c96371202b8027f3df427b03119e5e57284f4751ee76cffe81f315932174560dcb211dfa13ee9d242dff22934550227ac0f59698bb700b97bcc95fec45cc65b12e25663059565330c000000000000000000000000000000000000000000000000000000b2024fa7dc204dc572e389002c78d0f96de9fd70568e31343cc05c95ff1aeb8a5ea63afb095b03165e6f3b9488778fdd771036713df7b893ab8777554eb05f64 +ciphertext: d421883017a28b1b0fb5cbd2e19168a0405633601a3ca939f5660877863828dcd366e6602ebc6b7410fdbdbb148fd9d9b5f803467e0bf26a4b3c84f2f90aed4f64d60ba2862eeecd9bda7f4ddd0c031c231f5727a9681845774573711afe23605c2aa64a89753f8aa0c4b51209c3117f111b82e70aa6c55826e12be53216d299b1ff18d2fc2c8c207131e462d614a92171bfd0855a2319ed6a4812d6385a3786a39b489405fded21cf7a9e5d581900c3f04a75be593d4ef5955fd7419813f65c3d672a8be0cf12b42f19d3775a489090cd8cbd07f2f5ea5d4895e15c53737f43dc934d2252873554ba8f50bbbc4a6964c746c34541eff210290c3b128129b2f8d7e033ea6c945d666c4baf45883fc724da572265bea46d6036f029a7d25b9adcb0e88f290c553378a940bd0425caf60374cfbc4dfc54879b95f7ae4331a8789c2086dc4ade9c580bb8eb2fd07f3170cc5306136d715600e05499fe6940aac16f82759065a153bdaf51335affd893c296bdfad1ba11fe4b10b49c2b2bb54444b613d6b5c4fcf458ccec4ae711f840c5bf7c75e4f808e5da7d112b735345d7b7cda8f6aa8489fda2790d096dcb9f8733c7f589ed047e9a56e4dc0c5adea121966be8a1215eda38db95efe2ffd6356209fabedcdf2ea4cad4b0b180ea2522d98cae0f09f793f037dbedd5f03d12db9016bfd79e07726cb575981da69f88a8aa5d104e90ea53ab57fe27b291bedc7acd5aa4449053a7ac8012fcf9899bfc423c0018e539321a986d4011f9beea70ca0e984026277290bd9373da79389341c90f1ea64de20a5415dfa16b7857df261e68d515c497dae0a6fb5b21224f0b2a3125dc3fee9395316d4f269154f528f5bf3ade728f8cb9d27147751304ad1239b955c911ef2f61f0c193365ed6305d4c0bd97c9b2f70e3f5f60fb9cda8128bd7cd6e6aeb1e7909881a6a35d34df4224b0db7631df1a497a0dd699a086aa8efaeef0e3cb582a71deabab97bfb77fcfc2067652311604d56ef3999c34b72793323607c59febf9b41816d03a4db06afd9c19444abf09e1126a5cb19842c9316718d3cfc48e52a0181521008cb90607a18548c6521520d887935c0d789942ed48e68c28905b267c9493e33004056ca159b823aa7e42d9b5104ccf165b0a8e8dc19a3db59b415049b1d82aab62bc6f2adfec2ae128c8b79c0c9d750ebd0517b6ed61f8345aea60c04968896da13f84224fd92d9c56862adb73c0d5c3ee8fff1c05a4586446f0a74ebf39898adec7f07a7ba97c138530403f2523d85931e406d476c8569e0877f73aa37cf41f0448dd2ebc89556e79bc9a081e7f34586cd7cf2f960ce8156a3e500e63fc9d652f9af37bcc36117449b06f67caccd7b9f94782d84791990497761d503d07fbb50e1891dad302f20b16bad86e1e31f7c03a9172a6f079e244314551ca5772d43ae75b4c3e44aa362f9a950c7007a7e3d9758f8ba2664add4e37cfbede8066068b449a100db9e35386da603f7abad9fc85d32090ddbff01052c1601 +result: pass +shared_secret: 96b7761b785b1423456e7b84f37464eac941840ce73cb0e5903dda9c4c43a296 + +# Rho leads to non invertable matrix +private_key: a7d40e120206cecb9458a1464b96c447db086780708c7435e40bafe1ab8cf26caced91b888711b8b95414e080c2be24d7a622c2e0410fb9c795a25a50554abe8b9049f9890e29531cca88e4284a5bcec559f939061b003510c8a23991cf474ba6676b0599c86dcc0976f3b61cb624954d3914bf28e109193ef1b9efdacace8574dceda34905485e1a79d51c8ba06722150d8a243d69f671c18b1c2a77c990699b72ef5b1c4aaa121a8e5a6cc971178127024166f2593893bf3b9e0db273040b0821051cab28af5196b8937538a680b39251b08051502c2a3d5504f78b767dce91e2116280c3532e9426b93d8cae3e9abc5aa4832c6bfb02a71559bb689f82c22835fb314a5e6d44bc4085eb39ab41555103033a0f4b6aabfc5246c93c07840254989301f88776c06c9f808369e18445058b4d940783d57b7d7901b0d63a6e6512b31a63ce0704028d936462c18eb4bb78accc3dc56884d9837d8632a258c4e998cc536248aacc62f7b9b65191a28a27a1cf44a0d512875ad5112e034c0adbcc67edb84eb000bf3621e7c1c5cad1cbd06f848c5d8c3601b07463b5c0e33cd260a2ec99a972c47cda74229f6292221391f37d20903aa76eb6966195acac6373a41db78b8f7515a473ba04397c2e94a26a6acd8f2cccdc572d4b60e56880fd0295152e18bc79699feb1a0b6f6c7ee19545f4124eeda5755a85d79fc2dddd2848216576e9ab4d07b7ecf77a74937cc1605602c62003dd5abaf601b55ab0cdb37bb3110290f829a742c5607ab24a50000f3191f435427b5345ef884b91811bc44fc4c6de32bdb0a73edf80c8783a5a6b6a2d06657b16104cd62ad847206ec1b87729260e91b2afde6b0f13a87025c10bafa88e1fb1a66b98a5308a2c4f10874324179a2729df786627271ac5a945072beadf878035169c543c0b07acc49241b7feb406f524b71c787ed757a3d48c233bb75d97c42e03b9973cc680169520e400b00879cf2bc9119325586719f22e1b2de163184b2c43735b2c1a8654c92138b90c458421f681136e0d6c417b20a5f8c126d3672a4073942855b127a87ce96c7e34861923b3ea9bc9f0aa277746927f0777814862b0845c3bdc12309241f387cc6f4ba4a9688b947ec8b5603ce88ccac5c35756d0031ab4a5e32f6ca97184df2acb38f724fee64a6a688c69f6b913576af98ea2487db097d7c81dbc2a29a381b2345495160c348e8207e313929dc08412304f6a01c90f6889e23b7974bbd6f081f52dba8baa716b53769e6f71b962156cd44a3f50563efb3b65741aa26e42a3720ce737c7a7ad5c875663bfe36bde03b106647ba1ef098569bc10a0940cd300d58571dd354ca5ef714733bafa4308b3c4b7528862664a8656d16c9c3837355e39072db20af20025306390ef32931e793e33333cfd893c6227215027ab7ba9cc0212ebc749abbc62be483b3e2406a5ca10d7fc534166646473c27979053928aa5445c4c1c26cde40777aca39f5a64161c322135fa176d44b694341a0d3a05de662ef0e1aced53c4ea2762c1333da3f987fac65ea63a17b55c3f681c568d648966eccd095928f2e32af2fcb0674ba3a50350e282c99af149ab1b3f52d3b9f838b1aa8cc5a58974c8174cf998b681737830ab9132c2b925ba0a9dd7573197a72997cfc9fcb9b7fb8f7f7b881b280e43b1719fca705a209516981c2e88a617625beba7acc5a2335aa57daebb02869339b907cdcd2c4aae01a57a58702fd0883732c9b334bdc6a9bd8340bd83d5b0cef4ab2da156ba283005111360695be97576dc880d2e2a32a9e666070666e4f46b14f2a52d7006c94803ddd872b02bb31ca08901c42834d95a79fab04d8c08bb2bbb0348261f8426cc16720fa188458a4224b92dbfa067c3b518cd74a639119555844df56c0cf9023259d97fb326c45067c18adab10a881fbd4354f348139613b8f5e911b969aad197cfbbf4c1e24616b8f0b87e4206e2c46201b99da006a3c8a704ffe6ae36e3a7c07373dca58e1aab2bb6cb62a3ea5a248450df074dee89511e837b66b409061abdca119d00047252668cab621d0ab82518c66d41d951af924cb6b0189f9654a4a7b58359bde2e5ad4ef729e3d35ce95a589b237f03d10604002debb248e80a93957830c2a06d483c9f062c59b7313cfff647a80834809a3f6198658f792ecf9cb679a53ed41519b5b91015005cebe8b343d16928b9480daa3b025c68c8e9cdb7276bd588c8af8296eaba9a6ff44ff257a4542077e70a73a959738a48c007544d7fab9e87d25b04a01d27a8473ce83a6f91b3c8c9cd0493c35aa01fb38613f5d1932ee81e8622ae09f30cf5394e6ecc849fa881a555a1c4a7931e91100b7b26797b643a3a5773648609b5013f565ec161b657c653de89266a34aa6d80b35450bcafda7fbf1c0aacd8647508bba9e9b2ae6675149a9e042b6378c76335857f0bdc2b2a93c2e23b6f89d743415b71371c9e61f4590254508da401b0d8789b66c6abf2bc31a8560f988586301f54d6123dd8a4e7a41e9246ce3cabb721db810ec54ce806be4b203b8ff6574b397f8e933d930c23f6a128f1c17f017c2c2b22bbf52b4741a8c2198b6a2aac6836c09a3dd1115074249e26180c850567c33fa55b9a23fa365cb8c425eb5523dab4243b3cfe3a7fa7e75aad3b206a32a11282774745bc96c566b05562a6696efc789fe8989a6fc218011c4cbf15b960401b4e4937c752aeda715ee0e39225494db1a0acd61c704a62bf903cb6219951fb568934f2bab9595895390eb5dc3ae6e32390a942875826b453b42bd32045c5cd917a01e283812ec0274de627c1061a8208c7ea0a4b5d71004c77419fd080e662051eb2692d7676c5f319f728169db707e4b9c538f9c7f3d823a53199fc9a9f27f8a183d62247529ad152cffae14bb2d33e15dc669df777ec06600723a7da656f7d4463f0694e46649fdfa1446306377541aaa7e3948b83b7b39522e0eccf544859f1459375db295a879f97755b40e514f6a22d90f20f22674cd071a5454275af02c461152f79b8a247f69a56aabd6a4275c9757ef708ba492892473ca461730bc069a5ed103eeeb21ab5d5b96e868f5b64bb5f18174710bed8108742c25f6fa5b598a81c8a509454d8b6b3744a0e85a64ed9c5855c3014853d4836565419adc67b6566968c2d82bc4bdc424737894f48c19f60079df447b82573c2d28ac4bb29c9272580776b43d21474e52e09ac2255b95e3b3c7ff02442dc47000000000000000000000000000000000000000000000000000000a3db11a0e8a06e78944c960e175fd62f4b32871e83ffe837b7f34ff75f9ebe588bac5e523fc2f73973b46b1727891a6077329e10e94acd027c9dfa38ef4e21e4 +ciphertext: 2363ea527c82054080a7e6dbfd16d3e96e07463bc44815397c970be5db84d68b72bce2772578c82f916b29fa0ad068e9c383bde469fefce18c63557db19ce93f1c302a9fa6d1d39faf7b4b5774b045f825ef9139cf113b531a12ce15c7c24393092eb886df18e295acfbcad1ad8edb5d20be0a412afa1857e722a20c2740d1a3ba0b101e7ce331933057f0b1cc19161344c87340f2b78510dd754395e6368e222bfd9413df061a3be812022ce2da08bc4de3bf6e657a3a80200e51f82fb098ba9770178dfded93c3772c4aa610648e7b5b330ea921c1547cae8d2a0621afbaeea92f43435bb40020776f529a7754e7f318f9968bb74057f371eb11013daee9cf8128046e492517b16ec8722d993b345fb0d0c7eb615d1e558acbb39f74e08572bd8ea2503a319767899889196a0a42f26e7434e359594a87f0fdd68149028bbe8bd26e3b912e95776884e83dcb3da50659c54c7f49832996faa3de449cb61715b81f75887529c7e8e98f39eaf3af683b5fbb150f7dea6da5867e0aa9b2ab42ba7ba42fcfdcb076690255d5ea8260c7b106738a63e887fc6993ad0bc93d1e6e9ef893981ae0540200ca393ecb5f7b90394dbf15bd33afdfa499199eb2c3ccd93a0e54fc2211b705640e87475c24e5524bfd5a80fa0ce6cf9db8d263cc203e52e6bc5891755331cff855b04c98fae0b416c61a8e38f669619a44b455752ddcc94fe1bb5608ace3029ffdf881e09c49cd7a1e397efd9f47c2c598c624cab914ead90bc50bbfc5c1aaf42362c48d4c2feb42f95057502f30a1a9d9baf49199d05c89db7cff332c24c7cdac1c3317bb884c4ab041580d3c50a68d3444ea0046850473ebc5bccbbac4f94de8dcd7453ee15e001242214cd26548bbbbb0681e4169223a7e0fead1299152476e9eb86f2a84c08d5308c61b9af960374f407e0d49af22d871a7fa048aa386fa83bdcda6bf1fd27996d597802595cb0d85360ad1717b9900b3f6d68ec680693de41eea73607de43668e55491b9e2670deac0ea38fc3218fb4797ec037b5c5075f7a65bb958a8eb551de7c0886f8d5056c1711cdf2c705be5d879d4dd45aeb3d514b09864333b6c8393fb37c4585018c8ed0d952df661c4808baf4ee3b2a93248e0ce1ba65b04d2ba5e520eb2520039f76c637749751e504acc792dde698b04a4b0b9e2f90c98ba8beda3c1a26c6941e509bed0d4b44809e27c982d1373f89a6a5cc60c3e4042f6182fe28d2d1a034f21ba4a007fad040aa2e0762adb6bbb92a218d3d18919714acc77ee1c281de78743337fe9a0d788d9993b91808f7aae1e88193f6fe8422c0876d225d724bbe5b3967f0fb2c2e4e2aa98fff8a8d82be444b840294f51fbe7972dc8b4cdb701b733b465002c1e49fbdede6f4137a2d4d12235f3f9e7726ca176e4229ebf382de8210a68280ad795199ff82740c5ace14acd100cd39c29a28bdc49a8ae8393c832416f52dcae1f3c24c5a9afa613f8d2df09eccfa1194f39d69cebaa778572f42b1d8537c9364cd165f05f +result: pass +shared_secret: e02c8542d46fcd5031c0efe0464fab43d07337181fbc4ab3d58bb7bda0cfd7bc + +# Rho leads to non invertable matrix +private_key: 610c36a286cca4815c657bc2f28b854aa8602890bd6ec2700d64b495b50d049c5963b8294752942d11c1d0182ba6704e54c003b828bc58b6ca3ee0823607c3c00bd0471b4df571c51db3003e4cbe6166c0caeb747f79573f5b8b80d12ca78bc1d3e01a318bac91fc863198afb70cb9256a330faa06639caa7ffcc1248b367bb6b0bd905ab0098b79b85ac5dc083ed43ed8b248dbb72e5ad962b3201c92b132b2961d9867b48208896c11afdd929be2792839674b18e4c1e99a7df714ab7ecb58570281ca80a92f148bc492797564682b560f1bfa42b2f7734047cfd6375d3dc05846da1d3511cb3c8221d38226f29ca52b07471a41764f86ac3418a96aab70fc8454d6823f8b7c6211d216d08c67eec474a3cbad8f3587e22670ae5a9938651f3b48011341b6140ba393621accdc3f606b080579197c48967f1c8d11026d8f90b0697869ea49cb9db086ef687227b2549ac689b564326a2280d8384698185afb25941ba0365b0c1939148ed6e1bf0ef5c764832178d47a01c3573aa268e168b740194a9b36ac2580a7bbe1625900befef3adc6fcb356100ddeac4393d388fe647c3d623d1e6a56a96073bec59f5fa39581245e31aa33cfb865bbc28e9f2498bad34a5bc65c517bb8cae19b6d1864fd7a0c48aabc78d0373a84c168f33ff13a9586aa349a185e3528003e804c8cacbccf0073da46567f7c3ee6a55eba856851234b4f3725e1bb3609e50cd4c9c96ff947c4b048dd7c64b3498d23c234e9bc45230b8b0c797946d0980dfc7bbc5773620b8330262ab6247fca5684c9fb8c2e692c3f654099a7a93d0aae62d24eb594544a81431f295bbca7b15dab7bcf728e3dc61f6354a459a120c371030f3b622569a78762b1cb08248a455e0f0847e1531d194acb0507bb53e9c0e13c8b2f45ab06362be3d9bb58ab6d90825a15211f81f4987000cf74355a28ba08443b3fd9d26b70039955773f9f840207f696d0e7a4989c4b38cb23df626e53b7ccf7c1bd96bc3f68c20ba180a482799d2cf975e0a39d5fe863df954665509b3eb63c257b8c9e39050bc4a739468e716cc289a79053453a28906d003535536439d418736a95763ae222c8870b66f1b5a9978c29d238658a3e773063dab55125e851983706c3ec68d7fb1d595b55292885f758a8df752fd3d97a8dfc33a228c896a44bc039ce1a2069810b1304d44522b1a5e43756cb843b5ef515d89c310f442f585259e5d460dcd578cc51ab49e63a7cdc2566d77e6959a7d24150cf0b413d335efa65385ae13b482b9b4db4ad2518b71704098d7481d2233e2ab201dcb4a1b3604149710de3cb247f29ce8ccb2ec062b014708f397482dae5936bec37663c849c9baa9d3cc88146b88cf970e574694af03fb78205e205435221b32e5513989047e62775f1ba5aa89a10c9d35cb566328eaa5748e9c5057446f96cc691d80208940cfea984df8817d4507aff0a0a96b8c6729329775c8d75935d7624cc0a06ab7a950f2b73ce4d90239706403c0651dda56544ea59bb06a99f00bd698a8c3f127fb4a3759317a05ac244a07342f9a47257e5649dec2c7050188ea669a97c137f707f4e5b4c57945f82c1b0b2040476d73acb54724cba0082600ec863a0a0831fc05c3ce85c3ee9417f6c993412227e7be59aacf03cd9231c2e0aa9020c2d17510574e2a1e89a9905722a13b23d3e8561fe37b034916f0bf61aafa00bdfb1321f798a8b0c61062b9835f389c33b18169a156c11917d8949e9f1c8ca2bc0e3803674436f62798295982b6b3933b09378cb837c5ad440cda657c68c76806b96dfa865e0352bd5290b91a42fc74b1e47033942b07632093b5e717b9b90120ef389b8b2c4c7bb324807251b26c779327f4b776644a55e17e4a67c1a3ac2457636a057cb29329dd0b5d0f3295d128394259649e5b735ab80b3738495a170dc9880be07ad06c2a60cb7a5791295e9c03f4ab96fd287097df52942352cc31c9ff50683ade3c0a4015216b28b0b695b2cb62010aa19dfaac2ad2231dce54aeaf75197db12c291568d5a9a8147280cd956d9d67f7bac1296025801f36eeae79a2f71065f01759f68b30d521333baa96a998dd1946f90380174450692fcbc0e56a31fa238cce178a8b50477831f0b203da58943af694caed2cd3b2a6f58ab3ada92cc5a1860e0f9845f5639a1f555a7d1045d5a07b428b5f2db893dd3a80936759b73642aca1ec7b1535eaa36dd695707b89a9062ca107178673ab34d31cca4944642babd3e79045d4bce48c8b7d46c522291a6e81330f1071258219b4245cd5e381686cab8a9e10120e625516c1299c184066a3bf60a1dc8535398c43a8deb7546000ece3a429003982940bef6870be1585c58423f419a042c30289c80b6f5624458ca8da2713c564282aaba77670c73be5c7bf0e58d1948beea9a97750a06bfe472d721bfa1e54b23a35cd5672b4e84677179579a29723d5003e7a44a8e691cdb015f4ad123d13a8da615a3f52763d334a6a07258ff127e15ab23b0f29e3b4061914b8349056d45f06886051d6ed5a6974bc4d38a7282b837f18082759530c20689f838831a937b7ee74d4ec64b57693c72a778dbf73ebaac041c4b846f78585a81971289bd51a3359035ab12222a3af7bbed6a64a856601af10efd0b23e3d06df7d243b04ca8c07a0e2d0b883c997d74fac67957469189a1ac592b83669f2f638e0976c373fa354045799824bfcf9c45cd408343239ed168b8e25b831d2c200be6303e93103a14549ca30d9f8a0e4b976870801d6bb50d2ef8914371414bfaa56e724582d14879634bea15ac530983a996a31fc9578d88cb242b63057802e7bab2cf2981fc2a9aea2cb173b873e1569a73356cef7476b9fc3a0b18cd978011dcd8b6e0b3c0769069dd94a6f39c940f6a5764d8671208271820c444d1c2ade4043677b1a9d7cc04871981838284c85850d416b7d2825ae95f79bb95f6262bea8a37e240bb02d6ca8fb03ef2d221ee818454222c4d4b998cf586d3434024b304b6ca68b478c773955f2933921e882f15c3ae726547f9a019de89b8335ca3e7f74fadb8ade6c061106c335e85311dd3208724381e28cf3636ba7f784da2718e857467e70a6682e5891473002e176adb848a96b26641e89463b488c616ba0cd4206583804ef8ad9ce3668129157077922bf00999b711af0973ae169ce7f81157d298fe033a7d547cd5b617cfb908a8db40cce2022578006549c05c594a8b13ec66bf000000000000000000000000000000000000000000000000000000ee201edabcebc02a69a6e0bfa467e1541791f802226c10be95df3819959f493ae42ed33e0da5856106580e02aacd0aa1546d3df0571d17452d22f186d011981a +ciphertext: 4cbe8e1ceb4f29a5a28a605625ff03b2ab4a82f81154af1731b0b930c6bb04af7bff3d7c2058c5788b389cd258851b6d3a17b9667d12a8fa61ba7c98b573dbc9cedc3e03a8f53b96214a4e1dd1d38f321d7e3851531246fcc1a2a1f937a101eace805aff3877438dee254bb7bb8b7ef71f2a202d36f532f2bb37f236021662f7eb0473be940f1b63f74276ac8c8fc8e92f805119e240b1df416dbb599a1a6055eef456d7ddc920fdf2277c6b72ed23e3b4b77d604974e7c10290214ed8aa9d592c2f0acee64a5a06ae2d95cca227c23e48abec08b22d9ee7ad35b0fa799b4b5f4cc0effada3f23fbf30a50ebef37ef6f30f6aeba700c6b8d10bf3141dc87e8c118d13bf23c9fcc8aa7473d2748d7dcd88fe5c2311d69ea29c6f5beac3b0d47fb5563b3c57277ec69e6fc2b91342e79b70d976c4359c00e0d08733701690dedd6f93a2fc751fcb020407d9d53ac454fcc8e0204da5e9e5e5f48cd7f3d787a95cb37e01f9bf9ee87e174e4367a0ce9f4aaae125a631d55e13e3cef3e6913f3203b9239a9ab31f297b6aeb5e0044d05fe3f620d3494a95b19bac5c782321651443716ee815ddb9bde2fd4cd0f274feb208dcf50e3a8f68971b69e847e21b948394bae8be37dfd645006a27aae0c4301a0801adf533e5229c6af3d9f9196e38869f68f71ecf720e837062e13ff754c72d101ee202b023c105765db30e5c51c06679b8cd504b83525a3e4a277eae5b2e6d59156cbe11df8792c3563c74076f93357917a1855943db2d68d89dfd53041143014142361d1617aedb76b1d536ba5b3ec8bd008e8d6e709565e02fb4eaca108623468071c9efd3de94d0a380f7b84788c7d17a5ff7b158531cd2fdd72181dd98f2c03aa872cb429e6f2f5474f27f6533d0a24f8a78178f280d9232e3215d89978ed0e0e00cb9b90ae09132bf14d9e0bb23e3f6c1a2d3139d912fe0b2dad2adf2a4a06f392db783167a332db072790324f9fffeafb3efa8547186ff8c198fd47fe91f0c2d513a91cbf36dff2ee65234b9ec53412f44c32d3bd856478507d293761cf61b9f9ab82a1c54d9952124069865b94258d29a2752a3c518f2c8407e022e66577281aa704fe6628282896ce6b7e8d642c7193f6cba50e8ac0b2ef48992649dc8180632a4f9b393b6ec5c0ff2ef5e33d5550c445ae9e60ffdf7adaf9375d3111c9d896d8a4673cb25ec0d05d2c8564137998e43f7dd51f7b7a438d1c09e02e6caf1aeeec2819ee801992b3326d45739263b66d5d7e483c6fc00bcf69b969421844a0042038907be2e853d965f26f3f5d543230cbcfcd7a5f3ddcaea581869cbac5828be28c4bf58c45f539e6681091f9a5699c9cab2f17f0862cf65454513977854339a81aad65fa1a631a4ac1d9275bbf46b11d8b62c9417bb2f5c30502665ebae8784f281cddb3dc0ce1e76d61f8420aee5419242dd5e09949d18d3fa1a81307b51b6b8a30473076e8041f46847b91278ce78bba4e7bdb2b1aecc7d3e3bf6c01e61ff59d9e1e9eb7ff7393d9005dd6 +result: pass +shared_secret: e572300d1bb28e65f38527a8007b312961b7c6cb204572fa0c7f53531c6c98f6 + +# Rho leads to non invertable matrix +private_key: cc389888219463a7a5f6c2ca3014accb3bc26f2318f593876de6a49822b6c1e694b7e5aa9140a0765b6334ec762c8bb018d28a99004081256159c836f4f800d0c9aa4a7136fcd89ba7cc1d6a32b23ed181b3fc118ecc60096a4ce8261ea2c0a6ca49baa28b75d1b40215367e6a33a1c177937bf43a70c3889f6aa239e20e499bc7a836694a0bc2912cc7cf211ba20c12d5ec312da2815ef20c8565712b22a927451271040cf4daa44d79705b97993584424e7b3224a5583e5b8eaf640e85015676517113f53a415220fde3638b9c0a38115e668545305ab298b9923bc16de5b9137b30a39a2c8b5fb75e4d1168593a8eb0e067bb9343f1a030e5228bf0b3a49169393cd14f73c2b8221b1267627d80b97d30544b02a4c7bf06099194b2d646596aa439d82a214e6cb9c5ea1ded727c8143755cf881415b6357661a90d5ae759475baa6076eb478a5826f86f9868afc47ac3a02a0e84579a25466a63d933b071213c886790c320416d9422d280745758779635ba6f848440b2489144866e8e018200cb8305b3060926d7e7213089a06d044176b053f3bfbcecac7840dd7844ec29eb17bb2caf321a5b17848c16a678552727a3d70c34f024164b3c4856b0a4ecbc78d345187c6e09f055273bb775078b43ecc534a40e66592b607b56b5f9304aeb048375ac71c30464e979a656f1728a7b700e3b33e5026bf40198b94455d2be37cd65867522b20bddb5ecb7a010191254b8a403f37c4577a613ea30678daab55508b16d6020f074504f928dddac1e8367faf6199715048c96a8fd6bb225715accdcb012cc856a76057b6b72b09a4aeff5b8ba278c54a750596e82bda45be19014e8ff52df181435ed9ac8c402147b539ffd984c291535b7bc8b26c5036352520730195fbaf40033fac450843e808b9ccbf03b40a9ed657f6ac4af8b65b4e389280633d79799e0226b28b356fc2e39f10a80452dc934caac7c3c521f0c5544e7821a403688f08378c3086d3ab8f7e4036ad516778da606204aed3ca1ae8c42e11038a64ec78a5fc5dcd0475429124b5d665e4acbeccca3a296a8e878b917b886ec7f029491c661bba684ac4229cd71373c829055b602db0518a481230345a34a709010a03e4b197273510a0a24465288c327c10c75434d9473208a7964db7792ea81c5fe0c4bd967c3f0c98765ba7d3faa4e6097f09e9bf10638fb900a764e4a0bdba2f19165bd69832681310a7a2585bf06322a3238dd26a4807af44faad999397d4aa14e76c2cad5326ce573d7ca04c03db769dd01a65583ecbbb991e7a31b59238f8741845f1adb5992607184dfa19a9e8840ed9e1622ab93031e2b448860d411a3d239277052cc8ea71046a0b1ada191a020c322d776c6655ae71964d86314a86a47b6a367b8ac5a4aec75677226de0c1864492c88fb70a53187cb76835d5477346646a9da97301156a3ffcc231f9a0da760dac142674e5cea882364dd74fab66901dbb7eaf037008c52073054cc2f94ec845444054058402515bd206d496bfa02c442c746ff3e662b899c34c40900902c4f8ca146458522c6a7af772b2df483f9d840fe07464b0c66fe1036c070c6f70278e9506342663b07529247b1697f8111cd446cb2c44753cf29cacd39a7c9cc96af28545c40a6cc64f5974810ae45a97380302375de7c95b44318815776f80397c4608cbc22086e9fc06fed87c6c780ead85a8d5a82f0fc2ac28366f229566cfdcbd0c65ab3c112b70a908a85660547719e8304d513912a215acd011918cba5423e9094ccca3ef073832c3b81863242c864a90f1bd9e6359d9c72dbed85e76a926f6a84cc4a4839e5266aa9020f445ae1062b3751a438fec3dd862a8d7831db1c84fdb9102872b2c55b28e6f00623e2a971eb4982842392c10bc3e786a5ef5be5a69903728196c028a0ae20fa5921773f35c296770c8cc63a48844022a32e6d928ef042e0537876d3b276ad42ee7585b8dd38cfb58492e28488b0488330b935ee8701bf05372abbf4bdb1ab7da67367ccd8df4469c13355992a036d0a0eef51045a9b40ddc04c492c784a945e99c2a8ca52b99734e3116caaf2330ff4195bc2776ff8644d4d510f1d7cea4682b1533b4c567a1f0d052ce387237b92fd14246adf34ab4455f97f579d3e746bd97313ce10e4a331bdc8a1974481289000b39baacf9c757dcc357b2ab4756309849881289d66f7692a084dbc9b92b671ef115b979b26a8873480977ee621faf6b6a506b2fc2570ec44a9d5eda9d46f2437749367eda6af411ab661162ce8809e2c6999cf26ba5a37fcfc009f60b7dd857bfec86a3fe095df844388c31ab44c26b090c4afe58052a80bb39e614eca3c07e7871811b19b45224e7db6cd077aa4dd366b6755623453fd29b42af2732db855e0e829a9b51714f362b083bacc9e68eaa8507b0127b40227b9de014dcbb93b8db567343c1c1807d5f81b64031c364210531008976aa1daa866579aab9a6e1baa049624487cabf044c0e576902373ab2c0ce00f22a0bb61b38f98f4bbb5bb4018f6ff8a815d4338447bd133a610ebb10365276b2d0a473281c64e8c3677741a1a0c360a8797a3a4dfa06ca5bf50658600de1175822e27f187b6cf7198b8427750246b8db6653e448a16b21ab2e343ed4d55287341155a7b1b9d92cfadc26e138c3e784c03bcb6e36a1acd0e0ae04d78cef528b9636ab4fbbbdec0b7ec5e3c94c808f90646b7f833867b654fd9415d4b971e67920432103d00928f0f3af9274bbac2c5a7bd7cb27d2b1318b840b899257065026a576931735600698e2d49b136c641e080e034544325780fd683ded1caa11052fd89b5d18869f8a8024d4657e4870ced241974d2c8f6194886b509bacd5ad2ecb8cb2850bf55200d2226602a640e8812eb26a4cc0a960979ccdadc5b31d98cc59283df09a6c2d5b7f6ab703a6305709d10cd968826c6a019a264210c699030804db419c5ba4460b25510cb43e16e36eba7b74449612eb73662c79ba481816598045f601be5da995f02229d5d130f6688a57585c959c69cab00e462512e6129afc9bbc5845c9714a3cf14a1061b46139c79e02849b6114b80a75828cc946a5f00096a4a43d065ddd5897f3756d0bd208b4f8685d2a165442c132a74f78da6370422d0b01b812c009da680ae91ca0fc56bdfa36a32a6308c8eb32ccd23ed3eac3c9a029186a73c8d63e8fc92a5dd42905198405c76a2ad92f9a21a2b62b11e8831b4062425c62000000000000000000000000000000000000000000000000000000c7251fbc2a67f5f93c6cc8351988b94fa564f61234b66064e5b41eaada415781c975767ff083234b2979bb109a24a27bca17d170abd8d9e6ad3c3ba19e306bce +ciphertext: fa75f5533fef3b994435bcbd3d2080030cf8b04d5773762f1ca6fbce54d86af4ec2f36fac7b3f249f4bc11cb376b23e70a7ebd39da39d9377ee63a7c02105ff9538d6752482378b4140266f13faf8c7ee695dad10b590b40ed5627ac417e8399dd398cd7413587f7d5c530801c6c3d7a33838cd42ab4d4d47d263f4e1366c539319faa0bbe179e069a4880f928f7f5107298b1bc2bf75e6f9d135cd9c96e8fd1483e3f9211bb73fbb5623b9ce1154cbe01797b4d69b9940c20d4fc5b1d1e103a9fde78aa11310e9ec3cf57bc2f41e3296c42991e03b19938e2c57efe6579c192b66077b4da4a7bffb383d23d7315ee81794f2c4f74c4349904190a73eeb1eebe03ea314f708f9f103b2862f8a4a05aa8aaef91818e6deba42b60a9957e5261e01f7c68efca04eb61fa7ff86996b69a2d7e293a6407004bebe90bb481daf560e446338ed6ba259e1d0910ceed2afc7dbb520629e8cd92f1759803bf0a598ae25254f054c4551009f9f331d24c9e443b3942ce662b28c5dd5a6f082ed5aa2725ac7a9e3abc6e57d9d8603052015944ee9d6d55198a5fa9d9fd953ab5afb63eed2e0e6d01983a8e2dc19708c404ce6a7092f2761b8dfad19e0d4dc657827756a99932c88643c6e3adb0d272b9cd877079754fcc2e60c5f222d7c751914621873edd16289370e246bf6e63ca7442b54f7d6198c99deb20e635367fb3c187063713d4a6059ce5623fd8203a73b62c2476605107a64efa177e435b5c7bf6b7c36627e1192a00d6d376612bef6560acfc270257ea0b561af6c2e4738207d60197dc1126c89ad7416e45af6022b227f9e1c4beedd248c8fff802675e21b15f06c3aec36400515c4bb9f4ad2e878ba4eba2658c66f4f38cdb2c73e71de1796290133857e90965bd334628eb83ac769cf63fa9a59298d089302cec86c2d10aa03c6d620a1e735176665435479ccae37a168a0827d7f4d8070d98065ad0bcde435c9e9e9d75e71ad0e40d061a2dbb2a3262e18704649a14310e545e8ce93be3b33fc442d437acaa3b5bda4f770f5eb60f56b0fbd0e9a4820f3c464cb900be522928d9a3a29573b07884e19da158b317fcdf047a2307d0066f16a3a4e389f0166650937ff1df8c4e637e24e2d50f4d2b731e7befab3b0c33ab81b4b031174a61be15d992315464f99d292696bb1536ddab0195a140beb68e72eddca6220d01d4fbc77ef3d743ac1dbe06450614d9255f13e60417624dde40a25515f19b52750c1fabcd7f128b472d80337c469cb8ff95bbd2875ed03efe8df9aeb677146002c138edb668a22c1e1b671cdf636a725de9bfa9c0e12035939c8136b8da4792eda4e82f29d33bf3f67954863eb993e51344ffc4d144d651219de292bef3f3763e2aa061264b11016b6bd4586f46215eee237b8b616a260071004e253c7e1424d01c4b71bf53e085f93c6917a028e6f5134e2c04bc8d9a371083180c3d95a709bf56f79dae2be4b1df4db2fa14b075ca14d0cc7875fee90f8ad2ef73fd4bbfa3422475bd9a7b8195 +result: pass +shared_secret: 0749d8808bf77c517e622f26abcf23f7c40144b37bab16c6605ef1c97636689c + +# Rho leads to non invertable matrix +private_key: 078bc69561af0cc77acc291fcb063e1d7c82bdd7cc31d5b44d1aa746e261f2a592d4aa9165c2c3755aa457b886cdd55840767f4fa0b19e45410872cb1db3b8b5829c4ce9b2a8969330cb5bba2397119310fa072b7053b35fb135d04977b9ab4766c4c1ecd9695957473f10c679d71d2f6b57db2ab0726022bfeb10b61807d35447a141255bf5b3d0e3bbf5cc3ae74932d87268e172978d78b99daabcb16b44bd578f6dac130c2528fbc89ffa94b48e6785293023e2605a8533a5ac17c15f34b1e30501729a78d3b8ac6e4a329e1006e0c0735c737283856d7cc7663cdaa1610b1045b7423ca8ccb59ca6b1c482dc02ba117c17588809ef8506f09a7162720142e397c6ac0f8fdb02e4c1c557050af941ae8165ae01d9228f767ef1ac3d72f27cf9a2282a6c379a669d01cc0a6c560b21169557b88771008dad62641f435e0780234e86c1ead05f14c0ad68b6b1041492a166bc4a278b0d352129556d55f37ef8969b596c5e41f8597878c8c6c83de675019c022314215eac667a7b559146478a4a5634ff193f6b83673072643efa59c27650fec168ff17109577083bfa8493f38301528f27681405693345e523ea4398055606d4ccad9df967fe59428ca7502f046506756a6b9a78182383db4baf05014fbb20afaf148456126fa393abfc480edc92465d93aaa158c2a8493882b24c564b607cccb2c8f6cbb43abd722c74c2c63230946acc091c48b865cdb33edb712c670648b07c06691687685218ba48648fa3054ae7a6a663aca6aa4e66506516100c8f2caf9c0645f2554c10c480e798b9c96756e42cc8a7f626c2759d21555342548e0490420df3a8124b0566b1804933b68225359cf66caa599c55573b70d488d16185496216cc09090de382d570795efa569aa5bfa8f4a60665cd30d63bb36cc5ac050310ba9bbe4b3af2f9400296bd344cb72bb623c757366ef1369c968578eba52a092dfef34aadf552a63b1495a5b78168cf6e58b218a3ae64310d16734d5e72b2036bcc001ca07533085548809bf114a092225aec9cce6950a953773ee37ad3467bd5ea0b4cc4c6b0695a774781ce17004cd48e36116776db19565367c92a94488ccbf4ca3c3960524d1b13d6f77399ac625de5a2d09954cf867011f79bb4c3682cd40f133a9d67778a24d7cf1a5b71b7b81dfe335d0fc392a8b12b234950ab79cac94776ad1b713e99b0f394aedce739a15334f19042f4861e739c839ce07da145808260b159625b5a742258779440953c743c591659b9d982aa7da028c7eac4390b47b243ba23e8ae4fd9c98042a0c2d25a6688c9ec774cd7e95899fb7f081035b0c4217c2903688ca7e4466e66ac4e3ca938fd58b4d6bb732a36aa8e097fd75976d1200d61a5c988c12702698b1cfcbd93157d3d1c6e76d316b00b4e462588bbf3c480d8374df3cf66a16f9dd2ab721954e02a9f8eea4380c381da230f10c2c7dec02b057177e157cbd5304ab1d8160a323fd5892fe1649c2e270dbd3777035912dc0802f4d18a56356b52946f30c516838028f7f39cc22466ed277a5adb6864972e1063b1af0709dfd60136b16a3d6c863a68895677c488eb1d879a69a5341a695212066ab848609cbe3317a86b5b613c6c4c869dd552a711040a0a205a6a9b7ee5c7607825a76206b3db25aa6a0960da259ec279960a5a947106b51a299792707447856085a12397e60cbf91713a6c4bc56b03531081b0b38b0866718c53bea1220f3e5c3a59c74f10c765148c595becb9aaf0ccf2e429575889b462bd59678f860a5e501aa758674d22842cf65a3f8dbbaa7da061c54073a92cbed742163df301e3675c5ad96b26b12651fc9507b7361a8bc0cdc47e7f38c1ad80456ac3443bab147e86924ec112adfc9f1c1b81b478740b752d030537c817a727451668d9ba1fe092d5e116c20262b722b6f895b78e3622c00596ac8b5d4ec11b0413635e85637ecb9a87516cb8c46ef2aaa6fdab62860160c4b29e23f921ed3a381711540cfa5df115a700d40c38b99efb870c6ed14f2261b17ac21900a427528cbff423b0ecf29c2a901baa9c7ae3d438c145385c73b0961c4e9dd5cb48c2ba247a30b9691dd8fac963a5c46ea44de03274896c8f36e57f84dba494c473af0a64d97533b223a32f8078d933bc6db125c2e7a779e0676e09648cf6b85c2968b71146763b7082ca2fec33884d6704afa71f5723617f83737cebae33b95be2393cf1f104c093b4caf26548704490b4aff5d6175ee4c7a3c0718436bf996003039aaaeeb18e92e341938b7a71609082b18995aa042e628f18e8c6f67b67770597772259e0e7b1025c29ea809beb994483a6863d038f6b9bb814a5215d299ad0b0b577d70e7c946be6c93ee257c68b1653ded84761b3a6104814a265988bea5a6ae96951f1bef6f53f50aa78c1f655dec149706ccc561a846d9cac61a339c3c279a290829f972a1931ab5ddc4893f71127d1a96796a24152a5d56016bb5c9d483b9b4346a8550784a828a3b53573e61104b6392d0bb246b8116d8f78021bd012c322c8b0d8392677afb40b36e49c0211449a2bd841e44b72b25b11cd099bf4ca292af2722dd9ca2ad3c36f4377ee54986b737a6a0b87817384ae9964244b140689b2d2db0deaccbe9f63b182164b89c932bdb22e6127303044b91eb76572e19785747e6da01c20318bc8092a7dea7ecfcb638e0584a6e00ccf243e06c577b784704c3b448e22a2b2c9c1dc0224c7ca798567b1c5f3a7ba660af4028387f2c573a52a28a3449c26342f214923e3932f3bbac2819329b83a2e89b78d93afc3c134be3c5fb8c67617666c22c71c4cb99063898f65b41117893785f376d2330b3b5a2fa946374f8a1a2eca1645d255c2a28fc8d7734fa10c67979e5950a1b5e085e2d52763326f3dea8b783297d509333947b9a47a9ce9caa0fff56637a54ffa6a00ed942e0d382ac6c834a7e40859f58d3ae991a9e359e91530bdb75c5568330236149e71040dd9219f5c24cf35c4e6a670e0719b2e738969f509cc55bfb6ca08c68c28165bbc43598ebd9744a18820b5947f0b41a311846588187c0aa669843bc6f4620cd1c62f1aaa90f93b7537828b42f59c153b9ebcc9ae1168b2ee7b2f10c062bdd49259024f4fd51c8994acd60478cd3a00593c403a3279877801d3c88f65b7bd83b76fb54c49bdc8af3cb4b2717741bce1bad123cd062211e74782f4620e9130a9950423afdc98cf0519a643a265e4c6ba4142557d000000000000000000000000000000000000000000000000000000d79f3c29a80eb53b13433a57b98af3c8beae20850d72d14a2e8fc6758d059111d48790195fff2c19f221b7cd8637576cec18c29a4a51cd07c82eed4974c36e8c +ciphertext: 0d6a627804b6e54c49e39e098b20c978cfdda91acd2d5d883111b0fe855460e981f041682f419dee54cf5b7f923c2017b1012f0b3233d507ed065e96ba51f92f70a38aff0ce071110bb0513b22262aac6ffc1287c63c07f312ca2310293a56e85e429bcf3b8662426c086f388312513825888762fb3aa87a40653de37f48870ae16c19ec088bba8911e944b41a8cd595e2fbb680971981b5352a9032b28fd3bdd63ea4a72b5d999d6fad88e19aa84e5d60f173283f7597b682f4616bcf532ae1cd5e9e5e231c6bcb1c9d5fd0e50d54c53ec8a4f1162696aa72c02a6fc97e80686886b84899a7ad7a1ff6468031dc403dfabdcd793bc31a3036d5937f5af337f806001f4ee79dd889e72f5585636205a3a906c01588150d73571ffaffb9775970af6c98a17f1a6a6a0161de795ee20fdfae34fe40e4423012dcb1cb918144225716dc32c6d9d453a148f3a5999b6df6748a97429ab5b8c6007f2595b47fb52030ffaf99735f22657fa8e93f31238941436b76088a72dc6a133f96f0461eab8ad3361f59d4539090c2dd4b05ef665786de899af3582a8a41400b0421c6c646050171f6c2c8231e7fd295f855d2236f6b17f36cd998b47542ad2a73c1751883175a71ad2695b7b372b71ac8cbc2729ab1f4b76eeb8187777404ff81e46aa3a246cb0c9dd3b7fcc443f6a89df493b64e770aa8507253aebc041587b3b9e365688138518d2e84b635c045c9f7e50e62fedc9a42344bece5e21e05c52baee9da1e5fd50ed674aa83845343894439da9188a149b04d7110900fd3a6bd950be022cdf91e6bc896125a10e64ca3e55785aa5ee668e42f338abf50690c61cf19481b1162cfac86b4f8b8800e3c65e82e94e987e37986a3669e401f199021a98294018a602801c07b51faa641a34183ae5a101189887189f072943a712f74b3710a98ec0a992ae4ad1d4d56a508ea3d0762d1b004f399261f2fd836b97740f4d96e3a939ec8854b711ee358425943d218f92a7e07799215ea2e4e097448f7d75e79850560fff7695c4b3f1266f60c430b602db4cd75983e3e252c541f5d39cd15253441f76534cfa94017f1801797503b9d1518fe4857a27e79c842cd3909eca55ec46d9652ff448ae113134c7d24a506987875e9aa17841c9453ff951aee63372957333e8af8ad72ca7e8bff5e0372209fd0bf11881475d0900c643b42b911ed8da750f4d0afa53d13c749bedd5c69a006dfe44a736a44232de96075b6db454644ed3403bde16116a670d7e6c60e03e25a72711ba7b17e5b65bb8af376eb71df16f7d48af1a903bb6eeb599d8acd74d7990053b39d4c81887411927689e20b51006a582fa0c0416299c850e75a81fea3f4dd3d3985087fa7b5f163827c89c2737a86bbdfebc4240c166acd4fefdda881f76be78a079295033b10b5e2bbd9590e3354d86c2532e43b9d1ad7c66766d2faf2877eb0ad087fe52fa1ea1a0d5661872735badad7ee15754168059d5f527c6b188e6dcee930e09718f6551da8475df376ece9e890 +result: pass +shared_secret: 951e3d8eecad130865f9f89c27c36ea8d091b6f3c00e35969f92bfc4f91d657f + +# Rho leads to non invertable matrix +private_key: cc4a14e75a6b1bf87f11a240424645dee23657db9819ac274780c2d7d8ac64f2cb82530b40a078791a2ae70aba868253bdc3045b6254c4e29024894cd13723edc7461a37403609b48f79b8e8b1018981bca9f68031dcaf87528a6b065d8cb83c142ba20d68a728a3866ca88e6836cab209ab49bb234312916e432fa51152c763a62cc53da61480691b07a073be74aa6c2b88468bca8302a23d1d6405ddf4aec2f88ab055b18e2b1873862af6539ca83b1c270b6a563cbc7a220cdc8106e6e5595d63a26c0cb86ff11b48066721634b43b361b57a5b4ddb2967d232d34cb750026b362cbd20188260c6a856e9493ae09c462bc4c8663c7903112488b06b2a996dc6668e382e9cdc93e52a1a368b07d8388c9531afff0cc4c07ab423bac717dcc888e213e3a75d69a633f49745bab10f62592f59d53ef19b6a62f0b24216aaed9c91203b7ee65b9d097cc1e2676deeeb576ceb4fa4a867ab7310076a912a41292c658e8f75a98603612558352a5b7beb404fd2bb6de18c7ac838464b6399182536509624e1e25a7821b71edc57c35541cd115ec52c13a739c3de231ada741274272383cc78bc9869d37282f5980209543c92b76ddf99c3d45cb7409b5e44599b75412d8bd122460905c250a94dd4052c0b0a91c9a906aa3652180fba9212046b4f7ad14f7c304780d553f19487b8b7413de732ba1296b41a2d94983d4be93e540a4a4137a030629e97fa640c21ba5b7b5537a03a2a958ec3a888590a5c14a904dd74c83631264644cc6689a245f833530124f7d10e2596a8be227f270941faa75300bd731c145f781cce52247418595ef67c94a170676cda269e51c7ddbc63b6765b010aa061cc576696c84345c35c491d3e4626efc8b73dfcb481c11bbf8c79c6a3aa4e54c43a44141f5c35932486320567ce37adaf5241bfd8c44ec140d30823b58223b02742f3e2bf5864756d528ea36348c1c2293d8ca050b6307d71a20a036e0060697b58a0ada53eee5a6990a9cfe283436cd36a02dcb1a2b7200a267c3f133ea6423bc001baeca953515214e2766f066cae531212dd3551e22bbb1c705f21753ab60a70f364bf1949901d9a0415a36567614c1aba2dacf2c5435b4ee66193c5e461596719790aa792d5a09ac474343509ee36ca048751bd4b0c644b2b039b1320b2294df814b419c3ac55541be5cf4b93593aa4c099142de9e13699a40709d70070aba9227b6c14f216d434c9bc16112b8b4237f838340a5c317a618a91170709bae6a7c13cf96851f72a8761736c452df27758afa4b02fd55b3493b1bbf96dfc45ac743718978b7de8a017eca45dea633dbc417f856781c856c87516429127c6a3d335f162ace0982235ac79ba0ba68edbc1eafb9ed7a3597ca7a612a9bf3ef2b0d1d7c238e98714a434b8b08b35e3885e007501f9bc06e841921521d47999db3ac3937468a54b95b57a2bbe34aeb48ba57f0744021bc684456a8ed413b9192057eb77a5502dbc89c5964c0383b4c9034396da209279199ab5830abe9386b2e811c222a6ccb0cb23732a95676fd5c0376505943ef8bd67a95defe0af7cac395a743bdc3119b1a74771343bad21c53ec80cafd7548ae310293027d62960f486c7d6766d95f2b7296a07c8c7b767c1057548a18263a4366040c003c50084bddd31af425b261083ccaac26948ba1882739732bcc1e73685b52287148526bdfc47d8822d1d5853c9447b21f200592937b9229b471646beca2cca630502e167b7c861d03cbe302600c6e1806f6040cbe518e15c0eec4395ec1a47c44c8456830709a3be9d05cc5cb3266f616f9f8a7adf9b2a04bb623f801da0c8c0cb4b45c16282c412c24ab90c7471b554057b6c0623481a46a0aa53dc167c15ea8a723c81d9d56691b060bf00554548c34f1c603b17b705a72b2c3091ac134d192806635385a5ec9cd28a3bb56b83cd2b153e00b66eb58d8580a47e696aba9abd36b19b3cd47a0dc4ca2d6b7ef106a3b94b349c665b295433f4ab8711a01e2de8295d58b20eb2ca49c23d595c96c874a2749087dafc044c0b8bd5b340ffd12fec07640099753d4c993fc69d986210dbeb95bab40f6ca0096ea866ef216c6b2657600813052886452c130e7c925940564918a5266531af820d0e69c10471ab3b74585f2cbaa1b27274589fea64b2172b4020b4619b6953a9d56d022c7bf937650ee5608b15988b3377bbb617c4016c1ea3a7afcb9665d995eebc2b0ce76c38a0b6bdf9436ad78bb97852ffe8a618f3c82dc4afd81c99a9512777094b12564ce1a469cb49045a90aa3d2c20fdabbc5bb4940d30360f17a66d58b7a3ba7920c102ccf8b30f03621ef722776b2fba0164b3426d514104a6689286649862b7cbd84011008ba69c6148201b576a7b4b58a53035946a0af9646251b8c1cc7bc4c058ed8bbc53c91ef74cc06e1c32a211ac42570b7a7181f23552c762118a9c0f4862687a502c232b9d43224f5fab525f6186332969b246082c44cae7236e38865e4dbbcba87c12e90b2b970097c0e307dda00d7cb98574915a03d25384d4584611c837e19ca906a80868b382940d909091527b0bf261be5ac0a9ea151b8979ae46f2453b420d5b6b1fe02605fb8bba1e065bb9506e1be7c471a9b8083734a110aa6aeb8340338b14aa71189cca4ff01777e7a251b7a0cd1cba9a9a7b9ff3953fd9c87f5b043f719f692a9f4c7352a0756393e50f0592cac59bc21e198729f23b4500d0e620bd02222a88c5688ac02809315cce210db4169fdd1312c0dc85baa25f3d48ceab80754987553fcc7806827441b590cf9a8d5c590b2e00bdbc9b4ac3d2883f6cbf9e047407858b99ab6577a66b498b0f18628d16a389a5f5a20e1b0ffc228eef287a36968ed913b8fd74a34de23ede7743da2311fd10c46eeb84c38986bca7536ae8a3a42acbe5dcb3fe9432bdab1f3d1226a99148d01219f3e68f68d7a689e39d7502b6e13b665cf0235af1489bf4ce8619624eb4509c7639ec411fa223793b4cbbc990256b390fe23a2624977477428ec39835809343023c1dfefba3aef98e7aa15ae694861ad54e0c74a6d8122ab181c9d23397902c99b0dbaf78a463682294a2eacc1cd36c8fc1ad2e282a72fba0bc179520ba2b410acc977b9f2cdba3213175204568dc249571c20fee0874fec364eaf210ad31b6018c2d841269bdc95ce753cf6a765af4bb9deba17253985277f71d2563a585a7573d31c87b80913c0a38d3905a41de6fdc4700000000000000000000000000000000000000000000000000000097e7e324c2d12c3d0bdbda0ba8582b04e2ebf47f5ecee9b9173053949f6ede27a9e4a0d3487b6714e18bcc9d1daeb3127164328a19d5cf60822f3fd37a24bbed +ciphertext: 068bcf0833a0a08f1a1c9128e6575a62ed3f2e075c4444f2b4584b18e4af26b4e84f16b697141c2b000847dc2916b8718608465198935e67d873335d065b994e2946244d3d739b1d31ee6b8d54c5bb04fc9d7d6d22496a869e5331d5e293a712408207fabc35004b13d3ee3aca54200182249642c5e9de88bf5a489cdfe6330170c0b2cbae18f65043ee306db39d333344c37fa76ab05675568a5dc576290abac1d6f28f6ee1d800a3c638b91cd40cb02e531c88c0a3328a176f872386082f07b4a782f79d0b2cb2df14a62e3db5a30fc753f25db235588652c51b251685ffc1090ffff37671384482d4ad055f0d51a5f00c1c14e67824a29ff8910d9e9295f633b6e8dccaebb2da47cb628a246c6a443b87981453e4ec64e7d0df499f026977b039f73d5edb354bdb536896f35a5431ffed50861551f5e6114da8782d3e1530858e516fb623dc3c0bea0c8981bd3091af72555ea18ba409bfe2419a60d769999d82f7bf588be754496143ef980a3995daa51e370984e212f41681fcf6f1235871389fd3b52e76537b84af594f5405fdfab1d90c79a302c142f88affab1f4d524a139ca894cad46f270270f2d8024d06582492fd1502a65e7b70ba0941dd957808206ce00c6be60d8fedeaaa0149f17ff0b3b775fe59317e769024c91ec83a191cd72481e3d90361a4dbf59968a33a56ecde8aa618a8046e0c021c6954f983b489bba80d15decb9955e118899d98c1df865355f5b9ffd97c52c097474704088cd2dcc01f303ec675d87938d21cacba1fed2483e144bd6bdfaf5a9a233238313489e1aadb82a060390adbbedc55050ff86f967b4b7aefa563117556c4ca5ce9ec3db571b5d2c9f5fef63e731c86b0ef3d84239641fb082063ee3c3756006b306754124f9b964dfffe718c72b93999255fdb3c4eea7907a8bfb5936801e799d499269226df5d9d3232b5bd5dba5c2ad9b03826b961535044dba6640b7da63a9f639a834f7311e7d9ec4a1591d041de4f080416acce59b2f1fa4f4a7654368761bf1025a2de5f02cfbc2150685f3e457aea26ba25ad3b828f9dc07d33a55450a0f0c6fc3898dfdd7a43488ff012cca26828e5a1dc5a0d605c59afcca1cb0c76b3c20524eecca2ba2afc939204bf06adf3a5c0a809641cd83bc1c5991c9d16696a4e4e6462ede7953d2694ec9ce865523b1faa9ec4b8d5f737ab31bd929c45ad6292a6926e1c62c7d48cbdc6c6e30f289a539feeaf84cdaf23330c37c97de3ba6dae06b737e2a51faaf0363a961cec9aadb8c74779e242572fece99801eeacb7e972931da610b75a3ab2f7803b8f3b9460f1ad39385e9bd1fde1b46b676132f5590c6cefad5450de5c52087f7f5dc79ae1ea8491dfb8b2d205361eecd231f3af8d95a12da4ece84d6985325f4d948eccfd42fca19014e7af568175879101da556d615b3f4d81e0a4878bb32ae24eb4fa91334b214b379f6deeeeca45a89ac0d16d533707ea5e4b5e0c06be84656e5475c4257eeaa3353d4444cb88e499ce7f5a2cb2 +result: pass +shared_secret: 5a7f85e2ae8e79a1b178cfb5f38cdf9e240b9997584fe9c432fd63607139f08e + +# Rho leads to non invertable matrix +private_key: cca22002e0b84e0c0fa98c902c2a30f0d9303a411db91a26576834d4f1645c181bba750c42ab6bcf401739f83fe2a4a3aa1a3f5917418003aed863875fc044dbc99c70b27758389fdd3cce51d5a13b21afe1219f0bab5dc3b15952591e6f80068b30870ed644de082476e7b32d3a531ff8631914c7a5c106a5acbf8672ab4a304afb71b1672cb281438f0fdb1db0f52948e8b0a1422ba10ac5e0a480e87bb844072e7a134dcce36f27274775fc6a8bc611b2a33cf85a4820e18b47b24188030fcaaba998d84a68424c07f4503abb553ec33b4be2af3557aae2797649da014dd0264d00ce74431e46f8969276b24b359c6750c5bc15a6318c2d06898ec5f473380a68302a91eb562fe4f10596012e5efa83f4c55a19912978a6583e4a884e36af1b9367e69ab0566c3cd8c34eaea615f49c094bcbc63d52a21d74c02462cb0bb7c77cbaa03df988b60cba880771a7c179315a9f6ebc6e9b8c90bbf17f737508b1691ef1952363e9499b5007a9c84838c2a149478e4be76c0368a8220b9a3ac68ef6560dba6b3f68257b6719551d83c38f73654fb392af0c1c2517851fc160c343cf826aca2c5614726c774c758e1abaa9ac04ae0742799060970909cbc2f78ca739c71bf6528f0695ea6175a4ac13555c3bcb9920bca3a37d363ba622666e54a4e779cad5059612792d610257a689975fd664dc5081d5ac4586c60e99b9a2a17ac612e5a794ca4dc097a71f72bce02b4907d69d801a22fd7b88f9e4ab284076037a0f6ac803bd7b243b835e51873919d3b77de041bbdb9c2917338f0c42a54ba6f5539d60e827387a9e7c156155d693b85701b53278139b29858785cb59788ed981d77556d27390285bc3f9408cbdc717895815d31641d0c31f2d911515f36743c40f4f3517432c620892149b518fecc80cd2d14c99730e0c940dec155930dcb5ef861b7c80b55c2223f7066b625c9fe5f0cb04f0bcb880119de142ce511affc01d483ac8db8b73e504b242315533d9c02cb64d15445fe32bb0c8e19383f82854981a9ea465b05c77cfd66d97a2b262bb37398cb4654a0fc8146c00b7608f061a216b9becec17f686b93d88309a7ac04c2447030b41ebc6a95fc52466d36dfd461bb046172f3b83fd10bf79c281202a60aed8467748a986100b97742c8d70c8de523c1d700489c391096c1b92654064cb7e35d7b25f29818ff39fa523c88bd69b8cf41689a414288c492f2a83f7b34a4d95770e6144b7731057c73a077a471e7b378fa48464c426ce5a6566e7c862131ebd5a1b3df013641a878fd702d167ae3f369361666514d98f325679c22aaddb56406e148e744960ee1395866acbe095542a6836571959a80238d037260fa053a52cbbc2cbc035e78fa9c306ebcb61ce33422584009271835ac3845524794f18bd7e1b4c034832fe68ba24a162815404f65c0af0944c9789b1d92767268c801a0444fff50399b3a192131e965523bbc2c75c286c96450c3f0733458bad7831205b1b4841a617626b4bee232cd1f220edf53b59bc213a055d956591fc3518a1974582f79a66dc8892ba71ccf7a5fae1c01841428525c32dd2b433445118559cb5447e3c851a0cb498cf99c2d359999fa396029b98bddb329742ad26390f48a7c0f624c336e5b71727a4cc29c06e1a2968d864e131b79e5365dce048453ca51bd8718427a35c63ab784ac5476627ced945b656adc438a5294800b6b62f62320adf193b198998a845954a2488e0ca4154a442b0012d44b7b24fa5a6f03a8efb739ccac77b8b54cd235ac65773223f3709d0cb8195671f9ed7b324a11d920332d41c9ae0c0c30279721c80c3a2423cddac9311cbb39f7512d8859074558942504d9c087d9524bb21f5cad2826688e5bb86b91c1f120da1808a654348fd3ba11f3b20bc7612950c392dc27cf6a4aea8f47b841645d4860cba4b3a865c46c0f259af1a60c43141f548308088353617bf95427fa094389a3a6d2df6ccafc7384efa1cb0ba2ae5a2a8d89335d1eca833ea026f9a08c9e2586239aff1845fc5fb6472d0056770a0cae059d81812b8c679c502b3527ab21c9b142f89bc4092cca0a6c20bd1a22c29b773b2aca72ab0a9922d85a8bd676267e9d6452235c270698c5a7a13a1640e5d20c1abc844493ca3634c1ca0813e7f73532388c1e059c414c24bfef16654850f9673afecf630fff9c3aa0a56fab46eb5cb436f4ba94f046e5d57a2d1897680631128c42dca353861a7aceb79267a48b429539f51475414c66bc66a1e8155435df18ccc2993d5e93642354921e9b2205a6270e34b4622c9c69915ba80c9ff994263a11c46a95b8f5c43de1c5221b0745fd2ac0ad5696e5323935a688c906aa2050f89881d3d21605c9564997b66c6452e333cc33ca839db53c17192796e9213b0d7a2ed796e7b2842d9aac2398c3ad11abb5cd342eaa2c6468b70130a5b8b2aadfdf08a2c39732708842ec03d62f60c59b28b81f726f078a06df43faeac927d8c52d14664bde5200bb55cfb06478ffa9b62db67f07565a5673393a388ddca18b7d7978f338d93f37d24a38ef8786e3ed14109421e5884c18da611cb7b62d745323611ade1527fd841a4f3e7122bec4c81609be78b1e1aa274b06193a9291bfcd88ad0fcb90c69c2d4b4073f89a733729d3adc79ad93138b8116fc05b07d7ac6d1645e3a7ca15569b1fe923115133892279f2da7be3f96a3a4417d3b929fb4d842ac017368bb461dd4673da34583f71dd89963718a487db15dba89b26f57b5843804f4f77467936157a504bf106fffe93b82a5be0396161be988c415666b1a26823755274310b8c07d2db27b4e0a7f62747b37527b4b3c87c758603adc3b240a359639634480834de99a6efb12cee23625d563cf969adafba20feb785ba71a5278cbe18a112c673e3332575fe982c6fc853ba675a610357dd2275aa0c6ebf3b5a66a38d253b13b8a21170647c28a7397498d9473c463b7b4762939af5a8dac0066e9f14b8e7534c21342d4c7cf4b539d766a350d882b70c29bcde61f854aa75d427a84780220278716eb8ee1698fd5825cf206a0797552e2f18d3ad062d283719dd61d160681d685ac3004c0c9802d78ba41e8404436d8563de6174e911ebb16a4ffe945034932f335467b250bd95b1d80966aceba882f2858e2011f9be167e6e3c70b234da466a28f8140c9581a9755b5216882f0d43bb70751ffa702eebc7dbf12450cfa3b542777c35b96077cc1cc2c5fa7ab00000000000000000000000000000000000000000000000000000054a21826b02592023db2703799411b54bb21a140a3cb4772b53669afbee98aba53f53a49ff45b0ae588d417a63a599670cd391c5e9885c972593d09350bd7523 +ciphertext: 9d12c628e857d6fd5a1932a879dcd28bff777cd6132e14fa17480771b09c7f325a9127f610aae2bacacf515132f848a943bd40e75b894d37b55018284ddc5899431636325a5e86a79222196fee72545b368cc998059b0d88587ccef6e6eb833d05e08123f9b18c13ce6d456f4995340e17a26a9c3eb97930dd207d5155fca9a160e5e8c3f8b7259637721391d9f0787a34af39b136f306400b4805befbbeac25eeb533678b6994fe71ff8691c85bb2cfaea77efbd0299415a4adbf6cff3f4e63cced78154525b5b3d21cc838a5c89f42a1f7c2e2847c8cdca0351c47c1a6fd3e0b20d2d24989b931e1bf6f9e3d015a1fd3deb195a959a44f87b168976b71ec5096a92c0708d96ce00930abd77f4dd101c64106671656f668a07934c89353ce8b27e76007c7d7aa159939210295ad05377625b6dff8744332b834382df6ea2254d523f415928831a46077488f925dea5bbbe4ce007852ea26353de810a78d79be4da1fa41546739b74ae5153d692b14693ede93e2e5248a9244a35a7b64acf95290d1547d6e4e1d63c653a0e52c83264d7349d209147c97c9971957336f036c7195aab3e80afb7189542c45194024e349ab7f62c9cb2983e238a8c76f4c5ad6dd07516d29fec6f38579abcabd1c04005c4106b22c45d27b7786575b15ba00be22d752d6dc7e689aeb21ba9980c63476e742b1f780e6f9e220ab09a5952126ab01a59277a52ba8159d3f25dac39df888ba0e920cea9cf8d40525f79f74766f62bfa2478afaee5240f30a106fde661789d15780bdfe17e15cc033e179735f1de3aa82089dbfcc9df71253bcbc99cec3c5cf163abdba2b8a37e8321666ebf0639e9b240a3fd1cdffd249b8e0f04228ba21b777b8cc76c1942656ae9ff36410564a9d776b82f1e61728e71fd88c1077fa74d08bc2d5cf59b82163e122bceb5b05f6bc493ee02b111af667fa67bd0f7464d8738d6e1b47b282e83f3d83b1ed5c32e1534407c6976e280fafca2dc950597dea6efc162139cfd2bdb5379ddaf6c2d2ce876801bf5dc8ace9bb766be0452105861e99534f84512ecb98ddaa2bd2938e371385deb1623a13900eb624f734cad7047790251bffe4af673e7caa5595138b8dcf15bbea0acfb745cf84e98053ed593fc1103e80fc4ccbdea7cd3049c43dc46a21d68bf194a101767570d6ecf7ce087dd34a526673b6b959a9dd83e809ffe8984d5d86fa9c23c0a47ef11359283ebae3a1c5e6cd9f61a73a2a875d0d8fa1a801d31826ffbe79179c9b32f1ecae0097350b44918242aadc9ecab9bbd1e889a113d9cf1454163317684e0a99318d66f6435e373eec3ad87789afb0f7dae49d2b03610b5db9788e2b3e0c96474baee4bfc166d3f5580c7654ed4b19c325503898b38eb24aa30e4496eceea05954780dd389939b87a4eaefaf86ce855d1d1708660add4c70d30f7d14262aec22a294987b2b850390b799c67ed354bedbb86bb8c1a69e38313d4d52ed2619b3c482f2e16153263b3e6b7863d8cff75fbe549ec30da553 +result: pass +shared_secret: 5e36034b55f986e8e39485c2de5de7f5bc816322c6f36ce00b8ef8d7513edecc + +# Rho leads to non invertable matrix +private_key: 16997ff80976d1506b23c012e387ac6ca0a792f7481ac3c9775317ee3ca5267bc7180ca884d28bad6b5a05b045f33a9b975c6c98908d670550b874ca70a77424e48bf097256434b9d9b96c8b8149f02ba5bde9b813eb2b60f20da4440b4cfb05716bbfd86255a1e82941d2816caa7253e7368a4bbf4bf546f40b1bafc65bb994c34f7337e82818021797a431cfc664699bc22b92561fe3d1cd6306b89a36380920abbb466477549d1bf14364221c10f51fc3f7240de4c99b3bb3eeb9ac1fe12bb7c97888e8386da4a341a0be8f78a7b7c49f2184376c3c3784289a6bd9b6a03a110c228f72939b86c7a87dab3e093c0ade693a0e5331c48b761b070476f55cc45ba1dda14dfde01a011776143a4d29d48b47b0c6cd2111bf18360a7438f384a28d772177f648773b961a86637c946d7981a6b9f571a4c29aad07220fe081f1f18700f3c99ef28e76819f8d7c4c43d754cea21180c43357f3430bcbce1fe8952c691cfe9a7483026386a479eee4025a838df5c563b9f5a1882a2d7209a68d231ee82260a7eb4fc157936deab52618cba32772fa1440fb675220f4610d749a5b3b142f31b404d94d2bd816cc4773ec83aa1445a37b361e52b10960827e94171dce3c12cec80a1ec65aa6f117fe937673a78cd7767dadd3cebe0217f13c903ca25d6a681116b206acb46949b18f671a63fd2581a6c0978738460cc51df3711dc1215dcf75525d30559ab6bc52e16fa513753454888189348f045aee8a32e98cb2dfd708e7d42818115e5c61711a0c43e85a13657aadc24b5b30a04a43cb97bafa433204c18536337758c0db6154d4fac670fa3af148b52f24aa731c31f98464ca9bc975e97fd665710ee2c56b024fb8d7c7f4a20cc9d510f8eac38f96129c97b17c890417a21465d05abca02754ac3614e964f1a24393d05ccf5cb9500852cc9231656ca899f3538df30984475209f84ae8b99983e844b06ba4cd8a9640a513cee439ae13ad57d3846aea4fa165b68c6c03c05c835bcc5a63d45cc5568aef94ae7798bf29aa7f38e275c902236e63872a274e4776cf1928c492036166d04eed9ca64aa16ebb4b11fc3ba802c6b249e4b53f90112b587d36c6bfb0733a2ee3003419026a10a4c54c2be294b2031a48fe895c2c9920b3772f127338a865a82c3262dabac113c235d433b90d401f5557bb1bc68359020f75742c2008c2bc8862416910f53772a55376ef05a5eca853eb1ba5ef841f243b8d98b11e94483ad7e72fd7360a3641159e481ca50971a6e8aee73a0d4f24b25430ccc0997c631308fe2aaefcf79af5d2045932043d95933919b21ef87865b8550742a513d67af756c5958465f582983a777e9032ac43164e552358861a0ebc458e55865fc3545fd01b0e7565877ed3229f8267369c319abbb017a87ca662c635519ff418682af39ba387aa38ec37396b4d6ab505219314f4448d0f572f4330cf33fa1369872649c922bcd228c294b3213a216e59752072b8e026700ea63061855be3d6037c0cabe0c21f5be948ee4b18dd935ad358a5885a0331db2e496995bd47c3ff2b679e0abafc02804b6117271a2b00e33bc06250fb30ae2036716d30a50aa07e45f244e1f0100d7493c30b1c077bcd1dd852cdb9736289bb441013f7132a86664c31990bf601cffb845d39a9a95f4b44e285c537cca542335e77b8ca7ac4037c56822d524f74b76f2a113693a63400334967f9a29008ad53f01921499e54e8c315b47788aacdaae2269957010f4652c48a19cea9b2a32406b4ab4128e150beb10e0811b2aed3c95c89639a0ba3ecb689a911acc463708b733d3b724c63b100f62c1863c2771cf7c6aa215e5848687546446c75a1b3d56d8f07b3a8f8bf79dcc360010fc833056d04a80132816a63122c591cae5a4c26ec119a7cccf7f74db33c8a83c379f8f3cc75e85a8016529157aeaeab503e7b9734c8801c309ac580b792433f46451c8bcc0fab6a9ce7b0a2110a933d62cc55f953a036b3bcd3a9078c01b16bb6f78c9f14aac2949617bd6c0a99f003ed2bca0a3690ad444d314a1c44f1638db6c31a3884823a92a28aa3eb498452895733d97aba3c3c7d26139843adea69b3730451fe75aa74f6a1dc87988012318cb172b37843bf1385bb400018416344a4c61ed9436e142d9a512d63693c46f47e2581a97349bbe6f463e5ec806f2bbe56025932eaae009591ec6260c83202b4574f6274414e998d2999371d39855d7b52544558a0da3456191950f96f0995313bd06ac4371207f606781870244b3994ac91a0030b9b26072e121322c7b3a7723527340606c9657007b70700739b278da9a14759024537aabff70bbad9bc513e5809677bb170d8886b2176b9999fcfd5c5e260475d315445d9a6a53b8c7e5919fbb6209d2112074243c16c783fdc571dc842eae4379378827721030cf601b92a5f06aa877b8070e0b3a44762786645cca13c8e5c84a5010290459a3637d7c240cb8b1cf0c58a649c1b33cbd0c62636707d321cc93960a42807a8a4fa9f7c889a4c6ba672b14206926849257bead619167c8cc7c466186821bbb8c67618c6c0d9064e71519902280534623bac0af20259304a46b0352f0b62707d7645b1ba5817e41079893b1ac00fb14480bce6bc19b337a05cc79e96ca15dc7686b33e2e85146224b96266c8164b4f17ba6c3070960ce26630fc454cb25b51e935c507afed34b029838822a0a77a24bf45e9b9047627dfec040e648738e05a62fbc972e4c1b4218300221ce3dbb3db904e82bab6f207743422b453f728084501ae7b96c26534913568edb18446c409613b3ee4f52af5b466c9ea7af349bdc5eccfe9a510f6fc24226687a9e19f6a925b8653209fe4a932588cd52bc41e48404e369394385d87a5b28b80b971836e3c8929547a6e002d5f26dc4417f0850c44ca3905708aa40556b426b6700d4e9126b8ac7081d291fd7569f0b08f789b8556864483ab668fb781db2837e73c20891928e1eb3d29f7a9a294641696a1fac1c4bd526e1fc73c78c01ceacc4a5b707262307f8aa28f61642d71d4aefd205a5bd414150188fd679636ba5fdb21740fe3738c5bca69ba72d1f0871244b0fd430605253499d351fc102280987956e287bfe40daa05a6d6179ddc75aebe5076f18a676ee71658283752ba79a2457fbb107c1f7b7540513df0119b40fa2342b64b2aeaa21c94905a5c68f222c84ea63e9c0b0afc55bc605a46a8179edcf8882ac203302879a33b000000000000000000000000000000000000000000000000000000b35abc5ac256d7f72e6a83cdf27e19e97e40639a6832eb08f3e534e831c385cbe366c059f5f26e6dfba8db203c5b27beca8fedd3de2664f6bd5c3e2ac9fb3891 +ciphertext: bb7e0dca6eca3ef57e945d921c2f80875556f7786d6bcca1312f86b3bea6d0f0a73f7d6036a7c38c62d4e356961ec6a28d8026a2d915d9721ef815147fc09ca65a3394aa5dc14c08d41cbe932337b9a531ddf68df20b6aea297194ac398f15919830e3ee6c20145c0aae7a2cd276ccad7b5c414212f0c0ae7106333868938a6a00da19377d996c7796d400606007dff30fe554a5fef86944d43ba047a00da5c2c2a1aad053aeafcc75a1e826a417b4c320e60a68e63dd7b54827f5b8b0063a00043f29ce8975d95bd418eb2ed29db0d9263c67fdcc153ba9b5a33279becb7ab193c2f257bd660fd7012712be3fdc2e52490ade145e8e030ba1ee5368791e6f3efe00deb34cb454cbf7fdae3a507261d9fce66ab58998ca19380187e3455d425977a8396cee3442935e24347aed45fba9b323a289f1b98691e35017ecfd7a423cd8d0149432a2063e0786c2f912e1134ebed188511c905a1a9890cd55d496e8441ccf637b4d660d93c7a46c3e17219167c3b4740878ae35766470b5eff3c6b1fc8c30e5c9645a94ebd48d2d40fbd4baf9d822deb26c089da84043340a564e6c311bca18c7a2c868831fbb866d89652556b53297b9c0040e98a692fa536af4c9a7aa09321ca27068ca66c665b1121ee4529cb3e6d899964de759ab915b0d2c571c5aa76cd64df4a4e55d9de59eca7b4379b30f8559db41e804a18b8771f594b9bee3de9ae98a003430aac58c141e6f0b7b1e5e08e27d1127b682882be055ba31e280dbace7878ae60426626ea4c5bc034a9206e27f578edd17fa6c33180b649bc7bd437b2c86ef4e0f4583071f99090b95db1e415d21ddd88a910b1fd10e3a04e391d947558a6619683ae070be04cab88300614839503f088e2f04cc4a7d091af9833a4f957cfdc574b1c994673ea14dce6ad89adebf5130d266c1440b3f544eea380ba245e21651f1f2aeb2b3d578000a87683dec69ccac18b0702d3d030077981076766e7e5f3ae1174eaf21bf03662c6bda5fd209da19ff6792c0bbc5d210851061dcdd2e4794d2c3c0c531e92a2c4a23556878d3e890b65289a6a02530bbd40ed66db3bb220aeb71fcc3c0b5d5b3afc71377746b22ce636dba028bc052c219783d468fac1d4eed555c1b4676705c8d27aa8a09c6fd8640a6f7b6790ff173ac39b5f3c709281df4274cccdc1e3b690ac0a77f7ece34cdf3216d2b6058baf5f649ff5036360dff99334ff06a366785c0404c584f623801190082fe5cdf88f9cf41032681e8fd6b84d127add01d4b2286af648b83fe69aa8d109c9320bd40621cf75adff8603e3da00be36f03ed7925f19b2e913d756e952a9402cd4fbffc0428cd7eebdd7fc7d3b4cde181b16b26811cd53d9f5d85d37c1670b957d4b3d04fd06567ac68d3f9dbdd45d182619180cf9292e86f42bcc213e94900e0c759e051bc0e30ffbdb91a2493913dc8b81ba4c3e8ba0e7277dc38dc91eb2b27823dac71b6f1c47e2a04136e2c0474fe070e2e4bf8e6fc98e73143ead3c5f778ce8a4efde4 +result: pass +shared_secret: 5b357f714a293b6724c0dc2e2c5509676782a9dddb050d88e6efa0a6d09d20b7 + +# Rho leads to a matrix with unusally large entries +private_key: 00208080e8b3938b09aab715a0b7a09314c3d2aa03e900528a209c655886bf0180a0775a1ee133e543c17d7c24407131f0b813a9287c5c9939d43ba2c1f064015c1babc910d1024bfb46a3fbb1ae13dc5d8bb4576787a592495786a53d4c172cbd3b2cac6a2f5ab68fcfeb2a67a997d809800615c043e4bcc0985de9d671e6e0c8b071a20264c457c13b1f4734f234142e86c23170821d068210b29358694d8ff27e89c59264a315b6591d97d90ede633b68fbc36ca96b823a4bc66144b541cc118b0d60a66c89124d9080ae30f44b9f4793cfac65ab8b8cd65ac81cd95de566ca2c19906a955a04047052a699e8a132e2e48aab916278c49ccd1ca0076b5254784a23f7a8c164229bdb9b46e1c7bd4c74639053cad5226c598918687fbc50323f086238366c4ad9172346626b54ce142053de67ce8867cf599587d0a47aff0a7fc113140c18c40bb31e2340822cac294aeb3a02652b424ac9f1008a592ccf70170246e689edeab03dc0249ba59fcc6477fb668038443bf9a743255310df11b4c90a97bd212a74d5142bc6461a135ce7376995372a1bf919e3db20f22c683f488395a95e31ab13aa707c59f22e85d892830bb550395633f6c87df28401865106b5cffb75729391767522ac236072250c6f4dda196a90bbdfa183113c5fe2e31ba1187b4f682399f3c6c0288977904ab445c0c1b9caca030aa639b35029657c1608e3a654cbc39f8f096414d278059a6f56c8c838b1879b00ceff668190213eb15184a57706bd8c9111667f52a656d161bcb5e7cb8ef5beb6756371ba4297397eb6d0c850aac1e01025001b71a874a25e3ac16450228dc33691b3112de319f69ac29f2a1cdf02a0cd77319931003910331a6268f42669f4a90e79bb820e5c98aa252dcbd056318a050ab71f5d60028fc41594688cea4a95b32529c39c582ae828016644faf4b7b1fa6fd9c305807c43dbba54d44273669bcf956c197ea3462a30be3aabb1a6654dc4a72bbae53982ebb986e249d9438d66b65fa15b723267ce1fc1200bc26656d7c4e1839e02927a96304460a34a9c0a22ccf15c7390afed4a612ef236f9d00c22d04cc1dc362c08afd0a16536985f69f6a15d6585c410ac7a39599c683b9e67a33ee299a5000c7e4acde611bd6c817b1aeb1373835a245b916620be6ce8093f88635cfb619a963c99785cc5c354e5d025f954071e380876408fc5ac7fbbeb4c532b1f1be67ebfacac4cf907be9485c6da8da380809ee102af0c98beebb088c13d29830e7fca4dab8c1e8cc87a3b4198c50686c82626c41414d50878f403c10ac905f39a901405b93366a575338ed7d66c0a27c9dbc4af2d217688dc3909db8878000af307a989234174363f3cc35c25a42d7361ccadeca25a484a01967be2a65bf4998d57943759528d54e498ab18514a5665b87c98339c3fc01baaa2953abc1aba78778b26d54bdb2ab69dd705d6953dea404adf8c82d29b932e144f48a2661dc2129e6a2a1bc5242552374a504e0d135e6cfc9fb91a492e443c608c6e5342361aa8205ac744ecf974b667a6528938b6085492298e97ea827d5a4274ca359a1811c71a574dc986f4262b2e29256c4b52c9a22c3f168988cccad7dab73b47cd1ca43c7e036d41c94f8f31a0de404fa38a1da0992933d752acc0407234883488a581e340bf5a8dd7112099259ebfdb0cb094c8d592485f25729e1844870a3d57d63fe9c1295fc2c4a374508f359a7e9b062348c6c807322f1a2dc887a20ff1b8e951b103698492504dd86babc01339f5b0c9bdb01b65514c8df3a61abb7941da84b8005648fa0e5b094e54e56a56e8c840371349820dc3f48ef0fa488f180f57b5c0ad663512467836d6765f6517ebd0172d886430357baec25c709b3abb9c01dda27e2ac7c17cac7511726a39050fe92399e14780e3288ae775612b2c4baaa032af561d0356c43175c6263c5d9cbc62f57194c9f76fb5293e86d9a95a641325013dee98067d513525eb5d2f7cb5783915d0917faee635bcdab95a61592fdb1de202c439dba37a235e3888134249044519732701111385b9c91c2fc96b039d6483c6d1bba2223cb0f612c3f7c6dc62bf64a04b349a0fab73290acbb15ce1cfaa15c68d896493e67dd9a518782b35fe141a4d70bf33e97a616c51193b711b04a40c9634bb62726f748572155667146d311016880c670067c653e9a8dc0bc32865adbf41ba99f19b2dd9ac7998bfc8679c689a05a5038042885742a68ef84c429984588995a6cee077c3a099caa7a5d3761cb4411d1dab8fe7258c75903ef515b6b0629ff659436ff687e6625d2080671e0cbe0cb624bf8b367e780452ea3713804e083aa6e0c7adc15618cf223b3587a364320d56c58be8f037f89cae0be209ded78cbae29ed73767ede6793f0051cd5692f63661a257ccd9d859a92ac08784070bfa7ede4577e7ab1ff6c7b159089b8dbcc5ba56357b2659a7a04c8748a86991b2b775c2015a4c12341ebb419e1244396c233c161495366104b8e29979e571c9614fe10c868db56cd934c5b2d04986a70be8dc25d61cb6f0054d5e4000ef72557b712658d962b1e673a07222d59bcbc4e8339bb5b37cc1c2bbd38780f8233843ad420782b4951c3321888fc3b488897c8bab046f79cc456bba9f666ba261284a1285bf1a9a9d274d9b87788c225c0ffa20388183f35817e5825d450a1eee881f94a5a129e688ce6664021356580190a3ec5ed220b8a5878068ec5cd485816f8c1ee05c3c23ec0d0aab7f73aac249142d8992678b38410d41be710a285d3b593a8245e514a870c3c348fa45f99aacc464b399ecc0cb3c306c273e5f4c671b806864120a88c07caa53a550d52c5641203a7927b40631e21344a9337da2d128dbbb5f97b68b8e57cfbb1a67ca7741c60c2533e49ece409b0492a2e81523e6b6ad655a6dd1870b5de3690de3369c898b557886c4877ad1d67a1583bc70502b32a44afb9b60f88838eae005e2703ca26355ddc479bdf1a93756af16b7789a3221fed9a4e468b710035060752e884c56034b768d0a7106a4bebde7622bb46b6649195301192c498bb555c653c42f6d84883be82e8fa56ea303caac534014b6bbf38a9f73283e5a40b36e36c9d8b1a9856aa7d9913b22c40cb103b74853c53c3ab4ce895388aca8584449fae927b16534f48b3aaf350030a8460c8572bcc527f1f62bf1c5a9bb8ccf3ee66f66dc19286782911a6765c72db77ac0e976a2bc114a1b110000000000000000000000000000000000000000000000000000006bb77bbab15f219641914e23e02624045beeb4d7f4608d5e52063d1ecdd8ac5f11536217ef54eccc82ada15ed86ba2003e177f270bb5aeee52f9436e31a379d2 +ciphertext: 1a2dd390e05984bfc0f55ef96da5050fd9bb03891d4d2ddea46c463aab28fdfaf63d4b2e0c9af992e4f1421efc26ae86c2b296f6851bbe2e898b8bdf4057e875d4a98469b7d2646edb86a5eb5259341e0d14986a8ccf93563bc6ac067f8ff6997c2e7bbd897f02e844f180769fec5af9d6fa017022cb0af622b6e4f7a69d73ab01d3d09067b118d51805e1b6413b7a9e0ef292a6fca18a8828912a2db675f0244cd63d9340aa3ca00dc5d70c915b0061664b1e1d64d3d4dced3ef739302f1063442569efed0dfbe8c019c27823a3aabd865a47600ff9e24f748302bfca1bb60faf4105889a548be9ecaf266d8f02d3aa4997202477a70ee71b6e79dd1609acb4dabab72a38448758d8debf55369c5d3e0870ca193018e0ae6d0ffa33b93e962598b43e89d5978a9d55a608b98ceae5e897363f8a9e253acf8af560c57e07c4c4bde807620b6deb76d581bf92b7f514509446f5c4e4d09430b1855e62854988302c931b9e624644a636ab8acaec56d7673b26852c692e8325fa1b6215f24ebfb388ad1022fedc0bef272c87e10dca97df1e63f1a0e9582daae0f49e30c6acd119f7c4eef59d47443f491df846431cfbd23900341086a304589f52de1d862c26af32095e922b92650c68facfc13892430d428f626fba00cf9501e1e4646e55f5304c806b5acafe100084d7635702139725561522632e7e3871effe883298a7264a411484cdef78f9e721c0e5f3937f2fb7d40bb91620e473f9b97adddea69b3ac682e8aea2513b985fbae268176c1bff90e401a31e729fe8b76d13b5c8c85ed833d9b076b5e11acecbf0e96edcf8ff562255124edbeb5b9117cf486f30d7883aa353b9e433a77ac6912cc8e5093c12385ad926be1d0893afc7e64fb9ec55d3285e01a3ca63f3c07b95399bb4411c3f820f53d8350d1979ee9cc6bbf2d7c92d0cb2fd0a1de910d92589cf1aac29992489bc179676c31ae768869398fda50ff14860a1b4dd3bb2e4ba8b2c87aef7ee00d375956a62dc1e5d548a59f209448e62c4b1221631d4776dd5192154d637217d31feea1c4cb3ef1903b8987f4c184cf3d6b5355ad53c7bd3e0ae5373d9971115698214a93e12b98489cdd75028cf22c1da41096daca95854b35d8bbf7d0d4ca2727aa511eeb6cec5352ed487bd3b00b261cbabcfa9f082ba7300610c6f92725d532a86e00b2ed1929a8be7a342c079835a2285569dca92a808049f170fba39d990884ef39ca511aaf9a713b8d78973b4f4a2fde7ca8b6adbdc5a70241fe3ea7d005b33e48cc9fe6ce5bc2bae0746827e548332adf83f8aa707e703fd688c494136d8dfa50961a9e5b69b542ed6ae0e70ae159df95dd9d4789e284a675fe048585214047f7f6819f7f011141d265de9fd4c04f4ed5dead63fa4c8938b2f42108d263d5394d164b3254294402cbeb48663cf1ab2c296d6ada107e8aa5b505da49af96e1cebc6b302faa148216d38b9e8130cc654974ce299172cb875742e62c32c063ffe7535db2726f65fc8f600d4dbb1a20f +result: pass +shared_secret: 54c35602dafe572b99aedb7069a59c4f7818c860b27a947347657ac1954d6454 + +# Rho leads to a matrix with unusally large entries +private_key: c5f6c739c640b093956cfb9d54272b3c704d3b364ff1c68510b875c8c29f30051b5f60b53f6341082252746b8d4eb52b3f77c818d42ac776ad393072d458a28b186da2b61cf64bc6d8b424afb49a3b2528d4863c876aac69b7c7fa95314dd36ab5f021ba8c575ca458c469409b71b31f3a8e371937405067951c084b6a832ab321642c82f33395b0701e5a677c3c783a47d7a6e474af454c1b31b174ce5285e90608e1932493e44bf48b921d6a58b1b86ec2a38b8ba2a1fe884c0fd608af3986270391d1a42843637d75194722d31bc81b2b507ccc0fdb309e59549a874d09239bec5a41c4e9bb48d6968152ac9d431cc3b290371296b8056ed56898b272b948e556926478291cb0eb1bac50b6718e98b74a1777e685b7b6d7cd6b22bb5846c69149b4e7b292a4153763b768cd5a67b65c3d059464ccc123ac086f9f41c3395a56ff3152fe149d76ac2fee2079653326bdd82dd6f66b6687a7fbe00d9832b09135756c5819b1f66dc44c7b32c2496f63cf077ab51b8626d0918030134b8384c565f0715167b21fab697e84c6838a71176748f12334078c27dda3133bd44abd69bf631badb5f2664f2857c033102ce8284e4b2beb9095cbb40587bbbf457054f4d11bf938af207c1cdc5217b0e9797bf9ac88f3943873c8b66883d2ba5ec7e6696d50a69ba55457853bc526819f1a6fe09973fbd19832312b554653b8441e5eb01884e94a355732e3da645eb849f520bb2bb4327d560612852152f8cba2f77db8d21922da08e60bb9e3b39b9b85bbeb9b1715982d292b8f1017cd3e60447278cc0257898575a0eab1408122bb3fba17b62a31902a567a0821d42086aa6417c259a1dbc93b25003fcdec9f6a5507b4b732a43c444c5825a05119cd089fb2e569f70b4d5e6919faf15d6eea641f5a2875763f42b3991f7c89fe473cc057c148ac58b6c88dce537da8632c10ac851f8916fb7b6ce89ba5053b8d95d29ea5d36c91981042c4aa1330aa098a6ab256ade08592a05c95021606adea0ab637824214009c2b915be450a1f7434ea2c7f562a4fe21139c2652ca8785af3208f4927abae698dd435e90e7474556af9b907f6d73c4ee64897dc74c6a876eba1b598e784b8094232dc62bf1119ef764bd1a3bb2d4fc7de069273a223abe5269a1403873087906db164b58435ef41d7d78b36087062419123c8b1d54da918f34920d3302ddaa300797b32c1c81b82798e421ab2589964334714a75cc84548031d5810fd87890a1932c98bad37c860bb15663cc0e91880af1947b8a26be9183b648b714f763b81652786682c210301852776aa673a1fde470afb56eb0b0114895638c609d8d55585d68c165f7aad64c1406a165788c3364667f0a3c65aa300fc4585e959abbc5e1b316aa108a1cbf703965a74475147a2d323b7295d185571000e43b9120b76fb0105ee7a385965026e8f8309d4badef88b433a59090f88bc4eb4ee2f6c1f0d880057b477e628bc35b023a4c9ab682822556afeb32b6c9088e35c107e2a43506c43a986a0420f5164167519c4029b47bc81e93c1ec149e6083b13589bd2a9c64fc6247ec323b8cb73cb9f9ccfb8bcf25617a87a3c2d8b5158ac8661dfc789e92cc47340db6d04313d3a689b357566b9743cace5d5b906a39249f1c2bcdf335f37aac2565932631ac318bbb7ca75db36ac198ac6b15a02173049721d10f7521a52f358f35f3719269a695a4b0fa03b32d8a209aa12a5d786d8dea4ba05498ba222eadd647dd5a397e655ed309883d76326231a6764a7ba4226567022d70fa20cc53a045cc5a1fc54abe0189a4a2b6bf8a969d61706944bc59c6add2992b6e562e9732973d32b97956203dbc523803ca0a462ae118633483cab85c645ee3ad51682c0596378dea5e93bc7ab652648cf1954745172a75c2bf6a3177a7841b089b6ee911149871a9d987c6d499b6e0c4d15c9b74685401b680d3e112d6d70bdad6a3f9954b0057335ca36823328ac4e124d55b9932d548f58b85a32844e9f0260d8a4339285ab46152bbc05a967c5f16072f16178687b0bc06b621f5a4a14ef86b9cf1bade0185c5c52b3f2c407479467e5516ab9a1128260317605d4db250e8f4b59bf28a6ac2606d280af28664b75092fdea1fe9374976722dff579728e121fc1944891c586625a880a7bd154aace3e919b841b1f5f8c0fb841d1eac1fb18002ece216d42cb401dc1681836c1198653456c9392944054200a3b95b986a396d443a306b66018b525fbbb042e662ec108f6b872749d3287440c12bd07d1061a524a01ad7342d74f8a4b76222c5a439eef4235d51c9494602f6624dee256ea7fc09ceba9877f9332bf195c43502ee43c75e78720c306c2fa47f4ef6b7d69038dbcb8272b334c98cb665b306c04252fad3559eda4b96c14bf50b78d4a9a37081a2d61cad33b3b9418bba25409fbf4a5bb3c775a43b39520b37b5b82191b4983398858bbb0c6c8031b9736a5f76cab0e647443cb6d983a5e0a6c27756cbf471baa17870015566db8c8a51aba969e976a1c6cb2be166f20680893950ddf09cf8e3827a2a884a7a65d61c7c70a522d17ac0939625fe63958741255b012712e76fa8da809a8cb447d730d4097bd3e86471019dc8897bfc82c3804a76a38919f7cb50ce79bc13ec4bdda215bda9789503aa822c71ad8107a35818a7cb055b303338e465933565b94950c11836e8e33ae8093b0aa0c5d5d555cbec5eb4190eecaa1525014e8a341e9400180937afeb126c278a5bc4713fe9c417c50c1e47c8756fbb6a6b265bdffb4c1456c5b7d7a895b6932dd9a55623341354549283ccfb36abb3068b2db7348bdb1172318357bac12422ab93a32b453bcc0faa4e8e595b05a145e614aded6bb77278bd78907b828b18a22aabea48bdd69cab061522a618cf39406f6c78cb983354384415d8b857cb451e01b24f489a3133070d775307fb61a0f6d56d1255c4d4e18c62e57d8422080cebc919b81e67c4304cdb560ab16d929413af650a53f870e8017e90096452ca3ea648ca644010d34bb79c5898b775b197189a55840f43371dd9cccb7b4a28a66309a515658f06acdddc47042acee250a37632b42af51adf1c0666902fe0acbfc8f59127753a40161de4ca07a5c8bec0d8ad3141487da4a842147b9de945e4962699033375548d680b88ae8354d6114efe284517778eb9b7957eecaf5b4165424a5f82f100d02b7d39968b98f69c2cea1a0b39394f49265b492ea8f4000000000000000000000000000000000000000000000000000000050f496e61849154f498d752102402b70d58f7e61615f724973e5ffa9065b18a2e8541047591efe1847559704339d0ddba611d0ff8017cdc84e61184715c93e2 +ciphertext: bc07d2caff561b4645e3878d1de0730a88c05f46348526829a396f05a0a00603f0e2fc79e13beaacbe903827c20d9d687f3fb4eb2a8e9335459fb21380b8bf3734518778d8cfae9524ead1427c6a2dc379ddd2e985e2977bb63e932ed59c83a8b9a593e2adba0cc5f106620fc8c6c4cba5106bfdb4105def0c1d7b6800327cacb964e1d4ebbddfaa15b279115a1d05754c0c8a715fc2fe5aa09af7b96d5a93e758458aa5af8cba03b942f4d3c0fbbc2a45d3f7af5818d67219a72f4f538883ee2d3e507e2dbf4f7748446443bb71bfbb4eff0f57d8154d29f5cb26cfb52c51b676e9b1ac08786d5f475cbbfb49697a748b7902a83da49d285a48c7e9cae74b66a30b02a353a287b40a66a0663e7a71adab7d03272f2ec32d47097d4c303396db3e7b7a947f467a70646777cda227d72310806107b5dc16cfb36918e88784524e3a46c30242a40811593aa8f72c742f885a9623534753b2bac5e29110a1a854646abe1c0337251e85987aa612f3a095409a5a632af14acd19491577223c278b18a9c3ffa7f72ae49b89df6dc45ebb2803ece96cfa94ef9ef5b24fbe686ff90d130d3ae953a4f9ee6581a346b0612f84cb6ccad4fe94a53602817d67c61a9604d288319f5933f4a97dcc6ffc36cf14db593fe27f873be712186a6695d949d4552dab37e36e2e0ced229ea9dccd6d3bae22f9fb888ef400b594ec08a15972e8d2478e50f11947b52bf384c731b0e50dcd4ba116abab8af3b880c54badb11d83b4266d3e5fc25c2c8dbbba12fee2fa5c2017987f31277a67ac702b8dbe110894a8c81011c7c662ce9ab96a2e25cf5056a3e202dbf6bd5bef2347537f7811637e932d13ce02283d48d032c284b6cfb84fd813b6c3421017a7527eafcd3fbc5d4324b5351b30abcf1b366f424a8a0b5edf6bc1f3e8702b03eff875687c6caebd7bc15f1118696cc63859e3aab75aa9acc58484da7f2bc9a120844e4830429c0eee2b2324890bde302bc93f661edd9c04e1183528482f9950654e8c267234245aa9482d94e90e00e929b65431f986e7bb34524cc41f4b4443646713c7abe6c4131a2d67f3bf42f0a7f2eddf82b5c08a94d99a0a7d14c1b0b375fc158b7d4276eab22efb438f0d0a9b30e9dc127026181e42643af8da0b24bd10a532069392724948ad722b25477b481006fc1fd030aa62b217e6695dd4c7ad34dbfb75aff1df5774b061a4ea8526e9bcdf9679405c0d2e40dca00c9e80840e832fd663596dc55f602d094253893405a02d4414f119d23c4544cf832888db5ae8494dd2e8ee357753515d929b8a37b5b45446ffac20fb204b5c937f6344c453ffa449fe839b4afe1da61301057338fe29df93aa962a7374a2ec181ffff9252c8af5c3f75ebee02fba58a76066df4c6acfd5d1c18390652eb2f469d35dd708e63a498c08c5241b2717333904ba0e6e0845dca8c9608f28bd1046805cf7b220498145b23cb18184a259458dd2fbaeb1c383005a0d289562b0a9daf7d1e320aa302fd3d9a02c65fa901d46d4 +result: pass +shared_secret: 7e1b4195e9cb70e6884d3d00f0b3f0a66b4d8c00ce112e1e79a1dd236ab62b26 + +# Rho leads to a matrix with unusally large entries +private_key: ea53a046a53b7e3298d588b38c403e67b5620c5c73a438ab7357660362ab3822b5e774a9dae973c83a96db79b550dc176f9b0182d37f12118bc96a4982249a352219a110704e4a0ddbe545e4f55cfc2c50d54cac33ecb6fcbb3ac2a7bd4e41282476797a3c24f4ac4f60c33da281cb1313035c9c804d755267894d867469dbfac7be52a34f55c0dc642354e52967b043a0e0167c806581b51519e04af675147578c79f492da3ac0748352c6e5c7ff462008cb42e9817155444b214c3b93ff3ae7d44b5c2b659627a833cc18ccfab4fe6d6513dfa67cec499cd7a0d052a5f9ba378bff75033e69ad053c04b74c8cd756c7cc0bd494129e069cfb4358324066415bc2a4d1cb8401867c9954aa8a33f929ca279696cd515bff0abcb6c8692aa9cc076861e2bf27ec360983f775e9f166964d0c43c380366f19d3f868a7e038752d30e389c0c057b6d93a9ae64746d5b3a146d31269b94c7a753412be68d09d820be6890e5db1ec3eab1acb14cee8a317ee7ba0eb6027f13a540b07c12cb1164bc7d295c16eef4c8d9773bd2d32ead764f58fa48abc2a5491bbe00e07965017ebf40c973343704112bc90849d219c70b028ff3769e720c4599098d172674358bcaa8947ba6b874e3d94e623122ffb3984a0b571632be1c540cc5da45ed1c57da1054abbc4456678249a2589544c3dfdb6330ab35416ca49c8046c9446150660b45e05b720722bf390e307445dd8a3e23253cbf633c8ccb098976a68e481ee86b86a32865d9caaf385842cdd071b0974e807710e2b44c598a4a36bb2af048b0fd30bb6c64a539513ed2a5a9c6cb16129cb88d6bc62389b4846a2a0afc532eeb0f055aa85ce7b43f8099cbf194e664c59e683e535ca809d40f72d4a3d5e287b5ca3880d4af1f1523b60c8f811a17b2881602ec0393d54988d63a1620a48ab25a5336b25ca25d5b21425ee54673062020f065693665c68399691748ed8c2b6ea47b89391e7dbcbb3e4bb8bc0972916aa0ee5b90292b23618c5e9a68bff8476fec1c7e382b1cddd45069263a507c44b97663a9c8b4bc690c89d25893c4caca0caa7633bc66f449bc06603fb747843b0a8ce11d46ca100b3243a8617904a2ae48db08ba24bacd5b946cc96b834491a246850c44a0f049bb3e099b3353b28c3889bd4520ce75749b745e65e6442d970e917362cafcc9cd1a6194d9ba41f29feab98320e10234c1b0fa367f7c3a420052a9ace9a0787bbc420832db814e8f86804fb74090146f899a624ee9739ed55c40b3716724b8a8164b8b976130d89e15dc24e2078f24a953b2781b7d36a12334356a6998870a0128ab5152a89ddc84aca3475f8cf849bd762ea7b23bd2d743a9d3a9a2c2ae4723b5c1a3b5349a2d4bd2907d89ab8fe80624838130697bb1d45f873a3416164f862630e96075fbc5192be26755eaa1f33026a1f201a05b6b57ccc83fe9c191b13016a921532c4558b44ff0a26c864c3102ca921c299b38199f7162938387c3598362e5f616756bb5aad68c68e0a34ce96684597712341f391ca6696538582ab0dbd532c7757b5b24b0413145395123f0c4668cd538782b0f65ecc30b687efa78183de47f53b73831210c513c54febca5ddabceea01649d9c6588d68c05e93cb6959fbe348468cb6e7f482d2b0507a097625325a7ff5740086bc203410414845a177c578698b313842dd2737d79806fdc8aa4ad8b91b514b6aab60885a49be68ba60d05891dd1cb47c1850b0105ec15a95c93136f22a170e346d2256a0cea672941335423cde35492967759b4317981c34fb0d759a2b08aeb411c362b2630c4b8ef342cf844206d7a5a3934bdfda95ba9fac912fb1844a0bb62041868ba0e3660a5551951b39880eac2959b5028eaa765492416ecf7a05102450eb20eb2a28be460972066b41ac87abcc28b38a7c92d91779e0c7cc8b42f107b48269521edf0c558a1b767536d295c3a7e60b9de6a8f299563be7c4d33d33940234af8c7764b181fb7b5af1dc88e4e830725533656520af7344e4ab40f6df34a90a898c672b854021d0631c1b1e9999d8176b22a5ce829a240642e19472e635a83c5086f87872f72a62e5fa038481a6861141227666f9203675db45a444c6310518d86a9221c9b6bedd753bb7914f7995e39031963ea056536a96c9b14598c95652091dba9210168467d7388b73770aa905052645eaa877c6f8a45acbb775d080521479314e214a5217835667dc2cc67dac17b0103b1049a03585b30631c6dac53b6d4056e5877786b295fe94c8804b57a027609bee938a8812666d12345e04c92469463443fad1c2188c951cfc6a06c3b8c3ad8856ef26a67b7841428a1f5b69a3fb82cad843a55645b78219d6de824701b0b1f192d4f816f45032b1cd5b465d33b3a9cb2fb04cb271a3cc74a8bf7ab6ac7a00e8ce6a0486c660680219c6ace0917b31595584f4756c9c5273ee36c37d25d5da146e57613edd34795b9cf61bbb7ebc441d575631215a87c4070159136348854c297cf3ca44fb2814448e30eb2c555aa2393bee966ceec0221a278f048aaa6d09b1d801aa0fb369ae4480f051329390af222712c61a59f98a31a03ba90c1a6c34c1c98c0be7bf59fd717ad9894786acb1cd081405c66a2e79a1fd77cad853761461c99218aca3cf4920703654fb9529c106f41a78b259294709bbc91679d0442bb383c28d64683ebdc7b94f4592c8ba2c1126c9dba9377040d3a124176fa33a3905cbb96764bc89a69480b74e38f558b422ef22e390bbc76e048c01129c97c26125bb2f86c4bcd274816265d8c41167223b0a22406d2a193ad3b1083b0cb75f9542e55b9aac02845f59618b5aa580b5b2bb44c192a906ce61b8c368278618d8ca8409fc02bb9b097acb208e3c2a9b651a316b70cafe6b9bdb32ad794b4f018b66ce55639e5558f5a3990475794bcaa06f17093d490fa583e6fd9596b40958359a30f813b940b1e1e4223d3857cfea691eeca944de845c2fb502e35a5f1a3750454593fe1c41662a3b3da407aa269c43167acc98f5f3c662d6177d3594d0cb800087c6a525c586d86c12e941b046625d90c8ec6dc8a5c546abb19a0b585aef39379db926691124265103bbb49cfc4e9100c803b4ef68a904273a6c899e48609bca003bcea9cf82203d52b5f9b65c409ba9503b3b16c7077465aae45d2cd4ada79ca43a9e99a124b7c9fa24a323f6c6bc18b81d9a6161191561f3776740b539479582a46bd913ad73e0900000000000000000000000000000000000000000000000000000009ff3bbc6c725ac014b798e2d5146532f55ca1f580b27b436aafd30679eb4bf35ea63afb095b03165e6f3b9488778fdd771036713df7b893ab8777554eb05f64 +ciphertext: 79efa2d537baa2b87a787317162d3dbcb40cb3c25f540ddb91aea6cea9870bbc5a5f86f8900b913fd4154bcfc7c8a463b9b66118c502ddad539186fcb079664f44a5363cc8d80d6a4c09f28cf8952157526cfef7bad2fc2cb69ff03ac39e37d47faab64cf54f63919303badeaab9e59df7040511ae335c5230e46e00a666b994d647d11cb032e7ee235b5e18b1894621ae93ee129823334580381b857cf0360196cb75180410f9fe7558d0e189502a5dbac5b4f0597cb3d1d201f89de26f7b4ec0d200a418a26cfb82cd4496c3ee22f6eb60f3ad2e1af981c238da13063d1746d65f77ce0ef30894468b687b31443c7acacfc3b3878fc9ec56878e7bd1a9f72ecb1706a4e5face0a83282cbc2bd15c89afbe3c97dfaf395a96ffbe1a3f75af03311afc69dbc01b11ffed2aeb8906505e910105806febc6e1298fbb5c0bf501232b888b7e8b285953d250b866a20cfdc7833a732966b3a03485ae2852d0a3fbeec6dfd0ec8015db5de69e55f091e956ab4392834c5128417105541b1145b27175fe35efbf3102277b35e42bd83aac25e25da6c55c28a03b9e2a8135871b4cc49fbfd5598c9eaa2482f249c0b6332a6999306be55921a3016499bc63a072a6e9eac894a3ec209177d07208d0d271c47f8065d0facd2e975011944f7884088768fdc053cf86f31f6d348222c06467fcf8ce0d404a2558e8cc422521a4e249549037d3e8a29e03a9a9bb511d9ffef4c5185a380d874732c9e862a6e8fa3fb72b213dab2ad0d91b047440b1d334660067566e6d2e14765d8fd0a45b9b8e8566419a6d7138e5a106c31b1278d50027d152bc8658d7045cb2297bb8382585b38be2d5fafaa7e8c867c74be013793874f181a9798193dee26fd5812eb469d1b842a969cda65d3440c67b00e6d1c3ae8630165499c1b4cf3153fb5731916ab779a2562ec62637d747d61342d832aed330e5cd794de900fa507d4b5fbdbc5f3ec1aa69d0319b3644d46d9502d435c1b5a329c0d3524611a145e3024595e91c2afd577a422d59d4d54a430f439534003be467b6f018736c4bebceaf7c83c799c2b7745ce7498dc84b9e455b96410dba1a0a5720fe703b7c0d859a42445eee7ca3353f294438a7d463fc3e98f4403f93b5fc4add88cc22db7bba150a2988639ba96cba8e2a0c980c9bf8cebdb5beb262d79e86cceb774750cd9a192ae93d85e60722ec6590beb7df8e4d036837c97dc05c7964dab00034683a576da5b51aa8a0622edc27975978c7daf1b942285572b09c170dd332a99bbf703d84becc6a96373fd1c0b355f063e4c2c6e59f5437802676000a819b9b99418df893b98a8e6ca22d95da2c151fb24a3a0e5944ac4ca6376e6c281b275589a3907c0473282967a121f1792d09a15e9d71e71e73f9f627ef0dd478061cf053af434b0663624c3bbafe0f37d7a32504e9c686f41bf48e287aaa8fadb73fece907f26a9576611ab2176a58e5c1f3e98ec0248a15774434c2a81c7a8f57f9950b83c0d3770d17c4e57582387d6f19bd +result: pass +shared_secret: 2522e72d308dc9d7d701e0b024af9e15627572f13573b27c406fa750df9636fd + +# Rho leads to a matrix with unusally large entries +private_key: a7d40e120206cecb9458a1464b96c447db086780708c7435e40bafe1ab8cf26caced91b888711b8b95414e080c2be24d7a622c2e0410fb9c795a25a50554abe8b9049f9890e29531cca88e4284a5bcec559f939061b003510c8a23991cf474ba6676b0599c86dcc0976f3b61cb624954d3914bf28e109193ef1b9efdacace8574dceda34905485e1a79d51c8ba06722150d8a243d69f671c18b1c2a77c990699b72ef5b1c4aaa121a8e5a6cc971178127024166f2593893bf3b9e0db273040b0821051cab28af5196b8937538a680b39251b08051502c2a3d5504f78b767dce91e2116280c3532e9426b93d8cae3e9abc5aa4832c6bfb02a71559bb689f82c22835fb314a5e6d44bc4085eb39ab41555103033a0f4b6aabfc5246c93c07840254989301f88776c06c9f808369e18445058b4d940783d57b7d7901b0d63a6e6512b31a63ce0704028d936462c18eb4bb78accc3dc56884d9837d8632a258c4e998cc536248aacc62f7b9b65191a28a27a1cf44a0d512875ad5112e034c0adbcc67edb84eb000bf3621e7c1c5cad1cbd06f848c5d8c3601b07463b5c0e33cd260a2ec99a972c47cda74229f6292221391f37d20903aa76eb6966195acac6373a41db78b8f7515a473ba04397c2e94a26a6acd8f2cccdc572d4b60e56880fd0295152e18bc79699feb1a0b6f6c7ee19545f4124eeda5755a85d79fc2dddd2848216576e9ab4d07b7ecf77a74937cc1605602c62003dd5abaf601b55ab0cdb37bb3110290f829a742c5607ab24a50000f3191f435427b5345ef884b91811bc44fc4c6de32bdb0a73edf80c8783a5a6b6a2d06657b16104cd62ad847206ec1b87729260e91b2afde6b0f13a87025c10bafa88e1fb1a66b98a5308a2c4f10874324179a2729df786627271ac5a945072beadf878035169c543c0b07acc49241b7feb406f524b71c787ed757a3d48c233bb75d97c42e03b9973cc680169520e400b00879cf2bc9119325586719f22e1b2de163184b2c43735b2c1a8654c92138b90c458421f681136e0d6c417b20a5f8c126d3672a4073942855b127a87ce96c7e34861923b3ea9bc9f0aa277746927f0777814862b0845c3bdc12309241f387cc6f4ba4a9688b947ec8b5603ce88ccac5c35756d0031ab4a5e32f6ca97184df2acb38f724fee64a6a688c69f6b913576af98ea2487db097d7c81dbc2a29a381b2345495160c348e8207e313929dc08412304f6a01c90f6889e23b7974bbd6f081f52dba8baa716b53769e6f71b962156cd44a3f50563efb3b65741aa26e42a3720ce737c7a7ad5c875663bfe36bde03b106647ba1ef098569bc10a0940cd300d58571dd354ca5ef714733bafa4308b3c4b7528862664a8656d16c9c3837355e39072db20af20025306390ef32931e793e33333cfd893c6227215027ab7ba9cc0212ebc749abbc62be483b3e2406a5ca10d7fc534166646473c27979053928aa5445c4c1c26cde40777aca39f5a64161c322135fa176d44b694341a0d3a05de662ef0e1aced53c4ea2762c1333da3f987fac65ea63a17b55c3f681c568d648966eccd095928f2e32af2fcb0674ba3a50350e282c99af149ab1b3f52d3b9f838b1aa8cc5e2c1184862562b91806efa62f1b72a8ec43e70663de1f66a59687ae0cc1d9de1ce69244fccb0841b4b1de2e964e29408094a1ac0a9b4daa836e94454ebb942c6e9ac66f39abae73f61a99834292ada3c824bb53c8e67912a07377da92e63087f8d947f59d94a842b7aa8832b2c3c1aa957577f55027e76c106f86946f036804671b0e0416cf62e70eb8194d88030e2b38585181c4ab1fd8165a821bd68dc8fb3b403016ba5fd129bb9d23182029c4a292433087632816c009a237a608e65cbae17d688a326bd6c1ab4634576fdab2322b983f29c3e63b31303cc386bc90641c84965572c49a91f4e8258764834f38ca7f869cddbb10674d4296e5205ad805ac48462d3b31a9e6067fc0a27470aa593b896c3c319357b9bdf0632bf0786fadb0ac242609462a06f82460ea75762a678fcb07c350649d13c24c9e33200c9ca0e9bb87dd2c8578c7c4e27b1b75681a0b6aec6a55e767c4e14820f2ea609a16b862d5695556b0937f53e0ae370086c8f771295b1a09f0003a07bf512c4272f7241752a6603f8f51ea9a088e5263a59eb0b13b87a1d2929c2c29557681f180261f46c294de4aeaf380ca5f79efa2c64ed3131272ba489494ddbea14c69c46fd6346a7ec9f72d89559435e139a67bc3240bca29b3774127dd85d53c20bef719724612c462bc598c54738c87a00a9cb8c4b44e4e7ad4573afd9324fcab820cbf2091fd83fea52adc1b82b3f6c86369aa358498197631a20d40c790c2ddc66b0871c1ef882305bd978055bb934467d3ffc0359c2b31748cb19f615a63262fdf695f555be1ac432126b08e4a97acc18b8606ab6adc5cbe4589389e1121d737ba2b3a84d02bfbaa669f3a06b1be13fafd42a1773c830749cad35456e956c0ee64a5fcc46f1763c3b0c0d3de5c296a28f61194ae72979add8c7ce710d4ee846af81cba3e18d5e459addea9fb565b010e9ceed5798155227dcab155984635d7539d68c9f0d30537ce8b573b6bef1170540d0c10528737d6a5b219b2d96e5709a721b40536ee3c416fcec0bdba013b0fc0e786c9765d312692a80a5c9a3d65a6662788d194722d63b4bdcaa700e4c3daeb911e4d45674c3720be35269a21c0717a4c3aa2f3e1ab4f20a885cac44228138ebb70bb4548dedf8678d2163c339c1a9c719c2f1a51748571358c1451b0ced7b90109c98591126fbe57e1c913b5a935eff14450a22c4a108108b99b6efcc9bfd8438b5024677144885f1886ba068a6191ae17b9ffac1087bc94badf510095baa7167a7fe245a89a2a627d2631706a15d5aa081d037a4101b217c1c45fa0d83dc790447121cd9a533592cf8ac424de8770b45307f0aab484467c4acaa82a5669f7621e8ca42ec0b9222766b52775173b288ff5b01d70a60a853aa44917b8cd09a4b666138e91a3206c97877c96d690957b58553018f55f168c1c51bd9a48ae762a65dc73f366c79e77c42e793750924bcc1472cd5e552e20868a42047593842619c2e0fd40a3c7bba9557bb5c71185430a0158b9b95d04fefa266005141ffb4ba5160a5eee1499c09b11c549bc88cc501dc94a0a5828ee8a776a2a4aba3bafd410cc8354216cc3a93a457e9847af39b898b04b60a0c661a72a2df2b000000000000000000000000000000000000000000000000000000da8d41b69d2601355a1e57206c862dee967af0224b3c5ccbbbb89be1bf12fc688bac5e523fc2f73973b46b1727891a6077329e10e94acd027c9dfa38ef4e21e4 +ciphertext: b0e578cabf9deab616e52934955f42eec74bde5ea98acb022c427e08232142dd08f9120eefe5f455c8f120e672cb68f3a146c3aa457b637d0901fe2b4cd45e8b208e06823b8aae09778cd00fff5bed5232d219a2c33645f2dc30593e591f697118a8472eadbce05c9fbbc5d4b717b880065173cc0854182555376dbbe39194e4204067358808c890e5fe96028921fca344e3500b615f2201a1c4e4d13dcc889cc9b1ac72429074c21a52f4c78ea2c467d65cd2c9ed682f21f31b27af4eb5cad33dd633185bf32e726fe6e57b03168803f693bd85f5a9f2c3ec6944e9ded2b8f3270a89139ce50ba6ded6bc6b0be8893f44aa5856acda60dc1c4c0834d45574ecb6183d6e59a183c0125ff45c718be2cf85b5ce6daae6e37336ea63856561f1bd4404df725d5ed9263038d1c623b2e1aeb35924b79de474407168834891af783fe5d83a631eb14d7cfa949d698ffa45e7d8c46ed4abf75cc666b78526c9b95ebb2920c77c56227eae6c893b57f9f463ff2ebc9acddb2f7ad543c5b2259047a4cc87ad05c08bbf02e8bb267bc490c4b67106fb598d42135c927fef3397f4c3f6838776787f23a9759dd3214075e79eb3929932becde84e82c257e4638a19e1e3312cfe09d4ac681d653d749c8fa6efa6dac35ad59399f1e233540fa354681ca55db90007039b7e504e2e4082aa3e4d672019741aa02a281454d4e1c73a1c7d0b5449c2e143ceaa3b18cb9a74a89f1ba74963dc5dd4155a356211277af3a267947700a2cfd84a605ab02d37bd6faa8a26b50f7b3d9bdc79913272c31dcc0f0183d05933a9f233504ddee2dd851529667ec5174a3d23bfca197538ebacda36bc29ca675384c0b3f45e4f67fb66d8dd4aa57b7da50ead391e6b663af173e7f4d46139f5d0f4cea84dd32e4e718967c6b93617271224f2fb3a1ca5febff5f26c4edc60e9acdd9e464ebb4571dced645814e1038a50515a7e06501adb2de19fec4119dec7548c41097964c3151226153ccac24abd1415579ba1c37c805a5827332d97ba90713829fb30b7b09b275d75bc10d4a26b33980a0ccd4b00844d9f379551bd0170ee895286526ea9625a72b6cb8decd9cf18e57262f8102a025025e8168465a65a7c7e4d5fc8742781acdc16171085d51dd5ec9f4f71f58cfaf4557a55d07e7c164ccf7eb427145c7f9a800e9bd9192ec0f74d19fc17d3881b1d55e8600aa55abf78fd1e226d9dd6e8da2bea15712f5f43325d4b9c083d6e37d35c043f2bc8c796ade072555263331bee7fffa54e2099135ea363575847abb770322376cbfd3f1b7980a1857c55fc82aa80bdcd701c7b7d66221f08492efb5438a04d041b485bcb61f6fd306e96cfe758d99ca1cee70b200eedee86145fe37ab7aafcfbb2df694361fe9923e754187c3277cc895c4a53732ee118c7b6156b55b30847a6e828b7069a5d4be623abff66ba87bff49294dd9b1f698ba445d610973d052a80691c9968e3179aa3eea5b0bccb3cf674c5cfe7d2c14d7b6daa7a4813abcd56ef930099 +result: pass +shared_secret: 1cffb3d6d9dd9cf90d79fb2c5c974818c5bd6f32ea4d44c302337c4cbea44334 + +# Rho leads to a matrix with unusally large entries +private_key: 610c36a286cca4815c657bc2f28b854aa8602890bd6ec2700d64b495b50d049c5963b8294752942d11c1d0182ba6704e54c003b828bc58b6ca3ee0823607c3c00bd0471b4df571c51db3003e4cbe6166c0caeb747f79573f5b8b80d12ca78bc1d3e01a318bac91fc863198afb70cb9256a330faa06639caa7ffcc1248b367bb6b0bd905ab0098b79b85ac5dc083ed43ed8b248dbb72e5ad962b3201c92b132b2961d9867b48208896c11afdd929be2792839674b18e4c1e99a7df714ab7ecb58570281ca80a92f148bc492797564682b560f1bfa42b2f7734047cfd6375d3dc05846da1d3511cb3c8221d38226f29ca52b07471a41764f86ac3418a96aab70fc8454d6823f8b7c6211d216d08c67eec474a3cbad8f3587e22670ae5a9938651f3b48011341b6140ba393621accdc3f606b080579197c48967f1c8d11026d8f90b0697869ea49cb9db086ef687227b2549ac689b564326a2280d8384698185afb25941ba0365b0c1939148ed6e1bf0ef5c764832178d47a01c3573aa268e168b740194a9b36ac2580a7bbe1625900befef3adc6fcb356100ddeac4393d388fe647c3d623d1e6a56a96073bec59f5fa39581245e31aa33cfb865bbc28e9f2498bad34a5bc65c517bb8cae19b6d1864fd7a0c48aabc78d0373a84c168f33ff13a9586aa349a185e3528003e804c8cacbccf0073da46567f7c3ee6a55eba856851234b4f3725e1bb3609e50cd4c9c96ff947c4b048dd7c64b3498d23c234e9bc45230b8b0c797946d0980dfc7bbc5773620b8330262ab6247fca5684c9fb8c2e692c3f654099a7a93d0aae62d24eb594544a81431f295bbca7b15dab7bcf728e3dc61f6354a459a120c371030f3b622569a78762b1cb08248a455e0f0847e1531d194acb0507bb53e9c0e13c8b2f45ab06362be3d9bb58ab6d90825a15211f81f4987000cf74355a28ba08443b3fd9d26b70039955773f9f840207f696d0e7a4989c4b38cb23df626e53b7ccf7c1bd96bc3f68c20ba180a482799d2cf975e0a39d5fe863df954665509b3eb63c257b8c9e39050bc4a739468e716cc289a79053453a28906d003535536439d418736a95763ae222c8870b66f1b5a9978c29d238658a3e773063dab55125e851983706c3ec68d7fb1d595b55292885f758a8df752fd3d97a8dfc33a228c896a44bc039ce1a2069810b1304d44522b1a5e43756cb843b5ef515d89c310f442f585259e5d460dcd578cc51ab49e63a7cdc2566d77e6959a7d24150cf0b413d335efa65385ae13b482b9b4db4ad2518b71704098d7481d2233e2ab201dcb4a1b3604149710de3cb247f29ce8ccb2ec062b014708f397482dae5936bec37663c849c9baa9d3cc88146b88cf970e574694af03fb78205e205435221b32e5513989047e62775f1ba5aa89a10c9d35cb566328eaa5748e9c5057446f96cc691d80208940cfea984df8817d4507aff0a0a96b8c6729329775c8d75935d7624cc0a06ab7a950f2b73ce4d90239706403c0651dda56544ea59bb06a99f00bd698a8c3f127fb4a3759317a05ac244a07342f9a47257e5649dec2c7050188ea669a97c137f707f4e5b4c57945f82c1b0b2040476d73acb54724cba00e8014b4f4687bb6670b1c2a29ba577100943d5b926cb396423663f710328a8b536403530eee05006e7a7cd679ea44c29146494f1775cddd3b43ce6a903283f7890979ee98842d5a76f93777297abffccc0b8faace8f362c081aa435c32a5c31773bc046e61921f1a5707579fe36067588a0f32e2cbf91aa3ca6b38a0e12ffdf8685874869028775fcb7d7fd7a1e37c611316515638a510a13e950960e6f39395e436821165e734837ed575ad510d4fba6c3ad67e039b71a9b6c2a7ac240ccb3742d65b4b1c50a6a1a496995da77921ce33624fc48135e88c59caa47b299605ac1c79009dabb2062e375547ec907590b9bec52c86a6b9e394ba5f02401e4545c462c5f320939075b516c4a5dd0aa5d879456449a115125369584a609a83df8685ed2ab45f038559dc6b0ea170b09680e7e747cc7246b6c182d9199941847d9c1168a84400da2a98215a9e96f6bc869035a8822b27d459cb52147d966e0c354b70ecbe46daa9034074019acdac30055d8a1a02741ed8e602e2cb3185ea44c9e61fab637188554c8b12cc5abb9073b35108f59f6832112ff23b00acb0936594c00c0534a8c4c11cae4787092bf497b60b4a44116156e8368c0c950f3677f6424690803ee92373ed5c13d84c355bf041edcc872965816d6723b344244d0a54f8ecb0f1703ac251293503baac445996a1c9bd6ab851eb52f042692a2b10e4b9b44dc9625973af03fba67a3a93ff849dbea64739f643bfb803ea8653c2b9ab9639614000994bf48a8024c4e61c8a07a5c79b19540084bc7664ad44122e46ca1fbd517c8e68aeb3d835e53846848742a9fc2a4058047969bc11a773e623462c7bac66a34c62db861ef64dedf23c0b7441f6b75b4e60b86fe309b1b7746d558987f6a92cb8513792360ef76cb6548f0813ae8dbac418c25a1d95b06c530d79c6751e7569a2027f8a5354de3a70752764fabc632f3a1bf2473e8aa2a5cf815b3856a89afc122d98ba3f74185a3b2c09049601e23ee226329f024ac2692adccb2018b22a592a450b4a5819b2a498738d29f7145e534e527c859f05ad96cb963314c58a5a6b050ac6ead9adc4782859e3383170cabe4871cfc17a30ea4ac55cb998e77e1a26662a255f99f4ac7b98723341b2c7134adcdcab12a473bfe001127bcb01f84df31384af06171776263085bed1aa3374da7136648608b569a88663d2122e84b4b946b35c1f24a836e924202b7c7828c15507b17f906bc0e4b28c230134d90655696edde11a32c7a70303aaae3363e2a6947b4bccefe9ce62953f92521029959096a8910e71c51b69a0615ac790341c0ac3a574a79d34c11b4a974ffd7cccb05995d4089f8186b545b80a166982cb53123ef644e82897c77889ef91bd8c5a4ed1a4a414389d77307d53487940fa32782061e8458e0c601c884321d121b48ec04bca78c60d39b0c4bc9291945ae18224ec73ab7a451b9cb511bae34a20e326a497cb6ce46b5848c289da630f497ea3975eda79489f18a405e91bde288379f291f538c1a1426cf1634bc033098bbc9958f7af6e408354314e7221c37c1610bf904cf9e7807ad327f0f316761939674867ec7223f06a245711b0d47832b1a699badc8e1217798c0d0000000000000000000000000000000000000000000000000000007420233153145d018d37197db4a72facb39b5779cfde51a1ffe665b09f338119e42ed33e0da5856106580e02aacd0aa1546d3df0571d17452d22f186d011981a +ciphertext: 3159aa52482f4262cee553f9eb6d853d091a507831f5ed1af37b9c55f217eb1e87e8b0dfb653932c27e9e9f2c4d45cf89e9cfe9ba0d5175be56b7fe3751a4255649cfabdf0cbd5a8704d58511acf6e0580eed572561fab262b24d39c3a430a4e54fca969394037df12fd8cd71b7b6ec3d8f7345b05d4c16c5871b686690cee9804012a3379bbcf720f405c3c83f59aa391cefd8b00a73b41147d42c8b7820b0e779c44e032209067349fa4cd35e83850ae37ee73f96fc6bc5b71ff9b0462604b4e07be60cc76903175b045b908c9b8e7e94c6bc7c48ffd49698873913f9132025e51614317d27a874e319d802923804d1ce1626420d5794bbbe5e077cbd7fa3d958fb2d9608a3d41f605908d21fc7f942e3152337115a28b661f76405620b056692bfcc066f370449628f8e31b7453e5b7b10702f7c195dfb779fb3253f86acbaf4444ba9ce01c9b043133a233030247f8fc44d5b8c9b024ee83c186a62ba9fa5a3e45389217884a478f238d6a9b8eaf3d87b7b4b4375d4d5226dfb80255faab42380365b5511567978be9726d21178eced7294463a348b1e976d800b1114fb8230115b28e51f628a31aa8cf2e3253a7dccaa37f975fa2b8d32a6b6147033cfcbde33ab8857e3a6af95e4cd0db62fc020f55c2d6c9204a05835e2cf878c66502f572016d95b30c45c2ef6048471ad0cb7fe14250dddcb4014c392c22fb1dce1adc8e02f416d3e9b417f41c1b4065b975de472d0e9fd5b3a012ee9bf6311345b4968f6f18262bfc2a38d56d911f9efb981813f77a8a8d6af0618e015b8b005e7ea957f89f140192c7442a645ea7012b5ea2ba9f8cd2fea2ad3e41c6a57582237d53444fceaa933d61eac36d03a2865bfb7f12fd8cf451edb5050a35a75c95dd328296dc32daf61622ce0cc457c5968414b634b3e12a0ce45bbd733e3982c087a037d89cc86d546007bd92eef33949d19dbd4daa18e59c7ea3572bf3155a9a46af527347f4f4dcc2be3cc285d65f2f86c681a137850431ce8d2f76e295e74bd0b3c88f1b68885522dadb99fe1c8e40d938c9610e466770d62c34e9393241907d9cd7bfa470cb8fc149306d9450a7a1887d03cddad3fcdeda1ea54d3f126bb29a1ac3d7c5a60ead90d74ccbf1a75b4289a74a49e0a7c4006ab76a83915ebd4a95a471525444dd2c3e748b1bd347774e2cf01f90f05a1672c58f4f563e4da083e95e0fadd4ba57acebcb45611a3923da1d0d73f5c9a55489fb0097e123694e413460252892a0c6317dcb56efa834f7a51db4a413976afcb30ab4dafbe737f43da11c1b08a2472cdff3995dd7d23382b866873624fedee76823d37ec230dee2107258993d5b802fadeb89c9469a33c66c91567ea92581e0c2c1eaa2e2a4696b024c7c6009687d07769438a8b2ba75a7bfb32841dab8acfb8cbd4d1e26c5eb68bc49bb394b178e6f89dde843f4e2c5353b04390c245a0bddd1aeaefb87528b719fe42b35ad2a89ef34826d9e23f95b1bd3c3b24f785985e10dcaf0eb33f5f71f5cbe55 +result: pass +shared_secret: fd9e333ac811ae8be12c052c65131e3a7a32ce82e39055012ea564e10acaa85e + +# Rho leads to a matrix with unusally large entries +private_key: cc389888219463a7a5f6c2ca3014accb3bc26f2318f593876de6a49822b6c1e694b7e5aa9140a0765b6334ec762c8bb018d28a99004081256159c836f4f800d0c9aa4a7136fcd89ba7cc1d6a32b23ed181b3fc118ecc60096a4ce8261ea2c0a6ca49baa28b75d1b40215367e6a33a1c177937bf43a70c3889f6aa239e20e499bc7a836694a0bc2912cc7cf211ba20c12d5ec312da2815ef20c8565712b22a927451271040cf4daa44d79705b97993584424e7b3224a5583e5b8eaf640e85015676517113f53a415220fde3638b9c0a38115e668545305ab298b9923bc16de5b9137b30a39a2c8b5fb75e4d1168593a8eb0e067bb9343f1a030e5228bf0b3a49169393cd14f73c2b8221b1267627d80b97d30544b02a4c7bf06099194b2d646596aa439d82a214e6cb9c5ea1ded727c8143755cf881415b6357661a90d5ae759475baa6076eb478a5826f86f9868afc47ac3a02a0e84579a25466a63d933b071213c886790c320416d9422d280745758779635ba6f848440b2489144866e8e018200cb8305b3060926d7e7213089a06d044176b053f3bfbcecac7840dd7844ec29eb17bb2caf321a5b17848c16a678552727a3d70c34f024164b3c4856b0a4ecbc78d345187c6e09f055273bb775078b43ecc534a40e66592b607b56b5f9304aeb048375ac71c30464e979a656f1728a7b700e3b33e5026bf40198b94455d2be37cd65867522b20bddb5ecb7a010191254b8a403f37c4577a613ea30678daab55508b16d6020f074504f928dddac1e8367faf6199715048c96a8fd6bb225715accdcb012cc856a76057b6b72b09a4aeff5b8ba278c54a750596e82bda45be19014e8ff52df181435ed9ac8c402147b539ffd984c291535b7bc8b26c5036352520730195fbaf40033fac450843e808b9ccbf03b40a9ed657f6ac4af8b65b4e389280633d79799e0226b28b356fc2e39f10a80452dc934caac7c3c521f0c5544e7821a403688f08378c3086d3ab8f7e4036ad516778da606204aed3ca1ae8c42e11038a64ec78a5fc5dcd0475429124b5d665e4acbeccca3a296a8e878b917b886ec7f029491c661bba684ac4229cd71373c829055b602db0518a481230345a34a709010a03e4b197273510a0a24465288c327c10c75434d9473208a7964db7792ea81c5fe0c4bd967c3f0c98765ba7d3faa4e6097f09e9bf10638fb900a764e4a0bdba2f19165bd69832681310a7a2585bf06322a3238dd26a4807af44faad999397d4aa14e76c2cad5326ce573d7ca04c03db769dd01a65583ecbbb991e7a31b59238f8741845f1adb5992607184dfa19a9e8840ed9e1622ab93031e2b448860d411a3d239277052cc8ea71046a0b1ada191a020c322d776c6655ae71964d86314a86a47b6a367b8ac5a4aec75677226de0c1864492c88fb70a53187cb76835d5477346646a9da97301156a3ffcc231f9a0da760dac142674e5cea882364dd74fab66901dbb7eaf037008c52073054cc2f94ec845444054058402515bd206d496bfa02c442c746ff3e662b899c34c40900902c4f8ca146458522c6a7af772b2df483f9d840fe07464b0c66fe1036c070c6f70278e9506342663b07529247b1697f6513e1ec8234bc145eba3446eec18b3826b2ae709792648e071a7c4627e4ac7716db5b1d6040ba7b8ac39b347ef721a99c879453846e1aa591b8495e19003df973580d4192cabb72ae2b1f498bae9b3cfffc8bbce09122cd1910a406574106810dc556894777f35316c992f3b902186dba411ca3462b927688c81f7269b7c2770de5aaf90c81f752a3ec77942729a68fcb38a62946c601c945249bf0e280b66764ba71a44134ba84df1400bebccc61456fdf3bf50aa85e8e60f491ac1c1317d831ba5db6601133883fda81115c67fe4691d9df01fd3732b336bbc3899cf067b9e3905294902ca5686480cc94eb4e98260408b4dd060cf4b5344380c89d564b31158ce098ce1e06b91446c4189c6a4d89aa7e81befa900b250a7060406e25725e09399963c5e3e04219d390e6c28983e335646485023312c4d5bcad9aa7ee683b935d71af1908703fa2c9d66c8b6c55049b3319d39c047b5824d04975a9034e8ca1a9e1a5b0bcb222c5b5c848818d14503c31270d4f8446d013d4ecbc250b72dc25934726b426afc85631ca1065ca6e957ba00f1176a6a45b68a5e93274423e642451129ce83b7de439963c0c4e5d8b25f3b74fc053151610b4263725fe51423e886bed19c534165b4cc90fbd67256839b9371290af9853c948251c768e157041ac91fe6649bd1b1855dc417624b8ca0d798b1947c720b3414db56f01500fba30207322ede05612bb6505818a9a68538c9eb98f2b0a83dd38b765891f0d01f1db768d2355fc6b7a47414527c92ba104637072a72a6c0ce74772664e68660c9c0c28347315b17273a6846a79904a04b90a60c5b15973630209d9460365529bb72524404b3d9cacc013b0a7355a7eb2172d317cd356a07e5a341bab7c33db5a48fca4b1600443df6bf441983cc05125f6aa94f114a8c3ccea3f9c498c1126c072f27e97555456114f6bb3244c4698c3f6091864274a16bd82aaf0711eb8c4fd86a11b35b3b8b0528cefc253d7906b6b05382e37428253ebda5b48b6a068354381b24348dec73c279010bd32e41431d139a021a398f0e5c7fc1a98863f069b9d42a96b029455670caa89e0b867781f73fb7549392124485cb032a008d63812f832cab899a8d5d24b403e76d17d6ccb56c729e15abb2e04e32928c9b8971be6a4c70b15bee620eef375489347df7c622d9a803a86c2a9ec5a7a0554ff763912bcb7f57eb8b8633cf6ef39556162eadf8c285b61a53f4837c8c9ef48c3a58b3b6c31b8227c98df0b9057d452df2c258da8a1de1b99449c0054c48a0bc61a2336323367077cee252d366661904b12ea6215b3ba55aab06f60a517704a4046312731325df563cbed805e2c7b2a5848fa1cb97e17a2f926664c2947a2fdb56ed1b3c5e084a680073669b2b9e888ee010410acba461910795958e7c0c98294865cc700315e86a5c54912dc2affc2469244912d8180eab244332a00b7536c4cab62345872dc31ca3c0d2078d07beda4431f278aeaf2482cde53afc56352a894dfe3948fc14956917a4dc836f54369eacd4af052b4aa6b60af5e86bc868be275abd1118a83e5acfdcd4c92a3c2e2b13cce7101a9d303339f0b2dd4a282499579b803ede0b26c75eb8af340000000000000000000000000000000000000000000000000000005781f74024912ac52aead1be2a87e042830737220659467bd06128a096343d5fc975767ff083234b2979bb109a24a27bca17d170abd8d9e6ad3c3ba19e306bce +ciphertext: 5ab063c95a541d1be3fa0744e0db7e0ece17b6b47cca0fa41d08e7969fe87de63f319f80b9a31ff01e203de6e518e62e6133edd108e5a3e08d3f8ae0556cfd36b399dc1ebf3b229bc5013d06d7550512280bad2b27657d3ca0679d9fc62f0bf875dd0b326008a89b4f29e97211ee7ec75108a9e4a320a34daed15fd7ad394a1747e4e35bbe4f1118703c330aea81bef3e3883fd41c3efc3423ab46b553c7587894ad64db57bb0fe4d289d54c8ba78d40683bdf6330ccecbacd3f7f41541f1f2b1a7626d3969df6586b4214c02f921451f6adc04f5e8de1e3beda82e4aebc5e06abb33f4cd8a3b3b5741617b6a385739133cf5b77dd5607a5c8721d5b51c6c0b6df551a5b440082093f49f31910a04e4226b9ae6f41383672e0694bc4075207034e39c40668aa3174cfc8a75fb1a474485e9aff01f3572a5c7e4914e7519344c8ce7b81377d8c2af66bebc558359601b21beb984c1f00564d46585b4bf02c958c6b348642be25119b12f34a6e5755588f649837ba53c0efaa4c6c95d109a4ce1f761c1dcecb84cce8376cb1c4e34ff932408ccd2d06f20c5397f6277bf9c3234b20cedd45afecb7e87793d85af15909546c6ee41987f36d85865c8c1e281e13d9575abb9a9f215c08d89420535f73643dc584707deb7d5275252e862393fb6493f9e126c651b7981f26af8daf978153fa4476d615183bf147629fe36de7cceaa670dab930ba8a684b0bee24b55961ea556123b34e29491704d2122e46bed0f6fd50601e13a5d46c907b915f3b8e695e0bbf474aab6e082d156e79e59572731b48338892f2268dcbb8fc21cfd537979278ceb210fe3efd052365fa249c97e8e596ae6225839e5b8b296770f3b42240b8727a0a730534d0f42f8c6ef148fc04e4285e1aecf060c3666fc17a1ff794f584b26b0b1c41f0fcca249935cd411a151932b09402016a99832850b3f56c4846145738f709f5e11e28a90d9137e4e43f03dd1ddb6565c67c2a138aca59e8aebcfa61984bc7ac13a60ddd2c1f0fa84fcf9264ad5049c888b9f555e024f0fa685474e083025da168e3b9c4ad91f074e7e711f84bb808604114e09d1ceb83b697cc0f045b5089b0bf7381ff2efc08e7316ddb7eb7be47a1d82cf533ea898e668f0da124d2e87fef2b558f877b50b13a08641c74e2726b19fa7c0f33ab213f403c328ea60d08c07155ca0c19bb75f7f6716de89e34c20f9d15ba8aebcb98e9b6461477f56f9c65ea7e8744a4d7306e216f806ea8f9f1dc45781c1adba44319031fb9e81c6d33bb317d959bc53a677270f13d96da19833965aea9a18172f6f975bc4d03036b1239e7c315ecacec35cc0f788be1220c0497844fe7c989fff5ef7fcdf89c261a0fed3915cbfae94b1fba22827daaaaa0f968f1ac71e9772aed587d607d5d3f57c1500b6e08760e0b971c1999d01553bf87f55fbad96ce61d0750d75180623543f40e5b0cee74bb429edbed1b4c2a3e1aab86c8dc7381afb0b9e7d4151a3f76b7dec4199b97304d7b3845788e19126e +result: pass +shared_secret: b4b4634ad37852e19175ccfb5eca50093291da8f76b86be7511379188bc20d92 + +# Rho leads to a matrix with unusally large entries +private_key: 078bc69561af0cc77acc291fcb063e1d7c82bdd7cc31d5b44d1aa746e261f2a592d4aa9165c2c3755aa457b886cdd55840767f4fa0b19e45410872cb1db3b8b5829c4ce9b2a8969330cb5bba2397119310fa072b7053b35fb135d04977b9ab4766c4c1ecd9695957473f10c679d71d2f6b57db2ab0726022bfeb10b61807d35447a141255bf5b3d0e3bbf5cc3ae74932d87268e172978d78b99daabcb16b44bd578f6dac130c2528fbc89ffa94b48e6785293023e2605a8533a5ac17c15f34b1e30501729a78d3b8ac6e4a329e1006e0c0735c737283856d7cc7663cdaa1610b1045b7423ca8ccb59ca6b1c482dc02ba117c17588809ef8506f09a7162720142e397c6ac0f8fdb02e4c1c557050af941ae8165ae01d9228f767ef1ac3d72f27cf9a2282a6c379a669d01cc0a6c560b21169557b88771008dad62641f435e0780234e86c1ead05f14c0ad68b6b1041492a166bc4a278b0d352129556d55f37ef8969b596c5e41f8597878c8c6c83de675019c022314215eac667a7b559146478a4a5634ff193f6b83673072643efa59c27650fec168ff17109577083bfa8493f38301528f27681405693345e523ea4398055606d4ccad9df967fe59428ca7502f046506756a6b9a78182383db4baf05014fbb20afaf148456126fa393abfc480edc92465d93aaa158c2a8493882b24c564b607cccb2c8f6cbb43abd722c74c2c63230946acc091c48b865cdb33edb712c670648b07c06691687685218ba48648fa3054ae7a6a663aca6aa4e66506516100c8f2caf9c0645f2554c10c480e798b9c96756e42cc8a7f626c2759d21555342548e0490420df3a8124b0566b1804933b68225359cf66caa599c55573b70d488d16185496216cc09090de382d570795efa569aa5bfa8f4a60665cd30d63bb36cc5ac050310ba9bbe4b3af2f9400296bd344cb72bb623c757366ef1369c968578eba52a092dfef34aadf552a63b1495a5b78168cf6e58b218a3ae64310d16734d5e72b2036bcc001ca07533085548809bf114a092225aec9cce6950a953773ee37ad3467bd5ea0b4cc4c6b0695a774781ce17004cd48e36116776db19565367c92a94488ccbf4ca3c3960524d1b13d6f77399ac625de5a2d09954cf867011f79bb4c3682cd40f133a9d67778a24d7cf1a5b71b7b81dfe335d0fc392a8b12b234950ab79cac94776ad1b713e99b0f394aedce739a15334f19042f4861e739c839ce07da145808260b159625b5a742258779440953c743c591659b9d982aa7da028c7eac4390b47b243ba23e8ae4fd9c98042a0c2d25a6688c9ec774cd7e95899fb7f081035b0c4217c2903688ca7e4466e66ac4e3ca938fd58b4d6bb732a36aa8e097fd75976d1200d61a5c988c12702698b1cfcbd93157d3d1c6e76d316b00b4e462588bbf3c480d8374df3cf66a16f9dd2ab721954e02a9f8eea4380c381da230f10c2c7dec02b057177e157cbd5304ab1d8160a323fd5892fe1649c2e270dbd3777035912dc0802f4d18a56356b52946f30c516838028f7f39cc22466ed277a5adb6864972e1063b1af0709dfd60136b16a3d6c863a68895677c488eb1d879a69a5341a695212066ab848609cbe3317b0abba905c1559715f25f720b7b745a52332355154e60577e598c754b6346b335b0195ac305268bae78bb4617807ca4666738ca81515bb041d43a4188003c52ac4ae4b3808d8c755d3e99d00537249d39d4cc02ed9f98ed4106895666c47538f79e30f5104adab1540a1fc58d1a857a1a4611257be37e0327491aa4b543aa6322ef7816a5c9a55eb3bc8604b15540b62c3405b861a84218211c20bc3d35a8a506b0153306fa98b9488a7841d85197c170f84c380098077e42cafdf1913df369f37f3291ec47289710c57f152b74572c23324f83618fd281f5e41976e77097a570a991b3bc623ad6331a1bb34673b1c328319758ed731ca2981b50a5a2cf8c66d31b10e88c95ffc27c3b6aabe8b207e6cb4373464b1b83f4a5a9806449bf7fb622360bf9f098b56729c5738191d57492b377ca8f989a87922a7368d724b07b7e36133620fa0735d60f5be8b51c19ed1655de5108681cb27273d511c643b7867516c2982a74f62e4cb759bb1f5f0808cc90e1baab60365722293bb07841803076504d00e6fbaae853749fc322e3458810ea41d832b35bf05a10e62a4ff8317b506b9af7216c445663c9061cc62914b0b72b5989d7d9c2b761c2fc5a28b5839bee5596c0de25c10a15776447e17770edb666249a2310962152059c5ed5738741a29e899072427891fb53606ab8b5dd06c005d239adb7bc368b10b74508c45c4aca726fe59c7729cc1ad617236e1b75c760e47815df33297c084429ca371c16c5761c9a23ebbcc2cb43ae9734ba9495d5a86a89e75aef50b9e73470d8d9974cf27a961c0cb2c180ff36140818b005f05afaabc86d8b8bf5c2a62f0632ebeca0c9c567514c9311ba6216fb13f1603c77656cced520d977ac75031044c8790d1b4c97dd38b2aa43dd8808a79e406f8e01503db8f7b51cc1e4265ee830461f41cec398251ea60d2c573ec59b4d28b09dc9446bb972f6d134e2e192e987153b39538e1f631bd81b2e65c2c5c68a96d1b78360889efa4c692b7cc374160e8dc485f47a676d77706e047d3e717386bb49cd942e4c05374b3a1cca148535a3ff1085102f4a7077b5f9c7b1a9ed651edb32691037f9388b672a662bc247beed215d51b414d3530c6b0631999663fd7c0e5da7e411c32c506476fd08a09d499ba3c27bbf6a804cc7e8be5c1f3f97d7aac085dbb3bd1076a69db89bc990efe59b00ca943ef8560642176e926af342b48e8002f6d1aa99b58cd013b03e0d285455786b54a4be3c581419730081361c04697b1b2c07df068621213c8ca6554b5982d5a1aaa113ed9343a56101aec68b838a37ef2c8a15d0504c672b278556b40c766c2066ac995caa32676da182545773881545cd58b71d3d7a02a209bc7407f420a830513b9d9d6c93c56571e42c8bf154afa060667a46d13cc542429c9d1a35be012cd3c9abc2bb7484fc89a4a83a20f7c2bb088793dab732ff370cbab614aa851fb77ce176b8f806c4f2e6068235b93d08c39e96badb37a457e8a790b2b8ef00b0b9e941592373fd2caa3ec3477c6c440d0daa755ac0ad2285754ac64b0852086112b0c9794f1657916fc173209a40425afc9b19946c529ca95154f24ca3cda5f9547c429836c377123c6ec0000000000000000000000000000000000000000000000000000006f8e54b993cf2cd10ba4e61693d9aad8943af37178908ab532712df5dec4b908d48790195fff2c19f221b7cd8637576cec18c29a4a51cd07c82eed4974c36e8c +ciphertext: 925fde875ae198cfea88c4eeb3a0091897e25a793672df1de3f24ab4fd3edb2cad0b07e698f35dc97bfd1d551fcace3282c8c3d8131857d96ee9986da7b79a02ddc6cfc9fb7f2b809a8e5511b1c1256dbab33e7606d8a5fc048b36f6ee53c7f556efadf94494595a549ca260ac9c45bf9962bf406610ca58dc286a9eeccc447a767b6db3ab009f5848558acea4503de747d72d43218babd6f68c091b4581f4e41f2e850047f5f543a02407e7331202b0eac7bed180061bb53f4dd3504ccbd3f298d96b43bbaf8f0c2545be54c59830e1f343ca88bb9c6812c66bfbb59a6d68298985767a73d34fa69b52cea98d95d8305f97c4d4fd643b56c60fe31e3c2ee7e938ac2e4a5da2297e670931c1dea5fcbe9cf118c62a76a461495f10f640fb416ff7bc2478c0e8a1356bb840345f3d43476bc4cd990eb7f7cde7ccb96452d055397ee402be2ce395a29a4f4061ec3d85b99f086341441022435b636028a1a04c5d787abe1c24a5a55653b7063b1cacdaee40ae0de77b4034b9ac0e860a90c8834b352c71e353c02b1f46b135fa68fa7a5c1c719896987d79f3174b8d0b0c28ed64cf9f2907924497e35bf519d519a9199a4dd68025992c6f466604bb2ec3d7b13eba76e4803fb73bb125b83413998ae86691a0b35c0054e1418898f435ab26cc12a12fd4dcfa9e80887af7ebb6c856a7fc010cfcaef9e1c5a4dc24a91a622fb7307521faff0b8e8e966b7b6ae849ccc75d31c8d700a3b6a9c3f646b2a88d1e9391c2ddc6c9ff15db961874c87dd94bf0165cfc8f719806539a8beb8e28350610461b1252872f0f3ac273b3366abd78d9fe8868dca1a5eecb683ab8b50ced8cf4a5ed3b721e0fe6b205fb191985ca745ff5dae0010493f8296b6586e1c96f7f23fcb4ac4dda15eab811107c977aa0a16439b06986a9027640cf7a01051934dfc758215d22c6f06866d5b871dfdb6ed240a73dfde43f7f89c0ce6909b54b0a633a25f7253c10906166f81ae91a1419028d6182c1f277dc7872b824c7a5a22bc7afc02afeaa9ba4c271ee68882397e6cec34a955cfc672f4e6f5ed870a35ebce97f34542cf0a162938c91922230ee3fe9ed9a166a790ccf450b80cb5f483c3c6ae5b2e52e907824b45e69e5ab38226cbd6519de995e1a62a910fd45ed189540e0b4058ff01edbc6ba4eebd58d55c0e33702de299eb53d6518254b8471f282779533eaaef90602e52373be8b519c56a2f6fac0953c0f84135715c5674e45d15804fb94d9e0525ab493aa625fbf73ebdf74f0a1246e1eb0e4e2e261b24ab81d8da6e1770634c747542450cf0a2af23507f8b6766a16dbb2e67b2c94859228b91eec6c59f5a271902b340320412ae947398ad102073f8b9b8c021f81f786622c3483e61f812aa76232e6f9453eae044c5e918e6e4e0e18a78efaf6cb36f7b75929d0036c44edf928d6efe1ddc87b96288c7c624655d302b98865978ed7bc779c800e6113a0484dd225aef29796c8ba300b3f48dd566fd877dfeb5d25f96da5d07e643c5d +result: pass +shared_secret: d4b9a0f77a52d4f8b9c95951257348d1931725c27eede694ecc09204a931daf7 + +# Rho leads to a matrix with unusally large entries +private_key: cc4a14e75a6b1bf87f11a240424645dee23657db9819ac274780c2d7d8ac64f2cb82530b40a078791a2ae70aba868253bdc3045b6254c4e29024894cd13723edc7461a37403609b48f79b8e8b1018981bca9f68031dcaf87528a6b065d8cb83c142ba20d68a728a3866ca88e6836cab209ab49bb234312916e432fa51152c763a62cc53da61480691b07a073be74aa6c2b88468bca8302a23d1d6405ddf4aec2f88ab055b18e2b1873862af6539ca83b1c270b6a563cbc7a220cdc8106e6e5595d63a26c0cb86ff11b48066721634b43b361b57a5b4ddb2967d232d34cb750026b362cbd20188260c6a856e9493ae09c462bc4c8663c7903112488b06b2a996dc6668e382e9cdc93e52a1a368b07d8388c9531afff0cc4c07ab423bac717dcc888e213e3a75d69a633f49745bab10f62592f59d53ef19b6a62f0b24216aaed9c91203b7ee65b9d097cc1e2676deeeb576ceb4fa4a867ab7310076a912a41292c658e8f75a98603612558352a5b7beb404fd2bb6de18c7ac838464b6399182536509624e1e25a7821b71edc57c35541cd115ec52c13a739c3de231ada741274272383cc78bc9869d37282f5980209543c92b76ddf99c3d45cb7409b5e44599b75412d8bd122460905c250a94dd4052c0b0a91c9a906aa3652180fba9212046b4f7ad14f7c304780d553f19487b8b7413de732ba1296b41a2d94983d4be93e540a4a4137a030629e97fa640c21ba5b7b5537a03a2a958ec3a888590a5c14a904dd74c83631264644cc6689a245f833530124f7d10e2596a8be227f270941faa75300bd731c145f781cce52247418595ef67c94a170676cda269e51c7ddbc63b6765b010aa061cc576696c84345c35c491d3e4626efc8b73dfcb481c11bbf8c79c6a3aa4e54c43a44141f5c35932486320567ce37adaf5241bfd8c44ec140d30823b58223b02742f3e2bf5864756d528ea36348c1c2293d8ca050b6307d71a20a036e0060697b58a0ada53eee5a6990a9cfe283436cd36a02dcb1a2b7200a267c3f133ea6423bc001baeca953515214e2766f066cae531212dd3551e22bbb1c705f21753ab60a70f364bf1949901d9a0415a36567614c1aba2dacf2c5435b4ee66193c5e461596719790aa792d5a09ac474343509ee36ca048751bd4b0c644b2b039b1320b2294df814b419c3ac55541be5cf4b93593aa4c099142de9e13699a40709d70070aba9227b6c14f216d434c9bc16112b8b4237f838340a5c317a618a91170709bae6a7c13cf96851f72a8761736c452df27758afa4b02fd55b3493b1bbf96dfc45ac743718978b7de8a017eca45dea633dbc417f856781c856c87516429127c6a3d335f162ace0982235ac79ba0ba68edbc1eafb9ed7a3597ca7a612a9bf3ef2b0d1d7c238e98714a434b8b08b35e3885e007501f9bc06e841921521d47999db3ac3937468a54b95b57a2bbe34aeb48ba57f0744021bc684456a8ed413b9192057eb77a5502dbc89c5964c0383b4c9034396da209279199ab5830abe9386b2e811c222a6ccb0cb23732a95676fd5c0376505943ef8bd67a95defe0af7cac395a743bdc3119b1a74771343bad21c53ec80cafd7548ae310293027d62960038c5d80656805b427d0b9167abb3697444af88a0f3eb48bf658be44f36b01233902291860215084ec7bb3e170e517c65c623ecf4a488f69923f9045ea18334d5c8ee847381b5a8903a6233796b1def36e46d343cd3547f4a757d82c262278432bd555fb5430e7f936affb453ac1a031c70cb1b3a8f3762dbe226461501d13d10052fb621be30b8ce63ce93591979863816397f0d198a6c534b55213d778ae7bb1a20ef1809ec37b08382c43e82b4a758458d7758d23a350538b3e524d27c9074d1cc4e3e1a17a6b06fd71178c5b18803b1c439b9e903a0d63018d2f765fa7426a0684793ea789c30435657b9aed58886cb8788e14426ea0295da18293024eb1a39eb99a20619a3e2db48a93eb90dbf42b84fbcec1f0b9571946b6f150ef5a672686a30e52be2d536bf3664550f60c99a89b81f3c911784d8a371ebea0b97ff50e2af68f822a72e9a76cf473bcc1cb81fe2a03051771b1c91f1e1a444ab6119c0a83b25a434fd598bc767315881aef9cb4d4c51ceadbb3b1a1142e0b87d5826b161233ce253d2adc9a00bd00e3cc21fff09abd919b54e09ba6b505601a358e50593dfa117eb2b8d7458745a25e7c7321cda0c432aa5bb41aab60eb3dc7e03ce4017b245809a534c3dfa49e97f4474689901e814a97fc0892ca04d0c00e3dfc836b36bbf74256e77525a031160fb3bf8ac31502c049d0a264140104c7488e36a46d23a76f4535b5902677cb98a5abec57b9357b0cb3b36b68349b273a2f8396e6c8594b4a32f0aa8a622378b3ca0426f44443942c02162907b2651ac2168fd1279b040192716bb584211df4ba36cb363b8c3adc39b410977ae3cac26c21470426837a43b821f65d8ee1950c87b4765a034aba1a35579f4148b8c2f39949812cf9d850d5e25be7713ce62ba31366737c03ad45f23e9b226d1835c5ab01c081063dc193630d72821cfa2a56d16108c40ffc483177d075b6a7a1bbf5cac7da0834d755acd10b9b9850a7c97d90a1061ce94efa4b0c0707339dbc7f160a45eeec022815a4494334254c08ade388c07c34e3a07e51ea60fdeb9b20b4b9afdc6c3c2b63e872aac9b2a90b798bc2dc8d585c69c1b33c1d51372c583e835b9ed561c218a2968c044051f8a969a7b2db6a7031d20cc9e024bbaab4385a3ae13ca264c25f6c5b4170b5c0da13044664a10f335ae9045bd6319abe139bb2b8b635bb06e2f48427e256a16a0f71f119230a9acfb19f0fe07c71828063f42a844a5c703aab9a844f689944ead511d8c97127d99429fc87ede190e0fa002261494076b7a10496dbe12919f585685733ae780eab3ac168287aae3842cfb637a94483f68170f6a3092d51b82ef10496a6374572a527aa7a7d1a99315953f625842ec0bc8851180b98cbe411453027c9b8a4a07fc3bbe32b897fc09e5e65a0457556a8b28e5b7c8b28db24e5431893953c912c195ca52db5d125c3f595f2ea75a63b6c83c8cbca257824ac60ce16bb5be02b30488974a22a66d37b19531e3cf17b59bb43d738cea25326dbd6355243ceff3caae98446927351ff623260472f8c7a715016ca5480af5cecc001c6b65f41221b16bfa61863e225709775b5e6393e4b71920c0c539c6bc5ec5c609466000000000000000000000000000000000000000000000000000000313af29c47d66acaecdafe1b91b95ddce43b0cd52be1d1a84428587728f01522a9e4a0d3487b6714e18bcc9d1daeb3127164328a19d5cf60822f3fd37a24bbed +ciphertext: 7c06bbeca8b58423e2ad420ec36064ed42c881e3655668f8865a2d643ecd1a4eecf915b6c64b37c98947f06c3ccc8e00bbd16017c246db88cc83f12c887aaad7db61b4d567c285841689169c3f928f1d178a0ddae50d8c46cfd95258667d6239c300595738defd2e806637ca46baa4c6c7b97f1a9b47d53cba9ffe074f88d104c4971d250d085b1800fcbd91584d8cc48e145fc81438290d74765e7ee8c1605e8048b37b9d22b050791fe008b9b84b7f23b0f49955e32c0eef78d7a3a0b2effe8b37d124e19d4cb6f6914204598a525239d9baa116e1c9c39c47f9f37f965941b2aef8519782c65f3ad3a6509d1e31e7efb67db21911e4edeb1f7e9c37b3f852c81d63a95e4775e3f2a8ff315a214680adf44d290e42ebab8ca95bf471140b9d7e03f5e9f97864289a0ae8c9a105e00409f714e413b69be366303b4a138ed51264ab0e5cca5f6dc9387c6608109e8859893efa3bc7384e9f418468b1078807dadb768e254094039d1b807d67353c8e0b5a03d28b8e41ffa0eb3ce0837a132144597908f7a059a097b79a1bac323757324e907b445d064e25c378d2069e7c5d671036871e4fe36705747635e40c6e835319e3ff81714cacc44515d671b703c5581dc76afca0b881f37c1ffc93f2e4afab1e8ac776ca883f3adf7f9ab99396f7e19541c26342a7d5618958523b81871326c357ad84ccc6d3574d97cbd875524e7b08a102263d80f318a48e510c22126568f76936c904c231700ad042d73137eec741c827a082de4a45d296745c55b8367719dd08b8295e38d8d3894b9f8e2f9b483b266e1fc71d6374353ca7d9ed1c6b73ab5a42f6abff7b2ba8fd484d1ae6928b5ea92ea3577be01dc1e88abcd0886eb771dca4d36e91c45bca4807c89736b7d6a927cf64b22c5f323077f5488f6044976f310b4b99f7d486335dcca60571157ac0e480a4dba79a826b4bac3dcb7327a33b16381eb41e1d39915e91a58750ceb71098ec7f1a2d7e44d4bab75bb7482eec277df206502c497eaa345109a145a4da6bed1900b680ad12fb028d33563bfb204ecf66e6ead587c5fe27f8a2eb0e27471925ea0f35eb9d5e53ef801eba3acaaa7790b105eb6128ace992668181c1d7cf203afdccdfefbac67dbd97cad05d499239df84e4cf7372117932c973957e5c70a8520f822be430758990296877df62069d818768513d14df0568be8e63e123bdde35036dcc69a98197f52dfbaae5e5e0cee4a48c67fdda605dad8a27651625c2b35e81dfcacd2a41a6d17f6d7067a67faf2479b3868673b248270f4a2d8ee26de9c787ce966ecf186c1401ad9d3bbf2c43b1d5de32bdd77f5433f4325427254a13985d733ab0863e62a4f3d484ab3f5d3b88f23049079143b058babffc8367cebdd9d2468d7af782979a3ef12841370da6ef2db03679e6bca0db72166c361adfbfc02234119abaf98d4fea8ddc6e8490c2fb5a1be4806a61bc7b36884cf4631cfd53138a23fdda11e597aed323748314282672473a1819ef2b9488f6744544ad +result: pass +shared_secret: c9d0cf3edb1172344364afec3615ba98477ce9316f92ca46ca5f42b73553a9f5 + +# Rho leads to a matrix with unusally large entries +private_key: cca22002e0b84e0c0fa98c902c2a30f0d9303a411db91a26576834d4f1645c181bba750c42ab6bcf401739f83fe2a4a3aa1a3f5917418003aed863875fc044dbc99c70b27758389fdd3cce51d5a13b21afe1219f0bab5dc3b15952591e6f80068b30870ed644de082476e7b32d3a531ff8631914c7a5c106a5acbf8672ab4a304afb71b1672cb281438f0fdb1db0f52948e8b0a1422ba10ac5e0a480e87bb844072e7a134dcce36f27274775fc6a8bc611b2a33cf85a4820e18b47b24188030fcaaba998d84a68424c07f4503abb553ec33b4be2af3557aae2797649da014dd0264d00ce74431e46f8969276b24b359c6750c5bc15a6318c2d06898ec5f473380a68302a91eb562fe4f10596012e5efa83f4c55a19912978a6583e4a884e36af1b9367e69ab0566c3cd8c34eaea615f49c094bcbc63d52a21d74c02462cb0bb7c77cbaa03df988b60cba880771a7c179315a9f6ebc6e9b8c90bbf17f737508b1691ef1952363e9499b5007a9c84838c2a149478e4be76c0368a8220b9a3ac68ef6560dba6b3f68257b6719551d83c38f73654fb392af0c1c2517851fc160c343cf826aca2c5614726c774c758e1abaa9ac04ae0742799060970909cbc2f78ca739c71bf6528f0695ea6175a4ac13555c3bcb9920bca3a37d363ba622666e54a4e779cad5059612792d610257a689975fd664dc5081d5ac4586c60e99b9a2a17ac612e5a794ca4dc097a71f72bce02b4907d69d801a22fd7b88f9e4ab284076037a0f6ac803bd7b243b835e51873919d3b77de041bbdb9c2917338f0c42a54ba6f5539d60e827387a9e7c156155d693b85701b53278139b29858785cb59788ed981d77556d27390285bc3f9408cbdc717895815d31641d0c31f2d911515f36743c40f4f3517432c620892149b518fecc80cd2d14c99730e0c940dec155930dcb5ef861b7c80b55c2223f7066b625c9fe5f0cb04f0bcb880119de142ce511affc01d483ac8db8b73e504b242315533d9c02cb64d15445fe32bb0c8e19383f82854981a9ea465b05c77cfd66d97a2b262bb37398cb4654a0fc8146c00b7608f061a216b9becec17f686b93d88309a7ac04c2447030b41ebc6a95fc52466d36dfd461bb046172f3b83fd10bf79c281202a60aed8467748a986100b97742c8d70c8de523c1d700489c391096c1b92654064cb7e35d7b25f29818ff39fa523c88bd69b8cf41689a414288c492f2a83f7b34a4d95770e6144b7731057c73a077a471e7b378fa48464c426ce5a6566e7c862131ebd5a1b3df013641a878fd702d167ae3f369361666514d98f325679c22aaddb56406e148e744960ee1395866acbe095542a6836571959a80238d037260fa053a52cbbc2cbc035e78fa9c306ebcb61ce33422584009271835ac3845524794f18bd7e1b4c034832fe68ba24a162815404f65c0af0944c9789b1d92767268c801a0444fff50399b3a192131e965523bbc2c75c286c96450c3f0733458bad7831205b1b4841a617626b4bee232cd1f220edf53b59bc213a055d956591fc3518a1974582f79a66dc8892ba71ccf7a5fae1c01841428525c32dd2b433445118559cb5447e3c851a0cb498cf99c2d359999fa3967dd722a23522b0d8cb522a67d63a75af305c05f3659bc496f1c47e410582a0e58bbba80751bb2f5ab71414051627f46a78f9708e3139f8950b999378df4709a08b9b511982ab1b2cc4d51d177578ef263c8e12752f914733023d9e8068d4fc1aac34106fa72197f6b4e4bb26ab29ab64d7c848f98ef5557ec2b35edea70b67c084193921d8cb52e132a24372be7046aa2af66696007e2e0830df1c7b4396bcc8f27aca46932c463b49db0ed88882f3a45901a4b96ee3b74e78afb8dbae7bc653be895179f208c27c6ecd60c26e54152aecbc13bb5ece39840574c56fb39fd2385c76d62c59a41b3311702d5a99e366467b6c4f6c252a95db32e5096e61d1ba872924d358b346dc099a485c3df72a94e437a82a6cd778888995c473c203e091309ba42511950c19db3acbc5987259bea952b5a549839f197d7bf64ca0772cc1dc89572a0e04690fe651a79ffb3dc07388c30c06711c6b25572bbc83ba868a379d54c6439754bcd67c9b0364ab3790967a062948084ab33a80ac5971fa99830aa7d1e9263e7087af67ab6a83ab34f405dbd72b3fe46e9f2114e26cc6643b6d3adb9de63090394213e72b64ecbb2242266139579ea9cab2e51868ef82ababaac38e7ca0b9554d665365dd8b0b58f3020cc9218b866955f54d9f7b9af9634ab995a0b5e234fcc78cd1594e1cb8a845ca0cdbc82e3fbb35414c53423b76875ab267a702d51710149061e7655a0168695053aa61b990fa9439883640e7600345033ca90678925b1d632962deaa0ef5642b870610be3387eda90cf608254dc2b000c06632331680e12e9b277597d07633a31f6445318ac7b9cc1b087cb58bddd30a07ea6e1b1429950b7e7efb1a6b88b037c92cf987c904268ce39cba4bd3c163f5a8bdb9698488152a18b02bc98a83fb6c28a55a018b48979660ad5b42281b8745a4bdcb02cabd16735ab1523916adcb031e34ccbf4c50bf61bb7d562804d4104d3f6ac183f447e6608acb0bc40a34ada4897e9a91c542571877931864b612cec01c88010cbe039d42540835422f5900c944c7025ba3365543536d093a68c27abe1175bc227faa590f8fb8ca9ab1a87366574422379fd8659fe5bb5ec76e179666adebcedc7b54f1aa9388b2907a4ba5c48441ad90499c64a57768631d4a961d88976c816adb897da7715a100c75099cc122f3b1df183385673a3bbc98cbb0ccb0b090b3517993815e3f6b26b984bdda32c11947b2fa5411004c2c41f2a646036b86bba618e72be7f97ec6369af5ca2ab2dc9493d9078a0c8598841385205177c80a3be42a31d1166b02cd1dd2871148033c794242962e8645ae2e4867a3e5c74f71a1d978379ad45f7fa5c70066cbfc4cbfbe05cf23612b2dea551cc52dd90a8468ec771ff071371544e96400e288a82e9c9eefe807d6f4903ac567741abeaec9707533b38dd8c4366bb33cf86f77272478e43a2d8061293332c8d805a4516238d5ad1934a9683655674aa6b6d91610d4c82e966d74c41dfe7ac18e993c22d59b2d286a0b5272cd44988510b9b342405757a25731729e934c58c601f5c311a244a24dbcc772088a20dac4c8410167304fda18445f6c6126b9645d4042d6033419d246968848e1f5000000000000000000000000000000000000000000000000000000ed43f6cfc5464d2f56a817a3dc74b5ab404164947d8c0792f6bc9bc00bb4d20253f53a49ff45b0ae588d417a63a599670cd391c5e9885c972593d09350bd7523 +ciphertext: 83ea5ed982570cd981b7430de924469d4e2faba68e03261a74f5114ab8c448376cfcd1b9cb3e72bb031bf0fefe772bc40888abc6acffc1d335d46d267acde2cb89cf1b3c67a139796d6a5763805d5edcebb81070b44ffe021b6c2b3c6c3d5dfb6d9e546930223ab0139990c6c5d6257520fe394a3aa30c6a71d47f415ac86b68eb8c83b131a3c5cbf051971fef5ef3bda355d3868e71ed8a0e2c6de8a759bc0c9e760277cc2c04c783d29d1ad3d3385accb85cc88c39bc8348f84dd8c714c5feda50b0770414a333136d6678be6ccbc5df488bafdcade883fbb310c99cc648493aed72680fe1e43c0cf523d3dd06417d29dd97c98ce53089505d36a476c0ae6d89b165c3ff6b2c62ba954fb81ac5782ae648a6802bc057c64fabd3726559ba79de9c144aaa525f6a840ed55abf21b37231c6c4cbb0110fdbcd0004f6f4974ec644c33a8aea34ef4a0a146f7502650c3def5a313d2f309cb428880502d3bdf39196a99bee296f9231d87972efd1159d3cf59bea05f0d0373a0e218ee5e0528e1ac7132440980d1153b9423bb2e099d05fbc8241ec1f316bf0add575a69982f546e99c64457c12ac83951ad46a5f024f6a61c91b7d3853ba1fa41d5a95f6ca811610ba3f32addf011ea4091ef217cdd126ec5e45cc40ec6f1292602b16c02718419646370e5b2c7c55c1128fc5d6c767cc75248b79e2379d40f91a8617e8a3db43c42cabb5cd39a7a7969147f30344c4b03de7034b12d8a1c3639697c97c4483e4191ca0fa81d8659f40e31b899b4ef4610644b1314ab2ef14b8dd8dc0082826fe65dc17211572cb14fa376f1b1784a00033c8dcddc44d6a1128a200eea668b6516ba42585cbb2e2be2a42148120013d0a9378ed7c185071fa8fdc09102164c63a665fd09c08d34104c9abb64e394b2e2a00dd834f7c7f5de16f6c02906ae37acc923dd76e530c78f2143396bfc371d14e6c48bec072b6b4e18eeae967456beb3f897a06eae17de174cf09be1435e691350632c0b1eac69dd66549c1d980fb147fa295ca6f21b5dc398e63a7c4263c75b55c85b4f38fbd7cc0fad84aba90dda1f2c9ca88d88905602096162486dba1ed0a8caa6b897c99e25934152a35fd0d476de09fb211abf36565af3744f3fb737247f5d8f172fbf438ed04422a6b3e17bdfe2cb0f09a1d57f1f1a113a768697f23d61ab288f15abc760feb0f5c5d4d5c0b1c891d3dad6089a3b7e54516b8f9755d38430312cf17b21efeeecbfd2719b62480225b9b3ee8940b1f1784ed5630d152635a1233acdd16e5489a9a15eafa7bec99aff25b18d9cac1e726c9e424773a7083f213cea53dcd310b0037aecbde1d584657f32cf548a6872c6f5a1a3a70d4db29ee3773291c94b00b5a596e1691f7752e246ca0960561cd233ec7d5f54496d34ba65b359a856315f02d16c990cdf3db2051b17bf283fed1b808ac79a9ce8250c806896bf75f2cfe76465c09360aba4c9688acea341fe755363abe41c0cba3ebad00c6c7bcc3f7ce091f87079f60094b92 +result: pass +shared_secret: 4bb6a6b27596869efae3d411c69c593afff99b1a703ee1f4ff3e0e7e9756e75b + +# Rho leads to a matrix with unusally large entries +private_key: 16997ff80976d1506b23c012e387ac6ca0a792f7481ac3c9775317ee3ca5267bc7180ca884d28bad6b5a05b045f33a9b975c6c98908d670550b874ca70a77424e48bf097256434b9d9b96c8b8149f02ba5bde9b813eb2b60f20da4440b4cfb05716bbfd86255a1e82941d2816caa7253e7368a4bbf4bf546f40b1bafc65bb994c34f7337e82818021797a431cfc664699bc22b92561fe3d1cd6306b89a36380920abbb466477549d1bf14364221c10f51fc3f7240de4c99b3bb3eeb9ac1fe12bb7c97888e8386da4a341a0be8f78a7b7c49f2184376c3c3784289a6bd9b6a03a110c228f72939b86c7a87dab3e093c0ade693a0e5331c48b761b070476f55cc45ba1dda14dfde01a011776143a4d29d48b47b0c6cd2111bf18360a7438f384a28d772177f648773b961a86637c946d7981a6b9f571a4c29aad07220fe081f1f18700f3c99ef28e76819f8d7c4c43d754cea21180c43357f3430bcbce1fe8952c691cfe9a7483026386a479eee4025a838df5c563b9f5a1882a2d7209a68d231ee82260a7eb4fc157936deab52618cba32772fa1440fb675220f4610d749a5b3b142f31b404d94d2bd816cc4773ec83aa1445a37b361e52b10960827e94171dce3c12cec80a1ec65aa6f117fe937673a78cd7767dadd3cebe0217f13c903ca25d6a681116b206acb46949b18f671a63fd2581a6c0978738460cc51df3711dc1215dcf75525d30559ab6bc52e16fa513753454888189348f045aee8a32e98cb2dfd708e7d42818115e5c61711a0c43e85a13657aadc24b5b30a04a43cb97bafa433204c18536337758c0db6154d4fac670fa3af148b52f24aa731c31f98464ca9bc975e97fd665710ee2c56b024fb8d7c7f4a20cc9d510f8eac38f96129c97b17c890417a21465d05abca02754ac3614e964f1a24393d05ccf5cb9500852cc9231656ca899f3538df30984475209f84ae8b99983e844b06ba4cd8a9640a513cee439ae13ad57d3846aea4fa165b68c6c03c05c835bcc5a63d45cc5568aef94ae7798bf29aa7f38e275c902236e63872a274e4776cf1928c492036166d04eed9ca64aa16ebb4b11fc3ba802c6b249e4b53f90112b587d36c6bfb0733a2ee3003419026a10a4c54c2be294b2031a48fe895c2c9920b3772f127338a865a82c3262dabac113c235d433b90d401f5557bb1bc68359020f75742c2008c2bc8862416910f53772a55376ef05a5eca853eb1ba5ef841f243b8d98b11e94483ad7e72fd7360a3641159e481ca50971a6e8aee73a0d4f24b25430ccc0997c631308fe2aaefcf79af5d2045932043d95933919b21ef87865b8550742a513d67af756c5958465f582983a777e9032ac43164e552358861a0ebc458e55865fc3545fd01b0e7565877ed3229f8267369c319abbb017a87ca662c635519ff418682af39ba387aa38ec37396b4d6ab505219314f4448d0f572f4330cf33fa1369872649c922bcd228c294b3213a216e59752072b8e026700ea63061855be3d6037c0cabe0c21f5be948ee4b18dd935ad358a5885a0331db2e496995bd47c3ff2b679e0abafc02804b6117271a2b00e33bc06250fb30ae2036716d30a50aa07e45f244e1f0100d749359b479b444b510d9b6d89b7001b237f4a34c57509f69208c7e6b956144bedc8b2d19b12c1baa725dd106f5418ed943370050808ed2636fa634add059541a7a8c7976b0990e59c20c00343d1c37bc3ab587e312991bb88a74227651b340346c58bbb174ac18c204f37445681bc5905354d834f86016d0921219fb467d829daf24901815666d664b8c4aae307485cb95885b7cb9125a14d4d988d3a42c0816ba7ef14de9b622e08871988b8c02d857626b65065551d5bcc81112384f979cd8d2b9ecb55c6afaa700e92e3ecbb285c01112a19cbdb90b8af135b235914c901e2314902a43c939d065481128f83ac801dc2fa69c912f2b69189736d72414df12646680c9c858a9afaa28b994531960b0f2b82fc6b9c6f10706930786ab5c6b0da61ae813cdb7387c27324499b111c6ca5767056070e608cf421af52cb45a842da82560dd86acf45a7e70245e0b535f7559a9fceb9369c44032c09302438cb4670925c7a831d52f083a7919e575be844d9e6a009957c15e6c5f84f050cc4801561876f9f483ded505b3c77a4a97788358801f012b59d716fed55975f8abd3464420d849d89c16dd2a95c372cf631a93a8897ddda2a038070adc2a97b5538778c0215cea399deb8279b2ade6c5ab84bbc8c6e181c091b7002a4d5f395bb60c817e03966b63ba76e88fb05b79d126ab0975c995b5bb2ae6550af78d80b96af40c9514f945d72b0c9602412242c81b60b2df97999fbbaec0404056195879535041231803aa7cf064b5fdfc8b86344d65eb30e52cc0d5b86947b8051ea93008d789914493b58abbd5395b657560f5823c387574db554118d06b26ba14b9660b4b390f8b828ba8a852870cba24a114a68094cf0168b721af8f0998e599b5db2135a3e9360b5754dd49155eea830f0035c2c116dbc9039cf69034c505ed998f8460a170eb5f09786d902664c8135ad77101d0b802248b6f3165a847b5c989131d7ee3135cbcb48b3cabfd100074c00f2e7bc85d4c84bec8980a6920e6f318a4bc805900b548fc7d98316c1b3c3b49f6c5d90595ff7a7b56465385620544aa3f39114e53581e851849726023d953b5df56b87be98854b253a39297f060449fc1c02725c3442a4ed8624f7f6abf3854cf04166b24c3b5a38358bae933ee4777df09720415314b152efc0b175b664c0c0a3521cac1817314d1e69fe03b351fe211c4c44639622a73a4547ef52d46b033aa52a79182baf49a8808fb259c048a04cc03f8a1038e9112eb30965c797f90c277b3549df4f757526351bd1a100767b4bcfa7489c17cb181b707986b9af85e766aa1f99b08aa2a7bc8a385d294277cb00d705b4ce2583e61c16be2b18445d051d7f0cee51703db3162bdd328cf0b0b24a424bd830c6574091088ab746a291c737e8cd595d1b51f9646c7813a8991f89c168489d1a3b61a82466d98ac9de55b4d5aa020243e638328fedbc93d341e1fdc7eb861bba3783a57c86a7184aaa7d5051b7018f3f18b40b69fd7780ae9609194db70123801729c561e973dff3a7ea5ba9045b24e5fe5bc63ea858c687184a8276612c80ab600cc37699583b9ffa8c5a1b7934f3c12873522dd1c4f976b73121bb79766803d247de1dff18807000000000000000000000000000000000000000000000000000000c69860913068eb936405db039e82a2f7fec48a8ea570bd538dc9741a6aaadb02e366c059f5f26e6dfba8db203c5b27beca8fedd3de2664f6bd5c3e2ac9fb3891 +ciphertext: d4e89c9a1b36b648551ac2180f2f59158514568358f66a6fadd88492a0e1c122d1d7806287eecbcc8e8e6a463dc1c909f13842f734b9eb5bf690291c9d5b7836de8f4a28b8242c21131c53ebda4002b329a1951f469168ce0199f0a1d2edcdf3e6566f9e638e5a1095025cdb591aeaed8bb115ca3a1f1e9a8e911b2b9d3838608a27e50018e9a99e65b04adab67a75db892676c28ff41f118286f0ad2f5b650baf9441470db659e262e64cbebb4e808b1e7cfde0ff5c1ffbe1336beb42155fd9cb1cef90f306f5aa2f121b30b4d6091b19f37243cc15df2a0a16c4b5f70ffba99456f535af0eb0df80771150ff28c7925da7293878699c00f5136c340d1d06460b0ca7223f37ca553be904ebb7a7f41daa8288aa244202247eb8c35b7bc6d1dc8b95c220319532dfed22dc5d0f2f77a4bba0f5ee599420a94c446d89e3e8532117bd8ed0f7d9cb1f0a58a92bbf30a9d7c16d5ebffe16f39f682c18a8fc2ec0a551370c0e3ea706259f52333f5e86a83fb60b9ee3776f08e3f85ae4ee66be8c653cbe25e316e6ad33415a13e5139f53480625f09f593a598d6fd864729362efc3d09f5b171b0eff76cf860c8fd80583bfcae3bd7535e0270d622c2c09886bf9fddff6dfd045fea3259d26f17500b6b1e0b5068dc06a510da4809fabd615221f672f6d1d220c22dc080c9dbd7544ccb3369deccb76287c77e1a2af0afe133cd19325e6a77a8bf96fae6dc0381bb303815df4de480a9f3f97f1baab7774d7d5d9eda6c5927692fa2277934b0ebd30b4e7785f0c61a44357f49adac4430fdff3af956904b789c2dc9bcf87eb4cf93c48256ae13e90a1bcd713f77446593837b81baa6fd7050455d69a16b429018390a47e6e881467b57a2cfb043ce5a8cb114c4bd916ffe353579b599994efae24ced2dcf1a2923a0d0d8e771e7c230d887e596b80e01d84c908ec9fe81270f12e2f9ba2d783b1200fdb106e9d340c21667b722564a0cb4603dbc2193d3b455e06cf8c1d8fdf3e7ebe16a47f0181407f66c214379a5f336545818782835f6be2e9ad89f180ae0747067cdaff1f3b9386debdf3f057cd02f6eb00ecd656838e2ee5bdb99d6260c0447707d747bb6ff33ed65c2b3e22074ff25a7a0933be3e9b51de95d99e02ed4204f5ed8a6ff864e2f04266c9392c6feada8805ad44dffd5abe8d4262ddf6d2b1b4099367927b0bc075cf1d1d802f2d10b6d31d7f8c48b043340cae34b5b7c2f1e9b5043a0c2a977c51ff038171f8c81f04b284b2ee262befb6a54bdec146b84dfa116542bd13123ea79e4a660e44f3d23a0ce35ae4eb7b45611f87ae836081742d3cae6c65a0f93514bfe118cbbe7011e2a9502b197ac4bf31fe17016e184657b8dcdd62a223d1bd88b98aa0bc200ca91e123fa956b3d804b2c0ea139f934124f8d0c3f4412d8effc554f8364b0f351a789cae775b241cd6aa6d15251cbd28f0f85fd4f2a48fb467444f2f759ab6048d33c27832cccf9cc45fffaaa17a6f5e4b766f861529cb1a0641b6d3854c11 +result: pass +shared_secret: fc501515ab8bf04e3cdbc78c032524d6b9ac385122bd2324b11a2ba812158fe6 diff --git a/regress/lib/libcrypto/mlkem/mlkem768_encap_tests.txt b/regress/lib/libcrypto/mlkem/mlkem768_encap_tests.txt new file mode 100644 index 000000000..76b0cbdef --- /dev/null +++ b/regress/lib/libcrypto/mlkem/mlkem768_encap_tests.txt @@ -0,0 +1,1840 @@ +# Official test vector 0, seed: "061550234d158c5ec95595fe04ef7a25767f2e24cc2bc479d09d86dc9abcfde7056a8c266f9ef97ed08541dbd2e1ffa1" +entropy: 147c03f7a5bebba406c8fae1874d7f13c80efe79a3a9a874cc09fe76f6997615 +public_key = a8e651a1e685f22478a8954f007bc7711b930772c78f092e82878e3e937f367967532913a8d53dfdf4bfb1f8846746596705cf345142b972a3f16325c40c2952a37b25897e5ef35fbaeb73a4acbeb6a0b89942ceb195531cfc0a07993954483e6cbc87c06aa74ff0cac5207e535b260aa98d1198c07da605c4d11020f6c9f7bb68bb3456c73a01b710bc99d17739a51716aa01660c8b628b2f5602ba65f07ea993336e896e83f2c5731bbf03460c5b6c8afecb748ee391e98934a2c57d4d069f50d88b30d6966f38c37bc649b82634ce7722645ccd625063364646d6d699db57b45eb67465e16de4d406a818b9eae1ca916a2594489708a43cea88b02a4c03d09b44815c97101caf5048bbcb247ae2366cdc254ba22129f45b3b0eb399ca91a303402830ec01db7b2ca480cf350409b216094b7b0c3ae33ce10a9124e89651ab901ea253c8415bd7825f02bb229369af972028f22875ea55af16d3bc69f70c2ee8b75f28b47dd391f989ade314729c331fa04c1917b278c3eb602868512821adc825c64577ce1e63b1d9644a612948a3483c7f1b9a258000e30196944a403627609c76c7ea6b5de01764d24379117b9ea29848dc555c454bceae1ba5cc72c74ab96b9c91b910d26b88b25639d4778ae26c7c6151a19c6cd7938454372465e4c5ec29245acb3db5379de3dabfa629a7c04a8353a8530c95acb732bb4bb81932bb2ca7a848cd366801444abe23c83b366a87d6a3cf360924c002bae90af65c48060b3752f2badf1ab2722072554a5059753594e6a702761fc97684c8c4a7540a6b07fbc9de87c974aa8809d928c7f4cbbf8045aea5bc667825fd05a521f1a4bf539210c7113bc37b3e58b0cbfc53c841cbb0371de2e511b989cb7c70c023366d78f9c37ef047f8720be1c759a8d96b93f65a94114ffaf60d9a81795e995c71152a4691a5a602a9e1f3599e37c768c7bc108994c0669f3adc957d46b4b6256968e290d7892ea85464ee7a750f39c5e3152c2dfc56d8b0c924ba8a959a68096547f66423c838982a5794b9e1533771331a9a656c28828beb9126a60e95e8c5d906832c7710705576b1fb9507269ddaf8c95ce9719b2ca8dd112be10bcc9f4a37bd1b1eeeb33ecda76ae9f69a5d4b2923a86957671d619335be1c4c2c77ce87c41f98a8cc466460fa300aaf5b301f0a1d09c88e65da4d8ee64f68c02189bbb3584baff716c85db654048a004333489393a07427cd3e217e6a345f6c2c2b13c27b337271c0b27b2dbaa00d237600b5b594e8cf2dd625ea76cf0ed899122c9796b4b0187004258049a477cd11d68c49b9a0e7b00bce8cac7864cbb375140084744c93062694ca795c4f40e7acc9c5a1884072d8c38dafb501ee4184dd5a819ec24ec1651261f962b17a7215aa4a748c15836c389137678204838d7195a85b4f98a1b574c4cd7909cd1f833effd1485543229d3748d9b5cd6c17b9b3b84aef8bce13e683733659c79542d615782a71cdeee792bab51bdc4bbfe8308e663144ede8491830ad98b4634f64aba8b9c042272653920f380c1a17ca87ced7aac41c82888793181a6f76e197b7b90ef90943bb3844912911d8551e5466c5767ab0bc61a1a3f736162ec098a900b12dd8fabbfb3fe8cb1dc4e8315f2af0d32f0017ae136e19f028 +result: pass +ciphertext: c8391085b8d3ea9794212541b2914f08964d33521d3f67ad66096ebfb1f706424b49558f755b5625bae236f2e0079601c766f7d960808f7e2bb0c7a5e066ed346de628f8c57eebabbb0c22d911548463693ef3ce52a53f7ff415f00e657ae1c5a48fa5ec6e4be5cf462daffc84d2f6d5ff55dc9bbe8bb0d725ec64fd4cd4bd8dba0a844e8b5ce4b6a28934d7f7a050991fe185b506b451dabfad52d52cb2114ca7d9a5cf986c8fdc1bc10ec0c1869e50c03c55a76192a1049aca636ba9020bdaa8d0f58c763b0b89845ca06d4c4ddc21433e16b9c62e44871fdbc05ba218af871fdd7dcfa464e60faa5265264ce1391bd9a8c5faa7626d5f159b9805b975710a3503a0b858a11c6a647cc0e19ac88b1be9056c95b4d2087d0951d1d2f4992491117e6347794ba54571ec49bba71af3413d38a30bf5872248d1f6d07c86baf782e73d2637f043d341a00921857d8b21ddf3e1d6310036ed27af49e5de1b900fe4de79808ff29f9570859612b15adc01fbb265b305b1e3a12ae419da5b74261fa284c101da3d8dca8b2e4521aca571ef44a058e844ff32b16d5aaea05f7f3af8e2ab16222e347662eddfb891d0ecc2a55c5638f9dde92d9a3d544a5f901ac501acd1ea6a010201fcb10ad702c425a94bdf5890d500a2a147eee1d1fcba8c3abe7c2dfe70f346f033d816a0b2791b4f0b2d956d9ee5971715399a5688302495e2e07c1c8c01527184bcd0c208bc159f2e13318c0bb3dd24a6a7fc849f83385ed4dba07fe1d7bd5640cc9ed5ccfdd68763cb0d0edf61b292177fc1d2d3c11dd0495056bcb12558aebcfddef9feb4aebc57afd9023c65cfe65a24e33f1b00111e92e63e011eaf0b212cf95743cd07f5189ece1f205b7f6fcb2e6b1961b5404cebe47c8cd13b8599d5b49e6d87eeda36e9b8fc4c00635896aa2b75896e336d1b612ee13db811e1f07e61748d920f4865f3f11741399dc6162c91ca168a02329dff821d58198712dd558abb099b3a0baf9da1b730b2aa73bcf58d74f357b06f7211c804b6c8af16ff3509fad1d35b14bfdced7db8a6a25c48e5956480724daa057cd660b67ee3e472574182679d485838a6476eac02141075c812af7967ba7c9185cc2abd2a4545b80f3d3104d58d654a57792dcfabbe9c0715e8de2ef81ef404c8168fd7a43efab3d448e686a088efd26a26159948926723d7eccc39e3c1b719cf8becb7be7e964f22cd8cb1b7e25e800ea97d60a64cc0bbd9cb407a3ab9f88f5e29169eeafd4e0322fde6590ae093ce8feeae98b622caa7556ff426c9e7a404ce69355830a7a67767a76c7d9a97b84bfcf50a02f75c235d2f9c671138049ffc7c8055926c03eb3fb87f9695185a42eca9a41655873d30a6b3bf428b246223484a8ff61ee3eeafff10e99c2c13a76284d063e56ab711a35a85b5383df81da23490f66e8ea3fcba067f5530c6541c2b8f74717c35023e7b9b3956c3ee2ff84ba03ccf4b4b5321b9240895481bc6d63c1693c1847852f8e97f50a133532ac3ee1e52d464 +shared_secret: e7184a0975ee3470878d2d159ec83129c8aec253d4ee17b4810311d198cd0368 + +# Official test vector 1, seed: "d81c4d8d734fcbfbeade3d3f8a039faa2a2c9957e835ad55b22e75bf57bb556ac81adde6aeeb4a5a875c3bfcadfa958f" +entropy: cde797df8ce67231f6c5d15811843e01eb2ab84c7490931240822adbddd72046 +public_key = 93c140f6c47b7e53b96f72bb18447d277cc021c144a0f7a35e30b57386a78ac976376262320a5e7e1cb42e290de684462ce1067e920ee86c32418b130a5a41a0e8268cfa7e0db2b441cb927d7897c42b1d50f9b32868a35a2c04cfe91040e9a9208902f20c477e1b1ee5c290d2e5244eb1b4b7b4c6ad074533b58d9914a6aa8829f96789f5cb87607569983003f3a2461c33c81a3672af5924c4ba37e6827fccf86d8b4103fbe9c0f6226dd0a2145a6b7aec76b186466f9c67bf169039259574456497140c8cf4ac05091973ac8c08d809465785a677a032ac09ad1d666e8c48462813ce5ac75f184b38251c30e362b0e2501d6800c8ad103c8b773780b6717cf15c401139acd54b1598b2b7c79492a86631090268c70d875bc040cb2b75a386fa96b092b8cbc25c47f70aa76cd8b9afc12b42b536e27c5578831a96dbbab7138c3f247e955a6c08b4407d4708f1914bfa48af4b28533f747b860b7076c028e245c9727b42f3248fb0408b3ef0c4918ab76ab96daca81afb1211ab3a0329ba1a5b069a68934c1ce84c2f72839311257fa19e72c62fb5686b61416caf8b22d2b26a6dd01bb7387f88eb8606980a5e2259cbd56ca1ec051cfc66f96239991a2360d75dafa1534c8a05ab9c95e2e586853714600a3455511b62d94525d8b1a965ce69f986731888d1ecce536000e4863322a83e3c8475d9eba5414a65b0561d24a7b09dca6ffe23836058bec0a85671641008c831233c7890783dafe8c359a263e796869118c4e74002dc3b0ec5b1c4ac641bafe30eb2bb743713bfed2c1e79c4a6f46593006acb35f7031f194807b893aa7a9323162168d384d0e96f2f23368626a2e027891ac94f12f30a044b85f0322ce2b16517d36aa3f23b5f391be394b54ddc28e5a9775372869a7b50b4898c072c0669d43c641a3cb5e8c170ba63bed6ad1008615201305e292e1c818e1ef64f3e0c52fba67e7249c1ec4a140dc89ce0050647f1c19f5897c77b9059040b4b5b4282e0669cb4c658f48f67338413c92fc7412e444bc635dabc93c51b030784f21461dca210cc6a54fdc25bba09705baa77c1826636b16644a5ada51270d8317a787abf53192d40dc765bfb45c7dcae58481af3a49fe762b90bac1f6f69a5de8045981c67906b9f692625fcb6a4df2641688aba61fa49a84b47c96661e4701e5826c1108069c4b9c6e480251c4b021d11cfdaca12bbf9c09a0234186668e389454ac4046f5b2468aa2fa9b117868574e729574ee57ea7495af310627b85916d6b4c708374f9fb0c9c3aa4664c6651281d8eeb98132c1af13a816ca5b869f50b50b291efd466dea090918630c6fc77247c458aa82568a41dd9d4708af3bbca5a5716447e8c2c24ad788a8632473fdc4a257196bd2b549091176fe654d3694e10a118f7b66d1cd5af199b6e90b3bffa88a92e36717fd4bbfcc78b0e08634bc080c86885c92c8ef67aa4933c7df097891369bac5fc5d0c36737aa60971310adf02c257f76a7a7b3f7e132c2a71c52ff4affb6846391c0868241a3df13408d419a78bcffd49619b03a192c683900a244289c9f7b4564823900ceacffd9a9371260d5e57a8271196f4759eead0ceac318966e76f68de95ab9db2ba4fbf83c3b27092cd339cfe48d5ca0ba11591d04566f4ed24a5 +result: pass +ciphertext: b3b339d73dfe8e3db262cdea792b4e3ecd712a75750a3b206800f11116637b58bc75ea61bd74070d7132309176608c33989fc510852c0f8d07e9862b79b069cfb3e5b78f277a74dcc832ada24f7d522e53a7cf16a7c7d952ed9f4dd4be4910d880e2e7c5b23c6cf9077e3d350ed3e7bb54ca7b39a9f68e98d2fc844c62f3eed092c8c008e4c2a28b3b1d9f34488655741ddcc440be7828ae39f25f52f57d8b1cfe3967af165e5affaddc8a85cd4939221762be2f71155c780ada5103976c77a76f838bc52a72544b22cfde6b6e843b4e552f1ba47419a8a8bf53c388537c1c08c272a02f4923d9edcc54dc767e6613c6f832889ec05ca805fc09e326d242517e91607005af03cd1acb242e630d6c20499dec187d8e5f6d421e2ceef7e3f74b751214fd58b6583bdc5ede65bbb643974d5cb45533f0a733a3353724e2d7e6821d99d317eec8781d3f1e03528fda480da8cd8e8adc51585a14acb5da154a68573b0566e5e49a53b4cb8061cdc795d13899032d549ac8f7c35099eb2ba0f0df4c9558444f4fe5f88bc46c6fca1b257c62d2116efd1c8cdef5717068405201c086da4143de277649f32538f537f8bf13a65c05747cd44f740736966422bd247f4be9a05acbcce53b9c1b0019096f93dfa86948d7b01d10952926b7a6e0e51792f9be6bab620b9fec660a2348818e4b47cd5934ffbcef5aaf20c3acf9494ae4df9d23f62a2571eca8d37fb1c8d29d5df0fa30c2f17fe3788032d124090dfbd000155ad8deca87190d66bcc9b1e3de392bacad79dc62be0d96eaf448feec5ef03544db3a782e5f9ffa20493d5ae6a58481d23cac7d3eaad57887bdd706eebf15f505d07e3592766710a658513598c94d2ff3eda5b5e900fcc9da8c012633c96a8b9e1da548dff60b1a763bb3f5ada6eea3290a01f7367f7c2384097ebee2960d904141b6c7bb30bf640350da34b9516d9f73100476e7bc077e0f88dfdeeaf9a2855448393cc26e14ac50b67065bb3694933bc64c622958a11637f9c995e17f15cfa663e7121c4ebd5fc1e153bea84c66843c90110e587462c623dc67ff0da5dadbade9b9724ff804227e188a00aa6c70bba00aaace8a035b96a595ee726fab666a08a4979ebd1e230a9c48afe7779cdd9f0d019e2400db9f686011ab05c4109db273c236646b481ac7251fd70d23188f943f6f282bf059279464645c9552de905996f2ef355a4d307448aed53728b490baf108a7d2579dc46e44334d1d99f310c8c953d4b3fbbf6b15a99b263775a1f9f0c0fbdfa260415ff4f61c263362c95fe9fa72767b8625f09b91c393fed48bc8f628ccc76b5ca49d9c01223ab4c1a9f25ac97ada8783b576575fa699140394e53daedf683ee53172ca9ff70c27a3f940675e3239e44a24804098486decb72ac8d41bda6e2d3585e2edc1e47cf1999fc67aa000677ba66ac22576ea087b6e7affd5c1617b3d94fdd314d17e6d37f9e5347807fe21fc5a9d75b3a25541cfe4a2d2c9efd00859d713cd6f67314cba4cc270fdb2e6 +shared_secret: 5f0c5d9f39d3e724b5a2bd54e69e360f72ffab5d4d6cc5e572fecba80acd4796 + +# Official test vector 2, seed: "64335bf29e5de62842c941766ba129b0643b5e7121ca26cfc190ec7dc3543830557fdd5c03cf123a456d48efea43c868" +entropy: f43f68fbd694f0a6d307297110ecd4739876489fdf07eb9b03364e2ed0ff96e9 +public_key = c02b820292c46c8a8a92975a2e27292cf893a7f54a84a67022845d66236dca3c4844604b16879e849c7fe3475d03f82323d822ae2cb6763842a319114f5c77754613d5fbaec05aa801a03ac1989a725337ea38a668ea65cdb36343ec3d690ccdfa47ab1fe473247bc488d98e1e33175920a0f2272a03982c8386485bc2c4245884f1d941750a1d27fa85f0067f5c377532304261aa908bfb950894cecc1bbfd197ced78a641366b9199a4ba190446e03ae51549be7959c87a629abf24cbb7a58d01cad4949734f797ae300a78f45c70f668506977d7c85a0cf64c700a5b1f7879801bc3ac75584302c8bc81c0d7f6b237a9400681bacfc7192f9c653f8a9551f796ccfc262d3a438a551ad74c80ae9e3b5a7f12c5204ad44c21f488b7824a4b1eed79da9b44e60d8b225490c062b924da04f0ef0252304cca34bb4fc70ce6b1800fb6c5dc771bf7bda9e9db2b6c6046a1672c6f6f01a0406b903411c271b20e139a69138adfbf50c1134ae0899c166b1b1a5d818515b0dd94895a253059b167630f3a0dd3c64cf257cdf93596e54288c7a4580404ba8da541abb1b6aec7e530c58a61a64d9b9bc32d870bc105ef7063b9a97519b871a60d7aaf8c193e948c267c9c815063d6a603ee8d2249b386d94395804a9af8cd2184800c7ccfbaed98c4f9f95b70145b448387183f5cc8f4b5f35a949bc74706bd03db7645c2d084624844a55a0a5abb9244cb5b8736b835b512bcd912361fb660479b2c51b99734970808ba5c6db0169756cfc986dbda94915563c15a109aeb77c01a7cff55c8430696d6e83aea5d49292462d725c428b984d15e97ed4a76403094699e1336426b54281067e675788b3a4fcebca4431bfdc8a49c215ba11004a341516018419abeab2374184b0e2b7b7a54efc678e812588960a0d009418e5289eddcac582d3c73dd93e1234518da003648853c5b5a24b389e88300aeae78c41e62e5ee303a56b548375757cd42e21a7c59ff29a133868d1d0784197573464292547161b3a8689dc0c7de11139d407f0b5784d942278d49462965f21f72cb992add160620f6a82f70aa9a830190ce3c9fa8015071c2877483c2203bab7228ee2f37bbb17c1a4bc499ec249ffbb42e4989905a878dc873e456a7d9db946572936d8d81777d1b992c00db12a35df1348ce8c9d1a02898c7403d4107f45a6bee864375b623d30e0c191f8ad835a3f3709362cc763d63c2b91649d722825402c9ec1b1c7aa02b154d69e39da196e72a25928212fe0711bbb2fd2f9550a361a28d4295bf0c036d7b79be9130232060206c919f8b864f03d6f02348ed2c8001a30124b40c6d61dc3e18bcb27c60bd1324d8386da99c3e098cfb94b018031a4d6aa5788d27a75a67b630327add804adc21642d58080956a03f03c8193ac302c92e949cea31721813390382c814b2c5a6d34a1eb44b8b62aa77bf88b5067455fc0c7be967c21bc281ad38ea6978d228a83a820c57b4039175c910a450e300101cae45b0736a4dcbb0e6eb58491da31de3b65cba0a7c80c7815f677eea7ce5ec571bbf7c4516c65e4b2528e160959c815e1bbcad0a29ce59573d749453d9b6b52a951de9b889c79cb355c345631070b7c30f1934123c9ec68ebb324d254e5d246b14a0259e49b2ccec72b8c494834 +result: pass +ciphertext: ca1e236472b3fec4e2afd4298eade05a462fc19fa22e6805b386282edba027bf2de8d13b825deb40fe10cb8c79be238201a81d7ec48400375019164b1515853e69144453f1999346ab1ff386fb3eca8149b5a2b7acd49a165e0cb7f7509e0ed5d9f279637b26570b16ff34f904a42244b15af7d3083e0cdfe3c03ea42f73c75de1860981b8a25756bdb18feed4bf461f765583f0772a81d40508498b54ca8477db0d7067a0d9f7d00fde68644fefa97c5e21e3f3ba7cacd67cfbaebd58930d7665bab99a94da09a2572b5b5232a366e556c766aaf5807004c6d3725ea33172eca8a6dfeb079b0de46ea9af3f8627ae8555ea18c0a0c12b211826768d8a8a1e57b1a95c9d98bbf1d5ec07348ade6f134712dfe84e434fae1fe9671fddc8bbd2b69a15704e8b0e62abd5492afc1835bb24013cdb83f62a68b329e8b340b904bff04b4eae972df87bed79df39313556b2cdd348f83f5bd248bbeba7ac06dac17156246083238f988cc196b5469a163d602b70b1901fd240b480d67484dc4c0e1280bbf6e528a4f3b6c734587e33a1f4442ff0310f6c83259f7b94a162a4a2a49e1047fac23a245b2db3cbcc94192d7fecf40eac4224ed4067533e8f2d468332307fa9f82c089663781851a2c3208a23cb089ab744f4aabc1c21717388bea6fb01789c4d77fd4b2e0395c841565cd8c9c2167ce483a363006583d895deda5351c1cbd0e182f59782e5e76ea45d9e8f38d683de8865e96e8360e811559c3e082edba99be598c7ced451c239e081183fd0aceaa3f75effe43a7c8700b1bdc51d0a5e1e482237d9bc8a301b20e558df1f8d520163edb8705924cd6b8971bbc3923f8067964e6c99ee3c60737ef170f5aabf6261e5b2e6430dafa73ac9d6084ddd0ed62ddf2a0d4e064c7a04260198b94fdd02ebcf817b511bd90f6243cba7ba91a8dfab6aa8f48bb67696f575da25234ffa79fa53a4b9de2ed0f15e9b20c52b764e26c5d2d0b13cd3ebdb5d560b373725556c7fd152f3e4040cd7d40ac9b4f4c49e3dc7f748601bb4611c14e03b37ed79658e2aa69e0b47f42710bed2e4ac6bbf37dbeec69a34b6045126a017732695c5474de44aca2f2670c0e36bd686d9095435359d173276ffd07c25900037c2a4974e6af401dd55523042bcf36ca27880775cdbfb6b095cf93b491dfb0f2fb0594d7d9e46a3303e3c0da3c5d39c2fabfebe6a3eb9e7c2af3022aa5148c84f9cf8f4899697c781497c70042030918353e56aa0e4bac6fd3efd8f41df94d5668802c9f63ce6fc51bc36820f0e60b2085642e502d093d3bc12849c553e05574a2929659cf3afa0f33eb117d79c3fea450996738b38ff162f77fce86949c0553269dd8fa3873615e7b75dc5429799b191cf209202dfe18230860637769df426881db849bfaf585180ba15f67410908ee6b4056acde46a1ee862ce0c696af377efca2a2878d0922bac97a53ae95cd5160f07fa978bb57ef8ed3edcf5ff907d25f50f80e488c7ab79b11333d894772a57d1a20d0c6d7224 +shared_secret: 7f3bcc03a35a0030255264914e5d88a0c93611c7ca21f0609678a88ca42ce1c9 + +# Official test vector 3, seed: "225d5ce2ceac61930a07503fb59f7c2f936a3e075481da3ca299a80f8c5df9223a073e7b90e02ebf98ca2227eba38c1a" +entropy: ea74fbc3c546500ed684bed6fe3c496d3b86d2d6dfaf223969b942e9a8c95e85 +public_key = 25c1215d624156828088b63da622afa9fc5476b3603474b24d8394b93ab494ea3eb0f33ff5d91a33d34a2f666235ea009e35544cf135eff54e3575afe2fb15b6b59a4db843c25139ed345fa170003fda60b240065f761570471c4914aefb01c38fe36b3c7b80f77887a03b74bafb64d3b922701a86b027651fdbc777bc4d90d387fc15b8c12443af8636e35224c0430520bc984d71c56df26e84b683c1dba081b0a584b5793e725775482ec45b1db7c84949644d405579659cc31db130bd190d2247210c043bc8f227450ac206c13e8baa896e471f7cab2bdab29220c051ba354dc404767e812765c66ec19acba3b993caa2c0bc2367dd50846bb40d6587b51a76277f6865a5c69d885553ddfc200e970b9c0666c1854efc932af57a1f3bc0a805024efcf978f77b1dd739604b8a87b44b522ea80e87ca2cba7220e62c441a429d19b76425d51cd1e61e2a2950922637a1ab84fbf645a1f6413c288b731945d4029958d56db90aa01b712c83b73aa88581522757d505b83e61ae06eb6f5270021c61b7dabcb0229878d85c8f352a9a4349bdecb2ab0c2ab4039940a887b665f8b9dd10992b3b0493db6074fa85e1382a970953ebf113d4835e9f031d390836732b3ea6a89145183f72dbb095d7617a3abdc28912972035f1cc30aed3101d91c9eb397680c8ae222aa61e515a9396cefcc75c0cc255535a3f41212141c12558881e23798e1748bbb5464adfb167a2c44388044754a87a5ad1ce752c38b504bc443a24ff73a6cea4768e22681554b56dd59da1c7b88db126b7ec640c1bcae8a20b5f864ea6385dbba1c4ddd31775ca9f72ec6f137570fa9356de55c5c2ec92048a0cd9680837f98763fb35d1431805a7420d2bb803cc37bdc90fa921bd4d18b4f33419cf03ad0e2360d92192d7d87df71bae83d2b538741914892c0d778cfdf429be268a22f4043c29b62ff74fa770156d93127c3a7fe2c6c6c65470d1931f85a3af1a963bd919ca3c437b43d368e6e7a199407258b8bde88b4742192673499ac440b247d97225e7554482c6aa6567486074f15b19588c6d9de4619d4c493bf73f2bdbc05343a581e95197b64dcd8826442565bf629d5ce4045218bb908701a5e53b2d0679720598fa1b08f286b60e5c377ca7afafb206ed4712d6d16a47b99360426619f97db0059a15592353577765a8368d93928802704836c2279205446bbf7a2465042816d7907f143635b1434680156523b02cf1d8565ca5c7ceaa126a2753dc299c10e4968a4729991a0f5ce31c595629301c135b5810a712910a84ce1f2164c3aba248cb89c591ca0d24a7681c0a140672bf01c7f5c967f3e41b9a925af6ea75408a24684b725b446a30d0199f67af94b958c4b979c2a841b28878b5dc5154b79c944c7156538e6a130379674bba5438d64775fe1a87d3aca677541bf82c27c6d18f3bb182bc7494dc91b23c35392f21ac49e69e3c70454bdb16b2394d00a549734a1aa4790b01508be670841e09042e5a1a4a73c3b830ac5a35b826f36411639e20576a89197426005c08380c13a4a464892bc6992e236771e7b135aee096e9f65738c531b8e63c3f4a922a79222cf8b8309a04c3c7464a69982a072fb895714eb8f4e6d0a4c447ac97280a7a7b63bd585c521a49bf9230588ddd7034 +result: pass +ciphertext: cf094e965c6a8d943b28fd5520db2fad4289e6770ef897f6ba80f522a2d240e201267890a7ee3d7bcb86c9996cf962bb45f8e2cd7c02c42ca4d226858b07078890b65b297bebdf776402566cdce7b52e8dd7e9f920a07f8430b58869db5bb6bc73f47e4b1b58905743fc6a63a116d9fefd1985c0e317536c5d1fd40a99e493655b86be0567eaaac00c67a83b40fe4babb98823051f7e4c565c93392df3a67b214217e62ce0175aa8fa8e3d5a290f420fc03e4d259e76c5668219154f68e1c3f1b7b44468c3eb8001bb764ca252eeb5fb934989e89d4e3a507742ce31ec20e57ac42fb9222c18b674558814636cf6af142f525ec3c8a7d5838e752eac0de8fb1d77ef7e2a979dd2126ae587e7adecc8cc21da87fd661d932b277a154a7c7dbc4caf567199660f756589fe8f77a441e6f31248f28f046d003c4d7e6146f9829827838a3baeada58163cdcc31ec0a78303695a9d51d24d72527ca3896ccad6009f701e486e6d73c4a4ce1afb00cfbb0a1e729ca6e726e4c8a2164d51e97f50f65fba4a8624e679a77a458675382716e57b74d8ed323e06f0f0d5af1b5029870ceebf657944e337cb408a0352328564cfa19006773d1b794d9216901f5b2315150bfaafb04db04c7ed09046c2c66f24fbd68a0cfa6ac5b64363459a73e3f101552002caa5e83a1f91759b5f86ee50e915fca750bb5e95c2f8bbc6d5d681313207f91d524a1a510534d9b844f39c898f9941ec4713eaa9572d8963866cf69a6d87e98c54f7a238977751b31460ae699b922c307116c3bb2e90f69bb91c8c45527065eff726ff640eaa0016022c5f1ba2261faa37f9b34eb92eb5f55ac6c3828a90be3265be251fae5a1825035e8021b70ad05a78dc4ee186bc6af75bc7ad7575831daf735973e8505d4ffce88873167aedc55940d19710dc769fcad490129cbc84ed362472accf2ed445599b2ce72465b85b4e1d6d628dce3195d4a5fde5b95e0a2ec025d5678bb92a440110839b233ec4fb34a6bfedf9c1a1d64c0b5b20f502167b35745f83ca64857ffcdc91b1fcb3739048a48a3da1d2020819dd93544e2c448760d24862401850de85b61c438a23de01be16b5f1a433e9d3a1132c638ca97d7f7485af8176ec8f14601439438552ec3abc97d29f5dd1ef805bc46fc9b77befe95f0641a94c7ad1dabe80bc168fd04054ef38b85b094b2083078f04cac56742a4c2e505eb11025a104df668dd9c3756d901dece91a521881ef207e0307c0b87170e3faf188ad9b8c25704d41dd6b5111c1a594f5ff7dfc4c78e78868f7ee7dcae347a70abb7968b4ffe8bbdabfbf52c853a7fe165f4ba616a9e9b18d00af0093f1e06efccf8863f0c937a35218bd6d043384027c5972687c1078c31e4de6b1edfd13fb149cfc9787759351f5b1a3daedcab46367bf6b4ba159dc109f7f79c478da6d0cb7866cb372770bafe05bd95c8ebfa090f70d6f051430c0f2ff76a036679be20ec3bdd91b5323af2b3273a995126a8d5f413e4ede9f27ccf1dd8974bdabe3 +shared_secret: c630736985fdb7830d7446e18b6b81fa4a707a6058964b99190120de85e7559c + +# Official test vector 4, seed: "edc76e7c1523e3862552133fea4d2ab05c69fb54a9354f0846456a2a407e071df4650ec0e0a5666a52cd09462dbc51f9" +entropy: 64efa87a12cb96f98b9b81a7e5128a959c74e5332aaab0444fca7b4a5e5e0216 +public_key = 711cb96f0cbb88a8c1c298c7837b2f2c3525f2313ee5cba7f6dc77413cb58ed86f75d26b39729561c28b795073c1994f69256eb0ba9c934146c4421419475d005150897a17d310bc52f43d50e8ca5706a774d5079719754c6336d1142d2387bdc1732c03e2a3a04a9dde91c46612b54ca6ab15921bc20ab4f2d21910629ff4e37516870d60ab8bab08ce45dc89ca6712f17869e645b702141ef5d64f67f62156ea90ef1c502024858e91c89de92056f3675c1a6eb2191e17300845cc3f7b52cf93c566ffa732c362a8e89c5b6f4a5a827b6259d26a31932e3141486ecc746027776a852faaf0c3c436c690e3664ffaca01582022a99130bcc402bb7234a14db7baaddf7981d6557dfc44788c7506be021359e1917837a3c3d5a598757e00f77b6b785436b6840a16151939774a10a7cb8089fda55e6ae49f30512d691716f29c8a9fa94a8a113632a20c71138851ea6ab3f84e6e18b8531119e36cbbc6d0229a491f6b3b7e20866dda8ccf802abf47a769676550e2fc52ce438c48946eeb22756734bd4572c501dcc311b26fbc9c8ed2100a68e44435520848590375b59687c94a685b6490e236193c722b7b4acb84ce9a69388d13a984f696b85122c3dc0a5c38c2992ba60a280c9c6783855093a9b886953194eea273225c1a3e10b9db18c548c05c392631dc47320f411a618c943b7a201c784885b62f7c56a6b698abf1c76a039b3e6f95c466dbc31b4173778a9d5770b68b8a8195e886e8191e043b909723209553bb942a96ec4cbda1382d02f71a6c009bdac062c791c12f68a1f0506478d1869b782bc8b0181de6ac62bc8dc844aad6403a2b907f2d1a992bc44313f711fee1bc70d326e7199fe411354db2c4ab2526d09227bcb42cce2650e341368fb493d6754715736f8151019df22b07e5b5bccb3d0d161ffbeb2e93731600c85b6ccc226c790ed5e7384e8c3555497c07ec074f2253713b1ef6927ce4c1a80da11cb609c826718a5474230d62a40b0824675c95d0cb05b7c77b1dc4aa2872b8083bb79e201a0c847061e18be1d2ab68b2bd55d24925db5f4479bc12dcbc834b0254b891bf373cf5c4971bb0811182527c72c2ee6479217c70214106b416bdf0d818acecb63fa6af4d7031bb50312023acf66986c71a25cd8a88d767844c312dd5198b965c3df3e244ffd64610eb0cb3431f98889e72e864590191692b8857675afd45b6cc31374888b40183720e1985d811098738b63a823bc7716f9ce94ec70738d7f5228199bb78b811ea912500c71e1cd93c955c0049519ffa8b523a7861b6b2a3dce97d82449b00b8961877488b50542221ba79aaa0d33b3a47025acbe47998952b08e27ac2fbce08d6bdac7b6990297504194bc0304871472cf3cb952d439646aa86c47986d160afd7f401c70bb200e6182f91872812c551e17ea8438ae4236cdd743159802b034443e8d7ba0a249b312ac91981927440cb0bdc8e4615974bd2450161614068206bdac3c2e69eea0912f8a4ca1af21ac4c033a6076e6d13039c97ca930599aa12b93d58c09d663de14158b72ba0803a1b7917b71284802340422310babf6572aec23ae33a54a1f9c65dcb70821393b95178ba5acbc0756dd8a02f8afd156dc73958bab2f2c0d24c2436f9f00b7267da9f8b2678c14626ec +result: pass +ciphertext: 137f6e52087c3672ca92c3eec5ddd9e4915b42239efac9fb1c21267e62f4421c1b10de7e404dace358d8403d7662d7079abb4ee0eae1ef912b84152c35c190b48ae0ddb4e8bbfc9d94ce328339ed810384bd7006f07c6b65a68cb10eecdc10de690f8885589f7d7269c659d54145d6a99b9d1ac8b6a381b3c9df8265a904781bd2a8aa5e4c44c5d68525a01c3915955b2c0a8412040cd371977caff50edd1bbc643caece877270385c211cb0d9a4436fd0d0368ba885d8121dd6db0a96175e52918360435d1ea75f9331426aeb8b870344a7e628ffe5115d731ac46238868a61f0a3939c359cda3cfdc4f853813f87036d32e36c94659c42e7e57455b6f0cf72dd6d0cfe6706003c9f2935c5f2f99aacdf881fa458003c61e9ace8c849070ea67349f23fcf91fd2a13cad14d8fbbffd0a66e93e1c427276d541bf8a763e435c17c5d0b40a53d95830b2e266352a92a7156c121f5875187c0f341b236f63ac8ed3aa9f7c04decdbc422723b360348038f44bb9c5e1c7c9a21ba4405ba57dff045c2393c246a430a04260db49648bfbf9da7c3ce14a2a47749b9ab028313d1524e085d90faba17e5958448c20c1c3b4514d83f47503e1de6c9422a4ecf5332645fffac205b8c46d8d0123d6a889f48cce238546a48b526064d638c12752137a4e0a9733cd4aca910d40dfac757080684500edf82e678191f1031f6abbe51a6ac0292755db514feab858bb919d4bc2dea14d1f1c3875b249442ee3d1959bd9ab288a01596f490c47b13fe8469c282e8233a6a7e4ffb48a4cb754ab47be470b6e837db29886f45821806b64824e1196707f28a27f5b09286e711688884f8be172ea0f3dc0f22f8c554ffb181d135cde9ea3b9cb984a9403f459d98b81aee62b9f259a0b855abf605e59e5ef2506fceba5699f4511284886065feddbcef499a5ba735049ba2c3fe812cd741bd4cee6a9e7f4c7e27fa031d4ed8588bafa9e1a724ad3d442b821c4e197d0e0fcf65b24e9a3fb4f22ce221346d811c304bd4b2fd91529c722ab08c19a9b06212f78edf8e61fdc7ac463696fd2b9bdc9aa14e1033523c0ee5b5043634a99f027e2155c6d8e7a489ca5bb6faed913a8211df109df805d07d5bac69f1c42665f54726d46d189f9846b6f15cc5b8a9d3dca6dec03973f54c43d9e97a68f4f56ac4d68280e061ed8b56372cd9f58806d142dcd6220d07bc12b6ba8f19a7196f270587190e1400ea90b91f3f9dd1853e1d1919d98d763f86f82e2eb1915bd8ae55f0e70df6e45bca23bc49af9631825da5c5e9179dc270331fa4f2b148e1b6358e88f83ffc464bb715fcffad465cb8ff1b893a6f985ba181495b43282dbb99b6f7c00ac74eafd2588d12262a21a3b1da5f642f686b7df77484f0486a5a88634e2bbc1ca1ee719a47481e76b5d0ebbae155985d14128164ae3881b0e626e8a96c70ead4822ef68402a7fe703103b8dc134c89fee2c4fac3bbeef7ddee0c8d5dcfb7336adbfb36df18c2632b2582db285d100b4501c75cffbabfe4 +shared_secret: 41e078d0d0c4fe5df5c6683171d5c1c3f1ef152c4945f9cb299f74278ce4cc4f + +# Official test vector 5, seed: "aa93649193c2c5985acf8f9e6ac50c36ae16a2526d7c684f7a3bb4abcd7b6ff790e82badce89bc7380d66251f97aaaaa" +entropy: 8a95d71228acaa5f9ae6f9d9ca8ae55fde296463b41083a39e833e37c4c90f88 +public_key = 317771b7e77466880e15c76a39356cb459b78e6821e69b2f0f817b236a04a7cb834a743f830934043856e0dcc376730b3afca17aab6ae2c59ebbd57f52d84cb107b6c5e536edc31e57c3cd404a618700aa1dd87e43d92d4e601ca8d998c927451e9205429c643b251e8307553fc755dcc06d9003c35c310780b31ecdb05764e3c479913063978143fb9a462b011446394a287888a61f4f57b6c0548718faacecfa6571381ce25c2d10c27386cc255086419275a3ca59bfcbec4c63e5b487c41661520495e7b54b9641a1e16dddba5794a42d42e86b0007444cba4db161c6547c69a9cc18b2923b2a388710578043b77513173f6eb0190854bd6cd2612d1048e79435eb17680e99bb932c232b1ac298591d98a881696b3a46e117bc4a50565ba52e4704eb1c23c057894878434c61789ee8a594f94ac55748e2b111170c391b6b8403099928a2c60a42383ce5cea5880701aa5b60e4c789c759c12703d946416ed316e48c62603920e2f640a347a2f305602f4138aa82b78cd08fa071ba1b9711a333a3d22244dad09aac8058592b1edf9193291c8854b18003c6cfea4a8728e7ab378905e3d04349fa5e4ed9baa17b41b0a7189ab5cd0e352f174a51f3518badfa7df523bfcb64c43fac3bc5b6532bf4ca91e245e1e61a815c865bc7cf3cf87891eb1234a49b624c0e1169c400cac05359b6a15c9f3201b21f02c3ff0a4b94980757688ae0c48d0ac5c3fb650ddc38a8167c87c51cabd1698f8e3654380cbc8819599699615ef5495efba00a7a2c805c1d49552183b37bdb782f652682e02b7e26893fd97b8a7025affc7062e99557751a6a1da7828d7a003d0c62c8d006fac92589594fd729c17f38c5c83bacfe5bb8add8c1749a7550765f872c22e3e8be9db4c50a915fec511c31900890192861366d9177612d731f1912ccef5534248408c31605ed8960a612234cc23c94275a0b77302f0b82b4d121bae15539c3111b9a21031314076199849302f4274fc54b284d95903cb543902aaa5cd39d034304ee86814c6119f7fbc17d35c68b151e9048434973ae06030cff855291c71d58740ea00254ed926ab8835234490bad7b51eab118accb66f4a6a172c9a26717376e678771b44d9d452dc93988b9c9b5af98907b17487bca1397b8547ac8382f8a28a78a91b1b105f107200e839218a74d16000e90334ffc8709976b7fcdd4b742dc6bd2667ba6ac24dc510314f6b98dd711bd7a7169798874225627f2c7aad1bf37e97a4771542e8c7898fa0d8bf4c0fd91bf598580df6c0ce231a96368c8b8435f5507429006883fa88ee4e5791c2685f61c9247e72378478492ec90778c5fb8aa4a70e6cd48890bafeb05798c13795c58b62b5ba8f7c522e78365089ae735a796825d9ea8c572a6544aea86b2e08ea9748cf6b5717103a6d1c02f5d87a5e1aa94beda8691d454de0b547e951afe05061399804bfb32eb7b0857b8851810ba48e92518ba798dd54135a74419217a687620a0c665a050318e3672cd616f6d41618005cba6ea47faec63daba709acc2489417fea39b74ca2b13d4a60ab61ba89b2cdf0912757e08214b0671d8867cd2794fb30a8983b410f149ba2ca7134d00f83ccc8d1d4e2f1e83c9d8d4b95e33927f84741e362d80c3ce5833b7f2498d841f4c7e0 +result: pass +ciphertext: e5c184d0e6eaa03a8e46165eaa4ac0f9ba855636b6ef0900ed320d1cf734f2964662080c1b756c073874d531dfb937b298375f594ea69298c3f7c894cbbdabebf99f5f0c9279df4a60fd58e0612d5146f7da7f708938b2297a75263af995393341b5db7d1ca67ed16571bc479cda54677205833b79cdf8a935be6d097996cf5329c90a1302c9a9b3d6fdcb28b725d8ced9e6fcbb939af5105a298b6801a4670a647a7982227e0e841bcf8d7b8e5e473f534328b5b47ff53a5ef4abd2e899b401887ab69e4290e2e59f0943756584612b7e508e3b270313f5db48a92b7020b9875b5ac8f95e439c376075f63a840a8c9ae9f379ff838eeef0ef6efaeae941ee2d9a74dc79237409e44a4cb994f59605a52f9ae85a350385dbf421582aac40cbf2a21b5a1157950d1993d037c0dfa54753232820cf3478aee60e7555a643dc34ba68078b2794874873b01e4842eb4e9bebdb3ef8c4d224d3703522bf76d5f92b6438914656b4f58b94f1ac72dd2b9aff350209128dc0c707c89dbfaae0cd6e7d0fbfb38e88b25ad92b3aa2f41f6b09a003882c6e1c857dec8d0c0c1a884bb176ca5a8cfa152be28cdf11ac95654118b355d8a0ce321f7e0baa42a7e1391292af8557d5017b76db0b320be34a129b0f6ad0aa56b1af43c49c74897ed0da8f9a5455c84340f5b929218c7f2b0891b5e81dead1d9148a9dce9397674085d7ab3735a199a0c0def3bdf917247b5f287d82838bc00cf7babeb56b00b9c737f7f470374769ab3a26b318e964e5cfe49e54845c99c64dc81133aadd30f0b1fa7bd44a55449383be1495b13e83074b4ad3857095270e2c77d2a516d021dc55f900d54d99f7720e4f696b9c12afa2cf990a6a4f41f32e3be28fba5d4b3dd8b22ee160f831886551798cdabb447b08f5286c4617f67e65485732a09039d1ac07d5e54b8e06ddd8ac1d5160fb6dcb6366b22154b144a59cd3ef76fceabed5ea7fa81a6b5b36590584c11ad304ca82c2ff2c1775c6459073f75055680dbbe80ead7e6bcaf4867d6251b6b75597b9b467d3077272f1034084d307731e5fbea1c40e2d5326e4581bdc3387e2f12c9d7fb31438c002483bb7854d3e3fcf2b80fe44a2129fa1de3fc475c64f6ff0c1722b801201b0b810c94004bbe43f7bf0f56f1b0be5268244efbdb3b8adc85b128f17ce218f01b5a22f41349114b45e1216039ac03de43d067ec7d033df560bce0f8f63360263d8b001963dc824ab6efdcc04406dd70f9b4dee6c129c512ae3e6a45b48344863298c53a9b80e514b9c14bf85c2f76c0ae28a4122e6134259763a6ea7133a594305f3178008d1e9502f070f1e1abd66559a5dfb5b951bde39d8dc444f79de7e548f700c81f5c0e4e419b085bc0bfd14c6f01f342823263a314c834f220dbc4993d29e2ea64653eab1ad2c7a556840a9fb01dfb02b6d37fb4d872714db07e8dcf88a70a834b72902b633ea7934b662cde95430c80967d94af21bf10d622e20a30d0af2ec18bec74e1d8d9d8af57d0031607c9c7a5a +shared_secret: 7da491b5623a43ae17160a54e45e8328453cfe1acc692a1e300906ebd2a1d9b2 + +# Official test vector 6, seed: "2e014dc7c2696b9f6d4af555cba4b931b34863ff60e2341d4fdfe472fef2fe2c33e0813fc5cafde4e30277fe522a9049" +entropy: 90d79d75d0bbb8921cf70d46bab497022a8e750efdc99e5f1bae653275441c7b +public_key = 611425c6bb62e8f60764db8466613486836fa07896314a6ea13a56e2f467483848c3451602e4c6ceb2cadf378d85654a63024c5e1aa3ba242136e5302881274c1316cb26004a549b19db794fac3f7c454fd8223f560636fa5acb56f0611911954131ad94ac88272b6cf4c89fa0635a7a838c38c92e1d640955453ea44ab5a6a0868cb9c071e51705e24a1cb1c4c9d8c59082757fc5cf95b17ff0064c0c47b021b244de30aeda11251fb170efb279154515b69cba0400875c78c1844503d411521ad54c651a738bc32da29ccfe992bbdd937827c6503735116ab5079dc04006fca98a66acb6519187fca7ca935c090bb8d31b6062b34513f01e157976183a1873db1c9e878a3eb37b650205ea5245fcb614887a8def4bb44b89cbd3c221e1a9b587a8c4a50633a9f386e6aa43e360649da46ab688116e01aa75943ce061b362d74ea824870a94cdf84b38d809bea8c994d2e10057b78ea6685fee45548e6bb681a32f5346ad5467558fe6c345e6258175a84edcb32b378ac3bb24e85739681234c0f1633c334df7d853c9d00dbde8a23d463289423536a44bfab94f2c76c113fcb086e5c4cf40193220c40b509065cc3ae5c861212b898699ce1c224a04a77bf165b0bb057c30d9cca16b4dc8128e7c197a4999372906cbf38386d66c27d1e36e8d504613c36d8f655d49750a72509f32f09580fa4518d9a34eb63ba76c063af7cacf158607890380c034e2429e49125c3f543c77c3066c374a43d24a7eea2608a12b845a4c42f7354699bb169bc720b175ce7c0d6e63843f543c0a84162e388fc21c313b3a5902430cab0a61d3e3aea195b13cec41e38539f41c6e22d63f5d60825d7182ecb31dc8a0a82a952b765c0eb279b75d20be877b8fb8fbc290f56efcf5240779bd2c639a67476fae730be123236ea68e4afa9d3200d0db30b7a771bb97fc1667e94cff70bd02f32d6b0b19548b61bff4a43fa5cb73ea11483b23b1394ad5812c8875002be49510656794033fb3150c7e13611126afa639355de9c04de445eb5c7430287815771a937707e88b3c8f42587f30baef55aeb7a392c14a4dc858abb9d537f8043c64100aeee6a597315bcdb65528286e0fc7ad5a59a066725cc965c562acb9d6330f28220bfb35b21cbb4321fbb556449c5e1108c46744e48c578937cc12c20df49b79ce96aea9b231892597b8a57683c495a9729bd7b969f34899116104abb00ee4049ccbc7c37ea5868ba5c2f4a3934d6599ceec340d6a488fc28d84ba371456caf9c52da9980904e253e54332505cb9322b1ce3c1904c739433d99fdb35461d4b3f949c8734904974c5cb7dd54531e86e7f9a69b8c78e137a77c0eb6b1ff468d0b2973819ca6a69b1e640af8f3b35af45183f5284425393472b3b7674503a86592947621dac8352a64427d313d51716ed6cc78bd85412d97561c910f31923361485d138b80585cf2a59a04896b3bd8c7ec2923ccd290c962c343561226a076e7e13a0d51233b68062d0e02512aa96fd701ecb80b7f45b210311246bfb594c5059f25c1167094f966c7d88da77ba3a71d186936f6007cb7cb4941c599103792edc82e3708e4aa9706da72ced51924d19ba561843c3a70f3f91b4ff04987cc4a914fc6ad33290975bc0b534d415efbe43f7d4a4b917723a +result: pass +ciphertext: f2c88dfae11fef0a6f91126673e6f27bf378e78c4e3f96a8f7cfb1a81986926e1d74d0c7b47d9c2454941e83476abf9d9a7e47c46dd39f9cea1148dd5cd086ef9a4431864541d88e3faf97f272d98ff861382e007b4c84ad5a6cbfb01e89f6f869e6e04cc1bc86eaa782b6f0fd4319ce74eadd18b5d911b8d0adabbcc45f92c1d78e4bd21662049bf7c85145d180ebf1ba5ea49a216a1c8130bfb4e4f7a3a4490735dd4fd9db3c7b2e0b1191e44c4fbec765ebb6dc058ebbf08577f24ab2b7f1809baf9b16c5b63b5f63d72923140e477c24990028f2715a28375536d985d7914bdbdbedb02b1696e4e7dd95acd7572b579543e4cdcc2e2d66e64356a07c9a93e567b06465a50fc4bcb899333000d9ace41c7abdb06bfb81d553a0e743a8f36d0d30f675934dae148ff00b96951738d679cbd8b15d0bade8eba5244abcd3bffdab5d03b91f4383e498e8984f1795569889877f2a6920a02b9b741602d84766459895f988b31b678ada1593429636002a67eba87cd0a2f627ba249699e2cdff686c03874dd57f00beab2db22360a31ad7496c510f5c91842aeee3e432826e9b124c3bff3a6ed01f0f8f576bde8c1c81eec09082b94615086024ee3aff8ff87972ec80a0fd319218d8436b34b099987fd4e0f8bb9326c32f48b7c9a4e30b9f24845401de87d212d2bc26f0fe00d1f6273f3af8fecf9e45806f236657e63615ce16949d7ef40239b637dc01bfa604f7c296ce62f9b251808abe8b97e0de81b0962982936ddb9059008d38a1f5f178cc1f08c65b703f78b8f6caa4b436e48de6bdb76ad0cb38ca6a11a1e160cf15d443d2daa201ca450b01e79779d1f7bcf8b88ff031fb815dc2bb3018b609d6249b4887e276cf0abceec216ed529484842a26c91a1b6b3d36bb237c098c90952230a2efa628dd30b232eefb0727a20f088905cb183fd65f443bcbb1b61fd0e6b83068bbc144e5754a0c09bff18c7d20562c1d0afaee00c78dc0efcb0e7890afe8c22751ac7c10693681491e09371d0d8d05778c8152892958ea0790e18c8bd00d8e06f444fc46828d43997185476dac9005683c51eb483ff552028a7638e6a6d08d71ed5c696217cf47a79ca6b0c6194f1ae9b94f2d35c2fbc94495c557e59bb70b0126aa6c495f42f8a5f7eef82d8b87b9ba582956eae20501ff7902c4f9e451aca0ebd84c20c678b149d4f924be9a3953c3ce85e985d53ae3de46bb99cc9ad4f6eac2de214c0bd5ca21b1e8f3992e96ba1bbbc19608e160bc059a0dd1be05cbd41ca51d1118d6d1f2c83919b69cb051a3f01a3cad27b9326e793c69fc13f4c787a85087907fc8a48cd988f0796d384af60029c1ccae91a1824b676514e5d3f4ecbc2a372c9d953bc7d5ab900efb0476f18170fc0b01ec4c17797056752bb912b06d0e14113e6e961e85f758bdb11eb94b85232748a7f1d75edc6f0123b2f4a89c8778cf7768abac61d73c40e8971e841994e69ee80ee4a456dc02f7cff2911c1e13d078b63928b2c59026808422745078b9c361 +shared_secret: eeba3c0571fa453fcd9f7f0d6baeb75d59ec9854c12846089d65bd8dadf9f6b0 + +# Official test vector 7, seed: "aefb28fdd34e0ab403a703b535296e3a545ca479c1d8148e2d501b3c8dd8b1034bd986f13f1a7b4671be769359fd2aab" +entropy: be8a32f97b9a8d596382c02fa2a0eeebc15c083e970ddaa4f2622b91d6718663 +public_key = 3790b3e85bb887d46ec144b4d8ec8bed82bddda538eea77d818c7081b3bfcec68d496035b71280b23985c6d9cb7580568286b405f937e99a8ac1fb28a927940c0a7cbd36290d130a1c23a42f3a437c6291dce36e39e8cf2ea8b9613c1fe7571ac74bcab99bc452b9c5829b586e5544e27432f06ba9c96869f5b1228a0a70fcf95212b0b2b84b45f29a49b6572483807543baa6e4f8b7b40119a5d483fd20224932a3af6869f00c8e9c6c5bf4c53dbe092d879bcd7843475a3110a559454a7375ac0418c37444a16a164acc751f56b2ac97a1158c76bb9976d750cd23761265d16473429c3da3b82eac213876c20d639bf5951e94d939985abd149b99c249445f4c9cd7421ddf21c536bc8fc2029e65d5c7de083296d88bdcf04e38d26dac500ad4457cecf8a795322f45997bcfea18ebf807e84c659937cde6d89fb490765ea9713b768ce05099e7386b4037b961a81edd79add8fb9f8ddb71ee56c349b453d2a3bf22c56730bac0ce19c4f961c008e03ed3928c7d068cb6512dba564855289bdcbc2f2b179dc7631b9372872d05c4e373577861a67eab16cba898beb2ab70c69447a156df0b36ef9c451931b4b7212c8a850799563cad55bc89fb3460f0c56ab434c5e9abe9363f1992577698af0058b54bb5b9a7b42e8d148d9dccab2d1a31d661018182ce207c036ff201a95b755e041f2e1623bef565b01a27d870046018cf65c8324fdca0dad64883da659826bf82721c3712700f435ea40c872b83935bf6cdccb41fe29c81e2210477babe0012cd635079d5932d42038c615a476ff35a523c7761d4560554c8ae0532e8d23a16912a804908411bab5fb96b9802737db82ca0d40c1a3b9913d81fc1330cee7504e2a056a994c4dc70768bc216f66921d93b81973b46352796d37b4f9009312aa957a51692ae8a65d514ab5bf7b46e0964a8f827adc51765384e8c35c900c4899ff30b1b53be227a39fd8b3acfea46bed8832c38555252b38cc5cf750221e3490ddcb80d0d73422ff47623282d273645c316181a36bf787ac90ec326d758ae71e5863c66b914db005655b1ebb057f8444e2689ad91a69150f71000ad7908897b4a3ba94c881c20271532a9653071cbd55669719b5c613abf45b3335d734b718779d51cc5162a91e4f2622a94469e09a41e8a9dbb3667312bc8d5ab7839374f689b32afa5a25de333126a49555909cb27002b18333a6a0d255b905e417eb8460d8f7566b12c99d2900794f4c0b78451777a3789c834c785274b65881bf055dc1875c6392dbea82811e49c34a3b2978468e10ab7fd91793b2856666a7c28473afbb467e60ba603230c5ef681af07c1779c6598a20e051254384467868c0b21ab7d89604153aa680611b767f19956a3b16229bc31fa3ca4315048b90f9f3252c23c02c92a6cfca28c5ad6adeb242c26023b8f76a914f888d39b59fdd1042502a68c0b416e6853e9cb5894253a129a1016108e44aa4257c2b547292642c3ab2c5abf1b5967c8fcb377eb91fef8c0d4daa3f2e04a0f869ff4bcc458f4c118a4b59715c6f3dc25a304b2fc9877d1aaa3af43a512a680f3e1bdaa90c816b95c339331f5fccdc969363977a7b9695dd6b9ba34809bb613862a0561ec25ce0d2dc86f262dc0ed164c2ad357a709eda919cda2c4f880 +result: pass +ciphertext: b2032dd82ec001fbc4dc819809e198168d1fe4344b0167bea72705c7502e9e562be51f265dd4237c1c315cf8d94fee5c62e9e5180399eb6a387297dffa5e8ad6403dd9a867c97e8240e458cd65ce2a7458104c66cc560c8da6ed08add3c1bdccedd9237fc2893a8f7a95b5ed0866675f81be19843f4e49386adc94cf8a75639d05be7a24bad56ad7425f0c93755835ab2f13c4055b841cbee776ef0167e20170119c034dd3d1307838d96a6072f1f040e26f67307dab2adaccd957541c7416148dd5401118b08ab5a0ebc679c575c9b60a766d9d39bf193f43207968d8c39900b8d8bc452411cb17a6bcd668545c183dba966a2bd777f25856a55593d86caf1c61fc15889b477bacbc790348d6f531f59b59205644cd6754016a05b484a1006ed5e5e113b360f516b1be680e45d70cd18d374a932e26ec41f7eba1869ca7d967c5d89c508d86b575f099a5d61260766defaa8676ecf1dee1ddfdac67bb641c4fb49d05deb7641740fa1a48d3daaae62f185eb157f33296a4ede459c736a909676fa8fe8ff4063006786d7ac07924c356ce78b883b03cd976980a475402d98e94d2e6dfacfca1af7e56f473597b4f2fababe7a7eb58a51e3b8ec5c39ec37a28fc088db7575995368fb0135446f82abbc1e6196bfa8996a9012ce7a44b152dbc6158f00c5e32dfe9e48e7ed67f1864fbbd6ca4d6a53729652dec8d714c765ea836a48b4f6065e3fd6ab90615d902d4c9e2f733129a5ecae9bb29363733f83c2d73e4814c0eb3fc2f0fe0a0da2a0cebaa60fade528f0ea6d3a49e08600d24ee820655fd727f896086df69597ba643b87df8b679dec1fd72b0e5707d84720e64d7d1e0af02caa04061d7cb9ecd1c254b2f28e1f7022c3c830bb5a20bac0031779f485978d4feb62956d616c627f7f4f8e38cdf6f411b2ff9de990fb8770cd8df8b031b5653c7025391ecd977818c463630494d25b7d44da52106138e798206eadccca7ed66f4b53a193d0cdeae21b65e84817fe3dbc1284a24e961daee2b022f575f4476e5fcf45b63c32db6439e6abf13dbdcd3965089947ef2243a5f907c3d95f1a53567b202074e5b945c23d06d203e3f4320c02fc569fa87ce1c837aef80fba4b3b2ffdd3cdad4ae7948374ec8c7c848cc82fb22f23bade2b52eda30698829e1c7ec56d6987dea2741344563043f93b20d029ec1c9fa0732a6e247e053796efe1753341102550b28ba9ac83becc5c34e5a648609a5fde17945c0b998e602f03a9f7904795607fd7202fc08beaf9a12bc6cff261e1ebb285784f41fc724efeb51727819e5e4af459fb1919ffd56a7cbebb9aa12591edaa69c73f3a94164229356b1eb282841d087139f5ef99e7abe632adecdf309337c50f0411f2b5f854e1c7529586c89127fa5c375c4749aa757b7061ff154e65046a39514eeab18faf003d39760a538a517f1350dc33ab94197a40539e8aa1279a3d38c221b28fb61705dfcc54eefa1f40b253b1873a8aa4c468887bcc67d315a753192b42af190021f7903 +shared_secret: 8bf57e5d1ce24e9942b1b3f456d184d4c0937b9b699e69c6524e93e140f39c90 + +# Official test vector 8, seed: "cbe5161e8de02dda7de204aeb0fbb4ca81344ba8c30fe357a4664e5d2988a03b64184d7dc69f8d367550e5fea0876d41" +entropy: da2cfaf69e25b2a89ff2557bbb6f69e01d8e2e7bb27a7a1ce7e40fead16f33b2 +public_key = 35775144c098e6756148a30e8ce75a67137ad2455860252b764c15823c08358c45ac820bbdc3525543a66a22854bcb8dd8e1c920a10f67e9c8d8495865b3bf16c39ab0a86cc231a521f42316f7bbe4d019616c167e88a40b4532b1ea688222a48150c6e24859edd0210ea54e4e80654b86abaaeb52a022742fccbb336921d5807d0769bb5674141fb791c6025ead44c79cf8c1fe80987086cda07546811471cebc7eb7e8a5c554a6cc0062bc6c0b10900a8ee95239f844d26527423c30f4a1be90e29424263663406debab5025e11f00e09c24058f8077cc2313842a5ac74bba5e26cb78c4f8557cd38dc67286d9d25b18f005fbfa852c5ac738f33c24e07b26d635a09a3e3d12c9eaf432a06c4cc88b15ee7c4258b279631a9756e5086145cc2adca624410d58db0def549d2c13caa2d80ed4a088531221e9881f16e39659c3425b31b4e5c0462df53375870c2360b984a881ade524777489b8a184304372464ac7099b6afa24a9545b3ad02ac8b9c968d0b4b6e991cc0a83550dc70dfbba36de192bdb2a2239672f011bc2924622ca6c2c7c4c334ea05db489ca290390e5a18bf18b564a037157006fb9131b35983a9bd285d66482863c0cc4270a32b13e1299328acc2dc4e1812f1522a88177e813a0e6b52f11573873fc512bd004eb31cbe1446a3b3518ae2253ed3204c3e3c36439ab128c322a0160a5b40a27f3ae6121333400b050d60e9fcabcbc82ca7fb1b1399715a23417691542441923750abec3607b47b380835191d6f790a7d08f00ab209a6ba608cc9cbdfc6c8f4cc194bb22c630ae48899a058bae66f3b0cb12a0d2e3209d995010644fae989eb94cae8128585933ad0f7282940606785c07e882031c08a20f4a194be008aae8ae5ce77c17505bb0854579712f7f5231d1c32301053e9ae2a1866b634949bcb4c6952fb78376fc91bbdac8fdf096d1d987db5c71e39371f894adff2a099cab93d5353ba013aef5c58796f906e7a434590181a793ca012a6610c912daca06903b719e384c827ac62e2b2590f82f29d00bfeb50d66815fe13085395663f722399c187cc2784198b028e585b305e6126f6a003b05aba2c0a87eec6b186623dbb37dad789f7e8ba7ce01a792366117c308601664d6b7ce64a03a03090f55c5b59e66545bc0c9a29a29d2eb89eeea017026c2a4b88ccd12c96816af697c5b5f1896d340a60729984857072234c71aa5c8fed44f05dc7defa39cf409b063e68bb28b3789344bce267db328542a5530222203d6d8858e51caeb8c913163a97c0759a1d1c3562288dcd48d164004b08a1c9eb76f956ba5a562a84182caa6417e237bbe4e09a5bacca54a32c76773c84c14401a348108b2cd83377f6470019af3591b7c65bb33833517ce53f7701c4b1b2db8665cf5259b6052e73b41ee2641e9c998df327f750c44dec00ad7bc0ee69992da9455c2b26e4c7605dddbb3ed942542fa5c255b4f9d037a4264939c3a26f8a817d9c21aa958677193c13a3b1b76619a66b2a0b351601a1750ff9b78cd4506e1c19f04671fce65c5c34a6e8141628dd696b3d5b962497ed3433bcd707537ac4715a7192687826fac2fc0a60fcde02f78e69dd3b996b937332ad2161db433ef850b4c8a5bc8a48556a927ce345679d1595b8a12a0e85dc5da +result: pass +ciphertext: 9dbdea90800c59e1d99410f1addae674dcb4c432b65100834cf0bba07cbef7edb65a2ec31e8de08ba9a4815f004927ff973caaf09d359700caaa7f45334b00d4ad36e8ed5d88e12c7b3297eb2c0c40b625dea0520ba4e1dee5905cf37aef7fb7afa89f0ada61d642d12c008af944677eda3c5a53936bdf6810e16087351658852898b87f5baefb5c145dcd293c621affb8bee2756a74aa1b21b68c2f45cc6dfbe807b361b108af0ec7c878bd342f6fdcf4045dc70e14ed394ff4b39b453b0fec567b5ad743064650869e10ac49a9c18d39a6030707186d5ef0207f8fe92a5546fb4d32cbe6df84b3a7f9b6bbca8a86f87012ed69847913afd448779376f507e8366bebaa137474a46b9ee67bb0795ed780e70f6b67fe931ee0f2865148b2ab8fc58ce52d516df0854618cd97b07c5b1fb2730e500a03dbb633fbba1f49883663c6402066304ee8b34174be6a24c075181af5f06978ec21745fc4501da8409aade82dfbcb9a480377d25b3a6e7aded64660567918a0b3860bc5d71d2927a7289aefa9f5cedb16090764b7e245f31f745d8c68cb60301bbe78f1839dcd2eb0fa0ab78f4298dfefef779242b0fd3ba730a7771bb52c549525152c002a21cd5a221543ba05792aefd6335ae8f5da830452be90fc46c151d656c949f051e911c7d0dce2689f31eb58ecfa3f7a1135a2fa548b323c59223c6abd3a9f3101ff19a67d4746a20b95ddd31f30e4a650c6f0065872372ddd26885a41e43a3e3d7a830aecbc19c43911cbaaef663524945a694d514beebff95f670dd2709e859404fcbb0c3626177605d2a544745f16248cd2dc1c4943be30c9b907012276bbbcc978ba2a0d9d1d247743b7872639183aba6fa37edd6f0dc9cf7c1e8b614517573bc3dc88886dc3fe8e74bb1035aef74016f03102df50a57e9d4c212fb58623fd630df87191163c7643dd76ad27f23bc5801e6af3311aae5a6cf2e02721a072ade78648342d662f5d15cbccd03a1f9cdc35c9fee3b27843c2f819d246cfdea1f9b6807f4873bbde71fcbbb361b2d17dfb699859b26403a25ac45f3ac9187272a78175ed4a9d55047065b6d59698f296f92cad6f361058f400fa9c0770a762a711657da59c020096b5f8c235a2a74895cba8d9d380004ce35ddee9daec03f24fa6755c969fd007031ea210c9c1e542319e1fe129cf5a20a5f3c039ad502f2bae423abe0f9db88edd1db6253b972c92fa65b749aa6bd48e621dd13eac98100a1d8c63d84830fda8e482d69497f49a738a3483d081cf18dad0c62755840828b00bf09d1ba51211dd623f14d7ba83b45a218603cd203d5016725c98a36dc1f1a87a21b83fa70c47137cf2f15b84096ec817e417347a395836bbbf095ef6b049889e88aed5496c36780cb0c2cd3006054c4fa03e3177491183e72180c916e50b41d9db580a4e1101e158e839720563cc3a63bb35491152bdbe8a710bf4fe27f054bf6bf51b22ffc72629711c5486a3c44786f60fd04a4deb2bfda694ff797b701a57c5ba38f9b5b8 +shared_secret: 2f714d31bbc778518e2b67d264065d9731c12149cf931211e649addd6daf0b92 + +# Official test vector 9, seed: "b4663a7a9883386a2ae4cbd93787e247bf26087e3826d1b8dbeb679e49c0bb286e114f0e9f42f61f63dec42b4f974846" +entropy: 511c2ab40782322c06111e144e505328c4e5bfc890a5980a2bbc44aeda4c738b +public_key = 023753735c1bba67bbfd117911d0be47b827ed9773e4d50d8d11a5b6481357473ae2a766156b9a4e74169a1b3cd0bcb90eebc31f587d886accf3027c8f6620aee70741c403e4a72d4bba51af5b1362180158fa5867d25168871d599b04819635bbf096c4980cc336267ac6b956bc861e0a9864766a18d4b8b9ea61a0573fe60a5ce58a87cfa2974cf17d4f599673137dbc662eee9706ad9a85d780a911c209644980cea134545375c031b8e1082b4c201ea83877dcd7158435ae34d52376816719070d76c0683e0c4422750a1959932e88562ebc932bb7ae688c09cb703c6e567e6d898b6e135f483290da271d7ef16b15d12d4e0872ccb05130f52cdef878ea83768ad44885e5a2dd6b2a94493ca519c14efa09e9cc0739354cccb3850cb0c4b504c2eabb1128f55bccdc17c534b5e68b94526aa46888ae970372ecd49a7f03171872633e78997b51ca867852e638215be32eb2fb832c42038624035de54d7f4938ab78210c47bbbc931c336917c9d2a0d58454ded14fc7fcc6f5a97a6c3a5649689286f0ced68963cf24a05e9851fe1277fed36812e5984290701d5bbf138ab76f32b6043853415790a540878c3bb297b6bc7b000036007d8dcc7d32e6b7544c3225c2ca861052dd65c8f1d103103959ed0753e81258ec3770360aa924357315c18b33aa12ca06b24f1c59aad1b4ebc58f3f75b77c1b07bcb9a23fb0019de06109050b0ce30e8d6809c8a0ca70eb56e366033841ac39a6a198c5c105c85899e6403781c72ab30bf1d5917035b9fe50b081b6cc6103b72d423237189c583c702f7768fe43c182075a48828d041178e6a616340178aba89be3418c4e968f14b9396574b370f1c7d2858a1fd78b5351213b7c0a7e05382d0217457ba27a344546e197b22256b3f031c9e6b65ff377be25b6953a4dbc9a6e9aeb3b08c01358e2bcacec80033990f282b0bda655951a2b0ab83ef4459ac56a76af2b2d2669c0239496610a4274c9b3e5e998ac948b3e7427c8b380c1077480789b008054373a7fc65080f3772d1f6626e345bb417c9fbd97add68640dc12028258970cba5deaaaa32c7b022b0183c89b3e1be25606b3109ef88c9f07180c110703153a247981b5b465318abcd0a78ad1bcaa15b07edb66bd77a14b23e84afa6500bdf15b588009f05925a2fb430b0629bb4c2057f8a231760d9255746781c83ce932afe10b8602a80fc1a98c694e80333790b59e67722a7bcc2fcd9b61a56a5a8ea6b85b5861b44b521cb0b6adfa9c84f624ad499c0664aa97270d1a0209897569a64650c0a9b2cac1879e671d9f0413be9621b415641ed645fad52e2ce49f5a3bbe49655649a62baeb5634e50807f737dcef63a7fe0c5d2f573b9bc5914b97f28691f49045ec87767eef405c3b3c8c6089e03268a5f0c530f1682c4c022e3804ade91c20a0793265a45be711a607465709a24dee763ac192d0d57626561c3a6092f7777c8dba75516c39fb49c2353157aaff0787be318ce2c7385101e4d23c043742b9c5ba0d96419e192c20bd426de458585e11aa4d5c8315bbfba129a446c80b726060be07458991e973a394f163e54383d14d420ae0b4746a4b891d092db39b8e1c708768046cb0e3ca324d417302e861358385229492a291da3d601a3f41d29a75becb44d66 +result: pass +ciphertext: 253b79d4c00753c7e617c2d0f419c63f496505e5d1787e2f30b58ffe0ec7d22999e50f1c5e6340eebbf4c08e441dc6569f5871e855e1e6db8f2554c205147d939068da6886fd9f0a6bf6a3b267cf7b50369a3199b73e2f87bac62e79ffc8847872974d5228c2f73413bad09e13bb4caa49624b96fb1cd7b8e4f16abaf591cc91693f014dbf3b9157af87644e45ee7c77ae0a3f8df413845ef65856219e53ce32cd2d6484b4ec97818b00a766924f05111b0d26fd58fa2c1d8de8f9612d31d68bbb3783291c6e28e5f13a5e93078564ffaf254362e52334da424cd82dd608d082074c2f31e581950db11f2921efd8e878ae591e10045469eb24e29f6e6c6d3e025c08855976c69f5b3d9c55ec4d7c6ffde8be339b75dad2cf924e113af854f0467ce7e639501b52000b0ecdd6ef38f6c84e1b0fcf980ddf3b13a9fa02227ccd41c28c8d74b8eefd7f4457df6ecb1c7a9c48dad6b8696d10aafa08ce0a5c12ef12696d50296395b5e88de5dff0cda475b989419bf14f745ba5c0a50286bc437d538e4049c6ce27e6b57d11891e85af7d2627fa594462ec09d988f8de48ee4f0dd2353928cfe0930745b7c591badd31a946e1497ad7dac6738f290ddccaded623117379556fd2e4d9d9a351cfa44d684c84878b307cd760583637eea8847b35a9d119ce9a30cc5d717be934480fdebeda223bb6c188b16827cafa4390adc9e50b52458411b931a540dd3596f1aaf2980097e0da5390803474fc5b1497ea0d22fe346fc3efaefe9285954c82439beefc0134775c2708695ecc7033fe80bb27d8917374b347d22ad56c7117459148bba9d37c5c9de61f2f78336b2fc3878232bc8c9b2ebd5428296008ce5f4ae86e08dd614bc1dcabd667037748310e3a30528613449d8229da41b03723719faed932b886f4b4de92d236a2248d0cefd3c56b5b9d15746b39ddb98baab417ab393d00e55fda4e83c954b2dcd0d0b2ed6314a9169e2dc7c7f47b2935d43a82239e7324244d3c42c3596a45c91b5c950a92fc250f9cdc11bdbba455de56810904e4991f7646fbe1d5dd503ae7dd13cc943a6791aa994748050cb59668e41c7c273838c2f294074a98bd0c1b865c3ac9d7730655cf304d6f00e234dcf51ff952caa586ad7dcb97a27a13b48d5a5b0067a21e73bb8720176013525182d35277fbd5f01aa928d478f0080055f2efcd9d8075f8cbf1c6464af59554361e9da4840066717b88726847b952a49073805a62e8f232a954fb7bcac13e1b2a444c4cfedeaee714c76359ffebe134674e3624207234bd5ea682477981c2b083396d1d33ed90dfc30245831207a38172a8826b9e608c24931d1e64a348f7b2b1511f3beb9f26b38dd96877d210c3484bff64dfac6fef55c250016bd8d427121d0eed2259b59b33f7a72015b35bddc94a473aa5601500483e55c29213023d095c26a06dd0647019f9d0057f64a638e63677cd1ab34ecf9d5f31e801a31c836fac22462c2bd520e5a42e8e0cbe2b6bbb7bcf21224215638ce5b46a2720 +shared_secret: f2c29a0a4782d83f2073c7c37d90556b1a005f072f94063d2db8114430f36c8d + +# Official test vector 10, seed: "980d0ba7c8f8b23d0e948a6029ff2659810ea1360064663a8994d0333c8543ee5ff5d6d5c9acf446e61dc464f792b9d3" +entropy: dca92dbec9b260dd97e8886f876862d6effc3b91fcf3fbc986cf56ab93ae79a2 +public_key = 87fca4992854f318a4dd4188f7f334d83a3fe0d5709e89b4ac382e9873baf2525afb10a2785c5ad09c4b28b311b4579a79f06fbc91378109271383ab1ef7169385aa2e78b70d435bdb604494a246be23b1f26874ac9165ab451355f59686a33fc6cb78464cbd98021ad69c1ed12511ef99428e3b3685380dc2b16c0ab5cf46425984702e70fca396140a95e2c1bbeb245572049df3a4192a420fa52bda254fd55186aa960669f7ae2d69954aba444fb9c6b6cbc42b5ba82e262957089c76f48ba7362d6865259c321083c464bdc992bda9635cbc88ea89726a268a34d5cf1eb9aad5347350f67d1fea925f5677e393984818053eacace1844fc52b43d408761c385cb5491645696339ba086bc733c547546e540ead9b1a7942a0316cb635a856836075d3a87b84b1944a5587cb33c653e44b5bd764f6f8b06aa8688afa0526188fbba82707a326817087ea807e2ae51071d5badc027ddf781483d906259c30ee410b69060e4f47222481cf9dbb2075f330e4cca839b093668b82c02680c236167f3621921b863cab9a42e420a050986d481cabb873b6c19fa34b7e21bc6c029598daa77e30177357ba8b0e7696b692116a97ae2f535cb5208c93611ef5e952e76417fb974879337874f3c56d47a0d695797e1313e2fb7c3c6b2c32167f7faa9f10d18d512865f6a453e3e37c5bfa100631863b4a5f4b6c957eeca3bef28f62f98336c05770e001d8fc4f595921826cbad9825a76048aef2b4d97cb354784b4b6768377342685f87142ab06a67477b66a9457c48a2f779e0872cabed62d6e73278baa3406922f8ff5465af790e02310c9b8bf6e1b2987ca6521c55bbadb249ecc26afb244029312960a55fa45b448397264aa03530b9b56643a0d7cb9a73589955631883aba865c4d34fc5f5a6b8d596cb2c4db2b740645eb0a29647089ea2bc8a92bad95c15f52f5a2d24431d83ac4e701210c5b0ba3f31bd0086e47ab3f7984363ba00041c082d33064f1b27ff26958b85c46612c6556561a2e40600ae14fa70b4c1a81109fa6822c01d0c2786f0e17cf198009349704159866e557947b81928feb459b2337f3dbca2c82162107b5e34aa202b893c103ba5cf9b4580107c1f36b6ffb9ac34c2cee189571dc7f411349ad112d20f35a740c216ff98175563599d3cf6224ba230c2b2f087525059f9ab5b80f63110719972156aa30148bfe4c907b214f683c56a38a146e1c21e688c44f40bca8d4a87d3011bf64725360478359ace455c5e395625c95cc84ea3f0d004b2e3a4a12180a1463a234c4912f00be8324906b3805151841a1f4a5595621d66ca8b1863b6ae4869b4c93e2c6c94fa6af25f37e992cbc7ad23f6a274bec8b537f89b996439b762b2faca39d1f743db79451cbcba86de02a9d8567d8977d12066a1817bd9fc2b1bda75b9d6c78a39bc851654008b266c45361dce46fb2b02e4894c784f0b017428db0ba8f1ae54f3e8050381a90bdb073c186aaa458a2e8c682b919741836397e3c59e0ab75dbdc48976a6a474969356a75e171bfb2ca76e968191d970cd9e43d2fb2843b2a5e9d24cf4b2ca947e01f0c129a763ba55b9b92260c21113c03c7002bc8c6a2c544af711c18030ca984dc584e0b0627b3d23abd9c4d9e5087bcae2bfe6581eb7f9cbf532ba6 +result: pass +ciphertext: fbdba17a3ec14cfc5f113b833e70ba6bee49a459173a7d71f6914316f042f06be6d31491389cb3d2661a460b91b84f5555d350e19f5725486b60f1e878143f20b6cfa3f9ad19c11d6cde78681efa2d75d9710a6721cc75cfbf8b104928796e5ad870a64688355654893a77ba7caa40ba960a55dc8dc524198b3a029cc9ed4ae7f54b36a0738affdcc523efd1d7b044dbbaf6149cfc90f548918d458e1ade92d771ace49df76798b12d91fab71c0699767b7d2a409e3a20e84c24402383acc9818a896e790d1f78703b16ac73f85d08f9467839f7d53b29696266f654eb5141477352545790b207d846ea55f175302b68973c992b18191bb8006834d249b3fa6175c33bf758215308c20f4606661a8ba0a9bfa754597e8bf794b2d2164d1d9f03da16d0aa8945752d65406c60e3569cc76a174854046c729d7a17de91a74442a80267db0e6ec081f4783c5ba636b73baadecad748792e3c4830ed4742e4820360d69a4ff732c277f06dea33fc765c07a77a9a909683e8c8e908a3a9ab4063ea3342ff69dc971ec4b5d89dc5a33b1e195cd648b6a0fb5d7ff1163624154c06ba0a8aee57bb8ba503160f5196d6fe274bca9b8e1ccd9b022f72bcaa92da257ead51409f547de03a6f1f643610ba9595be80428e1bd73e2125184cc6b9c97242a1f5bdf7253b29cbedac010d497c0512a56e4e501ef17619bd7ddfd929a09db29e3f4a5a3475729beeb6fc2bc9dc9c3aea7eadea3aa4e60590c2593f272f3157d257dad79e3dadc34aa8e740e139ece60e977952cefc808a11d530a22a10bdf00332a4fc43e4e31aafb686403b8f7883d580d0e46fe8c1c95e4c791038718fff25bb7563aa62d6245bc263f6fe0ef8ab63cc3cf8c47cab5e6147a0d8ed990f32e8abb2a79292cf85e5b269040144c47f824331d5446d30729b00bcee6861eb9f5cdaf901f64602dac1dda268b992ff5427fab223c223f0657177f7f0babbd161bd7027b27cb12798bc3668fd27c01f4d465312c3021ff559d9c930548f073bb7a84aac0d8ed509b3b0cb4a2bb4d44303aab75aa4987fae69d657a6c30ef1c82747455c3940d2fcbbb091ed6de1f0dd64740d2e21ac39e5ad22c5ecbd8340e7afed3445bcc41c92e938fda044f4e9cb145f0d5a86c87428ad01c3fc5280c273e6883c4889139a343155aac49dd257a13e3491418b1b926ec8e1b78212a81e313a50c8fa9473cc00e05a414a2ea1e14292c3b72b5706a7753e0e439adb63a93e5905978d3486bd5dbe3834b5253086e15c57902276a3d6f405195c43f6c317aa7a3cc2ef21fe89f3a7b4660f9f4b6357d60a129e265bc708b60ec2a1fa4f44ed476ca7f540ed4495e8ee4df67d6476793402b732546143b639cfa186f37b1a612dab0619cfe083bee29d29f5094697ef1b6781445b01ae64369b738a20b9387087481efd84035fac494af47158509c64333ec412407a549a36bcfe6d5c15b1668b8570c75110daa1c93779962315e0eb0af8c056b031a787253525438bce41121026c0 +shared_secret: 13c99ded4db3e6618f5927d58c89afbe83c86a86ac2073421b2560b3f8be5aa3 + +# Official test vector 11, seed: "6c029462ca42ed520f10a579f52687101105e0b90c6e7bfa582a4c112b579d5ad0a0abd38f72abcfdcaaf5893a112bdc" +entropy: 57c170e691d7a914a901b9a11c62b8b569b3806427557a9dbac9faa720ec3641 +public_key = 0d40b119341d9e23062c693509304bac635f93f91bd48b362989751078ab995408ddf6787ceb3f99c6802aecb703581dc6979c4d405dbc80a985f991f31924383428d4f5a2cad4acb5f95408a3406ec53425f175651952f5b76acfe2a465b30c1d56ca0e53953dac0ee2da352a687441f45dae26b37ce8008a99308639999d325ba89585656a6d59f51d10e46f93d099490c2385788c994238ea1155ed22c96a5c5035a3488be1c29e345ebcf6b1b7288abe95c29b272a7817704bd31589a42b22053226a43329183f6160105ed05e73203d172354fa176d3fd084ce690a8b6a4cef4035a3e06bc6464e8c913b88a48c81e58dfb1267ec6c1462d93433193e50d1b2d3e3828e90b6a412c1c45668272307f4b8294f37b84857bdaac6190706ca31380533c30643fc319c866534562036b37e825462c8442641c7817650333fb02ed6a2bcd6c1ad0689001098af3657363aa1b689a20683044d15275d0fc3c9aa720c8c4c6212fa70095a2243232cdd0b0fbeaa1c8e7b45ffc2870efa9bf56c8ee86659a618a0a96c42acb48ae125af911558f7cb20c9cabc4554c8fa6c70e297625286456ee625afa756145c41373ab4fb59b2782b4a406115de4966d07629cf8cc2283b4307e6a058db3dee6413aad72f89a7c1ab4131d8ea9df020b033b1473d92c4d89aa84f044e429a43b4e22fbb693a694bba3e315e78475437387b78b33261d786288b20440c44138c84f5592bbe74c1c2ab01ccd1124394082319780b24c593149cf660946f75a930f0a8f93a50ed01b5276ba96ab6ce5f794e638697ceca94d80585ced04310612a3c6cad80dccab1c1cbf5e08b2bd6b7df8c4cde4c4507a56cc97b456e10050bdb3acd6a7e00c1742aa4710e1674c59a8240680d04b8829752332324490ed6139b550c7a832862b2c831d4093db2b256f702850bba03053fecac41a61734229b2dba3210eea0c1e8d9a54c915f54b32344296ea64855dca92ab81aacc9e73153617d8464852e8208904ace7b84509b2266f9fac55bf68378d98d3fbc0a468543a8944b9975637162a4d50c7fdeb479daa8ba43938333b897a12c224ed1c790f967b2d9708c6b67640ca9ddcc1562613c2904c6f3856d13d904cd3094965abf1ed32ce52b7dfe4429ee68a8a3ab03446376d6da1de56a7a7fd30688f513fadc5627619a99d191bd4c0ec8bc1933c00757ab3e1f5826677b5e9bec2b151058bd9a6b5d2285122c23466312559c89a634abc2a5a11324cebbda8d167880f6d59bc5fabcc23487eda84f3543386e0b8d25422d5051816315532d2120ea4723809509bcd0c2edc1c93c275ade244d4f5b27f73b0941820da0183ca2b7af8480c90243af6334b36af00bda4c1e5f50463b8c350923b4696b7eb733762d189c9eba08c09050a4946388d736ee73c62f47cdffe453776730e88531f07abdd8699e8bdc9f05bb12f275c453866d46519ce2a592a1052c1e0c6b8f093f53a057d6d1bcf759abea90883eea68c5344a0ae96cdad42f0e756070dbb496535b9e7325c02badae5533140b0d9e013c75013ffdebc855734aa9947f1ca4b879c35b32c862c933479d884b2c675d3e1bbd26391d7c429db547041502307d975aee26905f7fdeb44f418d3d1fb5b081a3b06f87691170917a1e9f3c2cdc +result: pass +ciphertext: ba4b796662f059b81f900442098ae7c3e5cd9c614f972d4237b2d968a3065ba203a31e13cc8c993eed58ada9b4f443b605ab5768cfa0f2f18d15a997ac911da943f27340c26082d9e2a14d5e1c7aa180d0409142b607383706b2ed5eb6ebf14cf2a18e8604d692d551ffb4cd6cee0b43648cd88a44e2735099de7bc95164a21173acb6ef167e00d16b7e16fe950614cb738e54eda7a50d6ad2579ed6bfaa65a9a84b9a7cc679e41b88093d42ec70683df65e568d5139561c3d4538c50946bd945c02d5272c5ca3d14482fe3c3b09d52ef42e0e521806cb8e902a7d7c25f6526d32e0ae2f585cfda19abf0364484b628669d92546eda69fc6a60845bc33c0454fa631bdd0630037e195e79bd0e0c0b998fb13dbcf55f2fe766f53cc740710f72c98156963b9e5c46a3da1430c00b05251455c984a9a28a5ec47aeca9f04563f21db0b5a4c058c6549082bbebe17542247c4b9642051c39ccaddf10bb0f9ea4a7331f7c7236f4d5664fe7bf04f5a4ba41bc954ca5424167b6501d82afe234b9bb61e22d6767a3342e8d380e9612685d5536e32dd26ac50f2658cad77660ded9f58fdbbd3db502a013ecd8c045cdec7732e225d5ba217dd9b98db1b4218a02931bde33115023d6bf1110f9f20e81acf521242ddc7d53b819ec0a78c3e4898dfeef5f1df1e75c5a5c208a29f4c5bbf40467559c492112652e8c742f9a4388a70fe499ec33f818a3e8e0822936c912f9f83a1b18010e3b1b2646dbe814f938abe76e2f21eb814a94f54b52704ca06c21c492a8eaae7fd263adc133ae4478fa32e3c0e9bafeb8021e3c79a1c695195fd4f089e1cce7ce6ca1d80de31f3810d012e538a39e4d1ef85c97aa1fd8f46b4774f687b9a803405dab5406d66a3979493a8aa3d49a1eb9c89b38086e154fee3b358d6b2ae9232e22af443268489cc44f2ad1536fb116c1906db03bfe9e8f0c79dc4b59fbdda7b1afd82ebb71f23a48d9d3910a2a728cf8ae1e9b62d56897e4e87037f4b79b07afab072248b7a8f67dc1940bdcf893cbff906871318304aa0e206bf30a16556773c656d206d85b3751bfba156065594bfa1a2c335cbe588d31648127e042a42430898bd6ec82e459612c6a354df1aa8819297ba49e40e97a74b177317bb76db3fd0f72ab9a62c6606c4633bf01153a64319959385aaa13a34dac6bedcd14d23c9319cee93a26dcef25ca7d082d99a0a9e2ab02c05fd2f316f8caffb0b72ffe656d6dd079372650b749d63847e29cf3401e59279bb276fdb0a4dcaefb217525b46ce9889281e4a4bcbacad327b160d833e17bf0b38c8c706854fa4f2e0dab16d33ad120d300e50c8f9a076fbbfe35c07753189b7d598764d24cf7f0a6aad0f0c63d36445cd62fa38989c215004f0f02a8a09a974619b208decfd60fc6a1ec781f426aa75e736c9ccb34dc98350f49e49b48430241f6798125110495d8bc79ffabbd3eb91040197124d6f80c9007d2631c8ab55fa5a98488a30ac84ac65a8c463fb49f8111f337231408daa73f96e +shared_secret: 83302cab48eb0832bd8df0db3fce81595754772e4c951c444a1b2ee9f58c48c1 + +# Official test vector 12, seed: "db00120937570d62331f4c3f19a10465231eff46465cdee336a0d46aa1e7493df80f18617f9ffd0476cf7784a403ef4f" +entropy: 6b5a14e1473abf5a33d44975ca2088bd8fa6fddcb3f80e8fd5c45b9d90c24a5c +public_key = 62032561926a6380b6d6d90aabc5617126aa509168eca264ad67c5cccc5320c138e4053b4376924e6cb250b3a61fea8689804ac3179588a29196e05d0efb6915b3526d945cfc183dafc40d46537d907a292cd63b950659ffaa57e280ade8c09dd80655fe45979b612a6c6b1e350ba0cf433552e80f58c79d91f5cbff0717f3161f83b3c59fcc021bb5cb1922b0fa3c29984bbfc3363333f561dcb99395561590409fd7b56bb7db88e4162a61f8a81ca6b55af485d9b06645c42d1f706e9ef2b3d6e425285b4973202d46f150fdd4a6bad34a455b274814ac5c4053d680bfb4816578342fad152b798a1d592a3c88b45bdc275c45a862179557d437304151548a568159691282bc08f9280bdaf30559a3a177e6b8a62b101d8342c9d72452e05bbb1634cc1a7465e479f100b6f2952dab8ac806c27a8c555ec20a995c25a9ea8c090261085bd65c137a630e787da7a6b039c38573006c79bb5c20e39756e1a72e2c016f6cc997464546283d76543d9774345ac619f9200c308c25cea332ff25533b7983db495100f24a42e4a8df11504c4b96c017871b5a594e9c0b241b01e066043d07a366e343a08ac561ec5a08168a1c61755d5c33bd693608f42e63706bae5cc8c7f47aea360093fc78045517be49566f35728bd6a8230984a5e21133b63a9cb4a7fab4befe053e37bc78900141eb21189cf2abc0764b3cc507382c8db2320ea49c988c5aaa7ae896d10702c2082a59c3a457f382f44a1f2ce5b3d29a5a08d047537163916c5f6b22995541b87e1904b62a3585429d938a1b37d419bfc533cb918a424b5a1f73a65a8605edfcbd00678b6361399ac794f2cb0c9b26939b09baceb79ffc55aaa528673ccc4a5b844ad0873b4d6a31465cc479c30273aa2edd362625512012f83b42d52781c3bc947872c78378164cb0e077cf9ad87974c75ca527aed41a8b6993073d711c1873965448b14d307c5b218717b94ca27b354ff99de1f581e9561ec3cc196d1815a7a60a8c9a94cf4354140cc5e3b98bfdeb9c95c7c87182b878ba20939a0280e2c453567215a15803c01f7f03bb0b90741df964c4fa02f1007c466ba6b8f78bec07956611420220499a013ad3e3a874c4ad961b02e4c27a9ae71d57377dbffb556334797ec28c701c220129b856e747b90aac0803b2cbc7b0bb428583b810efe1727e0598cde9681429616c7b3f8bd8b691841a7a5405ad288f77b652a49c38eceb4088201b651a5c65bbc05e40a7a0f4151eb0962c34b10c1869a003cc4cf86d39036778b3ca32d0c500f7918cf027ef920b3718ab1c191618f294866b2fe77bab8c84118ce55157714ad2d054102a4d38ab73d1f3967e98351631582545c5a60b3aad50a7852c9d43b945668bb8b6781f56057ec058b2cfd6310506133e38b75fe3086d990d92cab098f06cd376531bdb8308e5a4d2e323c87c36e7ccaac87b00a7d4cfa3b3342d74a02d888d702cb44bc31201e41fe62c7511493c068a92717cc5513045bfa197d7f83db35798354797cca7891392ae9587245e92974920551d826101d44d9f73b3113746114ac94b8c8e291892be9c8015a0114ee44e26879c02084b0192194b922284956a8fc2b26e9071847fb901fdb6603c3bf7bbf5297bea11539fbe18868709fc57dc4d46d7d54159 +result: pass +ciphertext: 260ce3c51193358dec4426f6883ce12fa323c9c8e0dab43f69562fa5daaa585e720fd75dd126b0d45bc650abc220a11d6551e3ecf31d407551ae591cbafdb1fbf7d2ca3674d8a18b6887b5b55aeb5b47d5d739634483624207b2ff32a2932029f1868da248b0583b32ab13b87c57482bb2ceeb6155d870676a6591bdd33e018d9bc2a8bd644ae6d54bb4ea81a627f9b9fa74b34d359575e0307462608bff54c6c78d0cae95d223cd2c0b663eb414007c3ab47d57dc09932461d4b93eab0e557404a53f99ca160c8d9fce51483c68e1f95b10b11a4cbf062dc9caeb89c4199d5fb160c8dc1260ad21cd26319c95a1c3aaccba6f54cd8541bb937bdcbef82b657949e7dcd586032ae3b8b47e619884c78af2964167869738fc415a19bb32c23098b9b63098d8867ab98949feab0d9f2b1a44a79df81f51924c0c151fcd1356abf64efef5a1b1adf956b99efbce9093d4824dc58fd792613fe8234502d00062e552d3cf5d52909d980345e2e89fd42aedadd6a3e9861696fab590ae3c5e24e7a1b7cd40a3286b457c269f367f05c00f0d4610a4fb9b493ee9397181d669a143aaa095f13280d896d1c8746164137735f9d80b34577f3479501d3dcf98d9ad98f8b647ee7eec41d755134157533b9360a65b5d06955ded2dad2e6b6ae721380d3784f058dd92e321730b7828799939c6cff15c3b1e9b809f2e9bb630fc2f407b1429cbbfd27529e96757c0c9893e8f7c9a1a815dff37075db39aa30ce1eb64531004e4928679ca642f9c6448c67a1c12d1a5db91a1e5cea58da7cd7a8d9322d931f5bb5f18badd4a5348653b49a75734cf50640b7ded766d90f789325b95bbcbd756aa6306815673b3637d0ef9d1a61569371bfc84be0f804461d60fc4bc89c1f24f3f052b8036c4bfb72bd47ae757a8a3117e9ba562916d05cefec5ccc2912826e8ad1f12c1b0bd392ad3c22974e2549ccf683f01dcfd279050c9f6308398bcf9d3d7cf4ced38a65da0961f6a6af287af9519e3b0ec515ee56ae728efdfb0dcd02f6e352dee113bdf8edc077ba76817893e993133afa2913ca02ef4ee35cfe9fc16e4a140ac458cc0fbc674cb8f02babf7a0a2e53a8ffa4519e4d42eb372733d9a873db6a3c32f94960ec10193071b5fe625c0bc3764d0d2177be6e8503162c5b55fc2286e19e9e2419517b9a94e85120ece63dd7b7c7559aad80b544b66d2d3bc8daf2ae107af3228041ffad445dd66a50a6028ce0f5bde1e9f917c1bfa967f686c1428185be75218905f16595cead325c57746c6ed3502c6e8feac826535010de14ee30ae060a4abc6bda346171f8fb0d85196a11582ad6e30d48ba43356b31ff1cde5101e3002a91fe4c6e7b0a3b7e70cc1ffe1a5b9859eebc97c5d6af030f1e4a34b28493feb5021a9f9b304478aa1e8b0e6877e9710911ac6e04c3596a0d0eab24409ec26e4125251dfe38bbe3028118d6e079096616405059f954ca5a67dd9bec97d9fc75e4baa141b1a1fc75abcece72d1a510c09b07cff4c7d59a304778 +shared_secret: 93ce6d06568d795c2a28d1196f53cbaa2cb05df1427ac76f44df09d479e14241 + +# Official test vector 13, seed: "bd26c0b9a33e3b9b4c5d7ea32d5bd1fc371015be163c86f584e49bfd5362c8d8341161cd1308115b2a03b7e5eaddd418" +entropy: 40e593754e6eddb7f9cf176ba2d5fd1087c90ad377556d0b0f686537b1a3165e +public_key = ed7c794ee05d9b58740d13cd78ea15867a5c3cb14051223efcb36969430b45fb699c26caa918c3d9041589a1bde4484e95859a700c2510d6380c2a323e34526e22adb44a862c417b34d172269b32430c6b8a68cc3dd2bee2447555c82189e2562aa82df2a40e33b91d65b60d0ad93b127294d71002dd16b35701670564b1c07436dc2a001c751765dc93da79aff6177e9795b00c5bcbf66175357174032a2a742b3587e35f055268551c57af78090044be4200302fb0b16a40b80e092a1933bf99878852342cc6574c6230a9460b08376c42c51a48aca14d0e59294f3bcb464a74c0a296fb0182cef42b25b58711c6cc939c9e02c8302e2499640737ea07540ed89b5335a05c552472172e8bdb2f40c49a5b0295ce99a0f567af39169313c8b61ba77fd2143f97cc762c8b6be4c13300a8b78dd06011c144a1d747e1c3825cc1674b825838953574e8b6a16b3dfa8a05355c8977006c649b58d9f0ac2d704f774817eea95f6da97ab5ca71c521a277d9618881563f47792d99bebc73a74ceb5560070b75c3b8b2e2c9598195feb08ebfb5cb1d86a87f93465355a796520d0c24744c7b852bac418fd620d060118d135947d9b174cca55444096ed97fd6442dda02b4a3364732c6818c39a9d199b4cb5a4d3659c8c4851d39db9301047370351c8dc417bc1b86fa50486e759b87c4cc69a8a9ec282909c40f0b7ca0896c01f7221639b18fc3145eae4b4b8252b4af720f1a22c1e5cb980cea6b103082b31b0542ea8d64d8c9b119aef3524cad116689280a51ccc08c09a8c3313a82a581b55cae6a394efb5146ad9884344ab6904c7d5bcc75729a261239c76ebc83e2557f60d125a9578fe0b4ac8d57b08d729a8d86647708483407ba16344049f8b842496a64f84d5bf42540429ade11b10f567eba812aff9179e263a2899b770f8b3166da15bce789dee3cc7d1846f3204b26933d4803b74c3c3885748a417692f0f5ac2733804cd2a98f45547af8ccd28542ab3062211a51f454b28559c28d0751c5c6c31045a8aa41c79cd1cca536c3d6a779afd9175a006b663620bcc92b4ddcc92b61b88bd422f1dc7962a70569dacbbfc7ac9ce90f8d16c3b6973ab3e96b6539a145128631c6993c776fcf488f4ee692772645dc2cc1541874c02aba0564a46176005f6ccf2ab27893dc60d2d44ce1e5b6e317a38c032ad98bbbf79554ef2882fdb51115782ae862c9dc79a6a8293a39135460f96329548507d58c39a07ab9aa7fe913a7fbe4c466f693ee1006f6091346a4b75a2a506f6c787cab948fb76f4398b2110781ae27644211476364abe4ccc2f0ac6cc4e917dd391bd0b369ba862d5f396d8627285b0c5d9b3692ef8069ea601e6e493d841755cea52194b32b5f787f15a6478db7b6b41336000d2bdf3270f8f0aaadab89325b6a3dda4ea88021c8b61b6ba372186321f4f5575f2508625685db168830063860965a71a27ce34a7e934b9444d411da9a151b27b3ed738869100ff19099f0c2a8583b872c8a0745e455bf715b8f526cb4f378fdd931c8111d53a97379ab1d57684224780690b2c1b36bab3b0762b8fb6afcf39cdda151607a6537b985c37989299414b4c9b1894c6051242482b42289ab24793e2d7af2ca0cedbc27d0595b94c698bfa000840bb2d63e1946 +result: pass +ciphertext: 5aecef867809431a595f27d53e374f929c0927ddec2188336929346daee5287eeb67c5a916959b428b809e5c8215be769d63b7cbf828e3812a25818677109df91c1580d9a8e50f0875693123e66b7cad079584c20230ef01a0d0fd7b9ee936ff65a0261d25c60e7f9bb1b51ebc9d6cba815cc43c895661d355d12e96957acb905dc4eb18e45b46f45d23a35e8d0b4d5d71c77fa30fa244fe60f3d716ad8c8afe1781caa0668a8ca6ec94a1c31ede99532cbb042bce0a2e5cb13892e47bf27bc5d56f3ae0f156cbc5c90a290d244f1d5902c6234eeed11ce3e232cbca1cc29228d4848bee8fbc2ef61debe22518680542ff824774e38ce3c1d0225c6836785076a651653313ba74fd8dd176c3f8fdf4d102bbe0a5844d0e73f87eb04e9298e61eb8d18f335917e0f9610c3c17041537197c7041652aa39f7e06057d0c12479b07cf431308124ad8d9b22ddaeae2463070037cb14025e0d91592c8ee95b4e792a257aa73f64120c6c57729b4660f4db798087a053a40e0a144829f64468566c201264524ae339cf33d5e3e7a0a7a1f9ee75ef234cbe213db87807ffd3cf867d0a75bee8cabec8eb9858478f4470e04e7d36e54dea39e16dfd6fe882639a7edca290222db1d92d5c7207d436ec20b6e07a25e9bb2aff7c9a0629cac7121144e6666919258263d6052069747652ee973ba4db0bee6b28f85fdb3052fb6a498efd7fb82bcd2b4f5e5693d6462658d18ee04966b0d56fd1b9f560e1e29f8cf80e59f57e0cec307a9c37e7a578b98c5137982b7a085e67cc741efed81f795a40f550a15d1bb621ec702aa642271e5fc9a4f7d1bd44f39ae0a014b4792d4a8602c1699eb27c87e190911918d0f6e9e887d2ee3b7af9d19f3fe9e6bf78aa141d66328044cfe286affdbe0e1764fc5540629112b016a1c254b08749cbe45c10d1cab7991eb820167574fac5b33d971467fcd500eafbad1b9ea430a9d03971e0fabec59b9236e73ecee3166aa19d24115d63f698a1791bb6fdb4889c8e85c4bdf5f3fbd7ad66d4c733dafc073e6d5c18470baf3a685740f6f7aded2d39ecdcce03a0e097d86605fd856f6fe0d9798c1aaeca7ad1f2398b53892299797fd78f46c9c01654c91c2235110307b8f378a2a42e2970902ba96cfb25a307be48bcad1123eb0b80dffa628182a72d021ce9b26f91424ff400700d40a99d850385872d92ce7c19f2c41bcb932ddd85ea20b3eacf414799a6175b9ec819277481fd9b67b791c26b848a0ff91a8f31cc654921d70fe9eff42905f72eadaf698e31e90f4640a85a050f79b0a9084cedec141edbf20e07f48152fef5e4daec206bf2c81f1f3cbb7401c88ff986a9e90da3af08ec1de65e164df05b72ede33fe38cf772c48dc991d5118c06504677a5f806ddd17bdd13c318c023fa168795021a8d18127a79741bf31e5b953da85f1c76cc8dfe0b893563a7d5a8d792a8f148557c4ee87fdc9ef146c85541bfb95bb8d6db8e4f76686d992074941a62ed588f16826411146548cfae4f4cb80 +shared_secret: 071db527a2ee8ce982527cb19355793859bb8557e7cc99dec58a53153eceddf4 + +# Official test vector 14, seed: "e2819ef86853bca1b9dee7ee1c1619988964f9a913e635aacf0d96ca6e0300d084329dabd8f149e24176d22757404260" +entropy: c152523abd8248bed40c3827bcf0f8e8127037a55c780695e2c28ea3e041a44c +public_key = 109bab4be52b48818412eb1353680f2a3c3bd9fa7e55cc79c38207fdaba1833452dcb03763672212953c53532e6051ab040208acd348af507616562d96c7c04da93c8f21566df563deab2f18c9359b0b5391e8b03b485e3dc1a7c981b2a30026b0f83b84c4505a5966f648383c9abd16638a3e557ae4925fbf1c0125d91d97511175895082a78c1272792a50a5651239cb66b3f6c1376fe332260cc27ed5972c4b6ecef6462d3b712627928cda42ce150d3d96b7f032209ca92e9937517bf2b7c5f66e3b837ec347643a6a8a4d8c299de167395c84c2aa8bf1a8a4d5db29c2962701701ead468368b40e87da45dee76ff4b287950889692a838bba17b2b47c3140b7761cb389e447b2a540ae251d61808341dbb2b9aa5f04a69c6010431b28c17b980fd00499e274c9492840cc7a1e90215be92759db8b14ef41c059c546d4482343106adb27a802c3c3f8759a8fa20141fa63c65081d40090eb1abebac9c5708a9ba50656b4e7616151a4f1b0bd678ac18188450ddace2b99b3f170ac2635a62ad88320d17a9a75ca2e1bb52576274ee12f1f3b0b1696a247c70a6cda6264dc9e892cb08548c0c8824168f471e19078737169b4549b62b634a611ad53699a5550635faa7ce4589938501834f8c4856cb2e991bac84809b424cafb5ba089f14338780178d71b1cb7b1ed12c036f727fc2a94e9a62ecab6a95c8800aaa237cfb224af5c8fcc939443176ca4bca59ce54400dc7639e0630fa7cfc292604e6ab0bcda993a78107d108783d19dded13c2033297ff513fa75c4c6d65640206b43f33cac26950533b4b053190cb23e45587509acbcfc57acfadb6160f5345a599caed04eaa02937bd5a5620a5f24e6b194c52da021233b13cf950c270f8262972031790ba4cdb4524bd92781898427b6a1adc7a986f88ddf7b39be1c7d9700c87d52aea9140aef5c6454328f666a8f476b772784c3b13494dab57b06e320b2aa701acacdce41b8b3843e9913ccb3705dab48cb9d85ab5b36bbff148c5a4239b32190193112e1184d33b88ed1e6c3a9ba0ced62bb5e634b72187030bc8dfc1a3e80e28bfcd1828ec4a2e4888d68e4bafa3ba8622a87314432801325fa66c142760272e594de825560c7c19e881ef238bd9a38013f601885e02acec715b25730fb004009eba9111c125bfb0d6b2c154945575743cd66d85906981b24c1b2029452879608a34bce8e610501b6b12f32a1b3e99b76143cc1455485b3802778b7ed52210b976cd2ba26f1551c0fda036fb33891ac77c9265c30db5a513baca1524b8499932d5633b127ab98d8c07ca1704fbc8404957251f11dbeb7000b363255f5aae1261ea5b7c741445cc2852666c5437a4054f5d3a421799318098f5aaa5262b46187f60a09d98442499e30bc54c86838e256c24ae481b6bc33bf076b04bbc798f0615cccbe8eb66dd3c97da6a89394d4c7e07b8c4d5c70a01c9e7c43b8a37c3a09d728d9fc25d933028a504dced76c2a3900ca67369cf5b822107a9ddb2a168419ac87b036064786f500e9e0a279294df8a7c632484723ba28b38b52937b40e20984c46b23dd81bedf629da6a3512ec060fde7b8b2dc987395af460998230c20a9a08c1dfbf3824cf7a6fb4ed55ed1ff461d800b59a6ffd7287e1ee3fb94cb59c39450 +result: pass +ciphertext: aad2540e5b6286cdb234a4414a07402fdfd38141f26f812025e62b851d7d565a8bfe21c5879ed182ff2960c3122ba4f9e591060548a7a2fcc87b7a5f3dfdfa79912befac7451a912ba367a1882e4ae533754a76308921ce820d52d402413651641767dce967dda4e9cff0ff2f3f1a971693eaf6dd138e5817f2600e609f24b47d6fe41959dd01f3d22bfaa05b17a4a957780d581782da44c97f794a008ae96353d0421284451cfe3e6770f418661699a218296724c33b34730c25525b2f818e7f5c9ed42afc92f6c3c56b22b1785b01d3ccc2c74aed6faebd18b9ee948ae93c8cb0f13b5225c334b5f422ebece17e54f5403604dda34c02416aa79de4f3a3d66a411c8b64f38c5dd256d5ca2ca95e3b1c724b278296f719eb70683a2926c5b5f4b9b25d13f2b2706eb6ab79bbc48bf12118d0311993504baf3a92ef79eda66cd6922c01c491c37be3f21109a21da5efac144ae7fedc440b84ec7655631b5e1b3067e8b1f4dca235b3907eb6221b3e38d51a08c36090c307aec7a124cb35ef75345c82adea4a6fa3323607aa20fad721cbcc82d01dbd7d6863b69da9792faac75730a5f5dba4a24453e91319cf8e72c2b7a9498821b5159680dc51682eb4c339694af812e664f8d5210674f0a55543c5433a9cc6573eca7ca607ebfa5efffb0e23a009f404beff30a280d8de6a79845f6687c8f137fed4dab02c8984ab7f17a22b0168eb559423ecabccd6c822334092b94858849fcbc7cb20cc58f7646c0f8541066e654811185b0dc807a0c53c785fdb005474bc54280f34871b137b44848dd0cac5d9226b342a247461ca71b031fdfe17709cc11bc5ca6fe648c13f76f7f66549bec1be4fd8c8c1f05f8e494743a25dd52e3e346366051d102e7aba6dc391e529a5a1b09e5d141414e402002f1a81d2eaa27cccac6dff2c6e38f8b3584c998809c5e18ad500c3432801b08f2cbb3e7df907e9a57059122ad8ff49cca4ad18d197bd7de4834bd550b893347119e8d323af3f6696eb0f88d600b4341af25d266e955ccee8e493979ea31e978081dec549111c7bee584f5d0d18d432c52e8058566d1950928fec5d25f02c42329f68d8734533c1cca80a8adf8e74ef4d807b755e544e2096cc42d38517aa87189bfd4bad8dcc8fffee414c19073fed509191f56eee507623d8d1c2431b771d7a7b41226d532f9da0c837bb13268d542b493d027131cd0abb4dac1eb85d680f31ac8f91a3c00e889332e1459b7a3611b70e1c5492a8ea9b4438315d5cde863b834a8ec122ca6034c808e528dc25de3eed1ebd6d7426843017eb2b7cbf1b07d4794316cd3b14b2378d3c5cb76217ae46c958bd841b27ef7823e2b0537f1022b3d8322e85580aca303fbe54dd1d2a79eec2d48e083e77df8b4d8924351ab28c9eae2331a46c11a2d6b589cadd49ee81b060de91d04f5efb9515c5049f5b8e82597ec0120db12ea26a062653f3d62e96284e9de2e247dde2950efeeefb653cf710680eac92430aa11553d8049183f263e2a9f11f51b +shared_secret: 598bd66a4a063652b2a6b25b8d1c3bab0251682ce6c362a8c680295f47f3d6d9 + +# Official test vector 15, seed: "669c4ef8a051ce201da65fc4bc34d398ec1f806276fc5d987ad71d93bc12dc8f107b58be6e8422a0795c88cb9a0e7488" +entropy: ad6466dd59f26b762fb02b19eedf5f79964da68bce0459b91c3a6ee5a7e01183 +public_key = 034626f03687751b2f1abac22b4c2b1ac19567f3324fca5d82b147af141a004514d831039a612ed69b621ffb4223109171e6351bb35177b85bb5063161273abf861988a1803e647820bb53b282bc6d04cd3e075a4a1b6755b97251901a81c7911437c528951d007d9ed82368d4c833ecf2aa1a806cbad08259470461f7774a922227e812689bcb59a3483c8346d130650e06383556c067f94d41dc1171941efcc96e3fd769623861bec9bbcca4a5ed22c10a36a59efb5d7153859df348ef9c3a2745cea329a73cb831441762820c7d996b88c1d453c775a16ab2c752e68bc55839d2e79544b87af56019f02b794b166f6dd60e8efb0b14f00d1ae800e37bbe5ff7c7d47a257adccd2949cdc3d9318a0cbaa34a14e080b968533ab1d9ab674c89774187d592b4c86461e84ac0e6808c96090abe6b0cf69a2056a1c4287b1cf3dab74f8ca66ae8421fa200fbaa4b11760ac7529b92db75231958e20a3f55b8a3396a10fe957361a9bf41941b90583d8d97cade8828b8a3a5ebc36730c19fa7346aa427c489f56c7cf3716928c9082b36d3f3b82ff1348eaba325ba8c49acb2673570dc5548229ba93a5c210b586ece088d6679c975b60e0106c0003625e42c1bafc1ac1be1c1779556a95ac68776ca01363961132ff75c2185339d79a426e6c0a0011a260acb7cc0583e71623b251cb8ec1049da730c2f9a26a61075aac24ab1da2732f708221a01b27c9da1b520beb7686843360a11a292568993c28bafc7088c1767b87523e9450873f9c73912cae517ca29c066631137faa16d217ccc07f840e1013440da2ddaec6b7161b29742a2c941c7573bb0b57a58a25b00db5012a3362774fb35cd80c6f0a095753688b156b510561ca47b436cd5576ee0323f2bb2967022fe391b9cab3f41477787a96ec6667337fa4ea29b44b7c9610ab69706e820557ac7c9f9c55ab4a04fcb05ecc4157b943bbafc0b0e42567f95b8b436838d363da680a42ee01cd5353dd4276b4dc625d492aec385bfebe9767a2731fa8b3ce9271cd8d28042b66714d98d0bc0675a54b3ea3c322830a5616816c43260f6f21947e3499dfc4f9d76a7977cb467899b455a12d8628e93acbfed99cd8b813d21a15024da9ef46b1ae4f6333dc8933b52a5f100bdbdf2b23987270d550493d949e83a269ab42027b34a12a177f185af5f76ac9f9b1cf9ea4eff5529e0247d3abc3ca08b3a1d081a8c75a1ffe4337711759d25b9cc673b0263177ea93b56667c15f82b483702973c6436d40953aac60929a36a911ad25ac109a10841fb95e1ec05962c5694cc3cd7372260ea4863109254c26a44f62af0957960634354f62c624c5723416f14966417681fec883ae47544b753340f749b487a095f89784f15a6e7945da56c9e0d2c358162213403609a1c938c98c68b70a0fadc5aa746ae4ea9868f19b9ebc3282ff592960b436a7a7301e4c7fa075ff50762b866c4a9f157ad25291347a9dba5cad62c35b28a3933f5269f33a0e6d403e5721a0d36bae734481c43918f9b13acea8f6a13b1bb584938284c10e3806ed935d8e543fd5bbbab0685f099c2adf254f4906d6e05590dfb1544a32ff3bb766109561ff31c164792b6b0991fa93c14a74086a585353c3e620d3ec5b1da6ff7959016b53093137c512dfc18 +result: pass +ciphertext: 05d490f575c5a991065a65008d6def6ce79b0c64ea9156ea6bad47fdd3926889bfd335784d7ef46aba3615e50ad4de994de59889aa2f9f8ed1de66b3caae0ad5079821b135781fa2b063198a83c0c19c3b9b479277fd1f0e7089ac711fdc5036b7e4f6d279b8b84de7724bfd425dbfae33485bd423fc10c2c576a4ffcd78eed1db45ec71df0fbf4e53e9161b174f536c88af832928d593f3e80fa353b33650a93bf4bdda6b94807b49ed507cabbc72eb3273ced31f8aa4a1c9d68ea5d7c337ca183be3cae57d0555bab6fa19b36f59c575d1b9a297eeb9c561fad4b2056a3c3ace6ed886dcd84fc4b52511cfa2e00fc49f7cfb2320e650825a2c8ca39e68be13f3514b0160e04b6d58e613bc2a70315807224496575f6b5d0934f6704cb6c3b728fb1857130aa9012511ba9344d6187191dd500a1b2427db1f5355342aa5e0a29ba2b94cee0fbf808202afc594322124cdc12fe49185ce8494950d08a4b0f6970d82e745d6a3cb726d13e77c1e5a94593c678baa1b422d71312cadd4e16df816ddb13a0d0990947c84322dd17a831f21261f82986453a1aba53e1b13a772d5d29c211fd2a37d3c1cbdce6812a09323dffdc404a964a6d842077fa744c971e4e0bc42852d0a37670837c2bdf99e87657c044c5f56a8918b163808139d00db7aff2b1768fa327a80649a67201b8c8ab04278544ed5666d6460e8a30b54283bdcf4748ff1e4328ca86eb42933831cd74d99e93b760f3dd2f0524c9c283a2d81886749e052afeab286830fec68628c4d3ed4f958678c03962b02a6b37c07e0d4ac3b3842731da4b309167fdb1cfb2ec22e9704df4b86479cb404cb31c69798bcb45eecaa31f2e80da2d2e6426ed998983e9569ad4df5a53077ae69060347012ffea15690f222f20bf917e2bb3654bbb415d38c5512888aa029df25ace2b15bdc22266b41ef0709486273c23fb1c6c4b7b45895af4e8c8358a4a40a2949142a9a773976f8ac4211d82c2f08d4d1ee348050cf24821c2aa14285d318dd83a876965358936cf7dddee74d9c9f24b656e1362a040e684b9aa38730701776a3d35a54b48a37c8f318c0464b448e9a184d8c104f1ca092d18984f5e7e65d1991bd24a237e8080f45b2ff4a973bf07c784a8e0c39b90d0bda10fbf3a1b34978de8feab4d1dda3498f1dc0b8d58c5047ade493f35899a582297b23b8807e105b373d03d21a031a8c9e2ec54a2ab4bc16ac9874a7de8342d346a57e13ac4e75e9b3543f4f6d7c394a1c3a669501ca56f571092481c09fc59f63258f5962b058aa821ae535b7290d42bd619d46f0a7fe4ac92f62261e88e53ccffb5089cd0f6f99836f8f703f9f82a906a191e00b99520b3d3e3a57f3f5a532806fef0462851d8feccb4c75beccb0e67e87d812a3704fb8047a7a5910fa609ebc0607de4ead78517d7c6e4032b018f107d945dadb329e170d99c7d14f05fb2f2c5d0be443454ead35186ab3283c05478aa9b71d7da66fbfb9ee6c47429a4d6ce1da77b526223027b2f1ed41ae66 +shared_secret: 92bd980f79cbb34c67594c6922549b99962e54d388034ea61f892fe250581c4e + +# Official test vector 16, seed: "9debccfe818f6b5204db4ea09c03ec9a19dcf1629c1527685b8a29776bb1daaec45f8abf8f0adc9a8c8bd6e2df6d8048" +entropy: 1a4d5dff5847cfb48333e33bb00ca7301b144aa89dcd412ff5a3b1081d775b7f +public_key = cd187009317a52773c57d435faf794021bbc709b8e7d688a5dfc686c15931221a9016c3bb461a487982ded37041ad0c1d032714f7379e2fb9faf5aa6d0f5469c7156800ba258fc5b25d0996b6735665a806a74b03d9819a5832a6685157e7285df397e23b13a543a983a5b24264c971a73708de1572852465732c94830719c197c7985c0a7c53525a1ae76d18e1e9112eb4b57c1222320a8156643cbc9535a27658a3709123cd61af7798addd888053bb0de254eff530296f9ae75b2ca756539b61c62decb0e9ae611678b5190503344229096c34990a61ce8b10ed3841d48d266cdc249acc96b7d88010899c453467213d8bd23e1764e0237480c34d8396ef57c1aaf781c042471d04077eff85338ab8caef22ed064bc38164070a00cc78b8074e7569a627b49e0416a705386601d3b8a6c10a4adcbb190b4877422304ffc776b4a129d4098c603896a6020725986cfcf0083fffa66eabab82db734f5d1b5766104e8a2b8b859b6cd166dec691ae331b87e794a1c9b083c14b50b85b7e97148745c9f8975733d4262e247473ce53b85d01c6de505a352bfc0c233a396c87f856981c83fb74542c9f3cee1276f3096486ef23359c51ac553931b80c6bd245b2114c4a2d344ab53765c02c82b41412afa1ad5ba6ccee9bf09e375eddc0cd55bb6c727be26bbbc4e7392293c59455084b1542c87578c63511ae3e384e027bc07ca7401cb0096d1205f4ca86d3c73ee8273de930799369133f83f4667a92e72bee2655b17120dee233433f9c68a50c57fdc8617ac1d03f0961d4a7bd17678d8729329a0ba0591ca84670557e15fc5eb4e8255007b8c4e48206f62062e1dd53bfc43af02405d2e300d4858b1b9c9ceb531a910c0bde877450a9aaa8878a2fa45089e184d1fec1cf4e3909670bc11e78da5d8cfeb86a4c087a1b73a6099c99836b3cc76366d35a9854b3b205f4b2b69666878614117163fefdc32b6db37fdeab0a0197f79db088c3a355877cdb1313a2f200e27e37e12b4bfba04691f82b1c2e8b8172c11e466cd8d01286f2a3a4fe5a5f920476a9278b9d25e420b77d489386f9c167f2731654b19fe4886867b79ee10c18f679fae87826a0b65b44a83da5a35e0723bda3467541228b80b35d5ab869b52b5dba9b8b309360ff1022d67bc93747c392469c28b288cb73fca74001e5bb47d5b0321e08fbf832d0a9b0dbdf566d3898e1f9aba7e3c011a14c3e918589282c0f167bf14470d1f6c774e6742e40a1452c70cafb941624c02ad201e6030bf3dc6a039e6465d6772d1c184c693bd16c3367f02730ed6beb95940ff783cf9e307f38a7f4f37754f6c4ed26a1c70c90741ac89e56c989b0260f7e1178b5b975d54aa6f420e97a7b90c3c74200359d561beae98b1af044be40a2ad8491f42662e2f34bde200c63ca48e7409727c8b2185138ae7859ce43558349a1f3e641df0c14428c0c12d0a49abb904cdf8ae5cf34d379024ed528e5d84a3d25920b7a94b61a8abf9e557ff61c784501fc9e332f2b652f16a0a11148b8e594d1f377035e124d637659d4485d909543818814fe7a8a173bc8aab7066d2c927c90660dc8d30364d60a31f1d94a9e5f586cd84c167e2577d3326e41a614382f4982426e93391380c4b03db38d0f7bf0ff66d2d93c251d3347c64 +result: pass +ciphertext: 69a67c3915a5e699644ee255ac7f4e73fcad84976ee94f610426c60e9e736a2217118ceb9042e6d031bffdc24d61a73bb158abe5d57d5e1b7f27bbacbbf87a71925db2aebd1bad3c9b3e4504310862e8e79ea2ff1833b13e815afcd9bd5de8aa8b6917ae7321f4bad138d2b88637366186ed0ed48d4abb743c1b6601a1b3091b47953087bd077fa3432fa9420d40b0619465ef46d9347aac5ac60ce8e0aeba6c200657d3e4e8fe9dd73ddb9768a1498dadb9d15b9bc806dd92eba218b5088944b394f2226b01a2a15ced5e1e567779ec5e8752fe51a3ec1a6af64907c8b058aec3a0f323c31140904695e5148ac3d645cc89d458509efbdcc9d2bd46ba57cdda957eaf5cac08dc18ccc20254988ef1f8a0c1ad578dd061010632606dfc7dddf116a96b9704ee90102e499a182de5c5b1973317489f2a95cc015c86b8fba63b9c259a4276155b1fc7ceeba6c0bb4101d8dba10a3a297df54631006a861efd0cec14f52952c96e99d147dbd0f71c6aae5ab362e31586a967fdf6418f65d2f3bb9a7f4ea58c4a193f8e3aeb6bc048f7479080374ec8685bd3c55c83f3d864afdb65e901676556204082b90afb06f861b81095bdf538e3524fb1c07b9c0dacd3a5fa4c69c47aee8f9b6d636e56a2bf166060a31ca1966bbd36b8495c5610f86f279741260f1580f8ab41e9aaee35128917c0a0264aa992a6d2bc4516743177cce2fa2932d9a327e11cff1e86fbc71c44e6a49cc55843b1f7b78243419d53b15fec0bef99c74574e88cd27495a5700f66ae30aeb3891f839829cc1b79600e17cb5d4af88b3a2c6118ae816d28027f6790799af0c264fd17331479213de77087f7ffcc0d3831aa82e4c0cd73328057a2eeb0651e2cd6e86858129e190ef97ebcc3873c2c8dcba51a83612af4a04144dc4b488be630de461b20b6e1a2f5f115942a5a4491f30db59e4480bc0784102095f0a612efe236cbf6a0bb8eee2b82b399d8f2d594f53574e7ca440a0ec1df010d1c08650fcb5e58607fc8a67a4d08632ed0d272e5b5002c6e782e3a88478bf0e9e29acbbbb21560f546c508faf5f1219300f0340573d6cb747d15f6bbdf2002c2dcc661a0e8bf53dcc3f05a4e8c691f21ef608ff1788266349783eebee6a409c31543a0bf3265a00305989c271ae5bdd42d5293e18af9005cf673d09508fba1580da112f658ef78eb770f2906071e9056142244da1f85cd8a6290eb82b9bd9de96fca1b5a19c27c82824f0d1961575196e0840a93d9cad6ef4e97e55f0deba61b9b84729091af782d041b38ab54f86bc6a3887a299c511521505d1199be958fb35194664a1e6025b85cab73b611f1646b6e3ec3c7acd3d5323cec2d52d46e68cf9ad52557c777e24db30dce32e04084bb789c6c2afe1b8def656a9e7ec0a1f11a6890bad7f766305dc34d39df64a797446ecf53ff75848e3a0737c269f822ba27fa2a158b11ae758c8d8164fc359941c4e8939364690359470be977101ffc685b088e22c0e887b669b0e933fe6f7574a6416149 +shared_secret: b7325a08fa617e19260264bb02ed6b8ab2081589fd5dcc1e92b9d0d4ebfdb6b6 + +# Official test vector 17, seed: "8098ae7a92c10f707d405f7dea02c2efbef44efa132ba8aefe81bd45e543ecec74f10920ae48a40b0653d63532517f2a" +entropy: 34f44ec2092eeaf686f2ea170591a98527cbb03a4fa9477a7aef6b41a54feeb2 +public_key = d8b6c56dc931d12a8092102490881b4e2064c5a9588e257834c1aea2668e69d907db5158c3cc7321d83b9703cb74864c1057660b718c3412cc47bb92612643313c356b6b2cdeac80ec5b657e78cb2fe9ad14c28747e45466847d71c49d1355aa845a5c0fb27160156d49a3af1d8b975d694186b06a5b1111ac504df3f91ce9a4b2e248697f9a972e7b0cd048c1b6f7581af20afae4c1b9333f60e73a0dd1ceb2e19887cc712d0bbb5c24054553c3c7c972e87253d4c46c971826e8955ac0017ca6d6550335916d6a939f5c167bd68c09d85650e89b40a4686ff0bbd921ac3e43641b1600a84bad0fec9524f09fc920916a31b081e88a36803715b1476e57ce39ec27fbb04256ca64fd11225e474b06bcac9657b31de3a39f4cab5b65bcd8896655eb924243972b0bc9b755b0c69b837030a07937652c8c14f71745572882d222ba1208327d3228f0778a215b8fe6f4a14a9b3a56ecc56f09c49ca31cda853db12a2fe5d395a00cce6621833e61c2cea5bd6f0bcc6ec6b479e334fa543229b619be566e8c00a1dc7837c7b5651b8b6a94412ccddb63b8213635a5745a54bb56198d325a59109c75d2b733c77738a1328bf1370ed99b7ed8f611e69c3ed82620ce95088a91c6c6d472294260a1c5455291188e010a9467c816938f9835c1a4fa01223494c885642e5c416c82223d614a108a1128e53d9b264d61d798c4ca9bf6abc72fe779346a3208a77542272b591a6ae781996ef17961284666c85ba91b2de5f0bf9af10eb91c5793e48fdf367f46f586e05b2dd65b262506043de419482071dbaa2568256a14825b8f094b796a527fd25b8071a4041a1be279c2e3f543021364a147cff6740ba448b7010b4ddba6aa90265a95905f141a9374970a1a071799d813ecd77073b453cb2b6d83ac9cb8267a5861b9e2f23d345581a074657554781e4782d98333f1237dcafa48087aa66de4209a9a78700b09d44a0b5c929ae6612acf6b5d8ad20404a161fdd3639e659bf88291d41711015432f0e7ac759a67e0324f94c1876314687ac377ae48a30b48ba9986714ef3064f087c953ac6f86430bba9cef9857b849315dc4379799092af4c5531fc13f63b186939040da2233be05371d448fa748d76f98c3f638a6bf5864b9bc5fbe496d72966e3004409e420bc4353a5d55d0610843d0b8e6ee5bb5d6c4dd1462ae99a43df586b398a15ff5b5ff58a4006987613f5caba694dc0f736f6d47af66673e8f308a6044338d23c817c0420e679ef621739e21a4a35140dd2928e79584f787671b118e9e71e1d9430b9a3210e11c266876a44c7082e7ca5f6dc4b8d931f5bfa302fc790bd424cc3643844418f6c090e2cf5bf60f08c489bb87315464d90006375c34a5297a238a117a8770cb9795776c11f8a54ff13adb3fa77df3757938c28d03a612324858a11a860235e0e15284e36035bfc0178db841c679a47b93e3b09a9f735955d6bce328a91f2fa64273917b7371fbf166c47e9683776aec02251eddc84032cb0a852594f4c7875792fa345a43a68a193c51492a39c306b02f22c60ce5a8468c3050cc3965e2982e32b938a31cab1f36c1da3ca723261be3a864e2912199262c46741fddca501df33d04a79f8e3017e6197ab24b062cd98486dce2a7ffb22e5798643cf9ba5 +result: pass +ciphertext: 64f1a93ea3e3017634cdd1c24a7d5a1701bc1d9bef3a908e70df00b38a15eb30395503908dc45c0ad971f0f20f72c4a75343b371ecc0a7ca7f18eab8214d8782952aba2b088514a7b232ce93385efea00abcf98e0b0a94f592ed365fbb950dbdac46e374f3261197ca7a2e31b6f2971b120c5c8aa430eb03c314cfdf15602003129e22b827a20658834f04e9e618f6fc1125bb9b71fcbf2a66e884800e74bde13c3cc9c599ce9bb815a8934f60923732fbdf1ba1a9c034fd49d0d809940f89e6693efa4bd9c30093af1a3fcc3a62ab5efe2e944b83cd93a855cb4597f3f788322521e9e11e8adb20fef58ce1185717d97c593d7423fc0498dd49fefa8b40e6c14ed55522b71298c6cdb499de705e5824c8a00431c778d21b82bb7ef6ce728d669ed541701ccc6c03cfe0600098353c9449b595017f567913bd2d233ef9455884001b94e3fcbda4edd94b4a254a4cb88bb59441e1219540328520e8f68e9c200f069af82c2dd6f36cac81f087183da9d6a2d861d19396289f93a17649d811ee5240c5b7c0e8b69adc82675d2d1dfb14d1b62ffcaf6b83bb7ad220974a87833f6c12987d821b6b874a3cb998211b54e9e70c3bf0d71c1ee7266f562d0ffce4e10dbd025e9a40b3610af564c051d346e2eff83fdc73d80a710c36990041dbfe1cb242b66dfc4dad929108d00b5e9a1899a081326b6a2956e1e352a6234dea100ef8e671f94b10612396d5a8ff765e97ded64ddf55fbfb9f3e8fc202a1d5cd8c178feb5a01f0a5011e29e018e1c9bc26e49901984dfcbed1c059bc9d9fc22538e57719ae514ddbff7a2cc9e2151f7c7d944456c3398f65513e66b73efe8594bc3d38e83cee3a5a939f20e444be0c0b48520ff200f963fd27087266706eeb7a5ffdeda7be32a98ba2a5df7fdb763b7f15bd2506d39c62e9d2750b084b44ced6ef79d6582c61e6caff2dfd69c7849c89befa002817a52542b155bc51e6a1bb50134bec0d6e272cd6d086eabe8f9c46123eea3f6dfc129640d6739308c0c530f2f0a5ab7695721d34d464e5b98d5200e5a50878599b2482a15f93b44ef13d6ac3ad16e7fbdd53a9476398ddece997e77301fdbca0cb2d406bc9372117991ac6ec0900a191c9712af80f8f6d33462e13b3b9953dadbff25dc7dcfb428f0bab661abf3453274648a5c61f729a7e0cb46731181639d43ef13a0ffa1abedac1b434abd5896c80a3116e4593312b13d4f5bb2ae47873b4dbcc51cf2c31bffb5c0f6b33ce5de62ecbcb78f9a8c59aef6a9436cee773dd6e11c177589b1eaf41ee4d3e5ac949d85d8468461f9e1a9201d9d100a835fb094b7258181d4dd585a21dc9a20241aedb30e1b4ba738039cbf237f44cc57abe3fe2820903acce0d716eacc7e78d65f8a166b9da0f3a3db0aa97865ba6be3aff891f2917c55b5220f814022abdb809fc33e0c430b6ab8ba7af0fa94584acb88543f3bfcaec64e953344dd0015ea3fd35156e433c633254c971c842b367707ffdee668ffd328c7c12acc134ca505c87833b +shared_secret: b400082a764291666c080ae9ea9f22c383f3c1e87b4cc56775a19c8ec29a4157 + +# Official test vector 18, seed: "d5f23808871544e9c1d6eace2028362b48e225312f77663e9f78cafeb512b908cd9e25875d61a16ec615f4b8ff826856" +entropy: 6250c81126572eec2da330271db36ee591f060fc7e53eeefe2e1c476c675fa33 +public_key = 6f22424d97bfe0b7cfeba385c55253559b0372fac0c533055ee490bed57446b637fd0c07c173b2c61345185a0288f1aa074accae383c75208fa03a6a175c3d19481e79ec833057a8d2c234ae9b01376c21bc75277738b17dea03eae594ea939e125c2592bcc95d3cb4f76a8d8383b318a48f7481b6b8419e8bb47cf1229c23c4800788cf91e465088a580762ac5d31616f114606c54efa9c0490298ccc23200154342dc7709a5ca5ca3a94b7a2ad8ea734b6e20a2d15acd47c6aeada3ef3331fcae173af5191ca8b74bee31f1b7506b595a3dee0899381111680ab02090429b93efb7b52a6884d401841a0d8193953a5a5f2417df927e5934c109722cfe18d0ff93a3df69d9cfa4d7f5801d3294771156e828924c65a18bc798006a1c8eefc3b4176634690c061b902738024c0ab981c3506d11b8f307c8f1cbc25ec764fdad76fb2117aff430c5a5a468f2966bbb877d2b8335ba3bfca985864f21a9912bea56a007e7223c7249b2e45a37db9c104438e76d16321289d4b07001241aa2f0a1a24d81c27a9adc0c768e1b3c72fa08e33f77c90f4cbdd530949b2b67da9a15f336b679937aa825989b9a450fa5f69304d37e585bc039a154257ee78907f689dfdb246d05c94c3057066d03a2f9825be6a52c3376efbea3fdeba68e13716d810b73662adda56bf30031b8f682c8ab08c4b0978bdf113b4432ec712ba306a63c327978224597c3b8155551997bb7e2881102d8b3eef786be65196ba84478c1c629f45a885db1aa4ca443d8a3300316608e8c2f71c6c7516ca5eb453cf9184bed2888ec592dcd53fed23b5ceb98cb575c474b51e7fd64d73d54f37b51fe1d432b2150ecd5b0dade606d83729586b2fdc60414a558c3c19122e47858675179c2229779b40cd882bfeb3059ffaa93552443fb70fcabb54a7015f8b6a0798b090fec5aef185cc95579aae5caa2b4923ddf65b2570c15b1b0464c086114975dbaac5a564cdfe02cbce8c68752000ee81a9eeac55d4a81be9b3c66aa3875761049565a46e305459fc7a47d75316b59a371cab01dc3bfe9108003d5f868b39ea617ce3091e3ab646db07ccc4a09367b352d1848b26e920100827c8d4c92f0c222d8482606233adbaba3005b58fd3248e67cc75733feb52a5acf5a41ab71ce0ab7e8fca8113261dd4b7297ffc9d37899ab40b0637c02ff1c73e81a02762fb264f51c849d387b9f7aea345b5e2ec44f2e0866b9574bcb13ea0d0aeb7a78d6dc7b5b0c9838297c05409bf90d86b3c1b59b92c998a8abf34fc490259289b431c5c5368acd762df8ca04e0235ae91bfd5332d67169aac2586deca4c8174386617ac98471366283f3d30a971c62f35322ac96a7b0c45779f6c17f1117a2f1b454e3557ce5733cf979156400c5a780a4da91ab8d99c4f98b141920731f361ec30950bd0c5653c83dba87658674c57473dafac42f293bee44034b9489ccfd5141ee42cd91b3c3cbacba092cfef6ba4b0a716d8162521b29853522356943c697a10948a50f27008d8a303254327c4570af822024f5b9aea82a62100856b2140015418a9ba3e77325b911a582e92a8b8e123816405ed8382820c0ce5ca491c0692b2b542b6a67ec87bb6b0334c1833e12aa958fcc0747802853f8536c1e24a0ea6e13ce23c96726b5cc8 +result: pass +ciphertext: f3559c274dcc21e1deafae8b7eb2b8f482b16570c20782312aea16690eab1b983d149994a0777c22038b785274ab1811bdc0697aafdc49487f80f4139bddd82efb395dfc83712b4e53ee6de05016f3277afeb9e3aacfd0dc21264822e93438fee414f2d8284de2e1d958a328ddb5107532d1d0f29dc93a5b833600469231f513f0dbbb1b32c0b527f469bfd08dbcea4e578a841dbcd97d92360da0334e5a72bb4b1d3b936ea94435d94b23f3a3549a11c204e1f33d0756ffa92e7627588f5edace35988346621d7b2d407cb5c3fc89e45bcae6faa82b1b5865419b9447e77055d000de9b0d80fa551362b548b3f6cb76d2325a51097e05a75691070619cdc4766c0988325b6341805a865fada300b997a2345378d848cab9ee8a40c9447532089f47f2deacade37ab519f8f10c5cd7f326acee099ada48f74b12b799a41fef7330bd9bbf23e8fde26ec7a4daff7680e1f89f25760a81117c2cebef939d71934425a0ef295900c58c2eeef7f2cbc5bff1ccbb2158721067310e0640f9cf17de6dfeec8c1d0635dbf03d32b1c302b866b343cea1c9cb7b0a57a69f22d1ea050d3587b152dc05d6a838997bbd38f162743200054c1cce745fb9655fde5020a4fb1f0f8da267fd6d3936c78e28d832534e47325aa19f6ae0fab18b9357ff59370e1833b2fd3cd65ec1f36f0e506df4a517eb6298c2e5b1dd9a8ce9dc2ad97522b607c8d3596f47534f0a0aa98aef70a9721eafbb8c46aaba1e2b8b9f12dc63edde14f2414fb3af9f76f435efdf56a855e4f75e15d3f64c1f655484077d6221b928ce551c4854f6f2e249da98f1f493c7da414e7f8bb7dd3596bc8426d1c064df107959503801fb5081f9b0f9cafea6d0c76e10afa23a49ce3b0ea3c648d895bc6e1b39b6454a529edbeaf86f34f6b253e0e5104777ae4ee5d9f3885ae099adac63db65e43f6e2765c7a4d142a62069032e3f72422d71166fa4cb75e205aaa513e4e1a6b87a070ebce326e8f17abb2b81ee4e9c7233b5d4a3c1c8754268501482431cc4850f6693139af85ff841229d499e1d37a3c7abe1d80c31121cc7790fe9a9203f97eb5a0f681c734066c1981adc3b0d9fe253064cb546f46d92ae06cb0e871f964ac0baf8f8d1e8b5d1f3f6050374e9440067a6722c6ac370baafb51b5af44ca940373338beaf1b36421453757287f18841538c6ba9e1aed10a6e3f8df29f4db175a1e595a0d880d72c14217030a81f3e57bd284098fd93b5602e90012d1417a52a5c1ac4d0641b0b9f39217571a30b20a364045d7ac2c1f0ee778882c6889c828ca6e3d04d205148730e3d69834526d5607b554c6f4c34112f94a39b2044642b65c2cb7a28a0f8a34c59d11af9cee28ed98de8a3e65239457d087d425dbbdd8591288d4b1179de2e6af5c4c22e4ea30215a635f64f5e632d78a9475307927a595b88b5dc6b54c6eb32fd249ab9d5fbc66a2531341eaca902a8bf079c4bbe45d0dec6c014589182aaf13bc05be177be4be4b8aba60f744a21c664bfb1182d7e +shared_secret: 03c7470224ba22fde280005d9a8f8354c49459e9a168cc282f9d41f4f0d2da2b + +# Official test vector 19, seed: "822cb47be2266e182f34546924d753a5e3369011047e6950b00bc392f8fec19ea87c26d8021d377df86dc76c24c5f827" +entropy: 35d470bcc5880872754810dfb3f2796da2fd7f397537146f6488c27804072b34 +public_key = 010510677c6c12c76cf7149f35031c8df3b243140f9716a571f62a5365a0830169b612abf0075ab40132d51070aec5566fe953382ac3a3705b8566064af52b926b765bc039d6f86ab8b27cb93b809e670da4457bfb8b6be9aa54d9b2bc94eb0c3e15ba6ce2b08ad229a469312a5caa04c8a4fca7c76cf905c6fc4d32127d84981608810a4752b9f26baa12665bdf30882d2a38200798de4a5f1d3bbb571085ab091c03e896f25b8759e43795dc83c2069fcb2cad05b166def78d18b920e0e59853c66bcb11795f604963ac3af33b43f78252e06b39d11449012b0b35bc65c2562a66f7597302377eb13119fb4285d5613d618c2227a8a187b132b08bf5b154745451fa627e0587c24118573f3628e3da59e96c6a66d26c2880c95eb1abd96202b3673bd64a74d1b11396aa406d378183325c9d03b8294177d3d6439fa79a2a6457d9f81ba8134bc781c575413e40082c686ac2f59c3fb45a580d3a50add274add391a09cb6c559623c997da498c1d002b0f9b5254c26266757849e7598c941333d580a11a1c197617b23d98b7da60b6af0521e287f8b0cb21522236395a60af9ca4dc7120925a4bf497e2ed65bcce78a33555ea459197bd5a499bc7c2b788872916ab3b961f25094cc96659db67bfeab52260456bb775f56e492564456c5d25f3d0c9bbe7118615aa37b21547255112e590eec52928173292450abf2e834f6207751b068200875d7303e3bf7141f28aec8653a463a774dbc33772849385304b42c99d3e531b0376beb153a56734887c1cbe59b55bc3cbb32da63d908345b200cfdd6303f3999bc873db53342aae6ccc789b2a4c72c7d08a58feb9c939a3214aa3b2bd27ab108aa89682e08729cbaf93a68613a8f56b7764c23cf085f6a970d8abac213f7314128aa64da213d5a53d2475f7002a6c354c1181bacaed645fae9c7509a0b10c8317f714d37f3791c03ce39c79aa0548f88a69dd6f87dd49a8e63307331e00c5c5b5fd7d9804f3c57028c2d3fe65d87ba7c07624fa35754421c4eea618cda1c5434b09acd0754e04439240988ebfb5f6d6a43c0683a287b5686364fb9fc6a62551916046442004caa42428dac71ef5879bebb09c5dc919076620b9701a2d8af248672e2ac0107c62159511cde45120ab84993fbbe65022dcaa6369508212d7a915183555181b1b9610dd147516f2496eab20f727724d7178357f50e23691c29400bf461c389932e2e663faf31ac53273058ba675cc0c3367c4872383f683a834b4a522b92276f70022153aaf4622f24f439a0d382fbf5059744c487013501d41fe9a99966506f2f5651b3ab0fd0a73c02634dae9695e850c67b154455aa749922229090b621e259d1f193b524579690262f94c114d9c690e170e526a99f5149a2840129d22c740cb5b2a50ae7809388147b943a4263d50ce72a2fc2fb6efc85c065502642f015d6b83aaf0880b715983bac12fed75b1c973046c79f72436a420b790543349b917fc4c3b18db80a1ad346389180fbb9bba1a6a8a0f0a62e6c24d580a16580c682553134738d0cc1ce766c13bf74c82ef5c548f79de19a0f2a9236100a7adc1b2f1e1b1d0066b9352ccc40663d53b0af0df9ccd6353381e5030ac08c3920847f233164df98ae8ab017efb305fcc83fbd22ea59ee59bb +result: pass +ciphertext: 262ecbd1c283c2064969cc4fdd0f4db58328c1d0415c0d279a737781571f37df0285542dbd69868d4dbeee51b9f7e73a4ebf5a2fe760ac58a594c1d451415eef1bd357d9d39c8c9e882880cf9f0fe8d750d35094aa8c8a7a33042d75d5885a7bca143e46db1c1f6ca6bfa81ab38263f74e78686101477c2f1cb733a0159e0b5fd1e3a82ea8b947f072ff363336bdfd185bf8c87f677db91dbd8f9ae2e40a3333dc817cab3ba73222443be7ed324d066c2cecbf48cb1a461610825ec8973327fa5c4291fc470db2634a942d59ce4ffb7c1dac2200131cff9ae5c5337d856bb5a959d9094ece3359f13aef1db3a81c32bb29fdb18550de8a90933402f9609576a621a5b8550a4d8bd025b08ee5fd29a83247285e50826cc778806871e9b4b2dc9257315001ba2ce2f15928b730b850fb96cb796ef7596c49c76baf598db30e3e03421dbdce7ff056ae786daff65355ad8bcac2d9fd09d659604381dc650298a9b0ca49ad3713569e6a5883b6165285d6ba97042ca40f823fc6a29c20777480e503dd5c731be8c3d5c4dd2f4b3331094a82f12f832dd8b2cd1caa43a4064cfe3556c4061cf53aabe3a463ca692d46008c4e212b475f8f127ff9f897dddb908da2cfd650db6289678d6fa52d96f08428fc2f69f19eac596da9c1ee228517f73eb45f9ce08cf0b56c2ebddfd42bf01b8b49e00fd6402bff5b456d7feee761a2b36aa31c363ae9635adf75979d2082abc115c8553a01c763c0c068c0b3d17b6690948392d5cc30c569c1ce7ff0bbd769251619559eee99523fe5e6b877e1b7b4b98a212b714447ac970d1b1f6411596c770b427c2b95fb0f4fece8dd3135bf3f8f6f4c69f673ff652a8eeb24fe64170663ec660ca27eeb43e878e8a4d509491ac22f04cf4cfdf389177fd5e5c029ad36caeda9f2a2eae6229b3a5051b4ca586d7a626ef4b2754028c0977d2cc6a803697a9d744713be696a0a643eba0f758ee467118e8954d273141a696eec5dd5bb3a4930cb825888bf95f65f47a2da8e4ae014264818db44634d149da01ebc065da3c7f25fd74ff61edee01c0fc86e19365c388b45170ef50bd19bc4528fdac7e4aa5fbcaaca5ac8f7c3600c6006924368654ede616e00a6d425eababcb41cf47cd508a004964a628222af4d8a049d7d0da51bd2e2c5a1d10935c291ceee529053a5d7126d544737dbfc866af9c7803b94d46388f7cb1c03428a8580f67e413d106e1bc65ca4794e22a97b9b30887a408b3afcc89bbf12e7c962fa7abc566cb5b4147ab1da02d2ac0dda2cfdf52f5e4a179e2bc308de9af848a676f3c3d026836b110da01bbe087c613ea6a364ab98d73628d1f9e4bc88d0421ade48692f641ab46ba6dd9c7d936475b98433dcffdcfe5f8eb1d7911fe4f584869413bf1cf5d156a02af1b79bfe3c8b2d01c0a3d76ef0203159adecfed5d418e36ce5def56f2a5b5400c018a71b9f8cc85ac6362d03742549fa6a84b74aa7d1ac71f5295c9e15a6fb48f84d0eef256357d6f5f00d2cd27e4092714d +shared_secret: c31f7372e8c194a9589042477f34da3a60d591ea65e13bcccc07ba59402ede6d + +# Official test vector 20, seed: "81401db81138d6874e91b7c11d59596e4ace543f5a3471b6fb00999221765fec3ca057abe20f03b2d59003375fd71fe8" +entropy: 8d667921c5db401a86fe1c35dfcf164a6bb2ab7400fd6a0b67eafd4a0ed11940 +public_key = 801c4c929171c164522aa3ac2361b8c80b8cd3e644f7d169f9a20380bc575968901ed7783b6969c57461dd879d4781bda106a913c629be512788d4c1f92a71f9f819ab7207d1a65499e061c5e0447360b4e70503bd58511e4c3333556b75f6a8945b8661d0572c764c82ca70ec870ccde0cc5810b816c10a46491e091c75f8b24eb975867e179d38345bdedc627a725b4d732b7b453d9b15710fe7afbc55beb26c77e9e8a58bfa764fa430f1901928fa4ea1eabe2ee827d44191708310b5e708dea4c5242a8949f658b548a2ad1badb9a6322c56697b513bc1c29872b56fe1e32d9271b44ea0b43bb896ca9a7358f45e1f1821fcb361c6ea91abca91ce95a75588402d1217d1e37a80b3c880aa83c31c5683783e3bc77bc231afc0172beb9957fd7228d8589bc171a2fe24757400cc7e9cab13d90a2cc12b771725e0f2180acc221fe5879a317fb93a10682044d6e22ac67c0722c1062ee70959333c08aaa16bd9cc1b624405f40b78411baf7bcb4af46b80ab021d7c8a02ec8d0417b759cb2dce94409be96f5b5abd1e207a9b906c71c18c763414b2d48d77c19d8e617dc4e41c3328ae39c18aa9aca985964597686c919584114c4b2429308e123fbe9a8fb86327054817bca07df8c7adb4e2a941742395cb6ea24c6106eb95cc0868f8a6452efc5aed297d933919b39a8da93137925b87ada9a5cbfc5a541c2395bbca59f95ab2c4a5352831f0d143dac60b418c2051390396326d49e27b7b6159c43b5de3e40d05956dab59088f417302588e38c1a21261c62abc8891e44ec4c7395421ac09e1b448bc2349dc88c571c74e470474935ec58001be48b854a13d9855b8c87131985c91484a695ce9931267c1d0d0b9ceb4bc7c4a11676c267958566d59431a630d4ecaa8beb98bafd22172a30e14c9acdba26922f0aae067c9a0e9b658630873139b9555b63a73bf8c65319d9423d4a927abe86a95b383a7c0c8c54170dcc70a535b1fd814cb6c87900ea94eed7b51cba571dc7b5e6370bf4928bbb27b1f66d770e43cbbf3ec0c615521e2b8adddb42971a12db3a208f6b690289b059913760471367b4154113c14606c046a9591aa744683c4024b857293eb0e02ec7c75270c571248c0aacfa7e47a35e72157877847db1efd73c0922cb211c4538d018c05382e9c97c3d98cb375f78d056196466519baf3312559315796ce3504731e811432a83294d75d8365391fb348f0136a7fd90921fc3844f57d286845d6d663e855b50d884f511a2020b09048298dc4da2be4a8398d260ca4735d84f2b66b2405d48032cf3174fb36b325e723af241d280863b4d2099fb429c0414433786d33f880d7a15d3fe019e75861c7836490ca2a5b0771ecf904f794c746b4244d99226899c847814967454d7a4aa0fa743e2d2838bc9461446b61d9b006b4240098f37021c7631131a84bd75d33374b9067aff5e900c4d0490995875606a7baf87b8f4960dc84a7eba96f4055ab6043c9fab61fbed883705893aa89899ab975284867f63035a392902a779c8df9cc63a1b944943691b770a9646cc731a93f6cb3dc3b183b71429770032d08a778217f9b72bb16ca81f07c66d436396038372aeb8edc031083d95399084751bb9f3d32490393b510796c16c630cd2d7e0666cab62b5d904b +result: pass +ciphertext: 6aa845cf5cc8f06368e022af35d4fb1ffd740c05adccdb4f92b1f2b77b27a219dbf3e898d79dfd01d8bb73b1a9031028ba2d3ee9e02a2237bb106d1ebc05495c547fd93db7d3ca9b508a75525b13c5ede34944e8931b1c1b60329b96b49a080520442fadef089077289e7cf0570947f927449dd90c296a95306a6de4d801c06801117237feb842bb4cc9941a578fc6b06ca2763ec5f24ed083fdfaaa2bf77aaac924e1c4add5721bc9f23f918eeea2657f0e65f16f9c504282c18f588c6bcf684cf742acc6a96e33fc6bc100026753e9ffba26b4d73c915715a2827e92e19ecebb973f8fa664da4b6b464cee0024b05c3af87e28718eac5074e66992974bcddae43bb552d4be86650fa879dced0617f869a8b9933b0fdc7589c1d5125d58eaca6661d6a3d38d436a55e7aa6735514ada503df971ca3a507ba6c515b58214cdf146aef335f6e8427d794d576f9bfa677358dfe57663b0e1c5dd762bca16bef9d94fc8663c66d4465aeb8196ff85365cfb2c9b1315c2b444e5df7c710c68b08112aeb209cf8d166b9a7920005191a2530b8a8705e4b8ad5a913c08e2b68891583817bc0fb7c8bc0ab700275b81f32ebe4ae4c3c360ae7a0bfc60f3400fc1cd4b3da233476147790c8a63fd8c1d5be09bb516ac4ced4d6661897320186d7d150af8077db1d524444aee7cd374aaab5439621e0c4b5f72290dc24116afa792a332102a671547d38f9b93078be4ac7f3dd35c1eee5414a57db7a4187a6e3125142c81474c4deb9829f704835a4efc214184b1c88213e39ca70af72fb5e7d5ea58b43e829ed2b944787eaffcaf0ca13318a0d2c94cc6eca65d25d3c55038e270ffcc4069102acea6c5e6ec8de8b7c76e871dfd8b1c9a235d1bd2060e26c5a8fd13fb3017ea1fbfa72c608632abfcab1dad682adb2819dea4c7363c9ce3e1a117776712d2884968d9b56173e1fe46f8cb83a027e39693a036b749532320a9e5fad26dc90e91b44c53cf041dac798ebfa1a5cb444ee782d4788ab24880a6577398424d348ecdc45242b46b299840a9b01e11746eed2f975dd58cca828ba746764c5d1cb3a392eab866239a553c52e0e72e88bbe8063876c98d38956ac1ef62763acec6f8ed9ae6546c145090cd990149b7c57fe84ea4657310486e73d85d3f78cf82ef923685042f1c6cef7c7bbd53c809fb8bb535a3ed305c23810ba2a4f9f63da4b7a4cb45599869b57e4f4fcaa3db95be0ed98ac715a564f31c99aabcd8a37d2ec38ef929a15ffd16ec33afc8d7e5c6cae3b8cda327fdaf7bef466a24cf7ab348f798fd8a9e12e9a4d21a34f373b60926b7582d504071e0735affd8d41287ca37e152fb4bb2bd335f64d8372bc4a6ffd472849d7db497f1052599e7eb7a5acd0042e473d303dbd86241966d6990ed019b1d1000a592397495e1e599f15cee611ffbc9ed50af3f29a9d4b27ae92004ff02c0b37fdc04db01e0a07bcad738d73845074bb05b5952c701c5b1eb6a2af17ad5d20c1beb910fbe0c21d0c5eab751bb6d725d +shared_secret: 9dfd08dbf59350ae2308096f935c6767daeddeb2c6997992d4a02c14b0e58c60 + +# Official test vector 21, seed: "30b5de5b73681ec08aaa03f6f2d2169525d25f4042a5e3695a20a52ca54927b85f8bb948fc21df7defc3910b28674994" +entropy: ec750b3939385a3f8df868119dc76f77ca845567ef068de6ada5478a56bc78b6 +public_key = daf0b0019241e200929c660cf7770e111043c8dc4af1014f7ceba48a445815408b2823666c6b40684616d823c86787a412c26e521ac8c16868d7eb5646909027820444b8bff59ab46086631d5a0761a75a79d76468b74fd8c20cb9784929f2a78ad1882a094619325cdfd05de5a30d622551c840ac79b0b5b7a513f702cf58333f8b0382ce055a4c138c80764b8f882cf14324015212034581b2876efbc3ae9687cdd7f2acb964cc18ba90005730d55673bd519be3173d3e231166c7ac0193a4fd26085bcc6607d4a6f73367efb5ac1a1a063fac0207766da41901b8a61ec7e45bcdb73584b5891ef112251a84e9c07ae7c16f52362cef10aa3cd69927db4175ba47e225a220dc2653a58dc9854210087ecc2486ab13408f92bf902635d2ac331ec1c95402bb55b73b5cf063d3885fd1874d5b03100a993eaca11e978393ff33a31b6a98f72479ad9b88d3d1395c2726ed285b793c489e09a8a7bc744b361ec87427c399290d092a1d58a5007ab2209044895941088a81b1b44175ba3e7b038ed17b1b0cd5bbdd1bbea3f58812a51ae58216b1c18907f131a80897353a328435b927d377a45a6be2310cb22076cc428371d4b772ebcead61c765c875312cc91e73b20be811706caa4b52b089ea1e43d7b61cf4b705c1b7b3739fb92c53268a685c03723b4bc316f679f4d8b87375a4188382e711b1911502e502a3f523bd5531b30298815717ce2211283cd675ef106ac5d4c37a6809d7e3bf3e3c40c6c5092c34198659849713c090db27c78689c6d57ddc90c04bf1af5cd56b11c013ee7126958aba8ba7284ed58828f1384786379eb0bb2b8c50a504a3b0fb83eb5964ed6c20b908731ca5c13d980d9a1c0af7c7527da50262c65f7c2132355aacebc1ae5fa7059e7310d6d95da97871c50a17c0d1c68dcb6bd7a9a697b9bd9bf15a643748c83bc8b244058f0c93e7d1a99111ac6f046a5cd1713d977650935ca5925d6e10c84c7ac692527e27c8465ea46fce97c64dc66eb1110188c7a3afbc94c1423a845b3530e35540805c881b999a6b28ef185273e584b9acaf26746829fc6b1c88ac03578f98e71b67f5101de2233c841d2f303c52a500b3d1bbca883fe49b5a233b270bdca755658448666dff384efc9cb26a664106c49aa46c4237d9ae0ef37df159a0c9e880d7247566113c12bc4451f4c6b4946cf76c7b57f737032741a3047934b09e697acb2210b05b17047ea8a460e4cd9e7068b4202a8912812a04286208202de04d0c91b9d62992de76497dd0986917592e9902f33c4999916576eca4bc8495fc7233ea94671a3588adba1355804f1c475ebd788d683967aaf9b07a3cc9ec4c2c91a61e0456c18dda1a238132d2eabff8002c0ea6ad88d3ae3f4769e298aaf954550fa3cf86944184da2cc7303f1be393b6580cdc1a0e55bc3be7300166d570fc4b8644156cfd6c8975c29059c7a550d4b63d242b3e11b887a31bf764a911ac62801a6845d6589b0acc55e4c80cb37a3784ab8c048abe21204b152069fba2d6b75cad8ab3f133678889a99d346e3b49c0c41147deaac27bfb7c8aa3810e3b74bc0b205f02753a48457bd4b7b624a3fba1443217a88c65c5f63a0793951666453692c56b790391a7c9297e5224771c7a441d5363741dce698c33558c584f +result: pass +ciphertext: ad805761011ebcebc43ee0c2d4dd21a0b6ec492ea384e8112c989442a37034525a90bcb6873464137955f8b8e41189fd97c281236242b48028f6a76c0732efdb86e30a449b895b75f9ca822cbcba38abd856a21cd65685abb38d5260183e52e69f696fe09439dd3e34148c9df57482b55d5ad6993c1a83876bcd4baa2dd542f3683c2c8d62db6268947aac07d6642cb09984ea122072c8fe2869e5045d30bff4f0caf63b1d51150003c459916ca2c590905aadf0dc742a2e7f4da143bebd6ccd55db94642ca09a3e62246a3a72399193e5f925a643c75bc0c7cfbed989c448d5e000d4e433162785d2b95c7e7bde8f5b4975dc8b16f236e1f8118c130dea5fdebfceab87582eebb27fe46f313fbeb5c8df0ea6ee306e7718bef06615e624e1880ab21c3cfbb53fe3fe9809e50d8480e6f9752478109e2e736fd3fac84d9b8206c40eb17b9d4c5780bb8f5fb5839cf7d3790059b63beae82c8d1af8477544710d38db1e0fe2beaae07334684526d4f5386ca5b7b4416150c2e928c015d4c5f03b1c95eb12056152bb712aafa12b1af1d252f2eb1a65df5b71292780efc41de0b4d49ecfd2de375d2550aa1f6844b06ac59b8525d4a902177279fe435ab7e36dea4ef0bb969fc5e91a6a27aca3b6abc9992aa485e80ff8103ecde1fbaca9c55dc0c90e119c81d6a737ed1c46b46fd6e5c4c424913a6553baac92612dad26ec382485a6b03be0174c2ad6f73fa111e0a6a212834b5cb644aea780b18d7ec85deca92c93776572ec1a188d6c912337b2c3d136baeb6660d12007ebc17755df4e07758a89151248b4d700336c5cafe3515484dfc9a7eae2f283f87b474d18a9d25a97a4ee564f9459a0d93452b0bcd3de0ed8b6bfac875638d80bfc1c734d8c9a203844dd30f0a352f889259684d1ef983ce65738683135afb28a74346c4b225893c4148fbb1593efd3a3c297e2fc912ea5a91cca050bf2329d3c181afc83809a5d73a8be85346771ad94080aa694a2d6fdd9d3a04d6ebb0eae3840e96c78fec095d58dde728e1c04d2f067e2832af5b1fa21bfe97e6e58d980bbddbbf7aee88f2560da4bcd5804008f7be7275eb5eebeb5bf1374bd4d72ab894b0ce892d71397ffb0f6b053af026377a192089e8f64790c178cae6e15e213957f7ba3515c3a001b1e72288828433624bdcd49cc2be5cbfa9388fb1a39312a391abe6d870f377c1c166c5f1c0f92cfac3c2a7c2bad2d1897c592a25cebb15425e9e23cdce8e0276c2aad0ad092916225c39f7d94f9432cf1622a5c3a8cc4a457d3e17358cf171a7bdca13512ed376911312efd62167896a0027e3d727c2d6284dede2dc0c3ca3e7609495f12c2204ece6e512f17af6d9391997c5b0f0c15bf9975b38c770d466919a232f66b5a376870ec57abfb6e23213ecc203f6c426a04125c61b4316f5ef9231e4789d8b20840bbd2d4141a9a7be879320616eeac398ca8b76aa95af7cc0743a3a2f2c1a116c536e7547bc93169e11c66fc5d4ed7a704582ed38ae2660d37e0dc +shared_secret: 03952e1a4915d112b87569d1f79a39f5d69a8dc11c96d70c529d2162a6024dd7 + +# Official test vector 22, seed: "e335df8fc0d890588c3e305ac92c7160ff199e07c85760a828933750e3fed8c83b0dbe802234481ecf890a32d7a2884f" +entropy: 74f1d52af09b12c36eb062ea7528550cb4c18a3ce8e4f4ea9fac43ae383bc925 +public_key = 670855bcfa888f30a50035208f5a75de6a8e3799cc4afaa7aee007788547e7b79c7507bed6a8522be18743c101463c9d0c28328a68b0d3ec380d04a20a31ab8ce6465e5aab4e2332f30870c5024718b1412c13b7094228e6f3a1a32440edba8f5ca66d968961a3f28705b9778713cd96974e42a50ee9eb61eba399cbcbccfc8786f7963c15d61ef8d194ccf37db2e16a31cb57ba79c9aa4a5da2593eb56c29498ab66f370d7b76971f797f9cd38ac3262226a64f91e03a1119b8eea00c103358572a1f4ab68f8eb4a5f889540913b23ff11768200694597d19218a2c30c3c25829467ac2d1b67f85d37522b22e7e44b950d152a8e087a3a35e3eb1c41fb15c7fc264c39272f01a0a2a91324a1ccbec627fa1ac81edb30ce0f84a727b36a4f9015a25ac67e3c76629c2347c2478d61b42bc413f6920f7b6774542bf25b92a7715745120ac1c4226e3b623860b4a42566829317e09d5868719a1e9babffba9517ac95a7c020882939cca54005f94791f37093eab5f2d15c1e7a09b9ec7b3738a197977c3ca0baf9f093271d00387841f2ab98c9cb16f19272d5e4b8d15e69da97517cf833475336d8850b5c3c87e4ef2c526b95e75060dc52c0292eb69e3f04294c854bfaa0f0fd5432dac0fbd03414b5a4a3b7c7cf36906fee8be6479c193b7336f4c870aca768d3ac2d84234b330a1f160b105214d469c8c1529bf31b3aac01a3ee1e231f389a27d4340b35a463ad002a7f8327dd5abed8b4256e87129b1be8ac475c32b97d11397db247a019533acb1a61c15b9aa4bc91d45af064a608b1926c93acb18b7c75d9798569a89a78463b51b5bbf038dae3c5cd133690ae80c1ad4541267bc10c83343a12439d6844b931a1cc79a0b5090214ca721f61e633600e8f76db52274c6c736e4c8b63089014a4012015522a9385f863507b1f1cc7c814cb47b00395724d601ad7bb27e4b0c43deab0664cc858d4a74576642eab3c76c211a58274e14f615ffe70084d7b7c0189d4d97a927a8b008b85888c57a0f6a307234344a5960836cbf6f4473ad988429a4ae3ba697bf07429d17c059a65d9e35a845735ba0a58e989307376c1e61f33023221a6611ca0465be5200363d49c53cd44b003307e5cc0c4f7b15e1545c72a7c3410ba1bebc8f7314b3b9d295c676bfe6aba9848554fdec9192f808329c60a793754bd6256cd030da12bce0d0765e51548aab0985ac86d1537ba49635641b3a26c05def260e94593b2e0558567c5da09b2cb122655bc4cd3e985eeda6c3f4322765e6a808ca387cc369dc11c9dfab64d4a30584e5329c905dc480801dd57d9ac8ab4087967177cb3163cf3e934a951a3e248a54cb922b6ca6ce9b4cb8bd788023e6425e75aedcc135cd3c59920c5ed0356fc0fb5a1ec0035b7c8271726dc8d63dbab3c78326a26c5b0f9f952cde7373aeca36cf6a438fb39c38a56124171593ea3bb076320bc8b5e74204777b7120ba97c3e803560605cf80c39324a0e3045d0f687e8f219a2ce70aac209b86d869febc5b51398341827204ac584c6b3381471937e68efbe5866a8569838251171647b4127514db9b84482d5b9a89119761c7f6508a099961376d6ae3706f6ca1c7c031f430190d6231425b14c6544cabe8701f8e475892fe31b587aa42d334fd189bdf +result: pass +ciphertext: ff7b85d93c35347d0e98aa40f91253ba6c73520292eb3dfeccc37dac0112164fcc457e45f12e39aa2f7b94cb5e4038d229211c25cccaeebd8e7e08918d38b7cc302bb2015fd62a3b1fe6c56fab9294b926e425b6f8b049e8f3fccb7a6e4115df6c4ff9e8a9cef2ec7c7a03153f922ad5d85c6700092f131d7d88efcc76719ca35837678ba1781fe5ed8a106e1b37a5d5fb139d8fded8f980a64d54194ffd6d283d949973037261f7eeeef74ffa7795c7a47c8508dacd6dd346cbbd6bc2c6f978539132cb2a4c6f4e541cad9861f9069a810b3a465eb8f85b615aadc15305f7693b7188c9e486ab742bc024d7f8655ea08ec3d731c131da78251347eed4549cc36d510e9e6c761e4d30407e25664c9c6d1ac565f93216b99233da67132258fff4aaf0c9c2665a9afdc7c904404ce24c5a17a619a8c7120b43ae3f53a0da30caaec6d935e93d6f949292db368bf430a5891834558c978d23f2fccbe45d63c69dca748dfdbd05c72a9e116c2a5519c22d1ce1edd151e45c249d3660840381a3a27e9bdfd56479c31fc4fdeee7c2475d8aed29c8bdae54add3c2d91033f6d7a0ea2de783813b332bf3f2088df7111535768b8de8461eec59401484f404e59ea769b107b7ea6d9fbca55400ea73275a68ff616006c3000b7111cf85c96203e1286f6dba554f06b104295ecd4d78b4af5bed95a5ed586518e4e213c7cb61784a054f6098bc6594de6b34a099dc2999e726377eeee7f0b2fd02a718d0a605ef67d5cfcfb93b14f7a340140c02e1b843498378ca0beaefea89668dc03316c14da4cf3ce86da691d098e5d318b9095a2eee24c782e9f3576521c027ed063991544e8c65e6fa0a6edf25666a81223b9976651ca614939bf75c1586d586a6bf8429e7f174867acf873cbb6b6393d21b621005cbfaeff15f22b383de2ce9e2af54927b53ba29e406869f0b6bc172825e839459cd7420d05441f6b36541cbe9c46639b2d6f00867af7ae3cde974c00caa724fe3b48c928649e66e3792fbd5330cb6691f442617e63e0aa535952984373fd1f1016bd37de960065604b47ee621a8301fa5c087d2f4f5951b6eeda95e4065413da627b4aae73446c59044eddecd906c101efab00792026e706ecfb33615486623643e8ef5bd29e210bc2e1574adaf02766c62ad6f526b5a33836f2034ad787e9264abdfd068b5be29744d4fb3e4151494cdf007317bb161658e7e37b8994904de17acc7548fc02f08aadfa0522d441e1dd79f97a40c231baada2376197171a59812b4282ac111ffa4dd04f1c117815a965ef74de935ffd96fafa491f496b7648dcf365c18e8041c16b5068bc824474e0843201c84e538f6f9397a816124e3d58ac92081b4e13f55c95d8e0f1ca0de2218537ff4e677afd867a93ff339f10ebe8fc0456d9e7e8c5e2dbf6775606d8d6c946146340cdefe90c98145fddfc1ab102e8867e476645c693e8907c07508c433870eba5e466588289dc942bfd1091980c9c1e83d07f31dc493051923d9ffe9296570810106 +shared_secret: 6d2e1f456c87d5a3c79456a6d35fda52f3e9cb858f85a5f7931f532fffe26dee + +# Official test vector 23, seed: "fbea1bc2c379f4f8fdcb0de260d31cdb064c9ea9b1d6dfbe91b3692add1d34dec9c9ffae7bf5e72ed2743ba3f9f2e43d" +entropy: 4b3a70d85f640d1a2a852fb6fe96704af56a7415a8ee4282e9207bc3a2dc116a +public_key = 7dc26db4f73dd1859b06a852e89a4845a0943e5513e8a056ddcc2623034a4ef251e607268997b7e90471d5d0cfba5639da844f0c9a7227c8a22a83b9e805942b67019ebc45502c22d369abbe52a9aa6cbef78ab914337375d9c075854bc9a3484a0995a239121d918aa64b2ad76c6873790211162509ca2347366d8163803c3433d32068d0f8b64cf38c2370a3546083ed45716dbca7ceea50207736fa51c062a6a15ab8c124ab6b00334e03808c858ab4b20a368df787cde92169aa4100a2adbb4699510753b80a63b492c51f43a81be012fa13405ccbb0dcf1166ef55f450781244420a0ac9301d485ab561b9ab67f5805afff924c1f43a5b1628f60baca631931bfc6c9bb04d0fb3727d7ab6bcd6cadffe84ca57851ee201f8153ae6d64c0d2aaa432baaa0539a17e731cf4360ee37c0e38e0cd77ca85e817a827173bd9c0ad253a44fb244f47f956146b4281109297b05a9320953c022024373d60701a68450cca32883848c4cff3c64f548cf7912ff61a11f06030c5eb29fbf8bdd2b16541fa85b8683493e8239e22c01383985aca367d6cba52c7808ff12b79976b794c70471ba5cc7908e4168d5c916605337f26199c34519236a855ef063423d7777631bddf164b2375098a25c9fbe9a7f9344ac12aa0b65a1380946560123f82e033fe33638788c82e7abf79b2c4df9c6da2f4301d70465a3c05e3a485a26a3b8d98674d91594f24761f1654580719260c4b409b2fcc418a24082a11140d043a6dea028dea1a51e9224fddaab5f3aa64564b3c336586dd8587442800ead481c9d27ef08908b938945b7204557c38aee2753709b68088684637bd39f1b78c6929c84873822caa30b2584a02c93b085380524405caa5d9147e6c837bf0ccb1aea19db39471d1a573fd893028479391680282922b11ab4d78b407f7d68eb89b615c32593f2207a4b017fd1cb922778ca806b305600546700d9ecc70ccf292ca7ca0ce6b6fc2a79731f6a9e8b83c9492381ad561f657192bb3867d3cc663bc5ffb48c997403b4814c915616d03ca71d0e8a93ef0acab8a55a61a6a58d22845e27d6c453b79391dbe02797d390e262a6be41cb564152768a5b1f2b7306872bc9dd63327e22e518082ad337f0eb8494ea23e7c730f48e94d21ca9ca3f660d4f960a6285f1e586d04120a083b814ec4229717b23b73c0c14aa6bd45294601bcaa89429814ad6e8a6190289758354043eb6d81842a6f332524da9e63dc7570865695c043c9eb9c5925bf4c4b15bee14aa58a09c4d37c822ba891f2626a414d01a10f9fbcbde5609bf4d982e23392a4cc16c461260bc518717584bfb96e6960b6d4b673f61663be1b2babe74d46494ca9576f3200ae3ca8a58de308d8e99b65384ccc30aa1669898722b1a76c87dcc276474a74c2985e746194844c0e98f811dec520bb54a1b4572b0c39ad04820f8ea878baa9caf03018d4a196c5363f55373ef5a98890c719b7a019d0eb023e319241081694e74bafda502529020a8b8f1590b73d1bc36ccbc8d4bb76c44361309977270231a51a7999e65b923b1200366ef381b8fcf8c4c5d3add0c465f7db79f7563dcc67940312ca49981581a798ae477915f078f11023c50efef1acf4f751801bfeaa5ef93fe27771a40a3d377f0f1b1655f6ed13320e +result: pass +ciphertext: 5d1369e253686734a5e45c65a04129cc5fcc91ceb595fec77e2850088fe1084c3f2ab3587897c3658661e3cffe185f4a0433034b56aeaa430b5a898a1f682817c406e4219566235f78e8b4b6927e63b3fc55bfde580c381f74e4d8b708fda0156e9ba2bd0eba3927601879af7762a6362ce233b87ddc0c61870a75812aaf92ef6cfbeff50ba7dcd21f0ff403c15e6cd1be9dba02f3f426d935c13cc703766115018155648d8db45457bb17026af70212994a87fff10632249c3e87716cbd1d13d8817fe5aeb748aae801970d8b21a575bd1dff893432740d6edd652fedaa89cc026027f72d71946e67eded2b0e84dfc0e6e103d1c4dd1120be5b09980fa35ab88e5d5714739387d18aa80d1743579e220ca410f404513b8bae90d64751306e70b78de2838406dabbddad7bdb5668a180ba02c1d44c20d12402a49492b4a4eb26c9d091316c504ec7d726b904d333e6ae33b0adc8673f577d23962d1e3453560c7a07bdd400d60473b978f3a6860af623130a1a4673d3ac6d7658df376a8ce2a91dcca9026ab9d1789d35e89a05b3c298d308fe7f20bea5db11d68794f2721dedb3813d3e3c58b487ec1a44f65d80b11e0d73500ca06dad337fbe26bddfa3b72f674a608e8bf692bf122b624bb8c98cd9ac5890c774f558c2141155f658806111b4e645b07bd23260c2b8d4c88eb97b418f734fb0909a95819e74dced41551a5fc4f9743d19b66a4afda8e23d0f08caf69b4223286ee80da4ba6cc0a8071434823dabcd984b086c4b0b5d9c25bfbb7a80a3c65b4c246cc6304d7967f5c42068655f704ca329a0b671b58c93a8775d4884f0e8f8debc053a7e03338eb133870f7103a434f2f27132a0cb9bf2bc102d42394c08a621ae13cfad170969a9a8937f6bc519d5d467e63fbd98473c6db0582734c23c19cd6ac4d56e106a945ab75b23166325f33d198da7a4f7dd9ba4917da1365f248e237dbee6c19a5022ab62d86ebe2fb8ad0a35f838be5ae0184b13bbb36e8564979f6b0a6548004956cc49bc94a104a57a26b989df283e0e6ecf26f50e896183391760d757dc78d7eeec296378694343ca84b7fcf751e7dac4a889ed170928a60360a5fe2d979a766b146c2689f2299d9505fdc2f91369e4b58b432c346bf1a96d085e7a364f898bbbb258a0adddc46a4d126cdc89b6bf7674cd7e980e4cd7acb2220aa9b3adf1c9b89953825d9e1e503476a0865a66b44ca2efc23eaaacad5aa4c66b97bafd6cff9a73b1df12e92f02c6fe8402197da45798309800fb3911a8890e66cf4f094e0c0d7703d6600cb1ffb2c1dd43a9058175c86dbd0f3d6a0c29979c3b6278e2db8956ecb9aba710a5f1c90bfea10fc27a9603f8b4d289fc465f7276c8745d11855966f944c85a0ca16a004543ca7e7258f8bb975a3221d6805eadd906572f02b999e9d190c189c51523bb7c7cdcd813aaf116e813e1ea0ca8ae6c8a80d569e02ba2d666f54ae85f5cb1f22983783e9c1fbfbea8619a50578c43c2601efd0b46cb640947cf1e4406 +shared_secret: 5c7c5cafe1fd7f3d12431ae93815c03419ff95b132caf568671ec23bdc74381c + +# Official test vector 24, seed: "7e87fb886bc3c7c9fc12569f465d2ecd12532e76cc27c65644c8d3dd603b0cb2d036c5974e675058f271d5c82ad7a813" +entropy: 26e38ac804fb5b4d59ddf747715e7e6041d875f99c7b638024b4af82d622da60 +public_key = 790847ed9a831c0cc2acbaa793c41913a02db8ac1c6bf056573bb75e2990a6fcb732c3461ccb174dab8ea4c55781317e400ab4ef68138ff84c27fc0bc4c68e30eb664cc8bb32b617916c155d28a195fc39a1a0419af64a59c99664f744a375113228ba3730752ce5a06701112d7328649a3755b45ad6bc4bc0859feb014e185b2e18603ea0437b31432457b36d13a5ae96b03905bb2fd0d5377eb04f34a68c57448e7909cc660a31d9f9540af17324e4b31bf04f465665b5538f7351687f238d6c423c9237b5ca35618f092cf7da879d965b67b1cdb2467c9ef3862f260c04727594aa6286f4035f0b0eeeb4b141306cf7d9c4a6bb942b7a1e30b56ae958b16c3c1237603ae6f879dc9ca96a2439e26c0834369e8b041c6327254608ad3727cdf23b842a003b91d1aee60193ae1497d5b75e2a370147f052a08b1f86179bad52605df44f6c99c75df478017318c6ba017a1b4a8302888f495acf796e0745adb0292ea6b5526fe43f96e20d98fb756b2553a9493401d4a25b9bbac13b62967a228bb6446b2067063619af66383e6bc2b3d8cbb9e6969196bb45d665bce49284c5b50f934774d500c90134535930ad2169488c4ba8ac0854f36e085318a293bd65ea8e033c754ea44191d9ac8033c031e066b2021c13fa11a15222cab4829a5c47df7418761620aad92135169e0f008760ba30a289cd41f1325a4c90334978c5176cdc5496962443b118a641d6130baca422d89fac5c968adb461ab43729b6c9b1349e71116c0226b55fc00323d6a74c03282f24997949207d72ce58fa4d87a7413c3bbaeac91fb2131c418c11ba501701549efb25cdf560239223c90e1a2f99897fad594930848a1ba2494fa87bc03c57c7bc33463b77ef80b978724153a956779028b7a565c40144047747e124c7db801d309333d3150493c3b3ab68c34c939243454d90c3c4079174a8171c77a0b0c9e54277b5bbc5033eb1eba3cac86039492b4e75a23c8c51c88177edd639a55b56fc557b580b03935765cf586c95178c330319c70a8c15c95fc18a23da11798cf6c54f68bfb766a61a9c9c461b766b4a00608575c4309a621b28d27122cbbcc76c30a30286483ba85a68524c0e21591b7347a0ac0931e121eb3bb8d0fb7d9ec577a5821487619e196400c2169a42a71c7665505bf333ac70267bb50380b947ffd54745e41de5a30a27b78a62f43786ac88b2012de563cde100358065485a73505982a265a505ed85cadc02228ff90a03d088da7410c6179558d52ca36ba1d87353985189a709a1c0a7a10cd8513c4aa26d27cf802027aa8c5bb99c12a51b7f16e10838500132cc24d79c805cf11a5bac88c4bb0377ebcc4fe7c6ffb927ebe7234016bcc1765ae9e72e62d51f9cd91017f508ae207d181ab0c4dcc8d1c4742494876d118f40c84e2706914c65a161d184a5765aec67c9dcfa4bf3418e114c6f3cc34e94a149fc84b041853af9b213759cc5a181abd5641285613875367842f1a2549c09eb9b1dbd851365d58e6335c91ee7ade6c23135c1200cfc1de3f5cf6fd13967150f01053b943c3389bc4670da9857ccc32528920f781cbf16a9dde2299db9912e87321c02aac45c4820ba2e808666ee521dc4bed006527df29a124412a4a19aa26c09b490188ccba53900a2545022 +result: pass +ciphertext: a38d892bddd188709af0e4b7ddf0672f8729ffcef2acf0be8fe4e246f83bf39ad529634a3720388c5e2295f5a071e27ed7d75d8932dd05e0182b92f98d16c4749e65d2aa96c6b45382d5c83cf6e37f30d395b289e11cfe8e108c50bb61c96749b2474492dbca1035f42dbf35f73e6d458151e37d1df2bd2d1e0965ff87f607897139450f4d17d4e13eb099c5c79cb2aaed233cc4c9eff06f38d2e910f648b07d5ceb12c30c7daaf85e3ec5906827e923658cae07f9b4e983b7d982c98fea5a3f46d5acb6bfec399e61fa7e2e64353c7ded3c7dd1d3b8bcebfe9a59c29f22d2e5dd29afcce64292480c6b6a7eb3a5f08abd7afa8641856ba7cb706355fdbfeb7db58f476a79138ffc03d945c5107a126233107fe54778e8aad57a905e97fcba09c242ee016dfab5fe3648e2dbbcf07b488e1f2d60da78307e3f9e318b7a8fc99cfbf67b3137afcae6bf9c1a7d005871bf59bca9ffed32467e04767b99b7e0e5f75c21f23c80ab76e0acde939500349e954578f0d7b0bb7972eb2e910e90fda97876d70886fdbbe3e6e4c04551eba13de33f9eb88fb9bb5c669743aa78450f658df9209e29a5d81e989aad45f006deca4c802366a18988a8f99481abccfd19da9879b702a7f6c4fe7b5aabb07e0958c4c5094ffbc0692abc928907283202e0fe512bd5fd78b49846b25f9a32a3d92d1125f9ba5620618ac27a25f6002990f6959e05658a2ab6fe88b6f055b47951fa9cdb27a8b6ff9dd69c30231c1751805ac7d98b00733ecc0309db2e856765ab9993d9d78bc10b0023b5ec237bc97bb944cd7de18e2fd0b1837f50109762c98e66859b4cf3d10a79e3a7b24f5b67e0385a68657f31d34b39f0c8c01135ac10ed79adbddb66f762ad4f20ae4d61b8b0e83d6f35f4fcf270b45364a459c9e276527365ec69bbf39c85ea8e8c24e7a6b5e4cba67fa8f476b8d57642cf1d6ffb1aee8bf475d66dd63c2d9141bc51d569037c0ae82638bbf9f5f66e04fbf21b8eb87c4ea2c701d05905441544d2934308ae1d22483e91e7fb9aa69ed86ad414764419781f249e215f4c3a273bb4b7ce2886f2ad8169f15c75705bed9ab8196700f5f10268c5d32790a8f0a26d5214151ffb62f1b3728279da8cedbfc9408a2b4811e408c5bb7b3ce1c01b8c22acc32796b5bf3963e8912dd997be5cb19c41a2861272efdc64bf799eb1e601c108e4394e8cf09137d58c34a2592a3fdcf2d969eed043518d17d8b160879c9afb8224dd0bd3d2840e833a908797b7038d250d18c3bdaad72496a5a445d1b36a165717f6af7f8b8b1919171d2e1c8365b94b23ea84a0344819c3828d8c8dba63046f15dd18f679a55f526e7ff78e066f4d06133957b73cb1e1660755229d3312a14a8f194dd0e10aabd845cf8f63c63e26360f30f1eabf02b05b20b3cb615083e6b1942e304893c308948e73084f5c88328f550ecb5f01bee599acc8db52f317f3d7790343b8a084e60926b785bf17863708b0d92a1bfb63a94cb97c8f9072965bbb84134ac114ffdfc6 +shared_secret: 1427c322f72898a0fffd13f674719c9288d524bdd19e6a362533c1108e3a6d2c + +# Official test vector 25, seed: "ad1424e804f306c7ff513da4c1e8d445afca7bc942fac5c0b335733aaf70693712ecbde26ea726ee0f9fd9d52a83b1a4" +entropy: a319d2b8f114f1acd866478bcdeba6fd164dc4e37b0adfa8d8034afb3e197376 +public_key = 39dabcbaa131e892a48fbb80f78961f9c440322b49edb03f0e554328eac7c0b3ceef957a82370a8e8169cb24a81595cc89f95d70179834da375d55a1d16a7a8fac8e7da64508c97f4f7a53066ac34d407b42a6be091696351b3fb1f12c05e5429cb0a14208336e110ae4b89fc9b91edd0037392948e7d3beb78b880d3c6d933a73bf909593a0654ea18a5cec051cd17c25abb7020487579a98f62b49c2969e3df7407f9bbf0b01237a0994cc7312b0992cba7566cfc2818db511d37b1f06781b3dab99db5268f527123a0366bf481faaeca57e16b37e27758c8b83125049f3f38681ba5438a795021652b5f81c02876c0f404b44f06976e368aa2cb923081e3dd07781562ae4750bc5f3809226ae6f100fb8f67faa433b66f8153d6a1b846c589b471ea6479bdb05c741dabf217a6177f2ae8224bd05b46de5f1a42ae20a1e641238f541fd282dff3821414890600a970811795c993c8ba5418a8732b6c8b8abf738fc5ca7d32aa3f87884021968a93cc271a490de61c5f8143be65485c9f34f0d433e492bbc5e215cfa037428a51d5921404d89aa0ba6181f5294d706786a30508c5990ad24c7bb6a70d6017207d3c03100a222396c44752579859e07315cf9c397549708901748c6958cbfd41e9d2880e9773ff03808480bb38c36bdefaa5f81f85700fac88ca85829e03d9bb845227a0a799b156d0952d0c54bd5b010c565a381b55885d26cd9e9b82d21a31354c17d2bcd43d93946bb58ed2a57c13509e9537fe879714c64cdbc842e93326aac0944cb3898335004d0fc9c81546086f29136227efbc798032aaf0cba0f3c6aac788886e03c87245964c99c18e62c008d646621d127856c7559370f5fa26301321bdcf502d1d12305002b2ae42e61209892d7b3afaa6cbfa9a38ac097cb26c4745a4eae395a1b10bf80829d1b216b4da59fcb4a2a57d4070ac2ab59a82b6af3b0682b53f9928f7759ce20e1a09042948ba966cee8bd176b2ec6880c063b3ed6d1160fb26714b3ae7b44a4ce6c759555c6e478c0a71a90b62a8cf8f282a4f7c21c31c5becac2595a766a977c886009e9414123e5723e101e667647bb9a2489b3acd17a81ffb4512516893ceba8838949e998043713bb41073013d487cba107f31c84480a0ce4378732d9446970716365278f70719da66ddd8283d62190530566904221b383441124b6f3d47103d64983898f8d83a4fef6489b0c08a11b82d30cc4d9eb4fd0d99085c875dd4801e3902405f0b292b8487a72867e67200c9231ffdb43e2048caaa203c7883218f9a1af7a365a19b0d2fa595a087b2afa1f16686dbd24a98b931a5999483d467d2d264b21ba527ca419b6523fc046bf7fa96bf0a277af5094f3362dc863b8bc2192e5d78173d77139d6ad07e091e7ea507f2a7a9bf982aac812f736c787c27b04e25d1cb74d5d01c3fe6aa2e7248921225632a5033fc6342495167405028d410bc42c8bdb498d9a5260693ba326e2230c6040f332454f3b2020280ffe6bb0b7021f4ea6bb4c06980b62a9b6c89a935ac206b13e091c3c6ae609417ab8c66b7bce94986e92596ee64b08a53844b706f84731755ca02c7c49906cbbdce97c64019a52f278c2f286eacd5a261f5b502251ec136ec0a3c697fc30e8b59807dff5dced3d6bef9c96bf +result: pass +ciphertext: 33cb33056875df21862840d7123c9d3fefec700b24a5241c24492dc094f644b5b601b974ea625b315ea7efcc27a096acefb7be53e635497185de6170320d3ca22cf41c1634fb16460723ba0da2d9c2464ca557ffedf4150e0a71d7f0b7ac64568ca2eec8a66e16f02c92f313666e67e4a0de221b3617dc59fc32541c5839325c48e7cb0381e1366f8554c1569a58e0427e3e516a5bc575438c1b464900d2f05bfa20892d6838a726ec8ee5c6e2e847a781c606d6a28dc89db35d7346e41fe8742c15f22790848a95e1648684f77d21ecd2a7642be1cf37cc1999afaeda5bb025843b4dc9a2fdd1284f5ebe880c6cef05973ef6fb939e2d39c5083d9366fd862f6de4d761b67fa99b1bbefc1a71eab5ee2815452c411f09def608c236e2c13ab35122f24ae529a2bda8ae80f66d326f646b3e9cac155fe4c765f18b2aadc455902f0f9cca178a0215463008749e7c5a64d010959842e00e830bea02debeb3da2f3f7297e03f41e4d304818e5e7854ee3c578ae69bb1795b7d62657eab867f182db15cf79f789a31377afc0a8a0adc51d1a8168ed9c531798b66b8e50b2bc4c6209eb19b8fcfc9de357653bdede452dd7e80ae3a7bb4b9dd50f384aafa3a85c484b8d5044f296cca7428109f4d6370598a483eed28c58d6e401765f9679b980e4346799ce9834a60c145d74e58c166a487b4e94640041af88eec4ff9606ff0476b48ed3c188257836e2bc5770b313ab7782807c8f387aff9777d16d5ab2439b65e9fe9d01e8bf1d4df96c1d9537dd1ce1cb5f51d14d05332bbf0d83f20087088800d4de838945502ceb034f77fc2d7aabcaf3f362071199369d64e5ed25378d39aa5b39e53814a5aa7a3c302b2f4808d1477dd04f695104a17355dfac04ed0916097bb6b4365d7ef07b4b414729a52e75278434e2d69ed838405d4ccca22cc1fa61b57483d5634a1c1e250e500e6e5c2c4a3794c0e201a68d1fac6a27ac079a79e744727fbb3d5807100480bfbacf5dfcf594998bf8e2c99766d4309bc89aba138dbc9051e7f3396e9767651c27948e04097cf2a175326434be72e1afa89c0d42a80600cbfa275a8a53c860135d54a4076e9f7276007a12261ac24203a22ea0e2f414951560aeef26a00e193cf42ccbf49c4f27e2a4e497f814fc165637c4f1ad890f56de8b0b6973f8479aefa080afb0d91ba777c58fd1ac73215cc225df9a092301f23e5190efe8d3d634f356bf170959ad1dbed270df0cf2671bdfbb2d12c15006651910b3adac8bbbd57512ae149f0746cfd5f4d9e0e6b409db6ec314a21025aecdcac16fb2a36789127162f1eaed305eb20a506c61fdb3e5a8ba26b7e03481d461d17acb86741f81a19d6af0a18866d04fa346a3c6bb6ff72d828df88a1290c018d9585f3ce96fed7787d91d153a695852bdd272b29688f4077dc3d691397f5904d9c6320bd1a748ecdd00fe7f1114adb2e0dc33c34035a7aedc540ac3b44f5c4bd9bde63cf5343ad0bdc1b16adf13bbeace84d642253ef332a92ed483dd9 +shared_secret: d399b5ff0756707f8d1a1c2a683465c9ad4899788420643d59edf78f79b28dc1 + +# Official test vector 26, seed: "7c33ca0e987226c8524dd56c811fa4d1ccf9995b1e4e4dd5b1481974e88cfabfbf6787775c2611cefb27ed4403ea9b46" +entropy: ff646071b2509e6b75790917e08e4f0b0d9f0116ec6291c0b59eaa4b583ad830 +public_key = 185bb36d9c3ba85a46a5f605706979ebd66da03c15f1b4c25b886faca00b16e04f87b773d0b8724bb4947c615344f9466f78cae8d049876c9f7143154abc47110b0deac571bbe83577f577046830031a08b465b86e1c341c82660818cd2f8173c5c558975868f0281470f39e737b6cf964008e040382b290795254380b4850db27dff98838d9921eaa8146022937e36af6b030b8919bfea844d9d602ccb3547d5c07f612c12c3c179ffc30fe52c9273b5c0dd27934b5a41737817be0739425736bb0cdd267beacd0bd77085cd2794947051099c3848fe0aa2bcaa18f6a18afb626fdf1b977f376ea74a9cbd638932600efd84fc053650474c801b1a8ed941cc5444922915173ec1971698172f8a61730358c751d2d776d93c866c47802e2ac19c7c092aceb53996c20375b47413a66c06541b4343c548b4dc5341ea92b2266d9c0f1665719f62a72650414940bf3a20a260a5953d578d5aa48a2b670aff7512bf6937e49052c3ab8ba07016d06a9d643081dd52009b358ac13c3136cc65b0127e675bb55b8598940c054c8b797d37312a1ae48120934a559ba31042e160ddd13c744d7ac5dd614d198a33253b829016fae7ca51d397330ba1aac557a8fb56477224324924276aa52b7000f77db547a604f6d7189ef83071293465012b6133a6e1209af3009a867a46bf2868f8ab8a932784b76084998e37eaa4496c661a42e9802f5e1ca947c75bc4a572562733409757855031c9627152c02cd25a9b9725adae909175b27c53c6233e4480cd3a06954afed889ae97a091df86842483edfcb5df9a365929b6da98917ca7b025490b416a7abfda408f07429244a9202a23d23ea8ae96bc8ddd747d1eb9b79a3cf3610bc4eb56f9de38c3fb77db2740504e85107f46896202684db8103b1c488e9b731f0a2bcc40b563226d05946c9fcc1a4e287628bc4985189e05a5174709f00c43eda4897429773140b30bcc090ada25c91b8858f07068bc6c154030f048c1a7002ab58e157ee5b0e682877372426e193cbbdd3c63dec0a725c90d29411986a249cb30ecd981a92519ece4074f18ab92967220ac1c963503a295c570d7084c2917ec9b6a4663a931d6a505d11757ab2935fa708e9b6ad5fc1187f3717c6a4a818d57cf5395626c8a3917012fba13315902391116ff5015051dc8d07ec0716356d20a184458b4089a37fa9a713aa35c8ad1635a7fb49e6bb44cdf4628a3b84b9869dd760262cc487f44a361b9c1106553338cc5dd71c45c37a3bde98036f45231dea2a83001d82203b27aa054cd1bfcd215f477a7e43d31d946971b0d3223868922699b0d810b6fbcc834104bc0ba2cc7a50bc198616468c212c9b9dab2550282a9b88f8a1b6d006ba801544b62564dc05cad68d7f6b143222a5bb28bc9cb57788d417fdb73bd0778fe0529a35190b0912623df81a7387cef7d201aa007a199735bc3aaef9706c6dfa1b0256b872320459951111b90caf3202ceb8c10a480addf08dae881eecd0cec08a2adc61c20e8c15b60824653492e603bc3c203fc35ca536fb7c64084112c878741b83870620eda2997f38aff953217bec592eea7947e8be23fb627251c13fdc9bb0b705491151b8197cb07ec66dd1d49dab7f9d23aa8ffa435f2cc7a7a3a1cddab6e37ab7be45fbbc8a +result: pass +ciphertext: 61d4f41e6582007daff044918721194b5897db5c463d6c48c80ac7c37dd0b829bee3d0aa6b7af4a6acd827bf30df2b87f4420c984548f057c1eb6e7b17b19e4f61aac5ff5b8d3357a2a7df2356d8ccb697004f762df71a854322981b85a6a753a633305a140c89bbb6b698db44ef4bbe945f03718f9a9f55bdfede24104a10273321c5a2289ecb78a8d2d99dea4aa57ceb1d1179f0c71c8bc2d2b16f7f41eced3819351a463f302c5b35b45658154326c8787c555fc0336be1aa05081f4d6aa6649f7924b0e8e0575259929befed461636751fd0e27ddb9bd92a1b2f8cb718961cb1005bde873cb4489d02068a5129e83162b5fe70a4567458176e9fd2f0a5a27b5ef74a081912d6fb9a83a07cae9cf9442e2d34d076008b99275a7d49fea0b8f0261c0f2743493493113c490eddeb07e43eade98b15cf24b9f7a081fde0aa77978c41a62f9eb78b90d914f0110cc8650c01de496c81a7c88e038cdcdd8105b800a2b5f313ff803fe776f237f94415e74d6e61727862c46d70eeb517a71a5a6f754d199cdd70ca4369a4db39c9c6112f4f9bee3987c72e855fa937137468fda364937cb62412614536b837064937a5d626906ce0e83b7466cbb1a2242c893df8606eb533295b044ffa108810b85877fb3b5ab3294731372fc55427536d60676ac3d161f04a0e77f919313ce0271aa303b08fb492a1895c5785bdcadc8aeba725fff3b7cc14552b367d265360fdfa1e69a6a5d773b2b07cf5fb8d95f7356acfb648c22745258d80726d0d0ad8f12982521b4de93f081e483956d5fa97648851fb00d9e4f64c3ee4f4d7a8c53767fd9df32ca9ea70cc1180287e5ef6a77e1d44f97ff955d4feeef98d68e83d3eec6216b6c1f534b3b95b8745408385326ae23410e1e7f5f06eee0494800bfd7cc5d0640f6b39eedaafe0b4d95d63c474eaee9c5ff4cbb0c87b7e8ab20b52796a0fe1836b6e8be2afea81164c6cb633fd6c7743adbbb64522ce69ba9b4f9cbc510022424d94945e0c865bc66e3b7ad206dcfec359e42d5455a933174bf720f97ffdfce647b6cc8a33e144821dfa35aefd3320aec898f6c194e2401a937c9c746db08075b0e1d9945c771b5b72b62d9f226adfbd7feb4a9c5ca838ba6fd4fe88521559cb10af57c08f512d88245df43987c1d6c9bb2fb3d82273b7190a46be158a0a1cf6beebfd951be29ca7fc2e16117e85589c22cbd88a1ee965c18933698d2dd948c0ca8776cbd6926eabe94ebb105e3c67f466c866d81bb03ddc8e11f0bb10e7d0f30b95d94cac0d5649d3fc44a5b9f6727c1b5e70791e134ec0a3e67303f6adb6ef3f57fc968aed10b13c731eb50189885b3f8076cdb2cbec95d9f2070d7e3c3e5a727ccb56653d82b1a1f7c237dbfff2b4527f97f6d383c7c4d8f5a4826521108376dd22745384524eaf90c7d91409fc003ce9cae1afa72562a7836921d3193e8f2ca8c1d35959a52e7199957f7d1b8993c2cf39988337882ba2c05a0eed718651cd2ca564b8daa895a9060d460a47cca663 +shared_secret: 1a0ad65924728c415ee9c92d0dcd91396665a24c59cba878050390acf2eb44dd + +# Official test vector 27, seed: "54770ea1252ea2857d6635151194f5f520adea8a41e409ff498d40c271359858fe2b084d5b96bee087b8e8f4dd4e00c5" +entropy: 0584270ec26f3b9818e4af074d17b2d51037cc8dfdcbe3b140fa4fed5deebc54 +public_key = e80434a94334b45589b1866bcc69bad27ba323a563f47bc34073496a468dee6013330bc9a219452caa35c1a522c45c498fd4ac5564627d564d3881c731a9856ff7619622aba6f928beb9b9373b1104e2cd2e6246bdd88268c1b512867ae4ccca21140f0c046b5e5817fd64a2f93383c3a5add2f62784e2c8e80c150a1c8e1a8a47232787ad529333a07e0c512332799d9896a6071bb4e4fab647440f82cc85630c629c2c2068037948b575a1693f81d2a045a9c5a5c2306e83b911ea1e86db5763f13ca6b02ca8905b50faadf5440bec7b49913b371f0c5786fc585dea2813fa9ced349d9fa32cb5030b5efc274522ca4c6985b9dbbb245465a8849c4c78688392b0ab5bca98b04c7bf988ea84292c8505fc7acf90199eab7c31c13252680c71c9c333e91a0adbc1bd00d023c8d7a7c9068c3fa9b3cec75234663a2b73572ecc71e53a8eb5889860a336f77bbcc1c854d0c3c61c65216373bf2603a0ee72af8f747bfbd7401bcb9d599b6cdb02c210010d0425917b72891c33c97e9b39a677010d22a784003e1b917dfa3273246acbb45a79c7848143f0b583781626ba02a94922490c7b3695a787d9ae22e5470d32cb68790d75b81c55d084a43c4399aa587e07829510220469ab5e6381517bc9059353b68160ebcb0edf969e8c317442c4058423c3356b34035b9761744fefc76145300908da3c13f95eb3065f2cbb911437cd24f815197c0dd3f9c87e3b54432c50de1c7549228c5f9c32ee8c19fc4cbb04514025645e0fd1468dfa274e59a50d62c560eb051eac35bdd148ef75b0b05357619490cbf08b0b13767557c5fdb310da985dfdb9c35580217067a8c68491ba64307a618d272363ea346629ea6885acc17733a801166fd404cca58b591b68b2c73a9e890a13bb173584d2b6db351133e75d258995ce46a8f798a44ddb8526633949e5442435c7b3c083875760c00614665c4a2ab92c378863a3755ddf681905ec2044c331c4b976f6ea5335bac739c2be9cf141a9f3ab3f669c5fc49d74f79ba066a7d03b0c2036247c86305bd45194a00e33a1179ccb8d05b374deb491bf5c1d6adc4506803a8c65b18dd6621a5820ca93c339dac2bbc098c22b4e1fca3cabe58ceab66da6a35191a29ad82c74abf1c823200bb197015e074d14f224fdf30a51bccc015a152b8443892b7450734b34e77356231c6a8016aac430db0a8954c7a416b43d49120fdc4017cb61c3bfe70fbf24773412b6a91375f381658d57677fe571c3bbc800cc80ac597a8f2c5cd1f19567ab1f4c797a68e6133507aa90d1ae096148d313b48096ab96298c33c3828d645a28098c777cc10ce068c035a71f7a2a36306fbbc311d3d14214c042871388dc899ca2116baac1aa5cb261af35a0e255b228498295f6b4ae171dfe21b5f66671af532253dc724a893b933829a0c275c20407898911472a02eb484d4ad5b8d274c00bd9377f3c497e6845161868434c968bd847ee90c2ecf600867cc790b005061c8d5c49339dd3ae23920e65da2a19d649aad1b722552e07f51cca7b87efa315b6191b31279509d78b0e974860ba9f635283412038efe3ccb2a0c643c68756149a03b50f6891b9fdaa099ed50d7a012c0175b9518c15649396d94ca1266979893e82811af8c142323fc3d38b8b5e554f +result: pass +ciphertext: 45c095544a69ea32a56f9b6afa5ba17216c47a7edc519cd2a8b54b4359629d49832fcefb5adb0807ee8cb2be0a0066b782a14240462bdada4016a5ad2bf71299ef51a026ba3d0318b7f1a662b45296b20a5a25a21bfc67cb9c9286b659c1b9ddd576494e63eb9a70369b04a0ed30b6757272b7a99a591868569fa52b775facee306d7f621ba1fcaa3a5058aa7e6a65349d4aad045b70b4a26e6b5a3952fb89600e0f1edf1fbe7dfa31838a37150ee51e1c1af5b2325a4cfb2df17ecc52f42ab5b0db2032a2d01d9a77f7aaa6865d2fda4373581734b78d53fb2cf3946b9ebb0a677f8b8bcdec169ca03e928a08d05bb019c18d98ec084066b2a4fa3fd2e1b4711a44dc786724ef7c58f4bb6314b0b1486933004f51c55aca5a397d9eaf8d5dc557cf04d382e969bf96400997b046af19d5fbf9d6ec87b69c071cd6ecfb5d7966b29e3cfd7e3b310b6459af89e93f5fe3bf9ddd8f84437661581b6403c582f22ffddfe741c0fc0ba51f1340f4f32bdda61cae7ac83ea2213018fa308b3b38ecbbbf5ac3b44068d7bab95eca5afc736fab9ff8eb937ba5c8a9b5ac5abf9f368bd581ba02e3310e254ad718b16dfbd900ded9759d909d61d2e25a27abe04fb63caf38f0d2aa0518463cac1c35b22206b4aac9de635b30400efa4ea7d0fb3dcb4072b779b211cafffe97ee756e7ad57554028bb2f515eb6bc095e64fa552deeaaff90312fb6e9819783870b0c3f83da7a3f16e38fafb9221833993aa5d0aa968cc0a4888a43e5c1e1794012789819fed28a6aaaeb023467dd152204f8f7543de435c31460013c082d6f3158da33f5ea54cb1f838c1a9648589c3b09a51eb8df1b5a6c8d82f62d7a946f6d198cd846049613d00cbb57199a00b506114d230a86dc6899b3ddbc6473e6a20fc90754bdec551d0f8a42f0002f14358e0285aec30db88433b1f6a6f70798cb97cc9100a657f401d4661f82383ceb83625197617c021ff076eb9b08935fba9d8aec0aa12aa06db57cfb5574c50bebbedf9ba41f68ba09b0bb1c73be5e29a1e467af5d2aa29cb84bfa639386c1214d6801cd2ebf6111452227bfd1323e6ff880539ce0eacf74da99c75a9fc6270985caed1ad906c8b1451f399ef09e4336d596a89f1d071b372068d38a4741250c5c38cb2a893c793a8cbdfd9d78e943f728ffedd5e0a9efc228f7dca5d9faaa1052569ad2b3ce85a9d5be96be63790ffbe3e7cb05333d8bd56d5e44080a52dc00b516ffdf77594ef0e92e591b949f3d477cb6d0f887bd43273ad0e945348cacaffd5132a642c1c43fe28bbf6ac7cab18b45b8910d1a107d2058af017e3fd67c7214e039451d52ab961ce2712df6ebe5cc8f3c00414e5a817d148528d0e08b3761b774589b00862c0e1162b463b1fe43d294eb2439e80e35edb261856099f32fb548d494eaa4014de2c5e223aac793a3a55da97be77e998ffbd51ae2ecfd1dbd0fc92f9fe99e510c329a6c74fee225db455197f4be18efe98edeef43dc6632917cdaed3aa8ac4bd6f613d20 +shared_secret: 9104061d3dbfac187f3a9eed801545a52f1fb0c3979ca8315aa31f67775d1036 + +# Official test vector 28, seed: "cd6cfe94e9c0a1cc4ffdcd2d7876504be5f50f1d1ca5cf93482943465b268276056f2781f4de805c138976ca72621387" +entropy: 51e05c7b4ca3079781e8293f4eccebeeb2f8c8b4c59468eddb62a21bcb4ab8a3 +public_key = 70d99d171745edca3a65045bf6e0625aa4955fd125d332ad33f9a3ceb2313ad50c97614d038547f22a135a33c06c61545b9a26b46c41d1830b83d0257fcba82b36510199224855bd1a837a369a2c823391b1f84e54959a06938513681d97f34eeaa7bc42eb13574b29fb785c457786ac69ca22f644a1d53278d4c2e0f325a1209a0ca40fc32b92e906650b484e7d92cee99a078f5090d2fb60f84b47dd44224228443d36219a081f9956cd7983ab223bcc094a0c65414cc2aba8564977b147088ef41aba589653e535847450c762517dfa462037c2c1457ef3d1909d0b79d66ac6ed9803ca88a7295c4a3ae53cc77c235cd8922b36ba8b837f375755326a960beab71aa1b33a8b64d6076f0889424b1875ed6316ed420db7e02d731b2b3065c7e80115fc1406c125b651c2b4ced28ae9c67cc505bae5b747e5722f4729602bd1aaf25ba333c29ca011ce36f55494204b0f70895938c9c4658044740521097d696c8efc045709369f88c1cd46bb763b957db8f48abf1a07f431845c94beb7a3a68d42af6c2c3095f829de51b37c134f977461aa2818073682def71a65291904f0c214b727fcc7b522c2a33f7a2e07a65926fa5661172103b390fde2814b21273b318d029a112fd389d0324506d280be8c49bb923412f4c430ca82f58ca8b7122907b986fe912c323b1758901007067153db7b16168f791610df534aec8050a58296f58b7549f0665e13918c784da2d00da79559ee006566050482b2a13baa4884aa83351753cd7a48e6385292a990ca559c8d630a7dd4947e428198b06242179c369741fc067dec411765c58364d32ba655350530a4aad934a1d14b76f55a19ab7f2dc60720124a2b69ca703030b2320dcbd459cadb6662fa0aeae170f880797e2bb0a2f24e8dd1442549ba4510153640ba7f093acaf41f67f55e4269260ce2aa28261d4dd4acbc2a4a134751261991e7b36183387893c5900e8a611894c76c26217a390f86e5068a947457db75e7214b8b05a3c87251cc2101d7e6115c908d2721aab224b038c1b9c348a3c04c081496928da726c0d140d363a427b93427f16841c97447698cd0f360529725ec86113594045e143659cc1a0667832f40aa7e059d0b1389048a75429886095b3ec5a646ea12a09424338c6ab729a27e595ac7784169c6e7c7bc208b07a44cee5940f85896a7285845a2a262da092d1b0295821975754898bab492530e44a410f35563a1e45775613192dc45df526cc19b6eed8186e6f706e233542a4450fa6c89bf993af5699dc0e46965417433d5b1882340a1294d4b229d42061bade4683f8557dab0603fab1bcd956b29ba8a2af60093654f09e70f07eb3398f7bed1354a7982416ac40860538c36722ce1b37322c4a888c2359080704490b613c9a5f7318566a37139563c40d58c055b827145bd659c8fc6b7908a071fcdf0b17e4351cf3bcd9e8cb9361985c70c49bad71f860b36ae120f62c06f3b34aa4942985d149db7b13e1412cc1ff59dae21cf50017883a0aac754ae6cacbe87a46919c05752877840556af8d56fcd848f982b415d333fd8640794918ead0121d12309bf622d9c97551f294c3822644834b38fa844a035cb5458aa7240f750287f95feb1696d88988eb0648c3cc0fa9d4277fd9af8c579271f4c77 +result: pass +ciphertext: 8ac1b83c47c4869e81144ba3963f3e4e1ea682e982500d19d73b368d60b66351c0da3211acf974bf952d3c6fc8a6586ef9ac89c7321263838ed84d8debd7fb67eb0aea8764d97cc371eb71970c0c189150b8665aadf4396a344ada63e29364f2a3f7199d5e1c0b5774bc87411e96a6907e193429c9cb9ed2f127e025cdf9c03068afe7647e1e433ce627b034afc329168bbcbd930b6cc52316b77697fe20797f178e3f16b45ec4a86cda556abf7c6da5d908b7975c6678edd0d4049dcad34c199f9617ebf5cde3dd3c84ff2a9f9f95248973a7c0cc5214aedb637c170b83a8cb740acb2e606a3cd524378ba26c6b019f3e8c4ac43eda767b9b135c52168cd0d548dfb0c38a1a212ca310905c4395dcd0c9e529e3aa5aefc0b6182733cb8dfb269c15d4890018f8339794d5e54939072b50c922d6543e6d3daba38d4dd1b3e9a8aaf4eae22e9f28b18d7b7e32d2f60321d3e4bc9be6cf80af16159ecd0683f840fe83112fddd0a1d85333069b818c270507668d1a0d74e018dd8b2d989502e4446acb04758cd4d00df4c05265d7702e65b34a6e2df3c77231bff33e93b9fd55148544d80cbe5b3a7bcac3a247a858eada0714003e2d9776c95dd3e2e869de54ac58ac8997d750ca6b29a9bc20fd4912d7889fda29334f7270c984567d222653e51105e63ff7b04cf5ec4de4a3e20c6ffa6b34e8a47a17936c684a0c57871a5852565f5872ce545521c832e6259e2a66234361e73b858129932e69b09eb5b7e7957bb7e8359e9257c205d1da5e455d3c3c64beada12d15e34a6ee44883054217142634a578bf42c9df1bd4b7d74d79b40fd93b3bee4e47b8a1fbe570c45061f55d6c181ec57e7cb7a845dff1bf48939ee9ad35146a0a7a9c0564628a4bd3b6443a2cbbdf82dfd11642816c130bdc4bae905028a584964c91482fbdba6b3daae7822549b04ab83087d12ba7c90b28bc418eb24165219b36c73aa32a4ee1b2fb97d421398b187a0bdc1fd7ebd508ef0afc01a6dfdf82cc37ed7c0bb771b792c6e4a5d4b4112c941b3b2066e1b6c63885861c0ecac6b20a206326283ea9d375c6aeccf179d5274389f0dc49183f36707d72ef6cd7adc3d544c7311f1983a44d2482154c77b43f0db3a1e4c4ac78a52b163425cdba002a29dc27bd9c191196e6ac0524841c3f11ea13782cd439b26b1a795c9f9629e0efd153af705bd8a35f1d70d3c5c8589475772307dcfeb6899f0076eb9a8f3272e72bfaee493ac1680ef2855741916733074a2be07b948bcb3690f965dabd4f4ad98ad5be62a6d4b23919bf3525a5c87839707e9bb7f61919deb787dba4345c1d58dd6771f1d7677e2fcbf827fab1508fed198af0264c47b2e385d5083d2f863619e368f4f3a154ce0caf496bf2970382e42876fba4797bcdecf5d47d8af4c78870c0afcfd0c7612f005af77cc8c268cdf9232a8ad5f9c373160125af1fece7654e0d9fa665bb1b59f73765d6cac9108ed7baed5a7c231fa4011ebb0bc37ffae8ea2b11e5f665d54b394b5a324f +shared_secret: ca249f10d39267ec3725f56b90eb2e22cf8b577116af350f3d3c1e2cf090ff73 + +# Official test vector 29, seed: "265eb2de7099e4bd5614e5de7f0c2a05c78ef3e8e2dd4ae4cb70f3e5e59c8d1d88248303f07de0c5508652da66b47222" +entropy: 9eca0fe36c80fc5eba171c3ae66a5b1c923faa50b4521bb055e7bf51005c93df +public_key = e770043be600f7a60b3b370bfa6a30c846c475127924071e3120879e2a158433a2a3a7791c204912da8576bc2722eb9e38139c198915986b58a9671fb054a81443553ad74563f587b226a9117c133ddc10dc0655a7d52d493b7b3db9584c49b4d1f41c06665a3d07383057ad70b69f85b6cb2682238120b830681794e042d910467a24091d81322a08aa1d83b0861113756615a119503af837eba16768046b7e64ab5940aad4da6e3165ad036959c39bc69070bd7f074776089aff76b33dcbb17bcbbe65b526c795b65943821d5b52ac1044cca52e3403a02604a1b4d9cc84e4b72b2c136de898a12451d8c74c280a67cabba42dfcbea68455c5f45bd3ec03bbcb3f72604df70737a01683369c8a57091742c60f089a673da350db8ba39c2a1108aa6a4e2a6f24b13d95f004801b240b50067dd34b60991db2a42de3dcb2c24034d0cacd24c890cac7a134bb183c92b5d66c7000a5a3f80898754827c9a7cc01a1550a9cb4f4f18d5959be0ef84c35b54468c55a15d274f996cb74449d1e5b2f88bcb6d00912a9305879bb156bbca9843610af2c5193363177d2b5867240d207819498a98209c109273dd44a4f2a06549335a63afb2660d212592c417b426268485a7e8693f865c0a7960e073153d5e578a74b34e9c3a57eb20fc825ba59e56359a627f358a4d7127be7d571c991078d9630e1262402a731b14b9f0ee4a3fa4494bde9aaf2d4603af1178b8b49a649056fe314caa92df6d816fba591fc4961cf0509d0dbb02ea7321ef75aeb20813e33a9717478be58b49fca3130ea2b54e62fd3243f4e240e54c08d26c5020a9512d2536c486772e725267bba974f3a451bd50f29c55c7189012473ae1e5a7ef35c0b479679f1a71fafb41ca6d16b39f100201bcf2515075a1c9f881a7ae4f4733b149e7c29973588c161616e9918062236332cc67f26a65fc72c78564312c429cd1f3854eb98c0ce91be6d9a24aed0ac65bc5d805490e1d8c86963c8adeb8755e0bcdfa473ee23037673773c46911ce0baf8c81bcd8047a9d19175f6bc31c2997c62c502b934d7651fc51562625538e24b235c4c38cdb82fcea4abaa963b3d67b3679b51a21cbd77228338a95b4d641b5eb26644a58a59abb0a8c0afc8894792b3c6edec9ccf7c29c620b9ca262c634621d225228f1503609b548f0418648cab5b9609e7486d57e5824c538037d32319427a3b077703a7368270c9b752217eb04b912a3843f4afa829b38174bbdd1cadc8c74697544f6229068344441ee2863150716339716ea6a8245a3c3c142b986b7462fa2417a413ab718ceb196f15f887a465c8f901c55db4718ea58c71926ea344c49635149014297275baecc90ad1c95c75281eb885264f11123ad8cd7cf1968e885220f0964f25510539be63263a4eb6169f7319f0086fecf996d2e852f139b500dc1fec8824430505a7702360d81823269ff4b2622b54b7f917bb44714660051c31d9b39494a64a86c15c516437c4a437f41c0fd5922dda52818336d93a8c750203fd859b06e127d8e33b52c34411e4199cb01cbd70b8ef0180b045119129aeb04398841bc8261444c963c3fc11c8dd4c78dc5a8cd902687e36aca5f2667abccdf2093e5ecb1a4f09769a8251104731ee68587d0a470e2ee6ab99d3af13f31776 +result: pass +ciphertext: a63cdfb094b7b97e4a9d4f637a4b2892b308753a34686dde8ad28e5ea9dd44bb0f2b07c030c2bbe2587e1dc8c2247606fa5809d53982cb1bcc18675a7f6ee5323a12a87137236b6347ec7b6c5b188efb541b1f0809abfe697e5a3b8b6f864bbdff986ca416b6b5bac9a5b43358b47368f137a026f12984ad8b2df97ac5b43467526cf1c4766cb2b60784608998fdfd2929113be1c49b8498b03c8a690fe5a8b9797529bd14c128609e037dbe26d1b3fe26438866422c4aa8811dd420ddbc47218c9b923cec43baea872bd5277cf3ed48cba237480515e2e807e2a0999017ae70cc76cb134dfa894f780acd8d5470b055b2a96e58956dae51d001c4c9c8888bc6791f99284737aa613cb9d00dfd31b5d0649e0ff3f11718b89b398d0163227bda245ecc75756867de7beb78d6fd0bb0b713cdaa1d482a6436ba169cbd4783b5241ec44a5af9256ea6e7ae2463489dc80787022d311e900b42a09f43348c055d21af0d486d5b2c6db80f9a89b82adb93682f6e98539acea6520cd7d476b17ddc5697ffc64566445f0f90b8c187c0f904b812c592437472ae0db4b48a2b45f0d699272f7e8243a6e42e68c37c331e7b96dc676e532ddc01458df6fcb2efb17ca4b07039a0f80c7b03078752fbfa6527eb921350894f4d398238c9f8abbeb3aab93da79cda1792123d4af4562d29f05303bd90ecd47dd9940fa6bcd7377ada7b5ec3f0ab7965da90f73734b8728c4dbba594394e0461b291586a09850981b961ad327fc01a578a4cc49ca14d570d15a23989141c9dfef64fb1ca38ebc92654104b983f793cf9a553b6b422c88c7c38c524bd15bfe35559752f20074b0fa631f6d49f973b4553c81c206047f48b49a0fecb63a4868fd32e295e7a56a0e683185748bfa3aaa77676ada8b81ba5d1314574bf17a11c1b58700246a7b323f6ea0840a9db60c2b6ee1f49a06f6b6a11dce4a9d3e8d352fc82700169d1972f65273fd1148d7c9fa978167521922d614de3bef02ae3b17a183245ef9272c1a96329fe592db73821b899cdb93e4f33e31a47d7edf275c7b0921168de50c3984f7ab213682a031fcfca95194483a58053bd644268a2dd82b77ce458c37df183509e32bbd7a6fa64c04df4c91491cee59a2dbb7a3e1202d015d7276d145ec51c8a89e2abcf8125439af8b7a175326995a3f543754fb3b3b7c70094c71a37d1100b8c3bf987dcce3644964e3812b5b7dd913afdd98002692358364a1e9697a1dde2200c886ebd0b3f8faec32c92fdb2e8c83d7b04795baf19da6a54157e75bafe54026001c2e76a31d1c6f92f3906145e57ae1ba3a5c63cf59980f0b5e23555584dfc654167a5995fa4215f19469d1d729bb02523dba785c5ef873f244bc944c920da91bd702c56fa4026ee33cbbac7db1cafa48b2445491e415027824929e0e29be3809e9a3304ce69393b83db0e33155cbb3df4788937ec988c8fdaa704b5dcbf580b0cf125d7d1a540ad382508eaf5c37cdc2a44d63a18b586bbb633223933a49a65c47a98b9 +shared_secret: 82a3856ca48c5dc582ac25605ab0c675ad646ee19acbaaab4ccb5350a3881b49 + +# Official test vector 30, seed: "806bbd111f27c2668318387bd0830f65ec21a51af01985ef48d03d64e1958ff7ee5133a4ebf6dbf36329bcaaf65f40ea" +entropy: 0c5719261caab51ae66b8c32e21c34e6d86ee4aa127d1b0195663c066497b2e9 +public_key = 13568b12232135a5896094834cf450d789ba498787368b4e15f1b087a704e8e327d631290177add97c0a0d84820ce367dc515fc362aaa98aa7911a867a3789f69a5b68bbbabf3aabd037b5160a3f3d8277ec47898ff3ba5ddbbca6980b5ad47c59236eb33b2a9c84b212e93d9e70aae78a4f9f6bae592ac2b5f96eee627971d27389905b215869d9f4b706c379aa802b5a99abf754ca9316872f033ecbd5b34f72c610c14037540a2c86ac7eab0c3af84729c48610615c9956751759660b3c7bab57146f7b1088501fe14b2f59141b1bc6302d88a35fe27e0cfa18c1a22a9eb517ca6060f25408d4299a7f46c458b3bc38c4794bda8f9079043854179db0071af69c9f074a83438874c882cd18b69b0b2009497b6fe94a9264470be8256b49b6c353374ad49c04b1276fd484338796e4389a523598f3776291512e25fbb5fe98591320c1bb47c6ef3b4bd1d62b6997b5561bae038854ceeb41b2925c1f1a81a702b57b2815f62aa9eb2625ff3512cf9595073ca623da43f32c21d63297a491b28dd8b1361bbc91b40b34a65f1a2b7db86b0b3bd21b26ca5795b795e355b45d1623b3a9731218174b50966d6937ed057fb10b631a51b7d42072a0845be8553e19901fb0eba35f5142c75857f642918bf24544355c4041102d8b197b429fe548433eac36c42077ed787f8e631edb856d4398a26d536911ebbd9f9c22769c756f858d180b6b51797fe9ec0833c908d9ab2730d937b76a0febb68fd84372c96c3c05197093e26d01219c15f898b2c7ac75d11485a2a413a065be744e0908b6340155a244838ddb14b74c578fca2d7e6c4e15e68421a568e7e39a4a04231926768ac4a061d67550a8512e780198738bf3e2420cf75680d1cac07798c01ca06102cb2ae5c9b99b62a7349fc8a2c558989b68e3789c2c7074b476d18212846c8a8d562166829a36587eafc95a362874e812aa951a6995f5a94d370afc9b64777a7e58cb54b62a95476ccd323073d6e466e6ab909b4b4cd840aff393c9391902f4c05bea833d254207cfe938669cbee478c57ff4424004003d151fe5e90413924bf1378419e08dbc46911e2ab2b7f45dcde5c549f679691632c3d9bae26b9fdb85c7bc3301a3900386873345974bdc007f869155df79cfc6f06c39d8bc9a99675382358ba25836a15cc222ae78e4a85a19c5da9912e48128fb37a7f386c0fc86afcd2869e292ca9b521e6ef9b12908ca5d800ae1a7a3a7070766e2802a947c7edb3452a377d9c1bcdb152d37db41ce7c74c36b32c59131b1b85f9b68a3b66773ee4a2b81f12509c33cdaab4caa563e9bfb3cd9c4c72354c1e88423f94169e18bab1a9798cb99031ff852e79229630c8f35459bf40c425af7cb0843498a3cc7fda53d932a07382018de07808aac2b4d60a1e242beffb89489ba69a6a26446180103c11f7b22361f651777b997b76ca8f5a25b97291058620ee5479e92aabb218444aee52e5c8294d578c709158f655a8930fc197f765fb3790bd62a5fe11b57f273775da27fc1b5128663c623f5175513b753543bd71aa045e77e4bd42b7e7baa5ab2c4d3c41f4db84af265acecd4906fab897b5abf5af66b4c4a0b4e783b417c6fadd71d34ea294ccf8b8c8012edb8badb3437b191165cd639bcde9eb71378e71fb55129 +result: pass +ciphertext: 07ff98c23d28846d4b8593dc2723f03694a5fdf7ae5770307a971e8aa7a83db47b5f9606c68e1b0a9d8d10ae26be23993f8e804c6851292c6c54ccd1a178084f8ad379eb43cbb0974fa2f5cdac3eb90a06e844be6030af49e5405be461d01598f264260e42e5c3ac1b5d9ab05bb5ad77acd5fee7356e89f5a1822ab5afeff2474bc562990e71bf0e6e1b720e59da9fafdae4d67ac58534dd33612c66c468fd9a9768dd6d6a18ced44bf35cd2887cd664176f08f1c9b0a122b7330ccc37a7ab99d5d57ee7ec4b7ead85a7a789bc6e4124e4541687399e3feb3036554ff903a595ae2d09b1abb496390da90c49171fcaba63d32d5816b43c9efa88c1a9065056a526f139291024abbc01af22511032e93f89caf7f67bf180201263a9714f335ab3808c0c3c85a9b4c9daeff295f7600287db1cb6014f34c6878d60eead25ebd39c5b27b1d5b8067b419abafdfcdc766db126026110f2b52821edb2895ceefa379a509e1c29b885582c216a3e3a7e88c0b15fa53a1bc4a2c3811d5716bb0a68a0ce08ef73a1cfc7601eebd70471e18a9e63dcbadf4a2f514e3edfc9a0ffd5226545f9798fd1588d9101334cad0a84298abf9d892c2be45398c0c67a1c912ff6c5daf42343da7d2d6f0f4f37d5218d46565a47b83cfc84dd0a76a6c86eb77dd99fa003bdbdffcdb1005160803ddf0d499a362e3c31e77491b9253b4fe3325e217676a2b6f525ed75810c37ac6c09bc9df8f9c966184f5fa3a123fccc4cdf24b886c6d7f5fec31ea0611bb3c43a2cf51b50afab8cea581a2a9e9214e7981735e8ebe4eaa8e8a44db119bcf4243d0b1a86a2150e02be402d61b98ef77cb462c8dbf55c2153ddefd08641a0d76d8bd301a59103f65018abfac4a538c12723269589d5910f658eb3c6041fa8c0c5e7bbb389f491a0c01a1853917f393ae5d90ec14c1d71d7b1088b808818d430f83d76b1d6722ab89610a7d39f13d9931ccf3c90a91f28fa8d9b00120456239aaa0ea648c1c7221122c65c822e879731cfcba33720a2ab082029ad22b2499e399c11de442bf090f416023bca3c99396a03d1480ed3cbf78b1efa5ed494baacd544c2531d51c252983acdb3b405366f88ab5957ee476fbb006caed7cb148de870247f70502f75e52b89916a14d43d11f7bea21734e3e5658109db2096ec2941adb83298b36640d81a867118a2d2d6d29f713a7d359cd3965254f05cc272077359d8601231fe4e51f72136631e2ac8269a8732413fcd39e7d5bf0793a88b69c4d86986fd2e5d2220f7059efa44a2826326e5a775a8d88965078645bef91b8d4e0c70c62964c04eca0710f12c65f6e315af8602ab8ceb13db5e4658f08b4fd8bd041117f6d1c1a4d39d4af92ee05310ab0158d8db145fe91d87d1ffea0beef800237c02ba58e61df6bf2d09f3cf271d1ef4276e09d6a8182441c8f94993a31030c025c015e9b6e918c776464a1783b1c54b34b6d2338f35871f717414f85ade6d528695f6fb7229e1a9cc1c6ec8ef89c18a7abdc43147f32c +shared_secret: f1e13731a14d39f474806b8c177e23e4e2301a3b839539fef9591a71e4f67d29 + +# Official test vector 31, seed: "ad540a9ce816d6fb1661e5483c44f6fdd00c9e7bd1a8ceda4b4c4d3697d4f78ed0a56954996ccb7da96ecb8f5cb15809" +entropy: 0e59f6f9047c784c1f00b24454aa4f1bd32c92ae7e626549972f86fab90e7e89 +public_key = b30c011788cb97cb439789a67d476d3dd265cae63cbe43cb63aa124b93071d6812bc662f346481f974a73b16a505c48b9608359a3c035135258029a18b0217461830785379d3355ff3968d3c63a46685902425660b232b11b93997e60ae0a5bb95a27d553081f393040b1c30ec87535ffc6fe528b1e9866cd1e69520e376e0071087748691dcc057b95cd4c60707d8b976d6a67af4869d960d5466a9f3251dde92cfe8a0b03ea2c43bf03fabc9c9b5d97ea2f558b2bc0ec1908335ca4f2607cb04380a830b245f8b43fd06098269bf9ce33fc07c1e68a05f63560d70544eea4c0bc528859a5b09683b8b3d3c6842e6458061b7ddc4b23ec6ae83d557e5c4b1848445fe253b35e52102517cd38030e6ea28a5e1a24bd09ac6b83c5dc658d11589900a7bb09a963480a2d76225ae55bc54108fb233785174b375a184eba110e05762e7f26139dca4cb197620156c06e47e5b74a0970bc6e18b1e1c919a6c0b10e7470d5ce09e2719194da0440ac3aacd86bf724aa841a83dcf64c8e1f7704397a4cd57bbabc9a0cf940e97e8921211006044228632382ef48fb5d3b65219a5a6983ad0e48ee39081f2ba1103bc9c6314090a31aa34213c0c319eead96b865cbc98327570b965bf00cb9bac18c640273d342cedd11d72e2078399c458068439a8a27e388d3f4bb285b63992b5a4354122ac298222e39d31cb886c4958f28c5c2f37384632b4db216b43ca6246051fd704b5969c07dbd525ac6a479e730f8b11c5d41111ac65764fd71a4f43be55c563cee5c26c69cdaa485d850c2126f2bb16f5766fe86bce17535198ce99c2a66918af96641b2ec74be2b61752076a2db330984ccd7021ce360a0c488143648389f492ba20ac566cf401383a496991497208b760d36da6896bb3587788597191c3347539be92b78cc6a2b0d8eb4188320ceb8aa6ee1018e9f78f4f8097ae7527ec947cb1b27dc8a86ee200020127531273983bf66746a7b731464a6b1524b18744a8c606648b2fb1a4339d5a15d7f6a5ea3a1c08122b773ab09564792fba2e28719a603c3ed0850f2d5045de3bb93dda7a84e692c25537ef695787fb0889107395f87c6b836e138bba9f4a711daa421a396f556c26e3778f4d364d5b1844118b367d78af37836fd7a9637f1714cd9a3e52155b0047468b5420cd5c6bb64138ba16863e18b4368542800b378537b5cf303cd2b191ccf783719142ffac1ad0585b1938281ceb5c86587c43b28c49d9111982ba7ac567e1fb64d8e3c450730305cc2e4e12cc698a728977cf1c9b373f051c17f1935177ae90aa8856a5a24d18a08aa942b4250a6447c35289cf0b334af45647e21b5a2153a8a05a38ac4c728a3350a15502cba347a876cc4bd12034935bb3dc14435930d912aac8a787db3ca33521637c5159b015920100b416d22c18d6a0a52612c7d75c15741b6954ae752c4d31fbaf1b483b6b6862e6a983d5465e3b7b80e1654faca5c669e77295f86263d344031b5ea7ab99e714c0a821042bd9512677ab9e89309f41cf47944da1801521402f211a6076490ae393818ea2056954b24a624e6e54acb7d5bbb32c14b339730af6a72647a66f761bbb78012a76540763cb29dcb9b8c27a3c1e43769c31af3ef54f7c8062d713cab3803437e759a01ee76fba1a5b +result: pass +ciphertext: 90739b108d664dcc63c20ad1f2f37658b96f819a6f7801b7049e8c2bd4ee750da7d7f1b8dd47c2147ee4e282af69cc1aeeab6a8959c0a714aefb3625ba5c057c120943b5bc7b96b7bd2e8f7337bdf6fae024a2aa667c556c7f7fc62bb303e898a3f73fa2b0757302cbcf3097e56b123fb920ae88b49ea1f76008564f2f0ff54fc6e36979239d446ff38d85f84fa82a4a3624a98a37f29651613cfdc323e7fba7a913997fe19d0e5e0f825a89cb37e423f348a1d78159a90ea4aa0193c4c7ee86146e3352c80341757c2ace339fc739b33313bf3dc5b53941772e782eadcb558ed4ce7e14ec16334eca20c7d12024e47570156955b38a30e817eb139c00969005013f941bdb7da9476a29148599e679154c13b23ad1491e5c9c1b3f04e2ba290c3b7cff7bb019793f358abe6353bb6824bddd156e1d97696a8b7e32aa8a39226a29cecb496198885ff3e3671f9dec9f443c45d5fde1d1bf1ad9b54062566aa9fd87b318b6c74a2f78eff5205505321a71c3a6a1254a90c39c39d44783a8d3006744802cd64b6b5379bdd8184f6362709e8a6faececd89e25e88295e509dd8f20514c3487e20d5d32da32693146e23dac996f7b019ad79c6abc01b617f2669d92881f8565c95e3c6193c4e813fa11313221526b54c795841c115544b81903801b6507662f2fcae5feb9a4e6903411a69e5453ef822f8efc570e82b94c28a97038c32e4c08db304dff48ce7273cf1d8bef89fba35d886e05703dd5f839bb253b641fe631adaaf43e53ae0e62ef827636cb3cc7a579ce09a0b184621d147470ca5d92a97baee9dd4c1200fe0206fb50081472d9abd3b592c98cb799044b201bc2db832e83f0727018b60a69a640fd67f095d9f2e1bc42d33e673220d5f6d86b2f3e1d1d63ff39c9ed1379dc75c2b3265993eae102373945b049ae2be4b54c039029dc1680b89313ab027fa1196010d0ac8cf29ec39348a1e559eafb3d29d346802a8eb485dba3d6b9cb7ba93e1e4dfa79950d9756ef0dbbb4aaacb902a4c21c02a7a606b4214c8108949ec7c089aad9a63aed4778af6a779ba4b1df5039ceea017fe80fe590cb761ad940609c9716a1e21fd0db62039a9a21cd0d8b265e350f61a982eb167629c79483c5f23791f0b20b39c119acb3f18cfa9ce2aa03981deed204c9c4e9bfb8e404f1899890262c6183bab1133541a4248a7a7e70ace70fdc5bdb21be1aeb020117f635f2970b7497d23197969e9138a5e50f81a752b1a4b22f0199cb53503344d0bd4d90bb3c52dd3cb58cb96d477e8fbc237370a5a17f0665b942363370cd5d5801199015a5430bb23165fefe3eab656facfc5d023fb0f0016493b801cadeec5315383aae86721bde15061f17e4d775b8497b3de3684004d8c960dcca5ca0464a4f60a43893cc75299a477897c580d434c44507afbfc5760839061d481dd264f6a3f07347ebffceeebeac27dccda8d3cfd377a29426c29d57d2367a781801cb227695e657295113a6d91ceda67db4af71f0317a6ca9e206fe08f +shared_secret: 79c5817a4ba25295cfdc817cd303f3465852b93c0c908fc4a79e88c45f3b81f6 + +# Official test vector 32, seed: "288a5f2684d862a86d2790afddddbac6fda934ee7d2e6da1508bb550838609e8107312b28e00a6c01706374ccd3aefa7" +entropy: a3963ade17d69debbc358dda82c7bebe2c39d25b36813058e7a161542e3f8c2b +public_key = d23b1a80b6c91017009cfa4925f3cca1b97d1a820b204a4ad5f4bb2147307a5350d0244ca20102b8f800c924bdb5667a5866303ed52e27c932a1d84c637c707537409fcb7515f195e557920ff79a3001354cea327f274edcbb99e66acda0aac52dc503717a3b24786afca70dd84c7c4ed1c1b3ac454c832caa687bef8a96bf6c1182f5c663c1ada4784654393d4c83219c149e31fb0ec1e9afc4297968c80209594aa567c65000a883b32e3fb82d9eeb4e9af65ca4fc0cc1ec794eb2b7ede1a5556474f3b023c45b5d8712109a2281f4527a4bbc8262c9bedd0758116643bc6a85f836825541767595c0b54516a330137f0724a1b232cf0a399e0478f732c543f81b9d05c7f5b086c64291b2d94cf02462df7c0f43eb06319265ae25656b462f1445ca5299166731b114e8458a0a0361b135e6002315b65b337304404a907f3c1d41ec9220055939e11f263186c3751f96d750f3a8588ee14f40b09178368ef03a9526a5444be096c3da8a7441638f64b4fd201e31b34f2c456ec89890f53c9a25b559b47856053227e3b36c16297949c6b11159a79a4344f0759c7071a738eb0f80c25ec2f0a2efe614c7766c9dd68fb488c4e514769d9b6be2d59e9c9cba6b5b1dbc9b0d8e5c7078663794fb4eb8c7060bc1b61286cb173ab6a80952424423746bc91bc953b67908bb34226eb382bd54bcbbf5c60e467652728186c357b3fba85f6b8553c79c730ba51ab90d06ea9edd407b89e0c0a4276ea3698ee5e6a8348a2f9f571c2b7b93f5eab702f1acc3480bbb223e68361fd89a57d1716fc8c99ff43734fc58969d35077f5bb422b859b271b085f41394f28b416565d2f90848216ade3cab7c205ef2f47d8b50b9152a9ba6032322e737089a1e5152387e3437d2190cb9e394bbb6857a1b1ead7a3d7118b0ab8367ba1cc09f910518420a46a18271408121db5dcb0670ed789d537ba3639c530a720ed9f40c023c75b1a8261b6c0192b14843252cb8d713c8736b34daacfa235c9a51468dbaa6f2e4507711344b5a722ae46a70e683c42a9056ecac5d143f9929006bb168ff2ac983ca8b1d99cfc1c8cd919b282eb921eafab2a778b227968f77ec885077ceb7bb5fa13884b6a4bac782b31f250569e0671396b780e810e4a34416166c18c4204ac4124c1020064a257c32369c892420510811f28872d59cf8db48f2a1510a5895a09c008be695699a4845210777146b56093d36960d6c36860cec578de3688bf338a28118a67833f5c4c7d93b8867d93ea7aa99a3743434d236d786cd8e617791bc5452c88e70f1189d5004e17146f3c69c60682c11e78b06b2c0815bb889a17a15eb1d985b601e6c04604cce34b13d82a328f61c2dddaaa25fd9ae0dc83962c0887e392a25c8657d61cc2ffc980d4cc4c9557e7dec446828b03e8bc9a1355dc32b1c06d504cf613235b6b9b1b04c0ed550545bc37e7000a2366786da49d637ceb5c4273041706597236be0a7213cb0394282aa998411e1236ab964a7998055a183dcc4ce765b8756760fff965d2b7c5adc272ef1d3b214b4ac9b543e0f24876e773edc54c105892cd882848fcb039e5223d0c68fa204cfdb793c5ee56659932cab213cd4eb18fa4b045103a1e865b0c567574e523be27974b08adec6d539f37479c61fe8d8c4 +result: pass +ciphertext: c2ae583a3b4928851e1ceac877a2b061b9ce589c4a2eb6ddcb36e3621e558ab8ff4645e43144e8b58368c151f7eac2300b060e1e7a30718f96edb79aa71acfb804e3013cdbf19e10549594a37396e364c01f0377f675f4866c4be24a2cc513f07edb6ab0c205efe71eea5d9517c39f897ff4345f63a3c88c258582a4747a744c2330394efcff592ac8df852a7d9ff5d7ba994ea7935075a17bff2626849f1ef4b9097008753b814298c6d9603e7505cc0ca7bd69346edae4e9a360fbef3fd8f7b6d604c22677198578a52fd6f5e67230dd792ed9980bacce91e50214c58a2ac1e43f17e8f57670040a7fb86242a2e9fa63d8530a9fdd2059d690b994673027577db5740c8b1089deeea7bac8c2c658f77235cd9f021bd04d38c94c091cba130060850e8743dfec89b6ec2beb45f21a12bccaa3fc0cc130ca99befb6f14584f3a836f56d8ceccbf9f2e51a2254bd2621bdb7fa1829918fe49fe16a95c6d49c2a3508de93bae8a1ae832620e3929382a1c3ae8bc940df65dca1d7f7dbafa3b764422d07a8b3e5d7c0071aa20c36c87c624148d158e0ef3bf8edb698408cdead41dd99d76b2ef8dabfc2cc8331483db9f6c2a7053c1df415c7621bb3cf9ac8370bcbbc8b9305433e2b32ef8bebf615ffc1987879e3ba5bb3a6c57d42896d30cbbe63652c247c47002b879864ec0ae1e79477a5d7174ab3d10e03aa1eaf3688a287d0f0b57c923d2d3b63bc744f922bbbe6d7755beb6c4be7966034cbc917edd85d07a3a725c8e8fb0373582278a0ff79cfd0260138c7c1c890b7171ac99f7377f1f7ceed581d30700b70a9198dca6bf5406fd9e7b04ce809261a3dd0cc32e1e4c92ade1de79413e3616e371fc3a1530c85b687e93e326b98fc767b81c7409f88ff44647a6fa63a3d195b8733f2e13097502b1b712039a59cae990013251564d3421ec1ff48b07fcd5cfbb089210ece5f9841cad8f188b5774a769a8a8eb43c2e122db423630777ab36fb68443a72a76ebd9db6475765678d94150acd6a788f08f243879c8cc9ac27e766a631bffc106444e2f2faa91b5cc5b09cacc8a9f179200c81561c078554c9feb8aa018173b966349100f3499b1986875726ecbfb48abae2d2c205ace430e350a28db81f90d0c7b23526cd2809b721f34c0b46a1a078be7e2a3cea00996495c99911cfd759d6b0c7c6154b20a977e4a8aa7237bafd2f55c590ee6c85ea595d661d44d32f222ecc479305726f6347d58fe100141edacdd9b3cdf01785f6830b80db7478885201cbb445a1385877e0b5020a2acb849d1cf379002ee78d275f37cd518695ecb6a653eb1c1310d3fc5584e6ec663c495dac1dfff668cd35a4ba78f34cec527e4e6e81a3a9f78274729049b2f6713968ed0ba237f4c0d197d0e7d06447ca3dcb3c13e8feeb14fb68e1cc206fbb8e94fb6190a56669cb901dbe770f9b3a2b6497e1346d0ef60acf9e2c0ae082fb364b9ce7912abfdbf300f3896057a130c7cc089ba3fecb416cc40ce3149599a68aca244b38bc605 +shared_secret: d92f866a744d0af51c8c2ba7b1fdf816e0334bff45182cabdfc722d75f8140c4 + +# Official test vector 33, seed: "4635dc5bb92ef98cdb6220df0dd717c7f8158375eaa2b78fc3f0b58e9c9653e92684cad3461d9158a481da3d14694c44" +entropy: 97beafabf2c8575586487c7a80e8af5fc50f94b6051c1bc66a5ae9f66be3cea7 +public_key = 4f27944614c35d121bf2390402bc93797055936a2d49699cdeec2f29413403aa1024d802d97c54aa316707c26a0b432821f63cd89a87f769597cec8356c2c399d3a34115cca89b9df6a55e4556a3b2150b51907ce67b860f697a65b199b370691fdcb31cf7937d1524bef41a0732cfdf464175c95d9092176ce52814d3a9231114cc31718755ccd3a7b3fe69b4290175dc440cd38c69faecb190ca684fb1001b5308fb4c1ff6a55b4be8814d602ec59c2deed654c93a45d55a3e020800e98aa786c76fcf33cea3a7bdbffa5037a171044b1b74d6094d1a3b606009b4fb0f060b6dd1d29ae67ab90c90c25db895c9515fe0a17bdd69c6773518a532ae8ac731e32155500204dae2c9284cc16f61b5a9e48334859357506e2c391d1bd38865ea489e492d8b847a6a50ba074320fa32074d89894324a705dba4e1847a5059645c77063809cbf3cb0555b6be4069c77b10a6c6f67ae1e7c09d603e87a34acd3b814d7b4798dc05acba65220289772abdbd89403e698f3556511e152bc0f77509dc36803b57d08129951ac44ecc49f43b7cfe8436baa8b5376999f6442293352e76ac592b95804217817ad5a75a76caa72172df9c69da4c170e937a69d93f12c7b533d4bce41b34d0cc8a1c969947db2c21a960d975ac029280ecbb527654a42385576286915d4b8f3fd163f0cb280736bee89786fa277c8487b0820416985855a95a10647059cf34c08915985c32321b5b8b45a468cd4253c662847eea36fb238098f059630cac83aa70cc9596cc1a0406e993b737c236e78cfbea1191d60fc6428fe7090997f1ab41c13e0c57a256a813bc559ad1e6ad10dc3cf43a64dae2955f03b46a09ac6ee30326d95d6ca8b80e61aab77579c017a1906279ac09766bd8a1b40b24d8bc4deefaab47f9c14a8441eb413dbd718e5122ae7beb94f526a31bda25d893a544670d994530d3c6ca29879085870f6d54192b1a7fd63193c7423be4867d2c134683ba25f9240e0fa2a96b47c5ac05b541c2980f51557989b3eba42dad002412f462acf75b141c5fc320bdafd3c11be291eafc04d6b5a1d4117c7703c313eaa30477253e938764364b25d859aca263962c5d6d898ada856b70e151dfa41289213acda6cdb5241bc7067bee5cb467c34d2b0a6ded6aa746290ee2e40b7be1294c583aaf415dd03213a3cb2e41f10731823e749acbc53767c12b93d8f32257a54c6a71b2041a167d685f0bf789b94b277f1b60af22c09b639ac72ca25b1c69b855bed6377126999c5708789091cedce768b253ccae981715c8922dc9562ea8a0ba102b02585281b15c7e44339cf630529c1b076106ee2b5c7be0181ce43d397a398c8547da703e2ab47bc15284f4c6a50dcb904ec9c1f60a1aeef38435997871e8501d4832bbb2a3354c70d9579f237427135329cda32573089687d9a9130375bf66ac321113a25a08aa75cb667635455a93eae7a0a6703a2dc0a85637681ecb097f1b16b2b331210b6288b13f5752bb6c731adab30ca051a817099095022892d923f571b8d879c8ddf0ab03145a32298dc6b644b25640d808006e3113accc6a0c1ccb05ec273e6b6559e287539c72d754ba9bc48c915acebb656e3cb7713e9bfc0bb6f311485ebaa078b78a737d81d38d368c220eb0e982fb0bd8a7ed97 +result: pass +ciphertext: 9741b66dca7f6250ac69e4d8ef7a7cde4421c8442651077d9a1ec366f49aec28e744cc924bd3cb8adb85564aa554a21d9ce485388293780d9a1e047c9da49823436a94461bfe2b4c4ac4d51af950e506c5bd4ca6da9c04262bb2b464b208c3686edfa29a512c2fe88e1de7faaa7176001ecfbe8303d779bb47bf92761e724cf12048708b21ae7dbdcacad7f977bc6a66264b648d7570460532966da05f9d950ce5fad36a9b0ee44e27ad922316833e6a18a8eea01c052a3b49eee2818634fc812c37837f0a09a42e65a5b124aff7f00c3b2e1e48523c643659a70a7651a92fc3f4340c3a5e0257859826f0fc9deab7f56258821d1638dc3ddf5fc1240469e6c7d4ff73d33758f39bea68f95449909551f8cf074b59e9d616657f2a6a336c1f5205e17f533c6b717e674f9774183d18446754d971d038d6cbcc51adc15f3e672fc612628eaeb8d0ee394a8044277b77bd1924046adfe1a5f12d778db4f09b8327497f6960d8a799935c2e9fe637570fe96280dafe0ae466cdf85633f3c926dca5eaffa5033227812aeffca6613138ecf47c1d5f06954b84feb8a580f964b1945448728ed02a0bfb6d7ec93d68eada6e34d7b4c084b36b4ef9dfcb5d7f04d0c10230889fc693303db3b45d4ed85d345ea161619b726de8a594ec59341e225401a0aa26a9937a5659e43d6af3232f985bb973857f88be76693343f34741db8cee47764c0dd96590d3abb71ed5afefc3b347540336a838703f658663c7d39cf338d8a023808bdae67f7adfccfb193e2324ff886218557504ad6dc63c86532a413b19c575001a527366e8d188c94797cc56a1c0b3184eb6b739700c9a36e03c3964ed2eca1de3b5c4d8b71c783ababc95a60e783a53e245fc7a8f6c1e7f0793b6660e250f1bb62ede38abd359b872cb033a434258c0255bb69af3f7529ecb5dbe342ddeac1e841ecb95bc312c8499b757c38d05592fdb5ff04e2b0cbf3ec766e6f6f37e7cb0f250a10fed900ab73eb61028c4e70aa8c9d763cbe9e13deff0fa2b0459962233f4ed514b8b8aec33e39cf7547aaa2b9f796da64c18e2245ed36b4e0d1dd62e3474eb4704016631f778906f4e7f6e9f45537cf8acbbc3df179090c1ec63732e2980abf292ef39cf7b87c320b76f8d6cd8f6141a21c321e72909506ec24d5ce6a46518ec59d22a809d5f54898f2df2270229e658878481a1789a71a94b28a865f5a2a48c18343d79fc850edb10730b7e0b7010631ecd9d24df0a8a1cd6cc8573f23ebc01ca355f44db9550445448d9f48c4f084c4b943a5828038b5753896676e09592eacc26a112da50957b153a23316fa6f4e70a84ac29c0969aa5fa6702ee80f57f18560b7dd4f6c81d0ef12f6735107ceac45a2bd8bd35f76a59c8d1e1859f2b1b13fca5fc58e9289e7f023e4f03bc571cfbc334f53bb23d2af3da31f00f476af0828f8240f71ba607cee6d125d3055a02307197544906ccfbb15ae8778dfba1cbdf33554c98a7c6069b9f3eb0d82316499832a878167ec9b11ddfd1 +shared_secret: 53b3b4ce1e75cfe52d22450bfa763d07985dbc585166b4781a7e6542f9bc03e3 + +# Official test vector 34, seed: "5da2c51b4acf488c8bded5e985cc4702e4a7bcb248b5ac18aaba529f7f9cbf30efa776e99f76d5c1686e94f50fb57dae" +entropy: 75461decd34c50d6a094b4a64fb75e5e9479f8f9250d82bb7d729dedeb2d4b65 +public_key = 39b95d90d51e8cecb49dc41a37e866c8fa1bf723c3e3815b1f388f63d791fe0cb8507020e19125bf0ba753fa89c19180a7505e15ab6c44e32f70499df5cb106f85bcc5dc4f20d9660c17307de05bc1eb6bdcebc52727ca3544772cc56a08b30c0c54a847b28387808a1747a23f6460054c582b4ca1e09691c64615a6ba3f89a05a18eccea06b550241047c1807f3323dec674f17056d71b7bea906463efaa0fa50b051723e0cd66cc7587df4b58d49fb029fda6e2e507d637ca7d489971d897b09148a6a2b47d3b4bc3a4ac0715b3abde096bfd8622ca24141683771ccad1094595b20c8af004d54873b0d42977886314fc889e5804474005527170c49882ca89648d24ba29cd30a7c2868f287345f4926f1141531d3a53cf68c8662247d47348cb1a102613ab236b67bb9a7cce47e794096c0a93d54f743cda16ea09c8d87c43e4a1b2cd9b0b5ea711f30b39812ca44da20b02cb4c8fe12343896ae6eb838ac648acb8bc8e887ac69602e7d81263315373029b2d6713705935a43177b9f9888115202ecb1a60e433d8de2bb42d235135224c7f795d342466b4c5bb8bc93931116479171800b717c033a304bc619d2a79a687e005d6215fb1e76ab67d8b46c72857a46d753674a7ef3962c90f2b62f51458204b71d95734533875819a495360ecc12b66005330593456c516ead7b3c942688a822bf0d92bf849bab6068480a0b0b4b8c3a451007dc2a733de7b51d835e5b7900ac836fbdf13a9ee82b34ccacdf6b8f4cd0594c80473040b633b7ceaa091259a21c5c881602c146e4444e1e48800a189239241813c13b724a02e6e7a70834493f794ae7991bbf1b60d4c0084c213471eb3598079adf95004942176f297ad3d55b5cfac5a3b385679ca6af26217ad8309547a0738328bc1a519712ba545ca739e8c253a65394817aa6874e432a95e5f35aa045cca1fc1c7bf467424a8d498274646c05c15b176c8a69f90a0a524b6e4b6053979499e7526ac66830d28b28ca2c6dc4061b1546a4e8d7348416c8a8fcbc0779c51ce855dfc54d94d74bee674bbc383adb248c07eb8889b0b44937356906a61b1074362754440856bb26b2fa906ebbb94ccc943fb39c00292843ed501f5f673762e3afbd7179e41835208700fef233793c0850c5b48499afed371e56e5a92a4109662247b72338db4769f9849f9516266acb133af5666b18131ed347454250cb04528c91b8334c2f5b3401cfb28e45824e73c1b6854b330c47c443d931b9e5b139f31b25d4458ac53a32025d49bb5d1a89b73bf930c74c233bba7afe30239a41587985726fa09d0a7a2ab19559ed380d9eec34b5fa83b73813a763beab0a1f7df5b87962709f255256a36800b94062d3af90990b2a43251ad9b0e400bbaa4a306520443ecc8cf45613a8fc1c61e6312cfa02d23c1547a69cfe43660d987a0210cf60965fca77c850503416c7c18a37bc10ca47f517abfcdc018ffb538f474404917dd65c8a680a667b1762b5958e43547fca1aa0da8907d7d3a25b430724477eb2844e54f35ae8f27598d568d413914bf66b70e37ddbfb7df01c08e1310932ba90ac2287187b022dc659c83b9f554871ae4aaeba7ac76f1254f174493d31eda27def0331de8e68f7b1568c4c8919e4de7a5005ce152fef9c8c88ec9e +result: pass +ciphertext: 70fa89e37eb5689eb2b51fe7d341fe3f1e80e967d0fc12c5f7fa1b8043d02752df88cc6c54964e517fb1facae8ae9b8da1941266c4744e2fbe3a12a2cbc729ed1431c4bb333a61f0daf5ad7231ec741a9fac9a206d15c5e02ba5506a8f99a4ade752738d8ccb744d1635f609d4dfdfc54fcfa5b337ee36c93cb35ed056924cbb768dd089871663c471cdc52da3ef4f61476b9e600215cc248ebb6ff3a0ea7f410bd20f9dbaa1045b46b998caf7140e96468e5e7349fb0ed37eeb2ee46f352ee3dc2c074e258b11cec9782a1f475a2a0800f50c2e3fdb819d85f6cdb392f471f7e13cc5d2315d2a9ece5450758c2c8d83b79825dba1b230db7841fb3a6d7aa86fa08c5744c976a83e67d184b5289987d57990f8b7d38ced91410c49667c1398222cc7bb176808fd19f525102ce7a682d6bde33c91edc9bfd6844962731f1f6e1c24007e3e15f2e1b164616c1261c56032bcaaecb933dd653a6a2debe9649e0d4f3cf849ad6dfdc5d1ec65e2a04d0bd5fa5460e714bb5f8f68d2a8ec3f4470e55eeca2e879af6424340ad6ce9149f9c7f345c0d417884ea8d9f918f138aacdbb78dc5222db2b8357b3d685a633c26d14c75feba0734dcf404d29f6c057d8f076262d82ac513f8730a0d55fe8d59de174a34f697366c08569744c165631961fdc637ef3ebcf572f4b8517ec51e57a8f94637dab7130d4f7b976d16d933658c0b161404f74cff2745a719ab56e32a1b5912c8016c1f80523dcadbf9b8d5986aeeaa5251035e2d93344ec7284ed7baab5a083ef365cc61ae01f77a4b64f819eb5526172e20c39f85bd0c8eded7c20e0a8dfe3faf8d1f2834f2c813e4030899ef222fad3c1a91a9bacd7d8eac4b6d9cfcbc06e160b0e81082bea66aa34f7f76e2e6213405415e57854690243eba8f016e6caa73078b59e3e7359a15bb3f1aa096a974260ecd74524a582cd0b9db891969d7c17a2768decfa0ba0e49f57a54709d767e4e24851c719749748ebb8db80733f07460f4d00e3ce8474551aca82d148adc28cd2b8f0e61a5731bdc81cd2b79e4097a680edb6131a70a285a46d1a020c38e2f02a08bd59cd07767566f6e930e473d0e999b37bf546faa102625048db6be64c1cb94757dca3e739fdae0dae257d91a4ec2d5a5c418ae340ede0b6114d9cad63a39cbb64f85eccac201419bc2430271934f53113682586b307fa7f12f0a1ed4c507c4229cf7a4d27853c9c41fdb6286750b50b11d73fa0eca184b95ec42a4545e5cdd5c6d15d9ad02e6535e3ac87084bdbe1fb35f031ef5960f867982bc34bf7c5543c2f6d7be142082c91867a0ed7c35bea543a60bf12e25879326690a1cbf76f3a80ed8b0eb229ae70a665823363b87c044eb177d9c1ac3f87edbe0ee6329f8bb39cbe5417044371951ed3f9ef27b7088ebb97b5b6cf13a51fc08bd09143fdec693a9009987b424f0a0db914e891e880c16ca40bd05be1da299e9ec17762afcf808772875e3516050e4313ea66aaf8fa7e350a864cf9a73b7139fed5a8238224 +shared_secret: e7165b66834d919f8c8737c7b4df17a0668c57a87b821af78fe68cbea325aab6 + +# Official test vector 35, seed: "4d2239e84b052109a78dbab6d80c51a86d38248105970476b74a0b78b9cfab6283e30d5a406fae1c7f54f8bae1110ee4" +entropy: 2607dcf4fd6ca1c614c21b5e37c24981c32b91c8c3e6955777da8a3f5d9c9335 +public_key = e1696955c4bc38dc838761a183d31e38bc21fd2b955d9002ac69ad96c03822fb4283c4216e93b96d86bbf81888b68b1e67741d4fc8af15d4642a7b65d7b408ec711055826bf634557c8a7ce4a32384592f3c5881aa530213c2435141505a8c0918186c1508ab11101b09397d82b31c85ab64f4bb38947726d2c717362858a0a3656487b0deaa38c8109e5fd061496a695581347d52aa7ed71c20d8a613bc54e8a49a92ebceab993b0fa81de448c156550aae181a537c38638c6320abaa08c50b7b54211dbc8124a487eff2b545ca3db8a07be7674b51a95efd08c4421cbf2aeb8cd92383851a044985aa9a062bf5267382db45519bbd747852ed1a590ca3a89602a6c65cc06c856e22484244fa15b928b13b91736b1680e18cb1f76a7209b76754076db872295ec76e246b1f58f80fe0610372938393288c85b2b2f2107fc39c7d805678e68a38e3e57c30ecb650dc15468674cc54aa8aaa424b5060a03bae4d74c8a43c951e6b53b2c8b1502459868a1b03a5c1395c1b10551c28a6756d251e1916c24ba33792d74eb88a5c84078f60c612beb4a7d94bca27e3377e53442284c395ecc235309d1281c53964bd34a067f225829e5cbfaed47da9e393895aa82a67ab5b44a92d8423bcb59265e73b84f549927427e9295acc8694d77020d0e4342d3c784b121250140db1c3bd38806351416c8f86b4abfc7a14911bc865baaf867f54e92f935b044b60bd5343c5fc9b2d1dc68735baa31ce155e37c1ed0c85162d2ae3492c44c29343b50351c64747f9765b6f9306bbb3e543334c987c9a1c2a5783a576ce94b8f10bc3539cd55f30b0cca01a5985eb5993d35b8cbb136bd769b13f0c5c2d40b34335a52bd34ab04f9cf3f6c313b6c5b9ef879c10c1e1b249cba2580f7da8bb06c003db8718f318979e358292b881f9ccf984c525b61a34f6681197a7834913230627b56388ea26cce0569680c968b31aaa97710c9b2cc019771a57f8b5739554e45048d59610ba990b2e1967648d3c87410aff7981a57e2bcce971b912c2bf633bb8ea55314f3327d3b4fcde33aa1e235e6eb603caa19ba83c98eea4196c78a80e8b5680227caf06ebb22042e9a5c63974650fbcb1531404c6862710215012671093911d67027d491a916539a1b84b3c966b89ed3b1e9980769267827731ece44826a3a0bfcf037d9fbb9bab4b85ad668fd1573c0e9b227fb5ad32c948037384145188b17620eb91cf6a6318f331cae3800164ccd138c8c75a3071a7c0166f5156d74171b5b854c0783f9905b88950c23ca8835e530c4037260500be9f00510b5357fd1b80b09aa06b7126ecc8bdb709e3e698761f756ad0624280778c0ca140c426f91c76f81b96cef425403c95bc00852359b638a8a75b3fcbea47990e002b346d5a9481083c4336d02191326f6ab5c5777f622cd4819bd1187cc6099cb7968474ed93c0b830bb301314551970b86a25da05dce97ab5db744c78536712c752d02206c8585285268c5842491f92636682b223b6bddd39c6070bfd74aae3f8ab1fbc357136028aa3542f006cfbe429001377d2112c5ae3805244b865ea863257aa671d0b146d04b89b233f70768a373043a59b9060b0943f56865e6a91bcdc54402574a0f1c143dd36948d781d2f3c44e2f08b52e339b6e1cb3 +result: pass +ciphertext: 8a123f400b8819e4a011a98e2ad172d55caa7112312c89312463d87f29007d0f2bc26bbec2154e7bc61de53f7cf971d2653d7f6bf0ef3c3a41f3ebc81a007fec27b2071a12e5bc55cbe4b1e74ee9847ae6ebf5c19f67989d07cae375209b78ae35b5fd1a064d8436db5cfb6f1acab16b1c9e49de8ab7615b8205a521c8fd597dedcfa9380fbe458be51760d097867e180a772ef77d6e2014be9e10cda64d88f7a8442bac3f736a2cdf37fc6255a09012e4f4a42a1ace90d99db9f85b9b9689698374d0fae43afc4dde391ddd631e90e85bc63616459f44e4fa6225efac89a2f3bb802c2fdc975405e09c33cfbd52f9a5b853ac7ff30723eeebcc626e46a70ae671f490c32bb3e9d5e32404efff4663bde8e5fa3f9868569d99abdb1e47a11e37e86306e4ed59f0a4896ba667ff57cc1fb140266239f0c1942e4f274bbd359042a4c377226fe963f88079953cba6f338efa8ee2c0f68ccbfad1f78eea6130ba4ad1fc7ce65b3f592eb322deb9729975ffcb885208c73d9dbc51c29544622de87a20991852a121721340c0ee5ffebc09fdebe504e0bb4151f4c59cd24f76eedd3a93f8fd8d6758aea16cf041a3f504085d21e806b2e727526d49dfebeab1339bddd4770fb1c92d3e109a57a204f81556539872b536426faebfa0e80c48531db54573af4d1b026314fd5e0e4665c61eef611dec983c285b479d8982d05ca59efb6128d38be68fe8812469cdb652a3d0bf883396cd57c173cba03e56566f1c7008523c614435c8d734b5c9772b2ce8e806824a1fcc7f20587e6051d46757d3334a345c97095522acf713abd05326d07dc1d2a845540c6a5ecd0b4f3805d39c4cd4d4f07f92806c14e6183eba32a5290a7450cb7630c3fe0e75ac0e9b875a949c4d3ba5cb8c035aaeaa364051a59c446e98b155e8b17ce8eaaa39fd8ae46d03b1b7cc53167d980366437082e5c072b029341be639297a9ba8ca2b2c521c932bdf5c687c030f575e80233f3f802c6d72b040f451771b9005a8f4da08b153dbcebf1e9bf14099ae15245d408f42e3196a28b6ae8ab6f242cdb7f23b0a67e0ecbc9756b38a5c32c40ecc120a229d4ef618eead86a39f5cd70ec99ac88fac2ed092c0601d153ae4d24093d66d910067ea368bbf4f6720e874282320614dde2352039d6a40b394c5a2d15fa00030cabbbeef0792d0d3cb7dd5dbd76dcf411ceea06948c5dc42e7a21e89c78f6dcc03688fabb2dbee392eb4aecb1988cad46a4505785758b762865ca03bd7dfea22fc19e83e584899b1aee47f509bacf994621e910447f89816065b3b976da272973a5a4b9acdf9087f2fd69b962f743e0f2bbc958c8d832f94400703662e2ea538149f413baf7d3e42b50d9d4acd8e2e12a2d7b1914dddd108f0e08d1bc0ef663179ea01b98e476e4e71ca7a54ecc6398666552f6fa6faeb19178c2927741d3de697f273fe5da558a281d245c3b68a25e395dad0c7b1d8ab4d731db6273dd1c535215f130e043ef491dfa4ae25cef994fc538b2259ebe67d +shared_secret: 19599e218264837d06839b6cb9a09af3bc4cdc78f7d9c00fe030ee92ba3bd54c + +# Official test vector 36, seed: "ee762f5c9021c36446706a88ef16312f4a12c725cd7afff1484337c91eda8e89f7007f3705747d29907b3fb7500e5074" +entropy: 38c89bbe7145c29e9a831c11431eb9929cb24fb4992db20737e4687d397fd732 +public_key = 00264fbcf666abba49136b6e6ca0ac8636bb20d305bca62bdef6301aa51899d7341147b72c210afee6a3294a4ac8685b1b6003eafb7e94d91fd958b5c3944129198bf02a2e9491491a2bad9375cd9f184aab285e91c877884b101511775cb31f2a2a3e7337406d7662c8d8c83c1933f0e27b8b2b39b1aa8897440ea5142f22b218c77c664092996e39237f577139014da6da6870d848cf98b006c9633ff138323261e1d042ea645e60813c11f9489714c197607e568c8045f0244ff40fb86634dd469033456604f19255645898181cdb830c1a82c4eb1373ba820515b6a44596342ac8b912c217603cc92b8a2b52caa29972bc95ab334a93307d7b9aee013b22118eabb947b1a23150481fa1e7b9146b9ef5fabe9debc682003eed2534d9614d90466c80a73fab8b94d187a383463e7f6a380d1b34ae5473f58167e97794767a20bce5b6d5dca88b35695e0a2baee03abd55ba0fe768a8254d40836233fab358842675508302a337840167dee53eb3ccb531a7637dd1b9dac9a00432268002165f72a5aad8ccc7131ccdb1c986a7b29bd89311099fa3e9460553900e51560364bf9af461f1487cd9f0adeff5079b07240870c310ac4702e113f68433981242c153c49c43cd93493b52395b5db073ec936f3518b7f6954426b9757476cc1bd0c4ff870a2124a8f8daa3299ac21178235c260a018c169d083cf40842bb6a0f2d407861106b4e752091dacbb85677fabcbe180abdc6235d0e8c34737a5934f431afa670d000166f6c5e4516174a205f4bb6182bb24a54907be5360cb81b5333a937c4e40ff2579b0039c0ba3374664859e376a8515b390bb46acfb54bbd4aa6daab1dfdd44c712b311798c71e162f36f562017821cc96227cc431ffbc3634acc704937187b8200d9bcbb0c25df359c386e740195662ae24cbb24b181a23a2b4cb5e3a767701d3a80f7bb82133be97daa38a706c7e2949ce86587246bd5fabc774956019c2247f5748f0988087159d42b8c6b1aaa398879c77e32b0a5494926588dc537fe1f05a10741fd8814f191cbdc50cb2a0ba1ec053a789396208415c77c18d283510f410a722a187cfc552f63159648317ed696695413ec894ab80f4c106d73933e312996b23f073bdb9625727d8c0ff1818d9f78b91c4a6c33075f9a91b772138cbf6861937c53aca7b535baacd2bceec96223ba7747b4a7d50c36d3cb0297967cc447c3bffbbb723455e421ccfd791c48f8ba558692e2ce278dd351e28d35ec1039f16d8281bc0867d529ffa6544b1663a14b6843fd85feea2b00e3c8b2131bbaab0b2161493caab5464501ff6e30074a372dc6a905b9a1a66b637365b48af4b55e45ac4236781b71b130718941f06c17d84786bf1a033b60da7c6b0d4d385f3f323dbea84c0bb8fa720569d1959473b1af84459c0ec4ef133c0688323fe8503069bc15cbb391ba7041e665f652880ee367c97f34e7230009fc401d7a34b536529ef544233761bd2a01a9da338a215492252906f979290202e5c666bb31a74feb13b05cbbb341076674c02567c80531c5573fc6428b8ceddf3ae84b8bb7018a3ffb02906770c4528c73360a867c2701158927eb5a9fac60a2f401affc4c65198b4a5e1439001d5882496fa682185d21aa4ef95ac3eb5e675c7a4a4426f93 +result: pass +ciphertext: 4730cd50dd082c8820ede968a7cfab0842f632a65a08757c67f05a01151cebd03e259aa45b446ee30753954b5c86240a0870440dc76badd33119e19a2d487f20499a48202362501ae0a106232ba9ea21b363066ec8886f8518080d736444f30e109c0354f17507e1074f7b608f16e814d76424647921aed1253dacd39e55abfca8ae74b25807cdca3b76d5fdefeb2a717ed54283022c607a22c419e236a971f96f075a7f6e46f07835732c2f9b3b32e722880b5d942c658ac72257dd0ac7cf6bc85ddf096971982a8ea480d8a7629b4b9c060c3ee287695ce0ffe1d26c385c7306044bdaad1c921fee6f93bfaf998b16fe9664a610f806b2ea0e7de8706bc1787ae6018584178893da14fffc1c99f03e8a9f54a2af50b8720f6f79be74dbfdc53324dc94e081a8c438f04a9742c0c2b1162c378a410df2be9d340f0719bca11c78dc23720a23718c1def9c31e96dd8f0d9503e43119b63390cad03fcd3d64a10130538b2cbcc9b786ae5c509b7d754a49e6784a8e66d0b80edc4a62aa5d7a6bf3a015e7df99e4f415f66b5aebb9035ee22255f2bacd84030a5128fdfa3a8343e6f84585eb47d30910f4e05f57e39230478a96f9e10920c0ad90fd32593932637f208c312e33cfa96dc2b7d3650570b7e3846727b5214ffc6c9eeab17e7343d9105a26df4bca08c6a0f28594c708c6281d7f34655370216eef77225b5ed78d4bdc303d5974a6fa92a9a75b12648f57f6f7feb9cfe8449c763138540f97c0339b52aa3c100421ca0094591a4e8a2af4fccef6ecd91b3822893e49f00a46bc53ce23eb05d489a4af115dd71a8e2eca292279b05c143cf877dc4bcce9fe75df54e39741d5d4d6a0aa594b2be511ae748ab03c9edfb8f46d6bf2a214b2d6f3d1da9f73ecfcaf564a231ae7f629b4236b52864366ea34bf23c295a921501db8f92d16c40f9651d8df6318ffc0d6f4b840f27bcc736d2e2494e65e81e1982df9d279440abc8b01108f5c92bc2655fd3d0ab0743baafcb19ac5108ec02e00af9fddb6301d9fccf2dae17152d1c06a43cc69bdce862d0a4f1290fdcfe857017c6e5802dc55c1ce2f999728df46144a55a18e54bcbe982465c8b0077dd93679363b56382a7ad1b8021a296ac90fc5fd403233397ec72d0ab74ce0ea77ca2f39cbdaa5aebc968130aaa519b0b80a141b65b3652824afb69185ad70c99e236af977f56b8e20b8401d13896b20d845270f21ff7ec1c0a86c79e4e15450ac94f18cd62e814a44d076dd7d3868a54412deb45b047aa71a9e596e385fe0cf77afa64c665c81935737e755cbaacf4ede409cbc858d63e32b004138234e294ff7cc01e637c54e719782c75cb95fda6ef4d86aa4e317745678370c76e47ecb77bbefc1a2e92a783c3d64f01f9b6d0bae50d15534bb98885562ddcf9738c9f08b4dcadef59fa856d9090a64627784dc670f03113d29a7f95a7b6162bcee928a5da0da186c7e13ae83e8e1a63bd168c3019aa59bea63cf967e2a17f2b937737c39efdf078273ff00c09f3 +shared_secret: dc5f3931026bcedd2f57b65601f683895c365862d28a65356e94049773de2ae0 + +# Official test vector 37, seed: "d882ba69ac8bbc88715f1c6387531f53273a5dab87e66faa8221a7f628d2bdeee1cbc59c0e08d0add84520a3a70c1389" +entropy: b2c35e33c72d90182791f0e12a0324f5b216efcab2c8da1bee025dfbe13f4152 +public_key = 869719ce20c5abaccd8889286f2a77b388a58ebb7c53e79619762ae5111b6f352192288128a83202005adcf0b15c0640f2b84d2ed58ee806bd4fa22ad26c5c8eb9a035768951a579f8facd48428e508abecd418617fa5901fbbdacb6b539c148af327823009e86fa49b96c42d8ec5accecc423fc979c475fc9c63696c21d206301e9d54ad1088be167af34c57facc25d4bb49ba5677842e27c1fa666b0659c66dc412de949980ca6a707a0c21976822579a0fb1d697892fc87251354a17f630271cb3b10f5c578777a990361b467c1374897675748f763619e065104a31999a765815ca7a22103f3631879b790a862450c69af8d29c0f9a48e8dda82f2c03c0e12b62484c4ee35002848b030e41dcf1084b1f70d405677a059774e322c7b72265e32810e761d82956cc0194257f31157928b786b6fb6011a130620d2f51678d27de0965465d445e6777660865df9e73bc6858fa8155bf5cb4bf9c23527340c32211009144fe456950694b656a2a30c55647d17cfa1856981867aeb82af63f1525c31cf643b32ea822b2f389ad4255838a2bc2ff850cbbca834c87f9fba1c05ba251acaad9ad99075920653d29d94c399cc4a2e4c7a871e176a275b7ac0a4401d36b35113595d51b92ccb8618f3ca40b4900774a784644973477dd492c66d09ba9b074c3d0347dafa08dbe43a9b890f62a5b9caa996f9e362b9a2103942cb91915ce8e390af54a2578227a9389e922b9c382907853ba05eb13e7f03c079301db2135d95c934da5784cb05b9726a1c1e28b01f5c5edba7a340053ea51c32d0930653f46170025204c0adf94c2075631c55790895495f23ea104a60b88c8b627db4256b6892d1b7886f959a18ac238aea494e45aaefd72056f362e7f34ec5e20e9c9aaf2efa8683970e310390a620264ec1ac3af515c24409ef4a4b99d0725de1506c706303e2848e2904f8c4824260162e5392b5b0595d699357b190e237ce1e3692ed95b7710488ad285c04db243eea475520605cb98b98a1cc893a7f1d7492f038795da03f63a91ec925a914b3c1fd9a3b5a74bea6b6770a5b1400348f7002555ba8c9c95b88cd829eb179472245228c21afa2d39238c76cde000898b718884ac8108c06e81c02f264bb6c9c5c13081c09d431aae78a26d62fbd041f32fbc012d0c83fb9450448cfcdd8cf881036ac096396e311e923478c5a346cf5c930d01c84b04400b38759a18d3ba40e46c8af5f133258f353aaacbfa68b0bfe206bf7fa65b192a4798a0faa68b2574725dfb69ff108b7c155cf77426ef8a776f0455bcea85ffb91a74f7203bdc2a9d0096fe7ab57ebb4cf1dea1ca0c5c4f9e264d2d5a0fb64658bb3b1ccc93ea5814407b6c865bc2b2fa14311ca50016b782716841bf89474c10e182aa51c0416580769312419d1219261a548ef0aad81159e4be73bda9c8903b7a4955456a3a8b405a27c18968901d54f8a0ca16e41aa1d0c128edc33b069a1c1e4b22438beb74a996c8b30c1717f07092c46402b1d9b710c46540ab32f38381c95b7445704461c0589cb427606057c78f911fc72ba38d1b664767df30901b148b1d609601bec3e40e41136ea9edac60f1f097c49906f105c99c4b069d5325baf3e6882dfda254850ba1ae5ca738086b4bb3c91df05c11c1acb67a98d +result: pass +ciphertext: 3f7f9fa76b2379cecbbfad6321d4d1616ae26488263ba56a63acfa042d737d74212b3522f42d3981ce88d95a3de3480c6e5ab26ab2fb12a6a3abbfd75505e1b7aa5b2311cc5d0b8a2dcce7631627efc9d18c571d72622e50be2ab8b9547e1162889febd65313a588def911d4f923d9747e08ba53cc7fd9e56e91e6f4c1d4b9b164a60950286d0026267920c52a33468ee15ee508a24a390a8daafe40fe5249c6a6640354df8a60e9639bd1cfcff471e3fa9baaba6b6bd1d82efea49cf089b4a7e488b5783a8b4f575bce13109fa9d95ae542b1e5c6b5ff4bfcaa17a84424856ebc2ca2d7b5736830cf35909bad723ac2c8096dd79cdb3e642d0c6a21f0b37bdfd72f0f4594bb309f4dd83dbaffb441f3dc9889a6d4132fc7e8b4186fc71d05efac20b3f994e0063575f62b5afa6bfefecaaf19785383b45f265dfc36a0fbddb402811a214e104d7a22f38d26f6505f70f2da88fc6150d914706f699bca9b56457d401b74f248f00221c7cc7dc92989b3cf331be103e4334a7ddeaa17c9f48546c04e7d0663681d1106a8260aeb63f0d9d670b56c00b62235683842294fd2dc934aed767db150f6529eb8f908a3fd7fdefbd02b960c05279da4c7cee95a81b90bae522735cedaefd3aef318107986d1b73977e254c6397b1bba132f52bd7ee7015648745320b8e9955be4be6e7e49b481ada501c814172b47b584dc538f5c6cc2c1fb83e8f8ce6efb68e34e9b15609a42995cfb06c46eb49f0422eb3b7e1a16700fdd9f1d5610a05d3503cf18eadb4c49d9ec571c485402a60c6bca3ba36549934217ed1aa770f6e68189fd81d852ae00d6b1e7f03cbb6e07d010b65a22be0c8228d9279e53ccd3147642d9f9bf57f177af63b332cf9ca0541362dcf20ec19f66b57b4b55292111360a3d8df17e135f4546d920b6997b2da5d42c20768dfccc4d3b813fc8ef8fb4e8c46d4d579e7ed6a94a112b0da4121ce3f0d71676c96f00bbb44b55c302af407eea78fdc94397638645bce49c7b71b0a54bdfba6764bed0961a5d7446898099d8ba071bd0814cdd020880b2b24f1b07ca235a425a7eef0c7fc13b2767884b247b89b1e07f08bb91b49399167b423e77323e8555bc8e5852cbe69b323e70094d7d80dc8442089c87d81fc401a1dd1154ebe49be3a313b8b2e870375e5dc12fd09efaffdaa4104228bfac5a8f2feaf02e6e2e4d786e687d55af881a0970b460c0dfc11861ea4279379540db02b8efaf12279656a876f758a7d1b45217e9290147392aad801413d1f36b3b0e7987adf276ee4591aba78fc994282e4eb85f7f733c4bb96c45912fcb43271274db783ab639edba155370548a0a4cf56cc910c93ba3fee673f6538a61ad5448cd6d43ee8e3b66f023a3b1ce3d6291b29d6b302a967956f9cdb4e09d4d5a91c0665a042df477b7ad48628bbf63ac726adcedad5e10bcb3bee5591ebc3567e2738a0d8048c9a2709bb2d158244c562c82342a5e44abe7fbb4e5ec8345404ae4b7f5260b7ab429e085b0a1ddc13dded2 +shared_secret: 7dbfce1fc7d937884e7b3fa7c8eaadb37e1663f77d7c8659b8f43abadf16cba8 + +# Official test vector 38, seed: "6c3aff39f5d097096d882f24717718c8a702382dc4aaffd7629763fda73c163cf084807bbb0c9f600cd31a7135f48aec" +entropy: afb7d6dc2b7eb6d84acc080c1be63c98afe7b07786b5801f716444a3e8e64800 +public_key = fe04b19e38680e8b5f005167b4ccbd4bc2a87c3a98d2b2af18738b8b44b1ff480ad69183c828bd372a4a3ce12ce72867a886733f3bade4144ab55b63be2902aef88ab4e129551540e8390357631233eccf23a0668886b39942c23f902265a84a08b07d11b85c096512c09ac3c82023f23aaf48578bca4b50426713c7e5270980c78c6643ef615c2b6ab57b98111a321e30d8a38b5a376f9a2c793ba196e293fde201ba7261e222080d951b4f249a47da98c2aa4b87e165de574efda9577dc815c847ad269210970975d8322645246cfcfb46a194a9b3cb2b91a20fd9107948d8777d0a14d6187c922a5beed80600991f3040643480286a580e932032a37b8c82833535f721edf44e97397e14931cf7f49201d80b75d650f204bd37416c643ba725d2b3b4f368b033589e01cdc10ccfe264a6efe01ecd3b8e92478bfd7c1abba973459346798007990a9edf57b081c73d699b7a758a6013106597ab803870c24e4c2e0d649dea9bc0e0fbc742571b7b6bcca714881db2597c3a45cf0794022b58985a61d582aa59b17e9c567e4b4268976943982705f389566f53c49526ab6c210f4e694544d307d2c8612d1ccc23658127e8b071e58136734082616ed011397bb781896953c73b5127b28437f38c27d663b05745d3fa37e9c2a07dba767f0859e7a30e9d48cce5f37632e817060ca46633c9b4f6735c3bcbb9185abf39ba9ad600718c6fb84b7c7b867b5e5c51c0b0cdb03cc83b49568a4a02ad831fc93157a4e5010ba81c0b6bb34afb908a77b2e8d106f752c39ac1a00a9467d58484bd273733947a619439576a98b4360811c97e73431901978d295148bb991433ac72b4cc3e5cac2a8f68ac9d9a3f5d53889343af7e6b02316831b7208939a88e613c0ec5d07861099488b08deaeb2cd295b6977c7c9b2630cdaa5b0a93ab7d98728b3ccec979b869d506b9c679ecb673b7d83df908aa58603275a36291ca60fb717b74406ec852b802eacf4ec3c2533315240624b5b7a8ec960ebeb04d970cb815fb059c458d02254fe8564f154a8c240086fd98ab6a4a4510fab5205a99ab873f3ec29b603a660061b8eb803b6e71740ef174db09bd6c3447197765a0907d31fb1635435601b0a8337972263857f301ae5cf56a23dccfa392020bc84e79aa6a37450389a616f6e626e001592f7a71fd00ad82f3ac9d1979e83955bcd1248e7c9f5245a22bd26479caca02f70303b8c978187f102bb949b7a709e94fc2069489601c2752222da41090578edfc1083e0a8bc9110b0e64623e320f0bc56c4f2b2bef38452ac7c2e17c5a72166a48d55ce5d3abca1a98d6eacf734249e8820e29721931faaebc3abc1a7453b5b01b52a27284995df4f07a3827bd9567cc31b2bb08825046226e059b52bf8b0f864793926b461574b73198b6b4a128f19607bf1205380127e6597ea4b099eba13b38fa376177cf8d090881a20164d804320469b15988759025f5089d7b98675d554ce4714c124c1c30775cff79229b1b99e4206cbf28bab4017077d4721c263542ea1742ac45cc500d327a3da9c46309ba09742305b25390c50abae20b6e8c8b3ae0208aade68d9e2004bd0c26d21c8096cb97a1a2ab02548ab8f1be5fdea37e49857c092ebd421eabeaf7d76beea2feb7cff7d2376a329549 +result: pass +ciphertext: f9b34462ce03476f877e2fa98f7434d7ea6a0fc46495f492e331440aa092a8028b6b3e06fb857eb5eee420bad25e0d46652a7d57b7ecdac38dc83f1a6a863cb76a0f9e3ea1ea69c2cda8c76598566448d2359adb3e02f7c8ef17899d9fcac8f7e20721b646615691081e40f533b73bd1c8dc047d48098d68d1aa5727c859f599c0aa14de4034d2a71c45a58c7d546724b4176682e3ddfbdfeec5aef0b4b3a82b3f8966b140e7c55ccd7ad877abea237aa7537388dea3d6dd4fdaf389e1d1248234ee6f49b6bc78c33dc3186e461276be65dee9cc8c4f2b47ab42ed9555ad5f1318c93bacbb25040b66157a3ae1f2db69a8f38ce29a4673083dcefce7473ab8625b4e9ef06c2b8e2861e758b6061595231a234a5d3a5ec49f65e8b3426e39bd5f6c530f8966cb915c31f289bf80c6a4b75920c0c4885bc4916e77e57c40595760aa826668175738d140a1e9078ce650b8e18788fd9bfd5707038f43d44d08de4fa353f7d88737326b3e2b73e3a3188ec09ee52823c6e6af1b02f3097e8993281eeb6a7ad1d8968f8d6bf9b65ec20c0d09d4835f8bd76296f63fa0dca647dfe3e774c834383da48e6fa581e2aec974e26c91cc3f9dbba60ad9d9644fc2e63da59cdac87b56f4725ece40c0045d0db183f966385d8e330b480dce5ed8332257e3fb21c1cb6c24219e7a082e9f7088bcbbd4ffdedcd3cc492477f223e73fef322ea05fcfe14e9371aad6a8032f819cf2dea992c9b591f2bc10c8f9c6199bb07fcbbeeb6866dc6b590a630341255c73c7d3f9122bdc29b548fe4a8c570dfa63cbf0904a1e7753fdd7fc0ba63e5354c00d2b80724f015f7971ec272bac080ac459635950613a02b96d6e1a1e2455e0cb11fed44d28e6d7551e4ebbdc5a64588bd80834e391e3ec77e034499f53a23e4d675242158263b105fad406545298c26e17b26505583b3653b873199cfc9f5a7fd411a4f6fb0957cfa1fed917d94d46a977784badddcae2f6387e9139712dba33246c34724cc922369f3403c0c9ef00a1df5a4a82f22868fdd2415ac1597a1ad54587b20b3067b01b681b1ec6e4c019117bfd1d5a09e37ed83c3023f3b57bd420532b7048d02b92f1b3ea97997a90b78634c4cef2491505210113bee290011a73b662d922cd3ae2daa62bb4cb096a1f66dc83fb72ef4f4c5f96e94fa69b5722cc7b07b7a661b5802f22f6785d35c4fc969b7bbff0906af3a7b8c0908e73af5cb24e5c5e61fee36edf4ad46d44fb96c810738ca2098112d00da86248c251c56d9a2306ff33c8a6feb46e082b3507426f58f8b129c3cdae9c8f5fb05552b215dd90b0f8f2f33cbd2b99293a4f4867365a77234ea178ab1a8d1f7ff3396a251e22e9eb200c2acfc37422f4c81e7a1fd1c7761280ec136c65358226be94d0d62146f5fbaa6859de1ada3e7026f42f36f3a71260e2045036316bab93387ead34818059759354b15e5d3a5a0429b03c0a78ddce1be68ea7e4d3e6b79b49c925d3410569e903533880d2729075d5831ec38b8c6402c978 +shared_secret: 09f64cee1af4d8738ab149d34a106ea7b19ac43e5a2536defe689824409050ba + +# Official test vector 39, seed: "cf520b92a2e3677afd003ec1ec6ef136a709d78f828c9c0dd4946efbd451c5faabfc83ca66f9d3d17ee4220553b7a69f" +entropy: 28f5e9dbda122b2cf8f3754fe9e0c73a84ad4b0c093522e0b62cf815d60bbc3c +public_key = 57c8b4dd8ab3b7e3203f2358221c9cc0f2a671ac1846e59b3d5c95576806b571c64746bd4bd541d4c55128b9a7d5208960a2b74a900a426013f6b48fe7fa1adcba5ec1e44594d3850c1a90e2a6bb341210039b48224b97efc62583f5882c71505a96284cc7cbe9873215697ba688546d3a6f97729b22251f479ab3f92cb08fcc3a9d962a661c6150ec6dfdc7560986bf808b4504ea2d44d595a8c34f4a564147cb798fdb6836cb448ca857d5d08242e233e3826797a4191e53cee0b375d395cefad91a395527ed094daff389a198c9d3b28b9e42b002fab4aef17b3089885e8017c047c35152a0e2709cccd7bf4d4a081d3160ebbc3d7a3ba977e221fea55e01823f2f61bfbeb9388d04103fa0c3330770c5ea5a882b26d14c4266b27722f29863b60c9f6984a5f0c2ee8b6f27385933994d8f9973728c5be6898012e4766d842cd1d7b360e415286c965b0b5277a5a1c5f731dd085df0f9579a31b5920227f238c389a723f8c31ea1c45afcfb6a62e555b0b2b766e78889dbc7a8a174fec48e328b4411338b26074002261e3c19c575b42f5a09a268b223aea813706900e785c3a05a98a5708d083c5e6243872ad78f3b456173267d61d57b2f330d01f7be8cac65b1ca46d8492f39c83338d92f3ea9a3cc7b502b115d5a7700e5885f264c384aa36ff52ba08ffa3eee17531915baabb5c9c04033aa091c36a0c5e99aaf0fa446a945a6fa281750bcbcf8e6666c799a43780b4024b97a6a0b14d9722856838d00890b9a982eba53f8254072f07ec00748a61ca18b0b516076382a9a52eb19ad329bbb81534da023cb03e00cb65046615c2d41e24d6e8ca6da872d46a1181133662735c6e382a615707e3d8aa89d49801f7908262c9ba7f1a49cd3c1ce9a5344f5b3df38bf82121cc9d4284da0c662d8b74ca9470051524ad108a2756bad834a1b1b2f5c01b29d640ad11c70643c0553721504ca90edd32cb4c693fd451564a1ca80f447378423888b3a2d30022997281aaccb939b0bf2f5643b036596983768758ac6b97da4843e9d8183633a65e35cc669592ba3a73e0213489ff186cbc66b8fc49fd2916322b30a6f2cc89e42715a8722c672c246822938b32ca6c47f05c21f9da66fb457206e7b58dda0a7f28b93ce24cd182b068cb951c5b29cfe1c30eb226a81bc06629133fa0a590de985e680550dc370108a7519a0b9da5b06170bc8a647c408477333e63972a7452cac811ef60cce2b8af8cc43b848cdddd7168b01ab9d138270604671d0ce57d94481eb1361d9a7f1c5906a11cb80f6454a2c358ad27086a5214dba5c5f69b003d9856831a8c13b9c28c7087efb8cd7247853b1a9c50b70d5e086a4e48ec77c8c6f4a83a11421ba4b0871692477a6b38f68c004f4beb011a137813ac02ccfe7b73271262fff16227da310aff06a8d23938444436da66d7ec6144ab44edd1322b27179901c3c1703279fc86163f804136a13cc925e47901514da5f7c68a23b23347d2b78ecb07ab4d81420662633b8a07d686aea3bb8edb04da7d2616efb147049c45e2a0deb0c85260862d4d25b47932b54487d6396c7f94193e40483c928460eb6b9b4349e1e4c0bd180111a72246c4bc20377a7059faffaeb0f304a1a64398249b1e8626fd1aa24ae11f67a7f23fdcaeb349484 +result: pass +ciphertext: 4e5a2814271daf633f5cf2f7a4b26ece3a9998020112ece4c2efc9d01de963e605fc366991cb0c46436a68f6ea28ff6b0f9c18f8a2963331cab1592a83a6bb207f4f12f5bf94f6939621c7540ee98418c66564c19922fd1d7d415f1dba2b738f6377e817848069d244c1efb59c971371cbea78c984ea42bb349ce3d47d4e66ab331e88e19602c79c0532df342cb3aac8c739f61c312e9e422357f497a91d02ec21fb79bc101b9933a6d214dc51c90c18a63077c083fd96eb09a8cc8cd240a273544714c2f12c05c0a3314fa08bdcd97276057c3f069b0c1169aea46f7c0c4d3af3ce46fc6f1a268cba433bf377800425f1cb9f2a3f67f3b6a6100f1f0b167982fb302040ec69517c9629b68328b52aa8bdd7ca7062a1f8e11e60a1ac034900bca5b84d956d92405d6b283dccbaa3297d1a760c7a5c9082938f641dbe982e14beb805d51157d1de7486f96b03fe194b25acf9222c8b86d99fbc75013ce126edcd4f51d846e2a883683f71aba14fec24476172eafaa0f4fbae56be9c14e23e913b9d60a7fbe6eb0ed093b0e2c67a61d1f160aee58f554d5d4a08e8d177b5c1df199cbc09d9e3a9bd0ffde82a7d4aa5bd638a008ca0b9036b245646e48f15ba54f6343c959f1008b5bd90465a74b7380ece0c60ba7f4f0ea683fd66442ac6e80593cff95903333bc32c5bd33cc380c0baab1ca1cbf993055140b3d15505d4598e3f0a51ab3936bb7b8188abff6b1700d4c324eb1c6442744161de85cbc43ba2a5afbc61ef8f64d50f0dab7dd7f35742d8646555bd6cf727772bdac602e4315920f825d0207be79a56390ee39226757a18ae0e68260b3f656873d518ea8e4e2bb3dbc6cefe02153378303caae4cdf13f29adffd9bf703e45cc7dba84f06e94b89b34d744a5d6e754e52e6cdc899fb7df29dff3e2842b5a3c1734f2280a01a61f4719e33f2a44218b603886a2bac8f97d3a43289e622b655351ea13f61395d96c6770d2067f7e2c3d50a9b45542747096177908fe2fc903f65c9c7653e95ecf39266de08293ced88484c95773772009ebebcf935cc894e45579372971f512646949edfdbba20dbfc8cd96605e8387b8fcaa452482a36ac052fafd5a6b9de4b7565cb0eb3e96f2164a066be4aff7cbfa5528d1ce00f3f7100e9e4cb195a6d714992476e0b7c28ca7397076939bb4d25742d1d81c64f23e7dc7ac129a094c7a0570a7720189ff9ad0c1b627c467d8ae30a094a84cc93ff199bbf2679b13532f08308c35e6ce0579e27f0a8eee34af2c4d8db0caf056566b4fe655d36a4db8daa7f2a7e5da5470118c6815673ccbbf05c221e1643d63c25ff88faf8659e03e5c0ceb7ab91cc3ebf954c7306740d0af9ebb61f03fed6e1756162764b342377e1e779a40d6dd68207c11f4297a791562d635251a3703cff46075e4bf384e657f1c32ec70764706835eba6628c708a6c8165ff624deb8baa4fae06c71171897cccec55ff89eff6cb72ffbb4db07e009b44f4762d41fed92589f7ed6b1730c3a350cb544dd95 +shared_secret: 7104fe381d6d7995b4d550278a66a719b9e79d9bdc38fb0bb60212c4355cc520 + +# Official test vector 40, seed: "197e5d562de7e01bed4fc597db28dc6efdf0179f3a5bda5f94caa39d67bae730540534d59a7a06c8448f628da8b7859f" +entropy: b0d713cbef0bb1df70cbb425d1e9373e9f7790fdc7980cc96a240dfc53f1e8e2 +public_key = f784b4d0a3b69a60403f5b9c4aa3808d7b832ab9939b2a5cd15bb36ba710f13c934f0b5dc5f125b4c4604d330608c0c608f14795f690d21ab54bb9a0ed443601f821b3c153dda33f6b102193a2343bbac83b938e521676ea2a20bad2b515c13bdba9c7efa9b8b460a8cfd6a54841bb306819b2ba7adc5b93951653c6d116c86c302e067b358631259012f1d230b892c393652fe9d778e755bb1d8bcb840c51eb93371c2cb377da1f0a33c13aa4aec4c9b79f492ebe34906b6777aba1470787bce5ecc92f494377555685e32b6d52afd230464469adda074d5a159a54e3493a3364d7443d81449006f0b88669b8f507493dfb67b1f012037438437982c868362c172556989272c8b338b8a56ac0af290c3be991c5b552b77a370c026b1c7b4044499036dff32c06bb4b1b73b66d2644d0709f59050fbdc62b36e7977a7278fdb26798d264241914391c71ae928d5c7c7800fca963f4a5ecd9ad5b1590bc941909e142be1c382d7a38b123cc23aa02c9273b5f377d97637091db6455447574bb0f26a250c63a6aedf6ce4ef9cc1c86424b226b06da65158114fdf2bca1c457f68248fea0ba9576bdfc380e45781bef85bfc87ace9f6b5c6f5805bc3403b9e9a86503396b109d2ca2916e16bc4c7a9c47270b77db678a724bb9e461e2f3adcad69ab78a60cbc52134a7557afa452eb758d4c357af310247f2b61db9c2edbb126d7284f38829861870bb494fc65b8b16d97cc5c9150d4c4318ec698cc5704f8011b19037232b1e337911565382450a4afdb8c8e07a7b4127a7d6d630c74098b528aa9cea5249a6a424536a6003787b7723027bc8dfd07b9519337d5125b8bb631502701ae2bb9c352a3407cb3903a617303a5c29cdce23c4ed747eb56bae79084ad705041ad27cc7441dd8d51ac4f5be1c594019143f41c56cf9b1773ee0cf9f116036aa65896420f82406c1b36009e12433e60993b691bf9295ba6621bec9060c82bd3d8c75d2014cb774a3eb8c8c7e698069437155da058aa4a6831c6cd0b47fb425c4f85c5481282107d4b5c61756dd3235ba61a95608404c11546a28c0191c5bf8473135a98c582608bf7c4a1387bcd92b449f888c6b9990a59725ea9c896fc58288c5905bd8ad06a80ac952106d42b298377a0da30db7f68df4119edf5b45d472c3b11c85ca1439d2ea0f074899c3155a51f26af1f52265553e2136ae3a69b529767549f146ecc6592a4448918a892af6a895a27a64480546db66c42b8a9dd029fcb2bfc14189974531c37405812295e0e85c2c44620bbac2b5376463a0490f628ba67c7bb7257bca690ce4fbae57b717423abe164a43ece7b30fc768779c5a82d3265b7a0d012383b1d8a6967a33969a5d368bbf5ca6137959093c9b321539236278043112c8ec819e1d9b532f5c7ad7506ab9c31cf2f4b95f978cf642b67b2995c8f56c272775023a438845ca46a6858b32201ca14f1bc19761452a0a6a2b6ae4bde620cd8685a89bd02f64eb51d7bb5d29e71f009a79bd060273ebc51a48bfb575afebb57215aa0fdbdc0d0ad91120d3799c8843d50068363b5c47b09572623d7ad8071ea1424799c1eaa7165343af0e808afcb39f5cc8a7f5e14bd573052725185dbcc71968200bd272d97f676c08e4a6053f4e0a7071d7abe99607e757 +result: pass +ciphertext: 9be30498fa5f736eef8c48562cc8232b5d16a725fc6ee4d5021ee5440eb211f690d413b3a7f6721b79839c1ccdff5fd07d92372a5a057c9e3689412134e4cfd35bc484d0d157f8b1009594733f8c4ecf3473a752bcd6ba449e4bf9ca2d768563d79749f251d2269a40f627e52be1b5ef09a1d45d1e5c3c01583085b45e637849c5cc0ee698c728682116c835bacd91c865a8010471786a23ac73548866d3429736880ddc0c0f9c3d840c9d46cf9fabcf9f8914967288b442ee741b9ab70064a3a3832f64397cf2b66aff37582c3098014205f219681f1c243b8c96125e8c6a9ca66de25bb74c5d725357cd08402834365061e76589eeb67b2008532bb264291b6e92adc1dc550533901c4aa17d5d8501365acb3c7d4dc219aa9ea089b4d4e859d258a6bdca93e9bd770a19a3727d98b3e7c64d2fe4915f5149a0ffd6beda15552b5b3316b40a9e4e91077e736cedb5edd7e9a1c55f7b4cf448d1f3902118ddd376187c67acaaa74323e57f367fa0bd800a5facc0689480f47b7c0e4a363aaf51c34b36b21e99f393263294b78eafa045d8b9a02920d51e7fd1feb3dd9572cf1061907e7147df40bf130326ff20812957de39e4fe68bad5536df9b14f4bccd8983ea0d6185b50bba47d74403916dda1b98183403d50c85ab2ea42268ff176346c2d8dac280638964f5ee4a4d13091a8abd8498eebaa3d3b9fe625040badf9730f46b1740b83e4cd71bf299a1d4ef738a3f45750327c2194ee42a6e4338350ca872e1a1c3499e11b34869b0a8b5c4ff91c485f6cc1814f41a28400d4eaa5dcd5c6097ce27dbcd200e8b016bef1fbd6ad51e29f3b677f66398f4a3d691a19e4871f497c0a89faff13b59f6041faa36493088766e8c11a30231b2de1080dd5efe323522418680f6ae888543a10ccb720a00c765104afab09806a2da4950b3eef4359f820244ec0864199450009e7cde716cafbd25d3a833cdeaa5f13a346f423752267b96a1d70c0af7cf8e30df4482438d95b73a82ae399a4e08bec89dcb80e948903daca79d347c9dca33c9efb30a8994a3428b255f4bc63ba1cb656c9ad148209aeb4024569922bd3cc7cbbeea34133b70cec836e53405b191855dc50bad0ee9e4ba62fb2750ad0d8d0671873212757ecfff10c479a805d52a7777c300350ec3cb4aff3f28660f1e0a7bc5c39d2fb0f944fd50c6c1f484ab01fb6eae7ac4cdfa9feb60734badae4eb075c7222382c559775229fff982ad0d64578b38a505442ee3add8a665c0c25c4d4e0d872f048c39a4e6bb1db711086b3db81d8ba2a39628a18a92a44c66628d966f11df04311a3fd13b2d1270bb59e0d377e69c169feaf8e0b74616e9caced4a296caa658c0389713d20153b162c1ebccb4e678261d22f095107471dedac0923efcf9935ea4a531211b0992fcdb24b2117513230d40943c3639d7613da960e54e5159df207b17a6e15d0bb4df2a491a9ecb56867be9334aebedaa93a1304d07282e100e3ea2855f6a1653f70c96a1495fbf78f2a7062c87b +shared_secret: 79b1ce19715dd0a74ada36d31f63f3242716890a66d6348232c914c8e5c4c499 + +# Official test vector 41, seed: "f170583cb451d8a45d105457c02c01a33a40350616ed8515bd49067142f61efb00f07857e4fff3fe11e7164c648c76ed" +entropy: 32bdcdb7059fe27f6409901980c080308951ffd90deffa8317b4d213a5f04495 +public_key = 8645bfe5dca2202ca92a9b07a6b33b49872ff21b1cd901020e4ac369fca24c00593be105483a24076cafff8220780c9bcc9150b3a65571fb426ec47a82974bb2a6ba13a13551d737e1ca2cfb50103e14269263caa5b15b16066ca63b867a250318fb7335babe4fd81a2ef56ce7b5beb88c65c2bc6c5a75149898a3d8a552cbfa6af1a463a19a071cb64280da48f3684d99e0b4adc7b48d039358f201a7baa1ffa4ae95fbb0d45776bf76523cd504a379377b740d26069e933748710a63781a23765a6659eb4718dac557a8553fd5be04230166782860a3012290b068542dab126a9f921aba2b61afd6958052baa7b24ac50cbf1f613abf761d3315692c49184cf3995cea8f161c86768714afd1185161b6da86c73a6b228b953dde1713108029d7a729811b85aa906f67978239c6b6f9f4a72656b9536b23691b27b3b2316176357c07b671eb562c41621c7552265914c500a21299b17dd258e2a04352b506138187611c19e7d8860741b110c57372a3be2be7a3b5a6c688390f06a5cdbaeb6dece153ce5181c8080e4f879fc063a68739032481c2cea4611291362165a63ef3c0f436230409c8e5e57c01651471694bb67729919920c6852bd78766a5f5c1b5db45c84ac14c764549b54d8b2404523b0c00052c5d3538cbc00bfd96b8034206714a645d447dc83844ee82c069f63b59587f53c3cb0047cfe63b4f6ef41513ac5194b91eab2a5ef4d7bc55e1762e9162f2fa009a9c437d2c93308ca411e8ad7f9c2a642636d5e89f93f5bdedeb78062032db389bb6fc77be489506a98022e83c9aa9b7bf65c561e1a8a95871e4ab1875535981466286175eed087e61ea034c9488fe953106aacb251c7fa044bafe474c2eb602cdb091687558c02778f4b562692349f9b132fb3a921f75a4ee6c33440ab76fa420bfb339e2f8c225bb85538cc4388522f9628aade183c1532baa778faf937035639a5367cc64c4c036fc25a61b4f85470402e85ebb245a43c92f2cfb0ca69879a0fccbff31a35f2b46c986c66386308fac63978534e5eccd137561a6b110d82a2328a90636b55b8d67337626115448ca7eda95a6d2740e33c6cba56a9f34a95a7bc8f304702e25315f81182e54b2656913939083c052664a9844535301fcb730dfc9c5571ba72f279a0412b98cf64c069b89acda010494498f92838e32c711f1712d8b34303b3d594681305b20d2f8ad43fb6598113415460a0326bbca4c1d658a1462aca2a619abcc5a61a99921ca82882e1569c3902769e208c61124e741630fea09ec58065b889890a667d25bad039c4846a77d17acb5e726b5717b00e0b3918fc767205028cc4b67cb29b49196b4dc288a3abcb112bba52f0cae6ef09cfbd74d939b73ee610f0afa6d8b345d3ee95749cb4373ca3f52f69ecd767893135e7dc4ba6d069c053b79fea0c69b5c1258609046c761c77322a9d4626de19df5543165958a447432d5237f399bb1b9a8923ca45521b21cc4b17d36e724f5a09772a7b8609c9c86140b03e8a10c54adc91204c686049a643db89b0c375a359c943d5961a803c6ad28512839f42326f53b22dc20455c843ad64753498e10145af06270a81213046196d2192d0ae3924f4dbffa093a9eb51025b31d268a74f44b849a4c408426071fe5e18c3ec8b5c4 +result: pass +ciphertext: 505762f4bb1982d5097e0f7a5bdc8da4d943a9f9cfb960077d0c303dd0424867038ff99fcace7860f6c593cdd50bc8760b9477cc5ad473619ef4d8d8058c88a267bcb5783a1edb74f5ea36cd39f8c6910061eaa927f7a1e84b51a1ce6e507eb45730724e422c92f61a3f8743a590197b16e6050f4101b6c6d22a12c8f1a8de5f0f6d7c5dbddb65c27e98957905ed7e55d6e51a46dbe462d9b90ff0fbedcdddc99914d3a282e09564b7206c83e0cae6560053a5ba1a83a024650154f91107abbebdb10f734dd54932a6fcfa73d58ee23cdb936d74c7e9cf31e9353b6db031439e8dac753189945a9116358b797610e845e958f827e7ca0aff758d0dd5acc8a890d0771ad7c470586595f54c1ee8f1c4ff867ea4042a227ed80ab49c17ea5d2089c7b27ef405706fc08351945e21f72d7e4fb32e26e3bc21eb99145e3e357e4a10de75f348f4303ad45a83dba56bdfe92857731d55cdfee03d647c5a4ecef35b2ff54857cf1a8fd7a9a244a95917ea87184390d6ce6858afcc22fdb3d53137fde169e0a5852487d4f3ea78fd9d295491ee6fb86cba9f2e1355519994126e1301882964465eabbe07697627a22819667e8079055b8a6fc5dc35e0629a1b74d64b1912ea7f902cb1459a38a0fd5a9773933e0a10619fbe281e0ff7169a791179057df38e5424dfe9cddaf545750c2269c64a465c39ae65d5249f742b66d32033ed35781a099b02c2b5b7201a7b7c2a4e00af0c724fb1d6dc695cf261b60d24ec5a3f028c53feb6c63ee90e424ee5e467f3a0d693564676dd8f2fff3c6d45d5d7f095e44b1b5fb43d65cfbc524b001b967cfc8f1d80a198756c2dc0aebf272f71a4fdf3c4e7857461d7b645a11835b8ba7dd5545ecb5cd71113119fc7432d73f816bc91c1506dc5b4fe1448bc7fffbfafe093cda411044211bf365790c20ac1808f8bd99ef833e29f052935f35ce8620c0e113eb4153db9ca285f31b5c62e09e34cd41b427113e99b4157ad2b6b6fc269b6b350b540962601fd7dac7f6199d08bab7851cc1b5ae954288368cee962af736ad7567ed9a961dc0fd5dd428fdf6286e7265421a2b05f2278a89773b5c77d2e52611d292336f3ef4c6cb230cc91cfbc0098a41d1504253bd378d617b9020d9259bc1288d43adf5cb135cfde2d47d55479f62241de834f10334022b877149b7dee20f2c8b66d35ce27d2d48ed1a9743517d3991c45a2831be582bfea1328a09ae200628d5a0a93157abfe9dfe08d41c1101aed8e1d8576a4187cde5bf5a940b6a756b5872d8b1ffa9a33061fea423ff3d9f0c7a5cadab5f9e9f6845774f112c931ed33f020ad45895133e2f1f2a31e894660df8dc6aa7b27b15f1e868c27308450b4f496cb46d2f45d4322cda850d09e37a20e225d8678d1d1bad2044801e02c13ce351a84197b529f917d0c41f45b02e95400046b2e78dbfff61c638030ae94ef4187ed77234f21d01891c4070b7d33ab61d46926dce9b56bbf7e37eb39036706a0773f6b4399a2368c1f70191c995e5533 +shared_secret: 66e872a4b3baa42bc3e8e4ee787ebe070a094f05d2a0792ae2ae60f8bd0ee0e7 + +# Official test vector 42, seed: "44a6774b2cac02dff210ff861a090561a453db311f47b6fedb81811872d5d9489f5fc4103010139ae53fcaed209dc9be" +entropy: 4ed7c92d83bd03b2a25b567f17ae55542e2f6a4308ec0f3fe69f8ba5ae24331b +public_key = 38724d9a8308ac6b70d1c87bfeb07775d56703980c9a563040d1ba17297b1f253afc339ddc11a42cbb051ba2722854cbf45bb80cecaa81ab63ce32acfe953f9ac8648b95be8668822060bafbc10b59e72944185a57f790351a20de6679328169b954465f8cc028558328f3baeca98e42404299719d205cb17c745a7784b97c09130e26376778a9330c99ed84288ec3955df4076d0c9f5847af05bc58352c1364f34b0213a3cd05b2d79108af038e457a30bb5626b1dc404605678ac675201c537a8a6ad67a8e3e0b17a0e8632ca1714dd341831b2790591c1f39c530288dc8448527fa542d64192e407f2304747ca7cad98986c59622b2e63e076420916635a538871aba5469f36a5536356d176265191fc150a4dc7349f07c932c053ef4b6bd245448ba8173ca0896e51092e06537d2157b0c1624d3a29eb0d055d48a038c858e53c1045c392d6f59408df2bb19b35a87737ef90b9fdcc380af6a1ea122838c673e39f502a08908ac33276b4297c712b3c7541c7806c71dc76e9291c89cfac3a56c9c94852ec4a47bf6642349b95f69c43005fbc927113288caa2cdd6175b2a627149027e3688b436c336b51c8539cec3c5537de5ca6955543f984c73005181e916317262bd638e249cc928e048a20045907b79c441cfebf0b9106c8847b8088b4c41fe6b7356d7947ae9a9549305c9278e6e3a39060854b88b65cf9a20266218864c94377a475c0822d454ad8fb42c50a13f1be65dce1728388a8d4a81b372a1486a86b0e6d1abd445559dd3b827b834e2ab3744c0c5abc51bcb7551cc888de7f590ef780d7cc94225830732f47b6ab4777261944cbb3e6d943eab827da40a7b00d8960db1810d028529449dde0c00eacbaa321c14249b7113ba43968b79070b9117dbab36b44f05022bf25a9ec77c7a396415c7f24ce5e364b09a16308472e1d49ce92a41d3b868e4664e93279467745b9e04c39bd67cf0226d198110e6235a3a35af970a73a3472027e1c7368c867d23cbc1895790f2478f807b756516acc4c7dae3a350f26a0353930f4c23c3d982fb90176bc70e0e6b739fb67aada24d10f2ac30685c2d7606fd6bce5df369a0d176fe32b0e0e8cbf583b0e2019167640fa63c23d7223259441152b0c79d9b2012725b6eac08ba8438cb90309123abe5980b6ce6889d6b7d1c756aa7a90181a1422f5a6f803b1e772891a61ca657175f7b815cb3549d3ee613deb001c7ba200730b2771b5743d80ee48683d94015ac7221671a3a711468f8b3be5ecbc1af824dfbbacf87972874e847b399280eb649304a3687f43dfd769e13a4964892b5e635c0a2216273331da5c5b18ec0b406ab1163d4179af5aac5fc8273296e2433c8fd993f9340c5d365070cb72715188b52cc0426146c54a3687f6a57f36b0b1dd639c505bef4c71fadc68d62009bc6b27b3817660df31faad06e86b91aad252b80461200168290848f963010511763f8614f202a3a05680831b8bde86a18dd79248d46c144730bc7b4757ac95f34ba2cf0436bda09cf5a9285e7c924f3b514695300c33cc6d92c280ff81e72b549694aa7aedb46afd394a2d5826e657897fc53285905406430c2b7786e64ba44225985f95146947535aae744a3b3707467701a8bbd99b938f2fc7737f22bcb9f146983a07f +result: pass +ciphertext: 8d02a5fd8b7945dd8e00b27e4c2ed63c4e5566b3b2cae2f068baf7e0f8b816261f56aa61f545d41e18d5cb2f4017c97cb3b15eae810a7f6b82967420212a1f4b794b45d8f79dfd8b2ff1c21b50274fc9030b707191cd1c5b8b519873a2e53ee6b74d9347911019654a3482b80d5e9f15c5e6560bb8f7c6b3a41ddd398b254dba5fdaf91a5d37fc1df8c8fba39f75bc780def00847d929dc8f283b2ed381660ca7848eaeba9b9ac0020952945e07a946b8a4bbbed8361031315c8c5180cf072d039b63f7320616fe35dc1edc4d52635bdfd392a6b01964e232b409ffed11144b61cfb7dd477c1dd0daec06ae58c5a4bc0e609fd35972949c93cbe0382f069a39fb478ecbfced5a059a151fa09df4e2e80b3cac95129d9f75d905cf122608ff06548ed6d9aafac2e21a94079f2efdd3e569bb12b1d3d9db82922e7ab0c9eb43a83df5bf18a1d315048267f5055f04c10e1afe3dd4b8c4483e0639c08c6410acbc2c63e7e0b7e4258575ce0c85aeb6961705bd86d4c95281212b21f84e71bcb4d1bc9307d5fe07d0d530c1f404c1f2ba4ccf6327549a0f98f7fb31ec5da2858d6b3ebe63d27b51a4e3e08a10351dd521fc39945fdf515ce419de7f39c4878c5f71a1afd69a3b6b8951da056159011329d4aac3d5379f44a873a604cc60c5b6ab7422fbb31361a233c2cd664ead5ecfaae4bd71528212736ec659688d29831c01e3e5c03b5ee7bc2a4be63a129f9ff6dd8e0ace373d41e3f32fef73c54ce6d59cf15edbc276703df264c57532a6b30ffa94a32c36d7adc9af13e3a04bbc565d112bba7345c142dfd3a44798fa837492933c2f5f6fe08a43a7ad217ecf6c07509551f36463322ec364a23b444f037a53488c14f91e865285b1087d7d99f063248e22dcf798a2dc217c691e22f3e3d7d3a90de196e8d7bd18ccd0179ec35b2e350d5329af42177d7b731dbbcabbea1e6deb321b8f4f76f95db01c631df3c912afc1438e245151420cc60140451ec7401b8de1eb9cc652a008574ace90f8daefc8541b55be2b033af389226c4bcc9461a291ff6a3af15450936de9b7e923b021ef131b573e2ad16414bf874fb962a7803bb5d620e12b6839c7b889557158e79e4add1f4a243d0f3257ef397a4168a2311f3992ddb8981782caf922522faace628cca4f078f948a8aed18bb6f2708e810feea2d4f1932f6e6bb9c54a906f79e6a13b4d2f7f6f106b88e18fc955e1b4ecd5b1546c5ce295f7215b3b33fd5788e0e24306b8d1059ddba8e151ce1f5c6cc6defd3f9f9d811107511dcd882e5da61452433a24d2b0bfb7420a7924ea90a11106b5f5bc0ad7428fab53bd5fc955733b9173677e8a142f50f005cac94bd770f8397db0954fbd8d38f2031681c644362f48e6f9bf3da9cda3369174dbab9089e83fb4ef1814ec4fd33f4cff8529e9b482933de533ad2fbee4a6341f1c227a69f0c52e0a775eb0ffd8f88060b9555f0edf07791fa1709e769427833a5df7d92ea0ce6bcc5f26f280d1e8c551c7f29cca8ebf6e3d07 +shared_secret: 56551e57abc7b80a842db9ee65aaf6e65b7c4ca10fc297e9bb0a6364e6255bdb + +# Official test vector 43, seed: "49e1855588b6235df2a400c4a70aedf8ab17b6e5e2891aa745f132fa2e7ab0c8117c1df37c39f5d57624eb77c2b4a091" +entropy: 060ea5d2ed1dd88144a9885e79278590821c22917b55a48920f96b53ebe0e689 +public_key = be19be36c8ccda4c9852a442d4259905628087c232f28871b05512dcd2b769179ad09a9313252dca243d73b387b279a1ca1151fda2781ab7757d2ca5c64052c8440bdd93acb5152203987bd5a693453957504242b3f8667d3c800e9a969372a13fd014715a0bff3a24c8f31a69c329a1c30ef37ca29903ce0943982413b0ba694ed53cb416f125151c8f036709aa2174ec365a56d608a2b54ec71183e2b4258e71adc09c81fe05065be2bd972979eef093cda03bbb82b6ee4180731c18fa997195d4917476427d7c07d99b663c4b50a9cbccb3c364df354685273b8b42b9e118a427c765b08036350a330be79b3ef4171b953faee56f719483717854b29aa3385545d3c9cd71b0a070aa2734f8327c095aff6b342584a570371ee7ca3f6a2a2bbda60c4e3aa264078b6c9bb206781f229b9a5cc2bba0c8933d01b469b4c687f5a1749513bfa3401cf1443ec0558c89c58cb795e3686640f6350420bed4b839ebc8106ff7043107c590c0bfb753c0aa2305e4920d1f639c3ed400a2836d3b638051b58ea9580390ab57dd7138421709759b89aab4279c5a9768cabfc44ca6a2f1cf5c039e2b0563a9048931f1565d164c13ab60e4c92ac843451cb75662ca03c47a652445b7ef0b8e622187387059a614cb08796d34758133050161743677594d51d02f290b3cd7f23d4cba1a64377baa36082249ad896990d79aa040a7858f1b3dfcb43adf040f1b245d216b2e23420e0b9613e9db6c7535063d05079c739f70759f7de0291537aaf5d6b3f4b6291c147855ea9a79ecb0ad80714520971011365dca81ab5bc0d9d70ade36a125ab2295858b79370fe21932504b9d583c787bf28762241a279663baa450172651f126bb20b85349b6344ad404e3093369569148a2a8cb7b7e08e68fda3408349b4761a171b0c2c85b37227cfa3d7c16a3950298c100955402919d14a71e7b231d60ac11e81a46515cf2f25fde507c0df59b352187af7059f3620026c84469610d0098895a3330f7638082d5b5a925afca637a1d160ecd2c83fc522a3bf40591fa5ecfbaa0a3b1859fc58b1d157c18b71d540b6aa398179bd65dc00866275cb0473964ffe5a8c638bf57304d32e24007b3c61429881ccb1a0403566bf3c46d8a19e852aac6f58d4ae32f45cc7b0f5181f18675920680c2c0ba8ed283fdf20c383bc08ccb7d46eb85204126be034374769caf39ae633924bc8ba6b7b89daf72ac4a86bf86008c02fa0fb18a5de6f8952eda2526fb1d994b4165149ed11b578359a7b9d0bdd7257a2d00b676268a38528fe34140eb408ed5b916c0c43d79ac29b0946702341cd7c20ee23c16a6b2cfd1f9107872b8965952a9a45e0e435c56695c819b71b9a6b6796553271c029d06cdb0308112a89ab4b714566a4b18d03c18d223fb6427c7b3144e64874c26a8ca418cd6f14e4cec2a0402698aa1af6ef63264806e4b42ad3dea298a404c1ec260935166418068edb71abec21040f9b3eff4389358b7cce70461ec8c0ae8873a45504e8688e266787421343699089fc31f84ec95a9f2264eb3ceda71261ca791d052a43808ba1f4706717a10fc4ac21b625fd324cd86ab8b3dc254da31bac0f9106028258adca5f754b309a6c7dd30e11b8701ef37e8715f03c0d8a32e9fa39d37e7637ba00940 +result: pass +ciphertext: d09bb378673304cb931ff7390ece8f2573c1cbb9275b8c26bbd0ac09db08c43c0a9b77ccade71a051de7be9616187ddb7cdcc3382ab8f6bc6f52dc344a20b519a7adde7abe4262e2f1642b96c687ff873ce23125c8b93323f213dcefde61faec8b976a27ad4994887e92f0f69bfa51e8e197ac378e324307593331ae293c91ba16d4359c7a3d43c6da57cd988389d014c3c2bb6e3e7ba6adf91d076a408efcd265935fb6332a77595f7ccf424ff11657962998e0851db1ce4c15db64b7db28986c272bbfb34fd20e239c7ef3beab2e101562c3dac28ba965fd5c49dab3085ed0cf327677041cb38b9b509d08f4140f7fb977bbf1e7bdd0b86bfe4d1cdeb112c3bee679bd29165dc9a81e7b1d9fded5b334ba7c3066203731642e3f1bdb606cfe2855c6eef1908db8ae2d3a7f4cce4e517817c696ac5f71f2c83db6f499d019ba3a1bd0038b7aa074eebe4e78e0a2ce7919bdffda15776489ea76a90246e5ef8acf9d38e44ae3eed809c1da8e2c805012ebd83e3cab063d6084b9aa4cc0c8fbe32b900128789ec63397d45afa6bdd7839c006ef3d9300cc4f8cdec1a565dfeb8afdabd1b2f16a67ac789348b6caa780d96f0b34bebba3ad00be9231a1ac55ed651259573015133549962b5288cc733431da4aecb190a8d43fab2ae764e770c735093ab4bb61562defa7ce3097c837f15c8ebb3097d0ad7e812e24467965938eabae899f82eb417132ef67e9aab3e8bb2c535edea8db70cdc450f8f4f100992e18af931fabbba58d9558afd20915266d71e92d8f92ec3f3fe455509e57bc590857edec1873fd1ce867ebfb06cdfb910607856964913181f86ec635a32266bb2b3c497723a0b9d056175f101d8258b60087a6de5590cc73f8b0e68fd04e187162eacdf2a5f0e8ce480ba8b45d1ac9e003b4cc1307dfc3e6e101a96585bb9533e6a6e4d0dbec742f73a032ee0b249e97791128f63c774c0203f4c19152302127ad848f427bd90c36126cc3a1f8cf3cd81484789e0f51339ecf4582f6b13c1f5268b126a99490115d544ee00e8512f819ddd4ae3962109b9c4361bfdcba56baf5fe9a541d646da72cae1fae5cedc8e8a165790a430be4ff41a547c2a1fe5bb2a13af50f631afb24a55e90356179d91c922f276a202c8f7a837d77710116a85686512fed7878ec011a60f40ce808bdc75f0790d2fc9aa3dde710b31843b5c1560c8bd75cc6539ad939bcbc72768e4d418e119f69f5fc7fc00bd5681c49aa0d1d2f8f4dc39768154c10482bc06a894b20b8d134602aa11f1be166a15dff347b5a695e52f2d44ff6c50f371ee169ea64db848e1909b6392ec4b77a0658fb1243bbeadc8095ea5e8d81283e366eef91b0b2070c2e168dffc97dfcdd16b566deae57ee6a163540977eaf31774db72d21742ddfc1824eede5a9e72e9917aed7e3000f0ac3f48ba0be24fa86f62bef852a2d3d02e61e3ee6137f41af011b6dc185127913adf5d387d6298645946d205cb188ff6939b0ac696e4d75d44189831803257d3f07a5 +shared_secret: 30abe054c82a82299e7edd52870f461ff6048daab627b6c848a9d4f1c4641a0f + +# Official test vector 44, seed: "df0e41d2f6f86c1f79d31fd5878e7ab434fc0af3a0d5f47d2ab3fef31a42bd949b0e3629df9f575befbb62e829e51dae" +entropy: 10ef9426f8c4a13b52325c5bb4ead4596ecf2c6b5bd2d37d8350e90d4164fdd9 +public_key = 8afa99db2599004da53ea126e94c903605aee44b3d56abab69438320c91918abbb1ea2b6953753e475bc33c159c590bed80760731565279c640d361de46aae78d0a837912c66c5a347c0946f6943866750c6ac1eee713cb8636e543b2f8a08857d53834233603391417a23c88b6003246a0c8ff39edfc7ab8759207dcb7c1d923ad891c31ef564e5f53c0447a25728c934303bec26875c44a26aa36e0324ca6423855bf2ca04e27cb8f42329a3a0e28a7285658fe1748a58c538ddb710c6d7839b573b30a5c4486a448dc0bab7c07b86279058578d4a56c781752e8ab270914534c51923a6d0c226967313695987314975dc7c7a101578f326d02a086513b2608a8b58ea5a63f2c6a1cbbdc847c312f5a2309c1749c349101a42757073224b0aca598a6a72cb308a010c327afac94798f8b4c6a1279389c12d1c3015b02e37a95705d3b2b8277c2c141bc8148c94244ec5c50e65790fd6e0842185a5f2ac1e72a21d4d652a63001c650b6c8d06cd758923d42479cba96d7eb396803c77be54c831063707a35067b87b2876a1a0844d11e1a895db70d596871fd1434798771b487aed562ee1d041c06505786205166812fa718424708a207cb4a6c25ee78b8b85e869bb82a89f647a813b97dc1abfb22b430d37adcb43b7bb1616dae73b0d606940e5af7d139f73b48b4618bfd5c22274d3a27c20195794344eac73b9a09de5cc4e59a2853a412eed7062dad16b0e1aaeef83221d34b3225868da033822248e5e40a692c20ae4cb112b9c4f9e373d6dc3393f385b5f65c7f14b66d7d0b31dd7902af39812d76d5ce73ebfa4c392b069be694bbfcc7b9c0825d158b431898c9cc9080d632196378049a5a02b43cf83d37e4a731505f23009661070038917a93c452004a8023b1da44b4e5cc53adcaea033c8759a3bb4bb52761191d76c95599a9dc2a2292bf37aa3803278726b660233e9b476748a31f9fb9f2d93b59b9cab33356782a976e05b083716262278349fb14b806a7cd3e52c1a6a6f603468c4b420cd544bfa916d157a21d15c1945b31f7c6285c30529ddf735350c92c546ca776cb44360cd62f05620f8b23b94a0a720270f122b0f22316050b7cf6623cc0658a9146861785c03fc4e0833c3565ca4ebc951f5145e2e434555d45c3819ccc4c2546673c18d70af49f0aeaceb83041556d52754c10b1d66b9c0519985e9b0aed559074743c8796881e5a189a4707b8923097669b2d9a162dcda33c3b825e004aa20b1749eb198299476bf45a519d341e9b507b1e411bd5382a6a84b6dc9c1bb437e98546074076ea76654ca6519f7a71d1f39c5328b16a5b182bed6b57ae058c3201554d612628274bff57755022b7e653dbb461958ca3eefa117b57299245a9917158f2409384a7b234ab390152b01d1383aad99747258c61bd24f7b12a0332c6d7b5ace324b4e1dd9b3f8574b17382bf387155f0abaf4fc8830b7774275821e91a939da83c9c189ec08774c739fff041d40d512b171c2d0ec7e404349bf5a64a876aaaf72c9c16a004578842bfbb6ff221debdb6ffc8a6de429ca0d7aa50071bc8d68c23c379364e56e4ac247a99523f8d90b3de4b049b526f8961621b98dc534b9a756aa9c4a1b2b4c7726e701ba03d885a39d59a76d92bba31013f2a4714ea384 +result: pass +ciphertext: 5aa4685b76a5cceafa22c32ab22392c40633343d04040d943150b99eaeaa481849d61ad30d813096b80a057b7cf919a261945d81e9806710d31b288be2e4a4c64b1930f4846e72798a0eddb67b2c447eac1f14ca8e0af01e99e1091ac30ca410dcb7eb7c992f9accbf556e0f4744d89dcd2a91c6624324a18cf9b6cbb4f4d482a671d0989ab0ea45c8115aa5d66cd6ce7d8dbf66895a3620075db3e2ab8f3a6a511ce88c3006ce3aaa0237f1d28986b5ee5f0d77cafa7d148b43fb1b9900ef24c5fc81bd4be5cbfbc3433f6121aa82ea014f7ce1823106c4b7feb9f894fd84064def9af7984cce8ccc62d1902c630b98047d7242116fc5735e6a5dc1e1b014eeb0815c056505529de4c6174b06ace73c98c23099556802a3fba32c715a3a6b62dd4dff023ff5a51ff62ce9acb7b42c7b6a5cf2859e04d18c1e56c778986e3c81c6b44add109b09493f318ce089d7641d84ce257dc13060383015b9e39d3988a1a5b0305cb75b088a7c6b0192a2a54e9a3de472b86d9a8a9612a19686d4a757cff8a8eaa192f3feaa4bced756090d4522309ee5c60fd7644363831b97bc5eeb095d9cd64a5cb97fb2e01e51c71c8fc745020fb789323bd2e252a6c52024908d387cee4c23d2f2cc38bd82eaf1a85ab9646856c434d0750c578394ef48958585103469ad69fcd688a46479de7d227809ea8b7cf9330d4ec5be978a1d2dae5b070b64c014d339b2a180328dc2a36cf83d4f7d5a2675099d2b35c91df8e4a611f4bc400a6b7eacd4170b9cdb5d5dd82dafd8ceab075f63ff7f6c16374ebdf38014a668a6c327580aac261e2194a2ba711fbfca6f73f35b2ad9ae7c1e7807c7c038b37f09c8be31759dd48267df69d00a2f6d6d9b00ad0d34fda09fc740b664e4ffdbe2971a1b88d0de74812827058f702919f700327a153d467a479e8cc06b8fb6264d6f53e7b8d84ebe4060e998a4576624937438452ec7f82ffe78337c2e8ac8ca790be987ba3bfeaa8495cc46e0f914a01b8af50e6b4c420ddf78f5d79b19575558951a713e09a447cdc52965afd3ff472a14203d393f15ba0c77bc3784b800aa78c389e3956ace626f5a28c8b67f6d9d3b7ba5c6900673230559312d4c8fd5b34abbc05600300d66ea2c8760676c205bbd6e63b0104ca3e30da4f2d7337f2dc28ebaaa7255bce5b741286ea3317e73d060babeb383d607345a808754e4f2771ff3205eba4ea36dc7d5b7534fd32b8701844d2994befec0697e4d3227813625e5d3f46b7892c1ce63c7ababb97eac2b06dbda7e460042c5d075bfd6c8b9cdf8db87c5d416e0a67d44d27338f73d5fea074c94dd5dfb8b50a32ea3128fb3432df47495120337952b1dad75b4fbfab5612c42e20ca2706728af9d89daf053141b264c9039299972ffb75c38a16a737bd89f88d603b5d83650a1f585b72e0737818cceda2fe57065f0fa2c7358219227cfde2d97ea5b5e32e5325b08792967ab8c12772a8ba9167e41d86ba7bcaaf548e1c2b0701fa1daeb45a86f727e7d91cddae1 +shared_secret: 4b525f467ee0d96c1f4b899a114936343ec21c74738b05555b2bab9a5d0b5513 + +# Official test vector 45, seed: "d3c9ebba6eb03ccb5c9b9d2c8d7f0cfbbf50841e24396cddf0e56525b38918c2fbe6c34cc1b93f7bcd4f4d5777e1a488" +entropy: a4bd30a64cbf29a4e290fa1cc1dfb99e68348713041e4409a1af23c5d80c15c4 +public_key = a7c9ccf796828b704efbb194d5d895cec082f5dccb78b59a61090eada66093c84267079597c9881dfb2ca8fa4cee6682c4375eee25a08bc0766eda05bedb2cabf734c4243987012a44e86cc013b7e555bd15d45306479a78ea7d4fd7723d3b074860914e24395b264d35e57867f0229912c6ad0238587355b44c155bf7b5e5c872afeb136bbc32b1a950b3122f3a5b71d8c140940b1ee62a5543f3b61719896499721f5466f7b57b119568c960a3796bbf2c8877cf8a762d6a8852619abcfb85ec7c6e79652311490b03f61bb18a23fa100fee70a0fc693163b28ebd6505773324404341e6c79b0562207ec1077cbb64053a4447866efb1894a6a544daf283474c6e0e99323f962b5cf4667640af8351059ab42e0925431d864339258752a3b08ad52f985520a1247af44366f3377d5875589ea9a8e38455a3bb5ffc29083664cda47988f4f0c59622454a7109a6722a77703b0a69a4db2ac154d53a6bd60603e9be794b0b1b0b88da57a64802ac771134b1a4776d07703db8746e610331ec3ad3926891c05b4b738d3564b79b59287174696d119717d3650aab049b401466467ec352102ce597f6e867726543067acf511975828799f920bf139c176fea838144797e79441af218d9c2c0f15a350ef82d588b45b86a2c58464239c121ed2a7650d2841eb21dd6547bd32c0e4d654a3823c4051609ed49220c2651deb6b0e55a00d261caebfa9c17d82d5f23a111c391d06c0441102c2745875d6905ae21412c2c14ae51c5609c5872828ca8d09239b82abd602005cc66ddeab736db3cc0e946d6232177e6c012a8672bd62d0a4253dbb5a908c42341503b76d428a0c38f7e978d4fd2532d075c08d9cb3a440018b323dc3ac28bf8875e412745962e512c0e0e81b4919a813766bb020c831ce0c3eea5a496e57e8d598d3bb34733b6358cda44b1960e8890ce525578d100257ed8a916a02fa2d8b59478966835c0603a8f48715ab2544d0fc487a7eba7a96a6e3918b9c9cac54c841c2899cea0312b40f9bd93eb7d392a4cb889144c224a23244067a9712ed9cf52a15edc35895c7c121822468716704e3617ccd59aeff5120524495d44ae3019adf7d25bd7871b2a98a17ab6c68c789174a28a4863ad69362fc5982aa68b3c0cf35fd2d63d064556e55b6df0d636dc5ca56a928f19c61816349c6339c59febb2b8675807a6a9181a91620a684dba5c4c596a821b66014851966547d60690f7a805bccc4bf9620c188495795c3dad55c8e7529fedc92ee3192a68bb9250420f6ff04f939c82c8442350d40f9d518c10c53ed5c3539e373d0f955d3d451e7873a22af2aa87c08105c044613334e6b585aa864795e0a6af988affb2b2eae653be5c76383b66f5205e1df2b557b66b0f9b7063d3039510ad13a9b5ae6bbae433808db7275271917d75524eb2203202c1f0b4c9afb402f5798214c28667d28727f89b95d3294cf38c129a792b16161e6b9eca60c18ed802c72225d585c7f59059dfd74944f764035c073119395478651f88352c204f89222bfff7c8bedcbb6be1728ef74e54435b40b22276f1199ef34673ebc70047956a543f3d8569f334a5fb22b4c2bc34aa9a4b27a11795a730eb96003ed4662f2f0344da2b88e634672fe48e40ec83f4ae731342e77cdf4a3a +result: pass +ciphertext: 0924e57c036f105436d1eadfbaab67c55fdbd49ddcd120c08685ba7115c250799752ab883e52ef0d0c4d9bcd46bfae3b0b6df089894155bc34fe4b0db0a74fcc95cc5d56b9060070b8e475b96ceaba577832790c84eb87242cf30dbf9b9c2fd61ffc76f4894495b2f2060c10b105f9845287e9b84f10a187446714c968471550d772801214a50d9ae0d6ba97e60dd0e3935fa6e5b0425fcbc1c1c47645b5974f4906f3f67efb70ca30f01b30aeceb45bcb578e08fd006c641c5c23ad9956134de1e4b50941579266b95c092b96698b31eba48fa03eb2d38cd8339e17bc45df2a7bbe159257ecccfd09573190e53193fcc172585ba3ecc444c8bed87f0d9dd25383613e280185b145ae6be22dd90606edc02be32ec3c7c2759a9d2ba907eda6342aa9c4815edebdeeaa79538c440ebf3f7a3610e34aacd303d3338547dde1ace59f6749573847c1743694d29f99ccb1ccc6764e2555f51382973985f02db7aa11614a1202fed63445500a23b1285af9d6fcf633110caf23de2ae3a8310d7b574f49daab50988f00f7e2645bae92392c67e33c3bffd4551d5bd41bdddeda4cd105ebfacd6a56052653414d224becf74c68eefc15b1af21011add1126f949fcc8efc68f8e5359fd27c0662dfabedfa8481a04c4b355f2c1c31b0c9ee202391fdd4e3e206d96ee49ab52112a04203b8ff79a2db64f4034083b3854d7b1506c6fb2afa95c896432b969a62adfa1a017db9c3e7d3b76fb51e73f17c7cc762889ff2fb8b1066b2f05600d52bbebcc8bbb35b91e6eb9d270d80a995e59027af9acf9a1d0f80d028ac1f3bed3b3ccdc6be3a97ef00215ef569c000af549f4e31d5913ff376db11e4e7acf6745abd40fb3961a3758e375013c4b110e989474c91c8ade63f9252c09a8d760361b684424755c47a21d8aeabecec6d2bdc16d08a1ec5397cc1d0ea01c5ffb45b5faaa8043694cc073bf3632558eca1080388371768f41d23fc1a4017d0ce0bf51b4a85e6019c2a0c728e5c3a02e592287de10f43a2b9ae9e975afc4f6af27955b3af3416f4f89f818cfa602e44b8a6e32a57b07a567bc60accc98e00093d17d4b487a30301063118671c62cc5ff595fc8794c7c64386e4be6da9c580f3457630ec9e4d42be26ec0b9265891d2d36b92e3f13f0cc850b04f5079abbce1be7dea57d466dd858c0b6d5e15990a09c1f7d0ecdc46e63f857847b3535d28a6f05359205f45537f93820c7ac5e83f19326b8f727ff744bf2bcfdadf56a14412697ed028586fbaeab5aa16354cda157d5410c617520fc90c612c4076b82692364a32d9e7763d3fb16421f6c177122533afc75f915539a523c8db1ca9a64951183154111978610fdc9740466af73b05cd0dd380f39f94c429d01e0e4ae27ed1495fb9cbb90d0fc78dd28e23280efaf77e6ea6794bbf342f3801148aa241731680738de27ca171c6b2b0ab1099bfade25362f610022853ee07f68868b3a2abc899703d3553a6302d55d5b2f24112fe035bce7acae8fa695ebce771c458fe +shared_secret: 6cba1b31809b333ea40f2f67bad438226d91bd61b08860357a840cbcc8fabfc5 + +# Official test vector 46, seed: "6b3996e8bc6f52879f2b7be012c44ad555707cb7e5fd8abb3457a298336d6fdc9eb7853008ff13201d5969a315c7e493" +entropy: f4b66a7d3b65b896dfe100b2cad24b175a1168cfd2ae11fd704b835f6bcd311a +public_key = b854a0daebc2831a4f20695579b52d3369af228842776a03c4d3284d763d1f663000930377dc86ab14486673a349d8073ff6ba44496c64467d5f531f5203a074ac7ce9090e59f1c308d2c755910af132ab81b50ad6d6c2c6716190696ae6a51433f61185a43cb1d23708d8286d066b61a6b7f9e13f8248c232d8315f40053fba0d7ffbb4ce60410899200a8a5e51bc1d8392cd56f41fbae85f35b110933a931084444036aab790cc09b84b7a235f34763b9ab5c9b53620f627778c661c4c45b36ebb3a4565795656227fdc280b327ee2f96c16e7bbbde89e9090318787b2abba7727a393cdc04dc38205e3c86ed5d5291a1149ee204b24661ab2ca16c1c0a35d3cca0d7c57f4e01985242c3b43869d9914312678710b039be4c2b775cca014b1d936ca8432a4614c4e67b69620fb49cbc787599c4bffdc3a2c786ba876864e7a5be33ab200bc2d087c3e6cc642f4a96771ba212778046b5823085c4068b209c54a5bd4153e4d986ed3512d09d40c37c1a2e57495e0a594f4430fdb1c88c4fb677b007d8804ca114c0991b90b5140761d59325502a1f0476e961a0c2b2ca78a82c8b5581d98da26de717f84c140fed0a00221ba71c34821374ad7c565ec20cefc949e98d1819702a4d38597c1db9239b9167dfc8651498927bb0e170c151e881577f58963593d3ae00870b8bb9fa3b77c468e8bd365dde088f24c2577c5aae2f24aee1552e4482352674d1d96b90880336ed44f6bf007b5eb67c52a10910a9a3fc82ab8d50aee17b667a27b4d014161f1a60c3084a25524693364ac1876cab0c93c01a153b03486e75c3a01728f625f9a7a6a99e78ea9b77b01490ab49c6dad9ca584229a8a890effe47ce0692aafb17a3db2b855a01666514e8a800a47c0cbfb4872c8c8a4d4bc52c8db43d3f7360d568f4f905ada2565a494901f229ed51bad9106bba6dc4fa7ac59a3a5a64d033be1e47c36c2cc9da10a2bd200b681c2caac5cb1eb03f36455241367d30019aac00afe312c5323cbb4575e271c01f09c6eac03ce1f02bcc4186768493f6cf97671e7a02db6047557306bb8ce086382bbab8312460663dc1bfd01b2411b3c49835690627f133935c27308be6b5d09844f477523521c2b1bb1c92b6b3c46c20cf97217683a3f2e46b0151511c7c9c4bf8620d4706ffaec98e524360986386a7b5c20c312c5b6237bd17271bc6c146124d190205f468dfb00bae08318350c1aa5910a07a67bf13a99a52a39b2b04fa56143c0c1290c5c412ce1647ba8242c851c8bea960c9c4879b83037886ae77b10e8126dd3b633a33a662076cea326765d6262619b8d0c8c3217435450070dbbd67404f5255b6557267178ed99cd4257768e728f3069bc29f8484a127d84098ff4325946371384463c4ff489cd8b6eeed0c5e3e92b1b988c41a31df71047cf78ab1ef9adac2a1ba3121672505ec77b0620617598f84d1fc7b00fdc65e7ab72274c86a424746dc74f53142be6423545d02d581933bb92058563279e522ad8507f4326699bf4831970775640887e875e1cf29a09843210a23976941af397a3c6c5605af133ba94126132311224388f340448a1252c5bc0197b4699aab73a4237d40204a46103bd605bc698111ddc3d6bc04804722c35600b001c554180d16628713bdea10cdf +result: pass +ciphertext: 2150f944148dec904a5077dd4d82ed0d72bee1a3dfb6d7674753e2b50cfd6727ae71811da5ed2ba0bb169aa8a4883d286dea2213ae9edab0b24c342348b20ff4c5ef3a56320ef7f2c104a3c5982ba4fc3afb68575223ec0579339be4ac6a2139e8f8838b75a0f8e90932eeef2633c8b14f4661a7bad5414513075cb8053afe34a2c1379f3a750f27d7c46bee74524245cb41a221c48c68dbee3e78dc5f9f3c551fd830d6a40d4d4fe75ec31d97b97ffc32e032a75e0466562b54fce7d2d370c65fafef8b66e9a4fb527c7b22213b22c137650137a64c53f910a2386cef26e29279c16652ccc0a81da0ceaf494f32391c915d79a94a8ab7e4fc3a4eebce4c5a0b4ed899f24881263dcd74e3b895d353faae4cf47a1c74299ad8d435cb2c927841a86e160e88815805fde2d3c9f487754b1fb8b9047057b5bcbae25754f90c8a0d1c7b8e9e8ac03936197136fd189f594b709d52112fe9ea335dc96ab2ec87c97d703994492da1c1cbd20994c1762bad07e5dec98c311156687128c76d2ff5a5c7bb65bae29343059f2c10df3e9239392769ad0f575bad34bd7213f897d3af45bd299e8d6b75753f966317cb5dd821b5a8d5bfca74871d210b2c184107fe9109503b71644c8af5bf09097f3a6f0b9f9e26df7615d503634533cf4111a5487f205f45610c777e2fe6bf75e2100c209ec650540e734d710f0a0a378905f59e8b6c19d4847bd2b02c4366958972a963d4afbbb18e55adc1fff12d07beaeb27598cfb98833d02870b902b0d9c587523792b443c453059537d0d0975b95b8ab9d94f41b6bc0e344eac841eb7656d4c610c80a8e0d0b659d1be91279ea59333ef5eeb4b42fb0a4fded5d313bc754605ab5d8740716bc1d5c9e18a998d04fc4031fe5225ab6046678777a740a998118fd7b09504695401bfd27fe44140484e8bba45e12bb2c09a3cdfa578da8c7e46bd7817ffe1bef08a5e9005950c25e2a6d467eaaaa44be9abfce7e8bdb55356a509c4df5f6aaa89dea332ba7c353a6035a4e4ad6b213366b49b4db22dc73f93a336f7dae65f20a662bd25939811d0df9851d21a2b7fc8fdfae07dfc136a7ed64c1a7b88ea62ce2093025acd1c0eda5352a15c5a95f197a611768bf0d59b72c77cdb03420ee070aec8fbed53cf2319f04b2e72d742c930cdd7b1e9864474c60757fe7cfde9c1d2760ba39f1f8ac5a2dd8edb312fa7b34e22c62c0a66c5d64cbc6c56fa0461a4bbc9105afc9c3be7bf62379a392e1ea49d62a2f91f19fe1aa1168138dd32d42be5b2c7214861ba4873726cfdaa9628f827cad22a2dbf34970fe8f4238b1c9d9af380f378d0273df041cad44f056ed08637e4a178120cf841cc8e8ed0e797587d11019b4b6756fc47803d0480bc325cf9278f78c3e00e534533c742328ac2eb2176cdfb782763ed50e510b92d56a14afa41e00c29e3e18dd037e2d6efd6e1d64e9b5760bf22453d850f9b3e2ed63fc9be5c45573d79baf8150976243bec8aaaa217aa02d707eebefc9b3710f56ab84ce72 +shared_secret: 8087b456d37e6aff785a0ca104cb03ef71fa2d6652c52dcd86220cacf878afeb + +# Official test vector 47, seed: "730b65ece22de27d573ce3aea7cb021c415df210d228808d91d4f380070ffcb0778b683c71d4853deb569c822765f2a3" +entropy: 1d7b03d3c5eefb8ae5799dc569aa668f1bcb8c86607b089d3530cf61d6380147 +public_key = add1cb33481d37e546d75b5398198a82126a7d306a26c7124518075ee6701d1ca69d16a867115582f22a7c382bab3acb5de50c34c13a5378b2b1415b5538987a77681597abab9a0b5bfc7bbd19550064489be9b897a54fd12c7229f0af5313429fc85f1936b5a325aea955021a969ae289657ba4ce7393477afab3ec0b6e46bb7a8570b2dd4372d51537ceb3023e477a36bc2b784444d0f71c3165395ae71f98921ed160be83e0572487691a43128352b3d82b223c67b33d8277b05c6c071418799583e2b87c9c2a81bb2a7658d67e637b99d5770e04b592bd5961f0c726d0058b31086ab1d23f4d200bbe6b418fd53a0131aaa5fc0380f70f1c90cd1dd5bfb3839cff013375f49919214e756856042bb10e1252a0108c1dc39a1f69bbc230a4e9c93a87a87899faaa210a781c91bdfec9a59080ae642aadfbe20f9ec600a2b297c3394a751354b6e8ac65ea45d3b66c57328249034738ea2541476ab0f2717940930c8551314851be98351d96acf6232e1960b97d930e3f424efdf706c2da2f652796caf344b86ab388f412853a5643a7932409b476d3c81c2a301e968dae28742d18232efa09b81177dc9ab33d7b2ed5e711c157bbb123506fe35c5132bd04ea87e173a7d8ab5b2e35a7eeb58ab3f549dd30228dc5197f778359b4b9b9b989b697839fbc013426016110bbe721c1c89c1d463248887491f0814c4bfcbfe7445144b88cb4ec535bb85a3016891b009dd4ea020e3799d56a710ff097b79384556c5d7d717436bc9626cc15ea509fed2bbb74c2636e8cb4e0435283c7159d8c9eb6e11e5bf977a80994278161671346b368372ab5612c85ad48db8a82067acaaa39bc0b1f49083e71e8727adca1f3c7cfacf907a71c3c73e6737bc51795c9761b5c36c87b46141400dd43874c4500606c616d90bd9d588905fab9b538c23a07b9fba6c0699259b6b81aca207138884886205955250e3e7b5d4d549a8b73c0ff41b88c305b7efa4178695abaecb97ba46dafe090a81c038ff373b13582665665b2058835b629f2925ed99082858152433bc3bbe90937c763d835638c3225e0c3485f9555d3e1556ffccb1b059dff8667ac445b474a17f360a2dbd895048b29fcc003f3c46768668b88bc0053bc3821a95d5d49cf1510894f1739c91174310b0ab2cb7836b41bc44aad9681c0067192d4a46c2fd60e2323b6fcdaa15a6581b4571b4ccc09fae5b24d8b11f67aa629e79652388ce04b9ceeb5029e80341ab6abbfe38b2584b55108a21ac64d61636ddb2094cba91c2b606cf3d2ba09d4863ee900decc2d594a042b5a63c822631533a14b6cccaa0775ea3210e3ebb22137a749b22c1eb129c872578feca153b312efe6238583793852485fc53952e4a513e64b8ac7b60241944d704246551d3372ab9e60bd8411729cab31eb908c5348c34db74f3ca60384e93c91479a52b321f8544dc13620f26c9fd324784a294197d9935551ccfbcb93f9f2ba8fda993a3598a5d37c36469024129c8f3a081c9b3a680a02ec450b0a805da455c5f696bf46681ba9f80f6b469af9b1c09fb2bdf618242f449cd017308dd80a9fa7a3a6aa25becb6f07b241f0f72b345664751b83b46a276ec74aa2569b79de21a5198e7f0c3bc2aa84e7f5c79f4cdea5b473ba2d344bf994fd32 +result: pass +ciphertext: d378efc5ef259dcf2434427ba3f28dcf6d906151fbcb67b9c8e4c3bb098bf2820b9670676b6931202f38370b6e36286ac1ec05f4381867232b34b4078cf6e55d41ad44431be7c35d169436cbd71b97f160017a05d9c642e87e6b4919abf40e48747acfcc10d21ef2c309b1be596b146a6e4e848548f2c8c97c9293eb03d92349d62da60ab60f890a7ff20ea7ee1724ac64ca927413677babcce28371604e79a0a2fa134e51c19d6ca02d89682233c85618874af6487685f21de8e85dc99603f5b4c49139f9a5621380c65411aa4254d5ae205d5b0aad42d8883afa7221209abd96a91197381dd9d513bec2cb06f33760756a0aed0c169c195be9b33609b0e40c3f1400f7db12d4a760b45bfd275796e674a9bf2c8752b98fd9f9aa98f08a62f20296376578938ce94d3bdfd8161211225a7ca25b4282ad6abcc8c14e40d4d3d4cbfbdffa435258f85a29e7add20a7c1ca410517207157199d02ffd31118f13d910be88dacb9e38e2eb3762a4b35f963a17db121037c1972580cf0e5634d322ffa43559c20b494ab94941a51d0673929e2ac1c8c8961120eddd8ea1092c33c756898ffe92b02dd7491cedfdda440326e2f818a67599e3a2e146ee5d151934fdba1cdc36eb42c863e841dc214584ce178cc9876b9411d6cdfa8c2d1335dafe8f9bfc435a7ec06c9ee9543b8f0d8cfca44ca0e21511aa2c592d107545e6c0a10dfd37a2e9d0059861f563b26e544fc96049f02cb9bca10a3dd39f440f0e36bd0a2b6f029aee917c3c8abf70a893e56999c9ed0281108f1d0068cb37abd7a7f09f3ee975743db549d824847ae0adb07f0882e02d0a45115ee6191ac32447a92f83d4aaabbe0dc55de5b260079645703603d8704c8dab678bd468463b82869802e999557b0f0164e2e790126e3f1e42efd67700365698e6fdc87b4d42603571df83cca98284a388650f4dbebb622aa190b51c827ea8f14ca0692dd0dce0487b6e186dcfa3daa04a17b07e0bf8ca15ba85152e4ec0cce556bbae3745c9c1a247d0fa6c10f9c8a6843a9f91b5bae12266e1e96d4ba7c2cdabb3093aa9bf2b9883eaa4ac1861f03ad4c9141ac88aded147390197fb82f764c789ed7bd893f680834d76908758c8fb51c508603303290500c6dbbe16c86e93efed13f27e1e0f90d2aedf9f40be308e0c988cf59cbf8d7de1c8bc5aa01afddd8c58afdeca6394e9d03655c7b4fefd13c75846dcc1304ca80a4a5dd985e24e7387d3f5968312624b4a1f1b45e1353cd764e552cd16713c36e0bd1aff6369bedf509b8835c767c53e7ffab9770eb6e0a8acd9208eff61410ba64124b62868a80096eaf3d5b453fa4aac6ef1dcf1924a04e444dfb88fb57742f2c7cf923cdcffaa4512e648d2db593c160219075bd4431943203f6e54833b425df5dd442e589c7602ee877271b5842b334b98e7d171e6fe244434c451604da7885628d7367eb94bed7bab93a261740127d57d9d6acf40172a75a32432de3037bf640654418f9d3e3e9f05d17b858df6a1d8a22e +shared_secret: 6799d393f4000857868049c19a102e5c04c55a6bfe3a41abeb4fb6d5228cda97 + +# Official test vector 48, seed: "5522a5a891a9a9b5514f4556afd8df40b9cec63a01492f0cb8a1db073a285a963e4a9ff2376c88662f7d8d241f8acf17" +entropy: 554f3385b382f4a46314de37ee3885addfc5332bd4038785094e0a832e9e8c2c +public_key = a7a8102df0c61577a7cd4b9a04b17ac55708d8c6746289529337b9e267737d5345f4e768e0d6656cf23593a84eb0ec290c8ba078eb9f8d1cc8ea18280981cad0f46dd29c474fdc57cb5bc93e318537ca343bd03ea6a7a466b021b3db77021a8e20b94907ea294f47baad599d51d74219e38f883b36cb323a317520997988342a7452c3aff4522ebee30211444fe78854f9f853cd189be04cc1c800607cb4acccb650ae546323e7993bf2a203487becf8328a2979dfc5c3bdfc1b47533a9a629e5fba5a2234bce8eb37d686a75bc33eeb945d80d92c218548eff794ad6c0d825b57f6f12f0ef6b8201bc0d1fb0354f051ec1a217a9a0f0c77b1d6f76c1f25b01ff356fa390079d3800f1468d745a0dc852ac140307e700f97d557eb42164844b0b6d5a37bf1bc41db5aba156359e9b4ad5649189409be58b8ad5ac89e348099ab9ffe81c71d54853eba7b42167d478693c39837f76182e0c894e0f5ccf19643fbdbc5278b500d1b07f1e62ee797930c0cc4a41832ad093b28460c8700678bda847edc6bafa64ca182016f75366af8c330d201c7ac4327b2326d8b57997734bf909b0fa1c619155aab7bc5f4026079926d04619186c4334f48bdfaeca777e91d0b0b7fc4b180e5e19f0162c5d3146b5ac5ac820781209c455d195f17d541d6916f56838f7be838ac0293cdb63f28529df3fc7d54475062b90d3034c2583b00c942102f82b9553c1120891b77d61b8c86ba21b4a78f772c4049869b56442d33c642a5c0ad167747807d5f6105ccc21af8e06c85031a2a73ada9d59453017f131b55c1e0176ee29b021b7933606c5425078b7b49cfa99f24b21818e78a0e856747e4a7888a3d1313624af81c75eca6c3c43238bb078b94c2a9c57f0c4c66ec5b59ab93b73a1000630aaa28a79415320bcc8a96195934c9f14d5dc41cb70c1104a63f5fa29953495abf71b9359563f16c7bd6bc319ed7898fd00cb580902f2196b45311962cc17a9a9f002a916d9bbc1a452bd3e6a48ca05e50ab35bd828cfe66b483e96ca1d917001b46374c41c2d079fdd8257bc339a6e13a7fa2c0948056f6553803d10fc9f1c87725230ba3713903193f200a9851a78b61534b5a949d140c9b457ec66769c6544d79f0850c4cc8e4b78eae0b260dfc9cf0848e4e09cf52047d62bb8e7e6231f4ba49859b1dedbca0d8832bd23789c6fbc40d61485e5a951de68639e07e624a72395b9e25b603acb330a37b998b7a9ab3f973003c15624c6abce84050fc0166924a397708c12308c578105c1457de7cb41dd609c0c3333be5b9c3b93e2776aa0ab3a4054c98789a4bf419bcb6eb914c2179bae02b462b1126a3a28840b9e7170618c20e8527993623cd0c776e54f8b4eb237b4f8c075fa2175f11be86e2bdf3b9b9dff89b7534134620116e0ac025f6707b00b5c743aae144241b935ba61827909b591b44cb6f36107ef81a214c6aa5b9b3e1f441c774cb7102310c4031e0e4a213a8c1f1593906a0424d657cda7c10c1354b0d5a83d2cb9d0407073fa77abe480854c953eedc6cb06c75695665b92873552cc053a9bba0c99aaf970753299db3528276b56feb8a5bbf373d13c20c2f22ae07e9542206b296f3b101d07a3bd1517d9eb8db21e1f18e6da63acfce1e0dc597cef3abfc7d0aea99da +result: pass +ciphertext: 35efdcdb40a548a0269d389f25474dd39115feb706f9defbd935fd224b3564b3e5b327d7e5ae47ce9ce21f968ce4b20fa2958ac3abc36f9b301e644b327b2d5b74f26a929cb3f2a070d7a36932c1ab0084d7f8e9dcfb6632a601830a1bdb6d27811d35158315863f19a6b70cdbaa180e4e148ebe276a6bc52137c85334f743e84622263144c67e7efdbb1c6578b17025d9a144c2784eb9d9cbd4052c23d3de56d4c50624d969953d944658093c03a933c8f39f09487b1392ed0b7ffeaa8edc5dfd73349c640a75f132259b3a266513ceae23b6a9641d8a8b1d03d5f44f3ecf2111b43b8ca9b112b8d82ea0d7a4659f36c81516cbcf1f7695bf728ebe83298f8b5db14a2e8e7be0628b4f8f5d7253d18efa4bdd5725f5ef10876a9f3890b99f6beac54e9c881693aee29ee7618b04ca59dc31c7531d45156d109c1f28d13eb37aeaa8edc664ef4c7cbceeb95fbf2fe6ac4f5b3a81c185dfcec60ba16f0d6410f89732d2f7bd6a8b64d32fbbe4869caf86323a13e840470479d932fab248c1ec3d09733342c41d454819a335c3e41f87b56d92e8f2a6b598240ebe595604bdd4e18781e584523977e8f9ec732c525f8bbaab3082a97b0ba12b1fdd76851d732cb6b945e24f313861000dc4ce604217df1bc5f9947aecdb305d397f256b30607c4d4557e2d248715a47854998399fd0451cc61a138a24f238514052e26051385d4656811f83214dbf5da500467b16f9f3ed940446241166d0cc6755b518e16403da01681644dd5e58ad821a7590a3e65087a5f583c81b9cc6d59089c1710dc6ca282cbec114337ccf8c63a04e340ee93217b9d988370d6aab73b36f3ff9f4de4996ae9983c1851f06d18008cdc79dc82df1f29ae5c803a1f3f2dad2661d06060daba722f69970f18d081bd58342b329bfd3590347a022b9066bb95e5549a89f4ce681fc309751329897ef1b7a77c111191796574944755e5be70c4cc86e7a404a2844cd21983935577f583bc5e86902bbeb6fbdb6c90ff46a59136afaf006b81b0f8d8e5dd6c7dd9ba157d26ea5ffcf04693f7a338f923511cfb273a2f228323f195a42126ba6d2869aff9e6ad962c34853c67b5fed2abbc325fb5026cf9cb3617fdd147af37c88a768f5dadb5a03b7afe56ff4277d40f67edbf1ba78818cfb4416e5d8b9da09ee9ca4a3864577446b7877c833b8655f12554e62a1bdef2d8574fca989fa17df506c29254cef3712cb4576165fdb9437751cbca17b18e197931a9d2f060b7484784e02691276696289ee89911f805d0e658a75f5e13869c43dcbcdb2476d3aec985ebb8a7e367fdcb57acec9449bc856fa13aabd261743f88f5a446aa5cee3436aebacc7b386af14d4c0de976e5ff4311318d580a7ce5596b21d3e2b4d1f02397c797cd018ca12a8b8fa6dd90a4997846a3e02aa1c8977b992b59197e29db4c409013ad9c9c8f3db22085dbf8015d26fb456c9e1a453994421416858b180a4deb5f06d6052feceb72680b625d644854e72cb7465c3cb5fc9f6d67e +shared_secret: dbbe6f3b6f5a35789697792e209428ba1f53d1b98ac2c0d1893cfee641e40375 + +# Official test vector 49, seed: "1853e72329353b3f89ae6a1b1ef700da8ed3c10d19f9e61ee9252e28ebb0e15802ee43083a12a0b7527088832605e3ab" +entropy: 38bf0033b779edf5367d9ebc01c988af90904c560970815837380650e4749eea +public_key = e078c4a3954f40a2697092bbe4460f27c4ce6886628382606f395b55d1a29939a2f754a0b82968d3c865f30066c5e21e3e2839416570f5b54f24d347e2e10169571a3935307a4918b5d68ddfea58a90382e70012911729238a4919a7531242228995215fcc96ce8c1970faa902f79c7a7207a93613de0066c384786f5913b24040e6b4b48b6b679e5538f953540c25c18402be1c58762fe8bcee6a1e58d93b21165f95895afefba1f735b11fb7bbfcb40d3d54ba24ca7ef507973aab9017b66a3e271f980462752137d9ab0d1937226129bf48f68b700021b2fabe81573e49fc17819bbe46858b5c58b4ca7c83a57398a667b09c681b990b648e96ce79b72104b13e97611ee8528c9f64c376eb04925ba46d3c8ab859304ce17b9435309726045de17d8a7cae32aa9c80e1aa4058cff89010dfe22daf0a002a905f945accd2f9225739aff1863006b46f9ecba5243bc48ed1184bb9a57ae26c8cda147cacbb4a031112279dbe727fa6c467ead943269ab1e3c9657c19ba0b648c9d4a48c6163a0a79954c0c7ec63529cb8a65c851c39840bb1a7c584104016f16b43da179189343c3276bfeb5839d6622e684b421526d69517ad57b67494bca6db58cf6c95266170ddd9455a6867de052adc8909790659fa0dc0a1d011487b16a1e08bc82b22aa9444f123632ec889719e754993ac8319a72ee83a988a2c77d28acd4bb5ebc486c33b0af1d67a84a349480fbb2b0b252e8749401d8488df52356a75ba2883090dcb757451c9956888b43806431bf9ed956e34806bafc15fcb1cf2b45729eea12a6580c6d1c366a76187fc20fae7657f560973838abaa510fad13c59c5baf4773188859809d1bcdba937845759c9af40dd2f14bd7dc48028a77ff4165f2204fb3b0b9f585061616ca4fc405a0c8533c344334e511053a548ee86998e9094863b8bdc02aaf6bbc916481ac9337acbac10d90794ec239268aa376157b1955379d30c2cb4927a8077cba969ac398bc8521450efcc7e1cc617e69a66fd16b771a2497d14e35a61919dc129844379a314821c333a2f4443651a4cff234a3dcabad32610f5b54d138065d8a5a81fc5068c5060af125265cbc42c580f47b9fbda72a893329999958b026c5661ba116346ccd86633e0a603b48c8acab78662162a9f11c4349c5235a5ac46546b16b25e355b4408456f7339122b67bb48334836214e431955e979244c8c7864ba189eb24c818c15417cac84682f719c9bdd8479be5c643d937605383c6a9514118498d5b4e81d5b74a063fb53cc19a20a9cfa26e479339b988c40918c192435db1a3b2a7c6046376b97aca7a9bbb30335a0e8fd237f8833e89e41a1c67b8aa9b0d539486b1855b9fbb53b5103ab2d19606165acaa588b9d14a4e6a7823800d8a9334ff7456e75aabb81408b791c9c6bc3b5829c1ab241e8d310bb7b15a5b24123a2c691ef1b5dd80640a7b94892aa1ad7300797a3de52a66c794426230640b303e71f0b93654708bd81f706b0f71757c08fcc591525bb6c9a57777bf1bda0d81b4922a56586d21b04daa2684e14ee8c0cd542824205b2bac3c1232f2bd37109d621a25cf570573465a706583da17c39ff3ad13826b6d5988158a1602a361d7a2f86a9219450ff713e184c0f6ea4146b79b03e5ee3454a79f +result: pass +ciphertext: bdc7562e2142743d9af81c76aa1fc1d52b6b46473fb7f97443903b44fa9120735320a1180c7b1631ec6faa37b011417b71bd14cc78f3af729e869d4e161d9d9d0275bc653a731f04bd7e9f2dbfedf31effbe8d24e2822fd7b534ab043e72002aeb28a1efebe22f078ec853f693fbd645d89050401eca963a0212fded375b9b66c1bc138fb13e6585b9574880da1c86cd34950d4d3122cbb2258f5d9a08ad788b67ffb535e6c6f49992f63f6f459bad7bc87b00227f3e8db542aabc9f5c8051c02eaf843c47b5490aeb92b9f4f50252f4d90395603c24a600e95b9406f7f66053a468c4d46d7c5b4347d5f13068a3253ce57ddb159ff3fab3806737d9e30a74ecca1408154211a2ad7fa5c3140ece83fbd56326aa4e7399633d030afa5a6720259a31e58e92ba5c55855a693b3e2bec092966be1adb99b5da4d6a345b3d4c55233a25b06422f3cfd76a416a1abd732ff279c094a0b3d598641b05cb8f35d7996175c5b15d6d478fd17f738b4ed2861334e9c125acb154b6540a01e7ee85c1ecdc4b354e8ae5c68603667b52344ccb24d5b2f2cd68937eca2fe5b398d072905e51fade88a44086779105277bd169ba53d1c4ab1d2502cd6ff3ea9ad8dbd9d8f8f4bd05e5ede3c22ba08366d30fe1b9bea9587b05e1913ccbe6d94fe17a0107adf69ced338256835e707cc312da14b594dd3e4f325e18921938062d9e97049b93a0115149b4aeeebc45605edb1e51bdd644594f3ce7293200787d972e2419a5cb8496bfd8afede88d188c2396af33953f335301c58421250da4a9ca1b247a3bd81ff25594dbd262b7efd31b53371d1ab4d267fe859c11e0915ed02649a319fedc1340e110ba52cc14ea72c1090145093a4c3760e023f499155d96a3215cb62b1be9e0aad7b8f75f7b94c82937327d37c3eed4e3ded7420e9f680e03c2e3b123cb9f14c98c758632f2abef5cdc7b16428c7e024208bcfc9e46bd4439eb4fc6d46cdfcaa7a9f3ab4ccfa72470981055277c9e9cf3ccc3739a33eb8f3f5e1cb0eacac8ca19b0541a6f449be5522d9b0d747677c45f60cdc98a156932f04d5247e90fc87f299a1efb12faf1ae375637a8d62bcefae6a563fc7d54a623c4d50a3d42ac70c2b1d24f3166c01b2a87d7d83be81e83087adc7c79d9aa80c85c90b552986d72f3ff2027b4bd3f716450c082e66a928d26930dc7e1bf504d88ebfd923a3f256b0dd512d6539939766ff588473ba85916177b6ccb9fb16de2c984b17b85a9a06b4691af67f8ae2dfcae468ae02c34bcade4e9ac9722bb260104a9d6cb488f599dddc9904351a9dfaef0a90f6b4adc94dbef5ca73ac1ff89c23f3706665ffc3af4a008e564ec34e3b793091129b794c1a6faba3b224dab1bcd2bb8a51eaf4b7d237fc8f9d6b9d713fd5c5d9551e0f9925e72b1606128a018d1535c9690bb8be25694b22ded91509ff965aba2b220c2506495b76a456bc881b7183e65f70c847e5fff569b5bd9b1706d64731a6a5ac669bc2adcf4d21e8abc76146805d574812069 +shared_secret: 494550faf270431de90c96d2ddcb7c19249d5e85305b3b43626386c30b7aba5f + +# Official test vector 50, seed: "027c3d5847ed4470931141104f25b19ae76117cbb64b224ee424ffb782e9a0e988839e0bded0df666fe8e5fcbb5dbc09" +entropy: 048ea516d0ebbd9f709b47eaac66f344c571cf50f0d01c9466aa061a50b66a24 +public_key = a4163313f3cf10a65afbe14a738352fd20b1931827758905dc32c20cf8adf6c081009ca396f270b23a5f26117862a13cb00b65f5a2850e8252053255b8232626b5bdcfe44e95c0b7b5b09802165b5310122a434c5456136cb3a77c3c7c23fc61271550cf15122fea612600aa722c8646a6760ee18ad6028850fa36b82156c09429fa188db2ec3dc229a78f92112b4357d3681aeb19779f1785195b65469c6d3af60ff063562817c4587225a10c8e9fd56c4353711f287469b87cb533b99df46bfbca625c4601aa86459b27778c7200f6a12ac8e8bc078231a37c87400a7429c476ddf7516fa4b7e27841abacceb3c24e92158eb168cd3dfc48ade061b2c02c33b2a33b59ac45a77a439371f3683aeb6a18b107bc34e7785e4146b3f668d9565cb32a23bea6af6daaae79b39a8f725e61f1355c6965d0ba0cf8da22ace189cfd0652213501b3b5f791061ca929e2fd057f357bfaa4047c28577d2105be1616044a6383ff9a087f4754926338e486cc3e76511c7946a02893d058f7100c98bf0af514a47a7630e6e2564b5459d3b52bac6884fc32c7961a34df387ab85c07965786d6bb731af75742147304a5cac936797ba658fdb88c1939c78565914ddb0334fa291fa3182e31a36d6c159ac637a0d3a37098569a009911f54b13efc46e403ba4bf0bf59499cac06c848754903a7b8a1b7549a13b2de5a2cb106a21a3a58d1d71ba30700d74243b1030258294ee022037ff9c7e752cf0fc60f582b6310d4637309ccaa3940e6617b72c0b0217924febb6f971a56a979212a452796a217909547598330557a9309161fbf7c59004d7b3a88a2c3066534153d99ac87dc5918401b860c1b4d5e763440389290d2b656c97cb9784b201a90553acceaca0f22b17852f391ded7094225053f88b6578678f178067ac944f1fb6c2e99abd946953a49b059babeae527408f520844323d9496e51e88f0899857a07b8bf8586ac7a8d13579ca934161d10c08e3b400f084cbe9c6f21e29523c41bac2187b7470f752b55addc6250c08338bac7fd0879620023899041576191b502c736115e65977de34c740c75a5c5f54ae4fa07a2943a7f5a3b8018461445c3ce938579680b68fab41ea2bb26e40eeb13ac84fc3a38b78dd66186558426cf59a1dd4958427bbcbbc13037c577b0e0551238a67f596cd0a2627965216bf733fe88718d64725ffa4b6e73077a37a4585159c887b2a2f5077d1b457c06102cdab7a0e5752263cacf7914ddf836b0e1a95ac4b941388bf7c5bd62f616726100f448001e1c6e4100bbb922b265942bcf37966a5b61ba4957dd02c484413084985d5b22b37964b5f66c11b27c25af757f08cb8ba3b3115a6839483454239bb9d0a1b6b1bcbba5060c3ae47fd0476107919281a508e0606b4ab51ae12b0866c21ca994817b87244ae55222c0807b02581856936ec0ca25e08c7e604e1f1379914702a9e209d7796ca44879a363cce71a0d9850c8ae8596e9b7157a71052602cdbf1c2ba113341fb8b612f114a82c6bb106c703603eddf80ed634be616884b9f2bb271240ab48126a40cf7c0958e0c5bb4f73185cb41dca542888720f8f930a66a66bb9c79acda38a22249f5240a5db0067a23151a6f02abac2477574d9b5d49ed6c25fc46576ca327d614492eebb +result: pass +ciphertext: 258852ed700664326e1767409c86b549ab45251e00d64a1d830c9342e8e367f1dc43797f2e1c8cd4cf98a1f46566d40bd608996ee5199dce1b4da5ae6a8f0ac2cb4f39fa20b9d9c71335de5f0d3e7ad1057341c4b10ae98c41ac4bb60484acdfe44f7125de5ee18171b612ab9800c796e0a2f3be97b30bef0bbceeab109c46378ebefffe8ab78ec87542cb73bd3377e3b7cb4e08910e1b2c5371aaf53665679dcd90a9b7e817f59754e5185bcc76a68f476352d1ab3696ab8b191d3ed109680544484ad81d0151b976d498fee7187069c67b8d0e3f2dda521dcab2190fff6c0369232449447598c4a68a72883ba5546906f977f78d449234a0f9b5de71330978bec425839b528ed99468aafef2189aa5172a98a7bd8fd8eac32772fd7c0bba3dc6ae42d1653f12145fec4689248abba2b04e3bf9cad1d4953201cecfbe00287b3c5768136d2d9c5c18d72890998b487ae95ff9242cee73abe3005a8ea2822f3f81468eefa9954727a90b8551d9ab482f30583ef65409af625f14ca560fb3d88514b605a5ef6239f9db665ac18a2c5591fc659fa7769434f053ef3828184a0aab41fa58bfc4c58d3edc8a84b44a86eea9e6b0ff881a783c0e941ebde941cd6b960f91dac309fad4e10b063b0f1f3349ea6869c60593d211a54518ac61314ca497942533f75ba98486e0607a4c75c9ffe6a6c29bc7c6d5ce59de70a30214ef7e66c7000cf2830ddbf3fb7867d37bdf0ddd5e8233d441dbabff03e0f66e4465782cfdb527c209e559873c98db25b2d72280ced28cf2a1c951bc98d197b81f810351130a258323b38b216fe27866063809ae96bd3dcdb01890b732776556251d173770c9a3d98e3873bec11091033cb54d27d4dc585276847d37199754ab6fffb61fbac4a5f78d05f2a7873ba3dad729685686c67a6dc51d4e9a967ae8abfe406b864970b841e943da33dd8c284f5d159d7a6120fbb0e272807af4ba7b73e7aa722e81dddbb22ba1f7fc541be455e89511918aea71368c21cdc2c0b1e2989067fde5835c92766bb6fef7908a14186c7c68ae54f4e3e19bafe8c8f56b954f77c625fb1b98bc15b515c8411312bb1ad92274c9de168bd949361df97442bba52a02df06594506222654f849d08042181557caefd6e5a360e18f37ba03386c004df2c64847feed5839eb4ea417c4e0e75b5cc3db09b069f9416662b722b8bc9a0dfff96610438bd949c7b625629cf9249da3b7ee5b550812a0e7c7b6df121d59d4289c90f659a5624122d2b47bbfa6d1cfe099a7676807b1d61db21761f06bd21fef8af069e6478b9e4db55f324747863e24f52697ca20ed6870a247ad6cfa4067ae5d6232bbf1e4127bfd0f6fa96de1f9512f8c39f76500dbfefcf318ef818bf4edc9bd677f0edea6274a3a1389bdc7bda53e5fb34fc7ef0d76f367bd1f9811b276602d0d5035de19575e8b92161907989b69e90c12bce13aee5964b33cb04587026b9c2d52e9b43598e7c05a54893e7fa3d5fe97bc5bc01eb4fb267cd4b3b6d299c55c +shared_secret: eec9e658edcad5a8a705644ccd35aa3d785cc258666ff749bdbbafae6700f1b9 + +# Official test vector 51, seed: "450751d4401737459c6d93e6c5f2fbcc4a3af7cd7250ccf404bbb817a67bab7b4c9d0ef4570bfe25cf919da331c31d88" +entropy: 686c921c9db1263e78ae753b1c9c2e7936b8229dca48c0942c56c6bca4f10917 +public_key = 25b2ce04e31b6f647abde39d7b1cb988c37f2ab219c67839064481c2539f7c947a5187a850f61ba075a002e4621ebc290855c9e75818e3a99da9e50522976372ea0e6e201f8cf3c49e4a86c503c38ab764b2f45bfd1718f6b5c0d2e66181045be2a2a8a1e10becb8a6bae9569f42654187a9d9b24c8214abf933063526804d0998b89c884b1055a56cae82557455f3a47c677e8e262fe9569aca0c5b1c0cbbf768302099a4cf3960f9d432a0865031e2b65ddaa43e00aae05aa39152256061021669b8f2ba6bb31045e7e539830095216a846aa39d5b16bf69e152aa227c61287137e2b29d3931c6211510ea33325b2ecd20a1bbab9d30a7ad9bf83e3058520606641dd23b092831d29022542513070c8626a42386c8177c7bc1ffe5754ef5b3a2c41f91f1463b7b068816b058da287b4ac2ad82191d061630337d296a08a02030174a219c143224b4b1aa1324feb23e7d52ccdc757929342ebcc02c9a080aaff12763894928a16c1f7830d7dcb2ebd77837d97011001d83f3512f9578efac3ce1c0a17da13b375c44ac8c32e616aef48339c19a4f379c216feb9672c20d78262fa99887f92324bf667502517cd42b340b51ac0d0c71c2ca5d357554eed04c1206baee66707b10bf52a424fc7567ca023b605a0e160aba5be5aff753983b19938205188fb87a867b6cea58112a3323c2ec23a92a1c16b48f8cc7bc55c5b18a33b67580cd9383275e7b53d053aed3f41f1a74859f3536a3c07832d4b64d6a9bd591c4a1901c46490efd73c9aaec1466528bfda0af55fb7a28f4af2c332de8024f87567e1ef87dbf3061ad29490c658b8367b0b911ba3c3c91e48189c8bb1cf3a229146cb537958bc1b427add62348ba0b54718753acb2ec3a0783c58c8b6b1023580a3417cc08745feb9b3f19397fda09002cb019be30a8d3781c936847d5c7c5a8e9a7b5d8c18bc5877ed4a8d787a7b11a0464440da596a4250308398aa9cd482e0f685703058987b63e21c530b3b5367654bc30b86fe6f0645e328714fbcc0f666bb8eb28d7279339f622cb89b813c72dcf5944ecf68e4ce422744abe30261ed3e127118cbdc1d224e538b48d441359d673470978bd4b5913b6cf557760389b3f6991344d4b622c7a332239a50626ce553a6e0677bdeea96a3efa72931b6921a23be5cbba9f51166be80a542b5f341866f78225d50a608e95bdbaf02a599b7a2441537f5124b0d5150a19a7de9ac2de2460b80884512c970e7c700aa259982bbda59773c415844b272dc45807f9d641c9443717c61bf9fa9201568868655e0f791910b5077cb77a93e40b85211f9953014d953fd3f8780189840af9ae60da1fc6c48d19d88dfc689a8421c28f569bfc5184ed6a66a50202bcb51425202b6428187f0c7a92d2ad1e7a35d3bc7f7d7664cfe9765d217f766a3c068149964b7c9bdb328a7821a9646ad53a8bded2912c3c714ec81190c966c703a5b9b6bc74c89e2e0635d614624c5371efc4099c00576d05aa5552b862455fd14641e1e80f4b468cfca6cc37e032079617c6cc3c7cc68bc8fbb3329c9e28c1caa811cd6b8bcde9ab6ddfcc98f9534f3d7aaff2a508b3237070c39e22b43a424b2af4ea59c9920d24d6cda3885cad8cbc7a2e3b82554fefde1a383c558139f9e1808c824829ab0e +result: pass +ciphertext: 82948c08334a2c9684b91b4a759a0091481dc5a3c3b19a22688040bdddd36248e8b41a96790d155324a2bd4bcb600cdc60f64868ef7bbdcab3fd549f0fe04cdc8197314e6d688ad7ca05a492f95ed47bc2c79b2e547b77b2f403876c0063b8c6e0f7a613e2168a8b51585396fdcf250d7846c89ee8d4bafb1a81b1d797f10be40042339e57576f3be7f2540d31878f6c4155cdcefc60730eac27a83ba6945c38f1871ee0bdf60ce96f0b2098d1a0ce84881c4850c3dcdd81f14d87fb8e5723eec26966729b90445fb728b52d63c7378b976f781471b7ee614cc3dda55e4dfbf44dec1c772f559aff3baab16c7e333c6a573517ddfdc3f2741c144cfa3dec335d662d614340d19b2b8899453ebd208fec0a529112d5b71208336b2a327ee41af51309dab4e2bf4ce56542ab15b6f502c0cc61b0b7cda523dc6c4f85501ad788f2ce37aa3c26ccb6b9655026569ebdbea550dab8275d6acfe5fdaba77968235d81a9622c53233927b22d320edcaccad05f5c48ba398e298d77fd1f25983fd5625776d5ba3e3090c53f9e2a793f7873eb9eea54fc4075034a126a2e1124a4f843017f44401f10af382db6e67373850cb36b6ae5db7beb3db7ee690b998d7ed5c4c9eb9307f2916c3dc303e8e21d5b313f943d06842c41921e559e496a996391cf4cb1029ea5a9ddeeda82760764a37a04399de11265ae3ebf64b04c52a9581002a0b7caa34793c51ff74a18ff8c34ac83d97ce45530ad85e3716668c4fdde7715c5fb5f6806c64d353c8a2659d993f87f74b70021f95f06c50e155f7c5015d9cd6be713d758d6c7bc186a5f9299f3d8dcb280af932a0f90d152985824a809cde764d648314ad108f9de2e9006e6757fde0517bf72b7a8b81b2e79e4538de724b878cf385c4fa599bfcb984191053e497b83dd6d2b3c364edab43ca296a490314ad86795547872b64b58d2b57e4c39851892e3641b3316fff304257349389d5429a7611c606fc0552cf62e434a619d521296dfa66d368b3a0d17fdfd4b7d8c796b3e2d3338dfb3ab19ed43bd8011cb1d279eccd6cb39b4a3c63a7484e73215086c21d7f2965ec89d496ff6dc79378e6db7c678c2c829c68e7890172c5a0c9f63a5197c65546315896780cc92986b901594905933e9c777e041c94d5f0f5c53625d5aa00c99a0675d58d3f7ead5a866b850a93ab9b91222644fdd9caf14627fdf088f2b252274a44cd9e606fdc5d68bcb4a56667c84b2d8f1f4f51b20e5f9661a7cb19896bddf395bbfa6047e958653598df20d0bcb2182b6c9ea4406a37b2b6dad5447579981b5dcc0606d84398e79e8852e9424689bcf40adb811fd60bae45284e3c15aff38af28e018efefcfa8cad3e072f8fab8e1b31574bb807d31eb88c64000418f68884aa86f5469131bb78c897c9da19fa172f388e74eade31d4d234e84512d5b7ee239625b5f440f1065116c8f5d40e99c1c9ff8dc101d2741e1b8b857cbb98359b1269b738837cf5ea7b84bd790216213193dec928ba234256fe20b87b4 +shared_secret: d5c5e6657d310b0ccef250c9664a02c846ecb241f2404ca851d8219f93cb0d27 + +# Official test vector 52, seed: "5de720f2d152bf4e1f96a61e7ae5f1bed6b8548e32638c2ccec9f43b87d1bb43dfcf334f0582984d27e440d519ab662f" +entropy: 2387772e50059cabda53cb93ba24b19ae529496c03b36584169451525c4a0e7e +public_key = d9f945a651693bcbb0c7a385928129f004263fa16bef92ae400780966a8ae8750e574947cf6a607fa4b3d252c77cd9925ff3a89e762378ebabe4c413af52cf969068d86acb44683222f93bc50bc8f7058def77a3241173222359d25c3a87c817461210c6e4c30d4a428bea8b2d459c4d9c71594c597fb9c3bd17598afa098329bdd15b1c23222f0f39189fa06319bbac7d6866ed7953a2c933b3479235790942d6146a818edfd64227e78bb47168709bc5e490291234929206a3fa1c2ec9359888641d61897927f0440929294439095db0244a05c20f9678b69ca13268622d174a915a210b8908328b162454c1c0c3c36b8acfe4ba2c38e0279ac15898f393f01468eb23a8db1567ede8b493608d3194b2f2f82e91e739479c35a59267a1c84fcc5a1ac12289b3e5845d0c8e9969bba50211ee716774ea03514c3b7359892bd4b8d9db4fd006af53961687e5b0d0fb9e16fcb3764b1b0271b9803019048048cab04e60119c8a140b401cc8c5f5770863b066429e71c8ac3751536dd3cbf4e775c7778c15920849d4b1c1b6ca9ac63d3de47cda549ed009b4ee7759fdd66eb5555b199022846671b1a819aa732a23e6bbd27605b1fb22b1aa71408b2e55bb651c1a676e13a8e9cba2b65b246b6683ab20820ff40eab949eb219851a7c2e1bc1a4cb7b06cf526bff6b1ecb4b5ae4d05dfec33de9504d2eaa4538dc9b9bb39b051ab7d2239ae0b98a34f55474871cf9059e9bf463dda3895e32c27a534737677e40527313ec993144841bc756e9222d756c3c22e56ceaf336e107c3aeec9b1dc71131271392b4a4436a14292aa0e24957534856e30ccff827cb3fdb31aaa086298c59ab71278885308803591513870867a018e61d2705b48210240739ade4c7100210bbbcb524966a9123aac92cd711f5da3b5b614eefdbc39bb36cddf47ecb196840ac84a6c721f1fa2f031c022844a64c4433f414a707992200b857ada964d17c6ceef31186c248adbc83ca2a528738ac567c4c8afbaf8ba57b3f42700dfb8c563b5e494c6679e69acae47a9bb14c79396bfa2593d63224e29cabdd0991101496a0380ac19b759cb0220517aded8371ce74667dc827c1141a233709fc47bd5ea6664c0b6c2182aa9a088df3c92bb5e6047c7b03bd9c4347db41efecb80fbbac90662c0d56b8f91b3f3b7b3417d592994771ec3695e94cc3ac73747f279984b7350ed9b9400201ed35b785f0629225af64b05bb5b6016ea50a8689c9ceaaa234748400db67ef9514e7ba63c683b4f5f6b35869586f0058ba7b9c4bac500a0034bce3b2bda7c5fd5c8ad37c6466a9b877278b7773ac79809222f80eef341236053ad1d0c95862796a9702fd977e820420d611c66163c5cd6c5fdabab7ec96a51bb24328617e375367ee616ecdb46089c6604909d055033d53d828c7f8cd6de0823022babcf521aaa67959c1881161620e397b0a25682cbc805a96a84bb84a9a99acfb6012e2ecc2e5bc1518036e40dbc3347caba399178ca912eb8367c86070833137d1bca5b5b3186ad23c2e76a4cc467d092102ba081494bc7f963a9a6ae575d2c57a38371be5b164adf29f392014d11522535b0173126bfb82721e153e74049c1e170144484dddc2716b4c487aa0398ee9ccd2804df58fab8e2d32ac05bf22a8 +result: pass +ciphertext: adf7eabf19b964073c8b23ebd08c9c3224a3a1d1b9bc80310f9b817c153fedebbfe44f6426dcb32acf9fcfb9f49521cbefab676b0ba60e476e6bc18dea3fc67c6acfb042f592a557630ee0152db0add3e364044bcb910ceb0b79a4c7407dbc285a7003231a8d4e3c044a84d2baa164949369becc15e7d91384217dad6848424ee5d80b086f1612969c1ad430876d6b9a40a9cf3bff43e508cfe569c74e0611bf3b83758116f17b2ea11660ef51df4d20180c9a786594016a3c8b5f88e39fdf4981a629c2c3f6ecdb521a5d1556e8ddaeefd1d1db2fe5a4787356a949ef652e84ee7c447fc020e8d8fdc42dea77607247fcb55d20f1ed3271adea64165a07279b077599be443f4db254cb8ec45b21010935b543401abf91a50570bf3bbd7f94c0e3b6579e6d8b1f34520de7cb471de174fcb3c1e6380cf7156db6aa4fa483a96297842342dea8c5d0e421958942e5d4b9d9a6867c104b5f21aa6f02398cc1db26304f2bf29c124e3d5c473b5f4b2ad79a092e35e00f7ab04f4f42605d2a8632432183c24f65df8f5fec2a27a7b65cf7f2705aa9f6c4acede1f407f4fc822b60ba72f81028e4a175683796f5cd7ab11bf95ec66002670a8a01564e276b83d0ba30ec9739e917dff07478c65b931d839cd560d3756c1adcd0ddd29af90a5887f126c6bb0a27ca5c8f2c131eb7f57b876a8fd38b53ee7b3aaee459c2cf10fef41e9c853950cedf0343c044392a4b1ec58335abe2a216466e213618f36b58e1529415ad8dcefe7eca63911bfba0a27e74af1b586e52ce4f1efbe58e46259bd6a82239e58208660889c533f905a7ce54f94a97c10bd85a8a30ab219040261f4abe3c47c2b356e704a626d51c316b5ec7a180bcb41c8ea3bf3bbb846a90672571848ffb6811869f15b3317fe836436f8d758eb0393a277e4888ff85fb94b878bd54717fcfd696772bb815781e0f39eb57ffdce6abbc4df932e9d4abf64cd6ee9619aed5b4660d705fd21338bb665683c69a0bd84e7127b5816b69655e661f00095bab6259d335500881536b4bfbe84fe75cd203a7cfc595df1fad1d2a93858f98c8eceec2c1b20dde8e0dc33f98e80636e1da8945e617a47339527acd51110e74bd90148d9d3772902b879ed70d89a0370e884f38fe73aa2d51088f384c5ad2786c2eb9a9cf1965438e9d15363fc1d4cd1c850af641cc8083c95687f38caa5b631591d26a753e8413d779cf83d254180ff636207b242f9ea9c9e2c73305bb1573dc463c526ee6305d9f1b45d95a7d0ecb917eb9ded46fa43884d1f50553b4edf08c02734cf289e86649d524d5abeaa8f5b3562e80c87658dd91e66e7e55502de100be9c66bc2275c40d9ea2fc160d6178b6526dd663f798c10cf7357d8df32f75a8a6d70e46bd5d5dcdb52aa72a1be365d85986f5029b18b15bd1bbb413b8ab84ebd87aa309fcceb6e30992e5983327c033556028d974ffb076759825dcb98d20686107c72d333d0205b201b31f2963c0f762079d6358518e9e2f19351edaa5d5b426c0 +shared_secret: f62460025ebbb273f00207758a1215c3a8053d2ac66cee11c6760aeef7e35d24 + +# Official test vector 53, seed: "d71729dcbb27d7cb39e9e905025d3e55c8602efbcc483c9b866ebf82326157833169243c14550ad728bd1470f39c642e" +entropy: 155c29c5f0378df0cd0e847a80a07143cf7522fcd880c9229eb9feb1ce340cd2 +public_key = 698035eda89cff189f730a05dabb3254297561072317010327d4222de388a7e95d8d0076665061705209d59984540471fc61032904b13dac27d520a2b7cb653a68a46623316557500cf4bb6f71ac9b5ca17d45331ff06507d5732829af25417defe7aca7364d99041448328f57d94f1af2572f7468da3b9f2e432064144f0396c1a8d95ce9951530a3b33b092d67590b307944095c50c30762435b76a5dcb3af494a5b112fee2567664a376f3b30c32172059631318821de71ad62b0227d9a91530a5ef2e6c2ecf925fb95302598b722a991e989a1fd198836fb340fe44849ca144545a5a14b46f464078529bb6dac09d148949e91cb0d7912f8701d84aa48ddacbc1aab0a4eb63f9ba41465f03f1bf4b4285cab3e315acd8a3f79c465d1d31fb50670423b278f042442e2b5797483f5a2bd21e83248e3039626006d7124a324281545b8c4356396f413a1fa67577c5d15c638b7d23199aa5343473dd5b45b66f41d451358f74b82a3c18627a60c08513d34e14e3f2a4b13d7332fd8014ff817077b7ee2db80a9c00eb1da79c2193201996036d214ee7b238d82afc2e3a226159ac05240e6683ad00a55a006190a279e116626b4f70fe345594d21a8d54b9017a76d6e2a61b9585bd5e378875ca26ac071d6b1546ee99d716cb8587b7a4e184c8119cb3150611389a8ca0bcd1ab6a7107942769cce08c00174a19305d438a7a475f2a29b28d230a016479f8aa8da24273c15094d3c0e10a8a0f0d3344169b81ca508e6cb662a4ba28c8693b9a27bd46a35acbc27a6b7cf30292064b4aef36bb29909af11d8924ee59af80b5871c2bdf0c53830a360688ab31a94cda3b12c0f61ce341bc0566ca6ad1cae54989aa3083707ea74680ac1fcb254fe3866bc9c7fc33189d3f4299a8a0a985ba3fbd51fbaa45d26aa352eaa710826aab8f600ff8a9554c842657a3cd2d6588f42063e9c08e9955ab7f3ca032b440c7889595a3454025853ba4070f1cd09dc26392b2657c526052373eac80c920c58c3a24827456be174842ed722487c64373b2457836f13c4065dd7b555f3914567cd87426e1196bb03c08c7a77c77d586f18e9603f45b1b9675bc62a4e71f215c3d7071729b0a8e9069f35ab73e55948f9c3e766c4f150394716b198721676495416e54841908cf60148a7104a4df00f21a10fcf508ae9438ba162291e5245afca757ca88ed577057f543921f670b262a0022a4ea4044318a4b1af8a99cdac8e1e550b732157e8ea9194970f786665c817299a7914b4c0b3394a57adb179bd3067897421a09410a34c658daabe6250047bf15b76f826bd371f0c504a2cf9106eca67816a4865b60a87d48ef4753f90132663fb26a5fa08c59394b6770ab13081aa200c79a6802ee826396cc9b3ea9cbfb482d601952752758cb7cd18605a9336735ea2322bc82b7bca773be27f17bb8726a8cfa9070b9aa6a77cdc0b64081cbfbab45c4314f855a953231c6fb6149bab90707b87239c2f7c7103bb9b2532180bc1f16670d90b7b77c6028c4d4bf92195ea54bee1150c25cc363c57f812a0754c9bf66470ad820e12133ebf44810b7318d2a79e5eb98c17c40b0ee10179f1b5b6870f26d27ebfb588f3a0d02e10a041ab4e3b97c35070f0da64f7e0e7076ae69b2ab51a956cfd04f8 +result: pass +ciphertext: e7a99c20e70cc337043c1fb4b4652347b827093a693543f2b31c03c52fdd4a2375f5a66055969e0754920a298b5335298e585c0e5831869e8714ab1b0f0d8a2dbc97d79bae54357dbcb5858bb60f55c1c739b63cfa0b57e6feb3213b5a90ba8aa94e1acf57b3fde306a854b28bacbdeae3b0610eb3d9595389fb2e29288586b39c6cd6cda86845241ded3e227792bca133a7f6b6bd2e03f5a215c63f0c682481a294b92b984ad8bf63dcf25f20dd344afcff545d8c89ea41ee0929095dea72aa2c007280eb9e12e8f7df68f43cd1392af717f01cbca7059637c7a5b869a5b3f26b1914ca8d12693c5b452c77c7ab8490ceb84a36066d26a84437fab7822512186d6069ddb363ccc3a66091a6c438667d6e423eb785b37be24c0b82524ed9fb67ed990311b010cbe63c51f6b0046c054bae7001439e4543d25511e9ae5b05f9fa0868ca7241322800e6ab6541e228fe2c4403863dcdf99bf3f01c117ffbdb4093c3fd4057f38752e878273a75567b5d8d7d23e62b7c9e478b12d8e0b910ed1c67377ec04496961892723109034b45dcac6e6d86128c1e6f7b92c45b695431406420ef8081534533182306daded5a36f9243e069914feb94fd4e21997c7eb259c4faa30d90e28bc81a2ee5033b54d1304046d8f110ea7e4008b4bdbd06c4b3031972164e9602e83143fd0640e51229f8243124ee1420d0895e30e19f4445553d236b48e65ba5f51a60a54d582e78b2b79a8f62dcdad61f33853d990ffa97f7e9e5f6a1882ea1c97efccb8c24737f897862eab1ad1be87bc7754cc69806cf53a123be63d6f08cd1251388fba7511e8457d8ba0c41410970706948cd42a73c534ec4141d408339411b480c21e60e06c4376fd0d818a287b9b2e235f7d86100aab7f3874af278561e7cbaaa269417fafb4ceeb0b0d08260db01e0b346e8e048a35508f4d888fc39d7250198c383258b735ef44c4951eb02cfa0e70d72468974a25a93858af6926c1c63f3ebbf279b8044279a4476d5fc6b190fd85d581138306b1340423bf70af7227698b740c5e106828591570269bd549cb6730674394f56e56474b76930e117dd16816c79923c31c1be831256ea63b91a4c0966bc15ff4e0abb910d088f4c5c6418c356eb076740f8d3a114584b61a52608129ba0f956e2038e9c1fb1d69f1757522c45111e26449b0f55407d09e51d50635ea272b18d029632bfed44272347b5d3c99b077ee34ef4f1c21104d9341c44aa1607eefa47d39b6af568f1615410558dcae8b7d546e0dfe88fca027d4f2bd6f249c5ec9b222a90edbf0914dafe124a56861329d09f567f8ddd477d8d73fa74119da2a40bd27a317bfc9ee8d0f2892cd201c55615466a68a16d9e39c107f053600618423a9a66e9d6acfb310c327780c47f72f45e09d27099ba53d4997aa14b5111bda61d5692dd9f73aaac26f07b590662dc5c99f6f4bb994861003dbf2d48b90da8860b911978b16098fd6cd7eefc4eeb90791486f2b4bb36023f1538cebcf9798a8ed2cd31758928 +shared_secret: 74efee46e7b26f5022416ae9bf4a52a3940966b37fab0c3ee2e8fbb24ded6bf8 + +# Official test vector 54, seed: "a7c2c8edb3601396beb2df0657ec82fd5780a2723581a9e03dee1cdb018440439bb1142cab0487c5d136e9af46338ab7" +entropy: a9cb9a61a3324b1ea5afe693b32784e2871096b2ca14a11acc9577c52359a241 +public_key = 4981b339e1a1368287fc699e4d50bab5ba45320968fb7cbfb358c92e2564944571591211b510a5b044663ffc7deac3546a8aa060537bf36229bacb4c5d918726b5ae7dfaa45f153f329140106a80b3c54eaf273384dc8e47f58e68621f3be905ace09a76ec9839ac471f9404c196587cc95d90166a247029aae0802ae3cf6983355b330bc9c6a4748a6130aa510ca1afdb876ad0d7b2653c3c88079e14d7898ee482f34651b7a238f3f07bdb4989740861d358384a4863c39b8912259bd78653386801d2450cabb6bb7fc287c74b2cb24c5688b66f7952c289eaa5051b938fc833f343c273652e4a1a6ee6c35c8c8131ebb63c82d38046b41343fc0fc660168931c899088c92db171f75b1f691577e09ce56435ab060c8fc084068133cb67cbb0fd36a73d8a21200623ef324256b99b0f60841ba9cda515f62a978881318fda87c95664e4a5755c72026369813dc90c8d6c18f48d61c10e49a7e9449f95492f0e4ae14f6969b654fd39bbac79c7e0b507559d5137d2179b59b21dc60679cf1b455b94208d87514c008898a95747ca9b530164743a6f9f1878f7badff6a4b2023ca367944f288a399c52648f834c28014b0f921ef04127ff4ac656196c034c0db9a7e8ca64109b904b2427fc601732c12241cc32589790e3bb71d924c184edb521d3b090a90ce0b296365ec6911341ad4d8cc7c136c87469f1ff101faf3488f89b52e98b920a659375125b48c403b4ba3175bbc6cc5a2ccc206dcca0440d54c6dac74ce4674e46444dfb4b5070926074c089c28c5cb11cd4c9c715af34aac79644cf2ad471213889c5e7ba92d114150233c673e505376f21dbc999997f43ff9c3b0f8f1b3dec09a4ca3ac581b9192984e43999f0d34aaf32218b02c8aa2f21c579457f204bd18191811e7bd6e4aacca5aa7c6f41fdd192bcd24760a2243034021b192575bf811e1344a25e1629b019564c39b09c88ef9b1ce6761066030bab14ac202bb6a8d858c3fd316c4fa81d21904ae691f6fe7931dbc93afc09f18f3b278e4c453ab5081372c093a9a38ea1622379f56397ec6c47cb7067fef7225c952c262792dda68135e45c3c6cbad23593ffde806fecac55d682fb23839b37186d4a40b83641d9214b7e0490e305807745534de18b9d4bc5eea755cc117b68b7a30f76a9458708249f02dfd59691f0b720f257f1f96cfcc3573c5696ea33017af14a843b81ea58821db21b73a9b80ca187685dac1f8735ea219cd01c6688f5bcaf4611fb3b58ad65b8d7c8ba4ab950bcad9b23d5b2d0b718397e111feb25f1739ccdbdc5c41d943e977aff5209134722dd3d54b923b511661127b284ae9ba0c27f05aacb20181602d9bfb32c3e255e7f48735bab94e515529a9591d51be015a009a9094591c7e07a13c57e636b6e11cf4835a8180895a6581507805a1c7a39ab05633798aebcaae89e37d8d75b4f34c73c2184ffb567069f0b3911943c2060f34f10f835c8233a34b5618501aa36ebf678dae07af9a567ac7143567c92a89a94a0a4abde383706ccc3826a83dfab8ae7165c6c6555bc77a43b5b3b2b590c56ce25e792796283737c6f5b300a0cf06e0060e1634a434793383860d84a76807c2983c57522fe3f988486bc386cb335ab55689d6b449b7a38dbce911f512e4f148aa1567 +result: pass +ciphertext: 4d85b317eb5e6bfa5ef78c31fc794d40b33fb3f1bdfa125bc5372bf84c6485f60b0e4be11cc54a2b204c1e2f67820089ce68f5eb96ce78361612f2b08316c15c609dd8dbb0f30b4c25983410a9e144c7486f348036949a892057eb4e29e23a7ad87eb5219d5a684e116f34af7fc3b5e37e76d4801ed34f066117622cc9944468109173b105805c3520de565298b2cbb47dd0343faa575d26889c032b7a53bc0a9f0c90ecce39eec6b4730c370ec58d959091d06472279262b07129610e549da8a4fbbf7dfcd5fceb985e7c27a15e78d1228222ceace2072d10b774f5c07785e9975131eef0c0abd43b98fb34502247cd7cf239978224a1a805e60926641bb20adc9a94efd26be6853eff0edc12228106ed7a58fdb150cba5ea1b68fcd58f8e65781f2b5825b0c8093183f7f6f92b438c5d7e4cae70a6cc9fb9a184ce0f254dc84141b80f5d1d2ec7f2442f49d66efabad3bdeaf4dfbccc4c36e1b4118b42ddd66d692cfa64149e1cc204635c152a8ce0020a5ef8c7032da13880e8fd4297cc107c84a1fa6674049c4c1b25a4bc8996420ccb7479eef4f5a6b7b3320b0e798e2f36db5a2be278b430ba1baddceadaab67faf9cdff46b59b3f1b37257a63462abfe731b5f6ab7a59d3028a9efd88f93fbf50f108e2a1f42a2681fd1feed062a512c3510024db9f0e9bc4e110a2642f15d84a0e0016727c837d0a5ddb357a4f3ad9a926997ae405fe1284ddff6901205440b2d675625e1bd23d8d11b9e9ac03c5eb97585b995579581df5a6c69a06f6d9e09db3a356f4227ccd069366a6030d74508a20e936ee586caa9d649fddd1c29c02ae0488ab6309f7a25cc81f246871cdbce087d7e01b2fc1274800e6ba4a263f29c9563691bada0441202a7b065704f6aba0d91c5c9d4b53ace1ef361c39ed34bb94aaa815eae25d4952a0fa45308d871ea49fc8c1ebc5b6a0a93c31dabf41d5f3097a785143839b01e218495c1d075183f35181319793254b56c29e3f02a4f220852316f53e418a6aefe8d0dcd0fcd601627f09a39a0f0ed8359a4482356f7050c09da53f2b74e003d7c2e7054353847f772fd9edfd5f2565796e128a6926f3f053d2cb146eb8871a05a1b9161cca78559f1712bb9e004f0924c1fe51973e7153050592363a93ad12947ebc73050fd849407282360d876351133f4d37e7b5fb51baf97b9ba9cae783468558ad51717656687947684bb61b9faa87519eaaeeec7a637a1fc93cf63da5b2f6d53fe878b2543fcd215be1609142e3b23c51099dd488ffd3b0ad68302127ba97d062f9887276ce45df63d99f494b5fb22c467b674954a0c68bc85cd053af86cd1704e258eba6ba7812cb2b9c9a1cfabe67d52b7f9115773d3c4e3afba0fb4bf7b9eff6f220cd2a03d4cc7c5c9202fb4d80ffb78aaa8cdaa1d8b0a603bac25afabc0502a455005eccb3c24e2b4b05ce8e29ba69f52b3741679c359d62a1f4dfe424c8e77a5e7bbd5de5499d7763a9a709d828e6c0b144828a88ad4d6c5f724f7b3fa1ba80ba6e +shared_secret: 92fd1bb6ea9f1a0a195b3ca29e457f4b3f401fb4521842196d9471f50f5c7249 + +# Official test vector 55, seed: "467f6158cb86b724039ff18c47950ae5c49170163c910fc9a9b30141f86e9c06ebcec91497bcd156d95758c9f0c6ef91" +entropy: e99fbae8a024ebbbdcef32ce213f6aa942e3eca925e5da4c09975d773b33a175 +public_key = 5b19b76208b41eb99b73d2b00d7884ac289c5b4632f8362ed9f238e07a34fd7b3acfc5973070c83e03b9b45c65f8eb64a08b88592b6676db235096694073143ef758fc84c9d3097266b66c9c34a6c5f876779936e345c3a07614e2795e65c0793ef3a22cb65bd06bbd90b391eb425223c2c395674d9841109b6929d353437dd49c7cd50d781cab5850363865689dc8bcf81a80c4269a05060965b80a56081c186a2f4bb00e2e942863fb8e507230c29215c98a78e37201c263783f703b17928f36656b99f9cfe31917f05c25f57063d728a4e2bc652e4193e52877b7310f7260a1985985c26caad60c9e6f01b54be183a7c2ae986ab2a85b33788674dcd42566b406be251837266ebc6261c3b62fff702f10298119d414b580bb4077791b7096a7471595d8659614c878d8097e7437503a7c7e058a3dd295d34ace86b9302b901100adb0e6140cbf44161ab33b9aac34a0dc6f1faba14d259c546c672ebb7f528a010d5585c21c00c4b19980c6490d76083a77b8aaebcaf7917a81b55a6f2a6be7941393d0a9ebd2c549417f38682def039b4944cbc6fc629bb3a3ade353ea2005115a665087c00a4b771ef0490748b370d8b4c4ec37cdd352562a11479597d8035c00824f48805000778a81d6a31a0bb8b6201cbd3149ef96428c79569c5cba273a9bb4a77eef98bfa54ba8267bc42c643c29577b2bea5802ecc038ab70fdb1b23d9272b7ec30cfe1791126a185c40a77c57ec3088822c808ed8b1866068035590460d6a9a00c50db70b19b765e7ca8229e1a66f4fb52d752b515eba35f64097ee85399d78ad4c2cff7935ccd269731ca2b3b3217a22203e3b9438cf0b396fc99b6113cbb883c16869bb114bb1adcc06863738541acc61458ec9ac98df381825ca80ad954562ab931d1bf47a1c45a5c1c72d90cc2d3b4cf6135b8b5454ec4967523ab82e9aabefc89780722b5aa12e47344bfbc8c3426802c77c02195255e71555d9045bac868c7d45c06b6474bba2f40fcbc480112176a83ce361dacf2b386cbcd270456e7563a873c55d752151b76b3fe3c3233c5199011aead401b88b9c36efc295fe03dee6015b1ca00c5bb06dfd2c2848125af903c298c5f74fc4b9937412ac70aacf07fb99488c797287c04335821cbd6475e91d66a7d89c2f67285321442c4e7ce61d0212cc16d74c211ed2a7bd829044ff82491d1cb1746430603a0091110f626804e0b32edb0cc827c8ba7c36f87cbc67cec250f65ad2fc621363bb715557848c5a01b256524271be7b6956b72be644aa0dd33925f64bdd3481615246e95294196d6af1aa5aef6880ce2a609715b50fa7737be749cead7c84977747924bc25792509ca7a931c3ffee7341547913ee695f8144afe83430bd5c96ce61f57610f78d6c64c3c33b468b6f3cac46f29b60f0705ae1a05e5c63d21a62f5dc7208d25a7f0c09d8f77a7a7a03d51d2061fb13d9ae97386fb6da4cb6fea0923937536511ba8ff00ba753897d16b76058a15b5c706121cc792076ebc2ac1ee492a36e65d12d23f6488245e998457d4337a2c62c731afa43085a94892bd30393b1c9fcfb380f9815ea491968d6514b8707551443fcdd5926991599da552acb4a19b6342d309b5027cb88909ffc8c83b1778d8aa46c9d07aa2594a7bfd47cb7ae1 +result: pass +ciphertext: ebc5501fe8979387772fe5f486b5ab466ab6080f3c0c2f1919488c60d46908ade6243b7240e4b4faa38d3ff8a7e5099f66a0a4cc90e696b663c995004254ce33f75092abcff3dbdf52ded59ea137444bf4766a108e95db38f3ec150c2e2be33c9357ecc6f1aba15f904c66873ce66c64a341f0692de732951b43f756afe823496ee48be44b0e5ddd98db7ec401f872088dd8c570e74ede290222efb031d865559083c7cc2b01f1ef63d3defe0f186258b0e1f3a750a0888b6bbfdad4975a1e3d2cfe0370257bcdaabd0c9661098e6d343f96639017a2fe0f8528db5995e9471f4ebe77f12ff032826690b3b9137b43946ed6a6e9fc9db0d3682f18772c9cd369c30b00f66c0b2c3d912401e83fdd1c221e296025ffc49c9a7de4400fb1e05b4551b96f6e5a760730fa998834355c9ff8644620df83735101a2ba982010fd456d6279731798ef26d179582bd6c2404df96ab1402225b8b5764caca763a3a4828712d48def1968e2157c6a7a15ed1b0472f0706b59680a2096efcb8595e42f1ffac5885da71542072624c8f480c1769fb420578146c118ba21e93f9712ed3c0303e631e4a7a5aa2d6f3b247d948e27cbe2d44e2804c3a8e9dfba678a0ff44c201945c0a46cf31bf8dbd6dad5a323e6f4ec52cedcc7c8c12f03693aa0a4ace4e21af890467b7e7e876b7d45f22120bc5a6043b1a8c322f035f16d9bb5d3a629b1b783e1e44d2c1205337077dc68262179c290bc4a2f291110e8bae9de1f76f45eed9ea69f01d692c25e8f33f66dc4acbc539ad9d5a062616c7b1eef940fa546729b7ee744d655fb21ed346207aec821bcb8cbd8b71ee0f46b2e718349b6c422547feeb0fb7767403b0dec26d3dfeb7bce5cb6837960972c53cffd753467cf88088fd5b88ba493244e593e5dc1c85e6a6934956719b52ef9fad4ba14520631a12284d85ecfe9cb93cc87110e6ef5623e03f91848b67d609fdb6b3867b354ab4ed1386af75182f78189704a470cdd8576f5485bff21bfa8d87e3b88e50986909b3833b08898ed5b7e46312364d9ba911219a49251410e76e0dd66aa451ed9c07c7dda1c7c7670667b40fa44e5bfe76a101dde80c6c411f7c1820b46ec9ffe2bfadd029ce14181191594835fbeef62eae04cd00537e6d5d743a9bcd7eb5b52bac2207d7bb3c42a631f9d73fb82948f74c2d0c59d99a366b600247234f619b609f1cb66328f15241d5908acdb63c905d5959e0dcc5fc83f7d1b704274ed17c2582e651200e70f265d816468fa1b5683a4604f7cf72d57ff9aa3c698f02de106e64d99b0551649bf519c43efc04cd8c1750265473d4a1fbff0b6597d670e9aaf63b53295ccb483defa0b49404f16fc18c033dcc1c115269c97eb7c44b89c76be473a94dab492b2d98c27e418671d21288ac7b7f82380c520675140f018773d586f4faac79a08cc50bdb525d138ec4bf6a0d730e9f1e559fe9e1158509001cf6d66cc4994c08c922b6fddf40d493a049f8f587ba0adb83ed5f045b82598eb7d2e6be9d76b +shared_secret: e1a195eb1093af69edf107980f94adb3058378cb79dc807684c26c4ee1308533 + +# Official test vector 56, seed: "687c02de1041abac7b2c1e6ec2a7c3375552ed5edb10e3a8139c24cc76bda44d719d8121a81d47a0b762b4e9eeb85235" +entropy: 67a216f37d67f5e74f782f1badbce1cc8c80a6130aec305b421899a4faa0a6c3 +public_key = 3610631d29c37a90908cf2c89d075928ccb3b9558a5453315acabb5a228d0abbb99d63b0294b68594a0a648367fe044e14347073562aeb475c17196a3da38896f2168996ca917a0423614431963b10b5a0d3b228aeca3b26363026d1a5a952b5333cadf79a59b93b5ba484bbe4618b41756a101429cba6407b44a2b001108eb30e92d60c093b4abefb63438c481dfbaf08442d607088ebeac83a950623e057c99cb0f9e31639cacc82852f4cf9bcc83228151b91cdb0423f610552b0c170203c7f2b345443bd7d274ab14cb67b328d914366ea9a220cf46333a41feb5193ded4a5d94c6e0a43bdd6b2a52c3c4c718591f11b32ad64930a638ea9f217e64a9e31526313133c02b5b0cab821544543fe24aefce70927d9248aec2937385c79cb85df91256e176eaf3a239b370d4ef56a90dca3935507a6a86d84b021312bc718662abd432c08bb4dca3614f357321b191a8522ac109a643a5a9a63419be6845e5f5837b6188de0c779fa01430b219470a20da019688802ba8440c60d8727394114db10343fbab0993ac5d967b658b1551a6570f7d9b283445cc278298b4740884ba72b338c45249ab74c84a1435a84c42533a0bfbdd0509d7a3bd0b0635f538ce72645650931dbbc6e2850cd2585214f5cc12f2a2d9c2820d6c0550be79d5276747e2c04bf976705227c842b872e294aff495e06502819c6c92de3622ea968b07c0646dc0301c009fcd5bf7f19a357693e032cc46b4777a1714d41a59bf07721a2490be2e3cc7e4a04fe48a8db361a5cc1390d921325875f80629c2abc4d468a40d9c22911b9bdfc6ba986b9bb7226227dc63d75351fa4613de3654475c5668d651f9f03a386179cad00100b35343f48b7e36a79dbf979cdc734d5855b90128fee10c9bf40acfb67332cc8c9ecc4a3a9a98bd30c708e7a630a0909dc8ba2b1721e42250b83623a1289960e7288758525d4088525ec25511bca906930602b5ee1d127c23205e681c9db3474aa774733100838b2461e45cbd603c3a74122b679cdb9992063e089d5acbf74b03469a3ce7993c6b978313a7a735e75bb94976b3539b4298cc47af58425c24310667b1315baa5937741e35309f1c70cb8c60e06ae1793502a316a276b2e21087305f453d8e99d08730e174159db09324e4cbaa067cb1e766e455a34159465bf1138a285cc386502d698538ac63de2f496b120be468a952b02c5dcfac5a997023b5b3d98691572103e158672eaa0a4e4f44fb6920ffd874f52748a630aa41d188ece499aab324e916079b3bc2427b35896b26b0d2564b2a875881a074706713d326306fc66efaa1b8d4cadc7c85b7ac211c4f61f68a124465397385b2ac7a09686935cde06638f156e6e4670f963ca82950d3207889446be69e2a0d7cabfb16141868a6187b5be7977c354fb27a8c9cb8197565480244bf296692a02701580a2b4ac4772b13a27c869123ac3b6cb6699698c11261f657ffb6c8d78102e0c60c004c0796f319330435a29abaf33dbbb1c566aea10349981409ac31c18aa48631a1f0657116821a2a36c2403870a3787a1e3f36349b3373ae729a859af3163c078c38ef38c464ac5ba1fa8150d9093f97c17106c99c632bc42a5ca0595508bfa7485b23bde8d12ad7bfc9c10c68374b70a4a46655b5a67d1 +result: pass +ciphertext: ecddf4bca1ddd56813da6d33fbdec858e5623a15168dfc3e93d9114285eb4a7c75ed6c01bf62a6a1e9095e840348e68905092f8e9907a4d07f6d49c99ade01b5e5583cd93eb64695f695e99c9f646f335e37db423ac1c5376393195b6581ee7ef8db5a28f7e9dec1e0409aef29065c3b3f486753ad9cbd5491508055aff32616b3c1a3da59067c629eeb7029bb5978902886fef7d8cd0bab7474e4b6e0fc844ec6aacddbb8969810cac38a3b40d6b0927a033724ba6f77c59a173057042eeac0a9b1d4b89b04317d68feb1208607f8b5100cca617f96ab20845e1ad6b1be99ace6dfabccace157398b9e9a036a70b1fa755c2250446766baafd4d2b3daf13ad2ba8b727146ff87c463b06170bd7bf715b3f5892ca1a80a602103eec384da50f3fa5c8498be1029fc722598677bbab562ab9dab1eba0d6af783de2750568d7c4021ec95ae18413ddf4e9bbb13122e62581e66469259d79576e601a772c009714c28e3117ff2e9a24c321b1d892e5b3d42084f63c38a6d41f41032b405bfefeb9ee955055cf89bcc545ffcbf3bb3050f886637054ecb4d83e3aeb5c2a11b946386efabe4a7dc7dab6eb3d6944e8de6060894c7a81d515284d9a0c1a5bdb4d6e4d20e66e150635060cf7b3c5917dad5bb78a88ce639b012070e3614389f9e89f70cf2064bf375bd8dbb4744717e771cac29555f6300ea2077c882c933d366059dd55301ed24cabe484b23c28e5e4578baebcbd1c6595b80ba173a00e760cdbae70a0fc9b77974843c30292864fd68611382f4ff5adffa6c0585e45fadcae5bf870fc0fc7cb8a8a0e2c6f28d7b2f18a3b5f95e3ff82b002ca8075e3f9341082acb928b8a4116c2582147163d64ed111114b5c8abbf05b969dc74798479d345fa61bac4b625175e11167ad039205b70fd42426d0ded200cdef40b0aa37546f66c77d23de1d3f12da7030af08c8ecffa7617346de3bb3cfa66c5c9fe49da420bdfd80e541081d26ce873914afaa2180a683f738aff3f55930601df67dc7ee4ac20a60eeedadf36dab2115597f09235cc49d94db30b7f8550a223cdd0bc1fcfc78092fc52ab0d7651dce159dd5cb75ab3a7a79738f3e8572eba724e17fea9f70e7360fb279369015c26dd7838f117dcaaaf6b5a40bad8a04ca0c81e7578be8dd6378b6b594a64802c4bc0b2c36a62de594d2bf4ae5af1ea409c0ddf281fd250be74a173256f27830ca1dbb4d4914c7c2a179101c31838d4d2b131d6555130a5eacdbd4e64b8275a60e40ae253e44251d334b97a24f744f8b97400a90010f5232cd5b82181ec4b6b7bcedbe7b4a458ce772b508a435cbee00b784347fbac95a6493085fa21813dd7b953f04ad694936145f859a49c246d4d9c48cb94fa77bc9464c773a98df2e3e580ee6e81403bba5975bbfca547ee9afa1a48239498209d1d9544764cef4a9eece76078a72c4fa81c3ff788159ca33c733d6d06947580afa9bbfd3905cc2abf5430451b7a54e4d252bfcc449c406003966209594a2ff623978ba1ceee +shared_secret: fa8721164f599caeb949141b24a124f2d576b3b58c1914af2b05da26b09bee30 + +# Official test vector 57, seed: "4142237070c216bcbe245a39bd9220533c97651d84832b26727855ad994a0760c52b9319ad404693e4248b8c5ff324b3" +entropy: 52b19fea232c9154a3e431e9d69cda40013cf2d485c3cd027ad24e645420420b +public_key = 00e7a56e91a766c72c04ab283d25787224a588eb4fe0c6b54d889d127a471a72c65f06375d1a545ad9b058a654324b5615138b2ec4a375989b3f1b60fd30bddaa2307205a103b29be6cb75f3567705a0c05eb845d493caf795554ab25fd03b379a6284988763698b1bbb4b3c1a54b9c2038e9ef30a3870a11604288b32336e15939fd181525909949c6cdf7737cdb382b1dccc0c49317213683b349f8da22db0b45e359b2f8e70916a0c0142fb264cb6bceb80afa3a36912d635d7b4cbf33a4a36e4c6714c551d70a18b967539b7a604c5182ee7673ce91d07736f5b97b407879e77050bcc089a14332138d92ab3e09b497b834df573dea32829b471bd5a73e61361ec699ee60320ccdc0e6fc983d3238a8d5abc3412bf48d67dd2e1b0c2692a4e705de666aaaafa9eca476a1b155d52459b563b6ef1549c51f83bee2963a93729d4746a01a21dc667b120d38d79a45a112067205c3edd378c7f65c940719f79389436a5595010678e1558ce163ad95593a751c737d4936ed9c7cfd41effb1abedc07564fa5238ea2d2908793e2a9a33e08b67ac3133402d42344f6d1c804536263661a557739cd8c29682549fff416c069a39cd48229e47066e02612988bf780256e25009ec5b1ef829bd39bc0654a0c8c3c113cf421f06965713849a83cac9f6415482d82074fbcba804b4c5f2b1fbd941c7ec8c4c691dee981392bb0736d43adb3ca548829a55bb9537396d7bb11922a9167ef01cb1aacdaf17902f671a6cf5487bb643e0a1cdfa3522860326d374ba8009833bb08eb09a2b3cab0d3193a6561c17d60b1cacb24cd3c26c455c040cf9ab0a7292bbdcab2d5b783d65bee7a666ebaa2764e98b7df61bd5ba546bd307ad7469e4ea85b6031224d9b1315720ccf95273c35767c43a3b27a31773c5b35c7e4aa0316c53cdb2fb1a60ab77c4a76f2af78bc2d6479b909eeb9c26ff97a47c468dbe7c439d232a914766fcf8772e7ba92b3182e362735c237bcffc3e940cbc5e6042df923eaec04d96e31cc3187f66735ff1e62fb5460895b22145787484e529a1d654a2d72cb9d81b4d283bb15682e8f9bf1037cc95e29cc3716fd89810e1bb95da871a2562645e0c60a27cb508c2885c19befc686db2e7a78aa66b934aa0d42c856cd361ee93294759549929b59adc1ebec3686e70c4a15c8d56dc23ad080945d4734b76b0a64b73de7b5d810ab8daf48542a4c13b8a14aef05c788448acaa51263cb31be69a91888ac66075c0e59ead1b29d6439e94253d20f965d9f0aca53a28b4903bd40a1310f0123ad221a45961527589e7048faa407028601e397a96b39728bf55437d335f1e14063d3902e923863bc90572891117516fba340263d6a0aaa0743e959da8f21ef9fb38431b36b1328a15696e97aa78ea97936f8b38bb1556d2625f5ac31e1b8cb3baeb1be7f808b6329a440045eea532624354dfb71dc321109d0058f24ba4729c375ccc0440948fd345561715654f60b378b477a208cb83f3afed2534c5ab6efc0a5761d46b6cc0a6ada55d1c92c7558bad4091772f65bedaf335ba37af34582e0bfbbc6609bdd3568001734520f45d9f4772d1d21d5080b9a7a2b2e72a0b6e030f1418beb28a229c8f63411446b83fde11b3d946c9bdabba08d495aee50911cc66291fd0 +result: pass +ciphertext: 2b93edc1c5e164af29c51f768f38811685e3c326a9d98ae6628eabf5bda5c6920c7fdb738643230ef509286db3cad01e0f817cb64cba6e8a89793212057a33c5ac88b19d148a11124b0f6a6c0a4b86f25096a8cedd3f5ca81e1851ce1df2b43525ab9a0a95e8cfc725c891583089904aae1561cb9ac21806662222543d7f827cf4b6b3ed7b45bb0c5a0c1f64d73c9cf4b833a59617c2ed3580581b886fadc3bf00a6625a1afb067579db0b984b16fb645e222ea52dcd8aeb0538a14927c32ddd1c845ac95802bf48e49ade7122567923de1d73e46867f9c9dafb8ce4ae5d6a0013d82e53674227b79263abdecc6b0e0fb7fc0a2660fedd5d4e2febee35300ad0e9cf0c7e7f1ceb18ccf38a682634fd6433bc141dc354b8e3279ff1547de9853d280c9ca7bf88f34b720633aae88272ec03e7622ce0ee3c2e2c66313fd286fae22b1da9b967d926d0ba0f63a3d02814d2ad22eb462243d574e6411904ae35c859366b7e09838e12676b1bd89743c990050ae185287f4f89c1ebac8f477c23022134b343868a9db57bacd273f873ff0e96c93f026126b97b6bfb9c1d1a21b10f1cf0694159b3b01f802193d5046bfdb224f4ee0bd520151fac75338ddfb669d5d3394e0b9776a158ece27de77187cb0baf7b2c1b29a0013071078c823d1c0faa784a4d5c8d6ca224c5fee58c13e983e3369e1832e72b43e4492c21b33477324595a29da0c3cbe2c2c02652b22ab1de0803042b08254a1f3dfa5a73cc6197e3e4fadeed10f3dc5d9a4c2378fd22aef84cc98dff20ca24118d9e3a54a0c23f96bc70b102593c2ec8fa781d6622395613fc57b06c175e7cb4823eb0e692a013a493fb83355a9404af9147b2ddd81f75e673599a5dff78b9e383d656f2f27d2e9849a70e44ed84da5f3d05bdf4d929ba24fd574fa21b479b88227b82888341209d9698a700a82b2cccda24c38ff12e32d8182dc9771842da3fe51a191e1c28002eda9a7a13a0f84988b356da88e270434dc8f36359ff179066393af3b90e06220e9eede70e27b13271edae76bbb1cfd9b2a69b931d9a640dba314f8a4907c61745ce418f816a84252917cd4f4ada572b89ddfd065c3bc7604f53776347835d237c53a5c1c26a18dd37c9cf382d836f32b9fe1709c1800aae66d4527a1f1247382d54dd69d0b365f56de2cc38cb302b001e7cfb0a8b7896b38c1cef72ace55717f465e2229d806311904fc47200708c209c6f1c2a1977a845a5e83385b47aa5ac695247a4ea9aa1b3b3c7e4a096c07ce6341ca9fa0c8ce26e8765f35c04d4c7ae8c814e3910f62e50f728bd4b1ce593dc651a455e0b055554f12d652fad10ae94c1a748d3f5067b02d81347bb4d80793d07b5e71ff36c3dd11455c054a23431a830ac8022b8fdd7c273ffe4fda640c89ee7e1aea9d11eedde7b7258ac5bba74fb864663c44f22d92b28c5fcaacb8a0213d71b7f86d8de1db6a5dfefa338a61166d9f9841794b3fba4a50a5d1bdb95058b2d31aee1f987f8840b829e65f382ccfce8c298 +shared_secret: d479c2f5e622cf848d921a7155cbbade062d0fb3ce7535d1859eb03e18ac64f1 + +# Official test vector 58, seed: "bd334d7b7eb14e00e68863f2e5551a095f8af10681c28353fd19b9a7e70b8bfe266840860609008a567abc66316c77ce" +entropy: 64440adb05db3308b189bf999f9ee16e8ee3a6ccbe11eebf0d3ae4b172da7d2f +public_key = 2450c193211551409a9ff92089c54b048b6a80127c7742ba34333bec498e28d729d6085fc7f5b6e5c4212a0aca0772af8f83200d422b49a80dfa17cf56d8277b792d7b4675dba3a7502674f595a45fe93008acad026410de336fa41ac0c725bf601280bf7b4d7dfb63789175b7748dc54846f3a8b28d055c69e2424704bd84f61c896a40447bcd42b96834c8429ca79dc4a4be300c7dee38a253e35819a43d833046f6437622094d003a3b9914bc6946bb4f4cba41246ca027cf2e599a54a23e8cca88086a6bf8aa92305185a8b232a0f45903224ba2d3276715640451bf49c350fbe5b2d95a5f55223a1a794bde26012bb48ccb4384b3027855331e96ba09c7e757bc71ae9ab2a1adf51ff01bbfd4c77a40dc3e24da767d8b456979913ae97fa9446413084a45fb7827a082eca1094a9437154b2c8edb48d7bb893ae3213b5a95f86bc9e146657ae653f1c9bf54f87830aa968b96b747b9aed4007ab4030ed652652daa9612d00f36bc2dd1299c8f2c84fb56045ab45279735aa1f57ecc470d7e66696a8b7a65bccf23b63ea1d595363466a4d24540e21bde05733154180d1a80652b166cc05af5a7cdb2158471d52fa5006a8ea25c98167f4574a8a47a00b7c031e667a7daf41b32c714ae1855ea9bbd0a1aa18bf64071c44f3783b30ce8301f20cbdc5c194d6131712386bb135af9b55c680790b5147f55a6cdb94075d0f0c289f42aa638623c16be446289d099777717b89922476d8c5511997419d8b5a44ac8c4a9589c5b39c03b045ac31a6e9967fa22c21f5bae213065867945ec746f776b0daaa96d85b61864fa94e76474beec06815b556faa81ace15c552558c0575c44e26cc4f919d3e26fe1374d2afcbb3de23a9be5b366c1a174d8b78ca462705ba70b358d57a751180c781b28075435b2528104ac0bbfe5912f8fda282f93b7e3292a64b83494563741789c98eb7e84d69c7cc2cb1703ab94aa71d7491c69b52949818245acc6ef07c11fcb68c336738fd762269b7ac562aa7401965f2c5b2909404b32cbc86671043ac334e283ab194bdaabc390b0b2e275bdf0cc2651d11207a53db1a2166b7526633cb779d88da83357b51c962f567d03917f0f2b5c3c3b9ba75699efb4a8a5736d98a56b1510cd6f233c2c05909a3ba6203c11ed72a0091785acd729dd609704e51dafd4342275564615b258691b59266a0ee3a8b261c6e9e9894b681806e97fbe3b25b4b133d804a0286a909752220c11c8644417f34597db43ac66159956a11541cb4348c23196095be01023e7b267c1e51fb0c11d9b787a519b3ca3f0ae08c79ed3f256a63b488e38040195983da72f9cfc03a9c5a7c428898291a9bff3cea8089a343b73e616c5e02227553511722b04a1604d5ac718ed753e8adc001fa47665b76f944c10dce0635e9c98dd91b9e6790da2b09ce323ab41cc7c29839784e6ba907979ce815f982585297b5170dc7afeb94524563510257d99131981128c7953ad87ca696d58250aab373ffa3476aac3f650bcf58aa6bbe85168b7c4012b3359a2b6bed702524b8498d3aaa04c7915211e1e013e1961b0e2e32b90e01e0b372446931a0fe6255b412581e2b5c0d60d3b7208a63449b4216546209bab2ad3767f9793d0be98cd2899da27f7d980122d0bdf593022e2 +result: pass +ciphertext: 6c3904a9d9575ad0a33c89bd440e63070bf0433261fc2b3beb68c1e244e489d6ff2605e48e89cea781bfac81251854e85613a0045b4da0b9535073384a36ca0ebf9ab4f3f5bcfc7682dfcd877ddfb07e5e108ae24faedaf75320fcad7edbda2a5ac5e7ca2882312699421b180b61e8f67bae67d03a241439cf6ce69a03b82d7c1d9c3e2e13fa4a83fa8151f790c2244d1952910c946dfcbc38da37a0d5970c23229860a144d374439e66113af1cee797dd7966da0cc64dc4c6586bd5d44da9513ebdfe3413199e89f359cc17cadaf503587b80313dac670791908e2f9e32bf8271cdafecf912b87ac0eb16987e4afeed57f3a83cfb62510b40fb8a0e1ba08e44f65c27e647b3f7b50e8142fc2d9a6cece5178c0bbccb8546cb31e7e5bfad1851dd63f4cc83758873c3a06dd420ae4c7bf28d21bbd811ce87bdecd9dd79d092b5aa35459dbab31c113c82790fb97633d0316fa9b6731cd03a888b32d42c460e7890c5d3873a9885f6dac651f22fba27c25060c70a1d41618c352747a4a5db855aadfaf8bb0ad62067e03ee027bb5ccf994ac6b95d3fe0d994083258ef220f0eb044019070bb9de46b39c31a6af5b63d4df8230deeed491838fef7f5f257ef95af41b1a96c44eebde9ee33a526db893f6c7fd9d85bcc562b3bff3cc293669fef93e0341bbb828153ba59404b1616ecd79b3fa048956873381f7cf298925d8272cf593afabea7de258c51fc2b5e7c0d9aef98e9de1441c07b460f320ed845f4e6efa1892e23a429cd37c71b80a4e79c92ea476af0eb3267ef787c77d5cc236e9ab87352c30deaa1e612a86a801e9e0db33f9b735561ee5e1e124773f989a83a199dcd99b342087df9e7c63fe7fd9fa6a8335ab7e2432d1cd7e53c940e293f49dce9bc005a58ac2ccf8c993641231a318e7778c8e3bbffad24312df5b6f8ec61a65607d3a417cb48daa55d76a805bffb102dab2178bfe2b8e720cf9aedb2bb4f17086f860a866164771b77b77f8d35da63d3c06d4355555284255fec035cbf45270ee83730dc69faeda7a190c45077265b1d2138891092b4d1903512cea9cea5f9cb081092f438fe80ce6b739a2b79349cbd023664d967c952ab2c6fb61e8c2981b4ea1653ca36d40674cadb7b14e37bce21a145cba822c81f93b22ab3c798baa4a3928d9d5327fcede7362e9d4cc0eb58496c27bf4b245e766bd097e9b839812b1bbc1c5dfc46044bc59aebfffd4afdcb7b28d1bfb9ce5a5c11d4d92d720bdfd0be1d5dc115a07d48f6c3fbb3428438ba14e9700246ebff56d6fa77213a06a550d69f38870af60fcae077ba78485fb59c054d3216d5cbb070c9ad6a800ef76b05fa5213a744501e366d8176787c7846dc6dac77e915d2432a6b08d1a8fb1c8f7f35a56f28aec6b2273488abb17a2386735b06fea6feb589bc25a96231d1017052dab972368c93a857e0b04a9ec9c840827c8f320a9e2eefe96e91c70f658ae1483fa651242d965fd9e67ef26e2c570f89efa24c624bdefc51f881b8bdf37a6aa99b +shared_secret: 0dc813eb106eb0d4864ffc38432937a1db0d27745788775a8299e93d1c808f18 + +# Official test vector 59, seed: "a0264c58ab1f2cbcb212077fd378d340307accb31f1312137cf84e3d3135044d4eae8bd38bc3e540a0c14d46458f6179" +entropy: c8bb46b3a7344ad170c2052fb042b5a3b62e0590562ee82577b1081f6f114d16 +public_key = 352071c0a607e459c907fa29619ccfdb5147f56c208e20b3dcb82fa2304e40c46aaeb47c5bfca8a9079ecab4471d4bcf914c8ba459433ccb950772038f6892062535603b536da65dfd5c33430069a7f33a08092bd9c9617df3a5778b1d15a8a91c8b99bf5b0d4596a3f8a79d3b6994e823c20f102cb2353273471e2675633d9ab2c7668f02e7a68b2534489b169eaa92a8d78e4e182647f71758fc7f49a17fb400c1de30cc76664bd10b7c55885af696478feb919f3c24fdcc98991177b52ca647070cef77ab47c891b06575e5a0814311a75bbc9837a1c564246c163017696294533999b6700a1402552063a621205bc28823e539ad1c1795e0a23b6b47737ae839617548a514631319a78d99350eb77dfba97f7208d04ea980546a9e6642395c5177bb7b433dd47351b85e569091eaa30ce450c1b786c0272b91f9763478ac5410bc1f78175edef0021e8c0b4f074bce255ac2238a5d67b84b08a12984696e1ac7ad1131cf64bc64c5b0a1ccc94e3bba85271975c63f8d314d9f1a2d17835f873846c6858f9f285428478b2efc10bd7b49ffa006a6537684b0093a633d9cf9bf6bf97017690b4ce511b1898971b2978b6a1371e8aa70d970f8600bdd0109c84521e663845805235dd5849b192c12b49b43f824d9a16dba939609e166a8b05e4811b970915dfb527d803672c7a418293937a0c508272a5186203be64b4b1b33578d48be3e23913e73a385a8ada0fcc4cebb1070ca3006ea16f7da6eebf8b9e6637dee942cbe43395c8a7806f2c23d1c146d6359d268303a1229e5d513c79b2095892d553038b6a3431948195bac491a879c4dec39cb1b97374a65d5f066f6c66045a25b9b5889999889db34b1f42b4151126dd7431389a8331b9c123aab61c2122285530566ea23bda21cdedac78ccaa9ca1566ea1817f4791da6754379f9b0f8acb217085fa380910ed3ce4a52cabbe52d75472a63c88ddfb423c1ba6c1deb6ed3172cbc7244fb71300721aa13037ede787ffd546e60890131d8add25551d72881be0c8647aa10eb5cbb5f73c891868d4641bf8a692bcf0a5867091f4313bc976c989d1c184aea07eed11e36c215008b56a55ab5062bb41f7c5895837093671fbf7c4ec63505d15ca7efa5c6e45a5f5a757a4fda02f9f13c7926ba7c990e6dfc8b20ca1a2a9490a33210c14accde09764153bc9d4a2a68b7a80d9a91d3d47789c2a79bb212bc92812f8660f23a833d78a3f056ac030bcad487431a6357b8a1c13b512deec79ceebc37c6099b720445390277dab65346ea323d33c76e30483d51b9d01b5fdd55bb7d116b2dcca951292f3065b1628b1dbb86bd0cf5ce6a66ba1ab3717829019ceaced283c6b748b26425588ddcc47bc89ceb267ac7c03172b960160a6317d44fc5287c5e462911a8c995bb92ea1c81fed5baadabb569f9cf7c1cac71926f3e4a1a7411295a623c41240ea4e9011660227a785d989ab00a2c3091b02bd65a5b244246ffb97e23213f57b86aa21669541a60ed7014f1831839e41539dc8634d0125d61100ea4438af59434a25a1ec0bc99aa0edeb19d67ebccdd22ce5ff925ae364af7868ad6308a602033e0221ab609560144abec5a4792b8894337c866ec1a5df4076739fed133a74636ec9d904e88876b678088d8c70f3c70 +result: pass +ciphertext: af90dd989f1b2b7c11ea1d07916c07ca7571df9e020e7c40790f8791152429d8dc6fceb7791d8ccd016bb0ac0565f06af72670ed2e427fdb6aa6e8aa4575f25c48f97874d83b65433672538bb32301eb88f4538f68df4bbef7d8602606de0aa790fb7ed079b5d796d954f3fea0feb43c19c7c38695c5702d0a780127ec35b3084fc8378622eb854e8abfed625381237df67b0e2bcd4d9b6f44509c1d7e79a9afe582ef4737f6949e0f95b104ef23a854dad50adef5a50e340774121fb00c1bbae7c546be459a19218dca18b3274a48782d738fe0fa6a8c306efdeecd55b45f2a9d1c0e128168a4f5457c9c0662e724a933a3a0a417ab9d94e331ac80c5854c2b498fb95fa3c30e0795eb753ccbe5fd25c2645b9c34bc38585acb9a8c14cdde16e51cedc704db37d7892266e7476201c1170d7297e193e8b2d5bf10b89feeeb912e40b16854b9e1c2f9975c664ada0c3856a1d530df42dc1238694c30b28aa835706bf351b366a2facb2683063279d8e6106a98de212fa5d94e2a0e25208f3d6b85f6174db9b02074c555797884bff70fc8edcf89f4a553d04be27af73bb2f9718222949cd1e86cf8b8bd15915873f7f9cdd69c7b6c608cdd7331633be5b5aee83e9047af566f8bbf4a020326f566b8e3bd99e31d92edb35962de24caf78ae895c1ec087c33a7b751f9430e39bcf6ba317915326c17432989c5c6c7f0f15e121c9f14b6559d51f4a5f273a9f99a044f5c599418cac21f0d9f0e76f1e474252e75874787fbec4edae7aa86ed10e550db44e46208001d30ba8910c59cff6649c78cb4ede7e2ad4fe410362fd92c535b52cf507c559416d85533686e3641fd7b9218ebbccdf1425cee412f7030538353a785cdd918fd7e2ea6b451a436a286b8d5b341d51b1a523ad0f614868772b56625268c2c16b951f814b8b5d74ec12bba0bc5490a95564f5bb0c144d469fd93555df3a39c1cb53eb8c5c4289651951471b97d0893cd33237c0d26f27f09bc67759cf464094161ac956cf488a69ccd0bc9a38f18592f00fbc6acea75895480001276df22ace110170e2c1705aacf956c6177bba26e599e1656363f9ffe6f8526186b9b2ff7a0b612faf427980b5baed097bdc2acb71edfa32267581a6314c1b05470fd7844596795188b2dedf4e4fff047ae81d0816e82c3e4489f06d57e7b698ec099425bd998b446757d9386951161df04cb5ecdbb0c70204e9fa048936ceb62cf99f19afd9f077ee10e85bf22645469944318cfff14652a233c792df239fbfc52f332f9bb275cfdd43a5659dfa721c91791cd1a91bf0e503ba9f68f880d3d2792e2ee22eb8f7e6f1b52e851891683f3eacc39ce485f0a700c60d25acca1859d14bfbacf41a75fefa35494ce542b2ad6f2c84c15525388edf87ea701ccae772bdb7477f709c822f2b6625f8b1b86ab093d0d07867c584f1c14ff7c7a8a7ca3d1e32af4d76993cc0cd8b740598f40794786b411e76ae8707dcca465b679fff10efb4dc6d0826dbb5adcfa3ff8c0a7d53765fe +shared_secret: c71d65ecbae83e06c622e28a4eff43c10041539d851149dbdf295eb121550d5e + +# Official test vector 60, seed: "99a9cdbfc674ab3ff2c64cded7d697a6e27a767434a47aff7c3fbf3c6a22d6043d27868955286a13efe3de36d22ec48e" +entropy: 2e2b70609f3fe029a14d09d5d659871ac776ce2797a0355f16e2eb68f5613fd1 +public_key = 4a5058d467b5ff439fb0c2916ab09bd306661b18626746c8f4db817e3c4dd2c71041929dd7c5918a760f50715c6528c2d2e7c9b97c51e9009281849cfe4410b616ce03455c73580fe16634fda087387023e427902180c5e8276b797abcc47028cac91bc751c9ec4a9c39d682cb38b38882103839947b920ed453a766c04df7ba58f9714c6c370b98172a71fb7d254285e609551f31444e90c2b1d595472825fb9cca49d55c237a67377808ebcc1bb4848a75527ec467a7f94b8c4f8b1a16f789f3ca15f4f332fd0160ff6c4985b08b9996bd08892d5a836d50566bddc6adc6ebc7d3c95068c08682d54e70666f5f62b238f69bf86a3a48421bcd8b762625c06f03cd8e013561abbb2f01b1c314a6a61500aa02b9a54682325340ba328761140781885febec3a4090a5989b914a494d07e9793b703ed4b45af78c42f3bcb46cb4c7fc5352802ba0eab35b9f66c34c39259ae52d1b75b910a82fbb464d37f6befcaa811abc6485f41d38c8a4d1592ec69b5ce90c7cd10c0082c0b72dfb2e5a16b4c7ab6e65f58fbeb6c442fbaa2b4345b3a3326bccca3b5104730520383178589c4b4c751796c31aa061346620ba90d30b340c541f7cad17f86e05c91e4c21162f618b52117ddb572e1b90c0e19235a82a3e51b59c3b280ce3fa739bb70e4af9233831269ff87f3114596f317f28dc11b8b53d578a8ca85b290d31abb115b76c0a8748124fdb822f989c241b801c8b982fc733921d45853cf63880107704baa331b725a416471032a9289673f3ecad22050d9c5c9e2706a341553d168bcbad1a41a3c554260112336430fa16ca8fb98cf5d92acafa8fb427c460a27aa08358b36c5ab849ca2725b72c939fe0601d1e2abcc4434bd0ac835751315856922ed53cdc7b49468caca339aedfeb25ec2b97d43ba409693fba524ae4ecaee5b84b567432270644d6aa618669734e10c8b05a0d697b81d6c83c9f844cdc8ac755403044b14c288131e8c0c21c2361b206597782313d40bad1d56dbe159735491f7b800d6b14ca69d92bf2130badd1858b2cc4a408c33ee56fdfd719abb2a431132e15b89d83498b6bb5aeb0d7404e94cceb2a29fc392a2e466469e53da9c371e0155a774a298d515d70ec5e31aa070be92c3d6290f285a6034a97e389277eb393c5100f066c588aa33e66028976493bf41481b2eba07a720937bc02b5324d63b9487a1789a6baca91512c1a3a0a70b348c1596cce7997ed395b971442ebb3b0e2dbbf5608012030a172b259ac705af9634ad585916cd63ee1248ca143a20001a20cca0496734c2c52a59bb40f76411578e2c60f2364e8763ec1e5641c80a9d6235d4ff9ca73f4c4d6db9bcf3383d7d9a025ac76db1ca49710aa281c222a4bb81b1027d80c38c8365a39988a029a93b5dcb2b0f410fd1b63a54297c65b7de3f3a948f10988b507955aaaa2d3c699dc83ef348e3781c8723b9bd1c6637b94b6cd416427592c71311a16d449d15c0fb2753b338586f7260cdf255ca65cbc8c54101731a45544312099a66405b01eab124f116cab0003bde314b25690520a9a2131154271c89b97539035652c03b462f2635db501f9ab6983017f22b3391a67397066c86032a31080d329647a7c4f5ab89a47393636ff0671a4b06948c9f87fb580358d467fd3 +result: pass +ciphertext: 00bf7bb6ebb760cd2f5c0704bac084e363ca6410903449755e70c085b8ef1785bd14afe673a70a8118ce2bd4d6b0d1e2c68b1d8d6dba69c1cc712bb753926d073941739c518f02efedd4c68be46638c3a1a9d097cf6513160d2954bf3c13e7ee2bc0583aaf627cec3c9658a0ec689964f54f81809958f31dd8621ecd0fa45ac4cee1773e16686ed2e50d9d4212c708f03e640e2cbc0f7f676b29834a5016971a2ddc1ea2038ec0f91133000a20af29409db0dccfa94b579ad89bff46a18b0f4f530535e45dbce9634c6e67f5308629421ee1101ea706a88bbf835dcd288c8421ba1acf5fe2945c0c657ef35af8febd7a663f8e07fd2d8a6d9588f58014caeb6f67c008806bd8b565f21f087dedd15e7c13e1c99de129c0e9be3ea77cdf2b64ee5fe46d2d7b3d4bd6e3ae489341e9c49618f16a9f6e23bfa1f37b34cc5885d8d55d7b7f816a0aa70c7559dcb6eb035360fbd157b2293e7242da423c83b1a67f3ad00710f23a4ae09c4602490271b24993da7535953b625ef455082ea5f75c5d8ecc8f280e4f564e1464d9802c7a0b4a903d3231cebb2a73fabc6090a6b7e98cbd5628e57914a143515b52b08435bed5bd9b030071c8feca74bee9f7e1ca4708198976beb8bce6a8fd9b5eab0437dd84d7a7f1188f19b0bcfb5f537b107007de82f879bd710cb9732b4752980049c97e7e5642b24cd59bab8af8feb51c64041023edfb59189942befcb4a95a2cf4b2c0e5712f34bfcb4ad08543a3ab5f102938b8c831122b193d6e24b4e5e9d46a8a88902d0d3c180a10af7d51e85ca83632c9848d6d6bb6f903a03bfe77531046531a037a9ff02a0cc45bb4b83bbef67989344e41f7869448e10ea1ea1e603f7bead5cb0c3effd793cd07204fe750ce6bd492a9effc45a15287a226de0df26cf784c1fd399b80dd9976823c7f95d241718ab6e8a362149c54ed1ef6dd3d569077d11e37f6fa74b31bbd8568579fde066e534e2134ad700f0b8a0de295134b4daeba035c5aaecfd5c8892bf5f68faac8fea4055423d9b9752db9b232275b2c946cff74fa0b5d9001b4bb54d778bf9d5f1acafd12b83c2814ec4c77dfaed6849e074c870a5b0e31e6bcd7c1dfc81a2707daa2df47c89701063c72d07f92f81862cd607d3113dff9a2c8097fc980e61f86b9a46d084a47423ffef3e20ecf50aa6ba84091ca9e7ad8bccb04cd9bb23e3681fefb1e1166c539e73ae41be71740e3583b8d881906bacaec5c253181f970e2ae7f533d839a8eeca99b8af1c0fc2c92d86329783b7dc44d1d137c02c35165fae49996d3a910e9a73bb79f17cf3b6b64c376eeb62cb32ef914917e729bf4845f304412a6aab7fb69e3af795ed9b525aa148c073d6fe225d98549ff7931e69427d7bf7a0e4c1a4bbc1229eac126f859e9178a910af8d774c4d1e10d7bcd80544f6aa96ffeceddfd4d7381105b51c62c3f4fcdfdd14066d976a6280122a168b03265af549376ee6983c424b2e867d38c7b44b6af76cb5acb962e6b31d49e656031812768819d +shared_secret: 82360ffb5455f6dfdfc6bfc1a3999eb7453365ca311a0077c9d74968ed27b7a1 + +# Official test vector 61, seed: "c799d57b41f28c5c446dfc58a5ac6499c4bcf3c162afd2b09a16549826ec2a6f689e44bafc4acc82f5d6aec23f4a3993" +entropy: 4725dd8fb314bfd8ee23731c2341dbe114606d9abe6434c471b5573e7df193bb +public_key = d0a4700800708a0cbaa0e3347235004460c8f86188ae66af363ba5cee88b03a341f5255c329a7d119bcac87c46bd77a1b5966a3fb22a45d89c712909fa8c69967b1fa8878d89b8541b8a1ee6858932e0793c045deffa62250c0d0072a46328992ba7ac4fd72b48512c7448cedc902d9d69ca55626a09d1a700a92cfb1a6bd89291632c74af580e3b4aa932c8c6714337b1d72a3002c6b68b1fc981cd0686502189712f0c5327e1050ef71549aba312a59e9a342c9e76a96de6907cf235b6e3b5e36a9072ac95d856aa7014699ff48bcb7b298e5168cffa740e0a5bb1f65df9cabbd715096ce738bd39bad530a05eb58efa8b9e3dd426f1781a06179736570611c89a6f99b3c0aa5f4ab2737592082ff73dafd7671bcb60a87c5adf3445ca3381a279c6a4fb1724373827494e294ca5d83574e0877e4a31634abb106b81afd515402290318ca8a2511cb129aa52228ba4a64444b761c184a3a29b221e11cc1335e4b87c457710fa4fdee790614249fa060b0417cfaf9bc4fe88632a76766fc8c5ff424849cb91d4351ec621c2335a2d7813c01cc893c646986f7c2246b2bb05149ebda38f00acb65cb8bf53314561893eb0f1053b237915711b7577b18aa963315a3b024629689a52bdfc81e298c059380920aa5bc39759f2f56d2811c89c59acde3a5496f1a8cce9bf5266b363a40cc1b6c78fbaa4241340dd4563a5603413cb73ba1893bdbcb3ff93bb7f1132940998427769d19047bc051506b5b990074e8d1bbe2d988699b526726a91513988627c2301b44f206696353cab38f68ca111270ccc6cab887ac3b8bedacc12513ca349228b0d842bc193299ad1812b69c63c2b8233c20121d50793906c4014453e19a62da12c76f03667031f2bcb59a074cdd2417ba3789e7af38ac71335736890dac04f77e0b10529381e930c8c0031f88838efa47772a7b2541963b0c7b063472ccdf6228349cb5619c943067ad86019cd964c64767c838407eb32a4ed9c40581b63e0379d00adb275f6578f065894e8a47796489b994ab9471235455fe1f819f3cc2b378648ac625107805ec8946f1599a8329981a7775523f7c8ef7426d8a31d1d5cc98820186fc7b55076b14d2c7c1533cc3217354bb24661c162aa0895cdc4aaefa666686a0f12d1791adb7392b78d31d6bec44068c4f31cd60a768ac0b056c24864c03387715dc48bc86e1b51a649ce4945708951065f946e17c06f364590e4d16520fa2b47b230f1511fd02aae79bb8fa72791806b0d3e211de92455459066b410bfd4d437f0acbbfb02bfc5e93dc7904b649a6f9a7ab09e2679e13040c8e9754032cc3feb8c2bdc21d8f7aa56ea31370169ebcace98d54362ec24b6b6c63732b882984e58839a7f825b17871820ea9dd0dc8c5e7a15403888e80150cf5a12c5e26040708791d2074df71945d67f221b6d2bbc1b65d37559a7c248516cb4ccc19cc15f93ba6d6085bdd95568cab1069cf13138b83173ea7c58ebbea7516c6ae25bf5e07ddf29a0dcd64b455aa6e050c1d5663245318833cb95702bcab1a11fda773a73454e1055104f917b75d650dfe1c59e807314a096de713e35837ba4f2a5f3991f6ac18302647fe01a05c055ac9d19fe27027cad17633dc0f4693c1f79cf69756e79c9fae7c954a0caf2c6b326 +result: pass +ciphertext: 2b52c90e4ccad692e0389c6d3ff0fbf4fe09884cebab2d264766a85eb7119219267f4ec139c8c06b66b4c91f60fe6fcf20426c65fa14528637c68494fa9b30a08cdb8c85752584d824ea9be447f8756bf44d56d996d54654324450c5443d2b52abf3a69fcf0607a3b8ae4641ac07611b04a8281c29ef5cf94b25273e893386ab673c5fa490d9a36bdaa867ba7019893b79beaf3ffcfd47c3e93c87d517eaa6f0f2af0613427e4c72edf9b28bd3836e771fdcd21a7bb169c58f91e23f76f665b97549cf2dc8ba58ca617018277c704262c7652f91d8e7e3afcebc872f1f5b5b942b23124fd9066bd6b2451c6c0c353dda7e3a09853b88f98123c1a594f35a1fb6f319c010c1ebd76c95a32338e9a40312e0fcca84fcb0ba9e0043ff587d164da5c7d92386e7c6d3647b5168d8a7f9f8a13910043de109b2c9521a7746b67e3566e689576040c9970b04780e7c2b914e7e708a4b37311d5508a3ad15803555d33edc219e8a53f7bf992e8c023a29e42ecfa003312ae805960d2c40be7a781d48dd4f2e1522423bfd20f1c832fc98649652a650ca7ff33330894699cf891493c5064d7db9bd7927d81c543bc041f2dc503fabf2ba774bb743063001fbcb9767d72c5228bd44fc2ef048ac08d5b7f44d807e388ff686e73c14dca14df6c2296ca5ed2850889111db338f7393cef91bf8bf2275708a1fc0967968c9aea9f31b826f42c2feb9104006b336561adf7cb7920c2bd292f002332eb3ecb913e7019d46421a0f75969d12f8d518e7996f75a77baa002ea5e1007811f6ef47ef6ce9ebddc91622dd7d84e75a4b0d90d95a8b7b353c4c0dfc7a3bcea0971bd287905d1fae61fed39a1cad61ff0ac13f436182bbd2da83899c70e802e98a88a2d3e80e538a7370377e836d016fac084ab2378379329a346999aa6594a5271924aa72160dab6056707f29d6f1c5ed8c1208b83f4a0e4e7bea2c75d34d19d8a3e25b48238192395870d43c58309cf9ae5518584fc9f19fd2b6e94b307b7750192c41088d6e3fe9596dc34ddfec0495cacf6ca98f6a24b6ff8a7fb1de8f21ef6f04a6d23a3b7ddfc45ae77d3081d75a76eebc0450041168198e853c6d83f88a24e3fbd25e0c5631c34abe36360c3bca7a3dc522dfbd20692b4cfcefea9d3bb0c73aef359d3f58299140e815ea9bb17b676abd504973a827e792d80fb03823c9dfdc185f03165c3a0ed3819c8dd2877d33a206036c221ca0c4d0d2f935c88a33518ee5562bb1a0baa83dbf4cfb3f11561513fe479e9c9d9298e0bf36891f28773f4eed45a454af3a51fdb790f1d8e7723db1dda75ae7fc667a71310686d9350cf851d3e20faa35b2673a97997fa550faea6976256969975689360275d1e56689be0f127853ef4e45fb857bec018e87916b76393d04c6c732700eb11175205a30a31081f5a6446071bfb7740dbedfb55e5ed09450ad8e65941c85655423dfd60b387f3444afc5138f9e762351463d0d158d82394ed26de2fc4aee2a9bb9ab420ffee5896ccd44603a05 +shared_secret: 77ef6dc5a6c8ff657070e418fdb3eb272c8784a9c38bbef950c8ac1de5ec5578 + +# Official test vector 62, seed: "f7ae036a0176a9de9a036a542dd2840033277c44ae936d10b768566216de9d4395cd42b116873b69d9804ba6ccbc05d5" +entropy: 818d3bb8ebfb32bf464775f7139bac0a5bddce80ec5798595992f9403002cd5d +public_key = 60e29047d95726801982a9349aa17edbe89d04a6ce4cc52b24d989327c855acbc39e6b9880a0783166af6d03043bd34eb427b4a8b32676a874b0c18da60759a5248ed4508abfd90723cb161e38058d4cc3b162c75261380c119c712639e50494bf195b0e6a9d4b22803278832d52a6cbfb542f451c777396ea0ba5c9d186c0786180a4a032d12bba793e2e29328c91a40de06b9b754a189c2a01404f2dc7011b036c969b1455f7a6c05b249e83009b52ca5ec643b92c0e4ec9469e3abdfc2b8dbf5638450aa498c345f126782a5c29ac7673a8db84b0f87086da21728067f3193eed391376317450a3acc5ea0322b189f56accb246bdb6ccaf7252c89be8bd846aa9d07995bf2c2c5be82385d77e566c90fd797bd9b2a5dba704d60341b1530cf3f60f231066a06590f6e3c90f1b6bcf5cb316b482c2817462ba2cd3ea4a5f0744db5128b6d07851e15266280414b6710fbbb7da113c8eaa45974c62bdb7b335315e5d093d11e5176f019dddba19b379399c7c88a9911e17d16fc5194b2a1998d219c4a5fb5531ea6e6ad37052a57fb5560ea39719c378b69c902acbd3324f9c29da73145b409a5f79c8629b4853f65d03eca0a8718dfb7295ae3483eee45bdb265638c0511864a0e471a34d839419ccbe42303fd2c51232246e0a6b81d9ab00c50a7fa656893693a8e6e245fa7b119a14336c9a0f57108ecf87a9c249c01d3a214bd42649e092e2c3c8c89a2e4d980b0bba5340330717a01f5b3abd426ccf6bfc3e5bf8969af7278b0c428cc39a36da6a7c0b8bd666a1d07bcd2845718b755d76fa61d3ca51b3b77486708606975fc377b6ee0596a6f37474b91549f6899a3c4e46a5309f035133aab371eb5599809bf32034a73c8d4c0240a306176c6b09135719ce9478d3f8136c189b715c6b4ce6612bdc973f40238994b763065d08308597ca22a3f4a43681cb500a680a476e1110005c6c6acfbc13c91abf636a7eba2a1f1280bf41293f3031a8abf8af4faa1d617a380e925861185a2bc37a806cb8bcf92354a26340481aa0e6230758a667020145057f8fc55b49b530ad5ba6f490c9a73b8fbde960a8d123c648155418b373b1189e10c9f91a4bb15592da329f61682f70e03143846b09c09da648454901ab938928280628d4a57a636397e5ca0f57dab388c65fd6e7bb5a9a0f3f95892973c990f393174bb8aa669bf28322f80a65320bc69b6460be565265e7b8af86587ad9b43f1c3e5a582773045bab8cc6e03329ab1a4e05b33afcf8009dcc67986831d0a60662b427ff5a7b9991017930524bf678c7d461e1bc95fd441a7693c3b842460ee186b3f973b35bad2fc258972c2c309490163109cd6c87a81a2d30bac5c6766e7d151da391a83a2a5e96904cf9f268706b23e8758f514072b43a6d7891a92e57ad6a9b82246a7f3459cb9cbb5e157a957b27c8192407e9820a906cbcad6794e16bae2b0664811400ca22941e576fa6fa1083571ba17884d5073c83b7a7a1ca53a90ac098eb7dd1627c2ec28d61f86fdba69308e27fa50515cdb19445405a3e6c720651ac5199a1085c8ef1995d8db0a43ecabb5229353316780f12258867c65bf257af667da224c271b02f52b8bcf4805bc2031fd9d999b3c825fff0f4c8cf37e52c6007bb4a2b63952a0c223185 +result: pass +ciphertext: 1e3160f57717ecbdd089c8bd9d1903423f6f4e6e07c12456a7fd0fd0fb18a48ff577960585daebec1cbc0ee508193dbc0d551797641b93539e55e6efa28cfb16372e6d2ee5056599b92d83b79f4b1897bcd79e1746f132c96e26eb689ba124d38e089c95dd5a965271d392850f9c89f9f4b02b23a747bb5055822ebb3302ceb9fe031dd419f967b2e4ca068dd1708903251b635a04e9af8cca62bc3e08c777255ae8a1a54c9b5474a5866f73c1db5baed82a3c5b241cc26401126bbc5fe31e2a732c7c0294b8237987c47d4141050db42d65b7b924dca224ca75902225c32b604a60269dc0a2607b9e0ba0be02e43fdaaf6e6d3d77e8cb45ed770a966772bcd7f4b2f529bbbedf80170dce8de6b29c71ae8506910f25386695c8eb9bc26f973ffc702f95a2d8bc2c5e543c0f70d68abc7640953259af277f88323b7b6b2f9fa4a4dd726acf97c2f251603bf7c4215eb8996ac763e65c3b5199f154a07531b83db902ab8b3a2e6ca0fe2432a7e8e6524b54a62fccb6168f6de050c1c3b4f2435e9083f796dad25d63d78d53ab346cbc2555e1046c10e2a4db1160bea5d6985312954bb7f3aa0dd77050f5152b9447e59644072480edcc1e03f2e689dd6657cc818afc79db2909ee8a789468241671ca59fbf771aaa3849285d45829e3530a319bdb59b8147e983e3141356ec7711755a255a65d917f681981fe6d3cae99eb767825ccb03ec0d6dc66a8fa2304ef441eb276edcd2c2a8799f79723b335aeb0118699f283e974de2fd19b3669a693652c7db737122f469dc7e13f968145c0b3ea897c6857783ee6f2dd934dff2f017f652ca7ed1dc67456c4c31d91fb38c1c9ed43eac6a5a7eafa49801717c86df8b071cbf3a3a24daef83fed9d5d2d933197a1f90564a74a32c4787406a37899e0542ada950d5f755887f45580fe0e7ee3d7a182a7a349ad80c3a4d7455e5f54712bba91d088c08a77eb569bca7c1429180ede008640340e189130e39be6c59d0167c040fd3849a16842bd67b90ec35ddb76b8e928aee99a404d9ae3701629cc5ae8282f5ccecc165a54b3ae806e32b9754245b4227bf10a93926d75da4c5765dbe2b0dcceda93bf6d8ea1660398c38c83c8a28b9fd57c6aca304b87c34d31e94ac2c4042f2c4d2cc20660bf51ef72bcc5958f3c6c1a1fad735790d89775a5cba879db78277d089bb18efe22354ff1e597bd83824b421c265d6ce4bd80a1fb3bbf0d8780526d30329c49eb123d21b2a88a68f9827ed27631571ba4d6b23655c2d3c325edfbf64cb9e1ff70ca33c3a1b1d303001cfe001cecd5464464f998ea6d319239b9e0f0b89dc9c2c89d8a15e0b510a5840c8c09d5f9cc18df4172e17b00ec65756cfe575ccd3e7cfdbb65285bf93c9e8127f9ea0c4b8df5ea9815a1fd78587635211bf1b8c97a70659df0423feaea6b33e3297ca0ea5e4c782d35369e6978d0edfc109dabe660a4a872ebd259cdf0b5200397e57534ef622de6183bb3a2e988c5b8239ab63cdf89a2581521211ded4badc1 +shared_secret: b0978add3085e1c972bfaf86655a287946f3853cfb372f6fa5813a11b6c4e103 + +# Official test vector 63, seed: "d995d38f934b6e1a7ca77c9522e3d037676cc939b0c8bd4b84394b3dc91a791f09d2d97199258c9943da955e7f7b26fc" +entropy: c92aa5fb91c980d9cade9ce99d4c75b2ffa7d6a6ff9bd59def1aa701f2a0992b +public_key = 7eac95cb2439a4d5171062a42523cc5ec7caa414654394003942aeeb720d4320c10d609de9c397d0790c585398fe0c42374ac2d220bdc6f507fe62cc592bcab77bb0a5f4ce73a380ba3640b4e491343ab7a33310e7f04c130a70f75b75e6aca5306837e9ac03c84b01c3fa4f5032069f492cfeac1585054a9fc4271da3636639aef3a065f2857a32d590e416866e71ab92d2ac27cca217756b528776a6319014867816d00837e476afc08d5da82293d37042709567052370b553cc925043957eaa3c34d2810a28163e9f4807b492301a4aaa232b1834db5932d20d8866a37fa312ca9cb129116634e95d551764487c384cf00b35682927808a28660d92e51610c68edc994c76a95549c79c162487d445293f0758a43b525b04477c2c50a47a963531b727964828c5b567fb538432c92a8c5a0be6136b9b05c2e68353d5787a0a455dba373ce60f40c4b48be8723ff760ece23d135887be491157b6b4dc8591b5046735c5588cb405057b96de0097f158c67223c5a854be20238126f1203dc59ba6d5bee4d7aa52f1a92441cb23340820d9afe134097bc8512bba1d2097201d6b7952641369649eecb884a4c35848314d2618c283ba9b343922b7cc18bea9cd1a4a3597c146d433692d15c55172847b9cbdda7a049ee455e5e43f6b18a80e60ca48822b1061835431644ee1b307d581add3b21df3367350bde75b1366505b0c88302eb1c6b164290e29204fb005f81567571552a6e22638a0018bdc94e768a9ecc7cc20e50ebc8bc9774c7caea9a1fbe1cc6c925f3fe70fe2f523fa9017b714b7ba820968b3898c1410b7e46fc54226c2c15056ea0ee2c071635b70fea288b88c9cb43a1faad97671e763d04b173426224cf217b2937246ca012edc14c529a2e2d47bf3b15b96804590e5241254a3b1e6a29378522ca0b2598491509127869a1a73dc2f334386c3bc7542f5bab81c89e938071892709f3744ed560c77d43d6ddc2537c544a4f64b19d55917165001bb74d93a1437835442c83b989bbc22ca67e6f96fd44787b8865f759419a409b78f209dc87a89e3ec883441c3ea39627c2524c4f88625594c2b0b5798386866a2c9d45c2d50d438d61c571564040893ba00a7752eb28fbf6b737088103c2a0fdfc87d99b978d2521949683b7dcc98b644504c297905d2417649c0a60ab70b5c674783739fac213f1ac5c5d69f7fe32c5995073e846d12da57cf17a73fb70fe8e7013d681dfb393a4b40922a654473c40b50249362e4aecd22515f256250365660177bf345a2cbd0884933b45d7ac67ef3871969bcf94570adc7bbc2cc948f82b7731a8bf0f980a3c373d30a4e85e1482686ae98501810c28108670078830254b7ccfca27bb0c57c56490e1a5b593816923d722d7c433534980293a1ce65219e0245a2fa049d9fb10fb54917ad82019a51212f0086afa520f34799a0361a083211a415a42b36237d40a5138c5ecfd7c70f5b084a05156df817071b709e745eb3e0252be9b1d89247b6917c72bb9e3ee78dcfb819ef5308f2aa4375578c72d02c348b16fde51f80602d0fe50da8bb5be6598fda0bb8bb1987de7bc575832baf123948215b833821afb7087a65014511a50e800cf6714ab446e189261a2a3dbac768c1e9e232985c430516bd8e18c79aef56cdb5 +result: pass +ciphertext: 37bbc380432e6694f627007ed8d97fbb1301d6b3b484e0e9748b2a8139a51cfdd6e4c610dae8a78c20619d5f9c2fdcd9e402c3fce6459fdf81d799a358dc312a792841a6888538f635ebd0e1efa47321c1ab7b83ef8a202385321201ea04de13575cc3e535a8e8f1d2bf01397150b0b0aa3d4dd9d2f569a4319f6c714f1ce71ef1521881c1413ec9cb86c02a71c7417e7745ec61de2605297c7dc0b04a5d65d21a22849c5b934c74b2acf39c7899b109e956902e8c89d9d72e664c5c733e7437d16a8535d5f7c8647359ba6b82872676531449899c1034a8e8e0b25c6ed1cba2b7525c303e91ddb814a532f265e88c1c4a07b9e0a602f4c50cbc63f14edeb72246611b65b0aa25462e76c99f84e10aacda4250d817901580a6a5b71ad65df385b8974ae98444cb5858e93f931836821b60aa3a61ee73c7aa7fa626583a0a448fc4d5965f6bb34503d1d9d2f083e38effdac841fbe0ecaa0f28f045dbd7c75cab756628d688bc7662fe2791df1674bf49b4c9d2a0ffc899deb2135aa358cd3d61252ff09a1460188d598b4c6409bb368f687b0a17ba5dedec59cfff68b83e0f27375f399cfaa3d43677bcce1cf338175871675128eda0ad04c03dba2974347f8500886a45961fdae190775256aab5a718a03e9b003d8b060afd8f33722a308f410a78323b06026d65a60d54012d09b4f7c730ffc53639bd36b510a5e24508f0f02f537f6b55a1e8f947b10dbef06ec6f5d1459d04c65db7db9a1789c160e6aa7708035f18db7d9b13d63cd8c248aafb2c95f2267d57539fd0a19d73643b481e9e8b8e309a6a546538f24cb99747bf56f62631d7cff279c4526b2b8652a5781728f63504a2935511b82f79704f2e6e6940a689ae13d6ec77202899deb2ed545b55188d0b132a42fbbe9b997d3aa146d44ab826fd548f7af1aaf8867b78d58355d072c9c46785850367819dd091ce58c1254e71f7d3129f0cd81b0161de7d5f455b1ca018ee5af5d7667a7ba14766429294d502d0d7d80d505e0f0dec5717f9532249933892f1986f077c5ab87470d583e16b79305f21bbac090cbb5e11d9bc7c854836b9dfe1f55b53daf9c7e059ea1c7a94dd7360404bfcddce0db43c050e5d866cb989b57c69997e7fbcc39960e2d86a48bb9ee83770ca896d9f8a3e74015bd0b8b9fe46fbe582553842a8b9fde8182f021cca6ea995190c3dddb92f6a6eb75786eed3414581a65b9d6097af2b4143df4430bb7c20cfb458d0226639c05f83f920050205d465a50ddc04b61999bf1d595422f5d0a4839d7ac808943fab948423600145ed175a1992fe37696885903e23db37f47d75fd690b7a3acde97335c83d8823d352c00dd0dfe3ec585c1d3b495f8b429e567463b870a5df1c992e7719ff348a541a39a60052ca9c78ae6fc1c07cdd57ba7c44ff595bff6954c3ac984c148ee6f2cab32340d495f56034e37f6f86612cd1115b1bdf495c0aa1fc2f02a5d6bd196de7dd7091485e842afd748e78972af4e3afe9b4b9bb5969ae08e608ae8d +shared_secret: b888ef3a969e162edab17c3d3de9ca682de60a0fd6ac97e1b5a54171dba12a3f + +# Official test vector 64, seed: "5929f02a271725cb40200de32d9d03d8bea53b53ac83186c42c7f565ccb1ca508305d470850cf86e9b2c61a5b8ca1c93" +entropy: 7e8086a01dc5b3bb9eda25bcc45d27f99874841b97237968495800e007696ac5 +public_key = 616571fef73bf834c480630b9532b244d09c8f936e951961bce56157f237b0919097222df3bc6e61f47d846479a1a5bcefda59cdd8b067d19db6d9586fab2fda9b550c5170c2772ad5a4af4a67a19d215e45575e83a8ba5f099e4358a9e493677ce177f36a0f594912b6b850d3f719c155c01b68bf1dc89ccfacccfc6cc38a34ce5b4c48d2e17dd2946f493a357b1105265153c04a98992c949ed774588925c697284bc537b4d795de0463335aacbf80b10cd0a03a88256c220c3d0074ffc6c8c913c919aa19f25206a1cb7d40a50c6f55960a2298881a71a1dbc92a69371dc9a95d45a7bd6547be9414f4c31ebfd3553b89cfd9ac05727b06bbab300ecab599da76a62b97541cb3474b7390cc49942678add66d265772f55515e0623192668fe4c5273e3176bcdc52fceb081dcaa4ed699dedc59b01a29363070567772daddbcf8605bdd1268882a355ca4163ece88637e932c56c43405ac3844949c819646e394dbdaa475e62ac0463b8ce257520b3b4e141057449621b449c09c5b72d10464e59bdf2702a7f4ba1c1c6301bf51ec41bcbdddc4a069abe46d37c09050b28b073f2216a06d501bc38640600185227a63d224589a43391097226d67240619e2804589f4917db7391a4fab6778c91ef30aa41655e3e433854a52c9ce8130b802e82204bbe894517f1bbb4458616b0c309020ecfcc17f6b69cd0bc688963af0fec8f567a86ceabc9a0383681d3729a612987862e2972b6393c2c93a32861073ac3eb1cc636a52dcc23e6ea0af7d3af49f81858743962978245db5a70c34e90c64560b87ef29b5b568a716904c8326481db98c81cca47cec76e32003b36b26aece764c5551ac07c4bbce094b6772b2faa27b518ca5b96094d178f68a7409992ba7fb776117c66e97cb0be6854908aa8203aa916d26f3118842689a5347ba29d337599799691729b812961720cb80ff993d8a124e2027effa1baad40a17b564b0412681a6005888c0e27992faaa370ea3954775949a553b75aa35d5956373da54da7eb51c7e68c05777760c6b9b0a78ff2f34312876f2db27898d3aa4a187110402537f2aac7373751954f3bbc5445da3907429fbc817fb0a732bf4077d4630c93a4bf6785274019c5de6c3d8a66441620491a8537ffa1a50f0baac622cc765052ae0049eabb20d05b987b303d17714c4e79814dc5cc9593bab612359d0c7a3bc9614d0c8eb4e0a7c740520e077e2215bbbcb693a92c0293ca28b4d0ce316b5e14e165fe4745f9665c36a651a6a8ac11a162b4a111e40851ec2b29dba05590140d28aa945b42310659111a4033f972bc0163bc26a5872957c6977bbf8d727d65a8c806b4699050c994bb85651a40c6d590c337c680306fc231b7487305c4155654471c3003b93c206cda82c19f7b047e12b5cb94490f4bc850c4668b366bcb23bff1a744dd3362e94cbbc658178a012d9b784d12e965f4592067b636ed3ca3bdd89c0b30c8bf798f2282c49ed3835b70ab1ebc761b880e0779b5aa34acaea40c83eb0babd6ca11398759415252064c4e70b62d4cc813d346ca789eb86b5d3606bc3239758a62b5f76a709b602ad6987228433a01a8aeffcc22d0d315d59b15e8aca53b02fd160c62db910fddaaabbc4c2df1256095317cdff9f1e7ebcc48f8382101 +result: pass +ciphertext: 30925699a42d6bf2ab41628a20e814758a8700044fab7c3b14188ee52c8208d9641636d721d2ec32ac32436deacdf6e4786c3ea44353cebdb1827cfbd550d209461b6a14b1170893a28e84205734ebf74c171d70ca82b20b4260b3f86f7ad4c2acddb7f4c8aa82c55d6d55b8e43575ecb5bca8ef011ba9b9ac616dfc7b3e3030dbb7a0ea6b45e36155dea786c6c2643437930bd8130d8051e70506adbc396d64a68553140e91f47df35c19a79a096bebb25f0e420eddad682d21b374fbc606d5939a1d2493b43111fc71384f57b8c03817db1f9e4d0e4c5e7157a119743968948929d3b96e3ecbbd10b5f72a9f45e52f6145509aad69f8ca70d55b28edb2802a94c2cced9ae537259072b55298bd9ac0d98db002cffa8e94f9494fcb4b2da810b2244670e00aa6ded8ddba746957dcc34d537db9447577e19ab7ff1411ff6c68e7e40a3575b1389d8817a17c8cde4c93e572316dd029f4f21fe3e62d477f52480bbb527820175ceac30ee25fbed3ae258fc0786aca81ee2053e078c6bbb30d169782c74fe0ba4c8488e2ad4c334dbecfb2255dd7be3a95992e3f6a0ed5cb1f86e2b99a5a5f64ae5c810f8a6e72d2f27f8daf0c60a6d7e994cd231391ffc7edb3195bdbcd5f63acecc14b6c7f19f6d889616e8e2a5ce63c3bc0e2209d30988a1b689c968f9402b49c0f881dac8ab899433872e423ac06f5b35b483859e45b0f6fec52334d7582a6149fd984237c5f14369549c261e8e7246664b21e05725f953b21b49eb33b7eaf612a4231efb0abe4bd8f36b981f4f1ef5a57a4d27373510d1bf9c0a5b77625314a125633233c6902260e705b4995ae34b6f90eb1298cf9726a60441ba5c8d24c474ef73c02583632474956651700f318a88718519e8c7baf48f4b571aae56410d6e0d83a50ab3fb4115a1bc2272ad443b5bc5e6ae3daad6797257cf9868287486a217c631814db311226b6122d9acd2de042a95b03983261bcf902a82fc7f6c0db0e293bba27eafe29c6947f35c1e0180179b2d2872a85a63bca18a9ff5ecd144ceece9a48c68b8b6775ff1db3b9772abdf3dd6ab6d3d964da1adb4a035ed097cfafed937563125c95d7aa851d6b3387d15f7b0cf855d264a46a6732f097969872e5c1bbbac0e0853046473deea8a0ae4cfbfd1fac86d5620a3b4501fc961e4be1949e3a258bdee7d2abf4424f0a401dea2f5b0dbf7a8c82983eb1db1f69c827d4f24e36fabf34772bbce108cdc0106c074c2e30851f85fd47777e979716290eaa515e69390e6a95038fb018f240bf722fd947bffbf82373bdc8d7d78d739e119a5157294cfad5ed0899e864bb6f091e861bbe785b4773fd9b6f0ab758f2f71fe292179651da6046dff6e51caf05136e8ca7a2a60ed74015e6b8a3bb5637884d6df4ebe24b523548f5ff7ec6e42ce750a47127d5d7c312d15699722a6234d9f6a8fd51b9f3ad16a027c0a2d56efcd4bab05f5efa3ce4004ba9eb6d36329edf625c18dff3a94c5a430c3a00828a9080d9bf166a5973b60c9541 +shared_secret: 2fc09a1852f458bc7afb58baea4d6e318bf6801e7804b98cfc250b0a1470c598 + +# Official test vector 65, seed: "905074033d7b75deb2d06a2f29144eb377b452534c5710632989f02d45312d156557e96d4486020826db200153bc4a8b" +entropy: bb321ef14d44d8698df879fd52450567657f52a2df8d111185dcd7d4f30a72d4 +public_key = 36509aa06326ff5cc174f51d963cb5e5b1290eaab649c91d1a03b9cb45400087248ee90f5b9509b9d44f27e814b55b5d7fd341bb663523cccca02c277f1a12f2e054008405dd7b8fb5b78f200266d62b00db2665a728b9231b99d957904d4278c9b99933972006c0afb2d46ab58810bd59492891a77f96b7e9d06eeac63cd9e3a2039a1f30ab0eb4e6a7dbe875253174f2519092761e9684c00726b8548aaf2ab3bf79c8255ec6c1591234672acad20c0bec4a5ff7b4ab4442c2982799d0203f1ddb53a260b95b51980025140556582a0c5dd9d20bfe542f79a743d45095b25c9565c1bfd1d82e5dbabbf37b934bd43a9af92ae5bac65570cd0586621708a30d8371dde11abdb8079616896533b90611a58843ca38f6105164b1de4b227b0c4b14749f5833c5f76cb5aec703b2eca6fa40c7bd224059a4938bf125653901d5d80cb4fa7213e9136d7c0a4f2059865911f68c19eff169af063e76887f192359e5e60516a92fb1842af25599aaf530b08a171d35be896590ef3a9b7878b4a3764a3bc2a800613ef1c2a31fec6ff7a8c8c4e0158202c4ffd35c1a45738d1ca197f23b8858a31dc60770e38796da35136500ec868e209217b9a10c7ae465848c82e815490da5becb32a55973aadc18afb2172c0d086de7e21d309226fd549219c0aae0c672bbe832c515811584ae3e4a59ba98a80e2a0386a187036961b4f6abeb6a84ae8b55b4e95cc9e812be00ba0925ce00ec3390e7936b52482b420b9d051f91a117122a0778c2434cb661ad59050342c63ce986e1b590d2b0b81ff4c3a1bb5a9ab4cebfa96c9f072ddf8332f5a3ad0a156fb5b6b35e38a595f30f2156815656cc487313c75952dcc12adb5b0528ca68bd53bcb1f750d5f24d15d54e83b165440528d83057fa12a983aaad4048c53c62c4a789b82728a94caaa50f7a7df6fc7d07c76727882fb8aab09811a611c5188dabc366494263cb8eafb78eb40a7f33763ea9b51318f0ac1a7a34be71aaf436ae4248346a7a25e2dcbaab226111d96d5d9165b946ae29283118bc34a46409f2eb37c469a36311caa843c112ea83c0364ec2b8b6e9ec68cb8485bfd87ff560912ff21c43d59a1476952e82a2d3f3a00cfb7c49a61e9216b728fcc30861a23e171c2c7954fd85528d911682066db1a062b50a5a11cc385db16d4f4b81785c9b8368575409738683847cd46f9389128414082c5515b5b3310658c54be69a6c3b02b5e0a1b6627e0512999862acc0b34340172a9a0b144627cac4d36fe8d71272e6ac69ac94d1f8c250515580b85d8ab300bb29b43b02195ea7c966947bff9cc323d017b48bb4f6a88b0201956e095b8092b250b53dd9f58ca90b28eab574034372d9f8305b39668bc90e2b6bb77257252b0bc36ee68ad25a7c883691a494c5626b5bd870c45a06ced4f39fc7e21958811a7b7cc93410b2fd8245b45b7462f72033d86ef2fb9b173397bbccbacaaa7177760202a8748b440f82d49218331c3760918c640dc58073883b5721548ed6e529d7f95e02a65cd7bbc3383317fbb166bf751f47fcc216513742596c2e9bb75ee80d2dc16d036b1d45102bc2275aa09b8800213f67dba3987a2f5efa1ae2c7868ce276c5110f462e65b39b2f4f753b3a3d41eeb50f7aa17723bb620b800aa3dbdab7fc +result: pass +ciphertext: 8c7069e91b0600eb165920b709b2d3e91971713faf427499bd83f286ae5c72662f583f78fc9401043582106b94c1c39c8f9348501f0c0fb580c3a40bfcec4eae177b1d73a76bf20ede2695a5a00de71403734584ac92653eaae46a696473e3b356addbe195d060888a9db895fb18f5319fa436b40b9c1d8e073fcf305b7de0d2feae428d32195c502eee3b5105b925460700ac87a55745bf1cd8481274ad8168a206b64c07f290f4433d8fcb9a068b5ff77d81d50b177605a96a3fdaf6566d6ebe5d793e8bf87be1db2ce45d61abd3613e363038cdfd4d600b37db3881b2c56f8f8ab7bc48dc86f82eedd207b7568c07dc0c5f1d656c0ec4e7c2f157587c7c2b76dc1cea2445e19b05064b9257a9137debc0ccfa0fbb723c3f320f5a8cfd1d032971336d1599d03802a74696101f8fd1b584102155c46a4c7283a6ec6e6bf9ad60e286277e05731e105b76ba4f992f37d30d59b4c224b0b44b74ea34113f6346a481977ebaffb36c291fbfaa058776effeb17e11896a22fdc1d7649a11e33cd7d22ea7655b641b5957fdf542acea5aa2d7667ad0392da7c596c8bdf38954247bcb6cb77a6e66b509dd55c2904ebc3188a1ba8e017191133c66ce9c656d7bec4464f542be009e3850a27ee58cb4a5374220226ce305cc45b98fd094dc9e2dab7acb5fca8d4563cb156f81800824031a6f342f6dc83da64184028a3a90d0d654eca4814f034bd1a452a41564cbf5f7865c9309bbdc34702a06a789709497dff45644cfe356ac9646c3ccd6ef51e48fc81b518e90d9c4f68035f1a878c893b6a7311aafa3f8a4ba6e194756e6c392dca34d51804022cd6bef7cc06eb69ddde31453387aab8c6925c7faa30bc6466d67c35512ff3094dd62c0b5a3316e8db4d8813a3bcbbb6f46aae9e17dea7ec7aab80dc9c099bf062e1006fca6cd8cb561850507e4a0760bbdbddc5a6efcdcebb861bff73e61bcbf51c7d150f5a2a531034899eb0c1975b2503722325d0229d710948d68968d662a8bf8e73a29d98c8dcb3bc128db82d1bf1894fd617d85ac70ec52214b348bc08cdba7a5ead6a7d97d2ef640bc06d71079e5d4626a4d7adb058170a07c224d123f8e0a11836696e95d5180e43169aa81e5b6e684b5d4cad7c29379de9eef671ad2d7dd8d4285a4983b2413bba4c1362a3ae57bef857d2acbf492e1ffbfc93d71fae367adcdc0bb96a76d31c4a72f5ac2164cc627f86b8dea3c175a34ca0c8b9c10b25ed2ff4327d9c683e3f9f92e69a41c59d7964d8396d06a100debd1b6d6e1051cfc17d8f8b3239ffae2d10f36904089654edbc130dc8a5838ef8daf78947800fcc084db7614afb6acdc3af16d9f2c80bee61f54d9b843d485382aca76fef93b64a33c20ec9cec415f49df42ab2799ef3b1a05c37584c9c5874def12329eb9bc047ea70927f5adeafdfa0f24e75ac4e7c4fce2d96f774a97872795036c69e6c412a4b4fc0dcda336d8eb9207623b7f263870a705df4ec5ef264c016caec1d496d5f9859c1f331d4214b13b1a +shared_secret: 930131d3145d5485f06c16a9420a612330843e6524dd74654a85c383e28f2cc1 + +# Official test vector 66, seed: "a3e2e511afa7bb560446bdadf67d2ee2e16ffc7baeae7efb8c5455068bbd4e91bf9be9d98b280072faba7712c75b26d4" +entropy: 210a423dadd899b810f011794b79aa7f860823ac1962370e791287d3a1afa384 +public_key = c5e450ab970d5cc6678db12ae81962959a3d68d8a4fae40ed343cbd2e84322e2342cba7756328fb5c80a3fe07295db0e136621f8acb8eed4685cf21bb28a7fd34a9c6af4a8d1fbc8db21ac4d334afe1b71b87cc1ddba5501d38dd7e74c6c502ba04b8d1039322734418dc438fca99d0bf44f700ca473d07c0ad5094181bad2e90910c08478920461c750aaea6658112933753153aa9bdf090ef91a3f08e7c07278369df0bea9220b7d4c6b6f6a7135a5084aa54ddd270e9d41128d1944d8e7c3e1ac11a4089fe4541324db369445b5afecc41406b277e8bb93f310de57b55deabd8d2ccd2e9a417ed916ebba260e0baf95ebc0fbfc0a1b63b6f5342b3ed7c1ff4135f0a26c3daa7e2d60bbab8051123628abbb3cf9fc6369a46d4deb7ec0032847d7474356aec9a417cae8b62c9c7bf3b077eaf52c622b6a2bfa6ac49a9cebacce996a29f89acf9349363606a86a6696481233c73b273e847798b530b8662194896e22ebbd8f3640864791964069684338f453710d841aa83a2997316fc3ba06e7d6a3855cada69c35cc801cb49928ec66a56cb8a28deb2329d75c6545251ebb8526903a13f5174119b9c2037b06c165d2012723bc817297c42465cd77044436337591f239153629c3140b0ca85783d2460b207268f013988176f4c22d8ef5c096c93a52706931b4399a1849488665026a615e5955d972429eb32213ca16b587b0f7366192366f523732fb1127731cb06bc39f15f35b1283654bf361f403be5a9ab154f786080cb8ec42c8ec356847839de84a23c6e4321136477c12b20ca5642efc84c658323f90c2509b62df865e54072aac311a6d3b4eb9073b17f2291001a37e6ba438918a42663bb4d15896239f9f2b2d17a5c93c024ac595806620a8891b89f7297901a9b63e7c799cac22a515bfb3ca9a4772a5bc9a11154011e4dc0d758868a9f646d5390c631381e8566fd5603902c11686cca1f876322cd7793c338876d82008eb30f32128511a872db5cc0ac689c75266d5a9bdcd889f73dc92f1dc5076f373be64308012553d3109c7b5b2a819afdb93bb3447c878901813849c5fcca97b116ca1c2115961ac4b8c926303bd7f502eb299421cc9cb82f556327584118c6930e03f4368ab915c3df0a46b08518cdd280e17f86824958f0ca8079e857d8ba9a522a49c3f539c845968faf37e4beb443b577646967f4f824c2a706b3a7b74866aa4bfb83dd8e4356dfb1d9f4678a0a120cd2569101b034e36bf24a58c690b69ea27ca88db6645682c13b57d9a397b83772c5357082dbb6981674a772b6a94d0210b14a7703202cff38419297edf92a305a59bc51a022919b1b61bc853abca39721b83a794f1c27d17da71a205571573ce31ea27f81b744371274d6a8138b69ef967adcc75730a652f134b0f198b86a2a670a96c58d45295433851f61850d7b318245849a140a407a60080abbab77abf58d8c46f2580716a0bff0481b1973c804a406dd2bd08370ccabbc9fc7557b26534cda249ba1b3afaf2956f10b0b6ac0a7ef02252f5869a972142e06b86b64684b34b2592bc91b7c5b24c14d232b81880b3844409c6038e06023321dca0f2271144373fbfd47884f3ac96e4bee4dbfea5eedf79fb157b32e2818048bcd9b8e9bb89118362e59c75b4917014c2 +result: pass +ciphertext: 2ed0e760ce63fb59cd94fbb798e752d1d553c736e988de65e2716c30f329b7fa287ff0c677ed43f3d0d674776d84d36fe6a6513586a2e2bb915231481ee01d1ea06dc158456534e1060f32f06022190088e8fe3cebed9d3cacfcf7100c69d0da846df24011605cf42c2cb69dcaa578ce8c39ae68f2fd5704438753348b0fe6305350b1ec520d96aab367188162f8988a47987421fcb6d03d5e9f47fa6333b761b95aaec6a38593e512786975765247f2756ccf88d5238ba4ea61ebb18ab3cdf5649aeb67382c0a232b14489e803cb1050e1ef6ed88c6f1916524fa152bdd22b361722dd5d158025033682fe3caedd0809451b0f6c4c552f0ddf243ce5295133e424ad4fc7a7188763a08543bd3103a7480f467a7bed7a153d40a753dadf3e7af116cb594923e0c5c4c5d8ff27e0e073f84a70b1d1822ef61bad30d3ec51c9f183b6d2967a349e674d2e57cd8ee1a5ae01b37079aa4f2064ee5df394eb3540eb9b636f228f3c8f3b4a8fdba23405e36cea3e852c076b4fe53f7e877b1bda1d72396b93cdfa0278c4445b88e4d0a72aabbb646e6b87a01ec8b7739e7149c0dd373f818373b80edf7028b029eb1abba49aee7c4a0e3f290fe23e3a8487d6da923c61dff69b6bec01cd2efe0cf35ac6855fdb58ec2bddda165e99ee1de5e183ac2568ac47ec30668660d2d7613ab81824e049f1408e965b457461a7849df2dbf8276d53804cd7d9934e482dd6f3c6f167d6516c816271cfc18a6438aaafec7f87825dad2d605dfb26874f7226906a6e3514fd6c73ac0f8524007b7d5d32e6d540411b7d9ad667c5271f1c10834c7f64266d9da404bc197d3ea3ed17cc9fc8ed65e942a836c9ba4c2c167f4926158db053dc7efe70e008c2c9844533a1912c42266e7ef99f9769104ec6d7612854d3064878f02e86e65e51ce80ce5a854c4b92d0ef26a70e75770cdeda1e63dc2d7001b31fcba3a561f74d7bdd49e6559ddaded87590bb38ed03d9fb9e7f8824223fc12ea3642d42886c600f0f592fec815d454b7f0691c3b83cc3c8f1a014f5feeb2cd04720ba4a4f6577c45ea5058d20da7ba8ac58e6f8a594e7a41a91252073ec24c473050e82897357653a8b53440824c8eb26bf4e3140fa352819deaec7e3d5f8840fdc5305fa92ea8db24063f3835ea8682df449f06da48662cf06e569ec327d678953d99ee7d169c6207219ca1386af2fe4f527f6a59da051901ba6bd6798606e2435cb3da1760e135869972eb29216cc03da4c581d553765c2fa3388629fb7a8229a4301b7899e331eefcfed1adbeebf2f86699eaa9419159e669d85574bb76b1514f4092673fe4098ed54ee2873ae07cfd23104bbcf189f6c8b99b11fd2b40e03c284da6a4ced499dff116a64feefb1c07d16492481db67f72343df92b9e2a83246e8b5c31ac69deed48c019fd8633532ea972b992faa50715382e340a1cc829e4f64516a8a840b1c55688c409ca7fe79ef72cacc4ae564225592b66ddec1568b40dfc44e5895141362a3fe39e134d70b7 +shared_secret: b276a4fb4cf77eab502dfdf56eae9f8a8ff5e7f5df3f6cfc80614b193c87f08d + +# Official test vector 67, seed: "074ab1a37ba5a0403d8f68d26fb787bc2c90f5ef88f2a6d286c3e6b168abd85d393d8225618608b8eeb301d26af53bc0" +entropy: bc856afe24213e3d14c3d6f9b89223bbcfb2c890722d770fa3492c1e46d1c302 +public_key = 08f7945e6597c9872b0cb4b1401288d7915be8e3715a8391a486047c15b4ab758c8d9b47541c3411417a439bb2144049744460810c01b778879425077e91ae06c1bb831c75e9d1552264a6543266e769b898b66644ca93f9da7735135d743c62a3876c0c891ab71c73c9b88b5cc14de0238c82103fa8f634902a01ce5b15e7823a36aacf6a05639a812221085b38b2ab933a12552c268ccca3cc07cb4e1ca03cdc02b1a5a8231a386456b26878b673644bc3c1613090454b582d5845268f381eb0e70128c1b06f356a9da736222400acea7c58216040a1affc5771081743b5f0721ef2b601a651d8a2658eb9c5ad8599c2f040f791ab5d93c6067ba30014af51766a41c70be6542b7224767301885a030a8d68a795e9924ed844cba1b696b18c5a64abc7ab83a163cae74ca186c01cafb53c05fa535d43786679a429677cd3f672b7c9cdf9224030b32c3a147ee0b2a8e50a0905a778ad9269bf04c2a801a1d986b15cda0ec2f51deec2005d450bc070c5e9e2a9646c3a6029beb907b632f17163b260fa5b75944b00d776862c3c362d06b7852ace9f93afbe9a4d77c548d04c68206277f569875fa677921c671fa887b98866e8c25815fc09d194adcdd34430e2c3725178f6c509fb359e5c3959d72b37a52c303490ae22138dc495bb2bf0c4fefccc89eb6b70764cf64cb2b02699e84a562f076dc4221153d8bc1dc0a29387a15da95eedc808c666b3caf04882188b5509106ba5ba1869463834b48dd9a2d7d6b46de1b83834b7db556a0b624869641a7b77c1f15291696798fd0cc1d01c417062ab36548f4f7b842e99a85a502d2ed70bb82037fcc6237f058d88ab2ded194bc6f65c723656474830581bb92f196e9fac65fbfb0e662c34cd1739ecc28ace01291f24701ec6a836a11f54d44fb50a9150d9401dd96c39b1b02ec73b86827fa1cc39d3ec5d5fcc4523a948a30bb1da4b3588f029c11234b9b571ec3593e82a0cfd428ea68b727622464fcc35e3dba3bf911cdb717ad690147ab70def66a2a66052a3844b7f6866c1b4bc80c106d3155d4bcb8c13239fc96241cb1b092696a50502a887547638499216fb31379a45bf7b43f92175fe282d98d7a4ad22844661256b711228a31fd2b01fa8f72dd357c455768a77cca28e6984913c352726176e2192de562781dccfda024fb4315eb5b14b9430bf0e783ad77a763b631f6c03c4b45aba24a88e85b70fc3b1c3049447e688c3f2145072460b838546572a42f4659a71a95392255765426451f137e8b4ca64b5c24e5cc74a816a988447ce07886cdc59eadcacf5cc5b17b4b0d058c0b3b610df489066e402ed63a5d155161bac9f2e82bd0e18cf46476935fbcc0daa0ccbfc72cae9b217d3adcb3ba7e0b759aab167ebf40f6cf92eddc17ec44508d051a6302372faa22a993386201827bdf3a1e932c093ba2cd1bb347096b53919218f321bd761abdc6ca5086c51b0c471a6c2781d1ccf20bb567ce472fc663ab10b75bdc6642832acab5c5d4db37a46572645a166edf46ac243805ac78e5c483e25624dab2aa705b9b3f6d01bee692351fb4301c562e30a513f6c73d55c0bdcf439f3f62f33e42f7f876f5314cdedfb4526a075924c59dc03d5f604585571f7e69c7c8f254bcc5af0ced187401efacef8d61e38 +result: pass +ciphertext: 1a7b2ba467c4e3689e34b0acd548a2f12c8d237e4db6f80323b459fdc9d57339fcb5ad82c1cb58e8fea26f2c2ce0927a06c6d8d320ca6b55092119b86fd3fe65650cdec9b478a55a4060907bb0ce8807d964223aea9308c02bf025842e030703febc2e3e11fb99bac1e31959f1f0c3d5a76826f3c2a0e0effe131db6f0245d97518cd1177386bd7e06a5998bbf082fad47d0d7665f87642c4c7da2ce9e1f3c99e1e8cdab1a4c0df0ea0afdff801cd61dbf6d089d68d3188fc3e0a9842b6b019b25dfbfd1a5901448670194047496b70a036abc0376b9f09443497f470bfd9f44f0546fbded6312c16bd3dcf5c5416d9c63df9fb35d22c789b361f069524ebe04e237dd25c8cbc483956fc7e449347ec0d417ae71e6298fea78beb98ca4a7ab69f974c00bdfeeb40c99c102ed61f1e3d2f0250f33d8c73d74612448881c0e4f19824da0670fbd504c3e9cbff4cf41784c3c77e1acc326247b63425443759a203084be16fe8b48a4f09912be9e9db95572ce110994d87ce406f04641b5f8bb17e95cc62d3a6fb2ae6b6371e510356cd68a1876a1d04c4fa0a4b7a2f9ccf7b822e4cb6700ec5071d935dbb67221722b6664278f62093f9638759cf8d6d7b48e08310f0117c1df0500aa58ca8c3f719b84d9cfb803d5f5603bd06928375f137f98fb3183bc385888efa604f8921a9d3fc793e47abe8d7c5f14f143ed6d98f3c0c3e714d2bc2d136895dc140cafcb083375445e77f3c458e4992b245194436d2b8c395e9c46c499c03d35f08d0526ba24072f841ea07f4225583b05045f61484cee17f85b95e4193961562ce7b75ba4739b3bfa1349818ce3756d4732a85095ef613ccc05dae62c8d6d7181e213a3a601f0b9e81e2863fb15ab07f88e7bb58eec3a647fff17c2ff56db3bf13d721e2e9646eb05a20f892d66ad04927cf63293f8db9e97e8cef9c26583a1aea7cdf4ccadd9c4832971d669543a29fd9deae308131f8caca69c3f2a42bbccc57aaf908789211e64f7b51776df405e12803f434758409ea9acfcf4c5f4461ec2df8df49d993766d50858d0f6b7d0def70b4103f0a38a78fac8031624eaa5ed815373e3ae522f3afa3dca39fb9a75e86474b81b6fbb994caaf62cd35928ce5f73606a88ed31643a6cc2285aceb3b6afc155aa0a5b4b92d6e2605a24becb65b15883df261f9b273ddad943202085cd780f4db60aff972af293384b9d85c6b3daf2a3cce8490b7af695308c097d07e41afdb0e2337cfab9bb097e61d6c9a038b7203b63b28c1224af0ae62241fd9e2a17bf0e12f45886096028993372f00ee59c5b55ad7e6e9f1048db860e0440445d61322e8805e15557e2cf4de9652e109cb35d8e652dc06bb19c2420ccc23abeb44dcacafd9829d34bf74d66c67e7e9adfb6c12ec99c5ef9c371b8169bbde8fb2ab0da650937fe4f7c145635d84096076c17c911a47da0f35ec71b1be995bf500ec1afe7fd6e8aa221d61ade2788e93aca60223dce21cc98257a2c8460bac2649c7f57af835495bc7c2d +shared_secret: f4924920e64013fae72cfdd1e94b217eebd55a011f6b7542958abb297e4fd180 + +# Official test vector 68, seed: "cc0c86cc0abf86fa21899be1953913c00e7c46e6b5f730c4e88b3c034012763981d7f14459d3081638080378348856ea" +entropy: 5fc00f89563e44b24cd67d0ce684effe5731619fd08e7d72e2406eb016afb66b +public_key = d743a9918c149231c6bdf338098c07f21064775b6700ed30fb2153478b67b0f344da35ca35e4b7c289a503d5ab9eab6e374279ec8ab67b2264d7b9b80d6bce26098a305734e44342a5078597f3bd574b931c3c74461c8da856239c24c576815f7f48cfc026baeae328a8207f5091cb7248615ac076f12763f8b63c0b75a1ef075b6e1c61b1c3bacb9c8895286e30729ce083b90df566ceba4c00e06214c295ab2b95e2b70032e04422572c87b475a63b53fa84ac9fe3c8bdd3cd06c13859b263d22a588b8126f2c615e3a705e0ba960261b47638a9e83c5bd3f791b362652290c5bcdcc4f3c93909431a4ef875c5e30f0c311e5e8344deec53c3b4bf584932f168710f66cbe718886e2ace059034fcecbe39d50d012c0ea26b8cf13807f1117f32661cf997145470c8aeda68022ccc43d1bb66732f5966c11ec221ac678bcba824f43c3eda94401c17c4877490e4393404db53a27b1dd3aab78e152a58f3741e1bb1b9a8202df64434ea9c5a8c9fe7584ea538250da92295d3a4abbc3e392a36cae9af1cc51095b2b2dd97ba7072acec4b7b83bb6d284c5fb3fb634ab3012e8825f8748022d8cef7367ae46b021df68aa8239d06c09fe0555e07dbc356293d41bc4f1e133ddca95d2298b2aea88aea5637d262390a79980220095d7116447c5d5b6ba2b962c794c899f45860658a0a530c7669134519a501e5a0759f9a50777a2a6dfb942f98b50067455a7b692fb1cdc2c10f64e9114b29cbe173ac4fc2adb95c550ae7a55387bf01ac3c45222fed7bcf9e240a6d9b0d088c032aa9714a6a55c692635b6911d92353c68794be250dcd65782a6674f87343a6654324f47f5ac9b384b22766d0c96852753a4449e08371d5128f31831ee766219e910b1f6267a57bc991da5b2b69a5a9212ba06ac917d45c9aa25bc1b513f7144217e84f1693360ea0690e51688a704c45cb6b1071a0e9a130abdb6cd3b52b8a429c33d126cfc10c73c928da9507aab00950f37e9bba0ab981394b137e337a88249100da175fe9299de1d1130381b3fcd265f7b36c00959b5bc2c150eb7dabf05bdf590e32e063a01a7cff6a9a22c56752c8b948502f3f8ac5ca444e10bb6bead1c7557b2bb2e37d55646455162806a7778b1938fcdb7da3e64c01c4a36a847b77958d27ab9defa6256b6a30a9b9962175c13721cd28e979e0d60196ba8c3c940aa4718d39a9b280486a6c2264640c4b09642499957be9642b6b545dbcc868098332fb103d75e38eb7ccbee64a341b38b0097479c019257be03d5d290e89a6a6f0b61039b128b46b02bcd750a9496ec4fb8dd6378e1ac77aa9f37a75d072d268c365725926cc76b58b9da040c173d7732e1401ab222553d6aec7911d052c569c59393997372e548086abb4de201ac1c17f25d76fb58c4ff3380cc5965720b989f4aa252623c215369076e771fac786e7f0ccdd917da64126fc610eb76948f97a5c3116869a11a46e612d9df04be0b1af0e8c8bb46607ea4bc4b4b04b3f79a30a2a154691a79217537b97a7dff6ab4edc9e2ad6cd97d3aef52837aeb232f799a3ce30a6adb88f6a0aa73fea00bf0146cd5447c6dc483b4955a0a3c241e7cc353c2c7085b84c5162a49e7d61a2d0e85a009833f3eb2305d7d435e2a4c81f358aa8d0dd50628096f4 +result: pass +ciphertext: bef3076f55b44ea1791eae3b2b28d4fc20213f11983e57b7baab4f674de12bfd5fcc10ca13c4996002b08fe7cbaec7a5b6cfd2048af1cdce87ebf46a44167cd5e31619f89f61864f2b6a613d25781d4435ceab63a9e36a7e47cac50cce866da5b5646c45248c9d9fbea2ce0a676fe7477c09d19052d3705e75b119204c155be6eb2049a1d75d6299568c0c5531becd0a852303eab69b2d0a8cdcd54b9cf61df91db58e374a6af5cd82704ce859140794d35de86c7e8fa63b57821b9fcb3da45df3f6a39bc2f5f600358f83e30b9a492d1acd2351f6ef614b9a4393ff8c3961e62c754cfd1fa877534130892a90ffe1d91262daf0f23dc0836426d6fd2be36c979fe6c0d75eaf094f23cadafebeb5271d544afbc2af4bb54c4524d2bc6482d5f82b82551594cd0780d37409f1412bb7f9bfa0428de5ad074cedb4531187db0997adec9d23bbaabfc9b230b4c14dc9c1b1180feef555c012ff85f78d24c0f26443332b7c0ffd49e7d511ad1c97d304a22a1188cacb3b36130589d8dab536a6f107e0ee9c939ea9f95552a1b2c0a14be0fb38b6d8df01eb600de3c5c66996ea5de0ee68eb24a170b6e601b65bcf563b8639e3cac74f50c6729e38cafbfcdcfc48a019eaa19bf9fa44fe254283e0153d00c4d8232bd3a621b3ec7a6fcf353ad767783c1beefe4f233f1184a67fa2f552a70c18da11d04c941c2c8e5d5091dd60b3d420baf14a941be26fbfe9fd2866b07ff0e05facc01f34fb53597cbe5c8e9ebfc2c6de58884ad77825585c339e6b983cce9c08ab7d2b0a55977d0e555939338713a09ec9c4783f29fb8652a688b9f3914bc5118397d9002a041b0ca41e170c52cd1cb8076731329db332ad3dde234e8a7adf5ee3e27bc905474f6deb6ced6846213f1a58ed38b6969e7b2bddfe679bf0a0ddbe2c6535b6f4ed57b50e49787b99ff2147af091f5cd22e3bffae0eee925e824170ffc7332572bf330b0ff7478736661284a69ff0e43347f40af1bbb11366a1a03beeca2bce132e06cc6b7538f37573820723aea8926a3be13a7f7c73548697e3b4f87ac0872472bf94b8396671bbe1542c869f188663c30509c45deb7fea82312bc4c8c5952693901275414a9e7e3de7649a8abbb9ab172189fec7b79beffd7f752885dda73a9d1ce2f707454bb13905cebf361a338c13dc090eecbf90fcd873595ed951d1e289a98a3b8901976e8248e3a16ea05536be87129c1bff0f17696967b55ce7a73cc7e87452fd5f72a4ec7857ee82338d7b8d8aa2794f45a2c0b09fc3d69463e86c1678da047ac48adcb6178582c78ea3d48730466b524acc2c339b5bdb5bee3786c7452ef23a3e9c9501df43c27668b7bec57fa7df4198d04a6ae90a895440b5bea8cd2aa810c145e95c8ce51c017ae55341228a75c3167b93b4b0667d6a91a4b66bcd98c3598634730b78bdd9539d60b9eb8a5af2a046c2a8ca7c9618f845b941f920532fb0726898f8427148e4f5117e05969e88788ae6535d20058239b321bb33c5d6b7c1a54d7017 +shared_secret: 412bafc716efe4ff928d9a86ea4665dd841e2f102a8363b994a0faad63251eda + +# Official test vector 69, seed: "6d5a7cc326ecf3983c4e7683f45263a37f692f3bcd2d920e1fd9584350119e74f9a3f905f70d3e20318c1413de2a0dea" +entropy: ea22a76065db4b565ee1807fbd813b43bde72b0e08407fb867c6a18995025e50 +public_key = 8e4458305ab8304a53b5c47b42911ba1b011c4da11c08b281e625f6f37815dbb1f3908c4c1646142b14d846b8400114face5cba669179ef121436a1975845652c5cb4ff62fa0073738f0264401adbb78b44e61619977804aca17deea16bad48655133144781b196c2a949bbc9aa8714758061465a9cfe09f2a1316ca875523e07fba515296309b6b7391b8d192012278d684b2527318f30a7c1e598a05027409f65a7f36b57f693a660c7a9f2b0bc38420128b87b005b5ce7631e4a10ff858831cb0112f5b6f04334565563e751820da374ce2819e4ed9bc5a959eedc4052c502abc54baf3fc0e426b77de7a274f81451070042e70c19a09421454141d2600df76a740423cb887065939cfb657a76785b35a5868401cb4d88ac8194769ad2499f2f20ed2a188e8e47e918cba7342b4c8893fe411b47b058b0070771161970c4331ef67be34bbc4781171bfa19d51e11612f93cda611f4ed88f85b87e8beb6359eb410e7175ef6171faa03e29e11ea8a6caf023c357a87afc652a00cd422020295bd34170068d31b7a058800026a49fa1f7523ebc5544389cab259815114d4b01d089d3cff6956f5d0b5a9fe652825b1150e21d11f562196892ca41941b46018ee73683e008525059496a07bb029737103b729b1fcc13ac3236b47c63a6ed4458a9724ef7b62361e75ba726be6774cf6b3572657b2a6abcb69182cd3b880328bc4f52c075c150bb22aab08cb2326815712ae20cf1f257b9e6ce0725782e9590191b2055a45c4467c5e7d70c35b8a61a48a317022c298b612782203a820f2161844f6a6fea58ca9f230713c701aad2700bdc951fc9bb8f560db9e99f2849afefea6c366c982f3680dea24891c631a1032d9d884a5ad9a11fa8331be85f1c91c6de2b4143ab403b153d9dd714db314c683ca24cc45f86c2276058be32ca1cefd4116ba386069856c6128ca86a63fbf6c15e876d63f738f847a32166b1592c3307d9c6190c5c42b7ab756ccb394c7c26c28fcd158bfdac9f04c99e30254d500cd0da1b9f2b74823f14283a888bdff45ca218b89b9450fba868ea9b1a5858509137160db31aa292863ed216aef822123c294a825e26fa3adee0291ab37c1462c89a4981949bb764f4222b3527dfd8a715682d159ba380339971857272c7bd7442cb73739c450b58cbeb6936b8cb619654037856935376acab92026bbad18c512dec4e19671180599e01651f008c3a04007cf02535ad7608e1e9257fbb04e419976294702e84341531b95e1b20c2b152a4d849649113c69a8f379b5d72aa86e01a4c5202ab2e276712f1131c411d4072cb45147c562c60080c56eff7aa7d90c4dc293b01ba935e345b88faba62dca043d94c4a666786c35f9318a579a9b67e429144240d206612a6d802fdc24aadcb42b0db4251e06df92a67e632aa4a29000a77cb2fd2959f851288464c824872ae6a9fa1bb3a71d8879e303c51445956ec8ae49c4ae6ac4de2047edbf3c0b23a29b8b86b83cb24530b0d17739331292bab85868e4a9bcbb2b4d4514e52d9afbf66172ae560c08c7f9cfc0c98ea4ec9c785ffe76ab5098e9f3c5ead6a7759b529661b50e0368246c5afbbb9b876c8072c1c1ca63a4e6607fe4286fd2062614fcfb544fca36edf0785c37bb6f5fc33e2b9d9d03a0a6c +result: pass +ciphertext: fecf9ab93b18fa40d1b385b0932aae91f8287348567fe0cec26bd6ccc57741ac3a23439efe62a433071d450e20818cab881f8ae2ff3157734d81c1a5296c7c75e0baae6501ff0631453303c2250dee03eb68f57ebca08aeab1a28ecc829ed08b67b78e248b54572d307bfb0e38c8708bb63da4e421e96381741a6a893c2ebd13982d26e223fbdd194bceeb430b8aa6b2b15e7fb3691cf4d5145023fadaa79e63558a9875d94614eacd3ff5e143dd9d93cbffcb6b6472ece3e56e6d7253fd2300b6863f19eb8e222be62a91386d21d9046b78ca2e04a38a5f028b657e26d222ada33f4ea5bcf62c191811f34beb57668f4057fe21509cc139b56ec566f8bb79157177f0680d4e5c861a3a5838233085cd80bb193ac3e06039f1fdd31eb5a025fa55c895feed3ee6bb484de762dfd614bd79f03f25fda91b05e74ff87c61132b1ad280f58e3a8ecdbb043c46d57369143d1b14ff04f689d1ae905ea93444994c09d02af7ddf59c9873c19d38ba6a66bfc1afd284e598091e5ffe6e6c3d3f0a3cf600843e2b2ce86ba6e08ca9f9fa5340472641ca84fdc047bc3c09a18e09b88f8b835707b036dc18a9ac1d03bec88950648f08cf55c924c7610fa604b686943f788611da45824f150f4e8128fc2b31a470ab59142a016a1fd7b95361ec265e3542924524754142ddc7b4feb75e849ae194888067257dd1f00c8e7f532fd06af3dd6d87191613a591707851c1758b81d41857e9a746324f9e5fb64d9ba81c33e970de17553050f639b94be0f5c4677e98514eece20663ddab722e72a6768312bcab6f5c36f1ea51f67905f433c5ecaf4da8a1af5581351d62b3dd46bfd5db9df29980ed7e522f48f4619ade16c4f0662366f0c0c9bc12e08d7510f80bdfe9577f93542341f0811de4aceb46c04b70322813d5e1ad9068c017bf2f769753195004b29c3cab038dba1b579c59e18fdc00026baf842b5a57b91821cece116b88685fe95bda154e2fbde8f49b288a2b50a6844fc2066e8be7c277623f1d8afb734baa94e7bd58013ade0aa6752307950f7a5f233e86369c75b9e34ba32360c52d1b58de44fe2945db78368c1137af9f9fee9c53ae99092fbfbde12e23bb7cf3cfda6c9ca09a203f6360bca6ff06afb3f040ee198318bd14a7dad4da9741253d7df92f186c801708aef95d53131704fb5382bfeef8c5be3071a1e606b9566632f065e3f2764a0c6ccc0c6e0f34d0b4648bce1cec4ae3d8d798a8c29effbd8d0636d09fc5d14b8245708eea3fe701249cece51ebcf50578844da1221624499fe6c3e36e91a12e1cfaf5b2e7c55706424a94be9b0c23e11f3196857e5009f915255abbc7b62770a9c498c8d7d53d0bf88450c563450fd54bbc9e3a731b0ab5c8015b829735a20b01d764892ba436acda91f9068af1042ffc82d1529d8be20bed87d43bc9e0071c2dfea7d57242eea011fcc43e6a96fae7fc018746473deb9dd9c413afdc90735c0a7660ba81cdfca11237c81afc46ea4eef1af1bd654033911da5e24270ae +shared_secret: c514d4086428200e118c1c297ce5ed865d7452cd7770363961bbb834f56c564a + +# Official test vector 70, seed: "f68fc0314dea88f66afaa76e6c9b6804b13d4876924410d1f526fac59a62e26c560b125b1d0f8b461f1fc2e351effb4f" +entropy: e9602b34fe73ad57f4bf6ead99743d645641553a5b9b9bf2e7016629e3e9bd76 +public_key = 77155f91195dda2b52c1bc4ff328c3732799ea0aa8ed4229e9a239e5b5c5a02c1ebe98a381dc56e1d4b56deacda3ac52b1088805476c01609a0a2373a4bca788227172c4431b000005d855ca059b4e554d3dd2103cbc7854a12cda368ce202873f5747450c4fd994898dac5926765536662c81581ab4db18e9763cd5a747659440c9a33eac713cf907ba0d5a875b90882de31b5df825f337b46451705658915630035724c127c9c4b48572951770241993f777145573bc70125d35f1b03a121d09ba4388889568ba109f04617360826ad48f2765944232b1cf636fdf3c39c40ab87b4b50bffc1019eb0fecc35cf7416ddb3146e275cc7ae209269a7330977e9dba9caf79c99e30b8880525caaa84401cbde7ccc0fda4b250b7a2a651b3afc123eff52eec55650029af651b2014f4669de319435b7dbedacc173c3dd1f3a8597b80c9c3869d7389398a2404e790c9463f2634cc7351bac9d74b62b73e7e54cbbb3ab235c7c1ce298c0c0369de33224ab7b03517856e43cef2d39f1d325d1e221998c53631d32a57a880f24476a7e89f8c1b2d1c49759c322e993cc7effb2bab738f2648bd8133208ef26ffcac76393714859ccce0515d4a7192ded6ae5e828be6653b05cacf0df1b4816a972592089ff88fa421a490ca13c6789639c909c4db18ee43a01989c51b6005ed2548ae24ac8cec10bda7649e6c9359c45bf0ea0d39f25bb1ab3c3b5b88cda24caa8c7c7106616ba05da6727896d2a895835c9b83654b358e0d4728fec8a150b39283e345f3e06b4680bc632009eb85adb811277926662e531db27b3ca60843a6370c304c1dd21a94aed90c3663c0948bc12f0a32af533866f5931d5c74423246c16aa4f01808d06a6d50444ef8a3171ac641e9417e2e025390caaff16c6703680951b1a0e5abceb8fca9830c9ce1aa08d5803280f31de3cabc923b5a1a7c4854d841729194d3685c03f975a72440b5fa01b11868a48bcb73794c83644d1d39b9664c432c7b3bc311703ec01d268a34a8a1b3dc79b9ae07b8cd133b7d4baba7f39b4088043e4a35fcd08a9ef141b78cb1f64841ebf894827bbe1ec47509817ba27cb42222272a00a633e1b2ab344bd3778e4a579ac7d64a32e2356b1822c1334fa0e6acb05798f63192ee20629106130a1ac330c6cf0200908fb37184740e5caa5ad44067ac7930f696bc9226235d212d71f57ffc2c8c185c1f3d717271022f2d256963dbac5c5a1404a71e3546695eb27d73221892b5bfef114d6f88415875c013f16e48d3cdb68c2000a39a45263504e0a7554386d68a4d3992c9f6196015066d3b8282e8d3398d2b5f62d7af54698418862db3a84286f142a8cb44be011e0f2594d161611cb335bdb018d9e58cc71a363b29439d54cc6b293af33b0dbbcb80c7797819a96c1316a783f60f987a3fbe1acf80f22f610037d17247122c4ae2b2214638205328c43fd4bebce93d47c02b84e1cdee7cb48805396c24410d71ced4805f36a105b05c6564ec3450654cc0a12e62f7c0da79496ff2bc97b7b4809aa30d577a2f3428e48220239b1b97d9278dd26d93d186628812fc697d961442879ab64b4ba0be3c46f5e55c13222058b407c1694979897ca0615e8de05d85d3532060076acafc8e0aadd8ca7406c7bb316abfde1bcdd166 +result: pass +ciphertext: 1776384cc4bc09db580462b981e07705f1b7af05956b2942cd71a270a994b3c9ef525863d3ca86596788374eab881474d88e87e329652bed8e0eaacf44b90515f0f729a206aca3d6ce76eae6d3cda5caa6ddee0e530d841578529750e4d0fcdf5f122b9f921a5a53ce6442a733ef5ffd7ef4e52c3aae93aab7f33ae33f3eed2a3ffa5a4422c368dc210ac246b0d73dcef478be9e15867ef752fdcd1db52b733236bc9ceb8660679f9e53f62c670c68d3effd8013649bbf5685a40a1199de8baa84e701eb4a6de909230f41946c9e08e7d9713e209899f0710228bd67b4fa66950d974f5cc4bdaa1c826030a7273787c1e1717639d0ebaffcaee389afb6f044bef662da9b6b4347b0b0aef9777f5324979e660ec40d43e0a17e5bc2090aa0bf1008ff02a129d3b1210614e99f607b521767c5038b138c7d188543297c405df6e10d618d41b8cd3a9a935e048233b6af27db097721ca8999d8b12602c0aa21716c25e09d1a1b6eb4e2e4a82fc680a1d8ff2fdccca10ce2e38ab36c48f46a5b419cae0bfa00a0a153015e9c908d8439b4accd8a6b6264eece46e97b507644c200e7f985cd6c3a0a024aa0bd18b44059ad74a8d6a1462cc9c9ddc532a803b251e73775435689f80d3f79690aded41b83d8f0ddaeaf4b1a85c1bcde9e17cd1c6635272c167ffdf4272ef8d6552afb7b54500426b2f612df941d540e596038bdb21d8a2188dbdc89a2a449a2774d1f0b21b8db290e96ce027c1f0c11a8484f857a069ef77e6b9fbe0ce163b4dfec7a11e49031d69a37b516b72ea4e1ce67ce493b8c052c30517ad79a540a0c0e86093663e7a4a4641d9d291b929c59c4efc47efb19fd7e0c3b6f2c1fbb9449fc18a9eedf70f71b70f92f8369f7624a2666ec7f26792b34b79c659f1bce8d9f86776401730ae70e7d4459f0e8d7e1afa9a1c41019d536f0e8585ce4f2e7c42eb34223607e9d8afe66707475b6a1e5e532344d8aff98d5e48b782510f064768d76f4e99f6bf716df363c5e2dfd724c78e5ab362e2d8dd3a7fe3b35410b25f6071cbecb3513fcf755312fd082ce57b1ebcbdfa6fff754a9f7662c115334325cfb37d21ccf5a096a221138e61e1adcc4548a7eed9b50d3e267d1bc6eb972e678b4c5f0fe3419f663e0d4525bb0bb5859de22550225f90a70f76fdafd551b5466d289a8fdd3f338d1aca2621157aef4c64ca9f256a8f88415a6293933672ec2bde631bc1723a362edc7aabe695ebe88d38de01f0eb15bf582eaff139b8812fdb3c7abdaa0f933b6724ab3fa77fc4358456c0ce509c0b98cadf2b9e8de3c9552d363495389a9b898b2b8d5fc97fb751ef087d69c8a7fc32b62d5ec581ee625cf4183921bc62685e976d41d9ccada44570d8919132114717ad1a119dda21664a955a3f355cbc9879030142b418329b39a0f392205c811d4baba6301d829d312f8a4cde5fa12052c02a4c75a706b8f317f963f01abe5d27ee0470afa619d97d7fb5b3b0669bd08b901bd9fb56fd4a5656d8d2cfde1d116676bd8 +shared_secret: a175feba4c1bab576085bb12683d2bc44e98c75f543cee714c75391c559450ce + +# Official test vector 71, seed: "a229218b0d51f58d915df549901548fb0722f352c7470900e7e4d8399205764a319bbddbd06c00e8c5932722ee5a404d" +entropy: f72b9080a6c051bbdb9b0abc1949034be0f89a9f73fe277ec4d4740c78d04a83 +public_key = 697588a4004634fc1c77215f0677879aab3e63b51ae7436c5b47370e226eb4ac15dd0281ec65c56b83b60ac42de17b1374d1680b76460e294d841c1062638cc003d043a26307c08025a594fa3676df03c87789a4499575948b2574f6931673936e971f2c79598a1b7b35d28103252b4df98c47f6afa057bd87b1cc516722fd72bae0f437479c1ec6f68087453e23fb4381e5930e5a19fc9a267565b1dfc7aab9c13441101e57d9a4a454a6d1249c3cdba091113d0f1b257d0986f23b4fceb35c95ab05e2911dfb2899398808582a6b1aa9950eaa9c87c8bdae7372d46c2852e85c629c25e05a169900b24cfc0a68661b6d44c74c658ab8c00c756861be79272339a60828b9f0b8a325850b41950f97849dece714c494ba9bb09b74ac16138251363b52dc166f220623982c19ef565f80583b84d0b91267ba98b63afa31160f65961181951019419fc0627cc48de9d6b2c689969548641009cdc56b02a140bbc4a995a7f2593e0213cdd2cadbccbca41947fc8033baa1754a8815ad52cc31940451f8a62dd6b39e22a6b0db8a0f953c6cbca43f9c1285315f59ab9980ebbf57c1457dd8361da04e0eda771cdb37a6a54c6a47719790976a957978e198446320aaa840e0f1c076260e75e9a92980891aa6245e003f1fd6363d0b6e5c73b476b77ef867a60b225a99a763d0ea80a4c61739875bce5c0f361322450c93040b4d6c08120827b8026ace0ec73302fb6824367ac89a0e7df45b850618612ace284c2da4421689d8c7034113f9a1b2342736f5f11cfdd7ac7f8468075a4a2d7960dfba9e264514a8d7c6d11c660cec1efe33c04b4681dcb31fbea47247bc83c581b174b0cedcf0bd0b7b622126cbe323986b75a407e416fc0032fa2398e504967ed021e993a955713a76365ada810f9bec7ad1a6929a466f08113cfd6919e014085d4148be060ebc014fb1fa3a1ff70a3ad94baac7be6c96bc0f28a021e39cc6bb8a6e16312255880a84778cbca55f4173b2070d527357cac69c22587208496af1715711f76d5c185807a13b2c791b91f54b23ac8b66b71b3e211e55180fe7a1bb2bba7f97da8f82734ef777b7d2653e66e814ed7871da35c95761a88a611bc383add9a329706212b9780ef5d53e933c99318ac47e26859f507bb50597c3ab1a252c77d22a817b402b80a63532f21a0f296c40bb8021732fa9da01bc60bc662a0754914462689de756a397e2384c2372130c5a6f05ae6c8b81ebc22125830f04d3740d2638d031a21f1653c4f664cd182b11887f4784c27954984af251c923b5c2ca4f1777cb3eeb7a13c351c07c4f5562b4a8a477fd348bcb9b8e6bec787c2340c02c0dcb236fe8d7c6ec8bc9d156b89bfbcbf4d0599838263ad5b90fc155051137d6800c898c8a50b82a4e3940bbd3bcde2013889bc4f3a7022d7c49370ac8d826a3aee946b79897bea8512d8b899a8c17e439760b58859393a5c264b5f1549940914fe278a40b6c9a8304775ba30c8ee4cf234ac56862ca2e935691e426923973c32b4f2408cf63c99d7b2c5f0c5aadbbb9cb98b53f787431fa73542c5569e5f5ccf0e4a868cac6529bbde42a5f1881ce0a729e6a531b0c401d4979a7425baa8b0392a8ca9374323ddf2794c237e38e45a43a5a34cca2875d19217ce7547d2eba6bca +result: pass +ciphertext: 8ad5e238206e4068fe9be1a92e9ac82c41d247e864cf81e6006d6f3cbf6d7be8116cd5afc3764a34c2d8be6335745fbcdccc3753d787df7963565f8aa09faa473c3a31c86757e5747e5a309150ac618d96dcead932a7ab3bab72c6e2ce24069787052e998de0bc8f43ad84a48717f36e3cb6229839004f07f6c219375aa17888add3b069ca65d4b83b05eb9e83e2c2a053142dafaa26fea7e995f126079d20d1393df571160651a3602cd56422486b4dcb6ad4bb752eaee6af42128c17fcf72718c527d08817f6b2406ec25d8c86cb83ff644c3bc4fc9400d4f5f6b6c43538bfbb16033eb37428592b7c911139561872ecc14e0902c34dc540b3f232a2fb91f4b68cfe3f901f96e355c6ba7126617a8c8d231e58372912c876f8ddd6e1ffdb62934a96e9feb82babb4c3e4312fb6dd64550dadde1c3c82b42f129e6825464552281810809747f64887e7ae70c56d410e4b4349942be418f7e3ad2d85afceba02107ad44b7bd7f8505c50bd259e0bf20b8113f7eb6a209f2b97154b0198e579f66784fedbd5e100389c8e271ec01c0ddf5680c536d12599eda6196949df9aa66116d71014d79d3a632ac09aac8bd04cd07b2775cac35d158ce012a6f157265c06721ede539be6c87b6ca44e41eedf50bb79d54d3c77179ae8734941daeb930a299808d5c336bc954e0fc7341681c3c2c7a17f21eabeedab5febd906cf3c77f52387fab180a24799b9f4438810933d726a990cc0307e6f5ef94e6e7d7d074b7804d944c2f9c341e6d925ad96baaf83f4550fb30a89591cd8e66496dc59eb24405aa518337fafed03ccba8a0925be546672978d4e49f068e9fd6216cc9990ae4e7c785ae005409dd512d766dcbc8169412841521ad9a7cf48ad23c075cc27eaab6b62ca3f0a27f6583f1b6ef541b6a2035eac34b1ec3cac912d2dbe1daa6a5e7165b9093a9b8f2c0a3092af78305dbe137176dfad210382037a7233aedcd93a4bcf0b068406c0fa618cb7b4e2647ef019757fc412eb0b7f7e8b454ca0d46765928d2f7a468f8d4643553483ee671c9476ac712c9aef32e357867b95e5edfcb6d93f013e4b7d764dbd042e5133d5d5b083d9704872f841cecac31c46a4394998678d48e28d725d27d36f7e6130ea21ef6f825a2a3f45edae4b773a7b1afb981b24dfe59c181d6f3568db716a58128e546c16e42e769a62a5fc785b3be87aae4104c9737ad0aa5853ae9ce38014c51c31c0c404a0b67c7ba501766cf864f0c38eacb4701c0b658546d38b32726bc1e1649ea02ad05f4cf5c4fefe235e58e3e8ac3984a11974fbf0d440399e9aff212fec6334d5a1db23a63b0cd46157c7aeb39cb9c99be81efbedca1ce45e655ce37c3f10938904e5aaa6a144e5e2d838aa54a9a54c3e695e2171c1a512b423f94183eb3c28545ade0558697e3e0fa12ef1c5a15b123aa4d7c14c8d6fb60e5b508c083a5f93a35fbc9579f31d1968f4a9248564ecf4cf9ab4ab8eb016a82e3aefcbde9202eaed915519e346c25f04424d5f262f436b +shared_secret: 9781578191ebf49b162aa768d093a332b9c849c11e240187cec2ee969d4b3860 + +# Official test vector 72, seed: "6960f21c7350dcf41b4770c551dc8692d8ba2c0b6e162c589166ff22e7a1ac0f94c2f48504a5f7eb0da094df427bc98a" +entropy: f1e5542190db8ecf4b8d617a04fd3783ad0df78bf8dab749afb57db8321d151b +public_key = bafcc65109cd59f7084e05cfabe4515255ccb724b3388239ce1ba8c631c1e8c0b444baaa6ac481db8b4d670ab65ca27f33a92a11c48f6ac038f0914637b749d8b962c00ac8ab0c019c92960ec3817f34840aa7b63b19826a12234a81c9faa8995d28c4d4c44a0fd2c51720cacc8751bf6c31caf045a79c6f9b15c2d406c11fc3b5df6638e1b83164175dca5a1260a88c74b4c2432a9b76c39d43597ce2e3ad1797c25f967868b66bcee9b6a4d1b53fd09540220c7ca75943c52e3d4a124453499c681c1fba4dfe80919bd9467bcc0ab34b7db6012b18b3cc4c679e325b82518baf5123c88786745c4a0600a302a2a367b717c3dcb4c32aeb4770fc93e0213aa54b2c6a37a326f121d907278203724ceb6cad8717fa3a2106217864274e6220061620052799ba22675db36863b2a447e5a62b3d2511ffc83bb34cab6cf7356a27c29798c00cb32bbe1023fe1221313cc7ad59144fbb98d0182bf0183b44990da81016e2995206f2b0af19c8e21b1afe8c98d608c0c7e52075137caf22c69dec4e0f1763c8bba263898b30946663d84b5e0808e6ab9a6df970d2568303704d4c651c912b7297a89534e324fae62628580becc3a2051cca9d5757d5e53ff8fc242e42b2adb06cb2547296ec8431fa6eb8f7384fa559f9284d528761f9a23e85a0bbb3e57b7a876d2d4934d33838906606e6da9a311c15cba30f39d05236892462824bc4a4b4d6b343e3594fd9d68972d99eb26538f9eb1fa7f0718aabcd5dfa5a670b0f8cd595ef7a082abb518fa34891a4ade983877a333e956bbec9a82a19650866981b8b8c406e22abd784aac085b6ea553e30409ed6b39b4f367ae45b9fe109c6ecb51f23d2a755caa347aa95e656cf45a15e9438b61031717b3551e9e3020ccc330f254e82d89b5e4839a9f8ae267b9365aa228786a371859d3847ae68713df98768a1c792adba39bd2359198224376cb9c011777efc4aae1c3d179583ab0952bcb5b1e8577a5c476189d3301bf87fd8a1163b81bdb4a8368934ba4867ae4dd03d40c2cb5f974a5c36a8d699546d831095e7b354490838a40900521da4a00d2fd7117e1060dfd363593ac11bd31ffcc08c1eb8806f249719751ea3eb328d3a36590919c2317429d0486266968cbc6973d483015b77eec543b7f971523589655732bdd1783365761d937266a420ef3b849a630ab5a4003ff09c116c1037f4576c58adecb5a5e0899892854b8971c9b76685164a14bc5c8b9bf212c6c7ab15b35e25a586e465ac05f3911da7063208c3df46923622402559ca963a39f003ac0334ab19d02ed58c990ad983318b33429acdc637a8393082684c517b75194506bbeb9686136a3c8a284c852ca747fb709d4533d133b5798b50c1e59f9e99781fca9f447340705c6cb7e2231e257f95d681805b8cdcf3147804405f30b4ee63c1aa9c367eabc3fc606306616eefe91026507780e6339b209cfb7a227596957b136e1cbbce15fb9a6fd9bc798c40f0ccb7651b150d281d78b3508939ba836ab719cc19c61860bd3c624827ac26639c05a39c88a1873204175bf297561723a16375dba51947b83e46e84899377411b2bf8b743cf8dc23fd2ca07d11aeec1990c42a7321ac6f01cd866f8719ef21bcc0e02346fc5d8ba3d3e7f1fcb52d37551212d647 +result: pass +ciphertext: 29172b06b0849e37c10c1a8a719b8111a2e5f7cd0b195e949d0f664220f0fece380d03ff20aae2d1f4403a795910536638f7de4b502d497bdca8386b51734a05dc23c64e5970ae9bb57963088669eb327c4238ba2cfaec2d177e5b199b82ad664ea184db6ecd35ee97f0a54f2f933f9a04383188671497a5592f4b84a8fa3e5700d28138b9d3c2c91d104a73037cf3ac5468460ab1df7de05a90e0fa6b4753059b5287dff997f0894825d3766176c2b9fdf767ba065e45e74b6c706e47459433140ac59663109de28defb54d4752147623f5621c3b48fc4368cee7253c128140d4b1dbd8afdf87b9d58454062b6b3262018e37ccbad6bf27f4f947a9711ced9a45644d3ba3b9d670324c639c9dbfe69c2d783327bf7a99aec3730057e1e1547818c67b0e96fd48d024590db6cce338b32b06c9ccf81ed967e2728306cd616d44884a2e079af7058a4eef82c48214e028bcda3b44ef696c1e08e441f28728e503465a138dd7fbbde562ed6bcee8f5a3742d23aa8c5ef32179a1c44bbe41fd153ad2aa57eabaad87fb0e022aaf3b19b1f3a649079b74e7a61e32128506160e7b5cbd31d56673764bff84aa46b99cf1aa3eda04191a769d5ef2d569fa4144f51cfb9c02cff06495f95ab8ed192fbe9b363180bf90a52c752f70f4a587381775544635c5a574244ec8a88db3b86ca46f30a481ae4179415d234596e2cd24ab966fbb670e9255eb1bd3c261592856fd9ce541be9a3b06e157c5e4e165cf91008c51d11ebb064de31e3f894d6d4d46caa0592df5dc0c236b546479119c842d3d52deb75f966a5d4050e01f7b16cf6b93fc8731e5055325ffda000114eb7cb6d7916088fbbb8ecdf4ad8cd229ff036b2a6a400ea1b375c576547cbb0ab91b8f6f4c71555836985b3cc979ff56938d9863c4b0b75b011ce70c1a60b77b67988237a2a6b6bbfb180d36981f70eee891b6c00ab1261e7a0db824981b5450b09cd96868c611f40a6e5ce6e12a31934e56fa334c3dab7515e7c185575b2798e2dc9c50273dac8bf1da90fd8d8d5272e5dd24b87f57bf47ab79c8094fca322e50fe3425b0c570764d95a7690785b7ef62c7f4d6154a898955bd19c808a3222c1ecf67f633267ff61e8ba97bb1dc0b648a1161dc2499beb5db7bd621f263884248b98b6fcc3d9bf3c4c4ea5a3f0fdb33534c15d84278f8b5f1d2e98661623ca1cf9cde7b8e834431ca82c4cf5fc2be458a1abbae90ae6802e6adbf6085ebfe11c1622ebbf2af755d8748478bdf1eca4059ade7275718a4df81fa74810ece57e38f10bcc954be61720da461f86f4ce2f3771d386d836bc7c720255dbf7aa6455170300e7ebc2773dd996859b53757343045178c7893aa36e4f231ab469af10cee8cd17b612c6347755b0e6d3a6aa451b34df9349228eb5c76e0ee3ab37633917a4c20554b2940fcfd041ad79c19634d9626ac3411c76e74756da3109062f04af2430de6301da1734ace93717b51b2eb1545d275d442edfa35ed905eb1a99dbcb468bfc3e5048120 +shared_secret: 515dc87c21e6b134a577e4eeccf43a982ba7eac1224d701cf099ad07fee77cb7 + +# Official test vector 73, seed: "53df46012cad4a745b7a3c06e18ca95e0b839fd8161e3025749a0887549eb0ed6a44eeea08bd6060d6509dbf7e9dc864" +entropy: 74efa414ae171bf60b6f884cb7e5ce12028f49365daccfa23e845d551711660b +public_key = e180a227ab843cd49d4970af3b68c255512920773abae9a2e402b154b8159b63b4885736e63632313b2f99db66fd4307d411a66871c8ec859807205535d907c3c6541b283824861738acce081a14e8047a63cba2f42c71b23157c85a7763d3cebfe93aa7fa0a083284ecb7c4dc16c8119b5d90546a461a5b744b1084f120bee2b548801c381a9d561bb0c5c35336601d1cdc310a610c8df78de62477a6f26dba6038ad04371913b831c326c0537cae530469292ce41c40a81b92a5c04d69eb0303b4b38a5cc45fd2b0ee90cff0b81474d0406c8b34b34c1efb596a704ca4893949614762a30c54846023dc3a345268ce55c0be97139f5f733664a58b67656ea211a87de01f9cd902a9295355d13a15bc044fdc77c4c53f671a1438e283371b5db5f82fb0d789e877b6820771f0ebc64da864a01caff73c4a42b5416bb043e29c7b2574c6e214a352f4401d786b4d5351a2559b87ab00ba84511bac1a099b1b33e8cd45da078d447b23326574379dd3d32ddb22c6a4037fda719fb104c85f0264ba4a9ed0287a31a2af6d58291676a37c434ecb234e4e1c648fa0760da57abe45703e677fefd03687415132d03252291f02f3901d20427904511f9c11a7f07041302033054605e97fb719a2f70648a2c30a0b42899b195ea8e6cc96610943c3276698a34a61893ba8770c69cd55f1bc0f00ca0e04177d0469c4833fcc23a6ed339acaa91b6e081692340f53cac66af5a6bcc2391729ce4e1c88d5c2610b00454fa21e8faa6487022f19f2c81d5452d5170255108beaf3979ff9abc2e04c8e3669c6aab80e2b6464644ae2189c81fc92d50cc56039cf5de2325ae5163a1b63652222aab35e17430d16477537f867ba4ca0e9b1c83c61a562c6822e61bb1450426e9716a77c1934ab17ec69563b8299e6ab371d996849c8cf7a84ca1a9bb654e1ab20a81d65314595a52ba18076f8712532a81b00e19e8734968f87c03fa4763208862d9a3ca648582482bf0d5441fdb7c84ab237d9f8628ed2001a501339682f9b8aaf6606344b95342fa62e782c1d9560b6ad55aa332c1fd533a74d026a9c9757f0e91bfc96545d0b6477f31f95840ff0a4127b16c32b635471480523f93017577513ea96159ac60be179d3a09c5ccb6df44174de866cd7548339d314d160718f262edf32382915197bc2ac6e3a4f77229e22dacbdfecbe3f4b72ac6bc9d9354e7ed2c31ce7acd7f3a2c8b9abeec00613b1600c8992376b73f8c245ac9841ea06409454b48d8c3a152bb8d6168a3fa6423373651caa7aecf0a5971641bd66897e5991e793343b5190bac3107eeaabc71bc34788a345bcb9ad8a45a50a1dbdb1846bb76205b06e8aeb692b4200a596524954963f01c946131704f6b181d7781772ca6365824f6c6c22a1af3328a2c8978ea8d7c38f6a00f7a6b3a50c2507f103f72420bdf98dc19aace30b792851142d8b43319c93ccfa966d71cff9352f25fca9e8a3064cd96e42e9a2959c128fd532902419b81972838532cdfc08f34541459cc68955c9c2a431ba5126c9bc08039ca45533ad8108beba49bf8d56bd44433fe12a6c55c41f3cc20560b28cf050cc1f195c5e817d23d95e105a13555923cc21b13c9e46d34182974451bd97b6a3da440de6e5bbed681d6eea2c6822b361019afc +result: pass +ciphertext: 30a4b1190e0b9a5cdf304ab06e4654e9c02c055c4b487884c6c77caa6fcd02c4a01869738f01423ee82176d321a553889d4659dfa53bac9213386dd87e00d0ed8c763d73a4909b223922dc9bf600a30270c35aaeb8d6e5e21f47e893c28380f70b4f19114944e7413f657927314114915c0b7bf7dc289a21f1c6c9b3079342364899565b604348a97aa5cabce2570944d128d12dacbfe2dfe3b17146892f1956f0cbd14edd3d65531aacf5deb667c48c5c9b76f83238c49a750552bc4740ae517c6b82fd2444d9430f3ad1e4790f609db80727cc4db6925da917789a83989883847f3901f428d93ced25ffffa87e4b9940bef4c3bdf2247d7c17fe4227d8c3b5f9c3d99edb5f6bfc6c91bfacde430d0ae2554f82e0b53a67a8822deec1d5acd054af2869b992492726f2a7c7d7b9ea0505153d878b301db69919f39640e3edc5222bc98c68b844e7454fdc6f3bccc956843919a428b2c882675820569381bbcc03d9cb932a1fd616a0d593c8aa9c4119bdbd9b1dcb046ece8a011a91056a11d2b84321df7fcbbed5cd25a236668e5b7fe2adce9e82a9cc0039501e57826c46c37177c8dc057d74b190de9bc09bf2dd47a679adcc2a5ff518abf5c8b33b95e95445c778fa97e5dde581933a71bc31884c5b515dbec13c4672d3a5f04d7930f55512e951aa8106115ad291ca9eee526513ed9872b746f3057a2d0dd6255aaf3c16a32b8de76058c79001f7cd23dcac80fb2561eaab3de336d913802e968cccda34cec120f0721a9aaa2da3c36c1e372c382fb194889c41d680f6e1faff0c1ce8627489a693d5bded36acd30817aaf860c7691569b6549c9951e06910918b894317df93856d4a13bb52646e44a3ddccd04d1d9bb5c472d11134544b2b2bdb103706e7a858a559f2e9f10a8b3981f8f858705822d4343a2aac48d9c534fc211be40ca907e1c02271377e9c544e6036234a09387b457d4c5749c80360a403aadd35ba28999aa679a4009a861ae782a614918c455959329d2bb1d91d7503f2dcf0cdd4d16de8188ba669f1dab8514d6ea80f9e7ce3e3e556d3abaff2fb2f956b081e8ae1bd62534b0783f74c7d7797481d2687427b41579fed7f2194ac898300bcbd817270bdd5b06ce0bbdaeebf60f6a308d3dff2e74e521453752974ac951aae7337378c87ef11028ab476576aadd3efe613118c9e537005969676d4cf2b8b84bbf785a7ab61ccbf29586f2c4b0c3d3a4be23aa92af35df92dd23e8b8806acde4bc187879d29444e2b1ef31712ff714072f83b028d3f2cf1aaec3020865401245970f6391a45fade62f7f22920b8729428842e21008262c091178b84c3acfa870b43ba47f8f85088fdd326d8f4de12ea21c19f8b5fdd7df0988b43511ec21a9265c3a23ae79a3938d08404cd8105e3b039cfe5714e7060e6444c77296393c6bc88c3df42c0d644781be5f232479cbc5a736e5d403b190cd6c8d3f472255c02a7ff0505afb9942f6d346fd7eb717f5beada57293e3ef9282ad10ae9a3cdc3b04030b3 +shared_secret: edc2c0314c7c5b2b071b85e373c06b31fa54dc499168d4b43b15f1d05b8b7ea9 + +# Official test vector 74, seed: "deb963f8b1d8fbdf499d564ba8d2d47915bb402da02f17031b37b4039a842afb9b7e48f37200605992bd2429427a7a4e" +entropy: 0b4c3cffb2ba4380ead13dc0d8acad2356b448a810da1df29f264c44aab6d24f +public_key = a6cba4e1a93cf066b6c6284b85c1ced4a4b17634c2dd8c758ee3cac74b2402460d2fc12d98943de4dacb2f5912fdc41e8b1886f38c6619831677e2a32a63860d2a1e9b994bf4f9cdf0c3c83c5b044c14b83e57c59d55629a9704994a4793a7178b69ac1892a578802a69d22d609a7832b55e731a65a1f29753870f8f6b26443824be227f578c6d97c57e570864092a66c8184ca58b1b8f89ba9c2a3e7a17c1bcd851aa552ddbe301f2774e81397a57247362426807f370ff2b7f6f7b1f5b83c2f3475cb225b71ca0750f333d72a434c88a902d542cb8f50f6ba8ae5531ce60c5c29057c2a995ced8a34cc1db7005c478fa174874bbb82981107faab591b8c9581365e7205578c55fc06b5f588c65e2ec700e6473752708853a8c9a1acad3c08bfd67c553b9c603206a1d26276e66c53a166398db6b2e51754e2a67a54902cd5839b97c66d2421df86c42c7181f89d2afae41bc116212a7492688424a2c81b85bf616ed686e8d0183c1082dd61c1144417dd10cc0e29b3168144064d700c2a295c1042ae40848fb07abf2aa7cb2883fb19454a8711c72670d8c0b152dc9cd39a108ad9348089754703a608c0b544350879ddc71c09051f92ba755717403130dc4b95c19d3510363a5dd620cdeb1918af90dd1267aa9696eb0334810b9351df981a0749a7e0c253d399a0115ae515c97b63a1b0ca42794e00ef59912a357565b427dd5aa54b706b0df583e2fb68ceab61395024abba0a8ba4ab6bae958d9c13eed40cd20978eeb5ba041b837595427a644a850340168847acbb69b8d6809b849a7d6a6b67c170dbeaa41be8341c6977dbc025688244396503411148458aa2800c44195211a86763c54e45345ac258541926b4bced6a337df4506113647828b2d4e45723d68985dbc2772a6723a032bb3b84a140a95dbc480f1495118238e74376c3aa78c25e3703ce121e8576c22ea29119b1eb5b946d261cfdc71980af7961961074584a7ed970fef29172cd98a3ea5550f994f5d763b00fd37f9c0abb1459b825c6deac0b35d451a9eac64b03c3c0139806586c8e0f63b8f77aef5b207d2615d5f296894c9a1eb0b68d0571351e18a20084580d98aef13bc4ed039d132cf015bcbf0270d5b971f10f581093656a091af7f3725a2e16c8a74c541345ede689321a436ac488b23895ed3e81fb4f25b83964400ec33c529350ac29f4876128c010ca9c4b6d3e47d7ac798559251bbe4bbc7ea4ece0b76e9f519d819b286f14fcadb1231067bcb113ecbc737020b47587c491fd26541f47ee2b6bfe6908c73ebc3715c58aa93484a5c2692598b4945209d47258441c2cde253434a5a1edc934c9762b2740795857e255921296a8bd4542f82bb6ac7e293f9e4b7890810a2e46511e241162b2af6e38c2a07b15a38a494f8412fc40d60847f957b7839e78936b6c1ae906089a80ef5c58e2659be2643083922b22da53912055f26fa7ccf410abc42cf21448290b168cf7c8ba20b28dca959acc253bfd4b67e60c0c5f82728382c96f78b48b4a4c746c32c019bf8c3202c46a7a2c9c401700eeb1c013bb399d9b62eae9a4e68e4a4bec7b7fb92888ee9bb5f52aca49b2e3f6ac6b72b2cdbf2c755f85fd14903d8712fe0bf82ac0b06aae9bea06278c21e6257bc96af0379bca07c7833 +result: pass +ciphertext: ea2ebb121065a8def00bcbe87f29aa3fbbcba6435b50a8f16958f1bcaf938c7cb7580d196069a8455de58338736ad1d72cb7332f605349a7542982e525c1ad949f2ca7d3c894a8947d122bf8c55667aac75c6d64ffe2953b49a9ca83af87742187865645af50f1aa12042166c5b4a9262ce9691e08f9216d0120aa227b1875e7d27a28084be0aa60f5ee84fecdd7f6f1fb6f45674417cf11c8c90646276f76071d75fd05ba08eb5e83a0c9e6153d97c6456fee5640d55fe47d3f8b3c162962aaee0e15b045e9d3b319c61177a3e316112388af05395649329225b8c7576ad0bdadb78a81f1594ba0c163edb95040c1249a1f43917629bd905bc6a16cc21da6e9e16637392b56d397f4c5ccd814ea599b074925367cdba7f1667ba4c2ac8eec4ec976905ac46a45453830d6ff6fe4d3bd61bbb91fe99e3b5702d9223439f6d91dccdba1ff13b9d31cbc47ee42bfab33e3dc34bae64435ed2fae7ef112f28fa7ff754c82b9082aa944456e23ae2654e0b94186b1bb697d610b87659805b4e5a4e7c043191dfbce990c54caa0a6ab536a21fa7316f22cd8df0fb4532c45930fac927470b4f7d7353e8d000e53687ff1b3649851454194aa3acbbf4e1a1fc549d6a5c60d08a65cef540015643c7d6c1d409a093d7a796f57ca0706ca323bd3e0b26353ab1d7bd8ec8dbad952f3b85388b100367d6989de5396e2ac46d85b402094420a1bc3b0d9b440b49652610be14e36a35cf6502689ee03104af750f7f6f8216a8080298e260cfe7cc76cd84a4b7b46836eb78116ddf30c4227b984db4f482ca7411bb41e5b3ad934d2662bfb767be82b95d31f7ea00ca02d22b22b9c8868b740ec66bb221d4b401ea7cc9112680b166d007c3e279fb135e1b8ad761e2690b72f2a8dfa6aa844864e6330c433c287f246c7269ddaa947212c903d8f08edf7625599486321fc1cb9df6c896e4f61e4373aa58fadb2e095a2c23fbd9eb507d7e8c622833851cefd0ed94a388f2772fe8980d46822ae977b027591c73c113bde9591cccfe77440c476560f59255d7c7e1a566a2a41479b6168220efacd1a866fa3d710eb061412538c8fd95d9d308c4e3fc21312b33a99d7dd270d7d0983b3e60cf72e630118bcd3cff1ac38331857d75736c15537fc8e4cbc01f543e8bebf214b8a45f6b6888d9c551e0bb3dc84d3d4a3ea8eee1a453d8a53f06de71d127ac7a370a57a89ef88f5291fec70308e2c5fba82a2af93dddb05b135d7c37a04e25822682dce56e74ce34bc5b8849d5d40040809798ca4ff3b0fbc999cebe11d3d7479ca18342c82b27ade902e5f6070b122ecc7037fdbee985fea2a04732ba5f85817e19ce8cfe62d86339fde475a56f7e5f5b1f1f1e7c18829bdfc2658be9f603d44e5a4117e2b274b9e3a74dd2fd001deb4f0753a842fe1ff41799dd77b051851e8f4b8bc2fa53dd754c872c4fac00c18768ed6f0cd285ae91516e6288b18fb6e50fa88c7b97c6b898f3a6e4776e1321a9c2a939224a4c903ec117f84518f7bf48990 +shared_secret: b3363e6e6dba3e41ac2c63895c461765bc8a0250880d3dd6e8a4479a7fd3921c + +# Official test vector 75, seed: "8e2995f1b3e43853b18916bb1212aceb05898e2b177a87abeb928ad7184e59695c56b2cccf5db80853c28a525e327d13" +entropy: 1c82471dcdfca3a6942061ab4f3d5bf0d197321437c706d9cccccce449447002 +public_key = 5a0322a62aa889781c4fa3c36f765586b2c2a20cac081cc08d06ce1cea6036463dccc34bc294a51f7b1a5dc0778c143f57b9ad2c8b41a3b3a7e3317fec687f50294158ab07441c119c299d421b3d6cd62019b4cfce69c9dc5509856b7cf087b66391793e7b2a77262db0909861b46b5d4c23fbf134ad43622357a81cb7c9f5ac9cf1c190b9f711164a9cfa4892927364d800ad7fa2888dbbaa21b689d4a20fd0ba43f27386f90026322705b0f1069b32760802581231c44db0a43753779fe88f3a824f2ed858211bc172d49221931c3e86188c287a093b1eff20af18c1004979221c85c2ebd5700473913d465359ac18deb3055075386ac3c330887879d5ca762b6b576b7f2d422f23889d51788cd84b77ae879b1eb7026dbcce20cc94f7857aea148213c1ce857277a7808857f47e45cb9b561b80895142463bcfab6c69a7712acbd64a3b6721aa9671aa934cb0c1bc52b464603779fd6ab10d57cca0a749f3a1889e10386cb7ab0bdb86ccb02ea614a0966a0ef2699da6b7282713874f36468c2014539bc804911053d1025133975e591e357a8d88a1c7138a200543a90f4aa250f44ca61870d206a236d1917b509638fb6442aa7b886a54fc21b7c40a1b7d027a09863ef94280c67a4693d28a0f842ef2268e0a67a11bdb4a18b3c459e11e977a5d143aaa82b80520f72c50d248073746662b78ff685086632e304085e9c7050a754b302338f7a2af0a223e45730de36074e1843876a6b1cab85e0d984ece18a3420aabf4d740f6039dd183c57279469bfb9f26fa4f6ae59db60532372b729cdb8bc8b26b9e511234177af2717538383bf2103726c79d84b4489d493423f7375c273a9558611b60c9fbec197047566ae9411637ca9dcb956962354872803891c728429fcd99c02ad020c11a2f1aac40b6fb13fd6c8508500fbfc34d752080536c150b402155e130c3aa1a4e914ada0740b5178c83a67fea746803a35c36a3cc034052143303bee180d8da097b24c89fdb16583b972a50c89b5ca27dd4aaa1002fe2316940a7ab294b02eca4c69957b3d02b538c239f18a342aee0c15fdca57d28930a62096567801f64c3452697d5f4a66781975b440ab3b27a5da41e889928ff41402b20b93f992db6d4216a4a2b169a6952816d61b93a82c5c0d5923152900be6b9236ab96d076b36d406b06793c7c8c85d69f423774c4a0c143e27673cecaa38c66c1dba02860cd305214a2637a90cc84a7aa6bb919e73c06ddb787b1b9117a2c6fd577a7eb417d5a34922767bade412bef212694373401554211c1213ac7bd1d1cc61f40fdbc65b89ccb3383c30476932d738b181b64e2bbc9508268c7061a4731c659d18749ec3b87c3741d1660d10978cc91ca44df588c8a0a7a68670a003ba23f03ae733067139083ed33c98dac4c06331e90b59514c7005e27f179a0ec8517931b678ec849789c656b30c4a736209e70151cd970ade5557f9e6872248b94c894220c0bd1b6a3a0149c1bbb8ba4c9337aba868b78199929044f44018fc261aca4bcf0f70cc1444411fc8cc3b6b7aa7ea9f8d06a30c7a61d89c19e7c50b84a278a921b74e2936ad07ae2b17344356a8e640a9a1392048cacc817bb0924682a027f2cf6ec9b36aad177faedba70e26db0e2958e3d520d23b10254587 +result: pass +ciphertext: 5be4b5826337373eaaf9e87d53baafddb421fbb420412bdac34c5a4c4a365e7815446854bcff6f7f793578f7a8506b97adf4256649e957c6f3dd74338be6592ceef2aab2500ad35ba05eac5c08b70f196ea618f20b05ea81b9fdb4d76cfaf91d6c243e0d93d315a7c86c420add20f23bdee5bc67421797216a78053bf7a7f5258d6ac69bd06329f473270c480877cdae2784f833356e388cf0a0bde65f97cfae05bea5c149c9fda694c5a9767de87d3c9c4c7a3878fa0c2355a78cb32a44d1b80a83a2fc198f21681ff05556222af755343c735622feb9d4df7a561bef9f4a5d3fd47cb6874ddfece4870da971425aff3d8e9ec8367b97395a8a994f96695e721bdfba993af105d365b42b29ea811da19d4bc3c288e1f768102f9eeaa0a3c7a5b5efc67f3d7c70dff5df5883fa3a85b60881ff7f37bd2b73f2c160e0fda40ca341868f7b630577c4c4486b96004c980be59340ed623b50405c5732d4749b37458d0b230e57072a97ceb2f7d236f7bab0792a3bc151a786f77d8f266dabcf68cac9c89515cf15dd262a0e594246b3568ab250ba1e874f52481ef5d48affc7ac10012267e19f6eb2f57ad7a16da8dd29e26f6ea83f3b2f732e9ba9799672ed967d029f0b66f032c28ad3195f5f071e0a91e21afb721fa32eedc62f80c5dbbadfb37498cd1779e07c0f28774ad21e5e7c91b4b9196449c0773478712e43b6dad9639695d99355116956e180074f41032c332a6445d97ef237d89cb198e0ae225c13521833ab3fcdd59662fecd184c6543a73261332e713061896578524726ef15def3cb125224d831352c73d731c8def727d1db7dc668413d2d99527340f9c3d7065d93cd3f6bdd405c9ce2f7ac58155b4009718199c3fcd1c5bf5d8f7247747b74818b425839e9b7e377769c36e241580a17437557d7818f38797609d5c66fe26eadc06611f3edef762f0c34bc729ccc9cea1e6190c57d51d872fb278a6baffd6c6f8a446b707b707195979fd10f84d3a51f7734f53633c83ef6a210748f382be3edfea8e01f247eb7700644ce9e80399564839b4e8d8ba34ceac158b9664acd9bcab6d81de3638cebe7a6035e0f3165ff882e2dc57b1caa11c9d111fac396b45ccbfffe67c37274d4859177470a3dbac95c69061c963959d58c6c8dd219c360361380d5e8bc8915123e98a24d594e2d8127e918fa0e41086ca306715859a80ee4e547d11361fcc43600d79f312f8b42d38efd3e6b008a8e5bdd381cdbb6ab046ab4c1352c38e16ef981f0b0f3aa1ecaf84e166e68492aff7ee3132d598cce0b118264753b65c39d1cda91d487584da53c9baf49c249debc9de95a390815b226503443ff147b8852dbce76c2289b8818248b15b8c814bbd2b8abc3be7001343f82ca2073f9500ca3f2262d5db43fc97deadbc9aacf0d1cb941773815f83cc24e0f0a17f84d1029027c08ae735807fec4e3735c8d3fd790f45edf2e4a80b984fbcc544c118686c8f0ae66e3fa50cca80cf858744f330f6dc5dffe6d215774ae8103 +shared_secret: 8e648593c8f6f6f7a97ce7a2d151ada30fbbc7f3c4fc517d8cbadd71e6a17476 + +# Official test vector 76, seed: "9218943c51fd2de47e509aac67eff176795102f37d7a2017e3afd768fcda7877af38739b00fcdf227c2fd62eb635942c" +entropy: 46fe60a18124125ab93e0c578f1c02f1bd1301595013001c7f3c2fa56cde294e +public_key = ec8c397304996ce42773532b2798c4bb8a987e57b41b820c6f8b2c64181873bc6515b0c810109890b8abd9bc650f0344e3e7a672e269547aa4bbd0baf9f2b2f3b53b1910b255f7cc6cf0394ceba359685e9f6c77ddfbcf0217611d076ab2140a8dc58199a2a235955b69fc2520b192555c1bed2777ef623760cc71b0208dbf2a5d9841a231a60e2516c5ca3c6156a0c0862b54c311ce2b6b3f442c8082348833b193cb2b22d252a9ac88098c704d83f217ab2a8799f031227b95e1fa5d1a6410e3f025485338fb8338b5c7c4c0f6641b71644f11124b13c2dd21088684035a66a4c4451b5f66c9d5aaa7ace15eaaf03497ea2e1d693b77a4402dd1943e9c68cc642997a44d2f86a339c78912e678d0e314ff162c0e3c9ed8eb726ed910d1b26b99061c01142380e5074b5a46505863f6287dc18422b323c89966340ff7146fec18095147429148c24718301c106dcbb5a1b644e5a26ebb566b504a9b2984100bb6c40b45286d4c2841d774dc8915839c32ddb22adc41c0197431bf8c5f26c2329e6b2a0efb2b0d872c4b8b125d997937236caa455389c60f9e38ba3a662ac7349a5c872d84a353f9710c6c74463f220f37558458d68da5e67f1130cc5dd5ac4608220da2b8c9048bc805bb1f6bcf04379330025ca86b42cc361baab986c32a9e266bb1fa27552192a56b4b111564646b701dc4771b8f61bb5d41278a291920ac1d01649267344732a85109a3cb45b7b8e9abb8cec49ff602c819695f61011c7ac5957fccc50859432f324d6623459d7bcbfa20645b2a54c5a8ba0df27f93ecc2ed00821e98553f680623ebb221953d3d9b8d188044d693abb88bc965984b08d112ea6b4885aca190f9877f1bc123220aad662fb7f5b0afbaaae118c6108c98b31a5b6ff15aad0a87b172bb40998ec232a9d218bca9f03e88633914561c9ff65be6dcad01550903276646208248a56e5c3239f951585ee9326808a4e4f829a15996452a3328253ce2cb3613aa4fb02acf3030b64c6a27afc5863487b9538b53a2e1456168180d257f4403b41f16b415740abb024eb54c23d6a851bf9c54932259d1bb510964445067c68ae362dac6a7c3e29ed3080b0d21a76ec220c7d562340123f7a32c62184d2d707144a1565e432dff443940736cf628caa3607076783b2b29bea7058bd164219518aa77c2b303e07dffcbb00c930ef0f0632c10aafdf32fa7bcadc5719fdb591c7635c3af83198fe306076a9da2455963b91551a1618040b0eac945f788820a1442ccd10fbdbc763cdbbb6e221e8ad076880abd561c5059e23709d40996d41fa6f129c4758b62644c30c1c06d0080091b4d5a8705f4b0694507252ef1a5980a347846160ba3256475741d50a7ae465f1b444a25729ecb66585e51992bc781f28c180593c4e5882c243017440633007db1c637733a01bb8a994347d7602ed0b34261603b84b8c2e14c5c46167af459507152da216f272371a0981fdbe740daa78b9eea655d98cd14ec90cd383863ab5fe8137ebe820df5a007a288586e18a54b43387de9b73f9037f27384be092b09941262706dd6db377f733b31a49d2467605649b9609365232252a62555b1451674b717182870c1088f4b34061f3e8b9034af0cf2c5f7eeb665e064f5f27cd5e4c84531d45d38051ef9 +result: pass +ciphertext: 1c54b44d8a10785f4510f996ffaae6b98533eed8ebd71ea24f7d7669446a5e6db97d90bbd13879fb301ac3042218bc5362ca6c057ca9774bfbeeabda1e2510c44e269049858a0895e6420a46b6183af4b2c0678415698749b20ff5b8ad375270763fda8e841f3babd0082bec29f635826d51d93fed0097edb491e13d264101f6077f35960ff036c9db1822476d980c294eda6ac631f40a8aaf3c288c497d19a340e9d351c4449e017086574100a846ee41f9ba811f6d3b5999ed6cb37f0a64c89c605889a3dbfa095f9e24564b636276dea2e1bbebd3469add8a00b798b531c5d7f734c400806fc2a278388fe7395756c97c3816e4b3b5eb079f376b6f6c46494f93930786d5d2fe597d1a4187235a34c0948494be6532ce29df05790382ed06396b78b51cc95ce617de6ba412ae0374361363dce738a0b3924bc3c0bbc440c660d8c5a012a1a078c26397fb9989e3f25b243a4edcdcd55d4919903a81a0e41b51a59fc676a7672d035dbbeabc379053cff3a63823b359437ed1e148a703e80bd11ca6d483bf29f574f7a3cd4be9c8623472bd3b21455ed44dc092e897bae7b958dd960ce311200a8a9578df00fa0de56ecf00447dff9b18252dd4b2a25ce35de262c28411196c2e49f5a45bd074c0d7c498e42606068b517907938eb7e5b37785a4960981dc9005e5431bb50fe55e446817b2a18064d4029673a6089e06a2ca67693134af6fd75a196c5483127e5349728de459701d0745859e58f6504543755d969c1ecf912dd54e8167910e38ab419a161178db904dbf018ff0df9fb5f0d83315c533f6ded98a06a72cfdd82a19cdfd03109c161020c1e726e43c8354e61906d156fbd7e360d85ea6e896c6731d4acdcc10a8c3ac1c5432f36c9122cd6533f452f2afc46643b36de381d00b8fcb93c32eb7e8cf915f1dcca5cd1f9af29cb4b450408c48df5c2199f8df68ea23e228494bd2ac356e461aec65ffa568fea8c281067f3356223326459d7f746b42060f816256e948960d44703d23eb45d46ab0e924c50978baf55e5ae39bb06ea3a490f9989bcbfe9119ac5f3b83c5f41e079dee501516f4e704a20bd6312103b57f6c0bf56e009eb64132fc2999bbccc8d098027437ffa1cc0cac877547c26680cf0c4f107d8e3551ec06c5aa3791af10baa6b34a10d346da6278cdeacad19cf839b501a3381a7e68d3e01604d66b92079c39bf183bcda51dd0959236f345d0c98763fdedd9a58f5ec9b2978f2319fc61af19ed6ba74db442fde15ec92729aaa8c1fcc5598be852eb8083abf5483a654fac93724ac3c23a1db1c431e56645f505f136252066531c9b6d015b1480555292ba18b3f2e074a4c3b79ba5b831cf049bf37be83ed33026cce09ff36efa757673a928884dca31b8068b0a088f464270d522f9771b7a70cf87ead5956e599789ee9a15870b808b3ae59a6c417a54c4eeed8dd2247682f8c3aac4af021f918dbe3ab8f91b0b43780fafeb58fd043faab7ea49b5a4874c7722926399db78533ef9d41aa8 +shared_secret: bcdd6f0d744d2a35147323a4a0451fbfb7d60d73c161c1f8c6a2b5e9f4239c65 + +# Official test vector 77, seed: "542e20078add5296050af150360f057f6b9ab3ba835589dd56987de805f900b906505b5390a0d86cba28038992dfc59a" +entropy: 52fb7cb6a633fd2e83f2892bd9441b48fe59ecee6d026f5246fa7f2a5e55ee3b +public_key = 18f81e47490cf733359bb77d86b1b949396baa99c9d73485e378b6eda76318b961948497db54149f386e51648187c48a94fb603eb114a9408ba0d27f3c717694f9459ddab7c6d51a58c50a79bc072d7717781a6b12073577d3a89a405829850aff65023a771a5f5456ac5b3970d545043a2254178375268abca9a967f50db28635b1d01e7d1969080438368a4b61f63efd82a811f63909aa48a055cd9345c09191abeaab8237696bdf3512b7e8625212bfe5500bd7002066357954344fe361be074069a520a470eb64bc0289f85c981995141a246ee3c6673d9026b7b490a82819ee1825ad39284fc41a01c936d0280c4c681d62e47de8e339fc0a0f958b279ab95114209231faa8962754b12a22efb67ed1c42e8c144f74476f552a297e7573a81717144648befa3b6c6096f428c10fd925ba86b29c8890f2750d1e7956664a714fcc00c88a3cc259b503d3ca39942986d19ab6d76378858d679cc61ab40edc5a007d33813698a6ae96acbe95474b188bfd3208c885179de868dd027f12256b9fe84ff460b180c7655d514168c89a516ba4ddcc56c1b5325c9312e067949a57178251158eec2fde69bc9d61be726338830a86e8e525ec00152cdc0e86473e2b54ab64790735c3a945cc83b999352ad2587fb67dcf2c9fb3b921deac54dccc8201d36562f64831c8129e67b2ae78bfacba95f29c3d20942781e090ebbab81bc5c071b0bce826173f0cad6c101518b56dd03a8bdc872d338225bb16128ca8c7212867dae513c971b687297e4c098ff7c478f841a29dea278d1bbe55423321372a44937d2aba34b279c99e8847c5d4b51f54143de991aa16aeeab267386c7f286445acb87a98cc93029658bb0981048876f0884b526ba58f201257a2245849a57cb425cd2ca92a3cbcbf963a4f360e8616c082d8be4820323df715bf5344fcf85ba070ac3068ae91989e61600416d7cc28cb6d42a461dec083f6126c749ca457146d114c84fbc576a7dc8f9c2c03cf4a3cd2535a7a396f59d73259654254e5bcf616b4970770bc8a3d030c8c61d93eb08644159414dcc6428be73357531e50ba72b5eb99d9380bc4802339070366a19760c0b15e32a48ae0038453527b10c4ab6b1ae8497f49dc47e25a514258b5c0336a812525c5a86e22d73a9a8c3da5e88a468c3439464fac42491b0bc91cdace7cdb15166a01b62cb22b745c38ca32a9727c8c57537c72563edb4aa2b400b778115b36817f188e659b2bf7c999d108c5b2d252f6a3bb78737edea48c9bb91e917487e4e6156dca609aa97bf47bab00047602f296cf611299510b195ba59ae7bc245b8c9721901995b6df4918842017945c330290c6bb3c46d9104faf014db6728c4268627f8c884bf52e011344cfa795f864a474f9c015ab09c77911a8a52c1aa46aeed6560d4bb1f3b64d65028d373ab3d51a450e600a239767aed9cf25b5c85fc24cc794162ee70e13d88fd3459cb37a92d348a1956bba09e24513d5a5fa79b593a849a1930456f39fade44b583cbd7eb4ce058056df38cd0be15205161f53f2c8681cb9e00525fb59cfd86ba1ae81ccc1636dd69c81ef620651606326a41db9b68827378c2ec238e9179c02965f938a2d0aad893c30d27267e416287d7ddec314a79402a769c3d953f0092ef4f8b595f8 +result: pass +ciphertext: 93bd84aeaf924ef5a6cf9f0299320f9745d4b7a1bbaf8c0f7a721f150d740174f4650f48b2597b513f3ad8ece3b027e23e0bc83d7bdd6dcbcdb89b0c6d40fc2689db5a8f97978d30bc54e7c706597acddc24c23779cb36256e8858e3802bff79165020d65327150ada03eb85ced6577706a26d2e0c3fadb7ab480a10431f12d0946f1a62a70652684b15ccbf082c5bdc500af9eb2d1da194e8de691fefe76b479cc558604534d4250f9b3fadc5b6ee14cd723b3cee817ab6924d33e7cd8808db81aed732d6a388902137e041c078a519c530486c85e2f4b9e89d3e818fbb83f898644269051c3b82a43f6cc34587b4c47917924cc87c5090557254743e6f754c84ab36eb3ada3251195fa8987c2c876af3621d7b78d2fbbc99cf94a4bf804542efa4d16baea4d1dbe6c911177e3004f2d4a8b69ebc50246bc1ed56853870374d2d2ac73f4c14d668289957d89e7a057cf25fb2adda583f9420956fa48a7eb9d76005e20bdea9c5c16c8fb1efc6db068b8879d1ce28ffb3a70ccd1c8578b938732b2015faa17738ffae41a300edfe2c564a85c775fccdd01af5be1c42a81c2e76806b7ccaeeaa6a98fcc1890d9ab22b04d1c0d106db4d2053fb7da715c6c3851b1c6e3b13e9b9c7915fad5a81db1a823f6e9c08bccaec434e2e143b963fb7acbe6fc01b8c0f3be2bad13ea711fe426983566d5e31e782408280dab6b43343046e59f054f45498ec9514f2e5d9432b9b28f8b716cce2a02e64bf7fdfaa30f4e4b9d5a0fab8a5f2c1d4b5c278f83889f676549fcf35bf3836894839f170fca341e7fa9f88e0e3cdbb7a18565c0b5f696731d8ede4bc6636ce988f377536e88fefb71a38e76577eba3e3e9682cf1c796cab2a66da2fbae57df62c53315eef981b97d55bb0898a474b72698ff4d695e56a11b4d59ac3c33bcb1221c498ded30c88211eebd998fe8a96f9f92eb80c5985a5037f1a929f1f5dd446336a438cb3b75c7860749fdead56495af233937a2457a92ebbdf261c302880d44cbda673ba0a67a1456ab86ed38fe7a8e964a62569b1fff21994b193e74dc25d9a78f05d9677ac92a2fe830e1e4947d7def8c911d11bfa536c6265482e8f1fca1ad0f7f36e81a275b83d2b6b89d68b6bfab6436cacba6d12d33e6662c0155baf58f8f4ad3cb57b47ba63e781d94ee461a901a7171aaee49a69b25c6d8a0c49063f7e8448d60bd8de161cd778da0476529d5a0fb2c3dd9b4c90729ef6653d7cf74288cfc75cbc989c76bb7af8579578f5ebdbc833b31927fb6e585a37f13302db297d0b50f7e3e72792e3d3dde42151067679f155794ccf4e604f8bb8d1390e6e98b065f0a01c9f0ed0b35b451f1f8653cd1acdbf97c3518557dcdfcaca9f98c2e85aec32ad3084d79850319d1ea27cfee4b746f573d1450e036cf5001d532470eeeaf2d0895aec768f051e2c29f8300f73f64fa41973bc0d1d38b1c58bbd642807a49e9515cf5ea193e30a4da032659962e2d28d41c2aa6405cdd1627e4ab927303179807db7a75a2 +shared_secret: 072551e254959ce9f2c67657b41122d8a98cde044bb2f60955bdc6e5dbe55277 + +# Official test vector 78, seed: "6a85a61dd08c0733fcbc158abb49fe0b0d96a50dcca140a2e9f5a254f1901985844613b1c656c0cb0112620591b88ad0" +entropy: 0f81a5f97082121244403da3feeb734f6084b314b8d94beb11627aa6ad1914e9 +public_key = 776b6f121675622857b8b376d708b2a861306fe931126822e2e8672fa0b577e8ca3f16495af10aae456a734368677a87fd3c2199060dc1993690c1ae2b76959664a1df6cb2b3738b294124918596b0d69394eb1efba83895d0a7f3081ef81769437cb63b726d4236a65c87c3929b79fe34438a8931cf2b889cf100747cb58d373491e7cb62db266bfb3b7e745500fa418eac8cabd966dc388d0f1b3fba850bfec8c03a29182deaa5ec4256fb3b436f429cac87399c61bc98497a3aca07cec06a128231f945a4a335ab6d1a54a9a59db106c0fd61360ce8870d1cae99201506c9c96d4969f4b487e4d87ba1d45accb5a754585f29db0991376150c65927b20c9eb421366cc840d528734c8b4f1421fe30c99f4c55f1e25d18a1b012424cc9f6250064a61c1b42ac243b6c701e293055a9ea7c44855e575cb6217c381de770cf461040c20b2cea6c2a921c9be483ecc2718dac01c4a5a15b60bfd5222fc988c60b23504919137b1226d7b72fe4105154711d25790a9f64c95356a787058018cba996410aa4f29a62b6cf77439b5784b67390b96db77c1583bab490719d804e79b8954b948388514a7fb78ebbe7959599ca374a66558a8fbe7aac91e8a62ac623690a952e94bb91e64fe57ab4db066867ecc9ee027163a8010bf901489c10ebb736ae619dd0177fcd060c4657488bc50044e4c895191351ca72aff9698577bda5536c3fa75f0d9b586822211cd88d686ca8921ca65bf8081f8604277839cc9757653a46511876f7b98983fc052bc088bc85a686ab6bfd5c2b91da8ae210313949191d13279be375d3d3197fb01808a76caa8a843e178d0dfc116c041030f2047f4b35c0900498fab680d45fd0710d75226eddec6388d56d1c2263768603ac0ba9b68a21173704bd25b6b5181405029cc4b18c6446b5afe5431f0a26bf50b2f33b0aa4032e9f28ac9fb58acd85a670f393351b33df4079a5533c44a94e968b677a68931491310cd48ea1213dd416ab650b3294f06f91aa5004f622ba173795136eedf91598153b8d2935acf33709a8b33e4b32384bab51fa69ed123a4eaac726dc7041b486e8aa3641fb8d48f908c27866753b821aaabb9894b504f845fbea8766e82671506ff5b5012765a6a7b08f9fd3c10357523fb423e02024577235fe4694349c1188b1aeff482ba7a15aa188a8bbe7108ccb7ad6a469054a45c01aac131c6a7c4acd5c050184ca77b8466b6d1992de80242454169a33382972760de2b69c3c000b900d25f2cf4731224dd9a2b84562c15c04d3d1a9ad447ee9404888141a7da3a522f90b9071ad7af54552d0060af1a66a31b9457024a46b3fc1038a7c54b76053909ab07eb36c1dfdf897276b465155aed0e70f9a4b9398e54d267377fc298b9bbc053b281486f8436017c6d98b3249c167b17358c134299ae17426bc9f067849d7c55541a205c1359a41d7a5fea37e758a0893c18226a44bdbd27e0266096dc20da357c5d1a23956b796b305c29e87718f65b8331888cbd53fc2fc011f92c6f49c7f9901a5b17059b81cb2eaca2d348a22a91105f69140d122bf59d74c16a840e4b646f5e1cbd921a24a60a0ed6cad243303a1448b6750b4e451c5e0e41b3a12a73c36272ed86537f1d2f51a0e2b5b5847b0a2d9bbff0a051bd5227600ad +result: pass +ciphertext: 2513e09060af8f52ebb2c83689895b5bf166ca6e9ce9db739a4533c90c5e9f40867926244cbc396051bd543194a0635e1753f2e1366a5844142528ce5398412429ff880f27434e22c14a64a45febf5228175f5f3eaa6c7d15a4676787ab733a34ec64d3e6d35fb28128a0e5ed59b11145a6402a92bda380a38fc3710104834b131ee928f2ac8143083bec3de7dee3ccc07f348a384f8f709829a05fe94e5bc144999ae09e2ce39a88548224c37bbf716b44851f453f6bd0f1052ee8566d444ff9f146785e3a09ce54d03c3d34398730474f314e62d5600a80b2de9fd468e4b8013a278b5c7abd613685bdeb26b3927d11053e55e5aef09028b36ea99df1471dee73dfe63e9f61c1eb16b32deee237a79be98ee3468de973f5a1f3cb411daec79b25a8ae3208503ced8b0604e939e6cf0e61d55a6d0884b38b08493f8544a221a250cd9f4d9328c2eb615dbbfe71fd27e2eb4219bc8de76472dd35809813b111366b6c4ad84b3024d0b084c9c6096ce3c7b50b6108aeb0714f70ce4fde2bd2d693abfd156e090455e9ff36ae938b99d68400587d8ae263058dc64a5386cfaffa9415c54c7db1d5e6a1341db0c724a3cbacad4b286a4f59a5db6435fe0ad19edbda0e608cfdf88cc3e00bcc864e2a700476114a5b7a3b492ce1f66b10ce5e3a46a93e39bd0101d35dd371bdb491c6d4b7f015b52cae6d85f0d71a2967e04fa58fb46b308315b44cc993cd49e5499c065a811a8df99ed94f98fd2f0841a3a3a6d3d89bf869528640aa7721e59f003179442e6cf20881e353435b994fba25acf21954ddb463340979d7d74f70cea856c0b4b2c9116f596ee60443fb3491f57b745258c462c3182da098e84868c6ebee511d2857d341c68a01cec442b87cf755d86373deef1934435eec9a3805d5f2074a9e4711fe350b14b79b42af8c5b884ce4a2097239f0c63bb3b96ca91b3823c11d9b79e508c30c19e1f63b3957332ef80318448e47fd122236b2666d6c66f532ba88394c61d21d784ce765c1307cfd5335c0bf04dddd81de4144dc445ce5c8094fdeadd4f488a7d463c14994c891a1bc9e04649b87fba42556f54a3dbbaa96b08f8e93f8f68a2c4c90d75f0df55515515f438ffcc084cfc69a219d2a2ecf808495b1568ac37cb6d1642bbeaafb9df7f4aa3a22739bc7c9219938f019f12438a74631762c7f8878ca24f74e7ec762df3a3f7e9f104e01db85c1e93130cfff87083671ed10aac6b5508ba479952ef0d5bc8327712c555fa47d15d32c5e252a5dd0ca6676227ca7c5a3bf3c102ca6e0d0d5e846cb52f1d85c2bd1c3c4fd3832eda5bbb7ac1e09feb84eb1cd22ae62e9dba64b10217272af5e5f00ca3e8a03303ab13e8ab4a16e9214d44fb37b11fad964f1de2e45ecb499444f81c563a2b3c599a5e334aae0a912e577a6a8badda3dd04aa33e59ce1797f91ca0662cf36275c5f8be504ee7f4051ad2b346f67c66c17845d0e0c4ae5b049bdf6c7a82ae84fde16223d7aad9a4e54e46a1f44260ca0e2e8bca3892 +shared_secret: 88c0c1e22b68cd65e1eedd6d6208c36492fb674e26ba4e0d4e55f831a1affc96 + +# Official test vector 79, seed: "7f4a56eda151e7b097cfb8ef980440fff707affba91867c89522ced6c5ff3bd7f5f00bb49ddd615d9361a7e4efa42851" +entropy: 31af9345365549ea0360169ed57daf98cc5444799d4c75d9f1f5d615e9df8a91 +public_key = a6f3b26ca06ad98a9a6ff2122b8889bb513558fc1a8701376ceca1f7d87a53f78f953aaf9f977c2ffb4d04f88e33e0ba7d83bc6fd27914a769ae382ba5f211b2f59f0001ca30b0a0ef138adaa485953cb8b6f6ccb56a7c92598c0c83ae97684c26d70d69210c8dd16ae08c4b3c1c30110a581669245529be92d38d9cecb10f22c83d01b3b3660fab4662fc559f48041167fb3e7960328c612a7e99a0c546b63b1b04f22b78b85074e6d32f6e04b096eb89da611f30267bd8760e05c238ea2a587691181112a39c88c528977f0399cddb7a7c8bba3ba71507b3db7131302407052cc4e8125e2bc035172a967a21a0582a05f8aae28228ddca417545144882ca3d644f6167ba30e91368879efac5971c8b1a7a9674e804c08e506ade53bcd778c1af4637584b9752aa1f16a4319d296b93e5368c10863a85cbb55c11c56338285b21cd740695757adeb2ce48b7c658a36b26b670e59947a0d94d022284bf0995d56666bd7968bed8858895c779a3318275afe42488953791e97cbd6256c29a6c6e4339a15d7a7c3da95edd2a562dcc2f6fe077cbd2317a914b975692ad1c3c3d956b26634fe1d2235d66226ba766a447bc87e8674800cd898b4b02c491658b97e25a4f836ab98a99c669b60aa4c30518a6644fb048a4e34822782644038ab04a3815c61da99816eaf388e495cde4a65c12f1bb5f02a1a1b1cede817952625fd2502f2a4b8bbbd4123e71462ee433ac923583c830cc54129bac51f96846d8fcacece9b19f6063734158008342c6f48234d24571e5777074170ae24b20d125f1ba311f4b33cdf91e3a2305fbe12e44ab54cc8c4eaf8553f697c00e8040e858569120bcd0166bcfe1a66e2500c3ab8acf3b58f1309c68772154602ba6c0968553ca553252d27a0b05733d81486d86c590291a643edcca9f8470d573880d5856a6b2cbcff2803713790d17297ef11549d5412713a3e4206b1b7c85483192164209f5b32f709aacfc4bae51f180edeb7e999ace2bf98d958514951362b08a6b529a2a7669c5492c0a61645542bc1dea0b707282a0797291b8c7a510884f12e92f3200ac5ee91686e109ecf245b2672f94c0a4525b7f43fba328099bfe4330888b186d026231d2b2eab7b971ba7680f0cb4653652f8aa8b4e01bb77461d792cd5e941a31dc02d52622b37c498e4169bc0418e23c5d32999726462d3a0a6449918b18db487f422849b67cf047bfcb0c6945bb87cd779dea915b64aa0975d313f8a740de77b0d40612459c2eb73a3fc876ac39c821a52761e13115d87bcd17052fea2b98d9d83ece9b1de7124c9738c0df539045279eeb21042a13791feba9d0e23445293eb3c2c194b76c5febb5582220ca350eca9b90435372f3c5baa0549ff847aedb815c244b27dc5866b151041e884befbc7bccca2fa098b592c5aef7f53e0d712bd2119214c15f8ab848a1864705d0511c50a9942535cf06952b0357445a9854240c026733ac8a39eb3c8bca2939d195763a572353da2956799448570a21d58623635f7a7461a913c24ad04d1495c1ee42c88b82942012b2d4b410fd1907799623f1b373b9c438d2b4c3fc48c054bc5206273f7a9a3dccc0ad8d40070ef20fe4cc99c8394adf63126006ee8cbb821b12a2a0a3018c4f8e52a50183fff79e84c69427 +result: pass +ciphertext: a93e454715b85fec95f1c8ebab9126e7b088bffa6eb8d220089c651cee97b49dde58f10f2709d6ca10a0edaf0d631e43e1e57eacba91770283b2b2386af871594867ad80b88a03d5554d151f7957391a8a675688485b2e7bf619fcecdd8be017498f2f1377d03f59482151e03f1f90bf7cc49a2192fea0509d50678f514835271e114ef1b96e453bd2a5342eee9632c0b2a54daa8a18777deb4e785d0b1b6dbf8d3fd5011c1dfdcf8dc6577bf5f0b35720412df16bca86f3d65ef0b1b01a2bbf50a036268d8cc23a9db6d0c53ed8885495059f8f0101806769836fabe5e72d8731b50c745b24944f00de44262b3f76bfd0e3658c9b05d93b98b6ce25fae3a326e59ee148d699687cba27efa3e49d719832c82faf13160b8313a5d9e8fc1c5c0f7589fd7d143b241216bd49cfb81eedbb5f732c3dfd9598198055e5946208939f9477e90febda986efba3e9e5ba2dde57e9dc864452d096642484e70a19623b6af6851641e6f41fdaca57b6bafef0b1584fb4db1864b852479c632db21089157e4442a4d7dc6eb5343d8b300c15dfedb908bee62ab57d8fd1be322412edc9f681980cfe056bae32a30d714b9e6397b1da7874c5f3a6d296a435377d0cc339485237adbc72705e054278819931f6a84a3335b9863af0aa6a3e0bde969289c1d3956da62f822dd6261661241e88042d672ac48ca1448a42f978ff134f45359e7eb734b0cb44a99fd542f961f58e0fb7a3116bc3be3394b9cf8478f01a35342e9a22bc9afca1f4eee22406cbd5ea5bd582d5b88e5bf0f11a46554323310cbba6cafdd0b3879ff49ef875bc6846133b8bc3243cb934bcd8dc8493ca3fcbd1d4ab06bf2e6b932eee6fee99b1c260c2199e801d68a00bbacda4d2f2facc57fc715ecc7f116b5fa02e131710377da8c414b9c41c3b2d0fe43b0829103407c229451990fcf1de8a5a84ba97798f2e0cfd9e2375f37d306179ad8004bf49871ad06881c2c1eb3524bbd2d547916dffb73af4a97c2cc4eb3e13fe7eac98a93cb0689ab9e1398f8df184883e20671bb4781c4eb0b78298f764a03624b2e2991c633c04edc8c23740153c23864154a0e49795c45abfcd89a619c0d5d45e54aec741fc5afef622f23c1406a0524de27872a72b43f771c618d81223ec284196849093bfcf5fa5903a1bfb843f7072b3bbb12cb1bc2ea13839bd6dca2b4c1d7f1c726c6359339d649f416e6a6132ae9008e787706d1b4dfb8f724cfc439e9ecf2c88114b2f23beb7b493a1f9980612d535fccd24626a0befb6a86c9561b96461d86db5c278c12e002e6992746fd282a6cc8e7b0be91db05f6bb256075f50e0f1676fc8b4844f931151017ee9a4423720203c4ba933be28f29f73e96e8c7b232bbb375b16c82dc53c697d2bfda5afa3d8c297ad7f3ccec05c5180e6637e060a6599269a88d09fac0c2a724e61d99965813a8c11746105b7ddc09ef377dc93f92baf2b524ed9c277a7b679334ebddcae51318ac4be3688b655635043b07d4bf5b79ed743af00ffab8c +shared_secret: 56f717e4baddc2250873d667f73a442b05ca2f8714d4dc4d295f899217c92c9e + +# Official test vector 80, seed: "09fc004519bcf85b20d25d314a0dfc79e00cb6262a7dddf9c52473641afb8cfa0f5dd5f53558184caae9ec34b459e98e" +entropy: 774ae54093d694ef40b63b62c73e6c98295f606feb8699807eda1d030ffb996d +public_key = 190b29f6e7cc26755aabd20d4be75f2fa4c18303319edb00809152b33726b1e54c0f328c73c6805354925b43a6dbe0cadf00c9ce3b1d7fd9b47322c8b91844833250e0e99369e90c279ab48712b4e1c10c0456c754251cdae4cb4599843510be3a13277d775a3242a6232b1ca2979e6f260b3c4c86fc24bfd95255c765cdf6187854f0c9beb8cee6a8391f98475d6aa080a7a2c6147f70c2a9450901f705ab0ec23fc957619d611acc2319c6042e137496f51436a788334aa5a6d561a3e3a0937a37be9f7711c5fc6faa1024c434cc3e41a3865bc0beaa732c1789e7972f999007d4f7afdf953163197590e757a297919766428fd18ce1d531466a55109287c335bc26f946e06a4d51aa27b220001a46c2f4e339dd83511d135a9621c1ddf1083bcc9b24b994b4a3394df8ccfbcc743304383c300a9761859074a3d0e91cdd96a34513735a424238e71f42c328eedb1cdfb3ad704a1667c15045c534c448b429c474c494c7b37114911771d62c39d3f4763d881c0a21c074201301ea0eff13bb5df861ecd882a0350031b2af63572845950535e85fb323beebd613ba600702192d7cc1218309885ab9345ef32dfb757528229d73d57cc2328a5a86acc3180e392144c04cc45ca57573395ef38a95674b28ea7bc8684c8e6a81865a93256517be79fc456472976fea2538bb8b52a188cb43881c19ab47069b36968da1cacceab9bfc5c7985614a3fff7300e621e4865c5f8d30792099d3f793e58b591cdd87cfa36430aea876f30cca5d824fa29ab2b56ad3aca5d483c3c7ee90b4e028b7794592e1acae0fc721d355891c257cf821928104e1c994b8bc33eddf70c3cbcb5e272b43b5777b3921892ab198b4132ea4b200618b1e4559064d491487b1f0135c9da67a39950a5f13a1e6eb409c30957b04c645b052decc23a391a7692390de9085147c96c67f04ea8212c9d80cd00dc07b7d22826e01facca51dab91413e8cbaa24a66a00b4d2076d58c398ecf03ee56c40a1ac03cb02658e6240c41c6f06c174f3414e258a11478c7a76e05c156c1b164903b22991391955c3e75bcf0cc70d4cb79ea27638c54dcdcb1ef35b8f3caa26b0418f340597bed55d586981c77cc6093a889854a85132997bf706177099ee8b5ae44cc1f1f3c413fab7a51254490a6ac4175a99da866e5464283a74c5c300436ac1c7829c953128e5d17cb056af07b08d7f114e0be00f93854e09eb5e0be82a5a4c526030468f95bd82e08c2147736598a656476e5cb855e0c486d1fa0c661202a79b37357995ed445973959cf04116ed0c687227768a41a1b4f79b8080a740f012dd547403a30a36e62c9f5a1659abae73a165202122a330c61f492822ea25dcc22cb97c00a38bb7a4a493ae677cec267379c3a1b80ac2f4612221976ff4c7afc685283af88ef813a9beb73ef380be8a31c87135c6573c0d1d5807e63ca6f1418b947c1615233b911736b0870b766c9465cbb8b29573addb33f21a07cd890f1325c200545d5a21c5da1a0082b9c198158aa2b82cd5d94bf5718d39bac4d9096093c78a069b9210d305e9199d45ac09abe6a8033c971b2903874ac6408b3510d318ff4b464ef16ad3e56bd664cadab4cbc2eb1f13656c6547db33b5f529d253c85a728313bd36b9f09f6455b7594a10c1 +result: pass +ciphertext: 4173f72cfd989bd103ff41f258cdcd0bcf3a68eb82c10fbb2639b06605ad14a7b2bbe670a38b3c953df61e7a3962ccd6d554fc12e8010bebf1a2471778c69b130f6fd4a205bce7157cf527cc7480e4dec2654ee466cddd7cc3b48d4799775979070722ad3a0873a38bb9d50bed48650e5c0e659c002e1a80e2c81ab18c5862dc734c15b146880018611651a4b9a498818fd650d8f160e7b93f8f669df8b1568e7248fca844e24113899e45a4e2f9d4af45965d2e20b98fcea2e74c21c2c6c8697533b545e9d0168a74920df3813e0e9631970427d59b16b52c4c221074cd6ed9f5cb07eec18de8b7effa7dac2be3ac2e75c2f394084e64a8bef17efba88cacec6b154f66a737d540503f015971d15fe8bf1b6071061c7d1a0713118f365aa0dfef865e8aa70403d9163981dacb6e9af1697745ef842e60616d9915b5d6e5279a3713b0472dbf0e02c9d3521d48ce21b47b531f942642c961a94170479c62dddb6f81dcd5448308df2defa52d2c90af853a55136c8b6b7263078054e24d42d90e24d78d79b76fc479891305046f6a51100bd553a9b37c90b31fb1dd905c420fabc6c3a96583010e5c3c95d8fe722a185fdcfa1014e454eca7eb1ab85448efa60c988ef0bbe8254e749bb0017e1def4527b27d288a896fd2a5372d20200d0a3e6b88428f9766d1a636449b0aa3d88e108638ad159810cc75a20611adac7c2f6402b50af48a13d2c2b80e4535c37e4c1400e3f39d896a578a035e922cd3a214a6d077cad36ba84186701c0b1c6d09051d808137f523190f538b76618750994ad5dda423754e63012bd1d0ce1476753eb16ca8d3af4c7fa329cf5de9666700f8a5a510677ffa2cdd590be997cbbeddd0a9e31df4a8d05b49f52d89b53055abed0f44a35a81f82e82963ef3a74fb1845e40aefcae153ec22d670e00b5c3c21d04d6738e9b3c36db72beb653231f8df2ded30772576011049d06e56f5cee436f02a8cab545cc55126fdc9a0e247263976b6d83de2f2a5174007f7f6a437fb02eebe5e2a616509d9792b16cfad57bb1af018a87f397c71c221761a3633c5d5f8ad69283911e017691fc76096656342ec0d9aa065069b0307194bf5d8471589af26f5f95895c8d5181f9ac05524d4425750448329b53b24fe6fdf3738066a4446522aef01d9ae6d800af8486e5287185f21f5811096996c00892695d0f08d4e7da2a4c019d5153539fce47f7d8d3618e7b5ebd3cb428a8c6503896a7ab1b536da764cac22f3571be53846a117a06e1d84d7b676c6bc7d0f51e9d356c05b29652248ffaf0b2d07511df249717ab8f766657ebfbfc57ffb521a9162d786ff4364bcb2ce620e4f50040dc829af95a2af4f9771d3ad297eaedcf41d54340bb17219996fb726aa9263ecebb5552ef87651d4b46c18610e4bebf46c3f6c490c7e9ef5352f5187017546ff2022c54a3fa127cadf3542c324880d653dfad52ebf0a630d9c992c7284b9bdde76b198d27ea99fc96c2031082d417b14834ea12faa69e310a30995242 +shared_secret: 35f5517999e15ed842904d53d5b4747639d1165014ab77474c0dbc310e586186 + +# Official test vector 81, seed: "e3c41cca6f04cfe7732fd54de30cc5caac93e2f80e76aed7d24a962a3969c1b6a311459a3ec3e510e3e9b1e4291d4d7d" +entropy: 9f27a47604ab5146caaf0aafe6d149424f8d66e39ba3baf5e6c73b19221b7e21 +public_key = 8dec41fe4093b014449985121e134c925b37b11612a9c61e97d5863f81a83f903383a517d1ab1769921563b86069c9c20841481be7a75311cb1b2c74f4cc96d2aa916509cc24d33ca7906aad07938e701177b42158c19ff3040389894f5d4c9cbd608c8234cefac9bf75fa177d5669f45a195f420b189bb340ebbba649996863618366766b7c990c6001a397b00b71272cb1734adb60a5b1523fb46be42752eba4bad8d6b008883e2697747ada77635174d5f7abc89157acc61202100cf719c9b8c5bfd7409fa95641202384629b925c240be94889bdf96bdc176e4dd3ad75f7b2e4c2abc9ea8280f07df64a162d016db3a634071944f6468e00aba03255430375660bd2c413a0b3cc530de305948d783afd0a41b4a202fcbbb620d9bd47b1181859b66f922d0b5c464f71ac5682829c8c6f4875bce8c37c5212113cf77a8cf480660b0ad108a0b67c063ed52bba442567ab31b30858cb33584d5422ed7427bf085d163005bf182c90c96cbc89ca70591dd0606f95dc6acfeb3315274f7c4937ae511963e90e6d03646292743a4178a6f344c244194f989e1c34be06a09bd5086c73992da8528caaba4fbef1502c1abb01b145a7a825a971a001055e2b1841725cb06eb23625bc0d99f89c1998023d760db1960a751988529628b6aa54308a3c895688047a003c089ef4a3232fda6aea0194154339b75a0a25402212211f3eeaba98cb656925c34f46037a436f89e01bfe408c138601e3a490675abf367194b377158f131b12740636b92bb5d184c05a23cea0c66519b2e8b094610655699976538471d77bbb3a8613a3ea1ee7b22642d63611b498e302540ca71e9b5c1aad6bbf309a13f9ab5eb57a5670fa9244280867ccc48130c74c50219da3168a26a52001713ee7b81157a6392199fdb4a56631b2d17890e6b0bb82051b9a1c85ce8aa92a2557ffa499c8910f7e98c3b4681ebe6323f4794e3e7324330a710b6a87186c36ff04602fccb97a7842104547264437921b413d52229a1555226a3bb3f090bd8cb09df92f4b4093319c434c04a773acc094bb205062903adc121ff6c178aa5d02f4b401e2b43bd79966d83a014bc8a8fa8347e1a9e8c6947134b837f019b05124279b26f20414fe326f3464929105974a853961a6b55ee90ba8d730be6a51fde90b4c23753bd9728077b90bf1c656c0738946bbbc5a2d72f95d876437c659b1bc663f6ab2b9026ba0401ac168c05933dc0509f7390ce8a024a3a1267217bae20c0d26c9d824182bf67ac60c0b121184a42c89da7a1f2de023ee6c291dea37da360b6f912eb95727e0c83efe0796d603b1c4702b2532af8d34053e1c70f8b73d5874578b3a2a8108b12e603d8cc1637d54bccba48f73d08f63c12fb8bb2e40938456c46209b262d8f08fc9b576d463329057a7fcc86652008832712e15e31eba79cb33a58262f822b9b8abbe8c4a025729dbac6f4df64f14c9959993004e0a4398b7c1e049120d404fc2683d65e85cd279b8d9e9595e995631f3469ca25412a54535c569d80c2a09117733f529bfe9a9dc766c8da35bdf0b64d1c27d0fe31ad736c06a92186034468539a3adbbcf0e67af4e797b63a0494cd91d2b9b89f8d486236b9b24772383d81aaed73286e5dc6e35a1dd0121b0a362d8c94022a515340f +result: pass +ciphertext: 6c6860f7577d496c61de133295defcda33462d99ab13f9265a9daf5a21ac8db6e6403d0fac8dc4a8ad196a93f7afc736d23f2de65a506c97b27a3aea84fad37e113607e5883be0500719746c9aa8a0992e4109d0009f350e44990117f9b80083ba57bef99d7229f4bc425026b522eae09bb2c45dc2c14bff8c65a51b624874feeab6979193f085b7b6900aeacb63a2bf5fb2f81d0b48f07d392d83eeeab6540c9b1d4ff4b3068cb471bbda0d9d336ceaf458c6f6acc5c5bdace99ca483a310b6839899f421b15ada7520e35919b475128aaae3b7b027b872c5e91bab596edd00fe954d06e3e8fb8cea0ce36f98482d55688fea29c4717a07d01fb4c5f163cd85908c548b91c83bdedc4c695e0929b630aaedc2146a099d576821cd880fcb1a1a65a58c14e278d094fed63c67b7c6994cd9158aa9e15990e68945a679534035d06e1b58012fefd73461c0f41e0c0630f7f89fc8e7ac1e8e497a2dd15e3d82eca2b5eca09ab928acebb08854959ae39a37190b4e4c6fcf1d7cd03772f10b49e5662b1237a58b2b11f597c51f23c1d105896952c4b6ab6cb645758de8ed34458ee91a8a1682a8f8fea432ad3690f0ba73f980e4ac88833b5b0a85bcba239ee176f00b78915ef7467dfbd42fe23e06deccb70c3247382ebc16b85458d284255fe85bf0544977697019dd417d7577542541fbc4633cd3ccc979aeabab5f9394fc7c7ed15641927f2d7ed87f60e7306dae6ee40667ce715329a217da1334acff5425bf643c1174e9927ccfbbeda133fa2e2a1c9c7fe912f981a4452a3e34caeb6a9e898368bdb40b4dc40915d093e1417c330e024f8a9a235d21a5184a5eb890880eac4051630bad9664ae4927e2e2d34a408de897a2839bb3e43e88e4f078be3c699c7527b8279579807c9a06ea58f32bdd5a2bad5193bfeec0cfa62ca7afd99d9261342e4179449a138066bd563399c0b35538ad109c28afc5e16b2abdd46a930246b215d57bd605bffd1cc042ef447c448fc4843b13d4608876c85d473fc5a663b2112692401c7f833680766839350c127d78ac462c6fe132fd9b1672f94e9f08a18b13ab344b87dd947a8cd9dd43f805e0d8d56c1d11c17edf45c60c1f26c364df7830411b3c96d55a1586ca15220e68069041216a2eb7217113192b518cdb235272516e766cb7b9d7a2ec1a9c32a3d2c885887cbfbd4e893a11d68546419f1c0e0b8ec69a7c574c73bed6165e32c14363dec9bf27fa2510dcdf6cd0d8ea0a7c05f97493777f9ffd69287e0861a36df8e6b8c1b28513c2e1c47c8aed6797b5e6b345df7d402b64e280e951192eb18f1ccf76c49a18a7c06250e72ae7b5f6ce6bbf86d759eb9f3a23ab6b384dd584aa26688c838ac7da9ef292b927bb7df9b4db4785e345174b46231868f70827615de884e8e2e649eb5b9c204ae097feb997b05d9837300b94e95f4356414e0253520d2b49ea98d97ef119f5423a3de5224e33d853e67eb0eeea5a101aa5c5145eaeed835a6c13d80c25b0e551ed2f357a9ae8b1 +shared_secret: a7159981a68244549b96b27991e1323013c353bdd9c8d6f583897c35923e87a8 + +# Official test vector 82, seed: "373fdde922cfc416ed96b444e445bdd0962e8989f6c50adf9912a89937c57217d3600b06c95440448e3f601ae69ca5be" +entropy: 90044031b7597b5e60a4f946b713e8996d0426d2cb013243d9b7d8f8ef159a0f +public_key = 86335a761609caf862810ba70e00c83da3cc1c208cd893233c8ac3247b013417cecd467e9cb87280aa13b061bd0a661034ebabe9ab6e7a447c2826af3cba6798270a36f7431ae9119de2245704110d159aa438a6f1546a39286a7a179c5f286073d5b944ea2000ab61fcb9373a4a94dba5c9baa94056f35ca1810106f2ce65b579c4744f94955db4730265053b812634eb5156ea819069f6371040408a2036019967f4163c1ea611c02ba295a51581644dab07872d1a5b21a32d0ffa349e3739d961a9e9bc07b6d8cba3b945be491958813600e781ecf54912d70e37832e05784c5e12271a5aa5d628233062305a28493bc2b180d802423aa4f75cb6610c16e8798cec72253798b189eb217238b5d063224f78114715818ac4ab40d34042860bee445fa9b1b02dd5a7c7b6bd8b03768e7c38282806e5fc7a93a9094246a403111a39bbb89ca4ca33f9b381fc8d6447450d3b4f6c794b565b2735f8014fe35e78a94780bc1557bb380db47d25791b1283094ce08ae4ea9961882d134bc5579aa9fb44127e2670b85001d58a162e38680d3c8fd2d3517cd4b36aba9bf1930f3d4c067f2a5b4dd702cb9b9e138bbfa91c0f49a86ba283091350a2ab3c1f3c75ca20a4a160318cf88849ef2102e47211df95a2fa325573f60ee7ec5e70d3b88d291cf9110b9906401968462d2ace979a825b088f7c2b330fbb5f15b1b9f24b84a646cc6a9b27b03767978268cba750b5429823e7ad3a00a4e813052011bb0f47cbac838a489c568391c7d05457f4033814bb9d52a011ce787f0df2ab1bc885e293bf23900f3fa019238b7447561eb85b296930232b175379f289982312790bb65743cfe65017be280063c19b033c19eb988d5a827b64777eb8b13244a9b6763c63523a6af78672b652ac38f33f2a870c494b1dd34a9af239556ed9412a48a7b3501daaaaa976daa971c1565f37be80c33fd3126c7bb3aa09f47f4c9c503e2677325418ecd2058fc7518fc247b36c0c8f59427bd2311ca493510794cdb734cdf69c6b1a9d5c990424d819f35ccc8750b4750c43394605bb60b7c4dc39d8f71dfdf1c6da319f6d671aa170065102086665707b95ca4d241c26cb4acbe928d23318d372aead3a99bbd075b5186abe6590cf5278bf289050c13789f82476620472baaf258c78eeb7755f6c6b1a113d91da945a837f0c84b353f9aa1c223404a3c071a27c84a6ae90d31a0d254234a18656095bf989456cd9aec6a837df6880c9ba79476431929c9b22d9bac09acdd8d94b7a884e261037f1bb5335f98c4c491fece5ae0a485611a50224809d48aac84c16957221924d3c2d6500107e71bab5580339b0832e0292b89a3f25bb40fa0445f2b3122f97856f739aabd568d1b0851b47ac947b25d2da6910d05b44e26088901d487cbdf2f782c2e35193021501b2cd264a6526b4aa6dd439502601fd7b203b088361e6218c1b72854648f4023199e5aaecd51a33990b74e4366c07818efcad158a56ed623f63c20e5ea3c519350cfe16b0dfd3af10a45755641a388590eb95b6e5158ac5bc4aabe686140b981cc5c2ac896945a4be089201b56744c439630b56a15b4a3591acc88f3c4680311c24d80b5725bba86cdd22a3732c6a1bf7cb10f14d57ee8e5901e46b97e63848efdc76368b797d +result: pass +ciphertext: 5c2e0a97eaaca1d05377bee9a9f4cf0238030f6540802e2fae3dcc7911077887a4fdfd6c55272b80659dd86dc65f1f276ce11b1bb9e7967afdb9953976cd604e988aa1407896b2319618e7552894eac35c553ddf20e591510859354090d68b2665bb15cb352d4afba522f3eb03fd09e30a27c946f738e38eda2b6e8499413644efeca48031edc811f162c4a419eccad5206dfa59e00679a4ca5d2c056167ec2405c5241ace69dbf87b4444b213583e7996a4d349e32fbeaf611a22ab7631f2e908e0e02935899f248f9c2a0460ca4aa21e7dd79b5fd84681d1ecf7a951ee903ec1c4c92a1e928a09755e43fabe1236d383a6dfee5e75456ea6ffe1f9dbbe61df6140a432b59d6bb4a98626a62b581519a8ff93e360753f08bcaa4d61dd89f0fee8b201e9046a2afb4168215d65f097df589b12b8bdc469dad42ffa176efac5b903abc65df115d550f30fab8ed459660e34b49e0725b0b4ab2f797ae4cf6e7ae0049c539953163b040999eac7dc13ff238565626b8efaaa2ef0874dd044afe71c4c7871610ad497b82e086ba9ab31af88187393e4751fd85f5bdaa13841df1658e11827d44080094c95f3ae409bae7e1d9bf337338eb4ccc86f832817a12aeab3dda8a83433bcfbb15e989916c8dac1e758368f60d515f475d6eee6545ce33be1700e826500e302acf28e7eb8f6ed90154cf0eb1be1159013fe663ec45140e73f079af6189fec534535644557ee45870e683f040249fdec1e191ff1ab576569a2a0af75d5aac79c20a1f27b738a4d96d95dbfd8bce713031631a89a7f79ad4e9e78b17521485d07d5610d3b3554df410053ba70f8663cafcc2d6e50516240e347b5ff2e554567a7a8bcf2efa694193306727f5bcdb0c69dc32ae6bc34d555a3f801ff77c70f9bf6fa0ffaed06b1ff713c9de0502be15da43c3e7624f6256a0d59920a7f3ede109c0231dcb2801d71100b9ef431a018af4ed9e882c2df9095ce31443a962e1b39110ebdfe9ef4b575fbe5ab0d5d1fb309719ebce81687e21b85450768a4b074e1ed627c7bb2d9083862cb904a4724014e9efc5066e4cedf2612b66577852a28bfa879f76d9500791a87e884d3e7b434682c8a3dfb6aa9336a5dbe59da7091969407130e570151df14fed6a5a217bbdda35cbe20354292ad625ec1195d936f7692a123f51b90208e289886473d33cb2af68318059c4b98c9c9bb965876147e326a0d899af928fdd439a5283b550207c15511b215e0b8974b57d2bfd176a3d6b5c35949044741453576dd5474fa53f81919109c059e2f068f91109dcfb95c216cbf9e91b670a4249f8d91ca4e900e5cf8cd41096cced87c9b0452b476cc7049de394ba7d44908ebb28362fec85b08660965665c6256f63dc6ad9f6348139fcc7e989e664819cd46b0b788cb25b219da868593aa650903b6a5cec193c3a494303363e170021907c41ff4bde1ba4665dbdb57daa18c7618ae25a0af077136113512c1fdcd894a59f1ffae6d0a2631124f7691b5ecf0fcdf01de92d27e +shared_secret: c4041a29c5b744e9039bf5155cb3ac0b799356829557a7aa3feb4b3585e6cf62 + +# Official test vector 83, seed: "16bef67f7ac3a755c59c816478b75fcc16ce5844db537791accd1ebd49d2824b105fd2e970f728c8f0cf16e439a9ae2f" +entropy: a7a31e140891ea37d2b6424b59b1f84f89220f32dcb73e037eb912b389d34a48 +public_key = a4b21fef3306a34117e05c4f4736af0e8cc5ae6bc3f294188ae5397ef69f26303f9592a694e12916bb56e5aa43cef5c183e6ce00f78ef423c3a838ad2cd3c4f68c142eb23dd5f774054668eff212b2bbaf8274c7ad10cfcec5b10bb603ec6ab33c963ad2a22b23f7412f93715a3b0be0b1754ef383c2d52a5a16a22632c88a9635af81909d347e64715806f93e0aa26756b25a8f5984f8e298abc12be53850b83213960428562455d6a7bceef90355318b5bc78734864d1af0bf1393849ad715c711a5226065586b80f1357d961a9ba74999c8f47c7583675245749bc56152f1428910324f2706c8718208c4a13158360365337642279f5009ea86197109b78f0a037cc298f3085c46f68aab45379cf59cd504a9461b47268ba03fc7cf7b1aaf9d461bfb3a7e68b396419a44bd56462e7aa2bd82223a09c155d26dff3873a6052472d6796e24bb7daa3583711cc435a9b3d3463812734b700614396a6dac3c2d838ac103d04239c847241835768a2bcc3d6f8567f6c998b4e7ca8d30a81582686f211936087d3db54972615d4a9b0e1ab1765a18c753fb9513d097322154ea4a3f934c8fff8520af32ab05f26d1030888c0a1613ca74164793b5f798ee3c589684bfb115cd6740bdd5141f1a17393b191550192feeb3c8d2c0b4c37790091312fab615c6d194f076c49d01cb97190ed9d4a6bfe0957047933e2835353085ef611c6f9c1f86dc4366c45cbe2281b0910ae39aacb271c03260648f7c955e99367d1b130c85289d586272fa28807ccd909185dbd5999af47f79da95ccc4859e8a84b2983f0e9693b1dcb506d7b7aaf03f158759b8006511380b3aa4b46cd060f96c0e16060161698f26e073c2f74e9c5b31f9fb4df5dc0f3b0773470bbfb95135c39199f6f281280480ae88573284c44ab9b91f8942ad423783263927c5857d5832a6e1576c6a59e7b1a498ac2f5f71c51b4c9a36cc4d28c042dea588a4756740782b07cc245a069d42245943977780f11eac0c8221f9938fb05a5d096401d2a4bea8c9f46564af831c907c4fef6743ee482339212bea730113a930c0a5649951abba2c6a3afcc4738580c61a4730aac4dc3c84dea158365cc6c760b13ea10b194b2539a55da5f01ef6c55213815fc6479f1bbb67d5754161d4064ed1247aac8edc486a8ca1b311fc653da3be4fac0c81ac0fa54b99030ac2f824598ecc699a31973ffb34648183cce8cfe6495723975c7ed7cbc5281811462cc1ac48fd9c5ca3da126b8125179b651a95b7749bcf711a018eaa951cc078aff16bde9a2f5b180ebee3032b5b2826ec83af147af8288470b267a97c5ab0244d3fe538e986000de3807132937a811de5228bfdba209e642fa3095045266e11f46e99f1b1eae584dcb8805d7455d3435956cb1679b8afe26ccfa7224736998aed363c0d82b1d23b339a16abb5e60dd447bd78c80e6657bffef9bceb18a0c8e602936ba32d24871d6470c338921366a009fbade8f4ab940bbd22158ac5201f09157d0c010825b290581b4108573e720acaf53344fb876db0bbba53d14a26dab409f137535a794294814e2b3f8f42c09f323e072b2519588342448e24a769af363293f4c8786ba4b70330bb80f37de30dba857dace4b8291ecb2f6ebd5a06323b11a89242da833741e9c4 +result: pass +ciphertext: de36243ef4f99396bce0bfc9d8d3d2165aaf7cf15a636550904066b0916c4c877408c24cdcbb9d976024c532da78c1fde5dee90f86729975d698dbbf24c908a81eb44082e49a713a2412352b90f4ed6ca485def0dd5dd122fbf5e8bc8b2d2d1b66c1cb06c9ddad615049b66ae4d8fa24ce3d78598d9a973ba08d5e9e24328743e887a9cf96876fb5ff48ff4d530d4516f912d5840d06efb6664270bf8d2d5d7ef22d637e1b5d47728a6948dca765b79de8d08b151df33b27560006026350c756da22797bb886261060cc95d1adaf05436670f6029e4256d033415d759a3da6012a6d85825a2fa925751cfaca26ec701629e348ab0d5e379fac5292284008e15959859fb2f8a9e137dbd35b71cbf02f5abe1a81c65b745aa2f9f6904ffe915072e053bc7a6aaf67b441ba16f911585f256b0f6aad431bc76193305f4225b6404c9c2336afa3f1d2a8767fd1199e05af964df23a027310cea75db011dacfa4b08157125f883f3e6c00bfa3328afec8f1c638bcc32484a3b039ce3cb2c87677166ab56e0b938e655cc72e87b2fa94a2bd28e1ec65b56cc684f67188a46cfaf2ed8adecf6b9ad2459393d56dfe2d7039467a35d325f52da2e26b436600507a53eddbf9323b8b465e7f0d1921d769ef1ad5d481eb06ea61dde7d25a2fdfaa33ad8028ce4d8275eb7b82c831e217d8ab122526626bdcde7d8208e648aad8cf643b11253b9bd2b84504653379cd8afbf7735ac82814a60e829d20dbdd819b23f840bf802d0c285c418b6beb444d4d916cbc9b169befb6f19bd963af3e3d9c66ad35c26d9adf5f3b36aa3e5c1dc105344d40c2865a6837b61f2ce00a2e2b80d22f6a696d5f25de6e35cee2f3776b2534e5538fe5c27fa1b0d69cc97559d19e99260c65306db59dac203a8d7fccb1b467346cb5e4823b1a0eb5d73890eee213ec5b4dbd16377f23008bd795245e159b46f911b985fbfa0df99b33efd4aa9096bef2497794efc029d719e9331a6c042f4e08f5f4f2cf17a1dcbfeee1e7948b5f57d7a0e1cd26abc8a22ebf0eff45d3e7c16b34f72e670c139b92785fc76787d92e1eda38e4470bb55456ff37418a99c6aed43479152e040e2fc69209c487639ea915e4076218f6352285a09582275985c6ee5d49bbe6e2d9d1b18a721e42136e164437d96f2a134652ef092f2e3969efbcd394d7f2c99f1c12edcd4514be7a9ae7f5ddd5b743c819e12756d2754502052a680b24528df8aebaf96034da78e5608252ca6975db90973a65150af5da69b762724660476fcb58dda5b117b6c988dea8690bce26a36c278a449919ab85fb9e79df56471ccc6118912a27f2447252e8caa25acd52707d23ea3243037b1722741f1dcbf47fedb9675e2914f631ee01205e77ce05ebdf4c9f3a5203bb719c4efba827ef57c89c619e0d682e33033c2c05ac04c5a02042e0f6ca1bc9d92a7e11148144d6c98101868dc35541ce69089f0e02ff3e9fce5da3d4088c04ce8bd380ff62118a2513acabd71791555c6027f50690c6967799 +shared_secret: b8441852349193321f466ccbd3afa48bafe903288108312de26e9bf0de9f680c + +# Official test vector 84, seed: "d0611f9ae5be4da5d7eadc9109944348e716cb3daee545721eea8c892e7831cf2e54603146454cbfd92387739e9a78d8" +entropy: 70eb3f791faa91f1f982fa477dbcddeb2c55691c07f93b04cd31b37544c94b42 +public_key = 2e248784527ec73160954a18dab4986fd146767bac1506885a7abbaf203fa7923cf3644b146a7687dc0f56329e3c64b052db6c14e3211cc560d9a70a1ba641224b2eb8e70e44b25b4b346f3037454aa69744d1777498c98ce741ac1008461868839b4149135b41817d135060acecca5af744e982142de574ecac5f1432a7d907628eb75439d8af02d37e5181681f1b249bcb22d52961d20458c860ceb3175730acb9b8c8500dc258fec13677f40506bc76f8eb31cc91a605e905ee839c3e0b771c32595a3238acc079fe6034769652e5cb492da0a3e8c0cdf13c899cd5838bb46a27e343bc62ccb6294c1619af96817d77ebc2e1431f997566485327cb9331a262153cd31c80d939d473b81feb0910e027b02c29cfd66fbed3cd09c11fa08744b9e0b62dc3093c2552bc7a770a0550cd601b2e6559851bbb5d8665865555ae510c2df9637c07790639c0af6b4bdbd567b704c267e6abf2b371f580686a1910bcc02b7ec3c08a7aca3fd121cda343a61c6c995742159cce5503b4996a7a6fab9e8dd5713bf62f3c0792628ab621741034208ca01c6130d3a3499a186fd69db4b3cb77417a12992e8e448fb75b73f4ca54fda42b2df2a4f9e14c39424bd1592b90968434eb8f52a6a1438cb7e589740c8b9b2b6123600b28ee954cf0d18dab1bb3fec8a0ff6379a4313325c7011f4c7fead33c8fb543c3c90b6ab35e01e31e2dd4262bcc92ba11ba055295b3f2a273620576813232876d1e9b18e22639e9c3759eb460390bcced9bb0e368c6cad846767c69349c59fde27405d8ccc900ac2ed762b1ab6381eac33f14aa27c047e5a63921030f8ee7055df00f7cd353bdc1487fc0875746b9deaca76fbc70ef5925ebbb994833a7eed732235b06e6ec6b28217c7d9a86a5396c80d43c22c56c19570238c70e7a7c2b6a77bca45785ccc31d8a880be379b05e45a1b9a8b3b2520826f888a8a025e28abcc4320bd1e30fdd17cbb3018a7a784534379c46639a21227d279b61da608bdf9bb9304b322f103a6a762db152548f192534a94df0ba1b2c97b9af8202dfc646a84270400cbeca95aada593d8f4719abb6cd4a4699787b92d63279fe9bacc0a989a59cb0ad279a567b8ca9536e8107aa7b81b2bf7730b9f4a470c8170655a0842602bc4610f9e7bbdc6acfbdc4732e4266083c9c91d41ed1f2422822acd01bab34c4789a63a700a5a135d65495841e69ca2f5334cbb1fc4c7d42b0f53bb63f888146163a51759c43349377ca824b32091e9b9c30e025981b82cd23aeb5385be7f398aa5025e87b605827328ebb32d6682896298f652243ebb3b8a6f759db824d3f577cfb8aa04627a80a03804039478abc2a627779d1c87fb23453ca254fb51c629f17c1edc8cd8c71aafa135051320f81c65b06711282ec6e7e4b021eeac0c3fc7ceb4b192897899f6c145f53bfa2d68a5b583002667d101a9c7e721f0da0711ca79df954126d9199fd6351be89225cc52d6be5c906860f6ac81c56477cd34c94ee43b920eb6cb62bcf27e5669f9160f0eb2ce7389b8da47cf8b22f46452961457dc39c54fde66a41f95cee1ba87682ca6342ab76f6bc262632282a22293ba7be9cc567700b5c13ac19f126b16a43bae7e4af067d280590ff759d4c3a502ab563080dbfe1df14ac06d254fc +result: pass +ciphertext: 36522827b08eb3be3116df1a5c1d91851520ee9eda2a3fb54e3258d536e7b5345ccf7ee7c44e8b141a73f6251067f67090cddd2ae032447a612c6c5ddf292e1cde9cfd07f19187c2dcf0a8e5c169aeb8fa4e9db1d013413e62a7e42f1ac46ca3475bec9f8d4bce5805e4ab86d2192ea38e9dffcad59f45b3f27785d3e7165beb443382778afcfb1282f686a2abd4764a21422fcc626baa1076425e3f986eb51de5ad135cdef25dedc61023ed178a90ae633d1374eedb067896a28cda873243eabc246d43e60eebce06a065e0311ef7236b3ca74f8d0aa1147292f08401444ac8cd66dc7c43852941e384cdfa297910084c0d7a100086f6f41d1e103e0eba1db3a4cb9980cf1c072e3818e2d7ca76fdcc6b73bf91f30ecc19715671ff775ff9426edc903568cb55c757ed7f785135a14d3c151a1e0899820b5db36e7db087b7682d98580c07a4bb55e24972574f989f663adee7b4caa447bae860badb99fda32ba516afb3c9fda27a7422898f0d2f85537d3732c57cf3143009215ac73056d13e254d4ba0399f49761e960078b78da2a709aac554f0fb929c40d2affca4b53901d9edb42032b33b18238086f469addf7d27cd36d55b5102001bc18f3d1d3662477c0d51f37c150be0391bbd15889f21537ed54f2a3e4c4595819d83a39d70b28c4cfa2692eae6e9e3a71ceed89840ac4246367af61a04f90c3bc886594199f3df25a1ee7f6960ec5144313b15a1aa22e5309800ab22f7e690d1dde2bdca0506b68ebfcc16ccd97f6d901d2cf71fb5acf85feb2df8a22679671f1e65955289f35445451cbaba874b5724fd9423591a479b7e2144b9aa1d84bfb577cb7755dd6ea893f077e05a4c9d2697674892b8f66ae9c659a39d7944bfacc6575c8ea3721bfbcf1ca63c07574f3ec4a8d78e42605789bd8d905d1ae70cd4e9a9350ffd007a81a43694e8d3ed28e028cd24168cd84cad519b0b58aea046b06d5674bb656ac23fb3aa258f1f87d34f69e8b52f208adf0f476804e5080bc8d94d666fab802e950ea6c6a1f9f0c201773b303abe37af0ef90527f372dc298efd1b0768867eaed3c4b2a60cfa94ed6cbc4ded0a394e20dc7e5ff857cc7fe7285ba7257c3aacc80c9058de86b265437d0c2c6e9d1fd55be37155919e2435888defa734d4ec60789157693717fb5754b60636427c9e58b5a1af828873e1a75fa02d0763eaadc967f3973f9cbd129d1c0cefcb1facc557f1d8379db3d2b5a133964421691363178e24a8c6178fe09fd5e22cda6d7be38aa32bff539693f1d714d52aece91e93d38500a6253283295f51dd365d7ff6ec1edb6869f8e556e8444ca00308769cfabbba9846574691b6479662a392ed93de8bedc1b03a01b1e1612f395247691865efe48ae0df8472e3a07b34ebfe390c347e7f42b5c6358d679c6a22c84a7eb8fcb60486243caead763cc2db255cec565e094622d272407b703dca27e6783fae2fe6b42c24a9f8ba6444794596538ac4c1666626b3d158370ccb01fab7eba48c7e2b6029be +shared_secret: 9d0d9ba501da1b46775258f5c0904721906b237c3461da6c31d70da8575fac37 + +# Official test vector 85, seed: "fbc38d7614d7718e931edb850d2c6f0c5eea9ee889b3e25bd69ac255d5b91e885d93e808e66bf9c88c655dc594da5792" +entropy: 30f4095015ba88b6d969672ca3f438c395dacf7d476ea7a9e805ce932d270a13 +public_key = 0055afab2b0f8c4481d2316c876607a02b744637928897c26c1c5762524f42a00b27d4ab7c198334a13750b8bee321cf5021cbe4536246a0879890ce6f042de3955e373c113d7c2e2df360a8fb5c76fa7f1f594b64b562d0c3b524756b2f94667de31f9a67aefeca35d6641d17d167d6d955d6bcc1709297c9277cf614423b212e96281f6100074d2c2209f976df6332285b3c412a8f618c5b5175302952366a5c67462b07fb74cecc5726ca861e47d4c599819d26329568c139ecd31b22ccac2901d0bd347ba5f10a51b69dbbbca90b574405d8c0600617e682bf81472018284a70982773434d07286b319ca4e3fa6b24b25171093cefa559aa33ad3a0336a1a18205a07ec4463511d3be9ce0b05944819b9647ffd94337c94b7831694ba31cbf8c7af238c21dc1060799c09bb8aae0a084cab07c3bb8502275398e05058b142794309e3bb287fa32a016f46e9feb9115f09a313970293b25e7d25c4abb623c1959d6246d7e00ba79068ea03963d9598fb2b04879c3379397b086960c0d896e419ca5f7667264e1907102329474867cf43a426b1e117826ca542cce64adcbe154f36637de2cbdbdd6c1ad7794a0c18fa339993e873ea54c3f92a68afe0445305bc97b76c61b3bc693e30b2a2b18a6cc28add35cdcf601554b17df39998516549b823ae1596d2a88acb9433433926af62263deb704a561b2f2397381228fc5b15bd93c3911db634b19cd7217508e328113d565b475393d95c7abe5a94fd6c1cc1283587b97db55109a08b1ae1060cecbb15675a253ea154ee19aa9ec29ec33400e4946b89b5b1b4ccd41362a3cc75808408f50ca8662b236f1830656a432e2193bc4f09ad1fc6a82252174a6530b3b078808c8798c9e110820c295797580a74572adb025cc31c75017468cae17c697a79df023aa250c827c11a1491944b9d6156d24b1f0f53c12a1aaa5946bda21485cd18aac0034de843489b7cae9ea90197cc471444067d01f873175693224c5368e3f3220ae48832c0928e65195510b5d4eba93dd3b217b79481aebc34f2123ce42c0aba83ece60034ecbc0ec4420de32851a998207f770f3e2bf94b047779b6187e083f7e04458c243d9125dd1641ec413ccf0a02811ab65d7d954bf4cc0cae00c384889d1b23405419180ec83d9ccc170e0bd6bca3e2682bf3471024445329a515456175ef6c167da459da6f3439dab20fb28bfb9764d5d9b9af055b442399361e91f84965fbcb31a4db147cf5cbd37b955fa3b0a34b78f8f4b2cf584c1f3646b5d7887a99b3847ba9010a69c89f52653c2c4fd2a6cbcec2d00392a1aa44ddad605d8e1595d2ba305cbc86b24a47725810a761c45c6cd0177262b2c85beabc07f5086ea31bd443889ae657c9528abb2769edc8cc74bc80943f92e88402ec231823e15112ff5624c982be7669010e31ac9494334488105eb88658339db648f30b3a08b7a7b5bd1113a83055f673a8fd6ca10cb4ce3c32645fc42ed24420b222d512c68651a0b99875ef8e913b984c709221228e51bd2c2407cd49a06e83f7f12c15d33b0252937f857beaf9ba79045cba8264d7706270d4787f6ecb8922582b7321c26da7813eb1c61a80038289cc84a923e03d7ae3cb232d5e0c1e7715d7b305d86d34fe89069774bf4339a1249be49b1 +result: pass +ciphertext: 1f5fd91c64602f502d1373cb97805effe1fa5470648fe8b403524d8031888ce5a0c69c5b350e7f47038279b9ccedb1a124ef224764dd81a80f376a282e858e2feb10f2062075dc206c9dd2f4880d83e4807dd4f03518f2fe0a57f21e554626db5ebf5aef9e7594b6c439a75dc4d6b86bf0011effd8fe05f7b07088817a2f8b669b71cd9db8c4c5981876d811601a7b6cb542fc8651ec0e7daf101cbe22137bc07df0be881e74b8b09af648a20067c1d98c995afbf286cc566751fd37b78ac33c2e1e41ea00b2d280d6b8a3d963835f84223a172cad0a37194cd8283515a0e8672a5c2cd315790181e6482156ec6ce6d361c381dacfeaff3bf013ac9ed98cc170297f4b1945ae1d535b6c6cd3032d48cdb5176a988371d2c606e4933cfadca235657088da565d528899e147b5cc202225410966e422d31048048ce770443515c403a456a60178e2e1dd77d9af89214df32355b22de9da57fe774b3fa2a70487db5acd94ae8e84a1648b502d3c47122b912d8692673a230b72a7852323b9e303a4fba4b92e28cae78816c9a51e4d456eac1f8619a8e31c37861ebf20364662a5bc485d55e026f4054ef6d01b2e034617b392b9bb8a250d2ba7f40c45205ef68ce88795cdfb2c5e8b829534d5b9ffa91a1ecaabeb08be329d5f4e99bc5c069cc969bb354a9a8efe99cda86937bce9f1b05ce27b2401acd985ac79fa0cbfeca06a6846c273dfaf87e3f1919cfe660c3cd2c2dce327d0804ebda3e5e7b43c9c80c9e1a2eddb342874ed9aacf3895bfb8d420d1377d44effa9a0b2c56eefc0e068d96c59b3028e82cca15e11d4bfb438e5c81afa6ac5a86b9d76f7b9f6b59a4bab581683869ab687d657806ef8ed1ce67b8e6186be98ac7fbdb6df7f9334fa5eb7dc24e5e3084deb1ad0b9892890c1751e5d3f2f67e4cde9fff46fb8a2b1a9348ebad7f6af4f9cbacf7ba0f5b46be61fd00ffadc0c466afc2e6e1330295846a2a681770ae8f2ce09b9b8c1e7e33a5a406b19f428708f55a0fbedbc9f2234a46088d4bd054ab8f5b2849724f0f6856439a4078c315d4fa5a0a7f5566503365f836c567e91beee69a204ef071149c85a9744442a1467d52bbe0f06fe4022f7ce152ea8a543249d7c1bfa48689178daf4727218b39324f0a8eca34f016880302b36dacf76b8ccc776878f0757b16705d9b44faeb02db311a8649fe9d41e377509b3aa8a5a487656391ce64960f34420bf5385b4d61a65e1053f9e0a6559e20eb839b709e8bbb8dad3ea772e5d1c41db14f260c90ad8e2b45306010fc46a0878cc1b3cebb440281da6862c9ddaa917ad5f5d472c1045c2416f7ae434489679d84235af9a16bcdad3f8a300778b5f247ac8a2c2fa3d7cd64759f263e3d8ada71fbbe3a785bf620afb1860e9db1aed284e7e471d7c7cb09b78443946268a50438e3520d86b8ef9d803c395307ac2260c075e95dc0d908b1367d11de1295d069e02ec7c734212d5d8df66b9245280b3d4d63b8b93b97226227eaf9a552a79d442a38eaf6942ba +shared_secret: 188aa07faa2b7a19b6b7bfbd4cbb1ad829a7415d601fdc3b635528db136cac52 + +# Official test vector 86, seed: "1722219cb5db47374eb0af0232c856a57f026f1cb09e5a5799f4c333dd422ff6a0a67c4da502faae727fb2d45dafcf35" +entropy: cf31220f44de862e1719570e1b26e897790159366a385452334fe24cdcae28ba +public_key = c1cc248a969a9deb8ba9c43e80799f3e287b4263bda1a1055d152be8c84a4df5447b43295d0ba65d2a9b2d15a3b139507a3c2a44965e68e7caa4d9aeb4f67ced404305c81782ca49656775e10aa531f01c66793e198092e2b538df264818e7afdc94ab3cda837164cbaeec93fe2b8b59397482f084af51976bb6161c026761a22dd5a26457c648ed0817ff0a45fbc8c7e0e6c45767b7a720997ca60453785b73a43522979d06b365481a54e8124e9f4274950315faa27f5f8c50699164414398d72321a9d5c2181338de5187baa2c0c5097bfbc72945b15406eb1e88caa3ff92886a6a4fe2c8794700211ac32e1968643ae5a6c3aa309433cab3e48aa93a560fd18550f19831f6c74e811b8be5771244954da635a2fb6c314b9d77f1bf26fab613872d0a2098dff0b060516feea45293e28c0ed088bbfc0165a1906473063e97c5b2825100116793fb1dfc9447fe3227d96bc5e999cdf1f545c8753e4ab43d211c80ba9646e86651d928b0c9e64f5c2ca80b99914d878641a53a6a385acaab6d9b5690d11a8ef5a08c35e80c5df91463c76366282543b08c0bc3054ce07c32fc10ae021bdafcb744c20dd131c8d4146f1fbb282250941d8a1cdae68b4c5961a7a437b3251f144586aec15f505aa79305797a16cdf4c89209b02bdaaa0c0d367e2dc7097a9900bac5cf7063c3b2027ab05b204fbc997f333122798670e3488cf4bc64089a15a97f0c0a4ab5680fb9d5a9a815234e158316f31948b80ca33523e2303838d55ea2368b037a607b643ee8b2488ee456273158a3675b56967ce7b4a1bd2c22a91083e474ab9121cfa0f2bd1a24b27aa317c34b968df055deb839ef172ffd0489bc524109aa9897383f9cf0226810b56bc75b699187bbe86d465c7a44b65aa828c40ce76de88cbd6671093ca1689506657cdb6b3cc5a9a0293d16057e700a3bb7623e3ce1c8815b1d17066853b1cd807c0803f9a9fc2b62f637c99535a1733159ff79a863ba9203d57c80f0bbe02052e41004cd42388fdc695d9722bb0147c55510cfb9347127002fa9038f42551fe1656f1c4ba91c47e5fbcc5e83013864209290cf7d901213a26e1fa79aa7576c7c4103cfa01ec6e1459c9aacc449af7d10aca0a4171b284d4473c9af9a84546b03c7d5cea7bc723dc5032157b58431ba9a895d35f89274e827470babba0342567648ba84a51aa5a604b4c36a27c0b2710b2388b53085603cf62d9ea0a6a6864971323ed9e934d7471e65a4915ada5dd1e7482a37517cfa6255782ebc7b789c4a6d2aa746a811c0be90079f138dfcc812adac7c4bd862ddb83cf0d6b74b623b523318bc807163e6c98d777c7ed0628266bd53a29636b601e162466cfb700ed35b0966a7daf32e7dd67aa1c08e7cca8f18fcb7bd3104bb5408637c08eaca654b19523ac0a031b76968d71d9c013501a1350742467970c2813762c1b4219dc904202984cb49b33e91328b0350ad36b4a7650f7505b11b5c6f0520cccf788b87b5aef42b44b567c42555c74f40ce66cc9003730928e859c77099d8149c78588fdf0c347eeb6752b39b755122e715843ed2a859c02a81e7705127a52d53047f973952321d34d4278739c4bab50a5c344011cb196dba2bc5197accd11b3f6e5d57b37115e763177a6910c9866c85ed61c6 +result: pass +ciphertext: 43ca59d61117e53738b410cbdee068783bd99064b5c2b5238843d7875a72220c28aa6835a43e8f3ed0235b92051e496e497c739e1af2e2a7765bb4a038d36edf99f0f8789f0acb8ace1e1f981d3cb4d881437dd6dc3dff995b5c53d3c8c0b7090057bfdc7945b2dc9e1977faec3879e200e53cbb02e90dbc8ee00e3ddf74546e58beea2a58eabd3f9f513425fe38af4876b8077f8e679584dd5744b9c6f2d4520373da8ad93dac74e6b91c2e186bd7b18f15ddeba8c179375414a42fe1548f33244dc3191227b59a3c9c494133894443614dc0811f8bece03633d38765e214d96da45f089182a1a6836d382256dc0937fcb91c4f38a2e388c327816b622bbc3e2e76123d43e4f3a7b4492009178258c924de1eb0ef07497d3a12f56f61a2667fe8a7d43388d892803a42ce48204948dd9e28d1382575972ea07cfc9727c0b57fbf7456ee01e377a246022d3adba2ea7b4eedb3cd16a8f12a381df1b359dbb3764eae94969b48f53191d8eb4777ee0987dfaed4ebf93486ac233e24554700640d19211c353cc660da14871a48b474199967c7f4daa130c75356d509919e33c17f8336748d2ef4a4787a502dc5b3fdffb9a124ef31f7197ae578834d64e8d1088f75f8879aff16075c48d9fc72f3facd3fce6802f7370fdcfec030c5f70f163c109062eecce2a366e3c5ef156e3443c010e1f2f520c60e1dd89998378a6859a594c65eb43ae734c864357ebbb0dd172a8c611ce8d8f073340330a57ae7bea54b9d62f778f963682a40f75644731366de60038f4a4d1eb46579ca1aa6ec09690eee7384000c35916a1c6461975ba300cb717df5f99de105fb197d2f4c540c5c87e44218adee452768631afe676e5423d4c1c8e0270c69dbaa56f146de0156c0674e60811965dd588ed266f9a0f1fe406894bc7099b26e098aad64585d7b7f57f4170526180f5eb10c10442dff1a3fe1298444391b4bb392e54e3d5549da4dd4de6be3f361d4b5c261abf61e181ded24aeff4070e2aa504f5f2f7b0e63bf00494bbea72c33a972a5d946aed66c3ca411179340246155fffb724ed2714426eac5e331eb5b7a196a16f22820e817448b36d75c2a90ccf453e2ffaea1c3f21ea8ef21908dc2f3346315c703d44467c7ee02316915989c22a6b8254d96dc56b99b6e7802e3855e07297565b63ff5dfdec11b216271dcf722fd46041df8b2ee07e27bcdfd36703d847e2b3074ccb7436b56ad9b33c68fb1a497d81b8236cbc6a585e1dc0507a15a30b3d2180c754a8dfce465bde430a2d24912dee434d59f6caf3bf2211f20262dfb5d5d0413b824e3cf05f0ebade427c741b0ccf53f84cfb488caf6f401ece816eef2f94fa85d72c445a4397d26280448140850990566ddd703e4ae232595e558b0ea45425de6cb5a1f100f2ecb36e9980d66def6daf65249e8487784ffa9425625030e8336f1c5cd9d0100631b5b5d0cd549302ecc86697c42cf39629df1bd5193bfc5a6a9a0ffd04400d0b928d35536e46cbc8f06adb7ec341af71ee4 +shared_secret: 70df7eeecb6ad19b54498071e0840f4957e935a62feba82fe29531f79c2c1651 + +# Official test vector 87, seed: "ac139b78fd16ca0f26d6d7f9e15345c888d857b1910cf38d883339b37ead2dcac30f7cf10176f23ff34b4488eb79437c" +entropy: bb5e65669a44e5d5c709bafa98c16ccba6ac2c4ae923334f69a11543eda64f5d +public_key = 33e4a6bf137a2d5c4408040972bbb41342a6f2f97c6bf7b5a05a92ef1c69a3e602f5062b4d651b9af148ebe566059454ae71919226742ac151fec6623bd5531699282cd0651a1bb436d113202aae301a6de6c132dd020cf0235944d0a041f6ad92e404f87432bf3a28035c4f6e236ca6e6b56d924800667f8816839549535f1325ceeb5b0e194b89a5800819215737a40988a43336ceaa914800278944ba54edc65071b63374fb041f07a66d5781ee8492d35221c53495248365cc438b4a65a745a64585242878997853597ce1f45371cb1f97f8638837bee3cab372c024ebe4aa52455283cc2249d82739ea481d685204a61840c856617a210fa431a31b27532b5b0868c2dd0a1e2947aef0575934905ec50c33193c8cbf15c5bb4a89b39c63337b3f4bb3b61b0581fe2362037bcab4c62ee14ac3d8a70486789a6d9641b4a112f1336d7e613b13502de7d1bdd103b6a712bd4c9ab0f5611ba825aa5b344ccaf940c5abc296088893626120b4aa3c73c3e27520b6c6411aa745cd4399bdb627ec584ae3e2a9081c4125cc37f20107f70161975355ae779d74062d4ea062a36a4b63a20e22f3af346a57b37747d3d68a486133857577dc3040342ab2c8a38c9702c66276b5439c82465304f22ca9a316b6c078bbd00a748d9689283aaa0fa584fcb922de15c170412ab5819a18019cc9221533a691503a79c71c43de9453922264ce5994c78a3ce43a1595cb0c761291200b9bdd8b6dd037326e5b40d43717e6507b5f7bbbf71800cc7a1143e7101995ca2c2a06d3a501229a913e3b350cd567e59a03ac54c35a8cb0e4faad7402cf6353a048461649d4171406503d0380f543aae846a21df31c561451fb8707b6f15ae138a8d11b53b4820e97d1293938680546000c7552dea31d4ad50e914cb85935cbcf18821d22b20d309023018a667424ac7aa71532aef2c69c0dc545e3e501e5706bc1c19b5179bd4c4ab22dccc9269560992637a7887b996a6754721a2ffa97be2b5fc2a512788334871577f7530bc06430e539aa7ee0acab022607554e2a3160c2026b8f169cd3537f523b4cb3096dcaeb4413f93e8dd26c774c98daa269cfb702d3592984a3304aa56809b61f5fa4557a08c8ab20a634bca903f456c6e835cbf23f647a47971c3726ca216014459a96531896c8bfe74fd0eb074d74a085bb32bd57857054629a3b19d0105f5aeb5e79d10b0ce0ca1189756bd74324acccebf80e849969bc008adb76ab38fbb47c59cbbaa33f22759d5f879f178a6ec6e37309a15d70c286d7549fea354b438b48d4e73d6b0584469433cb86a74be82ccee60e4a0ab3296a31fdb9a66116a765e2828f3caa12da7e0a4a0a54d1ad9d141b98413c45d277a4e0a11732b9e6a816e3f1cfdcb62d11eb09406b83c5746032e128cc2897e3243840652253b7865a079309b7ce6a1a5b2007b775a463199c4a90358b416435d69bc7c6ec48a155be7570b7fe2626515a09037a6d9dc449e344b0d570be3cb7b70a720156858d8656c296b54c7377456d22ae66402c6fa7a4d2921666171352f56cc03a76365723682c5ef77437a5d16bf343972c43b10f56c5770cb8e9c2a955e89c35d932dc466b0c198874bb242e511f4f4d35fdb1eeb7c0006fafe38c636dab4728b6725dbf53e59cb8 +result: pass +ciphertext: f96a0a1821b72297b925d90cefc3897dfaf0160826a92ca95326c8de0a3f790f520c64b87b0f47df0a9f1b965f51610fb40e05aca0dfc83ee06684e4ea112b6386d00e1152e4601ebb8d90e8892d6b0544a9176d9ad6ec243995749c6ac9dc4c92a3450de5823f458538464f40cf99738623c4056e72abf449d12918d209c082092bc0df62cc599998fc45bd5f6a1b5a5e58e818bd555017edba520b8f7ff8db4390aa954fe592e48f1f24289092f1b7d174e32343a3a9bcdbbd1bc0f9ac32bc0ada8bea6aee13e49b42f51a7958ef5e5f720c7e7a628e5b93c84aa38fdf3694849bd6994435ee77f9f0ccbf397e8e0982e413be93bcc86f90ab1ce79b767c462112e0ef5ef64f0b096fcd68c6dc654a1c8ef18958a03fabf0b0e3146da24b05b0ca3dcbe899491a30c8e0773873e5d91677b875a333b5996556909c8b6decec93c7f116e86b5828469e8e67e843b04bdef173563be03afc1665ec223a9415450a64862a6291bd1cd8319864c7e3fb21a83f5a44cacf2e1ada9f51c45c9bdfd632a4b1a1df427a12d192c1fd9960bda088f945eecd2c688241fb003cfc47fd8ecadab8af704867266002eddae7d0d375eba342601e3390ac2189807684c94dc879783433fde5a9dae58f31d92f9d4b554bc02842614d0e89425fd293625214a136e183689e1e447130a19cfec4a02aea2f8395b302ad34406b5a98fafc1f8ca3bb145c5337603eb96e8d1b0553eaf63512994b7ea7e130d6d42a078763b3593e34a79db4fed6973e00516fce07ae7243cd840463f4886df76ea643a0d0d6501e3876d4f052cc704b45bf2647215e69808b9eeb118e691544b977dbd5f3915829742cdb1960ba4a5c75091d6d5a0cd894c7a25e19daa208be0cc82e8ba1e5d0ff6ef6a1321c7f42fc80a4fd0a42b0c93ff8e48b2b60d2dadc5c2052b2facc783526fb1c28dd506be55c61bbd693521b5043bb472112c878f5a82c12415582853cb0ca8f542fbcc8c459e0880be34515f2aa83b3ead83914ea582b8872aa7e7a5be89b46b23e0a5be37a354d73921c5fbc25d1dfbbb7629bf38b548342451307db877a807851df9bdb66498a3d5f2b3762665285cc23eab4fe4b1bb633c1debef9bdf8a22a49501ad4b508d0e32e68fff82478c4c6a8a3d8c7a2b78ace428d7282c92f55086744985365443d6c769d359571f98401762b736694e352019684790566517e93f51228dc56ad351e420128d8368c11a8dbc3640d372edb0bdfaf18770fc191017f2805c5a4657c22110b2b39d3c3c9611b7a000a186e44d213f9e0204bd142189fe115d39841779dbd9e4e24c04d234c5a9c300176b1199640382d4a6d2d6139a31873d3f9a207463760b81ae17b0d2e796a7848fee92eb44fb77a01668fe35a1ebd679f04a616b86cb95addba35678a7c2c70f90b2b75b3300d3f73d59cc95482e3ac87754780f96bce1276bbcdffe88b40e06ed94fd80e281c63efe1cf6811cff0097ef06f23a34dce62c8b904a948b5d9ef2d8e459a3e83c4f7a2 +shared_secret: 8baaf439867c9761e78a64652a383e21682969d18f84dbae0d3a63095948863d + +# Official test vector 88, seed: "cc7152849c98d5fed2813275d32069e44824ecb14eaef425ce017448cd9a401c91c06d0f7eed6d22b7bbe8ba6c429ec3" +entropy: 9ddb3aa9c7905d1a438c93bcf78e3e321813580371ab4e1289e2dbf3701972c2 +public_key = c797aa612a100811c3131b8b99b3785a4a32c4ab212b5c0217b18a55190890073f2c12521beb9410040129d5947ef96b72c92ae0f58ae1ac236a5426e7a4440aa42c4bd501af4823cb621c3e6374e368aba59c45932aa0addb3473e96854e8a706c510e17ba91b8b865de529cbd093bda7b6ff8b182ef71651035ea6d8b7c00a6f6efb8dfc0b192c44260a9479539c5a4c38cccc6b1b7ff3697e3759f8e1253cf71e2d7c9119b77090a99b3be67ad965919bdac787f116a67b1ae1c7230b957cafe398027596d510b2ce87a73cf8547977631d872ed714193ba7be01bc7e16260b5bb00a4227b976eb5f0dea457d3a493d19494e5219fc67006caa818eb43ab0d80693eb616b8bb9c87c5e899321d6719801a9982049c6a98c2a63800405867251e20c117241e222a1281745e3929cbebc2444b9b0fc0148b81b96f83b9517a2ab24171c5c55898948b7f16c6a1a09cb7dca509a3876aeaaa4ab299781582cebe73e9ba63390b35847480a9a305ca7b4043ca32fa6875b88085115681bfb806268a7ba33bc0dd5311266e672147b089943c2310136ec47ad1652c681a94ff9d09f87e851f1941ab4755538d50d99169ae1bb2bb70aadc0c87ba3d2cb70f1043be7272663740ab74c05899cd7881be63a86abc13ec4e014cd1868c5799992a58a60aa2bbdc6b5dffb8915c3aebe3c9fc8f70ddc8b9b8bd69fe4f1b60202919022af3df26369c190f5f518a6479decd8626e1c16a1094e2dc7c57a1a189b8b2ed0d4b9b0d90662f134cf4325a1867505a43e411c3fb4c4477c74b658d302fea66022505a25cc2a06713fbe1c2407f187e427a0dacc9c0d20a8ff3c4538a71a639a9029f1c826e8612ba30b2de1c63bbb0f70058f13973cbee40f371c490581c5a61ba074175b6488bc9829ad658568304256bfb88db3b10a4fa1744e220ba121772d94b35233cff9f8ca6053a364ca312fe1acde98bcaa937121806b40c972b1ac1e15700ae67441e399bb0641977d058020f205b258a29bd53fc277609c31150a0134849b6b7d4564d27735507ac25bb2164d4664c0b37cd5b9000d33201831c732aab32ef114902104bdb90b638b42960ac870c14e6220806292b9d6d3bcef1a9b6e859516651f9019cbba1c636ee550a72146ab17231f22a8e1eb68209642caf3814a0121565504859810f4a81cd8c5bf10716136e77fefd995a8956d6ffc0a38f841a0905b19589619649ecb2b24ab314a9a85bfa85cc236d19600c7440771a727e6745829cec312346b92c1685507be82a7d3638d36d4a7641a9a042617c09681e0da904a21207cd7b57f183640797142ebb3aad3470b82511bb88c8cd2af6de0a4f789161f7b2c00e2000c95bcb0d270d00c89c5f102b86650e2f8a4c46c052a817cbcd978dbf2c776cc98d53c1f7db97a0f42594ef18b2444a21bb2c1a59a61ddda53d0105489967488046ff8679187800587f2ac8946688cf49e81da406a2684d1a6495d33a8f12b72686482b91c2272215975a484e8488d2b19ae220cc1387594da69195dc47ac1127738bc03ee72772481892734246681b818b16f06943021363ae890ad5e213303d86f890478a91c6d0ae28e95b4ce2a861cbfd681a47a25545c2a29b75946d0f45ba0aa193ca5544686d9f9a802fc4cecdefea4a0 +result: pass +ciphertext: 3db10016c2e241fc73153aa86e26766d09c5f5dda88453093477f69b54282f90c00454badda5893ee6cbfe30e559d3f936584dc92c7f15bbacac3c97ce7992815e7cc2a108d7706f7ea8ae3df2e7b419daaeb41e12d97444b8803d25347c66ef410601d9ba341a1ab8a1351c4b59dfb3ba3ea5a63e69af64f135fcd051ce739a339cad1eadfbb6a01cf1de615406e4cff7c957375ce1db25a25250190f021005b0303a077ad8163b777eb9e3f5d5444432d8db403990e0bae063ae06a47fc561dd283a91f3dec6335cd0f565b406e818d1d57e9dd4b8c4983379ee60e3490d23f052b93b3dd4cffafcfe6353560969826d3c8765a1112d34c2c9b0f650c3d7ffed1c1fda47c7e998a0b71674d4b15597907435aa03584e4cef38a5524e7f2c0e270a3fa24f72aa7b84fe46001b7bdd7ef56046404774231e74058dd32f3486efe98c8bb91512a4eb9570f287895cf97b3abf9c71b175f7fc503275964d50c8511acbddc2374c11265da5c9b3c93e2765980d563d46ca5022fadbd370b76249a7ec1c2aec49d9271ec7a78f6e29000f3535ee273ae0b86747193c5b4eff608d6417134a2d0ece1971ff75df89b74d72efad92751a2751aca93691f2f08fbc560ceac102d03dff61ccce343f9074623fae090155002c01c4a70f9370088dbb1bfcf27d6247979f3fcf2a52abfb2238c4338d8a97618210427c425af435a5109c85b444076eeade7e4ca050f9f0aa63e132298fca9492fba45abee24ede0778113885c46b74aa00f14f8ed6a116d586521c7d8204619cac4a946d8838e704e7caa440bf86dd2b5d4cb3898f4795873448ba508df393f766a79e6523a55157cdf62dc2958fde888b3a9955ed6f690bc919f7c2137b9dfeae7cba52f31d6b1d1293b07611892122e8bfdfb7dee37cdda341bc3c916adf5d942417dd05febb73c2ab1b93209ff83443635db372cf0ed96f0b0d29ca7f6e0c9a85f3ca6fae10fd2ab30e99e4e72b7e7813977996370ca29338eab2a946fcadbe4f2a38b4a0c19ac0fe6e3e7681509adcacc4006a95a3166fefd558d2531c908758f79306159ebe95d4635910e257815335c4af464bd48123a2a160086f6eaf107674d248c70fc7c6fe452bd34638d01e99686216264b360adaa634c6efd771d34db91c458ef5fcb03b337baded312b0ee49bb1931f912c97799b5048e96a2c96e4e65762ef5a533768e270302a028c58439554218274f5c12b3a87b789f1aa9962c6065fe1ab97c1b259c32983f856fd8ade0449217e834e4c478c27cb53eb5a9ce7a6f639c5b2a0eeb2f607f3551c257c5deded63ab4ddd59d242743841041f2502c8a1765f9980065d8404b4bc2157baeb1c060d096b0bc9863a1387208c97f6718055216427b501197bbc6803e1937b3bc62d161a5f55491f8e87c31229849d7eaa632d50df9af1a95e913df81580bc858e7348a03606abd7447d0341802bb6112b499f53378d9a9c882e404ad1fbaa09a2f6e96c37d9f762371970150832f3e33d5533d6475f9230 +shared_secret: 60b466221ec831f91a91b76ec6bbc29726f65ebcacc96f9e191f57a1399be186 + +# Official test vector 89, seed: "96d9a06f88ff2c2036fa8e914b89c765e4a510b468dee40f914f78858c811857efe9fd0e17c0048e7389e8d996b7e2b0" +entropy: 26d90b190a6c3d0d9a86cf66005154e7086749e966e7187c249ccb9329fd3b8b +public_key = d800414fe5b14dfca90fa6bb7e350684c3b08656374d54776c312a645987b9c80b28933550922990e2cc4064114ee12f93d3000164c333bc77d566cd91c904965367b2350b87a6b0b5aa7f8a746ffd4576d22083f23c0f3efc4d09ccb86dc4caa55365a8a406add3cba2127ece221c9139c6c273bd4d3b1bc1ec0626b35db44230662cc44af683c92176c5171337746f0f4900b7369df2b705b6387670b411e26288b8680f9cbb0a8ee01c9d0a9e4c61a19f1cba55459b78602dc14ba52a0b9de9da0cbf330d3e71625228a6a9e471d70639b05792cb8550b24ac159c5b069c30740d09065c9280bf2b4f86c1cd9b78357383b2bcc4e771661f4cb75c6589db317058e428398ea7bb88450f22525813058c609bf5b02a3098a619101c092f87aad3881eef6a2ea91a49dd3cdf1ca6952205e74f68ad5c06fc04163a70c0972c4ad752acfcfd5529b75328548c18748026bd7965f73076d4bb8f84159756c879a5919fa7286e0dc39f1884587ba5e124177eacb2a3e96410a64c2d5403ccb939e428b1e7149ca2b3368c11c8e1f38082ab06f39455d55d12e95c585f0098fe6dc44bbc97c1547600d79b193fa838e42cef6bab08d462faf017ee8414c9914316297cd56889207e13e71e544c6793b751174c5bb22294800785bb003589a899a562c6252ea679779522c03a0b933b07f29194c75b29693e27ddc6c4757cac5b9219d98137516c450884c374cfa8572f3b9e27cc706b205c398866df7972b8a44b7f975cffc3401212bda14c0bb9a50a5e5954f9534ee90c0f1f2328c618be5c2166be064d5d0a04392183fc5b3bde635992998b68b8c7bd7a0a1c3bc99975aab55aa39cc0e1d4c019ef73a53485349b58f4271aa29a4c8f8e97935981a83426b3bd0b5edd1cc10458579450ed4d065a93aa0fa734f3206718974ca6ef35191c930ef67819f535ea5e80e54659b1aec30534442e03cb9c4673679cc1cb205264ea53d20e383d98c08bff78447c3335a4c3bd6f0794ba019e1eb130faac0d2f4193a6476cf014ddc988e757b66ac5c95bb7767e6c32ea8027b5e5a00e62c582ebc4ae6738b9637355f62a053737014c475fa24b144b2b47eec97dab92f58bbaccb0c36670ccc9326287fea9fe7dc6a2ecc896652c9606943ca1a6e8688a821b69e33412025e26442aa2f70a68011f8be62db6e6283b9b85651fb8883acaa20885807237a51cec50cdd007b27c121feca8a2c026d82359de6d8b548d9a49a9914ce76584338bfc8f2cb51466414548cef544b82abcd277a6602887e4edc5e09a20b1ff343541c7ff3d4c0641109ed04cbdad8c2ee80ccc3723a3609454b733aec068fe6d28772e388255a87710ab88848722ccb2c3aba63ad04566b1ba4fdb2a2c07cc42c32b18e7280348c245e29ba51b10d4ae840b8f9858dfc68a73215ddd58df30729d2966d11d4a5b20a6d441071bd5083fbc050232b7e594b11c60a5f7ea438e015018d145b979428a899bb53a42a96e081f7da939cd0ca49dc3ee11b0dddf94430014ce96485bde669f214a3d4a88c6e4b3ffed1ab4dbc24c08224e03c47fa2a7d55997c2491717297155e1b1ca09898447ac0153435444c69b3b704d5b99189e346bfad6143bdd2780d2219878823ecff9df861e3a729f913ece36b46c0e9 +result: pass +ciphertext: 82be6534bbddcc94faf44142c820a882b94880f5264e2cf8f046d36cd8968f090fb2353773f09d560bd169849c2d56729e90b2e96f41bb2dbce40562b1141cfeb35b71f5db5f933ee12dafa086e3125e2e5bf00dd7e59a8438013dda8cc40329f8c3627a609a70d6b58a6a6a157ffcaa326d4a19d7b6b8e7db9f19fba79bbb38a2c645b369fc68450ae6c5f4acd529c248398cddd373824a5087b66ddceb5ee231dbb5950ae431fde9d15020960239c4a526da313ffb447bafc9cb5de05f090001f08bab33f8ea68826e8c057732a95d1ede21a1488e15939a05cf250e577452ddaa73dc4bc86d5394ca0ffaad331300d7d21e506bd3b430ad66db163ce5e2079be92ef4d369890ac192578a01fb1091ef7f26941832e424e114ced5598bdc6eedd0c7c0975079d86b781e8de0cac12929b38658189f53a72e66bd4105a5f7f55f7b31fca748598a230dfa86692b0afc55dc0be8160a8ff477a331cf19b03d1819e87f0b7d4bcbb973c43a3fd7378ecd65c9293a758e079e5fb073cb8ec24324e6a45d81e42cb002bed6590085736f30a3e07f7f857ed32fcdd33f0f93c0c22c78f2bffd1c4d3927d694dd0c7e3788953d1fe41c46ae574f22d14f974a7a4f7db391547b74824cf71fc3a34cb782163b46ee505208ab592ea804403dd5ff8d4b15b772e8aaaa132c1f8993788f07809f86036154e27d70adf575a6e7fd962df249fe5d1838b95e5e9484b8b2c80119ff5fe22685bbb6886e23ab3399dcbfc657773f7d7ce2c81b28c2ee7cf5b7465ba0ca6b3e66306e2bbf5ce75c3bcbecf6f520956c2be1412c4113cd9b3696e64978fccaaafe00492168ab764acaf64ce97bcdcd5fbfb234653a349790ec382f2a504fd67472aacdb5c53b20e24084673a8afa896233982de45f191b32d1e1e0bf7b8c41367d26b439c5c868bd4a179de485748900922c4c9d19455a7c9c7b9d3b67dcd6462b30d307d9fef1a20aaeef1b823038d8f39a83ddd30872da9d7a5980728f2b3bd39eaf1cf2a901c3844dd5a217c64c8cc5b489aeb95520057bb78de40578c86cfc1e051ce2da843942aade897468d65ecfe6c4cb88afdc148166d6b1a9a182b3c2fa4e50ea9e048a78cf1a432b812891cfb367763abf7037a5d06050eac00528967d7fe4c3f1bfec7e6c1b4690b2e7059d20bb8459e27db1b41a972c15f2f9e9a43bb751e8214e72c710011d3d0cb44c79981a0a6ed11d766b4bf071289c65e6234cba1f701697c71317833a772c520e99ca5d6ffcf9d09fc603d22390d6d73e42ce59f95d50dac5d81827b1d58a12daada7487052a0bcb848b8f90ad40141f8a05122fa7b9aef5f792c032c5229e53b3ec9e3ca04b24b02db5398cb9bc0214cfa715f192da527562fc521d483fd4ff440b1a0563135085c8911dfbe26258f4568fbb8117802dc120f9fb973ac309b5d1a1d0e159441af9e477943d331321eadb6a353492db5ba478a92055ccd69dd686b14797c51e6adc3470e62aa1369bcc8c8cbdf932af93e80eda2b2c96c +shared_secret: 6a302778f406082fa285c5ee299d78b048e837c5012f42f9a80e8659b10defda + +# Official test vector 90, seed: "d26ce360d399bf7b89dc364aa7ac06bb513eab8f527383e93e30727edc3f22c262aa0ec70257b39edff0630dcdc1b79a" +entropy: 7db6d1a129d6123f1f805b79ad3b413012ea86aed42a05e98e7b1f32f9fbbdec +public_key = 0e4c3b97c9c7bfd505e2aa01b3cbcda4096b37aac72b5b50a41aa8f6cc518181b70fd3270561bed0938d964972be491b6331a148317cd548124b7653f1709af074b1fe4424df4bb22ac91bff7c04489526e5e2c82f2973408c4828368b87a7c14a569ed7b58f8eb6cca19088c15031fadc0e5b37c442543e1eb944ea4a0541248496795bfdd56178c188f3642fc0580e70a62676555f6b3810dbc89b0a227a8ae554ddab721c954db21a87fda98477d0c2af2820b4691ffb046ad544b3d3919dce8303e2f27152170a182a756b981e6cbc0b0f00274b521c1782b0516743d17a7d7b4b29f8dab31c50739f68c57efc48ff5b1d3757cd13fb8249abbfc7b5a794e11e5b56b9f20c8e8a5718184167264bae901b3ae5005f796341897542c70545a9b6b260bc13cfe536416a0f5e8440907a4fa1e79a292ba20a461285584d3a2993f2bba8397756e1ac5050541806207fb8b313d0a6280b473c59abc9964b5dae58c6860337eb69396a24aa990349c62aaf8420b49e8a95af404b81870b3c9459acb62749e4ae2cd518e329776a6b68e33a7ac795330a8c1ddf2b326c3c269303bfdc9137ecfc9eda856148ab9dd0a920cac260e6b70a1b500d80d085fb9b91593254372c8e13b69b0d691a508a391b04478729ca19d75b566b472917614a53ca485c44e5600793a41a180697f20aca35501e7215a49f591d376a2dfe4a3e0bbcbf4652710d0ba75898ccee4c5b63514752ca8778f09d737337c9219f4b51a1277964c9e67b92888300cda37c382700a40fc185ab8fec55aa539cf115913c9c73af0819188965e57b326f6615682915363c54a267c27d625cfab0712138703cf709bc5c6b0cbb1d5d3884011c1b8ad8cbd1ba12bfdb8a80e9cfd1526d940233254b5dbc2bb17495b6466c0ebe684fbf331cbd99981a4362fd318b28015d9f3c3f1da328917cb140a0567b4782ec8bb1fe31b298b6533c39733304b5f7c74206cc688c144a23cc72aa491e48701cd7f14fb3b7767a679ba4f4c4e1b778019471bd78bf6b55c2eaf43351f85190b07a66c35ddfa67dadd28c30c5264e3c3ee88b62d2c12541d1595a519897a99bbee0207867af34b245b00185a60b4a9cb92eaee58b16f2977ceb180b32243839487ed6b88f6b94d2d4686ec7b7ea022e6d995c398896cd9876815a27ec77188640a4a4e64b65436440fac565caa10eba9d48824541a6165d0bb97a634e6715abeab2bd8f91c18a3a6e899738188744cb6b817d21cf092b64e68cb6c9747d3cc34d0d294b4770548d61cf53bac839b70f0350994ada273312545462bca9118848a343f2aacddb2207f84a66b08958576069c7b7b69c02cf4f954ce3252faaa0b7bffa5952c51fbccc7fce3b6a0c8074f72519930395d967603d327fb8231c1811712308b914a75539128a658a2eec38cb7081926e94a2903471b79b33adf94456fa6a09438dba6103062c1f5a5c66a8d15b829c8f01e7c1e21b10bed1aac6d142ea94334660bbf448511563b5564acd67f87a26f779527000584b61a65293cbd85ab5f3362bb96a61c922ffa77b8d90acba77869293a03d7cab81b688306546ac348b22e368b8d717bc969ed83a12000548310a929e9738b2448d1cd7d1cab551ae0e7b1c495565ee65f180aca4a38847375abe6c +result: pass +ciphertext: 4c52cf2dce0479dd88f84c76afec867839243ca88c7e240185f1ab343f83a681f936359ffa2d7aa1231b30fa056f9d91e9e50ae7227207c481088cdd7f458d8211f192abddb839c74e6c0ebe22f62eec0a0b85e1e63b631f2e2356c7e549b8c9ef20c970b87169643bff25ebf27344af28808cd2a57c3ba4cc82a6d1f451e8030701de5aa0d0f11dfd9c69396ae6473953826f64ad592a959daf9513081c8059e93f40a24d007237b9f7dc7b423c2d3ec49cddc93b9d10be852d9d8e73df902961c6db0bb884e716b1688fab808f9af1f5d0071d3989340abc9f1c14b7ef8d3728e639ffa7731a5bfcb42d59cae23baa3ff1d95fb65817228393b4b9fde583fb73f464bd39ad825ac28685ed830e5bb2da33784b0bb3e6f310c9ca104da7a1282ea1a08eaf4bff5d6396fb589207a7093b29b310bde1e7e83365208539f4d631f59cc9dfbee095623a0793df4c7036cda1991504d4cea2a7d298adcc4e39f5e6a3519d162da9235d5ddf2962c422725836f59eab03421ca7e7aa4b715fbcf72ddad147cb517f01fdc0998d91562a2771b13809de62031a5972fffe4694774d60979ab51332e8bf3866b15d0268867e497f71d661346cc299d220abe1292eafc72e47e113180afa470a683d6d86cac6880f1f59a84ee590c58c8826a67066d8ac772f86c5094980767cdf8c1296b189c391d64c5682b1dc368f4c2e0d88a6adb43d3340c8d8e9ea1a34d4f4792544166406fd27a0f60038c242173c924f13699fa73be3c0fcb97215503e1a28ae548619684f66a15af654c0d38c9cb34c1c77f1f79581aef0718c6fcb92e04e4d28de7f83cb90ca1a80aa2cf84467b1b7752281b714aff8647539416083dd08b6d13396041f5176a27d7d91e2860fa87fa3b7c4293016c2640a98b3f08891fddddfcd130697c849d3fba3a1e31d11ca6fb5b68b12fd3a5b561d5416ac7a2289e3fe464e7cf0f30ea7f227505ff6ec6f1713a72dd195280c7305ec3469f9c55f4877a9f49c35505779fa1247b5f02da439ec8fc6ac3aff099dbe38e4d9681f65e39c43c29518be931add5086efdb009c74655f3e8525049a6ebe6ed70f85848a4962246a62a45580d3c315c5cf91794d48139874e63ba4116c27be153e0dca53abd22eb653e47c0358aafc19d466e5337d1ab2fe6ae1fd9ff85d6af44f5f8e09ed987c10cef5184cdfed10f16a30c8b34d0c9bd8d69df3d45b30432f578bc40850f12d88d21970dfd20adc0761bb8a37b2a0b9df20e14421311d0489fbbec1f8cc88b08872ab3e129c609aabd2e7d56f6467a176825612dcc9ff1926a28f5eb71174440206f74c219dc27604754f1db7363bce80cb6fef31ecc2f4e5668eaf745317397987dc34705ccd5086a8e64b83e9d4b3c1eaa85074c3c40a6b6fd48a25709846564d4863bf5f416669f1be2e92565e7c76451fd9f31eb81ecf9d57faf8b8b63027c7e7da8b0d140a07beb6e5fcd49a91a0908c33cc3016b165eb9388130426880df40b0a579d5cc63f6bf4b775e9368aea +shared_secret: 88a46d35cf07e48c6528b95016aa0c414344e090ee897fd80f26b67bc0451c7f + +# Official test vector 91, seed: "c5856298c3cb6ac9787a0f30938537ab2635b96f6d19cc9522063360e7a5c88e644929d2879180e3e5bcad2422b7cfc3" +entropy: 1d129b27be7384c359d04311fe5c44917d1fde4bfb57314f483ac617edd5ac49 +public_key = 91f33ddda5b9ed269034b722cfccceae14aacaa81038e45b53518216ca5c332bbe3117beb9ca69287a19dc7a078b412baae7cc5181a389b121bc4ac5d0ca67a97248d8f97d7526063cd88219c396ea11435e5c1d61dccc963444b35c99c86b87e40928b88c47f64b919a028ee601229e5a01bbe17b600acb7449a291b131543709a2b8a7d015419726563e366324588038e71fc3714ccd0a68fde524932496be0ba7adfb6e15dbb99f995419c8af3db630e22393bebb25819159abc78c435342628cab40a6350a8a86d1b1a93f6c9151f1895c4674cbf76313b1992d82c6db218339292622807557f458ce057ec1969578379b75d1bf518976b9c69dc22008371930f06b4d1d2465139bc0a62c1d13db9282c00549c45cb351518df67ca3ac881501c3272b9c6ea1a7c527b0ce8ab9124257484b341b2200b49029e2624eb37b15e7d5823a3ca608f09a5fc590dd14cd2cb15cd238735d25bab119b06026884ae5176bdccbab3550fed9b8d4a473a3d0a47a5c78b7b16b880911c7015a7ec281e3ea03274c6199b345db21c0b0c541962a965fba799840c01409463d138977d9bf8ee8bb3ee3b80e021ece71ca0c6ca72f614706e0941b60c3c8c263ad8187a5d70e98740a0a729a0d07123c5b95d553cb1fd086d853869b68b44db974f5161072d6b1f2a18c5f112376c434b9e777a597b6304aa0d1dc3d2f00010e481b9a9aa60e0acb9394cd554a047a6262e4b32191e875e1688456a1877012933ffa51adf131cbd47c28535595e7bc0777b954e094d6d62a5f67bd8b674abd34500da1a4c94bcac04746c4234314e16c1320c48d714481a43c486c96d183b3ea54b19ac54e971710a293121181a16f5bcd861835c78357ea4a6e8b9b785c085545c85a36b3963288851a15abac8a39a109d0d092ac3ec60a93077486d7920a6c274e91b4f04a7e90d724d1e47f65a9cc80f806b20c98d9867a705472738982f3c608f61095548552cc01cbdf10c34f10709a31aa47a27807c74b9533523912637b1a89d8383945dc9553e9911f4b012d6c397f74c250a70d43db4aa7da34df3c9490109fe7b1561cc25f0f37907fa567dde3ae9da24d425a7fdf35b2e61241400783bc2ba3b6098d6180b25194912175548453a669650e9007be369a2181e1a46763170fc995770627b6e48903f574f06037d580ccc1649ef6eb1d8be40392b86377532fe5b55bcd7177cd817701b4700b71a498359bcaca6393710105108c6c33894a41bd1e4a659b22c76c58c0d2f9648b8908397b2d30e9a4ea60c820aa12a58c3aac757ba835483f02ae08f7c9ad8b593d756a33835759f7024867b5d98477eb6cabc4b7397ff52c6719cf73d42f00a4b362073325d48651c2088fea27d540884851cf95f1a85626642f825265411f8b25067d98b5f595482d767b1c291a9e35100e49af47a71caf2214b592831d1024f56818997bcf035b1ce53c5213aa664e2226e83c50594354aa7974d39b09860b3560a534db624b9a595baf31bfc40978cb2903bb549eda3445241620006371b0f7a410e16c828c6743846ab3644413c8c995a4527f82460e112dae7a0d0a963b87e38a66e07290789200d6018cc7c454ba7bd5e56d7ce2d10ffa73f2a284bd579dd64e4229a9f36e58fcd24287c47316b08f +result: pass +ciphertext: c108c9fe8da93854f9c97333667b60ac6d357747fdc46551636f9715885306d4e0ba5a53950042e82e2449d8f871c0e69fc5fb2dd0890c09e4bcd73800728fe9f3aaa7c15a7bff2197f3d9798f8c7a9308ee9b558c6698bb852d5bcad36ef859e9f20eebf91e4eba3ba96f35a3e15bcf45466b0a0c951c49b0191ec48cbf0dfb06c07cbec041a09f93e98ac30e40757531cc7eb29725b472e4ae51d4dfedc5b782a2bf0ae88db1f6a7367bf0fe7aeab49775ae121d1f568d3a69fda9f3192e6cfe5de967d884247040a6520902d2e1b0ae32f388f4d9235510b3df3b3f3b8fe69b4917bc1990a45fd6d8d8e5bf2cec3fdb9e23dfdd4248c026b73b2907378452223a10d8bbfce7d557a40da8b4b444f189e2895dbe530493b582f004ca49e1a5b103ddf607cd25a0e20d24cd72596349c7dbb9547cfb14f0ea75af088563ac29f2cf3c358cc5c2044fb22659950fd36c4a5d1cfe534e68949781c256a2d912a739c94378339823b039273c06719f9542d293bea4e2e2a69c5de60d55882c969439da1a1ef4403b4af0068e1971c9669a88003d6b7ed3f74228f0434156f05d7cb3b82470381d0c9cb5dc05c978c214cd9e8f7654ec16e4898aa61f3a56346d697ac3d04ad0c7bcbbc97e6e86b687370bc81fc843e329d2dbe7a3f370042893521117a270d635b816c2e4d651eabd4d8b7b3b64f27c0f04e650ac334904064730b24c4796f76008847d686c46a667c2d08a52641358ce681810cb801fb76572ae3034547185bfd449f7dcf9ed2214570a30726697df678cca570a4b137e442388494011c990e3b0efff39d4983abb2d510f0907913c62df29eecc5fff802e80f7d2314e6adf01f74b265a257d829e0b114adcf5c968540949af35dcf9e8b39d8f0a70480e0c90b5dba2a6dda831f856e7178929bc54e632e323d87815639b17cc608a269a37f8a0101fde51a04dc0fedb4da16470f9ddb9139454b5cecdacd9f5d1a2c693f72282113c5f20d397d0538dd4938c17badd0cf0655fc373bcdf75a140746b38ae9e006a7dd80209ad50cd7b84921e85385f8b863492c35bb7048e3c260a45daba6fc44a901880e8ee91533bb0931a48c029d773a463fc07f6d30d022d753b149a4dc0ea32089d100b57c8abd1e6f98de0e8d447128637f21c0912f6cb12a47c7224442d835219de4f466d0cd65ee82fa1e10b84b0b372a307b72d3de3f46df0a209486b83679902ec621d2ad4a81a0b2297f70c88c882e0666ffcff459b87966dd55a1dc148648e619ddef49947690745c7794445a2b8b0199d61469eec9c3fd23232cf0b792d52d2a0c0c54ea11c29392b13a7c69744d85aa2245592adc717dd1016a64e9df28864f267ab770e32aa66b3ef4d8c00903c2bd10d1287e3f4696c09b6e3be2f513d736cb2950935a2ac517eb5cf229aa6914b1cc360658d9e7bfe1bc2aa49ff36a26d05fcea924b8fefc64541aa3da90ca5e2828ebe8f9b4ed2f94b2885af83aaa73641f9201325d88f9e2a2076b87f532693fb40a2 +shared_secret: f3c5586476f4814a2d3728a6f0ceed7d19d076b790d3675e48611c4b8df9702e + +# Official test vector 92, seed: "a28ead0a08e7228aeff602b16a1e752278b8ed1e91dac67994f5adc372e1d82f95cc390cd97ab9212275e0566c833fd8" +entropy: bbc773ebd2df42c36ae05952d6a64c63a5dfb82ceb3ef4f8d4df3a30ec8c0467 +public_key = 2ecb47bc7c78372b75de587297848724335f44545a35fa11e6e1208ed4764fb8bd4af9712e21c8b3c99e5a04432ec7c0b3200384534aae227c6400883ac21ec5152380b458bb69c5ce909842d3b07ef2c539c44a2df2013aa97a08b511e444996144cff78ca394b5440f4aba566383b0375edb2544a42c4df25b6a96e0263c8962bf9b716bdcaab098b41f735018735d8a26ad7d93b0f17452bb64180a572f75091af0ba9b3499a134e90a167ba72dda62cfdc27e3234b1412115ad0463da2600dec2e7010b1fc914f3772c858c80608244cc014a31036a9abb68946b51354d07fb914bf22e17ea21854ab778b67b40cef331cf8374594385c28586dcfd5421d1a008634b006965f88d58a5cb449f52136d7f82cfd0aca3b6355117b15cb51240c6a239ba26380c55abe19912be90466cb701d4bbcc5e138c525bf28d23cb2e0452927873c17c7e431051f99a6f585b89facbf71f594b49ba84c7235978aaa2baa1f9e7496509009acf56c5d09a4c53b1cf2845a0d0555528c8c1d287ce7e0aa56e85adadb89440305eb942b1fda247457751fc1b5b8811fdaa95592a047e297b9418c52f0189ae8a21254f838deb89360292956749007ca73581aa79f37116533068d2425d5ecba7447b7cc5729d987564ee3cb2ccabb6c31ba24375304a70638533c67bc6e53c51b17559133d4aca5a6bf44c635615a9881e25e4d137393b76b5017254970b56ed13f7aea587458a43b3435bb018ff6082661da9fec065c0ec23bff1b919633806a835139da4c4d34c6f4567daf07536eec3d4d0347f3abbd7f32317c33c2660393af455c2dc506ca111f48da051d8350edf5590adaae9731c2e301a824721718968ce3e66be430b8db293a22859d68b353dd45467c85ab7f4baa0d5b2cdb83c94a895a58e09e9f249153f25fc6d3c7ef50b1929b197128a64de27c48041e08c26d64b8c229cb24f9e9667aea2a33531d19dcb6ada725eee88f063cbc749c2e90f989c8f0c7cf6bcda814bb2b321f1862b32cb8294e99c78ba21d86a402a1c8c3e7f9a11f09306e588fd1856b7f5c5eaa768dd72793a3a88d35e931de0bbe0bbb697010b2c75c3308649c1260648bd3a6d6e57c56e00d5de7270d2c26572aac88e08238658332879d5ffa005f7c8db415403ae73ae728a5f3bb228a326b05bb26a0c91544d98db8cc687c597ae2e6b142b101e9731ac8c20c7eca11887b7fc8886c304a162b30cbc510ce54ea5324dc9b82f39b0d971dfa69b81ad99d49bca9e3449774985f5051a7eeaabdbd33857741c11adb51744539b1095c1b32cc99f81a0ccc6dc88ba829b11025ca5dd3353639fb8148088763ec9e7c14370766b918e93d8839a8b0a34d3090933df3a86e3976d09776a0ec3229741b2155b6c7ac5431421c7b80812523155c9cc5d890268661501628231c1c660583829e7b3984bcc8ad20632c16993673818f7ba15a5064aa42cdb9f7b0e0708328213388b06a04d559fcd83a10913c15167363f997f62b6a03614c46b9acd703be1a1b641e7910ea273022168352c89cd7616d7746983b3b51d57770196a68a50125f1634faba0c752826ce0aa6448c86fa76c6a3e2390840b0c7f333650c53e0a998b66b533746765316f08a94e18de52516228102ff16993ac61abd8d7884c +result: pass +ciphertext: c408d3795c6f0f7a0988a41adc92be1b7b2c00660a14247df3bac9b4e8ca4090466f23a9189e7f0b5bf4a012409c5c12af873a3a847d7bd5acb26ee7269c348e6aa5ef8b573a9ca82b374a00beaadb827761008fc179f7562b775e3f4bc0d77177160ada66ecba30883ef41607a8268898ba1035ec901c7e1d33e55f68db91dfb45b7854ad2fb55cd05e0c72c425893b683fff38bc36278682beebe5953aac7551a6a70d0a0294e393c1616b7f2f63977f7bc4000664faa398b37d343683a8427938e89485daf409e5ef668705dfe003771075a9cee8ef0c28bbbc2d76c342c3dba1631acc1bff3bc9491ec686a68fd17ad432cf1f968ff3d83292a6ffdff0ce18750ba7014d0a8696f2e486367ce8fcd3cbb56eabdf699a966a156706f26c13c63a4941aecedb8c51045157a983e2dfd02085a3577cde0625da2350adad889a8d295d3a06d39cd42f42ee9f1b526595c13aa40f7e7407b0331a61e7f8c6fe070ddb7ceeac934a78d7df2715f5d6830fa5a68b84e089aef3a706cf8e47bf78d928759081fca7f59ede7b3b4a1d2f0e7dd4fe5c1e613c51f1dd25a282038d5d14d5a59efddfe980a9841bf7c8a2a7457c25805d93acad001cfb3a9cb0e6741045960f2d318e4a2da3c0f3440f4c43cf5af31d5fc80fb6f9a4b2b510a35d43ccb99ca15e20fdd7ec741b26111bfdcdd6a4dd12b2f2a63091d10ebd5d56e858111dab4f3c233f8425e749afebf296015fb2640fa42d559d90e697cc0bef441e0086ac411fd18c03008b25cdd4650b59f082f1ea6e38e3edfdd1cc848c0e80afdb8bf28e7ad7c9599b085456f01998a048b474499690e4258882ba276898a2ea93e1e68e7b8f4540eae2790e71e114e11c33ee917288b5eb8cc5b1f73b488916cbe2c504c24226b973dcc4676c8ffa422247067c8ad5e47ef8c3e8637619c94f6661d6111652fce115a2c9aaae625226522a81978905b98c659ba830e3efa0786be0166b6cf6d84707e29febd0c57447df8117d3b549d55127b22fea805740ce98268388057573a91600e7ff40061f3b0ec285d0ed684a8cf703014ba54238b28b07b539d63d8320a92eebf9f97b42b0330ae498456f507ceb200a953fb8f5cdc36bb3cd8cdf52ebb955269300642442e3a7aab1fffd31f85148de8f3b01ec857c7e10cfc336e8f5abe8f0e2e3442195c1406614910216225a53d8dc28d7199bc95265503a75341e6ad2ea37488a71c6c893f65b9265cac3d6f47ec3e49785a5f3f9a52e02af1fd7fb14e635bd9c3246adffdb7910420c9d91aa882dc700f47e575ce71c9d155262c123b529a2e1b87afcc8b5444f180e0ab6e0e272667a224f3d59f9809cd7a894e30012fe4b697836c478f8222fdccd3755828ef032906f0f0c03a463fb9101640c7ad2fc8eb4fa1112c7065b038732516626869e8124685bfe4e6fbe0bcaf6451f932d700c86498738fc43a1f5d71952caba8639cca30dadaec99c69e36e13a4935fcf13531f9f3095f06d877e9798c65fdc2b2f24ad08b1149d +shared_secret: a828fc1446ff04a950e4f551e442aeba279f44de0ec5296fd981bcbe6ee90d8e + +# Official test vector 93, seed: "92877d706daf88ef3412eb143db8cd91bc047a9a43b7acdaa42523560dee4c172697be4332042fcab91135839bf74ab2" +entropy: 5b17a6adad541efcbf5ae4b0c0452cd2ce32e4f0f8701801c5b63e197c1fcbf4 +public_key = 7a6917006162efa4cfbd499b8c853e102c9639457f66812d58383e629a7522f1c683d48d8a216a0aa82454f29732077f4baa593de951857227b976a35a8013a622afe355144b63bbbe58265287cf6d605421e73e7df7301b59a885821ec0314ee76359d9d715eec1c2ae726fc0592ee01c1d45d6c94c76cff66bb3bc321358e33f16e1ad44b35e256bac5ab519e404c3cba647637537a524849cf952deda7940dc1c3a213d8c13580ebc10e2b458873ba5cb30c00d855530b0b5f86003a2c6641a72170b238feddb624f9660e16a9c545a0fe8102612979552f311a9417fcc8c8768280a4902a8ae696131c76338097f0c3a2f8731ca25d55a21b619d1c48550371cb2cac00e27c8ab9c8d7bb944e4bab625eb1bf7c55f0df84ce67c48fbb4438eabc818cc2871c619222a0c504c6898c31b9e859998911f4a29000e4063cc0a5d13975182c97047520a3fd7430117b5d0b2b088741690b5662a3b02978c5a2f1c330871957c5c73bb5a2fdeb0b5f3e5953b509b2887435b41badd607307941aad1cade20c4a22b80683b80dfff1bf82a4ae80eb0915190197c1ae23145522c86f86955d0d3b7b4b83b019123674aaac2b4138e4b36169b1784a4bbac8570aba1acb13ac0ab84a6bf987a23ec91f7c6c2dcd6b952c505515b4b4b1e7c749e693ef4a7dcdf8b7e2f89168991c0385829e46c7faea3c7fb18ebbdb333a4a16676aa81daa4ab519638807bc977729d4474f4c068897e77abe636df8525c35e7c691b49c72e50bbd8570d6b888041380a6a4b9a65868f247141ee137ba422807a57a9389cc195345968086359b36e5316c594a88959b7b006abb88d754bed942230b36945a141d4810050834caa24cf58747820a6aacdab186bba056bbc043da570f874eedd29718795ee19c9e8fd4378fa8a42ba6812dc51874cb0285420419d408e897a7f8fb9ad0238ec632674440b66e838fafd731b50092324a9b11a545bb9a9d7a242d54c6bf897a080ac0b06b57535e542d254ac581450d82d73ef779865708a2563c86e4cb3133cc5fc2e16dd2b043449a73e59a5c6a29a227a469ce406192ba4825e3503f3552f743bc3dcb945048a95c70209bf5c5efc76227ec7d947a19dfa0af12b078bc588c1cf9c1300961c59ca8529c357b9087b572a8bd2739a7a526f3d874e6e2a23c4242bdc652569c7ed3546e3e85b7865611c2cb7ad551142b2503e14c0fb8220755036f6bf95de3f1440598076db3410a4ac1e52c91f038956731622df255646ca02fe7cf1aac75d972a5d744512b4b498c666ca68660b984bbe6a1833e83caafb80e17ea49c484ae2b6475d2e276e0c9317c47090dc9bc134b606a6a1336a40881d76ebfa954dc550cac192082e1aa81f9a6d9162b038a021e09b28bd0b959884acc836a4a95100fc93071dc474e593a1d7ca409001b6c40c3fb13a5b6640a32da0b6db086f1691614d935c29b67d8d54732948dfa27296a63607c17973b764b9c05713bf0026bc0534b9187fe33690826a6c80014b2f97312d53b3b22aa1740b0a47ca8807145eae577c994b1dfeb19109b5b99019329fb6adae267c2759fdae64cf479462c4185ca67255971aace8351a94501d772b15890042363b3bb64b6373e44c5bf6ae2caed5dfc3e0f0dca2015579e6c636683 +result: pass +ciphertext: 71f6bf72cb74390f988cc6a864a48242cee917f394d5b4da241299a2fab54da05f57393596e88605dfd86167372a80e04af7623b1ef0b07b0c0c9ae8d58389b27acc0bad8e741f2d8862229dd0f90dc927564203ac4627fde6a32d5c6ca4987caab90b659e6bdeba2b4b8de3a53b7599dcc8d8910c8cb5607a9cedaf72f5bee023ee24406e1f56c4a8aefa3be2d3abf378bed42d772a85d3ccad0b698ac6abdb856449acc3838737a5a09ae662c5a4d58c4ef6cfb1fc6fbc5b189751cb003eb8d41873f04ccddf3ff5b01c77e6700d859053d1f920d44a83f42b7982cfdea3d9a6a8c481f92360c8ff14636e55cd76896eca6a38f2944f6a24dcbf55a0aff14185ebf4d8ec0c24decb27450f6253920e112565c43ec742e942cf9d6087e311cfdad256ec27f22e6a246dc6be2c245670971d8cfa3537d6cae449fb07715f26562cd52c5d50ba4a2cda9c5f967a5e9dd72a115b9f096eeac949bf8eb3a331701652924266e8a6d6dbd93a8705a4d466a814da93c682e971c7ce8ae48f149ef51385d3f9521263a3f39fc33dfb3185d34f4019dd23456972296a82b6366b77820affbe68133f6b68dcde6a35f5787fb5636bd4babdf0dc8a590b93f90f91b52324fcbb9a529911cb31f892d2c81d3c735840032ec4e8c2893aea590fce1c9c6cf3ff5206863bc76a3153c1b49f6fcfffa467cb8eef2a98c115fe2a19c01ed361bba1417fc253ee07e7cdf7a6bd09eee099968e474dbc314685464202b3e8d4ebf6570ab30191ef3bc737544f927d6e1a1e4fea26f22845312c2f5bfdc8131572977c16655f30c4d257227ddd7c1006375827368bad4872ed2fd95249c6673ae8c6efdade12507d5d8fe278b65b8c9d0369f01ecc6cc6d8954b0ea19c1721ba535ed605c3777f1ca62467d163d832c4155f81748ceb1c501c42125d918ddab71d4bf5e94b3215f6fea85ae232528c6e5caa8ef8ad250930031bd62135f66e33861ff62571b16e51e1307ffec33062ee4c649c659bd0676e87857f015f9dca2989f4a30fa1ce540392ce96467063080d1667298406a0b1cdef7db896bb2a6ac9c07c435d25d019a3ab17021ab4cf2ba7eb03ebf33e00231abd2655bb69070d6bb6535dbefd40bc299fcc9b45c35780a6b929ac6016e61856f13d6f8afbebbf9fe70afaae59eb6549ec30c1b0db0abc7a88e1b917b123a1faa6a8ad5cce873e20a0c2bda1fd417e49b2afdd512a2bba0db0faae498227727564053f9bc7e89a40d04551c89abb48fdb723643a5dc191070fff978db5526064405f28e74f9769e531064eefb370edd18cc54e2c51505fa2a670358b074c618447c53a990d3b4bf4ec893d6e35f19bdc70fcc2e4a881772cf0cbde217b80bdfe495454ebfa204ddbe82d1d92e612db1a9b994145feb30f7c3a6241a0dd001fc8ff0ef025464925b0ac26df6356a95558eb5927a8d8f360eaf2d140ad74069a0a53aa9c3e4b54b5cb51c939e299567091a8334f19a6104439c96498f06c057f3bdb4a83880ea8d77fe254 +shared_secret: d98b18f7b6717b8f6b3e331d6d8f9d3633eb70f54133a78e2345138420edf89d + +# Official test vector 94, seed: "bb4c0082ca4044b1ff60b036c9b0e0495d58667156786c530bc69d949a13bfaff53798e456423d7a0e162a60039367d7" +entropy: 61ab87659525de9656af41246f20e1dbe85c24e335e7ecf9493f46168bc14e94 +public_key = 4860867e75349ba9999fe4be93262a08f868abb10652b51bd1c67c266156eda768e30b0c82f910eb96062177a882435c74353dda7279f2141d23a6440b900a8a476c66993477b999e23b40ede83b1e31781b4303e4bc5e0220cb0a6409c88aa8238b83d78792c5632751fb0d5246ca42fc89ce31a64069560bb87360bc2696e78062600f24db78ab630079a64c87900d4b7c9ef9201822b6bdbc69c6be718c3b2792ea32756e1a465325a763dba22861a423e65458272e77400375aab4dbf30d564a176613c264631d33f37cea0346e71649d1314862bb0d2b05711cf1af088a4c619048a7242d0be6a8b536c41a9368b22288ecd0ac7298335e5c91db419c2126a8df45b2e6d8793da63fc7e94d75d3bca2aa58f5b5bee0b43a462a12c34b93f68952b6e7abd89c97c293b0693192a44c0d4e69245e14983e87aa26da8c63517f58d66ae1610936e6a89dca87b6c70c1a78c66743b89b3c2eb854067ad97d74771f77b0906a9a7e78640de75a7b8273851dc55dece9b1941cca76cb2dac265e487585780928dfe7402710b6bd914d564568d3d4075e4141749990c40214ea51b71f855deb9349dae2108843b5cd9815f1e8458c020fadc1c65796b117f8b9851776e896891dc05aa0095a914457016172a17624a608cd49db55a42bcea68778a26a910eb566a2d942da58a4cea53ea7a67954b085eaf642405b1674309b68cb9bc3c04d67505d861a605bd6163f7cb49fb8cdcd40917bd59b94892459fa7ea64a4872f51b97e66e64f02818520164e20d5f952a3266840b4575fdb7625d07d00486bd433447d5e1abfa65b215e034aca74670d4b7ff61c36ac2a1628a20d79b352d1c82c1626233ba527967302131bc1ca837d9eb4238404a20a515fe98a9e6d9b34ec28f0b252263fc2bffaba508a6375aba51b4a36af23740d2d51705b2a1083b23bf5a6b75a214dfcba5eabb82faf49e4d326d369cab0f74c00bd54310a3620d570eee533a1a89a51a418a3cd14b25244f0c66c8e8e454e358364fab5997170a90a25f3816aa1b272b09e54435ab3096e8161926299acccae3d689eafcc7e220cc42f5a347173ec4c2510da02c3b4526d75c9b01d103b8914e41b03865e16be770a0e642251dc312cd10aecc6a9734ccc815da2bef09cd18c3a8ad6c0f90574f41075cef470039a62891ecaab5f033fcd4266a510589f7423b4992f488c3cbc450db074fdcc7cfb4a51c08e2359247c1f564cc94383892757a8164c8c985c28e288adffa9c866a6779faa0f0882abf650a4b9c5e0fb36e4e51a6442167aa97c8e25ba55a3b5d7f164f07b2917f57b16b751ac08167ae88cefa14668e7634d05865d1ea24d1013e1b270c9ee9164d18654646bbae973745e64f90e69064f38fe5744a6343ca04b1a05293c5dea9ceadcab0b1f07ca177cafff03d582b123bec8cd829aae8d7cba9f91d4c89cf9e9b52038638f54721f23c6b341419eba880368782d1a0990f57211bf31012148d74451ae1e79850b75d6efa172744cc6d77a46dd0272924bccef49053198b87e1ac122a0753950586d14c6b22bc12939f0661638b5191e6dc2ffaa147dac984cd004d6dcb637bb18b2f04c115f98cadfa79f64e6253cab64110a71d94db5762f8cb4d277e03b2435a473d60b193ed2646f4 +result: pass +ciphertext: 4cedfca84ff4ab3bf3b2a94c3b87cc76668f469ac66f62ee0fd00f5774ec7ae46d34fd038c5b9ab28e988f98d4e88db9ccb5364f1fc824666a3e7f95e55660469d04b5014324cf9f77f6b731eb6cb71fdea7f5bc493b4313321a4967b45018ebb117a6668bf19597ed538149e41cd1980ab68486ad6c6391c291019854dc899327c21363ad651f0285e23e9d346206683fe9cb87b24aef767f17dbc1a1a8e3995c2dd4590dfe17077aedef6ebb4ab30159b127ea9d7e39d4b0498e59c7a8d927c0abd9f536110282d52ea16035021c7bc16bd0ccba1681242aac3afaaaba8ba52fed525a53bc8c05e6a74d219a6ba13f13d4983ba4ed151d4fe63b1b9aa6ff9b821734cb064d74d711af76c82496b5e718d2c8a334c887d4ceefbf37df4120be4e647c9aaa2936d8a2a82b3610788c9e341db471037970f9765d0816a2a728a82bb56025ddb847ad7899274e3122f5be8b126bacce82f29a15f7394de9b3526f1c8afa407a6ff90874fe1940d3d558285f0e71b793977c9e8893dd7d5aee01c47a34a01d512f235c184f84a7f526ef533583c968f3348f42a9dbdb026e054a747ac5cc7f7c61a5b02b04bcbc56b8432bc482b052cb471c6950020dd308f3e51ae575655d9176041178201f58198d37711f661cdc615bd0b801d1ca20529d448f15a99e831f15486e65a8a4f849d484ac122379aeccddabc499174059c5c52f60e041f4655b796ed5ec62e375d11d9f4d883e2291945b6aaa5a334dee61a08fd832e332282adfed2058b7a428ada4dc3d013e3ee1a2075e1c806b54825c197122c0729264e1faf761f561a04575ea0f171e40c9a4abe0a6652ee4fc4e8cd5f14cbac96a378ca4c037ed8092c1b149f005ef70240f4cdaed69752fb906b50942e97ceb9f8018718f250b792fd03772a2638aa4304f1bc772e248d1ac7137fddd30598660e67219ccf78f7a987622411b9fee83b4f1eca995207e7a42fe7b9f8878a710404f6baf41b019c71b34bd88a5f4da300f14db4bddf85353e54dce655831e5a487dc9ae72fbd3066d56cbf8b5122f7c8294db5d2ee56287ebd5bf4e01dec3f01c9a0ceb17539390f27ecf4ed2aadf2cd070d8ff50390c0f282b3f6cf6554453e94f11a019d2578c7e77f7f6aec0ca9100b12b28b6eeb48b8b8e579039519b2e8b078b3ed1f1e7c8a5ce0dc1290a970f4de5b64d9bfd944b9dd2fc1eb4b3cb0a1f2cf6e9ea7af68f6e1bcfd9a04964f16cc58e858800695d28ecc30eebc1f13f869ffc637a2799c47c4a5451e9b1481c1d99dc428da3fdee2fde40c04832f68ff05bb6f8c0011afcd7c929e06b4e3536d4648dad466d55e1937bccdc21567d586369880cc80bd0e41c37acf979fe382ee207403e0b458dc3da2f9f4e453e2bea70cb410898ff957fa2345c7299c2962d9020e87486690e6e6ae277d0a94c9f385c783f01535d87bc4b6bf630345c60502a67be236a6f1cb9d502dd61d377fc60acbb6c08594891ecf240113e6404d8e24359e4f1222e07752fe21158c6c8a +shared_secret: b7d5919f0bab0e2715a97cab993656831bc8a3dc86c3bd32e64ccb4762f70499 + +# Official test vector 95, seed: "121d90e70af6204445d0deb28ac0c108262719e9fd3476aca74bbfde89faf04d8d5f89a624e8a75db80431f0d10ad28f" +entropy: eca2adc3da1fb15f34033405ec08ef2f46163df4bfcccf8842c600ce0bc2026c +public_key = 345881ab11467fe9883654870f7266d76755b0a368661001e627587ba42a2ffc1e2c90b154bb61c2cc3d82a3588d4004d112534f787858d23e8a182971229bb2bc77809a1b118137fb91bb09d2b39dc77773e291fbe2cfe8fa2cd4882379f9471a190f34018c5819ac4eaba7a4a24c703c8876f321267b3eaa58a90cb0271208c6631a773021b3960c14605b5e24b01c2e3c9b2196499dfa69d6a76f0551907cc79611bcbca6b1500d50854f719761a59e8bfac4d5b27a54791482ac5426f73b906631e784c3be822599bba514540efe6a7c13440ae97844a6c73ceb51c471f8014fe51fa94b271bf3206f56abfec55ed7002c27a9250fbc12c9f328ea63b3a2375ecd35634bbba0a4a0619d4571ebc7868faab83c6180dc3c129e8596ede2b64762ca7670282daa233620445bd64a44f5c395a212a088165fd16fc69c503a33b8689217ec00a738f74210d074dc3706e9a412b7982a3e0804458560ace39b54c114f8dcbeb9a1512eea2d8636bdb91c15653926b0fcab1978a02ef694086c062f097c32c9445606050e454a5ec2a43d5cb2704049eabba1933ab857acc1527c254b35cbf6fb4e267b567ca2a125b1552d1c83f408b12420b0b10c2e0aa430f695af478c9d1c54406bf400170a84c4c52e9657c1b4eb652938b4a281a809851a5f62ccf930a56b5588f6fc64b6fabc62b6a62795b3372637bd641bc55c76df070288678012247d11b09118c43fba2536f5daab402377791c906e4cbdd5291ec81a1e71a3a696c0165aa1adfb978be46a8fa5cc7c8ee30036c085888bac3797a1f189cc4035658ccaadc61432141b67bc09ce04685dae806c681729e71b62dcc56449101401d967157c093a8a2b442c3af483408791769bf7ce8910ca4f4724ffc93647375e702bacb559c11fb18b1d4a5371fa4bcc603c22254cdf2654b2873cf9e03591f4173e6a4cf86aa30e9480d49215ab503b2cf6bf42c4b314c7595c907bd4526569b3122234b9e27259619b520412b43b892a6770cc32c6c276a391a106959560687c9620d8d1a60a093f9982a46bb9365d611a86d064f3f82d81ba5c3a39578ea4583b8882efdb5e0b3517be2ab82863c68db0336f6a1b9e1777d7139bebd15af3b73e21332d471100a8a8cdc9d926d2d7c23bab39e015c65a072e0409609c0c0607ba94fdba9842146e8524cc6ddbaa3dc3c9153c667d2b4f4a4871ed642fb284c573b1735b24b9f14aa72f316d3e8b1d8bb415e28a895a7a55e5043eebb04dad9a1d7d2ca9c1973bbc485400b8bc3e897d9d977be1d6cd7d93607a123e43b56b55189586703bbb505185f167d9e24d1c1248a4bc4a98b9332666afaea93aab55b09cc95e8691872c48b3594a1930d82917823362dc6e5ca19094526c462b52d8c842183b214f710908369e9e1599c8e43ea7d890a7e5a8caa6953d774a2e6a1efb1529411228d3637f1b28437c0773a719cc85681cff772ef05b3bbe5753fa2aa5e414bdb599384fb6462565bb04da4c84e550b20163928c9673427b5d57864cd0ba25065246d3914338cc9be47b2ddb2d18888ff99a087d0012b789cc3d6c0c2d93567f7a4c87f1382c4c5ea6d084e524b82eab586ad8c8b05c9af5971a56a31f2b73ab45392bf60b762c5543dc3a259dd67fccec3ed3654c6559 +result: pass +ciphertext: 946305bd5c4c46c2c2e3592c19e4d3f97b8830ebacd0cb22e2fe91165488e41c1bc4d8df410c422d564fa276b2d09e6d121559d1bb4b9fe4882ff9b47735f1a560af691529288b6a495d22bde53975633f37e5cb4b06ec28d80e3a14d5ef441b965946981402a4bdf5ec75216a477c0286a7c93ac7c85d0db58ba93d15a2612206fdd1da3bbef4afffad79d76c0c52cadc27513965eb5e41a8a2bc0982c5b1e4ab48856704e9999d906f8e6c9e69a75659a5d8dea96cd6491c5df26f389a5b68b92ec913af9f05f91923522e00ddcf8ea0326cf8241048cf5d0e9e1e656191c36aec989dd3b321edfa110a17f4006a52edf63a8f8c6eca1fc446b1a5502edfb71a6381b88f3694683169156b18838c26a092007217e0050025a0341f32ac09b11b34798167810162194f396bc3a15ad60e3c0e879dc2d67940b698e7fc89b7b27fdfc8d6a99c46e80268f872c9eb38e31bb108495ba4c1f4c0b772354288cd49ad1141274860e0001cb434111e47b436c5efefce8af2da3390c32e3242552c4ce7471abff8b4b603a261ccaeb1219faa229f6cd7aa778c8a5daa1c6d3b88ea34ce1c53efafbc49f4ba04a7cb778b0a974575fda8775f4926ba1fc2ff1675be8350a426b525f9de7193640a7d2a78f6f98cf82c1c5011d1cd65bd27ff699d2a0e31d15daa817389e31fe278f3c18081f1d8855680763713629afe8ba120a66ab72bfd1ccb2c8d2253824e1eba4aa4c8e16bb938ace8ffefad97a795ffd759333467aa3f00cf8eacc2c05cef9ca5289afb1dc931634a069cd642a7c87c4b871c92e0ff08d7db7988f40cdf805dbcb9b23ee633408392d81daceee30d51bb00fa13eb9ccfb084deba4a4d1f49f9675dcc31f4b16e30dabbb54c56b413ec4b8fa8cd66321a0acebb34fed2200ad8ee25478851de2f7ae93bf00a55317829f87e03f7be1c92bb503c7d0fe980f983e1f65dbf6c7f9c04fd2fc611dad8f78b0dd11b26c11ad696c2d9478b715065893453ee5fd742c4bfe74da5679602c550a671241f77bf16da6fb34f1bcdc8265181488a2c0a81f02438f6c59b5bff3ddacf0175e3db1ce24af9b566710bdedbccd79013d6bc000c4aef91af28e9407ba43c0e0477ceea33b0d9d90deb875684ca797688eafbeb93eb65521ac5a76c66b6ba87c2ffe6187f2e88dec731b4adfaf27d79340f256258706c226f47b5bda71c0022f8ee91adf3d3e5b3c6539ecaebd5a57d724e7a9a9bfa7af1e2860c9ce790ddfbd1776b540255711c5e52f904d07c97ae11e6775d8cd8f7d8bb6301647666358fd9a1b90df2eafdd0601ad13adc24c9421914bd8225e7722ac8f55a5715579571208604e986ed90aa648109887b0dafef529f4f7a6b5c0d27f16e8038ed7059a003766e3748cbcd3fad459c4cffedfa44bb7a2aaac67cf8dbba63680c39921620cb5062238c7028f0cce8a587a8eea5da03b5ed363f4cb65a0cb7885babebd0834194afa46437437f6f324eb41348eff99145a1848b4e97753052de775842b8fbc6a5 +shared_secret: 149e4e38a07d18c0b08edf9c47e425b56f7da87b2b9c855bedd29f6f0a8fe5fa + +# Official test vector 96, seed: "b3ac6503206accc2a92cbc210d020a2654726911d11ce676aa04feaa08af1d20c654e4105883ae470ec3ab299075d420" +entropy: c4f15bec2d7701339d0ade4835193bea3632edcf89e74992620d9eb623a0d0d4 +public_key = 2695adfcf444770c6ffab16e9211abf5d019e1471b843a3e7a38b5ce109a0a6796a0d822a926756f0c4a0fa03f53200d6cf37a1cb741f10219102b63425063d6a910b2fc574c49067a1a40e22ccb754926481b7f0ad0111943b3e67a570f0bc269aa50de26cb5f3507791b757370517d486d7a55a88ce86b42856705f6a7a48a8892e96ff20c304e74271e0b555c1b4b0d065a50d61bb2813cc3723009179dd2b4c37a0a06b2099c2aa0c4d256a2fe2042bf4b3db91b11028275b33b4484f2ccb9971df29703dd61c17dbc0319ac63d16080f5b5c460149ef751933ab60142404b66690a2c10a6e3aaa186f6c7e130577cb02ef4e043a6d4ab22ba85b5396a4d61aa1528becc59a1843a4d70283cd2f91457762ef34424b934be9a1547dbfbbcde21552f968c2c8692475632e78ab3d7330619e74d8c71bf3797844c717e70b51367963a7cd3c4869a85ddd213a8d34b788239056544692a7741124697d237d7e2677a908358d81da2cbacefdc511d3110e1152bf2d036c4593a0512523f80a26620ab1cd8b6b1d99a08f25ae3121713ac070833c544e42acfbb78d86476743923d7310c5a4238cce27773d3989d598affe6650c1166ad4ba0e034ccbbb5a75d69b113f2a1952a2cc6980c58ca6da32718e4484d562ac700d924545b6cef439234980611c99e69706054981349041e1962b272c4b0b8b416569952e4f98d4bb12de6a13bc1c903c5477b0ffaa1c0dcbd8e4abd4670832eba3d43d9c31147aa803c17bb32c65e3c350520297da9cdd6dca30ca025e85a051af5aa82d231c159a5026a0e8f2c16769105baf7708fab822b1777c6c53137ba11298ccc15d522400b7f85430de739514c90453ba97d9359807568417ea307abb8982707b7519a65b116466e984772f87a6346ac808c7b2cd22f08aba151e79ad8e45925d29294879a9dc00f60713e33091c42bc3ab24b65b488c764ec75b4117dde39ada784835d3129cbd7b777b1b69cc3293f07ade724639b761ca598464e6676e216874c9668b19aba660974c9918d52761acfa325031835b4d44b42fb91e431373781a2f60354e837458e69a89d830e00801178ba697f82a3a914345ecc1b5cb4b3357b6b7d41b708c5a7e4f862c44c8ffa90473495b70607386c02b4f0261e197124de180cc793355135bdf37cb36b9a180dacc2f6b09efd80cf35211a0371c59f396cd9ec226e1126d69a6ab8441faae9a1cbd18e17387ca0333f94acc7e35306a8b05f4dd185fc467e5e888159a50c6c9a51ca6b2deb9ba212822020d67552d4317449b51b21c37348c44e3880367574d5c195db588ad0189a80756eda780dda9a7d3c946b10d897ab8bb40d6441179b1b0d58271ea83000c5ad56175a23d20322d516b2a487c74a64eb3514c93b919d65cedf429bd37515fff66f4d72cee39a0081452f791b8054660da44937c4a443a09727ca5198322c341c12413c19b6075bb9118540bdc105313422cf9b8fa687540af66728fa9859a642bb9479b31257912cb5e0046dc9273199f27f4f3665aee6a7bdd19e0ab8baf1d2a868b465aef75f3ceb916c82bd81791e80158f8e5b358c218305d96a683a19c930c1903b5e0a4b15ccd8ad0b9e61da304ad616af46073a781ed8d08060c1678f48941d67b3685a39ee7491 +result: pass +ciphertext: 326dad83eb9507d3d8c6433d9c85dd37879c8edd4271eb110e1da941c4ceb58a44d889e67f4a0a339c5cf490d27949c6716d4aecbc49fd976a67e36663fd6fa0ff29a185ce1af8dbada61b609e8acceb07a793390177024eee8f1d360f4069f7a455bf94a7a639a8fbdfeaae04177a1dd2427d748a61a72f68e119e98c9437d243bd5c3b83e07a55891b400ab069ff19abc6770b7252162800fcbe0ca2aedc5de3773e9f961440ec5db16c3fac83941cbad8be79b263321aeb01ab0c7e35f2dc12b3f00ebbb6224a5c83a51c8173876f2f7bb793c7f965b8907ae1d132d741e1c795f30d3c796094e04158fe09bf981566acf64dafefabdaa988d6f6dafaa95f912d7c78f6ff1b589edc549c93d0241c028bc0b5db30810e560389e5eab0afef7ad8b4edb2df3e921796e8823518aa21adeb02e60f8a11be5a309a88a6f48b58250d8f7147d525159978df41230036695afd9d0ebb1bffbbcfbd45a74405472c220cdcc5026b1c84710d0d187817042058c65cf5a88bb8f6b99553b013ff77b9aec4c9362a279aa2fbaacda95cc65794ca2286492670049008d58c531f70c954af90d08a6498569902f001997692022099b53a6b4e2238bd2875ac7fb374cb27f41cb69a38afb0445254623c81148b5789981140697c8866a75d4c37089c2d536b2bc4d789f6dc045ae57a977f7bec2e0dd5907eebf606dd725cb0673ac29f16378a11bc71bc5ca0ae77e2c3c2a5be6a175dd70ce5c06e906b899b81ed5c0b6000a7f1468948341687465a671e6fa5458089e8795c0faeca5321b30edc70bc60a664ac491920b69effc3bc268176059f47f54e30c4c08fedad550e34087a0c5ab189426141db1c27fcbf348b33216b1b8a184367887b1f8c46baf4bd44a3125b60de3aba6e9baa2f3c593734c38c43f8c7a7bdf20d847f1a79708e81df8f6e1ccf61c41c40b74055d04fe8a7eb091ffa7938de90d71d2a0b5e790884ae8fc4a6de70aed6aed36fab4df9a4f4d768ea2b0f08a047d2276876073196e15909e8ce1f91184e41965f25673138d5c3358cac17d611ae9bf91e10485aa53c9b570733866c9338ed111b99c618016f8ca21b283cdda6c6fb00279e4fa2ac419be7b51bdfaef65246ffbb8a4a8afe31cb67ae15bd5260a3147a32ccb0c084a7435faa8e8278f6a3bd0648c86af6df4e767b6165666a69bbf9dba5f9baeff4348f55742f25e63367a3a7a3f0838d914186cbdfe83d7850ad0c1032cf116f8c937ed9c14b45ca6ab98850f40be73121ee0f29dd3400cd54a8b4ef9f96ec3b1a19dc5099ee276df4f2ba1a6abd46bcbd04722e49e1828c6a4090e7e204908a0cda22339c4c0e733501a389196b11966e0e112c6fadd0a28b05426a562a9e293be1ae19e9d85d401bcfdcbb98c057b4accdef69e8338169cda5f851216d1a462bdb145c83958b07f824da067783e1db1ae85a86b156478280e222dcc204b3b858374514b29ea52396ea28d2313346fa53a610dc2e588252b6dc42811e5525a94e2020ca5225 +shared_secret: 38a1fcaf302905e18940605e49e5f44c747b06e789acc9c395211823598ef516 + +# Official test vector 97, seed: "59eff60b1ef6185db34ee1e3b1dd2f159106ceceaa79beb74923b4f5623d5bc52dbf5d2594a1f7c6c64d12cf144e9ed4" +entropy: 28878249e2ac2b6263422993923a0c8bd05ce56e385ed13c943b03d226856947 +public_key = 09abaa56083952c0c1b6ec9a50251f3c16859c2c91c0076750016ad3ec36c42941af9c13e4086b37f5373cd29ef4d46d6179c948eac2738bcb765bbc58c8c0fc206a4e30267ed62537dc5202c5a717926744b296b2983b8291495161c920cc1258f209640549e5e7cbbe13ba52b762c6767c92a95678e066631b57e256880ae56189b699691999fa294b71135a7537202e8873d2653eacabba9d3082a5f01353b77da1cb4220301b84a14848b94d68309c6a29035e7cbf083bce5e659c0a226274e8534f61021d1743bf66525aa7c62759c9ea85155e139a9cc20f6b0776d567a8f1e697b97ca60982555c0197bae535a0d20ebd00a7774550e928647c40598d16a45da0810399cf38865ceb5c2ed7623ae9f55987fa37cce79aae79030f8c3b90898f758366f7f591452c77ea7c3203c147e591304138568d2257d07689865447179c017b0560b3165673526981c65858e842d913a9c22c0a9aac9fa4e16ea6b128b0bc99ff863b3f40b2819ab2e8a04cb353c7ecb2409e495e617a410e638bcb370b2c887b8adab2b9f95e8e922baacb1d148610cc4748cbf31b88da477029ca130b152dd923bd7796d0128aec6706c204ada1b37dc0149a7c318d8356a4f8c9cf917443fef20b02096579580d82bb8659b18365ba3347b081f42b17c3e2064a441b1a3a876c26060d22c370f82424e9b156145e93894de3ca09e4fa8ba6524eb9ea94980a038b257fb4da57d4c8b40ae5465a3a9c7169ccd30b13295546846a6bdcf13c3230b5a961b1ecf578abfa8bac3542820053717baae30a545261b873f278cefb73edf8cb73b9272dd7552e381da64c055470c199bab07cdc3293c0577d9acd9d9063b536412ac7cdee30a1dcfb6e25dbcedd5425508a1091555998931326fa69c78b5021f818f8a55deee77db38229b4104980c230dbb872cd671fe776a09be47852204c6a339126e3bac2353d36c094506092aa597449241121332900a69f8ba1b79ec56f047cbbfbd6bb2aa08f6e606d54c72cbb758357e49b937590a1191d88ba26ca576ecd320caa1bcbff8533695aa486d222b5749bc8f4297bb7938d5b4cb4f46d6ee701a35a287dc16f7dc1347ee97830ec69cdaa91ee061d3f0c81bdc695cd6939ae56be11681847629ea555747c664b5e111a9ac5159281438729916d45b8f0d3ad0e0514619ca93a8a971e9433c9eaa731192c760c5c5e32259f569dcdf39bba4c1b7269bd98417abfb1521fcbb640030563118e0f35bbfd0665023863e275c7d5319a1087bb2f956d2dd3ade6c37aa09c36cd5aa9ed09b8999c4473665ae2b784197cc9268c57bfb78dfb054bd1278e044582cc3c81c547c50fe7bfc270bf6aba9fc159a5853045af3758a8d552c3881d7c2879dbbb0b79b5a5c2300b5a380ecd199e3309251f9647598b7376290452a575f4ea7071f2a0ebb7b3dd9057350abbc1707e25d0b68d734689f0ac4c9b3242fb703ea6bb7fc064e599ce8f9269a0d63a719879ac8c396d79221babb2c4a0b7d38ac5b7e984f2212c481a353ba6bd95039443658eeab625d3d00faff2509a2c208afbc6016bb5d8726dc74993ad329bb9a554bf61209cc20e521b628d9c89c8fa687eb7464ac51820225b65b2af8489ed896d11825bc4df67f7002453d16875ce21ccf49b +result: pass +ciphertext: 851033f1b0186cec6316ee0d2de8492c60f77e7a28e7fdd05da815a3d097b57e7648cc9a8bafe8989eab34df3c43d6984fd19b65becd0c48eca9ae5ea2f070df97a17beb6174ed74eae45153710a758c89c204a8718bf96e1a07f94bdf8efca4a5de6e75230e0f0110cfc0382361e36d286ae3c679c06e1acc9068ffc834c8f8b61e24215fc99824a988b06a4126899b085273272547055cce233c6934b0a1581e081a2ecefa722e3d7b2a2d610368bd14bea532e54795c2f28acc0950b1d1589f23c7967905eaf1548ac3804dedc3762f29e02d9933f1787d0dff3f6573fe88e78e5bef4311a0fc8a76265df4214a5996215051b4bc3fce8c67972631a9a1ef30bd0c85f228060879566def14aa169639c7c5d003010dab55f735cddeaabbf9d6a2b44bc904fa6efa5a258d09df75804cb993d689f621a635bdc3895107af08b831ed70ad4992f5613abc38eb34637110467fa1237b0614a5f370b9b9188892af64282728bfbf30cbc9855d2ff8dd016ca8a42a6bc8fabe0aa11b9fa6ba816cb6991aef25fe38e9bf9d677a95c4482bcf8cfda7ecc1f0c6c642f55a2cea0ec62aa232ac39c56a757b2026463d33109e04cf1c43a685a02a7e95dd9a628d495d2da75b95ea7f9ae1867a49a4326ac7e8b276667b6b0c1647e3370a0ce107a1110737fbf73a2a200331751f2714fc14f0b5f0551256e8f5c4eccc8fb0d95e867a021a8ff12bdf520ee6c8ce98a19233142ba18a6184d1eb92ed72810989a71fff33f712ed832ca6c3c9ab618fae23356a6078afcc812247b09032d58b5f9716cbd95a87b2a9604d15862348bbc388dc8af24415bec3797e03965e618b88b6fa44abf5f7dcb381b34b13ed9642e973edfade4f18c75b4d6bd437a93bd1740499720f68356ea2b23017c07cbb5eda895c67876dd914af22e0684734ff6ce2d301c4e79a68099e948e66b597b87c6c4fa4763eea673691d8377aab5fc4a166ba0eec69e7592cc4082182e69f7c3c9b6afb96bff870e34f56931a759ba44d25fe1b75250b5f2b6500022e00fa73a8276087e300dd1a96d520792625913671cc13ea00926199b4bdb55e5a21ba3f9fe0e9521c7fdf7a56b4d0d712a43dd4e1298b4c9e1691c243c6a1dc3d3d273014fe4395b6553abc4a81c4cf186e7868cf85db5579291b9730ca26ec09f7302b8a0b62dc0c5b3636fa8445ce0fd772c68d4898c83aae108698e809a79e3a341bc79c6ac8a1425bb7b66ef4556fb6c21906bcfe8252c173e2c637e1c86b0d3fa19fa67ee46c0bb85d94a480f24e99e4acce0a9f8ba64a2afa388dc9be4ed9d50f6a8107c44507b70dc7fda71af692c0e1743b15c998090421e454de886542b7002708f6a5180e20b2936868e84dd3afaec04ce4d628909204d757010fd682758857ce720257e01ef1e1c361646f740043f34b4dae7d8d02972039584771114333904353ecc45fc3b3428837e80d7b4df6c4923b122784acf27a5329ef474e2545baf052a2eb404fb18b13199ac35f19258782bcab37 +shared_secret: 403543b0f8e519ba4ab878c40ab5aed412ea06bfeb2b864baa5ef4b81a42c454 + +# Official test vector 98, seed: "dddca9dc31bea737d3f474e7560b37facb2f53c803e768ffaade7669ff94b1d4fbd17068cffd5dfdd24aadada4ef6b12" +entropy: 17fc65f7fbd7c75ceec421dee84dff5a8cb22764a182db17e0ebe857f54d60eb +public_key = 9734408c884e736a271a17a9a5829a56e4ad6fd90402c18327f4b5b052a5d72585ad276a52228ea0794d4ae19235304674705176f76e909792b32b3f45f3c179464daa653c4885346b0921f72a2e186210542575e7abcc210bb7572c5ba97c475d8ba2810c54b9f23988725dd17967e9764513e1a34e55a9e32b05bd6a030425250a285fb331351ba4470eb2380318c9c7a56ed0664c6a16af63db6dc2a7c1c4e5a901c89ff7a589c099568c9bbb0482b04205595c242c66d99725a17468684b2be16b2757760b72a57974549c44c17bd2aa028a2c2d74b458c2bac3d34537ba095c34459b58aae4940fb3b68a73b28aca34cb018b92f65320bc3c04008394e17215abeb505b4bcd37d473da43569d557eb34b06eeca22c1264db881a6b37bbe9467899117b602304fdb72aaa60bbdba128214cc87fb980c1be3bcf9348bda62ccfa591328901c9b9851e9f9258e2a5f500053f9266891fc1ddf267c58c1aa7db72255f8c277d8535fe48db1d9b12cd97fde35c837d12f6b1c84e2c019e77469350bcb9c3791af132bf2ebc633f3c681e3801d0ba00a30672e955d84930c4012100c18b7a5a342d226341924034ac0953ce15584911d86c0689fd12d3dc4cb2d8748eec4abecc185ff63162e414e709cc3c5163de7b80e9e550d4a0b90de20b2fca850e3b11338bc3b5c369d616a2b64c764f78122abdb66860103371b773586463ea51366792872f36c53603cd876c4aea446e8811feb4417e3f21b94059f1d3c47584c09b128c549e48f6346cc3fa60ad19cb9b65359f04506cf52994ff5225aa24d68a00bc5171e0a492733e726eff02c2b956f9d6a6e7a8519e2b9c4c90b8db6b5447a0b589cb71cf0b74b899272a966c0b0da3824035c70c334818bcdfa2632e7a47ae8119661b96a6b4b17810a8840cc05bb3a0db2c6a60d10cb3e7ca365576250a380fa4b956ce066e72a0d7739a4b4e317988b64270732ff94c319a368cf0b8d8018a2d210bb37c695032a3b4da71e25e2287ef34ed68b5711ca99af1cc6b83caba7eb91d1f10eff920d9b41091e086487cc438e461344905b7e954121948ab8251fb0044e6cd8075f28b70a67132c8362b71b77298c2200e11b3013b6b2ec8b21e7a23a3cb9456567b3a090fbe642a1693501db47f8c4829d86bb1ae7accdd7763fc0b5e754ca5999a1544615dbb1acda7749c1d89073b130a4823600e322904c9599c31b67c963c307987fabc4e482910b57a56e2417eaf978008c9fa38103c15ab1a811b2b198a5b7201ef767a26a758400469ce0b1ca83920fbcbbc51c8697cc4b687d8ba41d45725551a09e5cb230532760cc15292c4ca9cc77f6e215d70c8f6e98b35fb21c5e0993588c8f76775f92c575c013270c167cddfc76de12261e84c1b506737a7448d00a6d07456fabb620d985607a32526d276846cc739276122bc14cae94543e11276805aedf36c404fc079117196383cef2681074f954249b859498a8ede375663755890613b15c2a8ff25ade0abc4d674a050369a596ac3e446cfc3171600367f89c9251e33db95c508e09a64f683fe7420c5ff73ebe5836ebec9e0ef1a39c02acd90275f5d9af9eab8c741023bc91806d255282846cb5fbcef030ee8e721d0566c29f469f5773938d679dbe17bfd7de66be5e +result: pass +ciphertext: a1752c6d6ce4394f2ec75f83b811a7216e0c22f7de325c4f443c4b42b8b591eb1cbfe51016809b0056a3791bf89a2d1c1d7f33f487456bbcdf4c129d1896293b2a247fb921586e048698a53059d76bcb892c491d7bffb93cc79dfdcca78e19bba05bc9602f35e1e1ae7a39f8cbd5fd8fcdc78d2d4465166e1de58d9fb958c697a87f003cf53e39a5d74c800b2ff3a1ff5e55697b5717a024acb384aad7b9e0378edf0a32c84041b0411ea2536756354adc9c94e434d485625eda46c49df91e19897c73088252975d53124b0207ee6f0b298eac2a3b850d38f87e8ae34ed2092847beebd022a340b8397feea6b70f58048c9e0f7ef1871e3900665187a0bbf9020c8193bb72619b23173f2519aae103412c2938385e4d95263b0c6b1861bc8a9eb18bd45b649e2c88267375af062927cbdb36073c8baeb2c18566424b19d1117eed47a2ef5c9447548181a6e1278babf995c236a0481da77ce3fae728f1af4134a74934163765df41e05cdd81f5089b4be2d98be48055b9a15e2531ceff8e25fcafdf8c6947acc221e9a7d497ae3e6b948fdf5e424ef8cbc7605b14313f96d0b8b384e83709ddcaf9ee171463e4d99ec20a0eb4c935a9fc150f8f5cd7b8cd35af793fe0c6e8acdf937b8de68fc5c340e167c9cd54e3e5e62fe5faf9a3509c12377567f0f21175cb80dabcced8ae1b0673b78604763a64ef8a168614cabe7046a4551fa6058b4eeac3906d69642eff37ec1e9f4c1de1c3dd3ed950e6673b8a9f5478d136309781b6e758e4e8b0e1864dd1dd1f961012bd47f4163e0300e46fc39ced1aa6efc4c1cff10633b6740d9436f7c024c9835f647b868f9eafc7df5b99b4347b7b417973019308d564d5ee6724c630c891bbba50fbbe8b902d7d53761115bd4c6b0cd9f1a7ba657e8d75680294f35c0cebcccad433a633e1d01b8691ff74a7c2711ee7c1aed207fa3dda7dd61082198b870344b6ef33016c27879d22a8753993b2cd017387e5c23b18367e5eb3d3d356483cd4f8225a0b6d89853fc0a2869fbbbf3f6f4dedf302e0d8919fe06f5687ddf38847d2da1fafd710410fcd5b1bbbb14e1e6e3cec8e3749d19abcdba23c817666a4bba93a14db6955bd8d9fc9a96283719e6badb4086ba2b04d7c8b4292fcae74ab859b5f1d58a691f97b9bcfc987e4c1f7aaf46d7eca4948230b83d033b006862ba19170d524a3e1c79503c548396fb3a0e0d4ccbe0ba4a5b3f49e66113069ac7436908f3e9f0e536d4c6c54081e490dd965d34767a2f9e26ce5ec761f30b9c561729b4be664a9274320cca48fc35b0e878fa6f3cfa1531bd4cffa1c09a47bedd5fb7871a56581356f2fa247c11eb60c160d4da1393cb46185ee744e220de433e3afcc3103a58ea775e4c5b8581d4ffe4df3770cf7b1a4ec174d4346440dca66c1a3dcc4f2ee81451126e069e6575fed7f292f4f9fde60bf3b0ec9c89fd92a04ff36ba28e1270e1122554aa75083844d3adb275cdd15a04b71fd25eaaba2522c2745d46475367b349ca9a4077d +shared_secret: f7a280462f93b619888b5a72da3749556e53ef4f4440df728c8db1edcc86cea4 + +# Official test vector 99, seed: "2a6f7386b815366f572aeb6c79e272cc21b7095fe09575f18072c9d677da23bc9c8a4bc393b7524604d299bedd260c8b" +entropy: fa0489f3730100609488e951e6aaa15c0f193bc1dbcfcd013bc418d6c507b176 +public_key = 5fe1c21f16c49f6b02f2450f4ac135a9eaa5e24a3e3f350a6982b5979a93120285dac88e01923060a795d251c1fedb130828582c95ca7340b2e8e105cfd64f63e63f85a955dcc4b12b0482d0994df7ec61b8b09aa4d1b8ceb94b769a2ae12031d16c05cada3a4d0350e8d970ccf716953543a984cdb086c425915858d454880c97505bbb9ac7cfa54055526689033c8241300e11d09283441043b91354d1c0dcb4a869f225c8ba5b290a77629004ba336c8975366002667c99b88b53a4b08ab564733b5d2a3011f944b2259845dcb6ab8956836656e3370f5981203943b343389f2a98cdc96bc1a996648580b7fe837817ac4db31a2d325a869950a32d99446256cb3d8b91c159683bc8c1ff41287ca54530e84082bbafad485c0f179781950a4722c9114485f6b403f3760678e3bbefda309adc41ca562dbcb739654abc6cb05216807e2fe18fbb485977380d8c0282e271c7f1f8c14694484b76241a1b0cf3928ad9e328357ab75fe909957419defc8e0da3469e7720a5e91df7c4857ed50b89d18ffaf6a045e2c950e178adec7a3d690fa23527d3d353d8731857018d7cc909d081cab0370cfcc8bf8f5463a4fa8706a1abdf2c6a7fe8c834a4ccd8b6c869c6bf93c808a43274620b30aff22bbce53a7ff85145779cba220dabd1b597f4515c1664a374a64ae18884b0919668a70b371e24d2ac1a84af7de3b84f804e105177f6a9b914cb5dce45c678c886b3b24e3649cb194c548fba4114f278a56a4310a7cf1cb16e8ecc0b0fb8a2685b30631753b7f87eec8578684a67634119fe8cb334b67b741305aee8762639a212b9baab4032653b1537327eba5b6fed245d17631e748532426c5a4f4646716521dcc72f4c34a38bc87a892650def1bf09991e4c175d0baa1bf6469277f75a2812aacb88534c491f4d3c884a4470f01b805efc160ec17f68b0b0eb9910889a02467232fdb268848a5d6969c91410775fe717c9103cffb9a2bc13b1bbba01abb92ae303abfefc51af169d25d29316e7a12a5bca6827c25df567ef0c20f13a6fd728a32e229f72b42e74470c88c105bec0a12a1810c3d2a3d84b89a8c9bf66cc305f0b0c3fb989c3541daf147d5b02813e7904cc18a5dbb6632af4a34cd42007f09ab4a88c1705958058bbd6f996fe7642a0b45b690317d0e658ea82094d6b8d55722123fc1bd349433ad4850b19a4f6616685767e67bc21333a9f667a6c422087398b3331c075cea9aea6e29e424653d5e7a86766613732343341491726869eda4f97f1982e62c4cf135b1553a0a842b35e8ac23f29a921039bf31833f12ca8c4f02021559e1ab5bc37d247a5078280f02956ba2e2f897b48e18a769908e6b8b15c63b5a780580d02b5f70749a5442c824a0f56cb00378bc0ea2b033fbc9d45d535ecc00f5579a687865702436d3065461a06c8b274561d938d92290a8c0bbc0cc746aeb253e4823f8bd7b6becb5b1f8a5403fcb40efa5f6c34c43620921a416aa769a6ea1ca15c765d0e53c70b0a719f7b47ff783b63701af5a9cfe704c7d99830734c1b1fe00a1d9166b11060baa09501715310b93ead6825ba9998d922ae362092349aa45abb04781a98b25989e8309c40698a2676b49fbdca7775f554d2448358e6a4bf5373892b712b63af3392fa95dea1a8 +result: pass +ciphertext: 381ebfb00ef96db47a1c412af508a5509ec6e92bb3eb0bdbc9cd3611ec6b875764aa7dc3aeb515709f9d3b4cfdf6209598233df9a84e13a1dd779cac72eba5c20c5659e8c12677eebd55584cd34bffa6572ef7e83479c271cf5131bb5070085c3e513217bae58724f5e4ff3d5eb3c21d6c46e18fdc7d95ce55c3e2e697a0c99bcd8734628e1a93f73647ffc721a0d325b4cc9ab028e1f3beb2006b46a61632d1b69f26514c0ffc18a5a7443d4719e46a55476511c868427df2cd91d9626ccfdf2b1232aa5782b698d0d5ba501ff0c993b92b263e4cadaf631522a5cc7bd293554598dc42056efe2dccc8499dd574616092461bacfef03a85c4100550514651c5fa70c7c172ad82e3844a7c5c940997ca9e9cc6333a0ef5dd0c60a97b93c6bd56f18f014182b3df3e1127411b58e2a095b8fb4a7ce43fb5ac658135952c16e8c4a2ca78b780b39518dacfdacf9e93ba28972293859644c411e37070c877e6a96dc08875d2bd92d54b60a56951af537f02cc4dec141eb68ed3ef48e4d598a0cc899488cd73d2b676cca349b2c2b70d9931dd672bcc7a15d41db475c058528c5e1f8902752a4840be08a733f277b5ae5829c36fbf55ba91338ff92bf7811f5c660e12d3d3699ad04ad1d54a21174c8c630059acc5f8f46662f0591769efb02a8bb6af57ccd05d53b96b987f2ea676bacacd6fa4be275503a726d6f1eb65438ccb9563ae9bf6dcd313f3b819eaed568ac05192886e7e2b19ee532bd076999ab8e3e489bc596f9904e7c35b0d93614c6afe2081e5d9bf545c711af029107183f1ba308d78c4becec16f49656fc03ec86d8ee25a39d11517be38d270601f888df16a70733ec3230b1cb537db4e5bc13e8b099f7337f9e3e5709ad3fb8ce2445c332b87b9f263d4cedb3f7d30f014905a214ae7223fe1263b99ed02bebc0f4a298b7b1f4722ce622f02a6e75754e567e1ceeec73ef725ed5e7caa497d5e67d133a08db2c42d876599c22e052673ff4ca3a9802dbe7b3e8f69dbc36e713e8caa0765cdd74a3902d5a23dc10a01deab09d05418ac3b30f7c06e594d550843794c4deabf8e805806583dc30f926ec191786c661e66283b01d995adde5e0d2f59fa044abcc55b78c05613d88cccbbbe8ccc19208569493831115000a8c0dc41ce0f3e7818f0d2cde58826ea8c562b84999f6a9c3d914eb109af6c804c16fc0648336e10427800a146339dd6cad05667e98a2ad35ed890095104ff45bd7c51121bc141866671d097006b491b1e6841fd34f0ae5f8298ab62a4dbff7ffaaf67e1fc29656b75aaa1a1949db4d8d3dd4cb2ca2a8fa70ed3a70db112bc261c2b58ae0ca834cb2c358278d5af6c72ff4c64fe0734f6932329d7a6c6a6ac19514401128e45e33f69a8c484ee7bf11c0e729970364490affcb5fd8ce9fae282848b7c36957b033253b8aac9b83bcb9ebd551ba3a1d1511a0847fb7657b2da87fec3a5e0e90e9a0af46d826c5c1a932f0158e5daa18397c51cd42d4e8d5c8571a065ca8568393c6a5f2e +shared_secret: fef3730b905431d14aa7aa7bb1d253cd912335c590b8d7de1e7aa4e0ff76be04 + +# Public key not reduced +entropy: 147c03f7a5bebba406c8fae1874d7f13c80efe79a3a9a874cc09fe76f6997615 +public_key = a8e651a1e685f22478a8954f007bc7711b93087fc78f19fe82878e3e937f3679675339e3a8d53dfdf4bfb1f8846746596705cf355e42ba7fa3f173f5c41cf952a37b25897e5ef35fbaeb73a4acbeb7adb89a4fceb195531c0cdb07993954483e6cbc87c06aa750fdcac62d7e536bf60aa98d1198c07db6d5c5eee020f6c9f7bb68bb3456c74ad1b81dbc9ade7739b5e716bad1660c8b629bff570fba66fd7ea993336e896e84ffc5731bbf0356dc5b6c8afecb748ee391e98934a2c57d4d069f50d88b30d6966f38c37bc649b82634ce87f2645ccd635d63364646d6d699db57b45eb67466ee6de4e4d6a818b9ebeeca917af594489708a43cea88b02a5cd3d09b44815c97101caf5048bbcb247ae2366cdc254ba33ef9f45b3b0eb399cb9ea3045df830fcd1db8bfca58dcf3514d9b226d94b8bdc3ae33ce10a9124e89651ab901faf53c94e5bd88f5f02cbf29369af983df8f22875ea55af16d3bc6907dd2ee8b75f28b47dd391f989ade314729c43efa05ce918bf78c3eb60286851292eadc825c64577ce1e63b1d9644a612948a3483c7f1b9a269dd0e40e96944a403627609c76c7ea6b5de01764d24379117b9ea29848dc555c454bceae1ba5cd7fc74ab96b9d9eb911df6b89bf5639d4778bef6c7d6e51a19c6cd793845447f465e4c5ec39f45acb3db5379de3dabfa629a7c04a8353a8530c95acb83fbb4bc8e932cbfca7a848cd366801444abe23c83b366a87d6a3cf46d925ddd2baf9daf65c48060b3753ffbadf1ab2732d72554a5059753594e6a70286efc97684c8c4a7540a6b07fbc9de87c974aa8809e9f8c7f4cbc08d45aea5bc6688f5fd05a522fea4bf539210d7e13bc37b3e58b0cbfc53c94ecbb047ede2f5e1b989cb7d7dc023366d78f9c37ffd47f98fdbe1c759a8d96b93f65a951e4ffa06de9b8e795e995c7125fa479ea5a70fa9e1f3599e37c768c7bc108994c0669f3adc957d46b4b6256969ef90d799fea85464ee7a750f39c5e325fc2dfc56d9bdc924ba8a959a68096547f674f3c838982a5794baee53387e331a9a656c28828beb9126b6de95e8c5d906832c87e0705576b1fb9507269ddaf8c95ce9719b2ca8de2efbe10bcc9f4a37bd2beeeeb33ecda76ae9f69a5d5bf923a8695777ed619335be1c4c2c77ce87d4ef98a8cc466460fb4ddaaf5b301f1aed09c88e65da4d8ee64f69ddf189bbb3584baff716c85db654049ad04333489393a07427cd3f2e7e6a345f6c3cfb14cf7b347f71c1bf7b2dbaa00d237600b5b594e8cf2de6f5ea76cf0ed899122c9796b4b0198dd4268d49a477cd11d68c49b9a0e8cddbce8cac7864cbb385e40084744ca3d62694ca795c4f40e7acc9c5a1894d72d8c38dafc5d1ef4e84dd5a819fcf4ec175e261f962b17a7215aa4a749ce5836c389137678204838e7e95a85b4f99aeb574c4cd7909cd1f833e00df485553f29d3748d9b5cd6c17b9b3b84aef8bce13e683733659c79542d615782b7ecdeee792bac5ebdc4bbfe93d8e673e44ede849193dad98b4634f64aba8b9c04237f654afdf381cea17ca87ced7aac41c82888793181a6f77ee97b7c9def90943bb38449139e1d865ee5466c5767ab0bd6ea1a3f736162ec098a900b12dd8fabbfb3fe8cb1dc4e8315f2af0d32f0017ae136e19f028 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: cde797df8ce67231f6c5d15811843e01eb2ab84c7490931240822adbddd72046 +public_key = 94ce40f6c47b7e53b9707fbb18447d277cc022ce44a0f7a35f3db57386a78ac976386f62320a5e7e1cb42e39dde684462dfed67fafdee86c32419be30a5a41a0f8f68cfa7e0ebfb441cb927d7897c43bed50f9b32868a35a3cd4cff9e040e9a92099d2f20c477e2beee6cf90d2f5f44fbeb4b7b4c6ad074533b58d9914a6aa98f9f96789f5cb87607569994dd3f4af461c33c81a3672af69f4c4ba37e78f7fccf86d8c5ed3fbe9c0f72f6dd1bfe45a6b7aec76b186466f9c67bf179d39259574456497140c8cf4bcd5091973ac9cd8d809465785a678ad32ac09ad1d666e8c48462813ce5ac75f184b38251c30e46fb0e36ded690dc8ae1d3c8b773780b6717dfe5c411e39acd54b1598b2b7c79492a8663119d268d7dd875bc040dbfb75a386fa96b092b8cbc25c47f70aa76cd8b9b0defb42b536e27c557893ea96dbbab7138c3f247e955a6c08b4407d57d8f29e4bfa48af4b28533f747b860b7077ddf8e245c9727b42f3248fb14d8b3ffdc4918ab76ab96dacb8eafc2fe1ab4ad329caea5b069a68934c1ce84c307f83942ef580ae9e72d6ffb5686b624e6caf9bf2d3bf6a6eedebb7387f88eb8606a8da5f2f59cbd56ca1fcd51cfc66fa6f39992af360d75db0ae534c9ad5ab9c95e2e5868547e4600a34566eeb62d94525d8b1a965ce69f986731888d1ecce547dd0e4863322a83e3c8475d9eba5414a65b066ed24a7b09dca6ffe23836058bec0a8567174e008c831233c7890783dafe8c35aaf63e796869118c4e85dd2dc4bdec6bec4ac74ebaff3deb2bb743713bfed3cee79c4a6f46593006acb3507d41f194807b893aa7a932326f168d384d0e96f2f23368626a2e027891ac94f1203db044b85f14ffce3be6517d36aa4ff3b5f49ebe394b54decf8e5a977547f869a7b50b4898c073cd669d43c641a3cb5e8c170ba63bed6ad100861530e305e39fe1d8e8e1ef64f3e0c52fba67e7249c1ec5ae40dc89ce015d648fec19f5897c77b905914db4b5b4283ed669cb4c658f48f67338413d9ffc85efe444bc635dabc93d5eb030784f21461ddbfe0cc6a54fecf5bba09705baa77c28f6637be6644a5ada61f70d93e7a787abf5329fd40dc765bfb45c7dcae5858eaf3a49fe86fb90bbcef6f69a5df8d45981c67906b9f6936f5fcb6a4df2641688aba61fa49a84b47c96661e58dee5826c1118d69c4b9c6e59df51c5bd21e1ecfdadae2bbf9c09b0f34186668e389454ad4d46f6bf468baffaacee7868574e729574ee57ea7495af41d627b85916d6b4c708374f90bdd9c3aa4664c665138ed8eeb98133ceaf13a816ca5b86905dc51bf91efd466dfad90918630c6fc77247c458ab8f568b4edd9d4708af3bbca5a5716447e8c3cf4ad788a873f473fdc4a267e96bd2b5491aee76fe654d3694e11bee8f7b66d1cd5af199b6e90b3bffa88a92e36717fd4bbfcc78b0e08634ccd80c86885c92c8ef67aa4933c7df097891369bac5fc5d0c36737ab6d9724edae00fc257f76a7a7b3f7e23fc2b7ec52ff4affb6846392cd86834ea3efe3408e4e9a78bcffd49619b03a192c683901af44289c9f7b4564823900ceacffd9a937136dd5e57a8281e96f4759eebddcead3e8966e76f68de95ab9db2ba4fbf83c3b27092cd339cfe48d5ca0ba11591d04566f4ed24a5 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: f43f68fbd694f0a6d307297110ecd4739876489fdf07eb9b03364e2ed0ff96e9 +public_key = c02b82039fc46c8a8a92975a2e37f92cf893a7f54a84a67022845d66236dca3c48456d4b16879e849c7fe3475d0308f423e8f2ae2cb6763842a329e14f5c777556e3d5fbaec05aa802ad3ac1989a725337ea38a668ea65cdb36343ec3d690ccdfa47ab1fe473247bc488d98e1e43e75a2da0f237fa03a8fc8386485ccfc4245884f1d941751aed27fa85f0067f5c3775333d4261aa908bfb950894cecc1bbfd197ced78a641366b9199a4ba29d446e03ae51549be7959c87b6f9acff4cbb7a58d01cad4949734f797ae40da78f45c70f668506977d7c85a0cf64c700a5b1f7879801bc3ac75584302c8bc82cdd7f7bf37aa4d0681bacfd7e92f9c653f8a9551f796cd0cf62d3a438a65ead74d8dae9e3b5a80efd5204ad45dfef488b7824a4b1eed79da9b44e60d8b22559dc062b924ead4f0f0df62304cca34bb4fd7dce6b28d0fb6c5dc87ebf7bda9e9ebfb6c6046a177fc6f70deb0406b9045eec272bf0e139a69138adfb05dd1134ae0899c167beb1a5e8e8516bddd94895a263d59b167630f3a0dd3c64cf257cdf93596e64f88c7a45814d4ba8da541acbeb6aec7e530c58a61a64d9b9bc32d870bd1d5ef7063b9a97519b97ea60d7aaf9ce93e948c267c9c815063d6b6d3ee9eff49b386d94395804a9af8defe8490dc7ccfbaed98c4f9f95b70145b448387183f5cc8f4b5f35a949bc74706cdd3db7645c2d084624844a56ada5abc9f44cb5b8736b835c6efbceaef361fb660479b2c51b99734970808ba5c6ebd169756cfc986dbda94915563c16bed9aeb77c01a7cff55c8430696d6e83aea5d4929256fd725c428b984d15e97ed4a7640309469aee336426b5439ed67e675788b3a4fcebca453ebfdc8a49c215ba120d4a3425e60194e9abeab2384e84b1efb7b7a54efc678e812588961add00a4e8e5289eddcac582d3c73dd93e1234518ebdd3648853c5b5a24b389e894ddaeae78c41f6fe5ef3d3a56b548375757ce4fe21a7c5a0ff9a133868d2dd784197573474f92557e61b3a8689ecdc7efee139e4d7f0b5784da4f278d49462965f2107fdba9fadd26d620f6a82f70aa9a94de90ce3c9fb9de5072cf877483c2203bab82f8ee2f37bbb17c1a4bc499fcf49ffbb42e4989905a878dc873e456a7d9db946572936d8e8e778deb993ddddb12a35df1348ce8c9d1b0f898c84d3d51d7f45a6bee864375c6f3d31edc191f8ad835a3f3709362cc763d64cfb91649d7238f5402c9ec2bec7ab0fb154d69e39eae96f7fa25938f130ed711bcbffd2f9550a46ea28e4f95cfdc036d7b79bf9e3034fd60206c919f8b865fd3d700f348fdfc8001a30124b40c6e6edc4ee8bcb27c60cde324d8386da99c3e098cfb95bd1813ea4d6aa5789df7a75a67b6313f7ade8d4aedfe642d58080956a04fd3c8193ac302c92e949cea327f1813390382c814b2c5a6d34a1eb44b8b62aa77bf88b50674560cdc7be967c21ccf81ad38ea6978d228a83a92dc57c4d39175c910a55de311ed1cae45b0736a4dccbde6eb58491da31de3b65ccada7c80c7815f677eea7ce5ec571bbf7c4516c65e5bf528e26d959d8e5e1bbcad1af9ce59573d749453d9b6b52a951de9b889c79cb355c34574ed70b7c30f1934123c9ec68ebb324d254e5d246b14a0259e49b2ccec72b8c494834 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: ea74fbc3c546500ed684bed6fe3c496d3b86d2d6dfaf223969b942e9a8c95e85 +public_key = 26def15e6f41578f8088b63da72fafa9fc5476b3603474b24d8394b93ab494ea3eb0f33ff5e9ea33d34a2f666235fad09e35544dfe35eff54e3575afe20be6b6b59a4db843c35e39ed345fa28dd03fda60b35dd65f86e57057ec4914aefc0ec38fe36b3c7b80f77887a03b74bafb64d3c9f2701a86b027651fdbc777bc4d90d387fc15b8c12443af8636e46ff4c053d520bc984e7ec56eff6e84b683c1dba082bda584b5793f7f577558fec46bedb7c84949644d405579659cc31ebe30bd29dd2257f10c043bc90ff8450ac207ce3e8baa896e57ef7cbbfbdbbf9221cd51ba354dc404767f9ef765c66ec19acba3b993cbafc0bc2367de5d846bc4dd6587b51a86f77f6865a5c69d885553dd0cf10ea7db9c0666c1854efca3faf58aef3ccda8060f4efcf978f78bedd739604b8a87b44b522eb8de87dafcbb8ff0e62c441b4f9d19b76425e5ecd1f6ee2a2950922637a1ab84fbf645a1f6413c288b731945d50f9958d56db90aa01c8efc83b73aa88581522757d505b83f6eae06eb6f538dd21d6eb7dabcb0229878d85c8f352a9a4349bdedbfab0c2ab4039940a887b665f8b9de1d992b4bd493db6074fa85e148fa970953ec0ee4d4835e9f13ed390836732b3ea6a89145183f72dbb095d7617a3abdc299e2982d35f1cc30aee3e01e9ec9eb397680c8ae222aa61f5e5a9396cefcc75c0dcf55535a3f423ef142def55898ee23798e1748bbb5464ae0be67a2c44388044754a87a5bdece752c38b504bc444af4ff73a6cea4768f2f681554b56dd59da1c7b88ecef6b7ec640c1bcae9bfdb5f864ea6385dbcaec4dde3e775ca9f72ec6f137570fa9356de55c5c2ec92049adcd978d837f98763fb35d153e805a7420d2bb803cc37bdd9dfaa2ebd4d18b4f344e9cf03ad0e2360da2e92d7d87df71bae84dfb53884e91499fc0d778cfd04fabe268a2204d53c29b62ff74fa88de56da3e27c3a7fe2c6c6c65470d1a3ef85a3af1a963bd919ca3c437b43d368e6e7a19a4d7258b8bde88b474229f673499ac54db247d97225e755458fc6aa6567496d74f16be9588c6d9de4619d4c493bf73f2bdbc05343a581e95197b64dcd98f6442565c06f9d5cf4d45218bb9097d1a5e53b2d0679720598fa2bd8f286b60e5c377ca7afb0cfd6ed57e2d7de6a47b993614f6619f97db0059a1569f353577765a8368d9392890f704836c228afd5446bbf7a24650438e6d89d7f143635b1434680156524cdfcf1d8565ca5c7cebae26a2753dc299c10e4968a57f9992adf5cf3ec5966f9302ce35b68e0a81f910a84ce202e64c3aba248cb89c69eca0d24a7682cda140672c00ec7f5c967f3f4eb9b9f5af6ea75409af4684b725b446a31ede99f67af94b958c4b979c2a841b28878b5dc5154b79c944c7156538e6a23d379674bba5438d64775fe1a87d3aca67764ebf83cf7c7de8f3cbe82bc7494dd9eb23c3539302eac49e69e3d7d454bebe6b2394d00a549735aeaa489db025d8be77d841e19d42e6aea4a73c3b93dac5a35b826f36411639e20576a891974270d5c0848dc13a4a46499fbc6a9fe236771e8be35afed96e9f65738c531b8e63c3f4a922a89f22cf8b830aad4c3c7464a69982a17ffb895714eb8f4e6d0a4c447ac97280a7a7b63bd585c521a49bf9230588ddd7034 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 64efa87a12cb96f98b9b81a7e5128a959c74e5332aaab0444fca7b4a5e5e0216 +public_key = 711cb96f0cbb88a8c1c298c7838bff2c45f5f33e3ee5cba7f6dc77413cb58ed86f76df6b3a7f9562cf8b7a5d73c1994f69256eb0ba9c944e46c55fe419475d015e50898ae7d41dbc52f43d50e8ca5706a774e5d79719754c6336d124fd2387bdc183fc04efa3a04a9ddf9ec4671fb54ca6ab16afebc20ab4f3efe9116f9ff4e3751697dd60ab8bab08ce45dc89ca77e2f17869e645b70224eef5d64f6706f256ea90ef1c502024858f9ec89df9f056f3675c1a6eb229ee184dd845cc3f7c5fcf93c566ffa732c46fa8e89c5b6f4a5a827b625adf6a31a3fe324e486ecc746027776a95ffabfdc3c436c690e3664ffaca0168f022a99130bcc402bb7235ae4db7baaddf7981d6557dfc44788c85d6bf1fe35aee917837a3c3d5a598757e00f77b6b785436b6840a26e51939774b1da7cc8d89fda55e6ae49f316efd6927e6f29c8a9fa94a8b1e3633bfdc71138851ea6ab3f84e6e18b8542ee9e36cbbc7edf29a59ef6b3b7e20866dda8ccf802abf47a769676550e2fc52ce438c48946eec2f756734bd467fc501dcc312bf6fbc9c8ed32dda68e444366fd84869d375b59687c94a685b6491ef36193c722b7b4acb84ce9a69388d13a984f696b96ef2c3ecda5c38c2992ba60a38dc9c6783865d93a9b886963e94efaf73226cea3f1db9db18c549cd5c392631dc4732105eea618c943b8af01c784885c6ff7c56a6b698abf1c76a039b3e6f95c466dbc31c4e73778a9d587db68b8a8195e886e829ee043b909733f09553bb942a96ec4cbda148fd0207eb6d0d9bdbcd62c89ec12f68a1f15d6479de869b88fbc9cde81de6ac62bc8dc844aad74d3a2c9d7f2d1a992bc4431307e2ffeebc70e3f6e7199fe51e354ebfc4ab35f6d1aff7bcc4fcce2650e44e368fb493d6754715736f826ed19e0ffc07e5b5bccb3d0d26effbfbfe9383e600c85b6cdcf26c89ded5e7384e8c3555497c07fcd7502f53714beef79f7ce5cea80ebeecb609c8277e8a5484f30e6fa40b18f4675c95d0dbd5b7c77b1dc4aa297fb8083bb79f3dea0c847062ee8be2dfab69bfbd56df4925db5f4479bc12dcbc835bd254b891bf373cf5c4971cbd81128f527d7fc2ee6479217c70225ed6b416bdf0e8e8acecb63fa6af4e7d31bc5d312023acf66986c72af5cd8a88d767844d4efdd5198b965c3df4ef44ffd64610fbdcb353ef98889e72e8645a0e91692b8857675afd45b6cd3e374888b40183720e1985d92ed98738b63b8f3bc87e6f9ce94ec70738d705f38199bb78c8e1ebaef500d7ee1cd93c956cd04a5e9ffa8b523a7861b7bfa3dce97d82449b00b8961877488c5d54232eba79aaa0d33b3a480f5acbe47998a5fb09ef7ac2fbce08d6bdac7b6990297504194bc13d487157fcf3cb952d439646aa86c47986d26dafd704d2c70bb200f6e8309e87291fc552ee7ea8438ae4236cdd74315a9dfb034443e8d7ba0a249b312ac91a8e92754dcb0bdc8e4615974cdf45026e614078f06bdac3c2e69eea19e2f8a4ca1b0febc5cd33a6076e6d23d39c97ca930599ab1fb93d58c09d663de24e58b72ba0804aeb7917b7128480244d42241dbabf6572afcf3ae33a54a1f9c65dcb70821393ba5e78ba5acbc0756dd8a02f8afd156dc73958bab2f2c0d24c2436f9f00b7267da9f8b2678c14626ec +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 8a95d71228acaa5f9ae6f9d9ca8ae55fde296463b41083a39e833e37c4c90f88 +public_key = 317771b7e7746698de15c76a39356cb459b78e78f1e6abff108e7b237ad4a7cb834a743f830934043856e0dcc37683db3afca17aab6ae2c59ebbd57f52d84cb107b6c5e536edd3ee57c3cd404a61880daa1dd87e43e9fd4f7deca8d998c927451fafd5429c643b35ee8307553fc755ddcd6d9003c35d4ed780c3eecebd5764e3c47a9e3063978143fb9a463bd11446394a287888b6ef4f57b6c0548718faacecfa657148ece26cfd11cf7386dcf55086419275a3ca59bfcbec4c63e5b487d4e6626fd495e7b54b9641a2ee6dddba5794b4fd42e86b0007444cba4db26ec6547c69a9dce8b39f3b2a388710578043b77513173f6fcde90854bd6ddf612e1d48e79435eb17680e99bb933cf32b1ac29869ed98a881696b3a47fee7bc4a50565ba52e57d4eb2cf3c057894878434d6e789ee8a594f94ac55748e3cee1170c391b6b8403099929afc60b4f383ce5cea598d701aa5b60e4c789c759c137d3d946416ee3e6e48c626049f0e2f640a347a2f30560304e38ab8fb78ddd8fa17eba1ba7e1a333a3d32f44dbdd9aad8d58593beee09e93291c8855be8003c6cfea4a8728e7ab3799d5e4dd4349fa5e4ed9baa17b41b0b7e89ab5cd0e45ff174a51f45e8badfa7df523bfcb64c43fac3bc5b6532bf4ca92ef45e1f6ea815c865bc7cf3cf87891fbe234a49b625cde1169c400cac05359b6a15c9f330eb2200fc3ff0a4b94a8d757688ae0c48d0ac5c3fb75dddc38a8167c87c51cabd1698f8e3654380cbc8819599699615ef5495efba00a8afc806ced4965f183b37bdb88ff652682e02b7e26893fd97b8a7025affd7d62e99557751a6a1da7828d8ad03d0c62c9edd6fad9f589594fd729c17f38c5c83bacfe5bb8add8c1749a7550765f873cf2e3e8be9db4c50b9e5fed6eec32add89029f861366d9177612d83ef1a1fccef55342494d8c326d5ed8960a72ff34dcf3c94275a0b77302f0b82b5eef1bbee5539d3e11baaf10323e4086e9984a3d2f4274fc55bf84d95903cb543902aaa5cd39d0353d4ee86814d7ee9f7fbc17d35c68b25ee9048434973ae0613dcff855291d7ed5884dea10f54ee9f6ab883523459dbad7b51ebcee8accb66f4a6a172c9a26717376e678771b44d9d55fdc93988b9c9b5af98907b17487bdae397b8547ac8382f9af8a78a91b2ced5f117f00e839218a74d171dde90334ffc97d9976b7fcdd4b742dc6bd2667ba6bcf4dd6ed314f6b98de7e1bd7a71697988752f5628ffc7abdebf37e97a487e542e8c78980ade8bf4c0fe9ebf598580df7cdce33ea96368c8b8435f5507429006883fa88ee4e5791c2685f61c9247f7f378478492ec90778c5fb8aa4a70e6cd4899dbaffbd5799ce3795c58b62b5ba8f7c522e78365089ae735a7978f5d9ea8c572a6544aea86b3ed8ea9748cf6b5717103a6d2ddff5d87a5e1aa94beda8691d454de0b547ea5eafe15d61399804bfb32eb8bd857b885191dba48f9f518ba798dd54135a7441a2e7a6886f0a0c665a15d318e3672ce6e6f6e4e618005cba6ea47faec63daba709adcf48a4e7fea39b74dafb13d4a60ac6eba8abfcdf1aef758ed8215bd671d8867cd2794fc3da8983b410f149ba2ca7135eddf83ccc8d1d4e2f1e83c9d8d4b95e33927f84741e362d80c3ce5833b7f2498d841f4c7e0 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 90d79d75d0bbb8921cf70d46bab497022a8e750efdc99e5f1bae653275441c7b +public_key = 6124f5c6bb62e806d864db84676e3486836fa07896314a6ea13a56e2f467483848c355e602e4c6cfbfcadf378d85654a640f4c5e1aa3ba34f136e530299ef74c23e6cb36d04a549b19db794fac3f7c454fd92f3f560636fa5acb57fd611a1e95423ead94ac88272b6cf4c89fa0635a7a838c38d9fe1d74d955453ea44ab5a7ad868cb9c071f5e706ef4a1dbec4c9d8c5918f757fc5cf96be7ff0064c0c47b022bf44df3daedb2ef520be70f0bf791555e5b69cba050d875c78c18455d3d51e521ad54c651a738bd3fda29ccfea9fbbdd937827c6503745e16ac5d79ecd4006fca98a66acb75e9187fca7ca935c090bb8d31b6062b345140def157976184ae873ebec9e878a3eb37b661fd5eb5f45fcc6e4887a8def4bb44b89cbd4dff1e1a9b587a8c4a50633a9f386e6aa43e46d649da46ab698e16f0eaa75943ce16eb362d74ea824870a94cdf84b38d809bea8c994d3fed057b78ea6685fee45548e6bb681b3ff5346ad5467558fe6c345f6f58175a84edcb32b378ac3cbf4e85739691f34c1fe633c334df7d853caedddbde8a23d46328a4f3536a44bfab94f2c76c113fcb086e5c4d05de9332dc40c5d9065cc3ae5c861212b898699ce1d2f4a04a77bf165b0bb057c30d9cca16b4dc91f8e7c197a4999372906cbf38386d67cf7d1e36e8e5d4613c36d8f655d4985da735d9f33fd9580fa4518d9a34eb63ba77cd63af7cacf15860799d381cd34e34f9e4a1f5c3f543c77d3d66c374a44df4a7efaf609befb845a4c42f7354699bb169bc721be75ce8cdd6e63843f543c0a94e62e388fc21c313b3a590253dcab0a61d3e3aea195b13cec41e38539f41c6e22d63f5e6d825e7e82ecc3edc9ada82aa5fb766cdeb279b75e2dbe877b8fb8fbc290f56efc05f50779bd2c639a67476fae83dbe133f36ea68e4afa9d330dd0dc3db7a87ebb970ce767e94c007ebd0203fe6b1be9548b61bff4a43fa5cb73fae1484bf3b1394ad69efc8885d02be49510656794033fb325dc7e13611126afa639355de9c04de445eb5c743028781587ea9387d7e88b3c904f58803dbaef55aeb7a392c14a4dc858abb9d537f8043c652ddaeee6a5983e5bcdb65528286e0fc7ad5a59a0677f5cc965c562acb9d643df293fdbfb35b21cbb4321fbb556449c5f2ed8c46744e48c578937cc13dfddf49b79ce96aeaabf31892597b8a57683c495aa7f9bd7b969f34899127ed4accddee4049ccbc7c37ea5868ba5c2f4a3934d6599ceec340d6a4890cf8d84ba371456caf9d5fda9a8d905ef53e54332505cb9323bece4ce904c739433d99fdb35461d4b3f949c87359d4974c5cb7dd54531e86e7f9a69b8c78e137a77c0eb6b1ff468d1bf973819ca6a69b1e74daf8f3b35af55e8405f84425393472b3b7674503a86592947621dac8352a64427e3e3d527e6ed6cc78bd85412d97561d9e0f329f3361485d138b80585cf2a59a04896b3bd8c7ec39f3ccd39dc962c34367ef26a076e7e13a0d61f33b78d62d1fdf512aa96fe8deecc8db7f46bf1042ef46bfb594d5d59f26ce167094f966c7d88da77ba3a71d18693707dd7cb7cb4941c599103792edc82e47d8e4aa9706db7fcee5e924d19ba561843c3b7df3f91b4ff04987cc4a914fc6ad33290975bc0b534d415efbe43f7d4a4b917723a +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: be8a32f97b9a8d596382c02fa2a0eeebc15c083e970ddaa4f2622b91d6718663 +public_key = 389db3e85bb887d46ec144b4d8ec8bee8fbddda538eea77d818c7081b3bfcec68d4a6d35b81f80b23985c6d9cb768d568286b405f937e99a8ac10bf9a927940c0a7cbd46f90d23da1c23a42f3a437d6f91dce36e39e8cf2ea8b9614cefe767eac74bcab99bc452b9c5829b586e5544e27432f06ba9c96869f6cef28a0a70fcf95213bdb2b84b45f29a49b667f4848d7543baa6e4f8b7b51ee9a5d483fe3df24a3fa3af6869f00c8e9c6c5bf4c53dbe19fd879bcd7843475b4ee0a559454a7375ac14e8c37444a17ae64acc751f56b2ac97a1158c76bb9976d85dcd2386e266de64744f9c3da3b82ebcf13876c20d639bf5a5ee94d939985abd149b99c249445f4c9cd85fede02ec536bc8fc30f9e65d5c7de083296d88bddfd4e39df6dad6ddad4457cecf8a7964fff45997bcffae8eb08d8e84c659937cde6d89fb59d765ea9713b768ce15d99e7386b4037b961b8eedd79add8fb9f8ddb71ee56c349b453d2a3bf22c56730bac0ce19c4fa6ec009ed3ed49f8c7d068cb76efdba564855289bdcccff2b179dc773eb947f872d05c4e37357796ea67ebbe6cba898bfbfab70c69448ae56df0b36ef9c451a3eb4b83efc8a95d799563cad55bc89fb3461fdc56ab434c5e9abe9363f1a9f577698af0058b54bb5b9a7c4fe8d148d9dccab2d1a31d77ed1828fce208cd3700fd2a95b755e14ef2e26f3bef565b02af7d98dd46018cf65c8324fdca0dad64883da659826bf838fec381f700f435ea40c872b83935bf6cdccc4efe29c81e33ed477babe011fcd645d79d5a3fd42038c615a476ff35a523c7761d4560554c8ae0532e9df3a17aefa8059d8411bab5fb96b990f737dc8fca0e4dc1a3b9913e8efc143dcee85d4e3ad56a994c4dd7d768cdfe6f679f1d93b81973b46352796d37b4f9009312aa957a51692ae8a65d514ab5bf7b46e0964a808f8add5e765384e8c35c900c4899f03dc1b53be227a39fd8b3acfea46bed8832c3855535fb38cc5cf761ff1e359dddcc8dd0d73422ff4762338fd273645c326e81a36bf787ac90ed3f6d758ae71e5863c66b914ebd05655b1ecbd57f8444e2689ad91a6915007e100ad7908897b4a3ba94c98ec2037e532a965317ecbd55669719b5c613abf45b3335d734b718779d51cc5162a91e5ff622a94469e09a41e8a9dbb3667312bc8d5ab7839374f689b32afa5a25de333126a495569d9cb37d02b18333a7add255b905f4e7eb856dd8f7566b12c99d3add794f4c0b78451777a3789c834c795f74b65881cfd55dc1875c649fdbeb8f811e49c34a3b2978468e10ab7fe9e793b2856666a7c28473afbb467e60ba60333dc5ef681af07c1779c6599bfde061f54384467869cdb21ab7d8a6d4153aa68071eb768fe9956a3b16229bc31fa3ca53e5048c9dfa03f52c24cd2c92a6cfdaf8c5ad6adeb34fc270f3b8f76a914f888d39b59feeed4260fa68c0b416e6853e9cb5894253a12aae0171d8e44aa4258cfb54739f642c3ab2c5abf1b5967c8fcb377eb91fef8c0d4daa3f3ed4a0f869ff4bcc458f4c118a4b59715c6f3ecf5a304b2fc9877d1aaa3af43a512a680f4eebdab9dc816b95c339331f5fccdc969363977a7b9695dd6b9ba358d9bb613862a0561ec25ce0d2dc86f262dc0ed164c2ad357a709eda919cda2c4f880 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: da2cfaf69e25b2a89ff2557bbb6f69e01d8e2e7bb27a7a1ce7e40fead16f33b2 +public_key = 35775145cd98e6756148b3de8ce75a67137ad245586035fb765ce5824cd8358c45ad9fdbbdc3525543a66b2f854bcb8dd9eec921bedf67e9c8d8495865b3bf16c39ab0a86cc33ea52104f416f7bbe5ede9617ce67e88a40b4532b1ea68832fa4825dc6e24859eeedf10ea54e4f8d654b86abaaeb52a12f742fccbb3379f1d68d7d0769bb5684e41fb791c70f5ead44c79cf8c1ff8d987086cda07546811471cebc7eb7e8a5c554a6cd0d62bc7cdb11adda8ee95239f844d275f7423c30f5aebe91ef94242636644d6debab5026feef01ed9c24058f8077cc2313842a5ac74bba5e26cb78c4f8557cd38dc77f86dadf5b190dd6fbfa852c5ac738f33c25ed7b26d635a09a3e3e1fc9eaf432a06c4cc89be5ee7c4259bf79631a9756f5d86145cc2adca6255edd58ebddef549d2c13caa2e8ded5ad88542ff1e998ef16e39659c3425c3eb4e6cd462df5337597dc246db984a881adf5f4777489b9ae84304372464ac7099b6afa24a9545b3ad02ac8b9c968d0b4b6ea9ecc0a83550dd7ddfbba36de29fbdb3af23977ff011bc29256f2ca7cfc7c4c334fad5db489ca290390e6ae8bf18b564a0371580d6fb923eb35983a9cdf85d66482864cdcc437da33be3e1299328adcfdc5ee812f25f2a98e77e813a0e6c5ff11573873fc512cedd4ec3ecbe1446a3b45e8af2f53ee4fd4c3e3c36439ab128c322b0e60a5c4da27f3ae622e33350db050e6de9fcabcbd8fca80beb139a7e5a244e76915424429f3750abec46d7b47b380845e91d6f790a8dd8f00bbf09a6ba608cc9cbdfc6c8f4cc194cbf2c73dae48899a058bae66f3b0cc1fa0d2f3f09d995010644fae989eb94cae8128585933ad107f829416d6786cd7e99fd31c08a20f5ae94cfdd8aae8ae5ce77c185d5bb085457a8eff805f31d1d3f301053e9befa1866b634949bcb4c6952fb78376fc91bbdac8fefd96d1d987db5c71e39371f894adff3ad99cab93d5353ba013aef5c5879609d7e7a4345a0e81a793ca012a6610d9e2dadad6903b719e384c827ac62e3bf590f82f2aeddbfec5dd678e5fe23d85395663f82f399c187cc2784199cdf8e585b305f6e26f7ad03b05aba3cda87eec6b1876f3dbb37dad789f7e8ba7cf0ea792366117d3d8601664d6b7ce65ad3a0319df55c5b59e66545ccdc9a2aaf9d2eb89eefad17026c2a4b88cce1fc96816af697c5b5f1896d44da60729984867d72234c71aa5c8fed44f05dc7defa39cf409b063e68bb28b3789344bce267db328542a5530233fd3d6d8858f5ecaeb8c913163a97c0759a2dec3572f88dcd48d175dd4b09aec9eb76f956ba5a66fa8428fcaa74e7e237bbe4e09a5bacca54b3fc76773c84c14401a348109bfcd83377f658dd19af3591b7c65bb33833517ce53f7701c5beb2db8665c05f69c6d52e73b41ee2641e9c998e03f7f750c44dfdddad7ccdee69992da9455c3bf6e4c86d5dddbb3eda4f542fa5c255b4f9d037a4264939c4af6f8b8e7dadfeaa958677193c13a4beb776e9a67bfa0b45e601a1750ff9b78cd55d6e2ce9f0477efce65c5c34a6e824e628dd696b3d5b962497ed3433bce7d7537ac4715b7e92687826fbcffc0b6dfcefdff78e69dd3b996b937332ad2161db433ef850b4c8a5bc8a48556a927ce345679d1595b8a12a0e85dc5da +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 511c2ab40782322c06111e144e505328c4e5bfc890a5980a2bbc44aeda4c738b +public_key = 023753736cebba67bbfe1e7912ddbe47c8f7ed9773e4e5dd8e1ea5b658e357473ae2a766156b9a4e84e69a1b3cd0bcb90eebc31f587d886accf40f7c8f76f0aef7d741d4d3e4b7fd4bba51af6be36228d158fa5868df516897ed59abd4819635bcfd96c4a8dcc346f67ac6b956bc861e0a9864766a18d4b8b9ea61a0573fe60a5ce58a87d0af974dfe7d4f599673137dbc76feeea7d6ad9a85d88da912dfd9644980cfae34545375c13eb8e118fb4d3deea83877dce7e58435ae34e5f3778e671917dd77cd683e0c442285da1959932e88562ebc932bb7ae689cd9cc7d3c6e567e6d898b6e135f493f90da37ed7ffe6b16eefd4e0872cdbd513005fddef878ea83768ad44885e5a2dd7bfa94493ca519c14e0adae9dcd739354cccb3850dbdc4b504c2eacbe128f55bccece7c534b5e68b94526aa46888ae970372ecd49a7f13e7197f633e78997c5eca867852e648f15bf3feb2fb832d5fd38634d35de54d7f4938ab88f10c47bbbca3ec3379e7cadfa0d58454dfde4fc7fcc6f5a97a6c3a5649689287fdced68963cf24a05e9851ff1f77fed36812e598439d701d5bbf138ab7703fb6043853415790a64d878c3bb297b6bc7c1dd0370d7d8dcc7d32e6b7544c3226cfca871d52dd65c8f2eed3103959ed0753e91f58ec3770360aa924357316ce8b33bae2ca06b24f1c59abdeb4ebc58f3f75b77c2bd7bcb9a240cdd19eed610915db0cf3de8d78d9c9adca70eb56e376d3394eac39a6a198c5c105c85899e640388ec72ac3dbf1d5917035b9ff5db081b6cc6103b72e4f3237189c583c702f7768fe43c182075a498f8d051e78e6b6e6350e78aba89be44e8c4e968f14b9396574b371fec7d2858a1fd78b546ef13b8cda7e05382e1fe7457ba27a344547ee97b32f56b4fd31c9e6b65ff377be25b6953a4dbc9a6e9aeb3b09dde359efbcacec80033990f38fb0bda655952afb0ab83ef4459ac56a76af3bfd2669c0239496610a4274c9b3e5e998ac948b3e84f7c8b380c1077480789b018d54373a7fc75d80f387fd1f76f6e345bb417c9fbd97add68640dd2fd28258970cba5deaaaa32c8bd22c0e83c89b3e1cef5606c3e09ef88c9f17e80d2ed703153a247981b5b465318abcd0a78ad1bcaa16bd7edb66bd78ae4b23e84afa75d0befe5b599dd9f069f5a2fb430b16f9bb5cf057f8a23186dd925574688ec83ce932b0fedb870fa810cea98c694e80333790b59e688ffa7bdcffcd9b61a56a5a8ea6b85b5861b44b521dbdb6adfa9c8406f5ad499c0664aa9737dd1b1fd9897569a64650c0a9b2cbce879e77ed9f14e3bea6f1b415641ed645fae5fe2ce49f5a3bbe49655649b6fbaeb5634f5d807f737dcef63a80edc5d2f573b9bc5914b97f2879ef49045ec87767ee04d6c3b3c8c6089e03268a5f0c530f1682c5ddf2e48d4adf9ec20a0793265a45bf8eea60746570aaf4dee763ac29fd0d5762666ec3a619ff7777c8dba75516c39fb4acf353157ab0fd787bf3e8ce2c73862dee4d23c04384fb9c5ba0d974e9e29fc20be4f6de458586feeaa4d5c8315bbfbb1f9a446c80b736d60ced7458a9ee973a394f163e54383d14e4f0ae0b4746a4b892dd92db39b8e1d7d8778d46cb0e3ca324d417302e861358385229492a291da3d601a3f41d29a75becb44d66 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: dca92dbec9b260dd97e8886f876862d6effc3b91fcf3fbc986cf56ab93ae79a2 +public_key = 87fca4992854f318a4de4e88f7f334d83a3fe0d5709e89b4ac48fe9873baf35f5afc1da2785c5ad09c4b28c3e1b4579a7afd6fbd9e378119f71383ab1e07e79385aa2e78b70d435bdc6d4495af46be23b1f26874ad9e65ab55e355f59686a33fc6cb78464cbd991fead6aceed135e1ef99428e3b368548ddc3be6c0ab5cf474f59858dfe70fca39624da96efc1bbfbf4568fd49df3a4192a420fb5fbda254fd65e86aaa6d669f7ae2d69954aba444fb9c6b6cbc42b5ba82e36f957089c76f48ba746fd6875f59d4fe083c464bdc992bda9635cbc88ea89726a268a34d5cf1eb9aad5347350f67d1fea925f5677e393984828d53eacace1844fc52b43d408761c385cb559e645696339cad86bc733c547546e64deadabea7a4fa0316cb635a856846d75d3a87b85be944a5587cb33c653e44b5bd764f6f8b06aa8688a0ad626188fbbb8f707b3f6827d87eb8d7e2af5e071d5badd0f7ddf88e483e9d6259c30ef5edb6916de4f57f2258ecf9dcbf075f330e4cca83abd93668b82c02680c246e67f46f1921b863cab9a42f4f0a15d986d58ecabb873b7ce9fa34b7e21bc6c029598daa77e30177357ba8b0e7696b7afe16a97ae2f535cb62d8c947eeef5e952e774e7fb974879337874f3c56d47a0d695797e23e3e2fb7c3c7bfc32167f7faa9f11de8d512865f6a453e3e37c5b0ae1073e863b4a5f4b6c957eeca3bfff8f62f98337cd5771fdd1d8fc4f5969f1826cbada8f5a76048aef2b4d97cb354784b4b676837744f685f87142bbd6a67477b66a9457c48a2f779e097fcabee6fd6e83f78baa3407afff8ff5465af790e033e0c9b8bf6e2bf987ca6521c55bbaebf49edcf6b0bf4402a3e2960a55fa45b448397264bad3530b9b56643a0d7cb9a73589955631883aba865c4d34fc5f5a6b8d596cb2c4ebfb740645eb1af9657d89ea2bc8a92bad96ce5f52f5a2d24431d83ac4e81ef10c6bdba303ecd0086e47ab3f7984363cbdd042cd82d43d64f2bf7ff26958b85c46612c655666ea2f4d600bee4fa70b4c1b9ee09fa6822d0ed0c2786f0e17cf1a9dd934a7d4159866e557947c8e928feb459b2337f3dbca2d9fe62107b5e34aa202b893c103ba5cf9b4591ed7c1f36b6ffb9ac35cfcee189571dc7f411349ae2efd20f35a741cf16ff98175563599d3cf6224ba231cfb2f087525059f9ab5b80f73e10719972156aa30148bfe4c907c2e4f683c56a39ae46e2cf1e688c4504dbca8d4a87e4de1bf6472546d478359ace455c5e395625c95cc84ea3f0e0d4b2e3a4a1228da1463a234c491300dbe8324906b48d5151841a1f4a55966f1d66ca8b1863b6ae4869b4c93e2c6c94fa6af25f37e992cbc7bdf3f6a274bec8b537f89b996439b763bffaca39d1f743db79451cbcba86efdfa9d8567d8977d12066a1817bda0cfb1bda75b9d6c78a39bc851654009bf66c45361dce46fb3cdfe4894c785fdb0184f8db0ba8f1ae54f3f8d50381a90bebd73c186aaa458a2e8c682b919741836397e3c59e0ab75dbdc48976a6a474969356a75e27ebfb2ca76e978e91da7dcd9e43d30bf843b2a5e9d24cf4b2ca948fdef0d1f9a763ba55b9b92261cf1114cd3c81dfbc8c6a2c544af712ce8030ca984dc584e0b0627b3d23abd9c4d9e5087bcae2bfe6581eb7f9cbf532ba6 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 57c170e691d7a914a901b9a11c62b8b569b3806427557a9dbac9faa720ec3641 +public_key = 0e4db11944ed9e33d62c69350a3d4bac635f9309ecd48b362989751078ab9964d8ddf6787ceb3f99c6802aecb70368edc6979c4e4d5dbd8da985f991f329f43844f8d4f5a2cad4acb5f95408a3406ec53426fe75651952f5b76ad0efa465c3dc1d56ca0e53953dbcdee2da352a687441f45dae26b37cf8d08a99308639999e3f5ba89585656a6d5905ee10e46f94dd99491cf385788c9a4f38eb1e55ee2fc96a5c5035a3488ceec29e345ebcf6b1b7288abe95c29b37fa7817704be3e589b4fb22053226a43329183f627de05fdd5e742d3d172354fa176d40dd84ce79da8b6a4cf04d35a4ed6bc6464e8d9e3b88a48c81e58dfc1f67ec7ce462d93433193e51deb2d3e3828f9db6a51fc1c456682733d7f4c8f94f37b84857bdaad6e90706ca3148d533d3d643fc319c86653466f036b37e825462c854f641c781775d3340cdfed7afbcd7cead0699d01098af3657363baeb68abfd683044d15275d0fc3c9ab8fdc8c4c6212fa70096af24333fcdd1bdfbebaec8e7b45ffc2870efa9bf56c8ee86659a618a0a96c42acb48ae125af911558f7dbf0c9cabc4554c8fa6c70e297625286456ef6f5afa756145c41373ab4fb59b2782b4a417ee5de4966d086f9cf8cc2283b4307e6a058db3dee74e3aae7ff89a7c1ac4e31d8ea9df12db034be473e9fc4d89aa84f044e429a43b5ffffbb693a694bba3f3e5e78475437387b78b33261d786289bf0440c44138c84f569fbbe74c1c2bbd1cdeee243a4d82319780b24c593149cf76d946f75a931fda8f93a50ee0eb5276ba96ab6ce5f794e638697ceca94d80585cfdd43117efa3c6cad80dccab2cecbf6ed8b2bd6b7df8c4cde4c4507a56cc97b456f2dd50bdb3acd6a7e01ce742aa4710e1674c59a824078dd04b882985f332324490ee6e39b65dc7a93f863bfc831e4d93ebfb25607d3850bba03053fecac41a6173422abfdbb4fe0efadc1e8d9a54d9e5f54c3f344296ea64855dcb9fab81aacc9e731546e7d8464852f9fd8904ace7b84509c2f66f9fac55bf68378d98d3fccda468543a8944b997563726fa4d50c7fdeb479daa8ba43938333b897a13cf24fdec790f967b2d9708c6b67640ca9dddce5636e3c2904c6f3856d13e9d4ce3d94965abf1ee3fce52b7dfe54f9ee68a8a3bbd3446376d6eaede56a7a7fe3d68805e4fadc56286e9a9ade91bd5cdec8cce934ddd757ab3e1f68f6677b5e9bfcfb161d58bd9a6b5e2f85123cf34673e2559c89a634abc2a5a11324cebbda8d167880f6d59bc5fabcc23487eda84f3543386e0b8d265ffd515e816315532e3ef0ea57f380a5d9bdddc2eecec93c275ade244d4f6bf7f74bd9429fdda0183ca2b7af858dc90243af6334b36b0ddcda5cee605d463b8c350923b4696b7eb733762d189c9ecad8c19d50a4946388d736ee73c62f47cdffe453776730e88531f07abdd8699e8bdc9f05cbe2f275c453866d475e9ce2a592a115fc1e0c6b8f093f54ad57d7debcf759abeb9d883eea68c5344a0ae96cdae4ff0e756070dbb496535b9e83f5c02badae5533141bdd9f0e3c760e3ffdebc855734aa9947f1ca4b879c35b32c862c933479d884b2c675d3e1bbd2649ed7d4f9db557d4160f307d975aee26905f7fdeb44f418d3d1fb5b081a3b06f87691170917a1e9f3c2cdc +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 6b5a14e1473abf5a33d44975ca2088bd8fa6fddcb3f80e8fd5c45b9d90c24a5c +public_key = 6213f5629f6a648db6d6e9daabc5617126aa519e68edaf64ad67c5cccc5321ce38e4053b4376924e6cb250b3a61fea868a8d4ac3179589af9197ed5d0efb6915b3526d945cfc183dafd4dd46537d908af92cd63b950659ffaa57e38dade9cd9dd80655fe45979c7efa6c7bee350ba0cf433552f8df58c79d91f5cbff17e7f326ef83b3c59fdcd21bb5cb1a2fb0fa4cf9984bbfc3363333f561dcb9939566e5914d9fd7b56bb7db88e426fa61f8a81ca6b55af485dabd6645d4fd207d6e9fffb3d6f4f5285b49743dfd47fe50fdd4a6bad34a456bf74814ac5d4d53d78dbfb58e657844ffad25fb799aed592a3c88b45bdc275c45a862179557d43730425e548a56815979e282ccd8f938dbda03d659a3a177e6b8a63be01d8342c9e7f453ed5bbb1634cc1a7465e479f20db6f2a5fdab8ac807cf7a8c555ec20a995c25a9ea9cd9037ed85bd65c137a630e787da7a6b039c385740d6c79bb5c20e39757eea72e3cd16f6cc997464546283d76543d9774345ad6e9fa3ddc309cf5cea332ff25533b7983db495101ff4a42e4a8e01e504c4b96c017871b5a594eacdb242bd1e076d43d07a366e343a08ac561ec5a08168a1d6e755d5c33bd69360804ff647d6bae5cc8c7f47aea46d093fc780465e7be49566f35728bd6a8230984a6ffe133b63a9cb4a7fab4befe053e37bc78910e41ec3ee89dffabc0764b3cd5d7382c8db34fdea49c988c5aaa7ae896d117d2c218fa59c3a457f382f45aef2ce5b3d29a5a09dd47547e63916c5f6c2f99564eb87e29d4b62a35864f9d939aeb37e4e9bfc533cc9e8a424b5a1f73a65a96d5edfcbd00678b646e399ac794f2dbdc9b26939b09baceb79ffc55aaa528673ccc4a5b844ad0873b4d6a31465cc479d3d273bafedd46f6266ef012f83b42e5f781c3bc947872c78378164cb0e077cf9ad87974c75ca527aed41a8b69a3d73e8eec1873965448b14e3d7c5c2e8717b94ca27b354ff99de1f581e966eec3dce96d28e5a7b6da8c9a94cf4354140cc5e3b98bfdeb9c95c7c8728fb878caf093aad281efc453567216ae5804ddef7f03bb0c9d741df964c40ad3f20d7c466ba6b8f78bec0795671e42032d499b0e3ad3e3a874c4ad962bd2e5cf7a9af7ed57377dbffb556334797fcf8c702cf20129b856e747b90aac0803b2cbc7b0bc4f8583c8e0f0ee727e0598cde9681429616c7b3f8bd8b69194ea7a64d5ad288f77b652a49c38eceb40893deb651a5c65bbc05f4da7a004e61fbd962c34b10c1869a003cc4cf86d39036778b3ca33ddc500f7918d0df8f0afdb3718ab1c29e619ff94867bffe77bab8c94e18ce551587e4ad3dd54102a4d38ab73d1f3967e9835173e582545c5a60b3aae5da7852c9d43b945668bb8b688ef56057ec058b2cfd6310516e33e38b75ff3d86da9dd92cab099fd6cd376531bdb8308e5a4d2f3f3c87c36e7ccaac88bd0a7d4cfa3b3342d74a02d888d702cb44bd3e201f4efe62c7511493c068a92717cc5523d45c0ae97d7f83db35798354797cca789149fae9597f45f9f974a2d551e8f6101d44d9f73b3113746114ac94b8c8e291892be9c8016bde14ee44e26879c02084b02afe94caff284956a90cfb26f9d71847fb901fdb6603c3bf7bbf5297bea11539fbe18868709fc57dc4d46d7d54159 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 40e593754e6eddb7f9cf176ba2d5fd1087c90ad377556d0b0f686537b1a3165e +public_key = ed7c794fed5d9b58740d13cd78fae5867a5c3dbe40522f3efcb3696953db45fb699c26caa918c3d914e58aaebde4484e95859a701cf510d6380c2a323e34526f2fadb44a862d4e7b35de72269b32430c6b8a68cc3edfbee2447555d8f18aef562ab8fdf2b4de33c9ed65c6dd0ad93b137f94d82dd2dd16b3580e670564b1c07436dc3ad01c85e765dc93da79aff6177e9795b00c5bcbf76e75367e74033afa742b3587e35f065f68551c57af88d90044be430d3030bdb16b4db80e19fa1933bf9987885244fcc6574c633da9461bd8376c42c51a48adae4d0e69f94f3bcb464a74c1af96fc0e82ce04fc25b58711c6cc939c9e02c8302e2499640737ea07540ed89b5335a05c65f47227fe8bebff40c49a5c0f95ce99a0f567af39169313c8b61ba77fd2143f97cc762c8b6be5ce3300a8b78edd6012ce44a1d747e1c3825dce674c8f5838953574e8b6a16b3dfa9ad5355c89780d6c649b58dafdac2e7d4f7758e7eea95f6da97ab5ca71c62ea277d961898e563f47792d99bebc73a74ceb556017db75c3b8b3efc95a8e95ffbd8ebfb5cb1d86a87f93465355a7976fdd0c24744c7b852bac418fe6f0d17de18d135947d9b174cca55454d96ed97fd654fddb0fb4a3364732c6818c39a9d199b4cb5a4d3659c8c495ed39db930104737045ec8dd4e7bc1b86fb5d486e759b87c4cc69a8a9ec38f909d4df0b7ca0897cd1f83fe63abe8fc3145eae4b4b835fb4b08fdf1b2fc1e5cb980cea6b113d82b32bd542ea8d64d8c9b119aef45f4cae1e668938da51ccc08c09a8c43e3a82a581b55cae6a394efc5e46ad9884344ab6904c7d5bcc7572aaf61239c76ebc83e2557f61eef5a9578fe0b4ac8d57b08e7f9a8d86647708483407ba16344049f8b842496a64f84d5b04f6414f9adf1eb10f567ebb9efa009f79e263a2899b770f8b3166eae5bce789dee3cc7d1846f42d4b26933d4803b74c3c3885748a417692f0f5ac2733804ddfa98f45547af8ccd28542ac3d62211a51f454b28559c28d0751c5c6c31045a8ab4ec79ddecca536c3d6a779afe9e75b0d6b6646f0bcd9fb4ddcc92c6eb88be4f2f1dc7962b7d569dacbbfc7ac9cf9df8d16c3b6973ab3e96b6539a1461f8631c6993c776fcf488f4ee692772645dc2cc1541874c02aba0564a46186d05f6ccf2bbf7893dc60d2d44ce1e5b6e317a38c13fad98bbbf79554ef2882fdc5e11588fae96fc9dc79a6a8293a39135460f96329548507d58c3aad7ab9aa7fe913a7fbe4c466f693ef2dd6f619e346a4b75a2a506f6c787cab948fb76f4398b2110781ae2764431e476364abe4ccc2f0ac6cc4f9e7dd49ebd0b369ba96fd5f396d8637f85b0c5d9b3692f08d69eb7dee6e493d841755ceb5f194c3fb5f787f15a6478db7b6b41336001dfbe03f70f9fdaaadab89325b6a3dda4ea99df1c8c6eb6ba3721873f1f4f5575f35d8625685db168830063860965a72af7ce34a7e934b9444e4e1daaae51b27b3ed73886a2ddff29d99f1cfa8583b872c9ad745e455c07e5b905f6cb4f378fdd931c92eed53a97379bbed5768422488d691bfc1b36bab3b0762b8fb6afcf39cdeae51607a6537b985c3798929a4e4b4c9b1894c605134f482b42289ab24793e2d7af2ca0cedbc27d0595b94c698bfa000840bb2d63e1946 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: c152523abd8248bed40c3827bcf0f8e8127037a55c780695e2c28ea3e041a44c +public_key = 109bab4bf5fb498e8412fbe35378df2a3c3bd9fa7e55cc79c49fd7fdaba1833452ddbd376377f212953c5363fe615eab051fd8acd348b05d761666fd96c7c04da93c902e566df563debbff18c9359b0b5391e8b03b485e3ecea7ca8eb2a41df6b0f83b84c4505a5966f648383c9abd16638a3e557ae59f5fbf2cd125e9ed986ee175895082a78c137f792b5da5661f39cb66b3f7ce376fe332260cc27ed5972c4b6ecef6462d3b712627928cda42ce25dd3d96b7f14ff09cb9fe9937517cffb7c5f66e3b837ec347643a6a8a4d9cf99eee67395c84c2aa8bf1a8a4d5ebf9c2a6f7028deead468368c4de87da45dee76ff5bf87950889692a838bcae7b2b47c324db7761cb389e447b2a540ae35ed628d8341dbb2b9aa5f04a69c611d431b28c17ba8dfd00499e274c9492840cc8aee912e5be92759db9be4f04ec059c546d458f3441d6adb27a802c3c3f8759a90bfd141fa63c75d81d50d90eb1abebac9c5708a9ba50656b4e761625ea4f2bdbd678ac18188450ddace2b99b3f27dac2635a62ad88321de7a9a75ca2e1bb52586f74ffeff1f4bdb1696a247d7da6cda6264dc9e892cb08548c0c98f4168f471e29d78747e69b4549b62b634a71ead53699a565d635faa7ce45899396de834f8c4856cb2ea9ebac858d9b424cafb5ba08afe433888d178e7eb1cb7b1ee1fc03607f8fc2a94e9b6fecab6a95c98d0abaf37d0cff4af5c8fcc939443176ca4bca59ce54400dc763aed630fa7cfc39f604e6ab0bcda993a88e07e1d8784de9ddfde3c2043f97f05e4fa75c4c6d656412d6b43f33cac26950533b4b063e90dbf3e45587509acbcfc57acfadb6160f5345a599cafdd4eab0f937bd5a5620a5f24e6b194d5fda13ef33b13cf951cf7108f62982d31790ba4cdb4524be9f781898427b6a1adc7a986f88ddf7b39be1c7d980dc87e5faea924daef5c64553f8f666a8f476b772784c3b13494dab57b06f3f0b2aa701acacdcf4eb8b3843e9913ccb47d5dab48cb9d85ab5b36bbff148c5b4f39b42e901a4ee2e1184d33b88ed1e6c3a9cadcee6fbb5e634b72187030bc8dfc1a3e81ef8bfdde828ec4a2e4888d68e4bafa3ba8622a873144328023f5fa66c14286d272e594df8f5560c7c19e98eef238bd9a48d1407de886fdfaced7e5b25730fc0d4009eba9112ce25b0bde6b3ce54945575743cd66d85906a8eb25ceb202945287a6d8a34bce8f7ed501b6b1303fa1b3e99b76143cc1455485b3802778b7ee6ff10b976cd2caf6f165ec0fead36fb33891ac77c9265c30db5a513baca25f4b8499932d5633b127ab98d8c07dae704fbc84049572520eeebec7d00b363255f5aae136eea5b7c741445cc295f666c5437b4d54f5d3a421799318098f5aaa5262b4618706db09d98442499e30bc54c86838e256c24ae481b6bc33bf076b04bbc799fd615cccbe8eb66dd3c97da6a89394d4c7e07b8c4d5c70a01c9e7c43b8a37c3a09e7f8d90cf6d943d28b5d4dced76c2a49d0ca67369cf5b8231d7a9debfa1694e9ac87b03606478605d1eaeda279294df8a7c632484723caf8b38b52937b40e20984c47bf3de8ebee06f9da6a3512fcd60fde7b8b2dc987395af460998231cf0aaad8c1dfbf3824cf7a6fb4ed55ed1ff461d800b59a6ffd7287e1ee3fb94cb59c39450 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: ad6466dd59f26b762fb02b19eedf5f79964da68bce0459b91c3a6ee5a7e01183 +public_key = 0356f6f03687752bff1abac22b5cfb1bce9567f3324fca5d83be47af24ea0055e4d94ed39b7efed69b621ffb42241d9171e6351bb35177b85bb5063161273abf96e989ae803e647820bb53b38fbc6d04cd3e075a4a1b6755b97252adea81c7911437c528a5ed007d9ed82368d4c833edffaa1b8d6cbbdd825957d461f7774baff227f8e2689bcb59a3483c8346d23d650e06383556c067f94d41ece171a4eefcc96e3fd769623861bec9bbcca4a5ee2fc10a36a59efb5d7153859df348ef9c3a2745cea329a73cb831441762820c7d996b88c1d453c775a16bbfc752e68bc55839d2e79544b87af67de9f02b794b166f6de6de8e0bdc150dde1af8d0e37bbe5ff7c7d48af57adccd2949cdc3d9318a0cbaa35ae4e18db968533ab1d9ab674c89784e87d69fb4c86461e84ac0e78d8c9619dabe7bdcf6aaf057aec4288becf3dab74f8ca66ae84220bfd0fbaa4b1186dac85f9b92db75231958e20a3f55b8a3397ae0fe957361a9bf41a4eb90583d8d97cade98f8b8a3a5ebc36731ce9fa7346aa427c489f56c7cf3716928c9082b36d3f3b830fe348eaba325ba8c49acb2673570dc5548229ba93a6cf10b586ece088d6679c975c6de0106c00046f5e43cebb0ceac1ceec1779556a95ac68776ca0136396123fff76cf185339d79b4f6e7cda0012af60acb7cc0583e726f3b251cb8ed1d49da83dc2faaf6a71d75abcf4ab1eaf73207d9222ad1b27c9da1c5f0beb7686843360b1ea292568994cf8bafd7d88c1767b885f3e955d873f9c73a1fcae517ca2acd66641e37fbae6d217ccc07f840e20e3440eafddaec6b726eb2984fa2ca4ec7573bb0b57a58a26bd0dc6de2a346f774fb35ce8dc6f1ad95753688b156b51066eca47b436cd5576fed323f2bb2978df2fe49eb9cab3f41477787a96ec6667337fa4ea29b44b7c9610ab69706f8f0557ac7c9f9c55ab4a04fdbd5ecd4e57b943bba0cdc0f4f567f95b8b436838d363da78da42ffdecd5353dd4276b4dd6f5d59faec385bfebe9767a2731fa8b3ce937ecd9df8042b66714d98d0ccd675a54b3ea3c32293da56178e6c53f60f70fea47e3499dfc4f9d76a7977cb467899b456ae2d96f8e93acbfed99cd8c8e3d22ae5024da9ef47beae4f6333dc8933c5fa5f20dbdbeffb23997f70d65d493d949e84af69ac4f027b34a13ae77f185af5f76ac9fabecf9ea4eff65f9e0247d3abc3ca08b3a1d18ea8c75a1ffe433781e759d25b9cc673b0273e77ea93b56667c1508fc4847d2973c6436e4d953aac60929a36baeead25ac10abed841fb95e1fcd5962c5694cc3cd747f260ea48641d9255cf6a4406fbf095796063435406fd624c57244e6f1496641778efec883ae47544b753340f749b488ad95f89784f15a6e7945da56c9e0d2c35827ff13403609a1c938c98c68c7da0fadc5aa746ae4ea9868f19b9ebd3f82ff592960b436a7a7301e4c7fa075ff50762b866c4aafe57ad35f91347a9dba5cad62c35b28a393305f79f33a0e6e4d3e68fea0d36bae734481c43918fabe3acea8f6a13b1bb584938284c10e3806ed935d8e543fd5bbbab0685f099c2aeff54f59d6d6e05590d0be644b3fff3bb766109561f03ed164792b7bd991fa93c14a74086a585353c3e620d3ec5b1da6ff7959016b53093137c512dfc18 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 1a4d5dff5847cfb48333e33bb00ca7301b144aa89dcd412ff5a3b1081d775b7f +public_key = cd18700a3e7a52773c57d435faf794021bbc709b8e7d688a5dfc686c1593132ea9016c3bb56ea487a8fded47d41bddc1d13f714f7379e2fb9faf5aa6d0f5469d7e56800ba258fc5b26dd996b6735665a806a74b03da8e9a593fa6695e57f7f85df397e24be3a543a983a6bf4264c971a73708eee57295f46583fc9493d719c197c7985c0a7c53526aeae77de8e1faee2eb4b57c23ff320b8e56643cbc9535a27658a3719e23ce6eaf7798addd888053bb0de254eff63d296f9ae76bfca756539b61c62dedbde9af6e1678b51915d33452f9096c34990b6ece9ceded394ed49df66cecf49acc96b7d98d10899c453467213d8bd24ee764f0f37480c34d8396ef58ceaaf88ec042471d14d77eff85338ab8caf0fffd064bc38164071bddcc78b8074e7569b6f7b4aed416b7d53877ded3b8a6c10a4adccbe90b48774233d4ffc776b4b1f9d4098c603896a612d725986cfd00d83fffa66eabab82db734f6deb5777ed4e9afb8b859b6cd166dec79eae43eb87e794a1cabd83c14b50b85b7ea7e48745c9f8975733e4f62e247473ce53b86edec6df5d5a45fbfc1cf33a396c87f856981c83fb74542c9f3cee1276f3096486fff3359d5eac553931c8dc6bd245b2114c4a2d344ab53765d0fc82c4e412a0aebd5ba6ccee9bf09e375edecdcd55bb6c727be26bbbc4e7392293c59465d84b164fc87578c646eeae3e384e027bc07ca7401dbd097eef05f4ca86d3c73ef8f73dea3d799369133f83f4667a92f7fbee2655b182fddee233433f9c68b5dc57fdc8617bced04fd961d4a7bd17678d97f932aadba069eca8477d558ee5fc5eb4e8265d07b8c4e492d6f6216fe1dd53bfc43af034d5d2f4ddd4858b1b9c9ceb63ea911cdbde877450a9aaa8878a2fa55d89e184d1ffcecf4e390977dbc11e78da5d8cfeb86a4c087a1b73a6099c99836b3cc76366d35a9854b4bf05f5bfb696668796e4117163fefdc32b6db37fdeab0a0197f79ebd88c3a355877cdb23e3a303dde27e37e12b4bfba0469208fb1c2e8b8173ce1e466cd8e1ef86f2a3a4fe5a5fa2d476b9f78badf5e420b77d489386face67f2731655be9fe4886867b79ef1dc18f679fae87826a0b65b44a83da5a35e17f3bda3467552ff8b80b35d5ab869c5fb5dba9b8b30936100ed32d67bc93747c392469c29bf88cb73fca84d01e5bb47d6bd322ed8fbf93fd0aabddbdf566d3898e1f9aba7e4cd11a14c3e91858938fc0f167bf1457dd1f6c774e6742e41ae452d7dcafb941625cd2ae3dee613dbf3dc6a039e6465d6772d2ce84c693bd16c336800f730ed6beb95940ff783cf9f3d7f38a7f4f37754f6c4ed27aec70d9d741ac89e56c989c0f60f8fee78b5b975d54aa705fde97a7b90c3c74200359d66ebeae98b1af044be41afad859ef4276fe2f34bde30dc63ca48e7409727c9bf185138ae7859ce4355834aaef3e74edf1ce4429cdc12d0a49abc9d4cdf8ae5cf34d38adf4ee5f8e5d84a3d269f0b7a94b61a8abf9e557006fc7856defc9e332f2b652f17ada11148b8e594d1f377036fef4d637659d4485d909543818814fe7a8a173bc8aab7067dfc927d9d660dc8d30364d60b3ef1d94a9e5f586cd84c168ef577d43f6e41a614382f4982426e93391380c4b03db38d0f7bf0ff66d2d93c251d3347c64 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 34f44ec2092eeaf686f2ea170591a98527cbb03a4fa9477a7aef6b41a54feeb2 +public_key = d8b6c56dc931d12a80932df49098eb4f2d64c5a9588e257835ceaea2668e69e9d7dc5e58c3cc7321d83b9703cb74864c1057660c7e8c351fcc47bb92612643313c356b7bfcdeac80ec5b657e78cb2fe9ad15cf8747e45466847d71c49d1355aa845a5c10bf7160156d49a3af1d8b975d694187bd6a5c2ee1ad5d4df309ede9a4b2e248697f9a972e8bdcd048c1b6f7581b0fdbfae4c1b9333f60e73a0edeceb3ee9887cc712d0bbb5c34d54553c3c7c972e97f53d4c46c9728f6e8955ac10e7ca6d6550335916d6a939f6ce67bd68c09d85650e89b40a46870fdbbda2eac3e43641b26d0a84bad0fec9525fd9fca2d916b3eb081e88a378d3716be476e57ce39fcf7fcbd4256ca64fe2ef25e474b06bcac9657b31de3a39f4cab5b65bcd8896655eb924243972b0bc9b755b0c69b83713da07937652c9ce4f71745572882d32fba1208327e4ff8f0778a215b8fe6f4a14a9b3a56ecc56f09c49cb3ecda853db13affe5d395a00cce672e833f6ec2cea5bd6f0bcc6ec6b479e334fa543229c6e9be566e8d0da1dc7837c7b5651b8b6a955efccddb63b92e3635a5745a54bb56198d325a59109c75d2b733c77738a23f8bf147ded99b7ed806e2e69c3ed836f0cea5d88b9ec6c6d4722a4f60a1c54553aee88f1eda9467c816938f9835c1a40ad2223494c885642e5c416d9ff23e6e4a109ae128e53d9b264d61d798c4ca9bf6abc72fe779346a3208a7754237fb591a6ae88e996ffe7961284666c85ba92bfde6fdbf9b0edfb91c5793e48fdf367f46f586e06bfdd66bf62516d43df4e9492d71dbbaf568256a158f5b8f094b796a5280df5b817ea4042aebe279c2e3f543021364a147cff684dba448b7010b4ddba6aa90265a969d5f141a9374a7da1a17e799e8e3ecd77073b453cb2b6d83ac9cb8267a596eb9e3ff3d345581a074657554781e4782d98333f1237dcafa48087aa66df4f09a9a78701bd9d45adb5d9f9ae77efacf6b5d8befd405ae61fdd3639e659bf98f91d427e1015432f0e7ac759a67e13f4f95ce876314687ac377ae48a30b48ba9986714e03d74f087c953ac6f86430bba9cef9857b84a3e5dc43797a9d92af4c55310ce4f64be86949d40ebff33ced5371d448fa748d76f98c3f638a6bf5864b9bc5fbe496d72966e40d4409f4f0bc4353a5d55d071d843d0b8e6ee5bb5d6c4dd156fae99a43df586b399ae5ff5b5ff58a4006987613f5caba694dc0f736f6d47af66673e803d9a6044339df3c818cd420e679f07fe73affea4a45e40edf928e79584f787672cee8e9f7ee1d9430b9b3f10f1ec266876a44d7d82e7ca5f6dc4b8da3ef5bfa302fc790be4f4cc36438454e8f6c19de2cf5bf61fd8c489bb87315464eadd06375c34b5f97a238a117a8770cb9795776c11f8a54ff13adb3fa77df3757939cf8d03a612324858b1ea860235e0e25f84e46d35b0cd278db841c679a47b93e3b09a9f735955d6bce328a91f2fa642749e7b747efbf166c47e9683776aec12f51eddc84032cb0a95f594f4c787589ffa345a43a68a193d5e492a39c307bd2f22c60ce5a8468d3d50cc3965e2982e32b938b3ecab1f36c1da3ca733f61be3a864e39e21a9f62c46741fddca501df33d04a79f8e3017e6197ab24b062cd98486dce2a7ffb22e5798643cf9ba5 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 6250c81126572eec2da330271db36ee591f060fc7e53eeefe2e1c476c675fa33 +public_key = 702f424d97bfe0b7cfeba385c65f5355abd372fac0c543d55ee490bed57446b637fd1cd7c173b2c61345186ad289feaa074accae383c762d8fa03a6a175c3d1958ee79ec833057a8d3cf34aeabd1377cf1bc85f77738b17dfad3eae594ea939e126cf592bcc95d3cb4f76a8d8383b318a48f758eb6b94e9e8bb47cf22f9c23c4800788cf91e465088a58086fac5e3e61701e4606c54efaacd490298ccc33f00154342dc7709a5ca5ca3a94b8afad8ea734b7ffda2d15acd47c6aeada3ef343efcbee73b05e91ca8b74bef3ef1b85d6b595a3dfed89949ee1178dab0219d429b93efb7b52a6884d401841a0e8e93953a5a6ff417d09f8e5934c10a7f2d0ee8d0ff93a3df69d9cfa4d7f68d1d3294771156e8299f4c66ae8bc798007aec8eefc3b417663479dc061c9d2749df4c0ab981c45d6d11b8f307c8f1cccf5ec764fdad76fb31e7aff53dc5a5a468f2966bbb877d2b8335ba3bfca9858650feb9a1fbea57ad07f8ff3c7249b2e45a37db9c104438e77de6321289d4b17d0134eaa2f1aea24e8ec27a9adc0c768e1b3c730ad8e33f77c90f4cbdd63d94abfb67da9a15f336b679937ab8f5989b9a450fa5f6a3d4d37e585bc039a164f57ee78907f689dfebf46d05c94c3057067dd3a2fa8f5be6a52c3376efbea3fdeba68e147e6d91db7376fadda56bf3013eb8f78fc8bbd8c4b0978be0ee4b453fec81fba306a63c327978224597c3b815565e997bb7e299ee02d8b3eef786be75e96ba84478c1c629f45a885ebeaa4ca443d8a33013e6608e8c2f71c6c7516ca5eb453d09e84bfdf888ec592dcd53fed23b5ceb98cb575c474c5ee7fd64d73d54f37c5efe1d432b225decd6bddadf6d6d847f9587bffdd6d414a558c3c29e22e47858685e79d3ff9779b40cd98fbfec3d59ffaa9365f443fc7dfcabb54a80e5f8b7ad799bd90fec5aef185cc95579aae5caa2b59f3ddf65b267dc15b2bd465cd86114975dbaac5a564cdff0fcbce8c68763dd0ef8ea9eeac55d4b8ebe9b3c66aa387587ed49565a46f3d5459fc7a47d75316b59a371cab01dc3bffaed8003d5f868b39eb6e7ce319ee3ab646db07ccc5ad9367b352d1848b26f9f01018f7c8d4c92f1cf22d8482616f33adbaba3005b58fe3f48e67cc75733fec5fa5acf5a41ac7ece0ab7e8fca811336edd4c7f97ffc9d37899ab41bd638ddfff1c73e82bdf7620bf7505ec849d387b9f7aea345b5e2ec44f3ed866b9574bdbe3ea1ddaeb7a78d6dc7b5b0c9838297c05409bf90d86b3c1b59b92c998a8abf34fc490269f89b53ec5c5368acd762df8ca04f0f35af9ebfd543fd67169aac2586deca4c8174386617ac9857e366283f3e3da971d6ff364ffac96a7b0c45779f7ce7f21e7a2f1b454e3557ce5733cf9791575ddc5a88da4db9eab8d99c4f98b142afd731f361ed3d950cddc5653c83dba87658674c57473dafac42f293bee54d34b9489ccfe5e41ef4fcd91b3c3cbacba19fcfef6ba4b0b7e6d826f522bf98546ff356943c698ae0948a50f38dd8d8b3d32553f7c467daf93fd24f5b9aeb8fa6220d856c2e400164e8a9ba3e783f5b911a582f9fa8b9fef38174d5ed8382821cdce5ca491c0692b2b542b6a67ec87bb6b0334c1833e12aa958fcc0747802853f8536c1e24a0ea6e13ce23c96726b5cc8 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 35d470bcc5880872754810dfb3f2796da2fd7f397537146f6488c27804072b34 +public_key = 0115e0677c6c12c76cf7149f3513ec8df3b24324df9716a57106fb5365a0840e69b71fabf0075ab50e32d61d70aec5566fe953382ac3a47d5b8576d64a05fc926b765ccd39d6f86ab9bf7cb93b809e77dda4457bfb8b6be9aa54dabfbc94fbdc3e15ba6defb08beff9a469312a5caa04c8a4fca7c76c09d6c6fc4d331f7d84a8e6099eda485fb9f26baa12665be03d882d2a38200798de4a5f1d3bbb581d85ab19ec03e896f25b8759e43795dc83c2069fcb2cad06be66def78d18c9f0e0e59853c66bcc1e79606d4963ac3af33b43f88f52e06b39d11449013bdb35bc65c266fa66f759740f377fbe3119fb4285d5613e6e8c2227a8a187b133bd8bf6be54745451fb6f7e0587c24118573f46f8e3da59e96c6a67df6c298dc95fbeabda7fd2b3673bd64a74d2cee396aa406d3781843f5c9d03b82a4e77d3d6439fa79a2a6457d908eca8134bc88ec5764e3e4018fc686ac2f59c3fb45a580d3a50aedf74add391a09cb6c559623c997da498c1d10fb0f9c5f54c36f66757849e7598ca4e333d68da12aec1986e7b23d98b7db6db6bfd521e287f8b0cb2163ff36395a60af9ca4dd7e20925a4bf497e2ed65bcce78a33555ea469e97bd5a499bc7c2b7888739e6ab3b961f35d94cc96659db67bfeab52260456bb775f56e492564456c6df5f3d0c9bbf8ee8615aa37c2e547265e12e69deed5f928183f9255dabf2e834f72d7752bd68200875d83d3e3b07e51f28aec8653a463a774dbc337728493863d4b42c99d3e531b0376beb153a56734888cecbe59b55bc3cbb32da63d908345c3ddcfdd6303f3999bc873db53342aae6ccc789b2a4d7fc7d08a58feb9c939a3214aa3b2cdf7ab108aa8978fe097f9cbaf93a696e3a8f56b7765cf3cf085f6aa7dd8abac213f7314128aa64eaf13d5a53d2475f710fa6c354c1181bacaed645fae9c750aadb10c831807e4d37f3791c03ce39c79aa0548f88a69dd6f87dd49a8e643d7332fddc5c5b5fd7d9804f3c57029cfd3fe65d87ba7c086f4fa35754421c4eeb6e8cda1c5435bd9acd0754e04439240988ebfb5f6d6a43c0683a287b5686364fb9fc6a6265e9160464430d4cab4f428dac71ef5879becbd9c5dc919076620ba7d1a2d8af248672e2bcd107d6f15a6eecde55e20ab84993fbbe661ffdcaa6369518f12d7a91518355528eb1ba7eddd147516f2496ebcfdf7287f4d717835705df2379ec2a5ddbf56ec389a3fe2e663fb03eac53273058ba675dcdc3367c4872383f683a834b4a522caff7708dd22153aaf57fff24f439a0d382fb05d69744c4880e3501e4efe9a999675d6f2f5651b3bbdfd0a73c02634dae9695e95dc67b154455aa749a3ff2919db622ef59d2fe93b5245797adf62f94c114d9c691ee70e526a9a05e49a294d12aeffc740cb5b2b5dae88d9388147b943a4263e5dce73affc2fb6efc85c0666df6430de6d6b83aaf0880b715983bbce2fed75b1c973046c79f72436a420b790543349c9e7fc4c3b18dc8da1ad346399e80fbb9bba1a6a8a1fda62e7cf4d68da1668dc682553134738d0dcece767ce3bf74c82ef5c548f79de1aadf2b9f36100a7adc2bff1e2bed0066b9352ccc40663d54bdaf0df9ccd6353381e5030ac08c3920847f233164df98ae8ab017efb305fcc83fbd22ea59ee59bb +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 8d667921c5db401a86fe1c35dfcf164a6bb2ab7400fd6a0b67eafd4a0ed11940 +public_key = 801c4c939e71c164522aa3ac246eb8c80b8cd3e644f8de69fabfd380bc575968901ed7783b6969c57461dd879d488ebda106a913d6f9bf6ef788d4c1f92a71f908eaac8fd7d1a6549aed61c6ed44746db4e715d3bd58511e4c3333556b75f6a8945b8662dd572c764c82ca70ec97dcceedcc591db817deda4659ee091c75f9bf4eb975867e179d38345bdedc627b7f5b4d83fb7b453d9b15710fe7afbc55beb26c77e9e8a58bfa764fa430f2ade928fa4ea1eabe2ef8f7d54e917093e0b5f7d8dea4c5242a8949f658b548a2ad1badb9a6322c56697c5e3bc2cf9872b56fe1f3fd937eb44fadb43bb896ca9a7358f45e1f28f1fcb361c6ea91abca91ce95a75588402e2fe7d1e37a80b3c880aa83c31c5683783e3bc77bc33eafc027fbeb9957fe8ff8d8589bc27ea2fe2475750dcc7e9cab13e9da2ddefb7727f5e10fe90adcf21fe5879b3e7fb94ae0692d44d7fffac68cd723ded62ef7d959333c08aaa16bd9cc1c6f440504dc795eebaf7bcb4af46b80bbd21d7c8a02ec8d0417b759dbfdce94409be96f5b5abd1f2d7a9c9d6c72ce8c7644e4b2d48d78ce9d8f6e7dc4f4ec3328ae3ace8aa9aca985964597686c919584114c4b2429308f1f3fbe9a8fb873f70558e7bdad7df8c7adb5efa94184f395cb6ea24c6106eb95cc0868f8a6452efc5aed297d9349e9b39a8daa3e37925b87ada9a5cbfc5a542cf395bbca59f95ab2c4a5352831f1de43dad6db419cf05149d3973f6d4aef7b7c6e59c43b5de3f4dd05956dab69d8904e7302588e39cea2136ec62abc8891e44ec4c739552eac0aeeb448ccf349dc88c67ec74e57d474935ec69dd1be48b855ae3d9855b8c97e31985c91484a695ce9931267c1d1ddb9ceb4bc7c5ae1677cf67958566d59431a73dd4ecaa8beb98bb0eff172b3de14c9acdcaf6923fdaae067c9a0e9b65873d873139b9555b63a73bf8c65319da4f3d4b9f7abe86a95b383a8cdc8c64e70dcd7da536befd814cb6c87900ea94eed7b51cba571dc7b5e647dbf4928bbb28bef66d770e43cbbf3fcdc6165f1e2b8adddc4f972befdb4bfd8f6b69028abd5991376057e367c4e54114ce4607cd46a9591aa744683d4d24b857293fbde02ec7c7537dc581f48c0aacfa7e47a35f7f157877847ebeefd73c0922cb211c4538e0e8c0548fe9c97c3d98cb375f78d066e964675e9baf3312559315796ce3504731f9ee432a83294d75d8365391fb348f0136a7fe9d921fc3844f57d286845d6d663e855b50d884f512af021bd9048298dc4eafbe4a8398d36dca4735d85ffb66b34d5d58d32d03e74fb36b325f7f3af34ed280863b5efd99fc4f9c14e4433786d33f880d8ae5d40fde9e75861c7836490dafa5b0771ec09d5f794c746c4f44da9f26899c8488e4967454d7a4aa0fa743e2d2838bc9461446b61dacdd6b434d098f37021c763123ea84bd75d33374b9067aff5f9d0c5dd490995875606a7baf87b8f4960dc84a7eba96f4055ab6043c9fac6efbed883705893aa89899ab975284867f73d35a49f902a779c8df9cc64aeb944943691b770a9646cc83ea93f6cb3dc4be83c7e42988dd32d08a7792e7f9c7fbb16ca81f07c66d436396038372aeb8edc13e083d95399084751bb9f3d32490393b510796c16c630cd2d7e0666cab62b5d904b +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: ec750b3939385a3f8df868119dc76f77ca845567ef068de6ada5478a56bc78b6 +public_key = dbfdb0029f41e30d929c76dcf787de121d43c8dc4af20e4f7ceba48a4458164d8b2823666c6b406856e6d823c86787a413cf6e521ac8c16868d7eb56479d90289fd444b8bff59ab46086631d6ad761a75a79d76468b74fd9dfdcb978492affa78bde882a09461a3f5ce0dd5de5b3dd622551c94dac7abdb5b7b5e3f80fcf58333f8b0382ce055a4c138c80764b8f98fcf153f4026fe2034581b2876efbc3ae9687cdd8ffacb964cc18ba90005730d55673be5e9be3173d3e33e166c7ac0193a4fd36d85bcc6607d4a6f73367efb5ac1a2ad63fbcd207766da429d1b8b6eec7e45bcdb73584b5891f0ee3251a84eacd7ae8ce6f5246fcf01daa3cd69927db4175ba47e225a220ecf653a58dc9854210087ecc2486ab1340909fbf902635d2ac331fcec9550fbb55b73b5dfd63d3885fd1874d5b13e00a993eadbeee978393ff33a31b6a98f72479ad9b88d4de395c37f6ed285b793c489e09a8a7bc744b46eec884f7c3a9f90d19fa1d58a5007ab2219d44895941088a81b1b44175ba3e7b038ed18beb0cd5bbdd1bbea3f58812b5eae69fe6b2ce8908fe31a80897353a328435b927d377a45a6be34edcb32d76cd4f8371d4b772ebceae6ec765c875312cc91e73b20bf8e1706caa4c5fb089faee43d7b61cf4b706ceb7b3739fb92c53268a685c03723b4bc316f679f4d8b87375a4188382e81eb19125d2e60fa3f523bd563eb30298815717ce232ef83cd675f01d6ac5d4c37a78d9d7e3bf3e3c40c6d5d92c44e98659849713c090ebf7c78689c6d57ddd9dc04cfeaf5cd56b12dde3ef8ef6958aba8bb7f84ed58829fe384786379fbdbb2b8c50a504a3b0fb83eb5964ed7cf0b908731ca5c13da8dd9a2cdaf7c7527db5d262c65f7d2e32355aacecceae5fb7d59e83e0d6d95da97871c51ae7c1dec68dcb6bd7a9a697b9bd9cfe5a643748c83bc8b254d58f0c93e8dea9921eac6f046a5dde713d977650935ca69f5d6f1dc84c7ac6935f7e27c8465ea46fce97c64dc66eb22ed188c7a3afbc94c24f3a845b3530e355418d5c881b999a7bf8ef185273e584b9acaf26746829fc6b1c88ac03578f98f7eb6705e11efff33c94ed303d3c52b5d0b4debbca883fe49b5a234bf70bdca755658448666dff384efc9cb26a664106c49aa46c4237d9ae0ef37df159a0c9e880d72475671e3c12bc4451f4c6b4946cf76c7b57f737032741a3047935bd9e697acb231db05b27d47ea8a460e4cd9f7d68b53dfa8a1f812a14f86218f02eed4d0d9eb9d62992de76497edd986917592ea9d2f33c499a9e6576eca4bc8495fd7f33ea94671a3588adcae3568d4f1c475ebd788d683967aaf9b07a3cc9ec5cfc91b6ee0456c18deaea248e32d2eabff91dfc0ea6ad88d3ae3f4769e298aaf954550fa3cf86944184eafcc83d3f1be393b668dcdc2ade55bc3be84dd166d570fc4b8644156cfd6c8976cf9059c7a550d4b63d34fb3f1eb887b3ebf764a911ac62801a6845d6589b0acc55e4c80cb37a3784ab8c048abf3ef04b25f069fba2d6b75cad8ab3f133678889a99d346e3b49c0c51e47deaac27bfb7c8aa3810e3b74bc1bf0600f753a48457bd4b7b624a3fcae443217a88c65c5f64ad793a5e666453692c56b790391a7c9297e5224771c7a441d5363741dce698c33558c584f +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 74f1d52af09b12c36eb062ea7528550cb4c18a3ce8e4f4ea9fac43ae383bc925 +public_key = 670855bcfa88903da50045f08f5a75de6a8e3799cc4afaa7affdd7788547e7b79c7507bed6a8522cee8744ded1463c9d0c28328a68b0d3ec380d04a20b3eab8ce6465e5aab4e2332f30870c60f4719be412c13b70a5ff8e6f3a1a32440edba8f5ca66d968961a4ff8705b9778713cd96974e42b5dee9eb61eba399cbcbccfc8786f7963c15e6eef9de94ccf37db3ee6a31cb57ba79c9aa4a5da2593eb57cf9498ab66f47dd7b76971f797f9cd38ac336f226a64f92ed3a1119b8efbddc103358573aef4ab68f8eb4a5f889540913b2400ee8693dd694597d1a2e8a2d3dc3c268f9467ac2d1b67f85d37523cffe7e44b951de52a9ed87a3a35e3fbec420be5c80cf64c49f72f02ada2b9e324a1ccbed6f7fa1ac81edc3dce0f84a727b36a409d25a25ac67e3c76629c2348cf478e6eb42bc413f79f0f7b677464fbf25c9fa771574522dac1d5ff6e3c6f3860b4a4256682a3e7e09d5868719a1e9babffba9517ac95a7d1fd882939cca64d05f94791f47d93eab5f2d15c1e8ad9b9ec7b3739ae97977c3ca0baf9f093272edd38794ef2ab98c9dbe6f1937fd5e4b8d15e69da985e7cf833475336d895db5c3c87e4fffc526b95e7516ddc53cd292eb69e4fd4294c854bfbadf0fd5432dbcdfbd03414b5a4a3b7c7cf379d6fee8be6479c193b7336f4c870aca768d3ac2d94f34b43da1f26db1062e4d469c8c1529bf31b3aac01a3ee2ef31f389a27d4340b35a463bedd2a7f8327dd5abed8b4256e8712abebe8ac475c32b97d11397db247a019533adbea61c15b9aa4bc91d45af064a608b29f6c93acb18b7c75d9798569a89a78463b51b5bbf038dae3c5cd133690af8dc1ad4541267bc10c83344bef439d6844ba3ea1cc79a0c5d90214ca72106ef6346d0e8f76db62f74c6c736e4c8b63099d14b5de20165f2a9385f8645d7b2fecc7d8e4cb48bd03967f4d70ead7cbf7e4b0c43debbd664cc858d4a74576642eab3c76d3eea58274e1406e6fff7d084d7b7c0189d4d97a927a8b008b85888c57a0f6a307234344a5960836cbf6f4473ad988429a4ae3ba697bf07429d17c059a65d9e35a845735ba0a58e98a3d7377cee61f330243fea671eca0465be530d363d49c53cd44b0043d7e5dcdc4f8be5e1545c72a7c3410ba1bebc8f7314b3badf95c676bfe6aba9848554fdec919208d9329c60a793754be6f56ddd30db1fbce1dd765f5e548abbd985ac86d1537ba49635641b3a27cd5def36de94593b2e0558567c5da0abfcb22f655bc4cd3e985eeda6c3f54ff765e6a808ca387cc369dd1ec9dfab64d4b3d584e5329d9d5dc58d801dd57d9ac8ab4087967177cb3163cf3e934a951a3e248a54ccaffb6ca6ce9b4cb8bd788023e6425e75aeddce35cd3c59920c5ed0356fc0fb5a1fddd35b7c82727f6dc8d63dbab3c78326a26c6bdf9fa5fcde7373aeca36cf6a438fb39c38a5612427e593ea3bb076320bc8b5e85fd4777b7120ba97c3f8d35616d5d08dc39324a0e3045d0f687e902e9a2cf7daad2d9b86d869febc5b513983428f7204ac584c6b338157e937e68efbe5866a8569848f51171647b51f7514db9b8458fd5b9a89119761c7f6508a099961376d6ae3706f6ca1c8cd31f430190d6231425b14c6544cabe8701f8e475892fe31b587aa42d334fd189bdf +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 4b3a70d85f640d1a2a852fb6fe96704af56a7415a8ee4282e9207bc3a2dc116a +public_key = 7ecf6db4f73dd1859b06a852e89a4846ad943e65e3e9ad56dddcf623034a4fff51e617f68997b7e90471d6ddcfba5639da844f0c9a7227c8a22a83b9e805942b77d19ebc45503cf2d369abbf5fa9aa6cbef78ab914337375d9c075854bc9a3484a0995a249e21e9e8aa65bfad76c687389d21126f509daf347366d8163803c3433d42d68d0f8b64cf38c247da3556d83ed45716dbca7ceea50207736fb5ec062a6a15ab8c124ab6b00334e048d8c858ab4b20a368df787cdf9f169aa4101afadbb4699510753b80a63b59fc51f43a81cfde2fa13405ccbb0dd0ee76ef55f4507812454f0a0ac9301d485ab66eb9ab67f5805afff924c1f43a5b26f8f60baca631931bfc6c9bb04d0fb47f7d7ab6bcd6cadffe84ca57851ef3def8153ae6d64c0d2aaa432baaa0539a17e83ecf446dee38cde39edcd77ca85e817a827173bdacdad253a44fb244f47f956146b42821d9298bd5a942d953d1ff024373d618dea6855dccb3f883848c4cff3c64f548cf8aefff62ae1f16d30c5fbf9fbf8bdd3be6541fa85b8683493f8f39f2fc01383985aca367d6cba52c780900efc79976b794c70471ba5cc89d8e4168d5d9e6605337f26199c355e9236a855ef063423d777773ebddf164b2385d98a25c9fbe9a7f9344ac12aa0b66ae3809465611f3f83ed33fe33638788c82e7abf7abfc4df9c6da2f4301e7d465a4cd5e3a485a26a3b8d98674e9e594f24761f16545817e9260c4b40abffcd4e8a2418fa1124dd043a6deb0f8dea1a51ea2f4fddaab5f3aa64564b3c336586dd85874438d0ead481cadf7ef099d8b938945c8fd4557c38afef753709b68088684637bd3afeb78c79f9c84873822caa31bf584b0fc93b0853815f4405caa5d9147e6c837bf0ccb1afae9db39471d1a573fd89302847939178d283affb11ab4d78c4d7f7d68eb89b615d3f59403fd7a5cde7fd1cb922778ca806b3067dd5478ddd9ecc70cdff92ca7ca0ce6b6fc2a79731f6a9e8b83c959f381ad561f667e92bb3867d3cc663bc5ffb48c9984d3b4814c9166e6d03ca71d0e8a93ffdacab8a55a61a6a59eff846ef7d6c453b7949edbf0f797d49de262a6be41cb56425f768a5b1f2b730697fbc9dd63328fffe528d82ad337f0eb8494faf3e7c83df48e94d21ca9ca3f660d4f960a6285f1e586d052fda083b814ed4f29717b23b73c0c14aa6bd55f9470ebcaa89429814ad6e8a6190289758354043eb6d8194fa6f43f524da9e63dc7570865696cd43c9eb9c5925bf4c5be5bfee4aa59ad9c4d37c822ba892ff626b4e4d02bedf9fbcbde66d9bf4d982e23392a4dce6c57ef60bd5e8717584bfb96e6a6db6d4b673f61663be2bfbabe74d46494ca9576f330dae3ca8a58df3d8d8e99b65384ccd3daa166989882fb1a76c87ddcf76474a74c2985e756e94845cde9808e2ded5f0bb54a1b467fb0c39ad059fdf8ea878baa9caf14de8d5ae96c5363f55373ef5a98890d7e9b8bde9d0fbd23f3e924118e694e74bafda502539d20a8b8f169db73d1bc36ccbc8d4bb76c44361309977280f31a51a7999e65b924be200366ef48eb8fcf8c4c5d3add0c465f7db79f7563dcc6794041fca49a8e581a798ae477916fd78f22df3c50efef1acf4f751801bfeaa5ef93fe27771a40a3d377f0f1b1655f6ed13320e +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 26e38ac804fb5b4d59ddf747715e7e6041d875f99c7b638024b4af82d622da60 +public_key = 790847ed9a831c0cc2acbaa793d4e914bdfdb8bcec6cfd56573bb75e2990a6fcb732c3461cdbe74dab8ea4c557823e7e400ab4ef78e38ff84c270cdcc4c68e30eb664cc8bb32c6e7917ce55d28a195fc39a2ad419af64a59c99664f744a385e13228ba383d752ce5a0681ee12d83f8649a3755b45ad6bc4bc0859fec0e4e186bfe196d3ea0437b3153f457b36d13a5ae97bd3905cbffd0d5377fbd4f34a68c57448e7909cc660a31d9f9540bfe7324e4b31cfd4f465665b5538f745e687f238d6d4f3c9237b5ca35618f19fcf7da879d965b68becdb2467c9ef3862f36dc057f7594aa628604d45f1bdeeeb4b1423d6cf7d9c4a6bb942b8aee30b56ae958b16c4ce2386d3ae6f879dc9ca96a2439e27cd834369e8b14ec6337f54608ad3727cdf23b842b0d3b92deaee70e93ae1497d5b75e2a47d148fd52a09bef86179bae5f605df44f6c99c75df4780183e8c6cad17a1b4a840f888f495acf796e0745adb039fea6b5526fe43f97ffdd98fb756b2553a9493401d4a25b9bbac13b62968af28bb6446c2d670646e9af66383e6bc2b3d8cbb9e6969196bb45d665bce49284c5b50f934774e5d0ca0e34535930ae2e69488c4ba8bcd854f36e0863e8a293bd65ea8e033c754ea44191d9ac8033c032ed66b31fec130ae2a26ff2cab4829a5c47df84e87626f0aae9f135169e100d8760ba30a289cd42fe325a4c90334978c5176cdc5496962443b118a641e6e30baca422d89fac5c968adb461ab43729b6c9b1349e721e6c0226b560ddd323d6a74c13f82f24997959f07e7fce58fa4d87a7413c3bbaead9efb223ec419ce1bb6de701549efb25cdf67df39223c90e2aff99897fad594930848a1caf494fa87bc03c57c7bc33463b77f08db9797f4153a95678adf8b7a565c50e44047747e124c7dc9ded309333d325d493c3b3ab68c34c939243454d90c3c4089e74a827ec78adb0c9e54277b5bbc5033eb1eba3cac8603959fb4e75a23c8c51c98e77edd639a55b56fc557b581bd3935765cf586c95178c3313e9c70a8c15c95fc19af3db1e798cf6c54f68bfb766a61a9c9c461b766b5ad0608575c53d9a622bf8d38ef2cbbcc76d3da30286483ba85a695f4c0f2e591b7347a0bcd932fef1eb3bb8d0fb7d9ec577a69fe4886e9e1974d0c2169a42b7ec7665505bf333ad8df67bc5d380b947ffd54745f4ede5b3da27b78a62f43786ac88b31efde563cde20d358065485a73505a8fa265b5d5ed85cadd1ff28f09db04dd88da84e0c6179558e5fca36ba1d87353995e89a709a1c0a7a10cd8513c4aa26d27cf813df7aa8c5bb9ace2a51b7f17fed8396dd132dcf4d79c805d0eeb5bac88c4cbd377ebcc4fe7c6ffc9f7ebf7f34016bcc1765ae9f7fe62e5ef9ce9e01705d9af2d7d181ab0c4dcc8d1c4742494876e1e8f40c84e2706914c65a162de84a5765aec67c9dcfa4bf44e8e114c6f3cc34e95ae49fc84b041853afacfe3759cc5a28eabd574e2866e3875367843fea254acd9ebabedbd95e365d58e6335c91ee7ade7cf3136def00c0ceee3f5cf70de396725df01053b943c3389bc4670da9857ccc32528920f88ecbf16a9defff99db9912e87321d0faac45c4820cafe808666ee521dc4bed006527df29a124412a4a19aa26c09b490188ccba53900a2545022 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: a319d2b8f114f1acd866478bcdeba6fd164dc4e37b0adfa8d8034afb3e197376 +public_key = 39dabcbbae31e99fa48fbb80f78961f9c440322b49eebd3f0e554328eac7c0b3ceef957a8247da8f8e69cb24a81595cc89f95d70179834da375d55a1d16a7a8fac8e7da64508c97f4f7a53066ac34e4d7b42a6be091696351b3fb20efd05e5429dbda14208336f2edae4b89fc9c9eede0d37392948e7d3beb78b880d3c6d933a73c09d9594ad654fae8a5cfcd51dde7c25abb7020487579a98f62b49c2969e3df7407f9bbf0c1ef37a0994cc83e2b0a9fcba7566d0cf818dc5e1d38bef0688eb3dab99dc5f68f537e23a0366bf58efaaeca57e16b37e27758c8b83135d49f3f38681ba5438a795021652b508ed02876c104d4b45fd6976e368aa2cb92318ee3edd778166fae485dbc5f3809226ae702ddfb8f67faa433b6608e63d7aeb846c589b57eea6479bdb05c741dabf217a6178ffae8224bd05b46de6fea42bffda1e74e238f541fd38fdff48f1414890600a97091e795c993c8ba5418a8732b6c8b8abf738fc5ca7d32aa3f87884021968a93cc271a490df6ec5f8143be65485c9f34f0d433e492bbc5f2e5cfa037428b5ed5a2e404d89aa0bb6e8205f94d706786b3d508c5990ad24c7bb6a70d70e7207d3c0320da222396c4485f579859e083e5cf9c39754a7d8901748c6958cbfe4ee9d2880e9773ff048d8480bb38c36bdefaa5f81f85700fac88ca8582aed3d9bb845228ada79abe56d0952d0c54bd6cde0c565a381b55886df6cd9e9b82e2ea31354c17d2bcd43d93946bb58ed2a57c145d9e9537fe879714c64cdbc94fe943f6aac0944cb3898346dd4d0fc9c81546087ff91372f7efbc798032aaf0ccadf3c6aac788886e03c87245964c9ace8e63cd08d646622eef7856c755947df60af63024febdc05d3d2eef3061dfb2af4fe622d9892d7b3afaa6cbfa9a38bcd97cb26c4745a4eae395a1c1dbf818f9d1c2e6b4da59fcb5afa57e4d70bcfab59b8fb6af3b0682b53fa9f8f7759ce21eea0914f948ba966cee8bd177bfec698dc063b3ed7eee610bf6714b3ae7b44a4ce6c759555c6e478c0a71a90b62a8cf9ff82a4f7c21d3ec5becac2595a766a977c897dd9ea4e4123e5723f2dee667647bbaaf489b3acd17a81ffb4512516893ceba8838949e9a8d43713bb41073013d487ccbed7f31c84481adce4378732d9446a7d716375f7907d719da66dde8f83d72e90530566915ff1b383441124b6f3d47103d64983898f8d83a4fef6489b1cd8a11b82d30cc4d9eb4fd0d99085c875dd58d1e4adf406fdb292b8487b7f867e77f00d9f31ffdb43e2048cabbfd3c7883218f9a1af7a365a19b0d2fa595a087b2a0af016686dbd24a98ba3ea5999483d467d2d264b21ba527cb4e9b75f3fc046bf7fa96bf1af77b05d94f346fdc863b8bd2e92e5d78173d77139d6ad08ed91e7ea507f2a7a9bf982aad8e2f736c788cf7b05ef5d1cb74d5e0ec3fe6aa2e72489222f5632b5d33fc63424a5e67415d28e5edbc42c8bdb498d9b5f60693ba327fff30d6d40f43f454f4bf02038dffe6bb0b81fef4ea6bb4c06980c6fa9b6c89a935ac207be3e091c3c6af6d9417ab8c66b7bce94986f9f596ee64b08a53844c7d6f84731755ca02c7c49906cbbdce97c650e9a53ff78c3ff86eacd5a261f5b502251ec136ec0a3c697fc30e8b59807dff5dced3d6bef9c96bf +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: ff646071b2509e6b75790917e08e4f0b0d9f0116ec6291c0b59eaa4b583ad830 +public_key = 185bb36d9c3ba85a46a506d6706979ebd66da04ce5f1b4c25b886fadbddb17ed4f87b773d0b8724bb4947d6e5344f9466f78cae9dd49876c9f7153e54abc47111bddeac571bbe83577f577046830032ad8b465b86e1c341d8f660818cd308e73c5c558975868f038e470f39e737b6cf974d08e14d383bf907a5f54380b4850ebf7dff98838d9921eaa81471ff937e36af7bd30b99e9bfea844d9e6d2ccb3547d6cd7f71fc12c4ce79ffc30ff5fc9273b5c0edf7934b5a41737817ced739425736cbdcdd267beadddbd77085cd279494715e099c38490edaa2bcaa18f7ae8afc6f6fefeb977f376ea74a9cbd6389336d0efd84fc053650474c802bea8eda4ecc54449239e5173fce971698172f8a6183d358c85ed2d776d93c866c488d2e2bce9c8cd92aceb53997cf0375b47413a66c06541b4343c548b4dc544eea93bf266d9c0f166571906fb7275d414a4dbf4bfda260a5953d578d5aa48a2b670aff7512bf6937e59d52c3ab8ba17d16d06a9d653d81de5f009b358ac13c3136cc65c1ef7e675bb55b8598a4dc054c8b797d37313aeae492fd934a559bb4ed42e26dddd13c744d7ac5de6e4d198a33253b82a0e6fae7ca51d397330caeaac557a8fb564782f43259f4276aa52b81ddf77db547b6d4f6e7e89ef93d7129346511fb6133a6e1209af3009a867a46bf2868f8ab8a932784b76084998e37eaa4496c76ea42ea8d2f6eeca947c75bc4a57266f733409757865d31ca6f7153cd2cd25a9ba7f5adaf9d9176bf7c53c6233e4480cd3a06954afed889ae98ad91df86842483edfcb5df9a365929b6da999e7ca8bd2559db416a7abfdb4d8f084f9244a9203af3d23ea8ae96bc8ddd747d1eb9b79a3cf371dbc4eb56f9de38c3fb77db284d504e85107f468973df684db8104bec488e9b732fda2bcd4db574ff6d05946c9fcc1a5ef87628bc4995e89e05a51757d9f00c43eda4897429773140b30bdcd90aeaf5c91b8858f17d68bc6c15413df049cea710fab59ee57ee6bde6828773734f6e193cbbdd3c63dfcda725c90d2a4e1987af49cc3decda8ea935e9ecf4d74f18ab92977f20bcec9645d3a295c570e7d84c39e7ec9b6a4663a931d6a505e1e757bbf935fb7d8e9b6ad60dee87f47e7c6a4a818d57cf5395626c8a3928de2fcae3316adf3921e6ff60e5051dc8d07fcd716356d21ae84458b4089a37fa9b7e3aa35c8ad1635a7fb49e6bb44cdf4628a3b84b9869dd87df62cc487f44a361bace106553338cc5dd71c45c37a3bdea8d36f55f31dfafa841ded832d3b27bad54ddebfce2e5f477a7e43e3ed946971b0e3f23868922699b0d91db6fbcc834104bc0cafcc7b5dbc1996e6469cf12c9b9dab2550282a9b88f8a1b7edd6bb9de544c6f564ecd5cad68d7f7be4332fa5bb28bc9cb57788e4e7fdb73bd0778fe15f9a3529db0a1f623d08eb7387cef8efd1ab0d7a199735bc3aaefa7d6c6d0aec0256b8734fd459a5e111c9dcb04fd2ceb8c10a58dadefd8dae98eeedddcec09afadd6ec20e9ce5b618f4653492e603bc3d2d3fc35ca536fb7c64084112c878741b838716f0eeaf997f38aff963f17bec592eea7947e8be23fb62735ec13fdc9bb0c7d54a1e51b8197cb07ec66dd1d49dab7f9d23aa8ffa435f2cc7a7a3a1cddab6e37ab7be45fbbc8a +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 0584270ec26f3b9818e4af074d17b2d51037cc8dfdcbe3b140fa4fed5deebc54 +public_key = e80434a94334b45589b1866bcc69bad27ba323a563f47bc34073496a468def7de3330bc9a219452caa35c1b5f2c45c498fd4ac5564627d564d398ec731a9856ff761972faba609f9beb9b9374be105efcd2f6f46bdd88269ceb512867ae4ccca2124df0c046b5e68e7fd64a2f93383c3a5add206f885efc8e81ce50a1c8e1a8a47232787ae5f9334ad7e0d6ef332799d9896a6071bb4e4fab64754df82cc85630c629c3cf068037948b575a1693f82dfa045a9c5a6cf306e83b911faee86db5764fe3ca7cdfca99d5b50faadf554dbec7b49913b371f0c5786fc585dfaf813fa9ced349d9fb3fcb513db5e0cf8462fca4c6985b9dbbb245465a8849c4c7868849fb0ab5bca99bd4c7bf988ea94f92c95d5fc7acf90199eab7c31c23f52680c71c9c333e92adadccebd01edf3c8d7a7c9068c3fa9b3cec75234663a2b73572ecc71e53a8eb5889860a336f77bbcc1c854d0c3c61c75f16373bf2603a0ef7faf8f747bfbd7401bcb9d599b6cdc0fc2111edd0425917c7f891c33c97e9b39a687d10e2fa7850d3e1c9e7dfb3f73246acbb45a79c7848144fdb58388e626cad2a959f2490c7b3695a787d9ae22e5470e3fcb6889dd75c8ec56dd84a43c4399aa587e0782962df20469ab5e6381517bc9059353b78e60ebdbdedf969e8d3e7442d4d58423c3356b34035b9761744fefc761464dd908da3c13f95eb3065f2cbb911437cd2408e6198cddd3f9c87e3b54432c50de1c754a2f8c5f9c32ee9ce9fc4cbb055e4025645e10de468d0af84e59a50e6fc560fbd51eac35bede48ef75b0b05357619490ccfd8b0b13767557c5fdc3e0da985dfdb9c3569df17067a8c68491ba64307b6e8d272363ea346629ea6885acc17733a801166fd404cca58b591b68b2c73a9e891ae3bb173585dfb6db45e133e75d258995ce46a8f798a44ddb8526633949e5442435c7b4cd83875760c016e4665c4a2ac9fc378863a3755ddf78e905fcf044c331c4b976f6ea5335bac73acfbe9dfe41a9f3ab3f669c5fc49d74f79ba066a7d04bdc2046f47c86305bd45195bdde34bee79ccb8d05b374deb491bf6ced6adc45078d3a8c65b18dd6621a68f0ca93c339dac2bccd98c22b4e1fca3cabe58ceab66da6a35192af9ad82c74acfec8243ddbb1a7d15e074d150ff5fd03db51bccc016ae52b8443892b7450734b34e7735633ec6b9de6aac430db0a8954c7a416b43d4a2fdfdd5de7cc6ec3bff7dfbf2477351fb6a91375f48e658d57677fe571c3bbc800cc80ac597a8f2c5cd2fe9567bbef4c797a68f6e33507aa91deae0a6e48d313b48096ab96298c33c3828d645a28098c777cc10ded68c035a71f8afa373d6fbbd3e1d4de4215cd42871388dc899ca31e6babceaa5dbf61af35a0e255b228498295f6b4ae27edff2eb5f66671af63f253dc724a893b9348f9a1cf75c214d78999e1473ad2eb484d4ad5b8d274c00bd9377f3c497e6845161868434c968bd847ef9dc2ec06d1867cc791cdd5061c8d5c49339dd3ae24afde65eafa19d649abdeb72265fe0705edca7b87efb3e5b629eb31279509d78b0e974860ba9f645f83422d38efe3ccb3adc643c68756149a03c5df699eb9fdbad99ee5dd7b1efc0175b9518c15649396d94ca1266979893e82811af8c142323fc3d38b8b5e554f +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 51e05c7b4ca3079781e8293f4eccebeeb2f8c8b4c59468eddb62a21bcb4ab8a3 +public_key = 70d99d171745edca3a65045bf7ed625aa49560eef5d43fad33f9a3cfbf313ae5dc986e4d038547f23ae35a33c06d6e545baaf6b46c41d193db84edf57fcba82b365101a9f24855bd1a837a36aafc823391b1f84e54959a0693851378ed97f34eeaa7bc42fbe3575bf9fb785c457786ac69ca22f644a1d53278d4c2e003f6a22d9a0cb4dfc32b92e906650b484e7e9fcee9aad7905d90d2fb60f84b47dd54f24228443d46f19a18ef9956cd7983ab223bcc095adc664e4cc2aba8564977b157d88e04ebba589653e535847450c86f517dfa462037c2c1457ef4de909d0b79d66ac6eda8d3ca88a7295c4a3ae53cc78cf35cd8922b36ba8b837f375755326a960beab71baeb33a8b64d6076f0889424b1875ed73e6ee5fddb8fdfd732bfb3065c7e91ee5fc24d6c125b652cfb4cfdf8ae9c67cc505bae5b747e68fff4729602cdeaaf25ba334cf9ca11ece36f554952d4b107d895938c9c465804484d521097d696c8efc045709369f89cecd46bb763b957db8f48abf2ad7f53e845c94beb7a3a68e4faf6c2c309508fadf5eb37c134f977461aa38e8073682de07eb6539e905fdc214c7f7fcc7b523cfa33f8afe07a65926fa566127f103b390feef814c3ef73c3e8d02aae12fd389d13f4507df80be8c49bc9f3412f4c430ca82f58ca8b82ff907b986ffaefc324be759ade007067153db7b16168f7926e0df534aed8d50a68f96f58b754afd665e13918c784da3eddda79559ef0d656615d483bfa13baa4884aa83351753cd7a48e6385292a990ca559c8d73da7dd4947f4f8199bd6242179c369741fc067ded5ee765c58364e3fba65535063da4aad934a2de4b76f55a19ab7f2dd6d7211f4a2b69ca713d30b34fddcbd459cadb66620adbebee70f98d797e2bb0a3ff4e8ede442549ba462de5374dba7f093aca04f067f55e4279f60defaa2836ed4dd4acbc2a4a134751261991e7b36183387893c5900e8a611894c76c36f17a49df86f5d68a947457db75e82e4b8b05a3c97f51cd3ed1d7f6e15d9d8d282eaab224b039ceb9c348a3c05cd81496928db7f6c1de40d363a427b93428fe6841c97447698cd0f36052a7f5ec96e135a4d45e143659dcea066783304daa7e059d0b1389048a75429886095b3ec5a646eb1fa09424338c6ab72aaf7e595ac7794e69c6e7c7bd2d8b07a44cee5940f85896a7285846afa262ead92d2bd2969fe975754898bab49263de44b4e0f35563a1e457766e3192dc45e05f6cc19b6eee8e86e607d7e233542a4450fa6c89bf993af5699dc0e469664e7433d5b1882340a1294d4c2f9d4216ebade4683f8557dbbd603fbbebcd956b29ba8a2a06d193654f09f7df07eb3398f7bed1354a7a8f416ad4d860538c378ffce1b37322c4a889cf35918d70459db613c9a5f83e8566a37139563c40d58c055b827145bd659c8fc6b7908a17efcefdb17e4351cf3bcd9e8cb9361985c70c49bae7ef860b36af2fdf63cd6f3b34aa4a4f985d149db8be3e151fcc1ff59daf2ecf510e7884adaac754ae6cacbe87a4691acd5752877840556af8d56fcd848f982b415d333fd874d7959e8eae1ef1d133d9c07ffd9c97551f294c392f644834b38fa844a035cb5458aa7240f750287f95feb1696d88988eb0648c3cc0fa9d4277fd9af8c579271f4c77 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 9eca0fe36c80fc5eba171c3ae66a5b1c923faa50b4521bb055e7bf51005c93df +public_key = e88dd43bf6d0f7b6db3b47dbfa6a30c846c4761f792417ee322d879e3ae58433a2a3a7791d2d4912da8576ccf722eb9e38139c1999e5986b58a977efb054a81443553ad74563f587b226a9118ce33dece0dc0655a7e5fd493b7b3db9584c49b4d104ed06665a3d07383057ad70b69f85b6cb279ff3822db83078e795ed42da1d467a34d91e8e322a08aa1d83b0872ee37576e5a119503af837ecae6768046b7e64ab5a4daad4da6e3165ad036959c39bc6917dbd7f074776089aff76b33dcbb17bcbbe65c5f6c795b65943821d5b52ad1d44ccb5fe3403a02604a1b4d9cc84e4b72b3ce36de898a12451d8c74c280a67cabba42dfcbea68455c5f45bd3fcd3bbcb3f736d4df70737a01683369c8a5719e742d6df089a673da350db8ba39c3ae108aa6a4e2a6f25be3d960dd5802bf40c6dd67dd34b60a9edb2b4fde3dcb2c34d34d0cacd24c890cac7a134cbe83d9fb5d66c7000a5a3f808987558f7c9a7cc02ae550a9cb4f5fe8d5959be0ef84c35b54468c55a16df74f996cb74449d1e6bff88bcb6d019e2aa3d5879cbe56bbca98446e0af2c5193363178dfb5877f40d207819498a98209c109273dd44a4f2a06549335a63a0bf761efe2592c417c4f6268485a7e8693f865c0a7a6de083e53d5e578a74b34e9c3a57fcfdfc825ba59e56359b6f7f358a4d81f7be7d571caaed78d9630e136f402a731b14b9f0ee4a3fa4494bde9aaf2d4603b0ee88b8b49a659d56ff3e4cab9fdf6e8e6fba591fc4961cf15d9d0dbb02ea7321ef75aec2d813e33a9717478be58b49fca3130fafb54f6ffd3243f4e34de55cd8d26d5d20aa5e2d2536c486772e735f67bba974f3a451be5df29c55c7199d12473ae1e5a7ef36cdb479679f1b7efafc4eca7de6b3a0ed1201bcf2525d75a1c9f881a7ae4f4733b149e7c29973588c1626e6e9928d62236332cc67f26a65fc72c785653e2c429cd1f3854eb98c0cf9ebe6daaf4afddac65bc5d805490e1d8c86963c8adeb8756edbcdfa473ee33d37673773c46911dedbaf8d8ebce8d47aade9175f6bc32cf997d6fc502b934d775efc51562625538e25bf35c4c38cdc8ffcea4abaa963b3d67b3679b51a21cbd782f8338a95b4d74eb5fbf6644a58a59abb0a9cdafc8894792b3c6edec9ccf8cf9c72db9ca36fc6356f1d235f28f25d3609b548f14e8648cab5ba6d9e7486d57e5824c538037e3f31a4f7a3b077703a736837dc9b86ff17fbd4b912a3843f4afa829b38174bbdd1cadc8c74697544f6239d68344441fef86325d716339716ea6a8245a3c3c24fb986b74620af517b4e3ac7e8ceb196f15f887a465c8fa0ec55db4718ea58c729f6ea344c49645e49024f97275baecd9dad1c95c7538eeb895f6502ee23ad8cd7dfe968e885221fd964f25510539be63263a4ec6e69f83e9f0086fecf996d2e852f139b500ecefec98f44315d5a88df360e8e823269ff5bf622b54b7f917bb457e466015ec31d9b39494a64a86c15d5e6437c4a43704ed0fd5922dda52818336d93a8c761fd3fd859b07fef7d8e33b52c34411f4e99dcdecbe7db8f00e80b055e19129aeb04398841bc8261444c963c3fd1ec8dd4c78dc5a8cda0f687e36aca6ff667abccdf2093e5ecb1a4f09769a8251104731ee68587d0a470e2ee6ab99d3af13f31776 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 0c5719261caab51ae66b8c32e21c34e6d86ee4aa127d1b0195663c066497b2e9 +public_key = 13568b1233f135a5896094834cf450d789ba498787368b4e16feb087b7d4e8f3f7d74ef90177add98cda0d84820ce367dd5e5fc46faaa98aa7911a867a3789f69a5b68bbbabf3aabd037b5160a3f3e8f77ec47898ff3ba5ddbbca6a8db5ad47c59236eb34bfa9c84b212e93d9f7daae78a4f9f6bae592ac2b5f96eef6f7972df738a9d5b215869d9f4b706c379ab9dfb5a99abf754ca9316872f033ecbd5b3507fc611ce403764da2c86ac7ebbdc3af84729c486116e5c9956751759660b3c7bab67e46f8be0896defe15bff5924eb1bc6302d88a360ef7e0c0ae9c2bffa9ec5e7cb6d60f264d8d4299a7f46c458b3bc38c4794bda8f9089d43864e79ecdd71af69c9f074a83438874c882cd18b69b1bf009497b6fe94a9264470bf8f56b49b6c353374ad49c05cef76fd484338796e4389a523598f37762926efe25fbb5fe9859142dc1bb47c6ef3b4bd1e6fb6997b5561bae038854ceeb41b39f5c1f1a81a80fb57b38e5f62aa9eb36f5ff45e2cf9595073ca623da43f33cf1d73f97a59eb28dd8b1361bbc91c4db34a65f1a2b7db87bdb3cefeb26ca5795b795e355b45d26f3b3a9731228e74c5d966d6937ed057fb10b631b5eb7d52d72a0845be8553e1aadefb0eba3605e42c75857f74f918cff4544355c415ee02d9be97c4f9fe548433eac36c52d77ed787f8e73eedb856d4398a26d536911ebbd9facf2769c756f858d180b6b51797fe9fcd833d9d8d9bbf730d937b77adfebb68fd84372c96c3c05197094ef6d022e9c15f898b2c7ac76eee486afa414ad65be744e0908b6350e55a244838debe4b74c578fdafd7e6c4e15e68421a568e7e39a4a14f31926768ac4a061d67550a8512e88d198738bf4ef420cf75681decac07798c01ca0620fcb2ae5c9b99b62a7349fc9afc558989b68e3789c2c7074b476d29fe2846c8a8d66f1678f9a36587eafc95a362874e91faa951a6995f5a94d47dafc9b64777a7e58cb54b62a95476ccd333d73d6e466e6ab909b4b4cd94daff393c93929d2f5cd5bea833d265fd7cfe938669cbee478c57ff4424014d03d25efe5f9d4149f4bf137841aed8dbc46911e2ab2b7f45dcde5c549f679691632c3d9bae26b9fdb85c7bc43d1a4add386873345974bdd0d7f879e55df79cfc7fd6c39d8bc9a9967548f358caf5837ae5cc32fae78e4a85a19c5daa9e2e59ef8fb37a7f386c0fc86afcd2869e39fca9c6fee6ef9b12908ca5e9ddae1a7a3a717d767ef802a947c7edb3452a377dacebcdb25fd37db41ce7c74c36b32c69e31b1b85f9b68a3b66773ee5afb820ef609c33cdaab4caa563e9bfb3cd9c4c72354c1e894f3fa4e69e18bab1a9798cba9d31ff852e8aff9630c8f35459bf40c425af7cb0843498a3cc7fda53d933ad7393de8de07808abcfb4e6da1e34fbeffb89489ba69a7af644628d104deef7c2f361f75e777b997b76ca8f6af5b9739e0597fdee5479e92aabb218444aef5fe5d8f94d578c709158f655a89300cea7f765fb389dbd62a5fe11b57f273775eaf7fc1c5e28663c62305e85513b753543bd71aa045e77e4be4fb7e7baa5bbfc4d3d4ef4db84af265acecd4906fab897b5abf5af66b4c5adb4e783b417c6fade7ed34ea294ccf8b8c8012edb8badb3437b191165cd639bcde9eb71378e71fb55129 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 0e59f6f9047c784c1f00b24454aa4f1bd32c92ae7e626549972f86fab90e7e89 +public_key = b31cd11788cb97cb439789a67d476d3edf65cae63cbe43cb63bae24ba3d71d78e2bc76ff346481f974a73b16a505c48b9608359a4cd35145f58029a18c1fe7461830785379d3355ff3968d3c63a46685902425660b33fb11b93997f6dae0a5bb96af7d563d81f3a3d40b1c30ec87535ffc6fe528b1e9866cd1e69520e376e017e087748691dcc057b95cd4d6d707d8b976d6a67af4869da6dd5466a9f335eddf9fcfe9adb03fafc43cfd3fabc9c9b5d97ea2f558b2ccdec29d8335ca4f2607cb0448da831bf45f8b43fd16d98269bf9ce33fc08cee69ad5f6366dd70544eea5cdbc528859a6bd9683b8b3d3c6842e645816eb7ddc4b23ec6ae83d557e5c4b1848445fe253b35f5f1035e7cd48d30e6faf8a6eea24cdd9ac6b83c5dc658d11589900a7bb09a96358da2d87ff5ae55bc551d8fb233785174b376ae84ecbee0e05762e8ff6139dca4cb197620156c06e47e5b74a0970bc6e19bee1d9e9a6c1be0e757dd5ded9e2729e94ead440ac3aacd86bf724aa841a83dcf64c8e1f7704397a4cd57bbabc9a0cfa4de97e892132ed06054f2873f382ef48fb5d3b65219a5a6983ad0e48ee49d81f2cae103bc9c6324d90b3eaa352e3c0d3e9eead96b865cbc993f7570b965c00dcb9bbce8c75df73d44fceeeeed73ffd78399c458068439a8a27e388d3f4bb285b63992b5a4365ef2ac298222e39d31cb886c4958f28c5c2f3738473fb4dc2e6b43ca624615efd704b596acd7dbe5f5ac6a479e83df8c1ec5d52ee1ac65764fe7ea4f43be55c563cee5c26c69cdaa485d851cf127ffbb16f5766fe86bce17535198ce9acfa66918af9674eb2ec74be2c6e752076a2db330984ccd712ece361adc498e43648389f59fba20ac566c04d2383a496a9e497208b760d36da6896bb3587788597191c3347539be92b78cc7afb0d8eb41894fdceb8aa6ef2de8e9f78f508d97ae85f7ec947cb2bf7dc8a86ee31dd20127531273983bf66746a7b731464a6b25f4b18744a8d6d6649bffb1a4339d6ae5d7f6a5ea4aec092ffb773ab09564792fcafe297e9a603c3ed095df2e5d45de3bb93dda7a84e692c25537ef6957870bd98a1d7395f87c6b836e138bba9f4a711daa421a396f557cf6e3778f4d364d5b1844118b367d78af37836fd7a9637f27e4cd9a3e52155b0047468b64f0cd5c6bb74e38ba16863e18b4368542800b378537b5d03d3cd3be91ccf783729e42ffbcead0585b1948f81ceb5c86587c44bf8c49e9e11a8fba7ac567e1fb64d8e3c45083d305dcfe4f1fcc698a728977cf1c9b373f15ec18fe935177ae90aa8856a5a24d18a08aa942b435da6447c35289cf0b334af45647e21b5a2153a8a05a38ac4c728a3350a165d2cba347a876cc4ceef034935bb3ece4435930da1faac8a787db3ca3362e637d5e59b01592020db417effc18d6a0a536e2c7d75c1584eb6954ae752c4d31fbaf1b483b6b6862e6a983d5465e3b7b80e1654faca5c669e77295f86263d344031b5ea7ab99e714c0a93ed42bd9512677ab9e8930a04ecf47944da29de5225dff211a607659dae393818fbfd56954b24b6f4e6e54acb7d5bbb33ce4b339730af6a72647a66f86ebbb88d12a76540763cb29dcb9b8c27a3c1e43769c31af3ef54f7c8062d713cab3803437e759a01ee76fba1a5b +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: a3963ade17d69debbc358dda82c7bebe2c39d25b36813058e7a161542e3f8c2b +public_key = d24bea80b6c91027d09cfa4925f3cca1b97d1b9fdb204a4ad5f4bb2147307a5350d0244ca31ed2b808d1c924bdb5667a5866303ee5fe27c932a1d84c637c707537409fcb7516fe95e557920ff79a310e354cea327f274edcbb99e66acda0aac52dd5d3717a3b24786afcb7ddd84c7c4fdec1b3ac454c93fcaa687bef8a96bf7ce182f5c664ceada4784654393d4c93f19c149e310bdfc1e9afc4297968d8d209594aa567c6510da883c3fe3fc8fd9eeb4e9af65ca40cddc1ec794fbfb7eeeea5556474f4cdf3c45b5d882fe09b2f81f55f7a4bbc8262c9bedd0758116643bc6a85f83682564e767595c0b555e6a44de37f17f4a2bf32cf0a399e0478f83fc54308ec9d05c7f6bd86c74f91b2d94cf02462df8cdf43fbd6329f65ae25656b56ff1445ca52a9e6683eb114e8458a1ad362be35e71df315b65b3383d4404a907f4ced41ec922005593afeef273e86c385ef96d750f3a8588fee4f41bd9178368ef03a9526a5444ced96c3da8a754e638f64b4fe3dee31b34f2c456ec89890f53c9a25b559b47856064ff7e3b36c16297949c6b11159a79a4344f0759c717ea738fbdf81cf5ec3fda2eff6e4c7766c9dd68fb488c4e514769d9b6be2d59e9c9cba6b6bedbcabdd8e5c7078663794fb4eb8d7d60cceb61286cb173ab6a809524254f3746bc91bc953b689d8bb44f26eb382bd54bcbbf5c60e4676537f8186c357b3fba85f6b8553c79c730ba51ac9dd06ea9ede4d7b8aedc0a4276ea3698ee5e6a8349aff9f67ec2b7b93f5eab703feacc358dbbc2f3e6846efd89a57d27e6fc8c99ff43734fc58969d45d77f5bb422b859b37eb08504e495ff8b416565d209d9492e6ade3cab7d2d5ef2f47d8c5db9152a9ba613f322e73708aaee525f387e3437d229dcb9e394bbb6857a2beead7a3d7118b0ab8367ba1cc0a0aed5195fda47ae82724d8121db5dcb0670ed789d537ba3639c530b8fded904dd023c75b1b8f61b7cd193be484335fcb8e7e3c8736b34daacfa235c9b5e468dbaa6f2e450781e344b5a722ae46a70e683c42a9056ecac5d143f9939d06cbe68ff2ac983ca8b1d99cfc1c8cd91abf82ec9f1eafab2a778b227968f77ec885077ceb7bb5fa13884b6a4bac88fb31f35d56aed671396b780f8e0e4a34416166c18d4f04ad4e24d2df0065af57d3f369c99f4216ed812ff8872d59cf8db48f3ae510a5895a0acd08be695699a48463ed777146b56093d36a6dd6c36860cec578de3688bf338a39ee8a67833f5c4c7d93b8867d93ea7aa99a3743435df36d786cd8f6e7791bc5452c88e710ee99e6dd4e27e46f3c69c6078fc11e78b07bfc0815bb88aae7a15fbed985b601e7cd4604cce35be3d82b3f8f62cfdddaaa25fd9ae0dc83963cd887e49fa25c8657e6ecc2ffc980d4cc4c9557e7dec446828b03e8bc9a1355dc33bec06e5d4d06e3235b6b9b2bd4c0ed550545bc37f8dd0a2366786da49d637ceb5d4f7314e7065a7f36ceda7213cb03a4f82aa998412fef36ab964a7998056ae83dcc4ce765b875686dfff965d2b7c5adc37fef1d3b214b4ac9b543e0f24876e773edc54c10599fcd98f848fdbd39f6ff3d0c68fa204cfdb793c5ee56659a3fcac2e3cd4fbe8fa4b045103a1e865b0c567574e523be27974b08adec6d539f37479c61fe8d8c4 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 97beafabf2c8575586487c7a80e8af5fc50f94b6051c1bc66a5ae9f66be3cea7 +public_key = 4f27944614c35e2febf249d402bc937a7d55937afd49699cdefcff2a4e3403bae024e8d2d97c54ab3e6708cf6a0b53f821f63cd89a87f769597cec8357cfc399d3a34115cca89b9df6a55e4556a3b225db529d7ce67b860f697a66be99b47d691fdcb31cf7937d25f4be04eb083fcfdf464175c95d91afe76cf5f814d3a9242ee4cd3e718755ccd3a7b3fe69b42a0e75dc54dcd38c69faecb190ca6850ced01b63d8fb5ceff6a55b4be8814e7dfec5acfdeed654c93a45d55a3e0218d0e98aa786c76fcf33cea3a7bdbffa5038ae71045beb74e6d94d1a3b617dd9b40be0060b6dd2df9ae67ab90d9dc25db895ca5e5fe1ae7bdd69c67745e8a63fae8ac731e42e55511fd4dbefc9284cc1706eb5a9e483348593585d6e2c49ed1bd38865ea489e59fd8b847a6b5dba0753f0fb4fd74d89894324a705dba4e1847a5059645c87d63809cbf3dbd555b6be4069c77c1da6c6f67ae1e7c09e6d3e87a34acd3b814d7b4798ecd5acba65230f89772abdbd89403e698f3556511e25fbc0f77509dc36803b57d19ef9951ac44ecc49f43b7cfe8436baa8b5376999f654f29345fe76ac592b95804217817ad5a75a76caa82e72df9c69da5ce70e937a69d93f12c7b533d4bce41b34d0cc8a1c969947ebfc21a960d975ac039f80ecbb527654a42385576286915d4b8f40de63f0dbf80736bee89786fa277c8487b08214e6985855a96ae0657d59cf34c08915985d3f321b5b8b45a468ce4f53c76f847eea36fb238099fd59630cac83aa70cc9596cc2ad406e993b737c236e78cfbfae191e6dfc74f8fe719d998feab42ce3e0c57a256b8e3bc559ad1e6ad10dc3cf43a64dbef955f03b46a09ac6ef3d326d95d6ca8b80f6eaab77579c017a1916f79ac09766bd8a1b41bf4d8bc4deefaab47f9c14a8441ec4e3dbe7e8e522fae7beb94f526a31beaf5d893a54477dd994530d3c6ca2987908597df6d64e92b1a7fd73e93c84f3be4867d2c134683caf5f934de10afa96b47c5ac05b542cf98105e557989b3ebb4fdae1df412f462acf75b141c5fc42dbdafd3c11cef91ea0cd5d6b5a1d51e7c7703c313eaa30487f53e938764364b25d859adaf63962c5d6d898ada856b71ee51dfb4e28a2e3acda6cdb534ebc7067bee5cb467c34d2b0a6ded6aa74639dee2f4db7cfef94c583ab04e5dd14fe3a3dbfe420ed8328f3e749acbc53767c12b93d803f357a54c6b7eb2042ae67d685f0bf789b95bf77f1b60b02fc09b639ac72ca25b1c69b855bed6377126999c570878919ecedce768b253ccaea8e715c8922dc9562ea8a0bb2dfb02585282be5c7e44339cf63052aceb087ed6ee2b5c7cfde81ce43d397a398c8547db7d3e2ab47bc25f84f4c6a50dcb904ec9c1f61aeaeef38435997871e8501d4832bcbfa3354c70d9579f2384f71363f9cdb3f573089687d9a9130375bf66ac332ee3a26ad8aa75cb667635455a93eae7a0a77d3a2ecda85637681edbd97f2be6b2b331210b6289be3f585fbb6c83eadac3dca15ea8170990961ff892e9f3f67eb8d879c8defdab03145a32298dc6b644b25640d818d06f4ee3accc6a0c1ccb05fcf73e6b655aef87539c72d754ba9bc48c915acebb656e3cb7713e9bfc0bb6f311485ebaa078b78a737d81d38d368c220eb0e982fb0bd8a7ed97 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 75461decd34c50d6a094b4a64fb75e5e9479f8f9250d82bb7d729dedeb2d4b65 +public_key = 39b95d90e5ee8cecb49dd4ea37e866c80aecf723c3e48e5b1f388f63d791fe0cb8518df0e2aef5bf0ba753fa89c29e80a85d5e15ab6c44f3ff70499df5dbe06f85bcc5dc4f20d9660c17307eed5bc1eb6bdcebc52727ca3544772cc56a08c3dc0c54a848bf83888d8a1747a23f6460054c582b4ca1e09691c656e5a6ba3f8aad5a18eccea06b55035ed47c28d7f43f3dec674f17056d71b7bea906463efaa0fb5db0527f3e0cd66cc7587df4b58d490bd39fda6e2f5d7d637ca7d489971d897b09148a6a2b47d3b4bc3a4ac0715b3abeed96bfd8622daf4141683771ccad1094595c2dc8b00d4d54873b0e4f977886314fc889e68d44750d552727dc4998fca89648d24ba29ce3da7c2868f287345f59f6f124e531d3a53cf68c877ff47d47348dbea1036e3ab236b67bb9a7cce47e7a4d96c0a93d54f743ceae6ea09c8d87c43e4a2bfcdabdb5eb8eef30b39812ca44db2db02cb4c8ff1f343896ae6eb838ac648acb8bc8e887ac6a7dfe7e9ef63315373029b2d77e3705935a43177b9f9888126fd2edbea60e433d8eefbb43df35146ff4c7f795d44f466b4c5bb8bc93942ee6489e71800b717c033a304bc61adfa79a687e005d62150bef76ab67d8b46c72857a46d753674a7ef3a6fc91ffb6305e458204b71d95734533875819a49546decd1fb66005330593456d5e6ead7b3c942688a92fbf0e9fbf849bab6068480a1bdb4b8c3a462dd7dc2a733de7b51d835e5b89d0ac836fbefe3a9ef8fb34ccacdf6b8f4ddd594d8d47314db633b7ceaa19e25abfec5c98e603ce46e4444e1e48800a18923934e814ce3b725ad2e6e7a70834493f794ae7a9ebbf1b60d5ddd84d2e3471eb3598079adfa5d04a5fe76f297ad3d55b5cfac5a3b385679ca6af36f17ad8309547a07393f8bc1a51981fba545ca739e8c253a653958e7aa6874e432a95e5f35aa045cca10ced7bf467424a8d4a8f74647cd5c16be76c8a69f91ada524b6e4c6d53979499e85f6ac66830d29bf8ca2c6dc416eb1546a4e8d7348416c8a8fcbc0779c51ce855dfc54d94d74bee674bbc383adb248c07eb888abdb44937356906a61c1d74362754440856bb26b2fb9d6ebbb94ccc943fb3acd0292843ee6def5f673762e3afbe7e79e418352097d0ffff33794cd850c5b48499afed47ee56e5a92b5ed9672f47b72338db4769f9849f9526f66adbe33af5666b28e31ed347464f50cb04528d9eb8335cff5b44d1d0bf8e468f4e74ceb6854b330c47c443d931b9e5b13903ec25d4458ac53a330f5d49bb5d1a89b73bf930c75cf33bba7aff4df39b4e5879857270ad9d0a8afab19559ed48dd9eec34b5fa83b748e3a763beab1aef7df5b87a6f709f255256a36800b94062d3af90a9db2a53f51ad9b0e50dbbaa4a30662d443ecc8cf466e3a80ced61e6312c0ad3d24ce547a69cfe43660d987a031dcf60965fca77c8515d3416c7c18a37bc10ca47f517abfcecd18ffb538f4744059e7dd65c8a680a667b1762b5958e43547fca1aa0da99d7d7d3a25b53d724477eb2844e54f35ae9ff7598d568d413914bf66b70e37ddbfb7df02cd8e24ed932ba90ad2f87188bd22dc659c83b9f554871ae4aaeba7ac7701f54f174493d31eda27def0331de8e68f7b1568c4c8919e4de7a5005ce152fef9c8c88ec9e +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 2607dcf4fd6ca1c614c21b5e37c24981c32b91c8c3e6955777da8a3f5d9c9335 +public_key = e1696955c4bc38dc83886ea183e3ee38ccf1fd2b955eadd2ac69ad97cd3822fb4283d4f16e93b96d86bbf81888b69bee6784ed4fc8af15d4642a7b65d7c4d8ed8ee0568f6bf634557c8a7ce4b3f38469ff3c5881aa63d214cf43524e505a9cd918186c1508ab122deb09397d82c3ec85ab64f4bb389487f6d2d7e7362858a0a3656487b0deaa38c91d9e60dd61496a69568e347e5faa7ee7ec20d8a613bc54e8a49a92ebceab993b0fb8ede448c15665daae28ea537c38638c6320abaa08d5db7b64f11dbc8124a487f0ffb545ca3db9ad7be7674b51a95efd08c4421cbf2aeb8cd92383852ad44985aa9a16fbf5267382db45519bbd747852ed1a590ca3a8970fa6c65cc06c856e224842440ae6b928b13c9e736b1680e18cb1f76a7209b76754076db98ff95ec76e247bef5808e0e17ed372938393288c86bfb2f31d7fc39c7d805678e68a38e3e57c30ecb650ece5468674cc54aa8aaa424c5d60a03bae4d74c8a43c951e6b53b2c8b1502459869aeb03a5c1396ceb1065ec28a6756d35ee1916c24ba33792d74eb88a5c84078f60d6e2beb4a7d94bca27e3377e53442284c395ecc2363d9d138ec53964bd35ad67f225829e5cbfaed47da9e393895aa82a67ab5b44a92d94f3bcb59265e73b84f5499284f7e9295acc8694d88df0d0e4342d3c784c2fe25024ddb1c3bd398d63524e6c8f86b4abfc7a15aeebc865baaf867f54f9ff936bd44c6dbd5343c5fcabfd1dc68735baa31dee55e38ceed0c85163dfae359fc44c29343c5d351c64747f9765b6f9306bbb3e543334c987c9a2cfa5783a576ce94b901dbc3539cd5503dc0cdad1a5985eb5993d35b8cbb136bd76abe3f0c5c2d40b34335a52bd34ab04f9cf3f6c313b6c5b9ef879c11cee1b249cba2580f7da8bb07cd03db871903e8979e358292b881f9ccf984c525c6ea34f6681197a78359e32316f7b56388ea26cce0569680c968b31aaa9781dc9b2dcd1987ea57f8b5739554e45048d5a7edbaa9db2e1967648d3c8751daff7a8ea58efbccea7eb913cfbf633bb8ea55314f3327d3b4fcde33aa2ef35e6eb603cbae9ba83c98eea4196c78a80e8b5691ff7cbfd6ebc3fd42e9a5c63974650fbcb163e404c6862721fe50126710949e1d78df7d59ea916539a1b84b3c966b89ed3b1e9a8d76926782783eece44826a4adbfdfd37d9fbb9bab4b85ad668fd1573c0e9b227fb5ad32c948037384155e88b17620ec9ecf6a6318f43ecae48d0164ccd138c8c75b3d71a8cd16605e66d84e71b5b854c0783fa9d5b88a5dc23ca8835e530c40372616ddbea0dd610b53580deb80b09aa06c7e26ecc8bdc7d9e3e698761f756ad16f4280778c0dae40d4f6f91c76f81b96cf04f5403c95bc00852359b638a8a75b3fcbea47990e10fb346d5a9491d83c4336d0229e326f6ab5c5777f72fcd4819bd1187cc6099cb7968474ed93c0b93dbb40e31465e970b86a25ead5dce97ab5db744c78536712c752e1ff06c8585295f68c594f49109f73678fb223b6bddd39c617dbfd74aae3f8ab1fbc357147df8aa3542f006cfbf4f9001377d221fc5ae48d5244b865ea863257aa672ddb147dd4b8abf33f70768a383d43a59b9061bd943f56865e6a91bcdc54402574a0f1c143dd36948d781d2f3c44e2f08b52e339b6e1cb3 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 38c89bbe7145c29e9a831c11431eb9929cb24fb4992db20737e4687d397fd732 +public_key = 00264fbcf666abba49136b6e6dadac8636bb20e3d5bcb6fbdef6301ab5e899d7341147b72d3edafee6a3294a4ac8685b1c7dd3eafb7e94e9efd958b5c3944129198bf03afe959e491a2bad9375cd9f184aab285e91c877885be0161e775cc3ef2a2a3e7337406d7662c8d8c83c1933f1ef7b8b2b39b1aa889754dea524ff23cfe8c77c66419f996e49f37f57713a0e4da6da6870d848cf98b006c96340fe38333f61e2dd42ea645e618e3c11f9489714c1986d7e568c80460df54f04e0b86634dd469033456605fe925564589828ecdb93dc1b8fc4eb1373bb9fd515b6a44596342ac8b913dfe7603cc92b9afb52caa29a7fbc95ab334a93307d7b9aef0e3b231e8eabb947b2af315058efa1e7b9146b9ef5fabe9debc6830d3eed2534da6e4d90466c80a73fab8b94d187a383463e7f6a380d1b34ae5473f68e67e97794768af0bce5b6d5dca88b35695e1afbafed3abd55ba0fe768a8254d40836233fab35894f6765d8302a337850e67dee53eb3ccb531a7637edeb9dac9a0054ff6811fe6607fa5aad8ccc723eccebec986a7b29bd89311099fa3e9460553900f5e560364bf9af461f1487cdafdadef05d89b17f4097dc310ac4703fee3f68433991f42c153c49c43cd93493b52395b5ebd73ec936f3518b7f6954426b9757476cc1cddc4ff97da2124a8f8daa3299ac21188f35c36da019ce69d083cf40842bb7adf2e4d78621d6b4e85f091dacbb85677fabcbe180abdc6235d0e8c34737a5934f431afa670d11de66f6c5e4526e74b2d5f4bc6e82cbf4a559d7be546dcb81b5333a937c4f4dff2579b0039c0ba3374664859e376a8515b390bb46acfb54bbd4aa6dabbedfdd44c712b311798c71e26ff36f5620188f1cca6f27cc431ffbc3634acc704937187c8f00d9bcbb1cf5df359c386e740195662ae24cbb25be81a23a2b4cb5e3a767701d3a80f7bb82133be97daa38b7d6c7e2949ce86587246bd5fabc77495601adff47f5748f0988087159d42b8c6b1aaa398879c77f3fb0a5494926588dc537fe2fd5a1084efd98e4f191cbdc50cb2a0caeec053a7893962094e5c78ce8d2845e0f51da723ae87cfc552f73e596493e7ed6966964e3ec894ab80f4c106d73933f3e2997bf3f073bdba6f5727d8c0ff28e8d9f78b91c4a6c43d75f9b9eb782e38cbf6861937c53aca7b535baacd2bceeca6f23ba7747b4a7d50c36d3dcdf97967cc447c3bffbbb723455e421ccfd89ec48f8ba55879fe2def78dd45ee28d35ec1039f16e8f81ccd867e5f9ffa6544b1663a14b6843fd85fefafb00e3c8b223ebbabbdb2161493caab54656deff6f3d074a372dc6a905baaea66b637365b48af4b55e45ac4236781b72be30718941f06c17d84786cfea033c6dda7c6b0d4d385f303f4dbea84c0bb8fa82d569d1959474beaf84459c0ec4ef133c06893f3fe95d3069bc15cbb391bb7d41e665f652880ee367c97f34e734dd09fd4d1d7a34b5375f9ef54423386ebd3bdea9da338a21549235f906f9792913dfe5c666bb31a74ffbe3b05cbbb351d76675cd2567c80531c5573fc6428b8ceddf3ae84b8bb7018a300cef90687dc4528c7346da868cf701158927eb5a9fad6da305deaffc4c65198b4a5e1439001d5882496fa682185d21aa4ef95ac3eb5e675c7a4a4426f93 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: b2c35e33c72d90182791f0e12a0324f5b216efcab2c8da1bee025dfbe13f4152 +public_key = 86a7e9cf2dc5abaccd8899f86f2a77b388a58ebb7c53e7961986fae62eeb6f45f192288128a832030d5addfdb15c0640f2b84d2ed58ee806bd50bffad26c5c8eb9a035768951a579f8facd494f8e508abece4e8617fa5901fbbdacb6b53ace48b03f78240d9e86fa49b96c42d8ec5accecc423fc979c475fc9c63697dfed2073d1e9d54ad1088be167af34c57fadcf5d4bb49ba5677843ef7c1fa666b0659c66dc412de949980ca6a707a0c21976822579a00bee697892fc97f51354a17f73d271cb3b10f5c578777a990361b467c1374897675748f763619e065104b3e999a765815ca7a33ed3f373e879b790a96f450c69af8d29c0f9a48e8dda82f3cd3c0f1fb62484c4ee45d02848b030f4edd01d84b107de405677a059774f4ffc7c8ff65f3f810e86ed82956cc019425703e2589f8b786b6fb71eea1316f0d205e779df7de0965465d445e6777660865df9e73bc6858fa8155bf5cb4bfacf352744dc333ee009144fe456950694b657afa30c55647d17cfa1856981867aec8faf64fe525d3ecf643b32eb9ffb2f389ad4255839afbc2ff850cbbca834c87f9fcaec05caf51acaad9ad99076afd654df9d94c399cc5afe4c7a871e176a275b7ac0a4401d36b35113595e5eb92ccb8618f3ca40b4900774a784644973477dd59fc66d09ba9b074c3d0347da0ad9dbe43a9b99df62a5b9caa996f9e362babfe03a4fcb929e5ce8e390af54a2589ff7a9389e922b9c3839d7853ba05fbe3e7f03c07a4dedb2135d95c934da5784cb05b9727aec1e28b01f5c5edba7a340053ea51c32d0a3d653f461710f5205cdadf95cf07573ec5589d895495f23fae04b6db88c8b627dc4f56b6892d1b7886f959a18bcf38aea494e45aaefe7f056f362e7f34ec6ffde9c9aaf2efa8683a7de310390a73df64fceac3a05e6c254d9ef4a4b9add725eee506d7d6304ef848e39d4f8c482437de62e5392b6bd595d699358be90e237ce1e3692ed95b7710488ad285c04ebf43eea47562d605cb98b99aecc893a7f1d7492f038795ead3f63b9eec925a914b3c1fd9a3b5a74bea6b6770a6be400348f710f555ba8c9c95b88ce8f9eb179472255f28d2eafa2d39238c76cdf1dd898c7e8884ac8109cd6e82cd2f264bb6c9c5c1318ec09d431aae78a26e6ffbd14ef32fbc013ddc83fb9450448cfcdd8cf891d36ac096396f3e1e923478c5a346cf5c931edec85bd4400b3875aae8d3bb4de46c8af5f133258f353aaacbfa69bdbff2d6bf7fa65b29fa4799adfaa68b25757f5dfb69ff108b7c155cf784f6ef8a776f0455bcea85ffc9ea7508fd3becfa9d0096fe7ab57ebb4cf1dfaeca0c5c4faef64d2d5a0fb64658bb3b1ccc93ea68e4407b6c865ccfb30ae4311ca50016b782716841bf89475dede182aa51c14e65807693134e9d22e9261a548ef0aad81159e4be73bda9c8903b7a4955456a3a8b406af7c18968901d54f8a0ca16f4eaa1d1ce28edc33b069a1c1e4b22438beb74a996c8b30c27e7f0719fc475dfb1d9b710c46540ac3ff3848ec95b7445704461c0589cc4f7606057c7809e2fd7fba39deb664767df319d1b148b1d609601bec3e40f4e136ea9edad6df1f097c4a9d6f105c99c5bd69d5325baf3e6882dfda254850ba1ae5ca738086b4bb3c91df05c11c1acb67a98d +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: afb7d6dc2b7eb6d84acc080c1be63c98afe7b07786b5801f716444a3e8e64800 +public_key = fe04b19e38680e8b5f015e67b4ccbd4ccfa87c3a98d3bfaf18738b8b44b1ff58dad79e83c828bd372a4a3dfefce72867a886733f3bade4144ab55b63be39d2aef88ab5fef9551540e849d35773e233eccf24ad668886b39a4fc240adf265a84a09bd7d11b85c0975e2c09ac3c93df3f23aaf48578bca4b504277e3c7f5f70a8dc78c6643f06e5c2b6ab57ba8e11b4fee30d8a38b5a376faafc793ba197ef93feffd1bb7f61e33fd80da5eb4f249a47da98c2aa4b88ee65de574efda9577dd8e5c847ad27afe0970975d94ff645246cfcfb46a194a9b3dbfb92bfdfda1d7948d8777d1ae4d6187c922a5beee8d600a9ef314d64359df86a68de942d32a37b8c8283353507f2edf44e97397e14a3ecf7f49201e8db75d650f204bd384e6c643ba726dfb3b4f368b033589f0ecdc10ccfe264a6f0fdeecd3b8e92478bfd8ceabba9734593467a9dd7990a9edf57b081c73d699b7a758a60141d6597ab80397dc24e5cfe0d649dea9bc0e0fbc74267eb7b6bcca714881ebf597c3a45cf0794022b58985a61d68faa5abe7e9c567e4c4f689769439837d5f389566f53c49526ab6d3edf4e694544e3d7d2c8612d1ccc23658127e8b071e581367340836e6ed11e397bb781896953c73b5128bf8437f38c27d663b05745d3fa37eacfa07dba767f0859e7b3de9d48cce5f37632f8e7060ca46633c9b4f6735c3bcbb9185abf39ba9ae6d0718c6fb84b7c7b867b5e5c51c1bdcdb03cc83b49568a5ad2ad93efca3e57a4f5d10bb8ec0b6bb34afb908a77b2e9eed6f85fc39bcea00a9467d58484bd273733947a619439576a98b446d811c97e7353e901978d2a5e48bba9e433ac72b4cc3e5cbcfa8f68ac9d9a3f5d53889343af7e7bd2316831b82d8939a88e614cdec6dd7861099489bd8deafbfcd295b6977c7c9b2630cdaa5b0a93ab7d98728b3ccec979b869e5d6b9c679ecb673b7d83df908aa596d3275a36291ca60fc7e7b754d6ec95fb802eacf4ec3c25343e52416f4b5b7a8eca6debfbd4d970cb8150bd69c458d02254fe8564f154a8c250d86fd98ab6a4a4510fab5205a99ab873f3fcf9b603a66016eb8ec8d3b6f7e740ffe74db09bd6c3447197765a19d7d310be735435602bda8337972263857f40eae5cf56a23dccfa4afd20bc84e79aa6a3755d389b6e6f6f6f6e10e592f7a71fe0dad82f3ac9d1979e83955bdeef48e7c9f5245a22cdf6479caca0207d403b8c978187f102bb949b7a709e94fc206948a7dec286ff22db4e090578ee0ded83e0a8bca2edb0e64623f4fdf0bc56c4f3bfbef38452ac7c2e17c5a72166a48d55ce5d3abca1a98d6eacf744f49e99fde2a8fe931faaebc3abc1a7453b6cdeb53af7284995df5fd7a3827bd9567cc32bfbb098f50472f6e059b52bf9bdf864793926b461574b73198b6b5bef8f1a6d7c02fd5391ef7e6597ea5bd99ecae3b38fa376177cf8d19d882bfd164e8d4320469b1598876adf5f5089d7b98675d554ce57e4c125cec30775cff89f29b1b99e52d6cbf28bab50e7077d4721c263542fae742ac45cd6ddd327a3da9c46309cad97433d5b25390c50abae20b6e8c8b3ae12d8aade68d9f3dd4bd1cf6d21c8096cb97a2afab02548ab8f1be5fdea37e49857c092ebd421eabeaf7d76beea2feb7cff7d2376a329549 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 28f5e9dbda122b2cf8f3754fe9e0c73a84ad4b0c093522e0b62cf815d60bbc3c +public_key = 57c8b4dd8ab3b7f3f03f2358221c9cc1ffa671bce846e59b3d5c955778d6b67ec64746bd4bd541d4c55128b9a7d62d8961afb74badda437de3f6b48fe70aebdcba5ec1e44594d3850c1a90e2a6bb352fe0039b48224b97efd6f583f5882d7e505aa6f84cc7cbe9873215697ba688546d3a6f987f9b2235ef479ab3f92cb08fcc3a9da6fa661c6150ec6dfdc7560986bf808b4504fafd44d595a8c34f4a564147cb798fdb6836cb448ca857d6dd8243ef33e48f6797b4e91e53cee0b375d395cefae9ea3965f7ed094daff389a198c9d4bf8b9f4fb002fab4affe7b3089885f9de7c047c3525fa0e37d9cccd7bf4d5ad81e3e60ebbc3d7a3ba978fff1fea55e028f3f306ebfbeb9388d14e040adc3330770c5ea5a883bf6d14c4267bf7723ff9863c6dc9f6984a6fdc2ee8b6f27385933994d8f9973728c5be6898012e4766d94fcd1d7b360f4e5286c965b0b5277a5a1c5f731dd085df0f9579b3eb5931ff7f238c389b7f3f8d3eea1c45afcfb6a62e555b1bfb766e78889dbc7a9ae74fec48e328b4411338b2607400236ee3c19c575c4ff5a09a269cff3aeb8e37079d0e785c3a05a98a67d8d083c5e6243872ad78f3b456173267d61d57b2f43dd01f7be8cac65b1ca46d859ff39c83338e9ff3ea9a3cc7b502c1e5d5a87d0e5885f264c384aa36ff52ba08ffa3eee17531915baabb5c9c14d33aa19ec37adc5e99aaf0fa446a945a6fa38e750bcbcf8e6666c799a4388db4024b97a7adb14d9722856838e0d890b9a982eba53f8254073fd7ec00748a61ca18b0b516076382a9a52eb19ad329bbb81534da023cb04fddcb75d46616cfd42ef4d6e8ca6da97fd47bee81133662735c6e48fa6167d7e3d8aa89d49801f89d8262c9ba8fea49cd3c1ce9a5344f5b3df38bf832fecc9e4f84eadc662d8b74ca947015e524beed8a2756bad834a1b2bff5d0eb29d74dad11c70644cd5548fe504ca90ede3fcb4c693fd55e565aeca80f4473794f3888b3a2e4dd229a7f81aaccb93abdbf2f5643b036596983768758ac6b97da4843e9e8e83633a65e35cc66969fba3a73e021348a0fe86cbc66b8fc49fd39e6322c3da6f2cc89f4f715a97f2c77fc2479ff938c3fca6c47f06dfef9da66fb467f06e7b58deada7f28b93ce24cd183bd68cb951c6bf9cfe1c30ec2f6a81ccd6639e33fa0a590de985e78d550dc370108a751aadb9da6bd6170bc8a647c408477333e63972a7452cac811e06ddce2b8af8cc43b848cddde7e68c0eab9d1382716d4672ddce57d94481fbe361d9a7f1c5906b1ecb80f6454a2c358bdf7086b5f14dba5c5f69b003d985693ea8c13b9c28d7d87efb8cd7247854bea9c50b70d6ed86a4e48ec77c8c6f4a83a124f1ba5bd87179f477a6b38f68c004f4beb11ea1388e3ac02ccfe7b7327136ffff26f27db3e0b0fd6a8d23938444436da66d7ed6e44ab44edd23f2b37e79901c3c1713f79fc8616308d5137ae3cd9f5e48ade514da5f7c68a23b23347d2b78edbd7ab4e8e42076f633b8a07d686aea3bb8eebd4da8df616e0be57049c45e3addeb0c85260862d5df5b47a3fb54487d6396c7fa4e93e40483c928460eb6b9b4349e1e5cdbd29de11b8ff46c4bc20377a7059faffaeb0f304a1a64398249b1e8626fd1aa24ae11f67a7f23fdcaeb349484 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: b0d713cbef0bb1df70cbb425d1e9373e9f7790fdc7980cc96a240dfc53f1e8e2 +public_key = f784b4d0a3b69b6d403f5b9c4aa3808d7b832ab9939b2a5cd15bb36bb7e0f13c934f0b5dc60ef6b4c4604d43d609cdc609fe4795f690d21ab54bb9a0ed44360108f2b4ce53dda33f6c2df194af343bbac83b938e521676ea3af0bbdfb516ce3bdba9c7efa9b8b56da8cfd6a5494ebb3078e9b2ba7adc5b93951653c7eee6c86c302e067b35863126ade2f2df30b99fc39375ffe9d778e755bb1d8bcb840c51eb93371c2cb377eaef0a33c13aa4aec4c9b79f59febe34906b6777acae470787bce5ecc92f494377555685f3fb6e5fafd33d464469adda074d5a159a54e3493a3364d7443d81449007fdb88669b8f507493dfb67b20de3037438437982c868362c27f556989272c8b338b8a56bcdaf290c3bea9ec5b65fb77a47dc027bec7c4d444a9d36df03fd06bb4b1b73b66d2644d17d9f5915dfbdd6fb36e7977b7f78febf6799df642429e4391c71af9f8d5c7c7800fca963f4a5ecd9ad5b1590bca4e90aee42be1c382d7a38b123cc23bad2c9273b5f377d97637091db6455447574cbdf27af50c63a6aedf6ce4ef9cc1c86424c2f6b06da65169ee4feffbca1c457f78f48ffadba9576bdfc48de4588ebef85bfc87ace9f6b5c6f68d5bc44d3b9e9a86503396c1d9d2daf916e16bc4c7a9c4737db77db678b7f4bb9e461e2f3adcad69ab78a60cbd5f134a7557afa452eb758d4c357b04ed248ffb61db9c2edcbe26e7f84f398f9861870bb494fc65b8b16d97cc5d9e50d4c4318ec698cc570509de1b29d37233bee3389e1565382450a4afdb8c8e07a7b4127a7d6d630c84d98b528aa9cea5249a6a424536a6003787b87f3027bc8e0dd7b9519337e6ef5b8bb63160f701befbb9c45fa3407cb3903a6183d3a5c29cdce23c4ed747eb56bae79084ad715d41bdf7cc754edd8e5eac4f5be1c594019143f41c56cfabe773fedcfa01e6036aa658974f0f834d6c1b3600afef433f6d993b691c09f95ba76f1bed9d60d8fbd3d8c75d30e4cb774a3eb8c8c7e698069437155ead58aa4a6831c6cd0b47fb425c4f85c548138f107d4b5c61756de3f35bb6ea95608404d1e546a28c0191c5bf8473135a98c5836d8bf7c4a1387bcd92b449f888c6b9990a5a7f5ea9c896fc58288c5905bd8ad06b8daca6fe06e4fb298377a0db3ddb7f68df51e9edf5b45d57fc3b11c85ca1439d2fadf074899c3155a52ff6af105f365553e2136ae3a69b52976754afe46ecc6592a4448918a892af6a896af7a6458d546db66c42b8a9eedf9fdbfbfc24e89974531c384d5822f95e0e85c2c44620bbac2b5376464ad49106f8ba67c7bb7257bca79dce4fbae57c7e7423abe164a43ece7b30fc768779c5a82e3f65b8add012383b1d8a6967a33969a5d368bbf5cb6e37969d93c9b321549f36288d4321fc8ed8e9e1d9b532f5c7ad85d6ab9d3ecf2f4b95f978cf74fb67b2995c8f56c272775023a438845ca46a6858c4ff01dae4f1cce976155fa0a7afb6ae4bde72dcd8685a89cedff64eb51d7bb5d29f7ef009a79bd16d273ebc51a48bfb575afebb57215badfdbecdd0ae9e120d3799c8843d60d68363b5c48bd95736f3d7ae8d71fae424799c1eab7e65343af0f8d8afcb39f5cc8a7f6ee4bd583d52725185dbcc71968200bd272d97f676c08e4a6053f4e0a7071d7abe99607e757 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 32bdcdb7059fe27f6409901980c080308951ffd90deffa8317b4d213a5f04495 +public_key = 8645bfe5dca2202ca92aabd7a6b33b4997fff22becda1ed20e4ac369fca24d0d593cfed5484af4076cafff92f0780c9bcd9e50b3a65571fb426ec47a82974bb2a6ba14ae3551d737e1dafcfc6de03e24f69263caa6be5b16066ca63b867a35d318fb7335babe4fe8ea2ef56ce7b5beb88c65c2bc6c5a85e49898a3d8a552cbfa6af1a463a1aad71cb64280da48f3684d9aedb4adc7b48d0393590fd2a7baa1ffa4ae95fbb0d45776bf76523ce5d4a379377b84dd26069e933748710a63782af3765a6659eb4718dac557a8553fd5be0433d16688f860b3d1239db06864fdac1f6aa0afeaba2b61afd695815fbaa8bf4ac50cbf206e3abf86ed3315692c59e84cf3995cea8f161c867697e4b0eee8526eb6da86c73a7bf28b953dde27e3119df9d7b7f9811b85ab9d6f67978239c6b6f9f4a72656b9537bf3692bf7b4bf316176357c07b671eb562d4e621c75522669e4c60da21299b17edf58e3ad4352c5d6148e87612ce9e7d886084eb110c57372a3be2be7a3b5a6c68849df06a5cdbaeb6dedee53cf5e81c818de4f879fc063a68749d3258ec2cea461139e362165a63ef3c0f446f30409c8e5e57c0175e471694bb687f991a9f0c695fbd78766a5f5c1b5db45c84ac14c764549b54d8b34d4524bdc0015fc5d3538ccdddbfd96b8045fd6714a645d447dc83844ef8fc069f63b59587f53c3cb0047cfe63b4f6e04e613ac5194c9eeab2a5ef4d7bc56ee762f9e62f20ad19a9c437d2c93308ca411e8ad7facfa642636d5e89f93f5bdedeb78072d32db389bb6fc77be489506a98022e83c9aa9b7bf65c562eea8a95871e4bbe875535981466286175eed087e61fad34c9488fe953106aacb251c7fa044bafe474c2ec6d2cebd91687558c02778f4b562692349fabe32fb3a921f75a4ee6c33440ab76fb4f0bfb339e2f8c225bb85538cc43895f2fa6f8aaeee83c163fbaa778faf937035639a5367cc64c4c0360cf6a61b4f8557d402e85ebb245a43d9ff2c0bdda69879a0fccb003fa35f2b46c986c66386308fac63978534e5eccd137561a7cee0d83af328b9d636b55b8d67337636e15448ca7eda95a7df740e33c6cba56a9f34a95a7bc8f304702e2531609ee82e54b26579e3949d83c15f664a98445363d1fcb730dfc9c5571ba72f279a051fb98cf64c069b89acead1049449909f838f3fc712fe712d8b34303b3d594681306bf0d2f8ad43fb65991e341556da0326bbca5ced659ae462aca2a619abcc5a61a9a9f1cb8f882e1569c4adf76affd8c72ef4e84e630ffad9ec68d65b889890a667d25bad039c4846a77d17acb5e726b5718bd0e0b3918fc767216df8cc4b67cb29b49196b4dc288a3abcb112bba52f0cae6ffd9cfbd74d939b73ef7edf0afa6d8b345d3ee95749cb4373ca3f52f69ecd767893135e7dc4ba6d069c053b79ffadc69b6ce2596d9046c761c783f2a9d4626eee9df5543165958a447432d5237f399bb1b9a8923ca45522cfecc5be7d36f7f4f6ad9772a7b8609c9c8624db03e8a10c54adca2fd4c696d49a643db8abdc375a359c943d5a6ea803c6ad296ef83904f426f53b22ecf0455c843ad64753498e10145af16f70a92fe3056e96d229fd0ae3924f4dbffa093a9eb51025b31d268a74f44b849a4c408426071fe5e18c3ec8b5c4 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 4ed7c92d83bd03b2a25b567f17ae55542e2f6a4308ec0f3fe69f8ba5ae24331b +public_key = 397f4d9a93d8ac6b70d1c87bffbd7775d56703a8dc9a563041deba17297b1f253afc339ddd1ea42ccbd51caf722854cbf45bb80cecaa81ab63cf3facfe953f9ac8648b95be866882216dbafcdedb59f7f944185a57f790352af0de6679338e69b954465f8cc028558328f3baeca98e434d429a7e9d205cb17c745a7784b97c19e30e26376778a9330c99ed94f88ec3955d04d86d0c9f5847af05bc58353ce364f34b0213a3cd05b2d8aed8af038e457a30bb66f6b1dc404605678ac675201c537a8a6ad67a8e3e1be7a0e8632dae714dd341832bf79069ec1f39c530288dc8448527fa542d74e92f4d7f2304747ca7cad98986c5a6f2b2e63e0774f0916635a538871aba5469f36a5536356d17626529efc25da4dc7349f07c932c053ef4b6bd245448bb8e73ca0896e61d92e06537d2157b0c26f4d4af9eb1dd55d49ad38c858e54ded45c49fd6f59408effbb19b35a87737ef90b9fdcc380af7aeea22f838c673e3905d3a099d8ac43f76c4f97c81fb3c764ec7806c71dc76e939ec89cfac3a56c9c9495fec4a47bf674f349b95f69c43005fbc9281e3288caa2cde6e75b2a627159d27e3688b436c336c5ec8539cec3c5537de5ca6955543f984c740d5181f9e6327f62bd638e249cc929ed48a30d45907b79c54ecfecfdb9106c8847c8d88b4c41fe6b7356d7947ae9a954a3d5c9278e6e3a39060854b88b65cfaaf0277fe8864c94377a475c18f2d454ad8fc4fc51ae3f1be65dce27f8388a8d4b8eb373ae486a86b0e7deabd445559dd3b827b834e2ab3745cdc5abd5ebcb7551cc888de7f590ef88dd7cc9422593d732f47b6ab477736e944cbb3e6d943eac8f7da40a7b00d8960ebe810e0f8529449dde1cd0eacbaa322ce4249b7113ba43968b79070b9117dbab36b44f061ffbf25a9ec77c7a3974e5c8ff4ce5e364b0aae6308472e1d49ce92a41d3b868e4664e93279467745b9e04c39bd67cf12f6d1a9ee0e6235a3a35af970a73a357f028eec7368c867d23cbc1895791ff47908d7b7575e6acc4c7dae3a351ff6a0353930f5cf3c3d982fcade76bd7de0e6b739fb67aaeaf4d11ffac30685c2d86d6fd6bce5df369a1de76ff3fb0e0e8cbf583b0e30e916774dfa64cf3d82f325954e153bdc79dabf0137f5b6ebcd8ba8438cc9d309123abe5a8db6ce6889d6b7d1c756aa7b9d182ae422f5a6f804bee772891a61ca657175f7c8e5cb3549d3ef6e3dfcdd1c7caf0083db2771b5743e8dee48683da5de5ad8ff1671a3a711468f8b3be5ecbc1b08f4dfbbacf87a7f874e847b3a9f80eb649304a3687f43dfd769e13a496499fb5e635c0a32e627343eda5c5b18fcdb406bbe163e4e79af5aac5fc8273296e2433c8fd993f944dc5d375d70cc7f715188b52dcd426146c54a3687f6a57f37bdb1dd639c505bef4d7efadc68d630d9bc7bf7b3817660d03f0abdd6e86c9eaad35fb8056e200168290848f974de0511763f96e4f202a3a0578d831b8bde87ae8dd89f48d46c14483dbc7b4757ac95f34cafcf0436bda09cf5b9f85e7d9f4f3c5e46963d0c33cc6d93cf80f08ef72b549694aa7aedb46afd394a2d5826e657897fc532869d5406430c2b7786e64ba452f5985f95146947535aae744a3b3707467701a8bbd99b938f2fc7737f22bcb9f146983a07f +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 060ea5d2ed1dd88144a9885e79278590821c22917b55a48920f96b53ebe0e689 +public_key = be19be36c8ccda4c9852a442d42599066f8088cf32f28871b065e2dddfb769179ad09a931335fdca243d73b387b279a1cb1e51feaf781ab7757d2ca5c74d52c854dbdd93acb525f203987bd5a693453957514f42b3f8667d3c800e9a96947fa140ede4716adbff4af4c803eb69d3f9a1d3def37ca29903ce0943982413b0ba694ed53cb4170ef6151c8f0377d9ab2e74ec365a56e6d8a2b54ec81e83e2c4f58f7eadc09c81fe15d65cefbd972979effd93cead3bbc8fb6ef4e80732ce8fa997195d4917476427d8cd7d99b663c4b50a9cbccb3c364df354685273b8c4fb9e118a427c765b18d36350a330be79b3e04e81b953faee56f719483717854b29aa3385545d3c9cd72bda070baf734f8327c095aff6b342584a57047eee7ca3f6a3afbbdb6dc4e3aa264078b6c9bb20688ef229b9a5dcfbba0c8933e0eb469b4c687f5a174a5e3bfa3401dfe443fcd558c89c58cb795e3686640f635052dbed4b839ebd8e06f07d53107c591cdbfb753c0aa33d5e5afdd1f639c3ee4d0a2836d3b638051b58ea968d390ab57de7e384227d9759b89aac4f79c5a9768cabfc44ca6a3fecf5c039e2b0563a9048932fe565d164c13ab60e4d9fac843451cb75662dad3c47a652445b7ef0b8e632e87397d59a614cb08796d3475813315d161743677594d52edff290b3cd8ff3d4ccaea64377baa46d82249ad896990d79aa040a7858f1b3dfcb43adf14df1b245d217bfe245fde0ba6e3e9db6c7545d63d15d79c739f70759f7efdf91537aaf5d6b3f4c6f91c147855ea9a79ecb0ae8d71462d97111e365dca81ab5bc0d9e7dade36a125bbf295858b7947dfe21932504b9d583c787cff876234ea279663baa450172651f126bb20b85349b6344ae4d4e3093369569149afa8cb7b7e08e68fda44d8349b4762ae71b1cfc85b47f27cfa3d7c16a3960f98c20d95550f919d14a71e8bf31e6dac11f8ea475e5cf3ff5fdf5d7c0df59b362e87b07d59f47fd026c8446a7edd0098895a3330f7638082d5b5a925afca637a1d26decd2c83fd6ffa3b04d691fa5ecfbaa0a4be859fc58b1d157c18c7ed540b6aa3a8e79bd65dc00866275cb0473964ffe5a8c638bf583d4d33ef4007b3c61429881cdbea0403566bf3c46d9ae9e95faac6f58d4af3ff45cc7b105e81f18675920680c3cdba8fdf83fe0fdd383bc08ccb7d46eb85215ef6be034374769caf39ae6349f4bc8ba6b7b89db07fac4a86bf870d8c020ae0b18a5de6f8952eeaf5260bee994b4165149ed11b578359a7baddbdd7257a2e0db676268a395f8fe44e40ec4d8ed5c9e6c0c43d79bcf9b094670244ecd8dfdee24ce6a7bfcfd109e1797fb8965952a9a45e0e435c56695c819b71b9a6b6796553272cd29d06cdb13d8112a89ab4c7e4566a4b19dd3c19eff3fb74f7c7c3e44e64874c26a8cb4e8cd7fe4e4cfcfa050f698baeaf6ef632658d6e4c4fad3dfaf98b4d4c1fcf60945e66428d68edc7eabfdfe040f9b3eff4389358b7ccf7d461ec8c0ae8873a45504e8688e26678752e3436a9d89fd3ef84ec95aa0ff74eb3cedb8ef61ca791d15fa43808ba1f57d6718ae0fc4ac21c6f5fd324cd86ab8b3ecf54db3ebac009e16038f58adca5f754b309a6c7dd30e11b8701ef37e8715f03c0d8a32e9fa39d37e7637ba00940 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 10ef9426f8c4a13b52325c5bb4ead4596ecf2c6b5bd2d37d8350e90d4164fdd9 +public_key = 8afa99db2599004da53fbef6e94c903605aee44b3d56abab69438320d9e918abbb1fafb6953753e475bc34ce59c69dbed80760731565279c640d46ede46aae79dda838aefc66c5a348cd946f6943866750c6bceeef7e3cb8636e544bff8a08857d5383423360349e417a23c88c7dd3247adc8ff39edfc7ab8769f07dcb7c1e9f3ad99ec31ef564e5f53c0447a25728c9353d3bec26875c44a26aa36e0324ca6423855cffca05ef7cb804f429a3a0e28a7285658fe1748a58c538ddc7e0c6d7839b573b30a5c4486a448ecdbab8cd7b86279058578d4a56c78185fe8bbf70914534c529f3a7ddc2269673136959883e4975dc7c7b2de57803f7d03ad86513b2608a8b58ea5a64ffc6a1cbbdc847c312f5a230ace749c349101a42767d73225bdaca598a6b7fcb309ad10d3f7afac94798f8b4c7bef79389c12d1c3016cdfe37a95705d3b2b8277c2c24ebc8148c94244ec5d5de6589dfd7ed842185a5f2bcee73bfed4d75fa641dec650b6c8d06cd7599f3d42479cba96d7eb396803c77be54c831063707a35067b87b2876a1a0844d12eea895db70d5968720de434798771b487aed66fee2dd41c075d5797fd51678e2fb7e84257d8a207cb4a7cf5ee78b8b85e869bc8fa89f647a813b97dc1abfb22b430d37adcb43b7bb26e6dae73b0e6d6940e5af7d139f73b48b4618bfd6dff274d3a27d3de95794344eac73baad9de5cc4e5aaf853b5efeee7d62dbde6b0e1aaeef93f21d34b3225868da033822248e5f4da693dfdae4dbe12b9c4f9e373d6dc3393f385b5f65c7f14b66d8ddb31dd7902af39812d76d5ce73ebfa4c393bd69be694bbfcc7b9c18f5d158b431898c9cd9d80d73f196378049a5a02b43cf83d37e4a83e506ff300976e070038917a93c463dd4a90f3b1da44b4e5cc53adcaea033c8759a3bb4bb52771e91d76c95599a9dc3bff92bf37aa48d32797f6b670f33e9b476748a31f9fb9f2d93b59b9cab33356782a976e06bd83726f6227834a0be4b806a7cd3f5fc1a6a6f603468c4c4f0cd544bfb9e6d158af1d16ce945c3ef7d6f85c315f9ddf735350c92c546ca776cb4446dcd63fd5620f8b23b94a0a83df7102ffb102f31615db7cf76f3cc0658a9146861785c03fc4e0833c3565ca4ebc951f5145e2e434555d45c3819ccc5cf546673c18e7daf4afdaeaceb83041556d52754c11bed66b9c0519985eabdaed569d74743c8796881e6ae89a57d7b8933d97669b2daae62dcda33c3c8f5e004aa21be749fbe98299476bf45a519d341e9c5d7b1f4e1bd5382a6a84b6dc9c1bb437e98546074076ea76654ca75e9f7b7ed1f39c5329be6a6be82bed6b57bed58c43de554e6e2638f74bff577561ffb7e653dbb56e958ca3ef0bee7b67f99245a9917158f2409384a8bf34ab390153bd1d1383aad99747258c61cdf4f7c1fa0332c6d7b5ace324b4e1dd9b3f8574b1748fbf397e55f0abaf4fc8830b7774275821f9ea939da83cace89ec08774c739fff14ed40e5e2b27ec2d0ec7e404349bf5a64a876aab07fc9c17ad04578842bfbb6ff32edebdb6ffc8a6de429ca0d7aa5017ebc8d68c23c379364e56e4bcf47a9a5f3f8e9db3de4b049c5f6f8a6e621b98dc534b9a756aa9c4a1b2b4c7726e701ba03d885a39d59a76d92bba31013f2a4714ea384 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: a4bd30a64cbf29a4e290fa1cc1dfb99e68348713041e4409a1af23c5d80c15c4 +public_key = a7c9ccf796828c7d4efcbe94d5d895cfcd82f5dccb78b59a6119deada66093c84267079597c9881d0bfda8fa4cee6682c4375eee25a08ccd766eead5beebfcabf734c42439881efa44e86cc013b7e555bd15d45306479a78ea7d4fd7723d4bd7496d914e24395b264d35e578680df39a1fc6ae0f38587355b45ce55bf7b5e5c872affbe36bbc32b1a950b42fff3a5b71d9ce40941beee62a5543f3b61719896499721f5466f7b57b119568ca6da3796bbf2c8877cf8a762d6a88536e9abcfb85ec7c6e7975f31159db0306ecb19af3fb2ddfef7da0fc693164bf8ebd75d57743f4404341e6c79b067ff07fded77cbb64053a4447866efb1894a6a544dbff83474c6e0e99323fa6fb5cf466774daf846ed59ac4fe0925431d864339258752a3b08ae5ff9865f0a1247af44366f3377d5875589ea9a8e38455a3bb5ffc39d83664cda47988f5fdc5972f454b8ed9a78ffa787d3b0a69a4db2ac154d53a6be6d603e9be795bdb1b0b88da57a6490fac781e34b1a4776d07703db8746f7ed331ec3ad49f6892cd5b4b738d3564b79b69f87174696e1e9717d3650abbd49c5de466467ec46fe02ce597f6e867726543067acf511975828799fa2dbf13ace76fea838144797e79441b0fe9dacfc0f15a350e08fe588b45b87afc5846423adef1ed2a7651df841fcfedd6547bd33cde4d654a3823c40526d9ed59f20c2651deb6b0e56ad0d36ecaebfa9c17e8fd5f23a111c391d07cd4422dfc2745875d79d5af2e412c3ce4af5ec5609c58738f8ca9dd9239c8fabe7df005cc66ddeab736db3cc0e946d633f177e6c012a8672be6fd0b4f53dbb5a908d4f3425d3b76e4f8a0c38f7e978d50df532d075c08d9cb3a54d018c3f3dc3ac28bf8875f5ef745a6fe513cde0f8eb4919a813766bb020c831dedc3eea5a496e57e8d598d3bb34733b6358cda44b1a6de899dce525578d21df57ed8a917bdffa2d8b59478966835c0603a8f497e5ab2544d0fc487a7eba7a96a6e3918b9c9cac54c94ec2899cea14efb40f9bd93eb7d392a4cb899e44d2f4a23244067a9712ed9cf53ae5edc35895c8ce2192f468716704e46e7ccd59aef05e30524495d44ae3019adf8df5bd797eb2a98a17ab6c68c789175af8a4863ad6946ffc5a8faa68b3c0cf35fd2d63d064556e55b6df0d636dc5ca56b9f8f19d6e816349c6339c59febb2b8675807a6a9181a91620a684dba5c4c596a821b66014851966547d60690f7b8d5bccc4bfa7fdc188495795c3dad55c8e85f9fedd9fee329fa68bb92515fdf70fd4f939c82c854f350e4df9e5e8c10c53ed5c3539e373d0f955d3d55ee7873a22bffaa88cd8106cd44613334e6b585aa864796eda6af988affb2b2eae653be5c76383b66f62d5e1effb557b66b0f9b7063e3d3961dad13a9b5ae6bbae433808dc7f7537e917d75524fcff0330fc1f0b4c9afc4d2f5798215cf8668df8727f89b95e3f94cf38c129a792b26e61e6b9ecb6dc18ee8d2c83ff5d585c7f69d59dfd74944f764036cd73119395478651f88352d2d4f8a3ffbfff7c8bedcbb6cee728ef74e54435b41cff2770eea9ef34673ebc70047956a543f3d8569f334a5fc2fb4c2bc34aa9a4b28bee795a730eb96003ed4662f2f0344da2b88e634672fe48e40ec83f4ae731342e77cdf4a3a +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: f4b66a7d3b65b896dfe100b2cad24b175a1168cfd2ae11fd704b835f6bcd311a +public_key = b854a0daebc2831a4f20695579c5fd3369af228842777ad3c4e3f84d763d1f663000a3d377dc86ab14486673a349e8d73ff6ba44496c64467d5f63ef5203a074ac7ce919de5afec309dfc756aedaf23fab81c5dad6d6c2c77e6190696ae6b5e43306e285a43cb2df3708e8f86d066b61a6b7faee3f8248c232d831605dd53fcadd7ffbb4cf6d4108a9f00a8a5e51cced849fcd5604f0bae85f36cee0933a931084444036aab89dcc09b84b7a235f34763b9ab5c9b546f0f627778c76ec4c45b36ebb3a4565795666f27fecf80c3f7ee2f96c16e7bbbde89e919d318787b2abba7727a393cecd4dc49fd5e3c86ed5e5f91b1e49ef2d4b2476eab2dae6c2cda35d3cca0d7c57f5fde98534fc3b43869da9e4312678711bd39be4c2b775cca014b1d936ca853fa4614c4e67b69620fb49cbc787599c4bffdc3a2c786ba876864e7a5be33ab200ccfd087c3e6cc642f4a96771caf12788d46b68f3085c4069cfd9c54a5bd4153e4d986ed46efd09e4dc38cea2e57495e0a594f453dfdb1c88c4fb677c0d7d8804ca115cd991c9db524d761d5932560fa1f0476e962adc2b2ca78b8fc8b568ed98eaf6df7e7f85ce40ffdda0032eba71c34821374ad7c565ed2dcefc949e99de81980fa4d38597c1db9239c9e67dfc8651498927cbde171ce51e98e577f58963593d3bfdd870b8bb9fa3b77c468e8bd365deed88f25cf577c5aae3ff4aee1552e458f352674d1d96b9098d336ed44f6c0dd8b5eb67c53ae0910a9a3fd8fab8e5daee17b668af7b4e0e4162fea60d3d84a265f4693364ac1876cbbdc93d0ea154bd3486e75c3b0e72906f5f9a7a6a99e78ea9b77b0159dab49c6dad9ca5852f9a8a99deffe47ce079fab0be7a3ebfb856bde6675e4e8b9dda48cdcbfb4872c8c8a4d4bc52c8db43d3f7360d568f509d5ada2565a49490202f9ed51bad9106bba6dc4fa7ac59a3a5a64d033be1e47c37cfcc9ebeda2cefd0b78ec2caac5cb1fbd3f36455241367d41de9abdddaff4efc5323cbb4575e272cd1f09c6eac03ce200fbcc4186768493f6cf97671e7a02dc6d47557306bb8ce086382bbab831256d663ecebfe0eb2411b3c498356916f7f133935c283d8be6b5d09844f4785f3522cfb1cbec92b6b3c47dfdcfa8fe7683a3f2e46b01525e1c7c9c4bf96f0d57d6ffaec98e524360986386a7b5c20d3e2c5c6f37cde7271bc6c157ef4d2adf05f468dfc0dbae093e8351ceaa6aeda07a67bf13a99a52a39b3bd4fa66e43c1def90c5c412dee647bb8f42c95ec8bea960c9c4879b83037886ae78be0e91f6dd3b633a33a662076cea326765e6f62619b8d0c8c321743545017ddbbd6740405f65b6557277e78ed99cd4257768f7f8f3069bc29f8484b1f7d84098ff53f594647e384463c4ff489cd8b6eefddc5e3f9fb1b988c41b3edf81d47cf78ab1ef9adac3aeba42fe6735d5ec78bd6216e7598f84d1fc7b00fdc65e7ab72274c86a424746dc74f5324fbe74f3546edfd581933bcafd58573f79f6ffad95d7f4326699bf4831a7d77574d887e875e1dff9a09843211af3976a4eaf397a3c6c5605bfe33baa4e2623f311224388f44d449bef52c5bc0197b4699aab73b4f37d51fd4a57ed3bd605bc698111ddc3d6bc04804722c35600b001c554180d16628713bdea10cdf +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 1d7b03d3c5eefb8ae5799dc569aa668f1bcb8c86607b089d3530cf61d6380147 +public_key = aedecb3358ed37e546d75b5398198a831f6a7e3d6a26d7e24528d75ee6701d1ca69d16a8681e55830ffb7c48fbab3acb5df5dc35ce3a5378b2b24e5b5538987a77681597ababaadb5bfc7bbd19550064489be9b897a54fd12c722afdaf5313429fc85f1936b5a325aea965d21a969ae289657ba4ce7393477afab3ec0b6e46bb7a867db2dd4372d51537cec3d23e477a36ccfb784444d007ed3165395af7ef99afeed26dbe84ed572487691a53e2845fb3d83bf23c67b33e8f77b05c6c0724e8799583e2b87c9c2a81bb2a7658d67e637b99d587de04b592bd5961f0d7f6d0058b31086ab2df3f4e3ddbbe6b418fd53a023eaaa50cd48007e01d9dcd1dd5bfb3839c000f3375f4991a2e4e756856042bb10f1f52a11d8c1dc39a1f69bbc33da4e9c93a87a87899faaa210a781d9ebdfec9a5918dae642aadfcffdf9ed6d0a3bf97c3394a751354b6e8ac65ea45d3b66c583f8249034738faf541476ab1ff717a4d930c8551314851be98351d96acf633fe1a6db97da3de404f4efd07d7c2eaff652796caf344b86ab38804e3853a5643a7932409b476d3c81c2a301e968dae28742d28f32e0adab91e77dc9ab33d8bfed5f7e1c157bbb123506fe35c523fbd04ea87e173a7d8ab5b2e35a7eeb58ab3f549de4df28dd5e97f778359b4b9b9b989b697839fccd13436d1621dbbe82ec1c8aced473f48887491f18e4c4bfcbfe7445144b88cb4ec535bb85a3016891c0d9dd4fad20e3799d56a7110fd97b79384556c5d7e7e7436bc9626dce5eb5d9fed2bbb75cf636e8cb4e0435283d7e59d8c9eb7feee5bf977a80994288e61671346b368372ab5612c85ad48db8a82067acaaa39bc1bef49083e71e8727adca1f3c7cfac09d8a71c3c73e6737bd5e795c9761b5c36c87b461424d0dd43874c55d0606c616e9dbd9d588905fab9b538c23a07b9fba6c06a9f59b6c8eacb2d71388848872d595535de3e7b5d4d549a8b73c0004fb88d3d5b7efa4178695abaecb97ba46db0ed90a82cd38ff373b13582665665b2058835c6f9f39f5eda9d82868e52433bc3bbf9d937c763d835638d4ff5e0c3485f9555d4ee556ffccb1b059dff8667ac445b475ae7f46da2dbd895049bf9fdddd3f3c46768668b88ccd053bc3821a95d5d49cf161d894f1739ca1e74311bdab2cb7836c4ebc44aad978ec0077e92d4a46c2fe6de2323b6fcdaa15a6581b467eb4cdcd9fae5b24d9be1f67aa629e79652388ce04b9ceec5d29f8d341ab6abbfe38b2584b55108a21ac64d61636ddc2d94cbb9ec2c6d6cf4dfba09d4863ef9d0dedcfd595ad42b5a63c92f631533a14b6cccaa0775eb4fe0e3ebb22137a74acffc1fcef9c97f578feca153c3e2eff6f3858379395f485fc53952e4a513e64b8ac7b6034e944e7d424665ed347fab9f6dbd851e729cab31ec9d8c5348c34db74f3cb6d384e93c91479a52c3f1f8544dc146f0f26c9fd324784a294197d993565eccfbcb93faffba8fda993a3598a5d37c364690251f9c8f4ad81c9b3a681ad2ec55db0b8d5da455c5f696bf4678eba908e06b469afabec0a0bfbdf628f42f449cd017308de8da9fa7a3a6baf5becb6f08bf41f007fc345664751b83b47af76ec74aa2569b79de21a5198e7f0c3bc2aa84e7f5c79f4cdea5b473ba2d344bf994fd32 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 554f3385b382f4a46314de37ee3885addfc5332bd4038785094e0a832e9e8c2c +public_key = a7b8e02efdc61577a7cd4b9a05be7ac567d8d8c6746289529337b9e267737d5345f4e768e0d6656dff3593a84eb0fcf90c8ba078eb9f8d1cc8ea28f80a8ecad0f46dd29c474fdc57cb5bc93f3e8537ca343cdd3ea6a7a467cdf1b3db77021a8e20b94907faf94f47baad599d51d74219e38f883b36cc3f3a3185f0997988342a7452c3aff56ffebef3d211444fe78854f9f853cd189be04cc1c90d607cb4acccb650ae546323e7993cffa203487becf8328a2979dfc5c3bd0cec47533a9b6f9e5fba5a2234bce8eb37d686a75bc33eeb945d80e9fc218548eff794ad7cdd825b57f7fe2f0ef6b8201bc0d10bd455fd51ec2af17aaadf0c77b1d6f76c1f25b01ff356fa49d079d3800f1468d745a0dc95fac24d307f8ddf97d557ec5fe64844b0b6d5a37cfebc41db5aba156359e9b4ad564918a4d9be58b8ad5ac89e348099ab9fff8ec71d54853eba7b42167d478693c39837f86e82e0c894e0f5ccf19643fbdbc5278b500d2bd7f1f6fee797930c0cc4a41832ad093b2856dc880d678bda847edc6bafa64ca29fd16f75366af8c331efd1c7ac4328bf326d8b57997734c09d9b10aec619155aab7bc5f50f607a9f6d056e9186c4334f48bdfaeca777f9ed0b0b7fc5be80e6ee9f026fc5d3146b5ac5ac820781209c455d195f17d541d79e6f56838f7be838ad0f93cdb63f295f9df3fc7d54475062c9dd3034c2584bd0ca5fe0308fb9554ce12099eb77e6eb8c86ba21b4a78f87fc4049869b56442d33c642a5c0ad1677488d7d607ed5cddfeaf9ed6c8513ea2a73ada9d594540e7f131b55c2fde76fef9b021b79346d6c5435d78b7b49cfa99f25cfe818e78a0e856747e4a7888a3d1313624a08ed75eca6c3c43238cbd78b94c2a9c57f0c4c66ec5b59ab93b73b2dd0630aaa28a794164fdbcc8a96195934cafe4d5dd4ecb71ce104a63f60af9953495ac07eb9359563f16c7bd6bc319ed78990eddcb68d90302e96b463e1962cc17a9a9f002a916d9bbc1a55fbd3e6a48dad5e50ab35be8f8cfe66b483e96ca1e9e7001b46374c41c3dd79fde8f57bc339a7ee3a80afc0958d56f6553804eedfcafec87735f30ba3713913e9403dda995ea78c6e534b5a949d24dc9b457ec66769c6544d7afd850c4cc8e4b78eae1bf60dfc9cf0848e4e09cf52047d62bb8e7f6f31f4ba4985abededbca0d893fbd23789c6fbc40e6e485e5a951de6863aed7e624a72395b9e25c6d3acb330a37b998b7a9ab3f973004ce5624c6abce840500cd2679f4a3987d8c133d8c588e05c1457de7cb41de6d9c0c3333be5b9c3b93e2776aa0ab3a4054c98789a4bf419bcb6eb914d2e79bbfdfb463be126a3a2894db9e727d619dfde8527993623cd0c776e54f8b4eb237b4f9cd760bfe7601ebe87efbdf3b9b9dff89b7544e3473de16e0ac025f6707c0db5c743aae154f41b935ba628f7909b591b44cb6f46e07e08eb214c6aa5b9b3e1f441c774cb720f310d4d31e0e4a213a8c1f1593907ad424d657cda8ce0c1354b0d5a83d2cb9d0417d73fa77abe58d854c953eedc6cb06c75695665b92873552cc053a9bba0c99aafa7d753299db45f8276b56feb8a5bbf373d14dfdc302fae07e9542206b296f3b101d07a3bd1517d9eb8db21e1f18e6da63acfce1e0dc597cef3abfc7d0aea99da +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 38bf0033b779edf5367d9ebc01c988af90904c560970815837380650e4749eea +public_key = e078c4a3954f41af69719fbbe456df27c4ce688662848f606f395b56dea29939a2f754a0b82968d3c865f40d66c6ffee3e2839416570f5b54f24d347e3fed16967ea3935307a59e8b5d68ddfea58a90382e81de29127f9238a4919a753135ff289a5f15fcc96ce9ce970faa902f79c7b8fd7a946e3df0d66c384786f69e3b34d40e6b4b48b6b679e5538f953540c25c1850fbe1c58762fe8bcee7aee58d93b21165f95895afefba1f735b11fb7bbfcc4dd3d54ba24ca7ef507973aab9017b66a3e37ef980462762e37d9bbdd1947f26129bf48f68b711df1b2fabe81573e490ce8819bbe46858b5c58b4ca7c83a57398a667b09c78eb990b648e96ce79c7f105be3e987eeee95f8c9f64c376fbd4925ba46d3c8ab859304dee7b9435309736d45eee7d8a7cae32aa9c81eeaa4058cff9ade0e0fffdaf1ad02b9d5f945accd209f35739aff1863006b46f9ecba5243bc48feee84bb9a57bef6c8ceae47cacbb4a13e112279dbf7f7fa6c467ead943269ab1e3c9657c19ba0b648c9d4a48c6163a0a79954c0c7ec645f9cb8a65c95ec3994dbb1a7c584114d16f16b43eae79189343c3276bfeb5839d76f2e684b4225f6d6a5e7ad57b67494bca6db58cf6c9526627dddd9455a6867de15fadc99d9790659fa0ecda1e1ee488be6a1e08bc83cffaa9444f123632ec889719e754993ac8319a72ee83a989afc77d28acd4bb5ebc486c34bdaf1d67a84a349480fbb2b1bf52e8749401d8488d05f456a75ba2883090dcb75755ec9956888b4380653ebf9ed956e358d6ba0ce6fdbecf2b45729efae2a668dc6d1c366a86e880dfdfae7657f66d973838abab6edfad13c59c5baf4783e88859809d1bcdba937845759c9a04ded3fe4bd7dc48028a77004f65f32d4fb4bdb9f595d61616ca4fd4d5a0c8533c344334f5e1053a548ee86998f9d94863b8beddfaaf6bbc916481ac9337acbac10e9d794fcf39268aa376157b1955379e3dc2cb59f7a8077cba969ac398bc862e450efcc7e1cc617e69a670de6b772af498de4e35b6e919ece29844379b3e4821c333a2f444375ea4d0ff34a3dcabae3f610f5b54d148d65d8a5a81fc5068d5d60b0ef6265cbc42c580f47b9fbdb7fa8943f9999958b026c5661ba116346ccd86633e0a603b48c8acab78672e62aa0eed4349c5235a5ac46546b17bf5e355b4408456f7339122b67bb48334847fe4e53e955e979244c8c7864ba189fbf4c818c15417cac84682f719c9bdd8479be5c643d937605383c6a9514118498d5b4e81d5b74a063fb53cc19b2da9d0af6e479339b988c40918c192435db1a3b2a7d6d46376b97aca7a9bbb30336ade90df37f8833e89f4ea1c67b8aaabdd539486b1855b9fbb53b61d3ab3de9606165acaa588bade4a4e6a78249ddd8a9334ff7456e75aabb824d8b89ec9c6bc3b5829c1ab34ee8e4edbb8be5a5b34e23a2c691ffeb5de8d640a7b94892aa1ad83d0797a3de52a66c79442633d640c3d3e72fdb93654708be8ef707bdf71757c08fcc5925f5bb6c9a57777bf1beadd81b4922a56586e2eb04dbaf685ee4ee9cdcd5438f4206bfbac4ce233ffbd381d9d622af5cf67d573465a706583da17c39ff3ad148f6b6d5988158a1602a361d7a2f86a9219450ff713e184c0f6ea4146b79b03e5ee3454a79f +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 048ea516d0ebbd9f709b47eaac66f344c571cf50f0d01c9466aa061a50b66a24 +public_key = a4163313f3cf10a65afcee4a738352fe2db19328f77599d5dd3fc20cf8adf7cd81009ca397ff70b23a5f271e7863ae3cb00b65f6af850f8f52063f55b833f626b5bdcfe44e96cdb7b6bd9802165b542de22a434c5466e36cb3a77c3c7c23fc61271550cf25e22fea61270daa722c8646a6760fee8ad70f8850fa36b92e56c0a4f9fa188db2ec3dc229a790afe12b4357d378eaeb19779f1785195b65469c6d3a06e0f063562817c4598ff5a10c8e9fd56c4353711f287469b87cb533b99df46bfbca625c56d1aa86459b27778d8fd0f7befac8e8bc088f31a37c87400a7429c476ddf7516fa4b7e27841abacceb4cf4e92158eb168cd3dfc48aeed61b3ddfc34bfa33b59ac45a77a439371f3683aeb7ae8b107bc34e7785f4e46b3f668d9565cb33af3bea6af6daaae79b39a907f5e62fe355c6965d0cadcf8eaf2adee89d0dd652213501b3b5f7a1d61cb9f9e30dd57f357bfab4d47c28577d31d5be26e6044a6383ff9a087f4754926338e486cc3e76511c7946b0f893d058f720dc98cfdaf514a47a773de6e2564b5459d3c5fbac6884fc32c7961a34df387ab86cd7965786d6bb731af75742147304a5cac936797ba658fdb88c1939c785669e4debd3350af91fb3e82e31a36d7ce59ac637a0d3a37098569a009911f54b13efc46e403ba4cfdbf59499cac06c848754903a7b8a1b7549a13b2de6afcb106a21a3a58d1e7eba317d0d84f43b113d258294ee13fd37ff9c7e85fcf0fd6df582b6310d4637309ccaa3940e76e7b73cdb02189f4febb6f971a56a989f12a55f797bfe7909547598330557a930926efbf7c59004d7b3a88a2c3066534153d99ac87dc69e8401b860c1b4d5e763440389291dfb656c97cb9784b201a90553acceadadf23be7852f391dee7d94235d53f88b6578678f188d67ac944f1fb6c2e99abd946953a49b059babeaf5f740805f18453f3d9496e51e88f0899857a07b8bf8586ac7a8d13579ca944e61e1dc08e3b400f084cbe9c6f22ef9523d4ebad2e87b757df752b55addc6251cd8338bac7fd0879631df38a9d41586e91b60fc7371e5e65977de34c740c75a5c5f54ae40ad8a2943a7f5a3b8018461445c3ce93857978db68fab41fafbb26f4deeb13ac84fc3a38b78dd76e865594f6cf59a1dd4958427bbcbcce3037c577b1ed551238a67f596cd1af627975f16bf733fe88718d64725ffa4b6e83d77a37a4595e59c887b2a205d87d1b457c16e02cdab7a0e5752263cacf89e4ddf836b1eea95ac4b941388bf7c5bd6206e7737ed0f458d01e1c6e420dbbba2fb265a4fbcf37966a5b61ba4957de0fc4854e3084985d5c2fb37964b5f67ce1b28cf5af757f08cb8ba3c3e15a6839483454239bb9d1aeb6b1bcbba516dc3ae47fd04761089e9281b5d8e16d6b4ac5eae13bd867dfeca994817b97f44ae55223cd807c0f581856936fcdca26ed8c7f6d4e1f13799157d2aaffd9d7796ca44879a363cce72add995dc8ae8596e9c7e57b8ed5270fcdbf2cfba113341fb8b6130ee5a82c6bb106c7046d3edd08dfd634be616884baffbb281f40ab58e26b4dcf7c0958e0c5bb4f83e85cc4edca64f8898fdf8fa3da66a66bb9c79acda38a22249f534da5db0067a23151a6f02abac2477574d9b5d49ed6c25fc46576ca327d614492eebb +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 686c921c9db1263e78ae753b1c9c2e7936b8229dca48c0942c56c6bca4f10917 +public_key = 26bfce04f3eb6f647abde39d7b1cb988c37f2bcfe9c67839064481c2539f7c947a5187a85006eca075a002e4621eccf90855c9e768e8e3a99da9f5d522976372fade6f3def8cf3c49e4a86c503c38ab764b2f45bfd27e8f6b5c0d2e66181045be3afa8a2fedbecb8a6bae956a04f654187a9dabf4c8214abf943d63526804d0998b89c884c1d55a56cae82557455f3a47c677e8e36ffe9569aca0c5b1c0cbbf768302099a4cf3960f9d432a0865032efb65ddaa43f0daae05aa3926ff5617ed21669b8f2ba6bb41d45e7e539840d95216a846aa39d5b16bf6aee52ab2f7c61287138efb29d3931c73ee510ea33326bfece2da1bbab9d30a7ad9bf83e3058520606641edf3b092831d3adf25435e3070c8626b4f386d8e77c7bc1ffe5754ef5b3a2d4ef92fe463b8bd68816b058eaf87b4ac2ae9fe91d16e630337d297ad8a12d30175af19c143224b4b1aa23f4ffbf3e7e5fccdc75792944febdddfc9a18dab00ef863894929ae6c1f7830d7dcb2ebd77837d970121ded83f3512f9578efac3ce2cda17eae3b375c44ac8c32e616aef48339c19a4f37acf16feb9673dfdd7836ffa99887f933f4bf6675035e7cd42b340c5eac0d0c71c2ca5d357554efdd4c1206baee66707c1dbf52b4f4fc7567cb0f3b606ade160aba5be5aff753983b19938215e88fb87a867b6cea68e12a43f3c2fcf3a93aec16b48f8cc7bc55c5b18a33b6768dcd9393f75e7b53d053aed304f01a74859f3536a4cd7832d4b64d6a9bd69ec4a2adec4659defd73c9aafce4675f8bfeadaf55fb7a28f4af2c43fde90f4f87567e1ef87dc03d61ad29490c658b8367b0ba1eba3c3c91e58e89c8cbecf4bff9146cb537958bc1c4f7ade6f348cadb557e8753acb2ec4ad783c58c8b7be02368da3417cc08745feb9b3f19397fda19d02dcde9bf3da8d388ec936847d5c7c5a8e9a7b5d8c18bc5877ed4a8d787a7b12ad46454dda596a42513d8398aa9cd58fe0f685703058987b63e21c530b3b5367654bc30b86fe7fd645f3f8714fbcc0f666bb8fbf8d727933906f3cb89b813d7fdcf5944ecf68e4cf4f2744abe3036eed4fef7118cbdc2eff4e538b48d54e359d673470978bd4b5913b6cf557760389b3f6a9e344d4b622c7a332239a50626ce553a6e0677bdeea96a3efa72931b6922af3be5cbbaa06ee66bf8da542b5f341866f89ff5d50a608e95bdbb0dfb599b7a254e53806ef4b0e5e50a19a7de9ac2de2460b80884512c970e7c700baf59982bbda59773c415844b37fdc468d7f9d641c9443717d6ebf9fa9201568868655e0f89e910c5d77cb77a93f4db863eef9963d14d953fd3f8780189840af9ae60eaefc6c48d19d88dfc689a852ec28f569bfd5e84ed6a66a61fd2bcc5e4263dfb6438e87f0c7a93dfad1e7a35d3bc7f7d7664cfe9765e2e7f766a3c078e49964b7c9bdb328a88f1a9646ad53a8bdfdf912c3c714ed8e190c966c703a5b9b6bc74c89e2e0635d614624c5371efd4d99d0d576d05aa565fb862455fd14641e1f8df4b468cfca6cc38ed3207a6e7c6cc3c7cc68bc8fbb3329c9e29cecaa91ecd6b8bcde9ab6ddfcc98f9534f3d7aaff2b5d8b3237070c39e22b43a425bfaf4ea59caafdd24d6cda3885cad8cbc7a2e3b82554fefde1a383c558139f9e1808c824829ab0e +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 2387772e50059cabda53cb93ba24b19ae529496c03b36584169451525c4a0e7e +public_key = d9f945a75e693bcbb0c7a385939ef9f014f640ae6bf09fae400780966a8ae885de574947cf6a607fa4b3d35fc77cd9925ff3a89e86f378ebabe4d4e3b05fcf979d68d86acb44683222f93bc50bc8f7058def77a3251e73222359d25c3a87d8e7472fe0c6e4c30d4a428bea8b2d459c4d9c71594c597fb9c3bd17598a0ada8329bdd16bec243fff0f49e8a0ad6319bbac7d6866ed7953a2c933b347923589d942e6e46b8e8edfd64227e78bb57e68709bc5e5adf91234929206a3fa2cfec935988874ed61897928fd440939f94449d95ecdf44a05c20f9678b69ca13268622d174a916af10b99d8329be62454c1c0c3c36b8acfe4cafc39fdf79bce5898f393f01468eb23a8db1567ede8b4946d8d3194b2f208ff91e739479c35a69f67a1c84fcc6aeac22f89b3e5845d0c8e9969bba61fe1ef7e6774fad3514c3b7359892bd4b8d9db4fd006af53a6e687e5b0d0fb9e16fcb3765beb037eb9814de9058d48cbbd4e611e9c8a24db401cc8c5f5770863b0674f9e71c8ac385e536dd3cbf4e775c7778c16afd849d4b1c1b6ca9ac63d3de47cda549ed009b4ee7759fdd66eb5555b1aadf2846671b1b8e9aa83fa23e6bbd286d5b10bf3b1aa71409bfe55bb651c1a676e13a8e9cba2b66bf46b6683ac2d820f04dfab949eb219851a8cfe1ccea4cb8bd6d05f6bff7beecb4b5ae5dd5dfec33dea5d4d2eaa4538dc9b9bb39b051ab7d2239ae0b98a34f5547497ecf9059e9bf463dda3895f3fc27a534737677e415f7313ec993144841bc756ea3ffd756c3c22e56ceaf336e107c3aeec9b1dd7e13137e392b4a4437ae4292aa0e24957534856e30ccff827cb3fdb31abad86298c59ac8ef78885308803591513870867a018f6ed2705b4832df40739ade4d7e0031dbbbcc5f4966a9123aac92ce7e1f5da3b5c6e4eefdbc39bb36cddf47ecb196840ac84a6d7f1f1fa2f032cd22844a64c4433f414a707a9f200b857ada964d17c6cee03e287cf48adbc83ca2a528738ac567c4c8afbaf8ba57b404f700dfb8c563b5e494c6679e69acae47a9cbe4c79396bfa2593d74ff4e29cabdd0991101496a048dac19b759dcdf20517aded8371ce74667dd8f7c124ea2347d9fc47bd5ea6664c0b6c228faa9a088df3d9fbb5f6d47c8bd3bd9c4347db41efecb80fbbac9076fc0d56b8f91b3f3b7b3417d592994771ec3695e94cc3ac73747f279984b7350ed9b9411fd1ed35b786fd629225af65bd5bb5c6d16eb5da8689c9ceaaa234748400db67efa5e4e7ba63c683b4f5f6b3586958700d58ba7b9c4bac500b0d34bce3b2bda7c5fd5c8ad37c6466a9b877278b7773ac7a8d922208dfef44e236053ad2ddc9596f796aa7d2fd977e8214f0d71ec66163c5cd6c5fdabab7ec96a51cbf43296e7e375367ef6e6ecdb46089c6604909d055033d53e8f8c7f8cd6eed82312fbabc05f2aaa6795ace88126e620e397b0a25682cbc805a96a84bb84a9a99acfc7de2e2ecc2e5cce518036e40dbc3347caba3a9e78cb9e2eb8367c96d70843e37d1bca5b5c3e86bdf3c2e76a4cc467d0a3ed2ba18e494bc7f963a9a6ae575d2c57a3847ebe6be64aeff9f3a3de4d125f2536bd1741f6bfc8f721e153e74049c1e170144484dddc2716b4c487aa0398ee9ccd2804df58fab8e2d32ac05bf22a8 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 155c29c5f0378df0cd0e847a80a07143cf7522fcd880c9229eb9feb1ce340cd2 +public_key = 6a8d35eda89cff189f731ad5dabb325429756117f3181ed327e4f22de388a7e95d8e0d76675d61716fd9d59984540471fd7ed32904b13dbcf7d62da2b7cb653a68a46623316557500cf4bb707eac9b5ca17d453320fd6507d5732829af264e7defe7aca7364d9914e4493f8f57d94f1bff572f7468da3b9f2e53f064144f0396c1a8d95ce9a5e530a3b33b19fd6769db307944095c50c30762435b76a5dcb3af494a5c2effee2567664a376f3b30c42e720596313198f1df7ead63cdf27d9a91530a5ef2e6c2ec09f6fb95302598b722a991e989a1fd198836fb340fe44849dae44545a5a14b46f474d78529bb6dbcd9d148949f9ecb0d89e2f98ded84aa48ddacbc1abbda4eb63f9bb4e466fd3f1bf4b4285cab3f3e5acd8a3f79c465d1e3efb50670424bf78f14f443efb5797483f6afbd21e83248f3d39636d06e8ef4a334f81545b8c435639604e4a1fa67577c5d15c638b8df3199aa5343473dd5b45b6604ee451358f74b82a4ce8627b6dc095e3d35ee4e3f2a4b13d7332fe8d14f08e8077b7ee2db80aadddeb1da79c2193201996037efe4ee8bf38e8fafc2e3a226159ac15f40e6683ad00a55a016e90a279e1176f6b407e0e345594e2ea8d54b9017a76d6e2a61b9585bd5e378875ca26bcd71d7be546ee99d716cb8587b7a4e184c8119cb325d611389a8ca0bcd1ab6a7107942769cce09ddd175ae9305d438a7a475f3af9b29df30a016479f8aa8da34f73c25d94d4cde10a8a0f0d3344169b81cb5d8e6cb662a4ba28c8693baaf7bd46a35acccf7a6b7cf3039f064b4aef36bb29909af11d8924ee59af80b5872cfbdf0c53830a360688ab31a94cda4cefc106ece341bc0566ca6ad1cae54989aa3083707ea74680ac1fdbf54fe3866bc9c7fc43e89d304fa9a9ada985ba3fbe5efbaa45d26aa352eaa710826aab806d1ff8a9554c842657a3cd2d658905fd63eacd8e9955ab7f3ca032b440c7889595a34550f5853ba4071fecd09ecf6393bf657d5f6052373ead8dc920c58c4af4827456be174842ee7f2487c64374bf457836f13d4d65dd7b555f3914567cd884f6e1196bb04cd8c7a77c77d586f18e9603f45b1b9675bc62a4e720fe6c3e7d71729b0a8f9d69f35ab73e55948f9c3e766c4f25d394716b1998fe676495416e548429d8cf70e48a81d4a4e0de022bedfd05d8ae9438ba27ff91f5f45afca757ca88ed587d57f543921f670b36fa0022a4ea4044318a4b1af8a99cdac8e1e65db742e57e8ea9194a7df786665c827f99a89e4b5cdb3394a57aebe79be3d678984f1a0a4e0a34c658daabe636dd47cfe5b7608f7bd47ef0d5d4a2c09e16eca67816a4865c6da87d48ef4753f9023f6630bf7a50ad9c59394b687dab23d81ab3ddc79a6802ef8f6396cc9b3ea9cbfb482d70e95285f758cb7cd196d5a9336735faf322bd8fb7bca773cef7f17bb8726a8cfa917db9aa6a77cecdb6418ecbfbab45c53e4f855a95333ec6fc6e49bab90707b8723acff7d8ed3bbabf53228dbc2fe6670e9db7b77c6028c4d4b09f295ea54bffee50c25cc363c57f91fa0754c9bf66470ae9fde12133ebf44810b83e8d2a79e5eb98c17d4db0ffed17afeb5b697df27df7ebfb588f3a0d02e10a041ab4e3b97c35070f0da64f7e0e7076ae69b2ab51a956cfd04f8 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: a9cb9a61a3324b1ea5afe693b32784e2871096b2ca14a11acc9577c52359a241 +public_key = 4a8eb33aeea1378f87fc699e4e5dbab5ba45320968fb7cbfb358c92e25649445715a2fe1b61da5b044663ffc7deac3546a8aa060537bf47ff9bacb4c5e9e8726b5ae7dfaa45f153f339e40106a80b3c54eaf273384dc8e47f58e697fef3bf9d5aded9a76ec9839ac471fa4d4c196587cc95d90166a258df9abed802ae3cf6983355b43dbc9c6a4748a6130aa510daeafdb876ad0d7b2653c3c88079e14d7898ee482f34651b8af38f4fd7bdb4989740861d358384a4863c39b8912259bd786533878d1d255dcabb6bb80cf87c75bfcb24c5688b66f7a5fc289eaa5051b938fc833f343c27375fe4a1a6ee6c35c8d8e31ebb63c82d38046c4e3430ce0c77de68a3ec899088c92ebe71f75b1f79e577e09ce56435ab16dc8fc084068133cb67cbb0fd36a73d8a2130d623e03f5256b99b006d941ba9cdb5e5f62a9788823e8fda87c95664e4a5755c83df636a8e3dd9dc8d7ce8f48e6ec10e49a7e9449f95492f0e4ae14f6969b654fd39bbac79c7e0c5d7559e5e37e2e79b5abf1dd6d679dfeb455b94208d87515ddd8898a95747ca9b64de64743a6fafe878f7badff6a4b2023ca367944f288a399d5f648f834c39de4b009f2ef14e27ff4ac666e96c034c0db9a7e8ca64109c9d4b34f7fc70e732d2ff41cd3f58989de3bc7ed925ce84edb521d4bd90b9dce0b296365ec691144ead4d8cc7c136c87469f200ed2faf3488f89b52e98b920a659386ef5b48c403b4ba3175bbc6cc5a2cddfd6dcdad440d54c6dac74ce4674e46444dfb4b50719f6075cd89c28c5cc1ecd4c9c715af34aac79644dffad482fe3889c5e7bb9fd124e50233c673f5d53770feebc999997f43ff9c3b0f9feb3dfcd9a4ca3ac581b9192984e43999f0d34aaf43fe8b02c8aa30fed579457f204bd1829e811e7bd6e4aacca5aa7c604f0dd29fbcd24760b2f43045df1b29f575b08e2e1344a26ee629c0e9564c39b09c88efabece687ed6613dbab14ac202bb6a8d858c3fe3e6c4fa81d229d4ae79ef6fe7931dbc93b0cd9f18f3b278e4c453ab508147fc093a9a38fae622379f56397ec6c47cb7067ff08ff5ca5fc26289fdda78e35e45c3c6cbad23593ffdf8d6fecac55d78ffb23839b47e86d4b4db8374ed9214b7e059de3068d7745534de18b9d4bc5eea755cc117b68b7a30f76a94597d824a0dfefd59691f0b720f257f1f96cfcc3573c5696ea44de7af14a843c8eea598f1dc2eb73a9b80ca187685dac1f8735ea219cd01c6688f5bcaf57eefb3b58ad65b8d7c8ba4aba5dbcad9b23d6bfd0c7e8398fee1ffbf5f1739ccdbdc5c41d943e977aff62d91358ffdd3d54b923b51177ee27b284ae9cadc28fd5aadcfd1827dfd9bfb32c4ef55e7f48735bab94f5e5529a9591e5ebe016ad09b9d94591c7e08ae3c57e636b7feecf4835a828d895a65815088d5a1c7a39bbd5633798aebcaae89e37d8d75b4f34c73c2184ffb56706afdb3911943c216df350ee0835c8233a34b5618501aa36ebf678dae07af9a567ac7143567d9fa89a94a0a4abde383706ccc3826a83dfab8ae7165c6c6555bc77a43b5b3b2b69dc56def5e792796283737c6f5b301adcf07fdd60e1634a434793383860d84a76807c2983c57522fe3f988486bc386cb335ab55689d6b449b7a38dbce911f512e4f148aa1567 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: e99fbae8a024ebbbdcef32ce213f6aa942e3eca925e5da4c09975d773b33a175 +public_key = 5b19b76208b41eb99b74dfb00d7884ac289c5b4632f846fedaff38e07a34fd7b3acfc597317dc83e03b9b45c65f8eb64a08b88592b6676ebf35096694083e43ef758fc84c9d3097266b66c9c34a6c5f876779936e345c3a086e4e2795e66cd793ef3a22cb65bd06bbd90b391ec4f5224cfc395674d995ee09b79f9d353437dd49c7ce5dd781cab595d363865689dc8bcf81a80c4269a0516d965c8da5618ec187aff4ccdde2ea4f863fb8e517f30c3afe5c98a78e48fd1c26378407d3b189f8f36656b99f9cfe329e7f06cf5f67d63d728a4e2bc652f4e93e52877b84edf736da1985985c26caad60c9e700eb54cee83a8cfae986ab2a85b33788674dce4f566c4d6be35e837266ebd6f61c3c6ff008eff10298119e4e4b68dbb4077791c7d96a757e595d8659614c878e8d97e7437503a7c7e058a3edf95d34ace86b9302cade100adb0e624dcbf54e61ab33b9aac34a0dc6f1faba14d259c546c672ebb7f529ad10d5585c22cd0c5be9980c6490d86d83a77b8aaebcaf89e7a81b55a6f2a6be7a4e394dda9ecdfc54a4e7f3878fdef039b4944cbc6fc629bb3a3ade353eb3dd5115a665087c00a4b771ffd490748b370d8b4c4ec37cdd352563ae1479597d8035c018f4f498d5000778a81d6a31a0bb8b73decbe3e49ef96428c79569c5cba273a9bb4a77eef98bfa54ba8267bc42c643c29577b2bea5802ecc038ab70febeb23e9f72b7ec30d0ee791126a185d4da77c57ec3088822d8d8ed9be86606803569d460d6a9a00c50dc7db19b765e7cb8f29e1a66f4fb52d85fb515eba35f74d97ee85399d78ad5cfcff7935ccd269731dafb3c4fe7a33fd3e3b9438dfdb396fc99b71e3cbb883c16869bb114bb1adcc0686373864eacc61458ec9ac98df381825ca80ad954562ab932debf48aec45a6cec72e9dcc2d3b4d06e35b8b5454ec4967523ab82e9aabefc897817f2b5bae2e47344bfbc8c3426802c77c021a5f55f7e555e9d45bac868c7d45c06b6474bcaff40fcbc491ee2176a83ce46edadffb386cbcd270456e7563a873c55d86fe51b76b3fe3c3233d5e9911eaeae5deb88b9c36e0cfa60ed3def7de5b1dad0c5cbd6e0dfc2859ef5b09d3c298c5f74fc4b9937412ad7daadfd7fb99488c7a7f87c0433592ecbd6475e91d66a7d89c2f77f85321442c4e7ce62edf12dce6d75dfe1ed2a7bd839d44f08f592decb1746430603a00a2ee0f626804e0b32eebdcc827c8ba7c36f87cbc67cfcf50f65ad2fd6f1363bb715557848c5a01b25652437ebe7b6956c7fbe644aa0dd33925f64bdd358e615246e95294196d6af1aa5aef698dce2b6d9715b50fa7737be749cead7c84977747924bc2589f509ca7a931c3ffee7341547913ee695f8144afe83430bd5c96cf6ef587edf78d6c64c3c33b468b6f3cac46f29b60f17d5ae2ad5e5c63d21b6ff5dd7f08d25a7f1cd9d8f77a7a8ad3d52efd620be3d9ae97386fb6da4cb6fea19f3937536511ba8000eba753897d16b76059ae5b5d7d6121cc792076ebc2ac1ee59fa36e65d13df3f6498f45e998457d4337a2c62c83eafa53d85a94892be3d393b1c9fcfb380fa8e5ea59e968d75e4b97d7551443fcdd5926a9e599da552acb4a19b6342d309b5027cb88909ffc8c83b1778d8aa46c9d07aa2594a7bfd47cb7ae1 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 67a216f37d67f5e74f782f1badbce1cc8c80a6130aec305b421899a4faa0a6c3 +public_key = 371d631d29c37b9d908dffc89d075928ccb3b9558a5453315acabb5b2f8d0abbb99d63b0294b68595ada648367fe044e1434707366faeb475c17196a3da388970fe78996ca918ad4246e4431963b10b5a0d4cff8aeca3b26363027dea5aa5fb5333cadf79a59b93b5ba484bbe56e8b41756a1024f9cba6407b44a2b11ee08ec3de92e6dc093b4abefb63438c481dfbaf0854fd617d88ebeac83aa5d624ed57c99cb0f9f3e639cacc8295ff4cf9bcc94ff8151b91cebd42407ed553bdc1712d3c7f2b345443bd7d274ab14cb67c3f8d914366eaaaf20cf46333b4efec5e93ded4a5d94c6e0a43bdd7bfa52c3c4c718591f11b32ad64930a638eaa0fe8e64a9e325f6313133c02b5b0cac8f1544543fe24aefcf7d927e9f48afcf937385c79cb85e0aef56e176eaf4af39b47dd4ef56a90dca39365d7a6a86d85cdf1312bc71876fabd53fc08bb4dca46e4f357321b29ea862fac109a643a5a9a644e9be6845e5f5837b6188de0c779fb0e430c2e9471bfdda01968890fba854dc60d97f73a5ee4dc1d343fbab0993ac5d967b659be551a6570f7d9b283445cc288f98b4740884ba72b338c45249ab74c84a1435a84d4f534adbfbedd509d7a3bd1bd635f538ce72645650931dbbc6e295dcd2595f14f5cc12f3afd9c38f0d7cd550be79d5276747e3cd4bf9767062f7c842b872e294aff495e076df819c6c92de3622ea968b08cd646ecd302ddd9fcd5bf7f19a357693e032cc46b4777a27e4d41a59bf087f1a259dbe2e3cc7e5ad4fe48a8db46ea5dce390eafe325875f816f9c2abc4d468a40dadff911b9bdfc6ba986b9bb7236f27dc63d7545efa56e3de3654475c5668d75ef9f03a386179cae1de00b35343f48b7e36a79dbf979cdc734d5855b911f8fef1dc9c04dacfb67332cc8c9ecc4a3a9a98bd30c708e7a630a19d9dc8ba2b28fee4235db846f3a1289960f7f887595f5d4088525fcf5511bca906930602b5ee2eef7c34fd5e78ec9db3474aa7747342dd839bf461e45cbd603c3a85ef2b679cdb9a9f064ed89d5acbf75bd3469a3ce7993c6b978313a7a735e75bb94976b3539b4298cc47af58426cf4310667b1315baa5937741e3530afec70cb8c60e06ae1793502b3e6a277bfe21087305f453d8e99d0883de184e59db09324e4cbaa067cb1e766e455a34159465c01e38a285cc3875d2d698538ac63de2f496b22dbe468a952c0fc5dcfac5a9a7d23b5b3d9879e5731d3e158672ebada4e4f44fb7afdffd874f52748a630aa41d188ece499aac3f4e926d79b3ccf427b35897bf6b0d2564b2a875882ad74706713e3f6306fc66efbaeb8d4cadc7c85b7bdfe1c406f069bef4465397386bfac8ad9686935cde06638f156e6e4670f963ca82a5dd3207889446be6aefa0d7cabfb26e41868a6187b5be7977c3540bf8a8c9cb819756559df44cff96693ad2701580a2b4ac487fb13a27c86a1f3ac3b6cb6699698d2ef61f657ffb6c8d792dfe0d6dc005cd79703e9330435a29abaf33dbbb1c566aeb1d349a8e409ad3ec18aa48632aef0667e1692ea2a37cf40397da3787a1e3f36349b3373af7f9a859af3163c078c38ef38c464ac5ba1fb8e50e9d93f98ce7106c99c73fbc42a5ca0595508bfa7485b23bde8d12ad7bfc9c10c68374b70a4a46655b5a67d1 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 52b19fea232c9154a3e431e9d69cda40013cf2d485c3cd027ad24e645420420b +public_key = 00e7a56f9ea766d7fc04bbf83d25787224a588eb4fe0c6b54d889d127a471b7fc65f06375d1a545ad9b058a654324b5615138b2ec4a375989b3f1b60fe3dbddbaf307205a104bf9be6cb75f3567706adc05eb845d493caf795554bbf5fd03b379b6f84988763699bebbb4b3c1a54b9c2038e9e03db397da11614f88c3f336e1593a0de815269d9949c6cdf7737cdb382b1dccc0c49317213683b349f8ebffdb0b45e35abff8f7d916a1cd1420bf74cb6bcec8dafa3a36912d635d7b4cbf33a4a36e4c6714c551e7da18b967539b7a604d5e82ee7673cf9ed07736f5b97b407879e7715dbcc089a1443f138e9fab4ed9b497b834df573deb3f829b471bd5a73e61361ec699ee613f0ccecde6fc983d3238a8d5abc351fbf48d67dd3eeb0c279fa4f7d5de666aaaafa9eca476a1b155d52459b563b6ef1549c51f83bee2963a947f9d4746a02bfedc667b120d38d79a45a122d67205c3edd378c7f65c9417e9f79389436a559511d678e1558ce163ad95593a85ec737d4936ed9c7cfe4ee00bfabeecd7564fa5238fafd2908793e2a9a34ed8b67ac31345dfd42344f6d1c804546f6376ea557739cd9cf9682549f004f6c069a39cd58f29e57d66f0f612988bf790f56e36dd9ec6beef829bd39ccd655adc8c4dee3d05fef06965713849a83cac9f74e5482e8f074fbcba804b4c6ffb1fbd941c7ec8c4c79edeea8e392cbd736d43adb3ca5498f9a55bb9537396d7ccee922b9e67f0dedb1aacdaf17902f77ea6cf5487bb643e1aecdfa45f28613f6d374ba8009833cbd8eb0aafb3cbbdd3193a6562ce7d61becadbf4cd4cf6c456cd40cf9ab0b7f92bbdcab2d5b783d65bee7a666ebbaf764e98b7d06ecd5ba546be3d7ad7469e4ea85b613e224d9b13167f0ccf95273c35767c43a3b27a31773c5b35c7e4bad316c53cdb20beb60ab77c4a76f2af78bc2d6479c9d9eebacf6ff97a47c468dbe7c439d33fa914766fcf8772e7ba92c3e82e46f735c237bcffc3e940cbc5f6d42e09f3eafcd4d96f3ecc3187f66735ff1f6ffb556d896cff145787484f5f9a1d654a2e7fcb9e8eb4d283bb15682e8f9bf1037cc96ef9cc47e6fd8a8e0e1bb95da97ea266f645e0c60a27cb509cf885c19befc686db2e7a78aa66b934aa0d42c856cd361eea3f94759549929b59aeceebec3686f7dc4a15c8d56ecf3ad18d945d4734b76b0a64b73de7b5d810ab8daf48542a4c13b9ae4affd5c788448acaa51263cb31be69a91888ac76d75c0e59ead2bf9d6439e94253d20f965dafdaca54af8b59d3bd41ae3110de33beff1a45961527589e7048fab4d70297dee397a96b3a7f8bf55437d335f1e24d63d49d2e923863bd9d57299e1185e6fba44d263d6a0abad743e959da90feff9fb38431b36b23f8a15696e97aa78ea97936f8b38bb1556d36f5f5ad3ee1b8cb3bafbebe708d9b73f9a450d45eea532624354dfc7edc43ee09e0d58f24ba4729c375cdcd440948fd34556171565506db378b477a208cb83f3afed2534c5ab6efc0a5761d46b6dcda6ada55d1d9fc7558bad419e772f65bedaf335ba37af3468fe0bfbbc6609bdd3568001734520f45d9f4772d2efed518db9a8afb2e73adb6e13df1418beb28a229c8f63411446b83fde11b3d946c9bdabba08d495aee50911cc66291fd0 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 64440adb05db3308b189bf999f9ee16e8ee3a6ccbe11eebf0d3ae4b172da7d2f +public_key = 255dc1943ee5524d9a9f09f189c54b048b6a811f7c784fba34333bec498e28e7f9d6085fc7f5b6e5d4f12a0aca087faf8f93f00e5ffb49b8ddfa17cf56e8f77b89fd7b4675dba3a7502674f595a45fe93008acad0274e0de336fa41ac0c725bf611f80bf7b4d7dfb63799e75b7748dc54846f3a8b28d055c6aef424704bd8406ed896a40447bcd42b96834c8429ca79dc4a4be300c7dee38a253e35819a43d843d46f6437622094d003a3b9914bc6946bb4f4cba41246ca027cf2e599a55af3e8cca88086a6bf8aa92315e85a9bf32a0f459042f4ba2e3f7671564055ebf49c350fbe5b2d95a5f562f3a1a794bde36d12bb48ccb4384b40f785543ee96cad9c7e757bd7eae9bbfa1ad05f0f01bbfd4c77a40dc3e24da767d8b456979913ae97fa9446413084a45fb7828ad82edbed94a9437155bfc8edb48d7bb893af3f13b5a95f86bc9e146657ae653f1c9bf54f87830aa968b96b747b9aed50d7ab413ded75f652daa9613eddf36ccfdd1299c8f2c84fb66d45ab45279735aa1f57ecc57dd7e66696a8b7a65bccf23b63ea1d595363466a5df4541ffebde05733164e80d1a80653be66dcd5af5a7cdb2158471e5ffa60d6a8faf5c98167f4574a8a48ad0b8cd31e667a7da04ec32d7e4ae1855ea9bbd0a1aa18bf64071c44f3783b30ce830202dcbdc6ce94e6e31712386bb135af9b55c680790b5147f55a6cdba4d75d1fdc28904fba638623c16be456f89d099777717b89a2f476d8c5511997419d8b5a44ac8c4a9589c5b39c04bd45ad3ea6e9967fb2fc21f5bae223d65867945ec746f777bddaaa96d85c6e864fa94e76474befcd6815b556faa81adee5c552558c0575c45ef6cc409ead4ef6fe1374d2afcbb3eef3a9be5b367cea174d8b78ca462705ba70b358d57a751180c781b38d75435b2539ed4ac0bbfe6aeff8feaf82f93b7e339fa64b83494563741789c98eb7e84d69c7dcfcb1703ab94aa71d759ec69c5f94a8e8245acc6ef07c11fcb68c336738fd762269b7ac66faa750e965f2c5b2909404c3fcbc86671043ac335ef83ab194bdaabc391bdb2e275bdf0dcf652eee207a53db2bfe66b85f6633cb779d88da83357b51c962f567d049e7f0f2b5c3c3b9ba75699efb4a8a5736d98a56b161dcd6f233c2c05909a3ba6204ce1ee7fa0091785ace7f9de6d9704f5edafd4342275564615b25879eb59266a0ee3a8b36ec6e9e9894b78e806e97fbe4bf5b5be33d804a0286a90986ff20d1ec86454e7f34597db43ac66159957bee541cb4349cf3196095be12df3e8bf67c1f5efb1deed9b787a519b3ca4fdae08c79ed4ff56a63b488e48d40195983db7ff9c0cd4a9c5a7c42889839ea9bff3cea8089a343b73e616c5e13ff75545e1723bd4a26d4d5ad7e8ed753e8aecd01fa47665b76f945ce0dded635e9c98de9eb9e689dda3bd9ce323ab41cc7c29839784e6ba907979cf8e5f982585297b5170dc7afeb94524563510257d9923e9821f8c7953ad87ca696d68f50aab373ffa3476aac3f75dbcf58aa6bbe85168b7c4012b335aafb6bee7d2524b8498d3aaa04c79163eee1f0e3e1a6eb0e2f3fb91fdee0b47f446a3ea0ff6f55c5ef582efb5c0e6dd3c8fd8a63449b4216546209bab2ad3767f9793d0be98cd2899da27f7d980122d0bdf593022e2 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: c8bb46b3a7344ad170c2052fb042b5a3b62e0590562ee82577b1081f6f114d16 +public_key = 362d71c0b6d7e459c9070afa619ccfdc5e47f57cf08f2db3dcc8ffa33d4e40c46aaeb47c5bfca8a9079ecab4471d4bcf914c8ba459433ccb95088fd38f6892062535603b536da65dfd5c33440d69a7f33a0819fbd9c9617df3a5779bed15a8a91c8b99bf6bdd4596a3f8a79d3b6994e823c2102dfcb235327357ee2675633d9ab2c7668f02e7a68b253448abe69eaa92a8d78e4e28f64707e858fc7f4aae7fb50dc1df3dcc76664bd10b7c55885af696478feb919f4cf4fdcc989a1e77b52ca64717dcef77ab47c891b06575e6ad81441ea75bbc9838aec564246c174de76a6f94533999b78dda150f552063a6222d5bc298f3e539ad1c1795e1af3b6b47737ae839617548a514631319a78d99350eb77dfba97f7208d04ea980546a9e674f395d5e77bb7b433dd47351b85e579d91eab3dce55dc1b786c0272b91f9763478ac5410ccef78175edf0dd31e9cdb4f074bce255ac2238a5d67b84b08a12984696e1ac7ae1e31cf64bc64c5b0a1ccc94e3bba8537e975c63f8e3e4d9f2afd17835f873846c6858f9f285428478b2e0ce1bd7b4900bed6a6537685cdd93a633d9cf9bf6bf9701779db4cf5e1b1898972bf978b7ae371e8aa70d970f97ddbde1ed9c855f1e663845815f35dd5849b29fc12b49b4308f5daae6dba93960aee66a9bd5e491eb9719e5dfc5f7d803672c7b4e8293937a0d5d8272a51872d3be64b4b1b33578d48be3e23913e73a385a8ada0fcc4cecbe070ca3006fae6f7da6eebf8b9e6637deea4fcbe43395c8a7807ffc23d2ce46d6359d268303b2ff9e5e5e3c7abf09599fd563d38b6a3431958e95bac491a879c4dec39cb1b97374a65d6fd66f6c66046af5b9b5889999889db34b1f42b41521f6dd753e389a8331bace23aab61c32ff28563d566faf3bebfecdedac78ccaa9ca1566ea28e7f489eda6754379f9b0f8acb217085fa48d910ed3ce4b5fcabbf5fd7557fa63c88ddfc4f3c1ba6c1deb6ed327fcbd7f44fc7e30082eaa13037ede787ffd546e6099d131d8add25551d72881be0c8647bae0eb5cbb5f73c891868d474ebf8a79fbcf0a586719ef4313bc976c989d2ce84afad7efeeee37dfe5008b56a55ab5062bb41f7c589583709377efbf7c4ec645d5d15ca7efa5c6e45a5f5a757a4fead2fafe3c7926ba7ca9de6dfc8b20daea2a9490a44fe0c14accde09764153bc9d5afa68b7a80d9a91d3d4778acfa79ccfe2bd9f812f8660f23a833d78a3f056ac030bcad487431a6357b9aec13c6efdeec79ceebc37c6099b7204453a0f77dab65346ea323d33c76f3d483e5eb9d01b5fdd55bb7e1e6b2dcca95139ff3065b1629bedbb86bd0cf5ce6a66ba1ab3717839d19ceaced283c6b748b26425588ddcc47bc89ceb267ac8cd3172b960160a6317d44fc5287c5e56f911a8c995bb92ea1c81fed5baadabb569f9cf7c1cac729f6f3e5aea752ef95b6f3c4134dea4f9d1177df27a785d989ab00a2c3092cdfbd65a5b254f46ffb97e242e3f57b86aa21669541a60ee8de4f193e839f4e539dc8635ede25e7ee00ea4438af59435af5a1fcdbc99badedfbe9d67ebccde2fce5f09f6ae364af7868ad73d8a612d33e13feab609560144abec5a4792b8894337c866ec1a5df4076739fed133a74636ec9d904e88876b678088d8c70f3c70 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 2e2b70609f3fe029a14d09d5d659871ac776ce2797a0355f16e2eb68f5613fd1 +public_key = 4b5d58d467b5ff439fb1cf916bbd9bd306661b18626746c8f4db817e3c4dd2d7e0429f9dd7c5918a86df517e5c6528c2d2e7c9b97c51ea0d9281849cfe54e0b616ce03455c7368dfe16634fead87398df3e42790228dc5e8276b797abcc58df8cad9ebc85ec9ec4a9c39d682cb38b3899fe03839947cafded453a767cd4df7ba58fa7e4c6c47db9827fa71fb7d264f85e60955203e444f9dc2b1d5954738f5fb9cca49d55c237a673788d8ebdcebb4848a765f7ec467a7f94b8c4f9bea16f789f3dae5f4f332fe0e60ff6c4986bd8b9996bd0899fd5a836d50566bddc6adc6ebc7d3c95069cd8682d54e70666f606fb238f69bf86a3a495febcd8b762625c06f03cd8f0e3561abbb300eb1c314a6a625d0ab0fb9a54682325340bb3f876124d781885febec3a419da5989b914a494d07e9793c7d3ed4b45af78c42f3bcb46cb4c7fc5352802ba0eab35b9f66c34c49f59af5fd1b75b910b8ffbb464d37f6befcaa811abc648504ee38c8a4d169fec69b5ce90c7cd11cd083cdb72d0bff5a16b4c7ab6e65f58fbeb6c442fbaa2b4345b3a3326bccca3c6ed47315f0393e78589c4b4c85e796d3eaa16e34672dba90e3db340c541f7cad17f86e05d9ee4d3ee6306e8b531e7ddb67fe1c9dc0e29f35a82a3e51b59c3b38dce3fa739bc7de4a09f4394ef69ff87f311459703e7f28ece1b8b53d578a8ca86bf90e3eabb115b76c0a87491f4fdc9fff98acf41c9dec8ba8ffc733921d45853cf638811d7704baa331c7f5a41647113fa9289673f3ecad2215dd9c5c9e2706a341553d168bcbad1a41a3c554271ee2336430fa16ca8fb98cf5e9facafa8fb427c461af7aa08358b36c5ab849ca2725b72c939fe17ded1e2abcc4434bd0ac83585e315856922ed53cdc7b49468caca339aedffbf5ec2b97d43ba409693fbb5f4ae4ecaee5b84b567432270644d6aa618669734f1dc8b06add697b81d6c83c9f844cdc8ac7564d3045be4c298e31e9cdc21c2361b20659788f313e4dbad1d56dbe15973559ef7c9ddd6b14ca69e9fbf223dbaede858b2cc4a408c33ee56fdfe7e9acbfa43123fe15b89d83498b6bb5aeb0d7404e94cceb3af9fc49fa2e466469e53da9c371e0155a775af98e5e5d70ec5e31bad70bf9fc3e6f90f285a6034a97e399f77eb393c62ddf066c588aa33e670f8976493bf41481b2eba07b8fd937ccd2b63f4d63b9487a1789a6baca926efc1a4ada70b348c1596cce7997ed395b971442ebb3b0e2dbbf5618d1213da173bf59ad7d5af9634ad585916cd63ee1248ca143a2010ea20cdad496734c2d5fa59bc4df775ee579efc60f2364e8763ec1e5641d8da9d6235d4ff9ca73f4c4d6db9bcf3383d7d9a025ac76db1ca4981daa282cf22a4bb81c2df7d80c38c8365a39988a029a93b5dcb2b004e1fd1b63a64f97c65b7de3f3a9490eda88c5d7955aaaa2d3c699dc83ef348e388ec8723b9bd1c6637b94b6ce4e642769fc724eea16d449d16cdfb2753b338586f736dcdf255ca65cbc8c64e0183ea45544312099a66405b01ebbe2501e6cac1dd3bdf3e4b25690520a9a224ee5437ec89b97539035652c03b463ff635dc5d1f9ab69840e7f22b3391a67397066c8613fa31080d329647a7c4f5ab89a47393636ff0671a4b06948c9f87fb580358d467fd3 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 4725dd8fb314bfd8ee23731c2341dbe114606d9abe6434c471b5573e7df193bb +public_key = d0a470090d708a0cbaa0e3347245d0456dc8f96e88ae66af363ba5cee88b03a341f5255c329a7d119bcac87c46bd77a1b5966a40cffa45d89c7139d9fa8c69968befa8878d89b8541b9aeee6858933ed793c045deffa62251cdd017fa46328992ba7ac4fe7fb496efc7448ceddadfd9d69ca566f6a0adea700b9fcfb1a6bd99f91632c74af68de3b4aa932c8c6714337b1e7fa310fc6b69befca8ecd0686502189712f0c5328fed50e07e649aba312a59e9a44fc9e76a96de6907dff35b6e3b5e36a9072ac95d856aa7014699ff48bcb8bf98f5e68cffa740e0a5bb1f65df9cabbd725d96ce738bd39bad63da05eb58efa8b9e3de4f6f188ea0617973667d611c89a6f99b3c0aa5f4bbf7376afd82ff73dafd7671bcb60a87c5adf3445ca3381a279c6a40be824373827494e294ca5d83574e0877e4b3e634acbe06c8eafd51540239d318ca8a2511cb129aa52228ba4a64444b86ec184a3a29c3fee11dce335e4b87c457710fa4fdee790624f49fa16db0417cfaf9bc4fe88632a76766fc8c5ff424849cb91d445eec72ec2336afd7813c01cc893c646986f8cf247bfbb05149ebda38f00acb65cb8bf543e4561893eb10ed63b2379168eeb7577b18aa963315a3b0256f9689a52bdfc81e298c05948d920aa5bc39759f2f56d291ec89c59acde3a5497fea8cce9bf5266b363b4dcc1b6c78fbaa4241340dd4563a66d3413cb73ba1893bdbcb3ff93bb801e32940998427769d29d47bc15e506b5b990074e8d1bbe2d988699c5f6726a91513988628cf301b44f206696353cab38f68ca22ef70ccc6cab887ac3b8bedadce2513ca34a2f8b0d94fbc1a3f99bde812b69c63c2b8234dfd121e5d7949d6c4014453e19a62ebefc77fd366713ef2bcb59a074cdd34e7ba3789e7af38ac71335736890dbcd4f78edb10529381ea3dc8d0d31f88838efa47772a7b2541963b0c7b06357fccd06f38349cb5619c943067ad97de9cd964c64767c8394d7ec3fa4ed9c40581b63e0379d00adb275f6578f065894e8a47796489b994ab957e235455fe108eaf3dcfb378648ad6f51088d5ec8946f1599a8329981a7775523f7c8ef84f6d8b3ed1d5cc9893de86fc7b55076b14d2c7c1533cc3217354cbf4662ce62aa0895cdc4aaefa666687adf13de791adb7392b78d31d6bec54d68c403edd60a768bcdb057cf4865cd33887e5dc48bc86e1b51a649ce4945708a6ed65f946e18cd6f364590e5de65200afc48bf30f26eefd02aae79bb8fa72791807bdd3f3eede92455469d66b51dbfd4d437f0acbbfc0fbfc5e93dc89d4b649a6f9a7ab09e2679e23d40c8e975413fcc3feb8c2becf1d8f7aa56ea31380e69ebcace98d54362fcf4b6b6c6383fb882984e58839a808f5b1797e820ea9dd0dc8c5e8ae5403888e90e50cf6ae2c6ef60417d8792efd74d07ea45d67f221b6d2bcceb65d37559a7c2495e6cb4ccc19dce5f93ba6d6085bdd95568cbced69dfe3138b83173ea7c58ebbea85e6c6bef5bf6ed7ddf29a0dcd64b455aa6e15dc1d56632463e8833cb95702bcab2beefda773a73454e1065e0509e7b75d650e0eec59f8d7315ad96df7e3e35837ba5ffa5f3a9ef6bce8302647fe02ad5c055ac9d19fe27027cad17633dc0f4693c1f79cf69756e79c9fae7c954a0caf2c6b326 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 818d3bb8ebfb32bf464775f7139bac0a5bddce80ec5798595992f9403002cd5d +public_key = 61ef9047d957279de982a9349bae7edbe89d04a6ce4cd5fb24d989327c855acbc39e6b9881ad783166af6d13d43bd34eb427b4a8c3f676a874b1ce8da60759a5248ed55d8abfe9d723dbe61e48d58d4cc3b26fc7536e380d1e9c712639e50494bf195b0e6a9d4c2f803278832e5fa6cbfb542f55ec777396ea0ba5cade86c0786180a4a033eefbba793e2e29328d9ea40eed6b9b754a18acfa024d4f2dd7d11b036c96abe455f7a6c06bf49e93d09c5fca5ec643b93cde4ec9469e3abdfc2b8dbf5638450aa498c345f126782a6cf9ac7673a8db84b0f87086eaf1738d67f3193eed49e3773e7450a3acc5fad323be89f56accb246bdb6ccaf735fc89be8bd846aa9d07995bf3cfc5bf8f385d77e566c90fd797bdabfa5dbb7d4d60341b163dcf306e0241d66a06590f6e3c90f1b6bcf5cb316b482c38e7462cafcd3ea4a5f0744dc6ef8b7dd7852ee526638d414b6710fbbb7db1e3c8eaa45974c62bdb7b3363e5e5d093d11f5e7700e9dddcae9b379399c7c88aaaeee18de6fc5194b2a1998d219c4a5fb5531ea6e6ad37052a57fb566dea3a7e9c378b69dadfacbd3324facf9da83e45c4d9a5f79c8629b4853f65d03eca0a97e8dfc7f95ae3483eee45bdb265639cd511864a0e57ea34d839419ccbe433d3fd2d5e232246e0a6b81d9bbd0c50a7fa656893693a8e7ef45fa8be19a14336caadf581d8ecf87a9c249c01d4af14be4f64aed92e2c3c8c8aafe4da8db0bba534043d718bdef5b3abd426ccf6bfc3e5bf8969a07f88b0c428cc39a36da6a7c0b8bd666a1d07bcd2845718b755d76fa61d3ca51b3b774877d8606975fc377b6ee0596a6f37474c9e549f6899a3c4e46a5309f035133aab371eb559a8d9bf42d34a73c8d4d0f40a316e76c7bd91367e9ce9478d308e46c189b715c6b4ce6612bdc97405df38994b763065d093d8597daf2a3f4a4378ecb500a680a476e122dd05c6c6acfcce3c91abf636a7eba3aef138dbf41293f313ea8abf8af4fbaed617a380f9f5861185a2bc37a806cb8bc09f455af634058eaa0f6f30758a6681fd145057f8fc55b49b530ad5ba6f59dc9a73b8fbde960a9eef3c658e55418b374cee89f1dc9f91a4bb15592db3f9f6178ff71ed3143846b0acd9da648454a0eab9399f82816f8d4a57a636397e5dadf57dab388c65fd6e7bb5aaadf3f95892973c990f393174bb8aa669bf293f2f80a65320bc69b6460be565265e7b8af86587ad9b43f1c3e5a68f773045bab8cc6e043f9ab1a4e05b33afc08d19dcc67986831d0b6d662c4f7ff5a7b9aaed17a3d524bf678c7d461e1bc95fd54ea7693c3b94f460fee86b3f973b35bad30cf58973cfc309490174ed9cd6c87a82afd30bac5c6766e7d25eda49ea83a2a5e979d4cfaff68707bf3e8758f524d72b43a6d799ea92e57ad6a9b82246a7f3459cb9cbb5e157a957b27c81934d7ea9fda906cbcad6794e16bae2b06648124d0cb2f941e576fa60ae18367eba17884d5073c83b7a7a1ca53a90ac098eb7dd26f7c2fcf8d61f86fdba69309ef7fa515e5cebe94464d5a3e6c72075eac5199a1085c8ef1995d8ebda43ecabb522935331678102ff58867c65cff57af667da224c272cdff52b8bcf4805bc2031fd9d999b3c825fff0f4c8cf37e52c6007bb4a2b63952a0c223185 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: c92aa5fb91c980d9cade9ce99d4c75b2ffa7d6a6ff9bd59def1aa701f2a0992b +public_key = 7eac95cb2439a4e5e7116fa42523cc5ec7caa4146543a4d03a4faeec8fdd442dc10e6d9de9c397d089dc585398fe0c42374ac2d32dbdc605d8ff6fcc592bcab77bb0a5f4ce73a380ba3640b4e491343ab7a343e0e8fd4c130a70f75b75e6aca5306837e9bcd3c85bd1c3fa4f514fd69f59fcfebce585054a9fd4f71da3636639aef4ad65f2857a32d590e416866f7eab93dfac27cca217756b528776a73e9014867817edd837e476b0cd8d5db8f293d370437d956715f370b553cd9f5043957eaa3c34d39eda28163e9f58d7b59f301a4aaa233be834db5933efdd8866a37fb3e2ca9cb12a1e6634e95d551764487c384d0ddc3578f9288d8a2876dd92f5e610c68edc994c76a95549c79c162487d455f93f0758a43b525b04477c2c50a47a96363eb727964828c5b567fb53853fc92a8c5a0bf6e36babd5c2e68353d5787a0a455dba373cf6df40c4b48be8723ff760edef3d135887be59e157b6b4dc8591b5046735c5588cc4d5057b96df0d97f158c67223c5a854be202381270ef13dc59ba6d5bee4d7aa53fea9254ecb2344d820d9afe144d97bc8512bcaed20a7f01d6b795274e369649eecb884a4c358493e4d2618c283ba9b3449f2b7dce8bea9cd1a4a3598ce46d433692d15c5527f847b9cbdda8ad49ee455e5e43f6b18a80f6dca499ffb116e83553e644feeb307d581add3b21df336745dbde76be3675d5b0c88302fbec6b174f90e39f050cdd5f81567571552a7fff639bdd18bdc94e768a9ecc7cc20f5debc8bc9774c7caea9a1fceecc6d9f5f3ff7dfe205f4fbade7b714b7bb9fd968b3898c24e0b7e46fc65ff6c3ce5056fadee3cd71635b70ffaf88b88c9cb44aefaad97671e763d05be73436f24d0fe8b2937246dad12eece4c529a2e2d47bf4be5b978d4590f5f41254a3b1e6a29378522dadb259849151aef786aaea73ecff334386c3bc7542f5bab81c89e948d7199f709f3744ed66dc77d43d6decf537c544a4f64b19d55917165001bb74d94ae437835442c83b989bbc22ca67e6f96fd44787b8865f75a4e9a409b7902d9dc87a89e3ec88354ec3ea39627c35f4c4f88625594c2b0b5798386867afc9d46cfd50d438d61c571574d40893ba00a7752fbf8fbf6b737098e03c3adfdfc87d99b978d36fe949683b7dcc98b644504c297906df417649c0a60ab70b5c674783739fbcf13f1ac5c5d69f7ff3fc59a5d73e846d12da57cf17a73fc7dfe8f7d13d78edfb393a4c4d922a654473d4db50249362e4aece2f515f256250365660177bf345a2ccdd884933b45d7ac67ef3871969bcf94570adc7bbc2cc94908fb7731a8bf0f980a3c373d30a4e86ee482686ae996de811cf810877d07893d254b7ccfdaf7bb0c57c5659de1a5b593816923e8ffd7c433534a8d294aece662e9e0245a2fa049da0cedfb559e7ae9fd19b6ef1300d86afb5f0f34799a046ea094fe1a415a42b46f37e4da5138c5ecfd7c70f6bd84a15e56d08e8071b709e745eb4fdf52be9b1d99f47b79e7c72bb9e3ee78dcfc8e9ef63d8f2aa4375578c73edfc349be6fdf5ef817dfd0ff5dda8bb5be6598fda0bb8bb1987de7bc57593fbb01f39492e5b8348f1afc7d87a75d1461ea50f9ddcf6714ab446e189261a2a3dbac768c1e9e232985c430516bd8e18c79aef56cdb5 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 7e8086a01dc5b3bb9eda25bcc45d27f99874841b97237968495800e007696ac5 +public_key = 616571fef73bf834c48073db963fb245dd9c8f936e951961bce56158ff37b19e90983ffdf3bc6e61f47d846479a1a5bcefda59cdd8b068de9db6d9586fbbffda9b550d5e70c287fad5a4af4a67a19e2e5e45575e83a8ba5f099e4358a9e493677dee77f37adf5959e2b6b850d307eac155c01b68bf1dc89ccfacccfc6cc38a34ce5b4c48d3ee7dd2946f493a357c2ed5275e53c04a98992c949ed7745899f5c6a7f84bc537b4d795de0463335aacc08db10ddda03a98f56d3fdc3e0d74ffc6c8c913c919bae9f36fd6a1cb7d40b5dc6f55960b2f98881a71a1dbc92a69371dc9a95d45a7bd6547bea4e4f4d3eebfd3553b89cfd9bcd5728bd6bbab300ecab599da76a62b97541cb3474b7390cc49942678add66d265772f565e5e16f3192668fe4d5f73f3e76bcdc52fcfbd81dcaa4ed699dedc59b02af936317d56787fdaddbcf8605bdd1268882a355cb4e63ece88637e932c56c43405ac3844949c819646e394dbdaa475f6fac0463b8ce257520b3b4e25ed57449621b449c09c5b72e1d464e59bdf38dfa7f4ba1c1c6301b05efc41bcbdddc4a069abe46d37c0915db29bd73f32e6a06e5d1bc3864071de85227a63e2f4589a43391097226d672416e9e2804589f59e7db7391a4fab6778c91f03daa41655e3e433854b5fc9cf8e30c9dfe832d4bbe894518febbb4458617bdc30a1fdecfdce7f6b69cd0bc688963af0fec8f567a86ceabc9a0383681d3729b7ef98796fe2a7fb6394cfc93b3f861073ac3fbecc636a52ddcf3e6fadaf7d3af4908e958743962978245db5a70c34e90c64560b87ef29b5b568a716904c8326481db98c81cca47cec76e330d3b37bf6aece764c565eac07c4bbded94b687fb2fbaf7b518ca5ba6d94d178f68a7409a9fba7fb776117c66e97cb0be6854908aa8203aa917df6f3118842689a5347ba29d3375997996927f9b812961720cb80ff993d9bef4e30f7e00afbaae4da17b564b051f681b7dd5889cde27a9ffaaa370ea3954775949a553b75aa35d5956373da54da7eb51c7e68c05777760c6b9b0a78ff2f34312876f2ebf7898d3aa4a1871115df538ffaac7373751954f3bbc5445da39084f9fbd8e7fb0a732c04d77d473dc93a4bf6795f74019c5de6c3d8a6644172d491a853700afa50f0baac72fcc775d52af0d49eacbf0d05b987c3d3d187e4c4e79814dc5cc9593bab71f359d0c7a3bc9614d0c8eb5eda7c84d520e077e2215bbbcb693a93cd293daf8b5ddce316b5e15ee65fe4745f9665c36a651a6a8ac12ae62b5bee1e40851ec3bf9dcad559024dd28aa945c4f310669e11b4d33fa7fbc0163bc26a5872957c6977bbf8e7f7d65a8c806b469915dc994bb85651a40c6d590c337c6813d6fc33eb74883d5c415565457ec3003b93d2d6cdb8fc19f8bd47f1fb5cb94490f4bc850c4668b366bcb23bff1a744dd3362e94cbbc668e78b1efd9b784d12e965f469f067b636ed3ca3bdd89c0c3dc8bf798f238fc49ed3835c7dab1ebc761b98de0779b5aa34acaeb4dc83fbdbabd6ca1139875a4e5252064c4f7db62d4cc813d346ca789eb86b5d3606bc3239758b6fb5f76a709c7dfad6987228433a01a8aeffdcf2d0e3e5d5abe5e8aca53b02fd160c62db910fddaaabbc4c2df1256095317cdff9f1e7ebcc48f8382101 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: bb321ef14d44d8698df879fd52450567657f52a2df8d111185dcd7d4f30a72d4 +public_key = 375d9aa073f6ff5cc17405ee963cb5e6cef90eaab649d9ed1a03b9cb45400097f48ef9df5ba5d9b9d44f27f8e4b55b5d7fd341bb663523cccca03cf77f2ae2f3ed540094d5dd7b8fb5b78f210f66d63bd0db2665a728b9231b99d957904e4f78c9b99933a7f007cdafb2d46ab598e0bd5949299ea77f96b7eadd6eeac63cd9e3a203aaef30bbdeb4e6a7dbe875263e74f35e909286ee9684c00726b8548aaf2ab3bf79d8f55ec6c15a1f34672acad21cdbec4a5ff7b4ab454fc2982799d12d3f1ddb53a36db95c5e980035e40556582a0c5ddaefdbfe64ff79a743d55d95b25c9566cebfd1e8fe5dbabbf37b934bd43a9a09fbe5bac6567dcd0586621708a30d8371defeeabdc8d79616896533b9071ea58843ca3806e15164b1de5bf27b0c4b14749f5833c5f76cb5aed7d3b2eca6fb4dc7be2f4059a4938c0ef66549d1d5e8dcb4fa7213f9e36d8cda502d598669e1f69ce9f0fe69af063e76887f192359e5f6d516b9ffb194faf25599aaf530b09ae71d35be896590ef3a9b7878b4a3764a3ccfa8016e3ef2cfa31fec6ff7a8c8c5fde5830fc4ffd35c1a45738d1ca198ff3b8858a31dd6d770e38796da351375d0ec868e21afe7babedc7ae465848c82e815490da5becc3fa55973aadc18afb227fc0d086de8ffed31aff6fd54921acdaae0c672bbe832c515811584ae3e4a59ba98a80e3ad387ae87036961b4f6abeb6a84ae8b55b4e95cc9f8e2bf0dba0925ce00ec3390e7936c5f482c5fdb9d15ef92bee7123ad779cf434cb661ad69d5044fc63ce986e1b590d3bdb81ff4c3a1bb5a9ab4cebfa96c9f17fddf8332f5a3ad0a156fb5b6b35e38a59503e02156815656cc4883e3c75952dddefadb6bd528ca68bd53bcb1f750d6ff4d15d54e84be654415f8d93d57fb1fa983aaad4048c53d6fc4a789b82728a94caaa50f7a7df6fc7d07c7672798ffb8aab0991ea611d5e88dabc366494263cb8eafb78eb40a7f33763ea9c5e319fdac1a7a34bf7eaaf436ae4248346a8af5e2dcbaac2f6111d96d5e9e65b946ae29283118bc34a474d9f2eb37c469a3641ecaa843c112ea83c0364ec2b8b6e9ec68cb8485bfd87ff66d91300fed43d59a1476952f8fa2d3f3a00cfb7c49b6ee9216b728fcc3096ea23e27ec2c7954fd85528eaee682066db2ad62b50a5a11cc385ebe6d4f4b81785c9b8368575409738683847cd46f9399e28424d82c65e5b5b3310658c54be69a6c4bd2b6eda1b76f7e061f99996facc0b3434027fa9a1be44627cac4d36fe8e7e272e6ac69ac94d1f8c2515e5580b85d8ac3d0bb29b43c1fe95ea7c966947bff9cc324ede7b48bb4f6a88b030e956e095b819fb250b53dd9f58ca91bf8eab574034372d9f8305b39668bd9de2b6bb77267f52b0bc36ee68ad25a7c883691a494c5626b5bd97dc45a06ced4f39fc8ffe9599eea7b7cc9351db2fe8f45b45b746207f133d86ef2fb9b173397bbccbacaaa717786d202a8748b54df82d4921843ec386d918c74ddc68d73883b5721548ed6f5f9d7f95e02a65cd7bbc33843e7fcbe66bf85ef47fcc2175e3742596c2e9bb75ef8dd2ece6d037bed462dfbc2275aa09b88012e3f67dba3988aff5e0aebe2c7868def76c5110f462e65b39b2f4f753b3a3d41eeb50f7aa17723bb620b800aa3dbdab7fc +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 210a423dadd899b810f011794b79aa7f860823ac1962370e791287d3a1afa384 +public_key = c5e450aba7dd5cc6678ecefae81962959a3d68d8a4faf4ded343cbd2e84323ef342cba77573f8fb5d8da40ed7295ebde1376f1f8acb8eed4685d0fecb28a7fd34a9c6af4a8d1fbc8dc2eac4d334afe1b71b87cc1ddba5501d38dd7e74c6d6dfba04b8d1039322734418dc438fca99d0bf44f700ca474dd7c0ae5d9428ebad2f9d911cd8479afd461c750aaea66592ef933753153aa9bdf19def91a3f08e7c07278369efdbeaa3fdb7d4c6b6f6a7135b5d84aa54ddd37de9e5ee28d1944d8e7c3e1bce1a4089fe464e324db369445b5afecc41406b277e8bb9303e1de57b55deabd8d2ccd2e9a417ee9e6ebcaf60e0baf95ebc0fb0cdb1b63b6f544fb3ed7c1004f35f1af6c3daa7e2e6dbbac8d511246f8abbb3cf9fc6369a46d4deb7ec013f847d7474356aec9b4e7cae8b62c9c7bf4bd77ea05fd622b6a2bfa6ac49a9cebacce997af9f89acf9349363606a86a6696491f33c74bf73e847798b530b876f194896e22ebbd8f3640864791974d69684338f453710d94eaa84af9983e6fc3cad6e7d6a3855cada69c35cd9decb4a9f8ec66a56cb8a28dfbf329d75c6555f51ebb85279d3a1305e84119b9c2037b07ce65d31ef723bc817297c42465cd77044436337592ff391546f9c324db0ca85784df460c2d72690de4998e76f5dffd8ef5c096c93a537d6931b4399a1849488665026a615e5955da7f429ec3f213dae6b587b0f7366192366f523732fc2ef7731cb06bc39f15f35b1283654bf361f403be5a9ab154f786080cb8ed4fc8ec356847839de85af3c6e4321136477d1fb20ca5642efc84c65832409dc2509b62df865e5417faad4eea6d3b4eb9073b180ffa110ea37e6ba4399e8a42663bb5de5896239f9f3bfd17a5c93d0f4ac59580672da8891b89f7297901a9b63e7c799cbcf2a515bfb3ca9a487fa5bcaae1165de1e4ecdd758868a9f646d549dc631381e8566fd66d3903dee686cca1f876322cd7793c338876e8f008eb30f43ef8511a872db5cc0ac689c85f66d5a9bdcd889f73dc92f1dc5076f373be6430811f553e4ed9c7b5b2a819afdb93bb3447c879ade813849c5fcca97c1e6ca2dfe15a6eac4b8c926303bd806dfeb299421cc9cb82f556327584118c6931ed3f4368ab915c3df0a46b095e8cdd38de17f86824958f0cb8d79e857d8ba9a522a49c3f539c845968faf37e4beb443b577646967f508f4c2b7d6b3a7b74866aa4bfb83dd8e4356d0bee9f4678a1bef0cd2569102bd34e36bf24a58c690b69ea27ca88db664578fc13b57d9a397b8387fc5367d82dbb6981674a772b6a95edf10b14a7714fd2cff38419297ee09fa305a59bc52ad22919b1b61bc853abca3a8feb83a794f2cf7d17da71a205571573ce31faf7f81b74448ef74d6a8138b69ef967adcc75730a75ff135bdf198b86a2a670a96c58d55f95433851f61850d7c3e8245849a24da407b6d080abbab77abf58d8c46f2580717adbff0481b1973c804a406edfbd0847dccabbc9fc7557b26534ceaf49ba1b3afbff95701db0b6bcda7f0df352f5869aa7f143ed6b86b64684b34b269fbc91b7c5b25ce4d33fb8198db38454d9c6038e070f3321dca0f237e144373fbfd47884f3ac96e4bee4dbfea5eedf79fb157b32e2818048bcd9b8e9bb89118362e59c75b4917014c2 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: bc856afe24213e3d14c3d6f9b89223bbcfb2c890722d770fa3492c1e46d1c302 +public_key = 08f7945e6597c997fb0cb4b1411f88d89e5be8e3715a8391a496d47c15b4ab758c8d9b47541c34124e7a439bb2154d49744460811cd1b778879435d77f9eae07cebb831c75eade552264a6553f66e769b898b66644ca93f9da7735135d743c62a3876c0c99eab71c73c9b88b5dce4de0238c831d3fa8f634903ad1ce6be5e88f3a36aacf6a05639b9ef221085b39bfab934ae2553cf68ccca3cc07cb4e1ca03cecd2b1a5a8231a386456b26878b673644bc4ce61319d454b68fd5855f68f48eeb0f7d129ceb06f356a9da7362234d0acea7c592e6041aeaffc5771081743b6fd721fffb601a651d9af658eb9c5ad8599c3fd40f89eab5d93c6067ba30014af51766a41d7dbe664fb722476740e885a13da8d68a795e9924ed844ccaeb697be8c5a64abc7ab83a163cae74ca187ddecafb53c05fa535d43786679a429677cd3f672b7c9cdfa2f4030c3fc3a147ee1bfa8e51ad905a778ae9f69bf04c2a90ea1d986b15ceadec205eeefdfd05d55dbc17dc5eaefa9646c3a6029beb907b633fe7164bf60fa5b75945bd0d776862c3c362d06b7852ace9f93afbe9a4d77c548d04c68216f77f569875fa677921c671fa887b98866e9cf58150cdad194adcdd34431efc3735e78f6d5d9fb359e5c3959d72b37a52c30359dae22138dc495bb2cfdc4fefccc89eb6b70764cf64cb2b02699e84a562f076dc53fe153d8bc1ecda29387a15da95eedd8d8c666b3cbfd4882188b5519e06ba5ba1869463834b48dd9a2d7d6b46eeeb83834b7db556a0c6f486974ea7b77c1f25f91696798fd0cc1d01c41716fab36548f4f7b842e99a85b6dfd2ee7dbb92d37fcd6f37f058d88bbfded194bc6f65c723656474830581bb92f196e9fac65fb0bdf662c34cd1739edcf8acf1ef91f24701ec6a837beef54d44fb50a9150d9401dd96c3abeb02ec73b878f7fa1cc39d3ec5d5fcc4523a948a30bb1da4b35890dfac21f34b9b571ec3593e83adcfe4f8ea68b72772f464fcc35e3dba3c0aeecdc7e7ad7ade47ac7ddef66a2a76d52a3844b7f6866c1b4bc81ded6d3155d4bcb8c13239fca6f41cb2bd92696a5060fa887547638499216fb31379a45bf7b43fa2e75fe38fd98d7a4ae2f84477ef56c8ee228b3efd3cdefa807fed357c455768a77cca28e6984913c352736e76f2e92de66f781dccfdb0f4fb53e5eb6be4b953dbf0e783ad77a763b73ef6c03c4b45aba24a88e85c7dfc4bec3049447e688c3f214507256db838546572a42f4659a71a953922557664f6452fe37e8b4ca64b5c24e5cc74b8e6a988447ce07886cdc59eadcacf5cc5b17b4b0d058c0b3c6e0df489066f4d2ed63a5d165e61bac9f2f8fbd0e18cf46476935fbcc0dbadccbfc72cae9b217d3adcb3ba7e0b759abbe67eb04e06c09ffdece7ec455d8d15ea6302372fbbffa9933862028f7bdf3a1ea3fc093cafcd1bb347096b53929f1904febd86eabdc6ca5086c51b0c471a7cf781d1ccf20bb567ce472fc663ab10b75bdc664293facab5c5d4db37a4667f646ae66edf46ac243805ac78e5c483e266f4dab2aa705b9b3f7edebee79f351fb4301c562e30a513f6c73d56cdbdcf439f3f62f33f4ff7f876f5314cdedfb4527ad75924c59dc03d5f604585571f7e69c7c8f254bcc5af0ced187401efacef8d61e38 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 5fc00f89563e44b24cd67d0ce684effe5731619fd08e7d72e2406eb016afb66b +public_key = d743a9919ce4933ec6bdf338099cd7f31d64775b6700ed30fc2e53478b67b0f344da35ca35e4b7c289a503d5ab9eab6e384f79ec8ab67c2f64d7b9b80d6bce26098a305734e44342a5078597f3bd574b931c3c74461c8da866f39c24c5778e5f7f48cfc026baeaf3f8a92d7f519ecb7248615bcd76f12763f8b63c0b75a1ef075b6e1c61b1c3bacb9c8895286e317f9ce083b90df566ceba4c01ed6215cf95ab2b95e2c7d033ed442267fc87b475a63b53fa84ac9fe3c8bdd3cd07ce385abf63d22a588c9ef6f2d6e5e3b7d5e0ba96036eb47638a9e83c5bd3f791b46f65239dc5bcdcc4f3c9390953ea4ef875c5f3df0d4eee5e8344deec53c3b4bf584932f168710f66cbe718886e2ace069d34fcecbe39e5dd013cdea26b8cf148d7f21e7f3276ecf9a7e4557dc8aeda68022ccc44debb6683ff5966c11fdff1ac678bcbb8f4f43c3eda94401c17c4877490e4393404db53a28bedd3aab78e25fa58f3741e1bb1b9b8f02df64434ea9c5a8c9fe7584ea548f50db9f295d3a4abbc3e392a36cae9af1cd5e096bfb2dd97ba717facec4b7b83bb6d284c5fb3fb634ac3d12e98f5f8748022d8cef7367ae47bd21df68aa8239d07cd9fe0555e07dbc356293d41bc4f1e133ddca95d2298b2aea88aea5637d36f390a7998033dd95e8ee6447c5d5b6ba2ba6fc794c899f45860659ada530c7669134519b5d1e6ad759f9a50778afa6dfb942f98b50067455a7b6930becdc3dedf64f9e14b29cbe173ac50cfadb95c550ae7a55387bf01ac3c463fffed7bcf9e34da6dabdd089cd32aa9714a6a55c79f635b79e1d92353c68794be35ddcd65782a6674f87343a6654324f47f5ac9b385cff767ddc9695f753a4449e08371d61f8f3193eee776f19faedb206f67a57bc991da5b2b69a5aa3efba06ac917d45c9baf5bc1c5e3f7144217e84f1693360fad690f5e688b7d4c45cb6b117ea0eaae30abdb6cd3c5fb8b4f9c34eef6d0dedc73d9f8daa5d7abcdd950f37e9bcadaba8e394b137e337a8825aed0da175fe9299de2eee3048eb3fddf65f7b36c00959b5ccfc150eb7dacfd5bdf69de33ed63a01a7cff6a9a22c56752c8b9496dff3f8ac5ca444e10bb6bebdec7558bfbb2e37d5564645526f806a7778b1938fcdb7da3e64c01c4a36a847b77958d27ab9defb6f56b6a30a9b9962175c1382ecd28e979e0e6d196ba8c3ca4daa57e8d39a9b280486a6d2f64640c4b0974f499957be974fb6b545dbcc868098332fc1d3d75e38eb7ccbee64a341b38b0097479c029f57ced3d5d39de89a6a6f0c6e03acef8b47bd2bcd750a9496ec4fb8dd6378e1ac77aa9f37a76dd72d268c3667f5926cc76b58b9da14dc173d7732e24d1ac3ff553d6aec8aeed052c569c59393997372e548086abb4df3deac2ce7f25d76fb58c4ff348dcc5965720b989f4baf52623c215369076e771fac786e8fdccde9e7da75ef6fd7edeb76948f97a5c3116869b1ea46f7efd9efd4be1beaf0e8c8bb476d7ea4bc4b5bd4b3f79a30a3ae5479ea79217537b97a7dff6ab4edc9e2ad6cd97d3aef52837afbf32f799a3cf3da6adb88f6a0aa73ffad0c00e46cd5447c6dc483b4955a0a3c241e7cc354cfc7085b84d5e62a49e7d61a2d0e85a009833f3eb2305d7d435e2a4c81f358aa8d0dd50628096f4 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: ea22a76065db4b565ee1807fbd813b43bde72b0e08407fb867c6a18995025e50 +public_key = 8e4458305ab8304a53b5c47b43aeeba2cde1c4eae1c09bf81f6f5f6f37815dcbef3908c4c1646143be4d846b84011e4face5cba679e79f0ef2437ae975845652c5cb4ff62fa00737390df7450eadbb78b44f6e619977804adae7defae6bad4865513314488eb197cfa949bbc9aa8714768d61465a9d0ed9f2a23e6ca875524ed7fbb5e52973d9b6b7391b9de92022f78d684b25283e8f30a7c1e598a060f7409f65a7f36b57f693a660c7a9f3bdbc394f0128b87b005b5ce7631e5bedff858831dcde12f5b6f04334565563e7528f0da374ce38e9e4ed9bc5a959eedd4d52d6dfabc54baf30cdf426b77de8af7508e45118dd42f7dc19a09421464e41d36d0df76a7414f3cb897d65939cfb657a76785b35a5868401cb4d88ac8194769ad2499f30fdfd3ae88e8e47e918cba744fb4c8893fe51eb47b058b017d77126e970c4331ef67be34bbc4791e71c0ae9d52fee612f93cdb7eef4ed88f85b87e8beb6359eb410f7e75f06e71fbad3e2afeeea8a6caf023c357a87afc75fa00cd42213df95bd34170068d31b7a0599dd026a49fa1f7523ebc5544389cab2598161e4d4c0ed089d3cff6956f5d0b5a9fe652826be151ffed11f562196892cb4e941b56d18ee73684fdd8535d59497ad7bc0f97381d3b72abefcc13ac3236b47c63a6ed4458aa7f4ef7c6f361e75ba726be6774cf6b3572658bfa6abcb6928fcd3b98d328bc4f53cd75c25dbb22aab08dbf326815712bffdcf2ff57b9e6ce0725782e9590192bf055a45c4467c5e7e7dc35b8a61a48a3181ffc298b61289ff03b9fdf226e844f6a6fea58ca9f33d713d7d1abdf700bdc951fc9bb8f66ddb9e99f2849afefea6c366c982f3680dfaf4891c631a113fd9d884a5ad9a11fa8331be85f1d9ec6de2b4143ab403b153d9de7e4dc3e4c683ca24cc45f87dff76058be32daecefe4e16ba386069856c71f8ca86a63fbf6c15e876d63f738f847a32166b1592c3307d9c6190c5c42b7ab756ccb394c7c27cf8fcd158bfdac9f04c99e30254d500cd0da1b9f2b74823f24f83a888bdff45ca218b89b9450fba868eaabea5858509147e60dc3eaa39f863fefe6ae08f3124cf94b8f5e26fa3adffdf91ab37c156fc89a4981949bb76404f32b45f7dfd8a71578fd159ba380339971857272c7bd754fcb73739c450b58cbeb6936b8cb619654037856935376acab92026bbad18c512dec4e1977e180599e0175ef008c3a050d7cf02535ad86d8e1f9f57fcbd4e419976294702e8434163eb95e2bf0c3be52a4d84965aee3c69a8f379b5d72aa86e01a4c530fab2e2767130ee41d5eed417fcb45147c562c60080c56eff7aa7e9dc4dc293b01ba935e345b88faba62dca043d94c4a666786c35f9318a579a9b67f4f914434dd2076e2a6e8d2fecf4aadcb42b0db4252ed6df92a67e73faa4a39d00a77cb30df959f95e288464c824872ae6a9fa1bb3a71d8879f3d3c51445956ec8ae49c4ae6ac4de2047edbf3c0b24af9b8b86b83dbf4531bdd1773933139fbab85868e4a9bccbfb4d55e4e52d9afbf76e72ae560c08c7f9c0cdd98ea4ec9c785ffe76ab5098e9f3c5ead6a7759c5f9661b50e0368246c5afbbb9b876d8d72c2ceca63a4e6607fe4286fd2062614fcfb544fca36edf0785c37bb6f5fc33e2b9d9d03a0a6c +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: e9602b34fe73ad57f4bf6ead99743d645641553a5b9b9bf2e7016629e3e9bd76 +public_key = 77155f91195dda2b52c1bc4ff328c3732799ea0aa8ee5ff9eaaf39e5b5c5a03ceebe98a381dc56e1d4b56deacda3ac52b1088805476c026d9a0a2373a4bca7892f7172c4431c1dd005d855ca059b4e554d3eefe03cbc7855befcda368ce30f873f5747450c4fd994898dac592676553676fc8168eab4ebe8e9763cd5a747659440c9a33ead7e3cf907ba0d5a875c9d882df3eb5d08f6f337b4655e70565891574dd35724c127c9c4b48572951770241993f787e45573bc711f5d36feb03b2fed09ba4388889568cae09f0461746d826ad48f276594433fb1cf636fdf3c39c40ab87b4b50bf0ce119fbdfecc35cf84e6ddc3e46e275cc7bffd9269a7330977e9dba9caf79c99f3db88815f5caaa84401cbde7ccc0fda4b250b7a2a75eb3b0def3ef05ffec55650029af652bf014f4669df3e9435b7dbedacc173c3dd1f3a8597b80c9c3869d7389399af404e790c9463f2634cc745ebac9d74b62b73e7e54cbbb3ab235c7c1ce298c0c0369de43f24ab7b03517856e43cef2d39f1e3f5d1f3fe998c53631e3fa57a880f24476a7e89f8c2bfd1c49759d4ffe993cc7ef0bfcab738f2648bd8143f08fff6ffcac763947e4859ccce15e5d4b7e92ded6ae5f8f8be6653b05cacf0efeb4816a9726afd89ff88fa52ea490dae3c6789639d9d9c4ebe8ee43a01989c51c7dd5ed2548ae24ac8cfce0bda7649e6c9359c45bf0fadd3aff5bb1ab3c3b5b88ceaf4caa8c7c7106616cad5da77f7897dfa895835c9b83654b358e0d57f8fec8a150b39283e345f4ed6b478dbc643dd9eb85adb92ef77926662e63edb27b3ca60843a647dc305cedd21a94aee9dc3663c0948bc12f0a32af533866f5931d5c74433f46c16aa4f028d8d06a6d50444ef8b3e71ac641ea4e7e2f0f5390caaff16c670378d952bea0e5abceb8fca9830c9ce1bad8d68d328003eee3cabc923b5a1a7c4854d841739e94d3685c03f975a72440b50ad2b11868a48bcb73794c83644d1d39b9664c432c7b3bc41e703fdded268a34a9aeb3dc79b9ae07b8cd133b7d4baba7f39b4098d43e4a35fddd8a9ffe41b78cb1f64841ebf894827bbe1ec4750a8e7ba27cb4233ff72b0da634eeb2ab344bd3778e4a579ac7d64a33ef356b28f2c1334fa0e6acb05798f73e92ef2d629116e30a1ac330c6cf030d908fb3718484de5caa5ad54d67ac7930f696bc9236f35e3efd71f57ffc2c8c186cef3e7e72721fff2d256963dbac5c6ae404b7ee3546695fbf7d743fe892b5bff01e4d6f88415875c014fe6e48d3cdb69cf000a39a45263505eda7554386d68a4d3a9fc9f6196015066d3c8f82e8d3398d2b5f62d7af5469841896fdb3a84287fe42a8cb44bf1eee0f2594d26e611cb335becde8d9e58cc71a363b29439d54cc6b293af34bddbbcb80c7797819a96c1316a78306e0987a3fbe1acf81ff2f620d37d27f47122c4ae3cff14648f05328c43fd4bebce93d48ddfb85eecdee7cb48805396c24410e7eced58d5f37bed5b05c6564ec3450654cc1befe62f7c0da794970ffbc97b7b4809aa30d577a2f44f8e59ff023abeb97e9f78edf6d94de866298e2fc697d961442879ab64b4ba0be3c46f5e55c143ff058c4d7c1694979897ca0615e8de05d85d3532060076acafc8e0aadd8ca7406c7bb316abfde1bcdd166 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: f72b9080a6c051bbdb9b0abc1949034be0f89a9f73fe277ec4d4740c78d04a83 +public_key = 697588a50d46340ced782e5f0677879aab3e63c5eae7436c5b47370f2f6eb4bce5de0f81ec65c56b83b60ad4fde18be375de680b76460e294d842ce062638cc003d044af6308cd8025a594fa3676df03c87789a4499575949bf574f6931673936ea7ef2c79598a1b7b36df810335fb4df98c47f6afa057bd88becc5177f2fe7fbae0f43747aceec6f68087453e23fb4381e5930e6ae9fcaaf67565b1dfc7aabace34422dee57d9a4a454a6d1249c3cdba0921e3d0f2bf57d0986f23b4fceb35c95bbd5e3aeedfb28993998d8582a6b1aa9950eaa9c87c8bdae7372d47cf852e85c62acf5e06ae69a0db24c0cdb6876eb6d44c74c658ab9dddc756861be89f72339a60828b9f0b8a32595db41a5df97849decf7e4c494ba9cbd9b74bce6148f51363b52dc166f2216f3983ce9ef565f80583b85ddb91267ba98b63afb4ee60f6596128e95101941a0cd627cc48de9d6b2c689969548641009cdc57bd2a24dbbc4a995a8ff593f1fe3cedfcadbccbca41947fd8d33bbae754a98e5ae5fcc31a4d451f8a62dd6b39f2fa6b0db8a0f953c6cbca43face2863e5f59ab9980ebbf58ce457dd8361ead4e0eda771cdb37a6a54c6a4771989d976a957979ee984473f0aaa840e1fec07636de75e9a92a8d891ab6f45f0d3f1fd6363d0b6e5c73b476b77ef867a60c2f5a99a763d0ea80a4d6e739875bce6cdf3623f2450c93040b4d6c18e20827b8026ace0ec73302fb6824367ac8aade7df45b8516e8612ace285cfda55fe689d8c7045ee3faaeb2342736f60eedfdd7ac7f8468075a4a2d7960dfba9e2655e4a8d7c6d11c660cfceefe33c04b4681dcc3efbea47247bc83c68eb175bdceddfdbd0b7b622126cbe323986b75a407f4e6fd0d32fa2398e504967fedf1e993a9567e3a76365adb9edf9bec7ad1a6929a466f091e3cfd79e9e024d85e4e48be16debd0e4fb1fa3a1f07db3ad94baac7be6c96bc0f28a021e39cc6bb8a6e16312255880a84778cbca5604e73b217dd527357cac69c22587208496af27e5711f76d5c185808ae3b2c89eb91f54b23ac8b66c7eb3f3eee5528dfe8aebb2bba7f97da8f82734ef777b7d2653e66f8e4ed7871da35c9586ea88b7eebc383add9b3f9717fe2b988def5d53e933c99318ac47e2685a05d7bb50597c3bbea252c77d22a817c5dfb80a635330feb0f296c40bb802183ffa9ead1bd6dbc663ad7559e4462689de756a398ef384c2372130c5a6f05ae6c8b81ecdff12593df04d3740d2638d13ea21f1653c4f664cd28fb11887f4784c27954984bff51c923b5c2ca4f1777cb3eeb7a13c351c07c4f566fb4a8a477fd348bcb9b8e6bec787c2340c03cddcb236fe8d7c6ec8bc9d156b89bfbcbf5dd599848f63ad5b910ce55061e37d79ddc898c8a50c8fa4e3940bbd3bcdf3de3889bc4f3b7d22d7c49370ac8d826a3aee946b79897bea8512d8b899a9ce7e439760b58859393a5c264b5f15499419e4fe278a40b6c9a8304775bb3dc8ee4cf234ac5696fca2e935691f4f6923973c32b4f2408cf63c99d7b2c5f0c5aadbbb9cb98b53f787431fa73542c5569e5f5ccf0e4a868cac6529bbde42a5f198ece0b7f9e6a63eb0d5ded4979a7425baa8b0392a8ca9374323ddf2794c237e38e45a43a5a34cca2875d19217ce7547d2eba6bca +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: f1e5542190db8ecf4b8d617a04fd3783ad0df78bf8dab749afb57db8321d151b +public_key = bafcc65109cd5907d94e05cfabe4515255ccb724b3398f39ce1ba8c73ec1e9cdb444baaa6ac481db8b4d670ab65daf7f33b9fa11c48f6bcd38f19e4637b749d8b962c00ac8ab1cd19d9f960ec3817f34840aa7b63b19826b2ff34b8ec9faa8995d28c4d4c44a10dfc5182dcacc8751bf6c31cbfd45a79c6f9b15c2d406c11fc3b5df6638e1b83164175dca6ae260a88c74b4c2432a9b76c39d43597ce2e3ad1797c25f967868b66bcee9b6a5deb540dd95413fdc7ca75943d5fe3d5ae24453499c78ec1fba4dff8d919bd9467bdcdab34b7db71efb18b3cc4c679e325b82518baf5123c88786745c5ad600b3d2a2a367b717c3dcb4c32aeb4770fc93e12e3aa55bfc6a37a3270ef2d917f78203724ceb6cad97e7fa4af1072e7864274e633dd6173dd52799ba22675db36863b2a447e5b6fb3d35e1ffc83bb34cab6cf7356a27c29798c00cc3fbbf2df3ff2ff1313cc7ad69e44fbb98d028fbf0183b44a9dda92de6e2995207ffb0af19c8e22beafe8c98d608c0c7f5f075137cb02fc69dec4e0f1763c8bba263898b30946663d84b5e18d8e6ab9a6df970d25683047d4d4c75ec912b7297a89534f3f4faf6f62868dbecc3a2051cca9d5757d5e53ff80cf52f4fb2aebd6cb2547296ec8431fa6eb8f7384fa559f9284d528761faaf3e86adbbb3e57b7a876d2d4934d338389076d6e6da9a312ce5cbb3df3add523699f4638f4bc4a4b4d6b343e3594fd9d68972d99eb26538f9fbefa8fd718aabcd5dfa5a671bdf8cd595ef8ad82abb518fa34891a4ade983877a333e956bbec9b8fa1975d866a8eb8b8c406f2fabd784aac085b6ea553e314d9ed6b39b4f367ae45b9fe109c6ecc5ef24dfa755caa347aa95e656cf46ae5e9438b6113e717b3551e9f3d20ccc330f254e82d89b5e4839a9f8ae267b9365baf28786a371859d3847ae697e3df98768a1c792adba39bd23591a9ff4376cb9c11e777efc4aae1c3d179583ab0952bcb5b1e8577a5c476189d3301bf87fd9bee63c8ebdb4a8368934ba4867ae4edd3d41cfcb5f974a5c36a8d699546d93e095e7b35459d838b4d9016feda5bddd2fe7e17f1d60dfd363593ac11be3effdcd8c1eb8806f24971985eea3eb328d3a365919e9c33e742add486266968cbc6973d483015b77eec543b7f971523589655732bede783365761d937266b4f0ef3b849a73dab5b4d040fd9c117ce037f4576c58adecb5a5e0899892854b8a7ec9b76685165ae4bc5c8b9c0fe3c6c7ab15b35e25a586e465ac05f3911db7d63208c3df4692372f402559ca963a39f003ac0334ab1aedfed58c990ad983318b33429acdc637a83a3d82684c517b85e94506bbeb9686136a3c8a284c852ca747fb709d4533d133b5798b50c1e59f9e99781fca9f447340705c6cb8fff31e257f95d681805b8cdc03e5780440603db4ee63c1aa9c367eabc3fd6d63076e6eeff9e0275d7780e6339c2d9cfb8af27596957b136e1cbbce15fb9a6fd9bc798c40f0ccb7652be50d38ed78b3508939ba836ab719dce9c61860bd3c624827ac26639c05a39c89ae873214e75cff975627f3a16375dbb5e947b83e46e84899377412bfbf8b743cf8ecf3fd2ca07e1eaeec1990c42a7321ac6f01cd866f8719ef21bcc0e02346fc5d8ba3d3e7f1fcb52d37551212d647 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 74efa414ae171bf60b6f884cb7e5ce12028f49365daccfa23e845d551711660b +public_key = e28da227ab843cd49d4a7daf3b68c2566ef920773abae9a2e50fb154c8e59b63b4885736e63632314bff99db66fd53d7d51ea6697ec8ec8598082d5535e9d7c3c6541b28382496e738acce082ae4e8047a63cba2f42c71b33e57c85a7763d3cebfe93aa70adb093f84ecb7c4dc16c8119b5d90546a461a5b745be0850ef1bfefb5499dec381a9d561bb0c5c353377ded1cdc310b7edc8df78de62477a7ff6dbb6d38ad04371913b831d3f6c0537cae63d46939fce41c40a81b92a6cd4d69fbd303b4b38a5cc460dfb0ef9dcff0c8e475dd406c8b34b35ceefb596a704ca4893949614762a30c54857df3dc3a345268ce56cdbe97139f5f733664a58b67656ea31ea87efdef9ce9d2a9295356de3a15ccd44fdc77c4c53f672ae439ef83371b5db5f82fb0d789e877b6820771f0ebc64da864a01caff73c4a42b5416cbd43e29c7b2574c6e214a352f4401d786b4d5351a2559b87bbd0ba84511bbcea09abeb33e8cd45ead78d447b243f6574379dd3e3fddc2fc6a4037fdb7e9fb104c8600f64ba4a9ed0287a32afaf6d68f91676a37c434ecb234e4e1c6490ad760da57abe45703e677ff0dd36884e5133dd325239ef02f3901e2d427904511face1a8fd70424df033054605e97fb719a2f70648a2d3da0c4f899b195ea8e6cc977ed943d3f76698a34b6e893ba8770c69cd56febc100dca0e14e77d0469c4833fcc23a6ed339acab9eb6e18e69244df53cac66af5a6bdcf391729ce4e1c88d6cf610c0d4550bfee8faa64881fff1affc81d5452d527d2561d8beaf3979ff9abc3ed4c8e3669c6aab80e2b6464644ae2189c81fc92d50cc56039cf5eef325af5e63a1b63663ff2aab35e1753dd16477537f867ba4ca0eabec83d6ea562c6822f6ebb155d426ea7e6a78ce934bbe7ec69563c8f99e6ab371d996849c8cf7a84ca1a9bb655eeab20b8ed663e4595b5fba28d76f98ef532b8eb01ee9e8734968f87c03fa4763208862d9a3ca64858258fbf0d5441fdb7c84bbf37d9f8628fefd01b6de33978ff9b8aaf6606344b95342fb6fe783ced966db6ad55aa333cefd533a74e0f6a9c9757f0f9ebfc96545d0b647703f09594dff0b4e27b16c32b63547158d523f93017577513ea96159ac60cee79d4ad9c5ccb6df54e74de866cd7548339e3e4d26d718f36fee03f382925e97ccfac6e3a4f782f9e22dacbdfecbe3f4b72ac6bc9d9354e7fdfc31ce7acd7f3a2c8b9abefddd614be600c8992376b73f9cf45ac9841ea06409454b48d8c3a152bb8d6168a3fa6423373651caa7aedfda5971641bd66897e5991e793343c5e90bad3e07eeaabc71bc34788a345bcb9ad8a45a51aedbebe846bb76206bd6e8aeb692c5fd0a59652495496400ec94623e704f6b181d778187fca6365824f6c6c23aeaf3328a2c8978ea8d7c38f7ad0f7a6b3a51cf5080ed4f734f0bdf98dc19aace30b79296ee42d8b43319c93ccfa966e7ecff945ff25fca9e8b3d64cd96e42e9a295ace28fd5329034e9b81972838532cd0cd9f34541459cc68955c9c2a431bb6ef6c9ccd8039ca45533ad8108beba49bf8d56bd44433fe12a6c55d4ef3ddfd561bf8cf15dcc1f195c5f8e7d23d95e106ae35569f3cd2eb13c9e46d34182974451bd97b6a3da440de6e5bbed681d6eea2c6822b361019afc +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 0b4c3cffb2ba4380ead13dc0d8acad2356b448a810da1df29f264c44aab6d24f +public_key = a6cba4e1a93cf066b6c6284b86ceced4a4b17634c2dd8c758ee3cac75bf40256dd30defd98943de4dacb2f69e2fdd4ee8b1886f38c661993e678efa32a63860d3aee9b994bf4f9cdf0c3c83c6bd44c14b83e57c59d55629aa7d4994a4793b7e78b69ac199fa5799dfa6aeffd609a7832b55e731a65a2ff975397df8f7bf64448f4bf2f7f578c6d97c57e570864092a66c8184ca59beb8f89ba9c2a3e7a17c1bcd851aa65fddbf3d1f2774e81397a572473634f6807f370ff2b7f6f8bef5b83c2f3475cb225b71dad750f333d72a434c88a902d64fcb805e06ba8ae563ece60c5c29057c2a995ced8a34cc1db7005c478fa174874bbb82a9ee07faab591b8c9581365e82d5578c55fc06b5f588c65e2ec700e64737537d8853a8c9a1acad4cd8bfd67c553b9c6042d6a1d36f76e66c53a166398db6b2f5e754e2a67a559d2cd5839b97c66d35fedf86c42c728ef8adfafaf4ebc127fe2a759f6894f4a2d8eb85b06e7ed686e8e0e83c118fdd62ce1454e7dd10cc0e29b3168144064e7d0c3af95c114fae40848fb07abf2aa7cb2883fb19454a98eec7277dd8c1be52dc9cd3abed8ad9348089754703a608c0b54445d879ddc71c19d51f92ba7567e740323ddc4b95c19d3510363a5de7fdcdfbe918a09ded1267aa9696eb0334810b9351df981a0749a7e1cf53d399a0115ae515c97b64aeb0cb4f795fddef5a9e2a357565c4f7dd5aa54b706b0df583e2fb68ceac6e3960f4abcada8ba4ab6bae958dace3eee4dcd20978eeb5ba041b8375964f7a644a85044d168847acbb69b8d78d9b849a7d6a6b67c27ddbeaa41be8341c6977dbd0f56882443975d3411148458baf800c441963eea86763c54e45345bcf5864e926b4bced6a337df55d6113647829bfd4e45723d68985dccf772a6723a13fbb3b84a140a95dbc480f1495118238e74376c3aa78c25e3703dfef1e8576c22faf911abeeb5b946d36ecfdd7e980af7961a7ed74584a7eda7dfef39e72cd98a3ea5550f994f5d763b00fd37facdabb1459b825c6debcdb35d55ea9eac64b03c3c0139806586c8e0f63b8f77aef6cfd7d36e5d5f296894c9a1eb0b68d067e352ee8a20084580d98aef13bc4fdd39d23fcf015bcbf037dd5ba7ef10f581093656a19eaf7f47f5a3ee6c8a74c541345ede689321a436ac488b23895ed3f8efb5ff5b83964400ec33c529350bcf9f4886e28d1edca9c4b6d3e47d7ac798569f51bbe4bbc7ea4ece0b76e905ead819b287fe4fcaebe231067bcc1e3ecbc737020b47587c4920df6541f47ee2b6bfe79d8c73ebc3715c58aa93484a6cf692598b4955f09d57f5854ec2ceef53434a5a1edc934c9762b284d795857e2569f1296a8bd464ff82bb6ac8ef93f9e4b78918e0a2e46512ef41163bfaf6e38c2a07b15a38a494f8412fd4dd60847f957b7839e78936b6c1af9d6089b8def5c58e2659be2653d83a2fb22da53912055f26fa7cd05edabd4fcf21448291be68cf7c8ba21bf8dca959adcf53bfd4b67f6dc0c508f82848fc96f78b48b4a4c746c32d0e9bf8d3f02c46a7a2c9c4028ddeeb2cd13bb399d9c6feae9a4e68e4a4bec7b7fc9f888ee9bb605faca4abfe3f6ac6b73bfcdcffc755f85fd14903d8712fe0bf82ac0b06aae9bea06278c21e6257bc96af0379bca07c7833 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 1c82471dcdfca3a6942061ab4f3d5bf0d197321437c706d9cccccce449447002 +public_key = 5a13f2a62aa88988ec4fa3c36f765587bfc2a20cac081cc08d06ce1cea6036463dccc34bc294a51f8bea5ecd778c143f57b9ad2c8b41a3b3a7e43e7fec687f50294158bbd7442ce19c299d421b3d6ce6f019b4cfce69c9dc65d9856b7cf087b6649e793e8bfa7736fdb19d9861b46b5d5cf3fcfe34ad43622357a81cb7c9f5ac9cf2ce90b907e2164a9cfa4892927364d90dad80af888dbbaa21b689d5bfdfd0ba43f27386fa1df63237d5b10ed79c3f76090f58133ec44ebda43753779fe88f3b8f4f2ed858211bc172d49221a3ec3e96e88c287a094bee002eaf19ded04989f21c85c2ebd5700473913d465359bce8dec3d55075386ac3c330887879d5ca762b6b576b7f2e5fff23889d51788cd84b77ae879b1ec7d26dbcce20cc94f7857aea148214cece867f77a88d8857f47e45cb9b561b808a5e42463bcfab6c69a88efacbd64a3b77f1aa9671aa934cb1cebc52b464603779fd6ab10d57cca0a749f4ae889f1d386cb7ab0bdb86cdcdfea614a0967adef2699da6c7f82713874f36468d3de4539bc805aee054eed25133975e69ee357a8d89aec7139af00543a90f4aa250f44ca61870d206a237de917c5d9638fb6442aa7b886a54fd2eb7c41aeb7e0f7a09863efa4f80c67a4694df8a0f94fef2268e0a67a11bdb4a18b3c45afeee977a5d143aaa82c8d52007fd51df48073746662b78ff68508673fe314d85e9d7d50a754b302338f8afaf0b2f3e4583dde46d74e1843876a6b1cab85e0d984ece18a3420aabf4d740f6039dd183c57279469bfb9f26fa4f6ae59db60532372b729cdb8bc9bf6b9f6ee234177af37e7538383bf31d3726c79d84b4489d493423f7375c273a9558611c6dc9fbfce97047566ae9411637ca9dcb956a6f35497f80399ec7294f9fcd99c02bedf0c12aff1aac40b60be4fd6c85096ddfbfc34d762d80537ce50c5df156ee30c3baea4f9e4ada0740b5178c83a67fea746803a35c36a3cc044d521443d3bfee80d8ead97b24c89febe6583b972b5dc89b5ca27dd4aaa21dffe33e6940a7ab295bd2eca4c69957b3d02b538c239f18a342afedc15fdca57d28930b7fd96567801f64c3452697d5f4a6688e975b54dab4bf7a5db4ee88a9f8004f402c2db93fa9fdb6e4f16a5afb169a69538e6d61b93a82c5c0d69f3153addbe6c9f36ab96d076b36d406b06793c7c8c85d6904f4774c4a0c143e27673cecaa38c67cedbb0f860ce3d5215af637b9dcc84a7aa6bb919e73c06ddb787b1b9118afc6fd577a7ec4e7d5a34922767badf4e2bf0fe3694373401554212ce213ac7bd2decc6104e0dbc65b89ccb3383c30476932d738b181b64e2bbc9508268c716ea4731c659d18749ec3b87c3741d176dd10978cc91ca44df588c9ada7a68670a003ba24fd3ae743d67149d83ed33c98dac4c06331e90b59514c7006ef7f17aadec95e7931b678ec849789c656b30c4a747fd9e80e51cda7dade5557f9e6872248b94c894221cdbd1b6a3a0149c1bbb8ba4c9337aba868b88e99939d44f55de8fc36eaca4bcf107dcc1444411fc8cc3b6b7aa7ea9f8d06a30c7a61d8ace9e7d5db85af78aa2eb74e2936ad07ae2b17344356a8e74da9a149f048cacc817bb0924682a027f2cf6ec9b36aad177faedba70e26db0e2958e3d520d23b10254587 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 46fe60a18124125ab93e0c578f1c02f1bd1301595013001c7f3c2fa56cde294e +public_key = ec8c397304996cf4f77363fb2798c4bb8a987e57b41c9fdc6f9bfc6428e873bc6516bdc8111d9890b8abd9bc650f0344e3e7a673ef69547aa4bcddbafaffb2f3b53b1a1db255f7cc6dfd394ceba359685e9f6c77ddfbcf0217611d076ab224da8dc5819aafa235955b690cf621be92556cebed2777f06f3760cc71b12d8dbf2a5d994ea231b6de2516c5ca3c6157adc0862b54c41ece2b6b3f442c8082348834be93cb3bf2d35fa9ac98d98d7d4d840fe8ab2a879afd31227b95e1fa5d1a74e0e40df6485338fb8338b5c7c4c0f6641c7e64502ee24b13c2de3ed88694d35a66a4c455eb5f66c9d5aaa7adee5eabfd3497fafe1d693b77a4402ede943e9c68cc74f997a44d2f86a339c78912e678d0f3e4ff26fc0e3c9ed8eb726ee9e0d2bf6b9916ec0124f380f5d74b5a46505863f6287dc194f2b323c89966340f07e56ffce80a5e47439e48c257e8302ce06dcbb5a1b644e6af6ebb566b504a9b2994e00bb6c40b55f86d5cf841d774dc99e5839c32decffadd4ec0197431bf8c5f27cf329e7bfa0e0bfc0d97fc4b9be25d997937236caa455389d6df9e38ba3a76fac7349a5c97fd84a353fa8edc6c7446403fdf37558458d68da5e67f123dcc5dd5ac4618f20eafb8c9048bc805bb1f6bcf043793310f5ca86b42cc46ebaab986c32a9e266bb1fa2755229fa56b5be11564646c8dedc487eb906ebb5e5ef78a39e920bced01649267344732a85109a3cb45b7b8e9abb8cec49ff70fc819695f621eec7ac5957fccc5085943303f4d6623459d7bcbfb2d645b2a54c5a8ba0eff7f93ecc2ee0d821e98553f78d623ebb221953d3d9b8d198d44d693abb88bc965984b09eee2ea6b4885aca190f9877f1bc1243fdaad76ffb7f5b0afbaaae118c6108c98b31a5b70fe5aad0a87b27fbb40998ec33fa9d218bcaafd3e8863391466ec9ff65be6dcad0165d9032766472d8248a56e5d3f39fa5e585ee9326808a4e408faa15996452a3328253ce2cb3613aa4fb02acf313db64c7af7afc5863487b9538b53a3ee456178e80d257f4403b41f16b41584dabc0f4eb55cf3d6a851bf9c54942f59d1bb510964445067c68ae362dac6a7c4ef9ed318db0e2ea76fdff0c7d562351ef3f7b3fc62184d2e7d7145ae565e53fdff443940736cf628caa46d7076783b2b29bea7058bd174f19518aa78cfb304ed7dffcbb00ca3def1fd632d1daafdf32fa7bcadc67e9fdb69ec7635c3af93e98ff3d6076a9da2455963c9e552ae61814db0eac945f788820a1442cdeedfbdbc763cdbbb6f3fee8bdd76880abd561c505aef3709e4d996e4efa70efac4758b62644c31cec06e0d80091b4d5a97d5f5bd694517f52ffea5980a347856e60bb3f56475741e5da7ae465f1b444a267f9ecb66585f5e992bc781f29ce80593c4e598fc254de7440633007db1c637733b0ebb8a994347d7602fddb3436e603b84b8c3ee4c5c56e67af459517e52db2e6f272371a0a8efdbe740daa78b9eea655d98cd14ec90cd383863ab5fe8137ebf9fddf6bdd7a288586e18a54b43387de9b7409d37f27384be19fb09a4e2637d6dd6db377f733b31a49d2467605649b9609365242f52a62555b155e674c7e7182870c1088f4b34061f3e8b9034af0cf2c5f7eeb665e064f5f27cd5e4c84531d45d38051ef9 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 52fb7cb6a633fd2e83f2892bd9441b48fe59ecee6d026f5246fa7f2a5e55ee3b +public_key = 1808ef4759dcf733359bb77d87beb949396baa99c9d73485e378b6eda76318b961948497db64e49f386e51648187c48a94fb603fcee4aa4d8ba1df7f3d7e7694f9459ddab7c6e5ea58d5da79ccd72d87e7781a6b12073577d3a89b4d582995daff75d23a87ea5f5456ac5b3970d545044af254178375268abca9a96705deb28635b2edee7d1969080438368a4b61f63efe8fa811f63909aa48a055cd9345c0929eabeaab8237696bdf45e2b7e862531fbfe66ddbd81df066357954344fe46ebe084d69a62da470eb64bd0f89f85c9819a5e41a246ee3c6673eadf6b7b490a838e9ee28f5ad49f84fd4ea01c936d038dc4c78ed62e47de8e339fc1adf959bf79ab951152d9231faa8962754b13af2efb67ed1d4fe8c144f74476f553af97e7573a827e7144648befa3b6d6d96f428c10fe9f5ba86b29c8890f285dd1e7956664a714fdcd0c88a3cc259b503d3ca39a4f987de9ab6d76378858d679cc61ac4dedc6ad07d33813698a6ae96acbe95474b188bfe4fd8c895e79de868de0f7f12256b9fe84ff56db180c7655e5e4168c89a516ba4ddcc56c1b5325ca3e2e067949a67e7836ee58efcffde69bc9e6ebe726338830a86e8f5f5ed1de52cecde86473e2b54ab6489d735c3a945cc83b999352bdf587fb67dcf2c9fb3c9f1deac54dccc8201d36562f64831d8e29e67b2ae78bfacba95f29c3d20a4f782ed90ebbab81bc5c072bdbce836e73f0cad6d2de518b56dd03a8bdc97fd349ff5bb26e28ca8c7212867daf5e3ca7eb687297e4c098ff7c478f94ea29dfaf78d1bbe564f332147fa44937d2aba34b279c99e8847c5d4b51f64e43de991aa16aeebbf67386c7f286445acb87a98cc93029658bb0981048876f0884b526ba5903de258bff45849a57cc4f5cd2ca92a3cbcbf963a4f46de8616c082d8be492d323d07e6bf5344fcf85ba17dac3068ae91989e627dd416d7cc28cb6d42a461dfcd83f71f6c749ca457146d114c84fbc576a7dc8f9c3cd3cf4a3cd2535a7a396f59d73259654254e5bcf616b4970770bc8a3d030c8c61d93eb0864415a4e4dcc6428be7335763ee50ba72b5eb99d948dbc59df33917d367ae9761cdb15f3fa48bfdd38453527c1dc4ab7beae8497f49dc47e25a514258b5c0336a8135f5c5a86e22d73a9a8c3da5e88a468c3439464fad4f491b0bc91cdace7cebe5167ad1b62cb22b745c38ca32aa7f7c8c57537d7f563edb4aa2c4d0b788e15b36817f188e65abfbf7c999d108c5b3df52f6a3bb78737edea48c9bc9ee917487e4f6e56dca609aa97bf47bab00047603ff96d07ee29a6edb195ba59ae7bc245b8c982e901995b6df59e8853de7945c33039dc6bb3c46da1d4fb00e4db77f8c4268627f8c884b05ff011344cfa795f864a474f9c015bbd9c789e1a8b5fc1aa46aeed6560d4bb1f3b64d660f8d373ab3d51a450f7dda239767aed9cf25b5c860cf4cc7a4e62ef7de13d88fd3459cb37a92d348a1956bba0aef4513d5a5fa79b593a849a1a3d456f39fade44b583cbd7eb4ce068d56df38cd0cee520526ef54ffc8681cb9e015f5fb59cfd86ba1af8eccc1636dd69c81f07fd6526d6326b4edb9b68827378c2fcf38e9179c02965f939afd0aad893c30d27267e416287d7ddec314a79402a769c3d953f0092ef4f8b595f8 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 0f81a5f97082121244403da3feeb734f6084b314b8d94beb11627aa6ad1914e9 +public_key = 776b6f121675622857b8b376d708b2a96e306fe9311278f2e2e86730adb577e8ca3f16495b0edbae456a734368677a87fd4cf19916ddc1993691ceae2b76959664a1df6cb2b3738b2a5ef4918596b0d69394fbeefba83896dda7f318eef81769437cb63c7f6d4236a65c87c3929b79fe34438a8931cf2b889d0ed1747cb58d373491e7cb62ebf66bfb3b7e745500fa418eac8cabd966dc388d0f1b3fba95dbfec8c03a39e82deaa5ed4f56fb3b43704f9cac87399d6ebc98497a3adad7cfcd6a138f31f945a4a335ab6d1a54a9a59db106c0fe6e360ce8870d1cae9a3de506c9c96d4969f4b487e4d87ba1d45accb5a754585f29ebd991376150c65928cfdc9ec4f1366cc840e5f8734c8b4f24f1ff3dc99f4c55f2ef5d19aeb0134f4cc906f60064a61c1b42ac243b6d8dee2a3d55a9ea7c44855e575cb6217c381de770cf56e041dfdb2cea6c2bafec9be483edcf718dbcd1c4a5a15c6dbfd63fffc988c60b23504929e37c2ff6d7c7ffe51d51558eed2589da9f64c95356a787058018cba9975edaa5ff9a62b6cf77439b5784b6749db96db77c1583bab59d719e8d4e79b8954b9483895e4a7fb78ebbe7959599ca374a66558a8fbe7aac91e8a62ad6f3690a952e94bb91e64fe57ab4db066867ecc9ef0f7163b8d10b09d248ace0ebb736af6e9dd0177fcd16dc4657488bd5d044e4c89529e351ca72aff9698577bda5536c3fa75f0d9b58693ff11cd88d686ca8921ca65b08d91f96d4277839cc9757653a46511876f7b989830cd62ccd88bc85a686ab6bfd6cfb91da8ae31d313959e91d23f79be375d3e3e980cde808a76caa8a843e178d0d0ce26c14e0310fd57f4b35c1add498fab680d45fd18edd762f6eddec6388d56d1d2f637696d3ac0ba9b69af11747d4bd25b6b528e4060f9cc5be8c6446b5afe5431f1af6c05db2f34bdaa413fe9f28ac9fb58acd85a670f393351b33e04d79a5533c44a94e968b677a6893159e310cd48ea22e3dd416ab650b3295fd6f91aa500406f3ba173795136eed09e698153b8d2935acf33709a8b33e4b32384bab51fa69ee1f3a4eaac726dc7041b486e8aa3641fb8d4809d9c27866753b821aaabb9894b504f845fbea8766f8f6725d6ff5c5d12765a6a8bd8f9fd3c10357523fc4f3e13df4587f35fe469434ace189beaeff58fba8ae5aa188a8bbf7e08ccb7ad6a469054a45c01aac131c6a7c4acd5c15d184ca77b8466b6d1992df9df42464e69a33382a7f760eefb69c4cd00caddd26ffcf484ef24dd9a2b84562c16cd4d4dea9ad447eea4d488824ea7da3a52209dc917ead7af54553edd60bfea66b3eb9468df4a46b3fc1038a7c54b76053909bbd7eb37cedfdf897276b465155aed0f7df9a4b9398e54d267377fc298b9bccd53b38e486f8436017c6d98b324ace67b17358c144f99bee7426bc9f067849d7c55542bfd5c1359a41d7a5fea37e759ad894ce8226a44bdcdf7e0276d96edfdda357c5d2af3956b796b305c29e87718f65b8331888cbd53fc20cd2209fc6f49c7f9a0ea5b27d59b81cb2eadafd349af2aa2ed5f79e40d22fbf59d74c16a840e4b646f6eecbda2ea24b6da0ed6cad2443d3a1448b685db4e55ec5e0f4eb3a12a73c36272ed86537f1d2f51a0e2b5b5847b0a2d9bbff0a051bd5227600ad +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 31af9345365549ea0360169ed57daf98cc5444799d4c75d9f1f5d615e9df8a91 +public_key = a6f3b26dad6ad98a9a700fe32b8889bc5e35580ceb880e376ceca1f7d87a53f78f953aaf9f977c2ffb4d04f88e34edba7d83bc70df7914a769ae48fba60fe2b2f59f010eca31bda0ef138adaa485953cb8b6f6ccb56a7c92598c0c83ae97684c26e7dd6a3edc8ede6ae08c4b3c1c30110a581679f45529be92d38d9cecb1102fc83e0eb3b376dfab4662fc559f4814e167fb3e7a6d328d7efa7e99a0c546b63b2bd4f22b78b95d74e6e3ff6e04b096eb89db7eef30267bd886de06cf38ea2a5877aee8121fa39c88c528977f0399cddb7a7c8bba3ba725d7b3db71324df40715fcc4f8e25e2bc03527fa968af1a068fa05f8aae39ff8ddca417555e4498fca3d644f6167ba30f9e368879efac5971c9bea7a9674e804c08f5d6ade53bcd778c1af4637584b9752baef16a4319d296b93e5368d1d863a85cbb56ce1c56338286bf1cd84d695757adfbfce48b7c658a36b26b670e59947a0d94d032f84bf0995d56666bd7968bed8858895c779a3318275afe42488953791e97cbd6256c29a6c6e4339a15d7a7c3da95edd2a562ddcff70ed77ccdf317b9e4b975692ad1c3c3d956b26634fe2eff35d76f26ba766a447bc87e867490dcd898b4b02c491658b97e25a4f836ab98a99c669c6daa4d3d518a66450bd48a4e3482288f644038ab04a3815d6eda9a8e6eaf388e495cde4a65c13febb600fa1a2becedf8e79536f5fd36dff2a4b8bbbe4e23f7e462ee433ad9f3583c830cc64e29bac51f96846d8fcacece9b1a06d63744e58008342c6f48235df4571e5777084e70bef4b21eef5f1ba311f4b33cd09ef3a33d5fcfefe44ab54cc8c4eaf8553f697c00f8d40e85856922dbcd0166bd0eea66e35d0c3ab8acf3b58f23d9c6887f1557dfba7cd968553ca563f52d28adb05733d81486d86c590291a643edcca9f8470d573880d5856a7bfcbd0ff803713790d27f97f0ee649d5412713a3e52d6b1b7c85493e92175fd9f5c3ff709aacfc4bae52fe80edeb7e999ace2bf98d9595e4951362b08a6b52aafa7669c5493cda61645542ccedea0b70738fa07a7f91b8c7a510884f12f9ff330dac5ef9e687fed9edff45b277ff95cda4525b7f43fba328099bfe4330889be86e0f6232dfb2eab7b971ba7681fdcb4653652f8aa8b5fdebb77461d89fcd5ea4ea31ecd2d536f2b37c498f4e69bc14e8e23c5d3299972656fd3a0a644a9e8b18db48805ff849b67cf047bfcb0c6945bb87cd779deb9e5b64bad975e3e3f8a740de77b0d416e245acfeb73a3fc876ac39d8f1a52761e24ee5d87bcd1715ffea2b98d9d83eceabede81f4c9738c0df539045279eec3ed42a13791feba9d1ef3445293eb4cfc194b76c5febb5593ff0ca45deca9b90435372f3c5baa0549ff847aedc8e5c245bf7dc5866b26ed41e884befbc7bccdaffa098b592c5aef7f53e0e8efbd31e9215ce5f8ab848a1864706dd511d5da9942535cf06952b0357445a985434dc026733ac8a39eb3c8bca2939d195763a67f353eaf95679944867da21d58623635f7a7461a913c24bdd4d1495c1ef4fc88c8f94211fb2d4c4e0fd29d779a6f3f1b373b9c438d2b4c3fc48c054bc5206273f7a9a3dcdcdad8e5dd70f0fe0e4cc99c8394adf63126006ee8cbb821b12a2a0a3018c4f8e52a50183fff79e84c69427 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 774ae54093d694ef40b63b62c73e6c98295f606feb8699807eda1d030ffb996d +public_key = 191bf9f6e7cc26755aacefdd4be75f2fa4c18303319eebd0819e52b347f6b1e54c103f8c73c6805354925b43a6dcedcae00dc9ce4bed7fd9b4742fc8b91844843f50e0e99369f9dc279ab4881fb4e2dedc0456c75435ecdae4cb459984361dbe3a23f77d775a334fa6233beca2979e6f36db3c4c86fc24bfda5f55c765cdf6187855fdc9beb8cee6a8391f98475d6aa080a7a2c6147f71cfa94519d1f705ab0fcf3fc957619e7eeacc33e9c614fe137496f51436a788334aa5a6d66ea3e4ad937a37be9f87e1c5fc6fab2df4c434cc3f4ea3865bc0beaa732c1789e7a7ff9aadd7d4f7afdf953163197590e757a2979197664290de8ce1d531466a55119f87c335bc26f946e06a4d51baf7b33dd01a46c2f4e339dd83511d135a972ec1de0ed93bcc9b24b994b4a3394df8ccfbcc743304383d4dda986e859074a3d0f9ecdd96a34513735b4f4238f7ef42d3f8eeebecdfb3ad705ae668ce5045c534c448b429c474c494c7b48ee4911771d62c39d3f4763d98ec0b2ec0753de301fadeff13bb5df861ecd882a045d032bfaf6367f845a5d535e85fb323beebe6e3bb7dd70229fd7ddef18309885ab9345e03fefb7575292f9d73d57cc33f8a5a86acc328de3a2e44c04cc45ca57573395ef38a95675bf8ea7bc8684c8e6b8e865aa3f56517be79fc45657f976ffaf538bb8b53ae88cb43881c19ab47069b36968da1cacceab9bfc5c7985614a3fff7300f7fee4865c5f8e3d792099d3f793e58b591cdd87cfa36430aea87703dcca5e8f4fa29ab2b56ad3aca5d483c3c7ef9db4f0f8b7794592e1acae0fc721d355892cf57d09fe9291d4e1c994b8bc33edd07dd3cbcb5e37fb43b5777b4afe892bbe98c4e32ea5bf00618b1e4559064d491488bef0135c9da67a39a5da5f14aee6ec4d9c30957b04c645b15fdedcf3a391a769249dde9085147c96c68fd4ea93efc9e8dcd00ecd7b8eff827fdefacca51dac9e413e8cbaa24a66b0db4d2076d58c398edfd3ee56c40a1bcd3cc0f658f6f40c41c6f07ce74f44e4e259ae1478c7a77ed5c157ceb1659d3b22991391955c3e75bcf0cc70d4cb79faf7638c54dcddbeef35b8f3cbaf6b14e8f340597bed55d586981c77cc6093a889854a8523f997b07d7187d99ee8b5ae44cc1f1f3c413fab7a61f54490a6ac4175a99da866e5464283a74c5d3d0436ac1c88f9c964ef8e6de7cb056af08bd8d801e4e0cfddf93854e09eb5e0bf8fa5a4c52613d468f95bd83ed8c2147736598a656476e5cb855e0c486d10add672fd2a79b37357995ed445973959cf15ee6ed0c687227768b4ea1b4f79b818da7410de3dd547403b3da36f6fc9f6ae659abae74ae65213ef2a43dc61f59f822faf5dddffcb98cd0a38bb7a4a493ae677cec267379c3a1b80ac2f57ef221976ff4c7afc695f83af88ef813a9beb73ef48dbe8b3ec87135c6574cdd1d68d7e63ca6f24e8b948ce615233b911736b097db766c9465cbb8b29573addb33f22ad7cd99df1325c200545d5b2ec5da2ad082b9c198158aa2c8fcd5d94bf67e8d39bac4d9096093c78a069b9210e3d5e9199d45bcd9abe6a8033c971b39d3874ac6408b3510e3e8ff4b464ffe6ad3e56bd664cadab4cbc2eb1f13656c6547db33b5f529d253c85a728313bd36b9f09f6455b7594a10c1 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 9f27a47604ab5146caaf0aafe6d149424f8d66e39ba3baf5e6c73b19221b7e21 +public_key = 8dec41ff4d93b014449995e21e134c925b37b126e2a9d6ee97d586408ea8409d3383b5e7d1bbe76aafe563b86069c9c2094e481be7a7541ecb1b2c74f4cc96d2aa916509cc24d33ca89d6aad07938f8de177c4f159ce9ff314d389894f5d4c9cbe6d8c8234cefac9bf750ae87d5669f46ae9605fdb189bb340ebbba649996863618366766b7c990d7dd1a397b00c8ef72dbe734adb60a6be523fb46be42752eba4bad8d6b008883e2697747ada77645e74d5f7abc99e57acd6e2032ddcf719c9b8c5bfd84d9fa95641202384629b925c34dbe94889bdf96bdc176e4dd3ad75f7b2e5cfabc9ea8281fd7df65ae62e0e6db3a634071944f6468e00aba03255430375660cdfc414adb3cc63dde305948d783afd0a41b5bfd2fcbbb620d9bd48cee81859b670affd0b5c46507eac578f829c8c6f4875bce8c37c532fe13cf77a8cf480661bdad108a0b68cd63ee5fbba54f567ab31b30858cb33584d64f2ed84f7bf085d174dd5bf28fc90c96cbc89ca7069edd16d6f95dc6acfeb3315274f7c4937af6ee963f9de6d0364639f743b4e78a6f344c254e94f989e1c34be07ad9bd5086c73a9fda95f8caaba4fbffe502c1abb02be45a7b8f5aa7ea001055e2b1841725cb06fbf3625ccdd99f89c19a8d23d86ddb1a6da75198852a6f8b6aa54308a3c895688048ad03c089ef4b3f32fda6aeb0e94154339b76ada265df2133eef3eeaba98cb656925c34f56d37a436f8afdebff4d8c1396d1e3a490675abf377e94b387e58f23eb1284d636c9fbb6de84c06af3cfadc66519b2e9bd94610655699976538471d77bbb3a96e3a3faeee8cff642d63611b498e40f540cb7ee9b6ceaad6bbf30aae3f9ab5eb57a5670fa924438d867ccc4823dc74d6df19db3e68a26a5210e713ee7b81157a63a2e99fdb4a5673eb2d17890e7bdbb8215eb9a1c85ce8aa92a2557ffa499c9aedf7e98c3b478eebe73f3f4794e3e83f4330a710b6a87186c36ff04602fccb97a7842104547264437921b413e6ff29a1555226a3bb4fd90bd8cb09df92f4c4d93319c434c04a773acc094cbf0516f903aece21ff6c178aa5d02f4b402efb43bd79966d83a014bc8a8fa8348eea9e8c6947134b8380deab16ef427abf6f214e4ff3f6f3464929105974a853961a6b55ef9dba8d730be6a51fdf9db4c23753bd9728077b90cfec657cd738946bbbc6afd72f95d876437c659b1bc663f6bbfb9026ba0401ac169cd5933ecd509f7390ce8a024a3a1278fe7bbffdc0d26c9d834e82bf67ac61cdb131e84a42c89da8aef2efdf3ee7cf91dea37da46db70aefeb967f7e0c83efe0796d603b1c58dfb263faf8d44d53e1c70f8b73d5874578b4afa8108b12f6d3d8dce637d54bccba48f74dd8f64deffb8cbfe40938456c4620abf62d9fd8fc9b576d463329057a7fcc866530d88338efe15f3eeba79cb33a5826208f3b9b8abbe8c4a0267f9dbac6f4df64f14c99599a3d04e0a4398b7c1e059e20e4d4fc2683d65e85cd279b8d9e9595e995631f3469daf5412a54535c569d81cfa0a1e773305fabfe9a9dc766c8da35bdf0b64d2cf7d0ff3ead736c06bafe86034468539a3adbbcf0e67af4e797b64ad494ce9ed2b9b89f8d486236b9b24772383d81aaed73286e5dc6e35a1dd0121b0a362d8c94022a515340f +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 90044031b7597b5e60a4f946b713e8996d0426d2cb013243d9b7d8f8ef159a0f +public_key = 86335a7626d9caf862810ba70f0dc83da3cc1d2d8cd8a3f33c8ac3248bd13417cecd467e9cb87280bae3b16ebd0a76e034ebabe9ab6e7a447c2826af3cba679837da36f7431af9e19efff45714e10d159aa438a6f1546a39286a7a179c5f286073d5b944faf000ab61fcb9373a4a94dba5c9baa94056f35ca29ed107ffce65b579c4744f94955db483d265053b812634ec5e56eb8e9069f637114d408b2d36019967f4163c1eb6e1c02ba295b5e581644dab07872d1a5b21b3fd0ffa349e3739da6ea9e9ccd7b6d8cba3b945be59e9598e3600e781ecf54912e7de3793fe05784c5f2ff71a5aa5d638f3316f305a28493ccfb180e8d2423aa4f75cb6611ce6e8798ced8ff53798b189fbf17238b5d073f24f88e14715818ac4ab40d3404296dbee445faabeb02dd5a7c7b6bd8b03768e7c382838d6e5fc7a93b9d94246a4042eea39bbb89ca4ca33f9b381fc8d6447450d3b4f6c794b566bf73508d24fe35e78a94780cce557bb380db47d2589eb1293d94ded8ae4ea996198fd134bc5579aa9fb54e27e2670b96dd1d59ae62e38680d3c8fd2d3517cd4b36aba9bf1a3df3d5cd67f2a5b4de7d2cb9b9e138bbfa92cdf49a86ba293d9145da2ab4cef3c75ca20a4a1613e8cf88849f03ed2e58fe1df95a2fb3f557306dfe7ec5e70d3b88d39ecfa2edb9906401968462d2ace979a825b088f7c2b330fbb5f16beb9f24b84a646cc6aabf7b03767988f68cba750b64f9823e7ad3b0da4e823d5211ebb0f47cbac838a489c56849ec7d05457f4033814bb9d53bde1ce787f0effab1bc885e293bf24addf40bde9238b744766eeb86bf96a4df32b17537aff899833e2790bb65743cfe76de7be38d064ce9b034ce9eb988d5b8f7b64777eb9be3244a9b6763c63523a6af78672b75fac38f33f2a97dc495bedd34a9af239556ed9412a48a7b46dedaaaaa976daa972ce565f37be80c33fd41f6c7bb3aa09f47f4c9c503e26773264e8edefd58fc75190cf47b37cdc8f59427cdf311ca493510794cdb734cdf69c6b1a9d5ca9d424e8e9f35ccc885db4750c433956d5bc6db7c4dc39d807eefefec6db3e9f6d77eaa28dd6521fd86665707b95ca4d34ec26cb4acbf9f8d243e8d47faead3a99bcdd75b5186abe6590d05f78bf289051ce378908f5777fd472baaf258c78eeb7755f6c6b1b1e3d91da945a837f0c84b353f9aa1d2f3404a3c072af7c84a6ae90e3ea0d254235ae8656095bf989456cd9aec6a837df6880c9ba79476431929c9b22d9bac09acdd8d94b7a884e271d37f1bb5335f98c4c59efece5ae0a485611b5d2258d9d48aac84c1695732e924d4cfd661de07f7ebab568d33abd832f0f92b89a3f25bb40fa0445f2c3e22f97856f739aabd568d2bd851b47ac948bf5d2da6911dd5b45ef6089aded487cbdf2f782c2e351941fe502bfcd264a6526b4aa6dd4395036d1fd8bf03b088361f6f18c1b72854648f50f3199e5aaece5ea33a9db74e4366c07818efcad158a56ee6f3f64dfde5ea3c51945dcfe16b0dfd3af10a4575574ea388590eb95b6e5158ac5bc4aabe686140b981cc5c2ac896945a4be09afd1b56744c439630b56a15b4a3591acc88f3c46814eec24e8db5725bba86cdd22a3732c6a1bf7cb10f14d57ee8e5901e46b97e63848efdc76368b797d +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: a7a31e140891ea37d2b6424b59b1f84f89220f32dcb73e037eb912b389d34a48 +public_key = a5cfefef43d6a45ee7e05c4f4736af0e8cc5ae6bc3f2a4e88ae5397ef69f273d3f969fa695fef916bb56e5aa43cef5c183e6ce00f78ef423c3a838ad2cd3c4f69ce42fbf3dd5f774054668f00fe3b2bbaf8274c7ae1dcfcec5b10bc6d3ec6ab33c963ad3bffb23f7412f93715a4bdbe1be754ef383c2e5fa5a16a2273fc88a9635b08e909d347e657e5806f93e0baf6757bf5a8f5984f9ef98acdefbe53850b94fe39614f8562455d6a7bcee09d4563e8b5bc78734864d1bfdbf1393849ae7e5c81ea5236d65586b80f1357d961a9ba74999c8f47c7583675245749bc56153fe428a1d324f37d6c97e8208c4a1315836036533775ff7a06dd9ea96e97109b78f1ad37dcf98f3085c46f68aab45379cf59cd504a9461b47268ba03fc7cf7b1aaf9d56ebfb3a7e68b396419a44bd56462e7aa2be9ff23a09c156df6dff3873a615f472d6796e24bb7daa35848eecc435a9b3d346391f734c8dd614396a6dac3c2d838ac103d04239c84734e835768a2bcc3d6f8567f6c998b4e7ca8e3da8168f68703ee936087d3db549736e5d4aabde1bbe765a18c753fb9514dd97332e54ea4a3f934c8fff95f0b03fab06ff6d113d888c1ae613ca74164793b5f798ee3c589684bfb115cd684dbdd524ef1a17393b29e55029ffeeb3c8d3cdb4c377900923e2fac6e5c7de94f076c49e0ecb9729ded9d4a6c0ed957047933e2835363d85f07eec6facef86dc4366c45cbf2f81b1aedae39aacb37ec0336d648f7c955e99367d2be30c95f89d5862720af9807ccd919e85dbd5999af47f79da95ccc4859e8a84b2983f0e9693b1dcb506d7b7abfd3f158759b90d651148db3aa4b46ddd60f97cde1616d161698f27ed73c2f74e9c5b31f9fb4df5ecdf3b0773470bbfba5e35c49e99f7ff81280480ae88573284c44ab9b91f8942ae4f3783263927c5857d5832a7ee576c6a59e8bea498bcff607ec51b4c9a36cc4d29cd42dea588a475674088fb07dcf45a069d422459439777810eefac0c8221f99390bd5a5d096402dfa4bea8c9f46564af93ec907c4fef6743ee58f33a3efbea83d113a930c0a5649a5eabba2c6a3afcc4738580c61a4730aac4dc3c84dfae58365cc6c86db13fbedb195bf539a55da60deff6c552148e5fc6479f1bbb67d5754161e4d64feef47aac8edc486a8daeb311fc653da3be4fbcdc81bcdfa54b99030ac2f824598ecc699b3e973ffb34658e83cce8cfe6495723975c7ed7cbc538e81156fcc1ac48fd9c5ca3eae26c9ef5179b651a95b7749bcf712ad18eaa951dcd78b0fe6bdeaaff5b28debef3d32b6bf826ec83af147af8288471bf67a97c5ab0244d3fe538e996d00de380723f937b9eede62f8bfdcaf09e74ffa3095045266e11f46e9afeb1eae584dcb8805d7455d3435956dbe679b8afe26ccfa82f4736998aed363c0e8fb1d23b339a16abb5f6ddd447bd78d8de6657bffef9bceb18a0c8f6d2936ba32d24871d6470c338921366a009fbade8f4ab940bbd22158ac63def09157d0d1ed826bf90581b4108573e720acaf53344fb876db0bbba54de4a26dab40afe37535a794294814e2b3f904fc0a03f3e073bf519588342448e24a769af363293f4c8786ba4b70330bb80f37de30dba857dace4b8291ecb2f6ebd5a06323b11a89242da833741e9c4 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 70eb3f791faa91f1f982fa477dbcddeb2c55691c07f93b04cd31b37544c94b42 +public_key = 2e2487855f7ec83e60955ae8dab49870de46767bac1506885a7abbb02d3fa89f3cf3644b146a7687ecdf573f9e3c64b052db6c14f3f11cc560d9b7da1ba641225bfeb8f7de45bf5b4b346f3037454aa69745de777498c98ce741ad2dd8461868839b4149135b428e7d145d60acecca5af744ea9fe42de574ecac5f153fa7d907628eb75439d8af02d37e528e681f2bf49bdbf2d52961d20458c96dceb3175730acb9b8c8500ecf58ffce367704d606bc76f8eb31cd9ea605f9d5ee839c3e0b771d3f595b3f38adcd79ff6d34769652e5cb492eada3e9cdcdf13c899cd5838bb46a27e343bd6fccb6294c1619af978e7d77ebc2e153ef9975664863f7cb9331a37fe53ce3ec80d939d473b81ffbd911fdf7b03cf9cfd66fbed3cd0adeefa08744baedb62dd3d93c2552bc7a770a0550ce7deb2e6559851bbb5d8665865555af6edc2df9637c07790639c0af6b4bdbd567b704c267e6abf2b371f68d686a29e0bdddfb7ec3c08a7aca40eef1cda343a61c6c995742159cce5503b4996a7a6fab9e8dd5713bf62f3c0792628ab62184e0352d8ca01c6130d3a349aae86fd69db4b3cb784e7a12a9fe8e448fb75b73f4ca54fdb4fb2effa4faee4c3a4f4bd169fb90968434eb8f52a6a1438cb7e589740c8b9b2c7ef3601bf8ee954cf1de8dab1bb3fec8a0ff6379a53e3325d7d11f4c7fead33c8fb543c3d9db6ab35e01f3ee2de4f62bcc92bb1eba065f95b4ffa2747fd5778e3232876d1eabe8e22639e9c3759eb460390bcced9bb0e368c6cad846767c69349c59feef7405d8ccca0dac2ed762b1ab6381eac33f14aa28cd47e5a6392113df8ef7d55e0de07cd353bece4880cd875746b9deaca76fbc70ef69f5ebbb994833a7eed732236bd6e6ec6b292e7c7d9a86a5396c80d43c22c56c1967d238d7de7a8cfb6a77bca45785ccd3ed8a98dbe379b05e45a1b9a8b3b36fd826f888a9bdf5e28abcc54fdbd1f3dfdd17cbb40e8a7a784534379c46639a222f7d279b61db6d8bdf9bb9304b32301d3a6a86fdb25f548f29f534a94df0caeb2c97b9b09fd2dfc646a94f70400cbeca95aada593d8f57e9abb6cd4a4699787b92d73f79fe9bacc0a989a59cb0ad279a567b8ca9536e8107aa7c8eb2bf7730b9f4a470d8e70655a08436d2bc56e0f9e7bbdc6acfbdc4732f4f66083c9c91e4eed2ff42292facd01bab34c4789a63a700a5a135d6549594ee69daff5334cbb1fc4c7e4fb0f53bb63f888146163a51759c43349377ca824c4fd91e9b9c31fdf5981b82cd23aeb5385be7f398ab6df5e87b605827328ebb32d678f896298f662f43ebb3b8a6f759dc8f4d3f577cfb8aa04627a80a03804039478accfa627779d1c87fb23453ca254fb51c629f17c1edc8cd8d7eaafa1350524fdf81c65b078ee282ec6e7e5bd21eeac0c3fc7ceb5be92897899f7ce45f53bfa2d68a5b583002667d101a9c7f8fef0ead711ca79df964e26e9e99fd6351be99f25cd5fd6be5c90696df6ad8ec56477cd34c94ee43b920eb6cb62bcf27e566a09e60f0fbfce7389b8da47cf9cfff4655f961457dc39c54fde66a41f95cee1ba8778fca644fab76f6bc262632283af2293ba7be9cc5688ddb5c13ac1a0ef7b16a43bae7e4af067d280590ff759d4c3a502ab563080dbfe1df14ac06d254fc +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 30f4095015ba88b6d969672ca3f438c395dacf7d476ea7a9e805ce932d270a13 +public_key = 0055afab3bdf8c4481d33e6c8776d7a02b744637928897c26c1c57635f4f43bddb27d4ab7c198335ae3750b8bee42ecf512ecbe4536247ad87999dce6f14fde3955e374ce13d8cfe2df360a8fb5c76fa7f1f594b64b562d0c3b524756b2f94667df3ef9a67aefeca35d674ed18de67d6d955d6bcc1719f97c9277cf614423c3efe9638ef621dd74d3cf209f976df6332285b3c412a8f618c5b5175302a5f366a5c67463bd7fb74cecc67f6ca96ee47d4c59a8e9d273f9569ce39ece3eb22ccac2a0ed0bd347ba60edb51b69dbbbca90b574405d8c06016e7e78fbf8157f018284a70a8f773434d07286b319ca4e3fa6b25bf5171093cefa559aa33ad3a0336a2ae8206ad7ec4463511d3be9dedb05944819b9647ffd94337c94b793e694bb3ecbf8c7af238c21eded60799c09bb8aae1ad84cbbd7c3bb8502275398e15d58b24f7953d9e3cbf87fb3fa016f46e9feb9116fd9a313970294bf5e8df5c4abb623c1959d6246d7f0dba79068ea03963d9598fb3bd4879c3379397b086a6dc0d896e419ca5f7667265ee90720f329474867cf43a427bee1188f6ca64fcce64adccee54f36637de2cbdbdd6c1ad7794a1ce8fa339993e873ea54c3f92a68afe0445305bc97b76c61b3bc693f3db2a3be8a6dcf8add35cdc06d2555be7df39998516549c8f3ae1596d2a88acb94334349f6af72f63dec7d4a66eb2f23973822f8fc6be5bd93c3911db634b19cd7217508f3f8113d565b475393d95c7abe5a94fd6c1cd1f83587b97db65e09a08b1af1d60cecbb15675a253fae54fee9aa9fcf9ec33400e4946b89b5b1b4ccd4146fa3cc758094d8f50ca8663bf36f193d656a432e2193bc5fd9ad1fc6a8235f174a6530b4bd78808c8798c9e1118f0c29579768da7467fadb025cc31c75017468cae17c697a79df023aa250c827d1ea1491944b9e6e56d24b1f0f53c13aeaaa5946bdb2e485dde8aad0d34de843489b7cae9ea90197cc471444068edef883e756a4ff4c5368e404ff0ae48832c19f8e75e95510b5d4eba93dd4bf17b79481aebc3503ef3cf4fc0aba83ecf7dd34ecbc0ec54f0df3f851a998207f770f4efbf95bd47779b6188ed83f8ed4459cf43da1f5dd174eec413ccf1bdf811ab65d7d954bf4cc0cbfddc384889d2bf34064e9180ec83d9ccc171edbd6bca3e278fbf358ed24445329b5e5456175ef7ce67da459da6f3439dbbf0fb28bfb9764d5d9b9af055b442399361f9ef84965fbcc3ea4ebe47cf5cbd37b955fa4bda34b78f8f5bfcf584c1f3646b5d7887a99b3847ba9010a69c8905f754cfc4fd2a6cbcfcfd0049fa1aa44ddae6d5d9ee595d2ba305cbc86b24a47725810a86ec45c6cd0187f62b2c85beabc0805d86eb3ebd443889ae657c9528abb2769edc8cc74bd8d94309ff895dfec33e823e25e12ff5624ca8fbe7669010f3eac9494334488105eb88658339db648f30b3a08b7a7b5ceee13a93d55f673a8fd6ca10cb4ce3d3f645fc42ed24420c3ffd512c68652adb99875ef8f9e3b984c70a3fe228f5ebd3cf407cd49a06e83f801fc15d33b0252937f857beaf9ba79045cba8264d7716f70d4787f6ecb8922582b84fec26da7813fbec61b8d038289cc84a923e03d7ae3cb232d5e0c1e7715d7b305d86d34fe89069774bf4339a1249be49b1 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: cf31220f44de862e1719570e1b26e897790159366a385452334fe24cdcae28ba +public_key = c1dcf48a969a9deb8ba9c43e80799f3e287b4263bda2bed55d25fbe8c84a4df5447b53f95d0ba65d2a9b2d15a3b139507a4cfa44965e68e7caa4d9aeb4f67cee4d4305d8e782ca49656775e10aa5320ded66793e1a8d92e2b538df264818e7afdc94ab3cda837164cbaeec93fe2b8b59397483fd84b05e976bc6e61d0f6762bffdd6af6457c648ed18e7ff0a45fbc8c7e0e6c45767b7a82d997cb6d453785b73a43522979d06b365481a54e91f4ea04f749513e5fbaf7f5f8c506a9e64414398d733f1a9d5c2181338df5e87bbafc0c5097bfbd7f946be5406fbee88caa3ff92886a6a4fe2c879481df11ad3fe1968643ae5a6c3aa309433cab3e48aa93a5610de8551fe9831f6c74f9eeb8be5771244954da635a2fb6c314b9d78febf26fab61397fd0b2d98e0fdb0615e6feea45294ef8c0fdd88bb0cd266ae906483d63e97c5b38f51011e67930beefc9447ff4ff7d96bc5e999cdf1f545c8753e4ab43d211c80ba9646e86651d928b0c9e64f5c2ca80b99914d878641a53a6a385acaab6d9b5690d11a8ef6ad8c35f8dc5d09e563c7636638f544bd8c0bd3d54ded7c320ce1af1febdafcb745dfddd23ec8d4146f1fcbf8235d941d9aecdae68b4c5961a7a437b335ef144586afce5f505aa79305797a16cdf4c8920acdfbdabadc0d367e2dd7d97aa9d0bac5cf7063c3b30f7ab06bf04fbc997f333122798670e3488cf4bc64089a15a97f0c0a4ab578dfb9d5a9a825f34e15831603ea48c8dca345f3e33d3838d55ea2368b037a607b643ee9bf488ee456283e58a3675b56967ce7b4a1bd3cf2aa1d83e474ab922ecfa1ffbd1a24b27ab3e7c34b968efd55deb839ef27fffd0489bd5f4109aa9897383f9d0df3691db56bc75b6a9e87bbe86d465c7a44b65aa828c40ce76de88cbd678ed93dae689506657cdb6b3cc5a9a0293d16057e700a3bb86f3e3deec8816bed17066854becd808cd803f9a9fc2b62f637c99535a1743e59ff79a863ba9203d57c81fdbbe12d52e52dd4ce4f388fdc695da7f2bc0e47c565e0cfb9347137d02fb9d3904f5520ee656f1c4ba91c47e5fbcc5e93d13874f0939dcf7eade214af6e1fa79aa7576c7d5ed3d0bdeec7ee459c9aacc449af7e1daca0b4e71b284d4473c9af9a84547bd3c7d5cea7bc723dd5d32157b5853eba9a895d35f89274f8f7470babba0342567648ba84a51aa5a604b4c36a27c0b38edb2388b53085603c06fe9fada6a68649723f3ed9e934d757ee65a4915ada5dd1e7482a37517cfa625588febc7b789c4a6d2aa746a91ec0bfadd79f138dfcd8e2adac7c4bd862ddb83cf0d6b74c6f3b5243e8bd8d7163e6c98d777c7fdd628266bd54af9636c6d1e26f466cfb700ed35b0966a7da03ff7dd67aa2cd8e7cca8f18fcb7be4ed4bb64d8638cd8eaca654b19523bcda031b76968e7ed9d0e3502ae35084f467a7dc2813762c1c4f19dd9d4202984cb49b33f9e328b0350ad36b4a775df7505b11b5c6f062dcccf788b87b5aef42b44b567c42555c7504dce66cc900383d928e859c87d99d8149c78588fdf0c347eeb6752b39b766ef2e715843fdfa85addfa81e7705127a52d63d47f9739534fed34e4f78739c4bac5da5c344011cb196dba2bc5197accd11b3f6e5d57b37115e763177a6910c9866c85ed61c6 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: bb5e65669a44e5d5c709bafa98c16ccba6ac2c4ae923334f69a11543eda64f5d +public_key = 33e4a6bf137a2d5c440814d972bbb4144fa6f2f97c6bf7b5a05a92ef1c69a3f6d2f516fb4d75eb9bfe48ebe566059454af7e919226742bce51fec6623bd55316a9f82ddd651a1bb437eee3202aae301a6de7ce32de1fdcf0235945dda041f6ad92f4d4f87432bf4af8035c4f6e236ca6e6b56e9f4800667f8816839549535f23f5ceeb5b0e194b89a5800829f15737a40988a43336ceab9e4800278944ba54edc65071b633740bd51f07a66d5781ee8492d46ff1c53495248365cc438b4a65a745a6458534f878997853597ce1f45371dbef97f8638837bee3cab373ddf4ebe4aa52455283dcf249e8f739ea481d685204b6e840c856618af10fa431a32bf7532b5b0868c2dd1aee2947aef05759359d5ec50c33193c8cbf15c5bb4a89b39c63337b3f4bb3b61b0581fe2362037bcab4d6fee14ac3d8b7d486789a6d9641b5bee2f1336d7f6e3b146dfde8debdd103b6a81fbd4c9ab0f67eeba825aa5b344ccaf940c5abc2960888946f6120b4aa3c73c3e285f0b6c6411aa745cd4399bdc6f7ec584ae4efa9081c4125cc37f31ed7f80e61975355ae779d7416fd4fad62a36a4b64bfde22f3af346a57b37747d3d68a496e33857577dd3d40342ab2c8a38c980fc66276b5439c824663d4f22ca9a316b6c078bbd00a748d9689283aaa0fa584fcc9f2de15c1715efab68e9a190e9cca3fe533a691503a79c71c43de9453932f64ce5994c78a3ce44ae595dbdc771f91200b9bdd8b6dd037326e5b40d447e7e75d7b5f7bbbf728d0cc8ae143f7e01995ca2c3ad6d3b5d1229a913e3b350cd567e5aad3ac54c35a8cb0e4faad750fcf6353a04856e649e4e71406503d0380f543aae846a21d03ed561451fb97d7b7fe5ae138a8d11b53b59fde98eef93938680556d00c7552deb3ed4ae5de914cb85935cbcf18821e2fb20e3d90240e8a6684f4ac7aa7163faef2c69c0dc545e3f5d1e67d6bc2ce9b5179bd4c4ab22dccc9269560992637a7887b996a67558fea2ffa97be2b5fc2b5e2788334871577f763dbc06430e539aa7fedacac1ff607554e2b3e60c30f6b8f169cd3537f523b4cb3096dcaeb4413f93e8edf6c774c98dbaf69cfc7d2d369f984a3304aa56809c6ef5fa4557a08c8ac2da634bca903f456c6e835ccff3f647a47971c3726daf16014459a96531896c8bfe74fd0fbd74d74a085bb32bd57857054629a4be9d11d5f5aeb5e7aeedb0dedca1189756bd74324accceb08df849969bd0d8adb76ab38fbb47c59cbbaa33f22759d5f879f178a6ec6e3730aae5d71cf86d7549fea354b438b48d4e73d6b0584469433cb86a74bf8fccef6de4a0ab3296a31fdb9a66116a766ef828f3caa12da7e0a5ada55dead9d24eb994e3c46df77a5eda1183fb9e6b8e6e4fecfdcc6fd11fbd9406b83c5746033fef8cc2897e324384075f253b7865a079309b7ce6a1a5b2007b775a463199c4a90358b416435d69bc7c6ec48a155be767db7fe36f6516ad9037a6d9dc449e344b0d67dbe3cb7b70b8fd156858d8656c296b54c7377456e2fae675dfc6fa7a4d3afe66627e352f56cc03a763667f3682c5ef77437a6de6bf343972c43b10f56c5770cb8eacfa955e89c35d932dc466b0c198874bb242e511f4f4d35fdb1eeb7c0006fafe38c636dab4728b6725dbf53e59cb8 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 9ddb3aa9c7905d1a438c93bcf78e3e321813580371ab4e1289e2dbf3701972c2 +public_key = c797aa613ae0091ec3131b8b99b3785a4a32c4bbf12b6cd218be8a5529d890073f2d1f521beb941014d129d5947ef96b72d9fae0f58ae1bcf36a64f6e7a4440ab4fc4be5d1af58f3cc7fec3e6374e368aba59c45932aa0addb3473e96854e8a706d5e0e17ba91b8b865df5f9ccdd93bda7b6ff9be82e07e751035ea6d8b7c00a6f6efb8dfc1be92c54f60a9479539c5a4c38cccc7beb7ff3697e3759f9fef53c07ef2d7c9119b77090a99b3be67ad965919bdac7880ee7a68beae1d7f30b957cafe398027596d61db2ce87a73cf8547977631d97fed724e93ba7be01bc7e1636db5ccdda4227b976eb5f0dea457d3a493d19494f6fe9fc77d06caa818eb43ab0e8d693eb616b8bb9c87c5e89a3f1d77e9801a9982049c6a99cfa649dd405867252ffdc127f41e32fa1281745e49f9cbeccf444b9b0fd0e48b81b96f83b9518afab2427ec5c55898948b7f16c6a1a09cb7dca509a3876aeaaa4ab29978168fcebe73e9ba63390b3584758da9b3d5ca7c4d43cb3ffa6875b8808511578ebfc8d6268a7ba33ccddd64ee266e672148bd89943c2320e36ec47ad175fc681a94ffadd9f87e851f1a4eab4755538e5dd99169ae1cbfbb70aadc0c87ba4dfcb710ed53bf7f72663740ab74c05899cd798ebe63a86acce3ec5fde4cd1868c5799992a58a60bafbbdc6b5dffb8915c3aebe3c9fc807dedc8b9b8bd69fe5feb6030f91912faf3eff636ace90f505e9a6479decd8626e2ce6a1094e2dc7c57a2ae89b9bfed0d4b9b0e9d663fe34cf53f5a1867505a43e411c3fb4c4477c74b658e3d2fea660235d5a25dcfa077e3fbe2cf408fe87e427a0dacc9c0e2da8ff3c4538b7ea639a902afec826e8612bb3db2eeec63bcbdf70058f13973cbef4df371c49068ec5a61ba074175b6488bc9829ad658568314f56bfb88db4ceda50ae744f3fdba22e772d94b35233cff9f8ca6053a364ca3130eeacde98bcaa9371228d6b40c972b1bcee168ddae67441e399bb074e977d0580210fd6b258a29bd53fc277609d4ee50b0e34849b6b7d4564d27735507ac25ccfe64d4664c0b37cd5c9d00d43f0193ec732aab32f0ee5913ed4bdc9db638b42960ac871ce4e632d80639fb9d6d3bcef1a9b6e85951675ef9019cbba1c636ee550a82e46ab27f3202fa8e1eb68209642caf3814b1ef15665d485a8e0f4b8ecd8c5bf117e6136e77fefd995a8956d6f0cdb38f841a19d5b19589619649ecb3bf4ac3e4a9a85bfa85cc237de9600c744087ea727e6745829cec41f346c9fc16865d7bf8fa7d3638d36d4a7641a9a0436e7c09681e0da904b3ef07cd7b57f183640797142ebb3aad3470c8f511bb88c8ddfaf6eeda4f799e61f8bfc01ffd00c95bcb1df70d00c89c60ed3b86650e2f8a4c47cd52b8e7cbcd978dcffc776cc98d54cef7db97a104f594ffe8b2444a21cbfc1a59a61ddda53d11d5489967488046ff86791889dd588ffac8946688cf49e81da406a2684d1a6495d33a8f12b72686482b92cf2732e5975a484e8488d2b19ae220cc1387594da79e95dc47ac21f7738ccd3ef7f77258e892744f4678eb819be6f06943021363ae99dad5f2e3303d86f890478a91c6d0bef8e95b4ce2a96ecbfd681a47a25545c2a29b75946d0f45ba0aa193ca5544686d9f9a802fc4cecdefea4a0 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 26d90b190a6c3d0d9a86cf66005154e7086749e966e7187c249ccb9329fd3b8b +public_key = d90d414fe5b14dfca90fa6bb7e45d684c3b08656374d54776d4efa645987b9d8db28933551aff991efcc4074e14ffeff93e3d00164c333bc77d566cd91d9d4965367b245db87a6b0b5aa7f8a746ffd4576d32d83f24cdf3efc4d09ccb86dc4caa55365a8b4d6add3cba31f7ecf3fec9139c6c273bd4d4bebc1fcd626b35db54f30662cc44af683ca2e76c527e337746f0f59d0b7369df2c7d5b6387670c4e1e36f88b878df9ccbda8ffdec9d0a9e4d6ea19f1cba55459b797dfdc14ba52a0b9de9eadcbf43dd3f7e625228a6a9e471d70639b05792cb8550b24ac159c5b069d3d741dd9065d9f80cffb4f87cecd9b78357383b2bcc4e771661f4cb75c6589db327d58f4f8398ea7bb88450f235f5823d58c609bf5c0fa3098a61920ec092f87aad3881eef6a2eb9ea49dd3cdf1ca69532d5e74f68ad6cd6fc14e63a71cd972c4ad752acfcfd5529b75328548c18758d26bd7965f83d76d4bb8f94e59756c879a69e9fb7f86e0dc39f1884587ba5e134e77eadbfa3e96410a64c2d64d3ccb939e429bee7149ca2b3368c11c8e1f48d82bbd6f39455d56eefe95c585f0098fe6dc44bbc97c1547600d79b193fa838f4fcef6bab08d56ffb00e7ee94e4c9914316297cd56889208ee3e71e544c6793b761e74c5cbf22958d0785bb003589a899a562d6f52ea67977a6ffc04adb934bd7f29194c76bf9694ef7ddc6c4757cac5ba2e9d98137516c450884c374cfa8572f3b9e27cc707cfd5c398866df7972b8a44b7f975cffc34023efbda14c0bb9a50a5e5954f9534ef9dc0f2ff328d6e8be6dfe66ced64d6dda044afe83fc5b3bde635992998b68b8c7bd7a0a1c3bc99975aab55aa39dcde1d5cd19ef73a53485349b58f437eaa29a4c8f8e97935a8ea844f6b3cddb5eedecc1045857955ded5dd65a93aa0fa734f3206718974ca6ef35191c930ef67819f535ea5f8de54659b1aec30534442e03cb9c4673679dcecb215f64ea53d20e383d99cd8bff78447c3335a4c3bd7fd794cbde9e1fbe30faac0d204ea3a6476d00e4ddc988e757b66ac5c95bb7767e6d3fea90f7b5e6ad0e62c582ebc4ae6738b963735606fa053737014c475fa24b145bfb47eec97dac9ff58bbaccb0c36670ccc9336f87fea9fe7dc6a2ecc89675fc9606943ca1a6e8688a821b69e345ef026ef6442baff70a68011f8be62db6e6283b9b85651fb8883acbaf08868d7237a51ced5dcde0d7b28def1feca8a2d0f6d82359de6d8b548d9a49aa9e4ce76584338bfc9ffcb51466414548cef544b82abcd277a6602887e4edc5e0abfdb1ff343541c7ff3d4c0652ed9ed04cbdad8c2ef8dccc47f3a3609454b733aec068fe7df8772e388255a87710ab88848722cdbfc3aba63ad04566b1ba4febfa2c07cc42d3fb18f7f80349cf45e29ba52cedd4ae840b8f9858dfc68a84fe5ddd58df317f9d2966d11d4a5b20a6d451d71be5d83fccd50232b7e595be1c60a5f7ea438e025d18d145b97a4f8a899bb53b4fa97ed81f7da939dddca49dc3ee12bddddf944310e4ce96485bde669f214a3d4a88c6e4b3fffdeab4dccf4c19ff4e03c47fa2a7d55997c259e7172a7e55e2beca09898447ac0153435444c69b3c7d4d5b99189e346bfad6143bdd2780d2219878823ecff9df861e3a729f913ece36b46c0e9 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 7db6d1a129d6123f1f805b79ad3b413012ea86aed42a05e98e7b1f32f9fbbdec +public_key = 0e4c3b97c9c7bfe5d5e2bad1b3cbcda4096b37aac72b5b50a41aa8f6cc51828eb70fe3f7066ebed0938d964972be59eb643ea1493e7cd558e24b7653f27d9af074b1fe54f4df4bb22ad9ebff8cd448a5f6e6efc82f2973408c4828368b87a7c14a569ed7b58f8eb6cca29d88c25d31faecde5b37c442543e1eb944ea5ad541248496795bfdd56179ce88f374ffc068de70b6f676555f6b48e0dbc89b0b2f7a8ae554ddab721c954db21a87fda98478ddc2af38f0b479effb046ad544b3d49e9dce93d3e3ff715227da182a756ba8ee6cccdb101df74c6fec188fb0516743d17a7d7b5bf9f8dab31d5d739f68c57efc48ff6bed3757cd13fb8249abbfc7b5a795feee5b56b9f20c8e8a67e8194e67264bae901b3ae60d5f796341897542c70545a9b6b260cce3cfe536417adf5e8440907a4fa1e79a292ba20a56e285584d3a2993f2bba8397756e1ac505064e8072d7fb8c3e3d0b6f80b473c59abc9964b5dae58c6860337eb69396a24aa990349c62aaf852db49e8a95b04d4b8197db3c9459acc6f749e4ae2ce5e8e329776a6b68e33a7ac795330a9ceddf2b326c4cf69303bfdd9e37ecfc9eda856148ab9dd0b9f0cbcf60e6c7da1c6ddd81dd85fb9b915a3f54372c8e13b69b0d79ea508a391b04478729ca19d75b566b472917614a53ca485c44e67dd793b4ea180697f20aca366dee7215a49f69ed377afdfe4a3e0bbcbf475f710d0ba75898ccee4c5b645e4752ca8779fd9d737337ca2e9f4c5ea1277964c9e67b92888300cda37c48f700b4dfc185ab8fec55aa539cf115913c9c73af18e9188965e57b326f76e56839e5363c54a267c27e6f5cfbbd712138703c07dabc5c6b0ccbed5d3884012ceb8ad8cbd1cae2bfdb8a80e9cfd25f6d950f33254b5dbc2bb17495b6467cdebe684fbf43ecbd99981a4362fe3e8b290e5d9f3c3f1db3f8917cb141ad567b4782ec8bb1ff3eb298b6533c39733304b5f7c74206cc688c144a23cc72aa59ee498decd8fe4fb3b7767a679ba4f4c4e1b778019471bd78bf6b55c2eaf43351f85191bd7a66c35ddfa67daedf8c30d5f64e3c3ee88b62d3def542de595b5e9897a99bbffdf07867af35bf45b10e85a60b4a9cc9feaee58b17ff977cfbe80c4ff43839487ed6b88f6b94d2d4686ec7b7eb1ffe6d995c398896cd9876816af7ec87e8874da4a4e64b65436440fac565caa10eba9d498f4541b6e65d0bb97a634e6715abebbfbd909ec18a3a6e899738188744cb6b817e2ecf092b64e68cb6c9747d3cc34d0d294b487d548e6ecf53bac839c7df045d994aeaf7341f54556fbcaa1e8848a343f2aacddc3fd7f84a66b08958586d69c7b7b69d0fcf4f954ce335ffabadb7bffa5952d5efbccc7fce3b6a0d8d74f735e9930395d967603e3f7fb833ec191e712308b914a7553a1f8a659afeec38cb718e926e94a2903471b79b33adf94456fa6a09438dbb7ed3063cef5a5c66a9de5b829c8f01e7c1e22be0bfdeaac7de42ea9433476dbbf448511563b5564acd67f87a26f779538dd0584b61a75f93cbd85ab5f3362bb96a61d9f2ffa77b8e9dacba77869293a03d7cab81b688306546ac348b22e368b8e7e7bc969ed84ae2000548310a929e9738b2448d1cd7d1cab551ae0e7b1c495565ee65f180aca4a38847375abe6c +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 1d129b27be7384c359d04311fe5c44917d1fde4bfb57314f483ac617edd5ac49 +public_key = 91f33ddda5b9ed269034c7f2cfccceae14aacab8e038e45b545e8216ca5c332bbe3117beb9ca69288ae9dc8ad78c5efbaae7cc528ea38acef1bc4ac5d0ca67aa7f48d8f97d7536d63cd88219c396eb1e435e6ced61dccc963444b35c99c86b87e419f8b88c47f64b919b0f8ee71ef29e6ad1bcee7b600acb7449a292be315447d9a2b8a7d015419726563e366324588038f7efc47e4ccd0a68fdf5f4932496be0ba7adfb6e15dbb99f995419c8af3db630e22393becbf5829e59abc78c435342628cab40a6350a8a86d2bea93f6c9152fe895c4674cbf76314be992e8fc6dc2e833939f6238d7557f458ce057ec1969578379b76debf518976b9c69dc33dd8371930f06b4d1d2465139bc0a63ced13db9283ddd549c45cb45e518df67ca3ac88160ec3272b9c6faea7c527b0ce8ab9134f57484b341c3fd0b5adf9e36f4eb38be5e7d5823a3ca609fd9a5fc590dd14cd2dbe5cd238735d25bab119b06026884af5e76bdccbab3550fed9b8d4a473a4dda47a5c78b8be6b8819e1c80e5a7fcf81e3fad3274c6199b345dc2ec0b0c541962a965fba79994dc01409463d138977d9bf8ee8bb3ee3b80f1feecf7eca0c6ca7306e4707ed941c6dc3c9cf63ae8e87a5e7de9884da0b7f9a0d17e23c5b95d553cb20dd86d853869b68b44db974f526e072d6b1f3ae8c602ef376c434b9e777a597b6304aa0d1dc3d301dd10e58eb9a9aa60e0acb9394cd555ad47b6f62e4c3f191e875e1688457ae87711f933ffa51aefe31cbd47c28535595e7bc0777b955ed94d6e6fa5f67bd8b674abd34500eaea4c94bcac04746c4234315ee6c142dc48e7e4481a43c486c96d183b3ea54b19ac54e9727e0a2a3e2128ea16f5bcd861835c78357ea4a6e8b9b785c085545c85a36b3963288851a15abac8a39a109d0d19fac3ed6da93077486d7920a7cf74f9eb4f04a7e90e7f4d1e47f65a9cc8008d7b20c98d9867a705472738982f3d6d8f71d95548552cd0ecbe01dc3501d709b3eaa48af7807c74b9533523a1f637b1a89d8383945dc9553e9911f5bd12d6c397f74c250b7dd43db4aa7da34df3c94911d9fe8be561dcf5f0f37907fa567dde3ae9eaf4d425a7fdf35b2e71f41400783bc2ba3b6098d628db25194912175548453a66975de9007be36aaf182eea46773e70fc9957716f7b6e48903f574f16d37d68dccc1649ef6fbed8bf4d392b8637763ffe5b55bce7e77ce8e7701b4700c7ea498359bcaca63948ed1061d8c6c33894b4ebd1e4a659c2fc76c58c0d2f9648b99d8398bfd30e9a4eb6dc820bae2a58c3aac757ba83548400fae08f7c9ad8b593d756a3383575907d34867b5d98477eb6cabc4b7397f05fd6719cf73e4ff00a4b362073325d48652dfd88ffaf7d64d88495ecf96fea8562664308f52665eef8b35d67d98b5f595482d767b1c39ea9e45e00e49af47b7ecb03fe4b69f831e2df4f578e8997bcf036bece53c5213aa664f3ff6e83c50594354aa7974d3abd9860b3560a534dc6f4b9a595bb03ebfc40978cb39d3bb549eda34452426f0006371b0f7a411ee6c828c6743846ab3644413c8c995a452808f460f2efdae8add0a963b87e38a67ed7290789200e6d18cc7c454ba7bd5e56d7ce2d10ffa73f2a284bd579dd64e4229a9f36e58fcd24287c47316b08f +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: bbc773ebd2df42c36ae05952d6a64c63a5dfb82ceb3ef4f8d4df3a30ec8c0467 +public_key = 2ecb47bc7c78372b75de587297848724335f44545a350ae2e7fef08ed4764fb8bd4af9712f2ec8b3c99e5a04432ec7c0b43dd384534aaf2f7c650d883bdfeec525f380b458bb69c5cf9d9842d3b07fffc539c44a2e0fd23aa97a08c5e1e444996144cff78ca394b5440f4aba566383b0375edb2544a42c4df25b6a97fdf63c8962bf9b716bdcaab098b41f735018735d8a26ad7d93b0f17452bb74e80a67ff7519eaf0ba9b3499a134f9da167ba72dda62cfecf7e3234b152fe15bdd463eaf600dfcfe711db1fd9e4f387fc858d8d608244cc014a31036a9abb68946c5e355dd7fb914bf23ee7ea21854ab778b67c4dcef43ecf8374594385c28586dcfd5421d2ad08634b006965f88d58a5cb449f62e36d708fdfd0aca3b6355118be5cc6ef40c7af39caf6380c55abe19912bf9d466cb701d4bbcc6ee38c525bf29df3cb3ed452927873c17c7e54ed51f99a6f585b89facbf71f594b49ba84d7f35978aaa2bbaef9e749651add9acf56c5d09a4c54becf2845a0d0555528c8c1d287ce8edaa56e85adadb894413d5eba4fb1feaf474577520ceb5b99eefdaa95593ad47e297b9418c52f0189ae9bfe254f838deb8936039f956749007ca73581aa79f47e16543d68d34f5d5ecba7447b7cc67f9d987564ee3cb2ccabb6d3eba24375304b7d638533c67bc6e53d5eb17559133d4aca5a6bf44c635615a9882ef5e4d137393b76b5027f54a7db56fde3f7aea587458a43b3435bc0e8ff618f661da9fec065c0fcf3bff1b919633806a835139da4c4d34c6f4567daf07536eec3d4d0347f3abbd803f317c33c2660393af455c2dd5d6cb2eef48ead51d8350edf5590adaae983ec2e40ea8258fe718968ce3e66be53db8db293a22859d68b353dd45467c85ab7f4baa0d6bfcdb83c94a895a59ed9e9f249154ff5fc6d3c7f05db192abe97128a64eef7c4814ee09cf6d64b8c229dbf4f9e9667afafa3363ed19dcb6adb7f5eee88f063cbc74acfe90f989c9fdc7cf6bcda814bb2c4fef196fb32cc8f94e99c78cbfed86b4d2a1c8c3e7f9a11f09306e588fd1856b7f5c5eaa768dd72793a3a88d35e931de0bbe0bbb69711db2c75c3308649c136d648bd3a6d6e57c57fddd5df7f70d3cf6572aac89ed8238658332879d5f0ad15f7c8db415403ae73ae728a5f3cbf28b3f6b05cbf6a0d9e544d98db8cc687c597ae2e6b143ced1e983eac9dfdc7edae1887b7fc8886c305ae62c3dcbc61dce54ea5324dc9b82f39b0da7edfa69b81ad99d49bca9e3449774985f515ea7eeaabdbd3385784ec11adb51744539b1095c1c3fcc9908eb0ccc6dc88ba82acee025ca5dd3353639fb8148088763ec9e7c14370766b918e93d8839a8b0a34d319d933df3a86e3976d09776a0ec322984eb2155b6c7ac54325fec7c8d812533e55c9cc5d9adf6876e501638f31c1c660583829e7b3984bcc8ae2d632c16993673818f7ba15b5d64ab4fcdb9f7b0e17d83292e3389bd6a04d559fcd83a119e3c15167363f997f62b6a046e4c46b9acd703be1a1b641e89e0ea273022168352c89cd86e6d7746983b3b51d57770196a68a61ef5f1634facadc7538f6ce0aa6448c86fa76c6a3e2390841bdc7f333650c53e0a998b66b533746765316f08a94e18de52516228102ff16993ac61abd8d7884c +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 5b17a6adad541efcbf5ae4b0c0452cd2ce32e4f0f8701801c5b63e197c1fcbf4 +public_key = 7a79e7016e62efa4cfbd499b8c853e102c9639457f679efd58383e629a7523fec683d48d8b2e6a0ab8f455ff9732077f4baa593de951868ff7b976a35b9de3a72fafe365e44b63bbbe68f65287cf6e6d5421e73e7df7301b59a8869feec13e4ee76359d9e7e5efcec2af7f6fc069fee02ced45d6c94c76cff66bb3bd4fe358e33f17eead44b35e256bac5ac5e9e404c3cba647637537a524849cf952deda7940ecec3b2e3d8c13580ecce0e2b458873ba5cc3dc00d855531bdb5f97dd3a2c6641b8fe70b238feddb624f9660e16a9c546adfe92df61297955203e2aa4e7fcc8c876838da4a0fa8ae696131c76338097f0c4aff883eca25d55a21c6e9d1c4855047ecb2cac00e27c8ab9c8d7bb944e4bab625fbebf7c55f0df84ce67c48fbb4438eabc818dcf871d6e9223adc504c6898d3eb9e859999aeef4a39d00f4d63cc0a5d13975182c970486fda3fd7430117b5d1bfb08884e690b5662a4bd2978c5a2f1c33097e957c5c73bb6affdfbdb5f3e5953c5d9b2887435c4ebade6d7307a4eaad1cade20c4a22c8d683c8dd00ffbf82a4ae80fbd91529d198ceae23145522c86f86955d0d3b7b4b83b01a1f3674aaac2c4e38e4b3616abe784a4bbac867daba1acb13bcdab84a6bf987a23ed9ef7c7cfdcd6b952d5d5515b4b4b1e7c749e693ef4a7dcdf8b7e2f89168a9ec0385829e46c7faea3c80be8ebbdb333a5ae6676aa81daa4ab519638807bc9787f9d4474f4c068897e77abe636df95f5c35e7c691b49c72f5dbbd8570d6b888041380a6a4b9a65868f257e41fee37bb5ff807a57a9389cc195345978d86359b36e63e6c594a88959b7b006abb88d754bed942230b36946ae41d58e0050834cbaf4cf58747820a6aacdab186bba056bbc043da570f874eeedf9718795ee19c9e8fd4378fa8a42ba6812dd5e874dbd2865fd419e4d8e897a7f8fb9ad0238ec73f67454db66e838fafd731b60d92324a9b11a545bb9a9d7a34fd54c6bf898ad80bcdb06b57535e64fd254ac58155dd82d73ef779865708a2563c86e4cb3133cc5fc3ee6dd3bd43449a73e59a5c6a29a227a469cf4d6192ba4825e3503f3552f743bc3dcb945048a95d8df09bf5c5efc76227ec7d948ae9e0adaf13bd78bc588c1cf9c1300961c59ca8529c357c9d87b67fa8bd2739a7b5f6f3d874e7efa23d4f42bdc652569c7ed3546e3e85b78666e1c2cb7ad66ee42b35d3e15cdfb93fd755036f6bf95de4fe4405a8d76db3410a4ac1e52c91f03895683e622eff55646ca02fe7cf1aac75da7fa5d744512b4b498c666ca68660b984bbe7ae833e83caafc8de17ea49c484ae2b6475d3ef76e0c9317c57d90dc9bc134b606a7ae336b4d881d76ebfa954dc65dcac29f083eeaa81f9a6d926fb039ad21e09b28cddb959884acc836a4aa5e00fc93071dc474e593a1d7ca40a1deb6d4dc3fb13a5b674da32eadb6ebd86f179e614d935c29b67d8d54732948dfa37f96a63607c17973b764b9c05713c0dd36ccd534c9e87fe33690826a6c91de4b2f97312d53b3c2faa184db0a47ca8817e45eae577c994b1dffbe9109b5b9a0e9329fb6adbef67c2759fdae64cf479462d4e85ca77f55a7eaace8351a955d1d87fb15890042363b3bb64b6373e44c5bf6ae2caed5dfc3e0f0dca2015579e6c636683 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 61ab87659525de9656af41246f20e1dbe85c24e335e7ecf9493f46168bc14e94 +public_key = 496d867e75349ba9999fe4be9336fa08f868acced652c5ebd1c67c276e56eda768e31bdc8209e1eba6d62177a882435c74353ddb7f79f224ed23a6440cadda8a476c66993477b999e23b40ede83b1f3e781b53d3e4bc5e032dcb0a74d9c88aa8238b83d78792c573f7510bde5246ca42fc89cf3ea64069560bb87360ccf696e780637ddf24db78ab73d079a64c88addd4b7c9efa3de822b6bdbc69c6bf7e8c3b2792eb3f756e1a465325a763dba2296ea423e6545837fe785dd375aab4db03de565ae76613c26473ed33f37cea0346e71649d23e4862cbdd2b05711dfeaf088a4c629d48a734fd0be6a8b536c41a9368b32f88edddac7298335e5c91dc4e9c2126a8df45b2e6d8793da63fc7e94d75d3bca2aa58f5b5bee0b43a463ae2c34b93f68952b6e7abd89c97c293b06a3e92a45cdd4e79f45e14983e87aa26da8c645e7f58d66ae27ed936e6a89dca87b6d7dc1a78c66743b89b4cfeb864d67ad97d7487ef78bd906a9a7e7874dde75a7b8273851dc55dece9b1941cca76dbfdac265e4875857819f8dfe740281db6be9e4d564568d3e4d75f4e41749990c51fe4eb5eb71f855deb9349dbffe08843b5cda8e5f1e8458d1fdfaecec65796b117f8b9851776e896891ecd5aa0095a914457026e72a186f4a608cd49db55a42bcea68778a26a910eb566a2d942da58a4cea53ea7a67955bd85eaf642406be6753d9b68cb9bc4cd4d685d5d861a605be6e63f7cb49fb8cdce4d917bd59b9499f459fa7ea64a487205ec97e66e650df9196fd165ffdd5fa5fa3266840b4575fdb7625d07d00486bd433447d6eeabfa65b216ed34aca74670d4b7006fc36bcfa1629af0d79b352d1c82c26f6233ba52796730223ebc1ca837d9eb42394d4a20b5e5fe98a9e6d9b34fcf8f0b35f2630cfcffaba508a6375aba51b4a36af23740d2e5e706bfa1084bf3bf5a6b76bfe4dfcba5eabb82faf49e4e3f6d369cab0f74c00bd54310a3620d67deee533a1a89a51b4e8a3dde4b25244f0c66c8e8e454e358364fab599727da91af5f3816aa1b37fb09e54435ab3096f8e61936f99acccae3d689eafcc7e32dcc42f5a347173ec5cf510ebdfc3b55f6d75c9b02eed3b99e4e42bd3866ee6be87da0e75ff51dd3e2ce1daecc6a9734ccc815eafbef09cd18c3a8ad7cdf90574f41075cef57d039b6f891ecaab6fd33fce4f66b6ed589f7423b4992f488c3cbc450db074fdcc7cfb4b5ec09ef359247c1f564cc94383892757a8164c8c985c28e288adffa9c866a6779faa0f098fabf75da4b9c5e0fb36e4f5ea6452e67aa97c8e25ba55a3b5d7f164f08bf917f57b16b85eac18e67ae88cefa14668e7634d05865d1faf4d20e3e1b37dc9ef9e64d18654646bbae973745e64f90e69064f38fe5744a6343ca05bea05293c5dea9ceadcab0b2fd7ca177ca00fe3d583be23bec8cd829aae8d7cba909ee4c89cf9e9b52038638f557f1f23c6b3424e9eba880368782d2ad990f67f11b03e112148d7455eae1e79850b75d6e0ae82744cc6d77a46eedf72924bccef49053198b88eeac123ad753a5d587de4c6c2fbc12939f076e638c5e91e6ecfffbae47dac984ce0d4d6dcb637cbe8b2f04c115f98cadfa79f64e6253cab64110a71d94db5762f8cb4d277e03b2435a473d60b193ed2646f4 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: eca2adc3da1fb15f34033405ec08ef2f46163df4bfcccf8842c600ce0bc2026c +public_key = 345881ac1e467fe988365487107f66d76755b0a368672dd1e627587bb4fa2f0cef2d9db154bb61c2cc3d82a3588e5dd4d21f534f787859df3e8a28f9722f9bb2bc7780aaeb128e37fc9ebb0adfb39dc77774ef91fcefcfe80afdd498f379f9471a29df350e8c5819ac4eaba7a5af4c703c887603f2267b3eaa58a90dcdf71208c6631a77312eb3961ce4605b5e25cdec2e3c9b2196499dfa69d6a76f065e907cc79611bcbca7be500e5d85507e9761a59e8bfac4d6bf7a5489e482ac5426f73b906631e784c3bf9ff599bba51464defe6a7c1354dae97844a6c73cec5ec47108d24ff5efa95bf71b03f16f56abfec55ed81dfc27b9f50fcce2c903f9ea63b3a2375ecd35634bbba0a5ad619d4571ebc7868faab83d6e80dc4ce29e8596eeefb6486fca778df82dbaf3372d445bd64a44f5c396bfe2a098e660de6fc69c503a33b869afe7ed0da738f74211dd74dc47d6e9b4e2b7a8fa3e18d4458560ace39b55dee4f8dcbebaae512efafd8636bdb92ce56549f6b0fcab1978a02ef694087cd62f097c32c9445616d50e454a5fcfa43d5cb2714d49eabba1933ab857acc1528cf54b35cbf6fb4e267b567dafa126be552d1c83f408b1252db0b11cfe0aa430f695af478c9d1c54406b04d1170a84c4d5fe9657c1b4eb652938b4a38ea80995ea606fccfa3da56b5588f6fc64b6fabc62b6a62795b3372637bd74ebc55c76df17d288678012247d12bd9118c43fba2536f5daab402377791c906e4cbdd539eec82aee71a3a697dde65baeadfb978be46a8fa5cc7c8ef3d037cd85888bac3797a1f189cc4035658ccaadc61432141b67bc09ce04685daf8d6c6827f9e71b62dcc5644a2de401d967158cd93a9afb442c3af48340889e769bf7ce8a1dca4f57f4ffc93647375e702bacb559c120be8b1d4a5371fa4bcd6d3c22254cdf2654b2873cfaed359104e83e6a4cf86aa30e9480d5afe5ac5d3b2cf6bf42c4b314c7595d9d7bd55f6569c3e22234b9e37f59619b52051fb43b99fa687dcc32c6c276a391a10695966d687ca6f0d9dea60a093f9a8fa46bb9365e7eea87dd64f308fe81ba5c3a39578ea4583b8882efdb5e0b45e7be2ab82863c68ebd336f7aeb9e1777d7139becde5af3b73e2143fd482ed0a8a8cdc9e9f6d2d7c23bab39e015c65a17fe0409609c1cd607ba94fdba9842146e8524cc6ddbaa3dc3c9153c667d2b4f4a4871ed74ffb284c574be735b24b9f14aa7303e6d3e9bed8bc4e5e28a895a7a55e5043eecbd4dadaaed7d2ca9c1973bbc485400b8bc3e897d9d977be1d6cd7d93607b1f3e43b56b551895877d3bbc5d5186fe67daef4d1d1f48a4bc4a98b9332666afaea93aab55b09cc95e879e872c48b3595ae930e8f9188f3362dc6e5dae90955f6c462b52d8c842184bf1508ed908369e9e1599c8e43ea7d890a7e5a8caa6953d774a2e7aeefb25f9422ff8d3637f1b28437c0773a719cc8578ecff87fef05b3bbe5753fa2aa5e414bdb599384fb6462565bb04da4c84e550b30e63928c96744f7b5d57864dddba25065246d3914338cc9be47b2debfd18888ff9aad87e1de2b789cc3d7cdc2d93567f7a4c88fe382c4c5ea7dd84e524b82eab586ad8c8b05c9af5971a56a31f2b73ab45392bf60b762c5543dc3a259dd67fccec3ed3654c6559 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: c4f15bec2d7701339d0ade4835193bea3632edcf89e74992620d9eb623a0d0d4 +public_key = 2695adfcf444770c6ffbbe6e931eabf6ede9e157eb843a3e7a38b5cf1d9a0a6796a0e8f2a926756f0c4a10ad3f543ddd6cf37a1cb741f21fe9102b63435d63d6b9e0b2fc574c59d67a1a40e22ccb7559f6481b7f0bede11943b3e67a570f0bc269aa50de26cb5f45d7791b75747d517d486d7a55a88ce86b42856705f6a7a48a8892e96ff20c304e84f71e0b555c1b4b0d065a50e6ebb38e3cc47f3009179dd2b4c37a1ad6b2099c2badc4d256a2ff2d42bf4b3db92be1038f75b33b4485ffccb9a7edf2a7d3de6ec17dccd319ac63d26d80f5b5c460149ef85e933ac6d1434d4b6679da2d1da6e3aaa186f6c7e23d577dcdfef5ed43a6d4ab22ba85b5396a4e6eaa1528becc59a1843a4d70283cd209e55786fef354f4b934be9a1547dbfbbcdf2e552f968c2c8692475632e78ab3d743d619e74d8d7ebf3797844d7e7e70c5e367963a7cd3c4869a85deefe3a8d34b798f39056544692a77421f4698df37d8ef677b9d8358e8eda2cbacefdc511e4ee0e125fbf3dd36c4593a061f52408da2672dab1cd8b6b1d99a09ff5ae42fe713bcd70833c544f4facfbb78d864767449f3d84edc5b4f38cdef7773d3989d598affe6650d1e66ad4ba0e034ccbbb5a75d69b114ffa1953afcc6a8dc58ca6da337e8e4484d562ac700e9f4545b6cef439234a8d611c99e6a7d6054a8e34914ee1a6fb272c4b0b8c4e6569952e4f98d4ccefde7ae3bc1d9d3c5477b0ffaa1c0dcbd8e4abd477d832eba3d43d9c31147aa804ce7bc3fc65e3c35063df97da9cdd6dca30dbdf5e86ad51af5aa83df31c159a5027ade8f3ce677aed5baf7708fab822b1777c6c53137cae1298ccc15e5f2400b7f8553dde739514d9d453ba97d9359807568417eb3d7abb8982707b7519a65b116466e984772f87a6346ac808c7b2defff08aba151e79ad8e45926df9294879a9edddf617e3e3319ec42bc3ab24b65b488c764ec75b51e7dde39ada784835e4ef9cbd7b778beb69cd3f93f07ade724639b86eca598464e6676e216874c9668b19aba660974ca9e8d5286eacfb3f5031835b4d44b42fb91e53e37388ea2f60354e837458e69a89d93de019de178ba69808fa3a914345edceb5cb4b3357b6b7e4eb708c5a7e4f862c44c8ffb9d473495b70607386d0fb4f036ee1a8ef4de28dcc793355135bdf37cb36baae80dacc2f7bd9efe8dcf363eea047ec59f396cd9fcf26f2ef6d69a6ab854efaae9a1ccde8e17387ca0333f94acc7e363d6a9bd5f4ede85fc467e5e888159b5dc6c9a51ca7bfdeb9ba2139ff020d67552d4317449b51c2ec37348c44e3880367574d6ce95db588ad0189a80756eda88ddda9a7d3c946b10d897ab8bb40d644117abeb0d68f71ea83000c5ad56175a24efd322e5e6b2a487c74a64eb45e4c93b919d65cee04f9bd385e5fff66f4e7fcee3aad08155ff791b805476dda44937c4a443a0a7f7cb5e98322c341d1f413c19b6075bb9118540beded53144f2cf9b8fa687540af66728fa9859a642bb9479b41f57912cb5e0046dc927319aff7f4f3665aee6a7bede9e0ab8baf2dfa868b465aef75f3ceb916d8fbd8189ee80158f8e5b358d2e8305d96a684ae9ca3dc1903b5e0a5be5ccd8ad0b9e61da304ad616af46073a781ed8d08060c1678f48941d67b3685a39ee7491 +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 28878249e2ac2b6263422993923a0c8bd05ce56e385ed13c943b03d226856947 +public_key = 09abaa56083953cdc1b6ec9a5035ef3c16859c2c91c00767510e6ad3ec36c42941aface3e4086b37f5373ddf9ef4d46d6179c948eac2738bcb765bbc58c8c0fd2d6a4f4df67ee6f537dc5202c5a7189f6745bf96b2983b839e49526ec920dce2590fda640549e5e7cbbe13ba52b762c6767c92a95679ed66631b57e256880ae56189b699691999fa294b71135a7547f02e8873d2653eacabba9e3d82a60de453b77da1cb42214deb85ae4848b94d693d9c6a39d35e7cbf083bce5e659c0b2f6274e853507ed21d1743bf66525aa7c62759c9ea95e55e139a9ddfdf6b0776d567a8f1e697b97ca60a8f555d0e97bae535a1efdebe0da7774550e928647d4d598d16a45ead810399cf38865ceb6cfed86f3ae9f55987fa37cce79aae89d30f8c3b90898f758366f7f591452c77ea7c3204ce47e69e304138568e2f57d0768986544717acd17b0560b31656745f6981c65858e842d913a9c23cda9aac9fa5ee6ea7cef8b0bc99ff863b404db2819ab2e9ad4cb353c7edbf409e495e617a410e638bcb47db2c887b8adab2b9f95e8faffbaadbed1496e0cc4748cb03ec88da477029ca131be52de9f3bd7796d11f8aec77d6c204ada1b37dc0149a7d3e8d8356a4f8c9cf917443ff0fdc0209657968dd82bb865abe8365ba3348bd81f43be7c4ffd64a54eb1a3a876c36d60e2fc37008f524e9b156145e93894de3dad9e4fa8ba75f4eb9ea94981ad38b257fb4da57d4c8b40ae5465a3a9c7169ccd31be3295546846a6bddfe3c333db5aa6eb1ecf578abfa8bac3542830d53717baae30a54536eb874ff78cefb73edf8cb73c9f72dd7552e48eda65cd5557dc199bab07cdc3294cd577d9acd9e9d63b536412ac7cdef3da1dcfb6e25dbcedd64f5509ae091555998a3e326fa69c78b502108e9f8a55deee77db49ff9b51d4981cf30dbb872cd77efe776a09be478532d4c6a339126e3bac2353d37cd94516d92aa59744934e12143f900a69f8caeb79ec56f047cbbfbd6bb2bad8f6f6d6d54d7fcbb758357e49b937590a129ed88caf6ca576ece4fdcaa1bcbff8533695aa487eff2b5749bc804fa7bb7938d5b4cb4f46d6ef7d1a36af87ece6f7ece347ee97830ec69cdaa91ee16ed3f0c81bdc695cd6939ae56be1178e8486f9ea555747c664b5f2eea9ad5e5938e438729916d45b8f0d3ad0e15e4619ca93a8a971e9433c9eaa73129fc760c5c5f4ff59f569dcdf39bba5ceb7269bd994e7ac0be521fcbb64013d5641e8e0f35bbfd0665023863e275c7d63e9a1087bb2f956d2dd3ade6c37aa09c36cd5aa9ed09b8999c4473665ae2b784197cc9268c57bfb78dfb054bd1278e044582cc3c81c547c50fe7bfc37dbf6aba9fc159a5863d45af3758a8d552c398ed7c2879dbcbdb79b5a5c34ddb5a48decd199e3319f51f9647598b737639d452a575f4ea7072ffa0ebb7b3de9d57350abbc27d7e26ddb68d73468afdac4c9b3242fb703ea6bb80cd64e599ce909f69a0d63a719879ac8c396d89f21babb2c5adb7d38ac5b7e984f33efc481a353ba6bd95039443658eeac6f5d4eddfb0ff509a3cf08afbc6016bb5d97f6dc74993ae3f9bb9a554c07ef09ddfde521b628d9c89c8fa687eb7464ac51820225b65b2af8489ed896d11825bc4df67f7002453d16875ce21ccf49b +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: 17fc65f7fbd7c75ceec421dee84dff5a8cb22764a182db17e0ebe857f54d60eb +public_key = 9734408c884e737af71a17a9a68f9a56e4ad6fe9d403ce8327f4b5b15fa5d72585ad276a532f8ea0794d4bee92363d46757d5176f76e909792b32b3f45f3c179464daa653c4885346b19f1f73afe197fe0542575e7abcc210bb7572c5ba97c475d8ba2810c54baff39897f5dd17967e9764514eea34e55a9e33bd5bd7ad30435f50a285fb43e351ba4470fbf380318c9c7a56ed0664c6a16af63db6dc2a7c1c4e5a901c89ff7a589c099568c9bbb058fb04205595c34fc66d99726ae7468684b2cee6b2757760c7fa57974549c44c17cdfaa029afc2d74b459cfbac3d34537cad95c34459b58aae4a4dfb3b68a74bf8aca34cb018b92f663f0bc4cd4008394e28fe5abeb505b4bcd37d473da43569d557eb35bd6eedaf2c1264db98ea6b37bbe9467899117b6033d4fdc7faaa60bbdbb1f8214cc87fba8dc1be3bcf9348bdb6fccfa69e329adec9b9851e909f68e2a5f510d53f92668910ceedf267c59ceaa7dc7f255f8c277d8535fe48db1d9b12cd97fde35c838eeff6b1c84e3dde9e77469350bcb9c3791af23fbf2ebc633f3c681e3801d0ba00b3d672e955d84a3dc412fe00c18b7a5a342d226341934d34bcd953dee5585aeed87cd68a0eefd3dc4cb2d8748eec4abedce85ff73e62f4e4e709cc3c5163de7c8de9e65dd4a0b90df2db2fca850e4cee338bc3b5c369d617afb64c764f89ef2abdb66871ed3371b773586463eb5e36689f872f36c546d3cd876c4aea446e99eefeb54e7e40fec94059f1d3c47585cd9b128c549e48f6346cc3fb6dad19cb9b65359f055d6d05f994f05f35baf4d69bddbc527ee0a59f733f7f6f00dfd2b956f9d6a6e7a95e9e2b9c4c90b8db6b5447a0b589cc7ecf0b74b8a9f72a966c0b0da3824035c70c334818bcdfa2632e7a47ae91e9661b96a6b5be7810a8840dcd5bb4addb2c6a60e1dcb3e7ca365576250a380fa4b956ded66e73add7739a4b4f3e7988b64270732ff94c319a368cf0b8d8018a2d31dbb37c695032a3b4db7ee26fff87ef34ed68b5711ca99af1cc6b83caba7eb91d20edfffa2dd9c5ed91e086487cc438e56e3459d5b7e954121948ab835efb0044e6ce8d75f28b70a77e32c8362b71b77299cf201feeb3013b6b2ec8b21e7a23a3cb9456567b4ad90fbe642a1693501db47f8c4829d86bb1ae7accdd77640cdb5e754ca5999a15456e5dcbeacda7749c1d89074be30a58f3600f3f2904c9599d3eb67c963c307987fabc4e58f910b57a56e34e7eaf978008c9fa49ed3c15ab1a91eb2b198a5b83deef767a26a758400469ce1beca84afdfbcbbc51c8697cc4b687d8ba41d4572565ea09e5cb23063f760dce5292c4ca9cc77f7ffe5d70c8f6e98b360cfec5e0993588c8f76775f92c575c023f70c167cddfc76df2ff61e84c1b506737a7448d00a6d07456fabc6f0d985607b3f526d276846cc739286e22cce4cae94543f2ef76805aedf36c4040cd89127e96383cef278e074f954249b859498a8ede3756637558916e3b16cfa90ff5ade0abc4d674a050369a596ac3e446cfd3e71600367f89c9251e33db95c508e09a64f683fe85fdc5ff73ebe5836ebec9e0ffea39d0facda0f75f5d9af9eab8c752df3bd9e806d255282846cb5fbcef030ee8e721d0566c29f469f5773938d679dbe17bfd7de66be5e +result: fail +ciphertext: +shared_secret: + +# Public key not reduced +entropy: fa0489f3730100609488e951e6aaa15c0f193bc1dbcfcd013bc418d6c507b176 +public_key = 60eec21f16c49f7bd2f255df4bce35a9eaa5e24a3e3f45da6a8fb5979a93130f85dac88e029f3060a795d35ec1feebe30828582c95ca744db2e9fed5cfd64f63e63f85a955dcc4b12b0482d0994df7ec61b9bd9aa5deb8ceb94b76aafae22d31d17cd5cada3a4d0350e8d970cc07e7953543a984cdb086c4269e5858d454880c97505bbb9ac7cfa64d55526689033c82424dde12dd928354e043c9e355dec0dcb4a86a0ff6c8ba5b290a7763add4ba336c897536610f667c99b88b53a4b08ab564733b5d2a3011f944b2259845dcb6ab8956836656e347df5a9ef03943b343389f2a98cdc96bc1a99664868db7fe837817ac4db32afd325a869a5da32d99446256cb3d8b91c159683bc8c1005ff87ca54530e84082bbafad485c0f179781a5da482fc9114485f6c4d3f386d678e3bbefda309adc41ca66fdbcb739654abc6dbd52178d7e30ee8fbb48597748dd8d0f82e37ec7f1f8c14694484b86f41a2bdcf49f8ad9f3f8357ab75ff9d99584e9defc8e0da3469e87f0a5f9edf7c4857ee5db8ade8ffaf6a046efc951ee78adec7a3d79dfa245f7d3d353d883e8580e8d7cd9d9d18ecab047dcfcc8bf8f5463a4fa8707aeabdf2c6a7fe8c834a4ccd8b6c869c6bf93d8d8a53f74620b30b00ffcbce53a7ff85145779cbb3fddacdeb597f4515c1664a374a64bee8885bd919668a70b47ee25dfac1a84af7de3b8508d4e115e77f6a9b914cb5dce45c678c886b4bf4e3649cb194c548fba4115ff78a56a4310a7cf1dbe6e8edcdb0fb8a2685b30631753b7f87eec8578684a67645ee9fe8cb334b67b7423d5aee8762639a212b9baac4d32654be5383f7eba5b6fed245d1773ee748532426c5a4f46467175f1dcd7ff4c34a38bc87a892650dffebf09a9ee4c175d0bbaebf6469277f75a291faacb88534c59ef4d3c884a4470f01b805e0ce70fce7f69bdb0eba9e088aad2477f32febf68848a5d6969c9151d775ff7e7ca1d3cffb9a2bc13b1bbcad1abc9fae303abfefc51af169d26df9316e7a12a5bca6827c25df567ef1cf0f13a6fd728a32f2f9f72c4fe7457dc89ded5bfcda12a28e0c4dfa3d84b89a8c9bf66cc305f1bdc3fb989c364edaf147d5c0f813e89d4cc18a5dbb6632af4a34ce4f008fd9ab4a88c1705958058bbd6f996fe7642a0b45b6913e7d0e658eb9fd94d6b8d568ff1230cecd349433ad4850b19a4f76e6685767e67ccf1333a9f667a6c432d87398b3332cd75cea9aea7ef9e424653d5e7a8676661383f34344e491726869eda4f98fe982f6fc4cf135b1553a0a94fb35e8ac23f29a921039bf31833f12ca8c50df121559e1ab5bc38df47a50782810dfa56cafe2f897b49ee8a76a9d8e6b8b15c63b5a88d580e0fb5f70749a554fc825adf56dbd0378bc0ea3bd33fbc9d45d535eddddf5579a687865702436d3065461a06c8b274561d938d9239da8c0bbc0cc746afbf53e58f3f8bd7b6becb5b1f8a5403fcb40efa5f6c34c4372d921b4e6aa769a6ea1ca15c765d0e53c70b0a719f7b47ff783b648deaf5a9cfe704c7d99830735ceb20fdda1e9e66b21d60bbad95027e5310b93ead78f5ba9998da2fae372d92349aa45acbd4781a98b25989e93d9c40698a2676b49fbdca7775f554d2448358e6a4bf5373892b712b63af3392fa95dea1a8 +result: fail +ciphertext: +shared_secret: + +# Public key is too short +entropy: e7aa41194214caa340115002a25d547f794ea33200dc8a9ee0fd033e181ac23a +public_key = d4c11aa4c8497e7240cdc5c240f1aa81f68c0f2264d5b3436bbcc75952067ec974c8b709273717a496b91288c802d433c824933f9c9cfc862b6b51c5111a1284a43bf6540406756f335ac7e7fc8ad25bc7d16868803c5e5cfc7fe22839b987629e49022ff91f074c7d5ea006bb95a38b806fb7805bf4621633e2a2cf9a0bec5817f2f716778acc26b22fe789bc4d9847513065e5f64527774e89cac530ab1488cb7761f58b03aa795a627d074a1bf3390dc958054a249c13e12bf7016dee169376c253f0b1a42e15b4bfc0355a0641032492dda19f69348c8bdb450ba670b66537e1ea83612ba790174c5a873a185c0f165b0a522270e023854cd5b664028ec7d7c67750adf7097175833796d53c3aaac403f86425060363754013a9b47586a982347525d318a2361fb25773977262f475a495e56821d0206b89170441a2666798fc3678202cc8c7c54b3102260e70a1c6e38e4485847335be02452626d13c12270490e33d6b7145d426666b0a635b9a7df78927e8b5c89d7bbd7e4b535b6822e6a2781cccb30dec75c701bd4e25c320181dc7d674f4d9720a736d9f526cea78c11ec03ecfb34b52325732cc9a8ee0cd927b5c8c0c6e07e41742e5461fc051489b5b48 +result: fail +ciphertext: +shared_secret: + +# Public key is too short +entropy: 7e2a93bb6dda4ddb1003e9a868447d77a5ea223ab645f9f6d4dffbbefa5c8a0d +public_key = 33b69e9cb3ed32615a6a1ecbe136a0b819237c5c8be57374c1c37a495ed60c685e9a02f4f9c0c6b9ced6d91d7bf3cb9e72a43733b5842385113855de971e6c2a5dbc402fbc2abdb7e2a147c0b891b721674a11860a3584c2a5d31859d9b56cda92235d04505731c77ab516192918a5b53313b813dbbcacfdd8233517477d1033f1389779920512010fd16533be2a7b883394d791cf03c02ef7309e560b29bb497e0853a216b5414752936046575a1132f9f7a11f561c58a3481a00c5497502dbe23f4005031e598d8cd182a6a78e43d17c5665985ba99ab6a3a71c6bb536379ca5f88d3623ca06da41aaca48fb489ea80216f434c5 +result: fail +ciphertext: +shared_secret: + +# Public key is too short +entropy: 76bed69c7b1f6011885373da211145cb9264b5a50134a51354c2a8f5be06db37 +public_key = 2088bcb70f56a579211cc75084c54ff884ee0cb3ff679e784b239b91a121739e0ba4821c42460acc5bac137d1fa8cd5521500922c104731ab01b9268c1309ce81d7adc04b1f12ec8f0c4a284668c8351edb876bdd802bae164551634c4835a89e7004b814988a213b495a668a6cc8a28b0430000ed812891524809841b537937f12174c541486cb92f5be351bea5adf4f0c54a04080a40781f93cc73714d4dda8cfa3a58b6474b22ca304a015d5b946f5dab0e78964a07e13e6331b65de1ca8da7cc175a5dcb3b998d2b2e +result: fail +ciphertext: +shared_secret: + +# Public key is too short +entropy: 6d1edc7be0c8f9ff8b1ca62eca9cc77d6337066c91b9ac04766c9cc833e03ba9 +public_key = 20c186225f86b2c9c4f1ab664c45957985c32c49729c7491192e20c88e49f96d0ad4a9fe2641d590a5265c92e92c6c7a784b98033cd3254423253f5579b31632a82b681ba720158fb03ac5257a406986e2ca8c16f4bbe2c3c220f43d13a2972f1594d2fc0b88638e78aa8db21a574bb6c4ef9c2945b67bcf5888811c32453a8f737189eb14842fcc9e5ee0b1e6fbbeda737b103bb49f916a4e7c37465c49b4314c73e2b75d05c5978352b06381737c79a7a4869f093b5fd2b409b11cb928a43a39bb53aabd086b4ac160be9df5ba +result: fail +ciphertext: +shared_secret: + +# Public key is too short +entropy: 7625b3ef9c0efebbad28dc6b15aca34bfdc4f2b93e8ecbac8a432061452dc364 +public_key = 4c1ea03459c96859b685b456b6718401df8b6fed775b68715135fb5236b75ebc8363834cc31ab42933c929cb6b962b14ce2df1ab1b653ae5205aabbb6069f8b0b5c208de9457f20bc854461201bc63cd803cadf8a937811ce122270b6b39ffc2aa0f274fb3b361c77c2ea6f634ae4ba66ba3a36f6881117b3401e81bc6c61d22175700734ab8d341039631dad5307114468bd1324298bbb7428470ba29d96ca69ab0a724b53597b502d1253139cb3a7ca94b8ab1b30435927d823d5298652123c9104b1ac60802b3168ee9a1ad3f296a9dc0483e684514ccca5d67a5469897c81a8f20113dc73c0b465c3199b096c739b42857479e77cc744728a9f9b9b7b00c4fb55c14ea439af31d49031f7e44af843a9796a33c0a2b14b1f77da2554a203584f022982dc0c1195c5df5b774ab1bb35bab0153b56d1130538bc30074dc2f07e294974018eca8352bd25891701fdb7748d0411ca36c4fe8645a253195558a20fe985a5962b5e86c07b539155bd8a4d713587ae4 +result: fail +ciphertext: +shared_secret: + +# Public key is too short +entropy: d1f36787c6e759092521de965f09bda02bd60d990b3fb221b236c60c57264c12 +public_key = 08a8125882d12795a94642cb1c8e775946839f835c686a2903450bb18c43209b585ef60839c87616e5b3b110e4444dd4711600275f2660a51a5e514626c068a902a18396a44455f2ca7ad49df90a794c50871e293486ca7be607229ffbb593a86b1e69363e6382e367c1379658110621a820a52c1025c63c1464b7104d6534ff3c0c1c5a15799a733de0c802679bba8a7027f337481229bd472e0d591d9ed27bd10944a57b9f87b0759c909a68c85dbe44c9d378782424b930cab6af3c8a101c19bb873108f87ae7145efa2b82a18217bfcb873a820a41a1ab174146f8c44034864ef0564e7a7c8dbac90c98651f +result: fail +ciphertext: +shared_secret: + +# Public key is too short +entropy: e38e66918ad06c6b64df3eb7c2c64e39f23db5ac2c81539e42bb983459df95e0 +public_key = 7bc2c53f9f99ad67bb63845065fcc6c51db00147e419b2f468482060b498c0e4e4bc8fdbb430a76f6ebc8e65db7dd8954c54e01b975ac26e4b570a2cbc538b558336b881f47394120826a33cb1a7ca2d870c28876b5c718081d61444d00a43804977d9b1a5cca1d92858a005032bd79bf5f6b278026588253fdbc2712849159f3862ab91606e098566d73456490507021e6d1abe4c6675ee3a37bc4567aa24a35489c7abb2659a3a2657988ab7d17bec601ef25246dc196629173dab0b1b006591466558213b71fc41c1eb72bff4686a210181c59b8df75acdb78b891cca2c09c1b6c8557527b18e4db722ef1acbf4378782114f7bc218ff9337f27171c4c99bd8939c60b13468dbb9782590202067be48215541b64ada97e30bc8ad1656302c4cc8ba9a6963469ba532d6f51b46ac92d3e44a96aaabf2f661ff04a171f518a8d0a73094b24c00cf02cc3e8d8796c5287310b818c58a8c8fa4cbf0d9645b93a41005b75c4c7e1cba687627cc1c39b7297a07d0ca2ca8c624a93c0d632510ff12b0c04bbd15a4ca303bb1702278f06ccd0d82a12c90684642a83b2289afc5159a3c3aae2a6f5a9902b2da9ce37200fa995d4f45a2cd76a0f727c7 +result: fail +ciphertext: +shared_secret: + +# Public key is too short +entropy: 2ab0bfab14e3287e1512f002927672c6229b6adbf1c8f31b72ee90dc4f96a584 +public_key = 8cf433e5048465359fd4d279ca333837969417ac794204bb3a3aa7cb512b5233758d803032bc6f9d01acb879946bb0a4fae73f19e9b999f6910f724415411e6dc3a97058957ba2091ae87886695801d60144463acb555e63d4975c6ca215b1cc4fd36e2796354bf33a1be40f2e8908f3014b5e881042623bd874617945 +result: fail +ciphertext: +shared_secret: + +# Public key is too short +entropy: 548c87eda498c4033938de91e98c50e3f370a74abbc9fa15571e7a3e091c541e +public_key = cab8796dd84b4e58c0256929056e203e73d4017c740ef9478a9d64c13166ba596a65931ab9160977de95aceef11888f297bf738a128375ef672a15dac1e2a5ce20 +result: fail +ciphertext: +shared_secret: + +# Public key is too short +entropy: 48db851ec75fb465cf42c6822abd73405a1d5ccb6b37227aecfba9b8a25369b3 +public_key = 8102a8b977eb37529ee13b8c21a1b2394e1a74ceb8f6a0915683a3e2b394ec40fbb31b90675115c2191bc559154317677a205892ce60536f11cc235c3078d0841824ec93a7c3cc69d7ca9d19c11117092f57b8dc1b58b003ba93760bc1811035219acf6117dd196a4e697e30d119cd3981fa57590e81be1237b004bb0025b6c1f636104e294362b352b66b3b27f9bc0fa07d53c170724bc94d2b506c8ca6ec41bced435606eb096bea66c4226e13474dabe981b54230a451ba466abc3557bee3369602dc5c98503485e3a6fb3a7ab659cc0c73ab75aaa4369c67166718438b31f58267e6cc72bf064f345446c155823190b93cb13d23f41e7f6abb616b6f2ec2416bd80695642b07b28c24b9140dbb04e4bc789a95393ee68082a185a53aaffc7c30e458a50a531aeb01beeee78ed1392418d183c6e9a425fa01e0894506cc533e05cd0725b768db2df3a6799c42ccce913f53001be7177679aa308029a8194874b1bba2eb5a910b570e1dfc9be4e80c41e345edc554af1582a3274dccd6ce02c26a75d6ccc27347d4f839b0f246cb685663e9b6a3916c0c18c7aa67855e87371d567c9a0020c6330166e2cfb38889ca2367cae229ee3bb0c1b56ba7536ba8fccd316544ae77a38d811c0c42404d451a23e15fe645777f464cf0a6929f089cd43920bf27cd266289550b8ffadb23b297252c47398979b4107bc9dd7cc8b6a48bff968d49fb4514e5880ee638da57a626dc8d5d3340d6152398656bd2393429707a7f697126aaac06944678e90bf19392a6c943853625e5c988c6c6add71a7c9255336239bcdaca21953a8519c60eb91745a8968dd6f0cd4dec3893fac2fcf05402c958935846a3c743080c6dccf642efe351f2b3059c80babadb45da670f89d37b72b26030867875ebb042887d4ef223c32599908c8990714bcc007fce3088d193cf50b52205e64b5530b299507405a46397470711229095f05a59111c8e8a49d9574b30161b6fda839e035a4960c05ba0824b9a4a626ba3f6e6af03d95cc716864cbb07efc35bd5b9bbf4e5b1a957c19de0237807c40f2cb2337a4e1e1238187a502c7268a7f7a0eeb8a97203caffb3a179f6b6c81c05038023bd5081543a36832761040928fdb7b0beda6314562e79e264d6307be1ac8d1e26c294d790efb3790460a064f560b51916bcb89e21a735cccb1345b19cb16b770c4ba66aa65f4d1bc6752c1fbfe768daab22c902b212fb659c851c60c9078a96103a79513f13425ba08ce3461bd24721435815f190b0c9 +result: fail +ciphertext: +shared_secret: + +# Public key is too long +entropy: b8ee47bdbafd6beed55b1e018c6675c0e91912f727baa6e2588b2506b92da3b8 +public_key = 06879e2edc6ce28490fabcaa8313a371094fd39b2c7fab91bdec8dc5f81dc50b198f84ab451069ab0cabae0b12dea213cdd30b05b30a850b2c6ed39aecc69f7204cc05a58cc09c7b0c0a01994182dfc97cd1e360faa931f5553542ca2727ac7ceae3cad00aadc9bb0e273bc2b57095bb7c81949b3d2c598519e1270ba50756e72528f7621e2491a088c3ecf79e2c03237eacb36cbc6e7990a3891226b8d138bcb7b355e747c0b7b0cf0297e85032ee2821fe2c0163623e4eb800cdf3ac6f1567392868aba8960c10539e2a268ff9bb05c39bfd97a43749a19c0b2f5ba7b98e89ccd8c9bc05b120cfabb6ccd17465562aac81baf144b7bc75650d0cca1b113699b448911b47891c918fbb32ec19908fbaa0c84477a6c52ee334925823648a83196f9b2628d0c41f126196045b950c0c721a6c431c8417f1a8d6a4a7ca999218f02c24ea8fbad27bab04041a76cb5d515f12d72adda2150eebb15b97a5be8b42969a3c98f6274f43748e629ab4e1ac238663002d743e4b95d9428d29b2bfa644250ee686c7fc7917a153845a98035550f5744422ba1623761729aa8ad3482504011aeab4bd029a05f73a9c743716ae18a66c3a4d5c67a1e37cbb7aa49bd49c6c750b9f36a83860b92bae9b407f9a723c4483db33baa1390dbf706b841850ac371a60184d7f186bf32b7f2d086da4d88cbb66618991c31daaae027a1e20a183a3359455b71de4a02ae174ce2cf649990a669bd54b41ca11a82336257927b776b6ef73929ed0172e4749a587bf4473950dc477009d66b093984ee26bdb820ce0441a2c52b0ddfc4d65011fd0e90bb8f30fc47b0251675191b8bef1147bde794fbdc0155bc71e5d138f8af25200387d2c400cd9519ae21b9751911af9e835b0d13f5d96736b39b99c08bf9ef0a3c821590167a525d34534a692f0aa6aa511503c299cf3985e281aa90d355b48c7011f4a37bfdba2d45c46606391039c249f365e21dccd49b08f2c870a7b42bbf6230ec2b33a789b33abb784294b68f074253357cbd1c8399dd5ab1151a885c182aa83649e911e39132dade3691fac7d5494b5dc49bd7cd225601399ab757f63499aca48a83de70ed9e7c36e202b4d632c53d490c14122ceb850cca005f01ab62cf7b2bb20baabfc2cebf21076d554637c4375d42355991d2df61a78191d6ba41fb1ba5f16338944f96927c7a8a0a6c1b885aedc9c6498b923e25354c06841a37124071602ffd9b95e01c27f9717a4e5c1e1f8a9e7f5199106989161015029cf07e61a4b768de733a7a80c07e7c7344cc021d81a2aa4b827c1612544e538a9b2cd31b80fdeea740822adb51152fd838c53bb3b82a0296a51151014c70db01bd46550d061753f32c019951d033122b10684674285a650041851381d090075db9ecdf09be45487ae062f5ae7405a62b1ad26c79eb1a7029ab91041afbb16ccb43244f2818d62d16787a640783932204496430751688876f99c087b4a2c70a144c2054e5013737117918b1c20b6d260c392146f347642898e9f035a4f516cab2219c0e38c25a13ff5e70d17c6267d853f28f8a05cfc393c1252df051183d266a5a291618bb889bb8f5080b5eecc1bbbe67f7585c430311007518ea5e7538f2090eb3edf24bb2a6867e2936ae41055fd850b5b0e29b6efcecfb1b97069ba3e6603ba2de033 +result: fail +ciphertext: +shared_secret: + +# Public key is too long +entropy: 1275309a0e52464d441f3cabcbe2b27fbbd8bbb981a87b526174a834aa52af00 +public_key = 6133a7a3739ed37b28c7430d0353c631b9a4e5a4b491716c437264dfeabd9f812750113409e8632e78bb83834cf91cc1412a76e303b963a78b55931f70b8b4eff1171e9c2d45eba71cea8abf96b32393a9d1cbc822fb225249a4f66c6e8432bfcd1272892792278675aec8b6b3d35e79351b4dba8f68e76e74186c16087d224165982a34b0551f12601fa7b8cd52957ca9a9b1bd013323f219385628f1c57a07fa13aa10054149142447accc94167909c32e02284480a447a4c6b5f30a1aac029c324c47d7ce8268abc76016a804cd50ea6d6c529cf984b80074226e1b9a24394541b2078e780df4558cf4c68653982290f9bb52820c26400ebd7803c2f99d9f7354aa8b38dce3092eb21d386c010181a93cf6becd05b27433cce5f7bd38626e482a493fda7ce239a7f0c28266fc9e761ac6a1a11e1389a78a23a7a7db1850f69786312b08c71064ea0493e6138e38af68687a28b27b8cb2b259d81e66252b7bec2cf9f47a36a517946b709b9a002494228721035b2cae6580c35c7381a331b679e1aef735b35ec8163a9124245036247c525301627038b069909a1f300b4c8cb255aa0d4d9a93965c120c5aa059345eae8661a1a58b8943bfdafab5cd451a5ae80347179141498a5a63224379a91c156ccd1a7fbab54709ec2f9f911a23fb7369609415ab1c760567a1a45359a71ac742b8de20138428984a830b26261ab918197f8a8ab3f6aba350287d6921953c0170d90a58e0a7f13c216cc1c96725211c7a97da6bc95ca86193abc724c5c05ba22bee16c490796daf428191a9b1655536f43ba13b36ada1ea1bb2d0591848088e5b77019a6086908361216d2b897b08e03a03d6a6feb7b0d7428e2cfb49a322a98a177f9db99f835214bfdbcb9b0718d67425cb200ebe4a4fdc545b02b052d7f5cc44595c3c007f4fa857875318308a440ed517515673d6e0c0eca43bf880a38b3819a6d671dc8b2dbd528c01e26a762006827ca969518b70362b20f9af3fc0b70323a840395e32ecb31f4bb018b478cf4c502f5924bfa76e899267eceb62ce06bf15cc26f596382374b34c7c99cd062ada8790428078bcfc9fa0e006b5fc205c53116e54ac23d79ed88781eaba02936b21f0e2c5f9177b7bb45cda2b73a5f65d8225b26e85ad8f27639c81a55fd6b663b346a5b26e8b218318a93c59bccdfe55b6047c06f05900d8b0648f900bf0c8c8794c26b21071a4c657ba2c7ab569291ae9910a064493340e75b4acbef1924d2a1d79d5489ba92b47021f80766967fb74d9fc7e11050774685d3424c9fc203eb11a160486307d6a71f3c3ad906915881820ef8bbe54e28ac1993f5840504f6887ef258e247453667522dddc200d80aa8471a40a9b18a50290e55a98f116c818c67379da3c6736471f704569e06e1c090a9b3473976c830d37b369884daef235698a853abc40351198a14b1e839654de289eb3477dd8367133a76df9977c39338d0670b9ead96bcc34027ed0aeb122890476848a41542997570b99bd1d62c8cc4b486b85acb2b81fa1709700aca0574a6c9ed10755c5b72ea7adead97095a36e4e3a6e82d58b42061a5725881f77b431c62c37974c69c057a398c60af253075a4f8344108db3439a32e17665673eb485ff315a8354b88eecefeae74bf9d865601ffa88a8c392ad4e83d10ba209b1e048d45cb12cf0dd3d4fb34beef58f44164693 +result: fail +ciphertext: +shared_secret: + +# Public key is too long +entropy: 7a7bb5b36c93d5c628d54563f043e40c1207bc6ac593fb52888dfca29203b166 +public_key = 0249195f4553510460a1dc663eb86c390529891ac894f2919a27bb2e909706eb154b965df0d4ab7d1aaff8386a0ef7b068da03d87b5d6d497cb4f5617c31ac3517a86056339b8220ac5b7e455b7b3b29a37e62b94f8043312c12215c3f16da95fe9c05baf74c688c6aeab42ba7039b5b3900037a155a0817d9dbb9707c1fec18b9498bbb7aa29bed265aecf76791830c2d4b7c6bb71164c99f33e797f0a5ce76d39470129ad172c40f635d9e164151627941f3ce4731cd14f5083cc2069c7b6e93312728a306a54c5c46a276bed002c0d66b4d7838dc351346e3cf01759655530a39982cb5406fe6f9184ca861947316ba0433f2f9701f9cca5a1c1500b42a35742d05e87dd7f05ef7382cbefa2b28220aab89cb1ab35f705258610b021064967e77b7e0737836c2235dd6c8bd3997620b621925632dec05fe9781550457c7aa9ba4949ae6566d0fe94dd69592900922207ca6862c60a24469349c00e4a607244b86d0b69d709755a4d170fc3330d873285d2bca1eb608cfa0cb4f9a772517b50e1a7057a9a473d4b0ce49704a30b71f0560ae805421337de6caa43c8617e6802d42956773ab661286c04152109be906a8606af29ac1e7532ea3a92b595c591b9358b4f13ff818b6096b608c504376341a5c041b45851a2d946f33fb9a668131b7a3804b851a82d4654e1c11fc61021c4b8b4a9521689ac105971eb16217ea8c8de696679e18c63f02cdb9b5ceb1f0c9c5fcb8971533de13a966e46894cbb5efa42bdc3c182c8a56bc5509b2dc465ac4486737ad7517742b50bb3ea7c52ae4129b8a2fb471375b8491a7fc0129177f2cf6616ed6223d6c3f39320e4e3812f4db1277fca6b3582a28c547d0013900bc34ce291a14f99fe1374f01474c1750908a211f648913efdb1dc940548ba20508bb9bb0c996ea3276c101634440102efb0f67e55943d60540c2680cd542ba48cb1ddc025af436381c833c67c5b1a23910965363a919c9f7ac54094c6d4225d35641b257091b820f7f7523d9f61561b428f5a08efca65d53bc9a9edc058cacabd9095ac3c6c31b966e00e06161c104a204a340e62d4a483e15a415a9c473ca668a4ef0238e3bc163c94c3a762a9ee157a3dab8091081ed8a950d3a765a0a574928544ac6093c91437c6a72778c4181da845c24ad3034405069ac66da4004a55433a259fb037eb401989de1caca59b2d537653e575f9b6592eb954704ac67eb38410de85268b56aae2ace90a0734279489efb2dd8c75ddb855227246f1e18645950b55caccd8ee771b1c88ade57837d8cbdb01a6d6973c8aa19b2ab8492f7d90bb31cc5d64b131b425084473a1999bcab9ac051544eb7922ff5831c10d137346bb5e0f7056d6120af473bcd794f1f18499bf727c5b673db454a2e02b814d67a76b56e04c434b8f2bbd8178a1821b0f57331265a21125c8eee61c4b5107a48fc991651442cf09799052549080f9bb36b3032c749a65431fb304ff9baf62318914276fea569bdfacac2a85f94d3b8448a0741e2c3263c577419cec33c5a61eb8fd033a4d471caf9651cb6964171d5599d8891b8015c1523b38884c4ef463aada8993d45be748b77f7006413e81a67d360f9860f7a0daf18e140b15ecbbea24330eb9b2a53372e9c57b72364d0bbd49b7b52485fca6805a23266c3e3e99466e04be1526abd7ad99459f2b5bb8d8f +result: fail +ciphertext: +shared_secret: + +# Public key is too long +entropy: 7cd774275c35da9c0788b0315ee68b8c6c5476ff2b1ab1b8b6db794518e080c2 +public_key = 9d591f3d4778256a2d6a6756a30b00a3f206aa437d9dca1208c3ca86170f9eda44ff39b2e9a23742582745a863e350cd1e0cc071f453dd021526a90db5c86c2aeb33c3a7a851233f3f5b2a8235c932db3c4e322b3d054735426790403c5cb76603f367c66828de16723a20932d156a0809410c982bcd442deb00900e5b3964b3534603877bb5b1d1733c5ef82f90999838b8abf4e466c7c17d4447c275db39c7249778053da302bd4d05aa9a2c5c1e6882e03037809a49aa7119c60079482bb038116f3a26b19bb64aebeac4e6ea8e7bb4cb6717ad13a851b839a193393de68408b903c7da0c76882530d4d12b95bb4b74dc84152a6c4f1c54560110d2e903b5f0c735409a6e2a09f338850094c4b6446fcddba937b8a0d9dc6337553276aa7495ea956b6a2333f0150817bae121b2b4046cf0551db6988fcaea9d3eec16df98412848871b502781b102cf6a2dd3c44ad9d9b7bedb0d5aeb534a08c57348b5fe455ce6c9308caa5788cc70c64064a8e11009a7284ed87d0ce05fcc372a4ee02d7b723bcca8b5d8fa2091e98905c4cf06f582dfeb20da51ab539053c2f38f08824399753cd1c7956ad74f358298aae3984a7b6a324a492f46445c838c609244674850d65c36c30752fa2412a34b2dcf3743b4ca6d48a9919f9c107aea050a8006f3d6967d22a59eebc178c279247898dff6be9473865268a769230bc30004a31937aa6504203a9336e119da3394e980afc1b91e3012324a1940ce998f1491542db032a6626660b194eeb0ad4850b3a23437a8354e4394262ac5cdb3529a9aecbe160627beda6791f62efc6532b2b027d4cc16875b90bf6728460550d16214a85ac0d327927ba17e2de6a06b4814fc67150c0249bf778da1d897fd872971c6ce17b0b75e222ca5b9103bfa1ca7ac5498fa877e611608f5a7fd7c4ef9c53a6ac66192530d3ccbb433e07f5e02b70ef22cd9452a03a7bb660692e13674c1700a9ee50f22049717a4135e739702f244c43279569a492194710c4c6ce96a2f40a6b2e3c1a50e28910cd37780158a42c34a92d167d012b7e9154d6debb5850381a8c43ec409bf519324cd21c6366411adac5e0b9c869fc9cbaa335292c8293af801bc47bcd4f68649d7647ba148ab86986e71705587c5ff909d59414b9ed1a9f493b26c0c62e7c93acbc1af1d3b81c4a570d0c16f788026d96a96a0832c881793f0f66c4bc657f7126874701794643230c41396d70638eac8966a32af4a673d1a050554173130aeaa3938e23ca73bbb5d666bb0b2089e6d89743703069c58b9bc55916e1ca9e171c9ca9c7457e2b6d94bbc181565617441680c5a52e87d2493aeb8ca7a322081d3ea008e8312e0756fb18239fa45c26b86132525c6ce91734e2404d3c4ac3326539455641820c388493c92b67fe82b29a7a53aa1d4421586542b836c68b67ee7468bd2c99292f29695d2414be02cfd59c4304c0f433a216b18a115cc68813a0c5bcc773f83956384b1ab420e83733094b0aa00c3bdf3222da0d7668da29be24c647dfc10c602ca72b12ef86311666ca84c49452e4ba7e80c0940e16fa90a333269614c5bc9b6073f0054b143c111d78b1c67e3c27df57642b9bf8fa71281f8adad7ae6897056fde7b4a293eb6f7a73f90b95c5fa09dc9f16a4df6b10711b3affde567268578fcc1c212e31b672924cb5ca045b91a67fe479c3f74a48 +result: fail +ciphertext: +shared_secret: + +# Public key is too long +entropy: 0e057f85c9ab97358b132d71fe786ce1dc78a7a2adca7c5a550a30e762f00f26 +public_key = 16d56479e9a68a1a0ad0174566816be48862213262d16905bb46763cd311058626f1ab9250d97a1eac2bfeab5763b0121f284e71427895c1b999a442067a9f83846eeeb358aa8126e7254847dc7733e39549d61627b97e5c8a661d879c7efa659f22ba6071223dc02b22106c1653573eb71d7116b26755110d399f7cf82c8392cba9a8718e2220512654ea49526911beb6709fd011abc6215583eb0bd912c31bb09ca6b838459c9b4981ab87814db1c14724322a5e431b70c3477ad3bdb7ab044aa43a2b128d4b8bafb45627ff29414d422613734560b15b549751fb2634b36790468990baa49226c33ee501b0791105c9a9510a45c9d305ac86da0892859be57263b3952fdb557a35738869bb7de9697122a7953128b9a1eb0c6e53c9f9cc8730388716f10b0e311a45634c6dd64e5f26abe1898ba72c65f266ac839830339b173ceccf7cd80b8e14141d892eeae64b3bd31495e83534c646ede834fe290bf282cfe71c97b7670c882c9fd26016a6c7a9702b9c8d80450c76502e105484c15c0346a92acb72c32c7614a00903a9b4f736c29da10f99368dd4c12bb14137056b28a4c475f842b66e82cb3e74bb5766ad5a11586d60255ac0b942e1239a709d05b6ac2dd1aa23ba4d93e6bd42e76b7dc8b8c06561e100b44d511ffdb57cbd9b57b34149b310060a1c244ef89749f19d909bb7697241c627b0ea9280688766a1775329eb8d6d4a40cc117b01e7ca68f89d4bb8025de84b0d933c939c9e8c908c3080367d63befa940b7dd1407ad76077f81c1b8224908527be0ba0ce12b864a68dbb8b83a41989c5fab75520c2cb39974af369bfc22fa0520c8de2c6cc322a02e31eab0a3220651f990b12f49a057406861737ad29595052cc971cec333a94abcc3a3bece143bd046db5741e88b0424600506419b84d5b9de1767d50505c71a6518406a0b5fc263f4bb6f5d135d0409f952aac6c262dbf90bc77c419666726074430fab11564f959dffb84d58735cccb9d0dc6c0946c781e19be3c42abdab33c370a2b13e293d716542429b4fe773cd1d12e631140e3b89f060bb2137cc8a1e1a4bc459943fa70bf17612f3ab85023247989098af79662734b9a29a878b6ad8c72214e8c00671c2f9314742d15b8c8866d07cb79c7f842b47b8a347cac63f595bc8848b9687e70170cac286d0a307927e3c8f5574ec23676e4c0b705c3753cd0239d11581c2283cd22a8f0cb8cf8a3ca09740decc3531da09e93e71b0b9bc5c08415a583524f896735235c988a3ddd9323a5fb8d16c30228647380945c3de6a5d6abb77a63cba74a068367928c83b98e6a8ad304c04ed7c162443e5afc0868b523611b0a0f418cebc78568c921a3b172a6a12ecc7c16be0c75c315ba8429c86f152ce36160ef64a7ba75c47abb2d86f12929f94bf5f6bdb63072424a3283d6a3620ba4312c4e84511d0858a07c3380dc7b779389ca12bb9fcca256957056370420dd5788ce3a93ff672bf3302d70f3b8aa12c15b4ba6c3bc80c592a486d036d988bb1c3979ba576e6aa3cd10d719e59c9c591c7bffd63f2c870cb4491079eb594a90ca391b0a1ca4198a8464afa54e072664e60c20fccbb2f6b2378f9a10c6788f0c7e905553f6f4a5836dd5b912ef52d7d6fc274bd7b8d153d989e912e291067d844dd81c844f8d40b644b1 +result: fail +ciphertext: +shared_secret: + +# Public key is too long +entropy: 33c3399bfb3e20debf852c6ad6b90f4e7ef474319d55001486fd78757c5e050c +public_key = 391597a0eb1a2ed147f5b9c04bb99df3130cb98cafaba657ed0b514fc182d312a484f65a25da9016130074851a929a783ca027e3aa09765aa3d6468d0324816cb1c50f6198f38b1d2f237b289950fdf3b74adb4665fc887d65af52b56febe2521aebb155876d96a7591a0cc5cc5ba10e46340243795ce892dcd62e992a22d2491ba24274210c213a69187203cc649040be780d335814094224f075c3bf5578f5daa69d57c6df669a815284b22872dc763643d806a622a450c90440f4259c94cade9680d749a1d22510a11710e2233a172a2f3a577bd8702f3a7b226bcc1db11b975b5925b1472021091584f469cb490257358b5502b3a3e1c3fa521811e845ed860e9e437cdb775be15659a0eb43422b87d7611e6b0327c0ac5df4a2235c1c405c393c597120d6d50ef9f98f99d08cd58599ce3bcf4d6668270a5bac0c28709825c708b73df2929ffa09ffaac121a7ba279429410611209478013b429df9bfbc81753053c8ddca3588c4a84a54a4816b25e2a0a82648867610627d555aa3f21f8fb1b1ddf5af17282bd9354e7e687029ab44883182794b16db835d07262d36cba9b72a5f1dd31efb401a08f56cff339a6c031dd560b2e71c84d7616709da039b88a084fc2efdec335c45873d4a6d287b0c730164faa364f42ca513d39cbb6c0df5e058ac2030c98661420295bd9a83868a53b448455f77366737b67223028f49a13c328b1277b1e18cbbeff6432d920ac173cb5151b06f9882b795c6c859651030b610085baeac16b69baf036c15cad55262638822b7bf5bd16f4e0b663c7b36812591d20b4ca49c9d93924564e96343e99c768c139b10bfe8d311db19ba1030015236164eb5868c18cc71066a0a774335c907784cb9682779c54792b85a9d87c5b766e8735d4152898a45b3d6c55060c16ae6388db06172118eb0acc4d366a429550d8339a0c5c93b74560e29a5bd7b13775d0b75403c75b742642ec62392d0ab2274b60d9148db9c8c5c3423f7b0a1e3037c0ed19110062ee20836bc4406cbe99ff3346c501915dc893b921b55f4fbbf78724ad293ad559a2d24c895df028899982772b0c54fa00d2fb27d5f463a6a5c00fcd6b1545989ac1a76f0f373e4626d8c1972677241e015b7582897a271959ba97c4cac24de2a2ef3b3b1f982b0d414a009ab63df56cb468569260b85a89522d3f61df523b9544cc54565176f0984e80b07873c101c016b407c4b418c1ce6b638516325f175b35eec3c45f59e98754446b366813c3df442aec3a9304eb1cb75224e20a3aea9e9b7a6c76f3d735731c8690e680e150c935ffb88c40b39eca12cdb0245b7d78dea01402a975e703b4a9a18329988b5472481f0130c74981cd83447373897e6a15f7b3c66f7d0c168994d875bb97eb14e0dbb2462337ab574979e1c8fb2f7036a8008eca86055a1494db59742941642aaa630c4321b558f27f05f9b36029f989d6bb1750f4b8a182480150b862437bbb9194d05122dad65362193777534732ed081cb3a8fa4271b3948c69b402532565fd90b53b228cfb7b34936d433eb21959599b0ce8146d1144df0fa8c96627e521357a029521d521fa5fcb998a2856c60ab2141c394ab345d0b8cb26be4dba496a90828dc4231b2c2524ab9324b9cffc5bc7206a7dab501e8c5863c90e668d12d9d11315ce1463ea54ce4f66b +result: fail +ciphertext: +shared_secret: + +# Public key is too long +entropy: 110a8285f4ccb5846782dc61382e517048cefbf2ddfee70d94e4872f8fbaebfa +public_key = 981770eb3972007d79e963813b75933657616f188bc9ec355e535f6952848195873440522da28ed917a955228456cb5b334c3d82534c5d87883ac6315bb61b45f743dc6078c1f35d9fc4049790cb5628cf7fa42a8fa3aab2754213a5390a8c1967c89b4c540c1b6b45830209483189d66b08820545ab692087701dd77c949c750fc24b111db609fc673fe95605928980f9eb59af66716c18013ef27af34614ab690cc4706432e4b1dbdb96bd5a8b6931c4069175c9282107d806c311839418ba5eb188564c936f686a40197b4057374304244d48798d0765d0b4ce81e31382e31f427239ff5a78701895a21109638834ca050e278829c34099204115d681300f3563e2a21ad5d467f4022efaf50aecf14d5da1a109b19079c90dc9978938fcb7aa72bcdff169c37c16e50a57be973535c203d8141f1e84ac3ca7bb38b31135e28c8028c90be23b3d428bc4603b2117589f039de437a51eab94b568781da5394457094ee7c32952383f113485d3278af69b899942a666a0009d16ac7ba16ba212a9e02d8957a5859a6f27ecaaaa503a61a6c2cb447d226134e9bb951155625045c7930380e1b44120398b50861dd6822b45b28031b5906560bd6391535260b9b3e7b41a17a41ea8cc68d90177863aef795645a9899adc9eeeb83b8cf16305fbc97b44c5277b880c820ba259835490b733f9773d631508cc2706d43bbdc26988552fe72c47d6532253b400c4f20ba280ad01866451a5359844967fb56f1b434647dc3ae3593c96a84395f2c8d42358a5c1c827e0c69cd74a5f1abc7fd08693d39bbddbbf1df61cd012bcf4b5a99c5a5a5b654aaab48157124730e0be51442684948c7069cc0301606d2899eeb2ab301b97c588cbcd211669093a23b07518c129c41c95a5823db7a03b1d3c8ae85a409f786a7554990dc8cacb74b627c5b10d78400b8c021d192fdcf64095a41877cb81d2725166dc436160296b484278dcb8ac08cdacf54f450901be82c99afc702ef2a43512b6e2c2982c021ca4fa0617f23de77a0ea3294c7296c2e4f12382e877cefb24f083000401830e93cf1e1979aec7a9e2237395101877b196d3c5a725b47eea698b2f368567e4b928092cc0b4406170a205b8942f6b1505e8570e8c18bbb479f2c54d3054ade27776fbe5264c53b1cdbc30f245c79523a2fd7858982bbaf5b838b5e5c003e7bb2548cf9f9498ec8174d4536613e0713074ae9ab18431dc2687c201c454a375dab3ea914f01ca7ffed756f5411120100c1a90af1dc60bbaaa274c686e2635b327174f819ab2d33c689bd7c6f5c4ac2c1a24f030ce90a9139f202b934b7755620deb2765e60847eed58f13db18a979bc3db7c638b12223f40650200bf367b552069ed222a7d2844ebed85adb794f017ac95c685479c70db34748c38094cfa1968f293192ec72713220121bc5d90c71f9769a32517ebfa7b16fd3cb29c80abc9635761b2fbfc90aead536a7c1383220c24a557fca66657eec04cf7c6d298b2ae6041e4451289d762ef687726c614ec93979de65bd2b56c8a60b64051c91a1e010e987bffb942cefc72478a468ad28219b75a88f339e0a383c7b190112e64f48ac320480bed800a06028a1fc7517f6efc35881536b187f2c0a1b6e611864a986079da54b048568f4aa33facee343401b93cfd45c19b4eedb383a19c6c3c18f7ab6eb16d06e +result: fail +ciphertext: +shared_secret: + +# Public key is too long +entropy: 64fe129938e76b4f1d2e29a94d64143d847e43f5f05498671243e5f2692809e2 +public_key = 2df985c8126c2826918ffc46aaa6a3d083bff116464df6b1a5fb8c86e62428c616e0057f33e7b0d5376b897a32b5d0101193cc6f115f502b952168664b742bf0ec767efabe04e7a393e1aaf867154bc465c0247f0f141ce5e2824b100d7cd68fb737cf0cc57329c84188fcacedd33e77d6a503280a90600a9ce291f98163bbb9ae77b71764212ea3d83618cc03ef4b5807f6cfe1b1c8b0a6cf50f20a08208ce6a17acf293b7abc90af51094bc0b70b1a5f6b116b3d989156962344393a2bf29947b60eed6205ee6b050840cd26d73dabdca66f939188da6dd057bac85c5b811b7902f19dbf092eb2a7a96720112b325d2203b7f0538895e79281c5ba0a859960c015459715ffdb150590b0ab0a67fb20ba2e967102c9b76bec1eec199058b12bcc8321c42760c155a7fb4384c608c67cbb1babc62034cc129ff0902f088b7cd44950e505c0814de5b73b2bf1658d6aa3d9045ee4f62d5b581cfabb3dbe7012256168f081af35ec49fefbc36e5a747f84811d151d8de9705620472bf731f0d7558715b7cb9679f44079f095bfcaa6aa21176028e943e7f6c9a293461cb6a32b5cbdc5503ea7fa2592254b30c1a8bd7886c0fb24e7c552d1f512e95caaaa63a10a926a838b53cd88b82e0883728729d497a6c2b55702023e82904bbb22b448d93127333df4e0af57c138d7a83b91e4c4453c28e3b04b404a4fe8a8b60c6cac76617a5899a64a792b55008337ea9414b8ab2b7b502f5242654961ce3a18ad5b47e7bc02fe4cc48c617a8e229c06ea2c42c46629dbaddf3376a8500df25748d1ac7699aab982f8747abb38e5c8cccb48295a8081da527e7d2cc5a38a1a6ca7876cb0c0290c008173cd20d23141565c1bf635af44b234c1c52cd1ca0e431ef55624841788402a557d438a6588818a0823c97b8959f371ce5284d29639a5ab3f4551aa5d0a438546334042643411c07a948274137114f16a8b185b6fd5495599a6cb1b7d7767a142502973f768ffe38603f4775d3a1e815393bae9a3ac00bfbc465b279aa9ad416cd0a9a8db37c710f19dc7f164f6959bef488bbee7088fb99ba49a775a3a470221c589584533b92bb10161580a1b2eab2fec7850962004a368bad3106e182810f286966991c1132257b9f244c6b3a4268a04d5b58f85d7ba082a69fadc506b39a9696c9fab0314d64216c0178d8679c04f60afef1b73f1d999a4d69ec513bfd2a1bd4a6b966eb0aa88915c2cc41d0fe4a6129a3523b7613b17c787022caac3be3a66ab9541b162ea565552caab7402f11c9c0842c189a413e4518038c2caf6c90f43f208ea24bf407b2b137388cff3b196f3256c0c4c16160a1fc14e43c996ef1c53c9e12c50d675445b49897c7b8638b63bf23261b23e669b037fa0bee91c30ca850f52d2a288c707575799f4f212a1c54b6f899a7f766db64b1cabd29111035cfcfc011573332234be85011e31930cfebb9a7187507a830b419151cad39041cb86b7662d0e3b8056968b8458c4070051622759e0a3bd0968bad7040413f92c4dd20158eb83801132ce2a40e7f7962e752050184ed047c1d862b5a737b14c4c15f59bc587421859e66c5456842288a8850266981a3c8ebb62bf223ef52036d7775fb9e2d7276a2de0adc2a7d4ddbb8d2f37f2caffcc783c51fc3e711350 +result: fail +ciphertext: +shared_secret: + +# Public key is too long +entropy: d276a3cf659b7102429ad9f0590ce40bd91720908cad1d9c85d7aab0189cf890 +public_key = f7e028dee46be03b09a7f101cb979f249b0c07ac1f6aaa2c4a185c51252beb99b3d92b4f88e550ba03153b05664a002b4787b844883f6f11c5791980893c5507f79161e83cc3d5a3c680633b9c89fb5967c208aafff81e7b0836d1326e0c278498c2a46789228c84622c336813141bc518258a76b2882a140d573530935b198a83f825848b6bc8b4f1893cc318404a2a3ef8681494b7f329b698d0bfdf649203617fc2310673b5171a6b5b5526a26f83ac908520807b9f543921bde2576711923643c2a0f6a78585461af40c0daa73c6ec7c8bc6808e41767d591e6f613a1064abe36050c442b78dd841b6b3492a431740936e1926709eeb0c818c469b3281479354f7243c201ca291d2add3d7b271c4a38ebc7a562a0525ec0432037199e26bac57b4295b3ac746b2d1c28ce12b67b6f02a8ad3a7f5f0bbe2e29d8328a07957347755cb97b34b14009277327bffe902d0c9cc5060455a3825502c3f42b17cbb22422ba7af9d20a7c096ad71c38ef879039db7ae78fa560de8be18ac1c9b111ec252ac43d080b219cee7dc25b6a890b2f2bdd02987faf98129f37aff123b38a140a6968c0c477aa7f7768ab22f7a5594229401bbd24012ea5df6d86f5bf9cfd0731504ec14968100af8ab3bf337d69c25de4c5a6be92102453b067557f5146435124c8b310bea452183578140c15605eacbbb8c8ceb8ecc89f01adab5030e991a6feb9c67bc77b2eab4c7875af1ee54e731cb9849c6fb26b301e2751fcb94b463562dc8258d938326b98839be52654768485e61328b966a1943229ebb9fa9585b48b45a607a2d51908094b437e3b9ad4a943b2e455d88306bed5c56f0730a6896436991771c49df27a05274a782b87ae42b110bd08616325034b364f4613ad75c44a1ca80e7ce34c2965613140932ba21512eb82dc5abfa6700b235022ab034d1f31cff6f07c499b98ca0aa9bd942425928aad26b283099330aa018a26750204b1dc41be744c8ec7b28aede49f2b5b9d5681c87120af4f9733f02530e2c14ab6453056799bf192091197a169f0ac9f8c8539265ac53027d60c833e3492b71920e8a380f2262348331ebe158604d98f0c6b392004663b829bdd8a0583ea6f7ce4ba42b7abf140486f4660b7b2c3e1741e64cb2dbae552df67ac514233ef6797370444f89b41f764771b67a4387218f6986b2c1c748ad6b9c1e746973110a76a6e65b6785b93634ab5b936594bacf6c519a17c6bc4af9412a202485d64294264ea831df7557747393ea33e7e948a4ee20bd5e900ad1507f9bc489eba3069e1b169e4a8b59a5194a97bf203071f500171537dcdba284731180e9052a479a36093c39a0839ef0bcc9ac9bc9bab6d0d0941066632677c6c481800d9d603537ac2b1c85f1ed277ae3110e5c85ac4c99b7a067d20386e24c94d40d0cee43abfa8ab05e7f6abee368af4768105f77d19f65af6969740e138766a290f043b31909dea09bb34c7b72d293ed61011701a91758a4144b63ddb926241a272a7279dfe01b44d8753de1c94dcb041af13650999352bf6a68dbb568f12c32403ae190abbc46bcc5439a269e8c33dc216391b2f836838891622c4837568ca81105960619ca5d7c22f5b5a97ca14dae0e54e06eb1147a8188f574c1fddb6f82a630bd8f6ead9c46020e8ce27729db1ed40 +result: fail +ciphertext: +shared_secret: + +# Public key is too long +entropy: 5fe02039e038b1d1c3629a7a8a20f7ea0c3979a07f658846b6384d1557224658 +public_key = 46b2c2278067423337abaa88e3b07a4e6a5b033626de99351fb05d2cca6890bbb6ac815c265c760464366d41264634acf635b311960326c22405677386b748b962bc66f582960b4777c762c6ab7c4d1b5213bc5d7cf4245d4b085e2c5d7ca57a8679884c9bb552eb2679a3b57d414c5cb709bceb2033b87ab1f414e4d78e5a7521a969179a01b297b9b0ea190832a8203d455963621dba84a174f16a9ec43e6d074fdc724a6ac634c3f6a2cc2aa74013a53d19b149b93db810c1c6e4799f3a19e36909b807ad1155acb1828ef5203954baae1a815a7c76b4be4c3da2ea67aad94a550a3a79358595d9a000c541a1471eac2c2366643887d1784610b4cdb372f284c92fc17d746b5051352bbf17b32488a93ee41dc45b95545063f48ac3db0294244c820a818c31431a9d7b5374fb1e6eda00cbf7afcdc628f2b65ae2f2025f587cb415caba0bc06aa9b21835a42dd720635ab2edd29e40e74df0d1204396b409ba3311c14aa8f438be5a38fdd57dd2a180fb7536b4116697422aebecabfe372dc6f4c7fcaa05804c140f267626c107d0018aeee46de2339f9bcc2414333bc38722e2006b35f544b669981f84964989868f582bdeea402c911ec1a64763d70eecf08eec5ca92c3bca25958bf34972d334313c7c7fd305cb7b40443bf01cb5d105a399caae2a051bc24036d57f6b3944688642d29b55e171740827ce070728bb836a8737a9a3119e2aac5d20fb1521bc890f66b917e71451f3abf5815187c1a20cf81411402eeb82bac98845827a3338f1a47f9469c1496036d36f995482fd474db1e6204b072e462469047a65a7da13e549101b2295eef785fcec8d3cc849d64282feb60252c50ab21753e60559cf24b421988d1fec50fec98409a53710376c32b6154a64a0c56c24922b47449ac98f72957eb87ee3e54ec4612762618081710363f5c59d3413fb955048d18ec22541efb507144b87f08ca04474bd91a53ff876376c586920846f5f17a209f706cf43014c13034538b59834ba9e0744620012b72768bf49a073faac119956c7f31fc66734a24a37e6b710b80686d3233e01a97e14b75b6cd807d9511b7f3b8fa3099aede899d3b0ce5cc158be86aa573c755fb76d05da75d8e015c41c8253e29c3feb460638276e53051954584183683e594061ec4d00fc1365ca468e46cd6f1954448982f2c7be574b3f128c187944b9d3a04876b7693ae2c778ab84b6c7266dc85990d46d54a483b6186adad4c2b43ca535856d76dc396e046bc53bb28b66b9df3b756431be9e3b4c6572a497ec401cf23cb749167c23082a8a6076945be4e8cdd586b74d8521fbb7c127e72ecba54980fb5c1d2b24af2971e269bef35798775b71d52ac2c33a047a352f79940bbc66060bc816b038470f92397c9bb754b351b7559e8ddb7022f5206c46013f62cc993a54f93b6079b86c160264caf22d3cdac1516028c1a26117ea559ba212780827d4d5611bd1cf36bb2a5662409884c9ccc881efd1b16d653ba310bef9e15c2519aa7b3bc3a3988d1164c4b4f2b6d9e39946fa0774583715c177b8415f441b4e237a5901f469efe07584254111e38a4b7330e29a51423b5c4bec0d0fa7425f92b2fb3884dc577ff5ede725dc8e60b78b4d4d4c73c4f675c02f701ca9a03e853b6438e5cbc5094a2182a411704fdb4e2814e153e1587bbf +result: fail +ciphertext: +shared_secret: + +# Zero secret and error +entropy: adf510dc0e997af14f96e4863f316475be59850bc861ca0d1b057d6b94c3b5d6 +public_key = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a60e1a95e846cdcac4c779702db2e7d39055c815cffa89c71595bf461924ef2 +result: pass +ciphertext: 7d3db5cd14b6db21e23580dcef17133205df090d24fb80487306aa6d894143dcd9bf9c47f9ae2634d4c2bef2400f839d42fa417a2b53baca917ac3e8e6c62083d8d1e849603ad45a6522f8e1058b328e38f66aec79c96065470ab0d15947dc61aa1ee1bd4a178c957bf81b8247c68425c4bc3f2e243b8ccc50fa0018ecbc215f3487b4f54a0fb18333ea2da8e2200a608a83554ac5649445a53da1177a3a11f69fe12c6ce093ac3cadb9be5ce9e6fb895345dea2a4cf386ff6ed2d477719af3bcaf2dd34f2f6746d039f82063fc589e5322b02dda783f524bf59fe9ea30b101ffd83be9d1965ed3eb16c52df822425f9029209e303df1725842e94fd806476e684f6f53fa74ae4960f498088b5eecf024b24eca054cff625feba4d133e6263b07617a467e0d9c0bdc0aa8e1f12620ade63643fdb573a798ebd81e1b0cda60a08ade91c92c3ff8c5877593ef0a90e6c20fd9bbcc3797d3dcc7a5bab85ec1e08471c73c3a19dac7d7690eafe2ecf5d19f3d0d3de2b700a622d1ef40631dae81f725849a2fc8a0225598b5941d74da237376e3c4cb72749e3bd76a81701d79f1423b2787a5b4276ca277e5279a820aa9abf164d921ec41a5a3598f13665c19311d0a75a0968926ef664869b8b2e6628db1887ebb2a7ec06432662b9c1494eb399142b2f05b6ec71d37ab33392f755f2a9c772f60a802648e3e54494c6006067f95946c09c6db484c526a4bdca4a663b329c45d7888cf8cf6cb20192b57b21f06800d711d1a79301d05eed76bfe406f85c2bc32e8680bbf7742719686f59564e39ad7f77e1d6226efa41e5918c4e4fefd8f24e7d3bc885af5a3e4965dbcac0b0ca594df119af883309ff10183b2f6d26a43f0cb9df9284c04e5780ea2bb2c160bcfe25a764fc0789bf40da40f7001c5d92e03ab1907e9287c7879c3fd3d30a1fbb3f4b5684d73b8cb0e7e0b8cf455ccceea2c5e92e8f90e0a1f99ab2d2353c391d20d9d9fcca8d449ea1b2d7b2e161bc198f34aac1a9221f5e6178be1f15dd26fb5973ef7b56a9214ffba6683071370e619ad805f6fc3aca3dcbea742c975f72d3c1c8b6f7a0fb86e9b4dd4fb76c5531d8d5a48be510e3c3454c2ae8196efd398bf117c2dc8c9891c8ac7db5317d4c98b5b300d6422ff8ad7c0b748d8dadedbea0a0742afc0383f6082c8428c97f49f1225a40e9f10ff3cd42d701d7a8d4d24fed319fd3b601601a9e9eea1552c1d169b4b7073b3212bd86ba3efe733b549950ec4b71078b3f7c09880a810492463d8152b11ef165a1ac29b81a17b844ef04bfde87f9c090a1453299c231c7453376f3a676f75e4836ac80ac294d69da31f60f1e470888808008088888000008000088088880880000088008808080880808008888888800088008088000088088800800808888880008008800000880080808880880888880088008080808008088800000008000880800800880800088088800008880080008080000088888088880800800080880880000880808888080080888 +shared_secret: b30f8bbff487ef7613d1676569986a72ed98afa9f37842013a2467a9ba6d013f + +# Zero error +entropy: adf510dc0e997af14f96e4863f316475be59850bc861ca0d1b057d6b94c3b5d6 +public_key = 1c398b2065bb3d95582d63859ec7006f9c80b1d0c26c22666dec1784f76b4096b4fc5892a49c925ad388a3e31ab2bab228c91985b295b730861ae72cd0f733a0ecb85d26844ddc8d28766dfaec97486105a4281663c67585864367b7521e968357940bb31ac0658ba60e23baf9d5cf4b2600ed8b19f6a7c974fca655b0b2e5bc019c8398bfda6bd6442e51d365c3839e6e4cc124cb5529782692bc68a58617517a9d6a316ad9e93695e48791897a0ee3010c43809d0a6f5127ad9f43578d5842ed91902ae068ce3ac8cfa419e0dc8c90b0cac51a47a2a16162c515d0b98099a02c7bd82cce9532590c2588955c8c37c5d957736c25cdc7329f3951653747b7b8f9b1da32027121a53d62b949e9b15a7a29d07716a74486ca28bf6ce3b8bed381cc391890f2259e60a12dcacd293908c97c503606a78a4c035a10a966415788033cf870234986820ac71db9e322392652547a6f5836c138b869dc409c16d67f1deb186454ba33e6c45cb24e969734d4da25946a427346915d598a0cb45986fc73dbd63c387421bf95c11f6a0956a76697d6216485352da8932f697e8a02c293bb76688c550c63ca633a18f1e07bdc07951a996cec3644755c4a0f55230c48844ff6a82511976e4a0a17a499e768207df0c309b814e30a099a6511d6f3a499994a821c9dd41872860a977e7406cc2b3b69768b7ea720b2f5858df28f97b77f05d2361c62b100271db35c660493b12b66938845c1c799b5231251980a99ccab6356a0b445e86098108126812121176f13979e59a1029cb040bf36aef192aa622523866ab99459a01dd94535477e1755101478b53ec165c3197d0110a7b4b4892a3bb82831b300e55807c44df5f6c1571ca125b74bc33863603501abf51120acb848eb1daa2a7f50e640fedb74e01307f68798e98acee0e91bffd8150f2bc9780956b4a2697a825da419aab3d3946797762aab8cca9a5a65dc2edf507e8a9474d803c8fb637e05c94cabd721eef5716ca4410e69220c4a22deb89c82526a5b506bdde8789e2359352c07cbb90f3faa867c538d1926051e3c318939302dd31c34e894e3917e4ddc60f3ca9d3775242003ae7642035267757438a5deeb96c46489670abb8918c3c4b42ec7c7c3f2bc74f1269989080782c8941a2838439c3425d88f0d5537282a677ae1102ed695dc447668113481f89e60659f1e017dcd3336ed47710a8721cc421b024595a86125af941203392fb0f9cfb2fb7af950772319070ac60f97c2932ffa71bba6a94d47c695bca3922835d86a94cfc360ba637939034a7850579c7c5e6ef90cd7ccc983d28f357ac379a6b7d6f328bb0283d79356d6b28041aa0151d16605798fb65652ff270114f29241b8774f94553351536526aec996be9396282c66c77b63399310019ad8474912bff5bb1503d481bb4aab4fa23824c68ae5058230ac2ba43a4805ca8cf6b07b810ba6d415c4bad388d17373b4535af6234e42187d33ba51dc75a8cdd3c80870cbbbba89277c1b79e631f959c8f45689fdb7a6e72a97257aa188f8548da934533076937a140ac62c598a40adcb0bc0e0af7af639efa4128d10b8dc0197a12ba1e3c9c68b461dc3a7ab2975482c62810a60e1a95e846cdcac4c779702db2e7d39055c815cffa89c71595bf461924ef2 +result: pass +ciphertext: 8d0f4960c3b07ce8148731d6f2424e614145f9bc98adf02c0c9faf944c708502d96b8142b0823b6283faa03ab500500684ab8646951f90a09ddb241f5afefcb2a75c3bbe742961ee3dde84518933dd19dddc08fe0c2157743a5d464738f430fcb0940e3b12d8a2458234cf3d2dc475fbc589d90f5918dc8c1be0bae511d6bfa0c26598529a3646453019008df6bd4d2689ec76d5b0bf1efcad50bcdc1945bc670b24db9e0fdf1880aa9d90687bb1f4d4186ab444d2cd1c91b7a7c57324aec0e96240f9d817929f6b91d136447e46cfcfe0d6e11ab16d47dd095252e13d61ba2ba1f5ea4fedcdc0cc16b2780edc9b4e4941e8b2dddf791da9f8aa6b67906c52fd368e1808035377af67def8840fc44bd11896e594deca14d4cb942b28df99583081a3e9c0f5c8a989d781a062765214ca381cd65683faff599eb6db4752fc667014a8dbd7d2fbd64016fa33c7c8d39a36265f300501d52ad4c532abd18f43662e9a0110b5c54797f1148615e52ebfd60b07f9dd61c5f22f563620735a5c55dd3173366b0ec207722afa4e7791453f522a898b9fe97759e6112e096185e40b7447c112d508ef6f8afd64b0c2bf1f75cdaa42c9db11f0d997c38dc5417fe39d2f99f00abb50b66cf1f9ba5472b05605d492b8d483b7708568753bf415938a3c26ccb361873d0a1d1d42820cf5ec6986cce388b0356b40ba6d572f19be691a654356dc7e90b31bd04e8ba9e27fdf179037c0c8e2d4440eca4d849bc85d61f2df423bd09d90ba00766e5e6ba946e53a66c119611d5b017032c5a39c9a533097dcae083d3832821668b1633ba1aeab81f556d61dc96d3052b6497f7cc349b548f90fde55604c33ce018095d72e8c1a2468da1c6c5f679234636352e5ac1b08c7508a887b1fed6fe466520f88cb5951b86a4aa6c94398db200f4ad7e51b3321af70124f7f34823c4af599ccf925c3002d297760bf4baf7fd1465e95cc824853562623540c544c8d46a4c4e006837983f976d47cbce04b703dae965111948159ef0c95093df21d80555016265c582b19b0dc8403e4e297c980129485311ee1ab7ee9e4f37f627ab239f5c6158a7434b8c6a654dc305e338b2e7c9da053d6932bf4640c2215f68e2020658ec82ace46300fab43412d12b2cfd7e09954acc0e7b928b2fb791f68f7fb455230292eab955b4818031e65a54bfea008ee5605205fe4d68b26de0e60e99ee5acd069a23e5d83ba43745985bb0cf05da32028e66bba8516889e6dba565a006624433c6cb23147008dbd238163739adca132ee73b4eb0415a3b754fbdece10f926f7979c6f85d0a6e9ee0e881f13f50c657cbfc345185f55167c215d35dd0a0f88c3736119d1c5891fe5555dc3350c86e2df0383aa876ed91f03207811e0d6d752669b8832de3836481c33d416f63ac05234a996d7330b00837c3f267f09c74f0b4b85a2bf0b0ffbcc23ec403fb621f7f94ff5b14db6bc699545f15e448223e677906f8d4eef5a162e0b2d4b95e205b57ec7fb50a03c7ce1f53d7b +shared_secret: 6f68f7fde8fdc93b27a91e7989842c6132d60007d2bb9d99fbb91d4e1c79fcd9 + +# Zero secret +entropy: adf510dc0e997af14f96e4863f316475be59850bc861ca0d1b057d6b94c3b5d6 +public_key = 76da327e31334a81297ac41a07b9c1d4e04ef3fb8b06e9bc13071c98f6a80523801d0c6e5e7848d143a5dc011eab319ce6308bde406c4ca459fd3c20c5c76dab11c3eff0a060f52d6c677242b6019ea40c0709d071f587c06557d0cc36f7c428383834b69b877308c55e8c816d8195f614336e50357da66fb3f03de7c3742fb23c2398c7868690648122afe321a0b2b55abb99306265b8e9c4be1771b7727775a25adb2108a8d62bf5c18571267e6c1b5dfc547019c331532a40550579e79426304b52c88cb722da72d63a8da549731d5625a6e28db6ec22f3d1733df7775d5771857382bbca11dd271fc35b4854f58b6ffb25fd42286823790b1bbccb40c105e38092f5a744e19d7b758ce2a5379fcb1f401aa4db967fee4bcfd73811b214516a098d1cc726ba418118e14970aaab00293bdd9b18de001075e2a1d25183bca677db703b010a7f3166b7a4bc374b913394c504463a42cbac84ea799d70db4ac0db6dc3da8c78149bae1cc5e4b65f701bca315866d6a67e9bebbea36ca91fa694929cba572c60a1d1006c95941a640d472bc2b30cbb635087170381a4328cbd462964c80692f224ca17575fd7cce32425d6fb19a363cd114524d8c4106cb628253bca70377aa242751b626447fc43de18333dc21c841c236eb0b2073a2a8f9a268c931669daa4c9036228394fc8a0a2cf809a1a2929a5ccc98f924a9b7282f922c5ecd96cd1436b5b21692610a44747a2435807c50581dad25268d737fee3834a54967e76c3e7f537023b57f6a7b58c191427a12282e06421289448c97f7cb042ca66927a417e6747b3dd501d119cbd4dc43d18174aac099ef85839c7d9425d87a17cd77ccd568bbf4bb0fa8ca4e5005f9ae815a307471219a9aaf60bea631e07162a1818c3c5da6c29385fbeaa76ff4804beca79d1f842c46b9fb29c81fc4875afa0b178564d26b26cb21aaad891822ecb471b76a869b83838388b9f5839e0c344a7eab55c392c99019a0841b20dd14f36875853c6150fa46c2572828f51b9636b00bad5940912923252be3c49190577c928d5bcd6983bccf00875db487287ada1849d3339069195380c1a3ea34703792251e5c7877523c1b6278f9e40cfb1614a04c01d966c41bea36a10492edba56a90e370c1995de2203aff43002446a30f3771af65924b8354e0dc2fb4aab0295925a23576e4e9770740845ba541eb23610125c782c6c82af506d9a25d148373f5f48537d7b0df7c9e72f10938f9cd66aa6b2dea9322412eb01cb04de39797f78efa29186af03d90588d8488914f94033b644663269435e2c26b47297af4a324526301f2cea3446c2507717e83c29c8a53f277cb739851bfc94db3db6c6d2a35df897ad06420452281d1659e7aa89e3062abd2a1a7113cb373e6856b7acc402abd86418c554858eecbc2b38b8b9920cc0fa091b891c8a4248cbec13d52984c6512a025ca69b34477dda65e12b7839128427c42832a1c5f31e5c3ec09497667ca7e0059c5f43889460344fb6985441afee726b58172e2ba2312aa10639737325cb82e2947299b94aa8bb021857232878b45b03f9f0ba5b0ab75c1773c471ab51e666231c3c37f1bc4630628a9b1272fb9af0a60e1a95e846cdcac4c779702db2e7d39055c815cffa89c71595bf461924ef2 +result: pass +ciphertext: 591416ed43f689aa76a117f623b7647c6ebade29bec5e089f06a7ba3048178df0aa0c26680f99d0186432f9fc3987e0a511f2bd3d075603d315956b2319b4a61c250c09a5f8a49445050e6c2260daa43a6e12e7f25bde3a94fba40f990c950bd30f9229d5c65b6bb4e13fb8ea50baa866cdda065636656941dcf58907f6bc45c778dbb8e1e8a9bc1eaacbd3ed5c034136afd74228e70c4cf735a82c696ba386a451cecf4b43a71340012ff8676c7d5b4b80e0e59f1c548a40e7c4d25b8526bc4fc14aa9fa7935c9860efd43095538dc081982ae2c81a96f9634685f506bf7cfb1fa7fde39594c5252fdf753818be40ec6191fac29f9512ab94e8c03ffaa7990e3b788ec43d749d78da8f729803eaa864efdba24dc3db1a65d1110922f612ac60c3cc731d65f8a1ee946ab348d5ca8f4d749d5b07d0ec91c0f74923533f86640cbb30b470650d2b710c690651c99c03caf4792d923e5a094ce709678efad3b474e803a87b7d390ef05ce6fb2b84eee8c31f9cd325479f78ed7dcc82d06d390c616019ad6bf8d7c18cc5f719afb06ca331034d620b108da68656c2c5bcf206046cf954ff9aab6f76833312f55b0ae36330035afea8e4b9c3fb522599d7158f3584d7d0d70e4557568b7838e437f04bb41d4f8e8d41969fc8dd2d35fdef69b85d331fffbc5d47e1fdcd60e8a10979f35722a430c55e9564126182a8d9140e8cff41386b6e81a1033a9b40d75ca6aec60beb7e3080223dbde023eb59decb9054663fe1170f2da33c352c86b10c4cba4cd79878a7c4e83745764355b3c1a8b4a61384e1e9db00bcef2068ac7d4a4e67a1aea96c52ae35f998eceaef3db46b43b85dfcab0a2994dc700868125e3460e2f9c11a0402432e34a0193ac2cde8fbda0f1a81371b43f271f737d7af2af211f5287389989f71cff7c107fadf8010bb837d3cf2ac884653ad9854caf494d5196d4fbe49585525e50b009332eb86303ba5cf5ca11cd19b687b5f3ab06c2e36327c89e0ce03efb32a813190a1849382e82cf554d86caa9cc2c9385bc3b203d20415d0282543ed33ccec14b2275014a13121aa206a98ed60261e22acf4a8eac9c853e96f99d09ad7c0c46fc8e93db918818ebf249f871dda0c5220c4a46475266d2dca6b609167e120930861bce88859a822f18d044befb231ea1e6c7459bdeb14b6e988a85c50b4969215451d96a653ca2990c8db43f44df0809dd894b072037e647251aba319267f7448b408aa959825d79e011a5792ce8dccfad35553e4fc662867811081836a839927a4060bc9be4ddc69391e0824bb16d6376f03077919e3525a6865410c71a5fc8e86b9cbe9043a294c90650888808008088888000008000088088880880000088008808080880808008888888800088008088000088088800800808888880008008800000880080808880880888880088008080808008088800000008000880800800880800088088800008880080008080000088888088880800800080880880000880808888080080888 +shared_secret: 1ef65648be69ac3ca3ade1382a2b4a4ba1c0c7a04eecbcdd9e34af67665bbff2 + +# Rho leads to frequent rejection on matrix expansion +entropy: adf510dc0e997af14f96e4863f316475be59850bc861ca0d1b057d6b94c3b5d6 +public_key = 1c63473a75acda757b3ac6ad26221ef4f671e01461ab865f59c26f22c61de17800336b18365a190e7a123a34193f375e9f9643ae99889eda085d5317d5887e6b2c8999c133e20c49b3294aa0e064dec63c7a00acc1c08fabfacc28203e616b5a06f02e66e87fe1789725e8538b405323b9233fa61771980626b98b014ccbb9573d57d85dff1b000b38502af474add3a32f1ac7c1ab8adf93350ef1939ea376226a37c9675fa33503fcb753a1c86ca8c10e10ac74658944af239b48b97ca2b85ca4034ca7d662c91237c63c6b35137fd0429562b5856fc11662d0777c111ad9c6c34bebbd61eb6b538378b0123033c11ae1f0715553ae62cb27f15ab26b46ce4e540d39679ad9613fc91a35ca1073497cba5c57cc2c77bc75e7281e518f7640ad48451ecc32bb26bb2512fb76c9f6c46dfb6dad9c7be4762cba596184f37259143983e906002b34acac2be801c837c53771b048dbbca14b6c33e9ea7886c3be529a488aaa4deb590fdc96aa62a68f67abb4073b2f0f13a874fa7065e3c16a8b549987c5f2733ac4bca74be87f2e14cdf7d8916d47b69652244552a7d74b846961333a5755ec1179eba27b598333a07aad70626429153b7609a131e63c6bc94c32e345b9b293345598ae20a6f6cb25ff143f68e28013793183b5c9bc8a9d289967ccf613ad510a63c94c2b6b32214a9248fa89f85949ee3cbe0ba3a778ac7b754498dc3a79a95519606171608840587040a70aa1331899bb1082802c2aeef31ca2a773ef27382c2a84eb04ca518a83af9b44028c56427013b7036e441c20acf86ae09a82b8fb6ab2a234853a7b3ea386558a0bdfcb4487455a95c30cbcd54a6df965c2830f37c41bfef65013671411db77b8d69f6d386fd254ad7e175ceed98cc1e16190965b97e7375ce1105a491875007030c01cefc43e7a45615b665e073b0ba41a8309fc7cd70a271e71a36530c80ea227a9b57645899003c60e97609aa0761e60e8aa1f414518006cf1c62ea53826d53981f2264bc6c24ae072a2699886b75912ecc880ad6939b6a40d539232fa155b0d101aa7791cf74a1fa459ab8c8cafbe2911289312ca990fba952cb0253b71a792a5d9c6bfb31219e898c7125197f7b7a90aac7d527f62bb5fa7e00e106961d1babcc582590989262f1a1463e44d839221717b49b28980ea8b81f5f2cc44252c771b47d5550e3d68a8f5599aec848347ca728eb6c93b717fd6dcb7d8e338a6543d3a434245a44c2191a550794783212f44a94e46a64117f0b98157015fb0c6fb7564847703674945ca3b272e14aaa3a02cb8eb7fe3445e45940315b4408c5b4400812b0b48925862cd5c27abd9a2a0c3656290b11f6a342ec589720135a47b555aba0b098b37539cd0a05e729165d82b82ca1988dbb5bae64c7cb44a3bb190fd701b7927257a0c564fd2762f0c999341600bf86ecac593f7320e4f77bf720a42399c3b36642885b5b53a527a7b9606de8703805a72a777b1bf3674de08419e3ab4e424678e42ac87c15ed6c49afff1c246fb6b80d1182f57b6360203bb6640291a0b9d067aad6b8e3465a84275b923ea4853f799a7d31766bc84b5a0230aa43b9a3153f509b0ad9c63b00b4f68c75e29a6cf40d7000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 515463ea5284839dc84869288f9c03f0e384e56fe04c60cd7af8bdf53057698a984c2ac336de2932d3d4ba3d2073b481a125bd6cfae82da6ded2b0e8fbf7f579dfe5d590a6c03a95b53df59baaf4f0dad94a7b821cbf9c1c809b5d089d38be1c30d455ef44fef503be587c4be0929e2cbd931d10f1a8027ef2d14e15a931f3881a2bd914adf3fc93f97ceeaa8a521762540307ce5a670313d828d5ac71680d4f46bb1ba551ed7fb47e4b82e6c6b4713228038d5011df91b07ea0fb98790924b4cb859bfaeb309ffea5c2cbbf3f12fac5a063e1fe7bbdb0de70683837b180a13e0cad655b6fcd1f5b635d3342dc84298269c1de8ce6b39452297fa6bffca90ca6045cf304c4691cd052148dfb0812162e7e000dc5c18c21209df9d9f0fe7dd8d0962cd0ac01402a7f8170265af8804747857d31aa7aea612900e9067ba8970e1a60ae3ab1105b1eff223c755c045b81de79659d001b7c45ce64dfd2dc16853276b50053988337ef88e4c70ef5861dbcb8a7d6d1b2a5fc5f044160be5694e12201fc57f0c8e3ed5e48c83c2815d78fc68a118918615b2ea0898eb7a33d446c449aa92c82131fb80267666d9e11425c9bb8e10f745828b72570194465c7b2eca785228244e08c06e0d8f20222221f5dec81fcb478945564e2e53ddb68dbae7c6b1540ca7f4087d2833a752d97a69cba3f604483a6eda26e8f5ec27f3ca84730237cf1bb30d70aee528eab3e4493c7f5787f5757ca6a3ab5c278c631584bdbcebfba318db0fcdaee34cfac4422b448f00006c97abf3175c379fcb16f5b150e398355212d8c60ecbfcb3503824565bf841743bce55fbb2606dce0b45a5e2c1fc9fa20c1847e9173de2d8dbbdba840b42b002cf5c0c1d34e709816806e525ca217e37cb2d23e3c268fc4b31608f89ceda1c78c7d3c6b23863f2c6b80747dea4fd11ddbbb8421728c4dbd97fecb9bb652150278a3a3dd388789d2edf85baeff8f6153317a9cc9b72af8f69f260ca96cf602e2831cdfbc14958bf62968e7c019d7c71f6ad55fb51cfd9adf82894e56c05f6b19304cc04d2906b935639f2e96b56768abe27199b5af84268ee89c97f42925bd3350aaf8832d1f7b2225515759ef64d2d75ab29039b549774a3ed7209e1e0e50656794b315ce2bfe35e20a33bf180ac724b9a47cb9198ce2174f6b9cff075f94ede24074f169f15a8eadb54d5cd8241efe8bdac98ce02706ab86c10089ea23470e048c0f9bab797c240b5c499f75ffef8ee6da533642301c897f66770fe1860a01e82449c4259f54be74a46d96ff5c78f0c07d43f66ab578a795a5f3fca06a1d3cfa16449a278da74a5eb6f0494ebee89d4ce6dff6c008e10953b9df95f0e2e7310d33239206598cf4a729e1466f3718534d914617d260298b45a5314d045516a15701c269ec948b681a4b3dba464878a193731e174ea8902873b7132eeebacfec09ccbce7f50835116ce5b0a9e10fbc7c76559ce0044ddc494a9224bc197c494510f2c44e43b037798c1613416f2240394f +shared_secret: b177b87b89197809b36026136b06fc1d749dee4cd4881b4ecf113f28df2bd4ac + +# Rho leads to frequent rejection on matrix expansion +entropy: 3983da6a4615805f6d55c14ba582d59a40e646c7ae77f4835a51afc6c37f11f3 +public_key = 2597a577981e1c300ed316423494735483aed71b9f85903dfca56970907910317d72a309adc2cfb0f062d4cb215a1caf67f4543f499001ec9db4db066d9989b600223d3830bf1818809881efb057a7626ed7948f2dcbb9a1582d6f421e08571655916d3a99b14ca30145e3330b31086d5a039a89ade149c9f362cd03c1919b4abe4178713a8400c0d0a21f866cdeb55b1a4202c79a5a26874004eb8a2681742f5bb97ae578faa58e856a8d186a07826a54c1495503d9180073275f139bc1a3749daccec551a809981520aab0c19c3bb59571e9cc0942799f71b502475397e9508d673b14652b65644565a436bba2aa8fbc4802663608e97a2da50249f6187217e01d5f4812f889b958d2ae4af89b255836795049b87bc45ff47549532c00499964e046191c26bdcc8eff1553ff488124d709dae90df510204f234923dacebdb46e5efa933c693c00b4823e276b5d78af2b336309919168fa38a224415ee61a6f729958f5605d57b748a09993f8c809212393b381f1e7c139844dccc37273488562a28fa232b51b6b22de4c0b4c909a03231078f2cb05581cce12432d44a66ea24ddee28ccb2a20a31130822cc74112686599ced4320878826ca51a9e892a5be735260be64c11697fafea1cfe152eae96a4d3acbf21594af1b5507c417679e6bd85e169319931922631e8042c093a6269205b4e8121fad69ea1f4037282852afcb3ec477cf7d25343c59e94e74eea681502c6939c297367dc3502e21724a77f2535a70d383a24d29e872aca63d9cbebd9b737fb2d565968bfd2a27d44061aa88cee5869e3fc96e337033de554ba4229d9ac62743c509ff3cba9c25e7ce3913e9812a5b9ae281c1374e86f653b7d78216af6f233e47a5b9830c5e3c3b932d2604c45c7777898d9078bcea38138a170fba8b41012648983b6c6e1cdfea72ff838922fd55cf1e62688798b6d425d20f2ab12c75714e8b3ec0028441259ff5aa175184731d98d2e7215c87970141580e91cc6cc2561de55387e63346acb04a6f017c9d7cf7ee39b26dcb012fb59eda233efc411aaecb51a6037ed4ab3dc227a4a977100ed804aeab9f7f585c7f5b76f441ef3b2b5b96434a647012fa13c1fabc08d1b46cd8a05753b7f7bc345847151c4a40ffb19238c122e7ca6220ed8acee34129075aae84b3732bb23257b33892c80309b89a0f33b1d7a4102d55f81b1996c90c5258a880e2aa0e80700803b9a80952316e654cb6c2349a0c88117b5f60138a571250ab0cadf7294457646215ca866487e6b8590fa926c2b5c367d1a234714a733671fe6f8b966b9b96b4296692981bd19b519a4a951eabb0d40751d916f03b3223ae4b12851b0d1e7486543272e71097bbaafce2a82642252d650c82f38a4a40b9360d789e00a3a903b71b6b91bb4bc17a67b864312c4c030127de12552f97dd814ce03ec14ce737ce3539a8f71b369c8947a759d18dc2b76aa0edf820d512615e8a7a8dbeb4d7aa92e8faca354f7192f7a42257b92fdfc017de9016a969efea146d1516316e31ad40b5829c06fac16b2c6d425b0b5aa17623af5a26ee4e0587f6c67dbac006c236f0ca216eeebc201c107b2879a247a60b1a7be7094ac8ea62841cd0933ae000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: d8e28962213efbabc8a9e3efde9de2573855032cecc3be756c87151a368e15e8c734155213614c931c083fa04313898680f70839229ee7f34eefcf639bbd35f3c375e49aaecfcd3b0b506a1708f4d8c26a69a46483c5db50201db95c0de02f67fff0811b43d58cfa1f2a61838835ba909e87e58708b07ed43c69b1cf67655baac003b6dd004434d22bed1aa21796d3c9c1085a2c04ce5c03797023545a1cd0d6dcdec111b896a7b34b36c24be3bc890a65d3b1f9fb96fc56928d456b845ed5b526865d9d588df3a977cf7ad0277c5e02ffb8ab67360d0009279eae50e8b038d43390000c2805875e9978879288c827fc3fd49305d3ccfa9c7fdb63833b5765b21f70d52ccf2802644332f961029dbec5c0ab56ff9fc72dc3df3b97311ba4058eee91b0634459a59213df74385ecedd341fd0b7235b9d7e061746149ec12cb1c6fa8b28bf995672f1c7cd1c01b80d2be48493988f0a43bba9ba45b6098fa8ab08ff8941aa8ffb2b7fcc82b07afa401f02f562d6b4656eb0fe8a3f8c2e97e45372c35a8b97041e4d2bc92302bd4fab1bd989e16e5ba7c315a8a2441c0607368c116159b005fc18504f12c96d557857e35726f9a4bf2c0012453663cea4481f3b4efbbde568664c54c1be3e346a499ee98e06ce2534b5d9bbcfecb804b8f4ce6b876e1ee00c12ca97b90940334d6cc0fd4cd010e3d83c7c4ae91761d8f73d699d2086e7fd635a028b1ed094e50b633d153f71161094b9aa230cf1bc005a9b2591c4ed06ed9b1695479bc67c41b0f7f3e25cfab21f06c4dfc68fdef64ea5b86ba05fad5b8a5316593c9ff8a9f3636167cb3148e97af82869e42e1bb3f110ffd711478427796256d82a665ef33745ea2b949a4aa55ab56e86d2f5feee5f0b203ff6354399a0ebe00c36d09060e467b434db070e77e9a125ea82362dc76cde94202acc71b47777e6821dc477a466caf6ac724761a1ba63020393ff2c33b6c0e14edca3527e897e184509e48424526534c4f2ef34a91a28711c53675eb4cd3c0419c747e2e67ac03ca3015e651dae27bb559993b2f0d20f0179300e5e69580323534d1289117ad6ee3ba03e3cb5f6bae436b9ef634a8c7be8e8c5567c5576657d1820f83c6578385d7911de91585a28d1d4c681ec03cd69081b40bd5143387fd020a9dc5cbd5fce0e8baed3d16ad548435db9adbe14566052c2d8d93d0b24bcadae084ba69ec63735cf19a6d46d534efa4c65bca47ef83f94d9fedd42578f794549bd5331b9aa1a2fce0c6d83a6e392cd4695e13245f8c91f3e76b187c55ccfc0c0a6344a6c89fa6544a86f762df3c59da21964ba4aed245647c56817a600ea3ad3fcc3c104197e2bc7e09fb81d9f8fb7ef559514da710f8093989f51c5c6dfe18cd821917aac8c7e9bdd9c61296ea839b8a54e466e49454e212314f39d50dc762e6c4c5623a88ddd423536aa51007bf6c56e3697c3879fcc6f2a55f0246a032dbbb073a1048f91d0264845c405c5063852cb507e4c9f3646db75c99abfadb6cd50f7a1 +shared_secret: 8a746f85a41b6c46e0ef358c9407c702c86fb907e85f86de98d6f7bf7d6e9866 + +# Rho leads to frequent rejection on matrix expansion +entropy: 2676b8426b9d6a30af007094bb76d65d388c2b3da938215dd6f6987206400e13 +public_key = d4aa88217021609b2499381632883e6c690d720297f130a546b8c101487a31579bfa132c9b06aaf8b6583e633487752aa9fa26551650afe52d67d182bb035848e30696d1be1e56c687eb6387043e28e6a381b4536eb18dbfaaac8f6123ae066ed7568fc1fb580facb933875eea026d182329214cc62f75383d68bccc63788d228f88d17d3aab08f91c19ded4b19a876bc19984075a529dd267b823b7c83bade5e6a782013f8de263e992031e8a32252035e6d292f6d98e022c632d115ef2c60d53e47345e470aadc7816cb6c43f0ae1ee2bec3786b6b159b8d2a958ae567f364c70e4987f237a5d7dcada9066df63018ec4b21f0000f4674a4ca155e761c41c6a54490b3c64c42b2777cbdcc5cce8543a5f9a605e7aac50012c7c2088721d69910f9b3fe26013f45c68b7b04069b9d41555b5d7339c371389c95ca419b77d2c5c1a5b068846972ddab9cafd26308f790ee0a8e7d73ad4c12c4256b237a9659a6ca866197a2ccf39c005c47b4102ebd47607181795cc66a2b677ee68b02a5fa4be222c5f2a5b44436be13aa589044b574997c5f085ca099bfe8b2554ff981d2872a78d6a08840caf9a9051609c586409923a989ab4bc1521b8d23ba04f30a3df77378ce88abf81309de61646ae15e7bb62c8f300b5a7952c5d4881bcc2a81e64a6c612f7c6a9eb8007a2742b4bdc8bc0b5a0218479506c746396867b1a869038943147ccab4a9c735fb318a7b84efd56ed70b05e8a9cd05a650e2fb7ef5c48be6d39222082080b74aa7f4ab869b4e189710770cbbc5a70193597a0282a02445c5f5772750e505b968bf5c665ef2eb79c01a8e12948ddeb641fae4c4e8d7a88d13433611553292910e831d786b0dbf5cc13f77a881f82c98263a86174223184fa96a2c53f1b77c0c12c11c54cbc37776b568b4574b458494ee6b8e0c356a4195bacdf2b11876bfd3a84804a3001a37967b40855326c261d778cb544d346127eb7091821a5bf5eb3c6215b3c7933e05205754635cb4b15a89f827289c20844a6f7e4a817bb140057991858a6091157fde0717bd2428b50711443195f4a9b462eccb9c2325a092439452aaea85521556a17102223a65452c5b152c8b476db176cf76a6575188222215d32b5c08a80e80bb84e7007a350776165c1ba259a2eb06c5a3b36d27ba4b7530a104d2a18cd896dcbabc020a6de3f09bcf24a1e5e5772cec886f5102c71930dc00a07dc71f56fa905cf8acce66a717279ef7718fd9d40864474338c0729f4cae12d2b0bfa579f742c5de322225b0c633359108d8644c47b539d3b6f99cb8bcd42d39208fa5dbb87e600ac3cb1179a63936881748eb99a7bb8631d65dce2078edcc4abf0608575977ff4a805cd81b5679899d36227d1479d25a52072c07e7ac65148559ed558ccb164b9822b5f80575dceb5166121f4ef56c32950ba46217f0dcccd3f4ab8b42b4b0213adc08a5136a404f4532449915cdbcb3fba8ba3aaa7f32a63371f5c09ea1cf1094b205b2681b476375c481a5f336f38251d4bcb652c2a849daa65c827d5163359292b8e4b98a6e6c38fa592fd068197661282d457df84367f5f46815905203d635e9540811b66b990045e4e42532862012ae783c1d000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 1ea478e56a462e1f366f167cd818372a44d1d0311631d74a6e2ba29a86357bd7e066489d32f4eedb2398e2baf12dc4e90188b81cbd961047889a81c4a2f1c040a4527fef9518029458d524cbdd897409255258a9da92edb0d9bbaac73705614171db771c68532750750a70af8acfdcba1ebd423858b01ce3ecc821f9359c043b37dafb9574c5f4abda2cea0d09c0fedd0cbf40041a613e4de883ec725de57a89a2d0a9ced380acd54bea2eeef2abf769f81d92b302911b4ce0d865b5636372543e218e52c5a1ef0872607e4422a6c10aa77022120ce4875e9b11273281044b5d200a61e3c29a69f177a6fe530399fbfdc4edd2f0aae57102e66a4c48e549afb78e503c90517b7d741abbc2dfea9681ab74bbbe5bab1f25bf4be19964548fe3048cc27be264ad196e837e2e0fdd8475e6909d0d464cfc8df600c1a71523582378d1d70224330c852aa2f70b9536f1768736e95ef8ba0b5f595b683ff8a0a2e691522784a38c44171250719ce54cda4216052df02d164034acd650cd47d465be69399b9a148a5fff2974b7b42beca2039ad52358626e2b8d808b6a52d8b7eae2fd92a7d5b019b018f473b712c2df01295ce33cdb56cead9402adb1f245682d29af706c270d16f63edef39a49e9346a2a647aa8e481e5f72ac87aa5348af2c655c074ecaa0394bf531d9ba5851ec692f577e09918e4013ba53d529dbddc98dc041cb5e11598474f34e5356877c4adcfeda2bc44872ab538b908521088e06a166b58424a462dcbf88ba92362f691ad015083d83aa686147e635842fd2dcf58faf92d94a104719dbf7e5ea19522d395eb4e1092bffabc6aa314de0549381b8ce4b416e102c3fac0adddb2094fd1eea9451d6c14295446606f9e65ddac902a1fcbe65fdda0c1cb5322af2805dbd33633e5d5ed3289bc133983920491728c9b851b46e04c7dbc6a2bd24bfd63d3f5236ca8b2fabd0ae30506c885deb0696317929f3c8aa27b6320ee241d434ec50f2d2423d7c958c6fbfd04b059b3e98214faceb96ed5e3b8fcccf169c7873fb87c1c236539cd1297cbc9f8c3e66408666a678d80ad6e29b85df490fa0e83686aa3261cfa5e123f3fc7dab946691524bef770da4952ce4702d1d854996d9c2e30f8bd88accb0ef4917f3d5f9aa7cc51e566b9f94a3fdddc7640a6bfa0c7b6bdbce57c7fd76102dac7de2761aa971c949020cf11981d55d5a283a1b9943b2692b3a280b6312e32ed52d4f50a38f366b91cec8167f6fe4769f1403ab0750671257194b62b856ee5459d095298001e381d36df7e2c1a5c10241ed4c278d3d477bcbc1973728d7934f9ecdb0ead0d26ee993ec91199bccca33fac5881ff093880b727e2226658ad44c4edfc74b0c3893cd281923724482e1897215d3cad17f1b27dcaba869971f7e24adde068943faa11b45f88cca96997291126523d7ae9f956908a0003e93b39d1b88dabe66ddc777629b8a6202bc0adb7e97f754b0546d5bfdd2a13ad7b316d199b10694de28503e77d6a514e376bea64 +shared_secret: 144bfb50c676e6c8efda24b8f5c94e9305dd281e3a6493d877f3face684df1bf + +# Rho leads to frequent rejection on matrix expansion +entropy: 319c51bcb76124b92f39820a5653c0ecfba79ec91d632b0488f4020e5df4e37a +public_key = 2a278678a38ca0034edc7b238f66c60b9ac1f309147c4cc7c78c393ec196c5b04c7906cc476b6931c494d0e4b11187948019cb75b0abdba480d61b6a58f4b8d9158486a7b94c05521fd7a1d0e8ba9c5a9612a8351f1b82c6db939ec326f34c13ba5497d7632e076c363157b156a289486a0b8a1b01a7154059149093a59cbe69ab6d8a67673b808fd217fada63f92402261327f84cc85ab50cb93517f4f3697e7b7c684064bc474ee617363f11711e4a7d5a422f68834abdfc685385877444cfab3b42a5e7649e0893d953b0db408bad47a6d8d061b884551e8031d4d2c207c93ff984b71a46c8c6b8174f22604c4a6d2d1c125117a281d37c2e001bdd6c42c3e3b90ea3c4386a7add997018a7330b0c2745f075ec10441870a890722d003d252923ca79ec870291329795072ed804a8045a34651191e824810b4c70b8a00e2c1504ea929364bef4027597f12a5c392889295fd6526f3d36572470a6b48188602093aebb3feb5b54db342bcd70c7ac881da4874f1d058dc3db26fd736acf9377ac64803a4b37743c6ea55969e13579872a6237d374adc29b5eb11a1d9b3aabc0377f550555d367cc7bc0c1b960a877a80a391aada5486c620f58182090436a8e26ac140292e547031ffb16f33c2a3cd2277a50903ebc67a22997d599a0037bbbe73057ef3296c7d3271cb17b13cc844b2aca8cbb1329b4886472747c026f63a1c4131c97dd8253c2a05e9a414b78c3c4fa2a6003712512310ab9b19090d7cf127b29aaf59923db8f33150fe2c34b0ddb8d3989513fd7b4a10495c9d86927b2cb505863b7bb3640912a39d0903db082ee47c0e8a01ab22b256682bbf6bb69b4b2394fe7aeaa939f4b624906b0c1b67665e6560f82c55b6b188aa7762ddd224e9648cc7c2c2e08589f948cc3f2f0b09150879a47a0e8bc1782c5befd0734120069e83814e34c663f115802b220f5277798076863e54ad0496aaf55baf21b5dcf60aa6ca42ef46c3c30052d7b78acd9e40a7079aa437908495c2506549750704577695f70725ef3eb8e98d88683501b3ac08ca8e5b4364c8c68eb5c7e4c690db96ee7194e5cfab7db691a67914c3fc3c219c56e52081f9ccc592de13ee5e266df71a350a63f1a63aa4984b2f4319e3399b058b4b56528bd14191e0657a76476392e9a5d84d83e87a3009b800004f60f4b4ba8d0bb2beac7362e762b417824e1539a2c39be5db8013060c76cd6453e313bbfe87a350982dc04ad7da459dbfab6c3f52b5a779c33047ab4f9ca16238d0049200d394cf44b92caec54659221e2e6b6078ccebb35b6bc045aaa331c8f29b55f3654e51b0ab20c16eb331843d2ae43749f5632056e101cf2ba7bc2921647aa0875f099cb7ac083ea662ecb0be57c383554464ea40f1248802fb9a48ddb4ba409b6db621b5395720b215efe32c47bdac84c5aaaf05c61c4dc2781a87b00710202fabbb077cc93602df8868756334362d3564baaba98c6c80fa15da5b2c924b8c85c918fa0d18bea758fea9b750da0c37751370b4300a1b6a3d7da6566375155793a97269cf4f87172832aee156ac1f18fc1179003637b3aab85db0b7b4b152b4fba7f990964d56c2dbae99d070419690a7b4293c6f345000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: e60755df5f91c38cab8e8769ae6c40bac77397480afce10cb1bccb30c8b8729b1bcb2d6be360089e8edbaa14ecaf528c488704870a6b9b299fcdfd910431cfb7da36eb755ad9fecaa91754a28ef2461886a0fea6c757f8e5298e047d5b61ded088a8c04787d32650a9124ade453b9b233832d699e5a71403ac186aec624d25ae3f8154c9b7c1a3723847c9b6e9f97870e81a6fac4888629e3b81e7df3d8a56f911d1559ff6f5fc15eeedbab77b70231d9e4a640ba4e1fef23fbcd073ae4c1793ad824b5c30287f24c52522e6d315e2d90c7fdf692c795b7634c3d935c98012075e0d263e917aa5c9f05ea049e1a8e8009b65c26d53017cfe5d2ca2212a78a5039e12e2b0490c2238dd693978f1d75551539834a954dac8f745a1fa48218eff905a592d0548bd927a5104185934f16c8c46dfe581f6c6ceeec019c73d0a0c041dce578ec5919b9ccc7f5df84822c4f5e82c0e020c6a9c326fdd74626da86fffc3a1067d3081d3c8ab58b3613a9d0f3013eccf6b3e5bc34bef9da1672bfd11d9b51222d109e5d3c66244d9723a4d4e1be1520a15d58f966349fdeaeb587790e2a0d87647f2445b8673be9045940b01647964e3e611433fb126e5619f8cc96a7f2f6bcfaed300592389ff60d40315ab87fd91215249b911166e648708b3c71f412c2b06fdb3fec91d287dcabe7c33b96318381fcde852017cd911bfb0e9bd09fb481af1494ab51c9057d77cdec4d615207d7637c007d2f2515bf532b7402a496d0687a82cf6a603348501585fe9fa987b47e06393f377832f16a6e3bd2022e45a81174a12de22b2a5af4ec78a55c2ca1488c564af9becdbcf2f7b635d88dfa14caf10fbe1ae4fd89c4d57eb04b35b810529b3fe3aa10d202b14e0c2417b1c2cb2adc02474fb4bc74d813dfec562e17c43fcfc1a35df1008c6bcf73a71e67525c78da2b0c5480edac41f839f8f67bddcc14b92d5a04412327a9e1cd34d5c3f5ef6cd1a59af4526d05996fc049a39db14dafd81d96a8f1b80d77a4f330747dc0bcec5214992dbe7fda726e4d0413ddac4ad0f583018a378c844c56d9ea0329904945cfb4f55cd0e0f4ff2358eed74675791d74cb7ab3ece8eefc771106dc4bccc7525e3118b8fb13956125402b310596c5ad0eea3ac8ef75f8b63bbe11ccdf7aad66d05ec052ed9b54becc2fc7ae185c9c752209d29c76bc02d1d05b693e12e660f18a326cc42a4ef4b6dbde69f4c4676c4bfbfd1bf3dd75c262e2f5ae9b4db247d3e824d1d87151c40a7ab56ad5fe9deb8ab40137860e87fcc972e12f6eca84c284eda1b925a2dd4b36eeedac18f1052f280ba55ce11f55b0f45443b4943fb0fa7354068259667defec383e380768276f97af4a0bb7dd2ef1669e69345d08155a0ea23846dbb9397cbdd023d5dbfc4a544572e82f21ad601f31cb01def894978cdb210b3617e65493f898bd6492adf5acdfcde3474f6aff97a86497b9fb6bfdc51882d3d5a3a35c4c80ca1c21fa3031a3985c7a2e34eadaf1ab6182c1a471721ce2d +shared_secret: e3f0f3e54c7a50d4047b6fafea1311637c76e6a426940afc55a432bb7a23956d + +# Rho leads to frequent rejection on matrix expansion +entropy: 00ff48b3769ffaf4e91c1c9110eb8ce9e2cb99f060b486b37035407d2f4ca517 +public_key = bb3c06376046b4f295572947b7fc5597b38596655f25f6603255aa19ea7f9fdc5c9efbc5b1343b9d214923121da4fab101076d9144b2881ab988092fa858a407db97248516981a9d4c336df1395c8920496f487c60d46a97368103bb9af9b62162ecca0c023b7bcb71086c1b1ba92efa1b0521b472539b0a87030b7477bdc4d980be20ba45c0aece03c49de971a6f9c8f7522c1a4a6df1225e836640966348a777bb325c4f4b972d484a74c1c743ba88b7d9a3305755992eb5723cc8280aea6ed64b827a0518e7b4cd2cf56bcd97023195a7aca9486ce2b50e35a967da1f8c39c9fcb895cd9895e116b6f58555ae82609fb703732452dd60274ed87adfe293b5a2be5554ba0c455836c98267e77ba6f5b5dd90134e126c703cc1648cc827754c9c2928073493332b6394511e1499c0818866fa0951f8c1400fc51cb9eb6cf37b4a3eb3959ed2af6995c480844291766a66d81713aa6351555068324f84262c9460cbe041598f519c8b387b442a6d6c873508ecccf6b2ae4e89bbd1306f962915a2d759e2e8184df59620d8bd60fb2464ba40188666aad85279423cea249db21b34525b55191375c2f19dfc811d3b77ae56b9366262834c2b1dd500ac17828bcd44c024e90e06e9a7a9607aeaac2c93d48236d114d352859d9a559b9b6e003cbb9a07c65d0a9f264288083609434ba7ab3a826a821bf2db0306a84f386252f7c56011b96fab3b3fe2ea43536a3cd39c2f11d1bc62e03365211e82e4b5287740aac771cd772575c17f0c712c6e1485e8f4cb8e11a89fc4a0296b567e835b6f18946cd3887b56bc4bca9327c52239ab34925c2440ac7cfe6644c9c8058f840143d782ec82793a234e9ce9a2d2f7c96085c6899436cb9c97ba4bc3187b2ed5e622c212ab557bb828e196e0336474e1231ae72f16233ac7f844abf5434d457aef124963c85c25b7414df98bbff69008c27b9f25ab2d9990faba0bd9c00f7d27944f718fbbc1446b3a0e98611af4c22e4ae958ee993f8abc59e3c41252b160de5407a498a0d4f90505da3e90a4b2f8697e99ac7e7c769250a5bc489a74b44cae15a59be7f5922705ad8deaa41d4cbbcde7919c3360e2892914640d19765edaf3203ec950035550072a53b379982b3a3d1d18763f9b1601854679965ba34b1b073809ba675e09997a8519510780b593638dea00cba3598855125ac71c91ad671bca1499037b7791f32fb82134319b1ec041475a238bb5c4ccf3524d613c8aaa096217b5afcd2c4803720b549c8916bcbfac990ada5509c9362488d66f80b2556964a856c06b746a6a27877c0a213bd501b939796ef0cac630705d44e66a1d3c2517f940bbfc711ea1c5dba3a491b61fe4649428c6007052517004416b0201f2440d467733d923277d54bafd729d84e2440270a259c14d88a4564fc9941152b591aa644fc93abf08371ac162b9e180c0fcb2783653e5137a9faa04ba137113697b11e419dbd708f18b2fb5f20409448f31906c2a557da57621ad4242524a8f9f754e199a2b62e87132a33af47166dc614dc7034935c4b21b7c102d71762239c03084bf0e381524a94b6c22a7e499baf0ab6c9bbc8573909c8e99ab09a44e6d3b017dec2cba8b60c134000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: d388adf22faa385735ac4630979b0d692aab8fc502ac7f8a0e3561400f8d04a4447cc9ad1003d530ad2f7b5da076b02bf291aa837ba4212d43bfc514ee60a422c07471572340d7fd5fd127dd82283a4e0d145e294841124d0dfef27579119d8a9eda24bec0aedce586026d1107568831363fee0187f8a0bfaeb384bc9ec4282d03acc461e26c4b2826b15943d95d96ed7cb72c53665e19ef8b4641f6eef759a1d7fe860cf72c342b3d3e2fc784269460e0a1ba6c394a9c24db5a4c5f6ac523a155491d149806d73550b2b9f8f00074dd06ba24188a3bbb5f3370f398011899758365850054928429a7565ca5b9935f5e1b2600a779152dac16e78486a716a393cbb917f060c83a5a0cd56f1ce4de12bf088cd5e80e540ae97a2ce2b8ea35b3a7011116c7131aef928c23809b3ab4a464497d4be034543d5ff1112c6ea13242c4b60503607b9f4de544cb49c4580518e15ba51c12518312cd44dfcf39a4c544c71a84cfce3f70b789e4814ffb36c1e0767f15ffdc82ae5f0800bd8e2a973b8f30f34ffc792c9f7db5a91c2e0e02461ecaeaf2ae5d33e879f01475e102f85609acd1a8f0b1fc57739c331c25bf0caccba793b659d90483c220bd9cbf0691c5a4f11fa0c87fd630243a9f6e9d6082017dfc84b6ef1cb1fc793d14aad856fbbe051c724557eac7c8f123fd50c0c8368d48f153ab93da02b09fcbe5a91eaf3ffc9a7837b1e68170cd544057afff19163d3ff479b1d2be4f834a5b8ea082e2e37d9932936e5b3ead4ac83201a504ef4bbb6621349fb473aa38bd0370ee39105c5b635c1b149e263f5513867abab92c00c4019e6206600829f1b3ac1c849139cd4e04247801b2d126bfe94c6c019916247ea2fec03598aedc84197dcf7db900653fbb5236c52b640f1b489d79ccb4e4d062e77b6f9772218f64b02b3c29044c62279f11755791d8600758850cad537800e77d7727a63802e3a256031c94f3cd3f7cd20e10a781a29c2f699a3b4425ba4198d3e9fb3e5fcc726d99bc735ff16e2d1eaed171fe4ed00b0fccd81a8d08dd5d4a6c72bb8909ab98c35e0efaea3e9a4ed31ab0c6ddab06444150d36637077275796802b792354567f2af4dfe79bbc095f2bf801db578ce720e8e4fc9ff772d016bf400e5d330560aa5d91760f3dbfe7c0a175f7d0e730665ac079b4aa29f9b51a20784bee6020be8cd3862b3d992863d25a8215e1169f5eb4cfda064cbba34e1344009b461334490f7261c9a6a4457fcfe7b8536c59a8ee36703e8b439feafa9b4536119b863a91805706dbeb6e79a9aaa8d3c959acd75ed03cf0137546141fce29dc5723db5356661b62a5e2addc6cf479cbb4b6214e44b0674381fcf8d23bff22ab413701d8613cb03e140e85e6c00f75204a6fb1ed29ce15ec90cceaed7e216876b5e5b21b7e99da01f6c2c6318591e57e188548dc9a98e14a61c472d9726cbb09635bf99b32fbad21e4777804565d749b380924d7d5de3ec6be5b4b2cd2b784abc179b478c9237e111ce04f99706bd85c7 +shared_secret: a8006ea55b49d054de26ec8780ee0928650ba04f33699616396fbd980d9bbd72 + +# Rho leads to frequent rejection on matrix expansion +entropy: 4960ccb1276f96d7aa55885b6ae6f90343d42e1391e8241b5952931a979837e1 +public_key = 1c5c222e297e1951c5424665e24b2f8c0a98fe5988a202b02db7021b8caf6f390469cb3a3a44b1bba8028572290ad3987c84380706046d3147f2a098f6c11912d204ca7830b49946da095d77e4b55fbc763df31a6731b9bfe871f8f383d3645a44b18e8b59bf1841c48da75a66a1322a70c186d7751853949a83af71494384221876695a35eb526b3431b4c02a00503d962c1e35898cfe9666b5b71aa88309266ac0cb7c50121707c06086e4d7aaa918ba75f2ac0502a43d985eaec44c081b7aac733c065b2af38807477501dfd6a84436bf9609b5ee21c78e2c5ea1e2053853b0ebb570fec357fbd227123683292c58d082b4990c7b8a9b8a15b1a72017844b572eded48d2f902621280cc4d0174e0a04c712b558184ab893bb70b39f7e92b5c3ac61c4e0a4070a78a6b0bed6170a0e07606fd15f0dbc553c64672ca3b8c30821d6973a5176aa2a0343fa15a75d26953b965d64d94b6e3c5873fc2ecd13199f9caee6672847a87dc7d31534870502c3a0b9493aaaa5441099b29a2c0078854e13f15e1da411cd086a12f587ccd03038c049e8ba7532db25d4a855a1f7696a0737c1fb5e2130a4f3ca0ae1a45429a44ee55604e31858db353241d620818a5b9698556833398878825f22a2f0b739d39c07242aa2d349002979929af37c74457683f940e503ab5e475035921abc92b5850b39f6d2052f811a869c11aac93fb6e063e7b495a958670e276e6e64bb63268bcd01064a782ba3443c4e0255e3db3e55ba7082438bc303c94146bc67270a12265eec0637761c47ef5c19fdd22d4685c335146998a4ab70e6b3a9f63c7f95257cb7a7ac216c480568056a825ba6b6a25b084a604349bc4fd668a0c6bccf84db88fbd504aad20b68b67ca7d7c9881b948af06ba3f172456b250850aa03580de5312bd85b9ff9e746fb26c8e3da128e2ca463bb010a6872bfe975947b9b00bbbae5e53cace8380d1c3b34e71b35517764635f1c29be58b9aeb4704b2bd58f81a7a20ed1a0a505a994b0a8e71a72431991541c9b39d4b7de179df2ba5dbc12af93f057358301d701c3fbf119d1f450ba9900c483546e3cb55716ab5f193dcbc6c175697d9403816b263bbb71930f55081d8c945db976ff8b130ef1164d6bc8d0d1b2244a08b5903587932bbdbb7d60a29ec8016c9cd30ec7b81b1bd527b59c063c134340d35495d89f3d46728159874b8cb8edeab232885d635c1e46f4653c70c95aeb0370da4529d319a812c9b9d210f8655222ab13dae5c0f9bc3b6b55a23edc15b132c937c0833beb8058529a1f2a880d7b198c947c65db8a0423848720248d7cc937346bf0e01996032106192c58131335fc52b6817c97250d71f613a0217fec98b713a08998b8932ce850097361f077683147740a8a18cb16367fc1cc8771bb50fa550c667fa28822ca407399634eb42a79250483663708819c55fae2c4cca04ebfbb7582bc84ce27c2796955d334af342589ab196b3d03ba7b58bb209017c69a95672138b526245137265948239476496a6100d9ec7092d931f8009bfff9a7dc22908074c3e41a8e6ffcc199fca488753321467850514ff99606b7a8b975c03b05e3c031a99da72bc953db617dc41d664cad9913000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 852e70f6d10dcba613c39fef87c4147fbe2af99288ad6c18b6e266dad0746ee662ad0926f4c0ebd669b27b893777a545d12744de0ee34da7b38568eb1809245f9a03547704e353ba537f35d5784c37ca5cbf3696975aee1ead6b376960131f6e73250307390b74a10645cb38c7c16a7bff98324f994e6e3a8d7a0c0ceac903e8be98892bab7d7691ca83233d61a31c2295a134682176787a40a263f9d8a97c9b262ad343f3823739bac811f95014f6403c0bd8a7fea4064454333e8eb63dfff6b3a9afe291217b0b0178c075cf04ee3a0895606c422e24b634237c1ee72784e14af8bfcc232ebdbcd2b493efd28c9a849bf47737e20948ae7a399907b0f2a5ac9ded63aee710a30f76327f3e1ad042dc12776fef148daa0acafed5598650eaf46dd53998e6c38ed318ce56bd35ed18f99a34fcb4f427b3de31f4fd0ce2bdce0f80248ff2370e08cc2eec3e6a71783aba779abf38a8bcdac9abb75d80625bb4420e2bca3cf4d8867bab62d6b884ae9e6f98099458158947e1169685b1a6f7d6f554bffab3dad8488e0a159232f3777cf85d9dd4399a89f1610943bb7279514e0fc3737ef8ef9ba12a4db6d11933db6f57c48b54db03470b0deb7dadbff48d75ccdf374f8bab3b7d3752c8dc4b513070fcd884d94e435e63b4b40c15abf109ccc5d9ab51c4d069685550baeacf37a6736daebad595f96e2f82c5c458a27e129af4dde2eac2a5768f5e4a4970a0bc68bc4d0d32fbc275d1aa988ea425838297722b826852735c4931b97e145be9c6b399bbf4e970c83e98bd5c1be7942c6419b0819e600015ea82ca0d55894b0ace32f24b2652424b85b0f86755f1f8db64138a704cb6ec6f3e2a4a5e708713398101e0cf8d6029ffccdddd03d8a8074792232622e00384ee5b9db3535d7ebb14713a32806861877ed3ad5b293980b68f0408eedbbeee9bf449698f0ecee6635f0a8905d378d083f80a482334d30443c139cf5a1e2ea7048cc4a1829ff36f9e0f674ca22d794c2d7e9dd3cea60318788e56b3e6670215b82acdd4c9534fcf5545eac516261dbe4bb2e7fc38face7c59668487507ac122d295ca90af4035760c9b89ec44f432e8977583ea2da6a21249f667fbbb5c4307bd3f2e47ddfc8aeacb54bc33d1365ca3b6f75c0b50917e2c84849f1898a3e1c76ea67b21143f39d4002026b0e2686908bb9fa502a88c7b5c747f57c13b9704452c1ceb14a5342e40cad9987bfb32c769f110d3d39cd41178e248d51fe7d7f1c55a5f64764814495cf92a4155640a4d3411a74597f4c8571dd0662ac2ccf0ec3a82750c0ba5c3745247b7f09b62dd9c6484a1e0a0199555078d3a750784c96be465053f3e024189cfa2875b3763971b48b5c8ecd155f879f494d9be7f4e27417a6fbb8843200eefceb4334341f8a5a0e98769cc977979b405fb0efccbf442008f7cfa18b28b48ab56682a91d8362b6b5df54db3dcdfa25d4740a13ad8dbe014b210ec14af156b34511896e64d08f37b2cf2a383466351270118846b6fe505 +shared_secret: 8da6007bf6e536286b9f65fec6f014680d193306a55d37978cb56b245e256eb9 + +# Rho leads to frequent rejection on matrix expansion +entropy: 456be124e7f43803de5f734ea016455d68164a7f054c003f4ef49e46f42dd8d0 +public_key = 0cc2bf4fcc4e0ec002da4250cd5320095843f29795b36b634ac922e3796ae428c894b1703332b83d9759027588f1ab2539180b75da984246a745ab595c46ce9852029995997ab27fa2b94e165025e7e7061f2cb35a907eb6ebb0e1d2a29e139f179078dbe13abf1787c3282fe45a1578e5752b6950e7428ff2693c6e6c4ad9b960f024a7e1f41783f7112489112af688b762819b222e1d6246717b730aa9b224ea64a1a45ace60257522505e69bd1b2235f8d71f8ba5b5ed425ffcdba742379a7e1c28af1c8b35994324051d7b46a6047b77762c158fd5977e57bd4f398d4f1a70175897de6c8a3ff6ae90373065233d7c4a0e5dcb8b0731914b37cbdd29148be2649f055df6bb82fb398a630a6c556c3fc442ad78e24bd1406a35d82c5f582610bbae17d118b3f0347bd84f7b8a6deaeba8c698c456502eff6203594966c1f7413a056064d09bdd273b0ce56e506c0cce2267df24a13d7a0cb5513273f37438b568c569681314c3b6db28e05478e075abfdd53cd9291614c2650dd58b40f66b10e3a5cd11ae650aac35821d5ff612d1662a3714962b3411e5996e3ca3b839a58898848ebfb869e9b214635109129c333e931b22d34c63c96a74c3745be124c153512c060ccc6a36d244139f106bcd78808db7cd0dbc3e5b452ec753a643107a5f946b8f319a0fd28bf86c08bd16cb0324c44a0ca5165174f4681b6fe85b21791bbe1b11874270069839213b5829aca7861ac642e4757437742898416e2988c3277f9ce35f82218e9eb72afec300b9e59bd1b10349994bcb34c9fd2b31ff7482ac4c75b693af46a581dd85cf33d21e600bbc2921ba49053cd5d28595799fe23541a7d6b4e4e6b59f761e0339157d5a272406be1a776b3eb2c3d33055626712b304c4e651996f26866dd8a99c607f0a044a4ed4c04eac8122114eb6f567e1133a7d385b4edc71d19655668a86cd64503f0bb1cfdc06d9d387e55296c4a76a71b78e64daa58440264a8a6e73d2bb8c028ec970c3fd7535bcd65110967cff563ee9c5777a465003fa7ad97230c2c76bfc41b5c9d26d9a7c3605905fcd99b36ad5c6ff585513f633b26617f144a3dc4c70cbb40b7c3b8d0331014fbbb7f3c59179d226dcd4758ccc3cab8679085103e8949ea10c796204ae993750104a2123ebb902aa8902b6241be505a9e3a6734191734bba77c969e92a9c0894367dec1f0d50ce5046ad6f3aabdb138f5746a737082bcf6b8d0777b4bce1a9a35b2e0d794ef713736b4966d1322594eb8e90a5af2b42c2d7874296401f4e6a66c088a73580362031c9b0119d22dc9e6b649ff220919d42167f5ab863603d474051e3c424a0f8516ec0652545c6bf0831cd8aaa992c120d2477f791ba1ff56ed2bbc2e39266cf618580b7b19aa94755869d7834a7d4a87e234c25c0e595cea31a8715bd76d3bf5e6badfc4a758d7bcb88b5a018228c234836a0c77bed231a64249a064402d5f0b66276113022b3bca4486efa97103560751b108a5a10579c73c1e06b0eb117ba5a635b459e2f3887734b83dceab3ce9a7dc758265471b795221958359ff3ea282bd2c099436fe3d3c5b2000cf0db36a63123e9c897249130d1d27bba527eea241d8c930ff80d000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: b931ab298f4492e30329ab86e3d92e6241f72c568f8a2744d493c2b02b8d5d41470f0d73ffc08deb1812a6f4143f97afee2682f6d4809a0ef3e97ac2ae4468a5d436c5549f751b440167f86cf238270eb8c2e3d3d9ac004fb9ef5245d32b4740fe79543c073b41c8a1773f11b41c04ea5eaa467758660c17a6b38cf19b151e9b6c68fc35708be261a9e7cc45d771853132a5d7059e3b6b9bc94755f451452f444377be5821aafcddb7e708fb80f31bf1a89e1691009e1e36b09d754870e24fdc640afb41ac6c4260b68dece256aa9467dfbd29a25ab901bd1dbaf2efc055263f06780a73fea14bafb12f14ea2b6516c97b1a9f56713554b218613510ed7637940272b502ef32c3f99718efa3fac323207da815c6c5d04823dd28f99049ec50fbc590f519d843e0cece45713e42ceffd48dc1b7a739124c698acffd4fcf1390351af06ac1212be3abc5f8a51369c57b0108fc593c5d7185686c6a27363416e53f1d578e7066456e6164c030328ac53c2ea6fbb6ff508be8c2f973d3a43476831c94a7e85de88b71fa77be26168f82ca3620d1024e2bf998340271a4e2df0654ef1b6c9d5a8d95ace50a5f5ca3d321a9286210a21ab97d64066390e287d85345d22f6b42d597c5ca8888c1f871e34a4d1d7e89380abc284afe3f1f7784d47f75c674354825791191b2cbf5607ad26931bc0bd05ad2113d5c93c9e0e71a8b6c69ae4df3383baf71877bd3274de23d68ae57d54e3679b40950c73fcd38c1b8ed7c58f887e5cbc74bd388f77b72875828667b143571f6d0b69cebdf828b49d6f4a6d9dbbdb2188e1b0b30eea6a5b9970962f00f8b8440dda64629988de710a3e086e6a220d27358272b680a91195115741c77ff04c0bed30a2c47422664669aee91d263a196ad48dc24bd386dd9df5724965f2af73bb7a406bf9d17f3485f140b52fdbb06b9153bd96cf0be8ed4c0024571f859c8492ed4d970e700e11360d4cd51b3cb29decc38944a895978824ee94ee6ccb6988337755c07491f43526db47e557636740b393d460b3434fa70833c490ff59aa62e0fdff9a0e664dea7425ee586c29c7648a3ce8ebe5b441f647596af140a87d9525643bd97707cd910e17cec76ed33f4dec0c5222ca182654c8b5ca12d5801ea4c26bc7ab9877d9f838d8455b59c5590f4c602887e219a12077f9639be7a6f5d227d64540f3636c46cbc1461e665f677b0183c5ce13f77d923b368d05030b04c16ceda5d511fd0db061ef3b626e50767cce8a5cc108486e941b7912d944a7a0e0acdf050eab2f600c242c250bcfdb93ab9218a4b495457dddb959e0a8f976bbe147674d5ee92ba71491812ed10fb7de3e607d6ae67344e0a611a6e82a1b66e0528598b30daf398c98d5370e6a1630b7d10d98b12a1470fff4c04a1859415595362e29c3245164a2f1124189c3c0e7b0c875c658fab040c5e0ab690193e3eb1951f24ef0f39bf51fdacd68b65b445266b758dea04de3b3d3137c9445351e9fb80f394b76f24383c49c747e9b15814 +shared_secret: 46f591e3c6491c7e12d58a7d06ea5354bbb77337572b70d94e4badf7ce394e08 + +# Rho leads to frequent rejection on matrix expansion +entropy: e8ac9e76377d67d84f85a142383e777157805be0d0f679ba89cefdfa61583780 +public_key = f8569c9dd09912b200bcb155e7f388139675afca87b0aab4e4e2535207b4d1123062772bc8aaa028597d15f02f1240b3a4aa96c1b344b0b892bd52b3856ccf6ae94028574f13c09418eb998f741c1607461bdb8cf4094c795acada2c015bc2b5f4da99bc85b6715b6bd57aba2d016220ba2db3a9ccf6524474e0c3cf0003376b2aec2b031cc4a224b66e139397e338a8a1ca0ad7c8a8356b09078588955157fee40e4ea1177f7c13261427eb047d14a826fbdba1cf607547a93a61c8a5ba200abcb676deba97fab023f5234b46c99cbbb38f27fb68b0a2b89937be4f61b3bad5446b74542b52048ec9310b1a2c30c25c569a2fba55be118472f6147dd65b171c654e8c3acc53637a2f409dd14b99ab1a772d755bf34a43fa745f7d2a55600a8873a5cf852b1f6356bcbc2a70d134471c7720918528b63270e729472d1093ef72629c521e49508a3e584f81250717f73909e36e231b0883d9c474ea0dd64400d26317fb8569106983b4bc3d0818987adb741d547fb15235811819493c1a92f665352a92495acb6981aa5fe83fbcf620045275017bb652ccce8b748eb9354bc374c131a74854f9a2bba3173b1c4004607a2c975e3ca635737a7f5bd35c8798174f6bc30473c5e700b42a96054de8237b1927f999351f370f1e241d89083ab9cb09a9e908fa82a0a3ec9f37375f30eac10e20ae566b4ebf811513825baa99c7a9265f73b2833808a52a755bb106afce71721e71c693f29b402b8e483000e1a6375ba0848881c817b47d3cf8a2d64a757eb80e02109a8e0a873eda7333e7847902a4f4c44e533a8a8039516549aa7f172579e063d73999eaf47c13d73749796dd022cfcc9522738127a1c984d9d3755c29bfc6b52c08297662e24ab77790c056101bb2916385bf418222d752408ad1843cf6bd80353a2068ca714c082ef86503064274f94065926fc59c107ec5594b365606b20bc010946f60c7516c4e59c33a527ca3229b2cc35459bcdabb9dd8170b1b319571b535d514f37b3de62a906a05bb90320b88b989d3204511a2151bf39425a1572c192d8be2b695f18dff4a7ba7206d4409c9e51c54f5797ff9055837d2459dc85233d3c95a597f7596580a83ca3cd6ced5278c24142f90b653280b54fba3159147cb08095422d4765112030f5a696a628d8a67b90d27762665274c338540d7a32894523bc53dbfa760146b32edb938461c14792216a4b94615615afb151604f31b518c37ccd502709325a2013aaf22ac49a67350067f405809addb023e9a13d6734ce5e71f802a147c191536eccde7a67295bc86322a7fb83308f40a5517b61a790a8fccc469dfd752a45416f352b6eab11f0623551b49a5ec2754a674c1847bcfce66c9f80946eb65a419c06747c2a037a492d11947afac79db877af9750a85652f6b06447216bd69418a86169614e27b3579a8b3b669f8eb8b84c252574c856d91b081043710d0abca178b215854f867c5b0da0266977fa1e75d29d560015755f64b867f011369ab7189a916207c99deeab286e635b4aa6521da156c310cf4a592926b33f49062c94129a9547ae24a7e0bfb6d4f67bfefaa68cce739f46815afe593e8ab3a63a90797c01aab7a5f0e73a2d589000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 87147134ba6c085c2b878dd751b77273438b4e9efb50696b22e725bca466abff4ba40a150b68401f043b73127177e579be1d727ad37ebb79b2f5d3ba038d4a8a6b74633f31bffb103290c0694beb9c4cefcf47fb2f33ffb3d8b6126665cee64c6eaf385a816167d149a328df0efd29c4bf324e4f3769f8d7dc784da38bedcd8a653a42b0738661d3799db5c9a8c65b88849d07b27c5c88032a3b090026fa2d818a4e26672fc81a97769e432b217df4c551243354131100947f91df1cb442200a08eded975c39b74da9c22dca588f8fe63cbbb6470e3b029eebfb5ecef2825e834fdcfa2337f55571506498dbf2c97fc02baecd0d14ddbbbb4bf48eae0de95d42cc8b364d6703574a0faf12f72df2482b78b005d800e31bf1492f4250254a0a48990505300d90baf577191d8cb6161a4b39d18c84515f26216af074d110bed4b2af846ae9b13fc485e55f9a72f7347efb147045f27c914a415fffa32ab9f8251a03fc7efef160da5dc25e5b5ff12fd5e999fb7e55c9014a9866e2018d09a4e5b3a3c1c833985e3bfe3cf484a6910248794e636822c40f6a7ba6cc35baafd7557e1000da487574bc7f252c9b82b19febc1455de0b9b79ad1f69931180b47367c8f621b46fc09d8a6d43d91078121956eb44ee1f1548f8d3513a300c626aabe660ae38fc0625ad42afbb5786694b747c65fa38292cd5127f20d8ef0039daeb8963d8639a17a64012357d1612910591faf05e842e23f14faa4b01cb657bb4a4cec7a11d35cc2dacd5556ae116a1dc53a82d1f9ce151a41dd05c953407669f86730f9ffb68478179306d56009f2e937e77995937ff72df576c552672893f1f4021d1be8511ed04d02278c9628b0ecd3182a32ffcd9e37ab0795cb161b50ecd0f97aaa90a9b4af816dcc21ec5f1f54e7170a4167dd2017325888732138e854aaf7e2eeaa964d974cfd3fb810386937e92ad92cb4fd0b730004918aa6eba5b64d1df55f9c2d0d4c2db8188918b7812a71592d4a0924fa67b62e3feeb78106e491cbb7ac9d456c3bcd747db26ebd3b822944bbacb1e742578b35b4d6d9f49efca4c929276ca6015739a0b4a369a7961babe2ac95b3df89214630218182aaff57be9268367282e4a040accded4cb93170cfd765535e26d2ffcc4e6eb6832ebe880497dbe5edc3c724b659727d5aa9b067719b6a9f02616504cd3eddf0d56e33766856b4542132560619866958f8aa54d434d302f9280208fcd3ff42bccfeb450d6ad4f0dad91208d357b2174fa67df22ea7b4b3176843bdd5e581654fef45c16017fee95b92e5a1f33cc6e3eb1db250e7c6485d368f8fe9e53f5c863edb436d7ea007af06570d3725f07213f24989a637d9481ee38e26a4713450d122849990892bb2f95abb6c402053a9d41bc8b9cc9281bc6a45e295997a1523942f125c3f899f9722397dd1678d3d30e43c20fb0f57ba95e6d825adb66ad7cd23c7a921709b921bf1bdf0c22838ccadc9866c61880de260f32aae94d6fb6e5310e72ef8d881c3d5aa08 +shared_secret: 05c30333e58ef628d111f6aea0cd8eaefb393f4e1b9ea8ce21c16decc506a407 + +# Rho leads to frequent rejection on matrix expansion +entropy: 2fe6b9cf4510f212839e348d671b3345da68a477f57513ce363414e87299a717 +public_key = 4af3214683995edbbcb52acd7830454cf669b608c3cda86752d97e95c16c99b258ae01735c94a7bcfb585f451d58a0673103b203e32f64dc94b301363cf1542202074458b6d6e8cd0076327718531ba40f2543a1a91b0fbbc76a93ba4c6685bba5560a9d6c6c42897fff8594ec665e311ab39edbc99580c35b35796b0c3b0d89b8658a1b140979ecd28e87f135b5b781374a766cc18f1fc03a7a3ac7f5fc0c639a2ffb43bbfe74c709b303abb1432614bb3388baf38980f18a141d502797674d76bc8159a8062c79146f24973d090bd70390961ba5ef62a5575abad1219e5bd2c3a063acca14702ee58a32a593c5236bbd4ba938a339108c8cabf2a08516408444584ecc4124991cba6219c7f031ece14288097ae7ca9fd370a52ed7835388403816bb1bac26d56809e9ea77a788c8d6bb215b0caeda1717884913754c42190cbf10387e56f92bf46209fe448312d930cd735770b6ba940cacd71a04d1692044a1930b0c11b701c851a26c2462b0451930180415de6a1addc504724042bb832faae8576f2316fd718657d7ba8c975f6584cc91c9cef5609a433b6cb1f08476363687944bc58c888a00925cdb862df89cf96b5a9e7948c53a51d02001e0a97bcf4735d99554bc86106f0970869a4470794e20051723f40ec64625ade826bbb9bdf962a0190c708c0946d96263ae580e0968b01d03c31d494bc002737d990bd0252662bc34337b1093b97d084baa73eab8636615a832b7df2a9c6196495ca7422ebc208d6048e16c2390c1c91325a30f9ba64b06911fe41b5ce35f62c1567029018d34775b6a0c8f70081e5c12d0c73dd6693b34e29c6c669fc485c6b5004fa06a7fc2d2c995bc15b477a1f7463d12016613b24332e4729f8784f9024c2b4c2e91a9055cda9347f7cc02f532c3e80620fbb124f0b8da57abc6e421606b2422dc450c5b97ba040d781a0ab4ba5cb7998aa5ab8a0681339dd4b8c1eb77ff830a4e865f36897899d003bab7395f5b580b78b0046014181c640341aa0a5920b1609245f140bc7a31fa942157569096495affa32248c4a67ff5456fd8189b5593412539173c6fc898118b2b98535401ccccc1fa7945eac36bd248cd081925c941937213263c81274bec5773abb1c4607373029c6fa59723b893fde7b77124929361467aeaa1a86278e6b3c47a68cbc28781ad199c68bc09f3538f2933aa011b800f9609f6887ca4fb3857f869c1ac3147a842359065b6a59d999465ebd4228735a5c7f984cc93928d4c7c44ec4d90d55d66709ef68827df87abcdf433f79342ad4152e405ae69f56689747ecbbc0b23d55c5f86b5a699a06df3573d8715c6e667bab949da615dc1f9620dd28d2eb1ae6674506ddb212b315b7c89b050e48fb76a4946b7572e6a187dcb4130c80f38328037e2ae7477bcfaa71efc3531b2438800744116b96a0f48a1e549a33d19b0a05c206baa07345ac3427578650a97ea1150ab66cacbe848d39c0c744612b4d0738075251f7bb508113126a6b0e93b67bef50e07843c271614a4dc8799bcbd633a1879195f570907c05310fc91ae2e6a7ef474c6cc1112653589b32393d1bb6d741c19d616b6a93c2adcea5762d35aa285702882463b1d5cb9de000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 738318f855b7a4cf13603f7cb528da3e04dbf38e61b3947e9c98d96d4733e6a2096a06afd90b4ce3eebdad11c4635d9e1ae8e058908df28e936cd049100ce5b69a29f80ab7e827c3be492bd854d20f9b0788fd3c933f3827add6ddfceb81a95f116d48adbdd6f543bc312fd5fea9f1fff44f97ac89b1695ca27f6afdd4a01eb80182830f4e1fe457f1dd7ea64c496f49b4904e47be3919a0d90da460ce60c8a6d66bc8d3ff55a8a580899eed0597981b9118c7deebbb746d015c8e117814f9abd649d6616bc075239cd7301413c4815eb880f7162666f296e06e4df2349272058d8f13e7255707830e98acc340195c0f0b61080fa8aeee33f1ef7a02e3faad19f1ced92c3941751980f5dd3c33b933423ec450f16543f480b6c3773764cd09a469db5d4fda16c64a0b80105f796adcefea0cf17fb41887e29d56b86d35574aa8a04992160408b6c30bb6370ad3b2eb0b8d772ef1680f1160e4fd3a6431ae5eef86ba8a4550b9344e2155e7606f211e85160642e83a923c76989d5f131986ba424c2d007b22d3efb868fcbdcf0b78a41b59d34c9fb24d3d65b9fa3bb87e36601ce99ecce01cc44bc120e983aa0142e6a56a3a6a19ca75c73185d48bb6179f8dece198e59ab821dbb83c429336e81f90b562f3da63c3fc910a13b8bb04a8e53ec067377fc1f1db752e9b2caf3827870e01f5f632734658a2c69da353959e5f00574d595bcddc551bb728bc13267acb7cade43b21b244a54716ba3b765ae331fca979948ded2c7fcb9a773d6bbd4509536d29b730712dec068353fdcb9d267b5ef0f905f34823a21a1be3df2657a078e678f6eeb6e0ab1c65c034b329421bcbc8f505a58a78d250e1a003d13d928cd6d305842dd127cfc805b02280d6f6146446b551ccbbbac16a4f1316359e5c2b801a31f674ec5a48287d7818f7e8e56f53c77a0004d8cabb530f95a54477fe5ed63dd47bdbc3d3d26194d9a488a909fbd4a3ec97163c7b8fd0467c6bc20d1cfd03046200baf232f6f5a6798300b70c197f1f616d12cdd17691406636fb1094a2e3e4343beb84f9a67146921397ae9be4160c1c81886db504591122ae7c90f1131572e54152ee1a203f521405bb928af9441a63fcb5445c5e9b2afce13800750babfeb6fa88994a8330d8d51061642698f02380d853bf2a57a8eace6b1d52361820342d00bfffc2dbfbbc3c0a8699c5f80fae249dc1bac232383b6eeb243d9e960809fafa5bea564fd610ca7c399c4dbf5000e4386f4700a561450d02d92d8b5ccf428306a9e57eaff931b31a4ca17e4d6a179db2abe53452560649f5b8f1858c0f66bf64fcd440b6384dff5e62f8983d46d924d85a4b449543ef8d5e0c023353aefc8f552e186b84378a1c34375cc28d83a62b04addcd057f4d83b42926f811b2f9e0bdf9d59cc1f65dbed5835b60404c048b386a3d09e0e7700735fdcb124c4238e1874f99703a685645cbd5cc3506799984d0ead93cfdcb6507d0cd757d2c0f1e350b17a1258e65965c2c6c092b6d4663aa3 +shared_secret: 10198ed9166d13a1ca423fe3b36244be9b94fe16deb306ad742f505ace69e1d3 + +# Rho leads to frequent rejection on matrix expansion +entropy: 86630b4f72820d19e9941784183b3a0d770609becd6fe0dc463cb6edac432d59 +public_key = cab527e162b7b5b390723c83ffc170e3e153b16285676101d66999fab321e9577d9f284fc3531e50715e790a2714e404232640de9bb0a4649e344ba2c33977f20c4488463a0dc58c1f71055b353a749a54db7b9dd1321d1f2812ce8a90a503a1e0e36ce0ab91309424b896bca7d39575bb6129e0460282c76b3937313839ad8672d4a13ef0f9c738c3c473f38be4a84de989c745576ad6f3bf7933879f69b8d72b93aff64c3d29292a794db4a140029519b99abd78017e5d84c578369a71089ac7b93c97a114e74a62c98b0b7ad707e60b0332b82af5d346f8373c11c83bfe543d8fb10cb9f128f1509ac3e02ceef44e52070305853fab0831bb05bc4ab8b311a2867a051b2e43a8254c787fd437838160ff13b752255e52a466b8543865dc61a40681b1e74eb7504442e943f99b7a4a695119628dd8603f9ce29bb9ab9202cbc52b78bea806d0d2305b442943c3d812e2d2cf07f2c2df778c6d6794114189162c537a9540a0bb75660548ffc56b1a5598aadc5055067f87d545f87b5bb232ad6497bf5f68110d16530bf80380410b67a47b081587fa78acc0621e70624605456aefd9ae2849c715a89a00332779216a6a8b3418196e23e76f919c6d4476b4ca606fa212258bd520e9d9162b066ac4e12568b532d584cd091606eb9a2f91882daaa2815230bc21ac33e8a8408be21b13c1cf90ab1e6f753843f6b5fd3446f93a2072cb3a94d5090e870ff2d788a94c912837899c2b04598c0085409acd1767214c822cf3579637c8beb94ff9b6327ff47ef5618e70a5bdcc76c287551ee2ac24229507b0d87b779cc59be8cc4d30ae0e161ab62a05c7eaa9a209152f37c798a2b1c76b2265dbcf930b131ad88c65224c4a5a2d1712c2a631c2982bca5afa6029e52824920c3c7b3093988d998001bfa23d9b01c91b111cc0fb7accb88d34f34bb7829192d21923d15faa81267e284b7aa18df181a02932a56dc4662f19148d055a91f8a3d97407ab9257108b7447e24a24c12a65fb1331dc2d06f60561d7bac9c993797255340c6770025f776270742c88ee4a899609304d75b55dd2c303b97cff2871cca3bb9cc8400b930087571dbb4c73ea1460bfd34595650098f38548906c2a8154b4017626a6b8a1db4b2a221c010937fcc8c06d6c7132688e1f2bccc869ca8f881303a52bc6313149b6450de00728808143f438be904c8de5923d8a02482a3a201b050d4b1735867eb8e7bf11d5023668c37c867d156ccadb2c383e113dace4a090aa9c1cc530cd17a94fba6c6ef062eb357e3293b343b169c6e169209b0faf0bbd5e42c3b6c077b1728ebb2a1e44d431f7c34835d9b0021871aac86d0782448d08236d94c0f69a46090b6c5916339baa15222a0496600dbf012c20faab5c7b7613c85a5c759d178c6a9b1596d291ce6b975363e47331b16735db2fee1027ffd018d8f338d712b2a79729fd20392c837fe40b3bb0ec9f11fa566e426637149d9041088419575db0734d854d0a0c769550a8dfb80da3cb9f4a7ba9b4c84e45b3457007ba2f380d19098d4f915023ab00e0872dd6485e1b365802d0326bda7c75e7346b001cfdb5710d1746bfccb0946151abeb7122baa4b79c4f6cc10828771cc916000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 37abc2d961d3bba2efa196b62a4f9acbcd14137a7253a9b30fadd1455c22014f3542558291c55a8a00cb44aabb2d0726210b887933dd24955282fb51d17d1838b6804186de8130529c251621677d8464131c99dc5de3879df80b5130df5409f0d75526357ceecb0be3bc1709ffd3df917e38680bc53017f934179ba3467674d8231f6513c64f4f06507a2e3d10a4f2e145d759a23897dcede141e5b13b235b274074eb976f84edda05d507b23f248dfc3ee139f4309ba099fcb250d7c4d0eb61ba359fec9ba74186c5956f118c90417931aefd5adbc179f58282a1885679f21d2ca69a30dadccd896b2e84b4497c347a17a9e3bfb9bd8804c3b3c7b689e1ca00d3d32e1efa17edd4c9c8a9c8f1ff06d991142c193489e1de0e4bce1e989491a0e1eb2447fdf301b5f72a31601a119315af7bb534a088707920f8ec8a951f22929f90e601e231b7e5b46e930d19298afc429fbc0a68a6227757b14fe547caeb56826e008786e5cb4d01feb8ffa890612127c17474a50671890c5ea51460973b3944b66295b917f0bbd0c188e37e6d85d3a2aaa1f8e0045a2d954fd6d22a36ea5f6283652feb40a694e5e46d1953de2e17a090d60fc16dfae7b0d0ab5bccb33ff90d13860be15cd4f1e4c12233a009537920f4b4738ef1e5d40c67e9aa6b07f921ed1100a1e6138c779062ffce429167c4f204fef3b6912f3b35eb44c9efbe164ce5c939027d8e9bf77ae311a6df1fdedb4b5fde5aff35dc94bf023048507371ecc567a1a7ffd9aec53e2301e2c8f9660890c61693fa638cb62d94fb436709c7e619248a8ddd71104d4b45f15c1878a847aeca848f7826e319856c09c4418b9ca0893b983734daac815a97985e4529cbc455855122f8754ced61b89d43df961bd6ffb1c6a7a74ca4a88bf7c2bbe9ff412b8f2a41294503425a3c39a64627a41d70499ae7cdee4fbc33f042e7cf4fa04d7f60452d6ed80076dac04c7fc2c8c9d79d7f7ac8f125b3b7b12dc36b6a50f9316ef24843594ff5d0f42e6bea4fd893d7f59d5d219f119cd682438a917c28166ceb2e96cb5d7e096889543fa145ca760827f9734171ca2c46f49f195e38784bdc6890d953b6edc4d04c4cc635b34847563edb6371e1cf168b47a506b324e66783890f5e21780a94f3d0a9d3021bd426a6e8c5c748661cb11ab4e4101db18f077bb973207634a674c7940863cb87481884a173aab7d5929b5a77127299868c4dc275669a1827a16788a0adaa52e85f52a349ebf4bd8f864d052e1b6978605a6d368dac7cdbdfb13f90ea6d2039e375928d8b9fdda278d896d847faa28a9a1723b16af26110922c76bad4154ce7807e5a8f7720b7b28ff4e097bcbc70bb8f7bf25a565d8a81b81f7569ab3e3d868abb474845bc2e6850ae4c3caa887524cb34950f8434baad75e7ce00808f1381d93d6f6f6d8d85c86b55678e5bb819dd1283485f4e1dab73819d8882e5149fec4e34357f881bdbd0345a6868e520c6c51bd9b355765cb129248cec784e7658e33f8929e0d4 +shared_secret: 2bb1532ce907d285b2d2860eb9bb5070a41ae73585743b26b948cccd1731ce66 + +# Rho leads to matrix containing zeroes +entropy: adf510dc0e997af14f96e4863f316475be59850bc861ca0d1b057d6b94c3b5d6 +public_key = 0d849d09133648875d99c8a2d199343e2069be06914b183e36f76206920fbb9294e3f17787c4595ab553ffe18287896cf6452e149cad67b901767a6e37740624d12b4657072571b9ce524780e2374d1b381e211159eaa9e8f5ab21315e3ae48041f50eb75430018199290325406bb65eca0088fc5e0b72ae2522a1e65962afea8cdc2c1ecd1a8efdf38d12ca5d4bdb8ba4d50d5de96f25034707aca01a296e63033a58200f32079cb8cab973026934180857d054dd75371700ad89102434f2438a823048900ff4fbaca832065ad99fecd12a742c286c067a93ca6de6e85304572a4bc2729ee2b421a41316c0bd766087eb2a88d50cb182559da4492a0324afcfc519e0c1c83336913881cdc9504ead243878caa6783557eb26599fc56fa26c6209f31222b7bda6db9b50341f5741b6f029a00440bb1af6b4e07a46ba9626d2a3475fac7bfb2047a9b3139c225c36bccb085a3b60c51a6227230df260d8f47ae6598ae065395e5abb6d5478ee97a9eb1a369ad367b075642997513159a1bd426c19542c86da7de7d626c7828dff7c9a6b53006ce03cd54c4f709c231f70829593358ab2515bba53da61c71c9b5b1df2029fe3404a6a1b7bab3be1299577c86997e48d38a17242e75847a23a8ad5a7511bc87a0261a8ab0e07889a53323ccec92e497c930dd57e43f39fd495b5cc2268cadc2918cb8ca24aa28c110b84c5b2b075c2effb3d44b6351cec34503c94e8aa016ac837f504aff5f68def8c8e0324754736950f28bc4d38bb6115584fb681b1b05f8f8ca69f924d25ca3f7715c72fcc1706f83f8538ac14b79581e103cf385dd8962d012309ce7774c687ace4d8372d1ca7acb1cf8f27545c07b6204140737316cf8971b3448127434156c9a4d35352dec27dfa82bd5e72522517bed633a3686ccb64759396db9ba279a5e967c5284814058a2ad44b8b1e9a7786ec1cd7f63a7ef72bc1f5c35ceba1a0fb934a2a547c86a6e00a51e9f89ff8eb68e3a48e7ba03418072cf0fbcde0bb15a6ec0ae648c012203bd6d83e3dc917b7914ca31505e5aa62875aa96c4b4c5cbc5b368b18f68264cab71332a38680826895d339ca656d358a0d40db12ec43733e60a287ba3998e7aab76972ffdb3139b30abc0ab3a089a6223a04c92a9880b89daa915130fb21ef6127fbe74721677d129793fd035d6fa2a1f1719a710a5030abbb917bc659b57f166304a0474daed828e8145423a87abfb36822d8211d9508a6d53994eaa9053c1a69d03dfda68593b1b9ad2b3cc4591067658f8d62347e022205823942c0981ce6846bf02fa16a8b20f39e1a53caa21a8f8ab4667b00c040228b262724d7a95e1718af48ab870675a4ae537d364378560b4dfba04146381f4977647a333df3e718ced96d66051c3f5c2fadc67f29596c3687948f455c3b7b13e2789b518866968788758c2a172b0de0fb370722571be5259c76b06c101250a49b542375a97907d393328afba0dc21948d96861b5cc8059b5feaab36aed39a1180a2bb11ad797752edb36a5cc98ca13c4e90e48f91404212e9ccd4a76569d661735bc9709b0aaf7b068a09b598c96557ec2695755c53a7a70509d0294a55a1707e040b2a8564a623c5ab9094000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 37fa90752936a8099c78fb7599926bdca1d3ee985af00c51add7e3ff7b282d26b1690f34cd3a8997ead23c2ccdceb07ec9df81ed6a8967b848c406340dfbfb9bfb223b6dc849ca5b1969f7aa519a011e33cf10e641fec3c0411d22508a18bfb316946ff41be61a16a75bff04d87c44f33bb3ff9faba915ef3e94ea4bdf1a6a296bfdaeb3dc50aea22c4ddf77b1b53b753f3c228876c6aaeeafbd5c59d748b5e596535995e075d5e47370e5b0b570408b1f8ca0bc0c6d60099c6a465c5e6600deeca2dffe0eec616d97d9eb534671251956505e1c546975c8f125ef2a50192d5106be103fa8b475a407a1a0452310e8b1d78c1147640e3873ecc21811678c276185f24e5c6742423a8778f5a2d74a3fb7ce6862c5481a079f7574864e23886658b2108891480a481b64fa372d5d628948c202a4232bc0f8bf80ce2eb4f90fa47b6ff1dd55a6c02a41f6a7c68ee7f83a2fa094789ea8bdfc70126de68a61b5f8ff5b92601f97ebf53b3e196fbd595dad44490722147737f54d9e69835a98d42ec10cf1524dff2a267156028a60bef51cda83abb1f5df8a5672aa336c02d6591aeee7a4313b4e6dc2e06404158a0714bef56df074cd290fa8a16daa8a1fc8f49ec7067be5bb5856f23afc6b2ff72a2a64c967c374a7917c3552ad54124633285b5f0cedb49795a20116b692b8ed2b49b0d421eef3c51cb99f7aba701b0387059f34f71b12d8517e7495eb0433b69340bce1c755449f1d08789ef7cf9d0bd528c262178af413d4f40cef52392b87d805a4d88677b1b8275640b066e46fdf1ff25264fb5f4eba7e9e1fc2965a27108bc32dfc4ce565b98577f0d1bfe37471d11c3afeece6a411b33ccee3692f32c22f077401135713e33f5f868ac1852120c170336581521834e762070b403f49e08e52ed0458866fa7df50d8d3b5fa8e33e931313aaeca6bafee1cbfb2743762314ce70fd9fca8fc34b402ee5a2ca330f60725d5b81a6d35e1c41f6d8c88939859e3f48c654dd8b9cbb4e9e0afb8aa3344f6abf18b6f5d011d8905e12f4be7e7d4081573649d157d4cce8b7b2c5e13875e0d2c7dc4bff5e9d436ae112338390acd59c7b7e5a086cd3b00817a1a377681a73531d4f1efc7ebaaf6d528e984d9609c81714efb89b3f0bab8505bcbcdc5535dcea227d3507d38cf72133c252f5b425cb800ab6198ef3b33391bd5043ec17293fa73eb8f3f972e64c5dddc851f50f5c48175117e533c87903f2d215a27c01f6050795109d200f5e39793554b35b2a339695bfc55d1d32a06336749c09f0ece1e197dadb485e2d544823e013cb84a11cf44ac7fb4f74dee147e4fb805059fe67fb1eb7daea7be1c5e7a050236ea8079a6cd1578715d8510a53c03a94ffde8a21507086d007145080e07aad2e7398cd98305536e6f3a0a67f83b16698232591337d0cb465bb13c3570df161e97f6e1deb3b6548aa7ff4a30d145f64f2571bd7f748f3044afc5a8d3e2f01113430ce83dd59b0a627ca759551a635a68838246af6c304ba843 +shared_secret: 359de9eb5f1a17bf7215b7c1ab7cc320d7801f826f917755a79f413876973ef6 + +# Rho leads to matrix containing zeroes +entropy: 3983da6a4615805f6d55c14ba582d59a40e646c7ae77f4835a51afc6c37f11f3 +public_key = 40da241478b798a39e11830b402803ee9c4decdca918a7276f2168cce60092c29bba4cb8f532bb209367748599501572dceb9560ca00bc841e442a41e15b590cd63fa7921b344018f1a223e9e44ec933877c330d2b72531729ac91746e26c61381c80d98003265c306040c85fb95be547a46e3c01671401a42237da688795dc8c9acc86208c36911295ad22b05a2717d810076b63b632eb254491a414128377de53f941cc7ea1018bd83cf7e6a76d85211af63cf2ec856e636a9210b04a24abab1355478d132805802725345c43a981c2cc3fb0318db62531a045d2ef57680b547bfdb9d5d356464592f47c2360cd249e73a0f59fb470f4491a9e55d6fa9a982b97ee235adbbd8039beb9f07ac35ee5cc6243897f5c81bd9db5591c7225e90587279b35c5a1c075ca5b7106510559eec9ba2d2e7143c01afee598283403a6d7597a38b01bf1c02582035ba743e1aa20c49983779ca8279bbb53d5115534916184c5edc70ce4372bb25c48a2355c22a5b15e7563554e9a0e6f5afdb3aa3a1cc5b32b67ffc13756d65309dc95d561c91d45a1fe57a83f9c4ae8716bcd8708efceb851e4c3cb3acb4ebc7993d1056a485bacdb50694a81d12dc098d39a1f407468e215f6e055498d215f6f4bb8471121eacb2a324635a07864199a0199b0b6276a8a4e5b9ff0ab9ad13474ea6b2ca46b2c41027644a416771cafa07a1ac28519bbc0888f3878262c871b138aa109966040447484b3a999b7b4a75ad185475ac46ed92a373070e03a90f8e1ba97a91b5ace881377a51c24bb1fa85451cc94c72517f3d72024e7b421666cd3814066ccc5d70595efa756bc3760688123e9c3aceeb270a30a23261ab23e30c7f0785a360e8a0bbf5401450114f80580b03ae0b503419a25861331d58c11ec1c21d47ca9dcab60a56a5baee20417172a4535bb6de18b151bcb4159aab3fe69a31d5adf64c530726677db07dceda5d94a7427c189344027fe819c50f10ae70e550e154bc7e5a698c324096e9cd1e78053c6a05c7c11e9b2b532d19a87dc08dde0c73f0d3357f732c441462c8476e5dc5881d55465893438e60350175178213c0b1d8b503782d786b63c1e66cd3837bbc4c891a364b42130c1864c675097f65b6acab701de01124ded8aef4f70479eb996c5558cff287ce1826ec962bbf554abb282442a1bbcdc210ca389c50105eb253ae05c1477ff0523c85a294e084504616d7f75ce624925dc0c00b9c3f2f1363d2b05cbcf165f365390376b9d1817cd24560604c1512720b09d25a82f7179b74399fe46db356253a8320b393b068f064db6a353ada951411390171b47dc29bc4f05a2bf99aad4087ad54be6602bc7db23ae34b27d594b83e798f22fca1fdb56333374f892487e7289cfb01be4b8b03f0d9c2a589ab101494517264b6ba494cb0490a1871d301483a4c647e5c88be907c7c92abd813865606728bb95aa9058bba6cb3953b012cbc2af7a4770eacb6f2a7b9e8e94833e0592717be06517e9d33389b993a53833f9ca20699cc3dff64995ef914c05bbfe154951b7221fbc779740b86cf59ceb353233288911b1242c579c508149ed71052aba9bb79903e23c75258a445611c9deb185efb25524bd6000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 06f9463d5e9d8718bd3f56e92a41b4147298b758e670e938ccf1b048a6facc0709e58ded8fe9a88a11ff81007e066c6038388b7fe0e5496c02edd8c28509f584b9d58604c7a01f3196f99d3bb5fe1e9a6d2ebb47b2d2e0da69071b0f4af22dcc830745229081c266780c1c5dec5af5b74b9a2355274ee0d0b0243ab75a5f59f09dfcc2bf305f5df0ba6fb24c01c9bfbc38749681dcd401ef1f38d2bfc29ae990835c48a80f56b0869e84f7524f7d469ad2c63aee4137130575cacc87dc8fada26c4b2195644b54db3ebfee1e4fc3f13ab744dabfa044ed7cd099ac836b8faa41e510d3995c129429e2f4c8b188b612ef32eed540915294be069d64c662bd301381a430123a6ac2dfcf2c6ea4eac8dc5b066d7cca6af8f399add96abb2154b9167f57fba21a145288ee90a4e47595738d7c32be27cb1b0e5e16cebbfcf5323bd0b719a641ca98bec4b148128e3fa11963070eecc2329efbe9bdfed16df4fed34cfd03e65a59e20bd3c7b8f012e88b8262473c7a36d00a381bf37c15ee6d709f9f4f0042080d4f67cb6f4777f92a2f0a4b07bff9e925a7d7ab581ce46f055f35c1963d283e4a210a59dad5dfc7a679cd828ad96382046816848b1789ffc84babaa60991082418286bd281947c7b664543af16b8ade454d3d8ae5b416f82cadcd7eefc5b135bd6ed577e8d85848419ea73c3e0ad7276b3ce8773e9881384b9d48ddb6eee9d9aba7dd2a3e0ac8972e301d9cdb0f25893c90e68f2d1ff8ff892c6b59bae088dfbdea3135e74501236e416a01c770bb3c77c3a634a29ee6d99a0f954171078c1eb44d76612d25d7e51fe3756df2c87482a709384825f52dce92884f8a3ea3ebbe219e0bb36327660b1b7c44583bdd924bb4ffd6baa933034e92a5feaa13b3bb8e8e4c0a54ce58f4a48ce0c8baa273e963d74538c55d2414891bcea9789764247e64897c25a8b154d2ef8d1356a77b8a5909c9a53d45d2e4d7362e96edbddf27bda011a439bfefcb09bd46bde933b5375bdcbabda95933f859c0c43cd60f21186439701b7ab4f19c8bcd63ab3adee01ff5c2c47867297297ff823c814bbba614e87898bd0bad020c6f51440037a687bbb96c558ddc0f2a250b836bbb36d88009a2575728eabbd15e3dd14b47c00586f371e8e7d964d2cb7c7acf1bdb0077ef2f79ad0c20e6134b54a8add35540cecb4a1db7bd8bec65467745c2dd4763d7c67d9a53826c42f67176354d472bca647540b404c0e84ab05e4d474dac551f0624ab099d24fefa1066f495e0bda8439291e4c18718ba9ee97c16c385309c0d9505e51ab5651470148223603cba76d767ac5131a13f097a537eeba099a18144692b718cfba31b748a72b69f03d8226bf5f8ed7b5ca93b40f7e64e5a56e6edf2829b61e96283518594414603e7acb8e5cbeee0a8e9026196afd72dd3448ede9819a89a580992060b1852af4e2d3451ff7518f18c75c4e4c453f2d7dba5cdd60f5f4686b5e2ef272ea958867501a3e29a9746bfb41f42d08ab860d862b6c0f4c0 +shared_secret: 9cf796413560833a3c2e39edb3f4f4bbe551109a4c0b9a25c42777d7d89361c7 + +# Rho leads to matrix containing zeroes +entropy: 2676b8426b9d6a30af007094bb76d65d388c2b3da938215dd6f6987206400e13 +public_key = 13c4781290679e16c822f2246004c38ee6ab27fcc694e665ec690515542eee6350d4a13740b417d1b91883537b2bba248a61108a818d80c5c67b1c3265c124f9e56be2a13129121e030aced4585189d58978cc3750815688763bdb44a0ee46c678999081d42ca342b414cc00539b6d19645ed18ace96a46c2453af3af9b73ad649febba71e40802e3871cb3661c2c7c1480b9e15625fb61c322f0141268583f4c9b19950018c70a55ed500625cb207e9219d2c9cea134c6f32a606393e94923e3fa5729ad2264fc8667d140d232a3b68a93caa9098fe242f99305a0fcb3413ec8b22472e66754edbec064e89245301bbf48a8994d36b4093401943a427cb5388132d3543944e656ae51c72118821102322a8f7246368b5d9e4756fd45d5886477e476e641b10d0f196cb6638f6c30ac2e6ce57230d4036cb23d14e8ba30d66e92656090199f1652003af17393b1fa912df25b6fba7bb3fbb5037915e46c8217cc88142e14622f028fadba21455b00ca96b2d039663f0aa6d48b0b5b3672203b76330ca4a14434b877cf83a818e71b97b77a4eb99858542b316c809f1630f9bba7e00a265ef2b6b2aaa45611726e1ea7d96a50f5cab524b138288f74b8575256fd7504740a256e1bf34318733f6b7a53aa30536bf0e5079e5b0395189262027cbd497c350b1ad89f4aaf88b219de48801c7bf97486824a7b7bf723f516293f2f786a6989a35c192eb8b009fd37f950cc6e08592a1350c680952e92887b5759249cc70bf477277cc18a9e95da3579bc4bc42761c505504372eac4cee71b4d82c787356983380666b3718b288948372c11fc855b3950e633a70762490ca13c11c6b824478a293f5161c782c4ffa5fd0a64b5522c23979b2434ab52b783a37098ba2da100da063dd3191c29c12bab3927ca721263cb518924483091070981a902518df41ac1280bfc7ba2f2703cfe2f8cde65427818215fe57b68669ca97c977af38845433295e770c4bd4cc308cb203d823c84639cc9496d31424ea778b0f215430437deae7b8c6906bd4fcb589d251b637030f9607e9bba487fa0fbeb9545eaa8353c738a9f02b78e19774b84ab8144f20e39c62a16032d924658262c75b91e5a471ffb95ca40b5c1d388be8b55e09f4980a274ef5a5cdf5137c1afc0325913bb1ac608a210ae92220f4a47d8ec6806dc6b5efc67ccd677d5be615bed15cd76625ee4300f1e8aa9330952d49aed6b14c8550204d2c3c61828cbf36322fca4faa3190a6635e2f0809f45b5064929c14e0762d62a3c8839663fb8b9a135b715440d81836bf40a6cae8333d4496e4703b4ad50482e8ba9f5163838271bfb66d1fb462d51418e2792cc7370f7806d0ce7b7b4a66af2af770f5a253c46001bf82988a4c0c008b8bebe64bcbca680d3136e48bac4f030cb495095af7cc418b3acaf95bd6b636a4f92dec211c4b2b4e8bb90969681c61ac380c16ce7dd0aa3236957415b29144737c5b9124575872950a23c5315bd3b0ccf2a608e6a0d3659cd1053938cc1e68c131095cca20c4b2b358c65192b3d812cf73e820f89ab1c5b4c4c2270e7b465e2253c179d312bdf77f22252d3332cf685abeac1c4026f95e9b9b79c5a3842a49b4ac59000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: b812896d14f191fba331fe20ae245f968a421c46ae8e3360f380a9f0a00d50da4247b232f5181ea946b494e9d99f82e7fff27d8ccbeb6fa8dd5e12f12d2afb02004f2bf046f23115aa3f7e9e5bab06803c4df1d6a0bd935c882721d09a3b5c41050afe0ae3706fc83f87c49fcc22ca331fedf7787ab7ab0ac9f04fe405f21d3384b1f377332feebd65e11d7989f56cf7430ae8441072a4a8e9c8be24a4a1fcf380dbc0a8543d2159de861281493516d3fe7f0819da15d259aa2159c37d325c884217a03c83d8f4d5c1b9f2af4e734aca05ed1d3951d3bd5c021a4e81069678a210ee5f5c9404b52ffa495ebe6b05cd02cd84ab3f3795793e03d26e83a647921c2c970170c0ecdaca8d2e5c469b1a3309e46dcc9122623b6f41771131db303eadbd7b7df5c86bbd6ab0060df29c95a0c014da4939271a98c12ed92a91d8b3a37e2236ba269e7df73f7df2fe447a20bfc56e6b9249485cd71a9fc83af54946537872649949b49f3d98425453fce02defb6d09790322afe334c53ca802510a87f543264e5bbce4665564d23695a08161e28db4c90bb6bee38c00c5d3cc2e403e225afe39ed45ca3c23a35e64769486e4e38b122e3d1bd2bc8d1a38f689e5ccf26db07c8b7c14b19431686ef783382d02080b9221d2a15b41db02a63db7b5396e4b516d241ea0ba533c6f1c90b67d0e6bb2bee066015dd7c42f0226809fbd81a8a56630b93aecd63bec94c168142bc64f0086e02ddeafe7615192575e74e174cf7e2c4df95b55ae810d5cd5cc706605800a0417bbfbe3097890621721939e01e51f46dff10e0777bb93e0b87e8fb88c5100b47ea0c1f356fe669ab2ede1f6eab8a52b45815f9698e86baf38c35ee99f5d3613be4fde9febaa6c33f3a493a37eae52530b8ff0282671a01a13ab74b547c4bd7ae87666c20f857bc4fdd2eeb15a09722cf158083d7a31cc13dbc53e0fd2b2957f5032761e777474f17188835bd79090087ffc0ebc01af02e4d0e0be1d532eefee9ff92afff8cca34286cd6e9c03b2c41b2080484c725afc5aa3c76d4c807e8c5beadf261061c4df268b4d4e6e24ea68f2fa085153d37be084e9d69d2bc48c819f898ab482c0b80659ff473e8b186cd5304c62b4b3f3b714c628478b8a29cfc5be37773cdcc4558986d29578b5dd087ce0d989a70616d380c3c5f68410b3a7a0fd247b7a3d9c9dec0e8f13fb1fa1e6cc579e31a202afb994d6fb4e40e6377dd2ba3247e5150db44d4515d31296f00bd2ff2838d5070821396ffcfb424bdba4ba3e9bcd2e02fe85f5feaeb0106fd8270a47aca634101102c08dae778d40d070d1ff0542414d71a7dcacb25536b4462014e5093710ead409aa1ba2c21c1716cfc4f1091aa39b41c28ac9cd3293c00c853a267cab452473fac0c84bbfafb4e2754a1c1ba244fe1ba8fa356e78f89a94501e068126acf20ba176586adfc0c03535eb6fdb1ddd41c6272d0e8c49f039dfccd737c284351ce14b2f7e0d01639d502d519fa9cfab9e41632b79353ff861303508f +shared_secret: ce303d3ea30cdad19af0a9f428943317278b22f4c7c229aaca25d0709b23e6e5 + +# Rho leads to matrix containing zeroes +entropy: 319c51bcb76124b92f39820a5653c0ecfba79ec91d632b0488f4020e5df4e37a +public_key = b08c45bbdb5d4053b675fc7ffba8cab1f105c8095a0a209c4f16447198cda9d73c62bb98dbb3c86e8761978bb77a5c7a28f03f10d8558cab3c71d498429786280383f944b75c7139e533bcf7019fbf953dcc00c884446e8bc3ccf75b3dee9190526662b33527600296aab664ef58c5890111c4d1c04262ac22985181c80f3906cf11f38af489a75cf5596757a8ec56cb3d3a7c2594441113c427f7b43a019ce1bb1756a9223b8b15c3cb649e93497fb34ed17b7c4d185ea1e9a5a6dba569f1414aec8bacd1adb784c714a7b2b89989bab281eff81ed093373d5c6d3f36ac3952aec99ccacdb0634928668264bc70303fad4a746592778568570ff75585422bf3cb6a6960946432928a0b39e5bb017840c7c4d99b8b25a0c76349766b0d39f7076a839abf883252743731b53c3f650a32b0297e806addd02999d61086362322c840d8dbcd820ca008e5ac150b7932f081491415c1c3300e0976e7f9c14fc045be34983ca26b71690d216989a01b03b6930fff0964fdd98b2ac6bbc408d0731a501ec87a93e19096fa3161870bf7964ab5d6a5ba764ed8206815d83045b24db9a9483bb776dbc3ad85435d7cd449248c4058e3568bda4e41061ee5f0bfb0e29867491bf796140e8a2194572c23f75922c4ab0014c9ee5a98663ca78741a4b15335d14a3fc92a24b05b5233a43914b274ad531e94656309249f79fc93c13652933529e72690e1b8b7c6a21c756614307229135977fab1727a497617c695b9299d81358354c9962d231183d8512adc5f10e56a053610cb042cc4fc2e485099b973b320c090a4459f8dc279beb9568f840932c77d28ebafa40ca22bc60adc785449800c8fb71e80ba9a67c4383049b36fc89f0248a688298453e480ec525dd45803dac94ac380c468ac2c85015560965b7c7838e59a8f90cab718246dd4a0578fd41438e09716d3530a3272618b191c521887ca38aa8c994c93820f78673f5cc95ca93e3eb976946b8785ec3f12641d41f60db3085931aa365970190b93c37625332fe92e4532519d8825c46200e8b576592ca557794e370144d378a62e5c54cf6820f1671934db0b6c47ca8d302bf18a8b82152926853df7d255da51cc7a19657ed77377fa4eb8b2a929b46ff18910d1832b71842cffc3849a66107702ac7a86630769889fd90d8ea22788805876321ca2158ec7bc878c568822c0bfa03c10c9f5b5a8076357c6b934b75617a20606712b0e8cce40f4ced0d17defa628bab4751e56b3ad040be6e3264e6011fde7c4cebabee0701c6023c218d07b47ba4ec811b286ec3031f5254302be6b776666897b3062649252c5f7c1bb0dfab6b4f13155c91f318963109421a4a33306eb0b66da38fdbb541bbb3e2037c1a0d4493e0878aba23e7138bee255b3423009ecc8920a3a4b86932167b1affab27a8821598851bee698665a2130816b66b7e81842819ea1560a0c5292be2cc7d5428aaf3b7ef5002d5145aee9a82c9d44bdd0842adf54b38d9213e904052905adf3255828147fb64960c9167b17126d61b05007c759c938cd2086695e0636b25b69312a70235b6e201c23e2f9a9ad696716f53333d004fc663d5c0b0776f875ad988aa6c6230218cf6806353409000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 87099f26e8493f157e405f8cbaf679f5fb0aff16ff9e2c2fa8c263c6819287da7484cf93e0a6cca4d0a94d0f710081c0bfab292981dec83558b651abca873980d077e9febdfa82398896e88560e805948d84ea38cc77554e9421dba3a85ba24f3328ffeb4de0bfd1da900412a71903908e3b8cacf00ea86f21e4eb124167b3ec769a8a22498ec6cf26cd4b1470e95c37b3716462929ddd9e247d3f23b98b3efed529066532b8f6042ee8eb6ad00233329e0b634e300ec2932fd6631b1bf14d7e992f54b985b51cf1b05f5ce7d9f7458bb3b530fa3feb7ca1a72dbb8c4b01c0f03d8b45e550514fa4fba32705c95316960bf50d64e3f07c48bcdc31265f0fadb5f348799fe0364c93765e2bb4688704f3027e69689861dbbd65bba05f158fd329c5474386f9ad7afb65b297004664ebf3cb7ac1e8a34e33ba15ac0c92e7abedbfa96fe4c68ff6d7a4d1dadcf56824285883d74370e2840cefb887b7b934fec461c50781dfcae2bdcc9983e0b34c3be81a0dca5ff0ac834f5bf71b4e6135c79c27a525bda87c2c1c05e5e2addbca7c43e49ad11ea240cb09bd77d22e7e9d0ccc4d638feff6fe9bc04300202313197a9a53b99e67e96aa72ebe3200758c1f17b05c0b793dba17278f3e79563a532161190eb3a0724524b210f26038ccf08d55c0bf29b95917c0bf97df6872438b25d6d90091ada34b46ff2df784370c8bd3a523687902dd9a1d70f9aa9b1a06dcf4a1fdb740ac3a0c25c3840bba2e5c6cd1dbef9aca23d5f29ffc00cec2fd9dbcc187cd2d3c690f436e6265f8cc6857b3ddc1cc1415877d83d80337fc4c4e38808b9e05b14173497330077fe4c38699523491d4a3248e5dc4c401a3a29054c924c744f7514b7a84e91ca6cd2cdd5cb51c4ab4f2dd4aa0027b294b299896b558754264ab10b0c0306465ddd4e88f2e42b580801746452467558d3238d21a74ddefcbdcff5d79886b101c57c0d4d1bd4af284aef20f558928ae0768a07f397c5f9f7f334a446755a22549cd7fb1efb14bab48513e52c454e57c381518ff6d3d02278abc01bd0d54d53e77d361bef85c33efbbfb295bbe3aad332d5131e8cb5cd90a960bf2d429524b45abd686ef95882ffe6751da4f750a367fcdf0e807fc204834d6957ba8fbcc0e9e3d4922c45085aad54b08934e0d909b334d3952cd479931c75c5f4aa1ec286099bedbe5ec17123384e83dab7230ccf5fca4f085ff348197d837b752c2bab7f0fed29e6347624c51059a48dce7f4eebe03b5bf9b15b13ec85e8acdef861fbf93f17e377e950dbe9d6cc96ae83e94a3c5848dbc2ccf6090882f048a174bc42107cf9bb0df711551e2d550e74d2d416453be7fbdae5a24ceddc7dbec4329b4a67d187461ebcbd9845c5ba04967ee59da4bf822460053383935cf1bb1766a7ea5568f16ccf8400d9a73fc86a7570742d76d4f52d20ec80b8ce2a937d53fe88f60bd3deefe27642fc7cd7d79cbc59fbadef2ed189edb3239a948aae68bb2bccbd42c872dabd7a261625af4fd0b92c1 +shared_secret: 53865f61850687872fbe708ccf896f7f24ea01283510faf76481abdb0cc17e89 + +# Rho leads to matrix containing zeroes +entropy: 00ff48b3769ffaf4e91c1c9110eb8ce9e2cb99f060b486b37035407d2f4ca517 +public_key = 0674c3adf498654b7d8078c405881705953d58fb08954a73cbeb43d564894eb48e104763d35563358693f2f2442ba8a01c38af0d94be822a1bfb7560e75abff623401fa043d4f10f8cf688b20c56cd18867712688c992f18617331631527cb4c7b0a526aa488b5122553e332280ca64deb0c0ad36db2267b633b3f8bb8a83551000e1ac17f7b426813caed005892a7077c4bc02f703befabc0f6b324b1422ec290ca42f630bd441d1f119f1c633b2031cc759322a4d762265c5e642462c0b38ae5339747a62062e07aacf8aaae3725424c4f30f38e1c727f40e53788c68bbfbcccd8db7364388a46a366b53bae89f09d64c7c1955357e256586dd5cf508967cfc97b0b481267566b7eaa00dff67158f81cfd8a406dd8c0095c2c6e4c9e03a466ec79232885145ab0a321149879a25c77378dd1e231be71519122b4f1394e1998081f271840a245e1774012d508bcc0830c5901cfb7cbc178875fab73b4aca397d13da45b9e93342d4f5aa813048d46e0b56c8a9ad7194fcb6046da9b9d16d56da6399315c924f18c527437c9fb03ac3774ccb272614b0cc55968ad346187a5f1716a944fb3946783a6511a6997cd482ead064356f843bd6b6379f6c662c9c655705c6265c8702729c3bbc022a8828312bbc7c7b90c373448a59cb67ca2da3771882130043488eedb9c91b39917a1629918580381972c34a0e7abaf372527e1902088e1354c5353c900a0a16536435124a9e51369bb46d226170a064e91e85dd6d987956820b1446a6181535d3ac8a994341ca43b0cf06a83825a85a5ad192582554864561c5bb2915287a502c39b8b54abafce465abbe7092a83384fd35d91d5604c7a4c14395cd57713baac0d7f906ac9274a8bbb34074b3f96fa8fa23831ece3975f3011a815bc7a4c1a96849d386511e61a9ac187024eb50135aaaa0ae2347a804e55e4b3d3e3c678da9e5997419c836948370d1af0a1c1c15d70f4711e825244b1521345304af589877b64afc28ac625a237a3226e1873101345e9ebc060a255fe0862de4800097a89fbe07aac5c1cb983049c369c8f0924c8320df70ac9da023cba2b1e40757a3323833d12229ce607a63275f305c3b8bb830dcc9f63bb479969cc0cdc30afc75a8308cff8e59d5b2a20d46b200dbb7d80e011bb726e33c968e3ba8809771269a096e85260828c1fb0a719fc638442b2935ae4cf82a2c27bf471e48264ccf912d4f09910ac12c19077a8f52bf3b2c8fb4ac7ace2ace1250347c3beb2d89299673a6328c8483805be327079f8552af16117d12550042b7eb635cb0a8c0d370ab508a7789235fb81bd60b882c8909140eb487c5acb092c024a9c6c8556b832c36bd0dba31565b70c35c2ea4cbf7a1b42d2d7184d37b3bb180b9e1078a793b7fcb2bbc97bcd8bd7cb3c0758f398a482565d185abfa4310c3a84b77b9280e7a6222098aa627497fd13abc2130ae6d34ea6c626fec532f1eb4ca97266eb95a728434ea1987e7e666ad09c0f08c6c581dc733f962fd04780a7565355083b12a56a7c4ca774b3cbf4cb762949631d8bbccf7b48e2ea459343a6beb3a2c38b64990a01971579014b41a3a90c06eb3bf83c502388a5bfbb0c9be9beee4f3c26cc000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: f557aae24c7a8527f8a1ee03310c78172826128ca814882e33e4af6612c938d174209b287ae8a53adeb6fa0aa25fe6d19f027367239cfb89bf0dde0f99497ef7d7477bd332264ba237ec0e1035440029fbb5064ddcf9bfbd136e92f1b35a0a2cba8405ba42b8ce36cd2a686bde2fe338a013c230b1f1a99113c01babef6881f471081c9b9fe25f28c0fbf828c243284e6be4c0feb138729ac4a6d6b2869493abdb39a08563b2bbabcdabc3b349f74708b714f7e11243d90a69f68585b21de1cf742ed7637fdb5248cb5fee5a3245136e85dd5042163f2417e58a634224db95d004a4e9665ce10dd120b80df855c5ca5e464875752a70857511a705be5f3edda976ce536a5a83d5173c194d0a9ecc24f83a6b6c12bf06521f9494dc56d3a85df270518bf930474d9fbc3c77b61a1799db7146d5865d3d71e84a64e52deda9e16cb73ca1babc487a5b653664278f6256954397300b150b9159e5ef19c71e45fdc1919fb99508606e180305f7bf11f9c772e49e7a0890cb5b0264749035c3725e3f6dc99710889f8501b71872ed3674557e5fbbed85f819fdd9f6d83f1c40a04afeb67452dc3a44c77a90bbe770ec918557923e61fa704b3c08012873a0c672e511241612de52cfcb8c8e129f3b81f3ee76d99bb42398eaad6a1028b0c618b6c0c2afc7713ccc226d4c853227cc6864dec677e39dea238d79066f427c2cf7e9597b8b5a0c59536ea78485511b3c804be288c57d894322dcc2ebaf11d2da207c71381dc654a7458cd22c34703e0b720163ced269283a7a3a50f5e31868ed996227f49d8f0e02e6eca130356cb125f948eeaa0aaa8c324401f5931298fb20fb0ca6cba46bb98b02575e7abd822838467ccbf1d80868ee866bdbed1f7d84eb1604abe5f88a39041a18d301967260f8589cadb4e35c39cd50fbbd6a3922234732f25231ddc0df32fd80289fa8ceaebb0d19ee014200b3bc9f896e1e2585a0f6ece96a9983cdebd5738fa4b10a90536d820ba5f91b3fccc8e77a8bd01a56721608d402e4171cd91a56ffdf9236fb75e7041903a327bb2f8c487fdac2e369a4895b5affd68bb2967c2bf4f46144e6bfa796731ffa338eb9acc96374f2db1429b5568e79cf9cc077e74b3e048894c3b0686f4f071203c2ac7dd94e029ad9b9d8ff680d8bd5de38491c43ae7917c18b4cc50cb9793dc7da034cae15b8740b519d8c673d276488b8bc9c3c6fd127a7e9bced8385f39538ae500d76283779a4de8c360a976bb237822abb96dbde0408f9f9ecaa639af81c941460ea2c19541ede082e0635fba083de29c5d460079d6ba038e961745a0837edf37f7b0548c65fc6f8eae8706e54056b6b2819b79231139da08c6f66a4455be50ad702f1469770e30ba9b108b84d77d30e0fd4a220a4f4bdb7d07878ec837553f4210385c760fb7f180c943a965df8b3118e3423e28f6172a2c9f9c268342e1a0cc63e158c51abfdd23efc929b8dc17274063ac8c3e4a9f1b3ac373f7f279257fdbdf044e14861f4ceb75bac6710 +shared_secret: bf9eb969821d6b129da2e353e7ee8619859fa2e1480599b3546f305e56c7be7e + +# Rho leads to matrix containing zeroes +entropy: 4960ccb1276f96d7aa55885b6ae6f90343d42e1391e8241b5952931a979837e1 +public_key = 80002535317ab0223bcad8c9d0c6876dd03beb06403e50606a33937515359663546cc0bdb16a4a9d6ccfa0315882739380c591e4b3302d807f76256f441b99acca228f17c904f88143840648971cf03735ae9ab070b6c4057c6865c88964748d8e1c5fe919037f3853abc58a3950cd307c39f8db6b9c6794d6d921da4b5ea23391d916b7f2bc8b50061eed220e901495c9744da194790cabb66a3b34eb020af87532a7967a5ab190f1898cd402c093e4c0a7967460d5b0ca0bad973ca86e533435536366370388178d28349aab06090ee40291263c16d26551a03fac734b0f17c2ecc693bae40475f7cf5edc778060186e5811a3dbac9d34b9f478c2b7e1c7654938cf8031e433ce38c47dd5e9aedabb6eac802123a82c6aeabaabd76a254c451460639fa646d87576ba154fe0b024eb114af1d2b17e245c442ac9a82bc948db520ce2c887d57f0621270b819aeea5422129372142ac87c1762e6b891af95a47912029d09118f97c5a67628dd2997c669523c542393b97f74c4974395a857bb9b47b39d22b00d5e946365a2dda868934e514b35954ead55a76d812cf619113719b322b72d6d94187ca4d3a26847437b2195a1a034b530ec0b8c7e1401be0308237094abc79fc9c92d79675f590347d7b706361556f2c00277289ba296aad73c9f3f654d1893062735869255c68357a97558f0af74a44879ccdf7122ba5bfc5d21d805430432abee64c7f271a930db3aaf5f78d8889b59e654c18ecc915db8df2eb7930426bf64b62088406c4b5948b984d29f149ee897c1bb8664a8617183a3c477994aee870d1089cc77079369200eb944a79f5aa8c5315da8a7571a6ced0850b2a71a9ba6221cf14be48935e12c8a4cb7630b1661c3504885a065ab5e3c1f78327c779122d772cf64c4b3a63aeb7b7b2c11cbb8ba98e5c340b8634bf743731f0942b8c333261a8b9e5d60c91a707d3e4035e30bef3bb6089e5017d154279b89303a2a10709bc8a44ae248827c477c7568013db462b34e8a8d7731340f7658486c3e83631e21938c4c560e00b521e76695d09844a0a35a6b758e711687debafc31532d2d6a41e512e3ca5bc88770fe49a794292c0437017082c5d11b8a6fb36401fc92aa5ca7cab8b550fab6a74119b5ffa8a14069f58f81231f2a646eab240fb56e0bab328c4637d3559c9b7351f4c7f68eac27618a874790f0ce75e7c32333bf534d0512fdc837d7fdcb49762cb3c8529b8538fa725476e0939394c9eedbb73ccaa0a8879b2c029b9dc350e911278720240ee262830c41440b89e18446f195c7fa50c8a94b02ceb5c93d2eb27f406b80e758da7f99eb320cb28b2aa6465b50c6c42b9a77390b521f3e2830f789a3882298c649722748edfa9c8ff2b7abbe61aeac3171cf16ec0997952323d11bc29fc1a76e022cf2a07300e3a87fbd47047c1504e8516c4e2358113b8ab8078d6466ca802ba3141287181777ac12618081892529a0d5879f4ccc979286ddd4c3112145dec7a711548214d62b92c238e82b4cf1cd6b78cd94d6490ccf69005d9ea13efb1cff0028f6c1543c501255495118d76137fa4c12331800c5250a71a4a8ec01a30bbbcda5a038c682f2b85b6885714f6ec2e27fd000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 7a47d5eee9259bcb9ff2d28b7ecb9b5cf70cc36298f0578b0b8fa211f51453fccfbefa32711bf6e83b796bb7927185afd4776069ced5de3731a1b4783db069092607bdceda88782b7c7bce5f77bce5bc70aa9edec73634c6d55b6c7e66a80a1628cc5a0ac5a83141bd060c5e790c6d1e2d604b948df39289825258a575d559e1c06090ca398332b5df350870abdbf17a5aff739c49c50bdc1f92df4555f4ac757f5e98e43b287873a6ee4f35970785b7e43213d5d49078504d0f2d376d590440eebce8e86cd12a5f1669ccf0be6e8eafa396ec1407be8a02198a287649865cd0b6c149403f6d4866bf117e2f9b5f3353ef662b64381acb92bff6208dea2c65f49868404a02b5286dfaff50472d24300497d8b673098a8ffa09a3633d91853491be3e925b18a6f81d757da0585c948afd41081c654853f3c7d6befd41ebafa1a2393bb1415e312d0930da60f010775d4f86076c19f2957da96a0ce4903b9ca5f7ef18d33c681a4252e58e2eac4a1d292ab9952b0339313cf5ede08f000b3bac1344fbd5a23ce63f810c993285816e42a2c13b35ee685863d691bc1dcf61ecc4b2ae54a2732873c065170609aa0654279cbf77f790056f337f45d9ef3be9b278565decd4f86574322da9d37e4e6afa7165cd2b5d1d96fd6a27570e1797ca8ec1b64db363ee5bda8d756ae024ae1061826d90ffb68440aef1aff662c801255906fb040cec10e4b34353193e3476612ca6467a19a2635ed3497cb565b8d765642a8cccbdfb2fabea1e2a64fdeff5ad9b8cebd9505872132286731bf566bb8caf5016ff4eeda1fc612593cf812d69b12dcdfe5ab34d03a8804feb9f79683f3ea44da7293ae812f68d6a21cb0b66bb610cedb2976531e6b174d8a1cb46dab41d87c3ccf4e23c5f0860f0cf118fa50cf8429d239d80d81311e090a2533f88c707a64ea25cbaadecf72eb202c647fc1bf3bb76cad5c05a305fa2e67b4ff8fefc82d9b1868aea7dd7aec33d60a4039c08f0f10aec4826d3e1b8e0b845082fbb95fbae30293a92d5ac73856a72ff52040b5f5844b61af07de922d65319b943cbfdbcaff62390f3b162e64956320aaea0e2abbbbfb9678e15ec9dde1509edb4643d997b25db8ffe372ac7845dbf2a0d703340cba5bdfd9225526f249561a16e21fb899a71293750b122fa22e23424aed5a72bbce45995050f6940a51e495931fcdbb289bcab11607eb21a18f35ba5fccf786f04d536c165d4d3f5055b661a31f43deb64575aff3c2b61556c20ed98939517179e86902083ffec6d42c6f744487cc4fda790e87a73829b8849990a4c3c0b5ab5c0ea8f0567729bab9f2ffb6f032403ecca6e4bacf608851dacc924ba6b8051bf48aeeec8c5ca87b56e3cf440521e72f569ec80e07a8683fe06f4a584e7faaeb2ce6c8031755648755c75475a2d83941d96b269dfe365cabdcbbf207e79e00075dc4259f96cc9fdb3429418072c93ab4f9322246b3db1f436e579d1f541306ce036a8effa25efe0fd0b2a208d340cfd70cb1506 +shared_secret: 43e175ccf07fb358c9b4a6117c15c327b88d4d8b95a645fcf1ed096f0eaa17d2 + +# Rho leads to matrix containing zeroes +entropy: 456be124e7f43803de5f734ea016455d68164a7f054c003f4ef49e46f42dd8d0 +public_key = 6cebbc9157cd2d0228c6385f0d9aa0f99335c9cb777e96b597551a0a644a34d3a419b3ad5351876d93490598a90f31a3a2a227119b7cb397988c8971a0459b2c811ebc8a19a094457c118f6db50b7b1ba6de5aa85e316f71866d759cab439c71d90691f1d27da41779f2c3380c600196133f15938125583ac7650eedb0b069004073205b49943a4fc00ab5ec5e68ea5299b95b303b1cb08b687c0b533ef3a98a7b0c3b6419a6cb825874c4ca5688dc5cc5ba5c49448b479b84baba1344a29493fa3828e953b3ba64b087ac9f5b9a3f12cc6cf9942612606998207a852b35f42ab80f1ac8bada3f107b37cc6c1b8df40391b1afafe848a92853c9b32b9ecb758b88c8f76a9b5e866e8c359f3fa29019f439eb0c9b5d4b2a516877de0295fe7409dc79caa4da5f6a87a26f9265581cb6d141c3d0e597f385bc77f966ae1c01cf29cf0bc536ddb0a8d75c8c5db79e967c899b46bdedb9528f596de02c120fa2702f73b3756aac59a750ef97ae2a7213ee95797f2149af542b992405c9d79e085521d2e303c14146180904f41937cf4180edc666d70238030b4b6572af377693677a5762ea7775c34b9314c10489518525cdea77cfe8b24233dcb477e9cf48acce10911dc9517587b409742b06e3142ca7a54f36d6ba225bb933632ff06802779563fc43a231a11b42b91feba135d7229f1d29781eeb65d93537c58525c4e48b85083b3226937acb2c7bb3941f95664c254c18bb9f91f54f69263a1d590c64f51f0d8789cb60cc9682082bb399fd87279fe4039c9bc69202a309faa488e26a4e3a5d64ea4161b9a8bef9997346ba46da3414965c4ac84ebad1c2f067a3ec5a0866e4a5a26a7403bbbc447c3b13e9c282ea36307c83a91b25b8b565155146fb5a5146e01c21f4aaa3dc7082e93a2dd95e7364b6a97cad2b0bc27d0aa3f393195250118f9c635f41ce82cb1c8ac2158b3101e3f44132a271a545240938bb56d11520e2474678391d4abf7200b775b27dbe81970ccc517542222a67b693d151ecf5485c198838a2cea0060da6285c6f0321472710d62a78c42c9edf07518704157cc5669c3ac775635e09356304819d718abeb0603886c67d8c0c523691a22b987af137a18d20ba3af239de79cb85672d8ed6beb818c5b09baea6c456ae3a4a7481343aa890a94a15a6502399a0101da2448f55666aca18d0259d95838135097273ab117a60cecae8108dab28d6945cd0a30099645892737c3238974588bc9b4384615917e8ec0c10076b2249a42f1841252533376830f1c2bd85456f4e8577f7ec1bfc7a92165ca5a83b85ed4c0dd0652b0ccc9bf5fc6946f710b0bcc42c9529de51bd99166eb4030bd1c394cce0835dcc311cfb6e3c951643f5736045baf1c3a7f11603cc168b6a47ca7eb909c6d9806543380c603a09d435f7695e6b117b75538d92fb03fbd92d05c7461b113eb5dca813c43efd7835525a228005076b969e9446be37c707ae0025e54863fcd72462b6aed873850cbb92cdbb209246945df26c6412cc16214155e57bac92562c5c14e1da60f9e036172cbec09caee2d14242d16b1b1b9659a7705a59b23fd93e6eb23442825473c820df8342bc33177f39451149340964c3ccd2000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: e4cc5f39086d1886cc8362e6210515fec1d8474263af5d7eb7b5ac9c1bfc65109de928c818728fc17548bee754bf8df9f972fc2f5943291e24d0911a1963bc3e4999b6de2add2e5c15b3100a83be4647f3fadba3d61022970ce43a6d0cf5a84b387b5d05847185cc862eb6b71b5a8ef9747a12e399866b3839e73f3a73e38877a1faf8b88c3283f22f6fc2dce6fe43118ff68ca6cb9e88471dcad4ab28c657e30462f64a34a108bec7e3b6eb988c6bdbdf4a300d476c170879ecd62ceed6b530575bcae1f23da95ae486b3322470523429052a3059eb75b699a9941a028da267b970eb0a8d444296e421abeaac7106f0a45dfcb30a69d5336ea98d999e65bfa6a2cf43bd302512f086f8441d92c11937b2773b1cf33b82076a64b8327bf2f94f7ec3e83037dc543bcc8bfed37e3a2ef05e009745cf504f2e261fe194c256292d86d935c7c971dc4c32653fe88fa2dd822fc37b644a3d5dfbe5a710551adc671f954beb44da64c06b9f5a0fb78c1d1b3f94dd2c0a41829fdef6395da7493d18423b52bac69b26b2773d0c4242d5172722780843911f864959c14c4bfbd83ae4c19602460428f9f111e43fdd3c64f9eed410da10348444e6af25f0f83970fb23f0f5515c68041ad694cb9ce9621dc504b564a4757dc4d8ead6db23a889fea5a7982fdf403e609f51758ad7bb78dc6b69a53e32b808fcfa44b547d7b23fdce81ae90070e8cad630ea8000d8f840af81c6feb308b8a5135db80c2963203e9a13d2c5b4926e68b8893113c309c3bb4cb48f06fb87313d414b9fac19fdaade98e1b396d789381b057a293de05fd96454f4394b122de31d72bde9b39a3c171c4e1a036d7d94b8e59506dd16aa28596513c3a0e6d2618fe8d39671c28f33630745b3e671c872a01035da1624c6516b57226aced46e63c0a5c6f791f188ddc8b0c4637695b1b711a92ee422225f5509d9a53e894c959438fdd81f692b930ffb29bbd9b7418c97ce03263877390f86bdf59b617622d181061e9f146c6c355c7d8c16924f99d9b135174935fbb63b09d06734e41eacdb7c55f561da81126487732cc6ae18a1d8df377f865fde5db3289f0a77359550ff31b7778724449db57483c59a94bdcfb7680476a9a5a38cdac1c1033be8c1f4e6689bc7551a7d01912bc00e804b6e9e6b4e84e096b9ba4f07f0d67a3baea5e2fda3224387e298a144c06d78f26948ee7c88c11c121b4ce69ff2912c93ee7cd96ce4faf7ed6412b3ac238c05c9378dff1051e3a48c16a3daa8597ee0ee83fc0b95e2346f5195a2d8af8df16c9608fee9c1fed1d5ba11f31513431d304a3382f18c9ffce39a7c637caddd67153c18ebec8138b7cfe9e08c9a7844e879424531f47444b1cb48bf2cb4c92756a1c03f1d37d1f6a2a22967e5a719aae38732dd5e37f795591ac91faec146131b354ec31fc0e0f80d02c79cb6f40f42f3ef1d0ec6ad1cb208fd6e56ace109c1e5a82079eb7b6a32d358963ea06f7234221e84b67c716d7e523b502de542fd468b130b9ce5ee +shared_secret: eb7106b4bbabe9796e68f15931ea311dd171561dd000bba4a80cbb13c17e9709 + +# Rho leads to matrix containing zeroes +entropy: e8ac9e76377d67d84f85a142383e777157805be0d0f679ba89cefdfa61583780 +public_key = 30fcbc7549ba7ccb22607740c4a4ae9c72a7c9d75f27120e6551a24baa69b07859abfc0a3f81ae50b410cb4b13f4d3174acc7a36b3cac768430678b86030a92506bc3a37bd721320f658bbd2798bf78135c8a29c5c3b7eabd292aa278a0f58620a89c8b502b3cf9b0ed7d3606f612651f28f5d39646b5b6a16cc57b4574b42fbc5dc6b15b92723ede862ee02cddfa891a7b243b4b8ccab0969ad050a35ba05a8d650c2b19a77f8c97b9c15386233cb543063645dcf1c976d79999b5b16e095724e872c9a799246e9c68388573db17fb137a936aa3629e68398851bab14cba8d1c0be8c213453863a470b6e4a640adab4c97375d72422c1e55d6c892fd117999c9b0a000b7a51064505b237055882c3733020fb6375e48d1a07454cc6b2a7c40bba61c10062a9c1957037310aa66a1d560a61d2e2362d912ca5953e8c3a33967b6121b9a888ba87c388bf1b80064b8b75fbd6afc7dbac45d45cb3d9410aa9c56ab369cb4b3ecbc43942d344a3a6785049b78329610a297512bc9a2920bca6aa08e44467572c2d93b513fa83c97b1a29c161c00bac6484659c67e74ead90095d19481fa476bce539459321aa258da0e2579b06cd91e88bdd297447db2f5b836d2c3613d25a8cd00331948a93cfb6bcf5e374f9f623f571b330ca63ce6210c7d229d27256ffa9a32911aeb77024ccaa5145ab493eb29a2e2a134f7bae4c39ab6a162bbac174ac12b1df51bfd02c159eab2dad955ad3a978f85449a9f7b253a74b4c81adbdfc3efd90ca2d7c8b63e574a09bbda6599f98761ff0c1b14ad429512a46e3c1392a800594f95cf3603a760cbcd6c7ba86ec1c9c74c232f31a56f8a3cfd29f05914ad5220bb4dc23900b55ae5607e00022fc0002dc363ed67c5aa49abeed31994e3440253b82dc937ec718273e25293c01305f4c2c47ba47a5558c17fa2f9640034eea6e2f2955189677eca2af91aabe48fc93ad497ed05208d8401d921a5aac231964fc169673289b270ceb9c745ba2b07dd402d3961c2653c27a697087a58a184a9d8b4a34e355063da16bacabaab34c0f6a35ca4500b7e7ec51af92480f726b034b6246295ea017ac5d7586d2b17d074c7ddb3cb5e9597c35692e405a900a535958fa713d0ab6c9466baab305e83597d167783e22b7099bb913d932672954724631225b6b7c1b717388746ed51050d26f4ab89c56e12697a9ae925c5d91194097da004b7925a90cbb849a2e8e250532fabf1c9bcbdb15a5f17395cb93c7e374461c254ca69c3567c01468aa02d3e445a1dcb194303cdc3c580ebabe6d95aae182621dc52e18055050274f024ac6a5180a49dc0fa5033f07295d00b70a5a93be6ac1a412c4217fd177a8c433f4b26cfb14303d42a705984a27c305e1f08da46213da399eb658c14eb03209e601e38887f2c5cb2aa4384a1790ed16a19032cfa3f368a9c1218abba6b0b606baf73d58b4c771baab5481ae971188a4a323352a2b0f0c3e45e808e88b2ab20942c14496abacb28c313f246b807ce73d7b09a612382ad295c74bda7ae1249dcfb534143acd4ac6a68f7573bf256a946395cfe4463e76bf8b0263559b9618a859f46bc3aba5ae34f903038a1df1e02603801be7c53f12a5000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: f28a06a7b862171162d64f9df3702b7336c47af5e15b1ced699164ae57797974e7fb78276e883360e2b51016d72d69164becd785570d9906641b0650c34bd1c556013688dfd9f2858c1a2151465e5ab51aa40c595ef4909b9c0de1eb7d4ae92467721131e5ce21f7365788798d18682a8035e14d2e769ca10589531ec5243e077a60abfae9bd0c03d8ecd7c4717c90137515c764ae0540a99fb2bb4057342eadca362c1b540d97d59408b2131df36a950d0a257eea95796f9230d649961d1cee9bbd30d1b88bb3680075a4c5976efeb95211e184db3665c7e184a912bcbcd3ccaa249c722b89c35d7374256b5490bfce5a449c2ec93793f0426c4655ec82f5b4492d44cef93e55802eb64d3fefe0d3b450c9b72df7bd85997c6c6b94033102091d4829ba10ec59dd5ca88feb328c39748d26bf44c5b5310d814c4cd9a1291a041169b0ad0af9dad279dd80a5f465bdc74c5060c2b226dcc04f8d8c03cc38a4eb1437c8500c9707170bea771fa27343b0efeb485c0c2b0b5fdd2d0e9c450a05b9d7f554031125e336484d235643f429c015dadfe10d050734e2dec4b915c3350277ab2bfc38479dd3f773f6d54a397eb7825a398e415664ec884dcd6d958c5794d53ed9f8bc8d1de0e48a12ba149626bb1bda6710b48e1803347412298db17c224f8279dbcd311a4e67711fa0a8de2f7d4234ec25952a415c96f4d3a92e8b9dd6d37d726375145d0dc68afaa08701ad5af5a9a029cff366e01f6bfc1d63069d8c2b00f9db8f1794d714b36e6e783b6a2fcbed61d16eda97803602bb0211cbf5b8895c2a451407fa4937369f0deb8807759b16d81f215b69a257e207396df441eee6f8069a9637cac41aaf6155dfb45a7402596370faeb1ef9bf633aa5eb96a207cd3ade1765a597d4f277b6f7c33b36e816d2368a19af20df4bcddc15381f2d8f04e4650157ec4cc0943ee080d24bd771bb35c0f8269be961249ff8a5a315c1ec1ed4ffe5a4210b5455f6d367c2df5f0da09d20eba91c6dcf63b215b39dca326fbc4649d7862b56927b41db2217459c23a9a9b9e83d79fd6f34295f3853eee312bfd30ee31d02fe026eb56adb6135fd51a8c9da35c171dcf5c999b1ccd78de1b9574b029cc0a845b196330a3e32309d61294468cd40ac3d51011eec5e1af1e397c0f6d2355e4a5bf69391e7e90825c524d76c688bb8cf495d2dd70d316996d3b0fcc8d1008427413f0498e63d5001e4ec571bc0e68c37947782e48d71feaccadbd1d99888bb6c4f22e9eee0800c09ce8ddee3af45272b4d9a3ff372ff1a7fc3f5fff8fc2eb3cc909fe273eabe09983223dcbe0cdb6641b5c905be7bab920a21ae6f43beacac025fe07ebd3d5065d49dbd0ba5d603f2c534b6533049c62628bbf3002c0da4da81f1e0f4e957565d79c4b1896b6de04393629fb453512f1e1d39b1462ce7f693ab482224dd376b0602dd2fe0ac592d7d0fb92ec5657af2317255ae3f757b01aff57e112c61f53b850d41a0d2964121a33d15db32dab2ac7583136e +shared_secret: a39c5a7a5e9f4aa4a81e5463048c7028d0a2df5491fa678d38161dbd3a08825b + +# Rho leads to matrix containing zeroes +entropy: 2fe6b9cf4510f212839e348d671b3345da68a477f57513ce363414e87299a717 +public_key = 92a59b6806bf4af964b370a7a5c3b2681cac9561bc4f59c0f32151e25ac4b1c80452e7cf2544824ebbc8d33ba3ade7ab1a585a98a51cf8632a02295284f2acb78373b0078081a291477510e7f6569751cde2106f8a064a24ec6a921103b8e5b820410f15e51ec7a49de77799b16c58d0c350f83a5aa63a286220c9ae97c2455780d917b2a7d6738735be61964574805f848c1d0a689060e591d60c7f057c92896a71e5109c07c0aaddd3622b672109664fadc3304118afc71644c2b7844802529f38b9a2212301dc2d2e589e7577ca2454a7fb78bab8165ce4f94cf8f121eec4531afa5fa02251090caa9425aac327af64601fdbf19feba983b0f55a22616048c646cbf08091b315dea5637fc8aed7b4418e09a70dd90ae1004d8162b5d58c24eaf7cfb47b26ffd98c48870c583aa2a5a6b5385b51e5f46236081cf9317c662498cce911b1c736e02503650761fb528d33d6708a4bab573456c2f01a52a024996a80ae0311dd56aa532709be25ac0e9b7862205e300253bd31210974b44477c3d0c62ab02b1f7d8bc910e5ac0ff29af6c66f05c48edd4601edb547ece62f8c4944af201221886da1f36cfd937e98d6a8bb606507c5099a76bc91a38812b822da60afa0d1606cac59b267ad4f47782a882a8415b9cef663ca89240c474ea265adc9f71eab97cd8215c10a32cc45287ed53180e0982fc6aa3db2b0cef48640992a33365454761ac072f765e84a46504304d775929222a6fe7a3c790b48bcc255ff189b5391add20c4581e4c59d09744a56a1941734fd24a81a968322b33da31234cea9387d31a9e9374cc4203a608285de5996b62143aa9a4dfa5a2cb0066d2bc4be6885587a4408bb3103a24b2561729021458b77951c8b8564ef0a08add70c3b7a1afcd3b4d5d3be685ba1439aa66a2393531b86a707576da189ec3885f5756c851abe689024bdc2671d926ca511b7c3b41e03c79c2b3caba27bb31f5a3184e16055c8127ba7b0d87216f81318a0d88f1665996a6b47bc7808daeb799935ac67653c59e23178da6a7cf40f9ca22246ac56db9417e5062d487c1b9ae3664109a9329567bd8c577d8cc0ed65cf1b6887ec3836fd16bff20a7671cc37b0921129b410a5e22b01d3477da0230ee5018a571f7519610c4badf145c5c4f5a29357a17f245f24e3bec0d22937457c38955f0aaabfb4d80bccf57909892e120546868b9b556289cc5594c7cc083e808f66e20d9c855d4cc936db566a4ada6e46b680df8b91898a002d9494a30127855c4cb843a8080205fee96f101b9c06104191d0bf92273fb0cc6f089a202984c0ea1c46d1f3b037b7c9b557af96e89784d990a66a1634888dabe6058d03c8b857605621a0b031a52cf26385a55f72d36555b87c5f2a36fdd4a72820ae20e90025a077e82c20cc7a8ce4f64c12940976d34e49b1200bd2b11b94bc5fd379f88779133a2f6453797f5c34a7b916f4f3bdc8c10de83b08312ab49f34cbca4917311401c7581a3cc02cbfca9b1da3cccba54c1ef7992335b25e282ec7677698c8ce94a1846443b1ea9261ff688f467212977493b27a43aebb681450ad64f31e158a5cb98a9ed43554c807090c22a1f343605bdac089362c0e2bf23a83000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: cbfe4560b3b067abd9cc82c2c40676f02b730c5280fb13645666b719e7d9d5527e029f3d75a3024502b338be060364a41981db3c7f52c59426b43fa835fc2fccd92a26c903adb74de93c2dbdf590996ebf1a9e2003e77cc896e2afce50d15bedf3fbcb65675f125745fcb1804e25ef99b6f792578520e82e599c5e83a500428b191bd93798b73645ffd10c9beb3abf33535bf149a3471f85f55789e3f73b55425185449c60bdf62c01a8fb1936f50db5d436066824b378902a81c5edc3b74b3bac3c58eaf3a993b3b4c1f2a0027cd7156b7127412294214fc7aae635edf26f6e5f8034464abc05f4059de6cabc5e4a8fb83a8c25bc88e7e9bee1a8cf312434410ead60d1b482399422621006ab52127df15f7385d62480bb0fe494843775aba4049ef94cceb78e9dcd3318608d3fff2e75e29769cfd8df0e12a77ba6db5f54d69be74a2b03d62db822a8cad7f20ad4655bfd73c62064d23fe521d37daafcf143f693eab811d28da6d0929be3cdf61a56e487289c02151f11342756bd419553186ce79bb17d5d5754752bcb72349b65cd64b8fc6066656a9cedda0aa9a09f567cccc23e547cc9ad86f636233be7815dea220e29863d830d0ef9b0a13a62a56237e2c6f443e61410253957ce3b0f95dd422012e1b84d32ec17f534f56641e7fe92ed181d830b4d0f3245df6ad891c26bfa116d40460c497d8fbcb6def0ee530ff4422d132726751d724cd84f8dd19e286e0a4d891af0e4a913352b9afecfbaf0210077c5be9ee7f5546700754f7f0dd2c2600f113c747d2a706009a8838a7b2b958324842f8fe3933b8e522d63d772a3bd0d5186342a20ff3a5e7a5728fcbb3ec18d0c90e5fd2430359affbd9648d1ca2400a55a99586807bf18041fe7af6f51120ec366c99fd4994f20e540e31caa71d5f95e60a921cc62db1fe6f9219a7705edc1a7015e7ec126a22f7ff0c9bb4aa3a1126d83ce4987ebbda148fa5b3cc07bd7c78f26699486a3dc690920fd21d75fedc4b631841b634641594fbd98ce2d8376b179da29f925a31589e04c74c4fea00db64289e30ac9e58043955ccabd9515e0c2a88e6b50dabdec8b6f574a6c44f4a0ba4d00478396852263376574706e5f92220492782df64becc8149b24feaf808c85723b7911961051468d38bb94421a18364e2c158035172e9368810d2f68f64499b6b407bf775223a3f345223ea3c1c5f456f48983d994fe4da62d0eca318b130bc8ade488a900b7746633187bf12a598f6f144c55738d4831f0ff3802a6a8f742d7a9f64f95f2401194ffade9def6f73fdc67b386115c9d905719808f41e2035947cde0bbbb44d92e51258822bb4e4493a7a4b0ce64f8620b3c54078985a3dfd4cc2b3b5ec3fd870cd6ae095c39049ad69234966c5f1f70140f88c75f11f03fa25c3d673e5ddc14f79f567bdb29a2fff88e11660327559bd0d2511d21a8ff1957c0beaeb1a26f280b3f1146be891b39ce13010c77b775d11552e59dbfabbb64409553d3da222902d0ac1e78b21677ef +shared_secret: aa50a536b37f28e5f80904269d0555a6172d717433bf9a680e75e98af3209a91 + +# Rho leads to matrix containing zeroes +entropy: 86630b4f72820d19e9941784183b3a0d770609becd6fe0dc463cb6edac432d59 +public_key = 89f5b871bb5473b52efb4ba5b2a8317c7255790b7e96937f9c95466431a268b0bbb12aa639d418775a56d3595231262c6602be765498dfc0b5cd404a630cbf46e06cb235ca7064a8b7e2471fe34ec3db94c8ea14abf797d5259ea7236391c3b7ddd3c3aa1745cc6857dac8a42693274507985c32bf65535d6644463753c00e18ba859b86b654916c9b14be78a5d11a2fbcf9ba9225566b600b0edb3637a18319027aa494a9631c6958221703579d75b9cb09d21c34409a3d2b342c05bfa4b82b19444612395bafd8ce0bd772b303bdc37c1e57a26c6efca874fb244ce314f63b6635c7af1be1a3205498204505a80138bffa0e79b60f58675965578719813e31b352390ab04376b45344bd8efa65fea466e8c78d45680be0e1381ca5af4cb666749676b2eb1e02d003dee20f4298b720aa6895a80a17f242a983c97a43981122043d444a5af3066816c7a07c7c880b2b2b8958323711e5551c91268b1ecbaa3342418b322766334d5d4691e0111d56e48637c012bd04a9b06524c30752fb7834a2506db7ac7ead1b72cde45dc793cf875085f67a055f6cc0f7b703e29c578d0329dd2a01ff05ce9b1a5a8b993621611fc51356b5d4a55c4a6ca3b5046d7b9e305494c93177c2e78ed1bca1110c7221ccb07ef99b3aec74a8f083ee5a897d55515a5117b1c244c0898738636e577ca59d16cd1c44299d41c311a8728ff38bc476b1027426bea27795396e2bc24e0ca43e17cc8e63bab9463b42bb6812e7b840a9943ff11210aaf11568c85978816bae1457ff364923c846548b5908b2737514c625c8c11a0898924ba682b3c8c30437e8b23477d06d89d39f590c8e2561c698362e99224450217cd0a393ccf870a84159273083008345b2973e98d78089317f7993c299b7c64ed3309b5b6594a236bb8c1c67cac692a2a1746987ed6ca84d5a5a4003b1b1347a9846656a36034d7a148cc8157afa6c915a05a81b1d88568fc3f62b9996062bb99e43447bb22a5b29473a728c929d57b6ff774f5364c9f4145944b979bc549c1d5b0e9e676b2d493f799875762360ab9bb4b322484bb78fa399bcb889c08c94638d95518bb8742bb2a801233adab5bb95903f355126629aa87477b19d3135af8695f3da81df3559d510a7da3cc364939c8b507c99096630601d60999278b731824642c6a018c22c82a60bc9e0203e0b8139dff977c2a903b812a0a6c79c9bf21618b4ca7a836e20346f64483c277750d38b0a204baa8b258db85b3222a5cbbeb599af8ccb19c649ae048d97153b5a7c974738a08c1c653292496287682670cf30197142dcce7fac5694f58bb9e23c9b496f0a939636d6522129038e99179c8cc37697c83e908aee62a1fd266a613853fa12180407a222682b49bb41c9c23c55c63cc7d115da6cb53bc688fa178f632b0b9042631999b6de6165322a817ee3037bd33e6d6024174439119993e1776ccf6862e104019cf739ebe62e0dd10628dab37946c0f1e762ab4bb94fc993cffa89ba245d7e48055c43a8819c4701bcbf44044210c451fd4c5a82231676ac2941278ffd12c686bb21547a1e832a48cf991bca13433d4a55fb485f04546c8a3201dec55d1889942d1928250867ddbf1a9138000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 0802659cbd143028c3d5f499c51d88e361522a2a6c353f8bad088b1f0a6eb02f94458508a80aa98ec29952e405f754a77ea9cbc07ccc41ff66fff5c4664910a6363da480ea8f0de3e7bda007593199494e6be43c713178b791119adcd4fa712e077eb46b39d1bb073ba7f39b56885906fed63a0d6a1be4bfc2d512a17ae327fea8f1f8ddacc103fd8a1131908ac348dfd01372968ce3ed40ae90f747be9294f8e3c356f425dcc5002e9363189969f3316774acfe7982361e6f057a322d667032c5e1b235cb44a7e7be4cf46d3f6b59154ba303abd608e75e55214ac4993683dcfb5f4cf3d99b31b43a054325cb6fc3614b76ba18c6f40ca3a289c6ed338a5ede7677f6a57cc4d1c0ba121feb6cd170419a7c9b85c63233ede2db86d8a52018e2f00ca1ac31157154dbb539cb65090b2eb3a5ddf6195dcd25a2c3c8ada060d2a9fcf43bb1e67ac25dcbe67709f00abc94b9ffcf754fe742addb0b928df78122f0b86a2a3b7db85db4a9596f53048cb0bd2e849b97f99f1dc4deb86d4333a891f1e5e205637a31956cdf6442632618e97b8e2f71f0d97a88908925fd1f19956d34b67b258c49058c9a162626066731ac4c8272682c6816e7a513178ab4468772185d461ea5db42ceeff258be448ae8337f1c8ce44771bb79d6e7736949db9b68307388c7a28781a0b0180bece5e0f21d99309621d6ede5031cd791d591b7296f8fda67af0563598b463e19aed4576c369dac22c7e74ef6c1be036a74e9483bdf534cbfa78455a84568a7a2ec9a43b0be67ea16758cd60c999cd72a8b14dbe544bc142eae6ebe838091602535a127f7c1d6ddc92c07f5852158da2ccc90551edac0f043a951e5c47259001c8fe9ef8a9af5d4e40422dd8b0244468a5a9f0fc62e300f0b80069993cb0b5fd6555c5feb71a9e07fa121c82dca7d9df561b967436dadf5752e9cad9bf587a3e6c18d6fcdb00aa21e6698617ba0166b52f4406b7b184abf053a713e55e4b6d5148651fb29ce1297554a254df7ed1c97c2e30e6afb19289f1e8c94831211af2fcf6e3cdd67a04a65c19ceccf08e80f649b5120f6f6efa2af36c53884ab9a5fb5ce24971b9c907a130605bd996e6a7e4b8fa852d421c5cc46d05148957288a98ede63b556c96b6056496736b1f1832463e5ce4ca602eb3c2e86712cf4d8e44942554d930ebfa9eabaefe29358f23939948616c5ff831f162826732c25c319155808eeca9d7cc5e3325b01bffbecb7520a72b3b71e4c50d959f45b6a79789dce902ad29e3a66373bc1b40a821c6f0e6057c9427f30f3a7cad672542aba0142ac6b371fc3da667a5aaddfecd70986571b49bec52c59eaceac305dde821d248da99058e3a23df496fe51cdcb45501b02cf5338df7fe762990c2a6dcefb23dc1e5a257c14962501ab1e479881ffe5868e00074cb8fafe6477b16530854da6223153680571865a6ebc058e64c11f09236886c736592e73a41de2c093e88348631cf31de6440ae21bcbd045166d3af8539d77f2aa1b202056d23b +shared_secret: 9f4a910d1fcff86f96149e88e28cddd95526ee64c491291e72a2719f97b2beb9 + +# Rho leads to non invertable matrix +entropy: adf510dc0e997af14f96e4863f316475be59850bc861ca0d1b057d6b94c3b5d6 +public_key = 947895240c96489219f575bdf7b6305fe7ba4db674f8b57be7d17947b73ba481a51737962bd0ce801254d54bc9d6d5bb184609d844501eb81ad43007fd3513e7e6aabde15bfec8b74ef67be8e4b61b4358d4828914033d65f89915e6c27e5676c98423f0d2508c343e049cb8044a4a77666a3475a52a4c73f38acd49519486e511ee7b8797b35fa8301ba8fb793f6906304842604b5608fba93f3505a765ba5c329289fb4a69347501c686b5d126ddbc58f5b8c5bbf044a1a58926d77ee9a7bb0ffb69f1986cf10719b2379130872b8c6640ab856622eaa08b298adf98115e68615d9627f339c4f08ac67fa464ab5b4824ca3765e33a16f7706ab7c1deb31b262a3e14870ee4bc30a746171f3c998fc73663320ea3475564c25e9fd869f1e3b94ec15ea8f355e6944b874c469e96050b0ca62985912a4b87c4aa5434e4929430b06f220737cabcb771b6714497cb07b319e57165449bc7904201012fac808013836dde3555ff6462a77125a6a0c6f4aa0822006ba5357ffc494602d87866854ec8b646ef5a545430bbf155cb4e9c36ce2c42b6e48fc26296b2c1415cdc8d06c38ec4c37f9e16afd6fa232fa396832a26c7562fd55b80bea977fdb5b7a5f95e221401a932687e535b0213056297391d36b0cb320cb3358e1ff19a2d239a8f5a75cf40a5b4130ac2972c1a5b9e4fe799394c23196805459336deb36367b6b2c81cbbdc56840ee0058ed799c5c735df07a99043201c2427a4699f5ccacd3c86299e458f3783628258677126556c485406d0678d030afb082b88676745189800fd9d6267b557a3936e262baed80ce471997b0147b3556a8f74760e85391300ae4f84c494a09da042422f196dc0ac3a65687d33ba4219788037a14fc4087b585842290593dc853c68d70c410b98117249654c3332685de518a3beebb5469c4d2a624855124025544afad7a26f5234bba21b8e772c0a58572608857336a9ad070b6b01990fa4bf797902d0765c83604ee4767e11e4bf45ab7dbc9ab7efc180789070380badd67b96f0c90cb95a4152144956309cc0ea6771655ef11579dd703caa09c1e314493b758e8a12a8e7dc8336c29a2a9198873b2065caa6c8ec545c03827b39b210544668e9884353791348bc74032d4a7a00396744813baa1a83b0d1139ceb18c75f6cab6b13cb8722647a730f67219096b50375a105a5dbc960142648fca49aba468ad77a031334ae650ba879a859e80901a70fc2d80083c2b0786a589f1b65e0f83527b60d298b8b93a177901b78c61bc6ba296a342a412f1c48250340a0bb5e2b227b42451aead12b196540c9f001907a40bc68821b040607f918d9199693395d4f828de0502c8c601b2a787d15dabdbc764ad9022cbcc87fbc4a84c22840a39cc610905423a5c4211abe722b69ae78803fbc56b5f3671491495ea9a7b067541954650582a1a6358af04419c4d2acd16910a03a2c04a1ac3ac6138f162d61e6258c863427a8937b65c183734b533c4bf0e52c3c06cb5422c2bdd063e405d08bd7a82dc731c2e526a5d19156b19b68db05421c5d099334bba29da2d953164c6cb5c6860de4adbd60525dc96e1d261786d79f09819d680598a900c42c3042e336828a17000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 2a7190d8db048ee0963d59eeb251bed93d3223db4415e438d40fa06cfb65c5dbc9cdc219a8e007434870fa10c8d64f0aa3e5016c67378b670852af5615e23b612f08d0f83d26d4f48e108b6e6a639649d618245055270d7e6f47c48152ce42effa918f74118dfabf87a497a412a0cc464e99d2460e0dcf6a16b99e8f35224894defa85a02ac162e122a4389a7c85668781c6d682422bdff1edcb442a73982c4512111c54545fc8cb65d1fa2ee1ab685cd047aed9085af1144014810959fa49e7c08ef15bb7c97e8306e7a28404c9c26e21b053e9fb6ce86a76b13fc28df94f3719bd55dd281ad1b8289f8c53175838fc406a7d705c4a91a2a0053507fd7176c1efe28bbcac57f555504f5b2ad0a7e8e9d941fc80080f6615130284e428fa18740af5fdfbf848b4c772e38347ea7cad57a72cf02e41b114de1380238a6fdd35d20e1847e92c64a84039fc3564a7ff85ee6c4a7f5b05fc90f95cafe52747b34e3a9ae91b28c659f4941f2c9ad595700c31b0dedb53d6a2d4fead5d754637e89c4aa7175f17882aaf775d850287460e4971dc112c498000f4da174aa4f4f3f3202ea9e119cee357caf9c1fa9623fd1033df981c09a010dc44a71a7d43d55c328eaf205586b225ca998c066623993046eaf93d827a891f1e997fba4008db106e430ec7528286b2b2032d299acf11fd3f8fb57aa2cbb2642412546e09fe139b377ce8f6e1890be4a23f50de04b5c93b701a8679ea102f90f4766d603a164aeb7270ca85faba085f15eabbe1c89ff2edd4b50227503cb31c34f645323fd38c7bffec6a825621579b565339624b434abc090ccc4c1227bc63d4bc1a6e2535cb5b299ef03061f9bff77052fd23984d7d6f63d986cf310474feaf338791b158c542a361c9c222f4012d4981247f4cfcdc3a2cdbbeebf9aecfb97e29f9c328be170d5da3539b277d3f4295c6ed3712627b5176b7ad1d2aed1445ef2e47e46d251b74b906f6dc3c3d9f54968245845f2fcb33522659508bf54e6358dd3cc43c2e097b880371c6cae243b11f36f8c34ade6ff113da5ea0868c4f8a5d0eafa3fd5ac8f5bfe776f5f72791d654fd845d0ee6c9d28fd835dba5c367af22ef2232526bbef604c163417542bf6fb768ce2c29000ec626cd56acd6f3dbd18b5485b710e4456f2a01c25bc0af5aa330a5f9d45bdfe985710351c167556acbe0fd0b7bddbd3a86dcc7d7ad63130f33b651afc897a7fb2a724c205867c4dbc86d53e68b1679626c750fe5335853a3489821e52402d0b1ed47c69992179c663ecd914e77b0c94e870ba17929d53e567d444e592e580b23c160933fe3024a49fa8656236d3917192c44b0c5a30d79a121ff12411dd6b3d443a5490276dd379fa9e3227b1756981b1cc0ce44fbb939de802d16ef81bbb98ad6add920c42d908c72b7abfd6e946dc16598272be95c72a05658070a211801b6ba7b04248898272e6a348b26e93207185c2d57600493a313ad162561da704b75b52388d84b240993fb3a4900a2951bd380589fcb +shared_secret: eb34705a8743c042134c4f17ed6fe334ee260a7e77223af5bf77788ddbe5cac6 + +# Rho leads to non invertable matrix +entropy: 3983da6a4615805f6d55c14ba582d59a40e646c7ae77f4835a51afc6c37f11f3 +public_key = 33e5bf55f1b014715eeb1340e17172a3414c573732bed83d3318b40e32a5f4fb064a8988dba93c5f1aa8249b1d0d0393ec765cae519961c109f607306b8322125b0eb6bc000a061b2222b58faa86fa706e27803b02b79aa4e9b26e37130cf14b903a70bf042f4d72c091297179f3a1567b1cd98bcc4be1c38a75139df8c422769289fa73562a8429e88dc60571e933b22d8a9471cb7bc11a6b74e0b62643574f91413e9913229584dc8936016cc5f5560a044488183a53822c77f5b26ff9f2c289e7c88795301e095efab2b84f90350524549c855dd9928dd735a0da461450a31ee2e3b285698b5049000b58344e393a33ec7b114acbb6c69ee40b62b986a7a70a6bda64ac03423517360df820cc2f5a0e279b30fc77a41b220d6ee3ccdd4802ca3447d5065dbcbccc0b3a79e932c1225acc8c02c906c49586037e6a16c5b6c64e6e6c338937ca94c77d9cdab427a258804768e739ba637725b7f98ec064b645e23710d50e1a563719b190d8127e8d8557165a7e61770008621b211c1ad9f004a97556d41511d2a8a290490a0f6b289d3c35cb8830f5f6c4d60b9cbda14b50677c210b6539229d44c7376159c4d4f4b7e1557e1a25a51f6456bbb983177599f7f1ced0b15c751b1046a1015b4acaf53c8e43c7ae7a14202a54a7e3037027fc5e8736a4d7d9145a56cf65b862f03b3a9848c8c2704295f328a6cc83cb17774cf20f9db1162fe604c77100ece175ac3a9f3f297c72b7a3efda073fb6397e0aa8fe60c9e5d26281699c911632d055434ef4792a87c96d17228611828c0282ac82abc3041fc902c09a1c918fe20a0506788a31cd01583847373db827b87b7c29c519ae2071185910b4f586be80488ee85a31c63857fe02a11bb270337b6b92a32103197f260b0929e289f9c9308056a7539394c0071df82591428bb8a2b734db430074f9749da3bcfc46163c3b5f31430e4556b91efc1f62aa912361209746909eca91b40ccc815c1274762b9c697cb7659dd200a29a641db2404b954a1c17994d5b3a49af157f7d645df88863f145734d7262cbf8a640d2b31e601124717c6f456db325b1b4b344bf3a922f624df598756f8a2c2acb0c4e62140ffa4cacf4c6e03828ec903acdecada6d0074b2364057584b3f0530bb587666a88d2e354ba68bee404227d7a963d8bab4c7545b95a984d117ab3f576fb1ba4e912b468889762009eeb83949d39613ae7054d9c76ea556ee4a8286bb489e4da9e4bda4db0714104da37fe1777adb632c57020164331bc29abeb356344081e3907c467657ea53a1111d45ee2f416f945396e6c63df328575808640ac5b1d5a711a5523cb7a18263224ae615840f9c448274409369b2d66b135e57648f07333fa326045681dd20cd9bac300c834ff582c1be9223f427bfb13731b27175c1028f55736ea50a7adbc819c742c22328363632f1917cf5c89441b841c3532693c3718a1fb693b28c103ca3ab9690502965f907b82cfdb4e0fa2884ba7ce8b0768ad36a32ff60b4db45edf64a5d02018836a8230c6a2f8a037b72261f4436b987066bbc90f65f2c940635cdbf1b4c5a853a1113c86010bb7b558f9a773cab0434399874e01afe167908045c34d3f452196000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 0b52af120747b8cc02ce11b70f30e159c9f3028f0b44757f23deb9b62ec75c61d64dcc774729b5ed59c23cc809a88d075021e7799b50024bd9ebdd3ccf710f17dfa89423d20542a44a97ab3bda0bc0825f76f8f481a52e66c344c024d0350e4d28b49bed05dfa166d8a5ec175e43a2a535abc6dc4decc1cb9afd9f05634d5054fd7b4c17dac997a70798c5c712b276e56e2af4543f9b9e5ce362d2f5f7c2f5af150c9782af88ea561161a6e5892c6a7d22a367dd461971cd801e9c5f2e2fdfa70f39550d06157e66e0806143fa56d5a9667e038d0c818b2be48de10408c67c948ec5cd1c543fc92d76fe299af65f94edd82f0be2ab3cca31272592549699555dc08e1de7097e20b83fe3eced16446d90f79ab46ab702804cb3a0358c927b7d126799f52c47e613a2730680713e8056135a26bafdd8a9e38d8c30e628a090878037da0afd82b9fe89a601d3641b6514b0450e3792fbc60d3e78c7316301b2e3dad4422c85b4afb1d1af20de6938a1d8aa2625b637ebcec8754ab5b66aed8b13b669c81f986d158cdd9bc82db0eaff8c80895d9289e30f0595131bb9aa1e77fbba451c1988117e2ce8b4e3cfa6f0b5c00d894753a9c93d269d477b1c86fbfaafb1dc083c7ecf3c688b36b4107a2c800f17d14acaaf795fe9ff913f702d188a204a26a3c301e44a84c5e32e9c8efb7236943849dc442bba5552fb34dd7e7c486959fdc8df5d380b199a9d637c1d11091406b3e3d2ab587794eafef76f6302c1356813109acf1dbc7380f6eb082a2e5cd4e53f93dc277372230997a0858229f9ffec2691d39f748dcf1c911f8d49d281bb9299582e1dabcac1119a7bed289a1d5ca9b471542be7e5bae58d275061eed3ab92dca9e444061d641f3e128d9d44757b350bcf673de1165abf6e10f87d101562eb6585baea22583fd8193da19f15bd88ee614523305e2d996b04db09aa3ddb422c7b9dfe93237e3c85043469916763bd58132835795d4c6d01682fbd877d132589ff21de3e4882a927971ddab6e2b31a01f3c32ea60f506bab44f8ae74cbd33e551cd7d52791155f390b409f169f2fb2166719265c6d4fab72abdfaf530842ca86e6f2d6a04ff0c96335ea20564f6328f4a10caa1b9ae6a2873a966e2d2ad2819f3e398a493d878bfea76b4372d2b24b93edc9f1e2438ac6f3fcc1944ab99c3729c3526bf1069b866f7b630c5b6ba7e10696326bc0096aca3a6e526e484b8161716b7377f9c5ac7401a850374c3adc7057d0f783eed9c98a3004ccd529a5f0846bb6cecf98c55470a7b55d3c1be06cbe3a3fba17f118dfd68aecd0ba783cc7489b7ea3bb8fac98e70c1e8f047deefc3760dbcf6571305eb1cc3f88ae3fba08359217ba391c1990d33b89174a5e896d655aa36909a4fb65495651ce122870b5e870edbc4b0dc9d72dfdb873cb219d1d7b5143993c01ab6929baf37ae6de2d920eeb333eb55a0a32a1a9ed2d4f29f9dca34969b268a9f26aa6c0d8378aadb5f206beb4f607f308ab64a9b1669c87fb74a55f +shared_secret: 4ef9b4bb13acabdc211c3e0860f1b2dbb4ad467478f8fee194ac57a869a4a8cd + +# Rho leads to non invertable matrix +entropy: 2676b8426b9d6a30af007094bb76d65d388c2b3da938215dd6f6987206400e13 +public_key = e1b4c439d04b5c35913283bdfad965fd4749a9eacd65d1182e83b448bc3d8f25b525d57db01394cd2b99fcbb6b3140c46c9685916cb4d572a78f59af75342188156fe6b991a7780ad5366104630700d585a6b93ef15a8025b8a32c57681ffa88c1850fca4b65928970549aa668477547b30afea83bd3cb6efa038e451688d6932d342336fa074565775680790404770a520b0845a7a09caa5ab20326c8db671541305ef9264e0074505804ca2b7bce041b69c20d0c67a50bb46e57cc920d4405e4960ed1b20a14fc8fde1626f7607a77cbb9e7835f1407b83ef53c66e3145d764cd297badba3c290957180f650844c31feba01ed2631cad26057fb610f302636500e3337b073e33b50fa647eda24425021c5c1c8eec6163ddbb6419aa3be57bffe37cca885b8456652f7c00ea65c78d2db431a28883577679485611a9cb77f95339436787f1369110203ecb1859fe49662bbae39b6bf736266e1670940780db319c969570c719499ef871e87ab61cf435114551295ea4fba96ca5939ace7a9b712635c09667a2ca87a241380edf030abb8290d1856b520aa75e52fcd3316ecc31a8c71136480c41e7c6074207be522155d66a70d73c913a62fc4f77202203c3fb58171706d55455adcf115314b71ae00745764877d44321df625916a5eb5a39bc915a7adb5c16835817ba9438d8772273038abfc29104909da051dc542719d19007a786189e2cc9ed9268486068a1a531c108659ba37383a9585440dff07116f4b5fe9b1a2dd73320b2051216009a498c2c64b59aa539244e487464475918075ee807ee8bc9bd413af46f80717f31365653b1173693f1c5992b45770c515323c74296a0ef3e8b52be344f1000f22971ac19233f25a4c0df631a2d2b14fb5cb85d6ba9c55a5dcf42be1f18f9be91134a64c57a723f02a13d2e4029d6baa6d0aac1dd5cd6d483c3b7bcfe7f69202d321d4423962a304dafb930cca0671eb6ce7a0754866827a94af22b26985e264af1278cf481193390a2e870b413884c3da9928caa8ea5595a4c4aa2d4a6f3a9956e87c87ce699f04640d2d699a4ff314abf653674b351c69367a7c6041b87aaf8a47ce07857244b71c16112db463dc3239c3908bbf715b86a2b7edec09080c1840a2687c4b57854238a2555d9d2469e798cfdbc6ca06470bbe3659e1949df3f8a6ae42822c8702271029689b4ae1573b66f5541177ac5e05118d4364f43c79d5d2cde2567811617b06965cae7491aff33d5fb4bc24fb8a69f4c0c651cd53084938a56e792c29d941abfd448a38830f9b482b26fc0f5f8a25a2c570c51a62e605cac0a0b19d3b3d5478bc879896a3e01d5e6a97a8cc876bc96ff3040a81c87afea285a35b3375d5b8f95665c1bc6896e46b09d4a5b13a48eda54cfb168a74349887a93ed9e5a1f40a5e37e2a97823a2aa7c5cb028a3e30b19d4b94857090a3e8276ffd45eac0240dde5a80f46ae14f184fbc29804726ca50462ee2583cb92953b22839a27aaac963013b13c1d1847130c96371202b8027f3df427b03119e5e57284f4751ee76cffe81f315932174560dcb211dfa13ee9d242dff22934550227ac0f59698bb700b97bcc95fec45cc65b12e25663059565330c000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: d421883017a28b1b0fb5cbd2e19168a0405633601a3ca939f5660877863828dcd366e6602ebc6b7410fdbdbb148fd9d9b5f803467e0bf26a4b3c84f2f90aed4f64d60ba2862eeecd9bda7f4ddd0c031c231f5727a9681845774573711afe23605c2aa64a89753f8aa0c4b51209c3117f111b82e70aa6c55826e12be53216d299b1ff18d2fc2c8c207131e462d614a92171bfd0855a2319ed6a4812d6385a3786a39b489405fded21cf7a9e5d581900c3f04a75be593d4ef5955fd7419813f65c3d672a8be0cf12b42f19d3775a489090cd8cbd07f2f5ea5d4895e15c53737f43dc934d2252873554ba8f50bbbc4a6964c746c34541eff210290c3b128129b2f8d7e033ea6c945d666c4baf45883fc724da572265bea46d6036f029a7d25b9adcb0e88f290c553378a940bd0425caf60374cfbc4dfc54879b95f7ae4331a8789c2086dc4ade9c580bb8eb2fd07f3170cc5306136d715600e05499fe6940aac16f82759065a153bdaf51335affd893c296bdfad1ba11fe4b10b49c2b2bb54444b613d6b5c4fcf458ccec4ae711f840c5bf7c75e4f808e5da7d112b735345d7b7cda8f6aa8489fda2790d096dcb9f8733c7f589ed047e9a56e4dc0c5adea121966be8a1215eda38db95efe2ffd6356209fabedcdf2ea4cad4b0b180ea2522d98cae0f09f793f037dbedd5f03d12db9016bfd79e07726cb575981da69f88a8aa5d104e90ea53ab57fe27b291bedc7acd5aa4449053a7ac8012fcf9899bfc423c0018e539321a986d4011f9beea70ca0e984026277290bd9373da79389341c90f1ea64de20a5415dfa16b7857df261e68d515c497dae0a6fb5b21224f0b2a3125dc3fee9395316d4f269154f528f5bf3ade728f8cb9d27147751304ad1239b955c911ef2f61f0c193365ed6305d4c0bd97c9b2f70e3f5f60fb9cda8128bd7cd6e6aeb1e7909881a6a35d34df4224b0db7631df1a497a0dd699a086aa8efaeef0e3cb582a71deabab97bfb77fcfc2067652311604d56ef3999c34b72793323607c59febf9b41816d03a4db06afd9c19444abf09e1126a5cb19842c9316718d3cfc48e52a0181521008cb90607a18548c6521520d887935c0d789942ed48e68c28905b267c9493e33004056ca159b823aa7e42d9b5104ccf165b0a8e8dc19a3db59b415049b1d82aab62bc6f2adfec2ae128c8b79c0c9d750ebd0517b6ed61f8345aea60c04968896da13f84224fd92d9c56862adb73c0d5c3ee8fff1c05a4586446f0a74ebf39898adec7f07a7ba97c138530403f2523d85931e406d476c8569e0877f73aa37cf41f0448dd2ebc89556e79bc9a081e7f34586cd7cf2f960ce8156a3e500e63fc9d652f9af37bcc36117449b06f67caccd7b9f94782d84791990497761d503d07fbb50e1891dad302f20b16bad86e1e31f7c03a9172a6f079e244314551ca5772d43ae75b4c3e44aa362f9a950c7007a7e3d9758f8ba2664add4e37cfbede8066068b449a100db9e35386da603f7abad9fc85d32090ddbff01052c1601 +shared_secret: 96b7761b785b1423456e7b84f37464eac941840ce73cb0e5903dda9c4c43a296 + +# Rho leads to non invertable matrix +entropy: 319c51bcb76124b92f39820a5653c0ecfba79ec91d632b0488f4020e5df4e37a +public_key = a58974c8174cf998b681737830ab9132c2b925ba0a9dd7573197a72997cfc9fcb9b7fb8f7f7b881b280e43b1719fca705a209516981c2e88a617625beba7acc5a2335aa57daebb02869339b907cdcd2c4aae01a57a58702fd0883732c9b334bdc6a9bd8340bd83d5b0cef4ab2da156ba283005111360695be97576dc880d2e2a32a9e666070666e4f46b14f2a52d7006c94803ddd872b02bb31ca08901c42834d95a79fab04d8c08bb2bbb0348261f8426cc16720fa188458a4224b92dbfa067c3b518cd74a639119555844df56c0cf9023259d97fb326c45067c18adab10a881fbd4354f348139613b8f5e911b969aad197cfbbf4c1e24616b8f0b87e4206e2c46201b99da006a3c8a704ffe6ae36e3a7c07373dca58e1aab2bb6cb62a3ea5a248450df074dee89511e837b66b409061abdca119d00047252668cab621d0ab82518c66d41d951af924cb6b0189f9654a4a7b58359bde2e5ad4ef729e3d35ce95a589b237f03d10604002debb248e80a93957830c2a06d483c9f062c59b7313cfff647a80834809a3f6198658f792ecf9cb679a53ed41519b5b91015005cebe8b343d16928b9480daa3b025c68c8e9cdb7276bd588c8af8296eaba9a6ff44ff257a4542077e70a73a959738a48c007544d7fab9e87d25b04a01d27a8473ce83a6f91b3c8c9cd0493c35aa01fb38613f5d1932ee81e8622ae09f30cf5394e6ecc849fa881a555a1c4a7931e91100b7b26797b643a3a5773648609b5013f565ec161b657c653de89266a34aa6d80b35450bcafda7fbf1c0aacd8647508bba9e9b2ae6675149a9e042b6378c76335857f0bdc2b2a93c2e23b6f89d743415b71371c9e61f4590254508da401b0d8789b66c6abf2bc31a8560f988586301f54d6123dd8a4e7a41e9246ce3cabb721db810ec54ce806be4b203b8ff6574b397f8e933d930c23f6a128f1c17f017c2c2b22bbf52b4741a8c2198b6a2aac6836c09a3dd1115074249e26180c850567c33fa55b9a23fa365cb8c425eb5523dab4243b3cfe3a7fa7e75aad3b206a32a11282774745bc96c566b05562a6696efc789fe8989a6fc218011c4cbf15b960401b4e4937c752aeda715ee0e39225494db1a0acd61c704a62bf903cb6219951fb568934f2bab9595895390eb5dc3ae6e32390a942875826b453b42bd32045c5cd917a01e283812ec0274de627c1061a8208c7ea0a4b5d71004c77419fd080e662051eb2692d7676c5f319f728169db707e4b9c538f9c7f3d823a53199fc9a9f27f8a183d62247529ad152cffae14bb2d33e15dc669df777ec06600723a7da656f7d4463f0694e46649fdfa1446306377541aaa7e3948b83b7b39522e0eccf544859f1459375db295a879f97755b40e514f6a22d90f20f22674cd071a5454275af02c461152f79b8a247f69a56aabd6a4275c9757ef708ba492892473ca461730bc069a5ed103eeeb21ab5d5b96e868f5b64bb5f18174710bed8108742c25f6fa5b598a81c8a509454d8b6b3744a0e85a64ed9c5855c3014853d4836565419adc67b6566968c2d82bc4bdc424737894f48c19f60079df447b82573c2d28ac4bb29c9272580776b43d21474e52e09ac2255b95e3b3c7ff02442dc47000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 2363ea527c82054080a7e6dbfd16d3e96e07463bc44815397c970be5db84d68b72bce2772578c82f916b29fa0ad068e9c383bde469fefce18c63557db19ce93f1c302a9fa6d1d39faf7b4b5774b045f825ef9139cf113b531a12ce15c7c24393092eb886df18e295acfbcad1ad8edb5d20be0a412afa1857e722a20c2740d1a3ba0b101e7ce331933057f0b1cc19161344c87340f2b78510dd754395e6368e222bfd9413df061a3be812022ce2da08bc4de3bf6e657a3a80200e51f82fb098ba9770178dfded93c3772c4aa610648e7b5b330ea921c1547cae8d2a0621afbaeea92f43435bb40020776f529a7754e7f318f9968bb74057f371eb11013daee9cf8128046e492517b16ec8722d993b345fb0d0c7eb615d1e558acbb39f74e08572bd8ea2503a319767899889196a0a42f26e7434e359594a87f0fdd68149028bbe8bd26e3b912e95776884e83dcb3da50659c54c7f49832996faa3de449cb61715b81f75887529c7e8e98f39eaf3af683b5fbb150f7dea6da5867e0aa9b2ab42ba7ba42fcfdcb076690255d5ea8260c7b106738a63e887fc6993ad0bc93d1e6e9ef893981ae0540200ca393ecb5f7b90394dbf15bd33afdfa499199eb2c3ccd93a0e54fc2211b705640e87475c24e5524bfd5a80fa0ce6cf9db8d263cc203e52e6bc5891755331cff855b04c98fae0b416c61a8e38f669619a44b455752ddcc94fe1bb5608ace3029ffdf881e09c49cd7a1e397efd9f47c2c598c624cab914ead90bc50bbfc5c1aaf42362c48d4c2feb42f95057502f30a1a9d9baf49199d05c89db7cff332c24c7cdac1c3317bb884c4ab041580d3c50a68d3444ea0046850473ebc5bccbbac4f94de8dcd7453ee15e001242214cd26548bbbbb0681e4169223a7e0fead1299152476e9eb86f2a84c08d5308c61b9af960374f407e0d49af22d871a7fa048aa386fa83bdcda6bf1fd27996d597802595cb0d85360ad1717b9900b3f6d68ec680693de41eea73607de43668e55491b9e2670deac0ea38fc3218fb4797ec037b5c5075f7a65bb958a8eb551de7c0886f8d5056c1711cdf2c705be5d879d4dd45aeb3d514b09864333b6c8393fb37c4585018c8ed0d952df661c4808baf4ee3b2a93248e0ce1ba65b04d2ba5e520eb2520039f76c637749751e504acc792dde698b04a4b0b9e2f90c98ba8beda3c1a26c6941e509bed0d4b44809e27c982d1373f89a6a5cc60c3e4042f6182fe28d2d1a034f21ba4a007fad040aa2e0762adb6bbb92a218d3d18919714acc77ee1c281de78743337fe9a0d788d9993b91808f7aae1e88193f6fe8422c0876d225d724bbe5b3967f0fb2c2e4e2aa98fff8a8d82be444b840294f51fbe7972dc8b4cdb701b733b465002c1e49fbdede6f4137a2d4d12235f3f9e7726ca176e4229ebf382de8210a68280ad795199ff82740c5ace14acd100cd39c29a28bdc49a8ae8393c832416f52dcae1f3c24c5a9afa613f8d2df09eccfa1194f39d69cebaa778572f42b1d8537c9364cd165f05f +shared_secret: e02c8542d46fcd5031c0efe0464fab43d07337181fbc4ab3d58bb7bda0cfd7bc + +# Rho leads to non invertable matrix +entropy: 00ff48b3769ffaf4e91c1c9110eb8ce9e2cb99f060b486b37035407d2f4ca517 +public_key = 82600ec863a0a0831fc05c3ce85c3ee9417f6c993412227e7be59aacf03cd9231c2e0aa9020c2d17510574e2a1e89a9905722a13b23d3e8561fe37b034916f0bf61aafa00bdfb1321f798a8b0c61062b9835f389c33b18169a156c11917d8949e9f1c8ca2bc0e3803674436f62798295982b6b3933b09378cb837c5ad440cda657c68c76806b96dfa865e0352bd5290b91a42fc74b1e47033942b07632093b5e717b9b90120ef389b8b2c4c7bb324807251b26c779327f4b776644a55e17e4a67c1a3ac2457636a057cb29329dd0b5d0f3295d128394259649e5b735ab80b3738495a170dc9880be07ad06c2a60cb7a5791295e9c03f4ab96fd287097df52942352cc31c9ff50683ade3c0a4015216b28b0b695b2cb62010aa19dfaac2ad2231dce54aeaf75197db12c291568d5a9a8147280cd956d9d67f7bac1296025801f36eeae79a2f71065f01759f68b30d521333baa96a998dd1946f90380174450692fcbc0e56a31fa238cce178a8b50477831f0b203da58943af694caed2cd3b2a6f58ab3ada92cc5a1860e0f9845f5639a1f555a7d1045d5a07b428b5f2db893dd3a80936759b73642aca1ec7b1535eaa36dd695707b89a9062ca107178673ab34d31cca4944642babd3e79045d4bce48c8b7d46c522291a6e81330f1071258219b4245cd5e381686cab8a9e10120e625516c1299c184066a3bf60a1dc8535398c43a8deb7546000ece3a429003982940bef6870be1585c58423f419a042c30289c80b6f5624458ca8da2713c564282aaba77670c73be5c7bf0e58d1948beea9a97750a06bfe472d721bfa1e54b23a35cd5672b4e84677179579a29723d5003e7a44a8e691cdb015f4ad123d13a8da615a3f52763d334a6a07258ff127e15ab23b0f29e3b4061914b8349056d45f06886051d6ed5a6974bc4d38a7282b837f18082759530c20689f838831a937b7ee74d4ec64b57693c72a778dbf73ebaac041c4b846f78585a81971289bd51a3359035ab12222a3af7bbed6a64a856601af10efd0b23e3d06df7d243b04ca8c07a0e2d0b883c997d74fac67957469189a1ac592b83669f2f638e0976c373fa354045799824bfcf9c45cd408343239ed168b8e25b831d2c200be6303e93103a14549ca30d9f8a0e4b976870801d6bb50d2ef8914371414bfaa56e724582d14879634bea15ac530983a996a31fc9578d88cb242b63057802e7bab2cf2981fc2a9aea2cb173b873e1569a73356cef7476b9fc3a0b18cd978011dcd8b6e0b3c0769069dd94a6f39c940f6a5764d8671208271820c444d1c2ade4043677b1a9d7cc04871981838284c85850d416b7d2825ae95f79bb95f6262bea8a37e240bb02d6ca8fb03ef2d221ee818454222c4d4b998cf586d3434024b304b6ca68b478c773955f2933921e882f15c3ae726547f9a019de89b8335ca3e7f74fadb8ade6c061106c335e85311dd3208724381e28cf3636ba7f784da2718e857467e70a6682e5891473002e176adb848a96b26641e89463b488c616ba0cd4206583804ef8ad9ce3668129157077922bf00999b711af0973ae169ce7f81157d298fe033a7d547cd5b617cfb908a8db40cce2022578006549c05c594a8b13ec66bf000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 4cbe8e1ceb4f29a5a28a605625ff03b2ab4a82f81154af1731b0b930c6bb04af7bff3d7c2058c5788b389cd258851b6d3a17b9667d12a8fa61ba7c98b573dbc9cedc3e03a8f53b96214a4e1dd1d38f321d7e3851531246fcc1a2a1f937a101eace805aff3877438dee254bb7bb8b7ef71f2a202d36f532f2bb37f236021662f7eb0473be940f1b63f74276ac8c8fc8e92f805119e240b1df416dbb599a1a6055eef456d7ddc920fdf2277c6b72ed23e3b4b77d604974e7c10290214ed8aa9d592c2f0acee64a5a06ae2d95cca227c23e48abec08b22d9ee7ad35b0fa799b4b5f4cc0effada3f23fbf30a50ebef37ef6f30f6aeba700c6b8d10bf3141dc87e8c118d13bf23c9fcc8aa7473d2748d7dcd88fe5c2311d69ea29c6f5beac3b0d47fb5563b3c57277ec69e6fc2b91342e79b70d976c4359c00e0d08733701690dedd6f93a2fc751fcb020407d9d53ac454fcc8e0204da5e9e5e5f48cd7f3d787a95cb37e01f9bf9ee87e174e4367a0ce9f4aaae125a631d55e13e3cef3e6913f3203b9239a9ab31f297b6aeb5e0044d05fe3f620d3494a95b19bac5c782321651443716ee815ddb9bde2fd4cd0f274feb208dcf50e3a8f68971b69e847e21b948394bae8be37dfd645006a27aae0c4301a0801adf533e5229c6af3d9f9196e38869f68f71ecf720e837062e13ff754c72d101ee202b023c105765db30e5c51c06679b8cd504b83525a3e4a277eae5b2e6d59156cbe11df8792c3563c74076f93357917a1855943db2d68d89dfd53041143014142361d1617aedb76b1d536ba5b3ec8bd008e8d6e709565e02fb4eaca108623468071c9efd3de94d0a380f7b84788c7d17a5ff7b158531cd2fdd72181dd98f2c03aa872cb429e6f2f5474f27f6533d0a24f8a78178f280d9232e3215d89978ed0e0e00cb9b90ae09132bf14d9e0bb23e3f6c1a2d3139d912fe0b2dad2adf2a4a06f392db783167a332db072790324f9fffeafb3efa8547186ff8c198fd47fe91f0c2d513a91cbf36dff2ee65234b9ec53412f44c32d3bd856478507d293761cf61b9f9ab82a1c54d9952124069865b94258d29a2752a3c518f2c8407e022e66577281aa704fe6628282896ce6b7e8d642c7193f6cba50e8ac0b2ef48992649dc8180632a4f9b393b6ec5c0ff2ef5e33d5550c445ae9e60ffdf7adaf9375d3111c9d896d8a4673cb25ec0d05d2c8564137998e43f7dd51f7b7a438d1c09e02e6caf1aeeec2819ee801992b3326d45739263b66d5d7e483c6fc00bcf69b969421844a0042038907be2e853d965f26f3f5d543230cbcfcd7a5f3ddcaea581869cbac5828be28c4bf58c45f539e6681091f9a5699c9cab2f17f0862cf65454513977854339a81aad65fa1a631a4ac1d9275bbf46b11d8b62c9417bb2f5c30502665ebae8784f281cddb3dc0ce1e76d61f8420aee5419242dd5e09949d18d3fa1a81307b51b6b8a30473076e8041f46847b91278ce78bba4e7bdb2b1aecc7d3e3bf6c01e61ff59d9e1e9eb7ff7393d9005dd6 +shared_secret: e572300d1bb28e65f38527a8007b312961b7c6cb204572fa0c7f53531c6c98f6 + +# Rho leads to non invertable matrix +entropy: 4960ccb1276f96d7aa55885b6ae6f90343d42e1391e8241b5952931a979837e1 +public_key = f8111cd446cb2c44753cf29cacd39a7c9cc96af28545c40a6cc64f5974810ae45a97380302375de7c95b44318815776f80397c4608cbc22086e9fc06fed87c6c780ead85a8d5a82f0fc2ac28366f229566cfdcbd0c65ab3c112b70a908a85660547719e8304d513912a215acd011918cba5423e9094ccca3ef073832c3b81863242c864a90f1bd9e6359d9c72dbed85e76a926f6a84cc4a4839e5266aa9020f445ae1062b3751a438fec3dd862a8d7831db1c84fdb9102872b2c55b28e6f00623e2a971eb4982842392c10bc3e786a5ef5be5a69903728196c028a0ae20fa5921773f35c296770c8cc63a48844022a32e6d928ef042e0537876d3b276ad42ee7585b8dd38cfb58492e28488b0488330b935ee8701bf05372abbf4bdb1ab7da67367ccd8df4469c13355992a036d0a0eef51045a9b40ddc04c492c784a945e99c2a8ca52b99734e3116caaf2330ff4195bc2776ff8644d4d510f1d7cea4682b1533b4c567a1f0d052ce387237b92fd14246adf34ab4455f97f579d3e746bd97313ce10e4a331bdc8a1974481289000b39baacf9c757dcc357b2ab4756309849881289d66f7692a084dbc9b92b671ef115b979b26a8873480977ee621faf6b6a506b2fc2570ec44a9d5eda9d46f2437749367eda6af411ab661162ce8809e2c6999cf26ba5a37fcfc009f60b7dd857bfec86a3fe095df844388c31ab44c26b090c4afe58052a80bb39e614eca3c07e7871811b19b45224e7db6cd077aa4dd366b6755623453fd29b42af2732db855e0e829a9b51714f362b083bacc9e68eaa8507b0127b40227b9de014dcbb93b8db567343c1c1807d5f81b64031c364210531008976aa1daa866579aab9a6e1baa049624487cabf044c0e576902373ab2c0ce00f22a0bb61b38f98f4bbb5bb4018f6ff8a815d4338447bd133a610ebb10365276b2d0a473281c64e8c3677741a1a0c360a8797a3a4dfa06ca5bf50658600de1175822e27f187b6cf7198b8427750246b8db6653e448a16b21ab2e343ed4d55287341155a7b1b9d92cfadc26e138c3e784c03bcb6e36a1acd0e0ae04d78cef528b9636ab4fbbbdec0b7ec5e3c94c808f90646b7f833867b654fd9415d4b971e67920432103d00928f0f3af9274bbac2c5a7bd7cb27d2b1318b840b899257065026a576931735600698e2d49b136c641e080e034544325780fd683ded1caa11052fd89b5d18869f8a8024d4657e4870ced241974d2c8f6194886b509bacd5ad2ecb8cb2850bf55200d2226602a640e8812eb26a4cc0a960979ccdadc5b31d98cc59283df09a6c2d5b7f6ab703a6305709d10cd968826c6a019a264210c699030804db419c5ba4460b25510cb43e16e36eba7b74449612eb73662c79ba481816598045f601be5da995f02229d5d130f6688a57585c959c69cab00e462512e6129afc9bbc5845c9714a3cf14a1061b46139c79e02849b6114b80a75828cc946a5f00096a4a43d065ddd5897f3756d0bd208b4f8685d2a165442c132a74f78da6370422d0b01b812c009da680ae91ca0fc56bdfa36a32a6308c8eb32ccd23ed3eac3c9a029186a73c8d63e8fc92a5dd42905198405c76a2ad92f9a21a2b62b11e8831b4062425c62000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: fa75f5533fef3b994435bcbd3d2080030cf8b04d5773762f1ca6fbce54d86af4ec2f36fac7b3f249f4bc11cb376b23e70a7ebd39da39d9377ee63a7c02105ff9538d6752482378b4140266f13faf8c7ee695dad10b590b40ed5627ac417e8399dd398cd7413587f7d5c530801c6c3d7a33838cd42ab4d4d47d263f4e1366c539319faa0bbe179e069a4880f928f7f5107298b1bc2bf75e6f9d135cd9c96e8fd1483e3f9211bb73fbb5623b9ce1154cbe01797b4d69b9940c20d4fc5b1d1e103a9fde78aa11310e9ec3cf57bc2f41e3296c42991e03b19938e2c57efe6579c192b66077b4da4a7bffb383d23d7315ee81794f2c4f74c4349904190a73eeb1eebe03ea314f708f9f103b2862f8a4a05aa8aaef91818e6deba42b60a9957e5261e01f7c68efca04eb61fa7ff86996b69a2d7e293a6407004bebe90bb481daf560e446338ed6ba259e1d0910ceed2afc7dbb520629e8cd92f1759803bf0a598ae25254f054c4551009f9f331d24c9e443b3942ce662b28c5dd5a6f082ed5aa2725ac7a9e3abc6e57d9d8603052015944ee9d6d55198a5fa9d9fd953ab5afb63eed2e0e6d01983a8e2dc19708c404ce6a7092f2761b8dfad19e0d4dc657827756a99932c88643c6e3adb0d272b9cd877079754fcc2e60c5f222d7c751914621873edd16289370e246bf6e63ca7442b54f7d6198c99deb20e635367fb3c187063713d4a6059ce5623fd8203a73b62c2476605107a64efa177e435b5c7bf6b7c36627e1192a00d6d376612bef6560acfc270257ea0b561af6c2e4738207d60197dc1126c89ad7416e45af6022b227f9e1c4beedd248c8fff802675e21b15f06c3aec36400515c4bb9f4ad2e878ba4eba2658c66f4f38cdb2c73e71de1796290133857e90965bd334628eb83ac769cf63fa9a59298d089302cec86c2d10aa03c6d620a1e735176665435479ccae37a168a0827d7f4d8070d98065ad0bcde435c9e9e9d75e71ad0e40d061a2dbb2a3262e18704649a14310e545e8ce93be3b33fc442d437acaa3b5bda4f770f5eb60f56b0fbd0e9a4820f3c464cb900be522928d9a3a29573b07884e19da158b317fcdf047a2307d0066f16a3a4e389f0166650937ff1df8c4e637e24e2d50f4d2b731e7befab3b0c33ab81b4b031174a61be15d992315464f99d292696bb1536ddab0195a140beb68e72eddca6220d01d4fbc77ef3d743ac1dbe06450614d9255f13e60417624dde40a25515f19b52750c1fabcd7f128b472d80337c469cb8ff95bbd2875ed03efe8df9aeb677146002c138edb668a22c1e1b671cdf636a725de9bfa9c0e12035939c8136b8da4792eda4e82f29d33bf3f67954863eb993e51344ffc4d144d651219de292bef3f3763e2aa061264b11016b6bd4586f46215eee237b8b616a260071004e253c7e1424d01c4b71bf53e085f93c6917a028e6f5134e2c04bc8d9a371083180c3d95a709bf56f79dae2be4b1df4db2fa14b075ca14d0cc7875fee90f8ad2ef73fd4bbfa3422475bd9a7b8195 +shared_secret: 0749d8808bf77c517e622f26abcf23f7c40144b37bab16c6605ef1c97636689c + +# Rho leads to non invertable matrix +entropy: 456be124e7f43803de5f734ea016455d68164a7f054c003f4ef49e46f42dd8d0 +public_key = a86b5b613c6c4c869dd552a711040a0a205a6a9b7ee5c7607825a76206b3db25aa6a0960da259ec279960a5a947106b51a299792707447856085a12397e60cbf91713a6c4bc56b03531081b0b38b0866718c53bea1220f3e5c3a59c74f10c765148c595becb9aaf0ccf2e429575889b462bd59678f860a5e501aa758674d22842cf65a3f8dbbaa7da061c54073a92cbed742163df301e3675c5ad96b26b12651fc9507b7361a8bc0cdc47e7f38c1ad80456ac3443bab147e86924ec112adfc9f1c1b81b478740b752d030537c817a727451668d9ba1fe092d5e116c20262b722b6f895b78e3622c00596ac8b5d4ec11b0413635e85637ecb9a87516cb8c46ef2aaa6fdab62860160c4b29e23f921ed3a381711540cfa5df115a700d40c38b99efb870c6ed14f2261b17ac21900a427528cbff423b0ecf29c2a901baa9c7ae3d438c145385c73b0961c4e9dd5cb48c2ba247a30b9691dd8fac963a5c46ea44de03274896c8f36e57f84dba494c473af0a64d97533b223a32f8078d933bc6db125c2e7a779e0676e09648cf6b85c2968b71146763b7082ca2fec33884d6704afa71f5723617f83737cebae33b95be2393cf1f104c093b4caf26548704490b4aff5d6175ee4c7a3c0718436bf996003039aaaeeb18e92e341938b7a71609082b18995aa042e628f18e8c6f67b67770597772259e0e7b1025c29ea809beb994483a6863d038f6b9bb814a5215d299ad0b0b577d70e7c946be6c93ee257c68b1653ded84761b3a6104814a265988bea5a6ae96951f1bef6f53f50aa78c1f655dec149706ccc561a846d9cac61a339c3c279a290829f972a1931ab5ddc4893f71127d1a96796a24152a5d56016bb5c9d483b9b4346a8550784a828a3b53573e61104b6392d0bb246b8116d8f78021bd012c322c8b0d8392677afb40b36e49c0211449a2bd841e44b72b25b11cd099bf4ca292af2722dd9ca2ad3c36f4377ee54986b737a6a0b87817384ae9964244b140689b2d2db0deaccbe9f63b182164b89c932bdb22e6127303044b91eb76572e19785747e6da01c20318bc8092a7dea7ecfcb638e0584a6e00ccf243e06c577b784704c3b448e22a2b2c9c1dc0224c7ca798567b1c5f3a7ba660af4028387f2c573a52a28a3449c26342f214923e3932f3bbac2819329b83a2e89b78d93afc3c134be3c5fb8c67617666c22c71c4cb99063898f65b41117893785f376d2330b3b5a2fa946374f8a1a2eca1645d255c2a28fc8d7734fa10c67979e5950a1b5e085e2d52763326f3dea8b783297d509333947b9a47a9ce9caa0fff56637a54ffa6a00ed942e0d382ac6c834a7e40859f58d3ae991a9e359e91530bdb75c5568330236149e71040dd9219f5c24cf35c4e6a670e0719b2e738969f509cc55bfb6ca08c68c28165bbc43598ebd9744a18820b5947f0b41a311846588187c0aa669843bc6f4620cd1c62f1aaa90f93b7537828b42f59c153b9ebcc9ae1168b2ee7b2f10c062bdd49259024f4fd51c8994acd60478cd3a00593c403a3279877801d3c88f65b7bd83b76fb54c49bdc8af3cb4b2717741bce1bad123cd062211e74782f4620e9130a9950423afdc98cf0519a643a265e4c6ba4142557d000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 0d6a627804b6e54c49e39e098b20c978cfdda91acd2d5d883111b0fe855460e981f041682f419dee54cf5b7f923c2017b1012f0b3233d507ed065e96ba51f92f70a38aff0ce071110bb0513b22262aac6ffc1287c63c07f312ca2310293a56e85e429bcf3b8662426c086f388312513825888762fb3aa87a40653de37f48870ae16c19ec088bba8911e944b41a8cd595e2fbb680971981b5352a9032b28fd3bdd63ea4a72b5d999d6fad88e19aa84e5d60f173283f7597b682f4616bcf532ae1cd5e9e5e231c6bcb1c9d5fd0e50d54c53ec8a4f1162696aa72c02a6fc97e80686886b84899a7ad7a1ff6468031dc403dfabdcd793bc31a3036d5937f5af337f806001f4ee79dd889e72f5585636205a3a906c01588150d73571ffaffb9775970af6c98a17f1a6a6a0161de795ee20fdfae34fe40e4423012dcb1cb918144225716dc32c6d9d453a148f3a5999b6df6748a97429ab5b8c6007f2595b47fb52030ffaf99735f22657fa8e93f31238941436b76088a72dc6a133f96f0461eab8ad3361f59d4539090c2dd4b05ef665786de899af3582a8a41400b0421c6c646050171f6c2c8231e7fd295f855d2236f6b17f36cd998b47542ad2a73c1751883175a71ad2695b7b372b71ac8cbc2729ab1f4b76eeb8187777404ff81e46aa3a246cb0c9dd3b7fcc443f6a89df493b64e770aa8507253aebc041587b3b9e365688138518d2e84b635c045c9f7e50e62fedc9a42344bece5e21e05c52baee9da1e5fd50ed674aa83845343894439da9188a149b04d7110900fd3a6bd950be022cdf91e6bc896125a10e64ca3e55785aa5ee668e42f338abf50690c61cf19481b1162cfac86b4f8b8800e3c65e82e94e987e37986a3669e401f199021a98294018a602801c07b51faa641a34183ae5a101189887189f072943a712f74b3710a98ec0a992ae4ad1d4d56a508ea3d0762d1b004f399261f2fd836b97740f4d96e3a939ec8854b711ee358425943d218f92a7e07799215ea2e4e097448f7d75e79850560fff7695c4b3f1266f60c430b602db4cd75983e3e252c541f5d39cd15253441f76534cfa94017f1801797503b9d1518fe4857a27e79c842cd3909eca55ec46d9652ff448ae113134c7d24a506987875e9aa17841c9453ff951aee63372957333e8af8ad72ca7e8bff5e0372209fd0bf11881475d0900c643b42b911ed8da750f4d0afa53d13c749bedd5c69a006dfe44a736a44232de96075b6db454644ed3403bde16116a670d7e6c60e03e25a72711ba7b17e5b65bb8af376eb71df16f7d48af1a903bb6eeb599d8acd74d7990053b39d4c81887411927689e20b51006a582fa0c0416299c850e75a81fea3f4dd3d3985087fa7b5f163827c89c2737a86bbdfebc4240c166acd4fefdda881f76be78a079295033b10b5e2bbd9590e3354d86c2532e43b9d1ad7c66766d2faf2877eb0ad087fe52fa1ea1a0d5661872735badad7ee15754168059d5f527c6b188e6dcee930e09718f6551da8475df376ece9e890 +shared_secret: 951e3d8eecad130865f9f89c27c36ea8d091b6f3c00e35969f92bfc4f91d657f + +# Rho leads to non invertable matrix +entropy: e8ac9e76377d67d84f85a142383e777157805be0d0f679ba89cefdfa61583780 +public_key = f486c7d6766d95f2b7296a07c8c7b767c1057548a18263a4366040c003c50084bddd31af425b261083ccaac26948ba1882739732bcc1e73685b52287148526bdfc47d8822d1d5853c9447b21f200592937b9229b471646beca2cca630502e167b7c861d03cbe302600c6e1806f6040cbe518e15c0eec4395ec1a47c44c8456830709a3be9d05cc5cb3266f616f9f8a7adf9b2a04bb623f801da0c8c0cb4b45c16282c412c24ab90c7471b554057b6c0623481a46a0aa53dc167c15ea8a723c81d9d56691b060bf00554548c34f1c603b17b705a72b2c3091ac134d192806635385a5ec9cd28a3bb56b83cd2b153e00b66eb58d8580a47e696aba9abd36b19b3cd47a0dc4ca2d6b7ef106a3b94b349c665b295433f4ab8711a01e2de8295d58b20eb2ca49c23d595c96c874a2749087dafc044c0b8bd5b340ffd12fec07640099753d4c993fc69d986210dbeb95bab40f6ca0096ea866ef216c6b2657600813052886452c130e7c925940564918a5266531af820d0e69c10471ab3b74585f2cbaa1b27274589fea64b2172b4020b4619b6953a9d56d022c7bf937650ee5608b15988b3377bbb617c4016c1ea3a7afcb9665d995eebc2b0ce76c38a0b6bdf9436ad78bb97852ffe8a618f3c82dc4afd81c99a9512777094b12564ce1a469cb49045a90aa3d2c20fdabbc5bb4940d30360f17a66d58b7a3ba7920c102ccf8b30f03621ef722776b2fba0164b3426d514104a6689286649862b7cbd84011008ba69c6148201b576a7b4b58a53035946a0af9646251b8c1cc7bc4c058ed8bbc53c91ef74cc06e1c32a211ac42570b7a7181f23552c762118a9c0f4862687a502c232b9d43224f5fab525f6186332969b246082c44cae7236e38865e4dbbcba87c12e90b2b970097c0e307dda00d7cb98574915a03d25384d4584611c837e19ca906a80868b382940d909091527b0bf261be5ac0a9ea151b8979ae46f2453b420d5b6b1fe02605fb8bba1e065bb9506e1be7c471a9b8083734a110aa6aeb8340338b14aa71189cca4ff01777e7a251b7a0cd1cba9a9a7b9ff3953fd9c87f5b043f719f692a9f4c7352a0756393e50f0592cac59bc21e198729f23b4500d0e620bd02222a88c5688ac02809315cce210db4169fdd1312c0dc85baa25f3d48ceab80754987553fcc7806827441b590cf9a8d5c590b2e00bdbc9b4ac3d2883f6cbf9e047407858b99ab6577a66b498b0f18628d16a389a5f5a20e1b0ffc228eef287a36968ed913b8fd74a34de23ede7743da2311fd10c46eeb84c38986bca7536ae8a3a42acbe5dcb3fe9432bdab1f3d1226a99148d01219f3e68f68d7a689e39d7502b6e13b665cf0235af1489bf4ce8619624eb4509c7639ec411fa223793b4cbbc990256b390fe23a2624977477428ec39835809343023c1dfefba3aef98e7aa15ae694861ad54e0c74a6d8122ab181c9d23397902c99b0dbaf78a463682294a2eacc1cd36c8fc1ad2e282a72fba0bc179520ba2b410acc977b9f2cdba3213175204568dc249571c20fee0874fec364eaf210ad31b6018c2d841269bdc95ce753cf6a765af4bb9deba17253985277f71d2563a585a7573d31c87b80913c0a38d3905a41de6fdc47000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 068bcf0833a0a08f1a1c9128e6575a62ed3f2e075c4444f2b4584b18e4af26b4e84f16b697141c2b000847dc2916b8718608465198935e67d873335d065b994e2946244d3d739b1d31ee6b8d54c5bb04fc9d7d6d22496a869e5331d5e293a712408207fabc35004b13d3ee3aca54200182249642c5e9de88bf5a489cdfe6330170c0b2cbae18f65043ee306db39d333344c37fa76ab05675568a5dc576290abac1d6f28f6ee1d800a3c638b91cd40cb02e531c88c0a3328a176f872386082f07b4a782f79d0b2cb2df14a62e3db5a30fc753f25db235588652c51b251685ffc1090ffff37671384482d4ad055f0d51a5f00c1c14e67824a29ff8910d9e9295f633b6e8dccaebb2da47cb628a246c6a443b87981453e4ec64e7d0df499f026977b039f73d5edb354bdb536896f35a5431ffed50861551f5e6114da8782d3e1530858e516fb623dc3c0bea0c8981bd3091af72555ea18ba409bfe2419a60d769999d82f7bf588be754496143ef980a3995daa51e370984e212f41681fcf6f1235871389fd3b52e76537b84af594f5405fdfab1d90c79a302c142f88affab1f4d524a139ca894cad46f270270f2d8024d06582492fd1502a65e7b70ba0941dd957808206ce00c6be60d8fedeaaa0149f17ff0b3b775fe59317e769024c91ec83a191cd72481e3d90361a4dbf59968a33a56ecde8aa618a8046e0c021c6954f983b489bba80d15decb9955e118899d98c1df865355f5b9ffd97c52c097474704088cd2dcc01f303ec675d87938d21cacba1fed2483e144bd6bdfaf5a9a233238313489e1aadb82a060390adbbedc55050ff86f967b4b7aefa563117556c4ca5ce9ec3db571b5d2c9f5fef63e731c86b0ef3d84239641fb082063ee3c3756006b306754124f9b964dfffe718c72b93999255fdb3c4eea7907a8bfb5936801e799d499269226df5d9d3232b5bd5dba5c2ad9b03826b961535044dba6640b7da63a9f639a834f7311e7d9ec4a1591d041de4f080416acce59b2f1fa4f4a7654368761bf1025a2de5f02cfbc2150685f3e457aea26ba25ad3b828f9dc07d33a55450a0f0c6fc3898dfdd7a43488ff012cca26828e5a1dc5a0d605c59afcca1cb0c76b3c20524eecca2ba2afc939204bf06adf3a5c0a809641cd83bc1c5991c9d16696a4e4e6462ede7953d2694ec9ce865523b1faa9ec4b8d5f737ab31bd929c45ad6292a6926e1c62c7d48cbdc6c6e30f289a539feeaf84cdaf23330c37c97de3ba6dae06b737e2a51faaf0363a961cec9aadb8c74779e242572fece99801eeacb7e972931da610b75a3ab2f7803b8f3b9460f1ad39385e9bd1fde1b46b676132f5590c6cefad5450de5c52087f7f5dc79ae1ea8491dfb8b2d205361eecd231f3af8d95a12da4ece84d6985325f4d948eccfd42fca19014e7af568175879101da556d615b3f4d81e0a4878bb32ae24eb4fa91334b214b379f6deeeeca45a89ac0d16d533707ea5e4b5e0c06be84656e5475c4257eeaa3353d4444cb88e499ce7f5a2cb2 +shared_secret: 5a7f85e2ae8e79a1b178cfb5f38cdf9e240b9997584fe9c432fd63607139f08e + +# Rho leads to non invertable matrix +entropy: 2fe6b9cf4510f212839e348d671b3345da68a477f57513ce363414e87299a717 +public_key = 029b98bddb329742ad26390f48a7c0f624c336e5b71727a4cc29c06e1a2968d864e131b79e5365dce048453ca51bd8718427a35c63ab784ac5476627ced945b656adc438a5294800b6b62f62320adf193b198998a845954a2488e0ca4154a442b0012d44b7b24fa5a6f03a8efb739ccac77b8b54cd235ac65773223f3709d0cb8195671f9ed7b324a11d920332d41c9ae0c0c30279721c80c3a2423cddac9311cbb39f7512d8859074558942504d9c087d9524bb21f5cad2826688e5bb86b91c1f120da1808a654348fd3ba11f3b20bc7612950c392dc27cf6a4aea8f47b841645d4860cba4b3a865c46c0f259af1a60c43141f548308088353617bf95427fa094389a3a6d2df6ccafc7384efa1cb0ba2ae5a2a8d89335d1eca833ea026f9a08c9e2586239aff1845fc5fb6472d0056770a0cae059d81812b8c679c502b3527ab21c9b142f89bc4092cca0a6c20bd1a22c29b773b2aca72ab0a9922d85a8bd676267e9d6452235c270698c5a7a13a1640e5d20c1abc844493ca3634c1ca0813e7f73532388c1e059c414c24bfef16654850f9673afecf630fff9c3aa0a56fab46eb5cb436f4ba94f046e5d57a2d1897680631128c42dca353861a7aceb79267a48b429539f51475414c66bc66a1e8155435df18ccc2993d5e93642354921e9b2205a6270e34b4622c9c69915ba80c9ff994263a11c46a95b8f5c43de1c5221b0745fd2ac0ad5696e5323935a688c906aa2050f89881d3d21605c9564997b66c6452e333cc33ca839db53c17192796e9213b0d7a2ed796e7b2842d9aac2398c3ad11abb5cd342eaa2c6468b70130a5b8b2aadfdf08a2c39732708842ec03d62f60c59b28b81f726f078a06df43faeac927d8c52d14664bde5200bb55cfb06478ffa9b62db67f07565a5673393a388ddca18b7d7978f338d93f37d24a38ef8786e3ed14109421e5884c18da611cb7b62d745323611ade1527fd841a4f3e7122bec4c81609be78b1e1aa274b06193a9291bfcd88ad0fcb90c69c2d4b4073f89a733729d3adc79ad93138b8116fc05b07d7ac6d1645e3a7ca15569b1fe923115133892279f2da7be3f96a3a4417d3b929fb4d842ac017368bb461dd4673da34583f71dd89963718a487db15dba89b26f57b5843804f4f77467936157a504bf106fffe93b82a5be0396161be988c415666b1a26823755274310b8c07d2db27b4e0a7f62747b37527b4b3c87c758603adc3b240a359639634480834de99a6efb12cee23625d563cf969adafba20feb785ba71a5278cbe18a112c673e3332575fe982c6fc853ba675a610357dd2275aa0c6ebf3b5a66a38d253b13b8a21170647c28a7397498d9473c463b7b4762939af5a8dac0066e9f14b8e7534c21342d4c7cf4b539d766a350d882b70c29bcde61f854aa75d427a84780220278716eb8ee1698fd5825cf206a0797552e2f18d3ad062d283719dd61d160681d685ac3004c0c9802d78ba41e8404436d8563de6174e911ebb16a4ffe945034932f335467b250bd95b1d80966aceba882f2858e2011f9be167e6e3c70b234da466a28f8140c9581a9755b5216882f0d43bb70751ffa702eebc7dbf12450cfa3b542777c35b96077cc1cc2c5fa7ab000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 9d12c628e857d6fd5a1932a879dcd28bff777cd6132e14fa17480771b09c7f325a9127f610aae2bacacf515132f848a943bd40e75b894d37b55018284ddc5899431636325a5e86a79222196fee72545b368cc998059b0d88587ccef6e6eb833d05e08123f9b18c13ce6d456f4995340e17a26a9c3eb97930dd207d5155fca9a160e5e8c3f8b7259637721391d9f0787a34af39b136f306400b4805befbbeac25eeb533678b6994fe71ff8691c85bb2cfaea77efbd0299415a4adbf6cff3f4e63cced78154525b5b3d21cc838a5c89f42a1f7c2e2847c8cdca0351c47c1a6fd3e0b20d2d24989b931e1bf6f9e3d015a1fd3deb195a959a44f87b168976b71ec5096a92c0708d96ce00930abd77f4dd101c64106671656f668a07934c89353ce8b27e76007c7d7aa159939210295ad05377625b6dff8744332b834382df6ea2254d523f415928831a46077488f925dea5bbbe4ce007852ea26353de810a78d79be4da1fa41546739b74ae5153d692b14693ede93e2e5248a9244a35a7b64acf95290d1547d6e4e1d63c653a0e52c83264d7349d209147c97c9971957336f036c7195aab3e80afb7189542c45194024e349ab7f62c9cb2983e238a8c76f4c5ad6dd07516d29fec6f38579abcabd1c04005c4106b22c45d27b7786575b15ba00be22d752d6dc7e689aeb21ba9980c63476e742b1f780e6f9e220ab09a5952126ab01a59277a52ba8159d3f25dac39df888ba0e920cea9cf8d40525f79f74766f62bfa2478afaee5240f30a106fde661789d15780bdfe17e15cc033e179735f1de3aa82089dbfcc9df71253bcbc99cec3c5cf163abdba2b8a37e8321666ebf0639e9b240a3fd1cdffd249b8e0f04228ba21b777b8cc76c1942656ae9ff36410564a9d776b82f1e61728e71fd88c1077fa74d08bc2d5cf59b82163e122bceb5b05f6bc493ee02b111af667fa67bd0f7464d8738d6e1b47b282e83f3d83b1ed5c32e1534407c6976e280fafca2dc950597dea6efc162139cfd2bdb5379ddaf6c2d2ce876801bf5dc8ace9bb766be0452105861e99534f84512ecb98ddaa2bd2938e371385deb1623a13900eb624f734cad7047790251bffe4af673e7caa5595138b8dcf15bbea0acfb745cf84e98053ed593fc1103e80fc4ccbdea7cd3049c43dc46a21d68bf194a101767570d6ecf7ce087dd34a526673b6b959a9dd83e809ffe8984d5d86fa9c23c0a47ef11359283ebae3a1c5e6cd9f61a73a2a875d0d8fa1a801d31826ffbe79179c9b32f1ecae0097350b44918242aadc9ecab9bbd1e889a113d9cf1454163317684e0a99318d66f6435e373eec3ad87789afb0f7dae49d2b03610b5db9788e2b3e0c96474baee4bfc166d3f5580c7654ed4b19c325503898b38eb24aa30e4496eceea05954780dd389939b87a4eaefaf86ce855d1d1708660add4c70d30f7d14262aec22a294987b2b850390b799c67ed354bedbb86bb8c1a69e38313d4d52ed2619b3c482f2e16153263b3e6b7863d8cff75fbe549ec30da553 +shared_secret: 5e36034b55f986e8e39485c2de5de7f5bc816322c6f36ce00b8ef8d7513edecc + +# Rho leads to non invertable matrix +entropy: 86630b4f72820d19e9941784183b3a0d770609becd6fe0dc463cb6edac432d59 +public_key = c30b1c077bcd1dd852cdb9736289bb441013f7132a86664c31990bf601cffb845d39a9a95f4b44e285c537cca542335e77b8ca7ac4037c56822d524f74b76f2a113693a63400334967f9a29008ad53f01921499e54e8c315b47788aacdaae2269957010f4652c48a19cea9b2a32406b4ab4128e150beb10e0811b2aed3c95c89639a0ba3ecb689a911acc463708b733d3b724c63b100f62c1863c2771cf7c6aa215e5848687546446c75a1b3d56d8f07b3a8f8bf79dcc360010fc833056d04a80132816a63122c591cae5a4c26ec119a7cccf7f74db33c8a83c379f8f3cc75e85a8016529157aeaeab503e7b9734c8801c309ac580b792433f46451c8bcc0fab6a9ce7b0a2110a933d62cc55f953a036b3bcd3a9078c01b16bb6f78c9f14aac2949617bd6c0a99f003ed2bca0a3690ad444d314a1c44f1638db6c31a3884823a92a28aa3eb498452895733d97aba3c3c7d26139843adea69b3730451fe75aa74f6a1dc87988012318cb172b37843bf1385bb400018416344a4c61ed9436e142d9a512d63693c46f47e2581a97349bbe6f463e5ec806f2bbe56025932eaae009591ec6260c83202b4574f6274414e998d2999371d39855d7b52544558a0da3456191950f96f0995313bd06ac4371207f606781870244b3994ac91a0030b9b26072e121322c7b3a7723527340606c9657007b70700739b278da9a14759024537aabff70bbad9bc513e5809677bb170d8886b2176b9999fcfd5c5e260475d315445d9a6a53b8c7e5919fbb6209d2112074243c16c783fdc571dc842eae4379378827721030cf601b92a5f06aa877b8070e0b3a44762786645cca13c8e5c84a5010290459a3637d7c240cb8b1cf0c58a649c1b33cbd0c62636707d321cc93960a42807a8a4fa9f7c889a4c6ba672b14206926849257bead619167c8cc7c466186821bbb8c67618c6c0d9064e71519902280534623bac0af20259304a46b0352f0b62707d7645b1ba5817e41079893b1ac00fb14480bce6bc19b337a05cc79e96ca15dc7686b33e2e85146224b96266c8164b4f17ba6c3070960ce26630fc454cb25b51e935c507afed34b029838822a0a77a24bf45e9b9047627dfec040e648738e05a62fbc972e4c1b4218300221ce3dbb3db904e82bab6f207743422b453f728084501ae7b96c26534913568edb18446c409613b3ee4f52af5b466c9ea7af349bdc5eccfe9a510f6fc24226687a9e19f6a925b8653209fe4a932588cd52bc41e48404e369394385d87a5b28b80b971836e3c8929547a6e002d5f26dc4417f0850c44ca3905708aa40556b426b6700d4e9126b8ac7081d291fd7569f0b08f789b8556864483ab668fb781db2837e73c20891928e1eb3d29f7a9a294641696a1fac1c4bd526e1fc73c78c01ceacc4a5b707262307f8aa28f61642d71d4aefd205a5bd414150188fd679636ba5fdb21740fe3738c5bca69ba72d1f0871244b0fd430605253499d351fc102280987956e287bfe40daa05a6d6179ddc75aebe5076f18a676ee71658283752ba79a2457fbb107c1f7b7540513df0119b40fa2342b64b2aeaa21c94905a5c68f222c84ea63e9c0b0afc55bc605a46a8179edcf8882ac203302879a33b000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: bb7e0dca6eca3ef57e945d921c2f80875556f7786d6bcca1312f86b3bea6d0f0a73f7d6036a7c38c62d4e356961ec6a28d8026a2d915d9721ef815147fc09ca65a3394aa5dc14c08d41cbe932337b9a531ddf68df20b6aea297194ac398f15919830e3ee6c20145c0aae7a2cd276ccad7b5c414212f0c0ae7106333868938a6a00da19377d996c7796d400606007dff30fe554a5fef86944d43ba047a00da5c2c2a1aad053aeafcc75a1e826a417b4c320e60a68e63dd7b54827f5b8b0063a00043f29ce8975d95bd418eb2ed29db0d9263c67fdcc153ba9b5a33279becb7ab193c2f257bd660fd7012712be3fdc2e52490ade145e8e030ba1ee5368791e6f3efe00deb34cb454cbf7fdae3a507261d9fce66ab58998ca19380187e3455d425977a8396cee3442935e24347aed45fba9b323a289f1b98691e35017ecfd7a423cd8d0149432a2063e0786c2f912e1134ebed188511c905a1a9890cd55d496e8441ccf637b4d660d93c7a46c3e17219167c3b4740878ae35766470b5eff3c6b1fc8c30e5c9645a94ebd48d2d40fbd4baf9d822deb26c089da84043340a564e6c311bca18c7a2c868831fbb866d89652556b53297b9c0040e98a692fa536af4c9a7aa09321ca27068ca66c665b1121ee4529cb3e6d899964de759ab915b0d2c571c5aa76cd64df4a4e55d9de59eca7b4379b30f8559db41e804a18b8771f594b9bee3de9ae98a003430aac58c141e6f0b7b1e5e08e27d1127b682882be055ba31e280dbace7878ae60426626ea4c5bc034a9206e27f578edd17fa6c33180b649bc7bd437b2c86ef4e0f4583071f99090b95db1e415d21ddd88a910b1fd10e3a04e391d947558a6619683ae070be04cab88300614839503f088e2f04cc4a7d091af9833a4f957cfdc574b1c994673ea14dce6ad89adebf5130d266c1440b3f544eea380ba245e21651f1f2aeb2b3d578000a87683dec69ccac18b0702d3d030077981076766e7e5f3ae1174eaf21bf03662c6bda5fd209da19ff6792c0bbc5d210851061dcdd2e4794d2c3c0c531e92a2c4a23556878d3e890b65289a6a02530bbd40ed66db3bb220aeb71fcc3c0b5d5b3afc71377746b22ce636dba028bc052c219783d468fac1d4eed555c1b4676705c8d27aa8a09c6fd8640a6f7b6790ff173ac39b5f3c709281df4274cccdc1e3b690ac0a77f7ece34cdf3216d2b6058baf5f649ff5036360dff99334ff06a366785c0404c584f623801190082fe5cdf88f9cf41032681e8fd6b84d127add01d4b2286af648b83fe69aa8d109c9320bd40621cf75adff8603e3da00be36f03ed7925f19b2e913d756e952a9402cd4fbffc0428cd7eebdd7fc7d3b4cde181b16b26811cd53d9f5d85d37c1670b957d4b3d04fd06567ac68d3f9dbdd45d182619180cf9292e86f42bcc213e94900e0c759e051bc0e30ffbdb91a2493913dc8b81ba4c3e8ba0e7277dc38dc91eb2b27823dac71b6f1c47e2a04136e2c0474fe070e2e4bf8e6fc98e73143ead3c5f778ce8a4efde4 +shared_secret: 5b357f714a293b6724c0dc2e2c5509676782a9dddb050d88e6efa0a6d09d20b7 + +# Rho leads to a matrix with unusally large entries +entropy: adf510dc0e997af14f96e4863f316475be59850bc861ca0d1b057d6b94c3b5d6 +public_key = d7dab73b47cd1ca43c7e036d41c94f8f31a0de404fa38a1da0992933d752acc0407234883488a581e340bf5a8dd7112099259ebfdb0cb094c8d592485f25729e1844870a3d57d63fe9c1295fc2c4a374508f359a7e9b062348c6c807322f1a2dc887a20ff1b8e951b103698492504dd86babc01339f5b0c9bdb01b65514c8df3a61abb7941da84b8005648fa0e5b094e54e56a56e8c840371349820dc3f48ef0fa488f180f57b5c0ad663512467836d6765f6517ebd0172d886430357baec25c709b3abb9c01dda27e2ac7c17cac7511726a39050fe92399e14780e3288ae775612b2c4baaa032af561d0356c43175c6263c5d9cbc62f57194c9f76fb5293e86d9a95a641325013dee98067d513525eb5d2f7cb5783915d0917faee635bcdab95a61592fdb1de202c439dba37a235e3888134249044519732701111385b9c91c2fc96b039d6483c6d1bba2223cb0f612c3f7c6dc62bf64a04b349a0fab73290acbb15ce1cfaa15c68d896493e67dd9a518782b35fe141a4d70bf33e97a616c51193b711b04a40c9634bb62726f748572155667146d311016880c670067c653e9a8dc0bc32865adbf41ba99f19b2dd9ac7998bfc8679c689a05a5038042885742a68ef84c429984588995a6cee077c3a099caa7a5d3761cb4411d1dab8fe7258c75903ef515b6b0629ff659436ff687e6625d2080671e0cbe0cb624bf8b367e780452ea3713804e083aa6e0c7adc15618cf223b3587a364320d56c58be8f037f89cae0be209ded78cbae29ed73767ede6793f0051cd5692f63661a257ccd9d859a92ac08784070bfa7ede4577e7ab1ff6c7b159089b8dbcc5ba56357b2659a7a04c8748a86991b2b775c2015a4c12341ebb419e1244396c233c161495366104b8e29979e571c9614fe10c868db56cd934c5b2d04986a70be8dc25d61cb6f0054d5e4000ef72557b712658d962b1e673a07222d59bcbc4e8339bb5b37cc1c2bbd38780f8233843ad420782b4951c3321888fc3b488897c8bab046f79cc456bba9f666ba261284a1285bf1a9a9d274d9b87788c225c0ffa20388183f35817e5825d450a1eee881f94a5a129e688ce6664021356580190a3ec5ed220b8a5878068ec5cd485816f8c1ee05c3c23ec0d0aab7f73aac249142d8992678b38410d41be710a285d3b593a8245e514a870c3c348fa45f99aacc464b399ecc0cb3c306c273e5f4c671b806864120a88c07caa53a550d52c5641203a7927b40631e21344a9337da2d128dbbb5f97b68b8e57cfbb1a67ca7741c60c2533e49ece409b0492a2e81523e6b6ad655a6dd1870b5de3690de3369c898b557886c4877ad1d67a1583bc70502b32a44afb9b60f88838eae005e2703ca26355ddc479bdf1a93756af16b7789a3221fed9a4e468b710035060752e884c56034b768d0a7106a4bebde7622bb46b6649195301192c498bb555c653c42f6d84883be82e8fa56ea303caac534014b6bbf38a9f73283e5a40b36e36c9d8b1a9856aa7d9913b22c40cb103b74853c53c3ab4ce895388aca8584449fae927b16534f48b3aaf350030a8460c8572bcc527f1f62bf1c5a9bb8ccf3ee66f66dc19286782911a6765c72db77ac0e976a2bc114a1b11000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 1a2dd390e05984bfc0f55ef96da5050fd9bb03891d4d2ddea46c463aab28fdfaf63d4b2e0c9af992e4f1421efc26ae86c2b296f6851bbe2e898b8bdf4057e875d4a98469b7d2646edb86a5eb5259341e0d14986a8ccf93563bc6ac067f8ff6997c2e7bbd897f02e844f180769fec5af9d6fa017022cb0af622b6e4f7a69d73ab01d3d09067b118d51805e1b6413b7a9e0ef292a6fca18a8828912a2db675f0244cd63d9340aa3ca00dc5d70c915b0061664b1e1d64d3d4dced3ef739302f1063442569efed0dfbe8c019c27823a3aabd865a47600ff9e24f748302bfca1bb60faf4105889a548be9ecaf266d8f02d3aa4997202477a70ee71b6e79dd1609acb4dabab72a38448758d8debf55369c5d3e0870ca193018e0ae6d0ffa33b93e962598b43e89d5978a9d55a608b98ceae5e897363f8a9e253acf8af560c57e07c4c4bde807620b6deb76d581bf92b7f514509446f5c4e4d09430b1855e62854988302c931b9e624644a636ab8acaec56d7673b26852c692e8325fa1b6215f24ebfb388ad1022fedc0bef272c87e10dca97df1e63f1a0e9582daae0f49e30c6acd119f7c4eef59d47443f491df846431cfbd23900341086a304589f52de1d862c26af32095e922b92650c68facfc13892430d428f626fba00cf9501e1e4646e55f5304c806b5acafe100084d7635702139725561522632e7e3871effe883298a7264a411484cdef78f9e721c0e5f3937f2fb7d40bb91620e473f9b97adddea69b3ac682e8aea2513b985fbae268176c1bff90e401a31e729fe8b76d13b5c8c85ed833d9b076b5e11acecbf0e96edcf8ff562255124edbeb5b9117cf486f30d7883aa353b9e433a77ac6912cc8e5093c12385ad926be1d0893afc7e64fb9ec55d3285e01a3ca63f3c07b95399bb4411c3f820f53d8350d1979ee9cc6bbf2d7c92d0cb2fd0a1de910d92589cf1aac29992489bc179676c31ae768869398fda50ff14860a1b4dd3bb2e4ba8b2c87aef7ee00d375956a62dc1e5d548a59f209448e62c4b1221631d4776dd5192154d637217d31feea1c4cb3ef1903b8987f4c184cf3d6b5355ad53c7bd3e0ae5373d9971115698214a93e12b98489cdd75028cf22c1da41096daca95854b35d8bbf7d0d4ca2727aa511eeb6cec5352ed487bd3b00b261cbabcfa9f082ba7300610c6f92725d532a86e00b2ed1929a8be7a342c079835a2285569dca92a808049f170fba39d990884ef39ca511aaf9a713b8d78973b4f4a2fde7ca8b6adbdc5a70241fe3ea7d005b33e48cc9fe6ce5bc2bae0746827e548332adf83f8aa707e703fd688c494136d8dfa50961a9e5b69b542ed6ae0e70ae159df95dd9d4789e284a675fe048585214047f7f6819f7f011141d265de9fd4c04f4ed5dead63fa4c8938b2f42108d263d5394d164b3254294402cbeb48663cf1ab2c296d6ada107e8aa5b505da49af96e1cebc6b302faa148216d38b9e8130cc654974ce299172cb875742e62c32c063ffe7535db2726f65fc8f600d4dbb1a20f +shared_secret: 54c35602dafe572b99aedb7069a59c4f7818c860b27a947347657ac1954d6454 + +# Rho leads to a matrix with unusally large entries +entropy: 3983da6a4615805f6d55c14ba582d59a40e646c7ae77f4835a51afc6c37f11f3 +public_key = 47340db6d04313d3a689b357566b9743cace5d5b906a39249f1c2bcdf335f37aac2565932631ac318bbb7ca75db36ac198ac6b15a02173049721d10f7521a52f358f35f3719269a695a4b0fa03b32d8a209aa12a5d786d8dea4ba05498ba222eadd647dd5a397e655ed309883d76326231a6764a7ba4226567022d70fa20cc53a045cc5a1fc54abe0189a4a2b6bf8a969d61706944bc59c6add2992b6e562e9732973d32b97956203dbc523803ca0a462ae118633483cab85c645ee3ad51682c0596378dea5e93bc7ab652648cf1954745172a75c2bf6a3177a7841b089b6ee911149871a9d987c6d499b6e0c4d15c9b74685401b680d3e112d6d70bdad6a3f9954b0057335ca36823328ac4e124d55b9932d548f58b85a32844e9f0260d8a4339285ab46152bbc05a967c5f16072f16178687b0bc06b621f5a4a14ef86b9cf1bade0185c5c52b3f2c407479467e5516ab9a1128260317605d4db250e8f4b59bf28a6ac2606d280af28664b75092fdea1fe9374976722dff579728e121fc1944891c586625a880a7bd154aace3e919b841b1f5f8c0fb841d1eac1fb18002ece216d42cb401dc1681836c1198653456c9392944054200a3b95b986a396d443a306b66018b525fbbb042e662ec108f6b872749d3287440c12bd07d1061a524a01ad7342d74f8a4b76222c5a439eef4235d51c9494602f6624dee256ea7fc09ceba9877f9332bf195c43502ee43c75e78720c306c2fa47f4ef6b7d69038dbcb8272b334c98cb665b306c04252fad3559eda4b96c14bf50b78d4a9a37081a2d61cad33b3b9418bba25409fbf4a5bb3c775a43b39520b37b5b82191b4983398858bbb0c6c8031b9736a5f76cab0e647443cb6d983a5e0a6c27756cbf471baa17870015566db8c8a51aba969e976a1c6cb2be166f20680893950ddf09cf8e3827a2a884a7a65d61c7c70a522d17ac0939625fe63958741255b012712e76fa8da809a8cb447d730d4097bd3e86471019dc8897bfc82c3804a76a38919f7cb50ce79bc13ec4bdda215bda9789503aa822c71ad8107a35818a7cb055b303338e465933565b94950c11836e8e33ae8093b0aa0c5d5d555cbec5eb4190eecaa1525014e8a341e9400180937afeb126c278a5bc4713fe9c417c50c1e47c8756fbb6a6b265bdffb4c1456c5b7d7a895b6932dd9a55623341354549283ccfb36abb3068b2db7348bdb1172318357bac12422ab93a32b453bcc0faa4e8e595b05a145e614aded6bb77278bd78907b828b18a22aabea48bdd69cab061522a618cf39406f6c78cb983354384415d8b857cb451e01b24f489a3133070d775307fb61a0f6d56d1255c4d4e18c62e57d8422080cebc919b81e67c4304cdb560ab16d929413af650a53f870e8017e90096452ca3ea648ca644010d34bb79c5898b775b197189a55840f43371dd9cccb7b4a28a66309a515658f06acdddc47042acee250a37632b42af51adf1c0666902fe0acbfc8f59127753a40161de4ca07a5c8bec0d8ad3141487da4a842147b9de945e4962699033375548d680b88ae8354d6114efe284517778eb9b7957eecaf5b4165424a5f82f100d02b7d39968b98f69c2cea1a0b39394f49265b492ea8f4000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: bc07d2caff561b4645e3878d1de0730a88c05f46348526829a396f05a0a00603f0e2fc79e13beaacbe903827c20d9d687f3fb4eb2a8e9335459fb21380b8bf3734518778d8cfae9524ead1427c6a2dc379ddd2e985e2977bb63e932ed59c83a8b9a593e2adba0cc5f106620fc8c6c4cba5106bfdb4105def0c1d7b6800327cacb964e1d4ebbddfaa15b279115a1d05754c0c8a715fc2fe5aa09af7b96d5a93e758458aa5af8cba03b942f4d3c0fbbc2a45d3f7af5818d67219a72f4f538883ee2d3e507e2dbf4f7748446443bb71bfbb4eff0f57d8154d29f5cb26cfb52c51b676e9b1ac08786d5f475cbbfb49697a748b7902a83da49d285a48c7e9cae74b66a30b02a353a287b40a66a0663e7a71adab7d03272f2ec32d47097d4c303396db3e7b7a947f467a70646777cda227d72310806107b5dc16cfb36918e88784524e3a46c30242a40811593aa8f72c742f885a9623534753b2bac5e29110a1a854646abe1c0337251e85987aa612f3a095409a5a632af14acd19491577223c278b18a9c3ffa7f72ae49b89df6dc45ebb2803ece96cfa94ef9ef5b24fbe686ff90d130d3ae953a4f9ee6581a346b0612f84cb6ccad4fe94a53602817d67c61a9604d288319f5933f4a97dcc6ffc36cf14db593fe27f873be712186a6695d949d4552dab37e36e2e0ced229ea9dccd6d3bae22f9fb888ef400b594ec08a15972e8d2478e50f11947b52bf384c731b0e50dcd4ba116abab8af3b880c54badb11d83b4266d3e5fc25c2c8dbbba12fee2fa5c2017987f31277a67ac702b8dbe110894a8c81011c7c662ce9ab96a2e25cf5056a3e202dbf6bd5bef2347537f7811637e932d13ce02283d48d032c284b6cfb84fd813b6c3421017a7527eafcd3fbc5d4324b5351b30abcf1b366f424a8a0b5edf6bc1f3e8702b03eff875687c6caebd7bc15f1118696cc63859e3aab75aa9acc58484da7f2bc9a120844e4830429c0eee2b2324890bde302bc93f661edd9c04e1183528482f9950654e8c267234245aa9482d94e90e00e929b65431f986e7bb34524cc41f4b4443646713c7abe6c4131a2d67f3bf42f0a7f2eddf82b5c08a94d99a0a7d14c1b0b375fc158b7d4276eab22efb438f0d0a9b30e9dc127026181e42643af8da0b24bd10a532069392724948ad722b25477b481006fc1fd030aa62b217e6695dd4c7ad34dbfb75aff1df5774b061a4ea8526e9bcdf9679405c0d2e40dca00c9e80840e832fd663596dc55f602d094253893405a02d4414f119d23c4544cf832888db5ae8494dd2e8ee357753515d929b8a37b5b45446ffac20fb204b5c937f6344c453ffa449fe839b4afe1da61301057338fe29df93aa962a7374a2ec181ffff9252c8af5c3f75ebee02fba58a76066df4c6acfd5d1c18390652eb2f469d35dd708e63a498c08c5241b2717333904ba0e6e0845dca8c9608f28bd1046805cf7b220498145b23cb18184a259458dd2fbaeb1c383005a0d289562b0a9daf7d1e320aa302fd3d9a02c65fa901d46d4 +shared_secret: 7e1b4195e9cb70e6884d3d00f0b3f0a66b4d8c00ce112e1e79a1dd236ab62b26 + +# Rho leads to a matrix with unusally large entries +entropy: 2676b8426b9d6a30af007094bb76d65d388c2b3da938215dd6f6987206400e13 +public_key = ddabceea01649d9c6588d68c05e93cb6959fbe348468cb6e7f482d2b0507a097625325a7ff5740086bc203410414845a177c578698b313842dd2737d79806fdc8aa4ad8b91b514b6aab60885a49be68ba60d05891dd1cb47c1850b0105ec15a95c93136f22a170e346d2256a0cea672941335423cde35492967759b4317981c34fb0d759a2b08aeb411c362b2630c4b8ef342cf844206d7a5a3934bdfda95ba9fac912fb1844a0bb62041868ba0e3660a5551951b39880eac2959b5028eaa765492416ecf7a05102450eb20eb2a28be460972066b41ac87abcc28b38a7c92d91779e0c7cc8b42f107b48269521edf0c558a1b767536d295c3a7e60b9de6a8f299563be7c4d33d33940234af8c7764b181fb7b5af1dc88e4e830725533656520af7344e4ab40f6df34a90a898c672b854021d0631c1b1e9999d8176b22a5ce829a240642e19472e635a83c5086f87872f72a62e5fa038481a6861141227666f9203675db45a444c6310518d86a9221c9b6bedd753bb7914f7995e39031963ea056536a96c9b14598c95652091dba9210168467d7388b73770aa905052645eaa877c6f8a45acbb775d080521479314e214a5217835667dc2cc67dac17b0103b1049a03585b30631c6dac53b6d4056e5877786b295fe94c8804b57a027609bee938a8812666d12345e04c92469463443fad1c2188c951cfc6a06c3b8c3ad8856ef26a67b7841428a1f5b69a3fb82cad843a55645b78219d6de824701b0b1f192d4f816f45032b1cd5b465d33b3a9cb2fb04cb271a3cc74a8bf7ab6ac7a00e8ce6a0486c660680219c6ace0917b31595584f4756c9c5273ee36c37d25d5da146e57613edd34795b9cf61bbb7ebc441d575631215a87c4070159136348854c297cf3ca44fb2814448e30eb2c555aa2393bee966ceec0221a278f048aaa6d09b1d801aa0fb369ae4480f051329390af222712c61a59f98a31a03ba90c1a6c34c1c98c0be7bf59fd717ad9894786acb1cd081405c66a2e79a1fd77cad853761461c99218aca3cf4920703654fb9529c106f41a78b259294709bbc91679d0442bb383c28d64683ebdc7b94f4592c8ba2c1126c9dba9377040d3a124176fa33a3905cbb96764bc89a69480b74e38f558b422ef22e390bbc76e048c01129c97c26125bb2f86c4bcd274816265d8c41167223b0a22406d2a193ad3b1083b0cb75f9542e55b9aac02845f59618b5aa580b5b2bb44c192a906ce61b8c368278618d8ca8409fc02bb9b097acb208e3c2a9b651a316b70cafe6b9bdb32ad794b4f018b66ce55639e5558f5a3990475794bcaa06f17093d490fa583e6fd9596b40958359a30f813b940b1e1e4223d3857cfea691eeca944de845c2fb502e35a5f1a3750454593fe1c41662a3b3da407aa269c43167acc98f5f3c662d6177d3594d0cb800087c6a525c586d86c12e941b046625d90c8ec6dc8a5c546abb19a0b585aef39379db926691124265103bbb49cfc4e9100c803b4ef68a904273a6c899e48609bca003bcea9cf82203d52b5f9b65c409ba9503b3b16c7077465aae45d2cd4ada79ca43a9e99a124b7c9fa24a323f6c6bc18b81d9a6161191561f3776740b539479582a46bd913ad73e09000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 79efa2d537baa2b87a787317162d3dbcb40cb3c25f540ddb91aea6cea9870bbc5a5f86f8900b913fd4154bcfc7c8a463b9b66118c502ddad539186fcb079664f44a5363cc8d80d6a4c09f28cf8952157526cfef7bad2fc2cb69ff03ac39e37d47faab64cf54f63919303badeaab9e59df7040511ae335c5230e46e00a666b994d647d11cb032e7ee235b5e18b1894621ae93ee129823334580381b857cf0360196cb75180410f9fe7558d0e189502a5dbac5b4f0597cb3d1d201f89de26f7b4ec0d200a418a26cfb82cd4496c3ee22f6eb60f3ad2e1af981c238da13063d1746d65f77ce0ef30894468b687b31443c7acacfc3b3878fc9ec56878e7bd1a9f72ecb1706a4e5face0a83282cbc2bd15c89afbe3c97dfaf395a96ffbe1a3f75af03311afc69dbc01b11ffed2aeb8906505e910105806febc6e1298fbb5c0bf501232b888b7e8b285953d250b866a20cfdc7833a732966b3a03485ae2852d0a3fbeec6dfd0ec8015db5de69e55f091e956ab4392834c5128417105541b1145b27175fe35efbf3102277b35e42bd83aac25e25da6c55c28a03b9e2a8135871b4cc49fbfd5598c9eaa2482f249c0b6332a6999306be55921a3016499bc63a072a6e9eac894a3ec209177d07208d0d271c47f8065d0facd2e975011944f7884088768fdc053cf86f31f6d348222c06467fcf8ce0d404a2558e8cc422521a4e249549037d3e8a29e03a9a9bb511d9ffef4c5185a380d874732c9e862a6e8fa3fb72b213dab2ad0d91b047440b1d334660067566e6d2e14765d8fd0a45b9b8e8566419a6d7138e5a106c31b1278d50027d152bc8658d7045cb2297bb8382585b38be2d5fafaa7e8c867c74be013793874f181a9798193dee26fd5812eb469d1b842a969cda65d3440c67b00e6d1c3ae8630165499c1b4cf3153fb5731916ab779a2562ec62637d747d61342d832aed330e5cd794de900fa507d4b5fbdbc5f3ec1aa69d0319b3644d46d9502d435c1b5a329c0d3524611a145e3024595e91c2afd577a422d59d4d54a430f439534003be467b6f018736c4bebceaf7c83c799c2b7745ce7498dc84b9e455b96410dba1a0a5720fe703b7c0d859a42445eee7ca3353f294438a7d463fc3e98f4403f93b5fc4add88cc22db7bba150a2988639ba96cba8e2a0c980c9bf8cebdb5beb262d79e86cceb774750cd9a192ae93d85e60722ec6590beb7df8e4d036837c97dc05c7964dab00034683a576da5b51aa8a0622edc27975978c7daf1b942285572b09c170dd332a99bbf703d84becc6a96373fd1c0b355f063e4c2c6e59f5437802676000a819b9b99418df893b98a8e6ca22d95da2c151fb24a3a0e5944ac4ca6376e6c281b275589a3907c0473282967a121f1792d09a15e9d71e71e73f9f627ef0dd478061cf053af434b0663624c3bbafe0f37d7a32504e9c686f41bf48e287aaa8fadb73fece907f26a9576611ab2176a58e5c1f3e98ec0248a15774434c2a81c7a8f57f9950b83c0d3770d17c4e57582387d6f19bd +shared_secret: 2522e72d308dc9d7d701e0b024af9e15627572f13573b27c406fa750df9636fd + +# Rho leads to a matrix with unusally large entries +entropy: 319c51bcb76124b92f39820a5653c0ecfba79ec91d632b0488f4020e5df4e37a +public_key = e2c1184862562b91806efa62f1b72a8ec43e70663de1f66a59687ae0cc1d9de1ce69244fccb0841b4b1de2e964e29408094a1ac0a9b4daa836e94454ebb942c6e9ac66f39abae73f61a99834292ada3c824bb53c8e67912a07377da92e63087f8d947f59d94a842b7aa8832b2c3c1aa957577f55027e76c106f86946f036804671b0e0416cf62e70eb8194d88030e2b38585181c4ab1fd8165a821bd68dc8fb3b403016ba5fd129bb9d23182029c4a292433087632816c009a237a608e65cbae17d688a326bd6c1ab4634576fdab2322b983f29c3e63b31303cc386bc90641c84965572c49a91f4e8258764834f38ca7f869cddbb10674d4296e5205ad805ac48462d3b31a9e6067fc0a27470aa593b896c3c319357b9bdf0632bf0786fadb0ac242609462a06f82460ea75762a678fcb07c350649d13c24c9e33200c9ca0e9bb87dd2c8578c7c4e27b1b75681a0b6aec6a55e767c4e14820f2ea609a16b862d5695556b0937f53e0ae370086c8f771295b1a09f0003a07bf512c4272f7241752a6603f8f51ea9a088e5263a59eb0b13b87a1d2929c2c29557681f180261f46c294de4aeaf380ca5f79efa2c64ed3131272ba489494ddbea14c69c46fd6346a7ec9f72d89559435e139a67bc3240bca29b3774127dd85d53c20bef719724612c462bc598c54738c87a00a9cb8c4b44e4e7ad4573afd9324fcab820cbf2091fd83fea52adc1b82b3f6c86369aa358498197631a20d40c790c2ddc66b0871c1ef882305bd978055bb934467d3ffc0359c2b31748cb19f615a63262fdf695f555be1ac432126b08e4a97acc18b8606ab6adc5cbe4589389e1121d737ba2b3a84d02bfbaa669f3a06b1be13fafd42a1773c830749cad35456e956c0ee64a5fcc46f1763c3b0c0d3de5c296a28f61194ae72979add8c7ce710d4ee846af81cba3e18d5e459addea9fb565b010e9ceed5798155227dcab155984635d7539d68c9f0d30537ce8b573b6bef1170540d0c10528737d6a5b219b2d96e5709a721b40536ee3c416fcec0bdba013b0fc0e786c9765d312692a80a5c9a3d65a6662788d194722d63b4bdcaa700e4c3daeb911e4d45674c3720be35269a21c0717a4c3aa2f3e1ab4f20a885cac44228138ebb70bb4548dedf8678d2163c339c1a9c719c2f1a51748571358c1451b0ced7b90109c98591126fbe57e1c913b5a935eff14450a22c4a108108b99b6efcc9bfd8438b5024677144885f1886ba068a6191ae17b9ffac1087bc94badf510095baa7167a7fe245a89a2a627d2631706a15d5aa081d037a4101b217c1c45fa0d83dc790447121cd9a533592cf8ac424de8770b45307f0aab484467c4acaa82a5669f7621e8ca42ec0b9222766b52775173b288ff5b01d70a60a853aa44917b8cd09a4b666138e91a3206c97877c96d690957b58553018f55f168c1c51bd9a48ae762a65dc73f366c79e77c42e793750924bcc1472cd5e552e20868a42047593842619c2e0fd40a3c7bba9557bb5c71185430a0158b9b95d04fefa266005141ffb4ba5160a5eee1499c09b11c549bc88cc501dc94a0a5828ee8a776a2a4aba3bafd410cc8354216cc3a93a457e9847af39b898b04b60a0c661a72a2df2b000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: b0e578cabf9deab616e52934955f42eec74bde5ea98acb022c427e08232142dd08f9120eefe5f455c8f120e672cb68f3a146c3aa457b637d0901fe2b4cd45e8b208e06823b8aae09778cd00fff5bed5232d219a2c33645f2dc30593e591f697118a8472eadbce05c9fbbc5d4b717b880065173cc0854182555376dbbe39194e4204067358808c890e5fe96028921fca344e3500b615f2201a1c4e4d13dcc889cc9b1ac72429074c21a52f4c78ea2c467d65cd2c9ed682f21f31b27af4eb5cad33dd633185bf32e726fe6e57b03168803f693bd85f5a9f2c3ec6944e9ded2b8f3270a89139ce50ba6ded6bc6b0be8893f44aa5856acda60dc1c4c0834d45574ecb6183d6e59a183c0125ff45c718be2cf85b5ce6daae6e37336ea63856561f1bd4404df725d5ed9263038d1c623b2e1aeb35924b79de474407168834891af783fe5d83a631eb14d7cfa949d698ffa45e7d8c46ed4abf75cc666b78526c9b95ebb2920c77c56227eae6c893b57f9f463ff2ebc9acddb2f7ad543c5b2259047a4cc87ad05c08bbf02e8bb267bc490c4b67106fb598d42135c927fef3397f4c3f6838776787f23a9759dd3214075e79eb3929932becde84e82c257e4638a19e1e3312cfe09d4ac681d653d749c8fa6efa6dac35ad59399f1e233540fa354681ca55db90007039b7e504e2e4082aa3e4d672019741aa02a281454d4e1c73a1c7d0b5449c2e143ceaa3b18cb9a74a89f1ba74963dc5dd4155a356211277af3a267947700a2cfd84a605ab02d37bd6faa8a26b50f7b3d9bdc79913272c31dcc0f0183d05933a9f233504ddee2dd851529667ec5174a3d23bfca197538ebacda36bc29ca675384c0b3f45e4f67fb66d8dd4aa57b7da50ead391e6b663af173e7f4d46139f5d0f4cea84dd32e4e718967c6b93617271224f2fb3a1ca5febff5f26c4edc60e9acdd9e464ebb4571dced645814e1038a50515a7e06501adb2de19fec4119dec7548c41097964c3151226153ccac24abd1415579ba1c37c805a5827332d97ba90713829fb30b7b09b275d75bc10d4a26b33980a0ccd4b00844d9f379551bd0170ee895286526ea9625a72b6cb8decd9cf18e57262f8102a025025e8168465a65a7c7e4d5fc8742781acdc16171085d51dd5ec9f4f71f58cfaf4557a55d07e7c164ccf7eb427145c7f9a800e9bd9192ec0f74d19fc17d3881b1d55e8600aa55abf78fd1e226d9dd6e8da2bea15712f5f43325d4b9c083d6e37d35c043f2bc8c796ade072555263331bee7fffa54e2099135ea363575847abb770322376cbfd3f1b7980a1857c55fc82aa80bdcd701c7b7d66221f08492efb5438a04d041b485bcb61f6fd306e96cfe758d99ca1cee70b200eedee86145fe37ab7aafcfbb2df694361fe9923e754187c3277cc895c4a53732ee118c7b6156b55b30847a6e828b7069a5d4be623abff66ba87bff49294dd9b1f698ba445d610973d052a80691c9968e3179aa3eea5b0bccb3cf674c5cfe7d2c14d7b6daa7a4813abcd56ef930099 +shared_secret: 1cffb3d6d9dd9cf90d79fb2c5c974818c5bd6f32ea4d44c302337c4cbea44334 + +# Rho leads to a matrix with unusally large entries +entropy: 00ff48b3769ffaf4e91c1c9110eb8ce9e2cb99f060b486b37035407d2f4ca517 +public_key = e8014b4f4687bb6670b1c2a29ba577100943d5b926cb396423663f710328a8b536403530eee05006e7a7cd679ea44c29146494f1775cddd3b43ce6a903283f7890979ee98842d5a76f93777297abffccc0b8faace8f362c081aa435c32a5c31773bc046e61921f1a5707579fe36067588a0f32e2cbf91aa3ca6b38a0e12ffdf8685874869028775fcb7d7fd7a1e37c611316515638a510a13e950960e6f39395e436821165e734837ed575ad510d4fba6c3ad67e039b71a9b6c2a7ac240ccb3742d65b4b1c50a6a1a496995da77921ce33624fc48135e88c59caa47b299605ac1c79009dabb2062e375547ec907590b9bec52c86a6b9e394ba5f02401e4545c462c5f320939075b516c4a5dd0aa5d879456449a115125369584a609a83df8685ed2ab45f038559dc6b0ea170b09680e7e747cc7246b6c182d9199941847d9c1168a84400da2a98215a9e96f6bc869035a8822b27d459cb52147d966e0c354b70ecbe46daa9034074019acdac30055d8a1a02741ed8e602e2cb3185ea44c9e61fab637188554c8b12cc5abb9073b35108f59f6832112ff23b00acb0936594c00c0534a8c4c11cae4787092bf497b60b4a44116156e8368c0c950f3677f6424690803ee92373ed5c13d84c355bf041edcc872965816d6723b344244d0a54f8ecb0f1703ac251293503baac445996a1c9bd6ab851eb52f042692a2b10e4b9b44dc9625973af03fba67a3a93ff849dbea64739f643bfb803ea8653c2b9ab9639614000994bf48a8024c4e61c8a07a5c79b19540084bc7664ad44122e46ca1fbd517c8e68aeb3d835e53846848742a9fc2a4058047969bc11a773e623462c7bac66a34c62db861ef64dedf23c0b7441f6b75b4e60b86fe309b1b7746d558987f6a92cb8513792360ef76cb6548f0813ae8dbac418c25a1d95b06c530d79c6751e7569a2027f8a5354de3a70752764fabc632f3a1bf2473e8aa2a5cf815b3856a89afc122d98ba3f74185a3b2c09049601e23ee226329f024ac2692adccb2018b22a592a450b4a5819b2a498738d29f7145e534e527c859f05ad96cb963314c58a5a6b050ac6ead9adc4782859e3383170cabe4871cfc17a30ea4ac55cb998e77e1a26662a255f99f4ac7b98723341b2c7134adcdcab12a473bfe001127bcb01f84df31384af06171776263085bed1aa3374da7136648608b569a88663d2122e84b4b946b35c1f24a836e924202b7c7828c15507b17f906bc0e4b28c230134d90655696edde11a32c7a70303aaae3363e2a6947b4bccefe9ce62953f92521029959096a8910e71c51b69a0615ac790341c0ac3a574a79d34c11b4a974ffd7cccb05995d4089f8186b545b80a166982cb53123ef644e82897c77889ef91bd8c5a4ed1a4a414389d77307d53487940fa32782061e8458e0c601c884321d121b48ec04bca78c60d39b0c4bc9291945ae18224ec73ab7a451b9cb511bae34a20e326a497cb6ce46b5848c289da630f497ea3975eda79489f18a405e91bde288379f291f538c1a1426cf1634bc033098bbc9958f7af6e408354314e7221c37c1610bf904cf9e7807ad327f0f316761939674867ec7223f06a245711b0d47832b1a699badc8e1217798c0d000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 3159aa52482f4262cee553f9eb6d853d091a507831f5ed1af37b9c55f217eb1e87e8b0dfb653932c27e9e9f2c4d45cf89e9cfe9ba0d5175be56b7fe3751a4255649cfabdf0cbd5a8704d58511acf6e0580eed572561fab262b24d39c3a430a4e54fca969394037df12fd8cd71b7b6ec3d8f7345b05d4c16c5871b686690cee9804012a3379bbcf720f405c3c83f59aa391cefd8b00a73b41147d42c8b7820b0e779c44e032209067349fa4cd35e83850ae37ee73f96fc6bc5b71ff9b0462604b4e07be60cc76903175b045b908c9b8e7e94c6bc7c48ffd49698873913f9132025e51614317d27a874e319d802923804d1ce1626420d5794bbbe5e077cbd7fa3d958fb2d9608a3d41f605908d21fc7f942e3152337115a28b661f76405620b056692bfcc066f370449628f8e31b7453e5b7b10702f7c195dfb779fb3253f86acbaf4444ba9ce01c9b043133a233030247f8fc44d5b8c9b024ee83c186a62ba9fa5a3e45389217884a478f238d6a9b8eaf3d87b7b4b4375d4d5226dfb80255faab42380365b5511567978be9726d21178eced7294463a348b1e976d800b1114fb8230115b28e51f628a31aa8cf2e3253a7dccaa37f975fa2b8d32a6b6147033cfcbde33ab8857e3a6af95e4cd0db62fc020f55c2d6c9204a05835e2cf878c66502f572016d95b30c45c2ef6048471ad0cb7fe14250dddcb4014c392c22fb1dce1adc8e02f416d3e9b417f41c1b4065b975de472d0e9fd5b3a012ee9bf6311345b4968f6f18262bfc2a38d56d911f9efb981813f77a8a8d6af0618e015b8b005e7ea957f89f140192c7442a645ea7012b5ea2ba9f8cd2fea2ad3e41c6a57582237d53444fceaa933d61eac36d03a2865bfb7f12fd8cf451edb5050a35a75c95dd328296dc32daf61622ce0cc457c5968414b634b3e12a0ce45bbd733e3982c087a037d89cc86d546007bd92eef33949d19dbd4daa18e59c7ea3572bf3155a9a46af527347f4f4dcc2be3cc285d65f2f86c681a137850431ce8d2f76e295e74bd0b3c88f1b68885522dadb99fe1c8e40d938c9610e466770d62c34e9393241907d9cd7bfa470cb8fc149306d9450a7a1887d03cddad3fcdeda1ea54d3f126bb29a1ac3d7c5a60ead90d74ccbf1a75b4289a74a49e0a7c4006ab76a83915ebd4a95a471525444dd2c3e748b1bd347774e2cf01f90f05a1672c58f4f563e4da083e95e0fadd4ba57acebcb45611a3923da1d0d73f5c9a55489fb0097e123694e413460252892a0c6317dcb56efa834f7a51db4a413976afcb30ab4dafbe737f43da11c1b08a2472cdff3995dd7d23382b866873624fedee76823d37ec230dee2107258993d5b802fadeb89c9469a33c66c91567ea92581e0c2c1eaa2e2a4696b024c7c6009687d07769438a8b2ba75a7bfb32841dab8acfb8cbd4d1e26c5eb68bc49bb394b178e6f89dde843f4e2c5353b04390c245a0bddd1aeaefb87528b719fe42b35ad2a89ef34826d9e23f95b1bd3c3b24f785985e10dcaf0eb33f5f71f5cbe55 +shared_secret: fd9e333ac811ae8be12c052c65131e3a7a32ce82e39055012ea564e10acaa85e + +# Rho leads to a matrix with unusally large entries +entropy: 4960ccb1276f96d7aa55885b6ae6f90343d42e1391e8241b5952931a979837e1 +public_key = f6513e1ec8234bc145eba3446eec18b3826b2ae709792648e071a7c4627e4ac7716db5b1d6040ba7b8ac39b347ef721a99c879453846e1aa591b8495e19003df973580d4192cabb72ae2b1f498bae9b3cfffc8bbce09122cd1910a406574106810dc556894777f35316c992f3b902186dba411ca3462b927688c81f7269b7c2770de5aaf90c81f752a3ec77942729a68fcb38a62946c601c945249bf0e280b66764ba71a44134ba84df1400bebccc61456fdf3bf50aa85e8e60f491ac1c1317d831ba5db6601133883fda81115c67fe4691d9df01fd3732b336bbc3899cf067b9e3905294902ca5686480cc94eb4e98260408b4dd060cf4b5344380c89d564b31158ce098ce1e06b91446c4189c6a4d89aa7e81befa900b250a7060406e25725e09399963c5e3e04219d390e6c28983e335646485023312c4d5bcad9aa7ee683b935d71af1908703fa2c9d66c8b6c55049b3319d39c047b5824d04975a9034e8ca1a9e1a5b0bcb222c5b5c848818d14503c31270d4f8446d013d4ecbc250b72dc25934726b426afc85631ca1065ca6e957ba00f1176a6a45b68a5e93274423e642451129ce83b7de439963c0c4e5d8b25f3b74fc053151610b4263725fe51423e886bed19c534165b4cc90fbd67256839b9371290af9853c948251c768e157041ac91fe6649bd1b1855dc417624b8ca0d798b1947c720b3414db56f01500fba30207322ede05612bb6505818a9a68538c9eb98f2b0a83dd38b765891f0d01f1db768d2355fc6b7a47414527c92ba104637072a72a6c0ce74772664e68660c9c0c28347315b17273a6846a79904a04b90a60c5b15973630209d9460365529bb72524404b3d9cacc013b0a7355a7eb2172d317cd356a07e5a341bab7c33db5a48fca4b1600443df6bf441983cc05125f6aa94f114a8c3ccea3f9c498c1126c072f27e97555456114f6bb3244c4698c3f6091864274a16bd82aaf0711eb8c4fd86a11b35b3b8b0528cefc253d7906b6b05382e37428253ebda5b48b6a068354381b24348dec73c279010bd32e41431d139a021a398f0e5c7fc1a98863f069b9d42a96b029455670caa89e0b867781f73fb7549392124485cb032a008d63812f832cab899a8d5d24b403e76d17d6ccb56c729e15abb2e04e32928c9b8971be6a4c70b15bee620eef375489347df7c622d9a803a86c2a9ec5a7a0554ff763912bcb7f57eb8b8633cf6ef39556162eadf8c285b61a53f4837c8c9ef48c3a58b3b6c31b8227c98df0b9057d452df2c258da8a1de1b99449c0054c48a0bc61a2336323367077cee252d366661904b12ea6215b3ba55aab06f60a517704a4046312731325df563cbed805e2c7b2a5848fa1cb97e17a2f926664c2947a2fdb56ed1b3c5e084a680073669b2b9e888ee010410acba461910795958e7c0c98294865cc700315e86a5c54912dc2affc2469244912d8180eab244332a00b7536c4cab62345872dc31ca3c0d2078d07beda4431f278aeaf2482cde53afc56352a894dfe3948fc14956917a4dc836f54369eacd4af052b4aa6b60af5e86bc868be275abd1118a83e5acfdcd4c92a3c2e2b13cce7101a9d303339f0b2dd4a282499579b803ede0b26c75eb8af34000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 5ab063c95a541d1be3fa0744e0db7e0ece17b6b47cca0fa41d08e7969fe87de63f319f80b9a31ff01e203de6e518e62e6133edd108e5a3e08d3f8ae0556cfd36b399dc1ebf3b229bc5013d06d7550512280bad2b27657d3ca0679d9fc62f0bf875dd0b326008a89b4f29e97211ee7ec75108a9e4a320a34daed15fd7ad394a1747e4e35bbe4f1118703c330aea81bef3e3883fd41c3efc3423ab46b553c7587894ad64db57bb0fe4d289d54c8ba78d40683bdf6330ccecbacd3f7f41541f1f2b1a7626d3969df6586b4214c02f921451f6adc04f5e8de1e3beda82e4aebc5e06abb33f4cd8a3b3b5741617b6a385739133cf5b77dd5607a5c8721d5b51c6c0b6df551a5b440082093f49f31910a04e4226b9ae6f41383672e0694bc4075207034e39c40668aa3174cfc8a75fb1a474485e9aff01f3572a5c7e4914e7519344c8ce7b81377d8c2af66bebc558359601b21beb984c1f00564d46585b4bf02c958c6b348642be25119b12f34a6e5755588f649837ba53c0efaa4c6c95d109a4ce1f761c1dcecb84cce8376cb1c4e34ff932408ccd2d06f20c5397f6277bf9c3234b20cedd45afecb7e87793d85af15909546c6ee41987f36d85865c8c1e281e13d9575abb9a9f215c08d89420535f73643dc584707deb7d5275252e862393fb6493f9e126c651b7981f26af8daf978153fa4476d615183bf147629fe36de7cceaa670dab930ba8a684b0bee24b55961ea556123b34e29491704d2122e46bed0f6fd50601e13a5d46c907b915f3b8e695e0bbf474aab6e082d156e79e59572731b48338892f2268dcbb8fc21cfd537979278ceb210fe3efd052365fa249c97e8e596ae6225839e5b8b296770f3b42240b8727a0a730534d0f42f8c6ef148fc04e4285e1aecf060c3666fc17a1ff794f584b26b0b1c41f0fcca249935cd411a151932b09402016a99832850b3f56c4846145738f709f5e11e28a90d9137e4e43f03dd1ddb6565c67c2a138aca59e8aebcfa61984bc7ac13a60ddd2c1f0fa84fcf9264ad5049c888b9f555e024f0fa685474e083025da168e3b9c4ad91f074e7e711f84bb808604114e09d1ceb83b697cc0f045b5089b0bf7381ff2efc08e7316ddb7eb7be47a1d82cf533ea898e668f0da124d2e87fef2b558f877b50b13a08641c74e2726b19fa7c0f33ab213f403c328ea60d08c07155ca0c19bb75f7f6716de89e34c20f9d15ba8aebcb98e9b6461477f56f9c65ea7e8744a4d7306e216f806ea8f9f1dc45781c1adba44319031fb9e81c6d33bb317d959bc53a677270f13d96da19833965aea9a18172f6f975bc4d03036b1239e7c315ecacec35cc0f788be1220c0497844fe7c989fff5ef7fcdf89c261a0fed3915cbfae94b1fba22827daaaaa0f968f1ac71e9772aed587d607d5d3f57c1500b6e08760e0b971c1999d01553bf87f55fbad96ce61d0750d75180623543f40e5b0cee74bb429edbed1b4c2a3e1aab86c8dc7381afb0b9e7d4151a3f76b7dec4199b97304d7b3845788e19126e +shared_secret: b4b4634ad37852e19175ccfb5eca50093291da8f76b86be7511379188bc20d92 + +# Rho leads to a matrix with unusally large entries +entropy: 456be124e7f43803de5f734ea016455d68164a7f054c003f4ef49e46f42dd8d0 +public_key = b0abba905c1559715f25f720b7b745a52332355154e60577e598c754b6346b335b0195ac305268bae78bb4617807ca4666738ca81515bb041d43a4188003c52ac4ae4b3808d8c755d3e99d00537249d39d4cc02ed9f98ed4106895666c47538f79e30f5104adab1540a1fc58d1a857a1a4611257be37e0327491aa4b543aa6322ef7816a5c9a55eb3bc8604b15540b62c3405b861a84218211c20bc3d35a8a506b0153306fa98b9488a7841d85197c170f84c380098077e42cafdf1913df369f37f3291ec47289710c57f152b74572c23324f83618fd281f5e41976e77097a570a991b3bc623ad6331a1bb34673b1c328319758ed731ca2981b50a5a2cf8c66d31b10e88c95ffc27c3b6aabe8b207e6cb4373464b1b83f4a5a9806449bf7fb622360bf9f098b56729c5738191d57492b377ca8f989a87922a7368d724b07b7e36133620fa0735d60f5be8b51c19ed1655de5108681cb27273d511c643b7867516c2982a74f62e4cb759bb1f5f0808cc90e1baab60365722293bb07841803076504d00e6fbaae853749fc322e3458810ea41d832b35bf05a10e62a4ff8317b506b9af7216c445663c9061cc62914b0b72b5989d7d9c2b761c2fc5a28b5839bee5596c0de25c10a15776447e17770edb666249a2310962152059c5ed5738741a29e899072427891fb53606ab8b5dd06c005d239adb7bc368b10b74508c45c4aca726fe59c7729cc1ad617236e1b75c760e47815df33297c084429ca371c16c5761c9a23ebbcc2cb43ae9734ba9495d5a86a89e75aef50b9e73470d8d9974cf27a961c0cb2c180ff36140818b005f05afaabc86d8b8bf5c2a62f0632ebeca0c9c567514c9311ba6216fb13f1603c77656cced520d977ac75031044c8790d1b4c97dd38b2aa43dd8808a79e406f8e01503db8f7b51cc1e4265ee830461f41cec398251ea60d2c573ec59b4d28b09dc9446bb972f6d134e2e192e987153b39538e1f631bd81b2e65c2c5c68a96d1b78360889efa4c692b7cc374160e8dc485f47a676d77706e047d3e717386bb49cd942e4c05374b3a1cca148535a3ff1085102f4a7077b5f9c7b1a9ed651edb32691037f9388b672a662bc247beed215d51b414d3530c6b0631999663fd7c0e5da7e411c32c506476fd08a09d499ba3c27bbf6a804cc7e8be5c1f3f97d7aac085dbb3bd1076a69db89bc990efe59b00ca943ef8560642176e926af342b48e8002f6d1aa99b58cd013b03e0d285455786b54a4be3c581419730081361c04697b1b2c07df068621213c8ca6554b5982d5a1aaa113ed9343a56101aec68b838a37ef2c8a15d0504c672b278556b40c766c2066ac995caa32676da182545773881545cd58b71d3d7a02a209bc7407f420a830513b9d9d6c93c56571e42c8bf154afa060667a46d13cc542429c9d1a35be012cd3c9abc2bb7484fc89a4a83a20f7c2bb088793dab732ff370cbab614aa851fb77ce176b8f806c4f2e6068235b93d08c39e96badb37a457e8a790b2b8ef00b0b9e941592373fd2caa3ec3477c6c440d0daa755ac0ad2285754ac64b0852086112b0c9794f1657916fc173209a40425afc9b19946c529ca95154f24ca3cda5f9547c429836c377123c6ec000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 925fde875ae198cfea88c4eeb3a0091897e25a793672df1de3f24ab4fd3edb2cad0b07e698f35dc97bfd1d551fcace3282c8c3d8131857d96ee9986da7b79a02ddc6cfc9fb7f2b809a8e5511b1c1256dbab33e7606d8a5fc048b36f6ee53c7f556efadf94494595a549ca260ac9c45bf9962bf406610ca58dc286a9eeccc447a767b6db3ab009f5848558acea4503de747d72d43218babd6f68c091b4581f4e41f2e850047f5f543a02407e7331202b0eac7bed180061bb53f4dd3504ccbd3f298d96b43bbaf8f0c2545be54c59830e1f343ca88bb9c6812c66bfbb59a6d68298985767a73d34fa69b52cea98d95d8305f97c4d4fd643b56c60fe31e3c2ee7e938ac2e4a5da2297e670931c1dea5fcbe9cf118c62a76a461495f10f640fb416ff7bc2478c0e8a1356bb840345f3d43476bc4cd990eb7f7cde7ccb96452d055397ee402be2ce395a29a4f4061ec3d85b99f086341441022435b636028a1a04c5d787abe1c24a5a55653b7063b1cacdaee40ae0de77b4034b9ac0e860a90c8834b352c71e353c02b1f46b135fa68fa7a5c1c719896987d79f3174b8d0b0c28ed64cf9f2907924497e35bf519d519a9199a4dd68025992c6f466604bb2ec3d7b13eba76e4803fb73bb125b83413998ae86691a0b35c0054e1418898f435ab26cc12a12fd4dcfa9e80887af7ebb6c856a7fc010cfcaef9e1c5a4dc24a91a622fb7307521faff0b8e8e966b7b6ae849ccc75d31c8d700a3b6a9c3f646b2a88d1e9391c2ddc6c9ff15db961874c87dd94bf0165cfc8f719806539a8beb8e28350610461b1252872f0f3ac273b3366abd78d9fe8868dca1a5eecb683ab8b50ced8cf4a5ed3b721e0fe6b205fb191985ca745ff5dae0010493f8296b6586e1c96f7f23fcb4ac4dda15eab811107c977aa0a16439b06986a9027640cf7a01051934dfc758215d22c6f06866d5b871dfdb6ed240a73dfde43f7f89c0ce6909b54b0a633a25f7253c10906166f81ae91a1419028d6182c1f277dc7872b824c7a5a22bc7afc02afeaa9ba4c271ee68882397e6cec34a955cfc672f4e6f5ed870a35ebce97f34542cf0a162938c91922230ee3fe9ed9a166a790ccf450b80cb5f483c3c6ae5b2e52e907824b45e69e5ab38226cbd6519de995e1a62a910fd45ed189540e0b4058ff01edbc6ba4eebd58d55c0e33702de299eb53d6518254b8471f282779533eaaef90602e52373be8b519c56a2f6fac0953c0f84135715c5674e45d15804fb94d9e0525ab493aa625fbf73ebdf74f0a1246e1eb0e4e2e261b24ab81d8da6e1770634c747542450cf0a2af23507f8b6766a16dbb2e67b2c94859228b91eec6c59f5a271902b340320412ae947398ad102073f8b9b8c021f81f786622c3483e61f812aa76232e6f9453eae044c5e918e6e4e0e18a78efaf6cb36f7b75929d0036c44edf928d6efe1ddc87b96288c7c624655d302b98865978ed7bc779c800e6113a0484dd225aef29796c8ba300b3f48dd566fd877dfeb5d25f96da5d07e643c5d +shared_secret: d4b9a0f77a52d4f8b9c95951257348d1931725c27eede694ecc09204a931daf7 + +# Rho leads to a matrix with unusally large entries +entropy: e8ac9e76377d67d84f85a142383e777157805be0d0f679ba89cefdfa61583780 +public_key = 038c5d80656805b427d0b9167abb3697444af88a0f3eb48bf658be44f36b01233902291860215084ec7bb3e170e517c65c623ecf4a488f69923f9045ea18334d5c8ee847381b5a8903a6233796b1def36e46d343cd3547f4a757d82c262278432bd555fb5430e7f936affb453ac1a031c70cb1b3a8f3762dbe226461501d13d10052fb621be30b8ce63ce93591979863816397f0d198a6c534b55213d778ae7bb1a20ef1809ec37b08382c43e82b4a758458d7758d23a350538b3e524d27c9074d1cc4e3e1a17a6b06fd71178c5b18803b1c439b9e903a0d63018d2f765fa7426a0684793ea789c30435657b9aed58886cb8788e14426ea0295da18293024eb1a39eb99a20619a3e2db48a93eb90dbf42b84fbcec1f0b9571946b6f150ef5a672686a30e52be2d536bf3664550f60c99a89b81f3c911784d8a371ebea0b97ff50e2af68f822a72e9a76cf473bcc1cb81fe2a03051771b1c91f1e1a444ab6119c0a83b25a434fd598bc767315881aef9cb4d4c51ceadbb3b1a1142e0b87d5826b161233ce253d2adc9a00bd00e3cc21fff09abd919b54e09ba6b505601a358e50593dfa117eb2b8d7458745a25e7c7321cda0c432aa5bb41aab60eb3dc7e03ce4017b245809a534c3dfa49e97f4474689901e814a97fc0892ca04d0c00e3dfc836b36bbf74256e77525a031160fb3bf8ac31502c049d0a264140104c7488e36a46d23a76f4535b5902677cb98a5abec57b9357b0cb3b36b68349b273a2f8396e6c8594b4a32f0aa8a622378b3ca0426f44443942c02162907b2651ac2168fd1279b040192716bb584211df4ba36cb363b8c3adc39b410977ae3cac26c21470426837a43b821f65d8ee1950c87b4765a034aba1a35579f4148b8c2f39949812cf9d850d5e25be7713ce62ba31366737c03ad45f23e9b226d1835c5ab01c081063dc193630d72821cfa2a56d16108c40ffc483177d075b6a7a1bbf5cac7da0834d755acd10b9b9850a7c97d90a1061ce94efa4b0c0707339dbc7f160a45eeec022815a4494334254c08ade388c07c34e3a07e51ea60fdeb9b20b4b9afdc6c3c2b63e872aac9b2a90b798bc2dc8d585c69c1b33c1d51372c583e835b9ed561c218a2968c044051f8a969a7b2db6a7031d20cc9e024bbaab4385a3ae13ca264c25f6c5b4170b5c0da13044664a10f335ae9045bd6319abe139bb2b8b635bb06e2f48427e256a16a0f71f119230a9acfb19f0fe07c71828063f42a844a5c703aab9a844f689944ead511d8c97127d99429fc87ede190e0fa002261494076b7a10496dbe12919f585685733ae780eab3ac168287aae3842cfb637a94483f68170f6a3092d51b82ef10496a6374572a527aa7a7d1a99315953f625842ec0bc8851180b98cbe411453027c9b8a4a07fc3bbe32b897fc09e5e65a0457556a8b28e5b7c8b28db24e5431893953c912c195ca52db5d125c3f595f2ea75a63b6c83c8cbca257824ac60ce16bb5be02b30488974a22a66d37b19531e3cf17b59bb43d738cea25326dbd6355243ceff3caae98446927351ff623260472f8c7a715016ca5480af5cecc001c6b65f41221b16bfa61863e225709775b5e6393e4b71920c0c539c6bc5ec5c609466000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 7c06bbeca8b58423e2ad420ec36064ed42c881e3655668f8865a2d643ecd1a4eecf915b6c64b37c98947f06c3ccc8e00bbd16017c246db88cc83f12c887aaad7db61b4d567c285841689169c3f928f1d178a0ddae50d8c46cfd95258667d6239c300595738defd2e806637ca46baa4c6c7b97f1a9b47d53cba9ffe074f88d104c4971d250d085b1800fcbd91584d8cc48e145fc81438290d74765e7ee8c1605e8048b37b9d22b050791fe008b9b84b7f23b0f49955e32c0eef78d7a3a0b2effe8b37d124e19d4cb6f6914204598a525239d9baa116e1c9c39c47f9f37f965941b2aef8519782c65f3ad3a6509d1e31e7efb67db21911e4edeb1f7e9c37b3f852c81d63a95e4775e3f2a8ff315a214680adf44d290e42ebab8ca95bf471140b9d7e03f5e9f97864289a0ae8c9a105e00409f714e413b69be366303b4a138ed51264ab0e5cca5f6dc9387c6608109e8859893efa3bc7384e9f418468b1078807dadb768e254094039d1b807d67353c8e0b5a03d28b8e41ffa0eb3ce0837a132144597908f7a059a097b79a1bac323757324e907b445d064e25c378d2069e7c5d671036871e4fe36705747635e40c6e835319e3ff81714cacc44515d671b703c5581dc76afca0b881f37c1ffc93f2e4afab1e8ac776ca883f3adf7f9ab99396f7e19541c26342a7d5618958523b81871326c357ad84ccc6d3574d97cbd875524e7b08a102263d80f318a48e510c22126568f76936c904c231700ad042d73137eec741c827a082de4a45d296745c55b8367719dd08b8295e38d8d3894b9f8e2f9b483b266e1fc71d6374353ca7d9ed1c6b73ab5a42f6abff7b2ba8fd484d1ae6928b5ea92ea3577be01dc1e88abcd0886eb771dca4d36e91c45bca4807c89736b7d6a927cf64b22c5f323077f5488f6044976f310b4b99f7d486335dcca60571157ac0e480a4dba79a826b4bac3dcb7327a33b16381eb41e1d39915e91a58750ceb71098ec7f1a2d7e44d4bab75bb7482eec277df206502c497eaa345109a145a4da6bed1900b680ad12fb028d33563bfb204ecf66e6ead587c5fe27f8a2eb0e27471925ea0f35eb9d5e53ef801eba3acaaa7790b105eb6128ace992668181c1d7cf203afdccdfefbac67dbd97cad05d499239df84e4cf7372117932c973957e5c70a8520f822be430758990296877df62069d818768513d14df0568be8e63e123bdde35036dcc69a98197f52dfbaae5e5e0cee4a48c67fdda605dad8a27651625c2b35e81dfcacd2a41a6d17f6d7067a67faf2479b3868673b248270f4a2d8ee26de9c787ce966ecf186c1401ad9d3bbf2c43b1d5de32bdd77f5433f4325427254a13985d733ab0863e62a4f3d484ab3f5d3b88f23049079143b058babffc8367cebdd9d2468d7af782979a3ef12841370da6ef2db03679e6bca0db72166c361adfbfc02234119abaf98d4fea8ddc6e8490c2fb5a1be4806a61bc7b36884cf4631cfd53138a23fdda11e597aed323748314282672473a1819ef2b9488f6744544ad +shared_secret: c9d0cf3edb1172344364afec3615ba98477ce9316f92ca46ca5f42b73553a9f5 + +# Rho leads to a matrix with unusally large entries +entropy: 2fe6b9cf4510f212839e348d671b3345da68a477f57513ce363414e87299a717 +public_key = 7dd722a23522b0d8cb522a67d63a75af305c05f3659bc496f1c47e410582a0e58bbba80751bb2f5ab71414051627f46a78f9708e3139f8950b999378df4709a08b9b511982ab1b2cc4d51d177578ef263c8e12752f914733023d9e8068d4fc1aac34106fa72197f6b4e4bb26ab29ab64d7c848f98ef5557ec2b35edea70b67c084193921d8cb52e132a24372be7046aa2af66696007e2e0830df1c7b4396bcc8f27aca46932c463b49db0ed88882f3a45901a4b96ee3b74e78afb8dbae7bc653be895179f208c27c6ecd60c26e54152aecbc13bb5ece39840574c56fb39fd2385c76d62c59a41b3311702d5a99e366467b6c4f6c252a95db32e5096e61d1ba872924d358b346dc099a485c3df72a94e437a82a6cd778888995c473c203e091309ba42511950c19db3acbc5987259bea952b5a549839f197d7bf64ca0772cc1dc89572a0e04690fe651a79ffb3dc07388c30c06711c6b25572bbc83ba868a379d54c6439754bcd67c9b0364ab3790967a062948084ab33a80ac5971fa99830aa7d1e9263e7087af67ab6a83ab34f405dbd72b3fe46e9f2114e26cc6643b6d3adb9de63090394213e72b64ecbb2242266139579ea9cab2e51868ef82ababaac38e7ca0b9554d665365dd8b0b58f3020cc9218b866955f54d9f7b9af9634ab995a0b5e234fcc78cd1594e1cb8a845ca0cdbc82e3fbb35414c53423b76875ab267a702d51710149061e7655a0168695053aa61b990fa9439883640e7600345033ca90678925b1d632962deaa0ef5642b870610be3387eda90cf608254dc2b000c06632331680e12e9b277597d07633a31f6445318ac7b9cc1b087cb58bddd30a07ea6e1b1429950b7e7efb1a6b88b037c92cf987c904268ce39cba4bd3c163f5a8bdb9698488152a18b02bc98a83fb6c28a55a018b48979660ad5b42281b8745a4bdcb02cabd16735ab1523916adcb031e34ccbf4c50bf61bb7d562804d4104d3f6ac183f447e6608acb0bc40a34ada4897e9a91c542571877931864b612cec01c88010cbe039d42540835422f5900c944c7025ba3365543536d093a68c27abe1175bc227faa590f8fb8ca9ab1a87366574422379fd8659fe5bb5ec76e179666adebcedc7b54f1aa9388b2907a4ba5c48441ad90499c64a57768631d4a961d88976c816adb897da7715a100c75099cc122f3b1df183385673a3bbc98cbb0ccb0b090b3517993815e3f6b26b984bdda32c11947b2fa5411004c2c41f2a646036b86bba618e72be7f97ec6369af5ca2ab2dc9493d9078a0c8598841385205177c80a3be42a31d1166b02cd1dd2871148033c794242962e8645ae2e4867a3e5c74f71a1d978379ad45f7fa5c70066cbfc4cbfbe05cf23612b2dea551cc52dd90a8468ec771ff071371544e96400e288a82e9c9eefe807d6f4903ac567741abeaec9707533b38dd8c4366bb33cf86f77272478e43a2d8061293332c8d805a4516238d5ad1934a9683655674aa6b6d91610d4c82e966d74c41dfe7ac18e993c22d59b2d286a0b5272cd44988510b9b342405757a25731729e934c58c601f5c311a244a24dbcc772088a20dac4c8410167304fda18445f6c6126b9645d4042d6033419d246968848e1f5000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: 83ea5ed982570cd981b7430de924469d4e2faba68e03261a74f5114ab8c448376cfcd1b9cb3e72bb031bf0fefe772bc40888abc6acffc1d335d46d267acde2cb89cf1b3c67a139796d6a5763805d5edcebb81070b44ffe021b6c2b3c6c3d5dfb6d9e546930223ab0139990c6c5d6257520fe394a3aa30c6a71d47f415ac86b68eb8c83b131a3c5cbf051971fef5ef3bda355d3868e71ed8a0e2c6de8a759bc0c9e760277cc2c04c783d29d1ad3d3385accb85cc88c39bc8348f84dd8c714c5feda50b0770414a333136d6678be6ccbc5df488bafdcade883fbb310c99cc648493aed72680fe1e43c0cf523d3dd06417d29dd97c98ce53089505d36a476c0ae6d89b165c3ff6b2c62ba954fb81ac5782ae648a6802bc057c64fabd3726559ba79de9c144aaa525f6a840ed55abf21b37231c6c4cbb0110fdbcd0004f6f4974ec644c33a8aea34ef4a0a146f7502650c3def5a313d2f309cb428880502d3bdf39196a99bee296f9231d87972efd1159d3cf59bea05f0d0373a0e218ee5e0528e1ac7132440980d1153b9423bb2e099d05fbc8241ec1f316bf0add575a69982f546e99c64457c12ac83951ad46a5f024f6a61c91b7d3853ba1fa41d5a95f6ca811610ba3f32addf011ea4091ef217cdd126ec5e45cc40ec6f1292602b16c02718419646370e5b2c7c55c1128fc5d6c767cc75248b79e2379d40f91a8617e8a3db43c42cabb5cd39a7a7969147f30344c4b03de7034b12d8a1c3639697c97c4483e4191ca0fa81d8659f40e31b899b4ef4610644b1314ab2ef14b8dd8dc0082826fe65dc17211572cb14fa376f1b1784a00033c8dcddc44d6a1128a200eea668b6516ba42585cbb2e2be2a42148120013d0a9378ed7c185071fa8fdc09102164c63a665fd09c08d34104c9abb64e394b2e2a00dd834f7c7f5de16f6c02906ae37acc923dd76e530c78f2143396bfc371d14e6c48bec072b6b4e18eeae967456beb3f897a06eae17de174cf09be1435e691350632c0b1eac69dd66549c1d980fb147fa295ca6f21b5dc398e63a7c4263c75b55c85b4f38fbd7cc0fad84aba90dda1f2c9ca88d88905602096162486dba1ed0a8caa6b897c99e25934152a35fd0d476de09fb211abf36565af3744f3fb737247f5d8f172fbf438ed04422a6b3e17bdfe2cb0f09a1d57f1f1a113a768697f23d61ab288f15abc760feb0f5c5d4d5c0b1c891d3dad6089a3b7e54516b8f9755d38430312cf17b21efeeecbfd2719b62480225b9b3ee8940b1f1784ed5630d152635a1233acdd16e5489a9a15eafa7bec99aff25b18d9cac1e726c9e424773a7083f213cea53dcd310b0037aecbde1d584657f32cf548a6872c6f5a1a3a70d4db29ee3773291c94b00b5a596e1691f7752e246ca0960561cd233ec7d5f54496d34ba65b359a856315f02d16c990cdf3db2051b17bf283fed1b808ac79a9ce8250c806896bf75f2cfe76465c09360aba4c9688acea341fe755363abe41c0cba3ebad00c6c7bcc3f7ce091f87079f60094b92 +shared_secret: 4bb6a6b27596869efae3d411c69c593afff99b1a703ee1f4ff3e0e7e9756e75b + +# Rho leads to a matrix with unusally large entries +entropy: 86630b4f72820d19e9941784183b3a0d770609becd6fe0dc463cb6edac432d59 +public_key = 59b479b444b510d9b6d89b7001b237f4a34c57509f69208c7e6b956144bedc8b2d19b12c1baa725dd106f5418ed943370050808ed2636fa634add059541a7a8c7976b0990e59c20c00343d1c37bc3ab587e312991bb88a74227651b340346c58bbb174ac18c204f37445681bc5905354d834f86016d0921219fb467d829daf24901815666d664b8c4aae307485cb95885b7cb9125a14d4d988d3a42c0816ba7ef14de9b622e08871988b8c02d857626b65065551d5bcc81112384f979cd8d2b9ecb55c6afaa700e92e3ecbb285c01112a19cbdb90b8af135b235914c901e2314902a43c939d065481128f83ac801dc2fa69c912f2b69189736d72414df12646680c9c858a9afaa28b994531960b0f2b82fc6b9c6f10706930786ab5c6b0da61ae813cdb7387c27324499b111c6ca5767056070e608cf421af52cb45a842da82560dd86acf45a7e70245e0b535f7559a9fceb9369c44032c09302438cb4670925c7a831d52f083a7919e575be844d9e6a009957c15e6c5f84f050cc4801561876f9f483ded505b3c77a4a97788358801f012b59d716fed55975f8abd3464420d849d89c16dd2a95c372cf631a93a8897ddda2a038070adc2a97b5538778c0215cea399deb8279b2ade6c5ab84bbc8c6e181c091b7002a4d5f395bb60c817e03966b63ba76e88fb05b79d126ab0975c995b5bb2ae6550af78d80b96af40c9514f945d72b0c9602412242c81b60b2df97999fbbaec0404056195879535041231803aa7cf064b5fdfc8b86344d65eb30e52cc0d5b86947b8051ea93008d789914493b58abbd5395b657560f5823c387574db554118d06b26ba14b9660b4b390f8b828ba8a852870cba24a114a68094cf0168b721af8f0998e599b5db2135a3e9360b5754dd49155eea830f0035c2c116dbc9039cf69034c505ed998f8460a170eb5f09786d902664c8135ad77101d0b802248b6f3165a847b5c989131d7ee3135cbcb48b3cabfd100074c00f2e7bc85d4c84bec8980a6920e6f318a4bc805900b548fc7d98316c1b3c3b49f6c5d90595ff7a7b56465385620544aa3f39114e53581e851849726023d953b5df56b87be98854b253a39297f060449fc1c02725c3442a4ed8624f7f6abf3854cf04166b24c3b5a38358bae933ee4777df09720415314b152efc0b175b664c0c0a3521cac1817314d1e69fe03b351fe211c4c44639622a73a4547ef52d46b033aa52a79182baf49a8808fb259c048a04cc03f8a1038e9112eb30965c797f90c277b3549df4f757526351bd1a100767b4bcfa7489c17cb181b707986b9af85e766aa1f99b08aa2a7bc8a385d294277cb00d705b4ce2583e61c16be2b18445d051d7f0cee51703db3162bdd328cf0b0b24a424bd830c6574091088ab746a291c737e8cd595d1b51f9646c7813a8991f89c168489d1a3b61a82466d98ac9de55b4d5aa020243e638328fedbc93d341e1fdc7eb861bba3783a57c86a7184aaa7d5051b7018f3f18b40b69fd7780ae9609194db70123801729c561e973dff3a7ea5ba9045b24e5fe5bc63ea858c687184a8276612c80ab600cc37699583b9ffa8c5a1b7934f3c12873522dd1c4f976b73121bb79766803d247de1dff18807000000000000000000000000000000000000000000000000000000 +result: pass +ciphertext: d4e89c9a1b36b648551ac2180f2f59158514568358f66a6fadd88492a0e1c122d1d7806287eecbcc8e8e6a463dc1c909f13842f734b9eb5bf690291c9d5b7836de8f4a28b8242c21131c53ebda4002b329a1951f469168ce0199f0a1d2edcdf3e6566f9e638e5a1095025cdb591aeaed8bb115ca3a1f1e9a8e911b2b9d3838608a27e50018e9a99e65b04adab67a75db892676c28ff41f118286f0ad2f5b650baf9441470db659e262e64cbebb4e808b1e7cfde0ff5c1ffbe1336beb42155fd9cb1cef90f306f5aa2f121b30b4d6091b19f37243cc15df2a0a16c4b5f70ffba99456f535af0eb0df80771150ff28c7925da7293878699c00f5136c340d1d06460b0ca7223f37ca553be904ebb7a7f41daa8288aa244202247eb8c35b7bc6d1dc8b95c220319532dfed22dc5d0f2f77a4bba0f5ee599420a94c446d89e3e8532117bd8ed0f7d9cb1f0a58a92bbf30a9d7c16d5ebffe16f39f682c18a8fc2ec0a551370c0e3ea706259f52333f5e86a83fb60b9ee3776f08e3f85ae4ee66be8c653cbe25e316e6ad33415a13e5139f53480625f09f593a598d6fd864729362efc3d09f5b171b0eff76cf860c8fd80583bfcae3bd7535e0270d622c2c09886bf9fddff6dfd045fea3259d26f17500b6b1e0b5068dc06a510da4809fabd615221f672f6d1d220c22dc080c9dbd7544ccb3369deccb76287c77e1a2af0afe133cd19325e6a77a8bf96fae6dc0381bb303815df4de480a9f3f97f1baab7774d7d5d9eda6c5927692fa2277934b0ebd30b4e7785f0c61a44357f49adac4430fdff3af956904b789c2dc9bcf87eb4cf93c48256ae13e90a1bcd713f77446593837b81baa6fd7050455d69a16b429018390a47e6e881467b57a2cfb043ce5a8cb114c4bd916ffe353579b599994efae24ced2dcf1a2923a0d0d8e771e7c230d887e596b80e01d84c908ec9fe81270f12e2f9ba2d783b1200fdb106e9d340c21667b722564a0cb4603dbc2193d3b455e06cf8c1d8fdf3e7ebe16a47f0181407f66c214379a5f336545818782835f6be2e9ad89f180ae0747067cdaff1f3b9386debdf3f057cd02f6eb00ecd656838e2ee5bdb99d6260c0447707d747bb6ff33ed65c2b3e22074ff25a7a0933be3e9b51de95d99e02ed4204f5ed8a6ff864e2f04266c9392c6feada8805ad44dffd5abe8d4262ddf6d2b1b4099367927b0bc075cf1d1d802f2d10b6d31d7f8c48b043340cae34b5b7c2f1e9b5043a0c2a977c51ff038171f8c81f04b284b2ee262befb6a54bdec146b84dfa116542bd13123ea79e4a660e44f3d23a0ce35ae4eb7b45611f87ae836081742d3cae6c65a0f93514bfe118cbbe7011e2a9502b197ac4bf31fe17016e184657b8dcdd62a223d1bd88b98aa0bc200ca91e123fa956b3d804b2c0ea139f934124f8d0c3f4412d8effc554f8364b0f351a789cae775b241cd6aa6d15251cbd28f0f85fd4f2a48fb467444f2f759ab6048d33c27832cccf9cc45fffaaa17a6f5e4b766f861529cb1a0641b6d3854c11 +shared_secret: fc501515ab8bf04e3cdbc78c032524d6b9ac385122bd2324b11a2ba812158fe6 diff --git a/regress/lib/libcrypto/mlkem/mlkem768_keygen_tests.txt b/regress/lib/libcrypto/mlkem/mlkem768_keygen_tests.txt new file mode 100644 index 000000000..7dadd1c42 --- /dev/null +++ b/regress/lib/libcrypto/mlkem/mlkem768_keygen_tests.txt @@ -0,0 +1,499 @@ +# Official test vector 0, seed: "061550234d158c5ec95595fe04ef7a25767f2e24cc2bc479d09d86dc9abcfde7056a8c266f9ef97ed08541dbd2e1ffa1" +seed: 7c9935a0b07694aa0c6d10e4db6b1add2fd81a25ccb148032dcd739936737f2d8626ed79d451140800e03b59b956f8210e556067407d13dc90fa9e8b872bfb8f +public_key: a8e651a1e685f22478a8954f007bc7711b930772c78f092e82878e3e937f367967532913a8d53dfdf4bfb1f8846746596705cf345142b972a3f16325c40c2952a37b25897e5ef35fbaeb73a4acbeb6a0b89942ceb195531cfc0a07993954483e6cbc87c06aa74ff0cac5207e535b260aa98d1198c07da605c4d11020f6c9f7bb68bb3456c73a01b710bc99d17739a51716aa01660c8b628b2f5602ba65f07ea993336e896e83f2c5731bbf03460c5b6c8afecb748ee391e98934a2c57d4d069f50d88b30d6966f38c37bc649b82634ce7722645ccd625063364646d6d699db57b45eb67465e16de4d406a818b9eae1ca916a2594489708a43cea88b02a4c03d09b44815c97101caf5048bbcb247ae2366cdc254ba22129f45b3b0eb399ca91a303402830ec01db7b2ca480cf350409b216094b7b0c3ae33ce10a9124e89651ab901ea253c8415bd7825f02bb229369af972028f22875ea55af16d3bc69f70c2ee8b75f28b47dd391f989ade314729c331fa04c1917b278c3eb602868512821adc825c64577ce1e63b1d9644a612948a3483c7f1b9a258000e30196944a403627609c76c7ea6b5de01764d24379117b9ea29848dc555c454bceae1ba5cc72c74ab96b9c91b910d26b88b25639d4778ae26c7c6151a19c6cd7938454372465e4c5ec29245acb3db5379de3dabfa629a7c04a8353a8530c95acb732bb4bb81932bb2ca7a848cd366801444abe23c83b366a87d6a3cf360924c002bae90af65c48060b3752f2badf1ab2722072554a5059753594e6a702761fc97684c8c4a7540a6b07fbc9de87c974aa8809d928c7f4cbbf8045aea5bc667825fd05a521f1a4bf539210c7113bc37b3e58b0cbfc53c841cbb0371de2e511b989cb7c70c023366d78f9c37ef047f8720be1c759a8d96b93f65a94114ffaf60d9a81795e995c71152a4691a5a602a9e1f3599e37c768c7bc108994c0669f3adc957d46b4b6256968e290d7892ea85464ee7a750f39c5e3152c2dfc56d8b0c924ba8a959a68096547f66423c838982a5794b9e1533771331a9a656c28828beb9126a60e95e8c5d906832c7710705576b1fb9507269ddaf8c95ce9719b2ca8dd112be10bcc9f4a37bd1b1eeeb33ecda76ae9f69a5d4b2923a86957671d619335be1c4c2c77ce87c41f98a8cc466460fa300aaf5b301f0a1d09c88e65da4d8ee64f68c02189bbb3584baff716c85db654048a004333489393a07427cd3e217e6a345f6c2c2b13c27b337271c0b27b2dbaa00d237600b5b594e8cf2dd625ea76cf0ed899122c9796b4b0187004258049a477cd11d68c49b9a0e7b00bce8cac7864cbb375140084744c93062694ca795c4f40e7acc9c5a1884072d8c38dafb501ee4184dd5a819ec24ec1651261f962b17a7215aa4a748c15836c389137678204838d7195a85b4f98a1b574c4cd7909cd1f833effd1485543229d3748d9b5cd6c17b9b3b84aef8bce13e683733659c79542d615782a71cdeee792bab51bdc4bbfe8308e663144ede8491830ad98b4634f64aba8b9c042272653920f380c1a17ca87ced7aac41c82888793181a6f76e197b7b90ef90943bb3844912911d8551e5466c5767ab0bc61a1a3f736162ec098a900b12dd8fabbfb3fe8cb1dc4e8315f2af0d32f0017ae136e19f028 +private_key: da0ac7b660404e613aa1f980380cb36dba18d23256c7267a00a67ba6c2a2b14c414239662f68bd446c8efdf36656a0891a3cc623fc68b6572f7b29a6de128014411ee41906d08071f94856e36a832b40338d743516659bd25879c007a52bc9586f79876afac6c9a30d8fac243bd22425d6adce42ab7ed39014757a958bc8a74565f019234ff04b34893ed6d05501c37255239aae2ac19f8c75ac5900dae8300dbba710dc2caae1bca3a38c58342b286b8518f136ad15b9f7bcbb06a5607db375dbe976457c26c6598257531b2cfb6ee7f51591840804c38388376c27148413da9e92920bfd9a069e018bd272053da8775c0b739f761db2107cf35a434d69b07e5bcdb87434138b0cb556761ba522a5747b28747d80eb9d6cc673bee5769377b996d36ceb0c0c7ed9a658533324869c18a1a36f31470f14c5ae49ab070507f8249ce404b49c0a8c3ee42fea9631fa1a0d10d86b93f986e0e3a82e703b74e5ae6101242421a89aa07fe68588460baa368786486a72e4f24d2dd76cfc03b694a5ba91a755a0b98f3bf93307c0ab64639aea7a6498a3c3ddc571141abca4678cd2e2b857fb88f600caa596b44bc422250b2819e0515f0472391853700b01eff9453fd11876b7c759a07dd845caba4555264a82765193fdf81b620a1e1f923fb24442cd1cbe94175003ec06ce77a3c64493c199987a300c95c53c0089b5d65c92ea971b2ffa93b52a461ea2ac8c199c2f4c2b704297ce3c3949e0735ea8a14aa59e8dec0c878399ff70747ab244ce46b5f2230473323d25c66fe6b419b1f4a112e5214035256bc43ffd2b6b7b378769a6b47000bfb6357d45814baef3857d379e2fb8b5e5201ab26274bb1b70ad322cd0439b2db109cff0a2f8e600995571ffc38c590bc4c7615c69d0c98ef430f30861a77238ffc07061e475d6a30ad1b47fd039c3a447762db2211dc31d0acacfd55890a5824798f9aead7413dfe028b1012be8b6ca1026666ac6bc9440a449b51ad8bba7b0921dd4d8b4a578136d1a05db38cc858437b25161d1c3c28ee07bbcf2b249110d22781dc3050d8cc0090096b38a850696f86e9e6bab325271b2248675011968502881090497fac0af843c1aea76dd81cf29c012c66227b7f06d9961309b0262f732c9a4d0bbd06727abb8371ff2c11899a098375c460516b2cc88bcf628ede37d8f3b3342e4490a85606ec03da29b0256275382a3313dc041114801032c519f350c3e6abac3e33b93b4a19f7c5466e58cb1dc14b4a96c475729f971bdf173cdf354824d019427f95b3b4a4a4a958e476a6e6991ce6f06cb5dfca7d4380c3d920b5711ac1fcbaf4b9ac800b976d1ec766a626cc1900b66b3a9dc62c5c144527a296baf70433bf657c0437f87597bd7c8bbbe9abc37050931a4a86982a2028a74454c9b810c88d1701c8cc98a1d4ca107a6b25e962fe4b6b03c95453260b807228637cc9eb12acc0954959a52ae54d1977300aba0ba2c14609bb28c11d5fac5cac88297603283e867a3648366c724d9354cd7a196dbd9802f7b88d3fa001f9c9773225462235e91352a20791fd8b87fe3377ec6a3940b1130a0bb04e7410a34e2580d071d6c56202086787a6590f84393a8e651a1e685f22478a8954f007bc7711b930772c78f092e82878e3e937f367967532913a8d53dfdf4bfb1f8846746596705cf345142b972a3f16325c40c2952a37b25897e5ef35fbaeb73a4acbeb6a0b89942ceb195531cfc0a07993954483e6cbc87c06aa74ff0cac5207e535b260aa98d1198c07da605c4d11020f6c9f7bb68bb3456c73a01b710bc99d17739a51716aa01660c8b628b2f5602ba65f07ea993336e896e83f2c5731bbf03460c5b6c8afecb748ee391e98934a2c57d4d069f50d88b30d6966f38c37bc649b82634ce7722645ccd625063364646d6d699db57b45eb67465e16de4d406a818b9eae1ca916a2594489708a43cea88b02a4c03d09b44815c97101caf5048bbcb247ae2366cdc254ba22129f45b3b0eb399ca91a303402830ec01db7b2ca480cf350409b216094b7b0c3ae33ce10a9124e89651ab901ea253c8415bd7825f02bb229369af972028f22875ea55af16d3bc69f70c2ee8b75f28b47dd391f989ade314729c331fa04c1917b278c3eb602868512821adc825c64577ce1e63b1d9644a612948a3483c7f1b9a258000e30196944a403627609c76c7ea6b5de01764d24379117b9ea29848dc555c454bceae1ba5cc72c74ab96b9c91b910d26b88b25639d4778ae26c7c6151a19c6cd7938454372465e4c5ec29245acb3db5379de3dabfa629a7c04a8353a8530c95acb732bb4bb81932bb2ca7a848cd366801444abe23c83b366a87d6a3cf360924c002bae90af65c48060b3752f2badf1ab2722072554a5059753594e6a702761fc97684c8c4a7540a6b07fbc9de87c974aa8809d928c7f4cbbf8045aea5bc667825fd05a521f1a4bf539210c7113bc37b3e58b0cbfc53c841cbb0371de2e511b989cb7c70c023366d78f9c37ef047f8720be1c759a8d96b93f65a94114ffaf60d9a81795e995c71152a4691a5a602a9e1f3599e37c768c7bc108994c0669f3adc957d46b4b6256968e290d7892ea85464ee7a750f39c5e3152c2dfc56d8b0c924ba8a959a68096547f66423c838982a5794b9e1533771331a9a656c28828beb9126a60e95e8c5d906832c7710705576b1fb9507269ddaf8c95ce9719b2ca8dd112be10bcc9f4a37bd1b1eeeb33ecda76ae9f69a5d4b2923a86957671d619335be1c4c2c77ce87c41f98a8cc466460fa300aaf5b301f0a1d09c88e65da4d8ee64f68c02189bbb3584baff716c85db654048a004333489393a07427cd3e217e6a345f6c2c2b13c27b337271c0b27b2dbaa00d237600b5b594e8cf2dd625ea76cf0ed899122c9796b4b0187004258049a477cd11d68c49b9a0e7b00bce8cac7864cbb375140084744c93062694ca795c4f40e7acc9c5a1884072d8c38dafb501ee4184dd5a819ec24ec1651261f962b17a7215aa4a748c15836c389137678204838d7195a85b4f98a1b574c4cd7909cd1f833effd1485543229d3748d9b5cd6c17b9b3b84aef8bce13e683733659c79542d615782a71cdeee792bab51bdc4bbfe8308e663144ede8491830ad98b4634f64aba8b9c042272653920f380c1a17ca87ced7aac41c82888793181a6f76e197b7b90ef90943bb3844912911d8551e5466c5767ab0bc61a1a3f736162ec098a900b12dd8fabbfb3fe8cb1dc4e8315f2af0d32f0017ae136e19f028f57262661358cde8d3ebf990e5fd1d5b896c992ccfaadb5256b68bbf5943b1328626ed79d451140800e03b59b956f8210e556067407d13dc90fa9e8b872bfb8f + +# Official test vector 1, seed: "d81c4d8d734fcbfbeade3d3f8a039faa2a2c9957e835ad55b22e75bf57bb556ac81adde6aeeb4a5a875c3bfcadfa958f" +seed: d60b93492a1d8c1c7ba6fc0b733137f3406cee8110a93f170e7a78658af326d9003271531cf27285b8721ed5cb46853043b346a66cba6cf765f1b0eaa40bf672 +public_key: 93c140f6c47b7e53b96f72bb18447d277cc021c144a0f7a35e30b57386a78ac976376262320a5e7e1cb42e290de684462ce1067e920ee86c32418b130a5a41a0e8268cfa7e0db2b441cb927d7897c42b1d50f9b32868a35a2c04cfe91040e9a9208902f20c477e1b1ee5c290d2e5244eb1b4b7b4c6ad074533b58d9914a6aa8829f96789f5cb87607569983003f3a2461c33c81a3672af5924c4ba37e6827fccf86d8b4103fbe9c0f6226dd0a2145a6b7aec76b186466f9c67bf169039259574456497140c8cf4ac05091973ac8c08d809465785a677a032ac09ad1d666e8c48462813ce5ac75f184b38251c30e362b0e2501d6800c8ad103c8b773780b6717cf15c401139acd54b1598b2b7c79492a86631090268c70d875bc040cb2b75a386fa96b092b8cbc25c47f70aa76cd8b9afc12b42b536e27c5578831a96dbbab7138c3f247e955a6c08b4407d4708f1914bfa48af4b28533f747b860b7076c028e245c9727b42f3248fb0408b3ef0c4918ab76ab96daca81afb1211ab3a0329ba1a5b069a68934c1ce84c2f72839311257fa19e72c62fb5686b61416caf8b22d2b26a6dd01bb7387f88eb8606980a5e2259cbd56ca1ec051cfc66f96239991a2360d75dafa1534c8a05ab9c95e2e586853714600a3455511b62d94525d8b1a965ce69f986731888d1ecce536000e4863322a83e3c8475d9eba5414a65b0561d24a7b09dca6ffe23836058bec0a85671641008c831233c7890783dafe8c359a263e796869118c4e74002dc3b0ec5b1c4ac641bafe30eb2bb743713bfed2c1e79c4a6f46593006acb35f7031f194807b893aa7a9323162168d384d0e96f2f23368626a2e027891ac94f12f30a044b85f0322ce2b16517d36aa3f23b5f391be394b54ddc28e5a9775372869a7b50b4898c072c0669d43c641a3cb5e8c170ba63bed6ad1008615201305e292e1c818e1ef64f3e0c52fba67e7249c1ec4a140dc89ce0050647f1c19f5897c77b9059040b4b5b4282e0669cb4c658f48f67338413c92fc7412e444bc635dabc93c51b030784f21461dca210cc6a54fdc25bba09705baa77c1826636b16644a5ada51270d8317a787abf53192d40dc765bfb45c7dcae58481af3a49fe762b90bac1f6f69a5de8045981c67906b9f692625fcb6a4df2641688aba61fa49a84b47c96661e4701e5826c1108069c4b9c6e480251c4b021d11cfdaca12bbf9c09a0234186668e389454ac4046f5b2468aa2fa9b117868574e729574ee57ea7495af310627b85916d6b4c708374f9fb0c9c3aa4664c6651281d8eeb98132c1af13a816ca5b869f50b50b291efd466dea090918630c6fc77247c458aa82568a41dd9d4708af3bbca5a5716447e8c2c24ad788a8632473fdc4a257196bd2b549091176fe654d3694e10a118f7b66d1cd5af199b6e90b3bffa88a92e36717fd4bbfcc78b0e08634bc080c86885c92c8ef67aa4933c7df097891369bac5fc5d0c36737aa60971310adf02c257f76a7a7b3f7e132c2a71c52ff4affb6846391c0868241a3df13408d419a78bcffd49619b03a192c683900a244289c9f7b4564823900ceacffd9a9371260d5e57a8271196f4759eead0ceac318966e76f68de95ab9db2ba4fbf83c3b27092cd339cfe48d5ca0ba11591d04566f4ed24a5 +private_key: a2b315a16cc2cba3500aca6746967dfb808d170c0583b1ad737b50ee3408fd1c793739845fc18297341662ca3630c11f7bf77710c414cc925a3c4734cdaab8f1f677b33694067b230acb79b30262f74b923afbb06ab880b75a609463b40d908115489f3942473dc8a555e2403b7c1dec411b9818b627457a583305301cc34c4cb1db2b12d6f10ceed4269fdc9a67402b89b71fb372a4ef593a17a56d329b10ae24c6b3e750704b0993cc64a71840399bce5d7b182b561c9cb2b914673b6a5337393c1d77d497f426cde194363b50683e1b2c8bd909621158fa8b0aa234a47ac702a95a96b37c9f2a233e69b9779ce793788a0c2ea25f9b5a9a8444afd6b62f5ad6860c8ab1267a0e57acaa53bb86c6428cd7139ba48954ec55bee3f83ac5a47ebd328f053182d395cb7576ca56a639b3663e92f79af13abc20b251fd903524f9a16cc32b631c83b1e7cf5e04800e193f1595c563870ea1fc996f3828b2abc626c59137511ff6f40122a25bc644b154267a0bc6c1067078c993b3d5d018f44c56363b9c5cc9b1ca6569cff876578b5e86703d30c20d733553550b1a8e669f2999b62720b6dbf1100ea550fe6c3973b6a396b50a03235142d75603240f78055f082b1d2f490dadb8b3a0cb0ebae99ab2179f2b38b274c51febfb57cc87291e34bbe5fcba818a3f2da4c3fc8950f51c1e806c5e6f4552f3e187d82a0cf92b7da3f26ae04b8c86f7a91b545670b409dde5863cc7b7e30b937b13accd1c68e808ae6827175bb8239904a88a15824bf6489d1044620844a6d92469a311942c21294ba5f26c18dd0a0e85fc85f241c2151815ef00b3bed322de98a7f7092df5a0a5d3d6b424b26b38e1931dab2402342bc12463aa96a0a1c42dbf73ba15278a22448a4fb6012c214def53b0fa233dbd096cfb2045a255c75a9931d7e3284f9b95f648071f00343ee580193627ff1981e982264e63940287860fa763663cacfb61350e7a4b53f7702432347f22596c678585e3cfbba07d782766c8399ac21b37a8b16a79e6a41ff606469947af07c226f79145174ba4ccb4bf226cd5cac54055b8a0815020135b94e6560ca89c7d837e737a73a0278f0e8b1b29806c19858b8337967d527d0dd6a25a5b0f2338b23ac6a4a0496ffa8672d17075cc9c3b20b24fdf9548567a85f707998a375bdd044038c09bb4fa1af3f08a37fb6b17ecc29c756ce9085edd76618b5c459bdc4e361199ada77bd1f91086f443dac6a9eca4ce9403b4c5cb1eb6d74ed2f79ce9ec032174748c64416b676d11fb28e8ccbe1fd3aed6d0c168e92e3f7096403a3fdbfb28505087c6db9f2e44233773b03e5166ae1669041212ccd58ee8580a2d6861a30b6814f6cb550a7d9314080413bef5c847c94174e590b765869d0c9c6002aa377bf77d7f068316050e62e72a7bd083403240c1088f84287849112a03ac8ddbe907ab574c4bcb356e9834d4fab5c28b200fe233a61599c14259464a24e3210a99c7c601a81d2ab07d65a9504bd68906285545241131100cd03b5dfb05b5b4ba29166c226ed4347c2ca99d327595f29cefbc8636161c4b755f87851675d5553308c70ef0a8fee3be05a27f53075ac7d1710ed3177c133793c140f6c47b7e53b96f72bb18447d277cc021c144a0f7a35e30b57386a78ac976376262320a5e7e1cb42e290de684462ce1067e920ee86c32418b130a5a41a0e8268cfa7e0db2b441cb927d7897c42b1d50f9b32868a35a2c04cfe91040e9a9208902f20c477e1b1ee5c290d2e5244eb1b4b7b4c6ad074533b58d9914a6aa8829f96789f5cb87607569983003f3a2461c33c81a3672af5924c4ba37e6827fccf86d8b4103fbe9c0f6226dd0a2145a6b7aec76b186466f9c67bf169039259574456497140c8cf4ac05091973ac8c08d809465785a677a032ac09ad1d666e8c48462813ce5ac75f184b38251c30e362b0e2501d6800c8ad103c8b773780b6717cf15c401139acd54b1598b2b7c79492a86631090268c70d875bc040cb2b75a386fa96b092b8cbc25c47f70aa76cd8b9afc12b42b536e27c5578831a96dbbab7138c3f247e955a6c08b4407d4708f1914bfa48af4b28533f747b860b7076c028e245c9727b42f3248fb0408b3ef0c4918ab76ab96daca81afb1211ab3a0329ba1a5b069a68934c1ce84c2f72839311257fa19e72c62fb5686b61416caf8b22d2b26a6dd01bb7387f88eb8606980a5e2259cbd56ca1ec051cfc66f96239991a2360d75dafa1534c8a05ab9c95e2e586853714600a3455511b62d94525d8b1a965ce69f986731888d1ecce536000e4863322a83e3c8475d9eba5414a65b0561d24a7b09dca6ffe23836058bec0a85671641008c831233c7890783dafe8c359a263e796869118c4e74002dc3b0ec5b1c4ac641bafe30eb2bb743713bfed2c1e79c4a6f46593006acb35f7031f194807b893aa7a9323162168d384d0e96f2f23368626a2e027891ac94f12f30a044b85f0322ce2b16517d36aa3f23b5f391be394b54ddc28e5a9775372869a7b50b4898c072c0669d43c641a3cb5e8c170ba63bed6ad1008615201305e292e1c818e1ef64f3e0c52fba67e7249c1ec4a140dc89ce0050647f1c19f5897c77b9059040b4b5b4282e0669cb4c658f48f67338413c92fc7412e444bc635dabc93c51b030784f21461dca210cc6a54fdc25bba09705baa77c1826636b16644a5ada51270d8317a787abf53192d40dc765bfb45c7dcae58481af3a49fe762b90bac1f6f69a5de8045981c67906b9f692625fcb6a4df2641688aba61fa49a84b47c96661e4701e5826c1108069c4b9c6e480251c4b021d11cfdaca12bbf9c09a0234186668e389454ac4046f5b2468aa2fa9b117868574e729574ee57ea7495af310627b85916d6b4c708374f9fb0c9c3aa4664c6651281d8eeb98132c1af13a816ca5b869f50b50b291efd466dea090918630c6fc77247c458aa82568a41dd9d4708af3bbca5a5716447e8c2c24ad788a8632473fdc4a257196bd2b549091176fe654d3694e10a118f7b66d1cd5af199b6e90b3bffa88a92e36717fd4bbfcc78b0e08634bc080c86885c92c8ef67aa4933c7df097891369bac5fc5d0c36737aa60971310adf02c257f76a7a7b3f7e132c2a71c52ff4affb6846391c0868241a3df13408d419a78bcffd49619b03a192c683900a244289c9f7b4564823900ceacffd9a9371260d5e57a8271196f4759eead0ceac318966e76f68de95ab9db2ba4fbf83c3b27092cd339cfe48d5ca0ba11591d04566f4ed24a57b00751eb9b1253231213f8a14f06f0fe1b7a4fdb7d1cfe44c161e577e5e8f0a003271531cf27285b8721ed5cb46853043b346a66cba6cf765f1b0eaa40bf672 + +# Official test vector 2, seed: "64335bf29e5de62842c941766ba129b0643b5e7121ca26cfc190ec7dc3543830557fdd5c03cf123a456d48efea43c868" +seed: 4b622de1350119c45a9f2e2ef3dc5df50a759d138cdfbd64c81cc7cc2f513345e82fcc97ca60ccb27bf6938c975658aeb8b4d37cffbde25d97e561f36c219ade +public_key: c02b820292c46c8a8a92975a2e27292cf893a7f54a84a67022845d66236dca3c4844604b16879e849c7fe3475d03f82323d822ae2cb6763842a319114f5c77754613d5fbaec05aa801a03ac1989a725337ea38a668ea65cdb36343ec3d690ccdfa47ab1fe473247bc488d98e1e33175920a0f2272a03982c8386485bc2c4245884f1d941750a1d27fa85f0067f5c377532304261aa908bfb950894cecc1bbfd197ced78a641366b9199a4ba190446e03ae51549be7959c87a629abf24cbb7a58d01cad4949734f797ae300a78f45c70f668506977d7c85a0cf64c700a5b1f7879801bc3ac75584302c8bc81c0d7f6b237a9400681bacfc7192f9c653f8a9551f796ccfc262d3a438a551ad74c80ae9e3b5a7f12c5204ad44c21f488b7824a4b1eed79da9b44e60d8b225490c062b924da04f0ef0252304cca34bb4fc70ce6b1800fb6c5dc771bf7bda9e9db2b6c6046a1672c6f6f01a0406b903411c271b20e139a69138adfbf50c1134ae0899c166b1b1a5d818515b0dd94895a253059b167630f3a0dd3c64cf257cdf93596e54288c7a4580404ba8da541abb1b6aec7e530c58a61a64d9b9bc32d870bc105ef7063b9a97519b871a60d7aaf8c193e948c267c9c815063d6a603ee8d2249b386d94395804a9af8cd2184800c7ccfbaed98c4f9f95b70145b448387183f5cc8f4b5f35a949bc74706bd03db7645c2d084624844a55a0a5abb9244cb5b8736b835b512bcd912361fb660479b2c51b99734970808ba5c6db0169756cfc986dbda94915563c15a109aeb77c01a7cff55c8430696d6e83aea5d49292462d725c428b984d15e97ed4a76403094699e1336426b54281067e675788b3a4fcebca4431bfdc8a49c215ba11004a341516018419abeab2374184b0e2b7b7a54efc678e812588960a0d009418e5289eddcac582d3c73dd93e1234518da003648853c5b5a24b389e88300aeae78c41e62e5ee303a56b548375757cd42e21a7c59ff29a133868d1d0784197573464292547161b3a8689dc0c7de11139d407f0b5784d942278d49462965f21f72cb992add160620f6a82f70aa9a830190ce3c9fa8015071c2877483c2203bab7228ee2f37bbb17c1a4bc499ec249ffbb42e4989905a878dc873e456a7d9db946572936d8d81777d1b992c00db12a35df1348ce8c9d1a02898c7403d4107f45a6bee864375b623d30e0c191f8ad835a3f3709362cc763d63c2b91649d722825402c9ec1b1c7aa02b154d69e39da196e72a25928212fe0711bbb2fd2f9550a361a28d4295bf0c036d7b79be9130232060206c919f8b864f03d6f02348ed2c8001a30124b40c6d61dc3e18bcb27c60bd1324d8386da99c3e098cfb94b018031a4d6aa5788d27a75a67b630327add804adc21642d58080956a03f03c8193ac302c92e949cea31721813390382c814b2c5a6d34a1eb44b8b62aa77bf88b5067455fc0c7be967c21bc281ad38ea6978d228a83a820c57b4039175c910a450e300101cae45b0736a4dcbb0e6eb58491da31de3b65cba0a7c80c7815f677eea7ce5ec571bbf7c4516c65e4b2528e160959c815e1bbcad0a29ce59573d749453d9b6b52a951de9b889c79cb355c345631070b7c30f1934123c9ec68ebb324d254e5d246b14a0259e49b2ccec72b8c494834 +private_key: c22702a2a8b54046661fe48e8c686eac807794eb4a67454d68a12825c99c73b3620f1482eba71c724cb8edda16d05a2d630a4b7d967d33f42b352a07538a8ccfeb481776baf74073fee48709f01229d087b9f16d36e907ab792be2b86baca7c58bf31b63aa556613168140ad1cb45a70f3ad8f88ac7f6b42179b62707ba00fe0776ff45f575436ad70bdab0769e05587314ba7f1802b2ce6536152a5076a991eccb79a908351f62e38c75bc3db7b8702a104155b87129b2b3a6d3a157fba573c1b96b2b8ebc5327267aa47847259bf46f54c315b26748a6f49eb3721e772032b6f0dd48a44755eeea543624cb62c6965840caf314c81a7d49c1a2ab46d047ba45244b8b292f72252844335db158496302e1554086b4a2df68a1af1737f743b0bc4e07be5fa2edcdc4ba03cb61101327fdb6e99a2b1de800462431a5e45870f5bb61e058b21ea5a4f86404f99459b4c8cc5d91ae4e630ff1c380b3919c2f22f06f633fc062451b462130117e5f20cafc2760c434e404944fcc03d64d5aa8ad11eb2f727dc71917e6200f61b53ac7497eb198a417753482c3fe988c53883372d08ac11c5ae57a24b787a995f6acf6e359bc7121032e4bda65c618963b84785a86da1236289bb2a6b6716f2054dd43c77020d8686b47ca1b7ec2ab36c07141fb86937141f45d92219c25ed9c13d14c7ad682640a5f88b5574a283aa3709f26d9aa739f55c776526321942cc8115a69e790ae357765c7a05ab35266dec2de96acf5d126ca86763e18999e9513f5b5809130b7e2616392a3514638b39442a6e98c44a35005fa4a6b1488c9f181c4747a935626895f3c623ddb44e1d581a11465ffac0a0a1f2a5f881456654490a1b1bf1e4485a94841519babccc2ab594b1c2532fc92982db3994161b15194c265b679fbb768970f885f04ac06f62692c9576c81b8979f221e545b150c9a57f232dfbfa7d9ebc91f5aca92a3cc39ae922f1257f1973979b46ad1c967baa7002c36080a926467f277ac234c31c716ccb954b617694e7d228164a1be2e13b7b855534fb50b88c937a191ce493ceb19561d59b1f198b81c78371a58c5ca4f38bc6981faf61a9b60941978569162004abfb82ab729d4358c207a915d55458c13250ba813a8a5396cfab1157b4a266033050d31c1b74afc55c645bf256f00392b432a99092a30ecc456bba202bca14e5c741830c931ec377fc163b5f16b81b3897fecb961c6a0d8d97461cfaa8f4c48069648e8b48864dd9923b9b1bdd44290aa66290c151024285c3732a2b717c55072d2168ae92f001a1c44b54dc24a0145781923138875d8f4a0c76e2a79fab7d10a141c57ca9c8434c8ca18e9d0271ae62a391f28c53361c759914852859f1970caa124a1ffb3797723429874f3088197af94a9557cb66fb76fa84bbf5bc87552605ff00c67ef53c5e5c68c5800057f6a36b391386743bde6b4800b4aa1c1984eac8a728a729ad60a6321a22d6a9b27b56bbc7c65f7ae34304827e833aaa867766079074c8e020c32b87fc6564e5e4953df85b24991aff87b052847fe6371efb03a326a96514dc6ac8f42106f59df9b10d668111a1a9b08c7bacf2a42243504ccb9abd737593aab617c02b820292c46c8a8a92975a2e27292cf893a7f54a84a67022845d66236dca3c4844604b16879e849c7fe3475d03f82323d822ae2cb6763842a319114f5c77754613d5fbaec05aa801a03ac1989a725337ea38a668ea65cdb36343ec3d690ccdfa47ab1fe473247bc488d98e1e33175920a0f2272a03982c8386485bc2c4245884f1d941750a1d27fa85f0067f5c377532304261aa908bfb950894cecc1bbfd197ced78a641366b9199a4ba190446e03ae51549be7959c87a629abf24cbb7a58d01cad4949734f797ae300a78f45c70f668506977d7c85a0cf64c700a5b1f7879801bc3ac75584302c8bc81c0d7f6b237a9400681bacfc7192f9c653f8a9551f796ccfc262d3a438a551ad74c80ae9e3b5a7f12c5204ad44c21f488b7824a4b1eed79da9b44e60d8b225490c062b924da04f0ef0252304cca34bb4fc70ce6b1800fb6c5dc771bf7bda9e9db2b6c6046a1672c6f6f01a0406b903411c271b20e139a69138adfbf50c1134ae0899c166b1b1a5d818515b0dd94895a253059b167630f3a0dd3c64cf257cdf93596e54288c7a4580404ba8da541abb1b6aec7e530c58a61a64d9b9bc32d870bc105ef7063b9a97519b871a60d7aaf8c193e948c267c9c815063d6a603ee8d2249b386d94395804a9af8cd2184800c7ccfbaed98c4f9f95b70145b448387183f5cc8f4b5f35a949bc74706bd03db7645c2d084624844a55a0a5abb9244cb5b8736b835b512bcd912361fb660479b2c51b99734970808ba5c6db0169756cfc986dbda94915563c15a109aeb77c01a7cff55c8430696d6e83aea5d49292462d725c428b984d15e97ed4a76403094699e1336426b54281067e675788b3a4fcebca4431bfdc8a49c215ba11004a341516018419abeab2374184b0e2b7b7a54efc678e812588960a0d009418e5289eddcac582d3c73dd93e1234518da003648853c5b5a24b389e88300aeae78c41e62e5ee303a56b548375757cd42e21a7c59ff29a133868d1d0784197573464292547161b3a8689dc0c7de11139d407f0b5784d942278d49462965f21f72cb992add160620f6a82f70aa9a830190ce3c9fa8015071c2877483c2203bab7228ee2f37bbb17c1a4bc499ec249ffbb42e4989905a878dc873e456a7d9db946572936d8d81777d1b992c00db12a35df1348ce8c9d1a02898c7403d4107f45a6bee864375b623d30e0c191f8ad835a3f3709362cc763d63c2b91649d722825402c9ec1b1c7aa02b154d69e39da196e72a25928212fe0711bbb2fd2f9550a361a28d4295bf0c036d7b79be9130232060206c919f8b864f03d6f02348ed2c8001a30124b40c6d61dc3e18bcb27c60bd1324d8386da99c3e098cfb94b018031a4d6aa5788d27a75a67b630327add804adc21642d58080956a03f03c8193ac302c92e949cea31721813390382c814b2c5a6d34a1eb44b8b62aa77bf88b5067455fc0c7be967c21bc281ad38ea6978d228a83a820c57b4039175c910a450e300101cae45b0736a4dcbb0e6eb58491da31de3b65cba0a7c80c7815f677eea7ce5ec571bbf7c4516c65e4b2528e160959c815e1bbcad0a29ce59573d749453d9b6b52a951de9b889c79cb355c345631070b7c30f1934123c9ec68ebb324d254e5d246b14a0259e49b2ccec72b8c4948349bda55b63cffa9bf953993918b18cd6595ea6433b479e89b5cd3c9339e4468cbe82fcc97ca60ccb27bf6938c975658aeb8b4d37cffbde25d97e561f36c219ade + +# Official test vector 3, seed: "225d5ce2ceac61930a07503fb59f7c2f936a3e075481da3ca299a80f8c5df9223a073e7b90e02ebf98ca2227eba38c1a" +seed: 050d58f9f757edc1e8180e3808b806f5bbb3586db3470b069826d1bb9a4efc2cde950541fd53a8a47aaa8cdfe80d928262a5ef7f8129ec3ef92f78d7cc32ef60 +public_key: 25c1215d624156828088b63da622afa9fc5476b3603474b24d8394b93ab494ea3eb0f33ff5d91a33d34a2f666235ea009e35544cf135eff54e3575afe2fb15b6b59a4db843c25139ed345fa170003fda60b240065f761570471c4914aefb01c38fe36b3c7b80f77887a03b74bafb64d3b922701a86b027651fdbc777bc4d90d387fc15b8c12443af8636e35224c0430520bc984d71c56df26e84b683c1dba081b0a584b5793e725775482ec45b1db7c84949644d405579659cc31db130bd190d2247210c043bc8f227450ac206c13e8baa896e471f7cab2bdab29220c051ba354dc404767e812765c66ec19acba3b993caa2c0bc2367dd50846bb40d6587b51a76277f6865a5c69d885553ddfc200e970b9c0666c1854efc932af57a1f3bc0a805024efcf978f77b1dd739604b8a87b44b522ea80e87ca2cba7220e62c441a429d19b76425d51cd1e61e2a2950922637a1ab84fbf645a1f6413c288b731945d4029958d56db90aa01b712c83b73aa88581522757d505b83e61ae06eb6f5270021c61b7dabcb0229878d85c8f352a9a4349bdecb2ab0c2ab4039940a887b665f8b9dd10992b3b0493db6074fa85e1382a970953ebf113d4835e9f031d390836732b3ea6a89145183f72dbb095d7617a3abdc28912972035f1cc30aed3101d91c9eb397680c8ae222aa61e515a9396cefcc75c0cc255535a3f41212141c12558881e23798e1748bbb5464adfb167a2c44388044754a87a5ad1ce752c38b504bc443a24ff73a6cea4768e22681554b56dd59da1c7b88db126b7ec640c1bcae8a20b5f864ea6385dbba1c4ddd31775ca9f72ec6f137570fa9356de55c5c2ec92048a0cd9680837f98763fb35d1431805a7420d2bb803cc37bdc90fa921bd4d18b4f33419cf03ad0e2360d92192d7d87df71bae83d2b538741914892c0d778cfdf429be268a22f4043c29b62ff74fa770156d93127c3a7fe2c6c6c65470d1931f85a3af1a963bd919ca3c437b43d368e6e7a199407258b8bde88b4742192673499ac440b247d97225e7554482c6aa6567486074f15b19588c6d9de4619d4c493bf73f2bdbc05343a581e95197b64dcd8826442565bf629d5ce4045218bb908701a5e53b2d0679720598fa1b08f286b60e5c377ca7afafb206ed4712d6d16a47b99360426619f97db0059a15592353577765a8368d93928802704836c2279205446bbf7a2465042816d7907f143635b1434680156523b02cf1d8565ca5c7ceaa126a2753dc299c10e4968a4729991a0f5ce31c595629301c135b5810a712910a84ce1f2164c3aba248cb89c591ca0d24a7681c0a140672bf01c7f5c967f3e41b9a925af6ea75408a24684b725b446a30d0199f67af94b958c4b979c2a841b28878b5dc5154b79c944c7156538e6a130379674bba5438d64775fe1a87d3aca677541bf82c27c6d18f3bb182bc7494dc91b23c35392f21ac49e69e3c70454bdb16b2394d00a549734a1aa4790b01508be670841e09042e5a1a4a73c3b830ac5a35b826f36411639e20576a89197426005c08380c13a4a464892bc6992e236771e7b135aee096e9f65738c531b8e63c3f4a922a79222cf8b8309a04c3c7464a69982a072fb895714eb8f4e6d0a4c447ac97280a7a7b63bd585c521a49bf9230588ddd7034 +private_key: edda9b4fa2880d5778280a51a25a02b4d08f44f83afcc7ccc3692af517738bf8aafaf53eb33004364aabc42bb0a640b12266bc6eac91d124867192c485209660d625c33aae9f38535903cdb178bc2ae557e71acee8208169d80c74044490b3ce4c06b2b68b44b2c0b47d3c9178344f7a7a30da49548656b011b74b5bd1b23a1b39f9f37dcbc91c697799748007f80b3d55f6cb81b926311636ff11cfbbaa31bb02689e9b3b983213c2b3cd8d4395bbd46dbd25b345ca920f9b3545f13d4b809daa02608b4c5a1e041a98b3320b91802544aaa98a4916c7c49da792f6a04a4d64afa1294a8e71abd47c4d96d9203c7610a10b762e91b386471c8eec6ef94259b8440c369153ab6b9d6b52994271a865e20ed1136435ca490264a541207707881ebf74be6259b913b38a2c54be4ea88de1dbb3eb59b91497a13304c54a23a3a1810674610255350967a612b55bc82a22aed447b09bbc6f92fb9427a4baa183406ee6ca14e35808e33bd339a9c428213aabc6ecf473c38b62aa7c6cc8b30f9a559565d413c8f504cc000fafc4420177c054ec19c9360c2e04504b8b7e7bd86b820b1996a815337043f65975401c76a863a2803b0c80a6062e827daa973efca23502faca371cae8b42c4518b52070b91ed07a5be9c9dd304386592988fb1162449ac12589115e7c14776977bb34aff985c95f40265c20b4cd6216702c9ad91345cf120ce0c2961872bb6e42547412bd226ab8fba97b8e074eb0746d61140e07a51176227c9559c4bea306be88e2b84515c528af3ba34cc71c06e7cac19b998b23c549dfa2e253a33ad23b905e1c55f96054c3c4d0ee68f4b447404b8a752f4a9cb6acc624a7985141055733f47d4220ef164f6c7b6573bbda39365890c0c0318827a701ac4670878fa11ff24b3c57b56abf09ed2ac5ba554a8dd184fd09695cb2c798ad23b86f0690d6840c77c53f98491845c0c335b601b26582d9758a244603035139c98b9a723872d16694a4b5165a22fc281142251855998cd6eacad79b8987f143b5a7a69feda51d66b1c0e453dafa5209a225c1298a8f922cecb2c6ebc63c762f285ff667469d1371cc5ac957a495b55834c3b3a4ee9bf2a85c5b7062742a940a686bf0149542b6a350fd2144a849d6d71ccbf7336fa06aa4f7aae89e586c4d093145b8265699f5ef000eedc0cedc96e3256072dda4fe71789ef1c4734e3205ae617aed6a8848083fef84c61128c00645e6b4319b950ae0322ad845a58bc4564d2bbcb9e08858aaaa8f547070ea54412eb5b608cb7883472d10abf2ce4143e461c1de11b5178cdd8924d93666ab8f44cecb954ac431ab89208d812cc29073e2de706953c2028fb236c731dd838af9d310c1538238743bb71fc3546a08fe4e35e965903f2fb7e1a9a2201f6a86f38b21f22906d659f4bb8a226ecb8a107b217ea41e542075d01cba7caaf1c97c014a97ab49666e0015eeac597717b1e1e8773838958dfd1796fe1a7b62583f575b1c0e676a916799bfacec28ba707974131f36bb2292ce4e99cc2046b689624e069ae46db94fd66a5ca083851940ba26341bb891fdc860d53741f084b2d9e846ec2bb5eabaa69a8d96a8975a1d6f33835a53225c1215d624156828088b63da622afa9fc5476b3603474b24d8394b93ab494ea3eb0f33ff5d91a33d34a2f666235ea009e35544cf135eff54e3575afe2fb15b6b59a4db843c25139ed345fa170003fda60b240065f761570471c4914aefb01c38fe36b3c7b80f77887a03b74bafb64d3b922701a86b027651fdbc777bc4d90d387fc15b8c12443af8636e35224c0430520bc984d71c56df26e84b683c1dba081b0a584b5793e725775482ec45b1db7c84949644d405579659cc31db130bd190d2247210c043bc8f227450ac206c13e8baa896e471f7cab2bdab29220c051ba354dc404767e812765c66ec19acba3b993caa2c0bc2367dd50846bb40d6587b51a76277f6865a5c69d885553ddfc200e970b9c0666c1854efc932af57a1f3bc0a805024efcf978f77b1dd739604b8a87b44b522ea80e87ca2cba7220e62c441a429d19b76425d51cd1e61e2a2950922637a1ab84fbf645a1f6413c288b731945d4029958d56db90aa01b712c83b73aa88581522757d505b83e61ae06eb6f5270021c61b7dabcb0229878d85c8f352a9a4349bdecb2ab0c2ab4039940a887b665f8b9dd10992b3b0493db6074fa85e1382a970953ebf113d4835e9f031d390836732b3ea6a89145183f72dbb095d7617a3abdc28912972035f1cc30aed3101d91c9eb397680c8ae222aa61e515a9396cefcc75c0cc255535a3f41212141c12558881e23798e1748bbb5464adfb167a2c44388044754a87a5ad1ce752c38b504bc443a24ff73a6cea4768e22681554b56dd59da1c7b88db126b7ec640c1bcae8a20b5f864ea6385dbba1c4ddd31775ca9f72ec6f137570fa9356de55c5c2ec92048a0cd9680837f98763fb35d1431805a7420d2bb803cc37bdc90fa921bd4d18b4f33419cf03ad0e2360d92192d7d87df71bae83d2b538741914892c0d778cfdf429be268a22f4043c29b62ff74fa770156d93127c3a7fe2c6c6c65470d1931f85a3af1a963bd919ca3c437b43d368e6e7a199407258b8bde88b4742192673499ac440b247d97225e7554482c6aa6567486074f15b19588c6d9de4619d4c493bf73f2bdbc05343a581e95197b64dcd8826442565bf629d5ce4045218bb908701a5e53b2d0679720598fa1b08f286b60e5c377ca7afafb206ed4712d6d16a47b99360426619f97db0059a15592353577765a8368d93928802704836c2279205446bbf7a2465042816d7907f143635b1434680156523b02cf1d8565ca5c7ceaa126a2753dc299c10e4968a4729991a0f5ce31c595629301c135b5810a712910a84ce1f2164c3aba248cb89c591ca0d24a7681c0a140672bf01c7f5c967f3e41b9a925af6ea75408a24684b725b446a30d0199f67af94b958c4b979c2a841b28878b5dc5154b79c944c7156538e6a130379674bba5438d64775fe1a87d3aca677541bf82c27c6d18f3bb182bc7494dc91b23c35392f21ac49e69e3c70454bdb16b2394d00a549734a1aa4790b01508be670841e09042e5a1a4a73c3b830ac5a35b826f36411639e20576a89197426005c08380c13a4a464892bc6992e236771e7b135aee096e9f65738c531b8e63c3f4a922a79222cf8b8309a04c3c7464a69982a072fb895714eb8f4e6d0a4c447ac97280a7a7b63bd585c521a49bf9230588ddd7034647a81f0f1b3e3dacb6e73e900f7c078cdfaa7119a5ede48c7685fdb7e0fe2f5de950541fd53a8a47aaa8cdfe80d928262a5ef7f8129ec3ef92f78d7cc32ef60 + +# Official test vector 4, seed: "edc76e7c1523e3862552133fea4d2ab05c69fb54a9354f0846456a2a407e071df4650ec0e0a5666a52cd09462dbc51f9" +seed: 66b79b844e0c2adad694e0478661ac46fe6b6001f6a71ff8e2f034b1fd8833d3be2d3c64d38269a1ee8660b9a2beaeb9f5ac022e8f0a357feebfd13b06813854 +public_key: 711cb96f0cbb88a8c1c298c7837b2f2c3525f2313ee5cba7f6dc77413cb58ed86f75d26b39729561c28b795073c1994f69256eb0ba9c934146c4421419475d005150897a17d310bc52f43d50e8ca5706a774d5079719754c6336d1142d2387bdc1732c03e2a3a04a9dde91c46612b54ca6ab15921bc20ab4f2d21910629ff4e37516870d60ab8bab08ce45dc89ca6712f17869e645b702141ef5d64f67f62156ea90ef1c502024858e91c89de92056f3675c1a6eb2191e17300845cc3f7b52cf93c566ffa732c362a8e89c5b6f4a5a827b6259d26a31932e3141486ecc746027776a852faaf0c3c436c690e3664ffaca01582022a99130bcc402bb7234a14db7baaddf7981d6557dfc44788c7506be021359e1917837a3c3d5a598757e00f77b6b785436b6840a16151939774a10a7cb8089fda55e6ae49f30512d691716f29c8a9fa94a8a113632a20c71138851ea6ab3f84e6e18b8531119e36cbbc6d0229a491f6b3b7e20866dda8ccf802abf47a769676550e2fc52ce438c48946eeb22756734bd4572c501dcc311b26fbc9c8ed2100a68e44435520848590375b59687c94a685b6490e236193c722b7b4acb84ce9a69388d13a984f696b85122c3dc0a5c38c2992ba60a280c9c6783855093a9b886953194eea273225c1a3e10b9db18c548c05c392631dc47320f411a618c943b7a201c784885b62f7c56a6b698abf1c76a039b3e6f95c466dbc31b4173778a9d5770b68b8a8195e886e8191e043b909723209553bb942a96ec4cbda1382d02f71a6c009bdac062c791c12f68a1f0506478d1869b782bc8b0181de6ac62bc8dc844aad6403a2b907f2d1a992bc44313f711fee1bc70d326e7199fe411354db2c4ab2526d09227bcb42cce2650e341368fb493d6754715736f8151019df22b07e5b5bccb3d0d161ffbeb2e93731600c85b6ccc226c790ed5e7384e8c3555497c07ec074f2253713b1ef6927ce4c1a80da11cb609c826718a5474230d62a40b0824675c95d0cb05b7c77b1dc4aa2872b8083bb79e201a0c847061e18be1d2ab68b2bd55d24925db5f4479bc12dcbc834b0254b891bf373cf5c4971bb0811182527c72c2ee6479217c70214106b416bdf0d818acecb63fa6af4d7031bb50312023acf66986c71a25cd8a88d767844c312dd5198b965c3df3e244ffd64610eb0cb3431f98889e72e864590191692b8857675afd45b6cc31374888b40183720e1985d811098738b63a823bc7716f9ce94ec70738d7f5228199bb78b811ea912500c71e1cd93c955c0049519ffa8b523a7861b6b2a3dce97d82449b00b8961877488b50542221ba79aaa0d33b3a47025acbe47998952b08e27ac2fbce08d6bdac7b6990297504194bc0304871472cf3cb952d439646aa86c47986d160afd7f401c70bb200e6182f91872812c551e17ea8438ae4236cdd743159802b034443e8d7ba0a249b312ac91981927440cb0bdc8e4615974bd2450161614068206bdac3c2e69eea0912f8a4ca1af21ac4c033a6076e6d13039c97ca930599aa12b93d58c09d663de14158b72ba0803a1b7917b71284802340422310babf6572aec23ae33a54a1f9c65dcb70821393b95178ba5acbc0756dd8a02f8afd156dc73958bab2f2c0d24c2436f9f00b7267da9f8b2678c14626ec +private_key: 9aa91962f6556d921b81c4946aaa26b62ac53197a49e1701eff367d7ab00b27677ced51b9619541ec8a180db9a7ed7342c31000063578851bbe9095816cc689b701a0cf7acccc64abb1355807703a6a759a2d89ec01c9b8196573576c06395335bb39903187233a3c89811447e8346dc70ae390544145abb14004e6e132a43e59364b249b3cbc13084c9a3487bafd0bb66d9414f607e6cb33b35d990ddf40d87135c3abc43a5b431b72ac9981b753a4b17ea48c3ffab5917b387657bc537162631e76ef6eb68c670caeabcc613b439a1f265d1229f8226c1a76447b535a81bb311b58b1236324c20762affe367155678ab01bae2b3bbbe3519ccc6840cf305e432b5c92966f45809dde31b7c30c2ccd77aaaa236ecda9260c361e71c7292e10151d165bf6c9cc709a49182807543651a844fee7703876921af5537365c50f4ca07b2895725505db00c6a3d240089f51c7dab07dde7a49217a90bb46462b4957ab22197844335b620e0226d1df94ffb5983bbe8aa3197ceb6180ead6561bcd7914841af1b954dacb4c5ffa694a1a45064e2c3b0bac1d265abbcf2ba35b8b3b0f660d83680be5c12dd2437a46a3367d6bd94d40fdae51ce2ac800a0881b3b3a12995bad39a2ee4ca5e07446943f19aa5dacc7b8c9042950ab5ea60a4e54de2e8378589722bf711a1c92113471259b2070041287e51742ac79902e4ccea25712943285fe5896427c8eef2313277b91ae9cb55ac2edc49b2d194a325f6836d29812660209802c457266ce3688de79a40d5b6a4c2b606b56c0b2e13b262990cf23987e138742eda24c0cb551aab1024eb095e929be557b17326b2daab78c981bd26a393a175385acbabb1a87983c271175cada26b2495705142e0c4fee912d1e19d97f2ceeb1653b70c9003165d7d5a4a6e916bf0298dffd94523762790f0108610c1bff81a59ec4cc890a716a29f4ad24d75d53360c423d0c921e66b59d96347112c918ff680ed460c8d590db11992cf86caf3ea3baec9370456c6c354859c040fd1c126f736c92e50860694b29dea4c1bf31061ca259e83035c01a27ec57eca8aca80c6c932261e1f44b6af8a0c571a833a826d2c8b749832566230cac47644eedc9b288640e32b4dd75282764c152b87648f7baeba3a73c31c7e2984973e74a6a7236b3c364bdaf2a5fe64b4da0b49437102a550ce04f220ad907e8853028a370d0b501d6fa849858339f63b8beff42fb5986135090bce450455b561f5d2c1d0a846dae4b2fea86507aa38c2257eca186ca21b87364643ccb668f7d880c164c398f9c46bf75a9a7c975e463bcc0b9b26c4291839c43136614f9c9133793fed561adc63992bf968d4c373b8531e6af04d58476b33585c1e9ba49539043e726340c4cce9223519227cd66b5f3d05702b9600a2694d5b23c4042b603018cf25fcbe4cb86422420cec820ceb589b42791c010cc4aa306fdb55452a49c66071c81aa3bac6f014be88602a6b4c49db2a7a9a57e6c97bae7bc483f5a54be7970300bd2445758027311e4949ce43859426b23999a0568a55b2304a838546d3f4b6cf8303798837b229b3b1aa3b3ea60bf3a9aa5c8b79f5293556a45010b5a571dc246ed749711cb96f0cbb88a8c1c298c7837b2f2c3525f2313ee5cba7f6dc77413cb58ed86f75d26b39729561c28b795073c1994f69256eb0ba9c934146c4421419475d005150897a17d310bc52f43d50e8ca5706a774d5079719754c6336d1142d2387bdc1732c03e2a3a04a9dde91c46612b54ca6ab15921bc20ab4f2d21910629ff4e37516870d60ab8bab08ce45dc89ca6712f17869e645b702141ef5d64f67f62156ea90ef1c502024858e91c89de92056f3675c1a6eb2191e17300845cc3f7b52cf93c566ffa732c362a8e89c5b6f4a5a827b6259d26a31932e3141486ecc746027776a852faaf0c3c436c690e3664ffaca01582022a99130bcc402bb7234a14db7baaddf7981d6557dfc44788c7506be021359e1917837a3c3d5a598757e00f77b6b785436b6840a16151939774a10a7cb8089fda55e6ae49f30512d691716f29c8a9fa94a8a113632a20c71138851ea6ab3f84e6e18b8531119e36cbbc6d0229a491f6b3b7e20866dda8ccf802abf47a769676550e2fc52ce438c48946eeb22756734bd4572c501dcc311b26fbc9c8ed2100a68e44435520848590375b59687c94a685b6490e236193c722b7b4acb84ce9a69388d13a984f696b85122c3dc0a5c38c2992ba60a280c9c6783855093a9b886953194eea273225c1a3e10b9db18c548c05c392631dc47320f411a618c943b7a201c784885b62f7c56a6b698abf1c76a039b3e6f95c466dbc31b4173778a9d5770b68b8a8195e886e8191e043b909723209553bb942a96ec4cbda1382d02f71a6c009bdac062c791c12f68a1f0506478d1869b782bc8b0181de6ac62bc8dc844aad6403a2b907f2d1a992bc44313f711fee1bc70d326e7199fe411354db2c4ab2526d09227bcb42cce2650e341368fb493d6754715736f8151019df22b07e5b5bccb3d0d161ffbeb2e93731600c85b6ccc226c790ed5e7384e8c3555497c07ec074f2253713b1ef6927ce4c1a80da11cb609c826718a5474230d62a40b0824675c95d0cb05b7c77b1dc4aa2872b8083bb79e201a0c847061e18be1d2ab68b2bd55d24925db5f4479bc12dcbc834b0254b891bf373cf5c4971bb0811182527c72c2ee6479217c70214106b416bdf0d818acecb63fa6af4d7031bb50312023acf66986c71a25cd8a88d767844c312dd5198b965c3df3e244ffd64610eb0cb3431f98889e72e864590191692b8857675afd45b6cc31374888b40183720e1985d811098738b63a823bc7716f9ce94ec70738d7f5228199bb78b811ea912500c71e1cd93c955c0049519ffa8b523a7861b6b2a3dce97d82449b00b8961877488b50542221ba79aaa0d33b3a47025acbe47998952b08e27ac2fbce08d6bdac7b6990297504194bc0304871472cf3cb952d439646aa86c47986d160afd7f401c70bb200e6182f91872812c551e17ea8438ae4236cdd743159802b034443e8d7ba0a249b312ac91981927440cb0bdc8e4615974bd2450161614068206bdac3c2e69eea0912f8a4ca1af21ac4c033a6076e6d13039c97ca930599aa12b93d58c09d663de14158b72ba0803a1b7917b71284802340422310babf6572aec23ae33a54a1f9c65dcb70821393b95178ba5acbc0756dd8a02f8afd156dc73958bab2f2c0d24c2436f9f00b7267da9f8b2678c14626ec811aea11a24a4b09e428415f82ee836e930c3b77867aafc5e6728149e3f2bd1bbe2d3c64d38269a1ee8660b9a2beaeb9f5ac022e8f0a357feebfd13b06813854 + +# Official test vector 5, seed: "aa93649193c2c5985acf8f9e6ac50c36ae16a2526d7c684f7a3bb4abcd7b6ff790e82badce89bc7380d66251f97aaaaa" +seed: 7ec408f52c9aa723d0c41d9987682a5f4ce6c9da7cd0215af60bbaf5484ab353a08ccf451b049fd51d7a9ad77ae14a81569df8c9bd3a8f1ebea86fdcfb823082 +public_key: 317771b7e77466880e15c76a39356cb459b78e6821e69b2f0f817b236a04a7cb834a743f830934043856e0dcc376730b3afca17aab6ae2c59ebbd57f52d84cb107b6c5e536edc31e57c3cd404a618700aa1dd87e43d92d4e601ca8d998c927451e9205429c643b251e8307553fc755dcc06d9003c35c310780b31ecdb05764e3c479913063978143fb9a462b011446394a287888a61f4f57b6c0548718faacecfa6571381ce25c2d10c27386cc255086419275a3ca59bfcbec4c63e5b487c41661520495e7b54b9641a1e16dddba5794a42d42e86b0007444cba4db161c6547c69a9cc18b2923b2a388710578043b77513173f6eb0190854bd6cd2612d1048e79435eb17680e99bb932c232b1ac298591d98a881696b3a46e117bc4a50565ba52e4704eb1c23c057894878434c61789ee8a594f94ac55748e2b111170c391b6b8403099928a2c60a42383ce5cea5880701aa5b60e4c789c759c12703d946416ed316e48c62603920e2f640a347a2f305602f4138aa82b78cd08fa071ba1b9711a333a3d22244dad09aac8058592b1edf9193291c8854b18003c6cfea4a8728e7ab378905e3d04349fa5e4ed9baa17b41b0a7189ab5cd0e352f174a51f3518badfa7df523bfcb64c43fac3bc5b6532bf4ca91e245e1e61a815c865bc7cf3cf87891eb1234a49b624c0e1169c400cac05359b6a15c9f3201b21f02c3ff0a4b94980757688ae0c48d0ac5c3fb650ddc38a8167c87c51cabd1698f8e3654380cbc8819599699615ef5495efba00a7a2c805c1d49552183b37bdb782f652682e02b7e26893fd97b8a7025affc7062e99557751a6a1da7828d7a003d0c62c8d006fac92589594fd729c17f38c5c83bacfe5bb8add8c1749a7550765f872c22e3e8be9db4c50a915fec511c31900890192861366d9177612d731f1912ccef5534248408c31605ed8960a612234cc23c94275a0b77302f0b82b4d121bae15539c3111b9a21031314076199849302f4274fc54b284d95903cb543902aaa5cd39d034304ee86814c6119f7fbc17d35c68b151e9048434973ae06030cff855291c71d58740ea00254ed926ab8835234490bad7b51eab118accb66f4a6a172c9a26717376e678771b44d9d452dc93988b9c9b5af98907b17487bca1397b8547ac8382f8a28a78a91b1b105f107200e839218a74d16000e90334ffc8709976b7fcdd4b742dc6bd2667ba6ac24dc510314f6b98dd711bd7a7169798874225627f2c7aad1bf37e97a4771542e8c7898fa0d8bf4c0fd91bf598580df6c0ce231a96368c8b8435f5507429006883fa88ee4e5791c2685f61c9247e72378478492ec90778c5fb8aa4a70e6cd48890bafeb05798c13795c58b62b5ba8f7c522e78365089ae735a796825d9ea8c572a6544aea86b2e08ea9748cf6b5717103a6d1c02f5d87a5e1aa94beda8691d454de0b547e951afe05061399804bfb32eb7b0857b8851810ba48e92518ba798dd54135a74419217a687620a0c665a050318e3672cd616f6d41618005cba6ea47faec63daba709acc2489417fea39b74ca2b13d4a60ab61ba89b2cdf0912757e08214b0671d8867cd2794fb30a8983b410f149ba2ca7134d00f83ccc8d1d4e2f1e83c9d8d4b95e33927f84741e362d80c3ce5833b7f2498d841f4c7e0 +private_key: 7390b68a5071de21628a6256426aadd676c604479578d418ff77b4280c2901a29085e9ad9ca81c7639bae82274ee094fa38cafaef26fb27723c8c3c2b5276e28dcbd7131a5afb0bb238249963216cd81118a881dcf9628332661e0eb07c55465403b81d31407cc5b20b2041f5455c3fe8061edc7ae33e06982999e185106322564bbf9b03e309e1fa6bd61412f15091e9c523885b6134788a19d812a4cf4372ff35a24823a020c97cb59a9f5b698471483b04410107a2c2d8824d1ba5646a89e697738ebe6926c54874dd6a55ba2b89b64b1aec95f918a65c9e92d8fcabd58e25fb7b07fd880ab48f6581b661d4ea3cfda38875c9568a2162ec367bd78c2a7f7b3776511a8ae16981838bb3fc6006fab2457f2964bfbc5ed5c67da4987ec997d5eda305b389cb9234b39e23ccb316fed518f35c757bf77b501b983130282f598039435a6b402b679b14f5c1c2c69e32b1ac9421c888b6d935911d4aab56a4b39b3a2c6b8049f8584d74110fe63a1cbd633c63051953b9d12f36c5e3885dffa5d45309dcf56bcea5739a85441dde06b9564a4d1e416459a809964c16d574a42eccb18f51ccae7b016ecca4df2365596ce27958d1227a72a4ca336c412baa26afb154809243b5a448a9fc38b39dc90d2177f142b1959fbc767146dc8d17a3857b84e987479759997ea85ada8662035a939a30412a771b3893ab5184dc94106ef0790ab7617c57c8875d842010c08c142ac0f347709684302929d1d4371cff2019adc2c9a0a34b1f4a70dbbc3b18011348c7e725345a50197739a83a86c7af54960c11c3b03093cc3a39a7e2c8fb7f84e1d452029692bc4a872946a23cfe834254845d46bcf040267a93602b74a6fa9580b134500edb9bd2aca5cf1959991c8716e28c2ecb026a398444b853408b371ae438d4459a3a6bb00fb63175005cf15125136c2b069b9560d213acd3642c3b3c26620af85850922d27fe8f8cfb7b79afe08b9459a36281379c4169b73234c7649b8a0416eee2449ef7a1adce07910673d2ec3ba18e74914110e2bb7a9343b74d5551a80dbcf61d52367f387259408bb7b87d466593cc9b872766cb7021e9c741c040b397d842a80c952c91070838833efa83f36ec134be6156dbbb63e720b07d2197a4b4719f8a7815b682813a55e369721b88ac78144b738177d7788c2970e8591ab378bb4f26998845a8238a51352d33ed9b5533797a7e3d801b63a3542b11642ecc9e3808db74700cc622762a4132d8a4ee583cac8898005760351d6b70f71b52dea75c07a7d5970875e500ac13c14f1f2625d217ef13404a493526b115c6af01540629e07795fa78195ce23809911475e9ca00cb3caa0b5bfed575a6c33bb16351c60bb5bb050218f259811bc669ce68fe4fb1d6369cb7913013a16108d8204f0e09f351156713495e7a045175876f2836a4ef381b6a426ae55370ff4c8e740015687a8828c19426060581523bb184baa9972d946af2d2c34eaea9869304b095106fd759b2040908d175f02ca0a87762af4b57daacb432ad5558a41aadd2c49222460515178740c8f552cbd99653ffb4953d3218f8efa2fd6a1bf7ac7101cf320060c537e95381623872a2607a8447a317771b7e77466880e15c76a39356cb459b78e6821e69b2f0f817b236a04a7cb834a743f830934043856e0dcc376730b3afca17aab6ae2c59ebbd57f52d84cb107b6c5e536edc31e57c3cd404a618700aa1dd87e43d92d4e601ca8d998c927451e9205429c643b251e8307553fc755dcc06d9003c35c310780b31ecdb05764e3c479913063978143fb9a462b011446394a287888a61f4f57b6c0548718faacecfa6571381ce25c2d10c27386cc255086419275a3ca59bfcbec4c63e5b487c41661520495e7b54b9641a1e16dddba5794a42d42e86b0007444cba4db161c6547c69a9cc18b2923b2a388710578043b77513173f6eb0190854bd6cd2612d1048e79435eb17680e99bb932c232b1ac298591d98a881696b3a46e117bc4a50565ba52e4704eb1c23c057894878434c61789ee8a594f94ac55748e2b111170c391b6b8403099928a2c60a42383ce5cea5880701aa5b60e4c789c759c12703d946416ed316e48c62603920e2f640a347a2f305602f4138aa82b78cd08fa071ba1b9711a333a3d22244dad09aac8058592b1edf9193291c8854b18003c6cfea4a8728e7ab378905e3d04349fa5e4ed9baa17b41b0a7189ab5cd0e352f174a51f3518badfa7df523bfcb64c43fac3bc5b6532bf4ca91e245e1e61a815c865bc7cf3cf87891eb1234a49b624c0e1169c400cac05359b6a15c9f3201b21f02c3ff0a4b94980757688ae0c48d0ac5c3fb650ddc38a8167c87c51cabd1698f8e3654380cbc8819599699615ef5495efba00a7a2c805c1d49552183b37bdb782f652682e02b7e26893fd97b8a7025affc7062e99557751a6a1da7828d7a003d0c62c8d006fac92589594fd729c17f38c5c83bacfe5bb8add8c1749a7550765f872c22e3e8be9db4c50a915fec511c31900890192861366d9177612d731f1912ccef5534248408c31605ed8960a612234cc23c94275a0b77302f0b82b4d121bae15539c3111b9a21031314076199849302f4274fc54b284d95903cb543902aaa5cd39d034304ee86814c6119f7fbc17d35c68b151e9048434973ae06030cff855291c71d58740ea00254ed926ab8835234490bad7b51eab118accb66f4a6a172c9a26717376e678771b44d9d452dc93988b9c9b5af98907b17487bca1397b8547ac8382f8a28a78a91b1b105f107200e839218a74d16000e90334ffc8709976b7fcdd4b742dc6bd2667ba6ac24dc510314f6b98dd711bd7a7169798874225627f2c7aad1bf37e97a4771542e8c7898fa0d8bf4c0fd91bf598580df6c0ce231a96368c8b8435f5507429006883fa88ee4e5791c2685f61c9247e72378478492ec90778c5fb8aa4a70e6cd48890bafeb05798c13795c58b62b5ba8f7c522e78365089ae735a796825d9ea8c572a6544aea86b2e08ea9748cf6b5717103a6d1c02f5d87a5e1aa94beda8691d454de0b547e951afe05061399804bfb32eb7b0857b8851810ba48e92518ba798dd54135a74419217a687620a0c665a050318e3672cd616f6d41618005cba6ea47faec63daba709acc2489417fea39b74ca2b13d4a60ab61ba89b2cdf0912757e08214b0671d8867cd2794fb30a8983b410f149ba2ca7134d00f83ccc8d1d4e2f1e83c9d8d4b95e33927f84741e362d80c3ce5833b7f2498d841f4c7e076c64235d8bd63438f13dcd038f286b9f4242070a5bec4d8990075008667aad3a08ccf451b049fd51d7a9ad77ae14a81569df8c9bd3a8f1ebea86fdcfb823082 + +# Official test vector 6, seed: "2e014dc7c2696b9f6d4af555cba4b931b34863ff60e2341d4fdfe472fef2fe2c33e0813fc5cafde4e30277fe522a9049" +seed: c121915bfef6abdfc177dae2f5a24218f9abda2559afc6741b08e0e61ab433eb84ef52db5eaa6df8ec3a0bc5ffa730db0dde8c5f38f266d5c680a78d264a7b96 +public_key: 611425c6bb62e8f60764db8466613486836fa07896314a6ea13a56e2f467483848c3451602e4c6ceb2cadf378d85654a63024c5e1aa3ba242136e5302881274c1316cb26004a549b19db794fac3f7c454fd8223f560636fa5acb56f0611911954131ad94ac88272b6cf4c89fa0635a7a838c38c92e1d640955453ea44ab5a6a0868cb9c071e51705e24a1cb1c4c9d8c59082757fc5cf95b17ff0064c0c47b021b244de30aeda11251fb170efb279154515b69cba0400875c78c1844503d411521ad54c651a738bc32da29ccfe992bbdd937827c6503735116ab5079dc04006fca98a66acb6519187fca7ca935c090bb8d31b6062b34513f01e157976183a1873db1c9e878a3eb37b650205ea5245fcb614887a8def4bb44b89cbd3c221e1a9b587a8c4a50633a9f386e6aa43e360649da46ab688116e01aa75943ce061b362d74ea824870a94cdf84b38d809bea8c994d2e10057b78ea6685fee45548e6bb681a32f5346ad5467558fe6c345e6258175a84edcb32b378ac3bb24e85739681234c0f1633c334df7d853c9d00dbde8a23d463289423536a44bfab94f2c76c113fcb086e5c4cf40193220c40b509065cc3ae5c861212b898699ce1c224a04a77bf165b0bb057c30d9cca16b4dc8128e7c197a4999372906cbf38386d66c27d1e36e8d504613c36d8f655d49750a72509f32f09580fa4518d9a34eb63ba76c063af7cacf158607890380c034e2429e49125c3f543c77c3066c374a43d24a7eea2608a12b845a4c42f7354699bb169bc720b175ce7c0d6e63843f543c0a84162e388fc21c313b3a5902430cab0a61d3e3aea195b13cec41e38539f41c6e22d63f5d60825d7182ecb31dc8a0a82a952b765c0eb279b75d20be877b8fb8fbc290f56efcf5240779bd2c639a67476fae730be123236ea68e4afa9d3200d0db30b7a771bb97fc1667e94cff70bd02f32d6b0b19548b61bff4a43fa5cb73ea11483b23b1394ad5812c8875002be49510656794033fb3150c7e13611126afa639355de9c04de445eb5c7430287815771a937707e88b3c8f42587f30baef55aeb7a392c14a4dc858abb9d537f8043c64100aeee6a597315bcdb65528286e0fc7ad5a59a066725cc965c562acb9d6330f28220bfb35b21cbb4321fbb556449c5e1108c46744e48c578937cc12c20df49b79ce96aea9b231892597b8a57683c495a9729bd7b969f34899116104abb00ee4049ccbc7c37ea5868ba5c2f4a3934d6599ceec340d6a488fc28d84ba371456caf9c52da9980904e253e54332505cb9322b1ce3c1904c739433d99fdb35461d4b3f949c8734904974c5cb7dd54531e86e7f9a69b8c78e137a77c0eb6b1ff468d0b2973819ca6a69b1e640af8f3b35af45183f5284425393472b3b7674503a86592947621dac8352a64427d313d51716ed6cc78bd85412d97561c910f31923361485d138b80585cf2a59a04896b3bd8c7ec2923ccd290c962c343561226a076e7e13a0d51233b68062d0e02512aa96fd701ecb80b7f45b210311246bfb594c5059f25c1167094f966c7d88da77ba3a71d186936f6007cb7cb4941c599103792edc82e3708e4aa9706da72ced51924d19ba561843c3a70f3f91b4ff04987cc4a914fc6ad33290975bc0b534d415efbe43f7d4a4b917723a +private_key: 2d8ba8d5472d324746fd3a4a9f999726cc13871a6ce75130aea07566332c05dc3b99c8626cd69917f025f6898a3112b7119c168bd86e27c6af08b292aa37745f993146dab93b159e9685cc09d750ebb58ddd2615236b298e8422db54b971192d69857d3cb1c910c948544b6270a1c5854936dfa643710b631c245e8b00c42fe15552a293b6f20278d82588bb164eb3636465cb0bf931b77c087a475dc35414c896069321080de41d58644f14143c5b75719184172eb2add8dcc059bb5dac9a22060283b5c87ca05b068405a9e2e4c7cb88941d7162667733b95a76d2e3ab9803b547047c95eb86995b1abfa050346788ef0c682405852bd9bd8f178e4adac309e8aca30ba6ab1bc5f8ca8dcc96291a616d77d31a0504229e206704db130e8b4480822833597d36db65cfd130d4796a254c360dc2799d256eae54b01a264af8020c4422aa837a61dd2c983345bc158bc878987ac4f22e49b21d21d47f32625ca0386637668517531ee2f13a5d0665c8d41ad19b3faa53793232974ec3193f2568c092595b009d40f3301f033f479192d016106be49303a1616347853b107626e49cd14c46be4660883b0b4d7725c0477887eb771e305ee2aa49beb1c00d6c42b5c33fdfa225db0640e973855d504ffa70b23c6c1869ba0dab69aa2cb75a02d9acd2f57f66c0983182a334e2796afb96ab2293751ace0f51219a994b2c5625f1ec7de1891840d0c6f0b300ad5146b5b682d5a6406455a475a799c0ca7c2d89c8bb759fccd178d278217d086dbce5a5946a0d6811518dccb37e898be658321fe262df3527fc5271e7b2b164099042900f2dd44491a72361bb0aef38106cf5ce7dba2316fca7ff2843f4f00a7ad94726f04bcb552dc8b24d6a644444ebc10cbb5dac08afceebc9dbf7910e031c8bb5038bcca34dd77fd8c7ceaaca6321715e639b5ae7573c0a0ba32668245a09aa278b86e2f2118c5bc6e9331063fac6d43c63d21728bb691233337668e7400fb08c54f98894c45a3548b74a7b1490a4b6009a05a9919195c20d835746d092bc6d3c02d2613e51832049631d3dac37d5951d50a2bbc5c35ac63a8d9c0318c2491ed5ec0ffcd0baea679150ab737003cca56556063b2abdf7286e887e92737f3651329235492c7221aaf0609c8b2f54a9c001f30d7314581ba821ba5b344463a88fc046d06a0eb422a524ccac23f7bd722c487d955c81836f7b49329b81231d371c7d3994bc54874e85bbaf278899c544236b49c04c688aa6170dea386d11b840634e75932b01716fb33459e63393f8da1281136f217bbfe8c10a14fb675e1a5074c1551530139c57312b4c9b5f4cca2219c4b35b63b1590ee6e3ad66d301b4609075737ff7a37aca7193d489762e75ada15ca43fa8be146232e5029b3f2a7d94f551ab625b8f963c79bab4123489317923eb54ad997b004ad53b3332b25cb27dd10a3576776eb1d77bfa10a9edaaa42c385cd5c871a4cc37e29a3da2e51683a78c09d63e64f6895930bb314080028473bc8c53ab6a2038dc1dc018c219108087c3b2bc2389e8609c0a8737f01c8dfee13e2014a77f2722e0f60d71f162ddf0c521f434d51a49befb613fb28fe9001d35c250791b0c611425c6bb62e8f60764db8466613486836fa07896314a6ea13a56e2f467483848c3451602e4c6ceb2cadf378d85654a63024c5e1aa3ba242136e5302881274c1316cb26004a549b19db794fac3f7c454fd8223f560636fa5acb56f0611911954131ad94ac88272b6cf4c89fa0635a7a838c38c92e1d640955453ea44ab5a6a0868cb9c071e51705e24a1cb1c4c9d8c59082757fc5cf95b17ff0064c0c47b021b244de30aeda11251fb170efb279154515b69cba0400875c78c1844503d411521ad54c651a738bc32da29ccfe992bbdd937827c6503735116ab5079dc04006fca98a66acb6519187fca7ca935c090bb8d31b6062b34513f01e157976183a1873db1c9e878a3eb37b650205ea5245fcb614887a8def4bb44b89cbd3c221e1a9b587a8c4a50633a9f386e6aa43e360649da46ab688116e01aa75943ce061b362d74ea824870a94cdf84b38d809bea8c994d2e10057b78ea6685fee45548e6bb681a32f5346ad5467558fe6c345e6258175a84edcb32b378ac3bb24e85739681234c0f1633c334df7d853c9d00dbde8a23d463289423536a44bfab94f2c76c113fcb086e5c4cf40193220c40b509065cc3ae5c861212b898699ce1c224a04a77bf165b0bb057c30d9cca16b4dc8128e7c197a4999372906cbf38386d66c27d1e36e8d504613c36d8f655d49750a72509f32f09580fa4518d9a34eb63ba76c063af7cacf158607890380c034e2429e49125c3f543c77c3066c374a43d24a7eea2608a12b845a4c42f7354699bb169bc720b175ce7c0d6e63843f543c0a84162e388fc21c313b3a5902430cab0a61d3e3aea195b13cec41e38539f41c6e22d63f5d60825d7182ecb31dc8a0a82a952b765c0eb279b75d20be877b8fb8fbc290f56efcf5240779bd2c639a67476fae730be123236ea68e4afa9d3200d0db30b7a771bb97fc1667e94cff70bd02f32d6b0b19548b61bff4a43fa5cb73ea11483b23b1394ad5812c8875002be49510656794033fb3150c7e13611126afa639355de9c04de445eb5c7430287815771a937707e88b3c8f42587f30baef55aeb7a392c14a4dc858abb9d537f8043c64100aeee6a597315bcdb65528286e0fc7ad5a59a066725cc965c562acb9d6330f28220bfb35b21cbb4321fbb556449c5e1108c46744e48c578937cc12c20df49b79ce96aea9b231892597b8a57683c495a9729bd7b969f34899116104abb00ee4049ccbc7c37ea5868ba5c2f4a3934d6599ceec340d6a488fc28d84ba371456caf9c52da9980904e253e54332505cb9322b1ce3c1904c739433d99fdb35461d4b3f949c8734904974c5cb7dd54531e86e7f9a69b8c78e137a77c0eb6b1ff468d0b2973819ca6a69b1e640af8f3b35af45183f5284425393472b3b7674503a86592947621dac8352a64427d313d51716ed6cc78bd85412d97561c910f31923361485d138b80585cf2a59a04896b3bd8c7ec2923ccd290c962c343561226a076e7e13a0d51233b68062d0e02512aa96fd701ecb80b7f45b210311246bfb594c5059f25c1167094f966c7d88da77ba3a71d186936f6007cb7cb4941c599103792edc82e3708e4aa9706da72ced51924d19ba561843c3a70f3f91b4ff04987cc4a914fc6ad33290975bc0b534d415efbe43f7d4a4b917723aae654e4412fd220548280b7a6ace9f2f0bc7b059fc103060346e53bc3c3161d884ef52db5eaa6df8ec3a0bc5ffa730db0dde8c5f38f266d5c680a78d264a7b96 + +# Official test vector 7, seed: "aefb28fdd34e0ab403a703b535296e3a545ca479c1d8148e2d501b3c8dd8b1034bd986f13f1a7b4671be769359fd2aab" +seed: d86634ecf96cc2603761e284c0e36734cedec64e7ff486469e38539c71141c5a99daf37400cfe59841afc412ec97f2929dc84a6f3c36f378ee84ce3e46cd1209 +public_key: 3790b3e85bb887d46ec144b4d8ec8bed82bddda538eea77d818c7081b3bfcec68d496035b71280b23985c6d9cb7580568286b405f937e99a8ac1fb28a927940c0a7cbd36290d130a1c23a42f3a437c6291dce36e39e8cf2ea8b9613c1fe7571ac74bcab99bc452b9c5829b586e5544e27432f06ba9c96869f5b1228a0a70fcf95212b0b2b84b45f29a49b6572483807543baa6e4f8b7b40119a5d483fd20224932a3af6869f00c8e9c6c5bf4c53dbe092d879bcd7843475a3110a559454a7375ac0418c37444a16a164acc751f56b2ac97a1158c76bb9976d750cd23761265d16473429c3da3b82eac213876c20d639bf5951e94d939985abd149b99c249445f4c9cd7421ddf21c536bc8fc2029e65d5c7de083296d88bdcf04e38d26dac500ad4457cecf8a795322f45997bcfea18ebf807e84c659937cde6d89fb490765ea9713b768ce05099e7386b4037b961a81edd79add8fb9f8ddb71ee56c349b453d2a3bf22c56730bac0ce19c4f961c008e03ed3928c7d068cb6512dba564855289bdcbc2f2b179dc7631b9372872d05c4e373577861a67eab16cba898beb2ab70c69447a156df0b36ef9c451931b4b7212c8a850799563cad55bc89fb3460f0c56ab434c5e9abe9363f1992577698af0058b54bb5b9a7b42e8d148d9dccab2d1a31d661018182ce207c036ff201a95b755e041f2e1623bef565b01a27d870046018cf65c8324fdca0dad64883da659826bf82721c3712700f435ea40c872b83935bf6cdccb41fe29c81e2210477babe0012cd635079d5932d42038c615a476ff35a523c7761d4560554c8ae0532e8d23a16912a804908411bab5fb96b9802737db82ca0d40c1a3b9913d81fc1330cee7504e2a056a994c4dc70768bc216f66921d93b81973b46352796d37b4f9009312aa957a51692ae8a65d514ab5bf7b46e0964a8f827adc51765384e8c35c900c4899ff30b1b53be227a39fd8b3acfea46bed8832c38555252b38cc5cf750221e3490ddcb80d0d73422ff47623282d273645c316181a36bf787ac90ec326d758ae71e5863c66b914db005655b1ebb057f8444e2689ad91a69150f71000ad7908897b4a3ba94c881c20271532a9653071cbd55669719b5c613abf45b3335d734b718779d51cc5162a91e4f2622a94469e09a41e8a9dbb3667312bc8d5ab7839374f689b32afa5a25de333126a49555909cb27002b18333a6a0d255b905e417eb8460d8f7566b12c99d2900794f4c0b78451777a3789c834c785274b65881bf055dc1875c6392dbea82811e49c34a3b2978468e10ab7fd91793b2856666a7c28473afbb467e60ba603230c5ef681af07c1779c6598a20e051254384467868c0b21ab7d89604153aa680611b767f19956a3b16229bc31fa3ca4315048b90f9f3252c23c02c92a6cfca28c5ad6adeb242c26023b8f76a914f888d39b59fdd1042502a68c0b416e6853e9cb5894253a129a1016108e44aa4257c2b547292642c3ab2c5abf1b5967c8fcb377eb91fef8c0d4daa3f2e04a0f869ff4bcc458f4c118a4b59715c6f3dc25a304b2fc9877d1aaa3af43a512a680f3e1bdaa90c816b95c339331f5fccdc969363977a7b9695dd6b9ba34809bb613862a0561ec25ce0d2dc86f262dc0ed164c2ad357a709eda919cda2c4f880 +private_key: 6dfc120e15395ffc3fea71601c36939f3ccb68116ecb66a550a284c09bafe6bc93ee929efabc348b015ad58b34f589891d9a7e34630565751b15f42d93412f81f511ac6587ce0121d32a4760ac0b6c3779c6bb5b4c0a983b72397c544b15cc7aa38502d37132040889c575bb473b0fca1bc1c50815496606bb99a7dde8861fda4799955b1d026535021a01840bc82ccbac7b99f745747dcacbb0ab34036110cba31b58c0ba3273349f2927fc0b32128b1b41c256067642adea66cd35482bebc757d2005b8c5579c5844989551cbb7377d550b17ccfa6bac2ce6012701988ea580435e0533bb5879cf5715eb75c69322b9015a4824b33f2647f0b23b4343940965027ca10a58a8a4bfe883c5fc90f62eccb9eaa3dddf68b0c1671bb249a52898faf3397fe07d02aa723efa27261a44d721acc9c8b6556267f06e872e6888d03463c3f7133eecc26b01b96879c0b5438a1d218820c91782f6b19ec5bb96362c09d1c9329912c45618735424a05c64cddc9c8b53c556f7b4302226440c6909339603dbb5a66a76e0a898c53c700270bb1c375c2c91c222b4c54b0c2848ce5208e18864cec0cbd86507a1b87df6929c80a6bb0e93d6eb085fdc1ad97a713e3ba1470c1c33dfbcd89a802acb9c222052073230ea3179bb75cbf107525a938b49a552b8fdc21c262740a55724ef28bb4d63bdfe2ad28b3246b4452578646623ba78509a286c258e69480a835c2b9820cedec3767e12e1d7b324fa1a51558b31a914d9568bb22e72a1b55714488a699fa705a4ac58daa09348022f0d65df68b8841dc7fba2506d7fb2e137b8e6a921788b5661657c677283d16c16961549368129397492b1a849005917f695b2305e529871b61811b6cd88a535692c48e058f9cb826bc53411248a15c39b2e7ba40000aa9d5134cf2471574aa201e12601662b7d393be919979681abf59136dbf44a1b66704d8a68b23ec2bc1f9525b986b8a640a2f754702ccb321205c9ee916f7342fa86c8f48d817f9f72208474d660b5f23186357f43681d93440aa562ca93d3353154a42a4790a8811439a84a19f8a087b8614c6825a4eebe035b794caa7fa1ea967b63928965ae044f9740bd4986fd3eb78f2d42c76132c89d960bf32197c432452b6b2e117b248e511b8fcb0fd850a57852e071b6567c37263d3b45bd439095ba0572584bb1990c0d287cc826f13468d87d91725586707f1c29c5a7fd4e67faaf6558fbb8990463297d00a196407057316b331cc911911e7da8a82ca1c77159c4d654b74fb89e5597ce0640ce97861f37b79b47291676103d6ec6822770bbb40cb7332b841e7243cb55a934c488555652189bac26c508b438ed6799f2c108d4357096c63080af57fffd17731e41a217393c2198eead7adc7099e1b0154a010816073882fbc2409a678f1db0c6e5942298a5b2088a2abd39b8cfa8b2a7c6057482268c29b88566c5e97042f8866f469b69ae16db06c1657f91a66787e4a06597a6c0dd2300a914ac1cad196d5564864c5a597db2c62f4bcf64c4cab3bb077d331337a6b0e39c03891a64a369b202c1b51330ae01798b3834eb87cc5bf234e7e14b5a419b68c114fb0989d2a67bbd0da491d75113790b3e85bb887d46ec144b4d8ec8bed82bddda538eea77d818c7081b3bfcec68d496035b71280b23985c6d9cb7580568286b405f937e99a8ac1fb28a927940c0a7cbd36290d130a1c23a42f3a437c6291dce36e39e8cf2ea8b9613c1fe7571ac74bcab99bc452b9c5829b586e5544e27432f06ba9c96869f5b1228a0a70fcf95212b0b2b84b45f29a49b6572483807543baa6e4f8b7b40119a5d483fd20224932a3af6869f00c8e9c6c5bf4c53dbe092d879bcd7843475a3110a559454a7375ac0418c37444a16a164acc751f56b2ac97a1158c76bb9976d750cd23761265d16473429c3da3b82eac213876c20d639bf5951e94d939985abd149b99c249445f4c9cd7421ddf21c536bc8fc2029e65d5c7de083296d88bdcf04e38d26dac500ad4457cecf8a795322f45997bcfea18ebf807e84c659937cde6d89fb490765ea9713b768ce05099e7386b4037b961a81edd79add8fb9f8ddb71ee56c349b453d2a3bf22c56730bac0ce19c4f961c008e03ed3928c7d068cb6512dba564855289bdcbc2f2b179dc7631b9372872d05c4e373577861a67eab16cba898beb2ab70c69447a156df0b36ef9c451931b4b7212c8a850799563cad55bc89fb3460f0c56ab434c5e9abe9363f1992577698af0058b54bb5b9a7b42e8d148d9dccab2d1a31d661018182ce207c036ff201a95b755e041f2e1623bef565b01a27d870046018cf65c8324fdca0dad64883da659826bf82721c3712700f435ea40c872b83935bf6cdccb41fe29c81e2210477babe0012cd635079d5932d42038c615a476ff35a523c7761d4560554c8ae0532e8d23a16912a804908411bab5fb96b9802737db82ca0d40c1a3b9913d81fc1330cee7504e2a056a994c4dc70768bc216f66921d93b81973b46352796d37b4f9009312aa957a51692ae8a65d514ab5bf7b46e0964a8f827adc51765384e8c35c900c4899ff30b1b53be227a39fd8b3acfea46bed8832c38555252b38cc5cf750221e3490ddcb80d0d73422ff47623282d273645c316181a36bf787ac90ec326d758ae71e5863c66b914db005655b1ebb057f8444e2689ad91a69150f71000ad7908897b4a3ba94c881c20271532a9653071cbd55669719b5c613abf45b3335d734b718779d51cc5162a91e4f2622a94469e09a41e8a9dbb3667312bc8d5ab7839374f689b32afa5a25de333126a49555909cb27002b18333a6a0d255b905e417eb8460d8f7566b12c99d2900794f4c0b78451777a3789c834c785274b65881bf055dc1875c6392dbea82811e49c34a3b2978468e10ab7fd91793b2856666a7c28473afbb467e60ba603230c5ef681af07c1779c6598a20e051254384467868c0b21ab7d89604153aa680611b767f19956a3b16229bc31fa3ca4315048b90f9f3252c23c02c92a6cfca28c5ad6adeb242c26023b8f76a914f888d39b59fdd1042502a68c0b416e6853e9cb5894253a129a1016108e44aa4257c2b547292642c3ab2c5abf1b5967c8fcb377eb91fef8c0d4daa3f2e04a0f869ff4bcc458f4c118a4b59715c6f3dc25a304b2fc9877d1aaa3af43a512a680f3e1bdaa90c816b95c339331f5fccdc969363977a7b9695dd6b9ba34809bb613862a0561ec25ce0d2dc86f262dc0ed164c2ad357a709eda919cda2c4f8806ecea55c3d5c042d2dca3a3925faaa9112561827dceb0754580814a84be19b8799daf37400cfe59841afc412ec97f2929dc84a6f3c36f378ee84ce3e46cd1209 + +# Official test vector 8, seed: "cbe5161e8de02dda7de204aeb0fbb4ca81344ba8c30fe357a4664e5d2988a03b64184d7dc69f8d367550e5fea0876d41" +seed: 0610678ff4dc3128e1619f915dc192c220f8fad94da1943b90aaec401683a492da1804ddb5aa9b1c6a47a98f8505a49bae2affde5fe75e69e828e546a6771004 +public_key: 35775144c098e6756148a30e8ce75a67137ad2455860252b764c15823c08358c45ac820bbdc3525543a66a22854bcb8dd8e1c920a10f67e9c8d8495865b3bf16c39ab0a86cc231a521f42316f7bbe4d019616c167e88a40b4532b1ea688222a48150c6e24859edd0210ea54e4e80654b86abaaeb52a022742fccbb336921d5807d0769bb5674141fb791c6025ead44c79cf8c1fe80987086cda07546811471cebc7eb7e8a5c554a6cc0062bc6c0b10900a8ee95239f844d26527423c30f4a1be90e29424263663406debab5025e11f00e09c24058f8077cc2313842a5ac74bba5e26cb78c4f8557cd38dc67286d9d25b18f005fbfa852c5ac738f33c24e07b26d635a09a3e3d12c9eaf432a06c4cc88b15ee7c4258b279631a9756e5086145cc2adca624410d58db0def549d2c13caa2d80ed4a088531221e9881f16e39659c3425b31b4e5c0462df53375870c2360b984a881ade524777489b8a184304372464ac7099b6afa24a9545b3ad02ac8b9c968d0b4b6e991cc0a83550dc70dfbba36de192bdb2a2239672f011bc2924622ca6c2c7c4c334ea05db489ca290390e5a18bf18b564a037157006fb9131b35983a9bd285d66482863c0cc4270a32b13e1299328acc2dc4e1812f1522a88177e813a0e6b52f11573873fc512bd004eb31cbe1446a3b3518ae2253ed3204c3e3c36439ab128c322a0160a5b40a27f3ae6121333400b050d60e9fcabcbc82ca7fb1b1399715a23417691542441923750abec3607b47b380835191d6f790a7d08f00ab209a6ba608cc9cbdfc6c8f4cc194bb22c630ae48899a058bae66f3b0cb12a0d2e3209d995010644fae989eb94cae8128585933ad0f7282940606785c07e882031c08a20f4a194be008aae8ae5ce77c17505bb0854579712f7f5231d1c32301053e9ae2a1866b634949bcb4c6952fb78376fc91bbdac8fdf096d1d987db5c71e39371f894adff2a099cab93d5353ba013aef5c58796f906e7a434590181a793ca012a6610c912daca06903b719e384c827ac62e2b2590f82f29d00bfeb50d66815fe13085395663f722399c187cc2784198b028e585b305e6126f6a003b05aba2c0a87eec6b186623dbb37dad789f7e8ba7ce01a792366117c308601664d6b7ce64a03a03090f55c5b59e66545bc0c9a29a29d2eb89eeea017026c2a4b88ccd12c96816af697c5b5f1896d340a60729984857072234c71aa5c8fed44f05dc7defa39cf409b063e68bb28b3789344bce267db328542a5530222203d6d8858e51caeb8c913163a97c0759a1d1c3562288dcd48d164004b08a1c9eb76f956ba5a562a84182caa6417e237bbe4e09a5bacca54a32c76773c84c14401a348108b2cd83377f6470019af3591b7c65bb33833517ce53f7701c4b1b2db8665cf5259b6052e73b41ee2641e9c998df327f750c44dec00ad7bc0ee69992da9455c2b26e4c7605dddbb3ed942542fa5c255b4f9d037a4264939c3a26f8a817d9c21aa958677193c13a3b1b76619a66b2a0b351601a1750ff9b78cd4506e1c19f04671fce65c5c34a6e8141628dd696b3d5b962497ed3433bcd707537ac4715a7192687826fac2fc0a60fcde02f78e69dd3b996b937332ad2161db433ef850b4c8a5bc8a48556a927ce345679d1595b8a12a0e85dc5da +private_key: 5edb8568e989d33924746212f1b7131e5a247c6b73d58a8fb30c75b7161461f7b7f5ba4b38b924484964e7666dbf6177aa2662b193704fb19e60376614bc92e811905a293cba30a81b4401fd067f4185c3a0e72b5cb260aea81924b85105a7403bd6c6ee09627c13ab53dbad06999d276004e290b41720a70202c5f1f4585a68c56ceba1d7b21e079552fc591c6c3bc8f49c089527288ce6be22ecc28ea6bee8db35a8024a03f77e5d7c8c79a825ecc4c002566335e9355c0a91e5ec451cd81c14f355ba3b82e0a29365723ff30cca66a845e849a96093cea945c7d242461a94b5c9595555932ce43107e000c251f13fdbd699dfe6b5d2a3aa3b7662f988c39bf4573c59b38046317c65ca2cd9304448afc62190bb32bee74220b32b85953a5036065d230c2d28c80f0a164eee4b72b599be3a3961a8a70491d4ab680a46615450eea25a2fdb2c7352b7ce36ab05dcc5a933404925854ea5330563b41d477a775679c1f8b3e69690913216e9c479434ab55af2996f6b431d01a9f4d7904c80c666d1cab7e90da6f125e14320d46861bcc11d50d9b21b0196902a7e26b720df911ea80716cc478cce204dd796398d108d04eb31ee3027b8f0197bb89079e87d2abc641d7030923052046504788bcedd194c5807cca3202bfd25bae48493ff273cccc55446b2bde23547c45a36bf295b32e18122a008bac4a83ea05260930061d6c1205498549567ad11ce95f105b6e18fa282bf33c5102e0c18f2f44837980d85b26273c450c5885233f101cb8ca85039afd9e5c9cad0239ec63eab8063a3a76d7069b5767603d7f0921729910dd29c814a08fc67587de5020057add33c04bdc40c82015af9c7a41ce541a4c11832459679cbbd0626a670246104a33cb4d4769069253fc2379835be32e61ce6f12593d453071cbd7df3441d30b8540c4a515279def5c44a8c397bb018e4e377bd84b1c09917df0058bb8916caa26a9417b314a79c536576d97a5d0091787c24154a1aa9f2f39a70577e9d61803be48e2bea7c245cab5073cec1b1403775922260005f43706950a261b99e22302b1e63bb45438d9da39c2ee780e9db6e0b6495d0fb966c9352873a342a914ef189854832ab4dd42128527e9251565ccb21f6646654e6b78aa3466a0ac82337b90ed86dce3b0b62bb376827a5a1b467c63114e597bc7da7016561be00970200f710ef523ca3988068bbbb9a1a8fc5a94d37b930ae0758bb3c1fe98c96f5a90c94aa649a4647135b9169e6b81f18a192b19015a50bd39159f1e8ccaa881e34f53ae469a51756c220bc827546b0b9632d2110b86c43cd1b04c35bc183d68c1837b3b08e0c2ad5920ab4093142738a5545a5fa97951d735aec4a3e090175abd999bb1b1ca1c7499e7c5d46242fd605ce6e18047ae23231c605b6a81b320261cfa0884bb87bca9902ba3b71fbd98c0a97a53989637cd2078ea5cfab93b33b1396028270974b50c4d6c8f4c8a0a610ca689c981926c9013ccb06ac855f229d5a832c3bfc8f78b1ccee078b4e893783934115923f26d747312450aed0731d99375ef6b8291b39ec146d0a2218c9084f1575b11fb4894d372bbca066a621a334086fb392affdf4384cf64735775144c098e6756148a30e8ce75a67137ad2455860252b764c15823c08358c45ac820bbdc3525543a66a22854bcb8dd8e1c920a10f67e9c8d8495865b3bf16c39ab0a86cc231a521f42316f7bbe4d019616c167e88a40b4532b1ea688222a48150c6e24859edd0210ea54e4e80654b86abaaeb52a022742fccbb336921d5807d0769bb5674141fb791c6025ead44c79cf8c1fe80987086cda07546811471cebc7eb7e8a5c554a6cc0062bc6c0b10900a8ee95239f844d26527423c30f4a1be90e29424263663406debab5025e11f00e09c24058f8077cc2313842a5ac74bba5e26cb78c4f8557cd38dc67286d9d25b18f005fbfa852c5ac738f33c24e07b26d635a09a3e3d12c9eaf432a06c4cc88b15ee7c4258b279631a9756e5086145cc2adca624410d58db0def549d2c13caa2d80ed4a088531221e9881f16e39659c3425b31b4e5c0462df53375870c2360b984a881ade524777489b8a184304372464ac7099b6afa24a9545b3ad02ac8b9c968d0b4b6e991cc0a83550dc70dfbba36de192bdb2a2239672f011bc2924622ca6c2c7c4c334ea05db489ca290390e5a18bf18b564a037157006fb9131b35983a9bd285d66482863c0cc4270a32b13e1299328acc2dc4e1812f1522a88177e813a0e6b52f11573873fc512bd004eb31cbe1446a3b3518ae2253ed3204c3e3c36439ab128c322a0160a5b40a27f3ae6121333400b050d60e9fcabcbc82ca7fb1b1399715a23417691542441923750abec3607b47b380835191d6f790a7d08f00ab209a6ba608cc9cbdfc6c8f4cc194bb22c630ae48899a058bae66f3b0cb12a0d2e3209d995010644fae989eb94cae8128585933ad0f7282940606785c07e882031c08a20f4a194be008aae8ae5ce77c17505bb0854579712f7f5231d1c32301053e9ae2a1866b634949bcb4c6952fb78376fc91bbdac8fdf096d1d987db5c71e39371f894adff2a099cab93d5353ba013aef5c58796f906e7a434590181a793ca012a6610c912daca06903b719e384c827ac62e2b2590f82f29d00bfeb50d66815fe13085395663f722399c187cc2784198b028e585b305e6126f6a003b05aba2c0a87eec6b186623dbb37dad789f7e8ba7ce01a792366117c308601664d6b7ce64a03a03090f55c5b59e66545bc0c9a29a29d2eb89eeea017026c2a4b88ccd12c96816af697c5b5f1896d340a60729984857072234c71aa5c8fed44f05dc7defa39cf409b063e68bb28b3789344bce267db328542a5530222203d6d8858e51caeb8c913163a97c0759a1d1c3562288dcd48d164004b08a1c9eb76f956ba5a562a84182caa6417e237bbe4e09a5bacca54a32c76773c84c14401a348108b2cd83377f6470019af3591b7c65bb33833517ce53f7701c4b1b2db8665cf5259b6052e73b41ee2641e9c998df327f750c44dec00ad7bc0ee69992da9455c2b26e4c7605dddbb3ed942542fa5c255b4f9d037a4264939c3a26f8a817d9c21aa958677193c13a3b1b76619a66b2a0b351601a1750ff9b78cd4506e1c19f04671fce65c5c34a6e8141628dd696b3d5b962497ed3433bcd707537ac4715a7192687826fac2fc0a60fcde02f78e69dd3b996b937332ad2161db433ef850b4c8a5bc8a48556a927ce345679d1595b8a12a0e85dc5da576cb9d31e5146967756cf7356926f2e20fc7c1fde9954cb2f593d96a80ab860da1804ddb5aa9b1c6a47a98f8505a49bae2affde5fe75e69e828e546a6771004 + +# Official test vector 9, seed: "b4663a7a9883386a2ae4cbd93787e247bf26087e3826d1b8dbeb679e49c0bb286e114f0e9f42f61f63dec42b4f974846" +seed: d322d56d8ef067ba1f24c92492b9c56df3a6ef54a304adc1b69913766a1ce69756047447b810cc094d400ab204cf9ae71e3afa68b88586ecb6498c68ac0e51b9 +public_key: 023753735c1bba67bbfd117911d0be47b827ed9773e4d50d8d11a5b6481357473ae2a766156b9a4e74169a1b3cd0bcb90eebc31f587d886accf3027c8f6620aee70741c403e4a72d4bba51af5b1362180158fa5867d25168871d599b04819635bbf096c4980cc336267ac6b956bc861e0a9864766a18d4b8b9ea61a0573fe60a5ce58a87cfa2974cf17d4f599673137dbc662eee9706ad9a85d780a911c209644980cea134545375c031b8e1082b4c201ea83877dcd7158435ae34d52376816719070d76c0683e0c4422750a1959932e88562ebc932bb7ae688c09cb703c6e567e6d898b6e135f483290da271d7ef16b15d12d4e0872ccb05130f52cdef878ea83768ad44885e5a2dd6b2a94493ca519c14efa09e9cc0739354cccb3850cb0c4b504c2eabb1128f55bccdc17c534b5e68b94526aa46888ae970372ecd49a7f03171872633e78997b51ca867852e638215be32eb2fb832c42038624035de54d7f4938ab78210c47bbbc931c336917c9d2a0d58454ded14fc7fcc6f5a97a6c3a5649689286f0ced68963cf24a05e9851fe1277fed36812e5984290701d5bbf138ab76f32b6043853415790a540878c3bb297b6bc7b000036007d8dcc7d32e6b7544c3225c2ca861052dd65c8f1d103103959ed0753e81258ec3770360aa924357315c18b33aa12ca06b24f1c59aad1b4ebc58f3f75b77c1b07bcb9a23fb0019de06109050b0ce30e8d6809c8a0ca70eb56e366033841ac39a6a198c5c105c85899e6403781c72ab30bf1d5917035b9fe50b081b6cc6103b72d423237189c583c702f7768fe43c182075a48828d041178e6a616340178aba89be3418c4e968f14b9396574b370f1c7d2858a1fd78b5351213b7c0a7e05382d0217457ba27a344546e197b22256b3f031c9e6b65ff377be25b6953a4dbc9a6e9aeb3b08c01358e2bcacec80033990f282b0bda655951a2b0ab83ef4459ac56a76af2b2d2669c0239496610a4274c9b3e5e998ac948b3e7427c8b380c1077480789b008054373a7fc65080f3772d1f6626e345bb417c9fbd97add68640dc12028258970cba5deaaaa32c7b022b0183c89b3e1be25606b3109ef88c9f07180c110703153a247981b5b465318abcd0a78ad1bcaa15b07edb66bd77a14b23e84afa6500bdf15b588009f05925a2fb430b0629bb4c2057f8a231760d9255746781c83ce932afe10b8602a80fc1a98c694e80333790b59e67722a7bcc2fcd9b61a56a5a8ea6b85b5861b44b521cb0b6adfa9c84f624ad499c0664aa97270d1a0209897569a64650c0a9b2cac1879e671d9f0413be9621b415641ed645fad52e2ce49f5a3bbe49655649a62baeb5634e50807f737dcef63a7fe0c5d2f573b9bc5914b97f28691f49045ec87767eef405c3b3c8c6089e03268a5f0c530f1682c4c022e3804ade91c20a0793265a45be711a607465709a24dee763ac192d0d57626561c3a6092f7777c8dba75516c39fb49c2353157aaff0787be318ce2c7385101e4d23c043742b9c5ba0d96419e192c20bd426de458585e11aa4d5c8315bbfba129a446c80b726060be07458991e973a394f163e54383d14d420ae0b4746a4b891d092db39b8e1c708768046cb0e3ca324d417302e861358385229492a291da3d601a3f41d29a75becb44d66 +private_key: 1e981c27e35d12192ff6ba764b9715bbb53b6afc9c3db6524bf480bb240d905622d8015afa41b9cc78a3f039269c9579d1bac3f6041827e883b3a073f22758a8112a36b91e2e1330d5ea0d5f91a09b7a2463a1a2025425b28ba10d85033b9a8fc3ca7ae949a8b5ea5c6f5b706ed22e949a1d5be2a573306b8e0c226634ae3b500a24b08c771456179bb24ad2c3024c5414fbcea4455cd781bf0fb5439f67285644309a8b6454d76463e69f27870e9089463d9abe0f450d72572fbdd678d6fac98c7989f0990d897913d0d1cdc6a378cefb0e202c4389626dbab6646b00be17377fc027c27f9694ef320b48ca51ba744d7c7c29555ac0c1c8cc134572893bbfbe45671225273db5b54659a67e41b2dcc744ab120917d3c952d9c847b038b53c36a369631493681b43512968069e2c7c140550bae5aaf35b64b9f9b8fd6c75e8063108e7237cc320ad32a8bf9a74987098e3e828f99bc54a5504cfbbcbd36ccab973ce8e4690ca8a37805657af89c6811b8c0045ca3ff373720ca1087259da8a27de2855f32c16e7d7aaa32c761d2241aab42db19353de53a2bd125cdae17468356d63256e22f6b2eeb95bc3b343ddb33164e297c32572c41459e5890777d8623e3a7df541945128004ce4ab73e25763e1236d1a99e5408a6bc59ffc308f2c810b4c18ac29d72581f46573843f75f57986979e77b28355e7bab59a9f71500689d0200589a2da8149beb260241bcbd147af09cb545ff104a603c1e22cae6476626631256e3720705287dc984fd4b3cf06583344011a4975cd490488dec64653d01b0394b413814f17b207e1a9bb5cb1661ba5c7439244267859f1544e50b03911188bee97a12b62052390cacbc9c83c713dae170cf927c8b4fb94d1b0c9da83088bc62e9e112bac46af692c77c57c0008e44c08b737944bac8c15901f2564ba2056c03660e7c6bb25c1c6075112a20338b8b413ef9c7421530741cb0df30c785a86ad78aa519ed65993578e65db2cb31c138ca6820a05231dd56b17668490d9393911c8e567060d368afd9bbf3d9369b6b2aa4393899111b72c8014f1d967d61286adfbb16beccaf0971fb8a2257bdac12b60372a61768ac242df6b575ef18df59c174acc51c26276da960f34219b8f50728290c99ac8c6971c9032c34fe682a58de45e4b2615bdd08ba6e11af9030e1968443a3b08e2877d04da6205a274565953ad6b7fe40565c0b680daf685049bccde9bb6616b325bf11e7069729a6a42544a0e13e90df4b5a42c2a340fc28960b7171b638173057519568a83fba15e40bb467b7e33d9785ae34f9e705f2211137e473b88c978d9a49eb4cca1b5d6b52d5b303a3a8151ab4654544fc791755efc094222ad8beb3057a24bf6f60bb6d876c5f7b8d7e6358cd1acec6254d97075bf02af58338f1a787dd335a70fba4c2ae3625a840ef18b53f8d8a2d051a2be6bba4fa6c40992acf1326abe29b852c7592e052045655a9acb5228b4cfd8c54a43fa2f76ba3fc7b10c603c958174894cc0277f688020013c7352b4b282389d9c178ae1af179c3d7ce495f82a773035b08e512eed8b309a5294b904c46012ad03bc6466d033a551c700624d0055421cc1cafd8568023753735c1bba67bbfd117911d0be47b827ed9773e4d50d8d11a5b6481357473ae2a766156b9a4e74169a1b3cd0bcb90eebc31f587d886accf3027c8f6620aee70741c403e4a72d4bba51af5b1362180158fa5867d25168871d599b04819635bbf096c4980cc336267ac6b956bc861e0a9864766a18d4b8b9ea61a0573fe60a5ce58a87cfa2974cf17d4f599673137dbc662eee9706ad9a85d780a911c209644980cea134545375c031b8e1082b4c201ea83877dcd7158435ae34d52376816719070d76c0683e0c4422750a1959932e88562ebc932bb7ae688c09cb703c6e567e6d898b6e135f483290da271d7ef16b15d12d4e0872ccb05130f52cdef878ea83768ad44885e5a2dd6b2a94493ca519c14efa09e9cc0739354cccb3850cb0c4b504c2eabb1128f55bccdc17c534b5e68b94526aa46888ae970372ecd49a7f03171872633e78997b51ca867852e638215be32eb2fb832c42038624035de54d7f4938ab78210c47bbbc931c336917c9d2a0d58454ded14fc7fcc6f5a97a6c3a5649689286f0ced68963cf24a05e9851fe1277fed36812e5984290701d5bbf138ab76f32b6043853415790a540878c3bb297b6bc7b000036007d8dcc7d32e6b7544c3225c2ca861052dd65c8f1d103103959ed0753e81258ec3770360aa924357315c18b33aa12ca06b24f1c59aad1b4ebc58f3f75b77c1b07bcb9a23fb0019de06109050b0ce30e8d6809c8a0ca70eb56e366033841ac39a6a198c5c105c85899e6403781c72ab30bf1d5917035b9fe50b081b6cc6103b72d423237189c583c702f7768fe43c182075a48828d041178e6a616340178aba89be3418c4e968f14b9396574b370f1c7d2858a1fd78b5351213b7c0a7e05382d0217457ba27a344546e197b22256b3f031c9e6b65ff377be25b6953a4dbc9a6e9aeb3b08c01358e2bcacec80033990f282b0bda655951a2b0ab83ef4459ac56a76af2b2d2669c0239496610a4274c9b3e5e998ac948b3e7427c8b380c1077480789b008054373a7fc65080f3772d1f6626e345bb417c9fbd97add68640dc12028258970cba5deaaaa32c7b022b0183c89b3e1be25606b3109ef88c9f07180c110703153a247981b5b465318abcd0a78ad1bcaa15b07edb66bd77a14b23e84afa6500bdf15b588009f05925a2fb430b0629bb4c2057f8a231760d9255746781c83ce932afe10b8602a80fc1a98c694e80333790b59e67722a7bcc2fcd9b61a56a5a8ea6b85b5861b44b521cb0b6adfa9c84f624ad499c0664aa97270d1a0209897569a64650c0a9b2cac1879e671d9f0413be9621b415641ed645fad52e2ce49f5a3bbe49655649a62baeb5634e50807f737dcef63a7fe0c5d2f573b9bc5914b97f28691f49045ec87767eef405c3b3c8c6089e03268a5f0c530f1682c4c022e3804ade91c20a0793265a45be711a607465709a24dee763ac192d0d57626561c3a6092f7777c8dba75516c39fb49c2353157aaff0787be318ce2c7385101e4d23c043742b9c5ba0d96419e192c20bd426de458585e11aa4d5c8315bbfba129a446c80b726060be07458991e973a394f163e54383d14d420ae0b4746a4b891d092db39b8e1c708768046cb0e3ca324d417302e861358385229492a291da3d601a3f41d29a75becb44d663e9976d61a687df88a8abcc6651446b81b7d136df42bfa03473c84dfd64fdb3b56047447b810cc094d400ab204cf9ae71e3afa68b88586ecb6498c68ac0e51b9 + +# Official test vector 10, seed: "980d0ba7c8f8b23d0e948a6029ff2659810ea1360064663a8994d0333c8543ee5ff5d6d5c9acf446e61dc464f792b9d3" +seed: 2f1d8a3bebb34540324b9485fdf3d5be3b858f544abc3fc641b5728cafab03ba8d6c42e7270ee2b77b6045385f3d175984a0e260363166c73b0c70c971644363 +public_key: 87fca4992854f318a4dd4188f7f334d83a3fe0d5709e89b4ac382e9873baf2525afb10a2785c5ad09c4b28b311b4579a79f06fbc91378109271383ab1ef7169385aa2e78b70d435bdb604494a246be23b1f26874ac9165ab451355f59686a33fc6cb78464cbd98021ad69c1ed12511ef99428e3b3685380dc2b16c0ab5cf46425984702e70fca396140a95e2c1bbeb245572049df3a4192a420fa52bda254fd55186aa960669f7ae2d69954aba444fb9c6b6cbc42b5ba82e262957089c76f48ba7362d6865259c321083c464bdc992bda9635cbc88ea89726a268a34d5cf1eb9aad5347350f67d1fea925f5677e393984818053eacace1844fc52b43d408761c385cb5491645696339ba086bc733c547546e540ead9b1a7942a0316cb635a856836075d3a87b84b1944a5587cb33c653e44b5bd764f6f8b06aa8688afa0526188fbba82707a326817087ea807e2ae51071d5badc027ddf781483d906259c30ee410b69060e4f47222481cf9dbb2075f330e4cca839b093668b82c02680c236167f3621921b863cab9a42e420a050986d481cabb873b6c19fa34b7e21bc6c029598daa77e30177357ba8b0e7696b692116a97ae2f535cb5208c93611ef5e952e76417fb974879337874f3c56d47a0d695797e1313e2fb7c3c6b2c32167f7faa9f10d18d512865f6a453e3e37c5bfa100631863b4a5f4b6c957eeca3bef28f62f98336c05770e001d8fc4f595921826cbad9825a76048aef2b4d97cb354784b4b6768377342685f87142ab06a67477b66a9457c48a2f779e0872cabed62d6e73278baa3406922f8ff5465af790e02310c9b8bf6e1b2987ca6521c55bbadb249ecc26afb244029312960a55fa45b448397264aa03530b9b56643a0d7cb9a73589955631883aba865c4d34fc5f5a6b8d596cb2c4db2b740645eb0a29647089ea2bc8a92bad95c15f52f5a2d24431d83ac4e701210c5b0ba3f31bd0086e47ab3f7984363ba00041c082d33064f1b27ff26958b85c46612c6556561a2e40600ae14fa70b4c1a81109fa6822c01d0c2786f0e17cf198009349704159866e557947b81928feb459b2337f3dbca2c82162107b5e34aa202b893c103ba5cf9b4580107c1f36b6ffb9ac34c2cee189571dc7f411349ad112d20f35a740c216ff98175563599d3cf6224ba230c2b2f087525059f9ab5b80f63110719972156aa30148bfe4c907b214f683c56a38a146e1c21e688c44f40bca8d4a87d3011bf64725360478359ace455c5e395625c95cc84ea3f0d004b2e3a4a12180a1463a234c4912f00be8324906b3805151841a1f4a5595621d66ca8b1863b6ae4869b4c93e2c6c94fa6af25f37e992cbc7ad23f6a274bec8b537f89b996439b762b2faca39d1f743db79451cbcba86de02a9d8567d8977d12066a1817bd9fc2b1bda75b9d6c78a39bc851654008b266c45361dce46fb2b02e4894c784f0b017428db0ba8f1ae54f3e8050381a90bdb073c186aaa458a2e8c682b919741836397e3c59e0ab75dbdc48976a6a474969356a75e171bfb2ca76e968191d970cd9e43d2fb2843b2a5e9d24cf4b2ca947e01f0c129a763ba55b9b92260c21113c03c7002bc8c6a2c544af711c18030ca984dc584e0b0627b3d23abd9c4d9e5087bcae2bfe6581eb7f9cbf532ba6 +private_key: 6423bec1793d33f81bdc6a591ee2bb7d7c9c29e43654600eeb353459a19199234ca950ca5e51b3c8b24c5a96c164086ea746c3b68582ee171c0a03cebac11b39ea6b1c5218025118ba696da2dc9ba9a87d197931261273de87bd360389016131e47b66b54216474cc8c68c6f8485201692a53d3cc06d6bb1a4cb19a69c435e42706b1068c8872412e1520f7a2ef7cb361dac74f339059108277de75ec66b76c7d432f84bc17e5c20f0a94764c66dd8738e61012960b9b2798b4c0dcb213c0672b5530818b82a6bb29277735451147fb4a4a1bac36949227479b74c358c2b3ca852048ac6d52872dc63187bf87f47a2c3024b41aae5ce52e56607b5541e67b9c528503013354038197a86a2cae824b6d282b37c8332a2bce5a30f2357022058779d5a2e266430b89b3fd752cb5ca26ee317c628061c33203787f2865342cb9012158c113e402640d5e900c6db4da9c1162ff9079b482a4eda56b63a626572734c417952ec894b10aec7822121a78150042ad321a70554ae6043a6f0fb12c411876ccb65bfabcae28b75126189fd8a1cc5510a95d36fb2318e96441ba4dc09631166905579429badfdbc6bd7c231c971837ff422327c5f769a1a89668da2669eaac1564ae75e7df44b9586011b6cbf7aba51ce68260b5505a99207438837a2c67b047896f9f64c1b2a54959061e92c8a73742962366c16b72ef3509b11748bb819adbd0b400964be48cb7adda5627eb578933a698ef8137e362308c32af7e93ec744984ac31dbb34bb8603b48965ac93891de258a9bf942c36ea4c8d7c23a3978eb5f176554bc809d5946828b0f4fa0c55744e702a715268b8dc684133738ab9cc9543a74164e9731854327d7361b636069ad00184b5b3ace48900bc0a28411c123b4c79d1a22346a10ba3488732b2a9e194bee742a36ab3c1ca9003a76e28439c6667c3d6a731873150ded546f132644ae4965ecc29a5c961f04612b194b0509b3157a80859c2a95c9ab2b5486b3fa8732bd4c18bd4b806148d64d22f38c7685c9934f7b990cc378106579f981c36d5c99a26dba6df2921c6385ca329127342cae148974d2b2faca90adb629020104e4650acf41c5d85036bcc30581f304a5db46b269424282776b6ca06bb3119a009ce22811e7a004c58b28f6ae24ee8e7499b331749db0aaa33710cc9737ef18dc1994218ca439a46367590086efb839589380560c6cebc4db59cace187700a80508e3c9fcce960637ccbb4c8a5bf3a6d3db865696a5a5e824f91b7cec516415db47d0b706b99a0cf5963875e89a08c5272df90987a7c374de99113b54bdc5063c462011e225f223a377c3a15ec81c376817aabb785ad0b5c2a0bc7e55525dbbb305396319ed108f7fc527be906f6e20b975b9eacf7c6cd574debd4027bf367518a0062260d0879b343783adcc44372667aac541b454a84b8cb6fe1db9589e43950761d82c512ba923819a4078cb620fb750464d10e0069516028b145628ff1f06927965935e5b23592959f9b39bc32bae290a583c24422b5545b22846e42cc1e45bfef5396cfeb544a865d7739cfa0891a01d1c2d36c6f341c24e677a8218640d12cca27792ddf9a488afa799e580ae6b08287fca4992854f318a4dd4188f7f334d83a3fe0d5709e89b4ac382e9873baf2525afb10a2785c5ad09c4b28b311b4579a79f06fbc91378109271383ab1ef7169385aa2e78b70d435bdb604494a246be23b1f26874ac9165ab451355f59686a33fc6cb78464cbd98021ad69c1ed12511ef99428e3b3685380dc2b16c0ab5cf46425984702e70fca396140a95e2c1bbeb245572049df3a4192a420fa52bda254fd55186aa960669f7ae2d69954aba444fb9c6b6cbc42b5ba82e262957089c76f48ba7362d6865259c321083c464bdc992bda9635cbc88ea89726a268a34d5cf1eb9aad5347350f67d1fea925f5677e393984818053eacace1844fc52b43d408761c385cb5491645696339ba086bc733c547546e540ead9b1a7942a0316cb635a856836075d3a87b84b1944a5587cb33c653e44b5bd764f6f8b06aa8688afa0526188fbba82707a326817087ea807e2ae51071d5badc027ddf781483d906259c30ee410b69060e4f47222481cf9dbb2075f330e4cca839b093668b82c02680c236167f3621921b863cab9a42e420a050986d481cabb873b6c19fa34b7e21bc6c029598daa77e30177357ba8b0e7696b692116a97ae2f535cb5208c93611ef5e952e76417fb974879337874f3c56d47a0d695797e1313e2fb7c3c6b2c32167f7faa9f10d18d512865f6a453e3e37c5bfa100631863b4a5f4b6c957eeca3bef28f62f98336c05770e001d8fc4f595921826cbad9825a76048aef2b4d97cb354784b4b6768377342685f87142ab06a67477b66a9457c48a2f779e0872cabed62d6e73278baa3406922f8ff5465af790e02310c9b8bf6e1b2987ca6521c55bbadb249ecc26afb244029312960a55fa45b448397264aa03530b9b56643a0d7cb9a73589955631883aba865c4d34fc5f5a6b8d596cb2c4db2b740645eb0a29647089ea2bc8a92bad95c15f52f5a2d24431d83ac4e701210c5b0ba3f31bd0086e47ab3f7984363ba00041c082d33064f1b27ff26958b85c46612c6556561a2e40600ae14fa70b4c1a81109fa6822c01d0c2786f0e17cf198009349704159866e557947b81928feb459b2337f3dbca2c82162107b5e34aa202b893c103ba5cf9b4580107c1f36b6ffb9ac34c2cee189571dc7f411349ad112d20f35a740c216ff98175563599d3cf6224ba230c2b2f087525059f9ab5b80f63110719972156aa30148bfe4c907b214f683c56a38a146e1c21e688c44f40bca8d4a87d3011bf64725360478359ace455c5e395625c95cc84ea3f0d004b2e3a4a12180a1463a234c4912f00be8324906b3805151841a1f4a5595621d66ca8b1863b6ae4869b4c93e2c6c94fa6af25f37e992cbc7ad23f6a274bec8b537f89b996439b762b2faca39d1f743db79451cbcba86de02a9d8567d8977d12066a1817bd9fc2b1bda75b9d6c78a39bc851654008b266c45361dce46fb2b02e4894c784f0b017428db0ba8f1ae54f3e8050381a90bdb073c186aaa458a2e8c682b919741836397e3c59e0ab75dbdc48976a6a474969356a75e171bfb2ca76e968191d970cd9e43d2fb2843b2a5e9d24cf4b2ca947e01f0c129a763ba55b9b92260c21113c03c7002bc8c6a2c544af711c18030ca984dc584e0b0627b3d23abd9c4d9e5087bcae2bfe6581eb7f9cbf532ba6c0cfd4113c5edd408adcd03d38b12f0b6ac17525c618d6d151a761a9eebc26358d6c42e7270ee2b77b6045385f3d175984a0e260363166c73b0c70c971644363 + +# Official test vector 11, seed: "6c029462ca42ed520f10a579f52687101105e0b90c6e7bfa582a4c112b579d5ad0a0abd38f72abcfdcaaf5893a112bdc" +seed: 31beda3462627f601cbc56f3ddf4424e1529c04737ef0ef2af6d7401f653b8a1812083bfa3b670e3eaf9b443702fb6db16ac1197656bbd61a8e25ed523b8d1e5 +public_key: 0d40b119341d9e23062c693509304bac635f93f91bd48b362989751078ab995408ddf6787ceb3f99c6802aecb703581dc6979c4d405dbc80a985f991f31924383428d4f5a2cad4acb5f95408a3406ec53425f175651952f5b76acfe2a465b30c1d56ca0e53953dac0ee2da352a687441f45dae26b37ce8008a99308639999d325ba89585656a6d59f51d10e46f93d099490c2385788c994238ea1155ed22c96a5c5035a3488be1c29e345ebcf6b1b7288abe95c29b272a7817704bd31589a42b22053226a43329183f6160105ed05e73203d172354fa176d3fd084ce690a8b6a4cef4035a3e06bc6464e8c913b88a48c81e58dfb1267ec6c1462d93433193e50d1b2d3e3828e90b6a412c1c45668272307f4b8294f37b84857bdaac6190706ca31380533c30643fc319c866534562036b37e825462c8442641c7817650333fb02ed6a2bcd6c1ad0689001098af3657363aa1b689a20683044d15275d0fc3c9aa720c8c4c6212fa70095a2243232cdd0b0fbeaa1c8e7b45ffc2870efa9bf56c8ee86659a618a0a96c42acb48ae125af911558f7cb20c9cabc4554c8fa6c70e297625286456ee625afa756145c41373ab4fb59b2782b4a406115de4966d07629cf8cc2283b4307e6a058db3dee6413aad72f89a7c1ab4131d8ea9df020b033b1473d92c4d89aa84f044e429a43b4e22fbb693a694bba3e315e78475437387b78b33261d786288b20440c44138c84f5592bbe74c1c2ab01ccd1124394082319780b24c593149cf660946f75a930f0a8f93a50ed01b5276ba96ab6ce5f794e638697ceca94d80585ced04310612a3c6cad80dccab1c1cbf5e08b2bd6b7df8c4cde4c4507a56cc97b456e10050bdb3acd6a7e00c1742aa4710e1674c59a8240680d04b8829752332324490ed6139b550c7a832862b2c831d4093db2b256f702850bba03053fecac41a61734229b2dba3210eea0c1e8d9a54c915f54b32344296ea64855dca92ab81aacc9e73153617d8464852e8208904ace7b84509b2266f9fac55bf68378d98d3fbc0a468543a8944b9975637162a4d50c7fdeb479daa8ba43938333b897a12c224ed1c790f967b2d9708c6b67640ca9ddcc1562613c2904c6f3856d13d904cd3094965abf1ed32ce52b7dfe4429ee68a8a3ab03446376d6da1de56a7a7fd30688f513fadc5627619a99d191bd4c0ec8bc1933c00757ab3e1f5826677b5e9bec2b151058bd9a6b5d2285122c23466312559c89a634abc2a5a11324cebbda8d167880f6d59bc5fabcc23487eda84f3543386e0b8d25422d5051816315532d2120ea4723809509bcd0c2edc1c93c275ade244d4f5b27f73b0941820da0183ca2b7af8480c90243af6334b36af00bda4c1e5f50463b8c350923b4696b7eb733762d189c9eba08c09050a4946388d736ee73c62f47cdffe453776730e88531f07abdd8699e8bdc9f05bb12f275c453866d46519ce2a592a1052c1e0c6b8f093f53a057d6d1bcf759abea90883eea68c5344a0ae96cdad42f0e756070dbb496535b9e7325c02badae5533140b0d9e013c75013ffdebc855734aa9947f1ca4b879c35b32c862c933479d884b2c675d3e1bbd26391d7c429db547041502307d975aee26905f7fdeb44f418d3d1fb5b081a3b06f87691170917a1e9f3c2cdc +private_key: c062bfea197ad53bc1f0556d6dc8a863d46bcff5bbdbe919d96c4099627710b0417c889aca6964a75a336eb5aaae40674ef3a3f3f96d9207cd0988cfe76838bac93b4ec866fc4b6b1127bdeb5c9978ab3cbaa6999cb508358b92cb3a859754461bf25a471bca16ba9259b40b3cc31ba8831ee9c95904b9303be152827525db350f9ca65183b63a02b289192a224b781a6b11ce7a40bcab396feae20158536ba9d86568401aa68b42856427b9003053c15d7d36b9807960b94b5f3f366896c59298689efb101c8ae162f4b4b53d4bae816c01a56bce8c1232548007eb887a93703b66ea609869c7155ba0e8e509aa7c29dba60337d8364ab61de403a45f49041e82671ca0cccb5002efbbaf65a7b452a0237f1979a4988c524570815017f794a7bae806a651a732659a36938b86ab36f7536eb27c5d9b72cee990131c1a6b31acce8fb5473cd0cc8fc2605b3c06f24866a36138e1148f50c9a530c24911d031a0f1a2201137ea201eb8c3b788f15d3c0b0fad52bae069818480132992512bd5b57df93b288a6b9a18c3d1f337d733a6e1a7b7780b45f3813aa855c64b004ef55b89da05a85b1c0638f56f6d6c87ebb947273277a9c5392e489afac0276dfca66687709f69bc73f373c929c7cd37c01cd2437060cecbeb1d045671500743ca451f7d9871fe252ccc39c341860a25d47ca90b18adc3af22d849389022ddd3a6e887212d6c9ffeb47da0131f76c9cae0467c35968242118f0f41330cab99a5412642ea0817ea08f0d49380a94952956346087012ac595d85a2339779c956abb2b25fad4512ca46527b54954fb81bbf79ccc0801279db6d57d5c16da1374ac841b5b441be3944003c30a90c56ee10239e746ac6fb867a50808839639af13f36d516b5056605236f57572844d657ac209135569455d2349ed67f3715902c4b5894229eaab63d0ba964bbc6884c1b57346caae6f1bc953b62f73827ee67468644ac383128ff6a3e97ec0ca3689a50ec5aa40392bad95e88e241666b18bc7092f01b9c7b3194bfa77937839ebfd2495ff29cb659a9374a8dbeb51306a21553995ab9ecb83637bb702365690812c3d18196ea0069ebba9f952b6b468b0e9846f4f7af8c17054189cf5c2200140ad0551697387842dc20a4eab8a1f0380934eba5c34113962c652e11c97a0144348c3218d371380c476ce987870472d72a38a2475539dcc545693d4a17af010a8ff93873dc24051f7a69ee7c3297ca508c3229d9d215b95b369d4126862a03531bb1fd7092bba391d5541eb962b403b50565253a1b91c63901269d18bc41003bc75c876a277adbf709def9b54447641f01027174334d963813a678cf7507b5562d1028a63df2411f6a6d5771c60b4a26f6ba1971943248607d9ec3b72df5b98802ccdafba8a7b0661a662c87001c3646a888208cfd68996fdb37bf9906ee99a0d09693f30b1c924c919de4b7ae0359b2b159d648bb4fe41d197c8d8444c530995ce8c3aac17637f699ad24bc0153fc7572c759e741c1fb71982fc61921c4515fc260afc58fca4a92dc3b9426f717cc0b60c6535d1f34b4ef858bd12677eec80451791191148a0fe00343d0aff44250cba46b9b6263594c940d40b119341d9e23062c693509304bac635f93f91bd48b362989751078ab995408ddf6787ceb3f99c6802aecb703581dc6979c4d405dbc80a985f991f31924383428d4f5a2cad4acb5f95408a3406ec53425f175651952f5b76acfe2a465b30c1d56ca0e53953dac0ee2da352a687441f45dae26b37ce8008a99308639999d325ba89585656a6d59f51d10e46f93d099490c2385788c994238ea1155ed22c96a5c5035a3488be1c29e345ebcf6b1b7288abe95c29b272a7817704bd31589a42b22053226a43329183f6160105ed05e73203d172354fa176d3fd084ce690a8b6a4cef4035a3e06bc6464e8c913b88a48c81e58dfb1267ec6c1462d93433193e50d1b2d3e3828e90b6a412c1c45668272307f4b8294f37b84857bdaac6190706ca31380533c30643fc319c866534562036b37e825462c8442641c7817650333fb02ed6a2bcd6c1ad0689001098af3657363aa1b689a20683044d15275d0fc3c9aa720c8c4c6212fa70095a2243232cdd0b0fbeaa1c8e7b45ffc2870efa9bf56c8ee86659a618a0a96c42acb48ae125af911558f7cb20c9cabc4554c8fa6c70e297625286456ee625afa756145c41373ab4fb59b2782b4a406115de4966d07629cf8cc2283b4307e6a058db3dee6413aad72f89a7c1ab4131d8ea9df020b033b1473d92c4d89aa84f044e429a43b4e22fbb693a694bba3e315e78475437387b78b33261d786288b20440c44138c84f5592bbe74c1c2ab01ccd1124394082319780b24c593149cf660946f75a930f0a8f93a50ed01b5276ba96ab6ce5f794e638697ceca94d80585ced04310612a3c6cad80dccab1c1cbf5e08b2bd6b7df8c4cde4c4507a56cc97b456e10050bdb3acd6a7e00c1742aa4710e1674c59a8240680d04b8829752332324490ed6139b550c7a832862b2c831d4093db2b256f702850bba03053fecac41a61734229b2dba3210eea0c1e8d9a54c915f54b32344296ea64855dca92ab81aacc9e73153617d8464852e8208904ace7b84509b2266f9fac55bf68378d98d3fbc0a468543a8944b9975637162a4d50c7fdeb479daa8ba43938333b897a12c224ed1c790f967b2d9708c6b67640ca9ddcc1562613c2904c6f3856d13d904cd3094965abf1ed32ce52b7dfe4429ee68a8a3ab03446376d6da1de56a7a7fd30688f513fadc5627619a99d191bd4c0ec8bc1933c00757ab3e1f5826677b5e9bec2b151058bd9a6b5d2285122c23466312559c89a634abc2a5a11324cebbda8d167880f6d59bc5fabcc23487eda84f3543386e0b8d25422d5051816315532d2120ea4723809509bcd0c2edc1c93c275ade244d4f5b27f73b0941820da0183ca2b7af8480c90243af6334b36af00bda4c1e5f50463b8c350923b4696b7eb733762d189c9eba08c09050a4946388d736ee73c62f47cdffe453776730e88531f07abdd8699e8bdc9f05bb12f275c453866d46519ce2a592a1052c1e0c6b8f093f53a057d6d1bcf759abea90883eea68c5344a0ae96cdad42f0e756070dbb496535b9e7325c02badae5533140b0d9e013c75013ffdebc855734aa9947f1ca4b879c35b32c862c933479d884b2c675d3e1bbd26391d7c429db547041502307d975aee26905f7fdeb44f418d3d1fb5b081a3b06f87691170917a1e9f3c2cdc71c5534bb819e61a9d8a257ff2eb29598ae92eccfad38abbfc9bccde5ff95a1c812083bfa3b670e3eaf9b443702fb6db16ac1197656bbd61a8e25ed523b8d1e5 + +# Official test vector 12, seed: "db00120937570d62331f4c3f19a10465231eff46465cdee336a0d46aa1e7493df80f18617f9ffd0476cf7784a403ef4f" +seed: cbdff028766d558af4466ef14043a1a9cf765f7748c63cc09dceb59ab39a4e4d8e9a30597e4b52ffa87a54b83c91d12a5e9c2cd90fcac2c11b3a348240411a4c +public_key: 62032561926a6380b6d6d90aabc5617126aa509168eca264ad67c5cccc5320c138e4053b4376924e6cb250b3a61fea8689804ac3179588a29196e05d0efb6915b3526d945cfc183dafc40d46537d907a292cd63b950659ffaa57e280ade8c09dd80655fe45979b612a6c6b1e350ba0cf433552e80f58c79d91f5cbff0717f3161f83b3c59fcc021bb5cb1922b0fa3c29984bbfc3363333f561dcb99395561590409fd7b56bb7db88e4162a61f8a81ca6b55af485d9b06645c42d1f706e9ef2b3d6e425285b4973202d46f150fdd4a6bad34a455b274814ac5c4053d680bfb4816578342fad152b798a1d592a3c88b45bdc275c45a862179557d437304151548a568159691282bc08f9280bdaf30559a3a177e6b8a62b101d8342c9d72452e05bbb1634cc1a7465e479f100b6f2952dab8ac806c27a8c555ec20a995c25a9ea8c090261085bd65c137a630e787da7a6b039c38573006c79bb5c20e39756e1a72e2c016f6cc997464546283d76543d9774345ac619f9200c308c25cea332ff25533b7983db495100f24a42e4a8df11504c4b96c017871b5a594e9c0b241b01e066043d07a366e343a08ac561ec5a08168a1c61755d5c33bd693608f42e63706bae5cc8c7f47aea360093fc78045517be49566f35728bd6a8230984a5e21133b63a9cb4a7fab4befe053e37bc78900141eb21189cf2abc0764b3cc507382c8db2320ea49c988c5aaa7ae896d10702c2082a59c3a457f382f44a1f2ce5b3d29a5a08d047537163916c5f6b22995541b87e1904b62a3585429d938a1b37d419bfc533cb918a424b5a1f73a65a8605edfcbd00678b6361399ac794f2cb0c9b26939b09baceb79ffc55aaa528673ccc4a5b844ad0873b4d6a31465cc479c30273aa2edd362625512012f83b42d52781c3bc947872c78378164cb0e077cf9ad87974c75ca527aed41a8b6993073d711c1873965448b14d307c5b218717b94ca27b354ff99de1f581e9561ec3cc196d1815a7a60a8c9a94cf4354140cc5e3b98bfdeb9c95c7c87182b878ba20939a0280e2c453567215a15803c01f7f03bb0b90741df964c4fa02f1007c466ba6b8f78bec07956611420220499a013ad3e3a874c4ad961b02e4c27a9ae71d57377dbffb556334797ec28c701c220129b856e747b90aac0803b2cbc7b0bb428583b810efe1727e0598cde9681429616c7b3f8bd8b691841a7a5405ad288f77b652a49c38eceb4088201b651a5c65bbc05e40a7a0f4151eb0962c34b10c1869a003cc4cf86d39036778b3ca32d0c500f7918cf027ef920b3718ab1c191618f294866b2fe77bab8c84118ce55157714ad2d054102a4d38ab73d1f3967e98351631582545c5a60b3aad50a7852c9d43b945668bb8b6781f56057ec058b2cfd6310506133e38b75fe3086d990d92cab098f06cd376531bdb8308e5a4d2e323c87c36e7ccaac87b00a7d4cfa3b3342d74a02d888d702cb44bc31201e41fe62c7511493c068a92717cc5513045bfa197d7f83db35798354797cca7891392ae9587245e92974920551d826101d44d9f73b3113746114ac94b8c8e291892be9c8015a0114ee44e26879c02084b0192194b922284956a8fc2b26e9071847fb901fdb6603c3bf7bbf5297bea11539fbe18868709fc57dc4d46d7d54159 +private_key: 77996be8a7ae3546a363e340c57039fba8113adacf805385ead18c56b75320cc714072c4549a225c86ba31212146220eb217133a70c987e3819ff1b6364806d6750b9e293ea05013c1241e0760537d867640171741645f18d451670007ad4c971dd16dd3c55f8ddac186f029796979ed9091cbab1a46d093b1b89265b7a5bc81459dcc638ef08aa0bab48ff95e48c725fe90c8694274aa6365ea4bbac173a658bb3f2e646f9d4645a914b70cf92394586a3420c60ff2290217576c43518e1088b703cfbc3a3837794706188b5772c03685c43a33ae27410aed7825e2f2541ce67c07f15a71a5910422be6ec94631b1b465443b7215c30146c7049076ee1418e932c2a4061c1f1044b7456ed355851c41214ac25723ba486cd575b608359d2a948d85895eca59dab3cfcbb6a366815dabe7323ec05ccb9042c994b18335077c67187f352ab30a06d1d40007a1636af51602f936f7694a0da510badc59fa21b3ad033f9b03103f6655feb646f217809d00a521f6227876263b8b7663610f0392bdb9a5089362828bda10667a36af12bb9ff090cdbbcc6b1ca0e8259422f376a342944b118f74960f3d322bc11b0010ac32c49584003b2c66198acb0239d7a55f7aba6fd5546efec7a27c39c658d15332ab36f2988754f86f51c642fa087bcc935219e2b35ec7aa4194bfcae007e465cffa530c6b9982dcf98924f924591b2542b34fd28057e189a0448841b121a39ae17ea5d7101971b26301c43fc84edb0b8b0cb35d6e729955208f650610822918589c740667cb31b169ac104160647f50c77924fcc6ccf95ad81603aa8481cb4bceadcb3a6761b87831274dd8c5b6a7674f0412ec341589c303d6833fd3d25fee059c5ef269f7a910b3060fd60217c7a83a75c53115083fb68a9ae2da8f906c13522331b329c6eda84ece980284d9bd405b5a8ccc821b8aa99d49969871448d3921cb2c8c8c3b4e34ec07fdd299c532bb291329a4555c257a842d93badabc414778c76b7293e369597e7c092a3020ad72b5335a93cac4cd74d51fd3410da6caaa98085d107ba0dc3070a1284bad4398ae8b9acf58992397c9f0f9b2ddcac60bf539d0253d2d3377903a6963597298f97a82bc92f7160282e25387f57c4629a0a3482a563a0b1c776c18870b26e289b511ba601884864787cd922b84b7cdececc21e07120a9c5f23e5aaea649eff523ec0b54fb5face103a1a30714f6429421dcc4c3066abdcf33356c09109eccebd2a68acbcbdf3b162fb9a7b3d1c3743ac47b5dca488c561caaca4b2fb1a86ab91d00a65e97b213125836bf4190549c300f1a010515f0cf3c5acb2bd10a20851078df28999c831c14cfacc45d5872af85800431d350921e959a231c64103f332bdd55b3816c150b61defa324f7dba659e0ca30b9bc6138abc707be19a476f857ab9226cbd26a31e9f6a06d72369b6b5e21a7bf76538da8fa06fad879ab62c292a44e448b8252278eedf1bb283ac71b93b50d592bef275749c4c154bb669df436f081785988c42b99270c1435af451030fb08ec871285a9720646acc3cb015f63c87cc0bb74705188e145efe133b657a9cf360f48dc1e2fb11163ab31c6613a51307641e25662032561926a6380b6d6d90aabc5617126aa509168eca264ad67c5cccc5320c138e4053b4376924e6cb250b3a61fea8689804ac3179588a29196e05d0efb6915b3526d945cfc183dafc40d46537d907a292cd63b950659ffaa57e280ade8c09dd80655fe45979b612a6c6b1e350ba0cf433552e80f58c79d91f5cbff0717f3161f83b3c59fcc021bb5cb1922b0fa3c29984bbfc3363333f561dcb99395561590409fd7b56bb7db88e4162a61f8a81ca6b55af485d9b06645c42d1f706e9ef2b3d6e425285b4973202d46f150fdd4a6bad34a455b274814ac5c4053d680bfb4816578342fad152b798a1d592a3c88b45bdc275c45a862179557d437304151548a568159691282bc08f9280bdaf30559a3a177e6b8a62b101d8342c9d72452e05bbb1634cc1a7465e479f100b6f2952dab8ac806c27a8c555ec20a995c25a9ea8c090261085bd65c137a630e787da7a6b039c38573006c79bb5c20e39756e1a72e2c016f6cc997464546283d76543d9774345ac619f9200c308c25cea332ff25533b7983db495100f24a42e4a8df11504c4b96c017871b5a594e9c0b241b01e066043d07a366e343a08ac561ec5a08168a1c61755d5c33bd693608f42e63706bae5cc8c7f47aea360093fc78045517be49566f35728bd6a8230984a5e21133b63a9cb4a7fab4befe053e37bc78900141eb21189cf2abc0764b3cc507382c8db2320ea49c988c5aaa7ae896d10702c2082a59c3a457f382f44a1f2ce5b3d29a5a08d047537163916c5f6b22995541b87e1904b62a3585429d938a1b37d419bfc533cb918a424b5a1f73a65a8605edfcbd00678b6361399ac794f2cb0c9b26939b09baceb79ffc55aaa528673ccc4a5b844ad0873b4d6a31465cc479c30273aa2edd362625512012f83b42d52781c3bc947872c78378164cb0e077cf9ad87974c75ca527aed41a8b6993073d711c1873965448b14d307c5b218717b94ca27b354ff99de1f581e9561ec3cc196d1815a7a60a8c9a94cf4354140cc5e3b98bfdeb9c95c7c87182b878ba20939a0280e2c453567215a15803c01f7f03bb0b90741df964c4fa02f1007c466ba6b8f78bec07956611420220499a013ad3e3a874c4ad961b02e4c27a9ae71d57377dbffb556334797ec28c701c220129b856e747b90aac0803b2cbc7b0bb428583b810efe1727e0598cde9681429616c7b3f8bd8b691841a7a5405ad288f77b652a49c38eceb4088201b651a5c65bbc05e40a7a0f4151eb0962c34b10c1869a003cc4cf86d39036778b3ca32d0c500f7918cf027ef920b3718ab1c191618f294866b2fe77bab8c84118ce55157714ad2d054102a4d38ab73d1f3967e98351631582545c5a60b3aad50a7852c9d43b945668bb8b6781f56057ec058b2cfd6310506133e38b75fe3086d990d92cab098f06cd376531bdb8308e5a4d2e323c87c36e7ccaac87b00a7d4cfa3b3342d74a02d888d702cb44bc31201e41fe62c7511493c068a92717cc5513045bfa197d7f83db35798354797cca7891392ae9587245e92974920551d826101d44d9f73b3113746114ac94b8c8e291892be9c8015a0114ee44e26879c02084b0192194b922284956a8fc2b26e9071847fb901fdb6603c3bf7bbf5297bea11539fbe18868709fc57dc4d46d7d541594b53b4aec0d9f86a6377c63ff80150e40fc5347714c07591dc71c6beb8daaafc8e9a30597e4b52ffa87a54b83c91d12a5e9c2cd90fcac2c11b3a348240411a4c + +# Official test vector 13, seed: "bd26c0b9a33e3b9b4c5d7ea32d5bd1fc371015be163c86f584e49bfd5362c8d8341161cd1308115b2a03b7e5eaddd418" +seed: 4c04310bea66305c6ca8ba6b8f61ca96257a67663afc11761f13fb5c7b324b6b8aec87a9a79204cee2986867a2906eb851b734b8b22b91d6749b1a5f07c44e3b +public_key: ed7c794ee05d9b58740d13cd78ea15867a5c3cb14051223efcb36969430b45fb699c26caa918c3d9041589a1bde4484e95859a700c2510d6380c2a323e34526e22adb44a862c417b34d172269b32430c6b8a68cc3dd2bee2447555c82189e2562aa82df2a40e33b91d65b60d0ad93b127294d71002dd16b35701670564b1c07436dc2a001c751765dc93da79aff6177e9795b00c5bcbf66175357174032a2a742b3587e35f055268551c57af78090044be4200302fb0b16a40b80e092a1933bf99878852342cc6574c6230a9460b08376c42c51a48aca14d0e59294f3bcb464a74c0a296fb0182cef42b25b58711c6cc939c9e02c8302e2499640737ea07540ed89b5335a05c552472172e8bdb2f40c49a5b0295ce99a0f567af39169313c8b61ba77fd2143f97cc762c8b6be4c13300a8b78dd06011c144a1d747e1c3825cc1674b825838953574e8b6a16b3dfa8a05355c8977006c649b58d9f0ac2d704f774817eea95f6da97ab5ca71c521a277d9618881563f47792d99bebc73a74ceb5560070b75c3b8b2e2c9598195feb08ebfb5cb1d86a87f93465355a796520d0c24744c7b852bac418fd620d060118d135947d9b174cca55444096ed97fd6442dda02b4a3364732c6818c39a9d199b4cb5a4d3659c8c4851d39db9301047370351c8dc417bc1b86fa50486e759b87c4cc69a8a9ec282909c40f0b7ca0896c01f7221639b18fc3145eae4b4b8252b4af720f1a22c1e5cb980cea6b103082b31b0542ea8d64d8c9b119aef3524cad116689280a51ccc08c09a8c3313a82a581b55cae6a394efb5146ad9884344ab6904c7d5bcc75729a261239c76ebc83e2557f60d125a9578fe0b4ac8d57b08d729a8d86647708483407ba16344049f8b842496a64f84d5bf42540429ade11b10f567eba812aff9179e263a2899b770f8b3166da15bce789dee3cc7d1846f3204b26933d4803b74c3c3885748a417692f0f5ac2733804cd2a98f45547af8ccd28542ab3062211a51f454b28559c28d0751c5c6c31045a8aa41c79cd1cca536c3d6a779afd9175a006b663620bcc92b4ddcc92b61b88bd422f1dc7962a70569dacbbfc7ac9ce90f8d16c3b6973ab3e96b6539a145128631c6993c776fcf488f4ee692772645dc2cc1541874c02aba0564a46176005f6ccf2ab27893dc60d2d44ce1e5b6e317a38c032ad98bbbf79554ef2882fdb51115782ae862c9dc79a6a8293a39135460f96329548507d58c39a07ab9aa7fe913a7fbe4c466f693ee1006f6091346a4b75a2a506f6c787cab948fb76f4398b2110781ae27644211476364abe4ccc2f0ac6cc4e917dd391bd0b369ba862d5f396d8627285b0c5d9b3692ef8069ea601e6e493d841755cea52194b32b5f787f15a6478db7b6b41336000d2bdf3270f8f0aaadab89325b6a3dda4ea88021c8b61b6ba372186321f4f5575f2508625685db168830063860965a71a27ce34a7e934b9444d411da9a151b27b3ed738869100ff19099f0c2a8583b872c8a0745e455bf715b8f526cb4f378fdd931c8111d53a97379ab1d57684224780690b2c1b36bab3b0762b8fb6afcf39cdda151607a6537b985c37989299414b4c9b1894c6051242482b42289ab24793e2d7af2ca0cedbc27d0595b94c698bfa000840bb2d63e1946 +private_key: ed1263888c6658d29766539e247cb2ded8bd4aea61e1998c090c96c40c513ce38507b3c1c171131ef280496b0324907d31b2b1d1e53ba4e2b3795c6b756cb113bc64dbd0b4f47978c048892f3a5b64241c3bbbb9bc7c593a8865f4923097180352d9600636b8f639704ce868d0b5069fa99a395c30cdc4b4ce3807caa07130cb5864610f7c5a6234930a8a519b3b6ccb63c7cb898565791b8a32c594fd826cd283cec434930b0161e183065dd48cdb392f0404120dd86253906605284bd8d16970382c5288c598f3220504c4bf05189695c0f8055a08c062c4889db96c1e960bb8eb9009f060cbd9818eea119886fb84592093610371a09358f351704be5b7ba18308021afdafa52af2a4b42b7021459318b15aea8d04d700766a00428d8d3ac383a3cfbd03e49a8ba99713c7191b61422769ef5594954a4d3f00a0359482de59d0b9c18c787aaf8bab676acbc9cea9cfca41b43946b52b262dfa8302ce58f749260dcd65e81b7055b660d9341a67a352de1084353252d15e02d2b8bcddedc11bda1cc3aa46ee307a1fc29019182b9d817c1a3d922bcdbb2a8eb5fc2370b9d1a36ccf94a5af3b52ef094cbfb63ca590e24e43ac2e983b7760a187714daabb7a7d02f961c3452298b0e93614a8baf42988721965b4a7b1efc3b5b6e1968e927ce28e08bc12cbfb3d23ee095836aa5b2dc941ff1e0568942b8a6d6b997ba271c37b25d8b1147e6515ff788861b7e3b454d5e66b22cd059a34696b430890e8a9e0007cd62a1bb1bb0897ac835dc26ade4528bde16c8a00995fa9362c17981c794793b199eb348606f68862fb29c1fb154ec28314e65983343c3897499afcaae97752616c87076a00d54eb8bee6b3bf5e5be83bc3eeb874594147369775d02352936e51d801335e0a656ce9c12eff64ba0941fa6a563274ca536c3bfe9c2662a39b4c3eb07482201c93c50c95b823788606e81791ef21b27bb4eece135f1c961fc0095c0dc83b5226204104c7a919d5b3489e4f8144ab2c0045b72ffe77a509a6cbd8061da15371c03a6d028cd88f13494e8699aec9ec54291c2e16f787718b730c7cf436844d7bce9302aad448c01213c1d14844845601dbcb556ca85eecc54d426621d846d01e62796c011a231652904a8a9e7a73b5a87dea3afe747662bd696913cbfdbc1bc31893d89f4af3ed249ad946b7c2a31c8f35a7b9c8ff01988a956634bb06329e176d2e6c38aa3c8ab27b9dee0135962aa08a909ca8196e8e626f123bb3883b9d86c23883c9dc9910cb9e6805c5859a0e08a7af64d610a332b30cf41871fe8da13b503156f6c031ea4a5c33cb5ef9384c8047c58532cb7da4c9275176536a5f4ca0cd6cca9b399a938ecbf61eb3dcb1660b160698996b3fa21714715299927723f3609d11526336b6ad0c2cf91491927d07aa4e0c7234c9249803a3f43460ac19597b4c47c9c4e64dc174a8241a913aaceb8a431973d552416e3115301a969c351ac9b8c798d83cad6c925b7d467b132071bb9af4a3c2c6cf6358101a620f857f6c55a9fa077ae25455ff1249c562ade011ac64b659d289616284259a2cff5144558d1149671b350b18d0cc20f0e164d47a8382fd07d96232e39c0a6ed7c794ee05d9b58740d13cd78ea15867a5c3cb14051223efcb36969430b45fb699c26caa918c3d9041589a1bde4484e95859a700c2510d6380c2a323e34526e22adb44a862c417b34d172269b32430c6b8a68cc3dd2bee2447555c82189e2562aa82df2a40e33b91d65b60d0ad93b127294d71002dd16b35701670564b1c07436dc2a001c751765dc93da79aff6177e9795b00c5bcbf66175357174032a2a742b3587e35f055268551c57af78090044be4200302fb0b16a40b80e092a1933bf99878852342cc6574c6230a9460b08376c42c51a48aca14d0e59294f3bcb464a74c0a296fb0182cef42b25b58711c6cc939c9e02c8302e2499640737ea07540ed89b5335a05c552472172e8bdb2f40c49a5b0295ce99a0f567af39169313c8b61ba77fd2143f97cc762c8b6be4c13300a8b78dd06011c144a1d747e1c3825cc1674b825838953574e8b6a16b3dfa8a05355c8977006c649b58d9f0ac2d704f774817eea95f6da97ab5ca71c521a277d9618881563f47792d99bebc73a74ceb5560070b75c3b8b2e2c9598195feb08ebfb5cb1d86a87f93465355a796520d0c24744c7b852bac418fd620d060118d135947d9b174cca55444096ed97fd6442dda02b4a3364732c6818c39a9d199b4cb5a4d3659c8c4851d39db9301047370351c8dc417bc1b86fa50486e759b87c4cc69a8a9ec282909c40f0b7ca0896c01f7221639b18fc3145eae4b4b8252b4af720f1a22c1e5cb980cea6b103082b31b0542ea8d64d8c9b119aef3524cad116689280a51ccc08c09a8c3313a82a581b55cae6a394efb5146ad9884344ab6904c7d5bcc75729a261239c76ebc83e2557f60d125a9578fe0b4ac8d57b08d729a8d86647708483407ba16344049f8b842496a64f84d5bf42540429ade11b10f567eba812aff9179e263a2899b770f8b3166da15bce789dee3cc7d1846f3204b26933d4803b74c3c3885748a417692f0f5ac2733804cd2a98f45547af8ccd28542ab3062211a51f454b28559c28d0751c5c6c31045a8aa41c79cd1cca536c3d6a779afd9175a006b663620bcc92b4ddcc92b61b88bd422f1dc7962a70569dacbbfc7ac9ce90f8d16c3b6973ab3e96b6539a145128631c6993c776fcf488f4ee692772645dc2cc1541874c02aba0564a46176005f6ccf2ab27893dc60d2d44ce1e5b6e317a38c032ad98bbbf79554ef2882fdb51115782ae862c9dc79a6a8293a39135460f96329548507d58c39a07ab9aa7fe913a7fbe4c466f693ee1006f6091346a4b75a2a506f6c787cab948fb76f4398b2110781ae27644211476364abe4ccc2f0ac6cc4e917dd391bd0b369ba862d5f396d8627285b0c5d9b3692ef8069ea601e6e493d841755cea52194b32b5f787f15a6478db7b6b41336000d2bdf3270f8f0aaadab89325b6a3dda4ea88021c8b61b6ba372186321f4f5575f2508625685db168830063860965a71a27ce34a7e934b9444d411da9a151b27b3ed738869100ff19099f0c2a8583b872c8a0745e455bf715b8f526cb4f378fdd931c8111d53a97379ab1d57684224780690b2c1b36bab3b0762b8fb6afcf39cdda151607a6537b985c37989299414b4c9b1894c6051242482b42289ab24793e2d7af2ca0cedbc27d0595b94c698bfa000840bb2d63e1946c2d52d0c837eb40dac0653a5e862d9fb8b832629cece9eaeb6d5feb48b6ef5da8aec87a9a79204cee2986867a2906eb851b734b8b22b91d6749b1a5f07c44e3b + +# Official test vector 14, seed: "e2819ef86853bca1b9dee7ee1c1619988964f9a913e635aacf0d96ca6e0300d084329dabd8f149e24176d22757404260" +seed: 38a0d5f41d7dc1896efd1b45b0485634cef149828751b96087a0a6dd81b4d58aa2acf359556df4a2abaeb9dcee945829beb71185b4d6bd18b76e5668f253383a +public_key: 109bab4be52b48818412eb1353680f2a3c3bd9fa7e55cc79c38207fdaba1833452dcb03763672212953c53532e6051ab040208acd348af507616562d96c7c04da93c8f21566df563deab2f18c9359b0b5391e8b03b485e3dc1a7c981b2a30026b0f83b84c4505a5966f648383c9abd16638a3e557ae4925fbf1c0125d91d97511175895082a78c1272792a50a5651239cb66b3f6c1376fe332260cc27ed5972c4b6ecef6462d3b712627928cda42ce150d3d96b7f032209ca92e9937517bf2b7c5f66e3b837ec347643a6a8a4d8c299de167395c84c2aa8bf1a8a4d5db29c2962701701ead468368b40e87da45dee76ff4b287950889692a838bba17b2b47c3140b7761cb389e447b2a540ae251d61808341dbb2b9aa5f04a69c6010431b28c17b980fd00499e274c9492840cc7a1e90215be92759db8b14ef41c059c546d4482343106adb27a802c3c3f8759a8fa20141fa63c65081d40090eb1abebac9c5708a9ba50656b4e7616151a4f1b0bd678ac18188450ddace2b99b3f170ac2635a62ad88320d17a9a75ca2e1bb52576274ee12f1f3b0b1696a247c70a6cda6264dc9e892cb08548c0c8824168f471e19078737169b4549b62b634a611ad53699a5550635faa7ce4589938501834f8c4856cb2e991bac84809b424cafb5ba089f14338780178d71b1cb7b1ed12c036f727fc2a94e9a62ecab6a95c8800aaa237cfb224af5c8fcc939443176ca4bca59ce54400dc7639e0630fa7cfc292604e6ab0bcda993a78107d108783d19dded13c2033297ff513fa75c4c6d65640206b43f33cac26950533b4b053190cb23e45587509acbcfc57acfadb6160f5345a599caed04eaa02937bd5a5620a5f24e6b194c52da021233b13cf950c270f8262972031790ba4cdb4524bd92781898427b6a1adc7a986f88ddf7b39be1c7d9700c87d52aea9140aef5c6454328f666a8f476b772784c3b13494dab57b06e320b2aa701acacdce41b8b3843e9913ccb3705dab48cb9d85ab5b36bbff148c5a4239b32190193112e1184d33b88ed1e6c3a9ba0ced62bb5e634b72187030bc8dfc1a3e80e28bfcd1828ec4a2e4888d68e4bafa3ba8622a87314432801325fa66c142760272e594de825560c7c19e881ef238bd9a38013f601885e02acec715b25730fb004009eba9111c125bfb0d6b2c154945575743cd66d85906981b24c1b2029452879608a34bce8e610501b6b12f32a1b3e99b76143cc1455485b3802778b7ed52210b976cd2ba26f1551c0fda036fb33891ac77c9265c30db5a513baca1524b8499932d5633b127ab98d8c07ca1704fbc8404957251f11dbeb7000b363255f5aae1261ea5b7c741445cc2852666c5437a4054f5d3a421799318098f5aaa5262b46187f60a09d98442499e30bc54c86838e256c24ae481b6bc33bf076b04bbc798f0615cccbe8eb66dd3c97da6a89394d4c7e07b8c4d5c70a01c9e7c43b8a37c3a09d728d9fc25d933028a504dced76c2a3900ca67369cf5b822107a9ddb2a168419ac87b036064786f500e9e0a279294df8a7c632484723ba28b38b52937b40e20984c46b23dd81bedf629da6a3512ec060fde7b8b2dc987395af460998230c20a9a08c1dfbf3824cf7a6fb4ed55ed1ff461d800b59a6ffd7287e1ee3fb94cb59c39450 +private_key: 263bae3c310cbd4b6423ac0195592363652d2c1b470a718073e18e08e412286a4df32501e9926d27c43de1135df1281b65c6738afb062d1a0823c01617da701b97a11c26055972b875d29d42985737502ed0551c85f11e2e9b28157049248691d750a4759184ab00b02595460a91acb77a6272d49273c35895ac796eb6406999b8d5b824617393fac877749ca787456211fabfd8c1ce7775ba14c51bfb2ca962b6a3acd7ad4084c90d000cef83aba7ec45910bbe37598422c8419585111055c99af87e08d5656dc5678b488fa9c96d366b5e6c2a5c8d900f40bc69db4a9fb9021723e043d42b089c68831a0525c14c8e9b192b14b83962b7662202cc753aaee4d18e23846e4ec1cdd9434a77a47a69596d8b5b019c60568a63734384b83a9406f461b9f940a9e0d3add5d21ef67c8d8f8c83259952c3cc86c35403fd713ef26a9cd239381ad4370414506edaa2da027b2821ac9a8c4e5a661f06038ff4b209acb4a71b916386a928a57183f9a5515b704aeec9654b7c17798c57c07911a038bb9b7715c0ea69cb3c9baf14a0bf881e6ca1905bd405e876234102c572db0b7c705efc93a49d82303de400003897c3f9196c758701a5946c947b32709268a9a265841408f038e280a9b441366f983316cb5fc5109c29b2320b156794ec3233a523bcc5b1e0ec6f0158c4346ac04078c244375ae8c8ab9b57296450aa75d8231ae3cbeb21a17f29c8d8fc628ff315bda563961a2014338d294743269c4876689eb938141d31001f932440b0a0aa079b6f3c82553c5350827a4a768c1fdb5e75253423d95043989cfeaba0ec544da71ac75a62a3d4d5600914972198cc95bcb1e4d04c1f4621ace5c02b1b0536b0350fc09b23ec125af05e92cc08362b6e1c1142484b736fcc46f4233ee2c52c2f810ba3148d74681fd5b158068cae9d701819a16917c81cf3f5a31ad1873930b59294c32d915791510ef0d8c8ac8a6cb4673493aa6bda6a6244810bebc286cc8020cb86cda351caf9e801d9589cf29b9cad0025ce563b1aebac4362b176c8a6c4349ff62124c53902b2c10636c88d612133e872759631b31d4ca637bb1670377ec7b97444daaebca78664188885c134fb04205a266895b7909e3271e141ad62090d5696a0221415e5a711a7ac0a9512a1c528767bb617bb79b9aa55b47cc2acb573aff4b4b5442bc573a8b9e937ad1205a4e6311834899caf3824eca782530186209c25d7e810c8f6c5b4559f436c7365642d28933a3a1234415b9728c061365c74b73ccd3e36222db3747c289d13942a32ca6fb1d7a75d563097e91399a2b967c3737962cd1fa0629f2b774d25a2021b458524b3c2f8344ebbbd2b7a70f7ab1574158e89117f3f8962aba45bb0cbc297ec3c2cc546096078894308310241b8ecce3fb787219c9e0b7443d622330877bf8c4c9637c6b9aedb75cb763356eb7772ba5664791d4f439e6a317b1066452d698dbd235fdb4ba5c37ba57ea8be97849345f7b3e8d56485329933b9b49f92a1a67b67c15c72a3b0cf05f36bfb2567f70ba9139cb6729212bb6b48b71590513bae6489b47c03220a72af6094045293ca3623842de85677c16aa910b9de06924dd3986df541109bab4be52b48818412eb1353680f2a3c3bd9fa7e55cc79c38207fdaba1833452dcb03763672212953c53532e6051ab040208acd348af507616562d96c7c04da93c8f21566df563deab2f18c9359b0b5391e8b03b485e3dc1a7c981b2a30026b0f83b84c4505a5966f648383c9abd16638a3e557ae4925fbf1c0125d91d97511175895082a78c1272792a50a5651239cb66b3f6c1376fe332260cc27ed5972c4b6ecef6462d3b712627928cda42ce150d3d96b7f032209ca92e9937517bf2b7c5f66e3b837ec347643a6a8a4d8c299de167395c84c2aa8bf1a8a4d5db29c2962701701ead468368b40e87da45dee76ff4b287950889692a838bba17b2b47c3140b7761cb389e447b2a540ae251d61808341dbb2b9aa5f04a69c6010431b28c17b980fd00499e274c9492840cc7a1e90215be92759db8b14ef41c059c546d4482343106adb27a802c3c3f8759a8fa20141fa63c65081d40090eb1abebac9c5708a9ba50656b4e7616151a4f1b0bd678ac18188450ddace2b99b3f170ac2635a62ad88320d17a9a75ca2e1bb52576274ee12f1f3b0b1696a247c70a6cda6264dc9e892cb08548c0c8824168f471e19078737169b4549b62b634a611ad53699a5550635faa7ce4589938501834f8c4856cb2e991bac84809b424cafb5ba089f14338780178d71b1cb7b1ed12c036f727fc2a94e9a62ecab6a95c8800aaa237cfb224af5c8fcc939443176ca4bca59ce54400dc7639e0630fa7cfc292604e6ab0bcda993a78107d108783d19dded13c2033297ff513fa75c4c6d65640206b43f33cac26950533b4b053190cb23e45587509acbcfc57acfadb6160f5345a599caed04eaa02937bd5a5620a5f24e6b194c52da021233b13cf950c270f8262972031790ba4cdb4524bd92781898427b6a1adc7a986f88ddf7b39be1c7d9700c87d52aea9140aef5c6454328f666a8f476b772784c3b13494dab57b06e320b2aa701acacdce41b8b3843e9913ccb3705dab48cb9d85ab5b36bbff148c5a4239b32190193112e1184d33b88ed1e6c3a9ba0ced62bb5e634b72187030bc8dfc1a3e80e28bfcd1828ec4a2e4888d68e4bafa3ba8622a87314432801325fa66c142760272e594de825560c7c19e881ef238bd9a38013f601885e02acec715b25730fb004009eba9111c125bfb0d6b2c154945575743cd66d85906981b24c1b2029452879608a34bce8e610501b6b12f32a1b3e99b76143cc1455485b3802778b7ed52210b976cd2ba26f1551c0fda036fb33891ac77c9265c30db5a513baca1524b8499932d5633b127ab98d8c07ca1704fbc8404957251f11dbeb7000b363255f5aae1261ea5b7c741445cc2852666c5437a4054f5d3a421799318098f5aaa5262b46187f60a09d98442499e30bc54c86838e256c24ae481b6bc33bf076b04bbc798f0615cccbe8eb66dd3c97da6a89394d4c7e07b8c4d5c70a01c9e7c43b8a37c3a09d728d9fc25d933028a504dced76c2a3900ca67369cf5b822107a9ddb2a168419ac87b036064786f500e9e0a279294df8a7c632484723ba28b38b52937b40e20984c46b23dd81bedf629da6a3512ec060fde7b8b2dc987395af460998230c20a9a08c1dfbf3824cf7a6fb4ed55ed1ff461d800b59a6ffd7287e1ee3fb94cb59c394504ff02338c9bb711d263140c471409f3c42813f38424698563d9550f85a168f2da2acf359556df4a2abaeb9dcee945829beb71185b4d6bd18b76e5668f253383a + +# Official test vector 15, seed: "669c4ef8a051ce201da65fc4bc34d398ec1f806276fc5d987ad71d93bc12dc8f107b58be6e8422a0795c88cb9a0e7488" +seed: 97b5665676e59e3538ebadaa8cd50df1f9fda1502d9894c616a946078e56b621df05318b5f655efe36f1b678cf4b875108a18db2fa312261caf839f84bd956c5 +public_key: 034626f03687751b2f1abac22b4c2b1ac19567f3324fca5d82b147af141a004514d831039a612ed69b621ffb4223109171e6351bb35177b85bb5063161273abf861988a1803e647820bb53b282bc6d04cd3e075a4a1b6755b97251901a81c7911437c528951d007d9ed82368d4c833ecf2aa1a806cbad08259470461f7774a922227e812689bcb59a3483c8346d130650e06383556c067f94d41dc1171941efcc96e3fd769623861bec9bbcca4a5ed22c10a36a59efb5d7153859df348ef9c3a2745cea329a73cb831441762820c7d996b88c1d453c775a16ab2c752e68bc55839d2e79544b87af56019f02b794b166f6dd60e8efb0b14f00d1ae800e37bbe5ff7c7d47a257adccd2949cdc3d9318a0cbaa34a14e080b968533ab1d9ab674c89774187d592b4c86461e84ac0e6808c96090abe6b0cf69a2056a1c4287b1cf3dab74f8ca66ae8421fa200fbaa4b11760ac7529b92db75231958e20a3f55b8a3396a10fe957361a9bf41941b90583d8d97cade8828b8a3a5ebc36730c19fa7346aa427c489f56c7cf3716928c9082b36d3f3b82ff1348eaba325ba8c49acb2673570dc5548229ba93a5c210b586ece088d6679c975b60e0106c0003625e42c1bafc1ac1be1c1779556a95ac68776ca01363961132ff75c2185339d79a426e6c0a0011a260acb7cc0583e71623b251cb8ec1049da730c2f9a26a61075aac24ab1da2732f708221a01b27c9da1b520beb7686843360a11a292568993c28bafc7088c1767b87523e9450873f9c73912cae517ca29c066631137faa16d217ccc07f840e1013440da2ddaec6b7161b29742a2c941c7573bb0b57a58a25b00db5012a3362774fb35cd80c6f0a095753688b156b510561ca47b436cd5576ee0323f2bb2967022fe391b9cab3f41477787a96ec6667337fa4ea29b44b7c9610ab69706e820557ac7c9f9c55ab4a04fcb05ecc4157b943bbafc0b0e42567f95b8b436838d363da680a42ee01cd5353dd4276b4dc625d492aec385bfebe9767a2731fa8b3ce9271cd8d28042b66714d98d0bc0675a54b3ea3c322830a5616816c43260f6f21947e3499dfc4f9d76a7977cb467899b455a12d8628e93acbfed99cd8b813d21a15024da9ef46b1ae4f6333dc8933b52a5f100bdbdf2b23987270d550493d949e83a269ab42027b34a12a177f185af5f76ac9f9b1cf9ea4eff5529e0247d3abc3ca08b3a1d081a8c75a1ffe4337711759d25b9cc673b0263177ea93b56667c15f82b483702973c6436d40953aac60929a36a911ad25ac109a10841fb95e1ec05962c5694cc3cd7372260ea4863109254c26a44f62af0957960634354f62c624c5723416f14966417681fec883ae47544b753340f749b487a095f89784f15a6e7945da56c9e0d2c358162213403609a1c938c98c68b70a0fadc5aa746ae4ea9868f19b9ebc3282ff592960b436a7a7301e4c7fa075ff50762b866c4a9f157ad25291347a9dba5cad62c35b28a3933f5269f33a0e6d403e5721a0d36bae734481c43918f9b13acea8f6a13b1bb584938284c10e3806ed935d8e543fd5bbbab0685f099c2adf254f4906d6e05590dfb1544a32ff3bb766109561ff31c164792b6b0991fa93c14a74086a585353c3e620d3ec5b1da6ff7959016b53093137c512dfc18 +private_key: 4fd2be0ff2ba62ba7ddec6a73c032e9a15cd9db841b4791620989c38508bd6733c15c206c84402e286ba0f2b274b94ad18a5ca003d7689aab71ef8cbce7b75ce844622fc9f57b974f8991a89032206f59023002c938c6d66622a7033442c190134d06f04339fa61390ceaac12dec5d0e5275456873107a8cc1ea6d5e5450aab97b23a06e34c8a812cc29794897a20bbfe7790c3404c25dea2fea4c80f102ad1e750780dc79010811fe680bb1c8000ebc930ff8257f912140db9e0a9c5c7410388384591f500bf0aabc4258272deb2871bcbb85757e9afb2699f45142ebb80ba8ce2fd095cccc1952579a8a67bb57f78e2feb4e484a96854a8d4d16bea8c08d04f91f31779e0df23222f5768775c026148cb1895b970cab860bac34aa6612e8a5b93c5aefc78e408a0312fc027f7a509d6c12b55453e9cb2f4e5c4360a4ab1e350f8122a008f69cf2796f6b72a58e388921863ab2fb82ae627c60593a99a4ba7806572dca7179476b16d5aa6adc6ccc90ad700cb1304c2b299c1aaf09369cc2ce8a9c31cb799185c24ad16967fb1269d0dba48eb0a258d4c37f9484c9cc8d214232f88b919de59ffaf6c00029058efc1e4fe55a8457b16d3c49017c88909c0eef37973a6b2e55d19b8114b074d8c95a57c5d897c87f024b3bd8578c7921536b1b45c19484e220ed87bc647c57aad958e01c74a433074a660de8824060108b1c44cc45486f0ad2c00fb79a7d88a2eff62887a3171d132e441cbaddf2bc1622045562a893300502779c3cf072ddf61187d42da0acc451e6b56bba37b3da8f1b105483955c7b169f89db86e7fb04a493b69567bc5a8b8655c919f8a70d6ee1034c1478effab227622029f5997b14696f4bc4415b6771d3701b461e76d686c93699c96165b00a593d69827bb39a256a1385d8b77b2222a5c920a6864ba5f413800c95f2ea9c303a064a173c764437eaf13444ec34192911400506158a0ab1c56399c012c30a7290cc0b0d330bad27b8c0c80b7dab5ed21c38459a436b5a5b2b0822726815180395dbe69a472672fcfa17cc331ec910096480affc8c667bcc7a2ca92e6ff80b1735a5959810dd3a5fe9938836d1b50d772a11c1b126fa498009b730139c3a1c9a22d12a55f1755f81ab7442399c8bb509775a24b3987e4432fb3a4a22fc7da509578c34302ae845b818894c7a6283d71d42657544b558f74b7977d270be722b9a51bbbdc236deb8898c65a92457b260d3816f57030f510e4f885450da20977451b2a731ded6287fcba24b4c7f09e4a7532965774c0578eabc13d1b123542c1d1b6a710bb3b55038a28155528caf974769557318c617306f72acad23c7c475b9a568c70e7552b65917217677fe625b15548be7465b147c60f857a832d08ca770c83ca3b201ec1e8ca1ba25630997a69ee54921e7ba611ea1c0928c0c99d65d0c0a39f2e18f8ff9980044477899411410a48ac2c6c2893e83c19f7f1080edd9058270374f0aad2f794655f594b3cc15bbec6db0d647e45805318534c4da9484ea4d55464da7231bdfd31e9bb6c53e35a6f0764ed3443823f9991ca3aff1caa50edb522c42112ada999dca8a8e678ea1a8417d77920f723061c87cb29a55034626f03687751b2f1abac22b4c2b1ac19567f3324fca5d82b147af141a004514d831039a612ed69b621ffb4223109171e6351bb35177b85bb5063161273abf861988a1803e647820bb53b282bc6d04cd3e075a4a1b6755b97251901a81c7911437c528951d007d9ed82368d4c833ecf2aa1a806cbad08259470461f7774a922227e812689bcb59a3483c8346d130650e06383556c067f94d41dc1171941efcc96e3fd769623861bec9bbcca4a5ed22c10a36a59efb5d7153859df348ef9c3a2745cea329a73cb831441762820c7d996b88c1d453c775a16ab2c752e68bc55839d2e79544b87af56019f02b794b166f6dd60e8efb0b14f00d1ae800e37bbe5ff7c7d47a257adccd2949cdc3d9318a0cbaa34a14e080b968533ab1d9ab674c89774187d592b4c86461e84ac0e6808c96090abe6b0cf69a2056a1c4287b1cf3dab74f8ca66ae8421fa200fbaa4b11760ac7529b92db75231958e20a3f55b8a3396a10fe957361a9bf41941b90583d8d97cade8828b8a3a5ebc36730c19fa7346aa427c489f56c7cf3716928c9082b36d3f3b82ff1348eaba325ba8c49acb2673570dc5548229ba93a5c210b586ece088d6679c975b60e0106c0003625e42c1bafc1ac1be1c1779556a95ac68776ca01363961132ff75c2185339d79a426e6c0a0011a260acb7cc0583e71623b251cb8ec1049da730c2f9a26a61075aac24ab1da2732f708221a01b27c9da1b520beb7686843360a11a292568993c28bafc7088c1767b87523e9450873f9c73912cae517ca29c066631137faa16d217ccc07f840e1013440da2ddaec6b7161b29742a2c941c7573bb0b57a58a25b00db5012a3362774fb35cd80c6f0a095753688b156b510561ca47b436cd5576ee0323f2bb2967022fe391b9cab3f41477787a96ec6667337fa4ea29b44b7c9610ab69706e820557ac7c9f9c55ab4a04fcb05ecc4157b943bbafc0b0e42567f95b8b436838d363da680a42ee01cd5353dd4276b4dc625d492aec385bfebe9767a2731fa8b3ce9271cd8d28042b66714d98d0bc0675a54b3ea3c322830a5616816c43260f6f21947e3499dfc4f9d76a7977cb467899b455a12d8628e93acbfed99cd8b813d21a15024da9ef46b1ae4f6333dc8933b52a5f100bdbdf2b23987270d550493d949e83a269ab42027b34a12a177f185af5f76ac9f9b1cf9ea4eff5529e0247d3abc3ca08b3a1d081a8c75a1ffe4337711759d25b9cc673b0263177ea93b56667c15f82b483702973c6436d40953aac60929a36a911ad25ac109a10841fb95e1ec05962c5694cc3cd7372260ea4863109254c26a44f62af0957960634354f62c624c5723416f14966417681fec883ae47544b753340f749b487a095f89784f15a6e7945da56c9e0d2c358162213403609a1c938c98c68b70a0fadc5aa746ae4ea9868f19b9ebc3282ff592960b436a7a7301e4c7fa075ff50762b866c4a9f157ad25291347a9dba5cad62c35b28a3933f5269f33a0e6d403e5721a0d36bae734481c43918f9b13acea8f6a13b1bb584938284c10e3806ed935d8e543fd5bbbab0685f099c2adf254f4906d6e05590dfb1544a32ff3bb766109561ff31c164792b6b0991fa93c14a74086a585353c3e620d3ec5b1da6ff7959016b53093137c512dfc18bbccdbce67cf49fea044df5c767996681dd2714937d31c822f3c58cc34785aa7df05318b5f655efe36f1b678cf4b875108a18db2fa312261caf839f84bd956c5 + +# Official test vector 16, seed: "9debccfe818f6b5204db4ea09c03ec9a19dcf1629c1527685b8a29776bb1daaec45f8abf8f0adc9a8c8bd6e2df6d8048" +seed: ef99224a03a85a46ef115474ec5b5d620da6795d6efcca4c9135d19958a9de62df7d92dda83e6b2ef4cce08c9134563063068a196d7b1a1a13623e48ae12528e +public_key: cd187009317a52773c57d435faf794021bbc709b8e7d688a5dfc686c15931221a9016c3bb461a487982ded37041ad0c1d032714f7379e2fb9faf5aa6d0f5469c7156800ba258fc5b25d0996b6735665a806a74b03d9819a5832a6685157e7285df397e23b13a543a983a5b24264c971a73708de1572852465732c94830719c197c7985c0a7c53525a1ae76d18e1e9112eb4b57c1222320a8156643cbc9535a27658a3709123cd61af7798addd888053bb0de254eff530296f9ae75b2ca756539b61c62decb0e9ae611678b5190503344229096c34990a61ce8b10ed3841d48d266cdc249acc96b7d88010899c453467213d8bd23e1764e0237480c34d8396ef57c1aaf781c042471d04077eff85338ab8caef22ed064bc38164070a00cc78b8074e7569a627b49e0416a705386601d3b8a6c10a4adcbb190b4877422304ffc776b4a129d4098c603896a6020725986cfcf0083fffa66eabab82db734f5d1b5766104e8a2b8b859b6cd166dec691ae331b87e794a1c9b083c14b50b85b7e97148745c9f8975733d4262e247473ce53b85d01c6de505a352bfc0c233a396c87f856981c83fb74542c9f3cee1276f3096486ef23359c51ac553931b80c6bd245b2114c4a2d344ab53765c02c82b41412afa1ad5ba6ccee9bf09e375eddc0cd55bb6c727be26bbbc4e7392293c59455084b1542c87578c63511ae3e384e027bc07ca7401cb0096d1205f4ca86d3c73ee8273de930799369133f83f4667a92e72bee2655b17120dee233433f9c68a50c57fdc8617ac1d03f0961d4a7bd17678d8729329a0ba0591ca84670557e15fc5eb4e8255007b8c4e48206f62062e1dd53bfc43af02405d2e300d4858b1b9c9ceb531a910c0bde877450a9aaa8878a2fa45089e184d1fec1cf4e3909670bc11e78da5d8cfeb86a4c087a1b73a6099c99836b3cc76366d35a9854b3b205f4b2b69666878614117163fefdc32b6db37fdeab0a0197f79db088c3a355877cdb1313a2f200e27e37e12b4bfba04691f82b1c2e8b8172c11e466cd8d01286f2a3a4fe5a5f920476a9278b9d25e420b77d489386f9c167f2731654b19fe4886867b79ee10c18f679fae87826a0b65b44a83da5a35e0723bda3467541228b80b35d5ab869b52b5dba9b8b309360ff1022d67bc93747c392469c28b288cb73fca74001e5bb47d5b0321e08fbf832d0a9b0dbdf566d3898e1f9aba7e3c011a14c3e918589282c0f167bf14470d1f6c774e6742e40a1452c70cafb941624c02ad201e6030bf3dc6a039e6465d6772d1c184c693bd16c3367f02730ed6beb95940ff783cf9e307f38a7f4f37754f6c4ed26a1c70c90741ac89e56c989b0260f7e1178b5b975d54aa6f420e97a7b90c3c74200359d561beae98b1af044be40a2ad8491f42662e2f34bde200c63ca48e7409727c8b2185138ae7859ce43558349a1f3e641df0c14428c0c12d0a49abb904cdf8ae5cf34d379024ed528e5d84a3d25920b7a94b61a8abf9e557ff61c784501fc9e332f2b652f16a0a11148b8e594d1f377035e124d637659d4485d909543818814fe7a8a173bc8aab7066d2c927c90660dc8d30364d60a31f1d94a9e5f586cd84c167e2577d3326e41a614382f4982426e93391380c4b03db38d0f7bf0ff66d2d93c251d3347c64 +private_key: 999942a0ab8086204428a2098a205a297265ef3b725de17ce121512fba2225b20c2fd0147cd903dbf08722201c4575784a5370556715f8ec09eaba14b38863c5402b9100407b35375098a55f568ff0b4324b43098debb5085558fda00084584bbfe68d94280636809f8d408256913d32152710a132380243c74455b7f11532d3b88145cbd61745aa7683bd204c4e035d526a488465170fa86a099323fce43b78b4a3b959a1b1ec25d4593181dc22ba883a9f080316c23d07d1490daa68c8fa2f43533635439b5bab445a6c1df2a2c22aa84355556c80a9877ac9453469b02d998476d0cedddb9f3d05c7c6f99253ab62109376dd9b384b26786872030d95c23b3cb38238066978b55f2746124a98d90bcaf1c958e08b108f6714fe7658f6e0a67cb875522090856761d47189bdecb13c7746aae24c12294db2662a65d9241b513cf244223ec0ac4be18935c788e04421da1071611a3349843b7c760ce3568413756b7d838c3f3827e167b1db27bf0546606ba6bb7ff11a2e7b86186946cd00d0fa143122729efa29adef75c499f2c719e985e6014b110373ad2164ef7a85e78b7fe1dc25ed60027de464f3c133338404bcd89f2680c639d956be5a8cdc6254e670b5400139e0c136a132763f6c6664a6b9283b03ef18c809d94347187d91f97bebd0bde9134bf0414d219895cbba75c9b262e6e62ad70926816bc02818c71d542ad6e3bc2e58796d7a90a4ac200c1b135940b4d0346366763c2672ac70c03b56a62afe49a1ef043fe9657391b7274b6ba05e3184fda8125b412c46f986212ba2948b6db9130f54fc33f9574f7a82aeb209b6441886ed83816c173ec9826f8fb6c8e36237d6b32376344cf01311346b19eb502a6cc61811d6728ac3288fa5c576380ee2286839e4a8a01761fde8a2fb49a3dab98bcbfa9633a2bfeb116072c479ddd28891305bca71ae8622cc89dc4733846cfa56cd2ecb4d60623b92797bf8d8b2dbd2b74804c7cea19f40b67394c46b46906a44a5b669d95d4514a95f6327465baecb8a439114070884338485468b36b103c4af5ce9c1c9a09feb2a2f9b7324e703b23dc63192422e5b2c38228c36a3cccf39777d2015496972c6c618a296908cf6eb54169a479d5221679a7829e27c92c5550a4156d5631450753beb34cd4ba8ca8949a7390a4a2e4abce4ba418525620b7c9064d82f8d080a68f058d847bf69833cfe025f0e090e185234b6f6a260c7391c97b57222606bd0b488d37ad71774636c9e1ea8a449958c1b944e76f48fc8401deda708bc039a81c497c2e028b52a714b40679563263305bb432b3e120bbc561b121a2026569951986c94000235e96a2fbb70acb7a50a79c06947c02db12609208c101bab9e63d449c1c0a0faa336d7b0c1ba9c84b6518863267ee61624669938cbe07eec601ad3649675ca12cc307724db6ed5a60766f423c47100b75c41deb4bb78bcb19d4c486c098279d53ce0e6295086ba75525e22d3551450cfabc72c781008cfc5830d6c603311abbd81934e874b1c4a55e4884cbff57dc4ba0549724c7603258ed6b63456af9bfa0bdcb3ca86b09ec25aaf41911400e8bbe409604ba8919cc59b8916c8c8745c2e8042cd187009317a52773c57d435faf794021bbc709b8e7d688a5dfc686c15931221a9016c3bb461a487982ded37041ad0c1d032714f7379e2fb9faf5aa6d0f5469c7156800ba258fc5b25d0996b6735665a806a74b03d9819a5832a6685157e7285df397e23b13a543a983a5b24264c971a73708de1572852465732c94830719c197c7985c0a7c53525a1ae76d18e1e9112eb4b57c1222320a8156643cbc9535a27658a3709123cd61af7798addd888053bb0de254eff530296f9ae75b2ca756539b61c62decb0e9ae611678b5190503344229096c34990a61ce8b10ed3841d48d266cdc249acc96b7d88010899c453467213d8bd23e1764e0237480c34d8396ef57c1aaf781c042471d04077eff85338ab8caef22ed064bc38164070a00cc78b8074e7569a627b49e0416a705386601d3b8a6c10a4adcbb190b4877422304ffc776b4a129d4098c603896a6020725986cfcf0083fffa66eabab82db734f5d1b5766104e8a2b8b859b6cd166dec691ae331b87e794a1c9b083c14b50b85b7e97148745c9f8975733d4262e247473ce53b85d01c6de505a352bfc0c233a396c87f856981c83fb74542c9f3cee1276f3096486ef23359c51ac553931b80c6bd245b2114c4a2d344ab53765c02c82b41412afa1ad5ba6ccee9bf09e375eddc0cd55bb6c727be26bbbc4e7392293c59455084b1542c87578c63511ae3e384e027bc07ca7401cb0096d1205f4ca86d3c73ee8273de930799369133f83f4667a92e72bee2655b17120dee233433f9c68a50c57fdc8617ac1d03f0961d4a7bd17678d8729329a0ba0591ca84670557e15fc5eb4e8255007b8c4e48206f62062e1dd53bfc43af02405d2e300d4858b1b9c9ceb531a910c0bde877450a9aaa8878a2fa45089e184d1fec1cf4e3909670bc11e78da5d8cfeb86a4c087a1b73a6099c99836b3cc76366d35a9854b3b205f4b2b69666878614117163fefdc32b6db37fdeab0a0197f79db088c3a355877cdb1313a2f200e27e37e12b4bfba04691f82b1c2e8b8172c11e466cd8d01286f2a3a4fe5a5f920476a9278b9d25e420b77d489386f9c167f2731654b19fe4886867b79ee10c18f679fae87826a0b65b44a83da5a35e0723bda3467541228b80b35d5ab869b52b5dba9b8b309360ff1022d67bc93747c392469c28b288cb73fca74001e5bb47d5b0321e08fbf832d0a9b0dbdf566d3898e1f9aba7e3c011a14c3e918589282c0f167bf14470d1f6c774e6742e40a1452c70cafb941624c02ad201e6030bf3dc6a039e6465d6772d1c184c693bd16c3367f02730ed6beb95940ff783cf9e307f38a7f4f37754f6c4ed26a1c70c90741ac89e56c989b0260f7e1178b5b975d54aa6f420e97a7b90c3c74200359d561beae98b1af044be40a2ad8491f42662e2f34bde200c63ca48e7409727c8b2185138ae7859ce43558349a1f3e641df0c14428c0c12d0a49abb904cdf8ae5cf34d379024ed528e5d84a3d25920b7a94b61a8abf9e557ff61c784501fc9e332f2b652f16a0a11148b8e594d1f377035e124d637659d4485d909543818814fe7a8a173bc8aab7066d2c927c90660dc8d30364d60a31f1d94a9e5f586cd84c167e2577d3326e41a614382f4982426e93391380c4b03db38d0f7bf0ff66d2d93c251d3347c643ef3581d438af7dec621304e0091f797346ca18a41f39401e9d03200ef48beb6df7d92dda83e6b2ef4cce08c9134563063068a196d7b1a1a13623e48ae12528e + +# Official test vector 17, seed: "8098ae7a92c10f707d405f7dea02c2efbef44efa132ba8aefe81bd45e543ecec74f10920ae48a40b0653d63532517f2a" +seed: b12f6fd965ea9c5b947db80fc60c83d5e232dca82e7263027c19bd62e5a6ff550f6aa3e88f7fa8a96067f8cdaeceeac90c2d0b5e277e56e9c405ec9420c30252 +public_key: d8b6c56dc931d12a8092102490881b4e2064c5a9588e257834c1aea2668e69d907db5158c3cc7321d83b9703cb74864c1057660b718c3412cc47bb92612643313c356b6b2cdeac80ec5b657e78cb2fe9ad14c28747e45466847d71c49d1355aa845a5c0fb27160156d49a3af1d8b975d694186b06a5b1111ac504df3f91ce9a4b2e248697f9a972e7b0cd048c1b6f7581af20afae4c1b9333f60e73a0dd1ceb2e19887cc712d0bbb5c24054553c3c7c972e87253d4c46c971826e8955ac0017ca6d6550335916d6a939f5c167bd68c09d85650e89b40a4686ff0bbd921ac3e43641b1600a84bad0fec9524f09fc920916a31b081e88a36803715b1476e57ce39ec27fbb04256ca64fd11225e474b06bcac9657b31de3a39f4cab5b65bcd8896655eb924243972b0bc9b755b0c69b837030a07937652c8c14f71745572882d222ba1208327d3228f0778a215b8fe6f4a14a9b3a56ecc56f09c49ca31cda853db12a2fe5d395a00cce6621833e61c2cea5bd6f0bcc6ec6b479e334fa543229b619be566e8c00a1dc7837c7b5651b8b6a94412ccddb63b8213635a5745a54bb56198d325a59109c75d2b733c77738a1328bf1370ed99b7ed8f611e69c3ed82620ce95088a91c6c6d472294260a1c5455291188e010a9467c816938f9835c1a4fa01223494c885642e5c416c82223d614a108a1128e53d9b264d61d798c4ca9bf6abc72fe779346a3208a77542272b591a6ae781996ef17961284666c85ba91b2de5f0bf9af10eb91c5793e48fdf367f46f586e05b2dd65b262506043de419482071dbaa2568256a14825b8f094b796a527fd25b8071a4041a1be279c2e3f543021364a147cff6740ba448b7010b4ddba6aa90265a95905f141a9374970a1a071799d813ecd77073b453cb2b6d83ac9cb8267a5861b9e2f23d345581a074657554781e4782d98333f1237dcafa48087aa66de4209a9a78700b09d44a0b5c929ae6612acf6b5d8ad20404a161fdd3639e659bf88291d41711015432f0e7ac759a67e0324f94c1876314687ac377ae48a30b48ba9986714ef3064f087c953ac6f86430bba9cef9857b849315dc4379799092af4c5531fc13f63b186939040da2233be05371d448fa748d76f98c3f638a6bf5864b9bc5fbe496d72966e3004409e420bc4353a5d55d0610843d0b8e6ee5bb5d6c4dd1462ae99a43df586b398a15ff5b5ff58a4006987613f5caba694dc0f736f6d47af66673e8f308a6044338d23c817c0420e679ef621739e21a4a35140dd2928e79584f787671b118e9e71e1d9430b9a3210e11c266876a44c7082e7ca5f6dc4b8d931f5bfa302fc790bd424cc3643844418f6c090e2cf5bf60f08c489bb87315464d90006375c34a5297a238a117a8770cb9795776c11f8a54ff13adb3fa77df3757938c28d03a612324858a11a860235e0e15284e36035bfc0178db841c679a47b93e3b09a9f735955d6bce328a91f2fa64273917b7371fbf166c47e9683776aec02251eddc84032cb0a852594f4c7875792fa345a43a68a193c51492a39c306b02f22c60ce5a8468c3050cc3965e2982e32b938a31cab1f36c1da3ca723261be3a864e2912199262c46741fddca501df33d04a79f8e3017e6197ab24b062cd98486dce2a7ffb22e5798643cf9ba5 +private_key: c0b38724691a735c3fd82033d0535c3758a5d4298ddcf542556b73ec6009c4640f5c26471849a2289c469a975839fa5d4b389e75f8423a4633ebd29d8d1a5c19e609f12240edf33ae9c07cf93c18950cb1dbb07963d69dd1e2447db0500255098cb88083a633c5181f75d53a7f0681900747c8eab98d3aac6ff35d2bb01c80a1cb4e5a654a852a07614da10c5ec8071ac3d6394b3a13d47312f03229604c682f05245cec41b3b55098090b6044a1a3c0af26ab4a6ba21ecd50a08d8723d32563c36aa8c3bb01fa3798c42aaaaadb9d0ac8925342264dd4072db982309c0460d7380f02cf5ec0afe3fa13c7297337dc205c0a1f8b3109363765d44a29f1a7bd2b17c24c3130c26a8b872575970239ef12352eb15aab0c9a96b5c51f47370aa5372bc97a22a4029ea0b9156622903354f5a1cb3d49693a198413380075174d2969a95831b1051ab40d1344d809cec691717579a1b7eb52c9087d9244cf9ae6bdc32766b694708d1ba22fc76b042a6f9ad668971b4767e6a54a95290b699a04788edea5c914e3cb431337c0736efe7244d139bbbba28ce82b72ae92a23121b7560c9db5b908bd12539890a172f4c68f381d1c7b562b1b5bd88046359c29dd933ba1ec1f47bc4c485c8dd599767822ca7c4cb300954821695eb5eb2f87fba33d61284b187ca6726a1be742286959e38456594763f5ea53b9a7959382c348c7449783b5c784522f44aa3c25bd21d48660f78f70a00e49e59bead90c4c8367c22981d8ca6b5c198cb5906b12c55915232afc1a4b1ce5c4ff346f5f536fe68ab9d816c98dd6c5ee103d251874b4cb0554f38ad0712ba687634882856d453daef102d3835cd81b5791a50ed5934a0734a81fc78c6ea23ab2d96b679866458c21ed50abce98875167361a62991052bfc7123cd4f9b5e0e98c4266536573742c431d9d343bcb9a8bc1e2a927496a71d73ab6195cd7194d31ba631d025570725e6b37abdd60a545d2cd2532b32a9548f1a319df6184614405832954d89a61dce3b5cbdb1ff691550117402c027da07b2b5bc20b25ca36b0e70d45771e3561526950a8216a7f09db88ee46578a107ec0a46f932751d77a167c4809c14ca056923d2f540692c9b8de07cc05a55aa5aca7607a5f5b071139620ad4309e2e3a2995a31059cb8f3d09b65f171bc3740df13cc63e51bbc33b7922951073ac3e51013b39a0464ea67a9d5a76546227ea7974e1b61847036d94e13201644d585cc7b4c9aa301980eeba05e9e21dcc5163f7802dd3557e0fd6aefa1305e2f84bc42c8fc057a4adb58d3545ca8d767ae622cf7bd3c3178b92c5e776695ba375fb841e12760656befcb915d6a51f2cac896d7380a879a41001ce067a602a73cdce00a4321aa880b7382407c3da7a3702f28a098719e3822d6d8c12c88b460e691dda17bc4f5b589f2b46fc773fefa492e1112cfac69392c80abc1084e68903be87b76364caf5fc82039015bef0c9fee65311407f970b695c8759287898ea39bba8f61fe9d48936b1935b2a2770d498fc2bb22df5980904759ba64f05230378266c8114a7b3a1a5e33129efb4a52fc163628c5c1a65a0441325b3f3b8bcbc7dea5c42c7897aa8956473d54ed8b6c56dc931d12a8092102490881b4e2064c5a9588e257834c1aea2668e69d907db5158c3cc7321d83b9703cb74864c1057660b718c3412cc47bb92612643313c356b6b2cdeac80ec5b657e78cb2fe9ad14c28747e45466847d71c49d1355aa845a5c0fb27160156d49a3af1d8b975d694186b06a5b1111ac504df3f91ce9a4b2e248697f9a972e7b0cd048c1b6f7581af20afae4c1b9333f60e73a0dd1ceb2e19887cc712d0bbb5c24054553c3c7c972e87253d4c46c971826e8955ac0017ca6d6550335916d6a939f5c167bd68c09d85650e89b40a4686ff0bbd921ac3e43641b1600a84bad0fec9524f09fc920916a31b081e88a36803715b1476e57ce39ec27fbb04256ca64fd11225e474b06bcac9657b31de3a39f4cab5b65bcd8896655eb924243972b0bc9b755b0c69b837030a07937652c8c14f71745572882d222ba1208327d3228f0778a215b8fe6f4a14a9b3a56ecc56f09c49ca31cda853db12a2fe5d395a00cce6621833e61c2cea5bd6f0bcc6ec6b479e334fa543229b619be566e8c00a1dc7837c7b5651b8b6a94412ccddb63b8213635a5745a54bb56198d325a59109c75d2b733c77738a1328bf1370ed99b7ed8f611e69c3ed82620ce95088a91c6c6d472294260a1c5455291188e010a9467c816938f9835c1a4fa01223494c885642e5c416c82223d614a108a1128e53d9b264d61d798c4ca9bf6abc72fe779346a3208a77542272b591a6ae781996ef17961284666c85ba91b2de5f0bf9af10eb91c5793e48fdf367f46f586e05b2dd65b262506043de419482071dbaa2568256a14825b8f094b796a527fd25b8071a4041a1be279c2e3f543021364a147cff6740ba448b7010b4ddba6aa90265a95905f141a9374970a1a071799d813ecd77073b453cb2b6d83ac9cb8267a5861b9e2f23d345581a074657554781e4782d98333f1237dcafa48087aa66de4209a9a78700b09d44a0b5c929ae6612acf6b5d8ad20404a161fdd3639e659bf88291d41711015432f0e7ac759a67e0324f94c1876314687ac377ae48a30b48ba9986714ef3064f087c953ac6f86430bba9cef9857b849315dc4379799092af4c5531fc13f63b186939040da2233be05371d448fa748d76f98c3f638a6bf5864b9bc5fbe496d72966e3004409e420bc4353a5d55d0610843d0b8e6ee5bb5d6c4dd1462ae99a43df586b398a15ff5b5ff58a4006987613f5caba694dc0f736f6d47af66673e8f308a6044338d23c817c0420e679ef621739e21a4a35140dd2928e79584f787671b118e9e71e1d9430b9a3210e11c266876a44c7082e7ca5f6dc4b8d931f5bfa302fc790bd424cc3643844418f6c090e2cf5bf60f08c489bb87315464d90006375c34a5297a238a117a8770cb9795776c11f8a54ff13adb3fa77df3757938c28d03a612324858a11a860235e0e15284e36035bfc0178db841c679a47b93e3b09a9f735955d6bce328a91f2fa64273917b7371fbf166c47e9683776aec02251eddc84032cb0a852594f4c7875792fa345a43a68a193c51492a39c306b02f22c60ce5a8468c3050cc3965e2982e32b938a31cab1f36c1da3ca723261be3a864e2912199262c46741fddca501df33d04a79f8e3017e6197ab24b062cd98486dce2a7ffb22e5798643cf9ba5fa06bb0ff42f4d610a7b3df7544d66b97a486967cd9b62ba0142ebb10b8ee4ee0f6aa3e88f7fa8a96067f8cdaeceeac90c2d0b5e277e56e9c405ec9420c30252 + +# Official test vector 18, seed: "d5f23808871544e9c1d6eace2028362b48e225312f77663e9f78cafeb512b908cd9e25875d61a16ec615f4b8ff826856" +seed: 9f52af92ca165fdc38788f2b59ba02e01c8281ff7c1e60504688043a5fe814b04f3029e1be4e1c0258c3a22ff5b50b2674cc094ba7018da2a61569845c17d26f +public_key: 6f22424d97bfe0b7cfeba385c55253559b0372fac0c533055ee490bed57446b637fd0c07c173b2c61345185a0288f1aa074accae383c75208fa03a6a175c3d19481e79ec833057a8d2c234ae9b01376c21bc75277738b17dea03eae594ea939e125c2592bcc95d3cb4f76a8d8383b318a48f7481b6b8419e8bb47cf1229c23c4800788cf91e465088a580762ac5d31616f114606c54efa9c0490298ccc23200154342dc7709a5ca5ca3a94b7a2ad8ea734b6e20a2d15acd47c6aeada3ef3331fcae173af5191ca8b74bee31f1b7506b595a3dee0899381111680ab02090429b93efb7b52a6884d401841a0d8193953a5a5f2417df927e5934c109722cfe18d0ff93a3df69d9cfa4d7f5801d3294771156e828924c65a18bc798006a1c8eefc3b4176634690c061b902738024c0ab981c3506d11b8f307c8f1cbc25ec764fdad76fb2117aff430c5a5a468f2966bbb877d2b8335ba3bfca985864f21a9912bea56a007e7223c7249b2e45a37db9c104438e76d16321289d4b07001241aa2f0a1a24d81c27a9adc0c768e1b3c72fa08e33f77c90f4cbdd530949b2b67da9a15f336b679937aa825989b9a450fa5f69304d37e585bc039a154257ee78907f689dfdb246d05c94c3057066d03a2f9825be6a52c3376efbea3fdeba68e13716d810b73662adda56bf30031b8f682c8ab08c4b0978bdf113b4432ec712ba306a63c327978224597c3b8155551997bb7e2881102d8b3eef786be65196ba84478c1c629f45a885db1aa4ca443d8a3300316608e8c2f71c6c7516ca5eb453cf9184bed2888ec592dcd53fed23b5ceb98cb575c474b51e7fd64d73d54f37b51fe1d432b2150ecd5b0dade606d83729586b2fdc60414a558c3c19122e47858675179c2229779b40cd882bfeb3059ffaa93552443fb70fcabb54a7015f8b6a0798b090fec5aef185cc95579aae5caa2b4923ddf65b2570c15b1b0464c086114975dbaac5a564cdfe02cbce8c68752000ee81a9eeac55d4a81be9b3c66aa3875761049565a46e305459fc7a47d75316b59a371cab01dc3bfe9108003d5f868b39ea617ce3091e3ab646db07ccc4a09367b352d1848b26e920100827c8d4c92f0c222d8482606233adbaba3005b58fd3248e67cc75733feb52a5acf5a41ab71ce0ab7e8fca8113261dd4b7297ffc9d37899ab40b0637c02ff1c73e81a02762fb264f51c849d387b9f7aea345b5e2ec44f2e0866b9574bcb13ea0d0aeb7a78d6dc7b5b0c9838297c05409bf90d86b3c1b59b92c998a8abf34fc490259289b431c5c5368acd762df8ca04e0235ae91bfd5332d67169aac2586deca4c8174386617ac98471366283f3d30a971c62f35322ac96a7b0c45779f6c17f1117a2f1b454e3557ce5733cf979156400c5a780a4da91ab8d99c4f98b141920731f361ec30950bd0c5653c83dba87658674c57473dafac42f293bee44034b9489ccfd5141ee42cd91b3c3cbacba092cfef6ba4b0a716d8162521b29853522356943c697a10948a50f27008d8a303254327c4570af822024f5b9aea82a62100856b2140015418a9ba3e77325b911a582e92a8b8e123816405ed8382820c0ce5ca491c0692b2b542b6a67ec87bb6b0334c1833e12aa958fcc0747802853f8536c1e24a0ea6e13ce23c96726b5cc8 +private_key: d95b5c5667b797b1797a73806df8906819743e0322070c80d97b77242040a2c6154ce152e2bacf89ba871dcb835aa873133a331dd3450bb51893cbc5b072459026552001c56e6a9ec0da3ace136b5ee150946406f032a475d8cd05c31c14897445ebbb24cba8a9e9b9fc819d752a5f6830162c89c4e7e16dc3b12823739d44c063f55aaadcb03d02c3325649afa5a63e26a23f16cb48091b388f503f9eb6751d44bcf61989fa953c10a5b8ea9ca81c56a04498509f380c1675b273415bc9285d0e765b0222927a979ea9a47b9103c0b73326a35945ec1cc870a693980cb73722b855690bccca1df9290d15b6cc53db8b99a89395994e3f39c13c81b9f3a313a6ac1407585ae1015eb2298defd84a5258a2e62aabe709c8243679dd85b82c08a82021206cf0424b7cab4df614aa21c81d931fc5f0bab9f373fc4a98484bc6fd5606af987bf57842cc4461014c4c737b6a52234153986aafd737d4a834971b96a711693716cdd1639f822a43936b94b7421bdd660503f3034c0c2596e8155684abc1e81c218151e2d44845d781e4a54f33fa8eaa0cae0d96c3509c6e5a973272c0b7616a929a579d6d9b83ca8c6631b87f94457312d9c58f66b20c04297b881d11e9c97357a9b0e50572b3430722963869ca2a1688f623b5a3224d2afb7bf6f4ca115198beb213679c210067a32219cb9557042018467863c10a4b449bea2b486a85ebc0ba8da9a3ca50a632451a5754b7eb0b7067c2c939bc192bdb8315427146ab6fe7390ab60264b0875fd2603d09466acb2694091340bc8c6df3fb8eaef1664b533c0e377bfd0bca39f801f40a92989619c41756af7b4cc7551c8779558ad4031a6459e6abbd9fc68103fbb95182c9576135e154a619180b1a694e384212fa89963360791666968cd9aa5ed3bc0f72939c24cda10a9f2a62aa4cba9b9d677c5df1282e47c29a790bdbdb664ddb30cb154d01da8e87035d62a099a9e9a47f019d6a769579eabddc851416fc9a2f144b2d2c3fecf889f19a2acc434919a89d474ac628c03ed6050b3503c2ccb4612eeb831ceb76ec9798c2738429dc10386b36be606622d2152db389b200c219e4957bb6ac6f59739bb60de382c88ebc442fc16e5b55cfdda0c9b78a18b07a5e72ea3927070d7d15951f87b0e09bbc631bca04fa0d5f4630fd04a16d24bbcf351c806c07c32aa05b19009b66181413c202536d52b8946fd8bbc65215749359a3687cca6982c3ab0435da4edf454a69b23726c503cba4ced872311799c4ce57c0e1fc48cff587c4b552da83b5472353c711c6f220bb72540cfa651352287e88d0624df8248b17914f654a61ac0fc30856cad09f5fb984a8e334b5333c3010c1bff26fa7164058b2343fec330f4c2e93b07c7e568d6f437c0a307131c70e0821637519b1673a3846829ae11ca2801b5a5eab191ce686ebd2c2a8695f357bbcf18c95c51591b67aca77521de32b1426173a0e059686007508da93ce9089bbd43479183d0705496d1709ef41424219054be29ec816868a95146ac5106e261d6331a692306bf9013207d60a7f1519d0d7ccc03755eb5c31a2982a81339cee7b810727471d447df481b87da70f7651b7eff647a2eca76f22424d97bfe0b7cfeba385c55253559b0372fac0c533055ee490bed57446b637fd0c07c173b2c61345185a0288f1aa074accae383c75208fa03a6a175c3d19481e79ec833057a8d2c234ae9b01376c21bc75277738b17dea03eae594ea939e125c2592bcc95d3cb4f76a8d8383b318a48f7481b6b8419e8bb47cf1229c23c4800788cf91e465088a580762ac5d31616f114606c54efa9c0490298ccc23200154342dc7709a5ca5ca3a94b7a2ad8ea734b6e20a2d15acd47c6aeada3ef3331fcae173af5191ca8b74bee31f1b7506b595a3dee0899381111680ab02090429b93efb7b52a6884d401841a0d8193953a5a5f2417df927e5934c109722cfe18d0ff93a3df69d9cfa4d7f5801d3294771156e828924c65a18bc798006a1c8eefc3b4176634690c061b902738024c0ab981c3506d11b8f307c8f1cbc25ec764fdad76fb2117aff430c5a5a468f2966bbb877d2b8335ba3bfca985864f21a9912bea56a007e7223c7249b2e45a37db9c104438e76d16321289d4b07001241aa2f0a1a24d81c27a9adc0c768e1b3c72fa08e33f77c90f4cbdd530949b2b67da9a15f336b679937aa825989b9a450fa5f69304d37e585bc039a154257ee78907f689dfdb246d05c94c3057066d03a2f9825be6a52c3376efbea3fdeba68e13716d810b73662adda56bf30031b8f682c8ab08c4b0978bdf113b4432ec712ba306a63c327978224597c3b8155551997bb7e2881102d8b3eef786be65196ba84478c1c629f45a885db1aa4ca443d8a3300316608e8c2f71c6c7516ca5eb453cf9184bed2888ec592dcd53fed23b5ceb98cb575c474b51e7fd64d73d54f37b51fe1d432b2150ecd5b0dade606d83729586b2fdc60414a558c3c19122e47858675179c2229779b40cd882bfeb3059ffaa93552443fb70fcabb54a7015f8b6a0798b090fec5aef185cc95579aae5caa2b4923ddf65b2570c15b1b0464c086114975dbaac5a564cdfe02cbce8c68752000ee81a9eeac55d4a81be9b3c66aa3875761049565a46e305459fc7a47d75316b59a371cab01dc3bfe9108003d5f868b39ea617ce3091e3ab646db07ccc4a09367b352d1848b26e920100827c8d4c92f0c222d8482606233adbaba3005b58fd3248e67cc75733feb52a5acf5a41ab71ce0ab7e8fca8113261dd4b7297ffc9d37899ab40b0637c02ff1c73e81a02762fb264f51c849d387b9f7aea345b5e2ec44f2e0866b9574bcb13ea0d0aeb7a78d6dc7b5b0c9838297c05409bf90d86b3c1b59b92c998a8abf34fc490259289b431c5c5368acd762df8ca04e0235ae91bfd5332d67169aac2586deca4c8174386617ac98471366283f3d30a971c62f35322ac96a7b0c45779f6c17f1117a2f1b454e3557ce5733cf979156400c5a780a4da91ab8d99c4f98b141920731f361ec30950bd0c5653c83dba87658674c57473dafac42f293bee44034b9489ccfd5141ee42cd91b3c3cbacba092cfef6ba4b0a716d8162521b29853522356943c697a10948a50f27008d8a303254327c4570af822024f5b9aea82a62100856b2140015418a9ba3e77325b911a582e92a8b8e123816405ed8382820c0ce5ca491c0692b2b542b6a67ec87bb6b0334c1833e12aa958fcc0747802853f8536c1e24a0ea6e13ce23c96726b5cc886538ecdf65b7a485b73a34a72193af1ea3f884d820463601c7f843672bbec7d4f3029e1be4e1c0258c3a22ff5b50b2674cc094ba7018da2a61569845c17d26f + +# Official test vector 19, seed: "822cb47be2266e182f34546924d753a5e3369011047e6950b00bc392f8fec19ea87c26d8021d377df86dc76c24c5f827" +seed: 851ea90fd3854cbf28fe39fb81f68e4b14345cf0d6eee7ec4ce772513df8410d1c0ec046899a777655233e4e1b5ca44e9afbdc67964bfd5d5e3dbb45e60d03cf +public_key: 010510677c6c12c76cf7149f35031c8df3b243140f9716a571f62a5365a0830169b612abf0075ab40132d51070aec5566fe953382ac3a3705b8566064af52b926b765bc039d6f86ab8b27cb93b809e670da4457bfb8b6be9aa54d9b2bc94eb0c3e15ba6ce2b08ad229a469312a5caa04c8a4fca7c76cf905c6fc4d32127d84981608810a4752b9f26baa12665bdf30882d2a38200798de4a5f1d3bbb571085ab091c03e896f25b8759e43795dc83c2069fcb2cad05b166def78d18b920e0e59853c66bcb11795f604963ac3af33b43f78252e06b39d11449012b0b35bc65c2562a66f7597302377eb13119fb4285d5613d618c2227a8a187b132b08bf5b154745451fa627e0587c24118573f3628e3da59e96c6a66d26c2880c95eb1abd96202b3673bd64a74d1b11396aa406d378183325c9d03b8294177d3d6439fa79a2a6457d9f81ba8134bc781c575413e40082c686ac2f59c3fb45a580d3a50add274add391a09cb6c559623c997da498c1d002b0f9b5254c26266757849e7598c941333d580a11a1c197617b23d98b7da60b6af0521e287f8b0cb21522236395a60af9ca4dc7120925a4bf497e2ed65bcce78a33555ea459197bd5a499bc7c2b788872916ab3b961f25094cc96659db67bfeab52260456bb775f56e492564456c5d25f3d0c9bbe7118615aa37b21547255112e590eec52928173292450abf2e834f6207751b068200875d7303e3bf7141f28aec8653a463a774dbc33772849385304b42c99d3e531b0376beb153a56734887c1cbe59b55bc3cbb32da63d908345b200cfdd6303f3999bc873db53342aae6ccc789b2a4c72c7d08a58feb9c939a3214aa3b2bd27ab108aa89682e08729cbaf93a68613a8f56b7764c23cf085f6a970d8abac213f7314128aa64da213d5a53d2475f7002a6c354c1181bacaed645fae9c7509a0b10c8317f714d37f3791c03ce39c79aa0548f88a69dd6f87dd49a8e63307331e00c5c5b5fd7d9804f3c57028c2d3fe65d87ba7c07624fa35754421c4eea618cda1c5434b09acd0754e04439240988ebfb5f6d6a43c0683a287b5686364fb9fc6a62551916046442004caa42428dac71ef5879bebb09c5dc919076620b9701a2d8af248672e2ac0107c62159511cde45120ab84993fbbe65022dcaa6369508212d7a915183555181b1b9610dd147516f2496eab20f727724d7178357f50e23691c29400bf461c389932e2e663faf31ac53273058ba675cc0c3367c4872383f683a834b4a522b92276f70022153aaf4622f24f439a0d382fbf5059744c487013501d41fe9a99966506f2f5651b3ab0fd0a73c02634dae9695e850c67b154455aa749922229090b621e259d1f193b524579690262f94c114d9c690e170e526a99f5149a2840129d22c740cb5b2a50ae7809388147b943a4263d50ce72a2fc2fb6efc85c065502642f015d6b83aaf0880b715983bac12fed75b1c973046c79f72436a420b790543349b917fc4c3b18db80a1ad346389180fbb9bba1a6a8a0f0a62e6c24d580a16580c682553134738d0cc1ce766c13bf74c82ef5c548f79de19a0f2a9236100a7adc1b2f1e1b1d0066b9352ccc40663d53b0af0df9ccd6353381e5030ac08c3920847f233164df98ae8ab017efb305fcc83fbd22ea59ee59bb +private_key: 9d897195e7139d5b6b8075aeb5d176b60bbbad949d5890c707f460341c12a79ac5e18a9126c7c2d0d59456d1ca072034706bc5444519fbea529b17b3306113f73c840ad3bc015862de98ce93344a849094ea71a6d5b1742fd2a811d389ca465419cb8aee9b2dc3961c4723a7bffc96acbc79dc4b17c99b4022655d7ccc0a645981b990ad8ab7b9fe6a69b511731c84a2df77c2bd917f1220235e91ae5fe91e30573dd67a16ccecb18f4b9116958f812c7fbccca50ed732b3b946645b409b74bbf34c3769757c0aa0a04d690fc2c14df10b334c089adb54cf6b731377d433cafba345dbaf06366eda0975aff207e0d545a31aada7f85369b62f7d1983997a542e899aa2651a0f3417b142bf1317aa9b766de2135546fb2224d5aa298bb4a90b4aa92a11ede75f441734283a2baccc2f2b851a6c314e81ea510c7a31f85855fe55ce0656a88ee689339495d5c293f483bc67e49c86644d08d896681cb2d28278dcfba73c2bc2e050c9e277ba7aac072724b7c02c2ff0e24a48ec9d8b46298d14657fc74dabf368c6b0272fe3a5ad280130936a2db57e5d971d18916ec39b9960c73e2bcb5697e9690900b9f25496127a58d50062ce88c0f3ac9dc60b9a9f82406e0b0f7c6898806807f6bb9e0945b7563136cabbcaac04c6b0ec8eaa60c26fa604b073a0ca8a925ac99bce9bce26fc7ab69c9a1509c7ae8c97e006b5b8f3a99db2850332986d65b17a67a1d2cc80d476cc3a90cd419920e302074925375987cb7d268ff1eb4adb07cc4d133c381b47c40b42311a8f21881f50ea68343483ed6bbf34344d710c7e0f769eca3388b84c62688b4cfec37104f0717cda20e21b871e267fd275826da7aa92b372fac774b1611b18e35dd6db3e52a58c015a8badb33c54a60aa4005d55eb16af7547d217670a621908a9b25bdbac84753495c244af191f7d73ac08c94b7c1b522916790a245d6de2b274250159f89bb47a1e7c0850cb97bc843a7a29e594a5428c2ebbcca5a989993934b9a36ed1e7561663a8c9d400ccaa7d5cf4484cbbc80dc6b3ac20926b3a49941903c4eb41fb988f0d77a8d26c2c68a14a0162b926f4bd8a26c45e76c706f68bcd738626a2afd235638f6741d229427ab4166920850db4661d4019fd7ba362065aced015ba3259eeaaa4acd2cf8b1189e4e1c4a3d67982d942ff2734e3434a45e842e157103890c7d3510134466884bc16d7078430e2048fcb58ff0717a5e6987999a5400973809c30cbcca50efc4ed5c1a37f3a0ec71842d88b35d53c49b040bea967a8466772e9e3486306a0cbdc449db2099c349970e8462093b398b7ba10b505a76c4aedaa4ea661af1a712a560417cee26c4b109d8be72b88467752f5cefcc752ab3c324d2684b1145f4e7715e9d98f0a1bcd3f1a567676a138213e202aafba10c15ac75b45e06a43987d9f6c07de147e05f42693d12f9a8877a2cbc7f2e81ff9540ac09bc620527e919542fbe53379519f35c70a4e0ca6f0253caacc2ec83749aeba42bd4a0fb6902946da8320ec2e7954bf2a184f94a31e58c505b1d1ab9c3a19aa8a3c1da7274838c768e21978982f95c41998058c9b58b861b1090a5bc3277a1346f2108db4c0399454010510677c6c12c76cf7149f35031c8df3b243140f9716a571f62a5365a0830169b612abf0075ab40132d51070aec5566fe953382ac3a3705b8566064af52b926b765bc039d6f86ab8b27cb93b809e670da4457bfb8b6be9aa54d9b2bc94eb0c3e15ba6ce2b08ad229a469312a5caa04c8a4fca7c76cf905c6fc4d32127d84981608810a4752b9f26baa12665bdf30882d2a38200798de4a5f1d3bbb571085ab091c03e896f25b8759e43795dc83c2069fcb2cad05b166def78d18b920e0e59853c66bcb11795f604963ac3af33b43f78252e06b39d11449012b0b35bc65c2562a66f7597302377eb13119fb4285d5613d618c2227a8a187b132b08bf5b154745451fa627e0587c24118573f3628e3da59e96c6a66d26c2880c95eb1abd96202b3673bd64a74d1b11396aa406d378183325c9d03b8294177d3d6439fa79a2a6457d9f81ba8134bc781c575413e40082c686ac2f59c3fb45a580d3a50add274add391a09cb6c559623c997da498c1d002b0f9b5254c26266757849e7598c941333d580a11a1c197617b23d98b7da60b6af0521e287f8b0cb21522236395a60af9ca4dc7120925a4bf497e2ed65bcce78a33555ea459197bd5a499bc7c2b788872916ab3b961f25094cc96659db67bfeab52260456bb775f56e492564456c5d25f3d0c9bbe7118615aa37b21547255112e590eec52928173292450abf2e834f6207751b068200875d7303e3bf7141f28aec8653a463a774dbc33772849385304b42c99d3e531b0376beb153a56734887c1cbe59b55bc3cbb32da63d908345b200cfdd6303f3999bc873db53342aae6ccc789b2a4c72c7d08a58feb9c939a3214aa3b2bd27ab108aa89682e08729cbaf93a68613a8f56b7764c23cf085f6a970d8abac213f7314128aa64da213d5a53d2475f7002a6c354c1181bacaed645fae9c7509a0b10c8317f714d37f3791c03ce39c79aa0548f88a69dd6f87dd49a8e63307331e00c5c5b5fd7d9804f3c57028c2d3fe65d87ba7c07624fa35754421c4eea618cda1c5434b09acd0754e04439240988ebfb5f6d6a43c0683a287b5686364fb9fc6a62551916046442004caa42428dac71ef5879bebb09c5dc919076620b9701a2d8af248672e2ac0107c62159511cde45120ab84993fbbe65022dcaa6369508212d7a915183555181b1b9610dd147516f2496eab20f727724d7178357f50e23691c29400bf461c389932e2e663faf31ac53273058ba675cc0c3367c4872383f683a834b4a522b92276f70022153aaf4622f24f439a0d382fbf5059744c487013501d41fe9a99966506f2f5651b3ab0fd0a73c02634dae9695e850c67b154455aa749922229090b621e259d1f193b524579690262f94c114d9c690e170e526a99f5149a2840129d22c740cb5b2a50ae7809388147b943a4263d50ce72a2fc2fb6efc85c065502642f015d6b83aaf0880b715983bac12fed75b1c973046c79f72436a420b790543349b917fc4c3b18db80a1ad346389180fbb9bba1a6a8a0f0a62e6c24d580a16580c682553134738d0cc1ce766c13bf74c82ef5c548f79de19a0f2a9236100a7adc1b2f1e1b1d0066b9352ccc40663d53b0af0df9ccd6353381e5030ac08c3920847f233164df98ae8ab017efb305fcc83fbd22ea59ee59bb27757389a4a68c898dab92d0f63c3340dfba51e00312a05e721932b95b11f6da1c0ec046899a777655233e4e1b5ca44e9afbdc67964bfd5d5e3dbb45e60d03cf + +# Official test vector 20, seed: "81401db81138d6874e91b7c11d59596e4ace543f5a3471b6fb00999221765fec3ca057abe20f03b2d59003375fd71fe8" +seed: d304c9389cc973477f169788abcb9d511f843219d246a9b587822f422a70c2386590a2e5c7ed86cf2c5c2a898662bc9a81418720bbb632ef9cf0b845ed052d73 +public_key: 801c4c929171c164522aa3ac2361b8c80b8cd3e644f7d169f9a20380bc575968901ed7783b6969c57461dd879d4781bda106a913c629be512788d4c1f92a71f9f819ab7207d1a65499e061c5e0447360b4e70503bd58511e4c3333556b75f6a8945b8661d0572c764c82ca70ec870ccde0cc5810b816c10a46491e091c75f8b24eb975867e179d38345bdedc627a725b4d732b7b453d9b15710fe7afbc55beb26c77e9e8a58bfa764fa430f1901928fa4ea1eabe2ee827d44191708310b5e708dea4c5242a8949f658b548a2ad1badb9a6322c56697b513bc1c29872b56fe1e32d9271b44ea0b43bb896ca9a7358f45e1f1821fcb361c6ea91abca91ce95a75588402d1217d1e37a80b3c880aa83c31c5683783e3bc77bc231afc0172beb9957fd7228d8589bc171a2fe24757400cc7e9cab13d90a2cc12b771725e0f2180acc221fe5879a317fb93a10682044d6e22ac67c0722c1062ee70959333c08aaa16bd9cc1b624405f40b78411baf7bcb4af46b80ab021d7c8a02ec8d0417b759cb2dce94409be96f5b5abd1e207a9b906c71c18c763414b2d48d77c19d8e617dc4e41c3328ae39c18aa9aca985964597686c919584114c4b2429308e123fbe9a8fb86327054817bca07df8c7adb4e2a941742395cb6ea24c6106eb95cc0868f8a6452efc5aed297d933919b39a8da93137925b87ada9a5cbfc5a541c2395bbca59f95ab2c4a5352831f0d143dac60b418c2051390396326d49e27b7b6159c43b5de3e40d05956dab59088f417302588e38c1a21261c62abc8891e44ec4c7395421ac09e1b448bc2349dc88c571c74e470474935ec58001be48b854a13d9855b8c87131985c91484a695ce9931267c1d0d0b9ceb4bc7c4a11676c267958566d59431a630d4ecaa8beb98bafd22172a30e14c9acdba26922f0aae067c9a0e9b658630873139b9555b63a73bf8c65319d9423d4a927abe86a95b383a7c0c8c54170dcc70a535b1fd814cb6c87900ea94eed7b51cba571dc7b5e6370bf4928bbb27b1f66d770e43cbbf3ec0c615521e2b8adddb42971a12db3a208f6b690289b059913760471367b4154113c14606c046a9591aa744683c4024b857293eb0e02ec7c75270c571248c0aacfa7e47a35e72157877847db1efd73c0922cb211c4538d018c05382e9c97c3d98cb375f78d056196466519baf3312559315796ce3504731e811432a83294d75d8365391fb348f0136a7fd90921fc3844f57d286845d6d663e855b50d884f511a2020b09048298dc4da2be4a8398d260ca4735d84f2b66b2405d48032cf3174fb36b325e723af241d280863b4d2099fb429c0414433786d33f880d7a15d3fe019e75861c7836490ca2a5b0771ecf904f794c746b4244d99226899c847814967454d7a4aa0fa743e2d2838bc9461446b61d9b006b4240098f37021c7631131a84bd75d33374b9067aff5e900c4d0490995875606a7baf87b8f4960dc84a7eba96f4055ab6043c9fab61fbed883705893aa89899ab975284867f63035a392902a779c8df9cc63a1b944943691b770a9646cc731a93f6cb3dc3b183b71429770032d08a778217f9b72bb16ca81f07c66d436396038372aeb8edc031083d95399084751bb9f3d32490393b510796c16c630cd2d7e0666cab62b5d904b +private_key: f789391672b25e088e06ab6e0167cbfd56b01c01876cc67ea0cb13a4491472c4710f9cafb5d1068c207fa9875879dcbf60e78bb6236f2f00bc77f81b98d74da1f3354de5007c0b5243d15dc87282f2b2c298a5324f35cd2e6327a7008c51d2815d833e17f09b91a047d15b25e0c9782d34bc474a973ebb1585a23bdc22811448299a0a6d42669b31951da1f949e8573292089bf6b0b866f4cea0bb110fa5435550c11c477622b6c859691be5683198c198d2960f8932606dc3310f3193663abf161bcc6e1521a3c527b946a8cd20bb9c4b0627e9778e521ed5ebb7d727c79b687214c1c55b9a5da230598ec71dad4ab1833911e991531f0a32ed2a773d05a9c166cd4cf4c625f3665bc80bf1d46f88560800ec2c04a92fad947e406b8a14061642d879b6f14a4b2651d3e1c502322b256a7c0fe403038125c9f5412b5c0fb62bbc8ee41dcf071c5236c4d54621010a088970c956a5588696412d75b9e6f5a920481349634956a9a097cc8a0a5897a6fb60cc103aa1136131c5b30f4469a73c52d43578df35914d5436818a16d3eb44ef9760922c354356279b793a05a93214ac499b454e4b66ac1c1188e0c8375d0221c8b80012f21305b57ab023b822ba5de2d96f4bc0a2420ccc8afb3d9a983a59a46d4a32c3ee764b0d696669ea5b458816be782f3db39df35b6624a59f092782c886806d8503ea4c177e7385fed9c8d7416bbb9708cf8cc32a2b3e198b2c93bbbebb7aaf53f811ce50cbf173a92580861af698451c77fe1556d79a486dc75dbdfa3a09eb150f477c87857b0352418c4a66c57a0f73f60a16941ca247b4981c4aebd24985062b1fbb2f85323f87f248a71657760c8766900a1f260f2f9b2a4bb1073746ac6b73998b6171597b9d7fc42b873271801b6dd111162f7b2ffb55b044e08983f6ae95f731d0c32fb8d3108d4a048255a42ee290d33031521b46579c864cc04652e59252a3bcf315577c31695d6c8e44517b5ff76a75acc608b180a6d10842c4c92aa0ac13a5515d6c21ef25cdd3f81556f336f1da4e7fb89b73c195dfd5c772b5abf20223ce84c297b32e57a1467225314c37a27eb43f0df947b8baa3cd38b6c5cb2e5a99cc35b9637fdb1ea82c5fc3ab3c9db9cc9491b6095c499a2377a698b5b77799b1d00412d0c258d48e86801bf267cb01f17d335bbf4406463ed9c6575b10ba16622c888517579d68129603b0bdfd8284351183b6114ce424557eea2d2986bc238c85d2a1443af19b8d7051e84ac6ecfa8339d22deb23472a856b3056cd5b280c3f395f2b2370df8752827602d64bc033b26b1970c9c8f020d41c15736190db9a5ba1a87afe9575e7918e502382d9f763bc3c5b7313c8539564df19c1deab0ff7ac7d3c48981e5ab31691c0a52c4818611456481668ba8612f410b78c21a68505335b8f4519c7bab53328a700763a6d95163f75dc2ba489ccf92cb2ed1b72f2d904a54c35aa0c8397bb06cd676b28cb6d1e44502550c9d259a05204272b93600b09244423a63b4c753b69529d2b3d16114a836273fc702f17fcc046d7205e47c0903541f519641981576409a35fda1e3e76cceb8109ef446338424aa13a741b38acfea91a1c4795925026801c4c929171c164522aa3ac2361b8c80b8cd3e644f7d169f9a20380bc575968901ed7783b6969c57461dd879d4781bda106a913c629be512788d4c1f92a71f9f819ab7207d1a65499e061c5e0447360b4e70503bd58511e4c3333556b75f6a8945b8661d0572c764c82ca70ec870ccde0cc5810b816c10a46491e091c75f8b24eb975867e179d38345bdedc627a725b4d732b7b453d9b15710fe7afbc55beb26c77e9e8a58bfa764fa430f1901928fa4ea1eabe2ee827d44191708310b5e708dea4c5242a8949f658b548a2ad1badb9a6322c56697b513bc1c29872b56fe1e32d9271b44ea0b43bb896ca9a7358f45e1f1821fcb361c6ea91abca91ce95a75588402d1217d1e37a80b3c880aa83c31c5683783e3bc77bc231afc0172beb9957fd7228d8589bc171a2fe24757400cc7e9cab13d90a2cc12b771725e0f2180acc221fe5879a317fb93a10682044d6e22ac67c0722c1062ee70959333c08aaa16bd9cc1b624405f40b78411baf7bcb4af46b80ab021d7c8a02ec8d0417b759cb2dce94409be96f5b5abd1e207a9b906c71c18c763414b2d48d77c19d8e617dc4e41c3328ae39c18aa9aca985964597686c919584114c4b2429308e123fbe9a8fb86327054817bca07df8c7adb4e2a941742395cb6ea24c6106eb95cc0868f8a6452efc5aed297d933919b39a8da93137925b87ada9a5cbfc5a541c2395bbca59f95ab2c4a5352831f0d143dac60b418c2051390396326d49e27b7b6159c43b5de3e40d05956dab59088f417302588e38c1a21261c62abc8891e44ec4c7395421ac09e1b448bc2349dc88c571c74e470474935ec58001be48b854a13d9855b8c87131985c91484a695ce9931267c1d0d0b9ceb4bc7c4a11676c267958566d59431a630d4ecaa8beb98bafd22172a30e14c9acdba26922f0aae067c9a0e9b658630873139b9555b63a73bf8c65319d9423d4a927abe86a95b383a7c0c8c54170dcc70a535b1fd814cb6c87900ea94eed7b51cba571dc7b5e6370bf4928bbb27b1f66d770e43cbbf3ec0c615521e2b8adddb42971a12db3a208f6b690289b059913760471367b4154113c14606c046a9591aa744683c4024b857293eb0e02ec7c75270c571248c0aacfa7e47a35e72157877847db1efd73c0922cb211c4538d018c05382e9c97c3d98cb375f78d056196466519baf3312559315796ce3504731e811432a83294d75d8365391fb348f0136a7fd90921fc3844f57d286845d6d663e855b50d884f511a2020b09048298dc4da2be4a8398d260ca4735d84f2b66b2405d48032cf3174fb36b325e723af241d280863b4d2099fb429c0414433786d33f880d7a15d3fe019e75861c7836490ca2a5b0771ecf904f794c746b4244d99226899c847814967454d7a4aa0fa743e2d2838bc9461446b61d9b006b4240098f37021c7631131a84bd75d33374b9067aff5e900c4d0490995875606a7baf87b8f4960dc84a7eba96f4055ab6043c9fab61fbed883705893aa89899ab975284867f63035a392902a779c8df9cc63a1b944943691b770a9646cc731a93f6cb3dc3b183b71429770032d08a778217f9b72bb16ca81f07c66d436396038372aeb8edc031083d95399084751bb9f3d32490393b510796c16c630cd2d7e0666cab62b5d904befe6e93d8e755292fa875609f2f63bd194c87e6f04db7c83d8bb1b9d868bb7796590a2e5c7ed86cf2c5c2a898662bc9a81418720bbb632ef9cf0b845ed052d73 + +# Official test vector 21, seed: "30b5de5b73681ec08aaa03f6f2d2169525d25f4042a5e3695a20a52ca54927b85f8bb948fc21df7defc3910b28674994" +seed: 89a6e3be304a3518fb82b18ca730f0b359cd6ba90664a493fb4f8edaf965b9c3b6591121e25d64010c25a18676033e1d7278ac5f2d0b43a31f3a4156ae710465 +public_key: daf0b0019241e200929c660cf7770e111043c8dc4af1014f7ceba48a445815408b2823666c6b40684616d823c86787a412c26e521ac8c16868d7eb5646909027820444b8bff59ab46086631d5a0761a75a79d76468b74fd8c20cb9784929f2a78ad1882a094619325cdfd05de5a30d622551c840ac79b0b5b7a513f702cf58333f8b0382ce055a4c138c80764b8f882cf14324015212034581b2876efbc3ae9687cdd7f2acb964cc18ba90005730d55673bd519be3173d3e231166c7ac0193a4fd26085bcc6607d4a6f73367efb5ac1a1a063fac0207766da41901b8a61ec7e45bcdb73584b5891ef112251a84e9c07ae7c16f52362cef10aa3cd69927db4175ba47e225a220dc2653a58dc9854210087ecc2486ab13408f92bf902635d2ac331ec1c95402bb55b73b5cf063d3885fd1874d5b03100a993eaca11e978393ff33a31b6a98f72479ad9b88d3d1395c2726ed285b793c489e09a8a7bc744b361ec87427c399290d092a1d58a5007ab2209044895941088a81b1b44175ba3e7b038ed17b1b0cd5bbdd1bbea3f58812a51ae58216b1c18907f131a80897353a328435b927d377a45a6be2310cb22076cc428371d4b772ebcead61c765c875312cc91e73b20be811706caa4b52b089ea1e43d7b61cf4b705c1b7b3739fb92c53268a685c03723b4bc316f679f4d8b87375a4188382e711b1911502e502a3f523bd5531b30298815717ce2211283cd675ef106ac5d4c37a6809d7e3bf3e3c40c6c5092c34198659849713c090db27c78689c6d57ddc90c04bf1af5cd56b11c013ee7126958aba8ba7284ed58828f1384786379eb0bb2b8c50a504a3b0fb83eb5964ed6c20b908731ca5c13d980d9a1c0af7c7527da50262c65f7c2132355aacebc1ae5fa7059e7310d6d95da97871c50a17c0d1c68dcb6bd7a9a697b9bd9bf15a643748c83bc8b244058f0c93e7d1a99111ac6f046a5cd1713d977650935ca5925d6e10c84c7ac692527e27c8465ea46fce97c64dc66eb1110188c7a3afbc94c1423a845b3530e35540805c881b999a6b28ef185273e584b9acaf26746829fc6b1c88ac03578f98e71b67f5101de2233c841d2f303c52a500b3d1bbca883fe49b5a233b270bdca755658448666dff384efc9cb26a664106c49aa46c4237d9ae0ef37df159a0c9e880d7247566113c12bc4451f4c6b4946cf76c7b57f737032741a3047934b09e697acb2210b05b17047ea8a460e4cd9e7068b4202a8912812a04286208202de04d0c91b9d62992de76497dd0986917592e9902f33c4999916576eca4bc8495fc7233ea94671a3588adba1355804f1c475ebd788d683967aaf9b07a3cc9ec4c2c91a61e0456c18dda1a238132d2eabff8002c0ea6ad88d3ae3f4769e298aaf954550fa3cf86944184da2cc7303f1be393b6580cdc1a0e55bc3be7300166d570fc4b8644156cfd6c8975c29059c7a550d4b63d242b3e11b887a31bf764a911ac62801a6845d6589b0acc55e4c80cb37a3784ab8c048abe21204b152069fba2d6b75cad8ab3f133678889a99d346e3b49c0c41147deaac27bfb7c8aa3810e3b74bc0b205f02753a48457bd4b7b624a3fba1443217a88c65c5f63a0793951666453692c56b790391a7c9297e5224771c7a441d5363741dce698c33558c584f +private_key: 0fe71ced368f0f36b7b8f1be4802ab897c8919617030a5381945883b69ba1b456a2704c52d3a24a3dc3e8c35c09655cfd6c2c0f14489a1db0a991cbcfda5b52d708fe30229c272acdaa3b7577cae68845776579ace017b2c0112adcc57ce39265eeb0c5b2585ef868b6bb56a74089fe2373294298809d820499342c7fc5343b85493f30e773668c790aa55234ae7a230fe2cabed5a55d4699b6e14155f5793300676533c230f529f8c762ff0520ddb9b78894c241181b69bb09e3f7645391367499c707cb4454353b8f6d86fefd8a3383b00d35089d6a62be348645d8c03d5e815810894b0e962e1c5303fa5580b8483b8556f55a62d49da3257f63e03533c10b74190134f1cf3530c025bb0035896628927e8c3c926b27ac05265ec90da933104232b0eaca457c9131f95069f40141db8239c483cfccc26a2f41f5b7533bcc26f4ae13ebd26986227bc4501a3f5d74d11da48bf1336a8483678a4be53154bcbb62d609733fa678fc2f946ca4c5de03741ad6b5becba4a9688c455c81b4aa528c2515c9cd33c2d071c1cd96b5b483797e9616b43bbee62088e5987eceb1a7b3217a31c37494568b40b453147644ff6b199465266911342b3cc7026b62338413827b51aa16ea0066c0e4228d0887775b89c4858a46e018e5368ccdac224ba600ec8329b0a75150b82b51fdc5eedcacb9589c870b48f02338dd3bb99501a6c6580ba52dc4f98b66564736c3f9ba887eb0351b60df54057245c8098dc440e76100d4a4d572a7f34f80d5742833f41a3bb9508359801ed187b2e94a97472c9da7374d33ab4bd425c7592cd0eb155f1d90ff1a03867599fa4c693472233f2f8c5cf86c89be5921e607566c226c515cc27447d7c6970eee6851ff06238ca9b8b18058f77357590b6e88b5cdd2c1ca7e477b25a21b2a586ba231dff318f972a1805b280df4445545a8c874053f740b462725007748dea3866df03c1b68b4d3eab9984837f0958a905ea14403a1f135c4eae2299acbc5986dc0cabe31de5459188365bb20aa917894967b39d535b5a022c5f2d02cf6431afff02b9a52162622249871b537e10cb53aa14d301b0ab13216528893b08bdf9145bc56451fd251dd0a926357303860909a1e132ffb58288752eb9cb5629591247d3456113279ca92dce372f877a42802c1dcdf175c2dc159a082c0727122618761d667b80a272244ac8b34b56004580627ba261749849c0a5986494ba851dcbb0bec8a75b1355656a824a6f37bce21cbeb1f5a36fb1639ee743fae1ce0cebb973d2a0e6ac024f434fac8882715146a5d0cf3f3ac4a6374a672b3dcc122f2ccc37d4d8a60fe34613e2b5f828674c8216eaf0402f319e3fbcc1bc9620ca698b42821312289a2f511733611ac45b0d1354b7fc815afbdc7ad8ab14f1e43f7ff73eb626944b97044021761d352468cb334e1abee2e7a7d07751a34b35c9f2492f258791763be524a00e37a3cbd31c86371cfb71388fea7e67a85c3914892d216aec165eede03cd02233a5c97af27c5ee0219c8fea7364933fda62a3702a05c207527d79a4aa44277e3ac03874c14588bc60f32b5cf60226d15377884c1b37272507915fe97be0c4aa282560ba5b2ddaf0b0019241e200929c660cf7770e111043c8dc4af1014f7ceba48a445815408b2823666c6b40684616d823c86787a412c26e521ac8c16868d7eb5646909027820444b8bff59ab46086631d5a0761a75a79d76468b74fd8c20cb9784929f2a78ad1882a094619325cdfd05de5a30d622551c840ac79b0b5b7a513f702cf58333f8b0382ce055a4c138c80764b8f882cf14324015212034581b2876efbc3ae9687cdd7f2acb964cc18ba90005730d55673bd519be3173d3e231166c7ac0193a4fd26085bcc6607d4a6f73367efb5ac1a1a063fac0207766da41901b8a61ec7e45bcdb73584b5891ef112251a84e9c07ae7c16f52362cef10aa3cd69927db4175ba47e225a220dc2653a58dc9854210087ecc2486ab13408f92bf902635d2ac331ec1c95402bb55b73b5cf063d3885fd1874d5b03100a993eaca11e978393ff33a31b6a98f72479ad9b88d3d1395c2726ed285b793c489e09a8a7bc744b361ec87427c399290d092a1d58a5007ab2209044895941088a81b1b44175ba3e7b038ed17b1b0cd5bbdd1bbea3f58812a51ae58216b1c18907f131a80897353a328435b927d377a45a6be2310cb22076cc428371d4b772ebcead61c765c875312cc91e73b20be811706caa4b52b089ea1e43d7b61cf4b705c1b7b3739fb92c53268a685c03723b4bc316f679f4d8b87375a4188382e711b1911502e502a3f523bd5531b30298815717ce2211283cd675ef106ac5d4c37a6809d7e3bf3e3c40c6c5092c34198659849713c090db27c78689c6d57ddc90c04bf1af5cd56b11c013ee7126958aba8ba7284ed58828f1384786379eb0bb2b8c50a504a3b0fb83eb5964ed6c20b908731ca5c13d980d9a1c0af7c7527da50262c65f7c2132355aacebc1ae5fa7059e7310d6d95da97871c50a17c0d1c68dcb6bd7a9a697b9bd9bf15a643748c83bc8b244058f0c93e7d1a99111ac6f046a5cd1713d977650935ca5925d6e10c84c7ac692527e27c8465ea46fce97c64dc66eb1110188c7a3afbc94c1423a845b3530e35540805c881b999a6b28ef185273e584b9acaf26746829fc6b1c88ac03578f98e71b67f5101de2233c841d2f303c52a500b3d1bbca883fe49b5a233b270bdca755658448666dff384efc9cb26a664106c49aa46c4237d9ae0ef37df159a0c9e880d7247566113c12bc4451f4c6b4946cf76c7b57f737032741a3047934b09e697acb2210b05b17047ea8a460e4cd9e7068b4202a8912812a04286208202de04d0c91b9d62992de76497dd0986917592e9902f33c4999916576eca4bc8495fc7233ea94671a3588adba1355804f1c475ebd788d683967aaf9b07a3cc9ec4c2c91a61e0456c18dda1a238132d2eabff8002c0ea6ad88d3ae3f4769e298aaf954550fa3cf86944184da2cc7303f1be393b6580cdc1a0e55bc3be7300166d570fc4b8644156cfd6c8975c29059c7a550d4b63d242b3e11b887a31bf764a911ac62801a6845d6589b0acc55e4c80cb37a3784ab8c048abe21204b152069fba2d6b75cad8ab3f133678889a99d346e3b49c0c41147deaac27bfb7c8aa3810e3b74bc0b205f02753a48457bd4b7b624a3fba1443217a88c65c5f63a0793951666453692c56b790391a7c9297e5224771c7a441d5363741dce698c33558c584f87ada29bf78a689417b645fe127d124339422be80a993e623d13bc59f3406a6fb6591121e25d64010c25a18676033e1d7278ac5f2d0b43a31f3a4156ae710465 + +# Official test vector 22, seed: "e335df8fc0d890588c3e305ac92c7160ff199e07c85760a828933750e3fed8c83b0dbe802234481ecf890a32d7a2884f" +seed: d569b935ce015c85f792f8f7fb0d83c4f53b492959361dd4f75fb764d656450176eae84d11c4528382828f7a689a0d5cff87b8ca0bba97feacb39b935a8788cb +public_key: 670855bcfa888f30a50035208f5a75de6a8e3799cc4afaa7aee007788547e7b79c7507bed6a8522be18743c101463c9d0c28328a68b0d3ec380d04a20a31ab8ce6465e5aab4e2332f30870c5024718b1412c13b7094228e6f3a1a32440edba8f5ca66d968961a3f28705b9778713cd96974e42a50ee9eb61eba399cbcbccfc8786f7963c15d61ef8d194ccf37db2e16a31cb57ba79c9aa4a5da2593eb56c29498ab66f370d7b76971f797f9cd38ac3262226a64f91e03a1119b8eea00c103358572a1f4ab68f8eb4a5f889540913b23ff11768200694597d19218a2c30c3c25829467ac2d1b67f85d37522b22e7e44b950d152a8e087a3a35e3eb1c41fb15c7fc264c39272f01a0a2a91324a1ccbec627fa1ac81edb30ce0f84a727b36a4f9015a25ac67e3c76629c2347c2478d61b42bc413f6920f7b6774542bf25b92a7715745120ac1c4226e3b623860b4a42566829317e09d5868719a1e9babffba9517ac95a7c020882939cca54005f94791f37093eab5f2d15c1e7a09b9ec7b3738a197977c3ca0baf9f093271d00387841f2ab98c9cb16f19272d5e4b8d15e69da97517cf833475336d8850b5c3c87e4ef2c526b95e75060dc52c0292eb69e3f04294c854bfaa0f0fd5432dac0fbd03414b5a4a3b7c7cf36906fee8be6479c193b7336f4c870aca768d3ac2d84234b330a1f160b105214d469c8c1529bf31b3aac01a3ee1e231f389a27d4340b35a463ad002a7f8327dd5abed8b4256e87129b1be8ac475c32b97d11397db247a019533acb1a61c15b9aa4bc91d45af064a608b1926c93acb18b7c75d9798569a89a78463b51b5bbf038dae3c5cd133690ae80c1ad4541267bc10c83343a12439d6844b931a1cc79a0b5090214ca721f61e633600e8f76db52274c6c736e4c8b63089014a4012015522a9385f863507b1f1cc7c814cb47b00395724d601ad7bb27e4b0c43deab0664cc858d4a74576642eab3c76c211a58274e14f615ffe70084d7b7c0189d4d97a927a8b008b85888c57a0f6a307234344a5960836cbf6f4473ad988429a4ae3ba697bf07429d17c059a65d9e35a845735ba0a58e989307376c1e61f33023221a6611ca0465be5200363d49c53cd44b003307e5cc0c4f7b15e1545c72a7c3410ba1bebc8f7314b3b9d295c676bfe6aba9848554fdec9192f808329c60a793754bd6256cd030da12bce0d0765e51548aab0985ac86d1537ba49635641b3a26c05def260e94593b2e0558567c5da09b2cb122655bc4cd3e985eeda6c3f4322765e6a808ca387cc369dc11c9dfab64d4a30584e5329c905dc480801dd57d9ac8ab4087967177cb3163cf3e934a951a3e248a54cb922b6ca6ce9b4cb8bd788023e6425e75aedcc135cd3c59920c5ed0356fc0fb5a1ec0035b7c8271726dc8d63dbab3c78326a26c5b0f9f952cde7373aeca36cf6a438fb39c38a56124171593ea3bb076320bc8b5e74204777b7120ba97c3e803560605cf80c39324a0e3045d0f687e8f219a2ce70aac209b86d869febc5b51398341827204ac584c6b3381471937e68efbe5866a8569838251171647b4127514db9b84482d5b9a89119761c7f6508a099961376d6ae3706f6ca1c7c031f430190d6231425b14c6544cabe8701f8e475892fe31b587aa42d334fd189bdf +private_key: 3937043d61a4126a8c1ae01ab274b31b8424ed88cd180029be89cf1ea58b2a6325ffe8627b7bc4e3e8a4b3c60fc42573225946ca400235bb54494a386eeaae44f7bb8896c4f040836110c4b5796985108d116a76e05c984cfb2a9170811e7cb4c41a12e3601b9fb24bbd3cc0132c22d814bb98f049a8c155e38c242c2156c8b058eac343c77b11f550c52e9207a25213b40648fc70872ed8c050920c4c078a9b4576b60909bce496289168114a24111b7d15f10c06d7b719ac4c4872756d760970132bf15b08972c78f4f1a5a6a15364c0aca1c4721b3c82777878a861b751aba6a1eb75172c952b017ed03c9007541110a935207b037aa7296e73b998597240b60115333e50ba0c6b837c4cf26a027470770358a537481675a7fb7cccb901ce7836b75b010fd687691e96487bda2664756fd6057ffb122f69b26e3fb3ba2625b9fd9c41f4887cd0124df978bdc26b0c6f3b0f9416c38b2145361343c2f2b752c7a885586e4ac9955ff924d2365847c22e06c6556b7858f0d9318c037e03536ce9c5a16220967ac1c55e6c61f00a5902322c8b35bd190042425249f54a3229f90453b0942aa9a31f421463f514dc64024d5616e653c9e94bbae8e82fa914863338c65413a33e520243f92f1c3a888ea8121be984b4e4cfd08285e904c34465bc1477cef53757b1025b10d45415fa2e57931ecad301929437b837146fca445211b5719a933714a1c29b1eb52a3bb36603c072b4ee0b4775d17b7af9c6049825e2b654e1c4bdd8e56f531406cc5297d2ba2cbf19b8c43835d1c184eaa661d9b90a6e99854787c82d53b794d8624d2406e57693143736bb34284608c8b20a9d99695d8f87ae57c83d095a106e793fb7325b80eb26c8cc345ea2b17ed66e3d437631a018a2c8bb7cbc42761b95f2508f92732bfcf9343c4ac48a935fd9260ae0463bdfa69120ea90f3e9909b2541da03516f922e1e58411d1492686529cb030e1c9846f63abd6ae9a781853bcf31af495acf79a49767731eba21a3403140a707c106425c5bfa2ca326247515b229eac449b01227fb1b228c8637732d818c6579e4a5f0189a23793f8e39c1cad40aa70a3c6db8707aa76831dc26a446287d8a4e45ec1ff7eb00782596f7a7aeed5307e5c84039b4231ca6609912c6e4e71dad93012a21800914997f99970489380e12be57979cb6e49861c9605d02a14727a17e286b40712233141e2fd5b3834033e2b215ef44aa752201a65334ac223817e290d2c50338a2681d298061586ad704862770867b0493d0941c4925acda9b4185b64588e25f1015705a885faafb1518a70ab415cab51a25e3139644f31f1bbc0ab9573bf63230ab125891d58143ea8bcb858c7521100ff581ec7a97b351bbcf5b4161f3141ae78986713d5bc15a57e07f2bbb8244b11d81a0804a18ae63104bf75c755f70aa758997233154bfa942a47277ef20b312a68e96201f227a908dd7bc02e19391f73825dc44cd258b707b6da20ca56a2b32c0202308357e48945d79a38c0560271ff0ab2e8c1af246940a797cef018b62873474a38a595127c026699d625ebf0774334b0a953881fbc1b0f5c472f549818d44b63ea59541a826c49754926135670855bcfa888f30a50035208f5a75de6a8e3799cc4afaa7aee007788547e7b79c7507bed6a8522be18743c101463c9d0c28328a68b0d3ec380d04a20a31ab8ce6465e5aab4e2332f30870c5024718b1412c13b7094228e6f3a1a32440edba8f5ca66d968961a3f28705b9778713cd96974e42a50ee9eb61eba399cbcbccfc8786f7963c15d61ef8d194ccf37db2e16a31cb57ba79c9aa4a5da2593eb56c29498ab66f370d7b76971f797f9cd38ac3262226a64f91e03a1119b8eea00c103358572a1f4ab68f8eb4a5f889540913b23ff11768200694597d19218a2c30c3c25829467ac2d1b67f85d37522b22e7e44b950d152a8e087a3a35e3eb1c41fb15c7fc264c39272f01a0a2a91324a1ccbec627fa1ac81edb30ce0f84a727b36a4f9015a25ac67e3c76629c2347c2478d61b42bc413f6920f7b6774542bf25b92a7715745120ac1c4226e3b623860b4a42566829317e09d5868719a1e9babffba9517ac95a7c020882939cca54005f94791f37093eab5f2d15c1e7a09b9ec7b3738a197977c3ca0baf9f093271d00387841f2ab98c9cb16f19272d5e4b8d15e69da97517cf833475336d8850b5c3c87e4ef2c526b95e75060dc52c0292eb69e3f04294c854bfaa0f0fd5432dac0fbd03414b5a4a3b7c7cf36906fee8be6479c193b7336f4c870aca768d3ac2d84234b330a1f160b105214d469c8c1529bf31b3aac01a3ee1e231f389a27d4340b35a463ad002a7f8327dd5abed8b4256e87129b1be8ac475c32b97d11397db247a019533acb1a61c15b9aa4bc91d45af064a608b1926c93acb18b7c75d9798569a89a78463b51b5bbf038dae3c5cd133690ae80c1ad4541267bc10c83343a12439d6844b931a1cc79a0b5090214ca721f61e633600e8f76db52274c6c736e4c8b63089014a4012015522a9385f863507b1f1cc7c814cb47b00395724d601ad7bb27e4b0c43deab0664cc858d4a74576642eab3c76c211a58274e14f615ffe70084d7b7c0189d4d97a927a8b008b85888c57a0f6a307234344a5960836cbf6f4473ad988429a4ae3ba697bf07429d17c059a65d9e35a845735ba0a58e989307376c1e61f33023221a6611ca0465be5200363d49c53cd44b003307e5cc0c4f7b15e1545c72a7c3410ba1bebc8f7314b3b9d295c676bfe6aba9848554fdec9192f808329c60a793754bd6256cd030da12bce0d0765e51548aab0985ac86d1537ba49635641b3a26c05def260e94593b2e0558567c5da09b2cb122655bc4cd3e985eeda6c3f4322765e6a808ca387cc369dc11c9dfab64d4a30584e5329c905dc480801dd57d9ac8ab4087967177cb3163cf3e934a951a3e248a54cb922b6ca6ce9b4cb8bd788023e6425e75aedcc135cd3c59920c5ed0356fc0fb5a1ec0035b7c8271726dc8d63dbab3c78326a26c5b0f9f952cde7373aeca36cf6a438fb39c38a56124171593ea3bb076320bc8b5e74204777b7120ba97c3e803560605cf80c39324a0e3045d0f687e8f219a2ce70aac209b86d869febc5b51398341827204ac584c6b3381471937e68efbe5866a8569838251171647b4127514db9b84482d5b9a89119761c7f6508a099961376d6ae3706f6ca1c7c031f430190d6231425b14c6544cabe8701f8e475892fe31b587aa42d334fd189bdf0c87bedd5c16c32cc3867910f734bdcf09869c7604a59ce36660074f561e12da76eae84d11c4528382828f7a689a0d5cff87b8ca0bba97feacb39b935a8788cb + +# Official test vector 23, seed: "fbea1bc2c379f4f8fdcb0de260d31cdb064c9ea9b1d6dfbe91b3692add1d34dec9c9ffae7bf5e72ed2743ba3f9f2e43d" +seed: 5cbb141c2763425c274f7404fe530d9116e08c33f9f200a20b011cf563a28990fc9ebbe336dc464489861db8253606971bd0a9008a433ed17752d04023781552 +public_key: 7dc26db4f73dd1859b06a852e89a4845a0943e5513e8a056ddcc2623034a4ef251e607268997b7e90471d5d0cfba5639da844f0c9a7227c8a22a83b9e805942b67019ebc45502c22d369abbe52a9aa6cbef78ab914337375d9c075854bc9a3484a0995a239121d918aa64b2ad76c6873790211162509ca2347366d8163803c3433d32068d0f8b64cf38c2370a3546083ed45716dbca7ceea50207736fa51c062a6a15ab8c124ab6b00334e03808c858ab4b20a368df787cde92169aa4100a2adbb4699510753b80a63b492c51f43a81be012fa13405ccbb0dcf1166ef55f450781244420a0ac9301d485ab561b9ab67f5805afff924c1f43a5b1628f60baca631931bfc6c9bb04d0fb3727d7ab6bcd6cadffe84ca57851ee201f8153ae6d64c0d2aaa432baaa0539a17e731cf4360ee37c0e38e0cd77ca85e817a827173bd9c0ad253a44fb244f47f956146b4281109297b05a9320953c022024373d60701a68450cca32883848c4cff3c64f548cf7912ff61a11f06030c5eb29fbf8bdd2b16541fa85b8683493e8239e22c01383985aca367d6cba52c7808ff12b79976b794c70471ba5cc7908e4168d5c916605337f26199c34519236a855ef063423d7777631bddf164b2375098a25c9fbe9a7f9344ac12aa0b65a1380946560123f82e033fe33638788c82e7abf79b2c4df9c6da2f4301d70465a3c05e3a485a26a3b8d98674d91594f24761f1654580719260c4b409b2fcc418a24082a11140d043a6dea028dea1a51e9224fddaab5f3aa64564b3c336586dd8587442800ead481c9d27ef08908b938945b7204557c38aee2753709b68088684637bd39f1b78c6929c84873822caa30b2584a02c93b085380524405caa5d9147e6c837bf0ccb1aea19db39471d1a573fd893028479391680282922b11ab4d78b407f7d68eb89b615c32593f2207a4b017fd1cb922778ca806b305600546700d9ecc70ccf292ca7ca0ce6b6fc2a79731f6a9e8b83c9492381ad561f657192bb3867d3cc663bc5ffb48c997403b4814c915616d03ca71d0e8a93ef0acab8a55a61a6a58d22845e27d6c453b79391dbe02797d390e262a6be41cb564152768a5b1f2b7306872bc9dd63327e22e518082ad337f0eb8494ea23e7c730f48e94d21ca9ca3f660d4f960a6285f1e586d04120a083b814ec4229717b23b73c0c14aa6bd45294601bcaa89429814ad6e8a6190289758354043eb6d81842a6f332524da9e63dc7570865695c043c9eb9c5925bf4c4b15bee14aa58a09c4d37c822ba891f2626a414d01a10f9fbcbde5609bf4d982e23392a4cc16c461260bc518717584bfb96e6960b6d4b673f61663be1b2babe74d46494ca9576f3200ae3ca8a58de308d8e99b65384ccc30aa1669898722b1a76c87dcc276474a74c2985e746194844c0e98f811dec520bb54a1b4572b0c39ad04820f8ea878baa9caf03018d4a196c5363f55373ef5a98890c719b7a019d0eb023e319241081694e74bafda502529020a8b8f1590b73d1bc36ccbc8d4bb76c44361309977270231a51a7999e65b923b1200366ef381b8fcf8c4c5d3add0c465f7db79f7563dcc67940312ca49981581a798ae477915f078f11023c50efef1acf4f751801bfeaa5ef93fe27771a40a3d377f0f1b1655f6ed13320e +private_key: e2903ded4136ae2736d2f6522417953c15774fd1bf9160b6553b0a6f8810e2208a9205833c5479562ac268b6618787c4859838020a1cf2d16d7f8cce4f18872c20703522463ae5c2cdeb4952d579a9c2726783562364cf8d86cd1254c76ce667df6155ddeca4572506240723ec8561d7c65ff953158ef4cb3be6ce823c5501db9e29d8c1fc23327b04067f755b87d984348acb362b22cd416d754b82e52483d8cb422eba4ba8e649faf56f30586f09d4acac0c3007ec6ca1732eae602a004b58368785325b06124156248b22d69806b6b2947a75cb16b824d35c7ec26a7a6722c4fb36a5aa538c16e4b6d366344d049b36e53a6980177f3989c301293d3450c8e2abdbc186972990dd933f9cba7ba31717bc3126d19a0fc3d090ba37c447db6143b63383745c866371c426171b667096e46e0c2942d40b4ac2f08f48b136ef09c82eb5bdb13a514876274bb20c6b40a600d1cfa0a8b29ddbcfaca547d1680067786d6e50a64b70546ae3af52451a08028976ba78b9275a2b011858e0cabff149f7854abd2b390d28a661c7a871467a2603c5ce29866839208b5386714618b6a2012fe2b4b9753c8d21bbe74c477f427e72181988d0a094c15a9c24a7eab46be919a71fd60879a67480178453f4aed9b63c11040d370322d43b4077e74d8f8966319042c9559b021cccdb0874009d61e3a3970c14b34a180cdfe0a2f9d5bf60954cb79b5b69169598fc88a9b11ea1287a8cc88f877659577433a97c16af3ca892d40cdba7642fc24f258a0207da5e818580694582b7b7982a7bbb5de714e7425b7552aeb394037827a98e765d96310d5014a7e69b3db3b6797bd60650e36e1ebb0342a77576f496a7255d936c5eab1ba3d9fb57d72305272a5e567c621746720878cdab13a9f5b0afa5101a6f7b844af1bbf660c584205bcecb22a74b79c5b4302f29bbc502b4a3c9854682c8b123a33d949d878b4ae609ac5386ab5896ae2b877338b3200e582f34fa450adbb27480296b0bc6e0e73c2ec1b633f56d1b8a54ea65ab7cb62e5e4a2c4e82a957194321e1bb39413c3990b74b54ce213008979146c47301e3c8489b257be7a50ae6d39a5cac1dafd41ef2a91b54756779e5a8e5ab79ce481ef9f80195ba808769a158e0b48b52669c01980338042d2a5e21362703827ad9433cfce6191c7c737deb92ca3053eaa80d9c9234f54715b31013cdd31afa49a24993669adb72ced3c7e3c02c76aab8ba56a29686a115f4b36deb2fe00bb42cbb6ba8a825d9888f6347a6e61a7892e06c8ff9b8fbf1270d02beddd4268fe4615f9994ef8b93c8615b6a63c9b4d752a46c51ebe9c4d97c160fa27f8cb62aa22344f14339875b6d0f920875c3b831186ee6f04c745756d57b875098a55fc1b060f353f606bb073690546769dc61600a671cac18b563aca5e6a8a887eb76bf88a33d814ce9f32db7cb5cc3d16636493421fbc550ac90a4b99611b39cef828dbf056c0f5043be8b003e260610f27a59a2765d57a13d2281d6904526b93d7745b4f8b98085397688ab559d073f88716dfe5a39d09975de107a3e6c68ee17b3b63a9b10ea6f4531bdb627bb07494f279052cbca04722bcc0014bb3993219236397dc26db4f73dd1859b06a852e89a4845a0943e5513e8a056ddcc2623034a4ef251e607268997b7e90471d5d0cfba5639da844f0c9a7227c8a22a83b9e805942b67019ebc45502c22d369abbe52a9aa6cbef78ab914337375d9c075854bc9a3484a0995a239121d918aa64b2ad76c6873790211162509ca2347366d8163803c3433d32068d0f8b64cf38c2370a3546083ed45716dbca7ceea50207736fa51c062a6a15ab8c124ab6b00334e03808c858ab4b20a368df787cde92169aa4100a2adbb4699510753b80a63b492c51f43a81be012fa13405ccbb0dcf1166ef55f450781244420a0ac9301d485ab561b9ab67f5805afff924c1f43a5b1628f60baca631931bfc6c9bb04d0fb3727d7ab6bcd6cadffe84ca57851ee201f8153ae6d64c0d2aaa432baaa0539a17e731cf4360ee37c0e38e0cd77ca85e817a827173bd9c0ad253a44fb244f47f956146b4281109297b05a9320953c022024373d60701a68450cca32883848c4cff3c64f548cf7912ff61a11f06030c5eb29fbf8bdd2b16541fa85b8683493e8239e22c01383985aca367d6cba52c7808ff12b79976b794c70471ba5cc7908e4168d5c916605337f26199c34519236a855ef063423d7777631bddf164b2375098a25c9fbe9a7f9344ac12aa0b65a1380946560123f82e033fe33638788c82e7abf79b2c4df9c6da2f4301d70465a3c05e3a485a26a3b8d98674d91594f24761f1654580719260c4b409b2fcc418a24082a11140d043a6dea028dea1a51e9224fddaab5f3aa64564b3c336586dd8587442800ead481c9d27ef08908b938945b7204557c38aee2753709b68088684637bd39f1b78c6929c84873822caa30b2584a02c93b085380524405caa5d9147e6c837bf0ccb1aea19db39471d1a573fd893028479391680282922b11ab4d78b407f7d68eb89b615c32593f2207a4b017fd1cb922778ca806b305600546700d9ecc70ccf292ca7ca0ce6b6fc2a79731f6a9e8b83c9492381ad561f657192bb3867d3cc663bc5ffb48c997403b4814c915616d03ca71d0e8a93ef0acab8a55a61a6a58d22845e27d6c453b79391dbe02797d390e262a6be41cb564152768a5b1f2b7306872bc9dd63327e22e518082ad337f0eb8494ea23e7c730f48e94d21ca9ca3f660d4f960a6285f1e586d04120a083b814ec4229717b23b73c0c14aa6bd45294601bcaa89429814ad6e8a6190289758354043eb6d81842a6f332524da9e63dc7570865695c043c9eb9c5925bf4c4b15bee14aa58a09c4d37c822ba891f2626a414d01a10f9fbcbde5609bf4d982e23392a4cc16c461260bc518717584bfb96e6960b6d4b673f61663be1b2babe74d46494ca9576f3200ae3ca8a58de308d8e99b65384ccc30aa1669898722b1a76c87dcc276474a74c2985e746194844c0e98f811dec520bb54a1b4572b0c39ad04820f8ea878baa9caf03018d4a196c5363f55373ef5a98890c719b7a019d0eb023e319241081694e74bafda502529020a8b8f1590b73d1bc36ccbc8d4bb76c44361309977270231a51a7999e65b923b1200366ef381b8fcf8c4c5d3add0c465f7db79f7563dcc67940312ca49981581a798ae477915f078f11023c50efef1acf4f751801bfeaa5ef93fe27771a40a3d377f0f1b1655f6ed13320e9a9a59f83fc58d7194ccc92bd78a45f97f721a1eb554499d0e4d5b37aefc23a8fc9ebbe336dc464489861db8253606971bd0a9008a433ed17752d04023781552 + +# Official test vector 24, seed: "7e87fb886bc3c7c9fc12569f465d2ecd12532e76cc27c65644c8d3dd603b0cb2d036c5974e675058f271d5c82ad7a813" +seed: 293abb6d1c207927945417cf84883ef010823e11b487ed55239e466e83696d0cff8563038aad865a817cab9ce98846ba75be9363718ecf5fea538aea90b2a558 +public_key: 790847ed9a831c0cc2acbaa793c41913a02db8ac1c6bf056573bb75e2990a6fcb732c3461ccb174dab8ea4c55781317e400ab4ef68138ff84c27fc0bc4c68e30eb664cc8bb32b617916c155d28a195fc39a1a0419af64a59c99664f744a375113228ba3730752ce5a06701112d7328649a3755b45ad6bc4bc0859feb014e185b2e18603ea0437b31432457b36d13a5ae96b03905bb2fd0d5377eb04f34a68c57448e7909cc660a31d9f9540af17324e4b31bf04f465665b5538f7351687f238d6c423c9237b5ca35618f092cf7da879d965b67b1cdb2467c9ef3862f260c04727594aa6286f4035f0b0eeeb4b141306cf7d9c4a6bb942b7a1e30b56ae958b16c3c1237603ae6f879dc9ca96a2439e26c0834369e8b041c6327254608ad3727cdf23b842a003b91d1aee60193ae1497d5b75e2a370147f052a08b1f86179bad52605df44f6c99c75df478017318c6ba017a1b4a8302888f495acf796e0745adb0292ea6b5526fe43f96e20d98fb756b2553a9493401d4a25b9bbac13b62967a228bb6446b2067063619af66383e6bc2b3d8cbb9e6969196bb45d665bce49284c5b50f934774d500c90134535930ad2169488c4ba8ac0854f36e085318a293bd65ea8e033c754ea44191d9ac8033c031e066b2021c13fa11a15222cab4829a5c47df7418761620aad92135169e0f008760ba30a289cd41f1325a4c90334978c5176cdc5496962443b118a641d6130baca422d89fac5c968adb461ab43729b6c9b1349e71116c0226b55fc00323d6a74c03282f24997949207d72ce58fa4d87a7413c3bbaeac91fb2131c418c11ba501701549efb25cdf560239223c90e1a2f99897fad594930848a1ba2494fa87bc03c57c7bc33463b77ef80b978724153a956779028b7a565c40144047747e124c7db801d309333d3150493c3b3ab68c34c939243454d90c3c4079174a8171c77a0b0c9e54277b5bbc5033eb1eba3cac86039492b4e75a23c8c51c88177edd639a55b56fc557b580b03935765cf586c95178c330319c70a8c15c95fc18a23da11798cf6c54f68bfb766a61a9c9c461b766b4a00608575c4309a621b28d27122cbbcc76c30a30286483ba85a68524c0e21591b7347a0ac0931e121eb3bb8d0fb7d9ec577a5821487619e196400c2169a42a71c7665505bf333ac70267bb50380b947ffd54745e41de5a30a27b78a62f43786ac88b2012de563cde100358065485a73505982a265a505ed85cadc02228ff90a03d088da7410c6179558d52ca36ba1d87353985189a709a1c0a7a10cd8513c4aa26d27cf802027aa8c5bb99c12a51b7f16e10838500132cc24d79c805cf11a5bac88c4bb0377ebcc4fe7c6ffb927ebe7234016bcc1765ae9e72e62d51f9cd91017f508ae207d181ab0c4dcc8d1c4742494876d118f40c84e2706914c65a161d184a5765aec67c9dcfa4bf3418e114c6f3cc34e94a149fc84b041853af9b213759cc5a181abd5641285613875367842f1a2549c09eb9b1dbd851365d58e6335c91ee7ade6c23135c1200cfc1de3f5cf6fd13967150f01053b943c3389bc4670da9857ccc32528920f781cbf16a9dde2299db9912e87321c02aac45c4820ba2e808666ee521dc4bed006527df29a124412a4a19aa26c09b490188ccba53900a2545022 +private_key: eb9a0f50030024200b530580640112b904c9190bcc0f7b6c9b071086aba50212517eb401a356cdbb8547b1e06ceb0695f002c9982518e6258faaa84cb7b0885d1c9272bc8acef294c2aaba89696e4569cf3493cd69db0c9629c6af282a6828a0dba65f1c2802af72bbfcd102e9ec5395f0473d29b9bcd99d8c803aedea59aa5b11f798230917c5196b2ea9a950e3834e7f272b8c6760b07c8597025cf62b63922768d89955315c2f36907ecb89b97db098d7348b9643ba56582915b9558fa519bb1530d7b8461831c996731cfd2b4d46643c0de99c459b93279173a83b423a073367ba8e79904bb431760b969a4b7b98f10a0e5fd1aa75e52b59fb9af4123ad65b645aec03c7e2c35eab02e201b92c266b98c5932ea3b6029345f1f8085c955fadf2c840cca34cc801ce489415781cbfc598f1f39ca240257a0c173b6108482c9720f56afcf250c2c704c514214fe0155289470ea5470cc1a4eb5c999bf8567d688d5a4a2a7cc1c3381c68bec925ab312acf037113fa8c5cc43a75f3baf932672ecb3ed412b17b5520351918297525c5d352076ca04d2a3833d306a321b9a9b1564504b8e70aa8e9a91ef47001a42c66b33370db2ab3e9b43f32e926e7ac189252af3c9ac7bd420c35767e1b26b161823da4fbcfa11232dea1143718b6b9e6aad183311f756c04c15e8df99bafc854e751417c1aa5fd64623df434f2c70dbd8ab6d41395cdf4814bc99ebe5c1dd0777c7344c1504b7e2ff4b82d974e01600d1293c5ec2a4b34fc895e608ad7a32b2fa6cdeeb2b2867a8aef27aae73ca70a5670c3857501f5c4231448a4e7b4a9926c1ffb58b0aa73705c1eb1e70068d97de17b19a1814c34d746570bb3d142a6b7c49d52d78f501a6bfe37abdb1905a30077a21a1b0e5a14f6784db89197121143b851ce1d975db4f50ab75a8138e60a542cc41aaa6c55626d81535044d0a1865b4d6303c649b3545511440a320cf5260d0b85041f6c26f92a13f01c77bca3357c26bd0dd00084a54ebeb7330f59683597bb733182a4ec7b15e8656dda8bf0a8b38fc3632e00bcf5938706c55d94623dd9c11bb57036783593df9b85bd9b9b2c430d94c73a53b65da10a614d93c6da7cbe899a096ef3c608f747cb782955d0402d9831b9889f6a7708ffa7caf87a8dcb1a18b74c363037c890470d18805befe3a0bf058e64850d61614948f41a2f03446bc9c6d65750ba421e2bb8510f2a8789b20ae70c1331402a550480fad8c011494d7cc25c573b4b23ba4c96f99abc5a6d8ef2195284ba54678f15543243362c6aeaaec2812e76382dfa36c2b1704dfb559a27d5b8f7469596a28c9e2b0d426aad0c57b2407346a6ba267690cc8f30857d2858aa5b97e286017c494bcbf398ace755fb5b0d041aad180691c85994d331616e91a9bc4932122c35b55b8300264e5d3533f7518c59c4cc4cdc5c3894b48f247b1433666efc9934f18234535e18bb43b5ba5d9b6979bb14bb8d407d0e15704ac6cd1bea3466d41362a261e9e3c4cb73b625690f1bf755db67ac556528700a78ca973391b34d448abe2bc96447dc8f96239e6d06c41dca9fe04272e438b7437c6e0bab01797475adf9cf716430dc2b4a9ad16e790847ed9a831c0cc2acbaa793c41913a02db8ac1c6bf056573bb75e2990a6fcb732c3461ccb174dab8ea4c55781317e400ab4ef68138ff84c27fc0bc4c68e30eb664cc8bb32b617916c155d28a195fc39a1a0419af64a59c99664f744a375113228ba3730752ce5a06701112d7328649a3755b45ad6bc4bc0859feb014e185b2e18603ea0437b31432457b36d13a5ae96b03905bb2fd0d5377eb04f34a68c57448e7909cc660a31d9f9540af17324e4b31bf04f465665b5538f7351687f238d6c423c9237b5ca35618f092cf7da879d965b67b1cdb2467c9ef3862f260c04727594aa6286f4035f0b0eeeb4b141306cf7d9c4a6bb942b7a1e30b56ae958b16c3c1237603ae6f879dc9ca96a2439e26c0834369e8b041c6327254608ad3727cdf23b842a003b91d1aee60193ae1497d5b75e2a370147f052a08b1f86179bad52605df44f6c99c75df478017318c6ba017a1b4a8302888f495acf796e0745adb0292ea6b5526fe43f96e20d98fb756b2553a9493401d4a25b9bbac13b62967a228bb6446b2067063619af66383e6bc2b3d8cbb9e6969196bb45d665bce49284c5b50f934774d500c90134535930ad2169488c4ba8ac0854f36e085318a293bd65ea8e033c754ea44191d9ac8033c031e066b2021c13fa11a15222cab4829a5c47df7418761620aad92135169e0f008760ba30a289cd41f1325a4c90334978c5176cdc5496962443b118a641d6130baca422d89fac5c968adb461ab43729b6c9b1349e71116c0226b55fc00323d6a74c03282f24997949207d72ce58fa4d87a7413c3bbaeac91fb2131c418c11ba501701549efb25cdf560239223c90e1a2f99897fad594930848a1ba2494fa87bc03c57c7bc33463b77ef80b978724153a956779028b7a565c40144047747e124c7db801d309333d3150493c3b3ab68c34c939243454d90c3c4079174a8171c77a0b0c9e54277b5bbc5033eb1eba3cac86039492b4e75a23c8c51c88177edd639a55b56fc557b580b03935765cf586c95178c330319c70a8c15c95fc18a23da11798cf6c54f68bfb766a61a9c9c461b766b4a00608575c4309a621b28d27122cbbcc76c30a30286483ba85a68524c0e21591b7347a0ac0931e121eb3bb8d0fb7d9ec577a5821487619e196400c2169a42a71c7665505bf333ac70267bb50380b947ffd54745e41de5a30a27b78a62f43786ac88b2012de563cde100358065485a73505982a265a505ed85cadc02228ff90a03d088da7410c6179558d52ca36ba1d87353985189a709a1c0a7a10cd8513c4aa26d27cf802027aa8c5bb99c12a51b7f16e10838500132cc24d79c805cf11a5bac88c4bb0377ebcc4fe7c6ffb927ebe7234016bcc1765ae9e72e62d51f9cd91017f508ae207d181ab0c4dcc8d1c4742494876d118f40c84e2706914c65a161d184a5765aec67c9dcfa4bf3418e114c6f3cc34e94a149fc84b041853af9b213759cc5a181abd5641285613875367842f1a2549c09eb9b1dbd851365d58e6335c91ee7ade6c23135c1200cfc1de3f5cf6fd13967150f01053b943c3389bc4670da9857ccc32528920f781cbf16a9dde2299db9912e87321c02aac45c4820ba2e808666ee521dc4bed006527df29a124412a4a19aa26c09b490188ccba53900a2545022bda0815dd53b263afcc1f71d2501128c41fb3606af71c5e68f0752c6d3a479c5ff8563038aad865a817cab9ce98846ba75be9363718ecf5fea538aea90b2a558 + +# Official test vector 25, seed: "ad1424e804f306c7ff513da4c1e8d445afca7bc942fac5c0b335733aaf70693712ecbde26ea726ee0f9fd9d52a83b1a4" +seed: 74d87c7556f2671f2d666854a4d6e073e69f35421e6e1a428cccea49c37f972ce1fb7456ac0aa1b97068f452cba64ebdc138bcf5d36b0a0fada2a3b374141eb9 +public_key: 39dabcbaa131e892a48fbb80f78961f9c440322b49edb03f0e554328eac7c0b3ceef957a82370a8e8169cb24a81595cc89f95d70179834da375d55a1d16a7a8fac8e7da64508c97f4f7a53066ac34d407b42a6be091696351b3fb1f12c05e5429cb0a14208336e110ae4b89fc9b91edd0037392948e7d3beb78b880d3c6d933a73bf909593a0654ea18a5cec051cd17c25abb7020487579a98f62b49c2969e3df7407f9bbf0b01237a0994cc7312b0992cba7566cfc2818db511d37b1f06781b3dab99db5268f527123a0366bf481faaeca57e16b37e27758c8b83125049f3f38681ba5438a795021652b5f81c02876c0f404b44f06976e368aa2cb923081e3dd07781562ae4750bc5f3809226ae6f100fb8f67faa433b66f8153d6a1b846c589b471ea6479bdb05c741dabf217a6177f2ae8224bd05b46de5f1a42ae20a1e641238f541fd282dff3821414890600a970811795c993c8ba5418a8732b6c8b8abf738fc5ca7d32aa3f87884021968a93cc271a490de61c5f8143be65485c9f34f0d433e492bbc5e215cfa037428a51d5921404d89aa0ba6181f5294d706786a30508c5990ad24c7bb6a70d6017207d3c03100a222396c44752579859e07315cf9c397549708901748c6958cbfd41e9d2880e9773ff03808480bb38c36bdefaa5f81f85700fac88ca85829e03d9bb845227a0a799b156d0952d0c54bd5b010c565a381b55885d26cd9e9b82d21a31354c17d2bcd43d93946bb58ed2a57c13509e9537fe879714c64cdbc842e93326aac0944cb3898335004d0fc9c81546086f29136227efbc798032aaf0cba0f3c6aac788886e03c87245964c99c18e62c008d646621d127856c7559370f5fa26301321bdcf502d1d12305002b2ae42e61209892d7b3afaa6cbfa9a38ac097cb26c4745a4eae395a1b10bf80829d1b216b4da59fcb4a2a57d4070ac2ab59a82b6af3b0682b53f9928f7759ce20e1a09042948ba966cee8bd176b2ec6880c063b3ed6d1160fb26714b3ae7b44a4ce6c759555c6e478c0a71a90b62a8cf8f282a4f7c21c31c5becac2595a766a977c886009e9414123e5723e101e667647bb9a2489b3acd17a81ffb4512516893ceba8838949e998043713bb41073013d487cba107f31c84480a0ce4378732d9446970716365278f70719da66ddd8283d62190530566904221b383441124b6f3d47103d64983898f8d83a4fef6489b0c08a11b82d30cc4d9eb4fd0d99085c875dd4801e3902405f0b292b8487a72867e67200c9231ffdb43e2048caaa203c7883218f9a1af7a365a19b0d2fa595a087b2afa1f16686dbd24a98b931a5999483d467d2d264b21ba527ca419b6523fc046bf7fa96bf0a277af5094f3362dc863b8bc2192e5d78173d77139d6ad07e091e7ea507f2a7a9bf982aac812f736c787c27b04e25d1cb74d5d01c3fe6aa2e7248921225632a5033fc6342495167405028d410bc42c8bdb498d9a5260693ba326e2230c6040f332454f3b2020280ffe6bb0b7021f4ea6bb4c06980b62a9b6c89a935ac206b13e091c3c6ae609417ab8c66b7bce94986e92596ee64b08a53844b706f84731755ca02c7c49906cbbdce97c64019a52f278c2f286eacd5a261f5b502251ec136ec0a3c697fc30e8b59807dff5dced3d6bef9c96bf +private_key: 878a1795956ec490aafe2190fe1a0018c9b51fcaa6b97c13da28a8c09a7fd0434596fc21d4e65bfee21efdf30059aaa51bc63c7d646f14f1aa487540380155b4e51fde096389c3a1b983373df0669553334da5ae1e9304619948cb85ad5be4219683033e33ba0f01750fc62ffe5331b4e3756e46cbca7b2fa45c26b8e6b8121719a6655f0952b9df797717ca88bd79a769938ac2f68d4347baa9dc2908757e19157953cc9522261118155df98419dd88556d961ef9855e20c86c4511cc7642c50bb4a35ab30e133b3548055c0ec585d9e1a390226749a739ebc5ca7834ae6776cdb6e461b5b736b11806e59521f010543568ad18097e8654c4cb7c9366db7990439b93a06e83391a62b90fa84a0b842500cc5bba4505ab41f60e8414768ffc1cb9e1b8334869723185aa5b141b94a21d276d3b769237e44f8ee373a8591ba9f6ca2bc852056334e41b1b3348c7687c8688c02b6d3acd484b4f2d9513bf181363a683547176cb1219fef44433899d93863e22274d7e157ee0188be6f53492655c801b4a29c7bde7048d798caf9c475665462732a51a080345fd0292b3b93b4c354a1f3c8b5680c9ef6bad9249472d761d25740e92e1c29e17bd38e989442b60a178ac720b935fa41baea41d1124183784941f510763001f20004caf2b4314cc6e3cfa7d3eda5e78451f27c7c49fb8253a93500ea757f1bcb4e97778b3866f9709083fba0cdf1031a0c667c5f65880d157bfe5986368ad80362dc1a596d31a488835b8e9b1a80ee55ddb146880a235ccb5c8dc64913a80c6c02c44e86bcd40e56737443c49d6bb4ac1501b264fc104a522784c5cc94c9e186ba7a22c329612985b6eced06e373669b691c620c4c6ea170c05c28d022158ad3053c89cae8b144c634ccde032503dd03beeb602e06165487ab4eb1292e484989f6135f50a08251bb5030088583187a57b10aac08b61b0911caa8685657bfaa40ff389310ab3b54efa8df4bacc32d112a2191a8068a390b1a8219a7954fb3cef743c22abb2c1820f86a7b3c8488788816493d300883b8370688b7d0560eca63430aaaa3f4b44d7ea887d70431c266e09c7769992328bc7b2a53734729297130a59e56c3d57893dc3fa7ffcb0070f7267cbe1ac7f2c18061b26409819d9526ee5dabaa47092ce07c2db567a72f80ce9a5284c70c6f6482701ac71c71454185099f62424c81b344fb83ab3475693d6797c5348c7985536550bfc1cabfb6806d1686139a8c920832ec675049f40a0ccca236375153a79c4ccb7380aca2e30038c8f2b745290bef444a71b73839707b524d07a2d1c4f4b00782e9c91447700594b30adfc7868eb546ac27fad089f7046ba8715c41e292415d274c3f03c5f57b311110000fc614bc30960b26edef3961c258240e333a8494b5aa3152c39c728464d6915c8016106cd34213e1137fca383d3b94d545bab479cc11231be67634beb00272b59728f628555baaf35e7bea2c664f616945629cc381042152ab0062902b6d5b3204266a98701f376a278778cb4281e47a6a82c6c1b0f2221577909f9297616f356be210f0f3265f6690ee5b1385ffa8f457a5ec860c01388480a09413181b9602909de7a3dcce34f39dabcbaa131e892a48fbb80f78961f9c440322b49edb03f0e554328eac7c0b3ceef957a82370a8e8169cb24a81595cc89f95d70179834da375d55a1d16a7a8fac8e7da64508c97f4f7a53066ac34d407b42a6be091696351b3fb1f12c05e5429cb0a14208336e110ae4b89fc9b91edd0037392948e7d3beb78b880d3c6d933a73bf909593a0654ea18a5cec051cd17c25abb7020487579a98f62b49c2969e3df7407f9bbf0b01237a0994cc7312b0992cba7566cfc2818db511d37b1f06781b3dab99db5268f527123a0366bf481faaeca57e16b37e27758c8b83125049f3f38681ba5438a795021652b5f81c02876c0f404b44f06976e368aa2cb923081e3dd07781562ae4750bc5f3809226ae6f100fb8f67faa433b66f8153d6a1b846c589b471ea6479bdb05c741dabf217a6177f2ae8224bd05b46de5f1a42ae20a1e641238f541fd282dff3821414890600a970811795c993c8ba5418a8732b6c8b8abf738fc5ca7d32aa3f87884021968a93cc271a490de61c5f8143be65485c9f34f0d433e492bbc5e215cfa037428a51d5921404d89aa0ba6181f5294d706786a30508c5990ad24c7bb6a70d6017207d3c03100a222396c44752579859e07315cf9c397549708901748c6958cbfd41e9d2880e9773ff03808480bb38c36bdefaa5f81f85700fac88ca85829e03d9bb845227a0a799b156d0952d0c54bd5b010c565a381b55885d26cd9e9b82d21a31354c17d2bcd43d93946bb58ed2a57c13509e9537fe879714c64cdbc842e93326aac0944cb3898335004d0fc9c81546086f29136227efbc798032aaf0cba0f3c6aac788886e03c87245964c99c18e62c008d646621d127856c7559370f5fa26301321bdcf502d1d12305002b2ae42e61209892d7b3afaa6cbfa9a38ac097cb26c4745a4eae395a1b10bf80829d1b216b4da59fcb4a2a57d4070ac2ab59a82b6af3b0682b53f9928f7759ce20e1a09042948ba966cee8bd176b2ec6880c063b3ed6d1160fb26714b3ae7b44a4ce6c759555c6e478c0a71a90b62a8cf8f282a4f7c21c31c5becac2595a766a977c886009e9414123e5723e101e667647bb9a2489b3acd17a81ffb4512516893ceba8838949e998043713bb41073013d487cba107f31c84480a0ce4378732d9446970716365278f70719da66ddd8283d62190530566904221b383441124b6f3d47103d64983898f8d83a4fef6489b0c08a11b82d30cc4d9eb4fd0d99085c875dd4801e3902405f0b292b8487a72867e67200c9231ffdb43e2048caaa203c7883218f9a1af7a365a19b0d2fa595a087b2afa1f16686dbd24a98b931a5999483d467d2d264b21ba527ca419b6523fc046bf7fa96bf0a277af5094f3362dc863b8bc2192e5d78173d77139d6ad07e091e7ea507f2a7a9bf982aac812f736c787c27b04e25d1cb74d5d01c3fe6aa2e7248921225632a5033fc6342495167405028d410bc42c8bdb498d9a5260693ba326e2230c6040f332454f3b2020280ffe6bb0b7021f4ea6bb4c06980b62a9b6c89a935ac206b13e091c3c6ae609417ab8c66b7bce94986e92596ee64b08a53844b706f84731755ca02c7c49906cbbdce97c64019a52f278c2f286eacd5a261f5b502251ec136ec0a3c697fc30e8b59807dff5dced3d6bef9c96bfe3e96e658787ba3f6ffb47de56322541a2c81f68e2825c74cb75ab01d4b719d6e1fb7456ac0aa1b97068f452cba64ebdc138bcf5d36b0a0fada2a3b374141eb9 + +# Official test vector 26, seed: "7c33ca0e987226c8524dd56c811fa4d1ccf9995b1e4e4dd5b1481974e88cfabfbf6787775c2611cefb27ed4403ea9b46" +seed: 013bab0212d04ecd54b478daf72748003a25e2cb060ba6cc50bf95c292b8206b9da0c5da5f195b80fbb99c2e8b06926074f3f604b3f6195b5a5b9737876bba72 +public_key: 185bb36d9c3ba85a46a5f605706979ebd66da03c15f1b4c25b886faca00b16e04f87b773d0b8724bb4947c615344f9466f78cae8d049876c9f7143154abc47110b0deac571bbe83577f577046830031a08b465b86e1c341c82660818cd2f8173c5c558975868f0281470f39e737b6cf964008e040382b290795254380b4850db27dff98838d9921eaa8146022937e36af6b030b8919bfea844d9d602ccb3547d5c07f612c12c3c179ffc30fe52c9273b5c0dd27934b5a41737817be0739425736bb0cdd267beacd0bd77085cd2794947051099c3848fe0aa2bcaa18f6a18afb626fdf1b977f376ea74a9cbd638932600efd84fc053650474c801b1a8ed941cc5444922915173ec1971698172f8a61730358c751d2d776d93c866c47802e2ac19c7c092aceb53996c20375b47413a66c06541b4343c548b4dc5341ea92b2266d9c0f1665719f62a72650414940bf3a20a260a5953d578d5aa48a2b670aff7512bf6937e49052c3ab8ba07016d06a9d643081dd52009b358ac13c3136cc65b0127e675bb55b8598940c054c8b797d37312a1ae48120934a559ba31042e160ddd13c744d7ac5dd614d198a33253b829016fae7ca51d397330ba1aac557a8fb56477224324924276aa52b7000f77db547a604f6d7189ef83071293465012b6133a6e1209af3009a867a46bf2868f8ab8a932784b76084998e37eaa4496c661a42e9802f5e1ca947c75bc4a572562733409757855031c9627152c02cd25a9b9725adae909175b27c53c6233e4480cd3a06954afed889ae97a091df86842483edfcb5df9a365929b6da98917ca7b025490b416a7abfda408f07429244a9202a23d23ea8ae96bc8ddd747d1eb9b79a3cf3610bc4eb56f9de38c3fb77db2740504e85107f46896202684db8103b1c488e9b731f0a2bcc40b563226d05946c9fcc1a4e287628bc4985189e05a5174709f00c43eda4897429773140b30bcc090ada25c91b8858f07068bc6c154030f048c1a7002ab58e157ee5b0e682877372426e193cbbdd3c63dec0a725c90d29411986a249cb30ecd981a92519ece4074f18ab92967220ac1c963503a295c570d7084c2917ec9b6a4663a931d6a505d11757ab2935fa708e9b6ad5fc1187f3717c6a4a818d57cf5395626c8a3917012fba13315902391116ff5015051dc8d07ec0716356d20a184458b4089a37fa9a713aa35c8ad1635a7fb49e6bb44cdf4628a3b84b9869dd760262cc487f44a361b9c1106553338cc5dd71c45c37a3bde98036f45231dea2a83001d82203b27aa054cd1bfcd215f477a7e43d31d946971b0d3223868922699b0d810b6fbcc834104bc0ba2cc7a50bc198616468c212c9b9dab2550282a9b88f8a1b6d006ba801544b62564dc05cad68d7f6b143222a5bb28bc9cb57788d417fdb73bd0778fe0529a35190b0912623df81a7387cef7d201aa007a199735bc3aaef9706c6dfa1b0256b872320459951111b90caf3202ceb8c10a480addf08dae881eecd0cec08a2adc61c20e8c15b60824653492e603bc3c203fc35ca536fb7c64084112c878741b83870620eda2997f38aff953217bec592eea7947e8be23fb627251c13fdc9bb0b705491151b8197cb07ec66dd1d49dab7f9d23aa8ffa435f2cc7a7a3a1cddab6e37ab7be45fbbc8a +private_key: 4b11a51a0bac67897ea9cc5d7d071855bc8bb375a18d838016fcc506bbbc7af38473e4275eb5449b0a5b7145b49c700626f7b6e5a6907879c541a0c6f027b7403a5fc25b42da3a7c9308a51e863eb346c178c469bb27022cec566df469340205fdd84f4f0a79842913a974a7f50c2aeaf35e37673c4ae52e5820c7ea843109e403ba5329a9818a856050eff789d4b71acdfc34761c39ae130fdadc300bc6b3295380d3c6944213100e43788204a41c75395142b5b5bcce2ee71ba4b14ff09325c9d884bbf9199e132551a444e527bb98e6b12a8210c6fca2a054bf8fe346c2db0ee9e97390fa2699c60a1e9c4599cc37110460d27b8a5f741d58fcb62962a38143aee0377d6d440662506200fd44bf71631c479080660a9c6286ca3bc0d5f9aa44e7cf23342bcf37a9d710c86ae39e4795c796805f0198b25d0b87e4f77e01b970e2858d26542e92eb356c276e7e95bc77019c4e90bab92c139ae10ef59b44cf8cc7e9b5b59d710f4bf2b8a4a5c5881018d9f593fa5b4c745a3f12457171b735920250778045c0fa3e1378c4aca8388245484a232d1bb020ea665e60da9f28a10e9992022098286c918cbc40476e7c8bde62cc27ebbfd4c10dc76982781ca59d630e086771dbaa1338814496a7ab32913c837264c527080c9b6d39c25e623b61fc180a29aa3271f84a1bc50b7e678143939ae5fc17d33bbf52d95e53b525ff8a8a408acf61d887585b561c3a69b088388f88532c8482a20c445e40362d1c4a331211d8f999c3f2424379b560b5ab4e6b655ff16e0904136a27774ab93233217ecfa58501c1ce6feb7e448ca9f3c76a52511a4a10008cecad9742368b104521b1b4e5461bed4c1a78ec9265d23272c06ba6c492bbe9af2704b9043510ab869af5d9b63ebbb8c2d26051b9b452d5c1605a7c4d60ced3a930aeb63a865056e1f00e3fe450a2da299d3c1583e52ff109cb2837c6b34abf6b063afe82c86b2049d7335ba4762f8b9c039f49c3554c9ccfa95e9105aaa0419d39bc695c873ea42313973724f02729383b90780c55ede19ee06b631752c2c835b0c2f04666bbcbbda79077a270bbd670edf111f5d578cc1b4589e31c22bbaad3c4044c1cb67707aca78c6d7c3441fee377720a6ab1c5b13f3530bc73020200983a962c1403a20d388b2ba71e777c28c3fa066ef0bdc5c94e0df40188f06800cd3ddf1c34b139bba633cc680079042b934db02ff093bd38fc9779f694196b160dd35c0a51c9f56bc4768333b07c4736e5c41ce048582c69f066ae08bcc4bb3c58fae435f6b53f8b533af1309a5b91bf3301b4a315491eb60670b1cb7e60424451031d6786b1f13360c8119be05955c37336f49bd4c2a7e7b15fad1a6d2c52af63870daa148ab0f8476e7a09309b529450b7e75b95988a66f037574ea5b1f3ec3d2d8570a6c46320a30286196e363028923b8af1128847db9b42c618dac72698044144d5c205d14331e91e70f55da87a45ad049d7beacfaf079b148a9da5981e1b40c36837b9e344affb519f961c45a8270d6bb125f42bc5c5089d9c7324de600184336210f57603cc229489a4e27b7fc25cc0861962ff738f06c03d4422bf12855abf225b25b254873079185bb36d9c3ba85a46a5f605706979ebd66da03c15f1b4c25b886faca00b16e04f87b773d0b8724bb4947c615344f9466f78cae8d049876c9f7143154abc47110b0deac571bbe83577f577046830031a08b465b86e1c341c82660818cd2f8173c5c558975868f0281470f39e737b6cf964008e040382b290795254380b4850db27dff98838d9921eaa8146022937e36af6b030b8919bfea844d9d602ccb3547d5c07f612c12c3c179ffc30fe52c9273b5c0dd27934b5a41737817be0739425736bb0cdd267beacd0bd77085cd2794947051099c3848fe0aa2bcaa18f6a18afb626fdf1b977f376ea74a9cbd638932600efd84fc053650474c801b1a8ed941cc5444922915173ec1971698172f8a61730358c751d2d776d93c866c47802e2ac19c7c092aceb53996c20375b47413a66c06541b4343c548b4dc5341ea92b2266d9c0f1665719f62a72650414940bf3a20a260a5953d578d5aa48a2b670aff7512bf6937e49052c3ab8ba07016d06a9d643081dd52009b358ac13c3136cc65b0127e675bb55b8598940c054c8b797d37312a1ae48120934a559ba31042e160ddd13c744d7ac5dd614d198a33253b829016fae7ca51d397330ba1aac557a8fb56477224324924276aa52b7000f77db547a604f6d7189ef83071293465012b6133a6e1209af3009a867a46bf2868f8ab8a932784b76084998e37eaa4496c661a42e9802f5e1ca947c75bc4a572562733409757855031c9627152c02cd25a9b9725adae909175b27c53c6233e4480cd3a06954afed889ae97a091df86842483edfcb5df9a365929b6da98917ca7b025490b416a7abfda408f07429244a9202a23d23ea8ae96bc8ddd747d1eb9b79a3cf3610bc4eb56f9de38c3fb77db2740504e85107f46896202684db8103b1c488e9b731f0a2bcc40b563226d05946c9fcc1a4e287628bc4985189e05a5174709f00c43eda4897429773140b30bcc090ada25c91b8858f07068bc6c154030f048c1a7002ab58e157ee5b0e682877372426e193cbbdd3c63dec0a725c90d29411986a249cb30ecd981a92519ece4074f18ab92967220ac1c963503a295c570d7084c2917ec9b6a4663a931d6a505d11757ab2935fa708e9b6ad5fc1187f3717c6a4a818d57cf5395626c8a3917012fba13315902391116ff5015051dc8d07ec0716356d20a184458b4089a37fa9a713aa35c8ad1635a7fb49e6bb44cdf4628a3b84b9869dd760262cc487f44a361b9c1106553338cc5dd71c45c37a3bde98036f45231dea2a83001d82203b27aa054cd1bfcd215f477a7e43d31d946971b0d3223868922699b0d810b6fbcc834104bc0ba2cc7a50bc198616468c212c9b9dab2550282a9b88f8a1b6d006ba801544b62564dc05cad68d7f6b143222a5bb28bc9cb57788d417fdb73bd0778fe0529a35190b0912623df81a7387cef7d201aa007a199735bc3aaef9706c6dfa1b0256b872320459951111b90caf3202ceb8c10a480addf08dae881eecd0cec08a2adc61c20e8c15b60824653492e603bc3c203fc35ca536fb7c64084112c878741b83870620eda2997f38aff953217bec592eea7947e8be23fb627251c13fdc9bb0b705491151b8197cb07ec66dd1d49dab7f9d23aa8ffa435f2cc7a7a3a1cddab6e37ab7be45fbbc8aeb3fdfcc0b171aa975028f96cd47fdba421ac08e29a0044cedc29fce35eb85109da0c5da5f195b80fbb99c2e8b06926074f3f604b3f6195b5a5b9737876bba72 + +# Official test vector 27, seed: "54770ea1252ea2857d6635151194f5f520adea8a41e409ff498d40c271359858fe2b084d5b96bee087b8e8f4dd4e00c5" +seed: ccb073c4b90be0ad746e26fb093b60c70110bd1dcbcddb566a8cffb7b3caf80e71600a8982c350df524cde514431ded7aec23576530894bcbf0ec0bfef0bb64f +public_key: e80434a94334b45589b1866bcc69bad27ba323a563f47bc34073496a468dee6013330bc9a219452caa35c1a522c45c498fd4ac5564627d564d3881c731a9856ff7619622aba6f928beb9b9373b1104e2cd2e6246bdd88268c1b512867ae4ccca21140f0c046b5e5817fd64a2f93383c3a5add2f62784e2c8e80c150a1c8e1a8a47232787ad529333a07e0c512332799d9896a6071bb4e4fab647440f82cc85630c629c2c2068037948b575a1693f81d2a045a9c5a5c2306e83b911ea1e86db5763f13ca6b02ca8905b50faadf5440bec7b49913b371f0c5786fc585dea2813fa9ced349d9fa32cb5030b5efc274522ca4c6985b9dbbb245465a8849c4c78688392b0ab5bca98b04c7bf988ea84292c8505fc7acf90199eab7c31c13252680c71c9c333e91a0adbc1bd00d023c8d7a7c9068c3fa9b3cec75234663a2b73572ecc71e53a8eb5889860a336f77bbcc1c854d0c3c61c65216373bf2603a0ee72af8f747bfbd7401bcb9d599b6cdb02c210010d0425917b72891c33c97e9b39a677010d22a784003e1b917dfa3273246acbb45a79c7848143f0b583781626ba02a94922490c7b3695a787d9ae22e5470d32cb68790d75b81c55d084a43c4399aa587e07829510220469ab5e6381517bc9059353b68160ebcb0edf969e8c317442c4058423c3356b34035b9761744fefc76145300908da3c13f95eb3065f2cbb911437cd24f815197c0dd3f9c87e3b54432c50de1c7549228c5f9c32ee8c19fc4cbb04514025645e0fd1468dfa274e59a50d62c560eb051eac35bdd148ef75b0b05357619490cbf08b0b13767557c5fdb310da985dfdb9c35580217067a8c68491ba64307a618d272363ea346629ea6885acc17733a801166fd404cca58b591b68b2c73a9e890a13bb173584d2b6db351133e75d258995ce46a8f798a44ddb8526633949e5442435c7b3c083875760c00614665c4a2ab92c378863a3755ddf681905ec2044c331c4b976f6ea5335bac739c2be9cf141a9f3ab3f669c5fc49d74f79ba066a7d03b0c2036247c86305bd45194a00e33a1179ccb8d05b374deb491bf5c1d6adc4506803a8c65b18dd6621a5820ca93c339dac2bbc098c22b4e1fca3cabe58ceab66da6a35191a29ad82c74abf1c823200bb197015e074d14f224fdf30a51bccc015a152b8443892b7450734b34e77356231c6a8016aac430db0a8954c7a416b43d49120fdc4017cb61c3bfe70fbf24773412b6a91375f381658d57677fe571c3bbc800cc80ac597a8f2c5cd1f19567ab1f4c797a68e6133507aa90d1ae096148d313b48096ab96298c33c3828d645a28098c777cc10ce068c035a71f7a2a36306fbbc311d3d14214c042871388dc899ca2116baac1aa5cb261af35a0e255b228498295f6b4ae171dfe21b5f66671af532253dc724a893b933829a0c275c20407898911472a02eb484d4ad5b8d274c00bd9377f3c497e6845161868434c968bd847ee90c2ecf600867cc790b005061c8d5c49339dd3ae23920e65da2a19d649aad1b722552e07f51cca7b87efa315b6191b31279509d78b0e974860ba9f635283412038efe3ccb2a0c643c68756149a03b50f6891b9fdaa099ed50d7a012c0175b9518c15649396d94ca1266979893e82811af8c142323fc3d38b8b5e554f +private_key: 06e67b30992ac43a09b6572f7b4764ea9bba93b05cc3577a8f762279c1c9991044b7c57ffec6c73a8cab976031b32c33430807913524a3e5ce0e1627dc11495aa31a0712302cd26e7d980bdda08542d30fef9a1cdef2c302c61b39d119c09909b338529b89c4b52cbc5111c20a880b493b01902ac47feaa041a72426b4625da3a79704a239138eca642f24d382dde6a0c549676bccbc63010ea8f17dbca231e69ab7acc5a9d9081090cb653871532fe48879842e7dc41bfb8820f22367189b31d1f201b7c50e25466fe4891115c2c8337a637e964c5d88c5e752c9a247047bfb2b0df93a36d06d80c3230cb628ecb5997d999b1a70a5fdd8b9588678d1e892c330bad5aabe0927029f173b6beb512d59369739ac8f0b5fb1663a874426eb31cf1818199b984c6c01b70cb56c2317078c393e5a35cc749c7d06a29c08a3637854a3cad724e8c93199dccc115b5a02902f29b482c6f1560ea778abc9c0bfcab0f4468761e17c8d265b93ba7927a2868f78bcbe6374723646a82821a4925c548679ed3bc29fd6022ea952e7b8acc220aea82c66c75c1a9d4a2a7f793ebb969b877a85a3a1a886cb57c58b3d0e091c5d136dfde61f1685626d73bfab6b672e95628be27071897d880007ef364982ea4547b195bfd79323874000d8179876a61b0589fe769e7193378c61149627acec65616d701f08f654f486628cba1574e92ef7f96c44a0ad9057b2b175012dba705a4735db91cf96155146dc53ee32a8e7620d1f6c0d969007ba84b36fd2bbad660882467b6675b77d838b95aa32c6fb04f109b1c8eaa181c4afe3cc7e2e301c8c89cab8e4587fb472dce46f3980aa62a61526b79108d611c9c103eb05746d58ac6cfa58c4a474d2a54f96e8617453847cbb296038498121b867f9aac8776fe153bf3f8895a5d02df74c934e2309414597c176857955bc7bb3c5989157ea63bddba696cbe57fbff0c71ff637a54117939708db26732ba13b33783416d0cd3390a437e8cbf4c978989000ada7c5405254b9e9094c5b9c3d211f03e205e6469c478ca212136c9ee79a427b00370b2138b0c11cb435f93c4ced3326c3b1bf9a2991f9c4c285ab09453a2cae4797aee106fd95949f2007b8a6177a18bcfa717106688c7c536d955b3db2f730c832b19cf84b31462c6c4623527b7e454085aedb59aec591b69349b00668e170b2667358daaba2d959250cb0486f0448768689b2c5450e8ba2fa3a77e9e9080dda636ffa09081576fd2b0320e69cbf017d468309076884aef925f6a9938e76b52b453eb8c563411977551057ff750f1c206236679c09f98b34026b42a2c778407014396f9cab89940a3d66d76ee512b7f07375ecc039c4258a1c7a8fe521868a99c18cb78b17e78334e598a5260ca42163ba705295f28c36cb19a242216a56079826483698bafef6755ecba3b7091ee2c3c6afc9b9d2f42317a51e2a61bdc229a4b7051afc6472062a440cc7b684e200aea93232ba945d21007bcb58bca99b269c5cb46b3915197278c27bece1b9a4e6ba09ba38573987f30490f57c09e750c9fd87be933a91b9c59717e3b5c6fb660eac8556488d942b4bb00711b2c93e4232c1c7a08669776a3f607ce80434a94334b45589b1866bcc69bad27ba323a563f47bc34073496a468dee6013330bc9a219452caa35c1a522c45c498fd4ac5564627d564d3881c731a9856ff7619622aba6f928beb9b9373b1104e2cd2e6246bdd88268c1b512867ae4ccca21140f0c046b5e5817fd64a2f93383c3a5add2f62784e2c8e80c150a1c8e1a8a47232787ad529333a07e0c512332799d9896a6071bb4e4fab647440f82cc85630c629c2c2068037948b575a1693f81d2a045a9c5a5c2306e83b911ea1e86db5763f13ca6b02ca8905b50faadf5440bec7b49913b371f0c5786fc585dea2813fa9ced349d9fa32cb5030b5efc274522ca4c6985b9dbbb245465a8849c4c78688392b0ab5bca98b04c7bf988ea84292c8505fc7acf90199eab7c31c13252680c71c9c333e91a0adbc1bd00d023c8d7a7c9068c3fa9b3cec75234663a2b73572ecc71e53a8eb5889860a336f77bbcc1c854d0c3c61c65216373bf2603a0ee72af8f747bfbd7401bcb9d599b6cdb02c210010d0425917b72891c33c97e9b39a677010d22a784003e1b917dfa3273246acbb45a79c7848143f0b583781626ba02a94922490c7b3695a787d9ae22e5470d32cb68790d75b81c55d084a43c4399aa587e07829510220469ab5e6381517bc9059353b68160ebcb0edf969e8c317442c4058423c3356b34035b9761744fefc76145300908da3c13f95eb3065f2cbb911437cd24f815197c0dd3f9c87e3b54432c50de1c7549228c5f9c32ee8c19fc4cbb04514025645e0fd1468dfa274e59a50d62c560eb051eac35bdd148ef75b0b05357619490cbf08b0b13767557c5fdb310da985dfdb9c35580217067a8c68491ba64307a618d272363ea346629ea6885acc17733a801166fd404cca58b591b68b2c73a9e890a13bb173584d2b6db351133e75d258995ce46a8f798a44ddb8526633949e5442435c7b3c083875760c00614665c4a2ab92c378863a3755ddf681905ec2044c331c4b976f6ea5335bac739c2be9cf141a9f3ab3f669c5fc49d74f79ba066a7d03b0c2036247c86305bd45194a00e33a1179ccb8d05b374deb491bf5c1d6adc4506803a8c65b18dd6621a5820ca93c339dac2bbc098c22b4e1fca3cabe58ceab66da6a35191a29ad82c74abf1c823200bb197015e074d14f224fdf30a51bccc015a152b8443892b7450734b34e77356231c6a8016aac430db0a8954c7a416b43d49120fdc4017cb61c3bfe70fbf24773412b6a91375f381658d57677fe571c3bbc800cc80ac597a8f2c5cd1f19567ab1f4c797a68e6133507aa90d1ae096148d313b48096ab96298c33c3828d645a28098c777cc10ce068c035a71f7a2a36306fbbc311d3d14214c042871388dc899ca2116baac1aa5cb261af35a0e255b228498295f6b4ae171dfe21b5f66671af532253dc724a893b933829a0c275c20407898911472a02eb484d4ad5b8d274c00bd9377f3c497e6845161868434c968bd847ee90c2ecf600867cc790b005061c8d5c49339dd3ae23920e65da2a19d649aad1b722552e07f51cca7b87efa315b6191b31279509d78b0e974860ba9f635283412038efe3ccb2a0c643c68756149a03b50f6891b9fdaa099ed50d7a012c0175b9518c15649396d94ca1266979893e82811af8c142323fc3d38b8b5e554fd046d93317dc6d0ff28990721c3f94a93024ce01b01c0ca55d634c191c4280fa71600a8982c350df524cde514431ded7aec23576530894bcbf0ec0bfef0bb64f + +# Official test vector 28, seed: "cd6cfe94e9c0a1cc4ffdcd2d7876504be5f50f1d1ca5cf93482943465b268276056f2781f4de805c138976ca72621387" +seed: 2e889f44e28901e9ac7ca6b2fffcb124c8979401b17064d7e1d51a7e3c3adbfa0e145e44aae52cfc609e6f47fd7a6f6af877190ff52256d0ac5b05b89c3f449f +public_key: 70d99d171745edca3a65045bf6e0625aa4955fd125d332ad33f9a3ceb2313ad50c97614d038547f22a135a33c06c61545b9a26b46c41d1830b83d0257fcba82b36510199224855bd1a837a369a2c823391b1f84e54959a06938513681d97f34eeaa7bc42eb13574b29fb785c457786ac69ca22f644a1d53278d4c2e0f325a1209a0ca40fc32b92e906650b484e7d92cee99a078f5090d2fb60f84b47dd44224228443d36219a081f9956cd7983ab223bcc094a0c65414cc2aba8564977b147088ef41aba589653e535847450c762517dfa462037c2c1457ef3d1909d0b79d66ac6ed9803ca88a7295c4a3ae53cc77c235cd8922b36ba8b837f375755326a960beab71aa1b33a8b64d6076f0889424b1875ed6316ed420db7e02d731b2b3065c7e80115fc1406c125b651c2b4ced28ae9c67cc505bae5b747e5722f4729602bd1aaf25ba333c29ca011ce36f55494204b0f70895938c9c4658044740521097d696c8efc045709369f88c1cd46bb763b957db8f48abf1a07f431845c94beb7a3a68d42af6c2c3095f829de51b37c134f977461aa2818073682def71a65291904f0c214b727fcc7b522c2a33f7a2e07a65926fa5661172103b390fde2814b21273b318d029a112fd389d0324506d280be8c49bb923412f4c430ca82f58ca8b7122907b986fe912c323b1758901007067153db7b16168f791610df534aec8050a58296f58b7549f0665e13918c784da2d00da79559ee006566050482b2a13baa4884aa83351753cd7a48e6385292a990ca559c8d630a7dd4947e428198b06242179c369741fc067dec411765c58364d32ba655350530a4aad934a1d14b76f55a19ab7f2dc60720124a2b69ca703030b2320dcbd459cadb6662fa0aeae170f880797e2bb0a2f24e8dd1442549ba4510153640ba7f093acaf41f67f55e4269260ce2aa28261d4dd4acbc2a4a134751261991e7b36183387893c5900e8a611894c76c26217a390f86e5068a947457db75e7214b8b05a3c87251cc2101d7e6115c908d2721aab224b038c1b9c348a3c04c081496928da726c0d140d363a427b93427f16841c97447698cd0f360529725ec86113594045e143659cc1a0667832f40aa7e059d0b1389048a75429886095b3ec5a646ea12a09424338c6ab729a27e595ac7784169c6e7c7bc208b07a44cee5940f85896a7285845a2a262da092d1b0295821975754898bab492530e44a410f35563a1e45775613192dc45df526cc19b6eed8186e6f706e233542a4450fa6c89bf993af5699dc0e46965417433d5b1882340a1294d4b229d42061bade4683f8557dab0603fab1bcd956b29ba8a2af60093654f09e70f07eb3398f7bed1354a7982416ac40860538c36722ce1b37322c4a888c2359080704490b613c9a5f7318566a37139563c40d58c055b827145bd659c8fc6b7908a071fcdf0b17e4351cf3bcd9e8cb9361985c70c49bad71f860b36ae120f62c06f3b34aa4942985d149db7b13e1412cc1ff59dae21cf50017883a0aac754ae6cacbe87a46919c05752877840556af8d56fcd848f982b415d333fd8640794918ead0121d12309bf622d9c97551f294c3822644834b38fa844a035cb5458aa7240f750287f95feb1696d88988eb0648c3cc0fa9d4277fd9af8c579271f4c77 +private_key: 101ab759f6afcd596d4445b4e3a1907b3955f81641cbd1aaef79b22ec38af5a081a570b67dabb410aa3c78925c82384b5931908d147926230522da5cfed372e9eb2b94900625e74caf1098144572a3d9ba32d875c9184989c823a3f23da4144938b88836e9c708e52967b8413f206758f578b340b2936b798775b7aaa09efd567834e52afbb17bff8b11fa0435e6f55ac73219e79254e166cbd8dcb95f0874f26925dfcb93f9461b2a48925026651b0cae117483d65b3f57b90639a39b16b1535647079f12a0d897c51cf60291a165fb884680071656c407c9e09b31977042a2ab6783a9b448ae7d924243dbadc5b00c00303c9a12308bbaa51f024884126e01346665f67344d2698adc13159a316e4175dc532c75d40d6ce54916da9ae3f763efc74dc9a904d7d8941fa34e493a74e0f9032e44a84481916530573d4b372fc6790b3c357a6b6b075b87e6b1a82928037da41f265c7a493abae425c11b6514a96c6e3949520ea4b9a7a18c76c53016a0ce644237cad882d79c60739a4d2651a4e900463a224f1769a40d04cd1c2796ce2860844ac6fbc87b00379446a637f868b73be31c57f41830d3628babb45bd5b9712b33bf5637e897c6bae6cfc6717dd87ac5da5620ca04cae154bf58f61024873f4ca93738a444801cb5b61acbc6098b36747bf6926e78b08939116ac1604e5f61570dca65832ba04c8c64da99838be418b61805b1382cc899559a62b73230cf126a701a56aea6795e6ee95c2169ce82ca352a5c411d89881a3a992704143a06d01ba15f9f59083bb70c69fa5b7eb72036da024a3707bee499fa4057a52c36272579209215f21890216c0f0dc83b5dd38867604a6175c417962a8a8513dd5aac8e0a806bf24a855c89252c392f6acad0404f9445b0b781bd26e15f4cf4a7d815bdef3936001219955797c90191c7c794987c3d1d80b07c04b14ea5a6ad49bd4ec27720e68a8e855a042a8b223821dad9b53c00912ec92249ea15af46091714759d04b4734a5c60d979735741c9acaa7b62b413c439a3bc7a6510c9c5900af2177bc5104c0c079c67a03a12f923ead47e1ba85753f822c7334e25a02a1b155e0b4c22af82b353db202627b2e4949a3c874c7207c0d96480c33c9070723b9ca1a2111321fe22170544c255d3246cfaa6960264ac042168922153970a6df7a465690a7348c1ec77b997bba243ec7508c88b730407bac2a9b6040b83ba7e034a7388e78b010ba662d15eade2495ae63568a12349c57baaeba16a32c363245f599475f7e141d1d2462076abe3071fa2566c85197bc79b24876461f9a0082f4701eeb619cb5c4b1c169715729fe2e27d85890def829473d33f47bc7216030063466f2a8c9fd5e14e87374001b256a6b98d3c53094811108c1cb6101a6bb18a8bcc7bbb7b4278d030c7f04368d655c848d1a22d8a79fa787613b653cd0106723c9e8f81439083a7f022b9c98b6dc7d39c2c7b5b61f4c8dc06728741a641a9684808b20ff84a9b2a569784705ea2758c0176517ab47c22b408ab16ec20b849f1cbadd7ca82332107d41f7e6a6135365f86098fd9a66847e03641bac2f1c933baf967e94265d40847976b68c49730d245b5723b9f70d99d171745edca3a65045bf6e0625aa4955fd125d332ad33f9a3ceb2313ad50c97614d038547f22a135a33c06c61545b9a26b46c41d1830b83d0257fcba82b36510199224855bd1a837a369a2c823391b1f84e54959a06938513681d97f34eeaa7bc42eb13574b29fb785c457786ac69ca22f644a1d53278d4c2e0f325a1209a0ca40fc32b92e906650b484e7d92cee99a078f5090d2fb60f84b47dd44224228443d36219a081f9956cd7983ab223bcc094a0c65414cc2aba8564977b147088ef41aba589653e535847450c762517dfa462037c2c1457ef3d1909d0b79d66ac6ed9803ca88a7295c4a3ae53cc77c235cd8922b36ba8b837f375755326a960beab71aa1b33a8b64d6076f0889424b1875ed6316ed420db7e02d731b2b3065c7e80115fc1406c125b651c2b4ced28ae9c67cc505bae5b747e5722f4729602bd1aaf25ba333c29ca011ce36f55494204b0f70895938c9c4658044740521097d696c8efc045709369f88c1cd46bb763b957db8f48abf1a07f431845c94beb7a3a68d42af6c2c3095f829de51b37c134f977461aa2818073682def71a65291904f0c214b727fcc7b522c2a33f7a2e07a65926fa5661172103b390fde2814b21273b318d029a112fd389d0324506d280be8c49bb923412f4c430ca82f58ca8b7122907b986fe912c323b1758901007067153db7b16168f791610df534aec8050a58296f58b7549f0665e13918c784da2d00da79559ee006566050482b2a13baa4884aa83351753cd7a48e6385292a990ca559c8d630a7dd4947e428198b06242179c369741fc067dec411765c58364d32ba655350530a4aad934a1d14b76f55a19ab7f2dc60720124a2b69ca703030b2320dcbd459cadb6662fa0aeae170f880797e2bb0a2f24e8dd1442549ba4510153640ba7f093acaf41f67f55e4269260ce2aa28261d4dd4acbc2a4a134751261991e7b36183387893c5900e8a611894c76c26217a390f86e5068a947457db75e7214b8b05a3c87251cc2101d7e6115c908d2721aab224b038c1b9c348a3c04c081496928da726c0d140d363a427b93427f16841c97447698cd0f360529725ec86113594045e143659cc1a0667832f40aa7e059d0b1389048a75429886095b3ec5a646ea12a09424338c6ab729a27e595ac7784169c6e7c7bc208b07a44cee5940f85896a7285845a2a262da092d1b0295821975754898bab492530e44a410f35563a1e45775613192dc45df526cc19b6eed8186e6f706e233542a4450fa6c89bf993af5699dc0e46965417433d5b1882340a1294d4b229d42061bade4683f8557dab0603fab1bcd956b29ba8a2af60093654f09e70f07eb3398f7bed1354a7982416ac40860538c36722ce1b37322c4a888c2359080704490b613c9a5f7318566a37139563c40d58c055b827145bd659c8fc6b7908a071fcdf0b17e4351cf3bcd9e8cb9361985c70c49bad71f860b36ae120f62c06f3b34aa4942985d149db7b13e1412cc1ff59dae21cf50017883a0aac754ae6cacbe87a46919c05752877840556af8d56fcd848f982b415d333fd8640794918ead0121d12309bf622d9c97551f294c3822644834b38fa844a035cb5458aa7240f750287f95feb1696d88988eb0648c3cc0fa9d4277fd9af8c579271f4c7721b12640bf755e94ba06204982458a9be11e1da542ece4f3d284886800fc8e8e0e145e44aae52cfc609e6f47fd7a6f6af877190ff52256d0ac5b05b89c3f449f + +# Official test vector 29, seed: "265eb2de7099e4bd5614e5de7f0c2a05c78ef3e8e2dd4ae4cb70f3e5e59c8d1d88248303f07de0c5508652da66b47222" +seed: 174aaa36410566dc15a5e62874218d7abdde0b2c0f30d877bb80b1abd5f5a0a450a7a2354f7e5cefa6f4a4e9a1c411eb9364506e9e1204a8acb3cb77fbd2c4ed +public_key: e770043be600f7a60b3b370bfa6a30c846c475127924071e3120879e2a158433a2a3a7791c204912da8576bc2722eb9e38139c198915986b58a9671fb054a81443553ad74563f587b226a9117c133ddc10dc0655a7d52d493b7b3db9584c49b4d1f41c06665a3d07383057ad70b69f85b6cb2682238120b830681794e042d910467a24091d81322a08aa1d83b0861113756615a119503af837eba16768046b7e64ab5940aad4da6e3165ad036959c39bc69070bd7f074776089aff76b33dcbb17bcbbe65b526c795b65943821d5b52ac1044cca52e3403a02604a1b4d9cc84e4b72b2c136de898a12451d8c74c280a67cabba42dfcbea68455c5f45bd3ec03bbcb3f72604df70737a01683369c8a57091742c60f089a673da350db8ba39c2a1108aa6a4e2a6f24b13d95f004801b240b50067dd34b60991db2a42de3dcb2c24034d0cacd24c890cac7a134bb183c92b5d66c7000a5a3f80898754827c9a7cc01a1550a9cb4f4f18d5959be0ef84c35b54468c55a15d274f996cb74449d1e5b2f88bcb6d00912a9305879bb156bbca9843610af2c5193363177d2b5867240d207819498a98209c109273dd44a4f2a06549335a63afb2660d212592c417b426268485a7e8693f865c0a7960e073153d5e578a74b34e9c3a57eb20fc825ba59e56359a627f358a4d7127be7d571c991078d9630e1262402a731b14b9f0ee4a3fa4494bde9aaf2d4603af1178b8b49a649056fe314caa92df6d816fba591fc4961cf0509d0dbb02ea7321ef75aeb20813e33a9717478be58b49fca3130ea2b54e62fd3243f4e240e54c08d26c5020a9512d2536c486772e725267bba974f3a451bd50f29c55c7189012473ae1e5a7ef35c0b479679f1a71fafb41ca6d16b39f100201bcf2515075a1c9f881a7ae4f4733b149e7c29973588c161616e9918062236332cc67f26a65fc72c78564312c429cd1f3854eb98c0ce91be6d9a24aed0ac65bc5d805490e1d8c86963c8adeb8755e0bcdfa473ee23037673773c46911ce0baf8c81bcd8047a9d19175f6bc31c2997c62c502b934d7651fc51562625538e24b235c4c38cdb82fcea4abaa963b3d67b3679b51a21cbd77228338a95b4d641b5eb26644a58a59abb0a8c0afc8894792b3c6edec9ccf7c29c620b9ca262c634621d225228f1503609b548f0418648cab5b9609e7486d57e5824c538037d32319427a3b077703a7368270c9b752217eb04b912a3843f4afa829b38174bbdd1cadc8c74697544f6229068344441ee2863150716339716ea6a8245a3c3c142b986b7462fa2417a413ab718ceb196f15f887a465c8f901c55db4718ea58c71926ea344c49635149014297275baecc90ad1c95c75281eb885264f11123ad8cd7cf1968e885220f0964f25510539be63263a4eb6169f7319f0086fecf996d2e852f139b500dc1fec8824430505a7702360d81823269ff4b2622b54b7f917bb44714660051c31d9b39494a64a86c15c516437c4a437f41c0fd5922dda52818336d93a8c750203fd859b06e127d8e33b52c34411e4199cb01cbd70b8ef0180b045119129aeb04398841bc8261444c963c3fc11c8dd4c78dc5a8cd902687e36aca5f2667abccdf2093e5ecb1a4f09769a8251104731ee68587d0a470e2ee6ab99d3af13f31776 +private_key: b6a8be5c6c9e94c1b41a52cb1165b3e857604ea413dc11813442a518bbb3e1d84724109f9b1288f5f34d06c3aa30d913954c5c053486b60b254f3250e9aa656dd71553679f5f112d8e8c7f11e6b19072ab3784284dcb2988cc10d673a423a0c202f03cdcc74a43422a2fd3b934b67bceb074a349b8524786f6c126d72a384c0a84fcb8304af2c3d65994e5095274d2715d057b920ab40219ab156cbaf7c314fad57122505ed15a61dbe66cd83bbacdc9b3d3a1afb0d607d6e01a3e227d3109a1ea14696d84beb84c0cd02b2964762a36f153a8b82733872b0ba6103437a191a59439fc3e2ec899ba841de42bacae534bb3100854283175548ab055cedb836b49fa5841ca698571c4794c7648c65d5fba44b3c57d925aae29cca857301f61b6940bbc28b634bbefcb51037c301674297170469cd7ccf39a828d2110f8f3b9cec915c6423163d90b2dbbc644864a6f8761e83371e2c3724617b7ccc893561337bfe7832cc4a0636ab871f07fe9b93b7169029bebb7afbb02ab249ac3597e0ad052b233a454f6628c52c6727a4267447bf11064b61a1ba6a4b7eda764de23b0bec1b954d3c5882432e1ba6ef1b94eb1464086ec2a5ae0167eb8b5ea2b40c01953f223544e49bb5c441174537cf8953c74d318a5b4b6190881cdba5b1305b6a3e2528c4c8825107fe323ce9e979f5d33aa20712b6ccb5cdb449989922b8e571a71cc458537bbd8e9a696d644c713bd25607d4c26a39bbcc11d58a4154c1161bb1e771986a4d923dc9936806498cee91c3ffa819baa73d1103b868772340a1b1ab664ceaa82d60b328e2963259c039e12798adb66e62b827fabbd32d7b29e615ad76cb5690550af975c2edc1aa8849566cc8bd2639f009453d1fba689ba14d5c68d55ec1d90074de4b47a84944714a9c11d55b271727c64e566762459f7e381763981776665c3d908110a74b7977678e011c36058de9606ea225084331c0f2479de36c333c26122ba9fce2b360628b5b8919838829c2ce55b12a6b80a3a5ef01998549a1a26223a96916ddb8a0258b5ac936b74d496b8bd249412176b697182054b744301c2a3b10b2fcbcc11ccc89ff5b40f079817c186893bb044559ab646626f683191a03fd6f41506ccc6f49627c09a821ca427e8122ff91234d5d92318863aebe86466f108e9a51a37822a990bbba5e01292543e756b64a2191fe855844185a673c584a2c0897e1b73ead8ce548833c03447dc32bfe6f0cf615469ca61c376a3365fa6cb79c6129636c48ad68dfe2c1553f01dde270d1830096a03072095bfa24282f1d100c2673aca13c1acca01f158aa3a593d0b78458b75c8f34ba4f9391afe255dcc715eced306545a6a683191ee731cab1177532882d301a482677fb4c38d6b69201f0920162641f7f701290969d5c63eaf13a133563e95ac5e88a42f4d128b9c69b5c3f16b76a6731fccbe6f58547799bac3c9a6f3cc9a13ab0cd26a50bae9774acbb86ce8944fa01b16840a8b220d7886197f671e64a41886c80af2f66e899155b125181118697db62a4a4a0da162240e0218739cb439406219c679f9857dbfdc73d96a0f7a3181eeb3b38d8b31b7da8e65f30995f778ec5b4026a28ee770043be600f7a60b3b370bfa6a30c846c475127924071e3120879e2a158433a2a3a7791c204912da8576bc2722eb9e38139c198915986b58a9671fb054a81443553ad74563f587b226a9117c133ddc10dc0655a7d52d493b7b3db9584c49b4d1f41c06665a3d07383057ad70b69f85b6cb2682238120b830681794e042d910467a24091d81322a08aa1d83b0861113756615a119503af837eba16768046b7e64ab5940aad4da6e3165ad036959c39bc69070bd7f074776089aff76b33dcbb17bcbbe65b526c795b65943821d5b52ac1044cca52e3403a02604a1b4d9cc84e4b72b2c136de898a12451d8c74c280a67cabba42dfcbea68455c5f45bd3ec03bbcb3f72604df70737a01683369c8a57091742c60f089a673da350db8ba39c2a1108aa6a4e2a6f24b13d95f004801b240b50067dd34b60991db2a42de3dcb2c24034d0cacd24c890cac7a134bb183c92b5d66c7000a5a3f80898754827c9a7cc01a1550a9cb4f4f18d5959be0ef84c35b54468c55a15d274f996cb74449d1e5b2f88bcb6d00912a9305879bb156bbca9843610af2c5193363177d2b5867240d207819498a98209c109273dd44a4f2a06549335a63afb2660d212592c417b426268485a7e8693f865c0a7960e073153d5e578a74b34e9c3a57eb20fc825ba59e56359a627f358a4d7127be7d571c991078d9630e1262402a731b14b9f0ee4a3fa4494bde9aaf2d4603af1178b8b49a649056fe314caa92df6d816fba591fc4961cf0509d0dbb02ea7321ef75aeb20813e33a9717478be58b49fca3130ea2b54e62fd3243f4e240e54c08d26c5020a9512d2536c486772e725267bba974f3a451bd50f29c55c7189012473ae1e5a7ef35c0b479679f1a71fafb41ca6d16b39f100201bcf2515075a1c9f881a7ae4f4733b149e7c29973588c161616e9918062236332cc67f26a65fc72c78564312c429cd1f3854eb98c0ce91be6d9a24aed0ac65bc5d805490e1d8c86963c8adeb8755e0bcdfa473ee23037673773c46911ce0baf8c81bcd8047a9d19175f6bc31c2997c62c502b934d7651fc51562625538e24b235c4c38cdb82fcea4abaa963b3d67b3679b51a21cbd77228338a95b4d641b5eb26644a58a59abb0a8c0afc8894792b3c6edec9ccf7c29c620b9ca262c634621d225228f1503609b548f0418648cab5b9609e7486d57e5824c538037d32319427a3b077703a7368270c9b752217eb04b912a3843f4afa829b38174bbdd1cadc8c74697544f6229068344441ee2863150716339716ea6a8245a3c3c142b986b7462fa2417a413ab718ceb196f15f887a465c8f901c55db4718ea58c71926ea344c49635149014297275baecc90ad1c95c75281eb885264f11123ad8cd7cf1968e885220f0964f25510539be63263a4eb6169f7319f0086fecf996d2e852f139b500dc1fec8824430505a7702360d81823269ff4b2622b54b7f917bb44714660051c31d9b39494a64a86c15c516437c4a437f41c0fd5922dda52818336d93a8c750203fd859b06e127d8e33b52c34411e4199cb01cbd70b8ef0180b045119129aeb04398841bc8261444c963c3fc11c8dd4c78dc5a8cd902687e36aca5f2667abccdf2093e5ecb1a4f09769a8251104731ee68587d0a470e2ee6ab99d3af13f3177695d9e5b9151d87fed52e287992acb897a07b10ada1dd83409a5ccddabf9d7cfa50a7a2354f7e5cefa6f4a4e9a1c411eb9364506e9e1204a8acb3cb77fbd2c4ed + +# Official test vector 30, seed: "806bbd111f27c2668318387bd0830f65ec21a51af01985ef48d03d64e1958ff7ee5133a4ebf6dbf36329bcaaf65f40ea" +seed: 351fe4313e2da7fac83d509f3103caf7b4c64a4d458fefdf636785ac361a1390f072d9b5a99f9c7a0a011e4dc10f6b600d611f40bba75071e7bee61d23fd5eda +public_key: 13568b12232135a5896094834cf450d789ba498787368b4e15f1b087a704e8e327d631290177add97c0a0d84820ce367dc515fc362aaa98aa7911a867a3789f69a5b68bbbabf3aabd037b5160a3f3d8277ec47898ff3ba5ddbbca6980b5ad47c59236eb33b2a9c84b212e93d9e70aae78a4f9f6bae592ac2b5f96eee627971d27389905b215869d9f4b706c379aa802b5a99abf754ca9316872f033ecbd5b34f72c610c14037540a2c86ac7eab0c3af84729c48610615c9956751759660b3c7bab57146f7b1088501fe14b2f59141b1bc6302d88a35fe27e0cfa18c1a22a9eb517ca6060f25408d4299a7f46c458b3bc38c4794bda8f9079043854179db0071af69c9f074a83438874c882cd18b69b0b2009497b6fe94a9264470be8256b49b6c353374ad49c04b1276fd484338796e4389a523598f3776291512e25fbb5fe98591320c1bb47c6ef3b4bd1d62b6997b5561bae038854ceeb41b2925c1f1a81a702b57b2815f62aa9eb2625ff3512cf9595073ca623da43f32c21d63297a491b28dd8b1361bbc91b40b34a65f1a2b7db86b0b3bd21b26ca5795b795e355b45d1623b3a9731218174b50966d6937ed057fb10b631a51b7d42072a0845be8553e19901fb0eba35f5142c75857f642918bf24544355c4041102d8b197b429fe548433eac36c42077ed787f8e631edb856d4398a26d536911ebbd9f9c22769c756f858d180b6b51797fe9ec0833c908d9ab2730d937b76a0febb68fd84372c96c3c05197093e26d01219c15f898b2c7ac75d11485a2a413a065be744e0908b6340155a244838ddb14b74c578fca2d7e6c4e15e68421a568e7e39a4a04231926768ac4a061d67550a8512e780198738bf3e2420cf75680d1cac07798c01ca06102cb2ae5c9b99b62a7349fc8a2c558989b68e3789c2c7074b476d18212846c8a8d562166829a36587eafc95a362874e812aa951a6995f5a94d370afc9b64777a7e58cb54b62a95476ccd323073d6e466e6ab909b4b4cd840aff393c9391902f4c05bea833d254207cfe938669cbee478c57ff4424004003d151fe5e90413924bf1378419e08dbc46911e2ab2b7f45dcde5c549f679691632c3d9bae26b9fdb85c7bc3301a3900386873345974bdc007f869155df79cfc6f06c39d8bc9a99675382358ba25836a15cc222ae78e4a85a19c5da9912e48128fb37a7f386c0fc86afcd2869e292ca9b521e6ef9b12908ca5d800ae1a7a3a7070766e2802a947c7edb3452a377d9c1bcdb152d37db41ce7c74c36b32c59131b1b85f9b68a3b66773ee4a2b81f12509c33cdaab4caa563e9bfb3cd9c4c72354c1e88423f94169e18bab1a9798cb99031ff852e79229630c8f35459bf40c425af7cb0843498a3cc7fda53d932a07382018de07808aac2b4d60a1e242beffb89489ba69a6a26446180103c11f7b22361f651777b997b76ca8f5a25b97291058620ee5479e92aabb218444aee52e5c8294d578c709158f655a8930fc197f765fb3790bd62a5fe11b57f273775da27fc1b5128663c623f5175513b753543bd71aa045e77e4bd42b7e7baa5ab2c4d3c41f4db84af265acecd4906fab897b5abf5af66b4c4a0b4e783b417c6fadd71d34ea294ccf8b8c8012edb8badb3437b191165cd639bcde9eb71378e71fb55129 +private_key: 9d4548bbb50474e5909a3b1b9fe69c379117a840ace316a8fe3a0f68cc2488c4737f5469f025bdd6378875b173ea5b34119481b7a23388d20937eb5d85a566c8695106645ec3cb1bdc1400c1f3220669b2cc09ab752205ef2bc16961278eeb863d2c58df1c77fbc01d6f298b89049326314323a49b99c7064e8aa44f148616aabbaf76800101406ab7a34402a8da606aa9e2560deb8f00a14072e204febc3d2a48afb18608d03aa8c0a1ce1d591ee79676447a1657e19897f20b0b19a513daa2ca415ad65a2e77066606890c5de69e45367a668619e7e4a38ce656fc3702e5185142f65a6ba43d892b6f086ac0e6bbcbe0e04869eb48921936ead6c91ff3af5311b10f2622c1b137a5bb82b63247d6fb12200901e93acf5e3466ff8160d7677a0f9825d2ca85dababc27b24f3e52aa957b7371685e5fb56f1edb91d66c8ec23287846119eca062d9050cec162a8a6332cb4087d9270c7f022773c6664fd74b85eab209d15e6fa2145297232394138bc54cf4c6cd2841a65ef48cad8384a957b42885236821a3d152b631f01f1574b28990045da08eea352bdfa8bc79fb621c504dbed81b0577aeac881026322c0f295216019bb3a11569b74e91d019a6da89caca94879c801b331c115896054750fa6111207c0ab1d2ba8b328912bbccc2494a300356041c7ce28043880b56db58c78da121b41ab4d2127711c5088ed232b7b536bf00b542b15800accc5b3677802807f0b23878258d18071c1691ae63054d3aeb129798bad2f11b64238d7e83cec2717c023b5e7ee404555393541191afd8b7a79a88c36a2f711c3c2b79c64c405a84f2722643458f4c6cce4cb2556963926c42303c85d87861f4055673b7405c5b6760bb52909290168c50e7f599b798b2f6ea119f3a387d59025954c2571b095d6c761d2932d5a79761f25e52c8a64c765b2220a3ddc38039d7658b1cbdb770574f0464875b7e5c9585abf8b4b9ca9391c1a6ef647063046ddd857f7811c075250621228b80787879651f5843c175eb86883a73cdf97edc6c6b79cc917cb710744b44a9d455cec7a0c81919b600c755b8506003a86ed3276840afd59344091a8430d4705ddab1dd849b96d7238ea9bf63696f709532fd49b0833840e373336c8119a1e229e4881b23868ce260b3b3378feaac8730e69642cc068b4a6b16a0c83e4a484de007b6eb2464836242f7279a754a73e3a8cf378eea351fa7393a3baabcbe08b23ae9887b973b6c653b1bd06a5cf89326d223c365791888b7010795f0c056428425b0f647230c669128b9e0865152aab666561d43ba060decc51a4aa7a0e20502167b69f31d2e6b8b6c63135d91ae1b899afca84ca89bcfd49a725184a6be2289142248439aa568d9c18f492123301792a1ce41fc15c0739d88d05c5ae4508db9936717049df17384b261e8e1910a70cd56208689954a50a41711f9bb170abfed596fe077053603694ff7bba7f41789801df0e64119e962594716c585a30b13c44cf97d9bba5d577285827537688976933569cee793f24733656b97ad6475024cac8902760fba36ada22b9086187ac68dfd26ade8e66dc8773f4eb764d322732450675fa715cb02095b326bd0970713568b12232135a5896094834cf450d789ba498787368b4e15f1b087a704e8e327d631290177add97c0a0d84820ce367dc515fc362aaa98aa7911a867a3789f69a5b68bbbabf3aabd037b5160a3f3d8277ec47898ff3ba5ddbbca6980b5ad47c59236eb33b2a9c84b212e93d9e70aae78a4f9f6bae592ac2b5f96eee627971d27389905b215869d9f4b706c379aa802b5a99abf754ca9316872f033ecbd5b34f72c610c14037540a2c86ac7eab0c3af84729c48610615c9956751759660b3c7bab57146f7b1088501fe14b2f59141b1bc6302d88a35fe27e0cfa18c1a22a9eb517ca6060f25408d4299a7f46c458b3bc38c4794bda8f9079043854179db0071af69c9f074a83438874c882cd18b69b0b2009497b6fe94a9264470be8256b49b6c353374ad49c04b1276fd484338796e4389a523598f3776291512e25fbb5fe98591320c1bb47c6ef3b4bd1d62b6997b5561bae038854ceeb41b2925c1f1a81a702b57b2815f62aa9eb2625ff3512cf9595073ca623da43f32c21d63297a491b28dd8b1361bbc91b40b34a65f1a2b7db86b0b3bd21b26ca5795b795e355b45d1623b3a9731218174b50966d6937ed057fb10b631a51b7d42072a0845be8553e19901fb0eba35f5142c75857f642918bf24544355c4041102d8b197b429fe548433eac36c42077ed787f8e631edb856d4398a26d536911ebbd9f9c22769c756f858d180b6b51797fe9ec0833c908d9ab2730d937b76a0febb68fd84372c96c3c05197093e26d01219c15f898b2c7ac75d11485a2a413a065be744e0908b6340155a244838ddb14b74c578fca2d7e6c4e15e68421a568e7e39a4a04231926768ac4a061d67550a8512e780198738bf3e2420cf75680d1cac07798c01ca06102cb2ae5c9b99b62a7349fc8a2c558989b68e3789c2c7074b476d18212846c8a8d562166829a36587eafc95a362874e812aa951a6995f5a94d370afc9b64777a7e58cb54b62a95476ccd323073d6e466e6ab909b4b4cd840aff393c9391902f4c05bea833d254207cfe938669cbee478c57ff4424004003d151fe5e90413924bf1378419e08dbc46911e2ab2b7f45dcde5c549f679691632c3d9bae26b9fdb85c7bc3301a3900386873345974bdc007f869155df79cfc6f06c39d8bc9a99675382358ba25836a15cc222ae78e4a85a19c5da9912e48128fb37a7f386c0fc86afcd2869e292ca9b521e6ef9b12908ca5d800ae1a7a3a7070766e2802a947c7edb3452a377d9c1bcdb152d37db41ce7c74c36b32c59131b1b85f9b68a3b66773ee4a2b81f12509c33cdaab4caa563e9bfb3cd9c4c72354c1e88423f94169e18bab1a9798cb99031ff852e79229630c8f35459bf40c425af7cb0843498a3cc7fda53d932a07382018de07808aac2b4d60a1e242beffb89489ba69a6a26446180103c11f7b22361f651777b997b76ca8f5a25b97291058620ee5479e92aabb218444aee52e5c8294d578c709158f655a8930fc197f765fb3790bd62a5fe11b57f273775da27fc1b5128663c623f5175513b753543bd71aa045e77e4bd42b7e7baa5ab2c4d3c41f4db84af265acecd4906fab897b5abf5af66b4c4a0b4e783b417c6fadd71d34ea294ccf8b8c8012edb8badb3437b191165cd639bcde9eb71378e71fb551293a7acfc3d283541d985e0abd85eba5315a17d6c4a7e4f248673da60c341c29fef072d9b5a99f9c7a0a011e4dc10f6b600d611f40bba75071e7bee61d23fd5eda + +# Official test vector 31, seed: "ad540a9ce816d6fb1661e5483c44f6fdd00c9e7bd1a8ceda4b4c4d3697d4f78ed0a56954996ccb7da96ecb8f5cb15809" +seed: 9bc5315580207c6c16dcf3a30c48daf278de12e8c27df6733e62f799068ad23d5a4d0a8a41c4f666854e9b13673071ceb2fd61def9a850c211e7c50071b1ddad +public_key: b30c011788cb97cb439789a67d476d3dd265cae63cbe43cb63aa124b93071d6812bc662f346481f974a73b16a505c48b9608359a3c035135258029a18b0217461830785379d3355ff3968d3c63a46685902425660b232b11b93997e60ae0a5bb95a27d553081f393040b1c30ec87535ffc6fe528b1e9866cd1e69520e376e0071087748691dcc057b95cd4c60707d8b976d6a67af4869d960d5466a9f3251dde92cfe8a0b03ea2c43bf03fabc9c9b5d97ea2f558b2bc0ec1908335ca4f2607cb04380a830b245f8b43fd06098269bf9ce33fc07c1e68a05f63560d70544eea4c0bc528859a5b09683b8b3d3c6842e6458061b7ddc4b23ec6ae83d557e5c4b1848445fe253b35e52102517cd38030e6ea28a5e1a24bd09ac6b83c5dc658d11589900a7bb09a963480a2d76225ae55bc54108fb233785174b375a184eba110e05762e7f26139dca4cb197620156c06e47e5b74a0970bc6e18b1e1c919a6c0b10e7470d5ce09e2719194da0440ac3aacd86bf724aa841a83dcf64c8e1f7704397a4cd57bbabc9a0cf940e97e8921211006044228632382ef48fb5d3b65219a5a6983ad0e48ee39081f2ba1103bc9c6314090a31aa34213c0c319eead96b865cbc98327570b965bf00cb9bac18c640273d342cedd11d72e2078399c458068439a8a27e388d3f4bb285b63992b5a4354122ac298222e39d31cb886c4958f28c5c2f37384632b4db216b43ca6246051fd704b5969c07dbd525ac6a479e730f8b11c5d41111ac65764fd71a4f43be55c563cee5c26c69cdaa485d850c2126f2bb16f5766fe86bce17535198ce99c2a66918af96641b2ec74be2b61752076a2db330984ccd7021ce360a0c488143648389f492ba20ac566cf401383a496991497208b760d36da6896bb3587788597191c3347539be92b78cc6a2b0d8eb4188320ceb8aa6ee1018e9f78f4f8097ae7527ec947cb1b27dc8a86ee200020127531273983bf66746a7b731464a6b1524b18744a8c606648b2fb1a4339d5a15d7f6a5ea3a1c08122b773ab09564792fba2e28719a603c3ed0850f2d5045de3bb93dda7a84e692c25537ef695787fb0889107395f87c6b836e138bba9f4a711daa421a396f556c26e3778f4d364d5b1844118b367d78af37836fd7a9637f1714cd9a3e52155b0047468b5420cd5c6bb64138ba16863e18b4368542800b378537b5cf303cd2b191ccf783719142ffac1ad0585b1938281ceb5c86587c43b28c49d9111982ba7ac567e1fb64d8e3c450730305cc2e4e12cc698a728977cf1c9b373f051c17f1935177ae90aa8856a5a24d18a08aa942b4250a6447c35289cf0b334af45647e21b5a2153a8a05a38ac4c728a3350a15502cba347a876cc4bd12034935bb3dc14435930d912aac8a787db3ca33521637c5159b015920100b416d22c18d6a0a52612c7d75c15741b6954ae752c4d31fbaf1b483b6b6862e6a983d5465e3b7b80e1654faca5c669e77295f86263d344031b5ea7ab99e714c0a821042bd9512677ab9e89309f41cf47944da1801521402f211a6076490ae393818ea2056954b24a624e6e54acb7d5bbb32c14b339730af6a72647a66f761bbb78012a76540763cb29dcb9b8c27a3c1e43769c31af3ef54f7c8062d713cab3803437e759a01ee76fba1a5b +private_key: b141b7d0d3c420b8548eba8e71f2a751882023a2938a0628fea97eacc45bd2fa0e89f485e57355e9c58b57746519e2538060924d9032508a508a8a36382254b5880e77248c6734c7f841c309830ce19898233116c0482888c03378b5946eb53e4a59b190b62dbba173d4297405f9cd189c76fbab0786fac8a0e90eb3e8ad689726b1f8b321175094260775e143cfea2c22a5aaec749e7c7002cfe8ab16345adae43b6ca04bdc21632f799c77da62755184c51b3535830277d83ed07574ff8a478c06a7dc817afef2684c00784865116fb8755cf13d19750e01aa165132c2844c1d27409d975bb2b0c97ffc7222db3b13d47c8a5ee20dd147307bdc65b3ab91bd6481e17686d2f1534c0c73fb633260930a92c25adebc2bbd1299185439d0811ea303551e0879d825ccb08b7e307ba37b843854215ebcca1eba3237d95080c317979da65172146645a543ba045f13851781028669c9b4ccc217d5ba8585a1495d652dd89b402c87043e285d3b0c72eac388960367a428bd3e7a903ffbbd83614df2b33180843375f1c9af398975faca439b0a15b2bcf804c340176400d1b80e399597372b53380df0c61ac2f0a1757616825c8a3f90cf227ca44fc88e8608162232b1b5b882017843a6b61af95193b6375951ca70ade7a525633c75333450cbb38338a493099990080d99a788426047426cc89146b4afe079fec981884a4bb1a27931074a88bc9bc1271c40f2a8b6a1bc0ca4a24d71024bc7acc077b97cc47531d21de9f94fa8dbc522f78f698c77078788f6d90f67a661095b942cc5a349076e79ea90139cbf9c2216ca4c704f9992fb7a213c0b97d2bc5fc3491a6cd3bc599c9eb4d1469c3a3efc14b7c6020c4a85481cd86d8c2b2f51410ab1cccd55458bad9422bae77c1d544cc52c94d0d22d2e9783165548baf519bd05b4909626da8991fb48cb82b0c3a25b34f3c57a537039dba031857b40023b6ab8baa64b5234dc5403bdf3aa647ca09bec6f32148e99db47c7d141edc70c804b722559caa7214184ba97ba9802a7604604e90510295b21204b22955402ea572a12122205ade2d1524e57b85acaceb767086ee1218fd51f4799be7364137b364dd2f832e8731605c9c69f4848b3237b51ac791d4a5a3ecaa5edd29de90412ca62c5556a6389ec98948735e162745f383c9c59a99764583d19c72255454b568b908a0e0828b7dd235dbf2268416c1be640289606609f0122c0b492169954cf201a7d654e21541eebe5448b0175d9b10314397a6632865cfcc055e566b476be03773781b35842b6583105200e1cad7475bf95355268aa1cfb1c7c16a68d2c38b92b6841c0b545c5e972dd7794110b5d34cbafc9678e66d100ab1c6a1e0b5c262148f730762086bb7fd017aea3069ef76c71c110db4c80cb2c4fdc8c779486223920731906cb4553a00a400a3878afa709079354a7f3e3795ae77698668fab278688f3b21558306ee6844801b625b017203ab715d110fd636f4fa3c2c3c56ed43879468c9cca379d3cc77197908c54875b0ab7b35ec8b774b5ad15d3ca75291b1ceb201a959b57215657606dbc9b8f1c124eb8a57c6146b1931c019a0a94ea266f441b6520b199161877b30c011788cb97cb439789a67d476d3dd265cae63cbe43cb63aa124b93071d6812bc662f346481f974a73b16a505c48b9608359a3c035135258029a18b0217461830785379d3355ff3968d3c63a46685902425660b232b11b93997e60ae0a5bb95a27d553081f393040b1c30ec87535ffc6fe528b1e9866cd1e69520e376e0071087748691dcc057b95cd4c60707d8b976d6a67af4869d960d5466a9f3251dde92cfe8a0b03ea2c43bf03fabc9c9b5d97ea2f558b2bc0ec1908335ca4f2607cb04380a830b245f8b43fd06098269bf9ce33fc07c1e68a05f63560d70544eea4c0bc528859a5b09683b8b3d3c6842e6458061b7ddc4b23ec6ae83d557e5c4b1848445fe253b35e52102517cd38030e6ea28a5e1a24bd09ac6b83c5dc658d11589900a7bb09a963480a2d76225ae55bc54108fb233785174b375a184eba110e05762e7f26139dca4cb197620156c06e47e5b74a0970bc6e18b1e1c919a6c0b10e7470d5ce09e2719194da0440ac3aacd86bf724aa841a83dcf64c8e1f7704397a4cd57bbabc9a0cf940e97e8921211006044228632382ef48fb5d3b65219a5a6983ad0e48ee39081f2ba1103bc9c6314090a31aa34213c0c319eead96b865cbc98327570b965bf00cb9bac18c640273d342cedd11d72e2078399c458068439a8a27e388d3f4bb285b63992b5a4354122ac298222e39d31cb886c4958f28c5c2f37384632b4db216b43ca6246051fd704b5969c07dbd525ac6a479e730f8b11c5d41111ac65764fd71a4f43be55c563cee5c26c69cdaa485d850c2126f2bb16f5766fe86bce17535198ce99c2a66918af96641b2ec74be2b61752076a2db330984ccd7021ce360a0c488143648389f492ba20ac566cf401383a496991497208b760d36da6896bb3587788597191c3347539be92b78cc6a2b0d8eb4188320ceb8aa6ee1018e9f78f4f8097ae7527ec947cb1b27dc8a86ee200020127531273983bf66746a7b731464a6b1524b18744a8c606648b2fb1a4339d5a15d7f6a5ea3a1c08122b773ab09564792fba2e28719a603c3ed0850f2d5045de3bb93dda7a84e692c25537ef695787fb0889107395f87c6b836e138bba9f4a711daa421a396f556c26e3778f4d364d5b1844118b367d78af37836fd7a9637f1714cd9a3e52155b0047468b5420cd5c6bb64138ba16863e18b4368542800b378537b5cf303cd2b191ccf783719142ffac1ad0585b1938281ceb5c86587c43b28c49d9111982ba7ac567e1fb64d8e3c450730305cc2e4e12cc698a728977cf1c9b373f051c17f1935177ae90aa8856a5a24d18a08aa942b4250a6447c35289cf0b334af45647e21b5a2153a8a05a38ac4c728a3350a15502cba347a876cc4bd12034935bb3dc14435930d912aac8a787db3ca33521637c5159b015920100b416d22c18d6a0a52612c7d75c15741b6954ae752c4d31fbaf1b483b6b6862e6a983d5465e3b7b80e1654faca5c669e77295f86263d344031b5ea7ab99e714c0a821042bd9512677ab9e89309f41cf47944da1801521402f211a6076490ae393818ea2056954b24a624e6e54acb7d5bbb32c14b339730af6a72647a66f761bbb78012a76540763cb29dcb9b8c27a3c1e43769c31af3ef54f7c8062d713cab3803437e759a01ee76fba1a5b21916dfe025b78fc6d4dd1d1541b51cd3eecca90ae52177431b33c708faf17b55a4d0a8a41c4f666854e9b13673071ceb2fd61def9a850c211e7c50071b1ddad + +# Official test vector 32, seed: "288a5f2684d862a86d2790afddddbac6fda934ee7d2e6da1508bb550838609e8107312b28e00a6c01706374ccd3aefa7" +seed: d8b907b34d152ff8603b73051f772daa71eb902c47b7e2f070508269d757e02e36b817736cbc5f7b1dd6eef5fe6332fb1a598f3871e5470d440fd2ea631da28a +public_key: d23b1a80b6c91017009cfa4925f3cca1b97d1a820b204a4ad5f4bb2147307a5350d0244ca20102b8f800c924bdb5667a5866303ed52e27c932a1d84c637c707537409fcb7515f195e557920ff79a3001354cea327f274edcbb99e66acda0aac52dc503717a3b24786afca70dd84c7c4ed1c1b3ac454c832caa687bef8a96bf6c1182f5c663c1ada4784654393d4c83219c149e31fb0ec1e9afc4297968c80209594aa567c65000a883b32e3fb82d9eeb4e9af65ca4fc0cc1ec794eb2b7ede1a5556474f3b023c45b5d8712109a2281f4527a4bbc8262c9bedd0758116643bc6a85f836825541767595c0b54516a330137f0724a1b232cf0a399e0478f732c543f81b9d05c7f5b086c64291b2d94cf02462df7c0f43eb06319265ae25656b462f1445ca5299166731b114e8458a0a0361b135e6002315b65b337304404a907f3c1d41ec9220055939e11f263186c3751f96d750f3a8588ee14f40b09178368ef03a9526a5444be096c3da8a7441638f64b4fd201e31b34f2c456ec89890f53c9a25b559b47856053227e3b36c16297949c6b11159a79a4344f0759c7071a738eb0f80c25ec2f0a2efe614c7766c9dd68fb488c4e514769d9b6be2d59e9c9cba6b5b1dbc9b0d8e5c7078663794fb4eb8c7060bc1b61286cb173ab6a80952424423746bc91bc953b67908bb34226eb382bd54bcbbf5c60e467652728186c357b3fba85f6b8553c79c730ba51ab90d06ea9edd407b89e0c0a4276ea3698ee5e6a8348a2f9f571c2b7b93f5eab702f1acc3480bbb223e68361fd89a57d1716fc8c99ff43734fc58969d35077f5bb422b859b271b085f41394f28b416565d2f90848216ade3cab7c205ef2f47d8b50b9152a9ba6032322e737089a1e5152387e3437d2190cb9e394bbb6857a1b1ead7a3d7118b0ab8367ba1cc09f910518420a46a18271408121db5dcb0670ed789d537ba3639c530a720ed9f40c023c75b1a8261b6c0192b14843252cb8d713c8736b34daacfa235c9a51468dbaa6f2e4507711344b5a722ae46a70e683c42a9056ecac5d143f9929006bb168ff2ac983ca8b1d99cfc1c8cd919b282eb921eafab2a778b227968f77ec885077ceb7bb5fa13884b6a4bac782b31f250569e0671396b780e810e4a34416166c18c4204ac4124c1020064a257c32369c892420510811f28872d59cf8db48f2a1510a5895a09c008be695699a4845210777146b56093d36960d6c36860cec578de3688bf338a28118a67833f5c4c7d93b8867d93ea7aa99a3743434d236d786cd8e617791bc5452c88e70f1189d5004e17146f3c69c60682c11e78b06b2c0815bb889a17a15eb1d985b601e6c04604cce34b13d82a328f61c2dddaaa25fd9ae0dc83962c0887e392a25c8657d61cc2ffc980d4cc4c9557e7dec446828b03e8bc9a1355dc32b1c06d504cf613235b6b9b1b04c0ed550545bc37e7000a2366786da49d637ceb5c4273041706597236be0a7213cb0394282aa998411e1236ab964a7998055a183dcc4ce765b8756760fff965d2b7c5adc272ef1d3b214b4ac9b543e0f24876e773edc54c105892cd882848fcb039e5223d0c68fa204cfdb793c5ee56659932cab213cd4eb18fa4b045103a1e865b0c567574e523be27974b08adec6d539f37479c61fe8d8c4 +private_key: 5e74b833c0808f44300017c6b2773ff7569ccc971250623710e01c79f2457f572dc1a8c9e23bbabf0b16de993a063931936a4d6f4a22e1961949ba5df2e3aa07693ed37b2b9d98668019123162be5a1c2907e35d0ecb258cb034e4489ff1616d5f6b83a7877e0cdc5ed4677d84924381b1aac175377b4b953863b296c601140281d9d5889f649d3a4c8c2ad662bce81753b85d26eb058b7536ab98afbd4a969ad26db781bb40d980afe249ae56aea88b59f1b28dd3f99ea3e6b8dff2bc91544f7173595fac70c0d50edec867b90188f165c8b1725a00a45406e18d242b2f63f7736f68c13c5b9606e700f9d3cc64ec0a94872adb04437cfb7ed2623eadeb11da382785c74d96c96647e482e8ab1c9af58cbcac5d4741cad8e6a80028219af15baabac6d2e884599c2b83a1307a03ad2d4791bcfc767dd36b810ca63a7587486749835514fcf4c0b7d3b06d950cb1b26b69b8abe466029fa2b66966501f6c812bb24834c3b72bca0a98913816737384d29a3e70327f86bcf85aa92d393a5d516b2aa49694e32845c559ceb89f6351b825baa599011efe9558da35a05b4537d01c6ce8b88eaf796b36a35c9ef41ddef86ef4bc695424bb63fa5cb4533abf2497d39057651b22a9806b20a9a4dd6075cdba87c04051219a8c7fbc564ca84f1d51baac7bbbb8bb2118990e5138726fe0c4ec51aa44780d5e66169ff17312d214e4d908e8461b2c004557f75ee749889fe23612875f02046ea6a6604c6c74dc746bb7c08ad8fc324be971359ca32e17864987712225257af3114be35a3483bcfc1135c0ec9a34b67ce5e20290b13d5e8a601e55633c154a83d65e1ea03d8da88bf5875429690f848bb314b664c851a266a880f68c8b69c184c773cbd73a3e32556207f432ea9126e6e778d76638607c341ab42b61d59d4be986e686474878a4d43c0877599689b35247061f98229384250e78408b76230a5485486ce70b076447bf96263c0058bb455cb4901d4c99a00eb316d4ec3540e6cd269b3093c6123d855fff761e2e394e4204366e7a132425978a0561a4e2347df685c5b6b7d291cb3e0970ddba9bf9166a91f5cfec7c751bc793a574181421c07e854103b4c5943cb3f89372e23cb98f75bae819c71de64a98b145794a6b006300f851c5581a30293542ee4482fa8987dd0a00bab3a9881a292618724d8c164281bca6a903caf5c52b31b3f341a5f3626d30443190422abd129f2e677682352c4c9427139a2b77a362043cc1af5737af761a62f27161018d76f8137df25c1872a25cb81243aca20fa738fba24d708c7f2d610422481f3ad74061c22141b7a448ec8bf7670ed198c0ea72456567108cf56991d47069e6a6639c2dca8c95086c8d3a5cc49e294400bcc2fcc39c5b673ad1e6248204969af47a4b036fe7478ea16349a4b49b857469d115be01c2662afc5880d5924ba498e353597157b559343848f2ccf4ec17951943b39cac83bb52c5665ffd1618bcd6446929cfda114ca3c554c6b9821b6b85084873a3b20e5dd8486aa7b591b1b6f7b83b585c9112884756386a35a04f60b74289e206f2994d8c56185b1698c0583717368f7ca58e7635090aa262cff0b93af222dac695d23b1a80b6c91017009cfa4925f3cca1b97d1a820b204a4ad5f4bb2147307a5350d0244ca20102b8f800c924bdb5667a5866303ed52e27c932a1d84c637c707537409fcb7515f195e557920ff79a3001354cea327f274edcbb99e66acda0aac52dc503717a3b24786afca70dd84c7c4ed1c1b3ac454c832caa687bef8a96bf6c1182f5c663c1ada4784654393d4c83219c149e31fb0ec1e9afc4297968c80209594aa567c65000a883b32e3fb82d9eeb4e9af65ca4fc0cc1ec794eb2b7ede1a5556474f3b023c45b5d8712109a2281f4527a4bbc8262c9bedd0758116643bc6a85f836825541767595c0b54516a330137f0724a1b232cf0a399e0478f732c543f81b9d05c7f5b086c64291b2d94cf02462df7c0f43eb06319265ae25656b462f1445ca5299166731b114e8458a0a0361b135e6002315b65b337304404a907f3c1d41ec9220055939e11f263186c3751f96d750f3a8588ee14f40b09178368ef03a9526a5444be096c3da8a7441638f64b4fd201e31b34f2c456ec89890f53c9a25b559b47856053227e3b36c16297949c6b11159a79a4344f0759c7071a738eb0f80c25ec2f0a2efe614c7766c9dd68fb488c4e514769d9b6be2d59e9c9cba6b5b1dbc9b0d8e5c7078663794fb4eb8c7060bc1b61286cb173ab6a80952424423746bc91bc953b67908bb34226eb382bd54bcbbf5c60e467652728186c357b3fba85f6b8553c79c730ba51ab90d06ea9edd407b89e0c0a4276ea3698ee5e6a8348a2f9f571c2b7b93f5eab702f1acc3480bbb223e68361fd89a57d1716fc8c99ff43734fc58969d35077f5bb422b859b271b085f41394f28b416565d2f90848216ade3cab7c205ef2f47d8b50b9152a9ba6032322e737089a1e5152387e3437d2190cb9e394bbb6857a1b1ead7a3d7118b0ab8367ba1cc09f910518420a46a18271408121db5dcb0670ed789d537ba3639c530a720ed9f40c023c75b1a8261b6c0192b14843252cb8d713c8736b34daacfa235c9a51468dbaa6f2e4507711344b5a722ae46a70e683c42a9056ecac5d143f9929006bb168ff2ac983ca8b1d99cfc1c8cd919b282eb921eafab2a778b227968f77ec885077ceb7bb5fa13884b6a4bac782b31f250569e0671396b780e810e4a34416166c18c4204ac4124c1020064a257c32369c892420510811f28872d59cf8db48f2a1510a5895a09c008be695699a4845210777146b56093d36960d6c36860cec578de3688bf338a28118a67833f5c4c7d93b8867d93ea7aa99a3743434d236d786cd8e617791bc5452c88e70f1189d5004e17146f3c69c60682c11e78b06b2c0815bb889a17a15eb1d985b601e6c04604cce34b13d82a328f61c2dddaaa25fd9ae0dc83962c0887e392a25c8657d61cc2ffc980d4cc4c9557e7dec446828b03e8bc9a1355dc32b1c06d504cf613235b6b9b1b04c0ed550545bc37e7000a2366786da49d637ceb5c4273041706597236be0a7213cb0394282aa998411e1236ab964a7998055a183dcc4ce765b8756760fff965d2b7c5adc272ef1d3b214b4ac9b543e0f24876e773edc54c105892cd882848fcb039e5223d0c68fa204cfdb793c5ee56659932cab213cd4eb18fa4b045103a1e865b0c567574e523be27974b08adec6d539f37479c61fe8d8c48f62011fbd5a1c10713d42a00a79ae7672e5e321872971f24ff71ed754178d6336b817736cbc5f7b1dd6eef5fe6332fb1a598f3871e5470d440fd2ea631da28a + +# Official test vector 33, seed: "4635dc5bb92ef98cdb6220df0dd717c7f8158375eaa2b78fc3f0b58e9c9653e92684cad3461d9158a481da3d14694c44" +seed: 684a29e4e5480a5f2533e1526b5fac8cdf5927f3d85087c71f928c59690eb56575d12195ec32a8686d0600e45d4a7f54219b0d7a3826d193a51b9156ecf2edd6 +public_key: 4f27944614c35d121bf2390402bc93797055936a2d49699cdeec2f29413403aa1024d802d97c54aa316707c26a0b432821f63cd89a87f769597cec8356c2c399d3a34115cca89b9df6a55e4556a3b2150b51907ce67b860f697a65b199b370691fdcb31cf7937d1524bef41a0732cfdf464175c95d9092176ce52814d3a9231114cc31718755ccd3a7b3fe69b4290175dc440cd38c69faecb190ca684fb1001b5308fb4c1ff6a55b4be8814d602ec59c2deed654c93a45d55a3e020800e98aa786c76fcf33cea3a7bdbffa5037a171044b1b74d6094d1a3b606009b4fb0f060b6dd1d29ae67ab90c90c25db895c9515fe0a17bdd69c6773518a532ae8ac731e32155500204dae2c9284cc16f61b5a9e48334859357506e2c391d1bd38865ea489e492d8b847a6a50ba074320fa32074d89894324a705dba4e1847a5059645c77063809cbf3cb0555b6be4069c77b10a6c6f67ae1e7c09d603e87a34acd3b814d7b4798dc05acba65220289772abdbd89403e698f3556511e152bc0f77509dc36803b57d08129951ac44ecc49f43b7cfe8436baa8b5376999f6442293352e76ac592b95804217817ad5a75a76caa72172df9c69da4c170e937a69d93f12c7b533d4bce41b34d0cc8a1c969947db2c21a960d975ac029280ecbb527654a42385576286915d4b8f3fd163f0cb280736bee89786fa277c8487b0820416985855a95a10647059cf34c08915985c32321b5b8b45a468cd4253c662847eea36fb238098f059630cac83aa70cc9596cc1a0406e993b737c236e78cfbea1191d60fc6428fe7090997f1ab41c13e0c57a256a813bc559ad1e6ad10dc3cf43a64dae2955f03b46a09ac6ee30326d95d6ca8b80e61aab77579c017a1906279ac09766bd8a1b40b24d8bc4deefaab47f9c14a8441eb413dbd718e5122ae7beb94f526a31bda25d893a544670d994530d3c6ca29879085870f6d54192b1a7fd63193c7423be4867d2c134683ba25f9240e0fa2a96b47c5ac05b541c2980f51557989b3eba42dad002412f462acf75b141c5fc320bdafd3c11be291eafc04d6b5a1d4117c7703c313eaa30477253e938764364b25d859aca263962c5d6d898ada856b70e151dfa41289213acda6cdb5241bc7067bee5cb467c34d2b0a6ded6aa746290ee2e40b7be1294c583aaf415dd03213a3cb2e41f10731823e749acbc53767c12b93d8f32257a54c6a71b2041a167d685f0bf789b94b277f1b60af22c09b639ac72ca25b1c69b855bed6377126999c5708789091cedce768b253ccae981715c8922dc9562ea8a0ba102b02585281b15c7e44339cf630529c1b076106ee2b5c7be0181ce43d397a398c8547da703e2ab47bc15284f4c6a50dcb904ec9c1f60a1aeef38435997871e8501d4832bbb2a3354c70d9579f237427135329cda32573089687d9a9130375bf66ac321113a25a08aa75cb667635455a93eae7a0a6703a2dc0a85637681ecb097f1b16b2b331210b6288b13f5752bb6c731adab30ca051a817099095022892d923f571b8d879c8ddf0ab03145a32298dc6b644b25640d808006e3113accc6a0c1ccb05ec273e6b6559e287539c72d754ba9bc48c915acebb656e3cb7713e9bfc0bb6f311485ebaa078b78a737d81d38d368c220eb0e982fb0bd8a7ed97 +private_key: c2bcc42efa0baf63bae062a1b1322114519cc504048ff26ee73b208d659518a286dc411c3097293d79bfe04790f8b87c1dca42059c447ca5a382733c27550b41a367e19175e084c49b9bc5b8d1ace0eb4ef2b220f187929171a10d5a9a46c8b89ccba3b2435720780f6851b01cb06ef5127100c4ca44c6188aa3af8e875b85317f47797d6d699e6d619441b26fee871863392ff455413ea78d53852d5b19361ce82432410adc6ba90793cd3330444b82a06da38a131a1ca91756848ca59e200c86001c21d19a7b5a40692a979bd351ff140276f176c9f189e3499d067cb054f9a5725236abba148cf05a539675331352834ca583b8029c764ebe829cbeb934ba76bf3e75a1a2b0a65b879cb0b881dda38487558adec31029783ba7ccc94ac879690049452724c3073106790748d57102236f4e9cc4159a14a042cc4c6986ed5c4027b28053d673f42811b4e54fd62507115b990849a9c3ea6153b405b6c73f27f6755db5c489761da376ca05031e027b6a34b12117ab8cdd1965cb958e6e0a7a8f9b8a780b0d06625ae7b8b5d2e97510c3c8a3b010b46506db23ad99f509d3342df563c2ccd951a7f0446d582ccc872aac034a27a90822506af8acc35f321bced03f1dbba19507c17688965b59176563088cd44dfcbca8a60baff382b15f812768c41d3aa6227c760e78fbc5e8191b01e697104164d8c1bdd2133aa222886263a573cb3d18743ebaf7abc486c5ad24cdd770250ff860acf05a88cb464088cf23c82f9a191833a780ef44bbf5a06cf1442fcffa547ffb354c8476c0b8135c6abff733c30f38a3ff331a836492ba26c668b679da54463b68573d566de97a2b4a53cf9621a6a5a7493ff190b5c9a7ea63019fd1c3a4dbc395d0b254c80f7b5668e6074fb0bccbab9811010b1c42d55982928d604ac9f3b5c0a3888cbce54cf0e1ae0c9914fb5474ec29492cd1bef2537c4e3837ffabb058993c3fd11253e87e15e84451269b6a48911ef15e4f82606a475cacf420ed6796ac04af07633b6ea63af927c611b07dd932bd0ce852c4b785f7348fe2906eafc76c3df8706735813ff796ae51837c198e2eeccbd0a64b45254209882351740fb6414363976ddbe5c302a29dcd832270732e2c6abea1969e8b17ce2b1807aaf2485e6b07e3a7419b5019b8172a3ea0b7907a70589a88cde16d1b043d7985860f623b95645ca1921ac8109870758016a5bdf37acaa273c18b6944d0911a0d255b4f9580e3b50383f93bb7871f3fc2b280f2871b1c17b2c74b9368773ab747ec2b87209910cfa859243b7a75288c163ba025fb667025433b12c471e7c9642c4ab105413e0641d7e961b3fa462ec797d6a9cec7ab1ef6a64b5d5869c4e6c3ec884afb87b2a8711a46014dad830fcc195dcc5b966252c5a350561b0359efd07df9a4b4bfc39ae6441cd70b57a4718d55a0bfd8f979c0d01e31787afbb1a8c2a87e5a7b70d8976ae4814950d00e998927039111eda21993c17fb107034faa658617568350a48dc4bb3b124b032b35ede2ba312162b57067ab245533177dae67894349327663c329c2a752002326b18cc60b1cd1098968d18168bbbcab459f4a4c18f63a7dd0e9ca68f43a6592484f27944614c35d121bf2390402bc93797055936a2d49699cdeec2f29413403aa1024d802d97c54aa316707c26a0b432821f63cd89a87f769597cec8356c2c399d3a34115cca89b9df6a55e4556a3b2150b51907ce67b860f697a65b199b370691fdcb31cf7937d1524bef41a0732cfdf464175c95d9092176ce52814d3a9231114cc31718755ccd3a7b3fe69b4290175dc440cd38c69faecb190ca684fb1001b5308fb4c1ff6a55b4be8814d602ec59c2deed654c93a45d55a3e020800e98aa786c76fcf33cea3a7bdbffa5037a171044b1b74d6094d1a3b606009b4fb0f060b6dd1d29ae67ab90c90c25db895c9515fe0a17bdd69c6773518a532ae8ac731e32155500204dae2c9284cc16f61b5a9e48334859357506e2c391d1bd38865ea489e492d8b847a6a50ba074320fa32074d89894324a705dba4e1847a5059645c77063809cbf3cb0555b6be4069c77b10a6c6f67ae1e7c09d603e87a34acd3b814d7b4798dc05acba65220289772abdbd89403e698f3556511e152bc0f77509dc36803b57d08129951ac44ecc49f43b7cfe8436baa8b5376999f6442293352e76ac592b95804217817ad5a75a76caa72172df9c69da4c170e937a69d93f12c7b533d4bce41b34d0cc8a1c969947db2c21a960d975ac029280ecbb527654a42385576286915d4b8f3fd163f0cb280736bee89786fa277c8487b0820416985855a95a10647059cf34c08915985c32321b5b8b45a468cd4253c662847eea36fb238098f059630cac83aa70cc9596cc1a0406e993b737c236e78cfbea1191d60fc6428fe7090997f1ab41c13e0c57a256a813bc559ad1e6ad10dc3cf43a64dae2955f03b46a09ac6ee30326d95d6ca8b80e61aab77579c017a1906279ac09766bd8a1b40b24d8bc4deefaab47f9c14a8441eb413dbd718e5122ae7beb94f526a31bda25d893a544670d994530d3c6ca29879085870f6d54192b1a7fd63193c7423be4867d2c134683ba25f9240e0fa2a96b47c5ac05b541c2980f51557989b3eba42dad002412f462acf75b141c5fc320bdafd3c11be291eafc04d6b5a1d4117c7703c313eaa30477253e938764364b25d859aca263962c5d6d898ada856b70e151dfa41289213acda6cdb5241bc7067bee5cb467c34d2b0a6ded6aa746290ee2e40b7be1294c583aaf415dd03213a3cb2e41f10731823e749acbc53767c12b93d8f32257a54c6a71b2041a167d685f0bf789b94b277f1b60af22c09b639ac72ca25b1c69b855bed6377126999c5708789091cedce768b253ccae981715c8922dc9562ea8a0ba102b02585281b15c7e44339cf630529c1b076106ee2b5c7be0181ce43d397a398c8547da703e2ab47bc15284f4c6a50dcb904ec9c1f60a1aeef38435997871e8501d4832bbb2a3354c70d9579f237427135329cda32573089687d9a9130375bf66ac321113a25a08aa75cb667635455a93eae7a0a6703a2dc0a85637681ecb097f1b16b2b331210b6288b13f5752bb6c731adab30ca051a817099095022892d923f571b8d879c8ddf0ab03145a32298dc6b644b25640d808006e3113accc6a0c1ccb05ec273e6b6559e287539c72d754ba9bc48c915acebb656e3cb7713e9bfc0bb6f311485ebaa078b78a737d81d38d368c220eb0e982fb0bd8a7ed97ed3d1dd05854a6542b24090a680b9aa9d6c65ef31cf1f4f5708affafeb2e398975d12195ec32a8686d0600e45d4a7f54219b0d7a3826d193a51b9156ecf2edd6 + +# Official test vector 34, seed: "5da2c51b4acf488c8bded5e985cc4702e4a7bcb248b5ac18aaba529f7f9cbf30efa776e99f76d5c1686e94f50fb57dae" +seed: d76b3573f596eb286ab5231feec7499686b13021be36cb126c7ebeb9d7030daf248c0a21ea0bb6d6f56f12300e8584d8e9a34e0e6f52227281151ae4c305fb8f +public_key: 39b95d90d51e8cecb49dc41a37e866c8fa1bf723c3e3815b1f388f63d791fe0cb8507020e19125bf0ba753fa89c19180a7505e15ab6c44e32f70499df5cb106f85bcc5dc4f20d9660c17307de05bc1eb6bdcebc52727ca3544772cc56a08b30c0c54a847b28387808a1747a23f6460054c582b4ca1e09691c64615a6ba3f89a05a18eccea06b550241047c1807f3323dec674f17056d71b7bea906463efaa0fa50b051723e0cd66cc7587df4b58d49fb029fda6e2e507d637ca7d489971d897b09148a6a2b47d3b4bc3a4ac0715b3abde096bfd8622ca24141683771ccad1094595b20c8af004d54873b0d42977886314fc889e5804474005527170c49882ca89648d24ba29cd30a7c2868f287345f4926f1141531d3a53cf68c8662247d47348cb1a102613ab236b67bb9a7cce47e794096c0a93d54f743cda16ea09c8d87c43e4a1b2cd9b0b5ea711f30b39812ca44da20b02cb4c8fe12343896ae6eb838ac648acb8bc8e887ac69602e7d81263315373029b2d6713705935a43177b9f9888115202ecb1a60e433d8de2bb42d235135224c7f795d342466b4c5bb8bc93931116479171800b717c033a304bc619d2a79a687e005d6215fb1e76ab67d8b46c72857a46d753674a7ef3962c90f2b62f51458204b71d95734533875819a495360ecc12b66005330593456c516ead7b3c942688a822bf0d92bf849bab6068480a0b0b4b8c3a451007dc2a733de7b51d835e5b7900ac836fbdf13a9ee82b34ccacdf6b8f4cd0594c80473040b633b7ceaa091259a21c5c881602c146e4444e1e48800a189239241813c13b724a02e6e7a70834493f794ae7991bbf1b60d4c0084c213471eb3598079adf95004942176f297ad3d55b5cfac5a3b385679ca6af26217ad8309547a0738328bc1a519712ba545ca739e8c253a65394817aa6874e432a95e5f35aa045cca1fc1c7bf467424a8d498274646c05c15b176c8a69f90a0a524b6e4b6053979499e7526ac66830d28b28ca2c6dc4061b1546a4e8d7348416c8a8fcbc0779c51ce855dfc54d94d74bee674bbc383adb248c07eb8889b0b44937356906a61b1074362754440856bb26b2fa906ebbb94ccc943fb39c00292843ed501f5f673762e3afbd7179e41835208700fef233793c0850c5b48499afed371e56e5a92a4109662247b72338db4769f9849f9516266acb133af5666b18131ed347454250cb04528c91b8334c2f5b3401cfb28e45824e73c1b6854b330c47c443d931b9e5b139f31b25d4458ac53a32025d49bb5d1a89b73bf930c74c233bba7afe30239a41587985726fa09d0a7a2ab19559ed380d9eec34b5fa83b73813a763beab0a1f7df5b87962709f255256a36800b94062d3af90990b2a43251ad9b0e400bbaa4a306520443ecc8cf45613a8fc1c61e6312cfa02d23c1547a69cfe43660d987a0210cf60965fca77c850503416c7c18a37bc10ca47f517abfcdc018ffb538f474404917dd65c8a680a667b1762b5958e43547fca1aa0da8907d7d3a25b430724477eb2844e54f35ae8f27598d568d413914bf66b70e37ddbfb7df01c08e1310932ba90ac2287187b022dc659c83b9f554871ae4aaeba7ac76f1254f174493d31eda27def0331de8e68f7b1568c4c8919e4de7a5005ce152fef9c8c88ec9e +private_key: 9ca01438ccaf5ad79f0d253c6d29707c603905b40d1d3b93b269be9072ba04020672ec15ec059d3fa9598edca4f4db3164557b1737a0de750ef5c31572d80c5d82ab52184238c439862492403b1cc06c7efc7b94b41bb1718c6523db1e6f63533db04e4e91c405527a4ea866210731a687ce09d10e5e0945cef0807665bdfd797802092f0b6837d61550a1d481782045c99b7df6e2b9ac95bb44284f472b5ce1636b1b3662d732a82d76517b57ba46fc9bee14511be585cf0a6549584a361b7009a733c9595f01dc6290471e3d656371cb6d63c9bb25a8c5caf03a84f6684af3c7daa48b2850be6c4270412572f0c1ae74613752e6bf6d53c927f110f41922492780ad486de631565e99886a077c209b025a6561ba503599897444642db4750728e09d3ea6498d236153a743744217df5400876690e393b0f3e2a481c31b52d605cffa140651ceb93c1189aaa372e906a14b684bab42c82b2071133cc31892048c1ad57ab99a00680e03287516141c281d2e1978b44c84595a59e13647f11623ee2b822a36b4f41b8a153a3dcf6b6daa97b9240b25813343561750ab7abf17816d76616879e09668b9c277d1cdbad74a5e429074c07a3394ce72a99af63010be35611d296348a163cc2b412eba4873988ac341566d1c2e60191dc9603c62f058391392494976e073760c0a9fe058564d0334a14a4d8e9b41c2e7226842aee7dc263f35b47619c99ce66f6a546be0e716f8a61830c23f37f152607032d34a6ae3501a00818bca04cb9b7145673917b9252f449a7463565662513f92a5ad5bd4bdc6d63c7d7866019c0454956b92595efce15c900b6d60db94ece8c2f4bc7fd52240cda936a5ea069980837c32c777f60b2a5bbc41a540c0394a3ed53bf34b37d8e7627979cd52fba35b144df35cc975209f232a0d24000c826cb54d365d74182631a326ba0674b86b1af79a169ba6361d30737840bcc5f3798a9c5439541f6e036abefaa66a44a5d017855b48bab216170db6489d74a7acd5339e43ba3b6bb6d1411add611735b9083c75b5111b903965a4b56b4b27585e9670b0fa2c5ee631b6db0acd324710ece9a429c83b76bc417a087b08d989a44b3d9cd1217d835a12c62a437a34dd1568e25c6db41c4c98d0bb7cf7b12be2152c361c1a881b409730c4a9b82498245a8141a903c88cc7aef187628c226fa3ba83d2453ca397290a0cb7ead61047bc4d4f36cd6d70200a1a4139505e3a86885bd61cea052bcdd52a1cf33ff2411f4b9c91bccb7142c6657db694031649bfb8800885bb076a0eab3921e53b40c1b075677124b0187969db8384244f63c6936aac3f6770b9ede5c7129a8e55d46ad5d8636c80082c47611b5c3ad3b814db17157df41585e68f5ef027e9537d3375cf7df44bc807a7e88b8b9b083452a35a6a5844eaf3c4afdb3789806d658276c4a18361aabfe743c67b2c626f1cbb2a8cccee295e6dc7a4e695b205d4980151a89e404a2a1940b58854a7e12e0d221fca36592044492094619ebc7783dc1a12d8a6bdb95f697514f214a7707949c5e6ca4ab227800554d77639b9d2862bfc27bb686c701b0839402a33a60e0c253e32393e6a1c45003140d2b7cd56f34a39b95d90d51e8cecb49dc41a37e866c8fa1bf723c3e3815b1f388f63d791fe0cb8507020e19125bf0ba753fa89c19180a7505e15ab6c44e32f70499df5cb106f85bcc5dc4f20d9660c17307de05bc1eb6bdcebc52727ca3544772cc56a08b30c0c54a847b28387808a1747a23f6460054c582b4ca1e09691c64615a6ba3f89a05a18eccea06b550241047c1807f3323dec674f17056d71b7bea906463efaa0fa50b051723e0cd66cc7587df4b58d49fb029fda6e2e507d637ca7d489971d897b09148a6a2b47d3b4bc3a4ac0715b3abde096bfd8622ca24141683771ccad1094595b20c8af004d54873b0d42977886314fc889e5804474005527170c49882ca89648d24ba29cd30a7c2868f287345f4926f1141531d3a53cf68c8662247d47348cb1a102613ab236b67bb9a7cce47e794096c0a93d54f743cda16ea09c8d87c43e4a1b2cd9b0b5ea711f30b39812ca44da20b02cb4c8fe12343896ae6eb838ac648acb8bc8e887ac69602e7d81263315373029b2d6713705935a43177b9f9888115202ecb1a60e433d8de2bb42d235135224c7f795d342466b4c5bb8bc93931116479171800b717c033a304bc619d2a79a687e005d6215fb1e76ab67d8b46c72857a46d753674a7ef3962c90f2b62f51458204b71d95734533875819a495360ecc12b66005330593456c516ead7b3c942688a822bf0d92bf849bab6068480a0b0b4b8c3a451007dc2a733de7b51d835e5b7900ac836fbdf13a9ee82b34ccacdf6b8f4cd0594c80473040b633b7ceaa091259a21c5c881602c146e4444e1e48800a189239241813c13b724a02e6e7a70834493f794ae7991bbf1b60d4c0084c213471eb3598079adf95004942176f297ad3d55b5cfac5a3b385679ca6af26217ad8309547a0738328bc1a519712ba545ca739e8c253a65394817aa6874e432a95e5f35aa045cca1fc1c7bf467424a8d498274646c05c15b176c8a69f90a0a524b6e4b6053979499e7526ac66830d28b28ca2c6dc4061b1546a4e8d7348416c8a8fcbc0779c51ce855dfc54d94d74bee674bbc383adb248c07eb8889b0b44937356906a61b1074362754440856bb26b2fa906ebbb94ccc943fb39c00292843ed501f5f673762e3afbd7179e41835208700fef233793c0850c5b48499afed371e56e5a92a4109662247b72338db4769f9849f9516266acb133af5666b18131ed347454250cb04528c91b8334c2f5b3401cfb28e45824e73c1b6854b330c47c443d931b9e5b139f31b25d4458ac53a32025d49bb5d1a89b73bf930c74c233bba7afe30239a41587985726fa09d0a7a2ab19559ed380d9eec34b5fa83b73813a763beab0a1f7df5b87962709f255256a36800b94062d3af90990b2a43251ad9b0e400bbaa4a306520443ecc8cf45613a8fc1c61e6312cfa02d23c1547a69cfe43660d987a0210cf60965fca77c850503416c7c18a37bc10ca47f517abfcdc018ffb538f474404917dd65c8a680a667b1762b5958e43547fca1aa0da8907d7d3a25b430724477eb2844e54f35ae8f27598d568d413914bf66b70e37ddbfb7df01c08e1310932ba90ac2287187b022dc659c83b9f554871ae4aaeba7ac76f1254f174493d31eda27def0331de8e68f7b1568c4c8919e4de7a5005ce152fef9c8c88ec9e6fe12a1e2d742dcaf56c585651ed6edce4f410aca0fc83275b5acb19daeb149d248c0a21ea0bb6d6f56f12300e8584d8e9a34e0e6f52227281151ae4c305fb8f + +# Official test vector 35, seed: "4d2239e84b052109a78dbab6d80c51a86d38248105970476b74a0b78b9cfab6283e30d5a406fae1c7f54f8bae1110ee4" +seed: b87439fde81c9e39eebe7cf741c685785532c1dd23e8ef868b9ce7a541010f3d1646460817a0fce5836bdfe124a7448e7adf7b8ecc2652ac6d280e986682df71 +public_key: e1696955c4bc38dc838761a183d31e38bc21fd2b955d9002ac69ad96c03822fb4283c4216e93b96d86bbf81888b68b1e67741d4fc8af15d4642a7b65d7b408ec711055826bf634557c8a7ce4a32384592f3c5881aa530213c2435141505a8c0918186c1508ab11101b09397d82b31c85ab64f4bb38947726d2c717362858a0a3656487b0deaa38c8109e5fd061496a695581347d52aa7ed71c20d8a613bc54e8a49a92ebceab993b0fa81de448c156550aae181a537c38638c6320abaa08c50b7b54211dbc8124a487eff2b545ca3db8a07be7674b51a95efd08c4421cbf2aeb8cd92383851a044985aa9a062bf5267382db45519bbd747852ed1a590ca3a89602a6c65cc06c856e22484244fa15b928b13b91736b1680e18cb1f76a7209b76754076db872295ec76e246b1f58f80fe0610372938393288c85b2b2f2107fc39c7d805678e68a38e3e57c30ecb650dc15468674cc54aa8aaa424b5060a03bae4d74c8a43c951e6b53b2c8b1502459868a1b03a5c1395c1b10551c28a6756d251e1916c24ba33792d74eb88a5c84078f60c612beb4a7d94bca27e3377e53442284c395ecc235309d1281c53964bd34a067f225829e5cbfaed47da9e393895aa82a67ab5b44a92d8423bcb59265e73b84f549927427e9295acc8694d77020d0e4342d3c784b121250140db1c3bd38806351416c8f86b4abfc7a14911bc865baaf867f54e92f935b044b60bd5343c5fc9b2d1dc68735baa31ce155e37c1ed0c85162d2ae3492c44c29343b50351c64747f9765b6f9306bbb3e543334c987c9a1c2a5783a576ce94b8f10bc3539cd55f30b0cca01a5985eb5993d35b8cbb136bd769b13f0c5c2d40b34335a52bd34ab04f9cf3f6c313b6c5b9ef879c10c1e1b249cba2580f7da8bb06c003db8718f318979e358292b881f9ccf984c525b61a34f6681197a7834913230627b56388ea26cce0569680c968b31aaa97710c9b2cc019771a57f8b5739554e45048d59610ba990b2e1967648d3c87410aff7981a57e2bcce971b912c2bf633bb8ea55314f3327d3b4fcde33aa1e235e6eb603caa19ba83c98eea4196c78a80e8b5680227caf06ebb22042e9a5c63974650fbcb1531404c6862710215012671093911d67027d491a916539a1b84b3c966b89ed3b1e9980769267827731ece44826a3a0bfcf037d9fbb9bab4b85ad668fd1573c0e9b227fb5ad32c948037384145188b17620eb91cf6a6318f331cae3800164ccd138c8c75a3071a7c0166f5156d74171b5b854c0783f9905b88950c23ca8835e530c4037260500be9f00510b5357fd1b80b09aa06b7126ecc8bdb709e3e698761f756ad0624280778c0ca140c426f91c76f81b96cef425403c95bc00852359b638a8a75b3fcbea47990e002b346d5a9481083c4336d02191326f6ab5c5777f622cd4819bd1187cc6099cb7968474ed93c0b830bb301314551970b86a25da05dce97ab5db744c78536712c752d02206c8585285268c5842491f92636682b223b6bddd39c6070bfd74aae3f8ab1fbc357136028aa3542f006cfbe429001377d2112c5ae3805244b865ea863257aa671d0b146d04b89b233f70768a373043a59b9060b0943f56865e6a91bcdc54402574a0f1c143dd36948d781d2f3c44e2f08b52e339b6e1cb3 +private_key: 7079b0361596d968aeaac085c8f649ef02a20b947efa34800067938ff753bc0aa132d1a51944634ba6308e64848b60cf01ac01a7a13c5ac5763f2a07da294d955b5044f2b46e2b6f51d501c3949e32a64bf7ab5b6435986a1719812bcdba766380a0601c807ddb1a0c532017c0540b56e82c63da8276e665d0c4418101af9e07092a48422c960f7a818cb266141ce16f76dba6973b5da07449a2b5cd3e20650d753c044787a6154257785aa738418254281298c272273ee880099772c5a8d0491eba4930280f75664d6156928967c2f855053b63aca1141b8fb3c8e7720c0bd8c17d18a2c3a73902d6711c5ac31110a4008d920ef9c6cf918d0b457cc2373229516f2f0a9c70b91fd640c2959a3d95634736910c840b173fc4565912a332914bc4c6251483691ed7aba7906693eb54f36794bb0777e5b45f32756ea6889d6fb75c84845d99a5458b024257a6210c657555ab7cdb802351e1016213636c3b37af4b57aea9cdc5a336fe2b987fa5994c991c5b59aeda80a5dc1639a5dbc994e330f710752af651b11a2be27c57413704c0685973c67f969098383b341747ad8849b0d86715a2a296f0321f2e9c72b69431d4253970f25d653ccc2bf72d617bb861ac66781576a6f7aa70953d6d3c40dd659a373a1d7be285ace7c2e7c754d42c780ac5a8e9f7beac93610b9c56c64b28703b63a1684a88d76576743b650178c79b209d28a616d79ad68092b5b0cab578c4af895aaa20455000a07a9cb4bd57c04dc5ad159488b70a289f229e87552bbb9aa1f24aab37099d0db07e9ce14f500773d7326103405f5a516e0240647f556001d6cf77924c2eb3c546a25aa10a80bbb20d09faaa6115020e988a85093f2e15447b536b6c610776403afab7037b795a7fc93eab9639f400a383454e10a591ac0ca3ab344ca0892a022532bd79ae558710451175134801106c615e47ac6b333b1ff430a1d2a0b8230afca93d65e83049f01d00ad5e795902b8ec7dc496268584cc90bb8c88148bc5082b74e48b1fc2116d9033bd342b53215aeeea5788447c0c50b567b88888841b9d8c9e9488ba2a4a23a3f913e00631ac784f13c858e5b49b920b428cd24cd1ecafe553acd95982af5b8b8b00bcb1074f6ae52ea7eb34cb4482d4679efc337eab910d78210b94f7b5ef150814c01459c0154d67493fa276dbab403950a609b23d1fd37f23e6c40be57c2b9bac82d9923ae3cae126be2c0c54eb88c9e0307402971543b58b67d21760590c818b4c71855fe90080696644e074bf2a45237f037565e800e071abd930abbe6b6e4fcb8774aac945898ee8b74911726e316568068a1c545ca5e75c02c2b2872d478605341ee5b8b914690d9b0938940540a595744cd8bae7483d39d1511344ae19bc99fe5b5180f22c032b6bbe67bd507c6a9a22c2e19a8ea2cbc5436a8b307a9e69d237076a0fa8d52df9852205c4592461c252542c95e2847651011e1233834508a8b7b3d09c833e8837150ba67405ba5d651075e39590d74ead502157253a703c2d460cc21ef173e197200aa85e497c9e6989996cf2c29320bec0b671133bce293268fa9b4ee48c31c9957dd2319385301c2ba97338c99e33d828119174e1696955c4bc38dc838761a183d31e38bc21fd2b955d9002ac69ad96c03822fb4283c4216e93b96d86bbf81888b68b1e67741d4fc8af15d4642a7b65d7b408ec711055826bf634557c8a7ce4a32384592f3c5881aa530213c2435141505a8c0918186c1508ab11101b09397d82b31c85ab64f4bb38947726d2c717362858a0a3656487b0deaa38c8109e5fd061496a695581347d52aa7ed71c20d8a613bc54e8a49a92ebceab993b0fa81de448c156550aae181a537c38638c6320abaa08c50b7b54211dbc8124a487eff2b545ca3db8a07be7674b51a95efd08c4421cbf2aeb8cd92383851a044985aa9a062bf5267382db45519bbd747852ed1a590ca3a89602a6c65cc06c856e22484244fa15b928b13b91736b1680e18cb1f76a7209b76754076db872295ec76e246b1f58f80fe0610372938393288c85b2b2f2107fc39c7d805678e68a38e3e57c30ecb650dc15468674cc54aa8aaa424b5060a03bae4d74c8a43c951e6b53b2c8b1502459868a1b03a5c1395c1b10551c28a6756d251e1916c24ba33792d74eb88a5c84078f60c612beb4a7d94bca27e3377e53442284c395ecc235309d1281c53964bd34a067f225829e5cbfaed47da9e393895aa82a67ab5b44a92d8423bcb59265e73b84f549927427e9295acc8694d77020d0e4342d3c784b121250140db1c3bd38806351416c8f86b4abfc7a14911bc865baaf867f54e92f935b044b60bd5343c5fc9b2d1dc68735baa31ce155e37c1ed0c85162d2ae3492c44c29343b50351c64747f9765b6f9306bbb3e543334c987c9a1c2a5783a576ce94b8f10bc3539cd55f30b0cca01a5985eb5993d35b8cbb136bd769b13f0c5c2d40b34335a52bd34ab04f9cf3f6c313b6c5b9ef879c10c1e1b249cba2580f7da8bb06c003db8718f318979e358292b881f9ccf984c525b61a34f6681197a7834913230627b56388ea26cce0569680c968b31aaa97710c9b2cc019771a57f8b5739554e45048d59610ba990b2e1967648d3c87410aff7981a57e2bcce971b912c2bf633bb8ea55314f3327d3b4fcde33aa1e235e6eb603caa19ba83c98eea4196c78a80e8b5680227caf06ebb22042e9a5c63974650fbcb1531404c6862710215012671093911d67027d491a916539a1b84b3c966b89ed3b1e9980769267827731ece44826a3a0bfcf037d9fbb9bab4b85ad668fd1573c0e9b227fb5ad32c948037384145188b17620eb91cf6a6318f331cae3800164ccd138c8c75a3071a7c0166f5156d74171b5b854c0783f9905b88950c23ca8835e530c4037260500be9f00510b5357fd1b80b09aa06b7126ecc8bdb709e3e698761f756ad0624280778c0ca140c426f91c76f81b96cef425403c95bc00852359b638a8a75b3fcbea47990e002b346d5a9481083c4336d02191326f6ab5c5777f622cd4819bd1187cc6099cb7968474ed93c0b830bb301314551970b86a25da05dce97ab5db744c78536712c752d02206c8585285268c5842491f92636682b223b6bddd39c6070bfd74aae3f8ab1fbc357136028aa3542f006cfbe429001377d2112c5ae3805244b865ea863257aa671d0b146d04b89b233f70768a373043a59b9060b0943f56865e6a91bcdc54402574a0f1c143dd36948d781d2f3c44e2f08b52e339b6e1cb330c784bb2ca3538979b24246c2644907484719c531ea39f13c5a34046f8e5cc31646460817a0fce5836bdfe124a7448e7adf7b8ecc2652ac6d280e986682df71 + +# Official test vector 36, seed: "ee762f5c9021c36446706a88ef16312f4a12c725cd7afff1484337c91eda8e89f7007f3705747d29907b3fb7500e5074" +seed: 056661b38038da4fdd7426f32a81576c73ed84843b305168a374f934e27a4e1b79238a80dcfd7c992d84b2dffa67493e669243d4fa38c46b090bdf86bc548411 +public_key: 00264fbcf666abba49136b6e6ca0ac8636bb20d305bca62bdef6301aa51899d7341147b72c210afee6a3294a4ac8685b1b6003eafb7e94d91fd958b5c3944129198bf02a2e9491491a2bad9375cd9f184aab285e91c877884b101511775cb31f2a2a3e7337406d7662c8d8c83c1933f0e27b8b2b39b1aa8897440ea5142f22b218c77c664092996e39237f577139014da6da6870d848cf98b006c9633ff138323261e1d042ea645e60813c11f9489714c197607e568c8045f0244ff40fb86634dd469033456604f19255645898181cdb830c1a82c4eb1373ba820515b6a44596342ac8b912c217603cc92b8a2b52caa29972bc95ab334a93307d7b9aee013b22118eabb947b1a23150481fa1e7b9146b9ef5fabe9debc682003eed2534d9614d90466c80a73fab8b94d187a383463e7f6a380d1b34ae5473f58167e97794767a20bce5b6d5dca88b35695e0a2baee03abd55ba0fe768a8254d40836233fab358842675508302a337840167dee53eb3ccb531a7637dd1b9dac9a00432268002165f72a5aad8ccc7131ccdb1c986a7b29bd89311099fa3e9460553900e51560364bf9af461f1487cd9f0adeff5079b07240870c310ac4702e113f68433981242c153c49c43cd93493b52395b5db073ec936f3518b7f6954426b9757476cc1bd0c4ff870a2124a8f8daa3299ac21178235c260a018c169d083cf40842bb6a0f2d407861106b4e752091dacbb85677fabcbe180abdc6235d0e8c34737a5934f431afa670d000166f6c5e4516174a205f4bb6182bb24a54907be5360cb81b5333a937c4e40ff2579b0039c0ba3374664859e376a8515b390bb46acfb54bbd4aa6daab1dfdd44c712b311798c71e162f36f562017821cc96227cc431ffbc3634acc704937187b8200d9bcbb0c25df359c386e740195662ae24cbb24b181a23a2b4cb5e3a767701d3a80f7bb82133be97daa38a706c7e2949ce86587246bd5fabc774956019c2247f5748f0988087159d42b8c6b1aaa398879c77e32b0a5494926588dc537fe1f05a10741fd8814f191cbdc50cb2a0ba1ec053a789396208415c77c18d283510f410a722a187cfc552f63159648317ed696695413ec894ab80f4c106d73933e312996b23f073bdb9625727d8c0ff1818d9f78b91c4a6c33075f9a91b772138cbf6861937c53aca7b535baacd2bceec96223ba7747b4a7d50c36d3cb0297967cc447c3bffbbb723455e421ccfd791c48f8ba558692e2ce278dd351e28d35ec1039f16d8281bc0867d529ffa6544b1663a14b6843fd85feea2b00e3c8b2131bbaab0b2161493caab5464501ff6e30074a372dc6a905b9a1a66b637365b48af4b55e45ac4236781b71b130718941f06c17d84786bf1a033b60da7c6b0d4d385f3f323dbea84c0bb8fa720569d1959473b1af84459c0ec4ef133c0688323fe8503069bc15cbb391ba7041e665f652880ee367c97f34e7230009fc401d7a34b536529ef544233761bd2a01a9da338a215492252906f979290202e5c666bb31a74feb13b05cbbb341076674c02567c80531c5573fc6428b8ceddf3ae84b8bb7018a3ffb02906770c4528c73360a867c2701158927eb5a9fac60a2f401affc4c65198b4a5e1439001d5882496fa682185d21aa4ef95ac3eb5e675c7a4a4426f93 +private_key: 06f99e63362cf6dccc11a8854b1407ff12142d91a19d0395f3923abff155cb4807aa932e218232dfe932aafa673150bc9e7155794565aaf7375f7195f0c1c35279a51d613c6bc32cde086f61725c28324e9e392d1d3a91b0661f1524592f6772d4e012402c18ea162a3cc36b8f565152dcabe80691ea3b84d9eab83dfc429036676d1109d9e258343b418f840a1c53b47211b55f490202c4659126bcc5f4ce23f2906630026cec8418526efcc02b0feb7728a53a3298232ad37a424b4f980827e24ca9cef26115a100bd224b4a304914c83629049f7e836b8aa539eff61a60fa8154ea97c31259b3c629dc891c027c8e5441b5f164759b13980ee0a5baa71deb08c99e6340419b0f6ec82ee2536231e2634f9307781097f8ba2a22db4412c5bcdf764f0b58bfe176163e1b5667ccc45b39c77b3673ed4c70786a33b5aaafb5d5c12d4077baa3223e2614a7e917c7462f220545fbe9275b1a62a882797e5a96cefbadb309995c9b26747ab33e543b36080c29a4bafe68ae41911aa763a8d90162a1959dfcb7890a394ed40a5340f0b8a89434baeb9414ba460178b2c5db503a28bc8f2a42caaca2fbd6c77d758f30e14bb1075ffdf535fffc76d02ac264787e45340b1dfbbbc4513ff15abd2337b6d4543492160575f44ba1c793c3054bfe767a827875322ca753e200c717c47db1ad47f12ad103c28e9380be2868c8b32f7102c26b977760e67d98109921425611b9878e215494910730956bdc7a015506c45f919071042e921607560560237bba0c3190c759295ad059b7c99ecb62222a54563ba730a7d3a4dde375c9f931cd16c4344552ff984fd6aa9ede0602a840bfcb705e078cc375437d3927455aab6ea3872499b0795df7bfd436cda3368bbbdb990d6ac9d3f637be663e7590055e00558d0177f7c63e7fa292097303d68a34f240a17c7c0b80c5a69004c195d915dcc880acc9cab1db842c14722ea534b865488c41824017cefbaa5c1127aec9e535112764e713ce403c64a6a27662a254836327d5924846dcb646b79de5ac0bdeab9223f36f5c124e595165753656b0110241f6b805b0b30b1b698190b5d4f1ce112c93b4f6a190106c7be120d2dab2995578fe9c08db3bb36c99c2c3f2001c6a269f563edd088f3b50a39d508a67c75889012cc090217b321e99e95f4f310f8db2cacbb853297601895a3430405f828827cf151a83480b4276cb73996fd5d7b357a52573912ade3394c48b7709d50cb8f2381cf50eb0e14bdf5740836138e539a7fa6a4a94339cde3bb71ec34ebae4bf4763ce93d6041f62bd61c81868f81e8b88124e667cc83c0b226157560647996a2581837b75eb59d5a934bde44cb1e664de41184ac480323ca59f624662b17bcbc20424c565385958c99246d2383a9e2000f9b817fc57b7f32513d96ccbb6140510e11e224702893bb891350404f376b0b04a674b2161bc3c68e8901348a9a9d7742aa3a210319dac25a7ea909f2e877728914cbc2332bed4876f5453aeb3365879a0a24244c6172a8d267cdf9c10787740a5852e66e3663a879a35208a07959b9c5997e57a779e8679563caf551a597697473776519f87b0d7e03c1a686d705c55d1b1ab00264fbcf666abba49136b6e6ca0ac8636bb20d305bca62bdef6301aa51899d7341147b72c210afee6a3294a4ac8685b1b6003eafb7e94d91fd958b5c3944129198bf02a2e9491491a2bad9375cd9f184aab285e91c877884b101511775cb31f2a2a3e7337406d7662c8d8c83c1933f0e27b8b2b39b1aa8897440ea5142f22b218c77c664092996e39237f577139014da6da6870d848cf98b006c9633ff138323261e1d042ea645e60813c11f9489714c197607e568c8045f0244ff40fb86634dd469033456604f19255645898181cdb830c1a82c4eb1373ba820515b6a44596342ac8b912c217603cc92b8a2b52caa29972bc95ab334a93307d7b9aee013b22118eabb947b1a23150481fa1e7b9146b9ef5fabe9debc682003eed2534d9614d90466c80a73fab8b94d187a383463e7f6a380d1b34ae5473f58167e97794767a20bce5b6d5dca88b35695e0a2baee03abd55ba0fe768a8254d40836233fab358842675508302a337840167dee53eb3ccb531a7637dd1b9dac9a00432268002165f72a5aad8ccc7131ccdb1c986a7b29bd89311099fa3e9460553900e51560364bf9af461f1487cd9f0adeff5079b07240870c310ac4702e113f68433981242c153c49c43cd93493b52395b5db073ec936f3518b7f6954426b9757476cc1bd0c4ff870a2124a8f8daa3299ac21178235c260a018c169d083cf40842bb6a0f2d407861106b4e752091dacbb85677fabcbe180abdc6235d0e8c34737a5934f431afa670d000166f6c5e4516174a205f4bb6182bb24a54907be5360cb81b5333a937c4e40ff2579b0039c0ba3374664859e376a8515b390bb46acfb54bbd4aa6daab1dfdd44c712b311798c71e162f36f562017821cc96227cc431ffbc3634acc704937187b8200d9bcbb0c25df359c386e740195662ae24cbb24b181a23a2b4cb5e3a767701d3a80f7bb82133be97daa38a706c7e2949ce86587246bd5fabc774956019c2247f5748f0988087159d42b8c6b1aaa398879c77e32b0a5494926588dc537fe1f05a10741fd8814f191cbdc50cb2a0ba1ec053a789396208415c77c18d283510f410a722a187cfc552f63159648317ed696695413ec894ab80f4c106d73933e312996b23f073bdb9625727d8c0ff1818d9f78b91c4a6c33075f9a91b772138cbf6861937c53aca7b535baacd2bceec96223ba7747b4a7d50c36d3cb0297967cc447c3bffbbb723455e421ccfd791c48f8ba558692e2ce278dd351e28d35ec1039f16d8281bc0867d529ffa6544b1663a14b6843fd85feea2b00e3c8b2131bbaab0b2161493caab5464501ff6e30074a372dc6a905b9a1a66b637365b48af4b55e45ac4236781b71b130718941f06c17d84786bf1a033b60da7c6b0d4d385f3f323dbea84c0bb8fa720569d1959473b1af84459c0ec4ef133c0688323fe8503069bc15cbb391ba7041e665f652880ee367c97f34e7230009fc401d7a34b536529ef544233761bd2a01a9da338a215492252906f979290202e5c666bb31a74feb13b05cbbb341076674c02567c80531c5573fc6428b8ceddf3ae84b8bb7018a3ffb02906770c4528c73360a867c2701158927eb5a9fac60a2f401affc4c65198b4a5e1439001d5882496fa682185d21aa4ef95ac3eb5e675c7a4a4426f93b30fe432c2e9744430805aef6b75cf3011ff387e323558212b9d71ed71f044f779238a80dcfd7c992d84b2dffa67493e669243d4fa38c46b090bdf86bc548411 + +# Official test vector 37, seed: "d882ba69ac8bbc88715f1c6387531f53273a5dab87e66faa8221a7f628d2bdeee1cbc59c0e08d0add84520a3a70c1389" +seed: a1b52d871612a1c611ae0944f9e71858f35d3bd14f20e96a931720668bdf0a6b1f135cf64b6403e103afae34da038613e2853bbfc36baafa3c6a95347193f37c +public_key: 869719ce20c5abaccd8889286f2a77b388a58ebb7c53e79619762ae5111b6f352192288128a83202005adcf0b15c0640f2b84d2ed58ee806bd4fa22ad26c5c8eb9a035768951a579f8facd48428e508abecd418617fa5901fbbdacb6b539c148af327823009e86fa49b96c42d8ec5accecc423fc979c475fc9c63696c21d206301e9d54ad1088be167af34c57facc25d4bb49ba5677842e27c1fa666b0659c66dc412de949980ca6a707a0c21976822579a0fb1d697892fc87251354a17f630271cb3b10f5c578777a990361b467c1374897675748f763619e065104a31999a765815ca7a22103f3631879b790a862450c69af8d29c0f9a48e8dda82f2c03c0e12b62484c4ee35002848b030e41dcf1084b1f70d405677a059774e322c7b72265e32810e761d82956cc0194257f31157928b786b6fb6011a130620d2f51678d27de0965465d445e6777660865df9e73bc6858fa8155bf5cb4bf9c23527340c32211009144fe456950694b656a2a30c55647d17cfa1856981867aeb82af63f1525c31cf643b32ea822b2f389ad4255838a2bc2ff850cbbca834c87f9fba1c05ba251acaad9ad99075920653d29d94c399cc4a2e4c7a871e176a275b7ac0a4401d36b35113595d51b92ccb8618f3ca40b4900774a784644973477dd492c66d09ba9b074c3d0347dafa08dbe43a9b890f62a5b9caa996f9e362b9a2103942cb91915ce8e390af54a2578227a9389e922b9c382907853ba05eb13e7f03c079301db2135d95c934da5784cb05b9726a1c1e28b01f5c5edba7a340053ea51c32d0930653f46170025204c0adf94c2075631c55790895495f23ea104a60b88c8b627db4256b6892d1b7886f959a18ac238aea494e45aaefd72056f362e7f34ec5e20e9c9aaf2efa8683970e310390a620264ec1ac3af515c24409ef4a4b99d0725de1506c706303e2848e2904f8c4824260162e5392b5b0595d699357b190e237ce1e3692ed95b7710488ad285c04db243eea475520605cb98b98a1cc893a7f1d7492f038795da03f63a91ec925a914b3c1fd9a3b5a74bea6b6770a5b1400348f7002555ba8c9c95b88cd829eb179472245228c21afa2d39238c76cde000898b718884ac8108c06e81c02f264bb6c9c5c13081c09d431aae78a26d62fbd041f32fbc012d0c83fb9450448cfcdd8cf881036ac096396e311e923478c5a346cf5c930d01c84b04400b38759a18d3ba40e46c8af5f133258f353aaacbfa68b0bfe206bf7fa65b192a4798a0faa68b2574725dfb69ff108b7c155cf77426ef8a776f0455bcea85ffb91a74f7203bdc2a9d0096fe7ab57ebb4cf1dea1ca0c5c4f9e264d2d5a0fb64658bb3b1ccc93ea5814407b6c865bc2b2fa14311ca50016b782716841bf89474c10e182aa51c0416580769312419d1219261a548ef0aad81159e4be73bda9c8903b7a4955456a3a8b405a27c18968901d54f8a0ca16e41aa1d0c128edc33b069a1c1e4b22438beb74a996c8b30c1717f07092c46402b1d9b710c46540ab32f38381c95b7445704461c0589cb427606057c78f911fc72ba38d1b664767df30901b148b1d609601bec3e40e41136ea9edac60f1f097c49906f105c99c4b069d5325baf3e6882dfda254850ba1ae5ca738086b4bb3c91df05c11c1acb67a98d +private_key: 93b888d05aa46698878f187be0da6290127b2cacca5fe508c40a523aa56b923b5325fb7bfe0b3cbff11fefb8c9acf6b1add2a41d265be89baa96989afe97a5a749484d27b8761b6e9cbb2a957676743cc79b22a74bf92ac693bb54a31c4f269e5d00c470630f7c491a708b40bc7160415576db195fe78b3c33140882723387d4af2d120b0fd015b41b5984a8c217e818300831f1556c5489139f216a4ffa5799246e9151790b98c2b907b8cd917f8d981e7dbb760a725a30e34d997774c657cd4d2648e974510511583f15c5f0100872b91d0c1c89c307ab4dc31cde68c364a20712559a7c7c58d6cc0c8feb1645d85436a8188d7c171da14451685591380bc0a5417870645e4c633a2a430f23941c80c92694b8cea6674e97a032c89516397d42e44855b4ab29f484d4e33097754d0fcc672f452be0b3a2b752c2e2a87275aa89e65ca0efd096ec158f591557c7fb1b6e696ef2ba704006b7f6e811f2385dba947fb10c404b79b90e620a842a569dca77f1039b62403787cb36bdc8984c352c48635b552361c77b82eb67abe8ea1db025302a98b9b075a5569243a8725493f07cd025494b5c01cce508d594cd36f473b8416a9e7a8de0a99879c109161ab3adb78d01e1b2ba2809b7266575086cbb2622a4e708733bcaf322420a65873c624dbf1c20a07821a0ec02611a36f4501485a6399a91b888ac547c50120e5070e597a9a6a67f06a2039cd6ccf7246adc0576a3f4457cb9a4c4b46ccd846a77f416961072cfe64a32920851ab1a20555122942b7c3cad5b137f6885b39d66cfc4f5c7c6e63d2d45c8e184467ee336945aaca71442b1508bd9687f40a4b70db764bbf90510526ef1842151c56da153a100fc92efca3539ac6efac23fcd60665263cf435ab34336b08d2023eb147eaa00c5271459b026638b9c18d2d04e3b429ba38053dffa2b1930a7453146e798323dc5c5fda63ab285810dd734b9988691c8445098a2ed96cf2324067fc45d12f118b2726104404c2174097147cc6363c684215a12b4b34b161231331c56fab25f0418f5e55fcd8bc258349524004a7534b99051113efcb310d61556788e187c1f410b6563530d8aa4bd07690234d504b4a9795d8141d56049d8e1c019932d46219124596a64e20658f010724547e8aa25d55c042a8a58de53b10c9c26740812ce6952f765bfe6153e1b43582f5b7af3ab3881ec42b4f80163f89648c622ab625da6b730f47244d2391e32c2bb19da532c726f30772cd90b64f481cad12c86c6166bc6f38fb0f92975b9aa31b8acdbd5bf5e746891a7087849497feb4fa63c28a4836784ac8a6e631055260ebc0b33c5140fd3ecb5d82156f16aab8349411d1192fe578e3d359e22705439317b7df77d08d38e7abc8b146307bda7a7e00b8e0d51836b1ccd35611835755a72a6bcc069165164a1181920af68434bd639fe0764fe07d0b6871ccc617b5958c26763113c9062be342dc5e44fab720a30a44a10aa0458379c9d8719606a564df808e63581820606ba242ae664c4fef748ad311ac4156f597c39f17c93f88a74418b734e0caf607c4f9d72877c925c0f25410f551c2b3860fc26cae2f3a319815a239bc4fd627ded7181869719ce20c5abaccd8889286f2a77b388a58ebb7c53e79619762ae5111b6f352192288128a83202005adcf0b15c0640f2b84d2ed58ee806bd4fa22ad26c5c8eb9a035768951a579f8facd48428e508abecd418617fa5901fbbdacb6b539c148af327823009e86fa49b96c42d8ec5accecc423fc979c475fc9c63696c21d206301e9d54ad1088be167af34c57facc25d4bb49ba5677842e27c1fa666b0659c66dc412de949980ca6a707a0c21976822579a0fb1d697892fc87251354a17f630271cb3b10f5c578777a990361b467c1374897675748f763619e065104a31999a765815ca7a22103f3631879b790a862450c69af8d29c0f9a48e8dda82f2c03c0e12b62484c4ee35002848b030e41dcf1084b1f70d405677a059774e322c7b72265e32810e761d82956cc0194257f31157928b786b6fb6011a130620d2f51678d27de0965465d445e6777660865df9e73bc6858fa8155bf5cb4bf9c23527340c32211009144fe456950694b656a2a30c55647d17cfa1856981867aeb82af63f1525c31cf643b32ea822b2f389ad4255838a2bc2ff850cbbca834c87f9fba1c05ba251acaad9ad99075920653d29d94c399cc4a2e4c7a871e176a275b7ac0a4401d36b35113595d51b92ccb8618f3ca40b4900774a784644973477dd492c66d09ba9b074c3d0347dafa08dbe43a9b890f62a5b9caa996f9e362b9a2103942cb91915ce8e390af54a2578227a9389e922b9c382907853ba05eb13e7f03c079301db2135d95c934da5784cb05b9726a1c1e28b01f5c5edba7a340053ea51c32d0930653f46170025204c0adf94c2075631c55790895495f23ea104a60b88c8b627db4256b6892d1b7886f959a18ac238aea494e45aaefd72056f362e7f34ec5e20e9c9aaf2efa8683970e310390a620264ec1ac3af515c24409ef4a4b99d0725de1506c706303e2848e2904f8c4824260162e5392b5b0595d699357b190e237ce1e3692ed95b7710488ad285c04db243eea475520605cb98b98a1cc893a7f1d7492f038795da03f63a91ec925a914b3c1fd9a3b5a74bea6b6770a5b1400348f7002555ba8c9c95b88cd829eb179472245228c21afa2d39238c76cde000898b718884ac8108c06e81c02f264bb6c9c5c13081c09d431aae78a26d62fbd041f32fbc012d0c83fb9450448cfcdd8cf881036ac096396e311e923478c5a346cf5c930d01c84b04400b38759a18d3ba40e46c8af5f133258f353aaacbfa68b0bfe206bf7fa65b192a4798a0faa68b2574725dfb69ff108b7c155cf77426ef8a776f0455bcea85ffb91a74f7203bdc2a9d0096fe7ab57ebb4cf1dea1ca0c5c4f9e264d2d5a0fb64658bb3b1ccc93ea5814407b6c865bc2b2fa14311ca50016b782716841bf89474c10e182aa51c0416580769312419d1219261a548ef0aad81159e4be73bda9c8903b7a4955456a3a8b405a27c18968901d54f8a0ca16e41aa1d0c128edc33b069a1c1e4b22438beb74a996c8b30c1717f07092c46402b1d9b710c46540ab32f38381c95b7445704461c0589cb427606057c78f911fc72ba38d1b664767df30901b148b1d609601bec3e40e41136ea9edac60f1f097c49906f105c99c4b069d5325baf3e6882dfda254850ba1ae5ca738086b4bb3c91df05c11c1acb67a98dab02b962b6350a9e1314baaa272b6b13db3d1edc9f09d3addf07f6826a3556bf1f135cf64b6403e103afae34da038613e2853bbfc36baafa3c6a95347193f37c + +# Official test vector 38, seed: "6c3aff39f5d097096d882f24717718c8a702382dc4aaffd7629763fda73c163cf084807bbb0c9f600cd31a7135f48aec" +seed: 952b49c803d6d6fba69f4375adce8594847a00bcae2179da49af2aed0423250262d7033947ae42ca53522a65fbafe18d3bc3e0cb66164e9a094fe4b44d8977ed +public_key: fe04b19e38680e8b5f005167b4ccbd4bc2a87c3a98d2b2af18738b8b44b1ff480ad69183c828bd372a4a3ce12ce72867a886733f3bade4144ab55b63be2902aef88ab4e129551540e8390357631233eccf23a0668886b39942c23f902265a84a08b07d11b85c096512c09ac3c82023f23aaf48578bca4b50426713c7e5270980c78c6643ef615c2b6ab57b98111a321e30d8a38b5a376f9a2c793ba196e293fde201ba7261e222080d951b4f249a47da98c2aa4b87e165de574efda9577dc815c847ad269210970975d8322645246cfcfb46a194a9b3cb2b91a20fd9107948d8777d0a14d6187c922a5beed80600991f3040643480286a580e932032a37b8c82833535f721edf44e97397e14931cf7f49201d80b75d650f204bd37416c643ba725d2b3b4f368b033589e01cdc10ccfe264a6efe01ecd3b8e92478bfd7c1abba973459346798007990a9edf57b081c73d699b7a758a6013106597ab803870c24e4c2e0d649dea9bc0e0fbc742571b7b6bcca714881db2597c3a45cf0794022b58985a61d582aa59b17e9c567e4b4268976943982705f389566f53c49526ab6c210f4e694544d307d2c8612d1ccc23658127e8b071e58136734082616ed011397bb781896953c73b5127b28437f38c27d663b05745d3fa37e9c2a07dba767f0859e7a30e9d48cce5f37632e817060ca46633c9b4f6735c3bcbb9185abf39ba9ad600718c6fb84b7c7b867b5e5c51c0b0cdb03cc83b49568a4a02ad831fc93157a4e5010ba81c0b6bb34afb908a77b2e8d106f752c39ac1a00a9467d58484bd273733947a619439576a98b4360811c97e73431901978d295148bb991433ac72b4cc3e5cac2a8f68ac9d9a3f5d53889343af7e6b02316831b7208939a88e613c0ec5d07861099488b08deaeb2cd295b6977c7c9b2630cdaa5b0a93ab7d98728b3ccec979b869d506b9c679ecb673b7d83df908aa58603275a36291ca60fb717b74406ec852b802eacf4ec3c2533315240624b5b7a8ec960ebeb04d970cb815fb059c458d02254fe8564f154a8c240086fd98ab6a4a4510fab5205a99ab873f3ec29b603a660061b8eb803b6e71740ef174db09bd6c3447197765a0907d31fb1635435601b0a8337972263857f301ae5cf56a23dccfa392020bc84e79aa6a37450389a616f6e626e001592f7a71fd00ad82f3ac9d1979e83955bcd1248e7c9f5245a22bd26479caca02f70303b8c978187f102bb949b7a709e94fc2069489601c2752222da41090578edfc1083e0a8bc9110b0e64623e320f0bc56c4f2b2bef38452ac7c2e17c5a72166a48d55ce5d3abca1a98d6eacf734249e8820e29721931faaebc3abc1a7453b5b01b52a27284995df4f07a3827bd9567cc31b2bb08825046226e059b52bf8b0f864793926b461574b73198b6b4a128f19607bf1205380127e6597ea4b099eba13b38fa376177cf8d090881a20164d804320469b15988759025f5089d7b98675d554ce4714c124c1c30775cff79229b1b99e4206cbf28bab4017077d4721c263542ea1742ac45cc500d327a3da9c46309ba09742305b25390c50abae20b6e8c8b3ae0208aade68d9e2004bd0c26d21c8096cb97a1a2ab02548ab8f1be5fdea37e49857c092ebd421eabeaf7d76beea2feb7cff7d2376a329549 +private_key: 7db7cb1612bd434144e3e8c45dbcbd0983a000da3ad94150800c6ba82929366027b9f3213cb2aea2e094ed979a179b95629b885a77b3006d6735f6ade15589f06397ee572a11c9a23e206168d10736e0a073b28240518febc2a88135b290231c78e5afe50a21bba9256280861ef75f0e97336f1b735ac69b0f652bb6d3b46d6520964671a8309df2a2997b36a4430c7f1af27443b869dab0973793a39014614f96b4b0f554737b77481c0d16288183b71dc9794f713098edf87bc947a96f542e2a6c11670401dd475e3214be00c0054c687fd3774263bc9fd3cbb85050a02d53c1cea22c6da3585f743d14984c64046217555f45d9aa7b4944d14cbd3dd69bb520c150453bcf91387a1ca4bf4353b15a9792ea89def5cd09a6658ed57af3cb2d2b1464af2bc28e016379569d7c352ce2d2c350f8c494807a8d239c2b0654bcf2cb866bb35da6289f5505f0059e4351a44810920cc6ac87c224be4902f2f002936c4dc13554ff7588c13a1ab7a12b23c273e7fa5e94b152beccc94e0a74d3580414c60dd2e4806a056235152acbd21e7042a3c3429436a52bdfe45be4247a0d24cbaa1821543bb6d860889933897b85397c94764dc2b1aa94555ff42412377bc6902fdef97295569c8cf1585ad8ab64c124af41a534ea4b2e5b6d76e33dcc5cadd7e376dec13652115e9733c1aec91dc9446fae1702a7420b45f32c719473033925d7996915f40fd1f13d11807811f1c991b0137524acef597686b61c146526564ca162935307cb6fe15606dc660a550c848ea8171c392f5a916738db2d90534a4332c303601d14b98cf5e7cda3009bf50809d194000b10b63c7c718d8299497228932758629b5529610bf56c7a33464b206888228a257eb8a8c149b8a0846df20c84722ca98a458c09ca598d752f8273326f27600c179f1a8cb1e8f14072dbc9866058a0f448a1556531e010582b4672cb9ff873865eac6096f9a4fa0225f4855ff15c7a31968ea1447caba5c295f70d5c7990057751dd91365c4c57b601cf45547153b2258a897bfa5b3d23c00d0be449ce5172fc513141caa315b397d6d77eaa67c6570a60a3b16f90f1087da1196b363ca47b830b4902c23c97b1ac33d464b5293959f1a007e51374b3f016f7bcce7417695dc015ad84b37e07aabbb0630c467206d2471509968f88914fe6bbba9742878632ee6655418535b4e45b5595c90b4ba088541e51a32f4cb920879268f56861dc40bc9f661e8f611288faa6f0c911bdf631de2bc9d53369f2b116a26ab2bff14981fb817a9b4d8ab928fa19a3e1b03f4b89cd459a64521300f5e5ae6ed8125f2544bb039a4f09483a799ebabb8839c4111f45a013276ff79a3ae9e5001ce451a0aaa5e84b185f8747ba35c58a253618a8593d155adfd05a5f755dbee456ffc3883ff715bb42ae09531fd6d88ecbb21d3138223326b8e9362e5382be38e7035701c2f0d72c678b47a79a891487bb3c9c7d6b823231da391b2b3c6751bb66b7a7e326526f3221a3a936ff82a09c07cf33763b3072b93a2426f2508b2b734e184b6f00488f378373209552a4701c43a746e207342e463c4e11bd5ab1b5f2e2b8691057d6162dd66a1bc97ccfac8537fe04b19e38680e8b5f005167b4ccbd4bc2a87c3a98d2b2af18738b8b44b1ff480ad69183c828bd372a4a3ce12ce72867a886733f3bade4144ab55b63be2902aef88ab4e129551540e8390357631233eccf23a0668886b39942c23f902265a84a08b07d11b85c096512c09ac3c82023f23aaf48578bca4b50426713c7e5270980c78c6643ef615c2b6ab57b98111a321e30d8a38b5a376f9a2c793ba196e293fde201ba7261e222080d951b4f249a47da98c2aa4b87e165de574efda9577dc815c847ad269210970975d8322645246cfcfb46a194a9b3cb2b91a20fd9107948d8777d0a14d6187c922a5beed80600991f3040643480286a580e932032a37b8c82833535f721edf44e97397e14931cf7f49201d80b75d650f204bd37416c643ba725d2b3b4f368b033589e01cdc10ccfe264a6efe01ecd3b8e92478bfd7c1abba973459346798007990a9edf57b081c73d699b7a758a6013106597ab803870c24e4c2e0d649dea9bc0e0fbc742571b7b6bcca714881db2597c3a45cf0794022b58985a61d582aa59b17e9c567e4b4268976943982705f389566f53c49526ab6c210f4e694544d307d2c8612d1ccc23658127e8b071e58136734082616ed011397bb781896953c73b5127b28437f38c27d663b05745d3fa37e9c2a07dba767f0859e7a30e9d48cce5f37632e817060ca46633c9b4f6735c3bcbb9185abf39ba9ad600718c6fb84b7c7b867b5e5c51c0b0cdb03cc83b49568a4a02ad831fc93157a4e5010ba81c0b6bb34afb908a77b2e8d106f752c39ac1a00a9467d58484bd273733947a619439576a98b4360811c97e73431901978d295148bb991433ac72b4cc3e5cac2a8f68ac9d9a3f5d53889343af7e6b02316831b7208939a88e613c0ec5d07861099488b08deaeb2cd295b6977c7c9b2630cdaa5b0a93ab7d98728b3ccec979b869d506b9c679ecb673b7d83df908aa58603275a36291ca60fb717b74406ec852b802eacf4ec3c2533315240624b5b7a8ec960ebeb04d970cb815fb059c458d02254fe8564f154a8c240086fd98ab6a4a4510fab5205a99ab873f3ec29b603a660061b8eb803b6e71740ef174db09bd6c3447197765a0907d31fb1635435601b0a8337972263857f301ae5cf56a23dccfa392020bc84e79aa6a37450389a616f6e626e001592f7a71fd00ad82f3ac9d1979e83955bcd1248e7c9f5245a22bd26479caca02f70303b8c978187f102bb949b7a709e94fc2069489601c2752222da41090578edfc1083e0a8bc9110b0e64623e320f0bc56c4f2b2bef38452ac7c2e17c5a72166a48d55ce5d3abca1a98d6eacf734249e8820e29721931faaebc3abc1a7453b5b01b52a27284995df4f07a3827bd9567cc31b2bb08825046226e059b52bf8b0f864793926b461574b73198b6b4a128f19607bf1205380127e6597ea4b099eba13b38fa376177cf8d090881a20164d804320469b15988759025f5089d7b98675d554ce4714c124c1c30775cff79229b1b99e4206cbf28bab4017077d4721c263542ea1742ac45cc500d327a3da9c46309ba09742305b25390c50abae20b6e8c8b3ae0208aade68d9e2004bd0c26d21c8096cb97a1a2ab02548ab8f1be5fdea37e49857c092ebd421eabeaf7d76beea2feb7cff7d2376a329549c153354b0187e658306a0c860b1fe6ed14686ca77d37b7c82d66ff62149406b762d7033947ae42ca53522a65fbafe18d3bc3e0cb66164e9a094fe4b44d8977ed + +# Official test vector 39, seed: "cf520b92a2e3677afd003ec1ec6ef136a709d78f828c9c0dd4946efbd451c5faabfc83ca66f9d3d17ee4220553b7a69f" +seed: 3c815e57e9233e975fa1630208aab206b71ae0db37a7a8789ac683d9f9b2d29801c8e376fdb140ee343106c093af7cb149b316ba79446ceb4e5e0cedb9b164f9 +public_key: 57c8b4dd8ab3b7e3203f2358221c9cc0f2a671ac1846e59b3d5c95576806b571c64746bd4bd541d4c55128b9a7d5208960a2b74a900a426013f6b48fe7fa1adcba5ec1e44594d3850c1a90e2a6bb341210039b48224b97efc62583f5882c71505a96284cc7cbe9873215697ba688546d3a6f97729b22251f479ab3f92cb08fcc3a9d962a661c6150ec6dfdc7560986bf808b4504ea2d44d595a8c34f4a564147cb798fdb6836cb448ca857d5d08242e233e3826797a4191e53cee0b375d395cefad91a395527ed094daff389a198c9d3b28b9e42b002fab4aef17b3089885e8017c047c35152a0e2709cccd7bf4d4a081d3160ebbc3d7a3ba977e221fea55e01823f2f61bfbeb9388d04103fa0c3330770c5ea5a882b26d14c4266b27722f29863b60c9f6984a5f0c2ee8b6f27385933994d8f9973728c5be6898012e4766d842cd1d7b360e415286c965b0b5277a5a1c5f731dd085df0f9579a31b5920227f238c389a723f8c31ea1c45afcfb6a62e555b0b2b766e78889dbc7a8a174fec48e328b4411338b26074002261e3c19c575b42f5a09a268b223aea813706900e785c3a05a98a5708d083c5e6243872ad78f3b456173267d61d57b2f330d01f7be8cac65b1ca46d8492f39c83338d92f3ea9a3cc7b502b115d5a7700e5885f264c384aa36ff52ba08ffa3eee17531915baabb5c9c04033aa091c36a0c5e99aaf0fa446a945a6fa281750bcbcf8e6666c799a43780b4024b97a6a0b14d9722856838d00890b9a982eba53f8254072f07ec00748a61ca18b0b516076382a9a52eb19ad329bbb81534da023cb03e00cb65046615c2d41e24d6e8ca6da872d46a1181133662735c6e382a615707e3d8aa89d49801f7908262c9ba7f1a49cd3c1ce9a5344f5b3df38bf82121cc9d4284da0c662d8b74ca9470051524ad108a2756bad834a1b1b2f5c01b29d640ad11c70643c0553721504ca90edd32cb4c693fd451564a1ca80f447378423888b3a2d30022997281aaccb939b0bf2f5643b036596983768758ac6b97da4843e9d8183633a65e35cc669592ba3a73e0213489ff186cbc66b8fc49fd2916322b30a6f2cc89e42715a8722c672c246822938b32ca6c47f05c21f9da66fb457206e7b58dda0a7f28b93ce24cd182b068cb951c5b29cfe1c30eb226a81bc06629133fa0a590de985e680550dc370108a7519a0b9da5b06170bc8a647c408477333e63972a7452cac811ef60cce2b8af8cc43b848cdddd7168b01ab9d138270604671d0ce57d94481eb1361d9a7f1c5906a11cb80f6454a2c358ad27086a5214dba5c5f69b003d9856831a8c13b9c28c7087efb8cd7247853b1a9c50b70d5e086a4e48ec77c8c6f4a83a11421ba4b0871692477a6b38f68c004f4beb011a137813ac02ccfe7b73271262fff16227da310aff06a8d23938444436da66d7ec6144ab44edd1322b27179901c3c1703279fc86163f804136a13cc925e47901514da5f7c68a23b23347d2b78ecb07ab4d81420662633b8a07d686aea3bb8edb04da7d2616efb147049c45e2a0deb0c85260862d4d25b47932b54487d6396c7f94193e40483c928460eb6b9b4349e1e4c0bd180111a72246c4bc20377a7059faffaeb0f304a1a64398249b1e8626fd1aa24ae11f67a7f23fdcaeb349484 +private_key: 4284a3f8fb141bdc3c3eb0abe19b14e1c87cd6b667aaa115c1e4004a122459887fd63b38bac7421b0c3f4b19cb8aa591e6bb8d54039156627b305638e718c92682c05b56a9005338623a54d1fa92fd8b6630d4c1e0e50cabbbc3d054ba0f03443bc87273602234441ccdbb601d30263f260c567a096fc18fd719bb7e4c6d7113a7e4398d30f793afc45f484865aea22ba9119346374438a29c3b068223a4474f8a3c6fd4ac8c009226a346bcb72d61273ae1f65ac87060cfb129d7172bc452a3e8809f6763b0641cb9e1611699cc158c5043b8d4c995cbc438f549a4454bb147cb0ae27b726c1cbc906f4920b91ddc8531fb2ac06274519096c23975404253c6bbc00a816e5a0a20d86aba4380cfab92c5dd125156b7642e8552582114beb7b38a8b1050a42a2123470bb736b68011b809549c4550459b21ac656a301c0ef8723503b29b0d2370b2f4728cfb7ee17a1952a2354216155bb9072bf307f294bdc5760724dc75ccc315ec9bbf60e78cf11c27943289a0519d75b8aabeb895866c061fd02682e5c210a552e8278f8f296f7397a8da315a83d523bed7b99137078f1010d73c3b53321f0e5b0ebb44252404811ca113f7475f7a9b3cb9229e2e2b13b4f8abf5fa62aed176fba02361f24b9fb88d82147b2a299cf084cbb6c812fb2a1bd9b89a2c56a766350123355d3bda9774527fe9eb9af2c31b25a66b5dea238f27281516bac6e02ec69c8e5c9a9a9a180bbfb7a189b66043bc379cdb58f7c1ceec0a3ea4e931e854047c95565bf3bdc15098fee54b992aac09109197e82bdd28ae36b2c60e259788b53e8eea988d93bfae472499181176627e3d823af9e23870f771fad75b9938647ff39788a24b6c4a4ffb82399138387c9037b851ce74dc41182323ae935a0798126048c32aac4d7c7390691427ca53ca52eb65fe85ac44983f80fa7923419abdf8b14c834611d5908d742e373a7dba8ba8e3d35efd6c8fdc1c12e0f7c272a350fbd275d2eb1e0d836a4254c672251c06dc560f7a7ec7c80b8fa59475479f32a258294957d5d979a83cb6fc3c1ce6819f84e45c1e311b0e873f250283ec486323219a97373f5278a52aea7b88d1c7a43974e0402e58a55e6fc91b08381078f0285f898f4282ac8e5950d09343c7827df67a74ba1275e070c15ef44ffeb681c42b35c2c1b9c9d82cf07705fdec10e5f244759699ba6c5a2ca59b76e5ad5b09187a7bc3049389a94b2e25fc295310b30a9b3fb22ab3d9f893d9d696579648a77bcaa6b4213b23c65d4c303bc50aa0493c76c9387d186f85b0cea44488f0917612244c844450a81acb15e25aee3213e5bb647fd46b974bb45cfa21d6e1cc3af7799b32caacca0c80bc61a3f3991d367515276190e061b2ca956655514090b0667673e898a13e9c8573077641aca677c81eaf09cfe2dc78d0484af1557adfc9b32809aa5c6038020166b891920bc577f0064ed0b3112b727f800b22e9ec89bc691c883133a2b43a61c539701062e8512b9d1227e8eaab2985705418a8de6029832c2bc7eac2d5c0ab4aeb9e92324b83424b2a12c04b58681748aafc566d919862db6a516934ad61abbb17024665ba258f7299d7786ba6960a04f79b57c8b4dd8ab3b7e3203f2358221c9cc0f2a671ac1846e59b3d5c95576806b571c64746bd4bd541d4c55128b9a7d5208960a2b74a900a426013f6b48fe7fa1adcba5ec1e44594d3850c1a90e2a6bb341210039b48224b97efc62583f5882c71505a96284cc7cbe9873215697ba688546d3a6f97729b22251f479ab3f92cb08fcc3a9d962a661c6150ec6dfdc7560986bf808b4504ea2d44d595a8c34f4a564147cb798fdb6836cb448ca857d5d08242e233e3826797a4191e53cee0b375d395cefad91a395527ed094daff389a198c9d3b28b9e42b002fab4aef17b3089885e8017c047c35152a0e2709cccd7bf4d4a081d3160ebbc3d7a3ba977e221fea55e01823f2f61bfbeb9388d04103fa0c3330770c5ea5a882b26d14c4266b27722f29863b60c9f6984a5f0c2ee8b6f27385933994d8f9973728c5be6898012e4766d842cd1d7b360e415286c965b0b5277a5a1c5f731dd085df0f9579a31b5920227f238c389a723f8c31ea1c45afcfb6a62e555b0b2b766e78889dbc7a8a174fec48e328b4411338b26074002261e3c19c575b42f5a09a268b223aea813706900e785c3a05a98a5708d083c5e6243872ad78f3b456173267d61d57b2f330d01f7be8cac65b1ca46d8492f39c83338d92f3ea9a3cc7b502b115d5a7700e5885f264c384aa36ff52ba08ffa3eee17531915baabb5c9c04033aa091c36a0c5e99aaf0fa446a945a6fa281750bcbcf8e6666c799a43780b4024b97a6a0b14d9722856838d00890b9a982eba53f8254072f07ec00748a61ca18b0b516076382a9a52eb19ad329bbb81534da023cb03e00cb65046615c2d41e24d6e8ca6da872d46a1181133662735c6e382a615707e3d8aa89d49801f7908262c9ba7f1a49cd3c1ce9a5344f5b3df38bf82121cc9d4284da0c662d8b74ca9470051524ad108a2756bad834a1b1b2f5c01b29d640ad11c70643c0553721504ca90edd32cb4c693fd451564a1ca80f447378423888b3a2d30022997281aaccb939b0bf2f5643b036596983768758ac6b97da4843e9d8183633a65e35cc669592ba3a73e0213489ff186cbc66b8fc49fd2916322b30a6f2cc89e42715a8722c672c246822938b32ca6c47f05c21f9da66fb457206e7b58dda0a7f28b93ce24cd182b068cb951c5b29cfe1c30eb226a81bc06629133fa0a590de985e680550dc370108a7519a0b9da5b06170bc8a647c408477333e63972a7452cac811ef60cce2b8af8cc43b848cdddd7168b01ab9d138270604671d0ce57d94481eb1361d9a7f1c5906a11cb80f6454a2c358ad27086a5214dba5c5f69b003d9856831a8c13b9c28c7087efb8cd7247853b1a9c50b70d5e086a4e48ec77c8c6f4a83a11421ba4b0871692477a6b38f68c004f4beb011a137813ac02ccfe7b73271262fff16227da310aff06a8d23938444436da66d7ec6144ab44edd1322b27179901c3c1703279fc86163f804136a13cc925e47901514da5f7c68a23b23347d2b78ecb07ab4d81420662633b8a07d686aea3bb8edb04da7d2616efb147049c45e2a0deb0c85260862d4d25b47932b54487d6396c7f94193e40483c928460eb6b9b4349e1e4c0bd180111a72246c4bc20377a7059faffaeb0f304a1a64398249b1e8626fd1aa24ae11f67a7f23fdcaeb3494842ab47ca9355ece6cc643c3274c46efbd6e927b8b4d11ae8f80b5345b487a5c7101c8e376fdb140ee343106c093af7cb149b316ba79446ceb4e5e0cedb9b164f9 + +# Official test vector 40, seed: "197e5d562de7e01bed4fc597db28dc6efdf0179f3a5bda5f94caa39d67bae730540534d59a7a06c8448f628da8b7859f" +seed: 588760826dcfbd36d9abe6ae44a669bb3ebba6a218eab69e30f18a3bd536576e0e860576285483bb5fd36e2f944d32c4317bebc1e441470c1372046a790d79d4 +public_key: f784b4d0a3b69a60403f5b9c4aa3808d7b832ab9939b2a5cd15bb36ba710f13c934f0b5dc5f125b4c4604d330608c0c608f14795f690d21ab54bb9a0ed443601f821b3c153dda33f6b102193a2343bbac83b938e521676ea2a20bad2b515c13bdba9c7efa9b8b460a8cfd6a54841bb306819b2ba7adc5b93951653c6d116c86c302e067b358631259012f1d230b892c393652fe9d778e755bb1d8bcb840c51eb93371c2cb377da1f0a33c13aa4aec4c9b79f492ebe34906b6777aba1470787bce5ecc92f494377555685e32b6d52afd230464469adda074d5a159a54e3493a3364d7443d81449006f0b88669b8f507493dfb67b1f012037438437982c868362c172556989272c8b338b8a56ac0af290c3be991c5b552b77a370c026b1c7b4044499036dff32c06bb4b1b73b66d2644d0709f59050fbdc62b36e7977a7278fdb26798d264241914391c71ae928d5c7c7800fca963f4a5ecd9ad5b1590bc941909e142be1c382d7a38b123cc23aa02c9273b5f377d97637091db6455447574bb0f26a250c63a6aedf6ce4ef9cc1c86424b226b06da65158114fdf2bca1c457f68248fea0ba9576bdfc380e45781bef85bfc87ace9f6b5c6f5805bc3403b9e9a86503396b109d2ca2916e16bc4c7a9c47270b77db678a724bb9e461e2f3adcad69ab78a60cbc52134a7557afa452eb758d4c357af310247f2b61db9c2edbb126d7284f38829861870bb494fc65b8b16d97cc5c9150d4c4318ec698cc5704f8011b19037232b1e337911565382450a4afdb8c8e07a7b4127a7d6d630c74098b528aa9cea5249a6a424536a6003787b7723027bc8dfd07b9519337d5125b8bb631502701ae2bb9c352a3407cb3903a617303a5c29cdce23c4ed747eb56bae79084ad705041ad27cc7441dd8d51ac4f5be1c594019143f41c56cf9b1773ee0cf9f116036aa65896420f82406c1b36009e12433e60993b691bf9295ba6621bec9060c82bd3d8c75d2014cb774a3eb8c8c7e698069437155da058aa4a6831c6cd0b47fb425c4f85c5481282107d4b5c61756dd3235ba61a95608404c11546a28c0191c5bf8473135a98c582608bf7c4a1387bcd92b449f888c6b9990a59725ea9c896fc58288c5905bd8ad06a80ac952106d42b298377a0da30db7f68df4119edf5b45d472c3b11c85ca1439d2ea0f074899c3155a51f26af1f52265553e2136ae3a69b529767549f146ecc6592a4448918a892af6a895a27a64480546db66c42b8a9dd029fcb2bfc14189974531c37405812295e0e85c2c44620bbac2b5376463a0490f628ba67c7bb7257bca690ce4fbae57b717423abe164a43ece7b30fc768779c5a82d3265b7a0d012383b1d8a6967a33969a5d368bbf5ca6137959093c9b321539236278043112c8ec819e1d9b532f5c7ad7506ab9c31cf2f4b95f978cf642b67b2995c8f56c272775023a438845ca46a6858b32201ca14f1bc19761452a0a6a2b6ae4bde620cd8685a89bd02f64eb51d7bb5d29e71f009a79bd060273ebc51a48bfb575afebb57215aa0fdbdc0d0ad91120d3799c8843d50068363b5c47b09572623d7ad8071ea1424799c1eaa7165343af0e808afcb39f5cc8a7f5e14bd573052725185dbcc71968200bd272d97f676c08e4a6053f4e0a7071d7abe99607e757 +private_key: 72a953d60437f6c7a3855582b211c7d6d97df18c8c53a787117758a3246ddaf89668d5c71e999418e9515a9c95926688bebc25e0f003496bc0804a66ff68ce3fd1820c5320ed9992a92b8227d5042c72c1c1839d74b790ddd371d477b29230a66526a81a0962a52b5b501075f50086f041924e6889f5f6a6a7c15826a70e3c7268b4f224dec35a73da9db8500def40ada4d7b210513acc63c753cab007981bfb876171ea867197ac97716bcb830462e59167616528e840cdd703ab4516b1e307fd5703da82bdecb0047ec49355a60ce27598d739cf9a493c9c388613b05cdb302aa7d82c0c934b95d602fbc810133a7d5c15639f52ca0bb93b06392cd8223e31a3af2aa19cf5406f5953705c3a1e649346ba530b2e34618f520382569d8755563802ca6a76164da8227d904d2e86cf653123c725c0d0b6c799a35a5c517237d405c8d945119a1c573a4b00ac224cc19115c301b8a73cd9fa72fe8366d596a3eb781aab80895704b8f298571eb3a10fd7b6bcf590bdc4461b6c1522dcbaee713bfbeace03b4ce5a8c3d0bb6a3d7e410d0e5640be91e43a134412313cb170a1ec771c73b91af1c5a20a2b097f2be408155d0e3905f1b043f8b888954384adb7916154f0683619ddcc74086a6981a18f9a51d38e44dd4b7690b37a0694c434f9869140a5f4764c968598462d7289146044118022651c6ff259aaf878c584524eb4abb65424c0d3649a76c3b2a9168ffd4c44c074d94632d615bb6a8e2a318c6144c949c27f2a7b9f914cf97025677ae31329f5fe484909689873c2987f6bfea1b4f04fb2aa7880c8e4065ced03eb5fc49df2bbd38a3aa2295c541c47faca59145eb864623baad417975fb4b5b2b3f7629505393bf590b7b21579e3f7477be32b2b7a2819ff856395a700353b6eee92dadd46703ca3be7b033770744b6216a6aa06ff38ca6f3c21bca7ac726e7a665b45c46e4b5e0ea5cef6728f1bb25a2503645b063be0244a4bb9bbf1562ee76c7c859984c878c2f299e2bb0438e11578301a39c3288d5a4657c88901789438d35a29d0446af5782d5263cbf13c831b32c4d052f55746f6d555bffb74ea5d71b136b732f0041bdea87c3a81c4af28db20c3b7d92bd355b340d234fd7a78d0b7057e44c509fd139f7bc84d3a6161295c0438509014c875b2b6b9da55e222183cc0ab15c8c1751725ff90c5a75608b96c5c18a43a315fa5d5411c5717660b5200fa01459f02171647394caccb11426c7f535545931550c6a7b7acb725525ae17ec946c062ad845105072be4ea32b12b67aa73cceef80c8f9d534ec9650131a138745010f96804c8267691824c336c41e2a9169b1ad7de971f59329e3b6548267c1ae1642c649b8ca704e7dba94d6a343ce998611745307501c2c90c5ee9795e2ec58bc825f81979bf9821c4a0b00ba2415e6ba54c36778959540e2b9797f925adc7cb54ab54f5a58c3210cb677aa8be0d6cd8d354666b70f30e7718fc107a9c3289c0407886678c4da7acec224bb85be78c23443c24be09072e03a8ce92aa8323303c09266801a6444fb6267853df12bb0e4d54e9af982168c7941e785d1fb9701db1e46da1359c53f6c9370e7700e7dbc3e120b4ef784b4d0a3b69a60403f5b9c4aa3808d7b832ab9939b2a5cd15bb36ba710f13c934f0b5dc5f125b4c4604d330608c0c608f14795f690d21ab54bb9a0ed443601f821b3c153dda33f6b102193a2343bbac83b938e521676ea2a20bad2b515c13bdba9c7efa9b8b460a8cfd6a54841bb306819b2ba7adc5b93951653c6d116c86c302e067b358631259012f1d230b892c393652fe9d778e755bb1d8bcb840c51eb93371c2cb377da1f0a33c13aa4aec4c9b79f492ebe34906b6777aba1470787bce5ecc92f494377555685e32b6d52afd230464469adda074d5a159a54e3493a3364d7443d81449006f0b88669b8f507493dfb67b1f012037438437982c868362c172556989272c8b338b8a56ac0af290c3be991c5b552b77a370c026b1c7b4044499036dff32c06bb4b1b73b66d2644d0709f59050fbdc62b36e7977a7278fdb26798d264241914391c71ae928d5c7c7800fca963f4a5ecd9ad5b1590bc941909e142be1c382d7a38b123cc23aa02c9273b5f377d97637091db6455447574bb0f26a250c63a6aedf6ce4ef9cc1c86424b226b06da65158114fdf2bca1c457f68248fea0ba9576bdfc380e45781bef85bfc87ace9f6b5c6f5805bc3403b9e9a86503396b109d2ca2916e16bc4c7a9c47270b77db678a724bb9e461e2f3adcad69ab78a60cbc52134a7557afa452eb758d4c357af310247f2b61db9c2edbb126d7284f38829861870bb494fc65b8b16d97cc5c9150d4c4318ec698cc5704f8011b19037232b1e337911565382450a4afdb8c8e07a7b4127a7d6d630c74098b528aa9cea5249a6a424536a6003787b7723027bc8dfd07b9519337d5125b8bb631502701ae2bb9c352a3407cb3903a617303a5c29cdce23c4ed747eb56bae79084ad705041ad27cc7441dd8d51ac4f5be1c594019143f41c56cf9b1773ee0cf9f116036aa65896420f82406c1b36009e12433e60993b691bf9295ba6621bec9060c82bd3d8c75d2014cb774a3eb8c8c7e698069437155da058aa4a6831c6cd0b47fb425c4f85c5481282107d4b5c61756dd3235ba61a95608404c11546a28c0191c5bf8473135a98c582608bf7c4a1387bcd92b449f888c6b9990a59725ea9c896fc58288c5905bd8ad06a80ac952106d42b298377a0da30db7f68df4119edf5b45d472c3b11c85ca1439d2ea0f074899c3155a51f26af1f52265553e2136ae3a69b529767549f146ecc6592a4448918a892af6a895a27a64480546db66c42b8a9dd029fcb2bfc14189974531c37405812295e0e85c2c44620bbac2b5376463a0490f628ba67c7bb7257bca690ce4fbae57b717423abe164a43ece7b30fc768779c5a82d3265b7a0d012383b1d8a6967a33969a5d368bbf5ca6137959093c9b321539236278043112c8ec819e1d9b532f5c7ad7506ab9c31cf2f4b95f978cf642b67b2995c8f56c272775023a438845ca46a6858b32201ca14f1bc19761452a0a6a2b6ae4bde620cd8685a89bd02f64eb51d7bb5d29e71f009a79bd060273ebc51a48bfb575afebb57215aa0fdbdc0d0ad91120d3799c8843d50068363b5c47b09572623d7ad8071ea1424799c1eaa7165343af0e808afcb39f5cc8a7f5e14bd573052725185dbcc71968200bd272d97f676c08e4a6053f4e0a7071d7abe99607e7573ab27768ce397a94bb7d29f5dad97d54054915eb66be41023e5d7052a10ed1e60e860576285483bb5fd36e2f944d32c4317bebc1e441470c1372046a790d79d4 + +# Official test vector 41, seed: "f170583cb451d8a45d105457c02c01a33a40350616ed8515bd49067142f61efb00f07857e4fff3fe11e7164c648c76ed" +seed: 47550e9edacb6ddce3d9ab81f6b61080dd4f2693854acb05e0ccc7a4fb6390fbf89d7d99d5c3e0d10d6ef9af054d842375f695abb28e3b8eb495100f04306e92 +public_key: 8645bfe5dca2202ca92a9b07a6b33b49872ff21b1cd901020e4ac369fca24c00593be105483a24076cafff8220780c9bcc9150b3a65571fb426ec47a82974bb2a6ba13a13551d737e1ca2cfb50103e14269263caa5b15b16066ca63b867a250318fb7335babe4fd81a2ef56ce7b5beb88c65c2bc6c5a75149898a3d8a552cbfa6af1a463a19a071cb64280da48f3684d99e0b4adc7b48d039358f201a7baa1ffa4ae95fbb0d45776bf76523cd504a379377b740d26069e933748710a63781a23765a6659eb4718dac557a8553fd5be04230166782860a3012290b068542dab126a9f921aba2b61afd6958052baa7b24ac50cbf1f613abf761d3315692c49184cf3995cea8f161c86768714afd1185161b6da86c73a6b228b953dde1713108029d7a729811b85aa906f67978239c6b6f9f4a72656b9536b23691b27b3b2316176357c07b671eb562c41621c7552265914c500a21299b17dd258e2a04352b506138187611c19e7d8860741b110c57372a3be2be7a3b5a6c688390f06a5cdbaeb6dece153ce5181c8080e4f879fc063a68739032481c2cea4611291362165a63ef3c0f436230409c8e5e57c01651471694bb67729919920c6852bd78766a5f5c1b5db45c84ac14c764549b54d8b2404523b0c00052c5d3538cbc00bfd96b8034206714a645d447dc83844ee82c069f63b59587f53c3cb0047cfe63b4f6ef41513ac5194b91eab2a5ef4d7bc55e1762e9162f2fa009a9c437d2c93308ca411e8ad7f9c2a642636d5e89f93f5bdedeb78062032db389bb6fc77be489506a98022e83c9aa9b7bf65c561e1a8a95871e4ab1875535981466286175eed087e61ea034c9488fe953106aacb251c7fa044bafe474c2eb602cdb091687558c02778f4b562692349f9b132fb3a921f75a4ee6c33440ab76fa420bfb339e2f8c225bb85538cc4388522f9628aade183c1532baa778faf937035639a5367cc64c4c036fc25a61b4f85470402e85ebb245a43c92f2cfb0ca69879a0fccbff31a35f2b46c986c66386308fac63978534e5eccd137561a6b110d82a2328a90636b55b8d67337626115448ca7eda95a6d2740e33c6cba56a9f34a95a7bc8f304702e25315f81182e54b2656913939083c052664a9844535301fcb730dfc9c5571ba72f279a0412b98cf64c069b89acda010494498f92838e32c711f1712d8b34303b3d594681305b20d2f8ad43fb6598113415460a0326bbca4c1d658a1462aca2a619abcc5a61a99921ca82882e1569c3902769e208c61124e741630fea09ec58065b889890a667d25bad039c4846a77d17acb5e726b5717b00e0b3918fc767205028cc4b67cb29b49196b4dc288a3abcb112bba52f0cae6ef09cfbd74d939b73ee610f0afa6d8b345d3ee95749cb4373ca3f52f69ecd767893135e7dc4ba6d069c053b79fea0c69b5c1258609046c761c77322a9d4626de19df5543165958a447432d5237f399bb1b9a8923ca45521b21cc4b17d36e724f5a09772a7b8609c9c86140b03e8a10c54adc91204c686049a643db89b0c375a359c943d5961a803c6ad28512839f42326f53b22dc20455c843ad64753498e10145af06270a81213046196d2192d0ae3924f4dbffa093a9eb51025b31d268a74f44b849a4c408426071fe5e18c3ec8b5c4 +private_key: 32f2c581d0b288cb18c0512172098f6e200cf9e1aba837175da86a45d4b6bd985728f5bf966b284eb96e059a8b4a99c0406046d117640ca029ff7864516cc6d49ba33b640c313569944b07a10b3820c49ddf965187d6794f491734531700571c788243cdf2c620b676657bc6cd9743242b6688d22baaa432f9015f69a179c01652d6f1c3721b4a35841bcf620552e4100beb54f494586c73cc5727c7dc023976d20bcc248bf6da8b6e36878f51177ce3326e9989c95c5219c017f59806defc68f466213c131811ca618df02df0ea6fa759b095e259243c897a132aced9661c3c04584bbc4bb218ccc118a91072cb32691432540f73403af7c09e520537592965483f25394e51a57f2403cc6ac6471ca8633a3c00a049669a3061f82770b7a7cbe4638a8c98b686c499940a004e9c3a7e9c1d41a5081943579620003f738e2d9489d5b24967b6be64d3984e4c2b69394f99f7062caa8f9be60c6fc6c801e77fc2d9b2286674df0c20414832d4193a024b26448bc33c30405c134d78948c34fbbf5a442636b87bfd3051bed47f86b2083a4198c8b224d1f8c0b0f5769ed72a18027fe4a85d9ebaa57cd20f696193645c9b1e6251b695061a711eb95270f541a730842f56d24981881b5bb071bd15af02e8641d1a3d0c093d680a7b4283c4d9751ed3c9b5b86c001da05bf5970f42b86071aa81e4d534be3b4c92b2b14821a54d9817212cc1364525bfe9cbf9978429c7c1b3a3615aec75d4651ec85469f3442ae17b929bf8aabdf0539c2b783c30875f29b68ca5ab28579f3d7722126598801368ea9648017a77c7608e1e54c5ed0bc0ec48b1af037b23665c1e675de79312637482a9655a5e72c155581b79bc9b8125c5f32248274128a993a6543172a6570c4ffa6e5968239174c6ca9a72a8a793c5fc61362c424b525fe2c23f94aa4d4bd610f1a55e330a6a9b6056aa7605b6623f8962a996e806de090adb40cb34cb8d2c024b00940bbdd025be366d12bb0b78c6b88f4a28f01731dbc7c1026a2c68da6a5bbbbd1e6a898f36a19610abb9cb6f04b3881d85bf9300142ec300ffe20b1f33763b816d6dbac076373a21501495eaab2ff3b3d0044d03658590a4c73f5486dd055745511bb4d176c5b7cc66fb0fa500b5cf14700640b2679c80da38762af61a4442687af30d5fdc2308c9af02753aa8a93b294b6e541490af4c7cfbf60415d9be34f6b7f73c4b6bb4842b5c608cf90fd8c1beba947fd9fba4eb0513e8d35c8995473ac200051c6063a3022fd6a8db9c0377f62639982556f8676464c86d856e6a599d031c35a294014a5b30b4aa5bfe779c14b50d4f6a3bec6318d6312f028b6bbb237f203b4737a9cfddf252f9b90964c01cb736a832cc337e078c6b66b9733c4f8401b8181926f2c73bfeea63cf3b843e017f60e35e062219b2e76c9c830aa187bc8a863b58a8aedc9a9e443c93520b109709089f4b40c8f7966df7af854b4718b91d3061a6aa153d7d336deeac9ccf0072d6540970741167281eab315fa2857915144f73f9b508542492706e1d285ca9c58eea9c3118ebc21c8374c6374cfe7c846e9815007b602ae23e43f68b82811498d2bf5a357c62275609022877e48a8645bfe5dca2202ca92a9b07a6b33b49872ff21b1cd901020e4ac369fca24c00593be105483a24076cafff8220780c9bcc9150b3a65571fb426ec47a82974bb2a6ba13a13551d737e1ca2cfb50103e14269263caa5b15b16066ca63b867a250318fb7335babe4fd81a2ef56ce7b5beb88c65c2bc6c5a75149898a3d8a552cbfa6af1a463a19a071cb64280da48f3684d99e0b4adc7b48d039358f201a7baa1ffa4ae95fbb0d45776bf76523cd504a379377b740d26069e933748710a63781a23765a6659eb4718dac557a8553fd5be04230166782860a3012290b068542dab126a9f921aba2b61afd6958052baa7b24ac50cbf1f613abf761d3315692c49184cf3995cea8f161c86768714afd1185161b6da86c73a6b228b953dde1713108029d7a729811b85aa906f67978239c6b6f9f4a72656b9536b23691b27b3b2316176357c07b671eb562c41621c7552265914c500a21299b17dd258e2a04352b506138187611c19e7d8860741b110c57372a3be2be7a3b5a6c688390f06a5cdbaeb6dece153ce5181c8080e4f879fc063a68739032481c2cea4611291362165a63ef3c0f436230409c8e5e57c01651471694bb67729919920c6852bd78766a5f5c1b5db45c84ac14c764549b54d8b2404523b0c00052c5d3538cbc00bfd96b8034206714a645d447dc83844ee82c069f63b59587f53c3cb0047cfe63b4f6ef41513ac5194b91eab2a5ef4d7bc55e1762e9162f2fa009a9c437d2c93308ca411e8ad7f9c2a642636d5e89f93f5bdedeb78062032db389bb6fc77be489506a98022e83c9aa9b7bf65c561e1a8a95871e4ab1875535981466286175eed087e61ea034c9488fe953106aacb251c7fa044bafe474c2eb602cdb091687558c02778f4b562692349f9b132fb3a921f75a4ee6c33440ab76fa420bfb339e2f8c225bb85538cc4388522f9628aade183c1532baa778faf937035639a5367cc64c4c036fc25a61b4f85470402e85ebb245a43c92f2cfb0ca69879a0fccbff31a35f2b46c986c66386308fac63978534e5eccd137561a6b110d82a2328a90636b55b8d67337626115448ca7eda95a6d2740e33c6cba56a9f34a95a7bc8f304702e25315f81182e54b2656913939083c052664a9844535301fcb730dfc9c5571ba72f279a0412b98cf64c069b89acda010494498f92838e32c711f1712d8b34303b3d594681305b20d2f8ad43fb6598113415460a0326bbca4c1d658a1462aca2a619abcc5a61a99921ca82882e1569c3902769e208c61124e741630fea09ec58065b889890a667d25bad039c4846a77d17acb5e726b5717b00e0b3918fc767205028cc4b67cb29b49196b4dc288a3abcb112bba52f0cae6ef09cfbd74d939b73ee610f0afa6d8b345d3ee95749cb4373ca3f52f69ecd767893135e7dc4ba6d069c053b79fea0c69b5c1258609046c761c77322a9d4626de19df5543165958a447432d5237f399bb1b9a8923ca45521b21cc4b17d36e724f5a09772a7b8609c9c86140b03e8a10c54adc91204c686049a643db89b0c375a359c943d5961a803c6ad28512839f42326f53b22dc20455c843ad64753498e10145af06270a81213046196d2192d0ae3924f4dbffa093a9eb51025b31d268a74f44b849a4c408426071fe5e18c3ec8b5c44c20aa5a85b2e43c56e051698c75bfc27bb9b1722501a6502d1c0dac0aa7f1b0f89d7d99d5c3e0d10d6ef9af054d842375f695abb28e3b8eb495100f04306e92 + +# Official test vector 42, seed: "44a6774b2cac02dff210ff861a090561a453db311f47b6fedb81811872d5d9489f5fc4103010139ae53fcaed209dc9be" +seed: 610afb64be8cc1df288cfb016ee2f44c6c07113de7f6fee071fe0c3fe31c6215cd292e4c5f9e1a55e0489bceffb204d672a6215f4f3980a646d9f880817c52dd +public_key: 38724d9a8308ac6b70d1c87bfeb07775d56703980c9a563040d1ba17297b1f253afc339ddc11a42cbb051ba2722854cbf45bb80cecaa81ab63ce32acfe953f9ac8648b95be8668822060bafbc10b59e72944185a57f790351a20de6679328169b954465f8cc028558328f3baeca98e42404299719d205cb17c745a7784b97c09130e26376778a9330c99ed84288ec3955df4076d0c9f5847af05bc58352c1364f34b0213a3cd05b2d79108af038e457a30bb5626b1dc404605678ac675201c537a8a6ad67a8e3e0b17a0e8632ca1714dd341831b2790591c1f39c530288dc8448527fa542d64192e407f2304747ca7cad98986c59622b2e63e076420916635a538871aba5469f36a5536356d176265191fc150a4dc7349f07c932c053ef4b6bd245448ba8173ca0896e51092e06537d2157b0c1624d3a29eb0d055d48a038c858e53c1045c392d6f59408df2bb19b35a87737ef90b9fdcc380af6a1ea122838c673e39f502a08908ac33276b4297c712b3c7541c7806c71dc76e9291c89cfac3a56c9c94852ec4a47bf6642349b95f69c43005fbc927113288caa2cdd6175b2a627149027e3688b436c336b51c8539cec3c5537de5ca6955543f984c73005181e916317262bd638e249cc928e048a20045907b79c441cfebf0b9106c8847b8088b4c41fe6b7356d7947ae9a9549305c9278e6e3a39060854b88b65cf9a20266218864c94377a475c0822d454ad8fb42c50a13f1be65dce1728388a8d4a81b372a1486a86b0e6d1abd445559dd3b827b834e2ab3744c0c5abc51bcb7551cc888de7f590ef780d7cc94225830732f47b6ab4777261944cbb3e6d943eab827da40a7b00d8960db1810d028529449dde0c00eacbaa321c14249b7113ba43968b79070b9117dbab36b44f05022bf25a9ec77c7a396415c7f24ce5e364b09a16308472e1d49ce92a41d3b868e4664e93279467745b9e04c39bd67cf0226d198110e6235a3a35af970a73a3472027e1c7368c867d23cbc1895790f2478f807b756516acc4c7dae3a350f26a0353930f4c23c3d982fb90176bc70e0e6b739fb67aada24d10f2ac30685c2d7606fd6bce5df369a0d176fe32b0e0e8cbf583b0e2019167640fa63c23d7223259441152b0c79d9b2012725b6eac08ba8438cb90309123abe5980b6ce6889d6b7d1c756aa7a90181a1422f5a6f803b1e772891a61ca657175f7b815cb3549d3ee613deb001c7ba200730b2771b5743d80ee48683d94015ac7221671a3a711468f8b3be5ecbc1af824dfbbacf87972874e847b399280eb649304a3687f43dfd769e13a4964892b5e635c0a2216273331da5c5b18ec0b406ab1163d4179af5aac5fc8273296e2433c8fd993f9340c5d365070cb72715188b52cc0426146c54a3687f6a57f36b0b1dd639c505bef4c71fadc68d62009bc6b27b3817660df31faad06e86b91aad252b80461200168290848f963010511763f8614f202a3a05680831b8bde86a18dd79248d46c144730bc7b4757ac95f34ba2cf0436bda09cf5a9285e7c924f3b514695300c33cc6d92c280ff81e72b549694aa7aedb46afd394a2d5826e657897fc53285905406430c2b7786e64ba44225985f95146947535aae744a3b3707467701a8bbd99b938f2fc7737f22bcb9f146983a07f +private_key: f8108802536a5e0b192cd8a761c1163c02bf2c457bf4162799884650185cd6e7a978c74516e85541b212b90321a0014615a973226b927046cc24e709e988562964213a874ed5007d8c483336d80b2338313606c716a25d7fc8617a506899187ed9a73d835997de71904ff82fc4c59b12275677b90fb6c079ca872866483ebe326e33f369006b4341bccc759b6565816c8bfb3d00e11bfd7b2de14b9bdf163bba82852ee76037795df78b9a2182c883652e17621055397c6b7848b3a8365467669ecb1ab81a8747fa449f22aad5db231873bc4c40a45ea265fe45c9f8f43dcde1ab1573bf0716139549490acc91affc45aa816809d53879678d90132ff321b2c2f32892ea9e4a112258f8236623a701a453fcba1d26c3aeb37c50b72625887b5cd9eac2cae774783abebdaba500eb9445739eee33114852a841447fa19cc360e31c95012227aa11e35412c2b5716d7602cd07a5b48b35dfea154e6780f8573203d367bc9627f414879251738e3b8cb2e3c09956c798144fd6c9249b214cf25ab84ab0c7d0b03728b7847c485663470c41d59b76fc48f959199305d05117cea0e04c0c2c056ae740fd21c0cad76e70f55ed7a62bfd440a2b5601242837cc6205196971a5993dee6b51f399ae1ba47334985ca1e26245897ce954a7f393105e75cfa25302f17b45e04059803bae94251d9f51530012ba052cc8948463e48367dccc5842354e7fd7596122b56b6604fec0c58db228a2170cd64a2be9757d8be35c1a0975cc1267d789c774883de06bbd6572129b57a5e185195cf06bd70352574c68a4b71d2ef5580b57166c3746ec058302ba3da6f916f1ba4b572a82e289593dd57277c0c570c22d1cdab6aae39b16a68f5684a5e367c713e649ae802776f6c3488b494cbab596f73b1908ceb7c05c46304f4e26a54b388b61aa3c663a316314405049c67accb2a7ab62140915a09488627b3c3683c3aa198400fb6a53396f978b71189b7c4fb1ca005a79727c5e6d129af7220705222617807460948b33197ea35a091ce9ab5a2b9437f961b70c432b360be118a4b589c66af374f58668e7515b029a14a272ae4af399552796a4ea3a8d37c265b42e38c2c586792d6be661c9c4753d373004da166f69368f976bf1016550013388b562b43a00f801b2a77212237b5cf53c647714218b94343c0b06d3fcbe446514289a3bbab9a3678284ae46242d1b56bb0845b30817c669cbdda709576b91072aa38ae0a6cfe444c09239d189cac861667cd6449c0ba8a773c7106c6b8bb40b100b39a562823d33a180da2bec923d1e707d59d7a8e397c68029b93428bca352495966a79c299e531b9b59b437e86398b72157fa43391299770b7ab37c71b387401b5ed5ce81b88a26a7a9dc023635c932c26199b5c437536ab194074d1cb24f65285af6b03f6a9a7174a380ad03c6826ba5fb32c6e93c2fe011a0146717e8265b31659a806975bd589f7630461bd1b6c51a0a2cb6ad3f825c919533c24c807a9c6e3c780d0e333105b43044d7931920621874395f794483820afb55483e34abf3f0440f3253fc702e71e34270d38e4875cb9a6090dbbc53352128c18a948ee821e49bc9c690563a92728b610a38724d9a8308ac6b70d1c87bfeb07775d56703980c9a563040d1ba17297b1f253afc339ddc11a42cbb051ba2722854cbf45bb80cecaa81ab63ce32acfe953f9ac8648b95be8668822060bafbc10b59e72944185a57f790351a20de6679328169b954465f8cc028558328f3baeca98e42404299719d205cb17c745a7784b97c09130e26376778a9330c99ed84288ec3955df4076d0c9f5847af05bc58352c1364f34b0213a3cd05b2d79108af038e457a30bb5626b1dc404605678ac675201c537a8a6ad67a8e3e0b17a0e8632ca1714dd341831b2790591c1f39c530288dc8448527fa542d64192e407f2304747ca7cad98986c59622b2e63e076420916635a538871aba5469f36a5536356d176265191fc150a4dc7349f07c932c053ef4b6bd245448ba8173ca0896e51092e06537d2157b0c1624d3a29eb0d055d48a038c858e53c1045c392d6f59408df2bb19b35a87737ef90b9fdcc380af6a1ea122838c673e39f502a08908ac33276b4297c712b3c7541c7806c71dc76e9291c89cfac3a56c9c94852ec4a47bf6642349b95f69c43005fbc927113288caa2cdd6175b2a627149027e3688b436c336b51c8539cec3c5537de5ca6955543f984c73005181e916317262bd638e249cc928e048a20045907b79c441cfebf0b9106c8847b8088b4c41fe6b7356d7947ae9a9549305c9278e6e3a39060854b88b65cf9a20266218864c94377a475c0822d454ad8fb42c50a13f1be65dce1728388a8d4a81b372a1486a86b0e6d1abd445559dd3b827b834e2ab3744c0c5abc51bcb7551cc888de7f590ef780d7cc94225830732f47b6ab4777261944cbb3e6d943eab827da40a7b00d8960db1810d028529449dde0c00eacbaa321c14249b7113ba43968b79070b9117dbab36b44f05022bf25a9ec77c7a396415c7f24ce5e364b09a16308472e1d49ce92a41d3b868e4664e93279467745b9e04c39bd67cf0226d198110e6235a3a35af970a73a3472027e1c7368c867d23cbc1895790f2478f807b756516acc4c7dae3a350f26a0353930f4c23c3d982fb90176bc70e0e6b739fb67aada24d10f2ac30685c2d7606fd6bce5df369a0d176fe32b0e0e8cbf583b0e2019167640fa63c23d7223259441152b0c79d9b2012725b6eac08ba8438cb90309123abe5980b6ce6889d6b7d1c756aa7a90181a1422f5a6f803b1e772891a61ca657175f7b815cb3549d3ee613deb001c7ba200730b2771b5743d80ee48683d94015ac7221671a3a711468f8b3be5ecbc1af824dfbbacf87972874e847b399280eb649304a3687f43dfd769e13a4964892b5e635c0a2216273331da5c5b18ec0b406ab1163d4179af5aac5fc8273296e2433c8fd993f9340c5d365070cb72715188b52cc0426146c54a3687f6a57f36b0b1dd639c505bef4c71fadc68d62009bc6b27b3817660df31faad06e86b91aad252b80461200168290848f963010511763f8614f202a3a05680831b8bde86a18dd79248d46c144730bc7b4757ac95f34ba2cf0436bda09cf5a9285e7c924f3b514695300c33cc6d92c280ff81e72b549694aa7aedb46afd394a2d5826e657897fc53285905406430c2b7786e64ba44225985f95146947535aae744a3b3707467701a8bbd99b938f2fc7737f22bcb9f146983a07f72c30933b8e50425fefbf58d711f58cbf9fd8ebd2835a1b55469a2a1b993eacecd292e4c5f9e1a55e0489bceffb204d672a6215f4f3980a646d9f880817c52dd + +# Official test vector 43, seed: "49e1855588b6235df2a400c4a70aedf8ab17b6e5e2891aa745f132fa2e7ab0c8117c1df37c39f5d57624eb77c2b4a091" +seed: e1953800acaa85ac02a906c72cb8e8d704e8d27820345f88f71e89c1f549afcc8c64c049c6dfc0f1476cffd520b055756162f7ec94243de6b14ac0b9e5fb366c +public_key: be19be36c8ccda4c9852a442d4259905628087c232f28871b05512dcd2b769179ad09a9313252dca243d73b387b279a1ca1151fda2781ab7757d2ca5c64052c8440bdd93acb5152203987bd5a693453957504242b3f8667d3c800e9a969372a13fd014715a0bff3a24c8f31a69c329a1c30ef37ca29903ce0943982413b0ba694ed53cb416f125151c8f036709aa2174ec365a56d608a2b54ec71183e2b4258e71adc09c81fe05065be2bd972979eef093cda03bbb82b6ee4180731c18fa997195d4917476427d7c07d99b663c4b50a9cbccb3c364df354685273b8b42b9e118a427c765b08036350a330be79b3ef4171b953faee56f719483717854b29aa3385545d3c9cd71b0a070aa2734f8327c095aff6b342584a570371ee7ca3f6a2a2bbda60c4e3aa264078b6c9bb206781f229b9a5cc2bba0c8933d01b469b4c687f5a1749513bfa3401cf1443ec0558c89c58cb795e3686640f6350420bed4b839ebc8106ff7043107c590c0bfb753c0aa2305e4920d1f639c3ed400a2836d3b638051b58ea9580390ab57dd7138421709759b89aab4279c5a9768cabfc44ca6a2f1cf5c039e2b0563a9048931f1565d164c13ab60e4c92ac843451cb75662ca03c47a652445b7ef0b8e622187387059a614cb08796d34758133050161743677594d51d02f290b3cd7f23d4cba1a64377baa36082249ad896990d79aa040a7858f1b3dfcb43adf040f1b245d216b2e23420e0b9613e9db6c7535063d05079c739f70759f7de0291537aaf5d6b3f4b6291c147855ea9a79ecb0ad80714520971011365dca81ab5bc0d9d70ade36a125ab2295858b79370fe21932504b9d583c787bf28762241a279663baa450172651f126bb20b85349b6344ad404e3093369569148a2a8cb7b7e08e68fda3408349b4761a171b0c2c85b37227cfa3d7c16a3950298c100955402919d14a71e7b231d60ac11e81a46515cf2f25fde507c0df59b352187af7059f3620026c84469610d0098895a3330f7638082d5b5a925afca637a1d160ecd2c83fc522a3bf40591fa5ecfbaa0a3b1859fc58b1d157c18b71d540b6aa398179bd65dc00866275cb0473964ffe5a8c638bf57304d32e24007b3c61429881ccb1a0403566bf3c46d8a19e852aac6f58d4ae32f45cc7b0f5181f18675920680c2c0ba8ed283fdf20c383bc08ccb7d46eb85204126be034374769caf39ae633924bc8ba6b7b89daf72ac4a86bf86008c02fa0fb18a5de6f8952eda2526fb1d994b4165149ed11b578359a7b9d0bdd7257a2d00b676268a38528fe34140eb408ed5b916c0c43d79ac29b0946702341cd7c20ee23c16a6b2cfd1f9107872b8965952a9a45e0e435c56695c819b71b9a6b6796553271c029d06cdb0308112a89ab4b714566a4b18d03c18d223fb6427c7b3144e64874c26a8ca418cd6f14e4cec2a0402698aa1af6ef63264806e4b42ad3dea298a404c1ec260935166418068edb71abec21040f9b3eff4389358b7cce70461ec8c0ae8873a45504e8688e266787421343699089fc31f84ec95a9f2264eb3ceda71261ca791d052a43808ba1f4706717a10fc4ac21b625fd324cd86ab8b3dc254da31bac0f9106028258adca5f754b309a6c7dd30e11b8701ef37e8715f03c0d8a32e9fa39d37e7637ba00940 +private_key: 257c04ec995fb9757415bac737300b03c991bc8a5c4be86cb0458f66a551cea67fde748c88113c07f09e2ea03efc14328381b21220741c12c1cdf9a81d3a28e9b7b4bcc88d0f38a700dab5beec59d6073ad85697d14728603b1190a81151061f3159293cb2096c093d72f33b1957cccf7085ab031f0e404b1c1bbd06831a9574b90db6025fca778d68151edc4bfcc11292f240d9e6226739036cf000dcd1b275d12316e605c72a2fccc55887220ec958412493c8aa4759dd0848ea0271c55bbbbd178642331e8c910a932a5a8d0a3479153a480c9b0ac58b10334c6b186b38526546eb31a0186e622520b2b60dcd00345222948cc833170427a301a26e920ccc6a71b979b7f8a02f86e983f1eb1b2aca4202100260a94b847ccedd8101e1b16041f96d72b8cec772c08bf5a75c5190f78b123e943e1693169eb726771a7c2826351b5a05a803134c24b72deb2a6f282b94689ee47bb47102926849821981322a03915086670896152a022036351a046bbb6d178bc7605f92254cb8ab2e24544650da4e29fc0ae9abbf0b2296d6bc7e99b4c1f9d50fe7fc7a130432bf98b28e142cb1924efe5324bdd2887a9a7b6a1c18dce15b5b127f17b5739b5c5e33e63fb2494fe403cbf9c2059618ab6fea5b1d78c4d0438fe94c447a4a2e42d974a44890db571ddfc288528b683a363a93a56eb6c9b1da246f64f0b0d3d6c38b4975f6ac2adb2c62a9d208812c0365f3a2aa39ac575595fddaae5ef5c7f7fa49d8b209784aa25c7166c92759f58421eb203a1e8291604c84d24565dc68ca7b183f78fb5a6869115bc7b7b1b33bf4e4afdac9af6dc0604070300f7273223aab0fd85401b923d6c6180c815853994ac22bc45e5b7961a176811780af4b0bd84a490a0a3ce1062204c535c9932be4137a7b6a1ff75579e72b75eccb806b67419119721fd03e59713920949e8f6b5bb278b7dfd40f1125ace9336b5bd5b46f5952d4fa0b780a875b87bbb8ba2096d940555c69e45602975b1324875e891c6c326539052c811ffc4417bc61205b430b522a1a7b4df509a4e2c9bb5a595333f29b986c113f57a9e0d91af791c8096c0330cb59c27b3b29c15b13128b86336cb0c270dbd80d451b08cfe35876594ac4011b621792458042e8906deba57ab57b9565344e2af27d87a68108a8487a817ab5c779683cb81b7bb258e598047505ee98c7d666766110256eac0694b3565b07124786966ca81f1ea5a8be616544d54f03c5bec6d81b392a723bb1176d94c75b47cd8a00aaa7836e1774824289803df38c0f6c74b4c42660d1b27e5036c647bf4089b3be19a76dd8ca518307ca92b3303253dbd9765bd26635f3bca865c215723c20358f2b4c487b008a7f0221359889dbac532deb2b38ec8f35a4a6af306597f09e1f84b808140dc31a36b1db11b13c23edc79ae5f1861dbc4eba427a62b153f721a543224caf3c54e15467057cbda9b1ae41fac0ca7658a542a87060a960d57f839712aa497f0ee03a9122315409279cc89fc6f5afaf72497f99ca8f3a18da1b7221321c87713bd484612204783117aa4f2219a9019c251c8f92d8bdb946b42068207ac04e0ea116a9d2cebb25391415630db5300bf51bbe19be36c8ccda4c9852a442d4259905628087c232f28871b05512dcd2b769179ad09a9313252dca243d73b387b279a1ca1151fda2781ab7757d2ca5c64052c8440bdd93acb5152203987bd5a693453957504242b3f8667d3c800e9a969372a13fd014715a0bff3a24c8f31a69c329a1c30ef37ca29903ce0943982413b0ba694ed53cb416f125151c8f036709aa2174ec365a56d608a2b54ec71183e2b4258e71adc09c81fe05065be2bd972979eef093cda03bbb82b6ee4180731c18fa997195d4917476427d7c07d99b663c4b50a9cbccb3c364df354685273b8b42b9e118a427c765b08036350a330be79b3ef4171b953faee56f719483717854b29aa3385545d3c9cd71b0a070aa2734f8327c095aff6b342584a570371ee7ca3f6a2a2bbda60c4e3aa264078b6c9bb206781f229b9a5cc2bba0c8933d01b469b4c687f5a1749513bfa3401cf1443ec0558c89c58cb795e3686640f6350420bed4b839ebc8106ff7043107c590c0bfb753c0aa2305e4920d1f639c3ed400a2836d3b638051b58ea9580390ab57dd7138421709759b89aab4279c5a9768cabfc44ca6a2f1cf5c039e2b0563a9048931f1565d164c13ab60e4c92ac843451cb75662ca03c47a652445b7ef0b8e622187387059a614cb08796d34758133050161743677594d51d02f290b3cd7f23d4cba1a64377baa36082249ad896990d79aa040a7858f1b3dfcb43adf040f1b245d216b2e23420e0b9613e9db6c7535063d05079c739f70759f7de0291537aaf5d6b3f4b6291c147855ea9a79ecb0ad80714520971011365dca81ab5bc0d9d70ade36a125ab2295858b79370fe21932504b9d583c787bf28762241a279663baa450172651f126bb20b85349b6344ad404e3093369569148a2a8cb7b7e08e68fda3408349b4761a171b0c2c85b37227cfa3d7c16a3950298c100955402919d14a71e7b231d60ac11e81a46515cf2f25fde507c0df59b352187af7059f3620026c84469610d0098895a3330f7638082d5b5a925afca637a1d160ecd2c83fc522a3bf40591fa5ecfbaa0a3b1859fc58b1d157c18b71d540b6aa398179bd65dc00866275cb0473964ffe5a8c638bf57304d32e24007b3c61429881ccb1a0403566bf3c46d8a19e852aac6f58d4ae32f45cc7b0f5181f18675920680c2c0ba8ed283fdf20c383bc08ccb7d46eb85204126be034374769caf39ae633924bc8ba6b7b89daf72ac4a86bf86008c02fa0fb18a5de6f8952eda2526fb1d994b4165149ed11b578359a7b9d0bdd7257a2d00b676268a38528fe34140eb408ed5b916c0c43d79ac29b0946702341cd7c20ee23c16a6b2cfd1f9107872b8965952a9a45e0e435c56695c819b71b9a6b6796553271c029d06cdb0308112a89ab4b714566a4b18d03c18d223fb6427c7b3144e64874c26a8ca418cd6f14e4cec2a0402698aa1af6ef63264806e4b42ad3dea298a404c1ec260935166418068edb71abec21040f9b3eff4389358b7cce70461ec8c0ae8873a45504e8688e266787421343699089fc31f84ec95a9f2264eb3ceda71261ca791d052a43808ba1f4706717a10fc4ac21b625fd324cd86ab8b3dc254da31bac0f9106028258adca5f754b309a6c7dd30e11b8701ef37e8715f03c0d8a32e9fa39d37e7637ba00940bce58a5d05a4840f835b8ce39703f77bb31f20b9ee4fd3795c2e326244208b288c64c049c6dfc0f1476cffd520b055756162f7ec94243de6b14ac0b9e5fb366c + +# Official test vector 44, seed: "df0e41d2f6f86c1f79d31fd5878e7ab434fc0af3a0d5f47d2ab3fef31a42bd949b0e3629df9f575befbb62e829e51dae" +seed: c719f9b2d16399b7326ce4eca30dabefe8fdaab18e9f6df888b0a134ef355570e40771856eb77e4633504899fcb86c6a3d433d0b8d60e26f07bd61f1d4ed69bd +public_key: 8afa99db2599004da53ea126e94c903605aee44b3d56abab69438320c91918abbb1ea2b6953753e475bc33c159c590bed80760731565279c640d361de46aae78d0a837912c66c5a347c0946f6943866750c6ac1eee713cb8636e543b2f8a08857d53834233603391417a23c88b6003246a0c8ff39edfc7ab8759207dcb7c1d923ad891c31ef564e5f53c0447a25728c934303bec26875c44a26aa36e0324ca6423855bf2ca04e27cb8f42329a3a0e28a7285658fe1748a58c538ddb710c6d7839b573b30a5c4486a448dc0bab7c07b86279058578d4a56c781752e8ab270914534c51923a6d0c226967313695987314975dc7c7a101578f326d02a086513b2608a8b58ea5a63f2c6a1cbbdc847c312f5a2309c1749c349101a42757073224b0aca598a6a72cb308a010c327afac94798f8b4c6a1279389c12d1c3015b02e37a95705d3b2b8277c2c141bc8148c94244ec5c50e65790fd6e0842185a5f2ac1e72a21d4d652a63001c650b6c8d06cd758923d42479cba96d7eb396803c77be54c831063707a35067b87b2876a1a0844d11e1a895db70d596871fd1434798771b487aed562ee1d041c06505786205166812fa718424708a207cb4a6c25ee78b8b85e869bb82a89f647a813b97dc1abfb22b430d37adcb43b7bb1616dae73b0d606940e5af7d139f73b48b4618bfd5c22274d3a27c20195794344eac73b9a09de5cc4e59a2853a412eed7062dad16b0e1aaeef83221d34b3225868da033822248e5e40a692c20ae4cb112b9c4f9e373d6dc3393f385b5f65c7f14b66d7d0b31dd7902af39812d76d5ce73ebfa4c392b069be694bbfcc7b9c0825d158b431898c9cc9080d632196378049a5a02b43cf83d37e4a731505f23009661070038917a93c452004a8023b1da44b4e5cc53adcaea033c8759a3bb4bb52761191d76c95599a9dc2a2292bf37aa3803278726b660233e9b476748a31f9fb9f2d93b59b9cab33356782a976e05b083716262278349fb14b806a7cd3e52c1a6a6f603468c4b420cd544bfa916d157a21d15c1945b31f7c6285c30529ddf735350c92c546ca776cb44360cd62f05620f8b23b94a0a720270f122b0f22316050b7cf6623cc0658a9146861785c03fc4e0833c3565ca4ebc951f5145e2e434555d45c3819ccc4c2546673c18d70af49f0aeaceb83041556d52754c10b1d66b9c0519985e9b0aed559074743c8796881e5a189a4707b8923097669b2d9a162dcda33c3b825e004aa20b1749eb198299476bf45a519d341e9b507b1e411bd5382a6a84b6dc9c1bb437e98546074076ea76654ca6519f7a71d1f39c5328b16a5b182bed6b57ae058c3201554d612628274bff57755022b7e653dbb461958ca3eefa117b57299245a9917158f2409384a7b234ab390152b01d1383aad99747258c61bd24f7b12a0332c6d7b5ace324b4e1dd9b3f8574b17382bf387155f0abaf4fc8830b7774275821e91a939da83c9c189ec08774c739fff041d40d512b171c2d0ec7e404349bf5a64a876aaaf72c9c16a004578842bfbb6ff221debdb6ffc8a6de429ca0d7aa50071bc8d68c23c379364e56e4ac247a99523f8d90b3de4b049b526f8961621b98dc534b9a756aa9c4a1b2b4c7726e701ba03d885a39d59a76d92bba31013f2a4714ea384 +private_key: 8b814f850315f33901f955a7dcd2971bb73d44db90b874804457124002ba681347b4dc33910ba22a903f480859275523598a1ff7cb818f8cba2ed0668edc45f1997f3e76628767b63890c35d334f209b62a208700820c7a41689a4c81208b05573361dd30642baea86f25bbc87d1157f05368582aac0958e87fc84c431bb2eda3c479a9cf0984a90e668427046f2946e50a43e3889aab5d649b5a17242aa6d6350a1b72b971a748cd2a0a6cababd4f77b6fe905ef270bf222c1b5c2683165b9c87458f849405aca37dc8e99699128ebc6317274993d74c77cee907e536b1a1871d1f8a3505670cdab00080db31cd0ba9269c84d9ea565d194e22d3c11573685b166f02245efde45f04ca2d851aaacf47c711a536aa1855b7693161f27e51eb52cbc1b6322537868386715b16c4802d2fb43e9ee7c28c51a5fbbc1fddf670e02cc3e24bcf75389651268e4c78949e284fe9a2a0fd3428875c7d4ba669e1f7116eac952640b9966626a867348022709cb54b05704c136b5538ac7c6e018107a27b1040211562cb1183714a2c9a634a8bd547965fa04fb62441cf7601393293f669420dd0a04d18af0c0249a3b57e0905758b7073db3c80e2634366285a86d6aa7fa8561fd4a6ed745aa04872fa7ba732c514bf045445cc4455accc40e499f71a2d3a8ac73be9404f3736908745b1c40985e4920edbaa2bb8933053124c4c300f7302fa634e6c6830b3671fea4965d58aa5c653682e88ba5ab34361409f4c1656f1772643f71134ba1b1471192de503f97868e43a4d4e9a2bb2ec38ecfa1835f24b3ff1b850fb5f4de32f196377503c25ca0989703b72d72494a2217276c9a15b600bd4dc76585774b2512da602553807aeffc5c6e8f0187bf5613d35857e7b4a1a4b805946224b4a8989c0bd4fd445cf64910194ae3ac96cd0e22144b9ac51fab7ef671b6af68d7f5c2a3b48b82fb2cb49722cb5b668ad021240871307b185b6426451588626850080d68a917b2fc3720dfb33c365934ef37bb5e7359a6008ad72d255b4e921c6b1926b917cc00c03a286b8489a53b5a7429e1cbfc42507f33bbb5ce082b58cc550e03a41b9cca243506de21f3946019dc87683b35caca42fe8272861b4633044773e5c399f8c6423922d05c528af950b6f6b0445d98c5243c932451303222e8a8a55039b34c2bc643582871236553f96b80c9041400682f05c6795b64160006359270c4526baca74b515b224ab234a6b127c4612acbf82bd540226927675f5423cce59034f4596276647c6c8c3d53b54014b6596fcceb0c29609b50e1d599bc728a41db0c3e2a6c41ebc956fec70d2b58866c3c2665ab98b153052d917ebd9ba3ed037f62c8299a02f575742d7102fdaccce7759763ad2147df656ad878ceb1b7ad5b4cd3ee0a2320727a1051d74f84477ab5c2463cce42295f656978b470708a4a26f21949635a957e12bbcc9c8c83753ccd6781474b067099425c705d78631e69632dc5909deac940398b8a6918e2f69587a5992b354b54b7931d0b4c0eef60c61b46170699035ea014778a28d8a224196beffe96c06303e5f8ba659d0229df3b5ff445cc7019e8b54b4f4346c7107b651d0277d8a195c59ae8afa99db2599004da53ea126e94c903605aee44b3d56abab69438320c91918abbb1ea2b6953753e475bc33c159c590bed80760731565279c640d361de46aae78d0a837912c66c5a347c0946f6943866750c6ac1eee713cb8636e543b2f8a08857d53834233603391417a23c88b6003246a0c8ff39edfc7ab8759207dcb7c1d923ad891c31ef564e5f53c0447a25728c934303bec26875c44a26aa36e0324ca6423855bf2ca04e27cb8f42329a3a0e28a7285658fe1748a58c538ddb710c6d7839b573b30a5c4486a448dc0bab7c07b86279058578d4a56c781752e8ab270914534c51923a6d0c226967313695987314975dc7c7a101578f326d02a086513b2608a8b58ea5a63f2c6a1cbbdc847c312f5a2309c1749c349101a42757073224b0aca598a6a72cb308a010c327afac94798f8b4c6a1279389c12d1c3015b02e37a95705d3b2b8277c2c141bc8148c94244ec5c50e65790fd6e0842185a5f2ac1e72a21d4d652a63001c650b6c8d06cd758923d42479cba96d7eb396803c77be54c831063707a35067b87b2876a1a0844d11e1a895db70d596871fd1434798771b487aed562ee1d041c06505786205166812fa718424708a207cb4a6c25ee78b8b85e869bb82a89f647a813b97dc1abfb22b430d37adcb43b7bb1616dae73b0d606940e5af7d139f73b48b4618bfd5c22274d3a27c20195794344eac73b9a09de5cc4e59a2853a412eed7062dad16b0e1aaeef83221d34b3225868da033822248e5e40a692c20ae4cb112b9c4f9e373d6dc3393f385b5f65c7f14b66d7d0b31dd7902af39812d76d5ce73ebfa4c392b069be694bbfcc7b9c0825d158b431898c9cc9080d632196378049a5a02b43cf83d37e4a731505f23009661070038917a93c452004a8023b1da44b4e5cc53adcaea033c8759a3bb4bb52761191d76c95599a9dc2a2292bf37aa3803278726b660233e9b476748a31f9fb9f2d93b59b9cab33356782a976e05b083716262278349fb14b806a7cd3e52c1a6a6f603468c4b420cd544bfa916d157a21d15c1945b31f7c6285c30529ddf735350c92c546ca776cb44360cd62f05620f8b23b94a0a720270f122b0f22316050b7cf6623cc0658a9146861785c03fc4e0833c3565ca4ebc951f5145e2e434555d45c3819ccc4c2546673c18d70af49f0aeaceb83041556d52754c10b1d66b9c0519985e9b0aed559074743c8796881e5a189a4707b8923097669b2d9a162dcda33c3b825e004aa20b1749eb198299476bf45a519d341e9b507b1e411bd5382a6a84b6dc9c1bb437e98546074076ea76654ca6519f7a71d1f39c5328b16a5b182bed6b57ae058c3201554d612628274bff57755022b7e653dbb461958ca3eefa117b57299245a9917158f2409384a7b234ab390152b01d1383aad99747258c61bd24f7b12a0332c6d7b5ace324b4e1dd9b3f8574b17382bf387155f0abaf4fc8830b7774275821e91a939da83c9c189ec08774c739fff041d40d512b171c2d0ec7e404349bf5a64a876aaaf72c9c16a004578842bfbb6ff221debdb6ffc8a6de429ca0d7aa50071bc8d68c23c379364e56e4ac247a99523f8d90b3de4b049b526f8961621b98dc534b9a756aa9c4a1b2b4c7726e701ba03d885a39d59a76d92bba31013f2a4714ea3840293675aaefa1219f8794d114bbb004463f9c631729734cb430f26f38886537ee40771856eb77e4633504899fcb86c6a3d433d0b8d60e26f07bd61f1d4ed69bd + +# Official test vector 45, seed: "d3c9ebba6eb03ccb5c9b9d2c8d7f0cfbbf50841e24396cddf0e56525b38918c2fbe6c34cc1b93f7bcd4f4d5777e1a488" +seed: e9acbb774be970206c3a738e243b420805a509fa59fa902044be2f0d013650d2ded5edaec5de3bf5b4d7c2f2e18e87f499c1968993eff196753db8045e2c8ba8 +public_key: a7c9ccf796828b704efbb194d5d895cec082f5dccb78b59a61090eada66093c84267079597c9881dfb2ca8fa4cee6682c4375eee25a08bc0766eda05bedb2cabf734c4243987012a44e86cc013b7e555bd15d45306479a78ea7d4fd7723d3b074860914e24395b264d35e57867f0229912c6ad0238587355b44c155bf7b5e5c872afeb136bbc32b1a950b3122f3a5b71d8c140940b1ee62a5543f3b61719896499721f5466f7b57b119568c960a3796bbf2c8877cf8a762d6a8852619abcfb85ec7c6e79652311490b03f61bb18a23fa100fee70a0fc693163b28ebd6505773324404341e6c79b0562207ec1077cbb64053a4447866efb1894a6a544daf283474c6e0e99323f962b5cf4667640af8351059ab42e0925431d864339258752a3b08ad52f985520a1247af44366f3377d5875589ea9a8e38455a3bb5ffc29083664cda47988f4f0c59622454a7109a6722a77703b0a69a4db2ac154d53a6bd60603e9be794b0b1b0b88da57a64802ac771134b1a4776d07703db8746e610331ec3ad3926891c05b4b738d3564b79b59287174696d119717d3650aab049b401466467ec352102ce597f6e867726543067acf511975828799f920bf139c176fea838144797e79441af218d9c2c0f15a350ef82d588b45b86a2c58464239c121ed2a7650d2841eb21dd6547bd32c0e4d654a3823c4051609ed49220c2651deb6b0e55a00d261caebfa9c17d82d5f23a111c391d06c0441102c2745875d6905ae21412c2c14ae51c5609c5872828ca8d09239b82abd602005cc66ddeab736db3cc0e946d6232177e6c012a8672bd62d0a4253dbb5a908c42341503b76d428a0c38f7e978d4fd2532d075c08d9cb3a440018b323dc3ac28bf8875e412745962e512c0e0e81b4919a813766bb020c831ce0c3eea5a496e57e8d598d3bb34733b6358cda44b1960e8890ce525578d100257ed8a916a02fa2d8b59478966835c0603a8f48715ab2544d0fc487a7eba7a96a6e3918b9c9cac54c841c2899cea0312b40f9bd93eb7d392a4cb889144c224a23244067a9712ed9cf52a15edc35895c7c121822468716704e3617ccd59aeff5120524495d44ae3019adf7d25bd7871b2a98a17ab6c68c789174a28a4863ad69362fc5982aa68b3c0cf35fd2d63d064556e55b6df0d636dc5ca56a928f19c61816349c6339c59febb2b8675807a6a9181a91620a684dba5c4c596a821b66014851966547d60690f7a805bccc4bf9620c188495795c3dad55c8e7529fedc92ee3192a68bb9250420f6ff04f939c82c8442350d40f9d518c10c53ed5c3539e373d0f955d3d451e7873a22af2aa87c08105c044613334e6b585aa864795e0a6af988affb2b2eae653be5c76383b66f5205e1df2b557b66b0f9b7063d3039510ad13a9b5ae6bbae433808db7275271917d75524eb2203202c1f0b4c9afb402f5798214c28667d28727f89b95d3294cf38c129a792b16161e6b9eca60c18ed802c72225d585c7f59059dfd74944f764035c073119395478651f88352c204f89222bfff7c8bedcbb6be1728ef74e54435b40b22276f1199ef34673ebc70047956a543f3d8569f334a5fb22b4c2bc34aa9a4b27a11795a730eb96003ed4662f2f0344da2b88e634672fe48e40ec83f4ae731342e77cdf4a3a +private_key: 05e74ae857ac16003fd911741a1323a9621de488789eb612908928e0435aac49ce2097cd03ebce2c8c0aa232b19bc64e81d38750395af4499de139be5d8a4152b66a56067cd9a372c667ac143151676399b516377daba3bcf2a846074786f934c8c091921353779b91c1a201cc293a83e11bac68c3e68350a90c13d65628f379c1e181a8a9783b897102be367cd21629d198c39686c02339cb92278ad1d17ce563797e9b4215ca88a37a9379ac6ccc523cd94049225b900ce145950cce099700672300ba71b22b7a1a01d30ae26975fc53795d2b49a1620a80d0076ca983c0b8b87e96399fd6869aea85d35159d5a9872242515d230ae0965d5ed31cca22a35b33c5810ac4737481b2448f324b7c208387ac045c0b7c9b25a678526857c34a7748c443ced32bd4b7a2155ab7d67297c67080f507ae2309b66800728d661472692ac22063f3886e111a5176387fa410422bf571c79a4d8b764abbbb56ef845ceec23c8381671009c1e983465e090ecac84d3e7b567ca59e5af8477ea89dba3784308c680033c3ee65b670aa43fc6932dd9692dbc8839bd94c89e85e20b2b9ff015ef85a2c9dd7208db5815e73a4ed469d38a967ba42b2ced1c959e400aaa10957010a23fb7e086b82b1e1309b64977a77b9f6bc15c92149e3587c9bc5435d4a50a62c90dfbbc339b3467795bd3e125bcc6cc83b797d4d7a6e8701953a57cec99b8c7939697bcc488f0b6601dc2f31ebca4b15059f12962e153a164076a9f6ae88cb737b8ac4f5eca0fa8b3bc9d03f7b578c8de160daea49a0211c7b007a37cac38ee02d07aa48e355cbfc43a540d9096dbc5504949239cc0b82d94755c4ca182852d56b9b9819c42b6c22f3246cd4a879662cc901e4904ef791fb34c7423a23876204618276e45cc8893b15f5277b67c391177889d8868a8c14949b684467094a9e2566bdc58b00b339e3b91fb54b63e1f43dc57a7f107cc988cc1d65e456b85325fec11db5a7c947fb1d82631fecfa57dff3a1de5ba8bd0a5c2004cddf442699c4acab590730c8aebd853a51a8ccd68839f1ac397ac4a9b6f54316537bdb99879596bbd2f517b296906345a2517318b4146d4afbb7e1c1bf377337c6b84d3363b49a7a8937cb58db3524a2525f2f2984598797b835a41961b99bab237077a5b6dacdb161c86b19469e4b99c5b552c63c3f3fe3140770c369c49e6f696f11639d625647b3fb9a38a0cbfbc01231c2206975c0c7b931597881af2cc267da7f5a320eb4408df9e39d15a7558429390048331c2109d2c46ab7d16b0412c1ba8b6b1f9b58a47c3d54564e70440eeb43c80abc8d67792324287b3db329329267f53549b6a72d94d9bbb2a02b7c985ae8f4a5c39218cda99f6d461bd27723bb20af88446ea65a7b85c074cee48feeb881ddf9773c5c6740a178e1707c50788478d3500f6aac22b0be3ed5ad240a9a336378af185dc1519c0948cbba81790da7929ecb464406cf618cc019a84868745591496ca38ac57dc5010ba815b24507ace51edee75dcba3877179c4cec474101395d9f831241c2547487636d39f1c6082041ba679b7a1b1d5bd0b295eb137ab4b210d0149b4fb0c8df5515ca6d7a67393a9f5b57aa7c9ccf796828b704efbb194d5d895cec082f5dccb78b59a61090eada66093c84267079597c9881dfb2ca8fa4cee6682c4375eee25a08bc0766eda05bedb2cabf734c4243987012a44e86cc013b7e555bd15d45306479a78ea7d4fd7723d3b074860914e24395b264d35e57867f0229912c6ad0238587355b44c155bf7b5e5c872afeb136bbc32b1a950b3122f3a5b71d8c140940b1ee62a5543f3b61719896499721f5466f7b57b119568c960a3796bbf2c8877cf8a762d6a8852619abcfb85ec7c6e79652311490b03f61bb18a23fa100fee70a0fc693163b28ebd6505773324404341e6c79b0562207ec1077cbb64053a4447866efb1894a6a544daf283474c6e0e99323f962b5cf4667640af8351059ab42e0925431d864339258752a3b08ad52f985520a1247af44366f3377d5875589ea9a8e38455a3bb5ffc29083664cda47988f4f0c59622454a7109a6722a77703b0a69a4db2ac154d53a6bd60603e9be794b0b1b0b88da57a64802ac771134b1a4776d07703db8746e610331ec3ad3926891c05b4b738d3564b79b59287174696d119717d3650aab049b401466467ec352102ce597f6e867726543067acf511975828799f920bf139c176fea838144797e79441af218d9c2c0f15a350ef82d588b45b86a2c58464239c121ed2a7650d2841eb21dd6547bd32c0e4d654a3823c4051609ed49220c2651deb6b0e55a00d261caebfa9c17d82d5f23a111c391d06c0441102c2745875d6905ae21412c2c14ae51c5609c5872828ca8d09239b82abd602005cc66ddeab736db3cc0e946d6232177e6c012a8672bd62d0a4253dbb5a908c42341503b76d428a0c38f7e978d4fd2532d075c08d9cb3a440018b323dc3ac28bf8875e412745962e512c0e0e81b4919a813766bb020c831ce0c3eea5a496e57e8d598d3bb34733b6358cda44b1960e8890ce525578d100257ed8a916a02fa2d8b59478966835c0603a8f48715ab2544d0fc487a7eba7a96a6e3918b9c9cac54c841c2899cea0312b40f9bd93eb7d392a4cb889144c224a23244067a9712ed9cf52a15edc35895c7c121822468716704e3617ccd59aeff5120524495d44ae3019adf7d25bd7871b2a98a17ab6c68c789174a28a4863ad69362fc5982aa68b3c0cf35fd2d63d064556e55b6df0d636dc5ca56a928f19c61816349c6339c59febb2b8675807a6a9181a91620a684dba5c4c596a821b66014851966547d60690f7a805bccc4bf9620c188495795c3dad55c8e7529fedc92ee3192a68bb9250420f6ff04f939c82c8442350d40f9d518c10c53ed5c3539e373d0f955d3d451e7873a22af2aa87c08105c044613334e6b585aa864795e0a6af988affb2b2eae653be5c76383b66f5205e1df2b557b66b0f9b7063d3039510ad13a9b5ae6bbae433808db7275271917d75524eb2203202c1f0b4c9afb402f5798214c28667d28727f89b95d3294cf38c129a792b16161e6b9eca60c18ed802c72225d585c7f59059dfd74944f764035c073119395478651f88352c204f89222bfff7c8bedcbb6be1728ef74e54435b40b22276f1199ef34673ebc70047956a543f3d8569f334a5fb22b4c2bc34aa9a4b27a11795a730eb96003ed4662f2f0344da2b88e634672fe48e40ec83f4ae731342e77cdf4a3acadbc64e263f1afdcddf2ad63f2fcd19799a0a8f43ec867477e249ed5fe716f8ded5edaec5de3bf5b4d7c2f2e18e87f499c1968993eff196753db8045e2c8ba8 + +# Official test vector 46, seed: "6b3996e8bc6f52879f2b7be012c44ad555707cb7e5fd8abb3457a298336d6fdc9eb7853008ff13201d5969a315c7e493" +seed: c1b3cbffad4b306f9af0cdd3028876486dbe858875c9b6497fe20172a986c82b1c96249919cedc2369d8d739ab125e0d2ccb82dfebcd90240a545cdfe07511f2 +public_key: b854a0daebc2831a4f20695579b52d3369af228842776a03c4d3284d763d1f663000930377dc86ab14486673a349d8073ff6ba44496c64467d5f531f5203a074ac7ce9090e59f1c308d2c755910af132ab81b50ad6d6c2c6716190696ae6a51433f61185a43cb1d23708d8286d066b61a6b7f9e13f8248c232d8315f40053fba0d7ffbb4ce60410899200a8a5e51bc1d8392cd56f41fbae85f35b110933a931084444036aab790cc09b84b7a235f34763b9ab5c9b53620f627778c661c4c45b36ebb3a4565795656227fdc280b327ee2f96c16e7bbbde89e9090318787b2abba7727a393cdc04dc38205e3c86ed5d5291a1149ee204b24661ab2ca16c1c0a35d3cca0d7c57f4e01985242c3b43869d9914312678710b039be4c2b775cca014b1d936ca8432a4614c4e67b69620fb49cbc787599c4bffdc3a2c786ba876864e7a5be33ab200bc2d087c3e6cc642f4a96771ba212778046b5823085c4068b209c54a5bd4153e4d986ed3512d09d40c37c1a2e57495e0a594f4430fdb1c88c4fb677b007d8804ca114c0991b90b5140761d59325502a1f0476e961a0c2b2ca78a82c8b5581d98da26de717f84c140fed0a00221ba71c34821374ad7c565ec20cefc949e98d1819702a4d38597c1db9239b9167dfc8651498927bb0e170c151e881577f58963593d3ae00870b8bb9fa3b77c468e8bd365dde088f24c2577c5aae2f24aee1552e4482352674d1d96b90880336ed44f6bf007b5eb67c52a10910a9a3fc82ab8d50aee17b667a27b4d014161f1a60c3084a25524693364ac1876cab0c93c01a153b03486e75c3a01728f625f9a7a6a99e78ea9b77b01490ab49c6dad9ca584229a8a890effe47ce0692aafb17a3db2b855a01666514e8a800a47c0cbfb4872c8c8a4d4bc52c8db43d3f7360d568f4f905ada2565a494901f229ed51bad9106bba6dc4fa7ac59a3a5a64d033be1e47c36c2cc9da10a2bd200b681c2caac5cb1eb03f36455241367d30019aac00afe312c5323cbb4575e271c01f09c6eac03ce1f02bcc4186768493f6cf97671e7a02db6047557306bb8ce086382bbab8312460663dc1bfd01b2411b3c49835690627f133935c27308be6b5d09844f477523521c2b1bb1c92b6b3c46c20cf97217683a3f2e46b0151511c7c9c4bf8620d4706ffaec98e524360986386a7b5c20c312c5b6237bd17271bc6c146124d190205f468dfb00bae08318350c1aa5910a07a67bf13a99a52a39b2b04fa56143c0c1290c5c412ce1647ba8242c851c8bea960c9c4879b83037886ae77b10e8126dd3b633a33a662076cea326765d6262619b8d0c8c3217435450070dbbd67404f5255b6557267178ed99cd4257768e728f3069bc29f8484a127d84098ff4325946371384463c4ff489cd8b6eeed0c5e3e92b1b988c41a31df71047cf78ab1ef9adac2a1ba3121672505ec77b0620617598f84d1fc7b00fdc65e7ab72274c86a424746dc74f53142be6423545d02d581933bb92058563279e522ad8507f4326699bf4831970775640887e875e1cf29a09843210a23976941af397a3c6c5605af133ba94126132311224388f340448a1252c5bc0197b4699aab73a4237d40204a46103bd605bc698111ddc3d6bc04804722c35600b001c554180d16628713bdea10cdf +private_key: b6f76178bbab01b89443c00292ac914d658044f13fbbd19cd4c0a385141c6a91208665bc45c04ad73185e6e3a0cd102a8cd20547c2335ebb3bd7e9ad50294b07d9a45e617473814ccd41078fb58d2dac1f872c6cb96c73d1aa4356a917c94704a36b9ef791c6c021cf9ed2270685c645a76141f6373b8ab6ab18963b580ae0134d8b175382847811a590080a3dea2b863e06a0990c93839906e2f942b864bee7410bbb17bc1db6373ec99b45754ec78531c205919c27a4f2445b8a777683819709c1c9a3660ccad39941e496aa791ff8d2671b74580df965d0126dc5c034b8b01f31179c1c4746d3820955206b447174eca321a5c22ae852b631e12025b5675385731ba9234ae36cd90c3e16fb5ea2494012b96498f02edc23cd0db74970961fe430129af1b94ad5b1bd95931aecb365fc257c7c1d1668164edc9d2b869a4cc95d54759182c6086785246794a6a0f81431d75fc7189416a9b1efa3832c187fea912474a8a4caa5c9d08b2386240a3d26755111a3a3e830266473b6e02286c10e23ba34ec08c1f643a8f2b74519631706690fbeb5be8bd581175412c1b83da81700ec92bd03b9516a779205c78f726126d67ac2a4c528663acd985296d187c7f6e231a95707d0f9854a4c051a12179678adbf8285b5e58251d08f2da015bcf219edf39f6be56e53b95be3165114616175a5ab44607612fc40ef814c9ba52b6c060c0f11adc8234d865282c3dc5e106753cf221ab2996ab9887ed5334bc7b83d6bb413e1fa9c074903f3c94c685c660ab00a6be85c384478cb42bde6715c9a3bb77b7acab909ce428b955476c85f153263874ca3a7429c6a79a0834c15237dc5fc7a7620897876a3c0970e1b7b789a13482a38c5455a187995960806304ce34b72e676fa589f9823c949981b6eeb887bf7c09ee147645602a640598bd29ac48c94daf0771f46acacaabb4bbb73e841b4be5ccc886987b56cc6e25a7260b3364ec4a897ac22816048756a530ad269759929bcb4ce03435784b25f6f87ca320060d2a1b3b800986cea76229b1d5fba58afa9ac3514289a9b7f63d80f2b48893b376018a0baedec2715b01d61c8cffb63b839c4129c8b97acd904a23a0cc5a38245802ef5eca812870a5717c667ca9bac328f08305621305e5d40980cb7a3f8bb01ec4469b7e17cb4657944a739448a461de11e3bea1d7141a6b7dacf8f41a8f9c6437a9c26ad5b2dffb4974bb7762c76715a9694d5d012e2254ea717369766c22cd9938ec0a4b5a88e7c45b03027926984081414cf7b3a15d46895c362a0a2928c1215601f665d675abfea867957f68178e6621871bd7ac1010abc494517804e68be80151c0aa332102822b0674915208afaa21efb3ba32b0aadc9778869bbab9ad2cf934a690f40917593667cc2ad0cab53c387957ee24960149b07a109465c5de3eb576d99481fec4ca5e8a0de36756f951896322d29c5adfd124c867a5286b59f0c2a0c632c6778a098d39c1e6029285a821c06958671651804e75de2d2414eaa19d0a18003c12f74d50655041aaddc6f5daa6dca8b46367c63bec73ce1e181cc166efe3baa2b986bff325187369982978cdfec651946a4995a20b48b035dbb5eb854a0daebc2831a4f20695579b52d3369af228842776a03c4d3284d763d1f663000930377dc86ab14486673a349d8073ff6ba44496c64467d5f531f5203a074ac7ce9090e59f1c308d2c755910af132ab81b50ad6d6c2c6716190696ae6a51433f61185a43cb1d23708d8286d066b61a6b7f9e13f8248c232d8315f40053fba0d7ffbb4ce60410899200a8a5e51bc1d8392cd56f41fbae85f35b110933a931084444036aab790cc09b84b7a235f34763b9ab5c9b53620f627778c661c4c45b36ebb3a4565795656227fdc280b327ee2f96c16e7bbbde89e9090318787b2abba7727a393cdc04dc38205e3c86ed5d5291a1149ee204b24661ab2ca16c1c0a35d3cca0d7c57f4e01985242c3b43869d9914312678710b039be4c2b775cca014b1d936ca8432a4614c4e67b69620fb49cbc787599c4bffdc3a2c786ba876864e7a5be33ab200bc2d087c3e6cc642f4a96771ba212778046b5823085c4068b209c54a5bd4153e4d986ed3512d09d40c37c1a2e57495e0a594f4430fdb1c88c4fb677b007d8804ca114c0991b90b5140761d59325502a1f0476e961a0c2b2ca78a82c8b5581d98da26de717f84c140fed0a00221ba71c34821374ad7c565ec20cefc949e98d1819702a4d38597c1db9239b9167dfc8651498927bb0e170c151e881577f58963593d3ae00870b8bb9fa3b77c468e8bd365dde088f24c2577c5aae2f24aee1552e4482352674d1d96b90880336ed44f6bf007b5eb67c52a10910a9a3fc82ab8d50aee17b667a27b4d014161f1a60c3084a25524693364ac1876cab0c93c01a153b03486e75c3a01728f625f9a7a6a99e78ea9b77b01490ab49c6dad9ca584229a8a890effe47ce0692aafb17a3db2b855a01666514e8a800a47c0cbfb4872c8c8a4d4bc52c8db43d3f7360d568f4f905ada2565a494901f229ed51bad9106bba6dc4fa7ac59a3a5a64d033be1e47c36c2cc9da10a2bd200b681c2caac5cb1eb03f36455241367d30019aac00afe312c5323cbb4575e271c01f09c6eac03ce1f02bcc4186768493f6cf97671e7a02db6047557306bb8ce086382bbab8312460663dc1bfd01b2411b3c49835690627f133935c27308be6b5d09844f477523521c2b1bb1c92b6b3c46c20cf97217683a3f2e46b0151511c7c9c4bf8620d4706ffaec98e524360986386a7b5c20c312c5b6237bd17271bc6c146124d190205f468dfb00bae08318350c1aa5910a07a67bf13a99a52a39b2b04fa56143c0c1290c5c412ce1647ba8242c851c8bea960c9c4879b83037886ae77b10e8126dd3b633a33a662076cea326765d6262619b8d0c8c3217435450070dbbd67404f5255b6557267178ed99cd4257768e728f3069bc29f8484a127d84098ff4325946371384463c4ff489cd8b6eeed0c5e3e92b1b988c41a31df71047cf78ab1ef9adac2a1ba3121672505ec77b0620617598f84d1fc7b00fdc65e7ab72274c86a424746dc74f53142be6423545d02d581933bb92058563279e522ad8507f4326699bf4831970775640887e875e1cf29a09843210a23976941af397a3c6c5605af133ba94126132311224388f340448a1252c5bc0197b4699aab73a4237d40204a46103bd605bc698111ddc3d6bc04804722c35600b001c554180d16628713bdea10cdf5ca1708c7c6e354b69720b4b4a0c358fe9a6ad3febe78bb2a71691658acae21a1c96249919cedc2369d8d739ab125e0d2ccb82dfebcd90240a545cdfe07511f2 + +# Official test vector 47, seed: "730b65ece22de27d573ce3aea7cb021c415df210d228808d91d4f380070ffcb0778b683c71d4853deb569c822765f2a3" +seed: ff7495b8575b5a98e4fd21fb4c3e58cbb60f14bef21aa74cf8802e3153f14807bdc370460375a778d1a31d01c42b66367ed8d9e8f84551002f552f0e52102b5d +public_key: add1cb33481d37e546d75b5398198a82126a7d306a26c7124518075ee6701d1ca69d16a867115582f22a7c382bab3acb5de50c34c13a5378b2b1415b5538987a77681597abab9a0b5bfc7bbd19550064489be9b897a54fd12c7229f0af5313429fc85f1936b5a325aea955021a969ae289657ba4ce7393477afab3ec0b6e46bb7a8570b2dd4372d51537ceb3023e477a36bc2b784444d0f71c3165395ae71f98921ed160be83e0572487691a43128352b3d82b223c67b33d8277b05c6c071418799583e2b87c9c2a81bb2a7658d67e637b99d5770e04b592bd5961f0c726d0058b31086ab1d23f4d200bbe6b418fd53a0131aaa5fc0380f70f1c90cd1dd5bfb3839cff013375f49919214e756856042bb10e1252a0108c1dc39a1f69bbc230a4e9c93a87a87899faaa210a781c91bdfec9a59080ae642aadfbe20f9ec600a2b297c3394a751354b6e8ac65ea45d3b66c57328249034738ea2541476ab0f2717940930c8551314851be98351d96acf6232e1960b97d930e3f424efdf706c2da2f652796caf344b86ab388f412853a5643a7932409b476d3c81c2a301e968dae28742d18232efa09b81177dc9ab33d7b2ed5e711c157bbb123506fe35c5132bd04ea87e173a7d8ab5b2e35a7eeb58ab3f549dd30228dc5197f778359b4b9b9b989b697839fbc013426016110bbe721c1c89c1d463248887491f0814c4bfcbfe7445144b88cb4ec535bb85a3016891b009dd4ea020e3799d56a710ff097b79384556c5d7d717436bc9626cc15ea509fed2bbb74c2636e8cb4e0435283c7159d8c9eb6e11e5bf977a80994278161671346b368372ab5612c85ad48db8a82067acaaa39bc0b1f49083e71e8727adca1f3c7cfacf907a71c3c73e6737bc51795c9761b5c36c87b46141400dd43874c4500606c616d90bd9d588905fab9b538c23a07b9fba6c0699259b6b81aca207138884886205955250e3e7b5d4d549a8b73c0ff41b88c305b7efa4178695abaecb97ba46dafe090a81c038ff373b13582665665b2058835b629f2925ed99082858152433bc3bbe90937c763d835638c3225e0c3485f9555d3e1556ffccb1b059dff8667ac445b474a17f360a2dbd895048b29fcc003f3c46768668b88bc0053bc3821a95d5d49cf1510894f1739c91174310b0ab2cb7836b41bc44aad9681c0067192d4a46c2fd60e2323b6fcdaa15a6581b4571b4ccc09fae5b24d8b11f67aa629e79652388ce04b9ceeb5029e80341ab6abbfe38b2584b55108a21ac64d61636ddb2094cba91c2b606cf3d2ba09d4863ee900decc2d594a042b5a63c822631533a14b6cccaa0775ea3210e3ebb22137a749b22c1eb129c872578feca153b312efe6238583793852485fc53952e4a513e64b8ac7b60241944d704246551d3372ab9e60bd8411729cab31eb908c5348c34db74f3ca60384e93c91479a52b321f8544dc13620f26c9fd324784a294197d9935551ccfbcb93f9f2ba8fda993a3598a5d37c36469024129c8f3a081c9b3a680a02ec450b0a805da455c5f696bf46681ba9f80f6b469af9b1c09fb2bdf618242f449cd017308dd80a9fa7a3a6aa25becb6f07b241f0f72b345664751b83b46a276ec74aa2569b79de21a5198e7f0c3bc2aa84e7f5c79f4cdea5b473ba2d344bf994fd32 +private_key: 48f2003d718ae6848e47937d58e68162209b6c88892c931b4cc4b1ce0a0e762020495c60e89cc854f72444d21def3a5b96a004e2d9ac9b110aa8844dd02a4d8508b0ad3c480e37196e343ebc01c12cc2ce6616cbc395a8c7e02b19d25041165832584742a07fd3207dd3687c91d17e111a945985805fec8836231b7546263d96302473abfbe36fda05345950c7dea6affc45c87a3272e780a3ee920eacba1fa17500ab04a091fb355d906430cb4bfe66697a09cb08f992a3cb9b2f31624726b13223122c5694d9e0757b65b46682694c82b862aabf3811ad14db6a31b602030498993b8eb5364f3c9213e66c81744b018dc895fdfcb81a77672e71b320e3a2df75403d57c229e745310a7cf780291fe169da8290ed96a2056995fc7c59cf6cc162bb10678736a4f56af0430e6c22419a6c3535b22fcb837bc2214a1d83a6ae7414d6521149498b0e0841e7775f1e783b376c1ac39067db769af6e691c59683114c7420fba6723bb3ae5a137224ba7e816b5463902d21223064c8a8cb10f49abb765281ec372c647b862f11095b25a41705b9b327456a7859c7033691353eeba926ef880500f34fac746d9e59bef7b50457acbc33369f3f85af047bbd75a40cf62ba1ecc27cd5a6437bd28c37ea3739a784f068cd4cc68f0cc6b01e4933003c950985042b1609e0a748c9f87ce5099356ec846f9b40f6c13a6187cab40b47d04cae05d43c53956ff4553f62761068e9938f21a24734305098caf7c9022a8b52cdb54860419a532cb9750c3e439a742d9031076b99fb8a934c2c8a42430a8e65cca75286518cc08a6925c2e3b9fc854d8343b36d652f37c339b951b0f7d774b4da5171a96cf6981f1848703dc93f2ed6bfda065b7ec4056632a56a549353c12c0953757b2077e65c93c00673e88ccec700b6d2307a0609ae9035177fc41c97fc32d1b8bfe7266ab8eb2b9bdb9ec6692f7d6678633b030cc19905bc46960ba25ac8b9da762165485a7c07744d1b8fcc080993d0bf86496262f268f19b7dd7d7bddd4c947e1146f2196ceda5bb53137fb107560c4ccedb96351945bb8ab5092c9975db266e621c53c519caf639c80225248e6804d78108789b2238644f33136e853c26e1477827d3797d7c75a09044bc77b9ea05bad41a1da87a460e17779a5233a080377294a1ba3a99b4db42cd42893b937c369983811c14305cbfa0e57c3e4b19f0a77c4a2a6998525ece48cf45635c5672429b67630e603d1ceb5a22e429aff58c2ce61e79f6780d59575ca3309d559cbe6572e0671af2259a39063f628bbcdb74345af9caf02aaeb0a381e39a5bf08107811b243d130c482b0c74a47738d9a6c5d30538e64cc513160d9a8351b9ce82521ae1cc03c8a48f72252ef1b2a15e6785e639246cb8c196f9949ec094ff6639c8e216b90bc3c2099bb3093ae5242f252807bdb162b3232f3e7383145655ffb71ca43456f1a5137e7977ef214ecbc6113f198d7712178da090620a9d343025ac11595ab6b6844262822b128b8826fadc7b3f218d37941825733f43ba4cd99b63d26812772980679c3b14462b762ac8c3e8942a0b1d4ac1838a2795113c365a535d483658c4531a0ec63c010a2c7ec159add1cb33481d37e546d75b5398198a82126a7d306a26c7124518075ee6701d1ca69d16a867115582f22a7c382bab3acb5de50c34c13a5378b2b1415b5538987a77681597abab9a0b5bfc7bbd19550064489be9b897a54fd12c7229f0af5313429fc85f1936b5a325aea955021a969ae289657ba4ce7393477afab3ec0b6e46bb7a8570b2dd4372d51537ceb3023e477a36bc2b784444d0f71c3165395ae71f98921ed160be83e0572487691a43128352b3d82b223c67b33d8277b05c6c071418799583e2b87c9c2a81bb2a7658d67e637b99d5770e04b592bd5961f0c726d0058b31086ab1d23f4d200bbe6b418fd53a0131aaa5fc0380f70f1c90cd1dd5bfb3839cff013375f49919214e756856042bb10e1252a0108c1dc39a1f69bbc230a4e9c93a87a87899faaa210a781c91bdfec9a59080ae642aadfbe20f9ec600a2b297c3394a751354b6e8ac65ea45d3b66c57328249034738ea2541476ab0f2717940930c8551314851be98351d96acf6232e1960b97d930e3f424efdf706c2da2f652796caf344b86ab388f412853a5643a7932409b476d3c81c2a301e968dae28742d18232efa09b81177dc9ab33d7b2ed5e711c157bbb123506fe35c5132bd04ea87e173a7d8ab5b2e35a7eeb58ab3f549dd30228dc5197f778359b4b9b9b989b697839fbc013426016110bbe721c1c89c1d463248887491f0814c4bfcbfe7445144b88cb4ec535bb85a3016891b009dd4ea020e3799d56a710ff097b79384556c5d7d717436bc9626cc15ea509fed2bbb74c2636e8cb4e0435283c7159d8c9eb6e11e5bf977a80994278161671346b368372ab5612c85ad48db8a82067acaaa39bc0b1f49083e71e8727adca1f3c7cfacf907a71c3c73e6737bc51795c9761b5c36c87b46141400dd43874c4500606c616d90bd9d588905fab9b538c23a07b9fba6c0699259b6b81aca207138884886205955250e3e7b5d4d549a8b73c0ff41b88c305b7efa4178695abaecb97ba46dafe090a81c038ff373b13582665665b2058835b629f2925ed99082858152433bc3bbe90937c763d835638c3225e0c3485f9555d3e1556ffccb1b059dff8667ac445b474a17f360a2dbd895048b29fcc003f3c46768668b88bc0053bc3821a95d5d49cf1510894f1739c91174310b0ab2cb7836b41bc44aad9681c0067192d4a46c2fd60e2323b6fcdaa15a6581b4571b4ccc09fae5b24d8b11f67aa629e79652388ce04b9ceeb5029e80341ab6abbfe38b2584b55108a21ac64d61636ddb2094cba91c2b606cf3d2ba09d4863ee900decc2d594a042b5a63c822631533a14b6cccaa0775ea3210e3ebb22137a749b22c1eb129c872578feca153b312efe6238583793852485fc53952e4a513e64b8ac7b60241944d704246551d3372ab9e60bd8411729cab31eb908c5348c34db74f3ca60384e93c91479a52b321f8544dc13620f26c9fd324784a294197d9935551ccfbcb93f9f2ba8fda993a3598a5d37c36469024129c8f3a081c9b3a680a02ec450b0a805da455c5f696bf46681ba9f80f6b469af9b1c09fb2bdf618242f449cd017308dd80a9fa7a3a6aa25becb6f07b241f0f72b345664751b83b46a276ec74aa2569b79de21a5198e7f0c3bc2aa84e7f5c79f4cdea5b473ba2d344bf994fd3204f0066489947b572f76e1dfc2e24297b210ed0aaf228788a0b349d11689e064bdc370460375a778d1a31d01c42b66367ed8d9e8f84551002f552f0e52102b5d + +# Official test vector 48, seed: "5522a5a891a9a9b5514f4556afd8df40b9cec63a01492f0cb8a1db073a285a963e4a9ff2376c88662f7d8d241f8acf17" +seed: bdc3fba1c32751139fc45bacffb3ea97f26573d804a5f27a459293d95190ed8efd5a08f656a6eb8cd20679930a31caa6a6331c4b133a6838c223ef9f769f6246 +public_key: a7a8102df0c61577a7cd4b9a04b17ac55708d8c6746289529337b9e267737d5345f4e768e0d6656cf23593a84eb0ec290c8ba078eb9f8d1cc8ea18280981cad0f46dd29c474fdc57cb5bc93e318537ca343bd03ea6a7a466b021b3db77021a8e20b94907ea294f47baad599d51d74219e38f883b36cb323a317520997988342a7452c3aff4522ebee30211444fe78854f9f853cd189be04cc1c800607cb4acccb650ae546323e7993bf2a203487becf8328a2979dfc5c3bdfc1b47533a9a629e5fba5a2234bce8eb37d686a75bc33eeb945d80d92c218548eff794ad6c0d825b57f6f12f0ef6b8201bc0d1fb0354f051ec1a217a9a0f0c77b1d6f76c1f25b01ff356fa390079d3800f1468d745a0dc852ac140307e700f97d557eb42164844b0b6d5a37bf1bc41db5aba156359e9b4ad5649189409be58b8ad5ac89e348099ab9ffe81c71d54853eba7b42167d478693c39837f76182e0c894e0f5ccf19643fbdbc5278b500d1b07f1e62ee797930c0cc4a41832ad093b28460c8700678bda847edc6bafa64ca182016f75366af8c330d201c7ac4327b2326d8b57997734bf909b0fa1c619155aab7bc5f4026079926d04619186c4334f48bdfaeca777e91d0b0b7fc4b180e5e19f0162c5d3146b5ac5ac820781209c455d195f17d541d6916f56838f7be838ac0293cdb63f28529df3fc7d54475062b90d3034c2583b00c942102f82b9553c1120891b77d61b8c86ba21b4a78f772c4049869b56442d33c642a5c0ad167747807d5f6105ccc21af8e06c85031a2a73ada9d59453017f131b55c1e0176ee29b021b7933606c5425078b7b49cfa99f24b21818e78a0e856747e4a7888a3d1313624af81c75eca6c3c43238bb078b94c2a9c57f0c4c66ec5b59ab93b73a1000630aaa28a79415320bcc8a96195934c9f14d5dc41cb70c1104a63f5fa29953495abf71b9359563f16c7bd6bc319ed7898fd00cb580902f2196b45311962cc17a9a9f002a916d9bbc1a452bd3e6a48ca05e50ab35bd828cfe66b483e96ca1d917001b46374c41c2d079fdd8257bc339a6e13a7fa2c0948056f6553803d10fc9f1c87725230ba3713903193f200a9851a78b61534b5a949d140c9b457ec66769c6544d79f0850c4cc8e4b78eae0b260dfc9cf0848e4e09cf52047d62bb8e7e6231f4ba49859b1dedbca0d8832bd23789c6fbc40d61485e5a951de68639e07e624a72395b9e25b603acb330a37b998b7a9ab3f973003c15624c6abce84050fc0166924a397708c12308c578105c1457de7cb41dd609c0c3333be5b9c3b93e2776aa0ab3a4054c98789a4bf419bcb6eb914c2179bae02b462b1126a3a28840b9e7170618c20e8527993623cd0c776e54f8b4eb237b4f8c075fa2175f11be86e2bdf3b9b9dff89b7534134620116e0ac025f6707b00b5c743aae144241b935ba61827909b591b44cb6f36107ef81a214c6aa5b9b3e1f441c774cb7102310c4031e0e4a213a8c1f1593906a0424d657cda7c10c1354b0d5a83d2cb9d0407073fa77abe480854c953eedc6cb06c75695665b92873552cc053a9bba0c99aaf970753299db3528276b56feb8a5bbf373d13c20c2f22ae07e9542206b296f3b101d07a3bd1517d9eb8db21e1f18e6da63acfce1e0dc597cef3abfc7d0aea99da +private_key: 3e3a14084387ae125d7f5a0e51841407d61f85d7574b1abea52b6315d07a404372c827aadd3aba668bab52d5943c59bc500b78bd77ccc7da7a3a6c8b613b9cf761bdd73a222bd11b246431d989a9b5d7b68f8c2364c8bb9380caee16bbafec6e4ee157655528dfd8399b3912b303481607620c941cf3a314cb7013a2526229c4bcabf7642596c4100023140a4ac869a30c2a20501ab4838581f42783a18b83f5165907985363d766edc0606594188427a979d171c4a52152fa4ecf0c4d4bfb10306b98ec4a409e2baf598124abb31e34bac176a29fe7316056accc59f38a268ba03b39bb48e0a763e340dca4c3f1d8580ce304f696144efb3db5975157260dcd26194b476c5c6552f9a39b4c556028493f0bba23c96ac03d03ce54a4680e8075cfe70b01bbcff4e3026fa3185f059d401552dd966e70032f7d198a17b8620ba30a39cb1aa3f84ec2d82d154ca88f392c28574cd8dc1025e832751769560569e9bb0cf3f7a4126800142753f7e4950908bfe86b468d095f422c1dfaeb3b196a1c62cc8b0beb47fcf6a456150b780b5648ec05387cc81d485318f1bca87bc6cfd30ae2202e342345159154c8b561f92565ee2c20d7e1c385a7a1d99cba75a3121e410d3145284c826c408455a068625d35b69ff944cb880601483b81f08ddf8ca0b8931480878b25e7c73a6795222b593bf517f0c25f6b862f970bc2a652ada653838c942a68098aa6931a9a858cd4251c19b07f69b208ca1c479777907fb752d24ca06c96b394232f0e1982f4d0b9c6c245da5275f75246f4d58472457ae842c6fa886dc2305b1e2654f1a999664c2e7819571be87bd2f8216bca5486615776e30a3bbcabc3b094d90c9fd24a083d03ccc29590647c533b278a28eb667bc71e2cd62cbeaa74821456278003b9fbc18cf23f2837c8326031bc8ab260a92524e9812d307004ca9f6d709a83b77d3b15b417b1cc7de93737c02e22d0ac4486157d0a8236612f0e25985847185007c41a5846dbea0987794eb2743c87020063277cd366b2c5105421c453257a63683a719a57bacf373b8cd90bb10542fc979c92267e04e0612cbc9fafd485933b42b15404002c8ca8930d295359ff299d5aa3a5b82acf26722542819389891509d24ac2d34d7e10aecac27edf022d499357d4d8548220148a082a504baf876414faea7ddb11639a073e87c3a273713305fa19604b33f6c362dc792a0007aa577a0f3740a246ab4226297a0e66c073564b954039dea916efd14b4a32afb361b80292c6b35244ec1b9fbfeca496b35c1bd5ad7e313575dac43478816868b094c1756bab5503723d39dc2ec6bcba3103b6107544f9bcc74e25355597b69425ae77f04c0fa9a17b1351c0854964261e60284507f0b2a89b4a76cb9481c986198c3fe8514c76465de4eb364bdbc43ec1a1054462643a0d1ff57d957685d0e70213505449119628e86c02f23e1315829cccc9f60a733b8414161673c66a0f33371ca0b10df9faa4f142c4b4300b79b0c18ce8cf76811e459c98b56871345a57844ab6a3749a3e14c18c463e5596836e8c436296a84fda143e69517b8176fef3c52606170194aef5b429057b9edc7c48f1dca18605bee3e26aa7a8102df0c61577a7cd4b9a04b17ac55708d8c6746289529337b9e267737d5345f4e768e0d6656cf23593a84eb0ec290c8ba078eb9f8d1cc8ea18280981cad0f46dd29c474fdc57cb5bc93e318537ca343bd03ea6a7a466b021b3db77021a8e20b94907ea294f47baad599d51d74219e38f883b36cb323a317520997988342a7452c3aff4522ebee30211444fe78854f9f853cd189be04cc1c800607cb4acccb650ae546323e7993bf2a203487becf8328a2979dfc5c3bdfc1b47533a9a629e5fba5a2234bce8eb37d686a75bc33eeb945d80d92c218548eff794ad6c0d825b57f6f12f0ef6b8201bc0d1fb0354f051ec1a217a9a0f0c77b1d6f76c1f25b01ff356fa390079d3800f1468d745a0dc852ac140307e700f97d557eb42164844b0b6d5a37bf1bc41db5aba156359e9b4ad5649189409be58b8ad5ac89e348099ab9ffe81c71d54853eba7b42167d478693c39837f76182e0c894e0f5ccf19643fbdbc5278b500d1b07f1e62ee797930c0cc4a41832ad093b28460c8700678bda847edc6bafa64ca182016f75366af8c330d201c7ac4327b2326d8b57997734bf909b0fa1c619155aab7bc5f4026079926d04619186c4334f48bdfaeca777e91d0b0b7fc4b180e5e19f0162c5d3146b5ac5ac820781209c455d195f17d541d6916f56838f7be838ac0293cdb63f28529df3fc7d54475062b90d3034c2583b00c942102f82b9553c1120891b77d61b8c86ba21b4a78f772c4049869b56442d33c642a5c0ad167747807d5f6105ccc21af8e06c85031a2a73ada9d59453017f131b55c1e0176ee29b021b7933606c5425078b7b49cfa99f24b21818e78a0e856747e4a7888a3d1313624af81c75eca6c3c43238bb078b94c2a9c57f0c4c66ec5b59ab93b73a1000630aaa28a79415320bcc8a96195934c9f14d5dc41cb70c1104a63f5fa29953495abf71b9359563f16c7bd6bc319ed7898fd00cb580902f2196b45311962cc17a9a9f002a916d9bbc1a452bd3e6a48ca05e50ab35bd828cfe66b483e96ca1d917001b46374c41c2d079fdd8257bc339a6e13a7fa2c0948056f6553803d10fc9f1c87725230ba3713903193f200a9851a78b61534b5a949d140c9b457ec66769c6544d79f0850c4cc8e4b78eae0b260dfc9cf0848e4e09cf52047d62bb8e7e6231f4ba49859b1dedbca0d8832bd23789c6fbc40d61485e5a951de68639e07e624a72395b9e25b603acb330a37b998b7a9ab3f973003c15624c6abce84050fc0166924a397708c12308c578105c1457de7cb41dd609c0c3333be5b9c3b93e2776aa0ab3a4054c98789a4bf419bcb6eb914c2179bae02b462b1126a3a28840b9e7170618c20e8527993623cd0c776e54f8b4eb237b4f8c075fa2175f11be86e2bdf3b9b9dff89b7534134620116e0ac025f6707b00b5c743aae144241b935ba61827909b591b44cb6f36107ef81a214c6aa5b9b3e1f441c774cb7102310c4031e0e4a213a8c1f1593906a0424d657cda7c10c1354b0d5a83d2cb9d0407073fa77abe480854c953eedc6cb06c75695665b92873552cc053a9bba0c99aaf970753299db3528276b56feb8a5bbf373d13c20c2f22ae07e9542206b296f3b101d07a3bd1517d9eb8db21e1f18e6da63acfce1e0dc597cef3abfc7d0aea99da67ce6c8abcf3ec4d93505d3be02c039e5a12538e5e59adb5a5d709b9b342938dfd5a08f656a6eb8cd20679930a31caa6a6331c4b133a6838c223ef9f769f6246 + +# Official test vector 49, seed: "1853e72329353b3f89ae6a1b1ef700da8ed3c10d19f9e61ee9252e28ebb0e15802ee43083a12a0b7527088832605e3ab" +seed: 447f6076a627bbc5ad7773fbfeb14b4ba9ac43a0f8b99fb6dcd5e452aa3c47ec20a7237801f470fcc2bd9fd7bea8322859b850f7882d362947432913dd068c01 +public_key: e078c4a3954f40a2697092bbe4460f27c4ce6886628382606f395b55d1a29939a2f754a0b82968d3c865f30066c5e21e3e2839416570f5b54f24d347e2e10169571a3935307a4918b5d68ddfea58a90382e70012911729238a4919a7531242228995215fcc96ce8c1970faa902f79c7a7207a93613de0066c384786f5913b24040e6b4b48b6b679e5538f953540c25c18402be1c58762fe8bcee6a1e58d93b21165f95895afefba1f735b11fb7bbfcb40d3d54ba24ca7ef507973aab9017b66a3e271f980462752137d9ab0d1937226129bf48f68b700021b2fabe81573e49fc17819bbe46858b5c58b4ca7c83a57398a667b09c681b990b648e96ce79b72104b13e97611ee8528c9f64c376eb04925ba46d3c8ab859304ce17b9435309726045de17d8a7cae32aa9c80e1aa4058cff89010dfe22daf0a002a905f945accd2f9225739aff1863006b46f9ecba5243bc48ed1184bb9a57ae26c8cda147cacbb4a031112279dbe727fa6c467ead943269ab1e3c9657c19ba0b648c9d4a48c6163a0a79954c0c7ec63529cb8a65c851c39840bb1a7c584104016f16b43da179189343c3276bfeb5839d6622e684b421526d69517ad57b67494bca6db58cf6c95266170ddd9455a6867de052adc8909790659fa0dc0a1d011487b16a1e08bc82b22aa9444f123632ec889719e754993ac8319a72ee83a988a2c77d28acd4bb5ebc486c33b0af1d67a84a349480fbb2b0b252e8749401d8488df52356a75ba2883090dcb757451c9956888b43806431bf9ed956e34806bafc15fcb1cf2b45729eea12a6580c6d1c366a76187fc20fae7657f560973838abaa510fad13c59c5baf4773188859809d1bcdba937845759c9af40dd2f14bd7dc48028a77ff4165f2204fb3b0b9f585061616ca4fc405a0c8533c344334e511053a548ee86998e9094863b8bdc02aaf6bbc916481ac9337acbac10d90794ec239268aa376157b1955379d30c2cb4927a8077cba969ac398bc8521450efcc7e1cc617e69a66fd16b771a2497d14e35a61919dc129844379a314821c333a2f4443651a4cff234a3dcabad32610f5b54d138065d8a5a81fc5068c5060af125265cbc42c580f47b9fbda72a893329999958b026c5661ba116346ccd86633e0a603b48c8acab78662162a9f11c4349c5235a5ac46546b16b25e355b4408456f7339122b67bb48334836214e431955e979244c8c7864ba189eb24c818c15417cac84682f719c9bdd8479be5c643d937605383c6a9514118498d5b4e81d5b74a063fb53cc19a20a9cfa26e479339b988c40918c192435db1a3b2a7c6046376b97aca7a9bbb30335a0e8fd237f8833e89e41a1c67b8aa9b0d539486b1855b9fbb53b5103ab2d19606165acaa588b9d14a4e6a7823800d8a9334ff7456e75aabb81408b791c9c6bc3b5829c1ab241e8d310bb7b15a5b24123a2c691ef1b5dd80640a7b94892aa1ad7300797a3de52a66c794426230640b303e71f0b93654708bd81f706b0f71757c08fcc591525bb6c9a57777bf1bda0d81b4922a56586d21b04daa2684e14ee8c0cd542824205b2bac3c1232f2bd37109d621a25cf570573465a706583da17c39ff3ad13826b6d5988158a1602a361d7a2f86a9219450ff713e184c0f6ea4146b79b03e5ee3454a79f +private_key: 1fe26897d8a471a69851d6bc3e69088da81dd3534ab410b3a3f55c8cf805341651896a61c919668c97b2db572d15b2799236545a4675d37c1ae6d96a8f640cdac13c66c98e849abaef549ab109085f0190bb5315aad870867630e41133087888231a08be1baffbc0a74cfb84f24ca020c401d79a6e615604fb1bc80b2410a0e9b251ac2714011702717f6ffb2e1a7a3ddab5acf7d3211091471fa02f0838cc14d281850465a6a51e2cb6a5aa8a9560461ab67338b30c43eb49bd5221c26d366b21db0e6f4194edd60ad499052b192c2202b6c7962e6541a8e124410bf0b4ce9964dfb153576960b1ac01966552f8230cb3fb267f57650c783f6765c4c396a864d1762df70ff2f67165a6bae7e8b6c20a63a3668b7fd76160dc0cefd968ceabc3827cb2fc191df6e1472f27015c65a222b0a007a33993ac3270ec3aafe4c869ea2985088269323829bc0304d0c21569a3a14095939224a40c9922f77bc59734b58385be242cc8329fd9a4117e38a72019301bf8c55082186b84724d541529c79d8dc1a54b2cc3b3512bac4127f683b5fb1ccf6d10539eab9c8ab4b875733a903acae2b725854934b4b28f09e966e8e987077076ba508432f02f17322cded648b206020f94171d8b82b413b7cb3573197c83c50b1387eb6caed48c26e33d8cac079fa55ad0c83fb7c045d640482c805b5845ba5a3767098c7058e43542f19e74d9758a025b008440b07a19a9fa9b24b8a4550a8a925bac6f60476ca877a459b60e285feb8a86458029cc31c3643a1949208491ec529e566d9e2b1118086cac7252740098fcd318f2b319a89ab1ea4657f06a5034ea2e4e2a9db6f06304fc27d6002f6ddcb487777d18b7c8994cbb1305a516383667c29a8144be189697e36b068b2b6e2556794e53526388ba53e10acc0373926898fbf1136420c50c01d063b7ba87233b312792b031ac0d8668afb43ef651495663263ccb99e03540015c0a9eb7b88bc888877a766f15c0f28b947aab9d74c212f80c78a6bccc9ec78c97bb5242e25790305b9c222373536c481137ffe5b9903196c85c4ea7620b854170aef2173e69af57ec93aa20168bb679140a4bb668719d8773a1c7bca0415e645006bdf7967ffb55717199dca172f70976a9f1ce41db56e088676377acecc04f7be426a57c71efa95fea2366562b61945a56e7502782c41e7ef46bc4427acaab204a8a8bd78c05471301ca4134d727bb025411e9836d14b2c7117b4e135401348697c0c66a8ac13476d67791247d97d34657514fc5829dede57c05a6404d8044dc2aa84a26bafe9bce4c1aaa8de6a43c007cc1f203d814ca06f0a4643c2b5a650e2061c1a5b7cb30684dcdab80ef3c03eb2a6a52b0c531305486a03c95aa0473a3cd7fa9861c8a9feff0c15e66094639ae7db30863a35730db258bc69b7cbb915918ce42b873c944a7907b7bc014357ae981861c36a1600050e019711360a4e227f5fa7cd54742e111028372057e982e4be277a2728b4e381333902eea825b943128b897c74c109475b3a70312c1830c7ccad8a6f60020149a2a4b843d19daaf10d426a074711b35cbbda9797ab756de92bedb7bb19ba174f7ab74aaf115cdaaab7d09c8e078c4a3954f40a2697092bbe4460f27c4ce6886628382606f395b55d1a29939a2f754a0b82968d3c865f30066c5e21e3e2839416570f5b54f24d347e2e10169571a3935307a4918b5d68ddfea58a90382e70012911729238a4919a7531242228995215fcc96ce8c1970faa902f79c7a7207a93613de0066c384786f5913b24040e6b4b48b6b679e5538f953540c25c18402be1c58762fe8bcee6a1e58d93b21165f95895afefba1f735b11fb7bbfcb40d3d54ba24ca7ef507973aab9017b66a3e271f980462752137d9ab0d1937226129bf48f68b700021b2fabe81573e49fc17819bbe46858b5c58b4ca7c83a57398a667b09c681b990b648e96ce79b72104b13e97611ee8528c9f64c376eb04925ba46d3c8ab859304ce17b9435309726045de17d8a7cae32aa9c80e1aa4058cff89010dfe22daf0a002a905f945accd2f9225739aff1863006b46f9ecba5243bc48ed1184bb9a57ae26c8cda147cacbb4a031112279dbe727fa6c467ead943269ab1e3c9657c19ba0b648c9d4a48c6163a0a79954c0c7ec63529cb8a65c851c39840bb1a7c584104016f16b43da179189343c3276bfeb5839d6622e684b421526d69517ad57b67494bca6db58cf6c95266170ddd9455a6867de052adc8909790659fa0dc0a1d011487b16a1e08bc82b22aa9444f123632ec889719e754993ac8319a72ee83a988a2c77d28acd4bb5ebc486c33b0af1d67a84a349480fbb2b0b252e8749401d8488df52356a75ba2883090dcb757451c9956888b43806431bf9ed956e34806bafc15fcb1cf2b45729eea12a6580c6d1c366a76187fc20fae7657f560973838abaa510fad13c59c5baf4773188859809d1bcdba937845759c9af40dd2f14bd7dc48028a77ff4165f2204fb3b0b9f585061616ca4fc405a0c8533c344334e511053a548ee86998e9094863b8bdc02aaf6bbc916481ac9337acbac10d90794ec239268aa376157b1955379d30c2cb4927a8077cba969ac398bc8521450efcc7e1cc617e69a66fd16b771a2497d14e35a61919dc129844379a314821c333a2f4443651a4cff234a3dcabad32610f5b54d138065d8a5a81fc5068c5060af125265cbc42c580f47b9fbda72a893329999958b026c5661ba116346ccd86633e0a603b48c8acab78662162a9f11c4349c5235a5ac46546b16b25e355b4408456f7339122b67bb48334836214e431955e979244c8c7864ba189eb24c818c15417cac84682f719c9bdd8479be5c643d937605383c6a9514118498d5b4e81d5b74a063fb53cc19a20a9cfa26e479339b988c40918c192435db1a3b2a7c6046376b97aca7a9bbb30335a0e8fd237f8833e89e41a1c67b8aa9b0d539486b1855b9fbb53b5103ab2d19606165acaa588b9d14a4e6a7823800d8a9334ff7456e75aabb81408b791c9c6bc3b5829c1ab241e8d310bb7b15a5b24123a2c691ef1b5dd80640a7b94892aa1ad7300797a3de52a66c794426230640b303e71f0b93654708bd81f706b0f71757c08fcc591525bb6c9a57777bf1bda0d81b4922a56586d21b04daa2684e14ee8c0cd542824205b2bac3c1232f2bd37109d621a25cf570573465a706583da17c39ff3ad13826b6d5988158a1602a361d7a2f86a9219450ff713e184c0f6ea4146b79b03e5ee3454a79f7fe853da745a27a1462668bb66c4348b7f4bf25c70527b360b2fd104cda48fe520a7237801f470fcc2bd9fd7bea8322859b850f7882d362947432913dd068c01 + +# Official test vector 50, seed: "027c3d5847ed4470931141104f25b19ae76117cbb64b224ee424ffb782e9a0e988839e0bded0df666fe8e5fcbb5dbc09" +seed: 2d5df64d62cb07fe630310bb801c658dbf3d97993e68626745de39d37fbfc2b27b534537addaba4ecf14f02ab317d36cb9f0f50222ced7cf029dff8a0d3d2fd9 +public_key: a4163313f3cf10a65afbe14a738352fd20b1931827758905dc32c20cf8adf6c081009ca396f270b23a5f26117862a13cb00b65f5a2850e8252053255b8232626b5bdcfe44e95c0b7b5b09802165b5310122a434c5456136cb3a77c3c7c23fc61271550cf15122fea612600aa722c8646a6760ee18ad6028850fa36b82156c09429fa188db2ec3dc229a78f92112b4357d3681aeb19779f1785195b65469c6d3af60ff063562817c4587225a10c8e9fd56c4353711f287469b87cb533b99df46bfbca625c4601aa86459b27778c7200f6a12ac8e8bc078231a37c87400a7429c476ddf7516fa4b7e27841abacceb3c24e92158eb168cd3dfc48ade061b2c02c33b2a33b59ac45a77a439371f3683aeb6a18b107bc34e7785e4146b3f668d9565cb32a23bea6af6daaae79b39a8f725e61f1355c6965d0ba0cf8da22ace189cfd0652213501b3b5f791061ca929e2fd057f357bfaa4047c28577d2105be1616044a6383ff9a087f4754926338e486cc3e76511c7946a02893d058f7100c98bf0af514a47a7630e6e2564b5459d3b52bac6884fc32c7961a34df387ab85c07965786d6bb731af75742147304a5cac936797ba658fdb88c1939c78565914ddb0334fa291fa3182e31a36d6c159ac637a0d3a37098569a009911f54b13efc46e403ba4bf0bf59499cac06c848754903a7b8a1b7549a13b2de5a2cb106a21a3a58d1d71ba30700d74243b1030258294ee022037ff9c7e752cf0fc60f582b6310d4637309ccaa3940e6617b72c0b0217924febb6f971a56a979212a452796a217909547598330557a9309161fbf7c59004d7b3a88a2c3066534153d99ac87dc5918401b860c1b4d5e763440389290d2b656c97cb9784b201a90553acceaca0f22b17852f391ded7094225053f88b6578678f178067ac944f1fb6c2e99abd946953a49b059babeae527408f520844323d9496e51e88f0899857a07b8bf8586ac7a8d13579ca934161d10c08e3b400f084cbe9c6f21e29523c41bac2187b7470f752b55addc6250c08338bac7fd0879620023899041576191b502c736115e65977de34c740c75a5c5f54ae4fa07a2943a7f5a3b8018461445c3ce938579680b68fab41ea2bb26e40eeb13ac84fc3a38b78dd66186558426cf59a1dd4958427bbcbbc13037c577b0e0551238a67f596cd0a2627965216bf733fe88718d64725ffa4b6e73077a37a4585159c887b2a2f5077d1b457c06102cdab7a0e5752263cacf7914ddf836b0e1a95ac4b941388bf7c5bd62f616726100f448001e1c6e4100bbb922b265942bcf37966a5b61ba4957dd02c484413084985d5b22b37964b5f66c11b27c25af757f08cb8ba3b3115a6839483454239bb9d0a1b6b1bcbba5060c3ae47fd0476107919281a508e0606b4ab51ae12b0866c21ca994817b87244ae55222c0807b02581856936ec0ca25e08c7e604e1f1379914702a9e209d7796ca44879a363cce71a0d9850c8ae8596e9b7157a71052602cdbf1c2ba113341fb8b612f114a82c6bb106c703603eddf80ed634be616884b9f2bb271240ab48126a40cf7c0958e0c5bb4f73185cb41dca542888720f8f930a66a66bb9c79acda38a22249f5240a5db0067a23151a6f02abac2477574d9b5d49ed6c25fc46576ca327d614492eebb +private_key: 6206ad862474f8463a601909e145bb7b68c12772311f5474c295a7bcb93ee331a5a891cce2a69af9e0820fc9ab484a6ca985090035970a587e860126801a87342cb627e769fb9badf4c075aa78cbb127ab20f34d22cc4299abafae49812a5190b95182eb635e844a5111490d754c0674c7a39d8b3323cb1bfd04a0430893b013555d253aa2739ab64808ee6c6b59572f40e3c1e42224c3b20648513172a7895a52b633f63292c04f3e61b25d064ed4834f854c932a897b7f093cc4ac98a22366b184480ba746968523c91a8a0e0980aa8a1d1dd3401966b27b7838ba246ea90432cd723793271cfbb4719e60912df891d7e4a9a63781e8b1bafb40431866ad153bc067d871ed8bb096152bfc1b731153711bb40876e835033861cf981b4de14c24f2542f84c94ea39cd757ac011c8fc5785a9021626f476df9cb687894582348c0ce00af7cd3bb01685f5cd73304011e1b989b1a509660301217130302705c4fb868c1123e0cd633514b4648a347557a9147f44ce88bcf8db4c8e18c826d34ac25c7b5582b3d1d552f2ae28174d0a84b5605d909a6051258d11a941378377f457700e2c8b3901ec33710d179639ae04d661aaa9b3caae38972dd5075d7ca40ff783bf79c1ff4e4ba037c16e3839b76b88ede1779d025841072cb21520f18ecb6e0c9bfdc0379ffa6c074a12c9482ae39b3b51c1c7d02b72d3b844e4d80a8ca3663dc7016e49b0fd686ce826205e463bc164b59bab5cb2ba3b973f7750e61a8697bb1368bcc98aa3d670b7943d7ae89e64f006783e8b67d0142bfdbe4a335a564357202d57566a8d97ae750bd61021cfc9b4fcfaa38f7b6cb55ca53f16b0edfb36ffc1bc4c347c9deb19e75873f2b41613b98c73d346e0ae0aedc0a5154342afa6a1872a73e1ef77f5d34b49f369c4529587c391fe885b0c50ca38f7227adc980df096254374553672992f84e7fc55712a1234fda91c4eb8172128e5c012d75e4ccb0b440afd1787f3a26e0230fe8a35a5c76515e4c4c6b335e60a0b417cc43109c45e6ba639a84377c204adffc0736144d43a005bd35434737c301ec15564b00ff6b8f8b83bf2d99b72a71419b83a39bc3a637276125e9037dd4741f515a41e71dfb75c94e29339a235107f3564e939828ca499986230312caf91045fd6363c9dbb7a822027fba5607dc12b4f19257e1c8832b95b537583fa6642593122eb2c0a25334da883160b9cdaf4776ff14cbe2aa7d28bc271ca7985c1b1f9324042272c1590b737b5963b8894d58670e535775e7c3bea20628b3292a43407cde31b0718678be28b05c11811e1b0016c456d63163549522ea65673e188a27a39783119d70106e9f35b437aa65cc685ae0a200a3b225516b9fd0f4687f3485cec27a7be012766ab18783cc77274c6487bd0ac369ca29a05aa0cd5ff8ac68e7b582392800fcc4ada35e2974bb1da5254ef6af37e487100b4500f82f5c76a14542c9198ac57d699f26005c37b94e7faa5ebd5c62f562351b58bdcfc15199849b33a1be9afb67cdfcb4a201a29c3b61274349f82916c9dbb38a206d81dc5036c51f70293dd51562cee893fc80b7e0abcd5a625470436af7cb7c3cb76309490df6254297f2bda4163313f3cf10a65afbe14a738352fd20b1931827758905dc32c20cf8adf6c081009ca396f270b23a5f26117862a13cb00b65f5a2850e8252053255b8232626b5bdcfe44e95c0b7b5b09802165b5310122a434c5456136cb3a77c3c7c23fc61271550cf15122fea612600aa722c8646a6760ee18ad6028850fa36b82156c09429fa188db2ec3dc229a78f92112b4357d3681aeb19779f1785195b65469c6d3af60ff063562817c4587225a10c8e9fd56c4353711f287469b87cb533b99df46bfbca625c4601aa86459b27778c7200f6a12ac8e8bc078231a37c87400a7429c476ddf7516fa4b7e27841abacceb3c24e92158eb168cd3dfc48ade061b2c02c33b2a33b59ac45a77a439371f3683aeb6a18b107bc34e7785e4146b3f668d9565cb32a23bea6af6daaae79b39a8f725e61f1355c6965d0ba0cf8da22ace189cfd0652213501b3b5f791061ca929e2fd057f357bfaa4047c28577d2105be1616044a6383ff9a087f4754926338e486cc3e76511c7946a02893d058f7100c98bf0af514a47a7630e6e2564b5459d3b52bac6884fc32c7961a34df387ab85c07965786d6bb731af75742147304a5cac936797ba658fdb88c1939c78565914ddb0334fa291fa3182e31a36d6c159ac637a0d3a37098569a009911f54b13efc46e403ba4bf0bf59499cac06c848754903a7b8a1b7549a13b2de5a2cb106a21a3a58d1d71ba30700d74243b1030258294ee022037ff9c7e752cf0fc60f582b6310d4637309ccaa3940e6617b72c0b0217924febb6f971a56a979212a452796a217909547598330557a9309161fbf7c59004d7b3a88a2c3066534153d99ac87dc5918401b860c1b4d5e763440389290d2b656c97cb9784b201a90553acceaca0f22b17852f391ded7094225053f88b6578678f178067ac944f1fb6c2e99abd946953a49b059babeae527408f520844323d9496e51e88f0899857a07b8bf8586ac7a8d13579ca934161d10c08e3b400f084cbe9c6f21e29523c41bac2187b7470f752b55addc6250c08338bac7fd0879620023899041576191b502c736115e65977de34c740c75a5c5f54ae4fa07a2943a7f5a3b8018461445c3ce938579680b68fab41ea2bb26e40eeb13ac84fc3a38b78dd66186558426cf59a1dd4958427bbcbbc13037c577b0e0551238a67f596cd0a2627965216bf733fe88718d64725ffa4b6e73077a37a4585159c887b2a2f5077d1b457c06102cdab7a0e5752263cacf7914ddf836b0e1a95ac4b941388bf7c5bd62f616726100f448001e1c6e4100bbb922b265942bcf37966a5b61ba4957dd02c484413084985d5b22b37964b5f66c11b27c25af757f08cb8ba3b3115a6839483454239bb9d0a1b6b1bcbba5060c3ae47fd0476107919281a508e0606b4ab51ae12b0866c21ca994817b87244ae55222c0807b02581856936ec0ca25e08c7e604e1f1379914702a9e209d7796ca44879a363cce71a0d9850c8ae8596e9b7157a71052602cdbf1c2ba113341fb8b612f114a82c6bb106c703603eddf80ed634be616884b9f2bb271240ab48126a40cf7c0958e0c5bb4f73185cb41dca542888720f8f930a66a66bb9c79acda38a22249f5240a5db0067a23151a6f02abac2477574d9b5d49ed6c25fc46576ca327d614492eebb65297f711f12a5ff123e6de59d1f16878e93a31612015fb961bc572f3e999cea7b534537addaba4ecf14f02ab317d36cb9f0f50222ced7cf029dff8a0d3d2fd9 + +# Official test vector 51, seed: "450751d4401737459c6d93e6c5f2fbcc4a3af7cd7250ccf404bbb817a67bab7b4c9d0ef4570bfe25cf919da331c31d88" +seed: 25056d1b8113bb362dd979d98643d7a7ac9c4f95994c0ba060609b6d07002ff3f48a9254dd40b117941fa35a66bb50296327b725525deef70e128ca8045ec451 +public_key: 25b2ce04e31b6f647abde39d7b1cb988c37f2ab219c67839064481c2539f7c947a5187a850f61ba075a002e4621ebc290855c9e75818e3a99da9e50522976372ea0e6e201f8cf3c49e4a86c503c38ab764b2f45bfd1718f6b5c0d2e66181045be2a2a8a1e10becb8a6bae9569f42654187a9d9b24c8214abf933063526804d0998b89c884b1055a56cae82557455f3a47c677e8e262fe9569aca0c5b1c0cbbf768302099a4cf3960f9d432a0865031e2b65ddaa43e00aae05aa39152256061021669b8f2ba6bb31045e7e539830095216a846aa39d5b16bf69e152aa227c61287137e2b29d3931c6211510ea33325b2ecd20a1bbab9d30a7ad9bf83e3058520606641dd23b092831d29022542513070c8626a42386c8177c7bc1ffe5754ef5b3a2c41f91f1463b7b068816b058da287b4ac2ad82191d061630337d296a08a02030174a219c143224b4b1aa1324feb23e7d52ccdc757929342ebcc02c9a080aaff12763894928a16c1f7830d7dcb2ebd77837d97011001d83f3512f9578efac3ce1c0a17da13b375c44ac8c32e616aef48339c19a4f379c216feb9672c20d78262fa99887f92324bf667502517cd42b340b51ac0d0c71c2ca5d357554eed04c1206baee66707b10bf52a424fc7567ca023b605a0e160aba5be5aff753983b19938205188fb87a867b6cea58112a3323c2ec23a92a1c16b48f8cc7bc55c5b18a33b67580cd9383275e7b53d053aed3f41f1a74859f3536a3c07832d4b64d6a9bd591c4a1901c46490efd73c9aaec1466528bfda0af55fb7a28f4af2c332de8024f87567e1ef87dbf3061ad29490c658b8367b0b911ba3c3c91e48189c8bb1cf3a229146cb537958bc1b427add62348ba0b54718753acb2ec3a0783c58c8b6b1023580a3417cc08745feb9b3f19397fda09002cb019be30a8d3781c936847d5c7c5a8e9a7b5d8c18bc5877ed4a8d787a7b11a0464440da596a4250308398aa9cd482e0f685703058987b63e21c530b3b5367654bc30b86fe6f0645e328714fbcc0f666bb8eb28d7279339f622cb89b813c72dcf5944ecf68e4ce422744abe30261ed3e127118cbdc1d224e538b48d441359d673470978bd4b5913b6cf557760389b3f6991344d4b622c7a332239a50626ce553a6e0677bdeea96a3efa72931b6921a23be5cbba9f51166be80a542b5f341866f78225d50a608e95bdbaf02a599b7a2441537f5124b0d5150a19a7de9ac2de2460b80884512c970e7c700aa259982bbda59773c415844b272dc45807f9d641c9443717c61bf9fa9201568868655e0f791910b5077cb77a93e40b85211f9953014d953fd3f8780189840af9ae60da1fc6c48d19d88dfc689a8421c28f569bfc5184ed6a66a50202bcb51425202b6428187f0c7a92d2ad1e7a35d3bc7f7d7664cfe9765d217f766a3c068149964b7c9bdb328a7821a9646ad53a8bded2912c3c714ec81190c966c703a5b9b6bc74c89e2e0635d614624c5371efc4099c00576d05aa5552b862455fd14641e1e80f4b468cfca6cc37e032079617c6cc3c7cc68bc8fbb3329c9e28c1caa811cd6b8bcde9ab6ddfcc98f9534f3d7aaff2a508b3237070c39e22b43a424b2af4ea59c9920d24d6cda3885cad8cbc7a2e3b82554fefde1a383c558139f9e1808c824829ab0e +private_key: a8a66e47b025073a79d8e2817c64306dfb4da1390d93060be758ac111030fc2c3bf6147c63981ce6399f31e5941f65b96c13c9b09a0ee6a08c9171ab262a400a926a628b8ccb307f9bdc7eaa06424c071bc7105637e90421eb1c8db616ceb2972ae38cae319c3b181686a9adbea05305b258a2a2a965630beb687fb2f47b9a4a770d1370781b2526ca326261cdee50ca3ee802a9d5b8e1944b67fb4db24753756b9eb4289e81f1cdb1684c00c58c9977892eb7ca78b205678a352d3a7592e3970a124c9aec88b521bc26a368db678a45682d4208b9e1b099c5cb30506371c8a44b2113931e1bc1fd88a43c91b650c312c733c913835f7118b898a27b7a4a75f927a03fd914ce627d9e156b8153584f12b753e62a7148bb83f83f474985701c6d051110cf270da672a5cc72c85f560aa7b91d99539224159466387de5d39f9254b46735a0c30ac40f2b1a180a8ee30bacbd09cb45d52a4bb8336c269a78746f6a337f44604de7b76690d23e71fa307c315c377555dce8b26a945baf1225df553f518aa453b823fb618daee2aa5cf0a60414af7cf39aefa3a2fa2944d139869ffa51dc115e2ffaa1abc7438b776a7b2a869d03b05aa0238903008372a3975c36d8d6067caa75152a0305b6614c3815a589a332a860a0d1c6ebe2ad2d68b7bfa1687242960f8b8ddfab9b3e851d4d814c94371b4c9b26c3838eadf70daa5abb4952b01a44cf5426b28b4c8c2f66bca49a21e5763501708ac050b1f8d81b4bd0c0a0e5c171372c877c31882005d65580da2b33165b87eebca160c50ee970b8e1567c9ae1132b65a6bd414117eb4d2a458520a55876f17941f38045b117ce004c299208220c16d10c70124529ac8a10980cb481d069bf0319bd990e34b31ccfe87d3252bf51c2687b234246943b248104baa9ba21015ffc92877d550f5e0148c36bca544c1b1f613afed6aad1132a91aa823b1accccc3bd43b94c47b902ceea431abc8ee15aa32c1b3da6a605b0b5b8ca905c7492a9bf137f2805133275bd3cd98cd5453943058a668456e9a334302c5872307ae5db01de5b4808d477eed39efc00335f31116653cee8f81b6f147d4dd9cccb080c2dbba75b5310c0348ff8ac88e09895422c371358b248509df2d46089a5514f919ff271cb44bb70fb61bb2ed88f6d111dd8b38e155103955836be3812bb255da8db97da862c5a2491892251280c6c9dc779124c08947251f3574d3a5998f8ac8c68881927733fa59816c6aaa629d7893a3313a327a9e2401ffa5c8436f289e167ce68f4a4d232c84c23133d4b7f9b43b7e7ac8060d9bda7d11aa648add452423d91a0c7b3702da16bfed820c0f1420a842a04759f4dd336b1858d0af93b81548f2c8cc8ef064bc554b1cc6cce84968f8bf991649b59f5ab51a6e56375716e1d3074c5849e28f961d75b6f33275819342467e69498a713caec4e78f9b6c1ca774b026703167270e14b4209a9b5353cf6949eaf5c947b458038ab9761f6bcba06785852b78b050d83d70b5c845cce62cca1d8723b472907d6c8482224f10318219c42ee848425787640636a7eeb651e2a2bb5207928a68f65a6318743bf7b43c223549590463ac38acfed84aea13a9025b2ce04e31b6f647abde39d7b1cb988c37f2ab219c67839064481c2539f7c947a5187a850f61ba075a002e4621ebc290855c9e75818e3a99da9e50522976372ea0e6e201f8cf3c49e4a86c503c38ab764b2f45bfd1718f6b5c0d2e66181045be2a2a8a1e10becb8a6bae9569f42654187a9d9b24c8214abf933063526804d0998b89c884b1055a56cae82557455f3a47c677e8e262fe9569aca0c5b1c0cbbf768302099a4cf3960f9d432a0865031e2b65ddaa43e00aae05aa39152256061021669b8f2ba6bb31045e7e539830095216a846aa39d5b16bf69e152aa227c61287137e2b29d3931c6211510ea33325b2ecd20a1bbab9d30a7ad9bf83e3058520606641dd23b092831d29022542513070c8626a42386c8177c7bc1ffe5754ef5b3a2c41f91f1463b7b068816b058da287b4ac2ad82191d061630337d296a08a02030174a219c143224b4b1aa1324feb23e7d52ccdc757929342ebcc02c9a080aaff12763894928a16c1f7830d7dcb2ebd77837d97011001d83f3512f9578efac3ce1c0a17da13b375c44ac8c32e616aef48339c19a4f379c216feb9672c20d78262fa99887f92324bf667502517cd42b340b51ac0d0c71c2ca5d357554eed04c1206baee66707b10bf52a424fc7567ca023b605a0e160aba5be5aff753983b19938205188fb87a867b6cea58112a3323c2ec23a92a1c16b48f8cc7bc55c5b18a33b67580cd9383275e7b53d053aed3f41f1a74859f3536a3c07832d4b64d6a9bd591c4a1901c46490efd73c9aaec1466528bfda0af55fb7a28f4af2c332de8024f87567e1ef87dbf3061ad29490c658b8367b0b911ba3c3c91e48189c8bb1cf3a229146cb537958bc1b427add62348ba0b54718753acb2ec3a0783c58c8b6b1023580a3417cc08745feb9b3f19397fda09002cb019be30a8d3781c936847d5c7c5a8e9a7b5d8c18bc5877ed4a8d787a7b11a0464440da596a4250308398aa9cd482e0f685703058987b63e21c530b3b5367654bc30b86fe6f0645e328714fbcc0f666bb8eb28d7279339f622cb89b813c72dcf5944ecf68e4ce422744abe30261ed3e127118cbdc1d224e538b48d441359d673470978bd4b5913b6cf557760389b3f6991344d4b622c7a332239a50626ce553a6e0677bdeea96a3efa72931b6921a23be5cbba9f51166be80a542b5f341866f78225d50a608e95bdbaf02a599b7a2441537f5124b0d5150a19a7de9ac2de2460b80884512c970e7c700aa259982bbda59773c415844b272dc45807f9d641c9443717c61bf9fa9201568868655e0f791910b5077cb77a93e40b85211f9953014d953fd3f8780189840af9ae60da1fc6c48d19d88dfc689a8421c28f569bfc5184ed6a66a50202bcb51425202b6428187f0c7a92d2ad1e7a35d3bc7f7d7664cfe9765d217f766a3c068149964b7c9bdb328a7821a9646ad53a8bded2912c3c714ec81190c966c703a5b9b6bc74c89e2e0635d614624c5371efc4099c00576d05aa5552b862455fd14641e1e80f4b468cfca6cc37e032079617c6cc3c7cc68bc8fbb3329c9e28c1caa811cd6b8bcde9ab6ddfcc98f9534f3d7aaff2a508b3237070c39e22b43a424b2af4ea59c9920d24d6cda3885cad8cbc7a2e3b82554fefde1a383c558139f9e1808c824829ab0e51634cb33a2bc3fc22ff47b58d7879d703bdd661ad3c290a6d812485ef0ce8fff48a9254dd40b117941fa35a66bb50296327b725525deef70e128ca8045ec451 + +# Official test vector 52, seed: "5de720f2d152bf4e1f96a61e7ae5f1bed6b8548e32638c2ccec9f43b87d1bb43dfcf334f0582984d27e440d519ab662f" +seed: e4d34e12982aeeb1d62fd488d9b9e28557ed3429292239fb4f76fa9098009acae6c45c7fc62329b13c8d29844405db8ff6860de474bf727ecd19e54e6e1a141b +public_key: d9f945a651693bcbb0c7a385928129f004263fa16bef92ae400780966a8ae8750e574947cf6a607fa4b3d252c77cd9925ff3a89e762378ebabe4c413af52cf969068d86acb44683222f93bc50bc8f7058def77a3241173222359d25c3a87c817461210c6e4c30d4a428bea8b2d459c4d9c71594c597fb9c3bd17598afa098329bdd15b1c23222f0f39189fa06319bbac7d6866ed7953a2c933b3479235790942d6146a818edfd64227e78bb47168709bc5e490291234929206a3fa1c2ec9359888641d61897927f0440929294439095db0244a05c20f9678b69ca13268622d174a915a210b8908328b162454c1c0c3c36b8acfe4ba2c38e0279ac15898f393f01468eb23a8db1567ede8b493608d3194b2f2f82e91e739479c35a59267a1c84fcc5a1ac12289b3e5845d0c8e9969bba50211ee716774ea03514c3b7359892bd4b8d9db4fd006af53961687e5b0d0fb9e16fcb3764b1b0271b9803019048048cab04e60119c8a140b401cc8c5f5770863b066429e71c8ac3751536dd3cbf4e775c7778c15920849d4b1c1b6ca9ac63d3de47cda549ed009b4ee7759fdd66eb5555b199022846671b1a819aa732a23e6bbd27605b1fb22b1aa71408b2e55bb651c1a676e13a8e9cba2b65b246b6683ab20820ff40eab949eb219851a7c2e1bc1a4cb7b06cf526bff6b1ecb4b5ae4d05dfec33de9504d2eaa4538dc9b9bb39b051ab7d2239ae0b98a34f55474871cf9059e9bf463dda3895e32c27a534737677e40527313ec993144841bc756e9222d756c3c22e56ceaf336e107c3aeec9b1dc71131271392b4a4436a14292aa0e24957534856e30ccff827cb3fdb31aaa086298c59ab71278885308803591513870867a018e61d2705b48210240739ade4c7100210bbbcb524966a9123aac92cd711f5da3b5b614eefdbc39bb36cddf47ecb196840ac84a6c721f1fa2f031c022844a64c4433f414a707992200b857ada964d17c6ceef31186c248adbc83ca2a528738ac567c4c8afbaf8ba57b3f42700dfb8c563b5e494c6679e69acae47a9bb14c79396bfa2593d63224e29cabdd0991101496a0380ac19b759cb0220517aded8371ce74667dc827c1141a233709fc47bd5ea6664c0b6c2182aa9a088df3c92bb5e6047c7b03bd9c4347db41efecb80fbbac90662c0d56b8f91b3f3b7b3417d592994771ec3695e94cc3ac73747f279984b7350ed9b9400201ed35b785f0629225af64b05bb5b6016ea50a8689c9ceaaa234748400db67ef9514e7ba63c683b4f5f6b35869586f0058ba7b9c4bac500a0034bce3b2bda7c5fd5c8ad37c6466a9b877278b7773ac79809222f80eef341236053ad1d0c95862796a9702fd977e820420d611c66163c5cd6c5fdabab7ec96a51bb24328617e375367ee616ecdb46089c6604909d055033d53d828c7f8cd6de0823022babcf521aaa67959c1881161620e397b0a25682cbc805a96a84bb84a9a99acfb6012e2ecc2e5bc1518036e40dbc3347caba399178ca912eb8367c86070833137d1bca5b5b3186ad23c2e76a4cc467d092102ba081494bc7f963a9a6ae575d2c57a38371be5b164adf29f392014d11522535b0173126bfb82721e153e74049c1e170144484dddc2716b4c487aa0398ee9ccd2804df58fab8e2d32ac05bf22a8 +private_key: a3854bbdf04e2f617b377ba9d5c1652f27b377bc73f4828fd485afb4c2a7ef05a02b1a1f06a707d68799ba1094f1208e52c9c44ec15580c6599cb244cd2617714c7ea5b07648f91d2230bf35a6910371289dbb7a6329436c4ba502c83633b64f99cc16f6c641ff62254c65511584cbe208a080495762eab49d57253063a50fb45f61544d6ad39a4a0003c4e05d193a59efa80949e1400643962e896c0c9a0c2af30e586c0821388292768538137195009d907853aab7459925498cca238419977c36bbfd326acb9832afd3b46d934255a10a0aa0932a7abff1402da645c0d2cba5d03abc21e0c09f9ca9f28032207a707b21619f7521b9a228386c29a89c53c38b8bd2db9fa4fbabd79421551b6f4e1c489c0a3692e695c73b6f04bbb2be72516ebb523ad794e9101b4cc6b7b16c5f7c2a8e41aabcdddb3f070a5de22a52b80165b3c6872f279ff87ba6eea982bb741a768640d70797724841699c45ab10a522b74c53e55a8a8968afd6ba69bb39eb4489e47343f807424ebb8b4ac8097f43b2bab8cc37990ca185a19c9c6b28dbbdb7822517670ca050ba28d724176a7a3e887bb47bc4dd648b41cbc6b52656405ca5f4e7cb06e64477b2806fa3b52afb3533034cf4772e4a383563aa5a057a6738338f92d9070ec94ab05489e278bc6688a98c2ab7a18ab86397631751c47df75ba27a801497517845b99c0b692afb31c95a78f96267cbec760743cf92140f1ed46f1cd5840d13ce1df028238c941c6044511592d2520188e86690707092eabbe9505cfba46b710b642ff2a87fe7a3d5431773378e5efb378e627058000b4921ab6e6368677492b2eb2ee219ce2e6633286b73863451ca01cbcfa570b806b5d2d5a2fc237c44d0a84c0ac097b8b299446c63a47f2c93a87c95c4b02a3d160bce70125c9073ca35f663e0ec64a189565460b8da009778a8324de7211d072522476418a6c33c17046177359f9bbe5fe72d2ca483bab4bcc05440fcfa67c17c326331b65a04acf68c1ae870208f41c66057c3483c8b2870a3308bb90a5ca085ea8c15891a39a0ac3b09297c99320568504b4284a035be76380e368018394a66be5b2f45dc3ddbe6179ad60860123d55b28d270ba24cc0a49aa5a30bca256d7148ef466b468c06ccc8c2ce439e75953c07013999ab77532b13c9e477905997ffa42f6b28c90f9471ff6b2477e7b311b34c89277803747257791a7325cee25246f656cbf57391037a3e90d74729b16b1a5175eca2871ebc7e4994b3759089e215933144909991550cd812f8f29658852ec11b3b604aa07e47c5db88c98143467ab358db51b5372124af9c983e542e74ba6f273943a646065e603f11395d92ca09f1771adc29c6bc202a9ac159ef356d3934a3a9c073ad459e1de4bb1d81ba30143302013d7043776db346d2239dcc81305386628a2c1b364ccc606804604669ada153ce5a7e6367838a6cbc8971ca750342170509e4124c09846314185387ec47a501a0c5243adb14c39c1105938292f09aa117a5bfb4649f8705696097466f25b32c4a382c877d82d31abdd6b364b936f617b532b29c837a375846bc44635c8d55a5e5dbb44315090602830ad70b50a1cfb92723d9f945a651693bcbb0c7a385928129f004263fa16bef92ae400780966a8ae8750e574947cf6a607fa4b3d252c77cd9925ff3a89e762378ebabe4c413af52cf969068d86acb44683222f93bc50bc8f7058def77a3241173222359d25c3a87c817461210c6e4c30d4a428bea8b2d459c4d9c71594c597fb9c3bd17598afa098329bdd15b1c23222f0f39189fa06319bbac7d6866ed7953a2c933b3479235790942d6146a818edfd64227e78bb47168709bc5e490291234929206a3fa1c2ec9359888641d61897927f0440929294439095db0244a05c20f9678b69ca13268622d174a915a210b8908328b162454c1c0c3c36b8acfe4ba2c38e0279ac15898f393f01468eb23a8db1567ede8b493608d3194b2f2f82e91e739479c35a59267a1c84fcc5a1ac12289b3e5845d0c8e9969bba50211ee716774ea03514c3b7359892bd4b8d9db4fd006af53961687e5b0d0fb9e16fcb3764b1b0271b9803019048048cab04e60119c8a140b401cc8c5f5770863b066429e71c8ac3751536dd3cbf4e775c7778c15920849d4b1c1b6ca9ac63d3de47cda549ed009b4ee7759fdd66eb5555b199022846671b1a819aa732a23e6bbd27605b1fb22b1aa71408b2e55bb651c1a676e13a8e9cba2b65b246b6683ab20820ff40eab949eb219851a7c2e1bc1a4cb7b06cf526bff6b1ecb4b5ae4d05dfec33de9504d2eaa4538dc9b9bb39b051ab7d2239ae0b98a34f55474871cf9059e9bf463dda3895e32c27a534737677e40527313ec993144841bc756e9222d756c3c22e56ceaf336e107c3aeec9b1dc71131271392b4a4436a14292aa0e24957534856e30ccff827cb3fdb31aaa086298c59ab71278885308803591513870867a018e61d2705b48210240739ade4c7100210bbbcb524966a9123aac92cd711f5da3b5b614eefdbc39bb36cddf47ecb196840ac84a6c721f1fa2f031c022844a64c4433f414a707992200b857ada964d17c6ceef31186c248adbc83ca2a528738ac567c4c8afbaf8ba57b3f42700dfb8c563b5e494c6679e69acae47a9bb14c79396bfa2593d63224e29cabdd0991101496a0380ac19b759cb0220517aded8371ce74667dc827c1141a233709fc47bd5ea6664c0b6c2182aa9a088df3c92bb5e6047c7b03bd9c4347db41efecb80fbbac90662c0d56b8f91b3f3b7b3417d592994771ec3695e94cc3ac73747f279984b7350ed9b9400201ed35b785f0629225af64b05bb5b6016ea50a8689c9ceaaa234748400db67ef9514e7ba63c683b4f5f6b35869586f0058ba7b9c4bac500a0034bce3b2bda7c5fd5c8ad37c6466a9b877278b7773ac79809222f80eef341236053ad1d0c95862796a9702fd977e820420d611c66163c5cd6c5fdabab7ec96a51bb24328617e375367ee616ecdb46089c6604909d055033d53d828c7f8cd6de0823022babcf521aaa67959c1881161620e397b0a25682cbc805a96a84bb84a9a99acfb6012e2ecc2e5bc1518036e40dbc3347caba399178ca912eb8367c86070833137d1bca5b5b3186ad23c2e76a4cc467d092102ba081494bc7f963a9a6ae575d2c57a38371be5b164adf29f392014d11522535b0173126bfb82721e153e74049c1e170144484dddc2716b4c487aa0398ee9ccd2804df58fab8e2d32ac05bf22a845cccc2997b502ed631257065214ab9afed11f00ca5c18c92c4d6b917165fd1ce6c45c7fc62329b13c8d29844405db8ff6860de474bf727ecd19e54e6e1a141b + +# Official test vector 53, seed: "d71729dcbb27d7cb39e9e905025d3e55c8602efbcc483c9b866ebf82326157833169243c14550ad728bd1470f39c642e" +seed: cd6a99396eb3539ca663a51e42063a3a262cc1c5a5fce1566f0597b52ad9fa325a3407f591791a5db4578b5972093a95bec3b8e70c1d542c9b5c9789729f8922 +public_key: 698035eda89cff189f730a05dabb3254297561072317010327d4222de388a7e95d8d0076665061705209d59984540471fc61032904b13dac27d520a2b7cb653a68a46623316557500cf4bb6f71ac9b5ca17d45331ff06507d5732829af25417defe7aca7364d99041448328f57d94f1af2572f7468da3b9f2e432064144f0396c1a8d95ce9951530a3b33b092d67590b307944095c50c30762435b76a5dcb3af494a5b112fee2567664a376f3b30c32172059631318821de71ad62b0227d9a91530a5ef2e6c2ecf925fb95302598b722a991e989a1fd198836fb340fe44849ca144545a5a14b46f464078529bb6dac09d148949e91cb0d7912f8701d84aa48ddacbc1aab0a4eb63f9ba41465f03f1bf4b4285cab3e315acd8a3f79c465d1d31fb50670423b278f042442e2b5797483f5a2bd21e83248e3039626006d7124a324281545b8c4356396f413a1fa67577c5d15c638b7d23199aa5343473dd5b45b66f41d451358f74b82a3c18627a60c08513d34e14e3f2a4b13d7332fd8014ff817077b7ee2db80a9c00eb1da79c2193201996036d214ee7b238d82afc2e3a226159ac05240e6683ad00a55a006190a279e116626b4f70fe345594d21a8d54b9017a76d6e2a61b9585bd5e378875ca26ac071d6b1546ee99d716cb8587b7a4e184c8119cb3150611389a8ca0bcd1ab6a7107942769cce08c00174a19305d438a7a475f2a29b28d230a016479f8aa8da24273c15094d3c0e10a8a0f0d3344169b81ca508e6cb662a4ba28c8693b9a27bd46a35acbc27a6b7cf30292064b4aef36bb29909af11d8924ee59af80b5871c2bdf0c53830a360688ab31a94cda3b12c0f61ce341bc0566ca6ad1cae54989aa3083707ea74680ac1fcb254fe3866bc9c7fc33189d3f4299a8a0a985ba3fbd51fbaa45d26aa352eaa710826aab8f600ff8a9554c842657a3cd2d6588f42063e9c08e9955ab7f3ca032b440c7889595a3454025853ba4070f1cd09dc26392b2657c526052373eac80c920c58c3a24827456be174842ed722487c64373b2457836f13c4065dd7b555f3914567cd87426e1196bb03c08c7a77c77d586f18e9603f45b1b9675bc62a4e71f215c3d7071729b0a8e9069f35ab73e55948f9c3e766c4f150394716b198721676495416e54841908cf60148a7104a4df00f21a10fcf508ae9438ba162291e5245afca757ca88ed577057f543921f670b262a0022a4ea4044318a4b1af8a99cdac8e1e550b732157e8ea9194970f786665c817299a7914b4c0b3394a57adb179bd3067897421a09410a34c658daabe6250047bf15b76f826bd371f0c504a2cf9106eca67816a4865b60a87d48ef4753f90132663fb26a5fa08c59394b6770ab13081aa200c79a6802ee826396cc9b3ea9cbfb482d601952752758cb7cd18605a9336735ea2322bc82b7bca773be27f17bb8726a8cfa9070b9aa6a77cdc0b64081cbfbab45c4314f855a953231c6fb6149bab90707b87239c2f7c7103bb9b2532180bc1f16670d90b7b77c6028c4d4bf92195ea54bee1150c25cc363c57f812a0754c9bf66470ad820e12133ebf44810b7318d2a79e5eb98c17c40b0ee10179f1b5b6870f26d27ebfb588f3a0d02e10a041ab4e3b97c35070f0da64f7e0e7076ae69b2ab51a956cfd04f8 +private_key: f1cbc95bf8705ee2aea2832134f8b633a20a3f3b6a82a2cc688728de320944ca5e74b42744e4b2bfd860ad6920f671c4ace706ce8903e0eb9f434364d1c09aa3f81303b195e704375adc01242907f12173077384493049a136821ca239c7889fee120aa015813f987611101bbba9115a026c3766264374ac28b0c9c422b844889df150caf94409fbe61f08daa4dc4b6bc3e0c866f82145fb813dc88bee809177b13c2db2ce1c3b8e8c93c8cb86aeff1383adf0afaf5600bfdb178fcb56c899569bd497ae05186f19cd9e6baba7cac85f6317792bc6da6c6222da77b100595e84a2c9a9b9d9b131c9a0514e9c8c59c3b1a12637fff8353d468239358834d11bb0fb0cf6f37a461132f8bb5559b26eb03c0e36872399ca6e5b18a05aeb934516a484116ccd72bf780379d82c396ad39eba5b48dda856e0c82f7b9c4ccc36b20054cf5d1b2f0ea00333527c6e6977a775aa2d58b180609ce57346f9e8a2b686b7d85cb4c58a2bb938b26dbbc6ccd685a6e309838c9fe2e335b74462c2f7c521490ea527af3dbc91034c74e3e94a69e42ffc290920d64f4d662ff436345c06c242749ab140121ae330f254478d851d5f34048c2ab65c8460e8020499c33b4cb9851985817c62282dd49da96064fb2881e18697696960d9a52f409a2e3136368c0c5146ac3ed3b4aa580c143ba22ea9255397203e95c4416161447698bdd6dc462fa5cbfce3933a3cc26b2ccd5295c3e3b30429493244f63b811640f2111e86b54146d59b2e761c793b4920939c88a0cd12c882ef8192fac7bf2af22c08580bb4e20226ab02428731b72a81cdfb654ef9286b73713ecb2c90341e78a8b0d6699f59230b298a658648109b003840a2424aca7d30d7c15d3704fb88c6f66592a04ab803e83eeeb4294b2bb5c6f957b65a6aa8c88a88f5337411404ac7cc76857aeb3ac07ef32d8bf0402cd135969669e2743ce7f8060cb06be964991e797923bb291cac6e78a8c55c65a85d402e2184491e474814086824836405629f0e68cd2f86691df301f00ba2ed971fda2222e1322101130ff1f1a2d870280dac8cb98a29f93870047915146aa8a486afc16cb4d01458edd0b4d5b027fe2a6c4a884ee93a495a5c15af938e5b37aafe655ec6220c0d88557801890e6805c80a3b5e0c395548a19f404a4a6286e041a95506be194a7ab1d7ac21f52932bb3b5f5393e5d5173d2c7c8653b9433344af489f7102199523bb401cc75d80c8ce1162a69627e3a743b3201534c9bc21243961f7011731c1a3e01fa3847cc08ba7d1970e2e70b3f0c4349e707b40bb9c4b5519b8642334a97574529fde05927b25b8c13bae1e456b87d90087551d0c2918a3658e9a9b7dfc105ad9f0cc7a180bd0d0aa5042702afa02fe67801137a1faba5813f2bbcec3b05b1aca701385e159031fe9043199b07ae02682a0861812749294bdd42b6d09330248fb52fee84e98b68b49830508197a06caadb913295095108f2ab2b4854fdbc44742c673d0f55626e726d0ba68ab3508b7304d767b7f868676ddb33c917ba37b5b0c8a831756383235b81e872114278c2ffb29668df706b38153bf7b39a388b9cfb38066177b0695a511b0c9e6c709cf0cad698035eda89cff189f730a05dabb3254297561072317010327d4222de388a7e95d8d0076665061705209d59984540471fc61032904b13dac27d520a2b7cb653a68a46623316557500cf4bb6f71ac9b5ca17d45331ff06507d5732829af25417defe7aca7364d99041448328f57d94f1af2572f7468da3b9f2e432064144f0396c1a8d95ce9951530a3b33b092d67590b307944095c50c30762435b76a5dcb3af494a5b112fee2567664a376f3b30c32172059631318821de71ad62b0227d9a91530a5ef2e6c2ecf925fb95302598b722a991e989a1fd198836fb340fe44849ca144545a5a14b46f464078529bb6dac09d148949e91cb0d7912f8701d84aa48ddacbc1aab0a4eb63f9ba41465f03f1bf4b4285cab3e315acd8a3f79c465d1d31fb50670423b278f042442e2b5797483f5a2bd21e83248e3039626006d7124a324281545b8c4356396f413a1fa67577c5d15c638b7d23199aa5343473dd5b45b66f41d451358f74b82a3c18627a60c08513d34e14e3f2a4b13d7332fd8014ff817077b7ee2db80a9c00eb1da79c2193201996036d214ee7b238d82afc2e3a226159ac05240e6683ad00a55a006190a279e116626b4f70fe345594d21a8d54b9017a76d6e2a61b9585bd5e378875ca26ac071d6b1546ee99d716cb8587b7a4e184c8119cb3150611389a8ca0bcd1ab6a7107942769cce08c00174a19305d438a7a475f2a29b28d230a016479f8aa8da24273c15094d3c0e10a8a0f0d3344169b81ca508e6cb662a4ba28c8693b9a27bd46a35acbc27a6b7cf30292064b4aef36bb29909af11d8924ee59af80b5871c2bdf0c53830a360688ab31a94cda3b12c0f61ce341bc0566ca6ad1cae54989aa3083707ea74680ac1fcb254fe3866bc9c7fc33189d3f4299a8a0a985ba3fbd51fbaa45d26aa352eaa710826aab8f600ff8a9554c842657a3cd2d6588f42063e9c08e9955ab7f3ca032b440c7889595a3454025853ba4070f1cd09dc26392b2657c526052373eac80c920c58c3a24827456be174842ed722487c64373b2457836f13c4065dd7b555f3914567cd87426e1196bb03c08c7a77c77d586f18e9603f45b1b9675bc62a4e71f215c3d7071729b0a8e9069f35ab73e55948f9c3e766c4f150394716b198721676495416e54841908cf60148a7104a4df00f21a10fcf508ae9438ba162291e5245afca757ca88ed577057f543921f670b262a0022a4ea4044318a4b1af8a99cdac8e1e550b732157e8ea9194970f786665c817299a7914b4c0b3394a57adb179bd3067897421a09410a34c658daabe6250047bf15b76f826bd371f0c504a2cf9106eca67816a4865b60a87d48ef4753f90132663fb26a5fa08c59394b6770ab13081aa200c79a6802ee826396cc9b3ea9cbfb482d601952752758cb7cd18605a9336735ea2322bc82b7bca773be27f17bb8726a8cfa9070b9aa6a77cdc0b64081cbfbab45c4314f855a953231c6fb6149bab90707b87239c2f7c7103bb9b2532180bc1f16670d90b7b77c6028c4d4bf92195ea54bee1150c25cc363c57f812a0754c9bf66470ad820e12133ebf44810b7318d2a79e5eb98c17c40b0ee10179f1b5b6870f26d27ebfb588f3a0d02e10a041ab4e3b97c35070f0da64f7e0e7076ae69b2ab51a956cfd04f889560d4e598328f6302a9762bda2b0f29fa8ee34fe48dc4847810fc6f44cc1985a3407f591791a5db4578b5972093a95bec3b8e70c1d542c9b5c9789729f8922 + +# Official test vector 54, seed: "a7c2c8edb3601396beb2df0657ec82fd5780a2723581a9e03dee1cdb018440439bb1142cab0487c5d136e9af46338ab7" +seed: 6c8c53ed6f65e6b2e324b84364e10de42d1c26a106d4d1c99eee79c78586fb55b9402bf02481ce4b27a52e87feb92c4399c7f2988d40e942e7496ad15ad2aa88 +public_key: 4981b339e1a1368287fc699e4d50bab5ba45320968fb7cbfb358c92e2564944571591211b510a5b044663ffc7deac3546a8aa060537bf36229bacb4c5d918726b5ae7dfaa45f153f329140106a80b3c54eaf273384dc8e47f58e68621f3be905ace09a76ec9839ac471f9404c196587cc95d90166a247029aae0802ae3cf6983355b330bc9c6a4748a6130aa510ca1afdb876ad0d7b2653c3c88079e14d7898ee482f34651b7a238f3f07bdb4989740861d358384a4863c39b8912259bd78653386801d2450cabb6bb7fc287c74b2cb24c5688b66f7952c289eaa5051b938fc833f343c273652e4a1a6ee6c35c8c8131ebb63c82d38046b41343fc0fc660168931c899088c92db171f75b1f691577e09ce56435ab060c8fc084068133cb67cbb0fd36a73d8a21200623ef324256b99b0f60841ba9cda515f62a978881318fda87c95664e4a5755c72026369813dc90c8d6c18f48d61c10e49a7e9449f95492f0e4ae14f6969b654fd39bbac79c7e0b507559d5137d2179b59b21dc60679cf1b455b94208d87514c008898a95747ca9b530164743a6f9f1878f7badff6a4b2023ca367944f288a399c52648f834c28014b0f921ef04127ff4ac656196c034c0db9a7e8ca64109b904b2427fc601732c12241cc32589790e3bb71d924c184edb521d3b090a90ce0b296365ec6911341ad4d8cc7c136c87469f1ff101faf3488f89b52e98b920a659375125b48c403b4ba3175bbc6cc5a2ccc206dcca0440d54c6dac74ce4674e46444dfb4b5070926074c089c28c5cb11cd4c9c715af34aac79644cf2ad471213889c5e7ba92d114150233c673e505376f21dbc999997f43ff9c3b0f8f1b3dec09a4ca3ac581b9192984e43999f0d34aaf32218b02c8aa2f21c579457f204bd18191811e7bd6e4aacca5aa7c6f41fdd192bcd24760a2243034021b192575bf811e1344a25e1629b019564c39b09c88ef9b1ce6761066030bab14ac202bb6a8d858c3fd316c4fa81d21904ae691f6fe7931dbc93afc09f18f3b278e4c453ab5081372c093a9a38ea1622379f56397ec6c47cb7067fef7225c952c262792dda68135e45c3c6cbad23593ffde806fecac55d682fb23839b37186d4a40b83641d9214b7e0490e305807745534de18b9d4bc5eea755cc117b68b7a30f76a9458708249f02dfd59691f0b720f257f1f96cfcc3573c5696ea33017af14a843b81ea58821db21b73a9b80ca187685dac1f8735ea219cd01c6688f5bcaf4611fb3b58ad65b8d7c8ba4ab950bcad9b23d5b2d0b718397e111feb25f1739ccdbdc5c41d943e977aff5209134722dd3d54b923b511661127b284ae9ba0c27f05aacb20181602d9bfb32c3e255e7f48735bab94e515529a9591d51be015a009a9094591c7e07a13c57e636b6e11cf4835a8180895a6581507805a1c7a39ab05633798aebcaae89e37d8d75b4f34c73c2184ffb567069f0b3911943c2060f34f10f835c8233a34b5618501aa36ebf678dae07af9a567ac7143567c92a89a94a0a4abde383706ccc3826a83dfab8ae7165c6c6555bc77a43b5b3b2b590c56ce25e792796283737c6f5b300a0cf06e0060e1634a434793383860d84a76807c2983c57522fe3f988486bc386cb335ab55689d6b449b7a38dbce911f512e4f148aa1567 +private_key: 61d034b4827c4405b4ce0226038c1e98f42cb587123ec8a44454c38d4407d5fbad7068c373ec34f303a6c4272990957c5803536618bf07418a9397ca03a81eb4490762da41aa5731a8b795e077ca1da336279132d785b9816819f58cad7804bbafa32fc501a5f68981c48b4e06a7088c2784e917b0645cc28116904eebc3417c525cc312a3102db9d97cee85827a1775751ca137e117a217a6fcb4546d946ced119c6b1c45a2282415e9c11d6cb18d22616be6917a38878281bade6241410a42047c156d0c6fc5dc8060d9046fa658727b8e4e045548a5909a9c7139391e058722c7969b0b48c737b3a092082bff215e98d8ae1b09b50c25176b2764bd414d84c57ec41a4b8c04c82eb22a2e52ad200a6e127968c844c8887c014ac99ba8f54067621601121de01c8f5b923fe089584ae181fe8cc353f12390c565332a7bd8953f97e75b2deb83fe53b3aaeb9f4a02ada9401fb339c9bbf09bc6b826d9d0a1ca5a563a8213b8858e91050994472dd9f1c81c831d8096b72f360a65e194c5b758b37528808b9b48a65c9a04b34ccabea12cac24599f2c366646581366b71ac7724f01d833a5e76126617bf7630886e44dede81bbbb44de625bd89e41ae0e28bf897202439c346a438b1a8b518698af80418548664ae3699efb8271e7c2ee995731d7309bedb87c2572a6b805f46654a92d188ce661b9e197203113446cc5fabe73a35b97cb417297988cd02cb8b3e0498130341dff42a85281f667abcebf576fa266f44b2368c926385cbbde21621094c492607cf58227c2a12a8ed79c6a726a7cad81b7e9a50d78417619ab575a3c54bc77f5a80206967029ab92db447b0914168d8b37be0438037e2bb3eeb95221a8db95b07fb252044760832513bb0a7032e493ed529267c278dce0b8d954b4ff0bb62785c6d24328addf3608c50c0b9eb5e3bc685fe198be984735764bea637b4f8a149bcf356d8a57d21b426b736cc8e9b396ac1577f41291f433cbfa04697180f623a6564c8c1f9723896437fe216715a30820db78f7f0a78ad2ac034f701ec129c95dc49d8eb3b7a585aa00046876a7456278bc4a617cf9b8f06e89af742c14de2a7516c65c83bc53c3335df6c00c0b344f79635f232420ec893d9e29a36986defa37403354624607e343b82660b3597eba841b250a15574b009716b4812d5b175b88929d3539e3fa97b3a16644fe6bac74c67db2832a9e8807eb9745ed0afc0025ee199b39ee3954a112ba484b3528838a4605ec659a046b1722da037f9e2b007c895217927d9aa8514ac263a08cde86720cdc012fcc84f7a089ca7c51f4ed71d7c1379fd34c713cb65ce3410214385dd6c91ca1b74a3b24bcd45b5ca097a02359a70008adb82921f7a79b30a8689053f0340453e6b9979c8c522f606eb4c72a30970c09562d9fb00899c2127311ab57653b5833035aab95c61c50680592db86718bc6a5393a96c07907748be2a9c2c2324cb1247876b9c3a53fc2340e32abe72b39ee59e284a62dac56964c721c3d305125a22a94b2b981a5f16f7ceb6a72007c92ee110362dda1deeb28d26c5a5ddb58b4b665f1aabc8a90628abb65e5769194ee98f61ebc4835775efc50cd5136a4981b339e1a1368287fc699e4d50bab5ba45320968fb7cbfb358c92e2564944571591211b510a5b044663ffc7deac3546a8aa060537bf36229bacb4c5d918726b5ae7dfaa45f153f329140106a80b3c54eaf273384dc8e47f58e68621f3be905ace09a76ec9839ac471f9404c196587cc95d90166a247029aae0802ae3cf6983355b330bc9c6a4748a6130aa510ca1afdb876ad0d7b2653c3c88079e14d7898ee482f34651b7a238f3f07bdb4989740861d358384a4863c39b8912259bd78653386801d2450cabb6bb7fc287c74b2cb24c5688b66f7952c289eaa5051b938fc833f343c273652e4a1a6ee6c35c8c8131ebb63c82d38046b41343fc0fc660168931c899088c92db171f75b1f691577e09ce56435ab060c8fc084068133cb67cbb0fd36a73d8a21200623ef324256b99b0f60841ba9cda515f62a978881318fda87c95664e4a5755c72026369813dc90c8d6c18f48d61c10e49a7e9449f95492f0e4ae14f6969b654fd39bbac79c7e0b507559d5137d2179b59b21dc60679cf1b455b94208d87514c008898a95747ca9b530164743a6f9f1878f7badff6a4b2023ca367944f288a399c52648f834c28014b0f921ef04127ff4ac656196c034c0db9a7e8ca64109b904b2427fc601732c12241cc32589790e3bb71d924c184edb521d3b090a90ce0b296365ec6911341ad4d8cc7c136c87469f1ff101faf3488f89b52e98b920a659375125b48c403b4ba3175bbc6cc5a2ccc206dcca0440d54c6dac74ce4674e46444dfb4b5070926074c089c28c5cb11cd4c9c715af34aac79644cf2ad471213889c5e7ba92d114150233c673e505376f21dbc999997f43ff9c3b0f8f1b3dec09a4ca3ac581b9192984e43999f0d34aaf32218b02c8aa2f21c579457f204bd18191811e7bd6e4aacca5aa7c6f41fdd192bcd24760a2243034021b192575bf811e1344a25e1629b019564c39b09c88ef9b1ce6761066030bab14ac202bb6a8d858c3fd316c4fa81d21904ae691f6fe7931dbc93afc09f18f3b278e4c453ab5081372c093a9a38ea1622379f56397ec6c47cb7067fef7225c952c262792dda68135e45c3c6cbad23593ffde806fecac55d682fb23839b37186d4a40b83641d9214b7e0490e305807745534de18b9d4bc5eea755cc117b68b7a30f76a9458708249f02dfd59691f0b720f257f1f96cfcc3573c5696ea33017af14a843b81ea58821db21b73a9b80ca187685dac1f8735ea219cd01c6688f5bcaf4611fb3b58ad65b8d7c8ba4ab950bcad9b23d5b2d0b718397e111feb25f1739ccdbdc5c41d943e977aff5209134722dd3d54b923b511661127b284ae9ba0c27f05aacb20181602d9bfb32c3e255e7f48735bab94e515529a9591d51be015a009a9094591c7e07a13c57e636b6e11cf4835a8180895a6581507805a1c7a39ab05633798aebcaae89e37d8d75b4f34c73c2184ffb567069f0b3911943c2060f34f10f835c8233a34b5618501aa36ebf678dae07af9a567ac7143567c92a89a94a0a4abde383706ccc3826a83dfab8ae7165c6c6555bc77a43b5b3b2b590c56ce25e792796283737c6f5b300a0cf06e0060e1634a434793383860d84a76807c2983c57522fe3f988486bc386cb335ab55689d6b449b7a38dbce911f512e4f148aa1567878025deeed7dab8e62d43c3d2096e4682692537c70ebab9e1561cba88b05ec0b9402bf02481ce4b27a52e87feb92c4399c7f2988d40e942e7496ad15ad2aa88 + +# Official test vector 55, seed: "467f6158cb86b724039ff18c47950ae5c49170163c910fc9a9b30141f86e9c06ebcec91497bcd156d95758c9f0c6ef91" +seed: 2107204cd995f1df14314d5381f8c5440f09a347502e161cffc0a2ec3dcfbc7324c3da70fe850e80aa818301d60c70f3038153866dcd5d179e22db59b8991bb4 +public_key: 5b19b76208b41eb99b73d2b00d7884ac289c5b4632f8362ed9f238e07a34fd7b3acfc5973070c83e03b9b45c65f8eb64a08b88592b6676db235096694073143ef758fc84c9d3097266b66c9c34a6c5f876779936e345c3a07614e2795e65c0793ef3a22cb65bd06bbd90b391eb425223c2c395674d9841109b6929d353437dd49c7cd50d781cab5850363865689dc8bcf81a80c4269a05060965b80a56081c186a2f4bb00e2e942863fb8e507230c29215c98a78e37201c263783f703b17928f36656b99f9cfe31917f05c25f57063d728a4e2bc652e4193e52877b7310f7260a1985985c26caad60c9e6f01b54be183a7c2ae986ab2a85b33788674dcd42566b406be251837266ebc6261c3b62fff702f10298119d414b580bb4077791b7096a7471595d8659614c878d8097e7437503a7c7e058a3dd295d34ace86b9302b901100adb0e6140cbf44161ab33b9aac34a0dc6f1faba14d259c546c672ebb7f528a010d5585c21c00c4b19980c6490d76083a77b8aaebcaf7917a81b55a6f2a6be7941393d0a9ebd2c549417f38682def039b4944cbc6fc629bb3a3ade353ea2005115a665087c00a4b771ef0490748b370d8b4c4ec37cdd352562a11479597d8035c00824f48805000778a81d6a31a0bb8b6201cbd3149ef96428c79569c5cba273a9bb4a77eef98bfa54ba8267bc42c643c29577b2bea5802ecc038ab70fdb1b23d9272b7ec30cfe1791126a185c40a77c57ec3088822c808ed8b1866068035590460d6a9a00c50db70b19b765e7ca8229e1a66f4fb52d752b515eba35f64097ee85399d78ad4c2cff7935ccd269731ca2b3b3217a22203e3b9438cf0b396fc99b6113cbb883c16869bb114bb1adcc06863738541acc61458ec9ac98df381825ca80ad954562ab931d1bf47a1c45a5c1c72d90cc2d3b4cf6135b8b5454ec4967523ab82e9aabefc89780722b5aa12e47344bfbc8c3426802c77c02195255e71555d9045bac868c7d45c06b6474bba2f40fcbc480112176a83ce361dacf2b386cbcd270456e7563a873c55d752151b76b3fe3c3233c5199011aead401b88b9c36efc295fe03dee6015b1ca00c5bb06dfd2c2848125af903c298c5f74fc4b9937412ac70aacf07fb99488c797287c04335821cbd6475e91d66a7d89c2f67285321442c4e7ce61d0212cc16d74c211ed2a7bd829044ff82491d1cb1746430603a0091110f626804e0b32edb0cc827c8ba7c36f87cbc67cec250f65ad2fc621363bb715557848c5a01b256524271be7b6956b72be644aa0dd33925f64bdd3481615246e95294196d6af1aa5aef6880ce2a609715b50fa7737be749cead7c84977747924bc25792509ca7a931c3ffee7341547913ee695f8144afe83430bd5c96ce61f57610f78d6c64c3c33b468b6f3cac46f29b60f0705ae1a05e5c63d21a62f5dc7208d25a7f0c09d8f77a7a7a03d51d2061fb13d9ae97386fb6da4cb6fea0923937536511ba8ff00ba753897d16b76058a15b5c706121cc792076ebc2ac1ee492a36e65d12d23f6488245e998457d4337a2c62c731afa43085a94892bd30393b1c9fcfb380f9815ea491968d6514b8707551443fcdd5926991599da552acb4a19b6342d309b5027cb88909ffc8c83b1778d8aa46c9d07aa2594a7bfd47cb7ae1 +private_key: fa9abdc750b445e2973d9c85b0599a6310583b93c146a61256592258e79664f8a22558cdf55c2ca0240d5b1425b6d6177956afedc12885e12714982872ca17eef52085dc965de960b29972f5828d3410506e34bc54bb2dda3c6a54b5aaa89466cd44afe56388c21b0fd19b744020cf83779359097c3e3086a904376b56814a454935bb53289c1cc4d08198fa6797149c74da0d21f99177093de6dcb8b5579a9641ceaedc74ab8c3e91f2804bfcb94eac1245b53e27bb5907219bbc6b7f61ab3a35a11c3cda544dac262b4289a4a930283b56d5779ee14c62f3a89308f1120e3b34ef87087e0c0ed6b55280031927682870e09db8800467fc82602b95d1f16d680562a2b866380a411546475d1a529db537c1f2b3e3f393c1919d6fb97877297cf2ab346273478afa7ee1044bf4d3353374051e0a4ed2364587e0694920a6cd6abef9f68d00b16c7b2a53d64bbb0645098ba1a9745a15323b2bebd956942090ef2381f8fb747f5964b4ea9a57b22659635dce7c55ff10b7d1c3a76687334542315a05a0931a9a5da734f6b647de025e05e480b5a27fde1116fe03630fdc074f542ab358341ba08fcb79b48cf4273b46c54219c16bc7943887cf451b1fe224bcff9121098a75b2d9b35e71ba2bd94f106800dac689d6002df6ab6528876c39a74d63dc41490077cb94cb243947205841f8b698cc214bc9b2442ab418d7f4a7bec2a793fc6975268a4cb66f304bc7cc142a81f057501c75baf9b3a5f94935b3991c228aa52266ec289ca3333d35dbaf59aab37d659423bc9953656317f48f025076240b15fd145e86db6ea8758b9b265ccab860cf5268aa627c02ab245f466923b91db6a240d1731642229f22946be1ec538a86b7df1a1f4801791ddc487c6acd7fbcbf9f457eedc81cf0a03ca0c15e4524748ff08b7ba020e1c6a4e8e573a6d9c996842f8122bd876c4f6b193f22a68af9111f302b895d2624f992aaff265c996171889661897856b963c92061c4c1db767ecc725056b473753ad6b9046afc82c60a8d7000ccb18b7a3831933eeb9eb02c76e379a5b326c72b0647addc393a6676e6b948bc465578e9b4ccd670bb31a39c5b1aa52c6737433e930b0c2db239ff2a55d8eb649b4aa69b56987e0273d8829db39ac057f89194186dce30b1b20b17f5592c5737cd12ec38bbd228dbf7863ceccffe9587bd485090e45d84c298f811af1925b37a4ace9c751451e326ece073c1503f54984e910ba12fc79f502391784b1bb3b41211e654655868a8d2b5aa4920b9fb2ee7605bd7e8a3aa668f9721212a860dd762113efc1e1ba93a4a10cae185bdf9c80c06ea30757b12768b29a4a3950d9175e15873f104413f22ad79362643599f7d6960f3d662d24255814c2fd7b445d35651ec7c0f873a2a2c255aaac51c41118e4cbcb6f91745150c51cb7a5d5987341c807cf8969c523913b8659dc5120c6d90782d463acc647f16976f641c54ff50bff3dc1194c56c3c71b6bb296f65fc99d20b92662a19a0d8748a90932d498b7e315be3388f87b73ca99611035224fad81792e8c7a3a23dbdf0a44ef9c0ec0c4ea68804d9c9078fc08ccb733287862e01f8712f30388feb2abbd0810cf2485b19b76208b41eb99b73d2b00d7884ac289c5b4632f8362ed9f238e07a34fd7b3acfc5973070c83e03b9b45c65f8eb64a08b88592b6676db235096694073143ef758fc84c9d3097266b66c9c34a6c5f876779936e345c3a07614e2795e65c0793ef3a22cb65bd06bbd90b391eb425223c2c395674d9841109b6929d353437dd49c7cd50d781cab5850363865689dc8bcf81a80c4269a05060965b80a56081c186a2f4bb00e2e942863fb8e507230c29215c98a78e37201c263783f703b17928f36656b99f9cfe31917f05c25f57063d728a4e2bc652e4193e52877b7310f7260a1985985c26caad60c9e6f01b54be183a7c2ae986ab2a85b33788674dcd42566b406be251837266ebc6261c3b62fff702f10298119d414b580bb4077791b7096a7471595d8659614c878d8097e7437503a7c7e058a3dd295d34ace86b9302b901100adb0e6140cbf44161ab33b9aac34a0dc6f1faba14d259c546c672ebb7f528a010d5585c21c00c4b19980c6490d76083a77b8aaebcaf7917a81b55a6f2a6be7941393d0a9ebd2c549417f38682def039b4944cbc6fc629bb3a3ade353ea2005115a665087c00a4b771ef0490748b370d8b4c4ec37cdd352562a11479597d8035c00824f48805000778a81d6a31a0bb8b6201cbd3149ef96428c79569c5cba273a9bb4a77eef98bfa54ba8267bc42c643c29577b2bea5802ecc038ab70fdb1b23d9272b7ec30cfe1791126a185c40a77c57ec3088822c808ed8b1866068035590460d6a9a00c50db70b19b765e7ca8229e1a66f4fb52d752b515eba35f64097ee85399d78ad4c2cff7935ccd269731ca2b3b3217a22203e3b9438cf0b396fc99b6113cbb883c16869bb114bb1adcc06863738541acc61458ec9ac98df381825ca80ad954562ab931d1bf47a1c45a5c1c72d90cc2d3b4cf6135b8b5454ec4967523ab82e9aabefc89780722b5aa12e47344bfbc8c3426802c77c02195255e71555d9045bac868c7d45c06b6474bba2f40fcbc480112176a83ce361dacf2b386cbcd270456e7563a873c55d752151b76b3fe3c3233c5199011aead401b88b9c36efc295fe03dee6015b1ca00c5bb06dfd2c2848125af903c298c5f74fc4b9937412ac70aacf07fb99488c797287c04335821cbd6475e91d66a7d89c2f67285321442c4e7ce61d0212cc16d74c211ed2a7bd829044ff82491d1cb1746430603a0091110f626804e0b32edb0cc827c8ba7c36f87cbc67cec250f65ad2fc621363bb715557848c5a01b256524271be7b6956b72be644aa0dd33925f64bdd3481615246e95294196d6af1aa5aef6880ce2a609715b50fa7737be749cead7c84977747924bc25792509ca7a931c3ffee7341547913ee695f8144afe83430bd5c96ce61f57610f78d6c64c3c33b468b6f3cac46f29b60f0705ae1a05e5c63d21a62f5dc7208d25a7f0c09d8f77a7a7a03d51d2061fb13d9ae97386fb6da4cb6fea0923937536511ba8ff00ba753897d16b76058a15b5c706121cc792076ebc2ac1ee492a36e65d12d23f6488245e998457d4337a2c62c731afa43085a94892bd30393b1c9fcfb380f9815ea491968d6514b8707551443fcdd5926991599da552acb4a19b6342d309b5027cb88909ffc8c83b1778d8aa46c9d07aa2594a7bfd47cb7ae17d30385f988dc748b843b7b7f569e58ccc9215503e1bc2f28f5019fc72fe6d3324c3da70fe850e80aa818301d60c70f3038153866dcd5d179e22db59b8991bb4 + +# Official test vector 56, seed: "687c02de1041abac7b2c1e6ec2a7c3375552ed5edb10e3a8139c24cc76bda44d719d8121a81d47a0b762b4e9eeb85235" +seed: 63a925685a8ac5bbd918faa33ac397d1ffbcf99135d9da7c3d6ff7aa4c50af3d3afdb8a246a56ee71465591831c371f2eb87467b0559dedd776ba063ee6d2f93 +public_key: 3610631d29c37a90908cf2c89d075928ccb3b9558a5453315acabb5a228d0abbb99d63b0294b68594a0a648367fe044e14347073562aeb475c17196a3da38896f2168996ca917a0423614431963b10b5a0d3b228aeca3b26363026d1a5a952b5333cadf79a59b93b5ba484bbe4618b41756a101429cba6407b44a2b001108eb30e92d60c093b4abefb63438c481dfbaf08442d607088ebeac83a950623e057c99cb0f9e31639cacc82852f4cf9bcc83228151b91cdb0423f610552b0c170203c7f2b345443bd7d274ab14cb67b328d914366ea9a220cf46333a41feb5193ded4a5d94c6e0a43bdd6b2a52c3c4c718591f11b32ad64930a638ea9f217e64a9e31526313133c02b5b0cab821544543fe24aefce70927d9248aec2937385c79cb85df91256e176eaf3a239b370d4ef56a90dca3935507a6a86d84b021312bc718662abd432c08bb4dca3614f357321b191a8522ac109a643a5a9a63419be6845e5f5837b6188de0c779fa01430b219470a20da019688802ba8440c60d8727394114db10343fbab0993ac5d967b658b1551a6570f7d9b283445cc278298b4740884ba72b338c45249ab74c84a1435a84c42533a0bfbdd0509d7a3bd0b0635f538ce72645650931dbbc6e2850cd2585214f5cc12f2a2d9c2820d6c0550be79d5276747e2c04bf976705227c842b872e294aff495e06502819c6c92de3622ea968b07c0646dc0301c009fcd5bf7f19a357693e032cc46b4777a1714d41a59bf07721a2490be2e3cc7e4a04fe48a8db361a5cc1390d921325875f80629c2abc4d468a40d9c22911b9bdfc6ba986b9bb7226227dc63d75351fa4613de3654475c5668d651f9f03a386179cad00100b35343f48b7e36a79dbf979cdc734d5855b90128fee10c9bf40acfb67332cc8c9ecc4a3a9a98bd30c708e7a630a0909dc8ba2b1721e42250b83623a1289960e7288758525d4088525ec25511bca906930602b5ee1d127c23205e681c9db3474aa774733100838b2461e45cbd603c3a74122b679cdb9992063e089d5acbf74b03469a3ce7993c6b978313a7a735e75bb94976b3539b4298cc47af58425c24310667b1315baa5937741e35309f1c70cb8c60e06ae1793502a316a276b2e21087305f453d8e99d08730e174159db09324e4cbaa067cb1e766e455a34159465bf1138a285cc386502d698538ac63de2f496b120be468a952b02c5dcfac5a997023b5b3d98691572103e158672eaa0a4e4f44fb6920ffd874f52748a630aa41d188ece499aab324e916079b3bc2427b35896b26b0d2564b2a875881a074706713d326306fc66efaa1b8d4cadc7c85b7ac211c4f61f68a124465397385b2ac7a09686935cde06638f156e6e4670f963ca82950d3207889446be69e2a0d7cabfb16141868a6187b5be7977c354fb27a8c9cb8197565480244bf296692a02701580a2b4ac4772b13a27c869123ac3b6cb6699698c11261f657ffb6c8d78102e0c60c004c0796f319330435a29abaf33dbbb1c566aea10349981409ac31c18aa48631a1f0657116821a2a36c2403870a3787a1e3f36349b3373ae729a859af3163c078c38ef38c464ac5ba1fa8150d9093f97c17106c99c632bc42a5ca0595508bfa7485b23bde8d12ad7bfc9c10c68374b70a4a46655b5a67d1 +private_key: 26424f439191e67b1755d6893ee31789b8c6985191c9c21c1ec7cb8c990f82ac49b7996b1ef48046f8b3093a36c27cba5c35b7cd733678c10ac06a5108609e47da30a048312f1543b8761714114d37a3c70ee09813e79f37e6402d584f51673f70c5331b89a52e61a51d363a8ad8081df227dd621b20469ded708bb64374e2678424787c57940617980def632a61eba801c1a079517302f3b02db4b136d588e2a41fca2729b541c9bef00940270e257c47103449bbd47eda9bc7a9b508d42076fe7734fa5454228958d7cc932ebaa0f8d12123e7ccfddb039a2a66d6d7a0140c6ce16b9fc0b6a0a3b7a0b50a06d8d397c9020f1dd1b5f4216565dc84e8911102e54b60e88abce7714ad29668f79b7f2a7b09e7c8a92480f30b072ec14e96e77e63342841167afe3421c37c2ff3f25ccad60c652c9831c5519390bf0ee9b2f108104d77145ca4b5245b66db6607afc0141324328d746787ecad7f5a0ffeb50ddde16ee1ab87440389fa0b9c44b75fd26c726773bb8049a77784860558107e069d3d0521c6015093787ac6f263d356130b9a39e5093f62d7b2f8e5411e61a18d44155fbb4d2ba7b09072cf6fe666109ab5fc078eb026490720c82b4990a28406a450268414ad4ff1791b370722258bf103507fb9a09b09bb4373465ce5a1ea263bae6b723036af268700d496724a42539cc9b7f7357cc7b6b33e11937a884dbd30888508bdc442379eb8b3682341b3b4b760a879fc229397e05879b003a06acdf3c5530a7b90013873f47139c2d96e1d7b67427467e64cba2965766603ca30e13f2e357e3e6945cda2906416370cd699b3da77889b63be284ad538269929914092b805aac7e9a04d0275c71df020ffa6002c1703ed674dc5633367bc086ce15e4e61a93de94023b823d1fa29bc6250b92a8a04533987a6bc510bbe84ba7fa1699b077c3a05992ddd52a19aa238b466c2801b3fe9f72335e15ec2342ebebc7694ba68e276719371b933dbba3fa07262870ea9521e95650444845b41258f6ca77915345c0af3718ea09f6ad604c9a4971e618b59551f5ef54e57aa138e52cc03313398c0ae03bb4ee5d36799618955789e80a78bd896aae9e87f2bc0a6b730a02bf82af19c541ca93449b127f883af13713bf5229238b19a216478a4880a7d9b6009719209f69519e5774cf48c8aa20b96e4b0f10a94027819204532a54c48026a5cdd5841e6c8a736cbc99f9caf46b8a90648a854f9c6ae37048c6671c5e8a1b2731019351631829c205959a4b4ae87a4c3234c63e653cb75c92237c4721c66ad05871b22d69f3435baaaf311491394cb1238b899973ef79f9c371f045b4145bc20ddb71d53fb50b25c46e674778fe9069197a9861337edab3de55cc28bcca65b2a5fbe1a2a67197bda012ecad40bc86593a06c833c82aad0b714428296248a8e49304cd3955081ebb2e717b36deaa928c3c09ce1bcab3114627a7886f64d69b206cb7aa8f978c13e84a6c6453efb1328684859ec20a9ff7a560d436977294daf2abc08b78ce10a22d5fccbbdb192d57534ba04c5dfba389c3bbba4f5191ee9ac7a344cd519cd39100012da9afba0bf9a2373ac534ada885cc71322e5b4a4b84c473610631d29c37a90908cf2c89d075928ccb3b9558a5453315acabb5a228d0abbb99d63b0294b68594a0a648367fe044e14347073562aeb475c17196a3da38896f2168996ca917a0423614431963b10b5a0d3b228aeca3b26363026d1a5a952b5333cadf79a59b93b5ba484bbe4618b41756a101429cba6407b44a2b001108eb30e92d60c093b4abefb63438c481dfbaf08442d607088ebeac83a950623e057c99cb0f9e31639cacc82852f4cf9bcc83228151b91cdb0423f610552b0c170203c7f2b345443bd7d274ab14cb67b328d914366ea9a220cf46333a41feb5193ded4a5d94c6e0a43bdd6b2a52c3c4c718591f11b32ad64930a638ea9f217e64a9e31526313133c02b5b0cab821544543fe24aefce70927d9248aec2937385c79cb85df91256e176eaf3a239b370d4ef56a90dca3935507a6a86d84b021312bc718662abd432c08bb4dca3614f357321b191a8522ac109a643a5a9a63419be6845e5f5837b6188de0c779fa01430b219470a20da019688802ba8440c60d8727394114db10343fbab0993ac5d967b658b1551a6570f7d9b283445cc278298b4740884ba72b338c45249ab74c84a1435a84c42533a0bfbdd0509d7a3bd0b0635f538ce72645650931dbbc6e2850cd2585214f5cc12f2a2d9c2820d6c0550be79d5276747e2c04bf976705227c842b872e294aff495e06502819c6c92de3622ea968b07c0646dc0301c009fcd5bf7f19a357693e032cc46b4777a1714d41a59bf07721a2490be2e3cc7e4a04fe48a8db361a5cc1390d921325875f80629c2abc4d468a40d9c22911b9bdfc6ba986b9bb7226227dc63d75351fa4613de3654475c5668d651f9f03a386179cad00100b35343f48b7e36a79dbf979cdc734d5855b90128fee10c9bf40acfb67332cc8c9ecc4a3a9a98bd30c708e7a630a0909dc8ba2b1721e42250b83623a1289960e7288758525d4088525ec25511bca906930602b5ee1d127c23205e681c9db3474aa774733100838b2461e45cbd603c3a74122b679cdb9992063e089d5acbf74b03469a3ce7993c6b978313a7a735e75bb94976b3539b4298cc47af58425c24310667b1315baa5937741e35309f1c70cb8c60e06ae1793502a316a276b2e21087305f453d8e99d08730e174159db09324e4cbaa067cb1e766e455a34159465bf1138a285cc386502d698538ac63de2f496b120be468a952b02c5dcfac5a997023b5b3d98691572103e158672eaa0a4e4f44fb6920ffd874f52748a630aa41d188ece499aab324e916079b3bc2427b35896b26b0d2564b2a875881a074706713d326306fc66efaa1b8d4cadc7c85b7ac211c4f61f68a124465397385b2ac7a09686935cde06638f156e6e4670f963ca82950d3207889446be69e2a0d7cabfb16141868a6187b5be7977c354fb27a8c9cb8197565480244bf296692a02701580a2b4ac4772b13a27c869123ac3b6cb6699698c11261f657ffb6c8d78102e0c60c004c0796f319330435a29abaf33dbbb1c566aea10349981409ac31c18aa48631a1f0657116821a2a36c2403870a3787a1e3f36349b3373ae729a859af3163c078c38ef38c464ac5ba1fa8150d9093f97c17106c99c632bc42a5ca0595508bfa7485b23bde8d12ad7bfc9c10c68374b70a4a46655b5a67d10697d2f9e047e603b8845c9ecb168576f9d8bc7f3c831b6ec15c5fa4f744315d3afdb8a246a56ee71465591831c371f2eb87467b0559dedd776ba063ee6d2f93 + +# Official test vector 57, seed: "4142237070c216bcbe245a39bd9220533c97651d84832b26727855ad994a0760c52b9319ad404693e4248b8c5ff324b3" +seed: 6a1aee5e708c1b47f02bdacce4f56c860f74fc7cfec1ef3b58285b1c8ad7fec2230e05b7114ff0395cc6634db1eae8258072d09c09f291e92d6620b177dc50d7 +public_key: 00e7a56e91a766c72c04ab283d25787224a588eb4fe0c6b54d889d127a471a72c65f06375d1a545ad9b058a654324b5615138b2ec4a375989b3f1b60fd30bddaa2307205a103b29be6cb75f3567705a0c05eb845d493caf795554ab25fd03b379a6284988763698b1bbb4b3c1a54b9c2038e9ef30a3870a11604288b32336e15939fd181525909949c6cdf7737cdb382b1dccc0c49317213683b349f8da22db0b45e359b2f8e70916a0c0142fb264cb6bceb80afa3a36912d635d7b4cbf33a4a36e4c6714c551d70a18b967539b7a604c5182ee7673ce91d07736f5b97b407879e77050bcc089a14332138d92ab3e09b497b834df573dea32829b471bd5a73e61361ec699ee60320ccdc0e6fc983d3238a8d5abc3412bf48d67dd2e1b0c2692a4e705de666aaaafa9eca476a1b155d52459b563b6ef1549c51f83bee2963a93729d4746a01a21dc667b120d38d79a45a112067205c3edd378c7f65c940719f79389436a5595010678e1558ce163ad95593a751c737d4936ed9c7cfd41effb1abedc07564fa5238ea2d2908793e2a9a33e08b67ac3133402d42344f6d1c804536263661a557739cd8c29682549fff416c069a39cd48229e47066e02612988bf780256e25009ec5b1ef829bd39bc0654a0c8c3c113cf421f06965713849a83cac9f6415482d82074fbcba804b4c5f2b1fbd941c7ec8c4c691dee981392bb0736d43adb3ca548829a55bb9537396d7bb11922a9167ef01cb1aacdaf17902f671a6cf5487bb643e0a1cdfa3522860326d374ba8009833bb08eb09a2b3cab0d3193a6561c17d60b1cacb24cd3c26c455c040cf9ab0a7292bbdcab2d5b783d65bee7a666ebaa2764e98b7df61bd5ba546bd307ad7469e4ea85b6031224d9b1315720ccf95273c35767c43a3b27a31773c5b35c7e4aa0316c53cdb2fb1a60ab77c4a76f2af78bc2d6479b909eeb9c26ff97a47c468dbe7c439d232a914766fcf8772e7ba92b3182e362735c237bcffc3e940cbc5e6042df923eaec04d96e31cc3187f66735ff1e62fb5460895b22145787484e529a1d654a2d72cb9d81b4d283bb15682e8f9bf1037cc95e29cc3716fd89810e1bb95da871a2562645e0c60a27cb508c2885c19befc686db2e7a78aa66b934aa0d42c856cd361ee93294759549929b59adc1ebec3686e70c4a15c8d56dc23ad080945d4734b76b0a64b73de7b5d810ab8daf48542a4c13b8a14aef05c788448acaa51263cb31be69a91888ac66075c0e59ead1b29d6439e94253d20f965d9f0aca53a28b4903bd40a1310f0123ad221a45961527589e7048faa407028601e397a96b39728bf55437d335f1e14063d3902e923863bc90572891117516fba340263d6a0aaa0743e959da8f21ef9fb38431b36b1328a15696e97aa78ea97936f8b38bb1556d2625f5ac31e1b8cb3baeb1be7f808b6329a440045eea532624354dfb71dc321109d0058f24ba4729c375ccc0440948fd345561715654f60b378b477a208cb83f3afed2534c5ab6efc0a5761d46b6cc0a6ada55d1c92c7558bad4091772f65bedaf335ba37af34582e0bfbbc6609bdd3568001734520f45d9f4772d1d21d5080b9a7a2b2e72a0b6e030f1418beb28a229c8f63411446b83fde11b3d946c9bdabba08d495aee50911cc66291fd0 +private_key: 1023c0608301ab03cae768b68fb495c496b583b72006f0aaa985800df2b6ba238cf37748dfb231fff957ab744cd8c5710b301340426d66507f48a23df19878d9cb0ddfc06e1674c03124cdc4c1c70acb645ea55b22403190d813f287a5c245b4e7a31d11988d218988faebc195366760303ff99433cf07b68fb4bf6b8a507e902b0a07bd2f048f0393bb9f5b40ca588208faa73789a0107ca9c4d12239caca11500f3de39995d11911b9386e8bb22cc908e9906bbb247c96a0bf6ec14bb0e33113aa4ced8531beca2d415066cbd299a9dc920a935b1bb599c0c14a695253fbbc8ad7344122e8948f5b10e46138b28740348aa888ea0c18d53b875232c34bb0d44197352505231bbf5dd356b8955856a4c3bb4615dab0a07724065f4ab0ace46fc684a3dbbc9ac0e776e6d628af8a2794829567a95d2ac0699e3a87a46086781965df032586290d2edc5c57a7332a286bcf39b8af181424884863123d1145031ad069e0a56f9212c76378871848b121489773a623c69c139a33363bd032a40b4fa15637c01916c132754bea335771810303418f75a35d591f212a603dcb2f3fe9ce261acc082b4e38477ca9348dbf6bb981128be73c189147b21949666cca3db8e433fe66ca43206356884431266b9d1a92b1899217aa636d3c7d7fb11a2e9ca61abb586d20ac1e46198da618cc71bd52b922de064ff5211a2b53c51f206e025505d3273f3f682e1a873cf41433b77608739b55d457364c04315dd8b304604c2fa52734fb25ba6c69f9030008a310ea76b450281168a3201b9892e5b7926cf53c3e3a591979874248a361c5c1f601d0580351cd51a78392bc4134c708dc822ac8b9c032a80875b30eb69f9a636b2ab13c6a35ccf4d704ce40aed8fc2a3f47b50599b024f73444a09df092775f5a77113225b87cc295e336eb8668ca6b3dc1d7b5af00a75730c8c3a45f05f9a22c66143965466f5b7cca564b6afa4a3ba0a57dd5b7035651725010ac088727c5b7b5b91f173589e7b94463f70bf9813c28b405ee53c10e1943cb61ce66527d7c0529cc67b181ec6b4077ab764aa9455052495c9dadf033ce50c51a3893aa250f6e47711e96aecc69a13aa60b1e837c1ad98b5ad2931a9084c6c364b4a33de1a02d01d9155b527f036b35d5ec3d13b5bf49e8be9b0234f49400fb512e22a705e0b6212908b77f715b3813bbbe29539cb63f78075f0f3cc60821b4d24b5674e29af16647fe917452b85a1c887286a89afc31955fe8afa67aac2ab30295d8564ea94c720268ed866ad36c8bd634b2b6e6977ea1781a592e532b3f292b8fcbb10235246f8c320d6daab3a7fc26b63251dd98a12550166b513a8d66435789bd979436dbd263b18c15660693e6eb99268a3d80ea6c995234d7e08b7712b295543b0b3b9856c72cd2268f7f66a0c67c96a2a1bddeb26a4ccbaf9d7499a7a48a65982c8059851b79c735897109479108acc7e668bb16c8a530a7bf4f473841e17c191cbbf867b36059505446cb30c26ff5970fd21a4043854d96d9575ea25415c263028a2a4f35c824001eba5062e23098fc4556399241b8e48933e28c67068d34155507e23ccf4877bd170f38203fea3b9e2a289602301a00e7a56e91a766c72c04ab283d25787224a588eb4fe0c6b54d889d127a471a72c65f06375d1a545ad9b058a654324b5615138b2ec4a375989b3f1b60fd30bddaa2307205a103b29be6cb75f3567705a0c05eb845d493caf795554ab25fd03b379a6284988763698b1bbb4b3c1a54b9c2038e9ef30a3870a11604288b32336e15939fd181525909949c6cdf7737cdb382b1dccc0c49317213683b349f8da22db0b45e359b2f8e70916a0c0142fb264cb6bceb80afa3a36912d635d7b4cbf33a4a36e4c6714c551d70a18b967539b7a604c5182ee7673ce91d07736f5b97b407879e77050bcc089a14332138d92ab3e09b497b834df573dea32829b471bd5a73e61361ec699ee60320ccdc0e6fc983d3238a8d5abc3412bf48d67dd2e1b0c2692a4e705de666aaaafa9eca476a1b155d52459b563b6ef1549c51f83bee2963a93729d4746a01a21dc667b120d38d79a45a112067205c3edd378c7f65c940719f79389436a5595010678e1558ce163ad95593a751c737d4936ed9c7cfd41effb1abedc07564fa5238ea2d2908793e2a9a33e08b67ac3133402d42344f6d1c804536263661a557739cd8c29682549fff416c069a39cd48229e47066e02612988bf780256e25009ec5b1ef829bd39bc0654a0c8c3c113cf421f06965713849a83cac9f6415482d82074fbcba804b4c5f2b1fbd941c7ec8c4c691dee981392bb0736d43adb3ca548829a55bb9537396d7bb11922a9167ef01cb1aacdaf17902f671a6cf5487bb643e0a1cdfa3522860326d374ba8009833bb08eb09a2b3cab0d3193a6561c17d60b1cacb24cd3c26c455c040cf9ab0a7292bbdcab2d5b783d65bee7a666ebaa2764e98b7df61bd5ba546bd307ad7469e4ea85b6031224d9b1315720ccf95273c35767c43a3b27a31773c5b35c7e4aa0316c53cdb2fb1a60ab77c4a76f2af78bc2d6479b909eeb9c26ff97a47c468dbe7c439d232a914766fcf8772e7ba92b3182e362735c237bcffc3e940cbc5e6042df923eaec04d96e31cc3187f66735ff1e62fb5460895b22145787484e529a1d654a2d72cb9d81b4d283bb15682e8f9bf1037cc95e29cc3716fd89810e1bb95da871a2562645e0c60a27cb508c2885c19befc686db2e7a78aa66b934aa0d42c856cd361ee93294759549929b59adc1ebec3686e70c4a15c8d56dc23ad080945d4734b76b0a64b73de7b5d810ab8daf48542a4c13b8a14aef05c788448acaa51263cb31be69a91888ac66075c0e59ead1b29d6439e94253d20f965d9f0aca53a28b4903bd40a1310f0123ad221a45961527589e7048faa407028601e397a96b39728bf55437d335f1e14063d3902e923863bc90572891117516fba340263d6a0aaa0743e959da8f21ef9fb38431b36b1328a15696e97aa78ea97936f8b38bb1556d2625f5ac31e1b8cb3baeb1be7f808b6329a440045eea532624354dfb71dc321109d0058f24ba4729c375ccc0440948fd345561715654f60b378b477a208cb83f3afed2534c5ab6efc0a5761d46b6cc0a6ada55d1c92c7558bad4091772f65bedaf335ba37af34582e0bfbbc6609bdd3568001734520f45d9f4772d1d21d5080b9a7a2b2e72a0b6e030f1418beb28a229c8f63411446b83fde11b3d946c9bdabba08d495aee50911cc66291fd0d49e426ae85eaa6c911c4dca80caba6e28e5f645a54d8c016de51a2b98241a29230e05b7114ff0395cc6634db1eae8258072d09c09f291e92d6620b177dc50d7 + +# Official test vector 58, seed: "bd334d7b7eb14e00e68863f2e5551a095f8af10681c28353fd19b9a7e70b8bfe266840860609008a567abc66316c77ce" +seed: 6396b328b100e4c7f4bcae69875edea1a1982421558c608c13c592bf7b5d0fef1100ced48add211a5c937b8d6079d8e271af3f949edc61f70e60453aef20dea9 +public_key: 2450c193211551409a9ff92089c54b048b6a80127c7742ba34333bec498e28d729d6085fc7f5b6e5c4212a0aca0772af8f83200d422b49a80dfa17cf56d8277b792d7b4675dba3a7502674f595a45fe93008acad026410de336fa41ac0c725bf601280bf7b4d7dfb63789175b7748dc54846f3a8b28d055c69e2424704bd84f61c896a40447bcd42b96834c8429ca79dc4a4be300c7dee38a253e35819a43d833046f6437622094d003a3b9914bc6946bb4f4cba41246ca027cf2e599a54a23e8cca88086a6bf8aa92305185a8b232a0f45903224ba2d3276715640451bf49c350fbe5b2d95a5f55223a1a794bde26012bb48ccb4384b3027855331e96ba09c7e757bc71ae9ab2a1adf51ff01bbfd4c77a40dc3e24da767d8b456979913ae97fa9446413084a45fb7827a082eca1094a9437154b2c8edb48d7bb893ae3213b5a95f86bc9e146657ae653f1c9bf54f87830aa968b96b747b9aed4007ab4030ed652652daa9612d00f36bc2dd1299c8f2c84fb56045ab45279735aa1f57ecc470d7e66696a8b7a65bccf23b63ea1d595363466a4d24540e21bde05733154180d1a80652b166cc05af5a7cdb2158471d52fa5006a8ea25c98167f4574a8a47a00b7c031e667a7daf41b32c714ae1855ea9bbd0a1aa18bf64071c44f3783b30ce8301f20cbdc5c194d6131712386bb135af9b55c680790b5147f55a6cdb94075d0f0c289f42aa638623c16be446289d099777717b89922476d8c5511997419d8b5a44ac8c4a9589c5b39c03b045ac31a6e9967fa22c21f5bae213065867945ec746f776b0daaa96d85b61864fa94e76474beec06815b556faa81ace15c552558c0575c44e26cc4f919d3e26fe1374d2afcbb3de23a9be5b366c1a174d8b78ca462705ba70b358d57a751180c781b28075435b2528104ac0bbfe5912f8fda282f93b7e3292a64b83494563741789c98eb7e84d69c7cc2cb1703ab94aa71d7491c69b52949818245acc6ef07c11fcb68c336738fd762269b7ac562aa7401965f2c5b2909404b32cbc86671043ac334e283ab194bdaabc390b0b2e275bdf0cc2651d11207a53db1a2166b7526633cb779d88da83357b51c962f567d03917f0f2b5c3c3b9ba75699efb4a8a5736d98a56b1510cd6f233c2c05909a3ba6203c11ed72a0091785acd729dd609704e51dafd4342275564615b258691b59266a0ee3a8b261c6e9e9894b681806e97fbe3b25b4b133d804a0286a909752220c11c8644417f34597db43ac66159956a11541cb4348c23196095be01023e7b267c1e51fb0c11d9b787a519b3ca3f0ae08c79ed3f256a63b488e38040195983da72f9cfc03a9c5a7c428898291a9bff3cea8089a343b73e616c5e02227553511722b04a1604d5ac718ed753e8adc001fa47665b76f944c10dce0635e9c98dd91b9e6790da2b09ce323ab41cc7c29839784e6ba907979ce815f982585297b5170dc7afeb94524563510257d99131981128c7953ad87ca696d58250aab373ffa3476aac3f650bcf58aa6bbe85168b7c4012b3359a2b6bed702524b8498d3aaa04c7915211e1e013e1961b0e2e32b90e01e0b372446931a0fe6255b412581e2b5c0d60d3b7208a63449b4216546209bab2ad3767f9793d0be98cd2899da27f7d980122d0bdf593022e2 +private_key: d77060c9fc07dc7287876347eef702737a25a8b192146a5bfdb637f936b280098224a38ce6311116518028cc005089bcce93c7c4f65451b893eb1872d5470342d3627e90110022b78ca23d5eb97ffd9a16be398271444d6b17c4c5cbc680fb9f65c844c86c40b291a3cc5a85096b3f150ac9cf1540d1a29ab0d30874db91d17894d234c6bb376b3683273d198c73cac396d942c7cc2c63b19204c15792071ea41383dc864d2619bdddd11431d0b7299aa720516fcada90aac7148fea3d63a14e95d01fb51c03d74bb49aabbf70ab50ef225795340086a0b95a9cb15349501f4c059b26abf18161151c21bcf30d325c1f1d348b58b3bb0da69da24c18d6c75df0f6b0e63414ae9739e9eaceea4b00f0d33775121e78742f9c6ab1aef5aa83b14d8be365270583c0c90847724e39978095c297799774ae05cbd4794882349c68f5a2a2f23877e395c5e14286c9774aa159703312ef63af3fb2978e22a5c1c0152b4139429783ea5bc90016701f1868c2cac0acf4649886b773e5c29dfb7bc142615f93216d2c3ec9eb90e772359614c57ca97c75b593ced123f6a8bf76854d856c65d5069ba084c75f10290d104f5c9ac498200190b72f004897a8d83b0db3274148443f1b14108615a3fa02668bb9baf1086503351ff1301e65085f65cba909bcc42b32fd5578522baea9f515e48b040a259fae266127bb6a8e338965051943c63ea536b5db2c3b6c8998d4287922d5657da1269e8071939b28aef119b0eb66a87378064162b1151e852cb00f927d6dec61bce0631a93c1b51379546453c63626f2a792d20c36aff9a3182c6e7b5833da416f29772b70216732c376a4f59176617c885816bbe72c38a1230f484f1fe4671fdc1224e1bdd8d795c2e0917692517c4441cd4cc3bcd71765212b2e4986c881b2b0e8a0405ba2f7676a41f4aa152003cc185be7cc22c9f402b878bf9d44cd32ca21cf92a720e35f81007345d3bf40b821f48b4b2d693eeed8cd292b636e7360f79237720625e966b9a5d99a7a452d2bc7066163a00647aaca62044938ac6b6598e9eb003175c2a29c46228c7b6464815e9a271a690e771601e252b251f411e6ea91f2f55ea0150a7a5405f536849af80e0840c322c5b339470196b16cbf24484f407dc84819373109a9676298ca273d82bbe4e24946e0617e33897f170bacf4b7a312245ffb780f4c5100109f8c4b629ac1042cb7a946293f740a3589e069987aaac2d996f5c9886d7125cb772a6d93761851076931180d87ae808a908d3c3c1203ba85739c6095b4fbec78066ba9da4433dc4928f4d73e03108fd8f531cd6ac47c088a64562e607c7bde3867691206ba9c058432466eb54a9414c3a3127208a512ab5973b5d118c51468fa70bef827649be94d0d97acf60b693d73b062249806275a5d475afbd943e96a512f45ce54343bb6f353a9b1540f420cf4f01bb3611a09925e430237712a8c2b91beaf7623cedc6988990ef8006bc0da49c57b5eb718409c8a06f81ba501090ea67519c261574b118ebbe1765a145309677ae4fc9ed499934e24500056372a25271f40bef480218d978d6457aac1f9761bb63679396490242558b2b6c617050fd902523a8c2450c193211551409a9ff92089c54b048b6a80127c7742ba34333bec498e28d729d6085fc7f5b6e5c4212a0aca0772af8f83200d422b49a80dfa17cf56d8277b792d7b4675dba3a7502674f595a45fe93008acad026410de336fa41ac0c725bf601280bf7b4d7dfb63789175b7748dc54846f3a8b28d055c69e2424704bd84f61c896a40447bcd42b96834c8429ca79dc4a4be300c7dee38a253e35819a43d833046f6437622094d003a3b9914bc6946bb4f4cba41246ca027cf2e599a54a23e8cca88086a6bf8aa92305185a8b232a0f45903224ba2d3276715640451bf49c350fbe5b2d95a5f55223a1a794bde26012bb48ccb4384b3027855331e96ba09c7e757bc71ae9ab2a1adf51ff01bbfd4c77a40dc3e24da767d8b456979913ae97fa9446413084a45fb7827a082eca1094a9437154b2c8edb48d7bb893ae3213b5a95f86bc9e146657ae653f1c9bf54f87830aa968b96b747b9aed4007ab4030ed652652daa9612d00f36bc2dd1299c8f2c84fb56045ab45279735aa1f57ecc470d7e66696a8b7a65bccf23b63ea1d595363466a4d24540e21bde05733154180d1a80652b166cc05af5a7cdb2158471d52fa5006a8ea25c98167f4574a8a47a00b7c031e667a7daf41b32c714ae1855ea9bbd0a1aa18bf64071c44f3783b30ce8301f20cbdc5c194d6131712386bb135af9b55c680790b5147f55a6cdb94075d0f0c289f42aa638623c16be446289d099777717b89922476d8c5511997419d8b5a44ac8c4a9589c5b39c03b045ac31a6e9967fa22c21f5bae213065867945ec746f776b0daaa96d85b61864fa94e76474beec06815b556faa81ace15c552558c0575c44e26cc4f919d3e26fe1374d2afcbb3de23a9be5b366c1a174d8b78ca462705ba70b358d57a751180c781b28075435b2528104ac0bbfe5912f8fda282f93b7e3292a64b83494563741789c98eb7e84d69c7cc2cb1703ab94aa71d7491c69b52949818245acc6ef07c11fcb68c336738fd762269b7ac562aa7401965f2c5b2909404b32cbc86671043ac334e283ab194bdaabc390b0b2e275bdf0cc2651d11207a53db1a2166b7526633cb779d88da83357b51c962f567d03917f0f2b5c3c3b9ba75699efb4a8a5736d98a56b1510cd6f233c2c05909a3ba6203c11ed72a0091785acd729dd609704e51dafd4342275564615b258691b59266a0ee3a8b261c6e9e9894b681806e97fbe3b25b4b133d804a0286a909752220c11c8644417f34597db43ac66159956a11541cb4348c23196095be01023e7b267c1e51fb0c11d9b787a519b3ca3f0ae08c79ed3f256a63b488e38040195983da72f9cfc03a9c5a7c428898291a9bff3cea8089a343b73e616c5e02227553511722b04a1604d5ac718ed753e8adc001fa47665b76f944c10dce0635e9c98dd91b9e6790da2b09ce323ab41cc7c29839784e6ba907979ce815f982585297b5170dc7afeb94524563510257d99131981128c7953ad87ca696d58250aab373ffa3476aac3f650bcf58aa6bbe85168b7c4012b3359a2b6bed702524b8498d3aaa04c7915211e1e013e1961b0e2e32b90e01e0b372446931a0fe6255b412581e2b5c0d60d3b7208a63449b4216546209bab2ad3767f9793d0be98cd2899da27f7d980122d0bdf593022e2903d69da169d8f3f65eec290acf30078fe51bcbd1aeaf412dfe2d31c7b10157c1100ced48add211a5c937b8d6079d8e271af3f949edc61f70e60453aef20dea9 + +# Official test vector 59, seed: "a0264c58ab1f2cbcb212077fd378d340307accb31f1312137cf84e3d3135044d4eae8bd38bc3e540a0c14d46458f6179" +seed: a453bcacdd2b0d4646009e5ed451c3c45f08fb827ef733db3c517a9dc1af93e67a3cc8aa3239d4c52ce4c95afdeff6efbfacac10d294edc0e7cf4535059bfdba +public_key: 352071c0a607e459c907fa29619ccfdb5147f56c208e20b3dcb82fa2304e40c46aaeb47c5bfca8a9079ecab4471d4bcf914c8ba459433ccb950772038f6892062535603b536da65dfd5c33430069a7f33a08092bd9c9617df3a5778b1d15a8a91c8b99bf5b0d4596a3f8a79d3b6994e823c20f102cb2353273471e2675633d9ab2c7668f02e7a68b2534489b169eaa92a8d78e4e182647f71758fc7f49a17fb400c1de30cc76664bd10b7c55885af696478feb919f3c24fdcc98991177b52ca647070cef77ab47c891b06575e5a0814311a75bbc9837a1c564246c163017696294533999b6700a1402552063a621205bc28823e539ad1c1795e0a23b6b47737ae839617548a514631319a78d99350eb77dfba97f7208d04ea980546a9e6642395c5177bb7b433dd47351b85e569091eaa30ce450c1b786c0272b91f9763478ac5410bc1f78175edef0021e8c0b4f074bce255ac2238a5d67b84b08a12984696e1ac7ad1131cf64bc64c5b0a1ccc94e3bba85271975c63f8d314d9f1a2d17835f873846c6858f9f285428478b2efc10bd7b49ffa006a6537684b0093a633d9cf9bf6bf97017690b4ce511b1898971b2978b6a1371e8aa70d970f8600bdd0109c84521e663845805235dd5849b192c12b49b43f824d9a16dba939609e166a8b05e4811b970915dfb527d803672c7a418293937a0c508272a5186203be64b4b1b33578d48be3e23913e73a385a8ada0fcc4cebb1070ca3006ea16f7da6eebf8b9e6637dee942cbe43395c8a7806f2c23d1c146d6359d268303a1229e5d513c79b2095892d553038b6a3431948195bac491a879c4dec39cb1b97374a65d5f066f6c66045a25b9b5889999889db34b1f42b4151126dd7431389a8331b9c123aab61c2122285530566ea23bda21cdedac78ccaa9ca1566ea1817f4791da6754379f9b0f8acb217085fa380910ed3ce4a52cabbe52d75472a63c88ddfb423c1ba6c1deb6ed3172cbc7244fb71300721aa13037ede787ffd546e60890131d8add25551d72881be0c8647aa10eb5cbb5f73c891868d4641bf8a692bcf0a5867091f4313bc976c989d1c184aea07eed11e36c215008b56a55ab5062bb41f7c5895837093671fbf7c4ec63505d15ca7efa5c6e45a5f5a757a4fda02f9f13c7926ba7c990e6dfc8b20ca1a2a9490a33210c14accde09764153bc9d4a2a68b7a80d9a91d3d47789c2a79bb212bc92812f8660f23a833d78a3f056ac030bcad487431a6357b8a1c13b512deec79ceebc37c6099b720445390277dab65346ea323d33c76e30483d51b9d01b5fdd55bb7d116b2dcca951292f3065b1628b1dbb86bd0cf5ce6a66ba1ab3717829019ceaced283c6b748b26425588ddcc47bc89ceb267ac7c03172b960160a6317d44fc5287c5e462911a8c995bb92ea1c81fed5baadabb569f9cf7c1cac71926f3e4a1a7411295a623c41240ea4e9011660227a785d989ab00a2c3091b02bd65a5b244246ffb97e23213f57b86aa21669541a60ed7014f1831839e41539dc8634d0125d61100ea4438af59434a25a1ec0bc99aa0edeb19d67ebccdd22ce5ff925ae364af7868ad6308a602033e0221ab609560144abec5a4792b8894337c866ec1a5df4076739fed133a74636ec9d904e88876b678088d8c70f3c70 +private_key: d98cab94a33c2a631d4bb8a0e314b78e68824f7b2156d3c481c32f35c82cdc5b2f0f41c2ae64295c246661dc0052209ca274b3aad8221ac955b0f30344f775b759adb1031bc5fc34e6eab6a8a10f7c576e848b2c78a31aa0f951ed8b917277153d4842317474693c5643ea6a9d49a8e5a9baf7c61f967c8679647e8c25ce3ff5a766f34b5e481dbf93550bd36595c51c51cc1c50dc278da95325f483209119942a604d3724328a28f18a6559ebc23a2ccc7d647ecfd866b17b2f2f63b31e1886c309211e7238d2c2510568262a48291a9a7a1d5c38aa61c0acfbc20e8c347c59c6cac9bc402788da55baf1a7c3c0093e4707699976bdca93646607322368addd9420df669079322edfd59bf09397c4e2392062b455d25044382e26510197106f681663a2616d7ec46efd75646952875bf708b2a20b9b7a688f256b078a140f170e3187b4ffbc2d742756c1ac1b07a29916f8347c6643131ac72c8c0840ca7f6c866f20d32dc53a448f193b4b81583da61837873b4239b9e690486c240315c387b6e5763ca226d86a028caa07f4c9963af99850f69401200f69c74a0024a4d9a7a54bb978e23c0f13474e978740422c606e7c5576702c25020415d263d9ea362f9556d64129ee182d22b76a8ae4892bfaa97b68709bf905379102a435500835871d192b48d64b5b31a5647c3634489cc2f33c6ca400371152d8148c0ea4acb95b96f3e2919ccc251e6bc458ac635470437165c2bd4a9efce81471d652deb6aa06359123b532a4c7c1a0ab0abbd193042c4a2d82b69df83045bb933eb43d1199a818f85ca0239ebefbb9294657dbe33dea89a844eb54f624c39732201db37ac46838bca17e0aa3b01448412bcb8ec98b26fd78cee583948a37bf2ce996ee852fe1d1a744f2098ca5b0720409fa592dde17432d424ba40a5362596393932c8ca7022435a763a367afb41818e12b88548392f9973619b41430cc48339a241cab26c68855b07ca4163169497e31831aaa57c3ebf384f3926b28374fc4cb2ae37173dae034ec61c48e804ac0a347d721c670357a7e78198d3b3eab02c168d26e3ef04d1468bd7ba4be00013266fb8fe3bb98a138b63a45167494c17b89c6a6e939d75584e755bbe8048fa2443c57f07f1f178965047e2a59c6815a5b92b6691c9c9dcb6250bb73725586b57c8239eccccc2fd418289a0406671d68e79e4118304637c9468b7312805599960c19a824582b5182dca37dbc63d5d33559a79beb56c60108c5655789bee1c42b75b73b9b336140b202b61ea32324134b8dbd064bd3293650c5b8e8f87793080e509cc7beab0eac8679ca5a723cfc119bc1a18e7631910a2f50601fa280084b98aa81c38907f0a685b3acdd630a3532ada83648bf858084d087c60b1ac73c76ff4477d9b01375a7cea52280b404564dd69c46e3a2125729463ca7fd724c35738094e627e5f1610a9a00ef7294f4549470b993d0447dfe34b8ac264c547a0b7a134d19ac2bff750cf2e4c80f32679375cdf0906346d64a56ec7648c4b7a20613c9b74301b12d40d1ac64f8318708820006d06e088811860a1cdb300187c694335170f6539df45834b93edfd4275e939fa5f828b6e471a5e09b352071c0a607e459c907fa29619ccfdb5147f56c208e20b3dcb82fa2304e40c46aaeb47c5bfca8a9079ecab4471d4bcf914c8ba459433ccb950772038f6892062535603b536da65dfd5c33430069a7f33a08092bd9c9617df3a5778b1d15a8a91c8b99bf5b0d4596a3f8a79d3b6994e823c20f102cb2353273471e2675633d9ab2c7668f02e7a68b2534489b169eaa92a8d78e4e182647f71758fc7f49a17fb400c1de30cc76664bd10b7c55885af696478feb919f3c24fdcc98991177b52ca647070cef77ab47c891b06575e5a0814311a75bbc9837a1c564246c163017696294533999b6700a1402552063a621205bc28823e539ad1c1795e0a23b6b47737ae839617548a514631319a78d99350eb77dfba97f7208d04ea980546a9e6642395c5177bb7b433dd47351b85e569091eaa30ce450c1b786c0272b91f9763478ac5410bc1f78175edef0021e8c0b4f074bce255ac2238a5d67b84b08a12984696e1ac7ad1131cf64bc64c5b0a1ccc94e3bba85271975c63f8d314d9f1a2d17835f873846c6858f9f285428478b2efc10bd7b49ffa006a6537684b0093a633d9cf9bf6bf97017690b4ce511b1898971b2978b6a1371e8aa70d970f8600bdd0109c84521e663845805235dd5849b192c12b49b43f824d9a16dba939609e166a8b05e4811b970915dfb527d803672c7a418293937a0c508272a5186203be64b4b1b33578d48be3e23913e73a385a8ada0fcc4cebb1070ca3006ea16f7da6eebf8b9e6637dee942cbe43395c8a7806f2c23d1c146d6359d268303a1229e5d513c79b2095892d553038b6a3431948195bac491a879c4dec39cb1b97374a65d5f066f6c66045a25b9b5889999889db34b1f42b4151126dd7431389a8331b9c123aab61c2122285530566ea23bda21cdedac78ccaa9ca1566ea1817f4791da6754379f9b0f8acb217085fa380910ed3ce4a52cabbe52d75472a63c88ddfb423c1ba6c1deb6ed3172cbc7244fb71300721aa13037ede787ffd546e60890131d8add25551d72881be0c8647aa10eb5cbb5f73c891868d4641bf8a692bcf0a5867091f4313bc976c989d1c184aea07eed11e36c215008b56a55ab5062bb41f7c5895837093671fbf7c4ec63505d15ca7efa5c6e45a5f5a757a4fda02f9f13c7926ba7c990e6dfc8b20ca1a2a9490a33210c14accde09764153bc9d4a2a68b7a80d9a91d3d47789c2a79bb212bc92812f8660f23a833d78a3f056ac030bcad487431a6357b8a1c13b512deec79ceebc37c6099b720445390277dab65346ea323d33c76e30483d51b9d01b5fdd55bb7d116b2dcca951292f3065b1628b1dbb86bd0cf5ce6a66ba1ab3717829019ceaced283c6b748b26425588ddcc47bc89ceb267ac7c03172b960160a6317d44fc5287c5e462911a8c995bb92ea1c81fed5baadabb569f9cf7c1cac71926f3e4a1a7411295a623c41240ea4e9011660227a785d989ab00a2c3091b02bd65a5b244246ffb97e23213f57b86aa21669541a60ed7014f1831839e41539dc8634d0125d61100ea4438af59434a25a1ec0bc99aa0edeb19d67ebccdd22ce5ff925ae364af7868ad6308a602033e0221ab609560144abec5a4792b8894337c866ec1a5df4076739fed133a74636ec9d904e88876b678088d8c70f3c7008cff1967030a528e748b708b0fb783577f249c04ea5536d2da034fd0d15fbac7a3cc8aa3239d4c52ce4c95afdeff6efbfacac10d294edc0e7cf4535059bfdba + +# Official test vector 60, seed: "99a9cdbfc674ab3ff2c64cded7d697a6e27a767434a47aff7c3fbf3c6a22d6043d27868955286a13efe3de36d22ec48e" +seed: 47ca2b77c5b717f423222c2730ca5cb9c856bc951d01b2b2c80bd76ccb5539b78f1481d7cab000e33fa07de8dc9627a85e76fabb4428a3376e66300cf12a0787 +public_key: 4a5058d467b5ff439fb0c2916ab09bd306661b18626746c8f4db817e3c4dd2c71041929dd7c5918a760f50715c6528c2d2e7c9b97c51e9009281849cfe4410b616ce03455c73580fe16634fda087387023e427902180c5e8276b797abcc47028cac91bc751c9ec4a9c39d682cb38b38882103839947b920ed453a766c04df7ba58f9714c6c370b98172a71fb7d254285e609551f31444e90c2b1d595472825fb9cca49d55c237a67377808ebcc1bb4848a75527ec467a7f94b8c4f8b1a16f789f3ca15f4f332fd0160ff6c4985b08b9996bd08892d5a836d50566bddc6adc6ebc7d3c95068c08682d54e70666f5f62b238f69bf86a3a48421bcd8b762625c06f03cd8e013561abbb2f01b1c314a6a61500aa02b9a54682325340ba328761140781885febec3a4090a5989b914a494d07e9793b703ed4b45af78c42f3bcb46cb4c7fc5352802ba0eab35b9f66c34c39259ae52d1b75b910a82fbb464d37f6befcaa811abc6485f41d38c8a4d1592ec69b5ce90c7cd10c0082c0b72dfb2e5a16b4c7ab6e65f58fbeb6c442fbaa2b4345b3a3326bccca3b5104730520383178589c4b4c751796c31aa061346620ba90d30b340c541f7cad17f86e05c91e4c21162f618b52117ddb572e1b90c0e19235a82a3e51b59c3b280ce3fa739bb70e4af9233831269ff87f3114596f317f28dc11b8b53d578a8ca85b290d31abb115b76c0a8748124fdb822f989c241b801c8b982fc733921d45853cf63880107704baa331b725a416471032a9289673f3ecad22050d9c5c9e2706a341553d168bcbad1a41a3c554260112336430fa16ca8fb98cf5d92acafa8fb427c460a27aa08358b36c5ab849ca2725b72c939fe0601d1e2abcc4434bd0ac835751315856922ed53cdc7b49468caca339aedfeb25ec2b97d43ba409693fba524ae4ecaee5b84b567432270644d6aa618669734e10c8b05a0d697b81d6c83c9f844cdc8ac755403044b14c288131e8c0c21c2361b206597782313d40bad1d56dbe159735491f7b800d6b14ca69d92bf2130badd1858b2cc4a408c33ee56fdfd719abb2a431132e15b89d83498b6bb5aeb0d7404e94cceb2a29fc392a2e466469e53da9c371e0155a774a298d515d70ec5e31aa070be92c3d6290f285a6034a97e389277eb393c5100f066c588aa33e66028976493bf41481b2eba07a720937bc02b5324d63b9487a1789a6baca91512c1a3a0a70b348c1596cce7997ed395b971442ebb3b0e2dbbf5608012030a172b259ac705af9634ad585916cd63ee1248ca143a20001a20cca0496734c2c52a59bb40f76411578e2c60f2364e8763ec1e5641c80a9d6235d4ff9ca73f4c4d6db9bcf3383d7d9a025ac76db1ca49710aa281c222a4bb81b1027d80c38c8365a39988a029a93b5dcb2b0f410fd1b63a54297c65b7de3f3a948f10988b507955aaaa2d3c699dc83ef348e3781c8723b9bd1c6637b94b6cd416427592c71311a16d449d15c0fb2753b338586f7260cdf255ca65cbc8c54101731a45544312099a66405b01eab124f116cab0003bde314b25690520a9a2131154271c89b97539035652c03b462f2635db501f9ab6983017f22b3391a67397066c86032a31080d329647a7c4f5ab89a47393636ff0671a4b06948c9f87fb580358d467fd3 +private_key: 9483b4fd275acc8cb660713ba7a57bb442aa743537e9e4b3dd73c5d3239cb876cdadd5a1dcd364327a7f8cda092d6841879b0fc7b64e81216c9acb87a4150a3fe7bab7058a6c6464fbb9ac71954e65647083f42acdb15829426c53c55a7984074dab019220b5f570211db614357ca0d3da2b648b2af10c0cd6008ac31ac8d995af6c44531d1125cb710a6bc4a573f04558a97eed49071f748310a9c844c63b491997109ca079613d96c2910b365eb343b3e405b749f33cb6a3502ed634c50196d364352aa06f5a149cebdc2e59d5b27c828292332157e98893494fde7bc51996562f13081f2ba89ec4b416c4732946b4aa26c5e5600a8b9b18278c51821ca36e153ab0a763dbd397693800a62a1e3682c9f71154aeb6772cb3368b6465400c7b4b200e571390165cbf56452072e38b797ba0465238f9e80652a0ba700951fed03fae6c91787c8b2c752a02a4ae52a16b4d1b057931174890656b53984ceb20b1b90d6fb10103c97f5dd7a0ee83cb2b34c85825766edb64e2135f897a6ac1b144ffd8225a9887d546c0d9f1b3d851003e810fa2193c856c7944315869349c93dc84616134c3901d1f137358984341069546da01864a16ca44025e78cb36744db7b3045425243526524f064f8b46c862a7660acc557d71574f227ea5d83ebf2c52db172b4fb7a70baa0df43a776a326cd2dc4367b89843a79205f34365f3b206798550c5624e241f03b41d56776c88636611fb1be2656fdc1c4e1ea84b0bd1b7c804bd53795db335531c896eb72558e6805599ca66ac7a77e4d9a1ff20349dcc76f78cae6c59b93a8165788216a7a611e2233bb4346aa01b47e5b458c970a0cac589f0cc8435b25d74a12d25f10dfb51536b465f085cb170757f8181c7b7c32176109a1a8bb3a59a4d545365960267746349caaaa182136e17f4a32bb040fd3038dada40c8443694789654db794f185cb7054c6bc50f9a24ac2edb5f34eb6a5b410561c0b12e803b998bada9e346785cb2c8e251989354540acbbbfc8517abb5071055ce7ac646e0197b89390516b9e56bb174d2b28d3aadcd0a51bf098f3325642e9b753015af338a8d309000c2313949b2b30314b924e5050bb278c2c4cd96520fd8009c8944569187a69a749b651039ca5443c30b7755782d1d5a289c4baec0f0b0e8153f3986a969e113cba21b41a06f8184b586fa312606419375387eb08980b86f97b382811400e82260d3cb5c74fa5e57b15c06aa2d8b250f92ea0ba222be524459a589a7ab46ac01a5564975cab66002c20745824c313d6167ef2c5a0266419b291401f6cd5b2497cc4cb7a7fb8c67a8761541cb281665f6da184da0ca520395cd492c86a3ae8aa91ba3d24d52322cefdb38be7a6cea16209cbc69e796a2c43b1581a015c2e37dcde072cc4012187276e81b54c20c6f95a6100093cbd9bcac7b75a904eaa9ec31338203c40cf28425ea9c5403ac6cba4cb8051cc2c5ba3f592100aa4188e2696211846bb68c4e39cebf26464b19812c98c0472a76e0a44b2631c01201546ac9982eb8334ac30a4be25342d48666ca41cb63423b9baf290499c27321b5705e8a70474b2ba392a34c17e1a4aac49da90cab751b0e5f50984a5058d467b5ff439fb0c2916ab09bd306661b18626746c8f4db817e3c4dd2c71041929dd7c5918a760f50715c6528c2d2e7c9b97c51e9009281849cfe4410b616ce03455c73580fe16634fda087387023e427902180c5e8276b797abcc47028cac91bc751c9ec4a9c39d682cb38b38882103839947b920ed453a766c04df7ba58f9714c6c370b98172a71fb7d254285e609551f31444e90c2b1d595472825fb9cca49d55c237a67377808ebcc1bb4848a75527ec467a7f94b8c4f8b1a16f789f3ca15f4f332fd0160ff6c4985b08b9996bd08892d5a836d50566bddc6adc6ebc7d3c95068c08682d54e70666f5f62b238f69bf86a3a48421bcd8b762625c06f03cd8e013561abbb2f01b1c314a6a61500aa02b9a54682325340ba328761140781885febec3a4090a5989b914a494d07e9793b703ed4b45af78c42f3bcb46cb4c7fc5352802ba0eab35b9f66c34c39259ae52d1b75b910a82fbb464d37f6befcaa811abc6485f41d38c8a4d1592ec69b5ce90c7cd10c0082c0b72dfb2e5a16b4c7ab6e65f58fbeb6c442fbaa2b4345b3a3326bccca3b5104730520383178589c4b4c751796c31aa061346620ba90d30b340c541f7cad17f86e05c91e4c21162f618b52117ddb572e1b90c0e19235a82a3e51b59c3b280ce3fa739bb70e4af9233831269ff87f3114596f317f28dc11b8b53d578a8ca85b290d31abb115b76c0a8748124fdb822f989c241b801c8b982fc733921d45853cf63880107704baa331b725a416471032a9289673f3ecad22050d9c5c9e2706a341553d168bcbad1a41a3c554260112336430fa16ca8fb98cf5d92acafa8fb427c460a27aa08358b36c5ab849ca2725b72c939fe0601d1e2abcc4434bd0ac835751315856922ed53cdc7b49468caca339aedfeb25ec2b97d43ba409693fba524ae4ecaee5b84b567432270644d6aa618669734e10c8b05a0d697b81d6c83c9f844cdc8ac755403044b14c288131e8c0c21c2361b206597782313d40bad1d56dbe159735491f7b800d6b14ca69d92bf2130badd1858b2cc4a408c33ee56fdfd719abb2a431132e15b89d83498b6bb5aeb0d7404e94cceb2a29fc392a2e466469e53da9c371e0155a774a298d515d70ec5e31aa070be92c3d6290f285a6034a97e389277eb393c5100f066c588aa33e66028976493bf41481b2eba07a720937bc02b5324d63b9487a1789a6baca91512c1a3a0a70b348c1596cce7997ed395b971442ebb3b0e2dbbf5608012030a172b259ac705af9634ad585916cd63ee1248ca143a20001a20cca0496734c2c52a59bb40f76411578e2c60f2364e8763ec1e5641c80a9d6235d4ff9ca73f4c4d6db9bcf3383d7d9a025ac76db1ca49710aa281c222a4bb81b1027d80c38c8365a39988a029a93b5dcb2b0f410fd1b63a54297c65b7de3f3a948f10988b507955aaaa2d3c699dc83ef348e3781c8723b9bd1c6637b94b6cd416427592c71311a16d449d15c0fb2753b338586f7260cdf255ca65cbc8c54101731a45544312099a66405b01eab124f116cab0003bde314b25690520a9a2131154271c89b97539035652c03b462f2635db501f9ab6983017f22b3391a67397066c86032a31080d329647a7c4f5ab89a47393636ff0671a4b06948c9f87fb580358d467fd3b5ed4c3fb678a44d92486cf091333c7f035541614729496d5dd45ce580f0d2638f1481d7cab000e33fa07de8dc9627a85e76fabb4428a3376e66300cf12a0787 + +# Official test vector 61, seed: "c799d57b41f28c5c446dfc58a5ac6499c4bcf3c162afd2b09a16549826ec2a6f689e44bafc4acc82f5d6aec23f4a3993" +seed: aaf6eb40e596a5e3e8218871e708b089240dcbe7fd3641f0e5e41e071ce49107e2f8d320ac3cb0c52efdc753282f092bc39baf4a18783a48ea031a191865eb78 +public_key: d0a4700800708a0cbaa0e3347235004460c8f86188ae66af363ba5cee88b03a341f5255c329a7d119bcac87c46bd77a1b5966a3fb22a45d89c712909fa8c69967b1fa8878d89b8541b8a1ee6858932e0793c045deffa62250c0d0072a46328992ba7ac4fd72b48512c7448cedc902d9d69ca55626a09d1a700a92cfb1a6bd89291632c74af580e3b4aa932c8c6714337b1d72a3002c6b68b1fc981cd0686502189712f0c5327e1050ef71549aba312a59e9a342c9e76a96de6907cf235b6e3b5e36a9072ac95d856aa7014699ff48bcb7b298e5168cffa740e0a5bb1f65df9cabbd715096ce738bd39bad530a05eb58efa8b9e3dd426f1781a06179736570611c89a6f99b3c0aa5f4ab2737592082ff73dafd7671bcb60a87c5adf3445ca3381a279c6a4fb1724373827494e294ca5d83574e0877e4a31634abb106b81afd515402290318ca8a2511cb129aa52228ba4a64444b761c184a3a29b221e11cc1335e4b87c457710fa4fdee790614249fa060b0417cfaf9bc4fe88632a76766fc8c5ff424849cb91d4351ec621c2335a2d7813c01cc893c646986f7c2246b2bb05149ebda38f00acb65cb8bf53314561893eb0f1053b237915711b7577b18aa963315a3b024629689a52bdfc81e298c059380920aa5bc39759f2f56d2811c89c59acde3a5496f1a8cce9bf5266b363a40cc1b6c78fbaa4241340dd4563a5603413cb73ba1893bdbcb3ff93bb7f1132940998427769d19047bc051506b5b990074e8d1bbe2d988699b526726a91513988627c2301b44f206696353cab38f68ca111270ccc6cab887ac3b8bedacc12513ca349228b0d842bc193299ad1812b69c63c2b8233c20121d50793906c4014453e19a62da12c76f03667031f2bcb59a074cdd2417ba3789e7af38ac71335736890dac04f77e0b10529381e930c8c0031f88838efa47772a7b2541963b0c7b063472ccdf6228349cb5619c943067ad86019cd964c64767c838407eb32a4ed9c40581b63e0379d00adb275f6578f065894e8a47796489b994ab9471235455fe1f819f3cc2b378648ac625107805ec8946f1599a8329981a7775523f7c8ef7426d8a31d1d5cc98820186fc7b55076b14d2c7c1533cc3217354bb24661c162aa0895cdc4aaefa666686a0f12d1791adb7392b78d31d6bec44068c4f31cd60a768ac0b056c24864c03387715dc48bc86e1b51a649ce4945708951065f946e17c06f364590e4d16520fa2b47b230f1511fd02aae79bb8fa72791806b0d3e211de92455459066b410bfd4d437f0acbbfb02bfc5e93dc7904b649a6f9a7ab09e2679e13040c8e9754032cc3feb8c2bdc21d8f7aa56ea31370169ebcace98d54362ec24b6b6c63732b882984e58839a7f825b17871820ea9dd0dc8c5e7a15403888e80150cf5a12c5e26040708791d2074df71945d67f221b6d2bbc1b65d37559a7c248516cb4ccc19cc15f93ba6d6085bdd95568cab1069cf13138b83173ea7c58ebbea7516c6ae25bf5e07ddf29a0dcd64b455aa6e050c1d5663245318833cb95702bcab1a11fda773a73454e1055104f917b75d650dfe1c59e807314a096de713e35837ba4f2a5f3991f6ac18302647fe01a05c055ac9d19fe27027cad17633dc0f4693c1f79cf69756e79c9fae7c954a0caf2c6b326 +private_key: fb2abf16f6cdb674757180738286b5cbc25ee9eb1229f3781a8678ccd0c5d4219d49352913bcc4a404503d7282cc215ae337ae96c60fefc6a77e5c600962024e25328ac211d6d6c325746ec168777bb4489b04cd869522d44a62d1bb81dea56e8ef8384ac64fad710efdd327410c6b7d184fbc639e2f6c72d64b44bd303c06779be8c2b2cffbcb8abc582a2766efd9503745773ca2c4f92769cfa2b4e9052d06d1adab40137a2419891bc9098898935650197a0e3dba7f6ec54aa9b521624c48d265a667aa4269a12bea0abfc0e705fe422621848a6a87265f687de0669f56c63968569c1d807826ebaac30173586312f1ec53b0b52ebde2aa82f32ffe592fb90363cb3a281f49cf9e16b9ba4390072c5a796c4e4ac95ce2e14070014034a4a92f8c1fe4733c645b5dbec38129a4021d5c1afb9005c1756e37f431d89177142891827519d2874c9d1273967b176a311f041270cb3bc8d0779c3e40bf824102374a55fe5b2598d20d8d30249b59479946936fdc6b0e17a39d4684bd914479110e68c780f8468e3155be5acb0930fbbeaeaa79bd655592a28622cc0553a3123f2a9fe15b78c89501b0943731e71d2ab05fce4129b6324d66991114974dd7e79ddafa46879286d8d5ba285526f8767aaf45184e860e8e23ba7458aabfeb021ec68b19253a19204c7fbc81ca904cee1a2b7c38982c97a01e2330292168198101e0f30c1a429b3d243eea7114de5849e50249ac66bc24e482461895a9d28f4f181e5b036e7299832a14bb02435d9e087f7340432a632bdd84aada7a657402bc91b3b0a1075e39d66741e18855826fef247b6e1496e3866f9a2226c4d2a198c050ae706f007d1a4317b45aec0a1e7a2e359b695dc7523050c564b717e2b1005f570235129d913ab2e5fa99cfeca4b4262d48f0486e6b3c47a61946114c69150b068b92a8853c26a9c4c1016e67cc90cef8cdee024785e58586caa9f990b48546bec008956a1744dd9473f4a150445b8c46a1c4b171712c1b94a9743fba6b389b8852175b0b1d093d8d7c10fb079dbe65771a8120c1930f769b8fdbec6f857025c4c44771842d8d42ade8dc3712d9a9256167dca6c1caf1a95301cb6401afac63a7d0915059b6a7e45c0567c951a3096bf5cb44114091d497352fd2be702990608991feaa7302511e838c9a346ccc267caaa9c5221ef60b317b6c3a18a07ddc737e6221d28667c70caa3cd24533175aeb0a99bcf7cf60aab105385906fb1167cc26923a2f3c390fc2d150d3760d77b8954a61065814b6d134887b570ffa944f2d1299b6e6bae557cdb041b2b084792215cfbe30302f39573e6456f486b8dfc22b95f96b78098ffd343126671219244df0c4443f46473818c78f185dcd4765ecccaf4b67276f697d21108ebc16632be86fa48278d467021a1520ae6b0668fc7471c9262eb716cd307c98a1c205a83be5279b0143806d3aa443cc7e1a255d2df178e7e298d938c97df6260a278052b763e1bbc2f85b1389b78abadb449ce848b0eb8a5b44b2e881ac3e6bc66a2cbb9c998a0f3a2439816809b97d066b87da226907d581d981481fa8833d9aaa2eb6b5458288872c5974d9cf06cb6da269471e51cd2945b1d0a4700800708a0cbaa0e3347235004460c8f86188ae66af363ba5cee88b03a341f5255c329a7d119bcac87c46bd77a1b5966a3fb22a45d89c712909fa8c69967b1fa8878d89b8541b8a1ee6858932e0793c045deffa62250c0d0072a46328992ba7ac4fd72b48512c7448cedc902d9d69ca55626a09d1a700a92cfb1a6bd89291632c74af580e3b4aa932c8c6714337b1d72a3002c6b68b1fc981cd0686502189712f0c5327e1050ef71549aba312a59e9a342c9e76a96de6907cf235b6e3b5e36a9072ac95d856aa7014699ff48bcb7b298e5168cffa740e0a5bb1f65df9cabbd715096ce738bd39bad530a05eb58efa8b9e3dd426f1781a06179736570611c89a6f99b3c0aa5f4ab2737592082ff73dafd7671bcb60a87c5adf3445ca3381a279c6a4fb1724373827494e294ca5d83574e0877e4a31634abb106b81afd515402290318ca8a2511cb129aa52228ba4a64444b761c184a3a29b221e11cc1335e4b87c457710fa4fdee790614249fa060b0417cfaf9bc4fe88632a76766fc8c5ff424849cb91d4351ec621c2335a2d7813c01cc893c646986f7c2246b2bb05149ebda38f00acb65cb8bf53314561893eb0f1053b237915711b7577b18aa963315a3b024629689a52bdfc81e298c059380920aa5bc39759f2f56d2811c89c59acde3a5496f1a8cce9bf5266b363a40cc1b6c78fbaa4241340dd4563a5603413cb73ba1893bdbcb3ff93bb7f1132940998427769d19047bc051506b5b990074e8d1bbe2d988699b526726a91513988627c2301b44f206696353cab38f68ca111270ccc6cab887ac3b8bedacc12513ca349228b0d842bc193299ad1812b69c63c2b8233c20121d50793906c4014453e19a62da12c76f03667031f2bcb59a074cdd2417ba3789e7af38ac71335736890dac04f77e0b10529381e930c8c0031f88838efa47772a7b2541963b0c7b063472ccdf6228349cb5619c943067ad86019cd964c64767c838407eb32a4ed9c40581b63e0379d00adb275f6578f065894e8a47796489b994ab9471235455fe1f819f3cc2b378648ac625107805ec8946f1599a8329981a7775523f7c8ef7426d8a31d1d5cc98820186fc7b55076b14d2c7c1533cc3217354bb24661c162aa0895cdc4aaefa666686a0f12d1791adb7392b78d31d6bec44068c4f31cd60a768ac0b056c24864c03387715dc48bc86e1b51a649ce4945708951065f946e17c06f364590e4d16520fa2b47b230f1511fd02aae79bb8fa72791806b0d3e211de92455459066b410bfd4d437f0acbbfb02bfc5e93dc7904b649a6f9a7ab09e2679e13040c8e9754032cc3feb8c2bdc21d8f7aa56ea31370169ebcace98d54362ec24b6b6c63732b882984e58839a7f825b17871820ea9dd0dc8c5e7a15403888e80150cf5a12c5e26040708791d2074df71945d67f221b6d2bbc1b65d37559a7c248516cb4ccc19cc15f93ba6d6085bdd95568cab1069cf13138b83173ea7c58ebbea7516c6ae25bf5e07ddf29a0dcd64b455aa6e050c1d5663245318833cb95702bcab1a11fda773a73454e1055104f917b75d650dfe1c59e807314a096de713e35837ba4f2a5f3991f6ac18302647fe01a05c055ac9d19fe27027cad17633dc0f4693c1f79cf69756e79c9fae7c954a0caf2c6b326e9037042553968ff3007cdb135e368ecf440e4187e554af9d0ff272911ced339e2f8d320ac3cb0c52efdc753282f092bc39baf4a18783a48ea031a191865eb78 + +# Official test vector 62, seed: "f7ae036a0176a9de9a036a542dd2840033277c44ae936d10b768566216de9d4395cd42b116873b69d9804ba6ccbc05d5" +seed: 6500f32c93415cfdbc0bd31d78d5be95cb9060c8cfa2013955b56f8b6868b322393308641a9a4647f230201e1389624a296b55192a9819fcb19ab77c25f95445 +public_key: 60e29047d95726801982a9349aa17edbe89d04a6ce4cc52b24d989327c855acbc39e6b9880a0783166af6d03043bd34eb427b4a8b32676a874b0c18da60759a5248ed4508abfd90723cb161e38058d4cc3b162c75261380c119c712639e50494bf195b0e6a9d4b22803278832d52a6cbfb542f451c777396ea0ba5c9d186c0786180a4a032d12bba793e2e29328c91a40de06b9b754a189c2a01404f2dc7011b036c969b1455f7a6c05b249e83009b52ca5ec643b92c0e4ec9469e3abdfc2b8dbf5638450aa498c345f126782a5c29ac7673a8db84b0f87086da21728067f3193eed391376317450a3acc5ea0322b189f56accb246bdb6ccaf7252c89be8bd846aa9d07995bf2c2c5be82385d77e566c90fd797bd9b2a5dba704d60341b1530cf3f60f231066a06590f6e3c90f1b6bcf5cb316b482c2817462ba2cd3ea4a5f0744db5128b6d07851e15266280414b6710fbbb7da113c8eaa45974c62bdb7b335315e5d093d11e5176f019dddba19b379399c7c88a9911e17d16fc5194b2a1998d219c4a5fb5531ea6e6ad37052a57fb5560ea39719c378b69c902acbd3324f9c29da73145b409a5f79c8629b4853f65d03eca0a8718dfb7295ae3483eee45bdb265638c0511864a0e471a34d839419ccbe42303fd2c51232246e0a6b81d9ab00c50a7fa656893693a8e6e245fa7b119a14336c9a0f57108ecf87a9c249c01d3a214bd42649e092e2c3c8c89a2e4d980b0bba5340330717a01f5b3abd426ccf6bfc3e5bf8969af7278b0c428cc39a36da6a7c0b8bd666a1d07bcd2845718b755d76fa61d3ca51b3b77486708606975fc377b6ee0596a6f37474b91549f6899a3c4e46a5309f035133aab371eb5599809bf32034a73c8d4c0240a306176c6b09135719ce9478d3f8136c189b715c6b4ce6612bdc973f40238994b763065d08308597ca22a3f4a43681cb500a680a476e1110005c6c6acfbc13c91abf636a7eba2a1f1280bf41293f3031a8abf8af4faa1d617a380e925861185a2bc37a806cb8bcf92354a26340481aa0e6230758a667020145057f8fc55b49b530ad5ba6f490c9a73b8fbde960a8d123c648155418b373b1189e10c9f91a4bb15592da329f61682f70e03143846b09c09da648454901ab938928280628d4a57a636397e5ca0f57dab388c65fd6e7bb5a9a0f3f95892973c990f393174bb8aa669bf28322f80a65320bc69b6460be565265e7b8af86587ad9b43f1c3e5a582773045bab8cc6e03329ab1a4e05b33afcf8009dcc67986831d0a60662b427ff5a7b9991017930524bf678c7d461e1bc95fd441a7693c3b842460ee186b3f973b35bad2fc258972c2c309490163109cd6c87a81a2d30bac5c6766e7d151da391a83a2a5e96904cf9f268706b23e8758f514072b43a6d7891a92e57ad6a9b82246a7f3459cb9cbb5e157a957b27c8192407e9820a906cbcad6794e16bae2b0664811400ca22941e576fa6fa1083571ba17884d5073c83b7a7a1ca53a90ac098eb7dd1627c2ec28d61f86fdba69308e27fa50515cdb19445405a3e6c720651ac5199a1085c8ef1995d8db0a43ecabb5229353316780f12258867c65bf257af667da224c271b02f52b8bcf4805bc2031fd9d999b3c825fff0f4c8cf37e52c6007bb4a2b63952a0c223185 +private_key: 218284084cc5e95bb4c8a7648d77bd0fa0b91235af9d447d8bf062d322bc4cd25ef1532433193509d4839baa0f4fb63143e64bb1d35408eccc80da5ccd6123344182ad9734602221c02b6cec762eb6416be03562497768d22146dfd3b04281a0542b4ce1070feb56a0b21165ba91b3b06a0dca42b15f556a5a6793de72c4548969f5f8102b49bb8cb47c8890afc022ba481837c301a619c69731743b971302957207196a56b1f071cb330a7d26327a55b296c8422b87456024c9363798a5fc94b5e026a4a3be75765b2827852908303e6ab4764c33569c657c864a39ab991b61a45de4c3d37811fea6bcbb6708cb27b83178c03571566d090647330cf9b91fa3d9b49fcb0090b226e38322603249005d3ccb00d0a65843fc3149a407b672b88aa3c6331cca33ca7a33136ba5bb4520917a9bcb673f22852240b7a577c3a78e2b0c36e32bffe4ce17ea5dbd016fd00745ddf48775e9274adbb45cb4946bd05b4ee0a38285cdc8760fdb871f629524d3e89438c5afa2ac2b5258c3923430ceb99993c9b95fab5ac7563e6e1068406860ac10bcaea63c609531ba80a637d395485111db501f78a98ac1c0241eab362ef092ec2c4306eccd5274a729b7909002831cd65fca5cbdc9440e95eb2b588c1430903078a625c9b67a4c5955c8ea25175ba7244b57290787ccab76ffb6262679b4b4130426d31d6dc754009573aee9443c4a9af619637be8c52e9486415565a6a3c3dee9a5c9f31d6ee716e0db5c219b01287a8a046bb038939baf2939a2a608674212b5743f6ff99c2a3496cbe21414c646d51399e7048ee398238beb8f0b33806ee33655573074abadfdb22df14952937cacc143c885aa0c7e144e172c1b4690cc6144304475bc02a3cdd84126e3fbbc0d5b6bcc875f89bb4883b7c841d6588a3a5b68a79613d4bb04486a2c10ce76378e07b19824d83ba89a649bb3936e6a060e84b8af0c91e1e6cf9e3b03c00320ecc5b493c88e93f9419c1aa71f27ba194c3022634ad0441f3f36280f6c2e4cbc68aa05a681aa4f16e978b0582e09fbcac4b849800616ff820b5764961e299f462a55a3083477fa15827937c7746e01c22cb1a878dba2ab1d1b5856aab05f3960e4cbc9754351c691c646a29bdbcbae01b670a7284c5a608b8609026a28ad2da69e1d5707770a6c5252917afa476d68ad7c5ca1e9b839aa887e2bc92520552523fac50f29559a803ca9da4fcaa58c1ce05e1d987b05d71ccd4a0eb184a9486819a745010ca92937a16c177c97743cb7fe680617279a0bf40f23a5456ae0346f38a5b346358cf76cf2549528815a272008d748a7a5fb3b9454cfef492b52d350b5710a3f5595e1d6473d2134070733bce526128579d7a80ead61611912644ec5171ba940398301ffb282a0150acf047c25892333514ce4595089c0702d7300a76470ff191b8b8634e56c7cb720ad8429adda29294e1a1a92e06be1e4c4b2a37af7a36515d58873972c1b40336132c0d29c0088989bb4c29ba0cba4b878c8c096c6fcc868efca2d03540f9317adb81b808aa3bd1a118d0ad70aba98792b830c7379012df373820c7e70a7805d357733d543eb657334096fd616c6d1097ab106ccaa3b1460e29047d95726801982a9349aa17edbe89d04a6ce4cc52b24d989327c855acbc39e6b9880a0783166af6d03043bd34eb427b4a8b32676a874b0c18da60759a5248ed4508abfd90723cb161e38058d4cc3b162c75261380c119c712639e50494bf195b0e6a9d4b22803278832d52a6cbfb542f451c777396ea0ba5c9d186c0786180a4a032d12bba793e2e29328c91a40de06b9b754a189c2a01404f2dc7011b036c969b1455f7a6c05b249e83009b52ca5ec643b92c0e4ec9469e3abdfc2b8dbf5638450aa498c345f126782a5c29ac7673a8db84b0f87086da21728067f3193eed391376317450a3acc5ea0322b189f56accb246bdb6ccaf7252c89be8bd846aa9d07995bf2c2c5be82385d77e566c90fd797bd9b2a5dba704d60341b1530cf3f60f231066a06590f6e3c90f1b6bcf5cb316b482c2817462ba2cd3ea4a5f0744db5128b6d07851e15266280414b6710fbbb7da113c8eaa45974c62bdb7b335315e5d093d11e5176f019dddba19b379399c7c88a9911e17d16fc5194b2a1998d219c4a5fb5531ea6e6ad37052a57fb5560ea39719c378b69c902acbd3324f9c29da73145b409a5f79c8629b4853f65d03eca0a8718dfb7295ae3483eee45bdb265638c0511864a0e471a34d839419ccbe42303fd2c51232246e0a6b81d9ab00c50a7fa656893693a8e6e245fa7b119a14336c9a0f57108ecf87a9c249c01d3a214bd42649e092e2c3c8c89a2e4d980b0bba5340330717a01f5b3abd426ccf6bfc3e5bf8969af7278b0c428cc39a36da6a7c0b8bd666a1d07bcd2845718b755d76fa61d3ca51b3b77486708606975fc377b6ee0596a6f37474b91549f6899a3c4e46a5309f035133aab371eb5599809bf32034a73c8d4c0240a306176c6b09135719ce9478d3f8136c189b715c6b4ce6612bdc973f40238994b763065d08308597ca22a3f4a43681cb500a680a476e1110005c6c6acfbc13c91abf636a7eba2a1f1280bf41293f3031a8abf8af4faa1d617a380e925861185a2bc37a806cb8bcf92354a26340481aa0e6230758a667020145057f8fc55b49b530ad5ba6f490c9a73b8fbde960a8d123c648155418b373b1189e10c9f91a4bb15592da329f61682f70e03143846b09c09da648454901ab938928280628d4a57a636397e5ca0f57dab388c65fd6e7bb5a9a0f3f95892973c990f393174bb8aa669bf28322f80a65320bc69b6460be565265e7b8af86587ad9b43f1c3e5a582773045bab8cc6e03329ab1a4e05b33afcf8009dcc67986831d0a60662b427ff5a7b9991017930524bf678c7d461e1bc95fd441a7693c3b842460ee186b3f973b35bad2fc258972c2c309490163109cd6c87a81a2d30bac5c6766e7d151da391a83a2a5e96904cf9f268706b23e8758f514072b43a6d7891a92e57ad6a9b82246a7f3459cb9cbb5e157a957b27c8192407e9820a906cbcad6794e16bae2b0664811400ca22941e576fa6fa1083571ba17884d5073c83b7a7a1ca53a90ac098eb7dd1627c2ec28d61f86fdba69308e27fa50515cdb19445405a3e6c720651ac5199a1085c8ef1995d8db0a43ecabb5229353316780f12258867c65bf257af667da224c271b02f52b8bcf4805bc2031fd9d999b3c825fff0f4c8cf37e52c6007bb4a2b63952a0c223185806aea6700e293f433a97e4b2c8485e6b4ac19ad493c4c16a10a2a884d58f5ee393308641a9a4647f230201e1389624a296b55192a9819fcb19ab77c25f95445 + +# Official test vector 63, seed: "d995d38f934b6e1a7ca77c9522e3d037676cc939b0c8bd4b84394b3dc91a791f09d2d97199258c9943da955e7f7b26fc" +seed: 7643cef2d62cc5aaeecf754653ea62294cd2208e5bf3ddeea209e3dc45373d49eac9d531a532770837a854b4f5531f6e0c8d6c10183b30d3435498c2dd142951 +public_key: 7eac95cb2439a4d5171062a42523cc5ec7caa414654394003942aeeb720d4320c10d609de9c397d0790c585398fe0c42374ac2d220bdc6f507fe62cc592bcab77bb0a5f4ce73a380ba3640b4e491343ab7a33310e7f04c130a70f75b75e6aca5306837e9ac03c84b01c3fa4f5032069f492cfeac1585054a9fc4271da3636639aef3a065f2857a32d590e416866e71ab92d2ac27cca217756b528776a6319014867816d00837e476afc08d5da82293d37042709567052370b553cc925043957eaa3c34d2810a28163e9f4807b492301a4aaa232b1834db5932d20d8866a37fa312ca9cb129116634e95d551764487c384cf00b35682927808a28660d92e51610c68edc994c76a95549c79c162487d445293f0758a43b525b04477c2c50a47a963531b727964828c5b567fb538432c92a8c5a0be6136b9b05c2e68353d5787a0a455dba373ce60f40c4b48be8723ff760ece23d135887be491157b6b4dc8591b5046735c5588cb405057b96de0097f158c67223c5a854be20238126f1203dc59ba6d5bee4d7aa52f1a92441cb23340820d9afe134097bc8512bba1d2097201d6b7952641369649eecb884a4c35848314d2618c283ba9b343922b7cc18bea9cd1a4a3597c146d433692d15c55172847b9cbdda7a049ee455e5e43f6b18a80e60ca48822b1061835431644ee1b307d581add3b21df3367350bde75b1366505b0c88302eb1c6b164290e29204fb005f81567571552a6e22638a0018bdc94e768a9ecc7cc20e50ebc8bc9774c7caea9a1fbe1cc6c925f3fe70fe2f523fa9017b714b7ba820968b3898c1410b7e46fc54226c2c15056ea0ee2c071635b70fea288b88c9cb43a1faad97671e763d04b173426224cf217b2937246ca012edc14c529a2e2d47bf3b15b96804590e5241254a3b1e6a29378522ca0b2598491509127869a1a73dc2f334386c3bc7542f5bab81c89e938071892709f3744ed560c77d43d6ddc2537c544a4f64b19d55917165001bb74d93a1437835442c83b989bbc22ca67e6f96fd44787b8865f759419a409b78f209dc87a89e3ec883441c3ea39627c2524c4f88625594c2b0b5798386866a2c9d45c2d50d438d61c571564040893ba00a7752eb28fbf6b737088103c2a0fdfc87d99b978d2521949683b7dcc98b644504c297905d2417649c0a60ab70b5c674783739fac213f1ac5c5d69f7fe32c5995073e846d12da57cf17a73fb70fe8e7013d681dfb393a4b40922a654473c40b50249362e4aecd22515f256250365660177bf345a2cbd0884933b45d7ac67ef3871969bcf94570adc7bbc2cc948f82b7731a8bf0f980a3c373d30a4e85e1482686ae98501810c28108670078830254b7ccfca27bb0c57c56490e1a5b593816923d722d7c433534980293a1ce65219e0245a2fa049d9fb10fb54917ad82019a51212f0086afa520f34799a0361a083211a415a42b36237d40a5138c5ecfd7c70f5b084a05156df817071b709e745eb3e0252be9b1d89247b6917c72bb9e3ee78dcfb819ef5308f2aa4375578c72d02c348b16fde51f80602d0fe50da8bb5be6598fda0bb8bb1987de7bc575832baf123948215b833821afb7087a65014511a50e800cf6714ab446e189261a2a3dbac768c1e9e232985c430516bd8e18c79aef56cdb5 +private_key: 8d3542bfa71c67eb9c7a824d7179882305ad248622b6dabebf2c435436bb86777a43380bfe26126b1089399cc3816a435621643d354d7b4989646381b6393851822276641698a597cb173f0888a3db31529a41492a5201608a30cea5114ff52686e874a676c8c9a6a5b8429451c294842904f5d4327f6a3bc30b7ebf35be21aca79126b8c3827f7dba4474e308fd9b2f4a80982d93b4c6bcb05956b5295a59a6703e8b6c4e254606fcb353ce2c2649ab07f8e8275b8536e204847f774e5b7a94dafb15a2c5571d107ee771941bec00519c1b2ee464b12b0cb4c002320c0997e5c516f402960b33363c57851a72989a5570420da7dc1d5ea5c885796bb43a9030f105e58546510129c4506b89a62f03337890d89a40ea2ad1e62ba420a321180108a8a1abaa124c5613c4cb680ed621149315c734209530185ea709d6538ebd8c2eccc6c58a1755df1090881b1ca516155b3458800735f98282b1b1af72697c6de29be547cde7f64ca29b6070cab2f9246e068c99777987c86885ef65340e868196b040007784464cb9b7f30a8410b1bf363436e657b1bc2c62d5c14a8ac3d6b636f7714b641560a0e88eb5982f36c3ce94c14a7fb979ba5110a633a2b70517c0eb0e79512844b50ed0c1b41e68bc3f1224c4cb03cda780a5105e2ce01a4921193dd86ab7f41997f893a5947464e32b2092c48fdb1d84c71a74f087e25596cb21056349b15fc73b838bc679f49ab5041fa9d53049070de760b5f574b2d9ab48d5328cb799ae5efa0c17855ad57001f2cab922c4788fa6be39b1b9656a11be63c57cbca770e5217f54b5d61990c3409d0e1306667b228a27425605b9b5802b6b795ff5a5a423138c098b4758553c14ca7a198c9960e806b2a51ee39a0fc9c7136a876187963b02e6c6e4365a33eb1dd938ad6d2510f3c873eca835c9176b4ff5921ef52dd1f671a85368ca35b878347e42b3a3e42b731fd4051f37ad84f5a1b16c72512aa959e8b0c7107a5454ab96b585099b1db79745311a80ceb070c69b1fec37598fb63f32ac282611a5c37337a0c44c960c35800018e2e1c040978260b50cb51217a22104634118d4287e88045229998a7ceac32f532c48358ed48929d7133d67ba96087586bbb37107f5423dc56f84d390ff281ffb8344139caafbcb140d065912678f8ee44cc3c78c681cbe530637de1cab0d0112dc023163031f7cd70b4d7ac2bd43678989412b0804add344f6541e007a46fbd79dbfd4156892a2d18a05c34c028f46ade763103a079d03a3945ea614d8ccc84ffabcfd300acf38c319b32d92bb18a3870219307c0394546de89e738a9f7d88c767825823b2bc0c368990681d183a1d3078b3bd43cf2f47727fa8bc6a4607928090f57c74539ac06413567c4c968c9ca8c5da0632799526b3b9df7c6271aa4906371b46c0b134a7c1d5709d8548485bb2103eaa27bd515d409cc07db2530a569c1d617a218aa215b7a2bfb0999e791f35d07d1b5b12cfe53dee8a8edc91725b138b1fc7001955991dd32bb9196cf41acfdc773899aa1ecab0854203b421406eeb85820e2116aa746466c49837a69d8e18af5d82c3a0fa0777f9800a187f327ca08e0c1e29e13dfd0ab97eac95cb2439a4d5171062a42523cc5ec7caa414654394003942aeeb720d4320c10d609de9c397d0790c585398fe0c42374ac2d220bdc6f507fe62cc592bcab77bb0a5f4ce73a380ba3640b4e491343ab7a33310e7f04c130a70f75b75e6aca5306837e9ac03c84b01c3fa4f5032069f492cfeac1585054a9fc4271da3636639aef3a065f2857a32d590e416866e71ab92d2ac27cca217756b528776a6319014867816d00837e476afc08d5da82293d37042709567052370b553cc925043957eaa3c34d2810a28163e9f4807b492301a4aaa232b1834db5932d20d8866a37fa312ca9cb129116634e95d551764487c384cf00b35682927808a28660d92e51610c68edc994c76a95549c79c162487d445293f0758a43b525b04477c2c50a47a963531b727964828c5b567fb538432c92a8c5a0be6136b9b05c2e68353d5787a0a455dba373ce60f40c4b48be8723ff760ece23d135887be491157b6b4dc8591b5046735c5588cb405057b96de0097f158c67223c5a854be20238126f1203dc59ba6d5bee4d7aa52f1a92441cb23340820d9afe134097bc8512bba1d2097201d6b7952641369649eecb884a4c35848314d2618c283ba9b343922b7cc18bea9cd1a4a3597c146d433692d15c55172847b9cbdda7a049ee455e5e43f6b18a80e60ca48822b1061835431644ee1b307d581add3b21df3367350bde75b1366505b0c88302eb1c6b164290e29204fb005f81567571552a6e22638a0018bdc94e768a9ecc7cc20e50ebc8bc9774c7caea9a1fbe1cc6c925f3fe70fe2f523fa9017b714b7ba820968b3898c1410b7e46fc54226c2c15056ea0ee2c071635b70fea288b88c9cb43a1faad97671e763d04b173426224cf217b2937246ca012edc14c529a2e2d47bf3b15b96804590e5241254a3b1e6a29378522ca0b2598491509127869a1a73dc2f334386c3bc7542f5bab81c89e938071892709f3744ed560c77d43d6ddc2537c544a4f64b19d55917165001bb74d93a1437835442c83b989bbc22ca67e6f96fd44787b8865f759419a409b78f209dc87a89e3ec883441c3ea39627c2524c4f88625594c2b0b5798386866a2c9d45c2d50d438d61c571564040893ba00a7752eb28fbf6b737088103c2a0fdfc87d99b978d2521949683b7dcc98b644504c297905d2417649c0a60ab70b5c674783739fac213f1ac5c5d69f7fe32c5995073e846d12da57cf17a73fb70fe8e7013d681dfb393a4b40922a654473c40b50249362e4aecd22515f256250365660177bf345a2cbd0884933b45d7ac67ef3871969bcf94570adc7bbc2cc948f82b7731a8bf0f980a3c373d30a4e85e1482686ae98501810c28108670078830254b7ccfca27bb0c57c56490e1a5b593816923d722d7c433534980293a1ce65219e0245a2fa049d9fb10fb54917ad82019a51212f0086afa520f34799a0361a083211a415a42b36237d40a5138c5ecfd7c70f5b084a05156df817071b709e745eb3e0252be9b1d89247b6917c72bb9e3ee78dcfb819ef5308f2aa4375578c72d02c348b16fde51f80602d0fe50da8bb5be6598fda0bb8bb1987de7bc575832baf123948215b833821afb7087a65014511a50e800cf6714ab446e189261a2a3dbac768c1e9e232985c430516bd8e18c79aef56cdb533df23b37987c6b557e4c0f8fa9e466312f19e7e90cd0a67abe6a145cbca9d44eac9d531a532770837a854b4f5531f6e0c8d6c10183b30d3435498c2dd142951 + +# Official test vector 64, seed: "5929f02a271725cb40200de32d9d03d8bea53b53ac83186c42c7f565ccb1ca508305d470850cf86e9b2c61a5b8ca1c93" +seed: f8ee95521060c03bb8dacc79f7eb7db640f545f315613a35d447a09e504cb4e13fc3d8392cb53f36ed647364a04e37278a0e0a45b720f4a75c580c9920eba98d +public_key: 616571fef73bf834c480630b9532b244d09c8f936e951961bce56157f237b0919097222df3bc6e61f47d846479a1a5bcefda59cdd8b067d19db6d9586fab2fda9b550c5170c2772ad5a4af4a67a19d215e45575e83a8ba5f099e4358a9e493677ce177f36a0f594912b6b850d3f719c155c01b68bf1dc89ccfacccfc6cc38a34ce5b4c48d2e17dd2946f493a357b1105265153c04a98992c949ed774588925c697284bc537b4d795de0463335aacbf80b10cd0a03a88256c220c3d0074ffc6c8c913c919aa19f25206a1cb7d40a50c6f55960a2298881a71a1dbc92a69371dc9a95d45a7bd6547be9414f4c31ebfd3553b89cfd9ac05727b06bbab300ecab599da76a62b97541cb3474b7390cc49942678add66d265772f55515e0623192668fe4c5273e3176bcdc52fceb081dcaa4ed699dedc59b01a29363070567772daddbcf8605bdd1268882a355ca4163ece88637e932c56c43405ac3844949c819646e394dbdaa475e62ac0463b8ce257520b3b4e141057449621b449c09c5b72d10464e59bdf2702a7f4ba1c1c6301bf51ec41bcbdddc4a069abe46d37c09050b28b073f2216a06d501bc38640600185227a63d224589a43391097226d67240619e2804589f4917db7391a4fab6778c91ef30aa41655e3e433854a52c9ce8130b802e82204bbe894517f1bbb4458616b0c309020ecfcc17f6b69cd0bc688963af0fec8f567a86ceabc9a0383681d3729a612987862e2972b6393c2c93a32861073ac3eb1cc636a52dcc23e6ea0af7d3af49f81858743962978245db5a70c34e90c64560b87ef29b5b568a716904c8326481db98c81cca47cec76e32003b36b26aece764c5551ac07c4bbce094b6772b2faa27b518ca5b96094d178f68a7409992ba7fb776117c66e97cb0be6854908aa8203aa916d26f3118842689a5347ba29d337599799691729b812961720cb80ff993d8a124e2027effa1baad40a17b564b0412681a6005888c0e27992faaa370ea3954775949a553b75aa35d5956373da54da7eb51c7e68c05777760c6b9b0a78ff2f34312876f2db27898d3aa4a187110402537f2aac7373751954f3bbc5445da3907429fbc817fb0a732bf4077d4630c93a4bf6785274019c5de6c3d8a66441620491a8537ffa1a50f0baac622cc765052ae0049eabb20d05b987b303d17714c4e79814dc5cc9593bab612359d0c7a3bc9614d0c8eb4e0a7c740520e077e2215bbbcb693a92c0293ca28b4d0ce316b5e14e165fe4745f9665c36a651a6a8ac11a162b4a111e40851ec2b29dba05590140d28aa945b42310659111a4033f972bc0163bc26a5872957c6977bbf8d727d65a8c806b4699050c994bb85651a40c6d590c337c680306fc231b7487305c4155654471c3003b93c206cda82c19f7b047e12b5cb94490f4bc850c4668b366bcb23bff1a744dd3362e94cbbc658178a012d9b784d12e965f4592067b636ed3ca3bdd89c0b30c8bf798f2282c49ed3835b70ab1ebc761b880e0779b5aa34acaea40c83eb0babd6ca11398759415252064c4e70b62d4cc813d346ca789eb86b5d3606bc3239758a62b5f76a709b602ad6987228433a01a8aeffcc22d0d315d59b15e8aca53b02fd160c62db910fddaaabbc4c2df1256095317cdff9f1e7ebcc48f8382101 +private_key: a89cac07514fd7ea49de1c8a4aaa75ccf901439529ee48160b4acb10885320b568b9377b475b180cec4c3ea2a1f6584df841b54bc8147ec79457896e24b3592a4864defc44f4e811cac6adec8c91c46bbe80d0ccd9f08e4fdb6fe1509e4932cfae8bbd3d299a389402c0e16e9f44bbb34729ec9ab7e56906491a538681607ea7af800abc2040b2411596c1e9669b2c57fed92d1de814b0351f7c99ba49613e8b8c5348d49142141fd104a6c43c66906c389903b91fccb4e3a4245049c134291b67d0c596894cacc026caf067014415d1335829795443c4924e38308da8b229c129c0ba43b98bcad09a20fe4143607c5117fcc1bb89bec1a32c1882b6c733ab4292158b71a76305856bec631532bf830309d7833e09095e008473ac0928db8202bc971821125ff288054348608978417314ca916a3f2596253cca6018c990c3c54c858c33438b28723889cdfa2a5efb9c20b11ed6228560f897c5b5adb6a3a505e4c7138c68cf550d3cf9c21ee12d83f9baa9778707075ce5ca7e319172a0a926e96b421d0c1a3abc2029a3adc2abb5163a51f07924ea727d979996fe4949fb7892a74c1649da7a382426ccaa0d825766abf51d8390bdf6116d107510a1529af44b37d6561feabb8b0704be246632f58a7968db7d3835bad6c49b29429b9a443571a1c2b1b1c8bddb690b387f5f9798ecbc84d0567d53676e93c38a38b63ea8620702c13be48ab37e02c303b2250c45baad168cbab8b87e7cb9f9e55073dc0d375a88ca92c0370b161bb35f4d4a74d6f1a4402bc32a0b50d8ab576834c15305a7ec70525d5b42fab77286dccde4d6cb79aa7c46f425209064622a86ee94a6f5f3a6f23536b63c9ab5f8bbcd148a30d46fef07c4605b2b81b75d46332b340b6719a735078c3508925f5fd4c1107c69a560cce9f74041fb521fa61a552a756bf638c88a61f103ba9adc02787a398bc35abe3993553ac0118124ec4c67a706c3fc60796ca531ee28ad89172ed5ca12bbc84cfeeb35885abdfb5061d6f774c17c1d5755c437cb7827d8107ca8b420d07331d762e73622bd22b4373ccf918c0b08a954d6ca33a1020127346b981cb750842b9edcac1cb9a6d482cd00a80136575017dac0b0345819a3a099d859c2da56a45523d3e776feca225e5a464300648845bec13b332f3bc78a497a41db4f8e88cd18694887a3babb3a97838519d3c0375e95cdec5596e0486c4a354085201e0ca9c6fbd1754cdaa05a9b204f602793aaae97d240ad11ab2c54cd0eb897f76cbd851038b09ab1442b081e6122e5b495570a7bf8363d3ae1c793a9206785b59204b1e7a46974f2cdaf9ab6d830457788921e72862a499f1ea938d08481ea103b9d6b0294bc0c5f90b6b0566ffa897592bbbc3738a0e69cc5e5a127c1622e6f245fa4607e49064aed22c7d082c62994b419807ec9d8b0c7cc3c993c3f1e2538ba21c21dc885fdc8beac5963ce9732c34a0c34637bb368a87bf2452463cd5e66275e94650d7766845bae2d79bb30336adab7aabe52774e5198af3c9ef532cc5c27780849b1cc8427eb1b451591aabc5cc5a7461a578a36ac371c66841c0ff05a90e41e79acb69c31459bc30dff0aa24452709407af616571fef73bf834c480630b9532b244d09c8f936e951961bce56157f237b0919097222df3bc6e61f47d846479a1a5bcefda59cdd8b067d19db6d9586fab2fda9b550c5170c2772ad5a4af4a67a19d215e45575e83a8ba5f099e4358a9e493677ce177f36a0f594912b6b850d3f719c155c01b68bf1dc89ccfacccfc6cc38a34ce5b4c48d2e17dd2946f493a357b1105265153c04a98992c949ed774588925c697284bc537b4d795de0463335aacbf80b10cd0a03a88256c220c3d0074ffc6c8c913c919aa19f25206a1cb7d40a50c6f55960a2298881a71a1dbc92a69371dc9a95d45a7bd6547be9414f4c31ebfd3553b89cfd9ac05727b06bbab300ecab599da76a62b97541cb3474b7390cc49942678add66d265772f55515e0623192668fe4c5273e3176bcdc52fceb081dcaa4ed699dedc59b01a29363070567772daddbcf8605bdd1268882a355ca4163ece88637e932c56c43405ac3844949c819646e394dbdaa475e62ac0463b8ce257520b3b4e141057449621b449c09c5b72d10464e59bdf2702a7f4ba1c1c6301bf51ec41bcbdddc4a069abe46d37c09050b28b073f2216a06d501bc38640600185227a63d224589a43391097226d67240619e2804589f4917db7391a4fab6778c91ef30aa41655e3e433854a52c9ce8130b802e82204bbe894517f1bbb4458616b0c309020ecfcc17f6b69cd0bc688963af0fec8f567a86ceabc9a0383681d3729a612987862e2972b6393c2c93a32861073ac3eb1cc636a52dcc23e6ea0af7d3af49f81858743962978245db5a70c34e90c64560b87ef29b5b568a716904c8326481db98c81cca47cec76e32003b36b26aece764c5551ac07c4bbce094b6772b2faa27b518ca5b96094d178f68a7409992ba7fb776117c66e97cb0be6854908aa8203aa916d26f3118842689a5347ba29d337599799691729b812961720cb80ff993d8a124e2027effa1baad40a17b564b0412681a6005888c0e27992faaa370ea3954775949a553b75aa35d5956373da54da7eb51c7e68c05777760c6b9b0a78ff2f34312876f2db27898d3aa4a187110402537f2aac7373751954f3bbc5445da3907429fbc817fb0a732bf4077d4630c93a4bf6785274019c5de6c3d8a66441620491a8537ffa1a50f0baac622cc765052ae0049eabb20d05b987b303d17714c4e79814dc5cc9593bab612359d0c7a3bc9614d0c8eb4e0a7c740520e077e2215bbbcb693a92c0293ca28b4d0ce316b5e14e165fe4745f9665c36a651a6a8ac11a162b4a111e40851ec2b29dba05590140d28aa945b42310659111a4033f972bc0163bc26a5872957c6977bbf8d727d65a8c806b4699050c994bb85651a40c6d590c337c680306fc231b7487305c4155654471c3003b93c206cda82c19f7b047e12b5cb94490f4bc850c4668b366bcb23bff1a744dd3362e94cbbc658178a012d9b784d12e965f4592067b636ed3ca3bdd89c0b30c8bf798f2282c49ed3835b70ab1ebc761b880e0779b5aa34acaea40c83eb0babd6ca11398759415252064c4e70b62d4cc813d346ca789eb86b5d3606bc3239758a62b5f76a709b602ad6987228433a01a8aeffcc22d0d315d59b15e8aca53b02fd160c62db910fddaaabbc4c2df1256095317cdff9f1e7ebcc48f838210130a5771b76066feb7f606a82cce122964da1be0b6872ee319832214ec677738c3fc3d8392cb53f36ed647364a04e37278a0e0a45b720f4a75c580c9920eba98d + +# Official test vector 65, seed: "905074033d7b75deb2d06a2f29144eb377b452534c5710632989f02d45312d156557e96d4486020826db200153bc4a8b" +seed: b8bd0493a882e3a49b4e0f6256fb1fea0912562fd9ba26ec3d6c9cc12c8973abd7e4b5d8021c486b9c3114d7cbbeb7cd49eba8a61bc2bcae1f1bef30a1daf76d +public_key: 36509aa06326ff5cc174f51d963cb5e5b1290eaab649c91d1a03b9cb45400087248ee90f5b9509b9d44f27e814b55b5d7fd341bb663523cccca02c277f1a12f2e054008405dd7b8fb5b78f200266d62b00db2665a728b9231b99d957904d4278c9b99933972006c0afb2d46ab58810bd59492891a77f96b7e9d06eeac63cd9e3a2039a1f30ab0eb4e6a7dbe875253174f2519092761e9684c00726b8548aaf2ab3bf79c8255ec6c1591234672acad20c0bec4a5ff7b4ab4442c2982799d0203f1ddb53a260b95b51980025140556582a0c5dd9d20bfe542f79a743d45095b25c9565c1bfd1d82e5dbabbf37b934bd43a9af92ae5bac65570cd0586621708a30d8371dde11abdb8079616896533b90611a58843ca38f6105164b1de4b227b0c4b14749f5833c5f76cb5aec703b2eca6fa40c7bd224059a4938bf125653901d5d80cb4fa7213e9136d7c0a4f2059865911f68c19eff169af063e76887f192359e5e60516a92fb1842af25599aaf530b08a171d35be896590ef3a9b7878b4a3764a3bc2a800613ef1c2a31fec6ff7a8c8c4e0158202c4ffd35c1a45738d1ca197f23b8858a31dc60770e38796da35136500ec868e209217b9a10c7ae465848c82e815490da5becb32a55973aadc18afb2172c0d086de7e21d309226fd549219c0aae0c672bbe832c515811584ae3e4a59ba98a80e2a0386a187036961b4f6abeb6a84ae8b55b4e95cc9e812be00ba0925ce00ec3390e7936b52482b420b9d051f91a117122a0778c2434cb661ad59050342c63ce986e1b590d2b0b81ff4c3a1bb5a9ab4cebfa96c9f072ddf8332f5a3ad0a156fb5b6b35e38a595f30f2156815656cc487313c75952dcc12adb5b0528ca68bd53bcb1f750d5f24d15d54e83b165440528d83057fa12a983aaad4048c53c62c4a789b82728a94caaa50f7a7df6fc7d07c76727882fb8aab09811a611c5188dabc366494263cb8eafb78eb40a7f33763ea9b51318f0ac1a7a34be71aaf436ae4248346a7a25e2dcbaab226111d96d5d9165b946ae29283118bc34a46409f2eb37c469a36311caa843c112ea83c0364ec2b8b6e9ec68cb8485bfd87ff560912ff21c43d59a1476952e82a2d3f3a00cfb7c49a61e9216b728fcc30861a23e171c2c7954fd85528d911682066db1a062b50a5a11cc385db16d4f4b81785c9b8368575409738683847cd46f9389128414082c5515b5b3310658c54be69a6c3b02b5e0a1b6627e0512999862acc0b34340172a9a0b144627cac4d36fe8d71272e6ac69ac94d1f8c250515580b85d8ab300bb29b43b02195ea7c966947bff9cc323d017b48bb4f6a88b0201956e095b8092b250b53dd9f58ca90b28eab574034372d9f8305b39668bc90e2b6bb77257252b0bc36ee68ad25a7c883691a494c5626b5bd870c45a06ced4f39fc7e21958811a7b7cc93410b2fd8245b45b7462f72033d86ef2fb9b173397bbccbacaaa7177760202a8748b440f82d49218331c3760918c640dc58073883b5721548ed6e529d7f95e02a65cd7bbc3383317fbb166bf751f47fcc216513742596c2e9bb75ee80d2dc16d036b1d45102bc2275aa09b8800213f67dba3987a2f5efa1ae2c7868ce276c5110f462e65b39b2f4f753b3a3d41eeb50f7aa17723bb620b800aa3dbdab7fc +private_key: 8a4487c253844156a9eb333c710c70398293058632014350817b2d98d68b4e0c536ee79febe01f3f423836e34436600866ca139193376db576f3920d47181eb7b2264cfa494ddb768bb10ddc002d55d25724d20f9d125cf6718466d7840941cd4783bbffe342f4a584cab59e0322ca151bcaa29bc76dfc0afc525e0791b3f9e6279d56cfc4775d84054b51e604d5ebc1a8922d783c840a9b00cdc58da2ec4a5fc1bda820622e5c10051c3c041571685697bd49ceecfa455e11af28e8a8f9c0b6c74314d2dcb8b571c5d78a7ca354567338344a305338897241d3991f3b4bf448479bb36f9fd3183c703f57f5903918bb71fcc701f586ea719e2e8183ce605575819514f4c59b72aa76bc6c0bfcb7fd19c51ef3612d45a9ecb396cf5b13c96a0bd7d3cd70a84a2ed11e66fa39c5967d080b8f7106bf00a81d208c66fa31c94e548e50849c992608db9c0ac1816ade777d36a04e6989ae0d5c1a703541f2f2ccd4570e9657cdb17202880c0c5ac3ab15b13552f91632255b02eb9db48973a3990495900acfd3b3301b38bfc4374758b0d6956241600033b55f30da2f8d1a046c27c80a403b935905f455943b0459a9a5046bc9cf54b82e175a34e628bf529a225ee25b07d73bcc4a80fd4580dd0ab679185718e5c196e25f4bc89c206409a5bb0d1c233837776832338a1d1b907e493c6240b0c6524a9e542b91f48080011b3ac1ac062bb528399b04c3bcf114a0f46424cef1c1bbb675b1999c8ddb883e7b40a1ba5ca13875bb022d8c088c810601ab2c4844aa916ec2348af4c28b552c08e970e535cb674b388bca5d3566a6edf10d10856b2eeb796bd8cb8b503f2bcc7cbecc528ed121bde4782f717e5f63658cb7251694bf0a4c2ea4d98abc70a4d87994a3317a206c34ae972a54e74d235418a5790cadc9333f2c9c349744bceb28d5bc7ae1521ab708cca937a9e10072f412a26037312145500eea42d04a549edba62185a93c1cadfbc4721fe827db83c4fcca759d575eff93848baa22d23b5a659cc5c3c3608684229bd736dc6452690c742a59b9c9e9adf6aa0fae27664a28c1490bcdf1865802a9ba2a6b49951b3753c12f3ed57fc88bae34d21befb269aa3663793b56fe162a2a47643ffab946f94cd012479f5bcd1a6a6b8019bcc4d38e180bb993d319f43ac809cc2bb8a63c9d2854ab569da8f7c0b1b24088056d799b49d6cc12bcd15ad75c5dade497ad0b312b9739214098bcf2cf90604a72013c3b52994a691105c4060657493947be3b0a6cfa91b83580457da7a6411a984cc661f0b7c59a012c5fa895096a354eea5abf893e2eb7389d0a649481421b13201ae66e3b3b4fbe6818d0f47ef7477f14e792b35ab3fb2737f9ea1c75a3001445920c2b1c65c38ea42a02d017c93924c4b3e7492574c368401276643549f5afb69177a4d807937102686958a1d564a8184624fc47e713b7d9728ae6cbcff5c52ba4966429b9c0dc659081156bc7c398d9a9bd4807907b307b1501a8bb518268897dc8610b649494aab4743e5ac392568b771433808476e6b32dda6940865c3e43077e0d9bbcee84cfcb523895b36c5596880f036648f37d483138bdf24c40d182ceba0dd3e26236509aa06326ff5cc174f51d963cb5e5b1290eaab649c91d1a03b9cb45400087248ee90f5b9509b9d44f27e814b55b5d7fd341bb663523cccca02c277f1a12f2e054008405dd7b8fb5b78f200266d62b00db2665a728b9231b99d957904d4278c9b99933972006c0afb2d46ab58810bd59492891a77f96b7e9d06eeac63cd9e3a2039a1f30ab0eb4e6a7dbe875253174f2519092761e9684c00726b8548aaf2ab3bf79c8255ec6c1591234672acad20c0bec4a5ff7b4ab4442c2982799d0203f1ddb53a260b95b51980025140556582a0c5dd9d20bfe542f79a743d45095b25c9565c1bfd1d82e5dbabbf37b934bd43a9af92ae5bac65570cd0586621708a30d8371dde11abdb8079616896533b90611a58843ca38f6105164b1de4b227b0c4b14749f5833c5f76cb5aec703b2eca6fa40c7bd224059a4938bf125653901d5d80cb4fa7213e9136d7c0a4f2059865911f68c19eff169af063e76887f192359e5e60516a92fb1842af25599aaf530b08a171d35be896590ef3a9b7878b4a3764a3bc2a800613ef1c2a31fec6ff7a8c8c4e0158202c4ffd35c1a45738d1ca197f23b8858a31dc60770e38796da35136500ec868e209217b9a10c7ae465848c82e815490da5becb32a55973aadc18afb2172c0d086de7e21d309226fd549219c0aae0c672bbe832c515811584ae3e4a59ba98a80e2a0386a187036961b4f6abeb6a84ae8b55b4e95cc9e812be00ba0925ce00ec3390e7936b52482b420b9d051f91a117122a0778c2434cb661ad59050342c63ce986e1b590d2b0b81ff4c3a1bb5a9ab4cebfa96c9f072ddf8332f5a3ad0a156fb5b6b35e38a595f30f2156815656cc487313c75952dcc12adb5b0528ca68bd53bcb1f750d5f24d15d54e83b165440528d83057fa12a983aaad4048c53c62c4a789b82728a94caaa50f7a7df6fc7d07c76727882fb8aab09811a611c5188dabc366494263cb8eafb78eb40a7f33763ea9b51318f0ac1a7a34be71aaf436ae4248346a7a25e2dcbaab226111d96d5d9165b946ae29283118bc34a46409f2eb37c469a36311caa843c112ea83c0364ec2b8b6e9ec68cb8485bfd87ff560912ff21c43d59a1476952e82a2d3f3a00cfb7c49a61e9216b728fcc30861a23e171c2c7954fd85528d911682066db1a062b50a5a11cc385db16d4f4b81785c9b8368575409738683847cd46f9389128414082c5515b5b3310658c54be69a6c3b02b5e0a1b6627e0512999862acc0b34340172a9a0b144627cac4d36fe8d71272e6ac69ac94d1f8c250515580b85d8ab300bb29b43b02195ea7c966947bff9cc323d017b48bb4f6a88b0201956e095b8092b250b53dd9f58ca90b28eab574034372d9f8305b39668bc90e2b6bb77257252b0bc36ee68ad25a7c883691a494c5626b5bd870c45a06ced4f39fc7e21958811a7b7cc93410b2fd8245b45b7462f72033d86ef2fb9b173397bbccbacaaa7177760202a8748b440f82d49218331c3760918c640dc58073883b5721548ed6e529d7f95e02a65cd7bbc3383317fbb166bf751f47fcc216513742596c2e9bb75ee80d2dc16d036b1d45102bc2275aa09b8800213f67dba3987a2f5efa1ae2c7868ce276c5110f462e65b39b2f4f753b3a3d41eeb50f7aa17723bb620b800aa3dbdab7fc31fcd120f19fe976236711e58b4ad172d25ce01eb88bc9d6d051c56564a0db11d7e4b5d8021c486b9c3114d7cbbeb7cd49eba8a61bc2bcae1f1bef30a1daf76d + +# Official test vector 66, seed: "a3e2e511afa7bb560446bdadf67d2ee2e16ffc7baeae7efb8c5455068bbd4e91bf9be9d98b280072faba7712c75b26d4" +seed: c0407e41ddf48d333978b89bcf2db01e4613425b456249e76a6f25b8a2827bf5b2dca81e3f5f748d23c9d356a2209f6b2d60247b2e45c9808de497f64f124643 +public_key: c5e450ab970d5cc6678db12ae81962959a3d68d8a4fae40ed343cbd2e84322e2342cba7756328fb5c80a3fe07295db0e136621f8acb8eed4685cf21bb28a7fd34a9c6af4a8d1fbc8db21ac4d334afe1b71b87cc1ddba5501d38dd7e74c6c502ba04b8d1039322734418dc438fca99d0bf44f700ca473d07c0ad5094181bad2e90910c08478920461c750aaea6658112933753153aa9bdf090ef91a3f08e7c07278369df0bea9220b7d4c6b6f6a7135a5084aa54ddd270e9d41128d1944d8e7c3e1ac11a4089fe4541324db369445b5afecc41406b277e8bb93f310de57b55deabd8d2ccd2e9a417ed916ebba260e0baf95ebc0fbfc0a1b63b6f5342b3ed7c1ff4135f0a26c3daa7e2d60bbab8051123628abbb3cf9fc6369a46d4deb7ec0032847d7474356aec9a417cae8b62c9c7bf3b077eaf52c622b6a2bfa6ac49a9cebacce996a29f89acf9349363606a86a6696481233c73b273e847798b530b8662194896e22ebbd8f3640864791964069684338f453710d841aa83a2997316fc3ba06e7d6a3855cada69c35cc801cb49928ec66a56cb8a28deb2329d75c6545251ebb8526903a13f5174119b9c2037b06c165d2012723bc817297c42465cd77044436337591f239153629c3140b0ca85783d2460b207268f013988176f4c22d8ef5c096c93a52706931b4399a1849488665026a615e5955d972429eb32213ca16b587b0f7366192366f523732fb1127731cb06bc39f15f35b1283654bf361f403be5a9ab154f786080cb8ec42c8ec356847839de84a23c6e4321136477c12b20ca5642efc84c658323f90c2509b62df865e54072aac311a6d3b4eb9073b17f2291001a37e6ba438918a42663bb4d15896239f9f2b2d17a5c93c024ac595806620a8891b89f7297901a9b63e7c799cac22a515bfb3ca9a4772a5bc9a11154011e4dc0d758868a9f646d5390c631381e8566fd5603902c11686cca1f876322cd7793c338876d82008eb30f32128511a872db5cc0ac689c75266d5a9bdcd889f73dc92f1dc5076f373be64308012553d3109c7b5b2a819afdb93bb3447c878901813849c5fcca97b116ca1c2115961ac4b8c926303bd7f502eb299421cc9cb82f556327584118c6930e03f4368ab915c3df0a46b08518cdd280e17f86824958f0ca8079e857d8ba9a522a49c3f539c845968faf37e4beb443b577646967f4f824c2a706b3a7b74866aa4bfb83dd8e4356dfb1d9f4678a0a120cd2569101b034e36bf24a58c690b69ea27ca88db6645682c13b57d9a397b83772c5357082dbb6981674a772b6a94d0210b14a7703202cff38419297edf92a305a59bc51a022919b1b61bc853abca39721b83a794f1c27d17da71a205571573ce31ea27f81b744371274d6a8138b69ef967adcc75730a652f134b0f198b86a2a670a96c58d45295433851f61850d7b318245849a140a407a60080abbab77abf58d8c46f2580716a0bff0481b1973c804a406dd2bd08370ccabbc9fc7557b26534cda249ba1b3afaf2956f10b0b6ac0a7ef02252f5869a972142e06b86b64684b34b2592bc91b7c5b24c14d232b81880b3844409c6038e06023321dca0f2271144373fbfd47884f3ac96e4bee4dbfea5eedf79fb157b32e2818048bcd9b8e9bb89118362e59c75b4917014c2 +private_key: 5a837a98d1b7d23c06ac804f9008924221681a5b35141311b383a995a75dcac87baf79b484eac622a6a594cb1ddf122030096548285bf7da99f27a8033f1ad1e442e3452913092a0f666ce6a910968e00b1785658c576fac3a68ac13abdb91255f6b5104d26750894e02a9610a632b558b4739858f72b9ced305cbf9c6929a7664ec49b6f6d18f728664953b77427180e6b2895ba6a56b391cb1263c5154061e1a4c4da221418b363f09c669c6918e911e793b92249885299923783ccee355330118199deb5a4c6890c5e61e45a2c89b3a74657686a9b1987834b309e074133a34a4a11ae92a9bb6a4af14c15b2705252fb69cdd159f5084159681183fd01287555a3ad3314871483c8040cc20894d4a5aa239cca6c733fe17220e55394c2a2063d30497716255bbabdef6c71a925a24f201b096a39ab3caa54438222b23f6c16f07910bb04a04aa1c8299053855f4a8cc852df639ce559abdb7e1a5ec9861491269bb829226bc1e99f392c1c6364d64886aea98f0e25c1f27862fa64aeb017b73f30aaf8cccf543c6e054b23b33bf926125cb263f844c70832aa6f9d66141903aac5b7ee78734949196c54a558210c91ef006e266acf833c77fd97f75b8800178b6e2b89a81764f9e851189e2ab41dacd5ec31604396d5811641ff21a40f9c45bc947aed2c629b457684252cb713de7d25955a66dd6e801bff34028101a21d10c3a6624c234b0640b4c26140e345b778a04929a596176d922dcf737f5198f677467f2990ddd5194fbb5bba6ac7a8f2c90801131bd1c9fc50cce2c802ad8da968fb71acd79ca2abb87991b90e2a76e5d547d96c4a300c32c0da3c29bb40d611b7923c4b6796b8dabe5a277ec1b444050f0b17221744e38582f95faca6807b566948203f00a0b4a8a77f724c067c5c464cb59b8547ed3b2851b9f8eda807317b5147533ab879a26b982187366bfc50266435dc2a96e8b104694f63c355435d6030aab601755b30b38e3434352660ce98e89528e9c54245846c58e914363d61d33d825b1c8c6ae439e6959743f3b6f2b762916f65f6e765044b4a3a6244c37b1b0a671779a840cdc5a7db3703a670c4f5e9c65c9bc814356b4aed09f60162ecd143f86e3b81071c917124615821e4c5bc98b312d2ff525d178a61efa0d465565e5700de4069d3c7864fd15aa9bd4c49242b0cff231aed9a270e41aa5c29e74787524a6085a129795ab5c9049c985304478578a907903aea16934f73dcdd17ed1fab3c629605bd1aef9d16b674a6411123a0ecbc718927b18642acef5a055d47af694c34b300ab6296dc2884984441eafc861ffd7767f306b7cc72f3580ad5214aa130a7e89c634c6b1923415c75dd0a256461ee6f94271027779d0b79c8b943ca32c2f62832a04cfc79786eb017f561c0c5eaa60bb44800e2ccccbd64755c8b6008bc89c52827e737dbb37ababe87980407c503cc5972a34c76913f37085c699b4a95ba473e21c14080d26315db9f17969f6b629b48de94309140104f7dbb4511a8977266101c26f5b1c78e3896e051202ebf9a5621797c775b1a2b3b7f3a53cfb9c90a545473000569214c151088a082a237a8aababa3b69bd3cd415cc1f9ac91c5e450ab970d5cc6678db12ae81962959a3d68d8a4fae40ed343cbd2e84322e2342cba7756328fb5c80a3fe07295db0e136621f8acb8eed4685cf21bb28a7fd34a9c6af4a8d1fbc8db21ac4d334afe1b71b87cc1ddba5501d38dd7e74c6c502ba04b8d1039322734418dc438fca99d0bf44f700ca473d07c0ad5094181bad2e90910c08478920461c750aaea6658112933753153aa9bdf090ef91a3f08e7c07278369df0bea9220b7d4c6b6f6a7135a5084aa54ddd270e9d41128d1944d8e7c3e1ac11a4089fe4541324db369445b5afecc41406b277e8bb93f310de57b55deabd8d2ccd2e9a417ed916ebba260e0baf95ebc0fbfc0a1b63b6f5342b3ed7c1ff4135f0a26c3daa7e2d60bbab8051123628abbb3cf9fc6369a46d4deb7ec0032847d7474356aec9a417cae8b62c9c7bf3b077eaf52c622b6a2bfa6ac49a9cebacce996a29f89acf9349363606a86a6696481233c73b273e847798b530b8662194896e22ebbd8f3640864791964069684338f453710d841aa83a2997316fc3ba06e7d6a3855cada69c35cc801cb49928ec66a56cb8a28deb2329d75c6545251ebb8526903a13f5174119b9c2037b06c165d2012723bc817297c42465cd77044436337591f239153629c3140b0ca85783d2460b207268f013988176f4c22d8ef5c096c93a52706931b4399a1849488665026a615e5955d972429eb32213ca16b587b0f7366192366f523732fb1127731cb06bc39f15f35b1283654bf361f403be5a9ab154f786080cb8ec42c8ec356847839de84a23c6e4321136477c12b20ca5642efc84c658323f90c2509b62df865e54072aac311a6d3b4eb9073b17f2291001a37e6ba438918a42663bb4d15896239f9f2b2d17a5c93c024ac595806620a8891b89f7297901a9b63e7c799cac22a515bfb3ca9a4772a5bc9a11154011e4dc0d758868a9f646d5390c631381e8566fd5603902c11686cca1f876322cd7793c338876d82008eb30f32128511a872db5cc0ac689c75266d5a9bdcd889f73dc92f1dc5076f373be64308012553d3109c7b5b2a819afdb93bb3447c878901813849c5fcca97b116ca1c2115961ac4b8c926303bd7f502eb299421cc9cb82f556327584118c6930e03f4368ab915c3df0a46b08518cdd280e17f86824958f0ca8079e857d8ba9a522a49c3f539c845968faf37e4beb443b577646967f4f824c2a706b3a7b74866aa4bfb83dd8e4356dfb1d9f4678a0a120cd2569101b034e36bf24a58c690b69ea27ca88db6645682c13b57d9a397b83772c5357082dbb6981674a772b6a94d0210b14a7703202cff38419297edf92a305a59bc51a022919b1b61bc853abca39721b83a794f1c27d17da71a205571573ce31ea27f81b744371274d6a8138b69ef967adcc75730a652f134b0f198b86a2a670a96c58d45295433851f61850d7b318245849a140a407a60080abbab77abf58d8c46f2580716a0bff0481b1973c804a406dd2bd08370ccabbc9fc7557b26534cda249ba1b3afaf2956f10b0b6ac0a7ef02252f5869a972142e06b86b64684b34b2592bc91b7c5b24c14d232b81880b3844409c6038e06023321dca0f2271144373fbfd47884f3ac96e4bee4dbfea5eedf79fb157b32e2818048bcd9b8e9bb89118362e59c75b4917014c242f75d6e3755c28f3081ecc9db44f6cc7cec9891756d74093716697781fc8cb5b2dca81e3f5f748d23c9d356a2209f6b2d60247b2e45c9808de497f64f124643 + +# Official test vector 67, seed: "074ab1a37ba5a0403d8f68d26fb787bc2c90f5ef88f2a6d286c3e6b168abd85d393d8225618608b8eeb301d26af53bc0" +seed: 334382d39164d1989696a2ff77b25a28af8bead9883b5365eb6fcca7c1781cc9aba5068af837be962f439f233593d193ce5e08f7d66efb3389885927b89d2523 +public_key: 08f7945e6597c9872b0cb4b1401288d7915be8e3715a8391a486047c15b4ab758c8d9b47541c3411417a439bb2144049744460810c01b778879425077e91ae06c1bb831c75e9d1552264a6543266e769b898b66644ca93f9da7735135d743c62a3876c0c891ab71c73c9b88b5cc14de0238c82103fa8f634902a01ce5b15e7823a36aacf6a05639a812221085b38b2ab933a12552c268ccca3cc07cb4e1ca03cdc02b1a5a8231a386456b26878b673644bc3c1613090454b582d5845268f381eb0e70128c1b06f356a9da736222400acea7c58216040a1affc5771081743b5f0721ef2b601a651d8a2658eb9c5ad8599c2f040f791ab5d93c6067ba30014af51766a41c70be6542b7224767301885a030a8d68a795e9924ed844cba1b696b18c5a64abc7ab83a163cae74ca186c01cafb53c05fa535d43786679a429677cd3f672b7c9cdf9224030b32c3a147ee0b2a8e50a0905a778ad9269bf04c2a801a1d986b15cda0ec2f51deec2005d450bc070c5e9e2a9646c3a6029beb907b632f17163b260fa5b75944b00d776862c3c362d06b7852ace9f93afbe9a4d77c548d04c68206277f569875fa677921c671fa887b98866e8c25815fc09d194adcdd34430e2c3725178f6c509fb359e5c3959d72b37a52c303490ae22138dc495bb2bf0c4fefccc89eb6b70764cf64cb2b02699e84a562f076dc4221153d8bc1dc0a29387a15da95eedc808c666b3caf04882188b5509106ba5ba1869463834b48dd9a2d7d6b46de1b83834b7db556a0b624869641a7b77c1f15291696798fd0cc1d01c417062ab36548f4f7b842e99a85a502d2ed70bb82037fcc6237f058d88ab2ded194bc6f65c723656474830581bb92f196e9fac65fbfb0e662c34cd1739ecc28ace01291f24701ec6a836a11f54d44fb50a9150d9401dd96c39b1b02ec73b86827fa1cc39d3ec5d5fcc4523a948a30bb1da4b3588f029c11234b9b571ec3593e82a0cfd428ea68b727622464fcc35e3dba3bf911cdb717ad690147ab70def66a2a66052a3844b7f6866c1b4bc80c106d3155d4bcb8c13239fc96241cb1b092696a50502a887547638499216fb31379a45bf7b43f92175fe282d98d7a4ad22844661256b711228a31fd2b01fa8f72dd357c455768a77cca28e6984913c352726176e2192de562781dccfda024fb4315eb5b14b9430bf0e783ad77a763b631f6c03c4b45aba24a88e85b70fc3b1c3049447e688c3f2145072460b838546572a42f4659a71a95392255765426451f137e8b4ca64b5c24e5cc74a816a988447ce07886cdc59eadcacf5cc5b17b4b0d058c0b3b610df489066e402ed63a5d155161bac9f2e82bd0e18cf46476935fbcc0daa0ccbfc72cae9b217d3adcb3ba7e0b759aab167ebf40f6cf92eddc17ec44508d051a6302372faa22a993386201827bdf3a1e932c093ba2cd1bb347096b53919218f321bd761abdc6ca5086c51b0c471a6c2781d1ccf20bb567ce472fc663ab10b75bdc6642832acab5c5d4db37a46572645a166edf46ac243805ac78e5c483e25624dab2aa705b9b3f6d01bee692351fb4301c562e30a513f6c73d55c0bdcf439f3f62f33e42f7f876f5314cdedfb4526a075924c59dc03d5f604585571f7e69c7c8f254bcc5af0ced187401efacef8d61e38 +private_key: dbb0bec6fa248682bf1eb3b226d9bb45a19beec69998797fe4d9275f1a6ba518ab41e117059338f8052945a36277678f84f761fcea21b49b9e2c85bdd2c78df17a04f121c423ba89cf15c90bf34ed5e341156206c2abb93b8924d6fbb1182ba029178be8b5b38ed868c86c54ae69b491f2450b96205484b7070aabfce83a6f0a024dbb837cf26ffd613d106c6fc6fc81f23b838782b72f7873c9f6735e71ba2d2c7f80c29efa2aab162767b414b71b1bbc5258aa61a984b2202e06286d8ae9cd14d2bd7b229e039613eb081bbedba792297cd6672241abbf5643703b098fcac273236687cd8ab0e4d21fe2e15d786c37a09741bc493bbc908f20eb7599e6a5a102030eab2ad69266ad30696eb1072793b6aa613734554f681678fb8068aab0c903580f6329baea7155c1bb09e846ab15427e0a092c3213ad42e3c1cbcb48cbca59aba88b9f60babd8087b461a2745c2973c04a8d11cbca9b3a74f7415d975004db90c4b985d990ac3e01bd72a446f2e13545052a99371e459c589ce203012182a2746d74e5b914b872678c999523b6c5ec790f986ca98c448117bc397643c339432ab2b058e340e098ace6c6a1b0e1472e8ba11cd898107ab9454a08b965329ce8758c199f10fa5c914cc236706e0a35cb5f2c4bc749b38e2184486a88be97127ec036fa78a5780b3f0515b391ea6598d1b998141d3461c141b54ed1770ea2938066d40dc3256bc6da09184b7957070391a1cc8629181954669da8c33c94511020750387417f87080907bc8e48332d293cbcfa6409e814b79154b135c5a721b447d45ed274731a30215f92004e30ab64fc87b061c8940ac9153957a21aa54ca9be2ac1acbd46283ca83219200788eb152273c61b860aac104f66e8043e7727216141097878d66a30eeec7820f6c1f140989649c2f2354b81597b298826225332aaf6ce5b6ca31ff986a665067272c6a190a454bc3654699dad2c3660e371571c8cd0b9b1e0ec5ad43106758c3b2adc01f2e46a95f662ea6733a62c2f7f67521065655c1c9e40615584b553a4697141ab010ee4a2ac76c4703043dc41a675309774c9279ca11c717ab9518074f9c77d10c4b973fc9e1fe1026c9c0dedf68db0d7bd63c67750db13e4120eddf4012ef42dcd7907b52bccba359374b48ac4988f4b6731c20295eee277a09a1140c30a6f6062dd152425d9385046417ce4808c7a44046b3c3773c90c40589524acca23b4755b23b267b2c5904cc3a634750b863bbb44243679483997a52a703ed867c57a0ac8227bd4115e88e9461481bf5ca1c6226283ab201844d25f2a094955d131305b5f1bd91789789f4790c193da4f4426693b9575af109b0824154f431ff1171e3c48686833beb3b3a4f31388f0348f6831acdaf70fb983502e8149b71511cacc7ffc0a411eea2e781656487139cffb9f7089388800ad6310015dc85502b5ab19e2cea1fab7eae59ce1429bbfc55471bc8644204596b264284c31c21b1e3e64909ec044b0342fff306486bac1c5c2aff2e52775e7338fc8b9c6d8a78538473ce1181b08048c6129eff7ad07c85bd24c2803c57a28eccbd3623713a5368c7228bfe0547566a43a1788e9e4489f8747167b6f08f7945e6597c9872b0cb4b1401288d7915be8e3715a8391a486047c15b4ab758c8d9b47541c3411417a439bb2144049744460810c01b778879425077e91ae06c1bb831c75e9d1552264a6543266e769b898b66644ca93f9da7735135d743c62a3876c0c891ab71c73c9b88b5cc14de0238c82103fa8f634902a01ce5b15e7823a36aacf6a05639a812221085b38b2ab933a12552c268ccca3cc07cb4e1ca03cdc02b1a5a8231a386456b26878b673644bc3c1613090454b582d5845268f381eb0e70128c1b06f356a9da736222400acea7c58216040a1affc5771081743b5f0721ef2b601a651d8a2658eb9c5ad8599c2f040f791ab5d93c6067ba30014af51766a41c70be6542b7224767301885a030a8d68a795e9924ed844cba1b696b18c5a64abc7ab83a163cae74ca186c01cafb53c05fa535d43786679a429677cd3f672b7c9cdf9224030b32c3a147ee0b2a8e50a0905a778ad9269bf04c2a801a1d986b15cda0ec2f51deec2005d450bc070c5e9e2a9646c3a6029beb907b632f17163b260fa5b75944b00d776862c3c362d06b7852ace9f93afbe9a4d77c548d04c68206277f569875fa677921c671fa887b98866e8c25815fc09d194adcdd34430e2c3725178f6c509fb359e5c3959d72b37a52c303490ae22138dc495bb2bf0c4fefccc89eb6b70764cf64cb2b02699e84a562f076dc4221153d8bc1dc0a29387a15da95eedc808c666b3caf04882188b5509106ba5ba1869463834b48dd9a2d7d6b46de1b83834b7db556a0b624869641a7b77c1f15291696798fd0cc1d01c417062ab36548f4f7b842e99a85a502d2ed70bb82037fcc6237f058d88ab2ded194bc6f65c723656474830581bb92f196e9fac65fbfb0e662c34cd1739ecc28ace01291f24701ec6a836a11f54d44fb50a9150d9401dd96c39b1b02ec73b86827fa1cc39d3ec5d5fcc4523a948a30bb1da4b3588f029c11234b9b571ec3593e82a0cfd428ea68b727622464fcc35e3dba3bf911cdb717ad690147ab70def66a2a66052a3844b7f6866c1b4bc80c106d3155d4bcb8c13239fc96241cb1b092696a50502a887547638499216fb31379a45bf7b43f92175fe282d98d7a4ad22844661256b711228a31fd2b01fa8f72dd357c455768a77cca28e6984913c352726176e2192de562781dccfda024fb4315eb5b14b9430bf0e783ad77a763b631f6c03c4b45aba24a88e85b70fc3b1c3049447e688c3f2145072460b838546572a42f4659a71a95392255765426451f137e8b4ca64b5c24e5cc74a816a988447ce07886cdc59eadcacf5cc5b17b4b0d058c0b3b610df489066e402ed63a5d155161bac9f2e82bd0e18cf46476935fbcc0daa0ccbfc72cae9b217d3adcb3ba7e0b759aab167ebf40f6cf92eddc17ec44508d051a6302372faa22a993386201827bdf3a1e932c093ba2cd1bb347096b53919218f321bd761abdc6ca5086c51b0c471a6c2781d1ccf20bb567ce472fc663ab10b75bdc6642832acab5c5d4db37a46572645a166edf46ac243805ac78e5c483e25624dab2aa705b9b3f6d01bee692351fb4301c562e30a513f6c73d55c0bdcf439f3f62f33e42f7f876f5314cdedfb4526a075924c59dc03d5f604585571f7e69c7c8f254bcc5af0ced187401efacef8d61e3843d6c8562cdec0e87d00c8ca8060da3f031ab663ddb43148eebd67969b7fd490aba5068af837be962f439f233593d193ce5e08f7d66efb3389885927b89d2523 + +# Official test vector 68, seed: "cc0c86cc0abf86fa21899be1953913c00e7c46e6b5f730c4e88b3c034012763981d7f14459d3081638080378348856ea" +seed: 6995143e8eb8a6e93840f76eec844f67d2b5f75b1839a5040337e61f9806764a0f4dff8e56f68440836a072412a30d851ace2c7c6f02d60e7a8420001a63e6c6 +public_key: d743a9918c149231c6bdf338098c07f21064775b6700ed30fb2153478b67b0f344da35ca35e4b7c289a503d5ab9eab6e374279ec8ab67b2264d7b9b80d6bce26098a305734e44342a5078597f3bd574b931c3c74461c8da856239c24c576815f7f48cfc026baeae328a8207f5091cb7248615ac076f12763f8b63c0b75a1ef075b6e1c61b1c3bacb9c8895286e30729ce083b90df566ceba4c00e06214c295ab2b95e2b70032e04422572c87b475a63b53fa84ac9fe3c8bdd3cd06c13859b263d22a588b8126f2c615e3a705e0ba960261b47638a9e83c5bd3f791b362652290c5bcdcc4f3c93909431a4ef875c5e30f0c311e5e8344deec53c3b4bf584932f168710f66cbe718886e2ace059034fcecbe39d50d012c0ea26b8cf13807f1117f32661cf997145470c8aeda68022ccc43d1bb66732f5966c11ec221ac678bcba824f43c3eda94401c17c4877490e4393404db53a27b1dd3aab78e152a58f3741e1bb1b9a8202df64434ea9c5a8c9fe7584ea538250da92295d3a4abbc3e392a36cae9af1cc51095b2b2dd97ba7072acec4b7b83bb6d284c5fb3fb634ab3012e8825f8748022d8cef7367ae46b021df68aa8239d06c09fe0555e07dbc356293d41bc4f1e133ddca95d2298b2aea88aea5637d262390a79980220095d7116447c5d5b6ba2b962c794c899f45860658a0a530c7669134519a501e5a0759f9a50777a2a6dfb942f98b50067455a7b692fb1cdc2c10f64e9114b29cbe173ac4fc2adb95c550ae7a55387bf01ac3c45222fed7bcf9e240a6d9b0d088c032aa9714a6a55c692635b6911d92353c68794be250dcd65782a6674f87343a6654324f47f5ac9b384b22766d0c96852753a4449e08371d5128f31831ee766219e910b1f6267a57bc991da5b2b69a5a9212ba06ac917d45c9aa25bc1b513f7144217e84f1693360ea0690e51688a704c45cb6b1071a0e9a130abdb6cd3b52b8a429c33d126cfc10c73c928da9507aab00950f37e9bba0ab981394b137e337a88249100da175fe9299de1d1130381b3fcd265f7b36c00959b5bc2c150eb7dabf05bdf590e32e063a01a7cff6a9a22c56752c8b948502f3f8ac5ca444e10bb6bead1c7557b2bb2e37d55646455162806a7778b1938fcdb7da3e64c01c4a36a847b77958d27ab9defa6256b6a30a9b9962175c13721cd28e979e0d60196ba8c3c940aa4718d39a9b280486a6c2264640c4b09642499957be9642b6b545dbcc868098332fb103d75e38eb7ccbee64a341b38b0097479c019257be03d5d290e89a6a6f0b61039b128b46b02bcd750a9496ec4fb8dd6378e1ac77aa9f37a75d072d268c365725926cc76b58b9da040c173d7732e1401ab222553d6aec7911d052c569c59393997372e548086abb4de201ac1c17f25d76fb58c4ff3380cc5965720b989f4aa252623c215369076e771fac786e7f0ccdd917da64126fc610eb76948f97a5c3116869a11a46e612d9df04be0b1af0e8c8bb46607ea4bc4b4b04b3f79a30a2a154691a79217537b97a7dff6ab4edc9e2ad6cd97d3aef52837aeb232f799a3ce30a6adb88f6a0aa73fea00bf0146cd5447c6dc483b4955a0a3c241e7cc353c2c7085b84c5162a49e7d61a2d0e85a009833f3eb2305d7d435e2a4c81f358aa8d0dd50628096f4 +private_key: ed0c4dcbcc3304e1646a04b9675b94430b49a83bb1552c211f8928c47785c90422bb658f33890f3fe25078cb0c5d52ab737c647b2080e32164de411c489664d5ab23130c1b4a409c1c0296bce722bffab9d60ba4854c9887f0089567994e3375e438069bd40cf0e08e1de134c1f902d0abaccffa0e866122f28894f5275a8a7c2be316811032738f99b53af64c6b346fca072ebb38b665ea616687042b240c53501e18a424b5150b98a4897a168e5be9b9a1f04f0f14858af0666e177ba7f52be6508674ea48fa23313a71372be5a718a13d41f4887892bfc013889481339b2438f8516b24990d70c1159581a109fa1cdd460e6910465e71ccc362798670933052bb03e23768c3c255d0bc7f002e7dc299ac0145bbb585b9682978302aae26047bc8a2cac90589da65d604abaae2b36bf78604d33e23a67544a79fb8131970199116b5bef702ba74506cf72965d7d8bd8b438935c1c8a1e535806009ea22a5ef4b215003b67627358151238bd50391c8384a938e7098929b7870f87321903c819c6480c992cddef1c969e4a1ed4a98d367994394571ae93a61b4336d537140887c792290a196b01bc7c30e364618fa371ba975f49b4637f9bfcc7bb1ae789156c4ab2fc6cd62195a44c7572cf9239c3b951bf636b43cccae63b82cc2bc4bc6a03ba5a087c534339905f4280b7a79186b2652f3582c1865cb6ae4b334f75cd7f358f2bc69cd1b0d21a7ac35c926772ba764a72157e51e38cc66392a1bf409a068e033b00b4a4d04516873516bec242ce93ec073c366e8534e4b55fea906daf090eee9a1fa4a17e61a644ce54536f70871e61a2a728ccdd7c1e702869a28a2ade4cd234119229c9cfe80ac664bb2016125b3822ab240989e79a72cc26207ea4b139bc1bf5a257645b9b372763d4a318d4647024c797b8a1c2d49bbb4857cd1272f56b8342c46541000c84bd676bd533e9529072e77a8f73164fcd8443c3079c1ab5ede2305e6c5c22af691a25ace01436e43d56e204b4dae93cff827c061d1354acb6cd4070c92bb4b145bb0649a6fb8985e03e4a82aa178161a2bbbf23562b342f4818100b502c88904c196c08920aab3ea154c9535ddd8c9c12911500a38db80bb70c3794ee15f7a44097a7407851007b40801d16c417e5905eb994edaa2807b9c7bef6bca9065374b856f95f09fdfa2751c20c5a42a3adef757efb8276303a6e65c4cb17abf0f97c29581139fd655d4d80224275799645008f42ef508ac9445c388a989b3ac09627041741c30b433a0d0b81a59d237753ace7a89c1dd0689cee8663ae8497e9bb885436021d4ba553c706faaafe7c8478e346caf5280e171ba24672e850cb80e491be2195749a8cac30355f5b386e47a65b22592a1f7b09317cd6f3449bb22aba8c2711e979e898a2706d80fcf52af28a68f0f7a0f6c3221ca73918140447e166a00669929b915c4aa507e49672b45154c92239ef0190b086b65fa9e4ce7995e39166c8ba70b5026ee2745c2cc409e40c56294a9d4539101cace01a2861d31924d8c3f7e824fa8bc552bf6b70c042bef1192d1517091fac862776c9a33cec6939d89a30130561d400552c195c702bb9322378a12e144a0f956d743a9918c149231c6bdf338098c07f21064775b6700ed30fb2153478b67b0f344da35ca35e4b7c289a503d5ab9eab6e374279ec8ab67b2264d7b9b80d6bce26098a305734e44342a5078597f3bd574b931c3c74461c8da856239c24c576815f7f48cfc026baeae328a8207f5091cb7248615ac076f12763f8b63c0b75a1ef075b6e1c61b1c3bacb9c8895286e30729ce083b90df566ceba4c00e06214c295ab2b95e2b70032e04422572c87b475a63b53fa84ac9fe3c8bdd3cd06c13859b263d22a588b8126f2c615e3a705e0ba960261b47638a9e83c5bd3f791b362652290c5bcdcc4f3c93909431a4ef875c5e30f0c311e5e8344deec53c3b4bf584932f168710f66cbe718886e2ace059034fcecbe39d50d012c0ea26b8cf13807f1117f32661cf997145470c8aeda68022ccc43d1bb66732f5966c11ec221ac678bcba824f43c3eda94401c17c4877490e4393404db53a27b1dd3aab78e152a58f3741e1bb1b9a8202df64434ea9c5a8c9fe7584ea538250da92295d3a4abbc3e392a36cae9af1cc51095b2b2dd97ba7072acec4b7b83bb6d284c5fb3fb634ab3012e8825f8748022d8cef7367ae46b021df68aa8239d06c09fe0555e07dbc356293d41bc4f1e133ddca95d2298b2aea88aea5637d262390a79980220095d7116447c5d5b6ba2b962c794c899f45860658a0a530c7669134519a501e5a0759f9a50777a2a6dfb942f98b50067455a7b692fb1cdc2c10f64e9114b29cbe173ac4fc2adb95c550ae7a55387bf01ac3c45222fed7bcf9e240a6d9b0d088c032aa9714a6a55c692635b6911d92353c68794be250dcd65782a6674f87343a6654324f47f5ac9b384b22766d0c96852753a4449e08371d5128f31831ee766219e910b1f6267a57bc991da5b2b69a5a9212ba06ac917d45c9aa25bc1b513f7144217e84f1693360ea0690e51688a704c45cb6b1071a0e9a130abdb6cd3b52b8a429c33d126cfc10c73c928da9507aab00950f37e9bba0ab981394b137e337a88249100da175fe9299de1d1130381b3fcd265f7b36c00959b5bc2c150eb7dabf05bdf590e32e063a01a7cff6a9a22c56752c8b948502f3f8ac5ca444e10bb6bead1c7557b2bb2e37d55646455162806a7778b1938fcdb7da3e64c01c4a36a847b77958d27ab9defa6256b6a30a9b9962175c13721cd28e979e0d60196ba8c3c940aa4718d39a9b280486a6c2264640c4b09642499957be9642b6b545dbcc868098332fb103d75e38eb7ccbee64a341b38b0097479c019257be03d5d290e89a6a6f0b61039b128b46b02bcd750a9496ec4fb8dd6378e1ac77aa9f37a75d072d268c365725926cc76b58b9da040c173d7732e1401ab222553d6aec7911d052c569c59393997372e548086abb4de201ac1c17f25d76fb58c4ff3380cc5965720b989f4aa252623c215369076e771fac786e7f0ccdd917da64126fc610eb76948f97a5c3116869a11a46e612d9df04be0b1af0e8c8bb46607ea4bc4b4b04b3f79a30a2a154691a79217537b97a7dff6ab4edc9e2ad6cd97d3aef52837aeb232f799a3ce30a6adb88f6a0aa73fea00bf0146cd5447c6dc483b4955a0a3c241e7cc353c2c7085b84c5162a49e7d61a2d0e85a009833f3eb2305d7d435e2a4c81f358aa8d0dd50628096f43cabf1c47e7aaada59ded4fa8ce378ce1d9eba621ebfe8cc96a111aaedc4b6cf0f4dff8e56f68440836a072412a30d851ace2c7c6f02d60e7a8420001a63e6c6 + +# Official test vector 69, seed: "6d5a7cc326ecf3983c4e7683f45263a37f692f3bcd2d920e1fd9584350119e74f9a3f905f70d3e20318c1413de2a0dea" +seed: 995eff7e0d195c6d0533f3dc194d47e60f9ad14696144cde694d60a95f3e96b4b28f7e7a15a005f92400ce33db073d49b53871594a88fc45e0f94207b5f0f2dc +public_key: 8e4458305ab8304a53b5c47b42911ba1b011c4da11c08b281e625f6f37815dbb1f3908c4c1646142b14d846b8400114face5cba669179ef121436a1975845652c5cb4ff62fa0073738f0264401adbb78b44e61619977804aca17deea16bad48655133144781b196c2a949bbc9aa8714758061465a9cfe09f2a1316ca875523e07fba515296309b6b7391b8d192012278d684b2527318f30a7c1e598a05027409f65a7f36b57f693a660c7a9f2b0bc38420128b87b005b5ce7631e4a10ff858831cb0112f5b6f04334565563e751820da374ce2819e4ed9bc5a959eedc4052c502abc54baf3fc0e426b77de7a274f81451070042e70c19a09421454141d2600df76a740423cb887065939cfb657a76785b35a5868401cb4d88ac8194769ad2499f2f20ed2a188e8e47e918cba7342b4c8893fe411b47b058b0070771161970c4331ef67be34bbc4781171bfa19d51e11612f93cda611f4ed88f85b87e8beb6359eb410e7175ef6171faa03e29e11ea8a6caf023c357a87afc652a00cd422020295bd34170068d31b7a058800026a49fa1f7523ebc5544389cab259815114d4b01d089d3cff6956f5d0b5a9fe652825b1150e21d11f562196892ca41941b46018ee73683e008525059496a07bb029737103b729b1fcc13ac3236b47c63a6ed4458a9724ef7b62361e75ba726be6774cf6b3572657b2a6abcb69182cd3b880328bc4f52c075c150bb22aab08cb2326815712ae20cf1f257b9e6ce0725782e9590191b2055a45c4467c5e7d70c35b8a61a48a317022c298b612782203a820f2161844f6a6fea58ca9f230713c701aad2700bdc951fc9bb8f560db9e99f2849afefea6c366c982f3680dea24891c631a1032d9d884a5ad9a11fa8331be85f1c91c6de2b4143ab403b153d9dd714db314c683ca24cc45f86c2276058be32ca1cefd4116ba386069856c6128ca86a63fbf6c15e876d63f738f847a32166b1592c3307d9c6190c5c42b7ab756ccb394c7c26c28fcd158bfdac9f04c99e30254d500cd0da1b9f2b74823f14283a888bdff45ca218b89b9450fba868ea9b1a5858509137160db31aa292863ed216aef822123c294a825e26fa3adee0291ab37c1462c89a4981949bb764f4222b3527dfd8a715682d159ba380339971857272c7bd7442cb73739c450b58cbeb6936b8cb619654037856935376acab92026bbad18c512dec4e19671180599e01651f008c3a04007cf02535ad7608e1e9257fbb04e419976294702e84341531b95e1b20c2b152a4d849649113c69a8f379b5d72aa86e01a4c5202ab2e276712f1131c411d4072cb45147c562c60080c56eff7aa7d90c4dc293b01ba935e345b88faba62dca043d94c4a666786c35f9318a579a9b67e429144240d206612a6d802fdc24aadcb42b0db4251e06df92a67e632aa4a29000a77cb2fd2959f851288464c824872ae6a9fa1bb3a71d8879e303c51445956ec8ae49c4ae6ac4de2047edbf3c0b23a29b8b86b83cb24530b0d17739331292bab85868e4a9bcbb2b4d4514e52d9afbf66172ae560c08c7f9cfc0c98ea4ec9c785ffe76ab5098e9f3c5ead6a7759b529661b50e0368246c5afbbb9b876c8072c1c1ca63a4e6607fe4286fd2062614fcfb544fca36edf0785c37bb6f5fc33e2b9d9d03a0a6c +private_key: 2e497feae75af1f280abf2085c0321a00911d5008bf8a4042ba44691367fccfcc2d496cc40e113a0d056b5468b190c0e2e629f3264797f0c3b647865f4d782a9601df6bc5f03c1437a23b5d222bad406874f1459f1f9aa3ac061a20677d9d785535cbe7073667e4c916725af4d7302cf76bc3c23ab89666a2019625044a8bd954df6d68c2114b31efccb7d91af07f3ad3faa852d4162fd847ae7a11d8e11133089b9307806a9237ae3a9949043b10107acc9345c17697307e0c6c3ca1734f6cfbde73c6a09aa1b8159c51179ea8b93509b223668849b1b7c59118033f969b9d34b354b32bc0b7540d3ccd2995bc36abe44c0394ef5724b058d0a575947024ce6e72463389bfb36bb851864c38097fbac7204036de72cb0da94cd2f98a1e52c1e630748a7c05838ab53b2d33b0d541c1bd31a2ba803f4205616423534c982038622b70ba4778886f2d15aaa681d6468848fb0601d7097b99040e9e8a981749f741127c6a0000b0c32e28976ecd97514c2aa15f82979497e1da91bd3200d4b0ab373e41a56aa9aba24693cf9c7939cb8733c27a7707eda2aa4f3f304c5215edfa3cc3f785bc0ba83d9f291f8787fc0032f112133fce87441b473961cc87629337cd4acb5367432cbc7407585a3e2463de228895327e883604a19ac2c46389f1b0706f720db8c17f709a796e03d53046c4ab2013afb40ed73247d0c52b0f88e2c9100b1b31813346904978d3bf6bf13b4a6c54c3894f2a2266a9987a4c8505cbd94028ef7963c97d80575549559bcca5d78c99af532b31a382567a6b1e8c56babbc5863144fc81c6322806a6269215740af996b0adaa72f425169517d1e48ac1349c343214c52482b9d19aae42c4a6ddb550040b30ccc82e7d5578355b7313a1f84f872170a6107a52008aa47988a5a78a15a6d070e308c59bc630d1a1292fc2a41c86967b4a3b3ee312ee3c2327a80cb9a112b07b9b0e5858191164a7a87427a8423f7116c2e84377af5cef303b7e9069661f1047c15bc52876c45864dd78854d0f07fd2e530fbbb9b13a4034cc38e34344d5ec41cf544359b93ccb0338bcde09e9b938d5e0c2065126ae81581f62668afc819f705af3b82bca5921699602c6af9810084933c438d4de95a6691ca3ff425fa04b614bb973d899bb8748a7571b112545548f08ff98931eb555f8308ac724a8ad09a90f109219c3032f4013cdfeca92b4cbf23e528ab6abb29370361baa8f74c3a2ca8a29d6a893ec06e60979e351b4ff6247b8fe3923cf027c55363a9243cf9a237ff09c0666aa7b6c56b17a63fec016b4c15cc70c59dcdf3294cc0c72df53c9b0b00d2383e7f48335108629762793fc70642ca91dfa1ba6d97a1a36a55fa6c9d73246a3930b31fb644e34579c2866fc4c5671667b0dcf1aef82bcce732052d766673b398aaec441cfa73dfd3b463e8aa018c4272eb0c3ef15618f9acad61bcaf64017648539c766eabf8038f5467d446912c98836055496b1b7d777cc82eb255766568822704a12640ade87d0ba066b4f3405177c9e1e41f624c5ae055887d68c97be0b0eab254dc3756d00bb8e78676ff62a94f842e9f5774b4f07b723577c742bf4623b0adf246f87c53944cbc8e4458305ab8304a53b5c47b42911ba1b011c4da11c08b281e625f6f37815dbb1f3908c4c1646142b14d846b8400114face5cba669179ef121436a1975845652c5cb4ff62fa0073738f0264401adbb78b44e61619977804aca17deea16bad48655133144781b196c2a949bbc9aa8714758061465a9cfe09f2a1316ca875523e07fba515296309b6b7391b8d192012278d684b2527318f30a7c1e598a05027409f65a7f36b57f693a660c7a9f2b0bc38420128b87b005b5ce7631e4a10ff858831cb0112f5b6f04334565563e751820da374ce2819e4ed9bc5a959eedc4052c502abc54baf3fc0e426b77de7a274f81451070042e70c19a09421454141d2600df76a740423cb887065939cfb657a76785b35a5868401cb4d88ac8194769ad2499f2f20ed2a188e8e47e918cba7342b4c8893fe411b47b058b0070771161970c4331ef67be34bbc4781171bfa19d51e11612f93cda611f4ed88f85b87e8beb6359eb410e7175ef6171faa03e29e11ea8a6caf023c357a87afc652a00cd422020295bd34170068d31b7a058800026a49fa1f7523ebc5544389cab259815114d4b01d089d3cff6956f5d0b5a9fe652825b1150e21d11f562196892ca41941b46018ee73683e008525059496a07bb029737103b729b1fcc13ac3236b47c63a6ed4458a9724ef7b62361e75ba726be6774cf6b3572657b2a6abcb69182cd3b880328bc4f52c075c150bb22aab08cb2326815712ae20cf1f257b9e6ce0725782e9590191b2055a45c4467c5e7d70c35b8a61a48a317022c298b612782203a820f2161844f6a6fea58ca9f230713c701aad2700bdc951fc9bb8f560db9e99f2849afefea6c366c982f3680dea24891c631a1032d9d884a5ad9a11fa8331be85f1c91c6de2b4143ab403b153d9dd714db314c683ca24cc45f86c2276058be32ca1cefd4116ba386069856c6128ca86a63fbf6c15e876d63f738f847a32166b1592c3307d9c6190c5c42b7ab756ccb394c7c26c28fcd158bfdac9f04c99e30254d500cd0da1b9f2b74823f14283a888bdff45ca218b89b9450fba868ea9b1a5858509137160db31aa292863ed216aef822123c294a825e26fa3adee0291ab37c1462c89a4981949bb764f4222b3527dfd8a715682d159ba380339971857272c7bd7442cb73739c450b58cbeb6936b8cb619654037856935376acab92026bbad18c512dec4e19671180599e01651f008c3a04007cf02535ad7608e1e9257fbb04e419976294702e84341531b95e1b20c2b152a4d849649113c69a8f379b5d72aa86e01a4c5202ab2e276712f1131c411d4072cb45147c562c60080c56eff7aa7d90c4dc293b01ba935e345b88faba62dca043d94c4a666786c35f9318a579a9b67e429144240d206612a6d802fdc24aadcb42b0db4251e06df92a67e632aa4a29000a77cb2fd2959f851288464c824872ae6a9fa1bb3a71d8879e303c51445956ec8ae49c4ae6ac4de2047edbf3c0b23a29b8b86b83cb24530b0d17739331292bab85868e4a9bcbb2b4d4514e52d9afbf66172ae560c08c7f9cfc0c98ea4ec9c785ffe76ab5098e9f3c5ead6a7759b529661b50e0368246c5afbbb9b876c8072c1c1ca63a4e6607fe4286fd2062614fcfb544fca36edf0785c37bb6f5fc33e2b9d9d03a0a6c2853cbbda86e7039b635d4cc850f494d42b240acb54ab2316791e9ef5b45f1d2b28f7e7a15a005f92400ce33db073d49b53871594a88fc45e0f94207b5f0f2dc + +# Official test vector 70, seed: "f68fc0314dea88f66afaa76e6c9b6804b13d4876924410d1f526fac59a62e26c560b125b1d0f8b461f1fc2e351effb4f" +seed: 3e809ec8dd0fec0d911a4e3fac20f70fbb128c5de94dc7184ca7310ae9157a98d8128601c28b1def8d393a0db283229f7c7383152a814e7cefe8ef9d9768c473 +public_key: 77155f91195dda2b52c1bc4ff328c3732799ea0aa8ed4229e9a239e5b5c5a02c1ebe98a381dc56e1d4b56deacda3ac52b1088805476c01609a0a2373a4bca788227172c4431b000005d855ca059b4e554d3dd2103cbc7854a12cda368ce202873f5747450c4fd994898dac5926765536662c81581ab4db18e9763cd5a747659440c9a33eac713cf907ba0d5a875b90882de31b5df825f337b46451705658915630035724c127c9c4b48572951770241993f777145573bc70125d35f1b03a121d09ba4388889568ba109f04617360826ad48f2765944232b1cf636fdf3c39c40ab87b4b50bffc1019eb0fecc35cf7416ddb3146e275cc7ae209269a7330977e9dba9caf79c99e30b8880525caaa84401cbde7ccc0fda4b250b7a2a651b3afc123eff52eec55650029af651b2014f4669de319435b7dbedacc173c3dd1f3a8597b80c9c3869d7389398a2404e790c9463f2634cc7351bac9d74b62b73e7e54cbbb3ab235c7c1ce298c0c0369de33224ab7b03517856e43cef2d39f1d325d1e221998c53631d32a57a880f24476a7e89f8c1b2d1c49759c322e993cc7effb2bab738f2648bd8133208ef26ffcac76393714859ccce0515d4a7192ded6ae5e828be6653b05cacf0df1b4816a972592089ff88fa421a490ca13c6789639c909c4db18ee43a01989c51b6005ed2548ae24ac8cec10bda7649e6c9359c45bf0ea0d39f25bb1ab3c3b5b88cda24caa8c7c7106616ba05da6727896d2a895835c9b83654b358e0d4728fec8a150b39283e345f3e06b4680bc632009eb85adb811277926662e531db27b3ca60843a6370c304c1dd21a94aed90c3663c0948bc12f0a32af533866f5931d5c74423246c16aa4f01808d06a6d50444ef8a3171ac641e9417e2e025390caaff16c6703680951b1a0e5abceb8fca9830c9ce1aa08d5803280f31de3cabc923b5a1a7c4854d841729194d3685c03f975a72440b5fa01b11868a48bcb73794c83644d1d39b9664c432c7b3bc311703ec01d268a34a8a1b3dc79b9ae07b8cd133b7d4baba7f39b4088043e4a35fcd08a9ef141b78cb1f64841ebf894827bbe1ec47509817ba27cb42222272a00a633e1b2ab344bd3778e4a579ac7d64a32e2356b1822c1334fa0e6acb05798f63192ee20629106130a1ac330c6cf0200908fb37184740e5caa5ad44067ac7930f696bc9226235d212d71f57ffc2c8c185c1f3d717271022f2d256963dbac5c5a1404a71e3546695eb27d73221892b5bfef114d6f88415875c013f16e48d3cdb68c2000a39a45263504e0a7554386d68a4d3992c9f6196015066d3b8282e8d3398d2b5f62d7af54698418862db3a84286f142a8cb44be011e0f2594d161611cb335bdb018d9e58cc71a363b29439d54cc6b293af33b0dbbcb80c7797819a96c1316a783f60f987a3fbe1acf80f22f610037d17247122c4ae2b2214638205328c43fd4bebce93d47c02b84e1cdee7cb48805396c24410d71ced4805f36a105b05c6564ec3450654cc0a12e62f7c0da79496ff2bc97b7b4809aa30d577a2f3428e48220239b1b97d9278dd26d93d186628812fc697d961442879ab64b4ba0be3c46f5e55c13222058b407c1694979897ca0615e8de05d85d3532060076acafc8e0aadd8ca7406c7bb316abfde1bcdd166 +private_key: 65f04f655904f41a6a88535638821638039eb85517c3899ba016172b8b3120b90e4717c51fd0a6a1d8cb799562e1901128756501bb00d4b695e11ccb335b6fc4537b236c4fba1885d89b2de48427a65357c31990d9955ae7323b30244a0f296a259c5deac728403481f0745f275401c9482ffcc3cca44832bfc0799164cbccab87bf04b813b32801f2ca915a9b35d60e34e95a74e660441a686c89397c915290821989286168b6ce76e485c946179dc484ce6bb94c9c375a899afc6932cb9876796bada211b849101aa4c5b837453cf89a0642c91721b01abef1a78ad28006e25762a65d23664c79c87cf79cbf4ee38070905e8b561a254394b9a4a3d40bc23ca6a2e98bafbdb067a34c7f450a2ec9c419c8816fb71ca46d177e148541d3ab6dad4b467ed7ab1cc94b57413c31880a418c56d851ceef706534871ddbdc8033679d82eaa69a4c4872233ec12ba28e42870e4a43c3ba3e0e36cf7cb740fceb3af481904007051c137d702c890d126f7e6b1d401bb4e81a4333d7c8ee5cb8636a984841c67817411862af5e3605fe838630a680c773725495812bfc4531106ab13b52c2d357b3139f9495c2d4e4a77a07518fac187185b2be2355dba0066d8a418bd7aa5038c6f0d4a3e5a074d409a15fe77ba7e176cbf2c7c20b10116737b6232851e688fb3279d060c8c24005a73780e7713255e6498fb50c056222f376cffebc723ab180d4eab9aee52a1e08cc2a73b90419a056e32d660c7717884f897809df5c42921871a1e59ce36aa74cbcbd9fa3069897a0a76113ab6818482548db03455a58b127dc5daa0cce8a5b5f3f10a678d04b68fb46fb6a94ef87161743b2364098a40128dc3181c551cebe151389431972498317b52d4f5332d6b74210d783d9c461453347f820acb6e4a3315a2496cc683590b08b0503b31b97688a1f6cc957c6c4724faa6a0b982859e961c808aea88862c750c6045b57f53963d83448b228847384754cd45dbbe015e6254c055163a60c02b41988cc2511fe70963c632f8180333c532109047c65ebad0aa56d3bd136efc88b6dd832bd810cebbb9ec40cb44754bf664773d5466ff0b86848314432e085761c3d81e2669ab41d9e3c1ee343ca24bca795eccfd6942dcc27170a74a02415bb732ba880a5cfa922b10e4973067109a3b210b02b691c8aa4a931252546a77b206098ba78f6e4781660a29a00ad98307b76cac825a534003154002977ba8150d3847fcb513120f43b2aea6788e5c17bfab456d7b96a1ca2d217b86ba5b87400cdee144717f5b34fa842778c0917200482c99571a36a133097365b7e36621f51ab88b0d0b3aad022f39b4ef3ec1cd0459ec3c80e56524173a2047b099c304c71e9db708ee55895dc1b30cc8fb1b1887f312d70c8b399944b4de4be1542a27bc0569674a4097288b9c60982149270d57d766c09a47045527ac8d710bb41f8c34edab551d0c022a627c2078edf078b0464b81b46057296b5ebb3571ea000a72065ad11b5cd36accd5628283554f38b6aa39bab97a171cf0cb3664842686abe589a9321d7b911b371ec5a31d13a4e91c8118d504360f668591163fdd233a6bc5e65341703cbaaa931293cbac5d0f16c77155f91195dda2b52c1bc4ff328c3732799ea0aa8ed4229e9a239e5b5c5a02c1ebe98a381dc56e1d4b56deacda3ac52b1088805476c01609a0a2373a4bca788227172c4431b000005d855ca059b4e554d3dd2103cbc7854a12cda368ce202873f5747450c4fd994898dac5926765536662c81581ab4db18e9763cd5a747659440c9a33eac713cf907ba0d5a875b90882de31b5df825f337b46451705658915630035724c127c9c4b48572951770241993f777145573bc70125d35f1b03a121d09ba4388889568ba109f04617360826ad48f2765944232b1cf636fdf3c39c40ab87b4b50bffc1019eb0fecc35cf7416ddb3146e275cc7ae209269a7330977e9dba9caf79c99e30b8880525caaa84401cbde7ccc0fda4b250b7a2a651b3afc123eff52eec55650029af651b2014f4669de319435b7dbedacc173c3dd1f3a8597b80c9c3869d7389398a2404e790c9463f2634cc7351bac9d74b62b73e7e54cbbb3ab235c7c1ce298c0c0369de33224ab7b03517856e43cef2d39f1d325d1e221998c53631d32a57a880f24476a7e89f8c1b2d1c49759c322e993cc7effb2bab738f2648bd8133208ef26ffcac76393714859ccce0515d4a7192ded6ae5e828be6653b05cacf0df1b4816a972592089ff88fa421a490ca13c6789639c909c4db18ee43a01989c51b6005ed2548ae24ac8cec10bda7649e6c9359c45bf0ea0d39f25bb1ab3c3b5b88cda24caa8c7c7106616ba05da6727896d2a895835c9b83654b358e0d4728fec8a150b39283e345f3e06b4680bc632009eb85adb811277926662e531db27b3ca60843a6370c304c1dd21a94aed90c3663c0948bc12f0a32af533866f5931d5c74423246c16aa4f01808d06a6d50444ef8a3171ac641e9417e2e025390caaff16c6703680951b1a0e5abceb8fca9830c9ce1aa08d5803280f31de3cabc923b5a1a7c4854d841729194d3685c03f975a72440b5fa01b11868a48bcb73794c83644d1d39b9664c432c7b3bc311703ec01d268a34a8a1b3dc79b9ae07b8cd133b7d4baba7f39b4088043e4a35fcd08a9ef141b78cb1f64841ebf894827bbe1ec47509817ba27cb42222272a00a633e1b2ab344bd3778e4a579ac7d64a32e2356b1822c1334fa0e6acb05798f63192ee20629106130a1ac330c6cf0200908fb37184740e5caa5ad44067ac7930f696bc9226235d212d71f57ffc2c8c185c1f3d717271022f2d256963dbac5c5a1404a71e3546695eb27d73221892b5bfef114d6f88415875c013f16e48d3cdb68c2000a39a45263504e0a7554386d68a4d3992c9f6196015066d3b8282e8d3398d2b5f62d7af54698418862db3a84286f142a8cb44be011e0f2594d161611cb335bdb018d9e58cc71a363b29439d54cc6b293af33b0dbbcb80c7797819a96c1316a783f60f987a3fbe1acf80f22f610037d17247122c4ae2b2214638205328c43fd4bebce93d47c02b84e1cdee7cb48805396c24410d71ced4805f36a105b05c6564ec3450654cc0a12e62f7c0da79496ff2bc97b7b4809aa30d577a2f3428e48220239b1b97d9278dd26d93d186628812fc697d961442879ab64b4ba0be3c46f5e55c13222058b407c1694979897ca0615e8de05d85d3532060076acafc8e0aadd8ca7406c7bb316abfde1bcdd1662d5680b483287bbd3e61a91839cca9e761429186176b7bc64034ad43f16f65e9d8128601c28b1def8d393a0db283229f7c7383152a814e7cefe8ef9d9768c473 + +# Official test vector 71, seed: "a229218b0d51f58d915df549901548fb0722f352c7470900e7e4d8399205764a319bbddbd06c00e8c5932722ee5a404d" +seed: dbf1c465fff3d9f783bd9ee61a573715e45691147b8904439b5ffaa64f94ff7bb6d75eac6c76ced1b0a025b40a55440712ad8424672e761e9bc400d63812006f +public_key: 697588a4004634fc1c77215f0677879aab3e63b51ae7436c5b47370e226eb4ac15dd0281ec65c56b83b60ac42de17b1374d1680b76460e294d841c1062638cc003d043a26307c08025a594fa3676df03c87789a4499575948b2574f6931673936e971f2c79598a1b7b35d28103252b4df98c47f6afa057bd87b1cc516722fd72bae0f437479c1ec6f68087453e23fb4381e5930e5a19fc9a267565b1dfc7aab9c13441101e57d9a4a454a6d1249c3cdba091113d0f1b257d0986f23b4fceb35c95ab05e2911dfb2899398808582a6b1aa9950eaa9c87c8bdae7372d46c2852e85c629c25e05a169900b24cfc0a68661b6d44c74c658ab8c00c756861be79272339a60828b9f0b8a325850b41950f97849dece714c494ba9bb09b74ac16138251363b52dc166f220623982c19ef565f80583b84d0b91267ba98b63afa31160f65961181951019419fc0627cc48de9d6b2c689969548641009cdc56b02a140bbc4a995a7f2593e0213cdd2cadbccbca41947fc8033baa1754a8815ad52cc31940451f8a62dd6b39e22a6b0db8a0f953c6cbca43f9c1285315f59ab9980ebbf57c1457dd8361da04e0eda771cdb37a6a54c6a47719790976a957978e198446320aaa840e0f1c076260e75e9a92980891aa6245e003f1fd6363d0b6e5c73b476b77ef867a60b225a99a763d0ea80a4c61739875bce5c0f361322450c93040b4d6c08120827b8026ace0ec73302fb6824367ac89a0e7df45b850618612ace284c2da4421689d8c7034113f9a1b2342736f5f11cfdd7ac7f8468075a4a2d7960dfba9e264514a8d7c6d11c660cec1efe33c04b4681dcb31fbea47247bc83c581b174b0cedcf0bd0b7b622126cbe323986b75a407e416fc0032fa2398e504967ed021e993a955713a76365ada810f9bec7ad1a6929a466f08113cfd6919e014085d4148be060ebc014fb1fa3a1ff70a3ad94baac7be6c96bc0f28a021e39cc6bb8a6e16312255880a84778cbca55f4173b2070d527357cac69c22587208496af1715711f76d5c185807a13b2c791b91f54b23ac8b66b71b3e211e55180fe7a1bb2bba7f97da8f82734ef777b7d2653e66e814ed7871da35c95761a88a611bc383add9a329706212b9780ef5d53e933c99318ac47e26859f507bb50597c3ab1a252c77d22a817b402b80a63532f21a0f296c40bb8021732fa9da01bc60bc662a0754914462689de756a397e2384c2372130c5a6f05ae6c8b81ebc22125830f04d3740d2638d031a21f1653c4f664cd182b11887f4784c27954984af251c923b5c2ca4f1777cb3eeb7a13c351c07c4f5562b4a8a477fd348bcb9b8e6bec787c2340c02c0dcb236fe8d7c6ec8bc9d156b89bfbcbf4d0599838263ad5b90fc155051137d6800c898c8a50b82a4e3940bbd3bcde2013889bc4f3a7022d7c49370ac8d826a3aee946b79897bea8512d8b899a8c17e439760b58859393a5c264b5f1549940914fe278a40b6c9a8304775ba30c8ee4cf234ac56862ca2e935691e426923973c32b4f2408cf63c99d7b2c5f0c5aadbbb9cb98b53f787431fa73542c5569e5f5ccf0e4a868cac6529bbde42a5f1881ce0a729e6a531b0c401d4979a7425baa8b0392a8ca9374323ddf2794c237e38e45a43a5a34cca2875d19217ce7547d2eba6bca +private_key: 000d8a738101a329832189bfaffb213cc5789003528b06754014cb91a09b7625359b2cbe463b356e298c95a6a24646ad6114900034c83f19599bd0173846b93153aaf6f9c1e1e11d41692bf5146a48810aa89604bc2b09b32230c6c44f5a0a0086b7c688008702517b4d807bc34b8a23e968a8316df5207f2788975f458cb0db5a37c80bb2823270a3130c18bcf793147ee0a5b63a499ff28e3ae290974ba44e8730f4e56018073e0ed54924e38865bc076a809862470525d5c32b74c81d4cb95278705f01b6c6d098b951a7eed095ef386eb8d47f0d7984102872706b352c12119adc1fde40259f5450c36c4327d31f09eb589281a590f1131494b50264719a740c6d0b1c8f9aa6d281b8eda923308b02dfdbb7c2451bf80a769c683f2fc02822838f6ae1cea8d81ac91c53f53041952b82aefc4122b24cc15b3a8cc2450860869fe622036512344132701b8043b387d37986482318c134af38014cc075756838415e1a461cf0313b4907ee6753ad625ef593c99fc70b88587095e66c03044af109bcef59a3caca13e027c2cf3b350d28c1610b9bee0718ee44c223ab522ae57b532526f003345440cfedd463a0fb1ac60a2c6bfc37c7eba6a7667475d278c3a4b7c486b68f2157e9bb7646045a7ab452cde7539c755e5fe390f0174153f1531d5737da4383202103f6e01339255a04d04c83fa5119fa0f0c15c2c2d50e41d9be98c66703903c73a05680f6c454676916d1c03da6bb45482c588c6cbe57ceeef924caec94fbd096cbd13528770995bc50d0bc02b24959f4d61de3bb6dd7fa1a47db7856d53c7623897a24acae7473439217d52a2ef34a3a6c793017d6b22a3845f8087589ac311d00be84197a8bd6561fcb8472924af6547cbc78395721c75538278579469cf38553e4066027a43d9584508c7fe8f87a7f122b484a1cb922b62609cfb48c7f3bab00fd709097c87f5ef401cb9520b55cb021211b23131b2ac07ee9da735b90a37a84747a26a0f0c7b28672bb4d3cc6e0f1c3ee1c418dcb26a663519907354d2bc106fb72a1607a0905886e292d3a77716590ca57b6459ee647906401e8b268d6e782f904be442858fde72513318c06d0715405229adb7632b5bb2e9923d4fb49a5f7b995ec7b2c971b0be3aedb622cbfc344d9c9ab6536b323a68a0ec97b5bb491fbb0ac20f48873443707da5b82d85f61c98f06626761a20436f20dd1e66d5e452874e9b1c6947ed270caf85a9be3d8250e539451f61b28014144bc184e7ab57fd496a1e3a9f2fc2bafb02cd837ac91f61a3ec39e9892293a6a2be5a91739c64418a173e02870f4845d3f56ae573c5daa9387f78156c7d42d2a2c7a051964127bad8b728fad010ff0944dd6c2807b748d62492494b25bd32261115014d91baefb38a3fa06070646c71e5c6e07e64aed181ec46bc0fc4284630a038813834ce3467a0b4b615496b80681149262b833247cfa8f4b4c364833b074a467eb1623fe475aa1eb6734774995e99745d40c5c149fc91264b3149ddc2318b149c45944370cc222bad6759454cc4ae66d30091297d6468f8734dcd43e3f078fa0955d69c90e0f97ca3de54b2f38005e8296c52a27e51a1cbb69bc1c3cad697588a4004634fc1c77215f0677879aab3e63b51ae7436c5b47370e226eb4ac15dd0281ec65c56b83b60ac42de17b1374d1680b76460e294d841c1062638cc003d043a26307c08025a594fa3676df03c87789a4499575948b2574f6931673936e971f2c79598a1b7b35d28103252b4df98c47f6afa057bd87b1cc516722fd72bae0f437479c1ec6f68087453e23fb4381e5930e5a19fc9a267565b1dfc7aab9c13441101e57d9a4a454a6d1249c3cdba091113d0f1b257d0986f23b4fceb35c95ab05e2911dfb2899398808582a6b1aa9950eaa9c87c8bdae7372d46c2852e85c629c25e05a169900b24cfc0a68661b6d44c74c658ab8c00c756861be79272339a60828b9f0b8a325850b41950f97849dece714c494ba9bb09b74ac16138251363b52dc166f220623982c19ef565f80583b84d0b91267ba98b63afa31160f65961181951019419fc0627cc48de9d6b2c689969548641009cdc56b02a140bbc4a995a7f2593e0213cdd2cadbccbca41947fc8033baa1754a8815ad52cc31940451f8a62dd6b39e22a6b0db8a0f953c6cbca43f9c1285315f59ab9980ebbf57c1457dd8361da04e0eda771cdb37a6a54c6a47719790976a957978e198446320aaa840e0f1c076260e75e9a92980891aa6245e003f1fd6363d0b6e5c73b476b77ef867a60b225a99a763d0ea80a4c61739875bce5c0f361322450c93040b4d6c08120827b8026ace0ec73302fb6824367ac89a0e7df45b850618612ace284c2da4421689d8c7034113f9a1b2342736f5f11cfdd7ac7f8468075a4a2d7960dfba9e264514a8d7c6d11c660cec1efe33c04b4681dcb31fbea47247bc83c581b174b0cedcf0bd0b7b622126cbe323986b75a407e416fc0032fa2398e504967ed021e993a955713a76365ada810f9bec7ad1a6929a466f08113cfd6919e014085d4148be060ebc014fb1fa3a1ff70a3ad94baac7be6c96bc0f28a021e39cc6bb8a6e16312255880a84778cbca55f4173b2070d527357cac69c22587208496af1715711f76d5c185807a13b2c791b91f54b23ac8b66b71b3e211e55180fe7a1bb2bba7f97da8f82734ef777b7d2653e66e814ed7871da35c95761a88a611bc383add9a329706212b9780ef5d53e933c99318ac47e26859f507bb50597c3ab1a252c77d22a817b402b80a63532f21a0f296c40bb8021732fa9da01bc60bc662a0754914462689de756a397e2384c2372130c5a6f05ae6c8b81ebc22125830f04d3740d2638d031a21f1653c4f664cd182b11887f4784c27954984af251c923b5c2ca4f1777cb3eeb7a13c351c07c4f5562b4a8a477fd348bcb9b8e6bec787c2340c02c0dcb236fe8d7c6ec8bc9d156b89bfbcbf4d0599838263ad5b90fc155051137d6800c898c8a50b82a4e3940bbd3bcde2013889bc4f3a7022d7c49370ac8d826a3aee946b79897bea8512d8b899a8c17e439760b58859393a5c264b5f1549940914fe278a40b6c9a8304775ba30c8ee4cf234ac56862ca2e935691e426923973c32b4f2408cf63c99d7b2c5f0c5aadbbb9cb98b53f787431fa73542c5569e5f5ccf0e4a868cac6529bbde42a5f1881ce0a729e6a531b0c401d4979a7425baa8b0392a8ca9374323ddf2794c237e38e45a43a5a34cca2875d19217ce7547d2eba6bca38635cec71b814aaac223f748d13158dbe8eb902d9125fdc22202c4d59251cbcb6d75eac6c76ced1b0a025b40a55440712ad8424672e761e9bc400d63812006f + +# Official test vector 72, seed: "6960f21c7350dcf41b4770c551dc8692d8ba2c0b6e162c589166ff22e7a1ac0f94c2f48504a5f7eb0da094df427bc98a" +seed: 1f7cfd2b70863154e8a69d1758532e86c20cfc763d67c758bd10a13b24e759b5273b38bddc18488024ec90e62a4110129a42a16d2a93c45439888e76008604c6 +public_key: bafcc65109cd59f7084e05cfabe4515255ccb724b3388239ce1ba8c631c1e8c0b444baaa6ac481db8b4d670ab65ca27f33a92a11c48f6ac038f0914637b749d8b962c00ac8ab0c019c92960ec3817f34840aa7b63b19826a12234a81c9faa8995d28c4d4c44a0fd2c51720cacc8751bf6c31caf045a79c6f9b15c2d406c11fc3b5df6638e1b83164175dca5a1260a88c74b4c2432a9b76c39d43597ce2e3ad1797c25f967868b66bcee9b6a4d1b53fd09540220c7ca75943c52e3d4a124453499c681c1fba4dfe80919bd9467bcc0ab34b7db6012b18b3cc4c679e325b82518baf5123c88786745c4a0600a302a2a367b717c3dcb4c32aeb4770fc93e0213aa54b2c6a37a326f121d907278203724ceb6cad8717fa3a2106217864274e6220061620052799ba22675db36863b2a447e5a62b3d2511ffc83bb34cab6cf7356a27c29798c00cb32bbe1023fe1221313cc7ad59144fbb98d0182bf0183b44990da81016e2995206f2b0af19c8e21b1afe8c98d608c0c7e52075137caf22c69dec4e0f1763c8bba263898b30946663d84b5e0808e6ab9a6df970d2568303704d4c651c912b7297a89534e324fae62628580becc3a2051cca9d5757d5e53ff8fc242e42b2adb06cb2547296ec8431fa6eb8f7384fa559f9284d528761f9a23e85a0bbb3e57b7a876d2d4934d33838906606e6da9a311c15cba30f39d05236892462824bc4a4b4d6b343e3594fd9d68972d99eb26538f9eb1fa7f0718aabcd5dfa5a670b0f8cd595ef7a082abb518fa34891a4ade983877a333e956bbec9a82a19650866981b8b8c406e22abd784aac085b6ea553e30409ed6b39b4f367ae45b9fe109c6ecb51f23d2a755caa347aa95e656cf45a15e9438b61031717b3551e9e3020ccc330f254e82d89b5e4839a9f8ae267b9365aa228786a371859d3847ae68713df98768a1c792adba39bd2359198224376cb9c011777efc4aae1c3d179583ab0952bcb5b1e8577a5c476189d3301bf87fd8a1163b81bdb4a8368934ba4867ae4dd03d40c2cb5f974a5c36a8d699546d831095e7b354490838a40900521da4a00d2fd7117e1060dfd363593ac11bd31ffcc08c1eb8806f249719751ea3eb328d3a36590919c2317429d0486266968cbc6973d483015b77eec543b7f971523589655732bdd1783365761d937266a420ef3b849a630ab5a4003ff09c116c1037f4576c58adecb5a5e0899892854b8971c9b76685164a14bc5c8b9bf212c6c7ab15b35e25a586e465ac05f3911da7063208c3df46923622402559ca963a39f003ac0334ab19d02ed58c990ad983318b33429acdc637a8393082684c517b75194506bbeb9686136a3c8a284c852ca747fb709d4533d133b5798b50c1e59f9e99781fca9f447340705c6cb7e2231e257f95d681805b8cdcf3147804405f30b4ee63c1aa9c367eabc3fc606306616eefe91026507780e6339b209cfb7a227596957b136e1cbbce15fb9a6fd9bc798c40f0ccb7651b150d281d78b3508939ba836ab719cc19c61860bd3c624827ac26639c05a39c88a1873204175bf297561723a16375dba51947b83e46e84899377411b2bf8b743cf8dc23fd2ca07d11aeec1990c42a7321ac6f01cd866f8719ef21bcc0e02346fc5d8ba3d3e7f1fcb52d37551212d647 +private_key: 4b390d378cbd58818696f39433e9a34a46109fe98b4e806a306119e2110a5ad3993f7646213c0b27dca918e624eb6090930baec770a838a501e8979c1e210f71dc4674999cb8b92cf0ab1011aa67ce5039446957be38a16dd683795621fde5ac77e94c07572fb2d95cd0169803db5698e47a6ef3c3b11766f095496ae846870a68d34b9032527902760ca97b913c42490486063f0ab27afa8b92b33d88fb6653dc6ffb3b55b3a9b5d3a9b5f89916a727439561afd8e172f5313ffebab7587649d77563df970a4030aca239b225c78177058c9ea3cc388a3f5f2732e1dc00c11b936e65833cc90f5597266e29846ba70ae0239820e47426b8a092792334f390e399469ef13ff2301f9ac94eb42386ff882a3be8ba23f473ebb271ab6c52e5b26c5eda203c0b6418250c8e2216285cc78c70a386f1935ec41740a114f5a32ef703b4a4540143165337f5bcb42743e574b93d62ae23081e2dd7c51e923ff1e25f4734395ad0ae016a6c45f8096bf2aad933027d1594d98175c91143e320c3122bcf16f10f7ebb251101882aeb94d6b8cf893b7c05373cc9bb3ee58b148d1124183c05c116b6c178a2c7756700e15b8108144f5024c9ca04a3dc2e476591a7c79970274f112c210d00c198860202a408453985a3d9b5488bc61f4c8c93741e6e733e1358605c6a2e30d7075008cd5297a5ef5a18081143d5907d88284ff284804b276a193352ad3ba5463383a024908fc05578d0521d57bbf7d03cecaa93ea1326582307725c62dc79b7e9b34bacd94ba9608463c72f68dc0eeef10bc3c52e9f295a65f460ad368092d3bbcb2c9f9e1b2783737e1c3b0ec0442aa7897ffc75471b18730399257f019fe5d73afbcca9b83932c94360612b297f3a84efe90278940e98ea2e746857ac73adedb6b4226667dc779285c6987ceb03ec14a00302444ddc02e76aa6d95392053b176258546fd0959c8a6d969cacbb809115b339d6a517578502a46b833f84712dfc01b7c35776595ad656059c4cbe72e637ca5c95572952fbc772463042d9ecc194f93c8b577a220116e7e58bbe5276a90324c5492dbe3781b623585a22a77b2cca935009eac03ff1947fc00562f1561457f0220a764b7d0c06ae3a4cab90276581445ad7bb07c817f4e3a05613541967388c3a1a784642c9952e8376c57d82a16bc98acb908521a366adf18dd95569af860994858236f5bdc7ab9655a95d28a956049c7365c84c34f33ab305a35fe3117a563b1947658988650e3c65a6551660650b33217295e79fad0bb567054b2c0c1fe5e3ca560b3a565a58d9054fcb171afeec538a1c01781870b19c63a49243fcd9b384635aff5b1642036220f15c3414a9c2f82da81b6e625c1944109a6a1ac06a07a9b8c85f86c043bbf62af18c05c5eb3bbbb3be723a8e04b9a1f875c0d645412eb8c51fb1c305c2447628c2f01b3b6a6a89d8c849f48832f7a9662b8c476bc426f54b509a8037a52023a5d02fd10394cee11aa1d5464ac41ce6961174a528e2e3677032ce03b79ce5620a3dfb3291e7bca9c249c27232bb535db78918c2a56303090e98c1503d211d95221e278764479a1eacd92e5c50b9d1a3aa9c547194275630cb7644bb5dbafcc65109cd59f7084e05cfabe4515255ccb724b3388239ce1ba8c631c1e8c0b444baaa6ac481db8b4d670ab65ca27f33a92a11c48f6ac038f0914637b749d8b962c00ac8ab0c019c92960ec3817f34840aa7b63b19826a12234a81c9faa8995d28c4d4c44a0fd2c51720cacc8751bf6c31caf045a79c6f9b15c2d406c11fc3b5df6638e1b83164175dca5a1260a88c74b4c2432a9b76c39d43597ce2e3ad1797c25f967868b66bcee9b6a4d1b53fd09540220c7ca75943c52e3d4a124453499c681c1fba4dfe80919bd9467bcc0ab34b7db6012b18b3cc4c679e325b82518baf5123c88786745c4a0600a302a2a367b717c3dcb4c32aeb4770fc93e0213aa54b2c6a37a326f121d907278203724ceb6cad8717fa3a2106217864274e6220061620052799ba22675db36863b2a447e5a62b3d2511ffc83bb34cab6cf7356a27c29798c00cb32bbe1023fe1221313cc7ad59144fbb98d0182bf0183b44990da81016e2995206f2b0af19c8e21b1afe8c98d608c0c7e52075137caf22c69dec4e0f1763c8bba263898b30946663d84b5e0808e6ab9a6df970d2568303704d4c651c912b7297a89534e324fae62628580becc3a2051cca9d5757d5e53ff8fc242e42b2adb06cb2547296ec8431fa6eb8f7384fa559f9284d528761f9a23e85a0bbb3e57b7a876d2d4934d33838906606e6da9a311c15cba30f39d05236892462824bc4a4b4d6b343e3594fd9d68972d99eb26538f9eb1fa7f0718aabcd5dfa5a670b0f8cd595ef7a082abb518fa34891a4ade983877a333e956bbec9a82a19650866981b8b8c406e22abd784aac085b6ea553e30409ed6b39b4f367ae45b9fe109c6ecb51f23d2a755caa347aa95e656cf45a15e9438b61031717b3551e9e3020ccc330f254e82d89b5e4839a9f8ae267b9365aa228786a371859d3847ae68713df98768a1c792adba39bd2359198224376cb9c011777efc4aae1c3d179583ab0952bcb5b1e8577a5c476189d3301bf87fd8a1163b81bdb4a8368934ba4867ae4dd03d40c2cb5f974a5c36a8d699546d831095e7b354490838a40900521da4a00d2fd7117e1060dfd363593ac11bd31ffcc08c1eb8806f249719751ea3eb328d3a36590919c2317429d0486266968cbc6973d483015b77eec543b7f971523589655732bdd1783365761d937266a420ef3b849a630ab5a4003ff09c116c1037f4576c58adecb5a5e0899892854b8971c9b76685164a14bc5c8b9bf212c6c7ab15b35e25a586e465ac05f3911da7063208c3df46923622402559ca963a39f003ac0334ab19d02ed58c990ad983318b33429acdc637a8393082684c517b75194506bbeb9686136a3c8a284c852ca747fb709d4533d133b5798b50c1e59f9e99781fca9f447340705c6cb7e2231e257f95d681805b8cdcf3147804405f30b4ee63c1aa9c367eabc3fc606306616eefe91026507780e6339b209cfb7a227596957b136e1cbbce15fb9a6fd9bc798c40f0ccb7651b150d281d78b3508939ba836ab719cc19c61860bd3c624827ac26639c05a39c88a1873204175bf297561723a16375dba51947b83e46e84899377411b2bf8b743cf8dc23fd2ca07d11aeec1990c42a7321ac6f01cd866f8719ef21bcc0e02346fc5d8ba3d3e7f1fcb52d37551212d647af97825a77f2f4b6a45ec1a579f9f83e89c025d8d6876db26874f38348604293273b38bddc18488024ec90e62a4110129a42a16d2a93c45439888e76008604c6 + +# Official test vector 73, seed: "53df46012cad4a745b7a3c06e18ca95e0b839fd8161e3025749a0887549eb0ed6a44eeea08bd6060d6509dbf7e9dc864" +seed: 3a19577908efd37697b8edc7fdaf47d1bd3ad01a1b77faf794bee5b9c3192a6fa3729672816f3eba84c9638a79676eeac0f22c8a48e0c5d50a26ff0844c66b99 +public_key: e180a227ab843cd49d4970af3b68c255512920773abae9a2e402b154b8159b63b4885736e63632313b2f99db66fd4307d411a66871c8ec859807205535d907c3c6541b283824861738acce081a14e8047a63cba2f42c71b23157c85a7763d3cebfe93aa7fa0a083284ecb7c4dc16c8119b5d90546a461a5b744b1084f120bee2b548801c381a9d561bb0c5c35336601d1cdc310a610c8df78de62477a6f26dba6038ad04371913b831c326c0537cae530469292ce41c40a81b92a5c04d69eb0303b4b38a5cc45fd2b0ee90cff0b81474d0406c8b34b34c1efb596a704ca4893949614762a30c54846023dc3a345268ce55c0be97139f5f733664a58b67656ea211a87de01f9cd902a9295355d13a15bc044fdc77c4c53f671a1438e283371b5db5f82fb0d789e877b6820771f0ebc64da864a01caff73c4a42b5416bb043e29c7b2574c6e214a352f4401d786b4d5351a2559b87ab00ba84511bac1a099b1b33e8cd45da078d447b23326574379dd3d32ddb22c6a4037fda719fb104c85f0264ba4a9ed0287a31a2af6d58291676a37c434ecb234e4e1c648fa0760da57abe45703e677fefd03687415132d03252291f02f3901d20427904511f9c11a7f07041302033054605e97fb719a2f70648a2c30a0b42899b195ea8e6cc96610943c3276698a34a61893ba8770c69cd55f1bc0f00ca0e04177d0469c4833fcc23a6ed339acaa91b6e081692340f53cac66af5a6bcc2391729ce4e1c88d5c2610b00454fa21e8faa6487022f19f2c81d5452d5170255108beaf3979ff9abc2e04c8e3669c6aab80e2b6464644ae2189c81fc92d50cc56039cf5de2325ae5163a1b63652222aab35e17430d16477537f867ba4ca0e9b1c83c61a562c6822e61bb1450426e9716a77c1934ab17ec69563b8299e6ab371d996849c8cf7a84ca1a9bb654e1ab20a81d65314595a52ba18076f8712532a81b00e19e8734968f87c03fa4763208862d9a3ca648582482bf0d5441fdb7c84ab237d9f8628ed2001a501339682f9b8aaf6606344b95342fa62e782c1d9560b6ad55aa332c1fd533a74d026a9c9757f0e91bfc96545d0b6477f31f95840ff0a4127b16c32b635471480523f93017577513ea96159ac60be179d3a09c5ccb6df44174de866cd7548339d314d160718f262edf32382915197bc2ac6e3a4f77229e22dacbdfecbe3f4b72ac6bc9d9354e7ed2c31ce7acd7f3a2c8b9abeec00613b1600c8992376b73f8c245ac9841ea06409454b48d8c3a152bb8d6168a3fa6423373651caa7aecf0a5971641bd66897e5991e793343b5190bac3107eeaabc71bc34788a345bcb9ad8a45a50a1dbdb1846bb76205b06e8aeb692b4200a596524954963f01c946131704f6b181d7781772ca6365824f6c6c22a1af3328a2c8978ea8d7c38f6a00f7a6b3a50c2507f103f72420bdf98dc19aace30b792851142d8b43319c93ccfa966d71cff9352f25fca9e8a3064cd96e42e9a2959c128fd532902419b81972838532cdfc08f34541459cc68955c9c2a431ba5126c9bc08039ca45533ad8108beba49bf8d56bd44433fe12a6c55c41f3cc20560b28cf050cc1f195c5e817d23d95e105a13555923cc21b13c9e46d34182974451bd97b6a3da440de6e5bbed681d6eea2c6822b361019afc +private_key: 5e49938e23a5c65c89d4c40917379cd2a5b5d32881a6d68c28b48a2e356de63896bad68acd4a474cfc288113afb2418173ac4b1c3255136c73a00c7128b59a50042bf4a3aef9015fdf0108b01cb701d2bf6597637227604841651e3a964326a23b038d0af855f307413236a3ef95b4433a0164ba6bb27a858ed9b22a31234480b7e559ae9194aee9945dad45b0a5e85bb486962cb19d8b52c7d4b473f5f566f2779ccd79739649665820bc0e8307457b9af5844870ca580de2394fb092edf512310b970f5377fb80118fda8517b5b16e212447e16e3a5a5de7587ff3b271533803b9282901192fb20cb298d666cea3c5386bc658c5c1de9673857a3091a413cc69b2c8e46382ac97a13a9f31c1a47f0b6f898a84dc0278bab1a7863746c03576231b59ad2610e79a933661b6f23c63ed9404de06791c087f42abb7c088ad15c54ab23c78305826cbf263d441bf62e23180a79ae14a1a1fb31e115b02a974ca7025ad0c634067d4082a835bd274a44a218fa4642caaf1c4d108570c13bc3137468a6037a0709f0c0069443c1e7fb2822a282d08b030539628448c5b0396cdb76c89ba0c13f8ab2902d44190a0342ed5acc88b72c3baaf18880561f95196f56889f1854b4cc348d6019f4a5036123c1650332fe47115105a085c2591c952b35289efaa90d55c6c888868c20075291435175c086edc5d07b01e4441b8b3867b8a93cc9ed07ad71b387ea3363064194363b77fd106ca5c13f6b585980664b2a036b730ca50610798e3b14d176e28066719581821272157d81ea550992bd76875c22736d7163b01b6e353cdfe05b63bf5ae02a68c3e105731d8af5dd90981a02715e061f8d3b94448115247bd23137cfc165dcd4c26d065a28b84cbdf4b17b1a9a27046898c529ba42217502abbafd68bf6990d2d1064a7aabd89075891678e2610120feca2ce72c0e1d8be55f4c0ebf7cb565b492d9a2370e93482201f25b5ad667b0b90fb31dc8024e4123be6733217488788980f5216116a702bd8c1ca18d0b419b785961424f6289f7a55a211615398575755b8535fb0aba1491f00517863c41f4fa1871dab1ba42599e8e54e8f4c6a54e20f5125c595e2099439b0402794b9fa3a632b4c789c9cd4613776218fcf066c22e4b12dbc90ff0b4d08cb7032c07603557ef6dbceedabca671b7b07a2cd1df6a89ea6a7dba65e145b9515068a15e7053d5a4b1323cb75a8ad0d6ba3885a7e77460cf19637c1b6c330725588091ec1f158484c6ebfe43b4e01cb5424bce33758ee10a438c0621c9217979c958ae89591f69d54c4a71719cd4aa76da6ac4ee4b472afe45412718e65a5807d452491e1a0788a570bb3723d438362f50c2b26b19dc696f492452ad13501c3bfc81766dccb5034ccc29d4c152499000aa458c961aa17d74cb5819a84135cbf8181832748917c951a468fe70c08c1333de71b64b7ab158255c20aa7b2ca8a912f898574568e27691f8b517425c1be2bf183401cc2afe08fa65a2a1135a5dfb9a86dd3985351b61de0228c112a35a889eab8a57273258a471551e15ad23328c6d00a3f78a1cb9c836e304ffec75ee1f0927962b642ec0694e50963a246d97a240639a611c414e180a227ab843cd49d4970af3b68c255512920773abae9a2e402b154b8159b63b4885736e63632313b2f99db66fd4307d411a66871c8ec859807205535d907c3c6541b283824861738acce081a14e8047a63cba2f42c71b23157c85a7763d3cebfe93aa7fa0a083284ecb7c4dc16c8119b5d90546a461a5b744b1084f120bee2b548801c381a9d561bb0c5c35336601d1cdc310a610c8df78de62477a6f26dba6038ad04371913b831c326c0537cae530469292ce41c40a81b92a5c04d69eb0303b4b38a5cc45fd2b0ee90cff0b81474d0406c8b34b34c1efb596a704ca4893949614762a30c54846023dc3a345268ce55c0be97139f5f733664a58b67656ea211a87de01f9cd902a9295355d13a15bc044fdc77c4c53f671a1438e283371b5db5f82fb0d789e877b6820771f0ebc64da864a01caff73c4a42b5416bb043e29c7b2574c6e214a352f4401d786b4d5351a2559b87ab00ba84511bac1a099b1b33e8cd45da078d447b23326574379dd3d32ddb22c6a4037fda719fb104c85f0264ba4a9ed0287a31a2af6d58291676a37c434ecb234e4e1c648fa0760da57abe45703e677fefd03687415132d03252291f02f3901d20427904511f9c11a7f07041302033054605e97fb719a2f70648a2c30a0b42899b195ea8e6cc96610943c3276698a34a61893ba8770c69cd55f1bc0f00ca0e04177d0469c4833fcc23a6ed339acaa91b6e081692340f53cac66af5a6bcc2391729ce4e1c88d5c2610b00454fa21e8faa6487022f19f2c81d5452d5170255108beaf3979ff9abc2e04c8e3669c6aab80e2b6464644ae2189c81fc92d50cc56039cf5de2325ae5163a1b63652222aab35e17430d16477537f867ba4ca0e9b1c83c61a562c6822e61bb1450426e9716a77c1934ab17ec69563b8299e6ab371d996849c8cf7a84ca1a9bb654e1ab20a81d65314595a52ba18076f8712532a81b00e19e8734968f87c03fa4763208862d9a3ca648582482bf0d5441fdb7c84ab237d9f8628ed2001a501339682f9b8aaf6606344b95342fa62e782c1d9560b6ad55aa332c1fd533a74d026a9c9757f0e91bfc96545d0b6477f31f95840ff0a4127b16c32b635471480523f93017577513ea96159ac60be179d3a09c5ccb6df44174de866cd7548339d314d160718f262edf32382915197bc2ac6e3a4f77229e22dacbdfecbe3f4b72ac6bc9d9354e7ed2c31ce7acd7f3a2c8b9abeec00613b1600c8992376b73f8c245ac9841ea06409454b48d8c3a152bb8d6168a3fa6423373651caa7aecf0a5971641bd66897e5991e793343b5190bac3107eeaabc71bc34788a345bcb9ad8a45a50a1dbdb1846bb76205b06e8aeb692b4200a596524954963f01c946131704f6b181d7781772ca6365824f6c6c22a1af3328a2c8978ea8d7c38f6a00f7a6b3a50c2507f103f72420bdf98dc19aace30b792851142d8b43319c93ccfa966d71cff9352f25fca9e8a3064cd96e42e9a2959c128fd532902419b81972838532cdfc08f34541459cc68955c9c2a431ba5126c9bc08039ca45533ad8108beba49bf8d56bd44433fe12a6c55c41f3cc20560b28cf050cc1f195c5e817d23d95e105a13555923cc21b13c9e46d34182974451bd97b6a3da440de6e5bbed681d6eea2c6822b361019afc8517ab7585926764ec7acff3c747479e837831429b97b7cf49ac3763bd9ebbe0a3729672816f3eba84c9638a79676eeac0f22c8a48e0c5d50a26ff0844c66b99 + +# Official test vector 74, seed: "deb963f8b1d8fbdf499d564ba8d2d47915bb402da02f17031b37b4039a842afb9b7e48f37200605992bd2429427a7a4e" +seed: ae0f65e29f38804a6759f70f4d01e2aaff7fe1c91ebc4f892dd0de3ab2e68ea5e03ff73e02a217659f53d8c47556bf3d8c94040f630d63605e2d0f923579370c +public_key: a6cba4e1a93cf066b6c6284b85c1ced4a4b17634c2dd8c758ee3cac74b2402460d2fc12d98943de4dacb2f5912fdc41e8b1886f38c6619831677e2a32a63860d2a1e9b994bf4f9cdf0c3c83c5b044c14b83e57c59d55629a9704994a4793a7178b69ac1892a578802a69d22d609a7832b55e731a65a1f29753870f8f6b26443824be227f578c6d97c57e570864092a66c8184ca58b1b8f89ba9c2a3e7a17c1bcd851aa552ddbe301f2774e81397a57247362426807f370ff2b7f6f7b1f5b83c2f3475cb225b71ca0750f333d72a434c88a902d542cb8f50f6ba8ae5531ce60c5c29057c2a995ced8a34cc1db7005c478fa174874bbb82981107faab591b8c9581365e7205578c55fc06b5f588c65e2ec700e6473752708853a8c9a1acad3c08bfd67c553b9c603206a1d26276e66c53a166398db6b2e51754e2a67a54902cd5839b97c66d2421df86c42c7181f89d2afae41bc116212a7492688424a2c81b85bf616ed686e8d0183c1082dd61c1144417dd10cc0e29b3168144064d700c2a295c1042ae40848fb07abf2aa7cb2883fb19454a8711c72670d8c0b152dc9cd39a108ad9348089754703a608c0b544350879ddc71c09051f92ba755717403130dc4b95c19d3510363a5dd620cdeb1918af90dd1267aa9696eb0334810b9351df981a0749a7e0c253d399a0115ae515c97b63a1b0ca42794e00ef59912a357565b427dd5aa54b706b0df583e2fb68ceab61395024abba0a8ba4ab6bae958d9c13eed40cd20978eeb5ba041b837595427a644a850340168847acbb69b8d6809b849a7d6a6b67c170dbeaa41be8341c6977dbc025688244396503411148458aa2800c44195211a86763c54e45345ac258541926b4bced6a337df4506113647828b2d4e45723d68985dbc2772a6723a032bb3b84a140a95dbc480f1495118238e74376c3aa78c25e3703ce121e8576c22ea29119b1eb5b946d261cfdc71980af7961961074584a7ed970fef29172cd98a3ea5550f994f5d763b00fd37f9c0abb1459b825c6deac0b35d451a9eac64b03c3c0139806586c8e0f63b8f77aef5b207d2615d5f296894c9a1eb0b68d0571351e18a20084580d98aef13bc4ed039d132cf015bcbf0270d5b971f10f581093656a091af7f3725a2e16c8a74c541345ede689321a436ac488b23895ed3e81fb4f25b83964400ec33c529350ac29f4876128c010ca9c4b6d3e47d7ac798559251bbe4bbc7ea4ece0b76e9f519d819b286f14fcadb1231067bcb113ecbc737020b47587c491fd26541f47ee2b6bfe6908c73ebc3715c58aa93484a5c2692598b4945209d47258441c2cde253434a5a1edc934c9762b2740795857e255921296a8bd4542f82bb6ac7e293f9e4b7890810a2e46511e241162b2af6e38c2a07b15a38a494f8412fc40d60847f957b7839e78936b6c1ae906089a80ef5c58e2659be2643083922b22da53912055f26fa7ccf410abc42cf21448290b168cf7c8ba20b28dca959acc253bfd4b67e60c0c5f82728382c96f78b48b4a4c746c32c019bf8c3202c46a7a2c9c401700eeb1c013bb399d9b62eae9a4e68e4a4bec7b7fb92888ee9bb5f52aca49b2e3f6ac6b72b2cdbf2c755f85fd14903d8712fe0bf82ac0b06aae9bea06278c21e6257bc96af0379bca07c7833 +private_key: b8f488e5f0c30b5cb5052115f097a6f20c0f6c4206522a50492991829251a189c53fd67ae08a467590a38099994bd5a0b5109827b888f5322bf6eb9c6d75911b2a721c92905f145514a3138ea132e5dac52851160c171e80b728a87b855a78ce550678ea20044db943c708962c25a86c78a29cfa801aa15350841989c00563fb46d299274f18430d66cb6ed9bc89145cdb262c18d5c095703e779c14ff34459ed12c13427733c59bef3c8a6c24b5bd5171712b074c797960e2be7bf2b58a8111ec9c01a3f938e83637fc9b59123880fd26a845d26de5fccac29657cd2c8831ba76168421b276120639a98f13a07f905c2266bce1f825d1c464bb2016665a2817c84369b7708f975641026321fb4c409531cb1a3827b80f2c94b1c4d36132b10e69b8c94502cd46c540902b96eba76a55e3bcb8fa037a217bd91816ee09ce30f19721f12432d7238fca919a2b4f718674d4558dc7095f0461a20b4aa1aa080354ac60fcc8ca2400b2ef73246514c41cf3945cd6a425959d1ad08b51e43c02a834df3c8e084b04b9695b2d1500e9d5761e86c95c7c1a0e12783aeb6f18e14e157881640204cf5a7a2ed815797a49e0696ee990448c312cb7a55a28fa1367b196001cce6a56796208100828be8c241cecfb82caea1bdd36b19351cd8bb1cab7014cb887bc6e232e74d036437a3222f56bd3e0893eec360ffb220c03222513293aec7ea6da408f9c12016ca03659791ed14241331e5ceca1b53a2453689f8ad819906cb19d731e0ba7abf0096998f18917e4794c4b15659678dcdbc8980b76a4d5c5b8567d55719e774a2d1c952612a9af1ea7c77f896f88242790d989edf3781588c10a7c50ed25821b4abd882370aa74bf299975e9c54120b786f5917135b69f3ab24465aa134cb1bd3fd61f27fb38692b5f3db5cedcb40b8530834c9abdbae738c45017cef302ff334c9e2567e0ca791175813a8382489b51015bcb8ad5cb37626dd3c48c745006f5133bc5557f6afa7ca4633bbb26524ae968df362f33c716ea9131df1754515083325bb3f4e91e40f2c598912ca1da3770e81dddf8980797277711216b93b41fe456307a8135829ce7d7af348a090758bace57af3f353cdda444629a596ee64d10a5881eaab061782314d218982602cfda25a926bec7d57228844adfc31109d210bb2c88809c47ad09c466141b66ac6a013280efe78d38e73d6eb9ba00f59841050558964b2916ac04757e968bae6bb715d94199f22a81f4e3247b7caebbe3cd9bdbce68c931357a568c39acedfb0093337d95d92dde215fdc5b6bd7e2b14aa29046d2a601a91f9d4635f985a393e4408d64be23052ddaa323c5d0235d4a578a63cf6c655d55f78397d72fcc0cbb490253b9a4ad0888c742ccb474cca41bf4b51c6693767ab872586da6b470ccf0066a038deccba3e229bef1fbbbe33b42a5c524533b08ea926469c9822255150cd0633df08b01670f0c134074f22dcdfb593e477853fb383a4b683c786139891f647c8a42680d89352004560eb1232fe173c47379119b29226691b015649253673187f98827d22aa0c168fd7a339992ce4fe717b6e797f616c27d49b8df377f1300ad643220db8315a30429a6cba4e1a93cf066b6c6284b85c1ced4a4b17634c2dd8c758ee3cac74b2402460d2fc12d98943de4dacb2f5912fdc41e8b1886f38c6619831677e2a32a63860d2a1e9b994bf4f9cdf0c3c83c5b044c14b83e57c59d55629a9704994a4793a7178b69ac1892a578802a69d22d609a7832b55e731a65a1f29753870f8f6b26443824be227f578c6d97c57e570864092a66c8184ca58b1b8f89ba9c2a3e7a17c1bcd851aa552ddbe301f2774e81397a57247362426807f370ff2b7f6f7b1f5b83c2f3475cb225b71ca0750f333d72a434c88a902d542cb8f50f6ba8ae5531ce60c5c29057c2a995ced8a34cc1db7005c478fa174874bbb82981107faab591b8c9581365e7205578c55fc06b5f588c65e2ec700e6473752708853a8c9a1acad3c08bfd67c553b9c603206a1d26276e66c53a166398db6b2e51754e2a67a54902cd5839b97c66d2421df86c42c7181f89d2afae41bc116212a7492688424a2c81b85bf616ed686e8d0183c1082dd61c1144417dd10cc0e29b3168144064d700c2a295c1042ae40848fb07abf2aa7cb2883fb19454a8711c72670d8c0b152dc9cd39a108ad9348089754703a608c0b544350879ddc71c09051f92ba755717403130dc4b95c19d3510363a5dd620cdeb1918af90dd1267aa9696eb0334810b9351df981a0749a7e0c253d399a0115ae515c97b63a1b0ca42794e00ef59912a357565b427dd5aa54b706b0df583e2fb68ceab61395024abba0a8ba4ab6bae958d9c13eed40cd20978eeb5ba041b837595427a644a850340168847acbb69b8d6809b849a7d6a6b67c170dbeaa41be8341c6977dbc025688244396503411148458aa2800c44195211a86763c54e45345ac258541926b4bced6a337df4506113647828b2d4e45723d68985dbc2772a6723a032bb3b84a140a95dbc480f1495118238e74376c3aa78c25e3703ce121e8576c22ea29119b1eb5b946d261cfdc71980af7961961074584a7ed970fef29172cd98a3ea5550f994f5d763b00fd37f9c0abb1459b825c6deac0b35d451a9eac64b03c3c0139806586c8e0f63b8f77aef5b207d2615d5f296894c9a1eb0b68d0571351e18a20084580d98aef13bc4ed039d132cf015bcbf0270d5b971f10f581093656a091af7f3725a2e16c8a74c541345ede689321a436ac488b23895ed3e81fb4f25b83964400ec33c529350ac29f4876128c010ca9c4b6d3e47d7ac798559251bbe4bbc7ea4ece0b76e9f519d819b286f14fcadb1231067bcb113ecbc737020b47587c491fd26541f47ee2b6bfe6908c73ebc3715c58aa93484a5c2692598b4945209d47258441c2cde253434a5a1edc934c9762b2740795857e255921296a8bd4542f82bb6ac7e293f9e4b7890810a2e46511e241162b2af6e38c2a07b15a38a494f8412fc40d60847f957b7839e78936b6c1ae906089a80ef5c58e2659be2643083922b22da53912055f26fa7ccf410abc42cf21448290b168cf7c8ba20b28dca959acc253bfd4b67e60c0c5f82728382c96f78b48b4a4c746c32c019bf8c3202c46a7a2c9c401700eeb1c013bb399d9b62eae9a4e68e4a4bec7b7fb92888ee9bb5f52aca49b2e3f6ac6b72b2cdbf2c755f85fd14903d8712fe0bf82ac0b06aae9bea06278c21e6257bc96af0379bca07c78331bb014bb0d6489c14f5411051f9667aabce54da7a8deb73b627e3873d9390a35e03ff73e02a217659f53d8c47556bf3d8c94040f630d63605e2d0f923579370c + +# Official test vector 75, seed: "8e2995f1b3e43853b18916bb1212aceb05898e2b177a87abeb928ad7184e59695c56b2cccf5db80853c28a525e327d13" +seed: 6084a235f79dd093ef6d185b54e69df33dacee73a9bf2f379004421a10e3a79d9f684fb055ece19459eb464e91e126a7a6e3ed11ccee0046da234d964c985110 +public_key: 5a0322a62aa889781c4fa3c36f765586b2c2a20cac081cc08d06ce1cea6036463dccc34bc294a51f7b1a5dc0778c143f57b9ad2c8b41a3b3a7e3317fec687f50294158ab07441c119c299d421b3d6cd62019b4cfce69c9dc5509856b7cf087b66391793e7b2a77262db0909861b46b5d4c23fbf134ad43622357a81cb7c9f5ac9cf1c190b9f711164a9cfa4892927364d800ad7fa2888dbbaa21b689d4a20fd0ba43f27386f90026322705b0f1069b32760802581231c44db0a43753779fe88f3a824f2ed858211bc172d49221931c3e86188c287a093b1eff20af18c1004979221c85c2ebd5700473913d465359ac18deb3055075386ac3c330887879d5ca762b6b576b7f2d422f23889d51788cd84b77ae879b1eb7026dbcce20cc94f7857aea148213c1ce857277a7808857f47e45cb9b561b80895142463bcfab6c69a7712acbd64a3b6721aa9671aa934cb0c1bc52b464603779fd6ab10d57cca0a749f3a1889e10386cb7ab0bdb86ccb02ea614a0966a0ef2699da6b7282713874f36468c2014539bc804911053d1025133975e591e357a8d88a1c7138a200543a90f4aa250f44ca61870d206a236d1917b509638fb6442aa7b886a54fc21b7c40a1b7d027a09863ef94280c67a4693d28a0f842ef2268e0a67a11bdb4a18b3c459e11e977a5d143aaa82b80520f72c50d248073746662b78ff685086632e304085e9c7050a754b302338f7a2af0a223e45730de36074e1843876a6b1cab85e0d984ece18a3420aabf4d740f6039dd183c57279469bfb9f26fa4f6ae59db60532372b729cdb8bc8b26b9e511234177af2717538383bf2103726c79d84b4489d493423f7375c273a9558611b60c9fbec197047566ae9411637ca9dcb956962354872803891c728429fcd99c02ad020c11a2f1aac40b6fb13fd6c8508500fbfc34d752080536c150b402155e130c3aa1a4e914ada0740b5178c83a67fea746803a35c36a3cc034052143303bee180d8da097b24c89fdb16583b972a50c89b5ca27dd4aaa1002fe2316940a7ab294b02eca4c69957b3d02b538c239f18a342aee0c15fdca57d28930a62096567801f64c3452697d5f4a66781975b440ab3b27a5da41e889928ff41402b20b93f992db6d4216a4a2b169a6952816d61b93a82c5c0d5923152900be6b9236ab96d076b36d406b06793c7c8c85d69f423774c4a0c143e27673cecaa38c66c1dba02860cd305214a2637a90cc84a7aa6bb919e73c06ddb787b1b9117a2c6fd577a7eb417d5a34922767bade412bef212694373401554211c1213ac7bd1d1cc61f40fdbc65b89ccb3383c30476932d738b181b64e2bbc9508268c7061a4731c659d18749ec3b87c3741d1660d10978cc91ca44df588c8a0a7a68670a003ba23f03ae733067139083ed33c98dac4c06331e90b59514c7005e27f179a0ec8517931b678ec849789c656b30c4a736209e70151cd970ade5557f9e6872248b94c894220c0bd1b6a3a0149c1bbb8ba4c9337aba868b78199929044f44018fc261aca4bcf0f70cc1444411fc8cc3b6b7aa7ea9f8d06a30c7a61d89c19e7c50b84a278a921b74e2936ad07ae2b17344356a8e640a9a1392048cacc817bb0924682a027f2cf6ec9b36aad177faedba70e26db0e2958e3d520d23b10254587 +private_key: 1e556e2047c1be5b68fa204c0f36add1b8c00e6b66c0906958635733f82238d1ac4686929e4664b5217a774299df70822cdab3e06c5468d8be7d8745f7569e5851317d6b6cea6909c70b72897395c57494aa20551b4501e45825018260dc315b71e72ed21049a91b01665440345a102efcb0c9329f7cf0c619941c9ea7a1651cb0591c53e804987395760ca688dd7c75bf2b255dd618c168b8ad735876e9066c7275f7eb8200970ec4b9c36e296a7be41fc8b64c35e9b15473337a3003dc62794a0aa8cdc71c65577085253220869fb2845358ea4d73ba898f123f7f0cbb58db2dbc26a98a5b8299b40318285a26573ff928bfbf75915ad0518965bd345c2072157748077c16f562067b154ec88694c1b71d20624f19b62e30844d930c91e95b28173f9df878d9507fa35812654353f99b93ef9ac6f61503229a72558570c9d5213db68347f8145a9798597219df160bdb0226ea8b569c894e2ceca7c3c86ccd66450fe13e5c4556db3c9ba3441b37e26ceb9c7fafc460ed1373aefaa3d593b7f317b2f0f8782b76c18eb11d0d804192627d8657bdb0e440490b6c196797c0459cdd791b82b329c6439d2460ccf37621a34b263b7b46f522c24c294be8b36c117418dab096fb874db3516e889b3e92569c32e17f3eec3c5b28766d3a2f4d06475bd666edf00bf0a514d8c06309934ce4a191805a38d7d69d0dc926eb58110e9c5bee187d0675b36af68f6de7a294fa7ca80486d1e561d28c8788a75cbfb718bc740d131a83f9e64f5b484de82775b2b8762dd568e8528e6f213a198a8d6a21b9ef668b49b87e8ba97ae468a379968fd18236c95c96f9c84b23296d5a9210869c5df05421e9c3c2b65975a93aba3eeaaf5d746fa679c5e93021cf93ce71a8b45fd44ed92bcf43d0172a8589585b9cdb7baaf1041e81772b37861fff4c60fc5b7e8d6871382c63fb3c7249c3059385c7d856cff293138a3b30b6b13614354a502c7bf922076d028affc5bd6d43706f5304fa2783a862552a5b2dd48471880529eb230851b6091b59139732102f66268286828fc767930c1b4a3bab3f14bb1490ba329401f8d95d347b3450d6cfd2c8355db3697052a4f3884df8bc28d3792fd09352daf9023b6484f8553fe15336a788550f6023d9c9a42034874cb0beb25a6a4517a1adc72bdab35293f16efd7171455b948103bee4fcb7d635723eea0a4f7a3dfa3838e7243143971bebd25ec82c0ef059992eec1aa37835fea57ab04347e86855e0ebbcebd828556a18b167b5a4c7baa945560a276ebce40d8b6c6b23b417fa8c39ab55791e703a3568ba28f022ff8cca8f6965792067ce23465afb4b3517b5aa80c3c7001e78b62617e87e3b27021636667e60a47258155f9a06a1f8c93f39420c141372015b70a3b69da51dfce42fd748c48916851d78c8ad5c5bdef8624df33600027495f6be5c6a78cc43b660767cc1e77d5b7396f31c8af0b35c9826c185569255fbbd7fe0533767c89fb43d1e282b0b9b348ef31d7cb15719a0c1db21cb57a1171046ba9409920f08a4a6d12855e113c427b2ccc4193c11781df61345229191b60283eccc3b05c49316c144a8b21e494d3ce1b11d58391bfb7bccb3a95a0322a62aa889781c4fa3c36f765586b2c2a20cac081cc08d06ce1cea6036463dccc34bc294a51f7b1a5dc0778c143f57b9ad2c8b41a3b3a7e3317fec687f50294158ab07441c119c299d421b3d6cd62019b4cfce69c9dc5509856b7cf087b66391793e7b2a77262db0909861b46b5d4c23fbf134ad43622357a81cb7c9f5ac9cf1c190b9f711164a9cfa4892927364d800ad7fa2888dbbaa21b689d4a20fd0ba43f27386f90026322705b0f1069b32760802581231c44db0a43753779fe88f3a824f2ed858211bc172d49221931c3e86188c287a093b1eff20af18c1004979221c85c2ebd5700473913d465359ac18deb3055075386ac3c330887879d5ca762b6b576b7f2d422f23889d51788cd84b77ae879b1eb7026dbcce20cc94f7857aea148213c1ce857277a7808857f47e45cb9b561b80895142463bcfab6c69a7712acbd64a3b6721aa9671aa934cb0c1bc52b464603779fd6ab10d57cca0a749f3a1889e10386cb7ab0bdb86ccb02ea614a0966a0ef2699da6b7282713874f36468c2014539bc804911053d1025133975e591e357a8d88a1c7138a200543a90f4aa250f44ca61870d206a236d1917b509638fb6442aa7b886a54fc21b7c40a1b7d027a09863ef94280c67a4693d28a0f842ef2268e0a67a11bdb4a18b3c459e11e977a5d143aaa82b80520f72c50d248073746662b78ff685086632e304085e9c7050a754b302338f7a2af0a223e45730de36074e1843876a6b1cab85e0d984ece18a3420aabf4d740f6039dd183c57279469bfb9f26fa4f6ae59db60532372b729cdb8bc8b26b9e511234177af2717538383bf2103726c79d84b4489d493423f7375c273a9558611b60c9fbec197047566ae9411637ca9dcb956962354872803891c728429fcd99c02ad020c11a2f1aac40b6fb13fd6c8508500fbfc34d752080536c150b402155e130c3aa1a4e914ada0740b5178c83a67fea746803a35c36a3cc034052143303bee180d8da097b24c89fdb16583b972a50c89b5ca27dd4aaa1002fe2316940a7ab294b02eca4c69957b3d02b538c239f18a342aee0c15fdca57d28930a62096567801f64c3452697d5f4a66781975b440ab3b27a5da41e889928ff41402b20b93f992db6d4216a4a2b169a6952816d61b93a82c5c0d5923152900be6b9236ab96d076b36d406b06793c7c8c85d69f423774c4a0c143e27673cecaa38c66c1dba02860cd305214a2637a90cc84a7aa6bb919e73c06ddb787b1b9117a2c6fd577a7eb417d5a34922767bade412bef212694373401554211c1213ac7bd1d1cc61f40fdbc65b89ccb3383c30476932d738b181b64e2bbc9508268c7061a4731c659d18749ec3b87c3741d1660d10978cc91ca44df588c8a0a7a68670a003ba23f03ae733067139083ed33c98dac4c06331e90b59514c7005e27f179a0ec8517931b678ec849789c656b30c4a736209e70151cd970ade5557f9e6872248b94c894220c0bd1b6a3a0149c1bbb8ba4c9337aba868b78199929044f44018fc261aca4bcf0f70cc1444411fc8cc3b6b7aa7ea9f8d06a30c7a61d89c19e7c50b84a278a921b74e2936ad07ae2b17344356a8e640a9a1392048cacc817bb0924682a027f2cf6ec9b36aad177faedba70e26db0e2958e3d520d23b10254587c9a546b5c0a567855039f6c1bca60414684e7bd1f8eeb7913f3a1795ba4bad4c9f684fb055ece19459eb464e91e126a7a6e3ed11ccee0046da234d964c985110 + +# Official test vector 76, seed: "9218943c51fd2de47e509aac67eff176795102f37d7a2017e3afd768fcda7877af38739b00fcdf227c2fd62eb635942c" +seed: acd1c0217fad5caa4235544dd9de153ab1880ccf4c76f16f236fae4e4bfda04cf03a8abb0a5010f400ae5722a75bdf5a2f6d5b546b34d73857cb1bfc7e587aa7 +public_key: ec8c397304996ce42773532b2798c4bb8a987e57b41b820c6f8b2c64181873bc6515b0c810109890b8abd9bc650f0344e3e7a672e269547aa4bbd0baf9f2b2f3b53b1910b255f7cc6cf0394ceba359685e9f6c77ddfbcf0217611d076ab2140a8dc58199a2a235955b69fc2520b192555c1bed2777ef623760cc71b0208dbf2a5d9841a231a60e2516c5ca3c6156a0c0862b54c311ce2b6b3f442c8082348833b193cb2b22d252a9ac88098c704d83f217ab2a8799f031227b95e1fa5d1a6410e3f025485338fb8338b5c7c4c0f6641b71644f11124b13c2dd21088684035a66a4c4451b5f66c9d5aaa7ace15eaaf03497ea2e1d693b77a4402dd1943e9c68cc642997a44d2f86a339c78912e678d0e314ff162c0e3c9ed8eb726ed910d1b26b99061c01142380e5074b5a46505863f6287dc18422b323c89966340ff7146fec18095147429148c24718301c106dcbb5a1b644e5a26ebb566b504a9b2984100bb6c40b45286d4c2841d774dc8915839c32ddb22adc41c0197431bf8c5f26c2329e6b2a0efb2b0d872c4b8b125d997937236caa455389c60f9e38ba3a662ac7349a5c872d84a353f9710c6c74463f220f37558458d68da5e67f1130cc5dd5ac4608220da2b8c9048bc805bb1f6bcf04379330025ca86b42cc361baab986c32a9e266bb1fa27552192a56b4b111564646b701dc4771b8f61bb5d41278a291920ac1d01649267344732a85109a3cb45b7b8e9abb8cec49ff602c819695f61011c7ac5957fccc50859432f324d6623459d7bcbfa20645b2a54c5a8ba0df27f93ecc2ed00821e98553f680623ebb221953d3d9b8d188044d693abb88bc965984b08d112ea6b4885aca190f9877f1bc123220aad662fb7f5b0afbaaae118c6108c98b31a5b6ff15aad0a87b172bb40998ec232a9d218bca9f03e88633914561c9ff65be6dcad01550903276646208248a56e5c3239f951585ee9326808a4e4f829a15996452a3328253ce2cb3613aa4fb02acf3030b64c6a27afc5863487b9538b53a2e1456168180d257f4403b41f16b415740abb024eb54c23d6a851bf9c54932259d1bb510964445067c68ae362dac6a7c3e29ed3080b0d21a76ec220c7d562340123f7a32c62184d2d707144a1565e432dff443940736cf628caa3607076783b2b29bea7058bd164219518aa77c2b303e07dffcbb00c930ef0f0632c10aafdf32fa7bcadc5719fdb591c7635c3af83198fe306076a9da2455963b91551a1618040b0eac945f788820a1442ccd10fbdbc763cdbbb6e221e8ad076880abd561c5059e23709d40996d41fa6f129c4758b62644c30c1c06d0080091b4d5a8705f4b0694507252ef1a5980a347846160ba3256475741d50a7ae465f1b444a25729ecb66585e51992bc781f28c180593c4e5882c243017440633007db1c637733a01bb8a994347d7602ed0b34261603b84b8c2e14c5c46167af459507152da216f272371a0981fdbe740daa78b9eea655d98cd14ec90cd383863ab5fe8137ebe820df5a007a288586e18a54b43387de9b73f9037f27384be092b09941262706dd6db377f733b31a49d2467605649b9609365232252a62555b1451674b717182870c1088f4b34061f3e8b9034af0cf2c5f7eeb665e064f5f27cd5e4c84531d45d38051ef9 +private_key: 243c03e7374a7157b1f0c02c4d542e2b31a45a902d908592f3f620c347511d650af8ca8932b70a3563ca126391f178c7c1477c9af532cf1897de99bdd7f07c0d304f90190ede5967898a0e7818622cd76724f77c4d73248bf67955726afde4c4e4201a21ea48401099b05b196b4c698565094b3421c2b429cb83a99b2a7bf5c784117b9e8f7c00d8f1c801b66f63402aeb49822a92afafa445f1fc7b3e76cdec3091cbd474d10ccec25539a658a1a48b6697252d28442a36e70578b810898045c0118468e6bd05c664e4c19440b88e0e847a15ca747e9990d995cd4172b5933b58fe7062b871ca02f539e74872e283abee046c7e15372e58455e4a6de59bbf716bbb62417b6e46296e68c501d4007e1a97b7d970b5bcb8a9586fc42433eb457993e7b15d7c35de95176b09065a1a3f61734b9d453ff0b0313dd8c0888a92f6270ea93ab6e9f15e9f6c207ca9512a41364ae6591c578ad93639e795cd00339cc5b67176f771fa6c5496cba3071b67ffb88b72993ecea38f4d8244d94676e55ab3e484b0ad4776be5ba4a99766d63128828b7497725abff8a932b1a697b6c0a27b3b69121607288dddc03a4c144cbf0a0b11886b2130174b99921b1920320ba515032ed7d536f5b352975697b8a05855cc78d7979da443a06d443d52b4931c554ccf03b43631213b68385e1a2c5f87c84e13b84032804f5929fca18c2ec8a15869905a216fe2852631e00b19b45a4a0b51243b118eb358435b9b46a0525426ba232439cee0cf6f8b164d72901cbb4f1b2750279c18aa255f5d7053f10c1750894c886b59c9ac43b881cd5e4476056884ab9a246248892c0c7a3ab8425d77c178b47c8ca5262949ce47c25b90cb90942b1aaf64825a7658c4e0bef219ba2e609eae90bb6983589e128325dc42d9422c72d0452c208b23297387a9b77ab8b89ba34266130d5cc35568ab1487c335fc9a91dce293d807ab73a41eec932c0e398a762881d2da7d558352d7b8abdab79687e3ca3db89036022adebabe39175232b36703749391c9b772a79396862972ea6c0b92387fa423fcbb6030f83d68c4a44600b25c547f7173376704a6e24c12a5906afc43bf539aa6aed0281d786336373a44147b1e943a9c0c7d8f995f61377134ec1f536334aaaac6ef040dad6a42feab2d6972880c602d97540a52305b24dc7cb243259fac61d2632285099a0ab740083178cbab0ee8f17599f115e106c4abd606ae5568f7a387a086b334f7aea5f92249d678add0c26f268ca769696fc14eb1c6ab8e182e5a727793d6bd94461b0e985d67e64f794b0def70c43ef927544081011a74a28c976c553ae2e0ca49c80926f460078886f49a55475c456f2bbb84270f22c5256241aad6e05b4a9a276e3357c1b92d5df09db23a783f19b1d9d594e064b09fc815bd43b5cb8b9ac43c64a2bca445b235f7bbb3cc0a7723d0a2e351cb4ecbb1b688ca217a500fb20cd37b1a0a2c4eb79775eab657425c8b264583b5c37bbcfa624ae1af5575571aa59960f37599d25cc625916ca149502766aa06cf31fa23c99b2099b9677ba327ca317e49e029eb33993068b022e00411462d7a548f4bb6b435d8ccc1305067f923c7a914d5d77fec8c397304996ce42773532b2798c4bb8a987e57b41b820c6f8b2c64181873bc6515b0c810109890b8abd9bc650f0344e3e7a672e269547aa4bbd0baf9f2b2f3b53b1910b255f7cc6cf0394ceba359685e9f6c77ddfbcf0217611d076ab2140a8dc58199a2a235955b69fc2520b192555c1bed2777ef623760cc71b0208dbf2a5d9841a231a60e2516c5ca3c6156a0c0862b54c311ce2b6b3f442c8082348833b193cb2b22d252a9ac88098c704d83f217ab2a8799f031227b95e1fa5d1a6410e3f025485338fb8338b5c7c4c0f6641b71644f11124b13c2dd21088684035a66a4c4451b5f66c9d5aaa7ace15eaaf03497ea2e1d693b77a4402dd1943e9c68cc642997a44d2f86a339c78912e678d0e314ff162c0e3c9ed8eb726ed910d1b26b99061c01142380e5074b5a46505863f6287dc18422b323c89966340ff7146fec18095147429148c24718301c106dcbb5a1b644e5a26ebb566b504a9b2984100bb6c40b45286d4c2841d774dc8915839c32ddb22adc41c0197431bf8c5f26c2329e6b2a0efb2b0d872c4b8b125d997937236caa455389c60f9e38ba3a662ac7349a5c872d84a353f9710c6c74463f220f37558458d68da5e67f1130cc5dd5ac4608220da2b8c9048bc805bb1f6bcf04379330025ca86b42cc361baab986c32a9e266bb1fa27552192a56b4b111564646b701dc4771b8f61bb5d41278a291920ac1d01649267344732a85109a3cb45b7b8e9abb8cec49ff602c819695f61011c7ac5957fccc50859432f324d6623459d7bcbfa20645b2a54c5a8ba0df27f93ecc2ed00821e98553f680623ebb221953d3d9b8d188044d693abb88bc965984b08d112ea6b4885aca190f9877f1bc123220aad662fb7f5b0afbaaae118c6108c98b31a5b6ff15aad0a87b172bb40998ec232a9d218bca9f03e88633914561c9ff65be6dcad01550903276646208248a56e5c3239f951585ee9326808a4e4f829a15996452a3328253ce2cb3613aa4fb02acf3030b64c6a27afc5863487b9538b53a2e1456168180d257f4403b41f16b415740abb024eb54c23d6a851bf9c54932259d1bb510964445067c68ae362dac6a7c3e29ed3080b0d21a76ec220c7d562340123f7a32c62184d2d707144a1565e432dff443940736cf628caa3607076783b2b29bea7058bd164219518aa77c2b303e07dffcbb00c930ef0f0632c10aafdf32fa7bcadc5719fdb591c7635c3af83198fe306076a9da2455963b91551a1618040b0eac945f788820a1442ccd10fbdbc763cdbbb6e221e8ad076880abd561c5059e23709d40996d41fa6f129c4758b62644c30c1c06d0080091b4d5a8705f4b0694507252ef1a5980a347846160ba3256475741d50a7ae465f1b444a25729ecb66585e51992bc781f28c180593c4e5882c243017440633007db1c637733a01bb8a994347d7602ed0b34261603b84b8c2e14c5c46167af459507152da216f272371a0981fdbe740daa78b9eea655d98cd14ec90cd383863ab5fe8137ebe820df5a007a288586e18a54b43387de9b73f9037f27384be092b09941262706dd6db377f733b31a49d2467605649b9609365232252a62555b1451674b717182870c1088f4b34061f3e8b9034af0cf2c5f7eeb665e064f5f27cd5e4c84531d45d38051ef98f7bfdde2a7116ff4010cf829cbb18512f7cf44237c02241a1f75fe3ba8d22bff03a8abb0a5010f400ae5722a75bdf5a2f6d5b546b34d73857cb1bfc7e587aa7 + +# Official test vector 77, seed: "542e20078add5296050af150360f057f6b9ab3ba835589dd56987de805f900b906505b5390a0d86cba28038992dfc59a" +seed: 241191401a63afa750f05662e354dddbc683c776ce3222beb83e3cf913d7ed7ca59b3bd23b49a95bc1fad20070fec930b6060bd827d742b077092e422268e15d +public_key: 18f81e47490cf733359bb77d86b1b949396baa99c9d73485e378b6eda76318b961948497db54149f386e51648187c48a94fb603eb114a9408ba0d27f3c717694f9459ddab7c6d51a58c50a79bc072d7717781a6b12073577d3a89a405829850aff65023a771a5f5456ac5b3970d545043a2254178375268abca9a967f50db28635b1d01e7d1969080438368a4b61f63efd82a811f63909aa48a055cd9345c09191abeaab8237696bdf3512b7e8625212bfe5500bd7002066357954344fe361be074069a520a470eb64bc0289f85c981995141a246ee3c6673d9026b7b490a82819ee1825ad39284fc41a01c936d0280c4c681d62e47de8e339fc0a0f958b279ab95114209231faa8962754b12a22efb67ed1c42e8c144f74476f552a297e7573a81717144648befa3b6c6096f428c10fd925ba86b29c8890f2750d1e7956664a714fcc00c88a3cc259b503d3ca39942986d19ab6d76378858d679cc61ab40edc5a007d33813698a6ae96acbe95474b188bfd3208c885179de868dd027f12256b9fe84ff460b180c7655d514168c89a516ba4ddcc56c1b5325c9312e067949a57178251158eec2fde69bc9d61be726338830a86e8e525ec00152cdc0e86473e2b54ab64790735c3a945cc83b999352ad2587fb67dcf2c9fb3b921deac54dccc8201d36562f64831c8129e67b2ae78bfacba95f29c3d20942781e090ebbab81bc5c071b0bce826173f0cad6c101518b56dd03a8bdc872d338225bb16128ca8c7212867dae513c971b687297e4c098ff7c478f841a29dea278d1bbe55423321372a44937d2aba34b279c99e8847c5d4b51f54143de991aa16aeeab267386c7f286445acb87a98cc93029658bb0981048876f0884b526ba58f201257a2245849a57cb425cd2ca92a3cbcbf963a4f360e8616c082d8be4820323df715bf5344fcf85ba070ac3068ae91989e61600416d7cc28cb6d42a461dec083f6126c749ca457146d114c84fbc576a7dc8f9c2c03cf4a3cd2535a7a396f59d73259654254e5bcf616b4970770bc8a3d030c8c61d93eb08644159414dcc6428be73357531e50ba72b5eb99d9380bc4802339070366a19760c0b15e32a48ae0038453527b10c4ab6b1ae8497f49dc47e25a514258b5c0336a812525c5a86e22d73a9a8c3da5e88a468c3439464fac42491b0bc91cdace7cdb15166a01b62cb22b745c38ca32a9727c8c57537c72563edb4aa2b400b778115b36817f188e659b2bf7c999d108c5b2d252f6a3bb78737edea48c9bb91e917487e4e6156dca609aa97bf47bab00047602f296cf611299510b195ba59ae7bc245b8c9721901995b6df4918842017945c330290c6bb3c46d9104faf014db6728c4268627f8c884bf52e011344cfa795f864a474f9c015ab09c77911a8a52c1aa46aeed6560d4bb1f3b64d65028d373ab3d51a450e600a239767aed9cf25b5c85fc24cc794162ee70e13d88fd3459cb37a92d348a1956bba09e24513d5a5fa79b593a849a1930456f39fade44b583cbd7eb4ce058056df38cd0be15205161f53f2c8681cb9e00525fb59cfd86ba1ae81ccc1636dd69c81ef620651606326a41db9b68827378c2ec238e9179c02965f938a2d0aad893c30d27267e416287d7ddec314a79402a769c3d953f0092ef4f8b595f8 +private_key: 77f83df8951068a026ba38b5e53487b6d6a39b69129e8b45498746d529cac78b4e9437565f39083aa50ad651b2d536bfeefb93f7ac40f4f4100b231564d4880140873d1c367da759b54c5cd9409382ec3183766a4beccedc375df891c75d4866afeb0ada4a161386b698bc63b5850cd3a1801a4a80f0053251664c7642971e0a0f415a0cda2c660a052a7876a5945c172fc87d8d8c9d06c9c30357ca3f8964b9b76b4544784c16981b075bf49653fb520f99a23e2465789e6b5864b969df900fef3c80e1bb0e12fc93b6cabcdfea9006e638f265880ac630823a0678c29069284a16020ff97404e6f4b2cee5ce8434b869177134f1ae861784b4f7332c4ac89cf8c36e7bce1a59b4682376b33300b7696e3bbb6b301cb3311934514babb29a187db5a4a656bd02d379f40694a6f1b55d1a08de840126740f14bc994da75f2fc3bffcf88fbd9b88f21122dd6b5ee5c2393a69803cd5cf67647e78b94bbcc81355e938eea2aac1053675251dddf380173316970cb1990153c9a0889c3cb05715a02597bfdcf925949873558ba5cbbc8782e57b3720959c19a21bc19c65a27599f32b0f91835c421eefcb3ceedca0b02659f4805d1a5cc916e2b46873cbf6c403e97123271725932b3bb40a0de7b08ff71919b249339a22585cd99698dc1f3413b15cb09142ea1a8d8b0c1f64b1b6fba5ed3068cc262d2067686276c302b20111cbb602f29756c32279dc578e20801d2a3abb762640409b8ba349cb72c9d3056aa788b023f15160832e100b7e48d14dc4b81229c744fc20c3a94918e78c668f1aaf01bb8b202a3c8dcc0f63d456b50461c44101a6338c4b7c725490af0563968a8184daa8720bb36dcca4ae3b3ba26927284c10093c079a4aa3b846a811ce237ea9033541d91fe5308dc32cb8bcb77b064bacd816bd8725569bc85cd7f63d34539c14b56534dc516f1500631a59ad1b985c77c262a0b70c3a14d9b6b81f2c88432568ae2a7ba32824abe9866738adc1761293925c694428ea9153fce0542362be09154b4e06b8a60b57f96176843b2764c3b5f55a1738b71bb2c87e371ab7a70560c245aadeb9742951959a25895d40b453376fdd844c9126c78f3a553b9c9b9d43033ee8c6ab13348058589ec1523321a823d32a97e0bb5270672e9990a0012842c38f3212101034ca8a863ae632b53a412537a40928c503a71b7b095163e222a757f3713157b8e8e369f2e2688d50728efb42229325f475482d167515d2656b1c131bca452892c39b8b2ee658816813bb66a0b16256271f8a23c7c0b31a45c4f42551a9a15e87d507d0547921a26bef229265b24bb96b008da638727615c8686f897925b6f27ada067736a7949bec8d23778708163da61c68d806067becc118785ea432a06c3a99f6648341e80b1c5956b650afd100a63474a32fa53e2a9b49ab935ff4616292d9278e839a70bc1cb7a61a49855216d5bd3c10774836469b48496f0590127850d20c52125150e25bc8388483847c92494c0b48e66aa8805ae8c3a0e7c5ae3ec64ba22381eaf7ac28eb0b76daaebe0b6b6e28bdd478002359c79811b2f47a3c45d938c2690ca38a7a2411c223855bd7fcb83d614266251e76684418f81e47490cf733359bb77d86b1b949396baa99c9d73485e378b6eda76318b961948497db54149f386e51648187c48a94fb603eb114a9408ba0d27f3c717694f9459ddab7c6d51a58c50a79bc072d7717781a6b12073577d3a89a405829850aff65023a771a5f5456ac5b3970d545043a2254178375268abca9a967f50db28635b1d01e7d1969080438368a4b61f63efd82a811f63909aa48a055cd9345c09191abeaab8237696bdf3512b7e8625212bfe5500bd7002066357954344fe361be074069a520a470eb64bc0289f85c981995141a246ee3c6673d9026b7b490a82819ee1825ad39284fc41a01c936d0280c4c681d62e47de8e339fc0a0f958b279ab95114209231faa8962754b12a22efb67ed1c42e8c144f74476f552a297e7573a81717144648befa3b6c6096f428c10fd925ba86b29c8890f2750d1e7956664a714fcc00c88a3cc259b503d3ca39942986d19ab6d76378858d679cc61ab40edc5a007d33813698a6ae96acbe95474b188bfd3208c885179de868dd027f12256b9fe84ff460b180c7655d514168c89a516ba4ddcc56c1b5325c9312e067949a57178251158eec2fde69bc9d61be726338830a86e8e525ec00152cdc0e86473e2b54ab64790735c3a945cc83b999352ad2587fb67dcf2c9fb3b921deac54dccc8201d36562f64831c8129e67b2ae78bfacba95f29c3d20942781e090ebbab81bc5c071b0bce826173f0cad6c101518b56dd03a8bdc872d338225bb16128ca8c7212867dae513c971b687297e4c098ff7c478f841a29dea278d1bbe55423321372a44937d2aba34b279c99e8847c5d4b51f54143de991aa16aeeab267386c7f286445acb87a98cc93029658bb0981048876f0884b526ba58f201257a2245849a57cb425cd2ca92a3cbcbf963a4f360e8616c082d8be4820323df715bf5344fcf85ba070ac3068ae91989e61600416d7cc28cb6d42a461dec083f6126c749ca457146d114c84fbc576a7dc8f9c2c03cf4a3cd2535a7a396f59d73259654254e5bcf616b4970770bc8a3d030c8c61d93eb08644159414dcc6428be73357531e50ba72b5eb99d9380bc4802339070366a19760c0b15e32a48ae0038453527b10c4ab6b1ae8497f49dc47e25a514258b5c0336a812525c5a86e22d73a9a8c3da5e88a468c3439464fac42491b0bc91cdace7cdb15166a01b62cb22b745c38ca32a9727c8c57537c72563edb4aa2b400b778115b36817f188e659b2bf7c999d108c5b2d252f6a3bb78737edea48c9bb91e917487e4e6156dca609aa97bf47bab00047602f296cf611299510b195ba59ae7bc245b8c9721901995b6df4918842017945c330290c6bb3c46d9104faf014db6728c4268627f8c884bf52e011344cfa795f864a474f9c015ab09c77911a8a52c1aa46aeed6560d4bb1f3b64d65028d373ab3d51a450e600a239767aed9cf25b5c85fc24cc794162ee70e13d88fd3459cb37a92d348a1956bba09e24513d5a5fa79b593a849a1930456f39fade44b583cbd7eb4ce058056df38cd0be15205161f53f2c8681cb9e00525fb59cfd86ba1ae81ccc1636dd69c81ef620651606326a41db9b68827378c2ec238e9179c02965f938a2d0aad893c30d27267e416287d7ddec314a79402a769c3d953f0092ef4f8b595f827b1b921723cedf55fe756ff5fb67d555296c6185d171ed8ba01393d1a735018a59b3bd23b49a95bc1fad20070fec930b6060bd827d742b077092e422268e15d + +# Official test vector 78, seed: "6a85a61dd08c0733fcbc158abb49fe0b0d96a50dcca140a2e9f5a254f1901985844613b1c656c0cb0112620591b88ad0" +seed: b9a6b0c05677e957d41a34ba03bd06f2a9092e31f63389397d7e70fde6409d18e99c0e7b82be89bc3c1eaee6680aa4efd394e40c2b3f30523c8117f7c26a8969 +public_key: 776b6f121675622857b8b376d708b2a861306fe931126822e2e8672fa0b577e8ca3f16495af10aae456a734368677a87fd3c2199060dc1993690c1ae2b76959664a1df6cb2b3738b294124918596b0d69394eb1efba83895d0a7f3081ef81769437cb63b726d4236a65c87c3929b79fe34438a8931cf2b889cf100747cb58d373491e7cb62db266bfb3b7e745500fa418eac8cabd966dc388d0f1b3fba850bfec8c03a29182deaa5ec4256fb3b436f429cac87399c61bc98497a3aca07cec06a128231f945a4a335ab6d1a54a9a59db106c0fd61360ce8870d1cae99201506c9c96d4969f4b487e4d87ba1d45accb5a754585f29db0991376150c65927b20c9eb421366cc840d528734c8b4f1421fe30c99f4c55f1e25d18a1b012424cc9f6250064a61c1b42ac243b6c701e293055a9ea7c44855e575cb6217c381de770cf461040c20b2cea6c2a921c9be483ecc2718dac01c4a5a15b60bfd5222fc988c60b23504919137b1226d7b72fe4105154711d25790a9f64c95356a787058018cba996410aa4f29a62b6cf77439b5784b67390b96db77c1583bab490719d804e79b8954b948388514a7fb78ebbe7959599ca374a66558a8fbe7aac91e8a62ac623690a952e94bb91e64fe57ab4db066867ecc9ee027163a8010bf901489c10ebb736ae619dd0177fcd060c4657488bc50044e4c895191351ca72aff9698577bda5536c3fa75f0d9b586822211cd88d686ca8921ca65bf8081f8604277839cc9757653a46511876f7b98983fc052bc088bc85a686ab6bfd5c2b91da8ae210313949191d13279be375d3d3197fb01808a76caa8a843e178d0dfc116c041030f2047f4b35c0900498fab680d45fd0710d75226eddec6388d56d1c2263768603ac0ba9b68a21173704bd25b6b5181405029cc4b18c6446b5afe5431f0a26bf50b2f33b0aa4032e9f28ac9fb58acd85a670f393351b33df4079a5533c44a94e968b677a68931491310cd48ea1213dd416ab650b3294f06f91aa5004f622ba173795136eedf91598153b8d2935acf33709a8b33e4b32384bab51fa69ed123a4eaac726dc7041b486e8aa3641fb8d48f908c27866753b821aaabb9894b504f845fbea8766e82671506ff5b5012765a6a7b08f9fd3c10357523fb423e02024577235fe4694349c1188b1aeff482ba7a15aa188a8bbe7108ccb7ad6a469054a45c01aac131c6a7c4acd5c050184ca77b8466b6d1992de80242454169a33382972760de2b69c3c000b900d25f2cf4731224dd9a2b84562c15c04d3d1a9ad447ee9404888141a7da3a522f90b9071ad7af54552d0060af1a66a31b9457024a46b3fc1038a7c54b76053909ab07eb36c1dfdf897276b465155aed0e70f9a4b9398e54d267377fc298b9bbc053b281486f8436017c6d98b3249c167b17358c134299ae17426bc9f067849d7c55541a205c1359a41d7a5fea37e758a0893c18226a44bdbd27e0266096dc20da357c5d1a23956b796b305c29e87718f65b8331888cbd53fc2fc011f92c6f49c7f9901a5b17059b81cb2eaca2d348a22a91105f69140d122bf59d74c16a840e4b646f5e1cbd921a24a60a0ed6cad243303a1448b6750b4e451c5e0e41b3a12a73c36272ed86537f1d2f51a0e2b5b5847b0a2d9bbff0a051bd5227600ad +private_key: b066bd9303c7bb0c4a4a01812cf463cb338cdfe80953fb0c90d2aa7a2c1e110443d80ba64f6a435051083af14017f02886b63c8f0bceeb544b86e74e85a16db9539de52c76a624086031c0a9b84380d02ce49b0736e2277995a63c43a2ada9a60883024d50314d919c98e7a4f34c167c830c717693fb4a2f4ab1c684bba76365403d6b3b27f76a4d9570bbe73b09e32d45b6b89616bb014c5fa995779144107ff6ab3b523ee121c3cf601ca7ccb13c7783eb8702d34695c686298824884c46012c16c40576497314a0d60675fa0b1190e13a816c75543c9e54867f9fa495a4e43f0cc964ea4b19c3541930e33a63750105149484094d30a28c6eb73de702238e09272cd0415aa3b19007c90ce6407a864703d9a9f1fa3aaa762e66736f7f692a7344ae84a544b6b289c2d2187d61ae6ef70122d180cbbc09a4878cc6e4b71f1962627746a9d33c0b7c3a78048af6e811a34943fb01c5b2a248ab256c729a8ae2a1cac87870bc880bef16bbdd0724e25a0257c244c2a59737da52983cb5ec02b44fc0bdbd40c8882470285654c61bb27a9a9fd0162594343f31307cffbac216481cab73bb215b73fc96507bea727e5505e31848306c6647f7875d708fdb57c2f5a428c4d3b462122dba423251b5aeb94a2c034c025c0b39fab66b1c10b01441b9f5d9b736272718b44894820aee4c5dca164080b4774cd6af8e7c5218065a6d03917f215d2f6595dd13141c9505da959cc10bbeab184396c2b552db0c9c7a878a10a63ad920c19c9145c2cdb4556d823cb6d1e48458d72ad9886daca3bf7265b4fed2b11ae1a8b73a1ba62a3a298c339f01cf70d7118a094de950723a9b0e837a74ba18a92410228d0803dfe49e740ac2bd50bbab741743795e292616999033c7a18765648441ba9725bc1b6275484741a625a9ac0516980b903ff40c58c348940817a40bc02b0f7487fb0a09c3eb6bced56580f09edd262ec2c251a0fb303e33202d27b509b31ee87304131518b0e17ae34158ed1565caa77013a7161bf1cb6159841f8566a4a8a0c6823892ba94a541b18db1a68c9a3ad1755a1648bdbabbaeb8c8ba0a105eae48cfce175a2070693138cf6cb3c3b09c2285540e83b2b5cef51e634b5902aaac61d63b5e72069eb52a977a3e8b442f6106c13b1108eff9ce87d387640b3eb1914e0587298aa10cba2b09726ab542e2101cd6620564b1ed8945c60c674f2233236bb744307aa7db84ed11ce1d01ac0cc9b86f463c13197c7c1aa3f443cb0eeca93a817319bc45f9a587cc8a2ef05b0eb2998aecac2920387695e154831c96beb5568d880d4e480087499f0e818002a7a2db2b717aa39b2fd755c1c7678cacbd5af344ad38578a894b9d795fe65b701d3a6322f15e501610c6cc1e6fe90cd5048c93b80632fb6e18d70ecd44b36bec3ef955813d338f3af7331774962a04318556551b18930f91b3eab4464572b39f996d71e4aa3b7179b07b7717c1373194cbfebb4dce5caba80a7a7bb5aefd069db471ba0641383b0a006978b3bf5bb14348b507a624fb44c41d4c8156e2765069281e2836a7859bf3473b10f24c8d371148077014f1268824859a82bb548c25ade15cc60128a58ab4301032776b6f121675622857b8b376d708b2a861306fe931126822e2e8672fa0b577e8ca3f16495af10aae456a734368677a87fd3c2199060dc1993690c1ae2b76959664a1df6cb2b3738b294124918596b0d69394eb1efba83895d0a7f3081ef81769437cb63b726d4236a65c87c3929b79fe34438a8931cf2b889cf100747cb58d373491e7cb62db266bfb3b7e745500fa418eac8cabd966dc388d0f1b3fba850bfec8c03a29182deaa5ec4256fb3b436f429cac87399c61bc98497a3aca07cec06a128231f945a4a335ab6d1a54a9a59db106c0fd61360ce8870d1cae99201506c9c96d4969f4b487e4d87ba1d45accb5a754585f29db0991376150c65927b20c9eb421366cc840d528734c8b4f1421fe30c99f4c55f1e25d18a1b012424cc9f6250064a61c1b42ac243b6c701e293055a9ea7c44855e575cb6217c381de770cf461040c20b2cea6c2a921c9be483ecc2718dac01c4a5a15b60bfd5222fc988c60b23504919137b1226d7b72fe4105154711d25790a9f64c95356a787058018cba996410aa4f29a62b6cf77439b5784b67390b96db77c1583bab490719d804e79b8954b948388514a7fb78ebbe7959599ca374a66558a8fbe7aac91e8a62ac623690a952e94bb91e64fe57ab4db066867ecc9ee027163a8010bf901489c10ebb736ae619dd0177fcd060c4657488bc50044e4c895191351ca72aff9698577bda5536c3fa75f0d9b586822211cd88d686ca8921ca65bf8081f8604277839cc9757653a46511876f7b98983fc052bc088bc85a686ab6bfd5c2b91da8ae210313949191d13279be375d3d3197fb01808a76caa8a843e178d0dfc116c041030f2047f4b35c0900498fab680d45fd0710d75226eddec6388d56d1c2263768603ac0ba9b68a21173704bd25b6b5181405029cc4b18c6446b5afe5431f0a26bf50b2f33b0aa4032e9f28ac9fb58acd85a670f393351b33df4079a5533c44a94e968b677a68931491310cd48ea1213dd416ab650b3294f06f91aa5004f622ba173795136eedf91598153b8d2935acf33709a8b33e4b32384bab51fa69ed123a4eaac726dc7041b486e8aa3641fb8d48f908c27866753b821aaabb9894b504f845fbea8766e82671506ff5b5012765a6a7b08f9fd3c10357523fb423e02024577235fe4694349c1188b1aeff482ba7a15aa188a8bbe7108ccb7ad6a469054a45c01aac131c6a7c4acd5c050184ca77b8466b6d1992de80242454169a33382972760de2b69c3c000b900d25f2cf4731224dd9a2b84562c15c04d3d1a9ad447ee9404888141a7da3a522f90b9071ad7af54552d0060af1a66a31b9457024a46b3fc1038a7c54b76053909ab07eb36c1dfdf897276b465155aed0e70f9a4b9398e54d267377fc298b9bbc053b281486f8436017c6d98b3249c167b17358c134299ae17426bc9f067849d7c55541a205c1359a41d7a5fea37e758a0893c18226a44bdbd27e0266096dc20da357c5d1a23956b796b305c29e87718f65b8331888cbd53fc2fc011f92c6f49c7f9901a5b17059b81cb2eaca2d348a22a91105f69140d122bf59d74c16a840e4b646f5e1cbd921a24a60a0ed6cad243303a1448b6750b4e451c5e0e41b3a12a73c36272ed86537f1d2f51a0e2b5b5847b0a2d9bbff0a051bd5227600ad32a2a1197d78798bbeb13ce2e92cd7ed94b410adc37b1b31dc060af11fec8a8be99c0e7b82be89bc3c1eaee6680aa4efd394e40c2b3f30523c8117f7c26a8969 + +# Official test vector 79, seed: "7f4a56eda151e7b097cfb8ef980440fff707affba91867c89522ced6c5ff3bd7f5f00bb49ddd615d9361a7e4efa42851" +seed: 28a96c71577ba00c94f99fe965bc595a26db2b3ca6ab5cf8e443cdd8462b17929c35d165453e5fcdc6f9df64526d9de698f2bd3e6bac6c7fdd86601b9ba5f4a5 +public_key: a6f3b26ca06ad98a9a6ff2122b8889bb513558fc1a8701376ceca1f7d87a53f78f953aaf9f977c2ffb4d04f88e33e0ba7d83bc6fd27914a769ae382ba5f211b2f59f0001ca30b0a0ef138adaa485953cb8b6f6ccb56a7c92598c0c83ae97684c26d70d69210c8dd16ae08c4b3c1c30110a581669245529be92d38d9cecb10f22c83d01b3b3660fab4662fc559f48041167fb3e7960328c612a7e99a0c546b63b1b04f22b78b85074e6d32f6e04b096eb89da611f30267bd8760e05c238ea2a587691181112a39c88c528977f0399cddb7a7c8bba3ba71507b3db7131302407052cc4e8125e2bc035172a967a21a0582a05f8aae28228ddca417545144882ca3d644f6167ba30e91368879efac5971c8b1a7a9674e804c08e506ade53bcd778c1af4637584b9752aa1f16a4319d296b93e5368c10863a85cbb55c11c56338285b21cd740695757adeb2ce48b7c658a36b26b670e59947a0d94d022284bf0995d56666bd7968bed8858895c779a3318275afe42488953791e97cbd6256c29a6c6e4339a15d7a7c3da95edd2a562dcc2f6fe077cbd2317a914b975692ad1c3c3d956b26634fe1d2235d66226ba766a447bc87e8674800cd898b4b02c491658b97e25a4f836ab98a99c669b60aa4c30518a6644fb048a4e34822782644038ab04a3815c61da99816eaf388e495cde4a65c12f1bb5f02a1a1b1cede817952625fd2502f2a4b8bbbd4123e71462ee433ac923583c830cc54129bac51f96846d8fcacece9b19f6063734158008342c6f48234d24571e5777074170ae24b20d125f1ba311f4b33cdf91e3a2305fbe12e44ab54cc8c4eaf8553f697c00e8040e858569120bcd0166bcfe1a66e2500c3ab8acf3b58f1309c68772154602ba6c0968553ca553252d27a0b05733d81486d86c590291a643edcca9f8470d573880d5856a6b2cbcff2803713790d17297ef11549d5412713a3e4206b1b7c85483192164209f5b32f709aacfc4bae51f180edeb7e999ace2bf98d958514951362b08a6b529a2a7669c5492c0a61645542bc1dea0b707282a0797291b8c7a510884f12e92f3200ac5ee91686e109ecf245b2672f94c0a4525b7f43fba328099bfe4330888b186d026231d2b2eab7b971ba7680f0cb4653652f8aa8b4e01bb77461d792cd5e941a31dc02d52622b37c498e4169bc0418e23c5d32999726462d3a0a6449918b18db487f422849b67cf047bfcb0c6945bb87cd779dea915b64aa0975d313f8a740de77b0d40612459c2eb73a3fc876ac39c821a52761e13115d87bcd17052fea2b98d9d83ece9b1de7124c9738c0df539045279eeb21042a13791feba9d0e23445293eb3c2c194b76c5febb5582220ca350eca9b90435372f3c5baa0549ff847aedb815c244b27dc5866b151041e884befbc7bccca2fa098b592c5aef7f53e0d712bd2119214c15f8ab848a1864705d0511c50a9942535cf06952b0357445a9854240c026733ac8a39eb3c8bca2939d195763a572353da2956799448570a21d58623635f7a7461a913c24ad04d1495c1ee42c88b82942012b2d4b410fd1907799623f1b373b9c438d2b4c3fc48c054bc5206273f7a9a3dccc0ad8d40070ef20fe4cc99c8394adf63126006ee8cbb821b12a2a0a3018c4f8e52a50183fff79e84c69427 +private_key: 024755131769c7169f4b3a0b89f81f45e6a48cc2cb0eb87badd4ab94e9bc67e85ead80158c390dac09c40a6a8de8a95b21c5158a853442a908278a6ef80551a7c16a800242c7086144444e488bbec51c3cab83594bdc2457f0152c43a9577c51799ca7b03c9ce3cb4f5c6564792ab8201a3b8304ce4d8339a2171700d7a6ec1a03c337b639f7c804a50a6f41225c1143f9d8ac9698a3eb126b9da000bb2137489a165848865b487051b7665640b2e5e2b1b4633583589f30d4572306614df8080791040daa0106633a26237a244b6a18920d87653e8b516ea895a1f75bbfa912742bb540006a95ad20b95471cd4c282a64a36ab09a86b1f90f44d41753b0a8cca50d9780351f253a691824c785ad8be9790d48643bb4611792905e5b80d2717369e4786e5901c43366a14b3b423b11139349c9107fe3f55958fa8e4df6006b3607210b525304be6551ae57e826c913cba2503260a9493bbb3cc2319d791226c27a54233c48e7084ee9ea82376142bb419cfa6c0f51426cec39b554255f56b1cda42b4ac33391b08172f7a82574b6943f6a79ac51a5e6e254a0a5c80d46538c03705705abfb2b3ef63a756ab8ac03530aa6cccb005a05d73b687d45529edba35af03c411592f652c8f1131640b943629806cb21482f8913f436a06dc790b89b2f2a49245a51a26e107bd18624b51b406381cba1ab3e8879c401a30fc9f0c40beb557343735d0a44ba150d4cb404d752805085892b709f2a97abc413c81f7a1e14811745878d66e98f1fc176e4a3cabe60557e104d24733668985ef15b87e78b57d22c4464ebb4b9eb1b124b80c6328c3bb93349359777fb09a19c1f7de48274fca6d91bb51a97c49c66295bcc6c53933e1f327f2037c7bf9c80cdc5406fac0a9f067e7703a0aa79ac0eda8c14e4c7f6b05d7fa84ce9a487ab489227910d86b0b6a3a91e21eaa9493a986ea773af7c16cccb3b059aa724a02cf936a45730aa93ccbc2b3377014350cea39c36908f5167b08001061867c603f6ce64b081b2e46b1985837684b5e3318f4531c13f80277a35683cf599b373136ec3977afa12e1d32085330c0a6828a57c2902ab0ca679c2f7f9a844091b87a4754ffaaccff0c50abb01768927ae0b2eea885b54e92db59533ae6a6e9253c18c9184c1127220775da93c5964845240a7a3795b5df5d00baa34393d3009e641828c86173ccc1a9f9749a0f9271867b2d2a364ad7335edd1c02e131117a93b0f6113dbc9ac36924ee63cb954b60a325971501b3822732007629b00a965537c3fc07791af7a0c000446d15506c8404da9676a9907969d40627a18448f353735706015f05005403aa7a7b79ac7c5a3759b569b8b5d3b86bda01c4031a1f4e45cd663bad410123a973b2b6633da3c88ba0a26f0347901c6236ca76e1266440adb415fe5c7adbab8f5d8b3dd5bb4f88c3a1e450a4850629166102471294fd05696a54f516a0263e31a895010dc034ce6a72f6294a3cb6120d59c0e57827133a2b53f40b0d5f060e9480e77ea39e02a48f4327cb066bb32d2289bd97d10ec6615a6ce06088d6f63391952c89ae8bfebc43b554aa5e4b6a87cfa9e5b457c581a437422c48aa35df5c939694737a6f3b26ca06ad98a9a6ff2122b8889bb513558fc1a8701376ceca1f7d87a53f78f953aaf9f977c2ffb4d04f88e33e0ba7d83bc6fd27914a769ae382ba5f211b2f59f0001ca30b0a0ef138adaa485953cb8b6f6ccb56a7c92598c0c83ae97684c26d70d69210c8dd16ae08c4b3c1c30110a581669245529be92d38d9cecb10f22c83d01b3b3660fab4662fc559f48041167fb3e7960328c612a7e99a0c546b63b1b04f22b78b85074e6d32f6e04b096eb89da611f30267bd8760e05c238ea2a587691181112a39c88c528977f0399cddb7a7c8bba3ba71507b3db7131302407052cc4e8125e2bc035172a967a21a0582a05f8aae28228ddca417545144882ca3d644f6167ba30e91368879efac5971c8b1a7a9674e804c08e506ade53bcd778c1af4637584b9752aa1f16a4319d296b93e5368c10863a85cbb55c11c56338285b21cd740695757adeb2ce48b7c658a36b26b670e59947a0d94d022284bf0995d56666bd7968bed8858895c779a3318275afe42488953791e97cbd6256c29a6c6e4339a15d7a7c3da95edd2a562dcc2f6fe077cbd2317a914b975692ad1c3c3d956b26634fe1d2235d66226ba766a447bc87e8674800cd898b4b02c491658b97e25a4f836ab98a99c669b60aa4c30518a6644fb048a4e34822782644038ab04a3815c61da99816eaf388e495cde4a65c12f1bb5f02a1a1b1cede817952625fd2502f2a4b8bbbd4123e71462ee433ac923583c830cc54129bac51f96846d8fcacece9b19f6063734158008342c6f48234d24571e5777074170ae24b20d125f1ba311f4b33cdf91e3a2305fbe12e44ab54cc8c4eaf8553f697c00e8040e858569120bcd0166bcfe1a66e2500c3ab8acf3b58f1309c68772154602ba6c0968553ca553252d27a0b05733d81486d86c590291a643edcca9f8470d573880d5856a6b2cbcff2803713790d17297ef11549d5412713a3e4206b1b7c85483192164209f5b32f709aacfc4bae51f180edeb7e999ace2bf98d958514951362b08a6b529a2a7669c5492c0a61645542bc1dea0b707282a0797291b8c7a510884f12e92f3200ac5ee91686e109ecf245b2672f94c0a4525b7f43fba328099bfe4330888b186d026231d2b2eab7b971ba7680f0cb4653652f8aa8b4e01bb77461d792cd5e941a31dc02d52622b37c498e4169bc0418e23c5d32999726462d3a0a6449918b18db487f422849b67cf047bfcb0c6945bb87cd779dea915b64aa0975d313f8a740de77b0d40612459c2eb73a3fc876ac39c821a52761e13115d87bcd17052fea2b98d9d83ece9b1de7124c9738c0df539045279eeb21042a13791feba9d0e23445293eb3c2c194b76c5febb5582220ca350eca9b90435372f3c5baa0549ff847aedb815c244b27dc5866b151041e884befbc7bccca2fa098b592c5aef7f53e0d712bd2119214c15f8ab848a1864705d0511c50a9942535cf06952b0357445a9854240c026733ac8a39eb3c8bca2939d195763a572353da2956799448570a21d58623635f7a7461a913c24ad04d1495c1ee42c88b82942012b2d4b410fd1907799623f1b373b9c438d2b4c3fc48c054bc5206273f7a9a3dccc0ad8d40070ef20fe4cc99c8394adf63126006ee8cbb821b12a2a0a3018c4f8e52a50183fff79e84c694277cc3f47f319f88da508f841e536a056625f206fe499387d27307257682237f969c35d165453e5fcdc6f9df64526d9de698f2bd3e6bac6c7fdd86601b9ba5f4a5 + +# Official test vector 80, seed: "09fc004519bcf85b20d25d314a0dfc79e00cb6262a7dddf9c52473641afb8cfa0f5dd5f53558184caae9ec34b459e98e" +seed: c08ba2ef8c3a0a043afad931652d7a19e6e8cb670f840de5f1fa03309b2ca9ec5fe6141a25f7ab9f875f79e0a82d6ea5cde5a017ab637d5fdb7c42646a1d71df +public_key: 190b29f6e7cc26755aabd20d4be75f2fa4c18303319edb00809152b33726b1e54c0f328c73c6805354925b43a6dbe0cadf00c9ce3b1d7fd9b47322c8b91844833250e0e99369e90c279ab48712b4e1c10c0456c754251cdae4cb4599843510be3a13277d775a3242a6232b1ca2979e6f260b3c4c86fc24bfd95255c765cdf6187854f0c9beb8cee6a8391f98475d6aa080a7a2c6147f70c2a9450901f705ab0ec23fc957619d611acc2319c6042e137496f51436a788334aa5a6d561a3e3a0937a37be9f7711c5fc6faa1024c434cc3e41a3865bc0beaa732c1789e7972f999007d4f7afdf953163197590e757a297919766428fd18ce1d531466a55109287c335bc26f946e06a4d51aa27b220001a46c2f4e339dd83511d135a9621c1ddf1083bcc9b24b994b4a3394df8ccfbcc743304383c300a9761859074a3d0e91cdd96a34513735a424238e71f42c328eedb1cdfb3ad704a1667c15045c534c448b429c474c494c7b37114911771d62c39d3f4763d881c0a21c074201301ea0eff13bb5df861ecd882a0350031b2af63572845950535e85fb323beebd613ba600702192d7cc1218309885ab9345ef32dfb757528229d73d57cc2328a5a86acc3180e392144c04cc45ca57573395ef38a95674b28ea7bc8684c8e6a81865a93256517be79fc456472976fea2538bb8b52a188cb43881c19ab47069b36968da1cacceab9bfc5c7985614a3fff7300e621e4865c5f8d30792099d3f793e58b591cdd87cfa36430aea876f30cca5d824fa29ab2b56ad3aca5d483c3c7ee90b4e028b7794592e1acae0fc721d355891c257cf821928104e1c994b8bc33eddf70c3cbcb5e272b43b5777b3921892ab198b4132ea4b200618b1e4559064d491487b1f0135c9da67a39950a5f13a1e6eb409c30957b04c645b052decc23a391a7692390de9085147c96c67f04ea8212c9d80cd00dc07b7d22826e01facca51dab91413e8cbaa24a66a00b4d2076d58c398ecf03ee56c40a1ac03cb02658e6240c41c6f06c174f3414e258a11478c7a76e05c156c1b164903b22991391955c3e75bcf0cc70d4cb79ea27638c54dcdcb1ef35b8f3caa26b0418f340597bed55d586981c77cc6093a889854a85132997bf706177099ee8b5ae44cc1f1f3c413fab7a51254490a6ac4175a99da866e5464283a74c5c300436ac1c7829c953128e5d17cb056af07b08d7f114e0be00f93854e09eb5e0be82a5a4c526030468f95bd82e08c2147736598a656476e5cb855e0c486d1fa0c661202a79b37357995ed445973959cf04116ed0c687227768a41a1b4f79b8080a740f012dd547403a30a36e62c9f5a1659abae73a165202122a330c61f492822ea25dcc22cb97c00a38bb7a4a493ae677cec267379c3a1b80ac2f4612221976ff4c7afc685283af88ef813a9beb73ef380be8a31c87135c6573c0d1d5807e63ca6f1418b947c1615233b911736b0870b766c9465cbb8b29573addb33f21a07cd890f1325c200545d5a21c5da1a0082b9c198158aa2b82cd5d94bf5718d39bac4d9096093c78a069b9210d305e9199d45ac09abe6a8033c971b2903874ac6408b3510d318ff4b464ef16ad3e56bd664cadab4cbc2eb1f13656c6547db33b5f529d253c85a728313bd36b9f09f6455b7594a10c1 +private_key: 2b006f1c2787d3f704935762feb046f67a0a59163ed30c83b577caf4667605730b11364a383366a74125df3526fbabb7aa3916e9a05586920f9b130ab980b2a940109552047e231cfc7a9ce7987d3d218c52a11c22953722e861a1f000385aaee23378c6372315e73315893fe0f027a44caeb37cc796ca1954b79adb22887b41b3e9c98a4c5a7101714f4cb78c9d3886393567016536a0706fa1c950dfb71af86b91610509738b3f6c192368416b1213ae508439c8c9c4f5382f926c6df08852e8955a04d5a8a30912c201483096bd202ba4b82855236b804faa20eff056e288cb699237a1e5150d027347bbc06412c972c0a783a1b794e7b2a3b45b7f842ad18b5520a143f4635059690df45b1f99bbbb0f18ad5be48006727fccf41d400430973b8f62481b73d611dbd13df47633c1a27b387398dc32af9e71a40c84cb48f131d8a7acf8d91ee2513f3f225a2d61b752e24a2860148ca68c3a75243200547fc054710293b7c7a939752959e6256cb29c0f0535055b18e2f78ec4da0bf9aa91caeb9b5c5150ad42a867c18dff50b2a1e8c2d31951d5fab52aac7d603500d9fb4b5f516fd26bbc51a622751636d2c2ba24ca5c3aac696edb821b237e7fbc2414e7cf2388644ff702821ac1e2068c76d0717c40bfc47c7f96077504d5b9b2c7a187c0c746e904cde556bacb9cbeaaadc865ba93d4837b42192b539e6de749692916df131f26c26f4b3c93fdbb33cc8b39d176a4b27351911b8b85b5567b839cc6ab5f65a3502cd994c812b72a2037e5e38f08ea97291292fe51185a603f94fa6ff6e247b8e3cc82a8b111dccbfdd715d7458b3d984ef4a17ba7314ffa8a069031b28e9b858e22900d364bcd095079c4c06a515599443ff5f434be754bad6aabece45a1ecc7dc5c95541223bf114ce60d663a3621b95826747b7005e94b8a84025fc43b8dc320964d2a610b7ce10b7c7d56c37dd647fe1920b876267cfc0607a35700cc51a3187b69c488d34816753607bc22b59aef9c3be78a2b7959ba69212be46c9411a4c1357493a73a50930020fc732acb44c036602c22341d5039dd99cc53333091e983c1c1ac47607b5e47727d1d8a313ca73e1b9c47a63a257e1a5c01ba55b802274ba8c3a35c8427c9130c71d77165e00f2a723da6febe7a17d89cd6319718452be2a80777f1469ac36356e73ca7ef420ff64661161b3eb459b33c694a6399015716d8d7b3b0669648d2331edd6a9e54933a5447946465fc21b51c31328a6763829100d02c9407a8ba8bd150e540755e210102dec9fd9a06744ba9476d0b6252cbabf718c4a917fbeac293408531c46ce91402c91b10a3994883dd83fd0c97a952441fd6485c8c34f8116b1fd392f706150fa0867bd0078b0e32ac7828b6b61624677b55c18aaeb494794b1632e686338315c92028b3828598a4ac462646349f17abe582440e39ab346052219537e909e8e80135303bfe731ba04caaac6cb89b3c37558243d97881587f45de25b128f9568ac45b4e3f39ddb861ccb0749ec3541619b164163c77b7397da453f57377c49c2a8a78c568e300a635612b7c95035f4c71ca174e7653ad15601bfa46be017610240b045032453b51ade516f190b29f6e7cc26755aabd20d4be75f2fa4c18303319edb00809152b33726b1e54c0f328c73c6805354925b43a6dbe0cadf00c9ce3b1d7fd9b47322c8b91844833250e0e99369e90c279ab48712b4e1c10c0456c754251cdae4cb4599843510be3a13277d775a3242a6232b1ca2979e6f260b3c4c86fc24bfd95255c765cdf6187854f0c9beb8cee6a8391f98475d6aa080a7a2c6147f70c2a9450901f705ab0ec23fc957619d611acc2319c6042e137496f51436a788334aa5a6d561a3e3a0937a37be9f7711c5fc6faa1024c434cc3e41a3865bc0beaa732c1789e7972f999007d4f7afdf953163197590e757a297919766428fd18ce1d531466a55109287c335bc26f946e06a4d51aa27b220001a46c2f4e339dd83511d135a9621c1ddf1083bcc9b24b994b4a3394df8ccfbcc743304383c300a9761859074a3d0e91cdd96a34513735a424238e71f42c328eedb1cdfb3ad704a1667c15045c534c448b429c474c494c7b37114911771d62c39d3f4763d881c0a21c074201301ea0eff13bb5df861ecd882a0350031b2af63572845950535e85fb323beebd613ba600702192d7cc1218309885ab9345ef32dfb757528229d73d57cc2328a5a86acc3180e392144c04cc45ca57573395ef38a95674b28ea7bc8684c8e6a81865a93256517be79fc456472976fea2538bb8b52a188cb43881c19ab47069b36968da1cacceab9bfc5c7985614a3fff7300e621e4865c5f8d30792099d3f793e58b591cdd87cfa36430aea876f30cca5d824fa29ab2b56ad3aca5d483c3c7ee90b4e028b7794592e1acae0fc721d355891c257cf821928104e1c994b8bc33eddf70c3cbcb5e272b43b5777b3921892ab198b4132ea4b200618b1e4559064d491487b1f0135c9da67a39950a5f13a1e6eb409c30957b04c645b052decc23a391a7692390de9085147c96c67f04ea8212c9d80cd00dc07b7d22826e01facca51dab91413e8cbaa24a66a00b4d2076d58c398ecf03ee56c40a1ac03cb02658e6240c41c6f06c174f3414e258a11478c7a76e05c156c1b164903b22991391955c3e75bcf0cc70d4cb79ea27638c54dcdcb1ef35b8f3caa26b0418f340597bed55d586981c77cc6093a889854a85132997bf706177099ee8b5ae44cc1f1f3c413fab7a51254490a6ac4175a99da866e5464283a74c5c300436ac1c7829c953128e5d17cb056af07b08d7f114e0be00f93854e09eb5e0be82a5a4c526030468f95bd82e08c2147736598a656476e5cb855e0c486d1fa0c661202a79b37357995ed445973959cf04116ed0c687227768a41a1b4f79b8080a740f012dd547403a30a36e62c9f5a1659abae73a165202122a330c61f492822ea25dcc22cb97c00a38bb7a4a493ae677cec267379c3a1b80ac2f4612221976ff4c7afc685283af88ef813a9beb73ef380be8a31c87135c6573c0d1d5807e63ca6f1418b947c1615233b911736b0870b766c9465cbb8b29573addb33f21a07cd890f1325c200545d5a21c5da1a0082b9c198158aa2b82cd5d94bf5718d39bac4d9096093c78a069b9210d305e9199d45ac09abe6a8033c971b2903874ac6408b3510d318ff4b464ef16ad3e56bd664cadab4cbc2eb1f13656c6547db33b5f529d253c85a728313bd36b9f09f6455b7594a10c1beaeb6ff178f3228defdd117e6ba75a34abb70e86f31fdb16d74d91e6c1b47a75fe6141a25f7ab9f875f79e0a82d6ea5cde5a017ab637d5fdb7c42646a1d71df + +# Official test vector 81, seed: "e3c41cca6f04cfe7732fd54de30cc5caac93e2f80e76aed7d24a962a3969c1b6a311459a3ec3e510e3e9b1e4291d4d7d" +seed: 0e3b30e102d707538c2671060f603bb0b8a014103f132d63b09ece07e4a4c75b11eafeca9e810796c34e8cfce9d59342884456007b01ddd12edce6d10ed87e4c +public_key: 8dec41fe4093b014449985121e134c925b37b11612a9c61e97d5863f81a83f903383a517d1ab1769921563b86069c9c20841481be7a75311cb1b2c74f4cc96d2aa916509cc24d33ca7906aad07938e701177b42158c19ff3040389894f5d4c9cbd608c8234cefac9bf75fa177d5669f45a195f420b189bb340ebbba649996863618366766b7c990c6001a397b00b71272cb1734adb60a5b1523fb46be42752eba4bad8d6b008883e2697747ada77635174d5f7abc89157acc61202100cf719c9b8c5bfd7409fa95641202384629b925c240be94889bdf96bdc176e4dd3ad75f7b2e4c2abc9ea8280f07df64a162d016db3a634071944f6468e00aba03255430375660bd2c413a0b3cc530de305948d783afd0a41b4a202fcbbb620d9bd47b1181859b66f922d0b5c464f71ac5682829c8c6f4875bce8c37c5212113cf77a8cf480660b0ad108a0b67c063ed52bba442567ab31b30858cb33584d5422ed7427bf085d163005bf182c90c96cbc89ca70591dd0606f95dc6acfeb3315274f7c4937ae511963e90e6d03646292743a4178a6f344c244194f989e1c34be06a09bd5086c73992da8528caaba4fbef1502c1abb01b145a7a825a971a001055e2b1841725cb06eb23625bc0d99f89c1998023d760db1960a751988529628b6aa54308a3c895688047a003c089ef4a3232fda6aea0194154339b75a0a25402212211f3eeaba98cb656925c34f46037a436f89e01bfe408c138601e3a490675abf367194b377158f131b12740636b92bb5d184c05a23cea0c66519b2e8b094610655699976538471d77bbb3a8613a3ea1ee7b22642d63611b498e302540ca71e9b5c1aad6bbf309a13f9ab5eb57a5670fa9244280867ccc48130c74c50219da3168a26a52001713ee7b81157a6392199fdb4a56631b2d17890e6b0bb82051b9a1c85ce8aa92a2557ffa499c8910f7e98c3b4681ebe6323f4794e3e7324330a710b6a87186c36ff04602fccb97a7842104547264437921b413d52229a1555226a3bb3f090bd8cb09df92f4b4093319c434c04a773acc094bb205062903adc121ff6c178aa5d02f4b401e2b43bd79966d83a014bc8a8fa8347e1a9e8c6947134b837f019b05124279b26f20414fe326f3464929105974a853961a6b55ee90ba8d730be6a51fde90b4c23753bd9728077b90bf1c656c0738946bbbc5a2d72f95d876437c659b1bc663f6ab2b9026ba0401ac168c05933dc0509f7390ce8a024a3a1267217bae20c0d26c9d824182bf67ac60c0b121184a42c89da7a1f2de023ee6c291dea37da360b6f912eb95727e0c83efe0796d603b1c4702b2532af8d34053e1c70f8b73d5874578b3a2a8108b12e603d8cc1637d54bccba48f73d08f63c12fb8bb2e40938456c46209b262d8f08fc9b576d463329057a7fcc86652008832712e15e31eba79cb33a58262f822b9b8abbe8c4a025729dbac6f4df64f14c9959993004e0a4398b7c1e049120d404fc2683d65e85cd279b8d9e9595e995631f3469ca25412a54535c569d80c2a09117733f529bfe9a9dc766c8da35bdf0b64d1c27d0fe31ad736c06a92186034468539a3adbbcf0e67af4e797b63a0494cd91d2b9b89f8d486236b9b24772383d81aaed73286e5dc6e35a1dd0121b0a362d8c94022a515340f +private_key: 13276431f3634d420a374a0ecd8b81c035431dac244df1ab3405626490c7407599ccd4c146c5b79653bd845286aca5c7fc13a527784bc0b0b0171261409978a4754fb612203267804a524e81772ba34b99a20047f642363f928ae781c89a7374fbc0abb1373cb3485ee31a76da703a8d39c12668a6e0869e558612a481be9ab6ac8c00109f3a184f808b1be7566250cd36cb38b57771083c64cdea6fe5e9aa02f5cd1b6c08272078745424a7a11fece731fef736471674506b9bc56707dea19858860825a14fe820563cd70dba44b57932048bf50eb27b76d8405133172ea16a5b0fe77bca259cdd46414f13425616bdbc006ea23b21bedb23ea86a099dbc48b4746ad35830d694a218b0e233842566b9dcb18822f9301b8d7a6fc2a4555278828ab27bb74b1b3cbc19b343ea64904c35c67a1ba1ad4f9cd44a2b2887b4adad130ba263321469a4f50c6a6f06b29047a3e253a19e21f3c027c55091d7777aab2b955546b58bb212d87f9361154837460966a80881e967e379a1365aa96cad80613b2cb0a34979f6c1d00e7010fa2456807217abbb1df6849be50bef9a67c973bb14f8953e7597360c076d5290f0b1bca76f02d6a600dff97cf1df0ae59ac851c29a0f99b17759182002c8141d20166f8bf1979321c1a6234b608257b6bfeba7ef679b837d6a23673a122cb1e817b5fdfe9904b1a2f953906d7a585f074af3bd445a71b431f776008b133d6269caf16b306d444fd819b4d4783828266bdb13e0807409aebb11d867667522ea606a210f68d6288bc3a484cc4464706538712921e107885834b4ecdc44af3c866ee0504d191724e5704b8b20795b6520f0cc8f1d89ddc46572024294503735551330e887e6b71bb47e97aa498791b735733a8a81d962a68d32230f0c4403056b065b379a44ba61188c7f102511ac0d894b6457402fcaba82ff0c13da32ebe5785b44b937fc020ee1544b95228fb6447e862803c941705625e0758ab5d1c3e7d771780ecb188202b23972c9dca283beb4f3303064c922d8ec8081b9529edc163affc3f585274ab0143060527d2050b34842d15d1508afa2af069744d7620e02c2fac7954bea06a1ba04c28b0287bf71ccb809d7c966b9f94b05906b003b77a0730a787610340c600ce3b4f1ed9a4b5195355501b5720498ab185c75740f2184f5a16c18b7bb58bc120a030b5d20240d570545f349365a97bc387a6bbc2c001151adebc0375fba522b7994fa4a78ff6390507ccfb8b47e208b70bea1899512fb068a9db8b262235191f6403ca5b8517db25cb8b202085cf6fca6b6e55a75dfa7557a43116179ab5c1510f887db6a9c5e8ac41fd5010c11411d8f24529674a97fc666c565cb7469aa7c8ab943606880a9832dac41fba34f3aabcb1bb0050c66f4c5b53b6892a43ea98eff429f4f6206c06290cdb504029b29752cd75fa4df4a59c5919607616c074861f3c00c18f1ab27c190937fa9597c165d8d61281873bf1eb36bdaa9f95360e54f5b8b44542f618bc99077cf75c2fe4a04efc112eb2618fc3424ae296ba1ffb9a92726bf0bb7d74960868494bae529438c898ce0c95ae47415400aba6c47ca4b301a64b97777b7209039a2403758dec41fe4093b014449985121e134c925b37b11612a9c61e97d5863f81a83f903383a517d1ab1769921563b86069c9c20841481be7a75311cb1b2c74f4cc96d2aa916509cc24d33ca7906aad07938e701177b42158c19ff3040389894f5d4c9cbd608c8234cefac9bf75fa177d5669f45a195f420b189bb340ebbba649996863618366766b7c990c6001a397b00b71272cb1734adb60a5b1523fb46be42752eba4bad8d6b008883e2697747ada77635174d5f7abc89157acc61202100cf719c9b8c5bfd7409fa95641202384629b925c240be94889bdf96bdc176e4dd3ad75f7b2e4c2abc9ea8280f07df64a162d016db3a634071944f6468e00aba03255430375660bd2c413a0b3cc530de305948d783afd0a41b4a202fcbbb620d9bd47b1181859b66f922d0b5c464f71ac5682829c8c6f4875bce8c37c5212113cf77a8cf480660b0ad108a0b67c063ed52bba442567ab31b30858cb33584d5422ed7427bf085d163005bf182c90c96cbc89ca70591dd0606f95dc6acfeb3315274f7c4937ae511963e90e6d03646292743a4178a6f344c244194f989e1c34be06a09bd5086c73992da8528caaba4fbef1502c1abb01b145a7a825a971a001055e2b1841725cb06eb23625bc0d99f89c1998023d760db1960a751988529628b6aa54308a3c895688047a003c089ef4a3232fda6aea0194154339b75a0a25402212211f3eeaba98cb656925c34f46037a436f89e01bfe408c138601e3a490675abf367194b377158f131b12740636b92bb5d184c05a23cea0c66519b2e8b094610655699976538471d77bbb3a8613a3ea1ee7b22642d63611b498e302540ca71e9b5c1aad6bbf309a13f9ab5eb57a5670fa9244280867ccc48130c74c50219da3168a26a52001713ee7b81157a6392199fdb4a56631b2d17890e6b0bb82051b9a1c85ce8aa92a2557ffa499c8910f7e98c3b4681ebe6323f4794e3e7324330a710b6a87186c36ff04602fccb97a7842104547264437921b413d52229a1555226a3bb3f090bd8cb09df92f4b4093319c434c04a773acc094bb205062903adc121ff6c178aa5d02f4b401e2b43bd79966d83a014bc8a8fa8347e1a9e8c6947134b837f019b05124279b26f20414fe326f3464929105974a853961a6b55ee90ba8d730be6a51fde90b4c23753bd9728077b90bf1c656c0738946bbbc5a2d72f95d876437c659b1bc663f6ab2b9026ba0401ac168c05933dc0509f7390ce8a024a3a1267217bae20c0d26c9d824182bf67ac60c0b121184a42c89da7a1f2de023ee6c291dea37da360b6f912eb95727e0c83efe0796d603b1c4702b2532af8d34053e1c70f8b73d5874578b3a2a8108b12e603d8cc1637d54bccba48f73d08f63c12fb8bb2e40938456c46209b262d8f08fc9b576d463329057a7fcc86652008832712e15e31eba79cb33a58262f822b9b8abbe8c4a025729dbac6f4df64f14c9959993004e0a4398b7c1e049120d404fc2683d65e85cd279b8d9e9595e995631f3469ca25412a54535c569d80c2a09117733f529bfe9a9dc766c8da35bdf0b64d1c27d0fe31ad736c06a92186034468539a3adbbcf0e67af4e797b63a0494cd91d2b9b89f8d486236b9b24772383d81aaed73286e5dc6e35a1dd0121b0a362d8c94022a515340fb2b71b8aaccf14842a6d4ecb713612f801a5044147fb9e6987ad3863759de31e11eafeca9e810796c34e8cfce9d59342884456007b01ddd12edce6d10ed87e4c + +# Official test vector 82, seed: "373fdde922cfc416ed96b444e445bdd0962e8989f6c50adf9912a89937c57217d3600b06c95440448e3f601ae69ca5be" +seed: 2478f7d3de6041e7e5cd11c5e2ef483d1aa6218eb126444091535f6ae532fa7311136e2681df2ef881b51a092a9badbe72c9772c169808521c47149578621e28 +public_key: 86335a761609caf862810ba70e00c83da3cc1c208cd893233c8ac3247b013417cecd467e9cb87280aa13b061bd0a661034ebabe9ab6e7a447c2826af3cba6798270a36f7431ae9119de2245704110d159aa438a6f1546a39286a7a179c5f286073d5b944ea2000ab61fcb9373a4a94dba5c9baa94056f35ca1810106f2ce65b579c4744f94955db4730265053b812634eb5156ea819069f6371040408a2036019967f4163c1ea611c02ba295a51581644dab07872d1a5b21a32d0ffa349e3739d961a9e9bc07b6d8cba3b945be491958813600e781ecf54912d70e37832e05784c5e12271a5aa5d628233062305a28493bc2b180d802423aa4f75cb6610c16e8798cec72253798b189eb217238b5d063224f78114715818ac4ab40d34042860bee445fa9b1b02dd5a7c7b6bd8b03768e7c38282806e5fc7a93a9094246a403111a39bbb89ca4ca33f9b381fc8d6447450d3b4f6c794b565b2735f8014fe35e78a94780bc1557bb380db47d25791b1283094ce08ae4ea9961882d134bc5579aa9fb44127e2670b85001d58a162e38680d3c8fd2d3517cd4b36aba9bf1930f3d4c067f2a5b4dd702cb9b9e138bbfa91c0f49a86ba283091350a2ab3c1f3c75ca20a4a160318cf88849ef2102e47211df95a2fa325573f60ee7ec5e70d3b88d291cf9110b9906401968462d2ace979a825b088f7c2b330fbb5f15b1b9f24b84a646cc6a9b27b03767978268cba750b5429823e7ad3a00a4e813052011bb0f47cbac838a489c568391c7d05457f4033814bb9d52a011ce787f0df2ab1bc885e293bf23900f3fa019238b7447561eb85b296930232b175379f289982312790bb65743cfe65017be280063c19b033c19eb988d5a827b64777eb8b13244a9b6763c63523a6af78672b652ac38f33f2a870c494b1dd34a9af239556ed9412a48a7b3501daaaaa976daa971c1565f37be80c33fd3126c7bb3aa09f47f4c9c503e2677325418ecd2058fc7518fc247b36c0c8f59427bd2311ca493510794cdb734cdf69c6b1a9d5c990424d819f35ccc8750b4750c43394605bb60b7c4dc39d8f71dfdf1c6da319f6d671aa170065102086665707b95ca4d241c26cb4acbe928d23318d372aead3a99bbd075b5186abe6590cf5278bf289050c13789f82476620472baaf258c78eeb7755f6c6b1a113d91da945a837f0c84b353f9aa1c223404a3c071a27c84a6ae90d31a0d254234a18656095bf989456cd9aec6a837df6880c9ba79476431929c9b22d9bac09acdd8d94b7a884e261037f1bb5335f98c4c491fece5ae0a485611a50224809d48aac84c16957221924d3c2d6500107e71bab5580339b0832e0292b89a3f25bb40fa0445f2b3122f97856f739aabd568d1b0851b47ac947b25d2da6910d05b44e26088901d487cbdf2f782c2e35193021501b2cd264a6526b4aa6dd439502601fd7b203b088361e6218c1b72854648f4023199e5aaecd51a33990b74e4366c07818efcad158a56ed623f63c20e5ea3c519350cfe16b0dfd3af10a45755641a388590eb95b6e5158ac5bc4aabe686140b981cc5c2ac896945a4be089201b56744c439630b56a15b4a3591acc88f3c4680311c24d80b5725bba86cdd22a3732c6a1bf7cb10f14d57ee8e5901e46b97e63848efdc76368b797d +private_key: e5a906286950db6187780184cc302f14a9ad2f7a382d93403308b8676c20cccb52347a515303a2bd15336c0b711b3a31e8d0cbdb59bf42633823ac1df61c63633171282b537cd1a19a80160d97b9dba7322d935577031c081a035890be315b7a4275979691b612b764111ba6ac57afa50c29ee436af02131442c5704b585c663935ab698dfbbc882d23fb39c75370b8c199cb0da26be27e8aa6391b5fc30bdf077490bc677d6e631af504b9af2ccf7939536d819455b91ab172cf01639fbd47618b8708f460284abcfe6d21371dc3b00e579aff432c9417d33511d9a0170baa0a3695004edb18599118146d83ea548ccb0069a3379430dcc8e3d728eaea7433ed4a704987624d0994d454374f9218b2a08ec20b2b216482a1c820e8c5ce99413dd590bb042c9d294ad98408c407b88cf6b32bfe9b95f9a9d45a33184cc8b79cbbfb379639c9b44a128c211e700a59aa4ee034e1a3375dd216ec3e2447757c70a0b4ecb6b1677755c327914cc38b425925f9f910f4f618cfd425e5f55c4955b14b08c64f976068daa8e711a3d00ed0e47e222f201891f6c7c52f282a4d471cc199e68fb9bb8bc81766a457a6ababe254c4aa96546b96f56375e68c9a713072c5ca9b0d0d36b1f1b663613075e62071f97c6c2ab44e98a76dc767fe1c0789ef155bcc976cf1b879f1a151606b996225abf147e7cccb615243e0d0775e339c909e93477b9b66fb863e726a4f231cbb98435368abed797a00db8b4dea236e75673ad8b857206d03c50b0767961f67ba0b58a668a02680f57372cc8c175c6cac858497eabbb840a5d87389c7a623fa5707353438e7a4388a1c34236294370343f90c9b38f4ac28d187bbab21c3d656c4eda62dd8127771c8038b67c80d58edcf81f526344c48b29f73a5197b0b51fc29d19396b8b7295bf524d38371c71013263c95694138a27fb56670101b0f06f6b568b4c05c486043f53c44f321a9bd8827312e5537608b5a2d7123971081e8bb7a05ab1336a2b7eb487359bc8287c42add6b72e5635e9ea9455552eaee4c92812ac32e254a90669cf6728af07763fa3ba74ec0e1c8090f2706378bca30fa69c85e50a03e8326ea4917b6515fb887d3601c83c5b4f520804cd401d0c67cf229299cee141da094a5f117403f94465c62761ea05ed1016759c60b14c352b41c8ea619e5bcb167a851ef8842845abb4f7a6ad75fb610408324ea84c665b36672b5e58f985c3a45bb3f926f5c82d16d519303271ac83368d28b2dba2083350b6205c718e2bb4aa1518fcc3c76a9b02d678732b4bcb8dd4cd9c2526fa919ad5c9bca0c6171c1a7547772c957b74dcf877b1f62921c7a17a7a8382b81f44f2a6cf559b761bb58fe8031539c02bb3222332513921411c894819a2ae856b65c1c3b113b09a6ab06ad6033bd79227aeb397d90ab3cf5985bab7c826931184642ae25755f79667aee64918575118349ac0b19963549c17f71ee14944f98b5eed708b2aea5a305458f699505083bf54ec70b80ca1287715ac2046edea5ed722ab14fb8514e67e45343db7c91324357a99db343c735c918464b532aa2d9649d33a1cb38039b176bdf69470f1a1839562b94b3b7294a77c72cc5686335a761609caf862810ba70e00c83da3cc1c208cd893233c8ac3247b013417cecd467e9cb87280aa13b061bd0a661034ebabe9ab6e7a447c2826af3cba6798270a36f7431ae9119de2245704110d159aa438a6f1546a39286a7a179c5f286073d5b944ea2000ab61fcb9373a4a94dba5c9baa94056f35ca1810106f2ce65b579c4744f94955db4730265053b812634eb5156ea819069f6371040408a2036019967f4163c1ea611c02ba295a51581644dab07872d1a5b21a32d0ffa349e3739d961a9e9bc07b6d8cba3b945be491958813600e781ecf54912d70e37832e05784c5e12271a5aa5d628233062305a28493bc2b180d802423aa4f75cb6610c16e8798cec72253798b189eb217238b5d063224f78114715818ac4ab40d34042860bee445fa9b1b02dd5a7c7b6bd8b03768e7c38282806e5fc7a93a9094246a403111a39bbb89ca4ca33f9b381fc8d6447450d3b4f6c794b565b2735f8014fe35e78a94780bc1557bb380db47d25791b1283094ce08ae4ea9961882d134bc5579aa9fb44127e2670b85001d58a162e38680d3c8fd2d3517cd4b36aba9bf1930f3d4c067f2a5b4dd702cb9b9e138bbfa91c0f49a86ba283091350a2ab3c1f3c75ca20a4a160318cf88849ef2102e47211df95a2fa325573f60ee7ec5e70d3b88d291cf9110b9906401968462d2ace979a825b088f7c2b330fbb5f15b1b9f24b84a646cc6a9b27b03767978268cba750b5429823e7ad3a00a4e813052011bb0f47cbac838a489c568391c7d05457f4033814bb9d52a011ce787f0df2ab1bc885e293bf23900f3fa019238b7447561eb85b296930232b175379f289982312790bb65743cfe65017be280063c19b033c19eb988d5a827b64777eb8b13244a9b6763c63523a6af78672b652ac38f33f2a870c494b1dd34a9af239556ed9412a48a7b3501daaaaa976daa971c1565f37be80c33fd3126c7bb3aa09f47f4c9c503e2677325418ecd2058fc7518fc247b36c0c8f59427bd2311ca493510794cdb734cdf69c6b1a9d5c990424d819f35ccc8750b4750c43394605bb60b7c4dc39d8f71dfdf1c6da319f6d671aa170065102086665707b95ca4d241c26cb4acbe928d23318d372aead3a99bbd075b5186abe6590cf5278bf289050c13789f82476620472baaf258c78eeb7755f6c6b1a113d91da945a837f0c84b353f9aa1c223404a3c071a27c84a6ae90d31a0d254234a18656095bf989456cd9aec6a837df6880c9ba79476431929c9b22d9bac09acdd8d94b7a884e261037f1bb5335f98c4c491fece5ae0a485611a50224809d48aac84c16957221924d3c2d6500107e71bab5580339b0832e0292b89a3f25bb40fa0445f2b3122f97856f739aabd568d1b0851b47ac947b25d2da6910d05b44e26088901d487cbdf2f782c2e35193021501b2cd264a6526b4aa6dd439502601fd7b203b088361e6218c1b72854648f4023199e5aaecd51a33990b74e4366c07818efcad158a56ed623f63c20e5ea3c519350cfe16b0dfd3af10a45755641a388590eb95b6e5158ac5bc4aabe686140b981cc5c2ac896945a4be089201b56744c439630b56a15b4a3591acc88f3c4680311c24d80b5725bba86cdd22a3732c6a1bf7cb10f14d57ee8e5901e46b97e63848efdc76368b797da13cb3f23ccbd9ca6a75823d1ba14ef03664560f397133935103ded2d7480b9911136e2681df2ef881b51a092a9badbe72c9772c169808521c47149578621e28 + +# Official test vector 83, seed: "16bef67f7ac3a755c59c816478b75fcc16ce5844db537791accd1ebd49d2824b105fd2e970f728c8f0cf16e439a9ae2f" +seed: 9d405d3ebdaf35fa8722de431b669722acaaea2fd10b814310b17f78b66147d16ceb14f7662be0c42779459f69a145c0e2ce9f0bd9a0cd1bf32ed5694cc9ae32 +public_key: a4b21fef3306a34117e05c4f4736af0e8cc5ae6bc3f294188ae5397ef69f26303f9592a694e12916bb56e5aa43cef5c183e6ce00f78ef423c3a838ad2cd3c4f68c142eb23dd5f774054668eff212b2bbaf8274c7ad10cfcec5b10bb603ec6ab33c963ad2a22b23f7412f93715a3b0be0b1754ef383c2d52a5a16a22632c88a9635af81909d347e64715806f93e0aa26756b25a8f5984f8e298abc12be53850b83213960428562455d6a7bceef90355318b5bc78734864d1af0bf1393849ad715c711a5226065586b80f1357d961a9ba74999c8f47c7583675245749bc56152f1428910324f2706c8718208c4a13158360365337642279f5009ea86197109b78f0a037cc298f3085c46f68aab45379cf59cd504a9461b47268ba03fc7cf7b1aaf9d461bfb3a7e68b396419a44bd56462e7aa2bd82223a09c155d26dff3873a6052472d6796e24bb7daa3583711cc435a9b3d3463812734b700614396a6dac3c2d838ac103d04239c847241835768a2bcc3d6f8567f6c998b4e7ca8d30a81582686f211936087d3db54972615d4a9b0e1ab1765a18c753fb9513d097322154ea4a3f934c8fff8520af32ab05f26d1030888c0a1613ca74164793b5f798ee3c589684bfb115cd6740bdd5141f1a17393b191550192feeb3c8d2c0b4c37790091312fab615c6d194f076c49d01cb97190ed9d4a6bfe0957047933e2835353085ef611c6f9c1f86dc4366c45cbe2281b0910ae39aacb271c03260648f7c955e99367d1b130c85289d586272fa28807ccd909185dbd5999af47f79da95ccc4859e8a84b2983f0e9693b1dcb506d7b7aaf03f158759b8006511380b3aa4b46cd060f96c0e16060161698f26e073c2f74e9c5b31f9fb4df5dc0f3b0773470bbfb95135c39199f6f281280480ae88573284c44ab9b91f8942ad423783263927c5857d5832a6e1576c6a59e7b1a498ac2f5f71c51b4c9a36cc4d28c042dea588a4756740782b07cc245a069d42245943977780f11eac0c8221f9938fb05a5d096401d2a4bea8c9f46564af831c907c4fef6743ee482339212bea730113a930c0a5649951abba2c6a3afcc4738580c61a4730aac4dc3c84dea158365cc6c760b13ea10b194b2539a55da5f01ef6c55213815fc6479f1bbb67d5754161d4064ed1247aac8edc486a8ca1b311fc653da3be4fac0c81ac0fa54b99030ac2f824598ecc699a31973ffb34648183cce8cfe6495723975c7ed7cbc5281811462cc1ac48fd9c5ca3da126b8125179b651a95b7749bcf711a018eaa951cc078aff16bde9a2f5b180ebee3032b5b2826ec83af147af8288470b267a97c5ab0244d3fe538e986000de3807132937a811de5228bfdba209e642fa3095045266e11f46e99f1b1eae584dcb8805d7455d3435956cb1679b8afe26ccfa7224736998aed363c0d82b1d23b339a16abb5e60dd447bd78c80e6657bffef9bceb18a0c8e602936ba32d24871d6470c338921366a009fbade8f4ab940bbd22158ac5201f09157d0c010825b290581b4108573e720acaf53344fb876db0bbba53d14a26dab409f137535a794294814e2b3f8f42c09f323e072b2519588342448e24a769af363293f4c8786ba4b70330bb80f37de30dba857dace4b8291ecb2f6ebd5a06323b11a89242da833741e9c4 +private_key: 2556bbc99ca8edb774f8b427981046c94cc902f20c2c9b1eed7555f800aeae621cd247555b383508a8a601720695b5469f21627e0aa9c7185557718de0a16b920454a642152c779be09307dcd0aa6fd97909e7227ecb7db209aacadb7d1bf5ae03cb2d14517861b2be3e0936b47b7cdd488e22956b7de9ca14b52e848c90fad497f6d1bdb42c799d8a9b51f0c9a3e3835181a2d3ccbbd95785e1e3930b410f955a311fa69ae39b9a240c50c221c61d687853658c611717eafc14f8a27f8cd190ffd433d9d863c530425da8072e467893c7b621260490f1497f4470b43507161b23729a5db94585a9d9c83a9554127ac9b7252ab4e100d346cbd7a496501979cd0b5317ea39adf970a490aa9f2b7e4ea8122900c1c882a0cb0162f9256cde1126df07bc4a30042c6587ce0b3102673e405b623416c06f9abd9bc62eb70cb794844a6a428ce8736ba9364882aac621d304b98799aea35287e023290335da841a51e4c1b2063f1198661a0c01315b2602712b47d16b5f2b19baf2a67fb13333dcbec5d9557ba4a2f103097f14be6c276f2a195a57b9b28b312c6967a3334851b075a7c3d2ac74d5897470286aeb4b29982b002d5751528c3ffb488ec4661bd58b275c229bacc62d85b8b8c560a02850ee24aca565ca30168721a182936ca8a6508226d64840903038c339c603233a9046733c0e15e016f6f080414734903bad3393c5671c5edee3cd8db0cc8aaa4927c78d51ab2309b1b053d700280a0bda9a5d268ac47d746ebfe01e6be91264fc6a180c1051a5a87038bce12a4d70930ba259cbf49039c0397845301f307922c763be3bf83fe34147e319082990a45102a1d328a0e90a8e56670577c14ad53426ce36b863e501062a5634034b98da407659b9e8f3a539907d511ace034ca15a91bc8ed3715be3c095b60b8332b6c068663d61781378c9f6d352adf794bab90ffdf330dfc77e492b6ca5bc53de21a81ac93db6b520cf3ab8b4837729f101b992c7057030271b4a7c6a7c61f399a2302155306ed3d8a0336c8081206f6dc09cd8b11bbeb89165321660a217d9f0bc770b2023832deb6492e961184827a2bffa27c13ac42844b3fbc14b0b96946427912432196e95ba949b29265b58fee38b93232afbaabfb1482f2307bda7a3004cf74fafba6c464840ced7bcd38aa764d67bf20a88e9a99549fb66ef1a53d1ec60ed744632c7875299b056c8c9375c6ef4f147ab9c8b1240822afcb68f028d4dc2be9da530c14a552acbac77d914c561c25284a9a4dcca04637048f29a99cab95117881da8404596cd0a28004a47a77f8623b4a2811ac6b90e5069d7dc82c829abc4b14ffe251507bc970f702341e382d9524672f88f33e16814977225659c8c321a0810a523d44190a7947a9b2eeba262fbb16a0ab35100385c238c55601363cc5996fcb46454c142c25046eb507d4f6287630babcf485bc5f19fd99051f12a3e683a7d89b21c2e903136b674bc0b1490d91548394738c417614077897ba9ba577f8ac9b584090d32973b4261c05385788be4b63783728d59cd5539413cdb537826aef3d304e8102c6a3b2e72e4185292c35ab60da55acbe3c6417e179c80f0024ef5113a2c42a4b21fef3306a34117e05c4f4736af0e8cc5ae6bc3f294188ae5397ef69f26303f9592a694e12916bb56e5aa43cef5c183e6ce00f78ef423c3a838ad2cd3c4f68c142eb23dd5f774054668eff212b2bbaf8274c7ad10cfcec5b10bb603ec6ab33c963ad2a22b23f7412f93715a3b0be0b1754ef383c2d52a5a16a22632c88a9635af81909d347e64715806f93e0aa26756b25a8f5984f8e298abc12be53850b83213960428562455d6a7bceef90355318b5bc78734864d1af0bf1393849ad715c711a5226065586b80f1357d961a9ba74999c8f47c7583675245749bc56152f1428910324f2706c8718208c4a13158360365337642279f5009ea86197109b78f0a037cc298f3085c46f68aab45379cf59cd504a9461b47268ba03fc7cf7b1aaf9d461bfb3a7e68b396419a44bd56462e7aa2bd82223a09c155d26dff3873a6052472d6796e24bb7daa3583711cc435a9b3d3463812734b700614396a6dac3c2d838ac103d04239c847241835768a2bcc3d6f8567f6c998b4e7ca8d30a81582686f211936087d3db54972615d4a9b0e1ab1765a18c753fb9513d097322154ea4a3f934c8fff8520af32ab05f26d1030888c0a1613ca74164793b5f798ee3c589684bfb115cd6740bdd5141f1a17393b191550192feeb3c8d2c0b4c37790091312fab615c6d194f076c49d01cb97190ed9d4a6bfe0957047933e2835353085ef611c6f9c1f86dc4366c45cbe2281b0910ae39aacb271c03260648f7c955e99367d1b130c85289d586272fa28807ccd909185dbd5999af47f79da95ccc4859e8a84b2983f0e9693b1dcb506d7b7aaf03f158759b8006511380b3aa4b46cd060f96c0e16060161698f26e073c2f74e9c5b31f9fb4df5dc0f3b0773470bbfb95135c39199f6f281280480ae88573284c44ab9b91f8942ad423783263927c5857d5832a6e1576c6a59e7b1a498ac2f5f71c51b4c9a36cc4d28c042dea588a4756740782b07cc245a069d42245943977780f11eac0c8221f9938fb05a5d096401d2a4bea8c9f46564af831c907c4fef6743ee482339212bea730113a930c0a5649951abba2c6a3afcc4738580c61a4730aac4dc3c84dea158365cc6c760b13ea10b194b2539a55da5f01ef6c55213815fc6479f1bbb67d5754161d4064ed1247aac8edc486a8ca1b311fc653da3be4fac0c81ac0fa54b99030ac2f824598ecc699a31973ffb34648183cce8cfe6495723975c7ed7cbc5281811462cc1ac48fd9c5ca3da126b8125179b651a95b7749bcf711a018eaa951cc078aff16bde9a2f5b180ebee3032b5b2826ec83af147af8288470b267a97c5ab0244d3fe538e986000de3807132937a811de5228bfdba209e642fa3095045266e11f46e99f1b1eae584dcb8805d7455d3435956cb1679b8afe26ccfa7224736998aed363c0d82b1d23b339a16abb5e60dd447bd78c80e6657bffef9bceb18a0c8e602936ba32d24871d6470c338921366a009fbade8f4ab940bbd22158ac5201f09157d0c010825b290581b4108573e720acaf53344fb876db0bbba53d14a26dab409f137535a794294814e2b3f8f42c09f323e072b2519588342448e24a769af363293f4c8786ba4b70330bb80f37de30dba857dace4b8291ecb2f6ebd5a06323b11a89242da833741e9c468302cc5af214ceda67ff8161b29bc300c4be8e1a4139437aead8a9ede3cd4ca6ceb14f7662be0c42779459f69a145c0e2ce9f0bd9a0cd1bf32ed5694cc9ae32 + +# Official test vector 84, seed: "d0611f9ae5be4da5d7eadc9109944348e716cb3daee545721eea8c892e7831cf2e54603146454cbfd92387739e9a78d8" +seed: 9a86490f0615f3edf789cb0654066e9ee339cc59f968281f3b89213f83c692edfaeb2ef44d2f608621e831187ce79b2d2f4a20f1568bbe76b0d3d5af36111714 +public_key: 2e248784527ec73160954a18dab4986fd146767bac1506885a7abbaf203fa7923cf3644b146a7687dc0f56329e3c64b052db6c14e3211cc560d9a70a1ba641224b2eb8e70e44b25b4b346f3037454aa69744d1777498c98ce741ac1008461868839b4149135b41817d135060acecca5af744e982142de574ecac5f1432a7d907628eb75439d8af02d37e5181681f1b249bcb22d52961d20458c860ceb3175730acb9b8c8500dc258fec13677f40506bc76f8eb31cc91a605e905ee839c3e0b771c32595a3238acc079fe6034769652e5cb492da0a3e8c0cdf13c899cd5838bb46a27e343bc62ccb6294c1619af96817d77ebc2e1431f997566485327cb9331a262153cd31c80d939d473b81feb0910e027b02c29cfd66fbed3cd09c11fa08744b9e0b62dc3093c2552bc7a770a0550cd601b2e6559851bbb5d8665865555ae510c2df9637c07790639c0af6b4bdbd567b704c267e6abf2b371f580686a1910bcc02b7ec3c08a7aca3fd121cda343a61c6c995742159cce5503b4996a7a6fab9e8dd5713bf62f3c0792628ab621741034208ca01c6130d3a3499a186fd69db4b3cb77417a12992e8e448fb75b73f4ca54fda42b2df2a4f9e14c39424bd1592b90968434eb8f52a6a1438cb7e589740c8b9b2b6123600b28ee954cf0d18dab1bb3fec8a0ff6379a4313325c7011f4c7fead33c8fb543c3c90b6ab35e01e31e2dd4262bcc92ba11ba055295b3f2a273620576813232876d1e9b18e22639e9c3759eb460390bcced9bb0e368c6cad846767c69349c59fde27405d8ccc900ac2ed762b1ab6381eac33f14aa27c047e5a63921030f8ee7055df00f7cd353bdc1487fc0875746b9deaca76fbc70ef5925ebbb994833a7eed732235b06e6ec6b28217c7d9a86a5396c80d43c22c56c19570238c70e7a7c2b6a77bca45785ccc31d8a880be379b05e45a1b9a8b3b2520826f888a8a025e28abcc4320bd1e30fdd17cbb3018a7a784534379c46639a21227d279b61da608bdf9bb9304b322f103a6a762db152548f192534a94df0ba1b2c97b9af8202dfc646a84270400cbeca95aada593d8f4719abb6cd4a4699787b92d63279fe9bacc0a989a59cb0ad279a567b8ca9536e8107aa7b81b2bf7730b9f4a470c8170655a0842602bc4610f9e7bbdc6acfbdc4732e4266083c9c91d41ed1f2422822acd01bab34c4789a63a700a5a135d65495841e69ca2f5334cbb1fc4c7d42b0f53bb63f888146163a51759c43349377ca824b32091e9b9c30e025981b82cd23aeb5385be7f398aa5025e87b605827328ebb32d6682896298f652243ebb3b8a6f759db824d3f577cfb8aa04627a80a03804039478abc2a627779d1c87fb23453ca254fb51c629f17c1edc8cd8c71aafa135051320f81c65b06711282ec6e7e4b021eeac0c3fc7ceb4b192897899f6c145f53bfa2d68a5b583002667d101a9c7e721f0da0711ca79df954126d9199fd6351be89225cc52d6be5c906860f6ac81c56477cd34c94ee43b920eb6cb62bcf27e5669f9160f0eb2ce7389b8da47cf8b22f46452961457dc39c54fde66a41f95cee1ba87682ca6342ab76f6bc262632282a22293ba7be9cc567700b5c13ac19f126b16a43bae7e4af067d280590ff759d4c3a502ab563080dbfe1df14ac06d254fc +private_key: 76c9ab126b3d022c31745279f6e684083a496be39aee74bb599a8b6de9940a26535a2600d3ca572edbcc37d721b7614824a123b4c6c8a01a0568b8ab61045c3339ad02e68f16d16c17ac572f9ba77d279d38636c9134c501b7c00518bd0e3293fa3a1612d16488c7bcc4cca7fcb5595191cf0d43c2974c0d8551a72d252896a8baa7740c419a1270e6b7145b053ff828344b30d5c18be9f2c633799970c44bc49c2c485921b96ba685ac1bd9a914bfa026a35bc1eec70b8562c9d825a4c7d5a60470c61244c88681af5804b587141dbf72bcbf7604a0705d655b00b89b9045c0a291a355ce68a07f79847a181401c028590788b7a2c3d95b84f13993da06556a240b16887b78e43c310928459312f196bb04a7bee1e0969d72264db1ba0fdbb54ed8c49c3bccdc44a9d4605db677002a0cc84402968cc7759743bf2ab97f0a4a67d95b93a5c7c51ff91201676394e69acc8aa6c88c17535cabb8dc07acdb239b848a8bd88ed0430e3381a6a92b9ddf04955dd06e01717f9036920ddcb33e017fa3103cdcb955b3958347a162f0db95a3b2377c4c6027353266a91876f698ee53787dd73bb9978c7984713deb0017fa1df2b10feef4c7ae5734ecd7ce2b043793b1a19655950799243eb493eac103fe0a174d67b728b7097dec31bf1188813b16c1129a27669fc557c0dea7bdef1303ad98b81e8665ffb009fe5440478267ab2310a34c3f11c88ef8fa5736b91cb2972d1ba772aed1b9fef64af7e547bee627fd9232cec559d4ccb36e8702379231ee5a604cdbaa53db415e0588958321709cce82748fdbc257535584d8d89dbd7cc2d857ce3ab498c31b74fa305d8b145184a906b89a28a82b071d8bc4c52623c306766a150606b63021919759c76102503c03478dcdd7cddf71042173c91c70682ae684fb488f6378678ad114d8e6c625087741e868f1176cd09721e9812d7bf5c63e21974201d0f2844959c898581994ab664ff6784601268b4589c20b4c9873e49f03856debcc266764339329b327e375406a54a0b4c89439116fab279d6b2b9ad0a09ada94a1d572ade29dff802813699026732c30167480cc2230283801bb2baf3cb3cdf88e18f79852a13269c328a555955dc04733e48582f0768f40168f468c83060d0f1bc735ba197cdbba40dc50cd38c53c2a3481b763935b1071879d77967598b2aa8aa1ad34863a6db84dca6628907723f9891a4434339dbcc19213bec2463c5b37b82bc40821f5a33cc391cba73e3c7aa397c71b6f835c29d70c226628fad2ad7014345098a55502a6bc75003b449786b9534ac31e8b6871c7c98be6ca03a974a0936c4598438bfc953b691771c93b83b87579ddb6bc6f5721e2490fa9e0b36bb26c7607bd4bdc003ac9c2b0f41b7b9b5fbe9432b9d7c164d938b43698271a991d4a234fd1bbb28b07b5b5206fb75b4ee75bb3a28539462c01cbceb619b3e2814e5efc79ecda14462b46782308a5e61c2696b71cf367fa421cafd1c0af5bc6b6a7bf07d3b504c05c57f184700572a777bb0c32c7b82212d6c783d9696e96f11a9af791857526be109141793c7b92823f4b116196b8695c0b00a46d521b49241452331a4edf2a56e0264505c0682e248784527ec73160954a18dab4986fd146767bac1506885a7abbaf203fa7923cf3644b146a7687dc0f56329e3c64b052db6c14e3211cc560d9a70a1ba641224b2eb8e70e44b25b4b346f3037454aa69744d1777498c98ce741ac1008461868839b4149135b41817d135060acecca5af744e982142de574ecac5f1432a7d907628eb75439d8af02d37e5181681f1b249bcb22d52961d20458c860ceb3175730acb9b8c8500dc258fec13677f40506bc76f8eb31cc91a605e905ee839c3e0b771c32595a3238acc079fe6034769652e5cb492da0a3e8c0cdf13c899cd5838bb46a27e343bc62ccb6294c1619af96817d77ebc2e1431f997566485327cb9331a262153cd31c80d939d473b81feb0910e027b02c29cfd66fbed3cd09c11fa08744b9e0b62dc3093c2552bc7a770a0550cd601b2e6559851bbb5d8665865555ae510c2df9637c07790639c0af6b4bdbd567b704c267e6abf2b371f580686a1910bcc02b7ec3c08a7aca3fd121cda343a61c6c995742159cce5503b4996a7a6fab9e8dd5713bf62f3c0792628ab621741034208ca01c6130d3a3499a186fd69db4b3cb77417a12992e8e448fb75b73f4ca54fda42b2df2a4f9e14c39424bd1592b90968434eb8f52a6a1438cb7e589740c8b9b2b6123600b28ee954cf0d18dab1bb3fec8a0ff6379a4313325c7011f4c7fead33c8fb543c3c90b6ab35e01e31e2dd4262bcc92ba11ba055295b3f2a273620576813232876d1e9b18e22639e9c3759eb460390bcced9bb0e368c6cad846767c69349c59fde27405d8ccc900ac2ed762b1ab6381eac33f14aa27c047e5a63921030f8ee7055df00f7cd353bdc1487fc0875746b9deaca76fbc70ef5925ebbb994833a7eed732235b06e6ec6b28217c7d9a86a5396c80d43c22c56c19570238c70e7a7c2b6a77bca45785ccc31d8a880be379b05e45a1b9a8b3b2520826f888a8a025e28abcc4320bd1e30fdd17cbb3018a7a784534379c46639a21227d279b61da608bdf9bb9304b322f103a6a762db152548f192534a94df0ba1b2c97b9af8202dfc646a84270400cbeca95aada593d8f4719abb6cd4a4699787b92d63279fe9bacc0a989a59cb0ad279a567b8ca9536e8107aa7b81b2bf7730b9f4a470c8170655a0842602bc4610f9e7bbdc6acfbdc4732e4266083c9c91d41ed1f2422822acd01bab34c4789a63a700a5a135d65495841e69ca2f5334cbb1fc4c7d42b0f53bb63f888146163a51759c43349377ca824b32091e9b9c30e025981b82cd23aeb5385be7f398aa5025e87b605827328ebb32d6682896298f652243ebb3b8a6f759db824d3f577cfb8aa04627a80a03804039478abc2a627779d1c87fb23453ca254fb51c629f17c1edc8cd8c71aafa135051320f81c65b06711282ec6e7e4b021eeac0c3fc7ceb4b192897899f6c145f53bfa2d68a5b583002667d101a9c7e721f0da0711ca79df954126d9199fd6351be89225cc52d6be5c906860f6ac81c56477cd34c94ee43b920eb6cb62bcf27e5669f9160f0eb2ce7389b8da47cf8b22f46452961457dc39c54fde66a41f95cee1ba87682ca6342ab76f6bc262632282a22293ba7be9cc567700b5c13ac19f126b16a43bae7e4af067d280590ff759d4c3a502ab563080dbfe1df14ac06d254fc149ca4d94813f81c792060502e09a88ea694c5de863ce6a50516cacb1c3f44bcfaeb2ef44d2f608621e831187ce79b2d2f4a20f1568bbe76b0d3d5af36111714 + +# Official test vector 85, seed: "fbc38d7614d7718e931edb850d2c6f0c5eea9ee889b3e25bd69ac255d5b91e885d93e808e66bf9c88c655dc594da5792" +seed: 6dfd9b575872560c7bdc2732c4a28dac4db04e535eb8e402c3dffd145c09ce47a2985c1c4d203778597947d710dec806e36b0cd949fe460ef141213bfc525e5b +public_key: 0055afab2b0f8c4481d2316c876607a02b744637928897c26c1c5762524f42a00b27d4ab7c198334a13750b8bee321cf5021cbe4536246a0879890ce6f042de3955e373c113d7c2e2df360a8fb5c76fa7f1f594b64b562d0c3b524756b2f94667de31f9a67aefeca35d6641d17d167d6d955d6bcc1709297c9277cf614423b212e96281f6100074d2c2209f976df6332285b3c412a8f618c5b5175302952366a5c67462b07fb74cecc5726ca861e47d4c599819d26329568c139ecd31b22ccac2901d0bd347ba5f10a51b69dbbbca90b574405d8c0600617e682bf81472018284a70982773434d07286b319ca4e3fa6b24b25171093cefa559aa33ad3a0336a1a18205a07ec4463511d3be9ce0b05944819b9647ffd94337c94b7831694ba31cbf8c7af238c21dc1060799c09bb8aae0a084cab07c3bb8502275398e05058b142794309e3bb287fa32a016f46e9feb9115f09a313970293b25e7d25c4abb623c1959d6246d7e00ba79068ea03963d9598fb2b04879c3379397b086960c0d896e419ca5f7667264e1907102329474867cf43a426b1e117826ca542cce64adcbe154f36637de2cbdbdd6c1ad7794a0c18fa339993e873ea54c3f92a68afe0445305bc97b76c61b3bc693e30b2a2b18a6cc28add35cdcf601554b17df39998516549b823ae1596d2a88acb9433433926af62263deb704a561b2f2397381228fc5b15bd93c3911db634b19cd7217508e328113d565b475393d95c7abe5a94fd6c1cc1283587b97db55109a08b1ae1060cecbb15675a253ea154ee19aa9ec29ec33400e4946b89b5b1b4ccd41362a3cc75808408f50ca8662b236f1830656a432e2193bc4f09ad1fc6a82252174a6530b3b078808c8798c9e110820c295797580a74572adb025cc31c75017468cae17c697a79df023aa250c827c11a1491944b9d6156d24b1f0f53c12a1aaa5946bda21485cd18aac0034de843489b7cae9ea90197cc471444067d01f873175693224c5368e3f3220ae48832c0928e65195510b5d4eba93dd3b217b79481aebc34f2123ce42c0aba83ece60034ecbc0ec4420de32851a998207f770f3e2bf94b047779b6187e083f7e04458c243d9125dd1641ec413ccf0a02811ab65d7d954bf4cc0cae00c384889d1b23405419180ec83d9ccc170e0bd6bca3e2682bf3471024445329a515456175ef6c167da459da6f3439dab20fb28bfb9764d5d9b9af055b442399361e91f84965fbcb31a4db147cf5cbd37b955fa3b0a34b78f8f4b2cf584c1f3646b5d7887a99b3847ba9010a69c89f52653c2c4fd2a6cbcec2d00392a1aa44ddad605d8e1595d2ba305cbc86b24a47725810a761c45c6cd0177262b2c85beabc07f5086ea31bd443889ae657c9528abb2769edc8cc74bc80943f92e88402ec231823e15112ff5624c982be7669010e31ac9494334488105eb88658339db648f30b3a08b7a7b5bd1113a83055f673a8fd6ca10cb4ce3c32645fc42ed24420b222d512c68651a0b99875ef8e913b984c709221228e51bd2c2407cd49a06e83f7f12c15d33b0252937f857beaf9ba79045cba8264d7706270d4787f6ecb8922582b7321c26da7813eb1c61a80038289cc84a923e03d7ae3cb232d5e0c1e7715d7b305d86d34fe89069774bf4339a1249be49b1 +private_key: 672a64b0079b3b7c18878338aee97b73d9ad10231709a4547941c0c5c1a6297367bce3b5d68b929f611c5ba26f39b199ca2a82bec9ad6318be48d75f9ec7cae3eb4d1732b8eb9a742216723b4bacea934113054af3cc752201859ddc1a990680fb573efc845a85dcab5c352dc701a45e5804a819644037bd095615e7389c2bbc49cb9bcf192b072b539d93fb993bb73f5f3b1549b13e5f90c8aa82991384b310bca58183116fa964dc1cc15c933dd9604ba6cb83c694132c628ac0901c5fdc45c808c2d06947008515ca95c77b486b1db3406665b0201498f721588335c55d2366eb7867ab2a8debc248df0caa3e637643455f7ce625f9f0b43c8787fad449f9214f78551f9556272f7a7040687eb185521a1a576f201373c61840b346d91b94ffca34df0045cfa4b5364432c7e2344a837d3c09c21ca23a957038d8eb30dc91cd9b25837155663b923b6f6766a4555475b04d74f350cb2640cc07cce818609033a8730b0e7c234d9b8b4f7d77cdc095c11e0c8ef16b3eb63c06f72514b57501dcf04ddc162096b99e6b1036ee0118975932041a5d5ef118e62b0429d4117d89b72924afd97770fcacaf9bf92824b9ada2674dd4ac40dc8471ace7102d13058a740246010a685b9814216a295538dec1a9289473aeab46c6e3cdff4335dec9055c5baa481918bcfb0a63cb7e62123e19f1939c1030ee95709dea6844fb978410989ae9b2666984e38062a1d066fb91b362120c7f3bb5488628376b1c827b50fb11b3e4a630c52a32d5a40e671ba0e99269ef09bf1eab049ca04ecfbbc213b74ac06aa790a85757a9be1c852199e7ca0ada5e07e7ccf352b3f3307631e30c604bba95d8aedbc44d12f73e7f51b4b8537e5db967d2738e3a13a33149c00ed24560753f34b85b85c535ce644b15e046b104b23b3c51562c47dbc92f2b44ad0f1890f98044ff3092498416996886c55cbe1812aecc6aa3d08a4f89c62708495eccf13c02a6b2b202732888297b3aca8861bba2e1cad6e7658686ce07da3580232b5b75c61ae1ae72a344293855f47a3aad11c4b716c211128091065a07439a40abaf2d62c674d40a6b1468b61ac2e22acccf25c0783b5cdfc60a47131f0bc6133c55b92e246b9c722ef680bc0ca12c7dc1c46128863507781937b9e02b5355d2b8399c31b6a80ec1137e5fe9ae01d980e0ca647a7b3678006c678147529a32df269dcc378416b14d61b240c4742247bc1b77eb905c6889fa022910a974f262733ee14b75b302e5148063e5ccf3984d073410bcd9096c38aa99c14dcf69aaa3fb32282352fb4a315b736774558753d7a1615c9fd5d30904e1186162a2dacc96003841934a40dd604983979838fb5382fa6dee1a4cdf3063326503ed665fe3ea84953b522872c36e7888864a0e55f3466bf20db1263cc0fa91660561c6f3171f45c2bd5652c95359e0150988f58ab5f69232008b62114195f570a3dc9c916073373540538a56e22b4dba234eb315bc15b3c89ab64a9962282e3c20baa7aa540c8273b83a39815131d24e3643353e5a4df3e986abea49bcb2b96be28a6c4998ce24278652c59f0c5e6c39a52a7269bc769dc6e3b75bd34e7be7c4f86a93506b0510310c0055afab2b0f8c4481d2316c876607a02b744637928897c26c1c5762524f42a00b27d4ab7c198334a13750b8bee321cf5021cbe4536246a0879890ce6f042de3955e373c113d7c2e2df360a8fb5c76fa7f1f594b64b562d0c3b524756b2f94667de31f9a67aefeca35d6641d17d167d6d955d6bcc1709297c9277cf614423b212e96281f6100074d2c2209f976df6332285b3c412a8f618c5b5175302952366a5c67462b07fb74cecc5726ca861e47d4c599819d26329568c139ecd31b22ccac2901d0bd347ba5f10a51b69dbbbca90b574405d8c0600617e682bf81472018284a70982773434d07286b319ca4e3fa6b24b25171093cefa559aa33ad3a0336a1a18205a07ec4463511d3be9ce0b05944819b9647ffd94337c94b7831694ba31cbf8c7af238c21dc1060799c09bb8aae0a084cab07c3bb8502275398e05058b142794309e3bb287fa32a016f46e9feb9115f09a313970293b25e7d25c4abb623c1959d6246d7e00ba79068ea03963d9598fb2b04879c3379397b086960c0d896e419ca5f7667264e1907102329474867cf43a426b1e117826ca542cce64adcbe154f36637de2cbdbdd6c1ad7794a0c18fa339993e873ea54c3f92a68afe0445305bc97b76c61b3bc693e30b2a2b18a6cc28add35cdcf601554b17df39998516549b823ae1596d2a88acb9433433926af62263deb704a561b2f2397381228fc5b15bd93c3911db634b19cd7217508e328113d565b475393d95c7abe5a94fd6c1cc1283587b97db55109a08b1ae1060cecbb15675a253ea154ee19aa9ec29ec33400e4946b89b5b1b4ccd41362a3cc75808408f50ca8662b236f1830656a432e2193bc4f09ad1fc6a82252174a6530b3b078808c8798c9e110820c295797580a74572adb025cc31c75017468cae17c697a79df023aa250c827c11a1491944b9d6156d24b1f0f53c12a1aaa5946bda21485cd18aac0034de843489b7cae9ea90197cc471444067d01f873175693224c5368e3f3220ae48832c0928e65195510b5d4eba93dd3b217b79481aebc34f2123ce42c0aba83ece60034ecbc0ec4420de32851a998207f770f3e2bf94b047779b6187e083f7e04458c243d9125dd1641ec413ccf0a02811ab65d7d954bf4cc0cae00c384889d1b23405419180ec83d9ccc170e0bd6bca3e2682bf3471024445329a515456175ef6c167da459da6f3439dab20fb28bfb9764d5d9b9af055b442399361e91f84965fbcb31a4db147cf5cbd37b955fa3b0a34b78f8f4b2cf584c1f3646b5d7887a99b3847ba9010a69c89f52653c2c4fd2a6cbcec2d00392a1aa44ddad605d8e1595d2ba305cbc86b24a47725810a761c45c6cd0177262b2c85beabc07f5086ea31bd443889ae657c9528abb2769edc8cc74bc80943f92e88402ec231823e15112ff5624c982be7669010e31ac9494334488105eb88658339db648f30b3a08b7a7b5bd1113a83055f673a8fd6ca10cb4ce3c32645fc42ed24420b222d512c68651a0b99875ef8e913b984c709221228e51bd2c2407cd49a06e83f7f12c15d33b0252937f857beaf9ba79045cba8264d7706270d4787f6ecb8922582b7321c26da7813eb1c61a80038289cc84a923e03d7ae3cb232d5e0c1e7715d7b305d86d34fe89069774bf4339a1249be49b1e5c52e639e5acd0fb97c7eb44df56df5250c6de7d171c467ce6887eaa4ee3d61a2985c1c4d203778597947d710dec806e36b0cd949fe460ef141213bfc525e5b + +# Official test vector 86, seed: "1722219cb5db47374eb0af0232c856a57f026f1cb09e5a5799f4c333dd422ff6a0a67c4da502faae727fb2d45dafcf35" +seed: 6fca9f4e384d8418075cc064c70730801bdb8249899d456a77130d5beeb3662cce7683f8a03d3cf04e46970ff7d6a12494ae12558346dfc8fd9370bf944a0102 +public_key: c1cc248a969a9deb8ba9c43e80799f3e287b4263bda1a1055d152be8c84a4df5447b43295d0ba65d2a9b2d15a3b139507a3c2a44965e68e7caa4d9aeb4f67ced404305c81782ca49656775e10aa531f01c66793e198092e2b538df264818e7afdc94ab3cda837164cbaeec93fe2b8b59397482f084af51976bb6161c026761a22dd5a26457c648ed0817ff0a45fbc8c7e0e6c45767b7a720997ca60453785b73a43522979d06b365481a54e8124e9f4274950315faa27f5f8c50699164414398d72321a9d5c2181338de5187baa2c0c5097bfbc72945b15406eb1e88caa3ff92886a6a4fe2c8794700211ac32e1968643ae5a6c3aa309433cab3e48aa93a560fd18550f19831f6c74e811b8be5771244954da635a2fb6c314b9d77f1bf26fab613872d0a2098dff0b060516feea45293e28c0ed088bbfc0165a1906473063e97c5b2825100116793fb1dfc9447fe3227d96bc5e999cdf1f545c8753e4ab43d211c80ba9646e86651d928b0c9e64f5c2ca80b99914d878641a53a6a385acaab6d9b5690d11a8ef5a08c35e80c5df91463c76366282543b08c0bc3054ce07c32fc10ae021bdafcb744c20dd131c8d4146f1fbb282250941d8a1cdae68b4c5961a7a437b3251f144586aec15f505aa79305797a16cdf4c89209b02bdaaa0c0d367e2dc7097a9900bac5cf7063c3b2027ab05b204fbc997f333122798670e3488cf4bc64089a15a97f0c0a4ab5680fb9d5a9a815234e158316f31948b80ca33523e2303838d55ea2368b037a607b643ee8b2488ee456273158a3675b56967ce7b4a1bd2c22a91083e474ab9121cfa0f2bd1a24b27aa317c34b968df055deb839ef172ffd0489bc524109aa9897383f9cf0226810b56bc75b699187bbe86d465c7a44b65aa828c40ce76de88cbd6671093ca1689506657cdb6b3cc5a9a0293d16057e700a3bb7623e3ce1c8815b1d17066853b1cd807c0803f9a9fc2b62f637c99535a1733159ff79a863ba9203d57c80f0bbe02052e41004cd42388fdc695d9722bb0147c55510cfb9347127002fa9038f42551fe1656f1c4ba91c47e5fbcc5e83013864209290cf7d901213a26e1fa79aa7576c7c4103cfa01ec6e1459c9aacc449af7d10aca0a4171b284d4473c9af9a84546b03c7d5cea7bc723dc5032157b58431ba9a895d35f89274e827470babba0342567648ba84a51aa5a604b4c36a27c0b2710b2388b53085603cf62d9ea0a6a6864971323ed9e934d7471e65a4915ada5dd1e7482a37517cfa6255782ebc7b789c4a6d2aa746a811c0be90079f138dfcc812adac7c4bd862ddb83cf0d6b74b623b523318bc807163e6c98d777c7ed0628266bd53a29636b601e162466cfb700ed35b0966a7daf32e7dd67aa1c08e7cca8f18fcb7bd3104bb5408637c08eaca654b19523ac0a031b76968d71d9c013501a1350742467970c2813762c1b4219dc904202984cb49b33e91328b0350ad36b4a7650f7505b11b5c6f0520cccf788b87b5aef42b44b567c42555c74f40ce66cc9003730928e859c77099d8149c78588fdf0c347eeb6752b39b755122e715843ed2a859c02a81e7705127a52d53047f973952321d34d4278739c4bab50a5c344011cb196dba2bc5197accd11b3f6e5d57b37115e763177a6910c9866c85ed61c6 +private_key: 0bccbf3cf040d5b87d74815458749aace6c82dc66a6a7672e534a60474b566c4060ec61e23f5aa640245fb2817185b0b4de26ead3744f0373f4172a6095821bb873f34b94733e60dddb312a1ec916dc0c10aca85b65a9407547c133b1cc32205c7362f3e458bbc507ece9c7b13176f877336a7348b4d785c3de0641d000268a37929c254c826bb643117e36a3b28120eb67104d8ea4509536bb0d54d1d11720a31b4e20b14aa57a81f45b3133525d5a49eb1c59e9cb36774421149f734b3b7778e4b3a2ed20e5cd8a56636c100f7a704f5691d0383140a633ffbcbdc5324ff329f46e5afb27070eee32c5008637708a248593ec00884a87231b7c457d969ad8bb44841d5c76a35ab1fc3031e704cff9045f80b3a2b925af1714ff78b25e798218d163b17e154634c1141a39bf9d35aa7cc9bd2a56032032caf8a6c61319d524acdb42b1ffdfa0b6d70673de99972b21e046737b11850dfe62e30c40d2d7c212354ab529477c9345aaf8a0e840b7ba236c7a3ba508dc995e6dc4a80b77b6ce1c26f8ac42304c91c215698829137e446e49414fd91cf7b9034f5301a81cb4d3251a47c64979ea133ea16012b2c48fea9ae3eaa71f53272af878d356447c9fcb163c938225a53119b3cb914bf9b9b8bb40a2b99a6c4b6ab5055288639802df6810a9f28607ff0537b92a640ec4a2f222075ab917dd2bd49fb1debd6435257ac656687ff75bc70f7b62722664da57882fa1b336819d8367466e936a62724ddf9c6cf439d44282645d5b13d84754799ab7170bb13faacea545ec2e52394851c21c01aaa5b31f72247600a25eb05d00443b3b85c3c176450ced12a8f583716a93ec1cb9d8e03436f383a3af0322cca926dfb45554045fa903a5ae8be04bbcaf858a84ec35793aa9d03d3882ad873289a337e37aaad72b912882ad657bdccf82e65ca3e554ac1e16a44d609c62dc71356ac04536b7ed72ab0ffcc9981031f7ec68f7fa6c761d219a8a78fe7d527f82ba81592c89513b47bd41470e7110aca8b85b9042bf9b4f2e29221164bb21a0eaa30a624a285c15c92ffe3630f19c35f02b9b54bc0c2b958c1c088491b990018bb66996bfe868a55f9c000a72264a649e535bc5e5cc86b1079f556947a80a6352c6bae64a97ef3a1bb1b2886fc5e0d284f81534cc3c1a6403b8c2842cc5909bb642343fbbaaa17fa255723055f7644366c7f4744c01427b9d9d1935afcb732ebc6f2f6cfb8a6c492482e7f046b32a232c3d74472ca7cf64490f0f68f4da0b1d81650384a1288f374a2a9c0153805a2709da5d5154f79cfae9a564166c601d75d7fd3a434269497e41ad316adc65cb152148327f86134d085b2b809ce96b16f6c38e4b107a2fa3cf11b0dae7b37c4285f3f9a10e0009fc8cc1459cba60e38222648bd76a8c770282ff5c57b74f393a8d01c0ec05b4169bbf487769de35e4890382b376c030aa67b28a2a3aa4d8cc8ac6d96254dc7911ec48076247dc2db021880975a49b3995854c22b89f3b1b1d4993c43456bb647c8f83ca66d613bf3eb3b7da4a252a0a7e2e61bf82c20efb11a83d1b9d1e087520991636728318602d4f8c5b918763be1c1b1479035b2a52f4a194042a006b483c1cc248a969a9deb8ba9c43e80799f3e287b4263bda1a1055d152be8c84a4df5447b43295d0ba65d2a9b2d15a3b139507a3c2a44965e68e7caa4d9aeb4f67ced404305c81782ca49656775e10aa531f01c66793e198092e2b538df264818e7afdc94ab3cda837164cbaeec93fe2b8b59397482f084af51976bb6161c026761a22dd5a26457c648ed0817ff0a45fbc8c7e0e6c45767b7a720997ca60453785b73a43522979d06b365481a54e8124e9f4274950315faa27f5f8c50699164414398d72321a9d5c2181338de5187baa2c0c5097bfbc72945b15406eb1e88caa3ff92886a6a4fe2c8794700211ac32e1968643ae5a6c3aa309433cab3e48aa93a560fd18550f19831f6c74e811b8be5771244954da635a2fb6c314b9d77f1bf26fab613872d0a2098dff0b060516feea45293e28c0ed088bbfc0165a1906473063e97c5b2825100116793fb1dfc9447fe3227d96bc5e999cdf1f545c8753e4ab43d211c80ba9646e86651d928b0c9e64f5c2ca80b99914d878641a53a6a385acaab6d9b5690d11a8ef5a08c35e80c5df91463c76366282543b08c0bc3054ce07c32fc10ae021bdafcb744c20dd131c8d4146f1fbb282250941d8a1cdae68b4c5961a7a437b3251f144586aec15f505aa79305797a16cdf4c89209b02bdaaa0c0d367e2dc7097a9900bac5cf7063c3b2027ab05b204fbc997f333122798670e3488cf4bc64089a15a97f0c0a4ab5680fb9d5a9a815234e158316f31948b80ca33523e2303838d55ea2368b037a607b643ee8b2488ee456273158a3675b56967ce7b4a1bd2c22a91083e474ab9121cfa0f2bd1a24b27aa317c34b968df055deb839ef172ffd0489bc524109aa9897383f9cf0226810b56bc75b699187bbe86d465c7a44b65aa828c40ce76de88cbd6671093ca1689506657cdb6b3cc5a9a0293d16057e700a3bb7623e3ce1c8815b1d17066853b1cd807c0803f9a9fc2b62f637c99535a1733159ff79a863ba9203d57c80f0bbe02052e41004cd42388fdc695d9722bb0147c55510cfb9347127002fa9038f42551fe1656f1c4ba91c47e5fbcc5e83013864209290cf7d901213a26e1fa79aa7576c7c4103cfa01ec6e1459c9aacc449af7d10aca0a4171b284d4473c9af9a84546b03c7d5cea7bc723dc5032157b58431ba9a895d35f89274e827470babba0342567648ba84a51aa5a604b4c36a27c0b2710b2388b53085603cf62d9ea0a6a6864971323ed9e934d7471e65a4915ada5dd1e7482a37517cfa6255782ebc7b789c4a6d2aa746a811c0be90079f138dfcc812adac7c4bd862ddb83cf0d6b74b623b523318bc807163e6c98d777c7ed0628266bd53a29636b601e162466cfb700ed35b0966a7daf32e7dd67aa1c08e7cca8f18fcb7bd3104bb5408637c08eaca654b19523ac0a031b76968d71d9c013501a1350742467970c2813762c1b4219dc904202984cb49b33e91328b0350ad36b4a7650f7505b11b5c6f0520cccf788b87b5aef42b44b567c42555c74f40ce66cc9003730928e859c77099d8149c78588fdf0c347eeb6752b39b755122e715843ed2a859c02a81e7705127a52d53047f973952321d34d4278739c4bab50a5c344011cb196dba2bc5197accd11b3f6e5d57b37115e763177a6910c9866c85ed61c69a350302631bd506be010a3f42112ae4ea731d515d80c3a21fcce60cc4d945abce7683f8a03d3cf04e46970ff7d6a12494ae12558346dfc8fd9370bf944a0102 + +# Official test vector 87, seed: "ac139b78fd16ca0f26d6d7f9e15345c888d857b1910cf38d883339b37ead2dcac30f7cf10176f23ff34b4488eb79437c" +seed: e58f71bf175c0550a67e00e0f7b3b7fc36bc2707bf0c93044a492626de36301a7f7054814869cf7625e45647bc1547aff288dbb90699b2ad84893f3b755d9722 +public_key: 33e4a6bf137a2d5c4408040972bbb41342a6f2f97c6bf7b5a05a92ef1c69a3e602f5062b4d651b9af148ebe566059454ae71919226742ac151fec6623bd5531699282cd0651a1bb436d113202aae301a6de6c132dd020cf0235944d0a041f6ad92e404f87432bf3a28035c4f6e236ca6e6b56d924800667f8816839549535f1325ceeb5b0e194b89a5800819215737a40988a43336ceaa914800278944ba54edc65071b63374fb041f07a66d5781ee8492d35221c53495248365cc438b4a65a745a64585242878997853597ce1f45371cb1f97f8638837bee3cab372c024ebe4aa52455283cc2249d82739ea481d685204a61840c856617a210fa431a31b27532b5b0868c2dd0a1e2947aef0575934905ec50c33193c8cbf15c5bb4a89b39c63337b3f4bb3b61b0581fe2362037bcab4c62ee14ac3d8a70486789a6d9641b4a112f1336d7e613b13502de7d1bdd103b6a712bd4c9ab0f5611ba825aa5b344ccaf940c5abc296088893626120b4aa3c73c3e27520b6c6411aa745cd4399bdb627ec584ae3e2a9081c4125cc37f20107f70161975355ae779d74062d4ea062a36a4b63a20e22f3af346a57b37747d3d68a486133857577dc3040342ab2c8a38c9702c66276b5439c82465304f22ca9a316b6c078bbd00a748d9689283aaa0fa584fcb922de15c170412ab5819a18019cc9221533a691503a79c71c43de9453922264ce5994c78a3ce43a1595cb0c761291200b9bdd8b6dd037326e5b40d43717e6507b5f7bbbf71800cc7a1143e7101995ca2c2a06d3a501229a913e3b350cd567e59a03ac54c35a8cb0e4faad7402cf6353a048461649d4171406503d0380f543aae846a21df31c561451fb8707b6f15ae138a8d11b53b4820e97d1293938680546000c7552dea31d4ad50e914cb85935cbcf18821d22b20d309023018a667424ac7aa71532aef2c69c0dc545e3e501e5706bc1c19b5179bd4c4ab22dccc9269560992637a7887b996a6754721a2ffa97be2b5fc2a512788334871577f7530bc06430e539aa7ee0acab022607554e2a3160c2026b8f169cd3537f523b4cb3096dcaeb4413f93e8dd26c774c98daa269cfb702d3592984a3304aa56809b61f5fa4557a08c8ab20a634bca903f456c6e835cbf23f647a47971c3726ca216014459a96531896c8bfe74fd0eb074d74a085bb32bd57857054629a3b19d0105f5aeb5e79d10b0ce0ca1189756bd74324acccebf80e849969bc008adb76ab38fbb47c59cbbaa33f22759d5f879f178a6ec6e37309a15d70c286d7549fea354b438b48d4e73d6b0584469433cb86a74be82ccee60e4a0ab3296a31fdb9a66116a765e2828f3caa12da7e0a4a0a54d1ad9d141b98413c45d277a4e0a11732b9e6a816e3f1cfdcb62d11eb09406b83c5746032e128cc2897e3243840652253b7865a079309b7ce6a1a5b2007b775a463199c4a90358b416435d69bc7c6ec48a155be7570b7fe2626515a09037a6d9dc449e344b0d570be3cb7b70a720156858d8656c296b54c7377456d22ae66402c6fa7a4d2921666171352f56cc03a76365723682c5ef77437a5d16bf343972c43b10f56c5770cb8e9c2a955e89c35d932dc466b0c198874bb242e511f4f4d35fdb1eeb7c0006fafe38c636dab4728b6725dbf53e59cb8 +private_key: 88f007f412264252bd88a985188292640647b1b3cc05c76af4a6cf3675b42f4482d95993dbd327c8d4b863a8a52446c45e2019e983c05c5c95afc4a0ae860ff06189406c1555bb292a521ba8ea0ef46125e590ab804b42284b1b2bd3338e18a6d6077556fb4b4c39ced51a15568b9d0234112556385329375d55847d6ca3b3c3444a48282c166a218a1c21181b641936ee5527a9848567d5b2a0185e10ecbeaa87503a338e98c0abe960b6c0f129a8b5a532a3598d6a99d55b06cd37bdf8d7adfafac7291c00e07a2816c7ceb5d04461d503e7f382f0e2bcd3389d7dac197ee47ec1cb2261059300a70a34c4007b3579a26884fd771cbe0929dec5b2c7ba08047c99fac165905a7664f27536ca1a8995a976439cd67a7e4fec693ec8beb3ec2e1353c43538159f545bbed6612655762ae90f7785cb8c2051a4ba328ce09977d85434496c9eab763f796f77a94db4343888eb753f434a1906071ea765a07c7f21257d834681be97347ff20c45a207ff7968dc200b48909b62ca4e2caa8e90d1518e7373966b76b69b65b099814e091c2867374e4009b1a76355b2b04beca33f9949c3d700d1583f12a07ec7349c57ab810cd3471a818f8bd8c7e8656ad148561c82bfefb827c2423e92e792f6f79a8feaca75f663b765106b9376bf66b099135c1a553e5b3c0326b6774b384abee645b5cace1bda4efd521967678adf291b6e6602df992b13a0444e817576f9487de014cd563afc086dfe864c0f565a2304338e87232847c2c0885e008536e4cbbad69b78e73794999a5a3aa1096ac7789efb049f273f4e04a92b85304fda1bbfbcbbdc303607d85b4504b544597bea524b79c3c438dc25ca6612d434857971cf95d343ad31c7a8aa5875641d2773535a80cf0b331840a55290cca82b74be2f4915af544d397552d2678a9c771fc89b0f00d6a36bb6276c10c1de195a271b7cb34b971db38f27f071b7bb4c44358766ec23d9636e933b23907a08ef691e453958b325c6a9136e57d2555485ae036ba34a9ca1333bb07015821187538a58c2af375dd5a106c9e01d357b280f07cd7a08a6a9f6b7adc63ca50589cbf21a16e0b35072ba13d9792bc5555b87598946471eccb42e27c9e2a8641c5524cbd17642f41b38fc888914c5d3462da370738fb1a6bf61330f17147b87a8fd294996b3b6bb0997b3e9a076262e7206a879177cec22b51cf1b85535cb3d056e3b6190f528349b245e1fb524dd149d218c5b41b34cbd579c2e2b2eb328cc66233a806177a316956e37a69513ca6183621407075b61b655eb5e5e60ad1582359d954d859550c115c07f71304368546c926531a78479544a6fcc492ef728fe0183dfa6aea27b75bd9b1717262022d75d383c813a2247b065939d20968981ae67d343179118dd1682215631dd7179ba480e54d4a49df6687b1537ad841e668b36aee700301151eda7706adc6572465289588555d263bb484beb51a428dbacb9487a35830597457411c899c20995599c0d3e0759650040127b92c85a58b4d87682b310d165af1b7118e7332de8f90ceb223195cc1a421a1685273078fb7caa4438f7aa4b45087806776188dcccc327170949c45cfaae192c8fbfa0a033e4a6bf137a2d5c4408040972bbb41342a6f2f97c6bf7b5a05a92ef1c69a3e602f5062b4d651b9af148ebe566059454ae71919226742ac151fec6623bd5531699282cd0651a1bb436d113202aae301a6de6c132dd020cf0235944d0a041f6ad92e404f87432bf3a28035c4f6e236ca6e6b56d924800667f8816839549535f1325ceeb5b0e194b89a5800819215737a40988a43336ceaa914800278944ba54edc65071b63374fb041f07a66d5781ee8492d35221c53495248365cc438b4a65a745a64585242878997853597ce1f45371cb1f97f8638837bee3cab372c024ebe4aa52455283cc2249d82739ea481d685204a61840c856617a210fa431a31b27532b5b0868c2dd0a1e2947aef0575934905ec50c33193c8cbf15c5bb4a89b39c63337b3f4bb3b61b0581fe2362037bcab4c62ee14ac3d8a70486789a6d9641b4a112f1336d7e613b13502de7d1bdd103b6a712bd4c9ab0f5611ba825aa5b344ccaf940c5abc296088893626120b4aa3c73c3e27520b6c6411aa745cd4399bdb627ec584ae3e2a9081c4125cc37f20107f70161975355ae779d74062d4ea062a36a4b63a20e22f3af346a57b37747d3d68a486133857577dc3040342ab2c8a38c9702c66276b5439c82465304f22ca9a316b6c078bbd00a748d9689283aaa0fa584fcb922de15c170412ab5819a18019cc9221533a691503a79c71c43de9453922264ce5994c78a3ce43a1595cb0c761291200b9bdd8b6dd037326e5b40d43717e6507b5f7bbbf71800cc7a1143e7101995ca2c2a06d3a501229a913e3b350cd567e59a03ac54c35a8cb0e4faad7402cf6353a048461649d4171406503d0380f543aae846a21df31c561451fb8707b6f15ae138a8d11b53b4820e97d1293938680546000c7552dea31d4ad50e914cb85935cbcf18821d22b20d309023018a667424ac7aa71532aef2c69c0dc545e3e501e5706bc1c19b5179bd4c4ab22dccc9269560992637a7887b996a6754721a2ffa97be2b5fc2a512788334871577f7530bc06430e539aa7ee0acab022607554e2a3160c2026b8f169cd3537f523b4cb3096dcaeb4413f93e8dd26c774c98daa269cfb702d3592984a3304aa56809b61f5fa4557a08c8ab20a634bca903f456c6e835cbf23f647a47971c3726ca216014459a96531896c8bfe74fd0eb074d74a085bb32bd57857054629a3b19d0105f5aeb5e79d10b0ce0ca1189756bd74324acccebf80e849969bc008adb76ab38fbb47c59cbbaa33f22759d5f879f178a6ec6e37309a15d70c286d7549fea354b438b48d4e73d6b0584469433cb86a74be82ccee60e4a0ab3296a31fdb9a66116a765e2828f3caa12da7e0a4a0a54d1ad9d141b98413c45d277a4e0a11732b9e6a816e3f1cfdcb62d11eb09406b83c5746032e128cc2897e3243840652253b7865a079309b7ce6a1a5b2007b775a463199c4a90358b416435d69bc7c6ec48a155be7570b7fe2626515a09037a6d9dc449e344b0d570be3cb7b70a720156858d8656c296b54c7377456d22ae66402c6fa7a4d2921666171352f56cc03a76365723682c5ef77437a5d16bf343972c43b10f56c5770cb8e9c2a955e89c35d932dc466b0c198874bb242e511f4f4d35fdb1eeb7c0006fafe38c636dab4728b6725dbf53e59cb8866573e536b4017c02e31c8ed7455c841a5ccdb795fc200acaf1da2fb936bb597f7054814869cf7625e45647bc1547aff288dbb90699b2ad84893f3b755d9722 + +# Official test vector 88, seed: "cc7152849c98d5fed2813275d32069e44824ecb14eaef425ce017448cd9a401c91c06d0f7eed6d22b7bbe8ba6c429ec3" +seed: e3fc575ed51513e62aba655d24cd9c8f1c6c848aaffa946c49a53ac3ea59e474d82c2f1bf2e6aebde5660fa73356982e12999d8fdafbb3cb186341d0386dead0 +public_key: c797aa612a100811c3131b8b99b3785a4a32c4ab212b5c0217b18a55190890073f2c12521beb9410040129d5947ef96b72c92ae0f58ae1ac236a5426e7a4440aa42c4bd501af4823cb621c3e6374e368aba59c45932aa0addb3473e96854e8a706c510e17ba91b8b865de529cbd093bda7b6ff8b182ef71651035ea6d8b7c00a6f6efb8dfc0b192c44260a9479539c5a4c38cccc6b1b7ff3697e3759f8e1253cf71e2d7c9119b77090a99b3be67ad965919bdac787f116a67b1ae1c7230b957cafe398027596d510b2ce87a73cf8547977631d872ed714193ba7be01bc7e16260b5bb00a4227b976eb5f0dea457d3a493d19494e5219fc67006caa818eb43ab0d80693eb616b8bb9c87c5e899321d6719801a9982049c6a98c2a63800405867251e20c117241e222a1281745e3929cbebc2444b9b0fc0148b81b96f83b9517a2ab24171c5c55898948b7f16c6a1a09cb7dca509a3876aeaaa4ab299781582cebe73e9ba63390b35847480a9a305ca7b4043ca32fa6875b88085115681bfb806268a7ba33bc0dd5311266e672147b089943c2310136ec47ad1652c681a94ff9d09f87e851f1941ab4755538d50d99169ae1bb2bb70aadc0c87ba3d2cb70f1043be7272663740ab74c05899cd7881be63a86abc13ec4e014cd1868c5799992a58a60aa2bbdc6b5dffb8915c3aebe3c9fc8f70ddc8b9b8bd69fe4f1b60202919022af3df26369c190f5f518a6479decd8626e1c16a1094e2dc7c57a1a189b8b2ed0d4b9b0d90662f134cf4325a1867505a43e411c3fb4c4477c74b658d302fea66022505a25cc2a06713fbe1c2407f187e427a0dacc9c0d20a8ff3c4538a71a639a9029f1c826e8612ba30b2de1c63bbb0f70058f13973cbee40f371c490581c5a61ba074175b6488bc9829ad658568304256bfb88db3b10a4fa1744e220ba121772d94b35233cff9f8ca6053a364ca312fe1acde98bcaa937121806b40c972b1ac1e15700ae67441e399bb0641977d058020f205b258a29bd53fc277609c31150a0134849b6b7d4564d27735507ac25bb2164d4664c0b37cd5b9000d33201831c732aab32ef114902104bdb90b638b42960ac870c14e6220806292b9d6d3bcef1a9b6e859516651f9019cbba1c636ee550a72146ab17231f22a8e1eb68209642caf3814a0121565504859810f4a81cd8c5bf10716136e77fefd995a8956d6ffc0a38f841a0905b19589619649ecb2b24ab314a9a85bfa85cc236d19600c7440771a727e6745829cec312346b92c1685507be82a7d3638d36d4a7641a9a042617c09681e0da904a21207cd7b57f183640797142ebb3aad3470b82511bb88c8cd2af6de0a4f789161f7b2c00e2000c95bcb0d270d00c89c5f102b86650e2f8a4c46c052a817cbcd978dbf2c776cc98d53c1f7db97a0f42594ef18b2444a21bb2c1a59a61ddda53d0105489967488046ff8679187800587f2ac8946688cf49e81da406a2684d1a6495d33a8f12b72686482b91c2272215975a484e8488d2b19ae220cc1387594da69195dc47ac1127738bc03ee72772481892734246681b818b16f06943021363ae890ad5e213303d86f890478a91c6d0ae28e95b4ce2a861cbfd681a47a25545c2a29b75946d0f45ba0aa193ca5544686d9f9a802fc4cecdefea4a0 +private_key: 53a58b52229950c6b8aab3bad4f53abd319322c80414d817966365de802c0f8888b1eb3411256bea64bcde19b9cf5142e5698316e8cad22846d3ea9a4008512ee83cf1c8517789366e358143832624213a30079f2e8b07641a6816c1052111ae088792c7c305e9c442a47697b312945d5ccb417ccaf9b1649bb74485f4c73ceaacb7a69e06647e531b5944d64586a089cc8892ee0094c230998a22c9a1b0230557c4bc3c454fe33e96b9c5fc74b2e051178bc1a0895a782f84b75457b81a905e50ab4cabc57b2fb99c5c9978a9a4b2915459fe8b474b66c73ec2a4f3048bc5387ddaa066c2dca233ab00019bc2b3a89ba4710cae9a8fe1937be7e26b63b039f7e324ec870f2ff3c886ac649048659896294e55c7fae52f50753117e02f93751708037410e3558c87382ebc052d1783314b5956804ddce8c378ec3a4681156fe044237004f2f58c59ec8b977c9dec63678d494a22b76e1d7b22092b16a39c696c7a04def98c258b774a4323ecd6905e3c0267304d94a59028e084d7f1aa0c926965f087f0d89275b88ed075c51ee424c4125cd153782e0bcab7f57e0c038bfb29798df5579c95bdc021bf6a005a599c3ac8317a26d94b6810cb1007b9e3ac9447399db970b5b77544636481434c2acd4a92a7575c227079813447939938125670e9027be04462ef7c00345a26efd3803a26710ba975798102f8452659d2b9bedb387fb92aa038a996c51c92681dfcfc2d5754bbe04b1681c01d53d2957b6327417c4a8f22b80468808d099055e781b5c4a594fa2c57b91a70dba9909824b46944cf553d15a8c0fff742f10127183c00e3c6814cdbb87b88915fdc92a273c364b18b9c16afa3f5ca251a417816a13214a3adcac650674c309923d74972a50114d951640610a9b4278bee19c2d520a23791a136bb0afc3565750295c93513b819bea7b0144472b63e2b76e1909816b88bba368a6e41331881923ee92adc1827d2c292195ac1ad64064272a562bc0c9a325731cc2992d373403b1867746c78a89773035d1f7bc833a0c9efd1142564cb53b494b226154e7cbf86e0cb85230c2d2b2499486050509bbf8340a935a53910bab694b229103158776b4a85113e3b8bf8438fb7950d2db1153627abbda1392560611c72871455125a4984dd743a2222a6ceaa88b3fab2caf9c7bf17adb2e9be841163bd3880c6c1a6860a8eafda0dc8ab3bda2051f6a1bb313332777ac5eec69e0f70ae83958d397a488727b57553a7c4b209e6c6a0d062ae0c988ab89786f764622879be2c227b7a717a3c7962acda48df3c84043a21d2d85564159fa7e7bfadbcc6dfccc335aa3425fa958de87a6fb0b55531b66deaaca5ca251c359535aacc818abf8fcb75a9423e2bb903d2811618f5a696f230ce50ba48eb786b34ae60e8b5d6d477c3d363e838030f586796272728c37eb82773ab186968a0c2d5e03717ca5918dc420be60f77d6aa7484c730bcacbb970de161c525973171e638b73a2b824508f038ac5c5c0b43098863485ebcb91c08b60a0c731842a569c92a077c06949d7865e3f7c8b6e96d9efbcc48c428bcb8ba049669494663d2bc5fe761b42089581ad73437c875b9d89f96675bf09809c797aa612a100811c3131b8b99b3785a4a32c4ab212b5c0217b18a55190890073f2c12521beb9410040129d5947ef96b72c92ae0f58ae1ac236a5426e7a4440aa42c4bd501af4823cb621c3e6374e368aba59c45932aa0addb3473e96854e8a706c510e17ba91b8b865de529cbd093bda7b6ff8b182ef71651035ea6d8b7c00a6f6efb8dfc0b192c44260a9479539c5a4c38cccc6b1b7ff3697e3759f8e1253cf71e2d7c9119b77090a99b3be67ad965919bdac787f116a67b1ae1c7230b957cafe398027596d510b2ce87a73cf8547977631d872ed714193ba7be01bc7e16260b5bb00a4227b976eb5f0dea457d3a493d19494e5219fc67006caa818eb43ab0d80693eb616b8bb9c87c5e899321d6719801a9982049c6a98c2a63800405867251e20c117241e222a1281745e3929cbebc2444b9b0fc0148b81b96f83b9517a2ab24171c5c55898948b7f16c6a1a09cb7dca509a3876aeaaa4ab299781582cebe73e9ba63390b35847480a9a305ca7b4043ca32fa6875b88085115681bfb806268a7ba33bc0dd5311266e672147b089943c2310136ec47ad1652c681a94ff9d09f87e851f1941ab4755538d50d99169ae1bb2bb70aadc0c87ba3d2cb70f1043be7272663740ab74c05899cd7881be63a86abc13ec4e014cd1868c5799992a58a60aa2bbdc6b5dffb8915c3aebe3c9fc8f70ddc8b9b8bd69fe4f1b60202919022af3df26369c190f5f518a6479decd8626e1c16a1094e2dc7c57a1a189b8b2ed0d4b9b0d90662f134cf4325a1867505a43e411c3fb4c4477c74b658d302fea66022505a25cc2a06713fbe1c2407f187e427a0dacc9c0d20a8ff3c4538a71a639a9029f1c826e8612ba30b2de1c63bbb0f70058f13973cbee40f371c490581c5a61ba074175b6488bc9829ad658568304256bfb88db3b10a4fa1744e220ba121772d94b35233cff9f8ca6053a364ca312fe1acde98bcaa937121806b40c972b1ac1e15700ae67441e399bb0641977d058020f205b258a29bd53fc277609c31150a0134849b6b7d4564d27735507ac25bb2164d4664c0b37cd5b9000d33201831c732aab32ef114902104bdb90b638b42960ac870c14e6220806292b9d6d3bcef1a9b6e859516651f9019cbba1c636ee550a72146ab17231f22a8e1eb68209642caf3814a0121565504859810f4a81cd8c5bf10716136e77fefd995a8956d6ffc0a38f841a0905b19589619649ecb2b24ab314a9a85bfa85cc236d19600c7440771a727e6745829cec312346b92c1685507be82a7d3638d36d4a7641a9a042617c09681e0da904a21207cd7b57f183640797142ebb3aad3470b82511bb88c8cd2af6de0a4f789161f7b2c00e2000c95bcb0d270d00c89c5f102b86650e2f8a4c46c052a817cbcd978dbf2c776cc98d53c1f7db97a0f42594ef18b2444a21bb2c1a59a61ddda53d0105489967488046ff8679187800587f2ac8946688cf49e81da406a2684d1a6495d33a8f12b72686482b91c2272215975a484e8488d2b19ae220cc1387594da69195dc47ac1127738bc03ee72772481892734246681b818b16f06943021363ae890ad5e213303d86f890478a91c6d0ae28e95b4ce2a861cbfd681a47a25545c2a29b75946d0f45ba0aa193ca5544686d9f9a802fc4cecdefea4a0b33387825115cba8b0ae7da0d1aada1ce4ab05bc2479b360b6c56dfa870ca825d82c2f1bf2e6aebde5660fa73356982e12999d8fdafbb3cb186341d0386dead0 + +# Official test vector 89, seed: "96d9a06f88ff2c2036fa8e914b89c765e4a510b468dee40f914f78858c811857efe9fd0e17c0048e7389e8d996b7e2b0" +seed: 470b4943f0fe7fd0d8ec5185aba0d1db09d112934e4fb4787e2bbc6b88466e7b8b2809fd40008be70a6b184981101724bc3d5ec5e1956b510b82fd5ad0668a5a +public_key: d800414fe5b14dfca90fa6bb7e350684c3b08656374d54776c312a645987b9c80b28933550922990e2cc4064114ee12f93d3000164c333bc77d566cd91c904965367b2350b87a6b0b5aa7f8a746ffd4576d22083f23c0f3efc4d09ccb86dc4caa55365a8a406add3cba2127ece221c9139c6c273bd4d3b1bc1ec0626b35db44230662cc44af683c92176c5171337746f0f4900b7369df2b705b6387670b411e26288b8680f9cbb0a8ee01c9d0a9e4c61a19f1cba55459b78602dc14ba52a0b9de9da0cbf330d3e71625228a6a9e471d70639b05792cb8550b24ac159c5b069c30740d09065c9280bf2b4f86c1cd9b78357383b2bcc4e771661f4cb75c6589db317058e428398ea7bb88450f22525813058c609bf5b02a3098a619101c092f87aad3881eef6a2ea91a49dd3cdf1ca6952205e74f68ad5c06fc04163a70c0972c4ad752acfcfd5529b75328548c18748026bd7965f73076d4bb8f84159756c879a5919fa7286e0dc39f1884587ba5e124177eacb2a3e96410a64c2d5403ccb939e428b1e7149ca2b3368c11c8e1f38082ab06f39455d55d12e95c585f0098fe6dc44bbc97c1547600d79b193fa838e42cef6bab08d462faf017ee8414c9914316297cd56889207e13e71e544c6793b751174c5bb22294800785bb003589a899a562c6252ea679779522c03a0b933b07f29194c75b29693e27ddc6c4757cac5b9219d98137516c450884c374cfa8572f3b9e27cc706b205c398866df7972b8a44b7f975cffc3401212bda14c0bb9a50a5e5954f9534ee90c0f1f2328c618be5c2166be064d5d0a04392183fc5b3bde635992998b68b8c7bd7a0a1c3bc99975aab55aa39cc0e1d4c019ef73a53485349b58f4271aa29a4c8f8e97935981a83426b3bd0b5edd1cc10458579450ed4d065a93aa0fa734f3206718974ca6ef35191c930ef67819f535ea5e80e54659b1aec30534442e03cb9c4673679cc1cb205264ea53d20e383d98c08bff78447c3335a4c3bd6f0794ba019e1eb130faac0d2f4193a6476cf014ddc988e757b66ac5c95bb7767e6c32ea8027b5e5a00e62c582ebc4ae6738b9637355f62a053737014c475fa24b144b2b47eec97dab92f58bbaccb0c36670ccc9326287fea9fe7dc6a2ecc896652c9606943ca1a6e8688a821b69e33412025e26442aa2f70a68011f8be62db6e6283b9b85651fb8883acaa20885807237a51cec50cdd007b27c121feca8a2c026d82359de6d8b548d9a49a9914ce76584338bfc8f2cb51466414548cef544b82abcd277a6602887e4edc5e09a20b1ff343541c7ff3d4c0641109ed04cbdad8c2ee80ccc3723a3609454b733aec068fe6d28772e388255a87710ab88848722ccb2c3aba63ad04566b1ba4fdb2a2c07cc42c32b18e7280348c245e29ba51b10d4ae840b8f9858dfc68a73215ddd58df30729d2966d11d4a5b20a6d441071bd5083fbc050232b7e594b11c60a5f7ea438e015018d145b979428a899bb53a42a96e081f7da939cd0ca49dc3ee11b0dddf94430014ce96485bde669f214a3d4a88c6e4b3ffed1ab4dbc24c08224e03c47fa2a7d55997c2491717297155e1b1ca09898447ac0153435444c69b3b704d5b99189e346bfad6143bdd2780d2219878823ecff9df861e3a729f913ece36b46c0e9 +private_key: f2b0b79aeaabcc2b79b4ba975e0baedaaa5c80d842364cc03524088c1ca3b752aff7a0ba70138dbbdc45a969c12e36819b4b101583a9e64407932796190751d393a651844f785a5fe92b567c2c2ae877bce902c887555f93b6235d80a23d049e3b9867f6164c1dc6ae80b8a22108625dcc31465703572b3a8d599f55e694f391496ac402e4b754f97b4203e30bf4267be95ca1047b2b67b36c00d6a9a86843b0508440d441afc56362cc3594b9b1093073d4fc6ea7c35901066b25305398f58485905c6f99b9f583927ae80f81a06b5c1404e04c361b236a3a6818613c2245a47dc1a613549611c627ae63e38100d1049e0c6a913287dc810d7546b6ad4891c63c230ef285ecf2a47716c8e1da751175b0d5d4c34b569b93d895461cb2382c71c4c5ac2e53493ef487dd617b7c643d7aa1608cd798854051b02093904c5f3efac3a39b98d6c69f4f02bb7bc62102e326d421cb72eb40411549b13c0b443568bc53070f381b962a5452b7aa8bcbabee0ad090e7493077b3d3db2f9d1b2833462a738629fa8174a449463e39cb097b6b81a95f01237c967c63fb3646a931c063e33a0457bbd8984cd02438a61ccd7af577c041ae58442d48591d7c65afeed9761736852a374281db883f07092dc2b1e52ca803b90eaa3cb130d86ddb67303aa9ceb6098ee45b2e34c1cc1f149cd9f6907fd104ad01865e84c6ed72567b2497b86c889accccefb61a35e9412bc25d18c438f658615793814d93c42ca9b8462568d3e389b08756843926a9a7c0b65b4c1191995bb309117c52a27545f67b8a18c270d8b7a96cda9ebaf08b546097d0dba23f543e9aea0421bb328c7cca3792b392fc53b31c411312a592a5604be84fe7f0b8f393a451ec73b7c831d3aac3d1a1058e17bd68658f73e6970601cbeea3c798417dfd3b0911b364f3bb650245581751bf75400226ab2a45ca5ab5d5c31dc018b5113676a7132c931cf87832ae85c53320bb18904b6d1cb9c87ba1ed007a80166f1e649a8a0c12cfea81a2eb4dd615794eb006dd29713e608bae25c1aa842773d82d7a624327e826786b38f184aeadd49808d5b2c650113b5c36cce812fd95156cc0a1d9c6990c637433f1c0179b47c7389e7214652df549f3724f112626b5d1418698a66de09e6828645b8cbc405a19a9a910d7ab16ad1384b109535dbba89023222f2335cc9c68aae9bedb241475d8c5140177494c7f1b273f64558647228d562131b4349368764afdb054c12c0341fc8f7279234c2170cb7434f370c601053d77355191e03f9d516bc40a53e450323fc76b465b13a6d66e8b0a61a6808822e21866f6bf7b77b9d92c2ced831a594028fe50a5a005d02133840e0696236990045b5920f1789e4bccfa90bf88b4a6266b04ae1854ffcb0ac0d6870e0a76ac5449bb9c9a9a8007ac28bbffe998adf5cc9df03e9ceb139fe293a3fc908366c179004f9f587265711c008a14a44b29c3c6699c2cc57dbc6c540274fe500082e0885db6bd71417e10a3b98c695fb812883d68c0e7770c1ba14d50e5493da79630f35e229997834207bc3387009b5201b4a6b53cb90bf60755a048de73be31338b4ed00f942acd6fa10040d836e12b650c1b9ed800414fe5b14dfca90fa6bb7e350684c3b08656374d54776c312a645987b9c80b28933550922990e2cc4064114ee12f93d3000164c333bc77d566cd91c904965367b2350b87a6b0b5aa7f8a746ffd4576d22083f23c0f3efc4d09ccb86dc4caa55365a8a406add3cba2127ece221c9139c6c273bd4d3b1bc1ec0626b35db44230662cc44af683c92176c5171337746f0f4900b7369df2b705b6387670b411e26288b8680f9cbb0a8ee01c9d0a9e4c61a19f1cba55459b78602dc14ba52a0b9de9da0cbf330d3e71625228a6a9e471d70639b05792cb8550b24ac159c5b069c30740d09065c9280bf2b4f86c1cd9b78357383b2bcc4e771661f4cb75c6589db317058e428398ea7bb88450f22525813058c609bf5b02a3098a619101c092f87aad3881eef6a2ea91a49dd3cdf1ca6952205e74f68ad5c06fc04163a70c0972c4ad752acfcfd5529b75328548c18748026bd7965f73076d4bb8f84159756c879a5919fa7286e0dc39f1884587ba5e124177eacb2a3e96410a64c2d5403ccb939e428b1e7149ca2b3368c11c8e1f38082ab06f39455d55d12e95c585f0098fe6dc44bbc97c1547600d79b193fa838e42cef6bab08d462faf017ee8414c9914316297cd56889207e13e71e544c6793b751174c5bb22294800785bb003589a899a562c6252ea679779522c03a0b933b07f29194c75b29693e27ddc6c4757cac5b9219d98137516c450884c374cfa8572f3b9e27cc706b205c398866df7972b8a44b7f975cffc3401212bda14c0bb9a50a5e5954f9534ee90c0f1f2328c618be5c2166be064d5d0a04392183fc5b3bde635992998b68b8c7bd7a0a1c3bc99975aab55aa39cc0e1d4c019ef73a53485349b58f4271aa29a4c8f8e97935981a83426b3bd0b5edd1cc10458579450ed4d065a93aa0fa734f3206718974ca6ef35191c930ef67819f535ea5e80e54659b1aec30534442e03cb9c4673679cc1cb205264ea53d20e383d98c08bff78447c3335a4c3bd6f0794ba019e1eb130faac0d2f4193a6476cf014ddc988e757b66ac5c95bb7767e6c32ea8027b5e5a00e62c582ebc4ae6738b9637355f62a053737014c475fa24b144b2b47eec97dab92f58bbaccb0c36670ccc9326287fea9fe7dc6a2ecc896652c9606943ca1a6e8688a821b69e33412025e26442aa2f70a68011f8be62db6e6283b9b85651fb8883acaa20885807237a51cec50cdd007b27c121feca8a2c026d82359de6d8b548d9a49a9914ce76584338bfc8f2cb51466414548cef544b82abcd277a6602887e4edc5e09a20b1ff343541c7ff3d4c0641109ed04cbdad8c2ee80ccc3723a3609454b733aec068fe6d28772e388255a87710ab88848722ccb2c3aba63ad04566b1ba4fdb2a2c07cc42c32b18e7280348c245e29ba51b10d4ae840b8f9858dfc68a73215ddd58df30729d2966d11d4a5b20a6d441071bd5083fbc050232b7e594b11c60a5f7ea438e015018d145b979428a899bb53a42a96e081f7da939cd0ca49dc3ee11b0dddf94430014ce96485bde669f214a3d4a88c6e4b3ffed1ab4dbc24c08224e03c47fa2a7d55997c2491717297155e1b1ca09898447ac0153435444c69b3b704d5b99189e346bfad6143bdd2780d2219878823ecff9df861e3a729f913ece36b46c0e9720fd4f96ab2cac1be382907e8cba0702018ca27b28ea8f93cc19c4809885a3b8b2809fd40008be70a6b184981101724bc3d5ec5e1956b510b82fd5ad0668a5a + +# Official test vector 90, seed: "d26ce360d399bf7b89dc364aa7ac06bb513eab8f527383e93e30727edc3f22c262aa0ec70257b39edff0630dcdc1b79a" +seed: 6df4385db978d27b27d2aa5e452e4152b36f097503d9581ac3390105c5727e7dc95fa08ed106ce84660e8a4c90bd2b22634e40769aa0090a101c5dddad45edc5 +public_key: 0e4c3b97c9c7bfd505e2aa01b3cbcda4096b37aac72b5b50a41aa8f6cc518181b70fd3270561bed0938d964972be491b6331a148317cd548124b7653f1709af074b1fe4424df4bb22ac91bff7c04489526e5e2c82f2973408c4828368b87a7c14a569ed7b58f8eb6cca19088c15031fadc0e5b37c442543e1eb944ea4a0541248496795bfdd56178c188f3642fc0580e70a62676555f6b3810dbc89b0a227a8ae554ddab721c954db21a87fda98477d0c2af2820b4691ffb046ad544b3d3919dce8303e2f27152170a182a756b981e6cbc0b0f00274b521c1782b0516743d17a7d7b4b29f8dab31c50739f68c57efc48ff5b1d3757cd13fb8249abbfc7b5a794e11e5b56b9f20c8e8a5718184167264bae901b3ae5005f796341897542c70545a9b6b260bc13cfe536416a0f5e8440907a4fa1e79a292ba20a461285584d3a2993f2bba8397756e1ac5050541806207fb8b313d0a6280b473c59abc9964b5dae58c6860337eb69396a24aa990349c62aaf8420b49e8a95af404b81870b3c9459acb62749e4ae2cd518e329776a6b68e33a7ac795330a8c1ddf2b326c3c269303bfdc9137ecfc9eda856148ab9dd0a920cac260e6b70a1b500d80d085fb9b91593254372c8e13b69b0d691a508a391b04478729ca19d75b566b472917614a53ca485c44e5600793a41a180697f20aca35501e7215a49f591d376a2dfe4a3e0bbcbf4652710d0ba75898ccee4c5b63514752ca8778f09d737337c9219f4b51a1277964c9e67b92888300cda37c382700a40fc185ab8fec55aa539cf115913c9c73af0819188965e57b326f6615682915363c54a267c27d625cfab0712138703cf709bc5c6b0cbb1d5d3884011c1b8ad8cbd1ba12bfdb8a80e9cfd1526d940233254b5dbc2bb17495b6466c0ebe684fbf331cbd99981a4362fd318b28015d9f3c3f1da328917cb140a0567b4782ec8bb1fe31b298b6533c39733304b5f7c74206cc688c144a23cc72aa491e48701cd7f14fb3b7767a679ba4f4c4e1b778019471bd78bf6b55c2eaf43351f85190b07a66c35ddfa67dadd28c30c5264e3c3ee88b62d2c12541d1595a519897a99bbee0207867af34b245b00185a60b4a9cb92eaee58b16f2977ceb180b32243839487ed6b88f6b94d2d4686ec7b7ea022e6d995c398896cd9876815a27ec77188640a4a4e64b65436440fac565caa10eba9d48824541a6165d0bb97a634e6715abeab2bd8f91c18a3a6e899738188744cb6b817d21cf092b64e68cb6c9747d3cc34d0d294b4770548d61cf53bac839b70f0350994ada273312545462bca9118848a343f2aacddb2207f84a66b08958576069c7b7b69c02cf4f954ce3252faaa0b7bffa5952c51fbccc7fce3b6a0c8074f72519930395d967603d327fb8231c1811712308b914a75539128a658a2eec38cb7081926e94a2903471b79b33adf94456fa6a09438dba6103062c1f5a5c66a8d15b829c8f01e7c1e21b10bed1aac6d142ea94334660bbf448511563b5564acd67f87a26f779527000584b61a65293cbd85ab5f3362bb96a61c922ffa77b8d90acba77869293a03d7cab81b688306546ac348b22e368b8d717bc969ed83a12000548310a929e9738b2448d1cd7d1cab551ae0e7b1c495565ee65f180aca4a38847375abe6c +private_key: f67c9ccc171f6d04bd584a4502f796e5395ae59862dde86fdf29192419a75e1b50222c8fdd18964d750ad5166ec56416c44715c22c29ba8b3f663517cca3995de71e8bfb5ebec66f19a4c7f8098908a93650e2374e483c731219ec68b480b95f4a81155703bde5aa7b5b6c57062c809f960a399a5e9d59c4e2f895bf30bdf60255edbc0d59350a2ca86c18fa200543a1f94b05c8cb0a07476fa556905415cf1de45568f07e37b37ce3e857f1d94ac9954cc9c9237439b9b0179ac0abaadabb2ada8559c80214c6a07a282627f949112218c13fc360e1fc589b6c05cae9c42df2a759760d2c5791f6e4203474a43836bf046cc931d133ebe82ec8b6414918110734318db61739568a0ab42b9642759c57333971c406c6ce9cea3c751c3bd9db336faa9c87108d80c152e51a543546548f1a7559681dd531adb919163c716ac791b5782175913b95f36bb1dbeb4ff0f443b4829deb738f76c8ba26e7a9c06a95a86543c2b95402f39180c08bd0e1ad1741bde9722819a910227b34121ca404cb6245566002174ade638533ab1d1ff9b37b9420813a28fda5b02460b1460126c80614066b2137798215266ee571759b7cb0a0e266972c4aad41612e743a8ab6022e5263d8576bb01959d2f23bf9102cef541896f2523f3422bebb252aa823b2291d3156195e05090c050966769d8774ab08d8314e29002e921aee609e40790b1531300142b9e3701058ba90be1757b5ca62b813a82a1a3654a130a8f38523d84d15d1a59eb5a81f918484037f5bba53a564399de86fff3a2850bc2946704e6721b023d01552737cced28415e819db6b6c103a71db13a9a0e4bfa74c24fcf8452630047b1a4f2c3851e7ba2fd6340e376b7451b767e5d3c1534447e0030ac023054eea4477b290ac861e16ccb00a079e68345fc626cf17a42818f3ba685377e7a1596b37791297691dfca02e02244a3372c4479e1076af237a030ab511fdf60981364d82d0909d81b0fc691a1589287ea99496fa16db4712dea0a12a1814196b1e12091344a27336d80f10b2a877d70550026a39f68aeb97606466735418cd47311ffbbb5affc90dca723518fa69615390401c8e047830f3f6b0059a9a9656a277d5b966a69e8d450bf3aba7477656e67b689f91147e3979f230996c566df9e0aa21b52e46868988e5a39f2461a5631ad35b7e049990a0f99bf39b9fef962ca8403c7453abbaccbab4215c0bacb8ba27a7427806fe2842ed930f4858b6af52098e3083e21078bed264ffa4a9cd911427b707d9832adfc28b51ab407c9c45c10c12ca15226f1036ea065388a1499ce967ca619af1d75c350a26e8673366377887f4b788861979a3218c2b5f3859c8bff841736b3b7f029f3c542dddfc271d3216f9ea9feabc14deda35399cc927d42cf17b544413826875338e8b1b7f9cab947700a55306b1a88fd5901fba92923c7c353fd5b2ca793640a57b42926858953b7b544317bb85e6189a2a162203645622885a22c8b595b36e221488c0cab5b3146ca5d04e6e218d8a215400972fed78c89a687abf95716041ce1f213ae42459470084712b863a0c574b1062f472466947296db330405b8e101c483077b1c397849032230e4c3b97c9c7bfd505e2aa01b3cbcda4096b37aac72b5b50a41aa8f6cc518181b70fd3270561bed0938d964972be491b6331a148317cd548124b7653f1709af074b1fe4424df4bb22ac91bff7c04489526e5e2c82f2973408c4828368b87a7c14a569ed7b58f8eb6cca19088c15031fadc0e5b37c442543e1eb944ea4a0541248496795bfdd56178c188f3642fc0580e70a62676555f6b3810dbc89b0a227a8ae554ddab721c954db21a87fda98477d0c2af2820b4691ffb046ad544b3d3919dce8303e2f27152170a182a756b981e6cbc0b0f00274b521c1782b0516743d17a7d7b4b29f8dab31c50739f68c57efc48ff5b1d3757cd13fb8249abbfc7b5a794e11e5b56b9f20c8e8a5718184167264bae901b3ae5005f796341897542c70545a9b6b260bc13cfe536416a0f5e8440907a4fa1e79a292ba20a461285584d3a2993f2bba8397756e1ac5050541806207fb8b313d0a6280b473c59abc9964b5dae58c6860337eb69396a24aa990349c62aaf8420b49e8a95af404b81870b3c9459acb62749e4ae2cd518e329776a6b68e33a7ac795330a8c1ddf2b326c3c269303bfdc9137ecfc9eda856148ab9dd0a920cac260e6b70a1b500d80d085fb9b91593254372c8e13b69b0d691a508a391b04478729ca19d75b566b472917614a53ca485c44e5600793a41a180697f20aca35501e7215a49f591d376a2dfe4a3e0bbcbf4652710d0ba75898ccee4c5b63514752ca8778f09d737337c9219f4b51a1277964c9e67b92888300cda37c382700a40fc185ab8fec55aa539cf115913c9c73af0819188965e57b326f6615682915363c54a267c27d625cfab0712138703cf709bc5c6b0cbb1d5d3884011c1b8ad8cbd1ba12bfdb8a80e9cfd1526d940233254b5dbc2bb17495b6466c0ebe684fbf331cbd99981a4362fd318b28015d9f3c3f1da328917cb140a0567b4782ec8bb1fe31b298b6533c39733304b5f7c74206cc688c144a23cc72aa491e48701cd7f14fb3b7767a679ba4f4c4e1b778019471bd78bf6b55c2eaf43351f85190b07a66c35ddfa67dadd28c30c5264e3c3ee88b62d2c12541d1595a519897a99bbee0207867af34b245b00185a60b4a9cb92eaee58b16f2977ceb180b32243839487ed6b88f6b94d2d4686ec7b7ea022e6d995c398896cd9876815a27ec77188640a4a4e64b65436440fac565caa10eba9d48824541a6165d0bb97a634e6715abeab2bd8f91c18a3a6e899738188744cb6b817d21cf092b64e68cb6c9747d3cc34d0d294b4770548d61cf53bac839b70f0350994ada273312545462bca9118848a343f2aacddb2207f84a66b08958576069c7b7b69c02cf4f954ce3252faaa0b7bffa5952c51fbccc7fce3b6a0c8074f72519930395d967603d327fb8231c1811712308b914a75539128a658a2eec38cb7081926e94a2903471b79b33adf94456fa6a09438dba6103062c1f5a5c66a8d15b829c8f01e7c1e21b10bed1aac6d142ea94334660bbf448511563b5564acd67f87a26f779527000584b61a65293cbd85ab5f3362bb96a61c922ffa77b8d90acba77869293a03d7cab81b688306546ac348b22e368b8d717bc969ed83a12000548310a929e9738b2448d1cd7d1cab551ae0e7b1c495565ee65f180aca4a38847375abe6cbfa4b55c7baf2651415d3f28d221b291b175340a07843b299a46e02e22657634c95fa08ed106ce84660e8a4c90bd2b22634e40769aa0090a101c5dddad45edc5 + +# Official test vector 91, seed: "c5856298c3cb6ac9787a0f30938537ab2635b96f6d19cc9522063360e7a5c88e644929d2879180e3e5bcad2422b7cfc3" +seed: dbacba825728444921b227cdba54446b3f6881b47be9cd02832f78b023b1bee0e15274a8e2bc08fe818b117ba28c5dfae74d54fcdf6f20052f79be333edc8dde +public_key: 91f33ddda5b9ed269034b722cfccceae14aacaa81038e45b53518216ca5c332bbe3117beb9ca69287a19dc7a078b412baae7cc5181a389b121bc4ac5d0ca67a97248d8f97d7526063cd88219c396ea11435e5c1d61dccc963444b35c99c86b87e40928b88c47f64b919a028ee601229e5a01bbe17b600acb7449a291b131543709a2b8a7d015419726563e366324588038e71fc3714ccd0a68fde524932496be0ba7adfb6e15dbb99f995419c8af3db630e22393bebb25819159abc78c435342628cab40a6350a8a86d1b1a93f6c9151f1895c4674cbf76313b1992d82c6db218339292622807557f458ce057ec1969578379b75d1bf518976b9c69dc22008371930f06b4d1d2465139bc0a62c1d13db9282c00549c45cb351518df67ca3ac881501c3272b9c6ea1a7c527b0ce8ab9124257484b341b2200b49029e2624eb37b15e7d5823a3ca608f09a5fc590dd14cd2cb15cd238735d25bab119b06026884ae5176bdccbab3550fed9b8d4a473a3d0a47a5c78b7b16b880911c7015a7ec281e3ea03274c6199b345db21c0b0c541962a965fba799840c01409463d138977d9bf8ee8bb3ee3b80e021ece71ca0c6ca72f614706e0941b60c3c8c263ad8187a5d70e98740a0a729a0d07123c5b95d553cb1fd086d853869b68b44db974f5161072d6b1f2a18c5f112376c434b9e777a597b6304aa0d1dc3d2f00010e481b9a9aa60e0acb9394cd554a047a6262e4b32191e875e1688456a1877012933ffa51adf131cbd47c28535595e7bc0777b954e094d6d62a5f67bd8b674abd34500da1a4c94bcac04746c4234314e16c1320c48d714481a43c486c96d183b3ea54b19ac54e971710a293121181a16f5bcd861835c78357ea4a6e8b9b785c085545c85a36b3963288851a15abac8a39a109d0d092ac3ec60a93077486d7920a6c274e91b4f04a7e90d724d1e47f65a9cc80f806b20c98d9867a705472738982f3c608f61095548552cc01cbdf10c34f10709a31aa47a27807c74b9533523912637b1a89d8383945dc9553e9911f4b012d6c397f74c250a70d43db4aa7da34df3c9490109fe7b1561cc25f0f37907fa567dde3ae9da24d425a7fdf35b2e61241400783bc2ba3b6098d6180b25194912175548453a669650e9007be369a2181e1a46763170fc995770627b6e48903f574f06037d580ccc1649ef6eb1d8be40392b86377532fe5b55bcd7177cd817701b4700b71a498359bcaca6393710105108c6c33894a41bd1e4a659b22c76c58c0d2f9648b8908397b2d30e9a4ea60c820aa12a58c3aac757ba835483f02ae08f7c9ad8b593d756a33835759f7024867b5d98477eb6cabc4b7397ff52c6719cf73d42f00a4b362073325d48651c2088fea27d540884851cf95f1a85626642f825265411f8b25067d98b5f595482d767b1c291a9e35100e49af47a71caf2214b592831d1024f56818997bcf035b1ce53c5213aa664e2226e83c50594354aa7974d39b09860b3560a534db624b9a595baf31bfc40978cb2903bb549eda3445241620006371b0f7a410e16c828c6743846ab3644413c8c995a4527f82460e112dae7a0d0a963b87e38a66e07290789200d6018cc7c454ba7bd5e56d7ce2d10ffa73f2a284bd579dd64e4229a9f36e58fcd24287c47316b08f +private_key: 619075d10644e5f5c9cea8446de5ab5c9ba99ffba41a77cc6698b06e59aff51a688abb284a6c26fbac9ddc31bff11956651c149946797bd265338376144b67693c60db18450db25d9354a1d0d99e2e7a5ba1a871e7e60df77115d7e08aa6b96133e0af9050b784834feb9bbcd0374c0116cd0339cbd3a3649a713ed3e1c185c73a693482db86acbb2688f2c622f8abc7e4041a767698131012f51b9719208b76cb019533798563a55fa7009786049c79c8e617246aa98c4ee0407e0b262ce771eac06ae8c4354630caa42b2c8495481bd640d7a65831b099d0142da3f3239f3ac555ac6440f5b14613147294b736d7b84c035ec8b8a478801c3460509989ac71ba5163618bf25212555bab461994d58c95c3c492df3992e47687962358ad8629b8b0c9f1a1aad180b2c84a7788953145a885d388253e77b274e9c7e9b5882e386dcc9c0b34747265444b8dfb06c6944d84a9c16b9929a19451e4f09954fb2858db2e73b0c940b2239cccc167a60c18212967d7c262c6b06d9566c65c9ea1a86d665a802f5c96d75b67b93c07cf914ec50691bf676276652422a21840db291175a58da6246d5915e321ce3089ada24791a7431dcf4117d3c167123bbe4e9c4670d3696cea143f7c1f12036c63c4699d4c5a32734e85621311c4b826666dfc4578ba4c953d2a037ea1bfa58780ec1678be56997b9375d74966cf9b01a6669ad2dbaa22a26b24a61e2f982b21e9a734c88a32035edb12832f8b59257a0a84b75cc5eb2f7d194d3e1581d9e513598c0cdec0450a255808040a69db3a151c3709c80d55b985e5634839700250389d5ab81f04757a15359a0ef9263f2ac8e152aea3d60e310868c4a71b01761a6c041346d840d1924468f41553f11a14846d694b3918856d0c485562a95071f31b83ec87f3a50ebd89146bf528592b32bfac5dbce78d14467fd873549d998a8f623383861640581627567cbb0310b19b0d554803fe4202e6d41aaf0c58e9f12b1c210e1afc9ffa9c6e18381030d9442a41793bdc274105abe23471dc2423547ca8c92983c0503d1a96b4cb44852b18c5c4f8ad53010c0f3b4f0ce61ce407556fd09814f2563d64134e082be7fa574059ca964b3ddb0053b89627a4194399d01eb24b5e4777c82f7394d95abb10c320032814288799cfd089dbb8ac6941252af08d0248cec9b62b124abbc4a09db3f6188e28a07329c26ac38dbf108cd7ca28dad55514e481969a0f797a341cb05f617372046a68a221b3cfdac744b6ab6a229fdb184dec4ba266952836077129d7c1dbe0859b573f610995feea652fa35c4026b26f194d9333091ddc0fb39648c1b1c6dd69275bda5f4d725de01068abb96c418c283ff65a4c5256df2b2698d82062616de5f93fc6d5005bd449b134361467ccce99bc2dba54a65a6234851fd283b9b77ab43dc40ab1d3ae8c749b9071596785bf53e34d76910384e1a2ce38586a628b7b5b4c50d325a3d340dfccb929996c601969445121d39839cc1ac168236f032a656a01016db1109d9692c81bcc192285bc4baf0ed03d9d68849f723dfc630dd91258a2636bf4aa3c5fb429b8a01074f1983de27ce91513dd44415675597c440cbeb434f8723891f33ddda5b9ed269034b722cfccceae14aacaa81038e45b53518216ca5c332bbe3117beb9ca69287a19dc7a078b412baae7cc5181a389b121bc4ac5d0ca67a97248d8f97d7526063cd88219c396ea11435e5c1d61dccc963444b35c99c86b87e40928b88c47f64b919a028ee601229e5a01bbe17b600acb7449a291b131543709a2b8a7d015419726563e366324588038e71fc3714ccd0a68fde524932496be0ba7adfb6e15dbb99f995419c8af3db630e22393bebb25819159abc78c435342628cab40a6350a8a86d1b1a93f6c9151f1895c4674cbf76313b1992d82c6db218339292622807557f458ce057ec1969578379b75d1bf518976b9c69dc22008371930f06b4d1d2465139bc0a62c1d13db9282c00549c45cb351518df67ca3ac881501c3272b9c6ea1a7c527b0ce8ab9124257484b341b2200b49029e2624eb37b15e7d5823a3ca608f09a5fc590dd14cd2cb15cd238735d25bab119b06026884ae5176bdccbab3550fed9b8d4a473a3d0a47a5c78b7b16b880911c7015a7ec281e3ea03274c6199b345db21c0b0c541962a965fba799840c01409463d138977d9bf8ee8bb3ee3b80e021ece71ca0c6ca72f614706e0941b60c3c8c263ad8187a5d70e98740a0a729a0d07123c5b95d553cb1fd086d853869b68b44db974f5161072d6b1f2a18c5f112376c434b9e777a597b6304aa0d1dc3d2f00010e481b9a9aa60e0acb9394cd554a047a6262e4b32191e875e1688456a1877012933ffa51adf131cbd47c28535595e7bc0777b954e094d6d62a5f67bd8b674abd34500da1a4c94bcac04746c4234314e16c1320c48d714481a43c486c96d183b3ea54b19ac54e971710a293121181a16f5bcd861835c78357ea4a6e8b9b785c085545c85a36b3963288851a15abac8a39a109d0d092ac3ec60a93077486d7920a6c274e91b4f04a7e90d724d1e47f65a9cc80f806b20c98d9867a705472738982f3c608f61095548552cc01cbdf10c34f10709a31aa47a27807c74b9533523912637b1a89d8383945dc9553e9911f4b012d6c397f74c250a70d43db4aa7da34df3c9490109fe7b1561cc25f0f37907fa567dde3ae9da24d425a7fdf35b2e61241400783bc2ba3b6098d6180b25194912175548453a669650e9007be369a2181e1a46763170fc995770627b6e48903f574f06037d580ccc1649ef6eb1d8be40392b86377532fe5b55bcd7177cd817701b4700b71a498359bcaca6393710105108c6c33894a41bd1e4a659b22c76c58c0d2f9648b8908397b2d30e9a4ea60c820aa12a58c3aac757ba835483f02ae08f7c9ad8b593d756a33835759f7024867b5d98477eb6cabc4b7397ff52c6719cf73d42f00a4b362073325d48651c2088fea27d540884851cf95f1a85626642f825265411f8b25067d98b5f595482d767b1c291a9e35100e49af47a71caf2214b592831d1024f56818997bcf035b1ce53c5213aa664e2226e83c50594354aa7974d39b09860b3560a534db624b9a595baf31bfc40978cb2903bb549eda3445241620006371b0f7a410e16c828c6743846ab3644413c8c995a4527f82460e112dae7a0d0a963b87e38a66e07290789200d6018cc7c454ba7bd5e56d7ce2d10ffa73f2a284bd579dd64e4229a9f36e58fcd24287c47316b08f9675fc6d1e3cc4e0eb62d31b6b4f10022d373d2718f3d20ee1cc00ef6892d9a0e15274a8e2bc08fe818b117ba28c5dfae74d54fcdf6f20052f79be333edc8dde + +# Official test vector 92, seed: "a28ead0a08e7228aeff602b16a1e752278b8ed1e91dac67994f5adc372e1d82f95cc390cd97ab9212275e0566c833fd8" +seed: 690eb71fd7052b906eaec09937a8ed374e0b02afa27c2f14399932be5839fad281c38c2cb5cfafac81b96a810ab749b61806b6d54c9f8cf4bf1be0192423288f +public_key: 2ecb47bc7c78372b75de587297848724335f44545a35fa11e6e1208ed4764fb8bd4af9712e21c8b3c99e5a04432ec7c0b3200384534aae227c6400883ac21ec5152380b458bb69c5ce909842d3b07ef2c539c44a2df2013aa97a08b511e444996144cff78ca394b5440f4aba566383b0375edb2544a42c4df25b6a96e0263c8962bf9b716bdcaab098b41f735018735d8a26ad7d93b0f17452bb64180a572f75091af0ba9b3499a134e90a167ba72dda62cfdc27e3234b1412115ad0463da2600dec2e7010b1fc914f3772c858c80608244cc014a31036a9abb68946b51354d07fb914bf22e17ea21854ab778b67b40cef331cf8374594385c28586dcfd5421d1a008634b006965f88d58a5cb449f52136d7f82cfd0aca3b6355117b15cb51240c6a239ba26380c55abe19912be90466cb701d4bbcc5e138c525bf28d23cb2e0452927873c17c7e431051f99a6f585b89facbf71f594b49ba84c7235978aaa2baa1f9e7496509009acf56c5d09a4c53b1cf2845a0d0555528c8c1d287ce7e0aa56e85adadb89440305eb942b1fda247457751fc1b5b8811fdaa95592a047e297b9418c52f0189ae8a21254f838deb89360292956749007ca73581aa79f37116533068d2425d5ecba7447b7cc5729d987564ee3cb2ccabb6c31ba24375304a70638533c67bc6e53c51b17559133d4aca5a6bf44c635615a9881e25e4d137393b76b5017254970b56ed13f7aea587458a43b3435bb018ff6082661da9fec065c0ec23bff1b919633806a835139da4c4d34c6f4567daf07536eec3d4d0347f3abbd7f32317c33c2660393af455c2dc506ca111f48da051d8350edf5590adaae9731c2e301a824721718968ce3e66be430b8db293a22859d68b353dd45467c85ab7f4baa0d5b2cdb83c94a895a58e09e9f249153f25fc6d3c7ef50b1929b197128a64de27c48041e08c26d64b8c229cb24f9e9667aea2a33531d19dcb6ada725eee88f063cbc749c2e90f989c8f0c7cf6bcda814bb2b321f1862b32cb8294e99c78ba21d86a402a1c8c3e7f9a11f09306e588fd1856b7f5c5eaa768dd72793a3a88d35e931de0bbe0bbb697010b2c75c3308649c1260648bd3a6d6e57c56e00d5de7270d2c26572aac88e08238658332879d5ffa005f7c8db415403ae73ae728a5f3bb228a326b05bb26a0c91544d98db8cc687c597ae2e6b142b101e9731ac8c20c7eca11887b7fc8886c304a162b30cbc510ce54ea5324dc9b82f39b0d971dfa69b81ad99d49bca9e3449774985f5051a7eeaabdbd33857741c11adb51744539b1095c1b32cc99f81a0ccc6dc88ba829b11025ca5dd3353639fb8148088763ec9e7c14370766b918e93d8839a8b0a34d3090933df3a86e3976d09776a0ec3229741b2155b6c7ac5431421c7b80812523155c9cc5d890268661501628231c1c660583829e7b3984bcc8ad20632c16993673818f7ba15a5064aa42cdb9f7b0e0708328213388b06a04d559fcd83a10913c15167363f997f62b6a03614c46b9acd703be1a1b641e7910ea273022168352c89cd7616d7746983b3b51d57770196a68a50125f1634faba0c752826ce0aa6448c86fa76c6a3e2390840b0c7f333650c53e0a998b66b533746765316f08a94e18de52516228102ff16993ac61abd8d7884c +private_key: a46a88df4035c55137522295e986cb5e6605f7da81fc0b1f29903b3d283022db4f8046378fca124f5580a1dc4535e64dfea6c4fed63aa73960b4e14808383cbb12cf6f204d07f852a815a793eaac2f147d24c53e412a21a7550ef4e8122f46cdc9c560bf725545c82b743041c3933eff115d15746f3fcc5934c132af7a18b2a37fdce899e9c1cc0417124f0c279360c311a08cfb301655483d7f92853274c9f81683e5ca26283527647a0ef6d09225d4af7f1c1ca7563e824454b4a2cdfb5c582c498b4a1a1645553bf7dc30d6a56e0b7ca57510aa315818e527a64bc1b7841801edab2446863d48a53dc83203a0f68be3fc498b288e8457cf6f8132b367a9529bbb814151950c3619fb49d5888aa7424c30d415d08492a7ca50e76b56fb18bcc1ca99c45ca066340ff1e5beca8c51d6355504496e9e4a407ae57ee5a30f92ca1e0d3298bc252ed70114e426a76c5c08ab67304550cd7eb6366205b639b30da30978bce2c745283087c9ba87d3273df10e3e2573479bc205824aba06ae5fd6171355a73c771939e767412333685c6cf9cb622554af01672967bba8e043ad491568aee39e35888a4b996f6279223e820f20f5c95a6a66a972cea5bba874fb018cf05ae1dc60208510c85c6e3211583c4c21965b27817982e1165b6a59017b4bbf3db1ba31d95f14bc76c104c1097aa3372992026035e89895add31669481b6c558842b3bd1ab5bc9ac2bb6754b0a8b07419a35096b2365b60b317571674012eeb7157b233c4a1d309bc1c4c7fc047d5c3382dbb4cf65c9d9a24bda690c37d47ab27500ba5748a0294c8c9fb8acc8b3d938270a73c55de662544c7c576c73a2bd9cc983a60ddc0152be508d341a29595a40c7b617d6bb45d247128505a930a4bf9194ef4e27fa9d9cbcc55c8c9b4cf675876ceb2bb711798c850c3e85bb9e84bcc716195264737c03b4b2738188c0922d50ba49c01b4fbb85e48ac9e02739fbf556c5d5210283014ff280263d7c5353a0454d93195bc4b8ed41551b10a7a19808292c73fd63e61840d10f5c5b2853ee55265f78cb112b3a3521577c90b2744d855b758431e71816fd200b47791328481c49b24f991c9824742da7043ca2b47b7449126533adb1191d4ca1e3779515eb05e9c57c383a3bcdd991fae460ac8c6983e16484d7aa00aa12afb778004366765b3ab6365737e7a4227e7b5b7729bd9086ff4b64cc7ab06ad353c6bb24e05557fe2d60436f9596639abab693449247e881827f0133b9c1569baa2bf87486cb1fa0dbccaa179b397b01906847a970ca28f29f9a8ec0a0fd0a6c02c52a75bf7c3c0c180502590f3766e56556502b1a94383866082681d564b333b852b180c91e6873b143f8475a3b9d67c1421a871a1bdd3c073cdc16f4a717084b95528d43ddf2870ba2a9689310d761a6fd4179261f219de4500ad4b186d97cd1074b71ff893b3d4c889ccbc03264540a26b8ea3551dd86d77c29756c6972ab87ac9d07999f0bdac8a8796c8b83e9311b1a529c20a715e382f21e64f9fd0624792b818d93eb2e3be8cf8bf16793aee06a018eb86ae09292d5599ea78a2553a52793c7148f12762ba5df79b5242249684b1716b818498a5b82ecb47bc7c78372b75de587297848724335f44545a35fa11e6e1208ed4764fb8bd4af9712e21c8b3c99e5a04432ec7c0b3200384534aae227c6400883ac21ec5152380b458bb69c5ce909842d3b07ef2c539c44a2df2013aa97a08b511e444996144cff78ca394b5440f4aba566383b0375edb2544a42c4df25b6a96e0263c8962bf9b716bdcaab098b41f735018735d8a26ad7d93b0f17452bb64180a572f75091af0ba9b3499a134e90a167ba72dda62cfdc27e3234b1412115ad0463da2600dec2e7010b1fc914f3772c858c80608244cc014a31036a9abb68946b51354d07fb914bf22e17ea21854ab778b67b40cef331cf8374594385c28586dcfd5421d1a008634b006965f88d58a5cb449f52136d7f82cfd0aca3b6355117b15cb51240c6a239ba26380c55abe19912be90466cb701d4bbcc5e138c525bf28d23cb2e0452927873c17c7e431051f99a6f585b89facbf71f594b49ba84c7235978aaa2baa1f9e7496509009acf56c5d09a4c53b1cf2845a0d0555528c8c1d287ce7e0aa56e85adadb89440305eb942b1fda247457751fc1b5b8811fdaa95592a047e297b9418c52f0189ae8a21254f838deb89360292956749007ca73581aa79f37116533068d2425d5ecba7447b7cc5729d987564ee3cb2ccabb6c31ba24375304a70638533c67bc6e53c51b17559133d4aca5a6bf44c635615a9881e25e4d137393b76b5017254970b56ed13f7aea587458a43b3435bb018ff6082661da9fec065c0ec23bff1b919633806a835139da4c4d34c6f4567daf07536eec3d4d0347f3abbd7f32317c33c2660393af455c2dc506ca111f48da051d8350edf5590adaae9731c2e301a824721718968ce3e66be430b8db293a22859d68b353dd45467c85ab7f4baa0d5b2cdb83c94a895a58e09e9f249153f25fc6d3c7ef50b1929b197128a64de27c48041e08c26d64b8c229cb24f9e9667aea2a33531d19dcb6ada725eee88f063cbc749c2e90f989c8f0c7cf6bcda814bb2b321f1862b32cb8294e99c78ba21d86a402a1c8c3e7f9a11f09306e588fd1856b7f5c5eaa768dd72793a3a88d35e931de0bbe0bbb697010b2c75c3308649c1260648bd3a6d6e57c56e00d5de7270d2c26572aac88e08238658332879d5ffa005f7c8db415403ae73ae728a5f3bb228a326b05bb26a0c91544d98db8cc687c597ae2e6b142b101e9731ac8c20c7eca11887b7fc8886c304a162b30cbc510ce54ea5324dc9b82f39b0d971dfa69b81ad99d49bca9e3449774985f5051a7eeaabdbd33857741c11adb51744539b1095c1b32cc99f81a0ccc6dc88ba829b11025ca5dd3353639fb8148088763ec9e7c14370766b918e93d8839a8b0a34d3090933df3a86e3976d09776a0ec3229741b2155b6c7ac5431421c7b80812523155c9cc5d890268661501628231c1c660583829e7b3984bcc8ad20632c16993673818f7ba15a5064aa42cdb9f7b0e0708328213388b06a04d559fcd83a10913c15167363f997f62b6a03614c46b9acd703be1a1b641e7910ea273022168352c89cd7616d7746983b3b51d57770196a68a50125f1634faba0c752826ce0aa6448c86fa76c6a3e2390840b0c7f333650c53e0a998b66b533746765316f08a94e18de52516228102ff16993ac61abd8d7884c9d162fce2f019205a2106acc8e3e3465b6fa3912a06c764e625cbe3b95dea6c881c38c2cb5cfafac81b96a810ab749b61806b6d54c9f8cf4bf1be0192423288f + +# Official test vector 93, seed: "92877d706daf88ef3412eb143db8cd91bc047a9a43b7acdaa42523560dee4c172697be4332042fcab91135839bf74ab2" +seed: 32e0ea9089fa928482c0770da545af1bb871a03ce38604138b0d08ea2a10ca2bc06c5bef7b6508409daf847a64c8d30d0974fd3ba7476dc76c46b458a036d884 +public_key: 7a6917006162efa4cfbd499b8c853e102c9639457f66812d58383e629a7522f1c683d48d8a216a0aa82454f29732077f4baa593de951857227b976a35a8013a622afe355144b63bbbe58265287cf6d605421e73e7df7301b59a885821ec0314ee76359d9d715eec1c2ae726fc0592ee01c1d45d6c94c76cff66bb3bc321358e33f16e1ad44b35e256bac5ab519e404c3cba647637537a524849cf952deda7940dc1c3a213d8c13580ebc10e2b458873ba5cb30c00d855530b0b5f86003a2c6641a72170b238feddb624f9660e16a9c545a0fe8102612979552f311a9417fcc8c8768280a4902a8ae696131c76338097f0c3a2f8731ca25d55a21b619d1c48550371cb2cac00e27c8ab9c8d7bb944e4bab625eb1bf7c55f0df84ce67c48fbb4438eabc818cc2871c619222a0c504c6898c31b9e859998911f4a29000e4063cc0a5d13975182c97047520a3fd7430117b5d0b2b088741690b5662a3b02978c5a2f1c330871957c5c73bb5a2fdeb0b5f3e5953b509b2887435b41badd607307941aad1cade20c4a22b80683b80dfff1bf82a4ae80eb0915190197c1ae23145522c86f86955d0d3b7b4b83b019123674aaac2b4138e4b36169b1784a4bbac8570aba1acb13ac0ab84a6bf987a23ec91f7c6c2dcd6b952c505515b4b4b1e7c749e693ef4a7dcdf8b7e2f89168991c0385829e46c7faea3c7fb18ebbdb333a4a16676aa81daa4ab519638807bc977729d4474f4c068897e77abe636df8525c35e7c691b49c72e50bbd8570d6b888041380a6a4b9a65868f247141ee137ba422807a57a9389cc195345968086359b36e5316c594a88959b7b006abb88d754bed942230b36945a141d4810050834caa24cf58747820a6aacdab186bba056bbc043da570f874eedd29718795ee19c9e8fd4378fa8a42ba6812dc51874cb0285420419d408e897a7f8fb9ad0238ec632674440b66e838fafd731b50092324a9b11a545bb9a9d7a242d54c6bf897a080ac0b06b57535e542d254ac581450d82d73ef779865708a2563c86e4cb3133cc5fc2e16dd2b043449a73e59a5c6a29a227a469ce406192ba4825e3503f3552f743bc3dcb945048a95c70209bf5c5efc76227ec7d947a19dfa0af12b078bc588c1cf9c1300961c59ca8529c357b9087b572a8bd2739a7a526f3d874e6e2a23c4242bdc652569c7ed3546e3e85b7865611c2cb7ad551142b2503e14c0fb8220755036f6bf95de3f1440598076db3410a4ac1e52c91f038956731622df255646ca02fe7cf1aac75d972a5d744512b4b498c666ca68660b984bbe6a1833e83caafb80e17ea49c484ae2b6475d2e276e0c9317c47090dc9bc134b606a6a1336a40881d76ebfa954dc550cac192082e1aa81f9a6d9162b038a021e09b28bd0b959884acc836a4a95100fc93071dc474e593a1d7ca409001b6c40c3fb13a5b6640a32da0b6db086f1691614d935c29b67d8d54732948dfa27296a63607c17973b764b9c05713bf0026bc0534b9187fe33690826a6c80014b2f97312d53b3b22aa1740b0a47ca8807145eae577c994b1dfeb19109b5b99019329fb6adae267c2759fdae64cf479462c4185ca67255971aace8351a94501d772b15890042363b3bb64b6373e44c5bf6ae2caed5dfc3e0f0dca2015579e6c636683 +private_key: 36059bf728aab04b86ac60b0f5c233a78a036beaa04a2873b71a3e29272e922b4537f97aef0700afa68b6da877b25b1ed143ba6ca538bf04662dcb500466a70eba596776c6d3662073f20c7582614eaa1517b5578378069f2704a4c5836a55006e054d623b6d04d48abd14570b4613f4c155f9d86c8c695ab9a2744e40794375c07ca62e1a3269104bb9ce60c8e2c6c3f9153ae3555a3a35a1717739ccb195e315400f3704c7c839614c4cc799a4ab250af448b70b871a3a1b8aebfa6278f6222c41aafd51bfd126032ba90e8d103e64e1036fa72dd9e752b72903d3b45443fa5302103d041b12b1a2ce0bf7406f81812807764ed435074a6a55dbce1065913deaa3e7164fcc6419a0d0cdbfc314ab66b2bd40a1e2e0af801b5e9a22023d1c797f49a345661e9c0352d9e880edd71b2e4a674265b3dbe4822738877f305f6e59bd5e4a4ba8aaaedfb28a87733411da7981f458f09a0d8bd55446aaa44f382b4bac9b08fa53b6932337b438744064c7dc9b5e95c61be3c454590df2a88565dcaea473bc3051a08bd6c238e36ea4d28064814c5d210c2cd8a8325230ec330063585b8472ad1415725b51950c171fa4c325c9a8795ad3585e515285678aa43470af7705d800bbfc14a9172b11275471f0948dfed89782d2a214095f11815026f202e18cbccfc75b46763cf37aa5558a34bfe51176b904025b16a08a07635455a01b69820541336a0397abc928e735fb969321216d17341cabb82d07a6a036d7cbebbaa1b7771497b329d67a9c247b6c31798d47347e41a425d7a5b3b1f38d914364a5176ffec86a8f743528179a5c544faba84c48387dd3264423bc083da506b356a51efb1d18da3a5ef2361ec43d2c80395d126097a7a5cc6a4354699017a7cdb02a4823f8327d729a89c1971f6a8646b92d1d38031e5c4a29733ab30063bd86abe6bb19b85687575b85406861a6a3c93085501f62088e245f25c450867c349700732578bec2152746c724a4da7b5b0a0a6df57a67341acd911d12e2774a78a6f003885cf26bfde0c8c1c24a63f33e5444ac342451e5f51820217fb20c14a64738f43a5aade60e3367c3d1695e409bcfd3e57885d87b4d19c3744ca797b74e1af7253613aaa5e9644279ccf963a8ab38ab07a1c8ec6558c3b6a285b38ea34acd49c1a74f3610745c8cc3da36202c6363079f3e252157c8882860a1852663a7b4416d33bea9a08157f61e5ae8bf3aabb7098b2110dba39e4a681eac0e765320d0fa6a6bec730a1848d5137a2f62a7b234180cb4b82568202b59713fa38d10d6c6aba1be37325db36896b80b0e6b356cb735c004d98caab7893e383da8a467c4a71c0e9316bd640f226a68ee2c138b8159a6147c9939ca45304b5df944b377ba4826964b2b86d50b9edd5294c3da3b2ddb02ce786eb02b79e8850ae923cf8b99211ba97806795c2bfa713079ba7728ba7b94b985728b83bcbd64f26a8d5594fbdc18764307a9f66a1e2b0d0d290cd23878adf03e2ebb9f0c48c9132835121c61709a740d937c8010a866f494af723d57b91b98034c6af9388d1b7dbf264f775462a5f581c0ca23c2d45f98c267951b40d36913b23612091000f49577eb8caf83744b7a6917006162efa4cfbd499b8c853e102c9639457f66812d58383e629a7522f1c683d48d8a216a0aa82454f29732077f4baa593de951857227b976a35a8013a622afe355144b63bbbe58265287cf6d605421e73e7df7301b59a885821ec0314ee76359d9d715eec1c2ae726fc0592ee01c1d45d6c94c76cff66bb3bc321358e33f16e1ad44b35e256bac5ab519e404c3cba647637537a524849cf952deda7940dc1c3a213d8c13580ebc10e2b458873ba5cb30c00d855530b0b5f86003a2c6641a72170b238feddb624f9660e16a9c545a0fe8102612979552f311a9417fcc8c8768280a4902a8ae696131c76338097f0c3a2f8731ca25d55a21b619d1c48550371cb2cac00e27c8ab9c8d7bb944e4bab625eb1bf7c55f0df84ce67c48fbb4438eabc818cc2871c619222a0c504c6898c31b9e859998911f4a29000e4063cc0a5d13975182c97047520a3fd7430117b5d0b2b088741690b5662a3b02978c5a2f1c330871957c5c73bb5a2fdeb0b5f3e5953b509b2887435b41badd607307941aad1cade20c4a22b80683b80dfff1bf82a4ae80eb0915190197c1ae23145522c86f86955d0d3b7b4b83b019123674aaac2b4138e4b36169b1784a4bbac8570aba1acb13ac0ab84a6bf987a23ec91f7c6c2dcd6b952c505515b4b4b1e7c749e693ef4a7dcdf8b7e2f89168991c0385829e46c7faea3c7fb18ebbdb333a4a16676aa81daa4ab519638807bc977729d4474f4c068897e77abe636df8525c35e7c691b49c72e50bbd8570d6b888041380a6a4b9a65868f247141ee137ba422807a57a9389cc195345968086359b36e5316c594a88959b7b006abb88d754bed942230b36945a141d4810050834caa24cf58747820a6aacdab186bba056bbc043da570f874eedd29718795ee19c9e8fd4378fa8a42ba6812dc51874cb0285420419d408e897a7f8fb9ad0238ec632674440b66e838fafd731b50092324a9b11a545bb9a9d7a242d54c6bf897a080ac0b06b57535e542d254ac581450d82d73ef779865708a2563c86e4cb3133cc5fc2e16dd2b043449a73e59a5c6a29a227a469ce406192ba4825e3503f3552f743bc3dcb945048a95c70209bf5c5efc76227ec7d947a19dfa0af12b078bc588c1cf9c1300961c59ca8529c357b9087b572a8bd2739a7a526f3d874e6e2a23c4242bdc652569c7ed3546e3e85b7865611c2cb7ad551142b2503e14c0fb8220755036f6bf95de3f1440598076db3410a4ac1e52c91f038956731622df255646ca02fe7cf1aac75d972a5d744512b4b498c666ca68660b984bbe6a1833e83caafb80e17ea49c484ae2b6475d2e276e0c9317c47090dc9bc134b606a6a1336a40881d76ebfa954dc550cac192082e1aa81f9a6d9162b038a021e09b28bd0b959884acc836a4a95100fc93071dc474e593a1d7ca409001b6c40c3fb13a5b6640a32da0b6db086f1691614d935c29b67d8d54732948dfa27296a63607c17973b764b9c05713bf0026bc0534b9187fe33690826a6c80014b2f97312d53b3b22aa1740b0a47ca8807145eae577c994b1dfeb19109b5b99019329fb6adae267c2759fdae64cf479462c4185ca67255971aace8351a94501d772b15890042363b3bb64b6373e44c5bf6ae2caed5dfc3e0f0dca2015579e6c6366833e834e34f198ab5a3504cfa0c6af6ab78de3a3ef5667e6065e084cf5d2a5bb32c06c5bef7b6508409daf847a64c8d30d0974fd3ba7476dc76c46b458a036d884 + +# Official test vector 94, seed: "bb4c0082ca4044b1ff60b036c9b0e0495d58667156786c530bc69d949a13bfaff53798e456423d7a0e162a60039367d7" +seed: 6fb2ec719f2a0dea152bf3f64b9d148f8ab8ba88f64e61f5db53e12d59f525574f797c007e4061f95c7d56cfc7ee5c49e849dde3fea8f25e7876df2a18515c34 +public_key: 4860867e75349ba9999fe4be93262a08f868abb10652b51bd1c67c266156eda768e30b0c82f910eb96062177a882435c74353dda7279f2141d23a6440b900a8a476c66993477b999e23b40ede83b1e31781b4303e4bc5e0220cb0a6409c88aa8238b83d78792c5632751fb0d5246ca42fc89ce31a64069560bb87360bc2696e78062600f24db78ab630079a64c87900d4b7c9ef9201822b6bdbc69c6be718c3b2792ea32756e1a465325a763dba22861a423e65458272e77400375aab4dbf30d564a176613c264631d33f37cea0346e71649d1314862bb0d2b05711cf1af088a4c619048a7242d0be6a8b536c41a9368b22288ecd0ac7298335e5c91db419c2126a8df45b2e6d8793da63fc7e94d75d3bca2aa58f5b5bee0b43a462a12c34b93f68952b6e7abd89c97c293b0693192a44c0d4e69245e14983e87aa26da8c63517f58d66ae1610936e6a89dca87b6c70c1a78c66743b89b3c2eb854067ad97d74771f77b0906a9a7e78640de75a7b8273851dc55dece9b1941cca76cb2dac265e487585780928dfe7402710b6bd914d564568d3d4075e4141749990c40214ea51b71f855deb9349dae2108843b5cd9815f1e8458c020fadc1c65796b117f8b9851776e896891dc05aa0095a914457016172a17624a608cd49db55a42bcea68778a26a910eb566a2d942da58a4cea53ea7a67954b085eaf642405b1674309b68cb9bc3c04d67505d861a605bd6163f7cb49fb8cdcd40917bd59b94892459fa7ea64a4872f51b97e66e64f02818520164e20d5f952a3266840b4575fdb7625d07d00486bd433447d5e1abfa65b215e034aca74670d4b7ff61c36ac2a1628a20d79b352d1c82c1626233ba527967302131bc1ca837d9eb4238404a20a515fe98a9e6d9b34ec28f0b252263fc2bffaba508a6375aba51b4a36af23740d2d51705b2a1083b23bf5a6b75a214dfcba5eabb82faf49e4d326d369cab0f74c00bd54310a3620d570eee533a1a89a51a418a3cd14b25244f0c66c8e8e454e358364fab5997170a90a25f3816aa1b272b09e54435ab3096e8161926299acccae3d689eafcc7e220cc42f5a347173ec4c2510da02c3b4526d75c9b01d103b8914e41b03865e16be770a0e642251dc312cd10aecc6a9734ccc815da2bef09cd18c3a8ad6c0f90574f41075cef470039a62891ecaab5f033fcd4266a510589f7423b4992f488c3cbc450db074fdcc7cfb4a51c08e2359247c1f564cc94383892757a8164c8c985c28e288adffa9c866a6779faa0f0882abf650a4b9c5e0fb36e4e51a6442167aa97c8e25ba55a3b5d7f164f07b2917f57b16b751ac08167ae88cefa14668e7634d05865d1ea24d1013e1b270c9ee9164d18654646bbae973745e64f90e69064f38fe5744a6343ca04b1a05293c5dea9ceadcab0b1f07ca177cafff03d582b123bec8cd829aae8d7cba9f91d4c89cf9e9b52038638f54721f23c6b341419eba880368782d1a0990f57211bf31012148d74451ae1e79850b75d6efa172744cc6d77a46dd0272924bccef49053198b87e1ac122a0753950586d14c6b22bc12939f0661638b5191e6dc2ffaa147dac984cd004d6dcb637bb18b2f04c115f98cadfa79f64e6253cab64110a71d94db5762f8cb4d277e03b2435a473d60b193ed2646f4 +private_key: 30251db04b83a5b5969cd3354a375ca3003289d59f5197a01e2b103162bd63c0ce71e9c5b0259ab5d7ba48fc72fd3c90a5132d3b0b36dc9c411fa10bd5b45168aa6c562405d478487545b0c4034f0761897db4cd2dc13dec0253acb3051f71b170a731cf1c0e5f17cab24b64cc7682a2d4313bd23cab0849b20bb094e4570910ae5c58989a99880107ca4e617e66020043874eb861a0f72b50a924b8a4bb021504cf299b08b610bc14b0ba6226b162290c3bf6559db1ce5694bc9c75a8f4e3290900ae68e4a29a543dfcbc8e10e90472675381e0376aa408c858491be00fa782049766097a787337a616e04cc0fd8a57612ca816073c47c97d93c6a134db23b84198a0f196dd8c6ec88bbb5d08634c378b678455b005795518cd66ac170090207c84bfce5a89fe0cc1d16a3a60c810fdd780654277940a6e86e75b563b794649a29f0201d7a79930bb1a2b6177002560b5a06ca2d84dd8b45615923bd58543e53221c244ae917459149c13d15139afdc0ca0828ed5c32b2327a8bbf71e86a4071a579d6cd180a1f5248d3a148c318271a378921061041c186faaab73cc3465cc603b90138e125d909427f0c6c13c7b1af731bd7fc9c2eaa601880174b82a28a1d29db0bb708ff06c255bc17bd427275c2c12128c1253207808cf9edc6d3b106cd016821814b9ec498adaec702ad8bd24b894cb21b94de3175e2335b1e22b88c01fef553c42108f531c265f85bf7d0597d4c9b11465c6d8dccbb0b4b06259af20885458f58924b91edb64778d970a20a64f5f2c16a1736c1a81b350a14dc6f4ce1cc569bc8c197c897f4652c59cc7c9a106a2a4d8b826e057149167f2a30988504212b33322b4988e3987dc514968d4027f16c0440cbc1b4b48c18c974f8b20b6e5605d650c2c9b7e594665ba42ab96a4cd287a76e1e05f64c542e4753b2b8a7ac2eb52bd637ef9d50b4f077cea215859babbb2ec105ff5b5c37c0f5ed41b1e71a22f59922dba1d9e004a93dc69215669f530a04e45a878f14df4885be6d2ab820890c35c63061cc2f2582f575c364bf490e9365f6666a5247c950d7aadbe9bc3ee7638fdb981e574c9cf5960cb1c9fd504b6cc347c6a30bd6803cf99e003aa588caba4969b4329010c3ff6762a9ef273e6170ad64b4dcd9488c4e152d3d78aa5d91258e991e1228273372f5a4a01cb815ac2b69ef370838f28c50d82867761556f04c5d5d21abde15784dc486dab0d593069bc2401be13a7945821e2a18de2c331b9a8304613a181ac5a5ed121e0739994fa9b060c1411b261771a1321b62a614972a502a58b712c594b16ae82955817781dc858d645b354bb37e9835de8029b5ed9c430f7103857b25b888fa4bb7e36b30aa3a93d18b158a6365d598546eb025c7d7aa722b0494781c9d29121e071ab4ab73f86eb1d8aac4d5e66375d868ac6a6060f36b2a80730b541895e32c8b68882d945ae32d115e70a7e61f1c9c6945b9eac226ea551781a1bd48208a9e36d12915b69d04c278897ec79c7891a4bd44530d78b63c92640a0e07576322825998166817689799e070b2fcc7780acc596c42786fbebc5356185b008589f7363d863cc934446dd12420e6c5291a66eb2d2964860867e75349ba9999fe4be93262a08f868abb10652b51bd1c67c266156eda768e30b0c82f910eb96062177a882435c74353dda7279f2141d23a6440b900a8a476c66993477b999e23b40ede83b1e31781b4303e4bc5e0220cb0a6409c88aa8238b83d78792c5632751fb0d5246ca42fc89ce31a64069560bb87360bc2696e78062600f24db78ab630079a64c87900d4b7c9ef9201822b6bdbc69c6be718c3b2792ea32756e1a465325a763dba22861a423e65458272e77400375aab4dbf30d564a176613c264631d33f37cea0346e71649d1314862bb0d2b05711cf1af088a4c619048a7242d0be6a8b536c41a9368b22288ecd0ac7298335e5c91db419c2126a8df45b2e6d8793da63fc7e94d75d3bca2aa58f5b5bee0b43a462a12c34b93f68952b6e7abd89c97c293b0693192a44c0d4e69245e14983e87aa26da8c63517f58d66ae1610936e6a89dca87b6c70c1a78c66743b89b3c2eb854067ad97d74771f77b0906a9a7e78640de75a7b8273851dc55dece9b1941cca76cb2dac265e487585780928dfe7402710b6bd914d564568d3d4075e4141749990c40214ea51b71f855deb9349dae2108843b5cd9815f1e8458c020fadc1c65796b117f8b9851776e896891dc05aa0095a914457016172a17624a608cd49db55a42bcea68778a26a910eb566a2d942da58a4cea53ea7a67954b085eaf642405b1674309b68cb9bc3c04d67505d861a605bd6163f7cb49fb8cdcd40917bd59b94892459fa7ea64a4872f51b97e66e64f02818520164e20d5f952a3266840b4575fdb7625d07d00486bd433447d5e1abfa65b215e034aca74670d4b7ff61c36ac2a1628a20d79b352d1c82c1626233ba527967302131bc1ca837d9eb4238404a20a515fe98a9e6d9b34ec28f0b252263fc2bffaba508a6375aba51b4a36af23740d2d51705b2a1083b23bf5a6b75a214dfcba5eabb82faf49e4d326d369cab0f74c00bd54310a3620d570eee533a1a89a51a418a3cd14b25244f0c66c8e8e454e358364fab5997170a90a25f3816aa1b272b09e54435ab3096e8161926299acccae3d689eafcc7e220cc42f5a347173ec4c2510da02c3b4526d75c9b01d103b8914e41b03865e16be770a0e642251dc312cd10aecc6a9734ccc815da2bef09cd18c3a8ad6c0f90574f41075cef470039a62891ecaab5f033fcd4266a510589f7423b4992f488c3cbc450db074fdcc7cfb4a51c08e2359247c1f564cc94383892757a8164c8c985c28e288adffa9c866a6779faa0f0882abf650a4b9c5e0fb36e4e51a6442167aa97c8e25ba55a3b5d7f164f07b2917f57b16b751ac08167ae88cefa14668e7634d05865d1ea24d1013e1b270c9ee9164d18654646bbae973745e64f90e69064f38fe5744a6343ca04b1a05293c5dea9ceadcab0b1f07ca177cafff03d582b123bec8cd829aae8d7cba9f91d4c89cf9e9b52038638f54721f23c6b341419eba880368782d1a0990f57211bf31012148d74451ae1e79850b75d6efa172744cc6d77a46dd0272924bccef49053198b87e1ac122a0753950586d14c6b22bc12939f0661638b5191e6dc2ffaa147dac984cd004d6dcb637bb18b2f04c115f98cadfa79f64e6253cab64110a71d94db5762f8cb4d277e03b2435a473d60b193ed2646f4c5e157ff4357d3c26b7c4b45315f0689f135c85d952a64648b0a8cec03741fe04f797c007e4061f95c7d56cfc7ee5c49e849dde3fea8f25e7876df2a18515c34 + +# Official test vector 95, seed: "121d90e70af6204445d0deb28ac0c108262719e9fd3476aca74bbfde89faf04d8d5f89a624e8a75db80431f0d10ad28f" +seed: 527fb88c8bd9a4d6031dad15e63878abd2b559e7e08d61f69e8e78fca964ee6ae32d432b4f9f751bde0496c580a181ffed762aa35454a02d3f1f47ee0394c89c +public_key: 345881ab11467fe9883654870f7266d76755b0a368661001e627587ba42a2ffc1e2c90b154bb61c2cc3d82a3588d4004d112534f787858d23e8a182971229bb2bc77809a1b118137fb91bb09d2b39dc77773e291fbe2cfe8fa2cd4882379f9471a190f34018c5819ac4eaba7a4a24c703c8876f321267b3eaa58a90cb0271208c6631a773021b3960c14605b5e24b01c2e3c9b2196499dfa69d6a76f0551907cc79611bcbca6b1500d50854f719761a59e8bfac4d5b27a54791482ac5426f73b906631e784c3be822599bba514540efe6a7c13440ae97844a6c73ceb51c471f8014fe51fa94b271bf3206f56abfec55ed7002c27a9250fbc12c9f328ea63b3a2375ecd35634bbba0a4a0619d4571ebc7868faab83c6180dc3c129e8596ede2b64762ca7670282daa233620445bd64a44f5c395a212a088165fd16fc69c503a33b8689217ec00a738f74210d074dc3706e9a412b7982a3e0804458560ace39b54c114f8dcbeb9a1512eea2d8636bdb91c15653926b0fcab1978a02ef694086c062f097c32c9445606050e454a5ec2a43d5cb2704049eabba1933ab857acc1527c254b35cbf6fb4e267b567ca2a125b1552d1c83f408b12420b0b10c2e0aa430f695af478c9d1c54406bf400170a84c4c52e9657c1b4eb652938b4a281a809851a5f62ccf930a56b5588f6fc64b6fabc62b6a62795b3372637bd641bc55c76df070288678012247d11b09118c43fba2536f5daab402377791c906e4cbdd5291ec81a1e71a3a696c0165aa1adfb978be46a8fa5cc7c8ee30036c085888bac3797a1f189cc4035658ccaadc61432141b67bc09ce04685dae806c681729e71b62dcc56449101401d967157c093a8a2b442c3af483408791769bf7ce8910ca4f4724ffc93647375e702bacb559c11fb18b1d4a5371fa4bcc603c22254cdf2654b2873cf9e03591f4173e6a4cf86aa30e9480d49215ab503b2cf6bf42c4b314c7595c907bd4526569b3122234b9e27259619b520412b43b892a6770cc32c6c276a391a106959560687c9620d8d1a60a093f9982a46bb9365d611a86d064f3f82d81ba5c3a39578ea4583b8882efdb5e0b3517be2ab82863c68db0336f6a1b9e1777d7139bebd15af3b73e21332d471100a8a8cdc9d926d2d7c23bab39e015c65a072e0409609c0c0607ba94fdba9842146e8524cc6ddbaa3dc3c9153c667d2b4f4a4871ed642fb284c573b1735b24b9f14aa72f316d3e8b1d8bb415e28a895a7a55e5043eebb04dad9a1d7d2ca9c1973bbc485400b8bc3e897d9d977be1d6cd7d93607a123e43b56b55189586703bbb505185f167d9e24d1c1248a4bc4a98b9332666afaea93aab55b09cc95e8691872c48b3594a1930d82917823362dc6e5ca19094526c462b52d8c842183b214f710908369e9e1599c8e43ea7d890a7e5a8caa6953d774a2e6a1efb1529411228d3637f1b28437c0773a719cc85681cff772ef05b3bbe5753fa2aa5e414bdb599384fb6462565bb04da4c84e550b20163928c9673427b5d57864cd0ba25065246d3914338cc9be47b2ddb2d18888ff99a087d0012b789cc3d6c0c2d93567f7a4c87f1382c4c5ea6d084e524b82eab586ad8c8b05c9af5971a56a31f2b73ab45392bf60b762c5543dc3a259dd67fccec3ed3654c6559 +private_key: 9c6b1557d747fbab1da3d8bc22301b37e5a5850c9e482850601c129a909da97a9090840efc118a287b19ed091e4f39b7657853502b4322b687a28532f6620bdca934361b1a5dbb0e9af71caf65280e6aba338ab888cc80cde458720ba6146c39a22bc2c8f9cb0078a54031614d60cc9c91c319e3241fdb73a78c4b5715b0cf9620e0449c8c67493a987659c19e8e9b6e2ed12ee5dc876de75589cc6d4294b40a0463d0a4899dd54a60ccbaf545166d693ce6ba3e073c63757ac06a9aa2e5e93385b9723eb339155c1e3a043779b193af883b91f78da091358c2c2dd7db9086598546c6886d1bc611c3b586a3304a473fff62371af33142b1a212236e63351903a652261093ee44209c72bcd1db9cefd7866b15b6c434c654048ca845ab31c65e93d00288c6563e35080522415e42a9d5d749f308c36c860fdbe004f6c38bbf15cfe728a2806c10af833972a6558fc204f052cfbed8b1f8649951e44949720364f752b4910616e57603342953e47f0046af76867c98fa0ecde6680b14bc14ea34569ab583c86c8f3b1af9f5ba2ec68935729f0e03844976a8c5b965f56660e60b2b93d838d3697b86d6cf3e8aa0bd6865dac093966a0793030be6a03bc9e472354471b367a27ed30e129a336df19114cba8ab99571299128b323721703bd11649fc371aeb1867c5079fe04b169501cee5b2a54f14884c5ac1b42588c5ba090382320ac8233bcc442ba2bcf9ec34446a716bf34f1c183a8829b22216855107bf6e9218d26010e63a72316cc5dd8994c4817880d4144a26a0967a25d0a82546098c6c55ba8078c0bed3bb91b5b2cb10c95b464852d7973dfbca7f6396dee46984f220431cbc969b0482453ff729ce625a3498ab299239465fa79b2d50c0cff698d2e4cff7b3182b88acc0785c69b406a3dc9504840a2a744dfcc29a99458f74b3ccdb753ef2e83065111c41052c539c83d1ac049d215ea5291110287e80977e3f578fc6dcba985327dea382c3bb9561444f64232137624e32703cc4cc12c63ba5d3ab496b7b493c1000858b8dd51368f1458d255ac57d829928dc2a0707660df753aa9c1b868703bf69013cd15f17a38496e51d63aacec4f594cff35dd027764a56b2751080d3d76b91da373636cba86395b992a7ce972c5e1101ed43176f5a5ba68801d0763762b92e499110648697389b98c5586bf69356b4623647cb0d1366b0804166299c4dd1ba0f29bbbb5dd393c40cc03967919cc32c62d6bdf9138e6b45184d445ae94825ae092df33caefb2b737e9a23f58126a6c52780e48f5ff7a14a7b255c9a474c752d9de424ccd4a8a05c79164779b8b452f3245926e2538f7299186259678298749412e96b444370bc583ac4a4d43dc7e1329d9630a7b3a79b0cc673789ee0d8026c93c17097cb83d515cecba69b13783fe1bf72338846c955b7b1af27128f0c1a2dfd0018def1c24fb16c29d326129213d831728acc4cf339cbb6d2a7ddc8b0eed4cec8850750bbb740ca89180b224721648f44a8cccbba6c2538006bc38fa34a04053dba971f165c5003d70bf9c0b7f7578d03093a3d496a0e9242b0c23a92788b668b1abe421080770078f97118e7c35dd589ce1ac805d953345881ab11467fe9883654870f7266d76755b0a368661001e627587ba42a2ffc1e2c90b154bb61c2cc3d82a3588d4004d112534f787858d23e8a182971229bb2bc77809a1b118137fb91bb09d2b39dc77773e291fbe2cfe8fa2cd4882379f9471a190f34018c5819ac4eaba7a4a24c703c8876f321267b3eaa58a90cb0271208c6631a773021b3960c14605b5e24b01c2e3c9b2196499dfa69d6a76f0551907cc79611bcbca6b1500d50854f719761a59e8bfac4d5b27a54791482ac5426f73b906631e784c3be822599bba514540efe6a7c13440ae97844a6c73ceb51c471f8014fe51fa94b271bf3206f56abfec55ed7002c27a9250fbc12c9f328ea63b3a2375ecd35634bbba0a4a0619d4571ebc7868faab83c6180dc3c129e8596ede2b64762ca7670282daa233620445bd64a44f5c395a212a088165fd16fc69c503a33b8689217ec00a738f74210d074dc3706e9a412b7982a3e0804458560ace39b54c114f8dcbeb9a1512eea2d8636bdb91c15653926b0fcab1978a02ef694086c062f097c32c9445606050e454a5ec2a43d5cb2704049eabba1933ab857acc1527c254b35cbf6fb4e267b567ca2a125b1552d1c83f408b12420b0b10c2e0aa430f695af478c9d1c54406bf400170a84c4c52e9657c1b4eb652938b4a281a809851a5f62ccf930a56b5588f6fc64b6fabc62b6a62795b3372637bd641bc55c76df070288678012247d11b09118c43fba2536f5daab402377791c906e4cbdd5291ec81a1e71a3a696c0165aa1adfb978be46a8fa5cc7c8ee30036c085888bac3797a1f189cc4035658ccaadc61432141b67bc09ce04685dae806c681729e71b62dcc56449101401d967157c093a8a2b442c3af483408791769bf7ce8910ca4f4724ffc93647375e702bacb559c11fb18b1d4a5371fa4bcc603c22254cdf2654b2873cf9e03591f4173e6a4cf86aa30e9480d49215ab503b2cf6bf42c4b314c7595c907bd4526569b3122234b9e27259619b520412b43b892a6770cc32c6c276a391a106959560687c9620d8d1a60a093f9982a46bb9365d611a86d064f3f82d81ba5c3a39578ea4583b8882efdb5e0b3517be2ab82863c68db0336f6a1b9e1777d7139bebd15af3b73e21332d471100a8a8cdc9d926d2d7c23bab39e015c65a072e0409609c0c0607ba94fdba9842146e8524cc6ddbaa3dc3c9153c667d2b4f4a4871ed642fb284c573b1735b24b9f14aa72f316d3e8b1d8bb415e28a895a7a55e5043eebb04dad9a1d7d2ca9c1973bbc485400b8bc3e897d9d977be1d6cd7d93607a123e43b56b55189586703bbb505185f167d9e24d1c1248a4bc4a98b9332666afaea93aab55b09cc95e8691872c48b3594a1930d82917823362dc6e5ca19094526c462b52d8c842183b214f710908369e9e1599c8e43ea7d890a7e5a8caa6953d774a2e6a1efb1529411228d3637f1b28437c0773a719cc85681cff772ef05b3bbe5753fa2aa5e414bdb599384fb6462565bb04da4c84e550b20163928c9673427b5d57864cd0ba25065246d3914338cc9be47b2ddb2d18888ff99a087d0012b789cc3d6c0c2d93567f7a4c87f1382c4c5ea6d084e524b82eab586ad8c8b05c9af5971a56a31f2b73ab45392bf60b762c5543dc3a259dd67fccec3ed3654c6559f5cedd022077b1a6a052f5287219393cd2e0366d0f5531b2f7ea8704d2900ce5e32d432b4f9f751bde0496c580a181ffed762aa35454a02d3f1f47ee0394c89c + +# Official test vector 96, seed: "b3ac6503206accc2a92cbc210d020a2654726911d11ce676aa04feaa08af1d20c654e4105883ae470ec3ab299075d420" +seed: ac6fcfaeeef795b6ef9e062f02bf42975fa01e7d91ba832f74e05269a72684d05aeda108ea4d6c6bc0fb958286850422bc357ca67b83c986048e0d0087fa11ec +public_key: 2695adfcf444770c6ffab16e9211abf5d019e1471b843a3e7a38b5ce109a0a6796a0d822a926756f0c4a0fa03f53200d6cf37a1cb741f10219102b63425063d6a910b2fc574c49067a1a40e22ccb754926481b7f0ad0111943b3e67a570f0bc269aa50de26cb5f3507791b757370517d486d7a55a88ce86b42856705f6a7a48a8892e96ff20c304e74271e0b555c1b4b0d065a50d61bb2813cc3723009179dd2b4c37a0a06b2099c2aa0c4d256a2fe2042bf4b3db91b11028275b33b4484f2ccb9971df29703dd61c17dbc0319ac63d16080f5b5c460149ef751933ab60142404b66690a2c10a6e3aaa186f6c7e130577cb02ef4e043a6d4ab22ba85b5396a4d61aa1528becc59a1843a4d70283cd2f91457762ef34424b934be9a1547dbfbbcde21552f968c2c8692475632e78ab3d7330619e74d8c71bf3797844c717e70b51367963a7cd3c4869a85ddd213a8d34b788239056544692a7741124697d237d7e2677a908358d81da2cbacefdc511d3110e1152bf2d036c4593a0512523f80a26620ab1cd8b6b1d99a08f25ae3121713ac070833c544e42acfbb78d86476743923d7310c5a4238cce27773d3989d598affe6650c1166ad4ba0e034ccbbb5a75d69b113f2a1952a2cc6980c58ca6da32718e4484d562ac700d924545b6cef439234980611c99e69706054981349041e1962b272c4b0b8b416569952e4f98d4bb12de6a13bc1c903c5477b0ffaa1c0dcbd8e4abd4670832eba3d43d9c31147aa803c17bb32c65e3c350520297da9cdd6dca30ca025e85a051af5aa82d231c159a5026a0e8f2c16769105baf7708fab822b1777c6c53137ba11298ccc15d522400b7f85430de739514c90453ba97d9359807568417ea307abb8982707b7519a65b116466e984772f87a6346ac808c7b2cd22f08aba151e79ad8e45925d29294879a9dc00f60713e33091c42bc3ab24b65b488c764ec75b4117dde39ada784835d3129cbd7b777b1b69cc3293f07ade724639b761ca598464e6676e216874c9668b19aba660974c9918d52761acfa325031835b4d44b42fb91e431373781a2f60354e837458e69a89d830e00801178ba697f82a3a914345ecc1b5cb4b3357b6b7d41b708c5a7e4f862c44c8ffa90473495b70607386c02b4f0261e197124de180cc793355135bdf37cb36b9a180dacc2f6b09efd80cf35211a0371c59f396cd9ec226e1126d69a6ab8441faae9a1cbd18e17387ca0333f94acc7e35306a8b05f4dd185fc467e5e888159a50c6c9a51ca6b2deb9ba212822020d67552d4317449b51b21c37348c44e3880367574d5c195db588ad0189a80756eda780dda9a7d3c946b10d897ab8bb40d6441179b1b0d58271ea83000c5ad56175a23d20322d516b2a487c74a64eb3514c93b919d65cedf429bd37515fff66f4d72cee39a0081452f791b8054660da44937c4a443a09727ca5198322c341c12413c19b6075bb9118540bdc105313422cf9b8fa687540af66728fa9859a642bb9479b31257912cb5e0046dc9273199f27f4f3665aee6a7bdd19e0ab8baf1d2a868b465aef75f3ceb916c82bd81791e80158f8e5b358c218305d96a683a19c930c1903b5e0a4b15ccd8ad0b9e61da304ad616af46073a781ed8d08060c1678f48941d67b3685a39ee7491 +private_key: 29013c0db356adc444062a6955267cbb8132d72a58bb1b34ecb955795ba52f1624694741fe3c646e734c2462547a72553c51559c2c88830b1cd43089e924080807b4daa964bb85cd5cbc56edea257ec59b9c808bb66835fee1ada8fab7db67268ddb23454680d3a7245be4917a1abeefd809d7906c1b8a4dfad2160313ab7c69cba472bef251c7e1e1ce8771c1c30b7db129b8a8140aae05780664ce800600dbc8ba42e1b4ae629424735b57529f35f9abaca9054ae346c9928a3ff7884485195d02369d046dd68a7129197cc91c3a911c0cc361c9b8fc44c0ac8d98c8a18b185b9e174bdca360f589343f9509121b7b3c8046f4d8086d471b5f1b3e20c6296936a2e78583640590d52aafb321a23215546309676dc84c445ab78bb5660137a50c97aa05b7b004e396619b632e855d80c6cde8973c055c65b7a06a90421e8ce484495820d9a66f878a19e8e1bbbbf86437545a5ddc4326e400c384ce96c4698f628f9703be9aa7181a361739f7701700c47eab9f1b805d86450094c76445413fd57b20d9794aac17b1ef33186a345351c851657a9ee61463f0e912dfd8ae113a378bb51bdf5b918b6344fd74c573430259b2b18f37ce9af0bcbe3807a0d94626dac6a22c4e31f3bae1eab69f768dd4a68405290566e20ed156b5ac5a73b1c08e64e68df973b9dc8692bbcb17692c496817bb1f0465cddc6ad25903bcea873ffbc9d8472487a92c8ce7148c25288d9687532035b81b584494524f796f99904c0bfa402fe265bb7aa143a0329f4a199692472f25b2b59a3a845654a88b9356526c25a740f39c3476020b99a601b41831cd832e3053a90b5cb4de61142f65b2a2babd9a45618036af6ba54c9a2b093cfb5bd7426056e09e6771af41d607cb9375846a4952ecc3a991225db49b31753f0839967ac9319b6c5d23a6365970a3fc4497cdf793196b6c9ad5280b949c825599b5d312b2f484939b960caa2696d26789f09b4d2ccf211cb3bc580acc4b0126380a6da109ef86385640667196a2c135a3fdd780d34513c0d35f78836d0f811945b7b617c024ba5aac93438397f216a4520213c036fdc81957630236323a56c72562236be7f127653269c2a6248357b134973ca90a100618279b1306907a9076f05e46a716cf79882707c942dac8200baf3a454d8e74258682313ce3252fd7a602a3114bdc50e33b29f18acea7180226532288ab678d4c6dc60a58366a61d6b124e247a39b24ba960b39a2da80637c9cf5838cbc5a5b7c1b7fc7e16777c9cdd1460c9eb32f1da32cad0c2437e3aa59f0020a106b06113f5e896730962d1efacb72084df7475eab9cb467ecc1f41177b644c9a68a961ea65d2323628e558d6b03abb2f5491c7c36244a3ba56191eff6ae71496da7372c5e1500e22a7796b2aff8856d75d3278b5117fbc42c71743bf7f24c78b76e3ea45ee2487a8f2899f2127d687b1f8dc579c2ea811d3c50d60c85f6e66457d88f91a63ab1ebc98a0b2167262700d35201975091b9ba30120c6eeca45992376a200d161a234be0c93b68661da9cf44a01071a8614dac8906d39eb475312b0c2e998ca7ab67bc77387e5b6cc8aec14d7ea894809c54e10649325881a89b132695adfcf444770c6ffab16e9211abf5d019e1471b843a3e7a38b5ce109a0a6796a0d822a926756f0c4a0fa03f53200d6cf37a1cb741f10219102b63425063d6a910b2fc574c49067a1a40e22ccb754926481b7f0ad0111943b3e67a570f0bc269aa50de26cb5f3507791b757370517d486d7a55a88ce86b42856705f6a7a48a8892e96ff20c304e74271e0b555c1b4b0d065a50d61bb2813cc3723009179dd2b4c37a0a06b2099c2aa0c4d256a2fe2042bf4b3db91b11028275b33b4484f2ccb9971df29703dd61c17dbc0319ac63d16080f5b5c460149ef751933ab60142404b66690a2c10a6e3aaa186f6c7e130577cb02ef4e043a6d4ab22ba85b5396a4d61aa1528becc59a1843a4d70283cd2f91457762ef34424b934be9a1547dbfbbcde21552f968c2c8692475632e78ab3d7330619e74d8c71bf3797844c717e70b51367963a7cd3c4869a85ddd213a8d34b788239056544692a7741124697d237d7e2677a908358d81da2cbacefdc511d3110e1152bf2d036c4593a0512523f80a26620ab1cd8b6b1d99a08f25ae3121713ac070833c544e42acfbb78d86476743923d7310c5a4238cce27773d3989d598affe6650c1166ad4ba0e034ccbbb5a75d69b113f2a1952a2cc6980c58ca6da32718e4484d562ac700d924545b6cef439234980611c99e69706054981349041e1962b272c4b0b8b416569952e4f98d4bb12de6a13bc1c903c5477b0ffaa1c0dcbd8e4abd4670832eba3d43d9c31147aa803c17bb32c65e3c350520297da9cdd6dca30ca025e85a051af5aa82d231c159a5026a0e8f2c16769105baf7708fab822b1777c6c53137ba11298ccc15d522400b7f85430de739514c90453ba97d9359807568417ea307abb8982707b7519a65b116466e984772f87a6346ac808c7b2cd22f08aba151e79ad8e45925d29294879a9dc00f60713e33091c42bc3ab24b65b488c764ec75b4117dde39ada784835d3129cbd7b777b1b69cc3293f07ade724639b761ca598464e6676e216874c9668b19aba660974c9918d52761acfa325031835b4d44b42fb91e431373781a2f60354e837458e69a89d830e00801178ba697f82a3a914345ecc1b5cb4b3357b6b7d41b708c5a7e4f862c44c8ffa90473495b70607386c02b4f0261e197124de180cc793355135bdf37cb36b9a180dacc2f6b09efd80cf35211a0371c59f396cd9ec226e1126d69a6ab8441faae9a1cbd18e17387ca0333f94acc7e35306a8b05f4dd185fc467e5e888159a50c6c9a51ca6b2deb9ba212822020d67552d4317449b51b21c37348c44e3880367574d5c195db588ad0189a80756eda780dda9a7d3c946b10d897ab8bb40d6441179b1b0d58271ea83000c5ad56175a23d20322d516b2a487c74a64eb3514c93b919d65cedf429bd37515fff66f4d72cee39a0081452f791b8054660da44937c4a443a09727ca5198322c341c12413c19b6075bb9118540bdc105313422cf9b8fa687540af66728fa9859a642bb9479b31257912cb5e0046dc9273199f27f4f3665aee6a7bdd19e0ab8baf1d2a868b465aef75f3ceb916c82bd81791e80158f8e5b358c218305d96a683a19c930c1903b5e0a4b15ccd8ad0b9e61da304ad616af46073a781ed8d08060c1678f48941d67b3685a39ee7491a53a20ea03e400a843c8cf4d04bfe0c0a3ce63dde01045e2669f7ae5da7905775aeda108ea4d6c6bc0fb958286850422bc357ca67b83c986048e0d0087fa11ec + +# Official test vector 97, seed: "59eff60b1ef6185db34ee1e3b1dd2f159106ceceaa79beb74923b4f5623d5bc52dbf5d2594a1f7c6c64d12cf144e9ed4" +seed: ba2fb9318d4dbe7488057c33e95e6f054583a2800c41bb83083c330a914a12cfe63f8ffda3565c2424c89b20974b748a65a5aba75133fcb3156dfb6626a83bab +public_key: 09abaa56083952c0c1b6ec9a50251f3c16859c2c91c0076750016ad3ec36c42941af9c13e4086b37f5373cd29ef4d46d6179c948eac2738bcb765bbc58c8c0fc206a4e30267ed62537dc5202c5a717926744b296b2983b8291495161c920cc1258f209640549e5e7cbbe13ba52b762c6767c92a95678e066631b57e256880ae56189b699691999fa294b71135a7537202e8873d2653eacabba9d3082a5f01353b77da1cb4220301b84a14848b94d68309c6a29035e7cbf083bce5e659c0a226274e8534f61021d1743bf66525aa7c62759c9ea85155e139a9cc20f6b0776d567a8f1e697b97ca60982555c0197bae535a0d20ebd00a7774550e928647c40598d16a45da0810399cf38865ceb5c2ed7623ae9f55987fa37cce79aae79030f8c3b90898f758366f7f591452c77ea7c3203c147e591304138568d2257d07689865447179c017b0560b3165673526981c65858e842d913a9c22c0a9aac9fa4e16ea6b128b0bc99ff863b3f40b2819ab2e8a04cb353c7ecb2409e495e617a410e638bcb370b2c887b8adab2b9f95e8e922baacb1d148610cc4748cbf31b88da477029ca130b152dd923bd7796d0128aec6706c204ada1b37dc0149a7c318d8356a4f8c9cf917443fef20b02096579580d82bb8659b18365ba3347b081f42b17c3e2064a441b1a3a876c26060d22c370f82424e9b156145e93894de3ca09e4fa8ba6524eb9ea94980a038b257fb4da57d4c8b40ae5465a3a9c7169ccd30b13295546846a6bdcf13c3230b5a961b1ecf578abfa8bac3542820053717baae30a545261b873f278cefb73edf8cb73b9272dd7552e381da64c055470c199bab07cdc3293c0577d9acd9d9063b536412ac7cdee30a1dcfb6e25dbcedd5425508a1091555998931326fa69c78b5021f818f8a55deee77db38229b4104980c230dbb872cd671fe776a09be47852204c6a339126e3bac2353d36c094506092aa597449241121332900a69f8ba1b79ec56f047cbbfbd6bb2aa08f6e606d54c72cbb758357e49b937590a1191d88ba26ca576ecd320caa1bcbff8533695aa486d222b5749bc8f4297bb7938d5b4cb4f46d6ee701a35a287dc16f7dc1347ee97830ec69cdaa91ee061d3f0c81bdc695cd6939ae56be11681847629ea555747c664b5e111a9ac5159281438729916d45b8f0d3ad0e0514619ca93a8a971e9433c9eaa731192c760c5c5e32259f569dcdf39bba4c1b7269bd98417abfb1521fcbb640030563118e0f35bbfd0665023863e275c7d5319a1087bb2f956d2dd3ade6c37aa09c36cd5aa9ed09b8999c4473665ae2b784197cc9268c57bfb78dfb054bd1278e044582cc3c81c547c50fe7bfc270bf6aba9fc159a5853045af3758a8d552c3881d7c2879dbbb0b79b5a5c2300b5a380ecd199e3309251f9647598b7376290452a575f4ea7071f2a0ebb7b3dd9057350abbc1707e25d0b68d734689f0ac4c9b3242fb703ea6bb7fc064e599ce8f9269a0d63a719879ac8c396d79221babb2c4a0b7d38ac5b7e984f2212c481a353ba6bd95039443658eeab625d3d00faff2509a2c208afbc6016bb5d8726dc74993ad329bb9a554bf61209cc20e521b628d9c89c8fa687eb7464ac51820225b65b2af8489ed896d11825bc4df67f7002453d16875ce21ccf49b +private_key: ba593157e38d7e6735b6159ad0338a4f35cad3b7ae7e79c024b4b913a313d95059e2ac7273692ee4d6217090c1774b4ca473b09214a81a374e5d5350b51c4f52376e3c7a1622cbaa2226965afbcecf5b499ff7220d572db7d7916989cdd4d2ace6cc3a40949b02c52fceeb941ff6b6d2713de078753aa73836d72abfa96ddf790f0b8243c48247abe779db1bcd5ce01bfa061fe1b5436ae7cd7b7a3a65971e35360ac52b9c5b7214478c46f5864948d20396387333d7615f872bb94b0e7d71b2f831a2d30870feb190f42771f1f1b73ed88adf6bb732a1c159147aca38950060394cf04e7150308897b3b76706a17695943500e589b10b348bec1335cce863bf68ba50019c6d072e9a2aaebef070a7d65d5d2a8bc285b22dc91915008e2854a9b408a5e1f847fa492670eab6905a6367528efaf08a688cbc6fc86672e599c3d5ade10a4a92942d5705a03e881eda311cda81982e6aba55f29cfa835b6b19a7e0c39b48939344c1caa5882a7aa86721cb5674a14e62cb613f115e0cc36792467a7dd5701543898ce06223fb505ba4503192747d4295fb57508446c927b1c8378a96b4a56243d257c89993447cc183db3f6db7b8606c21536c01eaf14a7f2931da629365a0b1df157bb60424312155a8e80d049b66e9e134006c64bef8ad0b5a33fe857de7d244b4cc2f0d29a8d50c118540772eca4517712b4aca18f64c758e6698f701804cf0821c178d6d7ba43c2c694e8b4a8a356a8c26894de30658917bbc6331a6e77e6a327aac4ba2b19b02a79484ebf90cc2a235a8737802f7b71e6731f358156232a913b63ba94b932581162b622699659f66c984155187ffe53d8d6a3ee4d84e3b190088e001b3f3aca703a39551bee2a852aa4656f355b05b28194dc025ebca70ef90a47e96049f441082861ba5e563080b27035aaa0ac761c66b6b11978c18d1431d25ce69a6373d869d8ecc72b47550dd901aed51915e61acd36c50cda5ce545b7b3293263ae13880879bf96b7c6915074d46c636f4522f340b993cafd07c91fd646893dca37eda658dbbb52a3211a4e09dc20240a3f8c606a7b095715e5af180167b5807e3b414f69ec28874398b464e08254a60cd9b693b36643d82996ae2c82b8d26bacf106879091500b6a289c4c1a0a7b9c872865498bb2a40455e0ba3b6570a804204afd3942ee6b4169b8842508b9f6a5c1883a3ec98bd8119b147671003472ce1905981326b5057a6ad026843d323cc0593a132114d70cd030aa979d639bf22bcb286c13902cfdeb0beec163f8ab3c377d211b6d502ccc41137db92cdaca20ce5b83c2baa93d5c063db6d419537a7597d03a91f9d214869ca00ae46cab450ce11591cff53610053c3dacc5901a43959e55cc2751f792ac5ed288402782dfa4912989032295b967e4145d7046e76f4079338bc26d4c9f88203ee1412683899ddc534ac37608a6959efc72d7e24582fc9629a20059fb382e5891c85091de6c2600c98c58ea8205d2574c25c9c0d17809ef40d1db44e8ea895c40c8aa2448a6655442f0bb7a160aa8df8ba5faaaee0c19d16dc4d267279c0bba589972948f7c198e8cec71569e9863f968cb5df387c6a350a81f32ad9797c09abaa56083952c0c1b6ec9a50251f3c16859c2c91c0076750016ad3ec36c42941af9c13e4086b37f5373cd29ef4d46d6179c948eac2738bcb765bbc58c8c0fc206a4e30267ed62537dc5202c5a717926744b296b2983b8291495161c920cc1258f209640549e5e7cbbe13ba52b762c6767c92a95678e066631b57e256880ae56189b699691999fa294b71135a7537202e8873d2653eacabba9d3082a5f01353b77da1cb4220301b84a14848b94d68309c6a29035e7cbf083bce5e659c0a226274e8534f61021d1743bf66525aa7c62759c9ea85155e139a9cc20f6b0776d567a8f1e697b97ca60982555c0197bae535a0d20ebd00a7774550e928647c40598d16a45da0810399cf38865ceb5c2ed7623ae9f55987fa37cce79aae79030f8c3b90898f758366f7f591452c77ea7c3203c147e591304138568d2257d07689865447179c017b0560b3165673526981c65858e842d913a9c22c0a9aac9fa4e16ea6b128b0bc99ff863b3f40b2819ab2e8a04cb353c7ecb2409e495e617a410e638bcb370b2c887b8adab2b9f95e8e922baacb1d148610cc4748cbf31b88da477029ca130b152dd923bd7796d0128aec6706c204ada1b37dc0149a7c318d8356a4f8c9cf917443fef20b02096579580d82bb8659b18365ba3347b081f42b17c3e2064a441b1a3a876c26060d22c370f82424e9b156145e93894de3ca09e4fa8ba6524eb9ea94980a038b257fb4da57d4c8b40ae5465a3a9c7169ccd30b13295546846a6bdcf13c3230b5a961b1ecf578abfa8bac3542820053717baae30a545261b873f278cefb73edf8cb73b9272dd7552e381da64c055470c199bab07cdc3293c0577d9acd9d9063b536412ac7cdee30a1dcfb6e25dbcedd5425508a1091555998931326fa69c78b5021f818f8a55deee77db38229b4104980c230dbb872cd671fe776a09be47852204c6a339126e3bac2353d36c094506092aa597449241121332900a69f8ba1b79ec56f047cbbfbd6bb2aa08f6e606d54c72cbb758357e49b937590a1191d88ba26ca576ecd320caa1bcbff8533695aa486d222b5749bc8f4297bb7938d5b4cb4f46d6ee701a35a287dc16f7dc1347ee97830ec69cdaa91ee061d3f0c81bdc695cd6939ae56be11681847629ea555747c664b5e111a9ac5159281438729916d45b8f0d3ad0e0514619ca93a8a971e9433c9eaa731192c760c5c5e32259f569dcdf39bba4c1b7269bd98417abfb1521fcbb640030563118e0f35bbfd0665023863e275c7d5319a1087bb2f956d2dd3ade6c37aa09c36cd5aa9ed09b8999c4473665ae2b784197cc9268c57bfb78dfb054bd1278e044582cc3c81c547c50fe7bfc270bf6aba9fc159a5853045af3758a8d552c3881d7c2879dbbb0b79b5a5c2300b5a380ecd199e3309251f9647598b7376290452a575f4ea7071f2a0ebb7b3dd9057350abbc1707e25d0b68d734689f0ac4c9b3242fb703ea6bb7fc064e599ce8f9269a0d63a719879ac8c396d79221babb2c4a0b7d38ac5b7e984f2212c481a353ba6bd95039443658eeab625d3d00faff2509a2c208afbc6016bb5d8726dc74993ad329bb9a554bf61209cc20e521b628d9c89c8fa687eb7464ac51820225b65b2af8489ed896d11825bc4df67f7002453d16875ce21ccf49bcacca228846450ebb8f04a2a5ef2d919dfa47c4aa265f4cedd10cf74eef3ecc1e63f8ffda3565c2424c89b20974b748a65a5aba75133fcb3156dfb6626a83bab + +# Official test vector 98, seed: "dddca9dc31bea737d3f474e7560b37facb2f53c803e768ffaade7669ff94b1d4fbd17068cffd5dfdd24aadada4ef6b12" +seed: aa6dd1e5799cdf7af9c4fc632b3eb9d51d66e85c8e0a21ec98664fc51ab63c7dfda268813efab5204efa60f78bf81d320d01ac09ac06244f7afbd2d80fd356d9 +public_key: 9734408c884e736a271a17a9a5829a56e4ad6fd90402c18327f4b5b052a5d72585ad276a52228ea0794d4ae19235304674705176f76e909792b32b3f45f3c179464daa653c4885346b0921f72a2e186210542575e7abcc210bb7572c5ba97c475d8ba2810c54b9f23988725dd17967e9764513e1a34e55a9e32b05bd6a030425250a285fb331351ba4470eb2380318c9c7a56ed0664c6a16af63db6dc2a7c1c4e5a901c89ff7a589c099568c9bbb0482b04205595c242c66d99725a17468684b2be16b2757760b72a57974549c44c17bd2aa028a2c2d74b458c2bac3d34537ba095c34459b58aae4940fb3b68a73b28aca34cb018b92f65320bc3c04008394e17215abeb505b4bcd37d473da43569d557eb34b06eeca22c1264db881a6b37bbe9467899117b602304fdb72aaa60bbdba128214cc87fb980c1be3bcf9348bda62ccfa591328901c9b9851e9f9258e2a5f500053f9266891fc1ddf267c58c1aa7db72255f8c277d8535fe48db1d9b12cd97fde35c837d12f6b1c84e2c019e77469350bcb9c3791af132bf2ebc633f3c681e3801d0ba00a30672e955d84930c4012100c18b7a5a342d226341924034ac0953ce15584911d86c0689fd12d3dc4cb2d8748eec4abecc185ff63162e414e709cc3c5163de7b80e9e550d4a0b90de20b2fca850e3b11338bc3b5c369d616a2b64c764f78122abdb66860103371b773586463ea51366792872f36c53603cd876c4aea446e8811feb4417e3f21b94059f1d3c47584c09b128c549e48f6346cc3fa60ad19cb9b65359f04506cf52994ff5225aa24d68a00bc5171e0a492733e726eff02c2b956f9d6a6e7a8519e2b9c4c90b8db6b5447a0b589cb71cf0b74b899272a966c0b0da3824035c70c334818bcdfa2632e7a47ae8119661b96a6b4b17810a8840cc05bb3a0db2c6a60d10cb3e7ca365576250a380fa4b956ce066e72a0d7739a4b4e317988b64270732ff94c319a368cf0b8d8018a2d210bb37c695032a3b4da71e25e2287ef34ed68b5711ca99af1cc6b83caba7eb91d1f10eff920d9b41091e086487cc438e461344905b7e954121948ab8251fb0044e6cd8075f28b70a67132c8362b71b77298c2200e11b3013b6b2ec8b21e7a23a3cb9456567b3a090fbe642a1693501db47f8c4829d86bb1ae7accdd7763fc0b5e754ca5999a1544615dbb1acda7749c1d89073b130a4823600e322904c9599c31b67c963c307987fabc4e482910b57a56e2417eaf978008c9fa38103c15ab1a811b2b198a5b7201ef767a26a758400469ce0b1ca83920fbcbbc51c8697cc4b687d8ba41d45725551a09e5cb230532760cc15292c4ca9cc77f6e215d70c8f6e98b35fb21c5e0993588c8f76775f92c575c013270c167cddfc76de12261e84c1b506737a7448d00a6d07456fabb620d985607a32526d276846cc739276122bc14cae94543e11276805aedf36c404fc079117196383cef2681074f954249b859498a8ede375663755890613b15c2a8ff25ade0abc4d674a050369a596ac3e446cfc3171600367f89c9251e33db95c508e09a64f683fe7420c5ff73ebe5836ebec9e0ef1a39c02acd90275f5d9af9eab8c741023bc91806d255282846cb5fbcef030ee8e721d0566c29f469f5773938d679dbe17bfd7de66be5e +private_key: 632b0098b51f1dc64ab2b096e5ba16867caa3f5621b10c50008939adc17177533cb98244b0bc287309a67ba147c572adae003472437389d957f1d048f4b7c0e8d88469a6a87b771a7bd0a3fd1074f1b29080008fa72c9241e1b7622748d65bc6dd307645419a65fc5ba5d68e66c5ad250897b72c109541422019275b4cabb57a675eb3144be222f417aa85250c773b0689063e89802d6bb4010f4ba0cb57a1c69a5869e5a5508599744321f23496a6a9b8331786ffd2ca9b83b78469089885acc3f46b9f45437ceacf1a9707c394919801bb44f3abcc5a504f466890b15e902b9b97b8197aa19f25a41e0df87eb6b88c0c029aca3534f807837cc2c253a06c375c8728390263a6cb8d240e33c36268d283fe891e8b99bb935a33d15c0c588c82bc2905de885dafda4422e61b43bcc1b8731f1b6a85486988ae392d71aac97d326cd6115e26c23459c74ebf4ac2edc6209933a22e2162da6cca192271517687110c070d6a154a11054421bf8e3a9820f8a77794b3da4931a333928fd37e7c057117fb2f2fe9a19d65907801248a8009d0da2cbf572063ab7bee490f2c930c8ba0709579b9fc11079d48845de37a1af371c6947b12ac4a142250c92c63b7336967ca1797bac7b3a66e5a997672c4431c28a601cc1360689d1cb6304f8cc04f6c3e2f67a2a72746e5221b1d9a6018c4b6f0a6943ae927552968f7877f28cbbc9bcc410afcc780e06d6759aedf4a1b57d7cad7fc89b7b29e03810bd7babc8797768e930dfc3983aaea0a910a359b5c87d088961d529896183627277e707aa88a21096658663cbb756469542e9053f1102a73644d510b69da8b089c73ce4bf4bdc5b72ffcf4cd1c73ce0508393e409eae79c9fbf44b5e36c73d33af7fc9c084c52b3da21a57171eea865efa7c917fe92b52b40e36fc5cd8e961fd207fd7167c7d302137c5841352663a3931e96382966c58c3039e182cb1e0369813bc90312a9ac6026d4f8c24da0445b3687c27a8363d702ab0579bbd3a418fb6af26792bf96281b0373469d96e74803a5658a413f19a43f95e784b91586c14461134811a0c976c25a7b8491514a1ccf83904489585b841884c0ba39046508728dd02a9a3163ec17cb1422c3bd8194f845259952c1bc7da1616748c19e002ab8948bfb00f7b53446bd1138d7b87794423bed453e5a7bb0e915841984bad6cc970f9c95f120855203df5936a8871611ee897f9e050d5a3931c1219f61a8da6d75ba0e85c0a674cc39c583ad01f794b628ae221d9e8aaaada889c43b56602c73ed2cd5fa084c7b207a43360a8c58a3f405bba290b39723b63b10951ecad19dc266d045a49a38857941534f28e775269bab9a381a60e244543b3e26fcbcc0d47575a82da58aca50239da726e0570a8eb3f6714b2fffb9038d42345977fb3156ca1eaab577c0cf4516aeb81bd1f6b92276ac4cd37b67d1b6083e126cc32c91d28c531802e41f707ab740903e5213e2a378397a52793c0b8762d67d846de86520f8745a8112c80f48835a4033ba53ae0e7b43afc44994b13e76663d1e6a2519844ae08536aa055a428af5144be296b43aada192d142ec933546735a6accb4a5a99852ca751c24cae5738a99734408c884e736a271a17a9a5829a56e4ad6fd90402c18327f4b5b052a5d72585ad276a52228ea0794d4ae19235304674705176f76e909792b32b3f45f3c179464daa653c4885346b0921f72a2e186210542575e7abcc210bb7572c5ba97c475d8ba2810c54b9f23988725dd17967e9764513e1a34e55a9e32b05bd6a030425250a285fb331351ba4470eb2380318c9c7a56ed0664c6a16af63db6dc2a7c1c4e5a901c89ff7a589c099568c9bbb0482b04205595c242c66d99725a17468684b2be16b2757760b72a57974549c44c17bd2aa028a2c2d74b458c2bac3d34537ba095c34459b58aae4940fb3b68a73b28aca34cb018b92f65320bc3c04008394e17215abeb505b4bcd37d473da43569d557eb34b06eeca22c1264db881a6b37bbe9467899117b602304fdb72aaa60bbdba128214cc87fb980c1be3bcf9348bda62ccfa591328901c9b9851e9f9258e2a5f500053f9266891fc1ddf267c58c1aa7db72255f8c277d8535fe48db1d9b12cd97fde35c837d12f6b1c84e2c019e77469350bcb9c3791af132bf2ebc633f3c681e3801d0ba00a30672e955d84930c4012100c18b7a5a342d226341924034ac0953ce15584911d86c0689fd12d3dc4cb2d8748eec4abecc185ff63162e414e709cc3c5163de7b80e9e550d4a0b90de20b2fca850e3b11338bc3b5c369d616a2b64c764f78122abdb66860103371b773586463ea51366792872f36c53603cd876c4aea446e8811feb4417e3f21b94059f1d3c47584c09b128c549e48f6346cc3fa60ad19cb9b65359f04506cf52994ff5225aa24d68a00bc5171e0a492733e726eff02c2b956f9d6a6e7a8519e2b9c4c90b8db6b5447a0b589cb71cf0b74b899272a966c0b0da3824035c70c334818bcdfa2632e7a47ae8119661b96a6b4b17810a8840cc05bb3a0db2c6a60d10cb3e7ca365576250a380fa4b956ce066e72a0d7739a4b4e317988b64270732ff94c319a368cf0b8d8018a2d210bb37c695032a3b4da71e25e2287ef34ed68b5711ca99af1cc6b83caba7eb91d1f10eff920d9b41091e086487cc438e461344905b7e954121948ab8251fb0044e6cd8075f28b70a67132c8362b71b77298c2200e11b3013b6b2ec8b21e7a23a3cb9456567b3a090fbe642a1693501db47f8c4829d86bb1ae7accdd7763fc0b5e754ca5999a1544615dbb1acda7749c1d89073b130a4823600e322904c9599c31b67c963c307987fabc4e482910b57a56e2417eaf978008c9fa38103c15ab1a811b2b198a5b7201ef767a26a758400469ce0b1ca83920fbcbbc51c8697cc4b687d8ba41d45725551a09e5cb230532760cc15292c4ca9cc77f6e215d70c8f6e98b35fb21c5e0993588c8f76775f92c575c013270c167cddfc76de12261e84c1b506737a7448d00a6d07456fabb620d985607a32526d276846cc739276122bc14cae94543e11276805aedf36c404fc079117196383cef2681074f954249b859498a8ede375663755890613b15c2a8ff25ade0abc4d674a050369a596ac3e446cfc3171600367f89c9251e33db95c508e09a64f683fe7420c5ff73ebe5836ebec9e0ef1a39c02acd90275f5d9af9eab8c741023bc91806d255282846cb5fbcef030ee8e721d0566c29f469f5773938d679dbe17bfd7de66be5e4126f5151d1b086e26a88bd9f20710ef06aa0f834722b801f6b79c031f1f9213fda268813efab5204efa60f78bf81d320d01ac09ac06244f7afbd2d80fd356d9 + +# Official test vector 99, seed: "2a6f7386b815366f572aeb6c79e272cc21b7095fe09575f18072c9d677da23bc9c8a4bc393b7524604d299bedd260c8b" +seed: 195d6c86a3df4c21e3007d7f2768b43c74cb3060e0eca77f0a5d3271542b9a84ae77e0f9f21eabd8c0c6eea7767f4e10fde5c2d79b8400bf96b19014b457ec21 +public_key: 5fe1c21f16c49f6b02f2450f4ac135a9eaa5e24a3e3f350a6982b5979a93120285dac88e01923060a795d251c1fedb130828582c95ca7340b2e8e105cfd64f63e63f85a955dcc4b12b0482d0994df7ec61b8b09aa4d1b8ceb94b769a2ae12031d16c05cada3a4d0350e8d970ccf716953543a984cdb086c425915858d454880c97505bbb9ac7cfa54055526689033c8241300e11d09283441043b91354d1c0dcb4a869f225c8ba5b290a77629004ba336c8975366002667c99b88b53a4b08ab564733b5d2a3011f944b2259845dcb6ab8956836656e3370f5981203943b343389f2a98cdc96bc1a996648580b7fe837817ac4db31a2d325a869950a32d99446256cb3d8b91c159683bc8c1ff41287ca54530e84082bbafad485c0f179781950a4722c9114485f6b403f3760678e3bbefda309adc41ca562dbcb739654abc6cb05216807e2fe18fbb485977380d8c0282e271c7f1f8c14694484b76241a1b0cf3928ad9e328357ab75fe909957419defc8e0da3469e7720a5e91df7c4857ed50b89d18ffaf6a045e2c950e178adec7a3d690fa23527d3d353d8731857018d7cc909d081cab0370cfcc8bf8f5463a4fa8706a1abdf2c6a7fe8c834a4ccd8b6c869c6bf93c808a43274620b30aff22bbce53a7ff85145779cba220dabd1b597f4515c1664a374a64ae18884b0919668a70b371e24d2ac1a84af7de3b84f804e105177f6a9b914cb5dce45c678c886b3b24e3649cb194c548fba4114f278a56a4310a7cf1cb16e8ecc0b0fb8a2685b30631753b7f87eec8578684a67634119fe8cb334b67b741305aee8762639a212b9baab4032653b1537327eba5b6fed245d17631e748532426c5a4f4646716521dcc72f4c34a38bc87a892650def1bf09991e4c175d0baa1bf6469277f75a2812aacb88534c491f4d3c884a4470f01b805efc160ec17f68b0b0eb9910889a02467232fdb268848a5d6969c91410775fe717c9103cffb9a2bc13b1bbba01abb92ae303abfefc51af169d25d29316e7a12a5bca6827c25df567ef0c20f13a6fd728a32e229f72b42e74470c88c105bec0a12a1810c3d2a3d84b89a8c9bf66cc305f0b0c3fb989c3541daf147d5b02813e7904cc18a5dbb6632af4a34cd42007f09ab4a88c1705958058bbd6f996fe7642a0b45b690317d0e658ea82094d6b8d55722123fc1bd349433ad4850b19a4f6616685767e67bc21333a9f667a6c422087398b3331c075cea9aea6e29e424653d5e7a86766613732343341491726869eda4f97f1982e62c4cf135b1553a0a842b35e8ac23f29a921039bf31833f12ca8c4f02021559e1ab5bc37d247a5078280f02956ba2e2f897b48e18a769908e6b8b15c63b5a780580d02b5f70749a5442c824a0f56cb00378bc0ea2b033fbc9d45d535ecc00f5579a687865702436d3065461a06c8b274561d938d92290a8c0bbc0cc746aeb253e4823f8bd7b6becb5b1f8a5403fcb40efa5f6c34c43620921a416aa769a6ea1ca15c765d0e53c70b0a719f7b47ff783b63701af5a9cfe704c7d99830734c1b1fe00a1d9166b11060baa09501715310b93ead6825ba9998d922ae362092349aa45abb04781a98b25989e8309c40698a2676b49fbdca7775f554d2448358e6a4bf5373892b712b63af3392fa95dea1a8 +private_key: 2feaa7e47b8e973ca66cd8be82e5983d295eee270134086481a92e55d3a282cb4e702b234e3a49ae7b532f6183e0b57e4cf688121a5da377aafdd36f1180816ed91c28038776169ea0a11937e229f7b57447f4295f457bdd89191d6a89f6a7146b55a5cd16c743bc3f3f60bdac4c1ee7727946157bf1929d6b7c15836c6b28445601497e07376426239aa3c0bc8135570d9623ad828f858a6ec5e4946f189864e87249eb574875409aa22967141380c633ece33567da5811b9a40759403becc297ab63622bb9f0b5cbf52378be037882ac9b25414817b4784101683b8696a6f9178323762bc419fe939ab0c8640422743b3a7e628382d36bc42afc4dd206a160dab1d1551b0e7a349e14b5b66077d6b85082306b1dd83ad0b16157e0c1b910a5d3fa562ff2c008804f6c1caa8f18336082ac4f8abce7d4a1e680361140b69b80574658c6f6f0a4d27104dcf29c55c74500db129e55114121764152c0eafc1e88350816057197466b50da92cc034996001a503040b7847fafa5950e8acda9a3c3eaa6b7e475c806401be2183100447d82284515a1a191d01ec7ea8eba84701feb15bd149af2e66cb3844204e3bca83976a088a291fb6c70425a09e42d292b1afeb0c0ac94361b5673ffc25a4b5812d211b0aad388fe1538a5929edcabb11e317de597b8db653cdc552938925a2be642fcb78bbc271584a8b27904c4fb6001304822cba9b96b9b0a79901668236494d68a455129e9869693dab64d4b13b7ca6fad71942b955c1356735b0a27aa037b420300983155c96903bd4b1235c21e8273416660b5b977ce37b6b44bbb09bd197a97cca98cb87a2ff1bc9c0a051ed98560b6b761055d84143f052a686bb3623da02a208b184d1426683484a7594aa22cc705173024f35b8e24977d421606197e0c21c9d145c316b7cedaa13202dc2cd4c62224e01eaf865f7b018a4a938920f848f436ae530a591a2617aa97143f8ab2005b9f9b734c82145c34567c59518a8ca13100ea8b4e3420d698450b70237765b62e433cdd2a842468bcdb42a639aa9644d89f4840351f3096f5c67cf17baad6cba5c79c002ae25a55f224e3b577111b4647e0cb0cb12907554fb96b77a8f267593a3f506b1cf53b6a01136edc0a684e2b8b4825066053c8c232b736c321f1708226fc3a131b1073867cc0872c53a85426ca1bc3756b329598072a352ab82fa8a61429a58ef21c2833d1bde2c1a919c75ad52a4162abbe2829b2fe93c7990ac7cfec8eea930fc5cb9ca13b2da2e80de600325d965982626f001371f59aabff88c74e028c49d5ac3c766efea499e2375a330c91385831e990cd69d6cc8a415a4e563eafa0319607b171b130ac842c66589dcae283af2b884beb6b6ec84e48f037afab54fc2c6486a7a13c9c3396d3b6512a576cb87599aa7aedc97275766d6a96af28327dedb27386923b98b647d5003d5edc718b0477a5164000799ca30c08e8f8a9ee728cd0b0aef4c16b1d61c751e32463e4b785223bee6227e3f88fcb469cf250a64bc7a3149ab3edaa730d6b4e6920b7b5c2bd55b97473b91c3c1c5923067c08db693c97ae832427dc6439576749df139e19d9580ab8c49eb15b80e09e6845335fe1c21f16c49f6b02f2450f4ac135a9eaa5e24a3e3f350a6982b5979a93120285dac88e01923060a795d251c1fedb130828582c95ca7340b2e8e105cfd64f63e63f85a955dcc4b12b0482d0994df7ec61b8b09aa4d1b8ceb94b769a2ae12031d16c05cada3a4d0350e8d970ccf716953543a984cdb086c425915858d454880c97505bbb9ac7cfa54055526689033c8241300e11d09283441043b91354d1c0dcb4a869f225c8ba5b290a77629004ba336c8975366002667c99b88b53a4b08ab564733b5d2a3011f944b2259845dcb6ab8956836656e3370f5981203943b343389f2a98cdc96bc1a996648580b7fe837817ac4db31a2d325a869950a32d99446256cb3d8b91c159683bc8c1ff41287ca54530e84082bbafad485c0f179781950a4722c9114485f6b403f3760678e3bbefda309adc41ca562dbcb739654abc6cb05216807e2fe18fbb485977380d8c0282e271c7f1f8c14694484b76241a1b0cf3928ad9e328357ab75fe909957419defc8e0da3469e7720a5e91df7c4857ed50b89d18ffaf6a045e2c950e178adec7a3d690fa23527d3d353d8731857018d7cc909d081cab0370cfcc8bf8f5463a4fa8706a1abdf2c6a7fe8c834a4ccd8b6c869c6bf93c808a43274620b30aff22bbce53a7ff85145779cba220dabd1b597f4515c1664a374a64ae18884b0919668a70b371e24d2ac1a84af7de3b84f804e105177f6a9b914cb5dce45c678c886b3b24e3649cb194c548fba4114f278a56a4310a7cf1cb16e8ecc0b0fb8a2685b30631753b7f87eec8578684a67634119fe8cb334b67b741305aee8762639a212b9baab4032653b1537327eba5b6fed245d17631e748532426c5a4f4646716521dcc72f4c34a38bc87a892650def1bf09991e4c175d0baa1bf6469277f75a2812aacb88534c491f4d3c884a4470f01b805efc160ec17f68b0b0eb9910889a02467232fdb268848a5d6969c91410775fe717c9103cffb9a2bc13b1bbba01abb92ae303abfefc51af169d25d29316e7a12a5bca6827c25df567ef0c20f13a6fd728a32e229f72b42e74470c88c105bec0a12a1810c3d2a3d84b89a8c9bf66cc305f0b0c3fb989c3541daf147d5b02813e7904cc18a5dbb6632af4a34cd42007f09ab4a88c1705958058bbd6f996fe7642a0b45b690317d0e658ea82094d6b8d55722123fc1bd349433ad4850b19a4f6616685767e67bc21333a9f667a6c422087398b3331c075cea9aea6e29e424653d5e7a86766613732343341491726869eda4f97f1982e62c4cf135b1553a0a842b35e8ac23f29a921039bf31833f12ca8c4f02021559e1ab5bc37d247a5078280f02956ba2e2f897b48e18a769908e6b8b15c63b5a780580d02b5f70749a5442c824a0f56cb00378bc0ea2b033fbc9d45d535ecc00f5579a687865702436d3065461a06c8b274561d938d92290a8c0bbc0cc746aeb253e4823f8bd7b6becb5b1f8a5403fcb40efa5f6c34c43620921a416aa769a6ea1ca15c765d0e53c70b0a719f7b47ff783b63701af5a9cfe704c7d99830734c1b1fe00a1d9166b11060baa09501715310b93ead6825ba9998d922ae362092349aa45abb04781a98b25989e8309c40698a2676b49fbdca7775f554d2448358e6a4bf5373892b712b63af3392fa95dea1a8b6f12914ed31f14f79c652eed4db478de7ebd263fe27052509fee10b50f2d053ae77e0f9f21eabd8c0c6eea7767f4e10fde5c2d79b8400bf96b19014b457ec21 diff --git a/regress/lib/libcrypto/mlkem/mlkem768_nist_decap_tests.txt b/regress/lib/libcrypto/mlkem/mlkem768_nist_decap_tests.txt new file mode 100644 index 000000000..784fea358 --- /dev/null +++ b/regress/lib/libcrypto/mlkem/mlkem768_nist_decap_tests.txt @@ -0,0 +1,32 @@ +[dk: 1E4AC87B1A692A529FDBBAB93374C57D110B10F2B1DDEBAC0D196B7BA631B8E9293028A8F379888C422DC8D32BBF226010C2C1EC73189080456B0564B258B0F23131BC79C8E8C11CEF3938B243C5CE9C0EDD37C8F9D29877DBBB615B9B5AC3C948487E467196A9143EFBC7CEDB64B45D4ACDA2666CBC2804F2C8662E128F6A9969EC15BC0B9351F6F96346AA7ABC743A14FA030E37A2E7597BDDFC5A22F9CEDAF8614832527210B26F024C7F6C0DCF551E97A4858764C321D1834AD51D75BB246D277237B7BD41DC4362D063F4298292272D01011780B79856B296C4E946658B79603197C9B2A99EC66ACB06CE2F69B5A5A61E9BD06AD443CEB0C74ED65345A903B614E81368AAC2B3D2A79CA8CCAA1C3B88FB82A36632860B3F7950833FD0212EC96EDE4AB6F5A0BDA3EC6060A658F9457F6CC87C6B620C1A1451987486E496612A101D0E9C20577C571EDB5282608BF4E1AC926C0DB1C82A504A799D89885CA6252BD5B1C183AF701392A407C05B848C2A3016C40613F02A449B3C7926DA067A533116506840097510460BBFD36073DCB0BFA009B36A9123EAA68F835F74A01B00D2097835964DF521CE9210789C30B7F06E5844B444C53322396E4799BAF6A88AF7315860D0192D48C2C0DA6B5BA64325543ACDF5900E8BC477AB05820072D463AFFED097E062BD78C99D12B385131A241B708865B4190AF69EA0A64DB71448A60829369C7555198E438C9ABC310BC70101913BB12FAA5BEEF975841617C847CD6B336F877987753822020B92C4CC97055C9B1E0B128BF11F505005B6AB0E627795A20609EFA991E598B80F37B1C6A1C3A1E9AEE7028F77570AB2139128A00108C50EB305CDB8F9A603A6B078413F6F9B14C6D82B5199CE59D887902A281A027B717495FE12672A127BBF9B256C43720D7C160B281C12757DA135B1933352BE4AB67E40248AFC318E2370C3B8208E695BDF337459B9ACBFE5B487F76E9B4B4001D6CF90CA8C699A174D42972DC733F33389FDF59A1DABA81D834955027334185AD02C76CF294846CA9294BA0ED66741DDEC791CAB34196AC5657C5A78321B56C33306B5102397A5C09C3508F76B48282459F81D0C72A43F737BC2F12F45422628B67DB51AC1424276A6C08C3F7615665BBB8E928148A270F991BCF365A90F87C30687B68809C91F231813B866BEA82E30374D80AA0C02973437498A53B14BF6B6CA1ED76AB8A20D54A083F4A26B7C038D81967640C20BF4431E71DACCE8577B21240E494C31F2D877DAF4924FD39D82D6167FBCC1F9C5A259F843E30987CCC4BCE7493A2404B5E44387F707425781B743FB555685584E2557CC038B1A9B3F4043121F5472EB2B96E5941FEC011CEEA50791636C6ABC26C1377EE3B5146FC7C85CB335B1E795EEC2033EE44B9AA90685245EF7B4436C000E66BC8BCBF1CDB803AC1421B1FDB266D5291C8310373A8A3CE9562AB197953871AB99F382CC5AA9C0F273D1DCA55D2712853871E1A83CB3B85450F76D3F3C42BAB5505F7212FDB6B8B7F6029972A8F3751E4C94C1108B02D6AC79F8D938F05A1B2C229B14B42B31B01A364017E59578C6B033833774CB9B570F9086B722903B375446B495D8A29BF80751877A80FB724A0210C3E1692F397C2F1DDC2E6BA17AF81B92ACFABEF5F7573CB493D184027B718238C89A3549B8905B28A83362867C082D3019D3CA70700731CEB73E8472C1A3A093361C5FEA6A7D40955D07A41B64E50081A361B604CC518447C8E25765AB7D68B243275207AF8CA6564A4CB1E94199DBA1878C59BEC809AB48B2F211BADC6A1998D9C7227C1303F469D46A9C7E5303F98ABA67569AE8227C16BA1FB3244466A25E7F823671810CC26206FEB29C7E2A1A91959EEB03A98252A4F7412674EB9A4B277E1F2595FCA64033B41B40330812E9735B7C607501CD8183A22AFC3392553744F33C4D202526945C6D78A60E201A16987A6FA59D94464B56506556784824A07058F57320E76C825B9347F2936F4A0E5CDAA18CF8833945AE312A36B5F5A3810AAC82381FDAE4CB9C6831D8EB8ABAB850416443D739086B1C326FC2A3975704E396A59680C3B5F360F5480D2B62169CD94CA71B37BC5878BA2985E068BA050B2CE50726D4B4451B77AAA8676EAE094982210192197B1E92A27F59868B78867887B9A70C32AF84630AA908814379E6519150BA16439B5E2B0603D06AA6674557F5B0983E5CB6A97596069B01BB3128C416680657204FD07640392E16B19F337A99A304844E1AA474E9C799062971F672268960F5A82F950070BBE9C2A71950A3785BDF0B8440255ED63928D257845168B1ECCC4191325AA76645719B28EBD89302DC6723C786DF5217B243099CA78238E57E64692F206B177ABC259660395CD7860FB35A16F6B2FE6548C85AB66330C517FA74CDF3CB49D26B1181901AF775A1E180813B6A24C456829B5C38104ECE43C76A437A6A33B6FC6C5E65C8A89466C1425485B29B9E1854368AFCA353E143D0A90A6C6C9E7FDB62A606856B5614F12B64B796020C3534C3605CFDC73B86714F411850228A28B8F4B49E663416C84F7E381F6AF1071343BF9D39B45439240CC03897295FEA080B14BB2D8119A880E164495C61BEBC7139C11857C85E1750338D6343913706A507C9566464CD2837CF914D1A3C35E89B235C6AB7ED078BED234757C02EF6993D4A273CB8150528DA4D76708177E9425546C83E147039766603B30DA6268F4598A53194240A2832A3D67533B5056F9AAAC61B4B17B9A2693AA0D58891E6CC56CDD772410900C405AF20B903797C64876915C37B8487A1449CE924CD345C29A36E08238F7A157CC7E516AB5BA73C8063F726BB5A0A0319E57127438C7FC601C99CCAAE4C1A83726FDCB5045ED1A82A985EA995396D77272C66CE493289F6110910F37C2741CE47026A6F8261999C6482572B1693912EF12EEBEA7ACF9234FB409F2A6090E6B0BFD895469D0B2A921BB723F87A33EA5465AB90F514B67698C0768B6CA498B022C512FA0875F054AA2265867E31C0E522651E024A07D60DD9F633166921F4126BC2B6AA01CC15A09B85BFF8218C5AAE95BC1FFB26AE5A137670F04910CA9D7241B6660C394C5455917746A26682FB71A432EA9530E839BDEB07433004F45A0DDAA0B24E3A566A540815F281E3FC259AC6CBC0ACB8D62268B603BC676AB415C474BB94873E4487AE31A4E3845C79901550890EE8784EEF904FEE62BA8C5F952C68413052E0A7E3388BB8FF0AD602AE3EA14D9DF6DD5E4CC6A381A41DA5C137ECC49DF587E178EAF47702EC623780691A3233F69F12BD9C9B9637C51378AD71A831055277254CC63C5AD4CB76B4AB82E5FCA135E8D26A6B3A89FA5B6F] + +c: 74A26C7D27146A22C7EAB420134E973799CEC1DA2DF61AE0FA7905A3A47485A063076BFA22D6E4FE5059DE0A32E38F11ABD63F990E91BD0E3A5BC6E710DFE5DC0F6D4A18147EBC2E2D9B179374D83692C53EFBD45F28A2A928C2494F903576C410EB1773895EBEADB119960EEBDA9C3C710795A6D9B781FC58B30D08107F4E20944A382AFB079F31D21724F2C26E6A53412F0A908BE7586F2B3D6D7C1DEA0270E98AA209244BD88ED68AAE01432342BA5F49E015CB476B5B78D15EA77A354CC9E9FD07137D8760BE42FD4746C62C02028E7B405DDC95DF3D021921CFEDDB3D961B957ECA302A263DAB2DC117BEB3E79EFACFCF936DFC09FC0D19C358D724FA381EA06CA067C384E944302C3907AB15A1DA4B41352692ADD59B061541F07EFF25EC42F46E1A0E370CAD06FF3FD997D4D2C5648AF762231B382D0593401936CBA21551A2AE30D8E8EFFCF43916B83138BB5E610364429879FA9CDD5B7D3CF2FEABAA1DC8D50CE69402E21103E795DF7074D1FCF65F8A4E18986D5417780602C63BE5A044863384BD3D8FFB685EAC567ED8349DCF2CEB702B7375B145729998049D13E2CD466CF2231B9D3A20018EE908F8514A6C6A89DF7232F91FCD84B81EBC8BC539E9A37A4324755564BE1BF4FA1FB4571E0ABBC9B52F9D090C33BE599DE6C8532C7CB7EC8B4E2D3C07505280E99923865903FFD18BC13B9C8164AA1EAE84E38D3F57FDB8801785F105A6A8574BD2FE9BF305848E525330BC2D24F0257E47A4950F433A9233E8CDEBA81DBAE7D8C1A06D01F70DE6EF663207D84952827BAB3D451CBEA0990007FBDB4240FE899A706F7C1563E05C70BE9D575189EF83E0CF76195F6652491CCE04F1CE2092170A92E0DD7301246A4C44FC0B4EE6AAA63FC7027840ABD2EC25F654589738CD38B9E10B975CFB6C1D2EB4DA97736998F84FDDDD810D72DA3C5AB13507420DDBFAA4F7750C1FAE9C7DFB30F40A12AEA689FC78DA900020E3ABB32A364D5C6B3C7544A1B5734A41E95C8314B448CD0B738D829AF772A8F81C51ADBA2D85F326C8F5D6961CF12D44A9BEDEA00D1DF5B48F429B1CE0C15EA5F5BC10B017247BA2C6BE922B0563B8E9698677CB6C45CCF2081BF84219D2904C11FF92199F8AEFAD62D8608E200802C5A07202CC820E9E520E31BF36A83002ECA4018B0B3A398801562AA86C77AB0D50A8FBC3768B0A643B97E7F9072168DE29B8175999C9AA48D301A3F0303172E9C7D4F16329D5CA9D42397C3982E10C9DA42DE88BD6C2AB91C1E71E778E58BB8F801F207A88A9B47F9C687AFBBA34EDA6D2899E4FA0008AA2B539711753DC7C07F614E814F683D6C037562AE1FBBE6D7D5FA54B7A6D9451E11B01AACCC3BF2ED64742DD100E0EAB2DF6CCCF937B6D5981ECA0E01F3245CF26A72AD1ADF066C8F5430D72F509963A657D85E554C14E26E8BEC5D5F3AB998C9B29F16B04747D80749B30E51FD2A7F690C22F9986AAF6358D6FAB8DED54971B32641DE2B258590EEAA6BF1F32324A7C4C983F49466D86 +k: 3D23B10DF232A180786F61261E85278251746580BEBCA6ACBAD60AEF6952BE69 + +c: 39EFB90089F1DC32A54370B3EEDF2B12880DC7D657F0404E41F7DAAA73E7F06CB90BBEEC7544160768EC3B56681D057AE1DB58F0123286D3A8CDD0B414CF9894FDA1CFF3A37CF67B82C5C7AD3427F2F2B393978B94E524F33334E4A98AFFEA8D7514D6E12E85086E58A0C078EBA64435441F3E3702EA27EEA984E46893BB886572491F22AE09F8D50774B4DDD5CF478CB0B2D070437E86645EF62AA83599093732F81A75D1D5DE15C31EC81AC4D67852FDE089D580B71E3DB07C71394424E0936BF74D0C9405BD3DFB60B920E7EFA38C72D5912BBD301BD3F3709CBEEEB7BFD0767B77A8639913E8C228FBB7E3E13C423BF05AC65B7E75F29C9048F161AF1B4B41C495ADB53FECC57FED0DCF792050A2A586C33AA4A7F6BCDA9068EA295FB692BDCA756FCC47CA0A8C84DB5DCB6A616605F3D3A34C4D23EC14942492C07EF123C8D084DF21F3B2141D277FA16E3CF4D5A3AB8D78CE8370F411DF737647A2D6123120AEE1CCF7DEFC35A5408FA6013E94703E8E04C50BADCBBF2E1FF0FB82DB4AAC595B9EAA9E370C9C6175CEF20B1D0B8A4309AB91918451E6C8A6DF04AE468D446FD9E83F9252F145A2B44A19E7B27DA56044717DB5A6ED5F6E5CDD90208ABC324290292B1F2E84FB69F5989D9921DCB4F058DCAF7B99DF71B26BD1090E457767954B8ACC84FDDFD663D64027528077B3C9E370600942E4C1175B487FBF25E267474B5238576010CCCE3315CEDD5634658B2028F3FB9959D77FA23756DB4878697C9BC491DBD68986B9073D187F2A9E72C943D94C97DA865CFD9C23508105637FED62E56E745555909A49D23B86E620D48FD55A92CC2266C38B857F5DF9BB683D60B084819CF04F5BB8CBED05AC6F48C518EDB5B222F5E6DCBB438182A7BA3B2279E5856828CBE9BDA6009A70D20DA082D2FFBD092EDAD4B272E46D215B8ECC26222499F024327A391CEB007789757FF8FA8267429F0534F305F75709DCC4229803EA8E612F55890C5FDF8252794D5C9C4058C2258A5599BA858A02F89A6FDB35C4F2364A4C6B326A31F7D04F62C2FAFE51D280CD7A4CAB66404FDFD033EADD07974BCAA7F0CB7401B9484DAF9F325B6BA53FBF41219384B264F24AA8D65281693295E6F71FCA885F808026829A3FC32DC9603F0CED36F0B58A296B44ADDA3AAF10638C31F354D1A5AC34E77D4D0154C9546709E920258F73E039FBC223EE74A270840165F64E3051B10B5E63F9ACCF5D1EF40E43F5823B15F8C25CAFCE698A64F9AE316D3905B8E510C56CF7544CA94719735A640F2B8C3A2B828A04E0568863937595E5B9DADA33533D9D676AA657FE69152E93159A00C5962F4DFF9C901A9AB32DB28B93F4BA780E44A2F73878AA76E112E3490205AF83000EFD889FCEEA5E87AE9AE01EE1CCF6BA0461A8D8654B7702C09BB41C4F61A00D05F031B244EDED8D1CAC7916BEB9AA67A3880F4C3516A8D8204932EA00EFB3AA20369FB6BE404843C7411E88428568AB9A39124EAD115298D49C998651E5EF613A6819336683 +k: 1D2DCACEC14CBB78FE9E418937835EED088CC0683300C965EF3972081F01C4E9 + +c: A5C81C76C24305E1CE5D8135D41523682E9EE6D7B40AD41DF1F37C9B17DCE78076019A6B0B7C95C9BE7AF29507B2D5A6987C8EE3259190855243E6E56F5620608C52D96FAB103A8700FBA1A87DCA6078118A0871762C9534C0C0C3978C91C3A01F0F608DCF757815438FE8957C8A859183B1B6721A0865BEBC799D4E5C0E7BD3EAE4858E6AB6A2E7658ED80D4ED158B036B93FA03AFA6AE3136CF3D693C911BCC75905E5B0CB2865B9E9884522A77777613E53111D5A1C7D3DAB734CEB03657AE0C89763E99471054776BAE7D51B0E73A5BB35AEC30FF6BC93684916FEF1162586452F426653E2CA844D5744307FF9AEB287A6447783B21A0E939C81421D631F5DCB452E51ED34E3DAD1CF504E0A3B0F4711A8DC6499D1691D109569336CE1558A4C0A464E2087EA8F9E3B18F747EF61F4576AEB42B17CADB7F0FD84DA8E3A6F471D95EDFA65BE9E6C9F6AE756A22A4F1A5C543C26BA7BAD88E16D5F5B7E12E2D4CA34B3A64D17F87CCFC4FF8C5E4F53752A077C68721E8CC817F9FF24876170FF2AF89FA95855A5B1DE347C07FDDBCFE7264AA5ED6401491561D831538F852B0ED7B9E8EBAFFC060284F22D2BAEE56FA9F6D01432A115A2D6A64C38AE0A50BA362FB57B53E3E855B83CE8C42274045599F65FA6A8921D85F94ED230B516712DB6FD2FF28B3A3371D9BE058AE75C2FA591B7EC3C3DAA1F7642BC26C324C08090607E6662154DB37CF747967A1F9FC29089F570EBE60EEEF89FD24481028C85AEF1DC3B09F22CD3691BBBB821C7A8A0F35AD12BE1DD199B977048F3D48C16BB2CA94CECB8928770D5BB329A0327E0B286FAA1C65281031A31C84F2EDC9C04D475ED4E128E51EFA97D0148CBA6C95F674C589F301C265BED708E9AD8DA3C5CECBDEEED35EF1E253132BA89920D786B88230B013BCF2DC92D6B157AFA8DA8592CD0743D4982BE60D7C2D5C472AB9FA7F4CC3D12B0EBAF0ABE555C75805426844DD9428643F84406A1B8D6FAEDFD8AE6E73A72772A2159ACABD972AEB6F7DE091AC5FDD7F49A3DC6641CDF62446B4B04A31F73B80A62F80A404A8CB18CE3E65480EF7B52BF0091117E5D08EAE1B0AABB72E6DFFFF76F6E44BBD7EA570D6604BC2E74318BAFA315A38861AA1B21AFB2A53F2614F1D640075984AE62E2FCA1D1B4DB369F15705CE7D4DF8AE98264501051C0DEF21D645D49625AF02CA428D9F0C2CD9FBAEEAB97E8E9151662B6992B4C99AB1B925D08920363373F76D3FDF0828CAA69C8B1BDC6F521DF641CF1C8A4E7EF0C23289A4E2CF18ACEBBE4C1E68369BD5235120142ECDD1A73811E2E533A647D7AEE16DAA03B683639DCF1E1F1E71CFAED48F69AEC3E831733DA19CEBEC1DDBF71CBAE0800F2F6D64A096EC495D62F4344F7AA5621B322353A795AA099EA3A070272D053D4653A20CF210EAAF12CAE6023D8E5118DF04B384A44D1EDB91C44989EF7EE57F2BF81A24BDC76807DA967EE6525410C5C485067EFC3D39A9AD42CC753BAA59A1FD28AF35C00D18A406A28FC79BA +k: DC5B8888BC1EBA5C1969C21164EA43E22E7AC0CD012A2F26CB8C487E69EF7CE4 + +c: 0BAF0F6E91ECAE3199F4921631891A14C13B418B53384992DA3A8DADA7DEFFB9E1E5F559D27344B60BE81ECD01CAB1E316573D571ED46F59248F4023DB0282207E730549CDB60E793E4CD17AC6F2800E2D1FFB83477A6FE1D73992682123EA730C63269DB13088D6DA46D086CCEA2176398EAC663270B8B2F337A55E19F4C500DE066B5441794C2D0CCADFE5ABDE7D93FD7D6468BC4F925633366D9316788B90B110A4D99485E7E578537A267744FB266A4F243FA02E3A81DA67ED477923B36B37BE21DDA21EB51DCA1F0CE41652145F4C542B2E5C922617033608246BBE2B5250A368804ABDB2EF6C31C491CE3DD852AEABF6EEF1530F4C99286B4B595D57CF3A99580B59AAA2C55E080B5230EA19CF2701D21A37FEFD6F9709657A21ADD063ECBC197B5AD068BE502A2E090D83F4156B671E46617BE6D6A17D0425FAC565C4A0E48966E9D900CB2C2B0D296E0BAA9D6C5E0514CD78834053058A97D3DDF81529079858737440812670E818C9891681D350ECEC93DAE389D534A5C78F01811917061CAC0003D2BEA390EB63FA0FE9BABCD7FF302D4B66567B2BFA67B20F962847D010AA4193CBE9F8CC1B14F8B237C22675B298A8376DFB6037BF7CEA36BDEAD5B505111F67730824B4964815D00F63EE98B9BEA0F2F47CC007D5606ED7F967CB15CCD4AFBC99881CFD297BDC2A509ED3CB320DF58DC4A5BCD1CB100B9D6418CB8E0F40DEF293DA2370CA729B0FAB071FA6AEB0F3F5D1925AB2DF732F98DDBFF23D5411E4921A1C506F2F93251E822C4CF83998B000FE65ED386F5745B1D4D91AD9F98B45E713C8D944409E9D354F42FDB9749A5107C8831562E683498C55E1475E552AC10858AB9867BF8003FB88B3B09F6E8AD8E94CE82E342B1780D68EC8565FC0684AB6C798BF09FA65BE62C37A0862ABFE99D7DBE1431B4CFE007B7EC7930B14F6D161BDCAAE2217D69D9FDBB4F882B9F464F8642ACD9BA018B93A8E3A965194ACCD96E661CF0CF4A2662076E20E8BC319693F1953DAB93FEB9BCAD666832DF42F250FADBCFAF742D68642021BD6FFD97720C3E5AB86D82CE8B14C0289DBF51B50C13CFCEC12A3922DCD2DE8473329AEB23580B22F9C36B4F06D6579751BE0593120F808F0E145D94D1DDBBE1D489B744CF6C35964C3DD96D95FB693543C69766877DA80BDE8ACDF62C366D0A4A553187461F671376F7E70F554965D57760CDF5C6F6366E33B3BFB550CC1F93D98D250F90D7D36BC01581C49417546BF6BBA9D10D41C0A008855F321547BDD5A6CFA2A2516F71415B5BC2D5FA1B9B79FDC7F2B78AA113375EC1717F0F273BD8CBEF59139518A4E8A67DB4D071257000336BB07497F72FAAC2C1FC0F553B2EBA53475F466A2B36AFE0B72B4342E995C544E6E14FF7D327F80E7AC6F65190045F380B5978F50E33272484626266125A39DA08B46256624CE34223BB17299B8B8162753812F2644C9A13C51430B02ABD188DD1A4547C920BA27CDAF145BDEBC6F45EEE3F2F55553010F7B35AC63A3C7C61C +k: DCBEB5E4E8B14BD3031D5916BA03258119A5DACDAC850CB483BD7AA80B7038D8 + +c: 2513DE1E55ED0E862614587FE47F308C90A1F426470CA1293BDDF7B9DDD6C368DC152F45C71354904ED48E15A1CB449B4C45D0F201ED5C7D3A047A72F080265D66C47D39469097EEEABBAA3B07ED1F1AEAB80C7D24552FA8889C674A5D4840289DE6B0FA9A222E693708D1F252DFE8B993956883C07067C1C0844EF0BEB49F63534D21D471D6B727FFC59477F9E89E5BEB2AF0CBEB052F003414DA4070008753CFC0C6D0FA9D1C15388FE5886EADD3474F28E4682C0E01784A037DC3799330EA380767B0D0B6EDFC9730E04D1039548A6F83889098522EBAB684DA6FE26A4A6891D86D40FCD9A24F743D74B23B1596810727C81BB3F9F3BADFAE9997949EE0E24987FA182A00D73DCEADF667E90E5AE76A1F83A91FCEA78C96269F0C9501F1D4CE682506A7EA89302A1480E18CDC1F6D57B5312EAF808895B20897E9A782F916CD75B4981DA1381F14EB1EC248B27F0E6966A0CD75414A735928B2120615D88FA57AF5C40E61750F0A0F8E605747E7C32D5A23F14124969C072E949C8475E3108D689D2D20797FE14618811E9A497FD26B9E71355852D4B36340B61695E3745F8D07644AC6E2C18B3FC276D4D19DB69A7CF26086F172E2BCE1618A740A0C739FD504F72C2A72ADB5564BC85DAB4C9CE790D78D14D3BD242DF04106D96CE7C3B392CCED9B99DF359FD51F306CBCBD5B46B8487CD7B7EDD3C5C02965C84630DA1B6B8B317FE55F7C79E05CDAC9E863023DAF470E9C3FB8C01FDF3AEDF2193BFA69A806E2E70151ABCF96D31CF6A317C059CA8C7D456A8E5EBAA6C1283A319F188AAA80D8301E321754E5FB4E0B25594B01BC5F82FF25B064C766424D658459EFD7A20B65DB181811E6D5A4BD153F7066BD7757D2D417D21F83D7C4CB6A0703A42032F0FD198D9D8B0F91B359FBE908432C3286E1EF9D601702157EFBAB68E0E7136BFC90D26BD8A9A7018DE4C4BF05CE465F917D20A4F221A4EE78813A1E8A117C8470929701CCC201A85E7F18B6BC96FE80B1E074661525D3FD0CE2565AB11155DAFE4D3410328D6DBB4DD99A84FE96283D32322522B88B3AA2A11C0324B1D5556EF408D37B0DF802D163FE38D7C38916A26810BD175D22762353C3175DC6040C899E07A339CD4DDBD4D5549E02C0D691263936A9F63111412B60AA9F57486334E40B2BC1B8EAA487A094E45C3F77F72EA741CE225ECBE2B5E4A1FC080070A658FDF9E2B388722855267B30D94B63C3ED35D475B7EB22E3D2462ABA9CF2A86B738EBB270AB29708A2614A557E33A620B507286E5D4CA57E2CEEDB9965FF1C3E1777F980CDFB1445BBE0B6ACBA0216980F962FBFABE265B3ADFE8641088287468827AE601B6A165DEED39C0E8773BF2046BBF63634BDBCAF98358D25FDE475781733DDE8C6D6383D13B6D48FF1B65E2FF13AAA9CCCFC3C626935C5270F9E23A71A87CF2BD793CB175D23EA5FBD82C18A1822428C32DB9E31B94BE3144ABB00F5ACAAA431C17386719C3FF47C38720B1AB01889DAD877BADC9FC716F648FC8B551F +k: 2C37C49E94DF715B3C09E63A39E04DB8D26BD2B9072C9B21076BDFC0B608534C + +c: 8A4336FDDB3F55D16ADBBE54C6EF0DB27F20679393D86EA4590CB6F5F09BC4EB76181A13C9826FBD2A7174BE8A11F13759EE23DA15337A4C5612480E0A843CC6D04F3A902E144EFDC0AC118BF8553B984E758E6D7ED1373B20A5726271C5F4B542FCCD6379671CE37A5D0128F55539B9A855172CA2DA3BB6823484A87DC2333F56CBADF4A694A5DAE341A0E3FBB3D852929FBAFBF4A5C12CD3494CDF910010A0FAFBC09B375BABFFDEACCD12E6E7BD347CBFBD0C84CDABB5004CA11DDC6D14C1BD700FE3EB2371E3293F7185E2A065532C3B6529E60240E7AB6456139D66745F17B94FDF2C54B13EE4DEBF1B77099718804BAEAAACD2BC60A190487CDC76AF2EEB906E4C9F2664A30FAFB65013B8CA393793B650CAC4A93377A6511D739C2136CEC59E1BD14584989A591E1F3B7F6D7237AEDB556880810FABDB1D7F8250B61A2D16A3337DA65AEA644D7E2226BE5F24CBE01C8A33A4CCA06F6F646A3F5453FE2D9FDEA8D8613F491BCF2AEA950DB1D9B43C7C3F86FA2F4A51CB44EB9761363C38723852925247D92E37FC694D2CB00248023D5448CDE2867125250B17388440C188F7E500CEF7747A101E0BF2521E2C8A2D04F42D834C0274ECBC73E94612CCDB1C4B908BAF63C09C945AD4645912A0666E9844A1614B7F34415C1842F9B1C7DAF7EE4459A8724B7050F6B5833341691019149F351A7F11AE2416DCD5B36F18B1A4B82CC3E924114CFC126CA309E319D497A594B0AB2AFB58C19DEF3BC3AD885B29AEAC81F346A19683B8577F4A1E0F30BDC85A3814CD1196E6B29E55E5C0E4E028872477CB675B2408E136D15E54C85E8A468423CB795D9348BFCC975B4EC20A23991E6E9EF91D676983AC26B66C71548FB46C4BF06E280D7C55E7B8DB90743A8F893F95AEB4DED1DC65C5E0B61FBAD9DA0DDAC274591AA6CF23C79C09414356584F0BE02CE9B500A3EE6BD4FA0119783F50E800ED36D3A4445934DCFD87A31AF3ABC02CAC39C4B28068EECC6D16B6FA187A073BA143209C0F38AFE100BC700D461B1B364ED298AAFDFC716FA6E3870E6258B66645091FCF9413EDF6BC79B75132A46D1DFBBCE3CE9B0558EF003929CC6E3D57BC4FD3092EEAC4ED71B7B7FC70D0E65901DC9196928C5B8CF4A63C62797727C192CF1CE4315120A57D4C8CFD03143AF8754432EEBADCADBCD26C2E3A14BB43A951AFDC19EE67AAEC5DE0722E9D11E3627AD1B624ADF0FB6FD2A6733B2B1B1411DD14EE87AD3BCBBCAD2EB4A38EA00575BFA99332400083FC519C3733F6EDCCAAF71D09A7164E18A9E9587A8D9B9A46563FD3F14BFA2F2B8EBD9FDEAAEF466E591F502151E43A7E1123273E5E0574814B20253A17917D7BDF8370BC50461AC8D86127DC527B8290FE386F1AC1E6E9D7B493BB7FEDEC9E5A82DC1402DEAE71B18AB4B658E43F707259039EB9978D4FB0D62839A0DD8E3A1183CE330D57BC7927F7CCF06BA10A0478B7E2EC818195171AFF75C29B283E759F4D2F5D55F0FFC35E0581D98E582107BF64A6D80603 +k: 47033B02A6DC056FFEB5FC1E96205C166374AB84A5F3F7B06427BB006E71A5A4 + +c: 6095A951753A644DD898D69138B4E521A704DCFAAD44EB53E284F836A469349C5B9279248AFC57AC93FA34A643DE02B724615CF5865927FED60A6B41E4AB15B4DA3599F13D2C1996C6D6989443BE6FB81F5BA03BDD53462BE5812A3E177876A102B0EBDFCB16DE7B29B5123A79DD82E5CD47ABA02759FAF5401E3BF03144A90AE957EC04DB9864ADE1C5A700CEC7872CCB64FF931984DDC3FB8D4971D761E5544130278C75A1B04E641E070A747789A71E09409C155C7D341D5F828A575EE74439155930DF22FD7716185BDF917472432A30A6762C9FE1A254442F755804D295B1698B47A67BBFDE178200F9CC3D4C705F4AC1B00C372D468E16ED3CBAAA862A2574A9574A7280878BB82DA7BD1B2A58943456838F2E6AA9F6EF1827C5B24FA09DE07E9B3153B0F44A4F2AEA7610F9CCA92565740E7295BA3AC5764A20A44D4E1862E55B1DF7913B279F438B3B34E0C22FD90E06497F7DCF8D62352447C2B8C51C214796194CDF66D5001278D0D55F82FA31DAA72BA6CDA34E60D696ED79C7056BFE97265F3D1BC07719B745ADD4A83404D91A184E629FC24AE236CF6AFAE46295D24B431D819E366F51E1BB2B44B1FB7A3060091DEA1D416268CA550EE4E41FCA1F387E941DBE4EBAE222D3CF625632D1A61414038FD437BFA20005EBC404ADCDE2DC10DB741A3B7534C40822520C4703FDFB6B380F7DB72B725B330D0C20DF256BBDDC31E0EA20E636A9FAE310185A5081923BAFE041AC6FCD4E73F5F7237142B74681F637996D28C3FDE6052243269D19316C56993722EADF19A985E579ED559F971E69EB5125937EBC80ECD15A4F80D7067905A4D39C6220EFE43883CF22E9A366F8911E21D0491B8FF61FD07B733E707A08DB400E438DAA00D481C5AC62064CF47AFE3AB08027B3890E8C8835CEAF8128F9D887A6CB7FDE879D9611C01281A0F02DE0E969C9131F8512138036EC1967DCA45AA30BE8C5B1008113E17A91D9F8E9995C07C0B13A45668C96356F09C3E08FE4C7DF5F7230E0C93EEF08E8958B55E213718C516E624B57765257D21696A3458FFBA11DE708C4EE9AF2EDC5F37458DEC8B985076882D3F4DEB00BFD8E7EA4D57BAEAEC6BABC0E28C15419CCD785CF6ACEC96D1111CDD1DA9A151F59A7366B64A53F0497D3B5A8ECB60D7C220E99126CDE82938C7E131BD841300AE461A1817703ED5B0510B47F2C2980F1E11CFBECB524B295C42187F15B0C9F6B0EB1E70B3EC43ED955528B1E42E2BCB31F3A1CFB5E9C807E8D366E9227A87784748B277D6C885B1385C6C691B3DBD7841DD89721B3A8BF96EBA99C53D4BB3B41DB9409B992BCC2D8FC53E70723CA1FDC1341A3E608D7F62F2322C6A9BA1316639690A22AECEE364B4F13949A0310FBA1A0E35DDA5FF840DABAC55041B0931D9EBEC89B78DD930512340B4B5D0877AF546FF0F342FB76B647D604EE2E20207924F39907D6E72DD4A9A1ED0B6D7364CCE69981F56CBDEDD51CBAF6FDDB36E327AD65D4FE283D253E6BF3C7969FFF1F34DCC742 +k: F0CF9CF06A81EE545A33B310616117D6096FB56F0D4F7E49FE0A37550320D3C4 + +c: 2AACD2E6B884BE6A3DDD80155BDCA80EBAF0E2BF714312BBA30D5B367F2D95AC7BEC3965AB05AFA370A42A512B5EFE4B0DEFF3E163AF186B725BCAFD2AFB2BD2A0DBAB74C2BF9362E27D69B6B4B5AA6500EBC9316EA4112745F1C6E98F2DEF9132C7C0BFFEAAFAF994C89B96D3F436B875178963FBC18D2E06ECAF3871787C1AE93B3210896837EC1DA87F0FD8F14AB7C5CB2531E90F415FEBDA378E5492E1DEC8243FE2E8A7BAA6FB6A034D9C524E99D848A804F150915BFD66067C8603B5DB0FE29E27D3F6CA629E96BF3E9C77A5919701EC19646C69A73DFAAB0ABA28FE3E9EAAEB475A441B9B0D62B259DC6B77DEC964AB57D5D776988D54E6246C526F1E8EFDF454E7F0DDAED5363CE02B279CD3B554C251793C3A616C07A7BABA8062919A2B46C64C152BC887A27E382254EA6D50CCC0702B7BC0994BAC09B7891FA64A773AE0B4FBF8204C13A4950FC2C4DF60CEFED7582FD9FBB8C83442517BA0E3B60D9A04FBB24ABCECB303E3FDD37F1037741FD2489F632192A6B9C122A7344CB781A0F61D5011EB0251A842AD4838F9B8D52E21A783F0D839E8BA221CCDD6B968A2B5FD21B8458BF53C9C8076AC0C52C0F53097ED1C25C9F6F12407772D6743EB8E0CE8B1A926F0FDD0DB00482D9590675E56D4509CB5E5F32FC3B4A2DAB2BA080F9A7CDD0B611742A8F83CEE1B091E629D2A0371FDB5A64412B5FA63716961527640D02885C4A09B04A3A6F5EC01A9E0DBB8FC4DDD9E05BDB240AC4878F0D41461C4661777417D6150422FEAB6A39F156CADB5F5D3BEBE417BABCEFF5AAD1B7A624FC23ABE28B2AB2E8273E8F44636A60CDAD9236DCB02FCF87722C899AA321C564B25BC33B4976BC9603BB8B8AB18B5B04625981FB38B2A42722CE2358FC0BA99EF4B122C7B70BB347D0D482DA30638EF8B9C1D9121D83BCDBBEB2A608617054F4B3FDD33E9A08F8DF999A98E715DBF04F8EFACF123BBEB37B9038E9AD906E3C570BB398C10E6D36647A2B0B2731FD39F726171EFC7321BC67D936F7989EA58336E549A34B73F097E3EA2C25887EC6A2E9FED5D2CFF475E99F392162D959DE1C4A4DAD3C96542756AEC3367F7B2515F2225BF7B704B780A6D0B279B8B4EE4879A9BBB2F3303216CBADEA00D229C03E3E2843892FA8E5B0A600D0E3EBDD14FA229819CE9C10B8D5F393DE0119A5B509B80D56B06783447F931177123824910C9BFDE9A29FBA0252E69A90B3E717832866115C06EA73B033EC3B0D45DFDB69A76B484DB0BE7A81215B3817E1C02F9A5DEE8967B147DF9F63C93A6E396DE4251A5A706DFDE9670B8B2F6C4C3E2509142256FDDA905C125FBBB294EB29A3B4D9BE3B67762AFC049B96B3F41B8C31BC5D7B522DCD1AD12B252370A8A57E42F6A9AC26FF784B374DA4B86FFDB65CC753CD049F1A21CF832447E1DF7BA7D0D11E403FC18BC545501E16568595AEB6BD7811C214CF2FB1CDFB07BB32321F536E3896B6EF4D16130ADD71B271CD1027E35538D9E475A3A53DFEA430C151DF7D516CD0D9B +k: 0EA983FF9D76F056AA42BB772AA27C8A163172F43E6BC9BC55B83038E095792B + +c: 8FFBC80E4662864D6F373DC8837AA91B3CC26B68124ABD73DAD025A1D1C18829DCF077D303579E5F39F4BE101BB9E355DFB5323882EACB3D184E6812C03A7BEBE25166D55F821A00F80B8D2BAB1A7EEC83D384AFDF30F6BBC9960C4662067EF7E200E37268B9F5348FF484642799258B45E541101A21FDD6FBFAA2374A28FAA97204953B95BBD1BB519785210DA7C8A09D071D8AFC9B29F2C3C2909A4C53671408B8083BCF5AE03D45C0CFBA399F44D24A06321BB74F6863B7D4BF0BFE73C8AF8EE1DDA45212E3F9C853D4D0E16F8EBDB8581C4ADEEE833D81A9E0A9E8587E9C19E689E6DF715564BCE27CFA73BA16226A77CE44DC496992F41AB918643C6D86A8B26ABA6F94F3502D22DD94FE55483F67C635B307745D33F17133293639118E70CE42C6DB7332D4862C73D5B84415454AD51F89B5559B5C85D6B6ED47B6958F21FBC2ADF8C8A9D43FD2E1B0C02418D227B83F85CBC3A81C719E8602781AE71E15E6D714919E52FCCCFD9A68B4751825BFBB53B7940B15B546158DBBC612E602F660B9E0FF439E0156C4C8792346014BA1B4838C7425AB34744DE51D854CBBA58B7E67E014122518036CE1541A1675AFEAE4F29A5318602ABBD0A1540F33176C984E306098DBD08E822ABB55F9FF38D9E31EA4695150F2CB60BC2EB5F4780CBEBB210CF48662C454C7A42360F306FB03617C998AD8A9297D6B71A71285F7AE8DFB336FA922540C92DC71F777D3B4D11D87B8D082FA8A00DF647CF7FEB27403D3CF50D829EEE3575A01E2CCA57849B11B14F001BE180DD5FA13C03B98EDEA6358C5AB30A526027CB45E33E646B37988CC84B979CC5CFC3BFDA05BD2C7B8CB1B11AFEE007E20FCCF8D0F764F4A6D2F6A8B74281800CBDCBBCF0DF1EC9D27E6A94968604D9EFD37928B6856C48F0108155595D03231DFC22DC0C8EE614090F37E0828B48A4DD371C677B5DBA95E417F12C9A396875FB05623F7A544AEAE41A0AA536FB8D767BA2E14752C84E147149F655AE7B903CAA591AE00267ADD3EA816612AB0B9A5FB263C70C4367062F7794274C75AC66F706AE93699859D55B2E4960E9D538F38A2FAEE366B80DC78BB673A9E1B057D711F9DDB3770947E6DD7BCFB425B96670506758AEA39A5ECB33A1B76B822AF903787DA3B61A7B9263C0FAE1B729B1A2E16FEB50C32A8728181D4E8A9F8376C39F6AABC2C022306B05E494CF9B6ADEEEC95887440508981D6A74707FCEFA24B9F0DC3AABC984E9C44174E6DFB51FCF4588C57F9659A8E7A6FAEAFBAE7ABE4600444936B3763463D4AE411DDC1C98585E0DE58867251079BE72075973275141801B98F7B9397C096A56B8CD83CFBD374E182F7DCC9A7C764DBBF4D7576A1CC9239848E7295D29CF034A1A7AE33A386C3DDC24A535168ED23D7ADE9433B50DC5694C969F4C546EF2293CD842F4B62B6B7435F597CF5C1733884E0A6AA47FA31887DEDC6C402D8ED013E49E5CAD7718CCEFEE0E6A041715CC9ADD79965413049ABCE88636AA7543EE2601F162838EF6B +k: 342765B77A09BA6863F2ADA782E3719803F7AB714EE807DE89A1617B5C74F60F + +c: 17976BAC62F66CEF2B6F947C121079B6F2E9350C137E738BFD884FF2BA6E211640A30FBF2695EDF7046E1F5234AB1C8A9B0E8A3FF88EF18C1E5512D5F69E4A36CC9362F00920481E5460B1FB0C2B9FF0CD0D95718966AF7EC1F76B8DA93F6AB179A5DE70DEE34C579E284AE8504ED96E1A85898076F69AAFEC1357533EBB636FBA2372204DAB87C47AF27D4D9EB1B4FF4286D6A9FA7FD506C9FEBA596D2047DB765C1EBF1F7921867D394487F6BE926E6B0323058CB591195436ECC805C8B88615C7A03833AABF490337063DFEED698F7DA8DD589A794C956C2BF8D8CA4AE18B0A7767693802BD6DD53F543E105EC526C1D1D00AC9C0B606BD9B3A1D52CB8C56F8535ECADD8239308F2FE7E1D7BFAC5848B547B4579AFC13A0B2BEDEFA46322F92E2B73980695369C5F48D37F9345F20C7820DB6DE09D5E8313B73ED705B33646FB14CC4D40D65290A4C27360FBBD080E61A16BB15E9560A097E4AEC16F8B8030FAE1D47E024F10C33E6A1C56AEB8EC2F6AD6EF4B8FF04C67307B23E470FB3E5BCB6F533F955C36FDB46516A07DFF2956130AD0924158CC2A083378FB9AE32DE89CF774D82C2FC70DA48536372299C61927A5AE67E55E792B64FE61F06EFFC1F216CC9D739ADBF3B2190E1D080E00F169F145FE32AF7EC7CBA1D76FA6839D5FD2068E1DFFF557755FF2F4271204A5468C79C7BB8D00FAD63938F12D53B243B3FF866556913EB57AD2AE034F8B62B1A1B9DA2B1D45800B4CEF1E1943A0C92F0EF2EE924F80CF67EBD3D0199D45ED4DCC00140829A0992DB43616CC468508B852EB822066A05CC91D6BC2B47E5622B774F8128ECBBB94CADD15588B36A71E9FD97B05D69E8BAF00D30A3D3C00E663E00AFC9F5E1BAC8534ED5F6E5AB47D7EFDF6537753408299A9E8D5F5AE0FE36A9EC41C6DC9F78A891BFA9C8E90AA1A457A0C01AF70CBC9E55B68A5D8CC5CD3BD6886AE11FF510C6ED0EB2F5C081B25989518BA217BC1C153864E5BB312EF0D43D6DA4A0FDE44F1157CD238E8D70BEB420BD310F8E5DB9D74EF4EC9980CBA74358FC77C5D4FAE3036E176647D78C73900C79BFBF0BC545ABF7CBB4DC7F6041D4FA3B66E4D4655E24B11DC30B0061C452A605CE73362F2A3F052370D873FC68DFFCD3999FDEDB45DD9F2A02B4699BCF1FC5F888B019B5028465F30AEFAD946D481285D1122EA78F3BD8B1982558C38FA3DF0F058B12EEBB11F4C7809F6334EA1D7FE0B529C0BC9C67044648178D2AE9232E4E88DD6D0016D8A590B7703F1A017A4A2671BBB24FA97ADE1B61C489AFE9B3E63CF4CCC42168C98880921C2C0EA7D24DB6DD676B77F7B6C0525C8D0578C7F5A20DBF2F82873904D7CF2522CE6360397B254B18C3059A4BEA169A44D9BA17CFDA1827EABECD269FD391CBC0D49D71FA81AC16F9A0DED9E72A58D1BC2262979D8D7E531D1C46A8F107BDA18A1D2CCD17334183DD3E79D905ACA7DAD348BC6D5CE124A1397EB3B89BE7580720B5DD00BD3A63DAD813E0E967EFEDF17F3D960E70A4F83F +k: F175CA29D36784E3B7A6F6D8682DE3548115C25EC1751DAF6B5FC3318F690802 + diff --git a/regress/lib/libcrypto/mlkem/mlkem768_nist_keygen_tests.txt b/regress/lib/libcrypto/mlkem/mlkem768_nist_keygen_tests.txt new file mode 100644 index 000000000..9a988c84a --- /dev/null +++ b/regress/lib/libcrypto/mlkem/mlkem768_nist_keygen_tests.txt @@ -0,0 +1,125 @@ +z: A85768F3486BD32A01BF9A8F21EA938E648EAE4E5448C34C3EB88820B159EEDD +d: E34A701C4C87582F42264EE422D3C684D97611F2523EFE0C998AF05056D693DC +ek: 6D14A071F7CC452558D5E71A7B087062ECB1386844588246126402B1FA1637733CD5F60CC84BCB646A7892614D7C51B1C7F1A2799132F13427DC482158DA254470A59E00A4E49686FDC077559367270C2153F11007592C9C4310CF8A12C6A8713BD6BB51F3124F989BA0D54073CC242E0968780B875A869EFB851586B9A868A384B9E6821B201B932C455369A739EC22569C977C212B381871813656AF5B567EF893B584624C863A259000F17B254B98B185097C50EBB68B244342E05D4DE520125B8E1033B1436093ACE7CE8E71B458D525673363045A3B3EEA9455428A398705A42327ADB3774B7057F42B017EC0739A983F19E8214D09195FA24D2D571DB73C19A6F8460E50830D415F627B88E94A7B153791A0C0C7E9484C74D53C714889F0E321B6660A532A5BC0E557FBCA35E29BC611200ED3C633077A4D873C5CC67006B753BF6D6B7AF6CA402AB618236C0AFFBC801F8222FBC36CE0984E2B18C944BBCBEF03B1E1361C1F44B0D734AFB1566CFF8744DA8B9943D6B45A3C09030702CA201FFE20CB7EC5B0D4149EE2C28E8B23374F471B57150D0EC9336261A2D5CB84A3ACACC4289473A4C0ABC617C9ABC178734434C82E1685588A5C2EA2678F6B3C2228733130C466E5B86EF491153E48662247B875D201020B566B81B64D839AB4633BAA8ACE202BAAB4496297F9807ADBBB1E332C6F8022B2A18CFDD4A82530B6D3F007C3353898D966CC2C21CB4244BD00443F209870ACC42BC33068C724EC17223619C1093CCA6AEB29500664D1225036B4B81091906969481F1C723C140B9D6C168F5B64BEA69C5FD6385DF7364B8723BCC85E038C7E464A900D68A2127818994217AEC8BDB39A970A9963DE93688E2AC82ABCC22FB9277BA22009E878381A38163901C7D4C85019538D35CAAE9C41AF8C929EE20BB08CA619E72C2F2262C1C9938572551AC02DC9268FBCC35D79011C3C090AD40A4F111C9BE55C427EB796C1932D8673579AF1B4C638B0944489012A2559A3B02481B01AC30BA8960F80C0C2B3947D36A12C080498BEE448716C973416C8242804A3DA099EE137B0BA90FE4A5C6A89200276A0CFB643EC2C56A2D708D7B4373E44C1502A763A600586E6CDA6273897D44448287DC2E602DC39200BF6166236559FD12A60892AEB153DD651BB469910B4B34669F91DA8654D1EB72EB6E02800B3B0A7D0A48C836854D3A83E65569CB7230BB44F3F143A6DEC5F2C39AB90F274F2088BD3D6A6FCA0070273BEDC84777FB52E3C558B0AE06183D5A48D452F68E15207F861627ACA14279630F82EC3A0CA078633B600AFA79743A600215BE5637458CE2CE8AFF5A08EB5017B2C766577479F8DC6BF9F5CC75089932161B96CEA406620AEDB630407F7687EBBB4814C7981637A48A90DE68031E062A7AF7612B4F5C7A6DA86BD136529E64295A5613EA73BD3D4448CB81F243135C0A660BEB9C17E651DEF469A7D90A15D3481090BCBF227012328941FA46F39C5006AD93D458AA6ADD655862B418C3094F551460DF2153A5810A7DA74F0614C2588BE49DC6F5E88154642BD1D3762563326433507156A57C57694BDD26E7A246FEB723AED67B04887C8E476B48CAB59E5362F26A9EF50C2BC80BA146226216FE62968A60D04E8C170D741C7A2B0E1ABDAC968 +dk: 98A1B2DA4A65CFB5845EA7311E6A06DB731F1590C41EE74BA10782715B35A3102DF637872BE65BAB37A1DE2511D703C70247B35EF27435485024D93FD9E77C43804F371749BA00B20A8C5C588BC9ABE068AEAAA938517EBFE53B6B663282903DCD189736D7296816C733A1C77C6375E5397C0F189BBFE47643A61F58F8A3C6911BE4611A8C7BC050021163D0A404DC14065748FF29BE60D2B9FDCC8FFD98C587F38C67115786464BDB342B17E897D64617CBFB117973A5458977A7D7617A1B4D83BA03C611138A4673B1EB34B078033F97CFFE80C146A26943F842B976327BF1CBC60119525BB9A3C03493349000DD8F51BA21A2E92361762324600E0C13AAA6CB69BFB24276483F6B02421259B7585263C1A028D682C508BBC2801A56E98B8F620B0483D79B5AD8585AC0A475BAC77865194196338791B7985A05D109395CCA8932722A91950D37E12B891420A52B62CBFA815DF6174CE00E68BCA75D4838CA280F713C7E6924AFD95BAA0D01ADA637B158347034C0AB1A7183331A820ACBCB83193A1A94C8F7E384AED0C35ED3CB3397BB638086E7A35A6408A3A4B90CE953707C19BC46C3B2DA3B2EE32319C56B928032B5ED1256D0753D341423E9DB139DE7714FF075CAF58FD9F57D1A54019B5926406830DAE29A875302A81256F4D6CF5E74034EA614BF70C2764B20C9589CDB5C25761A04E58292907C578A94A35836BEE3112DC2C3AE2192C9DEAA304B29C7FEA1BDF47B3B6BCBA2C0E55C9CDB6DE7149E9CB17917718F12C8032DE1ADE0648D405519C70719BECC701845CF9F4B912FE71983CA34F9018C7CA7BB2F6C5D7F8C5B297359EC75209C2543FF11C4244977C5969524EC454D44C323FCCA94ACAC273A0EC49B4A8A585BCE7A5B305C04C3506422580357016A850C3F7EE17205A77B291C7731C9836C02AEE5406F63C6A07A214382AA15336C05D1045588107645EA7DE6870FC0E55E1540974301C42EC14105518680F688ABE4CE453738FE471B87FC31F5C68A39E68AF51B0240B90E0364B04BAC43D6FB68AB65AE028B62BD683B7D28AD38806BEE725B5B2416A8D79C16EC2A99EA4A8D92A2F5052E67F97352289761C5C39FC5C742E9C0A740CA59FC0182F709D01B5187F00063DAAB397596EEA4A31BDBCBD4C1BB0C55BE7C6850FDA9326B353E288C5013226C3C3923A791609E8002E73A5F7B6BB4A877B1FDF53BB2BAB3DD424D31BBB448E609A66B0E343C286E8760312B6D37AA5201D21F53503D88389ADCA21C70FB6C0FC9C69D6616C9EA3780E35565C0C97C15179C95343ECC5E1C2A24DE4699F6875EA2FA2DD3E357BC43914795207E026B850A2237950C108A512FC88C22488112607088185FB0E09C2C4197A83687266BAB2E583E21C40F4CC008FE652804D8223F1520A90B0D5385C7553CC767C58D120CCD3EF5B5D1A6CD7BC00DFF1321B2F2C432B64EFB8A3F5D0064B3F34293026C851C2DED68B9DFF4A28F6A8D225535E0477084430CFFDA0AC0552F9A212785B749913A06FA2274C0D15BAD325458D323EF6BAE13C0010D525C1D5269973AC29BDA7C983746918BA0E002588E30375D78329E6B8BA8C4462A692FB6083842B8C8C92C60F252726D14A071F7CC452558D5E71A7B087062ECB1386844588246126402B1FA1637733CD5F60CC84BCB646A7892614D7C51B1C7F1A2799132F13427DC482158DA254470A59E00A4E49686FDC077559367270C2153F11007592C9C4310CF8A12C6A8713BD6BB51F3124F989BA0D54073CC242E0968780B875A869EFB851586B9A868A384B9E6821B201B932C455369A739EC22569C977C212B381871813656AF5B567EF893B584624C863A259000F17B254B98B185097C50EBB68B244342E05D4DE520125B8E1033B1436093ACE7CE8E71B458D525673363045A3B3EEA9455428A398705A42327ADB3774B7057F42B017EC0739A983F19E8214D09195FA24D2D571DB73C19A6F8460E50830D415F627B88E94A7B153791A0C0C7E9484C74D53C714889F0E321B6660A532A5BC0E557FBCA35E29BC611200ED3C633077A4D873C5CC67006B753BF6D6B7AF6CA402AB618236C0AFFBC801F8222FBC36CE0984E2B18C944BBCBEF03B1E1361C1F44B0D734AFB1566CFF8744DA8B9943D6B45A3C09030702CA201FFE20CB7EC5B0D4149EE2C28E8B23374F471B57150D0EC9336261A2D5CB84A3ACACC4289473A4C0ABC617C9ABC178734434C82E1685588A5C2EA2678F6B3C2228733130C466E5B86EF491153E48662247B875D201020B566B81B64D839AB4633BAA8ACE202BAAB4496297F9807ADBBB1E332C6F8022B2A18CFDD4A82530B6D3F007C3353898D966CC2C21CB4244BD00443F209870ACC42BC33068C724EC17223619C1093CCA6AEB29500664D1225036B4B81091906969481F1C723C140B9D6C168F5B64BEA69C5FD6385DF7364B8723BCC85E038C7E464A900D68A2127818994217AEC8BDB39A970A9963DE93688E2AC82ABCC22FB9277BA22009E878381A38163901C7D4C85019538D35CAAE9C41AF8C929EE20BB08CA619E72C2F2262C1C9938572551AC02DC9268FBCC35D79011C3C090AD40A4F111C9BE55C427EB796C1932D8673579AF1B4C638B0944489012A2559A3B02481B01AC30BA8960F80C0C2B3947D36A12C080498BEE448716C973416C8242804A3DA099EE137B0BA90FE4A5C6A89200276A0CFB643EC2C56A2D708D7B4373E44C1502A763A600586E6CDA6273897D44448287DC2E602DC39200BF6166236559FD12A60892AEB153DD651BB469910B4B34669F91DA8654D1EB72EB6E02800B3B0A7D0A48C836854D3A83E65569CB7230BB44F3F143A6DEC5F2C39AB90F274F2088BD3D6A6FCA0070273BEDC84777FB52E3C558B0AE06183D5A48D452F68E15207F861627ACA14279630F82EC3A0CA078633B600AFA79743A600215BE5637458CE2CE8AFF5A08EB5017B2C766577479F8DC6BF9F5CC75089932161B96CEA406620AEDB630407F7687EBBB4814C7981637A48A90DE68031E062A7AF7612B4F5C7A6DA86BD136529E64295A5613EA73BD3D4448CB81F243135C0A660BEB9C17E651DEF469A7D90A15D3481090BCBF227012328941FA46F39C5006AD93D458AA6ADD655862B418C3094F551460DF2153A5810A7DA74F0614C2588BE49DC6F5E88154642BD1D3762563326433507156A57C57694BDD26E7A246FEB723AED67B04887C8E476B48CAB59E5362F26A9EF50C2BC80BA146226216FE62968A60D04E8C170D741C7A2B0E1ABDAC968E29020839D052FA372585627F8B59EE312AE414C979D825F06A6929A79625718A85768F3486BD32A01BF9A8F21EA938E648EAE4E5448C34C3EB88820B159EEDD + +z: DF0F282411F4A071489A8F618E2AE5AEF40131CAC5233D6D731522720C2FEB1C +d: 444F032DD19AE7518C4B35B0732A41DC567845ABA8BD7B04A9C413A0CF2DE0B5 +ek: 5CC523B2D908C45907A6694A665195171A5B2FB583A5C240CADCA8F0E83E46B14052C9620D3B7EF386CE8B9A5E873B65693B0D341C6EB2D10CE5E937CFB8C4C9134401BABFEEBBAECF47113A34B9C6E011BDC78A54F2B7BF36A5FFD27563D7443F2109F02A64C421411DDB2D1404A86F793A2DE62CDC560BFD6604D4B6330BA6AA621414E8C12DC71C25652ABAF36B875DE1978DD209AB53B885206C3A1B4F8B4A0670C087CDA9CDA7997437155659255C2D024822A448CE5157CF5B6E4C495A949960886A902C79591120117C4A73CE7B380C661851E1CA9EF1973D8A9D2A191B938C4110259C4227B600BA7EC9B033BB0300715032836573382445435A743CA61E923B18ADEC7CFAF10ADE908E582560EE91ACA012942319B4888109E55AA738A7BCF777C92B4B09A50A1C043C982C2C2357F73C1687B35BD123FC905E1A719353466A42B915DBF1A1750339BF0923419681E4531D97E2160AD896DB056570570510FB711169AF2DE0CBA51C5F5056242965AD429301E7020AE0141F845833A3FBA0B192426C001A7147C2926805CD86725442CADC2636BB769DCDE46D1BD12D30F4695593B5753870EF796FB2F3A53F283D5828B77CB75D5DE1BA25357C290A957FD501AEE0AE59D7AE97833B0BB640F781A08BD256C79117C220BDD83280A0069B29A645720096D297A2E5245439268C0ED01F75A939978372B9E05D93DA899C10BF6CDB18698C46EBE00BF90730E2EA393014461DEC6C87F17B2EE16C13B8507C6009BEE074F17367A5FC3067A28B7D804C32860EDE650E6FE85CF6E301D1B1647323199CA296ABC54D2811507572B5DFF92B54E3786D130938417624775D8534B0102B6B8006803DDB376EB830D1CA80E717BB7F260A5CA4A56BFC5DA790151725942AE7C42B2B9E385B4E0F995D4402161070B73A6BB0CDB77EF11B1286D75E315635E719088DC7909D026B198AC93BB4B6FE395843A4428F75C0C1448C605A8CABA0B8CD19CE465764B523628B3334E3885D68D5089E1A3045840C36A73AEFE7B93AB357FD8A46D7547A8EFB243E4953E67CA72CFA0B77835768AA0CD2D976820A97BC21C7033084AD45C0BF6B483ACA8A485641EB55A47BE36ABCEB96143BA90C515D5BE8513BB994CFA88FF4B3600E34C1E656877606B6280384A0F481458044C47732FA9B58195A5DFB48636E1558C56A43CB6941DEE5AEB1E27B89A7121BE166879B62BC01619A9ABE840CC678E028E9BC71CE233FD9DB8816294D71F1A080101912920534750DDE692F782BAC4D4481A0900E6BB952ADA798EE06232C200F57F76A914617914B7398A0433CD7A11B5AC09789034F39338CE567E3E7AEFE35B0C3B85D21506E8886587670761AF9BAD3261DAF22CBFC664604234B3B784EA001CC6702B9222545CFDB2965EB54678780EE3C9CC134CD2E655908D6BDF460BEE364C66D5ACCF4B492ADE9A0F3EB31995BADDE4628B67165FF6014D848541035CDA46949EC1C12FF492726A7214D1C7273FB85D5484E5A178751B56E3FB163D13A53C7B3038E09B847A8C06FF9B42E8C345CC95AAC1A09660AC1FC7A146E7845AB83390871655E604C4C009EE924AE107B61BC3664F488AC60783A1C346BD18C56CED3F03BC1B1E4075E9785F235EBC5CE6621414E77D52CEC3B2E +dk: 657004A34B4EA6B278BDC1BC94A997D86B206F88875A934042732CFAF8B3A0141FDD815F2203BD92AC478A9033126A8478FBB6453AAE005C03F60444163066EE922781D08DFB1508F547555B3027A2F75F28401A7D69A09669AC8309C3D4E4B49B214C4C76B3E4C26CED4940A325885C71883881B6C18C57BF22CB4484674A738988708FB7EC68855A96EF033B4A877038612B7B14BB3DCA791DC5CC7C85614A694D0672CB5656CA51C7B3CE11ABE1F4B790800FE7F47F97D640141702B147A3A6D99279B258CAE7899C353A66F6AF3C53C4A632BEB545B65A2724EF06CD05978E3EE20BF264A0335B21FC2137C71161A8A3AAA1A6AFABD023F58C0C393630E41561568C6669C2683B0B493A60A42889A178ACC3289BB135C891D89698C38AAE187C6E3DB16335FA61BF70C6D496B5251BCEFA9A1C95980E3810C0059C62E8838F1B0B46B4C5A2FEA19E790B2EB4C8C3A164C8BF5C89C2812E982B0F3DA0CDE958A26BD03A38C562CC67B2C07509E6742CB44C04320AA87C23C3E3A7506F26AFE94523D1B05280BA53B4ABB8C5717422D071396C6B7733A09B11CE1E6B2280F1C9215913FBA6522F90C009C0988CAAC61721993AE73DD71A551ED8431C1A8D286857455624842C4CFA80B9143CCEBF930AA1E738EFF1A46EFCC0D766B7E4AC39AD508D6CB9891DEB61B0AAC5FB9385E1D0682F786CA37C3DF1A38BDFC1162E975EB604163752CAC6C47E3BD909C53726C6D084188904CA98C743C9B5D700CBE4A809F1756DCF4C65C5A6B7A7F2725595A0C89C26381C218004B1A275701B50586A327652390FB68868CFE8084067ABC53A9A2CECC72BC625CA7751EC158F35E791008543EB202AE258C588E69E695425B9BA4FE0082ECC530EBFAB41DB23CFA8C2A63AAB11D179C91A712062536C4FF1C205287296B001121436C5F813747350C9AB63CEC0CCF7DAB3E642210517155228910C729BC9B24B138B85ED9A4678B2B4C67A73282842EA66CC458C706BF4A591BBCBBD370E09C937E396B76FE4A3B56B4CF638A5CE055CB63C1275D53B4197493A1A4309A4CCDADC3AD1F47A5E8C5C89235321028EF158094A6385C4E010D6F8CCF1C627BCB3600544B276D2AC9CC91D4BD5AD75DBCC8E7B7A981680212B5A3D395F8AA1CF2B0A23EBB63BDDC5185BE53A6C1410D0D96889A74265E3B34F4477FDF5B680D793F35C7A372B25A1F47C5875B34B80ACA2C25A0DE69D58E71856C55E37A79BC7376898C45BDAD66FD0A554D8F9BD69A525BAA4BF40B0AEFDEC66EA329ACF7B44D33C4FA248734F516BB0A69FF751A3E3D95975DC4E25194CD6F88E7264352628AF45B38A3434951FF99CBAEA812C04C354227431B01CCF2B5955B59BBB5A2BF382227D71631C541AF888232EF733A085AA1D14493C063B64E8BB28E3B7D0686CE8F942EEC58734525DBAC07159627863D97F7C198C50E9AB10E54979C394E90395E6A793C882CBA9D56179B75F11799709577F149CC93EA3A764C610EAE641F8FA2801A22B5686B335117C3C7B3D74986F70384A26A33B323787B7888CF873BE39411829D69D6E2CA2279971AE27660B5224D21015440844C457B6B9F2C50D19580489C63AE0612D423A5CC523B2D908C45907A6694A665195171A5B2FB583A5C240CADCA8F0E83E46B14052C9620D3B7EF386CE8B9A5E873B65693B0D341C6EB2D10CE5E937CFB8C4C9134401BABFEEBBAECF47113A34B9C6E011BDC78A54F2B7BF36A5FFD27563D7443F2109F02A64C421411DDB2D1404A86F793A2DE62CDC560BFD6604D4B6330BA6AA621414E8C12DC71C25652ABAF36B875DE1978DD209AB53B885206C3A1B4F8B4A0670C087CDA9CDA7997437155659255C2D024822A448CE5157CF5B6E4C495A949960886A902C79591120117C4A73CE7B380C661851E1CA9EF1973D8A9D2A191B938C4110259C4227B600BA7EC9B033BB0300715032836573382445435A743CA61E923B18ADEC7CFAF10ADE908E582560EE91ACA012942319B4888109E55AA738A7BCF777C92B4B09A50A1C043C982C2C2357F73C1687B35BD123FC905E1A719353466A42B915DBF1A1750339BF0923419681E4531D97E2160AD896DB056570570510FB711169AF2DE0CBA51C5F5056242965AD429301E7020AE0141F845833A3FBA0B192426C001A7147C2926805CD86725442CADC2636BB769DCDE46D1BD12D30F4695593B5753870EF796FB2F3A53F283D5828B77CB75D5DE1BA25357C290A957FD501AEE0AE59D7AE97833B0BB640F781A08BD256C79117C220BDD83280A0069B29A645720096D297A2E5245439268C0ED01F75A939978372B9E05D93DA899C10BF6CDB18698C46EBE00BF90730E2EA393014461DEC6C87F17B2EE16C13B8507C6009BEE074F17367A5FC3067A28B7D804C32860EDE650E6FE85CF6E301D1B1647323199CA296ABC54D2811507572B5DFF92B54E3786D130938417624775D8534B0102B6B8006803DDB376EB830D1CA80E717BB7F260A5CA4A56BFC5DA790151725942AE7C42B2B9E385B4E0F995D4402161070B73A6BB0CDB77EF11B1286D75E315635E719088DC7909D026B198AC93BB4B6FE395843A4428F75C0C1448C605A8CABA0B8CD19CE465764B523628B3334E3885D68D5089E1A3045840C36A73AEFE7B93AB357FD8A46D7547A8EFB243E4953E67CA72CFA0B77835768AA0CD2D976820A97BC21C7033084AD45C0BF6B483ACA8A485641EB55A47BE36ABCEB96143BA90C515D5BE8513BB994CFA88FF4B3600E34C1E656877606B6280384A0F481458044C47732FA9B58195A5DFB48636E1558C56A43CB6941DEE5AEB1E27B89A7121BE166879B62BC01619A9ABE840CC678E028E9BC71CE233FD9DB8816294D71F1A080101912920534750DDE692F782BAC4D4481A0900E6BB952ADA798EE06232C200F57F76A914617914B7398A0433CD7A11B5AC09789034F39338CE567E3E7AEFE35B0C3B85D21506E8886587670761AF9BAD3261DAF22CBFC664604234B3B784EA001CC6702B9222545CFDB2965EB54678780EE3C9CC134CD2E655908D6BDF460BEE364C66D5ACCF4B492ADE9A0F3EB31995BADDE4628B67165FF6014D848541035CDA46949EC1C12FF492726A7214D1C7273FB85D5484E5A178751B56E3FB163D13A53C7B3038E09B847A8C06FF9B42E8C345CC95AAC1A09660AC1FC7A146E7845AB83390871655E604C4C009EE924AE107B61BC3664F488AC60783A1C346BD18C56CED3F03BC1B1E4075E9785F235EBC5CE6621414E77D52CEC3B2EBBA283F4C993A010081E2CC571D97234472CC9858D199CF0D6E6B9BD720C2665DF0F282411F4A071489A8F618E2AE5AEF40131CAC5233D6D731522720C2FEB1C + +z: 5AA6DC620A6E9A60CF19A7B4F0FF805BDA8219522A548EE5857C3FF6060C7A2F +d: 092271D05CA63C60880AF404D60BC4BB9539E2EA12969581898D56E0AC9A5A68 +ek: E1F90F4586A2A7444812451655F63852C48D2745BCC5D95C15552CA7355A216B1B5131656A95453A854DA8291046A05D96E74CC4507D31973D9606171D8405F211AC5040658411A3997CA061C3AD30EC2AE6CC79CD4C9AB1D1CB47996F02E42BD8819F62457CA5CB9923C570FC749531C61AEF02642576A04E88493AB084AFB353FC0B032AE8AEA812373A323268200FA820C88E1881F0A0CED7D9601DF56C891AC2CF6B299C553C6B1C8A470B68CFF347C2A071B26557F185B4E2138B421A9BB6DAB8FB41C5459644F08614E63C8C4BACC3DF5AB7F86C44E48239EF387217C9540DFB50002C08ED9CB631755446786D4B5BC14D16C5EF629CE2916687C40053A2CD50667CBB590F7D3A2AFD54AECBD6211C84739AB75B80A38E9F27B6D6F1BD4C838BB2706E5DA65B95498CFA61AB90169A2C06B0E79CBAE0051683221C98DA365A27C1DE417666ACCA178717934258207A51DFFA0C926B6E3DA5B084F07560D949AD615724C306EF1165A5B9616FBA84C7D71C1117BBF8296722012EFE25B29C63291D31758278430CD90E844764AC252F33135CD2137115933B38F4160FD482CBD9265C27AC3B6582FC201DEB7A52D23AA5B77BCE9B7C6D699655105B9883830D0171882612212272261A0CC9DDCBC7D3439FF3A01B0BD4B63972263D919BCC9B95018114A11BABECEA27A5BCA3DB896AA49543CC50BC07039D31135BE1354B6A2B6B4375513010CAE856B7AEF64BCE20912432C09FD18905200249D4CC250306C341CB837A96F2B67422B63C29FB8887A962A1F743F3D01795D34E277343E7577878F5A3EC02728E9238D56B2115F680AFC70BBB361B60C10FF7F4094FE240089577D59969907B9192097CC05516A7132C2477435C8BC01909B4AAE5537CA2C6AC79806B6B5F32FB688C609200F16279D9CA987B68EA83A6D6309F1230562196BA93767DF126C98E4C3A3A0BB969629BCCDCB428A333D2B96E50B814716A5479192DCC0C0E4B194AED6A169E5074EF977F689528C997C1B99B02E1B18794B56993743456214064F80CCDA66B71BC009772784AF04FB7F468E2E93E03C18778D13C72FA149C50C1C9F45167A53E09657B50BA2A19B31FA95C5C6550B14F9B931EB51C37890C95157DF4F974E3A167DC005481F945D23780B5498AC5AB80DD8ACCF2D1322D3253B9450EDA3C3B365C9EDC4A87D089AF7797B01BE716917842A4E99CE04C86A9F172062C473C203A328C10DF171FB10C97BA6B8E71271D705110C810843D658B15F2040B385B067B1CE160A4205CBD57B74926143609979F6A888EBBECB7703498A278AE963223A8AA41916A3D37D949A3E298F01CCD36A5B6E0BA9CFF38BB890AB18869B4FB7CA8C1711798CAAB2EAC01ABA26A060266A6A91BA877603E650F7D15C24F9B23C52A9C74F43150E3A1D5D25BD0326724A42572C32944DA713457CB36B14E30F72761480035423810D83721A97505668F11EB26285A1709321A1C8016DB8BB085996D1A4880BD3B1D8BF2754F3781D57BBDE68297AF710188486EB6D4AF7DE411D36787E4D945E33C45CDE051601243A1F7028AD52B3B5C7728F35DD5F8994D4B8D9FA767611A1ADEE8B38C5A7A0AA795D0A970C749A06DCE6CF1C8ED19D1F7E9F1F25538877CCEC133881C652489A84F948041 +dk: 4967CD2CABA6E5B9C671732DA64B59450440532BBC0372C570341637B81346646971834CCB116C49C562D485982B3C602D723B721A8EF9A35CA6CB045F8A09AB9A176C55801901C2924874D65573F5C0B3F97C1DB4821AC3B23F7621BEBBFC4D1F924E9E0762F037904707128ED964B8B2C42B3B1BA7D101BB8C1A36E1040ADA4CBAFC2BFFAA9D12C69C01F3C65E3676C948C18C273F9EB34EB0C00682A285E6B8A514D1AEE73AB93423C187C57C286801A9AB79F2F7100FB08E03A24AB26625D972C1350B951064A0C2122179CB11914C284BB092DA4A044E2C457807CED5662D0DC23F8D8A951C9766AFFB11D3B3669826736A278FA44386CCD5519F3A04A87B0C9D693D0E505EB889CBC90785635CC08FEB4362E3B48134474B43771BAB84A9933BE0988834CB149A5C3724BB17FDA374D5B57F5260C8E60C37F440A8B3DCB5DC94B946495C025CA1258C7CA7AB56B3765C1EE0ADFD854E617AB40E26922EC667FCEB3192D01DF3D37A484239BA427823302440AA439580074D666DB14C1D1F0C9E5203822394988553C8A0925E04F5AA8B9942E6C9B0C6A942CE569F3987CFED7B7E7DE388AC6BBB7CE4C9FBB6C5D15531A558573431C6B398044F989EE581B95793279F0AB97F4355D9C566B231998C9C046C871A59C11A99B2271CA7364ED5C5A6FCC0EF27A7C147C829C69E09D01CEBDAB91F163C68EB18D382A1A081889281414DCB456CD6C2031C382771073B5621C7B60DC4B0A294C8AA62C5CDF68BB6B46692196198C1EB2FC9528B33A0B829CB9B809C010A3054230188DDFA60013375DC1C6A967146D1B77362A448E4FA97C3B72C2AF5C9A4193290630AB400CA5830024888AADB52A9D4894B5AA03322946062D523018131645B825D5BB8DCE285DF2977B96C02977BC889737C78C2A3DCC5666B652C6E8C24141516DD8520DFE84E5129AA6BF55BB1EC79C3771B029A3B91F9701677C854E4105D5A485F8CB6A5C29CB2F47A4A60281F8B1FC8BC150122B08296B45F97C58CEB743B42000720CBBE5022B7143D3E177023ACA482988135197237706C26A94B35E20DE3CC0C53CA9626F2615E4B8D581BC2656AA72A0AB9242670E6322A89489C97177E3EA1AB9C24338AA35FA272C76893053A76051F4A88DE1944FBB0AFC8E904CD1033E7DC0D0ED029A7531EB612C7B46775FDC09B54C483F6B06ED16427F50421B6F59C06FB0AE4F120C54644DD287CE3119E440AAA8E0A611AB9B52DB1B445036E2CF15BB8DC72CEF50DC3788BD85832D0C18B2685659F8A8BD55144A4EC9764109288B21113E4089E598BBA1453041C9717AB25BA5239FC54638B5A20247B9BB755A360E16F83246CA2D024CBD4BC8E966C2F102C6C02CEAABA0F92874179C8777F937D9A3CB74920BEFE6A759CC94DA0A3ADE2D739D43A99E1F06A0D6A41AAC076CA70171BD697F1CB16A3B481EABB2269B57D36599F3B734BCECAABF6D5835E365DF0261C5C11B8B5314E08EB209A8938B9AA6566E159E2472D97553972DAC5B83292EA350AE358C60FA7773B5C1AF64891C72643CBF8085176A05CB47577E50FA6D42E96C5A465E05C7DB75BE4262A7AA58090585A62363B6C989B8274C426802DE1F90F4586A2A7444812451655F63852C48D2745BCC5D95C15552CA7355A216B1B5131656A95453A854DA8291046A05D96E74CC4507D31973D9606171D8405F211AC5040658411A3997CA061C3AD30EC2AE6CC79CD4C9AB1D1CB47996F02E42BD8819F62457CA5CB9923C570FC749531C61AEF02642576A04E88493AB084AFB353FC0B032AE8AEA812373A323268200FA820C88E1881F0A0CED7D9601DF56C891AC2CF6B299C553C6B1C8A470B68CFF347C2A071B26557F185B4E2138B421A9BB6DAB8FB41C5459644F08614E63C8C4BACC3DF5AB7F86C44E48239EF387217C9540DFB50002C08ED9CB631755446786D4B5BC14D16C5EF629CE2916687C40053A2CD50667CBB590F7D3A2AFD54AECBD6211C84739AB75B80A38E9F27B6D6F1BD4C838BB2706E5DA65B95498CFA61AB90169A2C06B0E79CBAE0051683221C98DA365A27C1DE417666ACCA178717934258207A51DFFA0C926B6E3DA5B084F07560D949AD615724C306EF1165A5B9616FBA84C7D71C1117BBF8296722012EFE25B29C63291D31758278430CD90E844764AC252F33135CD2137115933B38F4160FD482CBD9265C27AC3B6582FC201DEB7A52D23AA5B77BCE9B7C6D699655105B9883830D0171882612212272261A0CC9DDCBC7D3439FF3A01B0BD4B63972263D919BCC9B95018114A11BABECEA27A5BCA3DB896AA49543CC50BC07039D31135BE1354B6A2B6B4375513010CAE856B7AEF64BCE20912432C09FD18905200249D4CC250306C341CB837A96F2B67422B63C29FB8887A962A1F743F3D01795D34E277343E7577878F5A3EC02728E9238D56B2115F680AFC70BBB361B60C10FF7F4094FE240089577D59969907B9192097CC05516A7132C2477435C8BC01909B4AAE5537CA2C6AC79806B6B5F32FB688C609200F16279D9CA987B68EA83A6D6309F1230562196BA93767DF126C98E4C3A3A0BB969629BCCDCB428A333D2B96E50B814716A5479192DCC0C0E4B194AED6A169E5074EF977F689528C997C1B99B02E1B18794B56993743456214064F80CCDA66B71BC009772784AF04FB7F468E2E93E03C18778D13C72FA149C50C1C9F45167A53E09657B50BA2A19B31FA95C5C6550B14F9B931EB51C37890C95157DF4F974E3A167DC005481F945D23780B5498AC5AB80DD8ACCF2D1322D3253B9450EDA3C3B365C9EDC4A87D089AF7797B01BE716917842A4E99CE04C86A9F172062C473C203A328C10DF171FB10C97BA6B8E71271D705110C810843D658B15F2040B385B067B1CE160A4205CBD57B74926143609979F6A888EBBECB7703498A278AE963223A8AA41916A3D37D949A3E298F01CCD36A5B6E0BA9CFF38BB890AB18869B4FB7CA8C1711798CAAB2EAC01ABA26A060266A6A91BA877603E650F7D15C24F9B23C52A9C74F43150E3A1D5D25BD0326724A42572C32944DA713457CB36B14E30F72761480035423810D83721A97505668F11EB26285A1709321A1C8016DB8BB085996D1A4880BD3B1D8BF2754F3781D57BBDE68297AF710188486EB6D4AF7DE411D36787E4D945E33C45CDE051601243A1F7028AD52B3B5C7728F35DD5F8994D4B8D9FA767611A1ADEE8B38C5A7A0AA795D0A970C749A06DCE6CF1C8ED19D1F7E9F1F25538877CCEC133881C652489A84F94804166E5248CD311286D6DD03E010391D90D76044BF498B53C9D8202A9EB643527395AA6DC620A6E9A60CF19A7B4F0FF805BDA8219522A548EE5857C3FF6060C7A2F + +z: 7CF50F7237A97072F03F31CFD59FA8E863BCA3AF7375E0CA698FF665661C24CF +d: BBF7574CF5F32BE49E1F39CE33870D9D6384056D60D223003B6B0C10D5C42180 +ek: 602389F7CA3437B9197677CB9E9704A2BB73A7815EC1047D8D63A55CE1184EFBBBA3F701CB0C3D0D18B757BA23C6023B4D34964B66107C92C5E0AA577FB93F31FB9A73786E63E7CA4DA84215F6B05A883C19F8B0D0326025A41A98D056B70A18E6E6469EC63C80BA0B7EE330B89314838883BFA75F2C6155BAA1922FD446235CA76A634EF715776D3AA3728482C5F69931DA1FA0A406D75756D025C08DAA28EB2A226AC56988F68B54E3205C1B341528374B9B9BF07BA42BAAC34219597FDC66156155DED5A7C3F386103BB0EDA1CB1D4258CE1A971447075CAC2AF538A96F1C570014341624607A3C36BB4771DC99916EACCC04268D25DB95DC20B041B394FAB543118B74536187EA32BA1680B006652AEFFA9338FA00BC099846419630D38CE7D726C5CC84CEB9C154E9B309B6A99BC142CBD6B210408455704A3A644ABF7768E6E87B54734C1CD0C139B2292C612DDAD0AAFB239CDAB80629B91AD9585DA88A84857249E68595C0564F2A07735A76C1CAE64D28D14A191A9F0CFB709E216AF6CCC0654AC206B722A2E84BE8A0C13BA359BB1B741F191F076A7B27849D2DC146CD8456FB165157A2ADF2A45FC5647FD5213E8A105084138CF29A583A0B5BFEB0A523798085F2AC8A44745BD556D7C0959EC319563077F5D5137E8B7E9743115D390BFFB91DADDB0DA4A21433B963A15933FAE236A537837CD056F4145EEB7872E8153E0BA9702C7A20598481C630206EC359C5145BF123A18054AF7D6851B59707B010A0BC322D3E3CB0F0BBA619C0CCB5239A5D7B021007211024868DF03B4729578F029EA7DB1CE62C15F1843C16469AD144C805B5C217FB18CFC49CBEB80BDB9CCACCB181153C377997C509B6606DB808F04911FCC4CF1902035DC3016F64498C13AF1BA2C240C6567E5520FDF79A5A04634439641DD2672BA04B11931CCDD3629D860B9EC767C3AA4C9E09BE25A7752B64087B0A973E6B3278E66E89F4BCCBF3090A729467A88FA0AB1A6805C7ED45678E71BA79A85F267771E456B2D56627AD66C7CB07B8D73A69A2682C79B1C13986C07FC7986C7C3C84EA4B6A6C1691675912B2064E3598C32573B6B87E67B006E2F312F15A5AF4E237345468756390DB585514302A80746E985A104C43BA019C5DDA678047C6A48CA36A51CB3A333767BC35CA31B59CCD64A2C59AC884A8B1FB396FCD42C63057663E8A1F809709AE89AC805277E1151B92DB4F0E52923BBC093B7C6D15621D2BEC2C8DB77F25F86A62646C54C114BA03CC6154397127A033D402248383FAA8BD1980C93E123B57075633B6B643941B417890B1AA810C88461E60413264612B890FA83115D22041243C47263B57CB32BD84D839B9CB96E3777E2DC616D8ECCD1BB21D4AB00C83D4B4298A671CCC1FDDFC3E4DBAB48F1B8045D3991B3952D4799B7E1C3D31B74F9B619BF17016D143B16E593F64C08A71078C83B197BD530063D026367993E8C35305D211C2E321ACC889FC6917F70A33EC2AC4D7FA448A79A89B531BE89A59CDB8212E7715144721613619ABA2CC7E53A3D3F84908C09B26320FA3C1CC9D840F21851139236C7CECBB8B3C2681DC145AACC13B4BBB15560793364387A0CFC97C0312351F420A0892084CACAFEA4241305B12C78DF29F2FC5FFEE800216C1DDF275 +dk: 7BAC37F9C7AC728C78DE12B13C0A2C1B522A837416529A93273A4A14007BADC7BBFAF03EB90A7CE4E8B87B70986806C9DDC9BFFAD06D51C081E8866E7624A373E87E8BE1A60A861650346296F8B89C7A0EC713CA9A0B9BBDBA370104A414C02DE8445B9F4314D4902EBB400226A827DFC6603812178786BB1D6A9CFD048A45B4A160333D73E344497BC526D262EB73AA9D3456375A9F237B004B2414171C6BE0F02A97E83B1F8C411FE350D9B51D42D11BB7A34F8C59AFAD18722B17B21C5253389A98B2A96E5BD798AD10AF6F27950F64638080C7F0284545BA6E2BD93BB141CA924966735C7383631EEBEBC1BFEA7160FC60C143C9359A43C3A03429D663196B723CD35FF4C465B356A77A7C5FA9408E91E08BB6F141F1A9B93B4452843873F5958AC7AB9C8A660BEE218598D09652F921E8980449A8087857B129B02A38FC664F0C21B4E95E3B400AF4B30EAF649B9C968C0AA5B2FF8781F8D01534FA5FCECA771B2A2ADD27710DB25402E94F66D37D52780E25E4317FF80F0C682641301015D7900A312C9643B336AC53C94889342B09138689E8BBA191700791197B0F804BD834064CB3446C9382E6839F25087F5DFC1C741B91A8FAA87E529E375A0CA9B424C429BBF0B6CC7027123EC211A9A5622611536290A0E30A50CBC567D08245B54224133923AE399EEE6454E858352333164510A8A510289F56B073ABAF82F5986BC52778A86253BB96E357AB4F78A7C3159DAD184B8B540BE1DB861FA1951C0C59526305FF005D741B2A312B586D75B72A6B31DE68A07DE4CFF0490A85009442390FB5F45F70F5AE3E286B20C35F55DC39DF6C7CFD992A3203718A58C2D849CFA78C4F9FB20D68E8A7B35065D3DA738F01C6986600677325AD146816137221E3C47B9376A3669CCB23A533A85B1028865BB4A99361486E789C0C42C3D36831D5E86278B48B2EF8042FAA2491B413FDD9AAC2493F44686A649BA866D30F887580857B7159161D1D009920033F9EEA92E37267CA936D0823A8CA195458731DBE45B25F46584268787D664FB7587AF4B67291255C66157CE7646B2F4B5015D75D5332C9E95470F52A9D8EB5438A390BD7254924D46C583A7892D53D42E9406E0A6063121A03F0A550F4AE2E8042D962A3AB69B223C37071F1BDD2BB1639D34041D1BFC2576B268ACDA311A5E0222DDFBC5D67A77EA0C37C90B474317195D567351280AB0E5840A3F60EA9C5162A706550877430F6882A68006A683A90B38F26C90D3FCC780C0CC7E6E88FEA5A02D912A1C485667F88AB329552A93837858235E98044A28A24E1F71435E09DE2AC2744BA2E116A136E95AED53BB906BB46FA214E218A815966214F581C1134545DD05EE4E9495AD172CB2BB199D79328E06A45A42A4EF37443EC6F57631D0959B84A1B169297A0F2DC16B13B1C43567C043237AB18BD53A8898F6ABCB0F8A012E2CE203649C4286C6D3C41346599E953B6899712D4B86BFC4B54A89B061E93B423793CDD798E6E5A1BFFD565245788B0BA6A0FA3BDD97960C9CB0A10DA892D829925FA4F85CC8FF895500933BB78B3993CC04006819FC93224D19A02E11651E5D3AB3CFA6DC1C206F6516A5CD5108D18B47960A6602389F7CA3437B9197677CB9E9704A2BB73A7815EC1047D8D63A55CE1184EFBBBA3F701CB0C3D0D18B757BA23C6023B4D34964B66107C92C5E0AA577FB93F31FB9A73786E63E7CA4DA84215F6B05A883C19F8B0D0326025A41A98D056B70A18E6E6469EC63C80BA0B7EE330B89314838883BFA75F2C6155BAA1922FD446235CA76A634EF715776D3AA3728482C5F69931DA1FA0A406D75756D025C08DAA28EB2A226AC56988F68B54E3205C1B341528374B9B9BF07BA42BAAC34219597FDC66156155DED5A7C3F386103BB0EDA1CB1D4258CE1A971447075CAC2AF538A96F1C570014341624607A3C36BB4771DC99916EACCC04268D25DB95DC20B041B394FAB543118B74536187EA32BA1680B006652AEFFA9338FA00BC099846419630D38CE7D726C5CC84CEB9C154E9B309B6A99BC142CBD6B210408455704A3A644ABF7768E6E87B54734C1CD0C139B2292C612DDAD0AAFB239CDAB80629B91AD9585DA88A84857249E68595C0564F2A07735A76C1CAE64D28D14A191A9F0CFB709E216AF6CCC0654AC206B722A2E84BE8A0C13BA359BB1B741F191F076A7B27849D2DC146CD8456FB165157A2ADF2A45FC5647FD5213E8A105084138CF29A583A0B5BFEB0A523798085F2AC8A44745BD556D7C0959EC319563077F5D5137E8B7E9743115D390BFFB91DADDB0DA4A21433B963A15933FAE236A537837CD056F4145EEB7872E8153E0BA9702C7A20598481C630206EC359C5145BF123A18054AF7D6851B59707B010A0BC322D3E3CB0F0BBA619C0CCB5239A5D7B021007211024868DF03B4729578F029EA7DB1CE62C15F1843C16469AD144C805B5C217FB18CFC49CBEB80BDB9CCACCB181153C377997C509B6606DB808F04911FCC4CF1902035DC3016F64498C13AF1BA2C240C6567E5520FDF79A5A04634439641DD2672BA04B11931CCDD3629D860B9EC767C3AA4C9E09BE25A7752B64087B0A973E6B3278E66E89F4BCCBF3090A729467A88FA0AB1A6805C7ED45678E71BA79A85F267771E456B2D56627AD66C7CB07B8D73A69A2682C79B1C13986C07FC7986C7C3C84EA4B6A6C1691675912B2064E3598C32573B6B87E67B006E2F312F15A5AF4E237345468756390DB585514302A80746E985A104C43BA019C5DDA678047C6A48CA36A51CB3A333767BC35CA31B59CCD64A2C59AC884A8B1FB396FCD42C63057663E8A1F809709AE89AC805277E1151B92DB4F0E52923BBC093B7C6D15621D2BEC2C8DB77F25F86A62646C54C114BA03CC6154397127A033D402248383FAA8BD1980C93E123B57075633B6B643941B417890B1AA810C88461E60413264612B890FA83115D22041243C47263B57CB32BD84D839B9CB96E3777E2DC616D8ECCD1BB21D4AB00C83D4B4298A671CCC1FDDFC3E4DBAB48F1B8045D3991B3952D4799B7E1C3D31B74F9B619BF17016D143B16E593F64C08A71078C83B197BD530063D026367993E8C35305D211C2E321ACC889FC6917F70A33EC2AC4D7FA448A79A89B531BE89A59CDB8212E7715144721613619ABA2CC7E53A3D3F84908C09B26320FA3C1CC9D840F21851139236C7CECBB8B3C2681DC145AACC13B4BBB15560793364387A0CFC97C0312351F420A0892084CACAFEA4241305B12C78DF29F2FC5FFEE800216C1DDF275A918B39F71BBB2C10DB35639E5FD2CE621868CC02149E029EB47899407D963007CF50F7237A97072F03F31CFD59FA8E863BCA3AF7375E0CA698FF665661C24CF + +z: C593627807074684B7D363441F80F6A3D185D67878702D33A4E0BDA2000F857D +d: D12CD9B65B7C58B2195AE0BE0282527BAC06C2D25CB0472628D64715F7F6A378 +ek: C85428E8EA5D6D1C7E544703372498F68311C32BBC70B86F2A805FC94089A0421AD680053D5BB139EB95652ABA561B07B9C2639AC693972070F351A3FB6138FEE0A73BF63161B604D7DC0334D6C631BA25F584952045C6CB74A31581B866EB5FB69503A5E3C6F96652547968626CC9C6ACCFE9582778E928235305CC5447661A64363A9FB3CB3720868812B2A3F5E7820DDAA8BC799566773BB62B769A8C54E6B533803A48D877706303A76BA2188EA4900155728DF29E7AF050F8CA9F92B65ED59988496419070B0CD8E964B402491D134F59EB2E3995C1B3B654EA7A5628C677858208A7958C57C7CCC697677BC65091015AF9D6C688E234DEB528608A1AAF35C2CB2A14593376E1417098778439D9BD6EB31BC0B53F277BC6763794CFEB8766957F6B206D439BCDCE4466BE20B74F7A117D7102F4A2CC93B098795146CD2903D131315EB41E0DDBA6B562B8341753DBA98D1ED288D8F33148814847981C735600AF76BFD0B964521A8B3122B3B90BA8228B1C4C834C808550D7780BB33218F155752DD15713F5A32057C42313A6FF5BABD6AAA1F6F5460C774CB83C6EC16C84D4A5B8EF728E58E8B34D7C090692B73DB64BB02AC365800915D78A9452158FA210C99B608DA053F574AFFAF1A49AAA92B3058468346D9D5A6DA97A9269B4713AE17A214921AE76A90EFC5A4AE90147E154A562C1C96598DF670EEED86EB946C9B45460C63A1339BCBE23B4332A32C02A028A892478070624D35C950AC84ED7D1B5640A70A3A45BB47C39EC181F7C8039929003D4D674DE3C5C89B0678CF3B125C864E95439C20AAABD015AA52BB3C27316188A673785CF2C0C77CAAC7604439A69B46005EC646C37C510FA835CBB36C162AB7C944F8228A4FF32340C3C63FFA3CBC48C7E01D35A6DD010E211C21175171237067A614CBCF7B18CF98ED0E8B88B58555D871564B0B71B75B5D078428EE87E0379A23822BC34C00A5661602C4006BF5CA667780E81F1759CD63E6BE63CC6C07ECF44C2E11346E376733D185A281C8648A9B951E14308D7A55A0717BB5C9C3CD5C7D88636873453D6148E674093A406860028AB50FAC90349C5BBFC2A7B6A18E24655DE541356990BA1C7C465630475176A03D58059F26700CBC383A0750F5271B8D5BDD74468E98C189FE302A5A452D2E47340C2B04A0275B47229B2022198F14E674071C6568EB428B0C0748CAA0A2F8BC28FD27862687B452989B034072B69381CF73BA00F7B7C401C699BE466593918EA96C79A3980023B299595179065198F93C6D6456DD53B586E6079340952C1314A140605DD34126291396AD22F2C7820A4AC793768707E071772EA587FFB9AEB234ED7A250DB40A1DD7A3869104864392B6DFA23013C8CF8856EC8E30C0AAA748351284F67A0E3469D3CF7C28A85BAA2630907B70F7C31870E8A29DC7B908CA880BC03C3CD2CC7A57A9D48A238667776B6D9C77247ABEA49B0F6935AA9446F0F2CADCC7A809B651DB55131A7B662CE428EF89109BB33C4E423B05781C42BFB4514092D35BA6D8E77B71F6627C9D91EB3672E656A00EF64CA7551667882444DA47FEE440B0E59755FB33039FACF337CC572D7CBACD680CB882ABEB86D9A3937FF76EFAF15E6AD37597C50B3153DC8B18625508393935D2FBD49D32ECF +dk: 9FC4A82AB21F667A50692A482D59A06FF2620ACCAB62394DEDC7AA452761F38A5A499C8091498FD7A5910C1A14324685B9307236CC0773D98B36EB2136708DAEB21F8D4B713CA5456A02C1C8EC012514AE3FF6476D1C3D8D47638AB79AB83433B6592E2F1690BED646C0519EAD1CC58779786B384618604B1AD1340E178FD97A8B3EE4B009A5BA115CBC3832B92ADBA22BBA7823976683B8A4469A3BDEDB8FEF5C3582A5984CEB2CBF5A57C96B246D05BA21F08B8582CDB5632DFFB404C320A004E878E31B877C07B38B7A12142A5628D2BA4CA6680C9B9A6CF18B3B4673962533D7C503A24C0A91EC9E1F75219E573DF630724393A18A61178623224B9C4892F6A41657175D296634474F1C3BBD76E05B9C5788B9857655D142BBD8137F047A4927B923163493FB31EA5C151A4719ABD61634F8A8856A968C7538E2641D5B79CDC78971ADE70AF4F85B09770EA4E05642CBCF02F095A9149DD266809DE0911A5481CA22176BC9B0C5A7066A00434B15AFFF5C532E1042BDA52D425CA202A599D96A92D58B7B40F8A76EA34C6B45B76E6C07FA9CA20B3587DED93E94160AB0412697DAC2591530620242A9B41F37B11CE1347075271091B78EAC2221DD735DEED8189C0029099526E9DA24F234BBB423C590CC44C675AF125B021951576F5953CBD45B8F6326CA9399D3127EB430AA31F2C5154768A7E440F63738419834F41AB4A149278DE5882506085943BB6D19088FC11525973ED9132238A350F201479D9469CBB46117E7B74C0298B5E785F27384A4984452868BF5056D9A966D844ACD946073AE275D7F82C4583C08AE33499CC53D4437C3EF967F6C904B75F503330C4B19981B28CA8F26CB9F5604081B8706E657CB8E9431466CA0EBF1B71828A3238578BC2B38620C3416E84B3058174716A312C205ACFC481871588C37263B6839768C5CA575CF15058C52F39379B79D814788C19034EA17BE4969255EE767578B0B6B347FA9A52D199891B9976A7345B93C659CBD7814F5F300900581674BAB7D03585E802C8AEA7CAD748F5065039788B76813C7F991A642C44EB1F151C6A3BD96C4331F2C01EEC46A3A1BC30555BA7F2C9316F4CC7D18C9CB73962A71CD0EF32B121393041684CFE692D4834FD0B25CB0A04531E656706A7D593AA1D0FC56FA304CCA3B5BB3233E7B141B6AD1C448C35268C99815E451C2B821F034CEEBD748A72625F61B610E478099F6CCCD39BA2A050611894D5524257D9A06D3BA2BE2AC70EDE8717BF593FC159F8433CA0C54420453610DF451C4736512702A95B2B0FA5AB1B4CC3FA74B974A1354F8B2BEE35187BF049D0A8772BCC85443B04303051415324523DC1FD494268E172383F7570D366570DAC588A73FCE3104921B325E45A87BE798683A6C2D0C90A869BB2B4BBC332B7687C81A287853F7C06F596271F5596FDE93BEBA027977C788F472C114C889BA4C4D3F39C7A05A34E57A8D5C4C10A19C3A3BAB1711FBA07854824305AE9D46A6DD11331656C4267C20B511B6672C0CBBCB2D5B67973239B116035BF38C9BED8186762201CE295A5473A825C6210B70A70CC5C5E235384908104278AFE955628D80B43F13BE383A42BDEA6D05EA7CC85428E8EA5D6D1C7E544703372498F68311C32BBC70B86F2A805FC94089A0421AD680053D5BB139EB95652ABA561B07B9C2639AC693972070F351A3FB6138FEE0A73BF63161B604D7DC0334D6C631BA25F584952045C6CB74A31581B866EB5FB69503A5E3C6F96652547968626CC9C6ACCFE9582778E928235305CC5447661A64363A9FB3CB3720868812B2A3F5E7820DDAA8BC799566773BB62B769A8C54E6B533803A48D877706303A76BA2188EA4900155728DF29E7AF050F8CA9F92B65ED59988496419070B0CD8E964B402491D134F59EB2E3995C1B3B654EA7A5628C677858208A7958C57C7CCC697677BC65091015AF9D6C688E234DEB528608A1AAF35C2CB2A14593376E1417098778439D9BD6EB31BC0B53F277BC6763794CFEB8766957F6B206D439BCDCE4466BE20B74F7A117D7102F4A2CC93B098795146CD2903D131315EB41E0DDBA6B562B8341753DBA98D1ED288D8F33148814847981C735600AF76BFD0B964521A8B3122B3B90BA8228B1C4C834C808550D7780BB33218F155752DD15713F5A32057C42313A6FF5BABD6AAA1F6F5460C774CB83C6EC16C84D4A5B8EF728E58E8B34D7C090692B73DB64BB02AC365800915D78A9452158FA210C99B608DA053F574AFFAF1A49AAA92B3058468346D9D5A6DA97A9269B4713AE17A214921AE76A90EFC5A4AE90147E154A562C1C96598DF670EEED86EB946C9B45460C63A1339BCBE23B4332A32C02A028A892478070624D35C950AC84ED7D1B5640A70A3A45BB47C39EC181F7C8039929003D4D674DE3C5C89B0678CF3B125C864E95439C20AAABD015AA52BB3C27316188A673785CF2C0C77CAAC7604439A69B46005EC646C37C510FA835CBB36C162AB7C944F8228A4FF32340C3C63FFA3CBC48C7E01D35A6DD010E211C21175171237067A614CBCF7B18CF98ED0E8B88B58555D871564B0B71B75B5D078428EE87E0379A23822BC34C00A5661602C4006BF5CA667780E81F1759CD63E6BE63CC6C07ECF44C2E11346E376733D185A281C8648A9B951E14308D7A55A0717BB5C9C3CD5C7D88636873453D6148E674093A406860028AB50FAC90349C5BBFC2A7B6A18E24655DE541356990BA1C7C465630475176A03D58059F26700CBC383A0750F5271B8D5BDD74468E98C189FE302A5A452D2E47340C2B04A0275B47229B2022198F14E674071C6568EB428B0C0748CAA0A2F8BC28FD27862687B452989B034072B69381CF73BA00F7B7C401C699BE466593918EA96C79A3980023B299595179065198F93C6D6456DD53B586E6079340952C1314A140605DD34126291396AD22F2C7820A4AC793768707E071772EA587FFB9AEB234ED7A250DB40A1DD7A3869104864392B6DFA23013C8CF8856EC8E30C0AAA748351284F67A0E3469D3CF7C28A85BAA2630907B70F7C31870E8A29DC7B908CA880BC03C3CD2CC7A57A9D48A238667776B6D9C77247ABEA49B0F6935AA9446F0F2CADCC7A809B651DB55131A7B662CE428EF89109BB33C4E423B05781C42BFB4514092D35BA6D8E77B71F6627C9D91EB3672E656A00EF64CA7551667882444DA47FEE440B0E59755FB33039FACF337CC572D7CBACD680CB882ABEB86D9A3937FF76EFAF15E6AD37597C50B3153DC8B18625508393935D2FBD49D32ECFC86A41EFD315191F24D2E6BDD87433D5133D6734FBEAA9DA8043D91950000048C593627807074684B7D363441F80F6A3D185D67878702D33A4E0BDA2000F857D + +z: E01702E1228F530AC96DB053A415BE97749A109A1FD4057BA128649B17EC07AD +d: 79C006D5470C229AFCE7588546E52204B09F5086974865B426AAAA198C6CBA7A +ek: 52764F398C4AED89848544114193553BB178FBFCA4883C76BE23363B3343F69C8AF0B59F7C0482A64985B50A6EEA5C700CE7BF31DAC43B82372405638010A320E2A28FE6321C0AB85BFA8723DB96E8D1508900996B27812507885C97A1E7C581E35915D0709C9CFB2BC713B305705406C522D0305F5BE51EB3272524A797ECC2AB5330538BCCA62CD51937330849138620032917ACC188E8B70DE56B43E812EF030C0B4C062B1437AAE13A355AA9B41B00EDF4151F2C964FD332F3014BEB990E19C2350050735C7B02C0936B6BD37CA18114854750E32A6790515E1B4A31B2B71F9DE4082C225679CB220522BA6235B89F2C8E231BCFC815B9EBB15534D5B352566942A742AB405194AA74B90B26B98B669DA43FEC232FCF351FA5C50F812057E44858096395CE67AEE48382063A7928CB4904D623C56974FAFBA18519BAB743168510700F715E07EB331050C4160A6AA024C126027D11C324A87BA13C3CB10E86B2212343BD0088382769B9494F769918DA7C8EED21896C75711AA34B0E3BA8527371271AAEA05C906C5CAF6B5A6A08C4998492323E04CD5E63B1857A4FA972BF8B430036A856A5F9183C4B652A9311F1901AE3A4A93D302C4E77282B04046F7AC2DF2333C21B343ADB75C369A5385B9CC70280858971716A0587B74492637DECC8130EC8418954763E39AE47BBB084103225C21F64D94F14D55B9BD2579C5BB03EE4915016C2CA416806CCCD56061F92C0B1EAEA50DBA36B76798F7B8AA8AFF2CC06B04BC3106F22845DC5D847B5D444F05803CBF062DE581E12163094A5C7131A24B9327DAFF9134F32B647D9CA52A65A91A4899D64100F3376E0D318C7B8188BFA88654AC370EB5D693C4D9D481CAA98A2C99C168A0306261165410B32A53BBBBA412B54702476101C6550C286D6615AA98D8FD95ECD88BF45CA383DB3C6239AC7AC16606877751311CE8B447D0F6B9499943706B5A46F291A57302FA4F3ACD4645DBB515868371FD79887636737E333C9B06285508832401107089176E06A2F17E19E4FF61623603E17367D33F023C2CC820961A6E3500092CA3B900BAD66C179249C75A5E08A5563BE1CE312ECDC0AD370518F66594314CF5C8BCA20948D54C70F800542BD5B64ACC9AB68FC90F48662CFFC8F801C06DE972571E8C25EBA7128E95C13011EF88240C2C9C0BA555AA1C70956C9621A600F2817435C09C75F8A08CEF2C5D31C5C5834A745249CEB7641E6B19E404865EB374507DB3394A77A0F47149896AF1C747F86C97201D8C1CC8209E571B8C4D6972ECB1CA930B15516922FF08BF0C942AB5C5D197669AF94457FC9BA5BB47DDBD3A34EE941943B0B262A63FD0922D803CA035C6C54DB71B5A5A76F46C787036BEF777296E80664F73A78175EF7DB567BDB6CD8D97D27649661C76216D99D6264A7EB274C507AA170E1C3F23CA00A04B861AAA29EC33D4584B12985AC3B36689F129F3D29B19DAA5DCE4150162A10FA835E1D89A21FE10E4B1489E457C415961648044774C49DE6908201068D13463F1A999D3103342F03020F043DF3CC2E897B8293D235E8B408F2BAB266CCB0FCE19F6779A9C7DC89E368B07BF56F29911593E78009358CEA0BA304C0C074FC86A0782F99BC38571CD1632770CBEA199AF4181984FD05FF371931 +dk: B9C74FBF945530C8B3F846A803ABA28337B79D4B282B127D727A145BD77C19D980ACF4A5B20A09D770BC96F9A32EC16ECC208126D0C755C334BFE36E0AA3B968D0BD9EB80FA4953C9B843AABC828BB044DE62AC903D655C5960F45A4133CEA1AE6C4A09D431B43B19511631483E457C9108D7F3AB090203F712BA759602FED0A68BB7C8B10DB592DC38606978C56198B7F3062A200B03FE281FF95A27ED48C630CC1699423F5C6A07F850F2280101178CA24C282A7455FAC19869B207C46540AA0E4628246777CEB02B24ABC1BFA02326B846D7A20A7E642116B97AE68219AC53712A0077E325B4677AD163A38A6B8754DA8957C52B6CA5905C43131467B86F2CB1B94891A88B79058D6C6D8DCBB2C167156DC81C59B60F66C16938935DCA2BBB80084484B1F11330B5010C2F6C5AADF352D2E5421BD5B8A77758B72A058A0A6074B3C08A9A2B0EFB7261CE38219542CA7759FABFAA924721D7EC8C11EB62976EAB8202AAF0BC082370A47735B0931CAB5D6A92F8A67184DC906856946004B991394C7F1F1B84A4C0BF3F249B73747732AC3F04C5FD94B33FFD8250AE4739FA04233B6C381F69A3B0AC7E0003613329FEF9A63F033CDD09137BE13BA7EF42F36342A1C215A5FF4AA76D044C0AAB7ACD7064BB064C9B66BD7E2C398404AF7164FD0169BC8DB926BF63DD0E2433C7C17854A7E538722E74118CACA4621A532B2FC8DD0E204DBD01B8B3C7AD1A5BC78E78E8C1265BDACB7C78A62A3E10EB7BC3E7FD25ED8827C23428E3A198CB4821B0EEA62C9154F6D305D00BD7BCA42A1BD488AC4412D39B1573ED978EB912CAB796A594C5E9AE6AE7C94C76BE61DD47354163A7E4063B8A592C91A8A6B34451AD400672603C60DDB26F1B0587BE2065362006372081C1A52110774EE4A0231842AC6E7B4345B47C6A5C42D3C2C951014A7B753A90345B0692C8A73A82D8B01589C3CEEC8ABA357931E18026604576141ABE253CA18C356757A9D0BD49C1FC1CD90364D7430B061DCAB362257F80405D35184282C8861613D6EAC28F1360B1888192B25719D7A3ADE28AB76FBAEC4DC35DE5B5CACD64A66A39824993F2FF7783CB339319998AA102369F43E841666CB41CF0D39B998267356DCAC4F0933E5E56CBD920FC56AC33BA82E80FB13C6C64932C65EC4C66E903859C4F20D1AB5825FA8322CDB41F4341811D7663A6397363212DED05DA0D76EB5308D32F4442A488665DA80F54ACD37C406FD44AAA56CB31781AD393171DD539727C6582594BFA278BD2729A9150B916A8CAE861153DEC3493E18277A766019CB556882266521536EF030BCA36115753E08762142B33C5E34A9E80716C57A03BB362F9334AC44744EBA711AD8F44C2EBC151976C49F179D24B53C30615BB42CBE8CE069714A9447D939DCBC128126C1F9AB35C222386D894B6ED50A580B3ED13ACAA18C8D49F5A5826A9D1B6530100702E2C9993C3AC5C9286AF6324EC9B8323C032884B344EAC49F21D76323DA9FCB324E8DD7AFCEE162AC14BB427C0197C4AB9AE490434586EA76AD9AA042A060973F301F5E9BC91072B61FBC27033C52DD160D424CCA566558242C9E4B145C7B5630AC825ED5B932A00381C5C94752764F398C4AED89848544114193553BB178FBFCA4883C76BE23363B3343F69C8AF0B59F7C0482A64985B50A6EEA5C700CE7BF31DAC43B82372405638010A320E2A28FE6321C0AB85BFA8723DB96E8D1508900996B27812507885C97A1E7C581E35915D0709C9CFB2BC713B305705406C522D0305F5BE51EB3272524A797ECC2AB5330538BCCA62CD51937330849138620032917ACC188E8B70DE56B43E812EF030C0B4C062B1437AAE13A355AA9B41B00EDF4151F2C964FD332F3014BEB990E19C2350050735C7B02C0936B6BD37CA18114854750E32A6790515E1B4A31B2B71F9DE4082C225679CB220522BA6235B89F2C8E231BCFC815B9EBB15534D5B352566942A742AB405194AA74B90B26B98B669DA43FEC232FCF351FA5C50F812057E44858096395CE67AEE48382063A7928CB4904D623C56974FAFBA18519BAB743168510700F715E07EB331050C4160A6AA024C126027D11C324A87BA13C3CB10E86B2212343BD0088382769B9494F769918DA7C8EED21896C75711AA34B0E3BA8527371271AAEA05C906C5CAF6B5A6A08C4998492323E04CD5E63B1857A4FA972BF8B430036A856A5F9183C4B652A9311F1901AE3A4A93D302C4E77282B04046F7AC2DF2333C21B343ADB75C369A5385B9CC70280858971716A0587B74492637DECC8130EC8418954763E39AE47BBB084103225C21F64D94F14D55B9BD2579C5BB03EE4915016C2CA416806CCCD56061F92C0B1EAEA50DBA36B76798F7B8AA8AFF2CC06B04BC3106F22845DC5D847B5D444F05803CBF062DE581E12163094A5C7131A24B9327DAFF9134F32B647D9CA52A65A91A4899D64100F3376E0D318C7B8188BFA88654AC370EB5D693C4D9D481CAA98A2C99C168A0306261165410B32A53BBBBA412B54702476101C6550C286D6615AA98D8FD95ECD88BF45CA383DB3C6239AC7AC16606877751311CE8B447D0F6B9499943706B5A46F291A57302FA4F3ACD4645DBB515868371FD79887636737E333C9B06285508832401107089176E06A2F17E19E4FF61623603E17367D33F023C2CC820961A6E3500092CA3B900BAD66C179249C75A5E08A5563BE1CE312ECDC0AD370518F66594314CF5C8BCA20948D54C70F800542BD5B64ACC9AB68FC90F48662CFFC8F801C06DE972571E8C25EBA7128E95C13011EF88240C2C9C0BA555AA1C70956C9621A600F2817435C09C75F8A08CEF2C5D31C5C5834A745249CEB7641E6B19E404865EB374507DB3394A77A0F47149896AF1C747F86C97201D8C1CC8209E571B8C4D6972ECB1CA930B15516922FF08BF0C942AB5C5D197669AF94457FC9BA5BB47DDBD3A34EE941943B0B262A63FD0922D803CA035C6C54DB71B5A5A76F46C787036BEF777296E80664F73A78175EF7DB567BDB6CD8D97D27649661C76216D99D6264A7EB274C507AA170E1C3F23CA00A04B861AAA29EC33D4584B12985AC3B36689F129F3D29B19DAA5DCE4150162A10FA835E1D89A21FE10E4B1489E457C415961648044774C49DE6908201068D13463F1A999D3103342F03020F043DF3CC2E897B8293D235E8B408F2BAB266CCB0FCE19F6779A9C7DC89E368B07BF56F29911593E78009358CEA0BA304C0C074FC86A0782F99BC38571CD1632770CBEA199AF4181984FD05FF37193132F434783F38ED277382AA17ACF5FEC87E72BEF729A63E69AF7387E9CC5BB339E01702E1228F530AC96DB053A415BE97749A109A1FD4057BA128649B17EC07AD + +z: AE51639EF7F26FD2215AD11CBE1EDEB3B943D668EEEFEE13ED5B0DA3E0A5F3ED +d: B04F631B330D83991B5C01E7F69452DFC394F9689632F8C7F60DBFAB92A9CEA5 +ek: 662293FE760B0826256FA788B6A061039229502B6887527553496F09937F25C86D0762232C5A9C3CF9CE9AC7C43412295A180DAEF55C01053F71242257610F9F2AC7AD80A220991BA632B4DF1CCB43865C7469BB54A24A12D759943921B62563A1665F864C710B947C629B6AC169A05FEBA11DC87BA54420D35C9FBB364CBE5449E7B53A48B6361CF417CBB825AF93CB61D987442C500FF147B8703D6600CBC6789A83119C51D460EE759638D5302DB28B62A1950F6C63311917A51BAE092756D8DA55DDFA066E544FB7C71BD6D512D258CCB0B6B19B6693BEC15BDDD3706FEC949FD2B5AC81327A3349B62475F642927440C757266F8736B995C996DAE6685FDB89285377A38384EED54622052D197098E5D30C74D65F24B8C1F479A78037CD1936868801A7E688B9E8BB5BE333BA48540DE80AC9B12912F017961DF81CD02700CA6B30ED19325C7A507C5C1004652568F6240A060FF0316E1554168C5190DD32895B389580BCB7A1F5712EC3192B601A7FBC7F3EC9A3CA6106BD99B2800CB7E332CFB3824539801D87545711D6ABE408BE2963AA4AEBB76C9814B7808559831CFB84CB9DAA80104C51532B4867C731B53766932453E7058C23B27E7D63CF303ACD0D9A2F69B4A7B07360456A8EAA14C5142824DE66565335B589B01AE667C9CCF79EB5251A11305CF2349A8C9681A17B415F5190B602A5753B917F693B61A04B96D8C4B5AACD873B1B900B940F3C25E568C8293A679E2020C7B88F162B641891C9263116ED94C5A726078325955825CD697440729087C4D67F0CB126395C1E19824BAB9A1A1AABCC8D570CCA3BB4FF1B6F416A6E239926768657BE34B154129982006DD6B5048B2CC06679C27F070D7746870A976F1699802A61882B65B7D66736574C2A4065352F06C056703295291968237850FAAD14D56EAC4816AE5CA72BC59E04AB07FF4185B29B9B4A19970A81ABAA505FB6F4A3C1E632B2421EEA069EA40C450E3AC2435428A18C412F209509D83C69717963C62748C130E5D1CEC8A924F1E81BA852B3780B38B44AC17B3B70F4694E550B497F9A5DD740A2A7651085261A7840B52D3C95D2AAA899160A6AF7289127606A85233044B6F72C2261F3C2B89946053BA91C6120EDA024C70435B8917C1C2413324A179BE34EBA570C4C0762A8490CB76B021C2978B6237A792973EB994DF4714F230374D20C89C2E5A58E777075CC83EADB309EFA73ECF34771205B3B67C2BC848444A247D4F857D8C6679306AABAA3BD2D4A22E9B7B889574A68168B659B8F2C19560EA178BFDCC509996E8A992B2FBCBB6703478F6C3D6E3020AE0086DFE2408D56468AF66722123D6654C7BB1B246C35B9AC8C2CFDB35370D19C9FF173CD999BFC3BBCDAD053B00C941F8173D2621AEC1571DA391654FC50B9F99E51F26C5313B85E73506A0CA7D156012A63C51D228005B26FFB6427D8C279E9BC6A520ABDB38981D04A2B7ED5311F023572D57A01E3BCE0375A51FA5408C193AA80BBA033A20750C2A09521DD94B7F023271EF2A561089E170531DA641CFF4525233B93FCCA87617C685E00D0CB1317C540B770514A97279C04119436F872DE43A96747856339064794801FD00460DA5663ECDDC739C783608FA59F2E27E4AB3DEEC74061C16465780B59E4DC86 +dk: 74996BF2C7B505FB4AB2E64D9AB83F5169CA5B062CE625184B0315D2B79945D04C818259E454099C55BE3A262B57C31EDA5B4F095169A09A8DBCA39DE41057E3CA126E4781D0503FFDDC89D24B28C3BA4BC5E9437C83A3EB8497E2956D30FCCB29AB0393EB1C1A0B7D2AE177EAF705E69A5B88726839516B096BAE87BB4FFC394FBB86967300AADB340E83CC9BDBC9830171088363BD1080A976EB9FD9A6B92C5273BD09073B8848936C8F1486AF320CA39EA592559A12B191432413C1C4977FD6DB5BB12B0DE877AB4CD63155690C31DB93B5EBBDF29B2A7E642C382478C9794AA5787B7A50CCB9850BF199798DB18861179E6020CC2FAC59925A0B6F775FB219726135237CCB90E321906314B8EAD933D7C53024733DCF076312F358EAD020A88B586DE53AF798C3A87178058207ED806AB4FBB349B953E7C13E6D2122A7C50B1EAC96803C7414DA65020A7ED62A91975BA6EE7174BE62695CA3A7AEC723CA701483B95DEED68A82DB95CE175B0F94A0160332DBE4575DB085215A9A520878FA76C6D3968A8DD9B38EF48738451417B3C835DA8B4F393ABFCA7DA6560278890C2BA8547BD71815043759B5A802130E8957398AE30BCE688CFB3B71E2A77068C88A3C42989735A180B64144817E8AE04A4DB010A3AA4FE24CC0AFC25C89266295532F4BFB89087008F7B265161410B6A72ABECA6B30921A8FF39AED231369D39D8781A7691933F12473B56683FB49CEC4A939BC221C11C11CA904647A7C2F77DBAD979080CBBB624C005488F6211CE7B9B2227A91F04749C2776E399377124FC7BAAC11215E6B75A7725417D049A94AD809711C1B78631DD7D24ED6720458914649F8B5FB6A30E3F97EDD116987655900278EC3A60C278A5132007C91416EA4AA3694A87D481B2EEB40674277783E391D5EE54110787622451D62F922A721C010921F570A095FFC00B8002DE9AC71EA7486A0DACC5CD0727DA19DAE03C9E0C6438CBA0B08F69590C83D6284C2092C2A98CA6405F9B19DEB5C52F7B5F91CB7B653688C633120FC82BB76A8A52AC0D5E68E74009F8E655A2057642A6004FAB653D6C79DFBDC3941E59921D8850399810A881BE80C974929CE9781074D50094D0A469D716B47FA72F2A3A4772A469A31284E91CFE5854F5016CF2747118280276582020D1472EAA3BED0AC192981098EC7524ABB1410A392439A7D9BF940EA19BF3E76BE94D856D5EB3F5D91A917C8886D561BA027AB7E166FDC12CFDA12C7B06AA552BC27E7B67BEE1C19E0612DA58C8CBF0A8EB2B03818D8158BFB1C09268AAB73C1D424C354C8557AC3556D3A944D203276187032771E4C668CDD1145DBF3B00393AAA19447C1FBBF5EE48DE7F07215F85D648A59B3D6602F69ADF57205DC57371CA84C1CFA4D69E32D065CA04A1BC5FFCC1FD215AE3B91936DFAB4EF9591AB18093F36CC6CF36ACC204CE517B9EE9B746E79C5D2E005F96768CB508E7FC96DD38338915C17C95C1BE072CD46A59A3D36887EC80C7B022D3A56C4E495AF71E8A40F2944AF9439241024C6496CD85942AB17359229AB2BB54A0D61301DB560F15263B0196525A2AF546C8EE2CA18F212AC8356AC4B2CB2E3FC7F9A414776A24C662293FE760B0826256FA788B6A061039229502B6887527553496F09937F25C86D0762232C5A9C3CF9CE9AC7C43412295A180DAEF55C01053F71242257610F9F2AC7AD80A220991BA632B4DF1CCB43865C7469BB54A24A12D759943921B62563A1665F864C710B947C629B6AC169A05FEBA11DC87BA54420D35C9FBB364CBE5449E7B53A48B6361CF417CBB825AF93CB61D987442C500FF147B8703D6600CBC6789A83119C51D460EE759638D5302DB28B62A1950F6C63311917A51BAE092756D8DA55DDFA066E544FB7C71BD6D512D258CCB0B6B19B6693BEC15BDDD3706FEC949FD2B5AC81327A3349B62475F642927440C757266F8736B995C996DAE6685FDB89285377A38384EED54622052D197098E5D30C74D65F24B8C1F479A78037CD1936868801A7E688B9E8BB5BE333BA48540DE80AC9B12912F017961DF81CD02700CA6B30ED19325C7A507C5C1004652568F6240A060FF0316E1554168C5190DD32895B389580BCB7A1F5712EC3192B601A7FBC7F3EC9A3CA6106BD99B2800CB7E332CFB3824539801D87545711D6ABE408BE2963AA4AEBB76C9814B7808559831CFB84CB9DAA80104C51532B4867C731B53766932453E7058C23B27E7D63CF303ACD0D9A2F69B4A7B07360456A8EAA14C5142824DE66565335B589B01AE667C9CCF79EB5251A11305CF2349A8C9681A17B415F5190B602A5753B917F693B61A04B96D8C4B5AACD873B1B900B940F3C25E568C8293A679E2020C7B88F162B641891C9263116ED94C5A726078325955825CD697440729087C4D67F0CB126395C1E19824BAB9A1A1AABCC8D570CCA3BB4FF1B6F416A6E239926768657BE34B154129982006DD6B5048B2CC06679C27F070D7746870A976F1699802A61882B65B7D66736574C2A4065352F06C056703295291968237850FAAD14D56EAC4816AE5CA72BC59E04AB07FF4185B29B9B4A19970A81ABAA505FB6F4A3C1E632B2421EEA069EA40C450E3AC2435428A18C412F209509D83C69717963C62748C130E5D1CEC8A924F1E81BA852B3780B38B44AC17B3B70F4694E550B497F9A5DD740A2A7651085261A7840B52D3C95D2AAA899160A6AF7289127606A85233044B6F72C2261F3C2B89946053BA91C6120EDA024C70435B8917C1C2413324A179BE34EBA570C4C0762A8490CB76B021C2978B6237A792973EB994DF4714F230374D20C89C2E5A58E777075CC83EADB309EFA73ECF34771205B3B67C2BC848444A247D4F857D8C6679306AABAA3BD2D4A22E9B7B889574A68168B659B8F2C19560EA178BFDCC509996E8A992B2FBCBB6703478F6C3D6E3020AE0086DFE2408D56468AF66722123D6654C7BB1B246C35B9AC8C2CFDB35370D19C9FF173CD999BFC3BBCDAD053B00C941F8173D2621AEC1571DA391654FC50B9F99E51F26C5313B85E73506A0CA7D156012A63C51D228005B26FFB6427D8C279E9BC6A520ABDB38981D04A2B7ED5311F023572D57A01E3BCE0375A51FA5408C193AA80BBA033A20750C2A09521DD94B7F023271EF2A561089E170531DA641CFF4525233B93FCCA87617C685E00D0CB1317C540B770514A97279C04119436F872DE43A96747856339064794801FD00460DA5663ECDDC739C783608FA59F2E27E4AB3DEEC74061C16465780B59E4DC8644132D7CEA4F7CB9B06AA59C4213FA6293563C4516CF033491742C389AF38643AE51639EF7F26FD2215AD11CBE1EDEB3B943D668EEEFEE13ED5B0DA3E0A5F3ED + +z: 6F9FF5654FDA78774498E2643E935D21412CEB49BC393532C80C47A982418F66 +d: 3D63BD6C310AFCF684292E5F8E1B98CC75B5A27B21526268444144AB24AB2967 +ek: FF22387C34AC69033FB8CB685DF308A47B6A8C9978A152A7003B583DEB864C3C26432780D56785BB511EB2507E40BA80100A1E4FEA67A2290F26F75AAF655827E95C1624A127795D88F34927989594D228F1497CF998BBCF012ECF6156FDC63870EC49E38C29C6C35ACB89B031419A0BD835425A255400B05167758F56474D8B83466738383320E22514C69203AFF561DB2B1596C937EEB49044817949B726FDA5B46D6980F9099B17E6BBC4272F4185739A687E8171BA53497E26BBB215163FE18448F1D005E6827C2177CFA0A3CC516B48F3D1BA1484C33169963F071E13C20BEF371DD4013B1D5B0608C0C0C52241AEEB42F81B5D6BC09A6627C6846AC962328A54DA2573CB4A4D71C729A4AEC7411EACD1053B71B8D932C3AA6A759198B26516843B9C344E1A1874AA22EA88353E7C6C410121026CC75DEBA8C5E3083D83BCA0A4C3EBA5C653021AF25C6251FA486CD19AAB6A6458FA6D29C02A7FE6CB2192553193AB92857AB1141458916653432A71FA4667FAB3CD1A602AAA7294148B17C2B82F86900FF55EB4CC0A8A14940982496F417809956874077A4F256448F2B661FB0163C687CE8B08EFE14C1F4279CAF8BE239338535836FE5B12C1A8A4A9EA2BAAB732F3E36262AB028BB30EB88B7042297BF92B22757A0AB0A817DF03707892043DEB2FD8963FB369A8C76A8FFA17237EDB8CC0450B2E9726491A36FFC2B58E7C9CA803517FAC9C047C4CB056B0316C3CAB239FFAC13315A3675BE2B042938C079844F72601CB6A8353205211304DE0229A249148BA13C7E969CA28E95183863AB3F838EFA3BF9159CE989358FC1A69BE3C764C87A4FB8B1739510E7211617806ABF4C19FC48C6112F3C67AD92C342A40B7F5468A559563B2C2BBB7869B221959526B22032059F093BF3287FD652CF51C7A4233C17DE638E8C92EDB41C77ADC5ADA927BDB12A7EE2B00CB2577A6937C0EBA364F9093E8E94AA334545D1797071A85EE0BC9037B352CDA8D2D874E16B344E02894635A3B5380CDCB6674951C0399B10062429593573D39A06817E84F7D517332F92903C7CFF7651D7F1C37F648C22A872CC007BCF33A4E991CBD34069CCC6771B9582D83136F52790E74A24CC86C439AB7C5FF1088CCCB81FACAB6E1D0092D14A05DDC999AE4C006899D6FA6186940925BCB614DF83C5C95555358894A5A4ED2B1A8D8C7AF8B5C63CC917B849B4B544995635845B2F50BCADB9E25BA6AE2C10458D2C1358430A8EB27884B8EE27B6408265CD24C59F9B7B3E0CAA48D744BE36A3906F488C432634D88123A981B79A54C50237275262A5AB111FB51AFE1847C9E284A91733DE5F38C6D39A51987CDD368CB3E136D92A312F515A243F999C04495DD7B3EBB3CA1B82B3647935C77951672BC9520092D203AAD318852F93866E6F6494E695F4C7A97D035956C68B3A56C5A51298F1CB0997528376DD5CBCB5B15AA19A1A5B77B98F1355210543A0C0366F5328B2A49647021CC3246F1856847C637AF4B390B521B890C346CE5B4E3F1A51A874BA7DB1D2D8B8356BB0EDF48C9EA01177E801BFEDAB6444B4B911549BBEA1230FA6183949862A06954B04F4C9192B9EBCBA8151E20D48FA3CA8943F13734D9C4E642A7A7DD2BF360600ABD6E84E29BBA27F96C191480EB71CA68 +dk: 33D925297A649E979A40147093E74DFFD1749917C75E088AB9800AAAD81ABEEB293FF88634706904220E90490D968C097E33A2925C251904871E78975E564606617D0228227DFC3613CA0BD6F1B6402476AFB25BC4D0AE47A2A401C95C721A04D0536E42DA76244908E8D0769D5524B1A96FC9548A7C7A2C6BAB0B081618F2C19ABC358A1DD18D96AACBAF943A4CC6A7FC316FC629A25346B82B42A746A9C4D27C951D363AC0669AB3D6368D619F17EA93DC2401DF36BDA6835DB6EB02DD211AC6927B918071DEFAB2B9F671DE554E727875746475EB886286A165749504B5919A39BBC4536C8154E5B7A9D3076E0A1F068B2C8305595ED2A1469321A7476D107273221C6C5C9A2224D4AE615991D67869674B3A5994255470BE7383C1FF636AD276B7B810794B3885C1788BDA26256DE13F8AC1179C3614ED27B0A7F220DC22425BB7B8B1A8AE2CA6057CA5BEB447042A43CC82543D43F6134E9C5DE6D52388AB9D4C746202EC759781B4AB0C684B4B270570B23078195D4233A71A451E196131EB8AF598BE86B1511DC2C85CB50D001150CA2A7A3692C7E2CA09C03A243B5B0176E9BEBD629B5F4CB599D15FCAE7A7D7F44566E0A4571740864633FACBAD195AADCDFBA9B322AFEF119436B96624AB410F764083395FCB4C81FE6616CA80CFFCD6A4CB9B35BD8557D0AC2A61AA1042B414AFB0020EE1006E593DF29A625E010C15F7A5DFBA4FE459060F90882EC91AF77181C3E32FB027AD397B8CDBF52D397654CF68B2335A3A75EC24C87852B846BC9FD07FD9D767396A5511402A1993C9AD9138FF800C6B6051A6B94DD2BB457E9883F2954980715706B07A15A186CA57A5F0F83A2CFA01D22C5AD79176C9AABCFC481B67989648000DAE714D49E6C5D9E0396339BA1C22216084BAA7B403DD998F0B9600BCF419698A2CC853CD145156FCB0C193928CC32631A2B3954AABCA05D43E1E4C2A3EE34815C8A0095102E8487A82397D2283562B19A5D88993AEF77B57886B1129B9F442986461A33293AD5B41AAFB25A8D8DC48F128B67B07C047B1CB52603082E422425059A585A7B84BC948D6B7FCA6A9E7BC17B44251343202EC892D2DB09F6EECB9483A03640C4C56B32A5B8AA44D847703C988B1C02FC02C7BCFA7642AA7C1B67B539708743517444D470F273A112EC87FB7145789744F5037095EB88015932EC4B3CE62A4314B97935CDC2F252CB839442D800816CD6AA0FEC81251F6CAF6C4A1E1A9C7CEDA798135639311ACDEC014E4BA0335A9919501C42A729E6E9556AB9BA1A1EC7D96E225159886F7C67F520305436864C9A70FE7272315A7CEEFFA6F39AA8FFEA3CEDBC8CEAB1318A64335C1C5530FFC89C0CC1D6F7905C5809E61363719F54FE7E8844D382BCA679554D368D3976206289B1A4BB987A6AD72B59CA2BC2D91A61902144065B762CDA31255119C9E19C579F4CD2A7620BCE0546565C0C82A35001900E614C62D2B7856142349B25E32CBAF0634BEB9D2B603B67019AC8FECEA9F5144782EE47E2EF823E9E646A253ADA9B8B809435C33F890B0D80A565C7FB5A19E5DCAA39E4983FC149BDC1B8477B808A5FC6379C7018134C73FA197F1E87E7443373D108AFF22387C34AC69033FB8CB685DF308A47B6A8C9978A152A7003B583DEB864C3C26432780D56785BB511EB2507E40BA80100A1E4FEA67A2290F26F75AAF655827E95C1624A127795D88F34927989594D228F1497CF998BBCF012ECF6156FDC63870EC49E38C29C6C35ACB89B031419A0BD835425A255400B05167758F56474D8B83466738383320E22514C69203AFF561DB2B1596C937EEB49044817949B726FDA5B46D6980F9099B17E6BBC4272F4185739A687E8171BA53497E26BBB215163FE18448F1D005E6827C2177CFA0A3CC516B48F3D1BA1484C33169963F071E13C20BEF371DD4013B1D5B0608C0C0C52241AEEB42F81B5D6BC09A6627C6846AC962328A54DA2573CB4A4D71C729A4AEC7411EACD1053B71B8D932C3AA6A759198B26516843B9C344E1A1874AA22EA88353E7C6C410121026CC75DEBA8C5E3083D83BCA0A4C3EBA5C653021AF25C6251FA486CD19AAB6A6458FA6D29C02A7FE6CB2192553193AB92857AB1141458916653432A71FA4667FAB3CD1A602AAA7294148B17C2B82F86900FF55EB4CC0A8A14940982496F417809956874077A4F256448F2B661FB0163C687CE8B08EFE14C1F4279CAF8BE239338535836FE5B12C1A8A4A9EA2BAAB732F3E36262AB028BB30EB88B7042297BF92B22757A0AB0A817DF03707892043DEB2FD8963FB369A8C76A8FFA17237EDB8CC0450B2E9726491A36FFC2B58E7C9CA803517FAC9C047C4CB056B0316C3CAB239FFAC13315A3675BE2B042938C079844F72601CB6A8353205211304DE0229A249148BA13C7E969CA28E95183863AB3F838EFA3BF9159CE989358FC1A69BE3C764C87A4FB8B1739510E7211617806ABF4C19FC48C6112F3C67AD92C342A40B7F5468A559563B2C2BBB7869B221959526B22032059F093BF3287FD652CF51C7A4233C17DE638E8C92EDB41C77ADC5ADA927BDB12A7EE2B00CB2577A6937C0EBA364F9093E8E94AA334545D1797071A85EE0BC9037B352CDA8D2D874E16B344E02894635A3B5380CDCB6674951C0399B10062429593573D39A06817E84F7D517332F92903C7CFF7651D7F1C37F648C22A872CC007BCF33A4E991CBD34069CCC6771B9582D83136F52790E74A24CC86C439AB7C5FF1088CCCB81FACAB6E1D0092D14A05DDC999AE4C006899D6FA6186940925BCB614DF83C5C95555358894A5A4ED2B1A8D8C7AF8B5C63CC917B849B4B544995635845B2F50BCADB9E25BA6AE2C10458D2C1358430A8EB27884B8EE27B6408265CD24C59F9B7B3E0CAA48D744BE36A3906F488C432634D88123A981B79A54C50237275262A5AB111FB51AFE1847C9E284A91733DE5F38C6D39A51987CDD368CB3E136D92A312F515A243F999C04495DD7B3EBB3CA1B82B3647935C77951672BC9520092D203AAD318852F93866E6F6494E695F4C7A97D035956C68B3A56C5A51298F1CB0997528376DD5CBCB5B15AA19A1A5B77B98F1355210543A0C0366F5328B2A49647021CC3246F1856847C637AF4B390B521B890C346CE5B4E3F1A51A874BA7DB1D2D8B8356BB0EDF48C9EA01177E801BFEDAB6444B4B911549BBEA1230FA6183949862A06954B04F4C9192B9EBCBA8151E20D48FA3CA8943F13734D9C4E642A7A7DD2BF360600ABD6E84E29BBA27F96C191480EB71CA68D4F2A9B485FFC544CD3DF67D23C80150AAF7A45CD946F4B7DB2B67F4F8B222536F9FF5654FDA78774498E2643E935D21412CEB49BC393532C80C47A982418F66 + +z: D083E6922EF0A818308FD7FE7CF5AD3A96942442BE327B0A307685C2D4315901 +d: 249D48941ABC01C9290719FB34D91B05E774E70E6F0181E1783F2586E2499536 +ek: 11709FB3C60AA689CFC149954EE25C7071A4DFD724D0C4CAB2F4B3FF715FC16302ED2BAD6A926443A617AA2B44FE2283A660C0951A0A41C56EBBF5AC1945454B8A878E3C4FEB22C10FF5B0A3C7C177A84EFFD670622479A401A5909399F131909B349799CB116C51BD02778774764EE6B02EA64929311281FB821D074B1385A6A965E71F9A065DB2B78908048AA46118BCF95CFE0BC6F0318B1E3C4C2F895B98613DA1141170680191D896044C40EB4741D2D21E0C506410D9092F821DBDC04839C6C6C73487F9F239DAA0346563433C32B9A1F7254717A456B04F65965C614973DDB5C43B9072A120294021A21275007360940A5B8613C01E703128B9F27B037CBF88049FAAD7A10C2213F39A82510A872C7C2850D3CE5A48CBE5DA4B3547AAA3B8612F64840C00ABBB09BCB4F031EC6C2AC284A35D84796D4B23FA621C9E0CBA6E04632B8BC5D840765168C08F591871986FD44BBD78E56C30AC80E32229A0F57420872528308C52A028B1993A93003A9E40A1B75B6CE4ABB8EDC109C77B3D2A80B21F1827904C94666AB80AC9702CA78963F36510CC7CCC6AAC6E9489342371933AA4C6329926437A58CB8BD5CB64929929FE9707A13805B621A95803C7EC68A83676578C039C8F273B12C8A2C1853D3AC6169CE95364F791F7A6986EF765C5F0829FA888C8DB3FFFC3A701E3B4D8246B62B3A4FB637FF532BF152452A824AC25AC24E416CC21667B09055C77C12925E77FA67CCAF2C9602091149A730CD3F627A8613B149A2D3789C19CB6B09E5CB64E42A82628C4BB168A492529680B1BAD2A6F0F7350708030495768DD9C82D6E9812DE35FA90689087B8DF242414752AAD8E15BB3BAAFFA05A1057A8262FBB1749C9A6C4272750134F72682CA753B1E555A60D91B26728EE540132DE67958D3928C3A72CFF02BF92997B0B39F06FAA333F5987713BD113026D327AFA167B040436D9940C9AE7799A4D9CA86278EFFC846FC102625583B42234EA114B75057531A07A4E23C340E04A066F3ABD69AAEC83CAA5A88BF27A0592F5B443223864A341E2F3B21CD0262AC3B89A1E735D6B9001A1C98C12210A8E45E377A8424132A10D317BF02939B6877DEE6AE1D7818C3115076B741C307B805C4860862382D1770678B4006402B93979B2383868BA1901F50776A28978A016C4F95787E8C875F694F94E3116DD60F284158BC283B79C7CE377C3F1197AD3EEB3BDB2C8E0505250E58BA75816A21E171F9A8730FA2CB8CCA44D02902F07B6BCCDB6AF8705A78E6854935299A340E62A12418B6693A0909CE5A8F1349A993E75CC4806DFC045F4C28B4DE8C9AACA04713E62DBBE3AC857B5445D6A5F5C115D5C29318F2BA9FD126F46960DBEB3B3DE53350051980E7CD5DF450087BA97CF36B7A566F0DC1479545BCEA5C950AA4CD4EA324B04036BB6A93D8519C66B12AB2EBC05F849209A603BEC768C96587A33963BAF3A8F5D8309DB35ABBA81423C365371A9DFFA649A726C4A84604F4B893F3E30934D065CCB0383A2058C0E121C3133C7FAA4C3AB4B7321C3EFC7741400004D279C5D76AA512692774D9C319A59320BA18D5C116838C8CE96A43AB562CED703A05357CDC20AD5A2A32211A2949927F642B278E71BF94390BC90A3969017B88B8EB63FF6AC90AC92362 +dk: 88A386E9E2401A9A264FABA1EA2B6A13B5BEE6207582309D39C43BD37CAF668AC6D1D36E8003B85FC37755441F94E60719E92294A88B4E72170D1992B5382B7FEB489DD93A60383A2D29316B7179B8462346F85662E1C7AC72C86A496CA1635B55B535CD4348D6C97D3F5A74FB60C6ECD77A62B83CCE9BAF0693952C86CCE257AF464033EDD5AFDB07333C2A7FF358B45097A8FD87BD5642B12E1B5EAFD73761BAC07BA748429426C98961AF89771FB709EAE812F9724697B4C970583012C2C4B12C369BDA8EDED8A1AAD2C042CC7F2FB86C74B82521C55FEEC5C1FB5087A3E1B93DC1750133386A491695428F09F0696158659817C66C86AD2BF388E2F74B848941AD5A8D790081D3A63E85683AB65499C0EC41C8FB146664CF3FB9311C3786B1D90DDB54B1390AC902F42B30C29F02C236DC313026772825FA70DFB8572C3BC5B968B143719A5B132620D811AFE27F3F096BE180817E36B3F1F78700F00AC574CD8287A25EE1CDFB844F9224C39ADB10B99044CB7009DC1A67EF397B23F2BB9AF5A0AE6833210728449026EBF20E354C14C856C930D61A07CABCC510042E079415D67F6CFA0E692344F3397D0A381CD3E56DF6398C6730C346502039FCCDCB0389DD97C07F9C22FFE5AF7D22CAF6150A7D7A4D60787A67C3582EC82AE8A62FD3A175F8E27C653CAB2A2C69F1D844B1972110B2AC3163BC119A69E4D628DF2C0C76266599D08BEB6B659176CDD07B1A50699DD92AB3EB2C787F90533C28156B8405CD46C1B6B67BE6399319A4BAC4A93FCB659C819A6EC9A1845F1C791C6915F7A40F3DC578C8E016A0E2703F776310B3BCD487B638671628BA508101800B94AF45AA0C3C49559A46979906A8BCA9A474D0AD63F035E95B918B0297440203E154A676572F21D0815BC45D3E7402E537669FFA65FD903A76219C94D275B71C3B9D69C024A17E4F0284179A5F4E668F981B7F968507FBD52797B19C89941BBCAA117786C202030C33F476656207B7C87CFDA16699842F72C5746D843501D9977F0804FEFC2D603C9BCE710547AC047F94980899BB1E167C26301FC146A6C89081BA492274C3C894936B57F94C12D1C3B47CBA740023A494C90942AE0290782850613DE10F52727CDD2204B106AE37B0BB3F3626DC41A6F0B3CD8646CB99F56F6ED137EF803E4439878C58B2EB280BB8FCB95F7021CCD41D2B1A40D6609830BB5E2401389733104A8077B3683EEAD98FE5EC5AC7679D3A2C6F227484D73B4F9E285E4B7C4F47E9071F637C5F8B713127CF2FE77378E2CFAFD148E433B2DBF74FE0475596051EF55007AEB8A59959C8B683A6B726BFD706C1F3E4A748430C01C893078178E3063F00F797AAE6394FD637AD155221C49C533977CE8014136873942114C54462B8750264248F04165853944B1F744EDA307B62998DFC0C63D5EB9D23DC2589210493A69C0B9820D12282E5689FDAFC1E1EAACBF88551D04B2983C2163C1A5F5CA647FC3288BCB5B543C89765B9203B5803A3006F5666BD73F5A44B60A5BDAB85B7C63556323EF82B45A4CBA06BEB388707873D28CC096651E817215485129154C15173B7A7AA826DF0649C96592C7AC8E1B27872C56CF0D3495CB54111709FB3C60AA689CFC149954EE25C7071A4DFD724D0C4CAB2F4B3FF715FC16302ED2BAD6A926443A617AA2B44FE2283A660C0951A0A41C56EBBF5AC1945454B8A878E3C4FEB22C10FF5B0A3C7C177A84EFFD670622479A401A5909399F131909B349799CB116C51BD02778774764EE6B02EA64929311281FB821D074B1385A6A965E71F9A065DB2B78908048AA46118BCF95CFE0BC6F0318B1E3C4C2F895B98613DA1141170680191D896044C40EB4741D2D21E0C506410D9092F821DBDC04839C6C6C73487F9F239DAA0346563433C32B9A1F7254717A456B04F65965C614973DDB5C43B9072A120294021A21275007360940A5B8613C01E703128B9F27B037CBF88049FAAD7A10C2213F39A82510A872C7C2850D3CE5A48CBE5DA4B3547AAA3B8612F64840C00ABBB09BCB4F031EC6C2AC284A35D84796D4B23FA621C9E0CBA6E04632B8BC5D840765168C08F591871986FD44BBD78E56C30AC80E32229A0F57420872528308C52A028B1993A93003A9E40A1B75B6CE4ABB8EDC109C77B3D2A80B21F1827904C94666AB80AC9702CA78963F36510CC7CCC6AAC6E9489342371933AA4C6329926437A58CB8BD5CB64929929FE9707A13805B621A95803C7EC68A83676578C039C8F273B12C8A2C1853D3AC6169CE95364F791F7A6986EF765C5F0829FA888C8DB3FFFC3A701E3B4D8246B62B3A4FB637FF532BF152452A824AC25AC24E416CC21667B09055C77C12925E77FA67CCAF2C9602091149A730CD3F627A8613B149A2D3789C19CB6B09E5CB64E42A82628C4BB168A492529680B1BAD2A6F0F7350708030495768DD9C82D6E9812DE35FA90689087B8DF242414752AAD8E15BB3BAAFFA05A1057A8262FBB1749C9A6C4272750134F72682CA753B1E555A60D91B26728EE540132DE67958D3928C3A72CFF02BF92997B0B39F06FAA333F5987713BD113026D327AFA167B040436D9940C9AE7799A4D9CA86278EFFC846FC102625583B42234EA114B75057531A07A4E23C340E04A066F3ABD69AAEC83CAA5A88BF27A0592F5B443223864A341E2F3B21CD0262AC3B89A1E735D6B9001A1C98C12210A8E45E377A8424132A10D317BF02939B6877DEE6AE1D7818C3115076B741C307B805C4860862382D1770678B4006402B93979B2383868BA1901F50776A28978A016C4F95787E8C875F694F94E3116DD60F284158BC283B79C7CE377C3F1197AD3EEB3BDB2C8E0505250E58BA75816A21E171F9A8730FA2CB8CCA44D02902F07B6BCCDB6AF8705A78E6854935299A340E62A12418B6693A0909CE5A8F1349A993E75CC4806DFC045F4C28B4DE8C9AACA04713E62DBBE3AC857B5445D6A5F5C115D5C29318F2BA9FD126F46960DBEB3B3DE53350051980E7CD5DF450087BA97CF36B7A566F0DC1479545BCEA5C950AA4CD4EA324B04036BB6A93D8519C66B12AB2EBC05F849209A603BEC768C96587A33963BAF3A8F5D8309DB35ABBA81423C365371A9DFFA649A726C4A84604F4B893F3E30934D065CCB0383A2058C0E121C3133C7FAA4C3AB4B7321C3EFC7741400004D279C5D76AA512692774D9C319A59320BA18D5C116838C8CE96A43AB562CED703A05357CDC20AD5A2A32211A2949927F642B278E71BF94390BC90A3969017B88B8EB63FF6AC90AC923625D0BB5F514CAC167BB2E2B5FE989CE88ED65315BC610D9A5BCC77BA80DFA2FF1D083E6922EF0A818308FD7FE7CF5AD3A96942442BE327B0A307685C2D4315901 + +z: A20ABA8A8DDC212DE825BE0D3BE57701A6B5B3A46A300D9B5945F579A59AFABE +d: E1CFB8195877B2D4FF3363BAC3B4E7BEBA6DC3CBB789B1B24215393F6C9BBFAE +ek: B749934F35347C7251B0359B6582502BABBEB5574F30C63568139B1CD854BE96B8A6F09069460205BA245182334F669E93F8C7D867945C3B75BF1CA810108E0F670249A62B9E6910D793C7F0A24BD3C40839D713F880B4EC6AA8AD8ACF6EB03E12FC5B1BF61ED2480A9CF68E30A441E3102611D25E9925503E704DA69393152A759DB92175E0343560B961759370BBAB159320EFA846E4A316CF8035D8EC991FC4529055A5C7F76F6FC5423AA041CC4691352A44E6E91E54DC129B000C0829C069C1538EAB1E5BEB58BF0733B64A17C5D159ED31AD4B15B36664465B6548CD4060B487C0C76890DF4B4EEC5705DE97BF47712C667023E627480A4533A9258162050F401CACD75232CF7621BB3B00F76A1CE2B42E65A91E65306F6C019C3F0C1E00FD2192E703EE5592A41C95E8263F53B16E54A952D72078A1589FCDD7BCEAB03A41D89E1D9071DB88C344F65C8D6714C367AF7C5287D6B68EA319A7DBE97F7604AFA67A27BA136C2B996B6A1C4647A8B56CB8C0D6A4BC9B33079D5B407522195ECB9FC23C778B27ABBFF026A8CB84ECB66AFDA43D40558990931736D32EC4937629FCCD01D7B14A1241D2ECB7929C443AAC703553C63D7C8410A891986C770200598F98C8AE008CA7D95CC347AC7BEC18ACD24028E6AA4DCC856BCB9D370195BCC85DD8496B62CC3A06B5A2A5961D781659C068143952C4329BBAE9A985DACAB8201B1854995FD2BC544BCA66FB927757B78207E9C44405C04002917B2BAFCAB59AA298B555717B79257AD5BC1AB1B10F92C229A9224CA16433D244770CA18A9CE12841EC38E8D131D75912C05372CF8C845E256DE2DC38283B0E2326A5DF7A3E4AA112EB91292709BA89F7672CA1BBD599859637782C7C25C61C03ED288CA6181F5E194A85C37615A1778BA51F62789614B715ADE62E85BB8490E7B7D1C81C9B578E411904D7C9C287442D406A1BD26CC759DA58FC867B0A39954F7B29702B74BEDB4C8DF87B7E57526C25C2123C1099A21CB3882C966191BAA5C89CB19B08DA6E20C588B68C954DC7CA9483B1B9FB508C694424D85C99E35AE8A084CED1C4D4B9CBB4246D28170BA94109853BB0224A2638E91FF3269AE2B013D515BD867A6BF7797B309342DA513DB1D18031BA29D72A0850669C27A1B27454B427785327225C73968FEA012D5389861B56631F89316F3B9D59C77E007B88607A53A5D7679BEB45320CD0EC605C2B0B6C7221BEFA0BBF1FD65888E5030AA18983AB1DED0979DE800DAF11B54C50971775C98BFB5B30772A6CE835021B4344D075022B4DA1A8A00E0BA140F26CC2A36F1685424642518F57217F60ACCA0B3B24BC2DFF61BF1A903210582B684178181B47116B4139E2478D37BBF006C9B8F849AF07497F493A8A0A0EF67268D8526F3D874A7EE3062E3590AA01CB09A4BB6AE73839602DFF6A0D335132864AA178C19D8D096E3094719D6ACEC6305CF3E59B190961C17B281077838E57805ABC615856C90BE8595B00C19D93B42247B925402ADB132E78C40E18C52459A542636208D0E068C12858BAA380FDB287D7E4B855716F2365354C63706EB5561C64A012F56BD64C06D2582E9CB34DCBBB837CC72C82A2CA557B328FBD9838D19A8BA5CAEF7F516F782E8BFDB53A793223A813F942BB5A6E0965E5 +dk: B325042B81C75CEBA41A96A16D9695F5842C3E6B9E7CE97B765A7B44E49B33501E72CB6F5F88A94C9A731A784A1DE1955A3337DD299DA82C5AC31AC581B46BADA8BB08C1736C785633610ECC5B68C2786D82C9A08D6277ED6914C43695F275286B5B5B0AB1C8D936AA569262B6358CA287A49E06392352706068484A14587C9B71084A35A5F8ACF78C47D34B43E84331835C4E75E17645E045ADA45D9F99C267B4345CB92241BCA8CA988353348A9DD73948A941D553BF444B0230A16F7F625DDEA463A2C49246273963BB1A9C2439B3DC18F3377A15414E775700BDC408353C7124E1BCA513AC5D415EAAD5A36D72A965357248E0AA5A8B84920C4BBE4104204449CD947484B42D49D93772C038D6554F0037BCDDCC50417025F4C0694EC7621ED82BE87BB3F3E9CDDE27388F55B730C40B722269D53C6BB388557AE11F960680F8F031443B6BA70C1CE45B329A6269F7B410D9C40ED4D18FF1B6CABFB20D89019F117032C5A2008484B078488D2AE065966C680F7098F860C896461BD1D0C2947B67431B3EBB3734664C4CF1213502E0C7826A4981FB8854A5A45B216F469C72CCA4637D9C61249232760B58D785B3B411683BCB33DBE175F9E240955A7B20D819C06C5AB567C8F289915CBC3C50204443F17EC096B399E11530505D94C93EEB9946E41362BAF7772C7B153AEA4620349BCEBB2243B85759093A98D13E5CDABF2BAA25A31464C19A358B1CCF6DCC10B5341E677C0B37C65EA52717FEB98C84470261E23FC7E02AF5D2CE086A326832174FB089B768B4701A9748225F01F98F1AC42DBD99594F34812DE15A09CAB805B695574145E0AB1D9600B18BE721E70C11978ABB91E159EAB67098A77D8F51ACE14CAAE9F3360645338F0A536450384452C89109AB3D9A5C8328B3CDF0334F748464A383883C033E673A6799678A860548FC4D47D970A8B24DA195CED6B52469AC36CE9BBD159A60FA6944014ABAF99868B963943685C7A15694D4B2BD6ED91734D601680C692314982C4445B6547CDE146B9B82C558F5ADDB84C2CFB93E91E61D4016728BF724377805F0060E3C4C943FB8AB1359979B495723C32AE096130E559604A5BB80817EC947A23785CBD7209D7B7672D1251CB234A196374364A0439623C51E997D2051C0C6630214DBB6FF1C88B1600BA11A0784D68807E830B885007C202376970B92625037677AD1B81270679349DC4CC56529B5BA205EA596AB489B8574CF668303EDA22578258739A525364A7A2C3439B6E74E9BB1A7462B2A51327719528358DA11D7BC856142A4118449F8B89C5BEBA43C117A27C65BB1E70DCF5B36A1E45416E2074BC1211F14AB957C4810C84818932653D17C4805BD6A00C80E0C0FF7C51295C670A8B6758C23A21CB21E6E097AF583AF2761AE3D62AF0EF56226E31492120B90322D76D6C1F657CFD0D2BD2F6CB4F8589012B99A73B82375C54E283C6F1DD12FD53B1DFEB540280375033B0DBA671A7D608FA3BBAF8422AACE1055A787C77506C199D19A01E1A0391798C8BB967A1C797C247C214B790B14606E3403EB91A57340557F872110C0185429AC9C454181375992D6C7C9F743DC832F2A13CCA8C8B42F63A609329DB749934F35347C7251B0359B6582502BABBEB5574F30C63568139B1CD854BE96B8A6F09069460205BA245182334F669E93F8C7D867945C3B75BF1CA810108E0F670249A62B9E6910D793C7F0A24BD3C40839D713F880B4EC6AA8AD8ACF6EB03E12FC5B1BF61ED2480A9CF68E30A441E3102611D25E9925503E704DA69393152A759DB92175E0343560B961759370BBAB159320EFA846E4A316CF8035D8EC991FC4529055A5C7F76F6FC5423AA041CC4691352A44E6E91E54DC129B000C0829C069C1538EAB1E5BEB58BF0733B64A17C5D159ED31AD4B15B36664465B6548CD4060B487C0C76890DF4B4EEC5705DE97BF47712C667023E627480A4533A9258162050F401CACD75232CF7621BB3B00F76A1CE2B42E65A91E65306F6C019C3F0C1E00FD2192E703EE5592A41C95E8263F53B16E54A952D72078A1589FCDD7BCEAB03A41D89E1D9071DB88C344F65C8D6714C367AF7C5287D6B68EA319A7DBE97F7604AFA67A27BA136C2B996B6A1C4647A8B56CB8C0D6A4BC9B33079D5B407522195ECB9FC23C778B27ABBFF026A8CB84ECB66AFDA43D40558990931736D32EC4937629FCCD01D7B14A1241D2ECB7929C443AAC703553C63D7C8410A891986C770200598F98C8AE008CA7D95CC347AC7BEC18ACD24028E6AA4DCC856BCB9D370195BCC85DD8496B62CC3A06B5A2A5961D781659C068143952C4329BBAE9A985DACAB8201B1854995FD2BC544BCA66FB927757B78207E9C44405C04002917B2BAFCAB59AA298B555717B79257AD5BC1AB1B10F92C229A9224CA16433D244770CA18A9CE12841EC38E8D131D75912C05372CF8C845E256DE2DC38283B0E2326A5DF7A3E4AA112EB91292709BA89F7672CA1BBD599859637782C7C25C61C03ED288CA6181F5E194A85C37615A1778BA51F62789614B715ADE62E85BB8490E7B7D1C81C9B578E411904D7C9C287442D406A1BD26CC759DA58FC867B0A39954F7B29702B74BEDB4C8DF87B7E57526C25C2123C1099A21CB3882C966191BAA5C89CB19B08DA6E20C588B68C954DC7CA9483B1B9FB508C694424D85C99E35AE8A084CED1C4D4B9CBB4246D28170BA94109853BB0224A2638E91FF3269AE2B013D515BD867A6BF7797B309342DA513DB1D18031BA29D72A0850669C27A1B27454B427785327225C73968FEA012D5389861B56631F89316F3B9D59C77E007B88607A53A5D7679BEB45320CD0EC605C2B0B6C7221BEFA0BBF1FD65888E5030AA18983AB1DED0979DE800DAF11B54C50971775C98BFB5B30772A6CE835021B4344D075022B4DA1A8A00E0BA140F26CC2A36F1685424642518F57217F60ACCA0B3B24BC2DFF61BF1A903210582B684178181B47116B4139E2478D37BBF006C9B8F849AF07497F493A8A0A0EF67268D8526F3D874A7EE3062E3590AA01CB09A4BB6AE73839602DFF6A0D335132864AA178C19D8D096E3094719D6ACEC6305CF3E59B190961C17B281077838E57805ABC615856C90BE8595B00C19D93B42247B925402ADB132E78C40E18C52459A542636208D0E068C12858BAA380FDB287D7E4B855716F2365354C63706EB5561C64A012F56BD64C06D2582E9CB34DCBBB837CC72C82A2CA557B328FBD9838D19A8BA5CAEF7F516F782E8BFDB53A793223A813F942BB5A6E0965E5B5E964695C24F57CD05B8BDC23949D382C7E9023CC1432BC131689528B1453B0A20ABA8A8DDC212DE825BE0D3BE57701A6B5B3A46A300D9B5945F579A59AFABE + +z: 7FB950A8F51DCEC4BC7A573EDDA56ECC049E5688476BD5FD6CD076A8F99A019A +d: ADC4DA59D935DD87420ACEE52AEE19CB371FD0BB498D79BA680159EF7CE37C17 +ek: 266B5ED5BB000FEB4C73CBCFF6E8A980326E798113223C1FD815922E1247992A2340B70B46A6CFF3638A9E741B478BC7E6C476D2F68CE244BBA73AA919C7A48770C5A9A798DB1901B2D93836F5C507D862811949CEB4BBC65CC2D6FC36E2215078149355B83B83635BEEFAADB6FAA387104213CB6609F8B36D291B3B567ADCD85EF569966E527102AA159F0912E5617E1B0C295D12838EB7790F0C4E4A93562EC21F94C517F5B6CC3F7B3F6E832F93893417A2797F9848D5333CE5741ADB867E64E898362249A2632F7ECA4BD38034BD5184BCAB71F38854A02A2C4693B32CE172C1FB41AF3A2B2AE370889C485F98587293C6758504189050CB437A991B8EA5E25569D1A9ED194D0E470A419B453120288D29763C3BAB00F5180CAB07DA070DB401CD28D69892B77A847A47C51A2D0B39A22074627CBC068D42988A60481BE5934E626201292AD073BFF81CCE044A33E3F3339C7B9446C607E666656A94A0034445635312B20A76CBC4C6763C338AA022D79A826D2841EECA89D433C5E7DC041ED488610A1F5A951FA966148D1B8597101C7CF8AC44F5183D42C689079164E90B5DC582A761571496B7A8C3543FF275D403B923B032CBB87D5EE90EF8853AE78590D0E8B200C3819705AD47E71568051C026B4B5C10760495994208AC61A08C23ABB921828A5D69740AF57507E339EF977649999330C6A9B584642F5539356590C6CB64872517996CAEF853219C5C2CC1BA04F0C8537039C9A3047DBF17CE18673B039B2A9EC083C7E53146863B61199169C9B1838CAB40508A6B709DD8502783654D55766E6B671B6C83201509395BC565B10904DC27BFE30842479528995A5888AA8E04374E2918A9EB642629A135B9306A21CB02C925BC99401EAD40285A7B3CF5A809FFF6502E727B332269E8C445C7D9303BF35C344615E19220E391AB4F2011634C292C22022AC0CD5FB51339B83833EC7404FC38108207B8A5B1416C2DD29785F3D87F0BC75F24C65864C31EDBE243EA0B8AD015A003BC9EAB583FDB5ACB32BA3BBAD6BE5A189472560B22614B5BD257249C4458C7601C8B0E48D0C72DBC5743E77350D64DD6A587B67280D04B20D1DB15275361DCA43CEC893EA5401FB3B459637817A18755876983818CC1C745CF70D2A8CBB36050601BFC34BA9685A02B6652535BA101A5193660A06CE54DB9700A977AB36E612549E51FDFAA5AB0490BA7A302DCB314ED026CA1D765D54145DA1623F9A7064D2926F25A0C9FDC4B8CEB8C765CC9B3A55A4BD79CFB9754ED5786F04395B7A80ABE92687D6900DD14C3AD743E2F9540534C63602858371C3D304263C2185E29261237A848DAE97507DCC5FDF60209112E08D269F56418F2FC875B693D5C9CABB9BC636FBCCE548227F42BB001EA6ED64057656566F51A927B178E17AAA24A0616CA362AD134AAC5D36C5447BF4DD0CB7DB95C9009B7109826B1D8ADEF95CE8B9B444848B41002426812700850CD7572A2530A2BDACB8CCCA5485032454E855116E91E6830A68EC04DF98370CDD18E12372320BB865AE818C6B32628489B59AB53B31ABBBC944861A0BD100B66FDC017AA0C79DD177CAE432024181820D23688BC991AE597981B56C3F45B5E4A92F34C7E72882C6B4F1D791C2719CF3DFBFB8F3FA04ADCC1D4FF07 +dk: 24C6ABF468CF8893385B625491F2697ED724ED371DD9C76158418A6FFAC9E0A4158694AF115BB82549A0D02BCCB13282C4C37A2AFC617F347D7BC64DD6CB94C50922B8024ED4FA598B4912EE2ACE81FCCE893739678397C343C7DA4446A55687F236201E071B9C2C7715DCA6AC566702A809931B1D65919CDDB51A87B44B07629C659A104EF61BAA8702355128B9215A40E64F818C1CA297698EA14C00756B6D52974A7014E69B59E477362A63BCCD09BB474020FE51BF5337124C24C8E6F60DD2E495F3370E14A4CB1504234A4C8009B97365F166D385AC511A05EC06465D962D1BA88C191A9E28DAC4F517680D6586923BABA11BB30AC13D40466D52977929D62F48751458087830B02F5BD9B100A92DC6E602F3F24686365476C33CB9F5409856C80FA490DD6211AB9776487A3E15B33A92A347F3A92744C16DE3F8B3E942628C926BCDAB6CD80A068ED951F2689EF7066A9E2627F39C638A580441EB8FDFD9B2EA1B39D043AEEA1A0F48EA84490408818C602A828F869098FD2C429B35621DE9BC8039C6ED940BEBC32FD0C6C396B3248CFAC85C74325531A296A9C237FB2C4452457B4C43F0DAC214575A96A770170ACE6E0109E4A9C0E5F8985F4AC37CC84D206306AD7A2058EA58EA09AB3B7926941996B8125D7BD76472006C003784CF4479691BC422E00CA9976840D886DDC8A5BAFB87DB268EBD8248033703F6C6686CF928FFD736BDF3A26653319F22996C52387BF0A294944FDB1051315577B244C78578923F48B435362711B89585841FDFEC9FF047C76864055757CAC7EAC9D0F2999C341D314154DD58519B602D7855B6ED67049AE402F8913177914051E7C5A8400969F5CE9A485D95D544920AA7F169A198FA710FF73440D8949550A054562F16637D5A813C10BB29422AB193616687F062A1FA1693E3A9064982F9E96FDDB812C0763233687EE08928DC800FD2C8A3143148A0BA97633B5D97062A5B0572A89B2B265C4439357F96C01C6F464E72D0BF0CC1C421B3CD38610A9B0C89EE956AB896189C0B03AC173D31792ABD132F7174BE4D210B76E04B87E85B2E4A25F41332BC379B10D672862462F6AA3875DB6A22158EEE6B13135751DD49084862953CF275BA4580DA07921CF9482FC692643A6E9A5073A567C593AC01A57A75FC3735CD89029C99B3945A2BC7949B64377EECC96FCCFA2AC94CBE4C9AB4FC64673D042F416A80D867C9D5B3C9CB276FDB3C693181B071553B0EB66138656F33D0546322330980553BB2400D1256BECCC969937305553E8BC60C2D24AEACA90061CC7D38E3244253414222BC0D321C73EC6FD8804E71092995D48A6CD1C68CD1841011A45F4961BAB52EC176628B49CB0B840FC8B1120701227B0C92E10A1B34BB2475152BD72A82232345CFDB5B46E3403397B5D1276FE3E96703950FCFD49F1172CAF856A333497BB68C2ADAF026A7198BEE890718F474D7090151D21ECBA4B83E56069E1C6D34C5BCBFE94BF0A385702A9D2FC770D1905120A57FEF816AD941633558AEF7F96780C15112710DEDF8517CDB3314687BD4BA4C2B5A0BE253498894C7CA32401B517D812172A2B13146F30ADCBB6E79641A366BBB96B0688EB285266B5ED5BB000FEB4C73CBCFF6E8A980326E798113223C1FD815922E1247992A2340B70B46A6CFF3638A9E741B478BC7E6C476D2F68CE244BBA73AA919C7A48770C5A9A798DB1901B2D93836F5C507D862811949CEB4BBC65CC2D6FC36E2215078149355B83B83635BEEFAADB6FAA387104213CB6609F8B36D291B3B567ADCD85EF569966E527102AA159F0912E5617E1B0C295D12838EB7790F0C4E4A93562EC21F94C517F5B6CC3F7B3F6E832F93893417A2797F9848D5333CE5741ADB867E64E898362249A2632F7ECA4BD38034BD5184BCAB71F38854A02A2C4693B32CE172C1FB41AF3A2B2AE370889C485F98587293C6758504189050CB437A991B8EA5E25569D1A9ED194D0E470A419B453120288D29763C3BAB00F5180CAB07DA070DB401CD28D69892B77A847A47C51A2D0B39A22074627CBC068D42988A60481BE5934E626201292AD073BFF81CCE044A33E3F3339C7B9446C607E666656A94A0034445635312B20A76CBC4C6763C338AA022D79A826D2841EECA89D433C5E7DC041ED488610A1F5A951FA966148D1B8597101C7CF8AC44F5183D42C689079164E90B5DC582A761571496B7A8C3543FF275D403B923B032CBB87D5EE90EF8853AE78590D0E8B200C3819705AD47E71568051C026B4B5C10760495994208AC61A08C23ABB921828A5D69740AF57507E339EF977649999330C6A9B584642F5539356590C6CB64872517996CAEF853219C5C2CC1BA04F0C8537039C9A3047DBF17CE18673B039B2A9EC083C7E53146863B61199169C9B1838CAB40508A6B709DD8502783654D55766E6B671B6C83201509395BC565B10904DC27BFE30842479528995A5888AA8E04374E2918A9EB642629A135B9306A21CB02C925BC99401EAD40285A7B3CF5A809FFF6502E727B332269E8C445C7D9303BF35C344615E19220E391AB4F2011634C292C22022AC0CD5FB51339B83833EC7404FC38108207B8A5B1416C2DD29785F3D87F0BC75F24C65864C31EDBE243EA0B8AD015A003BC9EAB583FDB5ACB32BA3BBAD6BE5A189472560B22614B5BD257249C4458C7601C8B0E48D0C72DBC5743E77350D64DD6A587B67280D04B20D1DB15275361DCA43CEC893EA5401FB3B459637817A18755876983818CC1C745CF70D2A8CBB36050601BFC34BA9685A02B6652535BA101A5193660A06CE54DB9700A977AB36E612549E51FDFAA5AB0490BA7A302DCB314ED026CA1D765D54145DA1623F9A7064D2926F25A0C9FDC4B8CEB8C765CC9B3A55A4BD79CFB9754ED5786F04395B7A80ABE92687D6900DD14C3AD743E2F9540534C63602858371C3D304263C2185E29261237A848DAE97507DCC5FDF60209112E08D269F56418F2FC875B693D5C9CABB9BC636FBCCE548227F42BB001EA6ED64057656566F51A927B178E17AAA24A0616CA362AD134AAC5D36C5447BF4DD0CB7DB95C9009B7109826B1D8ADEF95CE8B9B444848B41002426812700850CD7572A2530A2BDACB8CCCA5485032454E855116E91E6830A68EC04DF98370CDD18E12372320BB865AE818C6B32628489B59AB53B31ABBBC944861A0BD100B66FDC017AA0C79DD177CAE432024181820D23688BC991AE597981B56C3F45B5E4A92F34C7E72882C6B4F1D791C2719CF3DFBFB8F3FA04ADCC1D4FF07BAF18B5A25081C8A9F526111B600954D39BADAB9044F59903D2A8F21F8E1D78B7FB950A8F51DCEC4BC7A573EDDA56ECC049E5688476BD5FD6CD076A8F99A019A + +z: 51D509CF26799741631099039F713B22551E2B0F0297BB809DF0CC8FC3E47EEE +d: 76CDCA53F781806D55CA8D3BAFB3F4D389D712F1221E85B5E29D6A46580F978C +ek: FE97202108CD725098CDC892FA68301012B3156A2E5BD503F9D388B26B07EE099D5AB0BA6B4A5E7DF369F748BDAFC4C72B171747546B3957BCFE189E312058202885FE853966A7B3DD285E06D37000900228662910260CA1D783DCE2ACBC436BF3669C51A07FB990449AFC153C9C5630F8A2E4E4B7A8E8719A98920B104E72646F83D8C06AB631755239B4303B7AFBBA9DD72577FBB677C054B16813DCF373734A6E4D8B025B66C19936A13278B859165FCC6277E9F149FF979EFEBB9867A9124233A5107B5E29B2CAF81C84A3D05DE3DB316858C5FCB372FCF28705E2BF0B4855E6F97F17DB217AD6A7B7288310086AD129119FF88D20B35F2F287B1358A851185BC12046D5079A2CB3CCAF98BEB9E7C1E82A841F7B48B4F57B3B17467441865288BC7020CDB1B7564989AA3F47BAB9B0919C6819E671235CD7B39F39C71C870FF6A72612CB1BC58A86F565AFA6932C71F059B2F72BA83A8985DC26D91A0CCD49BD32080D30EAC67D96A061E906E2B15E5F43215A9160AD4682A27A2B1B9C3ED1C697CE7AC6A4B2B3963B9A99441FA9D6337739AEF5891D773B4C095C8E97A9BBEA918EFB6058AFBB2A63318972400B11B9523FD335E118CC1FA0BD0B03C8C3278787F9B7D1F752BF5B739FFB0EB0654E753C2F955351243C233E9CB149D49AA1F1459D61B03E452192B64AFD642D00800B4B815D0B9863CE2A4A8AF4C6E7BB3F845A32FD95184812896105946B7A8ED80A5ECAAB0348DC4D2C4C2B7DBA3D1EE6B6A9D35CF03A4585169FBEA45101B97BAD583F9CEB486612761A25AB393960DDF3C1A4E23E23134CE37B7E6833822AF3B278B1B69D27A4ED72221C055C7F006F3DC78BDD3C86759260E31C8D0503954EF31292EB1C8A877A00271109998D9A1A026C16482316994B2573D1673C5B727E75024786C1742414B746C1B2AC74B71920A2C79B0456C08BF1E519CF28AA70627A6A5C8496D9B061E4439B75080A763E50C1A4B32483E87AA5E67C25A8A7CE6FB864012C6A32535DB7123D24F7CA62750A18E96911EA0AD2ECABB7B02252D44DEBB2C55D552349D3798EF7812B991755A278CE158185171B696859968492CAD792DC82767E53333AF9812AA55C443959D14B1C385452367BCFB5A5955163B287254B9C4B0380EB818912BB175605EA55585F82AFEC62C2CB46BE6AC0CB99443E5676AD21EA08A467006E67C5FEF61193F3A54C4C5DE6A4314ABC3F62A83261A4B56AF18172B4A85C00C56CF28EA5C6BFEC6AA703530B7E641E792C35D1F1BBB1914D15708B88B87D161524B44B12167873C19237CAD32BB7C72B0CDB04C516142634101FD81B2B12ADBFE27512C0A091523732B82AA278CA6AD1AF28A03ACCFA28D591040FC950AE475976C5A7E192A9044099A4AC487D5A39E121B9A776CB190A2CA499403C3A5F9F027C49F627E6446D8FB53252E1B098AC8A5DD59EFAA22D2F57C83809003CE2B562231140542AF5D561ED7C74B4E145820CBE387254D78C79A8F6C241F10D94E26454764876631811492221B09B9C2A6C75520D03EA79CC129862A10AC2E0288446AF46165BD1F614C9D1C3606C9C8669C334534266A1946AFC0C580C19283CA1B59C88AD6B8ACAAFD7C3328CE3583325ECDD4B101DC28053788ECDDB4CB7A4B66997F9FD0995 +dk: D5DC5D1A0BA3C20670B1306E201A927764654F757026D15DAA35B77F5B81AFD975BE114CC9E9A31A4C5E83C28D86EBAFB1E65674EA7BFC5646EBB49C67D7B0EFD60FE283BD07D71EDD71B93C815C3CC066513A52C74081DFB0773EFB736D6C0E862CC5F11CB88FBA3AC62515C39B0692359AD457210371C65B6031745622BB68BE60337F5ECB065FA678CEA88165BC7AA4E002D3C892115A3504534F5DE12178FC17E2F513B3535813D30EFCCA68018128C5C3181225CACB1C76BF7A6E98195E0B793B78B0305121087A83A37D1989D0145BB4F11B5E579075B6C5AC845949DA2EA03BBDA446A6C7F5B88C8913454A605179004BD47BAF446BAA4705743A0B6E2833011CB4069664E80C58338C71BBF1C72CC89F77849F6FF354B280044DE60B6D16C31355B4AFA199FDBA078B018AAEF88D046B927ADB64935152273B16127701B0093EED2439CC89C3DA9A277D1AC5CAF65B48262A48521361192168425FB1C341D180CABCD7406154CF7F647F0A62700C630F093649E98936D12A1FFE00A368A2622D4579F521B57BB1510D6CC6D35C48AA96B07079C7C6E4265D768E4EF2C9FA463052E716B48053EE0521227544384C7AD1673389DC34029C02DF55199328376A4C07CE6C8AED221DFDB844F770282E537F15A83A5BE8873AA52FD17C324C6C4B763A7D6A3121AB384814D20B879A42E3149BDC58CE709B3DC6E87B6EC03375CB15584C0DFA6A05F48935DB376096293BFF5A311D4373A95AAC117A25C1FA95EB1C21658A2D313A3343F643969148B11727BA64882B8AB3EC772909EB9690FC72A8F1C6B249191317610F81999B161ACE6351AD330E89A18FA0986514848E80AC95BE41BAE18C1885D44CA30047FDC152EFB069D589296AF20337E12A1093CD54BAB36D252AA2A674A7C065A5676CCF507C1A07A2CC471C612500E124573C865F9C3C6D59AA02F54094141B5A3E8BB9CB7A7400A42AE4867440399306627AE9112DB909A1D6820C26ABA62428BCF27842F30BCB97D241D161CD17E8C3789BB94EE60238B2C987601F694A1BBA38581C261DBE2B94A89556F12620141889A7CAA997036D7693BC5EE961D06A1324EB7520953AB7E3BD00FB2B4E306312A6570277C71BF35DF403442325789846AC203B905F28127B3947780201D5B57B6BE7CAC796076D04B838A222C4F08004F585BF79645FE11EF52749B8C0A5656798F8F8BCDA89C29CF1B10B4429F8B65974164C1653B0B6EC8DCF39961A7B82DBE28604C579F3109F94577B42A4574AA36F2778CD424C6238996F4954605C7B25B50C455AC334D73343D90AC6A222324DF6BC4766B3D2C2A04C92A54F084DED24A9A4D5012AE741F12318D283B1CD668375129274149F33175C2E19453F3B4E60A1089E0647D37B0721254C86720DA0A97697B45C4CD5360AC513D4261BDF738A08F1BEA818C722367C30788EA2361384A02528E1423F4143C525B8C9A89A1A574A0D45AB9A8C4E02B01B894634C29A3FF9B1C1BADA025E8A99F38A092CE903CC03411FD25CE61110A4B423A01699BD922353FB65D8E796F4B77F226895EB822552F7AE0CB7C22788429F8132F158C824319030E770D6B9ABBBB912F3E592987826FE97202108CD725098CDC892FA68301012B3156A2E5BD503F9D388B26B07EE099D5AB0BA6B4A5E7DF369F748BDAFC4C72B171747546B3957BCFE189E312058202885FE853966A7B3DD285E06D37000900228662910260CA1D783DCE2ACBC436BF3669C51A07FB990449AFC153C9C5630F8A2E4E4B7A8E8719A98920B104E72646F83D8C06AB631755239B4303B7AFBBA9DD72577FBB677C054B16813DCF373734A6E4D8B025B66C19936A13278B859165FCC6277E9F149FF979EFEBB9867A9124233A5107B5E29B2CAF81C84A3D05DE3DB316858C5FCB372FCF28705E2BF0B4855E6F97F17DB217AD6A7B7288310086AD129119FF88D20B35F2F287B1358A851185BC12046D5079A2CB3CCAF98BEB9E7C1E82A841F7B48B4F57B3B17467441865288BC7020CDB1B7564989AA3F47BAB9B0919C6819E671235CD7B39F39C71C870FF6A72612CB1BC58A86F565AFA6932C71F059B2F72BA83A8985DC26D91A0CCD49BD32080D30EAC67D96A061E906E2B15E5F43215A9160AD4682A27A2B1B9C3ED1C697CE7AC6A4B2B3963B9A99441FA9D6337739AEF5891D773B4C095C8E97A9BBEA918EFB6058AFBB2A63318972400B11B9523FD335E118CC1FA0BD0B03C8C3278787F9B7D1F752BF5B739FFB0EB0654E753C2F955351243C233E9CB149D49AA1F1459D61B03E452192B64AFD642D00800B4B815D0B9863CE2A4A8AF4C6E7BB3F845A32FD95184812896105946B7A8ED80A5ECAAB0348DC4D2C4C2B7DBA3D1EE6B6A9D35CF03A4585169FBEA45101B97BAD583F9CEB486612761A25AB393960DDF3C1A4E23E23134CE37B7E6833822AF3B278B1B69D27A4ED72221C055C7F006F3DC78BDD3C86759260E31C8D0503954EF31292EB1C8A877A00271109998D9A1A026C16482316994B2573D1673C5B727E75024786C1742414B746C1B2AC74B71920A2C79B0456C08BF1E519CF28AA70627A6A5C8496D9B061E4439B75080A763E50C1A4B32483E87AA5E67C25A8A7CE6FB864012C6A32535DB7123D24F7CA62750A18E96911EA0AD2ECABB7B02252D44DEBB2C55D552349D3798EF7812B991755A278CE158185171B696859968492CAD792DC82767E53333AF9812AA55C443959D14B1C385452367BCFB5A5955163B287254B9C4B0380EB818912BB175605EA55585F82AFEC62C2CB46BE6AC0CB99443E5676AD21EA08A467006E67C5FEF61193F3A54C4C5DE6A4314ABC3F62A83261A4B56AF18172B4A85C00C56CF28EA5C6BFEC6AA703530B7E641E792C35D1F1BBB1914D15708B88B87D161524B44B12167873C19237CAD32BB7C72B0CDB04C516142634101FD81B2B12ADBFE27512C0A091523732B82AA278CA6AD1AF28A03ACCFA28D591040FC950AE475976C5A7E192A9044099A4AC487D5A39E121B9A776CB190A2CA499403C3A5F9F027C49F627E6446D8FB53252E1B098AC8A5DD59EFAA22D2F57C83809003CE2B562231140542AF5D561ED7C74B4E145820CBE387254D78C79A8F6C241F10D94E26454764876631811492221B09B9C2A6C75520D03EA79CC129862A10AC2E0288446AF46165BD1F614C9D1C3606C9C8669C334534266A1946AFC0C580C19283CA1B59C88AD6B8ACAAFD7C3328CE3583325ECDD4B101DC28053788ECDDB4CB7A4B66997F9FD0995CEFB593C11ED360F404732EA8B6542FA9796F2AEBB4C61EEA40B6D8A599C7F1351D509CF26799741631099039F713B22551E2B0F0297BB809DF0CC8FC3E47EEE + +z: 9C330AB4257D7B87C4742C6E95B66BDF805C6A145BF444836092C6B1D2C5FFFF +d: 78AB6C49354A018BD38A39926F822A1AC4ACC4FF32DFD7C047CE0887A3AC182C +ek: 85787649612C798187CD986E9578582F607DAED85C09B863A5476626016F88212EF2B70D81145C671162741C70C9DACF566A1B68025A7B66BAC9EB5ED8879D4CD40237D9C791B0A7E6C1C08A7354424B71D6739192B3BE48755CA513170BF3A6197400FBF94E9A707FE6D007E4062BA2D1BFF9192E294A981AB19839120401653208618C6DB25E40A28B8DD1A9E6D91A1408191C8C6638B04D2A50983C6B0640B934E5039729885DAECB0BCED2784B998CC296980626979DCC99A5726C4C07A6CAE1578089BAD68190AFA91491375C1C00624363C4A049A086794A046806117B36FC8BA8D38AA8097C727E3C59A6378703749C97D35CED818DB691783691C138C325541A1ADEE01CAC4800ACB2B008A0A5976C90B6BB8AC55B06B693390C30905866AF2014AB5D340A4EECCB4F91C0A2C700A68C67833C6FE10927D6CA935D8071F98BA31A1AB4B73128CB92BC1B8056372434A7B9524D95AD50508998A4AB179B0EB79C71392515E29BBD09682183394838A52734409EBEF5852DF7B9073098ACE127A7C95FFE48C30599540161C5D12CBF7BE203CD5AA4D861BF6768CBDB5C0401F70E4AC7B0ADC0305FB702C023AF65981A61E11A0B12C169E3AD569C90C417865F708C2A7B4B1C1866381C7EA6D17F4ED35730A84E5AFA975C728DE8B593D92251AEAA5841D8CE9A3037C1F47F8529CDE366BFC08C2A7337B8DEDA345008C43A5A901DF5C6B201B553F07FA799317A216205634130A2ADE04808032B0DC1E715C1B263C8FC07B251B14B9B1EF422C1BB171CA7D281C706A0251911ED345340DA4035D8947B058FE1D38F6EE02548B8056A24501E3B65B2568802417E98567322959EF118AB0C471B37496424FA327751C1DB40AD909424B66C811118A958782F3E57351C24934650B5A110B68C581C26CB7E634A283361B94D544E0EC713FCF52640CB180F25BD40D4114249828D5255B7EB9A1CF6589ED4BDE602317B4909950606F9C91E59E1B68599517A089466D939B43BA14B0A91987662FA63C27E1411DA78255111B961B45366515022421FBA4A04F48244449BCFEAF630CC4397A98226BC0B2A30778743EC2D2A9747A2127889794637F780A0ABC6122C79FE0830691A7EC277239190938F1648FD733C1761A42A84283E40BC7EFB707748CC0FAB76F5141122158B30655765257135EB2F08CB1E84067C64A503F58C8C54D765DADCC4C7181FFE1026E423B44AD717DCE8A6D765BE2A94C115434D16661F82410E7E19B8E3388972484638B6A52A058F2459414D3C57987215FD753434349BA001007940018EB49A52C78FFAF468D939C4AE585F2C1759E0A582BFDA316E53A363A1006BC26474F49C82B93EF4D7CA94A473D3788F5865B5D4323C3471888B06634AE325826144B5D9894CB59E8C6C6E3406459BCA1791FAA9743853175C48AD982F9775936FF68093AACBBCD87F6F30BDC1F19C93B2AECE6A3A4CD99ED3244323A7AF72C8598416543F50643B713AD2722BAFD092084BCF77385B6ECB2AC8F19BF9D97B353229496A0C6A5C73CCB06C2F2C5924E284EE3185D2160ED31B72D1F29B322C1DD11B5DABC5848933B4FB7B9AAFF1394AE76F624A231DB3C2DE108F5BDB1878551FF178901D67188E6B6F3A49C904A5539738F4305053044EEA5F9C +dk: C4AC07C1B9ABFCA3BF31365671954516CB2E01E39337681D54262DB7B06E8CE8B4A98028F7176518098879083F64703207213945684CC4AB9CEC679834A35A8775509FE8CBBB279429D71A48FAA18485446A1A4FFD2996E24B76715A133C1486B2346055F22FB8666F487C44328688E5A6A6376682184B9057C9B65DF21101C3645C58393793B939C9B11C27360AE96E15A43BA3CA3A00358DFBD08A395C0A02C70FA45168BB6667A843A691A9C88FE11B79EB85F2034097166989024414770F0E2537A0F266F659591A06318947A715DB88A84BAD0434750E582A12C7C6981207239935C8529DBE0147E0E1CFB4D1BF8A6C1A699B736991CF2C88B22D466C5E481120A51F21A84877E710228766CEEC0168C2314DB6C85CAB02007875CFE3B5B613B1D50366EC450F1739712D8889D6653CDF41009CD42D3D6064DB930BEB551702813213C02110E435624920C242AEC784351228A847B1BF2C66AA1068364AA2BC674B2ABF2944018273DAEC324ABC94AB2AA5F21B318C84A77FC7A6D60570FB193A795993F2231497D8414B0082DB0A70AE81C8E5A61B461768B5653F51F31EC5E96F9041A49CA27A50598F23C575E0751E10C921A71676C2388C97FA83D481B9C466A265920DD9095005A1CDABA5B76E36AAEAB4BB58892F8A4C9590D2C96615A66F43A06FEC673C57B7376709CB759C61E37DE08C04D194A827173F5BC767FB788CE4A972EF148DADCB00B993A35C5369B3741D4C227E21112FAF923AB8C6478B856849A8B508BB4863D1C4239C0A469079CC677260FC8250C75887728B86A95F46B86E7C01214C1205C727707D9361E619CF792121F746815F9717DB937FAB2C094C90AA118C9D72801135AB87C99BBCB877915F8BA4E2E70B87303672D53EAA80A11A071C5AE307850C2864713287F976F7A465D8E4AC626B2390683ABE583E7AD4012F40778E4676BA30A163C70D5CFB5D755C0F806CCF0CCA7216BC16C2B7CA3F16239C147D81C4BBEAE635B2398E661B68EA863FEE4B94E6F2A44FB0A0BD8A75DEB9CCAF4AA14F14628EEBB7C88B63731587645B721ECA388EFB5495638863A13F4F6440C2E71636C9C1767B192932694C82740CB457D99B30C8396976A32AA5C027D3E36D0C3B09D24128B748CDB5F57BBF703E4173CA5C115B7000625FF06E280574EBB97E759302775093DB2878DB545C345B6525118D1C4458ADC9BD5F212B4D3BC77D66B9882A336231719736B448833B20F5448E759813FB856F95C60E29BA726B1D159B2BB342B737DC3FA7332B4492C583F83D9714029AE52A366C4734D29DB1E88397D22EAAD11D4A9B1FBEB7435F0B7016A400D4547A3C4B8F54B0A5E1F37082B4B751691E7CEB7C07D383705B8F42139326F0A985646B99DAA088C1BEBAB90AEC2B6B30E96229175C07AB4AB78A344A13C9A2F02B782860007A2D5611C7287410BDF0454F76B4F660B488FB94655B19B28B929B45664E6C8374F096B3B9A9A6262E2C2355A1DA73DBFA8160C5A16C08C68C647FDB408C223AB5D7D05820C3A1CF2994345305FBFC7D74CC20EE02C7C97C2FA5445AD4C9093CFAB7DE1C467768A01863347D1990A5882E355937694C0A01F7A9072A8B85787649612C798187CD986E9578582F607DAED85C09B863A5476626016F88212EF2B70D81145C671162741C70C9DACF566A1B68025A7B66BAC9EB5ED8879D4CD40237D9C791B0A7E6C1C08A7354424B71D6739192B3BE48755CA513170BF3A6197400FBF94E9A707FE6D007E4062BA2D1BFF9192E294A981AB19839120401653208618C6DB25E40A28B8DD1A9E6D91A1408191C8C6638B04D2A50983C6B0640B934E5039729885DAECB0BCED2784B998CC296980626979DCC99A5726C4C07A6CAE1578089BAD68190AFA91491375C1C00624363C4A049A086794A046806117B36FC8BA8D38AA8097C727E3C59A6378703749C97D35CED818DB691783691C138C325541A1ADEE01CAC4800ACB2B008A0A5976C90B6BB8AC55B06B693390C30905866AF2014AB5D340A4EECCB4F91C0A2C700A68C67833C6FE10927D6CA935D8071F98BA31A1AB4B73128CB92BC1B8056372434A7B9524D95AD50508998A4AB179B0EB79C71392515E29BBD09682183394838A52734409EBEF5852DF7B9073098ACE127A7C95FFE48C30599540161C5D12CBF7BE203CD5AA4D861BF6768CBDB5C0401F70E4AC7B0ADC0305FB702C023AF65981A61E11A0B12C169E3AD569C90C417865F708C2A7B4B1C1866381C7EA6D17F4ED35730A84E5AFA975C728DE8B593D92251AEAA5841D8CE9A3037C1F47F8529CDE366BFC08C2A7337B8DEDA345008C43A5A901DF5C6B201B553F07FA799317A216205634130A2ADE04808032B0DC1E715C1B263C8FC07B251B14B9B1EF422C1BB171CA7D281C706A0251911ED345340DA4035D8947B058FE1D38F6EE02548B8056A24501E3B65B2568802417E98567322959EF118AB0C471B37496424FA327751C1DB40AD909424B66C811118A958782F3E57351C24934650B5A110B68C581C26CB7E634A283361B94D544E0EC713FCF52640CB180F25BD40D4114249828D5255B7EB9A1CF6589ED4BDE602317B4909950606F9C91E59E1B68599517A089466D939B43BA14B0A91987662FA63C27E1411DA78255111B961B45366515022421FBA4A04F48244449BCFEAF630CC4397A98226BC0B2A30778743EC2D2A9747A2127889794637F780A0ABC6122C79FE0830691A7EC277239190938F1648FD733C1761A42A84283E40BC7EFB707748CC0FAB76F5141122158B30655765257135EB2F08CB1E84067C64A503F58C8C54D765DADCC4C7181FFE1026E423B44AD717DCE8A6D765BE2A94C115434D16661F82410E7E19B8E3388972484638B6A52A058F2459414D3C57987215FD753434349BA001007940018EB49A52C78FFAF468D939C4AE585F2C1759E0A582BFDA316E53A363A1006BC26474F49C82B93EF4D7CA94A473D3788F5865B5D4323C3471888B06634AE325826144B5D9894CB59E8C6C6E3406459BCA1791FAA9743853175C48AD982F9775936FF68093AACBBCD87F6F30BDC1F19C93B2AECE6A3A4CD99ED3244323A7AF72C8598416543F50643B713AD2722BAFD092084BCF77385B6ECB2AC8F19BF9D97B353229496A0C6A5C73CCB06C2F2C5924E284EE3185D2160ED31B72D1F29B322C1DD11B5DABC5848933B4FB7B9AAFF1394AE76F624A231DB3C2DE108F5BDB1878551FF178901D67188E6B6F3A49C904A5539738F4305053044EEA5F9CA8604CD90AAF5FB9BDA220814069AA00CB5B5FFB7B60E4BCC86F16ED0B49BA9B9C330AB4257D7B87C4742C6E95B66BDF805C6A145BF444836092C6B1D2C5FFFF + +z: 18EA1C7532F706B06870D0A1047AAE33D9E1FF9E9BCBBD302D8817EB7B022A77 +d: 13B75620E4CB9AB9A6689F6E2BE44639BAE6C9CB7DD641AC1C9377242D99679A +ek: AAF98BBEF422DAD045B9D3C2F134C71ACA3884604D3B87130EF84890D8870A4783DA18BD4C8B0667FB194393941C7508FE20AE5C077FD06A247DD7C19FD20940568B45938BEB39B1AE18CEA618BB8001C84DEC8CC170C12C77B6704AAE9B745083B3B00A020510A196EE2AA12195CCF650CB50600F35D61910397E645B886BFC58FB7C99C58AAD79552E13D31F05BA5904007E3B504D717156D652CB1D2353270CAFA6986846100B81C7816857AD7EB98D5CDA24E6DB3342F346AE5B162C11BB9E8C2AAF95C857277597398DA82A6DB7D7C34D7ABB1BB3155E72B0C6C811031A06D609C23306473317948E1B1AD9F7B59E22962BE33D750561146B135FF64058BC5524F26DBDE518C872A98D14862FF4599CB16C11D654F6762D531718C9B2BB51C34DDE019364F246891A3891F823AE85B6E54A4ED6A18673D4AFBC2C8C8F47C07C2B51DCFA56E5A57211914F437C2181A92723D5C09844951A0CC0470A594AB0C0E8A378A3015E39C5275E9B9D4E202ED6A4AC9AD1742C8455642932BA68C599E8883A3CB5FA11876023BD153166C7C33B3105C1BA9881F92C99CD8B41A475777F239AF2886570F94AA3626381A6B8B3C3AABDC39C2A6C0CAFF7CB95CB3162652BB0493726A81339377798D78AAE999BD9542565D5491556B716B09D0482C603B99501F8823AC6C5018543527928D2981C2957B9B7ECC33BF423F3B89DF352377DC554590A4BD6E7AEF624B873916CB638AB426A50F7789B25B420E4380413B10416C048A8069FCC62BC727AA9425700AFE835E12682215606F84C70DBAA4BD9B93D1E156913C62959C98A741A74810B996063624061B43D225B1AA71A02C50BF38016B4439FF156ACB652B278E0AAD91C455F03B29998317F596A1CB0051CFC21B1E76B59B52409164233D0C7B01A2B7C93120FC42BFB533347C2B4DA782BB55034C0A152CF51C44F39204A63C1F7867E57F27332791D8E3A1A13DB9A61BB0FE5660C6A8A2EB1365D30A83C3C1B9F03E66E58B0144CB6B292847F68CC3B0600C32FC45569158EBED0BAA50B26303707C1796BF9569193825603FB9237FC2AFBEA9D8D3B283D775583990E2672859155C70DDB7C0FEB84BC07B851F7B4BD44B84DACAC0FC913314113654567BE4370AE3179BB3BA56388A7EAFC3A1A10C25891B5A943C62A4297AD469D8040829029A8960CB9F65C21E10B64B07A713C40313E6A6EE0E939C741AA7BA93526022A8440858039A357EA2CEDB342C9299733381814E1C78FFBB1E289AA93C6ACD93C6DB2704F79922D277C9800EB3983865F65842D5BC8B346207C6C33612250110AB236DE202374132D60F5202C77367912C4FDFAC54DEC5FBC29076BA13FA013CE0FF70543B8989190AB63FA721F677FA5D0B248F2646E008830A06DDD613CB6063A8B9C37B4C263C4904E3B681EFA3568F0E429B947936EF41B2EF704751317EBE86A9597B8C0E6C81AA278FDC93F0379AFA3D1244D917401AB151A7805CE881216F208EB976FC442BB9DE86943143107B4AB479681F109AEDB28309067B9DCD6030DB4B558890FA1C5AD7FDBAA9BE39E6D6CAAED3C5286C73DEA3B6DBB940E6F647D43ABB364D92BCF099937706F8CD48F58BF77E3972CD846B20E9A1331AC0CC350080B65731270F9B2A951D93C68C98C +dk: 5C9B6453A08BA6B40F1F7C6C7CA464C76237EEDB9D74F0925D200A599684E85862AF8C29EF28871E7A55CC5824D381A9B7ACA2096B78081862D504010E1A9366000C022B3EE8AB91E6F7334287251F829C00221217823D641153B865A30F24B847154ADD5C9B4FF2350EA51D6C49A975AC2F65B541A52827DA25C93E9B36023C6129BA29E495B4914334E4D02CE21B66F1437874F1A56F03A6726C142F0B03D46543BED89D4597902C0C5B025895A04A9E22563560DB29793A353FD4528D0C6B0D0AC657358B04E7204C21A7378AAF3F0B93730C68D238695EA4CF3C9B35AE19B052B8CB2E041700902B4600BC30A846951BC0B9E42D9453B10ECC37165B08F22675657A6FC2023F0C1B42BBA175D329935B62468522BAC0944B83C5926A1C563D9323F175BB6EA9C2B1CC360FE8B60FAB81F5A1C9F31443D698B34336C0A1EB86E8E162FA21330E909CC0B69FD62738D823B6AC0462DE561DFF33094C1029ABC49381C406A316A3E2A887FFA9C3CDA9CA48E8AD802CB0231142C5F2CD83154DF65540CAFA16D39190FE100812816ACDD0720B4A44D337611651B1E505B7CAC0BF832841C573144BE42EF280B25C7B1700F344F82AB0C575B2D10C3A86449614B592CE42195F9C385E4CA257478E8D5320BAC24A68883DFC399AC236C497C27B5A80842AA018C0C0B459C2B14737197870C0E6D661510951D290B5549331E6C557DAB48F349B829AFBBEAB932E1E8638ECE2279C697220152FB84AA9DB5A8307F93438A51C22E8A1DDC54AB722A692EBCE6E719A82066E60B345C75729B4E7AD173BA7F363908411B6E724262BE0CB05F51E7739A5FE0C304690645C763CF7128DA2F71B2F7238A43003000995737A4DCFD8682BA8923C6752E53150DBD36468D6A2459A5A54450FA6D14A4295B573423E4BE95529C24D7D035C5F65C49D3684943AA505869CD525665545676A52958180538A521AF9274033BAB2C7AC83566041D9D40D92FB2DD2C147E456456DF0105264B0FB17853BF991789B6818F9BB75A381D4978D2EF7098626903C857CAB673353783C12C860258A363CAAA771ECC724B2332C1A254A3CB1547CCFFD149C187B345FA282DBB92D9793374CC67D0C0B5F946B78D81B08E521275AB7357050694C824033B9568BD335A8B837627B1494D9701181C7AA02A95DD3915E55A371F31C14F90C63075555BAAB65AA100AB99A6C1C85A1051D7E58A8E65BB312E02EB5485C05F302DDF814EED49D39E4A9BC688C989A17DF074C7FAC62FB73B0EEA85FD8177AFF41C4C3E40B407028C4F58E60DA14925385E4A0A6BA8B13C8618A8A08BF6A1630AF1B5200BA41596C9E440A5BA11C21F7C62A46379627CC4DB2E43A565A829FB605F186C405C519502C0115D9BDCB8857E03343707843A28047BDD6B445445560A686801C4D3F4C4C773537AFE7C5E2191853F56A8E75A9EA852552440B4E0642C3133FBB4CC678C2A35D093975F17BEC7972C938A7F0159A8BD8910E847DB09A1A2DE43576F9818A338787C10709F085987424C59546BA5493FE9696256C1B147105092A77A8A329563B061AF8CFEED35EA1E625F03716FA75B7839C325B94CB39C6CF1323CF4CA486F8703BAAF98BBEF422DAD045B9D3C2F134C71ACA3884604D3B87130EF84890D8870A4783DA18BD4C8B0667FB194393941C7508FE20AE5C077FD06A247DD7C19FD20940568B45938BEB39B1AE18CEA618BB8001C84DEC8CC170C12C77B6704AAE9B745083B3B00A020510A196EE2AA12195CCF650CB50600F35D61910397E645B886BFC58FB7C99C58AAD79552E13D31F05BA5904007E3B504D717156D652CB1D2353270CAFA6986846100B81C7816857AD7EB98D5CDA24E6DB3342F346AE5B162C11BB9E8C2AAF95C857277597398DA82A6DB7D7C34D7ABB1BB3155E72B0C6C811031A06D609C23306473317948E1B1AD9F7B59E22962BE33D750561146B135FF64058BC5524F26DBDE518C872A98D14862FF4599CB16C11D654F6762D531718C9B2BB51C34DDE019364F246891A3891F823AE85B6E54A4ED6A18673D4AFBC2C8C8F47C07C2B51DCFA56E5A57211914F437C2181A92723D5C09844951A0CC0470A594AB0C0E8A378A3015E39C5275E9B9D4E202ED6A4AC9AD1742C8455642932BA68C599E8883A3CB5FA11876023BD153166C7C33B3105C1BA9881F92C99CD8B41A475777F239AF2886570F94AA3626381A6B8B3C3AABDC39C2A6C0CAFF7CB95CB3162652BB0493726A81339377798D78AAE999BD9542565D5491556B716B09D0482C603B99501F8823AC6C5018543527928D2981C2957B9B7ECC33BF423F3B89DF352377DC554590A4BD6E7AEF624B873916CB638AB426A50F7789B25B420E4380413B10416C048A8069FCC62BC727AA9425700AFE835E12682215606F84C70DBAA4BD9B93D1E156913C62959C98A741A74810B996063624061B43D225B1AA71A02C50BF38016B4439FF156ACB652B278E0AAD91C455F03B29998317F596A1CB0051CFC21B1E76B59B52409164233D0C7B01A2B7C93120FC42BFB533347C2B4DA782BB55034C0A152CF51C44F39204A63C1F7867E57F27332791D8E3A1A13DB9A61BB0FE5660C6A8A2EB1365D30A83C3C1B9F03E66E58B0144CB6B292847F68CC3B0600C32FC45569158EBED0BAA50B26303707C1796BF9569193825603FB9237FC2AFBEA9D8D3B283D775583990E2672859155C70DDB7C0FEB84BC07B851F7B4BD44B84DACAC0FC913314113654567BE4370AE3179BB3BA56388A7EAFC3A1A10C25891B5A943C62A4297AD469D8040829029A8960CB9F65C21E10B64B07A713C40313E6A6EE0E939C741AA7BA93526022A8440858039A357EA2CEDB342C9299733381814E1C78FFBB1E289AA93C6ACD93C6DB2704F79922D277C9800EB3983865F65842D5BC8B346207C6C33612250110AB236DE202374132D60F5202C77367912C4FDFAC54DEC5FBC29076BA13FA013CE0FF70543B8989190AB63FA721F677FA5D0B248F2646E008830A06DDD613CB6063A8B9C37B4C263C4904E3B681EFA3568F0E429B947936EF41B2EF704751317EBE86A9597B8C0E6C81AA278FDC93F0379AFA3D1244D917401AB151A7805CE881216F208EB976FC442BB9DE86943143107B4AB479681F109AEDB28309067B9DCD6030DB4B558890FA1C5AD7FDBAA9BE39E6D6CAAED3C5286C73DEA3B6DBB940E6F647D43ABB364D92BCF099937706F8CD48F58BF77E3972CD846B20E9A1331AC0CC350080B65731270F9B2A951D93C68C98C1783913132F097618BB39BD4748B4EFE63DA07C26697F9B2F4E06CB2D27012AE18EA1C7532F706B06870D0A1047AAE33D9E1FF9E9BCBBD302D8817EB7B022A77 + +z: C71F7E44295978FC63BF8F6A68F8609E98D155FD7A74E1FB7982733FBF8A6C25 +d: 7C345819C7C327AD9571E5DF882449DB243870D686A9764D4129B21E17AC86A9 +ek: D6525398362B71938C1C721695157F1A2BC24680BF6E265DE8726594C26CBAB9B040462B4DA30402D70EC050958FF5944D181374CC9A29E867C1B33CC36CBA66C66A75F44CD68112B543AEE0026D9C105EE556AD5FC2989346C7473C93E2641AA42904C7751D83CACACDA6B2175B1B9C1C41435C49027AA21119428C61482F655D4A0CCCFA5315100C314B680F702CAD99FAABEAF08335257F9380066A09BA0D4B04F91A52FBC09F3C348F0A49B840BCBFF51B63D380C53FD17DCA7B76E782580D926865A79AA4992FDCA771F4232AD68956FD1A32547588967B402B2C8E3F2264DC7BC8B5B770EAF4B413C1AC44A8A4A4061CC7FBB7ED809FD97C84B6190BCAD156E36018C44CC0C5A84E9A872EFCE63C370BB257C46AC285058FA09981D1CEF51A07C44994E68C9C3CD6394EEBC545F438858A6D18583E51DC6F15D7B0A3F02F26932928BA1F281012D93050A8D6685F5364FF952BE1C644965A3D255A57C95308E100C4AB8343E2311927212E6F7975A9FC7F72B4761B78069DC5553D740A5433108099BEBC850D5477CE3708474481026931082946A949E3B00DF640AA52BA6D04AB3C1115C91147BCC519DDE6BB953582DE996D38F35A51C7AF0AB999FD78A9B34BBB209869D3776C038B0211849A26674D5D5698904A9DCE362D6BD858B3848B9534B84DF672047930CF63B51D91C79321127FAC7778068E7AD26EF3E61E98B757F33127895A07BA6CCC0FF72A5D5288FEE49AD4D249B7E1B9E695B91EB147D0B1AB2CA4299F9A655BF25AD3B9ABC9B36EE98740FAE598F17113D3C8912BE694A30207E86A5633A32D2335ABE7D7267AEC476771B0A7FC8B0DE2BFE524423D0304AB19632166C790DB214D478726BC7A281685B2CC77E0BB9F8BA64245A80A5DB5570209B1FB0115EEC3CF67383F35E7C05ADC02E8A2BBD1994BBB8818646BB9B87349FDACAE5EC681D40A03A506754700665F4B372C2009711AB55D0C0D62506FD4701EC69C45EA8ABF7A20BBB2669AC460B6728B6845476F49DBCB927723DFFB7A224CA159DB7D1E63322F22BA31B6BD04DACA1E30AB53AA686B8704B483152516C94078916C32064FC638467329CA008784847275A61B44E758A6828D5377747B8848D2557DA23090865A58BB1C7E7448AB61796697DB1B5A70C881CB80A9438F13C8753D662ECD495E74B21CDFA177544A3D5F8912634143938935B4F26874231C2D58BBC0F38DAE4135955793596C4DD44798ED9A57FC178A3AE245DE19BE18C1604A06D041C5560E69093854999EB93D1F82447103B54D46383FD084907060FD756DE74B6FFB3675E0ACA92AC5A89DA53CEF6042FE0CABB55C68DDBA367CB999D7B0B935E752AF97196D465E57081E0378465CC6BA56234CCA1283E22334E65A7F56787BE509C1AAAB0942B39D58167DF5421E35B6C966965FEC61BBD8AAADA8B59DD0664DFCA12F88B92A1CA158E7D5B5B5401DA7D038CE9A70FB5C890E52A19CD32DE63219DD94981CA9B269F0C4BE40CAD533C6DB8687E4497526392B848C4BB706AAD7A68AFFB4AC3D21385A2CB4DDF369D41B6C978719C8D121D43551ADBC54F74CB3528655ADC64F62C59461C3531B6272A4AC9CA013A0203C6D8ECA72D67189DC07FCE68847F0053CA9F0F6AFC7D795AE4ECD3D8E6A02 +dk: E4028F81A3115D24B0661A525B546BBC901FF645B4A8D9127E500279A0B67C028DB6E660343012EEC35B8FC5B25B61374B19053D910BFC716E08517187B191582971C7A2C1564BA8B2E6C72F417681224DD3F663719032D0649C4F69229CCC9FB9E6B775D3376708704B5A715B67766CD045DCBBBF861B3170E44EDCAAB276C6190A5B188401353F61C4BBEB413811015BF273C760682F414CB74ACAE3624B9C75036BB32E6113BC59A2A9B0770E928C445B53030A8B262D34950C930BE7ABAF65376C0C90416333B2413C4F849A341BF0124CAA691CC2C2A8C328077302FBA57314E0747569BBE664339219867E42A0E1E92332A2103925CCB85C3ADD190CA3317E0DAB7CFAD92473CC5AD7C31A412417C858AA846721B268642F9641C05A338FA77ED5572A2AFAC80AB0746F07740BD8925E856225D61F73C1BE78381FFB751D6CC456FB488D143208C6E849C0DC10FE295148293251B4300FD72ADBA15BFE82406CAB7E0E4C4F7545869737B46B669EA45470BF9894BEB9CE8C57C4E18042D071C0D58C27AAB46C05446EBF69CA18E45E63039E12A12ABFB3C291692016182349DC805725334DE86E8971449EF7AF09D52089872314757110ABA0BF576C98C1A9D8355DD45A3D842455017A4156101931198920354B0BB66ABD7BC4A2741FB5B06424C14D07104460F3B1A7C54DE8BB6C7AC6091D5B7FDB91BE0A4616AA412C807799D23379756658B9F39345BC5DCF9168AC5B22B2E94BF43071D241129C06714FFAA4B74564B402521942769A391D9CB3C15F7572EE2407ABAB96ED161388C6B76346504650CBB58025155B1527850342E9354804A16626ADD0305532A6387F45781BC080011A1680716C7C1B3CF72717ACC91ECD189A5B03C7ED561DA771B68CF275684C2CCAFA8711F34104E4CFD8F6BD050B5E196564D6D710965740C9A533D1136F7009B9B69CB6BCC388CF7644681B4C2A475410934840A6AA0E316357FC8CFC612E0A57C7ECE8321264A8BE56C468E8C431A0CAE612056D520AC26847DAA4BC71BCA9B3E739D454A4C7B3808CB633A603C22644361611A9D363A407E99D55C459BA856F8295B742357B0BC7C53436A58B434A0280473775B3B3837503828B76D8BA5E182E3AC8154BC99A727A70BEF0B22E631BC56B631276898550443381C1DA223E2CB3A0C38236F35200E1F9C67EA42CA9E620D148209FFBBC07B333BB2B8013233F4C908706F87410C6829C44332C084DB2E0489894593D9627E9F370DECBA867788F9FC99B81127F6EF446412A36E3B2286FD013354C58A04B32E490B7AC53653BD2A15A096682D01689194A0232BFE522B7A85275A5834DBD105D9AC03C3B9416F344302B72C232890390D303DE975B0CE6AF800B0F587A17CA759BE4315EF9D4A3C27033FDD290646C4EBEF4964DB66BCDAB216A80737B2B674F5170B1620E868741792AC8290C1AA21B1460C61B367367A5A084800652E8C9528431AC16F73138A69678B218434463AB5587FDE45ED194B830F02996D81A2C92BC6F524448CAC8B4A5795C7A423625170DEC2120D437BFA96F0E8078771C9AF42943E8A51CC89C9759D3A92896C5494CC584559742FB564C068811ACB6D6525398362B71938C1C721695157F1A2BC24680BF6E265DE8726594C26CBAB9B040462B4DA30402D70EC050958FF5944D181374CC9A29E867C1B33CC36CBA66C66A75F44CD68112B543AEE0026D9C105EE556AD5FC2989346C7473C93E2641AA42904C7751D83CACACDA6B2175B1B9C1C41435C49027AA21119428C61482F655D4A0CCCFA5315100C314B680F702CAD99FAABEAF08335257F9380066A09BA0D4B04F91A52FBC09F3C348F0A49B840BCBFF51B63D380C53FD17DCA7B76E782580D926865A79AA4992FDCA771F4232AD68956FD1A32547588967B402B2C8E3F2264DC7BC8B5B770EAF4B413C1AC44A8A4A4061CC7FBB7ED809FD97C84B6190BCAD156E36018C44CC0C5A84E9A872EFCE63C370BB257C46AC285058FA09981D1CEF51A07C44994E68C9C3CD6394EEBC545F438858A6D18583E51DC6F15D7B0A3F02F26932928BA1F281012D93050A8D6685F5364FF952BE1C644965A3D255A57C95308E100C4AB8343E2311927212E6F7975A9FC7F72B4761B78069DC5553D740A5433108099BEBC850D5477CE3708474481026931082946A949E3B00DF640AA52BA6D04AB3C1115C91147BCC519DDE6BB953582DE996D38F35A51C7AF0AB999FD78A9B34BBB209869D3776C038B0211849A26674D5D5698904A9DCE362D6BD858B3848B9534B84DF672047930CF63B51D91C79321127FAC7778068E7AD26EF3E61E98B757F33127895A07BA6CCC0FF72A5D5288FEE49AD4D249B7E1B9E695B91EB147D0B1AB2CA4299F9A655BF25AD3B9ABC9B36EE98740FAE598F17113D3C8912BE694A30207E86A5633A32D2335ABE7D7267AEC476771B0A7FC8B0DE2BFE524423D0304AB19632166C790DB214D478726BC7A281685B2CC77E0BB9F8BA64245A80A5DB5570209B1FB0115EEC3CF67383F35E7C05ADC02E8A2BBD1994BBB8818646BB9B87349FDACAE5EC681D40A03A506754700665F4B372C2009711AB55D0C0D62506FD4701EC69C45EA8ABF7A20BBB2669AC460B6728B6845476F49DBCB927723DFFB7A224CA159DB7D1E63322F22BA31B6BD04DACA1E30AB53AA686B8704B483152516C94078916C32064FC638467329CA008784847275A61B44E758A6828D5377747B8848D2557DA23090865A58BB1C7E7448AB61796697DB1B5A70C881CB80A9438F13C8753D662ECD495E74B21CDFA177544A3D5F8912634143938935B4F26874231C2D58BBC0F38DAE4135955793596C4DD44798ED9A57FC178A3AE245DE19BE18C1604A06D041C5560E69093854999EB93D1F82447103B54D46383FD084907060FD756DE74B6FFB3675E0ACA92AC5A89DA53CEF6042FE0CABB55C68DDBA367CB999D7B0B935E752AF97196D465E57081E0378465CC6BA56234CCA1283E22334E65A7F56787BE509C1AAAB0942B39D58167DF5421E35B6C966965FEC61BBD8AAADA8B59DD0664DFCA12F88B92A1CA158E7D5B5B5401DA7D038CE9A70FB5C890E52A19CD32DE63219DD94981CA9B269F0C4BE40CAD533C6DB8687E4497526392B848C4BB706AAD7A68AFFB4AC3D21385A2CB4DDF369D41B6C978719C8D121D43551ADBC54F74CB3528655ADC64F62C59461C3531B6272A4AC9CA013A0203C6D8ECA72D67189DC07FCE68847F0053CA9F0F6AFC7D795AE4ECD3D8E6A023B1D861C34DA182BF4DD683ABE8D247898E71E95E27AF72494C02BA6FF3C8147C71F7E44295978FC63BF8F6A68F8609E98D155FD7A74E1FB7982733FBF8A6C25 + +z: EF668FB41F49E82EE0FE00919CC06507548321593A7ECD1D2112342608D95FFF +d: 8D6DF2EB3DDAF961FE5EB556842B758BEBC7ECB312B6D4628B323F483B77D6F9 +ek: 499B0EFC9A67CF754833785F22E7AA1AAA43EE135195F42410FAC0F90A6C7658BE53354D81939036C88A44801707CB2C743363D1623DF1C1C0EA474521979497178361A264C5C68DFD5484D6B19B1734CF6C73521266B4B5D81872F059A22C2A9219CAB4055FD8B95661CBCE716694DE5414B4CA0AB0AB3231A896AEA0883E6A6454F0025CB79894D83179F1036378A423D55005C973A297ABAD1B7321CBB89B6875F3B9522A27C83D7716B01AA8523686B3EA5F9F3722CD715A833CBB7AAC7AE3E24F1F08474E096D31EC3B608C3C67C1340E01B9780A09155C03C7971D54E0C9C7A6265C196C0FDB8E0D6C23D549708B9C2E2E7366F146C2BBC290673030BAD304B67A6133B3B22A41359262AF706785EDB44AA6B58EF1B71C69B4C1097230B90702BFD7657464991C46C4BA0775F807C0ACC14FCA9C31FDFAAE5FE525BD9538933C843764B7FC130322235823D55637B721B20B8825603A57862064517D2DC54545A0A7369270B7B15ED2B5265A401532F4ADCFFA3C94A5B6E89660530800CD317B45522AB8CA8E3EC71259FA60E97A808FC49EC9E998DC703FBCB3308069019DF8138E3B9B69D71F9FC708EB1364E7F7C2DB73765F13A53506AD03205EB5AC5DA86B24E322898B79917753839C5A63F400547D75B426F70D479A6340278D0607C765857E44A2A32AAC4A3D324BAB221FACA212E1A9315B452C5FE25EB0344138A1B191F8044C9A4CCF0901A66C8FA56AB468BA4513E8A045C6621F22719762C37C37C6E8C5C04CDA7A02FA287A2B04BD88BAE4A94DFAB47733D74B056C7541EC992372104A470B60F20E394C6994A13932236532A74B716A8D86F5ACCAE10CF6C1708D079766A7B5760474A9E351ACD6774A627CBCF10E441894940164AAC6554CF73EFA6A7C487216FFC93939561130F107E605C5A20A8B3A280F27942F7CA353BEB66EE67A2CC2AC68CD94310E8B67D597AB33368C83179F8F8124180494EC253B395114FDCA9E27FCAC8C7A0B1AE40D31581946C5506B5063E2050D0CCB6AD713024A9C4D08D09D211486ECD371F5033C8804C0531180B99447FEDB91181C327DC000E7159C1634013EC00C03C4C5ECCBA79DD138F20B4975F27946566A629A4819E7C77EE4625CD91C86615AD1A876E7045196E6C09EA22439751304D92B9C2B3C9BD32A6CE010C1BC5608245B76008A58A4A4C9072EADCA4AE103B63487366D130A5135C18FC4C6766CC8E06B988C51AFA6D1CD44133ECFD539BB0B8CE92A3FDD36127B9C03259161E8441A22F0436F9B1A0C57BC8BDC06371078A2C9548442310B4A5479F0054ABC375E75A1D170A949C91865326A76768A2F117CA524CA8047B26F7416FF677DE0BC07D518C5F71686DD544823DBB9622706FCA2A2112472C352B6BBFA0A3A7C2280CC85C35203A6DBCE3D3C4E8F9C1D454C730192968892BD257CBFC06179EADA01362BB1D1258E9F1BB563565535908803822969B3B2A21633390961891A2DC436B55EF392F0379EC484967A9068E99BAEE1F461241070342221660101651B2A2FA896934141DBA9B905E8C309F8981CC5B080C26CB585090EF97C4E01B8ECDB7F5DD88C4F8B85765B7908256D350898450C3592526E6A99B504A0D3D19FF79680DADC9890E865104DA28FE012506D19180565 +dk: 073C0C1BB67152B5AAB7A58461B1AB82C3BFA8CBCAB360B48CE83CE15B8998579542183C8106743238809A43B848688025D2CAE11857BD75986BC0B2516552F640807A4625D6E28816883BFD48966FA2A39A3486892382BC799FB0C6623D687A2D7A9C6CC0867C2C96C162C272425C503CBB3DF71611565B43777DC805A799FCAE6895C709760689E45FB61779F1FA72EB7628CE299DECFB6D25E883D431069A3002BCE8AE00145AE57785D2F82E76F59B98FA5A5D31426DAC1F394B954377A6ADC243E67A8C05B389E3C013A7F98131DC599B6918B79C665D73C0DD676DB7A864534A536A75C108EA79CA267684812912D8711D32225550788E22A23B861C261083B9A98A3D325A08C828DA42753AB959E4C795FD370A1379C9C926038DAB8BD281AB46FB3D8C1795D6144C25CA1073F00C85A27B441034BE185B43AA0782A70EFA995FDDD35E753B226454A0C5998A8B6C0604991E3942AA699B91C6B17C67B373CDB05A48B05CBBD8B3F1B1139DCB18B15704E221179FD95478A6280DF1518FD3ACE9837E9701503476C230E582AB4BA5F88CA5ED306EBA481BA51B5FB5454BC96100CEACCE14B11A43915E44B0067C44408980CA872B568ADA7432A6B50FC6416DCA06D62B96F701BCFD7A48DB251D6949AD368779FC2858C6108D0F7C0AFCF9A7A8C0A6BC27BF76603B74438B5DB833B3AC8516EB3D99BB24BA310D12EA23FCC0111B02409FC670A1DBA9AED13849C78DFF1229B8CB4B3742046C4744BAA3067F456E8625974E3387662C6ED3B2A1B24262BC8A484EF185F222124C9B3ECAB4B7C4202C64309277B0A28B314C702B72D1C950647C6A27D477E50AC3B675593123961F941750192212B663EA79BE4314096B7A74E7517FDC6818A8C913C59C75BF6A72A2F34F6A77816B9354B48989A5EB62E250372AF04DBB56332B6545AB254CBF9867E354A8F2C4B614646F6F316A8294AE497B3B7E12B6D6953D2A764BC4A22DCE9185C7AB0A939883B2A48531B374F3C499DC746170650BE2F08D0AF4785094C96F3423DC5A8D90F536AAE1C3688353D9A67FF2E01E94CCA7E67A5F9842762B30BF8FB729D0694DAF93397A360E8C200BCF8B7A68B9BFD43159C89C6C88E389B5237CAD95BC85D366DA09BD2AB93A7E8B8CE58AB44E93680201605EF434AF729E3015A3F0F5A69C273724B557BC218360A31C88EB150A545C4BF7922852BE48972D2F479530216F9E75B4F33967214CBA93E601D5D536F8FA3083FB3E5BC6A752F9C3F87413DF31B0235ACB53EA6C96A74D5E02A22FFA4EA8805B0B721DD3A554108000A0BB6F25F4B7FFD11F4CD15F5F34201FB958A8D13F9A530E66B452FC8A160923928B2B9C9BFCA4DBF374923A301751175621A3EAAA2C046AAB0CD42D3B693E4AC19E7171A0ED87186C7C8EE4C576B9EC9A249B7B346B2119B32C78324BCA7C51497458A6E46A24B60E84CB583305BA0A3194E74A5EFA26A1E221CD85B2CD963263C134B2768C3ED37636CE59262A1969C926B29481066C76C17CF80813AA2C30100AE0F20B3C99395E9B2B3438CDDA5857F652A646777F58B38C86EA3F7BF2021ABA4B32070CC8B40CDB7B361AE3219110A00E55249C498F499B0EFC9A67CF754833785F22E7AA1AAA43EE135195F42410FAC0F90A6C7658BE53354D81939036C88A44801707CB2C743363D1623DF1C1C0EA474521979497178361A264C5C68DFD5484D6B19B1734CF6C73521266B4B5D81872F059A22C2A9219CAB4055FD8B95661CBCE716694DE5414B4CA0AB0AB3231A896AEA0883E6A6454F0025CB79894D83179F1036378A423D55005C973A297ABAD1B7321CBB89B6875F3B9522A27C83D7716B01AA8523686B3EA5F9F3722CD715A833CBB7AAC7AE3E24F1F08474E096D31EC3B608C3C67C1340E01B9780A09155C03C7971D54E0C9C7A6265C196C0FDB8E0D6C23D549708B9C2E2E7366F146C2BBC290673030BAD304B67A6133B3B22A41359262AF706785EDB44AA6B58EF1B71C69B4C1097230B90702BFD7657464991C46C4BA0775F807C0ACC14FCA9C31FDFAAE5FE525BD9538933C843764B7FC130322235823D55637B721B20B8825603A57862064517D2DC54545A0A7369270B7B15ED2B5265A401532F4ADCFFA3C94A5B6E89660530800CD317B45522AB8CA8E3EC71259FA60E97A808FC49EC9E998DC703FBCB3308069019DF8138E3B9B69D71F9FC708EB1364E7F7C2DB73765F13A53506AD03205EB5AC5DA86B24E322898B79917753839C5A63F400547D75B426F70D479A6340278D0607C765857E44A2A32AAC4A3D324BAB221FACA212E1A9315B452C5FE25EB0344138A1B191F8044C9A4CCF0901A66C8FA56AB468BA4513E8A045C6621F22719762C37C37C6E8C5C04CDA7A02FA287A2B04BD88BAE4A94DFAB47733D74B056C7541EC992372104A470B60F20E394C6994A13932236532A74B716A8D86F5ACCAE10CF6C1708D079766A7B5760474A9E351ACD6774A627CBCF10E441894940164AAC6554CF73EFA6A7C487216FFC93939561130F107E605C5A20A8B3A280F27942F7CA353BEB66EE67A2CC2AC68CD94310E8B67D597AB33368C83179F8F8124180494EC253B395114FDCA9E27FCAC8C7A0B1AE40D31581946C5506B5063E2050D0CCB6AD713024A9C4D08D09D211486ECD371F5033C8804C0531180B99447FEDB91181C327DC000E7159C1634013EC00C03C4C5ECCBA79DD138F20B4975F27946566A629A4819E7C77EE4625CD91C86615AD1A876E7045196E6C09EA22439751304D92B9C2B3C9BD32A6CE010C1BC5608245B76008A58A4A4C9072EADCA4AE103B63487366D130A5135C18FC4C6766CC8E06B988C51AFA6D1CD44133ECFD539BB0B8CE92A3FDD36127B9C03259161E8441A22F0436F9B1A0C57BC8BDC06371078A2C9548442310B4A5479F0054ABC375E75A1D170A949C91865326A76768A2F117CA524CA8047B26F7416FF677DE0BC07D518C5F71686DD544823DBB9622706FCA2A2112472C352B6BBFA0A3A7C2280CC85C35203A6DBCE3D3C4E8F9C1D454C730192968892BD257CBFC06179EADA01362BB1D1258E9F1BB563565535908803822969B3B2A21633390961891A2DC436B55EF392F0379EC484967A9068E99BAEE1F461241070342221660101651B2A2FA896934141DBA9B905E8C309F8981CC5B080C26CB585090EF97C4E01B8ECDB7F5DD88C4F8B85765B7908256D350898450C3592526E6A99B504A0D3D19FF79680DADC9890E865104DA28FE012506D19180565847F52D9587DA7DD37F7AE07BF1B9D4C94F03C702351FB4C5AF4200EFCA07F38EF668FB41F49E82EE0FE00919CC06507548321593A7ECD1D2112342608D95FFF + +z: 26345937ADC9104155275E7114E93D9F5847EEA73A9359358585B2D42301A294 +d: DB4ED8E9C3E1AC7A35EA4B67A4EFCFB46972A984D161F79F084125D6D4AEE7AF +ek: 7BC585BA01AEAF899394E3C00223562CA2163F977AF21CAF967A9C174B3719B097C440A60C5AB746683F15294E4CE40031F16A6FDA79C608095EEB6945241B25A77DAE55CD95161C94836940C93665D669745A013013875A722FF1B285047C9270687FBF2310D1510680406C70CB97A65CCAB59AC6C80C4937810A2488BA8C37C6CF022E4FC14135D2100B613E3BECC8D74261C0912683067429DB79CAA56469CB537E432257EC2EAF370590613716C64FDA2A0EFEF27727E5A437000C9145919158BE240B426E63AD426018FD3271D899846E6421277C511FDB14CDF1B16C48B99080B6FA68BBFB4C02DB837C65E6CB02235412AC3534FA91AAD35DCB3AA773FC2A050975ACB0C7928201636A7920F46DADAAAAF9072F6B23B138669BA4C9655A660F3911AEDF97633ED966CD1253CD7B947C09839CA53AF33B80A370AAA43C1ED6D26D64981D756060A17331A3D4B452FC34F186986936C2EDACCBE0629DB60493BFA49451D44BDEEA1D6605BE945625654A6A6C13943B2972D0A95CC07B70196579ED9013B8CB5BEC81AA61066B5AF6673B3681B21B65905C1E44B808B1995819B211D0BA9D4AF45E6C030D75D2C63E77264BE92DDBE1B54BD54060CC4E8A760DDC124EDBBA6DD8910922D18222AC42D802A1A377C0979B3D9CF8736ABA7EF223413E6712FA523716DC5A0C41CC3CC462C6FAAD0CF30674EA8469A06B1FFCA3D6E3AF0AE95689C70F3325B3BD6C3158BC36014B836F908D91269FB5B05CE6075A80D4A70562572A64AE090C9C39DCC5C6197D84C62752E30DF9A49657DB5ACA0084393A25C6047E629151C8BCC3C4897CA2BC8BD3EC4115B8230A155C15775C7CB7A3DAD6560E6798C57A607FEC8DF6493C24A11518280F081BAB5359AD5468B1717560F1E60273518ADA29819E11679D16CD20514EE44989C62582B0E79A1C09997CE67B9E46850F294BA940C7A6668B28EB6C953C81F50C2B94F14A0DA76DE5AAC603395ABC8866B92B88890B120A62CB06CA8F0F14806E19A794F73FDBB1A9638169FBC30BF4C764F66475395515683C9CA4E587312B4301547C25B58108408E64D6BC0A6B9BA8A4CEF76649290A185BF25DF5C14B81F633A399325380A91B5C2AB21399C4C88597202A50A966DDD8AAFD4A2A831897385AA5E19480437B5E1EA05F778BB8C616391C2766F1DAC500D1898AF957E022202C33BEE93001F7E56B0589C25DDBC5CACBBDBBA308B30228C5108019280812925E395329D3A72B6566694DE690746A1B244AA21B879E54590A4173197C2C930E683F645A83F6B288D3A48D00A9CA97180AEED5685691B8FCA95ACA9136EEE892B5F46CBF60BEE6D803DDC05555349D4FD1AF405C78D6B86E56C12A26657832D753B9D901557572E7960EADE5A9110CAD2C1353A415BD119BB8A42924B0BA004ECBCEBC430F13B33F82AA1D4727CBD8150F416A14AF1A6CBEE094D0EA963CC4C814E6A9CF097DF9B9BEC7D9B68D5BB23F767F1CE88FD44B5539F80F2EDA4B887576107C725A3A5D80240397907AA15842A400CB6200325B1542E268BA3C054E350364C836370DE786E5077EBB4B4C8961917870019C7A4794D27E332C14D26B6BC02202CABC83B8E9E01A155B3D735CAB97C80992BE75623F2B79E41453AEF4A09F6CCAFFAC73 +dk: EE528DC327151C18138C507974649A95121F768132E6C6647F2A193556C06040C80058394883C01D75763041146349BC8FA72E57BA7069656B2D138B85784C79B11E70025D5F3558EB8BB418CC8BEA139310F850F3557FD56A10F0D297BDC0C0DC3B4916CCCA4A419B5DD6A8F8F6B0F1AB6BB2B606C73AC36C0C93267A19B7C7CB82AB9C96CBA726770C5475A6B889CAAC178B8882BFC236CA32197523E95112697F7B75248B3C12F132B45535CD55E274706242A69644429A1C3BAB673B580C7DEC34FF7379AD073241156477D1798D1AB09AA5C53EF195E65A7C15E5569781A9B06376F77337A1E56506C785F5D4C95FE05BBCC736685370648A90320C059CE45E55841F08CC8024C24C473646B128451047B44F1C526FDC4B8D862DA60A97AD91CCE133B5BF7C70CC0A23B458380602882EA2741440CF05B1C960699C8A404444A19345F113DE341279C11B58A7BB6B903DE6054D55DAA4A501741E6953739564770205571CC93861A9D5D785F273338CC90432D00B64A488B023AA5EEAAB0543CB34916B55A5CD69380A330CC194640D41048745FC74CAEA0FC8C95A03FB40F701B763E73FFF6B1C8D2434D2646BA3C870C0A29CFA45A880380F6675CA36AC1A86C57C56A16BC6E5A9ABEC7404F86209B3AEC736A8E436407D2476CECB799A880AC8AC33A3F58C68CC047480BF85258B6C1C159B01BEFC73B7BE506BF75C67DE85893DD2425C467B2F627971925FBF666B80DA59DB285813D688916109EFD2951995953BA729DF127018B7043AA3A57BA33AFE2782F8F319C754C4E91780B446C4D3360A824223657405EA34AB1DE6181C702AD100CADE0380BE942EDB51A93D1A0A884308352CB2D93B920F1B467FC306F6A6AF9E41334F861360646CEFF6770BC1B7211A1D2B95377546A0AC4BA431F824A1953BBAA8BC9CD66789E55EB2C8CCBE4B51233C2578B8115061276B48651B63097BE21BE45868EA513F69B91F6455CA569C1C26317E0E1807C7B7B2D4D43F16958C2BA32CE0585E2DD1991B357C72239817B0484B3258ABF39988933710528E82F11BB8E798CCD5C323DAA16C9C0786C1C73AE396946A0EEDE43FC7568C98D056A1766AD702B4F6478CAC056410FB9B95A9427C32A87C84BE3C9A21C0CB46567ABCB3D1CCDC3B8ABA0A1BBF18A6D23474E3659BA696197E059B6F536523E60C0C69314A12312B37CE51686B5CB742715BBC4F241ED12B342045BA69010CBD24597DA695A331C4B8E7C693157A348C9E16A0A307900D86A032E08B5E802A29842C13DC7509D432C5AA7B679BA10BD090CF9FC086E0C5C2AAAB208F39179E693645672123D894EDA35C5E32031DDA9DF410C32F72BCA22B5645E7A5A9C804A45BC67A861A6FF5C821D9CF79E6BC4D8386BF77AB31C6BDA9DC6E99866B5E43193D9210A790CAA629BAD25304E6A946B3D87235CC39F5B66EE8B4C6EA73022B867C6CDAA133A0962579612C8CAE71BA151754B4862C7193994934F04FC3BB2C20A71CBB6962C5D16224D1719555143E33A0E70B79A2D6134CE0BA1797C8A2F98B71882D5BD214E73A950C849FEA2006B242B83F5C8998113BD27C01C3276FC20041ADE77AB144CBF6368D45C18C7BC585BA01AEAF899394E3C00223562CA2163F977AF21CAF967A9C174B3719B097C440A60C5AB746683F15294E4CE40031F16A6FDA79C608095EEB6945241B25A77DAE55CD95161C94836940C93665D669745A013013875A722FF1B285047C9270687FBF2310D1510680406C70CB97A65CCAB59AC6C80C4937810A2488BA8C37C6CF022E4FC14135D2100B613E3BECC8D74261C0912683067429DB79CAA56469CB537E432257EC2EAF370590613716C64FDA2A0EFEF27727E5A437000C9145919158BE240B426E63AD426018FD3271D899846E6421277C511FDB14CDF1B16C48B99080B6FA68BBFB4C02DB837C65E6CB02235412AC3534FA91AAD35DCB3AA773FC2A050975ACB0C7928201636A7920F46DADAAAAF9072F6B23B138669BA4C9655A660F3911AEDF97633ED966CD1253CD7B947C09839CA53AF33B80A370AAA43C1ED6D26D64981D756060A17331A3D4B452FC34F186986936C2EDACCBE0629DB60493BFA49451D44BDEEA1D6605BE945625654A6A6C13943B2972D0A95CC07B70196579ED9013B8CB5BEC81AA61066B5AF6673B3681B21B65905C1E44B808B1995819B211D0BA9D4AF45E6C030D75D2C63E77264BE92DDBE1B54BD54060CC4E8A760DDC124EDBBA6DD8910922D18222AC42D802A1A377C0979B3D9CF8736ABA7EF223413E6712FA523716DC5A0C41CC3CC462C6FAAD0CF30674EA8469A06B1FFCA3D6E3AF0AE95689C70F3325B3BD6C3158BC36014B836F908D91269FB5B05CE6075A80D4A70562572A64AE090C9C39DCC5C6197D84C62752E30DF9A49657DB5ACA0084393A25C6047E629151C8BCC3C4897CA2BC8BD3EC4115B8230A155C15775C7CB7A3DAD6560E6798C57A607FEC8DF6493C24A11518280F081BAB5359AD5468B1717560F1E60273518ADA29819E11679D16CD20514EE44989C62582B0E79A1C09997CE67B9E46850F294BA940C7A6668B28EB6C953C81F50C2B94F14A0DA76DE5AAC603395ABC8866B92B88890B120A62CB06CA8F0F14806E19A794F73FDBB1A9638169FBC30BF4C764F66475395515683C9CA4E587312B4301547C25B58108408E64D6BC0A6B9BA8A4CEF76649290A185BF25DF5C14B81F633A399325380A91B5C2AB21399C4C88597202A50A966DDD8AAFD4A2A831897385AA5E19480437B5E1EA05F778BB8C616391C2766F1DAC500D1898AF957E022202C33BEE93001F7E56B0589C25DDBC5CACBBDBBA308B30228C5108019280812925E395329D3A72B6566694DE690746A1B244AA21B879E54590A4173197C2C930E683F645A83F6B288D3A48D00A9CA97180AEED5685691B8FCA95ACA9136EEE892B5F46CBF60BEE6D803DDC05555349D4FD1AF405C78D6B86E56C12A26657832D753B9D901557572E7960EADE5A9110CAD2C1353A415BD119BB8A42924B0BA004ECBCEBC430F13B33F82AA1D4727CBD8150F416A14AF1A6CBEE094D0EA963CC4C814E6A9CF097DF9B9BEC7D9B68D5BB23F767F1CE88FD44B5539F80F2EDA4B887576107C725A3A5D80240397907AA15842A400CB6200325B1542E268BA3C054E350364C836370DE786E5077EBB4B4C8961917870019C7A4794D27E332C14D26B6BC02202CABC83B8E9E01A155B3D735CAB97C80992BE75623F2B79E41453AEF4A09F6CCAFFAC7316161113DF646837A28818D9C34EDAD57472944528FFBEC6B1BD204262DCA04F26345937ADC9104155275E7114E93D9F5847EEA73A9359358585B2D42301A294 + +z: 63435E06C2AA3DFB3477120710D5E7FF0DC0DA68D4644A24F66A8012FB193697 +d: C6EFA7D5D500E5BF857D80EAE2A6EE6414159947FD4BE589350724FAE5E51805 +ek: B07C141713A0AAD60845A07EFCC54C4DD073348261F7485FF93CCFA7000967A24E7F03BE00D4C0AAF13995F2C19D0C92B3F372D75802891B0A97E78917301D429B0AF9C7693882024AD301C5B1448474BD2B39CBEB18332CB6252FA7920D94AEE849C10A907B5FC827B94A58E37378161A4407647D025B590D1A1C50880B2DECB17774B22D3139445588B9BC93F7020FF6A9959E9A04FFD15669F9A8CFD412EAC051B940B2ED02561A4B9F4B57753423C10DBA0587287D9DD068C4660138E6C3EDB94664797B1C702D9D89A1C9D086C1F7A21238B4A22A8F6BE9075D0B712F4567E55C0CC1BB4788F2A693D6088D36331350B3969B66C35CAEE9A015FC80CCCC556F1C034431FBCD2796BCBD9347B39C472B27CC8F36468BB10D4D1767AFF24C33ACB86D7191AB359903F43E73DB80B5F39AD25933E0645013B2AD56456081495B7036B28B652F577C1D251CCF45D3BEA72539D359B94DB50B150AA5D4E56FDC91B2654A4367C650E3E1310B72403135C185B90C5005A0FA11C569FB82A3DCC71AE774D97B171987B9D128516801B9A7D91FA6DBA6E5341A0147963BD29415E90DDDBBAACB242056E487724285BE3756C37538D60BCD7DDC44FB25AED0C24CAA663BD650CA4E806BC8A259E9794AC4642447F225BE560B541BA90C227629B2ADA4245D83E41117A095874CB676144782439CCCE1893D26B7D427CE0060A106903891687C17D636CB865EBE4C28134885CDB7722D84B0BE41638D5A14E18023191B35AE228C1EF92914A505F93901ECF598E5093E31A41611F6726C42A96DC2200C5178CC320EEEB8B223C8746B72847F9B586A229929A3B5617A54F6E56C6CEB018AA0B02DA6CBFB1278015B68BF15BEE2F223DFE4025349ACBBA505BCF592623C6D3FA975AA661E74948757000CB476757B732F8647C4F8C431C85975A09BAA591B95CFFA3D89FB3AED59330164510A303609D0726BF63479116AB2EA92DB8B89859C82D3A0966CD5348BE479AA15B6BB395165777515688D172265C7018D08D59F72C74A682290CD771C557018A686CE1B3451D6AC0D4149BAF16C871779031BBB9C4E70C9602B38A82200D2D251C5B22C60CAAA98FACB66CC3DF2A3770EE282A9DC328658A2D582B894DB7B5EDBB63A7B90788786072698C2904343A1B9F6DB107E5A6CE1129A444B3DEF542E35728F080294330343B4843AFFE144827499539B0C79B2CC29961158F61A20502BF3BB38A784BC8A673F3E680C5F8406056A035FD1A3A5E445DBAC0282E1B7885A891BFB367D236AEAD15E4F5B5CE26A6ABB4840DD177000806FA066380CD381D5BA64CBD3B048D60CCE49975EF778C1F8240A1484D073CF3B5625E23A0E02D22875465687987FA6EA8D42C5CE28443BF726551F6CBE108732DB119581CC9CFED76D6D1CCC5FE132A9B51D6D4723FE2B64C70B65F7DABB8E71C3A876545CD1AE11B835C1FA4629E69DE1D489D085575FC3A677585CA06C594FFCBD17E76162366092C03F2AB951FFB012E89446F047A4925BA350AB51C1526FD79A853B2273C2B68A590816CA0536C4C467D0918DFED84230E9AA89063530204F096B6E18C29381CC9CE4BB391D6312AA804E84B9170E59272C4835BE92CE2AEE6D55F2AF72FC20B0DD71E5A81C39766E3BD54B78372F1C6A +dk: B4FC40D80B09DECC317933826E7985C4E074C65CA16B6C7184F30CF1AA705ED7CDEF878624007ED6017BF9D4170C20928A71388ECB8FD2906D612525F3A8139261419B1799040BA0F5F29BDF683E1BCCCAA819A65FD3286EA55B98B3B0AEA03972A0988E352112F0984E64A36760317EA9BA7267949BB02423D5A53EFCADEA178FC568464859BD634259C6B8AF7C2BB9A462A3F0BB66A15B2BF0956DD7829DBB2BCFFF47A40AB487E5D76A57AB71A2AC6C5B651597F631F37A9EAAE10E42D4588711B1CCF1331ADA44EF532301900A6BA2764721C81B2ABB3280672386BD64D52356737055EA8F9409756A03A5E0B410EBD4463FEA79ABF65254957447B6BCB9989F733BCD58E8CC34D74500DA128247264E0253F0EC811DF199DF1298F87A34710998045BCCB5205441EA20BFD776EC02CC70075B272533C011A25EBC541CE65B54D03149A4C04E950834D8A33996ADBE386411D168C4F735354171B3BA908A208B8B0C8DD95113BBB301D361189DA703372A7458337027C27682C04A0CE6C0C0098CAFE1594BA01787568B944C58BE9A3EE4600444BCB15376648222C167FA317866745D2495D9B30522C830B6C447F935A38588BEF31CA014C5106402933B098F8432938A1267ED4BCCBE24B4CBB45AB3317BC60C8525FB21AF8B5C35546D49A41E35ACC7B24466E1A7B7138A045BCBCB2D98C0EF242C5762CF38EB29A61AB7CCDB94880710B9E7AA0366AE25034BF131012FD0AFCF211312066A667C3739941BE616B3EE1139D890BF4CC499E6720BD00103B29A05E5B993C6B89E281760B853418A2AC0E6A278A2D2C3A213514D486D2B01AC73A8C21A01AEE891A324E2AD45338431147988799FB8D6AF44F62BC386431F3C664E9100B3E4B86B195F31125D58DB59E7858F45506CC5EA11A9902668601AF0B7599508AFAD51799C389BE4C164691515F59C4D02A2CA092A3CD06181C804AC81A651EE142866B563089BA9A6B459DAA746DBC0263E04050AB458FA97682566C3E4949ABA5CB3DE8548AF3BCE2A253F8043C0EEFC96E3E83CE3A427FAC302AEBB2AD104454790BE531B77604A910640313E5CA5EDB6AD8729AFF6C37705E2BDBC9A9917D36B1925AF45A22C7EEBA2C26544FE5821218A19207990FBE4881FB8B4CA76424FF9022C4C61D680B0F1F668B537103CAB1E1640396050CA524465A9F80221B8A3CB8CCA8979B7C85A141E26649C26BB3DF4666280961CC72060814FB6720DA96979F7E25C4A68588A00801A121E60F217D565460D7C1AD47BA858585A7EA696AFC91544B533A7D86AB68C7F81856F03135912BA1D0F69AA73921C0EC87E8B770C1C332B378A9387C0BC64A64D4FE6AB5FEC50CDF41FEA9883BC44A9175A3DFC0CCAFBE434881CA7E2B53A825ACA950AC2050B20D1FA9B36536A34E83B860850DC90B9568547B7246A115A9394455818A2B081843CBFE129D0389CFE27B192673E13C56B9FA38E99784CA5E1CC0529960534C9AC2497524948C4401259B09628A605FA659661C96CADE04B82894116931C63207F6B46675E14549DC767291B579BDA32B6EA16121B97C19BB4A90287C9B6199C904DA6B6A1278BB7A7B77405A9696493A45C8C27B07C141713A0AAD60845A07EFCC54C4DD073348261F7485FF93CCFA7000967A24E7F03BE00D4C0AAF13995F2C19D0C92B3F372D75802891B0A97E78917301D429B0AF9C7693882024AD301C5B1448474BD2B39CBEB18332CB6252FA7920D94AEE849C10A907B5FC827B94A58E37378161A4407647D025B590D1A1C50880B2DECB17774B22D3139445588B9BC93F7020FF6A9959E9A04FFD15669F9A8CFD412EAC051B940B2ED02561A4B9F4B57753423C10DBA0587287D9DD068C4660138E6C3EDB94664797B1C702D9D89A1C9D086C1F7A21238B4A22A8F6BE9075D0B712F4567E55C0CC1BB4788F2A693D6088D36331350B3969B66C35CAEE9A015FC80CCCC556F1C034431FBCD2796BCBD9347B39C472B27CC8F36468BB10D4D1767AFF24C33ACB86D7191AB359903F43E73DB80B5F39AD25933E0645013B2AD56456081495B7036B28B652F577C1D251CCF45D3BEA72539D359B94DB50B150AA5D4E56FDC91B2654A4367C650E3E1310B72403135C185B90C5005A0FA11C569FB82A3DCC71AE774D97B171987B9D128516801B9A7D91FA6DBA6E5341A0147963BD29415E90DDDBBAACB242056E487724285BE3756C37538D60BCD7DDC44FB25AED0C24CAA663BD650CA4E806BC8A259E9794AC4642447F225BE560B541BA90C227629B2ADA4245D83E41117A095874CB676144782439CCCE1893D26B7D427CE0060A106903891687C17D636CB865EBE4C28134885CDB7722D84B0BE41638D5A14E18023191B35AE228C1EF92914A505F93901ECF598E5093E31A41611F6726C42A96DC2200C5178CC320EEEB8B223C8746B72847F9B586A229929A3B5617A54F6E56C6CEB018AA0B02DA6CBFB1278015B68BF15BEE2F223DFE4025349ACBBA505BCF592623C6D3FA975AA661E74948757000CB476757B732F8647C4F8C431C85975A09BAA591B95CFFA3D89FB3AED59330164510A303609D0726BF63479116AB2EA92DB8B89859C82D3A0966CD5348BE479AA15B6BB395165777515688D172265C7018D08D59F72C74A682290CD771C557018A686CE1B3451D6AC0D4149BAF16C871779031BBB9C4E70C9602B38A82200D2D251C5B22C60CAAA98FACB66CC3DF2A3770EE282A9DC328658A2D582B894DB7B5EDBB63A7B90788786072698C2904343A1B9F6DB107E5A6CE1129A444B3DEF542E35728F080294330343B4843AFFE144827499539B0C79B2CC29961158F61A20502BF3BB38A784BC8A673F3E680C5F8406056A035FD1A3A5E445DBAC0282E1B7885A891BFB367D236AEAD15E4F5B5CE26A6ABB4840DD177000806FA066380CD381D5BA64CBD3B048D60CCE49975EF778C1F8240A1484D073CF3B5625E23A0E02D22875465687987FA6EA8D42C5CE28443BF726551F6CBE108732DB119581CC9CFED76D6D1CCC5FE132A9B51D6D4723FE2B64C70B65F7DABB8E71C3A876545CD1AE11B835C1FA4629E69DE1D489D085575FC3A677585CA06C594FFCBD17E76162366092C03F2AB951FFB012E89446F047A4925BA350AB51C1526FD79A853B2273C2B68A590816CA0536C4C467D0918DFED84230E9AA89063530204F096B6E18C29381CC9CE4BB391D6312AA804E84B9170E59272C4835BE92CE2AEE6D55F2AF72FC20B0DD71E5A81C39766E3BD54B78372F1C6A0B2CEE55AB09D33BEBC1119E3D8268D321CE675CA8233E6AEE598C7652298B0163435E06C2AA3DFB3477120710D5E7FF0DC0DA68D4644A24F66A8012FB193697 + +z: 8C2942B7207C2C59BD56FF9EE0B120B1DAD81B05602623623CBC7E0C20C9B709 +d: 20859B01DFC60B6109E0234F3CAC7A247D8386099D83D2D447E9A21AF9DE48BD +ek: 33C5396C96C17503A1F0D509FF56A842767B24B4C3D2C080D428090E61C88EFBC69D086B83E56F5F898D99EC04F588567B2077B0270BBA8263132C7690645D38AB584C9773AC35389B88C67E34424E003AE741521545039E1C3D2BEB4BD05674A700C150573E0781CE8EEC7D2AD17F2D214FFDA22BE21A55A9570488108B0A555C6D225A521045F6D002F1B330588049FA6BA2D79B552285542BFC3BF3BCCF76D922E7AB9039189A66B76D58D9C82443A32DD26A6B134DD3783EE3480018B04DE6D9561426287C9A8F35ABAFBFC9CFB69107AFD639E9C622A3DC19D0D19EF2C4394CB10E0F519E9C8A9A40F6C33754279ED5C1DF06B065B4760453A4CEE04C67E571565C82D5882211361B0D15C9C0F8A75892A2F1A79673CB31BFF12EA352A484E6CC82B44D1C7C20EFD72F112CA0C25450C672BC34C2B8ABB84C52FAB5B0C66FC2288C48957664ABC079296401C3A470D6BB0D6B231A591ADB1763EF1C522DC95DD4E47728E5BCCBC05A73D7C856309DFEA90E25B7A4ACB4705FD29715441565682620F992034A0DA861C51873212470BEAEA6096B737235CC2C94165723495D7EF43C6327AD9ED398EDF9BE0A29B83D595AC8C46A374B4F02C4B1820095E223092498503AB926B9302C948A439539ACF3C31E91B50190980BAE4411CC652D3108302BB1C4376975AB510D12642A3098BB7FA5B6C14354D6D490FB247FD9C1BF83D8C4DE9C7DC5D58780115D7E0005874BC813B40A6B6ABD1C802C9ABA01A9D893EAEC7EC3AB011EF44AC42154AE40066A72159A9015286C2115213921AC3182372236E7059D6A352626A6DC0C1F7A728FB35A34BCE2C7FBD0659CB6496CF57455E7034E979DF8F134AC398020F153D2624980625DB9AC24707ACE0D7490335561F8EB5CB0468F88DC934B4763846535701B3671C53D30038CBB2896426AA7460338266160173798E36C0C04FA70FF68A56F52A65379031F2565CCF30929A948A6C222D610BAEE964A32C2BB4AE389C7F85ECD0BB733BA1798BA347D142AEB482AE9200B9B4C589264B64A915B3158401B343AACB256D9E8CA942A9770AC4652066B4E16414C78152C3C1D123C2057EA4FD5A511CEA8B3CAB25B9F4258020144924878CED8ADBC9B4409F34DC1F87ACC4165A0F92A8EB364F469751CA87EF9B87B9674CAD2B8628966C7E7D6BEBDBB0B4E6CB51D017EDE9735CD3C3F12B83BF9651788ECCCB2D9B237A330B13B516BB40BD806974528AD133C8E68D839EFC852F3F04E960102E8A58B40615E3D53152C528291826216125907E352CFB53EAD5A33613AA78ED20F9CA3437FD3615980AC118963C8482AC806CE6237853EEC6FF62657A2B19EB6F8678722A06C2698FD15085ADA9222D211A86B4E1BF007EC5906704A69289A8E1F6C4F49A5CFDB90C13BE4771ED4641CB4987BDB80B09724F9A9982AA27AEBFB69D984A5CC04BD94D335500359095214616184993A37EB0422A263ACBE53A6DF5B316378C22E830E2A968661A840C09ACD6711507DA822FE9749DD4C522CD11CA2E57B225BC2C398BB05A975D7E72EAA2BBBCC6CBD88721CCC762049A44A70926778340F5FB7296BC33A8C010089011CB947C5B5E299D0DB66C9C89C5C3581222435C5EAF79EB6C152255ACF9BDFF03781400C9D599A905605 +dk: 7C63447D4668CBCB42035803A4C9350E38AF8EA8A6296658D7A545B40215A2E7C70AF7726D32CC4B7062509AB15F776E1FB812C22062ECE079492900F0B18DB3D66B4CB2B871766145E237C51023286700238537DE2187A5F45F7671027B88A7CD372A54621D52063705E1B4C07786360805E8CBAA60D9AE953708C201B70DB39DCFCC88FAA2C0FF855C30F31D9C7193616333AF72C382B92DFDE56F48E20689C2C61E940264027923980ED787CD98AAB8476C4C7511A9EC9C0B08D9523D61BECDA2054E1B01B90947AED40961C7A7FF6BBEF64156B243159E4B3D343363DBD58B2060505CB066A31C629084B9E658425BB28D84642B1E216BED180D688415C81C2BCA4A49354709F4ACBB16B8AAF8263329314818FA98FCB7139E673AE702706D3274E020BF469C651FD5A08E6086F36C6451D00ACD94CA59248FD35C91CCD856056439AF18580C066C34DCCEF1C9700DB7C8206384E25531BBAA39CB3760FB346FF8F77DE85461F7198E8C396AA8CAACB8A42C37B1879B80953C1257E82770F098C4896C76A506B8605742C58385DE754797833FD1E08D3E5B45AB828666F15608B6C81DC7166CCC678D1CCF3CE5967B57ADD583C1CCB089C02CCE05B15F810AB3A43335BB0041F0699302972E23A5C229A67578AC9D5B1061CE5B59E72B81EAE01E0740490D84AF88EB572810CEB18C17008308FC860C65B4C1B9065DF9E2C37DF9AD096C96AA0722B19106984A24804ACFB36A9925B5A32D2019E933C54579959FD536992327BE519CD03190CF9595DC5303D4A24AA7D604FCC7BEFEC4C244E7836F63A876073CB757A61B919973696BE0EC1CC15041ACDB2CD9077E15C66FDDC9343CA2A2ECCBCC3FD2319C842F0099969FFA5DB4EA416DD83DAD971197785A5C3173981700ACAC5232C626A5C52B7AF217BD45A555C4898231B256866098518CA1D379822CBEBA148412A664E5094D24D1B6D77BCA7FD176B88856659B9E8513A078A1BD07781FAF1A697A7778C2B8A4A8A0CA48FB0AD8A03E39F7753C742CCA3911B948167DCA397F935BBE0CCEB9D1AD173A8A64E318F9DCA501B031C745939DE94CDAD55722EB2F022495C063259268CF5193B486315083F3B43997C732BC9DA99324252CB503F409340B5A64E74C11733DF256ADB10631C3C002B4E46C340BB99AE3246E794ED09A5524A742DA01076A78B967BC9204F764EC61B528E97176F92F440252FC1838D187A8ECD821E996B5239A1A0F320B12F11CB5C446001D6D765CB11C4A2B24B41F23894A9945B27902A6433CC4BB5B9AE19637B5E1BCD52A29745693F5742970606A89DAB78CCCB61EEA78B0CA49D678C2477B036C48C3D2A514005459728669F8743A23A26865B04A3AE930B6E9C67148A5A2A3643DE2B837610402E6039319969CD928D39794E1311739C0780A393E076C2DC89038A10C1079275F765CCAA064436BF5052051476C1C3BD4167739E2CBE63545148350CAB4134825B2C5D27A68524BBD937957C40F1C00BC06D677E2D5527550876BD7CA3F036DC0B5625F3976BF63CDA2E9B2FD4BCBBAEB911A01B0D3716CE5369F18A285E4BCC6269B407D42A7BDBB88D724C5AA6188B9716BA3D3A3B962A933C5396C96C17503A1F0D509FF56A842767B24B4C3D2C080D428090E61C88EFBC69D086B83E56F5F898D99EC04F588567B2077B0270BBA8263132C7690645D38AB584C9773AC35389B88C67E34424E003AE741521545039E1C3D2BEB4BD05674A700C150573E0781CE8EEC7D2AD17F2D214FFDA22BE21A55A9570488108B0A555C6D225A521045F6D002F1B330588049FA6BA2D79B552285542BFC3BF3BCCF76D922E7AB9039189A66B76D58D9C82443A32DD26A6B134DD3783EE3480018B04DE6D9561426287C9A8F35ABAFBFC9CFB69107AFD639E9C622A3DC19D0D19EF2C4394CB10E0F519E9C8A9A40F6C33754279ED5C1DF06B065B4760453A4CEE04C67E571565C82D5882211361B0D15C9C0F8A75892A2F1A79673CB31BFF12EA352A484E6CC82B44D1C7C20EFD72F112CA0C25450C672BC34C2B8ABB84C52FAB5B0C66FC2288C48957664ABC079296401C3A470D6BB0D6B231A591ADB1763EF1C522DC95DD4E47728E5BCCBC05A73D7C856309DFEA90E25B7A4ACB4705FD29715441565682620F992034A0DA861C51873212470BEAEA6096B737235CC2C94165723495D7EF43C6327AD9ED398EDF9BE0A29B83D595AC8C46A374B4F02C4B1820095E223092498503AB926B9302C948A439539ACF3C31E91B50190980BAE4411CC652D3108302BB1C4376975AB510D12642A3098BB7FA5B6C14354D6D490FB247FD9C1BF83D8C4DE9C7DC5D58780115D7E0005874BC813B40A6B6ABD1C802C9ABA01A9D893EAEC7EC3AB011EF44AC42154AE40066A72159A9015286C2115213921AC3182372236E7059D6A352626A6DC0C1F7A728FB35A34BCE2C7FBD0659CB6496CF57455E7034E979DF8F134AC398020F153D2624980625DB9AC24707ACE0D7490335561F8EB5CB0468F88DC934B4763846535701B3671C53D30038CBB2896426AA7460338266160173798E36C0C04FA70FF68A56F52A65379031F2565CCF30929A948A6C222D610BAEE964A32C2BB4AE389C7F85ECD0BB733BA1798BA347D142AEB482AE9200B9B4C589264B64A915B3158401B343AACB256D9E8CA942A9770AC4652066B4E16414C78152C3C1D123C2057EA4FD5A511CEA8B3CAB25B9F4258020144924878CED8ADBC9B4409F34DC1F87ACC4165A0F92A8EB364F469751CA87EF9B87B9674CAD2B8628966C7E7D6BEBDBB0B4E6CB51D017EDE9735CD3C3F12B83BF9651788ECCCB2D9B237A330B13B516BB40BD806974528AD133C8E68D839EFC852F3F04E960102E8A58B40615E3D53152C528291826216125907E352CFB53EAD5A33613AA78ED20F9CA3437FD3615980AC118963C8482AC806CE6237853EEC6FF62657A2B19EB6F8678722A06C2698FD15085ADA9222D211A86B4E1BF007EC5906704A69289A8E1F6C4F49A5CFDB90C13BE4771ED4641CB4987BDB80B09724F9A9982AA27AEBFB69D984A5CC04BD94D335500359095214616184993A37EB0422A263ACBE53A6DF5B316378C22E830E2A968661A840C09ACD6711507DA822FE9749DD4C522CD11CA2E57B225BC2C398BB05A975D7E72EAA2BBBCC6CBD88721CCC762049A44A70926778340F5FB7296BC33A8C010089011CB947C5B5E299D0DB66C9C89C5C3581222435C5EAF79EB6C152255ACF9BDFF03781400C9D599A905605EAFE2B26CB96B97C22564B28329B64A206331FF842BFED4ADFE3C7A0C4A471BA8C2942B7207C2C59BD56FF9EE0B120B1DAD81B05602623623CBC7E0C20C9B709 + +z: EAE318341D06E0801C0CA4B873520C714740AD017FE5A158D3BD40960D907AB7 +d: 409E9F3AB58D736E122EFCC4240BF8388FDFDA6759004D42457018014A335BE4 +ek: E74A4568457E0C7727A53682E50CBF74082F01C9892F60B9DC57C79A82123703A8375C7EFBE299FC3352584CADA79726D8F039E7885508A897B9C54EE4478568168820DB7FFD82CBD0191FAB477199AC0FFF615475AA96E28980888B34A1E2C76115CDA09C2E1AF83FD7004DBD14AFA76773F755ACD40358A774045B09075703C2C08537C9E09727E23902CC453965CA74F9CDB865A02E228BE92850F078596F64841D093BC7BB9354E50FBFB31FD463762B800B88C6A691F22A815B46EDF848C174108DD7435F178B90690D5C8B0C430935C69C6A4451629958614CF00F5FCA7E88C08230E142C26C991F5782C1BB84A6C8750EE00348582F12365A761150B79489BEF53BE9BABB468A7F72F65B2D70068D5313D5011016CAA97C6961C554CE6419204AD28A7E5A7E807333DB1C759B6A546B087E9704B63A573752A0ABB7C702548CBF15100F3A6A807C016687C05058F76A42BAB1BE88C12FD574F4FBC051DA21234806FC279D122A4DD879175DC24E20570B435A14FAB908CFA5AA91A009164530417655799C0B379A10E7592EECA96F7AA84F9D718B95F595BF5887F2135D2BB106D599AAB77C5DFD5B4733506450923815F451EAEA6DA2FB0EF3C7AE6EB12543F8429B7B1BA00C5B05585964D334741AAAB7B2C787778709D2CBD9D1C42A061398939869FC0B21C37FA1A146965066C50889C5798B3EAACC0B5C6D7721CEDEC86BDF67A17BA37666A4226BE80EFEDC5262373117777B6995262F795735872B5CD4B52A59677B3ABFA302BA89E61DF76866CBF5C8F97C2620258570735C9B70265CB9AC98445416A6A1AA8252F89667EFE277C968101C58ABEC009902497D932C0D33F52C69221F96EB589E231877837491757BF2B05BE03C909AF3B780B8088F75610A02C45CE28097AAB34FE19CF364A865D77A9D402501C843684C1F7825C20BA3ABAF711172024FE6CB6F58591E4EEC4E40CC0CA891725927C56A55CAF5B1CC61F510ACCAA54371085FC9B03C169293E16FE74735648B4E752847CEF130A3FC031BE4C04EEC8614A7749FB7B41C2C69D2D23D73F205575655BD6A0F3FE19CF333A0F28A9BFE69B0DA112771EB2BBC30586AB0BC0176A400345986104F0832CE81A60E198B3180840A8BC528B0960CD2F26564D3797BE64DFD602BEAD0C94E1904773BCCD0162F0A17B3B4868B5CF57FCAD264E3F339C6E240C2861C6B6A0429616D88F5B41E991491652852441817033DD8F95A4B7C40EC5A74781A761D8ABEDA618D53D2CD86989AFCC54E5ED2CE26F8244E0247052364B0A11F42DC14B6B8A72ECC76754208560A479C2C104941404E22C800B0BB52E26449238235F113A23C4E46AAA4E54B6B7CD2A3802A2EBC3799B9556FB0164500C14CEC67BD36C31971291EE891134B9CB3E2DC01EF15143AC04EA1F41D9084B7B2EB91F96B7C9A97774A044E037285C820601E424F761BCCC712172B774FFB900EFF1158D6EBBE13775F27720FADB93CD98111E4E2788D86C0151B1458344025580C509738E490874B773849308B8D36C649373F9147781D58C31938B923218BC2E85F4C9B1233BCAE99D35C67DB3A85647801260409E6CF45924E4DA141B6C3A65B857A3D3DD5F476EF377E54214616593BC8CD4D05915F4F4FB9A98223663407787254 +dk: 0D1B18A4D52F6BB6367CB50F0005BC6D9CC52E0872E86AB6B0B9132BA90A309B524E7B3EF93B696D9149CC17BF57A1A1F8371004127AA97A79E4B55CCD079470B04FF38833BBD732FE937B4877C3D643B5E489AC312271A2F9AE7B665FEB0AB13829696EF532F43CA2A848BE9787A873A4646CE5CABA271D82CBAEEFF095F153C7DD66C4484384D44663B1E75CCA0B479DEC62D7CCC97C5495D5CB3A1FA0C6DF6309A4E1B443051B00135166D77433C30B17A68B1723B83129B72BB28C61BC561FC25EEBB53E5E98C86B3B3D852B60D75402D636470E0171FC44716CCC4B9931178FD17B80A4895431492BBB1C98317E45C03D787A30A7C6530B814207C64CA1807D92530BF1EBB232460B68D52021A03A0C603AB6497F16267640316A8E5712DBAC68F3E1528A5B1E37D00856A32083E51958A265532B51DBEB02EB7820430C2974716582E92542E29255863DF251419777142691384C876263A544CE03039710B5A407B8BD7428307A739BA4B84E762C643A383B7A3CF266A1B6C7043D040B0A475B2A6402DDE1AAC192321D910553E2CC8A18CDB9D9B27C5CA0AD272F3145120A266C443A484E829DF079C98DA9CD25F4AA20B29F12A79BE03C7E86F4C3EE277C050831D8135DE1C3227627A732C1C337D047524BB0EB487EF75CA0365520C3E67324C5B2AF45A768D3986A395BFC7A65E673AA41057C8F698436C35D655A9D9FB54F441C1BF54A57E73B335D7B40EC992B4AEC0978267CA30387618C76BDB843A5461578C6938BEAAA0F8719E18469D7F76EA6FC5D73C59399689C1BAA8BA4812111EBBA47CAAD17D050B1E506247050FB62C530D0A1BCEB6D1C45C1DF048F0B14511A709D91F62BA10B4FB42591596456E2B4271FE817914B54DA4181ED7A9BCCC84DDF6614716AA561D99267DC1F8D596AF769482DE440F32B72A7B60DCB0035E94588C02CA9E8628D4A4B071007703E67AC0D87B2CD21B4502782A8BA6E201B6497C80A103003EC360374915E57154771C59ED6CA2FF272393DDC9449038B96B77E0E6C50EFCC7837996EBB3B4F1CD0079C474D9B2172E4947F2ADB7BB947090539AA43B48079133FCCBB92ED878ED76364F31CC094B68FDC371FA8DA78931C326F26961BB20F0DE742039A547C6C79B84B93CBC238C2252AFD504EDFDC14E9FCBF8051A43C75CC28897AD318CFFBE4B70A01373B324B4C732DAF4BA2F3019B5722ABB9D452AE092B89A5CCF7E8776C3222F03C50643B3FC3F8937D437DB19A10EB771FB755CD4939B73A24CFCD01BF6879A5905125C2EBC4903B8F3E91906ED479BA8B83DBC1A21BD6A8222A717FB6398AF89312170362D0486E0969F8E9A417B0C7C7069D8A41A8D9D3C3BEC2847ABC722D3851605C8671C23E0E82A96C1B1AC82C3A1DD758A0D63394F26F20BB6A6669883A87A1AB73AF02549F032A6C51E803DDB131EC47524DA9A283C39EE79AAFC78C569B07B403A89A5AFCAC7EB4400A6A8E6397B3BD49318AA5C37E13757B7145DCEC210C92AFC0186902FA74A604B7DE321488B357A8D9904913335E5A7CBE838E43309DE6C90264803F32338F92B6BAF7D89A112554F23C4A64FAA671D24201C61D8DA67D83AB37E25982E74A4568457E0C7727A53682E50CBF74082F01C9892F60B9DC57C79A82123703A8375C7EFBE299FC3352584CADA79726D8F039E7885508A897B9C54EE4478568168820DB7FFD82CBD0191FAB477199AC0FFF615475AA96E28980888B34A1E2C76115CDA09C2E1AF83FD7004DBD14AFA76773F755ACD40358A774045B09075703C2C08537C9E09727E23902CC453965CA74F9CDB865A02E228BE92850F078596F64841D093BC7BB9354E50FBFB31FD463762B800B88C6A691F22A815B46EDF848C174108DD7435F178B90690D5C8B0C430935C69C6A4451629958614CF00F5FCA7E88C08230E142C26C991F5782C1BB84A6C8750EE00348582F12365A761150B79489BEF53BE9BABB468A7F72F65B2D70068D5313D5011016CAA97C6961C554CE6419204AD28A7E5A7E807333DB1C759B6A546B087E9704B63A573752A0ABB7C702548CBF15100F3A6A807C016687C05058F76A42BAB1BE88C12FD574F4FBC051DA21234806FC279D122A4DD879175DC24E20570B435A14FAB908CFA5AA91A009164530417655799C0B379A10E7592EECA96F7AA84F9D718B95F595BF5887F2135D2BB106D599AAB77C5DFD5B4733506450923815F451EAEA6DA2FB0EF3C7AE6EB12543F8429B7B1BA00C5B05585964D334741AAAB7B2C787778709D2CBD9D1C42A061398939869FC0B21C37FA1A146965066C50889C5798B3EAACC0B5C6D7721CEDEC86BDF67A17BA37666A4226BE80EFEDC5262373117777B6995262F795735872B5CD4B52A59677B3ABFA302BA89E61DF76866CBF5C8F97C2620258570735C9B70265CB9AC98445416A6A1AA8252F89667EFE277C968101C58ABEC009902497D932C0D33F52C69221F96EB589E231877837491757BF2B05BE03C909AF3B780B8088F75610A02C45CE28097AAB34FE19CF364A865D77A9D402501C843684C1F7825C20BA3ABAF711172024FE6CB6F58591E4EEC4E40CC0CA891725927C56A55CAF5B1CC61F510ACCAA54371085FC9B03C169293E16FE74735648B4E752847CEF130A3FC031BE4C04EEC8614A7749FB7B41C2C69D2D23D73F205575655BD6A0F3FE19CF333A0F28A9BFE69B0DA112771EB2BBC30586AB0BC0176A400345986104F0832CE81A60E198B3180840A8BC528B0960CD2F26564D3797BE64DFD602BEAD0C94E1904773BCCD0162F0A17B3B4868B5CF57FCAD264E3F339C6E240C2861C6B6A0429616D88F5B41E991491652852441817033DD8F95A4B7C40EC5A74781A761D8ABEDA618D53D2CD86989AFCC54E5ED2CE26F8244E0247052364B0A11F42DC14B6B8A72ECC76754208560A479C2C104941404E22C800B0BB52E26449238235F113A23C4E46AAA4E54B6B7CD2A3802A2EBC3799B9556FB0164500C14CEC67BD36C31971291EE891134B9CB3E2DC01EF15143AC04EA1F41D9084B7B2EB91F96B7C9A97774A044E037285C820601E424F761BCCC712172B774FFB900EFF1158D6EBBE13775F27720FADB93CD98111E4E2788D86C0151B1458344025580C509738E490874B773849308B8D36C649373F9147781D58C31938B923218BC2E85F4C9B1233BCAE99D35C67DB3A85647801260409E6CF45924E4DA141B6C3A65B857A3D3DD5F476EF377E54214616593BC8CD4D05915F4F4FB9A982236634077872549E2FE7DD646C145484E163D6C36DC6EA5D802A0EEE6ADAC932C20FDAABB8BDD1EAE318341D06E0801C0CA4B873520C714740AD017FE5A158D3BD40960D907AB7 + +z: EF38264520685080F52975BC957C5FB609FB0E1BD06D26F572CC5425CAE7DE5C +d: CE2CACEBD54AF1B4E71588DE9F22A6AF2C2E2AD7FD66B9FEC0DF19182E7F57EC +ek: 3F476A07BA0E59113595E59410B41C61CC5D509895725A7010E20C83CA906EA13C1C58A604F3A2590727D3538ADB2754B879A3F2640C929388DF38A559108A5519B221E3A2DA515EC34B7CDFD704A04C18DB604CCDB2705CF273EFD4B464D4A3A9773FBBD82840C002D8529BE9377009F4558BC747AD33BE9DB2C290EBBE06972544A827BAC51C131684FA3C0111360F59C72E5D1660269672389748E2B8546E648DA50BB8243B832C150ABC1277B4F7A350028EBEA582202917B8247E4A054C84D31B7BC97837C5117D796655A098C1D26BCD6C506DA164F362CD3B231C089371E711890B795B2DB0C5E916A3A169060969001BD88AF165021FBC9B1D649F9A740CC48AA2EE0348D46394C48A776C040D18D867F3506962E4B619C21DB56C9B3042ABD1B78BA814064979C643E6CEB8025B4289BC1716C6E07873B52C545A9488102200E2877C24806E15F790FF15C9677882EAC857C620297B9B9155044D9C26626F6B97FF8491C0FA33742C785DFB3D401BC0B8C50D17D857A13C4918BAB9BDF5BC8695AE1C581334559E4F83B076CA492DE0A9D97409DD676B051C7C97E9655E2BCFC0E88DDB85480F1A5FE60C7E5A002BD33B0F13F7B4897A9B2D3B140468B9114BA041D952B08B340D2B3B970BA44738BDDD3CCFB3039F7C04C0264875C9B0B5B05115C4749B29DB6BD801328DF89307307F6689A43F72C83940B3C7D72BA35B812C660DF39A329867A9727119BD9A379C6C39522B669B461F7C6A5383C23289B4C065862DFD430E7D9B4385401CD870228EE1828C9660F1CC2F9DB63E5318A97FA8AD4B693505B859C5FA86816473080C4AE6C297767A210D355A4DE59AF60844227781BF7B3B09C624C8587B0C2A200BA1196F5C84B99630A03B07C86A1BA50C002E523C8DC498BB89A4DE17CC8BD2A1DE3250E282961C956C6B197904C1269080280E2CC636112CCFE88195536E52D84AC33332C7612A4FDAB8BBFBADA5149E05F1CCBF28C706E5B037F65C7EA47EF5E1792F90B7BA4C01EA027D54AC44C60373EC931BB5E5772AEC45581C613D1497D227C0F65470C05187FF214593B44EE8CB18BFF8195365BC56B3608AD6B228E755D8F52449E7A15E81A26E372E1DC19DED021088B8A2247A33E0C1857C22CAC798575A7ACDBB09B4A018084293CB2E766CB2A8C5D1845B0B878F74BCC41667AD93137B66F352453051EC360559402CED1A1A73EB9D45A97589E05A5C991082F3498D1A75708A3FE582B0EE3B95785C73F7679B374095E1EB47567C41E630A971D60C7A6B9A02C372A9A56B0206144DA6556EF37DACF9002CDCA7A3DAB5319259E06B7F5473643E975BB93B079A451C5AA87CC0B8ABCEE48BC1448482F9769BB27EBCE597214AA73CF8734B9C6C3E79A53FD83F120C642A690C8220008D834DDCB99DF152C8456C817E106717B5CAF96262F2CB3D33892B1506C18D25B065C0CA1017BA4D466D0AC849A112C42E218C7978A14F362BCAEBCA9A5602F1C96AAD325C9BDCB6420B76926157C02A4CAA659134908EB024CC88387FF64317354B87D7383A7317643D71713DA3B25F3B939B060B6BA0CE5838697BDA102310AC67A1080B0C11C4FBB44701CAF7A360730F6EDECDE8635ABC55FAD14FF51E2A271F7D44190ED0D0BA95131BE7DAB95F +dk: 9F487527A4789D287401760DE02688DE23B049C0BB20DC05AC651478A591D4178C7E25CC578832B05B1E136BCFB28157AC8A4D75BBAE195CA628028C2BF806EFC1A132D93F40850D64445BC892CE03159E1376A1701C171AB6B18F437184C671158CAF77A9BA9B1B63EB4422011C7E0E602273D94C42820666E18313C61844C403F7127C6E47B17A41C7970CAE2BD78E8BBB353451269C13628C605295AB52F263C655831AE338B1B71AA25C195FB1096E0573CC7AEBBDE9E7751B22A74726354E88322F1BC2FDF03E65342F06C6359B672E679C25FBA03840FC53F147B9A778AE421506C09AB17242CE41735E2168044EF95EC4C4410AA284B79B5B9354C419B5A9663A7C3DFC155BC57A04AB22E7578059994D33D8C76C578C7A98B5B7351D5850BC48820A199B3411350C7DF650B9D1A3E8EA2A0C32A9E88030D4AC3C22078D4950CBBBDA707800293F487D023C6476223FA5DB85E229BEFC13B6B98561EA80C30C8BCD3A48994D255AB6A134AE25A40D4B719BE2BD4FB050C477CA417406FE9A3197495CAC610D6E861CC5A6CFF7BBB8BF84B71701CE6BEB77F273505559752A6B96133A5776B784343797DF2C024C41A9E05ABC38688ED303C5A0553232D2721A13152E9A0154152BD561AA7C1991887912DD79235A8B6E04AA18C1A903280417E42B07DCC0310067BC40633FE441082BF78FE4859D8892A973B78C4F9623EF88C05901AB6C1A039C494CCC4B542474C4B369386842726F13C62E72339A37B472B538FC881711CBBC32A88D72FC93C0E2A8362C7AD8D236C2EA6724616040D799440228EAF306B655754DF78FE941315D419342B426CB273FC4604245459367F30A6A071C4C73718ED1019B1BAA65F273D665CFE79A8967A60367F470BC74C7881A516487BB1A4B4FC38AC6CC21CFEE071CB67119D54A8C077BCBA3E3103EF8724CBA5406519122EB9884F645E7248FA64489FD9763459275BD80787681433C1219C5B31DE587487FD10112274C196A4AAC7794F28A0DE98A8852F37E96A0C0FBCB5CA3B8A33678C71E469B0BE1B7D134100D8A4DA009503F800A56714D06D6BF5ED7A1D1AC8ABA3B458FDB6DAFC28EDE9CC7744A7B3353CD36569A7DF2CC0A4726E5B8AA01093A9B7994B9473E12F346B992C718E825E8F1B05404433B20AE2B464CAC95BD0833C313D96BA607C09998929776A5DEB17D259B4D14E6C1616914B07CBEE1000D11BAA276F64663F23D5CE670C01AB6BBBC9A5BEAA07994099250A54BE9A164EC67174B8C83E7115A72756164491D233A0B38239A90ABD7DB1DD0EBAC93327574DA1B242B4B98B794B8B77E5C9B684F618111EC8A259279A867066B43C4D4540C92FC5E764276A1DA8AFA378F3287C7EDA09A8FD41A8495566E5B1C8C4260EF96B123160221308E97E23F7D6B281EF94F5315CE86F8768FA2270E8953F1851E20A790F0F60ECB03AA414600B7575109FC1632FAA73E173987FBC2EB3BC94B7BB2BEA78ECA17AAA9416CD2905845DC699236517F3A45B06975EC19544C4792E9248C1FC59709C460E907031F831326867FBBE55CB32627822187D93740C2DA9AAA8606FE5979D340B97707144BD437C70C768D292CDA79C23F476A07BA0E59113595E59410B41C61CC5D509895725A7010E20C83CA906EA13C1C58A604F3A2590727D3538ADB2754B879A3F2640C929388DF38A559108A5519B221E3A2DA515EC34B7CDFD704A04C18DB604CCDB2705CF273EFD4B464D4A3A9773FBBD82840C002D8529BE9377009F4558BC747AD33BE9DB2C290EBBE06972544A827BAC51C131684FA3C0111360F59C72E5D1660269672389748E2B8546E648DA50BB8243B832C150ABC1277B4F7A350028EBEA582202917B8247E4A054C84D31B7BC97837C5117D796655A098C1D26BCD6C506DA164F362CD3B231C089371E711890B795B2DB0C5E916A3A169060969001BD88AF165021FBC9B1D649F9A740CC48AA2EE0348D46394C48A776C040D18D867F3506962E4B619C21DB56C9B3042ABD1B78BA814064979C643E6CEB8025B4289BC1716C6E07873B52C545A9488102200E2877C24806E15F790FF15C9677882EAC857C620297B9B9155044D9C26626F6B97FF8491C0FA33742C785DFB3D401BC0B8C50D17D857A13C4918BAB9BDF5BC8695AE1C581334559E4F83B076CA492DE0A9D97409DD676B051C7C97E9655E2BCFC0E88DDB85480F1A5FE60C7E5A002BD33B0F13F7B4897A9B2D3B140468B9114BA041D952B08B340D2B3B970BA44738BDDD3CCFB3039F7C04C0264875C9B0B5B05115C4749B29DB6BD801328DF89307307F6689A43F72C83940B3C7D72BA35B812C660DF39A329867A9727119BD9A379C6C39522B669B461F7C6A5383C23289B4C065862DFD430E7D9B4385401CD870228EE1828C9660F1CC2F9DB63E5318A97FA8AD4B693505B859C5FA86816473080C4AE6C297767A210D355A4DE59AF60844227781BF7B3B09C624C8587B0C2A200BA1196F5C84B99630A03B07C86A1BA50C002E523C8DC498BB89A4DE17CC8BD2A1DE3250E282961C956C6B197904C1269080280E2CC636112CCFE88195536E52D84AC33332C7612A4FDAB8BBFBADA5149E05F1CCBF28C706E5B037F65C7EA47EF5E1792F90B7BA4C01EA027D54AC44C60373EC931BB5E5772AEC45581C613D1497D227C0F65470C05187FF214593B44EE8CB18BFF8195365BC56B3608AD6B228E755D8F52449E7A15E81A26E372E1DC19DED021088B8A2247A33E0C1857C22CAC798575A7ACDBB09B4A018084293CB2E766CB2A8C5D1845B0B878F74BCC41667AD93137B66F352453051EC360559402CED1A1A73EB9D45A97589E05A5C991082F3498D1A75708A3FE582B0EE3B95785C73F7679B374095E1EB47567C41E630A971D60C7A6B9A02C372A9A56B0206144DA6556EF37DACF9002CDCA7A3DAB5319259E06B7F5473643E975BB93B079A451C5AA87CC0B8ABCEE48BC1448482F9769BB27EBCE597214AA73CF8734B9C6C3E79A53FD83F120C642A690C8220008D834DDCB99DF152C8456C817E106717B5CAF96262F2CB3D33892B1506C18D25B065C0CA1017BA4D466D0AC849A112C42E218C7978A14F362BCAEBCA9A5602F1C96AAD325C9BDCB6420B76926157C02A4CAA659134908EB024CC88387FF64317354B87D7383A7317643D71713DA3B25F3B939B060B6BA0CE5838697BDA102310AC67A1080B0C11C4FBB44701CAF7A360730F6EDECDE8635ABC55FAD14FF51E2A271F7D44190ED0D0BA95131BE7DAB95FA5A66716D011EEDF9E6A541F9438F8309660657EAFFCDB01A172998E56D9A60BEF38264520685080F52975BC957C5FB609FB0E1BD06D26F572CC5425CAE7DE5C + +z: 17E5AE70771674BE8903CC21B3A90248D993C261B6CEEF2C747873D113869B55 +d: 7E03015C5D55FD9888E730C1E60F90C5F6C2E3B1E8C7C08D869F0C1D15B540ED +ek: BE62BD6BECB1FBA42DCEB479C8B8AF9D740F272661045437E6D0C13BE05D87821365509758B075C7D15A421876CF83C9BA1458F3C2B85002238DA64ADCD77FE7F1B33F3798B6C87609708DDD1C4F41AB9781A3BEAE2910D3D0A2496927C4907139CBA8D5B791FEDA3CD472538D9AC0FB9895DF079AF86B439096783D2BC6E967C211B3969B876CC0322E59C80A761495F50567276349EA736A43E5BAF638971C355FA4D3621FC60BEF5408067B5968E56DB7F2A2438233EED3AB2792443618A535389E3E7A3A1C061A8AC72423508C2747CBA968B7220911D0324522CAAFBBA85B5D1A830FBB0FA20CCF10F78656B512B34B28815C23DF718AD044937BD73198798858E41FE5AC16EEF5AC6E234DE5D7AA5AF49ED0BBCFA35843C7753613988707C2025F8654A9C8A37B4320BFD243BF8B1143B2644A715910C46DA9C88AB8F033EA233DAF3660F8630ECE308DE44B4699D6CEAF275065BA4DCA584026D261F753CCD0A860F705201B64B32F159C86558E633312DB15C2C3164889F49F181435A1877760C50206816F3502CDC3229107F92355467ECA127B51912EFBC911C5591DEBECA2AA6015274382BA5734F64B08E1160A4CDCA78CF722A1A31A590B5E90185AF809CD39A56A0D945BCDF0769E923C45E52DE4B45E2E22093E856FAD9B9C00641970B31BC0481D91884782D08979AA02484CAA2957CC6CCC4434EB5C814973B7E3A284DBAB2EC068A5DC047336CAD2990D37231604C584E05C689E30CDCD7668BC764E3D96184E7C45D6D988AA9B03CD3275747B2E1F0C68CB76326F263EBB910366D6C4A94A8252F6BA0F5269531188811A7286D6A2AFA3158F8243B7695805B8BDA1322B1A30049C684C6DCB574C20A9574BA78677B1135135ACF200A22749115C7E1BFB6A1614A7BCF612562A3CF6702742F586B6F55169C5AE1D14621074034C109518C86EBF191881D4B692E4027BC9C195E20F54A36B8387845F47BF23482359D90BAAC0B24E091D6937AF4049A043529EB884189D2B6FD4B05473E3696512910E9189C1508DF56450BFCBB6E97747AFA545C64B346CCB04B6F30733A1071BB84DF18A2A762460F8E6A1D9F0AC2840474FB61FE7087818F6A53E7CC799B0508CE97D06987E24BCB4E4B559161C5F1AA628D68B129CD178CE6069236C863AF8A2480C149EE5754AC04719E01D86855201554F922167B623236B417FAC5948D182B12E8210FBE23FFFEB81AF88532F0193FD61BD82D59FE646209D39AD75831EDC605AA6485CE90023DA218CBB19AD8FA858E7A661D85A3ECD136809E70B25F166339C307C350E4D5303AC844257872A2845A7F6CAB996918AFEC669C9A19D43F72A5862BEEA66AAB0D708C59C260DF09EC0BC2A265A311309CCD2ECCA4FEABD6176633863A71D75B0E7957266584D000A6824D467EC50421AA1369193B418072815562928D35C16227D22C821A8552ACD83A513AB683CC39D12537DC4456E1476C4ED9B4014C42A7BA6A78C9B72F3437228A918BCC6C13FCA16BD04C7B2B277AA4C2B903517FB8397598554C9C8885380B4199450A46635E7B4B338075E15DA4A3630862CDC2B811578626C5BBE0B73C0F375376708B4D8654560782F3D56064B96E318E3FAF0D63CBD17F9966EE839107DD8D6530A49F344E194B7 +dk: 4CFB54B237989DB51A1AA97F36A3B2F4337F46AA0D2C05BB1D043A5513CE6FE84A98D62251360EC740221D1B7BE04098FC37A4AD633E95332075394E1C09AF426C146BF34290F50F318B48076653E9E66E972734CC9422750202995305827736D1F03464F37F8E468886CC8ECCD74F14706AD940B1CA73257451898ADB1476D0C813A0B06648A1DBC3150DC742D4B4CAA8EC12770974F87020B80BA9AA5274E4C63B747051AEEB5A1CF310EBEA23F17035DE2B4D51C226766ABD33F9443AFB1B21563C70E431E4D579E1AB26E5F6A2792A8ECF158C53C737F0582CCF50320FF65E634B26D3F9438E94981927ABBE2899DEF3055DC8AF679569A7AAA9FA4152697454D6DC04E2B5B2A9850AD75A1B9E060F11D817152C043500CE8391C0438BA1670B19D8333881647F5ACB813CAC66AE2065A603457EF3535B7338F32759E95923C4EC84D2248A66802D92A01EFA16CA74619C771048C1111ACF6BCD1508C667CA8C471409FA9C37F4A4AE23D505B9291511C1AD7996488CF7C611B7B3CA3855CB293BDDB19B7A1614017B1953BA7A218C50236A2F7D1B3B39BA1399D251D4D6394BDC244AA9C6A6A29FE0502E9563BEEEFA6066D5A9E52000BE59CB2D246E8A559A3B7B4B2E956BE12C2A6EB4C7156324BFA17EA8DB75A844234545147AB0AF65005D7E2470D71453224399F6C51A970973CCD3339C270A5615528FF1968811C652BA8A991C13FDFCCA4CC661F7895F54BBCC07E95E6AA6178BF56FF496C1F3576A42529A69E713A44A2C9F5B7445F794996C7F944325B34574FF364357910863D99060544606A619515B7103B76E2E4869300750D4766834750FC7867A0D98470AA502193131FC7C001B49A102AA135C7224E937973CB02BA1118520833892327428FA88BDE81E3A19BB030C6EA7E6BA69B7A82F6B20F19CAA2D20507ED3C2BB0A4BF814263D17324814017F7012EFF6886257615AE2B896B045231455235C09F706235A628FDD27685C6491EC91A1C8803BC6820C9788AE919C466F836C8CF50512D149F47322398226F7B791E568BC3B6C3E52B021AF3976E9562F582734796977890AA62DE021C0431527C7C15F4AAFCA3AC6B5B61DBED8652644523029495E268890F36E145C2060B84E2C110DDC0018F2678F99726E4A981D258C14BA453E73858492E786E5B96F6C31687E702D95110A68A77E7847C9B53C181E34434C2A51FEB36DDA926F60556202371A52A04391E662A26289A80774273BC8477968D76717BBAC9D5028965C9A9D537005C6A3CADB62206E5B2E7DFA877411C6DFDB1337FC6DFBD28BE42B774746C625D41D7ABA2D29E21ED3E13D1BF5AE3A12BB25650B480C309079CFC2E1C2114B6618E9BCC0B73D5E4202C992CB375B3A8DE0A35985C235B314DDAB4C4B888B216C761224780F885241F0C1F62837B247B06B719FA4AB85E9B63A52A947972C0678DA85B2298E81414AC5B42D41E04171438A25B56AB30C61DEEA1328562079131A52805C63DA0B8A6C324D56BA6F351B6D91041772A227B17384131A30BBCB9367319721C48743C7A9786252749082623780E4828601AB15BC08A9E103C5170181B0240EB4C00B7B085ACA634626B4069703BE62BD6BECB1FBA42DCEB479C8B8AF9D740F272661045437E6D0C13BE05D87821365509758B075C7D15A421876CF83C9BA1458F3C2B85002238DA64ADCD77FE7F1B33F3798B6C87609708DDD1C4F41AB9781A3BEAE2910D3D0A2496927C4907139CBA8D5B791FEDA3CD472538D9AC0FB9895DF079AF86B439096783D2BC6E967C211B3969B876CC0322E59C80A761495F50567276349EA736A43E5BAF638971C355FA4D3621FC60BEF5408067B5968E56DB7F2A2438233EED3AB2792443618A535389E3E7A3A1C061A8AC72423508C2747CBA968B7220911D0324522CAAFBBA85B5D1A830FBB0FA20CCF10F78656B512B34B28815C23DF718AD044937BD73198798858E41FE5AC16EEF5AC6E234DE5D7AA5AF49ED0BBCFA35843C7753613988707C2025F8654A9C8A37B4320BFD243BF8B1143B2644A715910C46DA9C88AB8F033EA233DAF3660F8630ECE308DE44B4699D6CEAF275065BA4DCA584026D261F753CCD0A860F705201B64B32F159C86558E633312DB15C2C3164889F49F181435A1877760C50206816F3502CDC3229107F92355467ECA127B51912EFBC911C5591DEBECA2AA6015274382BA5734F64B08E1160A4CDCA78CF722A1A31A590B5E90185AF809CD39A56A0D945BCDF0769E923C45E52DE4B45E2E22093E856FAD9B9C00641970B31BC0481D91884782D08979AA02484CAA2957CC6CCC4434EB5C814973B7E3A284DBAB2EC068A5DC047336CAD2990D37231604C584E05C689E30CDCD7668BC764E3D96184E7C45D6D988AA9B03CD3275747B2E1F0C68CB76326F263EBB910366D6C4A94A8252F6BA0F5269531188811A7286D6A2AFA3158F8243B7695805B8BDA1322B1A30049C684C6DCB574C20A9574BA78677B1135135ACF200A22749115C7E1BFB6A1614A7BCF612562A3CF6702742F586B6F55169C5AE1D14621074034C109518C86EBF191881D4B692E4027BC9C195E20F54A36B8387845F47BF23482359D90BAAC0B24E091D6937AF4049A043529EB884189D2B6FD4B05473E3696512910E9189C1508DF56450BFCBB6E97747AFA545C64B346CCB04B6F30733A1071BB84DF18A2A762460F8E6A1D9F0AC2840474FB61FE7087818F6A53E7CC799B0508CE97D06987E24BCB4E4B559161C5F1AA628D68B129CD178CE6069236C863AF8A2480C149EE5754AC04719E01D86855201554F922167B623236B417FAC5948D182B12E8210FBE23FFFEB81AF88532F0193FD61BD82D59FE646209D39AD75831EDC605AA6485CE90023DA218CBB19AD8FA858E7A661D85A3ECD136809E70B25F166339C307C350E4D5303AC844257872A2845A7F6CAB996918AFEC669C9A19D43F72A5862BEEA66AAB0D708C59C260DF09EC0BC2A265A311309CCD2ECCA4FEABD6176633863A71D75B0E7957266584D000A6824D467EC50421AA1369193B418072815562928D35C16227D22C821A8552ACD83A513AB683CC39D12537DC4456E1476C4ED9B4014C42A7BA6A78C9B72F3437228A918BCC6C13FCA16BD04C7B2B277AA4C2B903517FB8397598554C9C8885380B4199450A46635E7B4B338075E15DA4A3630862CDC2B811578626C5BBE0B73C0F375376708B4D8654560782F3D56064B96E318E3FAF0D63CBD17F9966EE839107DD8D6530A49F344E194B76A22A9BE6B0A57E59B2F2194C4AF45A76286DAB2B0E0FE8DD37AF72ED021ACA617E5AE70771674BE8903CC21B3A90248D993C261B6CEEF2C747873D113869B55 + +z: BF83E3048B021F22DB57076A885729F95119CE63FAF51A69954BCCC51E014686 +d: 8590BFC9A6FC25EE7E6DAB4870DBF4B51A1F141B7C9E96230C0403E799BC68E0 +ek: 1CD8880468590163A4B0692D9569089E24873F9A5738826AA8A326B3D013C0F0C65B41CD81A42290F628F174006E08C3CDF9B012050C2FB083F97A7770F8A3B120972676C6944B06320A56605409E33535ECBC1B1EE6201A457309102D845CC631450C2D802FD62A793AFA82C0C9BAFFB22F8FEAC2B9680DA32A51AC1C75F7E3899FA01471F9668DEC6CD765221E765D7C714D46085CF9B9B6FCC2891EF16E246489CE87B9028A5DEC713B84594847A4554AB4A39985213D009C617C0524217AA1A51DABC9CBF689B66325517726CA3E955F742126F13B72CE936EE1CA2D913B785B4704F975C221437C6A890E354810E27B57689A8564DB22783B3D46488F8646B50C366BE75566EDC0422C2784B7A33D10588BD83A89A07519B754C1EFE901FA9001C0B120A70C0BDC8CC5342C8D20281B8A7A24FF4240FF6990BFAA3197CAA594F63EE4C75B3014AF834BC4FB8249604855597B5ACEF45304D75C035981A8A7267FB04867E9C28EDB8BA6C64BC6B70B218CC738B097FD6527915018EBF712E7044BC7B50CB9151395814278089E9A003965B4AAAE46A19E5791331876B985BF23DA8BE19CC4EF857C98C91084C1CF0441A1B212580E271FEED51C98D88D4003B909B42627860E5B788F99521CB3953371F1686A437A2F3055F8D05B7FB01BA29886DD28A7269A99DF979DD80BCA5D399AC18A919985C643D68910F9C0C5923CC3A30C25E8B9F71935503513AC28A520D194CFA7129BD2A08CE76491B886B7531ED100700EA011D09319EB66B8B44A0C09913A0E40A2B1166DF676C205E648872386A221B45A428B9BDB0C8281032D52C22028BDCC96AC2CA6470F407F98D479ADE32B1D202F1F1141C3E6453084B551554989E00BFC2A44E7F5ABC8530FC174B6FA30B3F26B5A467A39322612B1C9C3CE01CFC540CEF912058FBACCEDD8BED38AAB401B88EE7058195CBCB7D8405CB71DC5B44EA19B34C9D1652E7192D50A03136BB87CB207C9DA8ADD47AD870A3AD5DA51B5E8874F71560C5490AD7137522823B167166E89BFCDD3492AB836ABC952A5E957E7A0CA963A2C697AC1F42664D7379E6AB2361D657D47CB34236B70F9658E71FA7CB2D51BABD2C67187022380335D9014176BC52878C1CB721CFA6B63FB92C55A9A53EA635C7522A93DF572DF5B01E4C4931DD47ECC73514EB5A6085206B79209A712C60BA4B338254411D08DC7C289E00C0C3F230406B47CCF4183D97005A0687F6BA6B7A02A4E9E781C99C28DBA8A32DE80AF53075CACE4629F03872F3606228335424A1311BB58BA3309D4087F839960DC3CC63D83832F0768BD13BA41EC2ECFB03D882799D10653A4F6BAEF00709169346FB83232F9685E309E36B23DF53AC8D0996FAF14440641AD59E3991054678596849FA44436454BD535A2692922A3C57BFFDBAFE0913240EAA29646A8B5E7461C269F58F92680401B70A82529634325D128AD23A452EC9A5E52A622A524F3205B6E9130BAC6830C3B109164A65CA9091226666DEC395AA63B0899BC6C798F86F74E3E5265CABC600C193AB7D1AAD5085D2C198DE66A4BD4649A26349AE5C88FA44BAE97B91D2A17B8578942B7D61E25E367CBDC29841B0116458C97F72499AE6B74006261E57B749B66ABDF0FF71F8CCEA4ED010C6A97739D7351 +dk: F14A379CCC4C2B873E4C6366D676712F1B15BC620AAE40C3B6F31739FC2889ECCED39507D9148082B2B37C70BF95E42A98CA9B13C52A22604644839DA14B67B3BB472E376F52E20641E06E3E6104B551353FF24646C97E0D1C8A0008478158CCE8E8B6D522896A395DD8F6AACED41A58D3A9C0C0BB23C55484A9CB9BE11E9BF370BBF045505C99A08C6D8B62825D1020B3794999F63BB083BDF260714D16ABC01C741C48776067C373CBBD24558A1A4938C3369955EB0D8673C1323A243CB72781C68BB64C1E754C702C832D68F5C0A1E1A1CA04A0077955CF131B74CAA9BAE30284BA467AAC056CDB8F47B5848CC03383B275C4E62B34881E8FF504E30893A5A7C6CD9038149C0F83BB0410578A3BF42A7B7BA7CC174ED0613FEBB88E5CFC7A8E9204D30A48D4C33FC0752169874963A88A1019BE594B502FF4A341D3C59E14100AB3773AC43A92F0C901A04A1FCC256DDB73D6F97AE58ABFA75528E6CAC933E2B3A5A84F8C24137670C531E6BE9CD9758BC5BB043266A22104825845196895D6966577325769220775C9C2B480C36E6C2C18B7255BB5277CD40DEA96806858299C201FE60C5A8E590F565863DC254FE8431A3E891149D86D8CC24EF5114103D8812FE282285C3A2806432AC7629716CC5DEA1EB9576E2B9562809A0AE66790F654278C16B355E1A4087A9600382F35BB3BF9F9541B4C5A98382D47D4B569685537662D4D891B7C949FCC4A27C81CA7A594BD66AA09AADB27AD43420863C2CBFC7A5D818984E343785C863085A97B2B77E8C5054418BF43BA61E62594E7011C1B3360F278130595959FA026C14A893579363BDACE7C291065C27C73340D400747BC29458FA324CD8880DD84A09FC973487358E68BB3221C4E5C4133914A13D2C53297BA10F02327FE37C43681A028A865576410F7DA2A7FA8867D563399F59DE8569485043623A1448C613B6424CCDAE8C59CCB53F1E8B0EF4A5751367F193637B6F78E0AFC2013FCBA7FE8AB5D7C70385A6869221A8FD88E246C7DEC6C83187C9680A8654E02269CFABF7438A234037BEAA7AF8D54448035BFE7A7430E264CF3F607DB07C3EB750BBB1926D5ACC839F02612C4BE88422AD9731FACC22F6DB1213DA36ECCAA97F7B5CC94146A0C50671F7725388712B30A1E8EFBBE72F693B7652F7FE5A9C3E10415168F6F9273AF55109BC9BAFFCA3E80989BA88905C1DAB706BB77ABE38D4235C44B43515DBB6CB15813EB4B0D8EF97647B331C689AB67E3921B840FB78804F83B0DE72239EBFA22CA799BD88107C36A505DA09E9EA4C4EE5802DB5047D2FB6B9B2C499EE55CCE4347A33C7A6EB2337D3589A3D099939B0C8619AE7A2414F0698B4B06D07648B2059C8BF8583095426A0776C81D4C5D24EB5AFF450E79FA07FB7026378B1E86D6AD2BA7227475261F37A6C58AABC6447E054AAB9C61A6E19B571AA57005E8906BDB6960A425B8B95671407145837FDD9B5CF51A4E42592CDE24332673CE7D023A3E2544970AB55857A1F0200521114B8096A366417052094175B549F474173E723A2377525EEC95C0D40C94988981792A8C324B61EB381F8ACD3BA987023B2E64D29C0FF63D5134527FA8AA5199667ED2331CD8880468590163A4B0692D9569089E24873F9A5738826AA8A326B3D013C0F0C65B41CD81A42290F628F174006E08C3CDF9B012050C2FB083F97A7770F8A3B120972676C6944B06320A56605409E33535ECBC1B1EE6201A457309102D845CC631450C2D802FD62A793AFA82C0C9BAFFB22F8FEAC2B9680DA32A51AC1C75F7E3899FA01471F9668DEC6CD765221E765D7C714D46085CF9B9B6FCC2891EF16E246489CE87B9028A5DEC713B84594847A4554AB4A39985213D009C617C0524217AA1A51DABC9CBF689B66325517726CA3E955F742126F13B72CE936EE1CA2D913B785B4704F975C221437C6A890E354810E27B57689A8564DB22783B3D46488F8646B50C366BE75566EDC0422C2784B7A33D10588BD83A89A07519B754C1EFE901FA9001C0B120A70C0BDC8CC5342C8D20281B8A7A24FF4240FF6990BFAA3197CAA594F63EE4C75B3014AF834BC4FB8249604855597B5ACEF45304D75C035981A8A7267FB04867E9C28EDB8BA6C64BC6B70B218CC738B097FD6527915018EBF712E7044BC7B50CB9151395814278089E9A003965B4AAAE46A19E5791331876B985BF23DA8BE19CC4EF857C98C91084C1CF0441A1B212580E271FEED51C98D88D4003B909B42627860E5B788F99521CB3953371F1686A437A2F3055F8D05B7FB01BA29886DD28A7269A99DF979DD80BCA5D399AC18A919985C643D68910F9C0C5923CC3A30C25E8B9F71935503513AC28A520D194CFA7129BD2A08CE76491B886B7531ED100700EA011D09319EB66B8B44A0C09913A0E40A2B1166DF676C205E648872386A221B45A428B9BDB0C8281032D52C22028BDCC96AC2CA6470F407F98D479ADE32B1D202F1F1141C3E6453084B551554989E00BFC2A44E7F5ABC8530FC174B6FA30B3F26B5A467A39322612B1C9C3CE01CFC540CEF912058FBACCEDD8BED38AAB401B88EE7058195CBCB7D8405CB71DC5B44EA19B34C9D1652E7192D50A03136BB87CB207C9DA8ADD47AD870A3AD5DA51B5E8874F71560C5490AD7137522823B167166E89BFCDD3492AB836ABC952A5E957E7A0CA963A2C697AC1F42664D7379E6AB2361D657D47CB34236B70F9658E71FA7CB2D51BABD2C67187022380335D9014176BC52878C1CB721CFA6B63FB92C55A9A53EA635C7522A93DF572DF5B01E4C4931DD47ECC73514EB5A6085206B79209A712C60BA4B338254411D08DC7C289E00C0C3F230406B47CCF4183D97005A0687F6BA6B7A02A4E9E781C99C28DBA8A32DE80AF53075CACE4629F03872F3606228335424A1311BB58BA3309D4087F839960DC3CC63D83832F0768BD13BA41EC2ECFB03D882799D10653A4F6BAEF00709169346FB83232F9685E309E36B23DF53AC8D0996FAF14440641AD59E3991054678596849FA44436454BD535A2692922A3C57BFFDBAFE0913240EAA29646A8B5E7461C269F58F92680401B70A82529634325D128AD23A452EC9A5E52A622A524F3205B6E9130BAC6830C3B109164A65CA9091226666DEC395AA63B0899BC6C798F86F74E3E5265CABC600C193AB7D1AAD5085D2C198DE66A4BD4649A26349AE5C88FA44BAE97B91D2A17B8578942B7D61E25E367CBDC29841B0116458C97F72499AE6B74006261E57B749B66ABDF0FF71F8CCEA4ED010C6A97739D7351C57B9807586DB3D99C6AFFAFB04CD2551A4B1DF17FCCB8D7D94C103EE6656B14BF83E3048B021F22DB57076A885729F95119CE63FAF51A69954BCCC51E014686 + +z: F42861EFF7691614C3E8975AFB4E353F8C8C39E6F41BB637EC79BAA976D1ADC1 +d: D5FD815092620DC42A223909E387369A74AF7DCA285138CF217BC29F29C42C41 +ek: A9D674C360C5B1E36D78F66C722392F167A126F09FCC4310A9320137EBA898E786F95B9CC5D0B9114206EC66159BB3A687427D3B2298F1317ADE160EBF44CAFAA62B38871C6239C38F67CA0922C9DD952D8AA55AA6A481386771FD003A271B659F4B730B589B717635E6EB62603C5BD6C96756DB4947C5B1A71B970CD16B6D2519205C08147685B7103BB7C130B40C11CFE9C73866567175CCCDF40522C10A80140D78F9A71C714BADB1CE2732B86BD0518BF4783FAA00694208C3C2BD4BA34DEC08ADD425A0687A0D8B392702DA57504A28E9099912A8AE4A964765D35E739C1C3158330F4C21DC3A58969AAEBC788EC8177443732EAA527DC1E5009E010D8F980369FCCB48527AA27C6553393709F0B252E9346671465D33C072E352B2619175878F946488AEE3B5EE201C753244E6C85A1DE48BC994B4B1F9AB4F81B9C9F6C243C4A57BAB99781CAB1FD152A205A893F07F16431401F746B5EC790EA89C8C672EB7267EC34036F5F541C334B499DAB565387C2341C27F4904546917295B8F640CBCDF9B254502B58A669D36AA3D834793CC2A4D6578397D3A6DA893710F6A1839D8CAD7067A020108BF98415569A5C5856C5678C9A41A3075F077E6150F54B57FE91691A1C05F5022939A322CB919ACDA1236FEC9885AEB2C3A975E5BA238F5E713AA751093846915B003E624577007C7048B23E29445EE123AD3D6604D5006332CCD238A0E23020244D99A2C8A28CB58A76A69A39CC05927767ACBF892E3B6CB27231472C9189FBC1BADD18CB9A0CCB9E9CB08D0BA65C9924BCB2D88EA9739835C3B388A7B416A5BC5A27B01260D732F237474292133F0E458F33CBC3A687F149A1F8D7B08FE76A0C7C9330F8582D378BE0E2B135097CC9527A24FA3913BC3C98F04298CA86A08F6969D98C6EEDC19D6026D18D93479698A237B319B8CBC7E266DD34162FDB07C04A677C7B27E758A9D42DB0E35B4369C325C1F5639E0AA30B87433BC9C977447A2F97413E351BB98242D68E02527053A75A0CA93AB8E1E8B521F4BA09EB1B32D6797C5D7BD2AC76E81946CA48BCC787A9D35022C31F0938F710482B1A5DDF91A9024900D019AE33B182D6424D86B558109158B188C3978B5345A7D85B70B30888083C50CFAEA947258891A192B05D8589A0B7415F6945D1275B9C12DC25055B372553D21ABC7B96BD7F821B0C78D6AC3CD5BEA024720625611126220A5A467A60C268B748632C6B19403391391D649BE701B85592FF7F256937843547339E01179E2D79F9D88168528CE5FD5A819108456A789F094093E3980413A14F11B71C57BC71617CA3234008B2907447B8EF8A58B87450AD9506BB84C9E3F66BCE6CBC5D503434D406387D8CDC22A64D53786C79A90C911723D8799B3A7B9AB20672DA92572FB609AC14D57435736055B89F9851DB4B621AA42610317F15802FFB457620B4A7712212DA5725C049E1FD3670DF15ED5A945549C38DE4826BEC844500A313B41921E21AA5EF186940497462117EBD8B383520680DC2646683E0E819B2DE992A82380F400BAA20560AB7A58D2176D4885204ED705F21084390C5AAB8879214286A1F199B3949A59E11B86582B5C13080766C7E2091EA99F1352D4488C7EA1547DD87024156A9FB2DF0C77B684540084890847AA6D85 +dk: 49B061657A8EDBA51C06A38F4995CC0D68BD97C515A7576125F7961317046D3B0A21B44415B07592991570D05291AB34DCB808E57041FF249D97F471B57A8B7924BB8B699B9772360A8157CE513C58882B89F79E37287042A353A887761D73B2AA3A5185D999FD1A4609AB7FB3ACC8EA083E6DDB2A9592413CA11E7D51AD6378132AF88D977762A473A4849A303C648183D03773C610B8C07A6F741D2E887768E20FA9B749072CB64292B791731658E7297F8A584EFA2A9446911E155E0E27BD71DB8B1D52395982C40C4C65C7FCCEE20B684C2432A83579468B8A82A730305A157FF46F5C8781CD621143E31A20311803185335855116712E34498045093BAD6B80A8F332AB8C5A90025AD0B1CA6EC53401AA83DD01595540141C749687A53D775B4A691B69F6D32C275187A6CB1A4A336C341CC36CCB295C21609EAB1636EC0BB031345A3BAA345878EF43A46B82A9DBB7019658A43AA0368CAB4310103BD5589499B2C1E89A5C2A297ED707B7FAF8170FD2CAE245146929060CA5BD10D8316980C18824CDA429302B64C14385CBE36AA0DC6CB0941B204A55A710D2C68052C900C34C35A7AE7834CF5552264AA2583913348CDC79A08847ACE64024464E759AA99573BFC7B40F8CC4449379A40558B756B22410934C7969B42ACCCCC7D8231E5CA2DF5574384B9E0712C436FBC67AF74234E49B59480B0CF47C8DC31D47776BA9B000C0E80856B889FF09916CF8CE199680A45B16B1AC1438000D6472C79497014B6384AD069FA8AB1A004B518AA97066DCAC32D00893301D327008020431F2B01A4004523F0453DB14B3A84001EC3749D25473EB219AF1E0A7628BAE4A24BE7A1A5E24C3AB5D0A6661C4C1DE754755EBBC91865E8147C1D0233DEA643C4E648DBE3C50B96B898D81B4DB71CD9CD38BFFCB9E7C384EC58A7A27F29C7C5B20255149EDD02442E4CF8C8A34B73B6D36319F6FD3425BEAB4A8EB1698E03A1A344C88808FCF183AF5F6905B1B445CC9235BE74C1DB07D794BB867331EAEFB52AA165E31DB2048A62CA4D5197B3AB327281B132B0EAA18B1D8699EDCFB730B905A517036E3EC9BF40AC4F47440BFC231693025CA297B4F5198DC094066919934F32E5EA6712937CFE458A2BF916D382933A95487603B4AB303CC81BA94E467576787B7D8095B059020E6C43069745CA03C2B31229F2CE021F4D9BC38FC2886EC9570F2671872C766D40C970A0825083A01961FE97C9214533F3A8562E620A0C8B5354E8989420B4F639B323E415D8AD4732F299EFFF99A7AB47A100CB05F31C158F37FBF8B7B7F477DD3398A20F07F9BA0605AC67CE4379932D0B2E7E236882093846AC42B64806F4C3E035BCD1EBAB1D54084B63C870217B210D2CE816A35BAEA8CCF2C7FB4938FDDC320D9B81751116C4DBC2269C37413206704B631BE653BD20B7F920305F9EC8C46805E95FC504B1C33BDB5A1AD912F8D65221A784922A63578201FF3E869DDE76AFDC9068F657CD0B66E8D441DF7E642A01220F8001D6A1558F5F73F49C13F3E1BB8A9E7BFB56B677CD6AE6FE8C85C24CCD7A78790E1AD8809A8F964B43228155D2872A9B11849514035F154799202A0299C41F80D9D1A67A9D674C360C5B1E36D78F66C722392F167A126F09FCC4310A9320137EBA898E786F95B9CC5D0B9114206EC66159BB3A687427D3B2298F1317ADE160EBF44CAFAA62B38871C6239C38F67CA0922C9DD952D8AA55AA6A481386771FD003A271B659F4B730B589B717635E6EB62603C5BD6C96756DB4947C5B1A71B970CD16B6D2519205C08147685B7103BB7C130B40C11CFE9C73866567175CCCDF40522C10A80140D78F9A71C714BADB1CE2732B86BD0518BF4783FAA00694208C3C2BD4BA34DEC08ADD425A0687A0D8B392702DA57504A28E9099912A8AE4A964765D35E739C1C3158330F4C21DC3A58969AAEBC788EC8177443732EAA527DC1E5009E010D8F980369FCCB48527AA27C6553393709F0B252E9346671465D33C072E352B2619175878F946488AEE3B5EE201C753244E6C85A1DE48BC994B4B1F9AB4F81B9C9F6C243C4A57BAB99781CAB1FD152A205A893F07F16431401F746B5EC790EA89C8C672EB7267EC34036F5F541C334B499DAB565387C2341C27F4904546917295B8F640CBCDF9B254502B58A669D36AA3D834793CC2A4D6578397D3A6DA893710F6A1839D8CAD7067A020108BF98415569A5C5856C5678C9A41A3075F077E6150F54B57FE91691A1C05F5022939A322CB919ACDA1236FEC9885AEB2C3A975E5BA238F5E713AA751093846915B003E624577007C7048B23E29445EE123AD3D6604D5006332CCD238A0E23020244D99A2C8A28CB58A76A69A39CC05927767ACBF892E3B6CB27231472C9189FBC1BADD18CB9A0CCB9E9CB08D0BA65C9924BCB2D88EA9739835C3B388A7B416A5BC5A27B01260D732F237474292133F0E458F33CBC3A687F149A1F8D7B08FE76A0C7C9330F8582D378BE0E2B135097CC9527A24FA3913BC3C98F04298CA86A08F6969D98C6EEDC19D6026D18D93479698A237B319B8CBC7E266DD34162FDB07C04A677C7B27E758A9D42DB0E35B4369C325C1F5639E0AA30B87433BC9C977447A2F97413E351BB98242D68E02527053A75A0CA93AB8E1E8B521F4BA09EB1B32D6797C5D7BD2AC76E81946CA48BCC787A9D35022C31F0938F710482B1A5DDF91A9024900D019AE33B182D6424D86B558109158B188C3978B5345A7D85B70B30888083C50CFAEA947258891A192B05D8589A0B7415F6945D1275B9C12DC25055B372553D21ABC7B96BD7F821B0C78D6AC3CD5BEA024720625611126220A5A467A60C268B748632C6B19403391391D649BE701B85592FF7F256937843547339E01179E2D79F9D88168528CE5FD5A819108456A789F094093E3980413A14F11B71C57BC71617CA3234008B2907447B8EF8A58B87450AD9506BB84C9E3F66BCE6CBC5D503434D406387D8CDC22A64D53786C79A90C911723D8799B3A7B9AB20672DA92572FB609AC14D57435736055B89F9851DB4B621AA42610317F15802FFB457620B4A7712212DA5725C049E1FD3670DF15ED5A945549C38DE4826BEC844500A313B41921E21AA5EF186940497462117EBD8B383520680DC2646683E0E819B2DE992A82380F400BAA20560AB7A58D2176D4885204ED705F21084390C5AAB8879214286A1F199B3949A59E11B86582B5C13080766C7E2091EA99F1352D4488C7EA1547DD87024156A9FB2DF0C77B684540084890847AA6D85E8BEB5E40DA16CD0B6771A006BD6CC2A5BA77C278E3EDF52912210F80A5E1759F42861EFF7691614C3E8975AFB4E353F8C8C39E6F41BB637EC79BAA976D1ADC1 + +z: 4DD0E86091649A0A08EA44DAB85DF56797F8BF46222C2DBA7DEC6374B9B2268E +d: D21D5AFED9AFAA3B49FB45245B2BCA1505E4000CDC29094A3600F5CAA49A7B3A +ek: 744793A77A843520C9EB8B057FF28854193916F711902B1F8B4B9C235251FBDC8040C8A38C022557DB50CB28CC8DF99A859C2EC017C24015877D2A3572571FC783BF1E984401C11158E32A95351BE407A8AE6B5E054A33C2427F4A346761559F776671095B495074AF5CAC98D94297FB05624443CAA8151AF3A497F73203EF184CC7336650427CDFD47B10245EDDE30C3075933E431DC1B1C2A77B2073257C2AB73ABE706DE138CD54922CDB09CEFA60BA473092E43BC3E3CB951939B1C4CB2AFDCB4F8A5310FE9A790E560B25A40AC9E18D35A27238A60A126B398980BE8425C8A01B930FB336CB359F58131BBEE6AC450B8C811B2DDEA836F9D0C2C72A709E134321DCA727641A1D678A8E0CAE6BD6BBDAD8021AE3C1B6067FB1ECA42D215EC2C4297F6891567712F75047775B741713097B1271AFF026323A134DC20DEBFACE46D5B01820A9A862BA93E3AFCB5AC4C2204AF2E15787D0C857896D24DCBD6393C1FDDC12CDDA6A1F337B18D6C3CCD5283B37239A80424780399281C3FF1967B3BB6DAE499D42F511997077F38A8D63EB319342B1BC749924E467C6A2A11728826BEB52A39BA7A1A03C93C613D36A3F1F544B72A8BEC24009FDE07E677101456A2B76EC3353CB8944C339081A4B59672CD1B5446FFA6FC0B468D9FC83EBF896CE12158AFAA6812028F54B7920636784D3B3854030D05A9C19D936C6FACC5B81070CD524728A96A58A2E1207C73A4C533DDB00098141158B11DB674500781F47DB9B45F3CDE244502D377886418287C22075B2BD172606CCFA6F4914844525C113BCC7C049B3D14A2DF91B6C62E0A2EE5922DA3194DFC0C506D48ECCF5697BA31BD0839A4D3B3078CB7C2936CE1C507B0B54023585CADA6BA5657726075659DE16A6403110CE38A247CA85CE02C1DAC79FD175BCAAFA116F710516A4B73D78BFC6F9854228B6C5F035946B1F61B629F31328A65556C8F0661D58622C6021F58C1ACF154C6E78BCF563352AFB89B824513A35502F117861A34C52B1011F696A85185186BBA23B518C720763529C181D902CBBB58CFEF77CD2E72F4780979FD46126C0A4BC1965A6E070FC284B1F856852110E19C268390CA9494116EB293F1A111ABEC1AF04F706B114617F0362B3DB4B99E076287AAFB7127FE2C68904F61664D63D4FB267CE07AD5A659FB81886F8E0A9C26261A0055F48F432E9F8242C439F58B5A21EB777483B2E68B3B1118562430270340243F1E87C22CB5BE2F167DC39CF4C69B8B8E9B726256CBE605342F47E23A871BA7250BDA8997FD474B3375920522F2C511B3EA35CF459342893AA12B128CC2184E304335AC7BA04653898590A664672FE744F301651442BB341D32F36262C576A50F803B02F91105FEBCABEF7030D2A76CBEC6C2CF36283590BB44842853102D3D350801167D7A96968648C0CAB9AFD39CB7F658909283CB83CA78544929AD90069CA3E660196792A654A911CAD7C23024C90E25AA61B30A4D568C5A5C12A53565A93E910D5940EF3583856017BC25B05C4473F48584C6908C13D2B19E7A3A7992976D31A464807199AE3A6307CA55765590F6B4721632D70FA47E2C1098E36898BE3125E43C61CBB7A6C246CBA0002CF325A5D337989289BCCDA54835511DE9656287363DEE85033410AEAE1 +dk: 045AA22AEAA4A8E0C66661A183700F04025D413CCDCBE1B7CD9B839BA61671B08A859B1AECA9014CB3695B29703CD4314954C48CC19A89E106079720EF23B597FA6A833638B7A7B1E74A40C8BA7A005AA799D22DC5AA97627A037BA2623C659621EA2FF40651DAA0A95B2218CF934DB132BDE8A29F889BA084DA3EA9C8B58FD1BEF4D45EB4A2501447640C7869F21C9B031718209288E442018F63097459AFCEB75815829B16EC48FF822B1F69B6B48C3AA3C65441E60F552A154BD85A71397AB8290564F527FA8B1E84AB4EE6450EB5CA658B2120164B7D84637CC7488FFDF717F9349734E6B2F585C040065A2E910CCCA070C0070C2C215BC8060930D30D7A73A0FADA94E46257BE169B73D7A35DD43EB9B0183589AD657A429D983564031166253B4EE513AFE986E007727D75BA22F41A0AEA4939081C7CE1BEA5AA8D8DFB692AD37726E05A9DBA9D70102A1DE64479A928D9789035D4B645F088ABE8A51B06826BA64079C4AD3EC2C8A7EBC9F5EA6A0C707E88B2224DEA55FC0C39EC258088E319CA48C3F0C86AA203669F164E5FD0BA467548050CA496579BD4099D705A82BF9634995ACE60DCAC96C9115226AF2B6A9D86497DA1C49FEEE35F5639BA1A8363DF5114EA06C190179161C3C4238115DD55200BD28A03EACCAA46C7A9126B6F0CC2BFD9047D9BBF7A2043BD965F244158C7F10548FBBC39E040F040145A45B12BC90A74065BD3E34925C94FFA968BEAD241A79B6B0F1C3911C444E3958906DB8834984897CA886DC1B9D63CA43803C74C5633F003BD148A691D396C98BA81918A560542CC6435082957A70A312DAD0AC54F81903B2280BEF3638A013654D26E0D2705939A31EF39547FB80BE113A336E277E04B8B905C9DD90509C434277246916A1A0A7E66BC1C74C4719751BD8879E07AB97721C0B27BC08B69B284F2BB47E43290F2BB434C489570C22AC867F06643AB100457D336CB944B6B5A185B639A403A332FC755584A9F2EAA315C319D3099B30710B7EFAA5BBE8A3981A9B158E0C7484595AA1B7CA3F335BB38A7E5AB51F2799E0EC2049AB781514A82CA7CC5A53BCFF3029320636285902EC1D24432B5292EF7600097929D374F3485AB2AA5C8A154CC3171693DBBC4382A5E44600AC8B1646A84A47B078D06EC554A309A1FC2BB473C69EA4732B6485BE812A1004D583D9A0B9953312CAB9B014A482D8C7BD1097231D0041FF599D0E043C7CA08FD0CA71AEB977EF271EC13AF122766566BCAEAA26554F87394847C50DC2B8D3885184069B1A173D1183E68C55867E55EA78610CC3183A7F60181D1751A12107225C7156B99F86846FDF5777502A201FB583202B28EB78EEF356918D2B5B7594AE364902D45C2E8691137C98CA7B2425274068D765AFF29095ED546309C2D4CD6A5DE0571E67566DB14C386A87F15379CD1190EF02806D6B8387C87C73B805E01DB128C0A86C1013FAA7CB7D46770A0835C5343C931AB8CFDF56AE4241108C55976F127334AC3E2B52360661B61532CCB641CA043AE9B3173D0133CB0E4581748B6F1AC00BA0BAE4960376782A25F36765A1A4318D73C18781C90755C657847ED6849CE1301B11A2FD75616B4F326DAD545744793A77A843520C9EB8B057FF28854193916F711902B1F8B4B9C235251FBDC8040C8A38C022557DB50CB28CC8DF99A859C2EC017C24015877D2A3572571FC783BF1E984401C11158E32A95351BE407A8AE6B5E054A33C2427F4A346761559F776671095B495074AF5CAC98D94297FB05624443CAA8151AF3A497F73203EF184CC7336650427CDFD47B10245EDDE30C3075933E431DC1B1C2A77B2073257C2AB73ABE706DE138CD54922CDB09CEFA60BA473092E43BC3E3CB951939B1C4CB2AFDCB4F8A5310FE9A790E560B25A40AC9E18D35A27238A60A126B398980BE8425C8A01B930FB336CB359F58131BBEE6AC450B8C811B2DDEA836F9D0C2C72A709E134321DCA727641A1D678A8E0CAE6BD6BBDAD8021AE3C1B6067FB1ECA42D215EC2C4297F6891567712F75047775B741713097B1271AFF026323A134DC20DEBFACE46D5B01820A9A862BA93E3AFCB5AC4C2204AF2E15787D0C857896D24DCBD6393C1FDDC12CDDA6A1F337B18D6C3CCD5283B37239A80424780399281C3FF1967B3BB6DAE499D42F511997077F38A8D63EB319342B1BC749924E467C6A2A11728826BEB52A39BA7A1A03C93C613D36A3F1F544B72A8BEC24009FDE07E677101456A2B76EC3353CB8944C339081A4B59672CD1B5446FFA6FC0B468D9FC83EBF896CE12158AFAA6812028F54B7920636784D3B3854030D05A9C19D936C6FACC5B81070CD524728A96A58A2E1207C73A4C533DDB00098141158B11DB674500781F47DB9B45F3CDE244502D377886418287C22075B2BD172606CCFA6F4914844525C113BCC7C049B3D14A2DF91B6C62E0A2EE5922DA3194DFC0C506D48ECCF5697BA31BD0839A4D3B3078CB7C2936CE1C507B0B54023585CADA6BA5657726075659DE16A6403110CE38A247CA85CE02C1DAC79FD175BCAAFA116F710516A4B73D78BFC6F9854228B6C5F035946B1F61B629F31328A65556C8F0661D58622C6021F58C1ACF154C6E78BCF563352AFB89B824513A35502F117861A34C52B1011F696A85185186BBA23B518C720763529C181D902CBBB58CFEF77CD2E72F4780979FD46126C0A4BC1965A6E070FC284B1F856852110E19C268390CA9494116EB293F1A111ABEC1AF04F706B114617F0362B3DB4B99E076287AAFB7127FE2C68904F61664D63D4FB267CE07AD5A659FB81886F8E0A9C26261A0055F48F432E9F8242C439F58B5A21EB777483B2E68B3B1118562430270340243F1E87C22CB5BE2F167DC39CF4C69B8B8E9B726256CBE605342F47E23A871BA7250BDA8997FD474B3375920522F2C511B3EA35CF459342893AA12B128CC2184E304335AC7BA04653898590A664672FE744F301651442BB341D32F36262C576A50F803B02F91105FEBCABEF7030D2A76CBEC6C2CF36283590BB44842853102D3D350801167D7A96968648C0CAB9AFD39CB7F658909283CB83CA78544929AD90069CA3E660196792A654A911CAD7C23024C90E25AA61B30A4D568C5A5C12A53565A93E910D5940EF3583856017BC25B05C4473F48584C6908C13D2B19E7A3A7992976D31A464807199AE3A6307CA55765590F6B4721632D70FA47E2C1098E36898BE3125E43C61CBB7A6C246CBA0002CF325A5D337989289BCCDA54835511DE9656287363DEE85033410AEAE16C770D1FA4C0F5DBB660530772FCC2297F59BC9DEE338CD124F0924CF7E3762D4DD0E86091649A0A08EA44DAB85DF56797F8BF46222C2DBA7DEC6374B9B2268E + diff --git a/regress/lib/libcrypto/mlkem/mlkem_iteration_tests.c b/regress/lib/libcrypto/mlkem/mlkem_iteration_tests.c new file mode 100644 index 000000000..5a6124809 --- /dev/null +++ b/regress/lib/libcrypto/mlkem/mlkem_iteration_tests.c @@ -0,0 +1,227 @@ +/* $OpenBSD: mlkem_iteration_tests.c,v 1.2 2024/12/26 07:26:45 tb Exp $ */ +/* + * Copyright (c) 2024 Google Inc. + * Copyright (c) 2024 Bob Beck + * Copyright (c) 2024 Theo Buehler + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include + +#include "mlkem.h" + +#include "mlkem_internal.h" +#include "mlkem_tests_util.h" +#include "sha3_internal.h" + +/* + * Based on https://c2sp.org/CCTV/ML-KEM + * + * The final value has been updated to reflect the change from Kyber to ML-KEM. + * + * The deterministic RNG is a single SHAKE-128 instance with an empty input. + * (The RNG stream starts with 7f9c2ba4e88f827d616045507605853e.) + */ +const uint8_t kExpectedSeedStart[16] = { + 0x7f, 0x9c, 0x2b, 0xa4, 0xe8, 0x8f, 0x82, 0x7d, 0x61, 0x60, 0x45, + 0x50, 0x76, 0x05, 0x85, 0x3e +}; + +/* + * Filippo says: + * ML-KEM-768: f7db260e1137a742e05fe0db9525012812b004d29040a5b606aad3d134b548d3 + * but Boring believes this: + */ +const uint8_t kExpectedAdam768[32] = { + 0xf9, 0x59, 0xd1, 0x8d, 0x3d, 0x11, 0x80, 0x12, 0x14, 0x33, 0xbf, + 0x0e, 0x05, 0xf1, 0x1e, 0x79, 0x08, 0xcf, 0x9d, 0x03, 0xed, 0xc1, + 0x50, 0xb2, 0xb0, 0x7c, 0xb9, 0x0b, 0xef, 0x5b, 0xc1, 0xc1 +}; + +/* + * Filippo says: + * ML-KEM-1024: 47ac888fe61544efc0518f46094b4f8a600965fc89822acb06dc7169d24f3543 + * but Boring believes this: + */ +const uint8_t kExpectedAdam1024[32] = { + 0xe3, 0xbf, 0x82, 0xb0, 0x13, 0x30, 0x7b, 0x2e, 0x9d, 0x47, 0xdd, + 0xe7, 0x91, 0xff, 0x6d, 0xfc, 0x82, 0xe6, 0x94, 0xe6, 0x38, 0x24, + 0x04, 0xab, 0xdb, 0x94, 0x8b, 0x90, 0x8b, 0x75, 0xba, 0xd5 +}; + +struct iteration_ctx { + uint8_t *encoded_public_key; + size_t encoded_public_key_len; + uint8_t *ciphertext; + size_t ciphertext_len; + uint8_t *invalid_ciphertext; + size_t invalid_ciphertext_len; + void *priv; + void *pub; + + mlkem_encode_private_key_fn encode_private_key; + mlkem_encap_external_entropy_fn encap_external_entropy; + mlkem_generate_key_external_entropy_fn generate_key_external_entropy; + mlkem_public_from_private_fn public_from_private; + mlkem_decap_fn decap; + + const uint8_t *start; + size_t start_len; + + const uint8_t *expected; + size_t expected_len; +}; + +static int +MlkemIterativeTest(struct iteration_ctx *ctx) +{ + uint8_t shared_secret[MLKEM_SHARED_SECRET_BYTES]; + uint8_t encap_entropy[MLKEM_ENCAP_ENTROPY]; + uint8_t seed[MLKEM_SEED_BYTES] = {0}; + sha3_ctx drng, results; + uint8_t out[32]; + int i; + + shake128_init(&drng); + shake128_init(&results); + + shake_xof(&drng); + for (i = 0; i < 10000; i++) { + uint8_t *encoded_private_key = NULL; + size_t encoded_private_key_len; + + /* + * This should draw both d and z from DRNG concatenating in + * seed. + */ + shake_out(&drng, seed, sizeof(seed)); + if (i == 0) { + if (compare_data(seed, ctx->start, ctx->start_len, + "seed start") != 0) + errx(1, "compare_data"); + } + + /* generate ek as encoded_public_key */ + ctx->generate_key_external_entropy(ctx->encoded_public_key, + ctx->priv, seed); + ctx->public_from_private(ctx->pub, ctx->priv); + + /* hash in ek */ + shake_update(&results, ctx->encoded_public_key, + ctx->encoded_public_key_len); + + /* marshal priv to dk as encoded_private_key */ + if (!ctx->encode_private_key(ctx->priv, &encoded_private_key, + &encoded_private_key_len)) + errx(1, "encode private key"); + + /* hash in dk */ + shake_update(&results, encoded_private_key, + encoded_private_key_len); + + free(encoded_private_key); + + /* draw m as encap entropy from DRNG */ + shake_out(&drng, encap_entropy, sizeof(encap_entropy)); + + /* generate ct as ciphertext, k as shared_secret */ + ctx->encap_external_entropy(ctx->ciphertext, shared_secret, + ctx->pub, encap_entropy); + + /* hash in ct */ + shake_update(&results, ctx->ciphertext, ctx->ciphertext_len); + /* hash in k */ + shake_update(&results, shared_secret, sizeof(shared_secret)); + + /* draw ct as invalid_ciphertxt from DRNG */ + shake_out(&drng, ctx->invalid_ciphertext, + ctx->invalid_ciphertext_len); + + /* generate k as shared secret from invalid ciphertext */ + if (!ctx->decap(shared_secret, ctx->invalid_ciphertext, + ctx->invalid_ciphertext_len, ctx->priv)) + errx(1, "decap failed"); + + /* hash in k */ + shake_update(&results, shared_secret, sizeof(shared_secret)); + } + shake_xof(&results); + shake_out(&results, out, sizeof(out)); + + return compare_data(ctx->expected, out, sizeof(out), "final result hash"); +} + +int +main(void) +{ + uint8_t encoded_public_key768[MLKEM768_PUBLIC_KEY_BYTES]; + uint8_t ciphertext768[MLKEM768_CIPHERTEXT_BYTES]; + uint8_t invalid_ciphertext768[MLKEM768_CIPHERTEXT_BYTES]; + struct MLKEM768_private_key priv768; + struct MLKEM768_public_key pub768; + struct iteration_ctx iteration768 = { + .encoded_public_key = encoded_public_key768, + .encoded_public_key_len = sizeof(encoded_public_key768), + .ciphertext = ciphertext768, + .ciphertext_len = sizeof(ciphertext768), + .invalid_ciphertext = invalid_ciphertext768, + .invalid_ciphertext_len = sizeof(invalid_ciphertext768), + .priv = &priv768, + .pub = &pub768, + .encap_external_entropy = mlkem768_encap_external_entropy, + .encode_private_key = mlkem768_encode_private_key, + .generate_key_external_entropy = + mlkem768_generate_key_external_entropy, + .public_from_private = mlkem768_public_from_private, + .decap = mlkem768_decap, + .start = kExpectedSeedStart, + .start_len = sizeof(kExpectedSeedStart), + .expected = kExpectedAdam768, + .expected_len = sizeof(kExpectedAdam768), + }; + uint8_t encoded_public_key1024[MLKEM1024_PUBLIC_KEY_BYTES]; + uint8_t ciphertext1024[MLKEM1024_CIPHERTEXT_BYTES]; + uint8_t invalid_ciphertext1024[MLKEM1024_CIPHERTEXT_BYTES]; + struct MLKEM1024_private_key priv1024; + struct MLKEM1024_public_key pub1024; + struct iteration_ctx iteration1024 = { + .encoded_public_key = encoded_public_key1024, + .encoded_public_key_len = sizeof(encoded_public_key1024), + .ciphertext = ciphertext1024, + .ciphertext_len = sizeof(ciphertext1024), + .invalid_ciphertext = invalid_ciphertext1024, + .invalid_ciphertext_len = sizeof(invalid_ciphertext1024), + .priv = &priv1024, + .pub = &pub1024, + .encap_external_entropy = mlkem1024_encap_external_entropy, + .encode_private_key = mlkem1024_encode_private_key, + .generate_key_external_entropy = + mlkem1024_generate_key_external_entropy, + .public_from_private = mlkem1024_public_from_private, + .decap = mlkem1024_decap, + .start = kExpectedSeedStart, + .start_len = sizeof(kExpectedSeedStart), + .expected = kExpectedAdam1024, + .expected_len = sizeof(kExpectedAdam1024), + }; + int failed = 0; + + failed |= MlkemIterativeTest(&iteration768); + failed |= MlkemIterativeTest(&iteration1024); + + return failed; +} diff --git a/regress/lib/libcrypto/mlkem/mlkem_tests.c b/regress/lib/libcrypto/mlkem/mlkem_tests.c new file mode 100644 index 000000000..2801a5889 --- /dev/null +++ b/regress/lib/libcrypto/mlkem/mlkem_tests.c @@ -0,0 +1,728 @@ +/* $OpenBSD: mlkem_tests.c,v 1.2 2024/12/26 00:10:19 tb Exp $ */ +/* + * Copyright (c) 2024 Google Inc. + * Copyright (c) 2024 Theo Buehler + * Copyright (c) 2024 Bob Beck + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include +#include + +#include "bytestring.h" +#include "mlkem.h" + +#include "mlkem_internal.h" + +#include "mlkem_tests_util.h" +#include "parse_test_file.h" + +enum test_type { + TEST_TYPE_NORMAL, + TEST_TYPE_NIST, +}; + +struct decap_ctx { + struct parse *parse_ctx; + + void *private_key; + size_t private_key_len; + + mlkem_parse_private_key_fn parse_private_key; + mlkem_decap_fn decap; +}; + +enum decap_states { + DECAP_PRIVATE_KEY, + DECAP_CIPHERTEXT, + DECAP_RESULT, + DECAP_SHARED_SECRET, + N_DECAP_STATES, +}; + +static const struct line_spec decap_state_machine[] = { + [DECAP_PRIVATE_KEY] = { + .state = DECAP_PRIVATE_KEY, + .type = LINE_HEX, + .name = "private key", + .label = "private_key", + }, + [DECAP_CIPHERTEXT] = { + .state = DECAP_CIPHERTEXT, + .type = LINE_HEX, + .name = "cipher text", + .label = "ciphertext", + }, + [DECAP_RESULT] = { + .state = DECAP_RESULT, + .type = LINE_STRING_MATCH, + .name = "result", + .label = "result", + .match = "fail", + }, + [DECAP_SHARED_SECRET] = { + .state = DECAP_SHARED_SECRET, + .type = LINE_HEX, + .name = "shared secret", + .label = "shared_secret", + }, +}; + +static int +decap_init(void *ctx, void *parse_ctx) +{ + struct decap_ctx *decap = ctx; + + decap->parse_ctx = parse_ctx; + + return 1; +} + +static void +decap_finish(void *ctx) +{ + (void)ctx; +} + +static int +MlkemDecapFileTest(struct decap_ctx *decap) +{ + struct parse *p = decap->parse_ctx; + uint8_t shared_secret_buf[MLKEM_SHARED_SECRET_BYTES]; + CBS ciphertext, shared_secret, private_key; + int should_fail; + int failed = 1; + + parse_get_cbs(p, DECAP_CIPHERTEXT, &ciphertext); + parse_get_cbs(p, DECAP_SHARED_SECRET, &shared_secret); + parse_get_cbs(p, DECAP_PRIVATE_KEY, &private_key); + parse_get_int(p, DECAP_RESULT, &should_fail); + + if (!decap->parse_private_key(decap->private_key, &private_key)) { + if ((failed = !should_fail)) + parse_info(p, "parse private key"); + goto err; + } + if (!decap->decap(shared_secret_buf, + CBS_data(&ciphertext), CBS_len(&ciphertext), decap->private_key)) { + if ((failed = !should_fail)) + parse_info(p, "decap"); + goto err; + } + + failed = !parse_data_equal(p, "shared_secret", &shared_secret, + shared_secret_buf, sizeof(shared_secret_buf)); + + if (should_fail != failed) { + parse_info(p, "FAIL: should_fail %d, failed %d", + should_fail, failed); + failed = 1; + } + + err: + return failed; +} + +static int +decap_run_test_case(void *ctx) +{ + return MlkemDecapFileTest(ctx); +} + +static const struct test_parse decap_parse = { + .states = decap_state_machine, + .num_states = N_DECAP_STATES, + + .init = decap_init, + .finish = decap_finish, + + .run_test_case = decap_run_test_case, +}; + +enum nist_decap_instructions { + NIST_DECAP_DK, + N_NIST_DECAP_INSTRUCTIONS, +}; + +static const struct line_spec nist_decap_instruction_state_machine[] = { + [NIST_DECAP_DK] = { + .state = NIST_DECAP_DK, + .type = LINE_HEX, + .name = "private key (instruction [dk])", + .label = "dk", + }, +}; + +enum nist_decap_states { + NIST_DECAP_C, + NIST_DECAP_K, + N_NIST_DECAP_STATES, +}; + +static const struct line_spec nist_decap_state_machine[] = { + [NIST_DECAP_C] = { + .state = NIST_DECAP_C, + .type = LINE_HEX, + .name = "ciphertext (c)", + .label = "c", + }, + [NIST_DECAP_K] = { + .state = NIST_DECAP_K, + .type = LINE_HEX, + .name = "shared secret (k)", + .label = "k", + }, +}; + +static int +MlkemNistDecapFileTest(struct decap_ctx *decap) +{ + struct parse *p = decap->parse_ctx; + uint8_t shared_secret[MLKEM_SHARED_SECRET_BYTES]; + CBS dk, c, k; + int failed = 1; + + parse_instruction_get_cbs(p, NIST_DECAP_DK, &dk); + parse_get_cbs(p, NIST_DECAP_C, &c); + parse_get_cbs(p, NIST_DECAP_K, &k); + + if (!parse_length_equal(p, "private key", + decap->private_key_len, CBS_len(&dk))) + goto err; + if (!parse_length_equal(p, "shared secret", + MLKEM_SHARED_SECRET_BYTES, CBS_len(&k))) + goto err; + + if (!decap->parse_private_key(decap->private_key, &dk)) { + parse_info(p, "parse private key"); + goto err; + } + if (!decap->decap(shared_secret, CBS_data(&c), CBS_len(&c), + decap->private_key)) { + parse_info(p, "decap"); + goto err; + } + + failed = !parse_data_equal(p, "shared secret", &k, + shared_secret, MLKEM_SHARED_SECRET_BYTES); + + err: + return failed; +} + +static int +nist_decap_run_test_case(void *ctx) +{ + return MlkemNistDecapFileTest(ctx); +} + +static const struct test_parse nist_decap_parse = { + .instructions = nist_decap_instruction_state_machine, + .num_instructions = N_NIST_DECAP_INSTRUCTIONS, + + .states = nist_decap_state_machine, + .num_states = N_NIST_DECAP_STATES, + + .init = decap_init, + .finish = decap_finish, + + .run_test_case = nist_decap_run_test_case, +}; + +static int +mlkem_decap_tests(const char *fn, size_t size, enum test_type test_type) +{ + struct MLKEM768_private_key private_key768; + struct decap_ctx decap768 = { + .private_key = &private_key768, + .private_key_len = MLKEM768_PRIVATE_KEY_BYTES, + + .parse_private_key = mlkem768_parse_private_key, + .decap = mlkem768_decap, + }; + struct MLKEM1024_private_key private_key1024; + struct decap_ctx decap1024 = { + .private_key = &private_key1024, + .private_key_len = MLKEM1024_PRIVATE_KEY_BYTES, + + .parse_private_key = mlkem1024_parse_private_key, + .decap = mlkem1024_decap, + }; + + if (size == 768 && test_type == TEST_TYPE_NORMAL) + return parse_test_file(fn, &decap_parse, &decap768); + if (size == 768 && test_type == TEST_TYPE_NIST) + return parse_test_file(fn, &nist_decap_parse, &decap768); + if (size == 1024 && test_type == TEST_TYPE_NORMAL) + return parse_test_file(fn, &decap_parse, &decap1024); + if (size == 1024 && test_type == TEST_TYPE_NIST) + return parse_test_file(fn, &nist_decap_parse, &decap1024); + + errx(1, "unknown decap test: size %zu, type %d", size, test_type); +} + +struct encap_ctx { + struct parse *parse_ctx; + + void *public_key; + uint8_t *ciphertext; + size_t ciphertext_len; + + mlkem_parse_public_key_fn parse_public_key; + mlkem_encap_external_entropy_fn encap_external_entropy; +}; + +enum encap_states { + ENCAP_ENTROPY, + ENCAP_PUBLIC_KEY, + ENCAP_RESULT, + ENCAP_CIPHERTEXT, + ENCAP_SHARED_SECRET, + N_ENCAP_STATES, +}; + +static const struct line_spec encap_state_machine[] = { + [ENCAP_ENTROPY] = { + .state = ENCAP_ENTROPY, + .type = LINE_HEX, + .name = "entropy", + .label = "entropy", + }, + [ENCAP_PUBLIC_KEY] = { + .state = ENCAP_PUBLIC_KEY, + .type = LINE_HEX, + .name = "public key", + .label = "public_key", + }, + [ENCAP_RESULT] = { + .state = ENCAP_RESULT, + .type = LINE_STRING_MATCH, + .name = "result", + .label = "result", + .match = "fail", + }, + [ENCAP_CIPHERTEXT] = { + .state = ENCAP_CIPHERTEXT, + .type = LINE_HEX, + .name = "ciphertext", + .label = "ciphertext", + }, + [ENCAP_SHARED_SECRET] = { + .state = ENCAP_SHARED_SECRET, + .type = LINE_HEX, + .name = "shared secret", + .label = "shared_secret", + }, +}; + +static int +encap_init(void *ctx, void *parse_ctx) +{ + struct encap_ctx *encap = ctx; + + encap->parse_ctx = parse_ctx; + + return 1; +} + +static void +encap_finish(void *ctx) +{ + (void)ctx; +} + +static int +MlkemEncapFileTest(struct encap_ctx *encap) +{ + struct parse *p = encap->parse_ctx; + uint8_t shared_secret_buf[MLKEM_SHARED_SECRET_BYTES]; + CBS entropy, public_key, ciphertext, shared_secret; + int should_fail; + int failed = 1; + + parse_get_cbs(p, ENCAP_ENTROPY, &entropy); + parse_get_cbs(p, ENCAP_PUBLIC_KEY, &public_key); + parse_get_cbs(p, ENCAP_CIPHERTEXT, &ciphertext); + parse_get_cbs(p, ENCAP_SHARED_SECRET, &shared_secret); + parse_get_int(p, ENCAP_RESULT, &should_fail); + + if (!encap->parse_public_key(encap->public_key, &public_key)) { + if ((failed = !should_fail)) + parse_info(p, "parse public key"); + goto err; + } + encap->encap_external_entropy(encap->ciphertext, shared_secret_buf, + encap->public_key, CBS_data(&entropy)); + + failed = !parse_data_equal(p, "shared_secret", &shared_secret, + shared_secret_buf, sizeof(shared_secret_buf)); + failed |= !parse_data_equal(p, "ciphertext", &ciphertext, + encap->ciphertext, encap->ciphertext_len); + + if (should_fail != failed) { + parse_info(p, "FAIL: should_fail %d, failed %d", + should_fail, failed); + failed = 1; + } + + err: + return failed; +} + +static int +encap_run_test_case(void *ctx) +{ + return MlkemEncapFileTest(ctx); +} + +static const struct test_parse encap_parse = { + .states = encap_state_machine, + .num_states = N_ENCAP_STATES, + + .init = encap_init, + .finish = encap_finish, + + .run_test_case = encap_run_test_case, +}; + +static int +mlkem_encap_tests(const char *fn, size_t size) +{ + struct MLKEM768_public_key public_key768; + uint8_t ciphertext768[MLKEM768_CIPHERTEXT_BYTES]; + struct encap_ctx encap768 = { + .public_key = &public_key768, + .ciphertext = ciphertext768, + .ciphertext_len = sizeof(ciphertext768), + + .parse_public_key = mlkem768_parse_public_key, + .encap_external_entropy = mlkem768_encap_external_entropy, + }; + struct MLKEM1024_public_key public_key1024; + uint8_t ciphertext1024[MLKEM1024_CIPHERTEXT_BYTES]; + struct encap_ctx encap1024 = { + .public_key = &public_key1024, + .ciphertext = ciphertext1024, + .ciphertext_len = sizeof(ciphertext1024), + + .parse_public_key = mlkem1024_parse_public_key, + .encap_external_entropy = mlkem1024_encap_external_entropy, + }; + + if (size == 768) + return parse_test_file(fn, &encap_parse, &encap768); + if (size == 1024) + return parse_test_file(fn, &encap_parse, &encap1024); + + errx(1, "unknown encap test: size %zu", size); +} + +struct keygen_ctx { + struct parse *parse_ctx; + + void *private_key; + void *encoded_public_key; + size_t encoded_public_key_len; + size_t private_key_len; + size_t public_key_len; + + mlkem_generate_key_external_entropy_fn generate_key_external_entropy; + mlkem_encode_private_key_fn encode_private_key; +}; + +enum keygen_states { + KEYGEN_SEED, + KEYGEN_PUBLIC_KEY, + KEYGEN_PRIVATE_KEY, + N_KEYGEN_STATES, +}; + +static const struct line_spec keygen_state_machine[] = { + [KEYGEN_SEED] = { + .state = KEYGEN_SEED, + .type = LINE_HEX, + .name = "seed", + .label = "seed", + }, + [KEYGEN_PUBLIC_KEY] = { + .state = KEYGEN_PUBLIC_KEY, + .type = LINE_HEX, + .name = "public key", + .label = "public_key", + }, + [KEYGEN_PRIVATE_KEY] = { + .state = KEYGEN_PRIVATE_KEY, + .type = LINE_HEX, + .name = "private key", + .label = "private_key", + }, +}; + +static int +keygen_init(void *ctx, void *parse_ctx) +{ + struct keygen_ctx *keygen = ctx; + + keygen->parse_ctx = parse_ctx; + + return 1; +} + +static void +keygen_finish(void *ctx) +{ + (void)ctx; +} + +static int +MlkemKeygenFileTest(struct keygen_ctx *keygen) +{ + struct parse *p = keygen->parse_ctx; + CBS seed, public_key, private_key; + uint8_t *encoded_private_key = NULL; + size_t encoded_private_key_len = 0; + int failed = 1; + + parse_get_cbs(p, KEYGEN_SEED, &seed); + parse_get_cbs(p, KEYGEN_PUBLIC_KEY, &public_key); + parse_get_cbs(p, KEYGEN_PRIVATE_KEY, &private_key); + + if (!parse_length_equal(p, "seed", MLKEM_SEED_BYTES, CBS_len(&seed))) + goto err; + if (!parse_length_equal(p, "public key", + keygen->public_key_len, CBS_len(&public_key))) + goto err; + if (!parse_length_equal(p, "private key", + keygen->private_key_len, CBS_len(&private_key))) + goto err; + + keygen->generate_key_external_entropy(keygen->encoded_public_key, + keygen->private_key, CBS_data(&seed)); + if (!keygen->encode_private_key(keygen->private_key, + &encoded_private_key, &encoded_private_key_len)) { + parse_info(p, "encode private key"); + goto err; + } + + failed = !parse_data_equal(p, "private key", &private_key, + encoded_private_key, encoded_private_key_len); + failed |= !parse_data_equal(p, "public key", &public_key, + keygen->encoded_public_key, keygen->encoded_public_key_len); + + err: + freezero(encoded_private_key, encoded_private_key_len); + + return failed; +} + +static int +keygen_run_test_case(void *ctx) +{ + return MlkemKeygenFileTest(ctx); +} + +static const struct test_parse keygen_parse = { + .states = keygen_state_machine, + .num_states = N_KEYGEN_STATES, + + .init = keygen_init, + .finish = keygen_finish, + + .run_test_case = keygen_run_test_case, +}; + +enum nist_keygen_states { + NIST_KEYGEN_Z, + NIST_KEYGEN_D, + NIST_KEYGEN_EK, + NIST_KEYGEN_DK, + N_NIST_KEYGEN_STATES, +}; + +static const struct line_spec nist_keygen_state_machine[] = { + [NIST_KEYGEN_Z] = { + .state = NIST_KEYGEN_Z, + .type = LINE_HEX, + .name = "seed (z)", + .label = "z", + }, + [NIST_KEYGEN_D] = { + .state = NIST_KEYGEN_D, + .type = LINE_HEX, + .name = "seed (d)", + .label = "d", + }, + [NIST_KEYGEN_EK] = { + .state = NIST_KEYGEN_EK, + .type = LINE_HEX, + .name = "public key (ek)", + .label = "ek", + }, + [NIST_KEYGEN_DK] = { + .state = NIST_KEYGEN_DK, + .type = LINE_HEX, + .name = "private key (dk)", + .label = "dk", + }, +}; + +static int +MlkemNistKeygenFileTest(struct keygen_ctx *keygen) +{ + struct parse *p = keygen->parse_ctx; + CBB seed_cbb; + CBS z, d, ek, dk; + uint8_t seed[MLKEM_SEED_BYTES]; + size_t seed_len; + uint8_t *encoded_private_key = NULL; + size_t encoded_private_key_len = 0; + int failed = 1; + + parse_get_cbs(p, NIST_KEYGEN_Z, &z); + parse_get_cbs(p, NIST_KEYGEN_D, &d); + parse_get_cbs(p, NIST_KEYGEN_EK, &ek); + parse_get_cbs(p, NIST_KEYGEN_DK, &dk); + + if (!CBB_init_fixed(&seed_cbb, seed, sizeof(seed))) + parse_errx(p, "CBB_init_fixed"); + if (!CBB_add_bytes(&seed_cbb, CBS_data(&d), CBS_len(&d))) + parse_errx(p, "CBB_add_bytes"); + if (!CBB_add_bytes(&seed_cbb, CBS_data(&z), CBS_len(&z))) + parse_errx(p, "CBB_add_bytes"); + if (!CBB_finish(&seed_cbb, NULL, &seed_len)) + parse_errx(p, "CBB_finish"); + + if (!parse_length_equal(p, "bogus z or d", MLKEM_SEED_BYTES, seed_len)) + goto err; + + keygen->generate_key_external_entropy(keygen->encoded_public_key, + keygen->private_key, seed); + if (!keygen->encode_private_key(keygen->private_key, + &encoded_private_key, &encoded_private_key_len)) { + parse_info(p, "encode private key"); + goto err; + } + + failed = !parse_data_equal(p, "public key", &ek, + keygen->encoded_public_key, keygen->encoded_public_key_len); + failed |= !parse_data_equal(p, "private key", &dk, + encoded_private_key, encoded_private_key_len); + + err: + freezero(encoded_private_key, encoded_private_key_len); + + return failed; +} + +static int +nist_keygen_run_test_case(void *ctx) +{ + return MlkemNistKeygenFileTest(ctx); +} + +static const struct test_parse nist_keygen_parse = { + .states = nist_keygen_state_machine, + .num_states = N_NIST_KEYGEN_STATES, + + .init = keygen_init, + .finish = keygen_finish, + + .run_test_case = nist_keygen_run_test_case, +}; + +static int +mlkem_keygen_tests(const char *fn, size_t size, enum test_type test_type) +{ + struct MLKEM768_private_key private_key768; + uint8_t encoded_public_key768[MLKEM768_PUBLIC_KEY_BYTES]; + struct keygen_ctx keygen768 = { + .private_key = &private_key768, + .encoded_public_key = encoded_public_key768, + .encoded_public_key_len = sizeof(encoded_public_key768), + .private_key_len = MLKEM768_PRIVATE_KEY_BYTES, + .public_key_len = MLKEM768_PUBLIC_KEY_BYTES, + .generate_key_external_entropy = + mlkem768_generate_key_external_entropy, + .encode_private_key = + mlkem768_encode_private_key, + }; + struct MLKEM1024_private_key private_key1024; + uint8_t encoded_public_key1024[MLKEM1024_PUBLIC_KEY_BYTES]; + struct keygen_ctx keygen1024 = { + .private_key = &private_key1024, + .encoded_public_key = encoded_public_key1024, + .encoded_public_key_len = sizeof(encoded_public_key1024), + .private_key_len = MLKEM1024_PRIVATE_KEY_BYTES, + .public_key_len = MLKEM1024_PUBLIC_KEY_BYTES, + + .generate_key_external_entropy = + mlkem1024_generate_key_external_entropy, + .encode_private_key = + mlkem1024_encode_private_key, + }; + + if (size == 768 && test_type == TEST_TYPE_NORMAL) + return parse_test_file(fn, &keygen_parse, &keygen768); + if (size == 768 && test_type == TEST_TYPE_NIST) + return parse_test_file(fn, &nist_keygen_parse, &keygen768); + if (size == 1024 && test_type == TEST_TYPE_NORMAL) + return parse_test_file(fn, &keygen_parse, &keygen1024); + if (size == 1024 && test_type == TEST_TYPE_NIST) + return parse_test_file(fn, &nist_keygen_parse, &keygen1024); + + errx(1, "unknown keygen test: size %zu, type %d", size, test_type); +} + +static int +run_mlkem_test(const char *test, const char *fn) +{ + if (strcmp(test, "mlkem768_decap_tests") == 0) + return mlkem_decap_tests(fn, 768, TEST_TYPE_NORMAL); + if (strcmp(test, "mlkem768_nist_decap_tests") == 0) + return mlkem_decap_tests(fn, 768, TEST_TYPE_NIST); + if (strcmp(test, "mlkem1024_decap_tests") == 0) + return mlkem_decap_tests(fn, 1024, TEST_TYPE_NORMAL); + if (strcmp(test, "mlkem1024_nist_decap_tests") == 0) + return mlkem_decap_tests(fn, 1024, TEST_TYPE_NIST); + + if (strcmp(test, "mlkem768_encap_tests") == 0) + return mlkem_encap_tests(fn, 768); + if (strcmp(test, "mlkem1024_encap_tests") == 0) + return mlkem_encap_tests(fn, 1024); + + if (strcmp(test, "mlkem768_keygen_tests") == 0) + return mlkem_keygen_tests(fn, 768, TEST_TYPE_NORMAL); + if (strcmp(test, "mlkem768_nist_keygen_tests") == 0) + return mlkem_keygen_tests(fn, 768, TEST_TYPE_NIST); + if (strcmp(test, "mlkem1024_keygen_tests") == 0) + return mlkem_keygen_tests(fn, 1024, TEST_TYPE_NORMAL); + if (strcmp(test, "mlkem1024_nist_keygen_tests") == 0) + return mlkem_keygen_tests(fn, 1024, TEST_TYPE_NIST); + + errx(1, "unknown test %s (test file %s)", test, fn); +} + +int +main(int argc, const char *argv[]) +{ + if (argc != 3) { + fprintf(stderr, "usage: mlkem_test test testfile.txt\n"); + exit(1); + } + + return run_mlkem_test(argv[1], argv[2]); +} diff --git a/regress/lib/libcrypto/mlkem/mlkem_tests_util.c b/regress/lib/libcrypto/mlkem/mlkem_tests_util.c new file mode 100644 index 000000000..1bb2ed3a8 --- /dev/null +++ b/regress/lib/libcrypto/mlkem/mlkem_tests_util.c @@ -0,0 +1,267 @@ +/* $OpenBSD: mlkem_tests_util.c,v 1.5 2024/12/26 00:04:24 tb Exp $ */ +/* + * Copyright (c) 2024 Google Inc. + * Copyright (c) 2024 Bob Beck + * Copyright (c) 2024 Theo Buehler + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include + +#include "bytestring.h" +#include "mlkem.h" + +#include "mlkem_internal.h" + +#include "mlkem_tests_util.h" + +static void +hexdump(const uint8_t *buf, size_t len, const uint8_t *compare) +{ + const char *mark = ""; + size_t i; + + for (i = 1; i <= len; i++) { + if (compare != NULL) + mark = (buf[i - 1] != compare[i - 1]) ? "*" : " "; + fprintf(stderr, " %s0x%02hhx,%s", mark, buf[i - 1], + i % 8 && i != len ? "" : "\n"); + } + fprintf(stderr, "\n"); +} + +int +compare_data(const uint8_t *want, const uint8_t *got, size_t len, const char *msg) +{ + if (memcmp(want, got, len) == 0) + return 0; + + warnx("FAIL: %s differs", msg); + fprintf(stderr, "want:\n"); + hexdump(want, len, got); + fprintf(stderr, "got:\n"); + hexdump(got, len, want); + fprintf(stderr, "\n"); + + return 1; +} + +int +mlkem768_encode_private_key(const void *private_key, uint8_t **out_buf, + size_t *out_len) +{ + CBB cbb; + int ret = 0; + + if (!CBB_init(&cbb, MLKEM768_PUBLIC_KEY_BYTES)) + goto err; + if (!MLKEM768_marshal_private_key(&cbb, private_key)) + goto err; + if (!CBB_finish(&cbb, out_buf, out_len)) + goto err; + + ret = 1; + + err: + CBB_cleanup(&cbb); + + return ret; +} + +int +mlkem768_encode_public_key(const void *public_key, uint8_t **out_buf, + size_t *out_len) +{ + CBB cbb; + int ret = 0; + + if (!CBB_init(&cbb, MLKEM768_PUBLIC_KEY_BYTES)) + goto err; + if (!MLKEM768_marshal_public_key(&cbb, public_key)) + goto err; + if (!CBB_finish(&cbb, out_buf, out_len)) + goto err; + + ret = 1; + + err: + CBB_cleanup(&cbb); + + return ret; +} + +int +mlkem1024_encode_private_key(const void *private_key, uint8_t **out_buf, + size_t *out_len) +{ + CBB cbb; + int ret = 0; + + if (!CBB_init(&cbb, MLKEM1024_PUBLIC_KEY_BYTES)) + goto err; + if (!MLKEM1024_marshal_private_key(&cbb, private_key)) + goto err; + if (!CBB_finish(&cbb, out_buf, out_len)) + goto err; + + ret = 1; + + err: + CBB_cleanup(&cbb); + + return ret; +} + +int +mlkem1024_encode_public_key(const void *public_key, uint8_t **out_buf, + size_t *out_len) +{ + CBB cbb; + int ret = 0; + + if (!CBB_init(&cbb, MLKEM1024_PUBLIC_KEY_BYTES)) + goto err; + if (!MLKEM1024_marshal_public_key(&cbb, public_key)) + goto err; + if (!CBB_finish(&cbb, out_buf, out_len)) + goto err; + + ret = 1; + + err: + CBB_cleanup(&cbb); + + return ret; +} + +int +mlkem768_decap(uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const uint8_t *ciphertext, size_t ciphertext_len, const void *private_key) +{ + return MLKEM768_decap(out_shared_secret, ciphertext, ciphertext_len, + private_key); +} + +void +mlkem768_encap(uint8_t *out_ciphertext, + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const void *public_key) +{ + MLKEM768_encap(out_ciphertext, out_shared_secret, public_key); +} + +void +mlkem768_encap_external_entropy(uint8_t *out_ciphertext, + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const void *public_key, const uint8_t entropy[MLKEM_ENCAP_ENTROPY]) +{ + MLKEM768_encap_external_entropy(out_ciphertext, out_shared_secret, + public_key, entropy); +} + +void +mlkem768_generate_key(uint8_t *out_encoded_public_key, + uint8_t optional_out_seed[MLKEM_SEED_BYTES], void *out_private_key) +{ + MLKEM768_generate_key(out_encoded_public_key, optional_out_seed, + out_private_key); +} + +void +mlkem768_generate_key_external_entropy(uint8_t *out_encoded_public_key, + void *out_private_key, const uint8_t entropy[MLKEM_SEED_BYTES]) +{ + MLKEM768_generate_key_external_entropy(out_encoded_public_key, + out_private_key, entropy); +} + +int +mlkem768_parse_private_key(void *out_private_key, CBS *private_key_cbs) +{ + return MLKEM768_parse_private_key(out_private_key, private_key_cbs); +} + +int +mlkem768_parse_public_key(void *out_public_key, CBS *public_key_cbs) +{ + return MLKEM768_parse_public_key(out_public_key, public_key_cbs); +} + +void +mlkem768_public_from_private(void *out_public_key, const void *private_key) +{ + MLKEM768_public_from_private(out_public_key, private_key); +} + +int +mlkem1024_decap(uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const uint8_t *ciphertext, size_t ciphertext_len, const void *private_key) +{ + return MLKEM1024_decap(out_shared_secret, ciphertext, ciphertext_len, + private_key); +} + +void +mlkem1024_encap(uint8_t *out_ciphertext, + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const void *public_key) +{ + MLKEM1024_encap(out_ciphertext, out_shared_secret, public_key); +} + +void +mlkem1024_encap_external_entropy(uint8_t *out_ciphertext, + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const void *public_key, const uint8_t entropy[MLKEM_ENCAP_ENTROPY]) +{ + MLKEM1024_encap_external_entropy(out_ciphertext, out_shared_secret, + public_key, entropy); +} + +void +mlkem1024_generate_key(uint8_t *out_encoded_public_key, + uint8_t optional_out_seed[MLKEM_SEED_BYTES], void *out_private_key) +{ + MLKEM1024_generate_key(out_encoded_public_key, optional_out_seed, + out_private_key); +} + +void +mlkem1024_generate_key_external_entropy(uint8_t *out_encoded_public_key, + void *out_private_key, const uint8_t entropy[MLKEM_SEED_BYTES]) +{ + MLKEM1024_generate_key_external_entropy(out_encoded_public_key, + out_private_key, entropy); +} + +int +mlkem1024_parse_private_key(void *out_private_key, CBS *private_key_cbs) +{ + return MLKEM1024_parse_private_key(out_private_key, private_key_cbs); +} + +void +mlkem1024_public_from_private(void *out_public_key, const void *private_key) +{ + MLKEM1024_public_from_private(out_public_key, private_key); +} + +int +mlkem1024_parse_public_key(void *out_public_key, CBS *public_key_cbs) +{ + return MLKEM1024_parse_public_key(out_public_key, public_key_cbs); +} diff --git a/regress/lib/libcrypto/mlkem/mlkem_tests_util.h b/regress/lib/libcrypto/mlkem/mlkem_tests_util.h new file mode 100644 index 000000000..7fbe6f76a --- /dev/null +++ b/regress/lib/libcrypto/mlkem/mlkem_tests_util.h @@ -0,0 +1,89 @@ +/* $OpenBSD: mlkem_tests_util.h,v 1.4 2024/12/26 00:04:24 tb Exp $ */ +/* + * Copyright (c) 2024 Bob Beck + * Copyright (c) 2024 Theo Buehler + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef MLKEM_TEST_UTIL_H +#define MLKEM_TEST_UTIL_H + +#include +#include + +#include "bytestring.h" + +#include "mlkem.h" +#include "mlkem_internal.h" + +int compare_data(const uint8_t *want, const uint8_t *got, size_t len, + const char *msg); + +int mlkem768_encode_private_key(const void *priv, uint8_t **out_buf, + size_t *out_len); +int mlkem768_encode_public_key(const void *pub, uint8_t **out_buf, + size_t *out_len); +int mlkem1024_encode_private_key(const void *priv, uint8_t **out_buf, + size_t *out_len); +int mlkem1024_encode_public_key(const void *pub, uint8_t **out_buf, + size_t *out_len); + +int mlkem768_decap(uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const uint8_t *ciphertext, size_t ciphertext_len, const void *priv); +void mlkem768_encap(uint8_t *out_ciphertext, + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], const void *pub); +void mlkem768_encap_external_entropy(uint8_t *out_ciphertext, + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], const void *pub, + const uint8_t entropy[MLKEM_ENCAP_ENTROPY]); +void mlkem768_generate_key(uint8_t *out_encoded_public_key, + uint8_t optional_out_seed[MLKEM_SEED_BYTES], void *out_private_key); +void mlkem768_generate_key_external_entropy(uint8_t *out_encoded_public_key, + void *out_private_key, const uint8_t entropy[MLKEM_SEED_BYTES]); +int mlkem768_parse_private_key(void *priv, CBS *private_key_cbs); +int mlkem768_parse_public_key(void *pub, CBS *in); +void mlkem768_public_from_private(void *out_public_key, const void *private_key); + +int mlkem1024_decap(uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], + const uint8_t *ciphertext, size_t ciphertext_len, const void *priv); +void mlkem1024_encap(uint8_t *out_ciphertext, + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], const void *pub); +void mlkem1024_encap_external_entropy(uint8_t *out_ciphertext, + uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES], const void *pub, + const uint8_t entropy[MLKEM_ENCAP_ENTROPY]); +void mlkem1024_generate_key(uint8_t *out_encoded_public_key, + uint8_t optional_out_seed[MLKEM_SEED_BYTES], void *out_private_key); +void mlkem1024_generate_key_external_entropy(uint8_t *out_encoded_public_key, + void *out_private_key, const uint8_t entropy[MLKEM_SEED_BYTES]); +int mlkem1024_parse_private_key(void *priv, CBS *private_key_cbs); +int mlkem1024_parse_public_key(void *pub, CBS *in); +void mlkem1024_public_from_private(void *out_public_key, const void *private_key); + +typedef int (*mlkem_encode_private_key_fn)(const void *, uint8_t **, size_t *); +typedef int (*mlkem_encode_public_key_fn)(const void *, uint8_t **, size_t *); +typedef int (*mlkem_decap_fn)(uint8_t [MLKEM_SHARED_SECRET_BYTES], + const uint8_t *, size_t, const void *); +typedef void (*mlkem_encap_fn)(uint8_t *, uint8_t [MLKEM_SHARED_SECRET_BYTES], + const void *); +typedef void (*mlkem_encap_external_entropy_fn)(uint8_t *, + uint8_t [MLKEM_SHARED_SECRET_BYTES], const void *, + const uint8_t [MLKEM_ENCAP_ENTROPY]); +typedef void (*mlkem_generate_key_fn)(uint8_t *, uint8_t *, void *); +typedef void (*mlkem_generate_key_external_entropy_fn)(uint8_t *, void *, + const uint8_t [MLKEM_SEED_BYTES]); +typedef int (*mlkem_parse_private_key_fn)(void *, CBS *); +typedef int (*mlkem_parse_public_key_fn)(void *, CBS *); +typedef void (*mlkem_public_from_private_fn)(void *out_public_key, + const void *private_key); + +#endif /* MLKEM_TEST_UTIL_H */ diff --git a/regress/lib/libcrypto/mlkem/mlkem_unittest.c b/regress/lib/libcrypto/mlkem/mlkem_unittest.c new file mode 100644 index 000000000..23b3d8b26 --- /dev/null +++ b/regress/lib/libcrypto/mlkem/mlkem_unittest.c @@ -0,0 +1,259 @@ +/* $OpenBSD: mlkem_unittest.c,v 1.6 2024/12/26 12:35:25 tb Exp $ */ +/* + * Copyright (c) 2024 Google Inc. + * Copyright (c) 2024 Bob Beck + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include +#include + +#include "bytestring.h" +#include "mlkem.h" + +#include "mlkem_tests_util.h" + +struct unittest_ctx { + void *priv; + void *pub; + void *priv2; + void *pub2; + uint8_t *encoded_public_key; + size_t encoded_public_key_len; + uint8_t *ciphertext; + size_t ciphertext_len; + mlkem_decap_fn decap; + mlkem_encap_fn encap; + mlkem_generate_key_fn generate_key; + mlkem_parse_private_key_fn parse_private_key; + mlkem_parse_public_key_fn parse_public_key; + mlkem_encode_private_key_fn encode_private_key; + mlkem_encode_public_key_fn encode_public_key; + mlkem_public_from_private_fn public_from_private; +}; + +static int +MlKemUnitTest(struct unittest_ctx *ctx) +{ + uint8_t shared_secret1[MLKEM_SHARED_SECRET_BYTES]; + uint8_t shared_secret2[MLKEM_SHARED_SECRET_BYTES]; + uint8_t first_two_bytes[2]; + uint8_t *encoded_private_key = NULL, *tmp_buf = NULL; + size_t encoded_private_key_len, tmp_buf_len; + CBS cbs; + int failed = 0; + + ctx->generate_key(ctx->encoded_public_key, NULL, ctx->priv); + + memcpy(first_two_bytes, ctx->encoded_public_key, sizeof(first_two_bytes)); + memset(ctx->encoded_public_key, 0xff, sizeof(first_two_bytes)); + + CBS_init(&cbs, ctx->encoded_public_key, ctx->encoded_public_key_len); + + /* Parsing should fail because the first coefficient is >= kPrime. */ + if (ctx->parse_public_key(ctx->pub, &cbs)) { + warnx("parse_public_key should have failed"); + failed |= 1; + } + + memcpy(ctx->encoded_public_key, first_two_bytes, sizeof(first_two_bytes)); + CBS_init(&cbs, ctx->encoded_public_key, ctx->encoded_public_key_len); + if (!ctx->parse_public_key(ctx->pub, &cbs)) { + warnx("MLKEM768_parse_public_key"); + failed |= 1; + } + + if (CBS_len(&cbs) != 0u) { + warnx("CBS_len must be 0"); + failed |= 1; + } + + if (!ctx->encode_public_key(ctx->pub, &tmp_buf, &tmp_buf_len)) { + warnx("encode_public_key"); + failed |= 1; + } + if (ctx->encoded_public_key_len != tmp_buf_len) { + warnx("encoded public key lengths differ"); + failed |= 1; + } + + if (compare_data(ctx->encoded_public_key, tmp_buf, tmp_buf_len, + "encoded public keys") != 0) { + warnx("compare_data"); + failed |= 1; + } + free(tmp_buf); + tmp_buf = NULL; + + ctx->public_from_private(ctx->pub2, ctx->priv); + if (!ctx->encode_public_key(ctx->pub2, &tmp_buf, &tmp_buf_len)) { + warnx("encode_public_key"); + failed |= 1; + } + if (ctx->encoded_public_key_len != tmp_buf_len) { + warnx("encoded public key lengths differ"); + failed |= 1; + } + + if (compare_data(ctx->encoded_public_key, tmp_buf, tmp_buf_len, + "encoded public keys") != 0) { + warnx("compare_data"); + failed |= 1; + } + free(tmp_buf); + tmp_buf = NULL; + + if (!ctx->encode_private_key(ctx->priv, &encoded_private_key, + &encoded_private_key_len)) { + warnx("mlkem768_encode_private_key"); + failed |= 1; + } + + memcpy(first_two_bytes, encoded_private_key, sizeof(first_two_bytes)); + memset(encoded_private_key, 0xff, sizeof(first_two_bytes)); + CBS_init(&cbs, encoded_private_key, encoded_private_key_len); + + /* Parsing should fail because the first coefficient is >= kPrime. */ + if (ctx->parse_private_key(ctx->priv2, &cbs)) { + warnx("MLKEM768_parse_private_key should have failed"); + failed |= 1; + } + + memcpy(encoded_private_key, first_two_bytes, sizeof(first_two_bytes)); + CBS_init(&cbs, encoded_private_key, encoded_private_key_len); + + if (!ctx->parse_private_key(ctx->priv2, &cbs)) { + warnx("MLKEM768_parse_private_key"); + failed |= 1; + } + + if (!ctx->encode_private_key(ctx->priv2, &tmp_buf, &tmp_buf_len)) { + warnx("encode_private_key"); + failed |= 1; + } + + if (encoded_private_key_len != tmp_buf_len) { + warnx("encode private key lengths differ"); + failed |= 1; + } + + if (compare_data(encoded_private_key, tmp_buf, tmp_buf_len, + "encoded private key") != 0) { + warnx("compare_data"); + failed |= 1; + } + + free(tmp_buf); + tmp_buf = NULL; + + ctx->encap(ctx->ciphertext, shared_secret1, ctx->pub); + ctx->decap(shared_secret2, ctx->ciphertext, ctx->ciphertext_len, + ctx->priv); + if (compare_data(shared_secret1, shared_secret2, MLKEM_SHARED_SECRET_BYTES, + "shared secrets with priv") != 0) { + warnx("compare_data"); + failed |= 1; + } + + ctx->decap(shared_secret2, ctx->ciphertext, ctx->ciphertext_len, + ctx->priv2); + if (compare_data(shared_secret1, shared_secret2, MLKEM_SHARED_SECRET_BYTES, + "shared secrets with priv2") != 0) { + warnx("compare_data"); + failed |= 1; + } + + free(encoded_private_key); + + return failed; +} + +static int +mlkem768_unittest(void) +{ + struct MLKEM768_private_key mlkem768_priv, mlkem768_priv2; + struct MLKEM768_public_key mlkem768_pub, mlkem768_pub2; + uint8_t mlkem768_encoded_public_key[MLKEM768_PUBLIC_KEY_BYTES]; + uint8_t mlkem768_ciphertext[MLKEM768_CIPHERTEXT_BYTES]; + struct unittest_ctx mlkem768_test = { + .priv = &mlkem768_priv, + .pub = &mlkem768_pub, + .priv2 = &mlkem768_priv2, + .pub2 = &mlkem768_pub2, + .encoded_public_key = mlkem768_encoded_public_key, + .encoded_public_key_len = sizeof(mlkem768_encoded_public_key), + .ciphertext = mlkem768_ciphertext, + .ciphertext_len = sizeof(mlkem768_ciphertext), + .decap = mlkem768_decap, + .encap = mlkem768_encap, + .generate_key = mlkem768_generate_key, + .parse_private_key = mlkem768_parse_private_key, + .parse_public_key = mlkem768_parse_public_key, + .encode_private_key = mlkem768_encode_private_key, + .encode_public_key = mlkem768_encode_public_key, + .public_from_private = mlkem768_public_from_private, + }; + + return MlKemUnitTest(&mlkem768_test); +} + +static int +mlkem1024_unittest(void) +{ + struct MLKEM1024_private_key mlkem1024_priv, mlkem1024_priv2; + struct MLKEM1024_public_key mlkem1024_pub, mlkem1024_pub2; + uint8_t mlkem1024_encoded_public_key[MLKEM1024_PUBLIC_KEY_BYTES]; + uint8_t mlkem1024_ciphertext[MLKEM1024_CIPHERTEXT_BYTES]; + struct unittest_ctx mlkem1024_test = { + .priv = &mlkem1024_priv, + .pub = &mlkem1024_pub, + .priv2 = &mlkem1024_priv2, + .pub2 = &mlkem1024_pub2, + .encoded_public_key = mlkem1024_encoded_public_key, + .encoded_public_key_len = sizeof(mlkem1024_encoded_public_key), + .ciphertext = mlkem1024_ciphertext, + .ciphertext_len = sizeof(mlkem1024_ciphertext), + .decap = mlkem1024_decap, + .encap = mlkem1024_encap, + .generate_key = mlkem1024_generate_key, + .parse_private_key = mlkem1024_parse_private_key, + .parse_public_key = mlkem1024_parse_public_key, + .encode_private_key = mlkem1024_encode_private_key, + .encode_public_key = mlkem1024_encode_public_key, + .public_from_private = mlkem1024_public_from_private, + }; + + return MlKemUnitTest(&mlkem1024_test); +} + +int +main(void) +{ + int failed = 0; + + /* + * XXX - this is split into two helper functions since having a few + * ML-KEM key blobs on the stack makes Emscripten's stack explode, + * leading to inscrutable silent failures unles ASAN is enabled. + * Go figure. + */ + + failed |= mlkem768_unittest(); + failed |= mlkem1024_unittest(); + + return failed; +} diff --git a/regress/lib/libcrypto/mlkem/parse_test_file.c b/regress/lib/libcrypto/mlkem/parse_test_file.c new file mode 100644 index 000000000..19f03439e --- /dev/null +++ b/regress/lib/libcrypto/mlkem/parse_test_file.c @@ -0,0 +1,758 @@ +/* $OpenBSD: parse_test_file.c,v 1.3 2024/12/27 11:17:48 tb Exp $ */ + +/* + * Copyright (c) 2024 Theo Buehler + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "bytestring.h" + +#include "parse_test_file.h" + +struct line_data { + uint8_t *data; + size_t data_len; + CBS cbs; + int val; +}; + +static struct line_data * +line_data_new(void) +{ + return calloc(1, sizeof(struct line_data)); +} + +static void +line_data_clear(struct line_data *ld) +{ + freezero(ld->data, ld->data_len); + explicit_bzero(ld, sizeof(*ld)); +} + +static void +line_data_free(struct line_data *ld) +{ + if (ld == NULL) + return; + line_data_clear(ld); + free(ld); +} + +static void +line_data_get_int(struct line_data *ld, int *out) +{ + *out = ld->val; +} + +static void +line_data_get_cbs(struct line_data *ld, CBS *out) +{ + CBS_dup(&ld->cbs, out); +} + +static void +line_data_set_int(struct line_data *ld, int val) +{ + ld->val = val; +} + +static int +line_data_set_from_cbb(struct line_data *ld, CBB *cbb) +{ + if (!CBB_finish(cbb, &ld->data, &ld->data_len)) + return 0; + + CBS_init(&ld->cbs, ld->data, ld->data_len); + + return 1; +} + +struct parse_state { + size_t line; + size_t test; + + size_t max; + size_t cur; + struct line_data **data; + + size_t instruction_max; + size_t instruction_cur; + struct line_data **instruction_data; + + int running_test_case; +}; + +static void +parse_state_init(struct parse_state *ps, size_t max, size_t instruction_max) +{ + size_t i; + + assert(max > 0); + + memset(ps, 0, sizeof(*ps)); + ps->test = 1; + + ps->max = max; + if ((ps->data = calloc(max, sizeof(*ps->data))) == NULL) + err(1, NULL); + for (i = 0; i < max; i++) { + if ((ps->data[i] = line_data_new()) == NULL) + err(1, NULL); + } + + if ((ps->instruction_max = instruction_max) > 0) { + if ((ps->instruction_data = calloc(instruction_max, + sizeof(*ps->instruction_data))) == NULL) + err(1, NULL); + for (i = 0; i < instruction_max; i++) + if ((ps->instruction_data[i] = line_data_new()) == NULL) + err(1, NULL); + } +} + +static void +parse_state_finish(struct parse_state *ps) +{ + size_t i; + + for (i = 0; i < ps->max; i++) + line_data_free(ps->data[i]); + free(ps->data); + + for (i = 0; i < ps->instruction_max; i++) + line_data_free(ps->instruction_data[i]); + free(ps->instruction_data); +} + +static void +parse_state_new_line(struct parse_state *ps) +{ + ps->line++; +} + +static void +parse_instruction_advance(struct parse_state *ps) +{ + assert(ps->instruction_cur < ps->instruction_max); + ps->instruction_cur++; +} + +static void +parse_state_advance(struct parse_state *ps) +{ + assert(ps->cur < ps->max); + + ps->cur++; + if ((ps->cur %= ps->max) == 0) + ps->test++; +} + +struct parse { + struct parse_state state; + + char *buf; + size_t buf_max; + CBS cbs; + + const struct test_parse *tctx; + void *ctx; + + const char *fn; + FILE *fp; +}; + +static int +parse_instructions_parsed(struct parse *p) +{ + return p->state.instruction_max == p->state.instruction_cur; +} + +static void +parse_advance(struct parse *p) +{ + if (!parse_instructions_parsed(p)) { + parse_instruction_advance(&p->state); + return; + } + parse_state_advance(&p->state); +} + +static size_t +parse_max(struct parse *p) +{ + return p->state.max; +} + +static size_t +parse_instruction_max(struct parse *p) +{ + return p->state.instruction_max; +} + +static size_t +parse_cur(struct parse *p) +{ + if (!parse_instructions_parsed(p)) { + assert(p->state.instruction_cur < p->state.instruction_max); + return p->state.instruction_cur; + } + + assert(p->state.cur < parse_max(p)); + return p->state.cur; +} + +static size_t +parse_must_run_test_case(struct parse *p) +{ + return parse_instructions_parsed(p) && parse_max(p) - parse_cur(p) == 1; +} + +static const struct line_spec * +parse_states(struct parse *p) +{ + if (!parse_instructions_parsed(p)) + return p->tctx->instructions; + return p->tctx->states; +} + +static const struct line_spec * +parse_instruction_states(struct parse *p) +{ + return p->tctx->instructions; +} + +static const struct line_spec * +parse_state(struct parse *p) +{ + return &parse_states(p)[parse_cur(p)]; +} + +static size_t +line(struct parse *p) +{ + return p->state.line; +} + +static size_t +test(struct parse *p) +{ + return p->state.test; +} + +static const char * +name(struct parse *p) +{ + if (p->state.running_test_case) + return "running test case"; + return parse_state(p)->name; +} + +static const char * +label(struct parse *p) +{ + return parse_state(p)->label; +} + +static const char * +match(struct parse *p) +{ + return parse_state(p)->match; +} + +static enum line +parse_line_type(struct parse *p) +{ + return parse_state(p)->type; +} + +static void +parse_vinfo(struct parse *p, const char *fmt, va_list ap) +{ + fprintf(stderr, "%s:%zu test #%zu (%s): ", + p->fn, line(p), test(p), name(p)); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); +} + +void +parse_info(struct parse *p, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + parse_vinfo(p, fmt, ap); + va_end(ap); +} + +void +parse_errx(struct parse *p, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + parse_vinfo(p, fmt, ap); + va_end(ap); + + exit(1); +} + +int +parse_length_equal(struct parse *p, const char *descr, size_t want, size_t got) +{ + if (want == got) + return 1; + + parse_info(p, "%s length: want %zu, got %zu", descr, want, got); + return 0; +} + +static void +hexdump(const uint8_t *buf, size_t len, const uint8_t *compare) +{ + const char *mark = "", *newline; + size_t i; + + for (i = 1; i <= len; i++) { + if (compare != NULL) + mark = (buf[i - 1] != compare[i - 1]) ? "*" : " "; + newline = i % 8 ? "" : "\n"; + fprintf(stderr, " %s0x%02x,%s", mark, buf[i - 1], newline); + } + if ((len % 8) != 0) + fprintf(stderr, "\n"); +} + +int +parse_data_equal(struct parse *p, const char *descr, CBS *want, + const uint8_t *got, size_t got_len) +{ + if (!parse_length_equal(p, descr, CBS_len(want), got_len)) + return 0; + if (CBS_mem_equal(want, got, got_len)) + return 1; + + parse_info(p, "%s differs", descr); + fprintf(stderr, "want:\n"); + hexdump(CBS_data(want), CBS_len(want), got); + fprintf(stderr, "got:\n"); + hexdump(got, got_len, CBS_data(want)); + fprintf(stderr, "\n"); + + return 0; +} + +static void +parse_line_data_clear(struct parse *p) +{ + size_t i; + + for (i = 0; i < parse_max(p); i++) + line_data_clear(p->state.data[i]); +} + +static struct line_data ** +parse_state_data(struct parse *p) +{ + if (!parse_instructions_parsed(p)) + return p->state.instruction_data; + return p->state.data; +} + +static void +parse_state_set_int(struct parse *p, int val) +{ + if (parse_line_type(p) != LINE_STRING_MATCH) + parse_errx(p, "%s: want %d, got %d", __func__, + LINE_STRING_MATCH, parse_line_type(p)); + line_data_set_int(parse_state_data(p)[parse_cur(p)], val); +} + +static void +parse_state_set_from_cbb(struct parse *p, CBB *cbb) +{ + if (parse_line_type(p) != LINE_HEX) + parse_errx(p, "%s: want %d, got %d", __func__, + LINE_HEX, parse_line_type(p)); + if (!line_data_set_from_cbb(parse_state_data(p)[parse_cur(p)], cbb)) + parse_errx(p, "line_data_set_from_cbb"); +} + +int +parse_get_int(struct parse *p, size_t idx, int *out) +{ + assert(parse_must_run_test_case(p)); + assert(idx < parse_max(p)); + assert(parse_states(p)[idx].type == LINE_STRING_MATCH); + + line_data_get_int(p->state.data[idx], out); + + return 1; +} + +int +parse_get_cbs(struct parse *p, size_t idx, CBS *out) +{ + assert(parse_must_run_test_case(p)); + assert(idx < parse_max(p)); + assert(parse_states(p)[idx].type == LINE_HEX); + + line_data_get_cbs(p->state.data[idx], out); + + return 1; +} + +int +parse_instruction_get_int(struct parse *p, size_t idx, int *out) +{ + assert(parse_must_run_test_case(p)); + assert(idx < parse_instruction_max(p)); + assert(parse_instruction_states(p)[idx].type == LINE_STRING_MATCH); + + line_data_get_int(p->state.instruction_data[idx], out); + + return 1; +} + +int +parse_instruction_get_cbs(struct parse *p, size_t idx, CBS *out) +{ + assert(parse_must_run_test_case(p)); + assert(idx < parse_instruction_max(p)); + assert(parse_instruction_states(p)[idx].type == LINE_HEX); + + line_data_get_cbs(p->state.instruction_data[idx], out); + + return 1; +} + +static void +parse_line_skip_to_end(struct parse *p) +{ + if (!CBS_skip(&p->cbs, CBS_len(&p->cbs))) + parse_errx(p, "CBS_skip"); +} + +static int +CBS_peek_bytes(CBS *cbs, CBS *out, size_t len) +{ + CBS dup; + + CBS_dup(cbs, &dup); + return CBS_get_bytes(&dup, out, len); +} + +static int +parse_peek_string_cbs(struct parse *p, const char *str) +{ + CBS cbs; + size_t len = strlen(str); + + if (!CBS_peek_bytes(&p->cbs, &cbs, len)) + parse_errx(p, "CBS_peek_bytes"); + + return CBS_mem_equal(&cbs, (const uint8_t *)str, len); +} + +static int +parse_get_string_cbs(struct parse *p, const char *str) +{ + CBS cbs; + size_t len = strlen(str); + + if (!CBS_get_bytes(&p->cbs, &cbs, len)) + parse_errx(p, "CBS_get_bytes"); + + return CBS_mem_equal(&cbs, (const uint8_t *)str, len); +} + +static int +parse_get_string_end_cbs(struct parse *p, const char *str) +{ + CBS cbs; + int equal = 1; + + CBS_init(&cbs, (const uint8_t *)str, strlen(str)); + + if (CBS_len(&p->cbs) < CBS_len(&cbs)) + parse_errx(p, "line too short to match %s", str); + + while (CBS_len(&cbs) > 0) { + uint8_t want, got; + + if (!CBS_get_last_u8(&cbs, &want)) + parse_errx(p, "CBS_get_last_u8"); + if (!CBS_get_last_u8(&p->cbs, &got)) + parse_errx(p, "CBS_get_last_u8"); + if (want != got) + equal = 0; + } + + return equal; +} + +static void +parse_check_label_matches(struct parse *p) +{ + const char *sep = ": "; + + if (!parse_get_string_cbs(p, label(p))) + parse_errx(p, "label mismatch %s", label(p)); + + /* Now we expect either ": " or " = ". */ + if (!parse_peek_string_cbs(p, sep)) + sep = " = "; + if (!parse_get_string_cbs(p, sep)) + parse_errx(p, "error getting \"%s\"", sep); +} + +static int +parse_empty_or_comment_line(struct parse *p) +{ + if (CBS_len(&p->cbs) == 0) { + return 1; + } + if (parse_peek_string_cbs(p, "#")) { + parse_line_skip_to_end(p); + return 1; + } + return 0; +} + +static void +parse_string_match_line(struct parse *p) +{ + int string_matches; + + parse_check_label_matches(p); + + string_matches = parse_get_string_cbs(p, match(p)); + parse_state_set_int(p, string_matches); + + if (!string_matches) + parse_line_skip_to_end(p); +} + +static int +parse_get_hex_nibble_cbs(CBS *cbs, uint8_t *out_nibble) +{ + uint8_t c; + + if (!CBS_get_u8(cbs, &c)) + return 0; + + if (c >= '0' && c <= '9') { + *out_nibble = c - '0'; + return 1; + } + if (c >= 'a' && c <= 'f') { + *out_nibble = c - 'a' + 10; + return 1; + } + if (c >= 'A' && c <= 'F') { + *out_nibble = c - 'A' + 10; + return 1; + } + + return 0; +} + +static void +parse_hex_line(struct parse *p) +{ + CBB cbb; + + parse_check_label_matches(p); + + if (!CBB_init(&cbb, 0)) + parse_errx(p, "CBB_init"); + + while (CBS_len(&p->cbs) > 0) { + uint8_t hi, lo; + + if (!parse_get_hex_nibble_cbs(&p->cbs, &hi)) + parse_errx(p, "parse_get_hex_nibble_cbs"); + if (!parse_get_hex_nibble_cbs(&p->cbs, &lo)) + parse_errx(p, "parse_get_hex_nibble_cbs"); + + if (!CBB_add_u8(&cbb, hi << 4 | lo)) + parse_errx(p, "CBB_add_u8"); + } + + parse_state_set_from_cbb(p, &cbb); +} + +static void +parse_maybe_prepare_instruction_line(struct parse *p) +{ + if (parse_instructions_parsed(p)) + return; + + /* Should not happen due to parse_empty_or_comment_line(). */ + if (CBS_len(&p->cbs) == 0) + parse_errx(p, "empty instruction line"); + + if (!parse_peek_string_cbs(p, "[")) + parse_errx(p, "expected instruction line"); + if (!parse_get_string_cbs(p, "[")) + parse_errx(p, "expected start of instruction line"); + if (!parse_get_string_end_cbs(p, "]")) + parse_errx(p, "expected end of instruction line"); +} + +static void +parse_check_line_consumed(struct parse *p) +{ + if (CBS_len(&p->cbs) > 0) + parse_errx(p, "%zu unprocessed bytes", CBS_len(&p->cbs)); +} + +static int +parse_run_test_case(struct parse *p) +{ + const struct test_parse *tctx = p->tctx; + + p->state.running_test_case = 1; + return tctx->run_test_case(p->ctx); +} + +static void +parse_reinit(struct parse *p) +{ + const struct test_parse *tctx = p->tctx; + + p->state.running_test_case = 0; + parse_line_data_clear(p); + tctx->finish(p->ctx); + tctx->init(p->ctx, p); +} + +static int +parse_maybe_run_test_case(struct parse *p) +{ + int failed = 0; + + if (parse_must_run_test_case(p)) { + failed |= parse_run_test_case(p); + parse_reinit(p); + } + + parse_advance(p); + + return failed; +} + +static int +parse_process_line(struct parse *p) +{ + if (parse_empty_or_comment_line(p)) + return 0; + + parse_maybe_prepare_instruction_line(p); + + switch (parse_line_type(p)) { + case LINE_STRING_MATCH: + parse_string_match_line(p); + break; + case LINE_HEX: + parse_hex_line(p); + break; + default: + parse_errx(p, "unknown line type %d", parse_line_type(p)); + } + parse_check_line_consumed(p); + + return parse_maybe_run_test_case(p); +} + +static void +parse_init(struct parse *p, const char *fn, const struct test_parse *tctx, + void *ctx) +{ + FILE *fp; + + memset(p, 0, sizeof(*p)); + + if ((fp = fopen(fn, "r")) == NULL) + err(1, "error opening %s", fn); + + /* Poor man's basename since POSIX basename is stupid. */ + if ((p->fn = strrchr(fn, '/')) != NULL) + p->fn++; + else + p->fn = fn; + + p->fp = fp; + parse_state_init(&p->state, tctx->num_states, tctx->num_instructions); + p->tctx = tctx; + p->ctx = ctx; + tctx->init(ctx, p); +} + +static int +parse_next_line(struct parse *p) +{ + ssize_t len; + uint8_t u8; + + if ((len = getline(&p->buf, &p->buf_max, p->fp)) == -1) + return 0; + + CBS_init(&p->cbs, (const uint8_t *)p->buf, len); + parse_state_new_line(&p->state); + + if (!CBS_get_last_u8(&p->cbs, &u8)) + parse_errx(p, "CBS_get_last_u8"); + + assert(u8 == '\n'); + + return 1; +} + +static void +parse_finish(struct parse *p) +{ + parse_state_finish(&p->state); + + free(p->buf); + + if (ferror(p->fp)) + err(1, "%s", p->fn); + fclose(p->fp); +} + +int +parse_test_file(const char *fn, const struct test_parse *tctx, void *ctx) +{ + struct parse p; + int failed = 0; + + parse_init(&p, fn, tctx, ctx); + + while (parse_next_line(&p)) + failed |= parse_process_line(&p); + + parse_finish(&p); + + return failed; +} diff --git a/regress/lib/libcrypto/mlkem/parse_test_file.h b/regress/lib/libcrypto/mlkem/parse_test_file.h new file mode 100644 index 000000000..772b7f623 --- /dev/null +++ b/regress/lib/libcrypto/mlkem/parse_test_file.h @@ -0,0 +1,83 @@ +/* $OpenBSD: parse_test_file.h,v 1.1 2024/12/26 00:04:24 tb Exp $ */ + +/* + * Copyright (c) 2024 Theo Buehler + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef PARSE_TEST_FILE_H +#define PARSE_TEST_FILE_H + +#include +#include + +#include "bytestring.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +struct parse; + +enum line { + LINE_STRING_MATCH, /* Checks if string after label matches. */ + LINE_HEX, /* Parses hex into cbb from type2cbb. */ +}; + +struct line_spec { + int state; + enum line type; + const char *name; + const char *label; /* followed by ": " or " = " */ + const char *match; /* only for LINE_STRING_MATCH */ +}; + +struct test_parse { + const struct line_spec *states; + size_t num_states; + + const struct line_spec *instructions; + size_t num_instructions; + + int (*init)(void *ctx, void *parse_ctx); + void (*finish)(void *ctx); + + int (*run_test_case)(void *ctx); +}; + +int parse_test_file(const char *fn, const struct test_parse *lctx, void *ctx); + +int parse_get_int(struct parse *p, size_t idx, int *out); +int parse_get_cbs(struct parse *p, size_t idx, CBS *out); + +int parse_instruction_get_int(struct parse *p, size_t idx, int *out); +int parse_instruction_get_cbs(struct parse *p, size_t idx, CBS *out); + +int parse_length_equal(struct parse *p, const char *descr, size_t want, size_t got); +int parse_data_equal(struct parse *p, const char *descr, CBS *want, + const uint8_t *got, size_t len); + +void parse_info(struct parse *ctx, const char *fmt, ...) + __attribute__((__format__ (printf, 2, 3))) + __attribute__((__nonnull__ (2))); +void parse_errx(struct parse *ctx, const char *fmt, ...) + __attribute__((__format__ (printf, 2, 3))) + __attribute__((__nonnull__ (2))) + __attribute__((__noreturn__)); + +#ifdef __cplusplus +} +#endif + +#endif /* PARSE_TEST_FILE_H */ diff --git a/regress/lib/libcrypto/rsa/Makefile b/regress/lib/libcrypto/rsa/Makefile index 494d40d86..3950ce681 100644 --- a/regress/lib/libcrypto/rsa/Makefile +++ b/regress/lib/libcrypto/rsa/Makefile @@ -1,10 +1,12 @@ -# $OpenBSD: Makefile,v 1.4 2024/03/30 00:36:14 jsing Exp $ +# $OpenBSD: Makefile,v 1.6 2025/01/04 18:16:37 tb Exp $ -PROGS= rsa_test \ - rsa_padding_test -LDADD= -lcrypto -DPADD= ${LIBCRYPTO} -WARNINGS= Yes -CFLAGS+= -DLIBRESSL_INTERNAL -Werror +PROGS += rsa_test +PROGS += rsa_method_test +PROGS += rsa_padding_test + +LDADD = -lcrypto +DPADD = ${LIBCRYPTO} +WARNINGS = Yes +CFLAGS += -DLIBRESSL_INTERNAL -Werror .include diff --git a/regress/lib/libcrypto/rsa/rsa_method_test.c b/regress/lib/libcrypto/rsa/rsa_method_test.c new file mode 100644 index 000000000..d9c1cc4f9 --- /dev/null +++ b/regress/lib/libcrypto/rsa/rsa_method_test.c @@ -0,0 +1,276 @@ +/* $OpenBSD: rsa_method_test.c,v 1.5 2025/01/05 18:21:36 tb Exp $ */ + +/* + * Copyright (c) 2025 Theo Buehler + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +/* + * XXX - This currently only covers sign and verify. + */ + +/* sigh */ +static int ex_index; + +/* Unsure if this applies to RSA, ASN.1, or the OpenSSL code base altogether. */ +static const uint8_t msg[] = { + 0x44, 0x69, 0x65, 0x2c, 0x20, 0x64, 0x69, 0x65, + 0x2c, 0x20, 0x64, 0x69, 0x65, 0x2c, 0x20, 0x6d, + 0x79, 0x20, 0x64, 0x61, 0x72, 0x6c, 0x69, 0x6e, + 0x67, 0x0a, 0x44, 0x6f, 0x6e, 0x27, 0x74, 0x20, + 0x75, 0x74, 0x74, 0x65, 0x72, 0x20, 0x61, 0x20, + 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x77, + 0x6f, 0x72, 0x64, 0x0a, 0x44, 0x69, 0x65, 0x2c, + 0x20, 0x64, 0x69, 0x65, 0x2c, 0x20, 0x64, 0x69, + 0x65, 0x2c, 0x20, 0x6d, 0x79, 0x20, 0x64, 0x61, + 0x72, 0x6c, 0x69, 0x6e, 0x67, 0x0a, 0x53, 0x68, + 0x75, 0x74, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, + 0x70, 0x72, 0x65, 0x74, 0x74, 0x79, 0x20, 0x65, + 0x79, 0x65, 0x73, 0x0a, 0x0a, 0x49, 0x27, 0x6c, + 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x65, + 0x69, 0x6e, 0x67, 0x20, 0x79, 0x6f, 0x75, 0x20, + 0x61, 0x67, 0x61, 0x69, 0x6e, 0x0a, 0x49, 0x27, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, + 0x65, 0x69, 0x6e, 0x67, 0x20, 0x79, 0x6f, 0x75, + 0x20, 0x69, 0x6e, 0x20, 0x68, 0x65, 0x6c, 0x6c, + 0x0a, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x4d, 0x69, + 0x73, 0x66, 0x69, 0x74, 0x73, 0x20, 0x7e, 0x20, + 0x31, 0x39, 0x38, 0x32, +}; + +static int +sign_and_verify(const char *descr, EVP_PKEY *priv, EVP_PKEY *pub) +{ + ASN1_IA5STRING *message = NULL; + ASN1_BIT_STRING *signature = NULL; + X509_ALGOR *x509_alg = NULL; + const ASN1_OBJECT *oid; + int nid, ret; + int failed = 1; + + if ((message = ASN1_IA5STRING_new()) == NULL) + errx(1, "%s: ASN1_IA5STRING_new", __func__); + if (!ASN1_STRING_set(message, msg, sizeof(msg))) + errx(1, "%s: ASN1_STRING_set", __func__); + + if ((signature = ASN1_BIT_STRING_new()) == NULL) + errx(1, "%s: ASN1_BIT_STRING_new", __func__); + if ((x509_alg = X509_ALGOR_new()) == NULL) + errx(1, "%s: X509_ALGOR_new", __func__); + if ((ret = ASN1_item_sign(&ASN1_IA5STRING_it, x509_alg, NULL, signature, + message, priv, EVP_sha256())) <= 0) { + fprintf(stderr, "FAIL: %s (%s): ASN1_item_sign() returned %d\n", + __func__, descr, ret); + ERR_print_errors_fp(stderr); + goto err; + } + + X509_ALGOR_get0(&oid, NULL, NULL, x509_alg); + if ((nid = OBJ_obj2nid(oid)) != NID_sha256WithRSAEncryption) { + fprintf(stderr, "FAIL: %s (%s): OBJ_obj2nid(): want %d, got %d\n", + __func__, descr, NID_sha256WithRSAEncryption, nid); + goto err; + } + + if ((ret = ASN1_item_verify(&ASN1_IA5STRING_it, x509_alg, signature, + message, pub)) != 1) { + fprintf(stderr, "FAIL: %s (%s): ASN1_item_verify() returned %d\n", + __func__, descr, ret); + ERR_print_errors_fp(stderr); + goto err; + } + + failed = 0; + + err: + ASN1_IA5STRING_free(message); + ASN1_BIT_STRING_free(signature); + X509_ALGOR_free(x509_alg); + + return failed; +} + +static void +generate_rsa_keypair(int bits, int exponent, RSA **out_priv, RSA **out_pub) +{ + BIGNUM *e; + RSA *rsa; + + assert(out_priv == NULL || *out_priv == NULL); + assert(out_pub == NULL || *out_pub == NULL); + + if ((e = BN_new()) == NULL) + errx(1, "%s: BN_new()", __func__); + if (!BN_set_word(e, exponent)) + errx(1, "%s: BN_set_word()", __func__); + + if ((rsa = RSA_new()) == NULL) + errx(1, "%s: RSA_new()", __func__); + if (!RSA_generate_key_ex(rsa, bits, e, NULL)) + errx(1, "%s: RSA_generate_key_ex", __func__); + + /* Take the opportunity to exercise these two functions. */ + if (out_priv != NULL) { + if ((*out_priv = RSAPrivateKey_dup(rsa)) == NULL) + errx(1, "%s: RSAPrivateKey_dup", __func__); + } + if (out_pub != NULL) { + if ((*out_pub = RSAPublicKey_dup(rsa)) == NULL) + errx(1, "%s: RSAPublicKey_dup", __func__); + } + + RSA_free(rsa); + BN_free(e); +} + +static void +rsa_to_evp(RSA *rsa, EVP_PKEY **out_evp) +{ + assert(*out_evp == NULL); + + if ((*out_evp = EVP_PKEY_new()) == NULL) + errx(1, "%s: EVP_PKEY_new", __func__); + if (!EVP_PKEY_set1_RSA(*out_evp, rsa)) + errx(1, "%s: EVP_PKEY_set1_RSA", __func__); +} + +static void +clear_evp_keys(EVP_PKEY **evp_priv, EVP_PKEY **evp_pub) +{ + EVP_PKEY_free(*evp_priv); + EVP_PKEY_free(*evp_pub); + *evp_priv = NULL; + *evp_pub = NULL; +} + +static int +rsa_method_app_data_sign(int dtype, const unsigned char *m, unsigned int m_len, + unsigned char *sig, unsigned int *sig_len, const RSA *rsa) +{ + const RSA_METHOD *method = RSA_get_method(rsa); + RSA *sign_rsa = RSA_meth_get0_app_data(method); + + return RSA_sign(dtype, m, m_len, sig, sig_len, sign_rsa); +} + +static int +rsa_ex_data_verify(int dtype, const unsigned char *m, unsigned int m_len, + const unsigned char *sig, unsigned int sig_len, const RSA *rsa) +{ + RSA *verify_rsa; + + assert(ex_index != 0); + + if ((verify_rsa = RSA_get_ex_data(rsa, ex_index)) == NULL) + errx(1, "%s: RSA_get_ex_data", __func__); + + return RSA_verify(dtype, m, m_len, sig, sig_len, verify_rsa); +} + +static int +sign_and_verify_test(void) +{ + RSA_METHOD *sign_verify_method = NULL; + RSA *rsa_priv = NULL, *rsa_pub = NULL, *rsa_bogus = NULL; + EVP_PKEY *evp_priv = NULL, *evp_pub = NULL; + int failed = 0; + + assert(ex_index != 0); + + /* + * XXX - Hilarity ensues if the public key sizes don't match. + * One reason is that EVP_PKEY_sign() uses EVP_PKEY_size() + * which ignores the RSA method. Awesome design is awesome and + * OpenSSL's abstractions are leakier than Manneken Pis. + */ + generate_rsa_keypair(2048, RSA_F4, &rsa_priv, &rsa_pub); + generate_rsa_keypair(2048, RSA_3, NULL, &rsa_bogus); + + rsa_to_evp(rsa_priv, &evp_priv); + rsa_to_evp(rsa_pub, &evp_pub); + + failed |= sign_and_verify("default method", evp_priv, evp_pub); + + clear_evp_keys(&evp_priv, &evp_pub); + + if (!RSA_set_ex_data(rsa_bogus, ex_index, rsa_pub)) + errx(1, "%s: RSA_set_ex_data", __func__); + + if ((sign_verify_method = RSA_meth_dup(RSA_get_default_method())) == NULL) + errx(1, "%s: RSA_get_default_method", __func__); + if (!RSA_meth_set0_app_data(sign_verify_method, rsa_priv)) + errx(1, "%s: RSA_meth_set0_app_data", __func__); + + if (!RSA_meth_set_sign(sign_verify_method, rsa_method_app_data_sign)) + errx(1, "%s: RSA_meth_set_sign", __func__); + if (!RSA_meth_set_verify(sign_verify_method, rsa_ex_data_verify)) + errx(1, "%s: RSA_meth_set_verify", __func__); + + if (!RSA_set_method(rsa_bogus, sign_verify_method)) + errx(1, "%s: RSA_set_method", __func__); + + rsa_to_evp(rsa_bogus, &evp_priv); + rsa_to_evp(rsa_pub, &evp_pub); + + failed |= sign_and_verify("app data sign method", evp_priv, evp_pub); + + clear_evp_keys(&evp_priv, &evp_pub); + + rsa_to_evp(rsa_priv, &evp_priv); + rsa_to_evp(rsa_bogus, &evp_pub); + + failed |= sign_and_verify("ex data verify method", evp_priv, evp_pub); + + clear_evp_keys(&evp_priv, &evp_pub); + + rsa_to_evp(rsa_bogus, &evp_priv); + rsa_to_evp(rsa_bogus, &evp_pub); + + failed |= sign_and_verify("both sides bogus", evp_priv, evp_pub); + + RSA_free(rsa_priv); + RSA_free(rsa_pub); + RSA_free(rsa_bogus); + EVP_PKEY_free(evp_priv); + EVP_PKEY_free(evp_pub); + RSA_meth_free(sign_verify_method); + + return failed; +} + +int +main(void) +{ + int failed = 0; + + if ((ex_index = RSA_get_ex_new_index(0, NULL, NULL, NULL, NULL)) <= 0) + errx(1, "RSA_get_ex_new_index"); + + failed |= sign_and_verify_test(); + + return failed; +} diff --git a/regress/lib/libcrypto/wycheproof/wycheproof.go b/regress/lib/libcrypto/wycheproof/wycheproof.go index ddd37030d..8f0dfc8b2 100644 --- a/regress/lib/libcrypto/wycheproof/wycheproof.go +++ b/regress/lib/libcrypto/wycheproof/wycheproof.go @@ -1,4 +1,4 @@ -/* $OpenBSD: wycheproof.go,v 1.160 2024/05/22 14:03:24 tb Exp $ */ +/* $OpenBSD: wycheproof.go,v 1.161 2024/11/24 10:13:16 tb Exp $ */ /* * Copyright (c) 2018,2023 Joel Sing * Copyright (c) 2018,2019,2022-2024 Theo Buehler @@ -641,6 +641,14 @@ func nidFromString(ns string) (int, error) { return -1, fmt.Errorf("unknown NID %q", ns) } +func skipSmallCurve(nid int) bool { + switch C.int(nid) { + case C.NID_secp160k1, C.NID_secp160r1, C.NID_secp160r2, C.NID_secp192k1, C.NID_X9_62_prime192v1: + return true + } + return false +} + var evpMds = map[string]*C.EVP_MD{ "SHA-1": C.EVP_sha1(), "SHA-224": C.EVP_sha224(), @@ -1637,6 +1645,9 @@ func (wtg *wycheproofTestGroupECDH) run(algorithm string, variant testVariant) b if err != nil { log.Fatalf("Failed to get nid for curve: %v", err) } + if skipSmallCurve(nid) { + return true + } success := true for _, wt := range wtg.Tests { @@ -1786,6 +1797,9 @@ func (wtg *wycheproofTestGroupECDSA) run(algorithm string, variant testVariant) if err != nil { log.Fatalf("Failed to get nid for curve: %v", err) } + if skipSmallCurve(nid) { + return true + } ecKey := C.EC_KEY_new_by_curve_name(C.int(nid)) if ecKey == nil { log.Fatal("EC_KEY_new_by_curve_name failed") @@ -2750,7 +2764,7 @@ func main() { testc = newTestCoordinator() - skipNormal := regexp.MustCompile(`_(ecpoint|p1363|sect\d{3}[rk]1)_`) + skipNormal := regexp.MustCompile(`_(ecpoint|p1363|sect\d{3}[rk]1|secp(160|192))_`) for _, test := range tests { tvs, err := filepath.Glob(filepath.Join(testVectorPath, test.pattern)) diff --git a/regress/lib/libcrypto/x509/bettertls/Makefile b/regress/lib/libcrypto/x509/bettertls/Makefile index 6d694f2e1..272414063 100644 --- a/regress/lib/libcrypto/x509/bettertls/Makefile +++ b/regress/lib/libcrypto/x509/bettertls/Makefile @@ -1,10 +1,10 @@ -# $OpenBSD: Makefile,v 1.5 2020/10/02 19:38:39 tb Exp $ +# $OpenBSD: Makefile,v 1.6 2024/12/27 08:02:27 tb Exp $ PROGS = verify -.ifdef EOPENSSL11 -LDADD += -Wl,-rpath,/usr/local/lib/eopenssl11 -L/usr/local/lib/eopenssl11 -CFLAGS += -I/usr/local/include/eopenssl11/ +.ifdef EOPENSSL33 +LDADD += -Wl,-rpath,/usr/local/lib/eopenssl33 -L/usr/local/lib/eopenssl33 +CFLAGS += -I/usr/local/include/eopenssl33/ .endif LDADD += -lcrypto diff --git a/regress/lib/libssl/interop/openssl32/Makefile b/regress/lib/libssl/interop/openssl32/Makefile index 12536d0c8..87255138f 100644 --- a/regress/lib/libssl/interop/openssl32/Makefile +++ b/regress/lib/libssl/interop/openssl32/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.1 2024/08/18 09:14:17 tb Exp $ +# $OpenBSD: Makefile,v 1.2 2024/10/22 16:31:10 tb Exp $ .if ! exists(/usr/local/bin/eopenssl32) regress: @@ -8,6 +8,7 @@ regress: .else PROGS = client server +CFLAGS += -DOPENSSL_SUPPRESS_DEPRECATED CPPFLAGS = -I /usr/local/include/eopenssl32 LDFLAGS = -L /usr/local/lib/eopenssl32 LDADD = -lssl -lcrypto diff --git a/regress/lib/libtls/gotls/tls.go b/regress/lib/libtls/gotls/tls.go index cf3e84c03..360182888 100644 --- a/regress/lib/libtls/gotls/tls.go +++ b/regress/lib/libtls/gotls/tls.go @@ -202,6 +202,15 @@ func (t *TLS) PeerCertIssuer() (string, error) { return C.GoString(issuer), nil } +// PeerCertCommonName returns the common name of the peer certificate. +func (t *TLS) PeerCertCommonName() (string, error) { + commonName := C.tls_peer_cert_common_name(t.ctx) + if commonName == nil { + return "", errors.New("no peer cert common name returned") + } + return C.GoString(commonName), nil +} + // PeerCertSubject returns the subject of the peer certificate. func (t *TLS) PeerCertSubject() (string, error) { subject := C.tls_peer_cert_subject(t.ctx) diff --git a/regress/lib/libtls/gotls/tls_test.go b/regress/lib/libtls/gotls/tls_test.go index 2b7ce2c19..20240e058 100644 --- a/regress/lib/libtls/gotls/tls_test.go +++ b/regress/lib/libtls/gotls/tls_test.go @@ -418,6 +418,9 @@ func TestTLSInfo(t *testing.T) { if _, err := tls.PeerCertSubject(); err == nil { t.Error("PeerCertSubject() returned nil error, want error") } + if _, err := tls.PeerCertCommonName(); err == nil { + t.Error("PeerCertCommonName() returned nil error, want error") + } if _, err := tls.PeerCertHash(); err == nil { t.Error("PeerCertHash() returned nil error, want error") } @@ -468,6 +471,11 @@ func TestTLSInfo(t *testing.T) { } else { t.Logf("Subject: %v", subject) } + if commonName, err := tls.PeerCertCommonName(); err != nil { + t.Errorf("PeerCertCommonName() returned error: %v", err) + } else { + t.Logf("Subject: %v", commonName) + } if hash, err := tls.PeerCertHash(); err != nil { t.Errorf("PeerCertHash() returned error: %v", err) } else if hash != certHash { diff --git a/regress/sbin/slaacd/IfInfo.py b/regress/sbin/slaacd/IfInfo.py index ecf0b85ef..a0ceb92d5 100644 --- a/regress/sbin/slaacd/IfInfo.py +++ b/regress/sbin/slaacd/IfInfo.py @@ -1,4 +1,4 @@ -# $OpenBSD: IfInfo.py,v 1.2 2020/12/25 14:25:58 bluhm Exp $ +# $OpenBSD: IfInfo.py,v 1.3 2024/12/25 14:57:47 sthen Exp $ # Copyright (c) 2017 Florian Obser # Copyright (c) 2020 Alexander Bluhm @@ -35,8 +35,8 @@ class IfInfo(object): def parse(self, str): lines = str.splitlines() for line in lines: - lladdr = re.match("^\s+lladdr (.+)", line) - link_local = re.match("^\s+inet6 ([^%]+)", line) + lladdr = re.match(r"^\s+lladdr (.+)", line) + link_local = re.match(r"^\s+inet6 ([^%]+)", line) if lladdr: self.mac = lladdr.group(1) continue diff --git a/regress/sbin/slaacd/Slaacctl.py b/regress/sbin/slaacd/Slaacctl.py index a9a9ce340..ea7b0c43f 100644 --- a/regress/sbin/slaacd/Slaacctl.py +++ b/regress/sbin/slaacd/Slaacctl.py @@ -1,4 +1,4 @@ -# $OpenBSD: Slaacctl.py,v 1.4 2021/04/14 12:32:56 bluhm Exp $ +# $OpenBSD: Slaacctl.py,v 1.5 2024/12/25 14:57:47 sthen Exp $ # Copyright (c) 2017 Florian Obser # Copyright (c) 2020 Alexander Bluhm @@ -63,33 +63,33 @@ class ShowInterface(object): for line in lines: if self.debug == 1: print(line) - if re.match("^\s*$", line): + if re.match(r"^\s*$", line): pass elif state == 'START': - ifname = re.match("^(\w+):", line).group(1) + ifname = re.match(r"^(\w+):", line).group(1) if ifname != self.ifname: raise ValueError("unexpected interface " + "name: " + ifname) state = 'IFINFO' elif state == 'IFINFO': - m = re.match("^\s+index:\s+(\d+)\s+running:" - + "\s+(\w+)\s+temporary:\s+(\w+)", line) + m = re.match(r"^\s+index:\s+(\d+)\s+running:" + + r"\s+(\w+)\s+temporary:\s+(\w+)", line) self.index = m.group(1) self.running = m.group(2) self.temporary = m.group(3) state = 'IFLLADDR' elif state == 'IFLLADDR': - self.lladdr = re.match("^\s+lladdr:\s+(.*)", + self.lladdr = re.match(r"^\s+lladdr:\s+(.*)", line).group(1) state = 'IFLINKLOCAL' elif state == 'IFLINKLOCAL': - self.linklocal = re.match("^\s+inet6:\s+(.*)", + self.linklocal = re.match(r"^\s+inet6:\s+(.*)", line).group(1) state = 'IFDONE' elif state == 'IFDONE': - is_ra = re.match("^\s+Router Advertisement " - + "from\s+(.*)", line) - is_addr_proposal = re.match("^\s+Address " + is_ra = re.match(r"^\s+Router Advertisement " + + r"from\s+(.*)", line) + is_addr_proposal = re.match(r"^\s+Address " + "proposals", line) if is_ra: ra = dict() @@ -102,39 +102,39 @@ class ShowInterface(object): elif is_addr_proposal: state = 'ADDRESS_PROPOSAL' elif state == 'RASTART': - m = re.match("\s+received:\s+(.*);\s+(\d+)s " + m = re.match(r"\s+received:\s+(.*);\s+(\d+)s " + "ago", line) ra['received'] = m.group(1) ra['ago'] = m.group(2) state = 'RARECEIVED' elif state == 'RARECEIVED': - m = re.match("\s+Cur Hop Limit:\s+(\d+), M: " - + "(\d+), O: (\d+), " - + "Router Lifetime:\s+(\d+)s", line) + m = re.match(r"\s+Cur Hop Limit:\s+(\d+), M: " + + r"(\d+), O: (\d+), " + + r"Router Lifetime:\s+(\d+)s", line) ra['cur_hop_limit'] = m.group(1) ra['M'] = m.group(2) ra['O'] = m.group(3) ra['lifetime'] = m.group(4) state = 'RACURHOPLIMIT' elif state == 'RACURHOPLIMIT': - ra['preference'] = re.match("^\s+Default " - + "Router Preference:\s+(.*)", + ra['preference'] = re.match(r"^\s+Default " + + r"Router Preference:\s+(.*)", line).group(1) state = 'RAPREFERENCE' elif state == 'RAPREFERENCE': - m = re.match("^\s+Reachable Time:\s+(\d+)ms, " - + "Retrans Timer:\s+(\d+)ms", line) + m = re.match(r"^\s+Reachable Time:\s+(\d+)ms, " + + r"Retrans Timer:\s+(\d+)ms", line) ra['reachable_time'] = m.group(1) ra['retrans_timer'] = m.group(2) state = 'RAOPTIONS' elif state == 'RAOPTIONS': - is_addr_proposal = re.match("^\s+Address " + is_addr_proposal = re.match(r"^\s+Address " + "proposals", line) - is_rdns = re.match("^\s+rdns: (.*), " - + "lifetime:\s+(\d+)", line) - is_search = re.match("^\s+search: (.*), " - + "lifetime:\s+(\d+)", line) - is_prefix = re.match("^\s+prefix:\s+(.*)", line) + is_rdns = re.match(r"^\s+rdns: (.*), " + + r"lifetime:\s+(\d+)", line) + is_search = re.match(r"^\s+search: (.*), " + + r"lifetime:\s+(\d+)", line) + is_prefix = re.match(r"^\s+prefix:\s+(.*)", line) if is_addr_proposal: state = 'ADDRESS_PROPOSAL' elif is_prefix: @@ -155,22 +155,22 @@ class ShowInterface(object): search['lifetime'] = is_search.group(2) state = 'RAOPTIONS' elif state == 'PREFIX': - m = re.match("^\s+On-link: (\d+), " + m = re.match(r"^\s+On-link: (\d+), " + "Autonomous address-configuration: " - + "(\d+)", line) + + r"(\d+)", line) prefix['on_link'] = m.group(1) prefix['autonomous'] = m.group(2) state = 'PREFIX_ONLINK' elif state == 'PREFIX_ONLINK': - m = re.match("^\s+vltime:\s+(\d+|infinity), " - + "pltime:\s+(\d+|infinity)", line) + m = re.match(r"^\s+vltime:\s+(\d+|infinity), " + + r"pltime:\s+(\d+|infinity)", line) prefix['vltime'] = m.group(1) prefix['pltime'] = m.group(2) state = 'RAOPTIONS' elif state == 'ADDRESS_PROPOSAL': - is_id = re.match("^\s+id:\s+(\d+), " - + "state:\s+(.+), temporary: (.+)", line) - is_defrouter = re.match("\s+Default router " + is_id = re.match(r"^\s+id:\s+(\d+), " + + r"state:\s+(.+), temporary: (.+)", line) + is_defrouter = re.match(r"\s+Default router " + "proposals", line) if is_id: addr_proposal = dict() @@ -184,28 +184,28 @@ class ShowInterface(object): elif is_defrouter: state = 'DEFAULT_ROUTER' elif state == 'ADDRESS_PROPOSAL_LIFETIME': - m = re.match("^\s+vltime:\s+(\d+), " - + "pltime:\s+(\d+), " - + "timeout:\s+(\d+)s", line) + m = re.match(r"^\s+vltime:\s+(\d+), " + + r"pltime:\s+(\d+), " + + r"timeout:\s+(\d+)s", line) addr_proposal['vltime'] = m.group(1) addr_proposal['pltime'] = m.group(2) addr_proposal['timeout'] = m.group(3) state = 'ADDRESS_PROPOSAL_UPDATED' elif state == 'ADDRESS_PROPOSAL_UPDATED': - m = re.match("^\s+updated:\s+(.+);\s+(\d+)s " + m = re.match(r"^\s+updated:\s+(.+);\s+(\d+)s " + "ago", line) addr_proposal['updated'] = m.group(1) addr_proposal['updated_ago'] = m.group(2) state = 'ADDRESS_PROPOSAL_ADDR_PREFIX' elif state == 'ADDRESS_PROPOSAL_ADDR_PREFIX': - m = re.match("^\s+(.+), (.+)", line) + m = re.match(r"^\s+(.+), (.+)", line) addr_proposal['addr'] = m.group(1) addr_proposal['prefix'] = m.group(2) state = 'ADDRESS_PROPOSAL' elif state == 'DEFAULT_ROUTER': - is_id = re.match("^\s+id:\s+(\d+), " - + "state:\s+(.+)", line) - is_rdns = re.match("\s+rDNS proposals", line) + is_id = re.match(r"^\s+id:\s+(\d+), " + + r"state:\s+(.+)", line) + is_rdns = re.match(r"\s+rDNS proposals", line) if is_id: def_router_proposal = dict() self.def_router_proposals.append( @@ -220,28 +220,28 @@ class ShowInterface(object): else: state = 'DONE' elif state == 'DEFAULT_ROUTER_PROPOSAL': - m = re.match("^\s+router: (.+)", line) + m = re.match(r"^\s+router: (.+)", line) def_router_proposal['router'] = m.group(1) state = 'DEFAULT_ROUTER_PROPOSAL_ROUTER' elif state == 'DEFAULT_ROUTER_PROPOSAL_ROUTER': - m = re.match("^\s+router lifetime:\s+(\d)", + m = re.match(r"^\s+router lifetime:\s+(\d)", line) def_router_proposal['lifetime'] = m.group(1) state = 'DEFAULT_ROUTER_PROPOSAL_LIFETIME' elif state == 'DEFAULT_ROUTER_PROPOSAL_LIFETIME': - m = re.match("^\s+Preference: (.+)", line) + m = re.match(r"^\s+Preference: (.+)", line) def_router_proposal['pref'] = m.group(1) state = 'DEFAULT_ROUTER_PROPOSAL_PREF' elif state == 'DEFAULT_ROUTER_PROPOSAL_PREF': - m = re.match("^\s+updated: ([^;]+); (\d+)s ago," - + " timeout:\s+(\d+)", line) + m = re.match(r"^\s+updated: ([^;]+); (\d+)s ago," + + r" timeout:\s+(\d+)", line) def_router_proposal['updated'] = m.group(1) def_router_proposal['ago'] = m.group(2) def_router_proposal['timeout'] = m.group(3) state = 'DEFAULT_ROUTER' elif state == 'RDNS': - is_id = re.match("^\s+id:\s+(\d+), " - + "state:\s+(.+)", line) + is_id = re.match(r"^\s+id:\s+(\d+), " + + r"state:\s+(.+)", line) if is_id: rdns_proposal = dict(); rdns_proposal['rdns'] = [] @@ -253,22 +253,22 @@ class ShowInterface(object): else: state = 'DONE' elif state == 'RDNS_PROPOSAL': - m = re.match("^\s+router: (.+)", line) + m = re.match(r"^\s+router: (.+)", line) rdns_proposal['router'] = m.group(1) state = 'RDNS_PROPOSAL_ROUTER' elif state == 'RDNS_PROPOSAL_ROUTER': - m = re.match("^\s+rdns lifetime:\s+(\d)", + m = re.match(r"^\s+rdns lifetime:\s+(\d)", line) rdns_proposal['lifetime'] = m.group(1) state = 'RDNS_LIFETIME' elif state == 'RDNS_LIFETIME': - m = re.match("^\s+rdns:", line) + m = re.match(r"^\s+rdns:", line) if m: state = 'RDNS_RDNS' elif state == 'RDNS_RDNS': - is_upd = re.match("^\s+updated: ([^;]+); " - + "(\d+)s ago, timeout:\s+(\d+)", line) - is_rdns = re.match("^\s+([0-9a-fA-F]{1,4}.*)", + is_upd = re.match(r"^\s+updated: ([^;]+); " + + r"(\d+)s ago, timeout:\s+(\d+)", line) + is_rdns = re.match(r"^\s+([0-9a-fA-F]{1,4}.*)", line) if is_upd: rdns_proposal['updated'] = \ diff --git a/regress/sys/arch/amd64/Makefile b/regress/sys/arch/amd64/Makefile index c85f9beb2..80ab00290 100644 --- a/regress/sys/arch/amd64/Makefile +++ b/regress/sys/arch/amd64/Makefile @@ -1,7 +1,7 @@ -# $OpenBSD: Makefile,v 1.2 2022/04/21 19:21:04 bluhm Exp $ +# $OpenBSD: Makefile,v 1.3 2024/11/19 05:51:07 anton Exp $ .if ${MACHINE_ARCH} == "amd64" -SUBDIR = +SUBDIR += ddb SUBDIR += dump_tables SUBDIR += fpu SUBDIR += vmm diff --git a/regress/sys/arch/amd64/ddb/Makefile b/regress/sys/arch/amd64/ddb/Makefile new file mode 100644 index 000000000..0fa1d6ff7 --- /dev/null +++ b/regress/sys/arch/amd64/ddb/Makefile @@ -0,0 +1,26 @@ +# $OpenBSD: Makefile,v 1.2 2024/12/23 21:47:22 bluhm Exp $ + +.if "${MACHINE_ARCH}" == "amd64" + +SRCS+= disasm.c +SRCS+= stubs.c +SRCS+= db_disasm.c +SRCS+= db_output.c +SRCS+= db_sym.c +PROG= disasm + +CPPFLAGS+= -D_KERNEL +CPPFLAGS+= -I${.CURDIR}/../../../../../sys +WARNINGS= yes + +.PATH: ${.CURDIR}/../../../../../sys/arch/amd64/amd64 +.PATH: ${.CURDIR}/../../../../../sys/ddb + +.else + +regress: + @echo SKIPPED + +.endif + +.include diff --git a/regress/sys/arch/amd64/ddb/disasm.c b/regress/sys/arch/amd64/ddb/disasm.c new file mode 100644 index 000000000..33d401191 --- /dev/null +++ b/regress/sys/arch/amd64/ddb/disasm.c @@ -0,0 +1,68 @@ +/* $OpenBSD: disasm.c,v 1.1 2024/11/19 05:50:41 anton Exp $ */ + +#include /* size_t */ +#include +#include + +#include "disasm.h" + +#define test(instr, exp) \ + test_impl((instr), sizeof(instr) - 1, \ + (exp), sizeof(exp) - 1, \ + __func__, __LINE__) + +struct db_disasm_context *ctx = NULL; + +static int +test_impl(const uint8_t *instr, size_t ninstr, const char *exp, size_t explen, + const char *fun, int lno) +{ + const char *act; + size_t actlen; + + static struct db_disasm_context c; + memset(&c, 0, sizeof(c)); + ctx = &c; + + ctx->raw.buf = instr; + ctx->raw.len = ninstr; + ctx->act.len = 0; + ctx->act.siz = sizeof(ctx->act.buf); + + db_disasm(0, 0); + + act = ctx->act.buf; + actlen = ctx->act.len; + /* Remove trailing whitespace from instructions w/o operands. */ + while (actlen > 0 && act[actlen - 1] == ' ') + actlen--; + + if (explen != actlen || strncmp(exp, act, actlen) != 0) { + fprintf(stderr, "%s:%d:\n", fun, lno); + fprintf(stderr, "exp: \"%.*s\"\n", (int)explen, exp); + fprintf(stderr, "act: \"%.*s\"\n", (int)actlen, act); + return 1; + } + + if (ctx->raw.len > 0) { + fprintf(stderr, "%s:%d: %zu byte(s) not consumed\n", fun, lno, + ctx->raw.len); + return 1; + } + + return 0; +} + +int +main(void) +{ + int error = 0; + + error |= test("\x90", "nop"); + error |= test("\x00", "addb %al,0(%rax)"); + error |= test("\xf2\x48\xa5", "repne movsq (%rsi),%es:(%rdi)"); + error |= test("\xf3\x48\xa5", "repe movsq (%rsi),%es:(%rdi)"); + error |= test("\xf3\x0f\x1e\xfa", "endbr64"); + + return error; +} diff --git a/regress/sys/arch/amd64/ddb/disasm.h b/regress/sys/arch/amd64/ddb/disasm.h new file mode 100644 index 000000000..7130ef6d0 --- /dev/null +++ b/regress/sys/arch/amd64/ddb/disasm.h @@ -0,0 +1,22 @@ +/* $OpenBSD: disasm.h,v 1.1 2024/11/19 05:50:41 anton Exp $ */ + +#include /* vaddr_t */ +#include /* size_t */ +#include + +struct db_disasm_context { + struct { + const uint8_t *buf; + size_t len; + } raw; + + struct { + char buf[128]; + size_t siz; + size_t len; + } act; +}; + +vaddr_t db_disasm(vaddr_t, int); + +extern struct db_disasm_context *ctx; diff --git a/regress/sys/arch/amd64/ddb/stubs.c b/regress/sys/arch/amd64/ddb/stubs.c new file mode 100644 index 000000000..4a8a2fa69 --- /dev/null +++ b/regress/sys/arch/amd64/ddb/stubs.c @@ -0,0 +1,94 @@ +/* $OpenBSD: stubs.c,v 1.1 2024/11/19 05:50:41 anton Exp $ */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "disasm.h" + +void (*cnputc)(int) = NULL; +int (*cngetc)(void) = NULL; +char *esym = NULL; +char *ssym = NULL; +struct cpu_info_full cpu_info_full_primary = {0}; + +int +db_elf_sym_init(int symsize, void *symtab, void *esymtab, const char *name) +{ + return 0; +} + +Elf_Sym * +db_elf_sym_search(vaddr_t off, db_strategy_t strategy, db_expr_t *diffp) +{ + return NULL; +} + +int +db_elf_line_at_pc(Elf_Sym *cursym, const char **filename, int *linenum, + db_expr_t off) +{ + return 0; +} + +void +db_error(char *s) +{ +} + +void +db_stack_trace_print(db_expr_t addr, int have_addr, db_expr_t count, + char *modif, int (*pr)(const char *, ...)) +{ +} + +void +db_symbol_values(Elf_Sym *sym, const char **namep, db_expr_t *valuep) +{ +} + +db_expr_t +db_get_value(vaddr_t addr, size_t size, int is_signed) +{ + db_expr_t c; + + if (ctx->raw.len == 0) + return 0; + + c = ctx->raw.buf[0]; + ctx->raw.buf++; + ctx->raw.len--; + return c; +} + +int +db_printf(const char *fmt, ...) +{ + int n = 0; + + if (strcmp(fmt, "\n") == 0) { + /* nothing */ + } else if (strcmp(fmt, "\t") == 0) { + n = snprintf(&ctx->act.buf[ctx->act.len], ctx->act.siz, " "); + } else { + va_list ap; + + va_start(ap, fmt); + n = vsnprintf(&ctx->act.buf[ctx->act.len], ctx->act.siz, fmt, + ap); + va_end(ap); + } + if (n < 0 || (size_t)n >= ctx->act.siz) + errx(1, "buffer too small"); + ctx->act.len += n; + ctx->act.siz -= n; + return 0; +} diff --git a/regress/sys/fileops/Makefile.inc b/regress/sys/fileops/Makefile.inc index 9f80b401b..f2ec70c2d 100644 --- a/regress/sys/fileops/Makefile.inc +++ b/regress/sys/fileops/Makefile.inc @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile.inc,v 1.6 2023/10/13 19:28:59 anton Exp $ +# $OpenBSD: Makefile.inc,v 1.7 2024/11/06 18:42:54 bluhm Exp $ PERL_REQUIRE != perl -e 'eval { require File::Slurp } or print $$@' @@ -36,6 +36,11 @@ unconfig: -vnconfig -u $$(/dev/null || true rm -f stamp-setup +# disk image takes up too much space in /usr/obj +REGRESS_CLEANUP+= remove-diskimage +remove-diskimage: + rm -f diskimage + ${.OBJDIR}/../fileops: ${.MAKE} -C ${.CURDIR}/.. fileops diff --git a/regress/sys/kern/mount/Makefile b/regress/sys/kern/mount/Makefile index 77cd1b494..597a56dcd 100644 --- a/regress/sys/kern/mount/Makefile +++ b/regress/sys/kern/mount/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.10 2023/10/12 16:59:24 anton Exp $ +# $OpenBSD: Makefile,v 1.11 2024/11/06 18:42:54 bluhm Exp $ # This regress test uses a vnd device to run mount and unmount. # All tests have to be run as root. @@ -37,6 +37,11 @@ unconfig: -rmdir /mnt/regress-mount 2>/dev/null || true -vnconfig -u $$(/dev/null || true +# disk image takes up too much space in /usr/obj +REGRESS_CLEANUP += remove-diskimage +remove-diskimage: + rm -f diskimage + # The unmount-nested test uses a disk template to create 15 partitions # on a vnd device. All are initialized with a ffs file system. # Then they are mounted nestedly in /mnt, see disktemplate for the diff --git a/regress/sys/kern/ptrace/Makefile b/regress/sys/kern/ptrace/Makefile index 5a41ee05a..e4f4c38e8 100644 --- a/regress/sys/kern/ptrace/Makefile +++ b/regress/sys/kern/ptrace/Makefile @@ -1,4 +1,6 @@ -# $OpenBSD: Makefile,v 1.3 2016/09/23 18:56:49 bluhm Exp $ +# $OpenBSD: Makefile,v 1.4 2024/11/27 05:27:21 anton Exp $ + +SUBDIR+= xstate PROG= ptrace diff --git a/regress/sys/kern/ptrace/xstate/Makefile b/regress/sys/kern/ptrace/xstate/Makefile new file mode 100644 index 000000000..d42929434 --- /dev/null +++ b/regress/sys/kern/ptrace/xstate/Makefile @@ -0,0 +1,26 @@ +# $OpenBSD: Makefile,v 1.1 2024/11/27 05:26:58 anton Exp $ + +.if ${MACHINE} == "amd64" + +WARNINGS= yes + +PROG= xstate +SRCS+= xstate.c +SRCS+= avx.S + +REGRESS_SETUP_ONCE=${PROG} + +.for t in xstate-ymm-get xstate-ymm-set +${t}: + ${.OBJDIR}/xstate ${t} +REGRESS_TARGETS+=${t} +.endfor + +.else + +regress: + @echo SKIPPED + +.endif + +.include diff --git a/regress/sys/kern/ptrace/xstate/avx.S b/regress/sys/kern/ptrace/xstate/avx.S new file mode 100644 index 000000000..5571a2e63 --- /dev/null +++ b/regress/sys/kern/ptrace/xstate/avx.S @@ -0,0 +1,79 @@ +/* $OpenBSD */ + +#include + + .intel_syntax noprefix + +/* void ymm_write(void) */ +ENTRY(ymm_write) + vmovdqu ymm0, [rip + .Lymm0] + vmovdqu ymm1, [rip + .Lymm1] + vmovdqu ymm2, [rip + .Lymm2] + vmovdqu ymm3, [rip + .Lymm3] + vmovdqu ymm4, [rip + .Lymm4] + vmovdqu ymm5, [rip + .Lymm5] + vmovdqu ymm6, [rip + .Lymm6] + vmovdqu ymm7, [rip + .Lymm7] + vmovdqu ymm8, [rip + .Lymm8] + vmovdqu ymm9, [rip + .Lymm9] + vmovdqu ymm10, [rip + .Lymm10] + vmovdqu ymm11, [rip + .Lymm11] + vmovdqu ymm12, [rip + .Lymm12] + vmovdqu ymm13, [rip + .Lymm13] + vmovdqu ymm14, [rip + .Lymm14] + vmovdqu ymm15, [rip + .Lymm15] + ret + +/* void ymm_read(struct ymm[16]) */ +ENTRY(ymm_read) + vmovdqu [rdi + 0x000], ymm0 + vmovdqu [rdi + 0x020], ymm1 + vmovdqu [rdi + 0x040], ymm2 + vmovdqu [rdi + 0x060], ymm3 + vmovdqu [rdi + 0x080], ymm4 + vmovdqu [rdi + 0x0a0], ymm5 + vmovdqu [rdi + 0x0c0], ymm6 + vmovdqu [rdi + 0x0e0], ymm7 + vmovdqu [rdi + 0x100], ymm8 + vmovdqu [rdi + 0x120], ymm9 + vmovdqu [rdi + 0x140], ymm10 + vmovdqu [rdi + 0x160], ymm11 + vmovdqu [rdi + 0x180], ymm12 + vmovdqu [rdi + 0x1a0], ymm13 + vmovdqu [rdi + 0x1c0], ymm14 + vmovdqu [rdi + 0x1e0], ymm15 + ret + + .rodata +.Lymm0: + .rept 4; .quad 0x0000000000000000; .endr +.Lymm1: + .rept 4; .quad 0x1111111111111111; .endr +.Lymm2: + .rept 4; .quad 0x2222222222222222; .endr +.Lymm3: + .rept 4; .quad 0x3333333333333333; .endr +.Lymm4: + .rept 4; .quad 0x4444444444444444; .endr +.Lymm5: + .rept 4; .quad 0x5555555555555555; .endr +.Lymm6: + .rept 4; .quad 0x6666666666666666; .endr +.Lymm7: + .rept 4; .quad 0x7777777777777777; .endr +.Lymm8: + .rept 4; .quad 0x8888888888888888; .endr +.Lymm9: + .rept 4; .quad 0x9999999999999999; .endr +.Lymm10: + .rept 4; .quad 0xaaaaaaaaaaaaaaaa; .endr +.Lymm11: + .rept 4; .quad 0xbbbbbbbbbbbbbbbb; .endr +.Lymm12: + .rept 4; .quad 0xcccccccccccccccc; .endr +.Lymm13: + .rept 4; .quad 0xdddddddddddddddd; .endr +.Lymm14: + .rept 4; .quad 0xeeeeeeeeeeeeeeee; .endr +.Lymm15: + .rept 4; .quad 0xffffffffffffffff; .endr diff --git a/regress/sys/kern/ptrace/xstate/xstate.c b/regress/sys/kern/ptrace/xstate/xstate.c new file mode 100644 index 000000000..bee551463 --- /dev/null +++ b/regress/sys/kern/ptrace/xstate/xstate.c @@ -0,0 +1,259 @@ +/* $OpenBSD */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +struct cpuid { + uint32_t a, b, c, d; +}; + +struct xstate { + struct { + uint8_t buf[1024]; + uint32_t size; + } area; + + struct { + uint32_t supported; + uint32_t offset; + uint32_t size; + } components[3]; +#define XSTATE_COMPONENT_X87 0 +#define XSTATE_COMPONENT_SSE 1 +#define XSTATE_COMPONENT_AVX 2 +}; + +struct u128 { + uint64_t v[2]; +} __attribute__((packed)); + +struct ymm { + struct u128 xmm; + struct u128 ymm; +} __attribute__((packed)); + +extern void ymm_write(void); +extern void ymm_read(struct ymm[16]); + +static inline void +cpuid(uint32_t leaf, uint32_t subleaf, struct cpuid *out) +{ + __asm__("cpuid" + : "=a" (out->a), "=b" (out->b), "=c" (out->c), "=d" (out->d) + : "a" (leaf), "c" (subleaf)); +} + +static int +xstate_init(struct xstate *xstate, pid_t pid) +{ +#define CPUID_01_C_XSAVE_MASK (1 << 26) +#define XCR0_XMM_MASK (1 << 1) +#define XCR0_YMM_MASK (1 << 2) + + struct cpuid leaf; + struct ptrace_xstate_info info; + + cpuid(0x1, 0, &leaf); + if ((leaf.c & CPUID_01_C_XSAVE_MASK) == 0) { + printf("SKIPPED: XSAVE not enumerated"); + return 1; + } + + memset(xstate, 0, sizeof(*xstate)); + + if (ptrace(PT_GETXSTATE_INFO, pid, + (caddr_t)&info, sizeof(info)) == -1) + err(1, "ptrace: PT_GETXSTATE_INFO"); + if (info.xsave_len > sizeof(xstate->area.buf)) + errx(1, "xstate buffer too small"); + xstate->area.size = info.xsave_len; + + if ((info.xsave_mask & XCR0_XMM_MASK) == 0 || + (info.xsave_mask & XCR0_YMM_MASK) == 0) { + printf("SKIPPED: SSE/AVX disabled in XCR0\n"); + return 1; + } + + xstate->components[XSTATE_COMPONENT_SSE].supported = 1; + /* Part of legacy region in XSAVE area. */ + xstate->components[XSTATE_COMPONENT_SSE].offset = 160; + xstate->components[XSTATE_COMPONENT_SSE].size = 256; + + cpuid(0xd, XSTATE_COMPONENT_AVX, &leaf); + xstate->components[XSTATE_COMPONENT_AVX].supported = 1; + xstate->components[XSTATE_COMPONENT_AVX].offset = leaf.b; + xstate->components[XSTATE_COMPONENT_AVX].size = leaf.a; + + return 0; +} + +static void +xstate_ymm_read(struct xstate *xstate, int regno, struct ymm *rd) +{ + struct u128 *xmm = (struct u128 *)(xstate->area.buf + + xstate->components[XSTATE_COMPONENT_SSE].offset); + struct u128 *ymm = (struct u128 *)(xstate->area.buf + + xstate->components[XSTATE_COMPONENT_AVX].offset); + + rd->xmm = xmm[regno]; + rd->ymm = ymm[regno]; +} + +static void +xstate_ymm_write(struct xstate *xstate, int regno, struct ymm *wr) +{ + struct u128 *xmm = (struct u128 *)(xstate->area.buf + + xstate->components[XSTATE_COMPONENT_SSE].offset); + struct u128 *ymm = (struct u128 *)(xstate->area.buf + + xstate->components[XSTATE_COMPONENT_AVX].offset); + + xmm[regno] = wr->xmm; + ymm[regno] = wr->ymm; +} + +static void +wait_until_stopped(pid_t pid) +{ + int status; + + if (waitpid(pid, &status, 0) == -1) + err(1, "waitpid"); + if (!WIFSTOPPED(status)) + errx(1, "expected traced process to be stopped"); +} + +static int +check_ymm(const struct ymm ymm[16]) +{ + int error = 0; + int i; + + for (i = 0; i < 16; i++) { + struct ymm exp; + + memset(&exp, (i << 4) | i, 32); + if (memcmp(&exp, &ymm[i], 32) == 0) + continue; + + warnx("ymm%d: expected %016llx%016llx%016llx%016llx," + " got %016llx%016llx%016llx%016llx", i, + exp.ymm.v[1], exp.ymm.v[0], + exp.xmm.v[1], exp.xmm.v[0], + ymm[i].ymm.v[1], ymm[i].ymm.v[0], + ymm[i].xmm.v[1], ymm[i].xmm.v[0]); + error = 1; + } + + return error; +} + +static int +test_ymm_get(struct xstate *xstate) +{ + struct ymm ymm[16]; + pid_t pid; + int i; + + pid = fork(); + if (pid == 0) { + ptrace(PT_TRACE_ME, 0, 0, 0); + ymm_write(); + raise(SIGSTOP); + /* UNREACHABLE */ + } + + wait_until_stopped(pid); + + if (xstate_init(xstate, pid)) + return 0; + + if (ptrace(PT_GETXSTATE, pid, + xstate->area.buf, xstate->area.size) == -1) + err(1, "ptrace: PT_GETXSTATE"); + for (i = 0; i < 16; i++) + xstate_ymm_read(xstate, i, &ymm[i]); + return check_ymm(ymm); +} + +static int +test_ymm_set(struct xstate *xstate) +{ + pid_t pid; + int i, status; + + pid = fork(); + if (pid == 0) { + struct ymm ymm[16]; + + ptrace(PT_TRACE_ME, 0, 0, 0); + raise(SIGSTOP); + ymm_read(ymm); + _exit(check_ymm(ymm)); + } + + wait_until_stopped(pid); + + if (xstate_init(xstate, pid)) + return 0; + + if (ptrace(PT_GETXSTATE, pid, + xstate->area.buf, xstate->area.size) == -1) + err(1, "ptrace: PT_GETXSTATE"); + for (i = 0; i < 16; i++) { + struct ymm ymm; + + memset(&ymm, (i << 4) | i, 32); + xstate_ymm_write(xstate, i, &ymm); + } + + if (ptrace(PT_SETXSTATE, pid, + xstate->area.buf, xstate->area.size) == -1) + err(1, "ptrace: PT_SETXSTATE"); + + if (ptrace(PT_CONTINUE, pid, (caddr_t)1, 0) == -1) + err(1, "ptrace: PT_CONTINUE"); + if (waitpid(pid, &status, 0) == -1) + err(1, "waitpid"); + return WIFEXITED(status) && WEXITSTATUS(status) == 0 ? 0 : 1; +} + +static void __attribute__((noreturn)) +usage(void) +{ + fprintf(stderr, "usage: xstate test-case\n"); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + struct { + const char *name; + int (*test)(struct xstate *); + } tests[] = { + { "xstate-ymm-get", test_ymm_get }, + { "xstate-ymm-set", test_ymm_set }, + }; + struct xstate xstate; + unsigned int i; + + if (argc != 2) + usage(); + + for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++) { + if (strcmp(argv[1], tests[i].name) == 0) + return tests[i].test(&xstate); + } + + warnx("no such test case"); + return 1; +} diff --git a/regress/sys/kern/sosplice/tcp/args-unsplice-forked.pl b/regress/sys/kern/sosplice/tcp/args-unsplice-forked.pl index d1ef5490a..e9d715617 100644 --- a/regress/sys/kern/sosplice/tcp/args-unsplice-forked.pl +++ b/regress/sys/kern/sosplice/tcp/args-unsplice-forked.pl @@ -17,8 +17,10 @@ our %args = ( or die "relay func: fork failed: $!"; if ($pid == 0) { sleep 2; - setsplice(\*STDIN) - or die ref($self), " unsplice stdin failed: $!"; + if ($self->{forward} =~ /splice/) { + setsplice(\*STDIN) + or die ref($self), " unsplice stdin failed: $!"; + } POSIX::_exit(0); } sleep 1; diff --git a/regress/sys/kern/unfdpass/unfdpass.c b/regress/sys/kern/unfdpass/unfdpass.c index 0375a0150..f0f76c249 100644 --- a/regress/sys/kern/unfdpass/unfdpass.c +++ b/regress/sys/kern/unfdpass/unfdpass.c @@ -1,4 +1,4 @@ -/* $OpenBSD: unfdpass.c,v 1.24 2023/03/08 04:43:06 guenther Exp $ */ +/* $OpenBSD: unfdpass.c,v 1.25 2024/11/06 17:43:53 claudio Exp $ */ /* $NetBSD: unfdpass.c,v 1.3 1998/06/24 23:51:30 thorpej Exp $ */ /*- @@ -243,8 +243,7 @@ main(int argc, char *argv[]) } void -catch_sigchld(sig) - int sig; +catch_sigchld(int sig) { int save_errno = errno; int status; diff --git a/regress/sys/net/pf_opts/icmp.py b/regress/sys/net/pf_opts/icmp.py index 6c7b0877c..265e219af 100644 --- a/regress/sys/net/pf_opts/icmp.py +++ b/regress/sys/net/pf_opts/icmp.py @@ -4,6 +4,7 @@ print("send icmp without options") import os import sys +from struct import pack from addr import * from scapy.all import * @@ -21,4 +22,6 @@ payload=b"ABCDEFGHIJKLMNOP" packet=IP(src=ADDR, dst=ADDR)/ \ ICMP(type=6, id=eid)/payload -send(packet, iface=IF) +# send() does not work for some reason, add the bpf loopback layer manually +bpf=pack('!I', 2) + bytes(packet) +sendp(bpf, iface=IF) diff --git a/regress/sys/net/pf_opts/icmp6.py b/regress/sys/net/pf_opts/icmp6.py index 13223e620..f69c8210c 100644 --- a/regress/sys/net/pf_opts/icmp6.py +++ b/regress/sys/net/pf_opts/icmp6.py @@ -22,7 +22,6 @@ payload=b"ABCDEFGHIJKLMNOP" packet=IPv6(src=ADDR6, dst=ADDR6)/ \ ICMPv6Unknown(type=6, code=0, msgbody=payload) -# send does not work for some reason, add the bpf loopback layer manually -#send(packet) +# send() does not work for some reason, add the bpf loopback layer manually bpf=pack('!I', 24) + bytes(packet) sendp(bpf, iface=IF) diff --git a/regress/sys/net/pf_opts/icmp6_dst.py b/regress/sys/net/pf_opts/icmp6_dst.py index 4741d45fc..8f65bffde 100644 --- a/regress/sys/net/pf_opts/icmp6_dst.py +++ b/regress/sys/net/pf_opts/icmp6_dst.py @@ -23,7 +23,6 @@ packet=IPv6(src=ADDR6, dst=ADDR6)/ \ IPv6ExtHdrDestOpt()/ \ ICMPv6Unknown(type=6, code=0, msgbody=payload) -# send does not work for some reason, add the bpf loopback layer manually -#send(packet) +# send() does not work for some reason, add the bpf loopback layer manually bpf=pack('!I', 24) + bytes(packet) sendp(bpf, iface=IF) diff --git a/regress/sys/net/pf_opts/icmp6_hop.py b/regress/sys/net/pf_opts/icmp6_hop.py index 4d3de9685..e8045cb92 100644 --- a/regress/sys/net/pf_opts/icmp6_hop.py +++ b/regress/sys/net/pf_opts/icmp6_hop.py @@ -23,7 +23,6 @@ packet=IPv6(src=ADDR6, dst=ADDR6)/ \ IPv6ExtHdrHopByHop()/ \ ICMPv6Unknown(type=6, code=0, msgbody=payload) -# send does not work for some reason, add the bpf loopback layer manually -#send(packet) +# send() does not work for some reason, add the bpf loopback layer manually bpf=pack('!I', 24) + bytes(packet) sendp(bpf, iface=IF) diff --git a/regress/sys/net/pf_opts/icmp6_hop_bad.py b/regress/sys/net/pf_opts/icmp6_hop_bad.py index 173e7493f..798fee75e 100644 --- a/regress/sys/net/pf_opts/icmp6_hop_bad.py +++ b/regress/sys/net/pf_opts/icmp6_hop_bad.py @@ -23,7 +23,6 @@ packet=IPv6(src=ADDR6, dst=ADDR6)/ \ IPv6ExtHdrHopByHop(options=HBHOptUnknown(otype=3))/ \ ICMPv6Unknown(type=6, code=0, msgbody=payload) -# send does not work for some reason, add the bpf loopback layer manually -#send(packet) +# send() does not work for some reason, add the bpf loopback layer manually bpf=pack('!I', 24) + bytes(packet) sendp(bpf, iface=IF) diff --git a/regress/sys/net/pf_opts/icmp6_hop_max.py b/regress/sys/net/pf_opts/icmp6_hop_max.py index 9ebed74e3..4c44c9555 100644 --- a/regress/sys/net/pf_opts/icmp6_hop_max.py +++ b/regress/sys/net/pf_opts/icmp6_hop_max.py @@ -23,7 +23,6 @@ packet=IPv6(src=ADDR6, dst=ADDR6)/ \ IPv6ExtHdrHopByHop(options=[PadN(optdata=255*b"\x11")])/ \ ICMPv6Unknown(type=6, code=0, msgbody=payload) -# send does not work for some reason, add the bpf loopback layer manually -#send(packet) +# send() does not work for some reason, add the bpf loopback layer manually bpf=pack('!I', 24) + bytes(packet) sendp(bpf, iface=IF) diff --git a/regress/sys/net/pf_opts/icmp6_hop_pad.py b/regress/sys/net/pf_opts/icmp6_hop_pad.py index 0629a2848..4822a6503 100644 --- a/regress/sys/net/pf_opts/icmp6_hop_pad.py +++ b/regress/sys/net/pf_opts/icmp6_hop_pad.py @@ -23,7 +23,6 @@ packet=IPv6(src=ADDR6, dst=ADDR6)/ \ IPv6ExtHdrHopByHop(options=[Pad1(),PadN(optdata=b"\x11\x22"),Pad1()])/ \ ICMPv6Unknown(type=6, code=0, msgbody=payload) -# send does not work for some reason, add the bpf loopback layer manually -#send(packet) +# send() does not work for some reason, add the bpf loopback layer manually bpf=pack('!I', 24) + bytes(packet) sendp(bpf, iface=IF) diff --git a/regress/sys/net/pf_opts/icmp6_hop_ra.py b/regress/sys/net/pf_opts/icmp6_hop_ra.py index 04027e296..d6064371a 100644 --- a/regress/sys/net/pf_opts/icmp6_hop_ra.py +++ b/regress/sys/net/pf_opts/icmp6_hop_ra.py @@ -24,7 +24,6 @@ packet=IPv6(src=ADDR6, dst=ADDR6)/ \ PadN(optdata=b"\x11\x22\x33\x44\x55\x66")])/ \ ICMPv6Unknown(type=6, code=0, msgbody=payload) -# send does not work for some reason, add the bpf loopback layer manually -#send(packet) +# send() does not work for some reason, add the bpf loopback layer manually bpf=pack('!I', 24) + bytes(packet) sendp(bpf, iface=IF) diff --git a/regress/sys/net/pf_opts/icmp6_mld_bad.py b/regress/sys/net/pf_opts/icmp6_mld_bad.py index 9182ccafa..e6c2a6cec 100644 --- a/regress/sys/net/pf_opts/icmp6_mld_bad.py +++ b/regress/sys/net/pf_opts/icmp6_mld_bad.py @@ -22,7 +22,6 @@ packet=IPv6(src=ADDR6, dst="ff02::1", hlim=1)/ \ IPv6ExtHdrHopByHop(options=HBHOptUnknown(otype=3))/ \ ICMPv6MLQuery() -# send does not work for some reason, add the bpf loopback layer manually -#send(packet) +# send() does not work for some reason, add the bpf loopback layer manually bpf=pack('!I', 24) + bytes(packet) sendp(bpf, iface=IF) diff --git a/regress/sys/net/pf_opts/icmp6_mld_ra.py b/regress/sys/net/pf_opts/icmp6_mld_ra.py index b540a036d..bbe206174 100644 --- a/regress/sys/net/pf_opts/icmp6_mld_ra.py +++ b/regress/sys/net/pf_opts/icmp6_mld_ra.py @@ -22,7 +22,6 @@ packet=IPv6(src=ADDR6, dst="ff02::1", hlim=1)/ \ IPv6ExtHdrHopByHop(options=RouterAlert())/ \ ICMPv6MLQuery() -# send does not work for some reason, add the bpf loopback layer manually -#send(packet) +# send() does not work for some reason, add the bpf loopback layer manually bpf=pack('!I', 24) + bytes(packet) sendp(bpf, iface=IF) diff --git a/regress/sys/net/pf_opts/icmp_bad.py b/regress/sys/net/pf_opts/icmp_bad.py index ea3536959..5b7985c98 100644 --- a/regress/sys/net/pf_opts/icmp_bad.py +++ b/regress/sys/net/pf_opts/icmp_bad.py @@ -4,6 +4,7 @@ print("send icmp with unknown option") import os import sys +from struct import pack from addr import * from scapy.all import * @@ -21,4 +22,6 @@ payload=b"ABCDEFGHIJKLMNOP" packet=IP(src=ADDR, dst=ADDR, options=b"\003\004\000\000")/ \ ICMP(type=6, id=eid)/payload -send(packet, iface=IF) +# send() does not work for some reason, add the bpf loopback layer manually +bpf=pack('!I', 2) + bytes(packet) +sendp(bpf, iface=IF) diff --git a/regress/sys/net/pf_opts/icmp_eol.py b/regress/sys/net/pf_opts/icmp_eol.py index f0047d7e3..7a6018760 100644 --- a/regress/sys/net/pf_opts/icmp_eol.py +++ b/regress/sys/net/pf_opts/icmp_eol.py @@ -4,6 +4,7 @@ print("send icmp with option end of list") import os import sys +from struct import pack from addr import * from scapy.all import * @@ -21,4 +22,6 @@ payload=b"ABCDEFGHIJKLMNOP" packet=IP(src=ADDR, dst=ADDR, options=b"\001\000\001\001")/ \ ICMP(type=6, id=eid)/payload -send(packet, iface=IF) +# send() does not work for some reason, add the bpf loopback layer manually +bpf=pack('!I', 2) + bytes(packet) +sendp(bpf, iface=IF) diff --git a/regress/sys/net/pf_opts/icmp_max.py b/regress/sys/net/pf_opts/icmp_max.py index 8c5aaee33..7126a2d37 100644 --- a/regress/sys/net/pf_opts/icmp_max.py +++ b/regress/sys/net/pf_opts/icmp_max.py @@ -4,6 +4,7 @@ print("send icmp with maximum length option") import os import sys +from struct import pack from addr import * from scapy.all import * @@ -21,4 +22,6 @@ payload=b"ABCDEFGHIJKLMNOP" packet=IP(src=ADDR, dst=ADDR, options=40*b"\001")/ \ ICMP(type=6, id=eid)/payload -send(packet, iface=IF) +# send() does not work for some reason, add the bpf loopback layer manually +bpf=pack('!I', 2) + bytes(packet) +sendp(bpf, iface=IF) diff --git a/regress/sys/net/pf_opts/icmp_pad.py b/regress/sys/net/pf_opts/icmp_pad.py index 119050eff..563d0b224 100644 --- a/regress/sys/net/pf_opts/icmp_pad.py +++ b/regress/sys/net/pf_opts/icmp_pad.py @@ -4,6 +4,7 @@ print("send icmp with options padding") import os import sys +from struct import pack from addr import * from scapy.all import * @@ -21,4 +22,6 @@ payload=b"ABCDEFGHIJKLMNOP" packet=IP(src=ADDR, dst=ADDR, options=b"\001\001\001\001")/ \ ICMP(type=6, id=eid)/payload -send(packet, iface=IF) +# send() does not work for some reason, add the bpf loopback layer manually +bpf=pack('!I', 2) + bytes(packet) +sendp(bpf, iface=IF) diff --git a/regress/sys/net/pf_opts/icmp_ra.py b/regress/sys/net/pf_opts/icmp_ra.py index a9c4bc3bf..518f8579e 100644 --- a/regress/sys/net/pf_opts/icmp_ra.py +++ b/regress/sys/net/pf_opts/icmp_ra.py @@ -4,6 +4,7 @@ print("send icmp with router alert") import os import sys +from struct import pack from addr import * from scapy.all import * @@ -21,4 +22,6 @@ payload=b"ABCDEFGHIJKLMNOP" packet=IP(src=ADDR, dst=ADDR, options=b"\001\224\004\000\000\001\000\001")/ \ ICMP(type=6, id=eid)/payload -send(packet, iface=IF) +# send() does not work for some reason, add the bpf loopback layer manually +bpf=pack('!I', 2) + bytes(packet) +sendp(bpf, iface=IF) diff --git a/regress/sys/net/pf_opts/igmp_bad.py b/regress/sys/net/pf_opts/igmp_bad.py index 58714f293..fd03b9405 100644 --- a/regress/sys/net/pf_opts/igmp_bad.py +++ b/regress/sys/net/pf_opts/igmp_bad.py @@ -4,6 +4,7 @@ print("send internet group management protocol with unknown option") import os import sys +from struct import pack from addr import * from scapy.all import * from scapy.contrib.igmp import * @@ -21,4 +22,6 @@ eid=pid & 0xffff packet=IP(src=ADDR, dst="224.0.0.1", ttl=1, options=b"\003\004\000\000")/ \ IGMP(type=0x11) -send(packet, iface=IF) +# send() does not work for some reason, add the bpf loopback layer manually +bpf=pack('!I', 2) + bytes(packet) +sendp(bpf, iface=IF) diff --git a/regress/sys/net/pf_opts/igmp_ra.py b/regress/sys/net/pf_opts/igmp_ra.py index 92a2ebcf5..6a2de3388 100644 --- a/regress/sys/net/pf_opts/igmp_ra.py +++ b/regress/sys/net/pf_opts/igmp_ra.py @@ -4,6 +4,7 @@ print("send internet group management protocol with router alert") import os import sys +from struct import pack from addr import * from scapy.all import * from scapy.contrib.igmp import * @@ -21,4 +22,6 @@ eid=pid & 0xffff packet=IP(src=ADDR, dst="224.0.0.1", ttl=1, options=b"\224\004\000\000")/ \ IGMP(type=0x11) -send(packet, iface=IF) +# send() does not work for some reason, add the bpf loopback layer manually +bpf=pack('!I', 2) + bytes(packet) +sendp(bpf, iface=IF) diff --git a/regress/sys/net/pf_trans/Makefile b/regress/sys/net/pf_trans/Makefile index bc38214a6..6fe186368 100644 --- a/regress/sys/net/pf_trans/Makefile +++ b/regress/sys/net/pf_trans/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.2 2023/07/10 17:46:03 anton Exp $ +# $OpenBSD: Makefile,v 1.3 2024/11/06 17:53:23 bluhm Exp $ PROGS+= dev-limit PROGS+= iocmd-limit @@ -10,9 +10,32 @@ REGRESS_ROOT_TARGETS= run-regress-dev-limit \ TIMEOUT?= 10 +.include + +.if ! (make(clean) || make(cleandir) || make(obj)) + +PF_STATUS != ${SUDO} /sbin/pfctl -si | sed -n 's/^Status: \([^ ]*\) .*/\1/p' +.if empty(PF_STATUS:MEnabled) +regress: + @echo pf status: "${PF_STATUS}" + @echo Enable pf to run this regress. + @echo SKIPPED +.endif + +PF_ANCHOR != ${SUDO} /sbin/pfctl -sr |\ + sed -n 's/^anchor "\([^"]*\)" all$$/\1/p' +.if empty(PF_ANCHOR:Mregress) +regress: + @echo pf anchor: "${PF_ANCHOR}" + @echo Need anchor '"regress"' in pf.conf to load additional rules. + @echo SKIPPED +.endif + +.endif + # # Create 2048 processes. Each child process will attempt -# open /dev/pf and waith for 10secs on success. If +# open /dev/pf and wait for 10 secs on success. If # /dev/pf can not be opened child exits immediately. # There should be 1023 children, which could open /dev/pf. # diff --git a/regress/sys/netinet/Makefile b/regress/sys/netinet/Makefile index 6f4da8495..d73430b9a 100644 --- a/regress/sys/netinet/Makefile +++ b/regress/sys/netinet/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.9 2023/12/06 14:41:52 bluhm Exp $ +# $OpenBSD: Makefile,v 1.10 2025/01/06 00:05:04 bluhm Exp $ SUBDIR += arp autoport SUBDIR += bindconnect broadcast_bind @@ -9,5 +9,6 @@ SUBDIR += mcast SUBDIR += pmtu SUBDIR += recvmsg SUBDIR += sendsrcaddr +SUBDIR += tcpthread .include diff --git a/regress/sys/netinet/tcpthread/Makefile b/regress/sys/netinet/tcpthread/Makefile new file mode 100644 index 000000000..b93669538 --- /dev/null +++ b/regress/sys/netinet/tcpthread/Makefile @@ -0,0 +1,46 @@ +# $OpenBSD: Makefile,v 1.2 2025/01/06 22:25:38 bluhm Exp $ + +PROG= tcpthread +LDADD= -lpthread +DPADD= ${LIBPTHREAD} +WARNINGS= yes + +CLEANFILES= ktrace.out + +REGRESS_SETUP += ${PROG} + +REGRESS_TARGETS += run-default +run-default: + time ${KTRACE} ./${PROG} + +REGRESS_TARGETS += run-sock100 +run-sock100: + ulimit -n 500; time ${KTRACE} ./${PROG} -n100 + +REGRESS_TARGETS += run-splice +run-splice: + time ${KTRACE} ./${PROG} -n10 -S2 + +REGRESS_TARGETS += run-unsplice +run-unsplice: + time ${KTRACE} ./${PROG} -n10 -S2 -U1 + +REGRESS_TARGETS += run-max +run-max: + time ${KTRACE} ./${PROG} -n10 -S4 -M100 -s2 -r2 + +REGRESS_TARGETS += run-idle +run-idle: + time ${KTRACE} ./${PROG} -n10 -S4 -I100 -s2 -r2 + +REGRESS_ROOT_TARGETS += run-drop +REGRESS_TARGETS += run-drop +run-drop: + time ${SUDO} ${KTRACE} ./${PROG} -n10 -D3 -o0 + +REGRESS_ROOT_TARGETS += run-splicedrop +REGRESS_TARGETS += run-splicedrop +run-splicedrop: + time ${SUDO} ${KTRACE} ./${PROG} -n10 -S2 -D3 -o0 + +.include diff --git a/regress/sys/netinet/tcpthread/README b/regress/sys/netinet/tcpthread/README new file mode 100644 index 000000000..19527c5a2 --- /dev/null +++ b/regress/sys/netinet/tcpthread/README @@ -0,0 +1,7 @@ +Spawn multiple threads and run system calls on TCP socket in parallel. + +Setup TCP connections on localhost and run system calls connect(2), +accept(2), send(2), recv(2), and close(2) in parallel. In addition +stress test for socket splicing, unsplice, max length and idle +timeout can run. Alternatively to close(2) the tcp drop sysctl(2) +can be used. The successful operations are counted. diff --git a/regress/sys/netinet/tcpthread/tcpthread.c b/regress/sys/netinet/tcpthread/tcpthread.c new file mode 100644 index 000000000..8221f6bd6 --- /dev/null +++ b/regress/sys/netinet/tcpthread/tcpthread.c @@ -0,0 +1,885 @@ +/* $OpenBSD: tcpthread.c,v 1.2 2025/01/06 22:25:38 bluhm Exp $ */ + +/* + * Copyright (c) 2025 Alexander Bluhm + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +static const struct timespec time_1000ns = { 0, 1000 }; +static const struct timeval time_1us = { 0, 1 }; + +union sockaddr_union { + struct sockaddr su_sa; + struct sockaddr_in su_sin; + struct sockaddr_in6 su_sin6; +}; + +unsigned int run_time = 10; +unsigned int sock_num = 1; +unsigned int connect_num = 1, accept_num = 1, send_num = 1, recv_num = 1, + close_num = 1, splice_num = 0, unsplice_num = 0, drop_num = 0; +int max_percent = 0, idle_percent = 0; +volatile unsigned long max_count = 0, idle_count = 0; +int *listen_socks, *splice_listen_socks; +volatile int *connect_socks, *accept_socks, + *splice_accept_socks, *splice_connect_socks; +union sockaddr_union *listen_addrs, *splice_listen_addrs; +struct tcp_ident_mapping *accept_tims, *splice_accept_tims; +struct sockaddr_in sin_loopback; +struct sockaddr_in6 sin6_loopback; + +static void __dead +usage(void) +{ + fprintf(stderr, + "tcpthread [-a accept] [-c connect] [-D drop] [-I idle] [-M max] " + "[-n num] [-o close] [-r recv] [-S splice] [-s send] [-t time] " + "[-U unsplice]\n" + " -a accept threads accepting sockets, default %u\n" + " -c connect threads connecting sockets, default %u\n" + " -D drop threads dropping TCP connections, default %u\n" + " -I idle percent with splice idle time, default %u\n" + " -M max percent with splice max lenght, default %d\n" + " -n num number of file descriptors, default %d\n" + " -o close threads closing sockets, default %u\n" + " -r recv threads receiving data, default %u\n" + " -S splice threads splicing sockets, default %u\n" + " -s send threads sending data, default %u\n" + " -t time run time in seconds, default %u\n" + " -U unsplice threads running unsplice, default %u\n", + accept_num, connect_num, drop_num, idle_percent, max_percent, + sock_num, close_num, recv_num, splice_num, send_num, run_time, + unsplice_num); + exit(2); +} + +static volatile int * +random_socket(unsigned int *seed) +{ + static volatile int **sockets[] = { + &connect_socks, + &accept_socks, + &splice_accept_socks, + &splice_connect_socks, + }; + volatile int **socksp; + + socksp = sockets[(rand_r(seed) % ((splice_num > 0) ? 4 : 2))]; + + return &(*socksp)[rand_r(seed) % sock_num]; +} + +static int +connect_socket(volatile int *connectp, struct sockaddr *addr) +{ + int sock; + + if (*connectp != -1) { + /* still connected, not closed */ + return 0; + } + /* connect to random listen socket */ + sock = socket(addr->sa_family, SOCK_STREAM | SOCK_NONBLOCK, + IPPROTO_TCP); + if (sock < 0) + err(1, "%s: socket", __func__); + if (connect(sock, addr, addr->sa_len) < 0 && + errno != EINPROGRESS) { + err(1, "%s: connect %d", __func__, sock); + } + if ((int)atomic_cas_uint(connectp, -1, sock) != -1) { + /* another thread has connect slot n */ + if (close(sock) < 0) + err(1, "%s: close %d", __func__, sock); + return 0; + } + return 1; +} + +static void * +connect_routine(void *arg) +{ + volatile int *run = arg; + unsigned long count = 0; + struct sockaddr *addr; + unsigned int seed; + unsigned int n; + int connected; + + seed = arc4random(); + + while (*run) { + connected = 0; + for (n = 0; n < sock_num; n++) { + addr = &((splice_num > 0) ? + splice_listen_addrs : listen_addrs) + [rand_r(&seed) % sock_num].su_sa; + if (!connect_socket(&connect_socks[n], addr)) + continue; + connected = 1; + count++; + } + if (!connected) { + /* all sockets were connected, wait a bit */ + if (nanosleep(&time_1000ns, NULL) < 0) + err(1, "%s: nanosleep", __func__); + } + } + + return (void *)count; +} + +static int +accept_socket(volatile int *acceptp, int *listens, + struct tcp_ident_mapping *tim, union sockaddr_union *addrs) +{ + unsigned int i; + int sock; + struct sockaddr *sa; + socklen_t len; + + if (*acceptp != -1) { + /* still accepted, not closed */ + return 0; + } + sock = -1; + for (i = 0; i < sock_num; i++) { + sa = (struct sockaddr *)&tim->faddr; + len = sizeof(tim->faddr); + sock = accept4(listens[i], sa, &len, SOCK_NONBLOCK); + if (sock < 0) { + if (errno == EWOULDBLOCK) { + /* no connection to accept */ + continue; + } + err(1, "%s: accept %d", __func__, listens[i]); + } + sa = &addrs[i].su_sa; + memcpy(&tim->laddr, sa, sa->sa_len); + break; + } + if (sock == -1) { + /* all listen sockets block, wait a bit */ + if (nanosleep(&time_1000ns, NULL) < 0) + err(1, "%s: nanosleep", __func__); + return 0; + } + membar_producer(); + if ((int)atomic_cas_uint(acceptp, -1, sock) != -1) { + /* another thread has accepted slot n */ + if (close(sock) < 0) + err(1, "%s: close %d", __func__, sock); + return 0; + } + return 1; +} + +static void * +accept_routine(void *arg) +{ + volatile int *run = arg; + unsigned long count = 0; + unsigned int n; + int accepted; + + while (*run) { + accepted = 0; + for (n = 0; n < sock_num; n++) { + if (!accept_socket(&accept_socks[n], listen_socks, + &accept_tims[n], listen_addrs)) + continue; + accepted = 1; + count++; + } + if (!accepted) { + /* all sockets were accepted, wait a bit */ + if (nanosleep(&time_1000ns, NULL) < 0) + err(1, "%s: nanosleep", __func__); + } + } + + return (void *)count; +} + +static void * +send_routine(void *arg) +{ + volatile int *run = arg; + unsigned long count = 0; + unsigned int seed; + char buf[1024]; /* 1 KB */ + volatile int *sockp; + int sock; + + seed = arc4random(); + + while (*run) { + sockp = random_socket(&seed); + sock = *sockp; + if (sock == -1) + continue; + if (send(sock, buf, sizeof(buf), 0) < 0) { + if (errno == EWOULDBLOCK) + continue; + if (errno == EFBIG) + atomic_inc_long(&max_count); + if (errno == ETIMEDOUT) + atomic_inc_long(&idle_count); + if ((int)atomic_cas_uint(sockp, sock, -1) != sock) { + /* another thread has closed sockp */ + continue; + } + if (close(sock) < 0) + err(1, "%s: close %d", __func__, sock); + } + count++; + } + + return (void *)count; +} + +static void * +recv_routine(void *arg) +{ + volatile int *run = arg; + unsigned long count = 0; + unsigned int seed; + char buf[10*1024]; /* 10 KB */ + volatile int *sockp; + int sock; + + seed = arc4random(); + + while (*run) { + sockp = &((rand_r(&seed) % 2) ? connect_socks : accept_socks) + [rand_r(&seed) % sock_num]; + sock = *sockp; + if (sock == -1) + continue; + errno = 0; + if (recv(sock, buf, sizeof(buf), 0) <= 0) { + if (errno == EWOULDBLOCK) + continue; + if (errno == EFBIG) + atomic_inc_long(&max_count); + if (errno == ETIMEDOUT) + atomic_inc_long(&idle_count); + if ((int)atomic_cas_uint(sockp, sock, -1) != sock) { + /* another thread has closed sockp */ + continue; + } + if (close(sock) < 0) + err(1, "%s: close %d", __func__, sock); + } + count++; + } + + return (void *)count; +} + +static void * +close_routine(void *arg) +{ + volatile int *run = arg; + unsigned long count = 0; + unsigned int seed; + volatile int *sockp; + int sock; + + seed = arc4random(); + + while (*run) { + sockp = random_socket(&seed); + if (*sockp == -1) + continue; + sock = atomic_swap_uint(sockp, -1); + if (sock == -1) { + /* another thead has closed the socket, wait a bit */ + if (nanosleep(&time_1000ns, NULL) < 0) + err(1, "%s: nanosleep", __func__); + continue; + } + if (close(sock) < 0) + err(1, "%s: close %d", __func__, sock); + count++; + } + + return (void *)count; +} + +static void * +splice_routine(void *arg) +{ + volatile int *run = arg; + unsigned long count = 0; + struct sockaddr *addr; + unsigned int seed; + unsigned int n; + int sock; + struct splice accept_splice, connect_splice; + int spliced; + + seed = arc4random(); + + while (*run) { + spliced = 0; + for (n = 0; n < sock_num; n++) { + if (!accept_socket(&splice_accept_socks[n], + splice_listen_socks, + &splice_accept_tims[n], splice_listen_addrs)) + continue; + /* free the matching connect slot */ + sock = atomic_swap_uint(&splice_connect_socks[n], -1); + if (sock != -1) { + if (close(sock) < 0) + err(1, "%s: close %d", __func__, sock); + } + addr = &listen_addrs[rand_r(&seed) % sock_num].su_sa; + if (!connect_socket(&splice_connect_socks[n], addr)) { + /* close the accepted socket */ + sock = atomic_swap_uint( + &splice_accept_socks[n], -1); + if (sock != -1) { + if (close(sock) < 0) { + err(1, "%s: close %d", + __func__, sock); + } + } + continue; + } + memset(&accept_splice, 0, sizeof(accept_splice)); + memset(&connect_splice, 0, sizeof(connect_splice)); + accept_splice.sp_fd = splice_accept_socks[n]; + connect_splice.sp_fd = splice_connect_socks[n]; + if ((rand_r(&seed) % 100) < max_percent) { + accept_splice.sp_max = 1; + connect_splice.sp_max = 1; + } + if ((rand_r(&seed) % 100) < idle_percent) { + accept_splice.sp_idle = time_1us; + connect_splice.sp_idle = time_1us; + } + if (accept_splice.sp_fd == -1 || + connect_splice.sp_fd == -1 || + setsockopt(accept_splice.sp_fd, + SOL_SOCKET, SO_SPLICE, + &connect_splice, sizeof(connect_splice)) < 0 || + setsockopt(connect_splice.sp_fd, + SOL_SOCKET, SO_SPLICE, + &accept_splice, sizeof(accept_splice)) < 0) { + /* close the accepted and connected socket */ + sock = atomic_swap_uint( + &splice_accept_socks[n], -1); + if (sock != -1) { + if (close(sock) < 0) { + err(1, "%s: close %d", + __func__, sock); + } + } + sock = atomic_swap_uint( + &splice_connect_socks[n], -1); + if (sock != -1) { + if (close(sock) < 0) { + err(1, "%s: close %d", + __func__, sock); + } + } + continue; + } + spliced = 1; + count++; + } + if (!spliced) { + /* splicing for all sockets failed, wait a bit */ + if (nanosleep(&time_1000ns, NULL) < 0) + err(1, "%s: nanosleep", __func__); + } + } + + return (void *)count; +} + +static void * +unsplice_routine(void *arg) +{ + volatile int *run = arg; + unsigned long count = 0; + unsigned int seed; + volatile int *sockp; + int sock; + + seed = arc4random(); + + while (*run) { + sockp = &((rand_r(&seed) % 2) ? + splice_accept_socks : splice_connect_socks) + [rand_r(&seed) % sock_num]; + sock = *sockp; + if (sock == -1) + continue; + if (setsockopt(sock, SOL_SOCKET, SO_SPLICE, NULL, 0) < 0) { + if ((int)atomic_cas_uint(sockp, sock, -1) != sock) { + /* another thread has closed sockp */ + continue; + } + if (close(sock) < 0) + err(1, "%s: close %d", __func__, sock); + } + count++; + } + + return (void *)count; +} + +static void * +drop_routine(void *arg) +{ + static const int mib[] = { CTL_NET, PF_INET, IPPROTO_TCP, TCPCTL_DROP }; + volatile int *run = arg; + unsigned long count = 0; + unsigned int seed, n; + volatile int *socks; + struct tcp_ident_mapping *tims; + + seed = arc4random(); + + while (*run) { + if (splice_num > 0 && (rand_r(&seed) % 2)) { + socks = splice_accept_socks; + tims = splice_accept_tims; + } else { + socks = accept_socks; + tims = accept_tims; + } + n = rand_r(&seed) % sock_num; + if (socks[n] == -1) + continue; + membar_consumer(); + /* accept_tims is not MP safe, but only ESRCH may happen */ + if (sysctl(mib, sizeof(mib) / sizeof(mib[0]), NULL, NULL, + &tims[n], sizeof(tims[0])) < 0) { + if (errno == ESRCH) + continue; + err(1, "sysctl TCPCTL_DROP"); + } + count++; + } + + return (void *)count; +} + +int +main(int argc, char *argv[]) +{ + pthread_t *connect_thread, *accept_thread, *send_thread, *recv_thread, + *close_thread, *splice_thread, *unsplice_thread, *drop_thread; + struct sockaddr *sa; + const char *errstr; + unsigned int seed; + int ch, run; + unsigned int n; + unsigned long connect_count, accept_count, send_count, recv_count, + close_count, splice_count, unsplice_count, drop_count; + socklen_t len; + + seed = arc4random(); + + while ((ch = getopt(argc, argv, "a:c:D:I:M:n:o:r:S:s:t:U:")) != -1) { + switch (ch) { + case 'a': + accept_num = strtonum(optarg, 0, UINT_MAX, &errstr); + if (errstr != NULL) + errx(1, "accept is %s: %s", errstr, optarg); + break; + case 'c': + connect_num = strtonum(optarg, 0, UINT_MAX, &errstr); + if (errstr != NULL) + errx(1, "connect is %s: %s", errstr, optarg); + break; + case 'D': + drop_num = strtonum(optarg, 0, UINT_MAX, &errstr); + if (errstr != NULL) + errx(1, "drop is %s: %s", errstr, optarg); + break; + case 'I': + idle_percent = strtonum(optarg, 0, 100, &errstr); + if (errstr != NULL) + errx(1, "idle is %s: %s", errstr, optarg); + break; + case 'M': + max_percent = strtonum(optarg, 0, 100, &errstr); + if (errstr != NULL) + errx(1, "max is %s: %s", errstr, optarg); + break; + case 'n': + sock_num = strtonum(optarg, 1, INT_MAX, &errstr); + if (errstr != NULL) + errx(1, "num is %s: %s", errstr, optarg); + break; + case 'o': + close_num = strtonum(optarg, 0, UINT_MAX, &errstr); + if (errstr != NULL) + errx(1, "close is %s: %s", errstr, optarg); + break; + case 'r': + recv_num = strtonum(optarg, 0, UINT_MAX, &errstr); + if (errstr != NULL) + errx(1, "recv is %s: %s", errstr, optarg); + break; + case 'S': + splice_num = strtonum(optarg, 0, UINT_MAX, &errstr); + if (errstr != NULL) + errx(1, "splice is %s: %s", errstr, optarg); + break; + case 's': + send_num = strtonum(optarg, 0, UINT_MAX, &errstr); + if (errstr != NULL) + errx(1, "send is %s: %s", errstr, optarg); + break; + case 't': + run_time = strtonum(optarg, 0, UINT_MAX, &errstr); + if (errstr != NULL) + errx(1, "time is %s: %s", errstr, optarg); + break; + case 'U': + unsplice_num = strtonum(optarg, 0, UINT_MAX, &errstr); + if (errstr != NULL) + errx(1, "unsplice is %s: %s", errstr, optarg); + break; + default: + usage(); + } + } + argc -= optind; + argv += optind; + if (argc > 0) + usage(); + + if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) + err(1, "signal"); + + sin_loopback.sin_family = AF_INET; + sin_loopback.sin_len = sizeof(sin_loopback); + sin_loopback.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + + sin6_loopback.sin6_family = AF_INET6; + sin6_loopback.sin6_len = sizeof(sin6_loopback); + sin6_loopback.sin6_addr = in6addr_loopback; + + listen_socks = reallocarray(NULL, sock_num, sizeof(int)); + if (listen_socks == NULL) + err(1, "listen_socks"); + connect_socks = reallocarray(NULL, sock_num, sizeof(int)); + if (connect_socks == NULL) + err(1, "connect_socks"); + accept_socks = reallocarray(NULL, sock_num, sizeof(int)); + if (accept_socks == NULL) + err(1, "accept_socks"); + for (n = 0; n < sock_num; n++) + listen_socks[n] = connect_socks[n] = accept_socks[n] = -1; + listen_addrs = calloc(sock_num, sizeof(listen_addrs[0])); + if (listen_addrs == NULL) + err(1, "listen_addrs"); + accept_tims = calloc(sock_num, sizeof(accept_tims[0])); + if (accept_tims == NULL) + err(1, "accept_tims"); + if (splice_num > 0) { + splice_listen_socks = reallocarray(NULL, sock_num, sizeof(int)); + if (splice_listen_socks == NULL) + err(1, "splice_listen_socks"); + splice_accept_socks = reallocarray(NULL, sock_num, sizeof(int)); + if (splice_accept_socks == NULL) + err(1, "splice_accept_socks"); + splice_connect_socks = + reallocarray(NULL, sock_num, sizeof(int)); + if (splice_connect_socks == NULL) + err(1, "splice_connect_socks"); + for (n = 0; n < sock_num; n++) { + splice_listen_socks[n] = splice_accept_socks[n] = + splice_connect_socks[n] = -1; + } + splice_listen_addrs = calloc(sock_num, + sizeof(splice_listen_addrs[0])); + if (splice_listen_addrs == NULL) + err(1, "splice_listen_addrs"); + splice_accept_tims = calloc(sock_num, + sizeof(splice_accept_tims[0])); + if (splice_accept_tims == NULL) + err(1, "splice_accept_tims"); + } + + for (n = 0; n < sock_num; n++) { + int af; + + af = (rand_r(&seed) % 2) ? AF_INET : AF_INET6; + listen_socks[n] = socket(af, SOCK_STREAM | SOCK_NONBLOCK, + IPPROTO_TCP); + if (listen_socks[n] < 0) + err(1, "socket"); + if (af == AF_INET) + sa = (struct sockaddr *)&sin_loopback; + if (af == AF_INET6) + sa = (struct sockaddr *)&sin6_loopback; + if (bind(listen_socks[n], sa, sa->sa_len) < 0) + err(1, "bind"); + len = sizeof(listen_addrs[n]); + if (getsockname(listen_socks[n], &listen_addrs[n].su_sa, &len) + < 0) + err(1, "getsockname"); + if (listen(listen_socks[n], 128) < 0) + err(1, "listen"); + + if (splice_num > 0) { + af = (rand_r(&seed) % 2) ? AF_INET : AF_INET6; + splice_listen_socks[n] = socket(af, + SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP); + if (splice_listen_socks[n] < 0) + err(1, "socket"); + if (af == AF_INET) + sa = (struct sockaddr *)&sin_loopback; + if (af == AF_INET6) + sa = (struct sockaddr *)&sin6_loopback; + if (bind(splice_listen_socks[n], sa, sa->sa_len) < 0) + err(1, "bind"); + len = sizeof(splice_listen_addrs[n]); + if (getsockname(splice_listen_socks[n], + &splice_listen_addrs[n].su_sa, &len) < 0) + err(1, "getsockname"); + if (listen(splice_listen_socks[n], 128) < 0) + err(1, "listen"); + } + } + + run = 1; + + connect_thread = calloc(connect_num, sizeof(pthread_t)); + if (connect_thread == NULL) + err(1, "connect_thread"); + for (n = 0; n < connect_num; n++) { + errno = pthread_create(&connect_thread[n], NULL, + connect_routine, &run); + if (errno) + err(1, "pthread_create connect %u", n); + } + + accept_thread = calloc(accept_num, sizeof(pthread_t)); + if (accept_thread == NULL) + err(1, "accept_thread"); + for (n = 0; n < accept_num; n++) { + errno = pthread_create(&accept_thread[n], NULL, + accept_routine, &run); + if (errno) + err(1, "pthread_create accept %u", n); + } + + send_thread = calloc(send_num, sizeof(pthread_t)); + if (send_thread == NULL) + err(1, "send_thread"); + for (n = 0; n < send_num; n++) { + errno = pthread_create(&send_thread[n], NULL, + send_routine, &run); + if (errno) + err(1, "pthread_create send %u", n); + } + + recv_thread = calloc(recv_num, sizeof(pthread_t)); + if (recv_thread == NULL) + err(1, "recv_thread"); + for (n = 0; n < recv_num; n++) { + errno = pthread_create(&recv_thread[n], NULL, + recv_routine, &run); + if (errno) + err(1, "pthread_create recv %u", n); + } + + close_thread = calloc(close_num, sizeof(pthread_t)); + if (close_thread == NULL) + err(1, "close_thread"); + for (n = 0; n < close_num; n++) { + errno = pthread_create(&close_thread[n], NULL, + close_routine, &run); + if (errno) + err(1, "pthread_create close %u", n); + } + + if (splice_num > 0) { + splice_thread = calloc(splice_num, sizeof(pthread_t)); + if (splice_thread == NULL) + err(1, "splice_thread"); + for (n = 0; n < splice_num; n++) { + errno = pthread_create(&splice_thread[n], NULL, + splice_routine, &run); + if (errno) + err(1, "pthread_create splice %u", n); + } + + unsplice_thread = calloc(unsplice_num, sizeof(pthread_t)); + if (unsplice_thread == NULL) + err(1, "unsplice_thread"); + for (n = 0; n < unsplice_num; n++) { + errno = pthread_create(&unsplice_thread[n], NULL, + unsplice_routine, &run); + if (errno) + err(1, "pthread_create unsplice %u", n); + } + } + drop_thread = calloc(drop_num, sizeof(pthread_t)); + if (drop_thread == NULL) + err(1, "drop_thread"); + for (n = 0; n < drop_num; n++) { + errno = pthread_create(&drop_thread[n], NULL, + drop_routine, &run); + if (errno) + err(1, "pthread_create drop %u", n); + } + + if (run_time > 0) { + if (sleep(run_time) < 0) + err(1, "sleep %u", run_time); + } + run = 0; + + connect_count = 0; + for (n = 0; n < connect_num; n++) { + unsigned long count; + + errno = pthread_join(connect_thread[n], (void **)&count); + if (errno) + err(1, "pthread_join connect %u", n); + connect_count += count; + } + free(connect_thread); + + accept_count = 0; + for (n = 0; n < accept_num; n++) { + unsigned long count; + + errno = pthread_join(accept_thread[n], (void **)&count); + if (errno) + err(1, "pthread_join accept %u", n); + accept_count += count; + } + free(accept_thread); + + send_count = 0; + for (n = 0; n < send_num; n++) { + unsigned long count; + + errno = pthread_join(send_thread[n], (void **)&count); + if (errno) + err(1, "pthread_join send %u", n); + send_count += count; + } + free(send_thread); + + recv_count = 0; + for (n = 0; n < recv_num; n++) { + unsigned long count; + + errno = pthread_join(recv_thread[n], (void **)&count); + if (errno) + err(1, "pthread_join recv %u", n); + recv_count += count; + } + free(recv_thread); + + close_count = 0; + for (n = 0; n < close_num; n++) { + unsigned long count; + + errno = pthread_join(close_thread[n], (void **)&count); + if (errno) + err(1, "pthread_join close %u", n); + close_count += count; + } + free(close_thread); + + if (splice_num > 0) { + splice_count = 0; + for (n = 0; n < splice_num; n++) { + unsigned long count; + + errno = pthread_join(splice_thread[n], (void **)&count); + if (errno) + err(1, "pthread_join splice %u", n); + splice_count += count; + } + free(splice_thread); + + unsplice_count = 0; + for (n = 0; n < unsplice_num; n++) { + unsigned long count; + + errno = pthread_join(unsplice_thread[n], + (void **)&count); + if (errno) + err(1, "pthread_join unsplice %u", n); + unsplice_count += count; + } + free(unsplice_thread); + } + drop_count = 0; + for (n = 0; n < drop_num; n++) { + unsigned long count; + + errno = pthread_join(drop_thread[n], (void **)&count); + if (errno) + err(1, "pthread_join drop %u", n); + drop_count += count; + } + free(drop_thread); + + free((int *)listen_socks); + free((int *)connect_socks); + free((int *)accept_socks); + free(listen_addrs); + free(accept_tims); + if (splice_num > 0) { + free((int *)splice_listen_socks); + free((int *)splice_accept_socks); + free((int *)splice_connect_socks); + free(splice_listen_addrs); + free(splice_accept_tims); + } + + printf("count: connect %lu, ", connect_count); + if (splice_num > 0) { + printf("splice %lu, unsplice %lu, max %lu, idle %lu, ", + splice_count, unsplice_count, max_count, idle_count); + } + printf("accept %lu, send %lu, recv %lu, close %lu, drop %lu\n", + accept_count, send_count, recv_count, close_count, drop_count); + + return 0; +} diff --git a/regress/usr.bin/ftp/Makefile b/regress/usr.bin/ftp/Makefile index a1138ba3e..e0c7f5994 100644 --- a/regress/usr.bin/ftp/Makefile +++ b/regress/usr.bin/ftp/Makefile @@ -1,9 +1,11 @@ -# $OpenBSD: Makefile,v 1.3 2023/12/13 12:14:10 kn Exp $ +# $OpenBSD: Makefile,v 1.4 2024/12/29 06:43:33 anton Exp $ REGRESS_TARGETS= \ ${DASHO_TARGETS:C/^/t-dasho-/} \ ${REDIRECT_TARGETS:C/^/t-redirect-/} +CLEANFILES= *.log + dfile=file:../src/- xfile=file:../src/X diff --git a/regress/usr.bin/ftp/redirect.sh b/regress/usr.bin/ftp/redirect.sh index 95df74c1e..c553009d2 100644 --- a/regress/usr.bin/ftp/redirect.sh +++ b/regress/usr.bin/ftp/redirect.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $OpenBSD: redirect.sh,v 1.6 2017/01/23 23:10:35 bluhm Exp $ +# $OpenBSD: redirect.sh,v 1.9 2024/12/31 07:58:12 anton Exp $ : ${FTP:=ftp} @@ -25,9 +25,9 @@ done unset http_proxy -res=$(${FTP} -4 -o/dev/null -v $req1 2>&1 | \ - sed '/^Redirected to /{s///;x;};$!d;x') +${FTP} -4 -o/dev/null -v $req1 2>&1 | tee redirect.log +res=$(sed '/^Redirected to /{s///;x;};$!d;x' redirect.log) if [ X"$res" != X"$req2" ]; then echo "*** Fail; expected \"$req2\", got \"$res\"" exit 1 diff --git a/regress/usr.bin/mandoc/roff/nr/predef.in b/regress/usr.bin/mandoc/roff/nr/predef.in index 72d78f09a..113354dcd 100644 --- a/regress/usr.bin/mandoc/roff/nr/predef.in +++ b/regress/usr.bin/mandoc/roff/nr/predef.in @@ -1,5 +1,5 @@ -.\" $OpenBSD: predef.in,v 1.4 2020/10/24 22:52:34 schwarze Exp $ -.TH NR-PREDEF 1 "August 29, 2015" +.\" $OpenBSD: predef.in,v 1.5 2025/01/03 16:32:21 schwarze Exp $ +.TH NR-PREDEF 1 "January 3, 2025" .SH NAME nr-predef \- pre-defined read-only integer number registers .SH DESCRIPTION @@ -11,15 +11,17 @@ user defined macro with \\n(.$ arguments: \\$* .nr .g 111 .nr .H 111 .nr .j 111 +.nr .l 111 .nr .T 111 .nr .V 111 .nr .$ 111 -ascii mode: \n(.A -groff mode: \n(.g -horizontal resolution: \n(.H -adjustment mode: \n(.j -output device defined: \n(.T \n[.T] -vertical resolution: \n(.V +ascii mode: \n(.A = off +groff mode: \n(.g = on +horizontal resolution: \n(.H dots per character +adjustment mode: \n(.j = flush left +line width: \n(.l dots per line +output device defined: \n(.T \n[.T] = yes +vertical resolution: \n(.V dots per line .mym .mym one .mym one two diff --git a/regress/usr.bin/mandoc/roff/nr/predef.out_ascii b/regress/usr.bin/mandoc/roff/nr/predef.out_ascii index af8b99880..393752915 100644 --- a/regress/usr.bin/mandoc/roff/nr/predef.out_ascii +++ b/regress/usr.bin/mandoc/roff/nr/predef.out_ascii @@ -4,14 +4,15 @@ NNAAMMEE nr-predef - pre-defined read-only integer number registers DDEESSCCRRIIPPTTIIOONN - ascii mode: 0 - groff mode: 1 - horizontal resolution: 24 - adjustment mode: 0 - output device defined: 1 1 - vertical resolution: 40 + ascii mode: 0 = off + groff mode: 1 = on + horizontal resolution: 24 dots per character + adjustment mode: 0 = flush left + line width: 1872 dots per line + output device defined: 1 1 = yes + vertical resolution: 40 dots per line user defined macro with 0 arguments: user defined macro with 1 arguments: one user defined macro with 2 arguments: one two -OpenBSD August 29, 2015 NR-PREDEF(1) +OpenBSD January 3, 2025 NR-PREDEF(1) diff --git a/regress/usr.bin/mandoc/roff/nr/scale.in b/regress/usr.bin/mandoc/roff/nr/scale.in index 7793a585e..af4536eeb 100644 --- a/regress/usr.bin/mandoc/roff/nr/scale.in +++ b/regress/usr.bin/mandoc/roff/nr/scale.in @@ -1,5 +1,5 @@ -.\" $OpenBSD: scale.in,v 1.2 2017/07/04 14:53:27 schwarze Exp $ -.TH NR-INT 1 "January 23, 2015" +.\" $OpenBSD: scale.in,v 1.3 2025/01/06 18:48:13 schwarze Exp $ +.TH NR-INT 1 "January 6, 2025" .SH NAME nr-scale \- scaling units in numeric expressions .SH DESCRIPTION @@ -25,3 +25,21 @@ nr-scale \- scaling units in numeric expressions \nY .nr Y 1X+2 \nY +.PP +.nr Y 0.001f +0.001f = \nYu; +.nr Y 0.1i +0.1i = \nYu; +.nr Y 0.1c +0.1c = \nYu; +.nr Y 0.25P +0.25P = \nYu; +.nr Y 0.6p +0.6p = \nYu +.PP +.nr Y 3p +3p = \nYu; +.nr Y 1p+1p+1p +1p+1p+1p = \nYu; +.nr Y 1p*3 +1p*3 = \nYu diff --git a/regress/usr.bin/mandoc/roff/nr/scale.out_ascii b/regress/usr.bin/mandoc/roff/nr/scale.out_ascii index 0c3117d4b..a75f58edf 100644 --- a/regress/usr.bin/mandoc/roff/nr/scale.out_ascii +++ b/regress/usr.bin/mandoc/roff/nr/scale.out_ascii @@ -6,4 +6,8 @@ NNAAMMEE DDEESSCCRRIIPPTTIIOONN 65537 241 945 41 41 25 25 34 2 25 1 -OpenBSD January 23, 2015 NR-INT(1) + 0.001f = 65u; 0.1i = 24u; 0.1c = 9u; 0.25P = 10u; 0.6p = 2u + + 3p = 10u; 1p+1p+1p = 9u; 1p*3 = 9u + +OpenBSD January 6, 2025 NR-INT(1) diff --git a/regress/usr.bin/mandoc/tbl/mod/width.in b/regress/usr.bin/mandoc/tbl/mod/width.in index 6482c7505..1a3abddad 100644 --- a/regress/usr.bin/mandoc/tbl/mod/width.in +++ b/regress/usr.bin/mandoc/tbl/mod/width.in @@ -1,12 +1,76 @@ -.\" $OpenBSD: width.in,v 1.3 2017/07/04 14:53:27 schwarze Exp $ -.TH TBL-MOD-WIDTH 1 "June 8, 2017" +.\" $OpenBSD: width.in,v 1.4 2025/01/05 18:03:51 schwarze Exp $ +.TH TBL-MOD-WIDTH 1 "January 4, 2025" .SH NAME tbl-mod-width \- width modifier in table layout .SH DESCRIPTION -normal text +Bare numbers without parentheses use EN units: .TS box tab(:); -lw2 | lw(2n) | lw(0.16i) | lw2 . +Lw2 | Lw3 . +a:abcd +.TE +.PP +Explicit scaling units and rounding \(en metric: +.TS +box tab(:); +Lw(1c). +1cm +.TE +.PP +Explicit scaling units and rounding \(en pica: +.TS +box tab(:); +Lw(1P). +P +.TE +.TS +box tab(:); +Lw(2P). +2P +.TE +.PP +Explicit scaling units and rounding \(en points: +.TS +box tab(:); +Lw(25p). +25p +.TE +.TS +box tab(:); +Lw(26p). +26p +.TE +.PP +Explicit scaling units and rounding \(en basic units: +.TS +box tab(:); +Lw(84u). +84u +.TE +.TS +box tab(:); +Lw(85u). +85u +.TE +.PP +Multiplication: +.TS +box tab(:); +Lw(3n*2u) | Lw(3u*2n) | Lw(3u*2) | Cw(3*2u). +3n*2u:3u*2n:3u*2:3*2u +.TE +.PP +Division: +.TS +box tab(:); +Lw(14n/2u) | Lw(384n/2n) | Lw(12/2u) | Lw(288/2). +14n/2u:384n/2n:12/2u:288/2 +.TE +.PP +Data section containing text blocks: +.TS +box tab(:); +lw2 | lw(2n) | lw(2m) | lw2 . a:abcd:T{ a T}:T{ diff --git a/regress/usr.bin/mandoc/tbl/mod/width.out_ascii b/regress/usr.bin/mandoc/tbl/mod/width.out_ascii index 51e51112d..08e2819ec 100644 --- a/regress/usr.bin/mandoc/tbl/mod/width.out_ascii +++ b/regress/usr.bin/mandoc/tbl/mod/width.out_ascii @@ -4,9 +4,53 @@ NNAAMMEE tbl-mod-width - width modifier in table layout DDEESSCCRRIIPPTTIIOONN - normal text + Bare numbers without parentheses use EN units: + +---+------+ + |a | abcd | + +---+------+ + + Explicit scaling units and rounding - metric: + +-----+ + |1cm | + +-----+ + + Explicit scaling units and rounding - pica: + +---+ + |P | + +---+ + +----+ + |2P | + +----+ + + Explicit scaling units and rounding - points: + +----+ + |25p | + +----+ + +-----+ + |26p | + +-----+ + + Explicit scaling units and rounding - basic units: + +----+ + |84u | + +----+ + +-----+ + |85u | + +-----+ + + Multiplication: + +-------+--------+--------+--------+ + |3n*2u | 3u*2n | 3u*2 | 3*2u | + +-------+--------+--------+--------+ + + Division: + +--------+----------+--------+--------+ + |14n/2u | 384n/2n | 12/2u | 288/2 | + +--------+----------+--------+--------+ + + Data section containing text blocks: +---+------+----+------+ |a | abcd | a | abcd | +---+------+----+------+ -OpenBSD June 8, 2017 TBL-MOD-WIDTH(1) +OpenBSD January 4, 2025 TBL-MOD-WIDTH(1) diff --git a/regress/usr.bin/sed/commandl2.expected b/regress/usr.bin/sed/commandl2.expected index 4fbdeab3d..8e27be7d6 100644 --- a/regress/usr.bin/sed/commandl2.expected +++ b/regress/usr.bin/sed/commandl2.expected @@ -1,2 +1 @@ text -$ diff --git a/regress/usr.bin/ssh/agent.sh b/regress/usr.bin/ssh/agent.sh index 5f1060608..f0022aca5 100644 --- a/regress/usr.bin/ssh/agent.sh +++ b/regress/usr.bin/ssh/agent.sh @@ -1,4 +1,4 @@ -# $OpenBSD: agent.sh,v 1.21 2023/03/01 09:29:32 dtucker Exp $ +# $OpenBSD: agent.sh,v 1.22 2024/10/24 03:28:34 djm Exp $ # Placed in the Public Domain. tid="simple agent test" @@ -157,7 +157,7 @@ done ## Deletion tests. -trace "delete all agent keys" +trace "delete all agent keys using -D" ${SSHADD} -D > /dev/null 2>&1 r=$? if [ $r -ne 0 ]; then @@ -181,6 +181,29 @@ r=$? if [ $r -ne 0 ]; then fail "ssh-add -l failed: exit code $r" fi +trace "delete all agent keys using SIGUSR1" +kill -s USR1 $SSH_AGENT_PID +r=$? +if [ $r -ne 0 ]; then + fail "kill -s USR1 failed: exit code $r" +fi +# make sure they're gone +${SSHADD} -l > /dev/null 2>&1 +r=$? +if [ $r -ne 1 ]; then + fail "ssh-add -l returned unexpected exit code: $r" +fi +# re-add keys/certs to agent +for t in ${SSH_KEYTYPES}; do + ${SSHADD} $OBJ/$t-agent-private >/dev/null 2>&1 || \ + fail "ssh-add failed exit code $?" +done +# make sure they are there +${SSHADD} -l > /dev/null 2>&1 +r=$? +if [ $r -ne 0 ]; then + fail "ssh-add -l failed: exit code $r" +fi check_key_absent() { ${SSHADD} -L | grep "^$1 " >/dev/null diff --git a/regress/usr.bin/ssh/cert-userkey.sh b/regress/usr.bin/ssh/cert-userkey.sh index 4ea29b7cd..2ab0a1e9e 100644 --- a/regress/usr.bin/ssh/cert-userkey.sh +++ b/regress/usr.bin/ssh/cert-userkey.sh @@ -1,12 +1,15 @@ -# $OpenBSD: cert-userkey.sh,v 1.28 2021/09/30 05:26:26 dtucker Exp $ +# $OpenBSD: cert-userkey.sh,v 1.29 2024/12/06 16:25:58 djm Exp $ # Placed in the Public Domain. tid="certified user keys" -rm -f $OBJ/authorized_keys_$USER $OBJ/user_ca_key* $OBJ/cert_user_key* -cp $OBJ/sshd_proxy $OBJ/sshd_proxy_bak +rm -f $OBJ/authorized_keys_${USER}* $OBJ/user_ca_key* $OBJ/cert_user_key* +rm -f $OBJ/authorized_principals* cp $OBJ/ssh_proxy $OBJ/ssh_proxy_bak +grep -v AuthorizedKeysFile $OBJ/sshd_proxy > $OBJ/sshd_proxy_bak +echo "AuthorizedKeysFile $OBJ/authorized_keys_%u_*" >> $OBJ/sshd_proxy_bak + PLAIN_TYPES=`$SSH -Q key-plain | maybe_filter_sk | sed 's/^ssh-dss/ssh-dsa/;s/^ssh-//'` EXTRA_TYPES="" rsa="" @@ -63,11 +66,15 @@ for ktype in $EXTRA_TYPES $PLAIN_TYPES ; do _prefix="${ktype}" # Setup for AuthorizedPrincipalsFile - rm -f $OBJ/authorized_keys_$USER + rm -f $OBJ/authorized_keys_${USER}* $OBJ/authorized_principals_${USER}* + touch $OBJ/authorized_keys_${USER}_A + touch $OBJ/authorized_keys_${USER}_Z + touch $OBJ/authorized_principals_${USER}_A + touch $OBJ/authorized_principals_${USER}_Z ( cat $OBJ/sshd_proxy_bak echo "AuthorizedPrincipalsFile " \ - "$OBJ/authorized_principals_%u" + "$OBJ/authorized_principals_%u_*" echo "TrustedUserCAKeys $OBJ/user_ca_key.pub" echo "PubkeyAcceptedAlgorithms ${t}" ) > $OBJ/sshd_proxy @@ -78,7 +85,7 @@ for ktype in $EXTRA_TYPES $PLAIN_TYPES ; do # Missing authorized_principals verbose "$tid: ${_prefix} missing authorized_principals" - rm -f $OBJ/authorized_principals_$USER + rm -f $OBJ/authorized_principals_${USER}_X ${SSH} -i $OBJ/cert_user_key_${ktype} \ -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1 if [ $? -eq 0 ]; then @@ -87,7 +94,7 @@ for ktype in $EXTRA_TYPES $PLAIN_TYPES ; do # Empty authorized_principals verbose "$tid: ${_prefix} empty authorized_principals" - echo > $OBJ/authorized_principals_$USER + echo > $OBJ/authorized_principals_${USER}_X ${SSH} -i $OBJ/cert_user_key_${ktype} \ -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1 if [ $? -eq 0 ]; then @@ -96,7 +103,7 @@ for ktype in $EXTRA_TYPES $PLAIN_TYPES ; do # Wrong authorized_principals verbose "$tid: ${_prefix} wrong authorized_principals" - echo gregorsamsa > $OBJ/authorized_principals_$USER + echo gregorsamsa > $OBJ/authorized_principals_${USER}_X ${SSH} -i $OBJ/cert_user_key_${ktype} \ -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1 if [ $? -eq 0 ]; then @@ -105,7 +112,7 @@ for ktype in $EXTRA_TYPES $PLAIN_TYPES ; do # Correct authorized_principals verbose "$tid: ${_prefix} correct authorized_principals" - echo mekmitasdigoat > $OBJ/authorized_principals_$USER + echo mekmitasdigoat > $OBJ/authorized_principals_${USER}_X ${SSH} -i $OBJ/cert_user_key_${ktype} \ -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1 if [ $? -ne 0 ]; then @@ -114,7 +121,7 @@ for ktype in $EXTRA_TYPES $PLAIN_TYPES ; do # authorized_principals with bad key option verbose "$tid: ${_prefix} authorized_principals bad key opt" - echo 'blah mekmitasdigoat' > $OBJ/authorized_principals_$USER + echo 'blah mekmitasdigoat' > $OBJ/authorized_principals_${USER}_X ${SSH} -i $OBJ/cert_user_key_${ktype} \ -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1 if [ $? -eq 0 ]; then @@ -124,7 +131,7 @@ for ktype in $EXTRA_TYPES $PLAIN_TYPES ; do # authorized_principals with command=false verbose "$tid: ${_prefix} authorized_principals command=false" echo 'command="false" mekmitasdigoat' > \ - $OBJ/authorized_principals_$USER + $OBJ/authorized_principals_${USER}_X ${SSH} -i $OBJ/cert_user_key_${ktype} \ -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1 if [ $? -eq 0 ]; then @@ -135,7 +142,7 @@ for ktype in $EXTRA_TYPES $PLAIN_TYPES ; do # authorized_principals with command=true verbose "$tid: ${_prefix} authorized_principals command=true" echo 'command="true" mekmitasdigoat' > \ - $OBJ/authorized_principals_$USER + $OBJ/authorized_principals_${USER}_X ${SSH} -i $OBJ/cert_user_key_${ktype} \ -F $OBJ/ssh_proxy somehost false >/dev/null 2>&1 if [ $? -ne 0 ]; then @@ -143,7 +150,7 @@ for ktype in $EXTRA_TYPES $PLAIN_TYPES ; do fi # Setup for principals= key option - rm -f $OBJ/authorized_principals_$USER + rm -f $OBJ/authorized_principals_${USER}_X ( cat $OBJ/sshd_proxy_bak echo "PubkeyAcceptedAlgorithms ${t}" @@ -158,7 +165,7 @@ for ktype in $EXTRA_TYPES $PLAIN_TYPES ; do ( printf 'cert-authority,principals="gregorsamsa" ' cat $OBJ/user_ca_key.pub - ) > $OBJ/authorized_keys_$USER + ) > $OBJ/authorized_keys_${USER}_X ${SSH} -i $OBJ/cert_user_key_${ktype} \ -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1 if [ $? -eq 0 ]; then @@ -170,7 +177,7 @@ for ktype in $EXTRA_TYPES $PLAIN_TYPES ; do ( printf 'cert-authority,principals="mekmitasdigoat" ' cat $OBJ/user_ca_key.pub - ) > $OBJ/authorized_keys_$USER + ) > $OBJ/authorized_keys_${USER}_X ${SSH} -i $OBJ/cert_user_key_${ktype} \ -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1 if [ $? -ne 0 ]; then @@ -180,14 +187,17 @@ done basic_tests() { auth=$1 + rm -f $OBJ/authorized_keys_${USER}* + touch $OBJ/authorized_keys_${USER}_A + touch $OBJ/authorized_keys_${USER}_Z if test "x$auth" = "xauthorized_keys" ; then # Add CA to authorized_keys ( printf 'cert-authority ' cat $OBJ/user_ca_key.pub - ) > $OBJ/authorized_keys_$USER + ) > $OBJ/authorized_keys_${USER}_X else - echo > $OBJ/authorized_keys_$USER + echo > $OBJ/authorized_keys_${USER}_X extra_sshd="TrustedUserCAKeys $OBJ/user_ca_key.pub" fi @@ -295,9 +305,9 @@ test_one() { ( printf "cert-authority${auth_opt} " cat $OBJ/user_ca_key.pub - ) > $OBJ/authorized_keys_$USER + ) > $OBJ/authorized_keys_${USER}_X else - echo > $OBJ/authorized_keys_$USER + echo > $OBJ/authorized_keys_${USER}_X echo "TrustedUserCAKeys $OBJ/user_ca_key.pub" \ >> $OBJ/sshd_proxy echo "PubkeyAcceptedAlgorithms ${t}*" \ @@ -346,15 +356,15 @@ test_one "empty principals" failure "" TrustedUserCAKeys # should always be refused. # AuthorizedPrincipalsFile -rm -f $OBJ/authorized_keys_$USER -echo mekmitasdigoat > $OBJ/authorized_principals_$USER +rm -f $OBJ/authorized_keys_${USER}_X +echo mekmitasdigoat > $OBJ/authorized_principals_${USER}_X test_one "AuthorizedPrincipalsFile principals" success "-n mekmitasdigoat" \ - TrustedUserCAKeys "AuthorizedPrincipalsFile $OBJ/authorized_principals_%u" + TrustedUserCAKeys "AuthorizedPrincipalsFile $OBJ/authorized_principals_%u_*" test_one "AuthorizedPrincipalsFile no principals" failure "" \ - TrustedUserCAKeys "AuthorizedPrincipalsFile $OBJ/authorized_principals_%u" + TrustedUserCAKeys "AuthorizedPrincipalsFile $OBJ/authorized_principals_%u_*" # principals= key option -rm -f $OBJ/authorized_principals_$USER +rm -f $OBJ/authorized_principals_${USER}_X test_one "principals key option principals" success "-n mekmitasdigoat" \ authorized_keys ',principals="mekmitasdigoat"' test_one "principals key option no principals" failure "" \ @@ -391,6 +401,6 @@ for ktype in $PLAIN_TYPES ; do fi done -rm -f $OBJ/authorized_keys_$USER $OBJ/user_ca_key* $OBJ/cert_user_key* -rm -f $OBJ/authorized_principals_$USER +rm -f $OBJ/authorized_keys_${USER}* $OBJ/user_ca_key* $OBJ/cert_user_key* +rm -f $OBJ/authorized_principals* diff --git a/regress/usr.bin/ssh/hostkey-agent.sh b/regress/usr.bin/ssh/hostkey-agent.sh index 222d424bd..28dcfe170 100644 --- a/regress/usr.bin/ssh/hostkey-agent.sh +++ b/regress/usr.bin/ssh/hostkey-agent.sh @@ -1,4 +1,4 @@ -# $OpenBSD: hostkey-agent.sh,v 1.13 2021/09/30 05:20:08 dtucker Exp $ +# $OpenBSD: hostkey-agent.sh,v 1.15 2024/12/04 10:51:13 dtucker Exp $ # Placed in the Public Domain. tid="hostkey agent" @@ -49,7 +49,7 @@ for k in $SSH_KEYTYPES ; do fi done -SSH_CERTTYPES=`ssh -Q key-sig | grep 'cert-v01@openssh.com'` +SSH_CERTTYPES=`ssh -Q key-sig | grep 'cert-v01@openssh.com' | maybe_filter_sk` # Prepare sshd_proxy for certificates. cp $OBJ/sshd_proxy.orig $OBJ/sshd_proxy @@ -82,6 +82,30 @@ for k in $SSH_CERTTYPES ; do fi done +verbose "multiple hostkeys" +cp $OBJ/sshd_proxy.orig $OBJ/sshd_proxy +cp $OBJ/ssh_proxy $OBJ/ssh_proxy.orig +grep -vi 'globalknownhostsfile' $OBJ/ssh_proxy.orig > $OBJ/ssh_proxy +echo "UpdateHostkeys=yes" >> $OBJ/ssh_proxy +echo "GlobalKnownHostsFile=none" >> $OBJ/ssh_proxy + +for k in $SSH_KEYTYPES ; do + verbose "Addkey type $k" + echo "Hostkey $OBJ/agent-key.${k}" >> $OBJ/sshd_proxy + + ( printf 'localhost-with-alias ' ; + cat $OBJ/agent-key.$k.pub) > $OBJ/known_hosts +done + +opts="-oStrictHostKeyChecking=yes -F $OBJ/ssh_proxy" +SSH_CONNECTION=`${SSH} $opts host 'echo $SSH_CONNECTION'` +if [ $? -ne 0 ]; then + fail "connection to server with multiple hostkeys failed" +fi +if [ "$SSH_CONNECTION" != "UNKNOWN 65535 UNKNOWN 65535" ]; then + fail "bad SSH_CONNECTION key while using multiple hostkeys" +fi + trace "kill agent" ${SSHAGENT} -k > /dev/null diff --git a/regress/usr.bin/ssh/key-options.sh b/regress/usr.bin/ssh/key-options.sh index 93d9af478..d0f71f59e 100644 --- a/regress/usr.bin/ssh/key-options.sh +++ b/regress/usr.bin/ssh/key-options.sh @@ -1,4 +1,4 @@ -# $OpenBSD: key-options.sh,v 1.10 2024/03/25 02:07:08 dtucker Exp $ +# $OpenBSD: key-options.sh,v 1.11 2024/12/05 14:28:39 dtucker Exp $ # Placed in the Public Domain. tid="key options" @@ -113,4 +113,4 @@ check_valid_before "default" "" "pass" check_valid_before "invalid" 'expiry-time="INVALID"' "fail" check_valid_before "expired" 'expiry-time="19990101"' "fail" check_valid_before "valid" 'expiry-time="20380101"' "pass" - +check_valid_before "valid-64b" 'expiry-time="25250101"' "pass" diff --git a/regress/usr.bin/ssh/misc/ssh-verify-attestation/Makefile b/regress/usr.bin/ssh/misc/ssh-verify-attestation/Makefile new file mode 100644 index 000000000..2a797aeca --- /dev/null +++ b/regress/usr.bin/ssh/misc/ssh-verify-attestation/Makefile @@ -0,0 +1,79 @@ +# $OpenBSD: Makefile,v 1.1 2024/12/04 16:42:49 djm Exp $ + +.include +.include + +PROG= ssh-verify-attestation +NOMAN= + +SSHREL=../../../../../usr.bin/ssh +.PATH: ${.CURDIR}/${SSHREL} + +SRCS=ssh-verify-attestation.c +# From usr.bin/ssh +SRCS+=sshbuf-getput-basic.c sshbuf-getput-crypto.c sshbuf-misc.c sshbuf.c +SRCS+=sshbuf-io.c atomicio.c sshkey.c authfile.c cipher.c log.c ssh-rsa.c +SRCS+=ssh-dss.c ssh-ecdsa.c ssh-ed25519.c mac.c umac.c umac128.c hmac.c misc.c +SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c +SRCS+=addr.c addrmatch.c bitmap.c +SRCS+=ed25519.c hash.c +SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c +SRCS+=ssh-ed25519-sk.c sk-usbhid.c + +SRCS+=digest-openssl.c +#SRCS+=digest-libc.c +SRCS+=utf8.c + +OPENSSL?= yes + +.if (${OPENSSL:L} == "yes") +CFLAGS+= -DWITH_OPENSSL +.endif + +# enable warnings +WARNINGS=Yes + +DEBUG=-g +CFLAGS+= -fstack-protector-all +CDIAGFLAGS= -Wall +CDIAGFLAGS+= -Wextra +CDIAGFLAGS+= -Werror +CDIAGFLAGS+= -Wchar-subscripts +CDIAGFLAGS+= -Wcomment +CDIAGFLAGS+= -Wformat +CDIAGFLAGS+= -Wformat-security +CDIAGFLAGS+= -Wimplicit +CDIAGFLAGS+= -Winline +CDIAGFLAGS+= -Wmissing-declarations +CDIAGFLAGS+= -Wmissing-prototypes +CDIAGFLAGS+= -Wparentheses +CDIAGFLAGS+= -Wpointer-arith +CDIAGFLAGS+= -Wreturn-type +CDIAGFLAGS+= -Wshadow +CDIAGFLAGS+= -Wsign-compare +CDIAGFLAGS+= -Wstrict-aliasing +CDIAGFLAGS+= -Wstrict-prototypes +CDIAGFLAGS+= -Wswitch +CDIAGFLAGS+= -Wtrigraphs +CDIAGFLAGS+= -Wuninitialized +CDIAGFLAGS+= -Wunused +CDIAGFLAGS+= -Wno-unused-parameter +.if ${COMPILER_VERSION:L} != "gcc3" +CDIAGFLAGS+= -Wold-style-definition +.endif + +CFLAGS+=-I${.CURDIR}/${SSHREL} + +.if (${OPENSSL:L} == "yes") +LDADD+= -lcrypto +DPADD+= ${LIBCRYPTO} +.endif + +LDADD+= -lfido2 -lcbor +DPADD+= ${LIBFIDO2} ${LIBCBOR} + +LDADD+= -lutil +DPADD+= ${LIBUTIL} + +.include + diff --git a/regress/usr.bin/ssh/misc/ssh-verify-attestation/ssh-verify-attestation.c b/regress/usr.bin/ssh/misc/ssh-verify-attestation/ssh-verify-attestation.c new file mode 100644 index 000000000..6ca0aea08 --- /dev/null +++ b/regress/usr.bin/ssh/misc/ssh-verify-attestation/ssh-verify-attestation.c @@ -0,0 +1,431 @@ +/* $OpenBSD: ssh-verify-attestation.c,v 1.2 2024/12/06 10:37:42 djm Exp $ */ +/* + * Copyright (c) 2022-2024 Damien Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * This is a small program to verify FIDO attestation objects that + * ssh-keygen(1) can record when enrolling a FIDO key. It requires that + * the attestation object and challenge used when creating the key be + * recorded. + * + * Example usage: + * + * $ # Generate a random challenge. + * $ dd if=/dev/urandom of=key_ecdsa_sk.challenge bs=32 count=1 + * $ # Generate a key, record the attestation blob. + * $ ssh-keygen -f key_ecdsa_sk -t ecdsa-sk \ + * -Ochallenge=key_ecdsa_sk.challenge \ + * -Owrite-attestation=key_ecdsa_sk.attest -N '' + * $ # Validate the challenge (-A = print attestation CA cert) + * $ ./obj/ssh-verify-attestation -A key_ecdsa_sk key_ecdsa_sk.challenge \ + * key_ecdsa_sk.attest + * + * Limitations/TODO: + * + * 1) It doesn't automatically detect the attestation statement format. It + * assumes the "packed" format used by FIDO2 keys. If that doesn't work, + * then try using the -U option to select the "fido-u2f" format. + * 2) It makes assumptions about RK, UV, etc status of the key/cred. + * 3) Probably bugs. + * + * Thanks to Markus Friedl and Pedro Martelletto for help getting this + * working. + */ + +#include +#include +#include +#include +#include +#include + +#include "xmalloc.h" +#include "log.h" +#include "sshbuf.h" +#include "sshkey.h" +#include "authfile.h" +#include "ssherr.h" +#include "misc.h" +#include "digest.h" +#include "crypto_api.h" + +#include +#include +#include +#include +#include +#include + +extern char *__progname; + +#define ATTEST_MAGIC "ssh-sk-attest-v01" + +static int +prepare_fido_cred(fido_cred_t *cred, int credtype, const char *attfmt, + const char *rp_id, struct sshbuf *b, const struct sshbuf *challenge, + struct sshbuf **attestation_certp) +{ + struct sshbuf *attestation_cert = NULL, *sig = NULL, *authdata = NULL; + char *magic = NULL; + int r = SSH_ERR_INTERNAL_ERROR; + + *attestation_certp = NULL; + + /* Make sure it's the format we're expecting */ + if ((r = sshbuf_get_cstring(b, &magic, NULL)) != 0) { + error_fr(r, "parse header"); + goto out; + } + if (strcmp(magic, ATTEST_MAGIC) != 0) { + error_f("unsupported format"); + r = SSH_ERR_INVALID_FORMAT; + goto out; + } + /* Parse the remaining fields */ + if ((r = sshbuf_froms(b, &attestation_cert)) != 0 || + (r = sshbuf_froms(b, &sig)) != 0 || + (r = sshbuf_froms(b, &authdata)) != 0 || + (r = sshbuf_get_u32(b, NULL)) != 0 || /* reserved flags */ + (r = sshbuf_get_string_direct(b, NULL, NULL)) != 0) { /* reserved */ + error_fr(r, "parse body"); + goto out; + } + debug3_f("attestation cert len=%zu, sig len=%zu, " + "authdata len=%zu challenge len=%zu", sshbuf_len(attestation_cert), + sshbuf_len(sig), sshbuf_len(authdata), sshbuf_len(challenge)); + + fido_cred_set_type(cred, credtype); + fido_cred_set_fmt(cred, attfmt); + fido_cred_set_clientdata(cred, sshbuf_ptr(challenge), + sshbuf_len(challenge)); + fido_cred_set_rp(cred, rp_id, NULL); + fido_cred_set_authdata(cred, sshbuf_ptr(authdata), + sshbuf_len(authdata)); + /* XXX set_extensions, set_rk, set_uv */ + fido_cred_set_x509(cred, sshbuf_ptr(attestation_cert), + sshbuf_len(attestation_cert)); + fido_cred_set_sig(cred, sshbuf_ptr(sig), sshbuf_len(sig)); + + /* success */ + *attestation_certp = attestation_cert; + attestation_cert = NULL; + r = 0; + out: + free(magic); + sshbuf_free(attestation_cert); + sshbuf_free(sig); + sshbuf_free(authdata); + return r; +} + +static uint8_t * +get_pubkey_from_cred_ecdsa(const fido_cred_t *cred, size_t *pubkey_len) +{ + const uint8_t *ptr; + uint8_t *pubkey = NULL, *ret = NULL; + BIGNUM *x = NULL, *y = NULL; + EC_POINT *q = NULL; + EC_GROUP *g = NULL; + + if ((x = BN_new()) == NULL || + (y = BN_new()) == NULL || + (g = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1)) == NULL || + (q = EC_POINT_new(g)) == NULL) { + error_f("libcrypto setup failed"); + goto out; + } + if ((ptr = fido_cred_pubkey_ptr(cred)) == NULL) { + error_f("fido_cred_pubkey_ptr failed"); + goto out; + } + if (fido_cred_pubkey_len(cred) != 64) { + error_f("bad fido_cred_pubkey_len %zu", + fido_cred_pubkey_len(cred)); + goto out; + } + + if (BN_bin2bn(ptr, 32, x) == NULL || + BN_bin2bn(ptr + 32, 32, y) == NULL) { + error_f("BN_bin2bn failed"); + goto out; + } + if (EC_POINT_set_affine_coordinates_GFp(g, q, x, y, NULL) != 1) { + error_f("EC_POINT_set_affine_coordinates_GFp failed"); + goto out; + } + *pubkey_len = EC_POINT_point2oct(g, q, + POINT_CONVERSION_UNCOMPRESSED, NULL, 0, NULL); + if (*pubkey_len == 0 || *pubkey_len > 2048) { + error_f("bad pubkey length %zu", *pubkey_len); + goto out; + } + if ((pubkey = malloc(*pubkey_len)) == NULL) { + error_f("malloc pubkey failed"); + goto out; + } + if (EC_POINT_point2oct(g, q, POINT_CONVERSION_UNCOMPRESSED, + pubkey, *pubkey_len, NULL) == 0) { + error_f("EC_POINT_point2oct failed"); + goto out; + } + /* success */ + ret = pubkey; + pubkey = NULL; + out: + free(pubkey); + EC_POINT_free(q); + EC_GROUP_free(g); + BN_clear_free(x); + BN_clear_free(y); + return ret; +} + +/* copied from sshsk_ecdsa_assemble() */ +static int +cred_matches_key_ecdsa(const fido_cred_t *cred, const struct sshkey *k) +{ + struct sshkey *key = NULL; + struct sshbuf *b = NULL; + EC_KEY *ec = NULL; + uint8_t *pubkey = NULL; + size_t pubkey_len; + int r; + + if ((key = sshkey_new(KEY_ECDSA_SK)) == NULL) { + error_f("sshkey_new failed"); + r = SSH_ERR_ALLOC_FAIL; + goto out; + } + key->ecdsa_nid = NID_X9_62_prime256v1; + if ((key->pkey = EVP_PKEY_new()) == NULL || + (ec = EC_KEY_new_by_curve_name(key->ecdsa_nid)) == NULL || + (b = sshbuf_new()) == NULL) { + error_f("allocation failed"); + r = SSH_ERR_ALLOC_FAIL; + goto out; + } + if ((pubkey = get_pubkey_from_cred_ecdsa(cred, &pubkey_len)) == NULL) { + error_f("get_pubkey_from_cred_ecdsa failed"); + r = SSH_ERR_INVALID_FORMAT; + goto out; + } + if ((r = sshbuf_put_string(b, pubkey, pubkey_len)) != 0) { + error_fr(r, "sshbuf_put_string"); + goto out; + } + if ((r = sshbuf_get_eckey(b, ec)) != 0) { + error_fr(r, "parse"); + r = SSH_ERR_INVALID_FORMAT; + goto out; + } + if (sshkey_ec_validate_public(EC_KEY_get0_group(ec), + EC_KEY_get0_public_key(ec)) != 0) { + error("Authenticator returned invalid ECDSA key"); + r = SSH_ERR_KEY_INVALID_EC_VALUE; + goto out; + } + if (EVP_PKEY_set1_EC_KEY(key->pkey, ec) != 1) { + /* XXX assume it is a allocation error */ + error_f("allocation failed"); + r = SSH_ERR_ALLOC_FAIL; + goto out; + } + key->sk_application = xstrdup(k->sk_application); /* XXX */ + if (!sshkey_equal_public(key, k)) { + error("sshkey_equal_public failed"); + r = SSH_ERR_INVALID_ARGUMENT; + goto out; + } + r = 0; /* success */ + out: + EC_KEY_free(ec); + free(pubkey); + sshkey_free(key); + sshbuf_free(b); + return r; +} + + +/* copied from sshsk_ed25519_assemble() */ +static int +cred_matches_key_ed25519(const fido_cred_t *cred, const struct sshkey *k) +{ + struct sshkey *key = NULL; + const uint8_t *ptr; + int r = -1; + + if ((ptr = fido_cred_pubkey_ptr(cred)) == NULL) { + error_f("fido_cred_pubkey_ptr failed"); + goto out; + } + if (fido_cred_pubkey_len(cred) != ED25519_PK_SZ) { + error_f("bad fido_cred_pubkey_len %zu", + fido_cred_pubkey_len(cred)); + goto out; + } + + if ((key = sshkey_new(KEY_ED25519_SK)) == NULL) { + error_f("sshkey_new failed"); + r = SSH_ERR_ALLOC_FAIL; + goto out; + } + if ((key->ed25519_pk = malloc(ED25519_PK_SZ)) == NULL) { + error_f("malloc failed"); + r = SSH_ERR_ALLOC_FAIL; + goto out; + } + memcpy(key->ed25519_pk, ptr, ED25519_PK_SZ); + key->sk_application = xstrdup(k->sk_application); /* XXX */ + if (!sshkey_equal_public(key, k)) { + error("sshkey_equal_public failed"); + r = SSH_ERR_INVALID_ARGUMENT; + goto out; + } + r = 0; /* success */ + out: + sshkey_free(key); + return r; +} + +static int +cred_matches_key(const fido_cred_t *cred, const struct sshkey *k) +{ + switch (sshkey_type_plain(k->type)) { + case KEY_ECDSA_SK: + switch (k->ecdsa_nid) { + case NID_X9_62_prime256v1: + return cred_matches_key_ecdsa(cred, k); + break; + default: + fatal("Unsupported ECDSA key size"); + } + break; + case KEY_ED25519_SK: + return cred_matches_key_ed25519(cred, k); + default: + error_f("key type %s not supported", sshkey_type(k)); + return -1; + } +} + +int +main(int argc, char **argv) +{ + LogLevel log_level = SYSLOG_LEVEL_INFO; + int r, ch, credtype = -1; + struct sshkey *k = NULL; + struct sshbuf *attestation = NULL, *challenge = NULL; + struct sshbuf *attestation_cert = NULL; + char *fp; + const char *attfmt = "packed", *style = NULL; + fido_cred_t *cred = NULL; + int write_attestation_cert = 0; + extern int optind; + /* extern char *optarg; */ + + ERR_load_crypto_strings(); + + sanitise_stdfd(); + log_init(__progname, log_level, SYSLOG_FACILITY_AUTH, 1); + + while ((ch = getopt(argc, argv, "UAv")) != -1) { + switch (ch) { + case 'U': + attfmt = "fido-u2f"; + break; + case 'A': + write_attestation_cert = 1; + break; + case 'v': + if (log_level == SYSLOG_LEVEL_ERROR) + log_level = SYSLOG_LEVEL_DEBUG1; + else if (log_level < SYSLOG_LEVEL_DEBUG3) + log_level++; + break; + default: + goto usage; + } + } + log_init(__progname, log_level, SYSLOG_FACILITY_AUTH, 1); + argv += optind; + argc -= optind; + + if (argc < 3) { + usage: + fprintf(stderr, "usage: %s [-vAU] " + "pubkey challenge attestation-blob\n", __progname); + exit(1); + } + if ((r = sshkey_load_public(argv[0], &k, NULL)) != 0) + fatal_r(r, "load key %s", argv[0]); + if ((fp = sshkey_fingerprint(k, SSH_FP_HASH_DEFAULT, + SSH_FP_DEFAULT)) == NULL) + fatal("sshkey_fingerprint failed"); + debug2("key %s: %s %s", argv[2], sshkey_type(k), fp); + free(fp); + if ((r = sshbuf_load_file(argv[1], &challenge)) != 0) + fatal_r(r, "load challenge %s", argv[1]); + if ((r = sshbuf_load_file(argv[2], &attestation)) != 0) + fatal_r(r, "load attestation %s", argv[2]); + if ((cred = fido_cred_new()) == NULL) + fatal("fido_cred_new failed"); + + switch (sshkey_type_plain(k->type)) { + case KEY_ECDSA_SK: + switch (k->ecdsa_nid) { + case NID_X9_62_prime256v1: + credtype = COSE_ES256; + break; + default: + fatal("Unsupported ECDSA key size"); + } + break; + case KEY_ED25519_SK: + credtype = COSE_EDDSA; + break; + default: + fatal("unsupported key type %s", sshkey_type(k)); + } + + if ((r = prepare_fido_cred(cred, credtype, attfmt, k->sk_application, + attestation, challenge, &attestation_cert)) != 0) + fatal_r(r, "prepare_fido_cred %s", argv[2]); + if (fido_cred_x5c_ptr(cred) != NULL) { + debug("basic attestation"); + if ((r = fido_cred_verify(cred)) != FIDO_OK) + fatal("basic attestation failed"); + style = "basic"; + } else { + debug("self attestation"); + if ((r = fido_cred_verify_self(cred)) != FIDO_OK) + fatal("self attestation failed"); + style = "self"; + } + if (cred_matches_key(cred, k) != 0) + fatal("cred authdata does not match key"); + + fido_cred_free(&cred); + + if (write_attestation_cert) { + PEM_write(stdout, "CERTIFICATE", NULL, + sshbuf_ptr(attestation_cert), sshbuf_len(attestation_cert)); + } + sshbuf_free(attestation_cert); + + logit("%s: verified %s attestation", argv[2], style); + + return (0); +} diff --git a/regress/usr.bin/ssh/test-exec.sh b/regress/usr.bin/ssh/test-exec.sh index f05ff8c4a..e09d0be8d 100644 --- a/regress/usr.bin/ssh/test-exec.sh +++ b/regress/usr.bin/ssh/test-exec.sh @@ -1,4 +1,4 @@ -# $OpenBSD: test-exec.sh,v 1.120 2024/10/14 03:02:08 djm Exp $ +# $OpenBSD: test-exec.sh,v 1.122 2024/12/06 07:05:54 dtucker Exp $ # Placed in the Public Domain. #SUDO=sudo @@ -142,6 +142,11 @@ case "$SSHD" in *) SSHD=`which $SSHD` ;; esac +case "$SSH" in +/*) ;; +*) SSH=`which $SSH` ;; +esac + case "$SSHAGENT" in /*) ;; *) SSHAGENT=`which $SSHAGENT` ;; @@ -204,6 +209,7 @@ fi # to preserve our debug logging. In the rare instance where -q is desirable # -qq is equivalent and is not removed. SSHLOGWRAP=$OBJ/ssh-log-wrapper.sh +rm -f ${SSHLOGWRAP} cat >$SSHLOGWRAP <$SSHDLOGWRAP < ${DIR}/bar # smaller data without delay echo 'bar' > ${DIR}/bar -# hey nfs ! -sleep 5 +wait_until "[ `grep -c bar ${OUT}` = 2 ]" kill ${PID} diff -u ${OUT} ${0%%.sh}.out || exit 1 [ $(grep -c "tail: ${DIR}/bar has been truncated, resetting." ${ERR}) -eq 3 ] || exit 2 diff --git a/regress/usr.bin/tail/util.sh b/regress/usr.bin/tail/util.sh new file mode 100644 index 000000000..de0456319 --- /dev/null +++ b/regress/usr.bin/tail/util.sh @@ -0,0 +1,13 @@ +# $OpenBSD: util.sh,v 1.1 2024/12/21 07:49:03 anton Exp $ + +wait_until() { + local _i=0 + + while [ "$_i" -lt 8 ]; do + sh -x -c "$*" && return 0 + sleep 0.5 + _i="$((_i + 1))" + done + echo timeout + return 1 +} diff --git a/regress/usr.sbin/bgpd/integrationtests/bgpd.maxattr.rdomain1.conf b/regress/usr.sbin/bgpd/integrationtests/bgpd.maxattr.rdomain1.conf index 7e78a7137..0f1f9c9b4 100644 --- a/regress/usr.sbin/bgpd/integrationtests/bgpd.maxattr.rdomain1.conf +++ b/regress/usr.sbin/bgpd/integrationtests/bgpd.maxattr.rdomain1.conf @@ -19,6 +19,16 @@ group rdomain2_2 { neighbor 2001:db8:57::3 } +group rdomain2_3 { + descr "RDOMAIN2_3" + remote-as 4200000004 + + announce extended yes + + neighbor 10.12.57.4 + neighbor 2001:db8:57::4 +} + match from any community 42:1 set prepend-self 1 match from any community 42:2 set prepend-self 10 match from any community 42:3 set { community 42:43 } diff --git a/regress/usr.sbin/bgpd/integrationtests/bgpd.maxattr.rdomain2_3.conf b/regress/usr.sbin/bgpd/integrationtests/bgpd.maxattr.rdomain2_3.conf new file mode 100644 index 000000000..391d337d3 --- /dev/null +++ b/regress/usr.sbin/bgpd/integrationtests/bgpd.maxattr.rdomain2_3.conf @@ -0,0 +1,25 @@ +AS 4200000004 +router-id 10.12.57.4 +fib-update no + +log updates + +listen on 10.12.57.4 +listen on 2001:db8:57::4 + +socket "/var/run/bgpd.sock.12_3" + +group rdomain1 { + descr "RDOMAIN1" + remote-as 4200000001 + local-address 10.12.57.4 + local-address 2001:db8:57::4 + + announce extended yes + + neighbor 10.12.57.1 + neighbor 2001:db8:57::1 +} + +allow from any +allow to any diff --git a/regress/usr.sbin/bgpd/integrationtests/ixp.sh b/regress/usr.sbin/bgpd/integrationtests/ixp.sh index 877928501..c07c04e56 100644 --- a/regress/usr.sbin/bgpd/integrationtests/ixp.sh +++ b/regress/usr.sbin/bgpd/integrationtests/ixp.sh @@ -1,5 +1,5 @@ #!/bin/ksh -# $OpenBSD: ixp.sh,v 1.2 2024/01/28 12:36:21 anton Exp $ +# $OpenBSD: ixp.sh,v 1.3 2024/10/28 12:11:05 claudio Exp $ set -e @@ -20,7 +20,6 @@ PAIR2IP4=192.0.2.41 error_notify() { echo cleanup - pfctl -q -t bgpd_integ_test -T kill pkill -T ${RDOMAIN1} bgpd || true pkill -T ${RDOMAIN2} bgpd || true sleep 1 diff --git a/regress/usr.sbin/bgpd/integrationtests/l3vpn.sh b/regress/usr.sbin/bgpd/integrationtests/l3vpn.sh index 1608dab91..d290ce6e1 100644 --- a/regress/usr.sbin/bgpd/integrationtests/l3vpn.sh +++ b/regress/usr.sbin/bgpd/integrationtests/l3vpn.sh @@ -1,5 +1,5 @@ #!/bin/ksh -# $OpenBSD: l3vpn.sh,v 1.4 2023/02/15 14:19:08 claudio Exp $ +# $OpenBSD: l3vpn.sh,v 1.6 2024/10/28 12:11:05 claudio Exp $ set -e @@ -22,7 +22,6 @@ PAIR2IP6=2001:db8:57::2 error_notify() { set -x echo cleanup - pfctl -q -t bgpd_integ_test -T kill pkill -T ${RDOMAIN1} bgpd || true pkill -T ${RDOMAIN2} bgpd || true sleep 1 @@ -116,6 +115,7 @@ echo Remove new network route -T ${RDOMAIN2} exec bgpctl network del 192.168.45.0/24 rd 4200000002:14 route -T ${RDOMAIN2} exec bgpctl network del 2001:db8:42:45::/64 rd 4200000002:14 sleep 1 +route -T ${RDOMAIN1} exec bgpctl show rib ! route -T ${RDOMAIN3} get 192.168.45/24 > /dev/null ! route -T ${RDOMAIN3} get -inet6 2001:db8:42:45::/64 > /dev/null diff --git a/regress/usr.sbin/bgpd/integrationtests/lladdr.sh b/regress/usr.sbin/bgpd/integrationtests/lladdr.sh index 0391c52a5..ad672a1df 100644 --- a/regress/usr.sbin/bgpd/integrationtests/lladdr.sh +++ b/regress/usr.sbin/bgpd/integrationtests/lladdr.sh @@ -1,5 +1,5 @@ #!/bin/ksh -# $OpenBSD: lladdr.sh,v 1.2 2023/10/16 12:49:15 claudio Exp $ +# $OpenBSD: lladdr.sh,v 1.3 2024/10/28 12:11:05 claudio Exp $ set -e @@ -22,7 +22,6 @@ GIF2IP6=fe80::beef:2 error_notify() { set -x echo cleanup - pfctl -q -t bgpd_integ_test -T kill pkill -T ${RDOMAIN1} bgpd || true pkill -T ${RDOMAIN2} bgpd || true sleep 1 diff --git a/regress/usr.sbin/bgpd/integrationtests/maxattr.sh b/regress/usr.sbin/bgpd/integrationtests/maxattr.sh index b55d51a8a..1911690e9 100644 --- a/regress/usr.sbin/bgpd/integrationtests/maxattr.sh +++ b/regress/usr.sbin/bgpd/integrationtests/maxattr.sh @@ -1,5 +1,5 @@ #!/bin/ksh -# $OpenBSD: maxattr.sh,v 1.3 2024/09/26 08:12:30 claudio Exp $ +# $OpenBSD: maxattr.sh,v 1.5 2024/12/09 10:53:54 claudio Exp $ set -e @@ -15,13 +15,14 @@ PAIRS="${PAIR1} ${PAIR2}" PAIR1IP=10.12.57.1 PAIR2IP=10.12.57.2 PAIR2IP_2=10.12.57.3 +PAIR2IP_3=10.12.57.4 PAIR1IP6=2001:db8:57::1 PAIR2IP6=2001:db8:57::2 PAIR2IP6_2=2001:db8:57::3 +PAIR2IP6_3=2001:db8:57::4 error_notify() { echo cleanup - pfctl -q -t bgpd_integ_test -T kill pkill -T ${RDOMAIN1} bgpd || true pkill -T ${RDOMAIN2} bgpd || true sleep 1 @@ -68,7 +69,9 @@ ifconfig ${PAIR2} rdomain ${RDOMAIN2} ${PAIR2IP}/29 up ifconfig ${PAIR1} inet6 ${PAIR1IP6}/64 ifconfig ${PAIR2} inet6 ${PAIR2IP6}/64 ifconfig ${PAIR2} alias ${PAIR2IP_2}/32 +ifconfig ${PAIR2} alias ${PAIR2IP_3}/32 ifconfig ${PAIR2} inet6 ${PAIR2IP6_2}/128 +ifconfig ${PAIR2} inet6 ${PAIR2IP6_3}/128 ifconfig ${PAIR1} patch ${PAIR2} ifconfig lo${RDOMAIN1} inet 127.0.0.1/8 ifconfig lo${RDOMAIN2} inet 127.0.0.1/8 @@ -81,6 +84,8 @@ route -T ${RDOMAIN2} exec ${BGPD} \ -v -f ${BGPDCONFIGDIR}/bgpd.maxattr.rdomain2_1.conf route -T ${RDOMAIN2} exec ${BGPD} \ -v -f ${BGPDCONFIGDIR}/bgpd.maxattr.rdomain2_2.conf +route -T ${RDOMAIN2} exec ${BGPD} \ + -v -f ${BGPDCONFIGDIR}/bgpd.maxattr.rdomain2_3.conf sleep 1 echo inject initial prefixes @@ -102,7 +107,10 @@ route -T ${RDOMAIN2} exec bgpctl network add 2001:db8:66::/48 community 0:2 sleep 4 echo test1: check propagation route -T ${RDOMAIN1} exec bgpctl show rib out | tee maxattr.test1.out +echo "regular peer" >> maxattr.test1.out route -T ${RDOMAIN2} exec bgpctl -s /var/run/bgpd.sock.12_2 show rib | tee -a maxattr.test1.out +echo "extended message peer" >> maxattr.test1.out +route -T ${RDOMAIN2} exec bgpctl -s /var/run/bgpd.sock.12_3 show rib | tee -a maxattr.test1.out echo update prefixes route -T ${RDOMAIN2} exec bgpctl network add 10.12.62.0/24 community 0:1 community 42:1 @@ -119,7 +127,10 @@ route -T ${RDOMAIN2} exec bgpctl network add 2001:db8:66::/48 community 0:2 comm sleep 2 echo test2: check propagation route -T ${RDOMAIN1} exec bgpctl show rib out | tee maxattr.test2.out +echo "regular peer" >> maxattr.test2.out route -T ${RDOMAIN2} exec bgpctl -s /var/run/bgpd.sock.12_2 show rib | tee -a maxattr.test2.out +echo "extended message peer" >> maxattr.test2.out +route -T ${RDOMAIN2} exec bgpctl -s /var/run/bgpd.sock.12_3 show rib | tee -a maxattr.test2.out echo check results diff -u ${BGPDCONFIGDIR}/maxattr.test1.ok maxattr.test1.out diff --git a/regress/usr.sbin/bgpd/integrationtests/maxattr.test1.ok b/regress/usr.sbin/bgpd/integrationtests/maxattr.test1.ok index ccc86b5f5..299c0285c 100644 --- a/regress/usr.sbin/bgpd/integrationtests/maxattr.test1.ok +++ b/regress/usr.sbin/bgpd/integrationtests/maxattr.test1.ok @@ -19,6 +19,43 @@ flags vs destination gateway lpref med aspath origin * N-? 2001:db8:64::/48 2001:db8:57::2 100 0 4200000001 4200000002 i * N-? 2001:db8:65::/48 2001:db8:57::2 100 0 4200000001 4200000002 i * N-? 2001:db8:66::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +* N-? 10.12.60.0/24 10.12.57.2 100 0 4200000001 4200000002 i +* N-? 10.12.61.0/24 10.12.57.2 100 0 4200000001 4200000002 i +* N-? 10.12.62.0/24 10.12.57.2 100 0 4200000001 4200000002 i +* N-? 10.12.63.0/24 10.12.57.2 100 0 4200000001 4200000002 i +* N-? 10.12.64.0/24 10.12.57.2 100 0 4200000001 4200000002 i +* N-? 10.12.65.0/24 10.12.57.2 100 0 4200000001 4200000002 i +* N-? 10.12.66.0/24 10.12.57.2 100 0 4200000001 4200000002 i +* N-? 2001:db8:60::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +* N-? 2001:db8:61::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +* N-? 2001:db8:62::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +* N-? 2001:db8:63::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +* N-? 2001:db8:64::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +* N-? 2001:db8:65::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +* N-? 2001:db8:66::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +regular peer +flags: * = Valid, > = Selected, I = via IBGP, A = Announced, + S = Stale, E = Error, F = Filtered +origin validation state: N = not-found, V = valid, ! = invalid +aspa validation state: ? = unknown, V = valid, ! = invalid +origin: i = IGP, e = EGP, ? = Incomplete + +flags vs destination gateway lpref med aspath origin +*> N-? 10.12.60.0/24 10.12.57.2 100 0 4200000001 4200000002 i +*> N-? 10.12.61.0/24 10.12.57.2 100 0 4200000001 4200000002 i +*> N-? 10.12.62.0/24 10.12.57.2 100 0 4200000001 4200000002 i +*> N-? 10.12.63.0/24 10.12.57.2 100 0 4200000001 4200000002 i +*> N-? 10.12.64.0/24 10.12.57.2 100 0 4200000001 4200000002 i +*> N-? 10.12.65.0/24 10.12.57.2 100 0 4200000001 4200000002 i +*> N-? 10.12.66.0/24 10.12.57.2 100 0 4200000001 4200000002 i +*> N-? 2001:db8:60::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +*> N-? 2001:db8:61::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +*> N-? 2001:db8:62::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +*> N-? 2001:db8:63::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +*> N-? 2001:db8:64::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +*> N-? 2001:db8:65::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +*> N-? 2001:db8:66::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +extended message peer flags: * = Valid, > = Selected, I = via IBGP, A = Announced, S = Stale, E = Error, F = Filtered origin validation state: N = not-found, V = valid, ! = invalid diff --git a/regress/usr.sbin/bgpd/integrationtests/maxattr.test2.ok b/regress/usr.sbin/bgpd/integrationtests/maxattr.test2.ok index f6b8cc08a..173fb88e1 100644 --- a/regress/usr.sbin/bgpd/integrationtests/maxattr.test2.ok +++ b/regress/usr.sbin/bgpd/integrationtests/maxattr.test2.ok @@ -19,6 +19,21 @@ flags vs destination gateway lpref med aspath origin * N-? 2001:db8:64::/48 2001:db8:57::2 100 0 4200000001 4200000002 i * N-? 2001:db8:65::/48 2001:db8:57::2 100 0 4200000001 4200000002 i * N-? 2001:db8:66::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +* N-? 10.12.60.0/24 10.12.57.2 100 0 4200000001 4200000002 i +* N-? 10.12.61.0/24 10.12.57.2 100 0 4200000001 4200000002 i +* N-? 10.12.62.0/24 10.12.57.2 100 0 4200000001 4200000001 4200000002 i +* N-? 10.12.63.0/24 10.12.57.2 100 0 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000002 i +* N-? 10.12.64.0/24 10.12.57.2 100 0 4200000001 4200000002 i +* N-? 10.12.65.0/24 10.12.57.2 100 0 4200000001 4200000002 i +* N-? 10.12.66.0/24 10.12.57.2 100 0 4200000001 4200000002 i +* N-? 2001:db8:60::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +* N-? 2001:db8:61::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +* N-? 2001:db8:62::/48 2001:db8:57::2 100 0 4200000001 4200000001 4200000002 i +* N-? 2001:db8:63::/48 2001:db8:57::2 100 0 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000002 i +* N-? 2001:db8:64::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +* N-? 2001:db8:65::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +* N-? 2001:db8:66::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +regular peer flags: * = Valid, > = Selected, I = via IBGP, A = Announced, S = Stale, E = Error, F = Filtered origin validation state: N = not-found, V = valid, ! = invalid @@ -32,3 +47,25 @@ flags vs destination gateway lpref med aspath origin *> N-? 2001:db8:60::/48 2001:db8:57::2 100 0 4200000001 4200000002 i *> N-? 2001:db8:61::/48 2001:db8:57::2 100 0 4200000001 4200000002 i *> N-? 2001:db8:66::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +extended message peer +flags: * = Valid, > = Selected, I = via IBGP, A = Announced, + S = Stale, E = Error, F = Filtered +origin validation state: N = not-found, V = valid, ! = invalid +aspa validation state: ? = unknown, V = valid, ! = invalid +origin: i = IGP, e = EGP, ? = Incomplete + +flags vs destination gateway lpref med aspath origin +*> N-? 10.12.60.0/24 10.12.57.2 100 0 4200000001 4200000002 i +*> N-? 10.12.61.0/24 10.12.57.2 100 0 4200000001 4200000002 i +*> N-? 10.12.62.0/24 10.12.57.2 100 0 4200000001 4200000001 4200000002 i +*> N-? 10.12.63.0/24 10.12.57.2 100 0 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000002 i +*> N-? 10.12.64.0/24 10.12.57.2 100 0 4200000001 4200000002 i +*> N-? 10.12.65.0/24 10.12.57.2 100 0 4200000001 4200000002 i +*> N-? 10.12.66.0/24 10.12.57.2 100 0 4200000001 4200000002 i +*> N-? 2001:db8:60::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +*> N-? 2001:db8:61::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +*> N-? 2001:db8:62::/48 2001:db8:57::2 100 0 4200000001 4200000001 4200000002 i +*> N-? 2001:db8:63::/48 2001:db8:57::2 100 0 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000001 4200000002 i +*> N-? 2001:db8:64::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +*> N-? 2001:db8:65::/48 2001:db8:57::2 100 0 4200000001 4200000002 i +*> N-? 2001:db8:66::/48 2001:db8:57::2 100 0 4200000001 4200000002 i diff --git a/regress/usr.sbin/btrace/Makefile b/regress/usr.sbin/btrace/Makefile index 10fc07fd0..9214f221f 100644 --- a/regress/usr.sbin/btrace/Makefile +++ b/regress/usr.sbin/btrace/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.32 2024/09/06 08:00:36 mpi Exp $ +# $OpenBSD: Makefile,v 1.33 2024/12/04 09:33:41 mpi Exp $ BTRACE?= /usr/sbin/btrace ALLOWDT!= sysctl -n kern.allowdt 2>/dev/null @@ -7,7 +7,7 @@ ALLOWDT!= sysctl -n kern.allowdt 2>/dev/null BT_LANG_SCRIPTS= arithm beginend beginend-argn boolean comments \ delete exit histempty if \ map mapclear mapempty mapsyntax mapzero map-unnamed \ - maxoperand min+max+sum multismts nsecs+var \ + maxoperand min+max+sum multiend multismts nsecs+var \ precedence print printf read-map-after-clear \ staticv-empty syntaxerror tuple tupleeval vareval diff --git a/regress/usr.sbin/btrace/multiend.bt b/regress/usr.sbin/btrace/multiend.bt new file mode 100644 index 000000000..a18395e23 --- /dev/null +++ b/regress/usr.sbin/btrace/multiend.bt @@ -0,0 +1,5 @@ +END +{ } + +END +{ } diff --git a/regress/usr.sbin/btrace/multiend.ok b/regress/usr.sbin/btrace/multiend.ok new file mode 100644 index 000000000..246e6a822 --- /dev/null +++ b/regress/usr.sbin/btrace/multiend.ok @@ -0,0 +1 @@ +btrace: Cannot register multiple probes of the same type: 'END' diff --git a/regress/usr.sbin/btrace/multiprobe.bt b/regress/usr.sbin/btrace/multiprobe.bt index fbee65916..efe0137f4 100644 --- a/regress/usr.sbin/btrace/multiprobe.bt +++ b/regress/usr.sbin/btrace/multiprobe.bt @@ -1,10 +1,3 @@ -BEGIN, -interval:hz:50 -{ - printf("multi\n"); -} - +interval:hz:50, interval:hz:100 -{ - exit(); -} +{ } diff --git a/regress/usr.sbin/btrace/multiprobe.ok b/regress/usr.sbin/btrace/multiprobe.ok index 9b34aa063..5ccc865dc 100644 --- a/regress/usr.sbin/btrace/multiprobe.ok +++ b/regress/usr.sbin/btrace/multiprobe.ok @@ -1,2 +1 @@ -multi -multi +btrace: Cannot register multiple probes of the same type: 'interval:hz:100' diff --git a/regress/usr.sbin/btrace/printf.bt b/regress/usr.sbin/btrace/printf.bt index f025d0bbc..72d484f3d 100644 --- a/regress/usr.sbin/btrace/printf.bt +++ b/regress/usr.sbin/btrace/printf.bt @@ -1,4 +1,9 @@ BEGIN { $c = 0x41; // 'A' printf("%c%c%c\n", $c, 0x41, 65); + + $t = "two " // multi-line string + "times" /* with comments */ ""; + printf("%s multi-" + "line\n", $t); } diff --git a/regress/usr.sbin/btrace/printf.ok b/regress/usr.sbin/btrace/printf.ok index 43d5a8ed6..663f16707 100644 --- a/regress/usr.sbin/btrace/printf.ok +++ b/regress/usr.sbin/btrace/printf.ok @@ -1 +1,2 @@ AAA +two times multi-line diff --git a/regress/usr.sbin/installboot/Makefile b/regress/usr.sbin/installboot/Makefile index da2762065..35fdcac27 100644 --- a/regress/usr.sbin/installboot/Makefile +++ b/regress/usr.sbin/installboot/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.40 2023/08/21 14:25:22 kn Exp $ +# $OpenBSD: Makefile,v 1.41 2025/01/03 02:23:20 kn Exp $ INSTALLBOOT ?= /usr/sbin/installboot DRY_RUN = ${INSTALLBOOT} -n @@ -7,9 +7,9 @@ REAL_RUN = ${INSTALLBOOT} # see distrib/${MACHINE}/ramdisk/install.md for FORMAT_DISK values # default to root on softraid(4) on all architectures that have # bootstrap + kernel + installboot(8) support for it -.if ${MACHINE} == "amd64" || \ - ${MACHINE} == "i386" # assume BIOS/MBR -FORMAT_DISK = fdisk -iy +.if ${MACHINE} == "amd64" # assume EFI/GPT +FORMAT_DISK = fdisk -gy -b 532480 +DISK_BLOCKS = 768 STAGENAMES = biosboot boot USE_SOFTRAID ?= Yes .elif ${MACHINE} == "arm64" @@ -17,6 +17,10 @@ STAGENAMES = BOOTAA64.EFI USE_SOFTRAID ?= Yes .elif ${MACHINE} == "armv7" STAGENAMES = BOOTARM.EFI +.elif ${MACHINE} == "i386" +FORMAT_DISK = fdisk -iy +STAGENAMES = biosboot boot +USE_SOFTRAID ?= Yes .elif ${MACHINE} == "macppc" # assume MBR FORMAT_DISK = fdisk -iy -b '2048@1:06' STAGENAMES = ofwboot @@ -38,8 +42,9 @@ regress: @echo SKIPPED .endif -# how distrib/$(arch -s)/*/install.md:md_prep_disklabel() formats the root disk +# how distrib/$(arch -s)/*/install.md:md_prep_fdisk() formats the root disk FORMAT_DISK ?= fdisk -iy -b '32768@32768:C' +DISK_BLOCKS ?= 128 STAGEDIR = /usr/mdec STAGEFILES = ${STAGENAMES:=${STAGEDIR}/%} # is installboot(8) built with -DSOFTRAID? @@ -72,7 +77,7 @@ FILETUPLES != { echo ${DISKFILES} ${KEYDISKFILE}; \ rs -T -- $$((${NDISKS} + 1)) 2 create-disks: .for diskfile devfile in ${FILETUPLES} - dd if=/dev/zero of=${diskfile} bs=1m count=0 seek=128 status=none + dd if=/dev/zero of=${diskfile} bs=1m count=0 seek=${DISK_BLOCKS} status=none ${SUDO} vnconfig -- ${diskfile} 1>${devfile} ${SUDO} ${FORMAT_DISK} -- "$$(<${devfile})" 1>/dev/null . if ${USE_SOFTRAID:L} == "yes" diff --git a/regress/usr.sbin/relayd/Client.pm b/regress/usr.sbin/relayd/Client.pm index 4edf4cb5b..7aaa0401e 100644 --- a/regress/usr.sbin/relayd/Client.pm +++ b/regress/usr.sbin/relayd/Client.pm @@ -1,4 +1,4 @@ -# $OpenBSD: Client.pm,v 1.14 2021/12/22 11:50:28 bluhm Exp $ +# $OpenBSD: Client.pm,v 1.15 2024/10/28 19:57:02 tb Exp $ # Copyright (c) 2010-2021 Alexander Bluhm # @@ -58,6 +58,11 @@ sub child { PeerAddr => $self->{connectaddr}, PeerPort => $self->{connectport}, SSL_verify_mode => SSL_VERIFY_NONE, + SSL_use_cert => $self->{offertlscert} ? 1 : 0, + SSL_cert_file => $self->{offertlscert} ? + "client.crt" : "", + SSL_key_file => $self->{offertlscert} ? + "client.key" : "", ) or die ref($self), " $iosocket socket connect failed: $!,$SSL_ERROR"; if ($self->{sndbuf}) { setsockopt($cs, SOL_SOCKET, SO_SNDBUF, @@ -89,6 +94,14 @@ sub child { print STDERR "ssl cipher: ",$cs->get_cipher(),"\n"; print STDERR "ssl peer certificate:\n", $cs->dump_peer_certificate(); + + if ($self->{offertlscert}) { + print STDERR "ssl client certificate:\n"; + print STDERR "Subject Name: ", + "${\$cs->sock_certificate('subject')}\n"; + print STDERR "Issuer Name: ", + "${\$cs->sock_certificate('issuer')}\n"; + } } *STDIN = *STDOUT = $self->{cs} = $cs; diff --git a/regress/usr.sbin/relayd/Makefile b/regress/usr.sbin/relayd/Makefile index 885fd1a84..bcc238ca4 100644 --- a/regress/usr.sbin/relayd/Makefile +++ b/regress/usr.sbin/relayd/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.21 2021/12/30 20:51:34 dv Exp $ +# $OpenBSD: Makefile,v 1.23 2024/12/27 10:53:46 bluhm Exp $ # The following ports must be installed for the regression tests: # p5-Socket6 Perl defines relating to AF_INET6 sockets @@ -71,8 +71,11 @@ run-$a: $a # create certificates for TLS .for ip in ${REMOTE_ADDR} 127.0.0.1 -${ip}.crt: ca.crt - openssl req -batch -new -subj /L=OpenBSD/O=relayd-regress/OU=relayd/CN=${ip}/ -nodes -newkey rsa -keyout ${ip}.key -x509 -out $@ +${ip}.crt: ca.crt client-ca.crt + openssl req -batch -new \ + -subj /L=OpenBSD/O=relayd-regress/OU=relayd/CN=${ip}/ \ + -nodes -newkey rsa -keyout ${ip}.key -x509 \ + -out $@ .if empty (REMOTE_SSH) ${SUDO} cp 127.0.0.1.crt /etc/ssl/ ${SUDO} cp 127.0.0.1.key /etc/ssl/private/ @@ -80,19 +83,31 @@ ${ip}.crt: ca.crt scp ${REMOTE_ADDR}.crt root@${REMOTE_SSH}:/etc/ssl/ scp ${REMOTE_ADDR}.key root@${REMOTE_SSH}:/etc/ssl/private/ scp ca.crt ca.key ${REMOTE_SSH}: + scp client-ca.crt client-ca.key ${REMOTE_SSH}: .endif .endfor -ca.crt: - openssl req -batch -new -subj /L=OpenBSD/O=relayd-regress/OU=ca/CN=root/ -nodes -newkey rsa -keyout ca.key -x509 -out ca.crt +ca.crt client-ca.crt: + openssl req -batch -new \ + -subj /L=OpenBSD/O=relayd-regress/OU=${@:R}/CN=root/ \ + -nodes -newkey rsa -keyout ${@:R}.key -x509 \ + -out $@ -server.req: - openssl req -batch -new -subj /L=OpenBSD/O=relayd-regress/OU=server/CN=localhost/ -nodes -newkey rsa -keyout server.key -out server.req +server.req client.req: + openssl req -batch -new \ + -subj /L=OpenBSD/O=relayd-regress/OU=${@:R}/CN=localhost/ \ + -nodes -newkey rsa -keyout ${@:R}.key \ + -out $@ server.crt: ca.crt server.req - openssl x509 -CAcreateserial -CAkey ca.key -CA ca.crt -req -in server.req -out server.crt + openssl x509 -CAcreateserial -CAkey ca.key -CA ca.crt \ + -req -in server.req -out server.crt -${REGRESS_TARGETS:M*ssl*} ${REGRESS_TARGETS:M*https*}: server.crt +client.crt: client-ca.crt client.req + openssl x509 -CAcreateserial -CAkey client-ca.key -CA client-ca.crt \ + -req -in client.req -out client.crt + +${REGRESS_TARGETS:M*ssl*} ${REGRESS_TARGETS:M*https*}: server.crt client.crt .if empty (REMOTE_SSH) ${REGRESS_TARGETS:M*ssl*} ${REGRESS_TARGETS:M*https*}: 127.0.0.1.crt .else diff --git a/regress/usr.sbin/relayd/Relayd.pm b/regress/usr.sbin/relayd/Relayd.pm index 6b5d0e299..2a6aa926d 100644 --- a/regress/usr.sbin/relayd/Relayd.pm +++ b/regress/usr.sbin/relayd/Relayd.pm @@ -1,4 +1,4 @@ -# $OpenBSD: Relayd.pm,v 1.19 2021/10/12 05:42:39 anton Exp $ +# $OpenBSD: Relayd.pm,v 1.20 2024/10/28 19:57:02 tb Exp $ # Copyright (c) 2010-2015 Alexander Bluhm # @@ -85,6 +85,9 @@ sub new { print $fh "\n\ttls ca cert ca.crt"; print $fh "\n\ttls ca key ca.key password ''"; } + if ($self->{verifyclient}) { + print $fh "\n\ttls client ca client-ca.crt"; + } # substitute variables in config file foreach (@protocol) { s/(\$[a-z]+)/$1/eeg; diff --git a/regress/usr.sbin/relayd/args-ssl-client-verify-fail.pl b/regress/usr.sbin/relayd/args-ssl-client-verify-fail.pl new file mode 100644 index 000000000..45099a167 --- /dev/null +++ b/regress/usr.sbin/relayd/args-ssl-client-verify-fail.pl @@ -0,0 +1,33 @@ +# test client ssl certificate verification + +use strict; +use warnings; + +our %args = ( + client => { + ssl => 1, + offertlscert => 0, + # no-op func as we cannot connect without presenting a client certificate, + # hence the default write_char function won't work here and block forever. + func => sub { + errignore(); + sleep(2); + }, + dryrun => 1, + nocheck => 1, + }, + relayd => { + listenssl => 1, + verifyclient => 1, + loggrep => { + qr/peer did not return a certificate/ => 1, + qr/tls session \d+ established/ => 0, + }, + }, + server => { + noserver => 1, + nocheck => 1, + }, +); + +1; diff --git a/regress/usr.sbin/relayd/args-ssl-client-verify.pl b/regress/usr.sbin/relayd/args-ssl-client-verify.pl new file mode 100644 index 000000000..c5cc31107 --- /dev/null +++ b/regress/usr.sbin/relayd/args-ssl-client-verify.pl @@ -0,0 +1,19 @@ +# test client ssl certificate verification + +use strict; +use warnings; + +our %args = ( + client => { + ssl => 1, + offertlscert => 1, + }, + relayd => { + listenssl => 1, + verifyclient => 1, + }, + len => 251, + md5 => "bc3a3f39af35fe5b1687903da2b00c7f", +); + +1; diff --git a/regress/usr.sbin/rpki-client/test-http.c b/regress/usr.sbin/rpki-client/test-http.c index 830bb9ca6..3ab3742f7 100644 --- a/regress/usr.sbin/rpki-client/test-http.c +++ b/regress/usr.sbin/rpki-client/test-http.c @@ -13,7 +13,7 @@ #include "extern.h" -static struct msgbuf httpq; +static struct msgbuf *httpq; void logx(const char *fmt, ...) @@ -66,7 +66,7 @@ http_request(unsigned int id, const char *uri, const char *last_mod, int fd) io_str_buffer(b, last_mod); /* pass file as fd */ b->fd = fd; - io_close_buffer(&httpq, b); + io_close_buffer(httpq, b); } static const char * @@ -87,13 +87,21 @@ http_result(enum http_result res) static int http_response(int fd) { - struct ibuf *b, *httpbuf = NULL; + struct ibuf *b; unsigned int id; enum http_result res; char *lastmod; - while ((b = io_buf_read(fd, &httpbuf)) == NULL) - /* nothing */ ; + while (1) { + switch (msgbuf_read(fd, httpq)) { + case -1: + err(1, "msgbuf_read"); + case 0: + errx(1, "msgbuf_read: connection closed"); + } + if ((b = io_buf_get(httpq)) != NULL) + break; + } io_read_buf(b, &id, sizeof(id)); io_read_buf(b, &res, sizeof(res)); @@ -111,7 +119,7 @@ int main(int argc, char **argv) { pid_t httppid; - int error, fd[2], outfd, http; + int error, fd[2], outfd, httpfd; int fl = SOCK_STREAM | SOCK_CLOEXEC; char *uri, *file, *mod; unsigned int req = 0; @@ -141,20 +149,17 @@ main(int argc, char **argv) } close(fd[0]); - http = fd[1]; - msgbuf_init(&httpq); - httpq.fd = http; + httpfd = fd[1]; + if ((httpq = msgbuf_new_reader(sizeof(size_t), io_parse_hdr, NULL)) == + NULL) + err(1, NULL); if ((outfd = open(file, O_WRONLY|O_CREAT|O_TRUNC, 0666)) == -1) err(1, "open %s", file); http_request(req++, uri, mod, outfd); - switch (msgbuf_write(&httpq)) { - case 0: - errx(1, "write: connection closed"); - case -1: + if (msgbuf_write(httpfd, httpq) == -1) err(1, "write"); - } - error = http_response(http); + error = http_response(httpfd); return error; } diff --git a/regress/usr.sbin/syslogd/args-client-tls-handshake.pl b/regress/usr.sbin/syslogd/args-client-tls-handshake.pl new file mode 100644 index 000000000..c1419396b --- /dev/null +++ b/regress/usr.sbin/syslogd/args-client-tls-handshake.pl @@ -0,0 +1,34 @@ +# The syslogd listens on localhost TLS socket. +# The client checks that syslogd logs complete handshake. +# The client writes a message into a localhost TLS socket. +# The syslogd writes it into a file and through a pipe. +# The syslogd passes it via UDP to the loghost. +# The server receives the message on its UDP socket. +# Find the message in client, file, pipe, syslogd, server log. +# Check completed tls handshake log before writing any log message. + +use strict; +use warnings; +use Socket; + +our %args = ( + client => { + connect => { domain => AF_UNSPEC, proto => "tls", addr => "localhost", + port => 6514 }, + func => sub { + my $self = shift; + ${$self->{syslogd}}->loggrep("Completed tls handshake", 5) + or die ref($self), " no completed tls handshake syslogd.log"; + write_log($self); + }, + }, + syslogd => { + options => ["-S", "localhost"], + loggrep => { + qr/Accepting tcp connection/ => 1, + qr/Completed tls handshake/ => 1, + }, + }, +); + +1; diff --git a/sbin/dhcp6leased/control.c b/sbin/dhcp6leased/control.c index 364b9ada4..699e5aeac 100644 --- a/sbin/dhcp6leased/control.c +++ b/sbin/dhcp6leased/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.3 2024/06/05 16:15:47 florian Exp $ */ +/* $OpenBSD: control.c,v 1.9 2024/11/21 13:35:20 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -156,7 +156,12 @@ control_accept(int listenfd, short event, void *bula) return; } - imsg_init(&c->iev.ibuf, connfd); + if (imsgbuf_init(&c->iev.ibuf, connfd) == -1) { + log_warn("%s: imsgbuf_init", __func__); + close(connfd); + free(c); + return; + } c->iev.handler = control_dispatch_imsg; c->iev.events = EV_READ; event_set(&c->iev.ev, c->iev.ibuf.fd, c->iev.events, @@ -202,7 +207,7 @@ control_close(int fd) return; } - msgbuf_clear(&c->iev.ibuf.w); + imsgbuf_clear(&c->iev.ibuf); TAILQ_REMOVE(&ctl_conns, c, entry); event_del(&c->iev.ev); @@ -231,14 +236,13 @@ control_dispatch_imsg(int fd, short event, void *bula) } if (event & EV_READ) { - if (((n = imsg_read(&c->iev.ibuf)) == -1 && errno != EAGAIN) || - n == 0) { + if (imsgbuf_read(&c->iev.ibuf) != 1) { control_close(fd); return; } } if (event & EV_WRITE) { - if (msgbuf_write(&c->iev.ibuf.w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(&c->iev.ibuf) == -1) { control_close(fd); return; } diff --git a/sbin/dhcp6leased/dhcp6leased.8 b/sbin/dhcp6leased/dhcp6leased.8 index 762fa4344..4c565a1f0 100644 --- a/sbin/dhcp6leased/dhcp6leased.8 +++ b/sbin/dhcp6leased/dhcp6leased.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: dhcp6leased.8,v 1.1 2024/06/02 12:28:05 florian Exp $ +.\" $OpenBSD: dhcp6leased.8,v 1.2 2024/10/30 17:01:28 florian Exp $ .\" .\" Copyright (c) 2024 Florian Obser .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: June 2 2024 $ +.Dd $Mdocdate: October 30 2024 $ .Dt DHCP6LEASED 8 .Os .Sh NAME @@ -31,6 +31,15 @@ is an IPv6 dynamic host configuration protocol (DHCPv6) daemon for clients. It requests IPv6 prefix delegations from DHCPv6 servers for assignment to downstream interfaces. .Pp +DHCPv6 clients are identified by DHCPv6 Unique Identifiers (DUID). +.Nm +uses a DUID based on a random Universally Unique Identifier +(UUID). +The DUID is stored in +.Pa /var/db/dhcp6leased/uuid . +If the file does not exist or the UUID is not readable a new UUID is +generated. +.Pp A running .Nm can be controlled with the @@ -70,6 +79,8 @@ Default configuration file. .It Pa /var/db/dhcp6leased/ Ns Aq Ar if Interface specific lease files. +.It Pa /var/db/dhcp6leased/uuid +DUID to identify this client. .El .Sh SEE ALSO .Xr dhcp6leased.conf 5 , diff --git a/sbin/dhcp6leased/dhcp6leased.c b/sbin/dhcp6leased/dhcp6leased.c index 8c2fb7e55..ae29f5a94 100644 --- a/sbin/dhcp6leased/dhcp6leased.c +++ b/sbin/dhcp6leased/dhcp6leased.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dhcp6leased.c,v 1.12 2024/07/11 10:38:57 florian Exp $ */ +/* $OpenBSD: dhcp6leased.c,v 1.19 2024/11/21 13:35:20 claudio Exp $ */ /* * Copyright (c) 2017, 2021, 2024 Florian Obser @@ -260,9 +260,13 @@ main(int argc, char *argv[]) if ((iev_frontend = malloc(sizeof(struct imsgev))) == NULL || (iev_engine = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_frontend->ibuf, pipe_main2frontend[0]); + if (imsgbuf_init(&iev_frontend->ibuf, pipe_main2frontend[0]) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_frontend->ibuf); iev_frontend->handler = main_dispatch_frontend; - imsg_init(&iev_engine->ibuf, pipe_main2engine[0]); + if (imsgbuf_init(&iev_engine->ibuf, pipe_main2engine[0]) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_engine->ibuf); iev_engine->handler = main_dispatch_engine; /* Setup event handlers for pipes to engine & frontend. */ @@ -338,9 +342,9 @@ main_shutdown(void) int status; /* Close pipes. */ - msgbuf_clear(&iev_frontend->ibuf.w); + imsgbuf_clear(&iev_frontend->ibuf); close(iev_frontend->ibuf.fd); - msgbuf_clear(&iev_engine->ibuf.w); + imsgbuf_clear(&iev_engine->ibuf); close(iev_engine->ibuf.fd); config_clear(main_conf); @@ -426,16 +430,18 @@ main_dispatch_frontend(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -502,16 +508,18 @@ main_dispatch_engine(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1 && errno != EAGAIN) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -596,7 +604,7 @@ void imsg_event_add(struct imsgev *iev) { iev->events = EV_READ; - if (iev->ibuf.w.queued) + if (imsgbuf_queuelen(&iev->ibuf) > 0) iev->events |= EV_WRITE; event_del(&iev->ev); @@ -630,11 +638,11 @@ main_imsg_send_ipc_sockets(struct imsgbuf *frontend_buf, if (imsg_compose(frontend_buf, IMSG_SOCKET_IPC, 0, 0, pipe_frontend2engine[0], NULL, 0) == -1) return (-1); - imsg_flush(frontend_buf); + imsgbuf_flush(frontend_buf); if (imsg_compose(engine_buf, IMSG_SOCKET_IPC, 0, 0, pipe_frontend2engine[1], NULL, 0) == -1) return (-1); - imsg_flush(engine_buf); + imsgbuf_flush(engine_buf); return (0); } diff --git a/sbin/dhcp6leased/dhcp6leased.conf.5 b/sbin/dhcp6leased/dhcp6leased.conf.5 index ca5f3fbf7..f005dd0e2 100644 --- a/sbin/dhcp6leased/dhcp6leased.conf.5 +++ b/sbin/dhcp6leased/dhcp6leased.conf.5 @@ -1,4 +1,4 @@ -.\" $OpenBSD: dhcp6leased.conf.5,v 1.3 2024/06/03 11:08:31 florian Exp $ +.\" $OpenBSD: dhcp6leased.conf.5,v 1.4 2024/11/01 08:27:49 kn Exp $ .\" .\" Copyright (c) 2018, 2021, 2024 Florian Obser .\" Copyright (c) 2005 Esben Norby @@ -18,7 +18,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: June 3 2024 $ +.Dd $Mdocdate: November 1 2024 $ .Dt DHCP6LEASED.CONF 5 .Os .Sh NAME @@ -65,14 +65,14 @@ from the server instead of the normal four-message exchange. .El .Sh PREFIX DELEGATION A list of interfaces on which to request prefix delegation: -.Bd -unfilled -offset indent -.Ic request prefix delegation on Ar name Ic for Ar { name/prefix Oo Ar name/prefix ... Oc } -.Ed +.Bl -tag -width Ds +.It Ic request prefix delegation on Ar name Ic for Brq Ar name Ns Oo / Ns Ar prefix Oc Ar ... +.El .Pp -This requests a prefix delegation on +This requests a prefix delegation on the upstream network interface .Ar name -upstream network interface for the list of -.Ar name/prefix +for the list of +.Ar name Ns Op / Ns Ar prefix network interfaces. If .Ar prefix diff --git a/sbin/dhcp6leased/engine.c b/sbin/dhcp6leased/engine.c index e410a5a46..80c8d3bc1 100644 --- a/sbin/dhcp6leased/engine.c +++ b/sbin/dhcp6leased/engine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: engine.c,v 1.24 2024/07/11 10:48:51 florian Exp $ */ +/* $OpenBSD: engine.c,v 1.31 2024/12/24 17:40:06 florian Exp $ */ /* * Copyright (c) 2017, 2021, 2024 Florian Obser @@ -135,6 +135,7 @@ void request_dhcp_discover(struct dhcp6leased_iface *); void request_dhcp_request(struct dhcp6leased_iface *); void configure_interfaces(struct dhcp6leased_iface *); void deconfigure_interfaces(struct dhcp6leased_iface *); +void deprecate_interfaces(struct dhcp6leased_iface *); int prefixcmp(struct prefix *, struct prefix *, int); void send_reconfigure_interface(struct iface_pd_conf *, struct prefix *, enum reconfigure_action); @@ -215,7 +216,9 @@ engine(int debug, int verbose) if ((iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_main->ibuf, 3); + if (imsgbuf_init(&iev_main->ibuf, 3) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_main->ibuf); iev_main->handler = engine_dispatch_main; /* Setup event handlers. */ @@ -235,9 +238,9 @@ __dead void engine_shutdown(void) { /* Close pipes. */ - msgbuf_clear(&iev_frontend->ibuf.w); + imsgbuf_clear(&iev_frontend->ibuf); close(iev_frontend->ibuf.fd); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); free(iev_frontend); @@ -276,16 +279,18 @@ engine_dispatch_frontend(int fd, short event, void *bula) uint32_t if_index; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -383,16 +388,18 @@ engine_dispatch_main(int fd, short event, void *bula) int shut = 0; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -419,7 +426,8 @@ engine_dispatch_main(int fd, short event, void *bula) if (iev_frontend == NULL) fatal(NULL); - imsg_init(&iev_frontend->ibuf, fd); + if (imsgbuf_init(&iev_frontend->ibuf, fd) == -1) + fatal(NULL); iev_frontend->handler = engine_dispatch_frontend; iev_frontend->events = EV_READ; @@ -1042,8 +1050,19 @@ state_transition(struct dhcp6leased_iface *iface, enum if_state new_state) switch (new_state) { case IF_DOWN: + switch (old_state) { + case IF_RENEWING: + case IF_REBINDING: + case IF_REBOOTING: + case IF_BOUND: + deprecate_interfaces(iface); + break; + default: + break; + } /* - * Nothing to do until iface comes up. IP addresses will expire. + * Nothing else to do until iface comes up. + * IP addresses will expire. */ iface->timo.tv_sec = -1; break; @@ -1380,6 +1399,58 @@ deconfigure_interfaces(struct dhcp6leased_iface *iface) memset(iface->pds, 0, sizeof(iface->pds)); } +void +deprecate_interfaces(struct dhcp6leased_iface *iface) +{ + struct iface_conf *iface_conf; + struct iface_ia_conf *ia_conf; + struct iface_pd_conf *pd_conf; + struct timespec now, diff; + uint32_t i; + char ntopbuf[INET6_ADDRSTRLEN]; + char ifnamebuf[IF_NAMESIZE], *if_name; + + + if ((if_name = if_indextoname(iface->if_index, ifnamebuf)) == NULL) { + log_debug("%s: unknown interface %d", __func__, + iface->if_index); + return; + } + if ((iface_conf = find_iface_conf(&engine_conf->iface_list, if_name)) + == NULL) { + log_debug("%s: no interface configuration for %d", __func__, + iface->if_index); + return; + } + + for (i = 0; i < iface_conf->ia_count; i++) { + struct prefix *pd = &iface->pds[i]; + + log_info("%s went down, deprecating prefix delegation #%d %s/%d" + " from server %s", if_name, i, inet_ntop(AF_INET6, + &pd->prefix, ntopbuf, INET6_ADDRSTRLEN), pd->prefix_len, + dhcp_duid2str(iface->serverid_len, iface->serverid)); + } + + clock_gettime(CLOCK_MONOTONIC, &now); + timespecsub(&now, &iface->request_time, &diff); + + SIMPLEQ_FOREACH(ia_conf, &iface_conf->iface_ia_list, entry) { + struct prefix *pd = &iface->pds[ia_conf->id]; + + if (pd->vltime > diff.tv_sec) + pd->vltime -= diff.tv_sec; + else + pd->vltime = 0; + + pd->pltime = 0; + + SIMPLEQ_FOREACH(pd_conf, &ia_conf->iface_pd_list, entry) { + send_reconfigure_interface(pd_conf, pd, CONFIGURE); + } + } +} + int prefixcmp(struct prefix *a, struct prefix *b, int count) { diff --git a/sbin/dhcp6leased/frontend.c b/sbin/dhcp6leased/frontend.c index 06c343fc6..2abdf8cc7 100644 --- a/sbin/dhcp6leased/frontend.c +++ b/sbin/dhcp6leased/frontend.c @@ -1,4 +1,4 @@ -/* $OpenBSD: frontend.c,v 1.14 2024/07/11 13:38:03 florian Exp $ */ +/* $OpenBSD: frontend.c,v 1.20 2024/11/21 13:35:20 claudio Exp $ */ /* * Copyright (c) 2017, 2021, 2024 Florian Obser @@ -180,7 +180,9 @@ frontend(int debug, int verbose) /* Setup pipe and event handler to the parent process. */ if ((iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_main->ibuf, 3); + if (imsgbuf_init(&iev_main->ibuf, 3) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_main->ibuf); iev_main->handler = frontend_dispatch_main; iev_main->events = EV_READ; event_set(&iev_main->ev, iev_main->ibuf.fd, iev_main->events, @@ -197,11 +199,11 @@ __dead void frontend_shutdown(void) { /* Close pipes. */ - msgbuf_write(&iev_engine->ibuf.w); - msgbuf_clear(&iev_engine->ibuf.w); + imsgbuf_write(&iev_engine->ibuf); + imsgbuf_clear(&iev_engine->ibuf); close(iev_engine->ibuf.fd); - msgbuf_write(&iev_main->ibuf.w); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_write(&iev_main->ibuf); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); config_clear(frontend_conf); @@ -243,16 +245,18 @@ frontend_dispatch_main(int fd, short event, void *bula) int shut = 0, udpsock, if_index; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -280,7 +284,8 @@ frontend_dispatch_main(int fd, short event, void *bula) if (iev_engine == NULL) fatal(NULL); - imsg_init(&iev_engine->ibuf, fd); + if (imsgbuf_init(&iev_engine->ibuf, fd) == -1) + fatal(NULL); iev_engine->handler = frontend_dispatch_engine; iev_engine->events = EV_READ; @@ -447,16 +452,18 @@ frontend_dispatch_engine(int fd, short event, void *bula) int shut = 0; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { diff --git a/sbin/dhcpleased/control.c b/sbin/dhcpleased/control.c index 87bd77578..fa0c3dbf6 100644 --- a/sbin/dhcpleased/control.c +++ b/sbin/dhcpleased/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.6 2024/09/01 20:24:42 tb Exp $ */ +/* $OpenBSD: control.c,v 1.12 2024/11/21 13:35:20 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -156,7 +156,12 @@ control_accept(int listenfd, short event, void *bula) return; } - imsg_init(&c->iev.ibuf, connfd); + if (imsgbuf_init(&c->iev.ibuf, connfd) == -1) { + log_warn("%s: imsgbuf_init", __func__); + close(connfd); + free(c); + return; + } c->iev.handler = control_dispatch_imsg; c->iev.events = EV_READ; event_set(&c->iev.ev, c->iev.ibuf.fd, c->iev.events, @@ -202,7 +207,7 @@ control_close(int fd) return; } - msgbuf_clear(&c->iev.ibuf.w); + imsgbuf_clear(&c->iev.ibuf); TAILQ_REMOVE(&ctl_conns, c, entry); event_del(&c->iev.ev); @@ -233,14 +238,13 @@ control_dispatch_imsg(int fd, short event, void *bula) } if (event & EV_READ) { - if (((n = imsg_read(&c->iev.ibuf)) == -1 && errno != EAGAIN) || - n == 0) { + if (imsgbuf_read(&c->iev.ibuf) != 1) { control_close(fd); return; } } if (event & EV_WRITE) { - if (msgbuf_write(&c->iev.ibuf.w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(&c->iev.ibuf) == -1) { control_close(fd); return; } diff --git a/sbin/dhcpleased/dhcpleased.c b/sbin/dhcpleased/dhcpleased.c index d3ff1cefa..eadb2eb87 100644 --- a/sbin/dhcpleased/dhcpleased.c +++ b/sbin/dhcpleased/dhcpleased.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dhcpleased.c,v 1.32 2024/08/27 05:55:39 florian Exp $ */ +/* $OpenBSD: dhcpleased.c,v 1.39 2024/11/21 13:35:20 claudio Exp $ */ /* * Copyright (c) 2017, 2021 Florian Obser @@ -273,9 +273,13 @@ main(int argc, char *argv[]) if ((iev_frontend = malloc(sizeof(struct imsgev))) == NULL || (iev_engine = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_frontend->ibuf, pipe_main2frontend[0]); + if (imsgbuf_init(&iev_frontend->ibuf, pipe_main2frontend[0]) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_frontend->ibuf); iev_frontend->handler = main_dispatch_frontend; - imsg_init(&iev_engine->ibuf, pipe_main2engine[0]); + if (imsgbuf_init(&iev_engine->ibuf, pipe_main2engine[0]) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_engine->ibuf); iev_engine->handler = main_dispatch_engine; /* Setup event handlers for pipes to engine & frontend. */ @@ -352,9 +356,9 @@ main_shutdown(void) int status; /* Close pipes. */ - msgbuf_clear(&iev_frontend->ibuf.w); + imsgbuf_clear(&iev_frontend->ibuf); close(iev_frontend->ibuf.fd); - msgbuf_clear(&iev_engine->ibuf.w); + imsgbuf_clear(&iev_engine->ibuf); close(iev_engine->ibuf.fd); #ifndef SMALL @@ -444,16 +448,18 @@ main_dispatch_frontend(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -524,16 +530,18 @@ main_dispatch_engine(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -649,7 +657,7 @@ void imsg_event_add(struct imsgev *iev) { iev->events = EV_READ; - if (iev->ibuf.w.queued) + if (imsgbuf_queuelen(&iev->ibuf) > 0) iev->events |= EV_WRITE; event_del(&iev->ev); @@ -694,11 +702,11 @@ main_imsg_send_ipc_sockets(struct imsgbuf *frontend_buf, if (imsg_compose(frontend_buf, IMSG_SOCKET_IPC, 0, 0, pipe_frontend2engine[0], NULL, 0) == -1) return (-1); - imsg_flush(frontend_buf); + imsgbuf_flush(frontend_buf); if (imsg_compose(engine_buf, IMSG_SOCKET_IPC, 0, 0, pipe_frontend2engine[1], NULL, 0) == -1) return (-1); - imsg_flush(engine_buf); + imsgbuf_flush(engine_buf); return (0); } diff --git a/sbin/dhcpleased/dhcpleased.conf.5 b/sbin/dhcpleased/dhcpleased.conf.5 index 27798d74d..fdf9a6ac4 100644 --- a/sbin/dhcpleased/dhcpleased.conf.5 +++ b/sbin/dhcpleased/dhcpleased.conf.5 @@ -1,4 +1,4 @@ -.\" $OpenBSD: dhcpleased.conf.5,v 1.13 2023/11/25 12:00:39 florian Exp $ +.\" $OpenBSD: dhcpleased.conf.5,v 1.15 2024/11/11 15:19:31 florian Exp $ .\" .\" Copyright (c) 2018, 2021 Florian Obser .\" Copyright (c) 2005 Esben Norby @@ -18,7 +18,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: November 25 2023 $ +.Dd $Mdocdate: November 11 2024 $ .Dt DHCPLEASED.CONF 5 .Os .Sh NAME @@ -50,9 +50,8 @@ Macro names may not be reserved words (for example, Macros are not expanded inside quotes. .Sh INTERFACES A list of interfaces to overwrite defaults: -.Bd -unfilled -offset indent -.Ic interface Ar name Cm { Oo Ar option ... Oc Cm } -.Ed +.Bl -tag -width Ds +.It Ic interface Ar name Brq Ar option ... .Pp .Ic interface options are as follows: @@ -113,6 +112,7 @@ Send the DHCP vendor class identifier option with a value of .Ar vendor-class-id . The default is to not send a vendor class identifier. .El +.El .Sh FILES .Bl -tag -width /etc/dhcpleased.conf -compact .It Pa /etc/dhcpleased.conf diff --git a/sbin/dhcpleased/engine.c b/sbin/dhcpleased/engine.c index f7c433895..ba7489f9d 100644 --- a/sbin/dhcpleased/engine.c +++ b/sbin/dhcpleased/engine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: engine.c,v 1.49 2024/08/26 06:06:04 florian Exp $ */ +/* $OpenBSD: engine.c,v 1.55 2024/11/21 13:35:20 claudio Exp $ */ /* * Copyright (c) 2017, 2021 Florian Obser @@ -226,7 +226,9 @@ engine(int debug, int verbose) if ((iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_main->ibuf, 3); + if (imsgbuf_init(&iev_main->ibuf, 3) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_main->ibuf); iev_main->handler = engine_dispatch_main; /* Setup event handlers. */ @@ -246,9 +248,9 @@ __dead void engine_shutdown(void) { /* Close pipes. */ - msgbuf_clear(&iev_frontend->ibuf.w); + imsgbuf_clear(&iev_frontend->ibuf); close(iev_frontend->ibuf.fd); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); free(iev_frontend); @@ -289,16 +291,18 @@ engine_dispatch_frontend(int fd, short event, void *bula) uint32_t if_index, type; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -404,16 +408,18 @@ engine_dispatch_main(int fd, short event, void *bula) int shut = 0; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -442,7 +448,8 @@ engine_dispatch_main(int fd, short event, void *bula) if (iev_frontend == NULL) fatal(NULL); - imsg_init(&iev_frontend->ibuf, fd); + if (imsgbuf_init(&iev_frontend->ibuf, fd) == -1) + fatal(NULL); iev_frontend->handler = engine_dispatch_frontend; iev_frontend->events = EV_READ; diff --git a/sbin/dhcpleased/frontend.c b/sbin/dhcpleased/frontend.c index dd81bd892..6174792fc 100644 --- a/sbin/dhcpleased/frontend.c +++ b/sbin/dhcpleased/frontend.c @@ -1,4 +1,4 @@ -/* $OpenBSD: frontend.c,v 1.39 2024/09/16 07:34:49 florian Exp $ */ +/* $OpenBSD: frontend.c,v 1.45 2024/11/21 13:35:20 claudio Exp $ */ /* * Copyright (c) 2017, 2021 Florian Obser @@ -177,7 +177,9 @@ frontend(int debug, int verbose) /* Setup pipe and event handler to the parent process. */ if ((iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_main->ibuf, 3); + if (imsgbuf_init(&iev_main->ibuf, 3) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_main->ibuf); iev_main->handler = frontend_dispatch_main; iev_main->events = EV_READ; event_set(&iev_main->ev, iev_main->ibuf.fd, iev_main->events, @@ -194,11 +196,11 @@ __dead void frontend_shutdown(void) { /* Close pipes. */ - msgbuf_write(&iev_engine->ibuf.w); - msgbuf_clear(&iev_engine->ibuf.w); + imsgbuf_write(&iev_engine->ibuf); + imsgbuf_clear(&iev_engine->ibuf); close(iev_engine->ibuf.fd); - msgbuf_write(&iev_main->ibuf.w); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_write(&iev_main->ibuf); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); #ifndef SMALL @@ -242,16 +244,18 @@ frontend_dispatch_main(int fd, short event, void *bula) int shut = 0, bpfsock, if_index, udpsock; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -281,7 +285,8 @@ frontend_dispatch_main(int fd, short event, void *bula) if (iev_engine == NULL) fatal(NULL); - imsg_init(&iev_engine->ibuf, fd); + if (imsgbuf_init(&iev_engine->ibuf, fd) == -1) + fatal(NULL); iev_engine->handler = frontend_dispatch_engine; iev_engine->events = EV_READ; @@ -483,16 +488,18 @@ frontend_dispatch_engine(int fd, short event, void *bula) int shut = 0; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { diff --git a/sbin/dhcpleased/parse.y b/sbin/dhcpleased/parse.y index 4414684e0..501d13dbc 100644 --- a/sbin/dhcpleased/parse.y +++ b/sbin/dhcpleased/parse.y @@ -1,4 +1,4 @@ -/* $OpenBSD: parse.y,v 1.9 2024/06/03 17:58:33 deraadt Exp $ */ +/* $OpenBSD: parse.y,v 1.10 2024/11/11 15:19:31 florian Exp $ */ /* * Copyright (c) 2018 Florian Obser @@ -172,7 +172,6 @@ dhcp_iface : DHCP_IFACE STRING { ; iface_block : optnl ifaceopts_l - | optnl ; ifaceopts_l : ifaceopts_l ifaceoptsl nl diff --git a/sbin/fdisk/gpt.c b/sbin/fdisk/gpt.c index 55f10d95a..41f87e8cf 100644 --- a/sbin/fdisk/gpt.c +++ b/sbin/fdisk/gpt.c @@ -1,4 +1,4 @@ -/* $OpenBSD: gpt.c,v 1.94 2024/05/21 05:00:47 jsg Exp $ */ +/* $OpenBSD: gpt.c,v 1.95 2024/12/24 21:34:23 krw Exp $ */ /* * Copyright (c) 2015 Markus Muller * Copyright (c) 2015 Kenneth R Westerback @@ -66,7 +66,7 @@ string_to_name(const unsigned int pn, const char *ch) memset(gp[pn].gp_name, 0, sizeof(gp[pn].gp_name)); - for (i = 0; i < sizeof(gp[pn].gp_name) && ch[i] != '\0'; i++) + for (i = 0; i < nitems(gp[pn].gp_name) && ch[i] != '\0'; i++) gp[pn].gp_name[i] = htole16((unsigned int)ch[i]); } diff --git a/sbin/fsck_ext2fs/Makefile b/sbin/fsck_ext2fs/Makefile index a69ca0d71..c0301d2f6 100644 --- a/sbin/fsck_ext2fs/Makefile +++ b/sbin/fsck_ext2fs/Makefile @@ -1,10 +1,12 @@ -# $OpenBSD: Makefile,v 1.8 2001/09/18 13:31:29 art Exp $ +# $OpenBSD: Makefile,v 1.9 2024/12/18 10:36:05 sthen Exp $ PROG= fsck_ext2fs -MAN= fsck_ext2fs.8 +MAN= fsck_ext2fs.8 SRCS= dir.c inode.c main.c pass1.c pass1b.c pass2.c pass3.c pass4.c \ pass5.c fsutil.c setup.c utilities.c ext2fs_bswap.c .PATH: ${.CURDIR}/../../sys/ufs/ext2fs ${.CURDIR}/../fsck CFLAGS+= -I${.CURDIR}/../fsck +DPADD+= ${LIBUTIL} +LDADD+= -lutil .include diff --git a/sbin/fsck_ext2fs/setup.c b/sbin/fsck_ext2fs/setup.c index d1508963b..0c7c01646 100644 --- a/sbin/fsck_ext2fs/setup.c +++ b/sbin/fsck_ext2fs/setup.c @@ -1,4 +1,4 @@ -/* $OpenBSD: setup.c,v 1.34 2024/07/15 13:32:50 martijn Exp $ */ +/* $OpenBSD: setup.c,v 1.35 2024/12/18 10:36:05 sthen Exp $ */ /* $NetBSD: setup.c,v 1.1 1997/06/11 11:22:01 bouyer Exp $ */ /* @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -60,6 +61,7 @@ void badsb(int, char *); int calcsb(char *, int, struct m_ext2fs *, struct disklabel *); static struct disklabel *getdisklabel(char *, int); static int readsb(int); +static char rdevname[PATH_MAX]; int setup(char *dev) @@ -70,28 +72,36 @@ setup(char *dev) off_t sizepb; struct stat statb; struct m_ext2fs proto; + char *realdev; int doskipclean; u_int64_t maxfilesize; havesb = 0; fswritefd = -1; doskipclean = skipclean; - if (stat(dev, &statb) == -1) { - printf("Can't stat %s: %s\n", dev, strerror(errno)); - return (0); - } - if (!S_ISCHR(statb.st_mode)) { - pfatal("%s is not a character device", dev); - if (reply("CONTINUE") == 0) - return (0); - } - if ((fsreadfd = open(dev, O_RDONLY)) == -1) { + if ((fsreadfd = opendev(dev, O_RDONLY, 0, &realdev)) == -1) { printf("Can't open %s: %s\n", dev, strerror(errno)); return (0); } + if (strncmp(dev, realdev, PATH_MAX) != 0) { + blockcheck(unrawname(realdev)); + strlcpy(rdevname, realdev, sizeof(rdevname)); + setcdevname(rdevname, dev, preen); + } + if (fstat(fsreadfd, &statb) == -1) { + printf("Can't stat %s: %s\n", realdev, strerror(errno)); + return (0); + } + if (!S_ISCHR(statb.st_mode)) { + pfatal("%s is not a character device", realdev); + if (reply("CONTINUE") == 0) { + close(fsreadfd); + return (0); + } + } if (preen == 0) - printf("** %s", dev); - if (nflag || (fswritefd = open(dev, O_WRONLY)) == -1) { + printf("** %s", realdev); + if (nflag || (fswritefd = opendev(dev, O_WRONLY, 0, NULL)) == -1) { fswritefd = -1; if (preen) pfatal("NO WRITE ACCESS"); @@ -126,7 +136,7 @@ setup(char *dev) * Read in the superblock, looking for alternates if necessary */ if (readsb(1) == 0) { - if (bflag || preen || calcsb(dev, fsreadfd, &proto, lp) == 0) + if (bflag || preen || calcsb(realdev, fsreadfd, &proto, lp) == 0) return(0); if (reply("LOOK FOR ALTERNATE SUPERBLOCKS") == 0) return (0); diff --git a/sbin/ifconfig/brconfig.c b/sbin/ifconfig/brconfig.c index f6a3d0ef6..4eb8d6cd4 100644 --- a/sbin/ifconfig/brconfig.c +++ b/sbin/ifconfig/brconfig.c @@ -1,4 +1,4 @@ -/* $OpenBSD: brconfig.c,v 1.32 2023/11/23 03:38:34 dlg Exp $ */ +/* $OpenBSD: brconfig.c,v 1.33 2025/01/06 17:49:29 denis Exp $ */ /* * Copyright (c) 1999, 2000 Jason L. Wright (jason@thought.net) @@ -692,6 +692,29 @@ bridge_addendpoint(const char *endpoint, const char *addr) err(1, "%s endpoint %s %s", ifname, endpoint, addr); } +void +bridge_delendpoint(const char *addr, int d) +{ + struct ifbareq ifba; + struct ether_addr *ea; + int ecode; + + ea = ether_aton(addr); + if (ea == NULL) { + errx(1, "%s -endpoint %s: invalid Ethernet address", + ifname, addr); + } + + memset(&ifba, 0, sizeof(ifba)); + strlcpy(ifba.ifba_name, ifname, sizeof(ifba.ifba_name)); + strlcpy(ifba.ifba_ifsname, ifname, sizeof(ifba.ifba_ifsname)); + memcpy(&ifba.ifba_dst, ea, sizeof(struct ether_addr)); + ifba.ifba_flags = IFBAF_STATIC; + + if (ioctl(sock, SIOCBRDGDADDR, &ifba) == -1) + err(1, "%s -endpoint %s", ifname, addr); +} + void bridge_addrs(const char *delim, int d) { diff --git a/sbin/ifconfig/ifconfig.8 b/sbin/ifconfig/ifconfig.8 index 121bb1e8f..421c6b291 100644 --- a/sbin/ifconfig/ifconfig.8 +++ b/sbin/ifconfig/ifconfig.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ifconfig.8,v 1.400 2024/06/09 16:25:27 jan Exp $ +.\" $OpenBSD: ifconfig.8,v 1.401 2025/01/06 17:49:29 denis Exp $ .\" $NetBSD: ifconfig.8,v 1.11 1996/01/04 21:27:29 pk Exp $ .\" $FreeBSD: ifconfig.8,v 1.16 1998/02/01 07:03:29 steve Exp $ .\" @@ -31,7 +31,7 @@ .\" .\" @(#)ifconfig.8 8.4 (Berkeley) 6/1/94 .\" -.Dd $Mdocdate: June 9 2024 $ +.Dd $Mdocdate: January 6 2025 $ .Dt IFCONFIG 8 .Os .Sh NAME @@ -1841,6 +1841,7 @@ for a complete list of the available protocols. .Bk -words .Nm ifconfig .Ar tunnel-interface +.Op Oo Fl Oc Ns Cm endpoint Ar dest_address dest_mac .Op Oo Fl Oc Ns Cm keepalive Ar period count .Op Oo Fl Oc Ns Cm parent Ar parent-interface .Op Cm rxprio Ar prio @@ -1867,6 +1868,20 @@ and are all tunnel interfaces. The following options are available: .Bl -tag -width Ds +.It Cm endpoint Ar dest_address dest_mac +When +.Xr vxlan 4 +is in endpoint mode, set the tunnel endpoint +.Ar dest_address +where +.Ar dest_mac +MAC address can be reached. +.It Cm -endpoint Ar dest_mac +When +.Xr vxlan 4 +is in endpoint mode, remove the tunnel endpoint for +.Ar dest_mac +MAC address. .It Cm keepalive Ar period count Enable .Xr gre 4 diff --git a/sbin/ifconfig/ifconfig.c b/sbin/ifconfig/ifconfig.c index e3b925fbc..4e865668a 100644 --- a/sbin/ifconfig/ifconfig.c +++ b/sbin/ifconfig/ifconfig.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ifconfig.c,v 1.474 2024/06/29 12:09:51 jsg Exp $ */ +/* $OpenBSD: ifconfig.c,v 1.475 2025/01/06 17:49:29 denis Exp $ */ /* $NetBSD: ifconfig.c,v 1.40 1997/10/01 02:19:43 enami Exp $ */ /* @@ -578,6 +578,7 @@ const struct cmd { { "flushall", 0, 0, bridge_flushall }, { "static", NEXTARG2, 0, NULL, bridge_addaddr }, { "endpoint", NEXTARG2, 0, NULL, bridge_addendpoint }, + { "-endpoint", NEXTARG, 0, bridge_delendpoint }, { "deladdr", NEXTARG, 0, bridge_deladdr }, { "maxaddr", NEXTARG, 0, bridge_maxaddr }, { "addr", 0, 0, bridge_addrs }, @@ -624,7 +625,7 @@ const struct cmd { { "wgpeer", NEXTARG, A_WIREGUARD, setwgpeer}, { "wgdescription", NEXTARG, A_WIREGUARD, setwgpeerdesc}, { "wgdescr", NEXTARG, A_WIREGUARD, setwgpeerdesc}, - { "wgendpoint", NEXTARG2, A_WIREGUARD, NULL, setwgpeerep}, + { "wgendpoint", NEXTARG2, A_WIREGUARD, NULL, setwgpeerep}, { "wgaip", NEXTARG, A_WIREGUARD, setwgpeeraip}, { "wgpsk", NEXTARG, A_WIREGUARD, setwgpeerpsk}, { "wgpka", NEXTARG, A_WIREGUARD, setwgpeerpka}, diff --git a/sbin/ifconfig/ifconfig.h b/sbin/ifconfig/ifconfig.h index 7df268f46..6bc17d56a 100644 --- a/sbin/ifconfig/ifconfig.h +++ b/sbin/ifconfig/ifconfig.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ifconfig.h,v 1.5 2023/11/23 03:38:34 dlg Exp $ */ +/* $OpenBSD: ifconfig.h,v 1.6 2025/01/06 17:49:29 denis Exp $ */ /* * Copyright (c) 2009 Claudio Jeker @@ -49,6 +49,7 @@ void bridge_flush(const char *, int); void bridge_flushall(const char *, int); void bridge_addaddr(const char *, const char *); void bridge_addendpoint(const char *, const char *); +void bridge_delendpoint(const char *, int); void bridge_deladdr(const char *, int); void bridge_maxaddr(const char *, int); void bridge_addrs(const char *, int); diff --git a/sbin/iked/control.c b/sbin/iked/control.c index f37d4867e..7bba4cba8 100644 --- a/sbin/iked/control.c +++ b/sbin/iked/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.39 2024/05/21 05:00:47 jsg Exp $ */ +/* $OpenBSD: control.c,v 1.45 2024/11/21 13:35:20 claudio Exp $ */ /* * Copyright (c) 2010-2013 Reyk Floeter @@ -191,7 +191,12 @@ control_accept(int listenfd, short event, void *arg) return; } - imsg_init(&c->iev.ibuf, connfd); + if (imsgbuf_init(&c->iev.ibuf, connfd) == -1) { + log_warn("%s", __func__); + close(connfd); + free(c); + return; + } c->iev.handler = control_dispatch_imsg; c->iev.events = EV_READ; c->iev.data = cs; @@ -231,7 +236,7 @@ control_close(int fd, struct control_sock *cs) return; } - msgbuf_clear(&c->iev.ibuf.w); + imsgbuf_clear(&c->iev.ibuf); TAILQ_REMOVE(&ctl_conns, c, entry); event_del(&c->iev.ev); @@ -261,14 +266,13 @@ control_dispatch_imsg(int fd, short event, void *arg) } if (event & EV_READ) { - if (((n = imsg_read(&c->iev.ibuf)) == -1 && errno != EAGAIN) || - n == 0) { + if (imsgbuf_read(&c->iev.ibuf) != 1) { control_close(fd, cs); return; } } if (event & EV_WRITE) { - if (msgbuf_write(&c->iev.ibuf.w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(&c->iev.ibuf) == -1) { control_close(fd, cs); return; } diff --git a/sbin/iked/crypto.c b/sbin/iked/crypto.c index e7a361c63..03915475e 100644 --- a/sbin/iked/crypto.c +++ b/sbin/iked/crypto.c @@ -1,4 +1,4 @@ -/* $OpenBSD: crypto.c,v 1.46 2023/08/04 19:06:25 claudio Exp $ */ +/* $OpenBSD: crypto.c,v 1.47 2024/11/21 13:26:49 claudio Exp $ */ /* * Copyright (c) 2010-2013 Reyk Floeter @@ -572,7 +572,7 @@ cipher_init(struct iked_cipher *encr, int enc) encr->encr_saltlength), encr->encr_saltlength); if (nonce == NULL) return (-1); - if (ibuf_add_buf(nonce, encr->encr_iv) != 0) + if (ibuf_add_ibuf(nonce, encr->encr_iv) != 0) goto done; if (EVP_CipherInit_ex(encr->encr_ctx, NULL, NULL, ibuf_data(encr->encr_key), ibuf_data(nonce), enc) != 1) diff --git a/sbin/iked/eap.c b/sbin/iked/eap.c index 24d1a898b..7100b33fb 100644 --- a/sbin/iked/eap.c +++ b/sbin/iked/eap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: eap.c,v 1.27 2024/07/13 12:22:46 yasuoka Exp $ */ +/* $OpenBSD: eap.c,v 1.28 2024/11/21 13:26:49 claudio Exp $ */ /* * Copyright (c) 2010-2013 Reyk Floeter @@ -117,7 +117,7 @@ eap_identity_request(struct iked *env, struct iked_sa *sa) if ((pld = ikev2_add_payload(e)) == NULL) goto done; firstpayload = IKEV2_PAYLOAD_IDr; - if (ibuf_add_buf(e, id->id_buf) != 0) + if (ibuf_add_ibuf(e, id->id_buf) != 0) goto done; len = ibuf_size(id->id_buf); @@ -132,7 +132,7 @@ eap_identity_request(struct iked *env, struct iked_sa *sa) if ((cert = ibuf_reserve(e, sizeof(*cert))) == NULL) goto done; cert->cert_type = certid->id_type; - if (ibuf_add_buf(e, certid->id_buf) != 0) + if (ibuf_add_ibuf(e, certid->id_buf) != 0) goto done; len = ibuf_size(certid->id_buf) + sizeof(*cert); @@ -147,7 +147,7 @@ eap_identity_request(struct iked *env, struct iked_sa *sa) if ((cert = ibuf_reserve(e, sizeof(*cert))) == NULL) goto done; cert->cert_type = sa->sa_scert[i].id_type; - if (ibuf_add_buf(e, sa->sa_scert[i].id_buf) != 0) + if (ibuf_add_ibuf(e, sa->sa_scert[i].id_buf) != 0) goto done; len = ibuf_size(sa->sa_scert[i].id_buf) + sizeof(*cert); } @@ -162,7 +162,7 @@ eap_identity_request(struct iked *env, struct iked_sa *sa) if ((auth = ibuf_reserve(e, sizeof(*auth))) == NULL) goto done; auth->auth_method = sa->sa_localauth.id_type; - if (ibuf_add_buf(e, sa->sa_localauth.id_buf) != 0) + if (ibuf_add_ibuf(e, sa->sa_localauth.id_buf) != 0) goto done; len = ibuf_size(sa->sa_localauth.id_buf) + sizeof(*auth); diff --git a/sbin/iked/iked.c b/sbin/iked/iked.c index b69a35443..8feaadef5 100644 --- a/sbin/iked/iked.c +++ b/sbin/iked/iked.c @@ -1,4 +1,4 @@ -/* $OpenBSD: iked.c,v 1.71 2024/07/13 12:22:46 yasuoka Exp $ */ +/* $OpenBSD: iked.c,v 1.72 2024/12/26 18:24:54 sthen Exp $ */ /* * Copyright (c) 2019 Tobias Heider @@ -178,10 +178,6 @@ main(int argc, char *argv[]) group_init(); policy_init(env); - /* check for root privileges */ - if (geteuid()) - errx(1, "need root privileges"); - if ((ps->ps_pw = getpwnam(IKED_USER)) == NULL) errx(1, "unknown user %s", IKED_USER); @@ -193,6 +189,11 @@ main(int argc, char *argv[]) if (opts & IKED_OPT_NOACTION) ps->ps_noaction = 1; + else { + /* check for root privileges */ + if (geteuid()) + errx(1, "need root privileges"); + } ps->ps_instance = proc_instance; if (title != NULL) diff --git a/sbin/iked/iked.conf.5 b/sbin/iked/iked.conf.5 index c3c0fa7bb..624f371ca 100644 --- a/sbin/iked/iked.conf.5 +++ b/sbin/iked/iked.conf.5 @@ -1,4 +1,4 @@ -.\" $OpenBSD: iked.conf.5,v 1.98 2024/07/13 12:58:51 jmc Exp $ +.\" $OpenBSD: iked.conf.5,v 1.99 2024/11/04 02:44:28 dlg Exp $ .\" .\" Copyright (c) 2010 - 2014 Reyk Floeter .\" Copyright (c) 2004 Mathieu Sauve-Frankel All rights reserved. @@ -15,7 +15,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: July 13 2024 $ +.Dd $Mdocdate: November 4 2024 $ .Dt IKED.CONF 5 .Os .Sh NAME @@ -348,6 +348,10 @@ and the default is .Ar tunnel . .Pp +.It Op Ar natt +.Ar natt +forces negotiation of NAT-Traversal after the initial handshake. +.Pp .It Op Ar encap .Ar encap specifies the encapsulation protocol to be used. diff --git a/sbin/iked/iked.h b/sbin/iked/iked.h index d3da0b7b3..367ea7604 100644 --- a/sbin/iked/iked.h +++ b/sbin/iked/iked.h @@ -1,4 +1,4 @@ -/* $OpenBSD: iked.h,v 1.232 2024/09/15 11:08:50 yasuoka Exp $ */ +/* $OpenBSD: iked.h,v 1.233 2024/11/04 02:44:28 dlg Exp $ */ /* * Copyright (c) 2019 Tobias Heider @@ -250,16 +250,17 @@ struct iked_policy { #define IKED_SKIP_COUNT 4 struct iked_policy *pol_skip[IKED_SKIP_COUNT]; - uint8_t pol_flags; -#define IKED_POLICY_PASSIVE 0x00 -#define IKED_POLICY_DEFAULT 0x01 -#define IKED_POLICY_ACTIVE 0x02 -#define IKED_POLICY_REFCNT 0x04 -#define IKED_POLICY_QUICK 0x08 -#define IKED_POLICY_SKIP 0x10 -#define IKED_POLICY_IPCOMP 0x20 -#define IKED_POLICY_TRANSPORT 0x40 -#define IKED_POLICY_ROUTING 0x80 + unsigned int pol_flags; +#define IKED_POLICY_PASSIVE 0x000 +#define IKED_POLICY_DEFAULT 0x001 +#define IKED_POLICY_ACTIVE 0x002 +#define IKED_POLICY_REFCNT 0x004 +#define IKED_POLICY_QUICK 0x008 +#define IKED_POLICY_SKIP 0x010 +#define IKED_POLICY_IPCOMP 0x020 +#define IKED_POLICY_TRANSPORT 0x040 +#define IKED_POLICY_ROUTING 0x080 +#define IKED_POLICY_NATT_FORCE 0x100 int pol_refcnt; diff --git a/sbin/iked/ikev2.c b/sbin/iked/ikev2.c index b6e8ecee9..330f3b814 100644 --- a/sbin/iked/ikev2.c +++ b/sbin/iked/ikev2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ikev2.c,v 1.388 2024/09/15 11:08:50 yasuoka Exp $ */ +/* $OpenBSD: ikev2.c,v 1.390 2024/11/21 13:26:49 claudio Exp $ */ /* * Copyright (c) 2019 Tobias Heider @@ -70,7 +70,6 @@ struct iked_sa * ikev2_getimsgdata(struct iked *, struct imsg *, struct iked_sahdr *, uint8_t *, uint8_t **, size_t *); -void ikev2_recv(struct iked *, struct iked_message *); int ikev2_ike_auth_compatible(struct iked_sa *, uint8_t, uint8_t); int ikev2_ike_auth_recv(struct iked *, struct iked_sa *, struct iked_message *); @@ -1628,7 +1627,7 @@ ikev2_init_ike_auth(struct iked *env, struct iked_sa *sa) if ((pld = ikev2_add_payload(e)) == NULL) goto done; firstpayload = IKEV2_PAYLOAD_IDi; - if (ibuf_add_buf(e, id->id_buf) != 0) + if (ibuf_add_ibuf(e, id->id_buf) != 0) goto done; len = ibuf_size(id->id_buf); @@ -1642,7 +1641,7 @@ ikev2_init_ike_auth(struct iked *env, struct iked_sa *sa) goto done; if ((pld = ikev2_add_payload(e)) == NULL) goto done; - if (ibuf_add_buf(e, peerid.id_buf) != 0) + if (ibuf_add_ibuf(e, peerid.id_buf) != 0) goto done; len = ibuf_size(peerid.id_buf); } @@ -1658,7 +1657,7 @@ ikev2_init_ike_auth(struct iked *env, struct iked_sa *sa) if ((cert = ibuf_reserve(e, sizeof(*cert))) == NULL) goto done; cert->cert_type = certid->id_type; - if (ibuf_add_buf(e, certid->id_buf) != 0) + if (ibuf_add_ibuf(e, certid->id_buf) != 0) goto done; len = ibuf_size(certid->id_buf) + sizeof(*cert); @@ -1673,7 +1672,7 @@ ikev2_init_ike_auth(struct iked *env, struct iked_sa *sa) if ((cert = ibuf_reserve(e, sizeof(*cert))) == NULL) goto done; cert->cert_type = sa->sa_scert[i].id_type; - if (ibuf_add_buf(e, sa->sa_scert[i].id_buf) != 0) + if (ibuf_add_ibuf(e, sa->sa_scert[i].id_buf) != 0) goto done; len = ibuf_size(sa->sa_scert[i].id_buf) + sizeof(*cert); } @@ -1698,7 +1697,7 @@ ikev2_init_ike_auth(struct iked *env, struct iked_sa *sa) if ((auth = ibuf_reserve(e, sizeof(*auth))) == NULL) goto done; auth->auth_method = sa->sa_localauth.id_type; - if (ibuf_add_buf(e, sa->sa_localauth.id_buf) != 0) + if (ibuf_add_ibuf(e, sa->sa_localauth.id_buf) != 0) goto done; len = ibuf_size(sa->sa_localauth.id_buf) + sizeof(*auth); @@ -2232,7 +2231,7 @@ ikev2_add_vendor_id(struct ibuf *e, struct ikev2_payload **pld, return (-1); if ((*pld = ikev2_add_payload(e)) == NULL) return (-1); - if (ibuf_add_buf(e, id) == -1) + if (ibuf_add_ibuf(e, id) == -1) return (-1); return (ibuf_size(id)); @@ -2334,6 +2333,7 @@ ikev2_nat_detection(struct iked *env, struct iked_message *msg, uint64_t rspi, ispi; struct ibuf *buf; uint32_t rnd; + int natt_force = 0; if (ptr == NULL) return (mdlen); @@ -2401,7 +2401,14 @@ ikev2_nat_detection(struct iked *env, struct iked_message *msg, goto done; } - if (env->sc_nattmode == NATT_FORCE) { + if (env->sc_nattmode == NATT_FORCE) + natt_force = 1; + else if (msg->msg_policy != NULL) { + if (msg->msg_policy->pol_flags & IKED_POLICY_NATT_FORCE) + natt_force = 1; + } + + if (natt_force) { /* Enforce NAT-T/UDP-encapsulation by distorting the digest */ rnd = arc4random(); EVP_DigestUpdate(ctx, &rnd, sizeof(rnd)); @@ -3395,6 +3402,7 @@ ikev2_resp_ike_sa_init(struct iked *env, struct iked_message *msg) resp.msg_fd = msg->msg_fd; resp.msg_natt = msg->msg_natt; resp.msg_msgid = 0; + resp.msg_policy = sa->sa_policy; /* IKE header */ if ((hdr = ikev2_add_header(buf, sa, resp.msg_msgid, @@ -3702,6 +3710,7 @@ ikev2_send_init_error(struct iked *env, struct iked_message *msg) resp.msg_fd = msg->msg_fd; resp.msg_natt = msg->msg_natt; resp.msg_msgid = 0; + resp.msg_policy = sa->sa_policy; /* IKE header */ if ((hdr = ikev2_add_header(buf, sa, resp.msg_msgid, @@ -3937,7 +3946,7 @@ ikev2_resp_ike_auth(struct iked *env, struct iked_sa *sa) if ((pld = ikev2_add_payload(e)) == NULL) goto done; firstpayload = IKEV2_PAYLOAD_IDr; - if (ibuf_add_buf(e, id->id_buf) != 0) + if (ibuf_add_ibuf(e, id->id_buf) != 0) goto done; len = ibuf_size(id->id_buf); @@ -3953,7 +3962,7 @@ ikev2_resp_ike_auth(struct iked *env, struct iked_sa *sa) if ((cert = ibuf_reserve(e, sizeof(*cert))) == NULL) goto done; cert->cert_type = certid->id_type; - if (ibuf_add_buf(e, certid->id_buf) != 0) + if (ibuf_add_ibuf(e, certid->id_buf) != 0) goto done; len = ibuf_size(certid->id_buf) + sizeof(*cert); @@ -3969,7 +3978,7 @@ ikev2_resp_ike_auth(struct iked *env, struct iked_sa *sa) sizeof(*cert))) == NULL) goto done; cert->cert_type = sa->sa_scert[i].id_type; - if (ibuf_add_buf(e, sa->sa_scert[i].id_buf) != + if (ibuf_add_ibuf(e, sa->sa_scert[i].id_buf) != 0) goto done; len = ibuf_size(sa->sa_scert[i].id_buf) @@ -3988,7 +3997,7 @@ ikev2_resp_ike_auth(struct iked *env, struct iked_sa *sa) if ((auth = ibuf_reserve(e, sizeof(*auth))) == NULL) goto done; auth->auth_method = sa->sa_localauth.id_type; - if (ibuf_add_buf(e, sa->sa_localauth.id_buf) != 0) + if (ibuf_add_ibuf(e, sa->sa_localauth.id_buf) != 0) goto done; len = ibuf_size(sa->sa_localauth.id_buf) + sizeof(*auth); @@ -4067,7 +4076,7 @@ ikev2_send_ike_e(struct iked *env, struct iked_sa *sa, struct ibuf *buf, if ((pld = ikev2_add_payload(e)) == NULL) goto done; - if (ibuf_add_buf(e, buf) != 0) + if (ibuf_add_ibuf(e, buf) != 0) goto done; if (ikev2_next_payload(pld, ibuf_size(buf), @@ -5355,7 +5364,7 @@ ikev2_send_informational(struct iked *env, struct iked_message *msg) log_debug("%s: encryption failed", __func__); goto done; } - if (ibuf_add_buf(buf, e) != 0) + if (ibuf_add_ibuf(buf, e) != 0) goto done; if (ikev2_next_payload(pld, ibuf_size(e), IKEV2_PAYLOAD_NOTIFY) == -1) @@ -5386,7 +5395,7 @@ ikev2_send_informational(struct iked *env, struct iked_message *msg) IKEV2_PAYLOAD_NOTIFY, IKEV2_EXCHANGE_INFORMATIONAL, 0)) == NULL) goto done; - if (ibuf_add_buf(buf, e) != 0) + if (ibuf_add_ibuf(buf, e) != 0) goto done; if (ikev2_set_header(hdr, ibuf_size(buf) - sizeof(*hdr)) == -1) goto done; @@ -5967,7 +5976,7 @@ ikev2_prfplus(struct iked_hash *prf, struct ibuf *key, struct ibuf *seed, t2 = ibuf_new(NULL, 0); t1 = ibuf_new(NULL, hash_keylength(prf)); - ibuf_add_buf(t2, seed); + ibuf_add_ibuf(t2, seed); pad = i + 1; ibuf_add(t2, &pad, 1); @@ -5979,7 +5988,7 @@ ikev2_prfplus(struct iked_hash *prf, struct ibuf *key, struct ibuf *seed, fatalx("ikev2_prfplus: hash length mismatch"); ibuf_free(t2); - ibuf_add_buf(t, t1); + ibuf_add_ibuf(t, t1); log_debug("%s: T%d with %zu bytes", __func__, pad, ibuf_size(t1)); @@ -6224,13 +6233,13 @@ ikev2_childsa_negotiate(struct iked *env, struct iked_sa *sa, ibuf_length(kex->kex_dhpeer)); goto done; } - if (ibuf_add_buf(seed, dhsecret) != 0) { + if (ibuf_add_ibuf(seed, dhsecret) != 0) { log_debug("%s: failed to set dh secret", __func__); goto done; } } - if (ibuf_add_buf(seed, kex->kex_inonce) != 0 || - ibuf_add_buf(seed, kex->kex_rnonce) != 0 || + if (ibuf_add_ibuf(seed, kex->kex_inonce) != 0 || + ibuf_add_ibuf(seed, kex->kex_rnonce) != 0 || (keymat = ikev2_prfplus(sa->sa_prf, sa->sa_key_d, seed, ilen)) == NULL) { log_debug("%s: failed to get IKE SA key material", __func__); diff --git a/sbin/iked/ikev2_msg.c b/sbin/iked/ikev2_msg.c index 12d801f45..74a5718d9 100644 --- a/sbin/iked/ikev2_msg.c +++ b/sbin/iked/ikev2_msg.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ikev2_msg.c,v 1.102 2024/07/13 12:22:46 yasuoka Exp $ */ +/* $OpenBSD: ikev2_msg.c,v 1.103 2024/11/21 13:26:49 claudio Exp $ */ /* * Copyright (c) 2019 Tobias Heider @@ -302,7 +302,7 @@ ikev2_msg_send(struct iked *env, struct iked_message *msg) log_debug("%s: failed to set NAT-T", __func__); return (-1); } - if (ibuf_add_buf(new, buf) == -1) { + if (ibuf_add_ibuf(new, buf) == -1) { ibuf_free(new); log_debug("%s: failed to set NAT-T", __func__); return (-1); @@ -783,7 +783,7 @@ ikev2_msg_send_encrypt(struct iked *env, struct iked_sa *sa, struct ibuf **ep, log_debug("%s: encryption failed", __func__); goto done; } - if (ibuf_add_buf(buf, e) != 0) + if (ibuf_add_ibuf(buf, e) != 0) goto done; /* Add integrity checksum (HMAC) */ @@ -891,7 +891,7 @@ ikev2_send_encrypted_fragments(struct iked *env, struct iked_sa *sa, log_debug("%s: encryption failed", __func__); goto done; } - if (ibuf_add_buf(buf, e) != 0) + if (ibuf_add_ibuf(buf, e) != 0) goto done; /* Add integrity checksum (HMAC) */ @@ -965,7 +965,7 @@ ikev2_msg_auth(struct iked *env, struct iked_sa *sa, int response) if ((authmsg = ibuf_dup(buf)) == NULL) return (NULL); - if (ibuf_add_buf(authmsg, nonce) != 0) + if (ibuf_add_ibuf(authmsg, nonce) != 0) goto fail; if ((hash_setkey(sa->sa_prf, ibuf_data(prfkey), diff --git a/sbin/iked/parse.y b/sbin/iked/parse.y index 970a9e334..568f9ef22 100644 --- a/sbin/iked/parse.y +++ b/sbin/iked/parse.y @@ -1,4 +1,4 @@ -/* $OpenBSD: parse.y,v 1.147 2024/07/13 12:22:46 yasuoka Exp $ */ +/* $OpenBSD: parse.y,v 1.148 2024/11/04 02:44:28 dlg Exp $ */ /* * Copyright (c) 2019 Tobias Heider @@ -383,7 +383,7 @@ int create_ike(char *, int, struct ipsec_addr_wrap *, int, struct ipsec_hosts *, struct ipsec_hosts *, struct ipsec_mode *, struct ipsec_mode *, uint8_t, - uint8_t, char *, char *, + unsigned int, char *, char *, uint32_t, struct iked_lifetime *, struct iked_auth *, struct ipsec_filters *, struct ipsec_addr_wrap *, char *); @@ -411,7 +411,7 @@ struct ipsec_addr_wrap *iftab; typedef struct { union { int64_t number; - uint8_t ikemode; + unsigned int ikemode; uint8_t dir; uint8_t satype; uint8_t accounting; @@ -459,7 +459,7 @@ typedef struct { %token CERTPARTIALCHAIN %token REQUEST IFACE %token RADIUS ACCOUNTING SERVER SECRET MAX_TRIES MAX_FAILOVERS -%token CLIENT DAE LISTEN ON +%token CLIENT DAE LISTEN ON NATT %token STRING %token NUMBER %type string @@ -475,7 +475,8 @@ typedef struct { %type id %type transforms %type filters -%type ikeflags ikematch ikemode ipcomp tmode +%type ikeflags +%type ikematch ikemode ipcomp tmode natt_force %type ikeauth %type keyspec %type ike_sas child_sas @@ -1022,7 +1023,9 @@ child_sa : CHILDSA { } ; -ikeflags : ikematch ikemode ipcomp tmode { $$ = $1 | $2 | $3 | $4; } +ikeflags : ikematch ikemode ipcomp tmode natt_force { + $$ = $1 | $2 | $3 | $4 | $5; + } ; ikematch : /* empty */ { $$ = 0; } @@ -1045,6 +1048,10 @@ tmode : /* empty */ { $$ = 0; } | TRANSPORT { $$ = IKED_POLICY_TRANSPORT; } ; +natt_force : /* empty */ { $$ = 0; } + | NATT { $$ = IKED_POLICY_NATT_FORCE; } + ; + ikeauth : /* empty */ { $$.auth_method = IKEV2_AUTH_SIG_ANY; /* default */ $$.auth_eap = 0; @@ -1601,6 +1608,7 @@ lookup(char *s) { "maxage", MAXAGE }, { "mobike", MOBIKE }, { "name", NAME }, + { "natt", NATT }, { "noenforcesingleikesa", NOENFORCESINGLEIKESA }, { "noesn", NOESN }, { "nofragmentation", NOFRAGMENTATION }, @@ -2707,7 +2715,7 @@ create_ike(char *name, int af, struct ipsec_addr_wrap *ipproto, int rdomain, struct ipsec_hosts *hosts, struct ipsec_hosts *peers, struct ipsec_mode *ike_sa, struct ipsec_mode *ipsec_sa, uint8_t saproto, - uint8_t flags, char *srcid, char *dstid, + unsigned int flags, char *srcid, char *dstid, uint32_t ikelifetime, struct iked_lifetime *lt, struct iked_auth *authtype, struct ipsec_filters *filter, struct ipsec_addr_wrap *ikecfg, char *iface) diff --git a/sbin/iked/print.c b/sbin/iked/print.c index 5444f950b..a16dfb101 100644 --- a/sbin/iked/print.c +++ b/sbin/iked/print.c @@ -1,4 +1,4 @@ -/* $OpenBSD: print.c,v 1.4 2023/06/13 12:34:12 tb Exp $ */ +/* $OpenBSD: print.c,v 1.6 2024/12/26 18:25:51 sthen Exp $ */ /* * Copyright (c) 2019-2021 Tobias Heider @@ -88,6 +88,9 @@ print_policy(struct iked_policy *pol) else print_verbose(" tunnel"); + if (pol->pol_flags & IKED_POLICY_NATT_FORCE) + print_verbose(" natt"); + print_verbose(" %s", print_xf(pol->pol_saproto, 0, saxfs)); if (pol->pol_nipproto > 0) { @@ -225,7 +228,9 @@ print_policy(struct iked_policy *pol) for (i = 0; i < pol->pol_ncfg; i++) { cfg = &pol->pol_cfg[i]; - print_verbose(" config %s %s", print_xf(cfg->cfg_type, + print_verbose(" %s %s %s", + cfg->cfg_action == IKEV2_CP_REPLY ? "config" : "request", + print_xf(cfg->cfg_type, cfg->cfg.address.addr_af, cpxfs), print_addr(&cfg->cfg.address.addr)); } diff --git a/sbin/iked/proc.c b/sbin/iked/proc.c index 337063f76..ecff70811 100644 --- a/sbin/iked/proc.c +++ b/sbin/iked/proc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: proc.c,v 1.44 2024/04/09 15:48:01 tobhe Exp $ */ +/* $OpenBSD: proc.c,v 1.51 2024/11/21 13:35:20 claudio Exp $ */ /* * Copyright (c) 2010 - 2016 Reyk Floeter @@ -162,7 +162,10 @@ proc_connect(struct privsep *ps, void (*connected)(struct privsep *)) for (inst = 0; inst < ps->ps_instances[dst]; inst++) { iev = &ps->ps_ievs[dst][inst]; - imsg_init(&iev->ibuf, ps->ps_pp->pp_pipes[dst][inst]); + if (imsgbuf_init(&iev->ibuf, + ps->ps_pp->pp_pipes[dst][inst]) == -1) + fatal("%s: imsgbuf_init", __func__); + imsgbuf_allow_fdpass(&iev->ibuf); event_set(&iev->ev, iev->ibuf.fd, iev->events, iev->handler, iev->data); event_add(&iev->ev, NULL); @@ -292,7 +295,9 @@ proc_accept(struct privsep *ps, int fd, enum privsep_procid dst, pp->pp_pipes[dst][n] = fd; iev = &ps->ps_ievs[dst][n]; - imsg_init(&iev->ibuf, fd); + if (imsgbuf_init(&iev->ibuf, fd) == -1) + fatal("%s: imsgbuf_init", __func__); + imsgbuf_allow_fdpass(&iev->ibuf); event_set(&iev->ev, iev->ibuf.fd, iev->events, iev->handler, iev->data); event_add(&iev->ev, NULL); } @@ -322,7 +327,7 @@ proc_setup(struct privsep *ps, struct privsep_proc *procs, unsigned int nproc) sizeof(struct imsgev))) == NULL) fatal("%s: calloc", __func__); - /* With this set up, we are ready to call imsg_init(). */ + /* With this set up, we are ready to call imsgbuf_init(). */ for (i = 0; i < ps->ps_instances[id]; i++) { ps->ps_ievs[id][i].handler = proc_dispatch; ps->ps_ievs[id][i].events = EV_READ; @@ -451,7 +456,7 @@ proc_open(struct privsep *ps, int src, int dst) */ if (proc_flush_imsg(ps, src, i) == -1 || proc_flush_imsg(ps, dst, j) == -1) - fatal("%s: imsg_flush", __func__); + fatal("%s: proc_flush_imsg", __func__); } } } @@ -477,7 +482,7 @@ proc_close(struct privsep *ps) /* Cancel the fd, close and invalidate the fd */ event_del(&(ps->ps_ievs[dst][n].ev)); - imsg_clear(&(ps->ps_ievs[dst][n].ibuf)); + imsgbuf_clear(&(ps->ps_ievs[dst][n].ibuf)); close(pp->pp_pipes[dst][n]); pp->pp_pipes[dst][n] = -1; } @@ -616,8 +621,8 @@ proc_dispatch(int fd, short event, void *arg) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("%s: imsg_read", __func__); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("%s: imsgbuf_read", __func__); if (n == 0) { /* this pipe is dead, so remove the event handler */ event_del(&iev->ev); @@ -627,13 +632,13 @@ proc_dispatch(int fd, short event, void *arg) } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("%s: msgbuf_write", __func__); - if (n == 0) { - /* this pipe is dead, so remove the event handler */ - event_del(&iev->ev); - event_loopexit(NULL); - return; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) { /* Connection closed. */ + event_del(&iev->ev); + event_loopexit(NULL); + return; + } else + fatal("imsgbuf_write"); } } @@ -726,12 +731,12 @@ void imsg_event_add(struct imsgev *iev) { if (iev->handler == NULL) { - imsg_flush(&iev->ibuf); + imsgbuf_flush(&iev->ibuf); return; } iev->events = EV_READ; - if (iev->ibuf.w.queued) + if (imsgbuf_queuelen(&iev->ibuf) > 0) iev->events |= EV_WRITE; event_del(&iev->ev); @@ -860,10 +865,7 @@ proc_flush_imsg(struct privsep *ps, enum privsep_procid id, int n) for (; n < m; n++) { if ((ibuf = proc_ibuf(ps, id, n)) == NULL) return (-1); - do { - ret = imsg_flush(ibuf); - } while (ret == -1 && errno == EAGAIN); - if (ret == -1) + if ((ret = imsgbuf_flush(ibuf)) == -1) break; imsg_event_add(&ps->ps_ievs[id][n]); } diff --git a/sbin/isakmpd/dnssec.h b/sbin/isakmpd/dnssec.h index 90a78df14..f23efec17 100644 --- a/sbin/isakmpd/dnssec.h +++ b/sbin/isakmpd/dnssec.h @@ -1,4 +1,4 @@ -/* $OpenBSD: dnssec.h,v 1.7 2004/05/14 08:42:56 hshoexer Exp $ */ +/* $OpenBSD: dnssec.h,v 1.8 2024/10/23 03:14:32 jsg Exp $ */ /* * Copyright (c) 2001 Håkan Olsson. All rights reserved. @@ -37,10 +37,3 @@ int dns_RSA_dns_to_x509(u_int8_t *, int, RSA **); #ifndef DNS_KEYPROTO_IPSEC #define DNS_KEYPROTO_IPSEC 4 #endif -#ifndef DNS_KEYALG_RSA -#define DNS_KEYALG_RSA 1 -#endif - -#ifndef DNS_KEYPROTO_IPSEC -#define DNS_KEYPROTO_IPSEC 4 -#endif diff --git a/sbin/isakmpd/hash.c b/sbin/isakmpd/hash.c index 8c535374a..9936bca3e 100644 --- a/sbin/isakmpd/hash.c +++ b/sbin/isakmpd/hash.c @@ -1,4 +1,4 @@ -/* $OpenBSD: hash.c,v 1.24 2015/10/15 06:35:54 mmcc Exp $ */ +/* $OpenBSD: hash.c,v 1.25 2024/11/21 10:07:30 yasuoka Exp $ */ /* $EOM: hash.c,v 1.10 1999/04/17 23:20:34 niklas Exp $ */ /* @@ -56,7 +56,7 @@ static unsigned char digest[HASH_MAX]; static struct hash hashes[] = { { - HASH_MD5, 5, MD5_SIZE, (void *)&Ctx.md5ctx, digest, + HASH_MD5, 5, MD5_SIZE, MD5_BLOCK_LENGTH, (void *)&Ctx.md5ctx, digest, sizeof(MD5_CTX), (void *)&Ctx2.md5ctx, (void (*)(void *))MD5Init, (void (*)(void *, unsigned char *, unsigned int))MD5Update, @@ -64,32 +64,32 @@ static struct hash hashes[] = { hmac_init, hmac_final }, { - HASH_SHA1, 6, SHA1_SIZE, (void *)&Ctx.sha1ctx, digest, - sizeof(SHA1_CTX), (void *)&Ctx2.sha1ctx, + HASH_SHA1, 6, SHA1_SIZE, SHA1_BLOCK_LENGTH, (void *)&Ctx.sha1ctx, + digest, sizeof(SHA1_CTX), (void *)&Ctx2.sha1ctx, (void (*)(void *))SHA1Init, (void (*)(void *, unsigned char *, unsigned int))SHA1Update, (void (*)(unsigned char *, void *))SHA1Final, hmac_init, hmac_final }, { - HASH_SHA2_256, 7, SHA2_256_SIZE, (void *)&Ctx.sha2ctx, digest, - sizeof(SHA2_CTX), (void *)&Ctx2.sha2ctx, + HASH_SHA2_256, 7, SHA2_256_SIZE, SHA256_BLOCK_LENGTH, + (void *)&Ctx.sha2ctx, digest, sizeof(SHA2_CTX), (void *)&Ctx2.sha2ctx, (void (*)(void *))SHA256Init, (void (*)(void *, unsigned char *, unsigned int))SHA256Update, (void (*)(u_int8_t *, void *))SHA256Final, hmac_init, hmac_final }, { - HASH_SHA2_384, 8, SHA2_384_SIZE, (void *)&Ctx.sha2ctx, digest, - sizeof(SHA2_CTX), (void *)&Ctx2.sha2ctx, + HASH_SHA2_384, 8, SHA2_384_SIZE, SHA384_BLOCK_LENGTH, + (void *)&Ctx.sha2ctx, digest, sizeof(SHA2_CTX), (void *)&Ctx2.sha2ctx, (void (*)(void *))SHA384Init, (void (*)(void *, unsigned char *, unsigned int))SHA384Update, (void (*)(u_int8_t *, void *))SHA384Final, hmac_init, hmac_final }, { - HASH_SHA2_512, 9, SHA2_512_SIZE, (void *)&Ctx.sha2ctx, digest, - sizeof(SHA2_CTX), (void *)&Ctx2.sha2ctx, + HASH_SHA2_512, 9, SHA2_512_SIZE, SHA512_BLOCK_LENGTH, + (void *)&Ctx.sha2ctx, digest, sizeof(SHA2_CTX), (void *)&Ctx2.sha2ctx, (void (*)(void *))SHA512Init, (void (*)(void *, unsigned char *, unsigned int))SHA512Update, (void (*)(u_int8_t *, void *))SHA512Final, @@ -122,11 +122,11 @@ hash_get(enum hashes hashtype) void hmac_init(struct hash *hash, unsigned char *okey, unsigned int len) { - unsigned int i, blocklen = HMAC_BLOCKLEN; - unsigned char key[HMAC_BLOCKLEN]; + unsigned int i; + unsigned char key[128]; - bzero(key, blocklen); - if (len > blocklen) { + bzero(key, sizeof(key)); + if (len > hash->blocklen) { /* Truncate key down to blocklen */ hash->Init(hash->ctx); hash->Update(hash->ctx, okey, len); @@ -136,19 +136,19 @@ hmac_init(struct hash *hash, unsigned char *okey, unsigned int len) } /* HMAC I and O pad computation */ - for (i = 0; i < blocklen; i++) + for (i = 0; i < hash->blocklen; i++) key[i] ^= HMAC_IPAD_VAL; hash->Init(hash->ctx); - hash->Update(hash->ctx, key, blocklen); + hash->Update(hash->ctx, key, hash->blocklen); - for (i = 0; i < blocklen; i++) + for (i = 0; i < hash->blocklen; i++) key[i] ^= (HMAC_IPAD_VAL ^ HMAC_OPAD_VAL); hash->Init(hash->ctx2); - hash->Update(hash->ctx2, key, blocklen); + hash->Update(hash->ctx2, key, hash->blocklen); - explicit_bzero(key, blocklen); + explicit_bzero(key, sizeof(key)); } /* diff --git a/sbin/isakmpd/hash.h b/sbin/isakmpd/hash.h index 426c899a4..4e765d6fb 100644 --- a/sbin/isakmpd/hash.h +++ b/sbin/isakmpd/hash.h @@ -1,4 +1,4 @@ -/* $OpenBSD: hash.h,v 1.8 2006/06/10 20:10:02 hshoexer Exp $ */ +/* $OpenBSD: hash.h,v 1.9 2024/11/21 10:07:30 yasuoka Exp $ */ /* $EOM: hash.h,v 1.6 1998/07/25 22:04:36 niklas Exp $ */ /* @@ -53,6 +53,7 @@ struct hash { enum hashes type; int id; /* ISAKMP/Oakley ID */ u_int8_t hashsize; /* Size of the hash */ + unsigned blocklen; /* The hash's block length */ void *ctx; /* Pointer to a context, for HMAC ictx */ unsigned char *digest; /* Pointer to a digest */ int ctxsize; @@ -68,7 +69,6 @@ struct hash { #define HMAC_IPAD_VAL 0x36 #define HMAC_OPAD_VAL 0x5C -#define HMAC_BLOCKLEN 64 extern struct hash *hash_get(enum hashes); extern void hmac_init(struct hash *, unsigned char *, unsigned int); diff --git a/sbin/mountd/mountd.c b/sbin/mountd/mountd.c index 0ca61b39e..4d56fe5af 100644 --- a/sbin/mountd/mountd.c +++ b/sbin/mountd/mountd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mountd.c,v 1.92 2024/05/21 05:00:47 jsg Exp $ */ +/* $OpenBSD: mountd.c,v 1.96 2024/11/21 13:35:20 claudio Exp $ */ /* $NetBSD: mountd.c,v 1.31 1996/02/18 11:57:53 fvdl Exp $ */ /* @@ -321,7 +321,10 @@ main(int argc, char *argv[]) } signal(SIGTERM, (void (*)(int)) send_umntall); - imsg_init(&ibuf, socks[0]); + if (imsgbuf_init(&ibuf, socks[0]) == -1) { + syslog(LOG_ERR, "imsgbuf_init: %m"); + exit(1); + } setproctitle("parent"); if (debug) @@ -370,7 +373,10 @@ privchild(int sock) char *path; int error, size; - imsg_init(&ibuf, sock); + if (imsgbuf_init(&ibuf, sock) == -1) { + syslog(LOG_ERR, "imsgbuf_init: %m"); + _exit(1); + } setproctitle("[priv]"); fp = NULL; @@ -398,9 +404,9 @@ privchild(int sock) if (!(pfd[0].revents & POLLIN)) continue; - switch (imsg_read(&ibuf)) { + switch (imsgbuf_read(&ibuf)) { case -1: - syslog(LOG_ERR, "imsg_read: %m"); + syslog(LOG_ERR, "imsgbuf_read: %m"); _exit(1); case 0: syslog(LOG_ERR, "Socket disconnected"); @@ -621,31 +627,27 @@ imsg_export(const char *dir, struct export_args *args) ssize_t recv_imsg(struct imsg *imsg) { - ssize_t n; + while (1) { + switch (imsg_get(&ibuf, imsg)) { + case -1: + syslog(LOG_ERR, "imsg_get: %m"); + return (-1); + case 0: + break; + default: + return (imsg_get_len(imsg)); + } - n = imsg_read(&ibuf); - if (n == -1) { - syslog(LOG_ERR, "imsg_read: %m"); - return (-1); + switch (imsgbuf_read(&ibuf)) { + case -1: + syslog(LOG_ERR, "imsgbuf_read: %m"); + return (-1); + case 0: + syslog(LOG_ERR, "Socket disconnected"); + errno = EINVAL; + return (-1); + } } - if (n == 0) { - syslog(LOG_ERR, "Socket disconnected"); - errno = EINVAL; - return (-1); - } - - n = imsg_get(&ibuf, imsg); - if (n == -1) { - syslog(LOG_ERR, "imsg_get: %m"); - return (-1); - } - if (n == 0) { - syslog(LOG_ERR, "No messages ready"); - errno = EINVAL; - return (-1); - } - - return (n - IMSG_HEADER_SIZE); } int @@ -656,8 +658,8 @@ send_imsg(u_int32_t type, void *data, u_int16_t size) return (-1); } - if (imsg_flush(&ibuf) == -1) { - syslog(LOG_ERR, "imsg_flush: %m"); + if (imsgbuf_flush(&ibuf) == -1) { + syslog(LOG_ERR, "imsgbuf_flush: %m"); return (-1); } @@ -2157,7 +2159,7 @@ parsecred(char *namelist, struct xucred *cr) char *name, *names; struct passwd *pw; struct group *gr; - int ngroups, cnt; + int maxgroups, ngroups, cnt; /* * Set up the unprivileged user. @@ -2182,9 +2184,12 @@ parsecred(char *namelist, struct xucred *cr) return; } cr->cr_uid = pw->pw_uid; - ngroups = NGROUPS_MAX + 1; - if (getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups)) + maxgroups = ngroups = NGROUPS_MAX + 1; + if (getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups) == -1) { syslog(LOG_ERR, "Too many groups for %s: %m", pw->pw_name); + /* Truncate group list */ + ngroups = maxgroups; + } /* * compress out duplicate */ diff --git a/sbin/nfsd/nfsd.c b/sbin/nfsd/nfsd.c index 03763c3cf..73592d38f 100644 --- a/sbin/nfsd/nfsd.c +++ b/sbin/nfsd/nfsd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: nfsd.c,v 1.42 2024/03/21 10:58:15 claudio Exp $ */ +/* $OpenBSD: nfsd.c,v 1.43 2025/01/02 21:37:38 kn Exp $ */ /* $NetBSD: nfsd.c,v 1.19 1996/02/18 23:18:56 mycroft Exp $ */ /* @@ -113,8 +113,6 @@ main(int argc, char *argv[]) /* Start by writing to both console and log. */ openlog("nfsd", LOG_PID | LOG_PERROR, LOG_DAEMON); - if (argc == 1) - udpflag = 1; while ((ch = getopt(argc, argv, "n:rtu")) != -1) switch (ch) { case 'n': @@ -139,6 +137,9 @@ main(int argc, char *argv[]) argv += optind; argc -= optind; + if (!(tcpflag || udpflag)) + udpflag = 1; + /* * XXX * Backward compatibility, trailing number is the count of daemons. diff --git a/sbin/pfctl/parse.y b/sbin/pfctl/parse.y index a694fbce2..cd5d3a4d0 100644 --- a/sbin/pfctl/parse.y +++ b/sbin/pfctl/parse.y @@ -1,4 +1,4 @@ -/* $OpenBSD: parse.y,v 1.717 2024/09/20 02:00:46 jsg Exp $ */ +/* $OpenBSD: parse.y,v 1.718 2024/11/12 04:14:51 dlg Exp $ */ /* * Copyright (c) 2001 Markus Friedl. All rights reserved. @@ -1540,10 +1540,14 @@ bandwidth : STRING { } } free($1); - $$.bw_absolute = (u_int32_t)bps; + if (bps < 0 || bps > (double)LLONG_MAX) { + yyerror("bandwidth number too big"); + YYERROR; + } + $$.bw_absolute = (u_int64_t)bps; } | NUMBER { - if ($1 < 0 || $1 > UINT_MAX) { + if ($1 < 0 || $1 > LLONG_MAX) { yyerror("bandwidth number too big"); YYERROR; } diff --git a/sbin/pfctl/pfctl.8 b/sbin/pfctl/pfctl.8 index b5b61a345..ac215141a 100644 --- a/sbin/pfctl/pfctl.8 +++ b/sbin/pfctl/pfctl.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: pfctl.8,v 1.183 2022/11/18 18:11:10 kn Exp $ +.\" $OpenBSD: pfctl.8,v 1.185 2024/11/21 18:16:01 kn Exp $ .\" .\" Copyright (c) 2001 Kjell Wooding. All rights reserved. .\" @@ -24,7 +24,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: November 18 2022 $ +.Dd $Mdocdate: November 21 2024 $ .Dt PFCTL 8 .Os .Sh NAME @@ -191,25 +191,25 @@ Flush the filter parameters specified by .Ar modifier (may be abbreviated): .Pp -.Bl -tag -width xxxxxxxxxxxx -compact -.It Fl F Cm rules +.Bl -tag -width xxxxxxxxx -compact +.It Cm rules Flush the filter rules. -.It Fl F Cm states +.It Cm states Flush the state table (NAT and filter). -.It Fl F Cm Sources +.It Cm Sources Flush the source tracking table. -.It Fl F Cm info +.It Cm info Flush the filter information (statistics that are not bound to rules). -.It Fl F Cm Tables +.It Cm Tables Flush the tables. -.It Fl F Cm osfp +.It Cm osfp Flush the passive operating system fingerprints. -.It Fl F Cm Reset +.It Cm Reset Reset limits, timeouts and other options back to default settings. See the OPTIONS section in .Xr pf.conf 5 for details. -.It Fl F Cm all +.It Cm all Flush all of the above. .El .Pp @@ -316,13 +316,13 @@ Do not actually load rules, just parse them. .It Fl o Ar level Control the ruleset optimizer, overriding any rule file settings. .Pp -.Bl -tag -width xxxxxxxxxxxx -compact -.It Fl o Cm none +.Bl -tag -width xxxxxxxxx -compact +.It Cm none Disable the ruleset optimizer. -.It Fl o Cm basic +.It Cm basic Enable basic ruleset optimizations. This is the default behaviour. -.It Fl o Cm profile +.It Cm profile Enable basic ruleset optimizations with profiling. .El .Pp @@ -348,13 +348,14 @@ are mutually exclusive. .It Fl S Ar statefile Store the pf state table in the file specified by .Ar statefile . +.Tg R .It Fl s Ar modifier Op Fl R Ar id Show the filter parameters specified by .Ar modifier (may be abbreviated): .Pp -.Bl -tag -width xxxxxxxxxxxxxx -compact -.It Fl s Cm queue +.Bl -tag -width xxxxxxxxxxx -compact +.It Cm queue Show the currently loaded queue definitions. When used together with .Fl v , @@ -364,7 +365,7 @@ When used together with .Nm will loop and show updated queue statistics every five seconds, including measured bandwidth and packets per second. -.It Fl s Cm rules +.It Cm rules Show the currently loaded filter rules. If .Fl R Ar id @@ -388,7 +389,7 @@ will skip evaluation of rules where possible. Packets passed statefully are counted in the rule that created the state (even though the rule isn't evaluated more than once for the entire connection). -.It Fl s Cm Anchors +.It Cm Anchors Show the currently loaded anchors directly attached to the main ruleset. If .Fl a Ar anchor @@ -399,15 +400,15 @@ If .Fl v is specified, all anchors attached under the target anchor will be displayed recursively. -.It Fl s Cm states +.It Cm states Show the contents of the state table. If .Fl R Ar id is specified as well, only states created by the rule with the specified numeric ID are shown. -.It Fl s Cm Sources +.It Cm Sources Show the contents of the source tracking table. -.It Fl s Cm info +.It Cm info Show filter information (statistics and counters). When used together with .Fl v , @@ -415,7 +416,7 @@ source tracking statistics, the firewall's 32-bit hostid number and the main ruleset's MD5 checksum for use with .Xr pfsync 4 are also shown. -.It Fl s Cm labels +.It Cm labels Show per-rule statistics (label, evaluations, packets total, bytes total, packets in, bytes in, packets out, bytes out, state creations) of filter rules with labels, useful for accounting. @@ -423,15 +424,15 @@ If .Fl R Ar id is specified as well, only the statistics for the rule with the specified numeric ID are shown. -.It Fl s Cm timeouts +.It Cm timeouts Show the current global timeouts. -.It Fl s Cm memory +.It Cm memory Show the current pool memory hard limits. -.It Fl s Cm Tables +.It Cm Tables Show the list of tables. -.It Fl s Cm osfp +.It Cm osfp Show the list of operating system fingerprints. -.It Fl s Cm Interfaces +.It Cm Interfaces Show the list of interfaces and interface groups available to PF. When used together with .Fl v , @@ -441,7 +442,7 @@ When used together with interface statistics are also shown. .Fl i can be used to select an interface or a group of interfaces. -.It Fl s Cm all +.It Cm all Show all of the above, except for the lists of interfaces and operating system fingerprints. .El @@ -486,6 +487,7 @@ no free ports in translation port range .It no-route dropped by no-route .El +.Tg T .It Fl t Ar table Fl T Ar command Op Ar address ... Specify the .Ar command @@ -493,32 +495,32 @@ Specify the .Ar table . Commands include: .Pp -.Bl -tag -width "-T expire number" -compact -.It Fl T Cm add +.Bl -tag -width "expire number" -compact +.It Cm add Add one or more addresses to a table. Automatically create a persistent table if it does not exist. -.It Fl T Cm delete +.It Cm delete Delete one or more addresses from a table. -.It Fl T Cm expire Ar number +.It Cm expire Ar number Delete addresses which had their statistics cleared more than .Ar number seconds ago. For entries which have never had their statistics cleared, .Ar number refers to the time they were added to the table. -.It Fl T Cm flush +.It Cm flush Flush all addresses in a table. -.It Fl T Cm kill +.It Cm kill Kill a table. -.It Fl T Cm replace +.It Cm replace Replace the addresses of the table. Automatically create a persistent table if it does not exist. -.It Fl T Cm show +.It Cm show Show the content (addresses) of a table. -.It Fl T Cm test +.It Cm test Test if the given addresses match a table. -.It Fl T Cm zero -Clear all the statistics of a table. +.It Cm zero +Clear all the statistics of a table, or only for specified addresses. .El .Pp For the diff --git a/sbin/pfctl/pfctl.h b/sbin/pfctl/pfctl.h index b424192c1..cf4ac9000 100644 --- a/sbin/pfctl/pfctl.h +++ b/sbin/pfctl/pfctl.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pfctl.h,v 1.64 2024/07/14 19:51:08 sashan Exp $ */ +/* $OpenBSD: pfctl.h,v 1.65 2024/11/20 13:57:29 kirill Exp $ */ /* * Copyright (c) 2001 Daniel Hartmeier @@ -82,6 +82,7 @@ int pfr_del_tables(struct pfr_table *, int, int *, int); int pfr_get_tables(struct pfr_table *, struct pfr_table *, int *, int); int pfr_get_tstats(struct pfr_table *, struct pfr_tstats *, int *, int); int pfr_clr_tstats(struct pfr_table *, int, int *, int); +int pfr_clr_astats(struct pfr_table *, struct pfr_addr *, int, int *, int); int pfr_clr_addrs(struct pfr_table *, int *, int); int pfr_add_addrs(struct pfr_table *, struct pfr_addr *, int, int *, int); int pfr_del_addrs(struct pfr_table *, struct pfr_addr *, int, int *, int); diff --git a/sbin/pfctl/pfctl_parser.c b/sbin/pfctl/pfctl_parser.c index 96ae206de..1d504a42b 100644 --- a/sbin/pfctl/pfctl_parser.c +++ b/sbin/pfctl/pfctl_parser.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pfctl_parser.c,v 1.351 2024/04/22 13:30:22 bluhm Exp $ */ +/* $OpenBSD: pfctl_parser.c,v 1.352 2024/11/12 04:14:51 dlg Exp $ */ /* * Copyright (c) 2001 Daniel Hartmeier @@ -1213,7 +1213,7 @@ print_tabledef(const char *name, int flags, int addrs, void print_bwspec(const char *prefix, struct pf_queue_bwspec *bw) { - u_int rate; + uint64_t rate; int i; static const char unit[] = " KMG"; @@ -1223,7 +1223,7 @@ print_bwspec(const char *prefix, struct pf_queue_bwspec *bw) rate = bw->absolute; for (i = 0; rate >= 1000 && i <= 3 && (rate % 1000 == 0); i++) rate /= 1000; - printf("%s%u%c", prefix, rate, unit[i]); + printf("%s%llu%c", prefix, rate, unit[i]); } } diff --git a/sbin/pfctl/pfctl_parser.h b/sbin/pfctl/pfctl_parser.h index e7eedfd8e..54748adcd 100644 --- a/sbin/pfctl/pfctl_parser.h +++ b/sbin/pfctl/pfctl_parser.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pfctl_parser.h,v 1.120 2024/07/14 19:51:08 sashan Exp $ */ +/* $OpenBSD: pfctl_parser.h,v 1.121 2024/11/12 04:14:51 dlg Exp $ */ /* * Copyright (c) 2001 Daniel Hartmeier @@ -142,7 +142,7 @@ struct node_os { }; struct node_queue_bw { - u_int32_t bw_absolute; + u_int64_t bw_absolute; u_int16_t bw_percent; }; diff --git a/sbin/pfctl/pfctl_radix.c b/sbin/pfctl/pfctl_radix.c index cd5bf72c0..ec1ffdcd8 100644 --- a/sbin/pfctl/pfctl_radix.c +++ b/sbin/pfctl/pfctl_radix.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pfctl_radix.c,v 1.39 2024/07/14 19:51:08 sashan Exp $ */ +/* $OpenBSD: pfctl_radix.c,v 1.40 2024/11/20 13:57:29 kirill Exp $ */ /* * Copyright (c) 2002 Cedric Berger @@ -313,6 +313,29 @@ pfr_get_astats(struct pfr_table *tbl, struct pfr_astats *addr, int *size, return (0); } +int +pfr_clr_astats(struct pfr_table *tbl, struct pfr_addr *addr, int size, + int *nzero, int flags) +{ + struct pfioc_table io; + + if (size < 0 || (size && !tbl) || addr == NULL) { + errno = EINVAL; + return (-1); + } + bzero(&io, sizeof io); + io.pfrio_flags = flags; + io.pfrio_table = *tbl; + io.pfrio_buffer = addr; + io.pfrio_esize = sizeof(*addr); + io.pfrio_size = size; + if (ioctl(dev, DIOCRCLRASTATS, &io) == -1) + return (-1); + if (nzero) + *nzero = io.pfrio_nzero; + return (0); +} + int pfr_clr_tstats(struct pfr_table *tbl, int size, int *nzero, int flags) { diff --git a/sbin/pfctl/pfctl_table.c b/sbin/pfctl/pfctl_table.c index a0a4c52a1..e460adf5f 100644 --- a/sbin/pfctl/pfctl_table.c +++ b/sbin/pfctl/pfctl_table.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pfctl_table.c,v 1.90 2024/08/19 13:01:47 jsg Exp $ */ +/* $OpenBSD: pfctl_table.c,v 1.91 2024/11/20 13:57:29 kirill Exp $ */ /* * Copyright (c) 2002 Cedric Berger @@ -346,9 +346,22 @@ pfctl_table(int argc, char *argv[], char *tname, const char *command, } if (nmatch < b.pfrb_size) rv = 2; + } else if (!strcmp(command, "zero") && (argc || file != NULL)) { + b.pfrb_type = PFRB_ADDRS; + if (load_addr(&b, argc, argv, file, 0, opts)) + goto _error; + if (opts & PF_OPT_VERBOSE) + flags |= PFR_FLAG_FEEDBACK; + RVTEST(pfr_clr_astats(&table, b.pfrb_caddr, b.pfrb_size, + &nzero, flags)); + xprintf(opts, "%d/%d addresses cleared", nzero, b.pfrb_size); + if (opts & PF_OPT_VERBOSE) + PFRB_FOREACH(a, &b) + if (opts & PF_OPT_VERBOSE2 || + a->pfra_fback != PFR_FB_NONE) + print_addrx(a, NULL, + opts & PF_OPT_USEDNS); } else if (!strcmp(command, "zero")) { - if (argc || file != NULL) - usage(); flags |= PFR_FLAG_ADDRSTOO; RVTEST(pfr_clr_tstats(&table, 1, &nzero, flags)); xprintf(opts, "%d table/stats cleared", nzero); diff --git a/sbin/reboot/reboot.8 b/sbin/reboot/reboot.8 index 1aefa9d24..ffcd21a35 100644 --- a/sbin/reboot/reboot.8 +++ b/sbin/reboot/reboot.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: reboot.8,v 1.50 2016/09/03 14:25:05 jmc Exp $ +.\" $OpenBSD: reboot.8,v 1.51 2024/12/21 05:01:25 jsg Exp $ .\" $NetBSD: reboot.8,v 1.3 1995/10/05 05:36:21 mycroft Exp $ .\" .\" Copyright (c) 1990, 1991, 1993 @@ -30,7 +30,7 @@ .\" .\" @(#)reboot.8 8.1 (Berkeley) 6/9/93 .\" -.Dd $Mdocdate: September 3 2016 $ +.Dd $Mdocdate: December 21 2024 $ .Dt REBOOT 8 .Os .Sh NAME @@ -107,4 +107,4 @@ users advance warning of their impending doom. A .Nm reboot command appeared in -.At v6 . +.Bx 4.0 . diff --git a/sbin/scsi/scsi.8 b/sbin/scsi/scsi.8 index 7aa853a16..b87512fda 100644 --- a/sbin/scsi/scsi.8 +++ b/sbin/scsi/scsi.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: scsi.8,v 1.35 2015/02/28 21:51:57 bentley Exp $ +.\" $OpenBSD: scsi.8,v 1.36 2024/12/21 13:15:36 jsg Exp $ .\" $FreeBSD: scsi.8,v 1.5 1995/05/05 20:41:58 dufault Exp $ .\" .\" Written By Julian ELischer @@ -40,7 +40,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: February 28 2015 $ +.Dd $Mdocdate: December 21 2024 $ .Dt SCSI 8 .Os .Sh NAME @@ -336,8 +336,9 @@ drive (set AWRE and ARRE to 1 to enable bad block remapping): .Sh HISTORY The .Nm -command appeared in 386BSD 0.1.2.4/FreeBSD to support the new reprobe -and user SCSI commands. +command appeared in +.Fx +to support the new reprobe and user SCSI commands. .Sh BUGS .Ic scsi\ -f /dev/rsd0c -c \(dq4 0 0 0 0 0\(dq permits anyone who can write to diff --git a/sbin/slaacd/control.c b/sbin/slaacd/control.c index 2cdf0568d..f467adf95 100644 --- a/sbin/slaacd/control.c +++ b/sbin/slaacd/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.11 2024/08/24 16:34:23 florian Exp $ */ +/* $OpenBSD: control.c,v 1.17 2024/11/21 13:35:20 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -157,7 +157,12 @@ control_accept(int listenfd, short event, void *bula) return; } - imsg_init(&c->iev.ibuf, connfd); + if (imsgbuf_init(&c->iev.ibuf, connfd) == -1) { + log_warn("%s: imsgbuf_init", __func__); + close(connfd); + free(c); + return; + } c->iev.handler = control_dispatch_imsg; c->iev.events = EV_READ; event_set(&c->iev.ev, c->iev.ibuf.fd, c->iev.events, @@ -203,7 +208,7 @@ control_close(int fd) return; } - msgbuf_clear(&c->iev.ibuf.w); + imsgbuf_clear(&c->iev.ibuf); TAILQ_REMOVE(&ctl_conns, c, entry); event_del(&c->iev.ev); @@ -234,14 +239,13 @@ control_dispatch_imsg(int fd, short event, void *bula) } if (event & EV_READ) { - if (((n = imsg_read(&c->iev.ibuf)) == -1 && errno != EAGAIN) || - n == 0) { + if (imsgbuf_read(&c->iev.ibuf) != 1) { control_close(fd); return; } } if (event & EV_WRITE) { - if (msgbuf_write(&c->iev.ibuf.w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(&c->iev.ibuf) == -1) { control_close(fd); return; } diff --git a/sbin/slaacd/engine.c b/sbin/slaacd/engine.c index dd7ab49db..8f1bd0385 100644 --- a/sbin/slaacd/engine.c +++ b/sbin/slaacd/engine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: engine.c,v 1.93 2024/08/24 16:35:05 florian Exp $ */ +/* $OpenBSD: engine.c,v 1.99 2024/11/21 13:35:20 claudio Exp $ */ /* * Copyright (c) 2017 Florian Obser @@ -396,7 +396,9 @@ engine(int debug, int verbose) if ((iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_main->ibuf, 3); + if (imsgbuf_init(&iev_main->ibuf, 3) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_main->ibuf); iev_main->handler = engine_dispatch_main; /* Setup event handlers. */ @@ -416,9 +418,9 @@ __dead void engine_shutdown(void) { /* Close pipes. */ - msgbuf_clear(&iev_frontend->ibuf.w); + imsgbuf_clear(&iev_frontend->ibuf); close(iev_frontend->ibuf.fd); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); free(iev_frontend); @@ -465,16 +467,18 @@ engine_dispatch_frontend(int fd, short event, void *bula) uint32_t if_index, type; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -631,16 +635,18 @@ engine_dispatch_main(int fd, short event, void *bula) int shut = 0; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -669,7 +675,8 @@ engine_dispatch_main(int fd, short event, void *bula) if (iev_frontend == NULL) fatal(NULL); - imsg_init(&iev_frontend->ibuf, fd); + if (imsgbuf_init(&iev_frontend->ibuf, fd) == -1) + fatal(NULL); iev_frontend->handler = engine_dispatch_frontend; iev_frontend->events = EV_READ; diff --git a/sbin/slaacd/frontend.c b/sbin/slaacd/frontend.c index 388fb82d6..c3f02dc7c 100644 --- a/sbin/slaacd/frontend.c +++ b/sbin/slaacd/frontend.c @@ -1,4 +1,4 @@ -/* $OpenBSD: frontend.c,v 1.68 2024/08/24 09:44:41 florian Exp $ */ +/* $OpenBSD: frontend.c,v 1.74 2024/11/21 13:35:20 claudio Exp $ */ /* * Copyright (c) 2017 Florian Obser @@ -179,7 +179,9 @@ frontend(int debug, int verbose) /* Setup pipe and event handler to the parent process. */ if ((iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_main->ibuf, 3); + if (imsgbuf_init(&iev_main->ibuf, 3) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_main->ibuf); iev_main->handler = frontend_dispatch_main; iev_main->events = EV_READ; event_set(&iev_main->ev, iev_main->ibuf.fd, iev_main->events, @@ -245,11 +247,11 @@ __dead void frontend_shutdown(void) { /* Close pipes. */ - msgbuf_write(&iev_engine->ibuf.w); - msgbuf_clear(&iev_engine->ibuf.w); + imsgbuf_write(&iev_engine->ibuf); + imsgbuf_clear(&iev_engine->ibuf); close(iev_engine->ibuf.fd); - msgbuf_write(&iev_main->ibuf.w); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_write(&iev_main->ibuf); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); free(iev_engine); @@ -286,16 +288,18 @@ frontend_dispatch_main(int fd, short event, void *bula) int shut = 0, icmp6sock, rdomain; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -325,7 +329,8 @@ frontend_dispatch_main(int fd, short event, void *bula) if (iev_engine == NULL) fatal(NULL); - imsg_init(&iev_engine->ibuf, fd); + if (imsgbuf_init(&iev_engine->ibuf, fd) == -1) + fatal(NULL); iev_engine->handler = frontend_dispatch_engine; iev_engine->events = EV_READ; @@ -396,16 +401,18 @@ frontend_dispatch_engine(int fd, short event, void *bula) uint32_t if_index, type; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { diff --git a/sbin/slaacd/slaacd.c b/sbin/slaacd/slaacd.c index da9a98ecf..3a307e94d 100644 --- a/sbin/slaacd/slaacd.c +++ b/sbin/slaacd/slaacd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: slaacd.c,v 1.72 2024/08/24 16:34:23 florian Exp $ */ +/* $OpenBSD: slaacd.c,v 1.79 2024/11/21 13:35:20 claudio Exp $ */ /* * Copyright (c) 2017 Florian Obser @@ -230,9 +230,13 @@ main(int argc, char *argv[]) if ((iev_frontend = malloc(sizeof(struct imsgev))) == NULL || (iev_engine = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_frontend->ibuf, pipe_main2frontend[0]); + if (imsgbuf_init(&iev_frontend->ibuf, pipe_main2frontend[0]) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_frontend->ibuf); iev_frontend->handler = main_dispatch_frontend; - imsg_init(&iev_engine->ibuf, pipe_main2engine[0]); + if (imsgbuf_init(&iev_engine->ibuf, pipe_main2engine[0]) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_engine->ibuf); iev_engine->handler = main_dispatch_engine; /* Setup event handlers for pipes to engine & frontend. */ @@ -303,9 +307,9 @@ main_shutdown(void) int status; /* Close pipes. */ - msgbuf_clear(&iev_frontend->ibuf.w); + imsgbuf_clear(&iev_frontend->ibuf); close(iev_frontend->ibuf.fd); - msgbuf_clear(&iev_engine->ibuf.w); + imsgbuf_clear(&iev_engine->ibuf); close(iev_engine->ibuf.fd); log_debug("waiting for children to terminate"); @@ -391,16 +395,18 @@ main_dispatch_frontend(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -470,16 +476,18 @@ main_dispatch_engine(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -566,7 +574,7 @@ void imsg_event_add(struct imsgev *iev) { iev->events = EV_READ; - if (iev->ibuf.w.queued) + if (imsgbuf_queuelen(&iev->ibuf) > 0) iev->events |= EV_WRITE; event_del(&iev->ev); @@ -610,11 +618,11 @@ main_imsg_send_ipc_sockets(struct imsgbuf *frontend_buf, if (imsg_compose(frontend_buf, IMSG_SOCKET_IPC, 0, 0, pipe_frontend2engine[0], NULL, 0) == -1) return (-1); - imsg_flush(frontend_buf); + imsgbuf_flush(frontend_buf); if (imsg_compose(engine_buf, IMSG_SOCKET_IPC, 0, 0, pipe_frontend2engine[1], NULL, 0) == -1) return (-1); - imsg_flush(engine_buf); + imsgbuf_flush(engine_buf); return (0); } diff --git a/sbin/unwind/control.c b/sbin/unwind/control.c index a5b2d961d..2fab6ddb9 100644 --- a/sbin/unwind/control.c +++ b/sbin/unwind/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.17 2021/02/24 18:34:14 florian Exp $ */ +/* $OpenBSD: control.c,v 1.23 2024/11/21 13:35:20 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -156,7 +156,12 @@ control_accept(int listenfd, short event, void *bula) return; } - imsg_init(&c->iev.ibuf, connfd); + if (imsgbuf_init(&c->iev.ibuf, connfd) == -1) { + log_warn("%s: imsgbuf_init", __func__); + close(connfd); + free(c); + return; + } c->iev.handler = control_dispatch_imsg; c->iev.events = EV_READ; event_set(&c->iev.ev, c->iev.ibuf.fd, c->iev.events, c->iev.handler, @@ -202,7 +207,7 @@ control_close(int fd) return; } - msgbuf_clear(&c->iev.ibuf.w); + imsgbuf_clear(&c->iev.ibuf); TAILQ_REMOVE(&ctl_conns, c, entry); event_del(&c->iev.ev); @@ -233,14 +238,13 @@ control_dispatch_imsg(int fd, short event, void *bula) } if (event & EV_READ) { - if (((n = imsg_read(&c->iev.ibuf)) == -1 && errno != EAGAIN) || - n == 0) { + if (imsgbuf_read(&c->iev.ibuf) != 1) { control_close(fd); return; } } if (event & EV_WRITE) { - if (msgbuf_write(&c->iev.ibuf.w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(&c->iev.ibuf) == -1) { control_close(fd); return; } diff --git a/sbin/unwind/frontend.c b/sbin/unwind/frontend.c index 3d5d739b9..89a311fa9 100644 --- a/sbin/unwind/frontend.c +++ b/sbin/unwind/frontend.c @@ -1,4 +1,4 @@ -/* $OpenBSD: frontend.c,v 1.83 2024/09/05 08:22:46 florian Exp $ */ +/* $OpenBSD: frontend.c,v 1.90 2024/11/24 11:33:34 kirill Exp $ */ /* * Copyright (c) 2018 Florian Obser @@ -118,6 +118,8 @@ TAILQ_HEAD(, pending_query) pending_queries; struct bl_node { RB_ENTRY(bl_node) entry; char *domain; + int len; + int wildcard; }; __dead void frontend_shutdown(void); @@ -153,6 +155,7 @@ int bl_cmp(struct bl_node *, struct bl_node *); void free_bl(void); int pending_query_cnt(void); void check_available_af(void); +void reverse(char *, char *); struct uw_conf *frontend_conf; static struct imsgev *iev_main; @@ -233,7 +236,9 @@ frontend(int debug, int verbose) fatal("iev_main"); if ((iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_main->ibuf, 3); + if (imsgbuf_init(&iev_main->ibuf, 3) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_main->ibuf); iev_main->handler = frontend_dispatch_main; iev_main->events = EV_READ; event_set(&iev_main->ev, iev_main->ibuf.fd, iev_main->events, @@ -271,11 +276,11 @@ __dead void frontend_shutdown(void) { /* Close pipes. */ - msgbuf_write(&iev_resolver->ibuf.w); - msgbuf_clear(&iev_resolver->ibuf.w); + imsgbuf_write(&iev_resolver->ibuf); + imsgbuf_clear(&iev_resolver->ibuf); close(iev_resolver->ibuf.fd); - msgbuf_write(&iev_main->ibuf.w); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_write(&iev_main->ibuf); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); config_clear(frontend_conf); @@ -311,16 +316,18 @@ frontend_dispatch_main(int fd, short event, void *bula) int n, shut = 0; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -353,7 +360,8 @@ frontend_dispatch_main(int fd, short event, void *bula) if (iev_resolver == NULL) fatal(NULL); - imsg_init(&iev_resolver->ibuf, fd); + if (imsgbuf_init(&iev_resolver->ibuf, fd) == -1) + fatal(NULL); iev_resolver->handler = frontend_dispatch_resolver; iev_resolver->events = EV_READ; @@ -490,16 +498,18 @@ frontend_dispatch_resolver(int fd, short event, void *bula) int n, shut = 0, chg; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -734,7 +744,7 @@ handle_query(struct pending_query *pq) { struct query_imsg query_imsg; struct bl_node find; - int rcode; + int rcode, matched; char *str; char dname[LDNS_MAX_DOMAINLEN + 1]; char qclass_buf[16]; @@ -791,12 +801,19 @@ handle_query(struct pending_query *pq) log_debug("%s: %s %s %s ?", ip_port((struct sockaddr *)&pq->from), dname, qclass_buf, qtype_buf); - find.domain = dname; - if (RB_FIND(bl_tree, &bl_head, &find) != NULL) { - if (frontend_conf->blocklist_log) - log_info("blocking %s", dname); - error_answer(pq, LDNS_RCODE_REFUSED); - goto send_answer; + if (!RB_EMPTY(&bl_head)) { + find.len = strlen(dname); + find.wildcard = 0; + reverse(dname, dname + find.len); + find.domain = dname; + matched = (RB_FIND(bl_tree, &bl_head, &find) != NULL); + reverse(dname, dname + find.len); + if (matched) { + if (frontend_conf->blocklist_log) + log_info("blocking %s", dname); + error_answer(pq, LDNS_RCODE_REFUSED); + goto send_answer; + } } if (pq->qinfo.qtype == LDNS_RR_TYPE_AXFR || pq->qinfo.qtype == @@ -1542,14 +1559,20 @@ parse_blocklist(int fd) if (linelen >= 2 && line[linelen - 2] != '.') line[linelen - 1] = '.'; else - line[linelen - 1] = '\0'; + line[linelen-- - 1] = '\0'; } + if (line[0] == '#') + continue; + bl_node = malloc(sizeof *bl_node); if (bl_node == NULL) fatal("%s: malloc", __func__); if ((bl_node->domain = strdup(line)) == NULL) fatal("%s: strdup", __func__); + reverse(bl_node->domain, bl_node->domain + linelen); + bl_node->len = linelen; + bl_node->wildcard = line[0] == '.'; if (RB_INSERT(bl_tree, &bl_head, bl_node) != NULL) { log_warnx("duplicate blocked domain \"%s\"", line); free(bl_node->domain); @@ -1564,7 +1587,12 @@ parse_blocklist(int fd) int bl_cmp(struct bl_node *e1, struct bl_node *e2) { - return (strcasecmp(e1->domain, e2->domain)); + if (e1->wildcard == e2->wildcard) + return (strcasecmp(e1->domain, e2->domain)); + else if (e1->wildcard) + return (strncasecmp(e1->domain, e2->domain, e1->len)); + else /* e2->wildcard */ + return (strncasecmp(e1->domain, e2->domain, e2->len)); } void @@ -1823,3 +1851,16 @@ check_available_af(void) &available_af, sizeof(available_af)); } } + +void +reverse(char *begin, char *end) +{ + char t; + + while (begin < --end) { + t = *begin; + *begin = *end; + *end = t; + ++begin; + } +} diff --git a/sbin/unwind/resolver.c b/sbin/unwind/resolver.c index ee2a83cbe..3ab2be514 100644 --- a/sbin/unwind/resolver.c +++ b/sbin/unwind/resolver.c @@ -1,4 +1,4 @@ -/* $OpenBSD: resolver.c,v 1.167 2024/06/29 17:25:56 florian Exp $ */ +/* $OpenBSD: resolver.c,v 1.173 2024/11/21 13:35:20 claudio Exp $ */ /* @@ -415,7 +415,9 @@ resolver(int debug, int verbose) if ((iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_main->ibuf, 3); + if (imsgbuf_init(&iev_main->ibuf, 3) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_main->ibuf); iev_main->handler = resolver_dispatch_main; /* Setup event handlers. */ @@ -453,9 +455,9 @@ __dead void resolver_shutdown(void) { /* Close pipes. */ - msgbuf_clear(&iev_frontend->ibuf.w); + imsgbuf_clear(&iev_frontend->ibuf); close(iev_frontend->ibuf.fd); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); config_clear(resolver_conf); @@ -495,16 +497,18 @@ resolver_dispatch_frontend(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -631,16 +635,18 @@ resolver_dispatch_main(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -667,7 +673,8 @@ resolver_dispatch_main(int fd, short event, void *bula) if (iev_frontend == NULL) fatal(NULL); - imsg_init(&iev_frontend->ibuf, fd); + if (imsgbuf_init(&iev_frontend->ibuf, fd) == -1) + fatal(NULL); iev_frontend->handler = resolver_dispatch_frontend; iev_frontend->events = EV_READ; diff --git a/sbin/unwind/unwind.c b/sbin/unwind/unwind.c index 1b70b6e3e..b52646490 100644 --- a/sbin/unwind/unwind.c +++ b/sbin/unwind/unwind.c @@ -1,4 +1,4 @@ -/* $OpenBSD: unwind.c,v 1.68 2023/02/15 13:47:00 florian Exp $ */ +/* $OpenBSD: unwind.c,v 1.75 2024/11/21 13:35:20 claudio Exp $ */ /* * Copyright (c) 2018 Florian Obser @@ -239,9 +239,13 @@ main(int argc, char *argv[]) if ((iev_frontend = malloc(sizeof(struct imsgev))) == NULL || (iev_resolver = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_frontend->ibuf, pipe_main2frontend[0]); + if (imsgbuf_init(&iev_frontend->ibuf, pipe_main2frontend[0]) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_frontend->ibuf); iev_frontend->handler = main_dispatch_frontend; - imsg_init(&iev_resolver->ibuf, pipe_main2resolver[0]); + if (imsgbuf_init(&iev_resolver->ibuf, pipe_main2resolver[0]) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_resolver->ibuf); iev_resolver->handler = main_dispatch_resolver; /* Setup event handlers for pipes. */ @@ -312,9 +316,9 @@ main_shutdown(void) int status; /* Close pipes. */ - msgbuf_clear(&iev_frontend->ibuf.w); + imsgbuf_clear(&iev_frontend->ibuf); close(iev_frontend->ibuf.fd); - msgbuf_clear(&iev_resolver->ibuf.w); + imsgbuf_clear(&iev_resolver->ibuf); close(iev_resolver->ibuf.fd); config_clear(main_conf); @@ -398,16 +402,18 @@ main_dispatch_frontend(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -461,16 +467,18 @@ main_dispatch_resolver(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* Connection closed. */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -523,7 +531,7 @@ void imsg_event_add(struct imsgev *iev) { iev->events = EV_READ; - if (iev->ibuf.w.queued) + if (imsgbuf_queuelen(&iev->ibuf) > 0) iev->events |= EV_WRITE; event_del(&iev->ev); diff --git a/sbin/unwind/unwind.conf.5 b/sbin/unwind/unwind.conf.5 index dbcec1bd6..d17626f49 100644 --- a/sbin/unwind/unwind.conf.5 +++ b/sbin/unwind/unwind.conf.5 @@ -1,4 +1,4 @@ -.\" $OpenBSD: unwind.conf.5,v 1.34 2024/06/30 16:10:26 florian Exp $ +.\" $OpenBSD: unwind.conf.5,v 1.35 2024/11/24 11:33:34 kirill Exp $ .\" .\" Copyright (c) 2018 Florian Obser .\" Copyright (c) 2005 Esben Norby @@ -18,7 +18,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: June 30 2024 $ +.Dd $Mdocdate: November 24 2024 $ .Dt UNWIND.CONF 5 .Os .Sh NAME @@ -72,6 +72,8 @@ answers with a return code of With .Cm log blocked queries are logged. +The list supports limited wildcard syntax: domains starting with . (dot) +are treated as any subdomains on that zone. .It Ic forwarder Brq Ar address Oo Ic port Ar number Oc Oo Oo Ic authentication name Ar name Oc Ic DoT Oc ... A list of addresses of DNS name servers to forward queries to. .Ic port diff --git a/sbin/vnconfig/vnconfig.c b/sbin/vnconfig/vnconfig.c index 76ee44f66..80607400a 100644 --- a/sbin/vnconfig/vnconfig.c +++ b/sbin/vnconfig/vnconfig.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vnconfig.c,v 1.13 2023/05/14 18:34:02 krw Exp $ */ +/* $OpenBSD: vnconfig.c,v 1.14 2024/11/09 10:57:06 sobrado Exp $ */ /* * Copyright (c) 1993 University of Utah. * Copyright (c) 1990, 1993 @@ -362,7 +362,8 @@ usage(void) { fprintf(stderr, "usage: vnconfig [-v] [-k | -K rounds [-S saltfile]] " - "[-t disktype] [vnd_dev] image\n" + "[-t disktype] [vnd_dev]\n" + " image\n" " vnconfig -l [vnd_dev]\n" " vnconfig -u [-v] vnd_dev\n"); exit(1); diff --git a/share/man/man4/Makefile b/share/man/man4/Makefile index fbef6aff9..7f10663dc 100644 --- a/share/man/man4/Makefile +++ b/share/man/man4/Makefile @@ -1,10 +1,10 @@ -# $OpenBSD: Makefile,v 1.851 2024/09/04 11:12:53 jsg Exp $ +# $OpenBSD: Makefile,v 1.857 2024/12/15 11:07:08 dlg Exp $ MAN= aac.4 abcrtc.4 abl.4 ac97.4 acphy.4 acrtc.4 \ acpi.4 acpiac.4 acpials.4 acpiasus.4 acpibat.4 \ - acpibtn.4 acpicbkbd.4 acpicpu.4 acpidock.4 acpihve.4 acpiec.4 \ - acpige.4 acpihid.4 \ - acpihpet.4 acpimadt.4 acpimcfg.4 acpipci.4 acpiprt.4 acpipwrres.4 \ + acpibtn.4 acpicbkbd.4 acpicmos.4 acpicpu.4 acpidock.4 \ + acpiec.4 acpige.4 acpihid.4 acpihpet.4 acpihve.4 \ + acpimadt.4 acpimcfg.4 acpipci.4 acpiprt.4 acpipwrres.4 \ acpisbs.4 acpisony.4 acpisurface.4 acpithinkpad.4 acpitoshiba.4 \ acpitimer.4 acpivideo.4 acpivout.4 acpitz.4 \ acx.4 adc.4 addcom.4 adl.4 admcts.4 admlc.4 admtemp.4 \ @@ -34,15 +34,15 @@ MAN= aac.4 abcrtc.4 abl.4 ac97.4 acphy.4 acrtc.4 \ eap.4 ec.4 eephy.4 ef.4 efi.4 eg.4 ehci.4 eisa.4 el.4 em.4 emc.4 gcu.4 \ emu.4 enc.4 endrun.4 envy.4 eoip.4 ep.4 epic.4 esa.4 escodec.4 \ eso.4 ess.4 et.4 etherip.4 etphy.4 ex.4 exphy.4 exrtc.4 \ - fanpwr.4 fd.4 fdc.4 fec.4 fido.4 fins.4 fintek.4 fms.4 fusbtc.4 \ - fuse.4 fxp.4 \ + fanpwr.4 fd.4 fdc.4 fec.4 fido.4 fins.4 fintek.4 fms.4 frame.4 \ + fusbtc.4 fuse.4 fxp.4 \ gdt.4 gentbi.4 gem.4 gfrtc.4 gif.4 glenv.4 glkgpio.4 gpio.4 \ gpiocharger.4 gpiodcf.4 \ gpioiic.4 gpiokeys.4 gpioleds.4 gpioow.4 graphaudio.4 gre.4 gscsio.4 \ hds.4 hiclock.4 hidwusb.4 hil.4 hilid.4 hilkbd.4 hilms.4 \ hireset.4 hitemp.4 hme.4 hotplug.4 hsq.4 \ hvn.4 hvs.4 hyperv.4 \ - iatp.4 iavf.4 icc.4 ichiic.4 ichwdt.4 \ + iatp.4 iavf.4 icc.4 ice.4 ichiic.4 ichwdt.4 \ icmp.4 icmp6.4 icsphy.4 ietp.4 ifmedia.4 \ igc.4 iha.4 ihidev.4 iic.4 iicmux.4 ikbd.4 ims.4 imt.4 imxanatop.4 \ imxdog.4 imxesdhc.4 imxgpc.4 imxgpio.4 imxiic.4 imxpciephy.4 \ @@ -50,7 +50,7 @@ MAN= aac.4 abcrtc.4 abl.4 ac97.4 acphy.4 acrtc.4 \ inet.4 inet6.4 inphy.4 intelpmc.4 \ iophy.4 iosf.4 ip.4 ip6.4 ipcomp.4 ipgphy.4 \ ipmi.4 ips.4 ipsec.4 ipw.4 isa.4 isagpio.4 isapnp.4 islrtc.4 \ - it.4 itherm.4 iwi.4 iwn.4 iwm.4 iwx.4 ix.4 ixgb.4 ixl.4 \ + it.4 itherm.4 iwi.4 iwn.4 iwm.4 iwx.4 ix.4 ixv.4 ixgb.4 ixl.4 \ jmb.4 jme.4 jmphy.4 \ kate.4 kcov.4 km.4 ksmn.4 kstat.4 ksyms.4 kubsan.4 kue.4 \ lc.4 lge.4 lii.4 \ @@ -74,8 +74,8 @@ MAN= aac.4 abcrtc.4 abl.4 ac97.4 acphy.4 acrtc.4 \ pgt.4 piixpm.4 pijuice.4 pinctrl.4 pipex.4 plgpio.4 plrtc.4 pluart.4 \ pms.4 ppb.4 ppp.4 pppoe.4 pppx.4 psci.4 psp.4 pty.4 puc.4 pvbus.4 \ pvclock.4 pwdog.4 pwmbl.4 pwmfan.4 pwmleds.4 pwmreg.4 \ - qccpu.4 qcdwusb.4 qcgpio.4 qciic.4 qcpdc.4 qcpmic.4 qcpmicgpio.4 \ - qcpon.4 qcpwm.4 qcrng.4 qcrtc.4 qcspmi.4 \ + qccpu.4 qccpucp.4 qcdwusb.4 qcgpio.4 qciic.4 qcpdc.4 qcpmic.4 \ + qcpmicgpio.4 qcpon.4 qcpwm.4 qcrng.4 qcrtc.4 qcspmi.4 \ qla.4 qle.4 qlw.4 qsphy.4 qwx.4 \ radio.4 ral.4 random.4 rdomain.4 rd.4 rdac.4 re.4 rdcphy.4 rgephy.4 \ rge.4 ricohrtc.4 rkanxdp.4 rkclock.4 rkcomphy.4 \ @@ -95,7 +95,7 @@ MAN= aac.4 abcrtc.4 abl.4 ac97.4 acphy.4 acrtc.4 \ tascodec.4 tcic.4 tcp.4 tcpci.4 termios.4 tht.4 ti.4 tipd.4 \ tipmic.4 titmp.4 tl.4 \ tlphy.4 thmc.4 tpm.4 tpmr.4 tqphy.4 trm.4 trunk.4 tsl.4 tty.4 \ - tun.4 tap.4 twe.4 \ + tun.4 twe.4 \ txp.4 txphy.4 uaudio.4 uaq.4 uark.4 uath.4 ubcmtp.4 uberry.4 ubsa.4 \ ucc.4 ucom.4 uchcom.4 ucrcom.4 ucycom.4 ukspan.4 uslhcom.4 \ udav.4 udcf.4 udl.4 udp.4 udsbr.4 ufshci.4 \ diff --git a/share/man/man4/acpi.4 b/share/man/man4/acpi.4 index b6b376df4..423ee5480 100644 --- a/share/man/man4/acpi.4 +++ b/share/man/man4/acpi.4 @@ -1,4 +1,4 @@ -.\" $OpenBSD: acpi.4,v 1.75 2024/08/04 16:31:02 jmc Exp $ +.\" $OpenBSD: acpi.4,v 1.76 2024/11/05 11:12:48 miod Exp $ .\" .\" Copyright (c) 2006 Alexander Yurchenko .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: August 4 2024 $ +.Dd $Mdocdate: November 5 2024 $ .Dt ACPI 4 .Os .Sh NAME @@ -52,6 +52,8 @@ ACPI control method battery ACPI button .It Xr acpicbkbd 4 Chromebook keyboard backlight +.It Xr acpicmos 4 +CMOS memory manager .It Xr acpicpu 4 ACPI processor power and performance state .It Xr acpidock 4 diff --git a/share/man/man4/acpicmos.4 b/share/man/man4/acpicmos.4 new file mode 100644 index 000000000..8314aa22f --- /dev/null +++ b/share/man/man4/acpicmos.4 @@ -0,0 +1,36 @@ +.\" $OpenBSD: acpicmos.4,v 1.1 2024/11/05 11:12:48 miod Exp $ +.\" +.\" Copyright (c) 2024, Miodrag Vallat. +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd $Mdocdate: November 5 2024 $ +.Dt ACPICMOS 4 +.Os +.Sh NAME +.Nm acpicmos +.Nd CMOS memory manager +.Sh SYNOPSIS +.Cd "acpicmos* at acpi?" Pq "i386 and amd64" +.Sh DESCRIPTION +The +.Nm +driver handles CMOS memory access requests for all ACPI operations. +.Sh SEE ALSO +.Xr acpi 4 , +.Xr intro 4 +.Sh HISTORY +The +.Nm +driver first appeared in +.Ox 6.4 . diff --git a/share/man/man4/cd.4 b/share/man/man4/cd.4 index d47f8d4c5..73a214f56 100644 --- a/share/man/man4/cd.4 +++ b/share/man/man4/cd.4 @@ -1,4 +1,4 @@ -.\" $OpenBSD: cd.4,v 1.25 2015/08/27 18:58:05 jmc Exp $ +.\" $OpenBSD: cd.4,v 1.26 2024/12/21 01:00:31 jsg Exp $ .\" $NetBSD: cd.4,v 1.3 1996/10/20 23:15:21 explorer Exp $ .\" .\" Copyright (c) 1996 @@ -26,7 +26,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: August 27 2015 $ +.Dd $Mdocdate: December 21 2024 $ .Dt CD 4 .Os .Sh NAME @@ -334,9 +334,10 @@ None. .Xr disklabel 5 , .Xr disklabel 8 .Sh HISTORY -The +.An Julian Elischer +wrote .Nm -driver appeared in 386BSD 0.1. +for Mach 2.5 and ported it to 386BSD. .Sh BUGS The names of the structures used for the third argument to .Fn ioctl diff --git a/share/man/man4/ddb.4 b/share/man/man4/ddb.4 index f0f7b134b..c17620a70 100644 --- a/share/man/man4/ddb.4 +++ b/share/man/man4/ddb.4 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ddb.4,v 1.109 2024/10/14 07:05:23 jmc Exp $ +.\" $OpenBSD: ddb.4,v 1.110 2024/12/21 03:10:46 jsg Exp $ .\" $NetBSD: ddb.4,v 1.5 1994/11/30 16:22:09 jtc Exp $ .\" .\" Mach Operating System @@ -25,7 +25,7 @@ .\" any improvements or extensions that they make and grant Carnegie Mellon .\" the rights to redistribute these changes. .\" -.Dd $Mdocdate: October 14 2024 $ +.Dd $Mdocdate: December 21 2024 $ .Dt DDB 4 .Os .Sh NAME @@ -1290,7 +1290,7 @@ It may be followed by a ':' as described above with .Xr pool 9 , .Xr uvm_init 9 .Sh HISTORY -This kernel facility first appeared in the MACH 2 operating system +This kernel facility first appeared in the Mach 3.0 operating system developed by CMU. Hangman (which stands for "hangs maniacal analyzer") first appeared in .Ox 1.2 . diff --git a/share/man/man4/frame.4 b/share/man/man4/frame.4 new file mode 100644 index 000000000..a8e8cd89f --- /dev/null +++ b/share/man/man4/frame.4 @@ -0,0 +1,244 @@ +.\" $OpenBSD: frame.4,v 1.2 2024/12/16 21:39:29 jmc Exp $ +.\" +.\" Copyright (c) 2024 David Gwynne +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd $Mdocdate: December 16 2024 $ +.Dt FRAME 4 +.Os +.Sh NAME +.Nm frame +.Nd frame protocol family +.Sh SYNOPSIS +.Cd "pseudo-device af_frame" +.Pp +.In sys/types.h +.In net/frame.h +.Sh DESCRIPTION +The +.Nm +protocol family provides an interface for sending and receiving low +level network interface frames through the normal +.Xr socket 2 +mechanisms. +.Pp +The +.Nm +protocol family supports the +.Dv SOCK_DGRAM +socket type. +Only root may create +.Nm +protocol family sockets. +.Pp +.Nm +protocol family sockets are designed as an alternative to +.Xr bpf 4 +for handling low data and packet rate communication protocols. +Rather than filtering every frame entering the system before the +network stack, like +.Xr bpf 4 , +processing of the +.Nm +protocol family runs after the built in protocol handlers in the kernel, +thus avoiding the overhead. +For this reason, it is not possible to handle IPv4 or IPv6 packets +with +.Nm +protocol sockets because the kernel network stack consumes them +before the receive handling for +.Nm +sockets is run. +.Pp +Sockets can be created in the +.Nm +protocol family by using +.Dv AF_FRAME +as the +.Fa domain +argument to +.Xr socket 2 . +The type of interface, as per +.In net/if_types.h , +is specified as the socket +.Fa protocol . +Currently only Ethernet interfaces are supported. +.Pp +Sockets bound to the +.Nm +family use the following address structure: +.Bd -literal -offset indent +#define FRAME_ADDRLEN 8 +#define FRAME_DATALEN 32 + +struct sockaddr_frame { + uint8_t sfrm_len; + uint8_t sfrm_family; + uint16_t sfrm_proto; + unsigned int sfrm_ifindex; + uint8_t sfrm_addr[FRAME_ADDRLEN]; + char sfrm_ifname[IFNAMSIZ]; + uint8_t sfrm_data[FRAME_DATALEN]; +}; +.Ed +.Pp +The interface used for transmitting or receiving frames with a +.Nm +domain socket may be specified by using an interface index with +.Fa sfrm_ifindex , +or by name with +.Fa sfrm_ifname . +The use of other +.Vt struct sockaddr_frame +fields depends on the type of interface. +.Ss Ethernet frame sockets +A +.Nm +socket for use with Ethernet interfaces can be created using +.Dv IFT_ETHER +as the +.Fa protocol +argument to +.Xr socket 2 : +.Bd -literal -offset indent +int sock = socket(AF_FRAME, SOCK_DGRAM, IFT_ETHER); +.Ed +.Pp +The Ethernet protocol is specified with +.Fa sfrm_proto +in network byte order. +Ethernet addresses are specified using the first 6 bytes of +.Fa sfrm_addr . +.Pp +Ethernet +.Nm +sockets may receive frames on all interfaces by specifying 0 for +.Va sfrm_ifindex +when using +.Xr bind 2 . +Similarly, a +.Dq wildcard +local address of all zeros can be specified in +.Fa sfrm_addr . +.Pp +An interface and address must be specified when sending Ethernet frames. +.Pp +Ethernet sockets support the following +.Nm +socket options +using +.Dv IFT_ETHER +as the +.Fa level +argument with +.Xr setsockopt 2 +and +.Xr getsockopt 2 : +.Bl -tag -width Ds +.It Dv FRAME_RECVDSTADDR Ft int +Enable or disable the reception of the Ethernet destination address as a +.Vt struct ether_addr +control message for frames received with +.Xr recvmsg 2 . +.It Dv FRAME_RECVPRIO Ft int +Enable or disable the reception of the mbuf packet priority field as an +.Vt int +sized control message for frames received with +.Xr recvmsg 2 . +.It Dv FRAME_ADD_MEMBERSHIP Ft struct frame_mreq +Configure an Ethernet interface to enable reception of +frames destined to the specified multicast Ethernet address. +.Bd -literal -offset indent +struct frame_mreq { + unsigned int fmr_ifindex; + uint8_t fmr_addr[FRAME_ADDRLEN]; + char fmr_ifname[IFNAMSIZ]; +}; +.Ed +.Pp +An interface must be specified using either +.Fa fmr_ifindex +or +.Fa fmr_ifname . +The multicast Ethernet address is specified in the first 6 bytes of +.Fa fmr_addr . +.It Dv FRAME_DEL_MEMBERSHIP Ft struct frame_mreq +Configure an Ethernet interface to disable reception of frames destined +to the specified multicast Ethernet address. +.It Dv FRAME_SENDPRIO Ft int +Specify an mbuf priority value between +.Dv IF_HDRPRIO_MIN +.Pq 0 +and +.Dv IF_HDRPRIO_MAX +.Pq 7 +for frames sent with the Ethernet +.Nm +socket, or +.Dv IF_HDRPRIO_PACKET +to use the existing mbuf priority value. +The default is +.Dv IF_HDRPRIO_PACKET . +.El +.Sh EXAMPLES +To receive LLDP frames on the em0 Ethernet interface: +.Bd -literal -offset indent +struct sockaddr_frame sfrm = { + .sfrm_family = AF_FRAME, + .sfrm_ifname = "em0", + .sfrm_proto = htons(ETHERTYPE_LLDP), +}; +struct frame_mreq fmr = { + .fmr_ifname = "em0", + .fmr_addr = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e }, +}; +int sock; + +sock = socket(AF_FRAME, SOCK_DGRAM, IFT_ETHER); +if (sock == -1) + err(1, "ethernet frame socket"); +if (bind(sock, (struct addrinfo *)&sfrm, sizeof(sfrm)) == -1) + err(1, "bind"); +if (setsockopt(sock, IFT_ETHER, FRAME_ADD_MEMBERSHIP, + &fmr, sizeof(fmr)) == -1) + err(1, "join lldp multicast group"); + +for (;;) { + socklen_t sfrmlen = sizeof(sfrm); + uint8_t frame[2048]; + ssize_t rv; + + rv = recvfrom(sock, frame, sizeof(frame), 0, + (struct sockaddr *)&sfrm, &sfrmlen); + if (rv == -1) + err(1, "lldp recv"); + printf("received %zd bytes from %s", rv, + ether_ntoa((struct ether_addr *)sfrm->sfrm_addr)); +} +.Ed +.Sh SEE ALSO +.Xr socket 2 , +.Xr netintro 4 +.Sh HISTORY +.Nm +domain sockets appeared in +.Ox 7.7 . +.\" The +.\" .Ox +.\" implementation was influenced by the Linux +.\" .Dv AF_PACKET +.\" .Dq packet interface on device level +.\" socket interface, but is not compatible with it. +.Sh AUTHORS +.An David Gwynne Aq Mt dlg@openbsd.org . diff --git a/share/man/man4/iavf.4 b/share/man/man4/iavf.4 index 43d6e2d47..474083c76 100644 --- a/share/man/man4/iavf.4 +++ b/share/man/man4/iavf.4 @@ -1,4 +1,4 @@ -.\" $OpenBSD: iavf.4,v 1.3 2019/08/04 06:55:42 jmc Exp $ +.\" $OpenBSD: iavf.4,v 1.4 2024/11/03 06:42:10 jmc Exp $ .\" .\" Copyright (c) 2019 Jonathan Matthew .\" @@ -14,18 +14,18 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: August 4 2019 $ +.Dd $Mdocdate: November 3 2024 $ .Dt IAVF 4 .Os .Sh NAME .Nm iavf -.Nd Intel Ethernet Adaptive Virtual Function device +.Nd Intel Ethernet adaptive virtual function device .Sh SYNOPSIS .Cd "iavf* at pci?" .Sh DESCRIPTION The .Nm -driver supports the SR-IOV Virtual Functions of Intel 700 series Ethernet +driver supports the SR-IOV virtual functions of Intel 700 series Ethernet controller devices, and newer product families. .Sh SEE ALSO .Xr arp 4 , diff --git a/share/man/man4/ice.4 b/share/man/man4/ice.4 new file mode 100644 index 000000000..10535d357 --- /dev/null +++ b/share/man/man4/ice.4 @@ -0,0 +1,52 @@ +.\" $OpenBSD: ice.4,v 1.1 2024/11/26 21:59:30 stsp Exp $ +.\" +.\" Copyright (c) 2024 Stefan Sperling +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd $Mdocdate: November 26 2024 $ +.Dt ICE 4 +.Os +.Sh NAME +.Nm ice +.Nd Intel Ethernet 800 series Ethernet device +.Sh SYNOPSIS +.Cd "ice* at pci?" +.Sh DESCRIPTION +The +.Nm +driver supports Intel 800 series controllers based on the +Intel E810 Ethernet chipset. +.Sh SEE ALSO +.Xr arp 4 , +.Xr ifmedia 4 , +.Xr intro 4 , +.Xr netintro 4 , +.Xr pci 4 , +.Xr hostname.if 5 , +.Xr ifconfig 8 +.Sh HISTORY +The +.Nm +driver first appeared in +.Fx 12.2 . +.Ox +support was added in +.Ox 7.7 . +.Sh AUTHORS +The +.Nm +driver was written by Intel and ported to +.Ox +by +.An Stefan Sperling Aq Mt stsp@openbsd.org . diff --git a/share/man/man4/ix.4 b/share/man/man4/ix.4 index 64ebbc9ad..c05635810 100644 --- a/share/man/man4/ix.4 +++ b/share/man/man4/ix.4 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ix.4,v 1.10 2022/02/06 00:29:02 jsg Exp $ +.\" $OpenBSD: ix.4,v 1.11 2024/11/02 06:47:03 jmc Exp $ .\" .\" Copyright (c) 2008 Reyk Floeter .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: February 6 2022 $ +.Dd $Mdocdate: November 2 2024 $ .Dt IX 4 .Os .Sh NAME @@ -80,6 +80,7 @@ to the equipment. .Xr arp 4 , .Xr ifmedia 4 , .Xr intro 4 , +.Xr ixv 4 , .Xr netintro 4 , .Xr pci 4 , .Xr hostname.if 5 , diff --git a/share/man/man4/ixv.4 b/share/man/man4/ixv.4 new file mode 100644 index 000000000..96234b485 --- /dev/null +++ b/share/man/man4/ixv.4 @@ -0,0 +1,61 @@ +.\" $OpenBSD: ixv.4,v 1.4 2024/11/03 06:42:10 jmc Exp $ +.\" +.\" Copyright (c) 2024 YASUOKA Masahiko +.\" Copyright (c) 2019 Jonathan Matthew +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd $Mdocdate: November 3 2024 $ +.Dt IXV 4 +.Os +.Sh NAME +.Nm ixv +.Nd Intel 10Gb Ethernet virtual function device +.Sh SYNOPSIS +.Cd "ixv* at pci?" +.Sh DESCRIPTION +The +.Nm +driver supports the SR-IOV virtual functions of Intel 82598EB, +82559, and X540-based Ethernet controller devices. +.Sh SEE ALSO +.Xr arp 4 , +.Xr ifmedia 4 , +.Xr intro 4 , +.Xr ix 4 , +.Xr netintro 4 , +.Xr pci 4 , +.Xr hostname.if 5 , +.Xr ifconfig 8 +.Sh HISTORY +The +.Nm +driver first appeared in +.Ox 7.7 . +.Sh AUTHORS +The +.Nm +driver was written by +Intel Corporation and ported to +.Ox +by +.An NAITO Yuichiro . +.Sh BUGS +The VF relies on +.Dq vlan-filter +to receive VLAN-tagged packets. +Because the current driver doesn't have a way to configure it, +any VLAN-tagged packets will not be passed. +Alternatively, +on the host running the primary function, +there might be a way to configure a VLAN ID. diff --git a/share/man/man4/man4.amd64/vmm.4 b/share/man/man4/man4.amd64/vmm.4 index 90d4ff7a6..cc621a8ee 100644 --- a/share/man/man4/man4.amd64/vmm.4 +++ b/share/man/man4/man4.amd64/vmm.4 @@ -1,4 +1,4 @@ -.\" $OpenBSD: vmm.4,v 1.9 2022/09/11 11:41:04 jsg Exp $ +.\" $OpenBSD: vmm.4,v 1.10 2024/11/05 15:08:46 mlarkin Exp $ .\" .\"Copyright (c) 2015 Mike Larkin .\" @@ -14,7 +14,7 @@ .\"ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\"OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: September 11 2022 $ +.Dd $Mdocdate: November 5 2024 $ .Dt VMM 4 amd64 .Os .Sh NAME @@ -105,9 +105,6 @@ version) for a VM. Write paravirtualized hardware parameters (such as .Xr pvclock 4 guest physical address) for a VM. -.It Dv VMM_IOC_MPROTECT_EPT Fa "struct vm_mprotect_ept_params *" -Set access protections on guest page table entries -(only supported on hosts providing EPT or RVI). .El .Sh SEE ALSO .Xr cpu 4 , diff --git a/share/man/man4/pci.4 b/share/man/man4/pci.4 index a88f99bbe..0baa161a5 100644 --- a/share/man/man4/pci.4 +++ b/share/man/man4/pci.4 @@ -1,4 +1,4 @@ -.\" $OpenBSD: pci.4,v 1.407 2024/06/30 08:13:02 kevlo Exp $ +.\" $OpenBSD: pci.4,v 1.410 2024/11/26 21:59:30 stsp Exp $ .\" $NetBSD: pci.4,v 1.29 2000/04/01 00:32:23 tsarna Exp $ .\" .\" Copyright (c) 2000 Theo de Raadt. All rights reserved. @@ -31,7 +31,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: June 30 2024 $ +.Dd $Mdocdate: November 26 2024 $ .Dt PCI 4 .Os .Sh NAME @@ -217,7 +217,9 @@ GEM 10/100/1Gb Ethernet device .It Xr hme 4 Sun Happy Meal 10/100 Ethernet device .It Xr iavf 4 -Intel Ethernet Adaptive Virtual Function device +Intel Ethernet adaptive virtual function device +.It Xr ice 4 +Intel Ethernet 800 series Ethernet device .It Xr igc 4 Intel I225/I226 1Gb/2.5Gb Ethernet device .It Xr ix 4 @@ -226,6 +228,8 @@ Intel 82598/82599/X540/X550 PCI Express 100/1Gb/10Gb Ethernet device Intel PRO/10GbE 10Gb Ethernet device .It Xr ixl 4 Intel Ethernet 700 series Ethernet device +.It Xr ixv 4 +Intel 10Gb Ethernet virtual function device .It Xr jme 4 JMicron JMC25x/JMC26x 10/100/1Gb Ethernet device .It Xr lge 4 diff --git a/share/man/man4/qccpucp.4 b/share/man/man4/qccpucp.4 new file mode 100644 index 000000000..59dacee66 --- /dev/null +++ b/share/man/man4/qccpucp.4 @@ -0,0 +1,44 @@ +.\" $OpenBSD: qccpucp.4,v 1.2 2024/11/19 18:39:34 jmc Exp $ +.\" +.\" Copyright (c) 2024 Tobias Heider +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" +.Dd $Mdocdate: November 19 2024 $ +.Dt QCCPUCP 4 +.Os +.Sh NAME +.Nm qccpucp +.Nd Qualcomm CPUCP mailbox controller +.Sh SYNOPSIS +.Cd "qccpucp* at fdt?" +.Sh DESCRIPTION +The +.Nm +handles communication with the Qualcomm CPUSS Control Processor. +It is used as a doorbell for CPU frequency management via +.Xr scmi 4 +on Qualcomm Snapdragon X Elite devices. +.Sh SEE ALSO +.Xr intro 4 , +.Xr scmi 4 +.Sh HISTORY +The +.Nm +device driver first appeared in +.Ox 7.7 . +.Sh AUTHORS +The +.Nm +driver was written by +.An Tobias Heider Aq Mt tobhe@openbsd.org . diff --git a/share/man/man4/sd.4 b/share/man/man4/sd.4 index b5990a158..02d30c6c3 100644 --- a/share/man/man4/sd.4 +++ b/share/man/man4/sd.4 @@ -1,4 +1,4 @@ -.\" $OpenBSD: sd.4,v 1.20 2014/07/02 22:35:42 matthew Exp $ +.\" $OpenBSD: sd.4,v 1.21 2024/12/21 01:00:31 jsg Exp $ .\" $NetBSD: sd.4,v 1.3 1996/10/20 23:15:23 explorer Exp $ .\" .\" Copyright (c) 1996 @@ -26,7 +26,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: July 2 2014 $ +.Dd $Mdocdate: December 21 2024 $ .Dt SD 4 .Os .Sh NAME @@ -219,12 +219,7 @@ None. .Xr disklabel 8 , .Xr fdisk 8 .Sh HISTORY -The +.An Julian Elischer +wrote .Nm -driver was originally written for -.Tn Mach -2.5, and was ported to -.Fx -by Julian Elischer. -It was later ported to -.Ox . +for Mach 2.5 and ported it to 386BSD. diff --git a/share/man/man4/st.4 b/share/man/man4/st.4 index ba10911f6..43159d35e 100644 --- a/share/man/man4/st.4 +++ b/share/man/man4/st.4 @@ -1,4 +1,4 @@ -.\" $OpenBSD: st.4,v 1.21 2022/03/31 17:27:21 naddy Exp $ +.\" $OpenBSD: st.4,v 1.22 2024/12/21 01:00:31 jsg Exp $ .\" $NetBSD: st.4,v 1.2 1996/10/20 23:15:24 explorer Exp $ .\" .\" Copyright (c) 1996 @@ -26,7 +26,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: March 31 2022 $ +.Dd $Mdocdate: December 21 2024 $ .Dt ST 4 .Os .Sh NAME @@ -302,13 +302,7 @@ Eject, no rewind on close. .Xr mtio 4 , .Xr scsi 4 .Sh HISTORY -This +.An Julian Elischer +wrote .Nm -driver was originally written for -.Tn Mach -2.5 by Julian Elischer, and was ported to -.Nx -by Charles Hannum. -This man page was edited for -.Nx -by Jon Buller. +for Mach 2.5 and ported it to 386BSD. diff --git a/share/man/man4/tap.4 b/share/man/man4/tap.4 deleted file mode 100644 index 92d3496eb..000000000 --- a/share/man/man4/tap.4 +++ /dev/null @@ -1,222 +0,0 @@ -.\" $OpenBSD: tap.4,v 1.5 2021/03/23 16:26:53 claudio Exp $ -.\" -.\" Copyright (c) 2003 Marcus D. Watts All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, and the entire permission notice in its entirety, -.\" including the disclaimer of warranties. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. The name of the author may not be used to endorse or promote -.\" products derived from this software without specific prior -.\" written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, -.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY -.\" AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -.\" MARCUS D. WATTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -.\" OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -.\" TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -.\" USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.Dd $Mdocdate: March 23 2021 $ -.Dt TAP 4 -.Os -.Sh NAME -.Nm tap -.Nd Ethernet tunnel pseudo-device -.Sh SYNOPSIS -.Cd "pseudo-device tun" -.Pp -.In sys/types.h -.In net/if_tun.h -.Sh DESCRIPTION -The -.Nm -driver provides an Ethernet interface pseudo-device. -Packets sent to this interface can be read by a userland process -and processed as desired. -Packets written by the userland process are injected back into -the kernel networking subsystem. -.Pp -A -.Nm -interface can be created at runtime using the -.Ic ifconfig tap Ns Ar N Ic create -command or by opening the character special device -.Pa /dev/tapN . -.Pp -Each device has an exclusive open property: it cannot be opened -if it is already open and in use by another process. -Each read returns at most one packet; if insufficient -buffer space is provided, the packet is truncated. -Each write supplies exactly one packet. -Each packet read or written is an Ethernet packet. -The Ethernet CRC at the end of the frame is not required. -On the last close of the device, all queued packets are discarded. -If the device was created by opening -.Pa /dev/tapN , -it will be automatically destroyed. -Devices created via -.Xr ifconfig 8 -are only marked as not running and traffic will be dropped returning -.Er EHOSTDOWN . -.Pp -Writes never block. -If the protocol queue is full, the packet is dropped, a -.Dq collision -is counted, and -.Er ENOBUFS -is returned. -.Pp -In addition to the usual network interface -ioctl commands described in -.Xr netintro 4 , -the following special commands defined in -.In net/if_tun.h -are supported: -.Pp -.Bl -tag -width indent -compact -.It Dv TUNGIFINFO Fa "struct tuninfo *" -.It Dv TUNSIFINFO Fa "struct tuninfo *" -Get or set the interface characteristics. -.Bd -literal -/* iface info */ -struct tuninfo { - u_int mtu; - u_short type; - u_short flags; - u_int baudrate; -}; -.Ed -.Pp -.Va flags -sets the interface flags, and -can include one or more of -.Dv IFF_UP , -.Dv IFF_POINTOPOINT , -.Dv IFF_MULTICAST , -.Dv IFF_BROADCAST . -Flags given will be set; flags omitted will be cleared; flags not in this list -will not be changed even when given. -Flags default to -.Dv IFF_BROADCAST | IFF_MULTICAST . -It is an error to set both -.Dv IFF_POINTOPOINT -and -.Dv IFF_BROADCAST . -.\" should say what type affects... -.Va type -defaults to -.Dv IFT_ETHER . -This sets the interface media address header type. -.Pp -.It Dv TUNSIFMODE Fa int * -Set just the interface flags. -The same restrictions as for -.Dv TUNSIFINFO -apply. -.Pp -.It Dv SIOCGIFADDR Fa uint8_t Ns [ETHER_ADDR_LEN] -.It Dv SIOCSIFADDR Fa uint8_t Ns [ETHER_ADDR_LEN] -Get or set the link layer address (MAC address) of the interface. -.El -.Pp -The generic ioctls -.Dv FIONREAD , -.Dv FIONBIO , -.Dv FIOASYNC , -.Dv FIOSETOWN , -.Dv FIOGETOWN -are supported by -.Nm . -.Sh FILES -.Bl -tag -width /dev/tap* -compact -.It Pa /dev/tap* -.El -.Sh ERRORS -If open fails, -.Xr errno 2 -may be set to one of: -.Bl -tag -width Er -.It Bq Er ENXIO -Not that many devices configured. -.It Bq Er EBUSY -Device was already open. -.El -.Pp -If a -.Xr write 2 -call fails, -.Xr errno 2 -is set to one of: -.Bl -tag -width Er -.It Bq Er EMSGSIZE -The packet supplied was too small or too large. -The maximum sized packet allowed is currently 16384 bytes. -.It Bq Er ENOBUFS -There were no mbufs, or -the queue for the outgoing protocol is full. -.It Bq Er EAFNOSUPPORT -The address family specified in the tunnel header was not -recognized. -.El -.Pp -Ioctl commands may fail with: -.Bl -tag -width Er -.It Bq Er EINVAL -Attempt to set both -.Dv IFF_POINTOPOINT -and -.Dv IFF_BROADCAST -with -.Dv TUNSIFMODE . -.It Bq Er ENOTTY -Unrecognized ioctl command. -.El -.Pp -A -.Xr read 2 -call may fail because of: -.Bl -tag -width Er -.It Bq Er EHOSTDOWN -The device is not ready. -The device must have an -.Xr inet 4 -interface address assigned to it, such as via -.Dv SIOCSIFADDR . -.It Bq Er EWOULDBLOCK -Non-blocking I/O was selected and no packets were available. -.El -.Pp -An attempt to send a packet out via the interface may fail with: -.Bl -tag -width Er -.It Bq Er EHOSTDOWN -The device is not ready. -The device must have an -.Xr inet 4 -interface address assigned to it, such as via -.Dv SIOCSIFADDR . -.El -.Sh SEE ALSO -.Xr ioctl 2 , -.Xr inet 4 , -.Xr intro 4 , -.Xr netintro 4 , -.Xr hostname.if 5 , -.Xr ifconfig 8 , -.Xr netstart 8 -.Sh HISTORY -The -.Nm -driver first appeared in -.Ox 5.9 . -.Sh AUTHORS -.An Claudio Jeker Aq Mt claudio@openbsd.org diff --git a/share/man/man4/tcp.4 b/share/man/man4/tcp.4 index 6fe07e310..aee8d4ce6 100644 --- a/share/man/man4/tcp.4 +++ b/share/man/man4/tcp.4 @@ -1,4 +1,4 @@ -.\" $OpenBSD: tcp.4,v 1.27 2022/08/11 14:04:08 jmc Exp $ +.\" $OpenBSD: tcp.4,v 1.28 2024/12/01 08:11:14 pascal Exp $ .\" $NetBSD: tcp.4,v 1.3 1994/11/30 16:22:35 jtc Exp $ .\" .\" Copyright (c) 1983, 1991, 1993 @@ -30,7 +30,7 @@ .\" .\" @(#)tcp.4 8.1 (Berkeley) 6/5/93 .\" -.Dd $Mdocdate: August 11 2022 $ +.Dd $Mdocdate: December 1 2024 $ .Dt TCP 4 .Os .Sh NAME @@ -159,8 +159,16 @@ Set the maximum segment size for this connection. The maximum segment size can only be lowered. .It Cd TCP_SACK_ENABLE Use selective acknowledgements for this connection. -See -.Xr options 4 . +Additional information about +segments already received can be transmitted back to the sender, +thus indicating segments that have been lost and allowing for +a swifter recovery. +Both communication endpoints need to support +.Em SACK . +The fallback behaviour is NewReno fast recovery phase, which allows +one lost segment to be recovered per round trip time. +When more than one segment has been dropped per window, the transmission can +continue without waiting for a retransmission timeout. .It Cd TCP_MD5SIG Use TCP MD5 signatures per RFC 2385. This requires diff --git a/share/man/man4/tun.4 b/share/man/man4/tun.4 index 9bae0ff4c..1c2ccdbf4 100644 --- a/share/man/man4/tun.4 +++ b/share/man/man4/tun.4 @@ -1,4 +1,4 @@ -.\" $OpenBSD: tun.4,v 1.45 2020/01/09 09:25:16 claudio Exp $ +.\" $OpenBSD: tun.4,v 1.52 2024/11/18 22:33:58 dlg Exp $ .\" .\" Copyright (c) 2003 Marcus D. Watts All rights reserved. .\" @@ -26,11 +26,12 @@ .\" TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE .\" USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: January 9 2020 $ +.Dd $Mdocdate: November 18 2024 $ .Dt TUN 4 .Os .Sh NAME -.Nm tun +.Nm tun , +.Nm tap .Nd network tunnel pseudo-device .Sh SYNOPSIS .Cd "pseudo-device tun" @@ -39,39 +40,45 @@ .In net/if_tun.h .Sh DESCRIPTION The -.Nm -driver provides a network interface pseudo-device. -Packets sent to this interface can be read by a userland process -and processed as desired. -Packets written by the userland process are injected back into -the kernel networking subsystem. +.Nm tun +pseudo-device driver provides character special devices for +communicating with the kernel network stack via the +.Nm tun +and +.Nm tap +network interfaces. +Packets sent to these interfaces can be read from the device special +file by a userland process and processed as desired. +Packets written to the device special file by the userland process +are injected back into the kernel networking subsystem. .Pp -A -.Nm -interface can be created at runtime using the -.Ic ifconfig tun Ns Ar N Ic create -command or by opening the character special device -.Pa /dev/tunN . -By default -.Nm -operates as a point-to-point interface. +.Nm tun +and +.Nm tap +interfaces can be created at runtime using the +.Ic ifconfig iface Ns Ar N Ic create +command, or by opening the character special devices +.Pa /dev/tunN +or +.Pa /dev/tapN +respectively. +.Pp +The minor number of the device special files are associated with +the unit number of the network interfaces. .Pp Each device has an exclusive open property: it cannot be opened if it is already open and in use by another process. +On the last close of the device all queued packets are discarded. +If the device was created by opening a device special file +it will be automatically destroyed. +The last close of a device special file associated with an interface +created via +.Xr ifconfig 8 +will be marked as not running and traffic sent out the will be dropped. +.Pp Each read returns at most one packet; if insufficient buffer space is provided, the packet is truncated. Each write supplies exactly one packet. -Each packet read or written is prefixed with a tunnel header consisting of -a 4-byte network byte order integer containing the address family. -On the last close of the device, all queued packets are discarded. -If the device was created by opening -.Pa /dev/tunN , -it will be automatically destroyed. -Devices created via -.Xr ifconfig 8 -are only marked as not running and traffic will be dropped returning -.Er EHOSTDOWN . -.Pp Writes never block. If the protocol queue is full, the packet is dropped, a .Dq collision @@ -79,9 +86,9 @@ is counted, and .Er ENOBUFS is returned. .Pp -In addition to the usual network interface ioctl commands described in -.Xr netintro 4 , -the following special commands defined in +The following +.Xr ioctl 2 +special commands defined in .In net/if_tun.h are supported: .Pp @@ -100,31 +107,52 @@ struct tuninfo { .Ed .Pp .Va flags -sets the interface flags, and -can include one or more of -.Dv IFF_UP , -.Dv IFF_POINTOPOINT , -.Dv IFF_MULTICAST , -.Dv IFF_BROADCAST . -Flags given will be set; flags omitted will be cleared; flags not in this list -will not be changed even when given. -Flags default to -.Dv IFF_POINTOPOINT . -It is an error to set both -.Dv IFF_POINTOPOINT and -.Dv IFF_BROADCAST . -.\" should say what type affects... .Va type -defaults to -.Dv IFT_TUNNEL . -This sets the interface media address header type. +are set by the kernel when an interface is created, +and must be set to the same values that the kernel provided. .Pp .It Dv TUNSIFMODE Fa int * -Set just the interface flags. -The same restrictions as for -.Dv TUNSIFINFO -apply. +Provided for backwards compatibility. +The flags set must match what the kernel initialised them to. +.Pp +.It Dv TUNSCAP Fa struct tun_capabilities * +Enable the prepending of network packets with a +.Vt struct tun_hdr +offload header, +and set which interface offload capabilities userland can +handle on behalf of the kernel. +.Bd -literal +struct tun_capabilities { + uint32_t tun_if_capabilities; +}; +.Ed +.Pp +The +.Fa tun_if_capabilities +field is set with IFCAP values from +.In net/if.h . +It is acceptable to enable the offload header without enabling any +interface offload capabilities. +.Pp +The prepending of network packets with a +.Vt struct tun_hdr +offload header is disabled, +and the interface offload capabilities are reset when the device +special file is closed. +.Pp +.It Dv TUNGCAP Fa struct tun_capabilities * +Get which interface offload capabilities are currently enabled. +If the interface has not been configured with +.Dv TUNSCAP +this command will fail with +.Er ENODEV . +.Pp +.It Dv TUNDCAP +Disable the prepending of network packets with the +.Vt struct tun_hdr +offload header, +and clear interface offload capabilities. .El .Pp The generic ioctls @@ -133,11 +161,107 @@ The generic ioctls .Dv FIOASYNC , .Dv FIOSETOWN , .Dv FIOGETOWN -are supported by -.Nm . +are also supported. +.Ss Point-to-Point Layer 3 tunnel interface (tun) +Each packet read from or written to a +.Nm tun +interface is prefixed with a tunnel header consisting of +a 4-byte network byte order integer containing the address family of +the packet. +.Nm tun +supports +.Dv AF_INET , +.Dv AF_INET6 , +and +.Dv AF_MPLS +packets. +.Ss Ethernet tunnel interface (tap) +Each packet read from or written to a +.Nm tap +interface is an Ethernet packet. +The Ethernet CRC at the end of the frame is not required. +.Pp +The device special files for +.Nm tap +interfaces support the following additional +.Xr ioctl 2 +commands: +.Pp +.Bl -tag -width indent -compact +.It Dv SIOCGIFADDR Fa uint8_t Ns [ETHER_ADDR_LEN] +.It Dv SIOCSIFADDR Fa uint8_t Ns [ETHER_ADDR_LEN] +Get or set the link layer address (MAC address) of the interface. +.El +.Ss Network offload support +When network offload support has been enabled with the +.Dv TUNSCAP +.Xr ioctl 2 +command, +.Va struct tun_hdr +is prepended to packets read from and written to the device special +file. +.Pp +The kernel will populate the offload header for reads from the +device special file depending on which interface offload capabilities +are enabled. +A program may use any offload feature when writing to the device +special file regardless of which interface offload capabilities are +enabled. +The offload header can be read from one device special file and +written directly to another without interpretation or modification. +.Bd -literal +struct tun_hdr { + uint16_t th_flags; + uint16_t th_pad; + uint16_t th_vtag; + uint16_t th_mss; +}; +.Ed +.Pp +The fields in the +.Va struct tun_hdr +are in host native byte order. +.Pp +The following flags can be set in +.Fa th_flags +to specify which offloads are requested for the current packet: +.Pp +.Bl -tag -width "TUN_H_ICMP_CSUM" -compact +.It Dv TUN_H_VTAG +.Fa th_vtag +is set. +.It Dv TUN_H_TCP_MSS +TCP segmentation offload is requested for the current packet. +The maximum segment size is specified in +.Fa th_mss . +.It Dv TUN_H_IPV4_CSUM +IPv4 header checksum calculation requested. +.It Dv TUN_H_TCP_CSUM +TCP checksum calculation requested. +.It Dv TUN_H_UDP_CSUM +UDP checksum calculation requested. +.It Dv TUN_H_ICMP_CSUM +ICMP checksum calculation requested. +.El +.Pp +Only one of +.Dv TUN_H_TCP_CSUM , +.Dv TUN_H_UDP_CSUM , +and +.Dv TUN_H_ICMP_CSUM +can be specified at a time. +.Dv TUN_H_VTAG +can only be used with +.Nm tap +interfaces. +.Pp +.Fa th_pad +should be set to 0 when writing to the device special file, and +ignored when reading from the device special file. .Sh FILES .Bl -tag -width /dev/tun* -compact .It Pa /dev/tun* +.It Pa /dev/tap* .El .Sh ERRORS If open fails, @@ -146,6 +270,7 @@ may be set to one of: .Bl -tag -width Er .It Bq Er ENXIO Not that many devices configured. +.\" The associated interface existed, but is being destroyed. .It Bq Er EBUSY Device was already open. .El @@ -159,27 +284,17 @@ is set to one of: .It Bq Er EMSGSIZE The packet supplied was too small or too large. The maximum sized packet allowed is currently 16384 bytes. -.It Bq Er ENOBUFS -There were no mbufs, or -the queue for the outgoing protocol is full. -.It Bq Er EAFNOSUPPORT -The address family specified in the tunnel header was not -recognized. +.It Bq Er ENOMEM +There were no mbufs. +.\" .It Bq Er ENOBUFS +.\" The queue for the outgoing protocol is full. .El .Pp -Ioctl commands may fail with: +.Xr ioctl 2 +commands may fail with: .Bl -tag -width Er .It Bq Er EINVAL -Attempt to set both -.Dv IFF_POINTOPOINT -and -.Dv IFF_BROADCAST -with -.Dv TUNSIFMODE -or using -.Dv SIOCGIFADDR -or -.Dv SIOCSIFADDR . +Invalid parameters were specified. .It Bq Er ENOTTY Unrecognized ioctl command. .El @@ -188,25 +303,11 @@ A .Xr read 2 call may fail because of: .Bl -tag -width Er -.It Bq Er EHOSTDOWN -The device is not ready. -The device must have an -.Xr inet 4 -interface address assigned to it, such as via -.Dv SIOCSIFADDR . +.It Bq Er EIO +The associated interface has been destroyed. .It Bq Er EWOULDBLOCK Non-blocking I/O was selected and no packets were available. .El -.Pp -An attempt to send a packet out via the interface may fail with: -.Bl -tag -width Er -.It Bq Er EHOSTDOWN -The device is not ready. -The device must have an -.Xr inet 4 -interface address assigned to it, such as via -.Dv SIOCSIFADDR . -.El .Sh SEE ALSO .Xr ioctl 2 , .Xr inet 4 , @@ -215,3 +316,22 @@ interface address assigned to it, such as via .Xr hostname.if 5 , .Xr ifconfig 8 , .Xr netstart 8 +.Sh HISTORY +.Nm tun +interfaces originally supported both Layer 3 and Ethernet packets +by reconfiguring the type of interface with +.Dv TUNSIFINFO . +Ethernet packet support was split into the separate +.Nm tap +interface in +.Ox 5.9 . +.Sh AUTHORS +.Nm tun +was written by +.An Julian Onions Aq Mt Julian.Onions@nexor.co.uk +at Nottingham University. +.Pp +The +.Nm tap +interface functionality was written by +.An Claudio Jeker Aq Mt claudio@openbsd.org . diff --git a/share/man/man4/uk.4 b/share/man/man4/uk.4 index 6c02f543b..0cb01316f 100644 --- a/share/man/man4/uk.4 +++ b/share/man/man4/uk.4 @@ -1,4 +1,4 @@ -.\" $OpenBSD: uk.4,v 1.18 2014/01/21 03:15:46 schwarze Exp $ +.\" $OpenBSD: uk.4,v 1.19 2024/12/21 01:00:31 jsg Exp $ .\" $NetBSD: uk.4,v 1.3 1996/10/20 23:15:26 explorer Exp $ .\" .\" Copyright (c) 1996 @@ -26,7 +26,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: January 21 2014 $ +.Dd $Mdocdate: December 21 2024 $ .Dt UK 4 .Os .Sh NAME @@ -72,4 +72,5 @@ devices. .Sh HISTORY The .Nm -driver appeared in 386BSD 0.1 +driver appeared in +.Nx 1.0 . diff --git a/share/man/man4/upd.4 b/share/man/man4/upd.4 index 9190f62b7..2384e8524 100644 --- a/share/man/man4/upd.4 +++ b/share/man/man4/upd.4 @@ -1,4 +1,4 @@ -.\" $OpenBSD: upd.4,v 1.5 2020/05/12 13:03:52 schwarze Exp $ +.\" $OpenBSD: upd.4,v 1.6 2024/12/01 09:05:05 landry Exp $ .\" .\" Copyright (c) 2014 Andre de Oliveira .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: May 12 2020 $ +.Dd $Mdocdate: December 1 2024 $ .Dt UPD 4 .Os .Sh NAME @@ -41,6 +41,8 @@ ShutdownImminent .It ACPresent .It +PercentLoad +.It Overload .It RelativeStateOfCharge diff --git a/share/man/man4/uvideo.4 b/share/man/man4/uvideo.4 index d58275413..15dbd38cb 100644 --- a/share/man/man4/uvideo.4 +++ b/share/man/man4/uvideo.4 @@ -1,4 +1,4 @@ -.\" $OpenBSD: uvideo.4,v 1.43 2022/01/05 17:39:25 jmc Exp $ +.\" $OpenBSD: uvideo.4,v 1.44 2024/11/30 20:15:03 kirill Exp $ .\" .\" Copyright (c) 2008 Ian Darwin. All rights reserved. .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: January 5 2022 $ +.Dd $Mdocdate: November 30 2024 $ .Dt UVIDEO 4 .Os .Sh NAME @@ -43,6 +43,8 @@ Dynex 1.3MP Webcam .It eMPIA Technology 2761 (ASUS EeePC 701 Notebooks) .It +Jabra PanaCast 20 +.It Lenovo EasyCamera (Lenovo IdeaPad s10e Notebooks) .It Logitech QuickCam for Notebooks Pro diff --git a/share/man/man5/python-module.5 b/share/man/man5/python-module.5 index f5cac2813..505d3e492 100644 --- a/share/man/man5/python-module.5 +++ b/share/man/man5/python-module.5 @@ -1,4 +1,4 @@ -.\" $OpenBSD: python-module.5,v 1.13 2024/07/25 15:36:56 sthen Exp $ +.\" $OpenBSD: python-module.5,v 1.14 2024/10/28 19:48:37 kirill Exp $ .\" .\" Copyright (c) 2008 Marc Espie .\" @@ -24,7 +24,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: July 25 2024 $ +.Dd $Mdocdate: October 28 2024 $ .Dt PYTHON-MODULE 5 .Os .Sh NAME @@ -57,6 +57,7 @@ The module then sets .Ev MODPY_SITEPKG , .Ev MODPY_SETUP , .Ev MODPY_TEST_DIR , +.Ev MODPY_TEST_LINK_SO , .Ev MODPY_TEST_LOCALE , .Ev MODPY_WANTLIB , .Ev MODPY_LIB_DEPENDS , @@ -101,6 +102,10 @@ and changes to the directory specified in by default ${WRKSRC} .Pc before running tests. +In addition, it can link all .so files in ${WRKSRC} if +.Ev MODPY_TEST_LINK_SO +is set to Yes, which is required if you are using tests +which use Python code that loads .so files via relative imports. .Pp Most modern Python software can be packaged using a PEP 517 build frontend (in the diff --git a/share/man/man5/ruby-module.5 b/share/man/man5/ruby-module.5 index 56174f00d..0e74622f2 100644 --- a/share/man/man5/ruby-module.5 +++ b/share/man/man5/ruby-module.5 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ruby-module.5,v 1.47 2024/06/20 22:43:16 jeremy Exp $ +.\" $OpenBSD: ruby-module.5,v 1.48 2024/11/21 06:12:23 jeremy Exp $ .\" .\" Copyright (c) 2011-2015, 2023 Jeremy Evans .\" Copyright (c) 2008, 2011 Marc Espie @@ -25,7 +25,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: June 20 2024 $ +.Dd $Mdocdate: November 21 2024 $ .Dt RUBY-MODULE 5 .Os .Sh NAME @@ -66,7 +66,7 @@ those via .Ev CONFIGURE_STYLE Ns = Ns Qq ruby gem and .Ev CONFIGURE_STYLE Ns = Ns Qq ruby gem ext -both add ruby31, ruby32, and ruby33 +both add ruby32 and ruby33 .Ev FLAVOR Ns s to the port. They also cause the @@ -82,7 +82,7 @@ To specify a version for a gem port, use a specific such as ruby32 to use Ruby 3.2. To specify the Ruby version to use for a non Ruby-gem port, set .Ev MODRUBY_REV -to 3.1, 3.2, or 3.3. +to 3.2 or 3.3. .Pp To ensure that dependencies use the same Ruby implementation as the current port, all Ruby gem dependencies specified in the port diff --git a/share/man/man7/ascii.7 b/share/man/man7/ascii.7 index eea7d45b2..a908337d8 100644 --- a/share/man/man7/ascii.7 +++ b/share/man/man7/ascii.7 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ascii.7,v 1.10 2019/09/21 06:04:22 schwarze Exp $ +.\" $OpenBSD: ascii.7,v 1.12 2024/12/21 03:34:31 jsg Exp $ .\" $NetBSD: ascii.7,v 1.3 1994/11/30 19:07:06 jtc Exp $ .\" .\" Copyright (c) 1989, 1990, 1993 @@ -30,7 +30,7 @@ .\" .\" @(#)ascii.7 8.1 (Berkeley) 6/5/93 .\" -.Dd $Mdocdate: September 21 2019 $ +.Dd $Mdocdate: December 21 2024 $ .Dt ASCII 7 .Os .Sh NAME @@ -63,22 +63,22 @@ The .Nm hexadecimal set: .Bd -literal -offset left -00 nul 01 soh 02 stx 03 etx 04 eot 05 enq 06 ack 07 bel -08 bs 09 ht 0a lf 0b vt 0c ff 0d cr 0e so 0f si -10 dle 11 dc1 12 dc2 13 dc3 14 dc4 15 nak 16 syn 17 etb -18 can 19 em 1a sub 1b esc 1c fs 1d gs 1e rs 1f us -20 sp 21 ! 22 " 23 # 24 $ 25 % 26 & 27 ' -28 ( 29 ) 2a * 2b + 2c , 2d - 2e . 2f / -30 0 31 1 32 2 33 3 34 4 35 5 36 6 37 7 -38 8 39 9 3a : 3b ; 3c < 3d = 3e > 3f ? -40 @ 41 A 42 B 43 C 44 D 45 E 46 F 47 G -48 H 49 I 4a J 4b K 4c L 4d M 4e N 4f O -50 P 51 Q 52 R 53 S 54 T 55 U 56 V 57 W -58 X 59 Y 5a Z 5b [ 5c \e\ 5d ] 5e ^ 5f _ -60 \` 61 a 62 b 63 c 64 d 65 e 66 f 67 g -68 h 69 i 6a j 6b k 6c l 6d m 6e n 6f o -70 p 71 q 72 r 73 s 74 t 75 u 76 v 77 w -78 x 79 y 7a z 7b { 7c | 7d } 7e ~ 7f del + 00 nul 01 soh 02 stx 03 etx 04 eot 05 enq 06 ack 07 bel + 08 bs 09 ht 0a lf 0b vt 0c ff 0d cr 0e so 0f si + 10 dle 11 dc1 12 dc2 13 dc3 14 dc4 15 nak 16 syn 17 etb + 18 can 19 em 1a sub 1b esc 1c fs 1d gs 1e rs 1f us + 20 sp 21 ! 22 " 23 # 24 $ 25 % 26 & 27 ' + 28 ( 29 ) 2a * 2b + 2c , 2d - 2e . 2f / + 30 0 31 1 32 2 33 3 34 4 35 5 36 6 37 7 + 38 8 39 9 3a : 3b ; 3c < 3d = 3e > 3f ? + 40 @ 41 A 42 B 43 C 44 D 45 E 46 F 47 G + 48 H 49 I 4a J 4b K 4c L 4d M 4e N 4f O + 50 P 51 Q 52 R 53 S 54 T 55 U 56 V 57 W + 58 X 59 Y 5a Z 5b [ 5c \e\ 5d ] 5e ^ 5f _ + 60 \` 61 a 62 b 63 c 64 d 65 e 66 f 67 g + 68 h 69 i 6a j 6b k 6c l 6d m 6e n 6f o + 70 p 71 q 72 r 73 s 74 t 75 u 76 v 77 w + 78 x 79 y 7a z 7b { 7c | 7d } 7e ~ 7f del .Ed .Pp The @@ -113,4 +113,4 @@ set: An .Nm manual page appeared in -.At v2 . +.At v1 . diff --git a/share/man/man7/mdoc.7 b/share/man/man7/mdoc.7 index bccd67d60..5e773305f 100644 --- a/share/man/man7/mdoc.7 +++ b/share/man/man7/mdoc.7 @@ -1,4 +1,4 @@ -.\" $OpenBSD: mdoc.7,v 1.186 2024/09/22 10:32:28 schwarze Exp $ +.\" $OpenBSD: mdoc.7,v 1.187 2025/01/02 13:52:17 schwarze Exp $ .\" .\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons .\" Copyright (c) 2010, 2011, 2013-2020 Ingo Schwarze @@ -15,7 +15,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: September 22 2024 $ +.Dd $Mdocdate: January 2 2025 $ .Dt MDOC 7 .Os .Sh NAME @@ -2411,12 +2411,17 @@ The original C standard. .It \-isoC-99 .St -isoC-99 .br -The second major version of the C language standard. +Edition 2 of the C language standard. .Pp .It \-isoC-2011 .St -isoC-2011 .br -The third major version of the C language standard. +Edition 3 of the C language standard. +.Pp +.It \-isoC-2023 +.St -isoC-2023 +.br +Edition 5 of the C language standard. .El .It POSIX.1 before XPG4.2 .Pp diff --git a/share/man/man8/security.8 b/share/man/man8/security.8 index e616b7407..d73f9c58c 100644 --- a/share/man/man8/security.8 +++ b/share/man/man8/security.8 @@ -1,8 +1,8 @@ -.\" $OpenBSD: security.8,v 1.26 2017/07/13 19:16:33 jmc Exp $ +.\" $OpenBSD: security.8,v 1.27 2024/12/24 17:08:50 krw Exp $ .\" .\" David Leonard, 2001. Public Domain. .\" -.Dd $Mdocdate: July 13 2017 $ +.Dd $Mdocdate: December 24 2024 $ .Dt SECURITY 8 .Os .Sh NAME @@ -96,7 +96,7 @@ See .Xr changelist 5 for further details. .It -Check for changes to the disklabels of mounted disks. +Check for changes to the disklabels and partition tables of mounted disks. .It Report on the installation or removal of any system .Xr package 5 . diff --git a/share/man/man9/file.9 b/share/man/man9/file.9 index e3bd8cc64..22c7466cb 100644 --- a/share/man/man9/file.9 +++ b/share/man/man9/file.9 @@ -1,4 +1,4 @@ -.\" $OpenBSD: file.9,v 1.22 2020/01/03 05:37:00 visa Exp $ +.\" $OpenBSD: file.9,v 1.23 2024/11/09 15:54:14 matthieu Exp $ .\" .\" Copyright (c) 2002 Artur Grabowski .\" All rights reserved. @@ -22,7 +22,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: January 3 2020 $ +.Dd $Mdocdate: November 9 2024 $ .Dt FALLOC 9 .Os .Sh NAME @@ -40,7 +40,7 @@ .In sys/file.h .In sys/filedesc.h .Ft int -.Fn falloc "struct proc *p" "int flags" "struct file **resultfp" "int *resultfd" +.Fn falloc "struct proc *p" "struct file **resultfp" "int *resultfd" .Ft int .Fn fdrelease "struct proc *p" "int fd" .Ft void @@ -74,11 +74,6 @@ and various special purpose communication endpoints. .Pp A new file and a file descriptor for it are allocated with the function .Fn falloc . -The -.Fa flags -argument can be used to set the -.Dv UF_EXCLOSE -flag on the new descriptor. The larval file and fd are returned via .Fa resultfp and diff --git a/share/man/man9/mbuf.9 b/share/man/man9/mbuf.9 index ded14b87d..73ef80645 100644 --- a/share/man/man9/mbuf.9 +++ b/share/man/man9/mbuf.9 @@ -1,4 +1,4 @@ -.\" $OpenBSD: mbuf.9,v 1.126 2024/07/09 18:56:54 jan Exp $ +.\" $OpenBSD: mbuf.9,v 1.127 2024/11/05 13:15:13 jsg Exp $ .\" .\" Copyright (c) 2001 Jean-Jacques Bernard-Gundol .\" All rights reserved. @@ -25,7 +25,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: July 9 2024 $ +.Dd $Mdocdate: November 5 2024 $ .Dt MGET 9 .Os .Sh NAME @@ -145,12 +145,10 @@ #define MAXMCLBYTES (64 * 1024) #define MINCLSIZE (MHLEN + MLEN + 1) -#define M_MAXCOMPRESS (MHLEN / 2) #define MCLSHIFT 11 #define MCLBYTES (1 << MCLSHIFT) -#define MCLOFSET (MCLBYTES - 1) #define mtod(m,t) ((t)((m)->m_data)) diff --git a/share/man/man9/pci_conf_read.9 b/share/man/man9/pci_conf_read.9 index 69afbf74e..7c144508c 100644 --- a/share/man/man9/pci_conf_read.9 +++ b/share/man/man9/pci_conf_read.9 @@ -1,4 +1,4 @@ -.\" $OpenBSD: pci_conf_read.9,v 1.13 2021/05/01 16:11:10 visa Exp $ +.\" $OpenBSD: pci_conf_read.9,v 1.14 2024/11/13 10:56:18 jsg Exp $ .\" .\" Copyright (c) 2005 Michael Shalayeff .\" All rights reserved. @@ -15,7 +15,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: May 1 2021 $ +.Dd $Mdocdate: November 13 2024 $ .Dt PCI_CONF_READ 9 .Os .Sh NAME @@ -27,7 +27,6 @@ .Sh SYNOPSIS .In alpha/pci/pci_machdep.h .In i386/pci/pci_machdep.h -.In powerpc/pci/pci_machdep.h .In machine/pci_machdep.h .Ft pcitag_t .Fn pci_make_tag "pci_chipset_tag_t pc" "int bus" "int dev" "int func" diff --git a/share/man/man9/pci_intr_map.9 b/share/man/man9/pci_intr_map.9 index 607ba8f86..c8997f7d7 100644 --- a/share/man/man9/pci_intr_map.9 +++ b/share/man/man9/pci_intr_map.9 @@ -1,4 +1,4 @@ -.\" $OpenBSD: pci_intr_map.9,v 1.18 2021/05/01 16:11:10 visa Exp $ +.\" $OpenBSD: pci_intr_map.9,v 1.19 2024/11/13 10:56:18 jsg Exp $ .\" .\" Copyright (c) 2005 Michael Shalayeff .\" All rights reserved. @@ -15,7 +15,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: May 1 2021 $ +.Dd $Mdocdate: November 13 2024 $ .Dt PCI_INTR_MAP 9 .Os .Sh NAME @@ -31,7 +31,6 @@ .Sh SYNOPSIS .In alpha/pci/pci_machdep.h .In i386/pci/pci_machdep.h -.In powerpc/pci/pci_machdep.h .In machine/pci_machdep.h .Ft int .Fn pci_intr_map "struct pci_attach_args *paa" "pci_intr_handle_t *ih" diff --git a/share/man/man9/tfind.9 b/share/man/man9/tfind.9 index b4e69ff54..5c157d350 100644 --- a/share/man/man9/tfind.9 +++ b/share/man/man9/tfind.9 @@ -1,4 +1,4 @@ -.\" $OpenBSD: tfind.9,v 1.1 2017/01/24 00:58:55 mpi Exp $ +.\" $OpenBSD: tfind.9,v 1.2 2024/12/24 07:10:18 tb Exp $ .\" .\" Copyright (c) 1999 Marc Espie .\" All rights reserved. @@ -23,7 +23,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: January 24 2017 $ +.Dd $Mdocdate: December 24 2024 $ .Dt TFIND 9 .Os .Sh NAME @@ -47,7 +47,7 @@ The .Fn prfind , and .Fn pgfind -functions retrieve thread, process and progress group structures from thread, +functions retrieve thread, process and process group structures from thread, process and process group IDs, respectively. .Pp These functions return diff --git a/share/misc/airport b/share/misc/airport index 030c75c0a..e90f5c58f 100644 --- a/share/misc/airport +++ b/share/misc/airport @@ -1,4 +1,4 @@ -# $OpenBSD: airport,v 1.96 2024/07/29 12:32:02 patrick Exp $ +# $OpenBSD: airport,v 1.99 2024/11/07 08:43:18 sthen Exp $ # @(#)airport 8.1 (Berkeley) 6/8/93 # # Some of this information from the Airport Search Engine at @@ -338,6 +338,7 @@ CJS:International Abraham Gonzalez, Ciudad Juarez, Chihuahua, Mexico CJU:Jeju International, South Korea CKB:North Central West Virginia, Bridgeport, West Virginia, USA CKC:Cherkasy International, Cherkasy, Ukraine +CKG:Chongqing International, China CKS:International / Brasilia Brazil, Carajas, Para, Brazil CKY:Conakry, Conakry, Guinea CLD:Carlsbad/Palomar, California, USA @@ -474,6 +475,7 @@ DUR:King Shaka International, Durban, South Africa DUS:Duesseldorf, Germany DUT:Dutch Harbor, Alaska, USA DVO:Mati, Davao, Philippines +DYG:Zhangjiajie Hehua International, China DXB:Dubai, UAE EAP:Euro Basel Mulhouse Freiburg, Switzerland/France/Germany EAR:Kearney Municipal, Nebraska, USA @@ -600,6 +602,7 @@ GGG:Gregg County, Longview/Gladewater/Kilgore, Texas, USA GGT:Exuma International, George Town, Bahamas GGW:Glasgow, Montana, USA GHB:Governors Harbour, Bahamas +GHV:Brasov-Ghimbav International, Romania GIB:Gibraltar GIG:Rio De Janeiro, Brazil GJT:Walker Field, Grand Junction, Colorado, USA @@ -1001,12 +1004,14 @@ LNV:Londolovit, Papua New Guinea LNY:Lanai City, Hawaii, USA LNZ:Linz, Austria LON:All Airports around London, United Kingdom +LOP:Lombok International, Indonesia LOS:Murtala Muhammed, Lagos, Nigeria LOV:Monclova, Coahuila, Mexico LPA:Aeropuerto De Gran Canaria, Canary Islands, Spain LPB:El Alto, La Paz, Bolivia LPI:Linkoping City Airport, Linkoping, Sweden LPL:John Lennon, Liverpool, England, United Kingdom +LPQ:Luang Prabang, Laos LRA:Larisa, Greece LRD:Laredo, Texas, USA LRE:Longreach, Queensland, Australia @@ -1216,7 +1221,7 @@ NNG:Nanning, China NOC:Rep Of Ireland, Connaught, Ireland NOU:Tontouta, Noumea, New Caledonia NPL:New Plymouth, New Zealand -NQY:Newquay Civil, England, United Kingdom +NQY:Newquay, England, United Kingdom NRK:Norrkoping, Sweden NRT:Narita, Tokyo, Japan NRW:All Airports around Nordrhein-Westfalen, Germany @@ -1296,6 +1301,7 @@ PAS:Paros, Greece PAT:Patna, India PAZ:Poza Rica, Veracruz, Mexico PBC:Puebla, Mexico +PBH:Paro, Bhutan PBI:Palm Beach International, Florida, USA PBM:Zanderij International, Paramaribo, Suriname PBO:Paraburdoo, Western Australia, Australia @@ -1456,6 +1462,7 @@ RKD:Rockland, Maine, USA RKS:Rock Springs Sweetwater County, Wyoming, USA RKV:Reykjavik, Iceland RMA:Roma, Queensland, Australia +RMF:Marsa Alam International, Egypt RNB:Kallinge, Ronneby, Sweden RNN:Arnager, Bornholm, Denmark RNO:Reno/Tahoe International, Nevada, USA @@ -1656,6 +1663,7 @@ TAC:Dz Romualdez, Tacloban, Philippines TAE:Daegu International, South Korea TAG:Tagbilaran, Philippines TAM:Tampico, Tamaulipas, Mexico +TAO:Qingdao International, China TAP:Tapachula International, Chiapas, Mexico TAS:Tashkent, Uzbekistan TAT:Tatry/Poprad, Slovakia @@ -1715,6 +1723,7 @@ TPP:Tarapoto, Peru TPQ:Tepic, Nayarit, Mexico TPS:Birgi, Trapani, Sicily, Italy TRC:Torreon, Coahuila, Mexico +TRD:Trondheim Airport Vaernes, Trondheim, Norway TRE:Tiree Island, Scotland, United Kingdom TRF:Torp, Sandefjord, Norway TRG:Tauranga, New Zealand @@ -1744,6 +1753,7 @@ TUS:Tucson International, Arizona, USA TVC:Cherry Capital, Traverse City, Michigan, USA TVF:Thief River Falls Municipal, Minnesota, USA TVL:Lake Tahoe, South Lake Tahoe, California, USA +TVU:Matei, Taveuni, Fiji TWB:Toowoomba, Queensland, Australia TWF:Twin Falls, Idaho, USA TXK:Texarkana Municipal, Arkansas, USA diff --git a/share/mk/bsd.regress.mk b/share/mk/bsd.regress.mk index 3aab0cb70..1b75eb9b3 100644 --- a/share/mk/bsd.regress.mk +++ b/share/mk/bsd.regress.mk @@ -1,9 +1,12 @@ -# $OpenBSD: bsd.regress.mk,v 1.27 2023/09/24 08:28:20 tb Exp $ +# $OpenBSD: bsd.regress.mk,v 1.28 2024/11/26 06:12:44 tb Exp $ # Documented in bsd.regress.mk(5) # No man pages for regression tests. NOMAN= +# Include debug information in binaries +CFLAGS+= -g + # No installation. install: diff --git a/sys/arch/amd64/amd64/conf.c b/sys/arch/amd64/amd64/conf.c index 20aea88e6..32e364e1b 100644 --- a/sys/arch/amd64/amd64/conf.c +++ b/sys/arch/amd64/amd64/conf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: conf.c,v 1.82 2024/09/04 07:45:08 jsg Exp $ */ +/* $OpenBSD: conf.c,v 1.83 2024/11/27 10:33:31 jsg Exp $ */ /* * Copyright (c) 1994, 1995 Charles M. Hannum. All rights reserved. @@ -120,10 +120,6 @@ cdev_decl(fd); cdev_decl(lpt); #include "ch.h" #include "bpfilter.h" -#if 0 -#include "pcmcia.h" -cdev_decl(pcmcia); -#endif #include "spkr.h" cdev_decl(spkr); #include "cy.h" @@ -203,11 +199,7 @@ struct cdevsw cdevsw[] = cdev_fd_init(1,filedesc), /* 22: file descriptor pseudo-device */ cdev_bpf_init(NBPFILTER,bpf), /* 23: Berkeley packet filter */ cdev_notdef(), /* 24 */ -#if 0 - cdev_ocis_init(NPCMCIA,pcmcia), /* 25: PCMCIA Bus */ -#else cdev_notdef(), /* 25 */ -#endif cdev_notdef(), /* 26 */ cdev_spkr_init(NSPKR,spkr), /* 27: PC speaker */ cdev_notdef(), /* 28 was LKM */ diff --git a/sys/arch/amd64/amd64/cpu.c b/sys/arch/amd64/amd64/cpu.c index e79412127..d0019b3eb 100644 --- a/sys/arch/amd64/amd64/cpu.c +++ b/sys/arch/amd64/amd64/cpu.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cpu.c,v 1.194 2024/10/06 16:24:02 semarie Exp $ */ +/* $OpenBSD: cpu.c,v 1.195 2024/11/07 17:24:42 bluhm Exp $ */ /* $NetBSD: cpu.c,v 1.1 2003/04/26 18:39:26 fvdl Exp $ */ /*- @@ -1472,7 +1472,48 @@ wbinvd_on_all_cpus(void) wbinvd(); return 0; } -#endif + +volatile long wbinvd_wait __attribute__((section(".kudata"))); + +void +wbinvd_on_all_cpus_acked(void) +{ + struct cpu_info *ci, *self = curcpu();; + CPU_INFO_ITERATOR cii; + long wait = 0; + u_int64_t mask = 0; + int s; + + CPU_INFO_FOREACH(cii, ci) { + if (ci == self) + continue; + mask |= (1ULL << ci->ci_cpuid); + wait++; + } + + KASSERT(wait > 0); + + s = splvm(); + while (atomic_cas_ulong(&wbinvd_wait, 0 , wait) != 0) { + while (wbinvd_wait != 0) { + CPU_BUSY_CYCLE(); + } + } + + CPU_INFO_FOREACH(cii, ci) { + if ((mask & (1ULL << ci->ci_cpuid)) == 0) + continue; + if (x86_fast_ipi(ci, LAPIC_IPI_WBINVD) != 0) + panic("%s: ipi failed", __func__); + } + splx(s); + + wbinvd(); + + while (wbinvd_wait != 0) + CPU_BUSY_CYCLE(); +} +#endif /* MULTIPROCESSOR */ int cpu_suspended; int cpu_wakeups; diff --git a/sys/arch/amd64/amd64/db_disasm.c b/sys/arch/amd64/amd64/db_disasm.c index e88fde839..f9c9dfe01 100644 --- a/sys/arch/amd64/amd64/db_disasm.c +++ b/sys/arch/amd64/amd64/db_disasm.c @@ -1,4 +1,4 @@ -/* $OpenBSD: db_disasm.c,v 1.26 2024/07/09 01:21:19 jsg Exp $ */ +/* $OpenBSD: db_disasm.c,v 1.27 2024/11/19 05:49:27 anton Exp $ */ /* $NetBSD: db_disasm.c,v 1.11 1996/05/03 19:41:58 christos Exp $ */ /* @@ -162,6 +162,17 @@ char * db_GrpC[] = { "", "", "", "" }; +struct inst db_Grp0f1e[] = { + { "", 0, NONE, 0, 0 }, + { "", 0, NONE, 0, 0 }, + { "", 0, NONE, 0, 0 }, + { "", 0, NONE, 0, 0 }, + { "", 0, NONE, 0, 0 }, + { "", 0, NONE, 0, 0 }, + { "", 0, NONE, 0, 0 }, + { "", 1, NONE, op2(MEx,2), "\0\0endbr64" }, +}; + struct inst db_inst_0f0x[] = { /*00*/ { NULL, 1, NONE, op1(Ew), db_Grp6 }, /*01*/ { "", 1, RDEP, 0, db_Grp7 }, @@ -182,6 +193,26 @@ struct inst db_inst_0f0x[] = { /*0f*/ { "", 0, NONE, 0, 0 }, }; +struct inst db_inst_0f1x[] = { +/*10*/ { "", 0, NONE, 0, 0 }, +/*11*/ { "", 0, NONE, 0, 0 }, +/*12*/ { "", 0, NONE, 0, 0 }, +/*13*/ { "", 0, NONE, 0, 0 }, +/*14*/ { "", 0, NONE, 0, 0 }, +/*15*/ { "", 0, NONE, 0, 0 }, +/*16*/ { "", 0, NONE, 0, 0 }, +/*17*/ { "", 0, NONE, 0, 0 }, + +/*18*/ { "", 0, NONE, 0, 0 }, +/*19*/ { "", 0, NONE, 0, 0 }, +/*1a*/ { "", 0, NONE, 0, 0 }, +/*1b*/ { "", 0, NONE, 0, 0 }, +/*1c*/ { "", 0, NONE, 0, 0 }, +/*1d*/ { "", 0, NONE, 0, 0 }, +/*1e*/ { "", 1, RDEP, 0, db_Grp0f1e }, +/*1f*/ { "", 0, NONE, 0, 0 }, +}; + struct inst db_inst_0f2x[] = { /*20*/ { "mov", 1, LONG, op2(CR,E), 0 }, /* use E for reg */ /*21*/ { "mov", 1, LONG, op2(DR,E), 0 }, /* since mod == 11 */ @@ -324,7 +355,7 @@ struct inst db_inst_0fcx[] = { struct inst *db_inst_0f[] = { db_inst_0f0x, - NULL, + db_inst_0f1x, db_inst_0f2x, db_inst_0f3x, NULL, @@ -1175,6 +1206,11 @@ db_disasm(vaddr_t loc, int altfmt) } while (prefix); if (segovr_grp > 1) seg = " "; + + /* prefix with escape byte, not a rep */ + if ((repe || repne) && inst == 0x0f) + repe = repne = 0; + if (repe > 0 && repne > 0) db_printf(" "); else if (repe > 0) diff --git a/sys/arch/amd64/amd64/db_trace.c b/sys/arch/amd64/amd64/db_trace.c index eed87fee1..9c2ec0fc7 100644 --- a/sys/arch/amd64/amd64/db_trace.c +++ b/sys/arch/amd64/amd64/db_trace.c @@ -1,4 +1,4 @@ -/* $OpenBSD: db_trace.c,v 1.55 2023/04/26 16:53:58 claudio Exp $ */ +/* $OpenBSD: db_trace.c,v 1.56 2024/11/07 16:02:29 miod Exp $ */ /* $NetBSD: db_trace.c,v 1.1 2003/04/26 18:39:27 fvdl Exp $ */ /* @@ -139,7 +139,7 @@ db_stack_trace_print(db_expr_t addr, int have_addr, db_expr_t count, while (count && frame != 0) { int narg; unsigned int i; - char * name; + const char * name; db_expr_t offset; Elf_Sym * sym; diff --git a/sys/arch/amd64/amd64/lapic.c b/sys/arch/amd64/amd64/lapic.c index 14c62bfd7..0f55cb42c 100644 --- a/sys/arch/amd64/amd64/lapic.c +++ b/sys/arch/amd64/amd64/lapic.c @@ -1,4 +1,4 @@ -/* $OpenBSD: lapic.c,v 1.73 2024/09/26 13:18:25 dv Exp $ */ +/* $OpenBSD: lapic.c,v 1.74 2024/11/07 17:24:42 bluhm Exp $ */ /* $NetBSD: lapic.c,v 1.2 2003/05/08 01:04:35 fvdl Exp $ */ /*- @@ -369,6 +369,8 @@ lapic_boot_init(paddr_t lapic_base) idt_vec_set(LAPIC_IPI_INVLPG, Xipi_invlpg_pcid); idt_vec_set(LAPIC_IPI_INVLRANGE, Xipi_invlrange_pcid); } + idt_allocmap[LAPIC_IPI_WBINVD] = 1; + idt_vec_set(LAPIC_IPI_WBINVD, Xipi_wbinvd); #if NVMM > 0 idt_allocmap[LAPIC_IPI_INVEPT] = 1; idt_vec_set(LAPIC_IPI_INVEPT, Xipi_invept); diff --git a/sys/arch/amd64/amd64/mem.c b/sys/arch/amd64/amd64/mem.c index c5adb4f98..417532165 100644 --- a/sys/arch/amd64/amd64/mem.c +++ b/sys/arch/amd64/amd64/mem.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mem.c,v 1.36 2024/06/23 22:08:37 kettenis Exp $ */ +/* $OpenBSD: mem.c,v 1.39 2024/12/30 02:46:00 guenther Exp $ */ /* * Copyright (c) 1988 University of Utah. * Copyright (c) 1982, 1986, 1990, 1993 @@ -51,6 +51,7 @@ #include #include #include +#include #include @@ -84,7 +85,8 @@ mmopen(dev_t dev, int flag, int mode, struct proc *p) switch (minor(dev)) { case 0: case 1: - if (securelevel <= 0 || allowkmem) + if ((int)atomic_load_int(&securelevel) <= 0 || + atomic_load_int(&allowkmem)) break; return (EPERM); case 2: @@ -239,7 +241,6 @@ int mmioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct proc *p) { switch (cmd) { - case FIONBIO: case FIOASYNC: /* handled by fd layer */ return 0; diff --git a/sys/arch/amd64/amd64/mpbios.c b/sys/arch/amd64/amd64/mpbios.c index 07df036ed..96a13535d 100644 --- a/sys/arch/amd64/amd64/mpbios.c +++ b/sys/arch/amd64/amd64/mpbios.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mpbios.c,v 1.32 2024/06/07 23:19:18 jsg Exp $ */ +/* $OpenBSD: mpbios.c,v 1.33 2024/10/22 21:50:02 jsg Exp $ */ /* $NetBSD: mpbios.c,v 1.7 2003/05/15 16:32:50 fvdl Exp $ */ /*- @@ -134,8 +134,7 @@ static const char *loc_where[] = { "bios" }; -struct mp_map -{ +struct mp_map { vaddr_t baseva; int vsize; paddr_t pa; diff --git a/sys/arch/amd64/amd64/pmap.c b/sys/arch/amd64/amd64/pmap.c index 35af9d10c..bfd667f99 100644 --- a/sys/arch/amd64/amd64/pmap.c +++ b/sys/arch/amd64/amd64/pmap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap.c,v 1.177 2024/10/02 18:18:27 dv Exp $ */ +/* $OpenBSD: pmap.c,v 1.178 2024/11/02 07:58:58 mpi Exp $ */ /* $NetBSD: pmap.c,v 1.3 2003/05/08 18:13:13 thorpej Exp $ */ /* @@ -2266,27 +2266,6 @@ pmap_unwire(struct pmap *pmap, vaddr_t va) #endif } -#if 0 -/* - * pmap_collect: free resources held by a pmap - * - * => optional function. - * => called when a process is swapped out to free memory. - */ - -void -pmap_collect(struct pmap *pmap) -{ - /* - * free all of the pt pages by removing the physical mappings - * for its entire address space. - */ - - pmap_do_remove(pmap, VM_MIN_ADDRESS, VM_MAX_ADDRESS, - PMAP_REMOVE_SKIPWIRED); -} -#endif - void pmap_enter_special(vaddr_t va, paddr_t pa, vm_prot_t prot) { diff --git a/sys/arch/amd64/amd64/process_machdep.c b/sys/arch/amd64/amd64/process_machdep.c index c67d4844b..dc0f27455 100644 --- a/sys/arch/amd64/amd64/process_machdep.c +++ b/sys/arch/amd64/amd64/process_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: process_machdep.c,v 1.17 2024/05/13 01:15:50 jsg Exp $ */ +/* $OpenBSD: process_machdep.c,v 1.18 2024/11/27 05:25:56 anton Exp $ */ /* $NetBSD: process_machdep.c,v 1.1 2003/04/26 18:39:31 fvdl Exp $ */ /*- @@ -56,6 +56,7 @@ #include #include #include +#include #include #include @@ -200,4 +201,84 @@ process_set_pc(struct proc *p, caddr_t addr) return (0); } +int +process_read_xstate_info(struct proc *p, void *addr) +{ + struct ptrace_xstate_info *info = addr; + + if (xsave_mask == 0) + return (ENOTSUP); + + info->xsave_mask = xsave_mask; + info->xsave_len = fpu_save_len; + return (0); +} + +struct xsave_area { + uint8_t legacy_region[512]; + + struct xsave_header { + uint64_t xstate_bv; + uint64_t xcomp_bv; + uint8_t rsvd0[48]; + } xsave_header; + + uint8_t extended_region[]; +} __attribute__((packed)); + +#define XSTATE_COMPONENT_X87 (1ULL << 0) +#define XSTATE_COMPONENT_SSE (1ULL << 1) +#define XSTATE_COMPONENT_AVX (1ULL << 2) + +int +process_read_xstate(struct proc *p, void *addr) +{ + struct xsave_area *area = + (struct xsave_area *)&p->p_addr->u_pcb.pcb_savefpu; + + if (xsave_mask == 0) + return (ENOTSUP); + + memcpy(addr, area, fpu_save_len); + return (0); +} + +int +process_write_xstate(struct proc *p, void *addr) +{ + struct xsave_area *area = + (struct xsave_area *)&p->p_addr->u_pcb.pcb_savefpu; + struct xsave_area *new_area = (struct xsave_area *)addr; + uint32_t offset_extended_region = offsetof(struct xsave_area, + extended_region); + uint32_t a, b, c, d; + + if (xsave_mask == 0) + return (ENOTSUP); + + /* + * Honor changes to x87, SSE and AVX components and mark them as in use. + * Required to ensure any changes are restored once the traced process + * continues execution. + */ + if ((xsave_mask & XSTATE_COMPONENT_X87) || + (xsave_mask & XSTATE_COMPONENT_SSE)) { + memcpy(area->legacy_region, new_area->legacy_region, + sizeof(area->legacy_region)); + area->xsave_header.xstate_bv |= xsave_mask & + (XSTATE_COMPONENT_X87 | XSTATE_COMPONENT_SSE); + } + if (xsave_mask & XSTATE_COMPONENT_AVX) { + CPUID_LEAF(0xd, 2, a, b, c, d); + if (offset_extended_region == b && + offset_extended_region + a <= fpu_save_len) { + memcpy(area->extended_region, + new_area->extended_region, a); + area->xsave_header.xstate_bv |= XSTATE_COMPONENT_AVX; + } + } + + return (0); +} + #endif /* PTRACE */ diff --git a/sys/arch/amd64/amd64/vector.S b/sys/arch/amd64/amd64/vector.S index 3befb31ef..97c23d00d 100644 --- a/sys/arch/amd64/amd64/vector.S +++ b/sys/arch/amd64/amd64/vector.S @@ -1,4 +1,4 @@ -/* $OpenBSD: vector.S,v 1.97 2024/09/26 13:18:25 dv Exp $ */ +/* $OpenBSD: vector.S,v 1.99 2024/11/10 03:02:43 jsg Exp $ */ /* $NetBSD: vector.S,v 1.5 2004/06/28 09:13:11 fvdl Exp $ */ /* @@ -531,9 +531,6 @@ KTEXT_PAGE_END * decide the ipending case with less overhead */ -/* XXX See comment in locore.s */ -#define XINTR(name,num) Xintr_##name##num - KUENTRY(x2apic_eoi) pushq %rax pushq %rcx @@ -775,6 +772,17 @@ IDTVEC(ipi_invlrange_pcid) iretq END(Xipi_invlrange_pcid) +IDTVEC(ipi_wbinvd) + ioapic_asm_ack() + + wbinvd + + lock + decq wbinvd_wait + + iretq +END(Xipi_wbinvd) + #endif /* MULTIPROCESSOR */ /* diff --git a/sys/arch/amd64/amd64/vm_machdep.c b/sys/arch/amd64/amd64/vm_machdep.c index 8be22524d..5fa539227 100644 --- a/sys/arch/amd64/amd64/vm_machdep.c +++ b/sys/arch/amd64/amd64/vm_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vm_machdep.c,v 1.47 2023/04/11 00:45:07 jsg Exp $ */ +/* $OpenBSD: vm_machdep.c,v 1.49 2024/10/24 17:37:03 kettenis Exp $ */ /* $NetBSD: vm_machdep.c,v 1.1 2003/04/26 18:39:33 fvdl Exp $ */ /*- @@ -135,9 +135,16 @@ cpu_exit(struct proc *p) void setguardpage(struct proc *p) { - pmap_remove(pmap_kernel(), (vaddr_t)p->p_addr + PAGE_SIZE, - (vaddr_t)p->p_addr + 2 * PAGE_SIZE); + struct vm_page *pg = NULL; + vaddr_t va = (vaddr_t)p->p_addr + PAGE_SIZE; + paddr_t pa; + + if (pmap_extract(pmap_kernel(), va, &pa)) + pg = PHYS_TO_VM_PAGE(pa); + pmap_kremove(va, PAGE_SIZE); pmap_update(pmap_kernel()); + if (pg) + uvm_pagefree(pg); } struct kmem_va_mode kv_physwait = { diff --git a/sys/arch/amd64/amd64/vmm_machdep.c b/sys/arch/amd64/amd64/vmm_machdep.c index 1f76ac4e0..e3205f48e 100644 --- a/sys/arch/amd64/amd64/vmm_machdep.c +++ b/sys/arch/amd64/amd64/vmm_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vmm_machdep.c,v 1.39 2024/10/07 20:30:17 dv Exp $ */ +/* $OpenBSD: vmm_machdep.c,v 1.41 2024/11/27 10:09:51 mpi Exp $ */ /* * Copyright (c) 2014 Mike Larkin * @@ -124,7 +124,6 @@ int svm_fault_page(struct vcpu *, paddr_t); int vmx_fault_page(struct vcpu *, paddr_t); int vmx_handle_np_fault(struct vcpu *); int svm_handle_np_fault(struct vcpu *); -pt_entry_t *vmx_pmap_find_pte_ept(pmap_t, paddr_t); int vmm_alloc_vpid(uint16_t *); void vmm_free_vpid(uint16_t); const char *vcpu_state_decode(u_int); @@ -618,67 +617,6 @@ out: return (ret); } -/* - * vmx_pmap_find_pte_ept - * - * find the page table entry specified by addr in the pmap supplied. - */ -pt_entry_t * -vmx_pmap_find_pte_ept(pmap_t pmap, paddr_t addr) -{ - int l4idx, l3idx, l2idx, l1idx; - pd_entry_t *pd; - paddr_t pdppa; - pt_entry_t *ptes, *pte; - - l4idx = (addr & L4_MASK) >> L4_SHIFT; /* PML4E idx */ - l3idx = (addr & L3_MASK) >> L3_SHIFT; /* PDPTE idx */ - l2idx = (addr & L2_MASK) >> L2_SHIFT; /* PDE idx */ - l1idx = (addr & L1_MASK) >> L1_SHIFT; /* PTE idx */ - - pd = (pd_entry_t *)pmap->pm_pdir; - if (pd == NULL) - return NULL; - - /* - * l4idx should always be 0 since we don't support more than 512GB - * guest physical memory. - */ - if (l4idx > 0) - return NULL; - - /* - * l3idx should always be < MAXDSIZ/1GB because we don't support more - * than MAXDSIZ guest phys mem. - */ - if (l3idx >= MAXDSIZ / ((paddr_t)1024 * 1024 * 1024)) - return NULL; - - pdppa = pd[l4idx] & PG_FRAME; - if (pdppa == 0) - return NULL; - - ptes = (pt_entry_t *)PMAP_DIRECT_MAP(pdppa); - - pdppa = ptes[l3idx] & PG_FRAME; - if (pdppa == 0) - return NULL; - - ptes = (pt_entry_t *)PMAP_DIRECT_MAP(pdppa); - - pdppa = ptes[l2idx] & PG_FRAME; - if (pdppa == 0) - return NULL; - - ptes = (pt_entry_t *)PMAP_DIRECT_MAP(pdppa); - - pte = &ptes[l1idx]; - if (*pte == 0) - return NULL; - - return pte; -} - /* * vmm_start * @@ -4604,9 +4542,10 @@ svm_get_guest_faulttype(struct vmcb *vmcb) int svm_fault_page(struct vcpu *vcpu, paddr_t gpa) { + paddr_t pa = trunc_page(gpa); int ret; - ret = uvm_fault(vcpu->vc_parent->vm_map, gpa, VM_FAULT_WIRE, + ret = uvm_fault_wire(vcpu->vc_parent->vm_map, pa, pa + PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC); if (ret) printf("%s: uvm_fault returns %d, GPA=0x%llx, rip=0x%llx\n", @@ -4673,12 +4612,13 @@ svm_handle_np_fault(struct vcpu *vcpu) * 0: if successful * EINVAL: if fault type could not be determined or VMCS reload fails * EAGAIN: if a protection fault occurred, ie writing to a read-only page - * errno: if uvm_fault(9) fails to wire in the page + * errno: if uvm_fault_wire() fails to wire in the page */ int vmx_fault_page(struct vcpu *vcpu, paddr_t gpa) { int fault_type, ret; + paddr_t pa = trunc_page(gpa); fault_type = vmx_get_guest_faulttype(); switch (fault_type) { @@ -4693,9 +4633,9 @@ vmx_fault_page(struct vcpu *vcpu, paddr_t gpa) break; } - /* We may sleep during uvm_fault(9), so reload VMCS. */ + /* We may sleep during uvm_fault_wire(), so reload VMCS. */ vcpu->vc_last_pcpu = curcpu(); - ret = uvm_fault(vcpu->vc_parent->vm_map, gpa, VM_FAULT_WIRE, + ret = uvm_fault_wire(vcpu->vc_parent->vm_map, pa, pa + PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC); if (vcpu_reload_vmcs_vmx(vcpu)) { printf("%s: failed to reload vmcs\n", __func__); diff --git a/sys/arch/amd64/conf/GENERIC b/sys/arch/amd64/conf/GENERIC index f06a77c20..42f72d175 100644 --- a/sys/arch/amd64/conf/GENERIC +++ b/sys/arch/amd64/conf/GENERIC @@ -1,4 +1,4 @@ -# $OpenBSD: GENERIC,v 1.526 2024/09/04 07:45:08 jsg Exp $ +# $OpenBSD: GENERIC,v 1.530 2024/11/26 21:45:35 stsp Exp $ # # For further information on compiling SecBSD kernels, see the config(8) # man page. @@ -532,6 +532,7 @@ msk* at mskc? # each port of above em* at pci? # Intel Pro/1000 ethernet ixgb* at pci? # Intel Pro/10Gb ethernet ix* at pci? # Intel 82598EB 10Gb ethernet +ixv* at pci? # Virtual Function of Intel 82599 myx* at pci? # Myricom Myri-10G 10Gb ethernet oce* at pci? # Emulex OneConnect 10Gb ethernet txp* at pci? # 3com 3CR990 @@ -563,6 +564,7 @@ jme* at pci? # JMicron JMC250/JMC260 Ethernet bnxt* at pci? # Broadcom BCM573xx, BCM574xx ixl* at pci? # Intel Ethernet 700 Series dwqe* at pci? # Intel Elkhart Lake Ethernet +ice* at pci? # Intel E810 100GbE mcx* at pci? # Mellanox ConnectX-4 iavf* at pci? # Intel Ethernet Adaptive VF aq* at pci? # Aquantia aQtion Ethernet diff --git a/sys/arch/amd64/conf/RAMDISK_CD b/sys/arch/amd64/conf/RAMDISK_CD index 9ec9d3fed..f3c6137a3 100644 --- a/sys/arch/amd64/conf/RAMDISK_CD +++ b/sys/arch/amd64/conf/RAMDISK_CD @@ -1,4 +1,4 @@ -# $OpenBSD: RAMDISK_CD,v 1.207 2024/08/14 14:40:45 patrick Exp $ +# $OpenBSD: RAMDISK_CD,v 1.209 2024/11/26 21:45:35 stsp Exp $ machine amd64 maxusers 4 @@ -238,6 +238,7 @@ msk* at mskc? # each port of above em* at pci? # Intel Pro/1000 ethernet ixgb* at pci? # Intel Pro/10Gb ethernet ix* at pci? # Intel 82598EB 10Gb ethernet +ixv* at pci? # Virtual Function of Intel 82599 myx* at pci? # Myricom Myri-10G 10Gb ethernet oce* at pci? # Emulex OneConnect 10Gb ethernet sf* at pci? # Adaptec AIC-6915 ethernet @@ -269,6 +270,7 @@ aq* at pci? # Aquantia aQtion Ethernet igc* at pci? # Intel I225 Ethernet ngbe* at pci? # WangXun WX1860 Ethernet dwqe* at pci? # Intel Elkhart Lake Ethernet +ice* at pci? # Intel E810 100GbE acx* at pci? # TI ACX100/ACX111 (802.11b/g) acx* at cardbus? # TI ACX100/ACX111 (802.11b/g) diff --git a/sys/arch/amd64/conf/files.amd64 b/sys/arch/amd64/conf/files.amd64 index 01967be09..9b3aec499 100644 --- a/sys/arch/amd64/conf/files.amd64 +++ b/sys/arch/amd64/conf/files.amd64 @@ -1,4 +1,4 @@ -# $OpenBSD: files.amd64,v 1.111 2024/09/04 07:45:08 jsg Exp $ +# $OpenBSD: files.amd64,v 1.112 2024/11/04 22:08:03 jsg Exp $ maxpartitions 16 maxusers 2 16 128 @@ -280,7 +280,6 @@ attach ipmi at mainbus major {vnd = 14} major {sd = 4} -major {st = 5} major {cd = 6} major {rd = 17} major {wd = 0} diff --git a/sys/arch/amd64/include/cpu.h b/sys/arch/amd64/include/cpu.h index 3a902a9aa..fc560c0ff 100644 --- a/sys/arch/amd64/include/cpu.h +++ b/sys/arch/amd64/include/cpu.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cpu.h,v 1.178 2024/10/07 20:30:17 dv Exp $ */ +/* $OpenBSD: cpu.h,v 1.179 2024/10/22 10:14:49 jsg Exp $ */ /* $NetBSD: cpu.h,v 1.1 2003/04/26 18:39:39 fvdl Exp $ */ /*- @@ -422,7 +422,6 @@ void dumpconf(void); void cpu_set_vendor(struct cpu_info *, int _level, const char *_vendor); void cpu_reset(void); void x86_64_proc0_tss_ldt_init(void); -void cpu_proc_fork(struct proc *, struct proc *); int amd64_pa_used(paddr_t); #define cpu_idle_enter() do { /* nothing */ } while (0) extern void (*cpu_idle_cycle_fcn)(void); diff --git a/sys/arch/amd64/include/cpufunc.h b/sys/arch/amd64/include/cpufunc.h index 5ad74913b..d71f1a452 100644 --- a/sys/arch/amd64/include/cpufunc.h +++ b/sys/arch/amd64/include/cpufunc.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cpufunc.h,v 1.41 2024/05/14 01:46:24 guenther Exp $ */ +/* $OpenBSD: cpufunc.h,v 1.43 2024/11/08 12:08:22 bluhm Exp $ */ /* $NetBSD: cpufunc.h,v 1.3 2003/05/08 10:27:43 fvdl Exp $ */ /*- @@ -286,6 +286,7 @@ wbinvd(void) #ifdef MULTIPROCESSOR int wbinvd_on_all_cpus(void); +void wbinvd_on_all_cpus_acked(void); #else static inline int wbinvd_on_all_cpus(void) @@ -293,7 +294,14 @@ wbinvd_on_all_cpus(void) wbinvd(); return 0; } -#endif + +static inline int +wbinvd_on_all_cpus_acked(void) +{ + wbinvd(); + return 0; +} +#endif /* MULTIPROCESSOR */ static __inline void clflush(u_int64_t addr) diff --git a/sys/arch/amd64/include/cpuvar.h b/sys/arch/amd64/include/cpuvar.h index 1bb3afc64..1c112ea12 100644 --- a/sys/arch/amd64/include/cpuvar.h +++ b/sys/arch/amd64/include/cpuvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cpuvar.h,v 1.12 2022/08/12 02:20:36 cheloha Exp $ */ +/* $OpenBSD: cpuvar.h,v 1.14 2024/10/22 10:14:49 jsg Exp $ */ /* $NetBSD: cpuvar.h,v 1.1 2003/03/01 18:29:28 fvdl Exp $ */ /*- @@ -84,8 +84,6 @@ struct cpu_attach_args { struct cpu_functions *cpu_func; }; -#define MP_PICMODE 0x00000001 /* System booted in picmode */ - #ifdef _KERNEL #ifdef MULTIPROCESSOR @@ -95,7 +93,6 @@ void x86_ipi_init(int); void identifycpu(struct cpu_info *); void cpu_init(struct cpu_info *); -void cpu_init_first(void); void tsc_test_sync_bp(struct cpu_info *); void tsc_test_sync_ap(struct cpu_info *); diff --git a/sys/arch/amd64/include/i82093var.h b/sys/arch/amd64/include/i82093var.h index 260d16e82..9f0e4de55 100644 --- a/sys/arch/amd64/include/i82093var.h +++ b/sys/arch/amd64/include/i82093var.h @@ -1,4 +1,4 @@ -/* $OpenBSD: i82093var.h,v 1.6 2024/05/22 05:51:49 jsg Exp $ */ +/* $OpenBSD: i82093var.h,v 1.7 2024/10/22 21:50:02 jsg Exp $ */ /* $NetBSD: i82093var.h,v 1.1 2003/02/26 21:26:10 fvdl Exp $ */ /*- @@ -37,8 +37,7 @@ #include -struct ioapic_pin -{ +struct ioapic_pin { struct ioapic_pin *ip_next; /* next pin on this vector */ struct mp_intr_map *ip_map; int ip_vector; /* IDT vector */ diff --git a/sys/arch/amd64/include/i82489var.h b/sys/arch/amd64/include/i82489var.h index 4f32f9f95..561efa3fb 100644 --- a/sys/arch/amd64/include/i82489var.h +++ b/sys/arch/amd64/include/i82489var.h @@ -1,4 +1,4 @@ -/* $OpenBSD: i82489var.h,v 1.20 2024/09/26 13:18:25 dv Exp $ */ +/* $OpenBSD: i82489var.h,v 1.21 2024/11/07 17:24:42 bluhm Exp $ */ /* $NetBSD: i82489var.h,v 1.1 2003/02/26 21:26:10 fvdl Exp $ */ /*- @@ -72,7 +72,8 @@ extern void Xresume_lapic_ipi(void); #define LAPIC_IPI_INVLTLB (LAPIC_IPI_OFFSET + 0) #define LAPIC_IPI_INVLPG (LAPIC_IPI_OFFSET + 1) #define LAPIC_IPI_INVLRANGE (LAPIC_IPI_OFFSET + 2) -#define LAPIC_IPI_INVEPT (LAPIC_IPI_OFFSET + 3) +#define LAPIC_IPI_WBINVD (LAPIC_IPI_OFFSET + 3) +#define LAPIC_IPI_INVEPT (LAPIC_IPI_OFFSET + 4) extern void Xipi_invltlb(void); extern void Xipi_invltlb_pcid(void); @@ -80,6 +81,7 @@ extern void Xipi_invlpg(void); extern void Xipi_invlpg_pcid(void); extern void Xipi_invlrange(void); extern void Xipi_invlrange_pcid(void); +extern void Xipi_wbinvd(void); #if NVMM > 0 extern void Xipi_invept(void); #endif /* NVMM > 0 */ diff --git a/sys/arch/amd64/include/pmap.h b/sys/arch/amd64/include/pmap.h index c0495badc..55503d8c7 100644 --- a/sys/arch/amd64/include/pmap.h +++ b/sys/arch/amd64/include/pmap.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap.h,v 1.90 2024/09/26 13:18:25 dv Exp $ */ +/* $OpenBSD: pmap.h,v 1.91 2024/11/08 01:57:34 jsg Exp $ */ /* $NetBSD: pmap.h,v 1.1 2003/04/26 18:39:46 fvdl Exp $ */ /* @@ -373,7 +373,6 @@ extern const long nbpd[], nkptpmax[]; #define pmap_clear_reference(pg) pmap_clear_attrs(pg, PG_U) #define pmap_is_modified(pg) pmap_test_attrs(pg, PG_M) #define pmap_is_referenced(pg) pmap_test_attrs(pg, PG_U) -#define pmap_move(DP,SP,D,L,S) #define pmap_valid_entry(E) ((E) & PG_V) /* is PDE or PTE valid? */ #define pmap_proc_iflush(p,va,len) /* nothing */ diff --git a/sys/arch/amd64/include/ptrace.h b/sys/arch/amd64/include/ptrace.h index 27c0bf29c..7ab2acea5 100644 --- a/sys/arch/amd64/include/ptrace.h +++ b/sys/arch/amd64/include/ptrace.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ptrace.h,v 1.1 2004/01/28 01:39:39 mickey Exp $ */ +/* $OpenBSD: ptrace.h,v 1.2 2024/11/27 05:25:57 anton Exp $ */ /* $NetBSD: ptrace.h,v 1.1 2003/04/26 18:39:47 fvdl Exp $ */ /* @@ -39,3 +39,18 @@ #define PT_SETREGS (PT_FIRSTMACH + 2) #define PT_GETFPREGS (PT_FIRSTMACH + 3) #define PT_SETFPREGS (PT_FIRSTMACH + 4) + +#define PT_GETXSTATE_INFO (PT_FIRSTMACH + 5) +#define PT_GETXSTATE (PT_FIRSTMACH + 6) +#define PT_SETXSTATE (PT_FIRSTMACH + 7) + +struct ptrace_xstate_info { + uint64_t xsave_mask; + uint32_t xsave_len; +}; + +#ifdef _KERNEL +int process_read_xstate_info(struct proc *, void *); +int process_read_xstate(struct proc *, void *); +int process_write_xstate(struct proc *, void *); +#endif diff --git a/sys/arch/amd64/include/vmmvar.h b/sys/arch/amd64/include/vmmvar.h index a2c9d5db4..cd04fe4f0 100644 --- a/sys/arch/amd64/include/vmmvar.h +++ b/sys/arch/amd64/include/vmmvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: vmmvar.h,v 1.108 2024/10/02 17:05:56 dv Exp $ */ +/* $OpenBSD: vmmvar.h,v 1.109 2024/10/22 21:50:02 jsg Exp $ */ /* * Copyright (c) 2014 Mike Larkin * @@ -727,20 +727,17 @@ struct vmcs { uint32_t vmcs_revision; }; -struct vmx_invvpid_descriptor -{ +struct vmx_invvpid_descriptor { uint64_t vid_vpid; uint64_t vid_addr; }; -struct vmx_invept_descriptor -{ +struct vmx_invept_descriptor { uint64_t vid_eptp; uint64_t vid_reserved; }; -struct vmx_msr_store -{ +struct vmx_msr_store { uint64_t vms_index; uint64_t vms_data; }; @@ -752,8 +749,7 @@ struct vmx_msr_store * Note that vmx/svm_enter_guest depend on the layout of this struct for * field access. */ -struct vcpu_gueststate -{ +struct vcpu_gueststate { /* %rsi should be first */ uint64_t vg_rsi; /* 0x00 */ uint64_t vg_rax; /* 0x08 */ diff --git a/sys/arch/amd64/include/vmparam.h b/sys/arch/amd64/include/vmparam.h index 7d7553e0f..e7026fdd4 100644 --- a/sys/arch/amd64/include/vmparam.h +++ b/sys/arch/amd64/include/vmparam.h @@ -1,4 +1,4 @@ -/* $OpenBSD: vmparam.h,v 1.24 2023/04/28 18:33:22 robert Exp $ */ +/* $OpenBSD: vmparam.h,v 1.25 2024/11/08 01:44:52 jsg Exp $ */ /* $NetBSD: vmparam.h,v 1.1 2003/04/26 18:39:49 fvdl Exp $ */ /*- @@ -100,8 +100,6 @@ #define VM_MIN_KERNEL_ADDRESS 0xffff800000000000 #define VM_MAX_KERNEL_ADDRESS 0xffff800100000000 -#define VM_MAXUSER_ADDRESS32 0xffffc000 - /* map PIE into approximately the first quarter of user va space */ #define VM_PIE_MIN_ADDR VM_MIN_ADDRESS #define VM_PIE_MAX_ADDR 0x200000000000 diff --git a/sys/arch/amd64/pci/aapic.c b/sys/arch/amd64/pci/aapic.c index 5a4da49f3..a5a4a62fc 100644 --- a/sys/arch/amd64/pci/aapic.c +++ b/sys/arch/amd64/pci/aapic.c @@ -1,4 +1,4 @@ -/* $OpenBSD: aapic.c,v 1.7 2022/02/21 11:03:39 mpi Exp $ */ +/* $OpenBSD: aapic.c,v 1.8 2024/11/05 18:58:59 miod Exp $ */ /* $NetBSD: aapic.c,v 1.3 2005/01/13 23:40:01 fvdl Exp $ */ /* @@ -36,7 +36,7 @@ const struct cfattach aapic_ca = { }; struct cfdriver aapic_cd = { - 0, "aapic", DV_DULL + NULL, "aapic", DV_DULL }; int diff --git a/sys/arch/amd64/stand/boot/boot.8 b/sys/arch/amd64/stand/boot/boot.8 index cdeb55a3c..6c3202524 100644 --- a/sys/arch/amd64/stand/boot/boot.8 +++ b/sys/arch/amd64/stand/boot/boot.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: boot.8,v 1.35 2024/04/25 18:31:49 kn Exp $ +\" $OpenBSD: boot.8,v 1.36 2024/11/05 09:42:48 miod Exp $ .\" .\" Copyright (c) 1997-2001 Michael Shalayeff .\" All rights reserved. @@ -25,7 +25,7 @@ .\" THE POSSIBILITY OF SUCH DAMAGE. .\" .\" -.Dd $Mdocdate: April 25 2024 $ +.Dd $Mdocdate: November 5 2024 $ .Dt BOOT 8 amd64 .Os .Sh NAME @@ -67,7 +67,8 @@ If time expires, the kernel will be loaded according to the current variable settings (see the .Ic set command). -Each time a kernel load fails, the timeout is increased by one second. +If the kernel load fails, a second attempt is made with the timeout increased +by one second. The sequence of .Nm operations is as follows: diff --git a/sys/arch/amd64/stand/libsa/memprobe.c b/sys/arch/amd64/stand/libsa/memprobe.c index 785b1d0e6..f4a5acf33 100644 --- a/sys/arch/amd64/stand/libsa/memprobe.c +++ b/sys/arch/amd64/stand/libsa/memprobe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: memprobe.c,v 1.19 2021/01/28 18:54:52 deraadt Exp $ */ +/* $OpenBSD: memprobe.c,v 1.20 2024/11/18 02:32:22 mlarkin Exp $ */ /* * Copyright (c) 1997-1999 Michael Shalayeff @@ -100,7 +100,7 @@ bios_E820(bios_memmap_t *mp) /* * BIOS int 15, AX=8800 * - * Only used if int 15, AX=E801 does not work. + * Only used if int 15, AX=E820 does not work. * Machines with this are restricted to 64MB. */ static __inline bios_memmap_t * diff --git a/sys/arch/amd64/stand/mbr/mbr.S b/sys/arch/amd64/stand/mbr/mbr.S index 2af4aa7af..85af09393 100644 --- a/sys/arch/amd64/stand/mbr/mbr.S +++ b/sys/arch/amd64/stand/mbr/mbr.S @@ -1,4 +1,4 @@ -/* $OpenBSD: mbr.S,v 1.9 2022/09/02 07:46:03 krw Exp $ */ +/* $OpenBSD: mbr.S,v 1.10 2024/11/18 02:32:22 mlarkin Exp $ */ /* * Copyright (c) 1997 Michael Shalayeff and Tobias Weingartner @@ -99,7 +99,7 @@ start: /* * We don't need to disable and re-enable interrupts around the - * the load of ss and sp. + * load of ss and sp. * * From 80386 Programmer's Reference Manual: * "A MOV into SS inhibits all interrupts until after the execution diff --git a/sys/arch/arm/arm/genassym.cf b/sys/arch/arm/arm/genassym.cf index 730277eb4..314714e11 100644 --- a/sys/arch/arm/arm/genassym.cf +++ b/sys/arch/arm/arm/genassym.cf @@ -1,4 +1,4 @@ -# $OpenBSD: genassym.cf,v 1.20 2024/10/06 22:47:38 jsg Exp $ +# $OpenBSD: genassym.cf,v 1.21 2024/11/07 08:12:12 miod Exp $ # $NetBSD: genassym.cf,v 1.27 2003/11/04 10:33:16 dsl Exp$ # Copyright (c) 1982, 1990 The Regents of the University of California. @@ -52,10 +52,6 @@ ifdef __ARM_FIQ_INDIRECT define __ARM_FIQ_INDIRECT 1 endif -ifdef PMAP_INCLUDE_PTE_SYNC -define PMAP_INCLUDE_PTE_SYNC 1 -endif - export SONPROC struct proc diff --git a/sys/arch/arm/arm/mem.c b/sys/arch/arm/arm/mem.c index 85c0f69d5..221d63836 100644 --- a/sys/arch/arm/arm/mem.c +++ b/sys/arch/arm/arm/mem.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mem.c,v 1.24 2024/06/23 22:08:37 kettenis Exp $ */ +/* $OpenBSD: mem.c,v 1.27 2024/12/30 02:46:00 guenther Exp $ */ /* $NetBSD: mem.c,v 1.11 2003/10/16 12:02:58 jdolecek Exp $ */ /* @@ -80,6 +80,7 @@ #include #include #include +#include #include @@ -103,7 +104,8 @@ mmopen(dev_t dev, int flag, int mode, struct proc *p) switch (minor(dev)) { case 0: case 1: - if (securelevel <= 0 || allowkmem) + if ((int)atomic_load_int(&securelevel) <= 0 || + atomic_load_int(&allowkmem)) break; return (EPERM); case 2: @@ -245,7 +247,6 @@ int mmioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct proc *p) { switch (cmd) { - case FIONBIO: case FIOASYNC: /* handled by fd layer */ return 0; diff --git a/sys/arch/arm/arm/pmap7.c b/sys/arch/arm/arm/pmap7.c index 3d2c5b900..f7aeb249f 100644 --- a/sys/arch/arm/arm/pmap7.c +++ b/sys/arch/arm/arm/pmap7.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap7.c,v 1.67 2024/10/02 10:12:52 mpi Exp $ */ +/* $OpenBSD: pmap7.c,v 1.68 2024/11/07 08:12:12 miod Exp $ */ /* $NetBSD: pmap.c,v 1.147 2004/01/18 13:03:50 scw Exp $ */ /* @@ -189,6 +189,20 @@ #include #include +/* + * XXX We want to use proper TEX settings eventually. + */ + +#define PTE_L1_S_CACHE_MODE (L1_S_B | L1_S_C) +#define PTE_L1_S_CACHE_MODE_PT (L1_S_B | L1_S_C) + +/* write-allocate should be tested */ +#define PTE_L2_L_CACHE_MODE (L2_B | L2_C) +#define PTE_L2_S_CACHE_MODE (L2_B | L2_C) + +#define PTE_L2_L_CACHE_MODE_PT (L2_B | L2_C) +#define PTE_L2_S_CACHE_MODE_PT (L2_B | L2_C) + //#define PMAP_DEBUG #ifdef PMAP_DEBUG @@ -264,8 +278,8 @@ paddr_t pmap_kernel_l2ptp_phys; /* * pmap copy/zero page, wb page, and mem(5) hook point */ -pt_entry_t *csrc_pte, *cdst_pte, *cwb_pte; -vaddr_t csrcp, cdstp, cwbp; +pt_entry_t *csrc_pte, *cdst_pte; +vaddr_t csrcp, cdstp; char *memhook; extern caddr_t msgbufaddr; @@ -1157,7 +1171,7 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_t pa, vm_prot_t prot, int flags) mapped = 0; } - npte |= pte_l2_s_cache_mode; + npte |= PTE_L2_S_CACHE_MODE; if (pg == opg) { /* @@ -1375,7 +1389,7 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, vm_prot_t prot) { struct l2_bucket *l2b; pt_entry_t *ptep, opte, npte; - pt_entry_t cache_mode = pte_l2_s_cache_mode; + pt_entry_t cache_mode = PTE_L2_S_CACHE_MODE; NPDEBUG(PDB_KENTER, printf("pmap_kenter_pa: va 0x%08lx, pa 0x%08lx, prot 0x%x\n", @@ -1871,7 +1885,7 @@ pmap_reference(pmap_t pm) * _any_ bulk data very slow. */ void -pmap_zero_page_generic(struct vm_page *pg) +pmap_zero_page(struct vm_page *pg) { paddr_t phys = VM_PAGE_TO_PHYS(pg); #ifdef DEBUG @@ -1884,7 +1898,7 @@ pmap_zero_page_generic(struct vm_page *pg) * zeroed page. Invalidate the TLB as needed. */ *cdst_pte = L2_S_PROTO | phys | L2_V7_AF | - L2_S_PROT(PTE_KERNEL, PROT_WRITE) | pte_l2_s_cache_mode; + L2_S_PROT(PTE_KERNEL, PROT_WRITE) | PTE_L2_S_CACHE_MODE; PTE_SYNC(cdst_pte); cpu_tlb_flushD_SE(cdstp); bzero_page(cdstp); @@ -1898,7 +1912,7 @@ pmap_zero_page_generic(struct vm_page *pg) * pmap_zero_page also applies here. */ void -pmap_copy_page_generic(struct vm_page *src_pg, struct vm_page *dst_pg) +pmap_copy_page(struct vm_page *src_pg, struct vm_page *dst_pg) { paddr_t src = VM_PAGE_TO_PHYS(src_pg); paddr_t dst = VM_PAGE_TO_PHYS(dst_pg); @@ -1913,10 +1927,10 @@ pmap_copy_page_generic(struct vm_page *src_pg, struct vm_page *dst_pg) * as required. */ *csrc_pte = L2_S_PROTO | src | L2_V7_AF | - L2_S_PROT(PTE_KERNEL, PROT_READ) | pte_l2_s_cache_mode; + L2_S_PROT(PTE_KERNEL, PROT_READ) | PTE_L2_S_CACHE_MODE; PTE_SYNC(csrc_pte); *cdst_pte = L2_S_PROTO | dst | L2_V7_AF | - L2_S_PROT(PTE_KERNEL, PROT_WRITE) | pte_l2_s_cache_mode; + L2_S_PROT(PTE_KERNEL, PROT_WRITE) | PTE_L2_S_CACHE_MODE; PTE_SYNC(cdst_pte); cpu_tlb_flushD_SE(csrcp); cpu_tlb_flushD_SE(cdstp); @@ -2001,7 +2015,7 @@ pmap_grow_l2_bucket(pmap_t pm, vaddr_t va) /* * Need to allocate a backing page */ - if (pmap_grow_map(nva, pte_l2_s_cache_mode, NULL)) + if (pmap_grow_map(nva, PTE_L2_S_CACHE_MODE, NULL)) return (NULL); } @@ -2014,7 +2028,7 @@ pmap_grow_l2_bucket(pmap_t pm, vaddr_t va) * Map in another page to cover it. */ if (pmap_grow_map(trunc_page(nva), - pte_l2_s_cache_mode, NULL)) + PTE_L2_S_CACHE_MODE, NULL)) return (NULL); } @@ -2044,7 +2058,7 @@ pmap_grow_l2_bucket(pmap_t pm, vaddr_t va) /* * Need to allocate a backing page */ - if (pmap_grow_map(nva, pte_l2_s_cache_mode_pt, + if (pmap_grow_map(nva, PTE_L2_S_CACHE_MODE_PT, &pmap_kernel_l2ptp_phys)) return (NULL); PTE_SYNC_RANGE(ptep, PAGE_SIZE / sizeof(pt_entry_t)); @@ -2328,7 +2342,6 @@ pmap_bootstrap(pd_entry_t *kernel_l1pt, vaddr_t vstart, vaddr_t vend) pmap_alloc_specials(&virtual_avail, 1, &csrcp, &csrc_pte); pmap_alloc_specials(&virtual_avail, 1, &cdstp, &cdst_pte); - pmap_alloc_specials(&virtual_avail, 1, &cwbp, &cwb_pte); pmap_alloc_specials(&virtual_avail, 1, (void *)&memhook, NULL); pmap_alloc_specials(&virtual_avail, round_page(MSGBUFSIZE) / PAGE_SIZE, (void *)&msgbufaddr, NULL); @@ -2491,11 +2504,11 @@ pmap_map_section(vaddr_t l1pt, vaddr_t va, paddr_t pa, int prot, int cache) break; case PTE_CACHE: - fl = pte_l1_s_cache_mode; + fl = PTE_L1_S_CACHE_MODE; break; case PTE_PAGETABLE: - fl = pte_l1_s_cache_mode_pt; + fl = PTE_L1_S_CACHE_MODE_PT; break; } @@ -2523,11 +2536,11 @@ pmap_map_entry(vaddr_t l1pt, vaddr_t va, paddr_t pa, int prot, int cache) break; case PTE_CACHE: - fl = pte_l2_s_cache_mode; + fl = PTE_L2_S_CACHE_MODE; break; case PTE_PAGETABLE: - fl = pte_l2_s_cache_mode_pt; + fl = PTE_L2_S_CACHE_MODE_PT; break; } @@ -2614,15 +2627,15 @@ pmap_map_chunk(vaddr_t l1pt, vaddr_t va, paddr_t pa, vsize_t size, break; case PTE_CACHE: - f1 = pte_l1_s_cache_mode; - f2l = pte_l2_l_cache_mode; - f2s = pte_l2_s_cache_mode; + f1 = PTE_L1_S_CACHE_MODE; + f2l = PTE_L2_L_CACHE_MODE; + f2s = PTE_L2_S_CACHE_MODE; break; case PTE_PAGETABLE: - f1 = pte_l1_s_cache_mode_pt; - f2l = pte_l2_l_cache_mode_pt; - f2s = pte_l2_s_cache_mode_pt; + f1 = PTE_L1_S_CACHE_MODE_PT; + f2l = PTE_L2_L_CACHE_MODE_PT; + f2s = PTE_L2_S_CACHE_MODE_PT; break; } @@ -2712,106 +2725,16 @@ pmap_map_chunk(vaddr_t l1pt, vaddr_t va, paddr_t pa, vsize_t size, /********************** PTE initialization routines **************************/ /* - * These routines are called when the CPU type is identified to set up - * the PTE prototypes, cache modes, etc. - * - * The variables are always here, just in case LKMs need to reference - * them (though, they shouldn't). + * This routine is called to set up cache modes, etc. */ -pt_entry_t pte_l1_s_cache_mode; -pt_entry_t pte_l1_s_cache_mode_pt; -pt_entry_t pte_l1_s_cache_mask; - -pt_entry_t pte_l2_l_cache_mode; -pt_entry_t pte_l2_l_cache_mode_pt; -pt_entry_t pte_l2_l_cache_mask; - -pt_entry_t pte_l2_s_cache_mode; -pt_entry_t pte_l2_s_cache_mode_pt; -pt_entry_t pte_l2_s_cache_mask; - -pt_entry_t pte_l1_s_coherent; -pt_entry_t pte_l2_l_coherent; -pt_entry_t pte_l2_s_coherent; - -pt_entry_t pte_l1_s_prot_ur; -pt_entry_t pte_l1_s_prot_uw; -pt_entry_t pte_l1_s_prot_kr; -pt_entry_t pte_l1_s_prot_kw; -pt_entry_t pte_l1_s_prot_mask; - -pt_entry_t pte_l2_l_prot_ur; -pt_entry_t pte_l2_l_prot_uw; -pt_entry_t pte_l2_l_prot_kr; -pt_entry_t pte_l2_l_prot_kw; -pt_entry_t pte_l2_l_prot_mask; - -pt_entry_t pte_l2_s_prot_ur; -pt_entry_t pte_l2_s_prot_uw; -pt_entry_t pte_l2_s_prot_kr; -pt_entry_t pte_l2_s_prot_kw; -pt_entry_t pte_l2_s_prot_mask; - -pt_entry_t pte_l1_s_proto; -pt_entry_t pte_l1_c_proto; -pt_entry_t pte_l2_s_proto; - -void (*pmap_copy_page_func)(struct vm_page *, struct vm_page *); -void (*pmap_zero_page_func)(struct vm_page *); - void pmap_pte_init_armv7(void) { uint32_t id_mmfr0, id_mmfr3; - /* - * XXX We want to use proper TEX settings eventually. - */ - - /* write-allocate should be tested */ - pte_l1_s_cache_mode = L1_S_C|L1_S_B; - pte_l2_l_cache_mode = L2_C|L2_B; - pte_l2_s_cache_mode = L2_C|L2_B; - - pte_l1_s_cache_mode_pt = L1_S_B|L1_S_C; - pte_l2_l_cache_mode_pt = L2_B|L2_C; - pte_l2_s_cache_mode_pt = L2_B|L2_C; pmap_needs_pte_sync = 1; - pte_l1_s_cache_mask = L1_S_CACHE_MASK_v7; - pte_l2_l_cache_mask = L2_L_CACHE_MASK_v7; - pte_l2_s_cache_mask = L2_S_CACHE_MASK_v7; - - pte_l1_s_coherent = L1_S_COHERENT_v7; - pte_l2_l_coherent = L2_L_COHERENT_v7; - pte_l2_s_coherent = L2_S_COHERENT_v7; - - pte_l1_s_prot_ur = L1_S_PROT_UR_v7; - pte_l1_s_prot_uw = L1_S_PROT_UW_v7; - pte_l1_s_prot_kr = L1_S_PROT_KR_v7; - pte_l1_s_prot_kw = L1_S_PROT_KW_v7; - pte_l1_s_prot_mask = L1_S_PROT_MASK_v7; - - pte_l2_l_prot_ur = L2_L_PROT_UR_v7; - pte_l2_l_prot_uw = L2_L_PROT_UW_v7; - pte_l2_l_prot_kr = L2_L_PROT_KR_v7; - pte_l2_l_prot_kw = L2_L_PROT_KW_v7; - pte_l2_l_prot_mask = L2_L_PROT_MASK_v7; - - pte_l2_s_prot_ur = L2_S_PROT_UR_v7; - pte_l2_s_prot_uw = L2_S_PROT_UW_v7; - pte_l2_s_prot_kr = L2_S_PROT_KR_v7; - pte_l2_s_prot_kw = L2_S_PROT_KW_v7; - pte_l2_s_prot_mask = L2_S_PROT_MASK_v7; - - pte_l1_s_proto = L1_S_PROTO_v7; - pte_l1_c_proto = L1_C_PROTO_v7; - pte_l2_s_proto = L2_S_PROTO_v7; - - pmap_copy_page_func = pmap_copy_page_generic; - pmap_zero_page_func = pmap_zero_page_generic; - /* Check if the PXN bit is supported. */ __asm volatile("mrc p15, 0, %0, c0, c1, 4" : "=r"(id_mmfr0)); if ((id_mmfr0 & ID_MMFR0_VMSA_MASK) >= VMSA_V7_PXN) diff --git a/sys/arch/arm/include/cpuconf.h b/sys/arch/arm/include/cpuconf.h index e5580ce97..132156493 100644 --- a/sys/arch/arm/include/cpuconf.h +++ b/sys/arch/arm/include/cpuconf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cpuconf.h,v 1.19 2017/01/06 00:06:02 jsg Exp $ */ +/* $OpenBSD: cpuconf.h,v 1.20 2024/11/07 08:12:12 miod Exp $ */ /* $NetBSD: cpuconf.h,v 1.7 2003/05/23 00:57:24 ichiro Exp $ */ /* @@ -39,12 +39,6 @@ #ifndef _ARM_CPUCONF_H_ #define _ARM_CPUCONF_H_ -/* - * IF YOU CHANGE THIS FILE, MAKE SURE TO UPDATE THE DEFINITION OF - * "PMAP_NEEDS_PTE_SYNC" IN FOR THE CPU TYPE - * YOU ARE ADDING SUPPORT FOR. - */ - /* * Define which MMU classes are configured: * diff --git a/sys/arch/arm/include/pmap.h b/sys/arch/arm/include/pmap.h index 681807402..41d7b595e 100644 --- a/sys/arch/arm/include/pmap.h +++ b/sys/arch/arm/include/pmap.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap.h,v 1.56 2024/04/29 12:24:46 jsg Exp $ */ +/* $OpenBSD: pmap.h,v 1.57 2024/11/07 08:12:12 miod Exp $ */ /* $NetBSD: pmap.h,v 1.76 2003/09/06 09:10:46 rearnsha Exp $ */ /* @@ -279,20 +279,16 @@ vtopte(vaddr_t va) } /* - * The new pmap ensures that page-tables are always mapping Write-Thru. + * Page tables are always mapped write-through. * Thus, on some platforms we can run fast and loose and avoid syncing PTEs * on every change. * * Unfortunately, not all CPUs have a write-through cache mode. So we - * define PMAP_NEEDS_PTE_SYNC for C code to conditionally do PTE syncs, - * and if there is the chance for PTE syncs to be needed, we define - * PMAP_INCLUDE_PTE_SYNC so e.g. assembly code can include (and run) - * the code. + * define PMAP_NEEDS_PTE_SYNC for C code to conditionally do PTE syncs. */ extern int pmap_needs_pte_sync; #define PMAP_NEEDS_PTE_SYNC pmap_needs_pte_sync -#define PMAP_INCLUDE_PTE_SYNC #define PTE_SYNC(pte) \ do { \ @@ -342,59 +338,7 @@ do { \ /************************* ARM MMU configuration *****************************/ -#if (ARM_MMU_V7) != 0 -void pmap_copy_page_generic(struct vm_page *, struct vm_page *); -void pmap_zero_page_generic(struct vm_page *); - -void pmap_pte_init_generic(void); void pmap_pte_init_armv7(void); -#endif /* (ARM_MMU_V7) != 0 */ - -#if ARM_MMU_V7 == 1 -void pmap_pte_init_v7(void); -#endif /* ARM_MMU_V7 == 1 */ - -extern pt_entry_t pte_l1_s_cache_mode; -extern pt_entry_t pte_l1_s_cache_mask; - -extern pt_entry_t pte_l2_l_cache_mode; -extern pt_entry_t pte_l2_l_cache_mask; - -extern pt_entry_t pte_l2_s_cache_mode; -extern pt_entry_t pte_l2_s_cache_mask; - -extern pt_entry_t pte_l1_s_cache_mode_pt; -extern pt_entry_t pte_l2_l_cache_mode_pt; -extern pt_entry_t pte_l2_s_cache_mode_pt; - -extern pt_entry_t pte_l1_s_coherent; -extern pt_entry_t pte_l2_l_coherent; -extern pt_entry_t pte_l2_s_coherent; - -extern pt_entry_t pte_l1_s_prot_ur; -extern pt_entry_t pte_l1_s_prot_uw; -extern pt_entry_t pte_l1_s_prot_kr; -extern pt_entry_t pte_l1_s_prot_kw; -extern pt_entry_t pte_l1_s_prot_mask; - -extern pt_entry_t pte_l2_l_prot_ur; -extern pt_entry_t pte_l2_l_prot_uw; -extern pt_entry_t pte_l2_l_prot_kr; -extern pt_entry_t pte_l2_l_prot_kw; -extern pt_entry_t pte_l2_l_prot_mask; - -extern pt_entry_t pte_l2_s_prot_ur; -extern pt_entry_t pte_l2_s_prot_uw; -extern pt_entry_t pte_l2_s_prot_kr; -extern pt_entry_t pte_l2_s_prot_kw; -extern pt_entry_t pte_l2_s_prot_mask; - -extern pt_entry_t pte_l1_s_proto; -extern pt_entry_t pte_l1_c_proto; -extern pt_entry_t pte_l2_s_proto; - -extern void (*pmap_copy_page_func)(struct vm_page *, struct vm_page *); -extern void (*pmap_zero_page_func)(struct vm_page *); #endif /* !_LOCORE */ @@ -450,45 +394,6 @@ extern void (*pmap_zero_page_func)(struct vm_page *); #define L2_S_PROTO_v7 (L2_TYPE_S) -/* - * User-visible names for the ones that vary with MMU class. - */ - -#if ARM_NMMUS > 1 -/* More than one MMU class configured; use variables. */ -#define L1_S_PROT_UR pte_l1_s_prot_ur -#define L1_S_PROT_UW pte_l1_s_prot_uw -#define L1_S_PROT_KR pte_l1_s_prot_kr -#define L1_S_PROT_KW pte_l1_s_prot_kw -#define L1_S_PROT_MASK pte_l1_s_prot_mask - -#define L2_L_PROT_UR pte_l2_l_prot_ur -#define L2_L_PROT_UW pte_l2_l_prot_uw -#define L2_L_PROT_KR pte_l2_l_prot_kr -#define L2_L_PROT_KW pte_l2_l_prot_kw -#define L2_L_PROT_MASK pte_l2_l_prot_mask - -#define L2_S_PROT_UR pte_l2_s_prot_ur -#define L2_S_PROT_UW pte_l2_s_prot_uw -#define L2_S_PROT_KR pte_l2_s_prot_kr -#define L2_S_PROT_KW pte_l2_s_prot_kw -#define L2_S_PROT_MASK pte_l2_s_prot_mask - -#define L1_S_CACHE_MASK pte_l1_s_cache_mask -#define L2_L_CACHE_MASK pte_l2_l_cache_mask -#define L2_S_CACHE_MASK pte_l2_s_cache_mask - -#define L1_S_COHERENT pte_l1_s_coherent -#define L2_L_COHERENT pte_l2_l_coherent -#define L2_S_COHERENT pte_l2_s_coherent - -#define L1_S_PROTO pte_l1_s_proto -#define L1_C_PROTO pte_l1_c_proto -#define L2_S_PROTO pte_l2_s_proto - -#define pmap_copy_page(s, d) (*pmap_copy_page_func)((s), (d)) -#define pmap_zero_page(d) (*pmap_zero_page_func)((d)) -#elif ARM_MMU_V7 == 1 #define L1_S_PROT_UR L1_S_PROT_UR_v7 #define L1_S_PROT_UW L1_S_PROT_UW_v7 #define L1_S_PROT_KR L1_S_PROT_KR_v7 @@ -519,10 +424,6 @@ extern void (*pmap_zero_page_func)(struct vm_page *); #define L1_C_PROTO L1_C_PROTO_v7 #define L2_S_PROTO L2_S_PROTO_v7 -#define pmap_copy_page(s, d) pmap_copy_page_generic((s), (d)) -#define pmap_zero_page(d) pmap_zero_page_generic((d)) -#endif /* ARM_NMMUS > 1 */ - /* * These macros return various bits based on kernel/user and protection. * Note that the compiler will usually fold these at compile time. diff --git a/sys/arch/arm64/arm64/autoconf.c b/sys/arch/arm64/arm64/autoconf.c index 75ef6d7da..5d3d477a5 100644 --- a/sys/arch/arm64/arm64/autoconf.c +++ b/sys/arch/arm64/arm64/autoconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: autoconf.c,v 1.15 2024/07/17 15:21:59 kettenis Exp $ */ +/* $OpenBSD: autoconf.c,v 1.16 2024/11/10 06:51:59 jsg Exp $ */ /* * Copyright (c) 2009 Miodrag Vallat. * @@ -21,7 +21,7 @@ #include #include #include -#include +#include #if defined(NFSCLIENT) #include diff --git a/sys/arch/arm64/dev/arm64_bus_space.c b/sys/arch/arm64/arm64/bus_space.c similarity index 98% rename from sys/arch/arm64/dev/arm64_bus_space.c rename to sys/arch/arm64/arm64/bus_space.c index f78905fb4..a0adfc49e 100644 --- a/sys/arch/arm64/dev/arm64_bus_space.c +++ b/sys/arch/arm64/arm64/bus_space.c @@ -1,4 +1,4 @@ -/* $OpenBSD: arm64_bus_space.c,v 1.9 2024/07/03 21:04:04 kettenis Exp $ */ +/* $OpenBSD: bus_space.c,v 1.1 2024/11/12 04:56:27 jsg Exp $ */ /* * Copyright (c) 2001-2003 Opsycon AB (www.opsycon.se / www.opsycon.com) diff --git a/sys/arch/arm64/arm64/cpu.c b/sys/arch/arm64/arm64/cpu.c index ebca49850..14ee6216d 100644 --- a/sys/arch/arm64/arm64/cpu.c +++ b/sys/arch/arm64/arm64/cpu.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cpu.c,v 1.133 2024/09/29 11:22:39 jsg Exp $ */ +/* $OpenBSD: cpu.c,v 1.134 2024/11/10 06:51:59 jsg Exp $ */ /* * Copyright (c) 2016 Dale Rahn @@ -29,7 +29,7 @@ #include #include -#include +#include #include #include diff --git a/sys/arch/arm64/arm64/db_trace.c b/sys/arch/arm64/arm64/db_trace.c index cd460530a..55c105ac7 100644 --- a/sys/arch/arm64/arm64/db_trace.c +++ b/sys/arch/arm64/arm64/db_trace.c @@ -1,4 +1,4 @@ -/* $OpenBSD: db_trace.c,v 1.16 2024/03/12 13:32:53 kettenis Exp $ */ +/* $OpenBSD: db_trace.c,v 1.17 2024/11/07 16:02:29 miod Exp $ */ /* $NetBSD: db_trace.c,v 1.8 2003/01/17 22:28:48 thorpej Exp $ */ /* @@ -57,7 +57,7 @@ db_stack_trace_print(db_expr_t addr, int have_addr, db_expr_t count, char c, *cp = modif; db_expr_t offset; Elf_Sym * sym; - char *name; + const char *name; int kernel_only = 1; int trace_thread = 0; diff --git a/sys/arch/arm64/arm64/machdep.c b/sys/arch/arm64/arm64/machdep.c index 154bf2d4e..dc4dda12a 100644 --- a/sys/arch/arm64/arm64/machdep.c +++ b/sys/arch/arm64/arm64/machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: machdep.c,v 1.92 2024/07/24 21:24:18 kettenis Exp $ */ +/* $OpenBSD: machdep.c,v 1.95 2024/11/18 05:32:39 jsg Exp $ */ /* * Copyright (c) 2014 Patrick Wildt * Copyright (c) 2021 Mark Kettenis @@ -35,7 +35,7 @@ #include #include -#include +#include #include #include #include @@ -44,7 +44,6 @@ #include #include #include -#include #include #include @@ -629,10 +628,6 @@ dumpsys(void) printf("\ndumping to dev %u,%u offset %ld\n", major(dumpdev), minor(dumpdev), dumplo); -#ifdef UVM_SWAP_ENCRYPT - uvm_swap_finicrypt_all(); -#endif - error = (*bdevsw[major(dumpdev)].d_psize)(dumpdev); printf("dump "); if (error == -1) { diff --git a/sys/arch/arm64/arm64/mem.c b/sys/arch/arm64/arm64/mem.c index 2084b979d..0c7751824 100644 --- a/sys/arch/arm64/arm64/mem.c +++ b/sys/arch/arm64/arm64/mem.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mem.c,v 1.7 2024/06/23 22:08:37 kettenis Exp $ */ +/* $OpenBSD: mem.c,v 1.10 2024/12/30 02:46:00 guenther Exp $ */ /* $NetBSD: mem.c,v 1.11 2003/10/16 12:02:58 jdolecek Exp $ */ /* @@ -83,6 +83,7 @@ #include #include #include +#include #include #include @@ -107,7 +108,8 @@ mmopen(dev_t dev, int flag, int mode, struct proc *p) switch (minor(dev)) { case 0: case 1: - if (securelevel <= 0 || allowkmem) + if ((int)atomic_load_int(&securelevel) <= 0 || + atomic_load_int(&allowkmem)) break; return (EPERM); case 2: @@ -247,7 +249,6 @@ int mmioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct proc *p) { switch (cmd) { - case FIONBIO: case FIOASYNC: /* handled by fd layer */ return 0; diff --git a/sys/arch/arm64/arm64/pmap.c b/sys/arch/arm64/arm64/pmap.c index b4bfe6e2d..3e95c83f9 100644 --- a/sys/arch/arm64/arm64/pmap.c +++ b/sys/arch/arm64/arm64/pmap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap.c,v 1.104 2024/08/26 03:37:56 jsg Exp $ */ +/* $OpenBSD: pmap.c,v 1.105 2024/11/09 12:58:29 kettenis Exp $ */ /* * Copyright (c) 2008-2009,2014-2016 Dale Rahn * @@ -821,6 +821,8 @@ pmap_zero_page(struct vm_page *pg) paddr_t pa = VM_PAGE_TO_PHYS(pg); vaddr_t va = zero_page + cpu_number() * PAGE_SIZE; + KASSERT(curcpu()->ci_idepth == 0); + pmap_kenter_pa(va, pa, PROT_READ|PROT_WRITE); pagezero_cache(va); pmap_kremove_pg(va); @@ -836,12 +838,19 @@ pmap_copy_page(struct vm_page *srcpg, struct vm_page *dstpg) paddr_t dstpa = VM_PAGE_TO_PHYS(dstpg); vaddr_t srcva = copy_src_page + cpu_number() * PAGE_SIZE; vaddr_t dstva = copy_dst_page + cpu_number() * PAGE_SIZE; + int s; + /* + * XXX The buffer flipper (incorrectly?) uses pmap_copy_page() + * (from uvm_pagerealloc_multi()) from interrupt context! + */ + s = splbio(); pmap_kenter_pa(srcva, srcpa, PROT_READ); pmap_kenter_pa(dstva, dstpa, PROT_READ|PROT_WRITE); memcpy((void *)dstva, (void *)srcva, PAGE_SIZE); pmap_kremove_pg(srcva); pmap_kremove_pg(dstva); + splx(s); } void diff --git a/sys/arch/arm64/arm64/trap.c b/sys/arch/arm64/arm64/trap.c index 672b62ec0..0b70c4c2e 100644 --- a/sys/arch/arm64/arm64/trap.c +++ b/sys/arch/arm64/arm64/trap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: trap.c,v 1.49 2024/07/24 21:24:18 kettenis Exp $ */ +/* $OpenBSD: trap.c,v 1.50 2024/11/10 06:51:59 jsg Exp $ */ /*- * Copyright (c) 2014 Andrew Turner * All rights reserved. @@ -36,7 +36,6 @@ #include #include -#include #include #include diff --git a/sys/arch/arm64/conf/GENERIC b/sys/arch/arm64/conf/GENERIC index 5bde678be..ca7a67619 100644 --- a/sys/arch/arm64/conf/GENERIC +++ b/sys/arch/arm64/conf/GENERIC @@ -1,4 +1,4 @@ -# $OpenBSD: GENERIC,v 1.289 2024/08/14 14:40:46 patrick Exp $ +# $OpenBSD: GENERIC,v 1.290 2024/11/17 16:35:05 tobhe Exp $ # # GENERIC machine description file # @@ -335,6 +335,7 @@ sdmmc* at dwmshc? # Qualcomm SoCs qcaoss* at fdt? qccpu* at fdt? +qccpucp* at fdt? qcdwusb* at fdt? qcgpio* at acpi? qcgpio* at fdt? early 1 diff --git a/sys/arch/arm64/conf/files.arm64 b/sys/arch/arm64/conf/files.arm64 index c8f9acac7..b2509fae3 100644 --- a/sys/arch/arm64/conf/files.arm64 +++ b/sys/arch/arm64/conf/files.arm64 @@ -1,11 +1,11 @@ -# $OpenBSD: files.arm64,v 1.70 2024/07/02 10:25:16 kettenis Exp $ +# $OpenBSD: files.arm64,v 1.72 2024/11/12 04:56:27 jsg Exp $ maxpartitions 16 maxusers 2 8 128 -major {wd = 16} -major {sd = 24} -major {cd = 26} +major {wd = 0} +major {sd = 4} +major {cd = 6} major {rd = 17} file arch/arm64/arm64/autoconf.c @@ -37,8 +37,8 @@ file arch/arm64/arm64/cpufunc_asm.S file arch/arm64/arm64/lse.S file arch/arm64/arm64/support.S file arch/arm64/arm64/bus_dma.c +file arch/arm64/arm64/bus_space.c -file arch/arm64/dev/arm64_bus_space.c file arch/arm64/dev/pci_machdep.c file arch/arm64/arm64/cryptox.c crypto diff --git a/sys/arch/arm64/dev/agintc.c b/sys/arch/arm64/dev/agintc.c index 26c88d518..34f7c9ac0 100644 --- a/sys/arch/arm64/dev/agintc.c +++ b/sys/arch/arm64/dev/agintc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: agintc.c,v 1.59 2024/07/03 22:37:00 patrick Exp $ */ +/* $OpenBSD: agintc.c,v 1.61 2024/12/07 21:12:22 patrick Exp $ */ /* * Copyright (c) 2007, 2009, 2011, 2017 Dale Rahn * Copyright (c) 2018 Mark Kettenis @@ -1577,6 +1577,7 @@ struct agintc_msi_softc { struct agintc_dmamem *sc_dtt; size_t sc_dtt_pgsz; uint8_t sc_dte_sz; + int sc_dtt_indirect; int sc_cidbits; struct agintc_dmamem *sc_ctt; size_t sc_ctt_pgsz; @@ -1599,11 +1600,27 @@ struct cfdriver agintcmsi_cd = { void agintc_msi_send_cmd(struct agintc_msi_softc *, struct gits_cmd *); void agintc_msi_wait_cmd(struct agintc_msi_softc *); +#define CPU_IMPL(midr) (((midr) >> 24) & 0xff) +#define CPU_PART(midr) (((midr) >> 4) & 0xfff) + +#define CPU_IMPL_QCOM 0x51 +#define CPU_PART_ORYON 0x001 + int agintc_msi_match(struct device *parent, void *cfdata, void *aux) { struct fdt_attach_args *faa = aux; + /* + * XXX For some reason MSIs don't work on Qualcomm X1E SoCs in + * ACPI mode. So skip attaching the ITS in that case. MSIs + * work fine when booting with a DTB. + */ + if (OF_is_compatible(OF_peer(0), "openbsd,acpi") && + CPU_IMPL(curcpu()->ci_midr) == CPU_IMPL_QCOM && + CPU_PART(curcpu()->ci_midr) == CPU_PART_ORYON) + return 0; + return OF_is_compatible(faa->fa_node, "arm,gic-v3-its"); } @@ -1705,11 +1722,19 @@ agintc_msi_attach(struct device *parent, struct device *self, void *aux) size = (1ULL << sc->sc_devbits) * sc->sc_dte_sz; size = roundup(size, sc->sc_dtt_pgsz); - /* FIXME: For now, skip registering MSI controller */ - if (size / sc->sc_dtt_pgsz > GITS_BASER_SZ_MASK + 1) { - printf(": cannot support %u devbits on %lu pgsz\n", - sc->sc_devbits, sc->sc_dtt_pgsz); - return; + /* Might make sense to go indirect */ + if (size > 2 * sc->sc_dtt_pgsz) { + bus_space_write_8(sc->sc_iot, sc->sc_ioh, GITS_BASER(i), + baser | GITS_BASER_INDIRECT); + if (bus_space_read_8(sc->sc_iot, sc->sc_ioh, + GITS_BASER(i)) & GITS_BASER_INDIRECT) + sc->sc_dtt_indirect = 1; + } + if (sc->sc_dtt_indirect) { + size = (1ULL << sc->sc_devbits); + size /= (sc->sc_dtt_pgsz / sc->sc_dte_sz); + size *= sizeof(uint64_t); + size = roundup(size, sc->sc_dtt_pgsz); } /* Clamp down to maximum configurable num pages */ @@ -1718,6 +1743,9 @@ agintc_msi_attach(struct device *parent, struct device *self, void *aux) /* Calculate max deviceid based off configured size */ sc->sc_deviceid_max = (size / sc->sc_dte_sz) - 1; + if (sc->sc_dtt_indirect) + sc->sc_deviceid_max = ((size / sizeof(uint64_t)) * + (sc->sc_dtt_pgsz / sc->sc_dte_sz)) - 1; /* Allocate table. */ sc->sc_dtt = agintc_dmamem_alloc(sc->sc_dmat, @@ -1732,7 +1760,9 @@ agintc_msi_attach(struct device *parent, struct device *self, void *aux) KASSERT((dtt_pa & GITS_BASER_PA_MASK) == dtt_pa); bus_space_write_8(sc->sc_iot, sc->sc_ioh, GITS_BASER(i), GITS_BASER_IC_NORM_NC | baser & GITS_BASER_PGSZ_MASK | - dtt_pa | (size / sc->sc_dtt_pgsz) - 1 | GITS_BASER_VALID); + dtt_pa | (size / sc->sc_dtt_pgsz) - 1 | + (sc->sc_dtt_indirect ? GITS_BASER_INDIRECT : 0) | + GITS_BASER_VALID); } /* Set up collection translation table. */ @@ -1868,6 +1898,40 @@ agintc_msi_wait_cmd(struct agintc_msi_softc *sc) printf("%s: command queue timeout\n", sc->sc_dev.dv_xname); } +int +agintc_msi_create_device_table(struct agintc_msi_softc *sc, uint32_t deviceid) +{ + uint64_t *table = AGINTC_DMA_KVA(sc->sc_dtt); + uint32_t idx = deviceid / (sc->sc_dtt_pgsz / sc->sc_dte_sz); + struct agintc_dmamem *dtt; + paddr_t dtt_pa; + + /* Out of bounds */ + if (deviceid > sc->sc_deviceid_max) + return ENXIO; + + /* No need to adjust */ + if (!sc->sc_dtt_indirect) + return 0; + + /* Table already allocated */ + if (table[idx]) + return 0; + + /* FIXME: leaks */ + dtt = agintc_dmamem_alloc(sc->sc_dmat, + sc->sc_dtt_pgsz, sc->sc_dtt_pgsz); + if (dtt == NULL) + return ENOMEM; + + dtt_pa = AGINTC_DMA_DVA(dtt); + KASSERT((dtt_pa & GITS_BASER_PA_MASK) == dtt_pa); + table[idx] = dtt_pa | GITS_BASER_VALID; + cpu_dcache_wb_range((vaddr_t)&table[idx], sizeof(table[idx])); + __asm volatile("dsb sy"); + return 0; +} + struct agintc_msi_device * agintc_msi_create_device(struct agintc_msi_softc *sc, uint32_t deviceid) { @@ -1877,6 +1941,9 @@ agintc_msi_create_device(struct agintc_msi_softc *sc, uint32_t deviceid) if (deviceid > sc->sc_deviceid_max) return NULL; + if (agintc_msi_create_device_table(sc, deviceid) != 0) + return NULL; + md = malloc(sizeof(*md), M_DEVBUF, M_ZERO | M_WAITOK); md->md_deviceid = deviceid; md->md_itt = agintc_dmamem_alloc(sc->sc_dmat, diff --git a/sys/arch/arm64/dev/aplrtk.c b/sys/arch/arm64/dev/aplrtk.c index 97a95e82f..b08df27f2 100644 --- a/sys/arch/arm64/dev/aplrtk.c +++ b/sys/arch/arm64/dev/aplrtk.c @@ -1,4 +1,4 @@ -/* $OpenBSD: aplrtk.c,v 1.3 2022/11/09 19:18:11 kettenis Exp $ */ +/* $OpenBSD: aplrtk.c,v 1.4 2024/10/29 21:19:25 kettenis Exp $ */ /* * Copyright (c) 2022 Mark Kettenis * @@ -98,7 +98,6 @@ int aplrtk_do_start(struct aplrtk_softc *sc) { uint32_t ctrl; - int error; ctrl = HREAD4(sc, CPU_CTRL); HWRITE4(sc, CPU_CTRL, ctrl | CPU_CTRL_RUN); @@ -109,11 +108,7 @@ aplrtk_do_start(struct aplrtk_softc *sc) if (sc->sc_state == NULL) return EIO; - error = rtkit_boot(sc->sc_state); - if (error) - return error; - - return rtkit_set_ap_pwrstate(sc->sc_state, RTKIT_MGMT_PWR_STATE_ON); + return rtkit_boot(sc->sc_state); } int diff --git a/sys/arch/arm64/dev/aplsmc.c b/sys/arch/arm64/dev/aplsmc.c index 28f77c807..0ab1414d9 100644 --- a/sys/arch/arm64/dev/aplsmc.c +++ b/sys/arch/arm64/dev/aplsmc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: aplsmc.c,v 1.25 2023/07/16 16:11:11 kettenis Exp $ */ +/* $OpenBSD: aplsmc.c,v 1.28 2024/11/04 09:33:16 kettenis Exp $ */ /* * Copyright (c) 2021 Mark Kettenis * @@ -143,6 +143,7 @@ struct aplsmc_softc { #define CH0I_DISCHARGE (1 << 0) #define CH0C_INHIBIT (1 << 0) +#define CHLS_FORCE_DISCHARGE (1 << 8) struct aplsmc_softc *aplsmc_sc; @@ -204,7 +205,8 @@ void aplsmc_reboot_attachhook(struct device *); void aplsmc_battery_init(struct aplsmc_softc *); int aplsmc_battery_setchargemode(int); int aplsmc_battery_setchargestart(int); -int aplsmc_battery_setchargestop(int); +int aplsmc_battery_chls_setchargestop(int); +int aplsmc_battery_chwa_setchargestop(int); int aplsmc_match(struct device *parent, void *match, void *aux) @@ -809,11 +811,13 @@ aplsmc_powerdown(void) aplsmc_write_key(sc, key, &off1, sizeof(off1)); } +#ifndef SMALL_KERNEL + void aplsmc_battery_init(struct aplsmc_softc *sc) { - uint8_t ch0i, ch0c; - int error; + uint8_t ch0i, ch0c, chwa; + int error, stop; error = aplsmc_read_key(sc, SMC_KEY("CH0I"), &ch0i, sizeof(ch0i)); if (error) @@ -822,7 +826,6 @@ aplsmc_battery_init(struct aplsmc_softc *sc) if (error) return; -#ifndef SMALL_KERNEL if (ch0i & CH0I_DISCHARGE) hw_battery_chargemode = -1; else if (ch0c & CH0C_INHIBIT) @@ -830,16 +833,37 @@ aplsmc_battery_init(struct aplsmc_softc *sc) else hw_battery_chargemode = 1; - hw_battery_chargestart = 0; - hw_battery_chargestop = 100; - hw_battery_setchargemode = aplsmc_battery_setchargemode; + + /* + * The system firmware for macOS 15 (Sequoia) introduced a new + * CHLS key that allows setting the level at which to stop + * charging, and dropped support for the old CHWA key that + * only supports a fixed limit of 80%. However, CHLS is + * broken in some beta versions. Those versions still support + * CHWA so prefer that over CHLS. + */ + error = aplsmc_read_key(sc, SMC_KEY("CHWA"), &chwa, sizeof(chwa)); + if (error) { + uint16_t chls; + + error = aplsmc_read_key(sc, SMC_KEY("CHLS"), + &chls, sizeof(chls)); + if (error) + return; + stop = (chls & 0xff) ? (chls & 0xff) : 100; + hw_battery_setchargestop = aplsmc_battery_chls_setchargestop; + } else { + stop = chwa ? 80 : 100; + hw_battery_setchargestop = aplsmc_battery_chwa_setchargestop; + } + hw_battery_setchargestart = aplsmc_battery_setchargestart; - hw_battery_setchargestop = aplsmc_battery_setchargestop; -#endif + + hw_battery_chargestart = stop - 5; + hw_battery_chargestop = stop; } -#ifndef SMALL_KERNEL int aplsmc_battery_setchargemode(int mode) { @@ -899,21 +923,54 @@ aplsmc_battery_setchargestart(int start) } int -aplsmc_battery_setchargestop(int stop) +aplsmc_battery_chls_setchargestop(int stop) +{ + struct aplsmc_softc *sc = aplsmc_sc; + uint16_t chls; + int error; + + if (stop < 10) + stop = 10; + + /* + * Setting the CHLS_FORCE_DISCHARGE flags makes sure the + * battery is discharged until the configured charge level is + * reached when the limit is lowered. + */ + chls = (stop == 100 ? 0 : stop) | CHLS_FORCE_DISCHARGE; + error = aplsmc_write_key(sc, SMC_KEY("CHLS"), &chls, sizeof(chls)); + if (error) + return error; + + hw_battery_chargestart = stop - 5; + hw_battery_chargestop = stop; + + return 0; +} + +int +aplsmc_battery_chwa_setchargestop(int stop) { struct aplsmc_softc *sc = aplsmc_sc; uint8_t chwa; + int error; if (stop <= 80) { - hw_battery_chargestart = 75; - hw_battery_chargestop = 80; + stop = 80; chwa = 1; } else { - hw_battery_chargestart = 95; - hw_battery_chargestop = 100; + stop = 100; chwa = 0; } - return aplsmc_write_key(sc, SMC_KEY("CHWA"), &chwa, sizeof(chwa)); + error = aplsmc_write_key(sc, SMC_KEY("CHWA"), &chwa, sizeof(chwa)); + if (error) + return error; + + hw_battery_chargestart = stop - 5; + hw_battery_chargestop = stop; + + return 0; } + #endif diff --git a/sys/arch/arm64/dev/apm.c b/sys/arch/arm64/dev/apm.c index 49d4e1a66..feb9447f9 100644 --- a/sys/arch/arm64/dev/apm.c +++ b/sys/arch/arm64/dev/apm.c @@ -1,4 +1,4 @@ -/* $OpenBSD: apm.c,v 1.25 2024/05/28 09:40:40 kettenis Exp $ */ +/* $OpenBSD: apm.c,v 1.26 2024/10/30 06:16:27 jsg Exp $ */ /*- * Copyright (c) 2001 Alexander Guy. All rights reserved. @@ -380,7 +380,7 @@ request_sleep(int sleepmode) break; #ifdef HIBERNATE case SLEEP_HIBERNATE: - if (get_hibernate_io_function(swdevt[0].sw_dev) == NULL) + if (get_hibernate_io_function(swdevt[0]) == NULL) return EOPNOTSUPP; task_add(sleep_taskq, &hibernate_task); break; diff --git a/sys/arch/arm64/dev/mainbus.c b/sys/arch/arm64/dev/mainbus.c index b3a7da206..01a6e13d7 100644 --- a/sys/arch/arm64/dev/mainbus.c +++ b/sys/arch/arm64/dev/mainbus.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mainbus.c,v 1.30 2024/08/18 15:50:49 deraadt Exp $ */ +/* $OpenBSD: mainbus.c,v 1.32 2024/11/18 05:32:39 jsg Exp $ */ /* * Copyright (c) 2016 Patrick Wildt * Copyright (c) 2017 Mark Kettenis @@ -28,9 +28,6 @@ #include #include -#include -#include - int mainbus_match(struct device *, void *, void *); void mainbus_attach(struct device *, struct device *, void *); diff --git a/sys/arch/arm64/dev/rtkit.c b/sys/arch/arm64/dev/rtkit.c index 6ebb6da59..62fd669ee 100644 --- a/sys/arch/arm64/dev/rtkit.c +++ b/sys/arch/arm64/dev/rtkit.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtkit.c,v 1.15 2024/01/15 16:57:31 kettenis Exp $ */ +/* $OpenBSD: rtkit.c,v 1.17 2024/10/29 21:19:25 kettenis Exp $ */ /* * Copyright (c) 2021 Mark Kettenis * @@ -142,14 +142,20 @@ rtkit_recv(struct mbox_channel *mc, struct aplmbox_msg *msg) } int -rtkit_send(struct mbox_channel *mc, uint32_t endpoint, +rtkit_send(struct rtkit_state *state, uint32_t endpoint, uint64_t type, uint64_t data) { struct aplmbox_msg msg; msg.data0 = (type << RTKIT_MGMT_TYPE_SHIFT) | data; msg.data1 = endpoint; - return mbox_send(mc, &msg, sizeof(msg)); + + if (state->flags & RK_DEBUG) { + printf("%s: 0x%016llx 0x%02x\n", __func__, + msg.data0, msg.data1); + } + + return mbox_send(state->mc, &msg, sizeof(msg)); } bus_addr_t @@ -212,18 +218,16 @@ rtkit_alloc(struct rtkit_state *state, bus_size_t size, caddr_t *kvap) int rtkit_start(struct rtkit_state *state, uint32_t endpoint) { - struct mbox_channel *mc = state->mc; uint64_t reply; reply = ((uint64_t)endpoint << RTKIT_MGMT_STARTEP_EP_SHIFT); reply |= RTKIT_MGMT_STARTEP_START; - return rtkit_send(mc, RTKIT_EP_MGMT, RTKIT_MGMT_STARTEP, reply); + return rtkit_send(state, RTKIT_EP_MGMT, RTKIT_MGMT_STARTEP, reply); } int rtkit_handle_mgmt(struct rtkit_state *state, struct aplmbox_msg *msg) { - struct mbox_channel *mc = state->mc; uint64_t minver, maxver, ver; uint64_t base, bitmap, reply; uint32_t endpoint; @@ -244,7 +248,7 @@ rtkit_handle_mgmt(struct rtkit_state *state, struct aplmbox_msg *msg) return EINVAL; } ver = min(RTKIT_MAXVER, maxver); - error = rtkit_send(mc, RTKIT_EP_MGMT, RTKIT_MGMT_HELLO_ACK, + error = rtkit_send(state, RTKIT_EP_MGMT, RTKIT_MGMT_HELLO_ACK, (ver << RTKIT_MGMT_HELLO_MINVER_SHIFT) | (ver << RTKIT_MGMT_HELLO_MAXVER_SHIFT)); if (error) @@ -267,7 +271,7 @@ rtkit_handle_mgmt(struct rtkit_state *state, struct aplmbox_msg *msg) reply |= RTKIT_MGMT_EPMAP_LAST; else reply |= RTKIT_MGMT_EPMAP_MORE; - error = rtkit_send(state->mc, RTKIT_EP_MGMT, + error = rtkit_send(state, RTKIT_EP_MGMT, RTKIT_MGMT_EPMAP, reply); if (error) return error; @@ -459,7 +463,6 @@ void rtkit_handle_crashlog_buffer(void *arg) { struct rtkit_state *state = arg; - struct mbox_channel *mc = state->mc; struct rtkit *rk = state->rk; bus_addr_t addr = state->crashlog_addr; bus_size_t size = state->crashlog_size; @@ -494,7 +497,7 @@ rtkit_handle_crashlog_buffer(void *arg) return; } - rtkit_send(mc, RTKIT_EP_CRASHLOG, RTKIT_BUFFER_REQUEST, + rtkit_send(state, RTKIT_EP_CRASHLOG, RTKIT_BUFFER_REQUEST, (size << RTKIT_BUFFER_SIZE_SHIFT) | addr); } @@ -580,7 +583,6 @@ void rtkit_handle_syslog_buffer(void *arg) { struct rtkit_state *state = arg; - struct mbox_channel *mc = state->mc; struct rtkit *rk = state->rk; bus_addr_t addr = state->syslog_addr; bus_size_t size = state->syslog_size; @@ -592,14 +594,13 @@ rtkit_handle_syslog_buffer(void *arg) return; } - rtkit_send(mc, RTKIT_EP_SYSLOG, RTKIT_BUFFER_REQUEST, + rtkit_send(state, RTKIT_EP_SYSLOG, RTKIT_BUFFER_REQUEST, (size << RTKIT_BUFFER_SIZE_SHIFT) | addr); } int rtkit_handle_syslog(struct rtkit_state *state, struct aplmbox_msg *msg) { - struct mbox_channel *mc = state->mc; bus_addr_t addr; bus_size_t size; int error; @@ -628,7 +629,7 @@ rtkit_handle_syslog(struct rtkit_state *state, struct aplmbox_msg *msg) break; case RTKIT_SYSLOG_LOG: rtkit_handle_syslog_log(state, msg); - error = rtkit_send(mc, RTKIT_EP_SYSLOG, + error = rtkit_send(state, RTKIT_EP_SYSLOG, RTKIT_MGMT_TYPE(msg->data0), msg->data0); if (error) return error; @@ -646,7 +647,6 @@ void rtkit_handle_ioreport_buffer(void *arg) { struct rtkit_state *state = arg; - struct mbox_channel *mc = state->mc; struct rtkit *rk = state->rk; bus_addr_t addr = state->ioreport_addr; bus_size_t size = state->ioreport_size; @@ -658,14 +658,13 @@ rtkit_handle_ioreport_buffer(void *arg) return; } - rtkit_send(mc, RTKIT_EP_IOREPORT, RTKIT_BUFFER_REQUEST, + rtkit_send(state, RTKIT_EP_IOREPORT, RTKIT_BUFFER_REQUEST, (size << RTKIT_BUFFER_SIZE_SHIFT) | addr); } int rtkit_handle_ioreport(struct rtkit_state *state, struct aplmbox_msg *msg) { - struct mbox_channel *mc = state->mc; bus_addr_t addr; bus_size_t size; int error; @@ -687,7 +686,7 @@ rtkit_handle_ioreport(struct rtkit_state *state, struct aplmbox_msg *msg) case RTKIT_IOREPORT_UNKNOWN1: case RTKIT_IOREPORT_UNKNOWN2: /* These unknown events have to be acked to make progress. */ - error = rtkit_send(mc, RTKIT_EP_IOREPORT, + error = rtkit_send(state, RTKIT_EP_IOREPORT, RTKIT_MGMT_TYPE(msg->data0), msg->data0); if (error) return error; @@ -705,7 +704,6 @@ void rtkit_handle_oslog_buffer(void *arg) { struct rtkit_state *state = arg; - struct mbox_channel *mc = state->mc; struct rtkit *rk = state->rk; bus_addr_t addr = state->oslog_addr; bus_size_t size = state->oslog_size; @@ -716,7 +714,7 @@ rtkit_handle_oslog_buffer(void *arg) return; } - rtkit_send(mc, RTKIT_EP_OSLOG, + rtkit_send(state, RTKIT_EP_OSLOG, (RTKIT_OSLOG_BUFFER_REQUEST << RTKIT_OSLOG_TYPE_SHIFT), (size << RTKIT_OSLOG_BUFFER_SIZE_SHIFT) | (addr >> PAGE_SHIFT)); } @@ -768,8 +766,11 @@ rtkit_poll(struct rtkit_state *state) if (error) return error; - if (state->flags & RK_DEBUG) - printf("%s: 0x%016llx 0x%02x\n", __func__, msg.data0, msg.data1); + if (state->flags & RK_DEBUG) { + printf("%s: 0x%016llx 0x%02x\n", __func__, + msg.data0, msg.data1); + } + endpoint = msg.data1; switch (endpoint) { case RTKIT_EP_MGMT: @@ -855,8 +856,14 @@ rtkit_init(int node, const char *name, int flags, struct rtkit *rk) int rtkit_boot(struct rtkit_state *state) { + int error; + /* Wake up! */ - return rtkit_set_iop_pwrstate(state, RTKIT_MGMT_PWR_STATE_ON); + error = rtkit_set_iop_pwrstate(state, RTKIT_MGMT_PWR_STATE_INIT); + if (error) + return error; + + return rtkit_set_ap_pwrstate(state, RTKIT_MGMT_PWR_STATE_ON); } void @@ -896,13 +903,12 @@ rtkit_shutdown(struct rtkit_state *state) int rtkit_set_ap_pwrstate(struct rtkit_state *state, uint16_t pwrstate) { - struct mbox_channel *mc = state->mc; int error, timo; if (state->ap_pwrstate == pwrstate) return 0; - error = rtkit_send(mc, RTKIT_EP_MGMT, RTKIT_MGMT_AP_PWR_STATE, + error = rtkit_send(state, RTKIT_EP_MGMT, RTKIT_MGMT_AP_PWR_STATE, pwrstate); if (error) return error; @@ -935,13 +941,12 @@ rtkit_set_ap_pwrstate(struct rtkit_state *state, uint16_t pwrstate) int rtkit_set_iop_pwrstate(struct rtkit_state *state, uint16_t pwrstate) { - struct mbox_channel *mc = state->mc; int error, timo; if (state->iop_pwrstate == (pwrstate & 0xff)) return 0; - error = rtkit_send(mc, RTKIT_EP_MGMT, RTKIT_MGMT_IOP_PWR_STATE, + error = rtkit_send(state, RTKIT_EP_MGMT, RTKIT_MGMT_IOP_PWR_STATE, pwrstate); if (error) return error; @@ -990,5 +995,5 @@ int rtkit_send_endpoint(struct rtkit_state *state, uint32_t endpoint, uint64_t data) { - return rtkit_send(state->mc, endpoint, 0, data); + return rtkit_send(state, endpoint, 0, data); } diff --git a/sys/arch/arm64/include/armreg.h b/sys/arch/arm64/include/armreg.h index 76633348a..c7d33f515 100644 --- a/sys/arch/arm64/include/armreg.h +++ b/sys/arch/arm64/include/armreg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: armreg.h,v 1.37 2024/07/30 08:59:33 kettenis Exp $ */ +/* $OpenBSD: armreg.h,v 1.39 2024/11/08 04:40:34 jsg Exp $ */ /*- * Copyright (c) 2013, 2014 Andrew Turner * Copyright (c) 2015 The FreeBSD Foundation @@ -142,7 +142,7 @@ #define ISS_DATA_FnV (0x01 << 10) #define ISS_DATA_EA (0x01 << 9) #define ISS_DATA_CM (0x01 << 8) -#define ISS_INSN_S1PTW (0x01 << 7) +#define ISS_DATA_S1PTW (0x01 << 7) #define ISS_DATA_WnR (0x01 << 6) #define ISS_DATA_DFSC_MASK (0x3f << 0) #define ISS_DATA_DFSC_ASF_L0 (0x00 << 0) @@ -886,20 +886,6 @@ #define PMCR_N_SHIFT 11 /* Number of counters implemented */ #define PMCR_N_MASK (0x1f << PMCR_N_SHIFT) -/* Individual CPUs are probably best IDed by everything but the revision. */ -#define CPU_ID_CPU_MASK 0xfffffff0 - -/* ARM64 CPUs */ -#define CPU_ID_CORTEX_A53 0x410fd030 -#define CPU_ID_CORTEX_A53_R1 0x411fd030 -#define CPU_ID_CORTEX_A53_MASK 0xff0ffff0 -#define CPU_ID_CORTEX_A57 0x410fd070 -#define CPU_ID_CORTEX_A57_R1 0x411fd070 -#define CPU_ID_CORTEX_A57_MASK 0xff0ffff0 -#define CPU_ID_CORTEX_A72 0x410fd080 -#define CPU_ID_CORTEX_A72_R1 0x411fd080 -#define CPU_ID_CORTEX_A57_MASK 0xff0ffff0 - #define I_bit (1 << 7) /* IRQ disable */ #define F_bit 0 /* FIQ disable - not actually used */ diff --git a/sys/arch/arm64/include/bus.h b/sys/arch/arm64/include/bus.h index 84464eb45..8ebec8e90 100644 --- a/sys/arch/arm64/include/bus.h +++ b/sys/arch/arm64/include/bus.h @@ -1,4 +1,4 @@ -/* $OpenBSD: bus.h,v 1.10 2024/01/20 11:22:46 kettenis Exp $ */ +/* $OpenBSD: bus.h,v 1.11 2024/11/18 05:32:39 jsg Exp $ */ /* * Copyright (c) 2003-2004 Opsycon AB Sweden. All rights reserved. * @@ -134,6 +134,8 @@ struct bus_space { #define BUS_SPACE_MAP_LINEAR 0x04 #define BUS_SPACE_MAP_PREFETCHABLE 0x08 +extern bus_space_t arm64_bs_tag; + #define bus_space_vaddr(t, h) (*(t)->_space_vaddr)((t), (h)) #define bus_space_mmap(t, a, o, p, f) \ (*(t)->_space_mmap)((t), (a), (o), (p), (f)) diff --git a/sys/arch/arm64/include/vmmvar.h b/sys/arch/arm64/include/vmmvar.h index 76afc5cd8..7fe08d87b 100644 --- a/sys/arch/arm64/include/vmmvar.h +++ b/sys/arch/arm64/include/vmmvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: vmmvar.h,v 1.1 2024/07/10 10:41:19 dv Exp $ */ +/* $OpenBSD: vmmvar.h,v 1.2 2024/11/08 04:02:30 jsg Exp $ */ /* * Copyright (c) 2014 Mike Larkin * @@ -23,9 +23,6 @@ #define VMM_HV_SIGNATURE "OpenBSDVMM58" -#define VMM_PCI_MMIO_BAR_BASE 0xF0000000ULL -#define VMM_PCI_MMIO_BAR_END 0xFFDFFFFFULL /* 2 MiB below 4 GiB */ - /* Exit Reasons */ #define VM_EXIT_TERMINATED 0xFFFE #define VM_EXIT_NONE 0xFFFF diff --git a/sys/arch/arm64/stand/efiboot/efiboot.c b/sys/arch/arm64/stand/efiboot/efiboot.c index 07e04c331..288a9f1b9 100644 --- a/sys/arch/arm64/stand/efiboot/efiboot.c +++ b/sys/arch/arm64/stand/efiboot/efiboot.c @@ -1,4 +1,4 @@ -/* $OpenBSD: efiboot.c,v 1.60 2024/09/23 00:10:04 jsg Exp $ */ +/* $OpenBSD: efiboot.c,v 1.62 2024/11/12 20:49:42 tobhe Exp $ */ /* * Copyright (c) 2015 YASUOKA Masahiko @@ -397,7 +397,7 @@ efi_framebuffer(void) uint32_t acells, scells; uint64_t base, size; uint32_t reg[4]; - uint32_t width, height, stride; + uint32_t width, height, stride, pxsize; char *format; char *prop; @@ -443,15 +443,31 @@ efi_framebuffer(void) if (gop == NULL || gop->Mode == NULL || gop->Mode->Info == NULL) return; - /* We only support 32-bit pixel modes for now. */ switch (gop->Mode->Info->PixelFormat) { case PixelRedGreenBlueReserved8BitPerColor: format = "x8b8g8r8"; + pxsize = 4; break; case PixelBlueGreenRedReserved8BitPerColor: format = "x8r8g8b8"; + pxsize = 4; break; + case PixelBitMask: { + EFI_PIXEL_BITMASK *bm = &gop->Mode->Info->PixelInformation; + if (bm->RedMask == 0xf800 && + bm->GreenMask == 0x07e0 && + bm->BlueMask == 0x001f) { + format = "r5g6b5"; + pxsize = 2; + break; + } + printf("Unsupported PixelInformation bitmasks\n"); + /* FALLTHROUGH */ + } default: + printf("Unsupported PixelFormat %d, not adding " + "\"simple-framebuffer\" DT node\n", + gop->Mode->Info->PixelFormat); return; } @@ -459,7 +475,7 @@ efi_framebuffer(void) size = gop->Mode->FrameBufferSize; width = htobe32(gop->Mode->Info->HorizontalResolution); height = htobe32(gop->Mode->Info->VerticalResolution); - stride = htobe32(gop->Mode->Info->PixelsPerScanLine * 4); + stride = htobe32(gop->Mode->Info->PixelsPerScanLine * pxsize); node = fdt_find_node("/"); if (fdt_node_property_int(node, "#address-cells", &acells) != 1) @@ -1115,8 +1131,11 @@ struct smbios_dtb { const char *prod; const char *dtb; } smbios_dtb[] = { + /* Keep the list below sorted by vendor */ { "ASUS", "ASUS Vivobook S 15 S5507", "qcom/x1e80100-asus-vivobook-s15.dtb" }, + { "HP", "HP OmniBook X Laptop 14-fe0xxx", + "qcom/x1e80100-hp-omnibook-x14.dtb" }, { "LENOVO", "21BX", "qcom/sc8280xp-lenovo-thinkpad-x13s.dtb" }, { "LENOVO", "21BY", @@ -1129,8 +1148,6 @@ struct smbios_dtb { "qcom/x1e80100-lenovo-yoga-slim7x.dtb" }, { "SAMSUNG", "Galaxy Book4 Edge", "qcom/x1e80100-samsung-galaxy-book4-edge.dtb" }, - { "HP", "HP Omnibook X Laptop 14-fe0xxx", - "qcom/x1e80100-hp-omnibook-x14.dtb" }, }; void * diff --git a/sys/arch/armv7/omap/amdisplay.c b/sys/arch/armv7/omap/amdisplay.c index a85e67e48..2508d116f 100644 --- a/sys/arch/armv7/omap/amdisplay.c +++ b/sys/arch/armv7/omap/amdisplay.c @@ -1,4 +1,4 @@ -/* $OpenBSD: amdisplay.c,v 1.18 2024/05/13 01:15:50 jsg Exp $ */ +/* $OpenBSD: amdisplay.c,v 1.20 2024/11/06 07:09:45 miod Exp $ */ /* * Copyright (c) 2016 Ian Sutton * @@ -209,7 +209,7 @@ amdisplay_attach(struct device *parent, struct device *self, void *args) sc->sc_flags |= LCD_MODE_ALLOC; if (nxphdmi_get_edid(edid_buf, EDID_LENGTH) || - edid_parse(edid_buf, &sc->sc_edid)) { + edid_parse(DEVNAME(sc), edid_buf, &sc->sc_edid)) { printf("%s: no display attached.\n", DEVNAME(sc)); free(edid_buf, M_DEVBUF, EDID_LENGTH); amdisplay_detach(self, 0); @@ -218,7 +218,7 @@ amdisplay_attach(struct device *parent, struct device *self, void *args) free(edid_buf, M_DEVBUF, EDID_LENGTH); -#ifdef LCD_DEBUG +#if defined(LCD_DEBUG) && defined(EDID_DEBUG) edid_print(&sc->sc_edid); #endif diff --git a/sys/arch/i386/conf/files.i386 b/sys/arch/i386/conf/files.i386 index f94cb646f..3be7b01d9 100644 --- a/sys/arch/i386/conf/files.i386 +++ b/sys/arch/i386/conf/files.i386 @@ -1,4 +1,4 @@ -# $OpenBSD: files.i386,v 1.250 2023/07/08 08:01:10 tobhe Exp $ +# $OpenBSD: files.i386,v 1.251 2024/11/04 22:08:03 jsg Exp $ # # new style config file for i386 architecture # @@ -66,7 +66,6 @@ include "dev/mii/files.mii" include "scsi/files.scsi" major {sd = 4} -major {st = 5} major {cd = 6} major {rd = 17} diff --git a/sys/arch/i386/i386/conf.c b/sys/arch/i386/i386/conf.c index a6995b8c2..c6244c343 100644 --- a/sys/arch/i386/i386/conf.c +++ b/sys/arch/i386/i386/conf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: conf.c,v 1.178 2024/06/11 09:21:32 jsg Exp $ */ +/* $OpenBSD: conf.c,v 1.179 2024/11/27 10:33:31 jsg Exp $ */ /* $NetBSD: conf.c,v 1.75 1996/05/03 19:40:20 christos Exp $ */ /* @@ -109,10 +109,6 @@ cdev_decl(fd); cdev_decl(lpt); #include "ch.h" #include "bpfilter.h" -#if 0 -#include "pcmcia.h" -cdev_decl(pcmcia); -#endif #include "spkr.h" cdev_decl(spkr); #include "cy.h" @@ -191,11 +187,7 @@ struct cdevsw cdevsw[] = cdev_fd_init(1,filedesc), /* 22: file descriptor pseudo-device */ cdev_bpf_init(NBPFILTER,bpf), /* 23: Berkeley packet filter */ cdev_notdef(), /* 24 */ -#if 0 - cdev_ocis_init(NPCMCIA,pcmcia), /* 25: PCMCIA Bus */ -#else cdev_notdef(), /* 25 */ -#endif cdev_joy_init(NJOY,joy), /* 26: joystick */ cdev_spkr_init(NSPKR,spkr), /* 27: PC speaker */ cdev_notdef(), /* 28: was LKM */ diff --git a/sys/arch/i386/i386/db_trace.c b/sys/arch/i386/i386/db_trace.c index 4e83d064b..69b55f2f4 100644 --- a/sys/arch/i386/i386/db_trace.c +++ b/sys/arch/i386/i386/db_trace.c @@ -1,4 +1,4 @@ -/* $OpenBSD: db_trace.c,v 1.45 2024/06/07 10:14:29 jsg Exp $ */ +/* $OpenBSD: db_trace.c,v 1.46 2024/11/07 16:02:29 miod Exp $ */ /* $NetBSD: db_trace.c,v 1.18 1996/05/03 19:42:01 christos Exp $ */ /* @@ -155,7 +155,7 @@ db_stack_trace_print(db_expr_t addr, int have_addr, db_expr_t count, lastframe = 0; while (count && frame != 0) { int narg; - char * name; + const char * name; db_expr_t offset; Elf_Sym *sym; diff --git a/sys/arch/i386/i386/locore.s b/sys/arch/i386/i386/locore.s index feb8fa4ed..d3d04c50b 100644 --- a/sys/arch/i386/i386/locore.s +++ b/sys/arch/i386/i386/locore.s @@ -1,4 +1,4 @@ -/* $OpenBSD: locore.s,v 1.205 2024/06/06 00:36:46 bluhm Exp $ */ +/* $OpenBSD: locore.s,v 1.206 2024/10/21 07:21:18 jsg Exp $ */ /* $NetBSD: locore.s,v 1.145 1996/05/03 19:41:19 christos Exp $ */ /*- @@ -38,23 +38,18 @@ #include "npx.h" #include "assym.h" -#include "apm.h" #include "lapic.h" -#include "ksyms.h" #include #include #include -#include #include #include #include #include #include -#include - #if NLAPIC > 0 #include #endif diff --git a/sys/arch/i386/i386/locore0.S b/sys/arch/i386/i386/locore0.S index c2883e52e..f82e36fdf 100644 --- a/sys/arch/i386/i386/locore0.S +++ b/sys/arch/i386/i386/locore0.S @@ -1,4 +1,4 @@ -/* $OpenBSD: locore0.S,v 1.11 2023/07/21 04:04:52 guenther Exp $ */ +/* $OpenBSD: locore0.S,v 1.12 2024/10/21 07:21:18 jsg Exp $ */ /* $NetBSD: locore.s,v 1.145 1996/05/03 19:41:19 christos Exp $ */ /*- @@ -36,22 +36,12 @@ * @(#)locore.s 7.3 (Berkeley) 5/13/91 */ -#include "npx.h" #include "assym.h" -#include "apm.h" -#include "lapic.h" #include "ksyms.h" -#include -#include - -#include -#include #include #include -#include #include -#include #include diff --git a/sys/arch/i386/i386/mem.c b/sys/arch/i386/i386/mem.c index b5d1124ea..506d758e2 100644 --- a/sys/arch/i386/i386/mem.c +++ b/sys/arch/i386/i386/mem.c @@ -1,5 +1,5 @@ /* $NetBSD: mem.c,v 1.31 1996/05/03 19:42:19 christos Exp $ */ -/* $OpenBSD: mem.c,v 1.57 2024/06/23 22:08:37 kettenis Exp $ */ +/* $OpenBSD: mem.c,v 1.60 2024/12/30 02:46:00 guenther Exp $ */ /* * Copyright (c) 1988 University of Utah. * Copyright (c) 1982, 1986, 1990, 1993 @@ -48,6 +48,7 @@ #include #include #include +#include #include @@ -78,7 +79,8 @@ mmopen(dev_t dev, int flag, int mode, struct proc *p) switch (minor(dev)) { case 0: case 1: - if (securelevel <= 0 || allowkmem) + if ((int)atomic_load_int(&securelevel) <= 0 || + atomic_load_int(&allowkmem)) break; return (EPERM); case 2: @@ -247,7 +249,6 @@ int mmioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct proc *p) { switch (cmd) { - case FIONBIO: case FIOASYNC: /* handled by fd layer */ return 0; diff --git a/sys/arch/i386/i386/mpbios.c b/sys/arch/i386/i386/mpbios.c index 1775fb8ad..9c7511cab 100644 --- a/sys/arch/i386/i386/mpbios.c +++ b/sys/arch/i386/i386/mpbios.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mpbios.c,v 1.47 2024/06/07 23:19:18 jsg Exp $ */ +/* $OpenBSD: mpbios.c,v 1.48 2024/10/22 21:50:02 jsg Exp $ */ /* $NetBSD: mpbios.c,v 1.2 2002/10/01 12:56:57 fvdl Exp $ */ /*- @@ -141,8 +141,7 @@ static const char *loc_where[] = { "bios" }; -struct mp_map -{ +struct mp_map { vaddr_t baseva; int vsize; paddr_t pa; diff --git a/sys/arch/i386/i386/pmap.c b/sys/arch/i386/i386/pmap.c index 14f3e2d79..8f55b1d6e 100644 --- a/sys/arch/i386/i386/pmap.c +++ b/sys/arch/i386/i386/pmap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap.c,v 1.223 2024/04/03 18:43:32 miod Exp $ */ +/* $OpenBSD: pmap.c,v 1.226 2024/11/08 13:18:29 jsg Exp $ */ /* $NetBSD: pmap.c,v 1.91 2000/06/02 17:46:37 thorpej Exp $ */ /* @@ -884,6 +884,25 @@ pmap_kremove(vaddr_t sva, vsize_t len) pmap_tlb_shootwait(); } +/* + * Allocate a new PD for Intel's U-K. + */ +void +pmap_alloc_pdir_intel_x86(struct pmap *pmap) +{ + vaddr_t va; + + KASSERT(pmap->pm_pdir_intel == 0); + + va = (vaddr_t)km_alloc(NBPG, &kv_any, &kp_zero, &kd_waitok); + if (va == 0) + panic("kernel_map out of virtual space"); + pmap->pm_pdir_intel = va; + if (!pmap_extract(pmap_kernel(), (vaddr_t)pmap->pm_pdir_intel, + &pmap->pm_pdirpa_intel)) + panic("can't locate PD page"); +} + /* * p m a p i n i t f u n c t i o n s * @@ -1350,6 +1369,8 @@ pmap_create(void) pmap->pm_ptphint = NULL; pmap->pm_hiexec = 0; pmap->pm_flags = 0; + pmap->pm_pdir_intel = 0; + pmap->pm_pdirpa_intel = 0; initcodesegment(&pmap->pm_codeseg); @@ -1363,7 +1384,7 @@ pmap_pinit_pd_86(struct pmap *pmap) /* allocate PDP */ pmap->pm_pdir = (vaddr_t)km_alloc(NBPG, &kv_any, &kp_dirty, &kd_waitok); if (pmap->pm_pdir == 0) - panic("pmap_pinit_pd_86: kernel_map out of virtual space!"); + panic("kernel_map out of virtual space"); pmap_extract(pmap_kernel(), (vaddr_t)pmap->pm_pdir, &pmap->pm_pdirpa); pmap->pm_pdirsize = NBPG; @@ -1393,15 +1414,7 @@ pmap_pinit_pd_86(struct pmap *pmap) * execution, one that lacks all kernel mappings. */ if (cpu_meltdown) { - pmap->pm_pdir_intel = (vaddr_t)km_alloc(NBPG, &kv_any, &kp_zero, - &kd_waitok); - if (pmap->pm_pdir_intel == 0) - panic("%s: kernel_map out of virtual space!", __func__); - - if (!pmap_extract(pmap_kernel(), (vaddr_t)pmap->pm_pdir_intel, - &pmap->pm_pdirpa_intel)) - panic("%s: unknown PA mapping for meltdown PD", - __func__); + pmap_alloc_pdir_intel_x86(pmap); /* Copy PDEs from pmap_kernel's U-K view */ bcopy((void *)pmap_kernel()->pm_pdir_intel, @@ -1411,9 +1424,6 @@ pmap_pinit_pd_86(struct pmap *pmap) "pdir_intel 0x%lx pdirpa_intel 0x%lx\n", __func__, pmap, pmap->pm_pdir, pmap->pm_pdirpa, pmap->pm_pdir_intel, pmap->pm_pdirpa_intel); - } else { - pmap->pm_pdir_intel = 0; - pmap->pm_pdirpa_intel = 0; } mtx_enter(&pmaps_lock); @@ -1601,32 +1611,6 @@ pmap_zero_phys_86(paddr_t pa) *zpte = 0; } -/* - * pmap_zero_page_uncached: the same, except uncached. - */ - -int -pmap_zero_page_uncached_86(paddr_t pa) -{ -#ifdef MULTIPROCESSOR - int id = cpu_number(); -#endif - pt_entry_t *zpte = PTESLEW(zero_pte, id); - caddr_t zerova = VASLEW(pmap_zerop, id); - -#ifdef DIAGNOSTIC - if (*zpte) - panic("pmap_zero_page_uncached_86: lock botch"); -#endif - - *zpte = (pa & PG_FRAME) | PG_V | PG_RW | PG_N; /* map in */ - pmap_update_pg((vaddr_t)zerova); /* flush TLB */ - pagezero(zerova, PAGE_SIZE); /* zero */ - *zpte = 0; - - return 1; -} - /* * pmap_flush_cache: flush the cache for a virtual address. */ @@ -2243,25 +2227,6 @@ pmap_unwire_86(struct pmap *pmap, vaddr_t va) #endif } -/* - * pmap_collect: free resources held by a pmap - * - * => optional function. - * => called when a process is swapped out to free memory. - */ - -void -pmap_collect(struct pmap *pmap) -{ - /* - * free all of the pt pages by removing the physical mappings - * for its entire address space. - */ - - pmap_do_remove(pmap, VM_MIN_ADDRESS, VM_MAX_ADDRESS, - PMAP_REMOVE_SKIPWIRED); -} - /* * pmap_enter: enter a mapping into a pmap * @@ -2509,18 +2474,10 @@ pmap_enter_special_86(vaddr_t va, paddr_t pa, vm_prot_t prot, u_int32_t flags) /* Must be kernel VA */ if (va < VM_MIN_KERNEL_ADDRESS) - panic("%s: invalid special mapping va 0x%lx requested", - __func__, va); + panic("invalid special mapping va 0x%lx requested", va); - if (!pmap->pm_pdir_intel) { - pmap->pm_pdir_intel = (vaddr_t)km_alloc(NBPG, &kv_any, &kp_zero, - &kd_waitok); - if (pmap->pm_pdir_intel == 0) - panic("%s: kernel_map out of virtual space!", __func__); - if (!pmap_extract(pmap, pmap->pm_pdir_intel, - &pmap->pm_pdirpa_intel)) - panic("%s: can't locate PD page", __func__); - } + if (!pmap->pm_pdir_intel) + pmap_alloc_pdir_intel_x86(pmap); DPRINTF("%s: pm_pdir_intel 0x%x pm_pdirpa_intel 0x%x\n", __func__, (uint32_t)pmap->pm_pdir_intel, (uint32_t)pmap->pm_pdirpa_intel); @@ -2899,7 +2856,5 @@ void (*pmap_write_protect_p)(struct pmap *, vaddr_t, vaddr_t, vm_prot_t) = pmap_write_protect_86; void (*pmap_pinit_pd_p)(pmap_t) = pmap_pinit_pd_86; void (*pmap_zero_phys_p)(paddr_t) = pmap_zero_phys_86; -int (*pmap_zero_page_uncached_p)(paddr_t) = - pmap_zero_page_uncached_86; void (*pmap_copy_page_p)(struct vm_page *, struct vm_page *) = pmap_copy_page_86; diff --git a/sys/arch/i386/i386/pmapae.c b/sys/arch/i386/i386/pmapae.c index c88ec8ffe..f5155942e 100644 --- a/sys/arch/i386/i386/pmapae.c +++ b/sys/arch/i386/i386/pmapae.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pmapae.c,v 1.72 2024/05/30 10:56:24 mpi Exp $ */ +/* $OpenBSD: pmapae.c,v 1.75 2024/11/16 10:09:08 mpi Exp $ */ /* * Copyright (c) 2006-2008 Michael Shalayeff @@ -605,6 +605,38 @@ pmap_pte_paddr_pae(vaddr_t va) return (*ptep & PG_FRAME); } +/* + * Allocate a new PD for Intel's U-K. + */ +void +pmap_alloc_pdir_intel_pae(struct pmap *pmap) +{ + vaddr_t va; + int i; + + KASSERT(pmap->pm_pdir_intel == 0); + + va = (vaddr_t)km_alloc(4 * NBPG, &kv_any, &kp_zero, &kd_waitok); + if (va == 0) + panic("kernel_map out of virtual space"); + pmap->pm_pdir_intel = va; + if (!pmap_extract(pmap_kernel(), (vaddr_t)&pmap->pm_pdidx_intel, + &pmap->pm_pdirpa_intel)) + panic("can't locate PDPT"); + + for (i = 0; i < 4; i++) { + pmap->pm_pdidx_intel[i] = 0; + if (!pmap_extract(pmap, va + i * NBPG, + (paddr_t *)&pmap->pm_pdidx_intel[i])) + panic("can't locate PD page"); + + pmap->pm_pdidx_intel[i] |= PG_V; + + DPRINTF("%s: pm_pdidx_intel[%d] = 0x%llx\n", __func__, + i, pmap->pm_pdidx_intel[i]); + } +} + /* * Switch over to PAE page tables */ @@ -615,7 +647,7 @@ pmap_bootstrap_pae(void) struct pmap *kpm = pmap_kernel(); struct vm_page *ptp; paddr_t ptaddr; - u_int32_t bits; + u_int32_t bits, *pd = NULL; vaddr_t va, eva; pt_entry_t pte; @@ -640,6 +672,13 @@ pmap_bootstrap_pae(void) PDE(kpm, PDSLOT_PTE+2) = kpm->pm_pdidx[2] | PG_KW | PG_M | PG_U; PDE(kpm, PDSLOT_PTE+3) = kpm->pm_pdidx[3] | PG_KW | PG_M | PG_U; + /* allocate new special PD before transferring all mappings. */ + if (kpm->pm_pdir_intel) { + pd = (uint32_t *)kpm->pm_pdir_intel; + kpm->pm_pdir_intel = kpm->pm_pdirpa_intel = 0; + pmap_alloc_pdir_intel_pae(kpm); + } + /* transfer all kernel mappings over into pae tables */ for (va = KERNBASE, eva = va + (nkpde << PDSHIFT86); va < eva; va += PAGE_SIZE) { @@ -679,15 +718,12 @@ pmap_bootstrap_pae(void) } /* Transfer special mappings */ - if (kpm->pm_pdir_intel) { - uint32_t *pd, *ptp; + if (pd) { + uint32_t *ptp; uint32_t l1idx, l2idx; paddr_t npa; struct vm_page *ptppg; - pd = (uint32_t *)kpm->pm_pdir_intel; - kpm->pm_pdir_intel = kpm->pm_pdirpa_intel = 0; - for (va = KERNBASE, eva = va + (nkpde << PDSHIFT86); va < eva; va += PAGE_SIZE) { l1idx = ((va & PT_MASK86) >> PGSHIFT); @@ -775,7 +811,6 @@ pmap_bootstrap_pae(void) pmap_write_protect_p = pmap_write_protect_pae; pmap_pinit_pd_p = pmap_pinit_pd_pae; pmap_zero_phys_p = pmap_zero_phys_pae; - pmap_zero_page_uncached_p = pmap_zero_page_uncached_pae; pmap_copy_page_p = pmap_copy_page_pae; bzero((void *)kpm->pm_pdir + 8, (PDSLOT_PTE-1) * 8); @@ -939,7 +974,7 @@ pmap_pinit_pd_pae(struct pmap *pmap) pmap->pm_pdir = (vaddr_t)km_alloc(4 * NBPG, &kv_any, &kp_dirty, &kd_waitok); if (pmap->pm_pdir == 0) - panic("pmap_pinit_pd_pae: kernel_map out of virtual space!"); + panic("kernel_map out of virtual space"); /* page index is in the pmap! */ pmap_extract(pmap_kernel(), (vaddr_t)pmap, &pmap->pm_pdirpa); va = (vaddr_t)pmap->pm_pdir; @@ -988,25 +1023,7 @@ pmap_pinit_pd_pae(struct pmap *pmap) * execution, one that lacks all kernel mappings. */ if (cpu_meltdown) { - int i; - - va = (vaddr_t)km_alloc(4 * NBPG, &kv_any, &kp_zero, &kd_waitok); - if (va == 0) - panic("%s: kernel_map out of virtual space!", __func__); - if (!pmap_extract(pmap_kernel(), - (vaddr_t)&pmap->pm_pdidx_intel, &pmap->pm_pdirpa_intel)) - panic("%s: can't locate PDPT", __func__); - pmap->pm_pdir_intel = va; - - for (i = 0; i < 4; i++) { - pmap->pm_pdidx_intel[i] = 0; - if (!pmap_extract(pmap, va + i * NBPG, - (paddr_t *)&pmap->pm_pdidx_intel[i])) - panic("%s: can't locate PD page", __func__); - pmap->pm_pdidx_intel[i] |= PG_V; - DPRINTF("%s: pm_pdidx_intel[%d] = 0x%llx\n", __func__, - i, pmap->pm_pdidx_intel[i]); - } + pmap_alloc_pdir_intel_pae(pmap); /* Copy PDEs from pmap_kernel's U-K view */ bcopy((void *)pmap_kernel()->pm_pdir_intel, @@ -1016,9 +1033,6 @@ pmap_pinit_pd_pae(struct pmap *pmap) "pdir_intel 0x%lx pdirpa_intel 0x%lx\n", __func__, pmap, pmap->pm_pdir, pmap->pm_pdirpa, pmap->pm_pdir_intel, pmap->pm_pdirpa_intel); - } else { - pmap->pm_pdir_intel = 0; - pmap->pm_pdirpa_intel = 0; } mtx_enter(&pmaps_lock); @@ -1079,32 +1093,6 @@ pmap_zero_phys_pae(paddr_t pa) *zpte = 0; } -/* - * pmap_zero_page_uncached: the same, except uncached. - */ - -int -pmap_zero_page_uncached_pae(paddr_t pa) -{ -#ifdef MULTIPROCESSOR - int id = cpu_number(); -#endif - pt_entry_t *zpte = PTESLEW(zero_pte, id); - caddr_t zerova = VASLEW(pmap_zerop, id); - -#ifdef DIAGNOSTIC - if (*zpte) - panic("pmap_zero_page_uncached_pae: lock botch"); -#endif - - *zpte = (pa & PG_FRAME) | PG_V | PG_RW | PG_N; /* map in */ - pmap_update_pg((vaddr_t)zerova); /* flush TLB */ - pagezero(zerova, PAGE_SIZE); /* zero */ - *zpte = 0; - - return 1; -} - /* * pmap_copy_page: copy a page */ @@ -1359,7 +1347,7 @@ pmap_page_remove_pae(struct vm_page *pg) pm = pve->pv_pmap; mtx_leave(&pg->mdpage.pv_mtx); - ptes = pmap_map_ptes_pae(pve->pv_pmap); /* locks pmap */ + ptes = pmap_map_ptes_pae(pm); /* locks pmap */ /* * We dropped the pvlist lock before grabbing the pmap @@ -1903,13 +1891,11 @@ void pmap_enter_special_pae(vaddr_t va, paddr_t pa, vm_prot_t prot, u_int32_t flags) { struct pmap *pmap = pmap_kernel(); - struct vm_page *ptppg = NULL, *pdppg; + struct vm_page *ptppg = NULL; pd_entry_t *pd, *ptp; pt_entry_t *ptes; uint32_t l2idx, l1idx; - vaddr_t vapd; paddr_t npa; - int i; /* If CPU is secure, no need to do anything */ if (!cpu_meltdown) @@ -1917,36 +1903,9 @@ pmap_enter_special_pae(vaddr_t va, paddr_t pa, vm_prot_t prot, u_int32_t flags) /* Must be kernel VA */ if (va < VM_MIN_KERNEL_ADDRESS) - panic("%s: invalid special mapping va 0x%lx requested", - __func__, va); + panic("invalid special mapping va 0x%lx requested", va); - if (!pmap->pm_pdir_intel) { - if ((vapd = uvm_km_zalloc(kernel_map, 4 * NBPG)) == 0) - panic("%s: kernel_map out of virtual space!", __func__); - pmap->pm_pdir_intel = vapd; - if (!pmap_extract(pmap, (vaddr_t)&pmap->pm_pdidx_intel, - &pmap->pm_pdirpa_intel)) - panic("%s: can't locate PDPT", __func__); - - for (i = 0; i < 4; i++) { - pmap->pm_pdidx_intel[i] = 0; - if (!pmap_extract(pmap, vapd + i*NBPG, - (paddr_t *)&pmap->pm_pdidx_intel[i])) - panic("%s: can't locate PD page", __func__); - - /* ensure PDPs are wired down XXX hshoexer why? */ - pdppg = PHYS_TO_VM_PAGE(pmap->pm_pdidx_intel[i]); - if (pdppg == NULL) - panic("%s: no vm_page for pdidx %d", __func__, i); - atomic_clearbits_int(&pdppg->pg_flags, PG_BUSY); - pdppg->wire_count = 1; /* no mappings yet */ - - pmap->pm_pdidx_intel[i] |= PG_V; - - DPRINTF("%s: pm_pdidx_intel[%d] = 0x%llx\n", __func__, - i, pmap->pm_pdidx_intel[i]); - } - } + KASSERT(pmap->pm_pdir_intel != 0); DPRINTF("%s: pm_pdir_intel 0x%x pm_pdirpa_intel 0x%x\n", __func__, (uint32_t)pmap->pm_pdir_intel, (uint32_t)pmap->pm_pdirpa_intel); diff --git a/sys/arch/i386/include/cpuvar.h b/sys/arch/i386/include/cpuvar.h index dbb3e0dfa..cc82a7498 100644 --- a/sys/arch/i386/include/cpuvar.h +++ b/sys/arch/i386/include/cpuvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cpuvar.h,v 1.7 2016/07/28 21:57:57 kettenis Exp $ */ +/* $OpenBSD: cpuvar.h,v 1.8 2024/10/21 03:07:54 jsg Exp $ */ /* $NetBSD: cpuvar.h,v 1.1.2.3 2000/02/21 18:54:07 sommerfeld Exp $ */ /*- @@ -86,8 +86,6 @@ struct cpu_attach_args { int feature_flags; }; -#define MP_PICMODE 0x00000001 /* System booted in picmode */ - #ifdef _KERNEL void i386_ipi(int,int,int); diff --git a/sys/arch/i386/include/i82093var.h b/sys/arch/i386/include/i82093var.h index dd05bdd32..81d27bffa 100644 --- a/sys/arch/i386/include/i82093var.h +++ b/sys/arch/i386/include/i82093var.h @@ -1,4 +1,4 @@ -/* $OpenBSD: i82093var.h,v 1.12 2024/05/22 05:51:49 jsg Exp $ */ +/* $OpenBSD: i82093var.h,v 1.13 2024/10/22 21:50:02 jsg Exp $ */ /* $NetBSD: i82093var.h,v 1.1 2003/02/26 21:26:10 fvdl Exp $ */ /*- @@ -37,8 +37,7 @@ #include -struct ioapic_pin -{ +struct ioapic_pin { struct intrhand *ip_handler; struct ioapic_pin *ip_next; /* next pin on this vector */ struct mp_intr_map *ip_map; diff --git a/sys/arch/i386/include/intrdefs.h b/sys/arch/i386/include/intrdefs.h index 8b0094475..9de834128 100644 --- a/sys/arch/i386/include/intrdefs.h +++ b/sys/arch/i386/include/intrdefs.h @@ -1,4 +1,4 @@ -/* $OpenBSD: intrdefs.h,v 1.18 2020/09/13 11:53:16 jsg Exp $ */ +/* $OpenBSD: intrdefs.h,v 1.19 2024/11/08 00:13:39 jsg Exp $ */ /* $NetBSD: intrdefs.h,v 1.2 2003/05/04 22:01:56 fvdl Exp $ */ #ifndef _I386_INTRDEFS_H @@ -120,11 +120,6 @@ #define I386_NIPI 9 -#define I386_IPI_NAMES { "halt IPI", "nop IPI", "FPU flush IPI", \ - "FPU synch IPI", \ - "MTRR update IPI", "GDT update IPI", \ - "DDB IPI", "setperf IPI", "wbinvd IPI" } - #define IREENT_MAGIC 0x18041969 #endif /* _I386_INTRDEFS_H */ diff --git a/sys/arch/i386/include/mpbiosvar.h b/sys/arch/i386/include/mpbiosvar.h index 1528906aa..1383c49f2 100644 --- a/sys/arch/i386/include/mpbiosvar.h +++ b/sys/arch/i386/include/mpbiosvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: mpbiosvar.h,v 1.12 2016/05/18 03:45:11 mlarkin Exp $ */ +/* $OpenBSD: mpbiosvar.h,v 1.13 2024/10/22 21:50:02 jsg Exp $ */ /* $NetBSD: mpbiosvar.h,v 1.1.2.3 2000/02/29 13:17:20 sommerfeld Exp $ */ /*- @@ -43,8 +43,7 @@ #include -struct mp_bus -{ +struct mp_bus { char *mb_name; /* XXX bus name */ int mb_idx; /* XXX bus index */ void (*mb_intr_print) (int); @@ -53,8 +52,7 @@ struct mp_bus u_int32_t mb_data; /* random bus-specific datum. */ }; -struct mp_intr_map -{ +struct mp_intr_map { struct mp_intr_map *next; struct mp_bus *bus; int bus_pin; diff --git a/sys/arch/i386/include/pmap.h b/sys/arch/i386/include/pmap.h index 4433283cb..dd27fab42 100644 --- a/sys/arch/i386/include/pmap.h +++ b/sys/arch/i386/include/pmap.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap.h,v 1.95 2024/06/18 12:37:29 jsg Exp $ */ +/* $OpenBSD: pmap.h,v 1.96 2024/11/08 13:18:29 jsg Exp $ */ /* $NetBSD: pmap.h,v 1.44 2000/04/24 17:18:18 thorpej Exp $ */ /* @@ -276,7 +276,6 @@ extern void (*pmap_unwire_p)(struct pmap *, vaddr_t); extern void (*pmap_write_protect_p)(struct pmap*, vaddr_t, vaddr_t, vm_prot_t); extern void (*pmap_pinit_pd_p)(pmap_t); extern void (*pmap_zero_phys_p)(paddr_t); -extern int (*pmap_zero_page_uncached_p)(paddr_t); extern void (*pmap_copy_page_p)(struct vm_page *, struct vm_page *); u_int32_t pmap_pte_set_pae(vaddr_t, paddr_t, u_int32_t); @@ -295,7 +294,6 @@ void pmap_unwire_pae(struct pmap *, vaddr_t); void pmap_write_protect_pae(struct pmap *, vaddr_t, vaddr_t, vm_prot_t); void pmap_pinit_pd_pae(pmap_t); void pmap_zero_phys_pae(paddr_t); -int pmap_zero_page_uncached_pae(paddr_t); void pmap_copy_page_pae(struct vm_page *, struct vm_page *); #define pmap_pte_set (*pmap_pte_set_p) @@ -310,7 +308,6 @@ void pmap_copy_page_pae(struct vm_page *, struct vm_page *); #define pmap_write_protect (*pmap_write_protect_p) #define pmap_pinit_pd (*pmap_pinit_pd_p) #define pmap_zero_phys (*pmap_zero_phys_p) -#define pmap_zero_page_uncached (*pmap_zero_page_uncached_p) #define pmap_copy_page (*pmap_copy_page_p) u_int32_t pmap_pte_set_86(vaddr_t, paddr_t, u_int32_t); @@ -329,7 +326,6 @@ void pmap_unwire_86(struct pmap *, vaddr_t); void pmap_write_protect_86(struct pmap *, vaddr_t, vaddr_t, vm_prot_t); void pmap_pinit_pd_86(pmap_t); void pmap_zero_phys_86(paddr_t); -int pmap_zero_page_uncached_86(paddr_t); void pmap_copy_page_86(struct vm_page *, struct vm_page *); void pmap_tlb_shootpage(struct pmap *, vaddr_t); void pmap_tlb_shootrange(struct pmap *, vaddr_t, vaddr_t); @@ -362,11 +358,6 @@ void pmap_flush_page_pae(paddr_t); #define PMAP_GROWKERNEL /* turn on pmap_growkernel interface */ -/* - * Do idle page zero'ing uncached to avoid polluting the cache. - */ -#define PMAP_PAGEIDLEZERO(pg) pmap_zero_page_uncached(VM_PAGE_TO_PHYS(pg)) - /* * Inline functions */ diff --git a/sys/arch/i386/stand/boot/boot.8 b/sys/arch/i386/stand/boot/boot.8 index 6d15b9d58..aec14f5ac 100644 --- a/sys/arch/i386/stand/boot/boot.8 +++ b/sys/arch/i386/stand/boot/boot.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: boot.8,v 1.68 2023/02/23 19:48:22 miod Exp $ +.\" $OpenBSD: boot.8,v 1.69 2024/11/05 09:42:48 miod Exp $ .\" .\" Copyright (c) 1997-2001 Michael Shalayeff .\" All rights reserved. @@ -25,7 +25,7 @@ .\" THE POSSIBILITY OF SUCH DAMAGE. .\" .\" -.Dd $Mdocdate: February 23 2023 $ +.Dd $Mdocdate: November 5 2024 $ .Dt BOOT 8 i386 .Os .Sh NAME @@ -67,7 +67,8 @@ If time expires, the kernel will be loaded according to the current variable settings (see the .Ic set command). -Each time a kernel load fails, the timeout is increased by one second. +If the kernel load fails, a second attempt is made with the timeout increased +by one second. The sequence of .Nm operations is as follows: diff --git a/sys/arch/i386/stand/libsa/memprobe.c b/sys/arch/i386/stand/libsa/memprobe.c index 07743d16e..77051b03b 100644 --- a/sys/arch/i386/stand/libsa/memprobe.c +++ b/sys/arch/i386/stand/libsa/memprobe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: memprobe.c,v 1.57 2016/06/10 18:36:06 jcs Exp $ */ +/* $OpenBSD: memprobe.c,v 1.58 2024/11/18 02:32:22 mlarkin Exp $ */ /* * Copyright (c) 1997-1999 Michael Shalayeff @@ -100,7 +100,7 @@ bios_E820(bios_memmap_t *mp) /* * BIOS int 15, AX=8800 * - * Only used if int 15, AX=E801 does not work. + * Only used if int 15, AX=E820 does not work. * Machines with this are restricted to 64MB. */ static __inline bios_memmap_t * diff --git a/sys/arch/i386/stand/mbr/mbr.S b/sys/arch/i386/stand/mbr/mbr.S index 9fd236841..2b3587bdf 100644 --- a/sys/arch/i386/stand/mbr/mbr.S +++ b/sys/arch/i386/stand/mbr/mbr.S @@ -1,4 +1,4 @@ -/* $OpenBSD: mbr.S,v 1.27 2022/09/02 07:46:03 krw Exp $ */ +/* $OpenBSD: mbr.S,v 1.28 2024/11/18 02:32:22 mlarkin Exp $ */ /* * Copyright (c) 1997 Michael Shalayeff and Tobias Weingartner @@ -99,7 +99,7 @@ start: /* * We don't need to disable and re-enable interrupts around the - * the load of ss and sp. + * load of ss and sp. * * From 80386 Programmer's Reference Manual: * "A MOV into SS inhibits all interrupts until after the execution diff --git a/sys/conf/files b/sys/conf/files index 98c386352..124866f2c 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -1,4 +1,4 @@ -# $OpenBSD: files,v 1.740 2024/09/14 11:06:48 jsg Exp $ +# $OpenBSD: files,v 1.742 2024/12/15 11:00:05 dlg Exp $ # $NetBSD: files,v 1.87 1996/05/19 17:17:50 jonathan Exp $ # @(#)files.newconf 7.5 (Berkeley) 5/10/93 @@ -601,6 +601,9 @@ pseudo-device pppx: ifnet pseudo-device vxlan: ifnet, ether, etherbridge pseudo-device wg: ifnet +pseudo-device af_frame +file net/af_frame.c af_frame needs-flag + pseudo-device ksyms file dev/ksyms.c ksyms needs-flag @@ -610,6 +613,7 @@ file dev/kstat.c kstat needs-flag pseudo-device fuse file miscfs/fuse/fuse_device.c fuse needs-flag file miscfs/fuse/fuse_file.c fuse +file miscfs/fuse/fuse_ihash.c fuse file miscfs/fuse/fuse_lookup.c fuse file miscfs/fuse/fuse_vfsops.c fuse file miscfs/fuse/fuse_vnops.c fuse diff --git a/sys/conf/swapgeneric.c b/sys/conf/swapgeneric.c index a47c541db..0fc74aee5 100644 --- a/sys/conf/swapgeneric.c +++ b/sys/conf/swapgeneric.c @@ -1,4 +1,4 @@ -/* $OpenBSD: swapgeneric.c,v 1.4 2013/04/19 15:02:41 florian Exp $ */ +/* $OpenBSD: swapgeneric.c,v 1.6 2024/10/30 07:28:17 jsg Exp $ */ /* $NetBSD: swapgeneric.c,v 1.12 1996/05/03 19:42:28 christos Exp $ */ /*- @@ -40,14 +40,13 @@ */ #include -#include int (*mountroot)(void) = NULL; /* tells autoconf.c that we are "generic" */ dev_t rootdev = NODEV; dev_t dumpdev = NODEV; -struct swdevt swdevt[] = { - { NODEV, 0 }, /* to be filled in */ - { NODEV, 0 } +dev_t swdevt[] = { + NODEV, /* to be filled in */ + NODEV }; diff --git a/sys/ddb/db_break.c b/sys/ddb/db_break.c index bf5253d1d..488c682f5 100644 --- a/sys/ddb/db_break.c +++ b/sys/ddb/db_break.c @@ -1,4 +1,4 @@ -/* $OpenBSD: db_break.c,v 1.23 2023/03/08 04:43:07 guenther Exp $ */ +/* $OpenBSD: db_break.c,v 1.24 2024/11/05 10:19:11 miod Exp $ */ /* $NetBSD: db_break.c,v 1.7 1996/03/30 22:30:03 christos Exp $ */ /* @@ -248,7 +248,7 @@ db_delete_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) void db_breakpoint_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) { - if (count == -1) + if (count < 1) count = 1; db_set_breakpoint((vaddr_t)addr, count); diff --git a/sys/ddb/db_command.c b/sys/ddb/db_command.c index 1e129c2e0..67f09e820 100644 --- a/sys/ddb/db_command.c +++ b/sys/ddb/db_command.c @@ -1,4 +1,4 @@ -/* $OpenBSD: db_command.c,v 1.102 2024/09/05 08:52:27 bluhm Exp $ */ +/* $OpenBSD: db_command.c,v 1.103 2024/11/07 16:02:29 miod Exp $ */ /* $NetBSD: db_command.c,v 1.20 1996/03/30 22:30:05 christos Exp $ */ /* @@ -895,7 +895,7 @@ db_show_regs(db_expr_t addr, int have_addr, db_expr_t count, char *modif) { struct db_variable *regp; db_expr_t value, offset; - char * name; + const char * name; char tmpfmt[28]; for (regp = db_regs; regp < db_eregs; regp++) { diff --git a/sys/ddb/db_ctf.c b/sys/ddb/db_ctf.c index 4a490e935..a6b74f7b4 100644 --- a/sys/ddb/db_ctf.c +++ b/sys/ddb/db_ctf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: db_ctf.c,v 1.34 2024/02/22 13:49:17 claudio Exp $ */ +/* $OpenBSD: db_ctf.c,v 1.35 2024/11/07 16:02:29 miod Exp $ */ /* * Copyright (c) 2016-2017 Martin Pieuchot @@ -45,7 +45,7 @@ struct ddb_ctf { size_t rawctflen; /* raw .SUNW_ctf section size */ const char *data; /* decompressed CTF data */ size_t dlen; /* decompressed CTF data size */ - char *strtab; /* ELF string table */ + const char *strtab; /* ELF string table */ uint32_t ctf_found; }; diff --git a/sys/ddb/db_elf.c b/sys/ddb/db_elf.c index 6b9281bbf..85b44e8dd 100644 --- a/sys/ddb/db_elf.c +++ b/sys/ddb/db_elf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: db_elf.c,v 1.33 2024/09/04 07:54:52 mglocker Exp $ */ +/* $OpenBSD: db_elf.c,v 1.34 2024/11/07 16:02:29 miod Exp $ */ /* $NetBSD: db_elf.c,v 1.13 2000/07/07 21:55:18 jhawk Exp $ */ /*- @@ -46,7 +46,7 @@ db_symtab_t db_symtab; -Elf_Sym *db_elf_sym_lookup(char *); +Elf_Sym *db_elf_sym_lookup(const char *); /* * Find the symbol table and strings; tell ddb about them. @@ -185,20 +185,21 @@ db_elf_sym_init(int symsize, void *symtab, void *esymtab, const char *name) * Internal helper function - return a pointer to the string table * for the current symbol table. */ -char * +const char * db_elf_find_strtab(db_symtab_t *stab) { Elf_Ehdr *elf = STAB_TO_EHDR(stab); Elf_Shdr *shp = STAB_TO_SHDR(stab, elf); - char *shstrtab; + const char *shstrtab; int i; - shstrtab = (char *)elf + shp[elf->e_shstrndx].sh_offset; + shstrtab = (const char *)elf + shp[elf->e_shstrndx].sh_offset; for (i = 0; i < elf->e_shnum; i++) { if (shp[i].sh_type == SHT_SYMTAB) - return ((char *)elf + shp[shp[i].sh_link].sh_offset); + return ((const char *)elf + + shp[shp[i].sh_link].sh_offset); if (strcmp(".strtab", shstrtab+shp[i].sh_name) == 0) - return ((char *)elf + shp[i].sh_offset); + return ((const char *)elf + shp[i].sh_offset); } return (NULL); @@ -232,11 +233,11 @@ db_elf_find_section(db_symtab_t *stab, size_t *size, const char *sname) * Lookup the symbol with the given name. */ Elf_Sym * -db_elf_sym_lookup(char *symstr) +db_elf_sym_lookup(const char *symstr) { db_symtab_t *stab = &db_symtab; Elf_Sym *symp, *symtab_start, *symtab_end; - char *strtab; + const char *strtab; if (stab->private == NULL) return (NULL); @@ -328,11 +329,11 @@ db_elf_sym_search(vaddr_t off, db_strategy_t strategy, db_expr_t *diffp) * Return the name and value for a symbol. */ void -db_symbol_values(Elf_Sym *sym, char **namep, db_expr_t *valuep) +db_symbol_values(Elf_Sym *sym, const char **namep, db_expr_t *valuep) { db_symtab_t *stab = &db_symtab; Elf_Sym *symp = (Elf_Sym *)sym; - char *strtab; + const char *strtab; if (sym == NULL) { *namep = NULL; @@ -359,7 +360,7 @@ db_symbol_values(Elf_Sym *sym, char **namep, db_expr_t *valuep) * if we can find the appropriate debugging symbol. */ int -db_elf_line_at_pc(Elf_Sym *cursym, char **filename, +db_elf_line_at_pc(Elf_Sym *cursym, const char **filename, int *linenum, db_expr_t off) { db_symtab_t *stab = &db_symtab; @@ -390,7 +391,7 @@ void db_elf_sym_forall(db_forall_func_t db_forall_func, void *arg) { db_symtab_t *stab = &db_symtab; - char *strtab; + const char *strtab; static char suffix[2]; Elf_Sym *symp, *symtab_start, *symtab_end; @@ -424,12 +425,12 @@ db_elf_sym_forall(db_forall_func_t db_forall_func, void *arg) suffix[0] = '\0'; } (*db_forall_func)(symp, - strtab + symp->st_name, suffix, 0, arg); + strtab + symp->st_name, suffix, arg); } } Elf_Sym * -db_symbol_by_name(char *name, db_expr_t *valuep) +db_symbol_by_name(const char *name, db_expr_t *valuep) { Elf_Sym *sym; diff --git a/sys/ddb/db_elf.h b/sys/ddb/db_elf.h index 30fcd3c54..f748b4992 100644 --- a/sys/ddb/db_elf.h +++ b/sys/ddb/db_elf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: db_elf.h,v 1.2 2017/05/28 11:41:52 mpi Exp $ */ +/* $OpenBSD: db_elf.h,v 1.3 2024/11/07 16:02:29 miod Exp $ */ /* $NetBSD: db_elf.c,v 1.13 2000/07/07 21:55:18 jhawk Exp $ */ /*- @@ -44,5 +44,5 @@ typedef struct { #define STAB_TO_EHDR(stab) ((Elf_Ehdr *)((stab)->private)) #define STAB_TO_SHDR(stab, e) ((Elf_Shdr *)((stab)->private + (e)->e_shoff)) -char *db_elf_find_strtab(db_symtab_t *); +const char *db_elf_find_strtab(db_symtab_t *); const char *db_elf_find_section(db_symtab_t *, size_t *, const char *); diff --git a/sys/ddb/db_hangman.c b/sys/ddb/db_hangman.c index e73bd032f..41594328a 100644 --- a/sys/ddb/db_hangman.c +++ b/sys/ddb/db_hangman.c @@ -1,4 +1,4 @@ -/* $OpenBSD: db_hangman.c,v 1.38 2020/10/15 03:14:00 deraadt Exp $ */ +/* $OpenBSD: db_hangman.c,v 1.39 2024/11/07 16:02:29 miod Exp $ */ /* * Copyright (c) 1996 Theo de Raadt, Michael Shalayeff @@ -49,7 +49,7 @@ struct _abc { #define ISLOWALPHA(c) ('a'<=(c) && (c)<='z') #define ISALPHA(c) ISLOWALPHA(TOLOWER(c)) -void db_hang(int, char *, struct _abc *); +void db_hang(int, const char *, struct _abc *); u_long db_plays, db_guesses; @@ -72,10 +72,10 @@ struct db_hang_forall_arg { /* * Horrible abuse of the forall function, but we're not in a hurry. */ -static void db_hang_forall(Elf_Sym *, char *, char *, int, void *); +static void db_hang_forall(Elf_Sym *, const char *, const char *, void *); static void -db_hang_forall(Elf_Sym *sym, char *name, char *suff, int pre, void *varg) +db_hang_forall(Elf_Sym *sym, const char *name, const char *suff, void *varg) { struct db_hang_forall_arg *arg = varg; @@ -83,11 +83,11 @@ db_hang_forall(Elf_Sym *sym, char *name, char *suff, int pre, void *varg) arg->sym = sym; } -static __inline char * +static __inline const char * db_randomsym(size_t *lenp) { int nsyms; - char *p, *q; + const char *p, *q; struct db_hang_forall_arg dfa; dfa.cnt = 0; @@ -111,7 +111,7 @@ db_randomsym(size_t *lenp) } void -db_hang(int tries, char *word, struct _abc *sabc) +db_hang(int tries, const char *word, struct _abc *sabc) { const char *p; int i; @@ -152,7 +152,7 @@ db_hang(int tries, char *word, struct _abc *sabc) void db_hangman(db_expr_t addr, int haddr, db_expr_t count, char *modif) { - char *word; + const char *word; size_t tries; size_t len; struct _abc sabc[1]; @@ -179,7 +179,7 @@ db_hangman(db_expr_t addr, int haddr, db_expr_t count, char *modif) c = TOLOWER(c); if (ISLOWALPHA(c) && ABC_ISCLR(c)) { - char *p; + const char *p; size_t n; /* strchr(word,c) */ @@ -200,7 +200,7 @@ db_hangman(db_expr_t addr, int haddr, db_expr_t count, char *modif) continue; if (!tries && skill > 2) { - char *p = word; + const char *p = word; for (; *p; p++) if (ISALPHA(*p)) ABC_SETRIGHT(TOLOWER(*p)); diff --git a/sys/ddb/db_run.c b/sys/ddb/db_run.c index b34a8a065..2247549bc 100644 --- a/sys/ddb/db_run.c +++ b/sys/ddb/db_run.c @@ -1,4 +1,4 @@ -/* $OpenBSD: db_run.c,v 1.31 2023/03/08 04:43:07 guenther Exp $ */ +/* $OpenBSD: db_run.c,v 1.32 2024/11/05 10:19:11 miod Exp $ */ /* $NetBSD: db_run.c,v 1.8 1996/02/05 01:57:12 christos Exp $ */ /* @@ -98,6 +98,8 @@ db_stop_at_pc(db_regs_t *regs, int *is_breakpoint) bkpt->count = bkpt->init_count; *is_breakpoint = 1; return 1; /* stop here */ + } else { + return 0; /* continue */ } } else if (*is_breakpoint #ifdef SOFTWARE_SSTEP diff --git a/sys/ddb/db_sym.c b/sys/ddb/db_sym.c index 376c01cf4..1e8dade9f 100644 --- a/sys/ddb/db_sym.c +++ b/sys/ddb/db_sym.c @@ -1,4 +1,4 @@ -/* $OpenBSD: db_sym.c,v 1.56 2021/07/09 20:59:17 jasper Exp $ */ +/* $OpenBSD: db_sym.c,v 1.57 2024/11/07 16:02:29 miod Exp $ */ /* $NetBSD: db_sym.c,v 1.24 2000/08/11 22:50:47 tv Exp $ */ /* @@ -82,7 +82,7 @@ ddb_init(void) } int -db_eqname(char *src, char *dst, int c) +db_eqname(const char *src, const char *dst, int c) { if (!strcmp(src, dst)) return (1); @@ -139,8 +139,8 @@ db_printsym(db_expr_t off, db_strategy_t strategy, int (*pr)(const char *, ...)) { db_expr_t d; - char *filename; - char *name; + const char *filename; + const char *name; db_expr_t value; int linenum; Elf_Sym *cursym; diff --git a/sys/ddb/db_sym.h b/sys/ddb/db_sym.h index c8daa9831..80e3bb931 100644 --- a/sys/ddb/db_sym.h +++ b/sys/ddb/db_sym.h @@ -51,27 +51,26 @@ typedef int db_strategy_t; /* search strategy */ /* * Internal db_forall function calling convention: * - * (*db_forall_func)(stab, sym, name, suffix, prefix, arg); + * (*db_forall_func)(sym, name, suffix, arg); * - * stab is the symbol table, symbol the (opaque) symbol pointer, - * name the name of the symbol, suffix a string representing - * the type, prefix an initial ignorable function prefix (e.g. "_" - * in a.out), and arg an opaque argument to be passed in. + * symbol is the (opaque) symbol pointer, name the name of the symbol, + * suffix a string representing the type, and arg an opaque argument to + * be passed in. */ -typedef void (db_forall_func_t)(Elf_Sym *, char *, char *, int, void *); +typedef void (db_forall_func_t)(Elf_Sym *, const char *, const char *, void *); extern unsigned int db_maxoff; /* like gdb's "max-symbolic-offset" */ -int db_eqname(char *, char *, int); +int db_eqname(const char *, const char *, int); /* strcmp, modulo leading char */ -Elf_Sym * db_symbol_by_name(char *, db_expr_t *); +Elf_Sym * db_symbol_by_name(const char *, db_expr_t *); /* find symbol value given name */ Elf_Sym * db_search_symbol(vaddr_t, db_strategy_t, db_expr_t *); /* find symbol given value */ -void db_symbol_values(Elf_Sym *, char **, db_expr_t *); +void db_symbol_values(Elf_Sym *, const char **, db_expr_t *); /* return name and value of symbol */ #define db_find_sym_and_offset(val,namep,offp) \ @@ -87,7 +86,7 @@ void db_printsym(db_expr_t, db_strategy_t, int (*)(const char *, ...)); int db_elf_sym_init(int, void *, void *, const char *); Elf_Sym * db_elf_sym_search(vaddr_t, db_strategy_t, db_expr_t *); -int db_elf_line_at_pc(Elf_Sym *, char **, int *, db_expr_t); +int db_elf_line_at_pc(Elf_Sym *, const char **, int *, db_expr_t); void db_elf_sym_forall(db_forall_func_t db_forall_func, void *); bool db_dwarf_line_at_pc(const char *, size_t, uintptr_t, diff --git a/sys/dev/acpi/acpi_apm.c b/sys/dev/acpi/acpi_apm.c index c10e9d860..34588d350 100644 --- a/sys/dev/acpi/acpi_apm.c +++ b/sys/dev/acpi/acpi_apm.c @@ -1,4 +1,4 @@ -/* $OpenBSD: acpi_apm.c,v 1.3 2023/08/06 14:30:08 tobhe Exp $ */ +/* $OpenBSD: acpi_apm.c,v 1.4 2024/10/30 06:16:27 jsg Exp $ */ /* * Copyright (c) 2005 Thorsten Lockert * Copyright (c) 2005 Jordan Hargrave @@ -138,7 +138,7 @@ acpiioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) error = EBADF; break; } - if (get_hibernate_io_function(swdevt[0].sw_dev) == NULL) { + if (get_hibernate_io_function(swdevt[0]) == NULL) { error = EOPNOTSUPP; break; } @@ -225,7 +225,7 @@ request_sleep(int sleepmode) #ifdef HIBERNATE if (sleepmode == SLEEP_HIBERNATE) { - if (get_hibernate_io_function(swdevt[0].sw_dev) == NULL) + if (get_hibernate_io_function(swdevt[0]) == NULL) return EOPNOTSUPP; } #endif diff --git a/sys/dev/acpi/acpicpu.c b/sys/dev/acpi/acpicpu.c index f46ff68a8..03fe5bef0 100644 --- a/sys/dev/acpi/acpicpu.c +++ b/sys/dev/acpi/acpicpu.c @@ -1,4 +1,4 @@ -/* $OpenBSD: acpicpu.c,v 1.94 2024/07/14 14:04:16 jmatthew Exp $ */ +/* $OpenBSD: acpicpu.c,v 1.95 2024/10/22 21:50:02 jsg Exp $ */ /* * Copyright (c) 2005 Marco Peereboom * Copyright (c) 2015 Philip Guenther @@ -101,8 +101,7 @@ void acpicpu_setperf_ppc_change(struct acpicpu_pss *, int); /* Make sure throttling bits are valid,a=addr,o=offset,w=width */ #define valid_throttle(o,w,a) (a && w && (o+w)<=31 && (o>4 || (o+w)<=4)) -struct acpi_cstate -{ +struct acpi_cstate { SLIST_ENTRY(acpi_cstate) link; u_short state; diff --git a/sys/dev/acpi/acpidmar.h b/sys/dev/acpi/acpidmar.h index 0c8b128b3..775fb689b 100644 --- a/sys/dev/acpi/acpidmar.h +++ b/sys/dev/acpi/acpidmar.h @@ -408,8 +408,7 @@ context_set_user(struct context_entry *ce, int v) * 126 = Type (0 = Read, 1 = Write) * 127 = Fault bit */ -struct fault_entry -{ +struct fault_entry { uint64_t lo; uint64_t hi; }; diff --git a/sys/dev/acpi/dsdt.c b/sys/dev/acpi/dsdt.c index 78b10be0e..11264a286 100644 --- a/sys/dev/acpi/dsdt.c +++ b/sys/dev/acpi/dsdt.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dsdt.c,v 1.271 2024/09/20 02:00:46 jsg Exp $ */ +/* $OpenBSD: dsdt.c,v 1.272 2024/12/24 12:06:34 mglocker Exp $ */ /* * Copyright (c) 2005 Jordan Hargrave * @@ -2574,6 +2574,7 @@ aml_rwgsb(struct aml_value *conn, int len, int bpos, int blen, buflen = len; break; case 0x0e: /* AttribRawBytes */ + case 0x0f: /* AttribRawProcessBytes */ cmdlen = 0; buflen = len; break; @@ -2664,6 +2665,7 @@ aml_rwgsb(struct aml_value *conn, int len, int bpos, int blen, break; case 0x0b: /* AttribBytes */ case 0x0e: /* AttribRawBytes */ + case 0x0f: /* AttribRawProcessBytes */ buflen = len; break; default: diff --git a/sys/dev/acpi/qcgpio.c b/sys/dev/acpi/qcgpio.c index bf2a6af57..51a3846e9 100644 --- a/sys/dev/acpi/qcgpio.c +++ b/sys/dev/acpi/qcgpio.c @@ -1,4 +1,4 @@ -/* $OpenBSD: qcgpio.c,v 1.11 2024/07/15 15:33:54 mglocker Exp $ */ +/* $OpenBSD: qcgpio.c,v 1.13 2024/12/22 21:55:20 mglocker Exp $ */ /* * Copyright (c) 2022 Mark Kettenis * @@ -25,6 +25,14 @@ #include #include +//#define QCGPIO_DEBUG +#ifdef QCGPIO_DEBUG +int qcgpio_debug = 1; +#define DPRINTF(l, x...) do { if ((l) <= qcgpio_debug) printf(x); } while (0) +#else +#define DPRINTF(l, x...) +#endif + /* Registers. */ #define TLMM_GPIO_IN_OUT(pin) (0x0004 + 0x1000 * (pin)) #define TLMM_GPIO_IN_OUT_GPIO_IN (1 << 0) @@ -62,6 +70,11 @@ struct qcgpio_intrhand { void *ih_arg; }; +struct qcgpio_pdcmap { + int pm_pin; + uint32_t pm_irq; +}; + struct qcgpio_softc { struct device sc_dev; struct acpi_softc *sc_acpi; @@ -73,10 +86,15 @@ struct qcgpio_softc { void *sc_ih; uint32_t sc_npins; - int (*sc_pin_map)(int, bus_size_t *); + int (*sc_pin_map)(struct qcgpio_softc *, int, + bus_size_t *); struct qcgpio_intrhand *sc_pin_ih; struct acpi_gpio sc_gpio; + + struct qcgpio_pdcmap *sc_pdcmap; + uint32_t sc_npdcmap; + uint32_t sc_ipdcmap; }; int qcgpio_acpi_match(struct device *, void *, void *); @@ -97,9 +115,29 @@ const char *qcgpio_hids[] = { NULL }; -int qcgpio_sc7180_pin_map(int, bus_size_t *); -int qcgpio_sc8280xp_pin_map(int, bus_size_t *); -int qcgpio_x1e80100_pin_map(int, bus_size_t *); +/* 98b9b2a4-1663-4a5f-82f2-c6c99a394726 */ +static uint8_t qcgpio_gpio_dsm_uuid[] = { + 0xa4, 0xb2, 0xb9, 0x98, 0x63, 0x16, 0x5f, 0x4a, + 0x82, 0xf2, 0xc6, 0xc9, 0x9a, 0x39, 0x47, 0x26 +}; +#define QCGPIO_GPIO_DSM_REV 0 +#define QCGPIO_GPIO_DSM_FUNC_NUM_PINS 2 + +/* 921b0fd4-567c-43a0-bb14-2648f7b2a18c */ +static uint8_t qcgpio_pdc_dsm_uuid[] = { + 0xd4, 0x0f, 0x1b, 0x92, 0x7c, 0x56, 0xa0, 0x43, + 0xbb, 0x14, 0x26, 0x48, 0xf7, 0xb2, 0xa1, 0x8c +}; +#define QCGPIO_PDC_DSM_REV 0 +#define QCGPIO_PDC_DSM_FUNC_CIPR 2 + +int qcgpio_get_nirq(int, union acpi_resource *, void *); +int qcgpio_get_irqs(int, union acpi_resource *, void *); +void qcgpio_fill_pdcmap(struct qcgpio_softc *); +int qcgpio_get_pin_count(struct acpi_softc *, struct aml_node *); +int qcgpio_sc7180_pin_map(struct qcgpio_softc *, int, bus_size_t *); +int qcgpio_sc8280xp_pin_map(struct qcgpio_softc *, int, bus_size_t *); +int qcgpio_x1e80100_pin_map(struct qcgpio_softc *, int, bus_size_t *); int qcgpio_read_pin(void *, int); void qcgpio_write_pin(void *, int, int); @@ -108,6 +146,137 @@ void qcgpio_intr_enable(void *, int); void qcgpio_intr_disable(void *, int); int qcgpio_intr(void *); +int +qcgpio_get_nirq(int crsidx, union acpi_resource *crs, void *arg) +{ + struct qcgpio_softc *sc = arg; + int typ; + + typ = AML_CRSTYPE(crs); + + switch (typ) { + case LR_EXTIRQ: + sc->sc_npdcmap++; + break; + } + + return 0; +} + +int +qcgpio_get_irqs(int crsidx, union acpi_resource *crs, void *arg) +{ + struct qcgpio_softc *sc = arg; + int typ; + + typ = AML_CRSTYPE(crs); + + switch (typ) { + case LR_EXTIRQ: + sc->sc_pdcmap[sc->sc_ipdcmap].pm_irq = crs->lr_extirq.irq[0]; + sc->sc_pdcmap[sc->sc_ipdcmap].pm_pin = -1; + DPRINTF(1, "%s: irq index %d: irq %d\n", + __func__, sc->sc_ipdcmap, + sc->sc_pdcmap[sc->sc_ipdcmap].pm_irq); + sc->sc_ipdcmap++; + break; + } + + return 0; +} + +void +qcgpio_fill_pdcmap(struct qcgpio_softc *sc) +{ + struct aml_value cmd[4], res, *ref; + int i, j, pin; + uint32_t irq; + + bzero(&cmd, sizeof(cmd)); + cmd[0].type = AML_OBJTYPE_BUFFER; + cmd[0].v_buffer = (uint8_t *)&qcgpio_pdc_dsm_uuid; + cmd[0].length = sizeof(qcgpio_pdc_dsm_uuid); + /* rev */ + cmd[1].type = AML_OBJTYPE_INTEGER; + cmd[1].v_integer = QCGPIO_PDC_DSM_REV; + cmd[1].length = 1; + /* func */ + cmd[2].type = AML_OBJTYPE_INTEGER; + cmd[2].v_integer = QCGPIO_PDC_DSM_FUNC_CIPR; + cmd[2].length = 1; + /* not used */ + cmd[3].type = AML_OBJTYPE_PACKAGE; + cmd[3].v_integer = 0; + cmd[3].length = 0; + + if (aml_evalname(sc->sc_acpi, sc->sc_node, "_DSM", 4, cmd, &res)) { + printf("%s: PDC _DSM failed\n", __func__); + return; + } + + for (i = 0; i < res.length; i++) { + ref = res.v_package[i]; + + if (ref->type != AML_OBJTYPE_PACKAGE || + ref->length < 3 || + ref->v_package[0]->type != AML_OBJTYPE_INTEGER || + ref->v_package[1]->type != AML_OBJTYPE_INTEGER || + ref->v_package[2]->type != AML_OBJTYPE_INTEGER) { + continue; + } + + irq = ref->v_package[2]->v_integer; + pin = ref->v_package[1]->v_integer; + DPRINTF(1, "%s: pdc index %d: probing irq %d, pin %d\n", + __func__, i, irq, pin); + + for (j = 0; j < sc->sc_npdcmap; j++) { + if (sc->sc_pdcmap[j].pm_irq == irq) { + sc->sc_pdcmap[j].pm_pin = pin; + break; + } + } + } +#ifdef QCGPIO_DEBUG + for (i = 0; i < sc->sc_npdcmap; i++) { + printf("%s: irq index %d: irq=%d, pin=%d\n", + __func__, i, sc->sc_pdcmap[i].pm_irq, + sc->sc_pdcmap[i].pm_pin); + } +#endif +} + +int +qcgpio_get_pin_count(struct acpi_softc *sc, struct aml_node *node) +{ + struct aml_value cmd[4]; + int64_t npins; + + bzero(&cmd, sizeof(cmd)); + cmd[0].type = AML_OBJTYPE_BUFFER; + cmd[0].v_buffer = (uint8_t *)&qcgpio_gpio_dsm_uuid; + cmd[0].length = sizeof(qcgpio_gpio_dsm_uuid); + /* rev */ + cmd[1].type = AML_OBJTYPE_INTEGER; + cmd[1].v_integer = QCGPIO_GPIO_DSM_REV; + cmd[1].length = 1; + /* func */ + cmd[2].type = AML_OBJTYPE_INTEGER; + cmd[2].v_integer = QCGPIO_GPIO_DSM_FUNC_NUM_PINS; + cmd[2].length = 1; + /* not used */ + cmd[3].type = AML_OBJTYPE_PACKAGE; + cmd[3].v_integer = 0; + cmd[3].length = 0; + + if (aml_evalinteger(sc, node, "_DSM", 4, cmd, &npins)) { + printf("%s: GPIO _DSM failed\n", __func__); + return 0; + } + + return (uint32_t)npins; +} + int qcgpio_acpi_match(struct device *parent, void *match, void *aux) { @@ -124,6 +293,7 @@ qcgpio_acpi_attach(struct device *parent, struct device *self, void *aux) { struct acpi_attach_args *aaa = aux; struct qcgpio_softc *sc = (struct qcgpio_softc *)self; + struct aml_value res; sc->sc_acpi = (struct acpi_softc *)parent; sc->sc_node = aaa->aaa_node; @@ -145,7 +315,25 @@ qcgpio_acpi_attach(struct device *parent, struct device *self, void *aux) sc->sc_npins = 228; sc->sc_pin_map = qcgpio_sc8280xp_pin_map; } else if (strcmp(aaa->aaa_dev, "QCOM0C0C") == 0) { - sc->sc_npins = 239; + if (aml_evalname(sc->sc_acpi, sc->sc_node, "_CRS", 0, NULL, + &res)) { + printf("no _CRS method\n"); + return; + } + if (res.type != AML_OBJTYPE_BUFFER || res.length < 5) { + printf("invalid _CRS object\n"); + aml_freevalue(&res); + return; + } + aml_parse_resource(&res, qcgpio_get_nirq, sc); + DPRINTF(1, "\n%s: npdcmap=%d\n", __func__, sc->sc_npdcmap); + sc->sc_pdcmap = mallocarray(sc->sc_npdcmap, + sizeof(*sc->sc_pdcmap), M_DEVBUF, M_WAITOK | M_ZERO); + aml_parse_resource(&res, qcgpio_get_irqs, sc); + aml_freevalue(&res); + qcgpio_fill_pdcmap(sc); + sc->sc_npins = qcgpio_get_pin_count(sc->sc_acpi, sc->sc_node); + DPRINTF(1, "%s: npins=%d\n", __func__, sc->sc_npins); sc->sc_pin_map = qcgpio_x1e80100_pin_map; } KASSERT(sc->sc_npins != 0); @@ -180,11 +368,12 @@ unmap: if (sc->sc_ih) acpi_intr_disestablish(sc->sc_ih); free(sc->sc_pin_ih, M_DEVBUF, sc->sc_npins * sizeof(*sc->sc_pin_ih)); + free(sc->sc_pdcmap, M_DEVBUF, sc->sc_npdcmap * sizeof(*sc->sc_pdcmap)); bus_space_unmap(sc->sc_iot, sc->sc_ioh, aaa->aaa_size[0]); } int -qcgpio_sc7180_pin_map(int pin, bus_size_t *off) +qcgpio_sc7180_pin_map(struct qcgpio_softc *sc, int pin, bus_size_t *off) { switch (pin) { case 30: @@ -211,7 +400,7 @@ qcgpio_sc7180_pin_map(int pin, bus_size_t *off) } int -qcgpio_sc8280xp_pin_map(int pin, bus_size_t *off) +qcgpio_sc8280xp_pin_map(struct qcgpio_softc *sc, int pin, bus_size_t *off) { switch (pin) { case 107: @@ -229,21 +418,19 @@ qcgpio_sc8280xp_pin_map(int pin, bus_size_t *off) } int -qcgpio_x1e80100_pin_map(int pin, bus_size_t *off) +qcgpio_x1e80100_pin_map(struct qcgpio_softc *sc, int pin, bus_size_t *off) { - switch (pin) { - case 3: - case 51: - return pin; - case 0x180: - return 67; - case 0x380: - return 33; - case 0x3c0: - return 3; - default: - return -1; + int real_pin = -1; + + if (pin < sc->sc_npins) { + real_pin = pin; + } else if (pin / 64 < sc->sc_npdcmap) { + real_pin = sc->sc_pdcmap[pin / 64].pm_pin; } + + DPRINTF(2, "%s: map pin %d to real_pin %d\n", __func__, pin, real_pin); + + return real_pin; } int @@ -253,7 +440,7 @@ qcgpio_read_pin(void *cookie, int pin) bus_size_t off = 0; uint32_t reg; - pin = sc->sc_pin_map(pin, &off); + pin = sc->sc_pin_map(sc, pin, &off); if (pin < 0 || pin >= sc->sc_npins) return 0; @@ -267,7 +454,7 @@ qcgpio_write_pin(void *cookie, int pin, int val) struct qcgpio_softc *sc = cookie; bus_size_t off = 0; - pin = sc->sc_pin_map(pin, &off); + pin = sc->sc_pin_map(sc, pin, &off); if (pin < 0 || pin >= sc->sc_npins) return; @@ -288,7 +475,7 @@ qcgpio_intr_establish(void *cookie, int pin, int flags, bus_size_t off = 0; uint32_t reg; - pin = sc->sc_pin_map(pin, &off); + pin = sc->sc_pin_map(sc, pin, &off); if (pin < 0 || pin >= sc->sc_npins) return; @@ -335,7 +522,7 @@ qcgpio_intr_enable(void *cookie, int pin) struct qcgpio_softc *sc = cookie; bus_size_t off = 0; - pin = sc->sc_pin_map(pin, &off); + pin = sc->sc_pin_map(sc, pin, &off); if (pin < 0 || pin >= sc->sc_npins) return; @@ -349,7 +536,7 @@ qcgpio_intr_disable(void *cookie, int pin) struct qcgpio_softc *sc = cookie; bus_size_t off = 0; - pin = sc->sc_pin_map(pin, &off); + pin = sc->sc_pin_map(sc, pin, &off); if (pin < 0 || pin >= sc->sc_npins) return; @@ -369,7 +556,7 @@ qcgpio_intr(void *arg) if (sc->sc_pin_ih[pin].ih_func == NULL) continue; - sc->sc_pin_map(pin, &off); + sc->sc_pin_map(sc, pin, &off); stat = HREAD4(sc, off + TLMM_GPIO_INTR_STATUS(pin)); if (stat & TLMM_GPIO_INTR_STATUS_INTR_STATUS) { diff --git a/sys/dev/audio.c b/sys/dev/audio.c index 5277cbde2..715676ec5 100644 --- a/sys/dev/audio.c +++ b/sys/dev/audio.c @@ -1,4 +1,4 @@ -/* $OpenBSD: audio.c,v 1.208 2024/08/20 07:44:36 mvs Exp $ */ +/* $OpenBSD: audio.c,v 1.210 2024/12/30 02:46:00 guenther Exp $ */ /* * Copyright (c) 2015 Alexandre Ratchov * @@ -88,8 +88,7 @@ struct audio_buf { }; #if NWSKBD > 0 -struct wskbd_vol -{ +struct wskbd_vol { int val; /* index of the value control */ int mute; /* index of the mute control */ int step; /* increment/decrement step */ @@ -1753,9 +1752,6 @@ audio_ioctl(struct audio_softc *sc, unsigned long cmd, void *addr) tsleep_nsec(&sc->quiesce, 0, "au_qio", INFSLP); switch (cmd) { - case FIONBIO: - /* All handled in the upper FS layer. */ - break; case AUDIO_GETPOS: mtx_enter(&audio_lock); ap = (struct audio_pos *)addr; @@ -1908,9 +1904,6 @@ audio_ioctl_mixer(struct audio_softc *sc, unsigned long cmd, void *addr, tsleep_nsec(&sc->quiesce, 0, "mix_qio", INFSLP); switch (cmd) { - case FIONBIO: - /* All handled in the upper FS layer. */ - break; case AUDIO_MIXER_DEVINFO: return audio_mixer_devinfo(sc, addr); case AUDIO_MIXER_READ: diff --git a/sys/dev/dt/dt_dev.c b/sys/dev/dt/dt_dev.c index 05ce734ab..7dcd0b967 100644 --- a/sys/dev/dt/dt_dev.c +++ b/sys/dev/dt/dt_dev.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dt_dev.c,v 1.37 2024/09/06 08:38:21 mpi Exp $ */ +/* $OpenBSD: dt_dev.c,v 1.42 2024/12/04 09:37:33 mpi Exp $ */ /* * Copyright (c) 2019 Martin Pieuchot @@ -85,14 +85,37 @@ #define DPRINTF(x...) /* nothing */ +/* + * Per-CPU Event States + * + * Locks used to protect struct members: + * r owned by thread doing read(2) + * c owned by CPU + * s sliced ownership, based on read/write indexes + * p written by CPU, read by thread doing read(2) + */ +struct dt_cpubuf { + unsigned int dc_prod; /* [r] read index */ + unsigned int dc_cons; /* [c] write index */ + struct dt_evt *dc_ring; /* [s] ring of event states */ + unsigned int dc_inevt; /* [c] in event already? */ + + /* Counters */ + unsigned int dc_dropevt; /* [p] # of events dropped */ + unsigned int dc_skiptick; /* [p] # of ticks skipped */ + unsigned int dc_recurevt; /* [p] # of recursive events */ + unsigned int dc_readevt; /* [r] # of events read */ +}; + /* * Descriptor associated with each program opening /dev/dt. It is used * to keep track of enabled PCBs. * * Locks used to protect struct members in this file: * a atomic - * m per-softc mutex * K kernel lock + * r owned by thread doing read(2) + * I invariant after initialization */ struct dt_softc { SLIST_ENTRY(dt_softc) ds_next; /* [K] descriptor list */ @@ -100,15 +123,12 @@ struct dt_softc { pid_t ds_pid; /* [I] PID of tracing program */ void *ds_si; /* [I] to defer wakeup(9) */ - struct mutex ds_mtx; - struct dt_pcb_list ds_pcbs; /* [K] list of enabled PCBs */ int ds_recording; /* [K] currently recording? */ - int ds_evtcnt; /* [m] # of readable evts */ + unsigned int ds_evtcnt; /* [a] # of readable evts */ - /* Counters */ - uint64_t ds_readevt; /* [m] # of events read */ - uint64_t ds_dropevt; /* [m] # of events dropped */ + struct dt_cpubuf ds_cpu[MAXCPUS]; /* [I] Per-cpu event states */ + unsigned int ds_lastcpu; /* [r] last CPU ring read(2). */ }; SLIST_HEAD(, dt_softc) dtdev_list; /* [K] list of open /dev/dt nodes */ @@ -132,6 +152,8 @@ int dtread(dev_t, struct uio *, int); int dtioctl(dev_t, u_long, caddr_t, int, struct proc *); struct dt_softc *dtlookup(int); +struct dt_softc *dtalloc(void); +void dtfree(struct dt_softc *); int dt_ioctl_list_probes(struct dt_softc *, struct dtioc_probe *); int dt_ioctl_get_args(struct dt_softc *, struct dtioc_arg *); @@ -142,8 +164,7 @@ int dt_ioctl_probe_enable(struct dt_softc *, struct dtioc_req *); int dt_ioctl_probe_disable(struct dt_softc *, struct dtioc_req *); int dt_ioctl_get_auxbase(struct dt_softc *, struct dtioc_getaux *); -int dt_pcb_ring_copy(struct dt_pcb *, struct uio *, size_t, size_t *, - uint64_t *); +int dt_ring_copy(struct dt_cpubuf *, struct uio *, size_t, size_t *); void dt_wakeup(struct dt_softc *); void dt_deferred_wakeup(void *); @@ -172,28 +193,21 @@ dtopen(dev_t dev, int flags, int mode, struct proc *p) if (atomic_load_int(&allowdt) == 0) return EPERM; - sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK|M_CANFAIL|M_ZERO); + sc = dtalloc(); if (sc == NULL) return ENOMEM; /* no sleep after this point */ if (dtlookup(unit) != NULL) { - free(sc, M_DEVBUF, sizeof(*sc)); + dtfree(sc); return EBUSY; } sc->ds_unit = unit; sc->ds_pid = p->p_p->ps_pid; TAILQ_INIT(&sc->ds_pcbs); - mtx_init(&sc->ds_mtx, IPL_HIGH); + sc->ds_lastcpu = 0; sc->ds_evtcnt = 0; - sc->ds_readevt = 0; - sc->ds_dropevt = 0; - sc->ds_si = softintr_establish(IPL_SOFTCLOCK, dt_deferred_wakeup, sc); - if (sc->ds_si == NULL) { - free(sc, M_DEVBUF, sizeof(*sc)); - return ENOMEM; - } SLIST_INSERT_HEAD(&dtdev_list, sc, ds_next); @@ -216,9 +230,7 @@ dtclose(dev_t dev, int flags, int mode, struct proc *p) SLIST_REMOVE(&dtdev_list, sc, dt_softc, ds_next); dt_ioctl_record_stop(sc); dt_pcb_purge(&sc->ds_pcbs); - softintr_disestablish(sc->ds_si); - - free(sc, M_DEVBUF, sizeof(*sc)); + dtfree(sc); return 0; } @@ -227,10 +239,9 @@ int dtread(dev_t dev, struct uio *uio, int flags) { struct dt_softc *sc; - struct dt_pcb *dp; - int error = 0, unit = minor(dev); + struct dt_cpubuf *dc; + int i, error = 0, unit = minor(dev); size_t count, max, read = 0; - uint64_t dropped = 0; sc = dtlookup(unit); KASSERT(sc != NULL); @@ -239,9 +250,9 @@ dtread(dev_t dev, struct uio *uio, int flags) if (max < 1) return (EMSGSIZE); - while (!sc->ds_evtcnt) { + while (!atomic_load_int(&sc->ds_evtcnt)) { sleep_setup(sc, PWAIT | PCATCH, "dtread"); - error = sleep_finish(0, !sc->ds_evtcnt); + error = sleep_finish(0, !atomic_load_int(&sc->ds_evtcnt)); if (error == EINTR || error == ERESTART) break; } @@ -249,9 +260,10 @@ dtread(dev_t dev, struct uio *uio, int flags) return error; KERNEL_ASSERT_LOCKED(); - TAILQ_FOREACH(dp, &sc->ds_pcbs, dp_snext) { + for (i = 0; i < ncpusfound; i++) { count = 0; - error = dt_pcb_ring_copy(dp, uio, max, &count, &dropped); + dc = &sc->ds_cpu[(sc->ds_lastcpu + i) % ncpusfound]; + error = dt_ring_copy(dc, uio, max, &count); if (error && count == 0) break; @@ -260,12 +272,9 @@ dtread(dev_t dev, struct uio *uio, int flags) if (max == 0) break; } + sc->ds_lastcpu += i % ncpusfound; - mtx_enter(&sc->ds_mtx); - sc->ds_evtcnt -= read; - sc->ds_readevt += read; - sc->ds_dropevt += dropped; - mtx_leave(&sc->ds_mtx); + atomic_sub_int(&sc->ds_evtcnt, read); return error; } @@ -339,6 +348,54 @@ dtlookup(int unit) return sc; } +struct dt_softc * +dtalloc(void) +{ + struct dt_softc *sc; + struct dt_evt *dtev; + int i; + + sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK|M_CANFAIL|M_ZERO); + if (sc == NULL) + return NULL; + + for (i = 0; i < ncpusfound; i++) { + dtev = mallocarray(DT_EVTRING_SIZE, sizeof(*dtev), M_DEVBUF, + M_WAITOK|M_CANFAIL|M_ZERO); + if (dtev == NULL) + break; + sc->ds_cpu[i].dc_ring = dtev; + } + if (i < ncpusfound) { + dtfree(sc); + return NULL; + } + + sc->ds_si = softintr_establish(IPL_SOFTCLOCK, dt_deferred_wakeup, sc); + if (sc->ds_si == NULL) { + dtfree(sc); + return NULL; + } + + return sc; +} + +void +dtfree(struct dt_softc *sc) +{ + struct dt_evt *dtev; + int i; + + if (sc->ds_si != NULL) + softintr_disestablish(sc->ds_si); + + for (i = 0; i < ncpusfound; i++) { + dtev = sc->ds_cpu[i].dc_ring; + free(dtev, M_DEVBUF, DT_EVTRING_SIZE * sizeof(*dtev)); + } + free(sc, M_DEVBUF, sizeof(*sc)); +} + int dt_ioctl_list_probes(struct dt_softc *sc, struct dtioc_probe *dtpr) { @@ -434,11 +491,25 @@ dt_ioctl_get_args(struct dt_softc *sc, struct dtioc_arg *dtar) int dt_ioctl_get_stats(struct dt_softc *sc, struct dtioc_stat *dtst) { - mtx_enter(&sc->ds_mtx); - dtst->dtst_readevt = sc->ds_readevt; - dtst->dtst_dropevt = sc->ds_dropevt; - mtx_leave(&sc->ds_mtx); + struct dt_cpubuf *dc; + uint64_t readevt, dropevt, skiptick, recurevt; + int i; + readevt = dropevt = skiptick = 0; + for (i = 0; i < ncpusfound; i++) { + dc = &sc->ds_cpu[i]; + + membar_consumer(); + dropevt += dc->dc_dropevt; + skiptick = dc->dc_skiptick; + recurevt = dc->dc_recurevt; + readevt += dc->dc_readevt; + } + + dtst->dtst_readevt = readevt; + dtst->dtst_dropevt = dropevt; + dtst->dtst_skiptick = skiptick; + dtst->dtst_recurevt = recurevt; return 0; } @@ -518,6 +589,7 @@ dt_ioctl_probe_enable(struct dt_softc *sc, struct dtioc_req *dtrq) { struct dt_pcb_list plist; struct dt_probe *dtp; + struct dt_pcb *dp; int error; SIMPLEQ_FOREACH(dtp, &dt_probe_list, dtp_next) { @@ -527,6 +599,12 @@ dt_ioctl_probe_enable(struct dt_softc *sc, struct dtioc_req *dtrq) if (dtp == NULL) return ENOENT; + /* Only allow one probe of each type. */ + TAILQ_FOREACH(dp, &sc->ds_pcbs, dp_snext) { + if (dp->dp_dtp->dtp_pbn == dtrq->dtrq_pbn) + return EEXIST; + } + TAILQ_INIT(&plist); error = dtp->dtp_prov->dtpv_alloc(dtp, sc, &plist, dtrq); if (error) @@ -637,28 +715,16 @@ dt_pcb_alloc(struct dt_probe *dtp, struct dt_softc *sc) dp = malloc(sizeof(*dp), M_DT, M_WAITOK|M_CANFAIL|M_ZERO); if (dp == NULL) - goto bad; + return NULL; - dp->dp_ring = mallocarray(DT_EVTRING_SIZE, sizeof(*dp->dp_ring), M_DT, - M_WAITOK|M_CANFAIL|M_ZERO); - if (dp->dp_ring == NULL) - goto bad; - - mtx_init(&dp->dp_mtx, IPL_HIGH); dp->dp_sc = sc; dp->dp_dtp = dtp; return dp; -bad: - dt_pcb_free(dp); - return NULL; } void dt_pcb_free(struct dt_pcb *dp) { - if (dp == NULL) - return; - free(dp->dp_ring, M_DT, DT_EVTRING_SIZE * sizeof(*dp->dp_ring)); free(dp, M_DT, sizeof(*dp)); } @@ -673,6 +739,15 @@ dt_pcb_purge(struct dt_pcb_list *plist) } } +void +dt_pcb_ring_skiptick(struct dt_pcb *dp, unsigned int skip) +{ + struct dt_cpubuf *dc = &dp->dp_sc->ds_cpu[cpu_number()]; + + dc->dc_skiptick += skip; + membar_producer(); +} + /* * Get a reference to the next free event state from the ring. */ @@ -681,21 +756,34 @@ dt_pcb_ring_get(struct dt_pcb *dp, int profiling) { struct proc *p = curproc; struct dt_evt *dtev; - int distance; + int prod, cons, distance; + struct dt_cpubuf *dc = &dp->dp_sc->ds_cpu[cpu_number()]; - mtx_enter(&dp->dp_mtx); - distance = dp->dp_prod - dp->dp_cons; + if (dc->dc_inevt == 1) { + dc->dc_recurevt++; + membar_producer(); + return NULL; + } + + dc->dc_inevt = 1; + + membar_consumer(); + prod = dc->dc_prod; + cons = dc->dc_cons; + distance = prod - cons; if (distance == 1 || distance == (1 - DT_EVTRING_SIZE)) { /* read(2) isn't finished */ - dp->dp_dropevt++; - mtx_leave(&dp->dp_mtx); + dc->dc_dropevt++; + membar_producer(); + + dc->dc_inevt = 0; return NULL; } /* * Save states in next free event slot. */ - dtev = &dp->dp_ring[dp->dp_cons]; + dtev = &dc->dc_ring[cons]; memset(dtev, 0, sizeof(*dtev)); dtev->dtev_pbn = dp->dp_dtp->dtp_pbn; @@ -722,25 +810,25 @@ dt_pcb_ring_get(struct dt_pcb *dp, int profiling) void dt_pcb_ring_consume(struct dt_pcb *dp, struct dt_evt *dtev) { - MUTEX_ASSERT_LOCKED(&dp->dp_mtx); - KASSERT(dtev == &dp->dp_ring[dp->dp_cons]); + struct dt_cpubuf *dc = &dp->dp_sc->ds_cpu[cpu_number()]; - dp->dp_cons = (dp->dp_cons + 1) % DT_EVTRING_SIZE; - mtx_leave(&dp->dp_mtx); + KASSERT(dtev == &dc->dc_ring[dc->dc_cons]); + + dc->dc_cons = (dc->dc_cons + 1) % DT_EVTRING_SIZE; + membar_producer(); + + atomic_inc_int(&dp->dp_sc->ds_evtcnt); + dc->dc_inevt = 0; - mtx_enter(&dp->dp_sc->ds_mtx); - dp->dp_sc->ds_evtcnt++; - mtx_leave(&dp->dp_sc->ds_mtx); dt_wakeup(dp->dp_sc); } /* - * Copy at most `max' events from `dp', producing the same amount + * Copy at most `max' events from `dc', producing the same amount * of free slots. */ int -dt_pcb_ring_copy(struct dt_pcb *dp, struct uio *uio, size_t max, - size_t *rcvd, uint64_t *dropped) +dt_ring_copy(struct dt_cpubuf *dc, struct uio *uio, size_t max, size_t *rcvd) { size_t count, copied = 0; unsigned int cons, prod; @@ -748,12 +836,9 @@ dt_pcb_ring_copy(struct dt_pcb *dp, struct uio *uio, size_t max, KASSERT(max > 0); - mtx_enter(&dp->dp_mtx); - cons = dp->dp_cons; - prod = dp->dp_prod; - *dropped += dp->dp_dropevt; - dp->dp_dropevt = 0; - mtx_leave(&dp->dp_mtx); + membar_consumer(); + cons = dc->dc_cons; + prod = dc->dc_prod; if (cons < prod) count = DT_EVTRING_SIZE - prod; @@ -764,7 +849,7 @@ dt_pcb_ring_copy(struct dt_pcb *dp, struct uio *uio, size_t max, return 0; count = MIN(count, max); - error = uiomove(&dp->dp_ring[prod], count * sizeof(struct dt_evt), uio); + error = uiomove(&dc->dc_ring[prod], count * sizeof(struct dt_evt), uio); if (error) return error; copied += count; @@ -777,7 +862,7 @@ dt_pcb_ring_copy(struct dt_pcb *dp, struct uio *uio, size_t max, goto out; count = MIN(cons, (max - copied)); - error = uiomove(&dp->dp_ring[0], count * sizeof(struct dt_evt), uio); + error = uiomove(&dc->dc_ring[0], count * sizeof(struct dt_evt), uio); if (error) goto out; @@ -785,9 +870,9 @@ dt_pcb_ring_copy(struct dt_pcb *dp, struct uio *uio, size_t max, prod += count; out: - mtx_enter(&dp->dp_mtx); - dp->dp_prod = prod; - mtx_leave(&dp->dp_mtx); + dc->dc_readevt += copied; + dc->dc_prod = prod; + membar_producer(); *rcvd = copied; return error; diff --git a/sys/dev/dt/dt_prov_kprobe.c b/sys/dev/dt/dt_prov_kprobe.c index f929dd56d..5de2f8cd9 100644 --- a/sys/dev/dt/dt_prov_kprobe.c +++ b/sys/dev/dt/dt_prov_kprobe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dt_prov_kprobe.c,v 1.8 2024/04/06 11:18:02 mpi Exp $ */ +/* $OpenBSD: dt_prov_kprobe.c,v 1.9 2024/11/08 12:28:00 mpi Exp $ */ /* * Copyright (c) 2020 Tom Rollet @@ -120,7 +120,7 @@ dt_prov_kprobe_init(void) struct dt_probe *dtp; struct kprobe_probe *kprobe_dtp; Elf_Sym *symp, *symtab_start, *symtab_end; - char *strtab, *name; + const char *strtab, *name; vaddr_t inst, limit; int nb_sym, nb_probes; diff --git a/sys/dev/dt/dt_prov_profile.c b/sys/dev/dt/dt_prov_profile.c index 62900152e..394cda9cd 100644 --- a/sys/dev/dt/dt_prov_profile.c +++ b/sys/dev/dt/dt_prov_profile.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dt_prov_profile.c,v 1.8 2024/04/06 11:18:02 mpi Exp $ */ +/* $OpenBSD: dt_prov_profile.c,v 1.9 2024/11/26 10:28:27 mpi Exp $ */ /* * Copyright (c) 2019 Martin Pieuchot @@ -101,15 +101,18 @@ dt_prov_profile_alloc(struct dt_probe *dtp, struct dt_softc *sc, void dt_clock(struct clockrequest *cr, void *cf, void *arg) { - uint64_t count, i; + uint64_t count; struct dt_evt *dtev; struct dt_pcb *dp = arg; count = clockrequest_advance(cr, dp->dp_nsecs); - for (i = 0; i < count; i++) { - dtev = dt_pcb_ring_get(dp, 1); - if (dtev == NULL) - return; - dt_pcb_ring_consume(dp, dtev); - } + if (count == 0) + return; + else if (count > 1) + dt_pcb_ring_skiptick(dp, count - 1); + + dtev = dt_pcb_ring_get(dp, 1); + if (dtev == NULL) + return; + dt_pcb_ring_consume(dp, dtev); } diff --git a/sys/dev/dt/dtvar.h b/sys/dev/dt/dtvar.h index 5bb7ab0d7..1ca135d5e 100644 --- a/sys/dev/dt/dtvar.h +++ b/sys/dev/dt/dtvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: dtvar.h,v 1.19 2024/04/06 11:18:02 mpi Exp $ */ +/* $OpenBSD: dtvar.h,v 1.21 2024/11/26 10:28:27 mpi Exp $ */ /* * Copyright (c) 2019 Martin Pieuchot @@ -116,6 +116,8 @@ struct dtioc_req { struct dtioc_stat { uint64_t dtst_readevt; /* events read */ uint64_t dtst_dropevt; /* events dropped */ + uint64_t dtst_skiptick; /* clock ticks skipped */ + uint64_t dtst_recurevt; /* recursive events */ }; struct dtioc_getaux { @@ -163,12 +165,6 @@ struct dt_pcb { SMR_SLIST_ENTRY(dt_pcb) dp_pnext; /* [K,S] next PCB per probe */ TAILQ_ENTRY(dt_pcb) dp_snext; /* [K] next PCB per softc */ - /* Event states ring */ - unsigned int dp_prod; /* [m] read index */ - unsigned int dp_cons; /* [m] write index */ - struct dt_evt *dp_ring; /* [m] ring of event states */ - struct mutex dp_mtx; - struct dt_softc *dp_sc; /* [I] related softc */ struct dt_probe *dp_dtp; /* [I] related probe */ uint64_t dp_evtflags; /* [I] event states to record */ @@ -177,9 +173,6 @@ struct dt_pcb { struct clockintr dp_clockintr; /* [D] profiling handle */ uint64_t dp_nsecs; /* [I] profiling period */ struct cpu_info *dp_cpu; /* [I] on which CPU */ - - /* Counters */ - uint64_t dp_dropevt; /* [m] # dropped event */ }; TAILQ_HEAD(dt_pcb_list, dt_pcb); @@ -188,6 +181,7 @@ struct dt_pcb *dt_pcb_alloc(struct dt_probe *, struct dt_softc *); void dt_pcb_free(struct dt_pcb *); void dt_pcb_purge(struct dt_pcb_list *); +void dt_pcb_ring_skiptick(struct dt_pcb *, unsigned int); struct dt_evt *dt_pcb_ring_get(struct dt_pcb *, int); void dt_pcb_ring_consume(struct dt_pcb *, struct dt_evt *); diff --git a/sys/dev/efi/efiio.h b/sys/dev/efi/efiio.h index 7929b2e82..2965134d9 100644 --- a/sys/dev/efi/efiio.h +++ b/sys/dev/efi/efiio.h @@ -1,4 +1,4 @@ -/* $OpenBSD: efiio.h,v 1.1 2023/01/14 12:11:11 kettenis Exp $ */ +/* $OpenBSD: efiio.h,v 1.2 2024/10/22 21:50:02 jsg Exp $ */ /*- * Copyright (c) 2016 Netflix, Inc. * Copyright (c) 2022 3mdeb @@ -55,16 +55,14 @@ struct efi_esrt_entry_v1 { uint32_t last_attempt_status; }; -struct efi_get_table_ioc -{ +struct efi_get_table_ioc { void *buf; /* Pointer to userspace buffer */ struct uuid uuid; /* UUID to look up */ size_t table_len; /* Table size */ size_t buf_len; /* Size of the buffer */ }; -struct efi_var_ioc -{ +struct efi_var_ioc { uint16_t *name; /* User pointer to name, in UCS2 chars */ size_t namesize; /* Number of *bytes* in the name including terminator */ diff --git a/sys/dev/fdt/dwmmc.c b/sys/dev/fdt/dwmmc.c index d20adc626..e4cb0325a 100644 --- a/sys/dev/fdt/dwmmc.c +++ b/sys/dev/fdt/dwmmc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dwmmc.c,v 1.29 2023/07/01 08:27:26 jsing Exp $ */ +/* $OpenBSD: dwmmc.c,v 1.31 2024/12/19 18:02:47 patrick Exp $ */ /* * Copyright (c) 2017 Mark Kettenis * @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -212,6 +213,7 @@ struct dwmmc_softc { uint32_t sc_gpio[4]; int sc_sdio_irq; + uint32_t sc_vqmmc; uint32_t sc_pwrseq; uint32_t sc_vdd; @@ -241,6 +243,7 @@ int dwmmc_bus_width(sdmmc_chipset_handle_t, int); void dwmmc_exec_command(sdmmc_chipset_handle_t, struct sdmmc_command *); void dwmmc_card_intr_mask(sdmmc_chipset_handle_t, int); void dwmmc_card_intr_ack(sdmmc_chipset_handle_t); +int dwmmc_signal_voltage(sdmmc_chipset_handle_t, int); struct sdmmc_chip_functions dwmmc_chip_functions = { .host_reset = dwmmc_host_reset, @@ -253,6 +256,7 @@ struct sdmmc_chip_functions dwmmc_chip_functions = { .exec_command = dwmmc_exec_command, .card_intr_mask = dwmmc_card_intr_mask, .card_intr_ack = dwmmc_card_intr_ack, + .signal_voltage = dwmmc_signal_voltage, }; void dwmmc_pio_mode(struct dwmmc_softc *); @@ -379,6 +383,7 @@ dwmmc_attach(struct device *parent, struct device *self, void *aux) gpio_controller_config_pin(sc->sc_gpio, GPIO_CONFIG_INPUT); sc->sc_sdio_irq = (OF_getproplen(sc->sc_node, "cap-sdio-irq") == 0); + sc->sc_vqmmc = OF_getpropint(sc->sc_node, "vqmmc-supply", 0); sc->sc_pwrseq = OF_getpropint(sc->sc_node, "mmc-pwrseq", 0); printf(": %d MHz base clock\n", sc->sc_clkbase / 1000000); @@ -1252,6 +1257,7 @@ void dwmmc_pwrseq_post(uint32_t phandle) { uint32_t *gpios, *gpio; + int post_delay; int node; int len; @@ -1275,5 +1281,35 @@ dwmmc_pwrseq_post(uint32_t phandle) gpio = gpio_controller_next_pin(gpio); } + post_delay = OF_getpropint(node, "post-power-on-delay-ms", 0); + if (post_delay) + delay(post_delay * 1000); + free(gpios, M_TEMP, len); } + +int +dwmmc_signal_voltage(sdmmc_chipset_handle_t sch, int signal_voltage) +{ + struct dwmmc_softc *sc = sch; + uint32_t vccq; + + if (sc->sc_vqmmc == 0) + return ENODEV; + + switch (signal_voltage) { + case SDMMC_SIGNAL_VOLTAGE_180: + vccq = 1800000; + break; + case SDMMC_SIGNAL_VOLTAGE_330: + vccq = 3300000; + break; + default: + return EINVAL; + } + + if (regulator_get_voltage(sc->sc_vqmmc) == vccq) + return 0; + + return regulator_set_voltage(sc->sc_vqmmc, vccq); +} diff --git a/sys/dev/fdt/files.fdt b/sys/dev/fdt/files.fdt index 815683395..f514c61b9 100644 --- a/sys/dev/fdt/files.fdt +++ b/sys/dev/fdt/files.fdt @@ -1,4 +1,4 @@ -# $OpenBSD: files.fdt,v 1.203 2024/07/31 10:07:33 mglocker Exp $ +# $OpenBSD: files.fdt,v 1.204 2024/11/16 21:17:54 tobhe Exp $ # # Config file and device description for machine-independent FDT code. # Included by ports that need it. @@ -684,6 +684,11 @@ device qccpu attach qccpu at fdt file dev/fdt/qccpu.c qccpu +# Qualcomm CPUCP Mailbox +device qccpucp +attach qccpucp at fdt +file dev/fdt/qccpucp.c qccpucp + device qcdwusb: fdt attach qcdwusb at fdt file dev/fdt/qcdwusb.c qcdwusb diff --git a/sys/dev/fdt/qccpucp.c b/sys/dev/fdt/qccpucp.c new file mode 100644 index 000000000..bb0e78ddc --- /dev/null +++ b/sys/dev/fdt/qccpucp.c @@ -0,0 +1,166 @@ +/* $OpenBSD: qccpucp.c,v 1.1 2024/11/16 21:17:54 tobhe Exp $ */ +/* + * Copyright (c) 2024 Tobias Heider + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#define CPUCP_MAX_CHANNELS 3 + +/* Registers */ +#define CPUCP_REG_CMD(i) (0x104 + ((i) * 8)) +#define CPUCP_MASK_CMD 0xffffffffffffffffULL +#define CPUCP_REG_RX_MAP 0x4000 +#define CPUCP_REG_RX_STAT 0x4400 +#define CPUCP_REG_RX_CLEAR 0x4800 +#define CPUCP_REG_RX_EN 0x4C00 + +#define RXREAD8(sc, reg) \ + (bus_space_read_8((sc)->sc_iot, (sc)->sc_rx_ioh, (reg))) +#define RXWRITE8(sc, reg, val) \ + bus_space_write_8((sc)->sc_iot, (sc)->sc_rx_ioh, (reg), (val)) + +#define TXWRITE4(sc, reg, val) \ + bus_space_write_4((sc)->sc_iot, (sc)->sc_tx_ioh, (reg), (val)) + +struct qccpucp_channel { + struct qccpucp_softc *ch_sc; + + int ch_idx; +}; + +struct qccpucp_softc { + struct device sc_dev; + bus_space_tag_t sc_iot; + bus_space_handle_t sc_rx_ioh; + bus_space_handle_t sc_tx_ioh; + + void *sc_ih; + + struct qccpucp_channel sc_chans[CPUCP_MAX_CHANNELS]; + + struct mbox_device sc_md; +}; + +int qccpucp_match(struct device *, void *, void *); +void qccpucp_attach(struct device *, struct device *, void *); + +const struct cfattach qccpucp_ca = { + sizeof (struct qccpucp_softc), qccpucp_match, qccpucp_attach +}; + +struct cfdriver qccpucp_cd = { + NULL, "qccpucp", DV_DULL +}; + +void *qccpucp_channel(void *, uint32_t *, struct mbox_client *); +int qccpucp_send(void *, const void *, size_t); + +int +qccpucp_match(struct device *parent, void *match, void *aux) +{ + struct fdt_attach_args *faa = aux; + + return OF_is_compatible(faa->fa_node, "qcom,x1e80100-cpucp-mbox"); +} + +void +qccpucp_attach(struct device *parent, struct device *self, void *aux) +{ + struct qccpucp_softc *sc = (struct qccpucp_softc *)self; + struct fdt_attach_args *faa = aux; + + if (faa->fa_nreg < 2) { + printf(": no registers\n"); + return; + } + + sc->sc_iot = faa->fa_iot; + if (bus_space_map(sc->sc_iot, faa->fa_reg[0].addr, + faa->fa_reg[0].size, 0, &sc->sc_rx_ioh)) { + printf(": can't map registers\n"); + return; + } + if (bus_space_map(sc->sc_iot, faa->fa_reg[1].addr, + faa->fa_reg[1].size, 0, &sc->sc_tx_ioh)) { + printf(": can't map registers\n"); + bus_space_unmap(sc->sc_iot, sc->sc_rx_ioh, + faa->fa_reg[0].size); + return; + } + + RXWRITE8(sc, CPUCP_REG_RX_EN, 0); + RXWRITE8(sc, CPUCP_REG_RX_CLEAR, 0); + RXWRITE8(sc, CPUCP_REG_RX_MAP, 0); + + printf("\n"); + + RXWRITE8(sc, CPUCP_REG_RX_MAP, CPUCP_MASK_CMD); + + sc->sc_md.md_node = faa->fa_node; + sc->sc_md.md_cookie = sc; + sc->sc_md.md_channel = qccpucp_channel; + sc->sc_md.md_send = qccpucp_send; + mbox_register(&sc->sc_md); +} + +void * +qccpucp_channel(void *cookie, uint32_t *cells, struct mbox_client *mc) +{ + struct qccpucp_softc *sc = cookie; + struct qccpucp_channel *ch = NULL; + uint64_t val; + int i; + + for (i = 0; i < CPUCP_MAX_CHANNELS; i++) { + if (sc->sc_chans[i].ch_sc == NULL) { + ch = &sc->sc_chans[i]; + break; + } + } + + if (ch == NULL) + return NULL; + + val = RXREAD8(sc, CPUCP_REG_RX_EN); + val |= (1 << i); + RXWRITE8(sc, CPUCP_REG_RX_EN, val); + + ch->ch_idx = i; + ch->ch_sc = sc; + + return ch; +} + +int +qccpucp_send(void *cookie, const void *data, size_t len) +{ + struct qccpucp_channel *ch = cookie; + struct qccpucp_softc *sc = ch->ch_sc; + + TXWRITE4(sc, CPUCP_REG_CMD(ch->ch_idx), 0); + + return 0; +} diff --git a/sys/dev/fdt/qcpas.c b/sys/dev/fdt/qcpas.c index 5d0589778..614ec8591 100644 --- a/sys/dev/fdt/qcpas.c +++ b/sys/dev/fdt/qcpas.c @@ -1,4 +1,4 @@ -/* $OpenBSD: qcpas.c,v 1.7 2024/09/01 03:14:48 jsg Exp $ */ +/* $OpenBSD: qcpas.c,v 1.8 2024/11/08 21:13:34 landry Exp $ */ /* * Copyright (c) 2023 Patrick Wildt * @@ -1461,6 +1461,7 @@ qcpas_pmic_rtr_bat_status(struct qcpas_softc *sc, extern int hw_power; struct apm_power_info *info = &qcpas_pmic_rtr_apm_power_info; uint32_t delta; + u_char nblife; #endif #ifndef SMALL_KERNEL @@ -1509,8 +1510,10 @@ qcpas_pmic_rtr_bat_status(struct qcpas_softc *sc, return; } - info->battery_life = - ((bat->capacity * 100) / sc->sc_last_full_capacity); + nblife = ((bat->capacity * 100) / sc->sc_last_full_capacity); + if (info->battery_life != nblife) + apm_record_event(APM_POWER_CHANGE); + info->battery_life = nblife; if (info->battery_life > 50) info->battery_state = APM_BATT_HIGH; else if (info->battery_life > 25) @@ -1532,9 +1535,13 @@ qcpas_pmic_rtr_bat_status(struct qcpas_softc *sc, info->minutes_left = (60 * delta) / abs(bat->rate); if (bat->power_state & BATTMGR_PWR_STATE_AC_ON) { + if (info->ac_state != APM_AC_ON) + apm_record_event(APM_POWER_CHANGE); info->ac_state = APM_AC_ON; hw_power = 1; } else { + if (info->ac_state != APM_AC_OFF) + apm_record_event(APM_POWER_CHANGE); info->ac_state = APM_AC_OFF; hw_power = 0; } diff --git a/sys/dev/fdt/qcpmic.c b/sys/dev/fdt/qcpmic.c index 7b3a71176..59bcb41dc 100644 --- a/sys/dev/fdt/qcpmic.c +++ b/sys/dev/fdt/qcpmic.c @@ -1,4 +1,4 @@ -/* $OpenBSD: qcpmic.c,v 1.2 2024/08/14 10:54:58 mglocker Exp $ */ +/* $OpenBSD: qcpmic.c,v 1.3 2025/01/03 14:13:55 kettenis Exp $ */ /* * Copyright (c) 2022 Patrick Wildt * @@ -26,8 +26,6 @@ #include #include -#include -#include #include /* PMIC Registers. */ diff --git a/sys/dev/fdt/qcpon.c b/sys/dev/fdt/qcpon.c index 8268d705b..f6f48033d 100644 --- a/sys/dev/fdt/qcpon.c +++ b/sys/dev/fdt/qcpon.c @@ -1,4 +1,4 @@ -/* $OpenBSD: qcpon.c,v 1.4 2023/04/24 14:34:13 patrick Exp $ */ +/* $OpenBSD: qcpon.c,v 1.6 2025/01/03 14:14:49 kettenis Exp $ */ /* * Copyright (c) 2022 Patrick Wildt * @@ -28,19 +28,22 @@ #include #include -#include -#include #include +/* Registers. */ +#define PON_RT_STS 0x10 +#define PON_PMK8350_KPDPWR_N_SET (1U << 7) + struct qcpon_softc { struct device sc_dev; int sc_node; spmi_tag_t sc_tag; int8_t sc_sid; + uint16_t sc_addr; void *sc_pwrkey_ih; - int sc_pwrkey_debounce; + uint32_t sc_last_sts; struct task sc_powerdown_task; }; @@ -72,11 +75,19 @@ qcpon_attach(struct device *parent, struct device *self, void *aux) { struct spmi_attach_args *saa = aux; struct qcpon_softc *sc = (struct qcpon_softc *)self; + uint32_t reg[2]; int node; + if (OF_getpropintarray(saa->sa_node, "reg", + reg, sizeof(reg)) != sizeof(reg)) { + printf(": can't find registers\n"); + return; + } + sc->sc_node = saa->sa_node; sc->sc_tag = saa->sa_tag; sc->sc_sid = saa->sa_sid; + sc->sc_addr = reg[0]; task_set(&sc->sc_powerdown_task, qcpon_powerdown_task, sc); @@ -106,19 +117,27 @@ qcpon_pwrkey_intr(void *arg) #ifdef SUSPEND extern int cpu_suspended; #endif - - /* Ignore presses, handle releases. */ - sc->sc_pwrkey_debounce = (sc->sc_pwrkey_debounce + 1) % 2; - if (sc->sc_pwrkey_debounce == 1) - return 1; + uint32_t sts; + int error; #ifdef SUSPEND - if (cpu_suspended) + if (cpu_suspended) { cpu_suspended = 0; - else + return 1; + } #endif + + error = spmi_cmd_read(sc->sc_tag, sc->sc_sid, SPMI_CMD_EXT_READL, + sc->sc_addr + PON_RT_STS, &sts, sizeof(sts)); + if (error) + return 0; + + /* Ignore presses, handle releases. */ + if ((sc->sc_last_sts & PON_PMK8350_KPDPWR_N_SET) && + (sts & PON_PMK8350_KPDPWR_N_SET) == 0) task_add(systq, &sc->sc_powerdown_task); + sc->sc_last_sts = sts; return 1; } diff --git a/sys/dev/fdt/qcspmi.c b/sys/dev/fdt/qcspmi.c index 656213afb..e9caff2b2 100644 --- a/sys/dev/fdt/qcspmi.c +++ b/sys/dev/fdt/qcspmi.c @@ -1,4 +1,4 @@ -/* $OpenBSD: qcspmi.c,v 1.6 2024/08/14 10:54:58 mglocker Exp $ */ +/* $OpenBSD: qcspmi.c,v 1.7 2025/01/03 14:13:25 kettenis Exp $ */ /* * Copyright (c) 2022 Patrick Wildt * @@ -25,8 +25,6 @@ #include #include -#include -#include #include /* Core registers. */ diff --git a/sys/dev/fdt/rkclock.c b/sys/dev/fdt/rkclock.c index 86c829d47..2583b1415 100644 --- a/sys/dev/fdt/rkclock.c +++ b/sys/dev/fdt/rkclock.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rkclock.c,v 1.90 2024/07/15 09:54:38 patrick Exp $ */ +/* $OpenBSD: rkclock.c,v 1.91 2024/11/24 22:19:59 kettenis Exp $ */ /* * Copyright (c) 2017, 2018 Mark Kettenis * @@ -2998,22 +2998,22 @@ rk3399_enable(void *cookie, uint32_t *cells, int on) switch (idx) { case RK3399_CLK_USB2PHY0_REF: - HWRITE4(sc, RK3399_CRU_CLKGATE_CON(6), (5 << 0) << 16); + HWRITE4(sc, RK3399_CRU_CLKGATE_CON(6), (1 << 5) << 16); break; case RK3399_CLK_USB2PHY1_REF: - HWRITE4(sc, RK3399_CRU_CLKGATE_CON(6), (6 << 0) << 16); + HWRITE4(sc, RK3399_CRU_CLKGATE_CON(6), (1 << 6) << 16); break; case RK3399_CLK_UPHY0_TCPDPHY_REF: - HWRITE4(sc, RK3399_CRU_CLKGATE_CON(13), (4 << 0) << 16); + HWRITE4(sc, RK3399_CRU_CLKGATE_CON(13), (1 << 4) << 16); break; case RK3399_CLK_UPHY0_TCPDCORE: - HWRITE4(sc, RK3399_CRU_CLKGATE_CON(13), (5 << 0) << 16); + HWRITE4(sc, RK3399_CRU_CLKGATE_CON(13), (1 << 5) << 16); break; case RK3399_CLK_UPHY1_TCPDPHY_REF: - HWRITE4(sc, RK3399_CRU_CLKGATE_CON(13), (6 << 0) << 16); + HWRITE4(sc, RK3399_CRU_CLKGATE_CON(13), (1 << 6) << 16); break; case RK3399_CLK_UPHY1_TCPDCORE: - HWRITE4(sc, RK3399_CRU_CLKGATE_CON(13), (7 << 0) << 16); + HWRITE4(sc, RK3399_CRU_CLKGATE_CON(13), (1 << 7) << 16); break; case RK3399_ACLK_GMAC: HWRITE4(sc, RK3399_CRU_CLKGATE_CON(32), (1 << 0) << 16); diff --git a/sys/dev/fdt/rkpmic.c b/sys/dev/fdt/rkpmic.c index c3479794c..72c59b404 100644 --- a/sys/dev/fdt/rkpmic.c +++ b/sys/dev/fdt/rkpmic.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rkpmic.c,v 1.17 2024/05/26 18:06:21 kettenis Exp $ */ +/* $OpenBSD: rkpmic.c,v 1.18 2024/11/23 21:24:03 kettenis Exp $ */ /* * Copyright (c) 2017 Mark Kettenis * @@ -33,6 +33,8 @@ #include +extern void (*powerdownfn)(void); + #define RK80X_SECONDS 0x00 #define RK80X_MINUTES 0x01 #define RK80X_HOURS 0x02 @@ -52,10 +54,20 @@ #define RK809_RTC_STATUS 0x0e #define RK80X_RTC_STATUS_POWER_UP 0x80 +#define RK805_DEV_CTRL 0x4b +#define RK805_DEV_CTRL_DEV_OFF 0x01 + +#define RK806_SYS_CFG3 0x72 +#define RK806_SYS_CFG3_DEV_OFF 0x01 + +#define RK808_DEVCTRL 0x4b +#define RK808_DEVCTRL_DEV_OFF_RST 0x08 + #define RK809_PMIC_SYS_CFG3 0xf4 #define RK809_PMIC_SYS_CFG3_SLP_FUN_MASK 0x18 #define RK809_PMIC_SYS_CFG3_SLP_FUN_NONE 0x00 #define RK809_PMIC_SYS_CFG3_SLP_FUN_SLEEP 0x08 +#define RK809_PMIC_SYS_CFG3_DEV_OFF 0x01 #define RK809_PMIC_INT_STS0 0xf8 #define RK809_PMIC_INT_MSK0 0xf9 #define RK809_PMIC_INT_MSK0_PWRON_FALL_INT_IM 0x01 @@ -338,6 +350,8 @@ struct rkpmic_softc { struct spi_config sc_spi_conf; int sc_rtc_ctrl_reg, sc_rtc_status_reg; + uint8_t sc_dev_ctrl_reg, sc_dev_off_val; + struct todr_chip_handle sc_todr; const struct rkpmic_regdata *sc_regdata; @@ -382,6 +396,9 @@ int rkpmic_clock_write(struct rkpmic_softc *, struct clock_ymdhms *); int rkpmic_gettime(struct todr_chip_handle *, struct timeval *); int rkpmic_settime(struct todr_chip_handle *, struct timeval *); +struct rkpmic_softc *rkpmic_sc; +void rkpmic_powerdown(void); + int rkpmic_i2c_match(struct device *parent, void *match, void *aux) { @@ -447,24 +464,34 @@ rkpmic_attach(struct device *parent, struct device *self, void *aux) chip = "RK805"; sc->sc_rtc_ctrl_reg = RK805_RTC_CTRL; sc->sc_rtc_status_reg = RK805_RTC_STATUS; + sc->sc_dev_ctrl_reg = RK805_DEV_CTRL; + sc->sc_dev_off_val = RK805_DEV_CTRL_DEV_OFF; sc->sc_regdata = rk805_regdata; } else if (OF_is_compatible(sc->sc_node, "rockchip,rk806")) { chip = "RK806"; + sc->sc_dev_ctrl_reg = RK806_SYS_CFG3; + sc->sc_dev_off_val = RK806_SYS_CFG3_DEV_OFF; sc->sc_regdata = rk806_regdata; } else if (OF_is_compatible(sc->sc_node, "rockchip,rk808")) { chip = "RK808"; sc->sc_rtc_ctrl_reg = RK808_RTC_CTRL; sc->sc_rtc_status_reg = RK808_RTC_STATUS; + sc->sc_dev_ctrl_reg = RK808_DEVCTRL; + sc->sc_dev_off_val = RK808_DEVCTRL_DEV_OFF_RST; sc->sc_regdata = rk808_regdata; } else if (OF_is_compatible(sc->sc_node, "rockchip,rk809")) { chip = "RK809"; sc->sc_rtc_ctrl_reg = RK809_RTC_CTRL; sc->sc_rtc_status_reg = RK809_RTC_STATUS; + sc->sc_dev_ctrl_reg = RK809_PMIC_SYS_CFG3; + sc->sc_dev_off_val = RK809_PMIC_SYS_CFG3_DEV_OFF; sc->sc_regdata = rk809_regdata; } else { chip = "RK817"; sc->sc_rtc_ctrl_reg = RK809_RTC_CTRL; sc->sc_rtc_status_reg = RK809_RTC_STATUS; + sc->sc_dev_ctrl_reg = RK809_PMIC_SYS_CFG3; + sc->sc_dev_off_val = RK809_PMIC_SYS_CFG3_DEV_OFF; sc->sc_regdata = rk817_regdata; } printf(": %s\n", chip); @@ -511,6 +538,12 @@ rkpmic_attach(struct device *parent, struct device *self, void *aux) device_register_wakeup(&sc->sc_dev); #endif } + + if (OF_getpropbool(sc->sc_node, "system-power-controller") || + OF_getpropbool(sc->sc_node, "rockchip,system-power-controller")) { + rkpmic_sc = sc; + powerdownfn = rkpmic_powerdown; + } } int @@ -557,6 +590,14 @@ rkpmic_intr(void *arg) return 1; } +void +rkpmic_powerdown(void) +{ + struct rkpmic_softc *sc = rkpmic_sc; + rkpmic_reg_write(sc, sc->sc_dev_ctrl_reg, + rkpmic_reg_read(sc, sc->sc_dev_ctrl_reg) | sc->sc_dev_off_val); +} + struct rkpmic_regulator { struct rkpmic_softc *rr_sc; diff --git a/sys/dev/fdt/rkusbphy.c b/sys/dev/fdt/rkusbphy.c index 3807be0d6..d69d36ea8 100644 --- a/sys/dev/fdt/rkusbphy.c +++ b/sys/dev/fdt/rkusbphy.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rkusbphy.c,v 1.5 2024/06/23 10:18:11 kettenis Exp $ */ +/* $OpenBSD: rkusbphy.c,v 1.6 2024/11/24 22:46:54 kettenis Exp $ */ /* * Copyright (c) 2023 David Gwynne @@ -61,6 +61,47 @@ struct rkusbphy_chip { const struct rkusbphy_regs *c_regs; }; +/* + * RK3399 has two USB2PHY nodes that share a GRF. + */ + +static const struct rkusbphy_regs rkusbphy_rk3399_usb0_regs = { + /* shift, mask, set */ + .clk_enable = { 0xe450, 4, 0x1, 0x0 }, + + .otg = { + .phy_enable = { 0xe454, 0, 0x3, 0x2 }, + }, + + .host = { + .phy_enable = { 0xe458, 0, 0x3, 0x2 }, + }, +}; + +static const struct rkusbphy_regs rkusbphy_rk3399_usb1_regs = { + /* shift, mask, set */ + .clk_enable = { 0xe460, 4, 0x1, 0x0 }, + + .otg = { + .phy_enable = { 0xe464, 0, 0x3, 0x2 }, + }, + + .host = { + .phy_enable = { 0xe468, 0, 0x3, 0x2 }, + }, + }; + +static const struct rkusbphy_chip rkusbphy_rk3399[] = { + { + .c_base_addr = 0xe450, + .c_regs = &rkusbphy_rk3399_usb0_regs, + }, + { + .c_base_addr = 0xe460, + .c_regs = &rkusbphy_rk3399_usb1_regs, + }, +}; + /* * RK3568 has two USB2PHY nodes that have a GRF each. Each GRF has * the same register layout. @@ -190,6 +231,7 @@ struct rkusbphy_id { #define RKUSBPHY_ID(_n, _c) { _n, _c, nitems(_c) } static const struct rkusbphy_id rkusbphy_ids[] = { + RKUSBPHY_ID("rockchip,rk3399-usb2phy", rkusbphy_rk3399), RKUSBPHY_ID("rockchip,rk3568-usb2phy", rkusbphy_rk3568), RKUSBPHY_ID("rockchip,rk3588-usb2phy", rkusbphy_rk3588), }; diff --git a/sys/dev/fdt/scmi.c b/sys/dev/fdt/scmi.c index 5c567e567..240e0665e 100644 --- a/sys/dev/fdt/scmi.c +++ b/sys/dev/fdt/scmi.c @@ -1,7 +1,8 @@ -/* $OpenBSD: scmi.c,v 1.1 2023/02/13 19:26:15 kettenis Exp $ */ +/* $OpenBSD: scmi.c,v 1.2 2024/11/25 22:12:18 tobhe Exp $ */ /* * Copyright (c) 2023 Mark Kettenis + * Copyright (c) 2024 Tobias Heider * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -19,12 +20,16 @@ #include #include #include +#include +#include +#include #include #include #include #include +#include #include #include @@ -49,6 +54,7 @@ struct scmi_shmem { /* Protocols */ #define SCMI_BASE 0x10 +#define SCMI_PERF 0x13 #define SCMI_CLOCK 0x14 /* Common messages */ @@ -64,6 +70,24 @@ struct scmi_shmem { #define SCMI_CLOCK_CONFIG_SET 0x7 #define SCMI_CLOCK_CONFIG_SET_ENABLE (1 << 0) +/* Performance management messages */ +#define SCMI_PERF_DOMAIN_ATTRIBUTES 0x3 +#define SCMI_PERF_DESCRIBE_LEVELS 0x4 +#define SCMI_PERF_LEVEL_GET 0x8 + +struct scmi_resp_perf_describe_levels_40 { + uint16_t pl_nret; + uint16_t pl_nrem; + struct { + uint32_t pe_perf; + uint32_t pe_cost; + uint16_t pe_latency; + uint16_t pe_reserved; + uint32_t pe_ifreq; + uint32_t pe_lindex; + } pl_entry[]; +}; + static inline void scmi_message_header(volatile struct scmi_shmem *shmem, uint32_t protocol_id, uint32_t message_id) @@ -71,20 +95,58 @@ scmi_message_header(volatile struct scmi_shmem *shmem, shmem->message_header = (protocol_id << 10) | (message_id << 0); } +struct scmi_perf_level { + uint32_t pl_perf; + uint32_t pl_cost; + uint32_t pl_ifreq; +}; + +struct scmi_perf_domain { + size_t pd_nlevels; + struct scmi_perf_level *pd_levels; + int pd_curlevel; +}; struct scmi_softc { struct device sc_dev; bus_space_tag_t sc_iot; - bus_space_handle_t sc_ioh; - volatile struct scmi_shmem *sc_shmem; + int sc_node; + + bus_space_handle_t sc_ioh_tx; + bus_space_handle_t sc_ioh_rx; + volatile struct scmi_shmem *sc_shmem_tx; + volatile struct scmi_shmem *sc_shmem_rx; uint32_t sc_smc_id; + struct mbox_channel *sc_mc_tx; + struct mbox_channel *sc_mc_rx; + uint16_t sc_ver_major; + uint16_t sc_ver_minor; + + /* SCMI_CLOCK */ struct clock_device sc_cd; + + /* SCMI_PERF */ + int sc_perf_power_unit; +#define SCMI_POWER_UNIT_UW 0x2 +#define SCMI_POWER_UNIT_MW 0x1 +#define SCMI_POWER_UNIT_NONE 0x0 + size_t sc_perf_ndomains; + struct scmi_perf_domain *sc_perf_domains; + + struct ksensordev sc_perf_sensordev; + struct ksensordev sc_perf_psensordev; + struct ksensor *sc_perf_fsensors; + struct ksensor *sc_perf_psensors; + + int32_t (*sc_command)(struct scmi_softc *); }; int scmi_match(struct device *, void *, void *); void scmi_attach(struct device *, struct device *, void *); +int scmi_attach_smc(struct scmi_softc *, struct fdt_attach_args *); +void scmi_attach_mbox_deferred(struct device *); const struct cfattach scmi_ca = { sizeof(struct scmi_softc), scmi_match, scmi_attach @@ -96,22 +158,42 @@ struct cfdriver scmi_cd = { void scmi_attach_proto(struct scmi_softc *, int); void scmi_attach_clock(struct scmi_softc *, int); -int32_t scmi_command(struct scmi_softc *); +void scmi_attach_perf(struct scmi_softc *, int); + +int32_t scmi_smc_command(struct scmi_softc *); +int32_t scmi_mbox_command(struct scmi_softc *); int scmi_match(struct device *parent, void *match, void *aux) { struct fdt_attach_args *faa = aux; - return OF_is_compatible(faa->fa_node, "arm,scmi-smc"); + return OF_is_compatible(faa->fa_node, "arm,scmi-smc") || + OF_is_compatible(faa->fa_node, "arm,scmi"); } void scmi_attach(struct device *parent, struct device *self, void *aux) { struct scmi_softc *sc = (struct scmi_softc *)self; - volatile struct scmi_shmem *shmem; struct fdt_attach_args *faa = aux; + + sc->sc_iot = faa->fa_iot; + sc->sc_node = faa->fa_node; + + if (OF_is_compatible(faa->fa_node, "arm,scmi-smc")) { + scmi_attach_smc(sc, faa); + } else if (OF_is_compatible(faa->fa_node, "arm,scmi")) { + printf("\n"); + /* Defer because we need the mailbox driver attached first */ + config_defer(self, scmi_attach_mbox_deferred); + } +} + +int +scmi_attach_smc(struct scmi_softc *sc, struct fdt_attach_args *faa) +{ + volatile struct scmi_shmem *shmem; struct fdt_reg reg; int32_t status; uint32_t version; @@ -119,53 +201,142 @@ scmi_attach(struct device *parent, struct device *self, void *aux) void *node; int proto; + sc->sc_smc_id = OF_getpropint(faa->fa_node, "arm,smc-id", 0); + if (sc->sc_smc_id == 0) { + printf(": no SMC id\n"); + return -1; + } + phandle = OF_getpropint(faa->fa_node, "shmem", 0); node = fdt_find_phandle(phandle); if (node == NULL || !fdt_is_compatible(node, "arm,scmi-shmem") || fdt_get_reg(node, 0, ®)) { printf(": no shared memory\n"); - return; + return -1; } - sc->sc_smc_id = OF_getpropint(faa->fa_node, "arm,smc-id", 0); - if (sc->sc_smc_id == 0) { - printf(": no SMC id\n"); - return; - } - - sc->sc_iot = faa->fa_iot; if (bus_space_map(sc->sc_iot, reg.addr, - reg.size, 0, &sc->sc_ioh)) { + reg.size, 0, &sc->sc_ioh_tx)) { printf(": can't map shared memory\n"); - return; + return -1; } - sc->sc_shmem = bus_space_vaddr(sc->sc_iot, sc->sc_ioh); - shmem = sc->sc_shmem; + sc->sc_shmem_tx = bus_space_vaddr(sc->sc_iot, sc->sc_ioh_tx); + shmem = sc->sc_shmem_tx; + + sc->sc_command = scmi_smc_command; if ((shmem->channel_status & SCMI_CHANNEL_FREE) == 0) { printf(": channel busy\n"); - return; + return -1; } scmi_message_header(shmem, SCMI_BASE, SCMI_PROTOCOL_VERSION); shmem->length = sizeof(uint32_t); - status = scmi_command(sc); + status = sc->sc_command(sc); if (status != SCMI_SUCCESS) { printf(": protocol version command failed\n"); - return; + return -1; } version = shmem->message_payload[1]; - printf(": SCMI %d.%d\n", version >> 16, version & 0xffff); + sc->sc_ver_major = version >> 16; + sc->sc_ver_minor = version & 0xfffff; + printf(": SCMI %d.%d\n", sc->sc_ver_major, sc->sc_ver_minor); for (proto = OF_child(faa->fa_node); proto; proto = OF_peer(proto)) scmi_attach_proto(sc, proto); + + return 0; +} + +void +scmi_attach_mbox_deferred(struct device *self) +{ + struct scmi_softc *sc = (struct scmi_softc *)self; + uint32_t *shmems; + int32_t status; + uint32_t version; + struct fdt_reg reg; + int len; + void *node; + int proto; + + /* we only support the 2 mbox / 2 shmem case */ + len = OF_getproplen(sc->sc_node, "mboxes"); + if (len != 4 * sizeof(uint32_t)) { + printf("%s: invalid number of mboxes\n", sc->sc_dev.dv_xname); + return; + } + + len = OF_getproplen(sc->sc_node, "shmem"); + if (len != 2 * sizeof(uint32_t)) { + printf("%s: invalid number of shmems\n", sc->sc_dev.dv_xname); + return; + } + + shmems = malloc(len, M_DEVBUF, M_WAITOK); + OF_getpropintarray(sc->sc_node, "shmem", shmems, len); + + sc->sc_mc_tx = mbox_channel(sc->sc_node, "tx", NULL); + if (sc->sc_mc_tx == NULL) { + printf("%s: no tx mbox\n", sc->sc_dev.dv_xname); + return; + } + sc->sc_mc_rx = mbox_channel(sc->sc_node, "rx", NULL); + if (sc->sc_mc_rx == NULL) { + printf("%s: no rx mbox\n", sc->sc_dev.dv_xname); + return; + } + + node = fdt_find_phandle(shmems[0]); + if (node == NULL || !fdt_is_compatible(node, "arm,scmi-shmem") || + fdt_get_reg(node, 0, ®)) { + printf("%s: no shared memory\n", sc->sc_dev.dv_xname); + return; + } + if (bus_space_map(sc->sc_iot, reg.addr, reg.size, 0, &sc->sc_ioh_tx)) { + printf("%s: can't map shared memory\n", sc->sc_dev.dv_xname); + return; + } + sc->sc_shmem_tx = bus_space_vaddr(sc->sc_iot, sc->sc_ioh_tx); + + node = fdt_find_phandle(shmems[1]); + if (node == NULL || !fdt_is_compatible(node, "arm,scmi-shmem") || + fdt_get_reg(node, 0, ®)) { + printf("%s: no shared memory\n", sc->sc_dev.dv_xname); + return; + } + if (bus_space_map(sc->sc_iot, reg.addr, reg.size, 0, &sc->sc_ioh_rx)) { + printf("%s: can't map shared memory\n", sc->sc_dev.dv_xname); + return; + } + sc->sc_shmem_rx = bus_space_vaddr(sc->sc_iot, sc->sc_ioh_rx); + + sc->sc_command = scmi_mbox_command; + + scmi_message_header(sc->sc_shmem_tx, SCMI_BASE, SCMI_PROTOCOL_VERSION); + sc->sc_shmem_tx->length = sizeof(uint32_t); + status = sc->sc_command(sc); + if (status != SCMI_SUCCESS) { + printf("%s: protocol version command failed\n", + sc->sc_dev.dv_xname); + return; + } + + version = sc->sc_shmem_tx->message_payload[1]; + sc->sc_ver_major = version >> 16; + sc->sc_ver_minor = version & 0xfffff; + printf("%s: SCMI %d.%d\n", sc->sc_dev.dv_xname, sc->sc_ver_major, + sc->sc_ver_minor); + + for (proto = OF_child(sc->sc_node); proto; proto = OF_peer(proto)) + scmi_attach_proto(sc, proto); } int32_t -scmi_command(struct scmi_softc *sc) +scmi_smc_command(struct scmi_softc *sc) { - volatile struct scmi_shmem *shmem = sc->sc_shmem; + volatile struct scmi_shmem *shmem = sc->sc_shmem_tx; int32_t status; shmem->channel_status = 0; @@ -179,6 +350,32 @@ scmi_command(struct scmi_softc *sc) return shmem->message_payload[0]; } +int32_t +scmi_mbox_command(struct scmi_softc *sc) +{ + volatile struct scmi_shmem *shmem = sc->sc_shmem_tx; + int ret; + int i; + + shmem->channel_status = 0; + ret = mbox_send(sc->sc_mc_tx, NULL, 0); + if (ret != 0) + return SCMI_NOT_SUPPORTED; + + /* XXX: poll for now */ + for (i = 0; i < 20; i++) { + if (shmem->channel_status & SCMI_CHANNEL_FREE) + break; + delay(10); + } + if ((shmem->channel_status & SCMI_CHANNEL_ERROR)) + return SCMI_COMMS_ERROR; + if ((shmem->channel_status & SCMI_CHANNEL_FREE) == 0) + return SCMI_BUSY; + + return shmem->message_payload[0]; +} + void scmi_attach_proto(struct scmi_softc *sc, int node) { @@ -186,6 +383,9 @@ scmi_attach_proto(struct scmi_softc *sc, int node) case SCMI_CLOCK: scmi_attach_clock(sc, node); break; + case SCMI_PERF: + scmi_attach_perf(sc, node); + break; default: break; } @@ -200,13 +400,13 @@ int scmi_clock_set_frequency(void *, uint32_t *, uint32_t); void scmi_attach_clock(struct scmi_softc *sc, int node) { - volatile struct scmi_shmem *shmem = sc->sc_shmem; + volatile struct scmi_shmem *shmem = sc->sc_shmem_tx; int32_t status; int nclocks; scmi_message_header(shmem, SCMI_CLOCK, SCMI_PROTOCOL_ATTRIBUTES); shmem->length = sizeof(uint32_t); - status = scmi_command(sc); + status = sc->sc_command(sc); if (status != SCMI_SUCCESS) return; @@ -226,28 +426,28 @@ void scmi_clock_enable(void *cookie, uint32_t *cells, int on) { struct scmi_softc *sc = cookie; - volatile struct scmi_shmem *shmem = sc->sc_shmem; + volatile struct scmi_shmem *shmem = sc->sc_shmem_tx; uint32_t idx = cells[0]; scmi_message_header(shmem, SCMI_CLOCK, SCMI_CLOCK_CONFIG_SET); shmem->length = 3 * sizeof(uint32_t); shmem->message_payload[0] = idx; shmem->message_payload[1] = on ? SCMI_CLOCK_CONFIG_SET_ENABLE : 0; - scmi_command(sc); + sc->sc_command(sc); } uint32_t scmi_clock_get_frequency(void *cookie, uint32_t *cells) { struct scmi_softc *sc = cookie; - volatile struct scmi_shmem *shmem = sc->sc_shmem; + volatile struct scmi_shmem *shmem = sc->sc_shmem_tx; uint32_t idx = cells[0]; int32_t status; scmi_message_header(shmem, SCMI_CLOCK, SCMI_CLOCK_RATE_GET); shmem->length = 2 * sizeof(uint32_t); shmem->message_payload[0] = idx; - status = scmi_command(sc); + status = sc->sc_command(sc); if (status != SCMI_SUCCESS) return 0; if (shmem->message_payload[2] != 0) @@ -260,7 +460,7 @@ int scmi_clock_set_frequency(void *cookie, uint32_t *cells, uint32_t freq) { struct scmi_softc *sc = cookie; - volatile struct scmi_shmem *shmem = sc->sc_shmem; + volatile struct scmi_shmem *shmem = sc->sc_shmem_tx; uint32_t idx = cells[0]; int32_t status; @@ -270,9 +470,188 @@ scmi_clock_set_frequency(void *cookie, uint32_t *cells, uint32_t freq) shmem->message_payload[1] = idx; shmem->message_payload[2] = freq; shmem->message_payload[3] = 0; - status = scmi_command(sc); + status = sc->sc_command(sc); if (status != SCMI_SUCCESS) return -1; return 0; } + +/* Performance management */ +void scmi_perf_descr_levels(struct scmi_softc *, int); +void scmi_perf_refresh_sensor(void *); + +void +scmi_attach_perf(struct scmi_softc *sc, int node) +{ + volatile struct scmi_shmem *shmem = sc->sc_shmem_tx; + int32_t status; + uint32_t version; + int i; + + scmi_message_header(sc->sc_shmem_tx, SCMI_PERF, SCMI_PROTOCOL_VERSION); + sc->sc_shmem_tx->length = sizeof(uint32_t); + status = sc->sc_command(sc); + if (status != SCMI_SUCCESS) { + printf("%s: SCMI_PROTOCOL_VERSION failed\n", + sc->sc_dev.dv_xname); + return; + } + + version = shmem->message_payload[1]; + if (version != 0x40000) { + printf("%s: invalid perf protocol version (0x%x != 0x4000)", + sc->sc_dev.dv_xname, version); + return; + } + + scmi_message_header(shmem, SCMI_PERF, SCMI_PROTOCOL_ATTRIBUTES); + shmem->length = sizeof(uint32_t); + status = sc->sc_command(sc); + if (status != SCMI_SUCCESS) { + printf("%s: SCMI_PROTOCOL_ATTRIBUTES failed\n", + sc->sc_dev.dv_xname); + return; + } + + sc->sc_perf_ndomains = shmem->message_payload[1] & 0xffff; + sc->sc_perf_domains = malloc(sc->sc_perf_ndomains * + sizeof(struct scmi_perf_domain), M_DEVBUF, M_ZERO | M_WAITOK); + sc->sc_perf_power_unit = (shmem->message_payload[1] >> 16) & 0x3; + + strlcpy(sc->sc_perf_sensordev.xname, sc->sc_dev.dv_xname, + sizeof(sc->sc_perf_sensordev.xname)); + + sc->sc_perf_fsensors = + malloc(sc->sc_perf_ndomains * sizeof(struct ksensor), + M_DEVBUF, M_ZERO | M_WAITOK); + sc->sc_perf_psensors = + malloc(sc->sc_perf_ndomains * sizeof(struct ksensor), + M_DEVBUF, M_ZERO | M_WAITOK); + + /* Add one frequency sensor per perf domain */ + for (i = 0; i < sc->sc_perf_ndomains; i++) { + scmi_message_header(shmem, SCMI_PERF, + SCMI_PERF_DOMAIN_ATTRIBUTES); + shmem->length = 2 * sizeof(uint32_t); + shmem->message_payload[0] = i; + status = sc->sc_command(sc); + if (status != SCMI_SUCCESS) { + printf("%s: SCMI_PERF_DOMAIN_ATTRIBUTES failed\n", + sc->sc_dev.dv_xname); + goto err; + } + + scmi_perf_descr_levels(sc, i); + + sc->sc_perf_fsensors[i].type = SENSOR_FREQ; + sensor_attach(&sc->sc_perf_sensordev, &sc->sc_perf_fsensors[i]); + sc->sc_perf_psensors[i].type = SENSOR_WATTS; + sensor_attach(&sc->sc_perf_sensordev, &sc->sc_perf_psensors[i]); + } + sensordev_install(&sc->sc_perf_sensordev); + sensor_task_register(sc, scmi_perf_refresh_sensor, 1); + return; +err: + free(sc->sc_perf_fsensors, M_DEVBUF, + sc->sc_perf_ndomains * sizeof(struct ksensor)); + free(sc->sc_perf_psensors, M_DEVBUF, + sc->sc_perf_ndomains * sizeof(struct ksensor)); +} + +void +scmi_perf_descr_levels(struct scmi_softc *sc, int domain) +{ + volatile struct scmi_shmem *shmem = sc->sc_shmem_tx; + volatile struct scmi_resp_perf_describe_levels_40 *pl; + struct scmi_perf_domain *pd = &sc->sc_perf_domains[domain]; + int status, i, idx; + + idx = 0; + do { + scmi_message_header(shmem, SCMI_PERF, + SCMI_PERF_DESCRIBE_LEVELS); + shmem->length = sizeof(uint32_t) * 3; + shmem->message_payload[0] = domain; + shmem->message_payload[1] = idx; + status = sc->sc_command(sc); + if (status != SCMI_SUCCESS) { + printf("%s: SCMI_PERF_DESCRIBE_LEVELS failed\n", + sc->sc_dev.dv_xname); + return; + } + + pl = (struct scmi_resp_perf_describe_levels_40 *) + &shmem->message_payload[1]; + + if (pd->pd_levels == NULL) { + pd->pd_nlevels = pl->pl_nret + pl->pl_nrem; + pd->pd_levels = malloc(pd->pd_nlevels * + sizeof(struct scmi_perf_level), + M_DEVBUF, M_ZERO | M_WAITOK); + } + + for (i = 0; i < pl->pl_nret; i++) { + pd->pd_levels[idx + i].pl_cost = + pl->pl_entry[i].pe_cost; + pd->pd_levels[idx + i].pl_perf = + pl->pl_entry[i].pe_perf; + pd->pd_levels[idx + i].pl_ifreq = + pl->pl_entry[i].pe_ifreq; + } + idx += pl->pl_nret; + } while (pl->pl_nrem); +} + +void +scmi_perf_refresh_sensor(void *arg) +{ + struct scmi_softc *sc = arg; + volatile struct scmi_shmem *shmem = sc->sc_shmem_tx; + uint64_t power_cost; + int32_t status; + int level, i; + + if (sc->sc_perf_domains == NULL) + return; + + for (i = 0; i < sc->sc_perf_ndomains; i++) { + if (sc->sc_perf_domains[i].pd_levels == NULL) + return; + + scmi_message_header(shmem, SCMI_PERF, + SCMI_PERF_LEVEL_GET); + shmem->length = sizeof(uint32_t) * 2; + shmem->message_payload[0] = i; + status = sc->sc_command(sc); + if (status != SCMI_SUCCESS) { + printf("%s: SCMI_PERF_LEVEL_GET failed\n", + sc->sc_dev.dv_xname); + return; + } + + level = shmem->message_payload[1]; + if (sc->sc_perf_fsensors == NULL || + sc->sc_perf_psensors == NULL) + return; + + sc->sc_perf_domains[i].pd_curlevel = level; + sc->sc_perf_fsensors[i].value = + (uint64_t)sc->sc_perf_domains[i]. + pd_levels[level].pl_ifreq * 1000000000; + + switch (sc->sc_perf_power_unit) { + case SCMI_POWER_UNIT_UW: + power_cost = (uint64_t)sc->sc_perf_domains[i]. + pd_levels[level].pl_cost; + break; + case SCMI_POWER_UNIT_MW: + power_cost = (uint64_t)sc->sc_perf_domains[i]. + pd_levels[level].pl_cost * 1000; + break; + default: + continue; + } + sc->sc_perf_psensors[i].value = power_cost; + } +} diff --git a/sys/dev/fdt/simplefb.c b/sys/dev/fdt/simplefb.c index 671d5a82d..7bd3e3361 100644 --- a/sys/dev/fdt/simplefb.c +++ b/sys/dev/fdt/simplefb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: simplefb.c,v 1.20 2023/04/16 11:34:32 kettenis Exp $ */ +/* $OpenBSD: simplefb.c,v 1.21 2024/11/12 20:52:35 tobhe Exp $ */ /* * Copyright (c) 2016 Mark Kettenis * @@ -47,10 +47,10 @@ struct simplefb_format { * rasops defaults. */ const struct simplefb_format simplefb_formats[] = { - { "r5g6b5", 16 }, - { "x1r5g5b5", 15 }, - { "a1r5g5b5", 15 }, - { "r8g8b8", 24 }, + { "r5g6b5", 16, 11, 5, 5, 6, 0, 5 }, + { "x1r5g5b5", 15, 10, 5, 5, 5, 0, 5 }, + { "a1r5g5b5", 15, 10, 5, 5, 5, 0, 5 }, + { "r8g8b8", 24, 16, 8, 8, 8, 0, 8 }, { "x8r8g8b8", 32, 16, 8, 8, 8, 0, 8 }, { "a8r8g8b8", 32, 16, 8, 8, 8, 0, 8 }, { "x8b8g8r8", 32 }, diff --git a/sys/dev/fdt/virtio_mmio.c b/sys/dev/fdt/virtio_mmio.c index 604ffcab5..da7f2c3be 100644 --- a/sys/dev/fdt/virtio_mmio.c +++ b/sys/dev/fdt/virtio_mmio.c @@ -1,4 +1,4 @@ -/* $OpenBSD: virtio_mmio.c,v 1.17 2024/09/02 08:26:26 sf Exp $ */ +/* $OpenBSD: virtio_mmio.c,v 1.21 2024/12/20 22:18:27 sf Exp $ */ /* $NetBSD: virtio.c,v 1.3 2011/11/02 23:05:52 njoly Exp $ */ /* @@ -98,11 +98,13 @@ void virtio_mmio_write_device_config_8(struct virtio_softc *, int, uint64_t); uint16_t virtio_mmio_read_queue_size(struct virtio_softc *, uint16_t); void virtio_mmio_setup_queue(struct virtio_softc *, struct virtqueue *, uint64_t); void virtio_mmio_setup_intrs(struct virtio_softc *); +int virtio_mmio_attach_finish(struct virtio_softc *, struct virtio_attach_args *); int virtio_mmio_get_status(struct virtio_softc *); void virtio_mmio_set_status(struct virtio_softc *, int); int virtio_mmio_negotiate_features(struct virtio_softc *, const struct virtio_feature_name *); int virtio_mmio_intr(void *); +void virtio_mmio_intr_barrier(struct virtio_softc *); struct virtio_mmio_softc { struct virtio_softc sc_sc; @@ -118,6 +120,11 @@ struct virtio_mmio_softc { uint32_t sc_version; }; +struct virtio_mmio_attach_args { + struct virtio_attach_args vma_va; + struct fdt_attach_args *vma_fa; +}; + const struct cfattach virtio_mmio_ca = { sizeof(struct virtio_mmio_softc), virtio_mmio_match, @@ -150,7 +157,9 @@ const struct virtio_ops virtio_mmio_ops = { virtio_mmio_get_status, virtio_mmio_set_status, virtio_mmio_negotiate_features, + virtio_mmio_attach_finish, virtio_mmio_intr, + virtio_mmio_intr_barrier, }; uint16_t @@ -248,7 +257,7 @@ virtio_mmio_attach(struct device *parent, struct device *self, void *aux) struct virtio_mmio_softc *sc = (struct virtio_mmio_softc *)self; struct virtio_softc *vsc = &sc->sc_sc; uint32_t id, magic; - struct virtio_attach_args va = { 0 }; + struct virtio_mmio_attach_args vma = { { 0 }, faa }; if (faa->fa_nreg < 1) { printf(": no register data\n"); @@ -297,38 +306,45 @@ virtio_mmio_attach(struct device *parent, struct device *self, void *aux) virtio_mmio_set_status(vsc, VIRTIO_CONFIG_DEVICE_STATUS_ACK); virtio_mmio_set_status(vsc, VIRTIO_CONFIG_DEVICE_STATUS_DRIVER); - va.va_devid = id; - va.va_nintr = 1; + vma.vma_va.va_devid = id; + vma.vma_va.va_nintr = 1; vsc->sc_child = NULL; - config_found(self, &va, NULL); + config_found(self, &vma, NULL); if (vsc->sc_child == NULL) { printf("%s: no matching child driver; not configured\n", vsc->sc_dev.dv_xname); - goto fail_1; + goto fail; } if (vsc->sc_child == VIRTIO_CHILD_ERROR) { printf("%s: virtio configuration failed\n", vsc->sc_dev.dv_xname); - goto fail_1; - } - - sc->sc_ih = fdt_intr_establish(faa->fa_node, vsc->sc_ipl, - virtio_mmio_intr, sc, vsc->sc_dev.dv_xname); - if (sc->sc_ih == NULL) { - printf("%s: couldn't establish interrupt\n", - vsc->sc_dev.dv_xname); - goto fail_2; + goto fail; } return; -fail_2: - config_detach(vsc->sc_child, 0); -fail_1: - /* no mmio_mapreg_unmap() or mmio_intr_unmap() */ +fail: virtio_set_status(vsc, VIRTIO_CONFIG_DEVICE_STATUS_FAILED); } +int +virtio_mmio_attach_finish(struct virtio_softc *vsc, + struct virtio_attach_args *va) +{ + struct virtio_mmio_softc *sc = (struct virtio_mmio_softc *)vsc; + struct virtio_mmio_attach_args *vma = + (struct virtio_mmio_attach_args *)va; + + sc->sc_ih = fdt_intr_establish(vma->vma_fa->fa_node, vsc->sc_ipl, + virtio_mmio_intr, sc, vsc->sc_dev.dv_xname); + if (sc->sc_ih == NULL) { + printf("%s: couldn't establish interrupt\n", + vsc->sc_dev.dv_xname); + return -EIO; + } + return 0; +} + int virtio_mmio_detach(struct device *self, int flags) { @@ -522,3 +538,11 @@ virtio_mmio_kick(struct virtio_softc *vsc, uint16_t idx) bus_space_write_4(sc->sc_iot, sc->sc_ioh, VIRTIO_MMIO_QUEUE_NOTIFY, idx); } + +void +virtio_mmio_intr_barrier(struct virtio_softc *vsc) +{ + struct virtio_mmio_softc *sc = (struct virtio_mmio_softc *)vsc; + if (sc->sc_ih) + intr_barrier(sc->sc_ih); +} diff --git a/sys/dev/hid/hidkbd.c b/sys/dev/hid/hidkbd.c index d4a3c432b..53fd6a53f 100644 --- a/sys/dev/hid/hidkbd.c +++ b/sys/dev/hid/hidkbd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: hidkbd.c,v 1.14 2024/09/01 03:08:56 jsg Exp $ */ +/* $OpenBSD: hidkbd.c,v 1.15 2024/10/21 19:05:31 miod Exp $ */ /* $NetBSD: ukbd.c,v 1.85 2003/03/11 16:44:00 augustss Exp $ */ /* @@ -81,7 +81,7 @@ const u_int8_t hidkbd_trtab[256] = { 0x1c, 0x01, 0x0e, 0x0f, 0x39, 0x0c, 0x0d, 0x1a, /* 28 - 2f */ 0x1b, 0x2b, 0x2b, 0x27, 0x28, 0x29, 0x33, 0x34, /* 30 - 37 */ 0x35, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, /* 38 - 3f */ - 0x41, 0x42, 0x43, 0x44, 0x57, 0x58, 0xaa, 0x46, /* 40 - 47 */ + 0x41, 0x42, 0x43, 0x44, 0x57, 0x58, 0xb7, 0x46, /* 40 - 47 */ 0x7f, 0xd2, 0xc7, 0xc9, 0xd3, 0xcf, 0xd1, 0xcd, /* 48 - 4f */ 0xcb, 0xd0, 0xc8, 0x45, 0xb5, 0x37, 0x4a, 0x4e, /* 50 - 57 */ 0x9c, 0x4f, 0x50, 0x51, 0x4b, 0x4c, 0x4d, 0x47, /* 58 - 5f */ diff --git a/sys/dev/hotplug.c b/sys/dev/hotplug.c index fd296042d..40afbfbdb 100644 --- a/sys/dev/hotplug.c +++ b/sys/dev/hotplug.c @@ -1,4 +1,4 @@ -/* $OpenBSD: hotplug.c,v 1.24 2023/09/22 22:12:32 mvs Exp $ */ +/* $OpenBSD: hotplug.c,v 1.25 2024/12/30 02:46:00 guenther Exp $ */ /* * Copyright (c) 2004 Alexander Yurchenko * @@ -193,9 +193,6 @@ hotplugioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) switch (cmd) { case FIOASYNC: /* ignore */ - case FIONBIO: - /* handled in the upper fs layer */ - break; default: return (ENOTTY); } diff --git a/sys/dev/i2c/ihidev.c b/sys/dev/i2c/ihidev.c index 681a3fcc3..6a97cdde5 100644 --- a/sys/dev/i2c/ihidev.c +++ b/sys/dev/i2c/ihidev.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ihidev.c,v 1.33 2024/10/18 12:53:49 tobhe Exp $ */ +/* $OpenBSD: ihidev.c,v 1.38 2025/01/07 23:13:56 kirill Exp $ */ /* * HID-over-i2c driver * @@ -55,6 +55,7 @@ enum { /* pseudo commands */ I2C_HID_REPORT_DESCR = 0x100, + I2C_HID_RESET_RESPONSE = 0x101, }; static int I2C_HID_POWER_ON = 0x0; @@ -75,6 +76,17 @@ int ihidev_maxrepid(void *buf, int len); int ihidev_print(void *aux, const char *pnp); int ihidev_submatch(struct device *parent, void *cf, void *aux); +#define IHIDEV_QUIRK_RE_POWER_ON 0x1 + +const struct ihidev_quirks { + uint16_t ihq_vid; + uint16_t ihq_pid; + int ihq_quirks; +} ihidev_devs[] = { + /* HONOR MagicBook Art 14 Touchpad (QTEC0002) */ + { 0x35cc, 0x0104, IHIDEV_QUIRK_RE_POWER_ON }, +}; + const struct cfattach ihidev_ca = { sizeof(struct ihidev_softc), ihidev_match, @@ -98,6 +110,25 @@ ihidev_match(struct device *parent, void *match, void *aux) return (0); } +int +ihidev_quirks(struct ihidev_softc *sc) +{ + const struct ihidev_quirks *q; + uint16_t vid, pid; + int i, nent; + + nent = nitems(ihidev_devs); + + vid = letoh16(sc->hid_desc.wVendorID); + pid = letoh16(sc->hid_desc.wProductID); + + for (i = 0, q = ihidev_devs; i < nent; i++, q++) + if (vid == q->ihq_vid && pid == q->ihq_pid) + return (q->ihq_quirks); + + return (0); +} + void ihidev_attach(struct device *parent, struct device *self, void *aux) { @@ -118,32 +149,10 @@ ihidev_attach(struct device *parent, struct device *self, void *aux) return; } - if (ia->ia_intr) { - printf(" %s", iic_intr_string(sc->sc_tag, ia->ia_intr)); - - sc->sc_ih = iic_intr_establish(sc->sc_tag, ia->ia_intr, - IPL_TTY, ihidev_intr, sc, sc->sc_dev.dv_xname); - if (sc->sc_ih == NULL) - printf(", can't establish interrupt"); - } - - if (ia->ia_poll || !sc->sc_ih) { - printf(" (polling)"); - sc->sc_poll = 1; - sc->sc_fastpoll = 1; - } - - printf(", vendor 0x%x product 0x%x, %s\n", - letoh16(sc->hid_desc.wVendorID), letoh16(sc->hid_desc.wProductID), - (char *)ia->ia_cookie); - sc->sc_nrepid = ihidev_maxrepid(sc->sc_report, sc->sc_reportlen); if (sc->sc_nrepid < 0) return; - printf("%s: %d report id%s\n", sc->sc_dev.dv_xname, sc->sc_nrepid, - sc->sc_nrepid > 1 ? "s" : ""); - sc->sc_nrepid++; sc->sc_subdevs = mallocarray(sc->sc_nrepid, sizeof(struct ihidev *), M_DEVBUF, M_WAITOK | M_ZERO); @@ -162,6 +171,29 @@ ihidev_attach(struct device *parent, struct device *self, void *aux) } sc->sc_ibuf = malloc(sc->sc_isize, M_DEVBUF, M_WAITOK | M_ZERO); + if (ia->ia_intr) { + printf(" %s", iic_intr_string(sc->sc_tag, ia->ia_intr)); + + sc->sc_ih = iic_intr_establish(sc->sc_tag, ia->ia_intr, + IPL_TTY, ihidev_intr, sc, sc->sc_dev.dv_xname); + if (sc->sc_ih == NULL) + printf("%s: can't establish interrupt\n", + sc->sc_dev.dv_xname); + } + + if (ia->ia_poll || !sc->sc_ih) { + printf(" (polling)"); + sc->sc_poll = 1; + sc->sc_fastpoll = 1; + } + + printf(", vendor 0x%x product 0x%x, %s\n", + letoh16(sc->hid_desc.wVendorID), letoh16(sc->hid_desc.wProductID), + (char *)ia->ia_cookie); + + printf("%s: %d report id%s\n", sc->sc_dev.dv_xname, (sc->sc_nrepid - 1), + (sc->sc_nrepid - 1) > 1 ? "s" : ""); + iha.iaa = ia; iha.parent = sc; @@ -445,17 +477,8 @@ ihidev_hid_command(struct ihidev_softc *sc, int hidcmd, void *arg) cmd[2] = report_id | rreq->type << 4; - if (rreq->type == I2C_HID_REPORT_TYPE_FEATURE) { - cmd[dataoff++] = htole16(sc->hid_desc.wDataRegister) - & 0xff; - cmd[dataoff++] = htole16(sc->hid_desc.wDataRegister) - >> 8; - } else { - cmd[dataoff++] = htole16(sc->hid_desc.wOutputRegister) - & 0xff; - cmd[dataoff++] = htole16(sc->hid_desc.wOutputRegister) - >> 8; - } + cmd[dataoff++] = htole16(sc->hid_desc.wDataRegister) & 0xff; + cmd[dataoff++] = htole16(sc->hid_desc.wDataRegister) >> 8; cmd[dataoff++] = report_len & 0xff; cmd[dataoff++] = report_len >> 8; @@ -515,6 +538,32 @@ ihidev_hid_command(struct ihidev_softc *sc, int hidcmd, void *arg) break; } + case I2C_HID_RESET_RESPONSE: { + int i; + uint8_t buf[2] = { 0xff, 0xff }; + + DPRINTF(("%s: HID command I2C_HID_RESET_RESPONSE\n", + sc->sc_dev.dv_xname)); + + /* + * 7.2.1 states that a device should response for RESET + * in less than 5 seconds. It uses poll instead of + * tsleep because interrupts are blocked during autoconf. + */ + for (i = 0; i < 50; i++) { + ihidev_sleep(sc, 100); + res = iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP, + sc->sc_addr, NULL, 0, buf, sizeof(buf), 0); + DPRINTF(("%s: read attempt %d: 0x%x, 0x%x, res: %d\n", + sc->sc_dev.dv_xname, i, buf[0], buf[1], res)); + if (!res) + res = (buf[0] != 0x00 || buf[1] != 0x00); + if (!res) + break; + } + + break; + } default: printf("%s: unknown command %d\n", sc->sc_dev.dv_xname, hidcmd); @@ -556,7 +605,11 @@ ihidev_reset(struct ihidev_softc *sc) return (1); } - ihidev_sleep(sc, 100); + if (ihidev_hid_command(sc, I2C_HID_RESET_RESPONSE, 0)) { + printf("%s: unexpected reset response\n", + sc->sc_dev.dv_xname); + return (1); + } return (0); } @@ -570,7 +623,7 @@ ihidev_reset(struct ihidev_softc *sc) int ihidev_hid_desc_parse(struct ihidev_softc *sc) { - int retries = 3; + sc->sc_quirks = ihidev_quirks(sc); /* must be v01.00 */ if (letoh16(sc->hid_desc.bcdVersion) != 0x0100) { @@ -597,16 +650,8 @@ ihidev_hid_desc_parse(struct ihidev_softc *sc) return (1); } - while (retries-- > 0) { - if (ihidev_reset(sc)) { - if (retries == 0) - return(1); - - ihidev_sleep(sc, 10); - } - else - break; - } + if (ihidev_reset(sc)) + return (1); sc->sc_reportlen = letoh16(sc->hid_desc.wReportDescLength); sc->sc_report = malloc(sc->sc_reportlen, M_DEVBUF, M_WAITOK | M_ZERO); @@ -617,6 +662,23 @@ ihidev_hid_desc_parse(struct ihidev_softc *sc) return (1); } + if (sc->sc_quirks & IHIDEV_QUIRK_RE_POWER_ON) { + if (ihidev_poweron(sc)) + return (1); + + /* + * 7.2.8 states that a device shall not respond back + * after receiving the power on command, and must ensure + * that it transitions to power on state in less than 1 + * second. The ihidev_poweron function uses a shorter + * sleep, sufficient for the ON-RESET sequence. Here, + * however, it sleeps for the full second to accommodate + * cold boot scenarios on affected devices. + */ + + ihidev_sleep(sc, 1000); + } + return (0); } @@ -898,3 +960,34 @@ ihidev_set_report(struct device *dev, int type, int id, void *data, int len) return 0; } + +int +ihidev_send_report(struct device *dev, int repid, void *data, int data_len) +{ + struct ihidev_softc *sc = (struct ihidev_softc *)dev; + uint8_t *finalcmd, cmd[5]; + int cmd_len, report_len, res; + + cmd_len = sizeof(cmd); + report_len = 2 + 1 + data_len; + + cmd[0] = htole16(sc->hid_desc.wOutputRegister) & 0xff; + cmd[1] = htole16(sc->hid_desc.wOutputRegister) >> 8; + cmd[2] = report_len & 0xff; + cmd[3] = report_len >> 8; + cmd[4] = repid; + + finalcmd = malloc(cmd_len + data_len, M_DEVBUF, M_NOWAIT | M_ZERO); + if (finalcmd == NULL) + return ENOMEM; + + memcpy(finalcmd, cmd, cmd_len); + memcpy(finalcmd + cmd_len, data, data_len); + + res = iic_exec(sc->sc_tag, I2C_OP_WRITE_WITH_STOP, sc->sc_addr, + finalcmd, cmd_len + data_len, NULL, 0, 0); + + free(finalcmd, M_DEVBUF, cmd_len + data_len); + + return res; +} diff --git a/sys/dev/i2c/ihidev.h b/sys/dev/i2c/ihidev.h index cb87da733..e056386b8 100644 --- a/sys/dev/i2c/ihidev.h +++ b/sys/dev/i2c/ihidev.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ihidev.h,v 1.9 2022/09/03 15:48:16 kettenis Exp $ */ +/* $OpenBSD: ihidev.h,v 1.11 2025/01/07 19:26:14 mglocker Exp $ */ /* * HID-over-i2c driver * @@ -93,6 +93,8 @@ struct ihidev_softc { int sc_fastpoll; struct timeout sc_timer; int sc_dying; + + int sc_quirks; }; struct ihidev { @@ -135,5 +137,6 @@ int ihidev_ioctl(struct ihidev *, u_long, caddr_t, int, struct proc *); int ihidev_report_type_conv(int); int ihidev_set_report(struct device *, int, int, void *, int); int ihidev_get_report(struct device *, int, int, void *, int); +int ihidev_send_report(struct device *, int, void *, int); void ihidev_poll(void *); diff --git a/sys/dev/i2c/ikbd.c b/sys/dev/i2c/ikbd.c index e1e4bf8ba..6551b918f 100644 --- a/sys/dev/i2c/ikbd.c +++ b/sys/dev/i2c/ikbd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ikbd.c,v 1.2 2022/09/03 15:48:16 kettenis Exp $ */ +/* $OpenBSD: ikbd.c,v 1.3 2025/01/07 19:26:14 mglocker Exp $ */ /* * HID-over-i2c keyboard driver * @@ -36,6 +36,7 @@ struct ikbd_softc { struct ihidev sc_hdev; +#define sc_ledsize sc_hdev.sc_osize struct hidkbd sc_kbd; int sc_spl; }; @@ -167,6 +168,14 @@ ikbd_enable(void *v, int on) void ikbd_set_leds(void *v, int leds) { + struct ikbd_softc *sc = v; + struct hidkbd *kbd = &sc->sc_kbd; + uint8_t res; + + if (sc->sc_ledsize && hidkbd_set_leds(kbd, leds, &res) != 0) { + ihidev_send_report((struct device *)sc->sc_hdev.sc_parent, + sc->sc_hdev.sc_report_id, &res, 1); + } } int @@ -181,6 +190,9 @@ ikbd_ioctl(void *v, u_long cmd, caddr_t data, int flag, struct proc *p) /* XXX: should we set something else? */ *(u_int *)data = WSKBD_TYPE_USB; return 0; + case WSKBDIO_SETLEDS: + ikbd_set_leds(v, *(int *)data); + return 0; default: rc = ihidev_ioctl(&sc->sc_hdev, cmd, data, flag, p); if (rc != -1) diff --git a/sys/dev/ic/aacvar.h b/sys/dev/ic/aacvar.h index 5fda8b34d..12a560103 100644 --- a/sys/dev/ic/aacvar.h +++ b/sys/dev/ic/aacvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: aacvar.h,v 1.18 2023/09/11 08:40:25 mvs Exp $ */ +/* $OpenBSD: aacvar.h,v 1.19 2024/10/22 21:50:02 jsg Exp $ */ /*- * Copyright (c) 2000 Michael Smith @@ -235,8 +235,7 @@ typedef struct rwlock aac_lock_t; /* * Per-container data structure */ -struct aac_container -{ +struct aac_container { struct aac_mntobj co_mntobj; int co_found; TAILQ_ENTRY(aac_container) co_link; @@ -246,8 +245,7 @@ struct aac_container * A command control block, one for each corresponding command index of the * controller. */ -struct aac_command -{ +struct aac_command { TAILQ_ENTRY(aac_command) cm_link; /* list linkage */ struct aac_softc *cm_sc; /* controller that owns us */ @@ -311,8 +309,7 @@ struct aac_qstat { /* * Per-controller structure. */ -struct aac_softc -{ +struct aac_softc { struct device aac_dev; void *aac_ih; diff --git a/sys/dev/ic/adv.h b/sys/dev/ic/adv.h index d505e5e12..360f86be0 100644 --- a/sys/dev/ic/adv.h +++ b/sys/dev/ic/adv.h @@ -1,4 +1,4 @@ -/* $OpenBSD: adv.h,v 1.7 2020/02/18 20:24:52 krw Exp $ */ +/* $OpenBSD: adv.h,v 1.8 2024/10/22 21:50:02 jsg Exp $ */ /* $NetBSD: adv.h,v 1.3 1998/09/26 16:02:56 dante Exp $ */ /* @@ -39,8 +39,7 @@ /******************************************************************************/ -struct adv_ccb -{ +struct adv_ccb { ASC_SG_HEAD sghead; ASC_SCSI_Q scsiq; @@ -67,8 +66,7 @@ typedef struct adv_ccb ADV_CCB; #define ADV_MAX_CCB 32 -struct adv_control -{ +struct adv_control { ADV_CCB ccbs[ADV_MAX_CCB]; /* all our control blocks */ }; diff --git a/sys/dev/ic/ahci.c b/sys/dev/ic/ahci.c index bd3fdbe7c..0c336636c 100644 --- a/sys/dev/ic/ahci.c +++ b/sys/dev/ic/ahci.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ahci.c,v 1.42 2024/09/04 07:54:52 mglocker Exp $ */ +/* $OpenBSD: ahci.c,v 1.43 2024/11/22 09:29:41 jan Exp $ */ /* * Copyright (c) 2006 David Gwynne @@ -321,6 +321,9 @@ noccc: sc->sc_atascsi = atascsi_attach(&sc->sc_dev, &aaa); + /* Flush all residual bits of the interrupt status register */ + ahci_write(sc, AHCI_REG_IS, ahci_read(sc, AHCI_REG_IS)); + /* Enable interrupts */ ahci_write(sc, AHCI_REG_GHC, AHCI_REG_GHC_AE | AHCI_REG_GHC_IE); diff --git a/sys/dev/ic/aic79xx.h b/sys/dev/ic/aic79xx.h index 03d6af31d..f1e223dd4 100644 --- a/sys/dev/ic/aic79xx.h +++ b/sys/dev/ic/aic79xx.h @@ -1,4 +1,4 @@ -/* $OpenBSD: aic79xx.h,v 1.33 2024/09/04 07:54:52 mglocker Exp $ */ +/* $OpenBSD: aic79xx.h,v 1.34 2024/10/22 21:50:02 jsg Exp $ */ /* * Copyright (c) 2004 Milos Urbanek, Kenneth R. Westerback & Marco Peereboom @@ -1034,8 +1034,7 @@ typedef uint8_t ahd_mode_state; typedef void ahd_callback_t (void *); -struct ahd_completion -{ +struct ahd_completion { uint16_t tag; uint8_t sg_status; uint8_t valid_tag; diff --git a/sys/dev/ic/bcmgenet.c b/sys/dev/ic/bcmgenet.c index 9054c57ba..8305d2d14 100644 --- a/sys/dev/ic/bcmgenet.c +++ b/sys/dev/ic/bcmgenet.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bcmgenet.c,v 1.7 2023/11/10 15:51:20 bluhm Exp $ */ +/* $OpenBSD: bcmgenet.c,v 1.8 2024/11/05 18:58:59 miod Exp $ */ /* $NetBSD: bcmgenet.c,v 1.3 2020/02/27 17:30:07 jmcneill Exp $ */ /*- @@ -82,7 +82,7 @@ CTASSERT(MCLBYTES == 2048); bus_space_write_4((sc)->sc_bst, (sc)->sc_bsh, (reg), (val)) struct cfdriver bse_cd = { - 0, "bse", DV_IFNET + NULL, "bse", DV_IFNET }; int diff --git a/sys/dev/ic/dc.c b/sys/dev/ic/dc.c index 924943f0a..b9e000ae2 100644 --- a/sys/dev/ic/dc.c +++ b/sys/dev/ic/dc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dc.c,v 1.158 2024/08/31 16:23:09 deraadt Exp $ */ +/* $OpenBSD: dc.c,v 1.159 2024/11/05 18:58:59 miod Exp $ */ /* * Copyright (c) 1997, 1998, 1999 @@ -3110,5 +3110,5 @@ dc_detach(struct dc_softc *sc) } struct cfdriver dc_cd = { - 0, "dc", DV_IFNET + NULL, "dc", DV_IFNET }; diff --git a/sys/dev/ic/mtd8xx.c b/sys/dev/ic/mtd8xx.c index 68989be1f..e1bc1c973 100644 --- a/sys/dev/ic/mtd8xx.c +++ b/sys/dev/ic/mtd8xx.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mtd8xx.c,v 1.35 2022/01/09 05:42:38 jsg Exp $ */ +/* $OpenBSD: mtd8xx.c,v 1.36 2024/11/05 18:58:59 miod Exp $ */ /* * Copyright (c) 2003 Oleg Safiullin @@ -1059,5 +1059,5 @@ mtd_txeof(struct mtd_softc *sc) } struct cfdriver mtd_cd = { - 0, "mtd", DV_IFNET + NULL, "mtd", DV_IFNET }; diff --git a/sys/dev/ic/psp.c b/sys/dev/ic/psp.c index 95babb7d3..bd9914810 100644 --- a/sys/dev/ic/psp.c +++ b/sys/dev/ic/psp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: psp.c,v 1.5 2024/10/04 16:58:26 bluhm Exp $ */ +/* $OpenBSD: psp.c,v 1.15 2024/11/20 13:36:55 bluhm Exp $ */ /* * Copyright (c) 2023, 2024 Hans-Joerg Hoexer @@ -19,13 +19,15 @@ #include #include #include +#include +#include #include +#include #include #include -#include -#include +#include #include #include @@ -37,7 +39,12 @@ struct psp_softc { bus_space_handle_t sc_ioh; bus_dma_tag_t sc_dmat; - uint32_t sc_capabilities; + + bus_size_t sc_reg_inten; + bus_size_t sc_reg_intsts; + bus_size_t sc_reg_cmdresp; + bus_size_t sc_reg_addrlo; + bus_size_t sc_reg_addrhi; bus_dmamap_t sc_cmd_map; bus_dma_segment_t sc_cmd_seg; @@ -50,12 +57,23 @@ struct psp_softc { caddr_t sc_tmr_kva; struct rwlock sc_lock; + struct mutex psp_lock; + + uint32_t sc_flags; +#define PSPF_INITIALIZED 0x1 +#define PSPF_UCODELOADED 0x2 +#define PSPF_NOUCODE 0x4 + + u_char *sc_ucodebuf; + size_t sc_ucodelen; }; int psp_get_pstatus(struct psp_softc *, struct psp_platform_status *); int psp_init(struct psp_softc *, struct psp_init *); +int psp_reinit(struct psp_softc *); int psp_match(struct device *, void *, void *); void psp_attach(struct device *, struct device *, void *); +int psp_load_ucode(struct psp_softc *); struct cfdriver psp_cd = { NULL, "psp", DV_DULL @@ -74,8 +92,10 @@ psp_sev_intr(void *arg) struct psp_softc *sc = (struct psp_softc *)csc->sc_psp; uint32_t status; - status = bus_space_read_4(sc->sc_iot, sc->sc_ioh, PSP_REG_INTSTS); - bus_space_write_4(sc->sc_iot, sc->sc_ioh, PSP_REG_INTSTS, status); + mtx_enter(&sc->psp_lock); + status = bus_space_read_4(sc->sc_iot, sc->sc_ioh, sc->sc_reg_intsts); + bus_space_write_4(sc->sc_iot, sc->sc_ioh, sc->sc_reg_intsts, status); + mtx_leave(&sc->psp_lock); if (!(status & PSP_CMDRESP_COMPLETE)) return (0); @@ -97,129 +117,114 @@ psp_attach(struct device *parent, struct device *self, void *aux) struct psp_softc *sc = (struct psp_softc *)self; struct psp_attach_args *arg = aux; struct psp_platform_status pst; - struct psp_init init; size_t size; - int nsegs; + int nsegs, error; + printf(":"); sc->sc_iot = arg->iot; sc->sc_ioh = arg->ioh; sc->sc_dmat = arg->dmat; - sc->sc_capabilities = arg->capabilities; + if (arg->version == 1) { + sc->sc_reg_inten = PSPV1_REG_INTEN; + sc->sc_reg_intsts = PSPV1_REG_INTSTS; + sc->sc_reg_cmdresp = PSPV1_REG_CMDRESP; + sc->sc_reg_addrlo = PSPV1_REG_ADDRLO; + sc->sc_reg_addrhi = PSPV1_REG_ADDRHI; + } else { + sc->sc_reg_inten = PSP_REG_INTEN; + sc->sc_reg_intsts = PSP_REG_INTSTS; + sc->sc_reg_cmdresp = PSP_REG_CMDRESP; + sc->sc_reg_addrlo = PSP_REG_ADDRLO; + sc->sc_reg_addrhi = PSP_REG_ADDRHI; + } + if (arg->version) + printf(" vers %d,", arg->version); rw_init(&sc->sc_lock, "psp_lock"); + mtx_init(&sc->psp_lock, IPL_BIO); /* create and map SEV command buffer */ sc->sc_cmd_size = size = PAGE_SIZE; - if (bus_dmamap_create(sc->sc_dmat, size, 1, size, 0, - BUS_DMA_WAITOK | BUS_DMA_ALLOCNOW | BUS_DMA_64BIT, - &sc->sc_cmd_map) != 0) - return; - - if (bus_dmamem_alloc(sc->sc_dmat, size, 0, 0, &sc->sc_cmd_seg, 1, - &nsegs, BUS_DMA_WAITOK | BUS_DMA_ZERO) != 0) + error = bus_dmamap_create(sc->sc_dmat, size, 1, size, 0, + BUS_DMA_WAITOK | BUS_DMA_ALLOCNOW | BUS_DMA_64BIT, &sc->sc_cmd_map); + if (error) goto fail_0; - if (bus_dmamem_map(sc->sc_dmat, &sc->sc_cmd_seg, nsegs, size, - &sc->sc_cmd_kva, BUS_DMA_WAITOK) != 0) + error = bus_dmamem_alloc(sc->sc_dmat, size, 0, 0, &sc->sc_cmd_seg, 1, + &nsegs, BUS_DMA_WAITOK | BUS_DMA_ZERO); + if (error) goto fail_1; - if (bus_dmamap_load(sc->sc_dmat, sc->sc_cmd_map, sc->sc_cmd_kva, - size, NULL, BUS_DMA_WAITOK) != 0) + error = bus_dmamem_map(sc->sc_dmat, &sc->sc_cmd_seg, nsegs, size, + &sc->sc_cmd_kva, BUS_DMA_WAITOK); + if (error) goto fail_2; - if (psp_get_pstatus(sc, &pst) || pst.state != 0) + error = bus_dmamap_load(sc->sc_dmat, sc->sc_cmd_map, sc->sc_cmd_kva, + size, NULL, BUS_DMA_WAITOK); + if (error) goto fail_3; - /* - * create and map Trusted Memory Region (TMR); size 1 Mbyte, - * needs to be aligned to 1 Mbyte. - */ - sc->sc_tmr_size = size = PSP_TMR_SIZE; - if (bus_dmamap_create(sc->sc_dmat, size, 1, size, 0, - BUS_DMA_WAITOK | BUS_DMA_ALLOCNOW | BUS_DMA_64BIT, - &sc->sc_tmr_map) != 0) - goto fail_3; - - if (bus_dmamem_alloc(sc->sc_dmat, size, size, 0, &sc->sc_tmr_seg, 1, - &nsegs, BUS_DMA_WAITOK | BUS_DMA_ZERO) != 0) + if (psp_get_pstatus(sc, &pst)) { + printf(" platform status"); goto fail_4; + } + if (pst.state != PSP_PSTATE_UNINIT) { + printf(" uninitialized state"); + goto fail_4; + } + printf(" api %u.%u, build %u, SEV, SEV-ES", + pst.api_major, pst.api_minor, pst.cfges_build >> 24); - if (bus_dmamem_map(sc->sc_dmat, &sc->sc_tmr_seg, nsegs, size, - &sc->sc_tmr_kva, BUS_DMA_WAITOK) != 0) - goto fail_5; - - if (bus_dmamap_load(sc->sc_dmat, sc->sc_tmr_map, sc->sc_tmr_kva, - size, NULL, BUS_DMA_WAITOK) != 0) - goto fail_6; - - memset(&init, 0, sizeof(init)); - init.enable_es = 1; - init.tmr_length = PSP_TMR_SIZE; - init.tmr_paddr = sc->sc_tmr_map->dm_segs[0].ds_addr; - if (psp_init(sc, &init)) - goto fail_7; - - printf(": SEV"); - - psp_get_pstatus(sc, &pst); - if ((pst.state == 1) && (pst.cfges_build & 0x1)) - printf(", SEV-ES"); + /* enable interrupts */ + bus_space_write_4(sc->sc_iot, sc->sc_ioh, sc->sc_reg_inten, -1); printf("\n"); return; -fail_7: - bus_dmamap_unload(sc->sc_dmat, sc->sc_tmr_map); -fail_6: - bus_dmamem_unmap(sc->sc_dmat, sc->sc_tmr_kva, size); -fail_5: - bus_dmamem_free(sc->sc_dmat, &sc->sc_tmr_seg, 1); fail_4: - bus_dmamap_destroy(sc->sc_dmat, sc->sc_tmr_map); -fail_3: bus_dmamap_unload(sc->sc_dmat, sc->sc_cmd_map); -fail_2: +fail_3: bus_dmamem_unmap(sc->sc_dmat, sc->sc_cmd_kva, size); +fail_2: + bus_dmamem_free(sc->sc_dmat, &sc->sc_cmd_seg, nsegs); fail_1: - bus_dmamem_free(sc->sc_dmat, &sc->sc_cmd_seg, 1); -fail_0: bus_dmamap_destroy(sc->sc_dmat, sc->sc_cmd_map); - - printf("\n"); - - return; +fail_0: + printf(" failed\n"); } static int ccp_wait(struct psp_softc *sc, uint32_t *status, int poll) { uint32_t cmdword; - int count; + int count, error; + + MUTEX_ASSERT_LOCKED(&sc->psp_lock); if (poll) { count = 0; - while (count++ < 100) { + while (count++ < 400) { cmdword = bus_space_read_4(sc->sc_iot, sc->sc_ioh, - PSP_REG_CMDRESP); + sc->sc_reg_cmdresp); if (cmdword & PSP_CMDRESP_RESPONSE) goto done; delay(5000); } /* timeout */ - return (1); + return (EWOULDBLOCK); } - if (tsleep_nsec(sc, PWAIT, "psp", SEC_TO_NSEC(2)) == EWOULDBLOCK) - return (1); + error = msleep_nsec(sc, &sc->psp_lock, PWAIT, "psp", SEC_TO_NSEC(2)); + if (error) + return (error); + cmdword = bus_space_read_4(sc->sc_iot, sc->sc_ioh, sc->sc_reg_cmdresp); done: - if (status) { - *status = bus_space_read_4(sc->sc_iot, sc->sc_ioh, - PSP_REG_CMDRESP); - } - + if (status != NULL) + *status = cmdword; return (0); } @@ -227,6 +232,7 @@ static int ccp_docmd(struct psp_softc *sc, int cmd, uint64_t paddr) { uint32_t plo, phi, cmdword, status; + int error; plo = ((paddr >> 0) & 0xffffffff); phi = ((paddr >> 32) & 0xffffffff); @@ -234,17 +240,20 @@ ccp_docmd(struct psp_softc *sc, int cmd, uint64_t paddr) if (!cold) cmdword |= PSP_CMDRESP_IOC; - bus_space_write_4(sc->sc_iot, sc->sc_ioh, PSP_REG_ADDRLO, plo); - bus_space_write_4(sc->sc_iot, sc->sc_ioh, PSP_REG_ADDRHI, phi); - bus_space_write_4(sc->sc_iot, sc->sc_ioh, PSP_REG_CMDRESP, cmdword); + mtx_enter(&sc->psp_lock); + bus_space_write_4(sc->sc_iot, sc->sc_ioh, sc->sc_reg_addrlo, plo); + bus_space_write_4(sc->sc_iot, sc->sc_ioh, sc->sc_reg_addrhi, phi); + bus_space_write_4(sc->sc_iot, sc->sc_ioh, sc->sc_reg_cmdresp, cmdword); - if (ccp_wait(sc, &status, cold)) - return (1); + error = ccp_wait(sc, &status, cold); + mtx_leave(&sc->psp_lock); + if (error) + return (error); /* Did PSP sent a response code? */ if (status & PSP_CMDRESP_RESPONSE) { if ((status & PSP_STATUS_MASK) != PSP_STATUS_SUCCESS) - return (1); + return (EIO); } return (0); @@ -254,7 +263,7 @@ int psp_init(struct psp_softc *sc, struct psp_init *uinit) { struct psp_init *init; - int ret; + int error; init = (struct psp_init *)sc->sc_cmd_kva; bzero(init, sizeof(*init)); @@ -263,11 +272,102 @@ psp_init(struct psp_softc *sc, struct psp_init *uinit) init->tmr_paddr = uinit->tmr_paddr; init->tmr_length = uinit->tmr_length; - ret = ccp_docmd(sc, PSP_CMD_INIT, sc->sc_cmd_map->dm_segs[0].ds_addr); - if (ret != 0) - return (EIO); + error = ccp_docmd(sc, PSP_CMD_INIT, sc->sc_cmd_map->dm_segs[0].ds_addr); + if (error) + return (error); - wbinvd_on_all_cpus(); + wbinvd_on_all_cpus_acked(); + + sc->sc_flags |= PSPF_INITIALIZED; + + return (0); +} + +int +psp_reinit(struct psp_softc *sc) +{ + struct psp_init init; + size_t size; + int nsegs, error; + + if (sc->sc_flags & PSPF_INITIALIZED) { + printf("%s: invalid flags 0x%x\n", __func__, sc->sc_flags); + return (EBUSY); + } + + if (sc->sc_tmr_map != NULL) + return (EBUSY); + + /* + * create and map Trusted Memory Region (TMR); size 1 Mbyte, + * needs to be aligend to 1 Mbyte. + */ + sc->sc_tmr_size = size = PSP_TMR_SIZE; + error = bus_dmamap_create(sc->sc_dmat, size, 1, size, 0, + BUS_DMA_WAITOK | BUS_DMA_ALLOCNOW | BUS_DMA_64BIT, &sc->sc_tmr_map); + if (error) + goto fail_0; + + error = bus_dmamem_alloc(sc->sc_dmat, size, size, 0, &sc->sc_tmr_seg, 1, + &nsegs, BUS_DMA_WAITOK | BUS_DMA_ZERO); + if (error) + goto fail_1; + + error = bus_dmamem_map(sc->sc_dmat, &sc->sc_tmr_seg, nsegs, size, + &sc->sc_tmr_kva, BUS_DMA_WAITOK); + if (error) + goto fail_2; + + error = bus_dmamap_load(sc->sc_dmat, sc->sc_tmr_map, sc->sc_tmr_kva, + size, NULL, BUS_DMA_WAITOK); + if (error) + goto fail_3; + + memset(&init, 0, sizeof(init)); + init.enable_es = 1; + init.tmr_length = PSP_TMR_SIZE; + init.tmr_paddr = sc->sc_tmr_map->dm_segs[0].ds_addr; + if ((error = psp_init(sc, &init)) != 0) + goto fail_4; + + return (0); + +fail_4: + bus_dmamap_unload(sc->sc_dmat, sc->sc_tmr_map); +fail_3: + bus_dmamem_unmap(sc->sc_dmat, sc->sc_tmr_kva, size); +fail_2: + bus_dmamem_free(sc->sc_dmat, &sc->sc_tmr_seg, nsegs); +fail_1: + bus_dmamap_destroy(sc->sc_dmat, sc->sc_tmr_map); +fail_0: + return (error); +} + +int +psp_shutdown(struct psp_softc *sc) +{ + int error; + + if (sc->sc_tmr_map == NULL) + return (EINVAL); + + error = ccp_docmd(sc, PSP_CMD_SHUTDOWN, 0x0); + if (error) + return (error); + + /* wbinvd right after SHUTDOWN */ + wbinvd_on_all_cpus_acked(); + + /* release TMR */ + bus_dmamap_unload(sc->sc_dmat, sc->sc_tmr_map); + bus_dmamem_unmap(sc->sc_dmat, sc->sc_tmr_kva, sc->sc_tmr_size); + bus_dmamem_free(sc->sc_dmat, &sc->sc_tmr_seg, 1); + bus_dmamap_destroy(sc->sc_dmat, sc->sc_tmr_map); + sc->sc_tmr_map = NULL; + + /* reset flags */ + sc->sc_flags = 0; return (0); } @@ -275,17 +375,16 @@ psp_init(struct psp_softc *sc, struct psp_init *uinit) int psp_get_pstatus(struct psp_softc *sc, struct psp_platform_status *ustatus) { - struct psp_platform_status *status; - int ret; + struct psp_platform_status *status; + int error; status = (struct psp_platform_status *)sc->sc_cmd_kva; bzero(status, sizeof(*status)); - ret = ccp_docmd(sc, PSP_CMD_PLATFORMSTATUS, + error = ccp_docmd(sc, PSP_CMD_PLATFORMSTATUS, sc->sc_cmd_map->dm_segs[0].ds_addr); - - if (ret != 0) - return (EIO); + if (error) + return (error); bcopy(status, ustatus, sizeof(*ustatus)); @@ -295,54 +394,47 @@ psp_get_pstatus(struct psp_softc *sc, struct psp_platform_status *ustatus) int psp_df_flush(struct psp_softc *sc) { - int ret; + int error; - wbinvd_on_all_cpus(); + wbinvd_on_all_cpus_acked(); - ret = ccp_docmd(sc, PSP_CMD_DF_FLUSH, 0x0); + error = ccp_docmd(sc, PSP_CMD_DF_FLUSH, 0x0); - if (ret != 0) - return (EIO); - - return (0); + return (error); } int psp_decommission(struct psp_softc *sc, struct psp_decommission *udecom) { struct psp_decommission *decom; - int ret; + int error; decom = (struct psp_decommission *)sc->sc_cmd_kva; bzero(decom, sizeof(*decom)); decom->handle = udecom->handle; - ret = ccp_docmd(sc, PSP_CMD_DECOMMISSION, + error = ccp_docmd(sc, PSP_CMD_DECOMMISSION, sc->sc_cmd_map->dm_segs[0].ds_addr); - if (ret != 0) - return (EIO); - - return (0); + return (error); } int psp_get_gstatus(struct psp_softc *sc, struct psp_guest_status *ustatus) { struct psp_guest_status *status; - int ret; + int error; status = (struct psp_guest_status *)sc->sc_cmd_kva; bzero(status, sizeof(*status)); status->handle = ustatus->handle; - ret = ccp_docmd(sc, PSP_CMD_GUESTSTATUS, + error = ccp_docmd(sc, PSP_CMD_GUESTSTATUS, sc->sc_cmd_map->dm_segs[0].ds_addr); - - if (ret != 0) - return (EIO); + if (error) + return (error); ustatus->policy = status->policy; ustatus->asid = status->asid; @@ -355,7 +447,7 @@ int psp_launch_start(struct psp_softc *sc, struct psp_launch_start *ustart) { struct psp_launch_start *start; - int ret; + int error; start = (struct psp_launch_start *)sc->sc_cmd_kva; bzero(start, sizeof(*start)); @@ -363,11 +455,10 @@ psp_launch_start(struct psp_softc *sc, struct psp_launch_start *ustart) start->handle = ustart->handle; start->policy = ustart->policy; - ret = ccp_docmd(sc, PSP_CMD_LAUNCH_START, + error = ccp_docmd(sc, PSP_CMD_LAUNCH_START, sc->sc_cmd_map->dm_segs[0].ds_addr); - - if (ret != 0) - return (EIO); + if (error) + return (error); /* If requested, return new handle. */ if (ustart->handle == 0) @@ -382,9 +473,9 @@ psp_launch_update_data(struct psp_softc *sc, { struct psp_launch_update_data *ludata; pmap_t pmap; - vaddr_t v, next, end; + vaddr_t v, next, start, end; size_t size, len, off; - int ret; + int error; /* Ensure AES_XTS_BLOCKSIZE alignment and multiplicity. */ if ((ulud->paddr & (AES_XTS_BLOCKSIZE - 1)) != 0 || @@ -397,7 +488,7 @@ psp_launch_update_data(struct psp_softc *sc, ludata->handle = ulud->handle; /* Drain caches before we encrypt memory. */ - wbinvd_on_all_cpus(); + wbinvd_on_all_cpus_acked(); /* * Launch update one physical page at a time. We could @@ -407,39 +498,51 @@ psp_launch_update_data(struct psp_softc *sc, * to system physical address. */ pmap = vm_map_pmap(&p->p_vmspace->vm_map); + start = ulud->paddr; size = ulud->length; - end = ulud->paddr + ulud->length; + end = start + size; + + /* Wire mapping. */ + error = uvm_map_pageable(&p->p_vmspace->vm_map, start, end, FALSE, 0); + if (error) + goto out; + for (v = ulud->paddr; v < end; v = next) { off = v & PAGE_MASK; len = MIN(PAGE_SIZE - off, size); - /* Wire mapping. */ - if (uvm_map_pageable(&p->p_vmspace->vm_map, v, v+len, FALSE, 0)) - return (EINVAL); - if (!pmap_extract(pmap, v, (paddr_t *)&ludata->paddr)) - return (EINVAL); + if (!pmap_extract(pmap, v, (paddr_t *)&ludata->paddr)) { + error = EINVAL; + goto out; + } ludata->length = len; - ret = ccp_docmd(sc, PSP_CMD_LAUNCH_UPDATE_DATA, + error = ccp_docmd(sc, PSP_CMD_LAUNCH_UPDATE_DATA, sc->sc_cmd_map->dm_segs[0].ds_addr); - - if (ret != 0) - return (EIO); + if (error) + goto out; size -= len; next = v + len; } - return (0); +out: + /* + * Unwire again. Ignore new error. Error has either been set, + * or PSP command has already succeeded. + */ + (void) uvm_map_pageable(&p->p_vmspace->vm_map, start, end, TRUE, 0); + + return (error); } int psp_launch_measure(struct psp_softc *sc, struct psp_launch_measure *ulm) { - struct psp_launch_measure *lm; - int ret; - uint64_t paddr; + struct psp_launch_measure *lm; + uint64_t paddr; + int error; if (ulm->measure_len != sizeof(ulm->psp_measure)) return (EINVAL); @@ -453,10 +556,11 @@ psp_launch_measure(struct psp_softc *sc, struct psp_launch_measure *ulm) paddr + offsetof(struct psp_launch_measure, psp_measure); lm->measure_len = sizeof(lm->psp_measure); - ret = ccp_docmd(sc, PSP_CMD_LAUNCH_MEASURE, paddr); - - if (ret != 0 || lm->measure_len != ulm->measure_len) - return (EIO); + error = ccp_docmd(sc, PSP_CMD_LAUNCH_MEASURE, paddr); + if (error) + return (error); + if (lm->measure_len != ulm->measure_len) + return (ERANGE); bcopy(&lm->psp_measure, &ulm->psp_measure, ulm->measure_len); @@ -466,29 +570,26 @@ psp_launch_measure(struct psp_softc *sc, struct psp_launch_measure *ulm) int psp_launch_finish(struct psp_softc *sc, struct psp_launch_finish *ulf) { - struct psp_launch_finish *lf; - int ret; + struct psp_launch_finish *lf; + int error; lf = (struct psp_launch_finish *)sc->sc_cmd_kva; bzero(lf, sizeof(*lf)); lf->handle = ulf->handle; - ret = ccp_docmd(sc, PSP_CMD_LAUNCH_FINISH, + error = ccp_docmd(sc, PSP_CMD_LAUNCH_FINISH, sc->sc_cmd_map->dm_segs[0].ds_addr); - if (ret != 0) - return (EIO); - - return (0); + return (error); } int psp_attestation(struct psp_softc *sc, struct psp_attestation *uat) { struct psp_attestation *at; - int ret; uint64_t paddr; + int error; if (uat->attest_len != sizeof(uat->psp_report)) return (EINVAL); @@ -503,10 +604,11 @@ psp_attestation(struct psp_softc *sc, struct psp_attestation *uat) bcopy(uat->attest_nonce, at->attest_nonce, sizeof(at->attest_nonce)); at->attest_len = sizeof(at->psp_report); - ret = ccp_docmd(sc, PSP_CMD_ATTESTATION, paddr); - - if (ret != 0 || at->attest_len != uat->attest_len) - return (EIO); + error = ccp_docmd(sc, PSP_CMD_ATTESTATION, paddr); + if (error) + return (error); + if (at->attest_len != uat->attest_len) + return (ERANGE); bcopy(&at->psp_report, &uat->psp_report, uat->attest_len); @@ -517,7 +619,7 @@ int psp_activate(struct psp_softc *sc, struct psp_activate *uact) { struct psp_activate *act; - int ret; + int error; act = (struct psp_activate *)sc->sc_cmd_kva; bzero(act, sizeof(*act)); @@ -525,33 +627,78 @@ psp_activate(struct psp_softc *sc, struct psp_activate *uact) act->handle = uact->handle; act->asid = uact->asid; - ret = ccp_docmd(sc, PSP_CMD_ACTIVATE, + error = ccp_docmd(sc, PSP_CMD_ACTIVATE, sc->sc_cmd_map->dm_segs[0].ds_addr); - if (ret != 0) - return (EIO); - - return (0); + return (error); } int psp_deactivate(struct psp_softc *sc, struct psp_deactivate *udeact) { struct psp_deactivate *deact; - int ret; + int error; deact = (struct psp_deactivate *)sc->sc_cmd_kva; bzero(deact, sizeof(*deact)); deact->handle = udeact->handle; - ret = ccp_docmd(sc, PSP_CMD_DEACTIVATE, + error = ccp_docmd(sc, PSP_CMD_DEACTIVATE, sc->sc_cmd_map->dm_segs[0].ds_addr); - if (ret != 0) - return (EIO); + return (error); +} - return (0); +int +psp_downloadfirmware(struct psp_softc *sc, struct psp_downloadfirmware *udlfw) +{ + struct psp_downloadfirmware *dlfw; + bus_dmamap_t map; + bus_dma_segment_t seg; + caddr_t kva; + int nsegs, error; + + dlfw = (struct psp_downloadfirmware *)sc->sc_cmd_kva; + bzero(dlfw, sizeof(*dlfw)); + + error = bus_dmamap_create(sc->sc_dmat, udlfw->fw_len, 1, udlfw->fw_len, + 0, BUS_DMA_WAITOK | BUS_DMA_ALLOCNOW | BUS_DMA_64BIT, &map); + if (error) + goto fail_0; + + error = bus_dmamem_alloc(sc->sc_dmat, udlfw->fw_len, 0, 0, &seg, 1, + &nsegs, BUS_DMA_WAITOK | BUS_DMA_ZERO); + if (error) + goto fail_1; + + error = bus_dmamem_map(sc->sc_dmat, &seg, nsegs, udlfw->fw_len, &kva, + BUS_DMA_WAITOK); + if (error) + goto fail_2; + + error = bus_dmamap_load(sc->sc_dmat, map, kva, udlfw->fw_len, NULL, + BUS_DMA_WAITOK); + if (error) + goto fail_3; + + bcopy((void *)udlfw->fw_paddr, kva, udlfw->fw_len); + + dlfw->fw_paddr = map->dm_segs[0].ds_addr; + dlfw->fw_len = map->dm_segs[0].ds_len; + + error = ccp_docmd(sc, PSP_CMD_DOWNLOADFIRMWARE, + sc->sc_cmd_map->dm_segs[0].ds_addr); + + bus_dmamap_unload(sc->sc_dmat, map); +fail_3: + bus_dmamem_unmap(sc->sc_dmat, kva, udlfw->fw_len); +fail_2: + bus_dmamem_free(sc->sc_dmat, &seg, nsegs); +fail_1: + bus_dmamap_destroy(sc->sc_dmat, map); +fail_0: + return (error); } int @@ -559,20 +706,20 @@ psp_guest_shutdown(struct psp_softc *sc, struct psp_guest_shutdown *ugshutdown) { struct psp_deactivate deact; struct psp_decommission decom; - int ret; + int error; bzero(&deact, sizeof(deact)); deact.handle = ugshutdown->handle; - if ((ret = psp_deactivate(sc, &deact)) != 0) - return (ret); + if ((error = psp_deactivate(sc, &deact)) != 0) + return (error); - if ((ret = psp_df_flush(sc)) != 0) - return (ret); + if ((error = psp_df_flush(sc)) != 0) + return (error); bzero(&decom, sizeof(decom)); decom.handle = ugshutdown->handle; - if ((ret = psp_decommission(sc, &decom)) != 0) - return (ret); + if ((error = psp_decommission(sc, &decom)) != 0) + return (error); return (0); } @@ -581,17 +728,16 @@ int psp_snp_get_pstatus(struct psp_softc *sc, struct psp_snp_platform_status *ustatus) { - struct psp_snp_platform_status *status; - int ret; + struct psp_snp_platform_status *status; + int error; status = (struct psp_snp_platform_status *)sc->sc_cmd_kva; bzero(status, sizeof(*status)); - ret = ccp_docmd(sc, PSP_CMD_SNP_PLATFORMSTATUS, + error = ccp_docmd(sc, PSP_CMD_SNP_PLATFORMSTATUS, sc->sc_cmd_map->dm_segs[0].ds_addr); - - if (ret != 0) - return (EIO); + if (error) + return (error); bcopy(status, ustatus, sizeof(*ustatus)); @@ -607,6 +753,12 @@ pspopen(dev_t dev, int flag, int mode, struct proc *p) if (sc == NULL) return (ENXIO); + /* Ignore error, proceed without new firmware. */ + (void) psp_load_ucode(sc); + + if (!(sc->sc_flags & PSPF_INITIALIZED)) + return (psp_reinit(sc)); + return (0); } @@ -625,65 +777,77 @@ pspclose(dev_t dev, int flag, int mode, struct proc *p) int pspioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) { - struct psp_softc *sc; - int ret; + struct psp_softc *sc; + int error; sc = (struct psp_softc *)device_lookup(&psp_cd, minor(dev)); if (sc == NULL) return (ENXIO); + KERNEL_UNLOCK(); + rw_enter_write(&sc->sc_lock); switch (cmd) { + case PSP_IOC_INIT: + error = psp_reinit(sc); + break; + case PSP_IOC_SHUTDOWN: + error = psp_shutdown(sc); + break; case PSP_IOC_GET_PSTATUS: - ret = psp_get_pstatus(sc, (struct psp_platform_status *)data); + error = psp_get_pstatus(sc, (struct psp_platform_status *)data); break; case PSP_IOC_DF_FLUSH: - ret = psp_df_flush(sc); + error = psp_df_flush(sc); break; case PSP_IOC_DECOMMISSION: - ret = psp_decommission(sc, (struct psp_decommission *)data); + error = psp_decommission(sc, (struct psp_decommission *)data); break; case PSP_IOC_GET_GSTATUS: - ret = psp_get_gstatus(sc, (struct psp_guest_status *)data); + error = psp_get_gstatus(sc, (struct psp_guest_status *)data); break; case PSP_IOC_LAUNCH_START: - ret = psp_launch_start(sc, (struct psp_launch_start *)data); + error = psp_launch_start(sc, (struct psp_launch_start *)data); break; case PSP_IOC_LAUNCH_UPDATE_DATA: - ret = psp_launch_update_data(sc, + error = psp_launch_update_data(sc, (struct psp_launch_update_data *)data, p); break; case PSP_IOC_LAUNCH_MEASURE: - ret = psp_launch_measure(sc, (struct psp_launch_measure *)data); + error = psp_launch_measure(sc, + (struct psp_launch_measure *)data); break; case PSP_IOC_LAUNCH_FINISH: - ret = psp_launch_finish(sc, (struct psp_launch_finish *)data); + error = psp_launch_finish(sc, (struct psp_launch_finish *)data); break; case PSP_IOC_ATTESTATION: - ret = psp_attestation(sc, (struct psp_attestation *)data); + error = psp_attestation(sc, (struct psp_attestation *)data); break; case PSP_IOC_ACTIVATE: - ret = psp_activate(sc, (struct psp_activate *)data); + error = psp_activate(sc, (struct psp_activate *)data); break; case PSP_IOC_DEACTIVATE: - ret = psp_deactivate(sc, (struct psp_deactivate *)data); + error = psp_deactivate(sc, (struct psp_deactivate *)data); break; case PSP_IOC_GUEST_SHUTDOWN: - ret = psp_guest_shutdown(sc, (struct psp_guest_shutdown *)data); + error = psp_guest_shutdown(sc, + (struct psp_guest_shutdown *)data); break; case PSP_IOC_SNP_GET_PSTATUS: - ret = psp_snp_get_pstatus(sc, + error = psp_snp_get_pstatus(sc, (struct psp_snp_platform_status *)data); break; default: - ret = ENOTTY; + error = ENOTTY; break; } rw_exit_write(&sc->sc_lock); - return (ret); + KERNEL_LOCK(); + + return (error); } int @@ -721,3 +885,72 @@ pspsubmatch(struct device *parent, void *match, void *aux) return (0); return ((*cf->cf_attach->ca_match)(parent, cf, aux)); } + +struct ucode { + uint8_t family; + uint8_t model; + const char *uname; +} const psp_ucode_table[] = { + { 0x17, 0x0, "amdsev/amd_sev_fam17h_model0xh.sbin" }, + { 0x17, 0x3, "amdsev/amd_sev_fam17h_model3xh.sbin" }, + { 0x19, 0x0, "amdsev/amd_sev_fam19h_model0xh.sbin" }, + { 0x19, 0x1, "amdsev/amd_sev_fam19h_model1xh.sbin" }, + { 0, 0, NULL } +}; + +int +psp_load_ucode(struct psp_softc *sc) +{ + struct psp_downloadfirmware dlfw; + struct cpu_info *ci = &cpu_info_primary; + const struct ucode *uc; + uint8_t family, model; + int error; + + if ((sc->sc_flags & PSPF_UCODELOADED) || + (sc->sc_flags & PSPF_NOUCODE) || + (sc->sc_flags & PSPF_INITIALIZED)) + return (EBUSY); + + family = ci->ci_family; + model = (ci->ci_model & 0xf0) >> 4; + + for (uc = psp_ucode_table; uc->uname; uc++) { + if ((uc->family == family) && (uc->model == model)) + break; + } + + if (uc->uname == NULL) { + printf("%s: no firmware found, CPU family 0x%x model 0x%x\n", + sc->sc_dev.dv_xname, family, model); + sc->sc_flags |= PSPF_NOUCODE; + return (EOPNOTSUPP); + } + + error = loadfirmware(uc->uname, &sc->sc_ucodebuf, &sc->sc_ucodelen); + if (error) { + if (error != ENOENT) { + printf("%s: error %d, could not read firmware %s\n", + sc->sc_dev.dv_xname, error, uc->uname); + } + sc->sc_flags |= PSPF_NOUCODE; + return (error); + } + + bzero(&dlfw, sizeof(dlfw)); + dlfw.fw_len = sc->sc_ucodelen; + dlfw.fw_paddr = (uint64_t)sc->sc_ucodebuf; + + if ((error = psp_downloadfirmware(sc, &dlfw)) != 0) + goto out; + + sc->sc_flags |= PSPF_UCODELOADED; +out: + if (sc->sc_ucodebuf) { + free(sc->sc_ucodebuf, M_DEVBUF, sc->sc_ucodelen); + sc->sc_ucodebuf = NULL; + sc->sc_ucodelen = 0; + } + + return (error); +} diff --git a/sys/dev/ic/pspvar.h b/sys/dev/ic/pspvar.h index a1d7c8384..fa36a3a90 100644 --- a/sys/dev/ic/pspvar.h +++ b/sys/dev/ic/pspvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pspvar.h,v 1.2 2024/09/04 07:45:08 jsg Exp $ */ +/* $OpenBSD: pspvar.h,v 1.6 2024/11/05 13:28:35 bluhm Exp $ */ /* * Copyright (c) 2023, 2024 Hans-Joerg Hoexer @@ -19,6 +19,13 @@ #include /* AMD 17h */ +#define PSPV1_REG_INTEN 0x10610 +#define PSPV1_REG_INTSTS 0x10614 +#define PSPV1_REG_CMDRESP 0x10580 +#define PSPV1_REG_ADDRLO 0x105e0 +#define PSPV1_REG_ADDRHI 0x105e4 +#define PSPV1_REG_CAPABILITIES 0x105fc + #define PSP_REG_INTEN 0x10690 #define PSP_REG_INTSTS 0x10694 #define PSP_REG_CMDRESP 0x10980 @@ -69,8 +76,10 @@ /* Selection of PSP commands of the SEV API Version 0.24 */ #define PSP_CMD_INIT 0x1 +#define PSP_CMD_SHUTDOWN 0x2 #define PSP_CMD_PLATFORMSTATUS 0x4 #define PSP_CMD_DF_FLUSH 0xa +#define PSP_CMD_DOWNLOADFIRMWARE 0xb #define PSP_CMD_DECOMMISSION 0x20 #define PSP_CMD_ACTIVATE 0x21 #define PSP_CMD_DEACTIVATE 0x22 @@ -207,6 +216,11 @@ struct psp_init { uint32_t tmr_length; } __packed; +struct psp_downloadfirmware { + /* Input parameters for PSP_CMD_DOWNLOADFIRMWARE */ + uint64_t fw_paddr; + uint32_t fw_len; +} __packed; struct psp_guest_shutdown { /* Input parameter for PSP_CMD_GUEST_SHUTDOWN */ @@ -242,6 +256,8 @@ struct psp_snp_platform_status { #define PSP_IOC_ACTIVATE _IOW('P', 9, struct psp_activate) #define PSP_IOC_DEACTIVATE _IOW('P', 10, struct psp_deactivate) #define PSP_IOC_SNP_GET_PSTATUS _IOR('P', 11, struct psp_snp_platform_status) +#define PSP_IOC_INIT _IO('P', 12) +#define PSP_IOC_SHUTDOWN _IO('P', 13) #define PSP_IOC_GUEST_SHUTDOWN _IOW('P', 255, struct psp_guest_shutdown) #ifdef _KERNEL @@ -252,10 +268,18 @@ struct psp_attach_args { bus_dma_tag_t dmat; uint32_t capabilities; + int version; }; int pspsubmatch(struct device *, void *, void *); int pspprint(void *aux, const char *pnp); int psp_sev_intr(void *); +struct ccp_softc; +struct pci_attach_args; + +int psp_pci_match(struct ccp_softc *, struct pci_attach_args *); +void psp_pci_intr_map(struct ccp_softc *, struct pci_attach_args *); +void psp_pci_attach(struct ccp_softc *, struct pci_attach_args *); + #endif /* _KERNEL */ diff --git a/sys/dev/ic/qwz.c b/sys/dev/ic/qwz.c index c9014cc0a..deffee1c7 100644 --- a/sys/dev/ic/qwz.c +++ b/sys/dev/ic/qwz.c @@ -1,4 +1,4 @@ -/* $OpenBSD: qwz.c,v 1.9 2024/09/01 03:14:48 jsg Exp $ */ +/* $OpenBSD: qwz.c,v 1.18 2024/12/23 00:12:44 patrick Exp $ */ /* * Copyright 2023 Stefan Sperling @@ -962,8 +962,8 @@ struct cfdriver qwz_cd = { }; void -qwz_init_wmi_config_qca6390(struct qwz_softc *sc, - struct target_resource_config *config) +qwz_wmi_init_wcn7850(struct qwz_softc *sc, + struct wmi_resource_config_arg *config) { config->num_vdevs = 4; config->num_peers = 16; @@ -997,7 +997,7 @@ qwz_init_wmi_config_qca6390(struct qwz_softc *sc, config->beacon_tx_offload_max_vdev = 2; config->rx_batchmode = TARGET_RX_BATCHMODE; - config->peer_map_unmap_v2_support = 0; + config->peer_map_unmap_version = 0x1; config->use_pdev_id = 1; config->max_frag_entries = 0xa; config->num_tdls_vdevs = 0x1; @@ -1006,7 +1006,6 @@ qwz_init_wmi_config_qca6390(struct qwz_softc *sc, config->num_multicast_filter_entries = 0x20; config->num_wow_filters = 0x16; config->num_keep_alive_pattern = 0; - config->flag1 |= WMI_RSRC_CFG_FLAG1_BSS_CHANNEL_INFO_64; } void @@ -1045,654 +1044,232 @@ qwz_hal_reo_hw_setup(struct qwz_softc *sc, uint32_t ring_hash_map) } int -qwz_hw_mac_id_to_pdev_id_ipq8074(struct ath12k_hw_params *hw, int mac_id) -{ - return mac_id; -} - -int -qwz_hw_mac_id_to_srng_id_ipq8074(struct ath12k_hw_params *hw, int mac_id) +qwz_hw_mac_id_to_pdev_id_wcn7850(struct ath12k_hw_params *hw, int mac_id) { return 0; } int -qwz_hw_mac_id_to_pdev_id_qca6390(struct ath12k_hw_params *hw, int mac_id) -{ - return 0; -} - -int -qwz_hw_mac_id_to_srng_id_qca6390(struct ath12k_hw_params *hw, int mac_id) +qwz_hw_mac_id_to_srng_id_wcn7850(struct ath12k_hw_params *hw, int mac_id) { return mac_id; } int -qwz_hw_ipq8074_rx_desc_get_first_msdu(struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_get_first_msdu(struct hal_rx_desc *desc) { - return !!FIELD_GET(RX_MSDU_END_INFO2_FIRST_MSDU, - le32toh(desc->u.ipq8074.msdu_end.info2)); + return !!FIELD_GET(RX_MSDU_END_INFO5_FIRST_MSDU, + le32toh(desc->u.wcn7850.msdu_end.info5)); +} + +int +qwz_hw_wcn7850_rx_desc_get_last_msdu(struct hal_rx_desc *desc) +{ + return !!FIELD_GET(RX_MSDU_END_INFO5_LAST_MSDU, + le32toh(desc->u.wcn7850.msdu_end.info5)); } uint8_t -qwz_hw_ipq8074_rx_desc_get_l3_pad_bytes(struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_get_l3_pad_bytes(struct hal_rx_desc *desc) { - return FIELD_GET(RX_MSDU_END_INFO2_L3_HDR_PADDING, - le32toh(desc->u.ipq8074.msdu_end.info2)); -} - -uint8_t * -qwz_hw_ipq8074_rx_desc_get_hdr_status(struct hal_rx_desc *desc) -{ - return desc->u.ipq8074.hdr_status; + return FIELD_GET(RX_MSDU_END_INFO5_L3_HDR_PADDING, + le32toh(desc->u.wcn7850.msdu_end.info5)); } int -qwz_hw_ipq8074_rx_desc_encrypt_valid(struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_encrypt_valid(struct hal_rx_desc *desc) { - return le32toh(desc->u.ipq8074.mpdu_start.info1) & - RX_MPDU_START_INFO1_ENCRYPT_INFO_VALID; + return !!FIELD_GET(RX_MPDU_START_INFO4_ENCRYPT_INFO_VALID, + le32toh(desc->u.wcn7850.mpdu_start.info4)); } uint32_t -qwz_hw_ipq8074_rx_desc_get_encrypt_type(struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_get_encrypt_type(struct hal_rx_desc *desc) { return FIELD_GET(RX_MPDU_START_INFO2_ENC_TYPE, - le32toh(desc->u.ipq8074.mpdu_start.info2)); + le32toh(desc->u.wcn7850.mpdu_start.info2)); } uint8_t -qwz_hw_ipq8074_rx_desc_get_decap_type(struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_get_decap_type(struct hal_rx_desc *desc) { - return FIELD_GET(RX_MSDU_START_INFO2_DECAP_FORMAT, - le32toh(desc->u.ipq8074.msdu_start.info2)); + return FIELD_GET(RX_MSDU_END_INFO11_DECAP_FORMAT, + le32toh(desc->u.wcn7850.msdu_end.info11)); } uint8_t -qwz_hw_ipq8074_rx_desc_get_mesh_ctl(struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_get_mesh_ctl(struct hal_rx_desc *desc) { - return FIELD_GET(RX_MSDU_START_INFO2_MESH_CTRL_PRESENT, - le32toh(desc->u.ipq8074.msdu_start.info2)); + return FIELD_GET(RX_MSDU_END_INFO11_MESH_CTRL_PRESENT, + le32toh(desc->u.wcn7850.msdu_end.info11)); } int -qwz_hw_ipq8074_rx_desc_get_ldpc_support(struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_get_mpdu_seq_ctl_vld(struct hal_rx_desc *desc) { - return FIELD_GET(RX_MSDU_START_INFO2_LDPC, - le32toh(desc->u.ipq8074.msdu_start.info2)); + return !!FIELD_GET(RX_MPDU_START_INFO4_MPDU_SEQ_CTRL_VALID, + le32toh(desc->u.wcn7850.mpdu_start.info4)); } int -qwz_hw_ipq8074_rx_desc_get_mpdu_seq_ctl_vld(struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_get_mpdu_fc_valid(struct hal_rx_desc *desc) { - return !!FIELD_GET(RX_MPDU_START_INFO1_MPDU_SEQ_CTRL_VALID, - le32toh(desc->u.ipq8074.mpdu_start.info1)); -} - -int -qwz_hw_ipq8074_rx_desc_get_mpdu_fc_valid(struct hal_rx_desc *desc) -{ - return !!FIELD_GET(RX_MPDU_START_INFO1_MPDU_FCTRL_VALID, - le32toh(desc->u.ipq8074.mpdu_start.info1)); + return !!FIELD_GET(RX_MPDU_START_INFO4_MPDU_FCTRL_VALID, + le32toh(desc->u.wcn7850.mpdu_start.info4)); } uint16_t -qwz_hw_ipq8074_rx_desc_get_mpdu_start_seq_no(struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_get_mpdu_start_seq_no(struct hal_rx_desc *desc) { - return FIELD_GET(RX_MPDU_START_INFO1_MPDU_SEQ_NUM, - le32toh(desc->u.ipq8074.mpdu_start.info1)); + return FIELD_GET(RX_MPDU_START_INFO4_MPDU_SEQ_NUM, + le32toh(desc->u.wcn7850.mpdu_start.info4)); } uint16_t -qwz_hw_ipq8074_rx_desc_get_msdu_len(struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_get_msdu_len(struct hal_rx_desc *desc) { - return FIELD_GET(RX_MSDU_START_INFO1_MSDU_LENGTH, - le32toh(desc->u.ipq8074.msdu_start.info1)); + return FIELD_GET(RX_MSDU_END_INFO10_MSDU_LENGTH, + le32toh(desc->u.wcn7850.msdu_end.info10)); } uint8_t -qwz_hw_ipq8074_rx_desc_get_msdu_sgi(struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_get_msdu_sgi(struct hal_rx_desc *desc) { - return FIELD_GET(RX_MSDU_START_INFO3_SGI, - le32toh(desc->u.ipq8074.msdu_start.info3)); + return FIELD_GET(RX_MSDU_END_INFO12_SGI, + le32toh(desc->u.wcn7850.msdu_end.info12)); } uint8_t -qwz_hw_ipq8074_rx_desc_get_msdu_rate_mcs(struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_get_msdu_rate_mcs(struct hal_rx_desc *desc) { - return FIELD_GET(RX_MSDU_START_INFO3_RATE_MCS, - le32toh(desc->u.ipq8074.msdu_start.info3)); + return FIELD_GET(RX_MSDU_END_INFO12_RATE_MCS, + le32toh(desc->u.wcn7850.msdu_end.info12)); } uint8_t -qwz_hw_ipq8074_rx_desc_get_msdu_rx_bw(struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_get_msdu_rx_bw(struct hal_rx_desc *desc) { - return FIELD_GET(RX_MSDU_START_INFO3_RECV_BW, - le32toh(desc->u.ipq8074.msdu_start.info3)); + return FIELD_GET(RX_MSDU_END_INFO12_RECV_BW, + le32toh(desc->u.wcn7850.msdu_end.info12)); } uint32_t -qwz_hw_ipq8074_rx_desc_get_msdu_freq(struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_get_msdu_freq(struct hal_rx_desc *desc) { - return le32toh(desc->u.ipq8074.msdu_start.phy_meta_data); + return le32toh(desc->u.wcn7850.msdu_end.phy_meta_data); } uint8_t -qwz_hw_ipq8074_rx_desc_get_msdu_pkt_type(struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_get_msdu_pkt_type(struct hal_rx_desc *desc) { - return FIELD_GET(RX_MSDU_START_INFO3_PKT_TYPE, - le32toh(desc->u.ipq8074.msdu_start.info3)); + return FIELD_GET(RX_MSDU_END_INFO12_PKT_TYPE, + le32toh(desc->u.wcn7850.msdu_end.info12)); } uint8_t -qwz_hw_ipq8074_rx_desc_get_msdu_nss(struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_get_msdu_nss(struct hal_rx_desc *desc) { - return FIELD_GET(RX_MSDU_START_INFO3_MIMO_SS_BITMAP, - le32toh(desc->u.ipq8074.msdu_start.info3)); + return FIELD_GET(RX_MSDU_END_INFO12_MIMO_SS_BITMAP, + le32toh(desc->u.wcn7850.msdu_end.info12)); } uint8_t -qwz_hw_ipq8074_rx_desc_get_mpdu_tid(struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_get_mpdu_tid(struct hal_rx_desc *desc) { return FIELD_GET(RX_MPDU_START_INFO2_TID, - le32toh(desc->u.ipq8074.mpdu_start.info2)); + le32toh(desc->u.wcn7850.mpdu_start.info2)); } uint16_t -qwz_hw_ipq8074_rx_desc_get_mpdu_peer_id(struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_get_mpdu_peer_id(struct hal_rx_desc *desc) { - return le16toh(desc->u.ipq8074.mpdu_start.sw_peer_id); + return le16toh(desc->u.wcn7850.mpdu_start.sw_peer_id); } void -qwz_hw_ipq8074_rx_desc_copy_attn_end(struct hal_rx_desc *fdesc, - struct hal_rx_desc *ldesc) +qwz_hw_wcn7850_rx_desc_copy_end_tlv(struct hal_rx_desc *fdesc, + struct hal_rx_desc *ldesc) { - memcpy((uint8_t *)&fdesc->u.ipq8074.msdu_end, (uint8_t *)&ldesc->u.ipq8074.msdu_end, - sizeof(struct rx_msdu_end_ipq8074)); - memcpy((uint8_t *)&fdesc->u.ipq8074.attention, (uint8_t *)&ldesc->u.ipq8074.attention, - sizeof(struct rx_attention)); - memcpy((uint8_t *)&fdesc->u.ipq8074.mpdu_end, (uint8_t *)&ldesc->u.ipq8074.mpdu_end, - sizeof(struct rx_mpdu_end)); + memcpy((uint8_t *)&fdesc->u.wcn7850.msdu_end, (uint8_t *)&ldesc->u.wcn7850.msdu_end, + sizeof(struct rx_msdu_end_qcn9274)); } uint32_t -qwz_hw_ipq8074_rx_desc_get_mpdu_start_tag(struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_get_mpdu_start_tag(struct hal_rx_desc *desc) { return FIELD_GET(HAL_TLV_HDR_TAG, - le32toh(desc->u.ipq8074.mpdu_start_tag)); + le64toh(desc->u.wcn7850.mpdu_start_tag)); } uint32_t -qwz_hw_ipq8074_rx_desc_get_mpdu_ppdu_id(struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_get_mpdu_ppdu_id(struct hal_rx_desc *desc) { - return le16toh(desc->u.ipq8074.mpdu_start.phy_ppdu_id); + return le16toh(desc->u.wcn7850.mpdu_start.phy_ppdu_id); } void -qwz_hw_ipq8074_rx_desc_set_msdu_len(struct hal_rx_desc *desc, uint16_t len) +qwz_hw_wcn7850_rx_desc_set_msdu_len(struct hal_rx_desc *desc, uint16_t len) { - uint32_t info = le32toh(desc->u.ipq8074.msdu_start.info1); + uint32_t info = le32toh(desc->u.wcn7850.msdu_end.info10); - info &= ~RX_MSDU_START_INFO1_MSDU_LENGTH; - info |= FIELD_PREP(RX_MSDU_START_INFO1_MSDU_LENGTH, len); + info &= ~RX_MSDU_END_INFO10_MSDU_LENGTH; + info |= FIELD_PREP(RX_MSDU_END_INFO10_MSDU_LENGTH, len); - desc->u.ipq8074.msdu_start.info1 = htole32(info); + desc->u.wcn7850.msdu_end.info10 = htole32(info); } int -qwz_dp_rx_h_msdu_end_first_msdu(struct qwz_softc *sc, struct hal_rx_desc *desc) +qwz_hw_wcn7850_rx_desc_is_da_mcbc(struct hal_rx_desc *desc) { - return sc->hw_params.hw_ops->rx_desc_get_first_msdu(desc); + return FIELD_GET(RX_MSDU_END_INFO13_MCAST_BCAST, + le32toh(desc->u.wcn7850.msdu_end.info13)); } int -qwz_hw_ipq8074_rx_desc_mac_addr2_valid(struct hal_rx_desc *desc) +qwz_hw_wcn7850_dp_rx_h_is_decrypted(struct hal_rx_desc *desc) { - return le32toh(desc->u.ipq8074.mpdu_start.info1) & - RX_MPDU_START_INFO1_MAC_ADDR2_VALID; -} - -uint8_t * -qwz_hw_ipq8074_rx_desc_mpdu_start_addr2(struct hal_rx_desc *desc) -{ - return desc->u.ipq8074.mpdu_start.addr2; -} - -struct rx_attention * -qwz_hw_ipq8074_rx_desc_get_attention(struct hal_rx_desc *desc) -{ - return &desc->u.ipq8074.attention; -} - -uint8_t * -qwz_hw_ipq8074_rx_desc_get_msdu_payload(struct hal_rx_desc *desc) -{ - return &desc->u.ipq8074.msdu_payload[0]; -} - -int -qwz_hw_qcn9074_rx_desc_get_first_msdu(struct hal_rx_desc *desc) -{ - return !!FIELD_GET(RX_MSDU_END_INFO4_FIRST_MSDU, - le16toh(desc->u.qcn9074.msdu_end.info4)); -} - -int -qwz_hw_qcn9074_rx_desc_get_last_msdu(struct hal_rx_desc *desc) -{ - return !!FIELD_GET(RX_MSDU_END_INFO4_LAST_MSDU, - le16toh(desc->u.qcn9074.msdu_end.info4)); -} - -uint8_t -qwz_hw_qcn9074_rx_desc_get_l3_pad_bytes(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MSDU_END_INFO4_L3_HDR_PADDING, - le16toh(desc->u.qcn9074.msdu_end.info4)); -} - -uint8_t * -qwz_hw_qcn9074_rx_desc_get_hdr_status(struct hal_rx_desc *desc) -{ - return desc->u.qcn9074.hdr_status; -} - -int -qwz_hw_qcn9074_rx_desc_encrypt_valid(struct hal_rx_desc *desc) -{ - return le32toh(desc->u.qcn9074.mpdu_start.info11) & - RX_MPDU_START_INFO11_ENCRYPT_INFO_VALID; + return FIELD_GET(RX_MSDU_END_INFO14_DECRYPT_STATUS_CODE, + le32toh(desc->u.wcn7850.msdu_end.info14)) == + RX_DESC_DECRYPT_STATUS_CODE_OK; } uint32_t -qwz_hw_qcn9074_rx_desc_get_encrypt_type(struct hal_rx_desc *desc) +qwz_hw_wcn7850_dp_rx_h_mpdu_err(struct hal_rx_desc *desc) { - return FIELD_GET(RX_MPDU_START_INFO9_ENC_TYPE, - le32toh(desc->u.qcn9074.mpdu_start.info9)); + uint32_t info = le32toh(desc->u.wcn7850.msdu_end.info13); + uint32_t errmap = 0; + + if (info & RX_MSDU_END_INFO13_FCS_ERR) + errmap |= HAL_RX_MPDU_ERR_FCS; + + if (info & RX_MSDU_END_INFO13_DECRYPT_ERR) + errmap |= HAL_RX_MPDU_ERR_DECRYPT; + + if (info & RX_MSDU_END_INFO13_TKIP_MIC_ERR) + errmap |= HAL_RX_MPDU_ERR_TKIP_MIC; + + if (info & RX_MSDU_END_INFO13_A_MSDU_ERROR) + errmap |= HAL_RX_MPDU_ERR_AMSDU_ERR; + + if (info & RX_MSDU_END_INFO13_OVERFLOW_ERR) + errmap |= HAL_RX_MPDU_ERR_OVERFLOW; + + if (info & RX_MSDU_END_INFO13_MSDU_LEN_ERR) + errmap |= HAL_RX_MPDU_ERR_MSDU_LEN; + + if (info & RX_MSDU_END_INFO13_MPDU_LEN_ERR) + errmap |= HAL_RX_MPDU_ERR_MPDU_LEN; + + return errmap; +} + +uint32_t qwz_hw_wcn7850_get_rx_desc_size(void) +{ + return sizeof(struct hal_rx_desc_wcn7850); } uint8_t -qwz_hw_qcn9074_rx_desc_get_decap_type(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MSDU_START_INFO2_DECAP_FORMAT, - le32toh(desc->u.qcn9074.msdu_start.info2)); -} - -uint8_t -qwz_hw_qcn9074_rx_desc_get_mesh_ctl(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MSDU_START_INFO2_MESH_CTRL_PRESENT, - le32toh(desc->u.qcn9074.msdu_start.info2)); -} - -int -qwz_hw_qcn9074_rx_desc_get_ldpc_support(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MSDU_START_INFO2_LDPC, - le32toh(desc->u.qcn9074.msdu_start.info2)); -} - -int -qwz_hw_qcn9074_rx_desc_get_mpdu_seq_ctl_vld(struct hal_rx_desc *desc) -{ - return !!FIELD_GET(RX_MPDU_START_INFO11_MPDU_SEQ_CTRL_VALID, - le32toh(desc->u.qcn9074.mpdu_start.info11)); -} - -int -qwz_hw_qcn9074_rx_desc_get_mpdu_fc_valid(struct hal_rx_desc *desc) -{ - return !!FIELD_GET(RX_MPDU_START_INFO11_MPDU_FCTRL_VALID, - le32toh(desc->u.qcn9074.mpdu_start.info11)); -} - -uint16_t -qwz_hw_qcn9074_rx_desc_get_mpdu_start_seq_no(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MPDU_START_INFO11_MPDU_SEQ_NUM, - le32toh(desc->u.qcn9074.mpdu_start.info11)); -} - -uint16_t -qwz_hw_qcn9074_rx_desc_get_msdu_len(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MSDU_START_INFO1_MSDU_LENGTH, - le32toh(desc->u.qcn9074.msdu_start.info1)); -} - -uint8_t -qwz_hw_qcn9074_rx_desc_get_msdu_sgi(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MSDU_START_INFO3_SGI, - le32toh(desc->u.qcn9074.msdu_start.info3)); -} - -uint8_t -qwz_hw_qcn9074_rx_desc_get_msdu_rate_mcs(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MSDU_START_INFO3_RATE_MCS, - le32toh(desc->u.qcn9074.msdu_start.info3)); -} - -uint8_t -qwz_hw_qcn9074_rx_desc_get_msdu_rx_bw(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MSDU_START_INFO3_RECV_BW, - le32toh(desc->u.qcn9074.msdu_start.info3)); -} - -uint32_t -qwz_hw_qcn9074_rx_desc_get_msdu_freq(struct hal_rx_desc *desc) -{ - return le32toh(desc->u.qcn9074.msdu_start.phy_meta_data); -} - -uint8_t -qwz_hw_qcn9074_rx_desc_get_msdu_pkt_type(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MSDU_START_INFO3_PKT_TYPE, - le32toh(desc->u.qcn9074.msdu_start.info3)); -} - -uint8_t -qwz_hw_qcn9074_rx_desc_get_msdu_nss(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MSDU_START_INFO3_MIMO_SS_BITMAP, - le32toh(desc->u.qcn9074.msdu_start.info3)); -} - -uint8_t -qwz_hw_qcn9074_rx_desc_get_mpdu_tid(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MPDU_START_INFO9_TID, - le32toh(desc->u.qcn9074.mpdu_start.info9)); -} - -uint16_t -qwz_hw_qcn9074_rx_desc_get_mpdu_peer_id(struct hal_rx_desc *desc) -{ - return le16toh(desc->u.qcn9074.mpdu_start.sw_peer_id); -} - -void -qwz_hw_qcn9074_rx_desc_copy_attn_end(struct hal_rx_desc *fdesc, - struct hal_rx_desc *ldesc) -{ - memcpy((uint8_t *)&fdesc->u.qcn9074.msdu_end, (uint8_t *)&ldesc->u.qcn9074.msdu_end, - sizeof(struct rx_msdu_end_qcn9074)); - memcpy((uint8_t *)&fdesc->u.qcn9074.attention, (uint8_t *)&ldesc->u.qcn9074.attention, - sizeof(struct rx_attention)); - memcpy((uint8_t *)&fdesc->u.qcn9074.mpdu_end, (uint8_t *)&ldesc->u.qcn9074.mpdu_end, - sizeof(struct rx_mpdu_end)); -} - -uint32_t -qwz_hw_qcn9074_rx_desc_get_mpdu_start_tag(struct hal_rx_desc *desc) -{ - return FIELD_GET(HAL_TLV_HDR_TAG, - le32toh(desc->u.qcn9074.mpdu_start_tag)); -} - -uint32_t -qwz_hw_qcn9074_rx_desc_get_mpdu_ppdu_id(struct hal_rx_desc *desc) -{ - return le16toh(desc->u.qcn9074.mpdu_start.phy_ppdu_id); -} - -void -qwz_hw_qcn9074_rx_desc_set_msdu_len(struct hal_rx_desc *desc, uint16_t len) -{ - uint32_t info = le32toh(desc->u.qcn9074.msdu_start.info1); - - info &= ~RX_MSDU_START_INFO1_MSDU_LENGTH; - info |= FIELD_PREP(RX_MSDU_START_INFO1_MSDU_LENGTH, len); - - desc->u.qcn9074.msdu_start.info1 = htole32(info); -} - -struct rx_attention * -qwz_hw_qcn9074_rx_desc_get_attention(struct hal_rx_desc *desc) -{ - return &desc->u.qcn9074.attention; -} - -uint8_t * -qwz_hw_qcn9074_rx_desc_get_msdu_payload(struct hal_rx_desc *desc) -{ - return &desc->u.qcn9074.msdu_payload[0]; -} - -int -qwz_hw_ipq9074_rx_desc_mac_addr2_valid(struct hal_rx_desc *desc) -{ - return le32toh(desc->u.qcn9074.mpdu_start.info11) & - RX_MPDU_START_INFO11_MAC_ADDR2_VALID; -} - -uint8_t * -qwz_hw_ipq9074_rx_desc_mpdu_start_addr2(struct hal_rx_desc *desc) -{ - return desc->u.qcn9074.mpdu_start.addr2; -} - -int -qwz_hw_wcn6855_rx_desc_get_first_msdu(struct hal_rx_desc *desc) -{ - return !!FIELD_GET(RX_MSDU_END_INFO2_FIRST_MSDU_WCN6855, - le32toh(desc->u.wcn6855.msdu_end.info2)); -} - -int -qwz_hw_wcn6855_rx_desc_get_last_msdu(struct hal_rx_desc *desc) -{ - return !!FIELD_GET(RX_MSDU_END_INFO2_LAST_MSDU_WCN6855, - le32toh(desc->u.wcn6855.msdu_end.info2)); -} - -uint8_t -qwz_hw_wcn6855_rx_desc_get_l3_pad_bytes(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MSDU_END_INFO2_L3_HDR_PADDING, - le32toh(desc->u.wcn6855.msdu_end.info2)); -} - -uint8_t * -qwz_hw_wcn6855_rx_desc_get_hdr_status(struct hal_rx_desc *desc) -{ - return desc->u.wcn6855.hdr_status; -} - -int -qwz_hw_wcn6855_rx_desc_encrypt_valid(struct hal_rx_desc *desc) -{ - return le32toh(desc->u.wcn6855.mpdu_start.info1) & - RX_MPDU_START_INFO1_ENCRYPT_INFO_VALID; -} - -uint32_t -qwz_hw_wcn6855_rx_desc_get_encrypt_type(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MPDU_START_INFO2_ENC_TYPE, - le32toh(desc->u.wcn6855.mpdu_start.info2)); -} - -uint8_t -qwz_hw_wcn6855_rx_desc_get_decap_type(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MSDU_START_INFO2_DECAP_FORMAT, - le32toh(desc->u.wcn6855.msdu_start.info2)); -} - -uint8_t -qwz_hw_wcn6855_rx_desc_get_mesh_ctl(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MSDU_START_INFO2_MESH_CTRL_PRESENT, - le32toh(desc->u.wcn6855.msdu_start.info2)); -} - -int -qwz_hw_wcn6855_rx_desc_get_mpdu_seq_ctl_vld(struct hal_rx_desc *desc) -{ - return !!FIELD_GET(RX_MPDU_START_INFO1_MPDU_SEQ_CTRL_VALID, - le32toh(desc->u.wcn6855.mpdu_start.info1)); -} - -int -qwz_hw_wcn6855_rx_desc_get_mpdu_fc_valid(struct hal_rx_desc *desc) -{ - return !!FIELD_GET(RX_MPDU_START_INFO1_MPDU_FCTRL_VALID, - le32toh(desc->u.wcn6855.mpdu_start.info1)); -} - -uint16_t -qwz_hw_wcn6855_rx_desc_get_mpdu_start_seq_no(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MPDU_START_INFO1_MPDU_SEQ_NUM, - le32toh(desc->u.wcn6855.mpdu_start.info1)); -} - -uint16_t -qwz_hw_wcn6855_rx_desc_get_msdu_len(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MSDU_START_INFO1_MSDU_LENGTH, - le32toh(desc->u.wcn6855.msdu_start.info1)); -} - -uint8_t -qwz_hw_wcn6855_rx_desc_get_msdu_sgi(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MSDU_START_INFO3_SGI, - le32toh(desc->u.wcn6855.msdu_start.info3)); -} - -uint8_t -qwz_hw_wcn6855_rx_desc_get_msdu_rate_mcs(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MSDU_START_INFO3_RATE_MCS, - le32toh(desc->u.wcn6855.msdu_start.info3)); -} - -uint8_t -qwz_hw_wcn6855_rx_desc_get_msdu_rx_bw(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MSDU_START_INFO3_RECV_BW, - le32toh(desc->u.wcn6855.msdu_start.info3)); -} - -uint32_t -qwz_hw_wcn6855_rx_desc_get_msdu_freq(struct hal_rx_desc *desc) -{ - return le32toh(desc->u.wcn6855.msdu_start.phy_meta_data); -} - -uint8_t -qwz_hw_wcn6855_rx_desc_get_msdu_pkt_type(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MSDU_START_INFO3_PKT_TYPE, - le32toh(desc->u.wcn6855.msdu_start.info3)); -} - -uint8_t -qwz_hw_wcn6855_rx_desc_get_msdu_nss(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MSDU_START_INFO3_MIMO_SS_BITMAP, - le32toh(desc->u.wcn6855.msdu_start.info3)); -} - -uint8_t -qwz_hw_wcn6855_rx_desc_get_mpdu_tid(struct hal_rx_desc *desc) -{ - return FIELD_GET(RX_MPDU_START_INFO2_TID_WCN6855, - le32toh(desc->u.wcn6855.mpdu_start.info2)); -} - -uint16_t -qwz_hw_wcn6855_rx_desc_get_mpdu_peer_id(struct hal_rx_desc *desc) -{ - return le16toh(desc->u.wcn6855.mpdu_start.sw_peer_id); -} - -void -qwz_hw_wcn6855_rx_desc_copy_attn_end(struct hal_rx_desc *fdesc, - struct hal_rx_desc *ldesc) -{ - memcpy((uint8_t *)&fdesc->u.wcn6855.msdu_end, (uint8_t *)&ldesc->u.wcn6855.msdu_end, - sizeof(struct rx_msdu_end_wcn6855)); - memcpy((uint8_t *)&fdesc->u.wcn6855.attention, (uint8_t *)&ldesc->u.wcn6855.attention, - sizeof(struct rx_attention)); - memcpy((uint8_t *)&fdesc->u.wcn6855.mpdu_end, (uint8_t *)&ldesc->u.wcn6855.mpdu_end, - sizeof(struct rx_mpdu_end)); -} - -uint32_t -qwz_hw_wcn6855_rx_desc_get_mpdu_start_tag(struct hal_rx_desc *desc) -{ - return FIELD_GET(HAL_TLV_HDR_TAG, - le32toh(desc->u.wcn6855.mpdu_start_tag)); -} - -uint32_t -qwz_hw_wcn6855_rx_desc_get_mpdu_ppdu_id(struct hal_rx_desc *desc) -{ - return le16toh(desc->u.wcn6855.mpdu_start.phy_ppdu_id); -} - -void -qwz_hw_wcn6855_rx_desc_set_msdu_len(struct hal_rx_desc *desc, uint16_t len) -{ - uint32_t info = le32toh(desc->u.wcn6855.msdu_start.info1); - - info &= ~RX_MSDU_START_INFO1_MSDU_LENGTH; - info |= FIELD_PREP(RX_MSDU_START_INFO1_MSDU_LENGTH, len); - - desc->u.wcn6855.msdu_start.info1 = htole32(info); -} - -struct rx_attention * -qwz_hw_wcn6855_rx_desc_get_attention(struct hal_rx_desc *desc) -{ - return &desc->u.wcn6855.attention; -} - -uint8_t * -qwz_hw_wcn6855_rx_desc_get_msdu_payload(struct hal_rx_desc *desc) -{ - return &desc->u.wcn6855.msdu_payload[0]; -} - -int -qwz_hw_wcn6855_rx_desc_mac_addr2_valid(struct hal_rx_desc *desc) -{ - return le32toh(desc->u.wcn6855.mpdu_start.info1) & - RX_MPDU_START_INFO1_MAC_ADDR2_VALID; -} - -uint8_t * -qwz_hw_wcn6855_rx_desc_mpdu_start_addr2(struct hal_rx_desc *desc) -{ - return desc->u.wcn6855.mpdu_start.addr2; -} - -/* Map from pdev index to hw mac index */ -uint8_t -qwz_hw_ipq8074_mac_from_pdev_id(int pdev_idx) -{ - switch (pdev_idx) { - case 0: - return 0; - case 1: - return 2; - case 2: - return 1; - default: - return ATH12K_INVALID_HW_MAC_ID; - } -} - -uint8_t -qwz_hw_ipq6018_mac_from_pdev_id(int pdev_idx) +qwz_hw_qcn9274_mac_from_pdev_id(int pdev_idx) { return pdev_idx; } @@ -1706,10 +1283,19 @@ qwz_hw_get_mac_from_pdev_id(struct qwz_softc *sc, int pdev_idx) return 0; } +static bool qwz_dp_srng_is_comp_ring_wcn7850(int ring_num) +{ + if (ring_num == 0 || ring_num == 2 || ring_num == 4) + return true; + + return false; +} + const struct ath12k_hw_ops wcn7850_ops = { - .get_hw_mac_from_pdev_id = qwz_hw_ipq6018_mac_from_pdev_id, - .mac_id_to_pdev_id = qwz_hw_mac_id_to_pdev_id_qca6390, - .mac_id_to_srng_id = qwz_hw_mac_id_to_srng_id_qca6390, + .get_hw_mac_from_pdev_id = qwz_hw_qcn9274_mac_from_pdev_id, + .mac_id_to_pdev_id = qwz_hw_mac_id_to_pdev_id_wcn7850, + .mac_id_to_srng_id = qwz_hw_mac_id_to_srng_id_wcn7850, + .dp_srng_is_tx_comp_ring = qwz_dp_srng_is_comp_ring_wcn7850, }; #define ATH12K_TX_RING_MASK_0 BIT(0) @@ -1769,340 +1355,7 @@ const struct ath12k_hw_ring_mask ath12k_hw_ring_mask_wcn7850 = { }; /* Target firmware's Copy Engine configuration. */ -const struct ce_pipe_config ath12k_target_ce_config_wlan_ipq8074[] = { - /* CE0: host->target HTC control and raw streams */ - { - .pipenum = htole32(0), - .pipedir = htole32(PIPEDIR_OUT), - .nentries = htole32(32), - .nbytes_max = htole32(2048), - .flags = htole32(CE_ATTR_FLAGS), - .reserved = htole32(0), - }, - - /* CE1: target->host HTT + HTC control */ - { - .pipenum = htole32(1), - .pipedir = htole32(PIPEDIR_IN), - .nentries = htole32(32), - .nbytes_max = htole32(2048), - .flags = htole32(CE_ATTR_FLAGS), - .reserved = htole32(0), - }, - - /* CE2: target->host WMI */ - { - .pipenum = htole32(2), - .pipedir = htole32(PIPEDIR_IN), - .nentries = htole32(32), - .nbytes_max = htole32(2048), - .flags = htole32(CE_ATTR_FLAGS), - .reserved = htole32(0), - }, - - /* CE3: host->target WMI */ - { - .pipenum = htole32(3), - .pipedir = htole32(PIPEDIR_OUT), - .nentries = htole32(32), - .nbytes_max = htole32(2048), - .flags = htole32(CE_ATTR_FLAGS), - .reserved = htole32(0), - }, - - /* CE4: host->target HTT */ - { - .pipenum = htole32(4), - .pipedir = htole32(PIPEDIR_OUT), - .nentries = htole32(256), - .nbytes_max = htole32(256), - .flags = htole32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR), - .reserved = htole32(0), - }, - - /* CE5: target->host Pktlog */ - { - .pipenum = htole32(5), - .pipedir = htole32(PIPEDIR_IN), - .nentries = htole32(32), - .nbytes_max = htole32(2048), - .flags = htole32(0), - .reserved = htole32(0), - }, - - /* CE6: Reserved for target autonomous hif_memcpy */ - { - .pipenum = htole32(6), - .pipedir = htole32(PIPEDIR_INOUT), - .nentries = htole32(32), - .nbytes_max = htole32(65535), - .flags = htole32(CE_ATTR_FLAGS), - .reserved = htole32(0), - }, - - /* CE7 used only by Host */ - { - .pipenum = htole32(7), - .pipedir = htole32(PIPEDIR_OUT), - .nentries = htole32(32), - .nbytes_max = htole32(2048), - .flags = htole32(CE_ATTR_FLAGS), - .reserved = htole32(0), - }, - - /* CE8 target->host used only by IPA */ - { - .pipenum = htole32(8), - .pipedir = htole32(PIPEDIR_INOUT), - .nentries = htole32(32), - .nbytes_max = htole32(65535), - .flags = htole32(CE_ATTR_FLAGS), - .reserved = htole32(0), - }, - - /* CE9 host->target HTT */ - { - .pipenum = htole32(9), - .pipedir = htole32(PIPEDIR_OUT), - .nentries = htole32(32), - .nbytes_max = htole32(2048), - .flags = htole32(CE_ATTR_FLAGS), - .reserved = htole32(0), - }, - - /* CE10 target->host HTT */ - { - .pipenum = htole32(10), - .pipedir = htole32(PIPEDIR_INOUT_H2H), - .nentries = htole32(0), - .nbytes_max = htole32(0), - .flags = htole32(CE_ATTR_FLAGS), - .reserved = htole32(0), - }, - - /* CE11 Not used */ -}; - -/* Map from service/endpoint to Copy Engine. - * This table is derived from the CE_PCI TABLE, above. - * It is passed to the Target at startup for use by firmware. - */ -const struct service_to_pipe ath12k_target_service_to_ce_map_wlan_ipq8074[] = { - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_DATA_VO), - .pipedir = htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - .pipenum = htole32(3), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_DATA_VO), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(2), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_DATA_BK), - .pipedir = htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - .pipenum = htole32(3), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_DATA_BK), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(2), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_DATA_BE), - .pipedir = htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - .pipenum = htole32(3), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_DATA_BE), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(2), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_DATA_VI), - .pipedir = htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - .pipenum = htole32(3), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_DATA_VI), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(2), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_CONTROL), - .pipedir = htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - .pipenum = htole32(3), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_CONTROL), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(2), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_CONTROL_MAC1), - .pipedir = htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - .pipenum = htole32(7), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_CONTROL_MAC1), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(2), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_CONTROL_MAC2), - .pipedir = htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - .pipenum = htole32(9), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_CONTROL_MAC2), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(2), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_RSVD_CTRL), - .pipedir = htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - .pipenum = htole32(0), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_RSVD_CTRL), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(1), - }, - { /* not used */ - .service_id = htole32(ATH12K_HTC_SVC_ID_TEST_RAW_STREAMS), - .pipedir = htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - .pipenum = htole32(0), - }, - { /* not used */ - .service_id = htole32(ATH12K_HTC_SVC_ID_TEST_RAW_STREAMS), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(1), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_HTT_DATA_MSG), - .pipedir = htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - .pipenum = htole32(4), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_HTT_DATA_MSG), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(1), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_PKT_LOG), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(5), - }, - - /* (Additions here) */ - - { /* terminator entry */ } -}; - -const struct service_to_pipe ath12k_target_service_to_ce_map_wlan_ipq6018[] = { - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_DATA_VO), - .pipedir = htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - .pipenum = htole32(3), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_DATA_VO), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(2), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_DATA_BK), - .pipedir = htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - .pipenum = htole32(3), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_DATA_BK), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(2), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_DATA_BE), - .pipedir = htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - .pipenum = htole32(3), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_DATA_BE), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(2), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_DATA_VI), - .pipedir = htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - .pipenum = htole32(3), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_DATA_VI), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(2), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_CONTROL), - .pipedir = htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - .pipenum = htole32(3), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_CONTROL), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(2), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_CONTROL_MAC1), - .pipedir = htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - .pipenum = htole32(7), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_WMI_CONTROL_MAC1), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(2), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_RSVD_CTRL), - .pipedir = htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - .pipenum = htole32(0), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_RSVD_CTRL), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(1), - }, - { /* not used */ - .service_id = htole32(ATH12K_HTC_SVC_ID_TEST_RAW_STREAMS), - .pipedir = htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - .pipenum = htole32(0), - }, - { /* not used */ - .service_id = htole32(ATH12K_HTC_SVC_ID_TEST_RAW_STREAMS), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(1), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_HTT_DATA_MSG), - .pipedir = htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - .pipenum = htole32(4), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_HTT_DATA_MSG), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(1), - }, - { - .service_id = htole32(ATH12K_HTC_SVC_ID_PKT_LOG), - .pipedir = htole32(PIPEDIR_IN), /* in = DL = target -> host */ - .pipenum = htole32(5), - }, - - /* (Additions here) */ - - { /* terminator entry */ } -}; - -/* Target firmware's Copy Engine configuration. */ -const struct ce_pipe_config ath12k_target_ce_config_wlan_qca6390[] = { +const struct ce_pipe_config ath12k_target_ce_config_wlan_wcn7850[] = { /* CE0: host->target HTC control and raw streams */ { .pipenum = htole32(0), @@ -2199,7 +1452,7 @@ const struct ce_pipe_config ath12k_target_ce_config_wlan_qca6390[] = { * This table is derived from the CE_PCI TABLE, above. * It is passed to the Target at startup for use by firmware. */ -const struct service_to_pipe ath12k_target_service_to_ce_map_wlan_qca6390[] = { +const struct service_to_pipe ath12k_target_service_to_ce_map_wlan_wcn7850[] = { { htole32(ATH12K_HTC_SVC_ID_WMI_DATA_VO), htole32(PIPEDIR_OUT), /* out = UL = host -> target */ @@ -2280,440 +1533,9 @@ const struct service_to_pipe ath12k_target_service_to_ce_map_wlan_qca6390[] = { }, }; -/* Target firmware's Copy Engine configuration. */ -const struct ce_pipe_config ath12k_target_ce_config_wlan_qcn9074[] = { - /* CE0: host->target HTC control and raw streams */ - { - .pipenum = htole32(0), - .pipedir = htole32(PIPEDIR_OUT), - .nentries = htole32(32), - .nbytes_max = htole32(2048), - .flags = htole32(CE_ATTR_FLAGS), - .reserved = htole32(0), - }, +#define QWZ_CE_COUNT_WCN7850 9 - /* CE1: target->host HTT + HTC control */ - { - .pipenum = htole32(1), - .pipedir = htole32(PIPEDIR_IN), - .nentries = htole32(32), - .nbytes_max = htole32(2048), - .flags = htole32(CE_ATTR_FLAGS), - .reserved = htole32(0), - }, - - /* CE2: target->host WMI */ - { - .pipenum = htole32(2), - .pipedir = htole32(PIPEDIR_IN), - .nentries = htole32(32), - .nbytes_max = htole32(2048), - .flags = htole32(CE_ATTR_FLAGS), - .reserved = htole32(0), - }, - - /* CE3: host->target WMI */ - { - .pipenum = htole32(3), - .pipedir = htole32(PIPEDIR_OUT), - .nentries = htole32(32), - .nbytes_max = htole32(2048), - .flags = htole32(CE_ATTR_FLAGS), - .reserved = htole32(0), - }, - - /* CE4: host->target HTT */ - { - .pipenum = htole32(4), - .pipedir = htole32(PIPEDIR_OUT), - .nentries = htole32(256), - .nbytes_max = htole32(256), - .flags = htole32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR), - .reserved = htole32(0), - }, - - /* CE5: target->host Pktlog */ - { - .pipenum = htole32(5), - .pipedir = htole32(PIPEDIR_IN), - .nentries = htole32(32), - .nbytes_max = htole32(2048), - .flags = htole32(CE_ATTR_FLAGS), - .reserved = htole32(0), - }, - - /* CE6: Reserved for target autonomous hif_memcpy */ - { - .pipenum = htole32(6), - .pipedir = htole32(PIPEDIR_INOUT), - .nentries = htole32(32), - .nbytes_max = htole32(16384), - .flags = htole32(CE_ATTR_FLAGS), - .reserved = htole32(0), - }, - - /* CE7 used only by Host */ - { - .pipenum = htole32(7), - .pipedir = htole32(PIPEDIR_INOUT_H2H), - .nentries = htole32(0), - .nbytes_max = htole32(0), - .flags = htole32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR), - .reserved = htole32(0), - }, - - /* CE8 target->host used only by IPA */ - { - .pipenum = htole32(8), - .pipedir = htole32(PIPEDIR_INOUT), - .nentries = htole32(32), - .nbytes_max = htole32(16384), - .flags = htole32(CE_ATTR_FLAGS), - .reserved = htole32(0), - }, - /* CE 9, 10, 11 are used by MHI driver */ -}; - -/* Map from service/endpoint to Copy Engine. - * This table is derived from the CE_PCI TABLE, above. - * It is passed to the Target at startup for use by firmware. - */ -const struct service_to_pipe ath12k_target_service_to_ce_map_wlan_qcn9074[] = { - { - htole32(ATH12K_HTC_SVC_ID_WMI_DATA_VO), - htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - htole32(3), - }, - { - htole32(ATH12K_HTC_SVC_ID_WMI_DATA_VO), - htole32(PIPEDIR_IN), /* in = DL = target -> host */ - htole32(2), - }, - { - htole32(ATH12K_HTC_SVC_ID_WMI_DATA_BK), - htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - htole32(3), - }, - { - htole32(ATH12K_HTC_SVC_ID_WMI_DATA_BK), - htole32(PIPEDIR_IN), /* in = DL = target -> host */ - htole32(2), - }, - { - htole32(ATH12K_HTC_SVC_ID_WMI_DATA_BE), - htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - htole32(3), - }, - { - htole32(ATH12K_HTC_SVC_ID_WMI_DATA_BE), - htole32(PIPEDIR_IN), /* in = DL = target -> host */ - htole32(2), - }, - { - htole32(ATH12K_HTC_SVC_ID_WMI_DATA_VI), - htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - htole32(3), - }, - { - htole32(ATH12K_HTC_SVC_ID_WMI_DATA_VI), - htole32(PIPEDIR_IN), /* in = DL = target -> host */ - htole32(2), - }, - { - htole32(ATH12K_HTC_SVC_ID_WMI_CONTROL), - htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - htole32(3), - }, - { - htole32(ATH12K_HTC_SVC_ID_WMI_CONTROL), - htole32(PIPEDIR_IN), /* in = DL = target -> host */ - htole32(2), - }, - { - htole32(ATH12K_HTC_SVC_ID_RSVD_CTRL), - htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - htole32(0), - }, - { - htole32(ATH12K_HTC_SVC_ID_RSVD_CTRL), - htole32(PIPEDIR_IN), /* in = DL = target -> host */ - htole32(1), - }, - { - htole32(ATH12K_HTC_SVC_ID_TEST_RAW_STREAMS), - htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - htole32(0), - }, - { - htole32(ATH12K_HTC_SVC_ID_TEST_RAW_STREAMS), - htole32(PIPEDIR_IN), /* in = DL = target -> host */ - htole32(1), - }, - { - htole32(ATH12K_HTC_SVC_ID_HTT_DATA_MSG), - htole32(PIPEDIR_OUT), /* out = UL = host -> target */ - htole32(4), - }, - { - htole32(ATH12K_HTC_SVC_ID_HTT_DATA_MSG), - htole32(PIPEDIR_IN), /* in = DL = target -> host */ - htole32(1), - }, - { - htole32(ATH12K_HTC_SVC_ID_PKT_LOG), - htole32(PIPEDIR_IN), /* in = DL = target -> host */ - htole32(5), - }, - - /* (Additions here) */ - - { /* must be last */ - htole32(0), - htole32(0), - htole32(0), - }, -}; - -#define QWZ_CE_COUNT_IPQ8074 21 - -const struct ce_attr qwz_host_ce_config_ipq8074[QWZ_CE_COUNT_IPQ8074] = { - /* CE0: host->target HTC control and raw streams */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 16, - .src_sz_max = 2048, - .dest_nentries = 0, - }, - - /* CE1: target->host HTT + HTC control */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 0, - .src_sz_max = 2048, - .dest_nentries = 512, - .recv_cb = qwz_htc_rx_completion_handler, - }, - - /* CE2: target->host WMI */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 0, - .src_sz_max = 2048, - .dest_nentries = 512, - .recv_cb = qwz_htc_rx_completion_handler, - }, - - /* CE3: host->target WMI (mac0) */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 32, - .src_sz_max = 2048, - .dest_nentries = 0, - }, - - /* CE4: host->target HTT */ - { - .flags = CE_ATTR_FLAGS | CE_ATTR_DIS_INTR, - .src_nentries = 2048, - .src_sz_max = 256, - .dest_nentries = 0, - }, - - /* CE5: target->host pktlog */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 0, - .src_sz_max = 2048, - .dest_nentries = 512, - .recv_cb = qwz_dp_htt_htc_t2h_msg_handler, - }, - - /* CE6: target autonomous hif_memcpy */ - { - .flags = CE_ATTR_FLAGS | CE_ATTR_DIS_INTR, - .src_nentries = 0, - .src_sz_max = 0, - .dest_nentries = 0, - }, - - /* CE7: host->target WMI (mac1) */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 32, - .src_sz_max = 2048, - .dest_nentries = 0, - }, - - /* CE8: target autonomous hif_memcpy */ - { - .flags = CE_ATTR_FLAGS | CE_ATTR_DIS_INTR, - .src_nentries = 0, - .src_sz_max = 0, - .dest_nentries = 0, - }, - - /* CE9: host->target WMI (mac2) */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 32, - .src_sz_max = 2048, - .dest_nentries = 0, - }, - - /* CE10: target->host HTT */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 0, - .src_sz_max = 2048, - .dest_nentries = 512, - .recv_cb = qwz_htc_rx_completion_handler, - }, - - /* CE11: Not used */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 0, - .src_sz_max = 0, - .dest_nentries = 0, - }, -}; - -#define QWZ_CE_COUNT_QCA6390 9 - -const struct ce_attr qwz_host_ce_config_qca6390[QWZ_CE_COUNT_QCA6390] = { - /* CE0: host->target HTC control and raw streams */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 16, - .src_sz_max = 2048, - .dest_nentries = 0, - }, - - /* CE1: target->host HTT + HTC control */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 0, - .src_sz_max = 2048, - .dest_nentries = 512, - .recv_cb = qwz_htc_rx_completion_handler, - }, - - /* CE2: target->host WMI */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 0, - .src_sz_max = 2048, - .dest_nentries = 512, - .recv_cb = qwz_htc_rx_completion_handler, - }, - - /* CE3: host->target WMI (mac0) */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 32, - .src_sz_max = 2048, - .dest_nentries = 0, - }, - - /* CE4: host->target HTT */ - { - .flags = CE_ATTR_FLAGS | CE_ATTR_DIS_INTR, - .src_nentries = 2048, - .src_sz_max = 256, - .dest_nentries = 0, - }, - - /* CE5: target->host pktlog */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 0, - .src_sz_max = 2048, - .dest_nentries = 512, - .recv_cb = qwz_dp_htt_htc_t2h_msg_handler, - }, - - /* CE6: target autonomous hif_memcpy */ - { - .flags = CE_ATTR_FLAGS | CE_ATTR_DIS_INTR, - .src_nentries = 0, - .src_sz_max = 0, - .dest_nentries = 0, - }, - - /* CE7: host->target WMI (mac1) */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 32, - .src_sz_max = 2048, - .dest_nentries = 0, - }, - - /* CE8: target autonomous hif_memcpy */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 0, - .src_sz_max = 0, - .dest_nentries = 0, - }, - -}; - -#define QWZ_CE_COUNT_QCN9074 6 - -const struct ce_attr qwz_host_ce_config_qcn9074[QWZ_CE_COUNT_QCN9074] = { - /* CE0: host->target HTC control and raw streams */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 16, - .src_sz_max = 2048, - .dest_nentries = 0, - }, - - /* CE1: target->host HTT + HTC control */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 0, - .src_sz_max = 2048, - .dest_nentries = 512, - .recv_cb = qwz_htc_rx_completion_handler, - }, - - /* CE2: target->host WMI */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 0, - .src_sz_max = 2048, - .dest_nentries = 32, - .recv_cb = qwz_htc_rx_completion_handler, - }, - - /* CE3: host->target WMI (mac0) */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 32, - .src_sz_max = 2048, - .dest_nentries = 0, - }, - - /* CE4: host->target HTT */ - { - .flags = CE_ATTR_FLAGS | CE_ATTR_DIS_INTR, - .src_nentries = 2048, - .src_sz_max = 256, - .dest_nentries = 0, - }, - - /* CE5: target->host pktlog */ - { - .flags = CE_ATTR_FLAGS, - .src_nentries = 0, - .src_sz_max = 2048, - .dest_nentries = 512, - .recv_cb = qwz_dp_htt_htc_t2h_msg_handler, - }, -}; - -const struct ce_attr qwz_host_ce_config_wcn7850[QWZ_CE_COUNT_QCA6390] = { +const struct ce_attr qwz_host_ce_config_wcn7850[QWZ_CE_COUNT_WCN7850] = { /* CE0: host->target HTC control and raw streams */ { .flags = CE_ATTR_FLAGS, @@ -2813,9 +1635,66 @@ static const struct ath12k_hw_hal_params ath12k_hw_hal_params_wcn7850 = { HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW4_EN, }; +const struct hal_rx_ops hal_rx_wcn7850_ops = { + .rx_desc_get_first_msdu = qwz_hw_wcn7850_rx_desc_get_first_msdu, +#ifdef notyet + .rx_desc_get_last_msdu = qwz_hw_wcn7850_rx_desc_get_last_msdu, +#endif + .rx_desc_get_l3_pad_bytes = qwz_hw_wcn7850_rx_desc_get_l3_pad_bytes, + .rx_desc_encrypt_valid = qwz_hw_wcn7850_rx_desc_encrypt_valid, + .rx_desc_get_encrypt_type = qwz_hw_wcn7850_rx_desc_get_encrypt_type, + .rx_desc_get_decap_type = qwz_hw_wcn7850_rx_desc_get_decap_type, +#ifdef notyet + .rx_desc_get_mesh_ctl = qwz_hw_wcn7850_rx_desc_get_mesh_ctl, + .rx_desc_get_mpdu_seq_ctl_vld = qwz_hw_wcn7850_rx_desc_get_mpdu_seq_ctl_vld, + .rx_desc_get_mpdu_fc_valid = qwz_hw_wcn7850_rx_desc_get_mpdu_fc_valid, + .rx_desc_get_mpdu_start_seq_no = qwz_hw_wcn7850_rx_desc_get_mpdu_start_seq_no, +#endif + .rx_desc_get_msdu_len = qwz_hw_wcn7850_rx_desc_get_msdu_len, +#ifdef notyet + .rx_desc_get_msdu_sgi = qwz_hw_wcn7850_rx_desc_get_msdu_sgi, + .rx_desc_get_msdu_rate_mcs = qwz_hw_wcn7850_rx_desc_get_msdu_rate_mcs, + .rx_desc_get_msdu_rx_bw = qwz_hw_wcn7850_rx_desc_get_msdu_rx_bw, +#endif + .rx_desc_get_msdu_freq = qwz_hw_wcn7850_rx_desc_get_msdu_freq, + .rx_desc_get_msdu_pkt_type = qwz_hw_wcn7850_rx_desc_get_msdu_pkt_type, + .rx_desc_get_msdu_nss = qwz_hw_wcn7850_rx_desc_get_msdu_nss, + .rx_desc_get_mpdu_tid = qwz_hw_wcn7850_rx_desc_get_mpdu_tid, + .rx_desc_get_mpdu_peer_id = qwz_hw_wcn7850_rx_desc_get_mpdu_peer_id, + .rx_desc_copy_end_tlv = qwz_hw_wcn7850_rx_desc_copy_end_tlv, + .rx_desc_get_mpdu_start_tag = qwz_hw_wcn7850_rx_desc_get_mpdu_start_tag, + .rx_desc_get_mpdu_ppdu_id = qwz_hw_wcn7850_rx_desc_get_mpdu_ppdu_id, + .rx_desc_set_msdu_len = qwz_hw_wcn7850_rx_desc_set_msdu_len, +#ifdef notyet + .rx_desc_get_msdu_payload = qwz_hw_wcn7850_rx_desc_get_msdu_payload, + .rx_desc_get_mpdu_start_offset = qwz_hw_wcn7850_rx_desc_get_mpdu_start_offset, + .rx_desc_get_msdu_end_offset = qwz_hw_wcn7850_rx_desc_get_msdu_end_offset, + .rx_desc_mac_addr2_valid = qwz_hw_wcn7850_rx_desc_mac_addr2_valid, + .rx_desc_mpdu_start_addr2 = qwz_hw_wcn7850_rx_desc_mpdu_start_addr2, +#endif + .rx_desc_is_da_mcbc = qwz_hw_wcn7850_rx_desc_is_da_mcbc, +#ifdef notyet + .rx_desc_get_dot11_hdr = qwz_hw_wcn7850_rx_desc_get_dot11_hdr, + .rx_desc_get_crypto_header = qwz_hw_wcn7850_rx_desc_get_crypto_hdr, + .rx_desc_get_mpdu_frame_ctl = qwz_hw_wcn7850_rx_desc_get_mpdu_frame_ctl, + .dp_rx_h_msdu_done = qwz_hw_wcn7850_dp_rx_h_msdu_done, + .dp_rx_h_l4_cksum_fail = qwz_hw_wcn7850_dp_rx_h_l4_cksum_fail, + .dp_rx_h_ip_cksum_fail = qwz_hw_wcn7850_dp_rx_h_ip_cksum_fail, +#endif + .dp_rx_h_is_decrypted = qwz_hw_wcn7850_dp_rx_h_is_decrypted, + .dp_rx_h_mpdu_err = qwz_hw_wcn7850_dp_rx_h_mpdu_err, + .rx_desc_get_desc_size = qwz_hw_wcn7850_get_rx_desc_size, +#ifdef notyet + .rx_desc_get_msdu_src_link_id = qwz_hw_wcn7850_rx_desc_get_msdu_src_link, +#endif +}; + const struct hal_ops hal_wcn7850_ops = { .create_srng_config = qwz_hal_srng_create_config_wcn7850, .tcl_to_wbm_rbm_map = ath12k_hal_wcn7850_tcl_to_wbm_rbm_map, + .rxdma_ring_wmask_rx_mpdu_start = NULL, + .rxdma_ring_wmask_rx_msdu_end = NULL, + .get_hal_rx_compact_ops = NULL, }; static const struct ath12k_hw_params ath12k_hw_params[] = { @@ -2828,27 +1707,31 @@ static const struct ath12k_hw_params ath12k_hw_params[] = { .cal_offset = 256 * 1024, }, .max_radios = 1, + .single_pdev_only = true, .internal_sleep_clock = true, .hw_ops = &wcn7850_ops, .ring_mask = &ath12k_hw_ring_mask_wcn7850, .regs = &wcn7850_regs, .qmi_service_ins_id = ATH12K_QMI_WLFW_SERVICE_INS_ID_V01_WCN7850, .host_ce_config = qwz_host_ce_config_wcn7850, - .ce_count = QWZ_CE_COUNT_QCA6390, - .target_ce_config = ath12k_target_ce_config_wlan_qca6390, + .ce_count = QWZ_CE_COUNT_WCN7850, + .target_ce_config = ath12k_target_ce_config_wlan_wcn7850, .target_ce_count = 9, - .svc_to_ce_map = ath12k_target_service_to_ce_map_wlan_qca6390, + .svc_to_ce_map = ath12k_target_service_to_ce_map_wlan_wcn7850, .svc_to_ce_map_len = 14, .rxdma1_enable = false, .num_rxmda_per_pdev = 2, .num_rxdma_dst_ring = 1, - .credit_flow = true, - .max_tx_ring = DP_TCL_NUM_RING_MAX, + .rx_mac_buf_ring = true, + .num_tcl_banks = 7, + .max_tx_ring = 3, .htt_peer_map_v2 = false, + .reoq_lut_support = false, .supports_shadow_regs = true, .fix_l1ss = false, .hal_params = &ath12k_hw_hal_params_wcn7850, .hal_ops = &hal_wcn7850_ops, + .wmi_init = qwz_wmi_init_wcn7850, .qmi_cnss_feature_bitmap = BIT(CNSS_QDSS_CFG_MISS_V01) | BIT(CNSS_PCIE_PERST_NO_PULL_V01), .tx_ring_size = DP_TCL_DATA_RING_SIZE, @@ -7208,6 +6091,33 @@ qwz_qmi_mem_seg_send(struct qwz_softc *sc) return 0; } +int +qwz_loadfirmware(struct qwz_softc *sc, int type, const char *filename, + u_char **data, size_t *len) +{ + char path[PATH_MAX]; + int ret; + + if (!sc->fw_img[type].data) { + ret = snprintf(path, sizeof(path), "%s-%s-%s", + ATH12K_FW_DIR, sc->hw_params.fw.dir, filename); + if (ret < 0 || ret >= sizeof(path)) + return ENOSPC; + + ret = loadfirmware(path, &sc->fw_img[type].data, + &sc->fw_img[type].size); + if (ret) { + printf("%s: could not read %s (error %d)\n", + sc->sc_dev.dv_xname, path, ret); + return ret; + } + } + + *data = sc->fw_img[type].data; + *len = sc->fw_img[type].size; + return 0; +} + int qwz_core_check_smbios(struct qwz_softc *sc) { @@ -7532,28 +6442,28 @@ next: } out: - if (!*boardfw || !*boardfw_len) { - printf("%s: failed to fetch %s for %s from %s\n", - __func__, qwz_bd_ie_type_str(ie_id_match), - boardname, filename); + if (!*boardfw || !*boardfw_len) return ENOENT; - } return 0; } int -qwz_core_fetch_bdf(struct qwz_softc *sc, u_char **data, size_t *len, - const u_char **boardfw, size_t *boardfw_len, const char *filename) +qwz_core_fetch_bdf(struct qwz_softc *sc, const u_char **boardfw, + size_t *boardfw_len) { - char path[PATH_MAX]; - char boardname[200]; + char boardname[200], fallback_boardname[200]; + u_char *data; + size_t len; int ret; - ret = snprintf(path, sizeof(path), "%s-%s-%s", - ATH12K_FW_DIR, sc->hw_params.fw.dir, filename); - if (ret < 0 || ret >= sizeof(path)) - return ENOSPC; + ret = qwz_loadfirmware(sc, QWZ_FW_BOARD, ATH12K_BOARD_API2_FILE, + &data, &len); + if (ret) { + printf("%s: could not read %s (error %d)\n", + sc->sc_dev.dv_xname, ATH12K_BOARD_API2_FILE, ret); + return ret; + } ret = qwz_core_create_board_name(sc, boardname, sizeof(boardname)); if (ret) { @@ -7562,23 +6472,75 @@ qwz_core_fetch_bdf(struct qwz_softc *sc, u_char **data, size_t *len, return ret; } - ret = loadfirmware(path, data, len); + ret = qwz_core_fetch_board_data_api_n(sc, boardfw, boardfw_len, + data, len, boardname, ATH12K_BD_IE_BOARD, + ATH12K_BD_IE_BOARD_NAME, ATH12K_BD_IE_BOARD_DATA); + if (!ret) + return 0; + + ret = qwz_core_create_fallback_board_name(sc, fallback_boardname, + sizeof(fallback_boardname)); if (ret) { - printf("%s: could not read %s (error %d)\n", - sc->sc_dev.dv_xname, path, ret); + DPRINTF("%s: failed to create board name: %d", + sc->sc_dev.dv_xname, ret); return ret; } ret = qwz_core_fetch_board_data_api_n(sc, boardfw, boardfw_len, - *data, *len, boardname, ATH12K_BD_IE_BOARD, + data, len, fallback_boardname, ATH12K_BD_IE_BOARD, ATH12K_BD_IE_BOARD_NAME, ATH12K_BD_IE_BOARD_DATA); + if (!ret) + return 0; + + DPRINTF("%s: failed to fetch board data for %s from %s\n", + sc->sc_dev.dv_xname, boardname, path); + return ret; +} + +int +qwz_core_fetch_regdb(struct qwz_softc *sc, const u_char **boardfw, + size_t *boardfw_len) +{ + char boardname[200], default_boardname[200]; + u_char *data; + size_t len; + int ret; + + ret = qwz_loadfirmware(sc, QWZ_FW_BOARD, ATH12K_BOARD_API2_FILE, + &data, &len); + if (ret) + return ret; + + ret = qwz_core_create_board_name(sc, boardname, sizeof(boardname)); if (ret) { - DPRINTF("%s: failed to fetch board data for %s from %s\n", - sc->sc_dev.dv_xname, boardname, path); + DPRINTF("%s: failed to create board name: %d", + sc->sc_dev.dv_xname, ret); return ret; } - return 0; + ret = qwz_core_fetch_board_data_api_n(sc, boardfw, boardfw_len, + data, len, boardname, ATH12K_BD_IE_REGDB, + ATH12K_BD_IE_REGDB_NAME, ATH12K_BD_IE_REGDB_DATA); + if (!ret) + return 0; + + ret = qwz_core_create_bus_type_board_name(sc, default_boardname, + sizeof(default_boardname)); + if (ret) { + DPRINTF("%s: failed to create board name: %d", + sc->sc_dev.dv_xname, ret); + return ret; + } + + ret = qwz_core_fetch_board_data_api_n(sc, boardfw, boardfw_len, + data, len, default_boardname, ATH12K_BD_IE_REGDB, + ATH12K_BD_IE_REGDB_NAME, ATH12K_BD_IE_REGDB_DATA); + if (!ret) + return 0; + + DPRINTF("%s: failed to fetch regdb data for %s from %s\n", + sc->sc_dev.dv_xname, boardname, path); + return ret; } int @@ -7673,105 +6635,45 @@ err_free_req: #define QWZ_SELFMAG 4 int -qwz_qmi_load_bdf_qmi(struct qwz_softc *sc, int regdb) +qwz_qmi_load_bdf_qmi(struct qwz_softc *sc, enum ath12k_qmi_bdf_type type) { u_char *data = NULL; const u_char *boardfw; size_t len = 0, boardfw_len; uint32_t fw_size; - int ret = 0, bdf_type; -#ifdef notyet - const uint8_t *tmp; - uint32_t file_type; -#endif + int ret = 0; - if (sc->fw_img[QWZ_FW_BOARD].data) { - boardfw = sc->fw_img[QWZ_FW_BOARD].data; - boardfw_len = sc->fw_img[QWZ_FW_BOARD].size; - } else { - ret = qwz_core_fetch_bdf(sc, &data, &len, - &boardfw, &boardfw_len, - ATH12K_BOARD_API2_FILE); + switch (type) { + case ATH12K_QMI_BDF_TYPE_ELF: + ret = qwz_core_fetch_bdf(sc, &boardfw, &boardfw_len); if (ret) return ret; - - sc->fw_img[QWZ_FW_BOARD].data = malloc(boardfw_len, M_DEVBUF, - M_NOWAIT); - if (sc->fw_img[QWZ_FW_BOARD].data) { - memcpy(sc->fw_img[QWZ_FW_BOARD].data, boardfw, boardfw_len); - sc->fw_img[QWZ_FW_BOARD].size = boardfw_len; - } + if (boardfw_len >= QWZ_SELFMAG && + memcmp(boardfw, QWZ_ELFMAG, QWZ_SELFMAG) == 0) + type = ATH12K_QMI_BDF_TYPE_ELF; + else + type = ATH12K_QMI_BDF_TYPE_BIN; + break; + case ATH12K_QMI_BDF_TYPE_REGDB: + ret = qwz_core_fetch_regdb(sc, &boardfw, &boardfw_len); + if (ret) + return ret; + break; + default: + printf("%s: invalid type %d\n", __func__, type); + return EINVAL; } - if (regdb) - bdf_type = ATH12K_QMI_BDF_TYPE_REGDB; - else if (boardfw_len >= QWZ_SELFMAG && - memcmp(boardfw, QWZ_ELFMAG, QWZ_SELFMAG) == 0) - bdf_type = ATH12K_QMI_BDF_TYPE_ELF; - else - bdf_type = ATH12K_QMI_BDF_TYPE_BIN; - - DPRINTF("%s: bdf_type %d\n", __func__, bdf_type); + DPRINTF("%s: type %d\n", __func__, type); fw_size = MIN(sc->hw_params.fw.board_size, boardfw_len); - ret = qwz_qmi_load_file_target_mem(sc, boardfw, fw_size, bdf_type); + ret = qwz_qmi_load_file_target_mem(sc, boardfw, fw_size, type); if (ret) { printf("%s: failed to load bdf file\n", __func__); goto out; } - /* QCA6390/WCN6855 does not support cal data, skip it */ - if (bdf_type == ATH12K_QMI_BDF_TYPE_ELF || bdf_type == ATH12K_QMI_BDF_TYPE_REGDB) - goto out; -#ifdef notyet - if (ab->qmi.target.eeprom_caldata) { - file_type = ATH12K_QMI_FILE_TYPE_EEPROM; - tmp = filename; - fw_size = ATH12K_QMI_MAX_BDF_FILE_NAME_SIZE; - } else { - file_type = ATH12K_QMI_FILE_TYPE_CALDATA; - - /* cal--.bin */ - snprintf(filename, sizeof(filename), "cal-%s-%s.bin", - ath12k_bus_str(ab->hif.bus), dev_name(dev)); - fw_entry = ath12k_core_firmware_request(ab, filename); - if (!IS_ERR(fw_entry)) - goto success; - - fw_entry = ath12k_core_firmware_request(ab, ATH12K_DEFAULT_CAL_FILE); - if (IS_ERR(fw_entry)) { - /* Caldata may not be present during first time calibration in - * factory hence allow to boot without loading caldata in ftm mode - */ - if (ath12k_ftm_mode) { - ath12k_info(ab, - "Booting without cal data file in factory test mode\n"); - return 0; - } - ret = PTR_ERR(fw_entry); - ath12k_warn(ab, - "qmi failed to load CAL data file:%s\n", - filename); - goto out; - } -success: - fw_size = MIN(ab->hw_params.fw.board_size, fw_entry->size); - tmp = fw_entry->data; - } - - ret = ath12k_qmi_load_file_target_mem(ab, tmp, fw_size, file_type); - if (ret < 0) { - ath12k_warn(ab, "qmi failed to load caldata\n"); - goto out_qmi_cal; - } - - ath12k_dbg(ab, ATH12K_DBG_QMI, "caldata type: %u\n", file_type); - -out_qmi_cal: - if (!ab->qmi.target.eeprom_caldata) - release_firmware(fw_entry); -#endif out: free(data, M_DEVBUF, len); if (ret == 0) @@ -7792,15 +6694,15 @@ qwz_qmi_event_load_bdf(struct qwz_softc *sc) return ret; } - ret = qwz_qmi_load_bdf_qmi(sc, 1); - if (ret < 0) { + ret = qwz_qmi_load_bdf_qmi(sc, ATH12K_QMI_BDF_TYPE_REGDB); + if (ret) { printf("%s: failed to load regdb file: %d\n", sc->sc_dev.dv_xname, ret); return ret; } - ret = qwz_qmi_load_bdf_qmi(sc, 0); - if (ret < 0) { + ret = qwz_qmi_load_bdf_qmi(sc, ATH12K_QMI_BDF_TYPE_ELF); + if (ret) { printf("%s: failed to load board data file: %d\n", sc->sc_dev.dv_xname, ret); return ret; @@ -7814,28 +6716,11 @@ qwz_qmi_m3_load(struct qwz_softc *sc) { u_char *data; size_t len; - char path[PATH_MAX]; int ret; - if (sc->fw_img[QWZ_FW_M3].data) { - data = sc->fw_img[QWZ_FW_M3].data; - len = sc->fw_img[QWZ_FW_M3].size; - } else { - ret = snprintf(path, sizeof(path), "%s-%s-%s", - ATH12K_FW_DIR, sc->hw_params.fw.dir, ATH12K_M3_FILE); - if (ret < 0 || ret >= sizeof(path)) - return ENOSPC; - - ret = loadfirmware(path, &data, &len); - if (ret) { - printf("%s: could not read %s (error %d)\n", - sc->sc_dev.dv_xname, path, ret); - return ret; - } - - sc->fw_img[QWZ_FW_M3].data = data; - sc->fw_img[QWZ_FW_M3].size = len; - } + ret = qwz_loadfirmware(sc, QWZ_FW_M3, ATH12K_M3_FILE, &data, &len); + if (ret) + return ret; if (sc->m3_mem == NULL || QWZ_DMA_LEN(sc->m3_mem) < len) { if (sc->m3_mem) @@ -7943,11 +6828,6 @@ qwz_hal_srng_dst_get_next_entry(struct qwz_softc *sc, struct hal_srng *srng) /* wrap around to start of ring */ if (srng->u.dst_ring.tp == srng->ring_size) srng->u.dst_ring.tp = 0; -#ifdef notyet - /* Try to prefetch the next descriptor in the ring */ - if (srng->flags & HAL_SRNG_FLAGS_CACHED) - ath12k_hal_srng_prefetch_desc(ab, srng); -#endif return desc; } @@ -8133,42 +7013,16 @@ qwz_dp_srng_setup(struct qwz_softc *sc, struct dp_srng *ring, uint16_t entry_sz = qwz_hal_srng_get_entrysize(sc, type); uint32_t max_entries = qwz_hal_srng_get_max_entries(sc, type); int ret; - int cached = 0; if (num_entries > max_entries) num_entries = max_entries; ring->size = (num_entries * entry_sz) + HAL_RING_BASE_ALIGN - 1; - -#ifdef notyet - if (sc->hw_params.alloc_cacheable_memory) { - /* Allocate the reo dst and tx completion rings from cacheable memory */ - switch (type) { - case HAL_REO_DST: - case HAL_WBM2SW_RELEASE: - cached = true; - break; - default: - cached = false; - } - - if (cached) { - ring->vaddr_unaligned = kzalloc(ring->size, GFP_KERNEL); - ring->paddr_unaligned = virt_to_phys(ring->vaddr_unaligned); - } - if (!ring->vaddr_unaligned) - return -ENOMEM; - } -#endif - if (!cached) { - ring->mem = qwz_dmamem_alloc(sc->sc_dmat, ring->size, - PAGE_SIZE); - if (ring->mem == NULL) { - printf("%s: could not allocate DP SRNG DMA memory\n", - sc->sc_dev.dv_xname); - return ENOMEM; - - } + ring->mem = qwz_dmamem_alloc(sc->sc_dmat, ring->size, PAGE_SIZE); + if (ring->mem == NULL) { + printf("%s: could not allocate DP SRNG DMA memory\n", + sc->sc_dev.dv_xname); + return ENOMEM; } ring->vaddr = QWZ_DMA_KVA(ring->mem); @@ -8200,14 +7054,14 @@ qwz_dp_srng_setup(struct qwz_softc *sc, struct dp_srng *ring, params.intr_timer_thres_us = HAL_SRNG_INT_TIMER_THRESHOLD_RX; break; case HAL_WBM2SW_RELEASE: - if (ring_num < 3) { + if (sc->hw_params.hw_ops->dp_srng_is_tx_comp_ring(ring_num)) { params.intr_batch_cntr_thres_entries = HAL_SRNG_INT_BATCH_THRESHOLD_TX; params.intr_timer_thres_us = HAL_SRNG_INT_TIMER_THRESHOLD_TX; break; } - /* follow through when ring_num >= 3 */ + /* follow through when ring_num != HAL_WBM2SW_REL_ERR_RING_NUM */ /* FALLTHROUGH */ case HAL_REO_EXCEPTION: case HAL_REO_REINJECT: @@ -8233,11 +7087,6 @@ qwz_dp_srng_setup(struct qwz_softc *sc, struct dp_srng *ring, return EINVAL; } - if (cached) { - params.flags |= HAL_SRNG_FLAGS_CACHED; - ring->cached = 1; - } - ret = qwz_hal_srng_setup(sc, type, ring_num, mac_id, ¶ms); if (ret < 0) { printf("%s: failed to setup srng: %d ring_id %d\n", @@ -8468,13 +7317,13 @@ qwz_hal_setup_link_idle_list(struct qwz_softc *sc, void qwz_hal_set_link_desc_addr(struct hal_wbm_link_desc *desc, uint32_t cookie, - bus_addr_t paddr) + bus_addr_t paddr, enum hal_rx_buf_return_buf_manager rbm) { desc->buf_addr_info.info0 = FIELD_PREP(BUFFER_ADDR_INFO0_ADDR, (paddr & HAL_ADDR_LSB_REG_MASK)); desc->buf_addr_info.info1 = FIELD_PREP(BUFFER_ADDR_INFO1_ADDR, ((uint64_t)paddr >> HAL_ADDR_MSB_REG_SHIFT)) | - FIELD_PREP(BUFFER_ADDR_INFO1_RET_BUF_MGR, 1) | + FIELD_PREP(BUFFER_ADDR_INFO1_RET_BUF_MGR, rbm) | FIELD_PREP(BUFFER_ADDR_INFO1_SW_COOKIE, cookie); } @@ -8513,6 +7362,7 @@ qwz_dp_scatter_idle_link_desc_setup(struct qwz_softc *sc, int size, int ret = 0; uint32_t end_offset; uint32_t cookie; + enum hal_rx_buf_return_buf_manager rbm = dp->idle_link_rbm; n_entries_per_buf = HAL_WBM_IDLE_SCATTER_BUF_SIZE / qwz_hal_srng_get_entrysize(sc, HAL_WBM_IDLE_LINK); @@ -8542,7 +7392,8 @@ qwz_dp_scatter_idle_link_desc_setup(struct qwz_softc *sc, int size, paddr = link_desc_banks[i].paddr; while (n_entries) { cookie = DP_LINK_DESC_COOKIE_SET(n_entries, i); - qwz_hal_set_link_desc_addr(scatter_buf, cookie, paddr); + qwz_hal_set_link_desc_addr(scatter_buf, cookie, paddr, + rbm); n_entries--; paddr += HAL_LINK_DESC_SIZE; if (rem_entries) { @@ -8570,10 +7421,10 @@ err: return ret; } -uint32_t * +void * qwz_hal_srng_src_get_next_entry(struct qwz_softc *sc, struct hal_srng *srng) { - uint32_t *desc; + void *desc; uint32_t next_hp; #ifdef notyet lockdep_assert_held(&srng->lock); @@ -8635,6 +7486,8 @@ qwz_dp_link_desc_setup(struct qwz_softc *sc, uint64_t paddr; uint32_t *desc; int i, ret; + uint32_t cookie; + enum hal_rx_buf_return_buf_manager rbm = sc->dp.idle_link_rbm; tot_mem_sz = n_link_desc * HAL_LINK_DESC_SIZE; tot_mem_sz += HAL_LINK_DESC_ALIGN; @@ -8688,8 +7541,10 @@ qwz_dp_link_desc_setup(struct qwz_softc *sc, paddr = link_desc_banks[i].paddr; while (n_entries && (desc = qwz_hal_srng_src_get_next_entry(sc, srng))) { + cookie = DP_LINK_DESC_COOKIE_SET(n_entries, i); qwz_hal_set_link_desc_addr( - (struct hal_wbm_link_desc *) desc, i, paddr); + (struct hal_wbm_link_desc *)desc, cookie, paddr, + rbm); n_entries--; paddr += HAL_LINK_DESC_SIZE; } @@ -8714,89 +7569,13 @@ qwz_dp_srng_cleanup(struct qwz_softc *sc, struct dp_srng *ring) if (ring->mem == NULL) return; -#if 0 - if (ring->cached) - kfree(ring->vaddr_unaligned); - else -#endif - qwz_dmamem_free(sc->sc_dmat, ring->mem); + qwz_dmamem_free(sc->sc_dmat, ring->mem); ring->mem = NULL; ring->vaddr = NULL; ring->paddr = 0; } -void -qwz_dp_shadow_stop_timer(struct qwz_softc *sc, - struct qwz_hp_update_timer *update_timer) -{ - if (!sc->hw_params.supports_shadow_regs) - return; - - timeout_del(&update_timer->timer); -} - -void -qwz_dp_shadow_start_timer(struct qwz_softc *sc, struct hal_srng *srng, - struct qwz_hp_update_timer *update_timer) -{ -#ifdef notyet - lockdep_assert_held(&srng->lock); -#endif - if (!sc->hw_params.supports_shadow_regs) - return; - - update_timer->tx_num++; - if (update_timer->started) - return; - - update_timer->started = 1; - update_timer->timer_tx_num = update_timer->tx_num; - - timeout_add_msec(&update_timer->timer, update_timer->interval); -} - -void -qwz_dp_shadow_timer_handler(void *arg) -{ - struct qwz_hp_update_timer *update_timer = arg; - struct qwz_softc *sc = update_timer->sc; - struct hal_srng *srng = &sc->hal.srng_list[update_timer->ring_id]; - int s; - -#ifdef notyet - spin_lock_bh(&srng->lock); -#endif - s = splnet(); - - /* - * Update HP if there were no TX operations during the timeout interval, - * and stop the timer. Timer will be restarted if more TX happens. - */ - if (update_timer->timer_tx_num != update_timer->tx_num) { - update_timer->timer_tx_num = update_timer->tx_num; - timeout_add_msec(&update_timer->timer, update_timer->interval); - } else { - update_timer->started = 0; - qwz_hal_srng_shadow_update_hp_tp(sc, srng); - } -#ifdef notyet - spin_unlock_bh(&srng->lock); -#endif - splx(s); -} - -void -qwz_dp_stop_shadow_timers(struct qwz_softc *sc) -{ - int i; - - for (i = 0; i < sc->hw_params.max_tx_ring; i++) - qwz_dp_shadow_stop_timer(sc, &sc->dp.tx_ring_timer[i]); - - qwz_dp_shadow_stop_timer(sc, &sc->dp.reo_cmd_timer); -} - void qwz_dp_srng_common_cleanup(struct qwz_softc *sc) { @@ -8937,24 +7716,6 @@ qwz_hal_tx_set_dscp_tid_map(struct qwz_softc *sc, int id) HAL_TCL1_RING_CMN_CTRL_REG, ctrl_reg_val); } -void -qwz_dp_shadow_init_timer(struct qwz_softc *sc, - struct qwz_hp_update_timer *update_timer, - uint32_t interval, uint32_t ring_id) -{ - if (!sc->hw_params.supports_shadow_regs) - return; - - update_timer->tx_num = 0; - update_timer->timer_tx_num = 0; - update_timer->sc = sc; - update_timer->ring_id = ring_id; - update_timer->interval = interval; - update_timer->init = 1; - timeout_set(&update_timer->timer, qwz_dp_shadow_timer_handler, - update_timer); -} - void qwz_hal_reo_init_cmd_ring(struct qwz_softc *sc, struct hal_srng *srng) { @@ -9422,6 +8183,51 @@ qwz_dp_cmem_init(struct qwz_softc *sc, struct qwz_dp *dp, return 0; } +void +qwz_dp_cc_config(struct qwz_softc *sc) +{ + uint32_t cmem_base = sc->qmi_dev_mem[ATH12K_QMI_DEVMEM_CMEM_INDEX].start; + uint32_t reo_base = HAL_SEQ_WCSS_UMAC_REO_REG; + uint32_t wbm_base = HAL_SEQ_WCSS_UMAC_WBM_REG; + uint32_t val = 0; + + sc->ops.write32(sc, reo_base + HAL_REO1_SW_COOKIE_CFG0(sc), cmem_base); + + val |= FIELD_PREP(HAL_REO1_SW_COOKIE_CFG_CMEM_BASE_ADDR_MSB, ATH12K_CMEM_ADDR_MSB) | + FIELD_PREP(HAL_REO1_SW_COOKIE_CFG_COOKIE_PPT_MSB, ATH12K_CC_PPT_MSB) | + FIELD_PREP(HAL_REO1_SW_COOKIE_CFG_COOKIE_SPT_MSB, ATH12K_CC_SPT_MSB) | + FIELD_PREP(HAL_REO1_SW_COOKIE_CFG_ALIGN, 1) | + FIELD_PREP(HAL_REO1_SW_COOKIE_CFG_ENABLE, 1) | + FIELD_PREP(HAL_REO1_SW_COOKIE_CFG_GLOBAL_ENABLE, 1); + + sc->ops.write32(sc, reo_base + HAL_REO1_SW_COOKIE_CFG1(sc), val); + + /* Enable HW CC for WBM */ + sc->ops.write32(sc, wbm_base + HAL_WBM_SW_COOKIE_CFG0, cmem_base); + + val = FIELD_PREP(HAL_WBM_SW_COOKIE_CFG_CMEM_BASE_ADDR_MSB, ATH12K_CMEM_ADDR_MSB) | + FIELD_PREP(HAL_WBM_SW_COOKIE_CFG_COOKIE_PPT_MSB, ATH12K_CC_PPT_MSB) | + FIELD_PREP(HAL_WBM_SW_COOKIE_CFG_COOKIE_SPT_MSB, ATH12K_CC_SPT_MSB) | + FIELD_PREP(HAL_WBM_SW_COOKIE_CFG_ALIGN, 1); + + sc->ops.write32(sc, wbm_base + HAL_WBM_SW_COOKIE_CFG1, val); + + /* Enable conversion complete indication */ + val = sc->ops.read32(sc, wbm_base + HAL_WBM_SW_COOKIE_CFG2); + val |= FIELD_PREP(HAL_WBM_SW_COOKIE_CFG_RELEASE_PATH_EN, 1) | + FIELD_PREP(HAL_WBM_SW_COOKIE_CFG_ERR_PATH_EN, 1) | + FIELD_PREP(HAL_WBM_SW_COOKIE_CFG_CONV_IND_EN, 1); + + sc->ops.write32(sc, wbm_base + HAL_WBM_SW_COOKIE_CFG2, val); + + /* Enable Cookie conversion for WBM2SW Rings */ + val = sc->ops.read32(sc, wbm_base + HAL_WBM_SW_COOKIE_CONVERT_CFG); + val |= FIELD_PREP(HAL_WBM_SW_COOKIE_CONV_CFG_GLOBAL_EN, 1) | + sc->hw_params.hal_params->wbm2sw_cc_enable; + + sc->ops.write32(sc, wbm_base + HAL_WBM_SW_COOKIE_CONVERT_CFG, val); +} + uint32_t qwz_dp_cc_cookie_gen(uint16_t ppt_idx, uint16_t spt_idx) { return (uint32_t)ppt_idx << ATH12K_CC_PPT_SHIFT | spt_idx; @@ -9522,7 +8328,62 @@ qwz_dp_cc_desc_init(struct qwz_softc *sc) void qwz_dp_cc_cleanup(struct qwz_softc *sc) { - // FIXME + struct qwz_dp *dp = &sc->dp; + struct ath12k_rx_desc_info *rx_descs; + struct ath12k_tx_desc_info *tx_descs; + uint32_t i, j, pool_id, tx_spt_page; + + if (!dp->spt_info) + return; + +#ifdef notyet + spin_lock_bh(&dp->rx_desc_lock); +#endif + + /* First ATH12K_NUM_RX_SPT_PAGES of allocated SPT pages are used for RX */ + for (i = 0; i < ATH12K_NUM_RX_SPT_PAGES; i++) { + rx_descs = dp->spt_info->rxbaddr[i]; + for (j = 0; j < ATH12K_MAX_SPT_ENTRIES; j++) { + if (!rx_descs[j].m) + continue; + bus_dmamap_unload(sc->sc_dmat, rx_descs[j].map); + m_freem(rx_descs[j].m); + rx_descs[j].m = NULL; + } + + free(dp->spt_info->rxbaddr[i], M_DEVBUF, + ATH12K_MAX_SPT_ENTRIES * sizeof(*rx_descs)); + dp->spt_info->rxbaddr[i] = NULL; + } + +#ifdef notyet + spin_unlock_bh(&dp->rx_desc_lock); +#endif + + for (pool_id = 0; pool_id < ATH12K_HW_MAX_QUEUES; pool_id++) { +#ifdef notyet + spin_lock_bh(&dp->tx_desc_lock[pool_id]); +#endif + for (i = 0; i < ATH12K_TX_SPT_PAGES_PER_POOL; i++) { + tx_spt_page = i + pool_id * ATH12K_TX_SPT_PAGES_PER_POOL; + tx_descs = dp->spt_info->txbaddr[tx_spt_page]; + + for (j = 0; j < ATH12K_MAX_SPT_ENTRIES; j++) { + if (!tx_descs[j].m) + continue; + bus_dmamap_unload(sc->sc_dmat, tx_descs[j].map); + m_freem(tx_descs[j].m); + tx_descs[j].m = NULL; + } + + free(dp->spt_info->txbaddr[tx_spt_page], M_DEVBUF, + ATH12K_MAX_SPT_ENTRIES * sizeof(*tx_descs)); + dp->spt_info->txbaddr[tx_spt_page] = NULL; + } +#ifdef notyet + spin_unlock_bh(&dp->tx_desc_lock[pool_id]); +#endif + } } int @@ -9603,36 +8464,55 @@ free: int qwz_dp_init_bank_profiles(struct qwz_softc *sc) { + struct qwz_dp *dp = &sc->dp; + + dp->num_bank_profiles = sc->hw_params.num_tcl_banks; + dp->bank_profiles = mallocarray(dp->num_bank_profiles, + sizeof(struct ath12k_dp_tx_bank_profile), M_DEVBUF, + M_NOWAIT | M_ZERO); + if (!dp->bank_profiles) + return ENOMEM; + return 0; } void qwz_dp_deinit_bank_profiles(struct qwz_softc *sc) { - // FIXME + struct qwz_dp *dp = &sc->dp; + + free(dp->bank_profiles, M_DEVBUF, dp->num_bank_profiles * + sizeof(struct ath12k_dp_tx_bank_profile)); + dp->bank_profiles = NULL; } -int qwz_dp_rxdma_ring_buf_setup(struct qwz_softc *, struct dp_rxdma_ring *, uint32_t); +int qwz_dp_rxdma_mon_ring_buf_setup(struct qwz_softc *, struct dp_rxdma_mon_ring *, uint32_t); +int qwz_dp_rxdma_ring_buf_setup(struct qwz_softc *, struct dp_rxdma_ring *); int qwz_dp_rxdma_buf_setup(struct qwz_softc *sc) { - struct qwz_pdev_dp *dp = &sc->pdev_dp; - struct dp_rxdma_ring *rx_ring; + struct qwz_dp *dp = &sc->dp; int ret; - rx_ring = &dp->rx_refill_buf_ring; - ret = qwz_dp_rxdma_ring_buf_setup(sc, rx_ring, HAL_RXDMA_BUF); + ret = qwz_dp_rxdma_ring_buf_setup(sc, &dp->rx_refill_buf_ring); if (ret) return ret; + if (sc->hw_params.rxdma1_enable) { + ret = qwz_dp_rxdma_mon_ring_buf_setup(sc, + &dp->rxdma_mon_buf_ring, HAL_RXDMA_MONITOR_BUF); + if (ret) + return ret; + } + return 0; } int qwz_dp_rx_alloc(struct qwz_softc *sc) { - struct qwz_pdev_dp *dp = &sc->pdev_dp; + struct qwz_dp *dp = &sc->dp; int i, ret; #if notyet @@ -9644,7 +8524,7 @@ qwz_dp_rx_alloc(struct qwz_softc *sc) #endif ret = qwz_dp_srng_setup(sc, &dp->rx_refill_buf_ring.refill_buf_ring, - HAL_RXDMA_BUF, 0, dp->mac_id, DP_RXDMA_BUF_RING_SIZE); + HAL_RXDMA_BUF, 0, 0, DP_RXDMA_BUF_RING_SIZE); if (ret) { printf("%s: failed to setup rx_refill_buf_ring\n", sc->sc_dev.dv_xname); @@ -9654,7 +8534,7 @@ qwz_dp_rx_alloc(struct qwz_softc *sc) if (sc->hw_params.rx_mac_buf_ring) { for (i = 0; i < sc->hw_params.num_rxmda_per_pdev; i++) { ret = qwz_dp_srng_setup(sc, &dp->rx_mac_buf_ring[i], - HAL_RXDMA_BUF, 1, dp->mac_id + i, 2048); + HAL_RXDMA_BUF, 1, i, 2048); if (ret) { printf("%s: failed to setup " "rx_mac_buf_ring %d\n", @@ -9666,16 +8546,25 @@ qwz_dp_rx_alloc(struct qwz_softc *sc) for (i = 0; i < sc->hw_params.num_rxdma_dst_ring; i++) { ret = qwz_dp_srng_setup(sc, &dp->rxdma_err_dst_ring[i], - HAL_RXDMA_BUF, 0, dp->mac_id + i, - DP_RXDMA_ERR_DST_RING_SIZE); + HAL_RXDMA_BUF, 0, i, DP_RXDMA_ERR_DST_RING_SIZE); if (ret) { printf("%s: failed to setup " - "rxdma_err_dst_Ring %d\n", + "rxdma_err_dst_ring %d\n", sc->sc_dev.dv_xname, i); return ret; } } + if (sc->hw_params.rxdma1_enable) { + ret = qwz_dp_srng_setup(sc, &dp->rxdma_mon_buf_ring.refill_buf_ring, + HAL_RXDMA_MONITOR_BUF, 0, 0, DP_RXDMA_BUF_RING_SIZE); + if (ret) { + printf("%s: failed to setup HAL_RXDMA_MONITOR_BUF\n", + sc->sc_dev.dv_xname); + return ret; + } + } + ret = qwz_dp_rxdma_buf_setup(sc); if (ret) { printf("%s: failed to setup rxdma ring\n", @@ -9692,6 +8581,43 @@ qwz_dp_rx_free(struct qwz_softc *sc) /* FIXME */ } +int +qwz_dp_reoq_lut_setup(struct qwz_softc *sc) +{ + if (!sc->hw_params.reoq_lut_support) + return 0; + + printf("%s:%d\n", __func__, __LINE__); + return EINVAL; +} + +void +qwz_dp_reoq_lut_cleanup(struct qwz_softc *sc) +{ + if (!sc->hw_params.reoq_lut_support) + return; + + printf("%s:%d\n", __func__, __LINE__); + return; +} + +enum hal_rx_buf_return_buf_manager +qwz_dp_get_idle_link_rbm(struct qwz_softc *sc) +{ + switch (sc->device_id) { + case 0: + return HAL_RX_BUF_RBM_WBM_DEV0_IDLE_DESC_LIST; + case 1: + return HAL_RX_BUF_RBM_WBM_DEV1_IDLE_DESC_LIST; + case 2: + return HAL_RX_BUF_RBM_WBM_DEV2_IDLE_DESC_LIST; + default: + printf("%s: invalid %d device id, so choose default rbm\n", + __func__, sc->device_id); + return HAL_RX_BUF_RBM_WBM_DEV0_IDLE_DESC_LIST; + } +} + int qwz_dp_alloc(struct qwz_softc *sc) { @@ -9712,6 +8638,7 @@ qwz_dp_alloc(struct qwz_softc *sc) #endif dp->reo_cmd_cache_flush_count = 0; + dp->idle_link_rbm = qwz_dp_get_idle_link_rbm(sc); ret = qwz_wbm_idle_ring_setup(sc, &n_link_desc); if (ret) { @@ -9744,6 +8671,10 @@ qwz_dp_alloc(struct qwz_softc *sc) size = sizeof(struct hal_wbm_release_ring) * DP_TX_COMP_RING_SIZE; + ret = qwz_dp_reoq_lut_setup(sc); + if (ret) + goto fail_cmn_srng_cleanup; + for (i = 0; i < sc->hw_params.max_tx_ring; i++) { #if 0 idr_init(&dp->tx_ring[i].txbuf_idr); @@ -9751,7 +8682,7 @@ qwz_dp_alloc(struct qwz_softc *sc) #endif ret = qwz_dp_tx_ring_alloc_tx_data(sc, &dp->tx_ring[i]); if (ret) - goto fail_cmn_srng_cleanup; + goto fail_cmn_reoq_cleanup; dp->tx_ring[i].cur = 0; dp->tx_ring[i].queued = 0; @@ -9762,7 +8693,7 @@ qwz_dp_alloc(struct qwz_softc *sc) M_NOWAIT | M_ZERO); if (!dp->tx_ring[i].tx_status) { ret = ENOMEM; - goto fail_cmn_srng_cleanup; + goto fail_cmn_reoq_cleanup; } } @@ -9778,6 +8709,8 @@ qwz_dp_alloc(struct qwz_softc *sc) return 0; fail_dp_rx_free: qwz_dp_rx_free(sc); +fail_cmn_reoq_cleanup: + qwz_dp_reoq_lut_cleanup(sc); fail_cmn_srng_cleanup: qwz_dp_srng_common_cleanup(sc); fail_dp_bank_profiles_cleanup: @@ -9842,7 +8775,10 @@ qwz_dp_free(struct qwz_softc *sc) qwz_dp_link_desc_cleanup(sc, dp->link_desc_banks, HAL_WBM_IDLE_LINK, &dp->wbm_idle_ring); + qwz_dp_cc_cleanup(sc); + qwz_dp_reoq_lut_cleanup(sc); qwz_dp_srng_common_cleanup(sc); + qwz_dp_deinit_bank_profiles(sc); qwz_dp_reo_cmd_list_cleanup(sc); for (i = 0; i < sc->hw_params.max_tx_ring; i++) { #if 0 @@ -10077,8 +9013,6 @@ qwz_wmi_pdev_attach(struct qwz_softc *sc, uint8_t pdev_id) wmi_handle = &sc->wmi.wmi[pdev_id]; wmi_handle->wmi = &sc->wmi; - wmi_handle->tx_ce_desc = 1; - return 0; } @@ -10102,8 +9036,7 @@ qwz_wmi_attach(struct qwz_softc *sc) sc->wmi.tx_credits = 1; /* It's overwritten when service_ext_ready is handled */ - if (sc->hw_params.single_pdev_only && - sc->hw_params.num_rxmda_per_pdev > 1) + if (sc->hw_params.single_pdev_only) sc->wmi.preferred_hw_mode = WMI_HOST_HW_MODE_SINGLE; return 0; @@ -10112,30 +9045,7 @@ qwz_wmi_attach(struct qwz_softc *sc) void qwz_wmi_htc_tx_complete(struct qwz_softc *sc, struct mbuf *m) { - struct qwz_pdev_wmi *wmi = NULL; - uint32_t i; - uint8_t wmi_ep_count; - uint8_t eid; - - eid = (uintptr_t)m->m_pkthdr.ph_cookie; m_freem(m); - - if (eid >= ATH12K_HTC_EP_COUNT) - return; - - wmi_ep_count = sc->htc.wmi_ep_count; - if (wmi_ep_count > sc->hw_params.max_radios) - return; - - for (i = 0; i < sc->htc.wmi_ep_count; i++) { - if (sc->wmi.wmi[i].eid == eid) { - wmi = &sc->wmi.wmi[i]; - break; - } - } - - if (wmi) - wakeup(&wmi->tx_ce_desc); } int @@ -10590,7 +9500,9 @@ qwz_wmi_tlv_ext_soc_hal_reg_caps_parse(struct qwz_softc *sc, uint16_t len, sc->num_radios++; - /* For QCA6390, save mac_phy capability in the same pdev */ + /* For single_pdev_only targets, + * save mac_phy capability in the same pdev + */ if (sc->hw_params.single_pdev_only) pdev_index = 0; else @@ -10600,10 +9512,6 @@ qwz_wmi_tlv_ext_soc_hal_reg_caps_parse(struct qwz_softc *sc, uint16_t len, phy_id_map >>= 1; } - /* For QCA6390, set num_radios to 1 because host manages - * both 2G and 5G radio in one pdev. - * Set pdev_id = 0 and 0 means soc level. - */ if (sc->hw_params.single_pdev_only) { sc->num_radios = 1; sc->pdevs[0].pdev_id = 0; @@ -12824,9 +11732,6 @@ qwz_wmi_op_ep_tx_credits(struct qwz_softc *sc) sc->wmi.tx_credits = 1; wakeup(&sc->wmi.tx_credits); - if (!sc->hw_params.credit_flow) - return; - for (i = ATH12K_HTC_EP_0; i < ATH12K_HTC_EP_COUNT; i++) { struct qwz_htc_ep *ep = &htc->endpoint[i]; if (ep->tx_credit_flow_enabled && ep->tx_credits > 0) @@ -12865,7 +11770,6 @@ qwz_connect_pdev_htc_service(struct qwz_softc *sc, uint32_t pdev_idx) sc->wmi.wmi_endpoint_id[pdev_idx] = conn_resp.eid; sc->wmi.wmi[pdev_idx].eid = conn_resp.eid; sc->wmi.max_msg_len[pdev_idx] = conn_resp.max_msg_len; - sc->wmi.wmi[pdev_idx].tx_ce_desc = 0; return 0; } @@ -13043,15 +11947,13 @@ qwz_htc_send(struct qwz_htc *htc, enum ath12k_htc_ep_id eid, struct mbuf *m) struct qwz_tx_data *tx_data; int credits = 0; int ret; - int credit_flow_enabled = (sc->hw_params.credit_flow && - ep->tx_credit_flow_enabled); if (eid >= ATH12K_HTC_EP_COUNT) { printf("%s: Invalid endpoint id: %d\n", __func__, eid); return ENOENT; } - if (credit_flow_enabled) { + if (ep->tx_credit_flow_enabled) { credits = howmany(m->m_pkthdr.len, htc->target_credit_size); #ifdef notyet spin_lock_bh(&htc->tx_lock); @@ -13114,7 +12016,7 @@ qwz_htc_send(struct qwz_htc *htc, enum ath12k_htc_ep_id eid, struct mbuf *m) err_unmap: bus_dmamap_unload(sc->sc_dmat, tx_data->map); err_credits: - if (credit_flow_enabled) { + if (ep->tx_credit_flow_enabled) { #ifdef notyet spin_lock_bh(&htc->tx_lock); #endif @@ -13192,11 +12094,6 @@ qwz_htc_connect_service(struct qwz_htc *htc, disable_credit_flow_ctrl = 1; } - if (!sc->hw_params.credit_flow) { - flags |= ATH12K_HTC_CONN_FLAGS_DISABLE_CREDIT_FLOW_CTRL; - disable_credit_flow_ctrl = 1; - } - req_msg->flags_len = FIELD_PREP(HTC_SVC_MSG_CONNECTIONFLAGS, flags); req_msg->msg_svc_id |= FIELD_PREP(HTC_SVC_MSG_SERVICE_ID, conn_req->service_id); @@ -13308,7 +12205,6 @@ qwz_htc_start(struct qwz_htc *htc) { struct mbuf *m; int status = 0; - struct qwz_softc *sc = htc->sc; struct ath12k_htc_setup_complete_extended *msg; m = qwz_htc_build_tx_ctrl_mbuf(); @@ -13323,11 +12219,8 @@ qwz_htc_start(struct qwz_htc *htc) msg->msg_id = FIELD_PREP(HTC_MSG_MESSAGEID, ATH12K_HTC_MSG_SETUP_COMPLETE_EX_ID); - if (sc->hw_params.credit_flow) - DNPRINTF(QWZ_D_HTC, "%s: using tx credit flow control\n", - __func__); - else - msg->flags |= ATH12K_GLOBAL_DISABLE_CREDIT_FLOW; + DNPRINTF(QWZ_D_HTC, "%s: using tx credit flow control\n", + __func__); status = qwz_htc_send(htc, ATH12K_HTC_EP_0, m); if (status) { @@ -13734,18 +12627,8 @@ qwz_dp_rx_pdev_srng_free(struct qwz_softc *sc, int mac_id) struct qwz_pdev_dp *dp = &sc->pdev_dp; int i; - qwz_dp_srng_cleanup(sc, &dp->rx_refill_buf_ring.refill_buf_ring); - - for (i = 0; i < sc->hw_params.num_rxmda_per_pdev; i++) { - if (sc->hw_params.rx_mac_buf_ring) - qwz_dp_srng_cleanup(sc, &dp->rx_mac_buf_ring[i]); - - qwz_dp_srng_cleanup(sc, &dp->rxdma_err_dst_ring[i]); - qwz_dp_srng_cleanup(sc, - &dp->rx_mon_status_refill_ring[i].refill_buf_ring); - } - - qwz_dp_srng_cleanup(sc, &dp->rxdma_mon_buf_ring.refill_buf_ring); + for (i = 0; i < sc->hw_params.num_rxmda_per_pdev; i++) + qwz_dp_srng_cleanup(sc, &dp->rxdma_mon_dst_ring[i]); } int @@ -13793,7 +12676,7 @@ qwz_dp_rx_pdev_srng_alloc(struct qwz_softc *sc) /* if rxdma1_enable is false, then it doesn't need * to setup rxdam_mon_buf_ring, rxdma_mon_dst_ring * and rxdma_mon_desc_ring. - * init reap timer for QCA6390. + * init reap timer for WCN7850. */ if (!sc->hw_params.rxdma1_enable) { timeout_set(&sc->mon_reap_timer, qwz_dp_service_mon_ring, sc); @@ -13832,7 +12715,8 @@ qwz_dp_rx_pdev_srng_alloc(struct qwz_softc *sc) } void -qwz_dp_rxdma_buf_ring_free(struct qwz_softc *sc, struct dp_rxdma_ring *rx_ring) +qwz_dp_rxdma_mon_buf_ring_free(struct qwz_softc *sc, + struct dp_rxdma_mon_ring *rx_ring) { int i; @@ -13859,24 +12743,6 @@ qwz_dp_rxdma_buf_ring_free(struct qwz_softc *sc, struct dp_rxdma_ring *rx_ring) memset(rx_ring->freemap, 0xff, sizeof(rx_ring->freemap)); } -void -qwz_dp_rxdma_pdev_buf_free(struct qwz_softc *sc, int mac_id) -{ - struct qwz_pdev_dp *dp = &sc->pdev_dp; - struct dp_rxdma_ring *rx_ring = &dp->rx_refill_buf_ring; - int i; - - qwz_dp_rxdma_buf_ring_free(sc, rx_ring); - - rx_ring = &dp->rxdma_mon_buf_ring; - qwz_dp_rxdma_buf_ring_free(sc, rx_ring); - - for (i = 0; i < sc->hw_params.num_rxmda_per_pdev; i++) { - rx_ring = &dp->rx_mon_status_refill_ring[i]; - qwz_dp_rxdma_buf_ring_free(sc, rx_ring); - } -} - void qwz_hal_rx_buf_addr_info_set(void *desc, uint64_t paddr, uint32_t cookie, uint8_t manager) @@ -13906,7 +12772,7 @@ qwz_hal_rx_buf_addr_info_get(void *desc, uint64_t *paddr, uint32_t *cookie, } int -qwz_next_free_rxbuf_idx(struct dp_rxdma_ring *rx_ring) +qwz_next_free_rxbuf_idx(struct dp_rxdma_mon_ring *rx_ring) { int i, idx; @@ -13920,36 +12786,23 @@ qwz_next_free_rxbuf_idx(struct dp_rxdma_ring *rx_ring) } int -qwz_dp_rxbufs_replenish(struct qwz_softc *sc, int mac_id, - struct dp_rxdma_ring *rx_ring, int req_entries, - enum hal_rx_buf_return_buf_manager mgr) +qwz_dp_mon_buf_replenish(struct qwz_softc *sc, + struct dp_rxdma_mon_ring *buf_ring, int req_entries) { struct hal_srng *srng; - uint32_t *desc; + struct hal_mon_buf_ring *mon_buf; struct mbuf *m; - int num_free; - int num_remain; int ret, idx; - uint32_t cookie; uint64_t paddr; struct qwz_rx_data *rx_data; - req_entries = MIN(req_entries, rx_ring->bufs_max); - - srng = &sc->hal.srng_list[rx_ring->refill_buf_ring.ring_id]; + srng = &sc->hal.srng_list[buf_ring->refill_buf_ring.ring_id]; #ifdef notyet spin_lock_bh(&srng->lock); #endif qwz_hal_srng_access_begin(sc, srng); - num_free = qwz_hal_srng_src_num_free(sc, srng, 1); - if (!req_entries && (num_free > (rx_ring->bufs_max * 3) / 4)) - req_entries = num_free; - - req_entries = MIN(num_free, req_entries); - num_remain = req_entries; - - while (num_remain > 0) { + while (req_entries > 0) { const size_t size = DP_RX_BUFFER_SIZE; m = m_gethdr(M_DONTWAIT, MT_DATA); @@ -13965,11 +12818,11 @@ qwz_dp_rxbufs_replenish(struct qwz_softc *sc, int mac_id, m->m_len = m->m_pkthdr.len = size; - idx = qwz_next_free_rxbuf_idx(rx_ring); + idx = qwz_next_free_rxbuf_idx(buf_ring); if (idx == -1) goto fail_free_mbuf; - rx_data = &rx_ring->rx_data[idx]; + rx_data = &buf_ring->rx_data[idx]; if (rx_data->map == NULL) { ret = bus_dmamap_create(sc->sc_dmat, size, 1, size, 0, BUS_DMA_NOWAIT, &rx_data->map); @@ -13985,21 +12838,20 @@ qwz_dp_rxbufs_replenish(struct qwz_softc *sc, int mac_id, goto fail_free_mbuf; } - desc = qwz_hal_srng_src_get_next_entry(sc, srng); - if (!desc) + mon_buf = qwz_hal_srng_src_get_next_entry(sc, srng); + if (!mon_buf) goto fail_dma_unmap; rx_data->m = m; m = NULL; - cookie = FIELD_PREP(DP_RXDMA_BUF_COOKIE_PDEV_ID, mac_id) | - FIELD_PREP(DP_RXDMA_BUF_COOKIE_BUF_ID, idx); - - clrbit(rx_ring->freemap, idx); - num_remain--; + clrbit(buf_ring->freemap, idx); + req_entries--; paddr = rx_data->map->dm_segs[0].ds_addr; - qwz_hal_rx_buf_addr_info_set(desc, paddr, cookie, mgr); + mon_buf->paddr_lo = htole32(paddr); + mon_buf->paddr_hi = htole32(paddr >> 32); + mon_buf->cookie = FIELD_PREP(DP_RXDMA_BUF_COOKIE_BUF_ID, idx); } qwz_hal_srng_access_end(sc, srng); @@ -14021,10 +12873,130 @@ fail_free_mbuf: } int -qwz_dp_rxdma_ring_buf_setup(struct qwz_softc *sc, - struct dp_rxdma_ring *rx_ring, uint32_t ringtype) +qwz_dp_rxbufs_replenish(struct qwz_softc *sc, + struct dp_rxdma_ring *rx_ring, void *list, + int req_entries) +{ + struct qwz_dp *dp = &sc->dp; + TAILQ_HEAD(, ath12k_rx_desc_info) *used_list = list; + struct hal_srng *srng; + uint32_t *desc; + struct mbuf *m; + int num_free; + int num_remain; + int num_cut; + int ret, i; + uint32_t cookie; + uint64_t paddr; + struct ath12k_rx_desc_info *rx_desc; + enum hal_rx_buf_return_buf_manager mgr = sc->hw_params.hal_params->rx_buf_rbm; + + req_entries = MIN(req_entries, rx_ring->bufs_max); + + srng = &sc->hal.srng_list[rx_ring->refill_buf_ring.ring_id]; +#ifdef notyet + spin_lock_bh(&srng->lock); +#endif + qwz_hal_srng_access_begin(sc, srng); + + num_free = qwz_hal_srng_src_num_free(sc, srng, 1); + if (!req_entries && (num_free > (rx_ring->bufs_max * 3) / 4)) + req_entries = num_free; + + req_entries = MIN(num_free, req_entries); + num_remain = req_entries; + + if (!num_remain) { + qwz_hal_srng_access_end(sc, srng); +#ifdef notyet + spin_unlock_bh(&srng->lock); +#endif + return 0; + } + + for (i = 0, num_cut = 0; i < num_remain; i++) { + if (TAILQ_EMPTY(&dp->rx_desc_free_list)) + break; + rx_desc = TAILQ_FIRST(&dp->rx_desc_free_list); + TAILQ_REMOVE(&dp->rx_desc_free_list, rx_desc, entry); + TAILQ_INSERT_TAIL(used_list, rx_desc, entry); + num_cut++; + } + + while (num_remain > 0) { + const size_t size = DP_RX_BUFFER_SIZE; + + m = m_gethdr(M_DONTWAIT, MT_DATA); + if (m == NULL) + goto fail_free_mbuf; + + if (size <= MCLBYTES) + MCLGET(m, M_DONTWAIT); + else + MCLGETL(m, M_DONTWAIT, size); + if ((m->m_flags & M_EXT) == 0) + goto fail_free_mbuf; + + m->m_len = m->m_pkthdr.len = size; + + rx_desc = TAILQ_FIRST(used_list); + if (rx_desc == NULL) + goto fail_free_mbuf; + + if (rx_desc->map == NULL) { + ret = bus_dmamap_create(sc->sc_dmat, size, 1, + size, 0, BUS_DMA_NOWAIT, &rx_desc->map); + if (ret) + goto fail_free_mbuf; + } + + ret = bus_dmamap_load_mbuf(sc->sc_dmat, rx_desc->map, m, + BUS_DMA_READ | BUS_DMA_NOWAIT); + if (ret) { + printf("%s: can't map mbuf (error %d)\n", + sc->sc_dev.dv_xname, ret); + goto fail_free_mbuf; + } + + cookie = rx_desc->cookie; + + desc = qwz_hal_srng_src_get_next_entry(sc, srng); + if (!desc) + goto fail_dma_unmap; + + TAILQ_REMOVE(used_list, rx_desc, entry); + + rx_desc->m = m; + m = NULL; + + num_remain--; + + paddr = rx_desc->map->dm_segs[0].ds_addr; + qwz_hal_rx_buf_addr_info_set(desc, paddr, cookie, mgr); + } + + qwz_hal_srng_access_end(sc, srng); +#ifdef notyet + spin_unlock_bh(&srng->lock); +#endif + return 0; + +fail_dma_unmap: + bus_dmamap_unload(sc->sc_dmat, rx_desc->map); +fail_free_mbuf: + m_free(m); + + qwz_hal_srng_access_end(sc, srng); +#ifdef notyet + spin_unlock_bh(&srng->lock); +#endif + return ENOBUFS; +} + +int +qwz_dp_rxdma_mon_ring_buf_setup(struct qwz_softc *sc, + struct dp_rxdma_mon_ring *rx_ring, uint32_t ringtype) { - struct qwz_pdev_dp *dp = &sc->pdev_dp; int num_entries; num_entries = rx_ring->refill_buf_ring.size / @@ -14038,42 +13010,24 @@ qwz_dp_rxdma_ring_buf_setup(struct qwz_softc *sc, rx_ring->bufs_max = num_entries; memset(rx_ring->freemap, 0xff, sizeof(rx_ring->freemap)); + qwz_dp_mon_buf_replenish(sc, rx_ring, num_entries); - return qwz_dp_rxbufs_replenish(sc, dp->mac_id, rx_ring, num_entries, - sc->hw_params.hal_params->rx_buf_rbm); + return 0; } int -qwz_dp_rxdma_pdev_buf_setup(struct qwz_softc *sc) +qwz_dp_rxdma_ring_buf_setup(struct qwz_softc *sc, + struct dp_rxdma_ring *rx_ring) { - struct qwz_pdev_dp *dp = &sc->pdev_dp; - struct dp_rxdma_ring *rx_ring; - int ret; -#if 0 - int i; -#endif + TAILQ_HEAD(, ath12k_rx_desc_info) list; + int num_entries; - rx_ring = &dp->rx_refill_buf_ring; - ret = qwz_dp_rxdma_ring_buf_setup(sc, rx_ring, HAL_RXDMA_BUF); - if (ret) - return ret; + TAILQ_INIT(&list); + num_entries = rx_ring->refill_buf_ring.size / + qwz_hal_srng_get_entrysize(sc, HAL_RXDMA_BUF); + + qwz_dp_rxbufs_replenish(sc, rx_ring, &list, 0); - if (sc->hw_params.rxdma1_enable) { - rx_ring = &dp->rxdma_mon_buf_ring; - ret = qwz_dp_rxdma_ring_buf_setup(sc, rx_ring, - HAL_RXDMA_MONITOR_BUF); - if (ret) - return ret; - } -#if 0 - for (i = 0; i < sc->hw_params.num_rxmda_per_pdev; i++) { - rx_ring = &dp->rx_mon_status_refill_ring[i]; - ret = qwz_dp_rxdma_ring_buf_setup(sc, rx_ring, - HAL_RXDMA_MONITOR_STATUS); - if (ret) - return ret; - } -#endif return 0; } @@ -14081,7 +13035,6 @@ void qwz_dp_rx_pdev_free(struct qwz_softc *sc, int mac_id) { qwz_dp_rx_pdev_srng_free(sc, mac_id); - qwz_dp_rxdma_pdev_buf_free(sc, mac_id); } bus_addr_t @@ -14125,7 +13078,7 @@ qwz_dp_tx_get_ring_id_type(struct qwz_softc *sc, int mac_id, uint32_t ring_id, { switch (ring_type) { case HAL_RXDMA_BUF: - /* for QCA6390, host fills rx buffer to fw and fw fills to + /* for WCN7850, host fills rx buffer to fw and fw fills to * rxbuf ring for each rxdma */ if (!sc->hw_params.rx_mac_buf_ring) { @@ -14393,6 +13346,9 @@ qwz_dp_rx_pdev_alloc(struct qwz_softc *sc, int mac_id) int i; int ret; + if (!sc->hw_params.rxdma1_enable) + return 0; + ret = qwz_dp_rx_pdev_srng_alloc(sc); if (ret) { printf("%s: failed to setup rx srngs: %d\n", @@ -14400,77 +13356,18 @@ qwz_dp_rx_pdev_alloc(struct qwz_softc *sc, int mac_id) return ret; } -#if 0 - ret = qwz_dp_rxdma_pdev_buf_setup(sc); - if (ret) { - printf("%s: failed to setup rxdma ring: %d\n", - sc->sc_dev.dv_xname, ret); - return ret; - } -#endif - - ring_id = dp->rx_refill_buf_ring.refill_buf_ring.ring_id; - ret = qwz_dp_tx_htt_srng_setup(sc, ring_id, mac_id, HAL_RXDMA_BUF); - if (ret) { - printf("%s: failed to configure rx_refill_buf_ring: %d\n", - sc->sc_dev.dv_xname, ret); - return ret; - } - for (i = 0; i < sc->hw_params.num_rxmda_per_pdev; i++) { - ring_id = dp->rxdma_err_dst_ring[i].ring_id; + ring_id = dp->rxdma_mon_dst_ring[i].ring_id; ret = qwz_dp_tx_htt_srng_setup(sc, ring_id, mac_id + i, - HAL_RXDMA_DST); + HAL_RXDMA_MONITOR_DST); if (ret) { printf("%s: failed to configure " - "rxdma_err_dest_ring%d %d\n", + "rxdma_mon_dst_ring %d %d\n", sc->sc_dev.dv_xname, i, ret); return ret; } } - if (!sc->hw_params.rxdma1_enable) - goto config_refill_ring; -#if 0 - ring_id = dp->rxdma_mon_buf_ring.refill_buf_ring.ring_id; - ret = ath12k_dp_tx_htt_srng_setup(ab, ring_id, - mac_id, HAL_RXDMA_MONITOR_BUF); - if (ret) { - ath12k_warn(ab, "failed to configure rxdma_mon_buf_ring %d\n", - ret); - return ret; - } - ret = ath12k_dp_tx_htt_srng_setup(ab, - dp->rxdma_mon_dst_ring.ring_id, - mac_id, HAL_RXDMA_MONITOR_DST); - if (ret) { - ath12k_warn(ab, "failed to configure rxdma_mon_dst_ring %d\n", - ret); - return ret; - } - ret = ath12k_dp_tx_htt_srng_setup(ab, - dp->rxdma_mon_desc_ring.ring_id, - mac_id, HAL_RXDMA_MONITOR_DESC); - if (ret) { - ath12k_warn(ab, "failed to configure rxdma_mon_dst_ring %d\n", - ret); - return ret; - } -#endif -config_refill_ring: -#if 0 - for (i = 0; i < sc->hw_params.num_rxmda_per_pdev; i++) { - ret = qwz_dp_tx_htt_srng_setup(sc, - dp->rx_mon_status_refill_ring[i].refill_buf_ring.ring_id, - mac_id + i, HAL_RXDMA_MONITOR_STATUS); - if (ret) { - printf("%s: failed to configure " - "mon_status_refill_ring%d %d\n", - sc->sc_dev.dv_xname, i, ret); - return ret; - } - } -#endif return 0; } @@ -15026,13 +13923,14 @@ qwz_dp_rx_frag_h_mpdu(struct qwz_softc *sc, struct mbuf *m, static inline uint16_t qwz_dp_rx_h_msdu_start_msdu_len(struct qwz_softc *sc, struct hal_rx_desc *desc) { - return sc->hw_params.hw_ops->rx_desc_get_msdu_len(desc); + return sc->hal_rx_ops->rx_desc_get_msdu_len(desc); } void qwz_dp_process_rx_err_buf(struct qwz_softc *sc, uint32_t *ring_desc, int buf_id, int drop) { +#if 0 struct qwz_pdev_dp *dp = &sc->pdev_dp; struct dp_rxdma_ring *rx_ring = &dp->rx_refill_buf_ring; struct mbuf *m; @@ -15076,11 +13974,14 @@ qwz_dp_process_rx_err_buf(struct qwz_softc *sc, uint32_t *ring_desc, } m_freem(m); +#endif + printf("%s:%d\n", __func__, __LINE__); } int qwz_dp_process_rx_err(struct qwz_softc *sc) { +#if 0 struct ieee80211com *ic = &sc->sc_ic; struct ifnet *ifp = &ic->ic_if; uint32_t msdu_cookies[HAL_NUM_RX_MSDUS_PER_LINK_DESC]; @@ -15128,7 +14029,7 @@ qwz_dp_process_rx_err(struct qwz_softc *sc) (paddr - link_desc_banks[desc_bank].paddr); qwz_hal_rx_msdu_link_info_get(link_desc_va, &num_msdus, msdu_cookies, &rbm); - if (rbm != HAL_RX_BUF_RBM_WBM_CHIP0_IDLE_DESC_LIST && + if (rbm != HAL_RX_BUF_RBM_WBM_DEV0_IDLE_DESC_LIST && rbm != HAL_RX_BUF_RBM_SW3_BM) { #if 0 ab->soc_stats.invalid_rbm++; @@ -15183,6 +14084,9 @@ qwz_dp_process_rx_err(struct qwz_softc *sc) ifp->if_ierrors += tot_n_bufs_reaped; return tot_n_bufs_reaped; +#endif + printf("%s:%d\n", __func__, __LINE__); + return 0; } int @@ -15329,6 +14233,7 @@ qwz_dp_rx_wbm_err(struct qwz_softc *sc, struct qwz_rx_msdu *msdu, int qwz_dp_rx_process_wbm_err(struct qwz_softc *sc) { +#if 0 struct ieee80211com *ic = &sc->sc_ic; struct ifnet *ifp = &ic->ic_if; struct qwz_dp *dp = &sc->dp; @@ -15428,6 +14333,9 @@ done: ifp->if_ierrors += total_num_buffs_reaped; return total_num_buffs_reaped; +#endif + printf("%s:%d\n", __func__, __LINE__); + return 0; } struct qwz_rx_msdu * @@ -15447,87 +14355,47 @@ qwz_dp_rx_get_msdu_last_buf(struct qwz_rx_msdu_list *msdu_list, return NULL; } -static inline void * -qwz_dp_rx_get_attention(struct qwz_softc *sc, struct hal_rx_desc *desc) +int +qwz_dp_rx_h_msdu_end_first_msdu(struct qwz_softc *sc, struct hal_rx_desc *desc) { - return sc->hw_params.hw_ops->rx_desc_get_attention(desc); + return sc->hal_rx_ops->rx_desc_get_first_msdu(desc); } int -qwz_dp_rx_h_attn_is_mcbc(struct qwz_softc *sc, struct hal_rx_desc *desc) +qwz_dp_rx_h_is_da_mcbc(struct qwz_softc *sc, struct hal_rx_desc *desc) { - struct rx_attention *attn = qwz_dp_rx_get_attention(sc, desc); - return qwz_dp_rx_h_msdu_end_first_msdu(sc, desc) && - (!!FIELD_GET(RX_ATTENTION_INFO1_MCAST_BCAST, - le32toh(attn->info1))); + sc->hal_rx_ops->rx_desc_is_da_mcbc(desc); } static inline uint8_t qwz_dp_rx_h_msdu_end_l3pad(struct qwz_softc *sc, struct hal_rx_desc *desc) { - return sc->hw_params.hw_ops->rx_desc_get_l3_pad_bytes(desc); + return sc->hal_rx_ops->rx_desc_get_l3_pad_bytes(desc); } static inline int -qwz_dp_rx_h_attn_msdu_done(struct rx_attention *attn) +qwz_dp_rx_h_msdu_done(struct qwz_softc *sc, struct hal_rx_desc *desc) { - return !!FIELD_GET(RX_ATTENTION_INFO2_MSDU_DONE, le32toh(attn->info2)); + return sc->hal_rx_ops->dp_rx_h_msdu_done(desc); } static inline uint32_t qwz_dp_rx_h_msdu_start_freq(struct qwz_softc *sc, struct hal_rx_desc *desc) { - return sc->hw_params.hw_ops->rx_desc_get_msdu_freq(desc); + return sc->hal_rx_ops->rx_desc_get_msdu_freq(desc); +} + +int +qwz_dp_rx_h_is_decrypted(struct qwz_softc *sc, struct hal_rx_desc *desc) +{ + return sc->hal_rx_ops->dp_rx_h_is_decrypted(desc); } uint32_t -qwz_dp_rx_h_attn_mpdu_err(struct rx_attention *attn) +qwz_dp_rx_h_h_mpdu_err(struct qwz_softc *sc, struct hal_rx_desc *desc) { - uint32_t info = le32toh(attn->info1); - uint32_t errmap = 0; - - if (info & RX_ATTENTION_INFO1_FCS_ERR) - errmap |= DP_RX_MPDU_ERR_FCS; - - if (info & RX_ATTENTION_INFO1_DECRYPT_ERR) - errmap |= DP_RX_MPDU_ERR_DECRYPT; - - if (info & RX_ATTENTION_INFO1_TKIP_MIC_ERR) - errmap |= DP_RX_MPDU_ERR_TKIP_MIC; - - if (info & RX_ATTENTION_INFO1_A_MSDU_ERROR) - errmap |= DP_RX_MPDU_ERR_AMSDU_ERR; - - if (info & RX_ATTENTION_INFO1_OVERFLOW_ERR) - errmap |= DP_RX_MPDU_ERR_OVERFLOW; - - if (info & RX_ATTENTION_INFO1_MSDU_LEN_ERR) - errmap |= DP_RX_MPDU_ERR_MSDU_LEN; - - if (info & RX_ATTENTION_INFO1_MPDU_LEN_ERR) - errmap |= DP_RX_MPDU_ERR_MPDU_LEN; - - return errmap; -} - -int -qwz_dp_rx_h_attn_msdu_len_err(struct qwz_softc *sc, struct hal_rx_desc *desc) -{ - struct rx_attention *rx_attention; - uint32_t errmap; - - rx_attention = qwz_dp_rx_get_attention(sc, desc); - errmap = qwz_dp_rx_h_attn_mpdu_err(rx_attention); - - return errmap & DP_RX_MPDU_ERR_MSDU_LEN; -} - -int -qwz_dp_rx_h_attn_is_decrypted(struct rx_attention *attn) -{ - return (FIELD_GET(RX_ATTENTION_INFO2_DCRYPT_STATUS_CODE, - le32toh(attn->info2)) == RX_DESC_DECRYPT_STATUS_CODE_OK); + return sc->hal_rx_ops->dp_rx_h_mpdu_err(desc); } int @@ -15635,22 +14503,22 @@ qwz_dp_rx_h_undecap_raw(struct qwz_softc *sc, struct qwz_rx_msdu *msdu, static inline uint8_t * qwz_dp_rx_h_80211_hdr(struct qwz_softc *sc, struct hal_rx_desc *desc) { - return sc->hw_params.hw_ops->rx_desc_get_hdr_status(desc); + return sc->hal_rx_ops->rx_desc_get_hdr_status(desc); } static inline enum hal_encrypt_type -qwz_dp_rx_h_mpdu_start_enctype(struct qwz_softc *sc, struct hal_rx_desc *desc) +qwz_dp_rx_h_enctype(struct qwz_softc *sc, struct hal_rx_desc *desc) { - if (!sc->hw_params.hw_ops->rx_desc_encrypt_valid(desc)) + if (!sc->hal_rx_ops->rx_desc_encrypt_valid(desc)) return HAL_ENCRYPT_TYPE_OPEN; - return sc->hw_params.hw_ops->rx_desc_get_encrypt_type(desc); + return sc->hal_rx_ops->rx_desc_get_encrypt_type(desc); } static inline uint8_t qwz_dp_rx_h_msdu_start_decap_type(struct qwz_softc *sc, struct hal_rx_desc *desc) { - return sc->hw_params.hw_ops->rx_desc_get_decap_type(desc); + return sc->hal_rx_ops->rx_desc_get_decap_type(desc); } void @@ -15712,11 +14580,10 @@ qwz_dp_rx_h_mpdu(struct qwz_softc *sc, struct qwz_rx_msdu *msdu, #if 0 struct ath12k_peer *peer; #endif - struct rx_attention *rx_attention; uint32_t err_bitmap; /* PN for multicast packets will be checked in net80211 */ - fill_crypto_hdr = qwz_dp_rx_h_attn_is_mcbc(sc, rx_desc); + fill_crypto_hdr = qwz_dp_rx_h_is_da_mcbc(sc, rx_desc); msdu->is_mcbc = fill_crypto_hdr; #if 0 if (rxcb->is_mcbc) { @@ -15733,15 +14600,14 @@ qwz_dp_rx_h_mpdu(struct qwz_softc *sc, struct qwz_rx_msdu *msdu, enctype = peer->sec_type; } else { #endif - enctype = qwz_dp_rx_h_mpdu_start_enctype(sc, rx_desc); + enctype = qwz_dp_rx_h_enctype(sc, rx_desc); #if 0 } spin_unlock_bh(&ar->ab->base_lock); #endif - rx_attention = qwz_dp_rx_get_attention(sc, rx_desc); - err_bitmap = qwz_dp_rx_h_attn_mpdu_err(rx_attention); + err_bitmap = qwz_dp_rx_h_h_mpdu_err(sc, rx_desc); if (enctype != HAL_ENCRYPT_TYPE_OPEN && !err_bitmap) - is_decrypted = qwz_dp_rx_h_attn_is_decrypted(rx_attention); + is_decrypted = qwz_dp_rx_h_is_decrypted(sc, rx_desc); #if 0 /* Clear per-MPDU flags while leaving per-PPDU flags intact */ rx_status->flag &= ~(RX_FLAG_FAILED_FCS_CRC | @@ -15751,7 +14617,7 @@ qwz_dp_rx_h_mpdu(struct qwz_softc *sc, struct qwz_rx_msdu *msdu, RX_FLAG_MMIC_STRIPPED); #endif - if (err_bitmap & DP_RX_MPDU_ERR_FCS) { + if (err_bitmap & HAL_RX_MPDU_ERR_FCS) { if (ic->ic_flags & IEEE80211_F_RSNON) ic->ic_stats.is_rx_decryptcrc++; else @@ -15759,10 +14625,10 @@ qwz_dp_rx_h_mpdu(struct qwz_softc *sc, struct qwz_rx_msdu *msdu, } /* XXX Trusting firmware to handle Michael MIC counter-measures... */ - if (err_bitmap & DP_RX_MPDU_ERR_TKIP_MIC) + if (err_bitmap & HAL_RX_MPDU_ERR_TKIP_MIC) ic->ic_stats.is_rx_locmicfail++; - if (err_bitmap & DP_RX_MPDU_ERR_DECRYPT) + if (err_bitmap & HAL_RX_MPDU_ERR_DECRYPT) ic->ic_stats.is_rx_wepfail++; if (is_decrypted) { @@ -15799,7 +14665,6 @@ qwz_dp_rx_process_msdu(struct qwz_softc *sc, struct qwz_rx_msdu *msdu, struct qwz_rx_msdu_list *msdu_list) { struct hal_rx_desc *rx_desc, *lrx_desc; - struct rx_attention *rx_attention; struct qwz_rx_msdu *last_buf; uint8_t l3_pad_bytes; uint16_t msdu_len; @@ -15814,14 +14679,8 @@ qwz_dp_rx_process_msdu(struct qwz_softc *sc, struct qwz_rx_msdu *msdu, } rx_desc = mtod(msdu->m, struct hal_rx_desc *); - if (qwz_dp_rx_h_attn_msdu_len_err(sc, rx_desc)) { - DPRINTF("%s: msdu len not valid\n", __func__); - return EIO; - } - lrx_desc = mtod(last_buf->m, struct hal_rx_desc *); - rx_attention = qwz_dp_rx_get_attention(sc, lrx_desc); - if (!qwz_dp_rx_h_attn_msdu_done(rx_attention)) { + if (!qwz_dp_rx_h_msdu_done(sc, lrx_desc)) { DPRINTF("%s: msdu_done bit in attention is not set\n", __func__); return EIO; @@ -15917,6 +14776,7 @@ qwz_dp_rx_process_received_packets(struct qwz_softc *sc, int qwz_dp_process_rx(struct qwz_softc *sc, int ring_id) { +#if 0 struct qwz_dp *dp = &sc->dp; struct qwz_pdev_dp *pdev_dp = &sc->pdev_dp; struct dp_rxdma_ring *rx_ring; @@ -16036,8 +14896,12 @@ try_again: } exit: return total_msdu_reaped; +#endif + printf("%s:%d\n", __func__, __LINE__); + return 0; } +#if 0 struct mbuf * qwz_dp_rx_alloc_mon_status_buf(struct qwz_softc *sc, struct dp_rxdma_ring *rx_ring, int *buf_idx) @@ -16091,11 +14955,13 @@ fail_free_mbuf: m_freem(m); return NULL; } +#endif int qwz_dp_rx_reap_mon_status_ring(struct qwz_softc *sc, int mac_id, struct mbuf_list *ml) { +#if 0 const struct ath12k_hw_hal_params *hal_params; struct qwz_pdev_dp *dp; struct dp_rxdma_ring *rx_ring; @@ -16199,6 +15065,9 @@ move_next: spin_unlock_bh(&srng->lock); #endif return num_buffs_reaped; +#endif + printf("%s:%d\n", __func__, __LINE__); + return 0; } enum hal_rx_mon_status @@ -16318,6 +15187,31 @@ qwz_dp_rx_process_mon_rings(struct qwz_softc *sc, int mac_id) return ret; } +bool +qwz_dp_wmask_compaction_rx_tlv_supported(struct qwz_softc *sc) +{ + if (isset(sc->wmi.svc_map, WMI_TLV_SERVICE_WMSK_COMPACTION_RX_TLVS) && + sc->hw_params.hal_ops->rxdma_ring_wmask_rx_mpdu_start && + sc->hw_params.hal_ops->rxdma_ring_wmask_rx_msdu_end && + sc->hw_params.hal_ops->get_hal_rx_compact_ops) { + return true; + } + return false; +} + +void +qwz_dp_hal_rx_desc_init(struct qwz_softc *sc) +{ + if (qwz_dp_wmask_compaction_rx_tlv_supported(sc)) { + /* RX TLVS compaction is supported, hence change the hal_rx_ops + * to compact hal_rx_ops. + */ + sc->hal_rx_ops = sc->hw_params.hal_ops->get_hal_rx_compact_ops(); + } + sc->hal.hal_desc_sz = + sc->hal_rx_ops->rx_desc_get_desc_size(); +} + void qwz_dp_service_mon_ring(void *arg) { @@ -16333,6 +15227,7 @@ qwz_dp_service_mon_ring(void *arg) int qwz_dp_process_rxdma_err(struct qwz_softc *sc, int mac_id) { +#if 0 struct ieee80211com *ic = &sc->sc_ic; struct ifnet *ifp = &ic->ic_if; struct dp_srng *err_ring; @@ -16413,6 +15308,9 @@ qwz_dp_process_rxdma_err(struct qwz_softc *sc, int mac_id) ifp->if_ierrors += num_buf_freed; return num_buf_freed; +#endif + printf("%s:%d\n", __func__, __LINE__); + return 0; } void @@ -16715,7 +15613,7 @@ qwz_dp_process_reo_status(struct qwz_softc *sc) int qwz_dp_service_srng(struct qwz_softc *sc, int grp_id) { - struct qwz_pdev_dp *dp = &sc->pdev_dp; + struct qwz_dp *dp = &sc->dp; int i, j, ret = 0; if (sc->hw_params.ring_mask->tx[grp_id]) { @@ -16755,9 +15653,10 @@ qwz_dp_service_srng(struct qwz_softc *sc, int grp_id) ret = 1; if (sc->hw_params.ring_mask->host2rxdma[grp_id]) { - qwz_dp_rxbufs_replenish(sc, 0 /* FIXME */, - &dp->rx_refill_buf_ring, 0, - sc->hw_params.hal_params->rx_buf_rbm); + TAILQ_HEAD(, ath12k_rx_desc_info) list; + TAILQ_INIT(&list); + qwz_dp_rxbufs_replenish(sc, + &dp->rx_refill_buf_ring, &list, 0); } return ret; @@ -16850,36 +15749,20 @@ qwz_wmi_cmd_send(struct qwz_pdev_wmi *wmi, struct mbuf *m, uint32_t cmd_id) #ifdef notyet might_sleep(); #endif - if (sc->hw_params.credit_flow) { - struct qwz_htc *htc = &sc->htc; - struct qwz_htc_ep *ep = &htc->endpoint[wmi->eid]; + struct qwz_htc *htc = &sc->htc; + struct qwz_htc_ep *ep = &htc->endpoint[wmi->eid]; - while (!ep->tx_credits) { - ret = tsleep_nsec(&ep->tx_credits, 0, "qwztxcrd", - SEC_TO_NSEC(3)); - if (ret) { - printf("%s: tx credits timeout\n", - sc->sc_dev.dv_xname); - if (test_bit(ATH12K_FLAG_CRASH_FLUSH, - sc->sc_flags)) - return ESHUTDOWN; - else - return EAGAIN; - } - } - } else { - while (!wmi->tx_ce_desc) { - ret = tsleep_nsec(&wmi->tx_ce_desc, 0, "qwztxce", - SEC_TO_NSEC(3)); - if (ret) { - printf("%s: tx ce desc timeout\n", - sc->sc_dev.dv_xname); - if (test_bit(ATH12K_FLAG_CRASH_FLUSH, - sc->sc_flags)) - return ESHUTDOWN; - else - return EAGAIN; - } + while (!ep->tx_credits) { + ret = tsleep_nsec(&ep->tx_credits, 0, "qwztxcrd", + SEC_TO_NSEC(3)); + if (ret) { + printf("%s: tx credits timeout\n", + sc->sc_dev.dv_xname); + if (test_bit(ATH12K_FLAG_CRASH_FLUSH, + sc->sc_flags)) + return ESHUTDOWN; + else + return EAGAIN; } } @@ -17008,47 +15891,6 @@ qwz_wmi_pdev_set_ps_mode(struct qwz_softc *sc, int vdev_id, uint8_t pdev_id, return 0; } -int -qwz_wmi_scan_prob_req_oui(struct qwz_softc *sc, const uint8_t *mac_addr, - uint8_t pdev_id) -{ - struct qwz_pdev_wmi *wmi = &sc->wmi.wmi[pdev_id]; - struct mbuf *m; - struct wmi_scan_prob_req_oui_cmd *cmd; - uint32_t prob_req_oui; - int len, ret; - - prob_req_oui = (((uint32_t)mac_addr[0]) << 16) | - (((uint32_t)mac_addr[1]) << 8) | mac_addr[2]; - - len = sizeof(*cmd); - m = qwz_wmi_alloc_mbuf(len); - if (!m) - return ENOMEM; - - cmd = (struct wmi_scan_prob_req_oui_cmd *)(mtod(m, uint8_t *) + - sizeof(struct ath12k_htc_hdr) + sizeof(struct wmi_cmd_hdr)); - cmd->tlv_header = FIELD_PREP(WMI_TLV_TAG, - WMI_TAG_SCAN_PROB_REQ_OUI_CMD) | - FIELD_PREP(WMI_TLV_LEN, sizeof(*cmd) - TLV_HDR_SIZE); - cmd->prob_req_oui = prob_req_oui; - - DNPRINTF(QWZ_D_WMI, "%s: scan prob req oui %d\n", __func__, - prob_req_oui); - - ret = qwz_wmi_cmd_send(wmi, m, WMI_SCAN_PROB_REQ_OUI_CMDID); - if (ret) { - if (ret != ESHUTDOWN) { - printf("%s: failed to send WMI_SCAN_PROB_REQ_OUI cmd\n", - sc->sc_dev.dv_xname); - } - m_freem(m); - return ret; - } - - return 0; -} - int qwz_wmi_send_dfs_phyerr_offload_enable_cmd(struct qwz_softc *sc, uint32_t pdev_id) { @@ -17328,11 +16170,8 @@ qwz_wmi_copy_scan_event_cntrl_flags(struct wmi_start_scan_cmd *cmd, cmd->scan_ctrl_flags |= WMI_SCAN_ENABLE_IE_WHTELIST_IN_PROBE_REQ; - /* for adaptive scan mode using 3 bits (21 - 23 bits) */ - WMI_SCAN_SET_DWELL_MODE(cmd->scan_ctrl_flags, + cmd->scan_ctrl_flags |= FIELD_PREP(WMI_SCAN_DWELL_MODE_MASK, param->adaptive_dwell_time_mode); - - cmd->scan_ctrl_flags_ext = param->scan_ctrl_flags_ext; } int @@ -17366,13 +16205,6 @@ qwz_wmi_send_scan_start_cmd(struct qwz_softc *sc, if (params->num_bssid) len += sizeof(*bssid) * params->num_bssid; - len += TLV_HDR_SIZE; - if (params->extraie.len && params->extraie.len <= 0xFFFF) { - extraie_len_with_pad = roundup(params->extraie.len, - sizeof(uint32_t)); - } - len += extraie_len_with_pad; - if (params->num_hint_bssid) { len += TLV_HDR_SIZE + params->num_hint_bssid * sizeof(struct hint_bssid); @@ -17383,6 +16215,19 @@ qwz_wmi_send_scan_start_cmd(struct qwz_softc *sc, params->num_hint_s_ssid * sizeof(struct hint_short_ssid); } + len += TLV_HDR_SIZE; + if (params->extraie.len) + extraie_len_with_pad = roundup(params->extraie.len, + sizeof(uint32_t)); + if (extraie_len_with_pad <= + (wmi->wmi->max_msg_len[params->pdev_id] - len)) { + len += extraie_len_with_pad; + } else { + printf("%s: discard large size %d bytes extraie for scan start\n", + __func__, params->extraie.len); + extraie_len_with_pad = 0; + } + m = qwz_wmi_alloc_mbuf(len); if (!m) return ENOMEM; @@ -17420,8 +16265,6 @@ qwz_wmi_send_scan_start_cmd(struct qwz_softc *sc, cmd->num_ssids = params->num_ssids; cmd->ie_len = params->extraie.len; cmd->n_probes = params->n_probes; - IEEE80211_ADDR_COPY(cmd->mac_addr.addr, params->mac_addr.addr); - IEEE80211_ADDR_COPY(cmd->mac_mask.addr, params->mac_mask.addr); ptr += sizeof(*cmd); @@ -17973,7 +16816,7 @@ qwz_wmi_send_peer_assoc_cmd(struct qwz_softc *sc, uint8_t pdev_id, void qwz_wmi_copy_resource_config(struct wmi_resource_config *wmi_cfg, - struct target_resource_config *tg_cfg) + struct wmi_resource_config_arg *tg_cfg) { wmi_cfg->num_vdevs = tg_cfg->num_vdevs; wmi_cfg->num_peers = tg_cfg->num_peers; @@ -18028,8 +16871,8 @@ qwz_wmi_copy_resource_config(struct wmi_resource_config *wmi_cfg, wmi_cfg->bpf_instruction_size = tg_cfg->bpf_instruction_size; wmi_cfg->max_bssid_rx_filters = tg_cfg->max_bssid_rx_filters; wmi_cfg->use_pdev_id = tg_cfg->use_pdev_id; - wmi_cfg->flag1 = tg_cfg->flag1; - wmi_cfg->peer_map_unmap_v2_support = tg_cfg->peer_map_unmap_v2_support; + wmi_cfg->flag1 = tg_cfg->atf_config | WMI_RSRC_CFG_FLAG1_BSS_CHANNEL_INFO_64; + wmi_cfg->peer_map_unmap_version = tg_cfg->peer_map_unmap_version; wmi_cfg->sched_params = tg_cfg->sched_params; wmi_cfg->twt_ap_pdev_count = tg_cfg->twt_ap_pdev_count; wmi_cfg->twt_ap_sta_count = tg_cfg->twt_ap_sta_count; @@ -18045,7 +16888,7 @@ qwz_wmi_copy_resource_config(struct wmi_resource_config *wmi_cfg, } int -qwz_init_cmd_send(struct qwz_pdev_wmi *wmi, struct wmi_init_cmd_param *param) +qwz_init_cmd_send(struct qwz_pdev_wmi *wmi, struct wmi_init_cmd_arg *param) { struct mbuf *m; struct wmi_init_cmd *cmd; @@ -18081,7 +16924,7 @@ qwz_init_cmd_send(struct qwz_pdev_wmi *wmi, struct wmi_init_cmd_param *param) sizeof(struct wmi_cmd_hdr) + sizeof(*cmd); cfg = ptr; - qwz_wmi_copy_resource_config(cfg, param->res_cfg); + qwz_wmi_copy_resource_config(cfg, ¶m->res_cfg); cfg->tlv_header = FIELD_PREP(WMI_TLV_TAG, WMI_TAG_RESOURCE_CONFIG) | FIELD_PREP(WMI_TLV_LEN, sizeof(*cfg) - TLV_HDR_SIZE); @@ -18165,20 +17008,16 @@ int qwz_wmi_cmd_init(struct qwz_softc *sc) { struct qwz_wmi_base *wmi_sc = &sc->wmi; - struct wmi_init_cmd_param init_param; - struct target_resource_config config; + struct wmi_init_cmd_arg init_param; memset(&init_param, 0, sizeof(init_param)); - memset(&config, 0, sizeof(config)); - - sc->hw_params.hw_ops->wmi_init_config(sc, &config); if (isset(sc->wmi.svc_map, WMI_TLV_SERVICE_REG_CC_EXT_EVENT_SUPPORT)) - config.is_reg_cc_ext_event_supported = 1; + init_param.res_cfg.is_reg_cc_ext_event_supported = 1; - memcpy(&wmi_sc->wlan_resource_config, &config, sizeof(config)); + sc->hw_params.wmi_init(sc, &init_param.res_cfg); + sc->wmi_conf_rx_decap_mode = init_param.res_cfg.rx_decap_mode; - init_param.res_cfg = &wmi_sc->wlan_resource_config; init_param.num_mem_chunks = wmi_sc->num_mem_chunks; init_param.hw_mode_id = wmi_sc->preferred_hw_mode; init_param.mem_chunks = wmi_sc->mem_chunks; @@ -18189,6 +17028,8 @@ qwz_wmi_cmd_init(struct qwz_softc *sc) init_param.num_band_to_mac = sc->num_radios; qwz_fill_band_to_mac_param(sc, init_param.band_to_mac); + sc->dp.peer_metadata_ver = init_param.res_cfg.peer_metadata_ver; + return qwz_init_cmd_send(&wmi_sc->wmi[0], &init_param); } @@ -18740,6 +17581,16 @@ qwz_wmi_vdev_start(struct qwz_softc *sc, struct wmi_vdev_start_req_arg *arg, return ret; } +uint32_t +qwz_core_get_max_peers_per_radio(struct qwz_softc *sc) +{ + if (sc->num_radios == 2) + return TARGET_NUM_PEERS_PDEV_DBS; + else if (sc->num_radios == 3) + return TARGET_NUM_PEERS_PDEV_DBS_SBS; + return TARGET_NUM_PEERS_PDEV_SINGLE; +} + int qwz_core_start(struct qwz_softc *sc) { @@ -18809,8 +17660,10 @@ qwz_core_start(struct qwz_softc *sc) ret); goto err_hif_stop; } - ath12k_dp_pdev_pre_alloc(sc); #endif + + qwz_dp_cc_config(sc); + ret = qwz_dp_pdev_reo_setup(sc); if (ret) { printf("%s: failed to initialize reo destination rings: %d\n", @@ -18818,6 +17671,8 @@ qwz_core_start(struct qwz_softc *sc) goto err_mac_destroy; } + qwz_dp_hal_rx_desc_init(sc); + ret = qwz_wmi_cmd_init(sc); if (ret) { printf("%s: failed to send wmi init cmd: %d\n", __func__, ret); @@ -18832,8 +17687,7 @@ qwz_core_start(struct qwz_softc *sc) } /* put hardware to DBS mode */ - if (sc->hw_params.single_pdev_only && - sc->hw_params.num_rxmda_per_pdev > 1) { + if (sc->hw_params.single_pdev_only) { ret = qwz_wmi_set_hw_mode(sc, WMI_HOST_HW_MODE_DBS); if (ret) { printf("%s: failed to send dbs mode: %d\n", @@ -20244,7 +19098,6 @@ int qwz_htc_process_trailer(struct qwz_htc *htc, uint8_t *buffer, int length, enum ath12k_htc_ep_id src_eid) { - struct qwz_softc *sc = htc->sc; int status = 0; struct ath12k_htc_record *record; size_t len; @@ -20265,25 +19118,23 @@ qwz_htc_process_trailer(struct qwz_htc *htc, uint8_t *buffer, int length, break; } - if (sc->hw_params.credit_flow) { - switch (record->hdr.id) { - case ATH12K_HTC_RECORD_CREDITS: - len = sizeof(struct ath12k_htc_credit_report); - if (record->hdr.len < len) { - printf("%s: Credit report too long\n", - __func__); - status = EINVAL; - break; - } - qwz_htc_process_credit_report(htc, - record->credit_report, - record->hdr.len, src_eid); - break; - default: - printf("%s: unhandled record: id:%d length:%d\n", - __func__, record->hdr.id, record->hdr.len); + switch (record->hdr.id) { + case ATH12K_HTC_RECORD_CREDITS: + len = sizeof(struct ath12k_htc_credit_report); + if (record->hdr.len < len) { + printf("%s: Credit report too long\n", + __func__); + status = EINVAL; break; } + qwz_htc_process_credit_report(htc, + record->credit_report, + record->hdr.len, src_eid); + break; + default: + printf("%s: unhandled record: id:%d length:%d\n", + __func__, record->hdr.id, record->hdr.len); + break; } if (status) @@ -20482,26 +19333,6 @@ qwz_ce_free_ring(struct qwz_softc *sc, struct qwz_ce_ring *ring) free(ring, M_DEVBUF, size); } -static inline int -qwz_ce_need_shadow_fix(int ce_id) -{ - /* only ce4 needs shadow workaround */ - return (ce_id == 4); -} - -void -qwz_ce_stop_shadow_timers(struct qwz_softc *sc) -{ - int i; - - if (!sc->hw_params.supports_shadow_regs) - return; - - for (i = 0; i < sc->hw_params.ce_count; i++) - if (qwz_ce_need_shadow_fix(i)) - qwz_dp_shadow_stop_timer(sc, &sc->ce.hp_timer[i]); -} - void qwz_ce_free_pipes(struct qwz_softc *sc) { @@ -20885,11 +19716,6 @@ qwz_ce_init_ring(struct qwz_softc *sc, struct qwz_ce_ring *ce_ring, ce_ring->hal_ring_id = ret; - if (sc->hw_params.supports_shadow_regs && - qwz_ce_need_shadow_fix(ce_id)) - qwz_dp_shadow_init_timer(sc, &sc->ce.hp_timer[ce_id], - ATH12K_SHADOW_CTRL_TIMER_INTERVAL, ce_ring->hal_ring_id); - return 0; } @@ -20900,6 +19726,9 @@ qwz_ce_init_pipes(struct qwz_softc *sc) int i; int ret; + qwz_ce_get_shadow_config(sc, &sc->qmi_ce_cfg.shadow_reg_v3, + &sc->qmi_ce_cfg.shadow_reg_v3_len); + for (i = 0; i < sc->hw_params.ce_count; i++) { pipe = &sc->ce.ce_pipe[i]; @@ -21494,7 +20323,7 @@ qwz_mac_register(struct qwz_softc *sc) /* Initialize channel counters frequency value in hertz */ sc->cc_freq_hz = IPQ8074_CC_FREQ_HERTZ; - sc->free_vdev_map = (1U << (sc->num_radios * TARGET_NUM_VDEVS(sc))) - 1; + sc->free_vdev_map = (1U << (sc->num_radios * TARGET_NUM_VDEVS)) - 1; if (IEEE80211_ADDR_EQ(etheranyaddr, sc->sc_ic.ic_myaddr)) IEEE80211_ADDR_COPY(sc->sc_ic.ic_myaddr, sc->mac_addr); @@ -21590,7 +20419,6 @@ int qwz_mac_op_start(struct qwz_pdev *pdev) { struct qwz_softc *sc = pdev->sc; - struct ieee80211com *ic = &sc->sc_ic; int ret; ret = qwz_wmi_pdev_set_param(sc, WMI_PDEV_PARAM_PMF_QOS, 1, @@ -21609,17 +20437,6 @@ qwz_mac_op_start(struct qwz_pdev *pdev) goto err; } - if (isset(sc->wmi.svc_map, WMI_TLV_SERVICE_SPOOF_MAC_SUPPORT)) { - ret = qwz_wmi_scan_prob_req_oui(sc, ic->ic_myaddr, - pdev->pdev_id); - if (ret) { - printf("%s: failed to set prob req oui for " - "pdev %d: %i\n", sc->sc_dev.dv_xname, - pdev->pdev_id, ret); - goto err; - } - } - ret = qwz_wmi_pdev_set_param(sc, WMI_PDEV_PARAM_ARP_AC_OVERRIDE, 0, pdev->pdev_id); if (ret) { @@ -22090,10 +20907,10 @@ qwz_mac_op_add_interface(struct qwz_pdev *pdev) goto err; } #endif - if (sc->num_created_vdevs > (TARGET_NUM_VDEVS(sc) - 1)) { + if (sc->num_created_vdevs > (TARGET_NUM_VDEVS - 1)) { printf("%s: failed to create vdev %u, reached vdev limit %d\n", sc->sc_dev.dv_xname, sc->num_created_vdevs, - TARGET_NUM_VDEVS(sc)); + TARGET_NUM_VDEVS); ret = EBUSY; goto err; } @@ -22585,7 +21402,7 @@ qwz_peer_create(struct qwz_softc *sc, struct qwz_vif *arvif, uint8_t pdev_id, #ifdef notyet lockdep_assert_held(&ar->conf_mutex); #endif - if (sc->num_peers > (TARGET_NUM_PEERS_PDEV(sc) - 1)) { + if (sc->num_peers > (qwz_core_get_max_peers_per_radio(sc) - 1)) { DPRINTF("%s: failed to create peer due to insufficient " "peer entry resource in firmware\n", __func__); return ENOBUFS; @@ -23813,11 +22630,6 @@ qwz_wmi_start_scan_init(struct qwz_softc *sc, struct scan_req_params *arg) WMI_SCAN_EVENT_FOREIGN_CHAN | WMI_SCAN_EVENT_DEQUEUED; arg->scan_flags |= WMI_SCAN_CHAN_STAT_EVENT; - if (isset(sc->wmi.svc_map, - WMI_TLV_SERVICE_PASSIVE_SCAN_START_TIME_ENHANCE)) - arg->scan_ctrl_flags_ext |= - WMI_SCAN_FLAG_EXT_PASSIVE_SCAN_START_TIME_ENHANCE; - arg->num_bssid = 1; /* fill bssid_list[0] with 0xff, otherwise bssid and RA will be @@ -24132,27 +22944,7 @@ qwz_scan(struct qwz_softc *sc) for (chan = &ic->ic_channels[1]; chan <= lastc; chan++) { if (chan->ic_flags == 0) continue; - if (isset(sc->wmi.svc_map, - WMI_TLV_SERVICE_SCAN_CONFIG_PER_CHANNEL)) { - arg->chan_list[i++] = chan->ic_freq & - WMI_SCAN_CONFIG_PER_CHANNEL_MASK; -#if 0 - /* If NL80211_SCAN_FLAG_COLOCATED_6GHZ is set in scan - * flags, then scan all PSC channels in 6 GHz band and - * those non-PSC channels where RNR IE is found during - * the legacy 2.4/5 GHz scan. - * If NL80211_SCAN_FLAG_COLOCATED_6GHZ is not set, - * then all channels in 6 GHz will be scanned. - */ - if (req->channels[i]->band == NL80211_BAND_6GHZ && - req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ && - !cfg80211_channel_is_psc(req->channels[i])) - arg->chan_list[i] |= - WMI_SCAN_CH_FLAG_SCAN_ONLY_IF_RNR_FOUND; -#endif - } else { - arg->chan_list[i++] = chan->ic_freq; - } + arg->chan_list[i++] = chan->ic_freq; } } #if 0 diff --git a/sys/dev/ic/qwzreg.h b/sys/dev/ic/qwzreg.h index 81f604755..1bf134f19 100644 --- a/sys/dev/ic/qwzreg.h +++ b/sys/dev/ic/qwzreg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: qwzreg.h,v 1.6 2024/09/01 03:14:48 jsg Exp $ */ +/* $OpenBSD: qwzreg.h,v 1.11 2024/12/23 00:12:44 patrick Exp $ */ /* * Copyright (c) 2021-2022, Qualcomm Innovation Center, Inc. @@ -2189,6 +2189,7 @@ enum wmi_tlv_service { WMI_TLV_SERVICE_REG_CC_EXT_EVENT_SUPPORT = 281, WMI_TLV_SERVICE_BIOS_SAR_SUPPORT = 326, WMI_TLV_SERVICE_SUPPORT_11D_FOR_HOST_SCAN = 357, + WMI_TLV_SERVICE_WMSK_COMPACTION_RX_TLVS = 361, /* The third 128 bits */ WMI_MAX_EXT2_SERVICE = 384 @@ -2351,9 +2352,83 @@ struct wmi_host_mem_chunk { uint32_t req_id; }; -struct wmi_init_cmd_param { - uint32_t tlv_header; - struct target_resource_config *res_cfg; +enum peer_metadata_version { + ATH12K_PEER_METADATA_V0, + ATH12K_PEER_METADATA_V1, + ATH12K_PEER_METADATA_V1A, + ATH12K_PEER_METADATA_V1B, +}; + +struct wmi_resource_config_arg { + uint32_t num_vdevs; + uint32_t num_peers; + uint32_t num_active_peers; + uint32_t num_offload_peers; + uint32_t num_offload_reorder_buffs; + uint32_t num_peer_keys; + uint32_t num_tids; + uint32_t ast_skid_limit; + uint32_t tx_chain_mask; + uint32_t rx_chain_mask; + uint32_t rx_timeout_pri[4]; + uint32_t rx_decap_mode; + uint32_t scan_max_pending_req; + uint32_t bmiss_offload_max_vdev; + uint32_t roam_offload_max_vdev; + uint32_t roam_offload_max_ap_profiles; + uint32_t num_mcast_groups; + uint32_t num_mcast_table_elems; + uint32_t mcast2ucast_mode; + uint32_t tx_dbg_log_size; + uint32_t num_wds_entries; + uint32_t dma_burst_size; + uint32_t mac_aggr_delim; + uint32_t rx_skip_defrag_timeout_dup_detection_check; + uint32_t vow_config; + uint32_t gtk_offload_max_vdev; + uint32_t num_msdu_desc; + uint32_t max_frag_entries; + uint32_t max_peer_ext_stats; + uint32_t smart_ant_cap; + uint32_t bk_minfree; + uint32_t be_minfree; + uint32_t vi_minfree; + uint32_t vo_minfree; + uint32_t rx_batchmode; + uint32_t tt_support; + uint32_t atf_config; + uint32_t iphdr_pad_config; + uint32_t qwrap_config:16, + alloc_frag_desc_for_data_pkt:16; + uint32_t num_tdls_vdevs; + uint32_t num_tdls_conn_table_entries; + uint32_t beacon_tx_offload_max_vdev; + uint32_t num_multicast_filter_entries; + uint32_t num_wow_filters; + uint32_t num_keep_alive_pattern; + uint32_t keep_alive_pattern_size; + uint32_t max_tdls_concurrent_sleep_sta; + uint32_t max_tdls_concurrent_buffer_sta; + uint32_t wmi_send_separate; + uint32_t num_ocb_vdevs; + uint32_t num_ocb_channels; + uint32_t num_ocb_schedules; + uint32_t num_ns_ext_tuples_cfg; + uint32_t bpf_instruction_size; + uint32_t max_bssid_rx_filters; + uint32_t use_pdev_id; + uint32_t peer_map_unmap_version; + uint32_t sched_params; + uint32_t twt_ap_pdev_count; + uint32_t twt_ap_sta_count; + enum peer_metadata_version peer_metadata_ver; + uint32_t ema_max_vap_cnt; + uint32_t ema_max_profile_period; + bool is_reg_cc_ext_event_supported; +} __packed; + +struct wmi_init_cmd_arg { + struct wmi_resource_config_arg res_cfg; uint8_t num_mem_chunks; struct wmi_host_mem_chunk *mem_chunks; uint32_t hw_mode_id; @@ -2462,7 +2537,7 @@ struct wmi_resource_config { uint32_t use_pdev_id; uint32_t max_num_dbs_scan_duty_cycle; uint32_t max_num_group_keys; - uint32_t peer_map_unmap_v2_support; + uint32_t peer_map_unmap_version; uint32_t sched_params; uint32_t twt_ap_pdev_count; uint32_t twt_ap_sta_count; @@ -3340,12 +3415,7 @@ struct wmi_start_scan_cmd { #define WMI_SCAN_RANDOM_SEQ_NO_IN_PROBE_REQ 0x80000 #define WMI_SCAN_ENABLE_IE_WHTELIST_IN_PROBE_REQ 0x100000 -#define WMI_SCAN_DWELL_MODE_MASK 0x00E00000 -#define WMI_SCAN_DWELL_MODE_SHIFT 21 -#define WMI_SCAN_FLAG_EXT_PASSIVE_SCAN_START_TIME_ENHANCE 0x00000800 - -#define WMI_SCAN_CONFIG_PER_CHANNEL_MASK GENMASK(19, 0) -#define WMI_SCAN_CH_FLAG_SCAN_ONLY_IF_RNR_FOUND BIT(20) +#define WMI_SCAN_DWELL_MODE_MASK GENMASK(23, 21) enum { WMI_SCAN_DWELL_MODE_DEFAULT = 0, @@ -3355,10 +3425,6 @@ enum { WMI_SCAN_DWELL_MODE_STATIC = 4, }; -#define WMI_SCAN_SET_DWELL_MODE(flag, mode) \ - ((flag) |= (((mode) << WMI_SCAN_DWELL_MODE_SHIFT) & \ - WMI_SCAN_DWELL_MODE_MASK)) - struct hint_short_ssid { uint32_t freq_flags; uint32_t short_ssid; @@ -3845,11 +3911,6 @@ struct wmi_scan_chan_list_cmd { uint32_t pdev_id; } __packed; -struct wmi_scan_prob_req_oui_cmd { - uint32_t tlv_header; - uint32_t prob_req_oui; -} __packed; - #define WMI_MGMT_SEND_DOWNLD_LEN 64 #define WMI_TX_PARAMS_DWORD0_POWER GENMASK(7, 0) @@ -5758,7 +5819,7 @@ struct target_resource_config { uint32_t bpf_instruction_size; uint32_t max_bssid_rx_filters; uint32_t use_pdev_id; - uint32_t peer_map_unmap_v2_support; + uint32_t peer_map_unmap_support; uint32_t sched_params; uint32_t twt_ap_pdev_count; uint32_t twt_ap_sta_count; @@ -10698,26 +10759,37 @@ enum ath12k_htc_ep_id { /* Target configuration defines */ /* Num VDEVS per radio */ -#define TARGET_NUM_VDEVS(sc) (sc->hw_params.num_vdevs) +#define TARGET_NUM_VDEVS (16 + 1) -#define TARGET_NUM_PEERS_PDEV(sc) (sc->hw_params.num_peers + TARGET_NUM_VDEVS(sc)) +#define TARGET_NUM_PEERS_PDEV_SINGLE (TARGET_NUM_STATIONS_SINGLE + \ + TARGET_NUM_VDEVS) +#define TARGET_NUM_PEERS_PDEV_DBS (TARGET_NUM_STATIONS_DBS + \ + TARGET_NUM_VDEVS) +#define TARGET_NUM_PEERS_PDEV_DBS_SBS (TARGET_NUM_STATIONS_DBS_SBS + \ + TARGET_NUM_VDEVS) /* Num of peers for Single Radio mode */ -#define TARGET_NUM_PEERS_SINGLE(sc) (TARGET_NUM_PEERS_PDEV(sc)) +#define TARGET_NUM_PEERS_SINGLE (TARGET_NUM_PEERS_PDEV_SINGLE) /* Num of peers for DBS */ -#define TARGET_NUM_PEERS_DBS(sc) (2 * TARGET_NUM_PEERS_PDEV(sc)) +#define TARGET_NUM_PEERS_DBS (2 * TARGET_NUM_PEERS_PDEV_DBS) /* Num of peers for DBS_SBS */ -#define TARGET_NUM_PEERS_DBS_SBS(sc) (3 * TARGET_NUM_PEERS_PDEV(sc)) +#define TARGET_NUM_PEERS_DBS_SBS (3 * TARGET_NUM_PEERS_PDEV_DBS_SBS) -/* Max num of stations (per radio) */ -#define TARGET_NUM_STATIONS(sc) (sc->hw_params.num_peers) +/* Max num of stations for Single Radio mode */ +#define TARGET_NUM_STATIONS_SINGLE 512 -#define TARGET_NUM_PEERS(sc, x) TARGET_NUM_PEERS_##x(sc) +/* Max num of stations for DBS */ +#define TARGET_NUM_STATIONS_DBS 128 + +/* Max num of stations for DBS_SBS */ +#define TARGET_NUM_STATIONS_DBS_SBS 128 + +#define TARGET_NUM_PEERS(x) TARGET_NUM_PEERS_##x #define TARGET_NUM_PEER_KEYS 2 -#define TARGET_NUM_TIDS(sc, x) (2 * TARGET_NUM_PEERS(sc, x) + \ - 4 * TARGET_NUM_VDEVS(sc) + 8) +#define TARGET_NUM_TIDS(x) (2 * TARGET_NUM_PEERS(x) + \ + 4 * TARGET_NUM_VDEVS + 8) #define TARGET_AST_SKID_LIMIT 16 #define TARGET_NUM_OFFLD_PEERS 4 @@ -10788,81 +10860,6 @@ enum ath12k_bus { * rx_desc.h */ -enum rx_desc_rxpcu_filter { - RX_DESC_RXPCU_FILTER_PASS, - RX_DESC_RXPCU_FILTER_MONITOR_CLIENT, - RX_DESC_RXPCU_FILTER_MONITOR_OTHER, -}; - -/* rxpcu_filter_pass - * This MPDU passed the normal frame filter programming of rxpcu. - * - * rxpcu_filter_monitor_client - * This MPDU did not pass the regular frame filter and would - * have been dropped, were it not for the frame fitting into the - * 'monitor_client' category. - * - * rxpcu_filter_monitor_other - * This MPDU did not pass the regular frame filter and also did - * not pass the rxpcu_monitor_client filter. It would have been - * dropped accept that it did pass the 'monitor_other' category. - */ - -#define RX_DESC_INFO0_RXPCU_MPDU_FITLER GENMASK(1, 0) -#define RX_DESC_INFO0_SW_FRAME_GRP_ID GENMASK(8, 2) - -enum rx_desc_sw_frame_grp_id { - RX_DESC_SW_FRAME_GRP_ID_NDP_FRAME, - RX_DESC_SW_FRAME_GRP_ID_MCAST_DATA, - RX_DESC_SW_FRAME_GRP_ID_UCAST_DATA, - RX_DESC_SW_FRAME_GRP_ID_NULL_DATA, - RX_DESC_SW_FRAME_GRP_ID_MGMT_0000, - RX_DESC_SW_FRAME_GRP_ID_MGMT_0001, - RX_DESC_SW_FRAME_GRP_ID_MGMT_0010, - RX_DESC_SW_FRAME_GRP_ID_MGMT_0011, - RX_DESC_SW_FRAME_GRP_ID_MGMT_0100, - RX_DESC_SW_FRAME_GRP_ID_MGMT_0101, - RX_DESC_SW_FRAME_GRP_ID_MGMT_0110, - RX_DESC_SW_FRAME_GRP_ID_MGMT_0111, - RX_DESC_SW_FRAME_GRP_ID_MGMT_1000, - RX_DESC_SW_FRAME_GRP_ID_MGMT_1001, - RX_DESC_SW_FRAME_GRP_ID_MGMT_1010, - RX_DESC_SW_FRAME_GRP_ID_MGMT_1011, - RX_DESC_SW_FRAME_GRP_ID_MGMT_1100, - RX_DESC_SW_FRAME_GRP_ID_MGMT_1101, - RX_DESC_SW_FRAME_GRP_ID_MGMT_1110, - RX_DESC_SW_FRAME_GRP_ID_MGMT_1111, - RX_DESC_SW_FRAME_GRP_ID_CTRL_0000, - RX_DESC_SW_FRAME_GRP_ID_CTRL_0001, - RX_DESC_SW_FRAME_GRP_ID_CTRL_0010, - RX_DESC_SW_FRAME_GRP_ID_CTRL_0011, - RX_DESC_SW_FRAME_GRP_ID_CTRL_0100, - RX_DESC_SW_FRAME_GRP_ID_CTRL_0101, - RX_DESC_SW_FRAME_GRP_ID_CTRL_0110, - RX_DESC_SW_FRAME_GRP_ID_CTRL_0111, - RX_DESC_SW_FRAME_GRP_ID_CTRL_1000, - RX_DESC_SW_FRAME_GRP_ID_CTRL_1001, - RX_DESC_SW_FRAME_GRP_ID_CTRL_1010, - RX_DESC_SW_FRAME_GRP_ID_CTRL_1011, - RX_DESC_SW_FRAME_GRP_ID_CTRL_1100, - RX_DESC_SW_FRAME_GRP_ID_CTRL_1101, - RX_DESC_SW_FRAME_GRP_ID_CTRL_1110, - RX_DESC_SW_FRAME_GRP_ID_CTRL_1111, - RX_DESC_SW_FRAME_GRP_ID_UNSUPPORTED, - RX_DESC_SW_FRAME_GRP_ID_PHY_ERR, -}; - -#define DP_MAX_NWIFI_HDR_LEN 30 - -#define DP_RX_MPDU_ERR_FCS BIT(0) -#define DP_RX_MPDU_ERR_DECRYPT BIT(1) -#define DP_RX_MPDU_ERR_TKIP_MIC BIT(2) -#define DP_RX_MPDU_ERR_AMSDU_ERR BIT(3) -#define DP_RX_MPDU_ERR_OVERFLOW BIT(4) -#define DP_RX_MPDU_ERR_MSDU_LEN BIT(5) -#define DP_RX_MPDU_ERR_MPDU_LEN BIT(6) -#define DP_RX_MPDU_ERR_UNENCRYPTED_FRAME BIT(7) - enum dp_rx_decap_type { DP_RX_DECAP_TYPE_RAW, DP_RX_DECAP_TYPE_NATIVE_WIFI, @@ -10886,61 +10883,332 @@ enum rx_desc_decrypt_status_code { RX_DESC_DECRYPT_STATUS_CODE_OTHER, }; -#define RX_ATTENTION_INFO1_FIRST_MPDU BIT(0) -#define RX_ATTENTION_INFO1_RSVD_1A BIT(1) -#define RX_ATTENTION_INFO1_MCAST_BCAST BIT(2) -#define RX_ATTENTION_INFO1_AST_IDX_NOT_FOUND BIT(3) -#define RX_ATTENTION_INFO1_AST_IDX_TIMEDOUT BIT(4) -#define RX_ATTENTION_INFO1_POWER_MGMT BIT(5) -#define RX_ATTENTION_INFO1_NON_QOS BIT(6) -#define RX_ATTENTION_INFO1_NULL_DATA BIT(7) -#define RX_ATTENTION_INFO1_MGMT_TYPE BIT(8) -#define RX_ATTENTION_INFO1_CTRL_TYPE BIT(9) -#define RX_ATTENTION_INFO1_MORE_DATA BIT(10) -#define RX_ATTENTION_INFO1_EOSP BIT(11) -#define RX_ATTENTION_INFO1_A_MSDU_ERROR BIT(12) -#define RX_ATTENTION_INFO1_FRAGMENT BIT(13) -#define RX_ATTENTION_INFO1_ORDER BIT(14) -#define RX_ATTENTION_INFO1_CCE_MATCH BIT(15) -#define RX_ATTENTION_INFO1_OVERFLOW_ERR BIT(16) -#define RX_ATTENTION_INFO1_MSDU_LEN_ERR BIT(17) -#define RX_ATTENTION_INFO1_TCP_UDP_CKSUM_FAIL BIT(18) -#define RX_ATTENTION_INFO1_IP_CKSUM_FAIL BIT(19) -#define RX_ATTENTION_INFO1_SA_IDX_INVALID BIT(20) -#define RX_ATTENTION_INFO1_DA_IDX_INVALID BIT(21) -#define RX_ATTENTION_INFO1_RSVD_1B BIT(22) -#define RX_ATTENTION_INFO1_RX_IN_TX_DECRYPT_BYP BIT(23) -#define RX_ATTENTION_INFO1_ENCRYPT_REQUIRED BIT(24) -#define RX_ATTENTION_INFO1_DIRECTED BIT(25) -#define RX_ATTENTION_INFO1_BUFFER_FRAGMENT BIT(26) -#define RX_ATTENTION_INFO1_MPDU_LEN_ERR BIT(27) -#define RX_ATTENTION_INFO1_TKIP_MIC_ERR BIT(28) -#define RX_ATTENTION_INFO1_DECRYPT_ERR BIT(29) -#define RX_ATTENTION_INFO1_UNDECRYPT_FRAME_ERR BIT(30) -#define RX_ATTENTION_INFO1_FCS_ERR BIT(31) +#define RX_MPDU_START_INFO0_REO_DEST_IND GENMASK(4, 0) +#define RX_MPDU_START_INFO0_LMAC_PEER_ID_MSB GENMASK(6, 5) +#define RX_MPDU_START_INFO0_FLOW_ID_TOEPLITZ BIT(7) +#define RX_MPDU_START_INFO0_PKT_SEL_FP_UCAST_DATA BIT(8) +#define RX_MPDU_START_INFO0_PKT_SEL_FP_MCAST_DATA BIT(9) +#define RX_MPDU_START_INFO0_PKT_SEL_FP_CTRL_BAR BIT(10) +#define RX_MPDU_START_INFO0_RXDMA0_SRC_RING_SEL GENMASK(13, 11) +#define RX_MPDU_START_INFO0_RXDMA0_DST_RING_SEL GENMASK(16, 14) +#define RX_MPDU_START_INFO0_MCAST_ECHO_DROP_EN BIT(17) +#define RX_MPDU_START_INFO0_WDS_LEARN_DETECT_EN BIT(18) +#define RX_MPDU_START_INFO0_INTRA_BSS_CHECK_EN BIT(19) +#define RX_MPDU_START_INFO0_USE_PPE BIT(20) +#define RX_MPDU_START_INFO0_PPE_ROUTING_EN BIT(21) -#define RX_ATTENTION_INFO2_FLOW_IDX_TIMEOUT BIT(0) -#define RX_ATTENTION_INFO2_FLOW_IDX_INVALID BIT(1) -#define RX_ATTENTION_INFO2_WIFI_PARSER_ERR BIT(2) -#define RX_ATTENTION_INFO2_AMSDU_PARSER_ERR BIT(3) -#define RX_ATTENTION_INFO2_SA_IDX_TIMEOUT BIT(4) -#define RX_ATTENTION_INFO2_DA_IDX_TIMEOUT BIT(5) -#define RX_ATTENTION_INFO2_MSDU_LIMIT_ERR BIT(6) -#define RX_ATTENTION_INFO2_DA_IS_VALID BIT(7) -#define RX_ATTENTION_INFO2_DA_IS_MCBC BIT(8) -#define RX_ATTENTION_INFO2_SA_IS_VALID BIT(9) -#define RX_ATTENTION_INFO2_DCRYPT_STATUS_CODE GENMASK(12, 10) -#define RX_ATTENTION_INFO2_RX_BITMAP_NOT_UPDED BIT(13) -#define RX_ATTENTION_INFO2_MSDU_DONE BIT(31) +#define RX_MPDU_START_INFO1_REO_QUEUE_DESC_HI GENMASK(7, 0) +#define RX_MPDU_START_INFO1_RECV_QUEUE_NUM GENMASK(23, 8) +#define RX_MPDU_START_INFO1_PRE_DELIM_ERR_WARN BIT(24) +#define RX_MPDU_START_INFO1_FIRST_DELIM_ERR BIT(25) -struct rx_attention { - uint16_t info0; - uint16_t phy_ppdu_id; +#define RX_MPDU_START_INFO2_EPD_EN BIT(0) +#define RX_MPDU_START_INFO2_ALL_FRAME_ENCPD BIT(1) +#define RX_MPDU_START_INFO2_ENC_TYPE GENMASK(5, 2) +#define RX_MPDU_START_INFO2_VAR_WEP_KEY_WIDTH GENMASK(7, 6) +#define RX_MPDU_START_INFO2_MESH_STA GENMASK(9, 8) +#define RX_MPDU_START_INFO2_BSSID_HIT BIT(10) +#define RX_MPDU_START_INFO2_BSSID_NUM GENMASK(14, 11) +#define RX_MPDU_START_INFO2_TID GENMASK(18, 15) + +#define RX_MPDU_START_INFO3_RXPCU_MPDU_FLTR GENMASK(1, 0) +#define RX_MPDU_START_INFO3_SW_FRAME_GRP_ID GENMASK(8, 2) +#define RX_MPDU_START_INFO3_NDP_FRAME BIT(9) +#define RX_MPDU_START_INFO3_PHY_ERR BIT(10) +#define RX_MPDU_START_INFO3_PHY_ERR_MPDU_HDR BIT(11) +#define RX_MPDU_START_INFO3_PROTO_VER_ERR BIT(12) +#define RX_MPDU_START_INFO3_AST_LOOKUP_VALID BIT(13) +#define RX_MPDU_START_INFO3_RANGING BIT(14) + +#define RX_MPDU_START_INFO4_MPDU_FCTRL_VALID BIT(0) +#define RX_MPDU_START_INFO4_MPDU_DUR_VALID BIT(1) +#define RX_MPDU_START_INFO4_MAC_ADDR1_VALID BIT(2) +#define RX_MPDU_START_INFO4_MAC_ADDR2_VALID BIT(3) +#define RX_MPDU_START_INFO4_MAC_ADDR3_VALID BIT(4) +#define RX_MPDU_START_INFO4_MAC_ADDR4_VALID BIT(5) +#define RX_MPDU_START_INFO4_MPDU_SEQ_CTRL_VALID BIT(6) +#define RX_MPDU_START_INFO4_MPDU_QOS_CTRL_VALID BIT(7) +#define RX_MPDU_START_INFO4_MPDU_HT_CTRL_VALID BIT(8) +#define RX_MPDU_START_INFO4_ENCRYPT_INFO_VALID BIT(9) +#define RX_MPDU_START_INFO4_MPDU_FRAG_NUMBER GENMASK(13, 10) +#define RX_MPDU_START_INFO4_MORE_FRAG_FLAG BIT(14) +#define RX_MPDU_START_INFO4_FROM_DS BIT(16) +#define RX_MPDU_START_INFO4_TO_DS BIT(17) +#define RX_MPDU_START_INFO4_ENCRYPTED BIT(18) +#define RX_MPDU_START_INFO4_MPDU_RETRY BIT(19) +#define RX_MPDU_START_INFO4_MPDU_SEQ_NUM GENMASK(31, 20) + +#define RX_MPDU_START_INFO5_KEY_ID GENMASK(7, 0) +#define RX_MPDU_START_INFO5_NEW_PEER_ENTRY BIT(8) +#define RX_MPDU_START_INFO5_DECRYPT_NEEDED BIT(9) +#define RX_MPDU_START_INFO5_DECAP_TYPE GENMASK(11, 10) +#define RX_MPDU_START_INFO5_VLAN_TAG_C_PADDING BIT(12) +#define RX_MPDU_START_INFO5_VLAN_TAG_S_PADDING BIT(13) +#define RX_MPDU_START_INFO5_STRIP_VLAN_TAG_C BIT(14) +#define RX_MPDU_START_INFO5_STRIP_VLAN_TAG_S BIT(15) +#define RX_MPDU_START_INFO5_PRE_DELIM_COUNT GENMASK(27, 16) +#define RX_MPDU_START_INFO5_AMPDU_FLAG BIT(28) +#define RX_MPDU_START_INFO5_BAR_FRAME BIT(29) +#define RX_MPDU_START_INFO5_RAW_MPDU BIT(30) + +#define RX_MPDU_START_INFO6_MPDU_LEN GENMASK(13, 0) +#define RX_MPDU_START_INFO6_FIRST_MPDU BIT(14) +#define RX_MPDU_START_INFO6_MCAST_BCAST BIT(15) +#define RX_MPDU_START_INFO6_AST_IDX_NOT_FOUND BIT(16) +#define RX_MPDU_START_INFO6_AST_IDX_TIMEOUT BIT(17) +#define RX_MPDU_START_INFO6_POWER_MGMT BIT(18) +#define RX_MPDU_START_INFO6_NON_QOS BIT(19) +#define RX_MPDU_START_INFO6_NULL_DATA BIT(20) +#define RX_MPDU_START_INFO6_MGMT_TYPE BIT(21) +#define RX_MPDU_START_INFO6_CTRL_TYPE BIT(22) +#define RX_MPDU_START_INFO6_MORE_DATA BIT(23) +#define RX_MPDU_START_INFO6_EOSP BIT(24) +#define RX_MPDU_START_INFO6_FRAGMENT BIT(25) +#define RX_MPDU_START_INFO6_ORDER BIT(26) +#define RX_MPDU_START_INFO6_UAPSD_TRIGGER BIT(27) +#define RX_MPDU_START_INFO6_ENCRYPT_REQUIRED BIT(28) +#define RX_MPDU_START_INFO6_DIRECTED BIT(29) +#define RX_MPDU_START_INFO6_AMSDU_PRESENT BIT(30) + +#define RX_MPDU_START_INFO7_VDEV_ID GENMASK(7, 0) +#define RX_MPDU_START_INFO7_SERVICE_CODE GENMASK(16, 8) +#define RX_MPDU_START_INFO7_PRIORITY_VALID BIT(17) +#define RX_MPDU_START_INFO7_SRC_INFO GENMASK(29, 18) + +#define RX_MPDU_START_INFO8_AUTH_TO_SEND_WDS BIT(0) + +struct rx_mpdu_start_qcn9274 { + uint32_t info0; + uint32_t reo_queue_desc_lo; uint32_t info1; + uint32_t pn[4]; uint32_t info2; + uint32_t peer_meta_data; + uint16_t info3; + uint16_t phy_ppdu_id; + uint16_t ast_index; + uint16_t sw_peer_id; + uint32_t info4; + uint32_t info5; + uint32_t info6; + uint16_t frame_ctrl; + uint16_t duration; + uint8_t addr1[IEEE80211_ADDR_LEN]; + uint8_t addr2[IEEE80211_ADDR_LEN]; + uint8_t addr3[IEEE80211_ADDR_LEN]; + uint16_t seq_ctrl; + uint8_t addr4[IEEE80211_ADDR_LEN]; + uint16_t qos_ctrl; + uint32_t ht_ctrl; + uint32_t info7; + uint8_t multi_link_addr1[IEEE80211_ADDR_LEN]; + uint8_t multi_link_addr2[IEEE80211_ADDR_LEN]; + uint32_t info8; + uint32_t res0; + uint32_t res1; } __packed; -/* rx_attention +#define QCN9274_MPDU_START_SELECT_MPDU_START_TAG BIT(0) +#define QCN9274_MPDU_START_SELECT_INFO0_REO_QUEUE_DESC_LO BIT(1) +#define QCN9274_MPDU_START_SELECT_INFO1_PN_31_0 BIT(2) +#define QCN9274_MPDU_START_SELECT_PN_95_32 BIT(3) +#define QCN9274_MPDU_START_SELECT_PN_127_96_INFO2 BIT(4) +#define QCN9274_MPDU_START_SELECT_PEER_MDATA_INFO3_PHY_PPDU_ID BIT(5) +#define QCN9274_MPDU_START_SELECT_AST_IDX_SW_PEER_ID_INFO4 BIT(6) +#define QCN9274_MPDU_START_SELECT_INFO5_INFO6 BIT(7) +#define QCN9274_MPDU_START_SELECT_FRAME_CTRL_DURATION_ADDR1_31_0 BIT(8) +#define QCN9274_MPDU_START_SELECT_ADDR2_47_0_ADDR1_47_32 BIT(9) +#define QCN9274_MPDU_START_SELECT_ADDR3_47_0_SEQ_CTRL BIT(10) +#define QCN9274_MPDU_START_SELECT_ADDR4_47_0_QOS_CTRL BIT(11) +#define QCN9274_MPDU_START_SELECT_HT_CTRL_INFO7 BIT(12) +#define QCN9274_MPDU_START_SELECT_ML_ADDR1_47_0_ML_ADDR2_15_0 BIT(13) +#define QCN9274_MPDU_START_SELECT_ML_ADDR2_47_16_INFO8 BIT(14) +#define QCN9274_MPDU_START_SELECT_RES_0_RES_1 BIT(15) + +#define QCN9274_MPDU_START_WMASK (QCN9274_MPDU_START_SELECT_INFO1_PN_31_0 | \ + QCN9274_MPDU_START_SELECT_PN_95_32 | \ + QCN9274_MPDU_START_SELECT_PN_127_96_INFO2 | \ + QCN9274_MPDU_START_SELECT_PEER_MDATA_INFO3_PHY_PPDU_ID | \ + QCN9274_MPDU_START_SELECT_AST_IDX_SW_PEER_ID_INFO4 | \ + QCN9274_MPDU_START_SELECT_INFO5_INFO6 | \ + QCN9274_MPDU_START_SELECT_FRAME_CTRL_DURATION_ADDR1_31_0 | \ + QCN9274_MPDU_START_SELECT_ADDR2_47_0_ADDR1_47_32 | \ + QCN9274_MPDU_START_SELECT_ADDR3_47_0_SEQ_CTRL | \ + QCN9274_MPDU_START_SELECT_ADDR4_47_0_QOS_CTRL) + +/* The below rx_mpdu_start_qcn9274_compact structure is tied with the mask + * value QCN9274_MPDU_START_WMASK. If the mask value changes the structure + * will also change. + */ + +struct rx_mpdu_start_qcn9274_compact { + uint32_t info1; + uint32_t pn[4]; + uint32_t info2; + uint32_t peer_meta_data; + uint16_t info3; + uint16_t phy_ppdu_id; + uint16_t ast_index; + uint16_t sw_peer_id; + uint32_t info4; + uint32_t info5; + uint32_t info6; + uint16_t frame_ctrl; + uint16_t duration; + uint8_t addr1[IEEE80211_ADDR_LEN]; + uint8_t addr2[IEEE80211_ADDR_LEN]; + uint8_t addr3[IEEE80211_ADDR_LEN]; + uint16_t seq_ctrl; + uint8_t addr4[IEEE80211_ADDR_LEN]; + uint16_t qos_ctrl; +} __packed; + +/* rx_mpdu_start + * + * reo_destination_indication + * The id of the reo exit ring where the msdu frame shall push + * after (MPDU level) reordering has finished. Values are defined + * in enum %HAL_RX_MSDU_DESC_REO_DEST_IND_. + * + * lmac_peer_id_msb + * + * If use_flow_id_toeplitz_clfy is set and lmac_peer_id_'sb + * is 2'b00, Rx OLE uses a REO destination indicati'n of {1'b1, + * hash[3:0]} using the chosen Toeplitz hash from Common Parser + * if flow search fails. + * If use_flow_id_toeplitz_clfy is set and lmac_peer_id_msb + * 's not 2'b00, Rx OLE uses a REO destination indication of + * {lmac_peer_id_msb, hash[2:0]} using the chosen Toeplitz + * hash from Common Parser if flow search fails. + * + * use_flow_id_toeplitz_clfy + * Indication to Rx OLE to enable REO destination routing based + * on the chosen Toeplitz hash from Common Parser, in case + * flow search fails + * + * pkt_selection_fp_ucast_data + * Filter pass Unicast data frame (matching rxpcu_filter_pass + * and sw_frame_group_Unicast_data) routing selection + * + * pkt_selection_fp_mcast_data + * Filter pass Multicast data frame (matching rxpcu_filter_pass + * and sw_frame_group_Multicast_data) routing selection + * + * pkt_selection_fp_ctrl_bar + * Filter pass BAR frame (matching rxpcu_filter_pass + * and sw_frame_group_ctrl_1000) routing selection + * + * rxdma0_src_ring_selection + * Field only valid when for the received frame type the corresponding + * pkt_selection_fp_... bit is set + * + * rxdma0_dst_ring_selection + * Field only valid when for the received frame type the corresponding + * pkt_selection_fp_... bit is set + * + * mcast_echo_drop_enable + * If set, for multicast packets, multicast echo check (i.e. + * SA search with mcast_echo_check = 1) shall be performed + * by RXOLE, and any multicast echo packets should be indicated + * to RXDMA for release to WBM + * + * wds_learning_detect_en + * If set, WDS learning detection based on SA search and notification + * to FW (using RXDMA0 status ring) is enabled and the "timestamp" + * field in address search failure cache-only entry should + * be used to avoid multiple WDS learning notifications. + * + * intrabss_check_en + * If set, intra-BSS routing detection is enabled + * + * use_ppe + * Indicates to RXDMA to ignore the REO_destination_indication + * and use a programmed value corresponding to the REO2PPE + * ring + * This override to REO2PPE for packets requiring multiple + * buffers shall be disabled based on an RXDMA configuration, + * as PPE may not support such packets. + * + * Supported only in full AP chips, not in client/soft + * chips + * + * ppe_routing_enable + * Global enable/disable bit for routing to PPE, used to disable + * PPE routing even if RXOLE CCE or flow search indicate 'Use_PPE' + * This is set by SW for peers which are being handled by a + * host SW/accelerator subsystem that also handles packet + * buffer management for WiFi-to-PPE routing. + * + * This is cleared by SW for peers which are being handled + * by a different subsystem, completely disabling WiFi-to-PPE + * routing for such peers. + * + * rx_reo_queue_desc_addr_lo + * Address (lower 32 bits) of the REO queue descriptor. + * + * rx_reo_queue_desc_addr_hi + * Address (upper 8 bits) of the REO queue descriptor. + * + * receive_queue_number + * Indicates the MPDU queue ID to which this MPDU link + * descriptor belongs. + * + * pre_delim_err_warning + * Indicates that a delimiter FCS error was found in between the + * previous MPDU and this MPDU. Note that this is just a warning, + * and does not mean that this MPDU is corrupted in any way. If + * it is, there will be other errors indicated such as FCS or + * decrypt errors. + * + * first_delim_err + * Indicates that the first delimiter had a FCS failure. + * + * pn + * The PN number. + * + * epd_en + * Field only valid when AST_based_lookup_valid == 1. + * In case of ndp or phy_err or AST_based_lookup_valid == 0, + * this field will be set to 0 + * If set to one use EPD instead of LPD + * In case of ndp or phy_err, this field will never be set. + * + * all_frames_shall_be_encrypted + * In case of ndp or phy_err or AST_based_lookup_valid == 0, + * this field will be set to 0 + * + * When set, all frames (data only ?) shall be encrypted. If + * not, RX CRYPTO shall set an error flag. + * + * + * encrypt_type + * In case of ndp or phy_err or AST_based_lookup_valid == 0, + * this field will be set to 0 + * + * Indicates type of decrypt cipher used (as defined in the + * peer entry) + * + * wep_key_width_for_variable_key + * + * Field only valid when key_type is set to wep_varied_width. + * + * mesh_sta + * + * bssid_hit + * When set, the BSSID of the incoming frame matched one of + * the 8 BSSID register values + * bssid_number + * Field only valid when bssid_hit is set. + * This number indicates which one out of the 8 BSSID register + * values matched the incoming frame + * + * tid + * Field only valid when mpdu_qos_control_valid is set + * The TID field in the QoS control field + * + * peer_meta_data + * Meta data that SW has programmed in the Peer table entry + * of the transmitting STA. * * rxpcu_mpdu_filter_in_category * Field indicates what the reason was that this mpdu frame @@ -10951,10 +11219,157 @@ struct rx_attention { * SW processes frames based on certain classifications. Values * are defined in enum %RX_DESC_SW_FRAME_GRP_ID_*. * + * ndp_frame + * When set, the received frame was an NDP frame, and thus + * there will be no MPDU data. + * phy_err + * When set, a PHY error was received before MAC received any + * data, and thus there will be no MPDU data. + * + * phy_err_during_mpdu_header + * When set, a PHY error was received before MAC received the + * complete MPDU header which was needed for proper decoding + * + * protocol_version_err + * Set when RXPCU detected a version error in the Frame control + * field + * + * ast_based_lookup_valid + * When set, AST based lookup for this frame has found a valid + * result. + * + * ranging + * When set, a ranging NDPA or a ranging NDP was received. + * * phy_ppdu_id * A ppdu counter value that PHY increments for every PPDU * received. The counter value wraps around. * + * ast_index + * + * This field indicates the index of the AST entry corresponding + * to this MPDU. It is provided by the GSE module instantiated + * in RXPCU. + * A value of 0xFFFF indicates an invalid AST index, meaning + * that No AST entry was found or NO AST search was performed + * + * sw_peer_id + * In case of ndp or phy_err or AST_based_lookup_valid == 0, + * this field will be set to 0 + * This field indicates a unique peer identifier. It is set + * equal to field 'sw_peer_id' from the AST entry + * + * frame_control_valid + * When set, the field Mpdu_Frame_control_field has valid information + * + * frame_duration_valid + * When set, the field Mpdu_duration_field has valid information + * + * mac_addr_ad1..4_valid + * When set, the fields mac_addr_adx_..... have valid information + * + * mpdu_seq_ctrl_valid + * + * When set, the fields mpdu_sequence_control_field and mpdu_sequence_number + * have valid information as well as field + * For MPDUs without a sequence control field, this field will + * not be set. + * + * mpdu_qos_ctrl_valid, mpdu_ht_ctrl_valid + * + * When set, the field mpdu_qos_control_field, mpdu_ht_control has valid + * information, For MPDUs without a QoS,HT control field, this field + * will not be set. + * + * frame_encryption_info_valid + * + * When set, the encryption related info fields, like IV and + * PN are valid + * For MPDUs that are not encrypted, this will not be set. + * + * mpdu_fragment_number + * + * Field only valid when Mpdu_sequence_control_valid is set + * AND Fragment_flag is set. The fragment number from the 802.11 header + * + * more_fragment_flag + * + * The More Fragment bit setting from the MPDU header of the + * received frame + * + * fr_ds + * + * Field only valid when Mpdu_frame_control_valid is set + * Set if the from DS bit is set in the frame control. + * + * to_ds + * + * Field only valid when Mpdu_frame_control_valid is set + * Set if the to DS bit is set in the frame control. + * + * encrypted + * + * Field only valid when Mpdu_frame_control_valid is set. + * Protected bit from the frame control. + * + * mpdu_retry + * Field only valid when Mpdu_frame_control_valid is set. + * Retry bit from the frame control. Only valid when first_msdu is set + * + * mpdu_sequence_number + * Field only valid when Mpdu_sequence_control_valid is set. + * + * The sequence number from the 802.11 header. + * key_id + * The key ID octet from the IV. + * Field only valid when Frame_encryption_info_valid is set + * + * new_peer_entry + * Set if new RX_PEER_ENTRY TLV follows. If clear, RX_PEER_ENTRY + * doesn't follow so RX DECRYPTION module either uses old peer + * entry or not decrypt. + * + * decrypt_needed + * When RXPCU sets bit 'ast_index_not_found or ast_index_timeout', + * RXPCU will also ensure that this bit is NOT set. CRYPTO for that + * reason only needs to evaluate this bit and non of the other ones + * + * decap_type + * Used by the OLE during decapsulation. Values are defined in + * enum %MPDU_START_DECAP_TYPE_*. + * + * rx_insert_vlan_c_tag_padding + * rx_insert_vlan_s_tag_padding + * Insert 4 byte of all zeros as VLAN tag or double VLAN tag if + * the rx payload does not have VLAN. + * + * strip_vlan_c_tag_decap + * strip_vlan_s_tag_decap + * Strip VLAN or double VLAN during decapsulation. + * + * pre_delim_count + * The number of delimiters before this MPDU. Note that this + * number is cleared at PPDU start. If this MPDU is the first + * received MPDU in the PPDU and this MPDU gets filtered-in, + * this field will indicate the number of delimiters located + * after the last MPDU in the previous PPDU. + * + * If this MPDU is located after the first received MPDU in + * an PPDU, this field will indicate the number of delimiters + * located between the previous MPDU and this MPDU. + * + * ampdu_flag + * Received frame was part of an A-MPDU. + * + * bar_frame + * Received frame is a BAR frame + * + * raw_mpdu + * Set when no 802.11 to nwifi/ethernet hdr conversion is done + * + * mpdu_length + * MPDU length before decapsulation. + * * first_mpdu * Indicates the first MSDU of the PPDU. If both first_mpdu * and last_mpdu are set in the MSDU then this is a not an @@ -11005,57 +11420,16 @@ struct rx_attention { * Set if the EOSP (end of service period) bit in the QoS * control field is set. Only set when first_msdu is set. * - * a_msdu_error - * Set if number of MSDUs in A-MSDU is above a threshold or if the - * size of the MSDU is invalid. This receive buffer will contain - * all of the remainder of MSDUs in this MPDU w/o decapsulation. * - * fragment - * Indicates that this is an 802.11 fragment frame. This is - * set when either the more_frag bit is set in the frame - * control or the fragment number is not zero. Only set when - * first_msdu is set. + * fragment_flag + * Fragment indication * * order - * Set if the order bit in the frame control is set. Only set - * when first_msdu is set. + * Set if the order bit in the frame control is set. Only + * set when first_msdu is set. * - * cce_match - * Indicates that this status has a corresponding MSDU that - * requires FW processing. The OLE will have classification - * ring mask registers which will indicate the ring(s) for - * packets and descriptors which need FW attention. - * - * overflow_err - * PCU Receive FIFO does not have enough space to store the - * full receive packet. Enough space is reserved in the - * receive FIFO for the status is written. This MPDU remaining - * packets in the PPDU will be filtered and no Ack response - * will be transmitted. - * - * msdu_length_err - * Indicates that the MSDU length from the 802.3 encapsulated - * length field extends beyond the MPDU boundary. - * - * tcp_udp_chksum_fail - * Indicates that the computed checksum (tcp_udp_chksum) did - * not match the checksum in the TCP/UDP header. - * - * ip_chksum_fail - * Indicates that the computed checksum did not match the - * checksum in the IP header. - * - * sa_idx_invalid - * Indicates no matching entry was found in the address search - * table for the source MAC address. - * - * da_idx_invalid - * Indicates no matching entry was found in the address search - * table for the destination MAC address. - * - * rx_in_tx_decrypt_byp - * Indicates that RX packet is not decrypted as Crypto is busy - * with TX packet processing. + * u_apsd_trigger + * U-APSD trigger frame * * encrypt_required * Indicates that this data type frame is not encrypted even if @@ -11067,475 +11441,54 @@ struct rx_attention { * our STA addresses. In proxySTA it means that the TA matched * an entry in our address search table with the corresponding * 'no_ack' bit is the address search entry cleared. + * amsdu_present + * AMSDU present * - * buffer_fragment - * Indicates that at least one of the rx buffers has been - * fragmented. If set the FW should look at the rx_frag_info - * descriptor described below. + * mpdu_frame_control_field + * Frame control field in header. Only valid when the field is marked valid. * - * mpdu_length_err - * Indicates that the MPDU was pre-maturely terminated - * resulting in a truncated MPDU. Don't trust the MPDU length - * field. + * mpdu_duration_field + * Duration field in header. Only valid when the field is marked valid. * - * tkip_mic_err - * Indicates that the MPDU Michael integrity check failed + * mac_addr_adx + * MAC addresses in the received frame. Only valid when corresponding + * address valid bit is set * - * decrypt_err - * Indicates that the MPDU decrypt integrity check failed + * mpdu_qos_control_field, mpdu_ht_control_field + * QoS/HT control fields from header. Valid only when corresponding fields + * are marked valid * - * fcs_err - * Indicates that the MPDU FCS check failed + * vdev_id + * Virtual device associated with this peer + * RXOLE uses this to determine intra-BSS routing. * - * flow_idx_timeout - * Indicates an unsuccessful flow search due to the expiring of - * the search timer. + * service_code + * Opaque service code between PPE and Wi-Fi + * This field gets passed on by REO to PPE in the EDMA descriptor + * ('REO_TO_PPE_RING'). * - * flow_idx_invalid - * flow id is not valid. + * priority_valid + * This field gets passed on by REO to PPE in the EDMA descriptor + * ('REO_TO_PPE_RING'). * - * amsdu_parser_error - * A-MSDU could not be properly de-agregated. + * src_info + * Source (virtual) device/interface info. associated with + * this peer + * This field gets passed on by REO to PPE in the EDMA descriptor + * ('REO_TO_PPE_RING'). * - * sa_idx_timeout - * Indicates an unsuccessful search for the source MAC address - * due to the expiring of the search timer. + * multi_link_addr_ad1_ad2_valid + * If set, Rx OLE shall convert Address1 and Address2 of received + * data frames to multi-link addresses during decapsulation to eth/nwifi * - * da_idx_timeout - * Indicates an unsuccessful search for the destination MAC - * address due to the expiring of the search timer. + * multi_link_addr_ad1,ad2 + * Multi-link receiver address1,2. Only valid when corresponding + * valid bit is set * - * msdu_limit_error - * Indicates that the MSDU threshold was exceeded and thus - * all the rest of the MSDUs will not be scattered and will not - * be decapsulated but will be DMA'ed in RAW format as a single - * MSDU buffer. - * - * da_is_valid - * Indicates that OLE found a valid DA entry. - * - * da_is_mcbc - * Field Only valid if da_is_valid is set. Indicates the DA address - * was a Multicast or Broadcast address. - * - * sa_is_valid - * Indicates that OLE found a valid SA entry. - * - * decrypt_status_code - * Field provides insight into the decryption performed. Values are - * defined in enum %RX_DESC_DECRYPT_STATUS_CODE*. - * - * rx_bitmap_not_updated - * Frame is received, but RXPCU could not update the receive bitmap - * due to (temporary) fifo constraints. - * - * msdu_done - * If set indicates that the RX packet data, RX header data, RX - * PPDU start descriptor, RX MPDU start/end descriptor, RX MSDU - * start/end descriptors and RX Attention descriptor are all - * valid. This bit must be in the last octet of the - * descriptor. - */ - -#define RX_MPDU_START_INFO0_NDP_FRAME BIT(9) -#define RX_MPDU_START_INFO0_PHY_ERR BIT(10) -#define RX_MPDU_START_INFO0_PHY_ERR_MPDU_HDR BIT(11) -#define RX_MPDU_START_INFO0_PROTO_VER_ERR BIT(12) -#define RX_MPDU_START_INFO0_AST_LOOKUP_VALID BIT(13) - -#define RX_MPDU_START_INFO1_MPDU_FCTRL_VALID BIT(0) -#define RX_MPDU_START_INFO1_MPDU_DUR_VALID BIT(1) -#define RX_MPDU_START_INFO1_MAC_ADDR1_VALID BIT(2) -#define RX_MPDU_START_INFO1_MAC_ADDR2_VALID BIT(3) -#define RX_MPDU_START_INFO1_MAC_ADDR3_VALID BIT(4) -#define RX_MPDU_START_INFO1_MAC_ADDR4_VALID BIT(5) -#define RX_MPDU_START_INFO1_MPDU_SEQ_CTRL_VALID BIT(6) -#define RX_MPDU_START_INFO1_MPDU_QOS_CTRL_VALID BIT(7) -#define RX_MPDU_START_INFO1_MPDU_HT_CTRL_VALID BIT(8) -#define RX_MPDU_START_INFO1_ENCRYPT_INFO_VALID BIT(9) -#define RX_MPDU_START_INFO1_MPDU_FRAG_NUMBER GENMASK(13, 10) -#define RX_MPDU_START_INFO1_MORE_FRAG_FLAG BIT(14) -#define RX_MPDU_START_INFO1_FROM_DS BIT(16) -#define RX_MPDU_START_INFO1_TO_DS BIT(17) -#define RX_MPDU_START_INFO1_ENCRYPTED BIT(18) -#define RX_MPDU_START_INFO1_MPDU_RETRY BIT(19) -#define RX_MPDU_START_INFO1_MPDU_SEQ_NUM GENMASK(31, 20) - -#define RX_MPDU_START_INFO2_EPD_EN BIT(0) -#define RX_MPDU_START_INFO2_ALL_FRAME_ENCPD BIT(1) -#define RX_MPDU_START_INFO2_ENC_TYPE GENMASK(5, 2) -#define RX_MPDU_START_INFO2_VAR_WEP_KEY_WIDTH GENMASK(7, 6) -#define RX_MPDU_START_INFO2_MESH_STA BIT(8) -#define RX_MPDU_START_INFO2_BSSID_HIT BIT(9) -#define RX_MPDU_START_INFO2_BSSID_NUM GENMASK(13, 10) -#define RX_MPDU_START_INFO2_TID GENMASK(17, 14) -#define RX_MPDU_START_INFO2_TID_WCN6855 GENMASK(18, 15) - -#define RX_MPDU_START_INFO3_REO_DEST_IND GENMASK(4, 0) -#define RX_MPDU_START_INFO3_FLOW_ID_TOEPLITZ BIT(7) -#define RX_MPDU_START_INFO3_PKT_SEL_FP_UCAST_DATA BIT(8) -#define RX_MPDU_START_INFO3_PKT_SEL_FP_MCAST_DATA BIT(9) -#define RX_MPDU_START_INFO3_PKT_SEL_FP_CTRL_BAR BIT(10) -#define RX_MPDU_START_INFO3_RXDMA0_SRC_RING_SEL GENMASK(12, 11) -#define RX_MPDU_START_INFO3_RXDMA0_DST_RING_SEL GENMASK(14, 13) - -#define RX_MPDU_START_INFO4_REO_QUEUE_DESC_HI GENMASK(7, 0) -#define RX_MPDU_START_INFO4_RECV_QUEUE_NUM GENMASK(23, 8) -#define RX_MPDU_START_INFO4_PRE_DELIM_ERR_WARN BIT(24) -#define RX_MPDU_START_INFO4_FIRST_DELIM_ERR BIT(25) - -#define RX_MPDU_START_INFO5_KEY_ID GENMASK(7, 0) -#define RX_MPDU_START_INFO5_NEW_PEER_ENTRY BIT(8) -#define RX_MPDU_START_INFO5_DECRYPT_NEEDED BIT(9) -#define RX_MPDU_START_INFO5_DECAP_TYPE GENMASK(11, 10) -#define RX_MPDU_START_INFO5_VLAN_TAG_C_PADDING BIT(12) -#define RX_MPDU_START_INFO5_VLAN_TAG_S_PADDING BIT(13) -#define RX_MPDU_START_INFO5_STRIP_VLAN_TAG_C BIT(14) -#define RX_MPDU_START_INFO5_STRIP_VLAN_TAG_S BIT(15) -#define RX_MPDU_START_INFO5_PRE_DELIM_COUNT GENMASK(27, 16) -#define RX_MPDU_START_INFO5_AMPDU_FLAG BIT(28) -#define RX_MPDU_START_INFO5_BAR_FRAME BIT(29) - -#define RX_MPDU_START_INFO6_MPDU_LEN GENMASK(13, 0) -#define RX_MPDU_START_INFO6_FIRST_MPDU BIT(14) -#define RX_MPDU_START_INFO6_MCAST_BCAST BIT(15) -#define RX_MPDU_START_INFO6_AST_IDX_NOT_FOUND BIT(16) -#define RX_MPDU_START_INFO6_AST_IDX_TIMEOUT BIT(17) -#define RX_MPDU_START_INFO6_POWER_MGMT BIT(18) -#define RX_MPDU_START_INFO6_NON_QOS BIT(19) -#define RX_MPDU_START_INFO6_NULL_DATA BIT(20) -#define RX_MPDU_START_INFO6_MGMT_TYPE BIT(21) -#define RX_MPDU_START_INFO6_CTRL_TYPE BIT(22) -#define RX_MPDU_START_INFO6_MORE_DATA BIT(23) -#define RX_MPDU_START_INFO6_EOSP BIT(24) -#define RX_MPDU_START_INFO6_FRAGMENT BIT(25) -#define RX_MPDU_START_INFO6_ORDER BIT(26) -#define RX_MPDU_START_INFO6_UAPSD_TRIGGER BIT(27) -#define RX_MPDU_START_INFO6_ENCRYPT_REQUIRED BIT(28) -#define RX_MPDU_START_INFO6_DIRECTED BIT(29) - -#define RX_MPDU_START_RAW_MPDU BIT(0) - -struct rx_mpdu_start_ipq8074 { - uint16_t info0; - uint16_t phy_ppdu_id; - uint16_t ast_index; - uint16_t sw_peer_id; - uint32_t info1; - uint32_t info2; - uint32_t pn[4]; - uint32_t peer_meta_data; - uint32_t info3; - uint32_t reo_queue_desc_lo; - uint32_t info4; - uint32_t info5; - uint32_t info6; - uint16_t frame_ctrl; - uint16_t duration; - uint8_t addr1[IEEE80211_ADDR_LEN]; - uint8_t addr2[IEEE80211_ADDR_LEN]; - uint8_t addr3[IEEE80211_ADDR_LEN]; - uint16_t seq_ctrl; - uint8_t addr4[IEEE80211_ADDR_LEN]; - uint16_t qos_ctrl; - uint32_t ht_ctrl; - uint32_t raw; -} __packed; - -#define RX_MPDU_START_INFO7_REO_DEST_IND GENMASK(4, 0) -#define RX_MPDU_START_INFO7_LMAC_PEER_ID_MSB GENMASK(6, 5) -#define RX_MPDU_START_INFO7_FLOW_ID_TOEPLITZ BIT(7) -#define RX_MPDU_START_INFO7_PKT_SEL_FP_UCAST_DATA BIT(8) -#define RX_MPDU_START_INFO7_PKT_SEL_FP_MCAST_DATA BIT(9) -#define RX_MPDU_START_INFO7_PKT_SEL_FP_CTRL_BAR BIT(10) -#define RX_MPDU_START_INFO7_RXDMA0_SRC_RING_SEL GENMASK(12, 11) -#define RX_MPDU_START_INFO7_RXDMA0_DST_RING_SEL GENMASK(14, 13) - -#define RX_MPDU_START_INFO8_REO_QUEUE_DESC_HI GENMASK(7, 0) -#define RX_MPDU_START_INFO8_RECV_QUEUE_NUM GENMASK(23, 8) -#define RX_MPDU_START_INFO8_PRE_DELIM_ERR_WARN BIT(24) -#define RX_MPDU_START_INFO8_FIRST_DELIM_ERR BIT(25) - -#define RX_MPDU_START_INFO9_EPD_EN BIT(0) -#define RX_MPDU_START_INFO9_ALL_FRAME_ENCPD BIT(1) -#define RX_MPDU_START_INFO9_ENC_TYPE GENMASK(5, 2) -#define RX_MPDU_START_INFO9_VAR_WEP_KEY_WIDTH GENMASK(7, 6) -#define RX_MPDU_START_INFO9_MESH_STA GENMASK(9, 8) -#define RX_MPDU_START_INFO9_BSSID_HIT BIT(10) -#define RX_MPDU_START_INFO9_BSSID_NUM GENMASK(14, 11) -#define RX_MPDU_START_INFO9_TID GENMASK(18, 15) - -#define RX_MPDU_START_INFO10_RXPCU_MPDU_FLTR GENMASK(1, 0) -#define RX_MPDU_START_INFO10_SW_FRAME_GRP_ID GENMASK(8, 2) -#define RX_MPDU_START_INFO10_NDP_FRAME BIT(9) -#define RX_MPDU_START_INFO10_PHY_ERR BIT(10) -#define RX_MPDU_START_INFO10_PHY_ERR_MPDU_HDR BIT(11) -#define RX_MPDU_START_INFO10_PROTO_VER_ERR BIT(12) -#define RX_MPDU_START_INFO10_AST_LOOKUP_VALID BIT(13) - -#define RX_MPDU_START_INFO11_MPDU_FCTRL_VALID BIT(0) -#define RX_MPDU_START_INFO11_MPDU_DUR_VALID BIT(1) -#define RX_MPDU_START_INFO11_MAC_ADDR1_VALID BIT(2) -#define RX_MPDU_START_INFO11_MAC_ADDR2_VALID BIT(3) -#define RX_MPDU_START_INFO11_MAC_ADDR3_VALID BIT(4) -#define RX_MPDU_START_INFO11_MAC_ADDR4_VALID BIT(5) -#define RX_MPDU_START_INFO11_MPDU_SEQ_CTRL_VALID BIT(6) -#define RX_MPDU_START_INFO11_MPDU_QOS_CTRL_VALID BIT(7) -#define RX_MPDU_START_INFO11_MPDU_HT_CTRL_VALID BIT(8) -#define RX_MPDU_START_INFO11_ENCRYPT_INFO_VALID BIT(9) -#define RX_MPDU_START_INFO11_MPDU_FRAG_NUMBER GENMASK(13, 10) -#define RX_MPDU_START_INFO11_MORE_FRAG_FLAG BIT(14) -#define RX_MPDU_START_INFO11_FROM_DS BIT(16) -#define RX_MPDU_START_INFO11_TO_DS BIT(17) -#define RX_MPDU_START_INFO11_ENCRYPTED BIT(18) -#define RX_MPDU_START_INFO11_MPDU_RETRY BIT(19) -#define RX_MPDU_START_INFO11_MPDU_SEQ_NUM GENMASK(31, 20) - -#define RX_MPDU_START_INFO12_KEY_ID GENMASK(7, 0) -#define RX_MPDU_START_INFO12_NEW_PEER_ENTRY BIT(8) -#define RX_MPDU_START_INFO12_DECRYPT_NEEDED BIT(9) -#define RX_MPDU_START_INFO12_DECAP_TYPE GENMASK(11, 10) -#define RX_MPDU_START_INFO12_VLAN_TAG_C_PADDING BIT(12) -#define RX_MPDU_START_INFO12_VLAN_TAG_S_PADDING BIT(13) -#define RX_MPDU_START_INFO12_STRIP_VLAN_TAG_C BIT(14) -#define RX_MPDU_START_INFO12_STRIP_VLAN_TAG_S BIT(15) -#define RX_MPDU_START_INFO12_PRE_DELIM_COUNT GENMASK(27, 16) -#define RX_MPDU_START_INFO12_AMPDU_FLAG BIT(28) -#define RX_MPDU_START_INFO12_BAR_FRAME BIT(29) -#define RX_MPDU_START_INFO12_RAW_MPDU BIT(30) - -#define RX_MPDU_START_INFO13_MPDU_LEN GENMASK(13, 0) -#define RX_MPDU_START_INFO13_FIRST_MPDU BIT(14) -#define RX_MPDU_START_INFO13_MCAST_BCAST BIT(15) -#define RX_MPDU_START_INFO13_AST_IDX_NOT_FOUND BIT(16) -#define RX_MPDU_START_INFO13_AST_IDX_TIMEOUT BIT(17) -#define RX_MPDU_START_INFO13_POWER_MGMT BIT(18) -#define RX_MPDU_START_INFO13_NON_QOS BIT(19) -#define RX_MPDU_START_INFO13_NULL_DATA BIT(20) -#define RX_MPDU_START_INFO13_MGMT_TYPE BIT(21) -#define RX_MPDU_START_INFO13_CTRL_TYPE BIT(22) -#define RX_MPDU_START_INFO13_MORE_DATA BIT(23) -#define RX_MPDU_START_INFO13_EOSP BIT(24) -#define RX_MPDU_START_INFO13_FRAGMENT BIT(25) -#define RX_MPDU_START_INFO13_ORDER BIT(26) -#define RX_MPDU_START_INFO13_UAPSD_TRIGGER BIT(27) -#define RX_MPDU_START_INFO13_ENCRYPT_REQUIRED BIT(28) -#define RX_MPDU_START_INFO13_DIRECTED BIT(29) -#define RX_MPDU_START_INFO13_AMSDU_PRESENT BIT(30) - -struct rx_mpdu_start_qcn9074 { - uint32_t info7; - uint32_t reo_queue_desc_lo; - uint32_t info8; - uint32_t pn[4]; - uint32_t info9; - uint32_t peer_meta_data; - uint16_t info10; - uint16_t phy_ppdu_id; - uint16_t ast_index; - uint16_t sw_peer_id; - uint32_t info11; - uint32_t info12; - uint32_t info13; - uint16_t frame_ctrl; - uint16_t duration; - uint8_t addr1[IEEE80211_ADDR_LEN]; - uint8_t addr2[IEEE80211_ADDR_LEN]; - uint8_t addr3[IEEE80211_ADDR_LEN]; - uint16_t seq_ctrl; - uint8_t addr4[IEEE80211_ADDR_LEN]; - uint16_t qos_ctrl; - uint32_t ht_ctrl; -} __packed; - -struct rx_mpdu_start_wcn6855 { - uint32_t info3; - uint32_t reo_queue_desc_lo; - uint32_t info4; - uint32_t pn[4]; - uint32_t info2; - uint32_t peer_meta_data; - uint16_t info0; - uint16_t phy_ppdu_id; - uint16_t ast_index; - uint16_t sw_peer_id; - uint32_t info1; - uint32_t info5; - uint32_t info6; - uint16_t frame_ctrl; - uint16_t duration; - uint8_t addr1[IEEE80211_ADDR_LEN]; - uint8_t addr2[IEEE80211_ADDR_LEN]; - uint8_t addr3[IEEE80211_ADDR_LEN]; - uint16_t seq_ctrl; - uint8_t addr4[IEEE80211_ADDR_LEN]; - uint16_t qos_ctrl; - uint32_t ht_ctrl; -} __packed; - -/* rx_mpdu_start - * - * rxpcu_mpdu_filter_in_category - * Field indicates what the reason was that this mpdu frame - * was allowed to come into the receive path by rxpcu. Values - * are defined in enum %RX_DESC_RXPCU_FILTER_*. - * Note: for ndp frame, if it was expected because the preceding - * NDPA was filter_pass, the setting rxpcu_filter_pass will be - * used. This setting will also be used for every ndp frame in - * case Promiscuous mode is enabled. - * - * sw_frame_group_id - * SW processes frames based on certain classifications. Values - * are defined in enum %RX_DESC_SW_FRAME_GRP_ID_*. - * - * ndp_frame - * Indicates that the received frame was an NDP frame. - * - * phy_err - * Indicates that PHY error was received before MAC received data. - * - * phy_err_during_mpdu_header - * PHY error was received before MAC received the complete MPDU - * header which was needed for proper decoding. - * - * protocol_version_err - * RXPCU detected a version error in the frame control field. - * - * ast_based_lookup_valid - * AST based lookup for this frame has found a valid result. - * - * phy_ppdu_id - * A ppdu counter value that PHY increments for every PPDU - * received. The counter value wraps around. - * - * ast_index - * This field indicates the index of the AST entry corresponding - * to this MPDU. It is provided by the GSE module instantiated in - * RXPCU. A value of 0xFFFF indicates an invalid AST index. - * - * sw_peer_id - * This field indicates a unique peer identifier. It is set equal - * to field 'sw_peer_id' from the AST entry. - * - * mpdu_frame_control_valid, mpdu_duration_valid, mpdu_qos_control_valid, - * mpdu_ht_control_valid, frame_encryption_info_valid - * Indicates that each fields have valid entries. - * - * mac_addr_adx_valid - * Corresponding mac_addr_adx_{lo/hi} has valid entries. - * - * from_ds, to_ds - * Valid only when mpdu_frame_control_valid is set. Indicates that - * frame is received from DS and sent to DS. - * - * encrypted - * Protected bit from the frame control. - * - * mpdu_retry - * Retry bit from frame control. Only valid when first_msdu is set. - * - * mpdu_sequence_number - * The sequence number from the 802.11 header. - * - * epd_en - * If set, use EPD instead of LPD. - * - * all_frames_shall_be_encrypted - * If set, all frames (data only?) shall be encrypted. If not, - * RX CRYPTO shall set an error flag. - * - * encrypt_type - * Values are defined in enum %HAL_ENCRYPT_TYPE_. - * - * mesh_sta - * Indicates a Mesh (11s) STA. - * - * bssid_hit - * BSSID of the incoming frame matched one of the 8 BSSID - * register values. - * - * bssid_number - * This number indicates which one out of the 8 BSSID register - * values matched the incoming frame. - * - * tid - * TID field in the QoS control field - * - * pn - * The PN number. - * - * peer_meta_data - * Meta data that SW has programmed in the Peer table entry - * of the transmitting STA. - * - * rx_reo_queue_desc_addr_lo - * Address (lower 32 bits) of the REO queue descriptor. - * - * rx_reo_queue_desc_addr_hi - * Address (upper 8 bits) of the REO queue descriptor. - * - * receive_queue_number - * Indicates the MPDU queue ID to which this MPDU link - * descriptor belongs. - * - * pre_delim_err_warning - * Indicates that a delimiter FCS error was found in between the - * previous MPDU and this MPDU. Note that this is just a warning, - * and does not mean that this MPDU is corrupted in any way. If - * it is, there will be other errors indicated such as FCS or - * decrypt errors. - * - * first_delim_err - * Indicates that the first delimiter had a FCS failure. - * - * key_id - * The key ID octet from the IV. - * - * new_peer_entry - * Set if new RX_PEER_ENTRY TLV follows. If clear, RX_PEER_ENTRY - * doesn't follow so RX DECRYPTION module either uses old peer - * entry or not decrypt. - * - * decrypt_needed - * When RXPCU sets bit 'ast_index_not_found or ast_index_timeout', - * RXPCU will also ensure that this bit is NOT set. CRYPTO for that - * reason only needs to evaluate this bit and non of the other ones - * - * decap_type - * Used by the OLE during decapsulation. Values are defined in - * enum %MPDU_START_DECAP_TYPE_*. - * - * rx_insert_vlan_c_tag_padding - * rx_insert_vlan_s_tag_padding - * Insert 4 byte of all zeros as VLAN tag or double VLAN tag if - * the rx payload does not have VLAN. - * - * strip_vlan_c_tag_decap - * strip_vlan_s_tag_decap - * Strip VLAN or double VLAN during decapsulation. - * - * pre_delim_count - * The number of delimiters before this MPDU. Note that this - * number is cleared at PPDU start. If this MPDU is the first - * received MPDU in the PPDU and this MPDU gets filtered-in, - * this field will indicate the number of delimiters located - * after the last MPDU in the previous PPDU. - * - * If this MPDU is located after the first received MPDU in - * an PPDU, this field will indicate the number of delimiters - * located between the previous MPDU and this MPDU. - * - * ampdu_flag - * Received frame was part of an A-MPDU. - * - * bar_frame - * Received frame is a BAR frame - * - * mpdu_length - * MPDU length before decapsulation. - * - * first_mpdu..directed - * See definition in RX attention descriptor + * authorize_to_send_wds + * If not set, RXDMA shall perform error-routing for WDS packets + * as the sender is not authorized and might misuse WDS frame + * format to inject packets with arbitrary DA/SA. * */ @@ -11571,81 +11524,232 @@ enum rx_msdu_start_reception_type { RX_MSDU_START_RECEPTION_TYPE_UL_MU_OFDMA_MIMO, }; -#define RX_MSDU_START_INFO1_MSDU_LENGTH GENMASK(13, 0) -#define RX_MSDU_START_INFO1_RSVD_1A BIT(14) -#define RX_MSDU_START_INFO1_IPSEC_ESP BIT(15) -#define RX_MSDU_START_INFO1_L3_OFFSET GENMASK(22, 16) -#define RX_MSDU_START_INFO1_IPSEC_AH BIT(23) -#define RX_MSDU_START_INFO1_L4_OFFSET GENMASK(31, 24) +#define RX_MSDU_END_64_TLV_SRC_LINK_ID GENMASK(24, 22) -#define RX_MSDU_START_INFO2_MSDU_NUMBER GENMASK(7, 0) -#define RX_MSDU_START_INFO2_DECAP_TYPE GENMASK(9, 8) -#define RX_MSDU_START_INFO2_IPV4 BIT(10) -#define RX_MSDU_START_INFO2_IPV6 BIT(11) -#define RX_MSDU_START_INFO2_TCP BIT(12) -#define RX_MSDU_START_INFO2_UDP BIT(13) -#define RX_MSDU_START_INFO2_IP_FRAG BIT(14) -#define RX_MSDU_START_INFO2_TCP_ONLY_ACK BIT(15) -#define RX_MSDU_START_INFO2_DA_IS_BCAST_MCAST BIT(16) -#define RX_MSDU_START_INFO2_SELECTED_TOEPLITZ_HASH GENMASK(18, 17) -#define RX_MSDU_START_INFO2_IP_FIXED_HDR_VALID BIT(19) -#define RX_MSDU_START_INFO2_IP_EXTN_HDR_VALID BIT(20) -#define RX_MSDU_START_INFO2_IP_TCP_UDP_HDR_VALID BIT(21) -#define RX_MSDU_START_INFO2_MESH_CTRL_PRESENT BIT(22) -#define RX_MSDU_START_INFO2_LDPC BIT(23) -#define RX_MSDU_START_INFO2_IP4_IP6_NXT_HDR GENMASK(31, 24) -#define RX_MSDU_START_INFO2_DECAP_FORMAT GENMASK(9, 8) +#define RX_MSDU_END_INFO0_RXPCU_MPDU_FITLER GENMASK(1, 0) +#define RX_MSDU_END_INFO0_SW_FRAME_GRP_ID GENMASK(8, 2) -#define RX_MSDU_START_INFO3_USER_RSSI GENMASK(7, 0) -#define RX_MSDU_START_INFO3_PKT_TYPE GENMASK(11, 8) -#define RX_MSDU_START_INFO3_STBC BIT(12) -#define RX_MSDU_START_INFO3_SGI GENMASK(14, 13) -#define RX_MSDU_START_INFO3_RATE_MCS GENMASK(18, 15) -#define RX_MSDU_START_INFO3_RECV_BW GENMASK(20, 19) -#define RX_MSDU_START_INFO3_RECEPTION_TYPE GENMASK(23, 21) -#define RX_MSDU_START_INFO3_MIMO_SS_BITMAP GENMASK(31, 24) +#define RX_MSDU_END_INFO1_REPORTED_MPDU_LENGTH GENMASK(13, 0) -struct rx_msdu_start_ipq8074 { +#define RX_MSDU_END_INFO2_CCE_SUPER_RULE GENMASK(13, 8) +#define RX_MSDU_END_INFO2_CCND_TRUNCATE BIT(14) +#define RX_MSDU_END_INFO2_CCND_CCE_DIS BIT(15) + +#define RX_MSDU_END_INFO3_DA_OFFSET GENMASK(5, 0) +#define RX_MSDU_END_INFO3_SA_OFFSET GENMASK(11, 6) +#define RX_MSDU_END_INFO3_DA_OFFSET_VALID BIT(12) +#define RX_MSDU_END_INFO3_SA_OFFSET_VALID BIT(13) + +#define RX_MSDU_END_INFO4_TCP_FLAG GENMASK(8, 0) +#define RX_MSDU_END_INFO4_LRO_ELIGIBLE BIT(9) + +#define RX_MSDU_END_INFO5_SA_IDX_TIMEOUT BIT(0) +#define RX_MSDU_END_INFO5_DA_IDX_TIMEOUT BIT(1) +#define RX_MSDU_END_INFO5_TO_DS BIT(2) +#define RX_MSDU_END_INFO5_TID GENMASK(6, 3) +#define RX_MSDU_END_INFO5_SA_IS_VALID BIT(7) +#define RX_MSDU_END_INFO5_DA_IS_VALID BIT(8) +#define RX_MSDU_END_INFO5_DA_IS_MCBC BIT(9) +#define RX_MSDU_END_INFO5_L3_HDR_PADDING GENMASK(11, 10) +#define RX_MSDU_END_INFO5_FIRST_MSDU BIT(12) +#define RX_MSDU_END_INFO5_LAST_MSDU BIT(13) +#define RX_MSDU_END_INFO5_FROM_DS BIT(14) +#define RX_MSDU_END_INFO5_IP_CHKSUM_FAIL_COPY BIT(15) + +#define RX_MSDU_END_INFO6_MSDU_DROP BIT(0) +#define RX_MSDU_END_INFO6_REO_DEST_IND GENMASK(5, 1) +#define RX_MSDU_END_INFO6_FLOW_IDX GENMASK(25, 6) +#define RX_MSDU_END_INFO6_USE_PPE BIT(26) +#define RX_MSDU_END_INFO6_MESH_STA GENMASK(28, 27) +#define RX_MSDU_END_INFO6_VLAN_CTAG_STRIPPED BIT(29) +#define RX_MSDU_END_INFO6_VLAN_STAG_STRIPPED BIT(30) +#define RX_MSDU_END_INFO6_FRAGMENT_FLAG BIT(31) + +#define RX_MSDU_END_INFO7_AGGR_COUNT GENMASK(7, 0) +#define RX_MSDU_END_INFO7_FLOW_AGGR_CONTN BIT(8) +#define RX_MSDU_END_INFO7_FISA_TIMEOUT BIT(9) + +#define RX_MSDU_END_INFO7_TCPUDP_CSUM_FAIL_CPY BIT(10) +#define RX_MSDU_END_INFO7_MSDU_LIMIT_ERROR BIT(11) +#define RX_MSDU_END_INFO7_FLOW_IDX_TIMEOUT BIT(12) +#define RX_MSDU_END_INFO7_FLOW_IDX_INVALID BIT(13) +#define RX_MSDU_END_INFO7_CCE_MATCH BIT(14) +#define RX_MSDU_END_INFO7_AMSDU_PARSER_ERR BIT(15) + +#define RX_MSDU_END_INFO8_KEY_ID GENMASK(7, 0) + +#define RX_MSDU_END_INFO9_SERVICE_CODE GENMASK(14, 6) +#define RX_MSDU_END_INFO9_PRIORITY_VALID BIT(15) +#define RX_MSDU_END_INFO9_INRA_BSS BIT(16) +#define RX_MSDU_END_INFO9_DEST_CHIP_ID GENMASK(18, 17) +#define RX_MSDU_END_INFO9_MCAST_ECHO BIT(19) +#define RX_MSDU_END_INFO9_WDS_LEARN_EVENT BIT(20) +#define RX_MSDU_END_INFO9_WDS_ROAM_EVENT BIT(21) +#define RX_MSDU_END_INFO9_WDS_KEEP_ALIVE_EVENT BIT(22) + +#define RX_MSDU_END_INFO10_MSDU_LENGTH GENMASK(13, 0) +#define RX_MSDU_END_INFO10_STBC BIT(14) +#define RX_MSDU_END_INFO10_IPSEC_ESP BIT(15) +#define RX_MSDU_END_INFO10_L3_OFFSET GENMASK(22, 16) +#define RX_MSDU_END_INFO10_IPSEC_AH BIT(23) +#define RX_MSDU_END_INFO10_L4_OFFSET GENMASK(31, 24) + +#define RX_MSDU_END_INFO11_MSDU_NUMBER GENMASK(7, 0) +#define RX_MSDU_END_INFO11_DECAP_FORMAT GENMASK(9, 8) +#define RX_MSDU_END_INFO11_IPV4 BIT(10) +#define RX_MSDU_END_INFO11_IPV6 BIT(11) +#define RX_MSDU_END_INFO11_TCP BIT(12) +#define RX_MSDU_END_INFO11_UDP BIT(13) +#define RX_MSDU_END_INFO11_IP_FRAG BIT(14) +#define RX_MSDU_END_INFO11_TCP_ONLY_ACK BIT(15) +#define RX_MSDU_END_INFO11_DA_IS_BCAST_MCAST BIT(16) +#define RX_MSDU_END_INFO11_SEL_TOEPLITZ_HASH GENMASK(18, 17) +#define RX_MSDU_END_INFO11_IP_FIXED_HDR_VALID BIT(19) +#define RX_MSDU_END_INFO11_IP_EXTN_HDR_VALID BIT(20) +#define RX_MSDU_END_INFO11_IP_TCP_UDP_HDR_VALID BIT(21) +#define RX_MSDU_END_INFO11_MESH_CTRL_PRESENT BIT(22) +#define RX_MSDU_END_INFO11_LDPC BIT(23) +#define RX_MSDU_END_INFO11_IP4_IP6_NXT_HDR GENMASK(31, 24) + +#define RX_MSDU_END_INFO12_USER_RSSI GENMASK(7, 0) +#define RX_MSDU_END_INFO12_PKT_TYPE GENMASK(11, 8) +#define RX_MSDU_END_INFO12_SGI GENMASK(13, 12) +#define RX_MSDU_END_INFO12_RATE_MCS GENMASK(17, 14) +#define RX_MSDU_END_INFO12_RECV_BW GENMASK(20, 18) +#define RX_MSDU_END_INFO12_RECEPTION_TYPE GENMASK(23, 21) + +#define RX_MSDU_END_INFO12_MIMO_SS_BITMAP GENMASK(30, 24) +#define RX_MSDU_END_INFO12_MIMO_DONE_COPY BIT(31) + +#define RX_MSDU_END_INFO13_FIRST_MPDU BIT(0) +#define RX_MSDU_END_INFO13_MCAST_BCAST BIT(2) +#define RX_MSDU_END_INFO13_AST_IDX_NOT_FOUND BIT(3) +#define RX_MSDU_END_INFO13_AST_IDX_TIMEDOUT BIT(4) +#define RX_MSDU_END_INFO13_POWER_MGMT BIT(5) +#define RX_MSDU_END_INFO13_NON_QOS BIT(6) +#define RX_MSDU_END_INFO13_NULL_DATA BIT(7) +#define RX_MSDU_END_INFO13_MGMT_TYPE BIT(8) +#define RX_MSDU_END_INFO13_CTRL_TYPE BIT(9) +#define RX_MSDU_END_INFO13_MORE_DATA BIT(10) +#define RX_MSDU_END_INFO13_EOSP BIT(11) +#define RX_MSDU_END_INFO13_A_MSDU_ERROR BIT(12) +#define RX_MSDU_END_INFO13_ORDER BIT(14) +#define RX_MSDU_END_INFO13_OVERFLOW_ERR BIT(16) +#define RX_MSDU_END_INFO13_MSDU_LEN_ERR BIT(17) +#define RX_MSDU_END_INFO13_TCP_UDP_CKSUM_FAIL BIT(18) +#define RX_MSDU_END_INFO13_IP_CKSUM_FAIL BIT(19) +#define RX_MSDU_END_INFO13_SA_IDX_INVALID BIT(20) +#define RX_MSDU_END_INFO13_DA_IDX_INVALID BIT(21) +#define RX_MSDU_END_INFO13_AMSDU_ADDR_MISMATCH BIT(22) +#define RX_MSDU_END_INFO13_RX_IN_TX_DECRYPT_BYP BIT(23) +#define RX_MSDU_END_INFO13_ENCRYPT_REQUIRED BIT(24) +#define RX_MSDU_END_INFO13_DIRECTED BIT(25) +#define RX_MSDU_END_INFO13_BUFFER_FRAGMENT BIT(26) +#define RX_MSDU_END_INFO13_MPDU_LEN_ERR BIT(27) +#define RX_MSDU_END_INFO13_TKIP_MIC_ERR BIT(28) +#define RX_MSDU_END_INFO13_DECRYPT_ERR BIT(29) +#define RX_MSDU_END_INFO13_UNDECRYPT_FRAME_ERR BIT(30) +#define RX_MSDU_END_INFO13_FCS_ERR BIT(31) + +#define RX_MSDU_END_INFO13_WIFI_PARSER_ERR BIT(15) + +#define RX_MSDU_END_INFO14_DECRYPT_STATUS_CODE GENMASK(12, 10) +#define RX_MSDU_END_INFO14_RX_BITMAP_NOT_UPDED BIT(13) +#define RX_MSDU_END_INFO14_MSDU_DONE BIT(31) + +struct rx_msdu_end_qcn9274 { uint16_t info0; uint16_t phy_ppdu_id; - uint32_t info1; - uint32_t info2; - uint32_t toeplitz_hash; - uint32_t flow_id_toeplitz; - uint32_t info3; - uint32_t ppdu_start_timestamp; - uint32_t phy_meta_data; -} __packed; - -struct rx_msdu_start_qcn9074 { - uint16_t info0; - uint16_t phy_ppdu_id; - uint32_t info1; - uint32_t info2; - uint32_t toeplitz_hash; - uint32_t flow_id_toeplitz; - uint32_t info3; - uint32_t ppdu_start_timestamp; - uint32_t phy_meta_data; - uint16_t vlan_ctag_c1; - uint16_t vlan_stag_c1; -} __packed; - -struct rx_msdu_start_wcn6855 { - uint16_t info0; - uint16_t phy_ppdu_id; - uint32_t info1; - uint32_t info2; - uint32_t toeplitz_hash; - uint32_t flow_id_toeplitz; - uint32_t info3; - uint32_t ppdu_start_timestamp; - uint32_t phy_meta_data; + uint16_t ip_hdr_cksum; + uint16_t info1; + uint16_t info2; + uint16_t cumulative_l3_checksum; + uint32_t rule_indication0; + uint32_t ipv6_options_crc; + uint16_t info3; + uint16_t l3_type; + uint32_t rule_indication1; + uint32_t tcp_seq_num; + uint32_t tcp_ack_num; + uint16_t info4; + uint16_t window_size; + uint16_t sa_sw_peer_id; + uint16_t info5; + uint16_t sa_idx; + uint16_t da_idx_or_sw_peer_id; + uint32_t info6; + uint32_t fse_metadata; + uint16_t cce_metadata; + uint16_t tcp_udp_cksum; + uint16_t info7; + uint16_t cumulative_ip_length; + uint32_t info8; + uint32_t info9; + uint32_t info10; + uint32_t info11; uint16_t vlan_ctag_ci; uint16_t vlan_stag_ci; + uint32_t peer_meta_data; + uint32_t info12; + uint32_t flow_id_toeplitz; + uint32_t ppdu_start_timestamp_63_32; + uint32_t phy_meta_data; + uint32_t ppdu_start_timestamp_31_0; + uint32_t toeplitz_hash_2_or_4; + uint16_t res0; + uint16_t sa_15_0; + uint32_t sa_47_16; + uint32_t info13; + uint32_t info14; } __packed; -/* rx_msdu_start +#define QCN9274_MSDU_END_SELECT_MSDU_END_TAG BIT(0) +#define QCN9274_MSDU_END_SELECT_INFO0_PHY_PPDUID_IP_HDR_CSUM_INFO1 BIT(1) +#define QCN9274_MSDU_END_SELECT_INFO2_CUMULATIVE_CSUM_RULE_IND_0 BIT(2) +#define QCN9274_MSDU_END_SELECT_IPV6_OP_CRC_INFO3_TYPE13 BIT(3) +#define QCN9274_MSDU_END_SELECT_RULE_IND_1_TCP_SEQ_NUM BIT(4) +#define QCN9274_MSDU_END_SELECT_TCP_ACK_NUM_INFO4_WINDOW_SIZE BIT(5) +#define QCN9274_MSDU_END_SELECT_SA_SW_PER_ID_INFO5_SA_DA_ID BIT(6) +#define QCN9274_MSDU_END_SELECT_INFO6_FSE_METADATA BIT(7) +#define QCN9274_MSDU_END_SELECT_CCE_MDATA_TCP_UDP_CSUM_INFO7_IP_LEN BIT(8) +#define QCN9274_MSDU_END_SELECT_INFO8_INFO9 BIT(9) +#define QCN9274_MSDU_END_SELECT_INFO10_INFO11 BIT(10) +#define QCN9274_MSDU_END_SELECT_VLAN_CTAG_STAG_CI_PEER_MDATA BIT(11) +#define QCN9274_MSDU_END_SELECT_INFO12_AND_FLOW_ID_TOEPLITZ BIT(12) +#define QCN9274_MSDU_END_SELECT_PPDU_START_TS_63_32_PHY_MDATA BIT(13) +#define QCN9274_MSDU_END_SELECT_PPDU_START_TS_31_0_TOEPLITZ_HASH_2_4 BIT(14) +#define QCN9274_MSDU_END_SELECT_RES0_SA_47_0 BIT(15) +#define QCN9274_MSDU_END_SELECT_INFO13_INFO14 BIT(16) + +#define QCN9274_MSDU_END_WMASK (QCN9274_MSDU_END_SELECT_MSDU_END_TAG | \ + QCN9274_MSDU_END_SELECT_SA_SW_PER_ID_INFO5_SA_DA_ID | \ + QCN9274_MSDU_END_SELECT_INFO10_INFO11 | \ + QCN9274_MSDU_END_SELECT_INFO12_AND_FLOW_ID_TOEPLITZ | \ + QCN9274_MSDU_END_SELECT_PPDU_START_TS_63_32_PHY_MDATA | \ + QCN9274_MSDU_END_SELECT_INFO13_INFO14) + +/* The below rx_msdu_end_qcn9274_compact structure is tied with the mask value + * QCN9274_MSDU_END_WMASK. If the mask value changes the structure will also + * change. + */ + +struct rx_msdu_end_qcn9274_compact { + uint64_t msdu_end_tag; + uint16_t sa_sw_peer_id; + uint16_t info5; + uint16_t sa_idx; + uint16_t da_idx_or_sw_peer_id; + uint32_t info10; + uint32_t info11; + uint32_t info12; + uint32_t flow_id_toeplitz; + uint32_t ppdu_start_timestamp_63_32; + uint32_t phy_meta_data; + uint32_t info13; + uint32_t info14; +} __packed; + +/* rx_msdu_end * * rxpcu_mpdu_filter_in_category * Field indicates what the reason was that this mpdu frame @@ -11660,8 +11764,265 @@ struct rx_msdu_start_wcn6855 { * A ppdu counter value that PHY increments for every PPDU * received. The counter value wraps around. * + * ip_hdr_cksum + * This can include the IP header checksum or the pseudo + * header checksum used by TCP/UDP checksum. + * + * reported_mpdu_length + * MPDU length before decapsulation. Only valid when first_msdu is + * set. This field is taken directly from the length field of the + * A-MPDU delimiter or the preamble length field for non-A-MPDU + * frames. + * + * cce_super_rule + * Indicates the super filter rule. + * + * cce_classify_not_done_truncate + * Classification failed due to truncated frame. + * + * cce_classify_not_done_cce_dis + * Classification failed due to CCE global disable + * + * cumulative_l3_checksum + * FISA: IP header checksum including the total MSDU length + * that is part of this flow aggregated so far, reported if + * 'RXOLE_R0_FISA_CTRL. CHKSUM_CUM_IP_LEN_EN' is set + * + * rule_indication + * Bitmap indicating which of rules have matched. + * + * ipv6_options_crc + * 32 bit CRC computed out of IP v6 extension headers. + * + * da_offset + * Offset into MSDU buffer for DA. + * + * sa_offset + * Offset into MSDU buffer for SA. + * + * da_offset_valid + * da_offset field is valid. This will be set to 0 in case + * of a dynamic A-MSDU when DA is compressed. + * + * sa_offset_valid + * sa_offset field is valid. This will be set to 0 in case + * of a dynamic A-MSDU when SA is compressed. + * + * l3_type + * The 16-bit type value indicating the type of L3 later + * extracted from LLC/SNAP, set to zero if SNAP is not + * available. + * + * tcp_seq_number + * TCP sequence number. + * + * tcp_ack_number + * TCP acknowledge number. + * + * tcp_flag + * TCP flags {NS, CWR, ECE, URG, ACK, PSH, RST, SYN, FIN}. + * + * lro_eligible + * Computed out of TCP and IP fields to indicate that this + * MSDU is eligible for LRO. + * + * window_size + * TCP receive window size. + * + * sa_sw_peer_id + * sw_peer_id from the address search entry corresponding to the + * source address of the MSDU. + * + * sa_idx_timeout + * Indicates an unsuccessful MAC source address search due to the + * expiring of the search timer. + * + * da_idx_timeout + * Indicates an unsuccessful MAC destination address search due to + * the expiring of the search timer. + * + * to_ds + * Set if the to DS bit is set in the frame control. + * + * tid + * TID field in the QoS control field + * + * sa_is_valid + * Indicates that OLE found a valid SA entry. + * + * da_is_valid + * Indicates that OLE found a valid DA entry. + * + * da_is_mcbc + * Field Only valid if da_is_valid is set. Indicates the DA address + * was a Multicast of Broadcast address. + * + * l3_header_padding + * Number of bytes padded to make sure that the L3 header will + * always start of a Dword boundary. + * + * first_msdu + * Indicates the first MSDU of A-MSDU. If both first_msdu and + * last_msdu are set in the MSDU then this is a non-aggregated MSDU + * frame: normal MPDU. Interior MSDU in an A-MSDU shall have both + * first_mpdu and last_mpdu bits set to 0. + * + * last_msdu + * Indicates the last MSDU of the A-MSDU. MPDU end status is only + * valid when last_msdu is set. + * + * fr_ds + * Set if the from DS bit is set in the frame control. + * + * ip_chksum_fail_copy + * Indicates that the computed checksum did not match the + * checksum in the IP header. + * + * sa_idx + * The offset in the address table which matches the MAC source + * address. + * + * da_idx_or_sw_peer_id + * Based on a register configuration in RXOLE, this field will + * contain: + * The offset in the address table which matches the MAC destination + * address + * OR: + * sw_peer_id from the address search entry corresponding to + * the destination address of the MSDU + * + * msdu_drop + * REO shall drop this MSDU and not forward it to any other ring. + * + * The id of the reo exit ring where the msdu frame shall push + * after (MPDU level) reordering has finished. Values are defined + * in enum %HAL_RX_MSDU_DESC_REO_DEST_IND_. + * + * flow_idx + * Flow table index. + * + * use_ppe + * Indicates to RXDMA to ignore the REO_destination_indication + * and use a programmed value corresponding to the REO2PPE + * ring + * + * mesh_sta + * When set, this is a Mesh (11s) STA. + * + * vlan_ctag_stripped + * Set by RXOLE if it stripped 4-bytes of C-VLAN Tag from the + * packet + * + * vlan_stag_stripped + * Set by RXOLE if it stripped 4-bytes of S-VLAN Tag from the + * packet + * + * fragment_flag + * Indicates that this is an 802.11 fragment frame. This is + * set when either the more_frag bit is set in the frame control + * or the fragment number is not zero. Only set when first_msdu + * is set. + * + * fse_metadata + * FSE related meta data. + * + * cce_metadata + * CCE related meta data. + * + * tcp_udp_chksum + * The value of the computed TCP/UDP checksum. A mode bit + * selects whether this checksum is the full checksum or the + * partial checksum which does not include the pseudo header. + * + * aggregation_count + * Number of MSDU's aggregated so far + * + * flow_aggregation_continuation + * To indicate that this MSDU can be aggregated with + * the previous packet with the same flow id + * + * fisa_timeout + * To indicate that the aggregation has restarted for + * this flow due to timeout + * + * tcp_udp_chksum_fail + * Indicates that the computed checksum (tcp_udp_chksum) did + * not match the checksum in the TCP/UDP header. + * + * msdu_limit_error + * Indicates that the MSDU threshold was exceeded and thus all the + * rest of the MSDUs will not be scattered and will not be + * decapsulated but will be DMA'ed in RAW format as a single MSDU. + * + * flow_idx_timeout + * Indicates an unsuccessful flow search due to the expiring of + * the search timer. + * + * flow_idx_invalid + * flow id is not valid. + * + * cce_match + * Indicates that this status has a corresponding MSDU that + * requires FW processing. The OLE will have classification + * ring mask registers which will indicate the ring(s) for + * packets and descriptors which need FW attention. + * + * amsdu_parser_error + * A-MSDU could not be properly de-agregated. + * + * cumulative_ip_length + * Total MSDU length that is part of this flow aggregated + * so far + * + * key_id + * The key ID octet from the IV. Only valid when first_msdu is set. + * + * service_code + * Opaque service code between PPE and Wi-Fi + * + * priority_valid + * This field gets passed on by REO to PPE in the EDMA descriptor + * + * intra_bss + * This packet needs intra-BSS routing by SW as the 'vdev_id' + * for the destination is the same as 'vdev_id' (from 'RX_MPDU_PCU_START') + * that this MSDU was got in. + * + * dest_chip_id + * If intra_bss is set, copied by RXOLE from 'ADDR_SEARCH_ENTRY' + * to support intra-BSS routing with multi-chip multi-link + * operation. This indicates into which chip's TCL the packet should be + * queueued + * + * multicast_echo + * If set, this packet is a multicast echo, i.e. the DA is + * multicast and Rx OLE SA search with mcast_echo_check = 1 + * passed. RXDMA should release such packets to WBM. + * + * wds_learning_event + * If set, this packet has an SA search failure with WDS learning + * enabled for the peer. RXOLE should route this TLV to the + * RXDMA0 status ring to notify FW. + * + * wds_roaming_event + * If set, this packet's SA 'Sw_peer_id' mismatches the 'Sw_peer_id' + * of the peer through which the packet was got, indicating + * the SA node has roamed. RXOLE should route this TLV to + * the RXDMA0 status ring to notify FW. + * + * wds_keep_alive_event + * If set, the AST timestamp for this packet's SA is older + * than the current timestamp by more than a threshold programmed + * in RXOLE. RXOLE should route this TLV to the RXDMA0 status + * ring to notify FW to keep the AST entry for the SA alive. + * * msdu_length * MSDU length in bytes after decapsulation. + * This field is still valid for MPDU frames without A-MSDU. + * It still represents MSDU length after decapsulation + * + * stbc + * When set, use STBC transmission rates. * * ipsec_esp * Set if IPv4/v6 packet is using IPsec ESP. @@ -11752,25 +12113,17 @@ struct rx_msdu_start_wcn6855 { * For IPv4, this is the 8 bit protocol field set). For IPv6 this * is the 8 bit next_header field. * - * toeplitz_hash_2_or_4 - * Controlled by RxOLE register - If register bit set to 0, - * Toeplitz hash is computed over 2-tuple IPv4 or IPv6 src/dest - * addresses; otherwise, toeplitz hash is computed over 4-tuple - * IPv4 or IPv6 src/dest addresses and src/dest ports. * - * flow_id_toeplitz - * Toeplitz hash of 5-tuple - * {IP source address, IP destination address, IP source port, IP - * destination port, L4 protocol} in case of non-IPSec. + * vlan_ctag_ci + * 2 bytes of C-VLAN Tag Control Information from WHO_L2_LLC * - * In case of IPSec - Toeplitz hash of 4-tuple - * {IP source address, IP destination address, SPI, L4 protocol} + * vlan_stag_ci + * 2 bytes of S-VLAN Tag Control Information from WHO_L2_LLC + * in case of double VLAN * - * The relevant Toeplitz key registers are provided in RxOLE's - * instance of common parser module. These registers are separate - * from the Toeplitz keys used by ASE/FSE modules inside RxOLE. - * The actual value will be passed on from common parser module - * to RxOLE in one of the WHO_* TLVs. + * peer_meta_data + * Meta data that SW has programmed in the Peer table entry + * of the transmitting STA. * * user_rssi * RSSI for this user @@ -11778,9 +12131,6 @@ struct rx_msdu_start_wcn6855 { * pkt_type * Values are defined in enum %RX_MSDU_START_PKT_TYPE_*. * - * stbc - * When set, use STBC transmission rates. - * * sgi * Field only valid when pkt type is HT, VHT or HE. Values are * defined in enum %RX_MSDU_START_SGI_*. @@ -11809,6 +12159,27 @@ struct rx_msdu_start_wcn6855 { * 0 - spatial stream not used for this reception * 1 - spatial stream used for this reception * + * msdu_done_copy + * If set indicates that the RX packet data, RX header data, + * RX PPDU start descriptor, RX MPDU start/end descriptor, + * RX MSDU start/end descriptors and RX Attention descriptor + * are all valid. This bit is in the last 64-bit of the descriptor + * expected to be subscribed in future hardware. + * + * flow_id_toeplitz + * Toeplitz hash of 5-tuple + * {IP source address, IP destination address, IP source port, IP + * destination port, L4 protocol} in case of non-IPSec. + * + * In case of IPSec - Toeplitz hash of 4-tuple + * {IP source address, IP destination address, SPI, L4 protocol} + * + * The relevant Toeplitz key registers are provided in RxOLE's + * instance of common parser module. These registers are separate + * from the Toeplitz keys used by ASE/FSE modules inside RxOLE. + * The actual value will be passed on from common parser module + * to RxOLE in one of the WHO_* TLVs. + * * ppdu_start_timestamp * Timestamp that indicates when the PPDU that contained this MPDU * started on the medium. @@ -11816,360 +12187,81 @@ struct rx_msdu_start_wcn6855 { * phy_meta_data * SW programmed Meta data provided by the PHY. Can be used for SW * to indicate the channel the device is on. - */ - -#define RX_MSDU_END_INFO0_RXPCU_MPDU_FITLER GENMASK(1, 0) -#define RX_MSDU_END_INFO0_SW_FRAME_GRP_ID GENMASK(8, 2) - -#define RX_MSDU_END_INFO1_KEY_ID GENMASK(7, 0) -#define RX_MSDU_END_INFO1_CCE_SUPER_RULE GENMASK(13, 8) -#define RX_MSDU_END_INFO1_CCND_TRUNCATE BIT(14) -#define RX_MSDU_END_INFO1_CCND_CCE_DIS BIT(15) -#define RX_MSDU_END_INFO1_EXT_WAPI_PN GENMASK(31, 16) - -#define RX_MSDU_END_INFO2_REPORTED_MPDU_LEN GENMASK(13, 0) -#define RX_MSDU_END_INFO2_FIRST_MSDU BIT(14) -#define RX_MSDU_END_INFO2_FIRST_MSDU_WCN6855 BIT(28) -#define RX_MSDU_END_INFO2_LAST_MSDU BIT(15) -#define RX_MSDU_END_INFO2_LAST_MSDU_WCN6855 BIT(29) -#define RX_MSDU_END_INFO2_SA_IDX_TIMEOUT BIT(16) -#define RX_MSDU_END_INFO2_DA_IDX_TIMEOUT BIT(17) -#define RX_MSDU_END_INFO2_MSDU_LIMIT_ERR BIT(18) -#define RX_MSDU_END_INFO2_FLOW_IDX_TIMEOUT BIT(19) -#define RX_MSDU_END_INFO2_FLOW_IDX_INVALID BIT(20) -#define RX_MSDU_END_INFO2_WIFI_PARSER_ERR BIT(21) -#define RX_MSDU_END_INFO2_AMSDU_PARSET_ERR BIT(22) -#define RX_MSDU_END_INFO2_SA_IS_VALID BIT(23) -#define RX_MSDU_END_INFO2_DA_IS_VALID BIT(24) -#define RX_MSDU_END_INFO2_DA_IS_MCBC BIT(25) -#define RX_MSDU_END_INFO2_L3_HDR_PADDING GENMASK(27, 26) - -#define RX_MSDU_END_INFO3_TCP_FLAG GENMASK(8, 0) -#define RX_MSDU_END_INFO3_LRO_ELIGIBLE BIT(9) - -#define RX_MSDU_END_INFO4_DA_OFFSET GENMASK(5, 0) -#define RX_MSDU_END_INFO4_SA_OFFSET GENMASK(11, 6) -#define RX_MSDU_END_INFO4_DA_OFFSET_VALID BIT(12) -#define RX_MSDU_END_INFO4_SA_OFFSET_VALID BIT(13) -#define RX_MSDU_END_INFO4_L3_TYPE GENMASK(31, 16) - -#define RX_MSDU_END_INFO5_MSDU_DROP BIT(0) -#define RX_MSDU_END_INFO5_REO_DEST_IND GENMASK(5, 1) -#define RX_MSDU_END_INFO5_FLOW_IDX GENMASK(25, 6) - -struct rx_msdu_end_ipq8074 { - uint16_t info0; - uint16_t phy_ppdu_id; - uint16_t ip_hdr_cksum; - uint16_t tcp_udp_cksum; - uint32_t info1; - uint32_t ext_wapi_pn[2]; - uint32_t info2; - uint32_t ipv6_options_crc; - uint32_t tcp_seq_num; - uint32_t tcp_ack_num; - uint16_t info3; - uint16_t window_size; - uint32_t info4; - uint32_t rule_indication[2]; - uint16_t sa_idx; - uint16_t da_idx; - uint32_t info5; - uint32_t fse_metadata; - uint16_t cce_metadata; - uint16_t sa_sw_peer_id; -} __packed; - -struct rx_msdu_end_wcn6855 { - uint16_t info0; - uint16_t phy_ppdu_id; - uint16_t ip_hdr_cksum; - uint16_t reported_mpdu_len; - uint32_t info1; - uint32_t ext_wapi_pn[2]; - uint32_t info4; - uint32_t ipv6_options_crc; - uint32_t tcp_seq_num; - uint32_t tcp_ack_num; - uint16_t info3; - uint16_t window_size; - uint32_t info2; - uint16_t sa_idx; - uint16_t da_idx; - uint32_t info5; - uint32_t fse_metadata; - uint16_t cce_metadata; - uint16_t sa_sw_peer_id; - uint32_t rule_indication[2]; - uint32_t info6; - uint32_t info7; -} __packed; - -#define RX_MSDU_END_MPDU_LENGTH_INFO GENMASK(13, 0) - -#define RX_MSDU_END_INFO2_DA_OFFSET GENMASK(5, 0) -#define RX_MSDU_END_INFO2_SA_OFFSET GENMASK(11, 6) -#define RX_MSDU_END_INFO2_DA_OFFSET_VALID BIT(12) -#define RX_MSDU_END_INFO2_SA_OFFSET_VALID BIT(13) -#define RX_MSDU_END_INFO2_L3_TYPE GENMASK(31, 16) - -#define RX_MSDU_END_INFO4_SA_IDX_TIMEOUT BIT(0) -#define RX_MSDU_END_INFO4_DA_IDX_TIMEOUT BIT(1) -#define RX_MSDU_END_INFO4_MSDU_LIMIT_ERR BIT(2) -#define RX_MSDU_END_INFO4_FLOW_IDX_TIMEOUT BIT(3) -#define RX_MSDU_END_INFO4_FLOW_IDX_INVALID BIT(4) -#define RX_MSDU_END_INFO4_WIFI_PARSER_ERR BIT(5) -#define RX_MSDU_END_INFO4_AMSDU_PARSER_ERR BIT(6) -#define RX_MSDU_END_INFO4_SA_IS_VALID BIT(7) -#define RX_MSDU_END_INFO4_DA_IS_VALID BIT(8) -#define RX_MSDU_END_INFO4_DA_IS_MCBC BIT(9) -#define RX_MSDU_END_INFO4_L3_HDR_PADDING GENMASK(11, 10) -#define RX_MSDU_END_INFO4_FIRST_MSDU BIT(12) -#define RX_MSDU_END_INFO4_LAST_MSDU BIT(13) - -#define RX_MSDU_END_INFO6_AGGR_COUNT GENMASK(7, 0) -#define RX_MSDU_END_INFO6_FLOW_AGGR_CONTN BIT(8) -#define RX_MSDU_END_INFO6_FISA_TIMEOUT BIT(9) - -struct rx_msdu_end_qcn9074 { - uint16_t info0; - uint16_t phy_ppdu_id; - uint16_t ip_hdr_cksum; - uint16_t mpdu_length_info; - uint32_t info1; - uint32_t rule_indication[2]; - uint32_t info2; - uint32_t ipv6_options_crc; - uint32_t tcp_seq_num; - uint32_t tcp_ack_num; - uint16_t info3; - uint16_t window_size; - uint16_t tcp_udp_cksum; - uint16_t info4; - uint16_t sa_idx; - uint16_t da_idx; - uint32_t info5; - uint32_t fse_metadata; - uint16_t cce_metadata; - uint16_t sa_sw_peer_id; - uint32_t info6; - uint16_t cum_l4_cksum; - uint16_t cum_ip_length; -} __packed; - -/* rx_msdu_end * - * rxpcu_mpdu_filter_in_category - * Field indicates what the reason was that this mpdu frame - * was allowed to come into the receive path by rxpcu. Values - * are defined in enum %RX_DESC_RXPCU_FILTER_*. + * toeplitz_hash_2_or_4 + * Controlled by multiple RxOLE registers for TCP/UDP over + * IPv4/IPv6 - Either, Toeplitz hash computed over 2-tuple + * IPv4 or IPv6 src/dest addresses is reported; or, Toeplitz + * hash computed over 4-tuple IPv4 or IPv6 src/dest addresses + * and src/dest ports is reported. The Flow_id_toeplitz hash + * can also be reported here. Usually the hash reported here + * is the one used for hash-based REO routing (see use_flow_id_toeplitz_clfy + * in 'RXPT_CLASSIFY_INFO'). * - * sw_frame_group_id - * SW processes frames based on certain classifications. Values - * are defined in enum %RX_DESC_SW_FRAME_GRP_ID_*. + * sa + * Source MAC address * - * phy_ppdu_id - * A ppdu counter value that PHY increments for every PPDU - * received. The counter value wraps around. + * first_mpdu + * Indicates the first MSDU of the PPDU. If both first_mpdu + * and last_mpdu are set in the MSDU then this is a not an + * A-MPDU frame but a stand alone MPDU. Interior MPDU in an + * A-MPDU shall have both first_mpdu and last_mpdu bits set to + * 0. The PPDU start status will only be valid when this bit + * is set. * - * ip_hdr_cksum - * This can include the IP header checksum or the pseudo - * header checksum used by TCP/UDP checksum. + * mcast_bcast + * Multicast / broadcast indicator. Only set when the MAC + * address 1 bit 0 is set indicating mcast/bcast and the BSSID + * matches one of the 4 BSSID registers. Only set when + * first_msdu is set. * - * tcp_udp_chksum - * The value of the computed TCP/UDP checksum. A mode bit - * selects whether this checksum is the full checksum or the - * partial checksum which does not include the pseudo header. + * ast_index_not_found + * Only valid when first_msdu is set. Indicates no AST matching + * entries within the max search count. * - * key_id - * The key ID octet from the IV. Only valid when first_msdu is set. + * ast_index_timeout + * Only valid when first_msdu is set. Indicates an unsuccessful + * search in the address search table due to timeout. * - * cce_super_rule - * Indicates the super filter rule. + * power_mgmt + * Power management bit set in the 802.11 header. Only set + * when first_msdu is set. * - * cce_classify_not_done_truncate - * Classification failed due to truncated frame. + * non_qos + * Set if packet is not a non-QoS data frame. Only set when + * first_msdu is set. * - * cce_classify_not_done_cce_dis - * Classification failed due to CCE global disable + * null_data + * Set if frame type indicates either null data or QoS null + * data format. Only set when first_msdu is set. * - * ext_wapi_pn* - * Extension PN (packet number) which is only used by WAPI. + * mgmt_type + * Set if packet is a management packet. Only set when + * first_msdu is set. * - * reported_mpdu_length - * MPDU length before decapsulation. Only valid when first_msdu is - * set. This field is taken directly from the length field of the - * A-MPDU delimiter or the preamble length field for non-A-MPDU - * frames. + * ctrl_type + * Set if packet is a control packet. Only set when first_msdu + * is set. * - * first_msdu - * Indicates the first MSDU of A-MSDU. If both first_msdu and - * last_msdu are set in the MSDU then this is a non-aggregated MSDU - * frame: normal MPDU. Interior MSDU in an A-MSDU shall have both - * first_mpdu and last_mpdu bits set to 0. + * more_data + * Set if more bit in frame control is set. Only set when + * first_msdu is set. * - * last_msdu - * Indicates the last MSDU of the A-MSDU. MPDU end status is only - * valid when last_msdu is set. + * eosp + * Set if the EOSP (end of service period) bit in the QoS + * control field is set. Only set when first_msdu is set. * - * sa_idx_timeout - * Indicates an unsuccessful MAC source address search due to the - * expiring of the search timer. + * a_msdu_error + * Set if number of MSDUs in A-MSDU is above a threshold or if the + * size of the MSDU is invalid. This receive buffer will contain + * all of the remainder of MSDUs in this MPDU w/o decapsulation. * - * da_idx_timeout - * Indicates an unsuccessful MAC destination address search due to - * the expiring of the search timer. + * order + * Set if the order bit in the frame control is set. Only + * set when first_msdu is set. * - * msdu_limit_error - * Indicates that the MSDU threshold was exceeded and thus all the - * rest of the MSDUs will not be scattered and will not be - * decapsulated but will be DMA'ed in RAW format as a single MSDU. - * - * flow_idx_timeout - * Indicates an unsuccessful flow search due to the expiring of - * the search timer. - * - * flow_idx_invalid - * flow id is not valid. - * - * amsdu_parser_error - * A-MSDU could not be properly de-agregated. - * - * sa_is_valid - * Indicates that OLE found a valid SA entry. - * - * da_is_valid - * Indicates that OLE found a valid DA entry. - * - * da_is_mcbc - * Field Only valid if da_is_valid is set. Indicates the DA address - * was a Multicast of Broadcast address. - * - * l3_header_padding - * Number of bytes padded to make sure that the L3 header will - * always start of a Dword boundary. - * - * ipv6_options_crc - * 32 bit CRC computed out of IP v6 extension headers. - * - * tcp_seq_number - * TCP sequence number. - * - * tcp_ack_number - * TCP acknowledge number. - * - * tcp_flag - * TCP flags {NS, CWR, ECE, URG, ACK, PSH, RST, SYN, FIN}. - * - * lro_eligible - * Computed out of TCP and IP fields to indicate that this - * MSDU is eligible for LRO. - * - * window_size - * TCP receive window size. - * - * da_offset - * Offset into MSDU buffer for DA. - * - * sa_offset - * Offset into MSDU buffer for SA. - * - * da_offset_valid - * da_offset field is valid. This will be set to 0 in case - * of a dynamic A-MSDU when DA is compressed. - * - * sa_offset_valid - * sa_offset field is valid. This will be set to 0 in case - * of a dynamic A-MSDU when SA is compressed. - * - * l3_type - * The 16-bit type value indicating the type of L3 later - * extracted from LLC/SNAP, set to zero if SNAP is not - * available. - * - * rule_indication - * Bitmap indicating which of rules have matched. - * - * sa_idx - * The offset in the address table which matches MAC source address - * - * da_idx - * The offset in the address table which matches MAC destination - * address. - * - * msdu_drop - * REO shall drop this MSDU and not forward it to any other ring. - * - * reo_destination_indication - * The id of the reo exit ring where the msdu frame shall push - * after (MPDU level) reordering has finished. Values are defined - * in enum %HAL_RX_MSDU_DESC_REO_DEST_IND_. - * - * flow_idx - * Flow table index. - * - * fse_metadata - * FSE related meta data. - * - * cce_metadata - * CCE related meta data. - * - * sa_sw_peer_id - * sw_peer_id from the address search entry corresponding to the - * source address of the MSDU. - */ - -enum rx_mpdu_end_rxdma_dest_ring { - RX_MPDU_END_RXDMA_DEST_RING_RELEASE, - RX_MPDU_END_RXDMA_DEST_RING_FW, - RX_MPDU_END_RXDMA_DEST_RING_SW, - RX_MPDU_END_RXDMA_DEST_RING_REO, -}; - -#define RX_MPDU_END_INFO1_UNSUP_KTYPE_SHORT_FRAME BIT(11) -#define RX_MPDU_END_INFO1_RX_IN_TX_DECRYPT_BYT BIT(12) -#define RX_MPDU_END_INFO1_OVERFLOW_ERR BIT(13) -#define RX_MPDU_END_INFO1_MPDU_LEN_ERR BIT(14) -#define RX_MPDU_END_INFO1_TKIP_MIC_ERR BIT(15) -#define RX_MPDU_END_INFO1_DECRYPT_ERR BIT(16) -#define RX_MPDU_END_INFO1_UNENCRYPTED_FRAME_ERR BIT(17) -#define RX_MPDU_END_INFO1_PN_FIELDS_VALID BIT(18) -#define RX_MPDU_END_INFO1_FCS_ERR BIT(19) -#define RX_MPDU_END_INFO1_MSDU_LEN_ERR BIT(20) -#define RX_MPDU_END_INFO1_RXDMA0_DEST_RING GENMASK(22, 21) -#define RX_MPDU_END_INFO1_RXDMA1_DEST_RING GENMASK(24, 23) -#define RX_MPDU_END_INFO1_DECRYPT_STATUS_CODE GENMASK(27, 25) -#define RX_MPDU_END_INFO1_RX_BITMAP_NOT_UPD BIT(28) - -struct rx_mpdu_end { - uint16_t info0; - uint16_t phy_ppdu_id; - uint32_t info1; -} __packed; - -/* rx_mpdu_end - * - * rxpcu_mpdu_filter_in_category - * Field indicates what the reason was that this mpdu frame - * was allowed to come into the receive path by rxpcu. Values - * are defined in enum %RX_DESC_RXPCU_FILTER_*. - * - * sw_frame_group_id - * SW processes frames based on certain classifications. Values - * are defined in enum %RX_DESC_SW_FRAME_GRP_ID_*. - * - * phy_ppdu_id - * A ppdu counter value that PHY increments for every PPDU - * received. The counter value wraps around. - * - * unsup_ktype_short_frame - * This bit will be '1' when WEP or TKIP or WAPI key type is - * received for 11ah short frame. Crypto will bypass the received - * packet without decryption to RxOLE after setting this bit. - * - * rx_in_tx_decrypt_byp - * Indicates that RX packet is not decrypted as Crypto is - * busy with TX packet processing. + * wifi_parser_error + * Indicates that the WiFi frame has one of the following errors * * overflow_err * RXPCU Receive FIFO ran out of space to receive the full MPDU. @@ -12184,36 +12276,66 @@ struct rx_mpdu_end { * Set by RXPCU if the expected MPDU length does not correspond * with the actually received number of bytes in the MPDU. * + * tcp_udp_chksum_fail + * Indicates that the computed checksum (tcp_udp_chksum) did + * not match the checksum in the TCP/UDP header. + * + * ip_chksum_fail + * Indicates that the computed checksum did not match the + * checksum in the IP header. + * + * sa_idx_invalid + * Indicates no matching entry was found in the address search + * table for the source MAC address. + * + * da_idx_invalid + * Indicates no matching entry was found in the address search + * table for the destination MAC address. + * + * amsdu_addr_mismatch + * Indicates that an A-MSDU with 'from DS = 0' had an SA mismatching + * TA or an A-MDU with 'to DS = 0' had a DA mismatching RA + * + * rx_in_tx_decrypt_byp + * Indicates that RX packet is not decrypted as Crypto is busy + * with TX packet processing. + * + * encrypt_required + * Indicates that this data type frame is not encrypted even if + * the policy for this MPDU requires encryption as indicated in + * the peer table key type. + * + * directed + * MPDU is a directed packet which means that the RA matched + * our STA addresses. In proxySTA it means that the TA matched + * an entry in our address search table with the corresponding + * 'no_ack' bit is the address search entry cleared. + * + * buffer_fragment + * Indicates that at least one of the rx buffers has been + * fragmented. If set the FW should look at the rx_frag_info + * descriptor described below. + * + * mpdu_length_err + * Indicates that the MPDU was pre-maturely terminated + * resulting in a truncated MPDU. Don't trust the MPDU length + * field. + * * tkip_mic_err - * Set by Rx crypto when crypto detected a TKIP MIC error for - * this MPDU. + * Indicates that the MPDU Michael integrity check failed * * decrypt_err - * Set by RX CRYPTO when CRYPTO detected a decrypt error for this - * MPDU or CRYPTO received an encrypted frame, but did not get a - * valid corresponding key id in the peer entry. - * - * unencrypted_frame_err - * Set by RX CRYPTO when CRYPTO detected an unencrypted frame while - * in the peer entry field 'All_frames_shall_be_encrypted' is set. - * - * pn_fields_contain_valid_info - * Set by RX CRYPTO to indicate that there is a valid PN field - * present in this MPDU. + * Indicates that the MPDU decrypt integrity check failed * * fcs_err - * Set by RXPCU when there is an FCS error detected for this MPDU. + * Indicates that the MPDU FCS check failed * - * msdu_length_err - * Set by RXOLE when there is an msdu length error detected - * in at least 1 of the MSDUs embedded within the MPDU. + * flow_idx_timeout + * Indicates an unsuccessful flow search due to the expiring of + * the search timer. * - * rxdma0_destination_ring - * rxdma1_destination_ring - * The ring to which RXDMA0/1 shall push the frame, assuming - * no MPDU level errors are detected. In case of MPDU level - * errors, RXDMA0/1 might change the RXDMA0/1 destination. Values - * are defined in %enum RX_MPDU_END_RXDMA_DEST_RING_*. + * flow_idx_invalid + * flow id is not valid. * * decrypt_status_code * Field provides insight into the decryption performed. Values @@ -12222,76 +12344,54 @@ struct rx_mpdu_end { * rx_bitmap_not_updated * Frame is received, but RXPCU could not update the receive bitmap * due to (temporary) fifo constraints. + * + * msdu_done + * If set indicates that the RX packet data, RX header data, RX + * PPDU start descriptor, RX MPDU start/end descriptor, RX MSDU + * start/end descriptors and RX Attention descriptor are all + * valid. This bit must be in the last octet of the + * descriptor. + * */ -/* Padding bytes to avoid TLV's spanning across 128 byte boundary */ -#define HAL_RX_DESC_PADDING0_BYTES 4 -#define HAL_RX_DESC_PADDING1_BYTES 16 - -#define HAL_RX_DESC_HDR_STATUS_LEN 120 - -struct hal_rx_desc_ipq8074 { - uint32_t msdu_end_tag; - struct rx_msdu_end_ipq8074 msdu_end; - uint32_t rx_attn_tag; - struct rx_attention attention; - uint32_t msdu_start_tag; - struct rx_msdu_start_ipq8074 msdu_start; - uint8_t rx_padding0[HAL_RX_DESC_PADDING0_BYTES]; - uint32_t mpdu_start_tag; - struct rx_mpdu_start_ipq8074 mpdu_start; - uint32_t mpdu_end_tag; - struct rx_mpdu_end mpdu_end; - uint8_t rx_padding1[HAL_RX_DESC_PADDING1_BYTES]; - uint32_t hdr_status_tag; - uint32_t phy_ppdu_id; - uint8_t hdr_status[HAL_RX_DESC_HDR_STATUS_LEN]; +struct hal_rx_desc_qcn9274 { + struct rx_msdu_end_qcn9274 msdu_end; + struct rx_mpdu_start_qcn9274 mpdu_start; uint8_t msdu_payload[]; } __packed; -struct hal_rx_desc_qcn9074 { - uint32_t msdu_end_tag; - struct rx_msdu_end_qcn9074 msdu_end; - uint32_t rx_attn_tag; - struct rx_attention attention; - uint32_t msdu_start_tag; - struct rx_msdu_start_qcn9074 msdu_start; - uint8_t rx_padding0[HAL_RX_DESC_PADDING0_BYTES]; - uint32_t mpdu_start_tag; - struct rx_mpdu_start_qcn9074 mpdu_start; - uint32_t mpdu_end_tag; - struct rx_mpdu_end mpdu_end; - uint8_t rx_padding1[HAL_RX_DESC_PADDING1_BYTES]; - uint32_t hdr_status_tag; - uint32_t phy_ppdu_id; - uint8_t hdr_status[HAL_RX_DESC_HDR_STATUS_LEN]; +struct hal_rx_desc_qcn9274_compact { + struct rx_msdu_end_qcn9274_compact msdu_end; + struct rx_mpdu_start_qcn9274_compact mpdu_start; uint8_t msdu_payload[]; } __packed; -struct hal_rx_desc_wcn6855 { - uint32_t msdu_end_tag; - struct rx_msdu_end_wcn6855 msdu_end; - uint32_t rx_attn_tag; - struct rx_attention attention; - uint32_t msdu_start_tag; - struct rx_msdu_start_wcn6855 msdu_start; - uint8_t rx_padding0[HAL_RX_DESC_PADDING0_BYTES]; - uint32_t mpdu_start_tag; - struct rx_mpdu_start_wcn6855 mpdu_start; - uint32_t mpdu_end_tag; - struct rx_mpdu_end mpdu_end; - uint8_t rx_padding1[HAL_RX_DESC_PADDING1_BYTES]; - uint32_t hdr_status_tag; - uint32_t phy_ppdu_id; - uint8_t hdr_status[HAL_RX_DESC_HDR_STATUS_LEN]; +#define RX_BE_PADDING0_BYTES 8 +#define RX_BE_PADDING1_BYTES 8 + +#define HAL_RX_BE_PKT_HDR_TLV_LEN 112 + +struct rx_pkt_hdr_tlv { + uint64_t tag; + uint64_t phy_ppdu_id; + uint8_t rx_pkt_hdr[HAL_RX_BE_PKT_HDR_TLV_LEN]; +}; + +struct hal_rx_desc_wcn7850 { + uint64_t msdu_end_tag; + struct rx_msdu_end_qcn9274 msdu_end; + uint8_t rx_padding0[RX_BE_PADDING0_BYTES]; + uint64_t mpdu_start_tag; + struct rx_mpdu_start_qcn9274 mpdu_start; + struct rx_pkt_hdr_tlv pkt_hdr_tlv; uint8_t msdu_payload[]; } __packed; struct hal_rx_desc { union { - struct hal_rx_desc_ipq8074 ipq8074; - struct hal_rx_desc_qcn9074 qcn9074; - struct hal_rx_desc_wcn6855 wcn6855; + struct hal_rx_desc_qcn9274 qcn9274; + struct hal_rx_desc_qcn9274_compact qcn9274_compact; + struct hal_rx_desc_wcn7850 wcn7850; } u; } __packed; @@ -13682,3 +13782,16 @@ struct ath12k_htt_extd_stats_msg { #define HTT_MAC_ADDR_L32_3 GENMASK(31, 24) #define HTT_MAC_ADDR_H16_0 GENMASK(7, 0) #define HTT_MAC_ADDR_H16_1 GENMASK(15, 8) + +/* + * hal_rx.h + */ + +#define HAL_RX_MPDU_ERR_FCS BIT(0) +#define HAL_RX_MPDU_ERR_DECRYPT BIT(1) +#define HAL_RX_MPDU_ERR_TKIP_MIC BIT(2) +#define HAL_RX_MPDU_ERR_AMSDU_ERR BIT(3) +#define HAL_RX_MPDU_ERR_OVERFLOW BIT(4) +#define HAL_RX_MPDU_ERR_MSDU_LEN BIT(5) +#define HAL_RX_MPDU_ERR_MPDU_LEN BIT(6) +#define HAL_RX_MPDU_ERR_UNENCRYPTED_FRAME BIT(7) diff --git a/sys/dev/ic/qwzvar.h b/sys/dev/ic/qwzvar.h index 8eb515838..61530a4fd 100644 --- a/sys/dev/ic/qwzvar.h +++ b/sys/dev/ic/qwzvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: qwzvar.h,v 1.6 2024/08/20 21:24:15 patrick Exp $ */ +/* $OpenBSD: qwzvar.h,v 1.11 2024/12/22 23:30:27 patrick Exp $ */ /* * Copyright (c) 2018-2019 The Linux Foundation. @@ -101,7 +101,9 @@ struct ath12k_hal_tcl_to_wbm_rbm_map { enum hal_rx_buf_return_buf_manager { HAL_RX_BUF_RBM_WBM_IDLE_BUF_LIST, - HAL_RX_BUF_RBM_WBM_CHIP0_IDLE_DESC_LIST, + HAL_RX_BUF_RBM_WBM_DEV0_IDLE_DESC_LIST, + HAL_RX_BUF_RBM_WBM_DEV1_IDLE_DESC_LIST, + HAL_RX_BUF_RBM_WBM_DEV2_IDLE_DESC_LIST, HAL_RX_BUF_RBM_FW_BM, HAL_RX_BUF_RBM_SW0_BM, HAL_RX_BUF_RBM_SW1_BM, @@ -167,6 +169,9 @@ struct hal_tx_status { struct hal_ops { int (*create_srng_config)(struct qwz_softc *); + uint16_t (*rxdma_ring_wmask_rx_mpdu_start)(void); + uint32_t (*rxdma_ring_wmask_rx_msdu_end)(void); + const struct hal_rx_ops *(*get_hal_rx_compact_ops)(void); const struct ath12k_hal_tcl_to_wbm_rbm_map *tcl_to_wbm_rbm_map; }; @@ -218,17 +223,18 @@ struct ath12k_hw_params { bool supports_monitor; bool full_monitor_mode; #endif + bool reoq_lut_support; bool supports_shadow_regs; bool idle_ps; bool supports_sta_ps; - uint32_t num_vdevs; - uint32_t num_peers; bool supports_suspend; uint32_t hal_desc_sz; bool fix_l1ss; - bool credit_flow; - uint8_t max_tx_ring; + uint32_t num_tcl_banks; + uint32_t max_tx_ring; const struct ath12k_hw_hal_params *hal_params; + void (*wmi_init)(struct qwz_softc *sc, + struct wmi_resource_config_arg *config); const struct hal_ops *hal_ops; uint64_t qmi_cnss_feature_bitmap; #if notyet @@ -256,14 +262,12 @@ struct ath12k_hw_params { struct ath12k_hw_ops { uint8_t (*get_hw_mac_from_pdev_id)(int pdev_id); - void (*wmi_init_config)(struct qwz_softc *sc, - struct target_resource_config *config); int (*mac_id_to_pdev_id)(struct ath12k_hw_params *hw, int mac_id); int (*mac_id_to_srng_id)(struct ath12k_hw_params *hw, int mac_id); -#if notyet - void (*tx_mesh_enable)(struct ath12k_base *ab, - struct hal_tcl_data_cmd *tcl_cmd); -#endif + bool (*dp_srng_is_tx_comp_ring)(int ring_num); +}; + +struct hal_rx_ops { int (*rx_desc_get_first_msdu)(struct hal_rx_desc *desc); #if notyet bool (*rx_desc_get_last_msdu)(struct hal_rx_desc *desc); @@ -275,7 +279,6 @@ struct ath12k_hw_ops { uint8_t (*rx_desc_get_decap_type)(struct hal_rx_desc *desc); #ifdef notyet uint8_t (*rx_desc_get_mesh_ctl)(struct hal_rx_desc *desc); - bool (*rx_desc_get_ldpc_support)(struct hal_rx_desc *desc); bool (*rx_desc_get_mpdu_seq_ctl_vld)(struct hal_rx_desc *desc); bool (*rx_desc_get_mpdu_fc_valid)(struct hal_rx_desc *desc); uint16_t (*rx_desc_get_mpdu_start_seq_no)(struct hal_rx_desc *desc); @@ -287,27 +290,46 @@ struct ath12k_hw_ops { uint8_t (*rx_desc_get_msdu_rx_bw)(struct hal_rx_desc *desc); #endif uint32_t (*rx_desc_get_msdu_freq)(struct hal_rx_desc *desc); -#ifdef notyet uint8_t (*rx_desc_get_msdu_pkt_type)(struct hal_rx_desc *desc); uint8_t (*rx_desc_get_msdu_nss)(struct hal_rx_desc *desc); uint8_t (*rx_desc_get_mpdu_tid)(struct hal_rx_desc *desc); uint16_t (*rx_desc_get_mpdu_peer_id)(struct hal_rx_desc *desc); - void (*rx_desc_copy_attn_end_tlv)(struct hal_rx_desc *fdesc, - struct hal_rx_desc *ldesc); + void (*rx_desc_copy_end_tlv)(struct hal_rx_desc *fdesc, + struct hal_rx_desc *ldesc); uint32_t (*rx_desc_get_mpdu_start_tag)(struct hal_rx_desc *desc); uint32_t (*rx_desc_get_mpdu_ppdu_id)(struct hal_rx_desc *desc); void (*rx_desc_set_msdu_len)(struct hal_rx_desc *desc, uint16_t len); -#endif - struct rx_attention *(*rx_desc_get_attention)(struct hal_rx_desc *desc); #ifdef notyet uint8_t *(*rx_desc_get_msdu_payload)(struct hal_rx_desc *desc); - uint16_t (*mpdu_info_get_peerid)(uint8_t *tlv_data); + uint32_t (*rx_desc_get_mpdu_start_offset)(void); + uint32_t (*rx_desc_get_msdu_end_offset)(void); bool (*rx_desc_mac_addr2_valid)(struct hal_rx_desc *desc); uint8_t* (*rx_desc_mpdu_start_addr2)(struct hal_rx_desc *desc); - uint32_t (*get_ring_selector)(struct sk_buff *skb); +#endif + int (*rx_desc_is_da_mcbc)(struct hal_rx_desc *desc); +#ifdef notyet + void (*rx_desc_get_dot11_hdr)(struct hal_rx_desc *desc, + struct ieee80211_hdr *hdr); + uint16_t (*rx_desc_get_mpdu_frame_ctl)(struct hal_rx_desc *desc); + void (*rx_desc_get_crypto_header)(struct hal_rx_desc *desc, + uint8_t *crypto_hdr, + enum hal_encrypt_type enctype); +#endif + bool (*dp_rx_h_msdu_done)(struct hal_rx_desc *desc); +#ifdef notyet + bool (*dp_rx_h_l4_cksum_fail)(struct hal_rx_desc *desc); + bool (*dp_rx_h_ip_cksum_fail)(struct hal_rx_desc *desc); +#endif + int (*dp_rx_h_is_decrypted)(struct hal_rx_desc *desc); + uint32_t (*dp_rx_h_mpdu_err)(struct hal_rx_desc *desc); + uint32_t (*rx_desc_get_desc_size)(void); +#ifdef notyet + uint8_t (*rx_desc_get_msdu_src_link_id)(struct hal_rx_desc *desc); #endif }; +extern const struct hal_rx_ops hal_rx_wcn7850_ops; + extern const struct ath12k_hw_ring_mask ath12k_hw_ring_mask_wcn7850; struct ath12k_hw_regs { @@ -485,9 +507,8 @@ enum hal_srng_dir { #define HAL_SRNG_FLAGS_DATA_TLV_SWAP 0x00000020 #define HAL_SRNG_FLAGS_LOW_THRESH_INTR_EN 0x00010000 #define HAL_SRNG_FLAGS_MSI_INTR 0x00020000 -#define HAL_SRNG_FLAGS_CACHED 0x20000000 +#define HAL_SRNG_FLAGS_HIGH_THRESH_INTR_EN 0x00080000 #define HAL_SRNG_FLAGS_LMAC_RING 0x80000000 -#define HAL_SRNG_FLAGS_REMAP_CE_RING 0x10000000 #define HAL_SRNG_TLV_HDR_TAG GENMASK(9, 1) #define HAL_SRNG_TLV_HDR_LEN GENMASK(25, 10) @@ -784,6 +805,8 @@ struct ath12k_hal { #ifdef notyet struct lock_class_key srng_key[HAL_SRNG_RING_ID_MAX]; #endif + + uint32_t hal_desc_sz; }; enum hal_pn_type { @@ -945,8 +968,7 @@ struct qwz_dp_htt_wbm_tx_status { #define DP_BA_WIN_SZ_MAX 256 -#define DP_TCL_NUM_RING_MAX 3 -#define DP_TCL_NUM_RING_MAX_QCA6390 1 +#define DP_TCL_NUM_RING_MAX 4 #define DP_IDLE_SCATTER_BUFS_MAX 16 @@ -1075,7 +1097,8 @@ struct qwz_hp_update_timer { struct ath12k_rx_desc_info { TAILQ_ENTRY(ath12k_rx_desc_info) entry; -// struct sk_buff *skb; + struct mbuf *m; + bus_dmamap_t map; uint32_t cookie; uint32_t magic; uint8_t in_use : 1, @@ -1084,7 +1107,8 @@ struct ath12k_rx_desc_info { struct ath12k_tx_desc_info { TAILQ_ENTRY(ath12k_tx_desc_info) entry; -// struct sk_buff *skb; + struct mbuf *m; + bus_dmamap_t map; uint32_t desc_id; /* Cookie */ uint8_t mac_id; uint8_t pool_id; @@ -1148,7 +1172,6 @@ struct dp_srng { bus_addr_t paddr; int size; uint32_t ring_id; - uint8_t cached; }; struct dp_tx_ring { @@ -1189,8 +1212,31 @@ struct hal_wbm_idle_scatter_list { struct hal_wbm_link_desc *vaddr; }; +struct dp_rxdma_mon_ring { + struct dp_srng refill_buf_ring; +#if 0 + struct idr bufs_idr; + /* Protects bufs_idr */ + spinlock_t idr_lock; +#else + struct qwz_rx_data *rx_data; +#endif + int bufs_max; + uint8_t freemap[howmany(DP_RXDMA_BUF_RING_SIZE, 8)]; +}; + +struct dp_rxdma_ring { + struct dp_srng refill_buf_ring; + struct qwz_rx_data *rx_data; + int bufs_max; +}; + +#define MAX_RXDMA_PER_PDEV 2 + struct qwz_dp { struct qwz_softc *sc; + uint8_t num_bank_profiles; + struct ath12k_dp_tx_bank_profile *bank_profiles; enum ath12k_htc_ep_id eid; int htt_tgt_version_received; uint8_t htt_tgt_ver_major; @@ -1203,6 +1249,7 @@ struct qwz_dp { struct dp_srng reo_except_ring; struct dp_srng reo_cmd_ring; struct dp_srng reo_status_ring; + enum peer_metadata_version peer_metadata_ver; struct dp_srng reo_dst_ring[DP_REO_DST_RING_MAX]; struct dp_tx_ring tx_ring[DP_TCL_NUM_RING_MAX]; struct hal_wbm_idle_scatter_list scatter_list[DP_IDLE_SCATTER_BUFS_MAX]; @@ -1212,6 +1259,7 @@ struct qwz_dp { struct list_head dp_full_mon_mpdu_list; #endif uint32_t reo_cmd_cache_flush_count; + enum hal_rx_buf_return_buf_manager idle_link_rbm; #if 0 /** * protects access to below fields, @@ -1236,6 +1284,10 @@ struct qwz_dp { /* protects the free and used desc lists */ spinlock_t tx_desc_lock[ATH12K_HW_MAX_QUEUES]; #endif + struct dp_rxdma_ring rx_refill_buf_ring; + struct dp_srng rx_mac_buf_ring[MAX_RXDMA_PER_PDEV]; + struct dp_srng rxdma_err_dst_ring[MAX_RXDMA_PER_PDEV]; + struct dp_rxdma_mon_ring rxdma_mon_buf_ring; }; #define ATH12K_SHADOW_DP_TIMER_INTERVAL 20 @@ -1266,7 +1318,6 @@ struct qwz_ce { /* Protects rings of all ce pipes */ spinlock_t ce_lock; #endif - struct qwz_hp_update_timer hp_timer[CE_COUNT_MAX]; }; @@ -1317,7 +1368,6 @@ struct qwz_pdev_wmi { enum ath12k_htc_ep_id eid; const struct wmi_peer_flags_map *peer_flags; uint32_t rx_decap_mode; - int tx_ce_desc; }; #define QWZ_MAX_RADIOS 3 @@ -1536,19 +1586,6 @@ struct qwz_dbring_cap { uint32_t min_buf_align; }; -struct dp_rxdma_ring { - struct dp_srng refill_buf_ring; -#if 0 - struct idr bufs_idr; - /* Protects bufs_idr */ - spinlock_t idr_lock; -#else - struct qwz_rx_data *rx_data; -#endif - int bufs_max; - uint8_t freemap[howmany(DP_RXDMA_BUF_RING_SIZE, 8)]; -}; - enum hal_rx_mon_status { HAL_RX_MON_STATUS_PPDU_NOT_DONE, HAL_RX_MON_STATUS_PPDU_DONE, @@ -1729,23 +1766,14 @@ struct qwz_mon_data { }; -#define MAX_RXDMA_PER_PDEV 2 - struct qwz_pdev_dp { uint32_t mac_id; - uint32_t mon_dest_ring_stuck_cnt; #if 0 atomic_t num_tx_pending; wait_queue_head_t tx_empty_waitq; #endif - struct dp_rxdma_ring rx_refill_buf_ring; - struct dp_srng rx_mac_buf_ring[MAX_RXDMA_PER_PDEV]; - struct dp_srng rxdma_err_dst_ring[MAX_RXDMA_PER_PDEV]; struct dp_srng rxdma_mon_dst_ring[MAX_RXDMA_PER_PDEV]; struct dp_srng tx_mon_dst_ring[MAX_RXDMA_PER_PDEV]; - struct dp_srng rxdma_mon_desc_ring; - struct dp_rxdma_ring rxdma_mon_buf_ring; - struct dp_rxdma_ring rx_mon_status_refill_ring[MAX_RXDMA_PER_PDEV]; #if 0 struct ieee80211_rx_status rx_status; #endif @@ -1938,6 +1966,8 @@ struct qwz_softc { struct qwz_pdev_dp pdev_dp; struct qwz_wmi_base wmi; struct qwz_htc htc; + const struct hal_rx_ops *hal_rx_ops; + uint32_t wmi_conf_rx_decap_mode; enum ath12k_firmware_mode fw_mode; enum ath12k_crypt_mode crypto_mode; @@ -1952,6 +1982,7 @@ struct qwz_softc { struct qwz_qmi_dev_mem_info qmi_dev_mem[ATH12K_QMI_WLFW_MAX_DEV_MEM_NUM_V01]; struct ath12k_targ_cap target_caps; int num_radios; + uint8_t device_id; uint32_t cc_freq_hz; uint32_t cfg_tx_chainmask; uint32_t cfg_rx_chainmask; diff --git a/sys/dev/ic/re.c b/sys/dev/ic/re.c index a8967f686..17d783653 100644 --- a/sys/dev/ic/re.c +++ b/sys/dev/ic/re.c @@ -1,4 +1,4 @@ -/* $OpenBSD: re.c,v 1.218 2024/08/12 06:47:11 dlg Exp $ */ +/* $OpenBSD: re.c,v 1.219 2024/11/05 18:58:59 miod Exp $ */ /* $FreeBSD: if_re.c,v 1.31 2004/09/04 07:54:05 ru Exp $ */ /* * Copyright (c) 1997, 1998-2003 @@ -205,7 +205,7 @@ void re_kstat_detach(struct rl_softc *); void in_delayed_cksum(struct mbuf *); struct cfdriver re_cd = { - 0, "re", DV_IFNET + NULL, "re", DV_IFNET }; #define EE_SET(x) \ diff --git a/sys/dev/ic/rtl81x9.c b/sys/dev/ic/rtl81x9.c index 6beca05a8..edf9ff6d2 100644 --- a/sys/dev/ic/rtl81x9.c +++ b/sys/dev/ic/rtl81x9.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtl81x9.c,v 1.99 2024/08/31 16:23:09 deraadt Exp $ */ +/* $OpenBSD: rtl81x9.c,v 1.100 2024/11/05 18:58:59 miod Exp $ */ /* * Copyright (c) 1997, 1998 @@ -1368,5 +1368,5 @@ rl_detach(struct rl_softc *sc) } struct cfdriver rl_cd = { - 0, "rl", DV_IFNET + NULL, "rl", DV_IFNET }; diff --git a/sys/dev/ic/smc83c170.c b/sys/dev/ic/smc83c170.c index c74885afe..ae9014b55 100644 --- a/sys/dev/ic/smc83c170.c +++ b/sys/dev/ic/smc83c170.c @@ -1,4 +1,4 @@ -/* $OpenBSD: smc83c170.c,v 1.31 2023/11/10 15:51:20 bluhm Exp $ */ +/* $OpenBSD: smc83c170.c,v 1.32 2024/11/05 18:58:59 miod Exp $ */ /* $NetBSD: smc83c170.c,v 1.59 2005/02/27 00:27:02 perry Exp $ */ /*- @@ -91,7 +91,7 @@ int epic_mediachange(struct ifnet *); void epic_mediastatus(struct ifnet *, struct ifmediareq *); struct cfdriver epic_cd = { - 0, "epic", DV_IFNET + NULL, "epic", DV_IFNET }; #define INTMASK (INTSTAT_FATAL_INT | INTSTAT_TXU | \ diff --git a/sys/dev/ic/trm.h b/sys/dev/ic/trm.h index 3f0bf34d6..48a0cd161 100644 --- a/sys/dev/ic/trm.h +++ b/sys/dev/ic/trm.h @@ -1,4 +1,4 @@ -/* $OpenBSD: trm.h,v 1.8 2024/09/04 07:54:52 mglocker Exp $ +/* $OpenBSD: trm.h,v 1.9 2024/10/22 21:50:02 jsg Exp $ * ------------------------------------------------------------ * O.S : OpenBSD * File Name : trm.h @@ -41,8 +41,7 @@ * Segment Entry * ------------------------------------------------------------ */ -struct SGentry -{ +struct SGentry { u_int32_t address; u_int32_t length; }; @@ -68,8 +67,7 @@ struct SGentry * SCSI Request Block *----------------------------------------------------------------------- */ -struct trm_scsi_req_q -{ +struct trm_scsi_req_q { TAILQ_ENTRY(trm_scsi_req_q) link; bus_dmamap_t dmamapxfer; u_int32_t PhysSRB; @@ -144,8 +142,7 @@ TAILQ_HEAD(SRB_HEAD, trm_scsi_req_q); * Device Control Block *----------------------------------------------------------------------- */ -struct trm_dcb -{ +struct trm_dcb { u_int32_t TagMask; u_int16_t DCBFlag; @@ -180,8 +177,7 @@ struct trm_dcb * Adapter Control Block *----------------------------------------------------------------------- */ -struct trm_softc -{ +struct trm_softc { struct device sc_device; bus_space_handle_t sc_iohandle; @@ -226,8 +222,7 @@ struct trm_softc /* * The SEEPROM structure for TRM_S1040 */ -struct trm_target_nvram -{ +struct trm_target_nvram { u_int8_t NvmTarCfg0; /* Target configuration byte 0 */ #define TRM_WIDE 0x20 /* Wide negotiate */ #define TRM_TAG_QUEUING 0x10 /* Enable SCSI tag queuing */ @@ -241,8 +236,7 @@ struct trm_target_nvram u_int8_t NvmTarCfg3; /* Target configuration byte 3 */ }; -struct trm_adapter_nvram -{ +struct trm_adapter_nvram { u_int8_t NvramSubVendorID[2]; /*0,1 Sub Vendor ID */ u_int8_t NvramSubSysID[2]; /*2,3 Sub System ID */ u_int8_t NvramSubClass; /*4 Sub Class */ diff --git a/sys/dev/ic/ufshci.c b/sys/dev/ic/ufshci.c index 9e8e0112e..79a981dfb 100644 --- a/sys/dev/ic/ufshci.c +++ b/sys/dev/ic/ufshci.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ufshci.c,v 1.42 2024/10/08 00:46:29 jsg Exp $ */ +/* $OpenBSD: ufshci.c,v 1.43 2024/11/09 22:41:34 jsg Exp $ */ /* * Copyright (c) 2022 Marcus Glocker @@ -97,9 +97,6 @@ void ufshci_ccb_put(void *, void *); void ufshci_ccb_free(struct ufshci_softc*, int); void ufshci_scsi_cmd(struct scsi_xfer *); -void ufshci_minphys(struct buf *, struct scsi_link *); -int ufshci_scsi_probe(struct scsi_link *); -void ufshci_scsi_free(struct scsi_link *); void ufshci_scsi_inquiry(struct scsi_xfer *); void ufshci_scsi_capacity16(struct scsi_xfer *); @@ -1552,26 +1549,6 @@ ufshci_scsi_cmd(struct scsi_xfer *xs) mtx_leave(&sc->sc_cmd_mtx); } -void -ufshci_minphys(struct buf *bp, struct scsi_link *link) -{ - DPRINTF(3, "%s\n", __func__); -} - -int -ufshci_scsi_probe(struct scsi_link *link) -{ - DPRINTF(3, "%s\n", __func__); - - return 0; -} - -void -ufshci_scsi_free(struct scsi_link *link) -{ - DPRINTF(3, "%s\n", __func__); -} - void ufshci_scsi_inquiry(struct scsi_xfer *xs) { diff --git a/sys/dev/ic/xl.c b/sys/dev/ic/xl.c index 00ba39b26..ad29123b8 100644 --- a/sys/dev/ic/xl.c +++ b/sys/dev/ic/xl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: xl.c,v 1.140 2024/08/31 16:23:09 deraadt Exp $ */ +/* $OpenBSD: xl.c,v 1.141 2024/11/05 18:58:59 miod Exp $ */ /* * Copyright (c) 1997, 1998, 1999 @@ -2654,5 +2654,5 @@ xl_wol(struct ifnet *ifp, int enable) #endif struct cfdriver xl_cd = { - 0, "xl", DV_IFNET + NULL, "xl", DV_IFNET }; diff --git a/sys/dev/isa/essvar.h b/sys/dev/isa/essvar.h index f20fe6cfe..fcdbb3bf9 100644 --- a/sys/dev/isa/essvar.h +++ b/sys/dev/isa/essvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: essvar.h,v 1.5 2002/03/14 03:16:05 millert Exp $ */ +/* $OpenBSD: essvar.h,v 1.6 2024/10/22 21:50:02 jsg Exp $ */ /* $NetBSD: essvar.h,v 1.14 1999/03/18 06:03:31 mycroft Exp $ */ /* * Copyright 1997 @@ -34,7 +34,7 @@ */ /* -** @(#) $RCSfile: essvar.h,v $ $Revision: 1.5 $ (SHARK) $Date: 2002/03/14 03:16:05 $ +** @(#) $RCSfile: essvar.h,v $ $Revision: 1.6 $ (SHARK) $Date: 2024/10/22 21:50:02 $ ** **++ ** @@ -95,8 +95,7 @@ #define ESS_1888_NDEVS 22 #define ESS_MAX_NDEVS 22 -struct ess_audio_channel -{ +struct ess_audio_channel { int drq; /* DMA channel */ #define IS16BITDRQ(drq) ((drq) >= 4) int irq; /* IRQ line for this DMA channel */ @@ -118,8 +117,7 @@ struct ess_audio_channel int blksize; /* current block size */ }; -struct ess_softc -{ +struct ess_softc { struct device sc_dev; /* base device */ struct device *sc_isa; isa_chipset_tag_t sc_ic; diff --git a/sys/dev/kcov.c b/sys/dev/kcov.c index f572134bb..17574fa1e 100644 --- a/sys/dev/kcov.c +++ b/sys/dev/kcov.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kcov.c,v 1.49 2023/07/29 06:52:50 anton Exp $ */ +/* $OpenBSD: kcov.c,v 1.50 2024/11/10 10:04:33 jsg Exp $ */ /* * Copyright (c) 2018 Anton Lindqvist @@ -132,12 +132,7 @@ struct pool kr_pool; static inline int inintr(struct cpu_info *ci) { -#if defined(__amd64__) || defined(__arm__) || defined(__arm64__) || \ - defined(__i386__) return (ci->ci_idepth > 0); -#else - return (0); -#endif } /* diff --git a/sys/dev/midi.c b/sys/dev/midi.c index 923c06b9f..4b6f0bba0 100644 --- a/sys/dev/midi.c +++ b/sys/dev/midi.c @@ -1,4 +1,4 @@ -/* $OpenBSD: midi.c,v 1.57 2024/05/13 01:15:50 jsg Exp $ */ +/* $OpenBSD: midi.c,v 1.58 2024/12/30 02:46:00 guenther Exp $ */ /* * Copyright (c) 2003, 2004 Alexandre Ratchov @@ -410,9 +410,6 @@ midiioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p) return ENXIO; error = 0; switch(cmd) { - case FIONBIO: - /* All handled in the upper FS layer */ - break; default: error = ENOTTY; } diff --git a/sys/dev/ofw/openfirm.h b/sys/dev/ofw/openfirm.h index 98296e5aa..220e3eacd 100644 --- a/sys/dev/ofw/openfirm.h +++ b/sys/dev/ofw/openfirm.h @@ -1,4 +1,4 @@ -/* $OpenBSD: openfirm.h,v 1.19 2024/05/13 01:15:51 jsg Exp $ */ +/* $OpenBSD: openfirm.h,v 1.20 2024/11/08 12:48:00 miod Exp $ */ /* $NetBSD: openfirm.h,v 1.1 1996/09/30 16:35:10 ws Exp $ */ /* @@ -59,8 +59,6 @@ int OF_setprop(int, char *, const void *, int); int OF_nextprop(int, char *, void *); int OF_finddevice(char *name); int OF_is_compatible(int, const char *); -int OF_instance_to_path(int ihandle, char *buf, int buflen); -int OF_package_to_path(int phandle, char *buf, int buflen); int OF_call_method_1(char *method, int ihandle, int nargs, ...); int OF_call_method(char *method, int ihandle, int nargs, int nreturns, ...); int OF_open(char *dname); diff --git a/sys/dev/pci/ccp_pci.c b/sys/dev/pci/ccp_pci.c index 8e1168689..49991d125 100644 --- a/sys/dev/pci/ccp_pci.c +++ b/sys/dev/pci/ccp_pci.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ccp_pci.c,v 1.13 2024/09/04 07:45:08 jsg Exp $ */ +/* $OpenBSD: ccp_pci.c,v 1.14 2024/10/24 18:52:59 bluhm Exp $ */ /* * Copyright (c) 2018 David Gwynne @@ -36,9 +36,6 @@ int ccp_pci_match(struct device *, void *, void *); void ccp_pci_attach(struct device *, struct device *, void *); -void ccp_pci_intr_map(struct ccp_softc *, struct pci_attach_args *); -void ccp_pci_psp_attach(struct ccp_softc *, struct pci_attach_args *); - const struct cfattach ccp_pci_ca = { sizeof(struct ccp_softc), ccp_pci_match, @@ -67,6 +64,9 @@ ccp_pci_attach(struct device *parent, struct device *self, void *aux) struct ccp_softc *sc = (struct ccp_softc *)self; struct pci_attach_args *pa = aux; pcireg_t memtype; +#if NPSP > 0 + int psp_matched; +#endif memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, CCP_PCI_BAR); if (PCI_MAPREG_TYPE(memtype) != PCI_MAPREG_TYPE_MEM) { @@ -80,59 +80,16 @@ ccp_pci_attach(struct device *parent, struct device *self, void *aux) return; } - ccp_pci_intr_map(sc, pa); +#if NPSP > 0 + psp_matched = psp_pci_match(sc, aux); + if (psp_matched) + psp_pci_intr_map(sc, pa); +#endif ccp_attach(sc); - ccp_pci_psp_attach(sc, pa); -} - -void -ccp_pci_intr_map(struct ccp_softc *sc, struct pci_attach_args *pa) -{ #if NPSP > 0 - pci_intr_handle_t ih; - const char *intrstr = NULL; - - /* clear and disable interrupts */ - bus_space_write_4(sc->sc_iot, sc->sc_ioh, PSP_REG_INTEN, 0); - bus_space_write_4(sc->sc_iot, sc->sc_ioh, PSP_REG_INTSTS, -1); - - if (pci_intr_map_msix(pa, 0, &ih) != 0 && - pci_intr_map_msi(pa, &ih) != 0 && pci_intr_map(pa, &ih) != 0) { - printf(": couldn't map interrupt\n"); - return; - } - - intrstr = pci_intr_string(pa->pa_pc, ih); - sc->sc_irqh = pci_intr_establish(pa->pa_pc, ih, IPL_BIO, psp_sev_intr, - sc, sc->sc_dev.dv_xname); - if (sc->sc_irqh != NULL) - printf(": %s", intrstr); -#endif -} - -void -ccp_pci_psp_attach(struct ccp_softc *sc, struct pci_attach_args *pa) -{ -#if NPSP > 0 - struct psp_attach_args arg; - struct device *self = (struct device *)sc; - - memset(&arg, 0, sizeof(arg)); - arg.iot = sc->sc_iot; - arg.ioh = sc->sc_ioh; - arg.dmat = pa->pa_dmat; - arg.capabilities = bus_space_read_4(sc->sc_iot, sc->sc_ioh, - PSP_REG_CAPABILITIES); - - sc->sc_psp = config_found_sm(self, &arg, pspprint, pspsubmatch); - if (sc->sc_psp == NULL) { - pci_intr_disestablish(pa->pa_pc, sc->sc_irqh); - return; - } - - /* enable interrupts */ - bus_space_write_4(sc->sc_iot, sc->sc_ioh, PSP_REG_INTEN, -1); + if (psp_matched) + psp_pci_attach(sc, pa); #endif } diff --git a/sys/dev/pci/cz.c b/sys/dev/pci/cz.c index afb5d0a67..b7e695c14 100644 --- a/sys/dev/pci/cz.c +++ b/sys/dev/pci/cz.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cz.c,v 1.29 2024/05/24 06:02:53 jsg Exp $ */ +/* $OpenBSD: cz.c,v 1.30 2024/11/05 18:58:59 miod Exp $ */ /* $NetBSD: cz.c,v 1.15 2001/01/20 19:10:36 thorpej Exp $ */ /*- @@ -192,7 +192,7 @@ int cztty_to_tiocm(struct cztty_softc *sc); void cztty_diag(void *arg); struct cfdriver cz_cd = { - 0, "cz", DV_TTY + NULL, "cz", DV_TTY }; /* diff --git a/sys/dev/pci/drm/amd/amdgpu/amdgpu_acpi.c b/sys/dev/pci/drm/amd/amdgpu/amdgpu_acpi.c index 8e326af9c..d9edad835 100644 --- a/sys/dev/pci/drm/amd/amdgpu/amdgpu_acpi.c +++ b/sys/dev/pci/drm/amd/amdgpu/amdgpu_acpi.c @@ -149,6 +149,7 @@ static union acpi_object *amdgpu_atif_call(struct amdgpu_atif *atif, struct acpi_buffer *params) { acpi_status status; + union acpi_object *obj; union acpi_object atif_arg_elements[2]; struct acpi_object_list atif_arg; struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; @@ -171,16 +172,24 @@ static union acpi_object *amdgpu_atif_call(struct amdgpu_atif *atif, status = acpi_evaluate_object(atif->handle, NULL, &atif_arg, &buffer); + obj = (union acpi_object *)buffer.pointer; - /* Fail only if calling the method fails and ATIF is supported */ - if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { + /* Fail if calling the method fails */ + if (ACPI_FAILURE(status)) { DRM_DEBUG_DRIVER("failed to evaluate ATIF got %s\n", acpi_format_exception(status)); - kfree(buffer.pointer); + kfree(obj); return NULL; } - return buffer.pointer; + if (obj->type != ACPI_TYPE_BUFFER) { + DRM_DEBUG_DRIVER("bad object returned from ATIF: %d\n", + obj->type); + kfree(obj); + return NULL; + } + + return obj; } /** @@ -791,6 +800,7 @@ int amdgpu_acpi_power_shift_control(struct amdgpu_device *adev, return -EIO; } + kfree(info); return 0; } diff --git a/sys/dev/pci/drm/amd/amdgpu/amdgpu_cs.c b/sys/dev/pci/drm/amd/amdgpu/amdgpu_cs.c index 784e66c1e..a2f2fe650 100644 --- a/sys/dev/pci/drm/amd/amdgpu/amdgpu_cs.c +++ b/sys/dev/pci/drm/amd/amdgpu/amdgpu_cs.c @@ -265,7 +265,7 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p, /* Only a single BO list is allowed to simplify handling. */ if (p->bo_list) - ret = -EINVAL; + goto free_partial_kdata; ret = amdgpu_cs_p1_bo_handles(p, p->chunks[i].kdata); if (ret) diff --git a/sys/dev/pci/drm/amd/amdgpu/amdgpu_debugfs.c b/sys/dev/pci/drm/amd/amdgpu/amdgpu_debugfs.c index 1c2c9ff9d..963e106d3 100644 --- a/sys/dev/pci/drm/amd/amdgpu/amdgpu_debugfs.c +++ b/sys/dev/pci/drm/amd/amdgpu/amdgpu_debugfs.c @@ -402,7 +402,7 @@ static ssize_t amdgpu_debugfs_gprwave_read(struct file *f, char __user *buf, siz int r; uint32_t *data, x; - if (size & 0x3 || *pos & 0x3) + if (size > 4096 || size & 0x3 || *pos & 0x3) return -EINVAL; r = pm_runtime_get_sync(adev_to_drm(adev)->dev); @@ -1641,7 +1641,7 @@ int amdgpu_debugfs_regs_init(struct amdgpu_device *adev) for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) { ent = debugfs_create_file(debugfs_regs_names[i], - S_IFREG | 0444, root, + S_IFREG | 0400, root, adev, debugfs_regs[i]); if (!i && !IS_ERR_OR_NULL(ent)) i_size_write(ent->d_inode, adev->rmmio_size); @@ -2176,11 +2176,11 @@ int amdgpu_debugfs_init(struct amdgpu_device *adev) amdgpu_securedisplay_debugfs_init(adev); amdgpu_fw_attestation_debugfs_init(adev); - debugfs_create_file("amdgpu_evict_vram", 0444, root, adev, + debugfs_create_file("amdgpu_evict_vram", 0400, root, adev, &amdgpu_evict_vram_fops); - debugfs_create_file("amdgpu_evict_gtt", 0444, root, adev, + debugfs_create_file("amdgpu_evict_gtt", 0400, root, adev, &amdgpu_evict_gtt_fops); - debugfs_create_file("amdgpu_test_ib", 0444, root, adev, + debugfs_create_file("amdgpu_test_ib", 0400, root, adev, &amdgpu_debugfs_test_ib_fops); debugfs_create_file("amdgpu_vm_info", 0444, root, adev, &amdgpu_debugfs_vm_info_fops); diff --git a/sys/dev/pci/drm/amd/amdgpu/amdgpu_device.c b/sys/dev/pci/drm/amd/amdgpu/amdgpu_device.c index 79f4751f4..a21972837 100644 --- a/sys/dev/pci/drm/amd/amdgpu/amdgpu_device.c +++ b/sys/dev/pci/drm/amd/amdgpu/amdgpu_device.c @@ -3200,7 +3200,7 @@ static int amdgpu_device_ip_resume_phase1(struct amdgpu_device *adev) * * @adev: amdgpu_device pointer * - * First resume function for hardware IPs. The list of all the hardware + * Second resume function for hardware IPs. The list of all the hardware * IPs that make up the asic is walked and the resume callbacks are run for * all blocks except COMMON, GMC, and IH. resume puts the hardware into a * functional state after a suspend and updates the software state as @@ -3218,6 +3218,7 @@ static int amdgpu_device_ip_resume_phase2(struct amdgpu_device *adev) if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON || adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC || adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH || + adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_DCE || adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP) continue; r = adev->ip_blocks[i].version->funcs->resume(adev); @@ -3232,6 +3233,36 @@ static int amdgpu_device_ip_resume_phase2(struct amdgpu_device *adev) return 0; } +/** + * amdgpu_device_ip_resume_phase3 - run resume for hardware IPs + * + * @adev: amdgpu_device pointer + * + * Third resume function for hardware IPs. The list of all the hardware + * IPs that make up the asic is walked and the resume callbacks are run for + * all DCE. resume puts the hardware into a functional state after a suspend + * and updates the software state as necessary. This function is also used + * for restoring the GPU after a GPU reset. + * + * Returns 0 on success, negative error code on failure. + */ +static int amdgpu_device_ip_resume_phase3(struct amdgpu_device *adev) +{ + int i, r; + + for (i = 0; i < adev->num_ip_blocks; i++) { + if (!adev->ip_blocks[i].status.valid || adev->ip_blocks[i].status.hw) + continue; + if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_DCE) { + r = adev->ip_blocks[i].version->funcs->resume(adev); + if (r) + return r; + } + } + + return 0; +} + /** * amdgpu_device_ip_resume - run resume for hardware IPs * @@ -3258,6 +3289,13 @@ static int amdgpu_device_ip_resume(struct amdgpu_device *adev) r = amdgpu_device_ip_resume_phase2(adev); + if (r) + return r; + + amdgpu_fence_driver_hw_init(adev); + + r = amdgpu_device_ip_resume_phase3(adev); + return r; } @@ -4124,8 +4162,8 @@ void amdgpu_device_fini_sw(struct amdgpu_device *adev) int idx; bool px; - amdgpu_fence_driver_sw_fini(adev); amdgpu_device_ip_fini(adev); + amdgpu_fence_driver_sw_fini(adev); amdgpu_ucode_release(&adev->firmware.gpu_info_fw); adev->accel_working = false; dma_fence_put(rcu_dereference_protected(adev->gang_submit, true)); @@ -4354,7 +4392,6 @@ int amdgpu_device_resume(struct drm_device *dev, bool fbcon) dev_err(adev->dev, "amdgpu_device_ip_resume failed (%d).\n", r); goto exit; } - amdgpu_fence_driver_hw_init(adev); r = amdgpu_device_ip_late_init(adev); if (r) @@ -5124,6 +5161,10 @@ int amdgpu_do_asic_reset(struct list_head *device_list_handle, if (r) goto out; + r = amdgpu_device_ip_resume_phase3(tmp_adev); + if (r) + goto out; + if (vram_lost) amdgpu_device_fill_reset_magic(tmp_adev); @@ -5991,6 +6032,9 @@ bool amdgpu_device_cache_pci_state(struct pci_dev *pdev) struct amdgpu_device *adev = drm_to_adev(dev); int r; + if (amdgpu_sriov_vf(adev)) + return false; + r = pci_save_state(pdev); if (!r) { kfree(adev->pci_state); diff --git a/sys/dev/pci/drm/amd/amdgpu/amdgpu_devlist.h b/sys/dev/pci/drm/amd/amdgpu/amdgpu_devlist.h index ae9251cdf..2fb2c480f 100644 --- a/sys/dev/pci/drm/amd/amdgpu/amdgpu_devlist.h +++ b/sys/dev/pci/drm/amd/amdgpu/amdgpu_devlist.h @@ -249,6 +249,7 @@ static const struct pci_matchid amdgpu_devices[] = { {0x1002, 0x150e }, /* Radeon 880M / 890M */ /* GC 11.5.1, DCN 3.5.1, APU, linux 6.9 */ + /* GC 11.5.2, DCN 3.5.1, APU, linux 6.11 */ /* GC 12.0.0, DCN 4.0.1, dGPU, linux 6.11 */ /* GC 12.0.1, DCN 4.0.1, dGPU, linux 6.11 */ diff --git a/sys/dev/pci/drm/amd/amdgpu/amdgpu_gem.c b/sys/dev/pci/drm/amd/amdgpu/amdgpu_gem.c index 4818cbb7e..6826de47a 100644 --- a/sys/dev/pci/drm/amd/amdgpu/amdgpu_gem.c +++ b/sys/dev/pci/drm/amd/amdgpu/amdgpu_gem.c @@ -99,19 +99,7 @@ amdgpu_gem_fault(struct uvm_faultinfo *ufi, vaddr_t vaddr, vm_page_t *pps, ret = ttm_bo_vm_reserve(bo); if (ret) { - switch (ret) { - case VM_FAULT_NOPAGE: - ret = VM_PAGER_OK; - break; - case VM_FAULT_RETRY: - ret = VM_PAGER_REFAULT; - break; - default: - ret = VM_PAGER_BAD; - break; - } - uvmfault_unlockall(ufi, NULL, uobj); - return ret; + goto out; } if (drm_dev_enter(ddev, &idx)) { @@ -137,18 +125,19 @@ amdgpu_gem_fault(struct uvm_faultinfo *ufi, vaddr_t vaddr, vm_page_t *pps, #endif unlock: + dma_resv_unlock(bo->base.resv); +out: switch (ret) { case VM_FAULT_NOPAGE: - ret = VM_PAGER_OK; + ret = 0; break; case VM_FAULT_RETRY: - ret = VM_PAGER_REFAULT; + ret = ERESTART; break; default: - ret = VM_PAGER_BAD; + ret = EACCES; break; } - dma_resv_unlock(bo->base.resv); uvmfault_unlockall(ufi, NULL, uobj); return ret; } diff --git a/sys/dev/pci/drm/amd/amdgpu/amdgpu_job.c b/sys/dev/pci/drm/amd/amdgpu/amdgpu_job.c index 99dd86337..49a6b6b88 100644 --- a/sys/dev/pci/drm/amd/amdgpu/amdgpu_job.c +++ b/sys/dev/pci/drm/amd/amdgpu/amdgpu_job.c @@ -159,7 +159,6 @@ void amdgpu_job_set_resources(struct amdgpu_job *job, struct amdgpu_bo *gds, void amdgpu_job_free_resources(struct amdgpu_job *job) { - struct amdgpu_ring *ring = to_amdgpu_ring(job->base.sched); struct dma_fence *f; unsigned i; @@ -172,7 +171,7 @@ void amdgpu_job_free_resources(struct amdgpu_job *job) f = NULL; for (i = 0; i < job->num_ibs; ++i) - amdgpu_ib_free(ring->adev, &job->ibs[i], f); + amdgpu_ib_free(NULL, &job->ibs[i], f); } static void amdgpu_job_free_cb(struct drm_sched_job *s_job) diff --git a/sys/dev/pci/drm/amd/amdgpu/amdgpu_mes.c b/sys/dev/pci/drm/amd/amdgpu/amdgpu_mes.c index 3cb010f1f..d55edc675 100644 --- a/sys/dev/pci/drm/amd/amdgpu/amdgpu_mes.c +++ b/sys/dev/pci/drm/amd/amdgpu/amdgpu_mes.c @@ -1053,8 +1053,10 @@ int amdgpu_mes_add_ring(struct amdgpu_device *adev, int gang_id, r = amdgpu_ring_init(adev, ring, 1024, NULL, 0, AMDGPU_RING_PRIO_DEFAULT, NULL); - if (r) + if (r) { + amdgpu_mes_unlock(&adev->mes); goto clean_up_memory; + } amdgpu_mes_ring_to_queue_props(adev, ring, &qprops); @@ -1087,7 +1089,6 @@ clean_up_ring: amdgpu_ring_fini(ring); clean_up_memory: kfree(ring); - amdgpu_mes_unlock(&adev->mes); return r; } diff --git a/sys/dev/pci/drm/amd/amdgpu/amdgpu_ttm.c b/sys/dev/pci/drm/amd/amdgpu/amdgpu_ttm.c index bd04f289e..4db5e4e93 100644 --- a/sys/dev/pci/drm/amd/amdgpu/amdgpu_ttm.c +++ b/sys/dev/pci/drm/amd/amdgpu/amdgpu_ttm.c @@ -797,7 +797,7 @@ static int amdgpu_ttm_tt_pin_userptr(struct ttm_device *bdev, /* Map SG to device */ r = dma_map_sgtable(adev->dev, ttm->sg, direction, 0); if (r) - goto release_sg; + goto release_sg_table; /* convert SG to linear array of pages and dma addresses */ drm_prime_sg_to_dma_addr_array(ttm->sg, gtt->ttm.dma_address, @@ -805,6 +805,8 @@ static int amdgpu_ttm_tt_pin_userptr(struct ttm_device *bdev, return 0; +release_sg_table: + sg_free_table(ttm->sg); release_sg: kfree(ttm->sg); ttm->sg = NULL; @@ -1870,6 +1872,7 @@ int amdgpu_ttm_init(struct amdgpu_device *adev) rw_init(&adev->mman.gtt_window_lock, "gttwin"); + dma_set_max_seg_size(adev->dev, UINT_MAX); /* No others user of address space so set it to 0 */ #ifdef notyet r = ttm_device_init(&adev->mman.bdev, &amdgpu_bo_driver, adev->dev, diff --git a/sys/dev/pci/drm/amd/amdgpu/amdgpu_vce.c b/sys/dev/pci/drm/amd/amdgpu/amdgpu_vce.c index d7ffec7b8..d9947083c 100644 --- a/sys/dev/pci/drm/amd/amdgpu/amdgpu_vce.c +++ b/sys/dev/pci/drm/amd/amdgpu/amdgpu_vce.c @@ -214,15 +214,15 @@ int amdgpu_vce_sw_fini(struct amdgpu_device *adev) drm_sched_entity_destroy(&adev->vce.entity); - amdgpu_bo_free_kernel(&adev->vce.vcpu_bo, &adev->vce.gpu_addr, - (void **)&adev->vce.cpu_addr); - for (i = 0; i < adev->vce.num_rings; i++) amdgpu_ring_fini(&adev->vce.ring[i]); amdgpu_ucode_release(&adev->vce.fw); mutex_destroy(&adev->vce.idle_mutex); + amdgpu_bo_free_kernel(&adev->vce.vcpu_bo, &adev->vce.gpu_addr, + (void **)&adev->vce.cpu_addr); + return 0; } diff --git a/sys/dev/pci/drm/amd/amdgpu/amdgpu_vm.c b/sys/dev/pci/drm/amd/amdgpu/amdgpu_vm.c index f9f4f531e..62d96aee5 100644 --- a/sys/dev/pci/drm/amd/amdgpu/amdgpu_vm.c +++ b/sys/dev/pci/drm/amd/amdgpu/amdgpu_vm.c @@ -1223,10 +1223,9 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev, struct amdgpu_bo_va *bo_va, * next command submission. */ if (bo && bo->tbo.base.resv == vm->root.bo->tbo.base.resv) { - uint32_t mem_type = bo->tbo.resource->mem_type; - - if (!(bo->preferred_domains & - amdgpu_mem_type_to_domain(mem_type))) + if (bo->tbo.resource && + !(bo->preferred_domains & + amdgpu_mem_type_to_domain(bo->tbo.resource->mem_type))) amdgpu_vm_bo_evicted(&bo_va->base); else amdgpu_vm_bo_idle(&bo_va->base); diff --git a/sys/dev/pci/drm/amd/amdgpu/aqua_vanjaram.c b/sys/dev/pci/drm/amd/amdgpu/aqua_vanjaram.c index 6c6f9d9b5..fb20faa2c 100644 --- a/sys/dev/pci/drm/amd/amdgpu/aqua_vanjaram.c +++ b/sys/dev/pci/drm/amd/amdgpu/aqua_vanjaram.c @@ -440,7 +440,7 @@ static bool __aqua_vanjaram_is_valid_mode(struct amdgpu_xcp_mgr *xcp_mgr, case AMDGPU_SPX_PARTITION_MODE: return adev->gmc.num_mem_partitions == 1 && num_xcc > 0; case AMDGPU_DPX_PARTITION_MODE: - return adev->gmc.num_mem_partitions != 8 && (num_xcc % 4) == 0; + return adev->gmc.num_mem_partitions <= 2 && (num_xcc % 4) == 0; case AMDGPU_TPX_PARTITION_MODE: return (adev->gmc.num_mem_partitions == 1 || adev->gmc.num_mem_partitions == 3) && diff --git a/sys/dev/pci/drm/amd/amdgpu/hdp_v5_2.c b/sys/dev/pci/drm/amd/amdgpu/hdp_v5_2.c index 29c3484ae..f52552c5f 100644 --- a/sys/dev/pci/drm/amd/amdgpu/hdp_v5_2.c +++ b/sys/dev/pci/drm/amd/amdgpu/hdp_v5_2.c @@ -31,13 +31,15 @@ static void hdp_v5_2_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring) { - if (!ring || !ring->funcs->emit_wreg) + if (!ring || !ring->funcs->emit_wreg) { WREG32_NO_KIQ((adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL) >> 2, 0); - else + RREG32_NO_KIQ((adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL) >> 2); + } else { amdgpu_ring_emit_wreg(ring, (adev->rmmio_remap.reg_offset + KFD_MMIO_REMAP_HDP_MEM_FLUSH_CNTL) >> 2, 0); + } } static void hdp_v5_2_update_mem_power_gating(struct amdgpu_device *adev, diff --git a/sys/dev/pci/drm/amd/amdgpu/nbio_v7_7.c b/sys/dev/pci/drm/amd/amdgpu/nbio_v7_7.c index def89379b..d23e7391c 100644 --- a/sys/dev/pci/drm/amd/amdgpu/nbio_v7_7.c +++ b/sys/dev/pci/drm/amd/amdgpu/nbio_v7_7.c @@ -247,6 +247,12 @@ static void nbio_v7_7_init_registers(struct amdgpu_device *adev) if (def != data) WREG32_SOC15(NBIO, 0, regBIF0_PCIE_MST_CTRL_3, data); + switch (adev->ip_versions[NBIO_HWIP][0]) { + case IP_VERSION(7, 7, 0): + data = RREG32_SOC15(NBIO, 0, regRCC_DEV0_EPF5_STRAP4) & ~BIT(23); + WREG32_SOC15(NBIO, 0, regRCC_DEV0_EPF5_STRAP4, data); + break; + } } static void nbio_v7_7_update_medium_grain_clock_gating(struct amdgpu_device *adev, diff --git a/sys/dev/pci/drm/amd/amdgpu/uvd_v7_0.c b/sys/dev/pci/drm/amd/amdgpu/uvd_v7_0.c index 5d94ec848..c7742dca6 100644 --- a/sys/dev/pci/drm/amd/amdgpu/uvd_v7_0.c +++ b/sys/dev/pci/drm/amd/amdgpu/uvd_v7_0.c @@ -1286,7 +1286,7 @@ static int uvd_v7_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p, struct amdgpu_job *job, struct amdgpu_ib *ib) { - struct amdgpu_ring *ring = to_amdgpu_ring(job->base.sched); + struct amdgpu_ring *ring = amdgpu_job_ring(job); unsigned i; /* No patching necessary for the first instance */ diff --git a/sys/dev/pci/drm/amd/amdgpu/vcn_v4_0_3.c b/sys/dev/pci/drm/amd/amdgpu/vcn_v4_0_3.c index f7f01a836..880bc9e2f 100644 --- a/sys/dev/pci/drm/amd/amdgpu/vcn_v4_0_3.c +++ b/sys/dev/pci/drm/amd/amdgpu/vcn_v4_0_3.c @@ -77,6 +77,20 @@ static int vcn_v4_0_3_early_init(void *handle) return amdgpu_vcn_early_init(adev); } +static int vcn_v4_0_3_fw_shared_init(struct amdgpu_device *adev, int inst_idx) +{ + struct amdgpu_vcn4_fw_shared *fw_shared; + + fw_shared = adev->vcn.inst[inst_idx].fw_shared.cpu_addr; + fw_shared->present_flag_0 = cpu_to_le32(AMDGPU_FW_SHARED_FLAG_0_UNIFIED_QUEUE); + fw_shared->sq.is_enabled = 1; + + if (amdgpu_vcnfw_log) + amdgpu_vcn_fwlog_init(&adev->vcn.inst[inst_idx]); + + return 0; +} + /** * vcn_v4_0_3_sw_init - sw init for VCN block * @@ -107,8 +121,6 @@ static int vcn_v4_0_3_sw_init(void *handle) return r; for (i = 0; i < adev->vcn.num_vcn_inst; i++) { - volatile struct amdgpu_vcn4_fw_shared *fw_shared; - vcn_inst = GET_INST(VCN, i); ring = &adev->vcn.inst[i].ring_enc[0]; @@ -131,12 +143,7 @@ static int vcn_v4_0_3_sw_init(void *handle) if (r) return r; - fw_shared = adev->vcn.inst[i].fw_shared.cpu_addr; - fw_shared->present_flag_0 = cpu_to_le32(AMDGPU_FW_SHARED_FLAG_0_UNIFIED_QUEUE); - fw_shared->sq.is_enabled = true; - - if (amdgpu_vcnfw_log) - amdgpu_vcn_fwlog_init(&adev->vcn.inst[i]); + vcn_v4_0_3_fw_shared_init(adev, i); } if (amdgpu_sriov_vf(adev)) { @@ -221,6 +228,8 @@ static int vcn_v4_0_3_hw_init(void *handle) } } else { for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { + struct amdgpu_vcn4_fw_shared *fw_shared; + vcn_inst = GET_INST(VCN, i); ring = &adev->vcn.inst[i].ring_enc[0]; @@ -244,6 +253,11 @@ static int vcn_v4_0_3_hw_init(void *handle) regVCN_RB1_DB_CTRL); } + /* Re-init fw_shared when RAS fatal error occurred */ + fw_shared = adev->vcn.inst[i].fw_shared.cpu_addr; + if (!fw_shared->sq.is_enabled) + vcn_v4_0_3_fw_shared_init(adev, i); + r = amdgpu_ring_test_helper(ring); if (r) goto done; diff --git a/sys/dev/pci/drm/amd/amdgpu/vega20_ih.c b/sys/dev/pci/drm/amd/amdgpu/vega20_ih.c index 131e7b769..8ab2011e8 100644 --- a/sys/dev/pci/drm/amd/amdgpu/vega20_ih.c +++ b/sys/dev/pci/drm/amd/amdgpu/vega20_ih.c @@ -114,6 +114,33 @@ static int vega20_ih_toggle_ring_interrupts(struct amdgpu_device *adev, tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, RB_ENABLE, (enable ? 1 : 0)); tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, RB_GPU_TS_ENABLE, 1); + if (enable) { + /* Unset the CLEAR_OVERFLOW bit to make sure the next step + * is switching the bit from 0 to 1 + */ + tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 0); + if (amdgpu_sriov_vf(adev) && amdgpu_sriov_reg_indirect_ih(adev)) { + if (psp_reg_program(&adev->psp, ih_regs->psp_reg_id, tmp)) + return -ETIMEDOUT; + } else { + WREG32_NO_KIQ(ih_regs->ih_rb_cntl, tmp); + } + + /* Clear RB_OVERFLOW bit */ + tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 1); + if (amdgpu_sriov_vf(adev) && amdgpu_sriov_reg_indirect_ih(adev)) { + if (psp_reg_program(&adev->psp, ih_regs->psp_reg_id, tmp)) + return -ETIMEDOUT; + } else { + WREG32_NO_KIQ(ih_regs->ih_rb_cntl, tmp); + } + + /* Unset the CLEAR_OVERFLOW bit immediately so new overflows + * can be detected. + */ + tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 0); + } + /* enable_intr field is only valid in ring0 */ if (ih == &adev->irq.ih) tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, ENABLE_INTR, (enable ? 1 : 0)); diff --git a/sys/dev/pci/drm/amd/amdkfd/kfd_chardev.c b/sys/dev/pci/drm/amd/amdkfd/kfd_chardev.c index 0a1033521..2b64809ad 100644 --- a/sys/dev/pci/drm/amd/amdkfd/kfd_chardev.c +++ b/sys/dev/pci/drm/amd/amdkfd/kfd_chardev.c @@ -1164,7 +1164,7 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep, if (flags & KFD_IOC_ALLOC_MEM_FLAGS_AQL_QUEUE_MEM) size >>= 1; - WRITE_ONCE(pdd->vram_usage, pdd->vram_usage + PAGE_ALIGN(size)); + atomic64_add(PAGE_ALIGN(size), &pdd->vram_usage); } mutex_unlock(&p->mutex); @@ -1235,7 +1235,7 @@ static int kfd_ioctl_free_memory_of_gpu(struct file *filep, kfd_process_device_remove_obj_handle( pdd, GET_IDR_HANDLE(args->handle)); - WRITE_ONCE(pdd->vram_usage, pdd->vram_usage - size); + atomic64_sub(size, &pdd->vram_usage); err_unlock: err_pdd: @@ -2352,7 +2352,7 @@ static int criu_restore_memory_of_gpu(struct kfd_process_device *pdd, } else if (bo_bucket->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_VRAM) { bo_bucket->restored_offset = offset; /* Update the VRAM usage count */ - WRITE_ONCE(pdd->vram_usage, pdd->vram_usage + bo_bucket->size); + atomic64_add(bo_bucket->size, &pdd->vram_usage); } return 0; } diff --git a/sys/dev/pci/drm/amd/amdkfd/kfd_kernel_queue.c b/sys/dev/pci/drm/amd/amdkfd/kfd_kernel_queue.c index 1bea629c4..68d13c4fa 100644 --- a/sys/dev/pci/drm/amd/amdkfd/kfd_kernel_queue.c +++ b/sys/dev/pci/drm/amd/amdkfd/kfd_kernel_queue.c @@ -123,7 +123,7 @@ static bool kq_initialize(struct kernel_queue *kq, struct kfd_node *dev, memset(kq->pq_kernel_addr, 0, queue_size); memset(kq->rptr_kernel, 0, sizeof(*kq->rptr_kernel)); - memset(kq->wptr_kernel, 0, sizeof(*kq->wptr_kernel)); + memset(kq->wptr_kernel, 0, dev->kfd->device_info.doorbell_size); prop.queue_size = queue_size; prop.is_interop = false; diff --git a/sys/dev/pci/drm/amd/amdkfd/kfd_priv.h b/sys/dev/pci/drm/amd/amdkfd/kfd_priv.h index 67204c3df..27c9d5c43 100644 --- a/sys/dev/pci/drm/amd/amdkfd/kfd_priv.h +++ b/sys/dev/pci/drm/amd/amdkfd/kfd_priv.h @@ -765,7 +765,7 @@ struct kfd_process_device { enum kfd_pdd_bound bound; /* VRAM usage */ - uint64_t vram_usage; + atomic64_t vram_usage; struct attribute attr_vram; char vram_filename[MAX_SYSFS_FILENAME_LEN]; diff --git a/sys/dev/pci/drm/amd/amdkfd/kfd_process.c b/sys/dev/pci/drm/amd/amdkfd/kfd_process.c index 43f520b37..fd640a061 100644 --- a/sys/dev/pci/drm/amd/amdkfd/kfd_process.c +++ b/sys/dev/pci/drm/amd/amdkfd/kfd_process.c @@ -306,14 +306,14 @@ static ssize_t kfd_procfs_show(struct kobject *kobj, struct attribute *attr, } else if (strncmp(attr->name, "vram_", 5) == 0) { struct kfd_process_device *pdd = container_of(attr, struct kfd_process_device, attr_vram); - return snprintf(buffer, PAGE_SIZE, "%llu\n", READ_ONCE(pdd->vram_usage)); + return snprintf(buffer, PAGE_SIZE, "%llu\n", atomic64_read(&pdd->vram_usage)); } else if (strncmp(attr->name, "sdma_", 5) == 0) { struct kfd_process_device *pdd = container_of(attr, struct kfd_process_device, attr_sdma); struct kfd_sdma_activity_handler_workarea sdma_activity_work_handler; - INIT_WORK(&sdma_activity_work_handler.sdma_activity_work, - kfd_sdma_activity_worker); + INIT_WORK_ONSTACK(&sdma_activity_work_handler.sdma_activity_work, + kfd_sdma_activity_worker); sdma_activity_work_handler.pdd = pdd; sdma_activity_work_handler.sdma_activity_counter = 0; @@ -321,6 +321,7 @@ static ssize_t kfd_procfs_show(struct kobject *kobj, struct attribute *attr, schedule_work(&sdma_activity_work_handler.sdma_activity_work); flush_work(&sdma_activity_work_handler.sdma_activity_work); + destroy_work_on_stack(&sdma_activity_work_handler.sdma_activity_work); return snprintf(buffer, PAGE_SIZE, "%llu\n", (sdma_activity_work_handler.sdma_activity_counter)/ @@ -1589,7 +1590,7 @@ struct kfd_process_device *kfd_create_process_device_data(struct kfd_node *dev, pdd->bound = PDD_UNBOUND; pdd->already_dequeued = false; pdd->runtime_inuse = false; - pdd->vram_usage = 0; + atomic64_set(&pdd->vram_usage, 0); pdd->sdma_past_activity_counter = 0; pdd->user_gpu_id = dev->id; atomic64_set(&pdd->evict_duration_counter, 0); diff --git a/sys/dev/pci/drm/amd/amdkfd/kfd_svm.c b/sys/dev/pci/drm/amd/amdkfd/kfd_svm.c index ce76d4554..6b7c6f45a 100644 --- a/sys/dev/pci/drm/amd/amdkfd/kfd_svm.c +++ b/sys/dev/pci/drm/amd/amdkfd/kfd_svm.c @@ -391,6 +391,27 @@ static void svm_range_bo_release(struct kref *kref) spin_lock(&svm_bo->list_lock); } spin_unlock(&svm_bo->list_lock); + + if (mmget_not_zero(svm_bo->eviction_fence->mm)) { + struct kfd_process_device *pdd; + struct kfd_process *p; + struct mm_struct *mm; + + mm = svm_bo->eviction_fence->mm; + /* + * The forked child process takes svm_bo device pages ref, svm_bo could be + * released after parent process is gone. + */ + p = kfd_lookup_process_by_mm(mm); + if (p) { + pdd = kfd_get_process_device_data(svm_bo->node, p); + if (pdd) + atomic64_sub(amdgpu_bo_size(svm_bo->bo), &pdd->vram_usage); + kfd_unref_process(p); + } + mmput(mm); + } + if (!dma_fence_is_signaled(&svm_bo->eviction_fence->base)) /* We're not in the eviction worker. Signal the fence. */ dma_fence_signal(&svm_bo->eviction_fence->base); @@ -518,6 +539,7 @@ int svm_range_vram_node_new(struct kfd_node *node, struct svm_range *prange, bool clear) { + struct kfd_process_device *pdd; struct amdgpu_bo_param bp; struct svm_range_bo *svm_bo; struct amdgpu_bo_user *ubo; @@ -609,6 +631,10 @@ svm_range_vram_node_new(struct kfd_node *node, struct svm_range *prange, list_add(&prange->svm_bo_list, &svm_bo->range_list); spin_unlock(&svm_bo->list_lock); + pdd = svm_range_get_pdd_by_node(prange, node); + if (pdd) + atomic64_add(amdgpu_bo_size(bo), &pdd->vram_usage); + return 0; reserve_bo_failed: diff --git a/sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm.c index 4d80c46e3..c31730994 100644 --- a/sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -10732,7 +10732,7 @@ static int parse_amd_vsdb(struct amdgpu_dm_connector *aconnector, break; } - while (j < EDID_LENGTH) { + while (j < EDID_LENGTH - sizeof(struct amd_vsdb_block)) { struct amd_vsdb_block *amd_vsdb = (struct amd_vsdb_block *)&edid_ext[j]; unsigned int ieeeId = (amd_vsdb->ieee_id[2] << 16) | (amd_vsdb->ieee_id[1] << 8) | (amd_vsdb->ieee_id[0]); diff --git a/sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c index d390e3d62..9ec9792f1 100644 --- a/sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +++ b/sys/dev/pci/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c @@ -179,6 +179,8 @@ amdgpu_dm_mst_connector_early_unregister(struct drm_connector *connector) dc_sink_release(dc_sink); aconnector->dc_sink = NULL; aconnector->edid = NULL; + aconnector->dsc_aux = NULL; + port->passthrough_aux = NULL; } aconnector->mst_status = MST_STATUS_DEFAULT; @@ -487,6 +489,8 @@ dm_dp_mst_detect(struct drm_connector *connector, dc_sink_release(aconnector->dc_sink); aconnector->dc_sink = NULL; aconnector->edid = NULL; + aconnector->dsc_aux = NULL; + port->passthrough_aux = NULL; amdgpu_dm_set_mst_status(&aconnector->mst_status, MST_REMOTE_EDID | MST_ALLOCATE_NEW_PAYLOAD | MST_CLEAR_ALLOCATED_PAYLOAD, diff --git a/sys/dev/pci/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c b/sys/dev/pci/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c index 3271c8c79..4e036356b 100644 --- a/sys/dev/pci/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c +++ b/sys/dev/pci/drm/amd/display/dc/clk_mgr/dcn30/dcn30_clk_mgr.c @@ -560,11 +560,19 @@ void dcn3_clk_mgr_construct( dce_clock_read_ss_info(clk_mgr); clk_mgr->base.bw_params = kzalloc(sizeof(*clk_mgr->base.bw_params), GFP_KERNEL); + if (!clk_mgr->base.bw_params) { + BREAK_TO_DEBUGGER(); + return; + } /* need physical address of table to give to PMFW */ clk_mgr->wm_range_table = dm_helpers_allocate_gpu_mem(clk_mgr->base.ctx, DC_MEM_ALLOC_TYPE_GART, sizeof(WatermarksExternal_t), &clk_mgr->wm_range_table_addr); + if (!clk_mgr->wm_range_table) { + BREAK_TO_DEBUGGER(); + return; + } } void dcn3_clk_mgr_destroy(struct clk_mgr_internal *clk_mgr) diff --git a/sys/dev/pci/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c b/sys/dev/pci/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c index 2428a4763..1c5ae4d62 100644 --- a/sys/dev/pci/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c +++ b/sys/dev/pci/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c @@ -1022,11 +1022,19 @@ void dcn32_clk_mgr_construct( clk_mgr->smu_present = false; clk_mgr->base.bw_params = kzalloc(sizeof(*clk_mgr->base.bw_params), GFP_KERNEL); + if (!clk_mgr->base.bw_params) { + BREAK_TO_DEBUGGER(); + return; + } /* need physical address of table to give to PMFW */ clk_mgr->wm_range_table = dm_helpers_allocate_gpu_mem(clk_mgr->base.ctx, DC_MEM_ALLOC_TYPE_GART, sizeof(WatermarksExternal_t), &clk_mgr->wm_range_table_addr); + if (!clk_mgr->wm_range_table) { + BREAK_TO_DEBUGGER(); + return; + } } void dcn32_clk_mgr_destroy(struct clk_mgr_internal *clk_mgr) diff --git a/sys/dev/pci/drm/amd/display/dc/core/dc_hw_sequencer.c b/sys/dev/pci/drm/amd/display/dc/core/dc_hw_sequencer.c index f116c535b..da834cc2e 100644 --- a/sys/dev/pci/drm/amd/display/dc/core/dc_hw_sequencer.c +++ b/sys/dev/pci/drm/amd/display/dc/core/dc_hw_sequencer.c @@ -727,6 +727,9 @@ void hwss_setup_dpp(union block_sequence_params *params) struct dpp *dpp = pipe_ctx->plane_res.dpp; struct dc_plane_state *plane_state = pipe_ctx->plane_state; + if (!plane_state) + return; + if (dpp && dpp->funcs->dpp_setup) { // program the input csc dpp->funcs->dpp_setup(dpp, diff --git a/sys/dev/pci/drm/amd/display/dc/dcn20/dcn20_hwseq.c b/sys/dev/pci/drm/amd/display/dc/dcn20/dcn20_hwseq.c index 12af28590..a825fd6c7 100644 --- a/sys/dev/pci/drm/amd/display/dc/dcn20/dcn20_hwseq.c +++ b/sys/dev/pci/drm/amd/display/dc/dcn20/dcn20_hwseq.c @@ -880,7 +880,8 @@ bool dcn20_set_output_transfer_func(struct dc *dc, struct pipe_ctx *pipe_ctx, /* * if above if is not executed then 'params' equal to 0 and set in bypass */ - mpc->funcs->set_output_gamma(mpc, mpcc_id, params); + if (mpc->funcs->set_output_gamma) + mpc->funcs->set_output_gamma(mpc, mpcc_id, params); return true; } @@ -1732,17 +1733,26 @@ static void dcn20_program_pipe( dc->res_pool->hubbub->funcs->program_det_size( dc->res_pool->hubbub, pipe_ctx->plane_res.hubp->inst, pipe_ctx->det_buffer_size_kb); - if (pipe_ctx->update_flags.raw || pipe_ctx->plane_state->update_flags.raw || pipe_ctx->stream->update_flags.raw) + if (pipe_ctx->update_flags.raw || + (pipe_ctx->plane_state && pipe_ctx->plane_state->update_flags.raw) || + pipe_ctx->stream->update_flags.raw) dcn20_update_dchubp_dpp(dc, pipe_ctx, context); - if (pipe_ctx->update_flags.bits.enable - || pipe_ctx->plane_state->update_flags.bits.hdr_mult) + if (pipe_ctx->update_flags.bits.enable || + (pipe_ctx->plane_state && pipe_ctx->plane_state->update_flags.bits.hdr_mult)) hws->funcs.set_hdr_multiplier(pipe_ctx); - if (pipe_ctx->update_flags.bits.enable || - pipe_ctx->plane_state->update_flags.bits.in_transfer_func_change || - pipe_ctx->plane_state->update_flags.bits.gamma_change || - pipe_ctx->plane_state->update_flags.bits.lut_3d) + if ((pipe_ctx->plane_state && pipe_ctx->plane_state->update_flags.bits.hdr_mult) || + pipe_ctx->update_flags.bits.enable) + hws->funcs.set_hdr_multiplier(pipe_ctx); + + if ((pipe_ctx->plane_state && + pipe_ctx->plane_state->update_flags.bits.in_transfer_func_change) || + (pipe_ctx->plane_state && + pipe_ctx->plane_state->update_flags.bits.gamma_change) || + (pipe_ctx->plane_state && + pipe_ctx->plane_state->update_flags.bits.lut_3d) || + pipe_ctx->update_flags.bits.enable) hws->funcs.set_input_transfer_func(dc, pipe_ctx, pipe_ctx->plane_state); /* dcn10_translate_regamma_to_hw_format takes 750us to finish @@ -1752,7 +1762,8 @@ static void dcn20_program_pipe( if (pipe_ctx->update_flags.bits.enable || pipe_ctx->update_flags.bits.plane_changed || pipe_ctx->stream->update_flags.bits.out_tf || - pipe_ctx->plane_state->update_flags.bits.output_tf_change) + (pipe_ctx->plane_state && + pipe_ctx->plane_state->update_flags.bits.output_tf_change)) hws->funcs.set_output_transfer_func(dc, pipe_ctx, pipe_ctx->stream); /* If the pipe has been enabled or has a different opp, we @@ -1776,7 +1787,7 @@ static void dcn20_program_pipe( } /* Set ABM pipe after other pipe configurations done */ - if (pipe_ctx->plane_state->visible) { + if ((pipe_ctx->plane_state && pipe_ctx->plane_state->visible)) { if (pipe_ctx->stream_res.abm) { dc->hwss.set_pipe(pipe_ctx); pipe_ctx->stream_res.abm->funcs->set_abm_level(pipe_ctx->stream_res.abm, diff --git a/sys/dev/pci/drm/amd/display/dc/dcn30/dcn30_hwseq.c b/sys/dev/pci/drm/amd/display/dc/dcn30/dcn30_hwseq.c index d59af329d..b8653bdfc 100644 --- a/sys/dev/pci/drm/amd/display/dc/dcn30/dcn30_hwseq.c +++ b/sys/dev/pci/drm/amd/display/dc/dcn30/dcn30_hwseq.c @@ -440,7 +440,7 @@ void dcn30_init_hw(struct dc *dc) int edp_num; uint32_t backlight = MAX_BACKLIGHT_LEVEL; - if (dc->clk_mgr && dc->clk_mgr->funcs->init_clocks) + if (dc->clk_mgr && dc->clk_mgr->funcs && dc->clk_mgr->funcs->init_clocks) dc->clk_mgr->funcs->init_clocks(dc->clk_mgr); // Initialize the dccg @@ -599,11 +599,12 @@ void dcn30_init_hw(struct dc *dc) if (!dcb->funcs->is_accelerated_mode(dcb) && dc->res_pool->hubbub->funcs->init_watermarks) dc->res_pool->hubbub->funcs->init_watermarks(dc->res_pool->hubbub); - if (dc->clk_mgr->funcs->notify_wm_ranges) + if (dc->clk_mgr && dc->clk_mgr->funcs && dc->clk_mgr->funcs->notify_wm_ranges) dc->clk_mgr->funcs->notify_wm_ranges(dc->clk_mgr); //if softmax is enabled then hardmax will be set by a different call - if (dc->clk_mgr->funcs->set_hard_max_memclk && !dc->clk_mgr->dc_mode_softmax_enabled) + if (dc->clk_mgr && dc->clk_mgr->funcs && dc->clk_mgr->funcs->set_hard_max_memclk && + !dc->clk_mgr->dc_mode_softmax_enabled) dc->clk_mgr->funcs->set_hard_max_memclk(dc->clk_mgr); if (dc->res_pool->hubbub->funcs->force_pstate_change_control) @@ -735,6 +736,9 @@ bool dcn30_apply_idle_power_optimizations(struct dc *dc, bool enable) stream = dc->current_state->streams[0]; plane = (stream ? dc->current_state->stream_status[0].plane_states[0] : NULL); + if (!stream || !plane) + return false; + if (stream && plane) { cursor_cache_enable = stream->cursor_position.enable && plane->address.grph.cursor_cache_addr.quad_part; diff --git a/sys/dev/pci/drm/amd/display/dc/dcn30/dcn30_resource.c b/sys/dev/pci/drm/amd/display/dc/dcn30/dcn30_resource.c index 88c0b24a3..de83acd12 100644 --- a/sys/dev/pci/drm/amd/display/dc/dcn30/dcn30_resource.c +++ b/sys/dev/pci/drm/amd/display/dc/dcn30/dcn30_resource.c @@ -2045,6 +2045,9 @@ bool dcn30_validate_bandwidth(struct dc *dc, BW_VAL_TRACE_COUNT(); + if (!pipes) + goto validate_fail; + DC_FP_START(); out = dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, fast_validate, true); DC_FP_END(); diff --git a/sys/dev/pci/drm/amd/display/dc/dcn31/dcn31_resource.c b/sys/dev/pci/drm/amd/display/dc/dcn31/dcn31_resource.c index 82de4fe26..84e3df49b 100644 --- a/sys/dev/pci/drm/amd/display/dc/dcn31/dcn31_resource.c +++ b/sys/dev/pci/drm/amd/display/dc/dcn31/dcn31_resource.c @@ -1308,6 +1308,8 @@ static struct hpo_dp_link_encoder *dcn31_hpo_dp_link_encoder_create( /* allocate HPO link encoder */ hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL); + if (!hpo_dp_enc31) + return NULL; /* out of memory */ hpo_dp_link_encoder31_construct(hpo_dp_enc31, ctx, inst, &hpo_dp_link_enc_regs[inst], @@ -1764,6 +1766,9 @@ bool dcn31_validate_bandwidth(struct dc *dc, BW_VAL_TRACE_COUNT(); + if (!pipes) + goto validate_fail; + DC_FP_START(); out = dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, fast_validate, true); DC_FP_END(); diff --git a/sys/dev/pci/drm/amd/display/dc/dcn314/dcn314_resource.c b/sys/dev/pci/drm/amd/display/dc/dcn314/dcn314_resource.c index 3e65e683d..6e52851bc 100644 --- a/sys/dev/pci/drm/amd/display/dc/dcn314/dcn314_resource.c +++ b/sys/dev/pci/drm/amd/display/dc/dcn314/dcn314_resource.c @@ -1381,6 +1381,8 @@ static struct hpo_dp_link_encoder *dcn31_hpo_dp_link_encoder_create( /* allocate HPO link encoder */ hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL); + if (!hpo_dp_enc31) + return NULL; /* out of memory */ hpo_dp_link_encoder31_construct(hpo_dp_enc31, ctx, inst, &hpo_dp_link_enc_regs[inst], @@ -1741,6 +1743,9 @@ bool dcn314_validate_bandwidth(struct dc *dc, BW_VAL_TRACE_COUNT(); + if (!pipes) + goto validate_fail; + if (filter_modes_for_single_channel_workaround(dc, context)) goto validate_fail; diff --git a/sys/dev/pci/drm/amd/display/dc/dcn315/dcn315_resource.c b/sys/dev/pci/drm/amd/display/dc/dcn315/dcn315_resource.c index 127487ea3..3f3b555b4 100644 --- a/sys/dev/pci/drm/amd/display/dc/dcn315/dcn315_resource.c +++ b/sys/dev/pci/drm/amd/display/dc/dcn315/dcn315_resource.c @@ -1308,6 +1308,8 @@ static struct hpo_dp_link_encoder *dcn31_hpo_dp_link_encoder_create( /* allocate HPO link encoder */ hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL); + if (!hpo_dp_enc31) + return NULL; /* out of memory */ hpo_dp_link_encoder31_construct(hpo_dp_enc31, ctx, inst, &hpo_dp_link_enc_regs[inst], diff --git a/sys/dev/pci/drm/amd/display/dc/dcn316/dcn316_resource.c b/sys/dev/pci/drm/amd/display/dc/dcn316/dcn316_resource.c index 5fe2c6152..37b7973fc 100644 --- a/sys/dev/pci/drm/amd/display/dc/dcn316/dcn316_resource.c +++ b/sys/dev/pci/drm/amd/display/dc/dcn316/dcn316_resource.c @@ -1305,6 +1305,8 @@ static struct hpo_dp_link_encoder *dcn31_hpo_dp_link_encoder_create( /* allocate HPO link encoder */ hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL); + if (!hpo_dp_enc31) + return NULL; /* out of memory */ hpo_dp_link_encoder31_construct(hpo_dp_enc31, ctx, inst, &hpo_dp_link_enc_regs[inst], diff --git a/sys/dev/pci/drm/amd/display/dc/dcn32/dcn32_hwseq.c b/sys/dev/pci/drm/amd/display/dc/dcn32/dcn32_hwseq.c index 47eeaf061..c55c05348 100644 --- a/sys/dev/pci/drm/amd/display/dc/dcn32/dcn32_hwseq.c +++ b/sys/dev/pci/drm/amd/display/dc/dcn32/dcn32_hwseq.c @@ -587,7 +587,9 @@ bool dcn32_set_output_transfer_func(struct dc *dc, } } - mpc->funcs->set_output_gamma(mpc, mpcc_id, params); + if (mpc->funcs->set_output_gamma) + mpc->funcs->set_output_gamma(mpc, mpcc_id, params); + return ret; } @@ -771,7 +773,7 @@ void dcn32_init_hw(struct dc *dc) int edp_num; uint32_t backlight = MAX_BACKLIGHT_LEVEL; - if (dc->clk_mgr && dc->clk_mgr->funcs->init_clocks) + if (dc->clk_mgr && dc->clk_mgr->funcs && dc->clk_mgr->funcs->init_clocks) dc->clk_mgr->funcs->init_clocks(dc->clk_mgr); // Initialize the dccg @@ -948,10 +950,11 @@ void dcn32_init_hw(struct dc *dc) if (!dcb->funcs->is_accelerated_mode(dcb) && dc->res_pool->hubbub->funcs->init_watermarks) dc->res_pool->hubbub->funcs->init_watermarks(dc->res_pool->hubbub); - if (dc->clk_mgr->funcs->notify_wm_ranges) + if (dc->clk_mgr && dc->clk_mgr->funcs && dc->clk_mgr->funcs->notify_wm_ranges) dc->clk_mgr->funcs->notify_wm_ranges(dc->clk_mgr); - if (dc->clk_mgr->funcs->set_hard_max_memclk && !dc->clk_mgr->dc_mode_softmax_enabled) + if (dc->clk_mgr && dc->clk_mgr->funcs && dc->clk_mgr->funcs->set_hard_max_memclk && + !dc->clk_mgr->dc_mode_softmax_enabled) dc->clk_mgr->funcs->set_hard_max_memclk(dc->clk_mgr); if (dc->res_pool->hubbub->funcs->force_pstate_change_control) diff --git a/sys/dev/pci/drm/amd/display/dc/dcn32/dcn32_resource.c b/sys/dev/pci/drm/amd/display/dc/dcn32/dcn32_resource.c index f9d601c8c..f98f35ac6 100644 --- a/sys/dev/pci/drm/amd/display/dc/dcn32/dcn32_resource.c +++ b/sys/dev/pci/drm/amd/display/dc/dcn32/dcn32_resource.c @@ -1299,6 +1299,8 @@ static struct hpo_dp_link_encoder *dcn32_hpo_dp_link_encoder_create( /* allocate HPO link encoder */ hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL); + if (!hpo_dp_enc31) + return NULL; /* out of memory */ #undef REG_STRUCT #define REG_STRUCT hpo_dp_link_enc_regs @@ -1786,6 +1788,9 @@ void dcn32_add_phantom_pipes(struct dc *dc, struct dc_state *context, // be a valid candidate for SubVP (i.e. has a plane, stream, doesn't // already have phantom pipe assigned, etc.) by previous checks. phantom_stream = dcn32_enable_phantom_stream(dc, context, pipes, pipe_cnt, index); + if (!phantom_stream) + return; + dcn32_enable_phantom_plane(dc, context, phantom_stream, index); for (i = 0; i < dc->res_pool->pipe_count; i++) { @@ -1842,6 +1847,9 @@ bool dcn32_validate_bandwidth(struct dc *dc, BW_VAL_TRACE_COUNT(); + if (!pipes) + goto validate_fail; + DC_FP_START(); out = dcn32_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, fast_validate); DC_FP_END(); diff --git a/sys/dev/pci/drm/amd/display/dc/dcn321/dcn321_resource.c b/sys/dev/pci/drm/amd/display/dc/dcn321/dcn321_resource.c index aa4c64eec..4289cd164 100644 --- a/sys/dev/pci/drm/amd/display/dc/dcn321/dcn321_resource.c +++ b/sys/dev/pci/drm/amd/display/dc/dcn321/dcn321_resource.c @@ -1285,6 +1285,8 @@ static struct hpo_dp_link_encoder *dcn321_hpo_dp_link_encoder_create( /* allocate HPO link encoder */ hpo_dp_enc31 = kzalloc(sizeof(struct dcn31_hpo_dp_link_encoder), GFP_KERNEL); + if (!hpo_dp_enc31) + return NULL; /* out of memory */ #undef REG_STRUCT #define REG_STRUCT hpo_dp_link_enc_regs diff --git a/sys/dev/pci/drm/amd/display/dc/dml/dcn20/display_rq_dlg_calc_20.c b/sys/dev/pci/drm/amd/display/dc/dml/dcn20/display_rq_dlg_calc_20.c index 548cdef8a..543ce9a08 100644 --- a/sys/dev/pci/drm/amd/display/dc/dml/dcn20/display_rq_dlg_calc_20.c +++ b/sys/dev/pci/drm/amd/display/dc/dml/dcn20/display_rq_dlg_calc_20.c @@ -78,7 +78,7 @@ static void calculate_ttu_cursor(struct display_mode_lib *mode_lib, static unsigned int get_bytes_per_element(enum source_format_class source_format, bool is_chroma) { - unsigned int ret_val = 0; + unsigned int ret_val = 1; if (source_format == dm_444_16) { if (!is_chroma) diff --git a/sys/dev/pci/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c b/sys/dev/pci/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c index 3d82cbef1..ac6357c08 100644 --- a/sys/dev/pci/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c +++ b/sys/dev/pci/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c @@ -932,8 +932,9 @@ static bool subvp_drr_schedulable(struct dc *dc, struct dc_state *context) * for VBLANK: (VACTIVE region of the SubVP pipe can fit the MALL prefetch, VBLANK frame time, * and the max of (VBLANK blanking time, MALL region)). */ - if (stretched_drr_us < (1 / (double)drr_timing->min_refresh_in_uhz) * 1000000 * 1000000 && - subvp_active_us - prefetch_us - stretched_drr_us - max_vblank_mallregion > 0) + if (drr_timing && + stretched_drr_us < (1 / (double)drr_timing->min_refresh_in_uhz) * 1000000 * 1000000 && + subvp_active_us - prefetch_us - stretched_drr_us - max_vblank_mallregion > 0) schedulable = true; return schedulable; @@ -995,7 +996,7 @@ static bool subvp_vblank_schedulable(struct dc *dc, struct dc_state *context) if (!subvp_pipe && pipe->stream->mall_stream_config.type == SUBVP_MAIN) subvp_pipe = pipe; } - if (found) { + if (found && subvp_pipe) { main_timing = &subvp_pipe->stream->timing; phantom_timing = &subvp_pipe->stream->mall_stream_config.paired_stream->timing; vblank_timing = &context->res_ctx.pipe_ctx[vblank_index].stream->timing; diff --git a/sys/dev/pci/drm/amd/display/dc/dml/dml1_display_rq_dlg_calc.c b/sys/dev/pci/drm/amd/display/dc/dml/dml1_display_rq_dlg_calc.c index 3df559c59..70df992f8 100644 --- a/sys/dev/pci/drm/amd/display/dc/dml/dml1_display_rq_dlg_calc.c +++ b/sys/dev/pci/drm/amd/display/dc/dml/dml1_display_rq_dlg_calc.c @@ -39,7 +39,7 @@ static unsigned int get_bytes_per_element(enum source_format_class source_format, bool is_chroma) { - unsigned int ret_val = 0; + unsigned int ret_val = 1; if (source_format == dm_444_16) { if (!is_chroma) diff --git a/sys/dev/pci/drm/amd/display/modules/power/power_helpers.c b/sys/dev/pci/drm/amd/display/modules/power/power_helpers.c index 2b3d51838..4887a360e 100644 --- a/sys/dev/pci/drm/amd/display/modules/power/power_helpers.c +++ b/sys/dev/pci/drm/amd/display/modules/power/power_helpers.c @@ -841,6 +841,8 @@ bool is_psr_su_specific_panel(struct dc_link *link) isPSRSUSupported = false; else if (dpcd_caps->sink_dev_id_str[1] == 0x08 && dpcd_caps->sink_dev_id_str[0] == 0x03) isPSRSUSupported = false; + else if (dpcd_caps->sink_dev_id_str[1] == 0x08 && dpcd_caps->sink_dev_id_str[0] == 0x01) + isPSRSUSupported = false; else if (dpcd_caps->psr_info.force_psrsu_cap == 0x1) isPSRSUSupported = true; } diff --git a/sys/dev/pci/drm/amd/pm/swsmu/amdgpu_smu.c b/sys/dev/pci/drm/amd/pm/swsmu/amdgpu_smu.c index c890b07fe..2a98a28fb 100644 --- a/sys/dev/pci/drm/amd/pm/swsmu/amdgpu_smu.c +++ b/sys/dev/pci/drm/amd/pm/swsmu/amdgpu_smu.c @@ -1843,7 +1843,7 @@ static int smu_bump_power_profile_mode(struct smu_context *smu, static int smu_adjust_power_state_dynamic(struct smu_context *smu, enum amd_dpm_forced_level level, bool skip_display_settings, - bool force_update) + bool init) { int ret = 0; int index = 0; @@ -1872,7 +1872,7 @@ static int smu_adjust_power_state_dynamic(struct smu_context *smu, } } - if (force_update || smu_dpm_ctx->dpm_level != level) { + if (smu_dpm_ctx->dpm_level != level) { ret = smu_asic_set_performance_level(smu, level); if (ret) { dev_err(smu->adev->dev, "Failed to set performance level!"); @@ -1889,7 +1889,7 @@ static int smu_adjust_power_state_dynamic(struct smu_context *smu, index = index > 0 && index <= WORKLOAD_POLICY_MAX ? index - 1 : 0; workload[0] = smu->workload_setting[index]; - if (force_update || smu->power_profile_mode != workload[0]) + if (init || smu->power_profile_mode != workload[0]) smu_bump_power_profile_mode(smu, workload, 0); } diff --git a/sys/dev/pci/drm/amd/pm/swsmu/smu11/vangogh_ppt.c b/sys/dev/pci/drm/amd/pm/swsmu/smu11/vangogh_ppt.c index c242656d1..416b1872f 100644 --- a/sys/dev/pci/drm/amd/pm/swsmu/smu11/vangogh_ppt.c +++ b/sys/dev/pci/drm/amd/pm/swsmu/smu11/vangogh_ppt.c @@ -256,10 +256,9 @@ static int vangogh_tables_init(struct smu_context *smu) goto err0_out; smu_table->metrics_time = 0; - if (smu_version >= 0x043F3E00) - smu_table->gpu_metrics_table_size = sizeof(struct gpu_metrics_v2_3); - else - smu_table->gpu_metrics_table_size = sizeof(struct gpu_metrics_v2_2); + smu_table->gpu_metrics_table_size = sizeof(struct gpu_metrics_v2_2); + smu_table->gpu_metrics_table_size = max(smu_table->gpu_metrics_table_size, sizeof(struct gpu_metrics_v2_3)); + smu_table->gpu_metrics_table_size = max(smu_table->gpu_metrics_table_size, sizeof(struct gpu_metrics_v2_4)); smu_table->gpu_metrics_table = kzalloc(smu_table->gpu_metrics_table_size, GFP_KERNEL); if (!smu_table->gpu_metrics_table) goto err1_out; diff --git a/sys/dev/pci/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c b/sys/dev/pci/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c index a69723203..346e0af80 100644 --- a/sys/dev/pci/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c +++ b/sys/dev/pci/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c @@ -1727,6 +1727,8 @@ static ssize_t smu_v13_0_7_get_gpu_metrics(struct smu_context *smu, gpu_metrics->average_dclk1_frequency = metrics->AverageDclk1Frequency; gpu_metrics->current_gfxclk = metrics->CurrClock[PPCLK_GFXCLK]; + gpu_metrics->current_socclk = metrics->CurrClock[PPCLK_SOCCLK]; + gpu_metrics->current_uclk = metrics->CurrClock[PPCLK_UCLK]; gpu_metrics->current_vclk0 = metrics->CurrClock[PPCLK_VCLK_0]; gpu_metrics->current_dclk0 = metrics->CurrClock[PPCLK_DCLK_0]; gpu_metrics->current_vclk1 = metrics->CurrClock[PPCLK_VCLK_1]; diff --git a/sys/dev/pci/drm/display/drm_dp_dual_mode_helper.c b/sys/dev/pci/drm/display/drm_dp_dual_mode_helper.c index 3a9eb14ac..ae1a6494f 100644 --- a/sys/dev/pci/drm/display/drm_dp_dual_mode_helper.c +++ b/sys/dev/pci/drm/display/drm_dp_dual_mode_helper.c @@ -160,11 +160,11 @@ EXPORT_SYMBOL(drm_dp_dual_mode_write); static bool is_hdmi_adaptor(const char hdmi_id[DP_DUAL_MODE_HDMI_ID_LEN]) { - static const char dp_dual_mode_hdmi_id[DP_DUAL_MODE_HDMI_ID_LEN] = + static const char dp_dual_mode_hdmi_id[DP_DUAL_MODE_HDMI_ID_LEN + 1] = "DP-HDMI ADAPTOR\x04"; return memcmp(hdmi_id, dp_dual_mode_hdmi_id, - sizeof(dp_dual_mode_hdmi_id)) == 0; + DP_DUAL_MODE_HDMI_ID_LEN) == 0; } static bool is_type1_adaptor(uint8_t adaptor_id) diff --git a/sys/dev/pci/drm/display/drm_dp_mst_topology.c b/sys/dev/pci/drm/display/drm_dp_mst_topology.c index 92511c4c1..c1a2cfaf8 100644 --- a/sys/dev/pci/drm/display/drm_dp_mst_topology.c +++ b/sys/dev/pci/drm/display/drm_dp_mst_topology.c @@ -319,6 +319,9 @@ static bool drm_dp_decode_sideband_msg_hdr(const struct drm_dp_mst_topology_mgr hdr->broadcast = (buf[idx] >> 7) & 0x1; hdr->path_msg = (buf[idx] >> 6) & 0x1; hdr->msg_len = buf[idx] & 0x3f; + if (hdr->msg_len < 1) /* min space for body CRC */ + return false; + idx++; hdr->somt = (buf[idx] >> 7) & 0x1; hdr->eomt = (buf[idx] >> 6) & 0x1; @@ -3662,8 +3665,7 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms ret = 0; mgr->payload_id_table_cleared = false; - memset(&mgr->down_rep_recv, 0, sizeof(mgr->down_rep_recv)); - memset(&mgr->up_req_recv, 0, sizeof(mgr->up_req_recv)); + mgr->reset_rx_state = true; } out_unlock: @@ -3791,6 +3793,11 @@ out_fail: } EXPORT_SYMBOL(drm_dp_mst_topology_mgr_resume); +static void reset_msg_rx_state(struct drm_dp_sideband_msg_rx *msg) +{ + memset(msg, 0, sizeof(*msg)); +} + static bool drm_dp_get_one_sb_msg(struct drm_dp_mst_topology_mgr *mgr, bool up, struct drm_dp_mst_branch **mstb) @@ -3869,6 +3876,34 @@ drm_dp_get_one_sb_msg(struct drm_dp_mst_topology_mgr *mgr, bool up, return true; } +static int get_msg_request_type(u8 data) +{ + return data & 0x7f; +} + +static bool verify_rx_request_type(struct drm_dp_mst_topology_mgr *mgr, + const struct drm_dp_sideband_msg_tx *txmsg, + const struct drm_dp_sideband_msg_rx *rxmsg) +{ + const struct drm_dp_sideband_msg_hdr *hdr = &rxmsg->initial_hdr; + const struct drm_dp_mst_branch *mstb = txmsg->dst; + int tx_req_type = get_msg_request_type(txmsg->msg[0]); + int rx_req_type = get_msg_request_type(rxmsg->msg[0]); + char rad_str[64]; + + if (tx_req_type == rx_req_type) + return true; + + drm_dp_mst_rad_to_str(mstb->rad, mstb->lct, rad_str, sizeof(rad_str)); + drm_dbg_kms(mgr->dev, + "Got unexpected MST reply, mstb: %p seqno: %d lct: %d rad: %s rx_req_type: %s (%02x) != tx_req_type: %s (%02x)\n", + mstb, hdr->seqno, mstb->lct, rad_str, + drm_dp_mst_req_type_str(rx_req_type), rx_req_type, + drm_dp_mst_req_type_str(tx_req_type), tx_req_type); + + return false; +} + static int drm_dp_mst_handle_down_rep(struct drm_dp_mst_topology_mgr *mgr) { struct drm_dp_sideband_msg_tx *txmsg; @@ -3898,6 +3933,9 @@ static int drm_dp_mst_handle_down_rep(struct drm_dp_mst_topology_mgr *mgr) goto out_clear_reply; } + if (!verify_rx_request_type(mgr, txmsg, msg)) + goto out_clear_reply; + drm_dp_sideband_parse_reply(mgr, msg, &txmsg->reply); if (txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK) { @@ -4073,6 +4111,17 @@ out: return 0; } +static void update_msg_rx_state(struct drm_dp_mst_topology_mgr *mgr) +{ + mutex_lock(&mgr->lock); + if (mgr->reset_rx_state) { + mgr->reset_rx_state = false; + reset_msg_rx_state(&mgr->down_rep_recv); + reset_msg_rx_state(&mgr->up_req_recv); + } + mutex_unlock(&mgr->lock); +} + /** * drm_dp_mst_hpd_irq_handle_event() - MST hotplug IRQ handle MST event * @mgr: manager to notify irq for. @@ -4107,6 +4156,8 @@ int drm_dp_mst_hpd_irq_handle_event(struct drm_dp_mst_topology_mgr *mgr, const u *handled = true; } + update_msg_rx_state(mgr); + if (esi[1] & DP_DOWN_REP_MSG_RDY) { ret = drm_dp_mst_handle_down_rep(mgr); *handled = true; diff --git a/sys/dev/pci/drm/drm_drv.c b/sys/dev/pci/drm/drm_drv.c index 7ec4b47f1..5118e8c35 100644 --- a/sys/dev/pci/drm/drm_drv.c +++ b/sys/dev/pci/drm/drm_drv.c @@ -1576,7 +1576,7 @@ const struct cfattach drm_ca = { }; struct cfdriver drm_cd = { - 0, "drm", DV_DULL + NULL, "drm", DV_DULL }; const struct pci_device_id * diff --git a/sys/dev/pci/drm/drm_gem.c b/sys/dev/pci/drm/drm_gem.c index e69e1f908..57f50ef98 100644 --- a/sys/dev/pci/drm/drm_gem.c +++ b/sys/dev/pci/drm/drm_gem.c @@ -102,10 +102,9 @@ drm_fault(struct uvm_faultinfo *ufi, vaddr_t vaddr, vm_page_t *pps, * we do not allow device mappings to be mapped copy-on-write * so we kill any attempt to do so here. */ - if (UVM_ET_ISCOPYONWRITE(entry)) { uvmfault_unlockall(ufi, ufi->entry->aref.ar_amap, uobj); - return(VM_PAGER_ERROR); + return EACCES; } /* @@ -125,7 +124,7 @@ drm_fault(struct uvm_faultinfo *ufi, vaddr_t vaddr, vm_page_t *pps, PZERO, "drmflt", INFSLP); } mtx_leave(&dev->quiesce_mtx); - return(VM_PAGER_REFAULT); + return ERESTART; } dev->quiesce_count++; mtx_leave(&dev->quiesce_mtx); @@ -141,7 +140,7 @@ drm_fault(struct uvm_faultinfo *ufi, vaddr_t vaddr, vm_page_t *pps, wakeup(&dev->quiesce_count); mtx_leave(&dev->quiesce_mtx); - return (ret); + return ret; } boolean_t diff --git a/sys/dev/pci/drm/drm_gem_dma_helper.c b/sys/dev/pci/drm/drm_gem_dma_helper.c index d8c8d3d03..e03d9dd38 100644 --- a/sys/dev/pci/drm/drm_gem_dma_helper.c +++ b/sys/dev/pci/drm/drm_gem_dma_helper.c @@ -1,4 +1,4 @@ -/* $OpenBSD: drm_gem_dma_helper.c,v 1.3 2024/01/16 23:37:51 jsg Exp $ */ +/* $OpenBSD: drm_gem_dma_helper.c,v 1.5 2024/12/15 11:02:59 mpi Exp $ */ /* $NetBSD: drm_gem_dma_helper.c,v 1.9 2019/11/05 23:29:28 jmcneill Exp $ */ /*- * Copyright (c) 2015-2017 Jared McNeill @@ -32,7 +32,7 @@ #include #include -#include +#include static const struct drm_gem_object_funcs drm_gem_dma_default_funcs = { .free = drm_gem_dma_free_object, @@ -208,7 +208,7 @@ drm_gem_dma_fault(struct drm_gem_object *gem_obj, struct uvm_faultinfo *ufi, paddr = bus_dmamem_mmap(obj->dmat, obj->dmasegs, 1, offset, access_type, BUS_DMA_NOCACHE); if (paddr == -1) { - retval = VM_PAGER_BAD; + retval = EACCES; break; } @@ -218,7 +218,7 @@ drm_gem_dma_fault(struct drm_gem_object *gem_obj, struct uvm_faultinfo *ufi, uvmfault_unlockall(ufi, ufi->entry->aref.ar_amap, uobj); uvm_wait("drm_gem_dma_fault"); - return VM_PAGER_REFAULT; + return ERESTART; } } diff --git a/sys/dev/pci/drm/drm_gem_ttm_helper.c b/sys/dev/pci/drm/drm_gem_ttm_helper.c index 067ef4cc9..643c613d0 100644 --- a/sys/dev/pci/drm/drm_gem_ttm_helper.c +++ b/sys/dev/pci/drm/drm_gem_ttm_helper.c @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include diff --git a/sys/dev/pci/drm/drm_ioctl.c b/sys/dev/pci/drm/drm_ioctl.c index d5492099a..f18d589a1 100644 --- a/sys/dev/pci/drm/drm_ioctl.c +++ b/sys/dev/pci/drm/drm_ioctl.c @@ -1039,7 +1039,6 @@ drm_do_ioctl(struct drm_device *dev, int minor, u_long cmd, caddr_t data) file_priv->authenticated); switch (cmd) { - case FIONBIO: case FIOASYNC: return 0; } diff --git a/sys/dev/pci/drm/drm_mm.c b/sys/dev/pci/drm/drm_mm.c index b3b1a355c..3ebe916bc 100644 --- a/sys/dev/pci/drm/drm_mm.c +++ b/sys/dev/pci/drm/drm_mm.c @@ -155,7 +155,7 @@ static void show_leaks(struct drm_mm *mm) { } #ifdef __linux__ INTERVAL_TREE_DEFINE(struct drm_mm_node, rb, u64, __subtree_last, - START, LAST, static inline, drm_mm_interval_tree) + START, LAST, static inline __maybe_unused, drm_mm_interval_tree) #else static struct drm_mm_node * drm_mm_interval_tree_iter_first(const struct rb_root_cached *root, diff --git a/sys/dev/pci/drm/drm_modes.c b/sys/dev/pci/drm/drm_modes.c index 84af5bd40..9623fc9b3 100644 --- a/sys/dev/pci/drm/drm_modes.c +++ b/sys/dev/pci/drm/drm_modes.c @@ -1285,14 +1285,11 @@ EXPORT_SYMBOL(drm_mode_set_name); */ int drm_mode_vrefresh(const struct drm_display_mode *mode) { - unsigned int num, den; + unsigned int num = 1, den = 1; if (mode->htotal == 0 || mode->vtotal == 0) return 0; - num = mode->clock; - den = mode->htotal * mode->vtotal; - if (mode->flags & DRM_MODE_FLAG_INTERLACE) num *= 2; if (mode->flags & DRM_MODE_FLAG_DBLSCAN) @@ -1300,6 +1297,12 @@ int drm_mode_vrefresh(const struct drm_display_mode *mode) if (mode->vscan > 1) den *= mode->vscan; + if (check_mul_overflow(mode->clock, num, &num)) + return 0; + + if (check_mul_overflow(mode->htotal * mode->vtotal, den, &den)) + return 0; + return DIV_ROUND_CLOSEST_ULL(mul_u32_u32(num, 1000), den); } EXPORT_SYMBOL(drm_mode_vrefresh); diff --git a/sys/dev/pci/drm/drm_panel_orientation_quirks.c b/sys/dev/pci/drm/drm_panel_orientation_quirks.c index a9e561cdd..299fb6aac 100644 --- a/sys/dev/pci/drm/drm_panel_orientation_quirks.c +++ b/sys/dev/pci/drm/drm_panel_orientation_quirks.c @@ -184,6 +184,12 @@ static const struct dmi_system_id orientation_data[] = { DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T103HAF"), }, .driver_data = (void *)&lcd800x1280_rightside_up, + }, { /* AYA NEO AYANEO 2 */ + .matches = { + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYANEO"), + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "AYANEO 2"), + }, + .driver_data = (void *)&lcd1200x1920_rightside_up, }, { /* AYA NEO 2021 */ .matches = { DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYADEVICE"), @@ -196,6 +202,18 @@ static const struct dmi_system_id orientation_data[] = { DMI_MATCH(DMI_PRODUCT_NAME, "AIR"), }, .driver_data = (void *)&lcd1080x1920_leftside_up, + }, { /* AYA NEO Founder */ + .matches = { + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYA NEO"), + DMI_MATCH(DMI_PRODUCT_NAME, "AYA NEO Founder"), + }, + .driver_data = (void *)&lcd800x1280_rightside_up, + }, { /* AYA NEO GEEK */ + .matches = { + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AYANEO"), + DMI_MATCH(DMI_PRODUCT_NAME, "GEEK"), + }, + .driver_data = (void *)&lcd800x1280_rightside_up, }, { /* AYA NEO NEXT */ .matches = { DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AYANEO"), @@ -409,7 +427,6 @@ static const struct dmi_system_id orientation_data[] = { }, { /* Lenovo Yoga Tab 3 X90F */ .matches = { DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"), - DMI_MATCH(DMI_PRODUCT_NAME, "CHERRYVIEW D1 PLATFORM"), DMI_MATCH(DMI_PRODUCT_VERSION, "Blade3-10A-001"), }, .driver_data = (void *)&lcd1600x2560_rightside_up, diff --git a/sys/dev/pci/drm/i915/gem/i915_gem_mman.c b/sys/dev/pci/drm/i915/gem/i915_gem_mman.c index 8ee2a8c1f..653076cc3 100644 --- a/sys/dev/pci/drm/i915/gem/i915_gem_mman.c +++ b/sys/dev/pci/drm/i915/gem/i915_gem_mman.c @@ -591,10 +591,10 @@ static int i915_error_to_vmf_fault(int err) case -EFAULT: /* purged object */ case -ENODEV: /* bad object, how did you get here! */ case -ENXIO: /* unable to access backing store (on device) */ - return VM_PAGER_ERROR; + return EACCES; case -ENOMEM: /* our allocation failure */ - return VM_PAGER_ERROR; + return EACCES; /* XXX */ case 0: case -EAGAIN: @@ -607,7 +607,7 @@ static int i915_error_to_vmf_fault(int err) * EBUSY is ok: this just means that another thread * already did the job. */ - return VM_PAGER_OK; + return 0; } } @@ -629,11 +629,11 @@ vm_fault_cpu(struct i915_mmap_offset *mmo, struct uvm_faultinfo *ufi, /* Sanity check that we allow writing into this object */ if (unlikely(i915_gem_object_is_readonly(obj) && write)) { uvmfault_unlockall(ufi, NULL, &obj->base.uobj); - return VM_PAGER_BAD; + return EACCES; } if (i915_gem_object_lock_interruptible(obj, NULL)) - return VM_PAGER_ERROR; + return EACCES; err = i915_gem_object_pin_pages(obj); if (err) @@ -921,7 +921,7 @@ i915_gem_fault(struct drm_gem_object *gem_obj, struct uvm_faultinfo *ufi, drm_vma_offset_unlock_lookup(dev->vma_offset_manager); if (!mmo) { uvmfault_unlockall(ufi, NULL, &gem_obj->uobj); - return VM_PAGER_BAD; + return EACCES; } KASSERT(gem_obj == &mmo->obj->base); diff --git a/sys/dev/pci/drm/i915/gem/i915_gem_ttm.c b/sys/dev/pci/drm/i915/gem/i915_gem_ttm.c index cbca8f523..d77e467d4 100644 --- a/sys/dev/pci/drm/i915/gem/i915_gem_ttm.c +++ b/sys/dev/pci/drm/i915/gem/i915_gem_ttm.c @@ -1240,20 +1240,20 @@ vm_fault_ttm(struct uvm_faultinfo *ufi, vaddr_t vaddr, vm_page_t *pps, /* Sanity check that we allow writing into this object */ if (unlikely(i915_gem_object_is_readonly(obj) && write)) { uvmfault_unlockall(ufi, NULL, &obj->base.uobj); - return VM_PAGER_BAD; + return EACCES; } ret = ttm_bo_vm_reserve(bo); if (ret) { switch (ret) { case VM_FAULT_NOPAGE: - ret = VM_PAGER_OK; + ret = 0; break; case VM_FAULT_RETRY: - ret = VM_PAGER_REFAULT; + ret = ERESTART; break; default: - ret = VM_PAGER_BAD; + ret = EACCES; break; } uvmfault_unlockall(ufi, NULL, &obj->base.uobj); @@ -1263,7 +1263,7 @@ vm_fault_ttm(struct uvm_faultinfo *ufi, vaddr_t vaddr, vm_page_t *pps, if (obj->mm.madv != I915_MADV_WILLNEED) { dma_resv_unlock(bo->base.resv); uvmfault_unlockall(ufi, NULL, &obj->base.uobj); - return VM_PAGER_BAD; + return EACCES; } /* @@ -1285,7 +1285,7 @@ vm_fault_ttm(struct uvm_faultinfo *ufi, vaddr_t vaddr, vm_page_t *pps, if (err) { dma_resv_unlock(bo->base.resv); uvmfault_unlockall(ufi, NULL, &obj->base.uobj); - return VM_PAGER_BAD; + return EACCES; } } else if (!i915_ttm_resource_mappable(bo->resource)) { int err = -ENODEV; @@ -1359,13 +1359,13 @@ vm_fault_ttm(struct uvm_faultinfo *ufi, vaddr_t vaddr, vm_page_t *pps, out_rpm: switch (ret) { case VM_FAULT_NOPAGE: - ret = VM_PAGER_OK; + ret = 0; break; case VM_FAULT_RETRY: - ret = VM_PAGER_REFAULT; + ret = ERESTART; break; default: - ret = VM_PAGER_BAD; + ret = EACCES; break; } diff --git a/sys/dev/pci/drm/i915/gt/intel_engine_types.h b/sys/dev/pci/drm/i915/gt/intel_engine_types.h index ef2dbf53e..fc6f665ff 100644 --- a/sys/dev/pci/drm/i915/gt/intel_engine_types.h +++ b/sys/dev/pci/drm/i915/gt/intel_engine_types.h @@ -343,6 +343,11 @@ struct intel_engine_guc_stats { * @start_gt_clk: GT clock time of last idle to active transition. */ u64 start_gt_clk; + + /** + * @total: The last value of total returned + */ + u64 total; }; union intel_engine_tlb_inv_reg { diff --git a/sys/dev/pci/drm/i915/gt/uc/intel_guc_submission.c b/sys/dev/pci/drm/i915/gt/uc/intel_guc_submission.c index 875dfa553..8e7217d3d 100644 --- a/sys/dev/pci/drm/i915/gt/uc/intel_guc_submission.c +++ b/sys/dev/pci/drm/i915/gt/uc/intel_guc_submission.c @@ -1229,6 +1229,21 @@ static void __get_engine_usage_record(struct intel_engine_cs *engine, } while (++i < 6); } +static void __set_engine_usage_record(struct intel_engine_cs *engine, + u32 last_in, u32 id, u32 total) +{ + struct iosys_map rec_map = intel_guc_engine_usage_record_map(engine); + +#define record_write(map_, field_, val_) \ + iosys_map_wr_field(map_, 0, struct guc_engine_usage_record, field_, val_) + + record_write(&rec_map, last_switch_in_stamp, last_in); + record_write(&rec_map, current_context_index, id); + record_write(&rec_map, total_runtime, total); + +#undef record_write +} + static void guc_update_engine_gt_clks(struct intel_engine_cs *engine) { struct intel_engine_guc_stats *stats = &engine->stats.guc; @@ -1347,9 +1362,12 @@ static ktime_t guc_engine_busyness(struct intel_engine_cs *engine, ktime_t *now) total += intel_gt_clock_interval_to_ns(gt, clk); } + if (total > stats->total) + stats->total = total; + spin_unlock_irqrestore(&guc->timestamp.lock, flags); - return ns_to_ktime(total); + return ns_to_ktime(stats->total); } static void guc_enable_busyness_worker(struct intel_guc *guc) @@ -1376,8 +1394,21 @@ static void __reset_guc_busyness_stats(struct intel_guc *guc) guc_update_pm_timestamp(guc, &unused); for_each_engine(engine, gt, id) { + struct intel_engine_guc_stats *stats = &engine->stats.guc; + guc_update_engine_gt_clks(engine); - engine->stats.guc.prev_total = 0; + + /* + * If resetting a running context, accumulate the active + * time as well since there will be no context switch. + */ + if (stats->running) { + u64 clk = guc->timestamp.gt_stamp - stats->start_gt_clk; + + stats->total_gt_clks += clk; + } + stats->prev_total = 0; + stats->running = 0; } spin_unlock_irqrestore(&guc->timestamp.lock, flags); @@ -1488,6 +1519,9 @@ err_trylock: static int guc_action_enable_usage_stats(struct intel_guc *guc) { + struct intel_gt *gt = guc_to_gt(guc); + struct intel_engine_cs *engine; + enum intel_engine_id id; u32 offset = intel_guc_engine_usage_offset(guc); u32 action[] = { INTEL_GUC_ACTION_SET_ENG_UTIL_BUFF, @@ -1495,6 +1529,9 @@ static int guc_action_enable_usage_stats(struct intel_guc *guc) 0, }; + for_each_engine(engine, gt, id) + __set_engine_usage_record(engine, 0, 0xffffffff, 0); + return intel_guc_send(guc, action, ARRAY_SIZE(action)); } diff --git a/sys/dev/pci/drm/i915/i915_driver.c b/sys/dev/pci/drm/i915/i915_driver.c index 5e3629934..a204ce69e 100644 --- a/sys/dev/pci/drm/i915/i915_driver.c +++ b/sys/dev/pci/drm/i915/i915_driver.c @@ -2208,7 +2208,7 @@ const struct cfattach inteldrm_ca = { }; struct cfdriver inteldrm_cd = { - 0, "inteldrm", DV_DULL + NULL, "inteldrm", DV_DULL }; int inteldrm_intr(void *); diff --git a/sys/dev/pci/drm/i915/i915_gpu_error.c b/sys/dev/pci/drm/i915/i915_gpu_error.c index 64e4571e7..3eda4c88f 100644 --- a/sys/dev/pci/drm/i915/i915_gpu_error.c +++ b/sys/dev/pci/drm/i915/i915_gpu_error.c @@ -1697,9 +1697,21 @@ capture_engine(struct intel_engine_cs *engine, return NULL; intel_engine_get_hung_entity(engine, &ce, &rq); - if (rq && !i915_request_started(rq)) - drm_info(&engine->gt->i915->drm, "Got hung context on %s with active request %lld:%lld [0x%04X] not yet started\n", - engine->name, rq->fence.context, rq->fence.seqno, ce->guc_id.id); + if (rq && !i915_request_started(rq)) { + /* + * We want to know also what is the guc_id of the context, + * but if we don't have the context reference, then skip + * printing it. + */ + if (ce) + drm_info(&engine->gt->i915->drm, + "Got hung context on %s with active request %lld:%lld [0x%04X] not yet started\n", + engine->name, rq->fence.context, rq->fence.seqno, ce->guc_id.id); + else + drm_info(&engine->gt->i915->drm, + "Got hung context on %s with active request %lld:%lld not yet started\n", + engine->name, rq->fence.context, rq->fence.seqno); + } if (rq) { capture = intel_engine_coredump_add_request(ee, rq, ATOMIC_MAYFAIL); diff --git a/sys/dev/pci/drm/i915/i915_scheduler.c b/sys/dev/pci/drm/i915/i915_scheduler.c index 7a92e648b..60ed1c971 100644 --- a/sys/dev/pci/drm/i915/i915_scheduler.c +++ b/sys/dev/pci/drm/i915/i915_scheduler.c @@ -528,7 +528,7 @@ int __init i915_scheduler_module_init(void) return 0; err_priorities: - kmem_cache_destroy(slab_priorities); + kmem_cache_destroy(slab_dependencies); return -ENOMEM; #else pool_init(&slab_dependencies, sizeof(struct i915_dependency), diff --git a/sys/dev/pci/drm/include/drm/display/drm_dp_mst_helper.h b/sys/dev/pci/drm/include/drm/display/drm_dp_mst_helper.h index 06dc5d1ec..9a75dbb66 100644 --- a/sys/dev/pci/drm/include/drm/display/drm_dp_mst_helper.h +++ b/sys/dev/pci/drm/include/drm/display/drm_dp_mst_helper.h @@ -689,6 +689,13 @@ struct drm_dp_mst_topology_mgr { */ bool payload_id_table_cleared : 1; + /** + * @reset_rx_state: The down request's reply and up request message + * receiver state must be reset, after the topology manager got + * removed. Protected by @lock. + */ + bool reset_rx_state : 1; + /** * @payload_count: The number of currently active payloads in hardware. This value is only * intended to be used internally by MST helpers for payload tracking, and is only safe to diff --git a/sys/dev/pci/drm/include/linux/overflow.h b/sys/dev/pci/drm/include/linux/overflow.h index f41703257..3c4d01480 100644 --- a/sys/dev/pci/drm/include/linux/overflow.h +++ b/sys/dev/pci/drm/include/linux/overflow.h @@ -10,6 +10,12 @@ #if defined(__clang__) || (defined(__GNUC__) && __GNUC__ >= 5) #define check_add_overflow(x, y, sum) __builtin_add_overflow(x, y, sum) +#define check_mul_overflow(x, y, z) __builtin_mul_overflow(x, y, z) +#else +#define check_mul_overflow(x, y, z) ({ \ + *(z) = (x) * (y); \ + 0; \ +}) #endif #endif diff --git a/sys/dev/pci/drm/include/linux/preempt.h b/sys/dev/pci/drm/include/linux/preempt.h index 361befa92..32bf1168d 100644 --- a/sys/dev/pci/drm/include/linux/preempt.h +++ b/sys/dev/pci/drm/include/linux/preempt.h @@ -29,12 +29,7 @@ migrate_disable(void) static inline bool in_irq(void) { -#if defined(__amd64__) || defined(__arm__) || defined(__arm64__) || \ - defined(__i386__) || defined(__powerpc64__) || defined(__riscv64__) return (curcpu()->ci_idepth > 0); -#else - return false; -#endif } static inline bool diff --git a/sys/dev/pci/drm/radeon/atombios_encoders.c b/sys/dev/pci/drm/radeon/atombios_encoders.c index 1471c3a96..5ee2d5f1f 100644 --- a/sys/dev/pci/drm/radeon/atombios_encoders.c +++ b/sys/dev/pci/drm/radeon/atombios_encoders.c @@ -2177,7 +2177,7 @@ assigned: void radeon_atom_encoder_init(struct radeon_device *rdev) { - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); struct drm_encoder *encoder; list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { diff --git a/sys/dev/pci/drm/radeon/cik.c b/sys/dev/pci/drm/radeon/cik.c index b26486f14..af13b8955 100644 --- a/sys/dev/pci/drm/radeon/cik.c +++ b/sys/dev/pci/drm/radeon/cik.c @@ -7587,7 +7587,7 @@ restart_ih: DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); if (rdev->irq.crtc_vblank_int[0]) { - drm_handle_vblank(rdev->ddev, 0); + drm_handle_vblank(rdev_to_drm(rdev), 0); rdev->pm.vblank_sync = true; wake_up(&rdev->irq.vblank_queue); } @@ -7617,7 +7617,7 @@ restart_ih: DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); if (rdev->irq.crtc_vblank_int[1]) { - drm_handle_vblank(rdev->ddev, 1); + drm_handle_vblank(rdev_to_drm(rdev), 1); rdev->pm.vblank_sync = true; wake_up(&rdev->irq.vblank_queue); } @@ -7647,7 +7647,7 @@ restart_ih: DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); if (rdev->irq.crtc_vblank_int[2]) { - drm_handle_vblank(rdev->ddev, 2); + drm_handle_vblank(rdev_to_drm(rdev), 2); rdev->pm.vblank_sync = true; wake_up(&rdev->irq.vblank_queue); } @@ -7677,7 +7677,7 @@ restart_ih: DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); if (rdev->irq.crtc_vblank_int[3]) { - drm_handle_vblank(rdev->ddev, 3); + drm_handle_vblank(rdev_to_drm(rdev), 3); rdev->pm.vblank_sync = true; wake_up(&rdev->irq.vblank_queue); } @@ -7707,7 +7707,7 @@ restart_ih: DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); if (rdev->irq.crtc_vblank_int[4]) { - drm_handle_vblank(rdev->ddev, 4); + drm_handle_vblank(rdev_to_drm(rdev), 4); rdev->pm.vblank_sync = true; wake_up(&rdev->irq.vblank_queue); } @@ -7737,7 +7737,7 @@ restart_ih: DRM_DEBUG("IH: IH event w/o asserted irq bit?\n"); if (rdev->irq.crtc_vblank_int[5]) { - drm_handle_vblank(rdev->ddev, 5); + drm_handle_vblank(rdev_to_drm(rdev), 5); rdev->pm.vblank_sync = true; wake_up(&rdev->irq.vblank_queue); } @@ -8583,7 +8583,7 @@ int cik_init(struct radeon_device *rdev) /* Initialize surface registers */ radeon_surface_init(rdev); /* Initialize clocks */ - radeon_get_clock_info(rdev->ddev); + radeon_get_clock_info(rdev_to_drm(rdev)); /* Fence driver */ radeon_fence_driver_init(rdev); diff --git a/sys/dev/pci/drm/radeon/dce6_afmt.c b/sys/dev/pci/drm/radeon/dce6_afmt.c index 4a1d5447e..4419a0e85 100644 --- a/sys/dev/pci/drm/radeon/dce6_afmt.c +++ b/sys/dev/pci/drm/radeon/dce6_afmt.c @@ -90,7 +90,7 @@ struct r600_audio_pin *dce6_audio_get_pin(struct radeon_device *rdev) pin = &rdev->audio.pin[i]; pin_count = 0; - list_for_each_entry(encoder, &rdev->ddev->mode_config.encoder_list, head) { + list_for_each_entry(encoder, &rdev_to_drm(rdev)->mode_config.encoder_list, head) { if (radeon_encoder_is_digital(encoder)) { radeon_encoder = to_radeon_encoder(encoder); dig = radeon_encoder->enc_priv; diff --git a/sys/dev/pci/drm/radeon/evergreen.c b/sys/dev/pci/drm/radeon/evergreen.c index 230015330..f739eaf6c 100644 --- a/sys/dev/pci/drm/radeon/evergreen.c +++ b/sys/dev/pci/drm/radeon/evergreen.c @@ -1672,7 +1672,7 @@ void evergreen_pm_misc(struct radeon_device *rdev) */ void evergreen_pm_prepare(struct radeon_device *rdev) { - struct drm_device *ddev = rdev->ddev; + struct drm_device *ddev = rdev_to_drm(rdev); struct drm_crtc *crtc; struct radeon_crtc *radeon_crtc; u32 tmp; @@ -1697,7 +1697,7 @@ void evergreen_pm_prepare(struct radeon_device *rdev) */ void evergreen_pm_finish(struct radeon_device *rdev) { - struct drm_device *ddev = rdev->ddev; + struct drm_device *ddev = rdev_to_drm(rdev); struct drm_crtc *crtc; struct radeon_crtc *radeon_crtc; u32 tmp; @@ -1762,7 +1762,7 @@ void evergreen_hpd_set_polarity(struct radeon_device *rdev, */ void evergreen_hpd_init(struct radeon_device *rdev) { - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); struct drm_connector *connector; unsigned enabled = 0; u32 tmp = DC_HPDx_CONNECTION_TIMER(0x9c4) | @@ -1803,7 +1803,7 @@ void evergreen_hpd_init(struct radeon_device *rdev) */ void evergreen_hpd_fini(struct radeon_device *rdev) { - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); struct drm_connector *connector; unsigned disabled = 0; @@ -4758,7 +4758,7 @@ restart_ih: event_name = "vblank"; if (rdev->irq.crtc_vblank_int[crtc_idx]) { - drm_handle_vblank(rdev->ddev, crtc_idx); + drm_handle_vblank(rdev_to_drm(rdev), crtc_idx); rdev->pm.vblank_sync = true; wake_up(&rdev->irq.vblank_queue); } @@ -5216,7 +5216,7 @@ int evergreen_init(struct radeon_device *rdev) /* Initialize surface registers */ radeon_surface_init(rdev); /* Initialize clocks */ - radeon_get_clock_info(rdev->ddev); + radeon_get_clock_info(rdev_to_drm(rdev)); /* Fence driver */ radeon_fence_driver_init(rdev); /* initialize AGP */ diff --git a/sys/dev/pci/drm/radeon/ni.c b/sys/dev/pci/drm/radeon/ni.c index e2e6999e8..9d76709f2 100644 --- a/sys/dev/pci/drm/radeon/ni.c +++ b/sys/dev/pci/drm/radeon/ni.c @@ -2373,7 +2373,7 @@ int cayman_init(struct radeon_device *rdev) /* Initialize surface registers */ radeon_surface_init(rdev); /* Initialize clocks */ - radeon_get_clock_info(rdev->ddev); + radeon_get_clock_info(rdev_to_drm(rdev)); /* Fence driver */ radeon_fence_driver_init(rdev); /* initialize memory controller */ diff --git a/sys/dev/pci/drm/radeon/r100.c b/sys/dev/pci/drm/radeon/r100.c index 8d3124092..1ea0da9c5 100644 --- a/sys/dev/pci/drm/radeon/r100.c +++ b/sys/dev/pci/drm/radeon/r100.c @@ -458,7 +458,7 @@ void r100_pm_misc(struct radeon_device *rdev) */ void r100_pm_prepare(struct radeon_device *rdev) { - struct drm_device *ddev = rdev->ddev; + struct drm_device *ddev = rdev_to_drm(rdev); struct drm_crtc *crtc; struct radeon_crtc *radeon_crtc; u32 tmp; @@ -489,7 +489,7 @@ void r100_pm_prepare(struct radeon_device *rdev) */ void r100_pm_finish(struct radeon_device *rdev) { - struct drm_device *ddev = rdev->ddev; + struct drm_device *ddev = rdev_to_drm(rdev); struct drm_crtc *crtc; struct radeon_crtc *radeon_crtc; u32 tmp; @@ -602,7 +602,7 @@ void r100_hpd_set_polarity(struct radeon_device *rdev, */ void r100_hpd_init(struct radeon_device *rdev) { - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); struct drm_connector *connector; unsigned enable = 0; @@ -625,7 +625,7 @@ void r100_hpd_init(struct radeon_device *rdev) */ void r100_hpd_fini(struct radeon_device *rdev) { - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); struct drm_connector *connector; unsigned disable = 0; @@ -797,7 +797,7 @@ int r100_irq_process(struct radeon_device *rdev) /* Vertical blank interrupts */ if (status & RADEON_CRTC_VBLANK_STAT) { if (rdev->irq.crtc_vblank_int[0]) { - drm_handle_vblank(rdev->ddev, 0); + drm_handle_vblank(rdev_to_drm(rdev), 0); rdev->pm.vblank_sync = true; wake_up(&rdev->irq.vblank_queue); } @@ -806,7 +806,7 @@ int r100_irq_process(struct radeon_device *rdev) } if (status & RADEON_CRTC2_VBLANK_STAT) { if (rdev->irq.crtc_vblank_int[1]) { - drm_handle_vblank(rdev->ddev, 1); + drm_handle_vblank(rdev_to_drm(rdev), 1); rdev->pm.vblank_sync = true; wake_up(&rdev->irq.vblank_queue); } @@ -1490,7 +1490,7 @@ int r100_cs_packet_parse_vline(struct radeon_cs_parser *p) header = radeon_get_ib_value(p, h_idx); crtc_id = radeon_get_ib_value(p, h_idx + 5); reg = R100_CP_PACKET0_GET_REG(header); - crtc = drm_crtc_find(p->rdev->ddev, p->filp, crtc_id); + crtc = drm_crtc_find(rdev_to_drm(p->rdev), p->filp, crtc_id); if (!crtc) { DRM_ERROR("cannot find crtc %d\n", crtc_id); return -ENOENT; @@ -3078,7 +3078,7 @@ DEFINE_SHOW_ATTRIBUTE(r100_debugfs_mc_info); void r100_debugfs_rbbm_init(struct radeon_device *rdev) { #if defined(CONFIG_DEBUG_FS) - struct dentry *root = rdev->ddev->primary->debugfs_root; + struct dentry *root = rdev_to_drm(rdev)->primary->debugfs_root; debugfs_create_file("r100_rbbm_info", 0444, root, rdev, &r100_debugfs_rbbm_info_fops); @@ -3088,7 +3088,7 @@ void r100_debugfs_rbbm_init(struct radeon_device *rdev) void r100_debugfs_cp_init(struct radeon_device *rdev) { #if defined(CONFIG_DEBUG_FS) - struct dentry *root = rdev->ddev->primary->debugfs_root; + struct dentry *root = rdev_to_drm(rdev)->primary->debugfs_root; debugfs_create_file("r100_cp_ring_info", 0444, root, rdev, &r100_debugfs_cp_ring_info_fops); @@ -3100,7 +3100,7 @@ void r100_debugfs_cp_init(struct radeon_device *rdev) void r100_debugfs_mc_info_init(struct radeon_device *rdev) { #if defined(CONFIG_DEBUG_FS) - struct dentry *root = rdev->ddev->primary->debugfs_root; + struct dentry *root = rdev_to_drm(rdev)->primary->debugfs_root; debugfs_create_file("r100_mc_info", 0444, root, rdev, &r100_debugfs_mc_info_fops); @@ -3966,7 +3966,7 @@ int r100_resume(struct radeon_device *rdev) RREG32(R_0007C0_CP_STAT)); } /* post */ - radeon_combios_asic_init(rdev->ddev); + radeon_combios_asic_init(rdev_to_drm(rdev)); /* Resume clock after posting */ r100_clock_startup(rdev); /* Initialize surface registers */ @@ -4075,7 +4075,7 @@ int r100_init(struct radeon_device *rdev) /* Set asic errata */ r100_errata(rdev); /* Initialize clocks */ - radeon_get_clock_info(rdev->ddev); + radeon_get_clock_info(rdev_to_drm(rdev)); /* initialize AGP */ if (rdev->flags & RADEON_IS_AGP) { r = radeon_agp_init(rdev); diff --git a/sys/dev/pci/drm/radeon/r300.c b/sys/dev/pci/drm/radeon/r300.c index 25201b9a5..430a4263c 100644 --- a/sys/dev/pci/drm/radeon/r300.c +++ b/sys/dev/pci/drm/radeon/r300.c @@ -615,7 +615,7 @@ DEFINE_SHOW_ATTRIBUTE(rv370_debugfs_pcie_gart_info); static void rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev) { #if defined(CONFIG_DEBUG_FS) - struct dentry *root = rdev->ddev->primary->debugfs_root; + struct dentry *root = rdev_to_drm(rdev)->primary->debugfs_root; debugfs_create_file("rv370_pcie_gart_info", 0444, root, rdev, &rv370_debugfs_pcie_gart_info_fops); @@ -1451,7 +1451,7 @@ int r300_resume(struct radeon_device *rdev) RREG32(R_0007C0_CP_STAT)); } /* post */ - radeon_combios_asic_init(rdev->ddev); + radeon_combios_asic_init(rdev_to_drm(rdev)); /* Resume clock after posting */ r300_clock_startup(rdev); /* Initialize surface registers */ @@ -1537,7 +1537,7 @@ int r300_init(struct radeon_device *rdev) /* Set asic errata */ r300_errata(rdev); /* Initialize clocks */ - radeon_get_clock_info(rdev->ddev); + radeon_get_clock_info(rdev_to_drm(rdev)); /* initialize AGP */ if (rdev->flags & RADEON_IS_AGP) { r = radeon_agp_init(rdev); diff --git a/sys/dev/pci/drm/radeon/r420.c b/sys/dev/pci/drm/radeon/r420.c index eae8a6389..b3a747a8f 100644 --- a/sys/dev/pci/drm/radeon/r420.c +++ b/sys/dev/pci/drm/radeon/r420.c @@ -321,7 +321,7 @@ int r420_resume(struct radeon_device *rdev) if (rdev->is_atom_bios) { atom_asic_init(rdev->mode_info.atom_context); } else { - radeon_combios_asic_init(rdev->ddev); + radeon_combios_asic_init(rdev_to_drm(rdev)); } /* Resume clock after posting */ r420_clock_resume(rdev); @@ -413,7 +413,7 @@ int r420_init(struct radeon_device *rdev) return -EINVAL; /* Initialize clocks */ - radeon_get_clock_info(rdev->ddev); + radeon_get_clock_info(rdev_to_drm(rdev)); /* initialize AGP */ if (rdev->flags & RADEON_IS_AGP) { r = radeon_agp_init(rdev); @@ -492,7 +492,7 @@ DEFINE_SHOW_ATTRIBUTE(r420_debugfs_pipes_info); void r420_debugfs_pipes_info_init(struct radeon_device *rdev) { #if defined(CONFIG_DEBUG_FS) - struct dentry *root = rdev->ddev->primary->debugfs_root; + struct dentry *root = rdev_to_drm(rdev)->primary->debugfs_root; debugfs_create_file("r420_pipes_info", 0444, root, rdev, &r420_debugfs_pipes_info_fops); diff --git a/sys/dev/pci/drm/radeon/r520.c b/sys/dev/pci/drm/radeon/r520.c index 6cbcaa845..08e127b32 100644 --- a/sys/dev/pci/drm/radeon/r520.c +++ b/sys/dev/pci/drm/radeon/r520.c @@ -287,7 +287,7 @@ int r520_init(struct radeon_device *rdev) atom_asic_init(rdev->mode_info.atom_context); } /* Initialize clocks */ - radeon_get_clock_info(rdev->ddev); + radeon_get_clock_info(rdev_to_drm(rdev)); /* initialize AGP */ if (rdev->flags & RADEON_IS_AGP) { r = radeon_agp_init(rdev); diff --git a/sys/dev/pci/drm/radeon/r600.c b/sys/dev/pci/drm/radeon/r600.c index edd85e9f9..d123c4206 100644 --- a/sys/dev/pci/drm/radeon/r600.c +++ b/sys/dev/pci/drm/radeon/r600.c @@ -950,7 +950,7 @@ void r600_hpd_set_polarity(struct radeon_device *rdev, void r600_hpd_init(struct radeon_device *rdev) { - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); struct drm_connector *connector; unsigned enable = 0; @@ -1017,7 +1017,7 @@ void r600_hpd_init(struct radeon_device *rdev) void r600_hpd_fini(struct radeon_device *rdev) { - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); struct drm_connector *connector; unsigned disable = 0; @@ -3280,7 +3280,7 @@ int r600_init(struct radeon_device *rdev) /* Initialize surface registers */ radeon_surface_init(rdev); /* Initialize clocks */ - radeon_get_clock_info(rdev->ddev); + radeon_get_clock_info(rdev_to_drm(rdev)); /* Fence driver */ radeon_fence_driver_init(rdev); if (rdev->flags & RADEON_IS_AGP) { @@ -4138,7 +4138,7 @@ restart_ih: DRM_DEBUG("IH: D1 vblank - IH event w/o asserted irq bit?\n"); if (rdev->irq.crtc_vblank_int[0]) { - drm_handle_vblank(rdev->ddev, 0); + drm_handle_vblank(rdev_to_drm(rdev), 0); rdev->pm.vblank_sync = true; wake_up(&rdev->irq.vblank_queue); } @@ -4168,7 +4168,7 @@ restart_ih: DRM_DEBUG("IH: D2 vblank - IH event w/o asserted irq bit?\n"); if (rdev->irq.crtc_vblank_int[1]) { - drm_handle_vblank(rdev->ddev, 1); + drm_handle_vblank(rdev_to_drm(rdev), 1); rdev->pm.vblank_sync = true; wake_up(&rdev->irq.vblank_queue); } @@ -4360,7 +4360,7 @@ DEFINE_SHOW_ATTRIBUTE(r600_debugfs_mc_info); static void r600_debugfs_mc_info_init(struct radeon_device *rdev) { #if defined(CONFIG_DEBUG_FS) - struct dentry *root = rdev->ddev->primary->debugfs_root; + struct dentry *root = rdev_to_drm(rdev)->primary->debugfs_root; debugfs_create_file("r600_mc_info", 0444, root, rdev, &r600_debugfs_mc_info_fops); diff --git a/sys/dev/pci/drm/radeon/r600_cs.c b/sys/dev/pci/drm/radeon/r600_cs.c index 6cf54a747..ac77d1246 100644 --- a/sys/dev/pci/drm/radeon/r600_cs.c +++ b/sys/dev/pci/drm/radeon/r600_cs.c @@ -884,7 +884,7 @@ int r600_cs_common_vline_parse(struct radeon_cs_parser *p, crtc_id = radeon_get_ib_value(p, h_idx + 2 + 7 + 1); reg = R600_CP_PACKET0_GET_REG(header); - crtc = drm_crtc_find(p->rdev->ddev, p->filp, crtc_id); + crtc = drm_crtc_find(rdev_to_drm(p->rdev), p->filp, crtc_id); if (!crtc) { DRM_ERROR("cannot find crtc %d\n", crtc_id); return -ENOENT; @@ -2104,7 +2104,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, return -EINVAL; } - offset = radeon_get_ib_value(p, idx+1) << 8; + offset = (u64)radeon_get_ib_value(p, idx+1) << 8; if (offset != track->vgt_strmout_bo_offset[idx_value]) { DRM_ERROR("bad STRMOUT_BASE_UPDATE, bo offset does not match: 0x%llx, 0x%x\n", offset, track->vgt_strmout_bo_offset[idx_value]); diff --git a/sys/dev/pci/drm/radeon/r600_dpm.c b/sys/dev/pci/drm/radeon/r600_dpm.c index 9d2bcb955..157107cf1 100644 --- a/sys/dev/pci/drm/radeon/r600_dpm.c +++ b/sys/dev/pci/drm/radeon/r600_dpm.c @@ -155,7 +155,7 @@ void r600_dpm_print_ps_status(struct radeon_device *rdev, u32 r600_dpm_get_vblank_time(struct radeon_device *rdev) { - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); struct drm_crtc *crtc; struct radeon_crtc *radeon_crtc; u32 vblank_in_pixels; @@ -182,7 +182,7 @@ u32 r600_dpm_get_vblank_time(struct radeon_device *rdev) u32 r600_dpm_get_vrefresh(struct radeon_device *rdev) { - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); struct drm_crtc *crtc; struct radeon_crtc *radeon_crtc; u32 vrefresh = 0; diff --git a/sys/dev/pci/drm/radeon/r600_hdmi.c b/sys/dev/pci/drm/radeon/r600_hdmi.c index f3551ebaa..661f374f5 100644 --- a/sys/dev/pci/drm/radeon/r600_hdmi.c +++ b/sys/dev/pci/drm/radeon/r600_hdmi.c @@ -116,7 +116,7 @@ void r600_audio_update_hdmi(struct work_struct *work) { struct radeon_device *rdev = container_of(work, struct radeon_device, audio_work); - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); struct r600_audio_pin audio_status = r600_audio_status(rdev); struct drm_encoder *encoder; bool changed = false; diff --git a/sys/dev/pci/drm/radeon/radeon.h b/sys/dev/pci/drm/radeon/radeon.h index afa0c1870..57778ff1a 100644 --- a/sys/dev/pci/drm/radeon/radeon.h +++ b/sys/dev/pci/drm/radeon/radeon.h @@ -2524,6 +2524,11 @@ void r100_io_wreg(struct radeon_device *rdev, u32 reg, u32 v); u32 cik_mm_rdoorbell(struct radeon_device *rdev, u32 index); void cik_mm_wdoorbell(struct radeon_device *rdev, u32 index, u32 v); +static inline struct drm_device *rdev_to_drm(struct radeon_device *rdev) +{ + return rdev->ddev; +} + /* * Cast helper */ diff --git a/sys/dev/pci/drm/radeon/radeon_acpi.c b/sys/dev/pci/drm/radeon/radeon_acpi.c index 603a78e41..22ce61bdf 100644 --- a/sys/dev/pci/drm/radeon/radeon_acpi.c +++ b/sys/dev/pci/drm/radeon/radeon_acpi.c @@ -405,11 +405,11 @@ static int radeon_atif_handler(struct radeon_device *rdev, if (req.pending & ATIF_DGPU_DISPLAY_EVENT) { if ((rdev->flags & RADEON_IS_PX) && radeon_atpx_dgpu_req_power_for_displays()) { - pm_runtime_get_sync(rdev->ddev->dev); + pm_runtime_get_sync(rdev_to_drm(rdev)->dev); /* Just fire off a uevent and let userspace tell us what to do */ - drm_helper_hpd_irq_event(rdev->ddev); - pm_runtime_mark_last_busy(rdev->ddev->dev); - pm_runtime_put_autosuspend(rdev->ddev->dev); + drm_helper_hpd_irq_event(rdev_to_drm(rdev)); + pm_runtime_mark_last_busy(rdev_to_drm(rdev)->dev); + pm_runtime_put_autosuspend(rdev_to_drm(rdev)->dev); } } /* TODO: check other events */ @@ -736,7 +736,7 @@ int radeon_acpi_init(struct radeon_device *rdev) struct radeon_encoder *target = NULL; /* Find the encoder controlling the brightness */ - list_for_each_entry(tmp, &rdev->ddev->mode_config.encoder_list, + list_for_each_entry(tmp, &rdev_to_drm(rdev)->mode_config.encoder_list, head) { struct radeon_encoder *enc = to_radeon_encoder(tmp); diff --git a/sys/dev/pci/drm/radeon/radeon_agp.c b/sys/dev/pci/drm/radeon/radeon_agp.c index d23cb093e..ee245febd 100644 --- a/sys/dev/pci/drm/radeon/radeon_agp.c +++ b/sys/dev/pci/drm/radeon/radeon_agp.c @@ -168,7 +168,7 @@ static int radeon_agp_head_acquire(struct radeon_device *rdev) STUB(); return -ENOSYS; #ifdef notyet - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); struct pci_dev *pdev = dev->pdev; if (!rdev->agp) diff --git a/sys/dev/pci/drm/radeon/radeon_atombios.c b/sys/dev/pci/drm/radeon/radeon_atombios.c index 7ed37b3cc..72e9133db 100644 --- a/sys/dev/pci/drm/radeon/radeon_atombios.c +++ b/sys/dev/pci/drm/radeon/radeon_atombios.c @@ -186,7 +186,7 @@ void radeon_atombios_i2c_init(struct radeon_device *rdev) if (i2c.valid) { snprintf(stmp, sizeof(stmp), "0x%x", i2c.i2c_id); - rdev->i2c_bus[i] = radeon_i2c_create(rdev->ddev, &i2c, stmp); + rdev->i2c_bus[i] = radeon_i2c_create(rdev_to_drm(rdev), &i2c, stmp); } gpio = (ATOM_GPIO_I2C_ASSIGMENT *) ((u8 *)gpio + sizeof(ATOM_GPIO_I2C_ASSIGMENT)); diff --git a/sys/dev/pci/drm/radeon/radeon_audio.c b/sys/dev/pci/drm/radeon/radeon_audio.c index a1200248b..71bc8cb6b 100644 --- a/sys/dev/pci/drm/radeon/radeon_audio.c +++ b/sys/dev/pci/drm/radeon/radeon_audio.c @@ -195,7 +195,7 @@ static void radeon_audio_enable(struct radeon_device *rdev, return; if (rdev->mode_info.mode_config_initialized) { - list_for_each_entry(encoder, &rdev->ddev->mode_config.encoder_list, head) { + list_for_each_entry(encoder, &rdev_to_drm(rdev)->mode_config.encoder_list, head) { if (radeon_encoder_is_digital(encoder)) { radeon_encoder = to_radeon_encoder(encoder); dig = radeon_encoder->enc_priv; @@ -760,16 +760,20 @@ static int radeon_audio_component_get_eld(struct device *kdev, int port, if (!rdev->audio.enabled || !rdev->mode_info.mode_config_initialized) return 0; - list_for_each_entry(encoder, &rdev->ddev->mode_config.encoder_list, head) { + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { + const struct drm_connector_helper_funcs *connector_funcs = + connector->helper_private; + encoder = connector_funcs->best_encoder(connector); + + if (!encoder) + continue; + if (!radeon_encoder_is_digital(encoder)) continue; radeon_encoder = to_radeon_encoder(encoder); dig = radeon_encoder->enc_priv; if (!dig->pin || dig->pin->id != port) continue; - connector = radeon_get_connector_for_encoder(encoder); - if (!connector) - continue; *enabled = true; ret = drm_eld_size(connector->eld); memcpy(buf, connector->eld, min(max_bytes, ret)); diff --git a/sys/dev/pci/drm/radeon/radeon_combios.c b/sys/dev/pci/drm/radeon/radeon_combios.c index 7c4063164..0e94a0c33 100644 --- a/sys/dev/pci/drm/radeon/radeon_combios.c +++ b/sys/dev/pci/drm/radeon/radeon_combios.c @@ -373,7 +373,7 @@ bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev) int edid_info, size; struct edid *edid; unsigned char *raw; - edid_info = combios_get_table_offset(rdev->ddev, COMBIOS_HARDCODED_EDID_TABLE); + edid_info = combios_get_table_offset(rdev_to_drm(rdev), COMBIOS_HARDCODED_EDID_TABLE); if (!edid_info) return false; @@ -650,7 +650,7 @@ static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rde static struct radeon_i2c_bus_rec radeon_combios_get_i2c_info_from_table(struct radeon_device *rdev) { - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); struct radeon_i2c_bus_rec i2c; u16 offset; u8 id, blocks, clk, data; @@ -678,7 +678,7 @@ static struct radeon_i2c_bus_rec radeon_combios_get_i2c_info_from_table(struct r void radeon_combios_i2c_init(struct radeon_device *rdev) { - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); struct radeon_i2c_bus_rec i2c; /* actual hw pads @@ -820,7 +820,7 @@ bool radeon_combios_get_clock_info(struct drm_device *dev) bool radeon_combios_sideport_present(struct radeon_device *rdev) { - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); u16 igp_info; /* sideport is AMD only */ @@ -923,7 +923,7 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct enum radeon_tv_std radeon_combios_get_tv_info(struct radeon_device *rdev) { - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); uint16_t tv_info; enum radeon_tv_std tv_std = TV_STD_NTSC; @@ -2645,7 +2645,7 @@ static const char *thermal_controller_names[] = { void radeon_combios_get_power_modes(struct radeon_device *rdev) { - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); u16 offset, misc, misc2 = 0; u8 rev, tmp; int state_index = 0; diff --git a/sys/dev/pci/drm/radeon/radeon_device.c b/sys/dev/pci/drm/radeon/radeon_device.c index 380027568..ccb1960bd 100644 --- a/sys/dev/pci/drm/radeon/radeon_device.c +++ b/sys/dev/pci/drm/radeon/radeon_device.c @@ -773,7 +773,7 @@ bool radeon_boot_test_post_card(struct radeon_device *rdev) if (rdev->is_atom_bios) atom_asic_init(rdev->mode_info.atom_context); else - radeon_combios_asic_init(rdev->ddev); + radeon_combios_asic_init(rdev_to_drm(rdev)); return true; } else { dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n"); @@ -987,7 +987,7 @@ int radeon_atombios_init(struct radeon_device *rdev) return -ENOMEM; rdev->mode_info.atom_card_info = atom_card_info; - atom_card_info->dev = rdev->ddev; + atom_card_info->dev = rdev_to_drm(rdev); atom_card_info->reg_read = cail_reg_read; atom_card_info->reg_write = cail_reg_write; /* needed for iio ops */ @@ -1014,7 +1014,7 @@ int radeon_atombios_init(struct radeon_device *rdev) rw_init(&rdev->mode_info.atom_context->mutex, "atomcon"); rw_init(&rdev->mode_info.atom_context->scratch_mutex, "atomscr"); - radeon_atom_initialize_bios_scratch_regs(rdev->ddev); + radeon_atom_initialize_bios_scratch_regs(rdev_to_drm(rdev)); atom_allocate_fb_scratch(rdev->mode_info.atom_context); return 0; } @@ -1058,7 +1058,7 @@ void radeon_atombios_fini(struct radeon_device *rdev) */ int radeon_combios_init(struct radeon_device *rdev) { - radeon_combios_initialize_bios_scratch_regs(rdev->ddev); + radeon_combios_initialize_bios_scratch_regs(rdev_to_drm(rdev)); return 0; } @@ -1893,7 +1893,7 @@ int radeon_gpu_reset(struct radeon_device *rdev) downgrade_write(&rdev->exclusive_lock); - drm_helper_resume_force_mode(rdev->ddev); + drm_helper_resume_force_mode(rdev_to_drm(rdev)); /* set the power state here in case we are a PX system or headless */ if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) diff --git a/sys/dev/pci/drm/radeon/radeon_display.c b/sys/dev/pci/drm/radeon/radeon_display.c index d12805c6d..e2e0dc8ad 100644 --- a/sys/dev/pci/drm/radeon/radeon_display.c +++ b/sys/dev/pci/drm/radeon/radeon_display.c @@ -302,13 +302,13 @@ void radeon_crtc_handle_vblank(struct radeon_device *rdev, int crtc_id) if ((radeon_use_pflipirq == 2) && ASIC_IS_DCE4(rdev)) return; - spin_lock_irqsave(&rdev->ddev->event_lock, flags); + spin_lock_irqsave(&rdev_to_drm(rdev)->event_lock, flags); if (radeon_crtc->flip_status != RADEON_FLIP_SUBMITTED) { DRM_DEBUG_DRIVER("radeon_crtc->flip_status = %d != " "RADEON_FLIP_SUBMITTED(%d)\n", radeon_crtc->flip_status, RADEON_FLIP_SUBMITTED); - spin_unlock_irqrestore(&rdev->ddev->event_lock, flags); + spin_unlock_irqrestore(&rdev_to_drm(rdev)->event_lock, flags); return; } @@ -334,7 +334,7 @@ void radeon_crtc_handle_vblank(struct radeon_device *rdev, int crtc_id) */ if (update_pending && (DRM_SCANOUTPOS_VALID & - radeon_get_crtc_scanoutpos(rdev->ddev, crtc_id, + radeon_get_crtc_scanoutpos(rdev_to_drm(rdev), crtc_id, GET_DISTANCE_TO_VBLANKSTART, &vpos, &hpos, NULL, NULL, &rdev->mode_info.crtcs[crtc_id]->base.hwmode)) && @@ -347,7 +347,7 @@ void radeon_crtc_handle_vblank(struct radeon_device *rdev, int crtc_id) */ update_pending = 0; } - spin_unlock_irqrestore(&rdev->ddev->event_lock, flags); + spin_unlock_irqrestore(&rdev_to_drm(rdev)->event_lock, flags); if (!update_pending) radeon_crtc_handle_flip(rdev, crtc_id); } @@ -370,14 +370,14 @@ void radeon_crtc_handle_flip(struct radeon_device *rdev, int crtc_id) if (radeon_crtc == NULL) return; - spin_lock_irqsave(&rdev->ddev->event_lock, flags); + spin_lock_irqsave(&rdev_to_drm(rdev)->event_lock, flags); work = radeon_crtc->flip_work; if (radeon_crtc->flip_status != RADEON_FLIP_SUBMITTED) { DRM_DEBUG_DRIVER("radeon_crtc->flip_status = %d != " "RADEON_FLIP_SUBMITTED(%d)\n", radeon_crtc->flip_status, RADEON_FLIP_SUBMITTED); - spin_unlock_irqrestore(&rdev->ddev->event_lock, flags); + spin_unlock_irqrestore(&rdev_to_drm(rdev)->event_lock, flags); return; } @@ -389,7 +389,7 @@ void radeon_crtc_handle_flip(struct radeon_device *rdev, int crtc_id) if (work->event) drm_crtc_send_vblank_event(&radeon_crtc->base, work->event); - spin_unlock_irqrestore(&rdev->ddev->event_lock, flags); + spin_unlock_irqrestore(&rdev_to_drm(rdev)->event_lock, flags); drm_crtc_vblank_put(&radeon_crtc->base); radeon_irq_kms_pflip_irq_put(rdev, work->crtc_id); @@ -408,7 +408,7 @@ static void radeon_flip_work_func(struct work_struct *__work) struct radeon_flip_work *work = container_of(__work, struct radeon_flip_work, flip_work); struct radeon_device *rdev = work->rdev; - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[work->crtc_id]; struct drm_crtc *crtc = &radeon_crtc->base; @@ -1401,7 +1401,7 @@ static int radeon_modeset_create_props(struct radeon_device *rdev) if (rdev->is_atom_bios) { rdev->mode_info.coherent_mode_property = - drm_property_create_range(rdev->ddev, 0 , "coherent", 0, 1); + drm_property_create_range(rdev_to_drm(rdev), 0, "coherent", 0, 1); if (!rdev->mode_info.coherent_mode_property) return -ENOMEM; } @@ -1409,57 +1409,57 @@ static int radeon_modeset_create_props(struct radeon_device *rdev) if (!ASIC_IS_AVIVO(rdev)) { sz = ARRAY_SIZE(radeon_tmds_pll_enum_list); rdev->mode_info.tmds_pll_property = - drm_property_create_enum(rdev->ddev, 0, + drm_property_create_enum(rdev_to_drm(rdev), 0, "tmds_pll", radeon_tmds_pll_enum_list, sz); } rdev->mode_info.load_detect_property = - drm_property_create_range(rdev->ddev, 0, "load detection", 0, 1); + drm_property_create_range(rdev_to_drm(rdev), 0, "load detection", 0, 1); if (!rdev->mode_info.load_detect_property) return -ENOMEM; - drm_mode_create_scaling_mode_property(rdev->ddev); + drm_mode_create_scaling_mode_property(rdev_to_drm(rdev)); sz = ARRAY_SIZE(radeon_tv_std_enum_list); rdev->mode_info.tv_std_property = - drm_property_create_enum(rdev->ddev, 0, + drm_property_create_enum(rdev_to_drm(rdev), 0, "tv standard", radeon_tv_std_enum_list, sz); sz = ARRAY_SIZE(radeon_underscan_enum_list); rdev->mode_info.underscan_property = - drm_property_create_enum(rdev->ddev, 0, + drm_property_create_enum(rdev_to_drm(rdev), 0, "underscan", radeon_underscan_enum_list, sz); rdev->mode_info.underscan_hborder_property = - drm_property_create_range(rdev->ddev, 0, + drm_property_create_range(rdev_to_drm(rdev), 0, "underscan hborder", 0, 128); if (!rdev->mode_info.underscan_hborder_property) return -ENOMEM; rdev->mode_info.underscan_vborder_property = - drm_property_create_range(rdev->ddev, 0, + drm_property_create_range(rdev_to_drm(rdev), 0, "underscan vborder", 0, 128); if (!rdev->mode_info.underscan_vborder_property) return -ENOMEM; sz = ARRAY_SIZE(radeon_audio_enum_list); rdev->mode_info.audio_property = - drm_property_create_enum(rdev->ddev, 0, + drm_property_create_enum(rdev_to_drm(rdev), 0, "audio", radeon_audio_enum_list, sz); sz = ARRAY_SIZE(radeon_dither_enum_list); rdev->mode_info.dither_property = - drm_property_create_enum(rdev->ddev, 0, + drm_property_create_enum(rdev_to_drm(rdev), 0, "dither", radeon_dither_enum_list, sz); sz = ARRAY_SIZE(radeon_output_csc_enum_list); rdev->mode_info.output_csc_property = - drm_property_create_enum(rdev->ddev, 0, + drm_property_create_enum(rdev_to_drm(rdev), 0, "output_csc", radeon_output_csc_enum_list, sz); @@ -1578,29 +1578,29 @@ int radeon_modeset_init(struct radeon_device *rdev) int i; int ret; - drm_mode_config_init(rdev->ddev); + drm_mode_config_init(rdev_to_drm(rdev)); rdev->mode_info.mode_config_initialized = true; - rdev->ddev->mode_config.funcs = &radeon_mode_funcs; + rdev_to_drm(rdev)->mode_config.funcs = &radeon_mode_funcs; if (radeon_use_pflipirq == 2 && rdev->family >= CHIP_R600) - rdev->ddev->mode_config.async_page_flip = true; + rdev_to_drm(rdev)->mode_config.async_page_flip = true; if (ASIC_IS_DCE5(rdev)) { - rdev->ddev->mode_config.max_width = 16384; - rdev->ddev->mode_config.max_height = 16384; + rdev_to_drm(rdev)->mode_config.max_width = 16384; + rdev_to_drm(rdev)->mode_config.max_height = 16384; } else if (ASIC_IS_AVIVO(rdev)) { - rdev->ddev->mode_config.max_width = 8192; - rdev->ddev->mode_config.max_height = 8192; + rdev_to_drm(rdev)->mode_config.max_width = 8192; + rdev_to_drm(rdev)->mode_config.max_height = 8192; } else { - rdev->ddev->mode_config.max_width = 4096; - rdev->ddev->mode_config.max_height = 4096; + rdev_to_drm(rdev)->mode_config.max_width = 4096; + rdev_to_drm(rdev)->mode_config.max_height = 4096; } - rdev->ddev->mode_config.preferred_depth = 24; - rdev->ddev->mode_config.prefer_shadow = 1; + rdev_to_drm(rdev)->mode_config.preferred_depth = 24; + rdev_to_drm(rdev)->mode_config.prefer_shadow = 1; - rdev->ddev->mode_config.fb_modifiers_not_supported = true; + rdev_to_drm(rdev)->mode_config.fb_modifiers_not_supported = true; ret = radeon_modeset_create_props(rdev); if (ret) { @@ -1618,11 +1618,11 @@ int radeon_modeset_init(struct radeon_device *rdev) /* allocate crtcs */ for (i = 0; i < rdev->num_crtc; i++) { - radeon_crtc_init(rdev->ddev, i); + radeon_crtc_init(rdev_to_drm(rdev), i); } /* okay we should have all the bios connectors */ - ret = radeon_setup_enc_conn(rdev->ddev); + ret = radeon_setup_enc_conn(rdev_to_drm(rdev)); if (!ret) { return ret; } @@ -1639,7 +1639,7 @@ int radeon_modeset_init(struct radeon_device *rdev) /* setup afmt */ radeon_afmt_init(rdev); - drm_kms_helper_poll_init(rdev->ddev); + drm_kms_helper_poll_init(rdev_to_drm(rdev)); /* do pm late init */ ret = radeon_pm_late_init(rdev); @@ -1650,11 +1650,11 @@ int radeon_modeset_init(struct radeon_device *rdev) void radeon_modeset_fini(struct radeon_device *rdev) { if (rdev->mode_info.mode_config_initialized) { - drm_kms_helper_poll_fini(rdev->ddev); + drm_kms_helper_poll_fini(rdev_to_drm(rdev)); radeon_hpd_fini(rdev); - drm_helper_force_disable_all(rdev->ddev); + drm_helper_force_disable_all(rdev_to_drm(rdev)); radeon_afmt_fini(rdev); - drm_mode_config_cleanup(rdev->ddev); + drm_mode_config_cleanup(rdev_to_drm(rdev)); rdev->mode_info.mode_config_initialized = false; } diff --git a/sys/dev/pci/drm/radeon/radeon_drv.c b/sys/dev/pci/drm/radeon/radeon_drv.c index 14762e757..693b3c8e2 100644 --- a/sys/dev/pci/drm/radeon/radeon_drv.c +++ b/sys/dev/pci/drm/radeon/radeon_drv.c @@ -917,7 +917,7 @@ radeondrm_setcolor(void *v, u_int index, u_int8_t r, u_int8_t g, u_int8_t b) void radeondrm_setpal(struct radeon_device *rdev, struct rasops_info *ri) { - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); struct drm_crtc *crtc; uint16_t *r_base, *g_base, *b_base; int i, index, ret = 0; @@ -1219,7 +1219,7 @@ void radeondrm_attachhook(struct device *self) { struct radeon_device *rdev = (struct radeon_device *)self; - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); int r, acpi_status; /* radeon_device_init should report only fatal error diff --git a/sys/dev/pci/drm/radeon/radeon_encoders.c b/sys/dev/pci/drm/radeon/radeon_encoders.c index 9cb6401fe..bb908f125 100644 --- a/sys/dev/pci/drm/radeon/radeon_encoders.c +++ b/sys/dev/pci/drm/radeon/radeon_encoders.c @@ -42,7 +42,7 @@ static uint32_t radeon_encoder_clones(struct drm_encoder *encoder) struct radeon_device *rdev = dev->dev_private; struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); struct drm_encoder *clone_encoder; - uint32_t index_mask = 0; + uint32_t index_mask = drm_encoder_mask(encoder); int count; /* DIG routing gets problematic */ diff --git a/sys/dev/pci/drm/radeon/radeon_fbdev.c b/sys/dev/pci/drm/radeon/radeon_fbdev.c index 13fddf289..607c11163 100644 --- a/sys/dev/pci/drm/radeon/radeon_fbdev.c +++ b/sys/dev/pci/drm/radeon/radeon_fbdev.c @@ -67,7 +67,7 @@ static int radeon_fbdev_create_pinned_object(struct drm_fb_helper *fb_helper, int height = mode_cmd->height; u32 cpp; - info = drm_get_format_info(rdev->ddev, mode_cmd); + info = drm_get_format_info(rdev_to_drm(rdev), mode_cmd); cpp = info->cpp[0]; /* need to align pitch with crtc limits */ @@ -149,15 +149,15 @@ static int radeon_fbdev_fb_open(struct fb_info *info, int user) struct radeon_device *rdev = fb_helper->dev->dev_private; int ret; - ret = pm_runtime_get_sync(rdev->ddev->dev); + ret = pm_runtime_get_sync(rdev_to_drm(rdev)->dev); if (ret < 0 && ret != -EACCES) goto err_pm_runtime_mark_last_busy; return 0; err_pm_runtime_mark_last_busy: - pm_runtime_mark_last_busy(rdev->ddev->dev); - pm_runtime_put_autosuspend(rdev->ddev->dev); + pm_runtime_mark_last_busy(rdev_to_drm(rdev)->dev); + pm_runtime_put_autosuspend(rdev_to_drm(rdev)->dev); return ret; } @@ -166,8 +166,8 @@ static int radeon_fbdev_fb_release(struct fb_info *info, int user) struct drm_fb_helper *fb_helper = info->par; struct radeon_device *rdev = fb_helper->dev->dev_private; - pm_runtime_mark_last_busy(rdev->ddev->dev); - pm_runtime_put_autosuspend(rdev->ddev->dev); + pm_runtime_mark_last_busy(rdev_to_drm(rdev)->dev); + pm_runtime_put_autosuspend(rdev_to_drm(rdev)->dev); return 0; } @@ -243,7 +243,7 @@ static int radeon_fbdev_fb_helper_fb_probe(struct drm_fb_helper *fb_helper, ret = -ENOMEM; goto err_radeon_fbdev_destroy_pinned_object; } - ret = radeon_framebuffer_init(rdev->ddev, fb, &mode_cmd, gobj); + ret = radeon_framebuffer_init(rdev_to_drm(rdev), fb, &mode_cmd, gobj); if (ret) { DRM_ERROR("failed to initialize framebuffer %d\n", ret); goto err_kfree; @@ -438,12 +438,12 @@ void radeon_fbdev_setup(struct radeon_device *rdev) fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL); if (!fb_helper) return; - drm_fb_helper_prepare(rdev->ddev, fb_helper, bpp_sel, &radeon_fbdev_fb_helper_funcs); + drm_fb_helper_prepare(rdev_to_drm(rdev), fb_helper, bpp_sel, &radeon_fbdev_fb_helper_funcs); - ret = drm_client_init(rdev->ddev, &fb_helper->client, "radeon-fbdev", + ret = drm_client_init(rdev_to_drm(rdev), &fb_helper->client, "radeon-fbdev", &radeon_fbdev_client_funcs); if (ret) { - drm_err(rdev->ddev, "Failed to register client: %d\n", ret); + drm_err(rdev_to_drm(rdev), "Failed to register client: %d\n", ret); goto err_drm_client_init; } @@ -458,13 +458,13 @@ err_drm_client_init: void radeon_fbdev_set_suspend(struct radeon_device *rdev, int state) { - if (rdev->ddev->fb_helper) - drm_fb_helper_set_suspend(rdev->ddev->fb_helper, state); + if (rdev_to_drm(rdev)->fb_helper) + drm_fb_helper_set_suspend(rdev_to_drm(rdev)->fb_helper, state); } bool radeon_fbdev_robj_is_fb(struct radeon_device *rdev, struct radeon_bo *robj) { - struct drm_fb_helper *fb_helper = rdev->ddev->fb_helper; + struct drm_fb_helper *fb_helper = rdev_to_drm(rdev)->fb_helper; struct drm_gem_object *gobj; if (!fb_helper) diff --git a/sys/dev/pci/drm/radeon/radeon_fence.c b/sys/dev/pci/drm/radeon/radeon_fence.c index 361dc7964..3662dab65 100644 --- a/sys/dev/pci/drm/radeon/radeon_fence.c +++ b/sys/dev/pci/drm/radeon/radeon_fence.c @@ -151,7 +151,7 @@ int radeon_fence_emit(struct radeon_device *rdev, rdev->fence_context + ring, seq); radeon_fence_ring_emit(rdev, ring, *fence); - trace_radeon_fence_emit(rdev->ddev, ring, (*fence)->seq); + trace_radeon_fence_emit(rdev_to_drm(rdev), ring, (*fence)->seq); radeon_fence_schedule_check(rdev, ring); return 0; } @@ -492,7 +492,7 @@ static long radeon_fence_wait_seq_timeout(struct radeon_device *rdev, if (!target_seq[i]) continue; - trace_radeon_fence_wait_begin(rdev->ddev, i, target_seq[i]); + trace_radeon_fence_wait_begin(rdev_to_drm(rdev), i, target_seq[i]); radeon_irq_kms_sw_irq_get(rdev, i); } @@ -514,7 +514,7 @@ static long radeon_fence_wait_seq_timeout(struct radeon_device *rdev, continue; radeon_irq_kms_sw_irq_put(rdev, i); - trace_radeon_fence_wait_end(rdev->ddev, i, target_seq[i]); + trace_radeon_fence_wait_end(rdev_to_drm(rdev), i, target_seq[i]); } return r; @@ -1004,7 +1004,7 @@ DEFINE_DEBUGFS_ATTRIBUTE(radeon_debugfs_gpu_reset_fops, void radeon_debugfs_fence_init(struct radeon_device *rdev) { #if defined(CONFIG_DEBUG_FS) - struct dentry *root = rdev->ddev->primary->debugfs_root; + struct dentry *root = rdev_to_drm(rdev)->primary->debugfs_root; debugfs_create_file("radeon_gpu_reset", 0444, root, rdev, &radeon_debugfs_gpu_reset_fops); diff --git a/sys/dev/pci/drm/radeon/radeon_gem.c b/sys/dev/pci/drm/radeon/radeon_gem.c index b9db67ce8..64f95cf1b 100644 --- a/sys/dev/pci/drm/radeon/radeon_gem.c +++ b/sys/dev/pci/drm/radeon/radeon_gem.c @@ -115,13 +115,13 @@ unlock_resv: unlock_mclk: switch (ret) { case VM_FAULT_NOPAGE: - ret = VM_PAGER_OK; + ret = 0; break; case VM_FAULT_RETRY: - ret = VM_PAGER_REFAULT; + ret = ERESTART; break; default: - ret = VM_PAGER_BAD; + ret = EACCES; break; } up_read(&rdev->pm.mclk_lock); @@ -991,7 +991,7 @@ DEFINE_SHOW_ATTRIBUTE(radeon_debugfs_gem_info); void radeon_gem_debugfs_init(struct radeon_device *rdev) { #if defined(CONFIG_DEBUG_FS) - struct dentry *root = rdev->ddev->primary->debugfs_root; + struct dentry *root = rdev_to_drm(rdev)->primary->debugfs_root; debugfs_create_file("radeon_gem_info", 0444, root, rdev, &radeon_debugfs_gem_info_fops); diff --git a/sys/dev/pci/drm/radeon/radeon_i2c.c b/sys/dev/pci/drm/radeon/radeon_i2c.c index ce61d4b16..5f9c8e0e6 100644 --- a/sys/dev/pci/drm/radeon/radeon_i2c.c +++ b/sys/dev/pci/drm/radeon/radeon_i2c.c @@ -1124,7 +1124,7 @@ void radeon_i2c_add(struct radeon_device *rdev, struct radeon_i2c_bus_rec *rec, const char *name) { - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); int i; for (i = 0; i < RADEON_MAX_I2C_BUS; i++) { diff --git a/sys/dev/pci/drm/radeon/radeon_ib.c b/sys/dev/pci/drm/radeon/radeon_ib.c index fb9ecf5db..560ce90f4 100644 --- a/sys/dev/pci/drm/radeon/radeon_ib.c +++ b/sys/dev/pci/drm/radeon/radeon_ib.c @@ -307,7 +307,7 @@ DEFINE_SHOW_ATTRIBUTE(radeon_debugfs_sa_info); static void radeon_debugfs_sa_init(struct radeon_device *rdev) { #if defined(CONFIG_DEBUG_FS) - struct dentry *root = rdev->ddev->primary->debugfs_root; + struct dentry *root = rdev_to_drm(rdev)->primary->debugfs_root; debugfs_create_file("radeon_sa_info", 0444, root, rdev, &radeon_debugfs_sa_info_fops); diff --git a/sys/dev/pci/drm/radeon/radeon_irq_kms.c b/sys/dev/pci/drm/radeon/radeon_irq_kms.c index beab23b82..f5c04f9b7 100644 --- a/sys/dev/pci/drm/radeon/radeon_irq_kms.c +++ b/sys/dev/pci/drm/radeon/radeon_irq_kms.c @@ -83,7 +83,7 @@ static void radeon_hotplug_work_func(struct work_struct *work) { struct radeon_device *rdev = container_of(work, struct radeon_device, hotplug_work.work); - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); struct drm_mode_config *mode_config = &dev->mode_config; struct drm_connector *connector; @@ -104,7 +104,7 @@ static void radeon_dp_work_func(struct work_struct *work) { struct radeon_device *rdev = container_of(work, struct radeon_device, dp_work); - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); struct drm_mode_config *mode_config = &dev->mode_config; struct drm_connector *connector; @@ -200,7 +200,7 @@ static void radeon_driver_irq_uninstall_kms(struct drm_device *dev) static int radeon_irq_install(struct radeon_device *rdev, int irq) { - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); int ret; #ifdef notyet @@ -223,7 +223,7 @@ static int radeon_irq_install(struct radeon_device *rdev, int irq) static void radeon_irq_uninstall(struct radeon_device *rdev) { - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); #ifdef __linux__ struct pci_dev *pdev = to_pci_dev(dev->dev); #else @@ -331,9 +331,9 @@ int radeon_irq_kms_init(struct radeon_device *rdev) mtx_init(&rdev->irq.lock, IPL_TTY); /* Disable vblank irqs aggressively for power-saving */ - rdev->ddev->vblank_disable_immediate = true; + rdev_to_drm(rdev)->vblank_disable_immediate = true; - r = drm_vblank_init(rdev->ddev, rdev->num_crtc); + r = drm_vblank_init(rdev_to_drm(rdev), rdev->num_crtc); if (r) { return r; } diff --git a/sys/dev/pci/drm/radeon/radeon_object.c b/sys/dev/pci/drm/radeon/radeon_object.c index 0c3db7386..3c3d7bc5d 100644 --- a/sys/dev/pci/drm/radeon/radeon_object.c +++ b/sys/dev/pci/drm/radeon/radeon_object.c @@ -152,7 +152,7 @@ int radeon_bo_create(struct radeon_device *rdev, bo = pool_get(&rdev->ddev->objpl, PR_WAITOK | PR_ZERO); if (bo == NULL) return -ENOMEM; - drm_gem_private_object_init(rdev->ddev, &bo->tbo.base, size); + drm_gem_private_object_init(rdev_to_drm(rdev), &bo->tbo.base, size); bo->rdev = rdev; bo->surface_reg = -1; INIT_LIST_HEAD(&bo->list); diff --git a/sys/dev/pci/drm/radeon/radeon_pm.c b/sys/dev/pci/drm/radeon/radeon_pm.c index 8ed667e51..267dfc5a5 100644 --- a/sys/dev/pci/drm/radeon/radeon_pm.c +++ b/sys/dev/pci/drm/radeon/radeon_pm.c @@ -281,7 +281,7 @@ static void radeon_pm_set_clocks(struct radeon_device *rdev) if (rdev->irq.installed) { i = 0; - drm_for_each_crtc(crtc, rdev->ddev) { + drm_for_each_crtc(crtc, rdev_to_drm(rdev)) { if (rdev->pm.active_crtcs & (1 << i)) { /* This can fail if a modeset is in progress */ if (drm_crtc_vblank_get(crtc) == 0) @@ -298,7 +298,7 @@ static void radeon_pm_set_clocks(struct radeon_device *rdev) if (rdev->irq.installed) { i = 0; - drm_for_each_crtc(crtc, rdev->ddev) { + drm_for_each_crtc(crtc, rdev_to_drm(rdev)) { if (rdev->pm.req_vblank & (1 << i)) { rdev->pm.req_vblank &= ~(1 << i); drm_crtc_vblank_put(crtc); @@ -683,7 +683,7 @@ static ssize_t radeon_hwmon_show_temp(struct device *dev, char *buf) { struct radeon_device *rdev = dev_get_drvdata(dev); - struct drm_device *ddev = rdev->ddev; + struct drm_device *ddev = rdev_to_drm(rdev); int temp; /* Can't get temperature when the card is off */ @@ -727,7 +727,7 @@ static ssize_t radeon_hwmon_show_sclk(struct device *dev, struct device_attribute *attr, char *buf) { struct radeon_device *rdev = dev_get_drvdata(dev); - struct drm_device *ddev = rdev->ddev; + struct drm_device *ddev = rdev_to_drm(rdev); u32 sclk = 0; /* Can't get clock frequency when the card is off */ @@ -752,7 +752,7 @@ static ssize_t radeon_hwmon_show_vddc(struct device *dev, struct device_attribute *attr, char *buf) { struct radeon_device *rdev = dev_get_drvdata(dev); - struct drm_device *ddev = rdev->ddev; + struct drm_device *ddev = rdev_to_drm(rdev); u16 vddc = 0; /* Can't get vddc when the card is off */ @@ -1713,7 +1713,7 @@ void radeon_pm_fini(struct radeon_device *rdev) static void radeon_pm_compute_clocks_old(struct radeon_device *rdev) { - struct drm_device *ddev = rdev->ddev; + struct drm_device *ddev = rdev_to_drm(rdev); struct drm_crtc *crtc; struct radeon_crtc *radeon_crtc; @@ -1786,7 +1786,7 @@ static void radeon_pm_compute_clocks_old(struct radeon_device *rdev) static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev) { - struct drm_device *ddev = rdev->ddev; + struct drm_device *ddev = rdev_to_drm(rdev); struct drm_crtc *crtc; struct radeon_crtc *radeon_crtc; struct radeon_connector *radeon_connector; @@ -1847,7 +1847,7 @@ static bool radeon_pm_in_vbl(struct radeon_device *rdev) */ for (crtc = 0; (crtc < rdev->num_crtc) && in_vbl; crtc++) { if (rdev->pm.active_crtcs & (1 << crtc)) { - vbl_status = radeon_get_crtc_scanoutpos(rdev->ddev, + vbl_status = radeon_get_crtc_scanoutpos(rdev_to_drm(rdev), crtc, USE_REAL_VBLANKSTART, &vpos, &hpos, NULL, NULL, @@ -1939,7 +1939,7 @@ static void radeon_dynpm_idle_work_handler(struct work_struct *work) static int radeon_debugfs_pm_info_show(struct seq_file *m, void *unused) { struct radeon_device *rdev = m->private; - struct drm_device *ddev = rdev->ddev; + struct drm_device *ddev = rdev_to_drm(rdev); if ((rdev->flags & RADEON_IS_PX) && (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) { @@ -1976,7 +1976,7 @@ DEFINE_SHOW_ATTRIBUTE(radeon_debugfs_pm_info); static void radeon_debugfs_pm_init(struct radeon_device *rdev) { #if defined(CONFIG_DEBUG_FS) - struct dentry *root = rdev->ddev->primary->debugfs_root; + struct dentry *root = rdev_to_drm(rdev)->primary->debugfs_root; debugfs_create_file("radeon_pm_info", 0444, root, rdev, &radeon_debugfs_pm_info_fops); diff --git a/sys/dev/pci/drm/radeon/radeon_ring.c b/sys/dev/pci/drm/radeon/radeon_ring.c index e6534fa9f..8626171e9 100644 --- a/sys/dev/pci/drm/radeon/radeon_ring.c +++ b/sys/dev/pci/drm/radeon/radeon_ring.c @@ -548,7 +548,7 @@ static void radeon_debugfs_ring_init(struct radeon_device *rdev, struct radeon_r { #if defined(CONFIG_DEBUG_FS) const char *ring_name = radeon_debugfs_ring_idx_to_name(ring->idx); - struct dentry *root = rdev->ddev->primary->debugfs_root; + struct dentry *root = rdev_to_drm(rdev)->primary->debugfs_root; if (ring_name) debugfs_create_file(ring_name, 0444, root, ring, diff --git a/sys/dev/pci/drm/radeon/radeon_ttm.c b/sys/dev/pci/drm/radeon/radeon_ttm.c index 4bb440e9e..477bb0a20 100644 --- a/sys/dev/pci/drm/radeon/radeon_ttm.c +++ b/sys/dev/pci/drm/radeon/radeon_ttm.c @@ -716,8 +716,8 @@ int radeon_ttm_init(struct radeon_device *rdev) /* No others user of address space so set it to 0 */ #ifdef notyet r = ttm_device_init(&rdev->mman.bdev, &radeon_bo_driver, rdev->dev, - rdev->ddev->anon_inode->i_mapping, - rdev->ddev->vma_offset_manager, + rdev_to_drm(rdev)->anon_inode->i_mapping, + rdev_to_drm(rdev)->vma_offset_manager, rdev->need_swiotlb, dma_addressing_limited(&rdev->pdev->dev)); #else @@ -940,7 +940,7 @@ static const struct file_operations radeon_ttm_gtt_fops = { static void radeon_ttm_debugfs_init(struct radeon_device *rdev) { #if defined(CONFIG_DEBUG_FS) - struct drm_minor *minor = rdev->ddev->primary; + struct drm_minor *minor = rdev_to_drm(rdev)->primary; struct dentry *root = minor->debugfs_root; debugfs_create_file("radeon_vram", 0444, root, rdev, diff --git a/sys/dev/pci/drm/radeon/rs400.c b/sys/dev/pci/drm/radeon/rs400.c index cccaa2ecc..f702bf4d9 100644 --- a/sys/dev/pci/drm/radeon/rs400.c +++ b/sys/dev/pci/drm/radeon/rs400.c @@ -378,7 +378,7 @@ DEFINE_SHOW_ATTRIBUTE(rs400_debugfs_gart_info); static void rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev) { #if defined(CONFIG_DEBUG_FS) - struct dentry *root = rdev->ddev->primary->debugfs_root; + struct dentry *root = rdev_to_drm(rdev)->primary->debugfs_root; debugfs_create_file("rs400_gart_info", 0444, root, rdev, &rs400_debugfs_gart_info_fops); @@ -473,7 +473,7 @@ int rs400_resume(struct radeon_device *rdev) RREG32(R_0007C0_CP_STAT)); } /* post */ - radeon_combios_asic_init(rdev->ddev); + radeon_combios_asic_init(rdev_to_drm(rdev)); /* Resume clock after posting */ r300_clock_startup(rdev); /* Initialize surface registers */ @@ -551,7 +551,7 @@ int rs400_init(struct radeon_device *rdev) return -EINVAL; /* Initialize clocks */ - radeon_get_clock_info(rdev->ddev); + radeon_get_clock_info(rdev_to_drm(rdev)); /* initialize memory controller */ rs400_mc_init(rdev); /* Fence driver */ diff --git a/sys/dev/pci/drm/radeon/rs600.c b/sys/dev/pci/drm/radeon/rs600.c index 7c7d0f195..da44d2052 100644 --- a/sys/dev/pci/drm/radeon/rs600.c +++ b/sys/dev/pci/drm/radeon/rs600.c @@ -322,7 +322,7 @@ void rs600_pm_misc(struct radeon_device *rdev) void rs600_pm_prepare(struct radeon_device *rdev) { - struct drm_device *ddev = rdev->ddev; + struct drm_device *ddev = rdev_to_drm(rdev); struct drm_crtc *crtc; struct radeon_crtc *radeon_crtc; u32 tmp; @@ -340,7 +340,7 @@ void rs600_pm_prepare(struct radeon_device *rdev) void rs600_pm_finish(struct radeon_device *rdev) { - struct drm_device *ddev = rdev->ddev; + struct drm_device *ddev = rdev_to_drm(rdev); struct drm_crtc *crtc; struct radeon_crtc *radeon_crtc; u32 tmp; @@ -409,7 +409,7 @@ void rs600_hpd_set_polarity(struct radeon_device *rdev, void rs600_hpd_init(struct radeon_device *rdev) { - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); struct drm_connector *connector; unsigned enable = 0; @@ -436,7 +436,7 @@ void rs600_hpd_init(struct radeon_device *rdev) void rs600_hpd_fini(struct radeon_device *rdev) { - struct drm_device *dev = rdev->ddev; + struct drm_device *dev = rdev_to_drm(rdev); struct drm_connector *connector; unsigned disable = 0; @@ -798,7 +798,7 @@ int rs600_irq_process(struct radeon_device *rdev) /* Vertical blank interrupts */ if (G_007EDC_LB_D1_VBLANK_INTERRUPT(rdev->irq.stat_regs.r500.disp_int)) { if (rdev->irq.crtc_vblank_int[0]) { - drm_handle_vblank(rdev->ddev, 0); + drm_handle_vblank(rdev_to_drm(rdev), 0); rdev->pm.vblank_sync = true; wake_up(&rdev->irq.vblank_queue); } @@ -807,7 +807,7 @@ int rs600_irq_process(struct radeon_device *rdev) } if (G_007EDC_LB_D2_VBLANK_INTERRUPT(rdev->irq.stat_regs.r500.disp_int)) { if (rdev->irq.crtc_vblank_int[1]) { - drm_handle_vblank(rdev->ddev, 1); + drm_handle_vblank(rdev_to_drm(rdev), 1); rdev->pm.vblank_sync = true; wake_up(&rdev->irq.vblank_queue); } @@ -1134,7 +1134,7 @@ int rs600_init(struct radeon_device *rdev) return -EINVAL; /* Initialize clocks */ - radeon_get_clock_info(rdev->ddev); + radeon_get_clock_info(rdev_to_drm(rdev)); /* initialize memory controller */ rs600_mc_init(rdev); r100_debugfs_rbbm_init(rdev); diff --git a/sys/dev/pci/drm/radeon/rs690.c b/sys/dev/pci/drm/radeon/rs690.c index 616498d24..a95607627 100644 --- a/sys/dev/pci/drm/radeon/rs690.c +++ b/sys/dev/pci/drm/radeon/rs690.c @@ -845,7 +845,7 @@ int rs690_init(struct radeon_device *rdev) return -EINVAL; /* Initialize clocks */ - radeon_get_clock_info(rdev->ddev); + radeon_get_clock_info(rdev_to_drm(rdev)); /* initialize memory controller */ rs690_mc_init(rdev); rv515_debugfs(rdev); diff --git a/sys/dev/pci/drm/radeon/rv515.c b/sys/dev/pci/drm/radeon/rv515.c index 76260fdfb..19a26d85e 100644 --- a/sys/dev/pci/drm/radeon/rv515.c +++ b/sys/dev/pci/drm/radeon/rv515.c @@ -255,7 +255,7 @@ DEFINE_SHOW_ATTRIBUTE(rv515_debugfs_ga_info); void rv515_debugfs(struct radeon_device *rdev) { #if defined(CONFIG_DEBUG_FS) - struct dentry *root = rdev->ddev->primary->debugfs_root; + struct dentry *root = rdev_to_drm(rdev)->primary->debugfs_root; debugfs_create_file("rv515_pipes_info", 0444, root, rdev, &rv515_debugfs_pipes_info_fops); @@ -636,7 +636,7 @@ int rv515_init(struct radeon_device *rdev) if (radeon_boot_test_post_card(rdev) == false) return -EINVAL; /* Initialize clocks */ - radeon_get_clock_info(rdev->ddev); + radeon_get_clock_info(rdev_to_drm(rdev)); /* initialize AGP */ if (rdev->flags & RADEON_IS_AGP) { r = radeon_agp_init(rdev); diff --git a/sys/dev/pci/drm/radeon/rv770.c b/sys/dev/pci/drm/radeon/rv770.c index c8ff91d14..a46b354ea 100644 --- a/sys/dev/pci/drm/radeon/rv770.c +++ b/sys/dev/pci/drm/radeon/rv770.c @@ -1935,7 +1935,7 @@ int rv770_init(struct radeon_device *rdev) /* Initialize surface registers */ radeon_surface_init(rdev); /* Initialize clocks */ - radeon_get_clock_info(rdev->ddev); + radeon_get_clock_info(rdev_to_drm(rdev)); /* Fence driver */ radeon_fence_driver_init(rdev); /* initialize AGP */ diff --git a/sys/dev/pci/drm/radeon/si.c b/sys/dev/pci/drm/radeon/si.c index e542f2227..9cdfce6e2 100644 --- a/sys/dev/pci/drm/radeon/si.c +++ b/sys/dev/pci/drm/radeon/si.c @@ -6298,7 +6298,7 @@ restart_ih: event_name = "vblank"; if (rdev->irq.crtc_vblank_int[crtc_idx]) { - drm_handle_vblank(rdev->ddev, crtc_idx); + drm_handle_vblank(rdev_to_drm(rdev), crtc_idx); rdev->pm.vblank_sync = true; wake_up(&rdev->irq.vblank_queue); } @@ -6860,7 +6860,7 @@ int si_init(struct radeon_device *rdev) /* Initialize surface registers */ radeon_surface_init(rdev); /* Initialize clocks */ - radeon_get_clock_info(rdev->ddev); + radeon_get_clock_info(rdev_to_drm(rdev)); /* Fence driver */ radeon_fence_driver_init(rdev); diff --git a/sys/dev/pci/drm/scheduler/sched_main.c b/sys/dev/pci/drm/scheduler/sched_main.c index fa2a4b3fe..1c463debb 100644 --- a/sys/dev/pci/drm/scheduler/sched_main.c +++ b/sys/dev/pci/drm/scheduler/sched_main.c @@ -641,6 +641,14 @@ int drm_sched_job_init(struct drm_sched_job *job, if (!entity->rq) return -ENOENT; + /* + * We don't know for sure how the user has allocated. Thus, zero the + * struct so that unallowed (i.e., too early) usage of pointers that + * this function does not set is guaranteed to lead to a NULL pointer + * exception instead of UB. + */ + memset(job, 0, sizeof(*job)); + job->entity = entity; job->s_fence = drm_sched_fence_alloc(entity, owner); if (!job->s_fence) diff --git a/sys/dev/pci/drm/ttm/ttm_bo_vm.c b/sys/dev/pci/drm/ttm/ttm_bo_vm.c index 23bd4ceaa..45ad72032 100644 --- a/sys/dev/pci/drm/ttm/ttm_bo_vm.c +++ b/sys/dev/pci/drm/ttm/ttm_bo_vm.c @@ -598,37 +598,23 @@ ttm_bo_vm_fault(struct uvm_faultinfo *ufi, vaddr_t vaddr, vm_page_t *pps, ret = ttm_bo_vm_reserve(bo); if (ret) { - switch (ret) { - case VM_FAULT_NOPAGE: - ret = VM_PAGER_OK; - break; - case VM_FAULT_RETRY: - ret = VM_PAGER_REFAULT; - break; - default: - ret = VM_PAGER_BAD; - break; - } - - uvmfault_unlockall(ufi, NULL, uobj); - return ret; + goto out; } ret = ttm_bo_vm_fault_reserved(ufi, vaddr, TTM_BO_VM_NUM_PREFAULT, 1); + dma_resv_unlock(bo->base.resv); +out: switch (ret) { case VM_FAULT_NOPAGE: - ret = VM_PAGER_OK; + ret = 0; break; case VM_FAULT_RETRY: - ret = VM_PAGER_REFAULT; + ret = ERESTART; break; default: - ret = VM_PAGER_BAD; + ret = EACCES; break; } - - dma_resv_unlock(bo->base.resv); - uvmfault_unlockall(ufi, NULL, uobj); return ret; } diff --git a/sys/dev/pci/esareg.h b/sys/dev/pci/esareg.h index 18a5bb60e..096740be8 100644 --- a/sys/dev/pci/esareg.h +++ b/sys/dev/pci/esareg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: esareg.h,v 1.2 2012/10/18 21:44:21 deraadt Exp $ */ +/* $OpenBSD: esareg.h,v 1.3 2024/10/23 00:53:28 jsg Exp $ */ /* $NetBSD: esareg.h,v 1.8 2002/03/06 18:30:31 jmcneill Exp $ */ /* @@ -583,7 +583,6 @@ #define ESA_MINISRC_IN_BUFFER_SIZE (0x50 * 2) #define ESA_MINISRC_OUT_BUFFER_SIZE (0x50 * 2 * 2) -#define ESA_MINISRC_OUT_BUFFER_SIZE (0x50 * 2 * 2) #define ESA_MINISRC_TMP_BUFFER_SIZE (112 + (ESA_MINISRC_BIQUAD_STAGE * 3 + 4) * 2 * 2) #define ESA_MINISRC_BIQUAD_STAGE 2 #define ESA_MINISRC_COEF_LOC 0x175 diff --git a/sys/dev/pci/esavar.h b/sys/dev/pci/esavar.h index 14e7204f1..1b189470c 100644 --- a/sys/dev/pci/esavar.h +++ b/sys/dev/pci/esavar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: esavar.h,v 1.2 2010/09/07 16:21:44 deraadt Exp $ */ +/* $OpenBSD: esavar.h,v 1.3 2024/10/22 21:50:02 jsg Exp $ */ /* $NetBSD: esavar.h,v 1.4 2002/03/16 14:34:01 jmcneill Exp $ */ /* @@ -96,8 +96,7 @@ struct esa_voice { int index; /* 0: play, 1: record */ }; -struct esa_softc -{ +struct esa_softc { struct device sc_dev; bus_space_tag_t sc_iot; bus_space_handle_t sc_ioh; diff --git a/sys/dev/pci/files.pci b/sys/dev/pci/files.pci index 76cecece3..8d68dbe31 100644 --- a/sys/dev/pci/files.pci +++ b/sys/dev/pci/files.pci @@ -1,4 +1,4 @@ -# $OpenBSD: files.pci,v 1.366 2024/08/14 14:40:46 patrick Exp $ +# $OpenBSD: files.pci,v 1.369 2024/11/08 12:17:07 stsp Exp $ # $NetBSD: files.pci,v 1.20 1996/09/24 17:47:15 christos Exp $ # # Config file and device description for machine-independent PCI code. @@ -350,13 +350,19 @@ file dev/pci/ixgb_hw.c ixgb # Intel 82598 10GbE device ix: ether, ifnet, ifmedia, intrmap, stoeplitz attach ix at pci -file dev/pci/if_ix.c ix -file dev/pci/ixgbe.c ix -file dev/pci/ixgbe_82598.c ix -file dev/pci/ixgbe_82599.c ix -file dev/pci/ixgbe_x540.c ix -file dev/pci/ixgbe_x550.c ix -file dev/pci/ixgbe_phy.c ix +file dev/pci/if_ix.c ix | ixv +file dev/pci/ixgbe.c ix | ixv +file dev/pci/ixgbe_82598.c ix | ixv +file dev/pci/ixgbe_82599.c ix | ixv +file dev/pci/ixgbe_x540.c ix | ixv +file dev/pci/ixgbe_x550.c ix | ixv +file dev/pci/ixgbe_phy.c ix | ixv + +# Virtual Function of i82599. +device ixv: ether, ifnet, ifmedia, intrmap, stoeplitz +attach ixv at pci +file dev/pci/if_ixv.c ixv +file dev/pci/ixgbe_vf.c ixv # Intel Ethernet 700 Series device ixl: ether, ifnet, ifmedia, intrmap, stoeplitz @@ -367,6 +373,11 @@ file dev/pci/if_ixl.c ixl attach dwqe at pci with dwqe_pci file dev/pci/if_dwqe_pci.c dwqe_pci +# Intel E810 100GbE +device ice: ether, ifnet, ifmedia, intrmap, stoeplitz +attach ice at pci with ice +file dev/pci/if_ice.c ice + # Neterion Xframe 10 Gigabit ethernet device xge: ether, ifnet, ifmedia attach xge at pci @@ -830,6 +841,7 @@ file dev/pci/if_bwfm_pci.c bwfm_pci # AMD Cryptographic Co-processor attach ccp at pci with ccp_pci file dev/pci/ccp_pci.c ccp_pci +file dev/pci/psp_pci.c psp # Broadcom NetXtreme-C/E device bnxt: ether, ifnet, ifmedia, intrmap, stoeplitz diff --git a/sys/dev/pci/if_de.c b/sys/dev/pci/if_de.c index 83151d460..84fb23041 100644 --- a/sys/dev/pci/if_de.c +++ b/sys/dev/pci/if_de.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_de.c,v 1.143 2024/05/24 06:02:53 jsg Exp $ */ +/* $OpenBSD: if_de.c,v 1.144 2024/11/20 02:26:53 dlg Exp $ */ /* $NetBSD: if_de.c,v 1.58 1998/01/12 09:39:58 thorpej Exp $ */ /*- @@ -3728,6 +3728,8 @@ tulip_txput(tulip_softc_t * const sc, struct mbuf *m, int notonqueue) u_int32_t d_status; bus_dmamap_t map; struct ifnet *ifp = &sc->tulip_if; + void (*set_oactive)(struct ifqueue *) = + notonqueue ? ifq_set_oactive : ifq_deq_set_oactive; #if defined(TULIP_DEBUG) if ((sc->tulip_cmdmode & TULIP_CMD_TXRUN) == 0) { @@ -3846,8 +3848,10 @@ tulip_txput(tulip_softc_t * const sc, struct mbuf *m, int notonqueue) * The descriptors have been filled in. Now get ready * to transmit. */ - if (!notonqueue) + if (!notonqueue) { ifq_deq_commit(&ifp->if_snd, m); + set_oactive = ifq_set_oactive; + } TULIP_SETCTX(m, map); map = NULL; @@ -3897,7 +3901,7 @@ tulip_txput(tulip_softc_t * const sc, struct mbuf *m, int notonqueue) if (sc->tulip_flags & TULIP_TXPROBE_ACTIVE) { TULIP_CSR_WRITE(sc, csr_txpoll, 1); - ifq_set_oactive(&sc->tulip_if.if_snd); + (*set_oactive)(&sc->tulip_if.if_snd); TULIP_PERFEND(txput); return (NULL); } @@ -3926,7 +3930,7 @@ tulip_txput(tulip_softc_t * const sc, struct mbuf *m, int notonqueue) sc->tulip_dbg.dbg_txput_finishes[6]++; #endif if (sc->tulip_flags & (TULIP_WANTTXSTART|TULIP_DOINGSETUP)) { - ifq_set_oactive(&sc->tulip_if.if_snd); + (*set_oactive)(&sc->tulip_if.if_snd); if ((sc->tulip_intrmask & TULIP_STS_TXINTR) == 0) { sc->tulip_intrmask |= TULIP_STS_TXINTR; TULIP_CSR_WRITE(sc, csr_intr, sc->tulip_intrmask); diff --git a/sys/dev/pci/if_em_hw.h b/sys/dev/pci/if_em_hw.h index 8ee929af9..871c45c36 100644 --- a/sys/dev/pci/if_em_hw.h +++ b/sys/dev/pci/if_em_hw.h @@ -31,7 +31,7 @@ *******************************************************************************/ -/* $OpenBSD: if_em_hw.h,v 1.97 2024/09/04 07:54:52 mglocker Exp $ */ +/* $OpenBSD: if_em_hw.h,v 1.98 2024/10/22 05:11:14 jsg Exp $ */ /* $FreeBSD: if_em_hw.h,v 1.15 2005/05/26 23:32:02 tackerman Exp $ */ /* if_em_hw.h @@ -608,8 +608,6 @@ uint32_t em_translate_82542_register(uint32_t); #define E1000_DEV_ID_82583V 0x150C #define E1000_DEV_ID_82576_NS_SERDES 0x1518 #define E1000_DEV_ID_82576_SERDES_QUAD 0x150D -#define E1000_DEV_ID_PCH2_LV_LM 0x1502 -#define E1000_DEV_ID_PCH2_LV_V 0x1503 #define E1000_DEV_ID_82580_COPPER 0x150E #define E1000_DEV_ID_82580_FIBER 0x150F #define E1000_DEV_ID_82580_SERDES 0x1510 diff --git a/sys/dev/pci/if_em_osdep.h b/sys/dev/pci/if_em_osdep.h index 87bd6fbd8..a22c046c5 100644 --- a/sys/dev/pci/if_em_osdep.h +++ b/sys/dev/pci/if_em_osdep.h @@ -31,7 +31,7 @@ POSSIBILITY OF SUCH DAMAGE. ***************************************************************************/ -/* $OpenBSD: if_em_osdep.h,v 1.14 2020/02/04 10:59:23 mpi Exp $ */ +/* $OpenBSD: if_em_osdep.h,v 1.15 2024/10/22 21:50:02 jsg Exp $ */ /* $FreeBSD: if_em_osdep.h,v 1.11 2003/05/02 21:17:08 pdeuskar Exp $ */ #ifndef _EM_OPENBSD_OS_H_ @@ -60,8 +60,7 @@ POSSIBILITY OF SUCH DAMAGE. #define CMD_MEM_WRT_INVALIDATE 0x0010 /* BIT_4 */ -struct em_osdep -{ +struct em_osdep { bus_space_tag_t mem_bus_space_tag; bus_space_handle_t mem_bus_space_handle; bus_space_tag_t io_bus_space_tag; diff --git a/sys/dev/pci/if_etreg.h b/sys/dev/pci/if_etreg.h index c9602488c..76f8372fd 100644 --- a/sys/dev/pci/if_etreg.h +++ b/sys/dev/pci/if_etreg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: if_etreg.h,v 1.6 2022/01/09 05:42:50 jsg Exp $ */ +/* $OpenBSD: if_etreg.h,v 1.7 2024/10/23 01:35:43 jsg Exp $ */ /* * Copyright (c) 2007 The DragonFly Project. All rights reserved. @@ -255,7 +255,6 @@ #define ET_MAC_HDX 0x500c #define ET_MAC_HDX_COLLWIN 0x0003ff #define ET_MAC_HDX_REXMIT_MAX 0x00f000 -#define ET_MAC_HDX_REXMIT_MAX 0x00f000 #define ET_MAC_HDX_EXC_DEFER (1 << 16) #define ET_MAC_HDX_NOBACKOFF (1 << 17) #define ET_MAC_HDX_BP_NOBACKOFF (1 << 18) diff --git a/sys/dev/pci/if_iavf.c b/sys/dev/pci/if_iavf.c index e8b17cee3..aa8b4275d 100644 --- a/sys/dev/pci/if_iavf.c +++ b/sys/dev/pci/if_iavf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_iavf.c,v 1.17 2024/07/10 09:50:28 jmatthew Exp $ */ +/* $OpenBSD: if_iavf.c,v 1.18 2024/11/27 02:40:53 yasuoka Exp $ */ /* * Copyright (c) 2013-2015, Intel Corporation @@ -49,6 +49,7 @@ */ #include "bpfilter.h" +#include "vlan.h" #include #include @@ -75,6 +76,7 @@ #include #include +#include #include #include @@ -890,11 +892,13 @@ iavf_attach(struct device *parent, struct device *self, void *aux) strlcpy(ifp->if_xname, DEVNAME(sc), IFNAMSIZ); ifq_init_maxlen(&ifp->if_snd, sc->sc_tx_ring_ndescs); - ifp->if_capabilities = IFCAP_VLAN_MTU | IFCAP_VLAN_HWTAGGING; -#if 0 - ifp->if_capabilities |= IFCAP_CSUM_IPv4 | IFCAP_CSUM_TCPv4 | - IFCAP_CSUM_UDPv4; + ifp->if_capabilities = IFCAP_VLAN_MTU; +#if NVLAN > 0 + ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING; #endif + ifp->if_capabilities |= IFCAP_CSUM_IPv4 | + IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4 | + IFCAP_CSUM_TCPv6 | IFCAP_CSUM_UDPv6; ifmedia_init(&sc->sc_media, 0, iavf_media_change, iavf_media_status); @@ -1656,6 +1660,57 @@ iavf_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, struct mbuf *m) BUS_DMA_STREAMING | BUS_DMA_NOWAIT)); } +static uint64_t +iavf_tx_offload(struct mbuf *m) +{ + struct ether_extracted ext; + uint64_t hlen; + uint64_t offload = 0; + +#if NVLAN > 0 + if (ISSET(m->m_flags, M_VLANTAG)) { + uint64_t vtag = m->m_pkthdr.ether_vtag; + offload |= IAVF_TX_DESC_CMD_IL2TAG1; + offload |= vtag << IAVF_TX_DESC_L2TAG1_SHIFT; + } +#endif + + if (!ISSET(m->m_pkthdr.csum_flags, + M_IPV4_CSUM_OUT|M_TCP_CSUM_OUT|M_UDP_CSUM_OUT)) + return (offload); + + ether_extract_headers(m, &ext); + + if (ext.ip4) { + offload |= ISSET(m->m_pkthdr.csum_flags, M_IPV4_CSUM_OUT) ? + IAVF_TX_DESC_CMD_IIPT_IPV4_CSUM : + IAVF_TX_DESC_CMD_IIPT_IPV4; +#ifdef INET6 + } else if (ext.ip6) { + offload |= IAVF_TX_DESC_CMD_IIPT_IPV6; +#endif + } else { + panic("CSUM_OUT set for non-IP packet"); + /* NOTREACHED */ + } + hlen = ext.iphlen; + + offload |= (ETHER_HDR_LEN >> 1) << IAVF_TX_DESC_MACLEN_SHIFT; + offload |= (hlen >> 2) << IAVF_TX_DESC_IPLEN_SHIFT; + + if (ext.tcp && ISSET(m->m_pkthdr.csum_flags, M_TCP_CSUM_OUT)) { + offload |= IAVF_TX_DESC_CMD_L4T_EOFT_TCP; + offload |= (uint64_t)(ext.tcphlen >> 2) + << IAVF_TX_DESC_L4LEN_SHIFT; + } else if (ext.udp && ISSET(m->m_pkthdr.csum_flags, M_UDP_CSUM_OUT)) { + offload |= IAVF_TX_DESC_CMD_L4T_EOFT_UDP; + offload |= (uint64_t)(sizeof(*ext.udp) >> 2) + << IAVF_TX_DESC_L4LEN_SHIFT; + } + + return offload; +} + static void iavf_start(struct ifqueue *ifq) { @@ -1667,7 +1722,7 @@ iavf_start(struct ifqueue *ifq) bus_dmamap_t map; struct mbuf *m; uint64_t cmd; - uint64_t vlan_cmd; + uint64_t offload; unsigned int prod, free, last, i; unsigned int mask; int post = 0; @@ -1702,6 +1757,8 @@ iavf_start(struct ifqueue *ifq) if (m == NULL) break; + offload = iavf_tx_offload(m); + txm = &txr->txr_maps[prod]; map = txm->txm_map; @@ -1714,20 +1771,13 @@ iavf_start(struct ifqueue *ifq) bus_dmamap_sync(sc->sc_dmat, map, 0, map->dm_mapsize, BUS_DMASYNC_PREWRITE); - vlan_cmd = 0; - if (m->m_flags & M_VLANTAG) { - vlan_cmd = IAVF_TX_DESC_CMD_IL2TAG1 | - (((uint64_t)m->m_pkthdr.ether_vtag) << - IAVF_TX_DESC_L2TAG1_SHIFT); - } - for (i = 0; i < map->dm_nsegs; i++) { txd = &ring[prod]; cmd = (uint64_t)map->dm_segs[i].ds_len << IAVF_TX_DESC_BSIZE_SHIFT; - cmd |= IAVF_TX_DESC_DTYPE_DATA | IAVF_TX_DESC_CMD_ICRC | - vlan_cmd; + cmd |= IAVF_TX_DESC_DTYPE_DATA | IAVF_TX_DESC_CMD_ICRC; + cmd |= offload; htolem64(&txd->addr, map->dm_segs[i].ds_addr); htolem64(&txd->cmd, cmd); @@ -1938,6 +1988,24 @@ iavf_rxr_free(struct iavf_softc *sc, struct iavf_rx_ring *rxr) free(rxr, M_DEVBUF, sizeof(*rxr)); } +static void +iavf_rx_checksum(struct mbuf *m, uint64_t word) +{ + if (!ISSET(word, IAVF_RX_DESC_L3L4P)) + return; + + if (ISSET(word, IAVF_RX_DESC_IPE)) + return; + + m->m_pkthdr.csum_flags |= M_IPV4_CSUM_IN_OK; + + if (ISSET(word, IAVF_RX_DESC_L4E)) + return; + + m->m_pkthdr.csum_flags |= M_TCP_CSUM_IN_OK | M_UDP_CSUM_IN_OK; +} + + static int iavf_rxeof(struct iavf_softc *sc, struct ifiqueue *ifiq) { @@ -2002,6 +2070,7 @@ iavf_rxeof(struct iavf_softc *sc, struct ifiqueue *ifiq) m->m_pkthdr.len += len; if (ISSET(word, IAVF_RX_DESC_EOP)) { +#if NVLAN > 0 if (ISSET(word, IAVF_RX_DESC_L2TAG1P)) { vlan = (lemtoh64(&rxd->qword0) & IAVF_RX_DESC_L2TAG1_MASK) @@ -2009,8 +2078,10 @@ iavf_rxeof(struct iavf_softc *sc, struct ifiqueue *ifiq) m->m_pkthdr.ether_vtag = vlan; m->m_flags |= M_VLANTAG; } +#endif if (!ISSET(word, IAVF_RX_DESC_RXE | IAVF_RX_DESC_OVERSIZE)) { + iavf_rx_checksum(m, word); ml_enqueue(&ml, m); } else { ifp->if_ierrors++; /* XXX */ diff --git a/sys/dev/pci/if_ice.c b/sys/dev/pci/if_ice.c new file mode 100644 index 000000000..06a93c80c --- /dev/null +++ b/sys/dev/pci/if_ice.c @@ -0,0 +1,27632 @@ +/* $OpenBSD: if_ice.c,v 1.28 2024/12/17 05:32:31 stsp Exp $ */ + +/* Copyright (c) 2024, Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Ported from FreeBSD ice(4) and OpenBSD ixl(4) by Stefan Sperling in 2024. + * + * Copyright (c) 2016,2017 David Gwynne + * Copyright (c) 2024 Stefan Sperling + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "bpfilter.h" +#include "vlan.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#if NBPFILTER > 0 +#include +#endif +#include +#include +#include +#include + +#include +#include + +#define STRUCT_HACK_VAR_LEN + +/** + * ice_struct_size - size of struct with C99 flexible array member + * @ptr: pointer to structure + * @field: flexible array member (last member of the structure) + * @num: number of elements of that flexible array member + */ +#define ice_struct_size(ptr, field, num) \ + (sizeof(*(ptr)) + sizeof(*(ptr)->field) * (num)) + +#define FLEX_ARRAY_SIZE(_ptr, _mem, cnt) ((cnt) * sizeof(_ptr->_mem[0])) + +#include "if_icereg.h" +#include "if_icevar.h" + +/** + * @var ice_driver_version + * @brief driver version string + * + * Driver version information, used as part of the driver information + * sent to the firmware at load. + * + * @var ice_major_version + * @brief driver major version number + * + * @var ice_minor_version + * @brief driver minor version number + * + * @var ice_patch_version + * @brief driver patch version number + * + * @var ice_rc_version + * @brief driver release candidate version number + */ +const char ice_driver_version[] = "1.39.13-k"; +const uint8_t ice_major_version = 1; +const uint8_t ice_minor_version = 39; +const uint8_t ice_patch_version = 13; +const uint8_t ice_rc_version = 0; + +typedef void *ice_match_t; + +static const struct pci_matchid ice_devices[] = { + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_E810_XXV_SFP }, +#if 0 /* no hardware available for testing: */ + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_E810_XXV_QSFP }, +#endif +}; + +int +ice_match(struct device *parent, ice_match_t match __unused, void *aux) +{ + struct pci_attach_args *pa = aux; + return pci_matchbyid(pa, ice_devices, nitems(ice_devices)); +} + +#ifdef ICE_DEBUG +#define DPRINTF(x...) do { if (ice_debug) printf(x); } while(0) +#define DNPRINTF(n,x...) do { if (ice_debug & n) printf(x); } while(0) +#define ICE_DBG_TRACE (1UL << 0) /* for function-trace only */ +#define ICE_DBG_INIT (1UL << 1) +#define ICE_DBG_RELEASE (1UL << 2) +#define ICE_DBG_FW_LOG (1UL << 3) +#define ICE_DBG_LINK (1UL << 4) +#define ICE_DBG_PHY (1UL << 5) +#define ICE_DBG_QCTX (1UL << 6) +#define ICE_DBG_NVM (1UL << 7) +#define ICE_DBG_LAN (1UL << 8) +#define ICE_DBG_FLOW (1UL << 9) +#define ICE_DBG_DCB (1UL << 10) +#define ICE_DBG_DIAG (1UL << 11) +#define ICE_DBG_FD (1UL << 12) +#define ICE_DBG_SW (1UL << 13) +#define ICE_DBG_SCHED (1UL << 14) +#define ICE_DBG_RDMA (1UL << 15) +#define ICE_DBG_PKG (1UL << 16) +#define ICE_DBG_RES (1UL << 17) +#define ICE_DBG_AQ_MSG (1UL << 24) +#define ICE_DBG_AQ_DESC (1UL << 25) +#define ICE_DBG_AQ_DESC_BUF (1UL << 26) +#define ICE_DBG_AQ_CMD (1UL << 27) +#define ICE_DBG_AQ (ICE_DBG_AQ_MSG | \ + ICE_DBG_AQ_DESC | \ + ICE_DBG_AQ_DESC_BUF | \ + ICE_DBG_AQ_CMD) +#define ICE_DBG_PARSER (1UL << 28) +#define ICE_DBG_USER (1UL << 31) +uint32_t ice_debug = 0xffffffff & ~(ICE_DBG_AQ); +#else +#define DPRINTF(x...) +#define DNPRINTF(n,x...) +#endif + +#define ICE_READ(hw, reg) \ + bus_space_read_4((hw)->hw_sc->sc_st, (hw)->hw_sc->sc_sh, (reg)) + +#define ICE_READ_8(hw, reg) \ + bus_space_read_8((hw)->hw_sc->sc_st, (hw)->hw_sc->sc_sh, (reg)) + +#define ICE_WRITE(hw, reg, val) \ + bus_space_write_4((hw)->hw_sc->sc_st, (hw)->hw_sc->sc_sh, (reg), (val)) + +#define ice_flush(_hw) ICE_READ((_hw), GLGEN_STAT) + +/* Data type manipulation macros. */ +#define ICE_HI_DWORD(x) ((uint32_t)((((x) >> 16) >> 16) & 0xFFFFFFFF)) +#define ICE_LO_DWORD(x) ((uint32_t)((x) & 0xFFFFFFFF)) +#define ICE_HI_WORD(x) ((uint16_t)(((x) >> 16) & 0xFFFF)) +#define ICE_LO_WORD(x) ((uint16_t)((x) & 0xFFFF)) +#define ICE_HI_BYTE(x) ((uint8_t)(((x) >> 8) & 0xFF)) +#define ICE_LO_BYTE(x) ((uint8_t)((x) & 0xFF)) + +uint16_t ice_lock_count; + +/** + * @enum feat_list + * @brief driver feature enumeration + * + * Enumeration of possible device driver features that can be enabled or + * disabled. Each possible value represents a different feature which can be + * enabled or disabled. + * + * The driver stores a bitmap of the features that the device and OS are + * capable of, as well as another bitmap indicating which features are + * currently enabled for that device. + */ +enum feat_list { + ICE_FEATURE_SRIOV, + ICE_FEATURE_RSS, + ICE_FEATURE_NETMAP, + ICE_FEATURE_FDIR, + ICE_FEATURE_MSI, + ICE_FEATURE_MSIX, + ICE_FEATURE_RDMA, + ICE_FEATURE_SAFE_MODE, + ICE_FEATURE_LENIENT_LINK_MODE, + ICE_FEATURE_LINK_MGMT_VER_1, + ICE_FEATURE_LINK_MGMT_VER_2, + ICE_FEATURE_HEALTH_STATUS, + ICE_FEATURE_FW_LOGGING, + ICE_FEATURE_HAS_PBA, + ICE_FEATURE_DCB, + ICE_FEATURE_TX_BALANCE, + ICE_FEATURE_DUAL_NAC, + ICE_FEATURE_TEMP_SENSOR, + /* Must be last entry */ + ICE_FEATURE_COUNT +}; + +struct ice_intr_vector { + struct ice_softc *iv_sc; + struct ice_rx_queue *iv_rxq; + struct ice_tx_queue *iv_txq; + int iv_qid; + void *iv_ihc; + char iv_name[16]; + pci_intr_handle_t ih; +}; + +#define ICE_MAX_VECTORS 8 /* XXX this is pretty arbitrary */ + +struct ice_softc { + struct device sc_dev; + struct arpcom sc_ac; + struct ifmedia media; + + bus_space_tag_t sc_st; + bus_space_handle_t sc_sh; + bus_size_t sc_sz; + bus_dma_tag_t sc_dmat; + pci_product_id_t sc_pid; + pci_chipset_tag_t sc_pct; + pcitag_t sc_pcitag; + + pci_intr_handle_t sc_ih; + void *sc_ihc; + unsigned int sc_nmsix_max; + unsigned int sc_nmsix; + unsigned int sc_nqueues; + struct intrmap *sc_intrmap; + struct ice_intr_vector *sc_vectors; + size_t sc_nvectors; + + struct task sc_admin_task; + struct timeout sc_admin_timer; + + struct rwlock sc_cfg_lock; + unsigned int sc_dead; + + enum ice_state state; + struct ice_hw hw; + + struct ice_vsi pf_vsi; /* Main PF VSI */ + + /* Tri-state feature flags (capable/enabled) */ + ice_declare_bitmap(feat_cap, ICE_FEATURE_COUNT); + ice_declare_bitmap(feat_en, ICE_FEATURE_COUNT); + + struct ice_resmgr os_imgr; + + /* isc_* fields inherited from FreeBSD iflib struct if_softc_ctx */ + int isc_vectors; + int isc_nrxqsets; + int isc_ntxqsets; + int isc_msix_bar; + int isc_tx_nsegments; + int isc_ntxd[8]; + int isc_nrxd[8]; + uint32_t isc_txqsizes[8]; + uint32_t isc_rxqsizes[8]; + uint8_t isc_txd_size[8]; + uint8_t isc_rxd_size[8]; + int isc_tx_tso_segments_max; + int isc_tx_tso_size_max; + int isc_tx_tso_segsize_max; + int isc_tx_csum_flags; + int isc_capabilities; + int isc_capenable; + int isc_rss_table_size; + int isc_rss_table_mask; + int isc_nrxqsets_max; + int isc_ntxqsets_max; + uint16_t isc_rxd_buf_size[8]; /* set at init time by driver, 0 + means use iflib-calculated size + based on isc_max_frame_size */ + uint16_t isc_max_frame_size; /* set at init time by driver */ + uint16_t isc_min_frame_size; /* set at init time by driver, only used if + IFLIB_NEED_ETHER_PAD is set. */ + uint32_t isc_pause_frames; /* set by driver for iflib_timer to detect */ + int isc_disable_msix; + + /* Tx/Rx queue managers */ + struct ice_resmgr tx_qmgr; + struct ice_resmgr rx_qmgr; + + /* device statistics */ + struct ice_pf_hw_stats stats; + struct ice_pf_sw_stats soft_stats; + + struct ice_vsi **all_vsi; /* Array of VSI pointers */ + uint16_t num_available_vsi; /* Size of VSI array */ + + /* Interrupt allocation manager */ + struct ice_resmgr dev_imgr; + uint16_t *pf_imap; + int lan_vectors; + + /* NVM link override settings */ + struct ice_link_default_override_tlv ldo_tlv; + + bool link_up; + + int rebuild_ticks; + + int sw_intr[ICE_MAX_VECTORS]; +}; + +/** + * ice_driver_is_detaching - Check if the driver is detaching/unloading + * @sc: device private softc + * + * Returns true if the driver is detaching, false otherwise. + * + * @remark on newer kernels, take advantage of iflib_in_detach in order to + * report detachment correctly as early as possible. + * + * @remark this function is used by various code paths that want to avoid + * running if the driver is about to be removed. This includes sysctls and + * other driver access points. Note that it does not fully resolve + * detach-based race conditions as it is possible for a thread to race with + * iflib_in_detach. + */ +bool +ice_driver_is_detaching(struct ice_softc *sc) +{ + return (ice_test_state(&sc->state, ICE_STATE_DETACHING) || sc->sc_dead); +} + +/* + * ice_usec_delay - Delay for the specified number of microseconds + * @time: microseconds to delay + * @sleep: if true, sleep where possible + * + * If sleep is true, sleep so that another thread can execute. + * Otherwise, use DELAY to spin the thread instead. + */ +void +ice_usec_delay(uint32_t time, bool sleep) +{ + if (sleep && !cold) + tsleep_nsec(&sleep, 0, "icedly", USEC_TO_NSEC(time)); + else + DELAY(time); +} + +/* + * ice_msec_delay - Delay for the specified number of milliseconds + * @time: milliseconds to delay + * @sleep: if true, sleep where possible + * + * If sleep is true, sleep so that another thread can execute. + * Otherwise, use DELAY to spin the thread instead. + */ +void +ice_msec_delay(uint32_t time, bool sleep) +{ + if (sleep && !cold) + tsleep_nsec(&sleep, 0, "icedly", MSEC_TO_NSEC(time)); + else + DELAY(time * 1000); +} + +/** + * ice_aq_str - Convert an AdminQ error into a string + * @aq_err: the AQ error code to convert + * + * Convert the AdminQ status into its string name, if known. Otherwise, format + * the error as an integer. + */ +const char * +ice_aq_str(enum ice_aq_err aq_err) +{ + static char buf[ICE_STR_BUF_LEN]; + const char *str = NULL; + + switch (aq_err) { + case ICE_AQ_RC_OK: + str = "OK"; + break; + case ICE_AQ_RC_EPERM: + str = "AQ_RC_EPERM"; + break; + case ICE_AQ_RC_ENOENT: + str = "AQ_RC_ENOENT"; + break; + case ICE_AQ_RC_ESRCH: + str = "AQ_RC_ESRCH"; + break; + case ICE_AQ_RC_EINTR: + str = "AQ_RC_EINTR"; + break; + case ICE_AQ_RC_EIO: + str = "AQ_RC_EIO"; + break; + case ICE_AQ_RC_ENXIO: + str = "AQ_RC_ENXIO"; + break; + case ICE_AQ_RC_E2BIG: + str = "AQ_RC_E2BIG"; + break; + case ICE_AQ_RC_EAGAIN: + str = "AQ_RC_EAGAIN"; + break; + case ICE_AQ_RC_ENOMEM: + str = "AQ_RC_ENOMEM"; + break; + case ICE_AQ_RC_EACCES: + str = "AQ_RC_EACCES"; + break; + case ICE_AQ_RC_EFAULT: + str = "AQ_RC_EFAULT"; + break; + case ICE_AQ_RC_EBUSY: + str = "AQ_RC_EBUSY"; + break; + case ICE_AQ_RC_EEXIST: + str = "AQ_RC_EEXIST"; + break; + case ICE_AQ_RC_EINVAL: + str = "AQ_RC_EINVAL"; + break; + case ICE_AQ_RC_ENOTTY: + str = "AQ_RC_ENOTTY"; + break; + case ICE_AQ_RC_ENOSPC: + str = "AQ_RC_ENOSPC"; + break; + case ICE_AQ_RC_ENOSYS: + str = "AQ_RC_ENOSYS"; + break; + case ICE_AQ_RC_ERANGE: + str = "AQ_RC_ERANGE"; + break; + case ICE_AQ_RC_EFLUSHED: + str = "AQ_RC_EFLUSHED"; + break; + case ICE_AQ_RC_BAD_ADDR: + str = "AQ_RC_BAD_ADDR"; + break; + case ICE_AQ_RC_EMODE: + str = "AQ_RC_EMODE"; + break; + case ICE_AQ_RC_EFBIG: + str = "AQ_RC_EFBIG"; + break; + case ICE_AQ_RC_ESBCOMP: + str = "AQ_RC_ESBCOMP"; + break; + case ICE_AQ_RC_ENOSEC: + str = "AQ_RC_ENOSEC"; + break; + case ICE_AQ_RC_EBADSIG: + str = "AQ_RC_EBADSIG"; + break; + case ICE_AQ_RC_ESVN: + str = "AQ_RC_ESVN"; + break; + case ICE_AQ_RC_EBADMAN: + str = "AQ_RC_EBADMAN"; + break; + case ICE_AQ_RC_EBADBUF: + str = "AQ_RC_EBADBUF"; + break; + case ICE_AQ_RC_EACCES_BMCU: + str = "AQ_RC_EACCES_BMCU"; + break; + } + + if (str) + snprintf(buf, ICE_STR_BUF_LEN, "%s", str); + else + snprintf(buf, ICE_STR_BUF_LEN, "%d", aq_err); + + return buf; +} + +/** + * ice_status_str - convert status err code to a string + * @status: the status error code to convert + * + * Convert the status code into its string name if known. + * + * Otherwise, use the scratch space to format the status code into a number. + */ +const char * +ice_status_str(enum ice_status status) +{ + static char buf[ICE_STR_BUF_LEN]; + const char *str = NULL; + + switch (status) { + case ICE_SUCCESS: + str = "OK"; + break; + case ICE_ERR_PARAM: + str = "ICE_ERR_PARAM"; + break; + case ICE_ERR_NOT_IMPL: + str = "ICE_ERR_NOT_IMPL"; + break; + case ICE_ERR_NOT_READY: + str = "ICE_ERR_NOT_READY"; + break; + case ICE_ERR_NOT_SUPPORTED: + str = "ICE_ERR_NOT_SUPPORTED"; + break; + case ICE_ERR_BAD_PTR: + str = "ICE_ERR_BAD_PTR"; + break; + case ICE_ERR_INVAL_SIZE: + str = "ICE_ERR_INVAL_SIZE"; + break; + case ICE_ERR_DEVICE_NOT_SUPPORTED: + str = "ICE_ERR_DEVICE_NOT_SUPPORTED"; + break; + case ICE_ERR_RESET_FAILED: + str = "ICE_ERR_RESET_FAILED"; + break; + case ICE_ERR_FW_API_VER: + str = "ICE_ERR_FW_API_VER"; + break; + case ICE_ERR_NO_MEMORY: + str = "ICE_ERR_NO_MEMORY"; + break; + case ICE_ERR_CFG: + str = "ICE_ERR_CFG"; + break; + case ICE_ERR_OUT_OF_RANGE: + str = "ICE_ERR_OUT_OF_RANGE"; + break; + case ICE_ERR_ALREADY_EXISTS: + str = "ICE_ERR_ALREADY_EXISTS"; + break; + case ICE_ERR_NVM: + str = "ICE_ERR_NVM"; + break; + case ICE_ERR_NVM_CHECKSUM: + str = "ICE_ERR_NVM_CHECKSUM"; + break; + case ICE_ERR_BUF_TOO_SHORT: + str = "ICE_ERR_BUF_TOO_SHORT"; + break; + case ICE_ERR_NVM_BLANK_MODE: + str = "ICE_ERR_NVM_BLANK_MODE"; + break; + case ICE_ERR_IN_USE: + str = "ICE_ERR_IN_USE"; + break; + case ICE_ERR_MAX_LIMIT: + str = "ICE_ERR_MAX_LIMIT"; + break; + case ICE_ERR_RESET_ONGOING: + str = "ICE_ERR_RESET_ONGOING"; + break; + case ICE_ERR_HW_TABLE: + str = "ICE_ERR_HW_TABLE"; + break; + case ICE_ERR_FW_DDP_MISMATCH: + str = "ICE_ERR_FW_DDP_MISMATCH"; + break; + case ICE_ERR_DOES_NOT_EXIST: + str = "ICE_ERR_DOES_NOT_EXIST"; + break; + case ICE_ERR_AQ_ERROR: + str = "ICE_ERR_AQ_ERROR"; + break; + case ICE_ERR_AQ_TIMEOUT: + str = "ICE_ERR_AQ_TIMEOUT"; + break; + case ICE_ERR_AQ_FULL: + str = "ICE_ERR_AQ_FULL"; + break; + case ICE_ERR_AQ_NO_WORK: + str = "ICE_ERR_AQ_NO_WORK"; + break; + case ICE_ERR_AQ_EMPTY: + str = "ICE_ERR_AQ_EMPTY"; + break; + case ICE_ERR_AQ_FW_CRITICAL: + str = "ICE_ERR_AQ_FW_CRITICAL"; + break; + } + + if (str) + snprintf(buf, ICE_STR_BUF_LEN, "%s", str); + else + snprintf(buf, ICE_STR_BUF_LEN, "%d", status); + + return buf; +} + +/** + * ice_mdd_tx_tclan_str - Convert MDD Tx TCLAN event to a string + * @event: the MDD event number to convert + * + * Convert the Tx TCLAN event value from the GL_MDET_TX_TCLAN register into + * a human readable string for logging of MDD events. + */ +const char * +ice_mdd_tx_tclan_str(uint8_t event) +{ + static char buf[ICE_STR_BUF_LEN]; + const char *str = NULL; + + switch (event) { + case 0: + str = "Wrong descriptor format/order"; + break; + case 1: + str = "Descriptor fetch failed"; + break; + case 2: + str = "Tail descriptor not EOP/NOP"; + break; + case 3: + str = "False scheduling error"; + break; + case 4: + str = "Tail value larger than ring len"; + break; + case 5: + str = "Too many data commands"; + break; + case 6: + str = "Zero packets sent in quanta"; + break; + case 7: + str = "Packet too small or too big"; + break; + case 8: + str = "TSO length doesn't match sum"; + break; + case 9: + str = "TSO tail reached before TLEN"; + break; + case 10: + str = "TSO max 3 descs for headers"; + break; + case 11: + str = "EOP on header descriptor"; + break; + case 12: + str = "MSS is 0 or TLEN is 0"; + break; + case 13: + str = "CTX desc invalid IPSec fields"; + break; + case 14: + str = "Quanta invalid # of SSO packets"; + break; + case 15: + str = "Quanta bytes exceeds pkt_len*64"; + break; + case 16: + str = "Quanta exceeds max_cmds_in_sq"; + break; + case 17: + str = "incoherent last_lso_quanta"; + break; + case 18: + str = "incoherent TSO TLEN"; + break; + case 19: + str = "Quanta: too many descriptors"; + break; + case 20: + str = "Quanta: # of packets mismatch"; + break; + default: + break; + } + + if (str) + snprintf(buf, ICE_STR_BUF_LEN, "%s", str); + else { + snprintf(buf, ICE_STR_BUF_LEN, + "Unknown Tx TCLAN event %u", event); + } + + return buf; +} + +/** + * ice_mdd_tx_pqm_str - Convert MDD Tx PQM event to a string + * @event: the MDD event number to convert + * + * Convert the Tx PQM event value from the GL_MDET_TX_PQM register into + * a human readable string for logging of MDD events. + */ +const char * +ice_mdd_tx_pqm_str(uint8_t event) +{ + static char buf[ICE_STR_BUF_LEN]; + const char *str = NULL; + + switch (event) { + case 0: + str = "PCI_DUMMY_COMP"; + break; + case 1: + str = "PCI_UR_COMP"; + break; + /* Index 2 is unused */ + case 3: + str = "RCV_SH_BE_LSO"; + break; + case 4: + str = "Q_FL_MNG_EPY_CH"; + break; + case 5: + str = "Q_EPY_MNG_FL_CH"; + break; + case 6: + str = "LSO_NUMDESCS_ZERO"; + break; + case 7: + str = "LSO_LENGTH_ZERO"; + break; + case 8: + str = "LSO_MSS_BELOW_MIN"; + break; + case 9: + str = "LSO_MSS_ABOVE_MAX"; + break; + case 10: + str = "LSO_HDR_SIZE_ZERO"; + break; + case 11: + str = "RCV_CNT_BE_LSO"; + break; + case 12: + str = "SKIP_ONE_QT_ONLY"; + break; + case 13: + str = "LSO_PKTCNT_ZERO"; + break; + case 14: + str = "SSO_LENGTH_ZERO"; + break; + case 15: + str = "SSO_LENGTH_EXCEED"; + break; + case 16: + str = "SSO_PKTCNT_ZERO"; + break; + case 17: + str = "SSO_PKTCNT_EXCEED"; + break; + case 18: + str = "SSO_NUMDESCS_ZERO"; + break; + case 19: + str = "SSO_NUMDESCS_EXCEED"; + break; + case 20: + str = "TAIL_GT_RING_LENGTH"; + break; + case 21: + str = "RESERVED_DBL_TYPE"; + break; + case 22: + str = "ILLEGAL_HEAD_DROP_DBL"; + break; + case 23: + str = "LSO_OVER_COMMS_Q"; + break; + case 24: + str = "ILLEGAL_VF_QNUM"; + break; + case 25: + str = "QTAIL_GT_RING_LENGTH"; + break; + default: + break; + } + + if (str) + snprintf(buf, ICE_STR_BUF_LEN, "%s", str); + else { + snprintf(buf, ICE_STR_BUF_LEN, + "Unknown Tx PQM event %u", event); + } + + return buf; +} + +/** + * ice_mdd_rx_str - Convert MDD Rx queue event to a string + * @event: the MDD event number to convert + * + * Convert the Rx queue event value from the GL_MDET_RX register into a human + * readable string for logging of MDD events. + */ +const char * +ice_mdd_rx_str(uint8_t event) +{ + static char buf[ICE_STR_BUF_LEN]; + const char *str = NULL; + + switch (event) { + case 1: + str = "Descriptor fetch failed"; + break; + default: + break; + } + + if (str) + snprintf(buf, ICE_STR_BUF_LEN, "%s", str); + else + snprintf(buf, ICE_STR_BUF_LEN, "Unknown Rx event %u", event); + + return buf; +} + +/* Memory types */ +enum ice_memset_type { + ICE_NONDMA_MEM = 0, + ICE_DMA_MEM +}; + +/* Memcpy types */ +enum ice_memcpy_type { + ICE_NONDMA_TO_NONDMA = 0, + ICE_NONDMA_TO_DMA, + ICE_DMA_TO_DMA, + ICE_DMA_TO_NONDMA +}; + +/* + * ice_calloc - Allocate an array of elementes + * @hw: the hardware private structure + * @count: number of elements to allocate + * @size: the size of each element + * + * Allocate memory for an array of items equal to size. Note that the OS + * compatibility layer assumes all allocation functions will provide zero'd + * memory. + */ +static inline void * +ice_calloc(struct ice_hw __unused *hw, size_t count, size_t size) +{ + return mallocarray(count, size, M_DEVBUF, M_ZERO | M_NOWAIT); +} + +/* + * ice_malloc - Allocate memory of a specified size + * @hw: the hardware private structure + * @size: the size to allocate + * + * Allocates memory of the specified size. Note that the OS compatibility + * layer assumes that all allocations will provide zero'd memory. + */ +static inline void * +ice_malloc(struct ice_hw __unused *hw, size_t size) +{ + return malloc(size, M_DEVBUF, M_ZERO | M_NOWAIT); +} + +/* + * ice_memdup - Allocate a copy of some other memory + * @hw: private hardware structure + * @src: the source to copy from + * @size: allocation size + * + * Allocate memory of the specified size, and copy bytes from the src to fill + * it. We don't need to zero this memory as we immediately initialize it by + * copying from the src pointer. + */ +static inline void * +ice_memdup(struct ice_hw __unused *hw, const void *src, size_t size) +{ + void *dst = malloc(size, M_DEVBUF, M_NOWAIT); + + if (dst != NULL) + memcpy(dst, src, size); + + return dst; +} + +/* + * ice_free - Free previously allocated memory + * @hw: the hardware private structure + * @mem: pointer to the memory to free + * + * Free memory that was previously allocated by ice_calloc, ice_malloc, or + * ice_memdup. + */ +static inline void +ice_free(struct ice_hw __unused *hw, void *mem) +{ + free(mem, M_DEVBUF, 0); +} + +/** + * ice_set_ctrlq_len - Configure ctrlq lengths for a device + * @hw: the device hardware structure + * + * Configures the control queues for the given device, setting up the + * specified lengths, prior to initializing hardware. + */ +void +ice_set_ctrlq_len(struct ice_hw *hw) +{ + hw->adminq.num_rq_entries = ICE_AQ_LEN; + hw->adminq.num_sq_entries = ICE_AQ_LEN; + hw->adminq.rq_buf_size = ICE_AQ_MAX_BUF_LEN; + hw->adminq.sq_buf_size = ICE_AQ_MAX_BUF_LEN; + + hw->mailboxq.num_rq_entries = ICE_MBXQ_LEN; + hw->mailboxq.num_sq_entries = ICE_MBXQ_LEN; + hw->mailboxq.rq_buf_size = ICE_MBXQ_MAX_BUF_LEN; + hw->mailboxq.sq_buf_size = ICE_MBXQ_MAX_BUF_LEN; + +} + +enum ice_fw_modes +ice_get_fw_mode(struct ice_hw *hw) +{ +#define ICE_FW_MODE_DBG_M (1 << 0) +#define ICE_FW_MODE_REC_M (1 << 1) +#define ICE_FW_MODE_ROLLBACK_M (1 << 2) + uint32_t fw_mode; + + /* check the current FW mode */ + fw_mode = ICE_READ(hw, GL_MNG_FWSM) & GL_MNG_FWSM_FW_MODES_M; + if (fw_mode & ICE_FW_MODE_DBG_M) + return ICE_FW_MODE_DBG; + else if (fw_mode & ICE_FW_MODE_REC_M) + return ICE_FW_MODE_REC; + else if (fw_mode & ICE_FW_MODE_ROLLBACK_M) + return ICE_FW_MODE_ROLLBACK; + else + return ICE_FW_MODE_NORMAL; +} + +void +ice_set_mac_type(struct ice_hw *hw) +{ + struct ice_softc *sc = hw->hw_sc; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + switch (sc->sc_pid) { +#if 0 + case ICE_DEV_ID_E810C_BACKPLANE: + case ICE_DEV_ID_E810C_QSFP: + case ICE_DEV_ID_E810C_SFP: + case ICE_DEV_ID_E810_XXV_BACKPLANE: + case ICE_DEV_ID_E810_XXV_QSFP: + case ICE_DEV_ID_E810_XXV_SFP: +#endif + case PCI_PRODUCT_INTEL_E810_XXV_SFP: + hw->mac_type = ICE_MAC_E810; + break; +#if 0 + case ICE_DEV_ID_E822C_10G_BASE_T: + case ICE_DEV_ID_E822C_BACKPLANE: + case ICE_DEV_ID_E822C_QSFP: + case ICE_DEV_ID_E822C_SFP: + case ICE_DEV_ID_E822C_SGMII: + case ICE_DEV_ID_E822L_10G_BASE_T: + case ICE_DEV_ID_E822L_BACKPLANE: + case ICE_DEV_ID_E822L_SFP: + case ICE_DEV_ID_E822L_SGMII: + case ICE_DEV_ID_E823L_10G_BASE_T: + case ICE_DEV_ID_E823L_1GBE: + case ICE_DEV_ID_E823L_BACKPLANE: + case ICE_DEV_ID_E823L_QSFP: + case ICE_DEV_ID_E823L_SFP: + case ICE_DEV_ID_E823C_10G_BASE_T: + case ICE_DEV_ID_E823C_BACKPLANE: + case ICE_DEV_ID_E823C_QSFP: + case ICE_DEV_ID_E823C_SFP: + case ICE_DEV_ID_E823C_SGMII: + hw->mac_type = ICE_MAC_GENERIC; + break; +#endif + default: + hw->mac_type = ICE_MAC_UNKNOWN; + break; + } + + DNPRINTF(ICE_DBG_INIT, "mac_type: %d\n", hw->mac_type); +} + +enum ice_status +ice_check_reset(struct ice_hw *hw) +{ + uint32_t cnt, reg = 0, grst_timeout, uld_mask, reset_wait_cnt; + + /* Poll for Device Active state in case a recent CORER, GLOBR, + * or EMPR has occurred. The grst delay value is in 100ms units. + * Add 1sec for outstanding AQ commands that can take a long time. + */ + grst_timeout = ((ICE_READ(hw, GLGEN_RSTCTL) & GLGEN_RSTCTL_GRSTDEL_M) >> + GLGEN_RSTCTL_GRSTDEL_S) + 10; + + for (cnt = 0; cnt < grst_timeout; cnt++) { + ice_msec_delay(100, true); + reg = ICE_READ(hw, GLGEN_RSTAT); + if (!(reg & GLGEN_RSTAT_DEVSTATE_M)) + break; + } + + if (cnt == grst_timeout) { + DNPRINTF(ICE_DBG_INIT, "Global reset polling failed to complete.\n"); + return ICE_ERR_RESET_FAILED; + } + +#define ICE_RESET_DONE_MASK (GLNVM_ULD_PCIER_DONE_M |\ + GLNVM_ULD_PCIER_DONE_1_M |\ + GLNVM_ULD_CORER_DONE_M |\ + GLNVM_ULD_GLOBR_DONE_M |\ + GLNVM_ULD_POR_DONE_M |\ + GLNVM_ULD_POR_DONE_1_M |\ + GLNVM_ULD_PCIER_DONE_2_M) + + uld_mask = ICE_RESET_DONE_MASK | (hw->func_caps.common_cap.iwarp ? + GLNVM_ULD_PE_DONE_M : 0); + + reset_wait_cnt = ICE_PF_RESET_WAIT_COUNT; + + /* Device is Active; check Global Reset processes are done */ + for (cnt = 0; cnt < reset_wait_cnt; cnt++) { + reg = ICE_READ(hw, GLNVM_ULD) & uld_mask; + if (reg == uld_mask) { + DNPRINTF(ICE_DBG_INIT, "Global reset processes done. %d\n", cnt); + break; + } + ice_msec_delay(10, true); + } + + if (cnt == reset_wait_cnt) { + DNPRINTF(ICE_DBG_INIT, "Wait for Reset Done timed out. " + "GLNVM_ULD = 0x%x\n", reg); + return ICE_ERR_RESET_FAILED; + } + + return ICE_SUCCESS; +} + +/* + * ice_pf_reset - Reset the PF + * + * If a global reset has been triggered, this function checks + * for its completion and then issues the PF reset + */ +enum ice_status +ice_pf_reset(struct ice_hw *hw) +{ + uint32_t cnt, reg, reset_wait_cnt, cfg_lock_timeout; + + /* If at function entry a global reset was already in progress, i.e. + * state is not 'device active' or any of the reset done bits are not + * set in GLNVM_ULD, there is no need for a PF Reset; poll until the + * global reset is done. + */ + if ((ICE_READ(hw, GLGEN_RSTAT) & GLGEN_RSTAT_DEVSTATE_M) || + (ICE_READ(hw, GLNVM_ULD) & ICE_RESET_DONE_MASK) ^ ICE_RESET_DONE_MASK) { + /* poll on global reset currently in progress until done */ + if (ice_check_reset(hw)) + return ICE_ERR_RESET_FAILED; + + return ICE_SUCCESS; + } + + /* Reset the PF */ + reg = ICE_READ(hw, PFGEN_CTRL); + + ICE_WRITE(hw, PFGEN_CTRL, (reg | PFGEN_CTRL_PFSWR_M)); + + /* Wait for the PFR to complete. The wait time is the global config lock + * timeout plus the PFR timeout which will account for a possible reset + * that is occurring during a download package operation. + */ + reset_wait_cnt = ICE_PF_RESET_WAIT_COUNT; + cfg_lock_timeout = ICE_GLOBAL_CFG_LOCK_TIMEOUT; + + for (cnt = 0; cnt < cfg_lock_timeout + reset_wait_cnt; cnt++) { + reg = ICE_READ(hw, PFGEN_CTRL); + if (!(reg & PFGEN_CTRL_PFSWR_M)) + break; + + ice_msec_delay(1, true); + } + + if (cnt == cfg_lock_timeout + reset_wait_cnt) { + DNPRINTF(ICE_DBG_INIT, "PF reset polling failed to complete.\n"); + return ICE_ERR_RESET_FAILED; + } + + return ICE_SUCCESS; +} + +/** + * ice_reset - Perform different types of reset + * + * If anything other than a PF reset is triggered, PXE mode is restored. + * This has to be cleared using ice_clear_pxe_mode again, once the AQ + * interface has been restored in the rebuild flow. + */ +enum ice_status +ice_reset(struct ice_hw *hw, enum ice_reset_req req) +{ + uint32_t val = 0; + + switch (req) { + case ICE_RESET_PFR: + return ice_pf_reset(hw); + case ICE_RESET_CORER: + DNPRINTF(ICE_DBG_INIT, "CoreR requested\n"); + val = GLGEN_RTRIG_CORER_M; + break; + case ICE_RESET_GLOBR: + DNPRINTF(ICE_DBG_INIT, "GlobalR requested\n"); + val = GLGEN_RTRIG_GLOBR_M; + break; + default: + return ICE_ERR_PARAM; + } + + val |= ICE_READ(hw, GLGEN_RTRIG); + ICE_WRITE(hw, GLGEN_RTRIG, val); + ice_flush(hw); + + /* wait for the FW to be ready */ + return ice_check_reset(hw); +} + +/* + * ice_get_itr_intrl_gran + * + * Determines the ITR/INTRL granularities based on the maximum aggregate + * bandwidth according to the device's configuration during power-on. + */ +void +ice_get_itr_intrl_gran(struct ice_hw *hw) +{ + uint8_t max_agg_bw = (ICE_READ(hw, GL_PWR_MODE_CTL) & + GL_PWR_MODE_CTL_CAR_MAX_BW_M) >> + GL_PWR_MODE_CTL_CAR_MAX_BW_S; + + switch (max_agg_bw) { + case ICE_MAX_AGG_BW_200G: + case ICE_MAX_AGG_BW_100G: + case ICE_MAX_AGG_BW_50G: + hw->itr_gran = ICE_ITR_GRAN_ABOVE_25; + hw->intrl_gran = ICE_INTRL_GRAN_ABOVE_25; + break; + case ICE_MAX_AGG_BW_25G: + hw->itr_gran = ICE_ITR_GRAN_MAX_25; + hw->intrl_gran = ICE_INTRL_GRAN_MAX_25; + break; + } +} + +/* + * ice_destroy_ctrlq_locks - Destroy locks for a control queue + * @cq: pointer to the control queue + * + * Destroys the send and receive queue locks for a given control queue. + */ +void +ice_destroy_ctrlq_locks(struct ice_ctl_q_info *cq) +{ +#if 0 + ice_destroy_lock(&cq->sq_lock); + ice_destroy_lock(&cq->rq_lock); +#endif +} + +/* Returns true if Queue is enabled else false. */ +bool +ice_check_sq_alive(struct ice_hw *hw, struct ice_ctl_q_info *cq) +{ + /* check both queue-length and queue-enable fields */ + if (cq->sq.len && cq->sq.len_mask && cq->sq.len_ena_mask) + return (ICE_READ(hw, cq->sq.len) & (cq->sq.len_mask | + cq->sq.len_ena_mask)) == + (cq->num_sq_entries | cq->sq.len_ena_mask); + + return false; +} + +#define ICE_CQ_INIT_REGS(qinfo, prefix) \ +do { \ + (qinfo)->sq.head = prefix##_ATQH; \ + (qinfo)->sq.tail = prefix##_ATQT; \ + (qinfo)->sq.len = prefix##_ATQLEN; \ + (qinfo)->sq.bah = prefix##_ATQBAH; \ + (qinfo)->sq.bal = prefix##_ATQBAL; \ + (qinfo)->sq.len_mask = prefix##_ATQLEN_ATQLEN_M; \ + (qinfo)->sq.len_ena_mask = prefix##_ATQLEN_ATQENABLE_M; \ + (qinfo)->sq.len_crit_mask = prefix##_ATQLEN_ATQCRIT_M; \ + (qinfo)->sq.head_mask = prefix##_ATQH_ATQH_M; \ + (qinfo)->rq.head = prefix##_ARQH; \ + (qinfo)->rq.tail = prefix##_ARQT; \ + (qinfo)->rq.len = prefix##_ARQLEN; \ + (qinfo)->rq.bah = prefix##_ARQBAH; \ + (qinfo)->rq.bal = prefix##_ARQBAL; \ + (qinfo)->rq.len_mask = prefix##_ARQLEN_ARQLEN_M; \ + (qinfo)->rq.len_ena_mask = prefix##_ARQLEN_ARQENABLE_M; \ + (qinfo)->rq.len_crit_mask = prefix##_ARQLEN_ARQCRIT_M; \ + (qinfo)->rq.head_mask = prefix##_ARQH_ARQH_M; \ +} while (0) + +/* + * ice_adminq_init_regs - Initialize AdminQ registers + * + * This assumes the alloc_sq and alloc_rq functions have already been called + */ +void +ice_adminq_init_regs(struct ice_hw *hw) +{ + struct ice_ctl_q_info *cq = &hw->adminq; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + ICE_CQ_INIT_REGS(cq, PF_FW); +} + +/* + * ice_mailbox_init_regs - Initialize Mailbox registers + * + * This assumes the alloc_sq and alloc_rq functions have already been called + */ +void +ice_mailbox_init_regs(struct ice_hw *hw) +{ + struct ice_ctl_q_info *cq = &hw->mailboxq; + + ICE_CQ_INIT_REGS(cq, PF_MBX); +} + +/* + * ice_free_dma_mem - Free DMA memory allocated by ice_alloc_dma_mem + * @hw: the hardware private structure + * @mem: DMA memory to free + * + * Release the bus DMA tag and map, and free the DMA memory associated with + * it. + */ +void +ice_free_dma_mem(struct ice_hw __unused *hw, struct ice_dma_mem *mem) +{ + if (mem->map != NULL) { + if (mem->va != NULL) { + bus_dmamap_sync(mem->tag, mem->map, 0, mem->size, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(mem->tag, mem->map); + bus_dmamem_unmap(mem->tag, mem->va, mem->size); + bus_dmamem_free(mem->tag, &mem->seg, 1); + mem->va = NULL; + } + + bus_dmamap_destroy(mem->tag, mem->map); + mem->map = NULL; + mem->pa = 0L; + } +} + +/* ice_alloc_dma_mem - Request OS to allocate DMA memory */ +void * +ice_alloc_dma_mem(struct ice_hw *hw, struct ice_dma_mem *mem, uint64_t size) +{ + struct ice_softc *sc = hw->hw_sc; + int nsegs = 0, err; + caddr_t va; + + mem->tag = sc->sc_dmat; + + err = bus_dmamap_create(mem->tag, size, 1, size, 0, BUS_DMA_NOWAIT, + &mem->map); + if (err) + goto fail; + + err = bus_dmamem_alloc(mem->tag, size, 1, 0, &mem->seg, 1, &nsegs, + BUS_DMA_NOWAIT | BUS_DMA_ZERO); + if (err || nsegs != 1) + goto fail_1; + + err = bus_dmamem_map(mem->tag, &mem->seg, nsegs, size, &va, + BUS_DMA_NOWAIT | BUS_DMA_COHERENT); + if (err) + goto fail_2; + + mem->va = va; + mem->size = size; + + err = bus_dmamap_load(mem->tag, mem->map, mem->va, size, NULL, + BUS_DMA_NOWAIT); + if (err) + goto fail_3; + + bus_dmamap_sync(mem->tag, mem->map, 0, size, BUS_DMASYNC_PREWRITE); + mem->pa = mem->map->dm_segs[0].ds_addr; + return (mem->va); +fail_3: + bus_dmamem_unmap(mem->tag, mem->va, size); +fail_2: + bus_dmamem_free(mem->tag, &mem->seg, nsegs); +fail_1: + bus_dmamap_destroy(mem->tag, mem->map); +fail: + mem->map = NULL; + mem->tag = NULL; + mem->va = NULL; + mem->pa = 0L; + mem->size = 0; + return (NULL); +} + +/* ice_alloc_ctrlq_sq_ring - Allocate Control Transmit Queue (ATQ) rings */ +enum ice_status +ice_alloc_ctrlq_sq_ring(struct ice_hw *hw, struct ice_ctl_q_info *cq) +{ + size_t size = cq->num_sq_entries * sizeof(struct ice_aq_desc); + + cq->sq.desc_buf.va = ice_alloc_dma_mem(hw, &cq->sq.desc_buf, size); + if (!cq->sq.desc_buf.va) + return ICE_ERR_NO_MEMORY; + + return ICE_SUCCESS; +} + +/* ice_alloc_ctrlq_rq_ring - Allocate Control Receive Queue (ARQ) rings */ +enum ice_status +ice_alloc_ctrlq_rq_ring(struct ice_hw *hw, struct ice_ctl_q_info *cq) +{ + size_t size = cq->num_rq_entries * sizeof(struct ice_aq_desc); + + cq->rq.desc_buf.va = ice_alloc_dma_mem(hw, &cq->rq.desc_buf, size); + if (!cq->rq.desc_buf.va) + return ICE_ERR_NO_MEMORY; + + return ICE_SUCCESS; +} + +/* ice_alloc_sq_bufs - Allocate empty buffer structs for the ATQ */ +enum ice_status +ice_alloc_sq_bufs(struct ice_hw *hw, struct ice_ctl_q_info *cq) +{ + int i; + + /* No mapped memory needed yet, just the buffer info structures */ + cq->sq.dma_head = ice_calloc(hw, cq->num_sq_entries, + sizeof(cq->sq.desc_buf)); + if (!cq->sq.dma_head) + return ICE_ERR_NO_MEMORY; + cq->sq.r.sq_bi = (struct ice_dma_mem *)cq->sq.dma_head; + + /* allocate the mapped buffers */ + for (i = 0; i < cq->num_sq_entries; i++) { + struct ice_dma_mem *bi; + + bi = &cq->sq.r.sq_bi[i]; + bi->va = ice_alloc_dma_mem(hw, bi, cq->sq_buf_size); + if (!bi->va) + goto unwind_alloc_sq_bufs; + } + return ICE_SUCCESS; + +unwind_alloc_sq_bufs: + /* don't try to free the one that failed... */ + i--; + for (; i >= 0; i--) + ice_free_dma_mem(hw, &cq->sq.r.sq_bi[i]); + cq->sq.r.sq_bi = NULL; + ice_free(hw, cq->sq.dma_head); + cq->sq.dma_head = NULL; + + return ICE_ERR_NO_MEMORY; +} + +/* + * ice_free_cq_ring - Free control queue ring + * @hw: pointer to the hardware structure + * @ring: pointer to the specific control queue ring + * + * This assumes the posted buffers have already been cleaned + * and de-allocated + */ +void +ice_free_cq_ring(struct ice_hw *hw, struct ice_ctl_q_ring *ring) +{ + ice_free_dma_mem(hw, &ring->desc_buf); +} + +/* ice_alloc_rq_bufs - Allocate pre-posted buffers for the ARQ */ +enum ice_status +ice_alloc_rq_bufs(struct ice_hw *hw, struct ice_ctl_q_info *cq) +{ + int i; + + /* + * We'll be allocating the buffer info memory first, then we can + * allocate the mapped buffers for the event processing + */ + cq->rq.dma_head = ice_calloc(hw, cq->num_rq_entries, + sizeof(cq->rq.desc_buf)); + if (!cq->rq.dma_head) + return ICE_ERR_NO_MEMORY; + + cq->rq.r.rq_bi = (struct ice_dma_mem *)cq->rq.dma_head; + + /* allocate the mapped buffers */ + for (i = 0; i < cq->num_rq_entries; i++) { + struct ice_aq_desc *desc; + struct ice_dma_mem *bi; + + bi = &cq->rq.r.rq_bi[i]; + bi->va = ice_alloc_dma_mem(hw, bi, cq->rq_buf_size); + if (!bi->va) + goto unwind_alloc_rq_bufs; + + /* now configure the descriptors for use */ + desc = ICE_CTL_Q_DESC(cq->rq, i); + + desc->flags = htole16(ICE_AQ_FLAG_BUF); + if (cq->rq_buf_size > ICE_AQ_LG_BUF) + desc->flags |= htole16(ICE_AQ_FLAG_LB); + desc->opcode = 0; + /* This is in accordance with control queue design, there is no + * register for buffer size configuration + */ + desc->datalen = htole16(bi->size); + desc->retval = 0; + desc->cookie_high = 0; + desc->cookie_low = 0; + desc->params.generic.addr_high = htole32(ICE_HI_DWORD(bi->pa)); + desc->params.generic.addr_low = htole32(ICE_LO_DWORD(bi->pa)); + desc->params.generic.param0 = 0; + desc->params.generic.param1 = 0; + } + return ICE_SUCCESS; + +unwind_alloc_rq_bufs: + /* don't try to free the one that failed... */ + i--; + for (; i >= 0; i--) + ice_free_dma_mem(hw, &cq->rq.r.rq_bi[i]); + cq->rq.r.rq_bi = NULL; + ice_free(hw, cq->rq.dma_head); + cq->rq.dma_head = NULL; + + return ICE_ERR_NO_MEMORY; +} + +enum ice_status +ice_cfg_cq_regs(struct ice_hw *hw, struct ice_ctl_q_ring *ring, + uint16_t num_entries) +{ + /* Clear Head and Tail */ + ICE_WRITE(hw, ring->head, 0); + ICE_WRITE(hw, ring->tail, 0); + + /* set starting point */ + ICE_WRITE(hw, ring->len, (num_entries | ring->len_ena_mask)); + ICE_WRITE(hw, ring->bal, ICE_LO_DWORD(ring->desc_buf.pa)); + ICE_WRITE(hw, ring->bah, ICE_HI_DWORD(ring->desc_buf.pa)); + + /* Check one register to verify that config was applied */ + if (ICE_READ(hw, ring->bal) != ICE_LO_DWORD(ring->desc_buf.pa)) + return ICE_ERR_AQ_ERROR; + + return ICE_SUCCESS; +} + +/** + * ice_cfg_sq_regs - configure Control ATQ registers + * @hw: pointer to the hardware structure + * @cq: pointer to the specific Control queue + * + * Configure base address and length registers for the transmit queue + */ +enum ice_status +ice_cfg_sq_regs(struct ice_hw *hw, struct ice_ctl_q_info *cq) +{ + return ice_cfg_cq_regs(hw, &cq->sq, cq->num_sq_entries); +} + +/* + * ice_cfg_rq_regs - configure Control ARQ register + * Configure base address and length registers for the receive (event queue) + */ +enum ice_status +ice_cfg_rq_regs(struct ice_hw *hw, struct ice_ctl_q_info *cq) +{ + enum ice_status status; + + status = ice_cfg_cq_regs(hw, &cq->rq, cq->num_rq_entries); + if (status) + return status; + + /* Update tail in the HW to post pre-allocated buffers */ + ICE_WRITE(hw, cq->rq.tail, (uint32_t)(cq->num_rq_entries - 1)); + + return ICE_SUCCESS; +} + +#define ICE_FREE_CQ_BUFS(hw, qi, ring) \ +do { \ + /* free descriptors */ \ + if ((qi)->ring.r.ring##_bi) { \ + int i; \ + \ + for (i = 0; i < (qi)->num_##ring##_entries; i++) \ + if ((qi)->ring.r.ring##_bi[i].pa) \ + ice_free_dma_mem((hw), \ + &(qi)->ring.r.ring##_bi[i]); \ + } \ + /* free DMA head */ \ + ice_free(hw, (qi)->ring.dma_head); \ +} while (0) + +/* + * ice_init_sq - main initialization routine for Control ATQ + * @hw: pointer to the hardware structure + * @cq: pointer to the specific Control queue + * + * This is the main initialization routine for the Control Send Queue + * Prior to calling this function, the driver *MUST* set the following fields + * in the cq->structure: + * - cq->num_sq_entries + * - cq->sq_buf_size + * + * Do *NOT* hold the lock when calling this as the memory allocation routines + * called are not going to be atomic context safe + */ +enum ice_status +ice_init_sq(struct ice_hw *hw, struct ice_ctl_q_info *cq) +{ + enum ice_status ret_code; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + if (cq->sq.count > 0) { + /* queue already initialized */ + ret_code = ICE_ERR_NOT_READY; + goto init_ctrlq_exit; + } + + /* verify input for valid configuration */ + if (!cq->num_sq_entries || !cq->sq_buf_size) { + ret_code = ICE_ERR_CFG; + goto init_ctrlq_exit; + } + + cq->sq.next_to_use = 0; + cq->sq.next_to_clean = 0; + + /* allocate the ring memory */ + ret_code = ice_alloc_ctrlq_sq_ring(hw, cq); + if (ret_code) + goto init_ctrlq_exit; + + /* allocate buffers in the rings */ + ret_code = ice_alloc_sq_bufs(hw, cq); + if (ret_code) + goto init_ctrlq_free_rings; + + /* initialize base registers */ + ret_code = ice_cfg_sq_regs(hw, cq); + if (ret_code) + goto init_ctrlq_free_rings; + + /* success! */ + cq->sq.count = cq->num_sq_entries; + return ICE_SUCCESS; + +init_ctrlq_free_rings: + ICE_FREE_CQ_BUFS(hw, cq, sq); + ice_free_cq_ring(hw, &cq->sq); +init_ctrlq_exit: + return ret_code; +} + +/* + * ice_init_rq - initialize receive side of a control queue + * @hw: pointer to the hardware structure + * @cq: pointer to the specific Control queue + * + * The main initialization routine for Receive side of a control queue. + * Prior to calling this function, the driver *MUST* set the following fields + * in the cq->structure: + * - cq->num_rq_entries + * - cq->rq_buf_size + * + * Do *NOT* hold the lock when calling this as the memory allocation routines + * called are not going to be atomic context safe + */ +enum ice_status +ice_init_rq(struct ice_hw *hw, struct ice_ctl_q_info *cq) +{ + enum ice_status ret_code; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + if (cq->rq.count > 0) { + /* queue already initialized */ + ret_code = ICE_ERR_NOT_READY; + goto init_ctrlq_exit; + } + + /* verify input for valid configuration */ + if (!cq->num_rq_entries || !cq->rq_buf_size) { + ret_code = ICE_ERR_CFG; + goto init_ctrlq_exit; + } + + cq->rq.next_to_use = 0; + cq->rq.next_to_clean = 0; + + /* allocate the ring memory */ + ret_code = ice_alloc_ctrlq_rq_ring(hw, cq); + if (ret_code) + goto init_ctrlq_exit; + + /* allocate buffers in the rings */ + ret_code = ice_alloc_rq_bufs(hw, cq); + if (ret_code) + goto init_ctrlq_free_rings; + + /* initialize base registers */ + ret_code = ice_cfg_rq_regs(hw, cq); + if (ret_code) + goto init_ctrlq_free_rings; + + /* success! */ + cq->rq.count = cq->num_rq_entries; + goto init_ctrlq_exit; + +init_ctrlq_free_rings: + ICE_FREE_CQ_BUFS(hw, cq, rq); + ice_free_cq_ring(hw, &cq->rq); +init_ctrlq_exit: + return ret_code; +} + +/* + * Decide if we should retry the send command routine for the ATQ, depending + * on the opcode. + */ +bool +ice_should_retry_sq_send_cmd(uint16_t opcode) +{ + switch (opcode) { + case ice_aqc_opc_dnl_get_status: + case ice_aqc_opc_dnl_run: + case ice_aqc_opc_dnl_call: + case ice_aqc_opc_dnl_read_sto: + case ice_aqc_opc_dnl_write_sto: + case ice_aqc_opc_dnl_set_breakpoints: + case ice_aqc_opc_dnl_read_log: + case ice_aqc_opc_get_link_topo: + case ice_aqc_opc_done_alt_write: + case ice_aqc_opc_lldp_stop: + case ice_aqc_opc_lldp_start: + case ice_aqc_opc_lldp_filter_ctrl: + return true; + } + + return false; +} + +/* based on libsa/hexdump.c */ +void +ice_hexdump(const void *addr, size_t size) +{ + const unsigned char *line, *end; + int byte; + + end = (const char *)addr + size; + for (line = addr; line < end; line += 16) { + DPRINTF("%08lx ", (unsigned long)line); + for (byte = 0; byte < 16; byte++) { + if (&line[byte] < end) + DPRINTF("%02x ", line[byte]); + else + DPRINTF(" "); + if (byte == 7) + DPRINTF(" "); + } + DPRINTF(" |"); + for (byte = 0; byte < 16; byte++) { + if (&line[byte] < end) { + if (line[byte] >= ' ' && line[byte] <= '~') + DPRINTF("%c", line[byte]); + else + DPRINTF("."); + } else + break; + } + DPRINTF("|\n"); + } + DPRINTF("%08lx\n", (unsigned long)end); +} + +/** + * ice_debug_array - Format and print an array of values to the console + * @hw: private hardware structure + * @mask: the debug message type + * @groupsize: preferred size in bytes to print each chunk + * @buf: the array buffer to print + * @len: size of the array buffer + * + * Format the given array as a series of uint8_t values with hexadecimal + * notation and log the contents to the console log. + * + * TODO: Currently only supports a group size of 1, due to the way hexdump is + * implemented. + */ +void +ice_debug_array(struct ice_hw *hw, uint64_t mask, uint32_t rowsize, + uint32_t __unused groupsize, uint8_t *buf, size_t len) +{ +#ifdef ICE_DEBUG + if (!(mask & ice_debug)) + return; + + /* Make sure the row-size isn't too large */ + if (rowsize > 0xFF) + rowsize = 0xFF; + + ice_hexdump(buf, len); +#endif +} + +/** + * ice_clean_sq - cleans send side of a control queue + * @hw: pointer to the hardware structure + * @cq: pointer to the specific Control queue + * + * returns the number of free desc + */ +uint16_t +ice_clean_sq(struct ice_hw *hw, struct ice_ctl_q_info *cq) +{ + struct ice_ctl_q_ring *sq = &cq->sq; + uint16_t ntc = sq->next_to_clean; + struct ice_aq_desc *desc; + + desc = ICE_CTL_Q_DESC(*sq, ntc); + + while (ICE_READ(hw, cq->sq.head) != ntc) { + DNPRINTF(ICE_DBG_AQ_MSG, "ntc %d head %d.\n", ntc, + ICE_READ(hw, cq->sq.head)); + memset(desc, 0, sizeof(*desc)); + ntc++; + if (ntc == sq->count) + ntc = 0; + desc = ICE_CTL_Q_DESC(*sq, ntc); + } + + sq->next_to_clean = ntc; + + return ICE_CTL_Q_DESC_UNUSED(sq); +} + +/** + * ice_ctl_q_str - Convert control queue type to string + * @qtype: the control queue type + * + * Returns: A string name for the given control queue type. + */ +const char * +ice_ctl_q_str(enum ice_ctl_q qtype) +{ + switch (qtype) { + case ICE_CTL_Q_UNKNOWN: + return "Unknown CQ"; + case ICE_CTL_Q_ADMIN: + return "AQ"; + case ICE_CTL_Q_MAILBOX: + return "MBXQ"; + default: + return "Unrecognized CQ"; + } +} + +/** + * ice_debug_cq + * @hw: pointer to the hardware structure + * @cq: pointer to the specific Control queue + * @desc: pointer to control queue descriptor + * @buf: pointer to command buffer + * @buf_len: max length of buf + * @response: true if this is the writeback response + * + * Dumps debug log about control command with descriptor contents. + */ +void +ice_debug_cq(struct ice_hw *hw, struct ice_ctl_q_info *cq, + void *desc, void *buf, uint16_t buf_len, bool response) +{ +#ifdef ICE_DEBUG + struct ice_aq_desc *cq_desc = (struct ice_aq_desc *)desc; + uint16_t datalen, flags; + + if (!((ICE_DBG_AQ_DESC | ICE_DBG_AQ_DESC_BUF) & ice_debug)) + return; + + if (!desc) + return; + + datalen = le16toh(cq_desc->datalen); + flags = le16toh(cq_desc->flags); + + DNPRINTF(ICE_DBG_AQ_DESC, "%s %s: opcode 0x%04X, flags 0x%04X, " + "datalen 0x%04X, retval 0x%04X\n", ice_ctl_q_str(cq->qtype), + response ? "Response" : "Command", le16toh(cq_desc->opcode), + flags, datalen, le16toh(cq_desc->retval)); + DNPRINTF(ICE_DBG_AQ_DESC, "\tcookie (h,l) 0x%08X 0x%08X\n", + le32toh(cq_desc->cookie_high), + le32toh(cq_desc->cookie_low)); + DNPRINTF(ICE_DBG_AQ_DESC, "\tparam (0,1) 0x%08X 0x%08X\n", + le32toh(cq_desc->params.generic.param0), + le32toh(cq_desc->params.generic.param1)); + DNPRINTF(ICE_DBG_AQ_DESC, "\taddr (h,l) 0x%08X 0x%08X\n", + le32toh(cq_desc->params.generic.addr_high), + le32toh(cq_desc->params.generic.addr_low)); + /* Dump buffer iff 1) one exists and 2) is either a response indicated + * by the DD and/or CMP flag set or a command with the RD flag set. + */ + if (buf && cq_desc->datalen != 0 && + (flags & (ICE_AQ_FLAG_DD | ICE_AQ_FLAG_CMP) || + flags & ICE_AQ_FLAG_RD)) { + DNPRINTF(ICE_DBG_AQ_DESC_BUF, "Buffer:\n"); + ice_debug_array(hw, ICE_DBG_AQ_DESC_BUF, 16, 1, (uint8_t *)buf, + MIN(buf_len, datalen)); + } +#endif +} + +/* + * ice_sq_done - check if the last send on a control queue has completed + * + * Returns: true if all the descriptors on the send side of a control queue + * are finished processing, false otherwise. + */ +bool +ice_sq_done(struct ice_hw *hw, struct ice_ctl_q_info *cq) +{ + /* control queue designers suggest use of head for better + * timing reliability than DD bit + */ + return ICE_READ(hw, cq->sq.head) == cq->sq.next_to_use; +} + +/** + * ice_sq_send_cmd_nolock - send command to a control queue + * @hw: pointer to the HW struct + * @cq: pointer to the specific Control queue + * @desc: prefilled descriptor describing the command (non DMA mem) + * @buf: buffer to use for indirect commands (or NULL for direct commands) + * @buf_size: size of buffer for indirect commands (or 0 for direct commands) + * @cd: pointer to command details structure + * + * This is the main send command routine for a control queue. It prepares the + * command into a descriptor, bumps the send queue tail, waits for the command + * to complete, captures status and data for the command, etc. + */ +enum ice_status +ice_sq_send_cmd_nolock(struct ice_hw *hw, struct ice_ctl_q_info *cq, + struct ice_aq_desc *desc, void *buf, uint16_t buf_size, + struct ice_sq_cd *cd) +{ + struct ice_dma_mem *dma_buf = NULL; + struct ice_aq_desc *desc_on_ring; + bool cmd_completed = false; + enum ice_status status = ICE_SUCCESS; + uint32_t total_delay = 0; + uint16_t retval = 0; + uint32_t val = 0; + + /* if reset is in progress return a soft error */ + if (hw->reset_ongoing) + return ICE_ERR_RESET_ONGOING; + + cq->sq_last_status = ICE_AQ_RC_OK; + + if (!cq->sq.count) { + DNPRINTF(ICE_DBG_AQ_MSG, + "Control Send queue not initialized.\n"); + status = ICE_ERR_AQ_EMPTY; + goto sq_send_command_error; + } + + if ((buf && !buf_size) || (!buf && buf_size)) { + status = ICE_ERR_PARAM; + goto sq_send_command_error; + } + + if (buf) { + if (buf_size > cq->sq_buf_size) { + DNPRINTF(ICE_DBG_AQ_MSG, + "Invalid buffer size for Control Send queue: %d.\n", + buf_size); + status = ICE_ERR_INVAL_SIZE; + goto sq_send_command_error; + } + + desc->flags |= htole16(ICE_AQ_FLAG_BUF); + if (buf_size > ICE_AQ_LG_BUF) + desc->flags |= htole16(ICE_AQ_FLAG_LB); + } + + val = ICE_READ(hw, cq->sq.head); + if (val >= cq->num_sq_entries) { + DNPRINTF(ICE_DBG_AQ_MSG, + "head overrun at %d in the Control Send Queue ring\n", val); + status = ICE_ERR_AQ_EMPTY; + goto sq_send_command_error; + } + + /* Call clean and check queue available function to reclaim the + * descriptors that were processed by FW/MBX; the function returns the + * number of desc available. The clean function called here could be + * called in a separate thread in case of asynchronous completions. + */ + if (ice_clean_sq(hw, cq) == 0) { + DNPRINTF(ICE_DBG_AQ_MSG, + "Error: Control Send Queue is full.\n"); + status = ICE_ERR_AQ_FULL; + goto sq_send_command_error; + } + + /* initialize the temp desc pointer with the right desc */ + desc_on_ring = ICE_CTL_Q_DESC(cq->sq, cq->sq.next_to_use); + + /* if the desc is available copy the temp desc to the right place */ + memcpy(desc_on_ring, desc, sizeof(*desc_on_ring)); + + /* if buf is not NULL assume indirect command */ + if (buf) { + dma_buf = &cq->sq.r.sq_bi[cq->sq.next_to_use]; + /* copy the user buf into the respective DMA buf */ + memcpy(dma_buf->va, buf, buf_size); + desc_on_ring->datalen = htole16(buf_size); + + /* Update the address values in the desc with the pa value + * for respective buffer + */ + desc_on_ring->params.generic.addr_high = + htole32(ICE_HI_DWORD(dma_buf->pa)); + desc_on_ring->params.generic.addr_low = + htole32(ICE_LO_DWORD(dma_buf->pa)); + } + + /* Debug desc and buffer */ + DNPRINTF(ICE_DBG_AQ_DESC, "ATQ: Control Send queue desc and buffer:\n"); + ice_debug_cq(hw, cq, (void *)desc_on_ring, buf, buf_size, false); + + (cq->sq.next_to_use)++; + if (cq->sq.next_to_use == cq->sq.count) + cq->sq.next_to_use = 0; + ICE_WRITE(hw, cq->sq.tail, cq->sq.next_to_use); + ice_flush(hw); + + /* Wait a short time before initial ice_sq_done() check, to allow + * hardware time for completion. + */ + ice_usec_delay(5, false); + + do { + if (ice_sq_done(hw, cq)) + break; + + ice_usec_delay(10, false); + total_delay++; + } while (total_delay < cq->sq_cmd_timeout); + + /* if ready, copy the desc back to temp */ + if (ice_sq_done(hw, cq)) { + memcpy(desc, desc_on_ring, sizeof(*desc)); + if (buf) { + /* get returned length to copy */ + uint16_t copy_size = le16toh(desc->datalen); + + if (copy_size > buf_size) { + DNPRINTF(ICE_DBG_AQ_MSG, + "Return len %d > than buf len %d\n", + copy_size, buf_size); + status = ICE_ERR_AQ_ERROR; + } else { + memcpy(buf, dma_buf->va, copy_size); + } + } + retval = le16toh(desc->retval); + if (retval) { + DNPRINTF(ICE_DBG_AQ_MSG, "Control Send Queue " + "command 0x%04X completed with error 0x%X\n", + le16toh(desc->opcode), retval); + + /* strip off FW internal code */ + retval &= 0xff; + } + cmd_completed = true; + if (!status && retval != ICE_AQ_RC_OK) + status = ICE_ERR_AQ_ERROR; + cq->sq_last_status = (enum ice_aq_err)retval; + } + + DNPRINTF(ICE_DBG_AQ_MSG, "ATQ: desc and buffer writeback:\n"); + ice_debug_cq(hw, cq, (void *)desc, buf, buf_size, true); + + /* save writeback AQ if requested */ + if (cd && cd->wb_desc) + memcpy(cd->wb_desc, desc_on_ring, sizeof(*cd->wb_desc)); + + /* update the error if time out occurred */ + if (!cmd_completed) { + if (ICE_READ(hw, cq->rq.len) & cq->rq.len_crit_mask || + ICE_READ(hw, cq->sq.len) & cq->sq.len_crit_mask) { + DNPRINTF(ICE_DBG_AQ_MSG, "Critical FW error.\n"); + status = ICE_ERR_AQ_FW_CRITICAL; + } else { + DNPRINTF(ICE_DBG_AQ_MSG, + "Control Send Queue Writeback timeout.\n"); + status = ICE_ERR_AQ_TIMEOUT; + } + } + +sq_send_command_error: + return status; +} + +/** + * ice_sq_send_cmd - send command to a control queue + * @hw: pointer to the HW struct + * @cq: pointer to the specific Control queue + * @desc: prefilled descriptor describing the command + * @buf: buffer to use for indirect commands (or NULL for direct commands) + * @buf_size: size of buffer for indirect commands (or 0 for direct commands) + * @cd: pointer to command details structure + * + * Main command for the transmit side of a control queue. It puts the command + * on the queue, bumps the tail, waits for processing of the command, captures + * command status and results, etc. + */ +enum ice_status +ice_sq_send_cmd(struct ice_hw *hw, struct ice_ctl_q_info *cq, + struct ice_aq_desc *desc, void *buf, uint16_t buf_size, + struct ice_sq_cd *cd) +{ + enum ice_status status = ICE_SUCCESS; + + /* if reset is in progress return a soft error */ + if (hw->reset_ongoing) + return ICE_ERR_RESET_ONGOING; +#if 0 + ice_acquire_lock(&cq->sq_lock); +#endif + status = ice_sq_send_cmd_nolock(hw, cq, desc, buf, buf_size, cd); +#if 0 + ice_release_lock(&cq->sq_lock); +#endif + return status; +} + + +/** + * ice_sq_send_cmd_retry - send command to Control Queue (ATQ) + * @hw: pointer to the HW struct + * @cq: pointer to the specific Control queue + * @desc: prefilled descriptor describing the command + * @buf: buffer to use for indirect commands (or NULL for direct commands) + * @buf_size: size of buffer for indirect commands (or 0 for direct commands) + * @cd: pointer to command details structure + * + * Retry sending the FW Admin Queue command, multiple times, to the FW Admin + * Queue if the EBUSY AQ error is returned. + */ +enum ice_status +ice_sq_send_cmd_retry(struct ice_hw *hw, struct ice_ctl_q_info *cq, + struct ice_aq_desc *desc, void *buf, uint16_t buf_size, + struct ice_sq_cd *cd) +{ + struct ice_aq_desc desc_cpy; + enum ice_status status; + bool is_cmd_for_retry; + uint8_t *buf_cpy = NULL; + uint8_t idx = 0; + uint16_t opcode; + + opcode = le16toh(desc->opcode); + is_cmd_for_retry = ice_should_retry_sq_send_cmd(opcode); + memset(&desc_cpy, 0, sizeof(desc_cpy)); + + if (is_cmd_for_retry) { + if (buf) { + buf_cpy = (uint8_t *)ice_malloc(hw, buf_size); + if (!buf_cpy) + return ICE_ERR_NO_MEMORY; + } + + memcpy(&desc_cpy, desc, sizeof(desc_cpy)); + } + + do { + status = ice_sq_send_cmd(hw, cq, desc, buf, buf_size, cd); + + if (!is_cmd_for_retry || status == ICE_SUCCESS || + hw->adminq.sq_last_status != ICE_AQ_RC_EBUSY) + break; + + if (buf_cpy) + memcpy(buf, buf_cpy, buf_size); + + memcpy(desc, &desc_cpy, sizeof(desc_cpy)); + + ice_msec_delay(ICE_SQ_SEND_DELAY_TIME_MS, false); + + } while (++idx < ICE_SQ_SEND_MAX_EXECUTE); + + if (buf_cpy) + ice_free(hw, buf_cpy); + + return status; +} + +/** + * ice_aq_send_cmd - send FW Admin Queue command to FW Admin Queue + * @hw: pointer to the HW struct + * @desc: descriptor describing the command + * @buf: buffer to use for indirect commands (NULL for direct commands) + * @buf_size: size of buffer for indirect commands (0 for direct commands) + * @cd: pointer to command details structure + * + * Helper function to send FW Admin Queue commands to the FW Admin Queue. + */ +enum ice_status +ice_aq_send_cmd(struct ice_hw *hw, struct ice_aq_desc *desc, void *buf, + uint16_t buf_size, struct ice_sq_cd *cd) +{ + return ice_sq_send_cmd_retry(hw, &hw->adminq, desc, buf, buf_size, cd); +} + +/** + * ice_write_byte - write a byte to a packed context structure + * @src_ctx: the context structure to read from + * @dest_ctx: the context to be written to + * @ce_info: a description of the struct to be filled + */ +void +ice_write_byte(uint8_t *src_ctx, uint8_t *dest_ctx, + const struct ice_ctx_ele *ce_info) +{ + uint8_t src_byte, dest_byte, mask; + uint8_t *from, *dest; + uint16_t shift_width; + + /* copy from the next struct field */ + from = src_ctx + ce_info->offset; + + /* prepare the bits and mask */ + shift_width = ce_info->lsb % 8; + mask = (uint8_t)(BIT(ce_info->width) - 1); + + src_byte = *from; + src_byte &= mask; + + /* shift to correct alignment */ + mask <<= shift_width; + src_byte <<= shift_width; + + /* get the current bits from the target bit string */ + dest = dest_ctx + (ce_info->lsb / 8); + + memcpy(&dest_byte, dest, sizeof(dest_byte)); + + dest_byte &= ~mask; /* get the bits not changing */ + dest_byte |= src_byte; /* add in the new bits */ + + /* put it all back */ + memcpy(dest, &dest_byte, sizeof(dest_byte)); +} + +/** + * ice_write_word - write a word to a packed context structure + * @src_ctx: the context structure to read from + * @dest_ctx: the context to be written to + * @ce_info: a description of the struct to be filled + */ +void +ice_write_word(uint8_t *src_ctx, uint8_t *dest_ctx, + const struct ice_ctx_ele *ce_info) +{ + uint16_t src_word, mask; + uint16_t dest_word; + uint8_t *from, *dest; + uint16_t shift_width; + + /* copy from the next struct field */ + from = src_ctx + ce_info->offset; + + /* prepare the bits and mask */ + shift_width = ce_info->lsb % 8; + mask = BIT(ce_info->width) - 1; + + /* don't swizzle the bits until after the mask because the mask bits + * will be in a different bit position on big endian machines + */ + src_word = *(uint16_t *)from; + src_word &= mask; + + /* shift to correct alignment */ + mask <<= shift_width; + src_word <<= shift_width; + + /* get the current bits from the target bit string */ + dest = dest_ctx + (ce_info->lsb / 8); + + memcpy(&dest_word, dest, sizeof(dest_word)); + + dest_word &= ~(htole16(mask)); /* get the bits not changing */ + dest_word |= htole16(src_word); /* add in the new bits */ + + /* put it all back */ + memcpy(dest, &dest_word, sizeof(dest_word)); +} + +/** + * ice_write_dword - write a dword to a packed context structure + * @src_ctx: the context structure to read from + * @dest_ctx: the context to be written to + * @ce_info: a description of the struct to be filled + */ +void +ice_write_dword(uint8_t *src_ctx, uint8_t *dest_ctx, + const struct ice_ctx_ele *ce_info) +{ + uint32_t src_dword, mask; + uint32_t dest_dword; + uint8_t *from, *dest; + uint16_t shift_width; + + /* copy from the next struct field */ + from = src_ctx + ce_info->offset; + + /* prepare the bits and mask */ + shift_width = ce_info->lsb % 8; + + /* if the field width is exactly 32 on an x86 machine, then the shift + * operation will not work because the SHL instructions count is masked + * to 5 bits so the shift will do nothing + */ + if (ce_info->width < 32) + mask = BIT(ce_info->width) - 1; + else + mask = (uint32_t)~0; + + /* don't swizzle the bits until after the mask because the mask bits + * will be in a different bit position on big endian machines + */ + src_dword = *(uint32_t *)from; + src_dword &= mask; + + /* shift to correct alignment */ + mask <<= shift_width; + src_dword <<= shift_width; + + /* get the current bits from the target bit string */ + dest = dest_ctx + (ce_info->lsb / 8); + + memcpy(&dest_dword, dest, sizeof(dest_dword)); + + dest_dword &= ~(htole32(mask)); /* get the bits not changing */ + dest_dword |= htole32(src_dword); /* add in the new bits */ + + /* put it all back */ + memcpy(dest, &dest_dword, sizeof(dest_dword)); +} + +/** + * ice_write_qword - write a qword to a packed context structure + * @src_ctx: the context structure to read from + * @dest_ctx: the context to be written to + * @ce_info: a description of the struct to be filled + */ +void +ice_write_qword(uint8_t *src_ctx, uint8_t *dest_ctx, + const struct ice_ctx_ele *ce_info) +{ + uint64_t src_qword, mask; + uint64_t dest_qword; + uint8_t *from, *dest; + uint16_t shift_width; + + /* copy from the next struct field */ + from = src_ctx + ce_info->offset; + + /* prepare the bits and mask */ + shift_width = ce_info->lsb % 8; + + /* if the field width is exactly 64 on an x86 machine, then the shift + * operation will not work because the SHL instructions count is masked + * to 6 bits so the shift will do nothing + */ + if (ce_info->width < 64) + mask = BIT_ULL(ce_info->width) - 1; + else + mask = (uint64_t)~0; + + /* don't swizzle the bits until after the mask because the mask bits + * will be in a different bit position on big endian machines + */ + src_qword = *(uint64_t *)from; + src_qword &= mask; + + /* shift to correct alignment */ + mask <<= shift_width; + src_qword <<= shift_width; + + /* get the current bits from the target bit string */ + dest = dest_ctx + (ce_info->lsb / 8); + + memcpy(&dest_qword, dest, sizeof(dest_qword) ); + + dest_qword &= ~(htole64(mask)); /* get the bits not changing */ + dest_qword |= htole64(src_qword); /* add in the new bits */ + + /* put it all back */ + memcpy(dest, &dest_qword, sizeof(dest_qword)); +} + +/** + * ice_set_ctx - set context bits in packed structure + * @hw: pointer to the hardware structure + * @src_ctx: pointer to a generic non-packed context structure + * @dest_ctx: pointer to memory for the packed structure + * @ce_info: a description of the structure to be transformed + */ +enum ice_status +ice_set_ctx(struct ice_hw *hw, uint8_t *src_ctx, uint8_t *dest_ctx, + const struct ice_ctx_ele *ce_info) +{ + int f; + + for (f = 0; ce_info[f].width; f++) { + /* We have to deal with each element of the FW response + * using the correct size so that we are correct regardless + * of the endianness of the machine. + */ + if (ce_info[f].width > (ce_info[f].size_of * 8)) { + DNPRINTF(ICE_DBG_QCTX, "%s: Field %d width of %d bits " + "larger than size of %d byte(s); skipping write\n", + __func__, f, ce_info[f].width, ce_info[f].size_of); + continue; + } + switch (ce_info[f].size_of) { + case sizeof(uint8_t): + ice_write_byte(src_ctx, dest_ctx, &ce_info[f]); + break; + case sizeof(uint16_t): + ice_write_word(src_ctx, dest_ctx, &ce_info[f]); + break; + case sizeof(uint32_t): + ice_write_dword(src_ctx, dest_ctx, &ce_info[f]); + break; + case sizeof(uint64_t): + ice_write_qword(src_ctx, dest_ctx, &ce_info[f]); + break; + default: + return ICE_ERR_INVAL_SIZE; + } + } + + return ICE_SUCCESS; +} + +/** + * ice_fill_dflt_direct_cmd_desc - AQ descriptor helper function + * @desc: pointer to the temp descriptor (non DMA mem) + * @opcode: the opcode can be used to decide which flags to turn off or on + * + * Fill the desc with default values + */ +void +ice_fill_dflt_direct_cmd_desc(struct ice_aq_desc *desc, uint16_t opcode) +{ + /* zero out the desc */ + memset(desc, 0, sizeof(*desc)); + desc->opcode = htole16(opcode); + desc->flags = htole16(ICE_AQ_FLAG_SI); +} + +/** + * ice_aq_get_fw_ver + * @hw: pointer to the HW struct + * @cd: pointer to command details structure or NULL + * + * Get the firmware version (0x0001) from the admin queue commands + */ +enum ice_status +ice_aq_get_fw_ver(struct ice_hw *hw, struct ice_sq_cd *cd) +{ + struct ice_aqc_get_ver *resp; + struct ice_aq_desc desc; + enum ice_status status; + + resp = &desc.params.get_ver; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_get_ver); + + status = ice_aq_send_cmd(hw, &desc, NULL, 0, cd); + + if (!status) { + hw->fw_branch = resp->fw_branch; + hw->fw_maj_ver = resp->fw_major; + hw->fw_min_ver = resp->fw_minor; + hw->fw_patch = resp->fw_patch; + hw->fw_build = le32toh(resp->fw_build); + hw->api_branch = resp->api_branch; + hw->api_maj_ver = resp->api_major; + hw->api_min_ver = resp->api_minor; + hw->api_patch = resp->api_patch; + } + + return status; +} + +/* + * ice_aq_q_shutdown + * @hw: pointer to the HW struct + * @unloading: is the driver unloading itself + * + * Tell the Firmware that we're shutting down the AdminQ and whether + * or not the driver is unloading as well (0x0003). + */ +enum ice_status +ice_aq_q_shutdown(struct ice_hw *hw, bool unloading) +{ + struct ice_aqc_q_shutdown *cmd; + struct ice_aq_desc desc; + + cmd = &desc.params.q_shutdown; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_q_shutdown); + + if (unloading) + cmd->driver_unloading = ICE_AQC_DRIVER_UNLOADING; + + return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL); +} + +/** + * ice_aq_req_res + * @hw: pointer to the HW struct + * @res: resource ID + * @access: access type + * @sdp_number: resource number + * @timeout: the maximum time in ms that the driver may hold the resource + * @cd: pointer to command details structure or NULL + * + * Requests common resource using the admin queue commands (0x0008). + * When attempting to acquire the Global Config Lock, the driver can + * learn of three states: + * 1) ICE_SUCCESS - acquired lock, and can perform download package + * 2) ICE_ERR_AQ_ERROR - did not get lock, driver should fail to load + * 3) ICE_ERR_AQ_NO_WORK - did not get lock, but another driver has + * successfully downloaded the package; the driver does + * not have to download the package and can continue + * loading + * + * Note that if the caller is in an acquire lock, perform action, release lock + * phase of operation, it is possible that the FW may detect a timeout and issue + * a CORER. In this case, the driver will receive a CORER interrupt and will + * have to determine its cause. The calling thread that is handling this flow + * will likely get an error propagated back to it indicating the Download + * Package, Update Package or the Release Resource AQ commands timed out. + */ +enum ice_status +ice_aq_req_res(struct ice_hw *hw, enum ice_aq_res_ids res, + enum ice_aq_res_access_type access, uint8_t sdp_number, + uint32_t *timeout, struct ice_sq_cd *cd) +{ + struct ice_aqc_req_res *cmd_resp; + struct ice_aq_desc desc; + enum ice_status status; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + cmd_resp = &desc.params.res_owner; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_req_res); + + cmd_resp->res_id = htole16(res); + cmd_resp->access_type = htole16(access); + cmd_resp->res_number = htole32(sdp_number); + cmd_resp->timeout = htole32(*timeout); + *timeout = 0; + + status = ice_aq_send_cmd(hw, &desc, NULL, 0, cd); + + /* The completion specifies the maximum time in ms that the driver + * may hold the resource in the Timeout field. + */ + + /* Global config lock response utilizes an additional status field. + * + * If the Global config lock resource is held by some other driver, the + * command completes with ICE_AQ_RES_GLBL_IN_PROG in the status field + * and the timeout field indicates the maximum time the current owner + * of the resource has to free it. + */ + if (res == ICE_GLOBAL_CFG_LOCK_RES_ID) { + if (le16toh(cmd_resp->status) == ICE_AQ_RES_GLBL_SUCCESS) { + *timeout = le32toh(cmd_resp->timeout); + return ICE_SUCCESS; + } else if (le16toh(cmd_resp->status) == + ICE_AQ_RES_GLBL_IN_PROG) { + *timeout = le32toh(cmd_resp->timeout); + return ICE_ERR_AQ_ERROR; + } else if (le16toh(cmd_resp->status) == + ICE_AQ_RES_GLBL_DONE) { + return ICE_ERR_AQ_NO_WORK; + } + + /* invalid FW response, force a timeout immediately */ + *timeout = 0; + return ICE_ERR_AQ_ERROR; + } + + /* If the resource is held by some other driver, the command completes + * with a busy return value and the timeout field indicates the maximum + * time the current owner of the resource has to free it. + */ + if (!status || hw->adminq.sq_last_status == ICE_AQ_RC_EBUSY) + *timeout = le32toh(cmd_resp->timeout); + + return status; +} + +/** + * ice_aq_release_res + * @hw: pointer to the HW struct + * @res: resource ID + * @sdp_number: resource number + * @cd: pointer to command details structure or NULL + * + * release common resource using the admin queue commands (0x0009) + */ +enum ice_status +ice_aq_release_res(struct ice_hw *hw, enum ice_aq_res_ids res, + uint8_t sdp_number, struct ice_sq_cd *cd) +{ + struct ice_aqc_req_res *cmd; + struct ice_aq_desc desc; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + cmd = &desc.params.res_owner; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_release_res); + + cmd->res_id = htole16(res); + cmd->res_number = htole32(sdp_number); + + return ice_aq_send_cmd(hw, &desc, NULL, 0, cd); +} + +/** + * ice_acquire_res + * @hw: pointer to the HW structure + * @res: resource ID + * @access: access type (read or write) + * @timeout: timeout in milliseconds + * + * This function will attempt to acquire the ownership of a resource. + */ +enum ice_status +ice_acquire_res(struct ice_hw *hw, enum ice_aq_res_ids res, + enum ice_aq_res_access_type access, uint32_t timeout) +{ +#define ICE_RES_POLLING_DELAY_MS 10 + uint32_t delay = ICE_RES_POLLING_DELAY_MS; + uint32_t time_left = timeout; + enum ice_status status; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + status = ice_aq_req_res(hw, res, access, 0, &time_left, NULL); + + /* A return code of ICE_ERR_AQ_NO_WORK means that another driver has + * previously acquired the resource and performed any necessary updates; + * in this case the caller does not obtain the resource and has no + * further work to do. + */ + if (status == ICE_ERR_AQ_NO_WORK) + goto ice_acquire_res_exit; + + if (status) + DNPRINTF(ICE_DBG_RES, "resource %d acquire type %d failed.\n", + res, access); + + /* If necessary, poll until the current lock owner timeouts */ + timeout = time_left; + while (status && timeout && time_left) { + ice_msec_delay(delay, true); + timeout = (timeout > delay) ? timeout - delay : 0; + status = ice_aq_req_res(hw, res, access, 0, &time_left, NULL); + + if (status == ICE_ERR_AQ_NO_WORK) + /* lock free, but no work to do */ + break; + + if (!status) + /* lock acquired */ + break; + } + if (status && status != ICE_ERR_AQ_NO_WORK) + DNPRINTF(ICE_DBG_RES, "resource acquire timed out.\n"); + +ice_acquire_res_exit: + if (status == ICE_ERR_AQ_NO_WORK) { + if (access == ICE_RES_WRITE) + DNPRINTF(ICE_DBG_RES, + "resource indicates no work to do.\n"); + else + DNPRINTF(ICE_DBG_RES, + "Warning: ICE_ERR_AQ_NO_WORK not expected\n"); + } + return status; +} + +/** + * ice_release_res + * @hw: pointer to the HW structure + * @res: resource ID + * + * This function will release a resource using the proper Admin Command. + */ +void ice_release_res(struct ice_hw *hw, enum ice_aq_res_ids res) +{ + enum ice_status status; + uint32_t total_delay = 0; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + status = ice_aq_release_res(hw, res, 0, NULL); + + /* there are some rare cases when trying to release the resource + * results in an admin queue timeout, so handle them correctly + */ + while ((status == ICE_ERR_AQ_TIMEOUT) && + (total_delay < hw->adminq.sq_cmd_timeout)) { + ice_msec_delay(1, true); + status = ice_aq_release_res(hw, res, 0, NULL); + total_delay++; + } +} + +/* + * ice_aq_ver_check - Check the reported AQ API version + * Checks if the driver should load on a given AQ API version. + * Return: 'true' iff the driver should attempt to load. 'false' otherwise. + */ +bool +ice_aq_ver_check(struct ice_hw *hw) +{ + struct ice_softc *sc = hw->hw_sc; + + if (hw->api_maj_ver > EXP_FW_API_VER_MAJOR) { + /* Major API version is newer than expected, don't load */ + printf("%s: unsupported firmware API major version %u; " + "expected version is %u\n", sc->sc_dev.dv_xname, + hw->api_maj_ver, EXP_FW_API_VER_MAJOR); + return false; + } + + return true; +} + +/* + * ice_shutdown_sq - shutdown the transmit side of a control queue + * @hw: pointer to the hardware structure + * @cq: pointer to the specific Control queue + * + * The main shutdown routine for the Control Transmit Queue + */ +enum ice_status +ice_shutdown_sq(struct ice_hw *hw, struct ice_ctl_q_info *cq) +{ + enum ice_status ret_code = ICE_SUCCESS; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); +#if 0 + ice_acquire_lock(&cq->sq_lock); +#endif + if (!cq->sq.count) { + ret_code = ICE_ERR_NOT_READY; + goto shutdown_sq_out; + } + + /* Stop processing of the control queue */ + ICE_WRITE(hw, cq->sq.head, 0); + ICE_WRITE(hw, cq->sq.tail, 0); + ICE_WRITE(hw, cq->sq.len, 0); + ICE_WRITE(hw, cq->sq.bal, 0); + ICE_WRITE(hw, cq->sq.bah, 0); + + cq->sq.count = 0; /* to indicate uninitialized queue */ + + /* free ring buffers and the ring itself */ + ICE_FREE_CQ_BUFS(hw, cq, sq); + ice_free_cq_ring(hw, &cq->sq); + +shutdown_sq_out: +#if 0 + ice_release_lock(&cq->sq_lock); +#endif + return ret_code; +} + +/* + * ice_shutdown_rq - shutdown Control ARQ + * @hw: pointer to the hardware structure + * @cq: pointer to the specific Control queue + * + * The main shutdown routine for the Control Receive Queue + */ +enum ice_status +ice_shutdown_rq(struct ice_hw *hw, struct ice_ctl_q_info *cq) +{ + enum ice_status ret_code = ICE_SUCCESS; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); +#if 0 + ice_acquire_lock(&cq->rq_lock); +#endif + if (!cq->rq.count) { + ret_code = ICE_ERR_NOT_READY; + goto shutdown_rq_out; + } + + /* Stop Control Queue processing */ + ICE_WRITE(hw, cq->rq.head, 0); + ICE_WRITE(hw, cq->rq.tail, 0); + ICE_WRITE(hw, cq->rq.len, 0); + ICE_WRITE(hw, cq->rq.bal, 0); + ICE_WRITE(hw, cq->rq.bah, 0); + + /* set rq.count to 0 to indicate uninitialized queue */ + cq->rq.count = 0; + + /* free ring buffers and the ring itself */ + ICE_FREE_CQ_BUFS(hw, cq, rq); + ice_free_cq_ring(hw, &cq->rq); + +shutdown_rq_out: +#if 0 + ice_release_lock(&cq->rq_lock); +#endif + return ret_code; +} + +/* + * ice_init_check_adminq - Check version for Admin Queue to know if its alive + */ +enum ice_status +ice_init_check_adminq(struct ice_hw *hw) +{ + struct ice_ctl_q_info *cq = &hw->adminq; + enum ice_status status; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + status = ice_aq_get_fw_ver(hw, NULL); + if (status) + goto init_ctrlq_free_rq; + + if (!ice_aq_ver_check(hw)) { + status = ICE_ERR_FW_API_VER; + goto init_ctrlq_free_rq; + } + + return ICE_SUCCESS; + +init_ctrlq_free_rq: + ice_shutdown_rq(hw, cq); + ice_shutdown_sq(hw, cq); + return status; +} + +/* + * ice_init_ctrlq - main initialization routine for any control Queue + * @hw: pointer to the hardware structure + * @q_type: specific Control queue type + * + * Prior to calling this function, the driver *MUST* set the following fields + * in the cq->structure: + * - cq->num_sq_entries + * - cq->num_rq_entries + * - cq->rq_buf_size + * - cq->sq_buf_size + * + * NOTE: this function does not initialize the controlq locks + */ +enum ice_status +ice_init_ctrlq(struct ice_hw *hw, enum ice_ctl_q q_type) +{ + struct ice_ctl_q_info *cq; + enum ice_status ret_code; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + switch (q_type) { + case ICE_CTL_Q_ADMIN: + ice_adminq_init_regs(hw); + cq = &hw->adminq; + break; + case ICE_CTL_Q_MAILBOX: + ice_mailbox_init_regs(hw); + cq = &hw->mailboxq; + break; + default: + return ICE_ERR_PARAM; + } + cq->qtype = q_type; + + /* verify input for valid configuration */ + if (!cq->num_rq_entries || !cq->num_sq_entries || + !cq->rq_buf_size || !cq->sq_buf_size) { + return ICE_ERR_CFG; + } + + /* setup SQ command write back timeout */ + cq->sq_cmd_timeout = ICE_CTL_Q_SQ_CMD_TIMEOUT; + + /* allocate the ATQ */ + ret_code = ice_init_sq(hw, cq); + if (ret_code) + return ret_code; + + /* allocate the ARQ */ + ret_code = ice_init_rq(hw, cq); + if (ret_code) + goto init_ctrlq_free_sq; + + /* success! */ + return ICE_SUCCESS; + +init_ctrlq_free_sq: + ice_shutdown_sq(hw, cq); + return ret_code; +} + +/* + * ice_shutdown_ctrlq - shutdown routine for any control queue + * @hw: pointer to the hardware structure + * @q_type: specific Control queue type + * @unloading: is the driver unloading itself + * + * NOTE: this function does not destroy the control queue locks. + */ +void +ice_shutdown_ctrlq(struct ice_hw *hw, enum ice_ctl_q q_type, + bool unloading) +{ + struct ice_ctl_q_info *cq; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + switch (q_type) { + case ICE_CTL_Q_ADMIN: + cq = &hw->adminq; + if (ice_check_sq_alive(hw, cq)) + ice_aq_q_shutdown(hw, unloading); + break; + case ICE_CTL_Q_MAILBOX: + cq = &hw->mailboxq; + break; + default: + return; + } + + ice_shutdown_sq(hw, cq); + ice_shutdown_rq(hw, cq); +} + +/* + * ice_shutdown_all_ctrlq - shutdown routine for all control queues + * @hw: pointer to the hardware structure + * @unloading: is the driver unloading itself + * + * NOTE: this function does not destroy the control queue locks. The driver + * may call this at runtime to shutdown and later restart control queues, such + * as in response to a reset event. + */ +void +ice_shutdown_all_ctrlq(struct ice_hw *hw, bool unloading) +{ + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + /* Shutdown FW admin queue */ + ice_shutdown_ctrlq(hw, ICE_CTL_Q_ADMIN, unloading); + /* Shutdown PF-VF Mailbox */ + ice_shutdown_ctrlq(hw, ICE_CTL_Q_MAILBOX, unloading); +} + +/** + * ice_init_all_ctrlq - main initialization routine for all control queues + * @hw: pointer to the hardware structure + * + * Prior to calling this function, the driver MUST* set the following fields + * in the cq->structure for all control queues: + * - cq->num_sq_entries + * - cq->num_rq_entries + * - cq->rq_buf_size + * - cq->sq_buf_size + * + * NOTE: this function does not initialize the controlq locks. + */ +enum ice_status +ice_init_all_ctrlq(struct ice_hw *hw) +{ + enum ice_status status; + uint32_t retry = 0; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + /* Init FW admin queue */ + do { + status = ice_init_ctrlq(hw, ICE_CTL_Q_ADMIN); + if (status) + return status; + + status = ice_init_check_adminq(hw); + if (status != ICE_ERR_AQ_FW_CRITICAL) + break; + + DNPRINTF(ICE_DBG_AQ_MSG, "Retry Admin Queue init due to FW critical error\n"); + ice_shutdown_ctrlq(hw, ICE_CTL_Q_ADMIN, true); + ice_msec_delay(ICE_CTL_Q_ADMIN_INIT_MSEC, true); + } while (retry++ < ICE_CTL_Q_ADMIN_INIT_TIMEOUT); + + if (status) + return status; + + /* Init Mailbox queue */ + return ice_init_ctrlq(hw, ICE_CTL_Q_MAILBOX); +} + +/** + * ice_init_ctrlq_locks - Initialize locks for a control queue + * @cq: pointer to the control queue + * + * Initializes the send and receive queue locks for a given control queue. + */ +void +ice_init_ctrlq_locks(struct ice_ctl_q_info *cq) +{ + ice_init_lock(&cq->sq_lock); + ice_init_lock(&cq->rq_lock); +} + +/** + * ice_create_all_ctrlq - main initialization routine for all control queues + * @hw: pointer to the hardware structure + * + * Prior to calling this function, the driver *MUST* set the following fields + * in the cq->structure for all control queues: + * - cq->num_sq_entries + * - cq->num_rq_entries + * - cq->rq_buf_size + * - cq->sq_buf_size + * + * This function creates all the control queue locks and then calls + * ice_init_all_ctrlq. It should be called once during driver load. If the + * driver needs to re-initialize control queues at run time it should call + * ice_init_all_ctrlq instead. + */ +enum ice_status +ice_create_all_ctrlq(struct ice_hw *hw) +{ + ice_init_ctrlq_locks(&hw->adminq); + ice_init_ctrlq_locks(&hw->mailboxq); + + return ice_init_all_ctrlq(hw); +} + +/* + * ice_destroy_all_ctrlq - exit routine for all control queues + * + * This function shuts down all the control queues and then destroys the + * control queue locks. It should be called once during driver unload. The + * driver should call ice_shutdown_all_ctrlq if it needs to shut down and + * reinitialize control queues, such as in response to a reset event. + */ +void +ice_destroy_all_ctrlq(struct ice_hw *hw) +{ + /* shut down all the control queues first */ + ice_shutdown_all_ctrlq(hw, true); + + ice_destroy_ctrlq_locks(&hw->adminq); + ice_destroy_ctrlq_locks(&hw->mailboxq); +} + +/** + * ice_aq_fwlog_get - Get the current firmware logging configuration (0xFF32) + * @hw: pointer to the HW structure + * @cfg: firmware logging configuration to populate + */ +enum ice_status +ice_aq_fwlog_get(struct ice_hw *hw, struct ice_fwlog_cfg *cfg) +{ + struct ice_aqc_fw_log_cfg_resp *fw_modules; + struct ice_aqc_fw_log *cmd; + struct ice_aq_desc desc; + enum ice_status status; + uint16_t i, module_id_cnt; + void *buf; + + memset(cfg, 0, sizeof(*cfg)); + + buf = ice_calloc(hw, 1, ICE_AQ_MAX_BUF_LEN); + if (!buf) + return ICE_ERR_NO_MEMORY; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_fw_logs_query); + cmd = &desc.params.fw_log; + + cmd->cmd_flags = ICE_AQC_FW_LOG_AQ_QUERY; + + status = ice_aq_send_cmd(hw, &desc, buf, ICE_AQ_MAX_BUF_LEN, NULL); + if (status) { + DNPRINTF(ICE_DBG_FW_LOG, + "Failed to get FW log configuration\n"); + goto status_out; + } + + module_id_cnt = le16toh(cmd->ops.cfg.mdl_cnt); + if (module_id_cnt < ICE_AQC_FW_LOG_ID_MAX) { + DNPRINTF(ICE_DBG_FW_LOG, "FW returned less than the expected " + "number of FW log module IDs\n"); + } else { + if (module_id_cnt > ICE_AQC_FW_LOG_ID_MAX) + DNPRINTF(ICE_DBG_FW_LOG, "FW returned more than " + "expected number of FW log module IDs, setting " + "module_id_cnt to software expected max %u\n", + ICE_AQC_FW_LOG_ID_MAX); + module_id_cnt = ICE_AQC_FW_LOG_ID_MAX; + } + + cfg->log_resolution = le16toh(cmd->ops.cfg.log_resolution); + if (cmd->cmd_flags & ICE_AQC_FW_LOG_CONF_AQ_EN) + cfg->options |= ICE_FWLOG_OPTION_ARQ_ENA; + if (cmd->cmd_flags & ICE_AQC_FW_LOG_CONF_UART_EN) + cfg->options |= ICE_FWLOG_OPTION_UART_ENA; + if (cmd->cmd_flags & ICE_AQC_FW_LOG_QUERY_REGISTERED) + cfg->options |= ICE_FWLOG_OPTION_IS_REGISTERED; + + fw_modules = (struct ice_aqc_fw_log_cfg_resp *)buf; + + for (i = 0; i < module_id_cnt; i++) { + struct ice_aqc_fw_log_cfg_resp *fw_module = &fw_modules[i]; + + cfg->module_entries[i].module_id = + le16toh(fw_module->module_identifier); + cfg->module_entries[i].log_level = fw_module->log_level; + } + +status_out: + ice_free(hw, buf); + return status; +} + +/** + * ice_fwlog_set_support_ena - Set if FW logging is supported by FW + * @hw: pointer to the HW struct + * + * If FW returns success to the ice_aq_fwlog_get call then it supports FW + * logging, else it doesn't. Set the fwlog_support_ena flag accordingly. + * + * This function is only meant to be called during driver init to determine if + * the FW support FW logging. + */ +void +ice_fwlog_set_support_ena(struct ice_hw *hw) +{ + struct ice_fwlog_cfg *cfg; + enum ice_status status; + + hw->fwlog_support_ena = false; + + cfg = (struct ice_fwlog_cfg *)ice_calloc(hw, 1, sizeof(*cfg)); + if (!cfg) + return; + + /* don't call ice_fwlog_get() because that would overwrite the cached + * configuration from the call to ice_fwlog_init(), which is expected to + * be called prior to this function + */ + status = ice_aq_fwlog_get(hw, cfg); + if (status) + DNPRINTF(ICE_DBG_FW_LOG, "ice_fwlog_get failed, FW logging " + "is not supported on this version of FW, status %d\n", + status); + else + hw->fwlog_support_ena = true; + + ice_free(hw, cfg); +} + +/** + * ice_aq_fwlog_set - Set FW logging configuration AQ command (0xFF30) + * @hw: pointer to the HW structure + * @entries: entries to configure + * @num_entries: number of @entries + * @options: options from ice_fwlog_cfg->options structure + * @log_resolution: logging resolution + */ +enum ice_status +ice_aq_fwlog_set(struct ice_hw *hw, struct ice_fwlog_module_entry *entries, + uint16_t num_entries, uint16_t options, + uint16_t log_resolution) +{ + struct ice_aqc_fw_log_cfg_resp *fw_modules; + struct ice_aqc_fw_log *cmd; + struct ice_aq_desc desc; + enum ice_status status; + uint16_t i; + + fw_modules = (struct ice_aqc_fw_log_cfg_resp *) + ice_calloc(hw, num_entries, sizeof(*fw_modules)); + if (!fw_modules) + return ICE_ERR_NO_MEMORY; + + for (i = 0; i < num_entries; i++) { + fw_modules[i].module_identifier = htole16(entries[i].module_id); + fw_modules[i].log_level = entries[i].log_level; + } + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_fw_logs_config); + desc.flags |= htole16(ICE_AQ_FLAG_RD); + + cmd = &desc.params.fw_log; + + cmd->cmd_flags = ICE_AQC_FW_LOG_CONF_SET_VALID; + cmd->ops.cfg.log_resolution = htole16(log_resolution); + cmd->ops.cfg.mdl_cnt = htole16(num_entries); + + if (options & ICE_FWLOG_OPTION_ARQ_ENA) + cmd->cmd_flags |= ICE_AQC_FW_LOG_CONF_AQ_EN; + if (options & ICE_FWLOG_OPTION_UART_ENA) + cmd->cmd_flags |= ICE_AQC_FW_LOG_CONF_UART_EN; + + status = ice_aq_send_cmd(hw, &desc, fw_modules, + sizeof(*fw_modules) * num_entries, + NULL); + + ice_free(hw, fw_modules); + + return status; +} + +/** + * ice_fwlog_supported - Cached for whether FW supports FW logging or not + * @hw: pointer to the HW structure + * + * This will always return false if called before ice_init_hw(), so it must be + * called after ice_init_hw(). + */ +bool +ice_fwlog_supported(struct ice_hw *hw) +{ + return hw->fwlog_support_ena; +} + +/** + * ice_fwlog_valid_module_entries - validate all the module entry IDs and + * log levels + */ +bool +ice_fwlog_valid_module_entries(struct ice_hw *hw, + struct ice_fwlog_module_entry *entries, uint16_t num_entries) +{ + uint16_t i; + + if (!entries) { + DNPRINTF(ICE_DBG_FW_LOG, "Null ice_fwlog_module_entry array\n"); + return false; + } + + if (!num_entries) { + DNPRINTF(ICE_DBG_FW_LOG, "num_entries must be non-zero\n"); + return false; + } + + for (i = 0; i < num_entries; i++) { + struct ice_fwlog_module_entry *entry = &entries[i]; + + if (entry->module_id >= ICE_AQC_FW_LOG_ID_MAX) { + DNPRINTF(ICE_DBG_FW_LOG, + "Invalid module_id %u, max valid module_id is %u\n", + entry->module_id, ICE_AQC_FW_LOG_ID_MAX - 1); + return false; + } + + if (entry->log_level >= ICE_FWLOG_LEVEL_INVALID) { + DNPRINTF(ICE_DBG_FW_LOG, + "Invalid log_level %u, max valid log_level is %u\n", + entry->log_level, ICE_AQC_FW_LOG_ID_MAX - 1); + return false; + } + } + + return true; +} + +/** + * ice_fwlog_valid_cfg - validate entire configuration + * @hw: pointer to the HW structure + * @cfg: config to validate + */ +bool +ice_fwlog_valid_cfg(struct ice_hw *hw, struct ice_fwlog_cfg *cfg) +{ + if (!cfg) { + DNPRINTF(ICE_DBG_FW_LOG, "Null ice_fwlog_cfg\n"); + return false; + } + + if (cfg->log_resolution < ICE_AQC_FW_LOG_MIN_RESOLUTION || + cfg->log_resolution > ICE_AQC_FW_LOG_MAX_RESOLUTION) { + DNPRINTF(ICE_DBG_FW_LOG, "Unsupported log_resolution %u, " + "must be between %u and %u\n", + cfg->log_resolution, ICE_AQC_FW_LOG_MIN_RESOLUTION, + ICE_AQC_FW_LOG_MAX_RESOLUTION); + return false; + } + + if (!ice_fwlog_valid_module_entries(hw, cfg->module_entries, + ICE_AQC_FW_LOG_ID_MAX)) + return false; + + return true; +} + +/** + * ice_fwlog_set - Set the firmware logging settings + * @hw: pointer to the HW structure + * @cfg: config used to set firmware logging + * + * This function should be called whenever the driver needs to set the firmware + * logging configuration. It can be called on initialization, reset, or during + * runtime. + * + * If the PF wishes to receive FW logging then it must register via + * ice_fwlog_register. Note, that ice_fwlog_register does not need to be called + * for init. + */ +enum ice_status +ice_fwlog_set(struct ice_hw *hw, struct ice_fwlog_cfg *cfg) +{ + enum ice_status status; + + if (!ice_fwlog_supported(hw)) + return ICE_ERR_NOT_SUPPORTED; + + if (!ice_fwlog_valid_cfg(hw, cfg)) + return ICE_ERR_PARAM; + + status = ice_aq_fwlog_set(hw, cfg->module_entries, + ICE_AQC_FW_LOG_ID_MAX, cfg->options, + cfg->log_resolution); + if (!status) + hw->fwlog_cfg = *cfg; + + return status; +} + +/** + * ice_aq_fwlog_register - Register PF for firmware logging events (0xFF31) + * @hw: pointer to the HW structure + * @reg: true to register and false to unregister + */ +enum ice_status +ice_aq_fwlog_register(struct ice_hw *hw, bool reg) +{ + struct ice_aq_desc desc; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_fw_logs_register); + + if (reg) + desc.params.fw_log.cmd_flags = ICE_AQC_FW_LOG_AQ_REGISTER; + + return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL); +} + +/** + * ice_fwlog_register - Register the PF for firmware logging + * @hw: pointer to the HW structure + * + * After this call the PF will start to receive firmware logging based on the + * configuration set in ice_fwlog_set. + */ +enum ice_status +ice_fwlog_register(struct ice_hw *hw) +{ + enum ice_status status; + + if (!ice_fwlog_supported(hw)) + return ICE_ERR_NOT_SUPPORTED; + + status = ice_aq_fwlog_register(hw, true); + if (status) + DNPRINTF(ICE_DBG_FW_LOG, "Failed to register for firmware " + "logging events over ARQ\n"); + else + hw->fwlog_cfg.options |= ICE_FWLOG_OPTION_IS_REGISTERED; + + return status; +} + +/** + * ice_fwlog_unregister - Unregister the PF from firmware logging + * @hw: pointer to the HW structure + */ +enum ice_status +ice_fwlog_unregister(struct ice_hw *hw) +{ + enum ice_status status; + + if (!ice_fwlog_supported(hw)) + return ICE_ERR_NOT_SUPPORTED; + + status = ice_aq_fwlog_register(hw, false); + if (status) + DNPRINTF(ICE_DBG_FW_LOG, "Failed to unregister from " + "firmware logging events over ARQ\n"); + else + hw->fwlog_cfg.options &= ~ICE_FWLOG_OPTION_IS_REGISTERED; + + return status; +} + +/** + * ice_acquire_nvm - Generic request for acquiring the NVM ownership + * @hw: pointer to the HW structure + * @access: NVM access type (read or write) + * + * This function will request NVM ownership. + */ +enum ice_status +ice_acquire_nvm(struct ice_hw *hw, enum ice_aq_res_access_type access) +{ + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + if (hw->flash.blank_nvm_mode) + return ICE_SUCCESS; + + return ice_acquire_res(hw, ICE_NVM_RES_ID, access, ICE_NVM_TIMEOUT); +} + +/** + * ice_release_nvm - Generic request for releasing the NVM ownership + * @hw: pointer to the HW structure + * + * This function will release NVM ownership. + */ +void +ice_release_nvm(struct ice_hw *hw) +{ + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + if (hw->flash.blank_nvm_mode) + return; + + ice_release_res(hw, ICE_NVM_RES_ID); +} + +/** + * ice_get_flash_bank_offset - Get offset into requested flash bank + * @hw: pointer to the HW structure + * @bank: whether to read from the active or inactive flash bank + * @module: the module to read from + * + * Based on the module, lookup the module offset from the beginning of the + * flash. + * + * Returns the flash offset. Note that a value of zero is invalid and must be + * treated as an error. + */ +uint32_t ice_get_flash_bank_offset(struct ice_hw *hw, + enum ice_bank_select bank, uint16_t module) +{ + struct ice_bank_info *banks = &hw->flash.banks; + enum ice_flash_bank active_bank; + bool second_bank_active; + uint32_t offset, size; + + switch (module) { + case ICE_SR_1ST_NVM_BANK_PTR: + offset = banks->nvm_ptr; + size = banks->nvm_size; + active_bank = banks->nvm_bank; + break; + case ICE_SR_1ST_OROM_BANK_PTR: + offset = banks->orom_ptr; + size = banks->orom_size; + active_bank = banks->orom_bank; + break; + case ICE_SR_NETLIST_BANK_PTR: + offset = banks->netlist_ptr; + size = banks->netlist_size; + active_bank = banks->netlist_bank; + break; + default: + DNPRINTF(ICE_DBG_NVM, + "Unexpected value for flash module: 0x%04x\n", module); + return 0; + } + + switch (active_bank) { + case ICE_1ST_FLASH_BANK: + second_bank_active = false; + break; + case ICE_2ND_FLASH_BANK: + second_bank_active = true; + break; + default: + DNPRINTF(ICE_DBG_NVM, + "Unexpected value for active flash bank: %u\n", + active_bank); + return 0; + } + + /* The second flash bank is stored immediately following the first + * bank. Based on whether the 1st or 2nd bank is active, and whether + * we want the active or inactive bank, calculate the desired offset. + */ + switch (bank) { + case ICE_ACTIVE_FLASH_BANK: + return offset + (second_bank_active ? size : 0); + case ICE_INACTIVE_FLASH_BANK: + return offset + (second_bank_active ? 0 : size); + } + + DNPRINTF(ICE_DBG_NVM, + "Unexpected value for flash bank selection: %u\n", bank); + + return 0; +} + +/** + * ice_aq_read_nvm + * @hw: pointer to the HW struct + * @module_typeid: module pointer location in words from the NVM beginning + * @offset: byte offset from the module beginning + * @length: length of the section to be read (in bytes from the offset) + * @data: command buffer (size [bytes] = length) + * @last_command: tells if this is the last command in a series + * @read_shadow_ram: tell if this is a shadow RAM read + * @cd: pointer to command details structure or NULL + * + * Read the NVM using the admin queue commands (0x0701) + */ +enum ice_status +ice_aq_read_nvm(struct ice_hw *hw, uint16_t module_typeid, uint32_t offset, + uint16_t length, void *data, bool last_command, bool read_shadow_ram, + struct ice_sq_cd *cd) +{ + struct ice_aq_desc desc; + struct ice_aqc_nvm *cmd; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + cmd = &desc.params.nvm; + + if (offset > ICE_AQC_NVM_MAX_OFFSET) + return ICE_ERR_PARAM; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_nvm_read); + + if (!read_shadow_ram && module_typeid == ICE_AQC_NVM_START_POINT) + cmd->cmd_flags |= ICE_AQC_NVM_FLASH_ONLY; + + /* If this is the last command in a series, set the proper flag. */ + if (last_command) + cmd->cmd_flags |= ICE_AQC_NVM_LAST_CMD; + cmd->module_typeid = htole16(module_typeid); + cmd->offset_low = htole16(offset & 0xFFFF); + cmd->offset_high = (offset >> 16) & 0xFF; + cmd->length = htole16(length); + + return ice_aq_send_cmd(hw, &desc, data, length, cd); +} + +/** + * ice_read_flat_nvm - Read portion of NVM by flat offset + * @hw: pointer to the HW struct + * @offset: offset from beginning of NVM + * @length: (in) number of bytes to read; (out) number of bytes actually read + * @data: buffer to return data in (sized to fit the specified length) + * @read_shadow_ram: if true, read from shadow RAM instead of NVM + * + * Reads a portion of the NVM, as a flat memory space. This function correctly + * breaks read requests across Shadow RAM sectors and ensures that no single + * read request exceeds the maximum 4KB read for a single AdminQ command. + * + * Returns a status code on failure. Note that the data pointer may be + * partially updated if some reads succeed before a failure. + */ +enum ice_status +ice_read_flat_nvm(struct ice_hw *hw, uint32_t offset, uint32_t *length, + uint8_t *data, bool read_shadow_ram) +{ + enum ice_status status; + uint32_t inlen = *length; + uint32_t bytes_read = 0; + bool last_cmd; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + *length = 0; + + /* Verify the length of the read if this is for the Shadow RAM */ + if (read_shadow_ram && ((offset + inlen) > (hw->flash.sr_words * 2u))) { + DNPRINTF(ICE_DBG_NVM, + "NVM error: requested data is beyond Shadow RAM limit\n"); + return ICE_ERR_PARAM; + } + + do { + uint32_t read_size, sector_offset; + + /* ice_aq_read_nvm cannot read more than 4KB at a time. + * Additionally, a read from the Shadow RAM may not cross over + * a sector boundary. Conveniently, the sector size is also + * 4KB. + */ + sector_offset = offset % ICE_AQ_MAX_BUF_LEN; + read_size = MIN(ICE_AQ_MAX_BUF_LEN - sector_offset, + inlen - bytes_read); + + last_cmd = !(bytes_read + read_size < inlen); + + /* ice_aq_read_nvm takes the length as a u16. Our read_size is + * calculated using a u32, but the ICE_AQ_MAX_BUF_LEN maximum + * size guarantees that it will fit within the 2 bytes. + */ + status = ice_aq_read_nvm(hw, ICE_AQC_NVM_START_POINT, + offset, (uint16_t)read_size, data + bytes_read, last_cmd, + read_shadow_ram, NULL); + if (status) + break; + + bytes_read += read_size; + offset += read_size; + } while (!last_cmd); + + *length = bytes_read; + return status; +} + +/** + * ice_discover_flash_size - Discover the available flash size + * @hw: pointer to the HW struct + * + * The device flash could be up to 16MB in size. However, it is possible that + * the actual size is smaller. Use bisection to determine the accessible size + * of flash memory. + */ +enum ice_status +ice_discover_flash_size(struct ice_hw *hw) +{ + uint32_t min_size = 0, max_size = ICE_AQC_NVM_MAX_OFFSET + 1; + enum ice_status status; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + status = ice_acquire_nvm(hw, ICE_RES_READ); + if (status) + return status; + + while ((max_size - min_size) > 1) { + uint32_t offset = (max_size + min_size) / 2; + uint32_t len = 1; + uint8_t data; + + status = ice_read_flat_nvm(hw, offset, &len, &data, false); + if (status == ICE_ERR_AQ_ERROR && + hw->adminq.sq_last_status == ICE_AQ_RC_EINVAL) { + DNPRINTF(ICE_DBG_NVM, + "%s: New upper bound of %u bytes\n", __func__, + offset); + status = ICE_SUCCESS; + max_size = offset; + } else if (!status) { + DNPRINTF(ICE_DBG_NVM, + "%s: New lower bound of %u bytes\n", __func__, + offset); + min_size = offset; + } else { + /* an unexpected error occurred */ + goto err_read_flat_nvm; + } + } + + DNPRINTF(ICE_DBG_NVM, "Predicted flash size is %u bytes\n", max_size); + + hw->flash.flash_size = max_size; + +err_read_flat_nvm: + ice_release_nvm(hw); + + return status; +} + +/** + * ice_read_sr_word_aq - Reads Shadow RAM via AQ + * @hw: pointer to the HW structure + * @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF) + * @data: word read from the Shadow RAM + * + * Reads one 16 bit word from the Shadow RAM using ice_read_flat_nvm. + */ +enum ice_status +ice_read_sr_word_aq(struct ice_hw *hw, uint16_t offset, uint16_t *data) +{ + uint32_t bytes = sizeof(uint16_t); + enum ice_status status; + uint16_t data_local; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + /* Note that ice_read_flat_nvm checks if the read is past the Shadow + * RAM size, and ensures we don't read across a Shadow RAM sector + * boundary + */ + status = ice_read_flat_nvm(hw, offset * sizeof(uint16_t), &bytes, + (uint8_t *)&data_local, true); + if (status) + return status; + + *data = le16toh(data_local); + return ICE_SUCCESS; +} + +/** + * ice_read_sr_word - Reads Shadow RAM word and acquire NVM if necessary + * @hw: pointer to the HW structure + * @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF) + * @data: word read from the Shadow RAM + * + * Reads one 16 bit word from the Shadow RAM using the ice_read_sr_word_aq. + */ +enum ice_status +ice_read_sr_word(struct ice_hw *hw, uint16_t offset, uint16_t *data) +{ + enum ice_status status; + + status = ice_acquire_nvm(hw, ICE_RES_READ); + if (!status) { + status = ice_read_sr_word_aq(hw, offset, data); + ice_release_nvm(hw); + } + + return status; +} + +/** + * ice_read_sr_pointer - Read the value of a Shadow RAM pointer word + * @hw: pointer to the HW structure + * @offset: the word offset of the Shadow RAM word to read + * @pointer: pointer value read from Shadow RAM + * + * Read the given Shadow RAM word, and convert it to a pointer value specified + * in bytes. This function assumes the specified offset is a valid pointer + * word. + * + * Each pointer word specifies whether it is stored in word size or 4KB + * sector size by using the highest bit. The reported pointer value will be in + * bytes, intended for flat NVM reads. + */ +enum ice_status +ice_read_sr_pointer(struct ice_hw *hw, uint16_t offset, uint32_t *pointer) +{ + enum ice_status status; + uint16_t value; + + status = ice_read_sr_word(hw, offset, &value); + if (status) + return status; + + /* Determine if the pointer is in 4KB or word units */ + if (value & ICE_SR_NVM_PTR_4KB_UNITS) + *pointer = (value & ~ICE_SR_NVM_PTR_4KB_UNITS) * 4 * 1024; + else + *pointer = value * 2; + + return ICE_SUCCESS; +} + +/** + * ice_read_sr_area_size - Read an area size from a Shadow RAM word + * @hw: pointer to the HW structure + * @offset: the word offset of the Shadow RAM to read + * @size: size value read from the Shadow RAM + * + * Read the given Shadow RAM word, and convert it to an area size value + * specified in bytes. This function assumes the specified offset is a valid + * area size word. + * + * Each area size word is specified in 4KB sector units. This function reports + * the size in bytes, intended for flat NVM reads. + */ +enum ice_status +ice_read_sr_area_size(struct ice_hw *hw, uint16_t offset, uint32_t *size) +{ + enum ice_status status; + uint16_t value; + + status = ice_read_sr_word(hw, offset, &value); + if (status) + return status; + + /* Area sizes are always specified in 4KB units */ + *size = value * 4 * 1024; + + return ICE_SUCCESS; +} + +/** + * ice_determine_active_flash_banks - Discover active bank for each module + * @hw: pointer to the HW struct + * + * Read the Shadow RAM control word and determine which banks are active for + * the NVM, OROM, and Netlist modules. Also read and calculate the associated + * pointer and size. These values are then cached into the ice_flash_info + * structure for later use in order to calculate the correct offset to read + * from the active module. + */ +enum ice_status +ice_determine_active_flash_banks(struct ice_hw *hw) +{ + struct ice_bank_info *banks = &hw->flash.banks; + enum ice_status status; + uint16_t ctrl_word; + + status = ice_read_sr_word(hw, ICE_SR_NVM_CTRL_WORD, &ctrl_word); + if (status) { + DNPRINTF(ICE_DBG_NVM, + "Failed to read the Shadow RAM control word\n"); + return status; + } + + /* Check that the control word indicates validity */ + if ((ctrl_word & ICE_SR_CTRL_WORD_1_M) >> ICE_SR_CTRL_WORD_1_S != + ICE_SR_CTRL_WORD_VALID) { + DNPRINTF(ICE_DBG_NVM, "Shadow RAM control word is invalid\n"); + return ICE_ERR_CFG; + } + + if (!(ctrl_word & ICE_SR_CTRL_WORD_NVM_BANK)) + banks->nvm_bank = ICE_1ST_FLASH_BANK; + else + banks->nvm_bank = ICE_2ND_FLASH_BANK; + + if (!(ctrl_word & ICE_SR_CTRL_WORD_OROM_BANK)) + banks->orom_bank = ICE_1ST_FLASH_BANK; + else + banks->orom_bank = ICE_2ND_FLASH_BANK; + + if (!(ctrl_word & ICE_SR_CTRL_WORD_NETLIST_BANK)) + banks->netlist_bank = ICE_1ST_FLASH_BANK; + else + banks->netlist_bank = ICE_2ND_FLASH_BANK; + + status = ice_read_sr_pointer(hw, ICE_SR_1ST_NVM_BANK_PTR, &banks->nvm_ptr); + if (status) { + DNPRINTF(ICE_DBG_NVM, "Failed to read NVM bank pointer\n"); + return status; + } + + status = ice_read_sr_area_size(hw, ICE_SR_NVM_BANK_SIZE, &banks->nvm_size); + if (status) { + DNPRINTF(ICE_DBG_NVM, "Failed to read NVM bank area size\n"); + return status; + } + + status = ice_read_sr_pointer(hw, ICE_SR_1ST_OROM_BANK_PTR, &banks->orom_ptr); + if (status) { + DNPRINTF(ICE_DBG_NVM, "Failed to read OROM bank pointer\n"); + return status; + } + + status = ice_read_sr_area_size(hw, ICE_SR_OROM_BANK_SIZE, &banks->orom_size); + if (status) { + DNPRINTF(ICE_DBG_NVM, "Failed to read OROM bank area size\n"); + return status; + } + + status = ice_read_sr_pointer(hw, ICE_SR_NETLIST_BANK_PTR, &banks->netlist_ptr); + if (status) { + DNPRINTF(ICE_DBG_NVM, "Failed to read Netlist bank pointer\n"); + return status; + } + + status = ice_read_sr_area_size(hw, ICE_SR_NETLIST_BANK_SIZE, + &banks->netlist_size); + if (status) { + DNPRINTF(ICE_DBG_NVM, + "Failed to read Netlist bank area size\n"); + return status; + } + + return ICE_SUCCESS; +} + +/** + * ice_read_flash_module - Read a word from one of the main NVM modules + * @hw: pointer to the HW structure + * @bank: which bank of the module to read + * @module: the module to read + * @offset: the offset into the module in bytes + * @data: storage for the word read from the flash + * @length: bytes of data to read + * + * Read data from the specified flash module. The bank parameter indicates + * whether or not to read from the active bank or the inactive bank of that + * module. + * + * The word will be read using flat NVM access, and relies on the + * hw->flash.banks data being setup by ice_determine_active_flash_banks() + * during initialization. + */ +enum ice_status +ice_read_flash_module(struct ice_hw *hw, enum ice_bank_select bank, + uint16_t module, uint32_t offset, uint8_t *data, uint32_t length) +{ + enum ice_status status; + uint32_t start; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + start = ice_get_flash_bank_offset(hw, bank, module); + if (!start) { + DNPRINTF(ICE_DBG_NVM, + "Unable to calculate flash bank offset for module 0x%04x\n", + module); + return ICE_ERR_PARAM; + } + + status = ice_acquire_nvm(hw, ICE_RES_READ); + if (status) + return status; + + status = ice_read_flat_nvm(hw, start + offset, &length, data, false); + + ice_release_nvm(hw); + + return status; +} + +/** + * ice_read_nvm_module - Read from the active main NVM module + * @hw: pointer to the HW structure + * @bank: whether to read from active or inactive NVM module + * @offset: offset into the NVM module to read, in words + * @data: storage for returned word value + * + * Read the specified word from the active NVM module. This includes the CSS + * header at the start of the NVM module. + */ +enum ice_status +ice_read_nvm_module(struct ice_hw *hw, enum ice_bank_select bank, + uint32_t offset, uint16_t *data) +{ + enum ice_status status; + uint16_t data_local; + + status = ice_read_flash_module(hw, bank, ICE_SR_1ST_NVM_BANK_PTR, + offset * sizeof(uint16_t), (uint8_t *)&data_local, + sizeof(uint16_t)); + if (!status) + *data = le16toh(data_local); + + return status; +} + +/** + * ice_get_nvm_css_hdr_len - Read the CSS header length from the NVM CSS header + * @hw: pointer to the HW struct + * @bank: whether to read from the active or inactive flash bank + * @hdr_len: storage for header length in words + * + * Read the CSS header length from the NVM CSS header and add the Authentication + * header size, and then convert to words. + */ +enum ice_status +ice_get_nvm_css_hdr_len(struct ice_hw *hw, enum ice_bank_select bank, + uint32_t *hdr_len) +{ + uint16_t hdr_len_l, hdr_len_h; + enum ice_status status; + uint32_t hdr_len_dword; + + status = ice_read_nvm_module(hw, bank, ICE_NVM_CSS_HDR_LEN_L, + &hdr_len_l); + if (status) + return status; + + status = ice_read_nvm_module(hw, bank, ICE_NVM_CSS_HDR_LEN_H, + &hdr_len_h); + if (status) + return status; + + /* CSS header length is in DWORD, so convert to words and add + * authentication header size + */ + hdr_len_dword = hdr_len_h << 16 | hdr_len_l; + *hdr_len = (hdr_len_dword * 2) + ICE_NVM_AUTH_HEADER_LEN; + + return ICE_SUCCESS; +} + +/** + * ice_get_nvm_srev - Read the security revision from the NVM CSS header + * @hw: pointer to the HW struct + * @bank: whether to read from the active or inactive flash bank + * @srev: storage for security revision + * + * Read the security revision out of the CSS header of the active NVM module + * bank. + */ +enum ice_status ice_get_nvm_srev(struct ice_hw *hw, enum ice_bank_select bank, + uint32_t *srev) +{ + enum ice_status status; + uint16_t srev_l, srev_h; + + status = ice_read_nvm_module(hw, bank, ICE_NVM_CSS_SREV_L, &srev_l); + if (status) + return status; + + status = ice_read_nvm_module(hw, bank, ICE_NVM_CSS_SREV_H, &srev_h); + if (status) + return status; + + *srev = srev_h << 16 | srev_l; + + return ICE_SUCCESS; +} + +/** + * ice_read_nvm_sr_copy - Read a word from the Shadow RAM copy in the NVM bank + * @hw: pointer to the HW structure + * @bank: whether to read from the active or inactive NVM module + * @offset: offset into the Shadow RAM copy to read, in words + * @data: storage for returned word value + * + * Read the specified word from the copy of the Shadow RAM found in the + * specified NVM module. + */ +enum ice_status +ice_read_nvm_sr_copy(struct ice_hw *hw, enum ice_bank_select bank, + uint32_t offset, uint16_t *data) +{ + enum ice_status status; + uint32_t hdr_len; + + status = ice_get_nvm_css_hdr_len(hw, bank, &hdr_len); + if (status) + return status; + + hdr_len = roundup(hdr_len, 32); + + return ice_read_nvm_module(hw, bank, hdr_len + offset, data); +} + +/** + * ice_get_nvm_ver_info - Read NVM version information + * @hw: pointer to the HW struct + * @bank: whether to read from the active or inactive flash bank + * @nvm: pointer to NVM info structure + * + * Read the NVM EETRACK ID and map version of the main NVM image bank, filling + * in the NVM info structure. + */ +enum ice_status +ice_get_nvm_ver_info(struct ice_hw *hw, enum ice_bank_select bank, + struct ice_nvm_info *nvm) +{ + uint16_t eetrack_lo, eetrack_hi, ver; + enum ice_status status; + + status = ice_read_nvm_sr_copy(hw, bank, ICE_SR_NVM_DEV_STARTER_VER, + &ver); + if (status) { + DNPRINTF(ICE_DBG_NVM, "Failed to read DEV starter version.\n"); + return status; + } + + nvm->major = (ver & ICE_NVM_VER_HI_MASK) >> ICE_NVM_VER_HI_SHIFT; + nvm->minor = (ver & ICE_NVM_VER_LO_MASK) >> ICE_NVM_VER_LO_SHIFT; + + status = ice_read_nvm_sr_copy(hw, bank, ICE_SR_NVM_EETRACK_LO, + &eetrack_lo); + if (status) { + DNPRINTF(ICE_DBG_NVM, "Failed to read EETRACK lo.\n"); + return status; + } + status = ice_read_nvm_sr_copy(hw, bank, ICE_SR_NVM_EETRACK_HI, + &eetrack_hi); + if (status) { + DNPRINTF(ICE_DBG_NVM, "Failed to read EETRACK hi.\n"); + return status; + } + + nvm->eetrack = (eetrack_hi << 16) | eetrack_lo; + + status = ice_get_nvm_srev(hw, bank, &nvm->srev); + if (status) + DNPRINTF(ICE_DBG_NVM, + "Failed to read NVM security revision.\n"); + + return ICE_SUCCESS; +} + +/** + * ice_read_orom_module - Read from the active Option ROM module + * @hw: pointer to the HW structure + * @bank: whether to read from active or inactive OROM module + * @offset: offset into the OROM module to read, in words + * @data: storage for returned word value + * + * Read the specified word from the active Option ROM module of the flash. + * Note that unlike the NVM module, the CSS data is stored at the end of the + * module instead of at the beginning. + */ +enum ice_status +ice_read_orom_module(struct ice_hw *hw, enum ice_bank_select bank, + uint32_t offset, uint16_t *data) +{ + enum ice_status status; + uint16_t data_local; + + status = ice_read_flash_module(hw, bank, ICE_SR_1ST_OROM_BANK_PTR, + offset * sizeof(uint16_t), (uint8_t *)&data_local, + sizeof(uint16_t)); + if (!status) + *data = le16toh(data_local); + + return status; +} + +/** + * ice_get_orom_srev - Read the security revision from the OROM CSS header + * @hw: pointer to the HW struct + * @bank: whether to read from active or inactive flash module + * @srev: storage for security revision + * + * Read the security revision out of the CSS header of the active OROM module + * bank. + */ +enum ice_status +ice_get_orom_srev(struct ice_hw *hw, enum ice_bank_select bank, uint32_t *srev) +{ + uint32_t orom_size_word = hw->flash.banks.orom_size / 2; + enum ice_status status; + uint16_t srev_l, srev_h; + uint32_t css_start; + uint32_t hdr_len; + + status = ice_get_nvm_css_hdr_len(hw, bank, &hdr_len); + if (status) + return status; + + if (orom_size_word < hdr_len) { + DNPRINTF(ICE_DBG_NVM, "Unexpected Option ROM Size of %u\n", + hw->flash.banks.orom_size); + return ICE_ERR_CFG; + } + + /* calculate how far into the Option ROM the CSS header starts. Note + * that ice_read_orom_module takes a word offset + */ + css_start = orom_size_word - hdr_len; + status = ice_read_orom_module(hw, bank, css_start + ICE_NVM_CSS_SREV_L, + &srev_l); + if (status) + return status; + + status = ice_read_orom_module(hw, bank, css_start + ICE_NVM_CSS_SREV_H, + &srev_h); + if (status) + return status; + + *srev = srev_h << 16 | srev_l; + + return ICE_SUCCESS; +} + +/** + * ice_get_orom_civd_data - Get the combo version information from Option ROM + * @hw: pointer to the HW struct + * @bank: whether to read from the active or inactive flash module + * @civd: storage for the Option ROM CIVD data. + * + * Searches through the Option ROM flash contents to locate the CIVD data for + * the image. + */ +enum ice_status +ice_get_orom_civd_data(struct ice_hw *hw, enum ice_bank_select bank, + struct ice_orom_civd_info *civd) +{ + uint8_t *orom_data; + enum ice_status status; + uint32_t offset; + + /* The CIVD section is located in the Option ROM aligned to 512 bytes. + * The first 4 bytes must contain the ASCII characters "$CIV". + * A simple modulo 256 sum of all of the bytes of the structure must + * equal 0. + * + * The exact location is unknown and varies between images but is + * usually somewhere in the middle of the bank. We need to scan the + * Option ROM bank to locate it. + * + * It's significantly faster to read the entire Option ROM up front + * using the maximum page size, than to read each possible location + * with a separate firmware command. + */ + orom_data = (uint8_t *)ice_calloc(hw, hw->flash.banks.orom_size, + sizeof(uint8_t)); + if (!orom_data) + return ICE_ERR_NO_MEMORY; + + status = ice_read_flash_module(hw, bank, ICE_SR_1ST_OROM_BANK_PTR, 0, + orom_data, hw->flash.banks.orom_size); + if (status) { + DNPRINTF(ICE_DBG_NVM, "Unable to read Option ROM data\n"); + goto exit_error; + } + + /* Scan the memory buffer to locate the CIVD data section */ + for (offset = 0; (offset + 512) <= hw->flash.banks.orom_size; + offset += 512) { + struct ice_orom_civd_info *tmp; + uint8_t sum = 0, i; + + tmp = (struct ice_orom_civd_info *)&orom_data[offset]; + + /* Skip forward until we find a matching signature */ + if (memcmp("$CIV", tmp->signature, sizeof(tmp->signature)) != 0) + continue; + + DNPRINTF(ICE_DBG_NVM, "Found CIVD section at offset %u\n", + offset); + + /* Verify that the simple checksum is zero */ + for (i = 0; i < sizeof(*tmp); i++) + sum += ((uint8_t *)tmp)[i]; + + if (sum) { + DNPRINTF(ICE_DBG_NVM, + "Found CIVD data with invalid checksum of %u\n", + sum); + status = ICE_ERR_NVM; + goto exit_error; + } + + *civd = *tmp; + ice_free(hw, orom_data); + return ICE_SUCCESS; + } + + status = ICE_ERR_NVM; + DNPRINTF(ICE_DBG_NVM, + "Unable to locate CIVD data within the Option ROM\n"); + +exit_error: + ice_free(hw, orom_data); + return status; +} + +/** + * ice_get_orom_ver_info - Read Option ROM version information + * @hw: pointer to the HW struct + * @bank: whether to read from the active or inactive flash module + * @orom: pointer to Option ROM info structure + * + * Read Option ROM version and security revision from the Option ROM flash + * section. + */ +enum ice_status +ice_get_orom_ver_info(struct ice_hw *hw, enum ice_bank_select bank, + struct ice_orom_info *orom) +{ + struct ice_orom_civd_info civd; + enum ice_status status; + uint32_t combo_ver; + + status = ice_get_orom_civd_data(hw, bank, &civd); + if (status) { + DNPRINTF(ICE_DBG_NVM, + "Failed to locate valid Option ROM CIVD data\n"); + return status; + } + + combo_ver = le32toh(civd.combo_ver); + + orom->major = (uint8_t)((combo_ver & ICE_OROM_VER_MASK) >> + ICE_OROM_VER_SHIFT); + orom->patch = (uint8_t)(combo_ver & ICE_OROM_VER_PATCH_MASK); + orom->build = (uint16_t)((combo_ver & ICE_OROM_VER_BUILD_MASK) >> + ICE_OROM_VER_BUILD_SHIFT); + + status = ice_get_orom_srev(hw, bank, &orom->srev); + if (status) { + DNPRINTF(ICE_DBG_NVM, + "Failed to read Option ROM security revision.\n"); + return status; + } + + return ICE_SUCCESS; +} + +/** + * ice_read_netlist_module - Read data from the netlist module area + * @hw: pointer to the HW structure + * @bank: whether to read from the active or inactive module + * @offset: offset into the netlist to read from + * @data: storage for returned word value + * + * Read a word from the specified netlist bank. + */ +enum ice_status +ice_read_netlist_module(struct ice_hw *hw, enum ice_bank_select bank, + uint32_t offset, uint16_t *data) +{ + enum ice_status status; + uint16_t data_local; + + status = ice_read_flash_module(hw, bank, ICE_SR_NETLIST_BANK_PTR, + offset * sizeof(uint16_t), (uint8_t *)&data_local, + sizeof(uint16_t)); + if (!status) + *data = le16toh(data_local); + + return status; +} + +/** + * ice_get_netlist_info + * @hw: pointer to the HW struct + * @bank: whether to read from the active or inactive flash bank + * @netlist: pointer to netlist version info structure + * + * Get the netlist version information from the requested bank. Reads the Link + * Topology section to find the Netlist ID block and extract the relevant + * information into the netlist version structure. + */ +enum ice_status +ice_get_netlist_info(struct ice_hw *hw, enum ice_bank_select bank, + struct ice_netlist_info *netlist) +{ + uint16_t module_id, length, node_count, i; + enum ice_status status; + uint16_t *id_blk; + + status = ice_read_netlist_module(hw, bank, ICE_NETLIST_TYPE_OFFSET, + &module_id); + if (status) + return status; + + if (module_id != ICE_NETLIST_LINK_TOPO_MOD_ID) { + DNPRINTF(ICE_DBG_NVM, + "Expected netlist module_id ID of 0x%04x, but got 0x%04x\n", + ICE_NETLIST_LINK_TOPO_MOD_ID, module_id); + return ICE_ERR_NVM; + } + + status = ice_read_netlist_module(hw, bank, ICE_LINK_TOPO_MODULE_LEN, + &length); + if (status) + return status; + + if (length < ICE_NETLIST_ID_BLK_SIZE) { + DNPRINTF(ICE_DBG_NVM, "Netlist Link Topology module too small. " + "Expected at least %u words, but got %u words.\n", + ICE_NETLIST_ID_BLK_SIZE, length); + return ICE_ERR_NVM; + } + + status = ice_read_netlist_module(hw, bank, ICE_LINK_TOPO_NODE_COUNT, + &node_count); + if (status) + return status; + node_count &= ICE_LINK_TOPO_NODE_COUNT_M; + + id_blk = (uint16_t *)ice_calloc(hw, ICE_NETLIST_ID_BLK_SIZE, + sizeof(*id_blk)); + if (!id_blk) + return ICE_ERR_NO_MEMORY; + + /* Read out the entire Netlist ID Block at once. */ + status = ice_read_flash_module(hw, bank, ICE_SR_NETLIST_BANK_PTR, + ICE_NETLIST_ID_BLK_OFFSET(node_count) * sizeof(uint16_t), + (uint8_t *)id_blk, ICE_NETLIST_ID_BLK_SIZE * sizeof(uint16_t)); + if (status) + goto exit_error; + + for (i = 0; i < ICE_NETLIST_ID_BLK_SIZE; i++) + id_blk[i] = le16toh(((uint16_t *)id_blk)[i]); + + netlist->major = id_blk[ICE_NETLIST_ID_BLK_MAJOR_VER_HIGH] << 16 | + id_blk[ICE_NETLIST_ID_BLK_MAJOR_VER_LOW]; + netlist->minor = id_blk[ICE_NETLIST_ID_BLK_MINOR_VER_HIGH] << 16 | + id_blk[ICE_NETLIST_ID_BLK_MINOR_VER_LOW]; + netlist->type = id_blk[ICE_NETLIST_ID_BLK_TYPE_HIGH] << 16 | + id_blk[ICE_NETLIST_ID_BLK_TYPE_LOW]; + netlist->rev = id_blk[ICE_NETLIST_ID_BLK_REV_HIGH] << 16 | + id_blk[ICE_NETLIST_ID_BLK_REV_LOW]; + netlist->cust_ver = id_blk[ICE_NETLIST_ID_BLK_CUST_VER]; + /* Read the left most 4 bytes of SHA */ + netlist->hash = id_blk[ICE_NETLIST_ID_BLK_SHA_HASH_WORD(15)] << 16 | + id_blk[ICE_NETLIST_ID_BLK_SHA_HASH_WORD(14)]; + +exit_error: + ice_free(hw, id_blk); + + return status; +} + +/** + * ice_init_nvm - initializes NVM setting + * @hw: pointer to the HW struct + * + * This function reads and populates NVM settings such as Shadow RAM size, + * max_timeout, and blank_nvm_mode + */ +enum ice_status +ice_init_nvm(struct ice_hw *hw) +{ + struct ice_flash_info *flash = &hw->flash; + enum ice_status status; + uint32_t fla, gens_stat; + uint8_t sr_size; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + /* The SR size is stored regardless of the NVM programming mode + * as the blank mode may be used in the factory line. + */ + gens_stat = ICE_READ(hw, GLNVM_GENS); + sr_size = (gens_stat & GLNVM_GENS_SR_SIZE_M) >> GLNVM_GENS_SR_SIZE_S; + + /* Switching to words (sr_size contains power of 2) */ + flash->sr_words = BIT(sr_size) * ICE_SR_WORDS_IN_1KB; + + /* Check if we are in the normal or blank NVM programming mode */ + fla = ICE_READ(hw, GLNVM_FLA); + if (fla & GLNVM_FLA_LOCKED_M) { /* Normal programming mode */ + flash->blank_nvm_mode = false; + } else { + /* Blank programming mode */ + flash->blank_nvm_mode = true; + DNPRINTF(ICE_DBG_NVM, + "NVM init error: unsupported blank mode.\n"); + return ICE_ERR_NVM_BLANK_MODE; + } + + status = ice_discover_flash_size(hw); + if (status) { + DNPRINTF(ICE_DBG_NVM, "NVM init error: failed to discover " + "flash size.\n"); + return status; + } + + status = ice_determine_active_flash_banks(hw); + if (status) { + DNPRINTF(ICE_DBG_NVM, "Failed to determine active flash " + "banks.\n"); + return status; + } + + status = ice_get_nvm_ver_info(hw, ICE_ACTIVE_FLASH_BANK, &flash->nvm); + if (status) { + DNPRINTF(ICE_DBG_INIT, "Failed to read NVM info.\n"); + return status; + } + + status = ice_get_orom_ver_info(hw, ICE_ACTIVE_FLASH_BANK, &flash->orom); + if (status) + DNPRINTF(ICE_DBG_INIT, "Failed to read Option ROM info.\n"); + + /* read the netlist version information */ + status = ice_get_netlist_info(hw, ICE_ACTIVE_FLASH_BANK, + &flash->netlist); + if (status) + DNPRINTF(ICE_DBG_INIT, "Failed to read netlist info.\n"); + + return ICE_SUCCESS; +} + +void +ice_print_rollback_msg(struct ice_hw *hw) +{ + struct ice_softc *sc = hw->hw_sc; + char nvm_str[ICE_NVM_VER_LEN] = { 0 }; + struct ice_orom_info *orom; + struct ice_nvm_info *nvm; + + orom = &hw->flash.orom; + nvm = &hw->flash.nvm; + + snprintf(nvm_str, sizeof(nvm_str), "%x.%02x 0x%x %d.%d.%d", + nvm->major, nvm->minor, nvm->eetrack, orom->major, + orom->build, orom->patch); + printf("%s: Firmware rollback mode detected. " + "Current version is NVM: %s, FW: %d.%d. " + "Device may exhibit limited functionality.\n", + sc->sc_dev.dv_xname, nvm_str, hw->fw_maj_ver, hw->fw_min_ver); +} + +/** + * ice_clear_pf_cfg - Clear PF configuration + * @hw: pointer to the hardware structure + * + * Clears any existing PF configuration (VSIs, VSI lists, switch rules, port + * configuration, flow director filters, etc.). + */ +enum ice_status +ice_clear_pf_cfg(struct ice_hw *hw) +{ + struct ice_aq_desc desc; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_pf_cfg); + + return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL); +} + +/** + * ice_aq_clear_pxe_mode + * @hw: pointer to the HW struct + * + * Tell the firmware that the driver is taking over from PXE (0x0110). + */ +enum ice_status +ice_aq_clear_pxe_mode(struct ice_hw *hw) +{ + struct ice_aq_desc desc; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_pxe_mode); + desc.params.clear_pxe.rx_cnt = ICE_AQC_CLEAR_PXE_RX_CNT; + + return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL); +} + +/** + * ice_clear_pxe_mode - clear pxe operations mode + * @hw: pointer to the HW struct + * + * Make sure all PXE mode settings are cleared, including things + * like descriptor fetch/write-back mode. + */ +void +ice_clear_pxe_mode(struct ice_hw *hw) +{ + if (ice_check_sq_alive(hw, &hw->adminq)) + ice_aq_clear_pxe_mode(hw); +} + +/** + * ice_get_num_per_func - determine number of resources per PF + * @hw: pointer to the HW structure + * @max: value to be evenly split between each PF + * + * Determine the number of valid functions by going through the bitmap returned + * from parsing capabilities and use this to calculate the number of resources + * per PF based on the max value passed in. + */ +uint32_t +ice_get_num_per_func(struct ice_hw *hw, uint32_t max) +{ + uint16_t funcs; + +#define ICE_CAPS_VALID_FUNCS_M 0xFF + funcs = ice_popcount16(hw->dev_caps.common_cap.valid_functions & + ICE_CAPS_VALID_FUNCS_M); + + if (!funcs) + return 0; + + return max / funcs; +} + +/** + * ice_print_led_caps - print LED capabilities + * @hw: pointer to the ice_hw instance + * @caps: pointer to common caps instance + * @prefix: string to prefix when printing + * @dbg: set to indicate debug print + */ +void +ice_print_led_caps(struct ice_hw *hw, struct ice_hw_common_caps *caps, + char const *prefix, bool dbg) +{ + struct ice_softc *sc = hw->hw_sc; + uint8_t i; + + if (dbg) + DNPRINTF(ICE_DBG_INIT, "%s: led_pin_num = %d\n", prefix, + caps->led_pin_num); + else + printf("%s: %s: led_pin_num = %d\n", sc->sc_dev.dv_xname, + prefix, caps->led_pin_num); + + for (i = 0; i < ICE_MAX_SUPPORTED_GPIO_LED; i++) { + if (!caps->led[i]) + continue; + + if (dbg) + DNPRINTF(ICE_DBG_INIT, "%s: led[%d] = %d\n", + prefix, i, caps->led[i]); + else + printf("%s: %s: led[%d] = %d\n", sc->sc_dev.dv_xname, + prefix, i, caps->led[i]); + } +} + +/** + * ice_print_sdp_caps - print SDP capabilities + * @hw: pointer to the ice_hw instance + * @caps: pointer to common caps instance + * @prefix: string to prefix when printing + * @dbg: set to indicate debug print + */ +void +ice_print_sdp_caps(struct ice_hw *hw, struct ice_hw_common_caps *caps, + char const *prefix, bool dbg) +{ + struct ice_softc *sc = hw->hw_sc; + uint8_t i; + + if (dbg) + DNPRINTF(ICE_DBG_INIT, "%s: sdp_pin_num = %d\n", prefix, + caps->sdp_pin_num); + else + printf("%s: %s: sdp_pin_num = %d\n", sc->sc_dev.dv_xname, + prefix, caps->sdp_pin_num); + + for (i = 0; i < ICE_MAX_SUPPORTED_GPIO_SDP; i++) { + if (!caps->sdp[i]) + continue; + + if (dbg) + DNPRINTF(ICE_DBG_INIT, "%s: sdp[%d] = %d\n", + prefix, i, caps->sdp[i]); + else + printf("%s: %s: sdp[%d] = %d\n", sc->sc_dev.dv_xname, + prefix, i, caps->sdp[i]); + } +} + +/** + * ice_parse_common_caps - parse common device/function capabilities + * @hw: pointer to the HW struct + * @caps: pointer to common capabilities structure + * @elem: the capability element to parse + * @prefix: message prefix for tracing capabilities + * + * Given a capability element, extract relevant details into the common + * capability structure. + * + * Returns: true if the capability matches one of the common capability ids, + * false otherwise. + */ +bool +ice_parse_common_caps(struct ice_hw *hw, struct ice_hw_common_caps *caps, + struct ice_aqc_list_caps_elem *elem, const char *prefix) +{ + uint32_t logical_id = le32toh(elem->logical_id); + uint32_t phys_id = le32toh(elem->phys_id); + uint32_t number = le32toh(elem->number); + uint16_t cap = le16toh(elem->cap); + bool found = true; + + switch (cap) { + case ICE_AQC_CAPS_SWITCHING_MODE: + caps->switching_mode = number; + DNPRINTF(ICE_DBG_INIT, "%s: switching_mode = %d\n", prefix, + caps->switching_mode); + break; + case ICE_AQC_CAPS_MANAGEABILITY_MODE: + caps->mgmt_mode = number; + caps->mgmt_protocols_mctp = logical_id; + DNPRINTF(ICE_DBG_INIT, "%s: mgmt_mode = %d\n", prefix, + caps->mgmt_mode); + DNPRINTF(ICE_DBG_INIT, "%s: mgmt_protocols_mctp = %d\n", prefix, + caps->mgmt_protocols_mctp); + break; + case ICE_AQC_CAPS_OS2BMC: + caps->os2bmc = number; + DNPRINTF(ICE_DBG_INIT, "%s: os2bmc = %d\n", prefix, + caps->os2bmc); + break; + case ICE_AQC_CAPS_VALID_FUNCTIONS: + caps->valid_functions = number; + DNPRINTF(ICE_DBG_INIT, "%s: valid_functions (bitmap) = %d\n", + prefix, caps->valid_functions); + break; + case ICE_AQC_CAPS_SRIOV: + caps->sr_iov_1_1 = (number == 1); + DNPRINTF(ICE_DBG_INIT, "%s: sr_iov_1_1 = %d\n", prefix, + caps->sr_iov_1_1); + break; + case ICE_AQC_CAPS_VMDQ: + caps->vmdq = (number == 1); + DNPRINTF(ICE_DBG_INIT, "%s: vmdq = %d\n", prefix, caps->vmdq); + break; + case ICE_AQC_CAPS_802_1QBG: + caps->evb_802_1_qbg = (number == 1); + DNPRINTF(ICE_DBG_INIT, "%s: evb_802_1_qbg = %d\n", prefix, + number); + break; + case ICE_AQC_CAPS_802_1BR: + caps->evb_802_1_qbh = (number == 1); + DNPRINTF(ICE_DBG_INIT, "%s: evb_802_1_qbh = %d\n", prefix, + number); + break; + case ICE_AQC_CAPS_DCB: + caps->dcb = (number == 1); + caps->active_tc_bitmap = logical_id; + caps->maxtc = phys_id; + DNPRINTF(ICE_DBG_INIT, "%s: dcb = %d\n", prefix, caps->dcb); + DNPRINTF(ICE_DBG_INIT, "%s: active_tc_bitmap = %d\n", prefix, + caps->active_tc_bitmap); + DNPRINTF(ICE_DBG_INIT, "%s: maxtc = %d\n", prefix, caps->maxtc); + break; + case ICE_AQC_CAPS_ISCSI: + caps->iscsi = (number == 1); + DNPRINTF(ICE_DBG_INIT, "%s: iscsi = %d\n", prefix, caps->iscsi); + break; + case ICE_AQC_CAPS_RSS: + caps->rss_table_size = number; + caps->rss_table_entry_width = logical_id; + DNPRINTF(ICE_DBG_INIT, "%s: rss_table_size = %d\n", prefix, + caps->rss_table_size); + DNPRINTF(ICE_DBG_INIT, "%s: rss_table_entry_width = %d\n", + prefix, caps->rss_table_entry_width); + break; + case ICE_AQC_CAPS_RXQS: + caps->num_rxq = number; + caps->rxq_first_id = phys_id; + DNPRINTF(ICE_DBG_INIT, "%s: num_rxq = %d\n", prefix, + caps->num_rxq); + DNPRINTF(ICE_DBG_INIT, "%s: rxq_first_id = %d\n", prefix, + caps->rxq_first_id); + break; + case ICE_AQC_CAPS_TXQS: + caps->num_txq = number; + caps->txq_first_id = phys_id; + DNPRINTF(ICE_DBG_INIT, "%s: num_txq = %d\n", prefix, + caps->num_txq); + DNPRINTF(ICE_DBG_INIT, "%s: txq_first_id = %d\n", prefix, + caps->txq_first_id); + break; + case ICE_AQC_CAPS_MSIX: + caps->num_msix_vectors = number; + caps->msix_vector_first_id = phys_id; + DNPRINTF(ICE_DBG_INIT, "%s: num_msix_vectors = %d\n", prefix, + caps->num_msix_vectors); + DNPRINTF(ICE_DBG_INIT, "%s: msix_vector_first_id = %d\n", + prefix, caps->msix_vector_first_id); + break; + case ICE_AQC_CAPS_NVM_MGMT: + caps->sec_rev_disabled = + (number & ICE_NVM_MGMT_SEC_REV_DISABLED) ? + true : false; + DNPRINTF(ICE_DBG_INIT, "%s: sec_rev_disabled = %d\n", prefix, + caps->sec_rev_disabled); + caps->update_disabled = + (number & ICE_NVM_MGMT_UPDATE_DISABLED) ? + true : false; + DNPRINTF(ICE_DBG_INIT, "%s: update_disabled = %d\n", prefix, + caps->update_disabled); + caps->nvm_unified_update = + (number & ICE_NVM_MGMT_UNIFIED_UPD_SUPPORT) ? + true : false; + DNPRINTF(ICE_DBG_INIT, "%s: nvm_unified_update = %d\n", prefix, + caps->nvm_unified_update); + caps->netlist_auth = + (number & ICE_NVM_MGMT_NETLIST_AUTH_SUPPORT) ? + true : false; + DNPRINTF(ICE_DBG_INIT, "%s: netlist_auth = %d\n", prefix, + caps->netlist_auth); + break; + case ICE_AQC_CAPS_CEM: + caps->mgmt_cem = (number == 1); + DNPRINTF(ICE_DBG_INIT, "%s: mgmt_cem = %d\n", prefix, + caps->mgmt_cem); + break; + case ICE_AQC_CAPS_IWARP: + caps->iwarp = (number == 1); + DNPRINTF(ICE_DBG_INIT, "%s: iwarp = %d\n", prefix, caps->iwarp); + break; + case ICE_AQC_CAPS_ROCEV2_LAG: + caps->roce_lag = !!(number & ICE_AQC_BIT_ROCEV2_LAG); + DNPRINTF(ICE_DBG_INIT, "%s: roce_lag = %d\n", + prefix, caps->roce_lag); + break; + case ICE_AQC_CAPS_LED: + if (phys_id < ICE_MAX_SUPPORTED_GPIO_LED) { + caps->led[phys_id] = true; + caps->led_pin_num++; + DNPRINTF(ICE_DBG_INIT, "%s: led[%d] = 1\n", prefix, + phys_id); + } + break; + case ICE_AQC_CAPS_SDP: + if (phys_id < ICE_MAX_SUPPORTED_GPIO_SDP) { + caps->sdp[phys_id] = true; + caps->sdp_pin_num++; + DNPRINTF(ICE_DBG_INIT, "%s: sdp[%d] = 1\n", prefix, + phys_id); + } + break; + case ICE_AQC_CAPS_WR_CSR_PROT: + caps->wr_csr_prot = number; + caps->wr_csr_prot |= (uint64_t)logical_id << 32; + DNPRINTF(ICE_DBG_INIT, "%s: wr_csr_prot = 0x%llX\n", prefix, + (unsigned long long)caps->wr_csr_prot); + break; + case ICE_AQC_CAPS_WOL_PROXY: + caps->num_wol_proxy_fltr = number; + caps->wol_proxy_vsi_seid = logical_id; + caps->apm_wol_support = !!(phys_id & ICE_WOL_SUPPORT_M); + caps->acpi_prog_mthd = !!(phys_id & + ICE_ACPI_PROG_MTHD_M); + caps->proxy_support = !!(phys_id & ICE_PROXY_SUPPORT_M); + DNPRINTF(ICE_DBG_INIT, "%s: num_wol_proxy_fltr = %d\n", prefix, + caps->num_wol_proxy_fltr); + DNPRINTF(ICE_DBG_INIT, "%s: wol_proxy_vsi_seid = %d\n", prefix, + caps->wol_proxy_vsi_seid); + DNPRINTF(ICE_DBG_INIT, "%s: apm_wol_support = %d\n", + prefix, caps->apm_wol_support); + break; + case ICE_AQC_CAPS_MAX_MTU: + caps->max_mtu = number; + DNPRINTF(ICE_DBG_INIT, "%s: max_mtu = %d\n", + prefix, caps->max_mtu); + break; + case ICE_AQC_CAPS_PCIE_RESET_AVOIDANCE: + caps->pcie_reset_avoidance = (number > 0); + DNPRINTF(ICE_DBG_INIT, + "%s: pcie_reset_avoidance = %d\n", prefix, + caps->pcie_reset_avoidance); + break; + case ICE_AQC_CAPS_POST_UPDATE_RESET_RESTRICT: + caps->reset_restrict_support = (number == 1); + DNPRINTF(ICE_DBG_INIT, + "%s: reset_restrict_support = %d\n", prefix, + caps->reset_restrict_support); + break; + case ICE_AQC_CAPS_EXT_TOPO_DEV_IMG0: + case ICE_AQC_CAPS_EXT_TOPO_DEV_IMG1: + case ICE_AQC_CAPS_EXT_TOPO_DEV_IMG2: + case ICE_AQC_CAPS_EXT_TOPO_DEV_IMG3: + { + uint8_t index = (uint8_t)(cap - ICE_AQC_CAPS_EXT_TOPO_DEV_IMG0); + + caps->ext_topo_dev_img_ver_high[index] = number; + caps->ext_topo_dev_img_ver_low[index] = logical_id; + caps->ext_topo_dev_img_part_num[index] = + (phys_id & ICE_EXT_TOPO_DEV_IMG_PART_NUM_M) >> + ICE_EXT_TOPO_DEV_IMG_PART_NUM_S; + caps->ext_topo_dev_img_load_en[index] = + (phys_id & ICE_EXT_TOPO_DEV_IMG_LOAD_EN) != 0; + caps->ext_topo_dev_img_prog_en[index] = + (phys_id & ICE_EXT_TOPO_DEV_IMG_PROG_EN) != 0; + caps->ext_topo_dev_img_ver_schema[index] = + (phys_id & ICE_EXT_TOPO_DEV_IMG_VER_SCHEMA) != 0; + DNPRINTF(ICE_DBG_INIT, + "%s: ext_topo_dev_img_ver_high[%d] = %d\n", + prefix, index, + caps->ext_topo_dev_img_ver_high[index]); + DNPRINTF(ICE_DBG_INIT, + "%s: ext_topo_dev_img_ver_low[%d] = %d\n", + prefix, index, + caps->ext_topo_dev_img_ver_low[index]); + DNPRINTF(ICE_DBG_INIT, + "%s: ext_topo_dev_img_part_num[%d] = %d\n", + prefix, index, + caps->ext_topo_dev_img_part_num[index]); + DNPRINTF(ICE_DBG_INIT, + "%s: ext_topo_dev_img_load_en[%d] = %d\n", + prefix, index, + caps->ext_topo_dev_img_load_en[index]); + DNPRINTF(ICE_DBG_INIT, + "%s: ext_topo_dev_img_prog_en[%d] = %d\n", + prefix, index, + caps->ext_topo_dev_img_prog_en[index]); + DNPRINTF(ICE_DBG_INIT, + "%s: ext_topo_dev_img_ver_schema[%d] = %d\n", + prefix, index, + caps->ext_topo_dev_img_ver_schema[index]); + break; + } + case ICE_AQC_CAPS_TX_SCHED_TOPO_COMP_MODE: + caps->tx_sched_topo_comp_mode_en = (number == 1); + break; + case ICE_AQC_CAPS_DYN_FLATTENING: + caps->dyn_flattening_en = (number == 1); + DNPRINTF(ICE_DBG_INIT, "%s: dyn_flattening_en = %d\n", + prefix, caps->dyn_flattening_en); + break; + case ICE_AQC_CAPS_OROM_RECOVERY_UPDATE: + caps->orom_recovery_update = (number == 1); + DNPRINTF(ICE_DBG_INIT, "%s: orom_recovery_update = %d\n", + prefix, caps->orom_recovery_update); + break; + default: + /* Not one of the recognized common capabilities */ + found = false; + } + + return found; +} + +/** + * ice_recalc_port_limited_caps - Recalculate port limited capabilities + * @hw: pointer to the HW structure + * @caps: pointer to capabilities structure to fix + * + * Re-calculate the capabilities that are dependent on the number of physical + * ports; i.e. some features are not supported or function differently on + * devices with more than 4 ports. + */ +void +ice_recalc_port_limited_caps(struct ice_hw *hw, struct ice_hw_common_caps *caps) +{ + /* This assumes device capabilities are always scanned before function + * capabilities during the initialization flow. + */ + if (hw->dev_caps.num_funcs > 4) { + /* Max 4 TCs per port */ + caps->maxtc = 4; + DNPRINTF(ICE_DBG_INIT, + "reducing maxtc to %d (based on #ports)\n", caps->maxtc); + if (caps->iwarp) { + DNPRINTF(ICE_DBG_INIT, "forcing RDMA off\n"); + caps->iwarp = 0; + } + + /* print message only when processing device capabilities + * during initialization. + */ + if (caps == &hw->dev_caps.common_cap) + DPRINTF("RDMA functionality is not available with " + "the current device configuration.\n"); + } +} + +/** + * ice_parse_vf_func_caps - Parse ICE_AQC_CAPS_VF function caps + * @hw: pointer to the HW struct + * @func_p: pointer to function capabilities structure + * @cap: pointer to the capability element to parse + * + * Extract function capabilities for ICE_AQC_CAPS_VF. + */ +void +ice_parse_vf_func_caps(struct ice_hw *hw, struct ice_hw_func_caps *func_p, + struct ice_aqc_list_caps_elem *cap) +{ + uint32_t number = le32toh(cap->number); + uint32_t logical_id = le32toh(cap->logical_id); + + func_p->num_allocd_vfs = number; + func_p->vf_base_id = logical_id; + DNPRINTF(ICE_DBG_INIT, "func caps: num_allocd_vfs = %d\n", + func_p->num_allocd_vfs); + DNPRINTF(ICE_DBG_INIT, "func caps: vf_base_id = %d\n", + func_p->vf_base_id); +} + +/** + * ice_parse_vsi_func_caps - Parse ICE_AQC_CAPS_VSI function caps + * @hw: pointer to the HW struct + * @func_p: pointer to function capabilities structure + * @cap: pointer to the capability element to parse + * + * Extract function capabilities for ICE_AQC_CAPS_VSI. + */ +void +ice_parse_vsi_func_caps(struct ice_hw *hw, struct ice_hw_func_caps *func_p, + struct ice_aqc_list_caps_elem *cap) +{ + func_p->guar_num_vsi = ice_get_num_per_func(hw, ICE_MAX_VSI); + DNPRINTF(ICE_DBG_INIT, "func caps: guar_num_vsi (fw) = %d\n", + le32toh(cap->number)); + DNPRINTF(ICE_DBG_INIT, "func caps: guar_num_vsi = %d\n", + func_p->guar_num_vsi); +} + +/** + * ice_parse_func_caps - Parse function capabilities + * @hw: pointer to the HW struct + * @func_p: pointer to function capabilities structure + * @buf: buffer containing the function capability records + * @cap_count: the number of capabilities + * + * Helper function to parse function (0x000A) capabilities list. For + * capabilities shared between device and function, this relies on + * ice_parse_common_caps. + * + * Loop through the list of provided capabilities and extract the relevant + * data into the function capabilities structured. + */ +void +ice_parse_func_caps(struct ice_hw *hw, struct ice_hw_func_caps *func_p, + void *buf, uint32_t cap_count) +{ + struct ice_aqc_list_caps_elem *cap_resp; + uint32_t i; + + cap_resp = (struct ice_aqc_list_caps_elem *)buf; + + memset(func_p, 0, sizeof(*func_p)); + + for (i = 0; i < cap_count; i++) { + uint16_t cap = le16toh(cap_resp[i].cap); + bool found; + + found = ice_parse_common_caps(hw, &func_p->common_cap, + &cap_resp[i], "func caps"); + + switch (cap) { + case ICE_AQC_CAPS_VF: + ice_parse_vf_func_caps(hw, func_p, &cap_resp[i]); + break; + case ICE_AQC_CAPS_VSI: + ice_parse_vsi_func_caps(hw, func_p, &cap_resp[i]); + break; + default: + /* Don't list common capabilities as unknown */ + if (!found) + DNPRINTF(ICE_DBG_INIT, "func caps: unknown " + "capability[%d]: 0x%x\n", i, cap); + break; + } + } + + ice_print_led_caps(hw, &func_p->common_cap, "func caps", true); + ice_print_sdp_caps(hw, &func_p->common_cap, "func caps", true); + + ice_recalc_port_limited_caps(hw, &func_p->common_cap); +} + +/** + * ice_parse_valid_functions_cap - Parse ICE_AQC_CAPS_VALID_FUNCTIONS caps + * @hw: pointer to the HW struct + * @dev_p: pointer to device capabilities structure + * @cap: capability element to parse + * + * Parse ICE_AQC_CAPS_VALID_FUNCTIONS for device capabilities. + */ +void +ice_parse_valid_functions_cap(struct ice_hw *hw, struct ice_hw_dev_caps *dev_p, + struct ice_aqc_list_caps_elem *cap) +{ + uint32_t number = le32toh(cap->number); + + dev_p->num_funcs = ice_popcount32(number); + DNPRINTF(ICE_DBG_INIT, "dev caps: num_funcs = %d\n", + dev_p->num_funcs); + +} + +/** + * ice_parse_vf_dev_caps - Parse ICE_AQC_CAPS_VF device caps + * @hw: pointer to the HW struct + * @dev_p: pointer to device capabilities structure + * @cap: capability element to parse + * + * Parse ICE_AQC_CAPS_VF for device capabilities. + */ +void +ice_parse_vf_dev_caps(struct ice_hw *hw, struct ice_hw_dev_caps *dev_p, + struct ice_aqc_list_caps_elem *cap) +{ + uint32_t number = le32toh(cap->number); + + dev_p->num_vfs_exposed = number; + DNPRINTF(ICE_DBG_INIT, "dev_caps: num_vfs_exposed = %d\n", + dev_p->num_vfs_exposed); +} + +/** + * ice_parse_vsi_dev_caps - Parse ICE_AQC_CAPS_VSI device caps + * @hw: pointer to the HW struct + * @dev_p: pointer to device capabilities structure + * @cap: capability element to parse + * + * Parse ICE_AQC_CAPS_VSI for device capabilities. + */ +void +ice_parse_vsi_dev_caps(struct ice_hw *hw, struct ice_hw_dev_caps *dev_p, + struct ice_aqc_list_caps_elem *cap) +{ + uint32_t number = le32toh(cap->number); + + dev_p->num_vsi_allocd_to_host = number; + DNPRINTF(ICE_DBG_INIT, "dev caps: num_vsi_allocd_to_host = %d\n", + dev_p->num_vsi_allocd_to_host); +} + +/** + * ice_parse_nac_topo_dev_caps - Parse ICE_AQC_CAPS_NAC_TOPOLOGY cap + * @hw: pointer to the HW struct + * @dev_p: pointer to device capabilities structure + * @cap: capability element to parse + * + * Parse ICE_AQC_CAPS_NAC_TOPOLOGY for device capabilities. + */ +void +ice_parse_nac_topo_dev_caps(struct ice_hw *hw, struct ice_hw_dev_caps *dev_p, + struct ice_aqc_list_caps_elem *cap) +{ + dev_p->nac_topo.mode = le32toh(cap->number); + dev_p->nac_topo.id = le32toh(cap->phys_id) & ICE_NAC_TOPO_ID_M; + + DPRINTF("PF is configured in %s mode with IP instance ID %d\n", + (dev_p->nac_topo.mode == 0) ? "primary" : "secondary", + dev_p->nac_topo.id); + + DNPRINTF(ICE_DBG_INIT, "dev caps: nac topology is_primary = %d\n", + !!(dev_p->nac_topo.mode & ICE_NAC_TOPO_PRIMARY_M)); + DNPRINTF(ICE_DBG_INIT, "dev caps: nac topology is_dual = %d\n", + !!(dev_p->nac_topo.mode & ICE_NAC_TOPO_DUAL_M)); + DNPRINTF(ICE_DBG_INIT, "dev caps: nac topology id = %d\n", + dev_p->nac_topo.id); +} + +/** + * ice_is_vsi_valid - check whether the VSI is valid or not + * @hw: pointer to the HW struct + * @vsi_handle: VSI handle + * + * check whether the VSI is valid or not + */ +bool +ice_is_vsi_valid(struct ice_hw *hw, uint16_t vsi_handle) +{ + return vsi_handle < ICE_MAX_VSI && hw->vsi_ctx[vsi_handle]; +} + +/** + * ice_parse_sensor_reading_cap - Parse ICE_AQC_CAPS_SENSOR_READING cap + * @hw: pointer to the HW struct + * @dev_p: pointer to device capabilities structure + * @cap: capability element to parse + * + * Parse ICE_AQC_CAPS_SENSOR_READING for device capability for reading + * enabled sensors. + */ +void +ice_parse_sensor_reading_cap(struct ice_hw *hw, struct ice_hw_dev_caps *dev_p, + struct ice_aqc_list_caps_elem *cap) +{ + dev_p->supported_sensors = le32toh(cap->number); + + DNPRINTF(ICE_DBG_INIT, + "dev caps: supported sensors (bitmap) = 0x%x\n", + dev_p->supported_sensors); +} + +/** + * ice_parse_dev_caps - Parse device capabilities + * @hw: pointer to the HW struct + * @dev_p: pointer to device capabilities structure + * @buf: buffer containing the device capability records + * @cap_count: the number of capabilities + * + * Helper device to parse device (0x000B) capabilities list. For + * capabilities shared between device and function, this relies on + * ice_parse_common_caps. + * + * Loop through the list of provided capabilities and extract the relevant + * data into the device capabilities structured. + */ +void +ice_parse_dev_caps(struct ice_hw *hw, struct ice_hw_dev_caps *dev_p, + void *buf, uint32_t cap_count) +{ + struct ice_aqc_list_caps_elem *cap_resp; + uint32_t i; + + cap_resp = (struct ice_aqc_list_caps_elem *)buf; + + memset(dev_p, 0, sizeof(*dev_p)); + + for (i = 0; i < cap_count; i++) { + uint16_t cap = le16toh(cap_resp[i].cap); + bool found; + + found = ice_parse_common_caps(hw, &dev_p->common_cap, + &cap_resp[i], "dev caps"); + + switch (cap) { + case ICE_AQC_CAPS_VALID_FUNCTIONS: + ice_parse_valid_functions_cap(hw, dev_p, &cap_resp[i]); + break; + case ICE_AQC_CAPS_VF: + ice_parse_vf_dev_caps(hw, dev_p, &cap_resp[i]); + break; + case ICE_AQC_CAPS_VSI: + ice_parse_vsi_dev_caps(hw, dev_p, &cap_resp[i]); + break; + case ICE_AQC_CAPS_NAC_TOPOLOGY: + ice_parse_nac_topo_dev_caps(hw, dev_p, &cap_resp[i]); + break; + case ICE_AQC_CAPS_SENSOR_READING: + ice_parse_sensor_reading_cap(hw, dev_p, &cap_resp[i]); + break; + default: + /* Don't list common capabilities as unknown */ + if (!found) + DNPRINTF(ICE_DBG_INIT, + "dev caps: unknown capability[%d]: 0x%x\n", + i, cap); + break; + } + } + + ice_print_led_caps(hw, &dev_p->common_cap, "dev caps", true); + ice_print_sdp_caps(hw, &dev_p->common_cap, "dev caps", true); + + ice_recalc_port_limited_caps(hw, &dev_p->common_cap); +} + +/** + * ice_aq_list_caps - query function/device capabilities + * @hw: pointer to the HW struct + * @buf: a buffer to hold the capabilities + * @buf_size: size of the buffer + * @cap_count: if not NULL, set to the number of capabilities reported + * @opc: capabilities type to discover, device or function + * @cd: pointer to command details structure or NULL + * + * Get the function (0x000A) or device (0x000B) capabilities description from + * firmware and store it in the buffer. + * + * If the cap_count pointer is not NULL, then it is set to the number of + * capabilities firmware will report. Note that if the buffer size is too + * small, it is possible the command will return ICE_AQ_ERR_ENOMEM. The + * cap_count will still be updated in this case. It is recommended that the + * buffer size be set to ICE_AQ_MAX_BUF_LEN (the largest possible buffer that + * firmware could return) to avoid this. + */ +enum ice_status +ice_aq_list_caps(struct ice_hw *hw, void *buf, uint16_t buf_size, + uint32_t *cap_count, enum ice_adminq_opc opc, struct ice_sq_cd *cd) +{ + struct ice_aqc_list_caps *cmd; + struct ice_aq_desc desc; + enum ice_status status; + + cmd = &desc.params.get_cap; + + if (opc != ice_aqc_opc_list_func_caps && + opc != ice_aqc_opc_list_dev_caps) + return ICE_ERR_PARAM; + + ice_fill_dflt_direct_cmd_desc(&desc, opc); + status = ice_aq_send_cmd(hw, &desc, buf, buf_size, cd); + + if (cap_count) + *cap_count = le32toh(cmd->count); + + return status; +} + +/** + * ice_discover_dev_caps - Read and extract device capabilities + * @hw: pointer to the hardware structure + * @dev_caps: pointer to device capabilities structure + * + * Read the device capabilities and extract them into the dev_caps structure + * for later use. + */ +enum ice_status +ice_discover_dev_caps(struct ice_hw *hw, struct ice_hw_dev_caps *dev_caps) +{ + enum ice_status status; + uint32_t cap_count = 0; + void *cbuf; + + cbuf = ice_malloc(hw, ICE_AQ_MAX_BUF_LEN); + if (!cbuf) + return ICE_ERR_NO_MEMORY; + + /* Although the driver doesn't know the number of capabilities the + * device will return, we can simply send a 4KB buffer, the maximum + * possible size that firmware can return. + */ + cap_count = ICE_AQ_MAX_BUF_LEN / sizeof(struct ice_aqc_list_caps_elem); + + status = ice_aq_list_caps(hw, cbuf, ICE_AQ_MAX_BUF_LEN, &cap_count, + ice_aqc_opc_list_dev_caps, NULL); + if (!status) + ice_parse_dev_caps(hw, dev_caps, cbuf, cap_count); + ice_free(hw, cbuf); + + return status; +} + +/** + * ice_discover_func_caps - Read and extract function capabilities + * @hw: pointer to the hardware structure + * @func_caps: pointer to function capabilities structure + * + * Read the function capabilities and extract them into the func_caps structure + * for later use. + */ +enum ice_status +ice_discover_func_caps(struct ice_hw *hw, struct ice_hw_func_caps *func_caps) +{ + enum ice_status status; + uint32_t cap_count = 0; + void *cbuf; + + cbuf = ice_malloc(hw, ICE_AQ_MAX_BUF_LEN); + if (!cbuf) + return ICE_ERR_NO_MEMORY; + + /* Although the driver doesn't know the number of capabilities the + * device will return, we can simply send a 4KB buffer, the maximum + * possible size that firmware can return. + */ + cap_count = ICE_AQ_MAX_BUF_LEN / sizeof(struct ice_aqc_list_caps_elem); + + status = ice_aq_list_caps(hw, cbuf, ICE_AQ_MAX_BUF_LEN, &cap_count, + ice_aqc_opc_list_func_caps, NULL); + if (!status) + ice_parse_func_caps(hw, func_caps, cbuf, cap_count); + ice_free(hw, cbuf); + + return status; +} + +/** + * ice_set_safe_mode_caps - Override dev/func capabilities when in safe mode + * @hw: pointer to the hardware structure + */ +void +ice_set_safe_mode_caps(struct ice_hw *hw) +{ + struct ice_hw_func_caps *func_caps = &hw->func_caps; + struct ice_hw_dev_caps *dev_caps = &hw->dev_caps; + struct ice_hw_common_caps cached_caps; + uint32_t num_funcs; + + /* cache some func_caps values that should be restored after memset */ + cached_caps = func_caps->common_cap; + + /* unset func capabilities */ + memset(func_caps, 0, sizeof(*func_caps)); + +#define ICE_RESTORE_FUNC_CAP(name) \ + func_caps->common_cap.name = cached_caps.name + + /* restore cached values */ + ICE_RESTORE_FUNC_CAP(valid_functions); + ICE_RESTORE_FUNC_CAP(txq_first_id); + ICE_RESTORE_FUNC_CAP(rxq_first_id); + ICE_RESTORE_FUNC_CAP(msix_vector_first_id); + ICE_RESTORE_FUNC_CAP(max_mtu); + ICE_RESTORE_FUNC_CAP(nvm_unified_update); + + /* one Tx and one Rx queue in safe mode */ + func_caps->common_cap.num_rxq = 1; + func_caps->common_cap.num_txq = 1; + + /* two MSIX vectors, one for traffic and one for misc causes */ + func_caps->common_cap.num_msix_vectors = 2; + func_caps->guar_num_vsi = 1; + + /* cache some dev_caps values that should be restored after memset */ + cached_caps = dev_caps->common_cap; + num_funcs = dev_caps->num_funcs; + + /* unset dev capabilities */ + memset(dev_caps, 0, sizeof(*dev_caps)); + +#define ICE_RESTORE_DEV_CAP(name) \ + dev_caps->common_cap.name = cached_caps.name + + /* restore cached values */ + ICE_RESTORE_DEV_CAP(valid_functions); + ICE_RESTORE_DEV_CAP(txq_first_id); + ICE_RESTORE_DEV_CAP(rxq_first_id); + ICE_RESTORE_DEV_CAP(msix_vector_first_id); + ICE_RESTORE_DEV_CAP(max_mtu); + ICE_RESTORE_DEV_CAP(nvm_unified_update); + dev_caps->num_funcs = num_funcs; + + /* one Tx and one Rx queue per function in safe mode */ + dev_caps->common_cap.num_rxq = num_funcs; + dev_caps->common_cap.num_txq = num_funcs; + + /* two MSIX vectors per function */ + dev_caps->common_cap.num_msix_vectors = 2 * num_funcs; +} + +/** + * ice_get_caps - get info about the HW + * @hw: pointer to the hardware structure + */ +enum ice_status +ice_get_caps(struct ice_hw *hw) +{ + enum ice_status status; + + status = ice_discover_dev_caps(hw, &hw->dev_caps); + if (status) + return status; + + return ice_discover_func_caps(hw, &hw->func_caps); +} + +/** + * ice_aq_get_sw_cfg - get switch configuration + * @hw: pointer to the hardware structure + * @buf: pointer to the result buffer + * @buf_size: length of the buffer available for response + * @req_desc: pointer to requested descriptor + * @num_elems: pointer to number of elements + * @cd: pointer to command details structure or NULL + * + * Get switch configuration (0x0200) to be placed in buf. + * This admin command returns information such as initial VSI/port number + * and switch ID it belongs to. + * + * NOTE: *req_desc is both an input/output parameter. + * The caller of this function first calls this function with *request_desc set + * to 0. If the response from f/w has *req_desc set to 0, all the switch + * configuration information has been returned; if non-zero (meaning not all + * the information was returned), the caller should call this function again + * with *req_desc set to the previous value returned by f/w to get the + * next block of switch configuration information. + * + * *num_elems is output only parameter. This reflects the number of elements + * in response buffer. The caller of this function to use *num_elems while + * parsing the response buffer. + */ +enum ice_status +ice_aq_get_sw_cfg(struct ice_hw *hw, struct ice_aqc_get_sw_cfg_resp_elem *buf, + uint16_t buf_size, uint16_t *req_desc, uint16_t *num_elems, + struct ice_sq_cd *cd) +{ + struct ice_aqc_get_sw_cfg *cmd; + struct ice_aq_desc desc; + enum ice_status status; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_get_sw_cfg); + cmd = &desc.params.get_sw_conf; + cmd->element = htole16(*req_desc); + + status = ice_aq_send_cmd(hw, &desc, buf, buf_size, cd); + if (!status) { + *req_desc = le16toh(cmd->element); + *num_elems = le16toh(cmd->num_elems); + } + + return status; +} + +/* ice_init_port_info - Initialize port_info with switch configuration data + * @pi: pointer to port_info + * @vsi_port_num: VSI number or port number + * @type: Type of switch element (port or VSI) + * @swid: switch ID of the switch the element is attached to + * @pf_vf_num: PF or VF number + * @is_vf: true if the element is a VF, false otherwise + */ +void +ice_init_port_info(struct ice_port_info *pi, uint16_t vsi_port_num, + uint8_t type, uint16_t swid, uint16_t pf_vf_num, bool is_vf) +{ + switch (type) { + case ICE_AQC_GET_SW_CONF_RESP_PHYS_PORT: + pi->lport = (uint8_t)(vsi_port_num & ICE_LPORT_MASK); + pi->sw_id = swid; + pi->pf_vf_num = pf_vf_num; + pi->is_vf = is_vf; + break; + default: + DNPRINTF(ICE_DBG_SW, "incorrect VSI/port type received\n"); + break; + } +} + +/* ice_get_initial_sw_cfg - Get initial port and default VSI data */ +enum ice_status +ice_get_initial_sw_cfg(struct ice_hw *hw) +{ + struct ice_aqc_get_sw_cfg_resp_elem *rbuf; + enum ice_status status; + uint8_t num_total_ports; + uint16_t req_desc = 0; + uint16_t num_elems; + uint8_t j = 0; + uint16_t i; + + num_total_ports = 1; + + rbuf = (struct ice_aqc_get_sw_cfg_resp_elem *) + ice_malloc(hw, ICE_SW_CFG_MAX_BUF_LEN); + + if (!rbuf) + return ICE_ERR_NO_MEMORY; + + /* Multiple calls to ice_aq_get_sw_cfg may be required + * to get all the switch configuration information. The need + * for additional calls is indicated by ice_aq_get_sw_cfg + * writing a non-zero value in req_desc + */ + do { + struct ice_aqc_get_sw_cfg_resp_elem *ele; + + status = ice_aq_get_sw_cfg(hw, rbuf, ICE_SW_CFG_MAX_BUF_LEN, + &req_desc, &num_elems, NULL); + + if (status) + break; + + for (i = 0, ele = rbuf; i < num_elems; i++, ele++) { + uint16_t pf_vf_num, swid, vsi_port_num; + bool is_vf = false; + uint8_t res_type; + + vsi_port_num = le16toh(ele->vsi_port_num) & + ICE_AQC_GET_SW_CONF_RESP_VSI_PORT_NUM_M; + + pf_vf_num = le16toh(ele->pf_vf_num) & + ICE_AQC_GET_SW_CONF_RESP_FUNC_NUM_M; + + swid = le16toh(ele->swid); + + if (le16toh(ele->pf_vf_num) & + ICE_AQC_GET_SW_CONF_RESP_IS_VF) + is_vf = true; + + res_type = (uint8_t)(le16toh(ele->vsi_port_num) >> + ICE_AQC_GET_SW_CONF_RESP_TYPE_S); + + switch (res_type) { + case ICE_AQC_GET_SW_CONF_RESP_PHYS_PORT: + case ICE_AQC_GET_SW_CONF_RESP_VIRT_PORT: + if (j == num_total_ports) { + DNPRINTF(ICE_DBG_SW, + "more ports than expected\n"); + status = ICE_ERR_CFG; + goto out; + } + ice_init_port_info(hw->port_info, + vsi_port_num, res_type, swid, + pf_vf_num, is_vf); + j++; + break; + default: + break; + } + } + } while (req_desc && !status); + +out: + ice_free(hw, rbuf); + return status; +} + +/** + * ice_aq_query_sched_res - query scheduler resource + * @hw: pointer to the HW struct + * @buf_size: buffer size in bytes + * @buf: pointer to buffer + * @cd: pointer to command details structure or NULL + * + * Query scheduler resource allocation (0x0412) + */ +enum ice_status +ice_aq_query_sched_res(struct ice_hw *hw, uint16_t buf_size, + struct ice_aqc_query_txsched_res_resp *buf, + struct ice_sq_cd *cd) +{ + struct ice_aq_desc desc; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_query_sched_res); + return ice_aq_send_cmd(hw, &desc, buf, buf_size, cd); +} + +/** + * ice_sched_query_res_alloc - query the FW for num of logical sched layers + */ +enum ice_status +ice_sched_query_res_alloc(struct ice_hw *hw) +{ + struct ice_aqc_query_txsched_res_resp *buf; + enum ice_status status = ICE_SUCCESS; + uint16_t max_sibl; + uint8_t i; + + if (hw->layer_info) + return status; + + buf = (struct ice_aqc_query_txsched_res_resp *) + ice_malloc(hw, sizeof(*buf)); + if (!buf) + return ICE_ERR_NO_MEMORY; + + status = ice_aq_query_sched_res(hw, sizeof(*buf), buf, NULL); + if (status) + goto sched_query_out; + + hw->num_tx_sched_layers = + (uint8_t)le16toh(buf->sched_props.logical_levels); + hw->num_tx_sched_phys_layers = + (uint8_t)le16toh(buf->sched_props.phys_levels); + hw->flattened_layers = buf->sched_props.flattening_bitmap; + hw->max_cgds = buf->sched_props.max_pf_cgds; + + /* max sibling group size of current layer refers to the max children + * of the below layer node. + * layer 1 node max children will be layer 2 max sibling group size + * layer 2 node max children will be layer 3 max sibling group size + * and so on. This array will be populated from root (index 0) to + * qgroup layer 7. Leaf node has no children. + */ + for (i = 0; i < hw->num_tx_sched_layers - 1; i++) { + max_sibl = buf->layer_props[i + 1].max_sibl_grp_sz; + hw->max_children[i] = le16toh(max_sibl); + } + + hw->layer_info = (struct ice_aqc_layer_props *) + ice_memdup(hw, buf->layer_props, + (hw->num_tx_sched_layers * + sizeof(*hw->layer_info))); + if (!hw->layer_info) { + status = ICE_ERR_NO_MEMORY; + goto sched_query_out; + } + +sched_query_out: + ice_free(hw, buf); + return status; +} + +/** + * ice_sched_get_psm_clk_freq - determine the PSM clock frequency + * @hw: pointer to the HW struct + * + * Determine the PSM clock frequency and store in HW struct + */ +void +ice_sched_get_psm_clk_freq(struct ice_hw *hw) +{ + uint32_t val, clk_src; + + val = ICE_READ(hw, GLGEN_CLKSTAT_SRC); + clk_src = (val & GLGEN_CLKSTAT_SRC_PSM_CLK_SRC_M) >> + GLGEN_CLKSTAT_SRC_PSM_CLK_SRC_S; + + switch (clk_src) { + case PSM_CLK_SRC_367_MHZ: + hw->psm_clk_freq = ICE_PSM_CLK_367MHZ_IN_HZ; + break; + case PSM_CLK_SRC_416_MHZ: + hw->psm_clk_freq = ICE_PSM_CLK_416MHZ_IN_HZ; + break; + case PSM_CLK_SRC_446_MHZ: + hw->psm_clk_freq = ICE_PSM_CLK_446MHZ_IN_HZ; + break; + case PSM_CLK_SRC_390_MHZ: + hw->psm_clk_freq = ICE_PSM_CLK_390MHZ_IN_HZ; + break; + + /* default condition is not required as clk_src is restricted + * to a 2-bit value from GLGEN_CLKSTAT_SRC_PSM_CLK_SRC_M mask. + * The above switch statements cover the possible values of + * this variable. + */ + } +} + +/** + * ice_aq_get_dflt_topo - gets default scheduler topology + * @hw: pointer to the HW struct + * @lport: logical port number + * @buf: pointer to buffer + * @buf_size: buffer size in bytes + * @num_branches: returns total number of queue to port branches + * @cd: pointer to command details structure or NULL + * + * Get default scheduler topology (0x400) + */ +enum ice_status +ice_aq_get_dflt_topo(struct ice_hw *hw, uint8_t lport, + struct ice_aqc_get_topo_elem *buf, uint16_t buf_size, + uint8_t *num_branches, struct ice_sq_cd *cd) +{ + struct ice_aqc_get_topo *cmd; + struct ice_aq_desc desc; + enum ice_status status; + + cmd = &desc.params.get_topo; + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_get_dflt_topo); + cmd->port_num = lport; + status = ice_aq_send_cmd(hw, &desc, buf, buf_size, cd); + if (!status && num_branches) + *num_branches = cmd->num_branches; + + return status; +} + +/** + * ice_sched_add_root_node - Insert the Tx scheduler root node in SW DB + * @pi: port information structure + * @info: Scheduler element information from firmware + * + * This function inserts the root node of the scheduling tree topology + * to the SW DB. + */ +enum ice_status +ice_sched_add_root_node(struct ice_port_info *pi, + struct ice_aqc_txsched_elem_data *info) +{ + struct ice_sched_node *root; + struct ice_hw *hw; + + if (!pi) + return ICE_ERR_PARAM; + + hw = pi->hw; + + root = (struct ice_sched_node *)ice_malloc(hw, sizeof(*root)); + if (!root) + return ICE_ERR_NO_MEMORY; + + root->children = (struct ice_sched_node **) + ice_calloc(hw, hw->max_children[0], sizeof(*root->children)); + if (!root->children) { + ice_free(hw, root); + return ICE_ERR_NO_MEMORY; + } + + memcpy(&root->info, info, sizeof(*info)); + pi->root = root; + return ICE_SUCCESS; +} + +/** + * ice_sched_find_node_by_teid - Find the Tx scheduler node in SW DB + * @start_node: pointer to the starting ice_sched_node struct in a sub-tree + * @teid: node TEID to search + * + * This function searches for a node matching the TEID in the scheduling tree + * from the SW DB. The search is recursive and is restricted by the number of + * layers it has searched through; stopping at the max supported layer. + * + * This function needs to be called when holding the port_info->sched_lock + */ +struct ice_sched_node * +ice_sched_find_node_by_teid(struct ice_sched_node *start_node, uint32_t teid) +{ + uint16_t i; + + /* The TEID is same as that of the start_node */ + if (ICE_TXSCHED_GET_NODE_TEID(start_node) == teid) + return start_node; + + /* The node has no children or is at the max layer */ + if (!start_node->num_children || + start_node->tx_sched_layer >= ICE_AQC_TOPO_MAX_LEVEL_NUM || + start_node->info.data.elem_type == ICE_AQC_ELEM_TYPE_LEAF) + return NULL; + + /* Check if TEID matches to any of the children nodes */ + for (i = 0; i < start_node->num_children; i++) + if (ICE_TXSCHED_GET_NODE_TEID(start_node->children[i]) == teid) + return start_node->children[i]; + + /* Search within each child's sub-tree */ + for (i = 0; i < start_node->num_children; i++) { + struct ice_sched_node *tmp; + + tmp = ice_sched_find_node_by_teid(start_node->children[i], + teid); + if (tmp) + return tmp; + } + + return NULL; +} + +/** + * ice_sched_get_tc_node - get pointer to TC node + * @pi: port information structure + * @tc: TC number + * + * This function returns the TC node pointer + */ +struct ice_sched_node * +ice_sched_get_tc_node(struct ice_port_info *pi, uint8_t tc) +{ + uint8_t i; + + if (!pi || !pi->root) + return NULL; + for (i = 0; i < pi->root->num_children; i++) + if (pi->root->children[i]->tc_num == tc) + return pi->root->children[i]; + return NULL; +} + +/** + * ice_aqc_send_sched_elem_cmd - send scheduling elements cmd + * @hw: pointer to the HW struct + * @cmd_opc: cmd opcode + * @elems_req: number of elements to request + * @buf: pointer to buffer + * @buf_size: buffer size in bytes + * @elems_resp: returns total number of elements response + * @cd: pointer to command details structure or NULL + * + * This function sends a scheduling elements cmd (cmd_opc) + */ +enum ice_status +ice_aqc_send_sched_elem_cmd(struct ice_hw *hw, enum ice_adminq_opc cmd_opc, + uint16_t elems_req, void *buf, uint16_t buf_size, + uint16_t *elems_resp, struct ice_sq_cd *cd) +{ + struct ice_aqc_sched_elem_cmd *cmd; + struct ice_aq_desc desc; + enum ice_status status; + + cmd = &desc.params.sched_elem_cmd; + ice_fill_dflt_direct_cmd_desc(&desc, cmd_opc); + cmd->num_elem_req = htole16(elems_req); + desc.flags |= htole16(ICE_AQ_FLAG_RD); + status = ice_aq_send_cmd(hw, &desc, buf, buf_size, cd); + if (!status && elems_resp) + *elems_resp = le16toh(cmd->num_elem_resp); + + return status; +} + +/** + * ice_aq_query_sched_elems - query scheduler elements + * @hw: pointer to the HW struct + * @elems_req: number of elements to query + * @buf: pointer to buffer + * @buf_size: buffer size in bytes + * @elems_ret: returns total number of elements returned + * @cd: pointer to command details structure or NULL + * + * Query scheduling elements (0x0404) + */ +enum ice_status +ice_aq_query_sched_elems(struct ice_hw *hw, uint16_t elems_req, + struct ice_aqc_txsched_elem_data *buf, uint16_t buf_size, + uint16_t *elems_ret, struct ice_sq_cd *cd) +{ + return ice_aqc_send_sched_elem_cmd(hw, ice_aqc_opc_get_sched_elems, + elems_req, (void *)buf, buf_size, + elems_ret, cd); +} + +/** + * ice_sched_query_elem - query element information from HW + * @hw: pointer to the HW struct + * @node_teid: node TEID to be queried + * @buf: buffer to element information + * + * This function queries HW element information + */ +enum ice_status +ice_sched_query_elem(struct ice_hw *hw, uint32_t node_teid, + struct ice_aqc_txsched_elem_data *buf) +{ + uint16_t buf_size, num_elem_ret = 0; + enum ice_status status; + + buf_size = sizeof(*buf); + memset(buf, 0, buf_size); + buf->node_teid = htole32(node_teid); + status = ice_aq_query_sched_elems(hw, 1, buf, buf_size, &num_elem_ret, + NULL); + if (status != ICE_SUCCESS || num_elem_ret != 1) + DNPRINTF(ICE_DBG_SCHED, "query element failed\n"); + return status; +} + +/** + * ice_sched_add_node - Insert the Tx scheduler node in SW DB + * @pi: port information structure + * @layer: Scheduler layer of the node + * @info: Scheduler element information from firmware + * @prealloc_node: preallocated ice_sched_node struct for SW DB + * + * This function inserts a scheduler node to the SW DB. + */ +enum ice_status +ice_sched_add_node(struct ice_port_info *pi, uint8_t layer, + struct ice_aqc_txsched_elem_data *info, + struct ice_sched_node *prealloc_node) +{ + struct ice_aqc_txsched_elem_data elem; + struct ice_sched_node *parent; + struct ice_sched_node *node; + enum ice_status status; + struct ice_hw *hw; + + if (!pi) + return ICE_ERR_PARAM; + + hw = pi->hw; + + /* A valid parent node should be there */ + parent = ice_sched_find_node_by_teid(pi->root, + le32toh(info->parent_teid)); + if (!parent) { + DNPRINTF(ICE_DBG_SCHED, + "Parent Node not found for parent_teid=0x%x\n", + le32toh(info->parent_teid)); + return ICE_ERR_PARAM; + } + + /* query the current node information from FW before adding it + * to the SW DB + */ + status = ice_sched_query_elem(hw, le32toh(info->node_teid), &elem); + if (status) + return status; + + if (prealloc_node) + node = prealloc_node; + else + node = (struct ice_sched_node *)ice_malloc(hw, sizeof(*node)); + if (!node) + return ICE_ERR_NO_MEMORY; + if (hw->max_children[layer]) { + node->children = (struct ice_sched_node **) + ice_calloc(hw, hw->max_children[layer], + sizeof(*node->children)); + if (!node->children) { + ice_free(hw, node); + return ICE_ERR_NO_MEMORY; + } + } + + node->in_use = true; + node->parent = parent; + node->tx_sched_layer = layer; + parent->children[parent->num_children++] = node; + node->info = elem; + return ICE_SUCCESS; +} + +/** + * ice_aq_delete_sched_elems - delete scheduler elements + * @hw: pointer to the HW struct + * @grps_req: number of groups to delete + * @buf: pointer to buffer + * @buf_size: buffer size in bytes + * @grps_del: returns total number of elements deleted + * @cd: pointer to command details structure or NULL + * + * Delete scheduling elements (0x040F) + */ +enum ice_status +ice_aq_delete_sched_elems(struct ice_hw *hw, uint16_t grps_req, + struct ice_aqc_delete_elem *buf, uint16_t buf_size, uint16_t *grps_del, + struct ice_sq_cd *cd) +{ + return ice_aqc_send_sched_elem_cmd(hw, ice_aqc_opc_delete_sched_elems, + grps_req, (void *)buf, buf_size, + grps_del, cd); +} + +/** + * ice_sched_remove_elems - remove nodes from HW + * @hw: pointer to the HW struct + * @parent: pointer to the parent node + * @num_nodes: number of nodes + * @node_teids: array of node teids to be deleted + * + * This function remove nodes from HW + */ +enum ice_status +ice_sched_remove_elems(struct ice_hw *hw, struct ice_sched_node *parent, + uint16_t num_nodes, uint32_t *node_teids) +{ + struct ice_aqc_delete_elem *buf; + uint16_t i, num_groups_removed = 0; + enum ice_status status; + uint16_t buf_size; + + buf_size = ice_struct_size(buf, teid, num_nodes); + buf = (struct ice_aqc_delete_elem *)ice_malloc(hw, buf_size); + if (!buf) + return ICE_ERR_NO_MEMORY; + + buf->hdr.parent_teid = parent->info.node_teid; + buf->hdr.num_elems = htole16(num_nodes); + for (i = 0; i < num_nodes; i++) + buf->teid[i] = htole32(node_teids[i]); + + status = ice_aq_delete_sched_elems(hw, 1, buf, buf_size, + &num_groups_removed, NULL); + if (status != ICE_SUCCESS || num_groups_removed != 1) + DNPRINTF(ICE_DBG_SCHED, "remove node failed FW error %d\n", + hw->adminq.sq_last_status); + + ice_free(hw, buf); + return status; +} + +/** + * ice_sched_get_first_node - get the first node of the given layer + * @pi: port information structure + * @parent: pointer the base node of the subtree + * @layer: layer number + * + * This function retrieves the first node of the given layer from the subtree + */ +struct ice_sched_node * +ice_sched_get_first_node(struct ice_port_info *pi, + struct ice_sched_node *parent, uint8_t layer) +{ + return pi->sib_head[parent->tc_num][layer]; +} + +/** + * ice_free_sched_node - Free a Tx scheduler node from SW DB + * @pi: port information structure + * @node: pointer to the ice_sched_node struct + * + * This function frees up a node from SW DB as well as from HW + * + * This function needs to be called with the port_info->sched_lock held + */ +void +ice_free_sched_node(struct ice_port_info *pi, struct ice_sched_node *node) +{ + struct ice_sched_node *parent; + struct ice_hw *hw = pi->hw; + uint8_t i, j; + + /* Free the children before freeing up the parent node + * The parent array is updated below and that shifts the nodes + * in the array. So always pick the first child if num children > 0 + */ + while (node->num_children) + ice_free_sched_node(pi, node->children[0]); + + /* Leaf, TC and root nodes can't be deleted by SW */ + if (node->tx_sched_layer >= hw->sw_entry_point_layer && + node->info.data.elem_type != ICE_AQC_ELEM_TYPE_TC && + node->info.data.elem_type != ICE_AQC_ELEM_TYPE_ROOT_PORT && + node->info.data.elem_type != ICE_AQC_ELEM_TYPE_LEAF) { + uint32_t teid = le32toh(node->info.node_teid); + + ice_sched_remove_elems(hw, node->parent, 1, &teid); + } + parent = node->parent; + /* root has no parent */ + if (parent) { + struct ice_sched_node *p; + + /* update the parent */ + for (i = 0; i < parent->num_children; i++) + if (parent->children[i] == node) { + for (j = i + 1; j < parent->num_children; j++) + parent->children[j - 1] = + parent->children[j]; + parent->num_children--; + break; + } + + p = ice_sched_get_first_node(pi, node, node->tx_sched_layer); + while (p) { + if (p->sibling == node) { + p->sibling = node->sibling; + break; + } + p = p->sibling; + } + + /* update the sibling head if head is getting removed */ + if (pi->sib_head[node->tc_num][node->tx_sched_layer] == node) + pi->sib_head[node->tc_num][node->tx_sched_layer] = + node->sibling; + } + + /* leaf nodes have no children */ + if (node->children) + ice_free(hw, node->children); + ice_free(hw, node); +} + +/** + * ice_rm_dflt_leaf_node - remove the default leaf node in the tree + * @pi: port information structure + * + * This function removes the leaf node that was created by the FW + * during initialization + */ +void +ice_rm_dflt_leaf_node(struct ice_port_info *pi) +{ + struct ice_sched_node *node; + + node = pi->root; + while (node) { + if (!node->num_children) + break; + node = node->children[0]; + } + if (node && node->info.data.elem_type == ICE_AQC_ELEM_TYPE_LEAF) { + uint32_t teid = le32toh(node->info.node_teid); + enum ice_status status; + + /* remove the default leaf node */ + status = ice_sched_remove_elems(pi->hw, node->parent, 1, &teid); + if (!status) + ice_free_sched_node(pi, node); + } +} + +/** + * ice_sched_rm_dflt_nodes - free the default nodes in the tree + * @pi: port information structure + * + * This function frees all the nodes except root and TC that were created by + * the FW during initialization + */ +void +ice_sched_rm_dflt_nodes(struct ice_port_info *pi) +{ + struct ice_sched_node *node; + + ice_rm_dflt_leaf_node(pi); + + /* remove the default nodes except TC and root nodes */ + node = pi->root; + while (node) { + if (node->tx_sched_layer >= pi->hw->sw_entry_point_layer && + node->info.data.elem_type != ICE_AQC_ELEM_TYPE_TC && + node->info.data.elem_type != ICE_AQC_ELEM_TYPE_ROOT_PORT) { + ice_free_sched_node(pi, node); + break; + } + + if (!node->num_children) + break; + node = node->children[0]; + } +} + +/** + * ice_sched_init_port - Initialize scheduler by querying information from FW + * @pi: port info structure for the tree to cleanup + * + * This function is the initial call to find the total number of Tx scheduler + * resources, default topology created by firmware and storing the information + * in SW DB. + */ +enum ice_status +ice_sched_init_port(struct ice_port_info *pi) +{ + struct ice_aqc_get_topo_elem *buf; + enum ice_status status; + struct ice_hw *hw; + uint8_t num_branches; + uint16_t num_elems; + uint8_t i, j; + + if (!pi) + return ICE_ERR_PARAM; + hw = pi->hw; + + /* Query the Default Topology from FW */ + buf = (struct ice_aqc_get_topo_elem *)ice_malloc(hw, + ICE_AQ_MAX_BUF_LEN); + if (!buf) + return ICE_ERR_NO_MEMORY; + + /* Query default scheduling tree topology */ + status = ice_aq_get_dflt_topo(hw, pi->lport, buf, ICE_AQ_MAX_BUF_LEN, + &num_branches, NULL); + if (status) + goto err_init_port; + + /* num_branches should be between 1-8 */ + if (num_branches < 1 || num_branches > ICE_TXSCHED_MAX_BRANCHES) { + DNPRINTF(ICE_DBG_SCHED, "num_branches unexpected %d\n", + num_branches); + status = ICE_ERR_PARAM; + goto err_init_port; + } + + /* get the number of elements on the default/first branch */ + num_elems = le16toh(buf[0].hdr.num_elems); + + /* num_elems should always be between 1-9 */ + if (num_elems < 1 || num_elems > ICE_AQC_TOPO_MAX_LEVEL_NUM) { + DNPRINTF(ICE_DBG_SCHED, "num_elems unexpected %d\n", num_elems); + status = ICE_ERR_PARAM; + goto err_init_port; + } + + /* If the last node is a leaf node then the index of the queue group + * layer is two less than the number of elements. + */ + if (num_elems > 2 && buf[0].generic[num_elems - 1].data.elem_type == + ICE_AQC_ELEM_TYPE_LEAF) + pi->last_node_teid = + le32toh(buf[0].generic[num_elems - 2].node_teid); + else + pi->last_node_teid = + le32toh(buf[0].generic[num_elems - 1].node_teid); + + /* Insert the Tx Sched root node */ + status = ice_sched_add_root_node(pi, &buf[0].generic[0]); + if (status) + goto err_init_port; + + /* Parse the default tree and cache the information */ + for (i = 0; i < num_branches; i++) { + num_elems = le16toh(buf[i].hdr.num_elems); + + /* Skip root element as already inserted */ + for (j = 1; j < num_elems; j++) { + /* update the sw entry point */ + if (buf[0].generic[j].data.elem_type == + ICE_AQC_ELEM_TYPE_ENTRY_POINT) + hw->sw_entry_point_layer = j; + + status = ice_sched_add_node(pi, j, + &buf[i].generic[j], NULL); + if (status) + goto err_init_port; + } + } + + /* Remove the default nodes. */ + if (pi->root) + ice_sched_rm_dflt_nodes(pi); + + /* initialize the port for handling the scheduler tree */ + pi->port_state = ICE_SCHED_PORT_STATE_READY; + ice_init_lock(&pi->sched_lock); + for (i = 0; i < ICE_AQC_TOPO_MAX_LEVEL_NUM; i++) + TAILQ_INIT(&hw->rl_prof_list[i]); + +err_init_port: + if (status && pi->root) { + ice_free_sched_node(pi, pi->root); + pi->root = NULL; + } + + ice_free(hw, buf); + return status; +} + +/** + * ice_aq_rl_profile - performs a rate limiting task + * @hw: pointer to the HW struct + * @opcode: opcode for add, query, or remove profile(s) + * @num_profiles: the number of profiles + * @buf: pointer to buffer + * @buf_size: buffer size in bytes + * @num_processed: number of processed add or remove profile(s) to return + * @cd: pointer to command details structure + * + * RL profile function to add, query, or remove profile(s) + */ +enum ice_status +ice_aq_rl_profile(struct ice_hw *hw, enum ice_adminq_opc opcode, + uint16_t num_profiles, struct ice_aqc_rl_profile_elem *buf, + uint16_t buf_size, uint16_t *num_processed, struct ice_sq_cd *cd) +{ + struct ice_aqc_rl_profile *cmd; + struct ice_aq_desc desc; + enum ice_status status; + + cmd = &desc.params.rl_profile; + + ice_fill_dflt_direct_cmd_desc(&desc, opcode); + desc.flags |= htole16(ICE_AQ_FLAG_RD); + cmd->num_profiles = htole16(num_profiles); + status = ice_aq_send_cmd(hw, &desc, buf, buf_size, cd); + if (!status && num_processed) + *num_processed = le16toh(cmd->num_processed); + return status; +} + +/** + * ice_aq_remove_rl_profile - removes RL profile(s) + * @hw: pointer to the HW struct + * @num_profiles: the number of profile(s) to remove + * @buf: pointer to buffer + * @buf_size: buffer size in bytes + * @num_profiles_removed: total number of profiles removed to return + * @cd: pointer to command details structure or NULL + * + * Remove RL profile (0x0415) + */ +enum ice_status +ice_aq_remove_rl_profile(struct ice_hw *hw, uint16_t num_profiles, + struct ice_aqc_rl_profile_elem *buf, uint16_t buf_size, + uint16_t *num_profiles_removed, struct ice_sq_cd *cd) +{ + return ice_aq_rl_profile(hw, ice_aqc_opc_remove_rl_profiles, + num_profiles, buf, buf_size, + num_profiles_removed, cd); +} + +/** + * ice_sched_del_rl_profile - remove RL profile + * @hw: pointer to the HW struct + * @rl_head: list head + * @rl_info: rate limit profile information + * + * If the profile ID is not referenced anymore, it removes profile ID with + * its associated parameters from HW DB,and locally. The caller needs to + * hold scheduler lock. + */ +enum ice_status +ice_sched_del_rl_profile(struct ice_hw *hw, + struct ice_rl_prof_list_head *list_head, + struct ice_aqc_rl_profile_info *rl_info) +{ + struct ice_aqc_rl_profile_elem *buf; + uint16_t num_profiles_removed; + enum ice_status status; + uint16_t num_profiles = 1; + + if (rl_info->prof_id_ref != 0) + return ICE_ERR_IN_USE; + + /* Safe to remove profile ID */ + buf = &rl_info->profile; + status = ice_aq_remove_rl_profile(hw, num_profiles, buf, sizeof(*buf), + &num_profiles_removed, NULL); + if (status || num_profiles_removed != num_profiles) + return ICE_ERR_CFG; + + /* Delete stale entry now */ + TAILQ_REMOVE(list_head, rl_info, list_entry); + ice_free(hw, rl_info); + return status; +} + +/** + * ice_sched_clear_rl_prof - clears RL prof entries + * @pi: port information structure + * + * This function removes all RL profile from HW as well as from SW DB. + */ +void +ice_sched_clear_rl_prof(struct ice_port_info *pi) +{ + uint16_t ln; + struct ice_hw *hw = pi->hw; + + for (ln = 0; ln < hw->num_tx_sched_layers; ln++) { + struct ice_aqc_rl_profile_info *rl_prof_elem; + struct ice_aqc_rl_profile_info *rl_prof_tmp; + + TAILQ_FOREACH_SAFE(rl_prof_elem, &hw->rl_prof_list[ln], + list_entry, rl_prof_tmp) { + enum ice_status status; + + rl_prof_elem->prof_id_ref = 0; + status = ice_sched_del_rl_profile(hw, + &hw->rl_prof_list[ln], rl_prof_elem); + if (status) { + DNPRINTF(ICE_DBG_SCHED, + "Remove rl profile failed\n"); + /* On error, free mem required */ + TAILQ_REMOVE(&hw->rl_prof_list[ln], + rl_prof_elem, list_entry); + ice_free(hw, rl_prof_elem); + } + } + } +} + +/** + * ice_sched_clear_tx_topo - clears the scheduler tree nodes + * @pi: port information structure + * + * This function removes all the nodes from HW as well as from SW DB. + */ +void +ice_sched_clear_tx_topo(struct ice_port_info *pi) +{ + if (!pi) + return; + /* remove RL profiles related lists */ + ice_sched_clear_rl_prof(pi); + if (pi->root) { + ice_free_sched_node(pi, pi->root); + pi->root = NULL; + } +} + +/** + * ice_sched_clear_port - clear the scheduler elements from SW DB for a port + * @pi: port information structure + * + * Cleanup scheduling elements from SW DB + */ +void +ice_sched_clear_port(struct ice_port_info *pi) +{ + if (!pi || pi->port_state != ICE_SCHED_PORT_STATE_READY) + return; + + pi->port_state = ICE_SCHED_PORT_STATE_INIT; +#if 0 + ice_acquire_lock(&pi->sched_lock); +#endif + ice_sched_clear_tx_topo(pi); +#if 0 + ice_release_lock(&pi->sched_lock); + ice_destroy_lock(&pi->sched_lock); +#endif +} + +/** + * ice_sched_cleanup_all - cleanup scheduler elements from SW DB for all ports + * @hw: pointer to the HW struct + * + * Cleanup scheduling elements from SW DB for all the ports + */ +void +ice_sched_cleanup_all(struct ice_hw *hw) +{ + if (!hw) + return; + + if (hw->layer_info) { + ice_free(hw, hw->layer_info); + hw->layer_info = NULL; + } + + ice_sched_clear_port(hw->port_info); + + hw->num_tx_sched_layers = 0; + hw->num_tx_sched_phys_layers = 0; + hw->flattened_layers = 0; + hw->max_cgds = 0; +} + +/** + * ice_is_fw_min_ver + * @hw: pointer to the hardware structure + * @branch: branch version + * @maj: major version + * @min: minor version + * @patch: patch version + * + * Checks if the firmware is minimum version + */ +bool +ice_is_fw_min_ver(struct ice_hw *hw, uint8_t branch, uint8_t maj, uint8_t min, + uint8_t patch) +{ + if (hw->fw_branch == branch) { + if (hw->fw_maj_ver > maj) + return true; + if (hw->fw_maj_ver == maj) { + if (hw->fw_min_ver > min) + return true; + if (hw->fw_min_ver == min && hw->fw_patch >= patch) + return true; + } + } + + return false; +} + +/** + * ice_is_fw_api_min_ver + * @hw: pointer to the hardware structure + * @maj: major version + * @min: minor version + * @patch: patch version + * + * Checks if the firmware is minimum version + */ +bool +ice_is_fw_api_min_ver(struct ice_hw *hw, uint8_t maj, uint8_t min, + uint8_t patch) +{ + if (hw->api_maj_ver == maj) { + if (hw->api_min_ver > min) + return true; + if (hw->api_min_ver == min && hw->api_patch >= patch) + return true; + } else if (hw->api_maj_ver > maj) { + return true; + } + + return false; +} + +/** + * ice_fw_supports_report_dflt_cfg + * @hw: pointer to the hardware structure + * + * Checks if the firmware supports report default configuration + */ +bool +ice_fw_supports_report_dflt_cfg(struct ice_hw *hw) +{ + return ice_is_fw_api_min_ver(hw, ICE_FW_API_REPORT_DFLT_CFG_MAJ, + ICE_FW_API_REPORT_DFLT_CFG_MIN, + ICE_FW_API_REPORT_DFLT_CFG_PATCH); +} + +/** + * ice_fw_supports_link_override + * @hw: pointer to the hardware structure + * + * Checks if the firmware supports link override + */ +bool +ice_fw_supports_link_override(struct ice_hw *hw) +{ + return ice_is_fw_api_min_ver(hw, ICE_FW_API_LINK_OVERRIDE_MAJ, + ICE_FW_API_LINK_OVERRIDE_MIN, + ICE_FW_API_LINK_OVERRIDE_PATCH); +} + +#define ICE_PF_RESET_WAIT_COUNT 500 + +#define ice_arr_elem_idx(idx, val) [(idx)] = (val) + +#ifdef ICE_DEBUG +static const char * const ice_link_mode_str_low[] = { + ice_arr_elem_idx(0, "100BASE_TX"), + ice_arr_elem_idx(1, "100M_SGMII"), + ice_arr_elem_idx(2, "1000BASE_T"), + ice_arr_elem_idx(3, "1000BASE_SX"), + ice_arr_elem_idx(4, "1000BASE_LX"), + ice_arr_elem_idx(5, "1000BASE_KX"), + ice_arr_elem_idx(6, "1G_SGMII"), + ice_arr_elem_idx(7, "2500BASE_T"), + ice_arr_elem_idx(8, "2500BASE_X"), + ice_arr_elem_idx(9, "2500BASE_KX"), + ice_arr_elem_idx(10, "5GBASE_T"), + ice_arr_elem_idx(11, "5GBASE_KR"), + ice_arr_elem_idx(12, "10GBASE_T"), + ice_arr_elem_idx(13, "10G_SFI_DA"), + ice_arr_elem_idx(14, "10GBASE_SR"), + ice_arr_elem_idx(15, "10GBASE_LR"), + ice_arr_elem_idx(16, "10GBASE_KR_CR1"), + ice_arr_elem_idx(17, "10G_SFI_AOC_ACC"), + ice_arr_elem_idx(18, "10G_SFI_C2C"), + ice_arr_elem_idx(19, "25GBASE_T"), + ice_arr_elem_idx(20, "25GBASE_CR"), + ice_arr_elem_idx(21, "25GBASE_CR_S"), + ice_arr_elem_idx(22, "25GBASE_CR1"), + ice_arr_elem_idx(23, "25GBASE_SR"), + ice_arr_elem_idx(24, "25GBASE_LR"), + ice_arr_elem_idx(25, "25GBASE_KR"), + ice_arr_elem_idx(26, "25GBASE_KR_S"), + ice_arr_elem_idx(27, "25GBASE_KR1"), + ice_arr_elem_idx(28, "25G_AUI_AOC_ACC"), + ice_arr_elem_idx(29, "25G_AUI_C2C"), + ice_arr_elem_idx(30, "40GBASE_CR4"), + ice_arr_elem_idx(31, "40GBASE_SR4"), + ice_arr_elem_idx(32, "40GBASE_LR4"), + ice_arr_elem_idx(33, "40GBASE_KR4"), + ice_arr_elem_idx(34, "40G_XLAUI_AOC_ACC"), + ice_arr_elem_idx(35, "40G_XLAUI"), + ice_arr_elem_idx(36, "50GBASE_CR2"), + ice_arr_elem_idx(37, "50GBASE_SR2"), + ice_arr_elem_idx(38, "50GBASE_LR2"), + ice_arr_elem_idx(39, "50GBASE_KR2"), + ice_arr_elem_idx(40, "50G_LAUI2_AOC_ACC"), + ice_arr_elem_idx(41, "50G_LAUI2"), + ice_arr_elem_idx(42, "50G_AUI2_AOC_ACC"), + ice_arr_elem_idx(43, "50G_AUI2"), + ice_arr_elem_idx(44, "50GBASE_CP"), + ice_arr_elem_idx(45, "50GBASE_SR"), + ice_arr_elem_idx(46, "50GBASE_FR"), + ice_arr_elem_idx(47, "50GBASE_LR"), + ice_arr_elem_idx(48, "50GBASE_KR_PAM4"), + ice_arr_elem_idx(49, "50G_AUI1_AOC_ACC"), + ice_arr_elem_idx(50, "50G_AUI1"), + ice_arr_elem_idx(51, "100GBASE_CR4"), + ice_arr_elem_idx(52, "100GBASE_SR4"), + ice_arr_elem_idx(53, "100GBASE_LR4"), + ice_arr_elem_idx(54, "100GBASE_KR4"), + ice_arr_elem_idx(55, "100G_CAUI4_AOC_ACC"), + ice_arr_elem_idx(56, "100G_CAUI4"), + ice_arr_elem_idx(57, "100G_AUI4_AOC_ACC"), + ice_arr_elem_idx(58, "100G_AUI4"), + ice_arr_elem_idx(59, "100GBASE_CR_PAM4"), + ice_arr_elem_idx(60, "100GBASE_KR_PAM4"), + ice_arr_elem_idx(61, "100GBASE_CP2"), + ice_arr_elem_idx(62, "100GBASE_SR2"), + ice_arr_elem_idx(63, "100GBASE_DR"), +}; + +static const char * const ice_link_mode_str_high[] = { + ice_arr_elem_idx(0, "100GBASE_KR2_PAM4"), + ice_arr_elem_idx(1, "100G_CAUI2_AOC_ACC"), + ice_arr_elem_idx(2, "100G_CAUI2"), + ice_arr_elem_idx(3, "100G_AUI2_AOC_ACC"), + ice_arr_elem_idx(4, "100G_AUI2"), +}; +#endif + +/** + * ice_dump_phy_type - helper function to dump phy_type + * @hw: pointer to the HW structure + * @low: 64 bit value for phy_type_low + * @high: 64 bit value for phy_type_high + * @prefix: prefix string to differentiate multiple dumps + */ +void +ice_dump_phy_type(struct ice_hw *hw, uint64_t low, uint64_t high, + const char *prefix) +{ +#ifdef ICE_DEBUG + uint32_t i; + + DNPRINTF(ICE_DBG_PHY, "%s: phy_type_low: 0x%016llx\n", prefix, + (unsigned long long)low); + + for (i = 0; i < nitems(ice_link_mode_str_low); i++) { + if (low & (1ULL << i)) + DNPRINTF(ICE_DBG_PHY, "%s: bit(%d): %s\n", + prefix, i, ice_link_mode_str_low[i]); + } + + DNPRINTF(ICE_DBG_PHY, "%s: phy_type_high: 0x%016llx\n", prefix, + (unsigned long long)high); + + for (i = 0; i < nitems(ice_link_mode_str_high); i++) { + if (high & (1ULL << i)) + DNPRINTF(ICE_DBG_PHY, "%s: bit(%d): %s\n", + prefix, i, ice_link_mode_str_high[i]); + } +#endif +} + +/** + * ice_phy_maps_to_media + * @phy_type_low: PHY type low bits + * @phy_type_high: PHY type high bits + * @media_mask_low: media type PHY type low bitmask + * @media_mask_high: media type PHY type high bitmask + * + * Return true if PHY type [low|high] bits are only of media type PHY types + * [low|high] bitmask. + */ +bool +ice_phy_maps_to_media(uint64_t phy_type_low, uint64_t phy_type_high, + uint64_t media_mask_low, uint64_t media_mask_high) +{ + /* check if a PHY type exist for media type */ + if (!(phy_type_low & media_mask_low || + phy_type_high & media_mask_high)) + return false; + + /* check that PHY types are only of media type */ + if (!(phy_type_low & ~media_mask_low) && + !(phy_type_high & ~media_mask_high)) + return true; + + return false; +} + +/** + * ice_set_media_type - Sets media type + * @pi: port information structure + * + * Set ice_port_info PHY media type based on PHY type. This should be called + * from Get PHY caps with media. + */ +void +ice_set_media_type(struct ice_port_info *pi) +{ + enum ice_media_type *media_type; + uint64_t phy_type_high, phy_type_low; + + phy_type_high = pi->phy.phy_type_high; + phy_type_low = pi->phy.phy_type_low; + media_type = &pi->phy.media_type; + + /* if no media, then media type is NONE */ + if (!(pi->phy.link_info.link_info & ICE_AQ_MEDIA_AVAILABLE)) + *media_type = ICE_MEDIA_NONE; + /* else if PHY types are only BASE-T, then media type is BASET */ + else if (ice_phy_maps_to_media(phy_type_low, phy_type_high, + ICE_MEDIA_BASET_PHY_TYPE_LOW_M, 0)) + *media_type = ICE_MEDIA_BASET; + /* else if any PHY type is BACKPLANE, then media type is BACKPLANE */ + else if (phy_type_low & ICE_MEDIA_BP_PHY_TYPE_LOW_M || + phy_type_high & ICE_MEDIA_BP_PHY_TYPE_HIGH_M) + *media_type = ICE_MEDIA_BACKPLANE; + /* else if PHY types are only optical, or optical and C2M, then media + * type is FIBER + */ + else if (ice_phy_maps_to_media(phy_type_low, phy_type_high, + ICE_MEDIA_OPT_PHY_TYPE_LOW_M, 0) || + (phy_type_low & ICE_MEDIA_OPT_PHY_TYPE_LOW_M && + phy_type_low & ICE_MEDIA_C2M_PHY_TYPE_LOW_M)) + *media_type = ICE_MEDIA_FIBER; + /* else if PHY types are only DA, or DA and C2C, then media type DA */ + else if (ice_phy_maps_to_media(phy_type_low, phy_type_high, + ICE_MEDIA_DAC_PHY_TYPE_LOW_M, 0) || + (phy_type_low & ICE_MEDIA_DAC_PHY_TYPE_LOW_M && + (phy_type_low & ICE_MEDIA_C2C_PHY_TYPE_LOW_M || + phy_type_high & ICE_MEDIA_C2C_PHY_TYPE_HIGH_M))) + *media_type = ICE_MEDIA_DA; + /* else if PHY types are only C2M or only C2C, then media is AUI */ + else if (ice_phy_maps_to_media(phy_type_low, phy_type_high, + ICE_MEDIA_C2M_PHY_TYPE_LOW_M, + ICE_MEDIA_C2M_PHY_TYPE_HIGH_M) || + ice_phy_maps_to_media(phy_type_low, phy_type_high, + ICE_MEDIA_C2C_PHY_TYPE_LOW_M, + ICE_MEDIA_C2C_PHY_TYPE_HIGH_M)) + *media_type = ICE_MEDIA_AUI; + + else + *media_type = ICE_MEDIA_UNKNOWN; +} + +/** + * ice_aq_get_phy_caps - returns PHY capabilities + * @pi: port information structure + * @qual_mods: report qualified modules + * @report_mode: report mode capabilities + * @pcaps: structure for PHY capabilities to be filled + * @cd: pointer to command details structure or NULL + * + * Returns the various PHY capabilities supported on the Port (0x0600) + */ +enum ice_status +ice_aq_get_phy_caps(struct ice_port_info *pi, bool qual_mods, + uint8_t report_mode, struct ice_aqc_get_phy_caps_data *pcaps, + struct ice_sq_cd *cd) +{ + struct ice_aqc_get_phy_caps *cmd; + uint16_t pcaps_size = sizeof(*pcaps); + struct ice_aq_desc desc; + enum ice_status status; + const char *prefix; + struct ice_hw *hw; + + cmd = &desc.params.get_phy; + + if (!pcaps || (report_mode & ~ICE_AQC_REPORT_MODE_M) || !pi) + return ICE_ERR_PARAM; + hw = pi->hw; + + if (report_mode == ICE_AQC_REPORT_DFLT_CFG && + !ice_fw_supports_report_dflt_cfg(hw)) + return ICE_ERR_PARAM; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_get_phy_caps); + + if (qual_mods) + cmd->param0 |= htole16(ICE_AQC_GET_PHY_RQM); + + cmd->param0 |= htole16(report_mode); + + status = ice_aq_send_cmd(hw, &desc, pcaps, pcaps_size, cd); + + DNPRINTF(ICE_DBG_LINK, "get phy caps dump\n"); + + switch (report_mode) { + case ICE_AQC_REPORT_TOPO_CAP_MEDIA: + prefix = "phy_caps_media"; + break; + case ICE_AQC_REPORT_TOPO_CAP_NO_MEDIA: + prefix = "phy_caps_no_media"; + break; + case ICE_AQC_REPORT_ACTIVE_CFG: + prefix = "phy_caps_active"; + break; + case ICE_AQC_REPORT_DFLT_CFG: + prefix = "phy_caps_default"; + break; + default: + prefix = "phy_caps_invalid"; + } + + ice_dump_phy_type(hw, le64toh(pcaps->phy_type_low), + le64toh(pcaps->phy_type_high), prefix); + + DNPRINTF(ICE_DBG_LINK, "%s: report_mode = 0x%x\n", + prefix, report_mode); + DNPRINTF(ICE_DBG_LINK, "%s: caps = 0x%x\n", prefix, pcaps->caps); + DNPRINTF(ICE_DBG_LINK, "%s: low_power_ctrl_an = 0x%x\n", prefix, + pcaps->low_power_ctrl_an); + DNPRINTF(ICE_DBG_LINK, "%s: eee_cap = 0x%x\n", prefix, + pcaps->eee_cap); + DNPRINTF(ICE_DBG_LINK, "%s: eeer_value = 0x%x\n", prefix, + pcaps->eeer_value); + DNPRINTF(ICE_DBG_LINK, "%s: link_fec_options = 0x%x\n", prefix, + pcaps->link_fec_options); + DNPRINTF(ICE_DBG_LINK, "%s: module_compliance_enforcement = 0x%x\n", + prefix, pcaps->module_compliance_enforcement); + DNPRINTF(ICE_DBG_LINK, "%s: extended_compliance_code = 0x%x\n", + prefix, pcaps->extended_compliance_code); + DNPRINTF(ICE_DBG_LINK, "%s: module_type[0] = 0x%x\n", prefix, + pcaps->module_type[0]); + DNPRINTF(ICE_DBG_LINK, "%s: module_type[1] = 0x%x\n", prefix, + pcaps->module_type[1]); + DNPRINTF(ICE_DBG_LINK, "%s: module_type[2] = 0x%x\n", prefix, + pcaps->module_type[2]); + + if (status == ICE_SUCCESS && report_mode == ICE_AQC_REPORT_TOPO_CAP_MEDIA) { + pi->phy.phy_type_low = le64toh(pcaps->phy_type_low); + pi->phy.phy_type_high = le64toh(pcaps->phy_type_high); + memcpy(pi->phy.link_info.module_type, &pcaps->module_type, + sizeof(pi->phy.link_info.module_type)); + ice_set_media_type(pi); + DNPRINTF(ICE_DBG_LINK, "%s: media_type = 0x%x\n", prefix, + pi->phy.media_type); + } + + return status; +} + +/** + * ice_aq_get_link_info + * @pi: port information structure + * @ena_lse: enable/disable LinkStatusEvent reporting + * @link: pointer to link status structure - optional + * @cd: pointer to command details structure or NULL + * + * Get Link Status (0x607). Returns the link status of the adapter. + */ +enum ice_status +ice_aq_get_link_info(struct ice_port_info *pi, bool ena_lse, + struct ice_link_status *link, struct ice_sq_cd *cd) +{ + struct ice_aqc_get_link_status_data link_data = { 0 }; + struct ice_aqc_get_link_status *resp; + struct ice_link_status *li_old, *li; + struct ice_fc_info *hw_fc_info; + bool tx_pause, rx_pause; + struct ice_aq_desc desc; + enum ice_status status; + struct ice_hw *hw; + uint16_t cmd_flags; + + if (!pi) + return ICE_ERR_PARAM; + hw = pi->hw; + + li_old = &pi->phy.link_info_old; + li = &pi->phy.link_info; + hw_fc_info = &pi->fc; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_get_link_status); + cmd_flags = (ena_lse) ? ICE_AQ_LSE_ENA : ICE_AQ_LSE_DIS; + resp = &desc.params.get_link_status; + resp->cmd_flags = htole16(cmd_flags); + resp->lport_num = pi->lport; + + status = ice_aq_send_cmd(hw, &desc, &link_data, + ICE_GET_LINK_STATUS_DATALEN_V1, cd); + if (status != ICE_SUCCESS) + return status; + + /* save off old link status information */ + *li_old = *li; + + /* update current link status information */ + li->link_speed = le16toh(link_data.link_speed); + li->phy_type_low = le64toh(link_data.phy_type_low); + li->phy_type_high = le64toh(link_data.phy_type_high); + li->link_info = link_data.link_info; + li->link_cfg_err = link_data.link_cfg_err; + li->an_info = link_data.an_info; + li->ext_info = link_data.ext_info; + li->max_frame_size = le16toh(link_data.max_frame_size); + li->fec_info = link_data.cfg & ICE_AQ_FEC_MASK; + li->topo_media_conflict = link_data.topo_media_conflict; + li->pacing = link_data.cfg & (ICE_AQ_CFG_PACING_M | + ICE_AQ_CFG_PACING_TYPE_M); + + /* update fc info */ + tx_pause = !!(link_data.an_info & ICE_AQ_LINK_PAUSE_TX); + rx_pause = !!(link_data.an_info & ICE_AQ_LINK_PAUSE_RX); + if (tx_pause && rx_pause) + hw_fc_info->current_mode = ICE_FC_FULL; + else if (tx_pause) + hw_fc_info->current_mode = ICE_FC_TX_PAUSE; + else if (rx_pause) + hw_fc_info->current_mode = ICE_FC_RX_PAUSE; + else + hw_fc_info->current_mode = ICE_FC_NONE; + + li->lse_ena = !!(resp->cmd_flags & htole16(ICE_AQ_LSE_IS_ENABLED)); + + DNPRINTF(ICE_DBG_LINK, "get link info\n"); + DNPRINTF(ICE_DBG_LINK, " link_speed = 0x%x\n", li->link_speed); + DNPRINTF(ICE_DBG_LINK, " phy_type_low = 0x%llx\n", + (unsigned long long)li->phy_type_low); + DNPRINTF(ICE_DBG_LINK, " phy_type_high = 0x%llx\n", + (unsigned long long)li->phy_type_high); + DNPRINTF(ICE_DBG_LINK, " link_info = 0x%x\n", li->link_info); + DNPRINTF(ICE_DBG_LINK, " link_cfg_err = 0x%x\n", li->link_cfg_err); + DNPRINTF(ICE_DBG_LINK, " an_info = 0x%x\n", li->an_info); + DNPRINTF(ICE_DBG_LINK, " ext_info = 0x%x\n", li->ext_info); + DNPRINTF(ICE_DBG_LINK, " fec_info = 0x%x\n", li->fec_info); + DNPRINTF(ICE_DBG_LINK, " lse_ena = 0x%x\n", li->lse_ena); + DNPRINTF(ICE_DBG_LINK, " max_frame = 0x%x\n", + li->max_frame_size); + DNPRINTF(ICE_DBG_LINK, " pacing = 0x%x\n", li->pacing); + + /* save link status information */ + if (link) + *link = *li; + + /* flag cleared so calling functions don't call AQ again */ + pi->phy.get_link_info = false; + + return ICE_SUCCESS; +} + +/** + * ice_cfg_rl_burst_size - Set burst size value + * @hw: pointer to the HW struct + * @bytes: burst size in bytes + * + * This function configures/set the burst size to requested new value. The new + * burst size value is used for future rate limit calls. It doesn't change the + * existing or previously created RL profiles. + */ +enum ice_status +ice_cfg_rl_burst_size(struct ice_hw *hw, uint32_t bytes) +{ + uint16_t burst_size_to_prog; + + if (bytes < ICE_MIN_BURST_SIZE_ALLOWED || + bytes > ICE_MAX_BURST_SIZE_ALLOWED) + return ICE_ERR_PARAM; + if (ice_round_to_num(bytes, 64) <= + ICE_MAX_BURST_SIZE_64_BYTE_GRANULARITY) { + /* 64 byte granularity case */ + /* Disable MSB granularity bit */ + burst_size_to_prog = ICE_64_BYTE_GRANULARITY; + /* round number to nearest 64 byte granularity */ + bytes = ice_round_to_num(bytes, 64); + /* The value is in 64 byte chunks */ + burst_size_to_prog |= (uint16_t)(bytes / 64); + } else { + /* k bytes granularity case */ + /* Enable MSB granularity bit */ + burst_size_to_prog = ICE_KBYTE_GRANULARITY; + /* round number to nearest 1024 granularity */ + bytes = ice_round_to_num(bytes, 1024); + /* check rounding doesn't go beyond allowed */ + if (bytes > ICE_MAX_BURST_SIZE_KBYTE_GRANULARITY) + bytes = ICE_MAX_BURST_SIZE_KBYTE_GRANULARITY; + /* The value is in k bytes */ + burst_size_to_prog |= (uint16_t)(bytes / 1024); + } + hw->max_burst_size = burst_size_to_prog; + return ICE_SUCCESS; +} + +/** + * ice_init_def_sw_recp - initialize the recipe book keeping tables + * @hw: pointer to the HW struct + * @recp_list: pointer to sw recipe list + * + * Allocate memory for the entire recipe table and initialize the structures/ + * entries corresponding to basic recipes. + */ +enum ice_status +ice_init_def_sw_recp(struct ice_hw *hw, struct ice_sw_recipe **recp_list) +{ + struct ice_sw_recipe *recps; + uint8_t i; + + recps = (struct ice_sw_recipe *) + ice_calloc(hw, ICE_MAX_NUM_RECIPES, sizeof(*recps)); + if (!recps) + return ICE_ERR_NO_MEMORY; + + for (i = 0; i < ICE_MAX_NUM_RECIPES; i++) { + recps[i].root_rid = i; + TAILQ_INIT(&recps[i].filt_rules); + TAILQ_INIT(&recps[i].adv_filt_rules); + TAILQ_INIT(&recps[i].filt_replay_rules); + TAILQ_INIT(&recps[i].rg_list); + ice_init_lock(&recps[i].filt_rule_lock); + } + + *recp_list = recps; + + return ICE_SUCCESS; +} + +/** + * ice_init_fltr_mgmt_struct - initializes filter management list and locks + * @hw: pointer to the HW struct + */ +enum ice_status +ice_init_fltr_mgmt_struct(struct ice_hw *hw) +{ + struct ice_switch_info *sw; + enum ice_status status; + + hw->switch_info = (struct ice_switch_info *) + ice_malloc(hw, sizeof(*hw->switch_info)); + + sw = hw->switch_info; + + if (!sw) + return ICE_ERR_NO_MEMORY; + + TAILQ_INIT(&sw->vsi_list_map_head); + sw->prof_res_bm_init = 0; + + status = ice_init_def_sw_recp(hw, &hw->switch_info->recp_list); + if (status) { + ice_free(hw, hw->switch_info); + return status; + } + return ICE_SUCCESS; +} + +/** + * ice_aq_manage_mac_read - manage MAC address read command + * @hw: pointer to the HW struct + * @buf: a virtual buffer to hold the manage MAC read response + * @buf_size: Size of the virtual buffer + * @cd: pointer to command details structure or NULL + * + * This function is used to return per PF station MAC address (0x0107). + * NOTE: Upon successful completion of this command, MAC address information + * is returned in user specified buffer. Please interpret user specified + * buffer as "manage_mac_read" response. + * Response such as various MAC addresses are stored in HW struct (port.mac) + * ice_discover_dev_caps is expected to be called before this function is + * called. + */ +enum ice_status +ice_aq_manage_mac_read(struct ice_hw *hw, void *buf, uint16_t buf_size, + struct ice_sq_cd *cd) +{ + struct ice_aqc_manage_mac_read_resp *resp; + struct ice_aqc_manage_mac_read *cmd; + struct ice_aq_desc desc; + enum ice_status status; + uint16_t flags; + uint8_t i; + + cmd = &desc.params.mac_read; + + if (buf_size < sizeof(*resp)) + return ICE_ERR_BUF_TOO_SHORT; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_manage_mac_read); + + status = ice_aq_send_cmd(hw, &desc, buf, buf_size, cd); + if (status) + return status; + + resp = (struct ice_aqc_manage_mac_read_resp *)buf; + flags = le16toh(cmd->flags) & ICE_AQC_MAN_MAC_READ_M; + + if (!(flags & ICE_AQC_MAN_MAC_LAN_ADDR_VALID)) { + DNPRINTF(ICE_DBG_LAN, "got invalid MAC address\n"); + return ICE_ERR_CFG; + } + + /* A single port can report up to two (LAN and WoL) addresses */ + for (i = 0; i < cmd->num_addr; i++) { + if (resp[i].addr_type == ICE_AQC_MAN_MAC_ADDR_TYPE_LAN) { + memcpy(hw->port_info->mac.lan_addr, + resp[i].mac_addr, ETHER_ADDR_LEN); + memcpy(hw->port_info->mac.perm_addr, + resp[i].mac_addr, ETHER_ADDR_LEN); + break; + } + } + + return ICE_SUCCESS; +} + +/** + * ice_rem_sw_rule_info + * @hw: pointer to the hardware structure + * @rule_head: pointer to the switch list structure that we want to delete + */ +void +ice_rem_sw_rule_info(struct ice_hw *hw, struct ice_fltr_mgmt_list_head *rule_head) +{ + if (!TAILQ_EMPTY(rule_head)) { + struct ice_fltr_mgmt_list_entry *entry; + struct ice_fltr_mgmt_list_entry *tmp; + + TAILQ_FOREACH_SAFE(entry, rule_head, list_entry, tmp) { + TAILQ_REMOVE(rule_head, entry, list_entry); + ice_free(hw, entry); + } + } +} + +/** + * ice_rm_sw_replay_rule_info - helper function to delete filter replay rules + * @hw: pointer to the HW struct + * @sw: pointer to switch info struct for which function removes filters + * + * Deletes the filter replay rules for given switch + */ +void +ice_rm_sw_replay_rule_info(struct ice_hw *hw, struct ice_switch_info *sw) +{ + uint8_t i; + + if (!sw) + return; + + for (i = 0; i < ICE_MAX_NUM_RECIPES; i++) { + if (!TAILQ_EMPTY(&sw->recp_list[i].filt_replay_rules)) { + struct ice_fltr_mgmt_list_head *l_head; + + l_head = &sw->recp_list[i].filt_replay_rules; + if (!sw->recp_list[i].adv_rule) + ice_rem_sw_rule_info(hw, l_head); + } + } +} +/** + * ice_cleanup_fltr_mgmt_single - clears single filter mngt struct + * @hw: pointer to the HW struct + * @sw: pointer to switch info struct for which function clears filters + */ +void +ice_cleanup_fltr_mgmt_single(struct ice_hw *hw, struct ice_switch_info *sw) +{ + struct ice_vsi_list_map_info *v_pos_map; + struct ice_vsi_list_map_info *v_tmp_map; + struct ice_sw_recipe *recps; + uint8_t i; + + if (!sw) + return; + + TAILQ_FOREACH_SAFE(v_pos_map, &sw->vsi_list_map_head, list_entry, + v_tmp_map) { + TAILQ_REMOVE(&sw->vsi_list_map_head, v_pos_map, list_entry); + ice_free(hw, v_pos_map); + } + recps = sw->recp_list; + for (i = 0; i < ICE_MAX_NUM_RECIPES; i++) { + struct ice_recp_grp_entry *rg_entry, *tmprg_entry; + + recps[i].root_rid = i; + TAILQ_FOREACH_SAFE(rg_entry, &recps[i].rg_list, l_entry, + tmprg_entry) { + TAILQ_REMOVE(&recps[i].rg_list, rg_entry, l_entry); + ice_free(hw, rg_entry); + } + + if (recps[i].adv_rule) { + struct ice_adv_fltr_mgmt_list_entry *tmp_entry; + struct ice_adv_fltr_mgmt_list_entry *lst_itr; +#if 0 + ice_destroy_lock(&recps[i].filt_rule_lock); +#endif + TAILQ_FOREACH_SAFE(lst_itr, &recps[i].adv_filt_rules, + list_entry, tmp_entry) { + TAILQ_REMOVE(&recps[i].adv_filt_rules, lst_itr, + list_entry); + ice_free(hw, lst_itr->lkups); + ice_free(hw, lst_itr); + } + } else { + struct ice_fltr_mgmt_list_entry *lst_itr, *tmp_entry; +#if 0 + ice_destroy_lock(&recps[i].filt_rule_lock); +#endif + TAILQ_FOREACH_SAFE(lst_itr, &recps[i].filt_rules, + list_entry, tmp_entry) { + TAILQ_REMOVE(&recps[i].filt_rules, lst_itr, + list_entry); + ice_free(hw, lst_itr); + } + } + if (recps[i].root_buf) + ice_free(hw, recps[i].root_buf); + } + ice_rm_sw_replay_rule_info(hw, sw); + ice_free(hw, sw->recp_list); + ice_free(hw, sw); +} + +/** + * ice_cleanup_fltr_mgmt_struct - cleanup filter management list and locks + * @hw: pointer to the HW struct + */ +void +ice_cleanup_fltr_mgmt_struct(struct ice_hw *hw) +{ + ice_cleanup_fltr_mgmt_single(hw, hw->switch_info); +} + +/** + * ice_is_fw_auto_drop_supported + * @hw: pointer to the hardware structure + * + * Checks if the firmware supports auto drop feature + */ +bool +ice_is_fw_auto_drop_supported(struct ice_hw *hw) +{ + if (hw->api_maj_ver >= ICE_FW_API_AUTO_DROP_MAJ && + hw->api_min_ver >= ICE_FW_API_AUTO_DROP_MIN) + return true; + return false; +} + +/** + * ice_fill_tx_timer_and_fc_thresh + * @hw: pointer to the HW struct + * @cmd: pointer to MAC cfg structure + * + * Add Tx timer and FC refresh threshold info to Set MAC Config AQ command + * descriptor + */ +void +ice_fill_tx_timer_and_fc_thresh(struct ice_hw *hw, + struct ice_aqc_set_mac_cfg *cmd) +{ + uint16_t fc_thres_val, tx_timer_val; + uint32_t val; + + /* We read back the transmit timer and fc threshold value of + * LFC. Thus, we will use index = + * PRTMAC_HSEC_CTL_TX_PAUSE_QUANTA_MAX_INDEX. + * + * Also, because we are operating on transmit timer and fc + * threshold of LFC, we don't turn on any bit in tx_tmr_priority + */ +#define IDX_OF_LFC PRTMAC_HSEC_CTL_TX_PAUSE_QUANTA_MAX_INDEX + + /* Retrieve the transmit timer */ + val = ICE_READ(hw, PRTMAC_HSEC_CTL_TX_PAUSE_QUANTA(IDX_OF_LFC)); + tx_timer_val = val & + PRTMAC_HSEC_CTL_TX_PAUSE_QUANTA_HSEC_CTL_TX_PAUSE_QUANTA_M; + cmd->tx_tmr_value = htole16(tx_timer_val); + + /* Retrieve the fc threshold */ + val = ICE_READ(hw, PRTMAC_HSEC_CTL_TX_PAUSE_REFRESH_TIMER(IDX_OF_LFC)); + fc_thres_val = val & PRTMAC_HSEC_CTL_TX_PAUSE_REFRESH_TIMER_M; + + cmd->fc_refresh_threshold = htole16(fc_thres_val); +} + +/** + * ice_aq_set_mac_cfg + * @hw: pointer to the HW struct + * @max_frame_size: Maximum Frame Size to be supported + * @auto_drop: Tell HW to drop packets if TC queue is blocked + * @cd: pointer to command details structure or NULL + * + * Set MAC configuration (0x0603) + */ +enum ice_status +ice_aq_set_mac_cfg(struct ice_hw *hw, uint16_t max_frame_size, bool auto_drop, + struct ice_sq_cd *cd) +{ + struct ice_aqc_set_mac_cfg *cmd; + struct ice_aq_desc desc; + + cmd = &desc.params.set_mac_cfg; + + if (max_frame_size == 0) + return ICE_ERR_PARAM; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_set_mac_cfg); + + cmd->max_frame_size = htole16(max_frame_size); + + if (ice_is_fw_auto_drop_supported(hw) && auto_drop) + cmd->drop_opts |= ICE_AQ_SET_MAC_AUTO_DROP_BLOCKING_PKTS; + ice_fill_tx_timer_and_fc_thresh(hw, cmd); + + return ice_aq_send_cmd(hw, &desc, NULL, 0, cd); +} + +/** + * ice_vsig_free - free VSI group + * @hw: pointer to the hardware structure + * @blk: HW block + * @vsig: VSIG to remove + * + * The function will remove all VSIs associated with the input VSIG and move + * them to the DEFAULT_VSIG and mark the VSIG available. + */ +enum ice_status +ice_vsig_free(struct ice_hw *hw, enum ice_block blk, uint16_t vsig) +{ + struct ice_vsig_prof *dtmp, *del; + struct ice_vsig_vsi *vsi_cur; + uint16_t idx; + + idx = vsig & ICE_VSIG_IDX_M; + if (idx >= ICE_MAX_VSIGS) + return ICE_ERR_PARAM; + + if (!hw->blk[blk].xlt2.vsig_tbl[idx].in_use) + return ICE_ERR_DOES_NOT_EXIST; + + hw->blk[blk].xlt2.vsig_tbl[idx].in_use = false; + + vsi_cur = hw->blk[blk].xlt2.vsig_tbl[idx].first_vsi; + /* If the VSIG has at least 1 VSI then iterate through the + * list and remove the VSIs before deleting the group. + */ + if (vsi_cur) { + /* remove all vsis associated with this VSIG XLT2 entry */ + do { + struct ice_vsig_vsi *tmp = vsi_cur->next_vsi; + + vsi_cur->vsig = ICE_DEFAULT_VSIG; + vsi_cur->changed = 1; + vsi_cur->next_vsi = NULL; + vsi_cur = tmp; + } while (vsi_cur); + + /* NULL terminate head of VSI list */ + hw->blk[blk].xlt2.vsig_tbl[idx].first_vsi = NULL; + } + + /* free characteristic list */ + TAILQ_FOREACH_SAFE(del, &hw->blk[blk].xlt2.vsig_tbl[idx].prop_lst, + list, dtmp) { + TAILQ_REMOVE(&hw->blk[blk].xlt2.vsig_tbl[idx].prop_lst, del, + list); + ice_free(hw, del); + } + + /* if VSIG characteristic list was cleared for reset + * re-initialize the list head + */ + TAILQ_INIT(&hw->blk[blk].xlt2.vsig_tbl[idx].prop_lst); + + return ICE_SUCCESS; +} + +/** + * ice_free_vsig_tbl - free complete VSIG table entries + * @hw: pointer to the hardware structure + * @blk: the HW block on which to free the VSIG table entries + */ +void +ice_free_vsig_tbl(struct ice_hw *hw, enum ice_block blk) +{ + uint16_t i; + + if (!hw->blk[blk].xlt2.vsig_tbl) + return; + + for (i = 1; i < ICE_MAX_VSIGS; i++) + if (hw->blk[blk].xlt2.vsig_tbl[i].in_use) + ice_vsig_free(hw, blk, i); +} + +/** + * ice_free_prof_map - free profile map + * @hw: pointer to the hardware structure + * @blk_idx: HW block index + */ +void +ice_free_prof_map(struct ice_hw *hw, uint8_t blk_idx) +{ + struct ice_es *es = &hw->blk[blk_idx].es; + struct ice_prof_map *del, *tmp; +#if 0 + ice_acquire_lock(&es->prof_map_lock); +#endif + TAILQ_FOREACH_SAFE(del, &es->prof_map, list, tmp) { + TAILQ_REMOVE(&es->prof_map, del, list); + ice_free(hw, del); + } + TAILQ_INIT(&es->prof_map); +#if 0 + ice_release_lock(&es->prof_map_lock); +#endif +} + +/** + * ice_free_flow_profs - free flow profile entries + * @hw: pointer to the hardware structure + * @blk_idx: HW block index + */ +void +ice_free_flow_profs(struct ice_hw *hw, uint8_t blk_idx) +{ + struct ice_flow_prof *p, *tmp; +#if 0 + ice_acquire_lock(&hw->fl_profs_locks[blk_idx]); +#endif + TAILQ_FOREACH_SAFE(p, &hw->fl_profs[blk_idx], l_entry, tmp) { + TAILQ_REMOVE(&hw->fl_profs[blk_idx], p, l_entry); + + ice_free(hw, p); + } +#if 0 + ice_release_lock(&hw->fl_profs_locks[blk_idx]); +#endif + /* if driver is in reset and tables are being cleared + * re-initialize the flow profile list heads + */ + TAILQ_INIT(&hw->fl_profs[blk_idx]); +} + +/** + * ice_free_hw_tbls - free hardware table memory + * @hw: pointer to the hardware structure + */ +void +ice_free_hw_tbls(struct ice_hw *hw) +{ + struct ice_rss_cfg *r, *rt; + uint8_t i; + + for (i = 0; i < ICE_BLK_COUNT; i++) { + if (hw->blk[i].is_list_init) { +#if 0 + struct ice_es *es = &hw->blk[i].es; +#endif + ice_free_prof_map(hw, i); +#if 0 + ice_destroy_lock(&es->prof_map_lock); +#endif + + ice_free_flow_profs(hw, i); +#if 0 + ice_destroy_lock(&hw->fl_profs_locks[i]); +#endif + + hw->blk[i].is_list_init = false; + } + ice_free_vsig_tbl(hw, (enum ice_block)i); + ice_free(hw, hw->blk[i].xlt1.ptypes); + ice_free(hw, hw->blk[i].xlt1.ptg_tbl); + ice_free(hw, hw->blk[i].xlt1.t); + ice_free(hw, hw->blk[i].xlt2.t); + ice_free(hw, hw->blk[i].xlt2.vsig_tbl); + ice_free(hw, hw->blk[i].xlt2.vsis); + ice_free(hw, hw->blk[i].prof.t); + ice_free(hw, hw->blk[i].prof_redir.t); + ice_free(hw, hw->blk[i].es.t); + ice_free(hw, hw->blk[i].es.ref_count); + ice_free(hw, hw->blk[i].es.written); + } + + TAILQ_FOREACH_SAFE(r, &hw->rss_list_head, l_entry, rt) { + TAILQ_REMOVE(&hw->rss_list_head, r, l_entry); + ice_free(hw, r); + } +#if 0 + ice_destroy_lock(&hw->rss_locks); +#endif + memset(hw->blk, 0, sizeof(hw->blk)); +} + +/** + * ice_init_flow_profs - init flow profile locks and list heads + * @hw: pointer to the hardware structure + * @blk_idx: HW block index + */ +void ice_init_flow_profs(struct ice_hw *hw, uint8_t blk_idx) +{ +#if 0 + ice_init_lock(&hw->fl_profs_locks[blk_idx]); +#endif + TAILQ_INIT(&hw->fl_profs[blk_idx]); +} + +/* Block / table size info */ +struct ice_blk_size_details { + uint16_t xlt1; /* # XLT1 entries */ + uint16_t xlt2; /* # XLT2 entries */ + uint16_t prof_tcam; /* # profile ID TCAM entries */ + uint16_t prof_id; /* # profile IDs */ + uint8_t prof_cdid_bits; /* # CDID one-hot bits used in key */ + uint16_t prof_redir; /* # profile redirection entries */ + uint16_t es; /* # extraction sequence entries */ + uint16_t fvw; /* # field vector words */ + uint8_t overwrite; /* overwrite existing entries allowed */ + uint8_t reverse; /* reverse FV order */ +}; + +static const struct ice_blk_size_details blk_sizes[ICE_BLK_COUNT] = { + /** + * Table Definitions + * XLT1 - Number of entries in XLT1 table + * XLT2 - Number of entries in XLT2 table + * TCAM - Number of entries Profile ID TCAM table + * CDID - Control Domain ID of the hardware block + * PRED - Number of entries in the Profile Redirection Table + * FV - Number of entries in the Field Vector + * FVW - Width (in WORDs) of the Field Vector + * OVR - Overwrite existing table entries + * REV - Reverse FV + */ + /* XLT1 , XLT2 ,TCAM, PID,CDID,PRED, FV, FVW */ + /* Overwrite , Reverse FV */ + /* SW */ { ICE_XLT1_CNT, ICE_XLT2_CNT, 512, 256, 0, 256, 256, 48, + false, false }, + /* ACL */ { ICE_XLT1_CNT, ICE_XLT2_CNT, 512, 128, 0, 128, 128, 32, + false, false }, + /* FD */ { ICE_XLT1_CNT, ICE_XLT2_CNT, 512, 128, 0, 128, 128, 24, + false, true }, + /* RSS */ { ICE_XLT1_CNT, ICE_XLT2_CNT, 512, 128, 0, 128, 128, 24, + true, true }, + /* PE */ { ICE_XLT1_CNT, ICE_XLT2_CNT, 64, 32, 0, 32, 32, 24, + false, false }, +}; + +enum ice_sid_all { + ICE_SID_XLT1_OFF = 0, + ICE_SID_XLT2_OFF, + ICE_SID_PR_OFF, + ICE_SID_PR_REDIR_OFF, + ICE_SID_ES_OFF, + ICE_SID_OFF_COUNT, +}; + +/* Block / table section IDs */ +static const uint32_t ice_blk_sids[ICE_BLK_COUNT][ICE_SID_OFF_COUNT] = { + /* SWITCH */ + { ICE_SID_XLT1_SW, + ICE_SID_XLT2_SW, + ICE_SID_PROFID_TCAM_SW, + ICE_SID_PROFID_REDIR_SW, + ICE_SID_FLD_VEC_SW + }, + + /* ACL */ + { ICE_SID_XLT1_ACL, + ICE_SID_XLT2_ACL, + ICE_SID_PROFID_TCAM_ACL, + ICE_SID_PROFID_REDIR_ACL, + ICE_SID_FLD_VEC_ACL + }, + + /* FD */ + { ICE_SID_XLT1_FD, + ICE_SID_XLT2_FD, + ICE_SID_PROFID_TCAM_FD, + ICE_SID_PROFID_REDIR_FD, + ICE_SID_FLD_VEC_FD + }, + + /* RSS */ + { ICE_SID_XLT1_RSS, + ICE_SID_XLT2_RSS, + ICE_SID_PROFID_TCAM_RSS, + ICE_SID_PROFID_REDIR_RSS, + ICE_SID_FLD_VEC_RSS + }, + + /* PE */ + { ICE_SID_XLT1_PE, + ICE_SID_XLT2_PE, + ICE_SID_PROFID_TCAM_PE, + ICE_SID_PROFID_REDIR_PE, + ICE_SID_FLD_VEC_PE + } +}; + +/** + * ice_init_hw_tbls - init hardware table memory + * @hw: pointer to the hardware structure + */ +enum ice_status +ice_init_hw_tbls(struct ice_hw *hw) +{ + uint8_t i; +#if 0 + ice_init_lock(&hw->rss_locks); +#endif + TAILQ_INIT(&hw->rss_list_head); + for (i = 0; i < ICE_BLK_COUNT; i++) { + struct ice_prof_redir *prof_redir = &hw->blk[i].prof_redir; + struct ice_prof_tcam *prof = &hw->blk[i].prof; + struct ice_xlt1 *xlt1 = &hw->blk[i].xlt1; + struct ice_xlt2 *xlt2 = &hw->blk[i].xlt2; + struct ice_es *es = &hw->blk[i].es; + uint16_t j; + + if (hw->blk[i].is_list_init) + continue; + + ice_init_flow_profs(hw, i); + ice_init_lock(&es->prof_map_lock); + TAILQ_INIT(&es->prof_map); + hw->blk[i].is_list_init = true; + + hw->blk[i].overwrite = blk_sizes[i].overwrite; + es->reverse = blk_sizes[i].reverse; + + xlt1->sid = ice_blk_sids[i][ICE_SID_XLT1_OFF]; + xlt1->count = blk_sizes[i].xlt1; + + xlt1->ptypes = (struct ice_ptg_ptype *) + ice_calloc(hw, xlt1->count, sizeof(*xlt1->ptypes)); + + if (!xlt1->ptypes) + goto err; + + xlt1->ptg_tbl = (struct ice_ptg_entry *) + ice_calloc(hw, ICE_MAX_PTGS, sizeof(*xlt1->ptg_tbl)); + + if (!xlt1->ptg_tbl) + goto err; + + xlt1->t = (uint8_t *)ice_calloc(hw, xlt1->count, + sizeof(*xlt1->t)); + if (!xlt1->t) + goto err; + + xlt2->sid = ice_blk_sids[i][ICE_SID_XLT2_OFF]; + xlt2->count = blk_sizes[i].xlt2; + + xlt2->vsis = (struct ice_vsig_vsi *) + ice_calloc(hw, xlt2->count, sizeof(*xlt2->vsis)); + + if (!xlt2->vsis) + goto err; + + xlt2->vsig_tbl = (struct ice_vsig_entry *) + ice_calloc(hw, xlt2->count, sizeof(*xlt2->vsig_tbl)); + if (!xlt2->vsig_tbl) + goto err; + + for (j = 0; j < xlt2->count; j++) + TAILQ_INIT(&xlt2->vsig_tbl[j].prop_lst); + + xlt2->t = (uint16_t *)ice_calloc(hw, xlt2->count, + sizeof(*xlt2->t)); + if (!xlt2->t) + goto err; + + prof->sid = ice_blk_sids[i][ICE_SID_PR_OFF]; + prof->count = blk_sizes[i].prof_tcam; + prof->max_prof_id = blk_sizes[i].prof_id; + prof->cdid_bits = blk_sizes[i].prof_cdid_bits; + prof->t = (struct ice_prof_tcam_entry *) + ice_calloc(hw, prof->count, sizeof(*prof->t)); + + if (!prof->t) + goto err; + + prof_redir->sid = ice_blk_sids[i][ICE_SID_PR_REDIR_OFF]; + prof_redir->count = blk_sizes[i].prof_redir; + prof_redir->t = (uint8_t *)ice_calloc(hw, prof_redir->count, + sizeof(*prof_redir->t)); + + if (!prof_redir->t) + goto err; + + es->sid = ice_blk_sids[i][ICE_SID_ES_OFF]; + es->count = blk_sizes[i].es; + es->fvw = blk_sizes[i].fvw; + es->t = (struct ice_fv_word *) + ice_calloc(hw, (uint32_t)(es->count * es->fvw), + sizeof(*es->t)); + if (!es->t) + goto err; + + es->ref_count = (uint16_t *) + ice_calloc(hw, es->count, sizeof(*es->ref_count)); + + if (!es->ref_count) + goto err; + + es->written = (uint8_t *) + ice_calloc(hw, es->count, sizeof(*es->written)); + + if (!es->written) + goto err; + + } + return ICE_SUCCESS; + +err: + ice_free_hw_tbls(hw); + return ICE_ERR_NO_MEMORY; +} + +enum ice_status +ice_init_hw(struct ice_hw *hw) +{ + struct ice_softc *sc = hw->hw_sc; + struct ice_aqc_get_phy_caps_data *pcaps; + enum ice_status status; + uint16_t mac_buf_len; + void *mac_buf; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + /* Set MAC type based on DeviceID */ + ice_set_mac_type(hw); + + hw->pf_id = (uint8_t)(ICE_READ(hw, PF_FUNC_RID) & + PF_FUNC_RID_FUNCTION_NUMBER_M) >> + PF_FUNC_RID_FUNCTION_NUMBER_S; + + status = ice_reset(hw, ICE_RESET_PFR); + if (status) + return status; + + ice_get_itr_intrl_gran(hw); + + status = ice_create_all_ctrlq(hw); + if (status) + goto err_unroll_cqinit; + + ice_fwlog_set_support_ena(hw); + status = ice_fwlog_set(hw, &hw->fwlog_cfg); + if (status) { + DNPRINTF(ICE_DBG_INIT, + "Failed to enable FW logging, status %d.\n", status); + } else { + if (hw->fwlog_cfg.options & ICE_FWLOG_OPTION_REGISTER_ON_INIT) { + status = ice_fwlog_register(hw); + if (status) + DNPRINTF(ICE_DBG_INIT, + "Failed to register for FW logging " + "events, status %d.\n", status); + } else { + status = ice_fwlog_unregister(hw); + if (status) + DNPRINTF(ICE_DBG_INIT, "Failed to unregister " + "for FW logging events, status %d.\n", + status); + } + } + + status = ice_init_nvm(hw); + if (status) + goto err_unroll_cqinit; + + if (ice_get_fw_mode(hw) == ICE_FW_MODE_ROLLBACK) + ice_print_rollback_msg(hw); + + status = ice_clear_pf_cfg(hw); + if (status) + goto err_unroll_cqinit; + + ice_clear_pxe_mode(hw); + + status = ice_get_caps(hw); + if (status) + goto err_unroll_cqinit; + + if (!hw->port_info) + hw->port_info = (struct ice_port_info *) + ice_malloc(hw, sizeof(*hw->port_info)); + if (!hw->port_info) { + status = ICE_ERR_NO_MEMORY; + goto err_unroll_cqinit; + } + + /* set the back pointer to HW */ + hw->port_info->hw = hw; + + /* Initialize port_info struct with switch configuration data */ + status = ice_get_initial_sw_cfg(hw); + if (status) + goto err_unroll_alloc; + + hw->evb_veb = true; + /* Query the allocated resources for Tx scheduler */ + status = ice_sched_query_res_alloc(hw); + if (status) { + DNPRINTF(ICE_DBG_SCHED, + "Failed to get scheduler allocated resources\n"); + goto err_unroll_alloc; + } + ice_sched_get_psm_clk_freq(hw); + + /* Initialize port_info struct with scheduler data */ + status = ice_sched_init_port(hw->port_info); + if (status) + goto err_unroll_sched; + pcaps = (struct ice_aqc_get_phy_caps_data *) + ice_malloc(hw, sizeof(*pcaps)); + if (!pcaps) { + status = ICE_ERR_NO_MEMORY; + goto err_unroll_sched; + } + /* Initialize port_info struct with PHY capabilities */ + status = ice_aq_get_phy_caps(hw->port_info, false, + ICE_AQC_REPORT_TOPO_CAP_MEDIA, pcaps, NULL); + ice_free(hw, pcaps); + if (status) + printf("%s: Get PHY capabilities failed status = %d, " + "continuing anyway\n", sc->sc_dev.dv_xname, status); + + /* Initialize port_info struct with link information */ + status = ice_aq_get_link_info(hw->port_info, false, NULL, NULL); + if (status) + goto err_unroll_sched; + /* need a valid SW entry point to build a Tx tree */ + if (!hw->sw_entry_point_layer) { + DNPRINTF(ICE_DBG_SCHED, "invalid sw entry point\n"); + status = ICE_ERR_CFG; + goto err_unroll_sched; + } + + TAILQ_INIT(&hw->agg_list); + /* Initialize max burst size */ + if (!hw->max_burst_size) + ice_cfg_rl_burst_size(hw, ICE_SCHED_DFLT_BURST_SIZE); + + status = ice_init_fltr_mgmt_struct(hw); + if (status) + goto err_unroll_sched; + + /* Get MAC information */ + + /* A single port can report up to two (LAN and WoL) addresses */ + mac_buf = ice_calloc(hw, 2, + sizeof(struct ice_aqc_manage_mac_read_resp)); + mac_buf_len = 2 * sizeof(struct ice_aqc_manage_mac_read_resp); + + if (!mac_buf) { + status = ICE_ERR_NO_MEMORY; + goto err_unroll_fltr_mgmt_struct; + } + + status = ice_aq_manage_mac_read(hw, mac_buf, mac_buf_len, NULL); + ice_free(hw, mac_buf); + + if (status) + goto err_unroll_fltr_mgmt_struct; + + /* enable jumbo frame support at MAC level */ + status = ice_aq_set_mac_cfg(hw, ICE_AQ_SET_MAC_FRAME_SIZE_MAX, false, + NULL); + if (status) + goto err_unroll_fltr_mgmt_struct; + + status = ice_init_hw_tbls(hw); + if (status) + goto err_unroll_fltr_mgmt_struct; +#if 0 + ice_init_lock(&hw->tnl_lock); +#endif + return ICE_SUCCESS; +err_unroll_fltr_mgmt_struct: + ice_cleanup_fltr_mgmt_struct(hw); +err_unroll_sched: + ice_sched_cleanup_all(hw); +err_unroll_alloc: + ice_free(hw, hw->port_info); + hw->port_info = NULL; +err_unroll_cqinit: + ice_destroy_all_ctrlq(hw); + return status; +} + +/** + * ice_deinit_hw - unroll initialization operations done by ice_init_hw + * @hw: pointer to the hardware structure + * + * This should be called only during nominal operation, not as a result of + * ice_init_hw() failing since ice_init_hw() will take care of unrolling + * applicable initializations if it fails for any reason. + */ +void ice_deinit_hw(struct ice_hw *hw) +{ + ice_cleanup_fltr_mgmt_struct(hw); + + ice_sched_cleanup_all(hw); +#if 0 + ice_sched_clear_agg(hw); + ice_free_seg(hw); +#endif + ice_free_hw_tbls(hw); +#if 0 + ice_destroy_lock(&hw->tnl_lock); +#endif + if (hw->port_info) { + ice_free(hw, hw->port_info); + hw->port_info = NULL; + } + + ice_destroy_all_ctrlq(hw); +#if 0 + /* Clear VSI contexts if not already cleared */ + ice_clear_all_vsi_ctx(hw); +#endif +} + +void +ice_rxfill(struct ice_softc *sc, struct ice_rx_queue *rxq) +{ + union ice_32b_rx_flex_desc *ring, *rxd; + struct ice_rx_map *rxm; + bus_dmamap_t map; + struct mbuf *m; + unsigned int prod; + unsigned int slots; + unsigned int mask; + int post = 0; + + slots = if_rxr_get(&rxq->rxq_acct, rxq->desc_count); + if (slots == 0) + return; + + prod = rxq->rxq_prod; + + ring = ICE_DMA_KVA(&rxq->rx_desc_mem); + mask = rxq->desc_count - 1; + + do { + rxm = &rxq->rx_map[prod]; + + m = MCLGETL(NULL, M_DONTWAIT, MCLBYTES + ETHER_ALIGN); + if (m == NULL) + break; + m->m_data += (m->m_ext.ext_size - (MCLBYTES + ETHER_ALIGN)); + m->m_len = m->m_pkthdr.len = MCLBYTES + ETHER_ALIGN; + + map = rxm->rxm_map; + + if (bus_dmamap_load_mbuf(sc->sc_dmat, map, m, + BUS_DMA_NOWAIT) != 0) { + m_freem(m); + break; + } + + rxm->rxm_m = m; + + bus_dmamap_sync(sc->sc_dmat, map, 0, map->dm_mapsize, + BUS_DMASYNC_PREREAD); + + rxd = &ring[prod]; + + htolem64(&rxd->read.pkt_addr, map->dm_segs[0].ds_addr); + rxd->read.hdr_addr = htole64(0); + + prod++; + prod &= mask; + + post = 1; + } while (--slots); + + if_rxr_put(&rxq->rxq_acct, slots); + + if (if_rxr_inuse(&rxq->rxq_acct) == 0) + timeout_add(&rxq->rxq_refill, 1); + else if (post) { + rxq->rxq_prod = prod; + ICE_WRITE(&sc->hw, rxq->tail, prod); + } +} + +/** + * ice_aq_manage_mac_write - manage MAC address write command + * @hw: pointer to the HW struct + * @mac_addr: MAC address to be written as LAA/LAA+WoL/Port address + * @flags: flags to control write behavior + * @cd: pointer to command details structure or NULL + * + * This function is used to write MAC address to the NVM (0x0108). + */ +enum ice_status +ice_aq_manage_mac_write(struct ice_hw *hw, const uint8_t *mac_addr, + uint8_t flags, struct ice_sq_cd *cd) +{ + struct ice_aqc_manage_mac_write *cmd; + struct ice_aq_desc desc; + + cmd = &desc.params.mac_write; + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_manage_mac_write); + + cmd->flags = flags; + memcpy(cmd->mac_addr, mac_addr, ETHER_ADDR_LEN); + + return ice_aq_send_cmd(hw, &desc, NULL, 0, cd); +} + +/** + * ice_update_laa_mac - Update MAC address if Locally Administered + * @sc: the device softc + * + * Update the device MAC address when a Locally Administered Address is + * assigned. + * + * This function does *not* update the MAC filter list itself. Instead, it + * should be called after ice_rm_pf_default_mac_filters, so that the previous + * address filter will be removed, and before ice_cfg_pf_default_mac_filters, + * so that the new address filter will be assigned. + */ +void +ice_update_laa_mac(struct ice_softc *sc) +{ + struct ifnet *ifp = &sc->sc_ac.ac_if; + uint8_t *lladdr = ((struct arpcom *)ifp)->ac_enaddr; + struct ice_hw *hw = &sc->hw; + enum ice_status status; + + /* Desired address already set in hardware? */ + if (!memcmp(lladdr, hw->port_info->mac.lan_addr, ETHER_ADDR_LEN)) + return; + + status = ice_aq_manage_mac_write(hw, lladdr, + ICE_AQC_MAN_MAC_UPDATE_LAA_WOL, NULL); + if (status) { + printf("%s: Failed to write mac %s to firmware, " + "err %s aq_err %s\n", sc->sc_dev.dv_xname, + ether_sprintf(lladdr), ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + return; + } + + /* Cache current hardware address. */ + memcpy(hw->port_info->mac.lan_addr, lladdr, ETHER_ADDR_LEN); +} + +/** + * ice_add_mac_to_list - Add MAC filter to a MAC filter list + * @vsi: the VSI to forward to + * @list: list which contains MAC filter entries + * @addr: the MAC address to be added + * @action: filter action to perform on match + * + * Adds a MAC address filter to the list which will be forwarded to firmware + * to add a series of MAC address filters. + * + * Returns 0 on success, and an error code on failure. + * + */ +int +ice_add_mac_to_list(struct ice_vsi *vsi, struct ice_fltr_list_head *list, + const uint8_t *addr, enum ice_sw_fwd_act_type action) +{ + struct ice_fltr_list_entry *entry; + + entry = malloc(sizeof(*entry), M_DEVBUF, M_NOWAIT|M_ZERO); + if (!entry) + return (ENOMEM); + + entry->fltr_info.flag = ICE_FLTR_TX; + entry->fltr_info.src_id = ICE_SRC_ID_VSI; + entry->fltr_info.lkup_type = ICE_SW_LKUP_MAC; + entry->fltr_info.fltr_act = action; + entry->fltr_info.vsi_handle = vsi->idx; + memcpy(entry->fltr_info.l_data.mac.mac_addr, addr, ETHER_ADDR_LEN); + + TAILQ_INSERT_HEAD(list, entry, list_entry); + + return 0; +} + +/** + * ice_free_fltr_list - Free memory associated with a MAC address list + * @list: the list to free + * + * Free the memory of each entry associated with the list. + */ +void +ice_free_fltr_list(struct ice_fltr_list_head *list) +{ + struct ice_fltr_list_entry *e, *tmp; + + TAILQ_FOREACH_SAFE(e, list, list_entry, tmp) { + TAILQ_REMOVE(list, e, list_entry); + free(e, M_DEVBUF, sizeof(*e)); + } +} + +/** + * ice_find_rule_entry - Search a rule entry + * @list_head: head of rule list + * @f_info: rule information + * + * Helper function to search for a given rule entry + * Returns pointer to entry storing the rule if found + */ +struct ice_fltr_mgmt_list_entry * +ice_find_rule_entry(struct ice_fltr_mgmt_list_head *list_head, + struct ice_fltr_info *f_info) +{ + struct ice_fltr_mgmt_list_entry *list_itr, *ret = NULL; + + TAILQ_FOREACH(list_itr, list_head, list_entry) { + if (!memcmp(&f_info->l_data, &list_itr->fltr_info.l_data, + sizeof(f_info->l_data)) && + f_info->flag == list_itr->fltr_info.flag) { + ret = list_itr; + break; + } + } + + return ret; +} + +/* Dummy ethernet header needed in the ice_sw_rule_* + * struct to configure any switch filter rules. + * {DA (6 bytes), SA(6 bytes), + * Ether type (2 bytes for header without VLAN tag) OR + * VLAN tag (4 bytes for header with VLAN tag) } + * + * Word on Hardcoded values + * byte 0 = 0x2: to identify it as locally administered DA MAC + * byte 6 = 0x2: to identify it as locally administered SA MAC + * byte 12 = 0x81 & byte 13 = 0x00: + * In case of VLAN filter first two bytes defines ether type (0x8100) + * and remaining two bytes are placeholder for programming a given VLAN ID + * In case of Ether type filter it is treated as header without VLAN tag + * and byte 12 and 13 is used to program a given Ether type instead + */ +static const uint8_t dummy_eth_header[ICE_DUMMY_ETH_HDR_LEN] = { + 0x2, 0, 0, 0, 0, 0, 0x2, 0, 0, 0, 0, 0, 0x81, 0, 0, 0 +}; + +#define ICE_ETH_DA_OFFSET 0 +#define ICE_ETH_ETHTYPE_OFFSET 12 +#define ICE_ETH_VLAN_TCI_OFFSET 14 +#define ICE_MAX_VLAN_ID 0xFFF +#define ICE_IPV6_ETHER_ID 0x86DD +#define ICE_PPP_IPV6_PROTO_ID 0x0057 +#define ICE_ETH_P_8021Q 0x8100 + +/** + * ice_fill_sw_info - Helper function to populate lb_en and lan_en + * @hw: pointer to the hardware structure + * @fi: filter info structure to fill/update + * + * This helper function populates the lb_en and lan_en elements of the provided + * ice_fltr_info struct using the switch's type and characteristics of the + * switch rule being configured. + */ +void +ice_fill_sw_info(struct ice_hw *hw, struct ice_fltr_info *fi) +{ + fi->lb_en = false; + fi->lan_en = false; + if ((fi->flag & ICE_FLTR_TX) && + (fi->fltr_act == ICE_FWD_TO_VSI || + fi->fltr_act == ICE_FWD_TO_VSI_LIST || + fi->fltr_act == ICE_FWD_TO_Q || + fi->fltr_act == ICE_FWD_TO_QGRP)) { + /* Setting LB for prune actions will result in replicated + * packets to the internal switch that will be dropped. + */ + if (fi->lkup_type != ICE_SW_LKUP_VLAN) + fi->lb_en = true; + + /* Set lan_en to TRUE if + * 1. The switch is a VEB AND + * 2 + * 2.1 The lookup is a directional lookup like ethertype, + * promiscuous, ethertype-MAC, promiscuous-VLAN + * and default-port OR + * 2.2 The lookup is VLAN, OR + * 2.3 The lookup is MAC with mcast or bcast addr for MAC, OR + * 2.4 The lookup is MAC_VLAN with mcast or bcast addr for MAC. + * + * OR + * + * The switch is a VEPA. + * + * In all other cases, the LAN enable has to be set to false. + */ + + if (hw->evb_veb) { + if (fi->lkup_type == ICE_SW_LKUP_ETHERTYPE || + fi->lkup_type == ICE_SW_LKUP_PROMISC || + fi->lkup_type == ICE_SW_LKUP_ETHERTYPE_MAC || + fi->lkup_type == ICE_SW_LKUP_PROMISC_VLAN || + fi->lkup_type == ICE_SW_LKUP_DFLT || + fi->lkup_type == ICE_SW_LKUP_VLAN || + (fi->lkup_type == ICE_SW_LKUP_MAC && + ETHER_IS_MULTICAST(fi->l_data.mac.mac_addr)) || + (fi->lkup_type == ICE_SW_LKUP_MAC_VLAN && + ETHER_IS_MULTICAST(fi->l_data.mac.mac_addr))) + fi->lan_en = true; + } else { + fi->lan_en = true; + } + } + + /* To be able to receive packets coming from the VF on the same PF, + * unicast filter needs to be added without LB_EN bit + */ + if (fi->flag & ICE_FLTR_RX_LB) { + fi->lb_en = false; + fi->lan_en = true; + } +} + +/** + * ice_fill_sw_rule - Helper function to fill switch rule structure + * @hw: pointer to the hardware structure + * @f_info: entry containing packet forwarding information + * @s_rule: switch rule structure to be filled in based on mac_entry + * @opc: switch rules population command type - pass in the command opcode + */ +void +ice_fill_sw_rule(struct ice_hw *hw, struct ice_fltr_info *f_info, + struct ice_sw_rule_lkup_rx_tx *s_rule, + enum ice_adminq_opc opc) +{ + uint16_t vlan_id = ICE_MAX_VLAN_ID + 1; + uint16_t vlan_tpid = ICE_ETH_P_8021Q; + void *daddr = NULL; + uint16_t eth_hdr_sz; + uint8_t *eth_hdr; + uint32_t act = 0; + uint16_t *off; + uint8_t q_rgn; + + if (opc == ice_aqc_opc_remove_sw_rules) { + s_rule->act = 0; + s_rule->index = htole16(f_info->fltr_rule_id); + s_rule->hdr_len = 0; + return; + } + + eth_hdr_sz = sizeof(dummy_eth_header); + eth_hdr = s_rule->hdr_data; + + /* initialize the ether header with a dummy header */ + memcpy(eth_hdr, dummy_eth_header, eth_hdr_sz); + ice_fill_sw_info(hw, f_info); + + switch (f_info->fltr_act) { + case ICE_FWD_TO_VSI: + act |= (f_info->fwd_id.hw_vsi_id << ICE_SINGLE_ACT_VSI_ID_S) & + ICE_SINGLE_ACT_VSI_ID_M; + if (f_info->lkup_type != ICE_SW_LKUP_VLAN) + act |= ICE_SINGLE_ACT_VSI_FORWARDING | + ICE_SINGLE_ACT_VALID_BIT; + break; + case ICE_FWD_TO_VSI_LIST: + act |= ICE_SINGLE_ACT_VSI_LIST; + act |= (f_info->fwd_id.vsi_list_id << + ICE_SINGLE_ACT_VSI_LIST_ID_S) & + ICE_SINGLE_ACT_VSI_LIST_ID_M; + if (f_info->lkup_type != ICE_SW_LKUP_VLAN) + act |= ICE_SINGLE_ACT_VSI_FORWARDING | + ICE_SINGLE_ACT_VALID_BIT; + break; + case ICE_FWD_TO_Q: + act |= ICE_SINGLE_ACT_TO_Q; + act |= (f_info->fwd_id.q_id << ICE_SINGLE_ACT_Q_INDEX_S) & + ICE_SINGLE_ACT_Q_INDEX_M; + break; + case ICE_DROP_PACKET: + act |= ICE_SINGLE_ACT_VSI_FORWARDING | ICE_SINGLE_ACT_DROP | + ICE_SINGLE_ACT_VALID_BIT; + break; + case ICE_FWD_TO_QGRP: + q_rgn = f_info->qgrp_size > 0 ? + (uint8_t)ice_ilog2(f_info->qgrp_size) : 0; + act |= ICE_SINGLE_ACT_TO_Q; + act |= (f_info->fwd_id.q_id << ICE_SINGLE_ACT_Q_INDEX_S) & + ICE_SINGLE_ACT_Q_INDEX_M; + act |= (q_rgn << ICE_SINGLE_ACT_Q_REGION_S) & + ICE_SINGLE_ACT_Q_REGION_M; + break; + default: + return; + } + + if (f_info->lb_en) + act |= ICE_SINGLE_ACT_LB_ENABLE; + if (f_info->lan_en) + act |= ICE_SINGLE_ACT_LAN_ENABLE; + + switch (f_info->lkup_type) { + case ICE_SW_LKUP_MAC: + daddr = f_info->l_data.mac.mac_addr; + break; + case ICE_SW_LKUP_VLAN: + vlan_id = f_info->l_data.vlan.vlan_id; + if (f_info->l_data.vlan.tpid_valid) + vlan_tpid = f_info->l_data.vlan.tpid; + if (f_info->fltr_act == ICE_FWD_TO_VSI || + f_info->fltr_act == ICE_FWD_TO_VSI_LIST) { + act |= ICE_SINGLE_ACT_PRUNE; + act |= ICE_SINGLE_ACT_EGRESS | ICE_SINGLE_ACT_INGRESS; + } + break; + case ICE_SW_LKUP_ETHERTYPE_MAC: + daddr = f_info->l_data.ethertype_mac.mac_addr; + /* fall-through */ + case ICE_SW_LKUP_ETHERTYPE: + off = (uint16_t *)(eth_hdr + ICE_ETH_ETHTYPE_OFFSET); + *off = htobe16(f_info->l_data.ethertype_mac.ethertype); + break; + case ICE_SW_LKUP_MAC_VLAN: + daddr = f_info->l_data.mac_vlan.mac_addr; + vlan_id = f_info->l_data.mac_vlan.vlan_id; + break; + case ICE_SW_LKUP_PROMISC_VLAN: + vlan_id = f_info->l_data.mac_vlan.vlan_id; + /* fall-through */ + case ICE_SW_LKUP_PROMISC: + daddr = f_info->l_data.mac_vlan.mac_addr; + break; + default: + break; + } + + s_rule->hdr.type = (f_info->flag & ICE_FLTR_RX) ? + htole16(ICE_AQC_SW_RULES_T_LKUP_RX) : + htole16(ICE_AQC_SW_RULES_T_LKUP_TX); + + /* Recipe set depending on lookup type */ + s_rule->recipe_id = htole16(f_info->lkup_type); + s_rule->src = htole16(f_info->src); + s_rule->act = htole32(act); + + if (daddr) + memcpy(eth_hdr + ICE_ETH_DA_OFFSET, daddr, ETHER_ADDR_LEN); + + if (!(vlan_id > ICE_MAX_VLAN_ID)) { + off = (uint16_t *)(eth_hdr + ICE_ETH_VLAN_TCI_OFFSET); + *off = htobe16(vlan_id); + off = (uint16_t *)(eth_hdr + ICE_ETH_ETHTYPE_OFFSET); + *off = htobe16(vlan_tpid); + } + + /* Create the switch rule with the final dummy Ethernet header */ + if (opc != ice_aqc_opc_update_sw_rules) + s_rule->hdr_len = htole16(eth_hdr_sz); +} + +/** + * ice_aq_sw_rules - add/update/remove switch rules + * @hw: pointer to the HW struct + * @rule_list: pointer to switch rule population list + * @rule_list_sz: total size of the rule list in bytes + * @num_rules: number of switch rules in the rule_list + * @opc: switch rules population command type - pass in the command opcode + * @cd: pointer to command details structure or NULL + * + * Add(0x02a0)/Update(0x02a1)/Remove(0x02a2) switch rules commands to firmware + */ +enum ice_status +ice_aq_sw_rules(struct ice_hw *hw, void *rule_list, uint16_t rule_list_sz, + uint8_t num_rules, enum ice_adminq_opc opc, + struct ice_sq_cd *cd) +{ + struct ice_aq_desc desc; + enum ice_status status; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + if (opc != ice_aqc_opc_add_sw_rules && + opc != ice_aqc_opc_update_sw_rules && + opc != ice_aqc_opc_remove_sw_rules) + return ICE_ERR_PARAM; + + ice_fill_dflt_direct_cmd_desc(&desc, opc); + + desc.flags |= htole16(ICE_AQ_FLAG_RD); + desc.params.sw_rules.num_rules_fltr_entry_index = htole16(num_rules); + status = ice_aq_send_cmd(hw, &desc, rule_list, rule_list_sz, cd); + if (opc != ice_aqc_opc_add_sw_rules && + hw->adminq.sq_last_status == ICE_AQ_RC_ENOENT) + status = ICE_ERR_DOES_NOT_EXIST; + + return status; +} + +/** + * ice_create_pkt_fwd_rule + * @hw: pointer to the hardware structure + * @recp_list: corresponding filter management list + * @f_entry: entry containing packet forwarding information + * + * Create switch rule with given filter information and add an entry + * to the corresponding filter management list to track this switch rule + * and VSI mapping + */ +enum ice_status +ice_create_pkt_fwd_rule(struct ice_hw *hw, struct ice_sw_recipe *recp_list, + struct ice_fltr_list_entry *f_entry) +{ + struct ice_fltr_mgmt_list_entry *fm_entry; + struct ice_sw_rule_lkup_rx_tx *s_rule; + enum ice_status status; + + s_rule = (struct ice_sw_rule_lkup_rx_tx *) + ice_malloc(hw, ice_struct_size(s_rule, hdr_data, + ICE_DUMMY_ETH_HDR_LEN)); + if (!s_rule) + return ICE_ERR_NO_MEMORY; + fm_entry = (struct ice_fltr_mgmt_list_entry *) + ice_malloc(hw, sizeof(*fm_entry)); + if (!fm_entry) { + status = ICE_ERR_NO_MEMORY; + goto ice_create_pkt_fwd_rule_exit; + } + + fm_entry->fltr_info = f_entry->fltr_info; + + /* Initialize all the fields for the management entry */ + fm_entry->vsi_count = 1; + fm_entry->lg_act_idx = ICE_INVAL_LG_ACT_INDEX; + fm_entry->sw_marker_id = ICE_INVAL_SW_MARKER_ID; + fm_entry->counter_index = ICE_INVAL_COUNTER_ID; + + ice_fill_sw_rule(hw, &fm_entry->fltr_info, s_rule, + ice_aqc_opc_add_sw_rules); + + status = ice_aq_sw_rules(hw, s_rule, + ice_struct_size(s_rule, hdr_data, + ICE_DUMMY_ETH_HDR_LEN), + 1, ice_aqc_opc_add_sw_rules, NULL); + if (status) { + ice_free(hw, fm_entry); + goto ice_create_pkt_fwd_rule_exit; + } + + f_entry->fltr_info.fltr_rule_id = le16toh(s_rule->index); + fm_entry->fltr_info.fltr_rule_id = le16toh(s_rule->index); + + /* The book keeping entries will get removed when base driver + * calls remove filter AQ command + */ + TAILQ_INSERT_HEAD(&recp_list->filt_rules, fm_entry, list_entry); + +ice_create_pkt_fwd_rule_exit: + ice_free(hw, s_rule); + return status; +} + +/** + * ice_aq_alloc_free_res - command to allocate/free resources + * @hw: pointer to the HW struct + * @num_entries: number of resource entries in buffer + * @buf: Indirect buffer to hold data parameters and response + * @buf_size: size of buffer for indirect commands + * @opc: pass in the command opcode + * @cd: pointer to command details structure or NULL + * + * Helper function to allocate/free resources using the admin queue commands + */ +enum ice_status +ice_aq_alloc_free_res(struct ice_hw *hw, uint16_t num_entries, + struct ice_aqc_alloc_free_res_elem *buf, uint16_t buf_size, + enum ice_adminq_opc opc, struct ice_sq_cd *cd) +{ + struct ice_aqc_alloc_free_res_cmd *cmd; + struct ice_aq_desc desc; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + cmd = &desc.params.sw_res_ctrl; + + if (!buf) + return ICE_ERR_PARAM; + + if (buf_size < FLEX_ARRAY_SIZE(buf, elem, num_entries)) + return ICE_ERR_PARAM; + + ice_fill_dflt_direct_cmd_desc(&desc, opc); + + desc.flags |= htole16(ICE_AQ_FLAG_RD); + + cmd->num_entries = htole16(num_entries); + + return ice_aq_send_cmd(hw, &desc, buf, buf_size, cd); +} + +/** + * ice_aq_alloc_free_vsi_list + * @hw: pointer to the HW struct + * @vsi_list_id: VSI list ID returned or used for lookup + * @lkup_type: switch rule filter lookup type + * @opc: switch rules population command type - pass in the command opcode + * + * allocates or free a VSI list resource + */ +enum ice_status +ice_aq_alloc_free_vsi_list(struct ice_hw *hw, uint16_t *vsi_list_id, + enum ice_sw_lkup_type lkup_type, + enum ice_adminq_opc opc) +{ + struct ice_aqc_alloc_free_res_elem *sw_buf; + struct ice_aqc_res_elem *vsi_ele; + enum ice_status status; + uint16_t buf_len; + + buf_len = ice_struct_size(sw_buf, elem, 1); + sw_buf = (struct ice_aqc_alloc_free_res_elem *)ice_malloc(hw, buf_len); + if (!sw_buf) + return ICE_ERR_NO_MEMORY; + sw_buf->num_elems = htole16(1); + + if (lkup_type == ICE_SW_LKUP_MAC || + lkup_type == ICE_SW_LKUP_MAC_VLAN || + lkup_type == ICE_SW_LKUP_ETHERTYPE || + lkup_type == ICE_SW_LKUP_ETHERTYPE_MAC || + lkup_type == ICE_SW_LKUP_PROMISC || + lkup_type == ICE_SW_LKUP_PROMISC_VLAN || + lkup_type == ICE_SW_LKUP_DFLT || + lkup_type == ICE_SW_LKUP_LAST) { + sw_buf->res_type = htole16(ICE_AQC_RES_TYPE_VSI_LIST_REP); + } else if (lkup_type == ICE_SW_LKUP_VLAN) { + sw_buf->res_type = + htole16(ICE_AQC_RES_TYPE_VSI_LIST_PRUNE); + } else { + status = ICE_ERR_PARAM; + goto ice_aq_alloc_free_vsi_list_exit; + } + + if (opc == ice_aqc_opc_free_res) + sw_buf->elem[0].e.sw_resp = htole16(*vsi_list_id); + + status = ice_aq_alloc_free_res(hw, 1, sw_buf, buf_len, opc, NULL); + if (status) + goto ice_aq_alloc_free_vsi_list_exit; + + if (opc == ice_aqc_opc_alloc_res) { + vsi_ele = &sw_buf->elem[0]; + *vsi_list_id = le16toh(vsi_ele->e.sw_resp); + } + +ice_aq_alloc_free_vsi_list_exit: + ice_free(hw, sw_buf); + return status; +} + +/** + * ice_update_vsi_list_rule + * @hw: pointer to the hardware structure + * @vsi_handle_arr: array of VSI handles to form a VSI list + * @num_vsi: number of VSI handles in the array + * @vsi_list_id: VSI list ID generated as part of allocate resource + * @remove: Boolean value to indicate if this is a remove action + * @opc: switch rules population command type - pass in the command opcode + * @lkup_type: lookup type of the filter + * + * Call AQ command to add a new switch rule or update existing switch rule + * using the given VSI list ID + */ +enum ice_status +ice_update_vsi_list_rule(struct ice_hw *hw, uint16_t *vsi_handle_arr, + uint16_t num_vsi, uint16_t vsi_list_id, bool remove, + enum ice_adminq_opc opc, enum ice_sw_lkup_type lkup_type) +{ + struct ice_sw_rule_vsi_list *s_rule; + enum ice_status status; + uint16_t s_rule_size; + uint16_t rule_type; + int i; + + if (!num_vsi) + return ICE_ERR_PARAM; + + if (lkup_type == ICE_SW_LKUP_MAC || + lkup_type == ICE_SW_LKUP_MAC_VLAN || + lkup_type == ICE_SW_LKUP_ETHERTYPE || + lkup_type == ICE_SW_LKUP_ETHERTYPE_MAC || + lkup_type == ICE_SW_LKUP_PROMISC || + lkup_type == ICE_SW_LKUP_PROMISC_VLAN || + lkup_type == ICE_SW_LKUP_DFLT || + lkup_type == ICE_SW_LKUP_LAST) + rule_type = remove ? ICE_AQC_SW_RULES_T_VSI_LIST_CLEAR : + ICE_AQC_SW_RULES_T_VSI_LIST_SET; + else if (lkup_type == ICE_SW_LKUP_VLAN) + rule_type = remove ? ICE_AQC_SW_RULES_T_PRUNE_LIST_CLEAR : + ICE_AQC_SW_RULES_T_PRUNE_LIST_SET; + else + return ICE_ERR_PARAM; + + s_rule_size = (uint16_t)ice_struct_size(s_rule, vsi, num_vsi); + s_rule = (struct ice_sw_rule_vsi_list *)ice_malloc(hw, s_rule_size); + if (!s_rule) + return ICE_ERR_NO_MEMORY; + for (i = 0; i < num_vsi; i++) { + if (!ice_is_vsi_valid(hw, vsi_handle_arr[i])) { + status = ICE_ERR_PARAM; + goto exit; + } + /* AQ call requires hw_vsi_id(s) */ + s_rule->vsi[i] = + htole16(hw->vsi_ctx[vsi_handle_arr[i]]->vsi_num); + } + + s_rule->hdr.type = htole16(rule_type); + s_rule->number_vsi = htole16(num_vsi); + s_rule->index = htole16(vsi_list_id); + + status = ice_aq_sw_rules(hw, s_rule, s_rule_size, 1, opc, NULL); + +exit: + ice_free(hw, s_rule); + return status; +} + +/** + * ice_create_vsi_list_rule - Creates and populates a VSI list rule + * @hw: pointer to the HW struct + * @vsi_handle_arr: array of VSI handles to form a VSI list + * @num_vsi: number of VSI handles in the array + * @vsi_list_id: stores the ID of the VSI list to be created + * @lkup_type: switch rule filter's lookup type + */ +enum ice_status +ice_create_vsi_list_rule(struct ice_hw *hw, uint16_t *vsi_handle_arr, + uint16_t num_vsi, uint16_t *vsi_list_id, enum ice_sw_lkup_type lkup_type) +{ + enum ice_status status; + + status = ice_aq_alloc_free_vsi_list(hw, vsi_list_id, lkup_type, + ice_aqc_opc_alloc_res); + if (status) + return status; + + /* Update the newly created VSI list to include the specified VSIs */ + return ice_update_vsi_list_rule(hw, vsi_handle_arr, num_vsi, + *vsi_list_id, false, + ice_aqc_opc_add_sw_rules, lkup_type); +} + +/** + * ice_update_pkt_fwd_rule + * @hw: pointer to the hardware structure + * @f_info: filter information for switch rule + * + * Call AQ command to update a previously created switch rule with a + * VSI list ID + */ +enum ice_status +ice_update_pkt_fwd_rule(struct ice_hw *hw, struct ice_fltr_info *f_info) +{ + struct ice_sw_rule_lkup_rx_tx *s_rule; + enum ice_status status; + + s_rule = (struct ice_sw_rule_lkup_rx_tx *) + ice_malloc(hw, ice_struct_size(s_rule, hdr_data, + ICE_DUMMY_ETH_HDR_LEN)); + if (!s_rule) + return ICE_ERR_NO_MEMORY; + + ice_fill_sw_rule(hw, f_info, s_rule, ice_aqc_opc_update_sw_rules); + + s_rule->index = htole16(f_info->fltr_rule_id); + + /* Update switch rule with new rule set to forward VSI list */ + status = ice_aq_sw_rules(hw, s_rule, + ice_struct_size(s_rule, hdr_data, + ICE_DUMMY_ETH_HDR_LEN), + 1, ice_aqc_opc_update_sw_rules, NULL); + + ice_free(hw, s_rule); + return status; +} + +/** + * ice_create_vsi_list_map + * @hw: pointer to the hardware structure + * @vsi_handle_arr: array of VSI handles to set in the VSI mapping + * @num_vsi: number of VSI handles in the array + * @vsi_list_id: VSI list ID generated as part of allocate resource + * + * Helper function to create a new entry of VSI list ID to VSI mapping + * using the given VSI list ID + */ +struct ice_vsi_list_map_info * +ice_create_vsi_list_map(struct ice_hw *hw, uint16_t *vsi_handle_arr, + uint16_t num_vsi, uint16_t vsi_list_id) +{ + struct ice_switch_info *sw = hw->switch_info; + struct ice_vsi_list_map_info *v_map; + int i; + + v_map = (struct ice_vsi_list_map_info *)ice_malloc(hw, sizeof(*v_map)); + if (!v_map) + return NULL; + + v_map->vsi_list_id = vsi_list_id; + v_map->ref_cnt = 1; + for (i = 0; i < num_vsi; i++) + ice_set_bit(vsi_handle_arr[i], v_map->vsi_map); + + TAILQ_INSERT_HEAD(&sw->vsi_list_map_head, v_map, list_entry); + return v_map; +} + +/** + * ice_add_marker_act + * @hw: pointer to the hardware structure + * @m_ent: the management entry for which sw marker needs to be added + * @sw_marker: sw marker to tag the Rx descriptor with + * @l_id: large action resource ID + * + * Create a large action to hold software marker and update the switch rule + * entry pointed by m_ent with newly created large action + */ +enum ice_status +ice_add_marker_act(struct ice_hw *hw, struct ice_fltr_mgmt_list_entry *m_ent, + uint16_t sw_marker, uint16_t l_id) +{ + struct ice_sw_rule_lkup_rx_tx *rx_tx; + struct ice_sw_rule_lg_act *lg_act; + /* For software marker we need 3 large actions + * 1. FWD action: FWD TO VSI or VSI LIST + * 2. GENERIC VALUE action to hold the profile ID + * 3. GENERIC VALUE action to hold the software marker ID + */ + const uint16_t num_lg_acts = 3; + enum ice_status status; + uint16_t lg_act_size; + uint16_t rules_size; + uint32_t act; + uint16_t id; + + if (m_ent->fltr_info.lkup_type != ICE_SW_LKUP_MAC) + return ICE_ERR_PARAM; + + /* Create two back-to-back switch rules and submit them to the HW using + * one memory buffer: + * 1. Large Action + * 2. Look up Tx Rx + */ + lg_act_size = (uint16_t)ice_struct_size(lg_act, act, num_lg_acts); + rules_size = lg_act_size + + ice_struct_size(rx_tx, hdr_data, ICE_DUMMY_ETH_HDR_LEN); + lg_act = (struct ice_sw_rule_lg_act *)ice_malloc(hw, rules_size); + if (!lg_act) + return ICE_ERR_NO_MEMORY; + + rx_tx = (struct ice_sw_rule_lkup_rx_tx *)((uint8_t *)lg_act + + lg_act_size); + + /* Fill in the first switch rule i.e. large action */ + lg_act->hdr.type = htole16(ICE_AQC_SW_RULES_T_LG_ACT); + lg_act->index = htole16(l_id); + lg_act->size = htole16(num_lg_acts); + + /* First action VSI forwarding or VSI list forwarding depending on how + * many VSIs + */ + id = (m_ent->vsi_count > 1) ? m_ent->fltr_info.fwd_id.vsi_list_id : + m_ent->fltr_info.fwd_id.hw_vsi_id; + + act = ICE_LG_ACT_VSI_FORWARDING | ICE_LG_ACT_VALID_BIT; + act |= (id << ICE_LG_ACT_VSI_LIST_ID_S) & ICE_LG_ACT_VSI_LIST_ID_M; + if (m_ent->vsi_count > 1) + act |= ICE_LG_ACT_VSI_LIST; + lg_act->act[0] = htole32(act); + + /* Second action descriptor type */ + act = ICE_LG_ACT_GENERIC; + + act |= (1 << ICE_LG_ACT_GENERIC_VALUE_S) & ICE_LG_ACT_GENERIC_VALUE_M; + lg_act->act[1] = htole32(act); + + act = (ICE_LG_ACT_GENERIC_OFF_RX_DESC_PROF_IDX << + ICE_LG_ACT_GENERIC_OFFSET_S) & ICE_LG_ACT_GENERIC_OFFSET_M; + + /* Third action Marker value */ + act |= ICE_LG_ACT_GENERIC; + act |= (sw_marker << ICE_LG_ACT_GENERIC_VALUE_S) & + ICE_LG_ACT_GENERIC_VALUE_M; + + lg_act->act[2] = htole32(act); + + /* call the fill switch rule to fill the lookup Tx Rx structure */ + ice_fill_sw_rule(hw, &m_ent->fltr_info, rx_tx, + ice_aqc_opc_update_sw_rules); + + /* Update the action to point to the large action ID */ + rx_tx->act = htole32(ICE_SINGLE_ACT_PTR | + ((l_id << ICE_SINGLE_ACT_PTR_VAL_S) & ICE_SINGLE_ACT_PTR_VAL_M)); + + /* Use the filter rule ID of the previously created rule with single + * act. Once the update happens, hardware will treat this as large + * action + */ + rx_tx->index = htole16(m_ent->fltr_info.fltr_rule_id); + + status = ice_aq_sw_rules(hw, lg_act, rules_size, 2, + ice_aqc_opc_update_sw_rules, NULL); + if (!status) { + m_ent->lg_act_idx = l_id; + m_ent->sw_marker_id = sw_marker; + } + + ice_free(hw, lg_act); + return status; +} + +/** + * ice_add_update_vsi_list + * @hw: pointer to the hardware structure + * @m_entry: pointer to current filter management list entry + * @cur_fltr: filter information from the book keeping entry + * @new_fltr: filter information with the new VSI to be added + * + * Call AQ command to add or update previously created VSI list with new VSI. + * + * Helper function to do book keeping associated with adding filter information + * The algorithm to do the book keeping is described below : + * When a VSI needs to subscribe to a given filter (MAC/VLAN/Ethtype etc.) + * if only one VSI has been added till now + * Allocate a new VSI list and add two VSIs + * to this list using switch rule command + * Update the previously created switch rule with the + * newly created VSI list ID + * if a VSI list was previously created + * Add the new VSI to the previously created VSI list set + * using the update switch rule command + */ +enum ice_status +ice_add_update_vsi_list(struct ice_hw *hw, + struct ice_fltr_mgmt_list_entry *m_entry, + struct ice_fltr_info *cur_fltr, + struct ice_fltr_info *new_fltr) +{ + enum ice_status status = ICE_SUCCESS; + uint16_t vsi_list_id = 0; + + if ((cur_fltr->fltr_act == ICE_FWD_TO_Q || + cur_fltr->fltr_act == ICE_FWD_TO_QGRP)) + return ICE_ERR_NOT_IMPL; + + if ((new_fltr->fltr_act == ICE_FWD_TO_Q || + new_fltr->fltr_act == ICE_FWD_TO_QGRP) && + (cur_fltr->fltr_act == ICE_FWD_TO_VSI || + cur_fltr->fltr_act == ICE_FWD_TO_VSI_LIST)) + return ICE_ERR_NOT_IMPL; + + if (m_entry->vsi_count < 2 && !m_entry->vsi_list_info) { + /* Only one entry existed in the mapping and it was not already + * a part of a VSI list. So, create a VSI list with the old and + * new VSIs. + */ + struct ice_fltr_info tmp_fltr; + uint16_t vsi_handle_arr[2]; + + /* A rule already exists with the new VSI being added */ + if (cur_fltr->fwd_id.hw_vsi_id == new_fltr->fwd_id.hw_vsi_id) + return ICE_ERR_ALREADY_EXISTS; + + vsi_handle_arr[0] = cur_fltr->vsi_handle; + vsi_handle_arr[1] = new_fltr->vsi_handle; + status = ice_create_vsi_list_rule(hw, &vsi_handle_arr[0], 2, + &vsi_list_id, + new_fltr->lkup_type); + if (status) + return status; + + tmp_fltr = *new_fltr; + tmp_fltr.fltr_rule_id = cur_fltr->fltr_rule_id; + tmp_fltr.fltr_act = ICE_FWD_TO_VSI_LIST; + tmp_fltr.fwd_id.vsi_list_id = vsi_list_id; + /* Update the previous switch rule of "MAC forward to VSI" to + * "MAC fwd to VSI list" + */ + status = ice_update_pkt_fwd_rule(hw, &tmp_fltr); + if (status) + return status; + + cur_fltr->fwd_id.vsi_list_id = vsi_list_id; + cur_fltr->fltr_act = ICE_FWD_TO_VSI_LIST; + m_entry->vsi_list_info = + ice_create_vsi_list_map(hw, &vsi_handle_arr[0], 2, + vsi_list_id); + + if (!m_entry->vsi_list_info) + return ICE_ERR_NO_MEMORY; + + /* If this entry was large action then the large action needs + * to be updated to point to FWD to VSI list + */ + if (m_entry->sw_marker_id != ICE_INVAL_SW_MARKER_ID) + status = + ice_add_marker_act(hw, m_entry, + m_entry->sw_marker_id, + m_entry->lg_act_idx); + } else { + uint16_t vsi_handle = new_fltr->vsi_handle; + enum ice_adminq_opc opcode; + + if (!m_entry->vsi_list_info) + return ICE_ERR_CFG; + + /* A rule already exists with the new VSI being added */ + if (ice_is_bit_set(m_entry->vsi_list_info->vsi_map, vsi_handle)) + return ICE_SUCCESS; + + /* Update the previously created VSI list set with + * the new VSI ID passed in + */ + vsi_list_id = cur_fltr->fwd_id.vsi_list_id; + opcode = ice_aqc_opc_update_sw_rules; + + status = ice_update_vsi_list_rule(hw, &vsi_handle, 1, + vsi_list_id, false, opcode, + new_fltr->lkup_type); + /* update VSI list mapping info with new VSI ID */ + if (!status) + ice_set_bit(vsi_handle, + m_entry->vsi_list_info->vsi_map); + } + if (!status) + m_entry->vsi_count++; + return status; +} + +/** + * ice_add_rule_internal - add rule for a given lookup type + * @hw: pointer to the hardware structure + * @recp_list: recipe list for which rule has to be added + * @lport: logic port number on which function add rule + * @f_entry: structure containing MAC forwarding information + * + * Adds or updates the rule lists for a given recipe + */ +enum ice_status +ice_add_rule_internal(struct ice_hw *hw, struct ice_sw_recipe *recp_list, + uint8_t lport, struct ice_fltr_list_entry *f_entry) +{ + struct ice_fltr_info *new_fltr, *cur_fltr; + struct ice_fltr_mgmt_list_entry *m_entry; + struct ice_lock *rule_lock; /* Lock to protect filter rule list */ + enum ice_status status = ICE_SUCCESS; + + if (!ice_is_vsi_valid(hw, f_entry->fltr_info.vsi_handle)) + return ICE_ERR_PARAM; + + /* Load the hw_vsi_id only if the fwd action is fwd to VSI */ + if (f_entry->fltr_info.fltr_act == ICE_FWD_TO_VSI) + f_entry->fltr_info.fwd_id.hw_vsi_id = + hw->vsi_ctx[f_entry->fltr_info.vsi_handle]->vsi_num; + + rule_lock = &recp_list->filt_rule_lock; +#if 0 + ice_acquire_lock(rule_lock); +#endif + new_fltr = &f_entry->fltr_info; + if (new_fltr->flag & ICE_FLTR_RX) + new_fltr->src = lport; + else if (new_fltr->flag & (ICE_FLTR_TX | ICE_FLTR_RX_LB)) + new_fltr->src = + hw->vsi_ctx[f_entry->fltr_info.vsi_handle]->vsi_num; + + m_entry = ice_find_rule_entry(&recp_list->filt_rules, new_fltr); + if (!m_entry) { + status = ice_create_pkt_fwd_rule(hw, recp_list, f_entry); + goto exit_add_rule_internal; + } + + cur_fltr = &m_entry->fltr_info; + status = ice_add_update_vsi_list(hw, m_entry, cur_fltr, new_fltr); + +exit_add_rule_internal: +#if 0 + ice_release_lock(rule_lock); +#endif + return status; +} + +/** + * ice_add_mac_rule - Add a MAC address based filter rule + * @hw: pointer to the hardware structure + * @list: list of MAC addresses and forwarding information + * @sw: pointer to switch info struct for which function add rule + * @lport: logic port number on which function add rule + * + * IMPORTANT: When the umac_shared flag is set to false and 'list' has + * multiple unicast addresses, the function assumes that all the + * addresses are unique in a given add_mac call. It doesn't + * check for duplicates in this case, removing duplicates from a given + * list should be taken care of in the caller of this function. + */ +enum ice_status +ice_add_mac_rule(struct ice_hw *hw, struct ice_fltr_list_head *list, + struct ice_switch_info *sw, uint8_t lport) +{ + struct ice_sw_recipe *recp_list = &sw->recp_list[ICE_SW_LKUP_MAC]; + struct ice_sw_rule_lkup_rx_tx *s_rule, *r_iter; + struct ice_fltr_list_entry *list_itr; + struct ice_fltr_mgmt_list_head *rule_head; + uint16_t total_elem_left, s_rule_size; +#if 0 + struct ice_lock *rule_lock; /* Lock to protect filter rule list */ +#endif + enum ice_status status = ICE_SUCCESS; + uint16_t num_unicast = 0; + uint8_t elem_sent; + + s_rule = NULL; +#if 0 + rule_lock = &recp_list->filt_rule_lock; +#endif + rule_head = &recp_list->filt_rules; + + TAILQ_FOREACH(list_itr, list, list_entry) { + uint8_t *add = &list_itr->fltr_info.l_data.mac.mac_addr[0]; + uint16_t vsi_handle; + uint16_t hw_vsi_id; + + list_itr->fltr_info.flag = ICE_FLTR_TX; + vsi_handle = list_itr->fltr_info.vsi_handle; + if (!ice_is_vsi_valid(hw, vsi_handle)) + return ICE_ERR_PARAM; + hw_vsi_id = hw->vsi_ctx[vsi_handle]->vsi_num; + if (list_itr->fltr_info.fltr_act == ICE_FWD_TO_VSI) + list_itr->fltr_info.fwd_id.hw_vsi_id = hw_vsi_id; + /* update the src in case it is VSI num */ + if (list_itr->fltr_info.src_id != ICE_SRC_ID_VSI) + return ICE_ERR_PARAM; + list_itr->fltr_info.src = hw_vsi_id; + if (list_itr->fltr_info.lkup_type != ICE_SW_LKUP_MAC || + ETHER_IS_ANYADDR(add)) + return ICE_ERR_PARAM; + if (!ETHER_IS_MULTICAST(add) && !hw->umac_shared) { + /* Don't overwrite the unicast address */ +#if 0 + ice_acquire_lock(rule_lock); +#endif + if (ice_find_rule_entry(rule_head, + &list_itr->fltr_info)) { +#if 0 + ice_release_lock(rule_lock); +#endif + continue; + } +#if 0 + ice_release_lock(rule_lock); +#endif + num_unicast++; + } else if (ETHER_IS_MULTICAST(add) || hw->umac_shared) { + list_itr->status = + ice_add_rule_internal(hw, recp_list, lport, + list_itr); + if (list_itr->status) + return list_itr->status; + } + } +#if 0 + ice_acquire_lock(rule_lock); +#endif + /* Exit if no suitable entries were found for adding bulk switch rule */ + if (!num_unicast) { + status = ICE_SUCCESS; + goto ice_add_mac_exit; + } + + /* Allocate switch rule buffer for the bulk update for unicast */ + s_rule_size = ice_struct_size(s_rule, hdr_data, ICE_DUMMY_ETH_HDR_LEN); + s_rule = (struct ice_sw_rule_lkup_rx_tx *) + ice_calloc(hw, num_unicast, s_rule_size); + if (!s_rule) { + status = ICE_ERR_NO_MEMORY; + goto ice_add_mac_exit; + } + + r_iter = s_rule; + TAILQ_FOREACH(list_itr, list, list_entry) { + struct ice_fltr_info *f_info = &list_itr->fltr_info; + uint8_t *mac_addr = &f_info->l_data.mac.mac_addr[0]; + + if (!ETHER_IS_MULTICAST(mac_addr)) { + ice_fill_sw_rule(hw, &list_itr->fltr_info, r_iter, + ice_aqc_opc_add_sw_rules); + r_iter = (struct ice_sw_rule_lkup_rx_tx *) + ((uint8_t *)r_iter + s_rule_size); + } + } + + /* Call AQ bulk switch rule update for all unicast addresses */ + r_iter = s_rule; + /* Call AQ switch rule in AQ_MAX chunk */ + for (total_elem_left = num_unicast; total_elem_left > 0; + total_elem_left -= elem_sent) { + struct ice_sw_rule_lkup_rx_tx *entry = r_iter; + + elem_sent = MIN(total_elem_left, + (ICE_AQ_MAX_BUF_LEN / s_rule_size)); + status = ice_aq_sw_rules(hw, entry, elem_sent * s_rule_size, + elem_sent, ice_aqc_opc_add_sw_rules, + NULL); + if (status) + goto ice_add_mac_exit; + r_iter = (struct ice_sw_rule_lkup_rx_tx *) + ((uint8_t *)r_iter + (elem_sent * s_rule_size)); + } + + /* Fill up rule ID based on the value returned from FW */ + r_iter = s_rule; + TAILQ_FOREACH(list_itr, list, list_entry) { + struct ice_fltr_info *f_info = &list_itr->fltr_info; + uint8_t *mac_addr = &f_info->l_data.mac.mac_addr[0]; + struct ice_fltr_mgmt_list_entry *fm_entry; + + if (!ETHER_IS_MULTICAST(mac_addr)) { + f_info->fltr_rule_id = le16toh(r_iter->index); + f_info->fltr_act = ICE_FWD_TO_VSI; + /* Create an entry to track this MAC address */ + fm_entry = (struct ice_fltr_mgmt_list_entry *) + ice_malloc(hw, sizeof(*fm_entry)); + if (!fm_entry) { + status = ICE_ERR_NO_MEMORY; + goto ice_add_mac_exit; + } + fm_entry->fltr_info = *f_info; + fm_entry->vsi_count = 1; + /* The book keeping entries will get removed when + * base driver calls remove filter AQ command + */ + + TAILQ_INSERT_HEAD(rule_head, fm_entry, list_entry); + r_iter = (struct ice_sw_rule_lkup_rx_tx *) + ((uint8_t *)r_iter + s_rule_size); + } + } + +ice_add_mac_exit: +#if 0 + ice_release_lock(rule_lock); +#endif + if (s_rule) + ice_free(hw, s_rule); + return status; +} + +/** + * ice_add_mac - Add a MAC address based filter rule + * @hw: pointer to the hardware structure + * @list: list of MAC addresses and forwarding information + * + * Function add MAC rule for logical port from HW struct + */ +enum ice_status +ice_add_mac(struct ice_hw *hw, struct ice_fltr_list_head *list) +{ + if (!list || !hw) + return ICE_ERR_PARAM; + + return ice_add_mac_rule(hw, list, hw->switch_info, + hw->port_info->lport); +} + +/** + * ice_add_vsi_mac_filter - Add a MAC address filter for a VSI + * @vsi: the VSI to add the filter for + * @addr: MAC address to add a filter for + * + * Add a MAC address filter for a given VSI. This is a wrapper around + * ice_add_mac to simplify the interface. First, it only accepts a single + * address, so we don't have to mess around with the list setup in other + * functions. Second, it ignores the ICE_ERR_ALREADY_EXISTS error, so that + * callers don't need to worry about attempting to add the same filter twice. + */ +int +ice_add_vsi_mac_filter(struct ice_vsi *vsi, uint8_t *addr) +{ + struct ice_softc *sc = vsi->sc; + struct ice_fltr_list_head mac_addr_list; + struct ice_hw *hw = &vsi->sc->hw; + enum ice_status status; + int err = 0; + + TAILQ_INIT(&mac_addr_list); + + err = ice_add_mac_to_list(vsi, &mac_addr_list, addr, ICE_FWD_TO_VSI); + if (err) + goto free_mac_list; + + status = ice_add_mac(hw, &mac_addr_list); + if (status != ICE_ERR_ALREADY_EXISTS && status) { + printf("%s: Failed to add a filter for MAC %s, " + "err %s aq_err %s\n", sc->sc_dev.dv_xname, + ether_sprintf(addr), ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + err = (EIO); + } + +free_mac_list: + ice_free_fltr_list(&mac_addr_list); + return err; +} + +/** + * ice_cfg_pf_default_mac_filters - Setup default unicast and broadcast addrs + * @sc: device softc structure + * + * Program the default unicast and broadcast filters for the PF VSI. + */ +int +ice_cfg_pf_default_mac_filters(struct ice_softc *sc) +{ + struct ice_hw *hw = &sc->hw; + struct ice_vsi *vsi = &sc->pf_vsi; + int err; + + /* Add the LAN MAC address */ + err = ice_add_vsi_mac_filter(vsi, hw->port_info->mac.lan_addr); + if (err) + return err; + + /* Add the broadcast address */ + err = ice_add_vsi_mac_filter(vsi, etherbroadcastaddr); + if (err) + return err; + + return (0); +} + +/** + * ice_init_tx_tracking - Initialize Tx queue software tracking values + * @vsi: the VSI to initialize + * + * Initialize Tx queue software tracking values, including the Report Status + * queue, and related software tracking values. + */ +void +ice_init_tx_tracking(struct ice_vsi *vsi) +{ + struct ice_tx_queue *txq; + size_t j; + int i; + + for (i = 0, txq = vsi->tx_queues; i < vsi->num_tx_queues; i++, txq++) { + + txq->tx_rs_cidx = txq->tx_rs_pidx = 0; + + /* Initialize the last processed descriptor to be the end of + * the ring, rather than the start, so that we avoid an + * off-by-one error in ice_ift_txd_credits_update for the + * first packet. + */ + txq->tx_cidx_processed = txq->desc_count - 1; + + for (j = 0; j < txq->desc_count; j++) + txq->tx_rsq[j] = ICE_QIDX_INVALID; + } +} + +/** + * ice_setup_tx_ctx - Setup an ice_tlan_ctx structure for a queue + * @txq: the Tx queue to configure + * @tlan_ctx: the Tx LAN queue context structure to initialize + * @pf_q: real queue number + */ +int +ice_setup_tx_ctx(struct ice_tx_queue *txq, struct ice_tlan_ctx *tlan_ctx, + uint16_t pf_q) +{ + struct ice_vsi *vsi = txq->vsi; + struct ice_softc *sc = vsi->sc; + struct ice_hw *hw = &sc->hw; + + tlan_ctx->port_num = hw->port_info->lport; + + /* number of descriptors in the queue */ + tlan_ctx->qlen = txq->desc_count; + + /* set the transmit queue base address, defined in 128 byte units */ + tlan_ctx->base = txq->tx_paddr >> 7; + + tlan_ctx->pf_num = hw->pf_id; + + switch (vsi->type) { + case ICE_VSI_PF: + tlan_ctx->vmvf_type = ICE_TLAN_CTX_VMVF_TYPE_PF; + break; + case ICE_VSI_VMDQ2: + tlan_ctx->vmvf_type = ICE_TLAN_CTX_VMVF_TYPE_VMQ; + break; + default: + return (ENODEV); + } + + tlan_ctx->src_vsi = hw->vsi_ctx[vsi->idx]->vsi_num; + + /* Enable TSO */ + tlan_ctx->tso_ena = 1; + tlan_ctx->internal_usage_flag = 1; + + tlan_ctx->tso_qnum = pf_q; + + /* + * Stick with the older legacy Tx queue interface, instead of the new + * advanced queue interface. + */ + tlan_ctx->legacy_int = 1; + + /* Descriptor WB mode */ + tlan_ctx->wb_mode = 0; + + return (0); +} + +/** + * ice_get_vsi_ctx - return the VSI context entry for a given VSI handle + * @hw: pointer to the HW struct + * @vsi_handle: VSI handle + * + * return the VSI context entry for a given VSI handle + */ +struct ice_vsi_ctx * +ice_get_vsi_ctx(struct ice_hw *hw, uint16_t vsi_handle) +{ + return (vsi_handle >= ICE_MAX_VSI) ? NULL : hw->vsi_ctx[vsi_handle]; +} + +/** + * ice_get_lan_q_ctx - get the LAN queue context for the given VSI and TC + * @hw: pointer to the HW struct + * @vsi_handle: software VSI handle + * @tc: TC number + * @q_handle: software queue handle + */ +struct ice_q_ctx * +ice_get_lan_q_ctx(struct ice_hw *hw, uint16_t vsi_handle, uint8_t tc, + uint16_t q_handle) +{ + struct ice_vsi_ctx *vsi; + struct ice_q_ctx *q_ctx; + + vsi = ice_get_vsi_ctx(hw, vsi_handle); + if (!vsi) + return NULL; + if (q_handle >= vsi->num_lan_q_entries[tc]) + return NULL; + if (!vsi->lan_q_ctx[tc]) + return NULL; + q_ctx = vsi->lan_q_ctx[tc]; + return &q_ctx[q_handle]; +} + +/** + * ice_sched_find_node_in_subtree - Find node in part of base node subtree + * @hw: pointer to the HW struct + * @base: pointer to the base node + * @node: pointer to the node to search + * + * This function checks whether a given node is part of the base node + * subtree or not + */ +bool +ice_sched_find_node_in_subtree(struct ice_hw *hw, struct ice_sched_node *base, + struct ice_sched_node *node) +{ + uint8_t i; + + for (i = 0; i < base->num_children; i++) { + struct ice_sched_node *child = base->children[i]; + + if (node == child) + return true; + + if (child->tx_sched_layer > node->tx_sched_layer) + return false; + + /* this recursion is intentional, and wouldn't + * go more than 8 calls + */ + if (ice_sched_find_node_in_subtree(hw, child, node)) + return true; + } + return false; +} + +/** + * ice_sched_get_free_qgrp - Scan all queue group siblings and find a free node + * @pi: port information structure + * @vsi_node: software VSI handle + * @qgrp_node: first queue group node identified for scanning + * @owner: LAN or RDMA + * + * This function retrieves a free LAN or RDMA queue group node by scanning + * qgrp_node and its siblings for the queue group with the fewest number + * of queues currently assigned. + */ +struct ice_sched_node * +ice_sched_get_free_qgrp(struct ice_port_info *pi, + struct ice_sched_node *vsi_node, + struct ice_sched_node *qgrp_node, uint8_t owner) +{ + struct ice_sched_node *min_qgrp; + uint8_t min_children; + + if (!qgrp_node) + return qgrp_node; + min_children = qgrp_node->num_children; + if (!min_children) + return qgrp_node; + min_qgrp = qgrp_node; + /* scan all queue groups until find a node which has less than the + * minimum number of children. This way all queue group nodes get + * equal number of shares and active. The bandwidth will be equally + * distributed across all queues. + */ + while (qgrp_node) { + /* make sure the qgroup node is part of the VSI subtree */ + if (ice_sched_find_node_in_subtree(pi->hw, vsi_node, qgrp_node)) + if (qgrp_node->num_children < min_children && + qgrp_node->owner == owner) { + /* replace the new min queue group node */ + min_qgrp = qgrp_node; + min_children = min_qgrp->num_children; + /* break if it has no children, */ + if (!min_children) + break; + } + qgrp_node = qgrp_node->sibling; + } + return min_qgrp; +} + +/** + * ice_sched_get_qgrp_layer - get the current queue group layer number + * @hw: pointer to the HW struct + * + * This function returns the current queue group layer number + */ +uint8_t +ice_sched_get_qgrp_layer(struct ice_hw *hw) +{ + /* It's always total layers - 1, the array is 0 relative so -2 */ + return hw->num_tx_sched_layers - ICE_QGRP_LAYER_OFFSET; +} + +/** + * ice_sched_get_vsi_layer - get the current VSI layer number + * @hw: pointer to the HW struct + * + * This function returns the current VSI layer number + */ +uint8_t +ice_sched_get_vsi_layer(struct ice_hw *hw) +{ + /* Num Layers VSI layer + * 9 6 + * 7 4 + * 5 or less sw_entry_point_layer + */ + /* calculate the VSI layer based on number of layers. */ + if (hw->num_tx_sched_layers == ICE_SCHED_9_LAYERS) + return hw->num_tx_sched_layers - ICE_VSI_LAYER_OFFSET; + else if (hw->num_tx_sched_layers == ICE_SCHED_5_LAYERS) + /* qgroup and VSI layers are same */ + return hw->num_tx_sched_layers - ICE_QGRP_LAYER_OFFSET; + return hw->sw_entry_point_layer; +} + +/** + * ice_sched_get_free_qparent - Get a free LAN or RDMA queue group node + * @pi: port information structure + * @vsi_handle: software VSI handle + * @tc: branch number + * @owner: LAN or RDMA + * + * This function retrieves a free LAN or RDMA queue group node + */ +struct ice_sched_node * +ice_sched_get_free_qparent(struct ice_port_info *pi, uint16_t vsi_handle, + uint8_t tc, uint8_t owner) +{ + struct ice_sched_node *vsi_node, *qgrp_node; + struct ice_vsi_ctx *vsi_ctx; + uint8_t qgrp_layer, vsi_layer; + uint16_t max_children; + + qgrp_layer = ice_sched_get_qgrp_layer(pi->hw); + vsi_layer = ice_sched_get_vsi_layer(pi->hw); + max_children = pi->hw->max_children[qgrp_layer]; + + vsi_ctx = ice_get_vsi_ctx(pi->hw, vsi_handle); + if (!vsi_ctx) + return NULL; + vsi_node = vsi_ctx->sched.vsi_node[tc]; + /* validate invalid VSI ID */ + if (!vsi_node) + return NULL; + + /* If the queue group and vsi layer are same then queues + * are all attached directly to VSI + */ + if (qgrp_layer == vsi_layer) + return vsi_node; + + /* get the first queue group node from VSI sub-tree */ + qgrp_node = ice_sched_get_first_node(pi, vsi_node, qgrp_layer); + while (qgrp_node) { + /* make sure the qgroup node is part of the VSI subtree */ + if (ice_sched_find_node_in_subtree(pi->hw, vsi_node, qgrp_node)) + if (qgrp_node->num_children < max_children && + qgrp_node->owner == owner) + break; + qgrp_node = qgrp_node->sibling; + } + + /* Select the best queue group */ + return ice_sched_get_free_qgrp(pi, vsi_node, qgrp_node, owner); +} + +/** + * ice_aq_add_lan_txq + * @hw: pointer to the hardware structure + * @num_qgrps: Number of added queue groups + * @qg_list: list of queue groups to be added + * @buf_size: size of buffer for indirect command + * @cd: pointer to command details structure or NULL + * + * Add Tx LAN queue (0x0C30) + * + * NOTE: + * Prior to calling add Tx LAN queue: + * Initialize the following as part of the Tx queue context: + * Completion queue ID if the queue uses Completion queue, Quanta profile, + * Cache profile and Packet shaper profile. + * + * After add Tx LAN queue AQ command is completed: + * Interrupts should be associated with specific queues, + * Association of Tx queue to Doorbell queue is not part of Add LAN Tx queue + * flow. + */ +enum ice_status +ice_aq_add_lan_txq(struct ice_hw *hw, uint8_t num_qgrps, + struct ice_aqc_add_tx_qgrp *qg_list, uint16_t buf_size, + struct ice_sq_cd *cd) +{ + struct ice_aqc_add_tx_qgrp *list; + struct ice_aqc_add_txqs *cmd; + struct ice_aq_desc desc; + uint16_t i, sum_size = 0; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + cmd = &desc.params.add_txqs; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_add_txqs); + + if (!qg_list) + return ICE_ERR_PARAM; + + if (num_qgrps > ICE_LAN_TXQ_MAX_QGRPS) + return ICE_ERR_PARAM; + + for (i = 0, list = qg_list; i < num_qgrps; i++) { + sum_size += ice_struct_size(list, txqs, list->num_txqs); + list = (struct ice_aqc_add_tx_qgrp *)(list->txqs + + list->num_txqs); + } + + if (buf_size != sum_size) + return ICE_ERR_PARAM; + + desc.flags |= htole16(ICE_AQ_FLAG_RD); + + cmd->num_qgrps = num_qgrps; + + return ice_aq_send_cmd(hw, &desc, qg_list, buf_size, cd); +} + +/** + * ice_aq_add_sched_elems - adds scheduling element + * @hw: pointer to the HW struct + * @grps_req: the number of groups that are requested to be added + * @buf: pointer to buffer + * @buf_size: buffer size in bytes + * @grps_added: returns total number of groups added + * @cd: pointer to command details structure or NULL + * + * Add scheduling elements (0x0401) + */ +enum ice_status +ice_aq_add_sched_elems(struct ice_hw *hw, uint16_t grps_req, + struct ice_aqc_add_elem *buf, uint16_t buf_size, + uint16_t *grps_added, struct ice_sq_cd *cd) +{ + return ice_aqc_send_sched_elem_cmd(hw, ice_aqc_opc_add_sched_elems, + grps_req, (void *)buf, buf_size, + grps_added, cd); +} + +/** + * ice_aq_cfg_sched_elems - configures scheduler elements + * @hw: pointer to the HW struct + * @elems_req: number of elements to configure + * @buf: pointer to buffer + * @buf_size: buffer size in bytes + * @elems_cfgd: returns total number of elements configured + * @cd: pointer to command details structure or NULL + * + * Configure scheduling elements (0x0403) + */ +enum ice_status +ice_aq_cfg_sched_elems(struct ice_hw *hw, uint16_t elems_req, + struct ice_aqc_txsched_elem_data *buf, uint16_t buf_size, + uint16_t *elems_cfgd, struct ice_sq_cd *cd) +{ + return ice_aqc_send_sched_elem_cmd(hw, ice_aqc_opc_cfg_sched_elems, + elems_req, (void *)buf, buf_size, + elems_cfgd, cd); +} + +/** + * ice_sched_update_elem - update element + * @hw: pointer to the HW struct + * @node: pointer to node + * @info: node info to update + * + * Update the HW DB, and local SW DB of node. Update the scheduling + * parameters of node from argument info data buffer (Info->data buf) and + * returns success or error on config sched element failure. The caller + * needs to hold scheduler lock. + */ +enum ice_status +ice_sched_update_elem(struct ice_hw *hw, struct ice_sched_node *node, + struct ice_aqc_txsched_elem_data *info) +{ + struct ice_aqc_txsched_elem_data buf; + enum ice_status status; + uint16_t elem_cfgd = 0; + uint16_t num_elems = 1; + + buf = *info; + /* For TC nodes, CIR config is not supported */ + if (node->info.data.elem_type == ICE_AQC_ELEM_TYPE_TC) + buf.data.valid_sections &= ~ICE_AQC_ELEM_VALID_CIR; + /* Parent TEID is reserved field in this aq call */ + buf.parent_teid = 0; + /* Element type is reserved field in this aq call */ + buf.data.elem_type = 0; + /* Flags is reserved field in this aq call */ + buf.data.flags = 0; + + /* Update HW DB */ + /* Configure element node */ + status = ice_aq_cfg_sched_elems(hw, num_elems, &buf, sizeof(buf), + &elem_cfgd, NULL); + if (status || elem_cfgd != num_elems) { + DNPRINTF(ICE_DBG_SCHED, "%s: Config sched elem error\n", + __func__); + return ICE_ERR_CFG; + } + + /* Config success case */ + /* Now update local SW DB */ + /* Only copy the data portion of info buffer */ + node->info.data = info->data; + return status; +} + +/** + * ice_sched_replay_node_prio - re-configure node priority + * @hw: pointer to the HW struct + * @node: sched node to configure + * @priority: priority value + * + * This function configures node element's priority value. It + * needs to be called with scheduler lock held. + */ +enum ice_status +ice_sched_replay_node_prio(struct ice_hw *hw, struct ice_sched_node *node, + uint8_t priority) +{ + struct ice_aqc_txsched_elem_data buf; + struct ice_aqc_txsched_elem *data; + enum ice_status status; + + buf = node->info; + data = &buf.data; + data->valid_sections |= ICE_AQC_ELEM_VALID_GENERIC; + data->generic = priority; + + /* Configure element */ + status = ice_sched_update_elem(hw, node, &buf); + return status; +} + +/** + * ice_sched_rm_unused_rl_prof - remove unused RL profile + * @hw: pointer to the hardware structure + * + * This function removes unused rate limit profiles from the HW and + * SW DB. The caller needs to hold scheduler lock. + */ +void +ice_sched_rm_unused_rl_prof(struct ice_hw *hw) +{ + uint16_t ln; + + for (ln = 0; ln < hw->num_tx_sched_layers; ln++) { + struct ice_aqc_rl_profile_info *rl_prof_elem; + struct ice_aqc_rl_profile_info *rl_prof_tmp; + + TAILQ_FOREACH_SAFE(rl_prof_elem, &hw->rl_prof_list[ln], + list_entry, rl_prof_tmp) { + if (!ice_sched_del_rl_profile(hw, + &hw->rl_prof_list[ln], rl_prof_elem)) + DNPRINTF(ICE_DBG_SCHED, + "%s: Removed rl profile\n", __func__); + } + } +} + +/** + * ice_sched_get_rl_prof_layer - selects rate limit profile creation layer + * @pi: port information structure + * @rl_type: type of rate limit BW - min, max, or shared + * @layer_index: layer index + * + * This function returns requested profile creation layer. + */ +uint8_t +ice_sched_get_rl_prof_layer(struct ice_port_info *pi, enum ice_rl_type rl_type, + uint8_t layer_index) +{ + struct ice_hw *hw = pi->hw; + + if (layer_index >= hw->num_tx_sched_layers) + return ICE_SCHED_INVAL_LAYER_NUM; + switch (rl_type) { + case ICE_MIN_BW: + if (hw->layer_info[layer_index].max_cir_rl_profiles) + return layer_index; + break; + case ICE_MAX_BW: + if (hw->layer_info[layer_index].max_eir_rl_profiles) + return layer_index; + break; + case ICE_SHARED_BW: + /* if current layer doesn't support SRL profile creation + * then try a layer up or down. + */ + if (hw->layer_info[layer_index].max_srl_profiles) + return layer_index; + else if (layer_index < hw->num_tx_sched_layers - 1 && + hw->layer_info[layer_index + 1].max_srl_profiles) + return layer_index + 1; + else if (layer_index > 0 && + hw->layer_info[layer_index - 1].max_srl_profiles) + return layer_index - 1; + break; + default: + break; + } + return ICE_SCHED_INVAL_LAYER_NUM; +} + +/** + * ice_sched_get_node_rl_prof_id - get node's rate limit profile ID + * @node: sched node + * @rl_type: rate limit type + * + * If existing profile matches, it returns the corresponding rate + * limit profile ID, otherwise it returns an invalid ID as error. + */ +uint16_t +ice_sched_get_node_rl_prof_id(struct ice_sched_node *node, + enum ice_rl_type rl_type) +{ + uint16_t rl_prof_id = ICE_SCHED_INVAL_PROF_ID; + struct ice_aqc_txsched_elem *data; + + data = &node->info.data; + switch (rl_type) { + case ICE_MIN_BW: + if (data->valid_sections & ICE_AQC_ELEM_VALID_CIR) + rl_prof_id = le16toh(data->cir_bw.bw_profile_idx); + break; + case ICE_MAX_BW: + if (data->valid_sections & ICE_AQC_ELEM_VALID_EIR) + rl_prof_id = le16toh(data->eir_bw.bw_profile_idx); + break; + case ICE_SHARED_BW: + if (data->valid_sections & ICE_AQC_ELEM_VALID_SHARED) + rl_prof_id = le16toh(data->srl_id); + break; + default: + break; + } + + return rl_prof_id; +} + +/** + * ice_sched_cfg_node_bw_lmt - configure node sched params + * @hw: pointer to the HW struct + * @node: sched node to configure + * @rl_type: rate limit type CIR, EIR, or shared + * @rl_prof_id: rate limit profile ID + * + * This function configures node element's BW limit. + */ +enum ice_status +ice_sched_cfg_node_bw_lmt(struct ice_hw *hw, struct ice_sched_node *node, + enum ice_rl_type rl_type, uint16_t rl_prof_id) +{ + struct ice_aqc_txsched_elem_data buf; + struct ice_aqc_txsched_elem *data; + + buf = node->info; + data = &buf.data; + switch (rl_type) { + case ICE_MIN_BW: + data->valid_sections |= ICE_AQC_ELEM_VALID_CIR; + data->cir_bw.bw_profile_idx = htole16(rl_prof_id); + break; + case ICE_MAX_BW: + data->valid_sections |= ICE_AQC_ELEM_VALID_EIR; + data->eir_bw.bw_profile_idx = htole16(rl_prof_id); + break; + case ICE_SHARED_BW: + data->valid_sections |= ICE_AQC_ELEM_VALID_SHARED; + data->srl_id = htole16(rl_prof_id); + break; + default: + /* Unknown rate limit type */ + return ICE_ERR_PARAM; + } + + /* Configure element */ + return ice_sched_update_elem(hw, node, &buf); +} + +/** + * ice_sched_rm_rl_profile - remove RL profile ID + * @hw: pointer to the hardware structure + * @layer_num: layer number where profiles are saved + * @profile_type: profile type like EIR, CIR, or SRL + * @profile_id: profile ID to remove + * + * This function removes rate limit profile from layer 'layer_num' of type + * 'profile_type' and profile ID as 'profile_id'. The caller needs to hold + * scheduler lock. + */ +enum ice_status +ice_sched_rm_rl_profile(struct ice_hw *hw, uint8_t layer_num, + uint8_t profile_type, uint16_t profile_id) +{ + struct ice_aqc_rl_profile_info *rl_prof_elem; + enum ice_status status = ICE_SUCCESS; + + if (!hw || layer_num >= hw->num_tx_sched_layers) + return ICE_ERR_PARAM; + /* Check the existing list for RL profile */ + TAILQ_FOREACH(rl_prof_elem, &hw->rl_prof_list[layer_num], list_entry) { + if ((rl_prof_elem->profile.flags & ICE_AQC_RL_PROFILE_TYPE_M) == + profile_type && + le16toh(rl_prof_elem->profile.profile_id) == profile_id) { + if (rl_prof_elem->prof_id_ref) + rl_prof_elem->prof_id_ref--; + + /* Remove old profile ID from database */ + status = ice_sched_del_rl_profile(hw, + &hw->rl_prof_list[layer_num], rl_prof_elem); + if (status && status != ICE_ERR_IN_USE) + DNPRINTF(ICE_DBG_SCHED, + "%s: Remove rl profile failed\n", __func__); + break; + } + } + if (status == ICE_ERR_IN_USE) + status = ICE_SUCCESS; + return status; +} + +/** + * ice_sched_set_node_bw_dflt - set node's bandwidth limit to default + * @pi: port information structure + * @node: pointer to node structure + * @rl_type: rate limit type min, max, or shared + * @layer_num: layer number where RL profiles are saved + * + * This function configures node element's BW rate limit profile ID of + * type CIR, EIR, or SRL to default. This function needs to be called + * with the scheduler lock held. + */ +enum ice_status +ice_sched_set_node_bw_dflt(struct ice_port_info *pi, + struct ice_sched_node *node, + enum ice_rl_type rl_type, uint8_t layer_num) +{ + enum ice_status status; + struct ice_hw *hw; + uint8_t profile_type; + uint16_t rl_prof_id; + uint16_t old_id; + + hw = pi->hw; + switch (rl_type) { + case ICE_MIN_BW: + profile_type = ICE_AQC_RL_PROFILE_TYPE_CIR; + rl_prof_id = ICE_SCHED_DFLT_RL_PROF_ID; + break; + case ICE_MAX_BW: + profile_type = ICE_AQC_RL_PROFILE_TYPE_EIR; + rl_prof_id = ICE_SCHED_DFLT_RL_PROF_ID; + break; + case ICE_SHARED_BW: + profile_type = ICE_AQC_RL_PROFILE_TYPE_SRL; + /* No SRL is configured for default case */ + rl_prof_id = ICE_SCHED_NO_SHARED_RL_PROF_ID; + break; + default: + return ICE_ERR_PARAM; + } + /* Save existing RL prof ID for later clean up */ + old_id = ice_sched_get_node_rl_prof_id(node, rl_type); + /* Configure BW scheduling parameters */ + status = ice_sched_cfg_node_bw_lmt(hw, node, rl_type, rl_prof_id); + if (status) + return status; + + /* Remove stale RL profile ID */ + if (old_id == ICE_SCHED_DFLT_RL_PROF_ID || + old_id == ICE_SCHED_INVAL_PROF_ID) + return ICE_SUCCESS; + + return ice_sched_rm_rl_profile(hw, layer_num, profile_type, old_id); +} + +/** + * ice_aq_add_rl_profile - adds rate limiting profile(s) + * @hw: pointer to the HW struct + * @num_profiles: the number of profile(s) to be add + * @buf: pointer to buffer + * @buf_size: buffer size in bytes + * @num_profiles_added: total number of profiles added to return + * @cd: pointer to command details structure + * + * Add RL profile (0x0410) + */ +enum ice_status +ice_aq_add_rl_profile(struct ice_hw *hw, uint16_t num_profiles, + struct ice_aqc_rl_profile_elem *buf, uint16_t buf_size, + uint16_t *num_profiles_added, struct ice_sq_cd *cd) +{ + return ice_aq_rl_profile(hw, ice_aqc_opc_add_rl_profiles, num_profiles, + buf, buf_size, num_profiles_added, cd); +} + +/** + * DIV_S64 - Divide signed 64-bit value with signed 64-bit divisor + * @dividend: value to divide + * @divisor: value to divide by + * + * Use DIV_S64 for any 64-bit divide which operates on signed 64-bit dividends. + * Do not use this for unsigned 64-bit dividends as it will not produce + * correct results if the dividend is larger than INT64_MAX. + */ +static inline int64_t DIV_S64(int64_t dividend, int64_t divisor) +{ + return dividend / divisor; +} + +/** + * DIV_U64 - Divide unsigned 64-bit value by unsigned 64-bit divisor + * @dividend: value to divide + * @divisor: value to divide by + * + * Use DIV_U64 for any 64-bit divide which operates on unsigned 64-bit + * dividends. Do not use this for signed 64-bit dividends as it will not + * handle negative values correctly. + */ +static inline uint64_t DIV_U64(uint64_t dividend, uint64_t divisor) +{ + return dividend / divisor; +} + +static inline uint64_t round_up_64bit(uint64_t a, uint32_t b) +{ + return DIV_U64(((a) + (b) / 2), (b)); +} + +/** + * ice_sched_calc_wakeup - calculate RL profile wakeup parameter + * @hw: pointer to the HW struct + * @bw: bandwidth in Kbps + * + * This function calculates the wakeup parameter of RL profile. + */ +uint16_t +ice_sched_calc_wakeup(struct ice_hw *hw, int32_t bw) +{ + int64_t bytes_per_sec, wakeup_int, wakeup_a, wakeup_b, wakeup_f; + int32_t wakeup_f_int; + uint16_t wakeup = 0; + + /* Get the wakeup integer value */ + bytes_per_sec = DIV_S64((int64_t)bw * 1000, 8); + wakeup_int = DIV_S64(hw->psm_clk_freq, bytes_per_sec); + if (wakeup_int > 63) { + wakeup = (uint16_t)((1 << 15) | wakeup_int); + } else { + /* Calculate fraction value up to 4 decimals + * Convert Integer value to a constant multiplier + */ + wakeup_b = (int64_t)ICE_RL_PROF_MULTIPLIER * wakeup_int; + wakeup_a = DIV_S64((int64_t)ICE_RL_PROF_MULTIPLIER * + hw->psm_clk_freq, bytes_per_sec); + + /* Get Fraction value */ + wakeup_f = wakeup_a - wakeup_b; + + /* Round up the Fractional value via Ceil(Fractional value) */ + if (wakeup_f > DIV_S64(ICE_RL_PROF_MULTIPLIER, 2)) + wakeup_f += 1; + + wakeup_f_int = (int32_t)DIV_S64(wakeup_f * ICE_RL_PROF_FRACTION, + ICE_RL_PROF_MULTIPLIER); + wakeup |= (uint16_t)(wakeup_int << 9); + wakeup |= (uint16_t)(0x1ff & wakeup_f_int); + } + + return wakeup; +} + +/** + * ice_sched_bw_to_rl_profile - convert BW to profile parameters + * @hw: pointer to the HW struct + * @bw: bandwidth in Kbps + * @profile: profile parameters to return + * + * This function converts the BW to profile structure format. + */ +enum ice_status +ice_sched_bw_to_rl_profile(struct ice_hw *hw, uint32_t bw, + struct ice_aqc_rl_profile_elem *profile) +{ + enum ice_status status = ICE_ERR_PARAM; + int64_t bytes_per_sec, ts_rate, mv_tmp; + bool found = false; + int32_t encode = 0; + int64_t mv = 0; + int32_t i; + + /* Bw settings range is from 0.5Mb/sec to 100Gb/sec */ + if (bw < ICE_SCHED_MIN_BW || bw > ICE_SCHED_MAX_BW) + return status; + + /* Bytes per second from Kbps */ + bytes_per_sec = DIV_S64((int64_t)bw * 1000, 8); + + /* encode is 6 bits but really useful are 5 bits */ + for (i = 0; i < 64; i++) { + uint64_t pow_result = BIT_ULL(i); + + ts_rate = DIV_S64((int64_t)hw->psm_clk_freq, + pow_result * ICE_RL_PROF_TS_MULTIPLIER); + if (ts_rate <= 0) + continue; + + /* Multiplier value */ + mv_tmp = DIV_S64(bytes_per_sec * ICE_RL_PROF_MULTIPLIER, + ts_rate); + + /* Round to the nearest ICE_RL_PROF_MULTIPLIER */ + mv = round_up_64bit(mv_tmp, ICE_RL_PROF_MULTIPLIER); + + /* First multiplier value greater than the given + * accuracy bytes + */ + if (mv > ICE_RL_PROF_ACCURACY_BYTES) { + encode = i; + found = true; + break; + } + } + if (found) { + uint16_t wm; + + wm = ice_sched_calc_wakeup(hw, bw); + profile->rl_multiply = htole16(mv); + profile->wake_up_calc = htole16(wm); + profile->rl_encode = htole16(encode); + status = ICE_SUCCESS; + } else { + status = ICE_ERR_DOES_NOT_EXIST; + } + + return status; +} + +/** + * ice_sched_add_rl_profile - add RL profile + * @hw: pointer to the hardware structure + * @rl_type: type of rate limit BW - min, max, or shared + * @bw: bandwidth in Kbps - Kilo bits per sec + * @layer_num: specifies in which layer to create profile + * + * This function first checks the existing list for corresponding BW + * parameter. If it exists, it returns the associated profile otherwise + * it creates a new rate limit profile for requested BW, and adds it to + * the HW DB and local list. It returns the new profile or null on error. + * The caller needs to hold the scheduler lock. + */ +struct ice_aqc_rl_profile_info * +ice_sched_add_rl_profile(struct ice_hw *hw, enum ice_rl_type rl_type, + uint32_t bw, uint8_t layer_num) +{ + struct ice_aqc_rl_profile_info *rl_prof_elem; + uint16_t profiles_added = 0, num_profiles = 1; + struct ice_aqc_rl_profile_elem *buf; + enum ice_status status; + uint8_t profile_type; + + if (!hw || layer_num >= hw->num_tx_sched_layers) + return NULL; + switch (rl_type) { + case ICE_MIN_BW: + profile_type = ICE_AQC_RL_PROFILE_TYPE_CIR; + break; + case ICE_MAX_BW: + profile_type = ICE_AQC_RL_PROFILE_TYPE_EIR; + break; + case ICE_SHARED_BW: + profile_type = ICE_AQC_RL_PROFILE_TYPE_SRL; + break; + default: + return NULL; + } + + TAILQ_FOREACH(rl_prof_elem, &hw->rl_prof_list[layer_num], list_entry) { + if ((rl_prof_elem->profile.flags & ICE_AQC_RL_PROFILE_TYPE_M) == + profile_type && rl_prof_elem->bw == bw) + /* Return existing profile ID info */ + return rl_prof_elem; + } + + /* Create new profile ID */ + rl_prof_elem = (struct ice_aqc_rl_profile_info *) + ice_malloc(hw, sizeof(*rl_prof_elem)); + if (!rl_prof_elem) + return NULL; + + status = ice_sched_bw_to_rl_profile(hw, bw, &rl_prof_elem->profile); + if (status != ICE_SUCCESS) + goto exit_add_rl_prof; + + rl_prof_elem->bw = bw; + /* layer_num is zero relative, and fw expects level from 1 to 9 */ + rl_prof_elem->profile.level = layer_num + 1; + rl_prof_elem->profile.flags = profile_type; + rl_prof_elem->profile.max_burst_size = htole16(hw->max_burst_size); + + /* Create new entry in HW DB */ + buf = &rl_prof_elem->profile; + status = ice_aq_add_rl_profile(hw, num_profiles, buf, sizeof(*buf), + &profiles_added, NULL); + if (status || profiles_added != num_profiles) + goto exit_add_rl_prof; + + /* Good entry - add in the list */ + rl_prof_elem->prof_id_ref = 0; + TAILQ_INSERT_HEAD(&hw->rl_prof_list[layer_num], rl_prof_elem, + list_entry); + return rl_prof_elem; + +exit_add_rl_prof: + ice_free(hw, rl_prof_elem); + return NULL; +} + +/** + * ice_sched_set_node_bw - set node's bandwidth + * @pi: port information structure + * @node: tree node + * @rl_type: rate limit type min, max, or shared + * @bw: bandwidth in Kbps - Kilo bits per sec + * @layer_num: layer number + * + * This function adds new profile corresponding to requested BW, configures + * node's RL profile ID of type CIR, EIR, or SRL, and removes old profile + * ID from local database. The caller needs to hold scheduler lock. + */ +enum ice_status +ice_sched_set_node_bw(struct ice_port_info *pi, struct ice_sched_node *node, + enum ice_rl_type rl_type, uint32_t bw, uint8_t layer_num) +{ + struct ice_aqc_rl_profile_info *rl_prof_info; + enum ice_status status = ICE_ERR_PARAM; + struct ice_hw *hw = pi->hw; + uint16_t old_id, rl_prof_id; + + rl_prof_info = ice_sched_add_rl_profile(hw, rl_type, bw, layer_num); + if (!rl_prof_info) + return status; + + rl_prof_id = le16toh(rl_prof_info->profile.profile_id); + + /* Save existing RL prof ID for later clean up */ + old_id = ice_sched_get_node_rl_prof_id(node, rl_type); + /* Configure BW scheduling parameters */ + status = ice_sched_cfg_node_bw_lmt(hw, node, rl_type, rl_prof_id); + if (status) + return status; + + /* New changes has been applied */ + /* Increment the profile ID reference count */ + rl_prof_info->prof_id_ref++; + + /* Check for old ID removal */ + if ((old_id == ICE_SCHED_DFLT_RL_PROF_ID && rl_type != ICE_SHARED_BW) || + old_id == ICE_SCHED_INVAL_PROF_ID || old_id == rl_prof_id) + return ICE_SUCCESS; + + return ice_sched_rm_rl_profile(hw, layer_num, + rl_prof_info->profile.flags & + ICE_AQC_RL_PROFILE_TYPE_M, old_id); +} + +/** + * ice_sched_set_node_bw_lmt - set node's BW limit + * @pi: port information structure + * @node: tree node + * @rl_type: rate limit type min, max, or shared + * @bw: bandwidth in Kbps - Kilo bits per sec + * + * It updates node's BW limit parameters like BW RL profile ID of type CIR, + * EIR, or SRL. The caller needs to hold scheduler lock. + * + * NOTE: Caller provides the correct SRL node in case of shared profile + * settings. + */ +enum ice_status +ice_sched_set_node_bw_lmt(struct ice_port_info *pi, struct ice_sched_node *node, + enum ice_rl_type rl_type, uint32_t bw) +{ + struct ice_hw *hw; + uint8_t layer_num; + + if (!pi) + return ICE_ERR_PARAM; + hw = pi->hw; + /* Remove unused RL profile IDs from HW and SW DB */ + ice_sched_rm_unused_rl_prof(hw); + + layer_num = ice_sched_get_rl_prof_layer(pi, rl_type, + node->tx_sched_layer); + if (layer_num >= hw->num_tx_sched_layers) + return ICE_ERR_PARAM; + + if (bw == ICE_SCHED_DFLT_BW) + return ice_sched_set_node_bw_dflt(pi, node, rl_type, layer_num); + + return ice_sched_set_node_bw(pi, node, rl_type, bw, layer_num); +} + +/** + * ice_sched_cfg_node_bw_alloc - configure node BW weight/alloc params + * @hw: pointer to the HW struct + * @node: sched node to configure + * @rl_type: rate limit type CIR, EIR, or shared + * @bw_alloc: BW weight/allocation + * + * This function configures node element's BW allocation. + */ +enum ice_status +ice_sched_cfg_node_bw_alloc(struct ice_hw *hw, struct ice_sched_node *node, + enum ice_rl_type rl_type, uint16_t bw_alloc) +{ + struct ice_aqc_txsched_elem_data buf; + struct ice_aqc_txsched_elem *data; + enum ice_status status; + + buf = node->info; + data = &buf.data; + if (rl_type == ICE_MIN_BW) { + data->valid_sections |= ICE_AQC_ELEM_VALID_CIR; + data->cir_bw.bw_alloc = htole16(bw_alloc); + } else if (rl_type == ICE_MAX_BW) { + data->valid_sections |= ICE_AQC_ELEM_VALID_EIR; + data->eir_bw.bw_alloc = htole16(bw_alloc); + } else { + return ICE_ERR_PARAM; + } + + /* Configure element */ + status = ice_sched_update_elem(hw, node, &buf); + return status; +} + +/** + * ice_sched_replay_node_bw - replay node(s) BW + * @hw: pointer to the HW struct + * @node: sched node to configure + * @bw_t_info: BW type information + * + * This function restores node's BW from bw_t_info. The caller needs + * to hold the scheduler lock. + */ +enum ice_status +ice_sched_replay_node_bw(struct ice_hw *hw, struct ice_sched_node *node, + struct ice_bw_type_info *bw_t_info) +{ + struct ice_port_info *pi = hw->port_info; + enum ice_status status = ICE_ERR_PARAM; + uint16_t bw_alloc; + + if (!node) + return status; + if (!ice_is_any_bit_set(bw_t_info->bw_t_bitmap, ICE_BW_TYPE_CNT)) + return ICE_SUCCESS; + if (ice_is_bit_set(bw_t_info->bw_t_bitmap, ICE_BW_TYPE_PRIO)) { + status = ice_sched_replay_node_prio(hw, node, + bw_t_info->generic); + if (status) + return status; + } + if (ice_is_bit_set(bw_t_info->bw_t_bitmap, ICE_BW_TYPE_CIR)) { + status = ice_sched_set_node_bw_lmt(pi, node, ICE_MIN_BW, + bw_t_info->cir_bw.bw); + if (status) + return status; + } + if (ice_is_bit_set(bw_t_info->bw_t_bitmap, ICE_BW_TYPE_CIR_WT)) { + bw_alloc = bw_t_info->cir_bw.bw_alloc; + status = ice_sched_cfg_node_bw_alloc(hw, node, ICE_MIN_BW, + bw_alloc); + if (status) + return status; + } + if (ice_is_bit_set(bw_t_info->bw_t_bitmap, ICE_BW_TYPE_EIR)) { + status = ice_sched_set_node_bw_lmt(pi, node, ICE_MAX_BW, + bw_t_info->eir_bw.bw); + if (status) + return status; + } + if (ice_is_bit_set(bw_t_info->bw_t_bitmap, ICE_BW_TYPE_EIR_WT)) { + bw_alloc = bw_t_info->eir_bw.bw_alloc; + status = ice_sched_cfg_node_bw_alloc(hw, node, ICE_MAX_BW, + bw_alloc); + if (status) + return status; + } + if (ice_is_bit_set(bw_t_info->bw_t_bitmap, ICE_BW_TYPE_SHARED)) + status = ice_sched_set_node_bw_lmt(pi, node, ICE_SHARED_BW, + bw_t_info->shared_bw); + return status; +} +/** + * ice_sched_replay_q_bw - replay queue type node BW + * @pi: port information structure + * @q_ctx: queue context structure + * + * This function replays queue type node bandwidth. This function needs to be + * called with scheduler lock held. + */ +enum ice_status +ice_sched_replay_q_bw(struct ice_port_info *pi, struct ice_q_ctx *q_ctx) +{ + struct ice_sched_node *q_node; + + /* Following also checks the presence of node in tree */ + q_node = ice_sched_find_node_by_teid(pi->root, q_ctx->q_teid); + if (!q_node) + return ICE_ERR_PARAM; + return ice_sched_replay_node_bw(pi->hw, q_node, &q_ctx->bw_t_info); +} + +/** + * ice_ena_vsi_txq + * @pi: port information structure + * @vsi_handle: software VSI handle + * @tc: TC number + * @q_handle: software queue handle + * @num_qgrps: Number of added queue groups + * @buf: list of queue groups to be added + * @buf_size: size of buffer for indirect command + * @cd: pointer to command details structure or NULL + * + * This function adds one LAN queue + */ +enum ice_status +ice_ena_vsi_txq(struct ice_port_info *pi, uint16_t vsi_handle, uint8_t tc, + uint16_t q_handle, uint8_t num_qgrps, struct ice_aqc_add_tx_qgrp *buf, + uint16_t buf_size, struct ice_sq_cd *cd) +{ + struct ice_aqc_txsched_elem_data node = { 0 }; + struct ice_sched_node *parent; + struct ice_q_ctx *q_ctx; + enum ice_status status; + struct ice_hw *hw; + + if (!pi || pi->port_state != ICE_SCHED_PORT_STATE_READY) + return ICE_ERR_CFG; + + if (num_qgrps > 1 || buf->num_txqs > 1) + return ICE_ERR_MAX_LIMIT; + + hw = pi->hw; + + if (!ice_is_vsi_valid(hw, vsi_handle)) + return ICE_ERR_PARAM; +#if 0 + ice_acquire_lock(&pi->sched_lock); +#endif + q_ctx = ice_get_lan_q_ctx(hw, vsi_handle, tc, q_handle); + if (!q_ctx) { + DNPRINTF(ICE_DBG_SCHED, "%s: Enaq: invalid queue handle %d\n", + __func__, q_handle); + status = ICE_ERR_PARAM; + goto ena_txq_exit; + } + + /* find a parent node */ + parent = ice_sched_get_free_qparent(pi, vsi_handle, tc, + ICE_SCHED_NODE_OWNER_LAN); + if (!parent) { + status = ICE_ERR_PARAM; + goto ena_txq_exit; + } + + buf->parent_teid = parent->info.node_teid; + node.parent_teid = parent->info.node_teid; + /* Mark that the values in the "generic" section as valid. The default + * value in the "generic" section is zero. This means that : + * - Scheduling mode is Bytes Per Second (BPS), indicated by Bit 0. + * - 0 priority among siblings, indicated by Bit 1-3. + * - WFQ, indicated by Bit 4. + * - 0 Adjustment value is used in PSM credit update flow, indicated by + * Bit 5-6. + * - Bit 7 is reserved. + * Without setting the generic section as valid in valid_sections, the + * Admin queue command will fail with error code ICE_AQ_RC_EINVAL. + */ + buf->txqs[0].info.valid_sections = + ICE_AQC_ELEM_VALID_GENERIC | ICE_AQC_ELEM_VALID_CIR | + ICE_AQC_ELEM_VALID_EIR; + buf->txqs[0].info.generic = 0; + buf->txqs[0].info.cir_bw.bw_profile_idx = + htole16(ICE_SCHED_DFLT_RL_PROF_ID); + buf->txqs[0].info.cir_bw.bw_alloc = + htole16(ICE_SCHED_DFLT_BW_WT); + buf->txqs[0].info.eir_bw.bw_profile_idx = + htole16(ICE_SCHED_DFLT_RL_PROF_ID); + buf->txqs[0].info.eir_bw.bw_alloc = + htole16(ICE_SCHED_DFLT_BW_WT); + + /* add the LAN queue */ + status = ice_aq_add_lan_txq(hw, num_qgrps, buf, buf_size, cd); + if (status != ICE_SUCCESS) { + DNPRINTF(ICE_DBG_SCHED, "%s: enable queue %d failed %d\n", + __func__, le16toh(buf->txqs[0].txq_id), + hw->adminq.sq_last_status); + goto ena_txq_exit; + } + + node.node_teid = buf->txqs[0].q_teid; + node.data.elem_type = ICE_AQC_ELEM_TYPE_LEAF; + q_ctx->q_handle = q_handle; + q_ctx->q_teid = le32toh(node.node_teid); + + /* add a leaf node into scheduler tree queue layer */ + status = ice_sched_add_node(pi, hw->num_tx_sched_layers - 1, &node, + NULL); + if (!status) + status = ice_sched_replay_q_bw(pi, q_ctx); + +ena_txq_exit: +#if 0 + ice_release_lock(&pi->sched_lock); +#endif + return status; +} + +/* LAN Tx Queue Context used for set Tx config by ice_aqc_opc_add_txqs, + * Bit[0-175] is valid + */ +const struct ice_ctx_ele ice_tlan_ctx_info[] = { + /* Field Width LSB */ + ICE_CTX_STORE(ice_tlan_ctx, base, 57, 0), + ICE_CTX_STORE(ice_tlan_ctx, port_num, 3, 57), + ICE_CTX_STORE(ice_tlan_ctx, cgd_num, 5, 60), + ICE_CTX_STORE(ice_tlan_ctx, pf_num, 3, 65), + ICE_CTX_STORE(ice_tlan_ctx, vmvf_num, 10, 68), + ICE_CTX_STORE(ice_tlan_ctx, vmvf_type, 2, 78), + ICE_CTX_STORE(ice_tlan_ctx, src_vsi, 10, 80), + ICE_CTX_STORE(ice_tlan_ctx, tsyn_ena, 1, 90), + ICE_CTX_STORE(ice_tlan_ctx, internal_usage_flag, 1, 91), + ICE_CTX_STORE(ice_tlan_ctx, alt_vlan, 1, 92), + ICE_CTX_STORE(ice_tlan_ctx, cpuid, 8, 93), + ICE_CTX_STORE(ice_tlan_ctx, wb_mode, 1, 101), + ICE_CTX_STORE(ice_tlan_ctx, tphrd_desc, 1, 102), + ICE_CTX_STORE(ice_tlan_ctx, tphrd, 1, 103), + ICE_CTX_STORE(ice_tlan_ctx, tphwr_desc, 1, 104), + ICE_CTX_STORE(ice_tlan_ctx, cmpq_id, 9, 105), + ICE_CTX_STORE(ice_tlan_ctx, qnum_in_func, 14, 114), + ICE_CTX_STORE(ice_tlan_ctx, itr_notification_mode, 1, 128), + ICE_CTX_STORE(ice_tlan_ctx, adjust_prof_id, 6, 129), + ICE_CTX_STORE(ice_tlan_ctx, qlen, 13, 135), + ICE_CTX_STORE(ice_tlan_ctx, quanta_prof_idx, 4, 148), + ICE_CTX_STORE(ice_tlan_ctx, tso_ena, 1, 152), + ICE_CTX_STORE(ice_tlan_ctx, tso_qnum, 11, 153), + ICE_CTX_STORE(ice_tlan_ctx, legacy_int, 1, 164), + ICE_CTX_STORE(ice_tlan_ctx, drop_ena, 1, 165), + ICE_CTX_STORE(ice_tlan_ctx, cache_prof_idx, 2, 166), + ICE_CTX_STORE(ice_tlan_ctx, pkt_shaper_prof_idx, 3, 168), + ICE_CTX_STORE(ice_tlan_ctx, int_q_state, 122, 171), + { 0 } +}; + +/** + * ice_cfg_vsi_for_tx - Configure the hardware for Tx + * @vsi: the VSI to configure + * + * Configure the device Tx queues through firmware AdminQ commands. After + * this, Tx queues will be ready for transmit. + */ +int +ice_cfg_vsi_for_tx(struct ice_vsi *vsi) +{ + struct ice_softc *sc = vsi->sc; + struct ice_aqc_add_tx_qgrp *qg; + struct ice_hw *hw = &vsi->sc->hw; + enum ice_status status; + int i; + int err = 0; + uint16_t qg_size, pf_q; + + qg_size = ice_struct_size(qg, txqs, 1); + qg = (struct ice_aqc_add_tx_qgrp *)malloc(qg_size, M_DEVBUF, + M_NOWAIT|M_ZERO); + if (!qg) + return (ENOMEM); + + qg->num_txqs = 1; + + for (i = 0; i < vsi->num_tx_queues; i++) { + struct ice_tlan_ctx tlan_ctx = { 0 }; + struct ice_tx_queue *txq = &vsi->tx_queues[i]; + + pf_q = vsi->tx_qmap[txq->me]; + qg->txqs[0].txq_id = htole16(pf_q); + + err = ice_setup_tx_ctx(txq, &tlan_ctx, pf_q); + if (err) + goto free_txqg; + + ice_set_ctx(hw, (uint8_t *)&tlan_ctx, qg->txqs[0].txq_ctx, + ice_tlan_ctx_info); + + status = ice_ena_vsi_txq(hw->port_info, vsi->idx, txq->tc, + txq->q_handle, 1, qg, qg_size, NULL); + if (status) { + printf("%s: Failed to set LAN Tx queue %d " + "(TC %d, handle %d) context, err %s aq_err %s\n", + sc->sc_dev.dv_xname, i, txq->tc, txq->q_handle, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + err = ENODEV; + goto free_txqg; + } + + /* Keep track of the Tx queue TEID */ + if (pf_q == le16toh(qg->txqs[0].txq_id)) + txq->q_teid = le32toh(qg->txqs[0].q_teid); + } + +free_txqg: + free(qg, M_DEVBUF, qg_size); + + return (err); +} + +/* Different reset sources for which a disable queue AQ call has to be made in + * order to clean the Tx scheduler as a part of the reset + */ +enum ice_disq_rst_src { + ICE_NO_RESET = 0, + ICE_VM_RESET, + ICE_VF_RESET, +}; + +/** + * ice_aq_dis_lan_txq + * @hw: pointer to the hardware structure + * @num_qgrps: number of groups in the list + * @qg_list: the list of groups to disable + * @buf_size: the total size of the qg_list buffer in bytes + * @rst_src: if called due to reset, specifies the reset source + * @vmvf_num: the relative VM or VF number that is undergoing the reset + * @cd: pointer to command details structure or NULL + * + * Disable LAN Tx queue (0x0C31) + */ +enum ice_status +ice_aq_dis_lan_txq(struct ice_hw *hw, uint8_t num_qgrps, + struct ice_aqc_dis_txq_item *qg_list, uint16_t buf_size, + enum ice_disq_rst_src rst_src, uint16_t vmvf_num, + struct ice_sq_cd *cd) +{ + struct ice_aqc_dis_txq_item *item; + struct ice_aqc_dis_txqs *cmd; + struct ice_aq_desc desc; + enum ice_status status; + uint16_t i, sz = 0; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + cmd = &desc.params.dis_txqs; + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_dis_txqs); + + /* qg_list can be NULL only in VM/VF reset flow */ + if (!qg_list && !rst_src) + return ICE_ERR_PARAM; + + if (num_qgrps > ICE_LAN_TXQ_MAX_QGRPS) + return ICE_ERR_PARAM; + + cmd->num_entries = num_qgrps; + + cmd->vmvf_and_timeout = htole16((5 << ICE_AQC_Q_DIS_TIMEOUT_S) & + ICE_AQC_Q_DIS_TIMEOUT_M); + + switch (rst_src) { + case ICE_VM_RESET: + cmd->cmd_type = ICE_AQC_Q_DIS_CMD_VM_RESET; + cmd->vmvf_and_timeout |= + htole16(vmvf_num & ICE_AQC_Q_DIS_VMVF_NUM_M); + break; + case ICE_VF_RESET: + cmd->cmd_type = ICE_AQC_Q_DIS_CMD_VF_RESET; + /* In this case, FW expects vmvf_num to be absolute VF ID */ + cmd->vmvf_and_timeout |= + htole16((vmvf_num + hw->func_caps.vf_base_id) & + ICE_AQC_Q_DIS_VMVF_NUM_M); + break; + case ICE_NO_RESET: + default: + break; + } + + /* flush pipe on time out */ + cmd->cmd_type |= ICE_AQC_Q_DIS_CMD_FLUSH_PIPE; + /* If no queue group info, we are in a reset flow. Issue the AQ */ + if (!qg_list) + goto do_aq; + + /* set RD bit to indicate that command buffer is provided by the driver + * and it needs to be read by the firmware + */ + desc.flags |= htole16(ICE_AQ_FLAG_RD); + + for (i = 0, item = qg_list; i < num_qgrps; i++) { + uint16_t item_size = ice_struct_size(item, q_id, item->num_qs); + + /* If the num of queues is even, add 2 bytes of padding */ + if ((item->num_qs % 2) == 0) + item_size += 2; + + sz += item_size; + + item = (struct ice_aqc_dis_txq_item *)((uint8_t *)item + + item_size); + } + + if (buf_size != sz) + return ICE_ERR_PARAM; + +do_aq: + status = ice_aq_send_cmd(hw, &desc, qg_list, buf_size, cd); + if (status) { + if (!qg_list) + DNPRINTF(ICE_DBG_SCHED, "%s: VM%d disable failed %d\n", + __func__, vmvf_num, hw->adminq.sq_last_status); + else + DNPRINTF(ICE_DBG_SCHED, + "%s: disable queue %d failed %d\n", __func__, + le16toh(qg_list[0].q_id[0]), + hw->adminq.sq_last_status); + } + + return status; +} + +/** + * ice_dis_vsi_txq + * @pi: port information structure + * @vsi_handle: software VSI handle + * @tc: TC number + * @num_queues: number of queues + * @q_handles: pointer to software queue handle array + * @q_ids: pointer to the q_id array + * @q_teids: pointer to queue node teids + * @rst_src: if called due to reset, specifies the reset source + * @vmvf_num: the relative VM or VF number that is undergoing the reset + * @cd: pointer to command details structure or NULL + * + * This function removes queues and their corresponding nodes in SW DB + */ +enum ice_status +ice_dis_vsi_txq(struct ice_port_info *pi, uint16_t vsi_handle, uint8_t tc, + uint8_t num_queues, uint16_t *q_handles, uint16_t *q_ids, + uint32_t *q_teids, enum ice_disq_rst_src rst_src, uint16_t vmvf_num, + struct ice_sq_cd *cd) +{ + enum ice_status status = ICE_ERR_DOES_NOT_EXIST; + struct ice_aqc_dis_txq_item *qg_list; + struct ice_q_ctx *q_ctx; + struct ice_hw *hw; + uint16_t i, buf_size; + + if (!pi || pi->port_state != ICE_SCHED_PORT_STATE_READY) + return ICE_ERR_CFG; + + hw = pi->hw; + + if (!num_queues) { + /* if queue is disabled already yet the disable queue command + * has to be sent to complete the VF reset, then call + * ice_aq_dis_lan_txq without any queue information + */ + if (rst_src) + return ice_aq_dis_lan_txq(hw, 0, NULL, 0, rst_src, + vmvf_num, NULL); + return ICE_ERR_CFG; + } + + buf_size = ice_struct_size(qg_list, q_id, 1); + qg_list = (struct ice_aqc_dis_txq_item *)ice_malloc(hw, buf_size); + if (!qg_list) + return ICE_ERR_NO_MEMORY; +#if 0 + ice_acquire_lock(&pi->sched_lock); +#endif + for (i = 0; i < num_queues; i++) { + struct ice_sched_node *node; + + node = ice_sched_find_node_by_teid(pi->root, q_teids[i]); + if (!node) + continue; + q_ctx = ice_get_lan_q_ctx(hw, vsi_handle, tc, q_handles[i]); + if (!q_ctx) { + DNPRINTF(ICE_DBG_SCHED, "%s: invalid queue handle%d\n", + __func__, q_handles[i]); + continue; + } + if (q_ctx->q_handle != q_handles[i]) { + DNPRINTF(ICE_DBG_SCHED, "%s: Err:handles %d %d\n", + __func__, q_ctx->q_handle, q_handles[i]); + continue; + } + qg_list->parent_teid = node->info.parent_teid; + qg_list->num_qs = 1; + qg_list->q_id[0] = htole16(q_ids[i]); + status = ice_aq_dis_lan_txq(hw, 1, qg_list, buf_size, rst_src, + vmvf_num, cd); + + if (status != ICE_SUCCESS) + break; + ice_free_sched_node(pi, node); + q_ctx->q_handle = ICE_INVAL_Q_HANDLE; + } +#if 0 + ice_release_lock(&pi->sched_lock); +#endif + ice_free(hw, qg_list); + return status; +} + +/** + * ice_vsi_disable_tx - Disable (unconfigure) Tx queues for a VSI + * @vsi: the VSI to disable + * + * Disables the Tx queues associated with this VSI. Essentially the opposite + * of ice_cfg_vsi_for_tx. + */ +int +ice_vsi_disable_tx(struct ice_vsi *vsi) +{ + struct ice_softc *sc = vsi->sc; + struct ice_hw *hw = &sc->hw; + enum ice_status status; + uint32_t *q_teids; + uint16_t *q_ids, *q_handles; + size_t q_teids_size, q_ids_size, q_handles_size; + int tc, j, buf_idx, err = 0; + + if (vsi->num_tx_queues > 255) + return (ENOSYS); + + q_teids_size = sizeof(*q_teids) * vsi->num_tx_queues; + q_teids = (uint32_t *)malloc(q_teids_size, M_DEVBUF, M_NOWAIT|M_ZERO); + if (!q_teids) + return (ENOMEM); + + q_ids_size = sizeof(*q_ids) * vsi->num_tx_queues; + q_ids = (uint16_t *)malloc(q_ids_size, M_DEVBUF, M_NOWAIT|M_ZERO); + if (!q_ids) { + err = (ENOMEM); + goto free_q_teids; + } + + q_handles_size = sizeof(*q_handles) * vsi->num_tx_queues; + q_handles = (uint16_t *)malloc(q_handles_size, M_DEVBUF, + M_NOWAIT|M_ZERO); + if (!q_handles) { + err = (ENOMEM); + goto free_q_ids; + } + + ice_for_each_traffic_class(tc) { + struct ice_tc_info *tc_info = &vsi->tc_info[tc]; + uint16_t start_idx, end_idx; + + /* Skip rest of disabled TCs once the first + * disabled TC is found */ + if (!(vsi->tc_map & BIT(tc))) + break; + + /* Fill out TX queue information for this TC */ + start_idx = tc_info->qoffset; + end_idx = start_idx + tc_info->qcount_tx; + buf_idx = 0; + for (j = start_idx; j < end_idx; j++) { + struct ice_tx_queue *txq = &vsi->tx_queues[j]; + + q_ids[buf_idx] = vsi->tx_qmap[j]; + q_handles[buf_idx] = txq->q_handle; + q_teids[buf_idx] = txq->q_teid; + buf_idx++; + } + + status = ice_dis_vsi_txq(hw->port_info, vsi->idx, tc, buf_idx, + q_handles, q_ids, q_teids, + ICE_NO_RESET, 0, NULL); + if (status == ICE_ERR_DOES_NOT_EXIST) { + ; /* Queues have been disabled */ + } else if (status == ICE_ERR_RESET_ONGOING) { + DPRINTF("%s: Reset in progress. LAN Tx queues already " + "disabled\n", __func__); + break; + } else if (status) { + printf("%s: Failed to disable LAN Tx queues: " + "err %s aq_err %s\n", sc->sc_dev.dv_xname, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + err = (ENODEV); + break; + } + + /* Clear buffers */ + memset(q_teids, 0, q_teids_size); + memset(q_ids, 0, q_ids_size); + memset(q_handles, 0, q_handles_size); + } + +/* free_q_handles: */ + free(q_handles, M_DEVBUF, q_handles_size); +free_q_ids: + free(q_ids, M_DEVBUF, q_ids_size); +free_q_teids: + free(q_teids, M_DEVBUF, q_teids_size); + + return err; +} + +/** + * ice_copy_rxq_ctx_to_hw + * @hw: pointer to the hardware structure + * @ice_rxq_ctx: pointer to the rxq context + * @rxq_index: the index of the Rx queue + * + * Copies rxq context from dense structure to HW register space + */ +enum ice_status +ice_copy_rxq_ctx_to_hw(struct ice_hw *hw, uint8_t *ice_rxq_ctx, + uint32_t rxq_index) +{ + uint8_t i; + + if (!ice_rxq_ctx) + return ICE_ERR_BAD_PTR; + + if (rxq_index > QRX_CTRL_MAX_INDEX) + return ICE_ERR_PARAM; + + /* Copy each dword separately to HW */ + for (i = 0; i < ICE_RXQ_CTX_SIZE_DWORDS; i++) { + ICE_WRITE(hw, QRX_CONTEXT(i, rxq_index), + *((uint32_t *)(ice_rxq_ctx + (i * sizeof(uint32_t))))); + + DNPRINTF(ICE_DBG_QCTX, "%s: qrxdata[%d]: %08X\n", __func__, + i, *((uint32_t *)(ice_rxq_ctx + (i * sizeof(uint32_t))))); + } + + return ICE_SUCCESS; +} + +/* LAN Rx Queue Context */ +static const struct ice_ctx_ele ice_rlan_ctx_info[] = { + /* Field Width LSB */ + ICE_CTX_STORE(ice_rlan_ctx, head, 13, 0), + ICE_CTX_STORE(ice_rlan_ctx, cpuid, 8, 13), + ICE_CTX_STORE(ice_rlan_ctx, base, 57, 32), + ICE_CTX_STORE(ice_rlan_ctx, qlen, 13, 89), + ICE_CTX_STORE(ice_rlan_ctx, dbuf, 7, 102), + ICE_CTX_STORE(ice_rlan_ctx, hbuf, 5, 109), + ICE_CTX_STORE(ice_rlan_ctx, dtype, 2, 114), + ICE_CTX_STORE(ice_rlan_ctx, dsize, 1, 116), + ICE_CTX_STORE(ice_rlan_ctx, crcstrip, 1, 117), + ICE_CTX_STORE(ice_rlan_ctx, l2tsel, 1, 119), + ICE_CTX_STORE(ice_rlan_ctx, hsplit_0, 4, 120), + ICE_CTX_STORE(ice_rlan_ctx, hsplit_1, 2, 124), + ICE_CTX_STORE(ice_rlan_ctx, showiv, 1, 127), + ICE_CTX_STORE(ice_rlan_ctx, rxmax, 14, 174), + ICE_CTX_STORE(ice_rlan_ctx, tphrdesc_ena, 1, 193), + ICE_CTX_STORE(ice_rlan_ctx, tphwdesc_ena, 1, 194), + ICE_CTX_STORE(ice_rlan_ctx, tphdata_ena, 1, 195), + ICE_CTX_STORE(ice_rlan_ctx, tphhead_ena, 1, 196), + ICE_CTX_STORE(ice_rlan_ctx, lrxqthresh, 3, 198), + ICE_CTX_STORE(ice_rlan_ctx, prefena, 1, 201), + { 0 } +}; + +/** + * ice_write_rxq_ctx + * @hw: pointer to the hardware structure + * @rlan_ctx: pointer to the rxq context + * @rxq_index: the index of the Rx queue + * + * Converts rxq context from sparse to dense structure and then writes + * it to HW register space and enables the hardware to prefetch descriptors + * instead of only fetching them on demand + */ +enum ice_status +ice_write_rxq_ctx(struct ice_hw *hw, struct ice_rlan_ctx *rlan_ctx, + uint32_t rxq_index) +{ + uint8_t ctx_buf[ICE_RXQ_CTX_SZ] = { 0 }; + + if (!rlan_ctx) + return ICE_ERR_BAD_PTR; + + rlan_ctx->prefena = 1; + + ice_set_ctx(hw, (uint8_t *)rlan_ctx, ctx_buf, ice_rlan_ctx_info); + return ice_copy_rxq_ctx_to_hw(hw, ctx_buf, rxq_index); +} + +/** + * ice_setup_rx_ctx - Setup an Rx context structure for a receive queue + * @rxq: the receive queue to program + * + * Setup an Rx queue context structure and program it into the hardware + * registers. This is a necessary step for enabling the Rx queue. + */ +int +ice_setup_rx_ctx(struct ice_rx_queue *rxq) +{ + struct ice_rlan_ctx rlan_ctx = {0}; + struct ice_vsi *vsi = rxq->vsi; + struct ice_softc *sc = vsi->sc; + struct ice_hw *hw = &sc->hw; + enum ice_status status; + uint32_t rxdid = ICE_RXDID_FLEX_NIC; + uint32_t regval; + uint16_t pf_q; + + pf_q = vsi->rx_qmap[rxq->me]; + + /* set the receive queue base address, defined in 128 byte units */ + rlan_ctx.base = rxq->rx_paddr >> 7; + + rlan_ctx.qlen = rxq->desc_count; + + rlan_ctx.dbuf = vsi->mbuf_sz >> ICE_RLAN_CTX_DBUF_S; + + /* use 32 byte descriptors */ + rlan_ctx.dsize = 1; + + /* Strip the Ethernet CRC bytes before the packet is posted to the + * host memory. + */ + rlan_ctx.crcstrip = 1; + + rlan_ctx.l2tsel = 1; + + /* don't do header splitting */ + rlan_ctx.dtype = ICE_RX_DTYPE_NO_SPLIT; + rlan_ctx.hsplit_0 = ICE_RLAN_RX_HSPLIT_0_NO_SPLIT; + rlan_ctx.hsplit_1 = ICE_RLAN_RX_HSPLIT_1_NO_SPLIT; + + /* strip VLAN from inner headers */ + rlan_ctx.showiv = 1; + + rlan_ctx.rxmax = MIN(vsi->max_frame_size, + ICE_MAX_RX_SEGS * vsi->mbuf_sz); + + rlan_ctx.lrxqthresh = 1; + + if (vsi->type != ICE_VSI_VF) { + regval = ICE_READ(hw, QRXFLXP_CNTXT(pf_q)); + regval &= ~QRXFLXP_CNTXT_RXDID_IDX_M; + regval |= (rxdid << QRXFLXP_CNTXT_RXDID_IDX_S) & + QRXFLXP_CNTXT_RXDID_IDX_M; + + regval &= ~QRXFLXP_CNTXT_RXDID_PRIO_M; + regval |= (0x03 << QRXFLXP_CNTXT_RXDID_PRIO_S) & + QRXFLXP_CNTXT_RXDID_PRIO_M; + + ICE_WRITE(hw, QRXFLXP_CNTXT(pf_q), regval); + } + + status = ice_write_rxq_ctx(hw, &rlan_ctx, pf_q); + if (status) { + printf("%s: Failed to set LAN Rx queue context, " + "err %s aq_err %s\n", sc->sc_dev.dv_xname, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + return (EIO); + } + + return 0; +} + +/** + * ice_cfg_vsi_for_rx - Configure the hardware for Rx + * @vsi: the VSI to configure + * + * Prepare an Rx context descriptor and configure the device to receive + * traffic. + */ +int +ice_cfg_vsi_for_rx(struct ice_vsi *vsi) +{ + int i, err; + + for (i = 0; i < vsi->num_rx_queues; i++) { + err = ice_setup_rx_ctx(&vsi->rx_queues[i]); + if (err) + return err; + } + + return (0); +} + +/** + * ice_is_rxq_ready - Check if an Rx queue is ready + * @hw: ice hw structure + * @pf_q: absolute PF queue index to check + * @reg: on successful return, contains qrx_ctrl contents + * + * Reads the QRX_CTRL register and verifies if the queue is in a consistent + * state. That is, QENA_REQ matches QENA_STAT. Used to check before making + * a request to change the queue, as well as to verify the request has + * finished. The queue should change status within a few microseconds, so we + * use a small delay while polling the register. + * + * Returns an error code if the queue does not update after a few retries. + */ +int +ice_is_rxq_ready(struct ice_hw *hw, int pf_q, uint32_t *reg) +{ + uint32_t qrx_ctrl, qena_req, qena_stat; + int i; + + for (i = 0; i < ICE_Q_WAIT_RETRY_LIMIT; i++) { + qrx_ctrl = ICE_READ(hw, QRX_CTRL(pf_q)); + qena_req = (qrx_ctrl >> QRX_CTRL_QENA_REQ_S) & 1; + qena_stat = (qrx_ctrl >> QRX_CTRL_QENA_STAT_S) & 1; + + /* if the request and status bits equal, then the queue is + * fully disabled or enabled. + */ + if (qena_req == qena_stat) { + *reg = qrx_ctrl; + return (0); + } + + /* wait a few microseconds before we check again */ + DELAY(10); + } + + return (ETIMEDOUT); +} + +/** + * ice_control_rx_queue - Configure hardware to start or stop an Rx queue + * @vsi: VSI containing queue to enable/disable + * @qidx: Queue index in VSI space + * @enable: true to enable queue, false to disable + * + * Control the Rx queue through the QRX_CTRL register, enabling or disabling + * it. Wait for the appropriate time to ensure that the queue has actually + * reached the expected state. + */ +int +ice_control_rx_queue(struct ice_vsi *vsi, uint16_t qidx, bool enable) +{ + struct ice_softc *sc = vsi->sc; + struct ice_hw *hw = &sc->hw; + uint32_t qrx_ctrl = 0; + int err; + struct ice_rx_queue *rxq = &vsi->rx_queues[qidx]; + int pf_q = vsi->rx_qmap[rxq->me]; + + err = ice_is_rxq_ready(hw, pf_q, &qrx_ctrl); + if (err) { + printf("%s: Rx queue %d is not ready\n", + sc->sc_dev.dv_xname, pf_q); + return err; + } + + /* Skip if the queue is already in correct state */ + if (enable == !!(qrx_ctrl & QRX_CTRL_QENA_STAT_M)) + return (0); + + if (enable) + qrx_ctrl |= QRX_CTRL_QENA_REQ_M; + else + qrx_ctrl &= ~QRX_CTRL_QENA_REQ_M; + ICE_WRITE(hw, QRX_CTRL(pf_q), qrx_ctrl); + + /* wait for the queue to finalize the request */ + err = ice_is_rxq_ready(hw, pf_q, &qrx_ctrl); + if (err) { + printf("%s: Rx queue %d %sable timeout\n", + sc->sc_dev.dv_xname, pf_q, (enable ? "en" : "dis")); + return err; + } + + /* this should never happen */ + if (enable != !!(qrx_ctrl & QRX_CTRL_QENA_STAT_M)) { + printf("%s: Rx queue %d invalid state\n", + sc->sc_dev.dv_xname, pf_q); + return (EINVAL); + } + + return (0); +} + +/** + * ice_control_all_rx_queues - Configure hardware to start or stop the Rx queues + * @vsi: VSI to enable/disable queues + * @enable: true to enable queues, false to disable + * + * Control the Rx queues through the QRX_CTRL register, enabling or disabling + * them. Wait for the appropriate time to ensure that the queues have actually + * reached the expected state. + */ +int +ice_control_all_rx_queues(struct ice_vsi *vsi, bool enable) +{ + int i, err; + + /* TODO: amortize waits by changing all queues up front and then + * checking their status afterwards. This will become more necessary + * when we have a large number of queues. + */ + for (i = 0; i < vsi->num_rx_queues; i++) { + err = ice_control_rx_queue(vsi, i, enable); + if (err) + break; + } + + return (0); +} + +/** + * ice_configure_rxq_interrupt - Configure HW Rx queue for an MSI-X interrupt + * @hw: ice hw structure + * @rxqid: Rx queue index in PF space + * @vector: MSI-X vector index in PF/VF space + * @itr_idx: ITR index to use for interrupt + * + * @remark ice_flush() may need to be called after this + */ +void +ice_configure_rxq_interrupt(struct ice_hw *hw, uint16_t rxqid, + uint16_t vector, uint8_t itr_idx) +{ + uint32_t val; + + KASSERT(itr_idx <= ICE_ITR_NONE); + + val = (QINT_RQCTL_CAUSE_ENA_M | + (itr_idx << QINT_RQCTL_ITR_INDX_S) | + (vector << QINT_RQCTL_MSIX_INDX_S)); + ICE_WRITE(hw, QINT_RQCTL(rxqid), val); +} + +void +ice_configure_all_rxq_interrupts(struct ice_vsi *vsi) +{ + struct ice_hw *hw = &vsi->sc->hw; + int i; + + for (i = 0; i < vsi->num_rx_queues; i++) { + struct ice_rx_queue *rxq = &vsi->rx_queues[i]; + int v = rxq->irqv->iv_qid + 1; + + ice_configure_rxq_interrupt(hw, vsi->rx_qmap[rxq->me], v, + ICE_RX_ITR); + + DNPRINTF(ICE_DBG_INIT, + "%s: RXQ(%d) intr enable: me %d rxqid %d vector %d\n", + __func__, i, rxq->me, vsi->rx_qmap[rxq->me], v); + } + + ice_flush(hw); +} + +/** + * ice_itr_to_reg - Convert an ITR setting into its register equivalent + * @hw: The device HW structure + * @itr_setting: the ITR setting to convert + * + * Based on the hardware ITR granularity, convert an ITR setting into the + * correct value to prepare programming to the HW. + */ +static inline uint16_t ice_itr_to_reg(struct ice_hw *hw, uint16_t itr_setting) +{ + return itr_setting / hw->itr_gran; +} + +/** + * ice_configure_rx_itr - Configure the Rx ITR settings for this VSI + * @vsi: the VSI to configure + * + * Program the hardware ITR registers with the settings for this VSI. + */ +void +ice_configure_rx_itr(struct ice_vsi *vsi) +{ + struct ice_hw *hw = &vsi->sc->hw; + int i; + + /* TODO: Handle per-queue/per-vector ITR? */ + + for (i = 0; i < vsi->num_rx_queues; i++) { + struct ice_rx_queue *rxq = &vsi->rx_queues[i]; + int v = rxq->irqv->iv_qid + 1; + + ICE_WRITE(hw, GLINT_ITR(ICE_RX_ITR, v), + ice_itr_to_reg(hw, vsi->rx_itr)); + } + + ice_flush(hw); +} + +/** + * ice_set_default_promisc_mask - Set default config for promisc settings + * @promisc_mask: bitmask to setup + * + * The ice_(set|clear)_vsi_promisc() function expects a mask of promiscuous + * modes to operate on. The mask used in here is the default one for the + * driver, where promiscuous is enabled/disabled for all types of + * non-VLAN-tagged/VLAN 0 traffic. + */ +void +ice_set_default_promisc_mask(ice_bitmap_t *promisc_mask) +{ + ice_zero_bitmap(promisc_mask, ICE_PROMISC_MAX); + ice_set_bit(ICE_PROMISC_UCAST_TX, promisc_mask); + ice_set_bit(ICE_PROMISC_UCAST_RX, promisc_mask); + ice_set_bit(ICE_PROMISC_MCAST_TX, promisc_mask); + ice_set_bit(ICE_PROMISC_MCAST_RX, promisc_mask); +} + +/** + * _ice_set_vsi_promisc - set given VSI to given promiscuous mode(s) + * @hw: pointer to the hardware structure + * @vsi_handle: VSI handle to configure + * @promisc_mask: pointer to mask of promiscuous config bits + * @vid: VLAN ID to set VLAN promiscuous + * @lport: logical port number to configure promisc mode + */ +enum ice_status +ice_set_vsi_promisc(struct ice_hw *hw, uint16_t vsi_handle, + ice_bitmap_t *promisc_mask, uint16_t vid) +{ + struct ice_switch_info *sw = hw->switch_info; + uint8_t lport = hw->port_info->lport; + enum { UCAST_FLTR = 1, MCAST_FLTR, BCAST_FLTR }; + ice_declare_bitmap(p_mask, ICE_PROMISC_MAX); + struct ice_fltr_list_entry f_list_entry; + struct ice_fltr_info new_fltr; + enum ice_status status = ICE_SUCCESS; + bool is_tx_fltr, is_rx_lb_fltr; + uint16_t hw_vsi_id; + int pkt_type; + uint8_t recipe_id; + + DNPRINTF(ICE_DBG_TRACE, "%s\n", __func__); + + if (!ice_is_vsi_valid(hw, vsi_handle)) + return ICE_ERR_PARAM; + hw_vsi_id = hw->vsi_ctx[vsi_handle]->vsi_num; + + memset(&new_fltr, 0, sizeof(new_fltr)); + + /* Do not modify original bitmap */ + ice_cp_bitmap(p_mask, promisc_mask, ICE_PROMISC_MAX); + + if (ice_is_bit_set(p_mask, ICE_PROMISC_VLAN_RX) && + ice_is_bit_set(p_mask, ICE_PROMISC_VLAN_TX)) { + new_fltr.lkup_type = ICE_SW_LKUP_PROMISC_VLAN; + new_fltr.l_data.mac_vlan.vlan_id = vid; + recipe_id = ICE_SW_LKUP_PROMISC_VLAN; + } else { + new_fltr.lkup_type = ICE_SW_LKUP_PROMISC; + recipe_id = ICE_SW_LKUP_PROMISC; + } + + /* Separate filters must be set for each direction/packet type + * combination, so we will loop over the mask value, store the + * individual type, and clear it out in the input mask as it + * is found. + */ + while (ice_is_any_bit_set(p_mask, ICE_PROMISC_MAX)) { + struct ice_sw_recipe *recp_list; + uint8_t *mac_addr; + + pkt_type = 0; + is_tx_fltr = false; + is_rx_lb_fltr = false; + + if (ice_test_and_clear_bit(ICE_PROMISC_UCAST_RX, + p_mask)) { + pkt_type = UCAST_FLTR; + } else if (ice_test_and_clear_bit(ICE_PROMISC_UCAST_TX, + p_mask)) { + pkt_type = UCAST_FLTR; + is_tx_fltr = true; + } else if (ice_test_and_clear_bit(ICE_PROMISC_MCAST_RX, + p_mask)) { + pkt_type = MCAST_FLTR; + } else if (ice_test_and_clear_bit(ICE_PROMISC_MCAST_TX, + p_mask)) { + pkt_type = MCAST_FLTR; + is_tx_fltr = true; + } else if (ice_test_and_clear_bit(ICE_PROMISC_BCAST_RX, + p_mask)) { + pkt_type = BCAST_FLTR; + } else if (ice_test_and_clear_bit(ICE_PROMISC_BCAST_TX, + p_mask)) { + pkt_type = BCAST_FLTR; + is_tx_fltr = true; + } else if (ice_test_and_clear_bit(ICE_PROMISC_UCAST_RX_LB, + p_mask)) { + pkt_type = UCAST_FLTR; + is_rx_lb_fltr = true; + } + + /* Check for VLAN promiscuous flag */ + if (ice_is_bit_set(p_mask, ICE_PROMISC_VLAN_RX)) { + ice_clear_bit(ICE_PROMISC_VLAN_RX, p_mask); + } else if (ice_test_and_clear_bit(ICE_PROMISC_VLAN_TX, + p_mask)) { + is_tx_fltr = true; + } + /* Set filter DA based on packet type */ + mac_addr = new_fltr.l_data.mac.mac_addr; + if (pkt_type == BCAST_FLTR) { + memset(mac_addr, 0xff, ETHER_ADDR_LEN); + } else if (pkt_type == MCAST_FLTR || + pkt_type == UCAST_FLTR) { + /* Use the dummy ether header DA */ + memcpy(mac_addr, dummy_eth_header, ETHER_ADDR_LEN); + if (pkt_type == MCAST_FLTR) + mac_addr[0] |= 0x1; /* Set multicast bit */ + } + + /* Need to reset this to zero for all iterations */ + new_fltr.flag = 0; + if (is_tx_fltr) { + new_fltr.flag |= ICE_FLTR_TX; + new_fltr.src = hw_vsi_id; + } else if (is_rx_lb_fltr) { + new_fltr.flag |= ICE_FLTR_RX_LB; + new_fltr.src = hw_vsi_id; + } else { + new_fltr.flag |= ICE_FLTR_RX; + new_fltr.src = lport; + } + + new_fltr.fltr_act = ICE_FWD_TO_VSI; + new_fltr.vsi_handle = vsi_handle; + new_fltr.fwd_id.hw_vsi_id = hw_vsi_id; + f_list_entry.fltr_info = new_fltr; + recp_list = &sw->recp_list[recipe_id]; + + status = ice_add_rule_internal(hw, recp_list, lport, + &f_list_entry); + if (status != ICE_SUCCESS) + goto set_promisc_exit; + } + +set_promisc_exit: + return status; +} + +/** + * ice_vsi_uses_fltr - Determine if given VSI uses specified filter + * @fm_entry: filter entry to inspect + * @vsi_handle: VSI handle to compare with filter info + */ +bool +ice_vsi_uses_fltr(struct ice_fltr_mgmt_list_entry *fm_entry, + uint16_t vsi_handle) +{ + return ((fm_entry->fltr_info.fltr_act == ICE_FWD_TO_VSI && + fm_entry->fltr_info.vsi_handle == vsi_handle) || + (fm_entry->fltr_info.fltr_act == ICE_FWD_TO_VSI_LIST && + fm_entry->vsi_list_info && + (ice_is_bit_set(fm_entry->vsi_list_info->vsi_map, + vsi_handle)))); +} + +/** + * ice_add_entry_to_vsi_fltr_list - Add copy of fltr_list_entry to remove list + * @hw: pointer to the hardware structure + * @vsi_handle: VSI handle to remove filters from + * @vsi_list_head: pointer to the list to add entry to + * @fi: pointer to fltr_info of filter entry to copy & add + * + * Helper function, used when creating a list of filters to remove from + * a specific VSI. The entry added to vsi_list_head is a COPY of the + * original filter entry, with the exception of fltr_info.fltr_act and + * fltr_info.fwd_id fields. These are set such that later logic can + * extract which VSI to remove the fltr from, and pass on that information. + */ +enum ice_status +ice_add_entry_to_vsi_fltr_list(struct ice_hw *hw, uint16_t vsi_handle, + struct ice_fltr_list_head *vsi_list_head, + struct ice_fltr_info *fi) +{ + struct ice_fltr_list_entry *tmp; + + /* this memory is freed up in the caller function + * once filters for this VSI are removed + */ + tmp = (struct ice_fltr_list_entry *)ice_malloc(hw, sizeof(*tmp)); + if (!tmp) + return ICE_ERR_NO_MEMORY; + + tmp->fltr_info = *fi; + + /* Overwrite these fields to indicate which VSI to remove filter from, + * so find and remove logic can extract the information from the + * list entries. Note that original entries will still have proper + * values. + */ + tmp->fltr_info.fltr_act = ICE_FWD_TO_VSI; + tmp->fltr_info.vsi_handle = vsi_handle; + tmp->fltr_info.fwd_id.hw_vsi_id = hw->vsi_ctx[vsi_handle]->vsi_num; + + TAILQ_INSERT_HEAD(vsi_list_head, tmp, list_entry); + + return ICE_SUCCESS; +} + +/** + * ice_determine_promisc_mask + * @fi: filter info to parse + * @promisc_mask: pointer to mask to be filled in + * + * Helper function to determine which ICE_PROMISC_ mask corresponds + * to given filter into. + */ +void ice_determine_promisc_mask(struct ice_fltr_info *fi, + ice_bitmap_t *promisc_mask) +{ + uint16_t vid = fi->l_data.mac_vlan.vlan_id; + uint8_t *macaddr = fi->l_data.mac.mac_addr; + bool is_rx_lb_fltr = false; + bool is_tx_fltr = false; + + ice_zero_bitmap(promisc_mask, ICE_PROMISC_MAX); + + if (fi->flag == ICE_FLTR_TX) + is_tx_fltr = true; + if (fi->flag == ICE_FLTR_RX_LB) + is_rx_lb_fltr = true; + + if (ETHER_IS_BROADCAST(macaddr)) { + ice_set_bit(is_tx_fltr ? ICE_PROMISC_BCAST_TX + : ICE_PROMISC_BCAST_RX, promisc_mask); + } else if (ETHER_IS_MULTICAST(macaddr)) { + ice_set_bit(is_tx_fltr ? ICE_PROMISC_MCAST_TX + : ICE_PROMISC_MCAST_RX, promisc_mask); + } else { + if (is_tx_fltr) + ice_set_bit(ICE_PROMISC_UCAST_TX, promisc_mask); + else if (is_rx_lb_fltr) + ice_set_bit(ICE_PROMISC_UCAST_RX_LB, promisc_mask); + else + ice_set_bit(ICE_PROMISC_UCAST_RX, promisc_mask); + } + + if (vid) { + ice_set_bit(is_tx_fltr ? ICE_PROMISC_VLAN_TX + : ICE_PROMISC_VLAN_RX, promisc_mask); + } +} + +/** + * ice_remove_vsi_list_rule + * @hw: pointer to the hardware structure + * @vsi_list_id: VSI list ID generated as part of allocate resource + * @lkup_type: switch rule filter lookup type + * + * The VSI list should be emptied before this function is called to remove the + * VSI list. + */ +enum ice_status +ice_remove_vsi_list_rule(struct ice_hw *hw, uint16_t vsi_list_id, + enum ice_sw_lkup_type lkup_type) +{ + /* Free the vsi_list resource that we allocated. It is assumed that the + * list is empty at this point. + */ + return ice_aq_alloc_free_vsi_list(hw, &vsi_list_id, lkup_type, + ice_aqc_opc_free_res); +} + +/** + * ice_rem_update_vsi_list + * @hw: pointer to the hardware structure + * @vsi_handle: VSI handle of the VSI to remove + * @fm_list: filter management entry for which the VSI list management needs to + * be done + */ +enum ice_status +ice_rem_update_vsi_list(struct ice_hw *hw, uint16_t vsi_handle, + struct ice_fltr_mgmt_list_entry *fm_list) +{ + struct ice_switch_info *sw = hw->switch_info; + enum ice_sw_lkup_type lkup_type; + enum ice_status status = ICE_SUCCESS; + uint16_t vsi_list_id; + + if (fm_list->fltr_info.fltr_act != ICE_FWD_TO_VSI_LIST || + fm_list->vsi_count == 0) + return ICE_ERR_PARAM; + + /* A rule with the VSI being removed does not exist */ + if (!ice_is_bit_set(fm_list->vsi_list_info->vsi_map, vsi_handle)) + return ICE_ERR_DOES_NOT_EXIST; + + lkup_type = fm_list->fltr_info.lkup_type; + vsi_list_id = fm_list->fltr_info.fwd_id.vsi_list_id; + status = ice_update_vsi_list_rule(hw, &vsi_handle, 1, vsi_list_id, true, + ice_aqc_opc_update_sw_rules, + lkup_type); + if (status) + return status; + + fm_list->vsi_count--; + ice_clear_bit(vsi_handle, fm_list->vsi_list_info->vsi_map); + + if (fm_list->vsi_count == 1 && lkup_type != ICE_SW_LKUP_VLAN) { + struct ice_fltr_info tmp_fltr_info = fm_list->fltr_info; + struct ice_vsi_list_map_info *vsi_list_info = + fm_list->vsi_list_info; + uint16_t rem_vsi_handle; + + rem_vsi_handle = ice_find_first_bit(vsi_list_info->vsi_map, + ICE_MAX_VSI); + if (!ice_is_vsi_valid(hw, rem_vsi_handle)) + return ICE_ERR_OUT_OF_RANGE; + + /* Make sure VSI list is empty before removing it below */ + status = ice_update_vsi_list_rule(hw, &rem_vsi_handle, 1, + vsi_list_id, true, + ice_aqc_opc_update_sw_rules, + lkup_type); + if (status) + return status; + + tmp_fltr_info.fltr_act = ICE_FWD_TO_VSI; + tmp_fltr_info.fwd_id.hw_vsi_id = + hw->vsi_ctx[rem_vsi_handle]->vsi_num; + tmp_fltr_info.vsi_handle = rem_vsi_handle; + status = ice_update_pkt_fwd_rule(hw, &tmp_fltr_info); + if (status) { + DNPRINTF(ICE_DBG_SW, "%s: Failed to update pkt fwd " + "rule to FWD_TO_VSI on HW VSI %d, error %d\n", + __func__, + tmp_fltr_info.fwd_id.hw_vsi_id, status); + return status; + } + + fm_list->fltr_info = tmp_fltr_info; + } + + if ((fm_list->vsi_count == 1 && lkup_type != ICE_SW_LKUP_VLAN) || + (fm_list->vsi_count == 0 && lkup_type == ICE_SW_LKUP_VLAN)) { + struct ice_vsi_list_map_info *vsi_list_info = + fm_list->vsi_list_info; + + /* Remove the VSI list since it is no longer used */ + status = ice_remove_vsi_list_rule(hw, vsi_list_id, lkup_type); + if (status) { + DNPRINTF(ICE_DBG_SW, "%s: Failed to remove " + "VSI list %d, error %d\n", __func__, + vsi_list_id, status); + return status; + } + + TAILQ_REMOVE(&sw->vsi_list_map_head, vsi_list_info, list_entry); + ice_free(hw, vsi_list_info); + fm_list->vsi_list_info = NULL; + } + + return status; +} + +/** + * ice_remove_rule_internal - Remove a filter rule of a given type + * @hw: pointer to the hardware structure + * @recp_list: recipe list for which the rule needs to removed + * @f_entry: rule entry containing filter information + */ +enum ice_status +ice_remove_rule_internal(struct ice_hw *hw, struct ice_sw_recipe *recp_list, + struct ice_fltr_list_entry *f_entry) +{ + struct ice_fltr_mgmt_list_entry *list_elem; +#if 0 + struct ice_lock *rule_lock; /* Lock to protect filter rule list */ +#endif + enum ice_status status = ICE_SUCCESS; + bool remove_rule = false; + uint16_t vsi_handle; + + if (!ice_is_vsi_valid(hw, f_entry->fltr_info.vsi_handle)) + return ICE_ERR_PARAM; + f_entry->fltr_info.fwd_id.hw_vsi_id = + hw->vsi_ctx[f_entry->fltr_info.vsi_handle]->vsi_num; +#if 0 + rule_lock = &recp_list->filt_rule_lock; + ice_acquire_lock(rule_lock); +#endif + list_elem = ice_find_rule_entry(&recp_list->filt_rules, + &f_entry->fltr_info); + if (!list_elem) { + status = ICE_ERR_DOES_NOT_EXIST; + goto exit; + } + + if (list_elem->fltr_info.fltr_act != ICE_FWD_TO_VSI_LIST) { + remove_rule = true; + } else if (!list_elem->vsi_list_info) { + status = ICE_ERR_DOES_NOT_EXIST; + goto exit; + } else if (list_elem->vsi_list_info->ref_cnt > 1) { + /* a ref_cnt > 1 indicates that the vsi_list is being + * shared by multiple rules. Decrement the ref_cnt and + * remove this rule, but do not modify the list, as it + * is in-use by other rules. + */ + list_elem->vsi_list_info->ref_cnt--; + remove_rule = true; + } else { + /* a ref_cnt of 1 indicates the vsi_list is only used + * by one rule. However, the original removal request is only + * for a single VSI. Update the vsi_list first, and only + * remove the rule if there are no further VSIs in this list. + */ + vsi_handle = f_entry->fltr_info.vsi_handle; + status = ice_rem_update_vsi_list(hw, vsi_handle, list_elem); + if (status) + goto exit; + /* if VSI count goes to zero after updating the VSI list */ + if (list_elem->vsi_count == 0) + remove_rule = true; + } + + if (remove_rule) { + /* Remove the lookup rule */ + struct ice_sw_rule_lkup_rx_tx *s_rule; + + s_rule = (struct ice_sw_rule_lkup_rx_tx *) + ice_malloc(hw, ice_struct_size(s_rule, hdr_data, 0)); + if (!s_rule) { + status = ICE_ERR_NO_MEMORY; + goto exit; + } + + ice_fill_sw_rule(hw, &list_elem->fltr_info, s_rule, + ice_aqc_opc_remove_sw_rules); + + status = ice_aq_sw_rules(hw, s_rule, + ice_struct_size(s_rule, hdr_data, 0), + 1, ice_aqc_opc_remove_sw_rules, NULL); + + /* Remove a book keeping from the list */ + ice_free(hw, s_rule); + + if (status) + goto exit; + + TAILQ_REMOVE(&recp_list->filt_rules, list_elem, list_entry); + ice_free(hw, list_elem); + } +exit: +#if 0 + ice_release_lock(rule_lock); +#endif + return status; +} + +/** + * ice_remove_promisc - Remove promisc based filter rules + * @hw: pointer to the hardware structure + * @recp_id: recipe ID for which the rule needs to removed + * @v_list: list of promisc entries + */ +enum ice_status +ice_remove_promisc(struct ice_hw *hw, uint8_t recp_id, + struct ice_fltr_list_head *v_list) +{ + struct ice_fltr_list_entry *v_list_itr, *tmp; + struct ice_sw_recipe *recp_list; + + recp_list = &hw->switch_info->recp_list[recp_id]; + TAILQ_FOREACH_SAFE(v_list_itr, v_list, list_entry, tmp) { + v_list_itr->status = + ice_remove_rule_internal(hw, recp_list, v_list_itr); + if (v_list_itr->status) + return v_list_itr->status; + } + return ICE_SUCCESS; +} +/** + * ice_clear_vsi_promisc - clear specified promiscuous mode(s) + * @hw: pointer to the hardware structure + * @vsi_handle: VSI handle to clear mode + * @promisc_mask: pointer to mask of promiscuous config bits to clear + * @vid: VLAN ID to clear VLAN promiscuous + */ +enum ice_status +ice_clear_vsi_promisc(struct ice_hw *hw, uint16_t vsi_handle, + ice_bitmap_t *promisc_mask, uint16_t vid) +{ + struct ice_switch_info *sw = hw->switch_info; + ice_declare_bitmap(compl_promisc_mask, ICE_PROMISC_MAX); + ice_declare_bitmap(fltr_promisc_mask, ICE_PROMISC_MAX); + struct ice_fltr_list_entry *fm_entry, *tmp; + struct ice_fltr_list_head remove_list_head; + struct ice_fltr_mgmt_list_entry *itr; + struct ice_fltr_mgmt_list_head *rule_head; +#if 0 + struct ice_lock *rule_lock; /* Lock to protect filter rule list */ +#endif + enum ice_status status = ICE_SUCCESS; + uint8_t recipe_id; + + if (!ice_is_vsi_valid(hw, vsi_handle)) + return ICE_ERR_PARAM; + + if (ice_is_bit_set(promisc_mask, ICE_PROMISC_VLAN_RX) && + ice_is_bit_set(promisc_mask, ICE_PROMISC_VLAN_TX)) + recipe_id = ICE_SW_LKUP_PROMISC_VLAN; + else + recipe_id = ICE_SW_LKUP_PROMISC; + + rule_head = &sw->recp_list[recipe_id].filt_rules; +#if 0 + rule_lock = &sw->recp_list[recipe_id].filt_rule_lock; +#endif + TAILQ_INIT(&remove_list_head); +#if 0 + ice_acquire_lock(rule_lock); +#endif + TAILQ_FOREACH(itr, rule_head, list_entry) { + struct ice_fltr_info *fltr_info; + ice_zero_bitmap(compl_promisc_mask, ICE_PROMISC_MAX); + + if (!ice_vsi_uses_fltr(itr, vsi_handle)) + continue; + fltr_info = &itr->fltr_info; + + if (recipe_id == ICE_SW_LKUP_PROMISC_VLAN && + vid != fltr_info->l_data.mac_vlan.vlan_id) + continue; + + ice_determine_promisc_mask(fltr_info, fltr_promisc_mask); + ice_andnot_bitmap(compl_promisc_mask, fltr_promisc_mask, + promisc_mask, ICE_PROMISC_MAX); + + /* Skip if filter is not completely specified by given mask */ + if (ice_is_any_bit_set(compl_promisc_mask, ICE_PROMISC_MAX)) + continue; + + status = ice_add_entry_to_vsi_fltr_list(hw, vsi_handle, + &remove_list_head, + fltr_info); + if (status) { +#if 0 + ice_release_lock(rule_lock); +#endif + goto free_fltr_list; + } + } +#if 0 + ice_release_lock(rule_lock); +#endif + status = ice_remove_promisc(hw, recipe_id, &remove_list_head); + +free_fltr_list: + TAILQ_FOREACH_SAFE(fm_entry, &remove_list_head, list_entry, tmp) { + TAILQ_REMOVE(&remove_list_head, fm_entry, list_entry); + ice_free(hw, fm_entry); + } + + return status; +} + +/** + * ice_if_promisc_set - Set device promiscuous mode + * + * @remark Calls to this function will always overwrite the previous setting + */ +int +ice_if_promisc_set(struct ice_softc *sc) +{ + struct ifnet *ifp = &sc->sc_ac.ac_if; + struct ice_hw *hw = &sc->hw; + enum ice_status status; + bool promisc_enable = ifp->if_flags & IFF_PROMISC; + bool multi_enable = ifp->if_flags & IFF_ALLMULTI; + ice_declare_bitmap(promisc_mask, ICE_PROMISC_MAX); + + /* Do not support configuration when in recovery mode */ + if (ice_test_state(&sc->state, ICE_STATE_RECOVERY_MODE)) + return (ENOSYS); + + ice_set_default_promisc_mask(promisc_mask); + + if (multi_enable) + return (EOPNOTSUPP); + + if (promisc_enable) { + status = ice_set_vsi_promisc(hw, sc->pf_vsi.idx, + promisc_mask, 0); + if (status && status != ICE_ERR_ALREADY_EXISTS) { + printf("%s: Failed to enable promiscuous mode for " + "PF VSI, err %s aq_err %s\n", + sc->sc_dev.dv_xname, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + return (EIO); + } + } else { + status = ice_clear_vsi_promisc(hw, sc->pf_vsi.idx, + promisc_mask, 0); + if (status) { + printf("%s: Failed to disable promiscuous mode for " + "PF VSI, err %s aq_err %s\n", + sc->sc_dev.dv_xname, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + return (EIO); + } + } + + return (0); +} + +/** + * ice_enable_intr - Enable interrupts for given vector + * @hw: the device private HW structure + * @vector: the interrupt index in PF space + * + * In MSI or Legacy interrupt mode, interrupt 0 is the only valid index. + */ +void +ice_enable_intr(struct ice_hw *hw, int vector) +{ + uint32_t dyn_ctl; + + /* Use ITR_NONE so that ITR configuration is not changed. */ + dyn_ctl = GLINT_DYN_CTL_INTENA_M | GLINT_DYN_CTL_CLEARPBA_M | + (ICE_ITR_NONE << GLINT_DYN_CTL_ITR_INDX_S); + ICE_WRITE(hw, GLINT_DYN_CTL(vector), dyn_ctl); +} + +/** + * ice_disable_intr - Disable interrupts for given vector + * @hw: the device private HW structure + * @vector: the interrupt index in PF space + * + * In MSI or Legacy interrupt mode, interrupt 0 is the only valid index. + */ +void +ice_disable_intr(struct ice_hw *hw, int vector) +{ + uint32_t dyn_ctl; + + /* Use ITR_NONE so that ITR configuration is not changed. */ + dyn_ctl = ICE_ITR_NONE << GLINT_DYN_CTL_ITR_INDX_S; + ICE_WRITE(hw, GLINT_DYN_CTL(vector), dyn_ctl); +} + +/** + * ice_copy_phy_caps_to_cfg - Copy PHY ability data to configuration data + * @pi: port information structure + * @caps: PHY ability structure to copy data from + * @cfg: PHY configuration structure to copy data to + * + * Helper function to copy AQC PHY get ability data to PHY set configuration + * data structure + */ +void +ice_copy_phy_caps_to_cfg(struct ice_port_info *pi, + struct ice_aqc_get_phy_caps_data *caps, + struct ice_aqc_set_phy_cfg_data *cfg) +{ + if (!pi || !caps || !cfg) + return; + + memset(cfg, 0, sizeof(*cfg)); + cfg->phy_type_low = caps->phy_type_low; + cfg->phy_type_high = caps->phy_type_high; + cfg->caps = caps->caps; + cfg->low_power_ctrl_an = caps->low_power_ctrl_an; + cfg->eee_cap = caps->eee_cap; + cfg->eeer_value = caps->eeer_value; + cfg->link_fec_opt = caps->link_fec_options; + cfg->module_compliance_enforcement = + caps->module_compliance_enforcement; +} + +#define ICE_PHYS_100MB \ + (ICE_PHY_TYPE_LOW_100BASE_TX | \ + ICE_PHY_TYPE_LOW_100M_SGMII) +#define ICE_PHYS_1000MB \ + (ICE_PHY_TYPE_LOW_1000BASE_T | \ + ICE_PHY_TYPE_LOW_1000BASE_SX | \ + ICE_PHY_TYPE_LOW_1000BASE_LX | \ + ICE_PHY_TYPE_LOW_1000BASE_KX | \ + ICE_PHY_TYPE_LOW_1G_SGMII) +#define ICE_PHYS_2500MB \ + (ICE_PHY_TYPE_LOW_2500BASE_T | \ + ICE_PHY_TYPE_LOW_2500BASE_X | \ + ICE_PHY_TYPE_LOW_2500BASE_KX) +#define ICE_PHYS_5GB \ + (ICE_PHY_TYPE_LOW_5GBASE_T | \ + ICE_PHY_TYPE_LOW_5GBASE_KR) +#define ICE_PHYS_10GB \ + (ICE_PHY_TYPE_LOW_10GBASE_T | \ + ICE_PHY_TYPE_LOW_10G_SFI_DA | \ + ICE_PHY_TYPE_LOW_10GBASE_SR | \ + ICE_PHY_TYPE_LOW_10GBASE_LR | \ + ICE_PHY_TYPE_LOW_10GBASE_KR_CR1 | \ + ICE_PHY_TYPE_LOW_10G_SFI_AOC_ACC | \ + ICE_PHY_TYPE_LOW_10G_SFI_C2C) +#define ICE_PHYS_25GB \ + (ICE_PHY_TYPE_LOW_25GBASE_T | \ + ICE_PHY_TYPE_LOW_25GBASE_CR | \ + ICE_PHY_TYPE_LOW_25GBASE_CR_S | \ + ICE_PHY_TYPE_LOW_25GBASE_CR1 | \ + ICE_PHY_TYPE_LOW_25GBASE_SR | \ + ICE_PHY_TYPE_LOW_25GBASE_LR | \ + ICE_PHY_TYPE_LOW_25GBASE_KR | \ + ICE_PHY_TYPE_LOW_25GBASE_KR_S | \ + ICE_PHY_TYPE_LOW_25GBASE_KR1 | \ + ICE_PHY_TYPE_LOW_25G_AUI_AOC_ACC | \ + ICE_PHY_TYPE_LOW_25G_AUI_C2C) +#define ICE_PHYS_40GB \ + (ICE_PHY_TYPE_LOW_40GBASE_CR4 | \ + ICE_PHY_TYPE_LOW_40GBASE_SR4 | \ + ICE_PHY_TYPE_LOW_40GBASE_LR4 | \ + ICE_PHY_TYPE_LOW_40GBASE_KR4 | \ + ICE_PHY_TYPE_LOW_40G_XLAUI_AOC_ACC | \ + ICE_PHY_TYPE_LOW_40G_XLAUI) +#define ICE_PHYS_50GB \ + (ICE_PHY_TYPE_LOW_50GBASE_CR2 | \ + ICE_PHY_TYPE_LOW_50GBASE_SR2 | \ + ICE_PHY_TYPE_LOW_50GBASE_LR2 | \ + ICE_PHY_TYPE_LOW_50GBASE_KR2 | \ + ICE_PHY_TYPE_LOW_50G_LAUI2_AOC_ACC | \ + ICE_PHY_TYPE_LOW_50G_LAUI2 | \ + ICE_PHY_TYPE_LOW_50G_AUI2_AOC_ACC | \ + ICE_PHY_TYPE_LOW_50G_AUI2 | \ + ICE_PHY_TYPE_LOW_50GBASE_CP | \ + ICE_PHY_TYPE_LOW_50GBASE_SR | \ + ICE_PHY_TYPE_LOW_50GBASE_FR | \ + ICE_PHY_TYPE_LOW_50GBASE_LR | \ + ICE_PHY_TYPE_LOW_50GBASE_KR_PAM4 | \ + ICE_PHY_TYPE_LOW_50G_AUI1_AOC_ACC | \ + ICE_PHY_TYPE_LOW_50G_AUI1) +#define ICE_PHYS_100GB_LOW \ + (ICE_PHY_TYPE_LOW_100GBASE_CR4 | \ + ICE_PHY_TYPE_LOW_100GBASE_SR4 | \ + ICE_PHY_TYPE_LOW_100GBASE_LR4 | \ + ICE_PHY_TYPE_LOW_100GBASE_KR4 | \ + ICE_PHY_TYPE_LOW_100G_CAUI4_AOC_ACC | \ + ICE_PHY_TYPE_LOW_100G_CAUI4 | \ + ICE_PHY_TYPE_LOW_100G_AUI4_AOC_ACC | \ + ICE_PHY_TYPE_LOW_100G_AUI4 | \ + ICE_PHY_TYPE_LOW_100GBASE_CR_PAM4 | \ + ICE_PHY_TYPE_LOW_100GBASE_KR_PAM4 | \ + ICE_PHY_TYPE_LOW_100GBASE_CP2 | \ + ICE_PHY_TYPE_LOW_100GBASE_SR2 | \ + ICE_PHY_TYPE_LOW_100GBASE_DR) +#define ICE_PHYS_100GB_HIGH \ + (ICE_PHY_TYPE_HIGH_100GBASE_KR2_PAM4 | \ + ICE_PHY_TYPE_HIGH_100G_CAUI2_AOC_ACC | \ + ICE_PHY_TYPE_HIGH_100G_CAUI2 | \ + ICE_PHY_TYPE_HIGH_100G_AUI2_AOC_ACC | \ + ICE_PHY_TYPE_HIGH_100G_AUI2) + +/** + * ice_sysctl_speeds_to_aq_phy_types - Convert sysctl speed flags to AQ PHY flags + * @sysctl_speeds: 16-bit sysctl speeds or AQ_LINK_SPEED flags + * @phy_type_low: output parameter for lower AQ PHY flags + * @phy_type_high: output parameter for higher AQ PHY flags + * + * Converts the given link speed flags into AQ PHY type flag sets appropriate + * for use in a Set PHY Config command. + */ +void +ice_sysctl_speeds_to_aq_phy_types(uint16_t sysctl_speeds, + uint64_t *phy_type_low, uint64_t *phy_type_high) +{ + *phy_type_low = 0, *phy_type_high = 0; + + if (sysctl_speeds & ICE_AQ_LINK_SPEED_100MB) + *phy_type_low |= ICE_PHYS_100MB; + if (sysctl_speeds & ICE_AQ_LINK_SPEED_1000MB) + *phy_type_low |= ICE_PHYS_1000MB; + if (sysctl_speeds & ICE_AQ_LINK_SPEED_2500MB) + *phy_type_low |= ICE_PHYS_2500MB; + if (sysctl_speeds & ICE_AQ_LINK_SPEED_5GB) + *phy_type_low |= ICE_PHYS_5GB; + if (sysctl_speeds & ICE_AQ_LINK_SPEED_10GB) + *phy_type_low |= ICE_PHYS_10GB; + if (sysctl_speeds & ICE_AQ_LINK_SPEED_25GB) + *phy_type_low |= ICE_PHYS_25GB; + if (sysctl_speeds & ICE_AQ_LINK_SPEED_40GB) + *phy_type_low |= ICE_PHYS_40GB; + if (sysctl_speeds & ICE_AQ_LINK_SPEED_50GB) + *phy_type_low |= ICE_PHYS_50GB; + if (sysctl_speeds & ICE_AQ_LINK_SPEED_100GB) { + *phy_type_low |= ICE_PHYS_100GB_LOW; + *phy_type_high |= ICE_PHYS_100GB_HIGH; + } +} + +/** + * @struct ice_phy_data + * @brief PHY caps and link speeds + * + * Buffer providing report mode and user speeds; + * returning intersection of PHY types and speeds. + */ +struct ice_phy_data { + uint64_t phy_low_orig; /* PHY low quad from report */ + uint64_t phy_high_orig; /* PHY high quad from report */ + uint64_t phy_low_intr; /* low quad intersection with user speeds */ + uint64_t phy_high_intr; /* high quad intersection with user speeds */ + uint16_t user_speeds_orig; /* Input from caller - ICE_AQ_LINK_SPEED_* */ + uint16_t user_speeds_intr; /* Intersect with report speeds */ + uint8_t report_mode; /* See ICE_AQC_REPORT_* */ +}; + +/** + * @var phy_link_speeds + * @brief PHY link speed conversion array + * + * Array of link speeds to convert ICE_PHY_TYPE_LOW and ICE_PHY_TYPE_HIGH into + * link speeds used by the link speed sysctls. + * + * @remark these are based on the indices used in the BIT() macros for the + * ICE_PHY_TYPE_LOW_* and ICE_PHY_TYPE_HIGH_* definitions. + */ +static const uint16_t phy_link_speeds[] = { + ICE_AQ_LINK_SPEED_100MB, + ICE_AQ_LINK_SPEED_100MB, + ICE_AQ_LINK_SPEED_1000MB, + ICE_AQ_LINK_SPEED_1000MB, + ICE_AQ_LINK_SPEED_1000MB, + ICE_AQ_LINK_SPEED_1000MB, + ICE_AQ_LINK_SPEED_1000MB, + ICE_AQ_LINK_SPEED_2500MB, + ICE_AQ_LINK_SPEED_2500MB, + ICE_AQ_LINK_SPEED_2500MB, + ICE_AQ_LINK_SPEED_5GB, + ICE_AQ_LINK_SPEED_5GB, + ICE_AQ_LINK_SPEED_10GB, + ICE_AQ_LINK_SPEED_10GB, + ICE_AQ_LINK_SPEED_10GB, + ICE_AQ_LINK_SPEED_10GB, + ICE_AQ_LINK_SPEED_10GB, + ICE_AQ_LINK_SPEED_10GB, + ICE_AQ_LINK_SPEED_10GB, + ICE_AQ_LINK_SPEED_25GB, + ICE_AQ_LINK_SPEED_25GB, + ICE_AQ_LINK_SPEED_25GB, + ICE_AQ_LINK_SPEED_25GB, + ICE_AQ_LINK_SPEED_25GB, + ICE_AQ_LINK_SPEED_25GB, + ICE_AQ_LINK_SPEED_25GB, + ICE_AQ_LINK_SPEED_25GB, + ICE_AQ_LINK_SPEED_25GB, + ICE_AQ_LINK_SPEED_25GB, + ICE_AQ_LINK_SPEED_25GB, + ICE_AQ_LINK_SPEED_40GB, + ICE_AQ_LINK_SPEED_40GB, + ICE_AQ_LINK_SPEED_40GB, + ICE_AQ_LINK_SPEED_40GB, + ICE_AQ_LINK_SPEED_40GB, + ICE_AQ_LINK_SPEED_40GB, + ICE_AQ_LINK_SPEED_50GB, + ICE_AQ_LINK_SPEED_50GB, + ICE_AQ_LINK_SPEED_50GB, + ICE_AQ_LINK_SPEED_50GB, + ICE_AQ_LINK_SPEED_50GB, + ICE_AQ_LINK_SPEED_50GB, + ICE_AQ_LINK_SPEED_50GB, + ICE_AQ_LINK_SPEED_50GB, + ICE_AQ_LINK_SPEED_50GB, + ICE_AQ_LINK_SPEED_50GB, + ICE_AQ_LINK_SPEED_50GB, + ICE_AQ_LINK_SPEED_50GB, + ICE_AQ_LINK_SPEED_50GB, + ICE_AQ_LINK_SPEED_50GB, + ICE_AQ_LINK_SPEED_50GB, + ICE_AQ_LINK_SPEED_100GB, + ICE_AQ_LINK_SPEED_100GB, + ICE_AQ_LINK_SPEED_100GB, + ICE_AQ_LINK_SPEED_100GB, + ICE_AQ_LINK_SPEED_100GB, + ICE_AQ_LINK_SPEED_100GB, + ICE_AQ_LINK_SPEED_100GB, + ICE_AQ_LINK_SPEED_100GB, + ICE_AQ_LINK_SPEED_100GB, + ICE_AQ_LINK_SPEED_100GB, + ICE_AQ_LINK_SPEED_100GB, + ICE_AQ_LINK_SPEED_100GB, + ICE_AQ_LINK_SPEED_100GB, + /* These rates are for ICE_PHY_TYPE_HIGH_* */ + ICE_AQ_LINK_SPEED_100GB, + ICE_AQ_LINK_SPEED_100GB, + ICE_AQ_LINK_SPEED_100GB, + ICE_AQ_LINK_SPEED_100GB, + ICE_AQ_LINK_SPEED_100GB +}; + +/** + * ice_aq_phy_types_to_link_speeds - Convert the PHY Types to speeds + * @phy_type_low: lower 64-bit PHY Type bitmask + * @phy_type_high: upper 64-bit PHY Type bitmask + * + * Convert the PHY Type fields from Get PHY Abilities and Set PHY Config into + * link speed flags. If phy_type_high has an unknown PHY type, then the return + * value will include the "ICE_AQ_LINK_SPEED_UNKNOWN" flag as well. + */ +uint16_t +ice_aq_phy_types_to_link_speeds(uint64_t phy_type_low, uint64_t phy_type_high) +{ + uint16_t sysctl_speeds = 0; + int bit; + + for (bit = 0; bit < 64; bit++) { + if (phy_type_low & (1ULL << bit)) + sysctl_speeds |= phy_link_speeds[bit]; + } + + for (bit = 0; bit < 64; bit++) { + if ((phy_type_high & (1ULL << bit)) == 0) + continue; + if ((bit + 64) < (int)nitems(phy_link_speeds)) + sysctl_speeds |= phy_link_speeds[bit + 64]; + else + sysctl_speeds |= ICE_AQ_LINK_SPEED_UNKNOWN; + } + + return (sysctl_speeds); +} + +/** + * ice_apply_supported_speed_filter - Mask off unsupported speeds + * @report_speeds: bit-field for the desired link speeds + * @mod_type: type of module/sgmii connection we have + * + * Given a bitmap of the desired lenient mode link speeds, + * this function will mask off the speeds that are not currently + * supported by the device. + */ +uint16_t +ice_apply_supported_speed_filter(uint16_t report_speeds, uint8_t mod_type) +{ + uint16_t speed_mask; + enum { IS_SGMII, IS_SFP, IS_QSFP } module; + + /* + * The SFF specification says 0 is unknown, so we'll + * treat it like we're connected through SGMII for now. + * This may need revisiting if a new type is supported + * in the future. + */ + switch (mod_type) { + case 0: + module = IS_SGMII; + break; + case 3: + module = IS_SFP; + break; + default: + module = IS_QSFP; + break; + } + + /* We won't offer anything lower than 100M for any part, + * but we'll need to mask off other speeds based on the + * device and module type. + */ + speed_mask = ~((uint16_t)ICE_AQ_LINK_SPEED_100MB - 1); + if ((report_speeds & ICE_AQ_LINK_SPEED_10GB) && (module == IS_SFP)) + speed_mask = ~((uint16_t)ICE_AQ_LINK_SPEED_1000MB - 1); + if (report_speeds & ICE_AQ_LINK_SPEED_25GB) + speed_mask = ~((uint16_t)ICE_AQ_LINK_SPEED_1000MB - 1); + if (report_speeds & ICE_AQ_LINK_SPEED_50GB) { + speed_mask = ~((uint16_t)ICE_AQ_LINK_SPEED_1000MB - 1); + if (module == IS_QSFP) + speed_mask = ~((uint16_t)ICE_AQ_LINK_SPEED_10GB - 1); + } + if (report_speeds & ICE_AQ_LINK_SPEED_100GB) + speed_mask = ~((uint16_t)ICE_AQ_LINK_SPEED_25GB - 1); + return (report_speeds & speed_mask); +} + +/** + * ice_intersect_phy_types_and_speeds - Return intersection of link speeds + * @sc: device private structure + * @phy_data: device PHY data + * + * On read: Displays the currently supported speeds + * On write: Sets the device's supported speeds + * Valid input flags: see ICE_SYSCTL_HELP_ADVERTISE_SPEED + */ +int +ice_intersect_phy_types_and_speeds(struct ice_softc *sc, + struct ice_phy_data *phy_data) +{ + struct ice_aqc_get_phy_caps_data pcaps = { 0 }; + const char *report_types[5] = { "w/o MEDIA", + "w/MEDIA", + "ACTIVE", + "EDOOFUS", /* Not used */ + "DFLT" }; + struct ice_hw *hw = &sc->hw; + struct ice_port_info *pi = hw->port_info; + enum ice_status status; + uint16_t report_speeds, temp_speeds; + uint8_t report_type; + bool apply_speed_filter = false; + + switch (phy_data->report_mode) { + case ICE_AQC_REPORT_TOPO_CAP_NO_MEDIA: + case ICE_AQC_REPORT_TOPO_CAP_MEDIA: + case ICE_AQC_REPORT_ACTIVE_CFG: + case ICE_AQC_REPORT_DFLT_CFG: + report_type = phy_data->report_mode >> 1; + break; + default: + DPRINTF("%s: phy_data.report_mode \"%u\" doesn't exist\n", + __func__, phy_data->report_mode); + return (EINVAL); + } + + /* 0 is treated as "Auto"; the driver will handle selecting the + * correct speeds. Including, in some cases, applying an override + * if provided. + */ + if (phy_data->user_speeds_orig == 0) + phy_data->user_speeds_orig = USHRT_MAX; + else if (ice_is_bit_set(sc->feat_en, ICE_FEATURE_LENIENT_LINK_MODE)) + apply_speed_filter = true; + + status = ice_aq_get_phy_caps(pi, false, phy_data->report_mode, &pcaps, NULL); + if (status != ICE_SUCCESS) { + printf("%s: ice_aq_get_phy_caps (%s) failed; status %s, " + "aq_err %s\n", sc->sc_dev.dv_xname, + report_types[report_type], ice_status_str(status), + ice_aq_str(sc->hw.adminq.sq_last_status)); + return (EIO); + } + + phy_data->phy_low_orig = le64toh(pcaps.phy_type_low); + phy_data->phy_high_orig = le64toh(pcaps.phy_type_high); + report_speeds = ice_aq_phy_types_to_link_speeds(phy_data->phy_low_orig, + phy_data->phy_high_orig); + if (apply_speed_filter) { + temp_speeds = ice_apply_supported_speed_filter(report_speeds, + pcaps.module_type[0]); + if ((phy_data->user_speeds_orig & temp_speeds) == 0) { + printf("%s: User-specified speeds (\"0x%04X\") not " + "supported\n", sc->sc_dev.dv_xname, + phy_data->user_speeds_orig); + return (EINVAL); + } + report_speeds = temp_speeds; + } + ice_sysctl_speeds_to_aq_phy_types(phy_data->user_speeds_orig, + &phy_data->phy_low_intr, &phy_data->phy_high_intr); + phy_data->user_speeds_intr = phy_data->user_speeds_orig & report_speeds; + phy_data->phy_low_intr &= phy_data->phy_low_orig; + phy_data->phy_high_intr &= phy_data->phy_high_orig; + + return (0); + } + +/** + * ice_apply_saved_phy_req_to_cfg -- Write saved user PHY settings to cfg data + * @sc: device private structure + * @cfg: new PHY config data to be modified + * + * Applies user settings for advertised speeds to the PHY type fields in the + * supplied PHY config struct. It uses the data from pcaps to check if the + * saved settings are invalid and uses the pcaps data instead if they are + * invalid. + */ +int +ice_apply_saved_phy_req_to_cfg(struct ice_softc *sc, + struct ice_aqc_set_phy_cfg_data *cfg) +{ + struct ice_phy_data phy_data = { 0 }; + struct ice_port_info *pi = sc->hw.port_info; + uint64_t phy_low = 0, phy_high = 0; + uint16_t link_speeds; + int ret; + + link_speeds = pi->phy.curr_user_speed_req; + if (ice_is_bit_set(sc->feat_en, ICE_FEATURE_LINK_MGMT_VER_2)) { + memset(&phy_data, 0, sizeof(phy_data)); + phy_data.report_mode = ICE_AQC_REPORT_DFLT_CFG; + phy_data.user_speeds_orig = link_speeds; + ret = ice_intersect_phy_types_and_speeds(sc, &phy_data); + if (ret != 0) + return (ret); + phy_low = phy_data.phy_low_intr; + phy_high = phy_data.phy_high_intr; + + if (link_speeds == 0 || phy_data.user_speeds_intr) + goto finalize_link_speed; + if (ice_is_bit_set(sc->feat_en, + ICE_FEATURE_LENIENT_LINK_MODE)) { + memset(&phy_data, 0, sizeof(phy_data)); + phy_data.report_mode = ICE_AQC_REPORT_TOPO_CAP_NO_MEDIA; + phy_data.user_speeds_orig = link_speeds; + ret = ice_intersect_phy_types_and_speeds(sc, &phy_data); + if (ret != 0) + return (ret); + phy_low = phy_data.phy_low_intr; + phy_high = phy_data.phy_high_intr; + + if (!phy_data.user_speeds_intr) { + phy_low = phy_data.phy_low_orig; + phy_high = phy_data.phy_high_orig; + } + goto finalize_link_speed; + } + /* If we're here, then it means the benefits of Version 2 + * link management aren't utilized. We fall through to + * handling Strict Link Mode the same as Version 1 link + * management. + */ + } + + memset(&phy_data, 0, sizeof(phy_data)); + if ((link_speeds == 0) && + (sc->ldo_tlv.phy_type_low || sc->ldo_tlv.phy_type_high)) + phy_data.report_mode = ICE_AQC_REPORT_TOPO_CAP_NO_MEDIA; + else + phy_data.report_mode = ICE_AQC_REPORT_TOPO_CAP_MEDIA; + phy_data.user_speeds_orig = link_speeds; + ret = ice_intersect_phy_types_and_speeds(sc, &phy_data); + if (ret != 0) + return (ret); + phy_low = phy_data.phy_low_intr; + phy_high = phy_data.phy_high_intr; + + if (!ice_is_bit_set(sc->feat_en, ICE_FEATURE_LENIENT_LINK_MODE)) { + if (phy_low == 0 && phy_high == 0) { + printf("%s: The selected speed is not supported by " + "the current media. Please select a link speed " + "that is supported by the current media.\n", + sc->sc_dev.dv_xname); + return (EINVAL); + } + } else { + if (link_speeds == 0) { + if (sc->ldo_tlv.phy_type_low & phy_low || + sc->ldo_tlv.phy_type_high & phy_high) { + phy_low &= sc->ldo_tlv.phy_type_low; + phy_high &= sc->ldo_tlv.phy_type_high; + } + } else if (phy_low == 0 && phy_high == 0) { + memset(&phy_data, 0, sizeof(phy_data)); + phy_data.report_mode = ICE_AQC_REPORT_TOPO_CAP_NO_MEDIA; + phy_data.user_speeds_orig = link_speeds; + ret = ice_intersect_phy_types_and_speeds(sc, &phy_data); + if (ret != 0) + return (ret); + phy_low = phy_data.phy_low_intr; + phy_high = phy_data.phy_high_intr; + + if (!phy_data.user_speeds_intr) { + phy_low = phy_data.phy_low_orig; + phy_high = phy_data.phy_high_orig; + } + } + } + +finalize_link_speed: + /* Cache new user settings for speeds */ + pi->phy.curr_user_speed_req = phy_data.user_speeds_intr; + cfg->phy_type_low = htole64(phy_low); + cfg->phy_type_high = htole64(phy_high); + + return (ret); +} + +/** + * ice_get_pfa_module_tlv - Reads sub module TLV from NVM PFA + * @hw: pointer to hardware structure + * @module_tlv: pointer to module TLV to return + * @module_tlv_len: pointer to module TLV length to return + * @module_type: module type requested + * + * Finds the requested sub module TLV type from the Preserved Field + * Area (PFA) and returns the TLV pointer and length. The caller can + * use these to read the variable length TLV value. + */ +enum ice_status +ice_get_pfa_module_tlv(struct ice_hw *hw, uint16_t *module_tlv, + uint16_t *module_tlv_len, uint16_t module_type) +{ + enum ice_status status; + uint16_t pfa_len, pfa_ptr; + uint16_t next_tlv; + + status = ice_read_sr_word(hw, ICE_SR_PFA_PTR, &pfa_ptr); + if (status != ICE_SUCCESS) { + DNPRINTF(ICE_DBG_INIT, "%s: Preserved Field Array pointer.\n", + __func__); + return status; + } + status = ice_read_sr_word(hw, pfa_ptr, &pfa_len); + if (status != ICE_SUCCESS) { + DNPRINTF(ICE_DBG_INIT, "%s: Failed to read PFA length.\n", + __func__); + return status; + } + /* Starting with first TLV after PFA length, iterate through the list + * of TLVs to find the requested one. + */ + next_tlv = pfa_ptr + 1; + while (next_tlv < pfa_ptr + pfa_len) { + uint16_t tlv_sub_module_type; + uint16_t tlv_len; + + /* Read TLV type */ + status = ice_read_sr_word(hw, next_tlv, &tlv_sub_module_type); + if (status != ICE_SUCCESS) { + DNPRINTF(ICE_DBG_INIT, "%s: Failed to read TLV type.\n", + __func__); + break; + } + /* Read TLV length */ + status = ice_read_sr_word(hw, next_tlv + 1, &tlv_len); + if (status != ICE_SUCCESS) { + DNPRINTF(ICE_DBG_INIT, + "%s: Failed to read TLV length.\n", __func__); + break; + } + if (tlv_sub_module_type == module_type) { + if (tlv_len) { + *module_tlv = next_tlv; + *module_tlv_len = tlv_len; + return ICE_SUCCESS; + } + return ICE_ERR_INVAL_SIZE; + } + /* Check next TLV, i.e. current TLV pointer + length + 2 words + * (for current TLV's type and length) + */ + next_tlv = next_tlv + tlv_len + 2; + } + /* Module does not exist */ + return ICE_ERR_DOES_NOT_EXIST; +} + +/** + * ice_get_link_default_override + * @ldo: pointer to the link default override struct + * @pi: pointer to the port info struct + * + * Gets the link default override for a port + */ +enum ice_status +ice_get_link_default_override(struct ice_link_default_override_tlv *ldo, + struct ice_port_info *pi) +{ + uint16_t i, tlv, tlv_len, tlv_start, buf, offset; + struct ice_hw *hw = pi->hw; + enum ice_status status; + + status = ice_get_pfa_module_tlv(hw, &tlv, &tlv_len, + ICE_SR_LINK_DEFAULT_OVERRIDE_PTR); + if (status) { + DNPRINTF(ICE_DBG_INIT, + "%s: Failed to read link override TLV.\n", __func__); + return status; + } + + /* Each port has its own config; calculate for our port */ + tlv_start = tlv + pi->lport * ICE_SR_PFA_LINK_OVERRIDE_WORDS + + ICE_SR_PFA_LINK_OVERRIDE_OFFSET; + + /* link options first */ + status = ice_read_sr_word(hw, tlv_start, &buf); + if (status) { + DNPRINTF(ICE_DBG_INIT, + "%s: Failed to read override link options.\n", __func__); + return status; + } + ldo->options = buf & ICE_LINK_OVERRIDE_OPT_M; + ldo->phy_config = (buf & ICE_LINK_OVERRIDE_PHY_CFG_M) >> + ICE_LINK_OVERRIDE_PHY_CFG_S; + + /* link PHY config */ + offset = tlv_start + ICE_SR_PFA_LINK_OVERRIDE_FEC_OFFSET; + status = ice_read_sr_word(hw, offset, &buf); + if (status) { + DNPRINTF(ICE_DBG_INIT, + "%s: Failed to read override phy config.\n", __func__); + return status; + } + ldo->fec_options = buf & ICE_LINK_OVERRIDE_FEC_OPT_M; + + /* PHY types low */ + offset = tlv_start + ICE_SR_PFA_LINK_OVERRIDE_PHY_OFFSET; + for (i = 0; i < ICE_SR_PFA_LINK_OVERRIDE_PHY_WORDS; i++) { + status = ice_read_sr_word(hw, (offset + i), &buf); + if (status) { + DNPRINTF(ICE_DBG_INIT, + "%s: Failed to read override link options.\n", + __func__); + return status; + } + /* shift 16 bits at a time to fill 64 bits */ + ldo->phy_type_low |= ((uint64_t)buf << (i * 16)); + } + + /* PHY types high */ + offset = tlv_start + ICE_SR_PFA_LINK_OVERRIDE_PHY_OFFSET + + ICE_SR_PFA_LINK_OVERRIDE_PHY_WORDS; + for (i = 0; i < ICE_SR_PFA_LINK_OVERRIDE_PHY_WORDS; i++) { + status = ice_read_sr_word(hw, (offset + i), &buf); + if (status) { + DNPRINTF(ICE_DBG_INIT, + "%s: Failed to read override link options.\n", + __func__); + return status; + } + /* shift 16 bits at a time to fill 64 bits */ + ldo->phy_type_high |= ((uint64_t)buf << (i * 16)); + } + + return status; +} + +/** + * ice_fw_supports_fec_dis_auto + * @hw: pointer to the hardware structure + * + * Checks if the firmware supports FEC disable in Auto FEC mode + */ +bool ice_fw_supports_fec_dis_auto(struct ice_hw *hw) +{ + return ice_is_fw_min_ver(hw, ICE_FW_VER_BRANCH_E810, + ICE_FW_FEC_DIS_AUTO_MAJ, + ICE_FW_FEC_DIS_AUTO_MIN, + ICE_FW_FEC_DIS_AUTO_PATCH) || + ice_is_fw_min_ver(hw, ICE_FW_VER_BRANCH_E82X, + ICE_FW_FEC_DIS_AUTO_MAJ_E82X, + ICE_FW_FEC_DIS_AUTO_MIN_E82X, + ICE_FW_FEC_DIS_AUTO_PATCH_E82X); +} + +/** + * ice_cfg_phy_fec - Configure PHY FEC data based on FEC mode + * @pi: port information structure + * @cfg: PHY configuration data to set FEC mode + * @fec: FEC mode to configure + */ +enum ice_status +ice_cfg_phy_fec(struct ice_port_info *pi, struct ice_aqc_set_phy_cfg_data *cfg, + enum ice_fec_mode fec) +{ + struct ice_aqc_get_phy_caps_data *pcaps; + enum ice_status status = ICE_SUCCESS; + struct ice_hw *hw; + + if (!pi || !cfg) + return ICE_ERR_BAD_PTR; + + hw = pi->hw; + + pcaps = (struct ice_aqc_get_phy_caps_data *) + ice_malloc(hw, sizeof(*pcaps)); + if (!pcaps) + return ICE_ERR_NO_MEMORY; + + status = ice_aq_get_phy_caps(pi, false, + (ice_fw_supports_report_dflt_cfg(hw) ? + ICE_AQC_REPORT_DFLT_CFG : + ICE_AQC_REPORT_TOPO_CAP_MEDIA), pcaps, + NULL); + + if (status) + goto out; + + cfg->caps |= (pcaps->caps & ICE_AQC_PHY_EN_AUTO_FEC); + cfg->link_fec_opt = pcaps->link_fec_options; + + switch (fec) { + case ICE_FEC_BASER: + /* Clear RS bits, and AND BASE-R ability + * bits and OR request bits. + */ + cfg->link_fec_opt &= ICE_AQC_PHY_FEC_10G_KR_40G_KR4_EN | + ICE_AQC_PHY_FEC_25G_KR_CLAUSE74_EN; + cfg->link_fec_opt |= ICE_AQC_PHY_FEC_10G_KR_40G_KR4_REQ | + ICE_AQC_PHY_FEC_25G_KR_REQ; + break; + case ICE_FEC_RS: + /* Clear BASE-R bits, and AND RS ability + * bits and OR request bits. + */ + cfg->link_fec_opt &= ICE_AQC_PHY_FEC_25G_RS_CLAUSE91_EN; + cfg->link_fec_opt |= ICE_AQC_PHY_FEC_25G_RS_528_REQ | + ICE_AQC_PHY_FEC_25G_RS_544_REQ; + break; + case ICE_FEC_NONE: + /* Clear all FEC option bits. */ + cfg->link_fec_opt &= ~ICE_AQC_PHY_FEC_MASK; + break; + case ICE_FEC_DIS_AUTO: + /* Set No FEC and auto FEC */ + if (!ice_fw_supports_fec_dis_auto(hw)) { + status = ICE_ERR_NOT_SUPPORTED; + goto out; + } + cfg->link_fec_opt |= ICE_AQC_PHY_FEC_DIS; + /* fall-through */ + case ICE_FEC_AUTO: + /* AND auto FEC bit, and all caps bits. */ + cfg->caps &= ICE_AQC_PHY_CAPS_MASK; + cfg->link_fec_opt |= pcaps->link_fec_options; + break; + default: + status = ICE_ERR_PARAM; + break; + } + + if (fec == ICE_FEC_AUTO && ice_fw_supports_link_override(pi->hw) && + !ice_fw_supports_report_dflt_cfg(pi->hw)) { + struct ice_link_default_override_tlv tlv; + + if (ice_get_link_default_override(&tlv, pi)) + goto out; + + if (!(tlv.options & ICE_LINK_OVERRIDE_STRICT_MODE) && + (tlv.options & ICE_LINK_OVERRIDE_EN)) + cfg->link_fec_opt = tlv.fec_options; + } + +out: + ice_free(hw, pcaps); + + return status; +} + +/** + * ice_apply_saved_fec_req_to_cfg -- Write saved user FEC mode to cfg data + * @sc: device private structure + * @cfg: new PHY config data to be modified + * + * Applies user setting for FEC mode to PHY config struct. It uses the data + * from pcaps to check if the saved settings are invalid and uses the pcaps + * data instead if they are invalid. + */ +int +ice_apply_saved_fec_req_to_cfg(struct ice_softc *sc, + struct ice_aqc_set_phy_cfg_data *cfg) +{ + struct ice_port_info *pi = sc->hw.port_info; + enum ice_status status; + + cfg->caps &= ~ICE_AQC_PHY_EN_AUTO_FEC; + status = ice_cfg_phy_fec(pi, cfg, pi->phy.curr_user_fec_req); + if (status) + return (EIO); + + return (0); +} + +/** + * ice_apply_saved_fc_req_to_cfg -- Write saved user flow control mode to cfg data + * @pi: port info struct + * @cfg: new PHY config data to be modified + * + * Applies user setting for flow control mode to PHY config struct. There are + * no invalid flow control mode settings; if there are, then this function + * treats them like "ICE_FC_NONE". + */ +void +ice_apply_saved_fc_req_to_cfg(struct ice_port_info *pi, + struct ice_aqc_set_phy_cfg_data *cfg) +{ + cfg->caps &= ~(ICE_AQ_PHY_ENA_TX_PAUSE_ABILITY | + ICE_AQ_PHY_ENA_RX_PAUSE_ABILITY); + + switch (pi->phy.curr_user_fc_req) { + case ICE_FC_FULL: + cfg->caps |= ICE_AQ_PHY_ENA_TX_PAUSE_ABILITY | + ICE_AQ_PHY_ENA_RX_PAUSE_ABILITY; + break; + case ICE_FC_RX_PAUSE: + cfg->caps |= ICE_AQ_PHY_ENA_RX_PAUSE_ABILITY; + break; + case ICE_FC_TX_PAUSE: + cfg->caps |= ICE_AQ_PHY_ENA_TX_PAUSE_ABILITY; + break; + default: + /* ICE_FC_NONE */ + break; + } +} + +/** + * ice_caps_to_fc_mode + * @caps: PHY capabilities + * + * Convert PHY FC capabilities to ice FC mode + */ +enum ice_fc_mode +ice_caps_to_fc_mode(uint8_t caps) +{ + if (caps & ICE_AQC_PHY_EN_TX_LINK_PAUSE && + caps & ICE_AQC_PHY_EN_RX_LINK_PAUSE) + return ICE_FC_FULL; + + if (caps & ICE_AQC_PHY_EN_TX_LINK_PAUSE) + return ICE_FC_TX_PAUSE; + + if (caps & ICE_AQC_PHY_EN_RX_LINK_PAUSE) + return ICE_FC_RX_PAUSE; + + return ICE_FC_NONE; +} + +/** + * ice_caps_to_fec_mode + * @caps: PHY capabilities + * @fec_options: Link FEC options + * + * Convert PHY FEC capabilities to ice FEC mode + */ +enum ice_fec_mode +ice_caps_to_fec_mode(uint8_t caps, uint8_t fec_options) +{ + if (caps & ICE_AQC_PHY_EN_AUTO_FEC) { + if (fec_options & ICE_AQC_PHY_FEC_DIS) + return ICE_FEC_DIS_AUTO; + else + return ICE_FEC_AUTO; + } + + if (fec_options & (ICE_AQC_PHY_FEC_10G_KR_40G_KR4_EN | + ICE_AQC_PHY_FEC_10G_KR_40G_KR4_REQ | + ICE_AQC_PHY_FEC_25G_KR_CLAUSE74_EN | + ICE_AQC_PHY_FEC_25G_KR_REQ)) + return ICE_FEC_BASER; + + if (fec_options & (ICE_AQC_PHY_FEC_25G_RS_528_REQ | + ICE_AQC_PHY_FEC_25G_RS_544_REQ | + ICE_AQC_PHY_FEC_25G_RS_CLAUSE91_EN)) + return ICE_FEC_RS; + + return ICE_FEC_NONE; +} + +/** + * ice_aq_set_phy_cfg + * @hw: pointer to the HW struct + * @pi: port info structure of the interested logical port + * @cfg: structure with PHY configuration data to be set + * @cd: pointer to command details structure or NULL + * + * Set the various PHY configuration parameters supported on the Port. + * One or more of the Set PHY config parameters may be ignored in an MFP + * mode as the PF may not have the privilege to set some of the PHY Config + * parameters. This status will be indicated by the command response (0x0601). + */ +enum ice_status +ice_aq_set_phy_cfg(struct ice_hw *hw, struct ice_port_info *pi, + struct ice_aqc_set_phy_cfg_data *cfg, struct ice_sq_cd *cd) +{ + struct ice_aq_desc desc; + enum ice_status status; + + if (!cfg) + return ICE_ERR_PARAM; + + /* Ensure that only valid bits of cfg->caps can be turned on. */ + if (cfg->caps & ~ICE_AQ_PHY_ENA_VALID_MASK) { + DNPRINTF(ICE_DBG_PHY, "%s: Invalid bit is set in " + "ice_aqc_set_phy_cfg_data->caps : 0x%x\n", + __func__, cfg->caps); + + cfg->caps &= ICE_AQ_PHY_ENA_VALID_MASK; + } + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_set_phy_cfg); + desc.params.set_phy.lport_num = pi->lport; + desc.flags |= htole16(ICE_AQ_FLAG_RD); + + DNPRINTF(ICE_DBG_LINK, "set phy cfg\n"); + DNPRINTF(ICE_DBG_LINK, " phy_type_low = 0x%llx\n", + (unsigned long long)le64toh(cfg->phy_type_low)); + DNPRINTF(ICE_DBG_LINK, " phy_type_high = 0x%llx\n", + (unsigned long long)le64toh(cfg->phy_type_high)); + DNPRINTF(ICE_DBG_LINK, " caps = 0x%x\n", cfg->caps); + DNPRINTF(ICE_DBG_LINK, " low_power_ctrl_an = 0x%x\n", + cfg->low_power_ctrl_an); + DNPRINTF(ICE_DBG_LINK, " eee_cap = 0x%x\n", cfg->eee_cap); + DNPRINTF(ICE_DBG_LINK, " eeer_value = 0x%x\n", cfg->eeer_value); + DNPRINTF(ICE_DBG_LINK, " link_fec_opt = 0x%x\n", + cfg->link_fec_opt); + + status = ice_aq_send_cmd(hw, &desc, cfg, sizeof(*cfg), cd); + + if (hw->adminq.sq_last_status == ICE_AQ_RC_EMODE) + status = ICE_SUCCESS; + + if (!status) + pi->phy.curr_user_phy_cfg = *cfg; + + return status; +} + +/** + * ice_apply_saved_phy_cfg -- Re-apply user PHY config settings + * @sc: device private structure + * @settings: which settings to apply + * + * Applies user settings for advertised speeds, FEC mode, and flow + * control mode to a PHY config struct; it uses the data from pcaps + * to check if the saved settings are invalid and uses the pcaps + * data instead if they are invalid. + * + * For things like sysctls where only one setting needs to be + * updated, the bitmap allows the caller to specify which setting + * to update. + */ +int +ice_apply_saved_phy_cfg(struct ice_softc *sc, uint8_t settings) +{ + struct ice_aqc_set_phy_cfg_data cfg = { 0 }; + struct ice_port_info *pi = sc->hw.port_info; + struct ice_aqc_get_phy_caps_data pcaps = { 0 }; + struct ice_hw *hw = &sc->hw; + uint64_t phy_low, phy_high; + enum ice_status status; + enum ice_fec_mode dflt_fec_mode; + uint16_t dflt_user_speed; + + if (!settings || settings > ICE_APPLY_LS_FEC_FC) { + DNPRINTF(ICE_DBG_LINK, "%s: Settings out-of-bounds: %u\n", + __func__, settings); + return EINVAL; + } + + status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_ACTIVE_CFG, + &pcaps, NULL); + if (status != ICE_SUCCESS) { + printf("%s: ice_aq_get_phy_caps (ACTIVE) failed; " + "status %s, aq_err %s\n", + sc->sc_dev.dv_xname, ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + return (EIO); + } + + phy_low = le64toh(pcaps.phy_type_low); + phy_high = le64toh(pcaps.phy_type_high); + + /* Save off initial config parameters */ + dflt_user_speed = ice_aq_phy_types_to_link_speeds(phy_low, phy_high); + dflt_fec_mode = ice_caps_to_fec_mode(pcaps.caps, + pcaps.link_fec_options); + + /* Setup new PHY config */ + ice_copy_phy_caps_to_cfg(pi, &pcaps, &cfg); + + /* On error, restore active configuration values */ + if ((settings & ICE_APPLY_LS) && + ice_apply_saved_phy_req_to_cfg(sc, &cfg)) { + pi->phy.curr_user_speed_req = dflt_user_speed; + cfg.phy_type_low = pcaps.phy_type_low; + cfg.phy_type_high = pcaps.phy_type_high; + } + if ((settings & ICE_APPLY_FEC) && + ice_apply_saved_fec_req_to_cfg(sc, &cfg)) { + pi->phy.curr_user_fec_req = dflt_fec_mode; + } + if (settings & ICE_APPLY_FC) { + /* No real error indicators for this process, + * so we'll just have to assume it works. */ + ice_apply_saved_fc_req_to_cfg(pi, &cfg); + } + + /* Enable link and re-negotiate it */ + cfg.caps |= ICE_AQ_PHY_ENA_AUTO_LINK_UPDT | ICE_AQ_PHY_ENA_LINK; + + status = ice_aq_set_phy_cfg(hw, pi, &cfg, NULL); + if (status != ICE_SUCCESS) { + /* Don't indicate failure if there's no media in the port. + * The settings have been saved and will apply when media + * is inserted. + */ + if ((status == ICE_ERR_AQ_ERROR) && + (hw->adminq.sq_last_status == ICE_AQ_RC_EBUSY)) { + DPRINTF("%s: Setting will be applied when media is " + "inserted\n", __func__); + return (0); + } else { + printf("%s: ice_aq_set_phy_cfg failed; status %s, " + "aq_err %s\n", sc->sc_dev.dv_xname, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + return (EIO); + } + } + + return (0); +} + +/** + * ice_aq_set_link_restart_an + * @pi: pointer to the port information structure + * @ena_link: if true: enable link, if false: disable link + * @cd: pointer to command details structure or NULL + * + * Sets up the link and restarts the Auto-Negotiation over the link. + */ +enum ice_status +ice_aq_set_link_restart_an(struct ice_port_info *pi, bool ena_link, + struct ice_sq_cd *cd) +{ + enum ice_status status = ICE_ERR_AQ_ERROR; + struct ice_aqc_restart_an *cmd; + struct ice_aq_desc desc; + + cmd = &desc.params.restart_an; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_restart_an); + + cmd->cmd_flags = ICE_AQC_RESTART_AN_LINK_RESTART; + cmd->lport_num = pi->lport; + if (ena_link) + cmd->cmd_flags |= ICE_AQC_RESTART_AN_LINK_ENABLE; + else + cmd->cmd_flags &= ~ICE_AQC_RESTART_AN_LINK_ENABLE; + + status = ice_aq_send_cmd(pi->hw, &desc, NULL, 0, cd); + if (status) + return status; + + if (ena_link) + pi->phy.curr_user_phy_cfg.caps |= ICE_AQC_PHY_EN_LINK; + else + pi->phy.curr_user_phy_cfg.caps &= ~ICE_AQC_PHY_EN_LINK; + + return ICE_SUCCESS; +} + +/** + * ice_set_link -- Set up/down link on phy + * @sc: device private structure + * @enabled: link status to set up + * + * This should be called when change of link status is needed. + */ +void +ice_set_link(struct ice_softc *sc, bool enabled) +{ + struct ice_hw *hw = &sc->hw; + enum ice_status status; + + if (ice_driver_is_detaching(sc)) + return; + + if (ice_test_state(&sc->state, ICE_STATE_NO_MEDIA)) + return; + + if (enabled) + ice_apply_saved_phy_cfg(sc, ICE_APPLY_LS_FEC_FC); + else { + status = ice_aq_set_link_restart_an(hw->port_info, false, NULL); + if (status != ICE_SUCCESS) { + if (hw->adminq.sq_last_status == ICE_AQ_RC_EMODE) + printf("%s: Link control not enabled in " + "current device mode\n", + sc->sc_dev.dv_xname); + else + printf("%s: could not restart link: status %s, " + "aq_err %s\n", sc->sc_dev.dv_xname, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + } else + sc->link_up = false; + } +} + +int +ice_up(struct ice_softc *sc) +{ + struct ifnet *ifp = &sc->sc_ac.ac_if; + struct ice_vsi *vsi = &sc->pf_vsi; + struct ice_rx_queue *rxq; + struct ice_tx_queue *txq; + struct ifqueue *ifq; + struct ifiqueue *ifiq; + struct ice_intr_vector *iv; + int i, err; + + rw_enter_write(&sc->sc_cfg_lock); + if (sc->sc_dead) { + rw_exit_write(&sc->sc_cfg_lock); + return (ENXIO); + } + + ice_update_laa_mac(sc); + + /* Initialize software Tx tracking values */ + ice_init_tx_tracking(&sc->pf_vsi); + + for (i = 0, rxq = vsi->rx_queues; i < vsi->num_rx_queues; i++, rxq++) { + ice_rxfill(sc, rxq); + + /* wire everything together */ + iv = &sc->sc_vectors[i]; + iv->iv_rxq = rxq; + rxq->irqv = iv; + + ifiq = ifp->if_iqs[i]; + ifiq->ifiq_softc = rxq; + rxq->rxq_ifiq = ifiq; + } + + for (i = 0, txq = vsi->tx_queues; i < vsi->num_tx_queues; i++, txq++) { + /* wire everything together */ + iv = &sc->sc_vectors[i]; + iv->iv_txq = txq; + txq->irqv = iv; + + ifq = ifp->if_ifqs[i]; + ifq->ifq_softc = txq; + txq->txq_ifq = ifq; + } + + err = ice_cfg_vsi_for_tx(&sc->pf_vsi); + if (err) { + printf("%s: Unable to configure the main VSI for Tx: err %d\n", + sc->sc_dev.dv_xname, err); + rw_exit_write(&sc->sc_cfg_lock); + return err; + } + + err = ice_cfg_vsi_for_rx(&sc->pf_vsi); + if (err) { + printf("%s: Unable to configure the main VSI for Rx: err %d\n", + sc->sc_dev.dv_xname, err); + goto err_cleanup_tx; + } + + err = ice_control_all_rx_queues(&sc->pf_vsi, true); + if (err) { + printf("%s: Could not enable Rx rings: err %d\n", + sc->sc_dev.dv_xname, err); + goto err_cleanup_tx; + } + + err = ice_cfg_pf_default_mac_filters(sc); + if (err) { + printf("%s: Unable to configure default MAC filters: %d\n", + sc->sc_dev.dv_xname, err); + goto err_stop_rx; + } + + ice_configure_all_rxq_interrupts(&sc->pf_vsi); + ice_configure_rx_itr(&sc->pf_vsi); + + /* Configure promiscuous mode */ + ice_if_promisc_set(sc); + + if (!ice_testandclear_state(&sc->state, ICE_STATE_FIRST_INIT_LINK) && + (!sc->link_up && ((ifp->if_flags & IFF_UP) || + ice_test_state(&sc->state, ICE_STATE_LINK_ACTIVE_ON_DOWN)))) + ice_set_link(sc, true); + + /* Enable Rx queue interrupts */ + for (i = 0; i < vsi->num_rx_queues; i++) { + int v = vsi->rx_queues[i].irqv->iv_qid + 1; + ice_enable_intr(&sc->hw, v); + } + + timeout_add_nsec(&sc->sc_admin_timer, SEC_TO_NSEC(1)); + + ifp->if_flags |= IFF_RUNNING; + + ice_set_state(&sc->state, ICE_STATE_DRIVER_INITIALIZED); + rw_exit_write(&sc->sc_cfg_lock); + return 0; + +err_stop_rx: + ice_control_all_rx_queues(&sc->pf_vsi, false); +err_cleanup_tx: + ice_vsi_disable_tx(&sc->pf_vsi); + rw_exit_write(&sc->sc_cfg_lock); + return err; +} + +/** + * ice_find_ucast_rule_entry - Search for a unicast MAC filter rule entry + * @list_head: head of rule list + * @f_info: rule information + * + * Helper function to search for a unicast rule entry - this is to be used + * to remove unicast MAC filter that is not shared with other VSIs on the + * PF switch. + * + * Returns pointer to entry storing the rule if found + */ +struct ice_fltr_mgmt_list_entry * +ice_find_ucast_rule_entry(struct ice_fltr_mgmt_list_head *list_head, + struct ice_fltr_info *f_info) +{ + struct ice_fltr_mgmt_list_entry *list_itr; + + TAILQ_FOREACH(list_itr, list_head, list_entry) { + if (!memcmp(&f_info->l_data, &list_itr->fltr_info.l_data, + sizeof(f_info->l_data)) && + f_info->fwd_id.hw_vsi_id == + list_itr->fltr_info.fwd_id.hw_vsi_id && + f_info->flag == list_itr->fltr_info.flag) + return list_itr; + } + return NULL; +} + +/** + * ice_remove_mac_rule - remove a MAC based filter rule + * @hw: pointer to the hardware structure + * @m_list: list of MAC addresses and forwarding information + * @recp_list: list from which function remove MAC address + * + * This function removes either a MAC filter rule or a specific VSI from a + * VSI list for a multicast MAC address. + * + * Returns ICE_ERR_DOES_NOT_EXIST if a given entry was not added by + * ice_add_mac. Caller should be aware that this call will only work if all + * the entries passed into m_list were added previously. It will not attempt to + * do a partial remove of entries that were found. + */ +enum ice_status +ice_remove_mac_rule(struct ice_hw *hw, struct ice_fltr_list_head *m_list, + struct ice_sw_recipe *recp_list) +{ + struct ice_fltr_list_entry *list_itr, *tmp; + struct ice_lock *rule_lock; /* Lock to protect filter rule list */ + + if (!m_list) + return ICE_ERR_PARAM; + + rule_lock = &recp_list->filt_rule_lock; + TAILQ_FOREACH_SAFE(list_itr, m_list, list_entry, tmp) { + enum ice_sw_lkup_type l_type = list_itr->fltr_info.lkup_type; + uint8_t *add = &list_itr->fltr_info.l_data.mac.mac_addr[0]; + uint16_t vsi_handle; + + if (l_type != ICE_SW_LKUP_MAC) + return ICE_ERR_PARAM; + + vsi_handle = list_itr->fltr_info.vsi_handle; + if (!ice_is_vsi_valid(hw, vsi_handle)) + return ICE_ERR_PARAM; + + list_itr->fltr_info.fwd_id.hw_vsi_id = + hw->vsi_ctx[vsi_handle]->vsi_num; + if (!ETHER_IS_MULTICAST(add) && !hw->umac_shared) { + /* Don't remove the unicast address that belongs to + * another VSI on the switch, since it is not being + * shared... + */ +#if 0 + ice_acquire_lock(rule_lock); +#endif + if (!ice_find_ucast_rule_entry(&recp_list->filt_rules, + &list_itr->fltr_info)) { +#if 0 + ice_release_lock(rule_lock); +#endif + return ICE_ERR_DOES_NOT_EXIST; + } +#if 0 + ice_release_lock(rule_lock); +#endif + } + list_itr->status = ice_remove_rule_internal(hw, recp_list, + list_itr); + if (list_itr->status) + return list_itr->status; + } + return ICE_SUCCESS; +} + +/** + * ice_remove_mac - remove a MAC address based filter rule + * @hw: pointer to the hardware structure + * @m_list: list of MAC addresses and forwarding information + * + */ +enum ice_status +ice_remove_mac(struct ice_hw *hw, struct ice_fltr_list_head *m_list) +{ + struct ice_sw_recipe *recp_list; + + recp_list = &hw->switch_info->recp_list[ICE_SW_LKUP_MAC]; + return ice_remove_mac_rule(hw, m_list, recp_list); +} + +/** + * ice_remove_vsi_mac_filter - Remove a MAC address filter for a VSI + * @vsi: the VSI to add the filter for + * @addr: MAC address to remove a filter for + * + * Remove a MAC address filter from a given VSI. This is a wrapper around + * ice_remove_mac to simplify the interface. First, it only accepts a single + * address, so we don't have to mess around with the list setup in other + * functions. Second, it ignores the ICE_ERR_DOES_NOT_EXIST error, so that + * callers don't need to worry about attempting to remove filters which + * haven't yet been added. + */ +int +ice_remove_vsi_mac_filter(struct ice_vsi *vsi, uint8_t *addr) +{ + struct ice_softc *sc = vsi->sc; + struct ice_fltr_list_head mac_addr_list; + struct ice_hw *hw = &sc->hw; + enum ice_status status; + int err = 0; + + TAILQ_INIT(&mac_addr_list); + + err = ice_add_mac_to_list(vsi, &mac_addr_list, addr, ICE_FWD_TO_VSI); + if (err) + goto free_mac_list; + + status = ice_remove_mac(hw, &mac_addr_list); + if (status && status != ICE_ERR_DOES_NOT_EXIST) { + DPRINTF("%s: failed to remove a filter for MAC %s, " + "err %s aq_err %s\n", __func__, + ether_sprintf(addr), ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + err = EIO; + } + +free_mac_list: + ice_free_fltr_list(&mac_addr_list); + return err; +} + +/** + * ice_rm_pf_default_mac_filters - Remove default unicast and broadcast addrs + * @sc: device softc structure + * + * Remove the default unicast and broadcast filters from the PF VSI. + */ +int +ice_rm_pf_default_mac_filters(struct ice_softc *sc) +{ + struct ice_vsi *vsi = &sc->pf_vsi; + struct ice_hw *hw = &sc->hw; + int err; + + /* Remove the LAN MAC address */ + err = ice_remove_vsi_mac_filter(vsi, hw->port_info->mac.lan_addr); + if (err) + return err; + + /* Remove the broadcast address */ + err = ice_remove_vsi_mac_filter(vsi, etherbroadcastaddr); + if (err) + return (EIO); + + return (0); +} + +/** + * ice_flush_rxq_interrupts - Unconfigure Hw Rx queues MSI-X interrupt cause + * @vsi: the VSI to configure + * + * Unset the CAUSE_ENA flag of the TQCTL register for each queue, then trigger + * a software interrupt on that cause. This is required as part of the Rx + * queue disable logic to dissociate the Rx queue from the interrupt. + * + * This function must be called prior to disabling Rx queues with + * ice_control_all_rx_queues, otherwise the Rx queue may not be disabled + * properly. + */ +void +ice_flush_rxq_interrupts(struct ice_vsi *vsi) +{ + struct ice_softc *sc = vsi->sc; + struct ice_hw *hw = &sc->hw; + int i; + + for (i = 0; i < vsi->num_rx_queues; i++) { + struct ice_rx_queue *rxq = &vsi->rx_queues[i]; + uint32_t reg, val; + int v = rxq->irqv->iv_qid + 1; + int tries = 0; + + /* Clear the CAUSE_ENA flag */ + reg = vsi->rx_qmap[rxq->me]; + val = ICE_READ(hw, QINT_RQCTL(reg)); + val &= ~QINT_RQCTL_CAUSE_ENA_M; + ICE_WRITE(hw, QINT_RQCTL(reg), val); + + ice_flush(hw); + + /* Trigger a software interrupt to complete interrupt + * dissociation. + */ + sc->sw_intr[v] = -1; + ICE_WRITE(hw, GLINT_DYN_CTL(v), + GLINT_DYN_CTL_SWINT_TRIG_M | GLINT_DYN_CTL_INTENA_MSK_M); + do { + int ret; + + /* Sleep to allow interrupt processing to occur. */ + ret = tsleep_nsec(&sc->sw_intr[v], 0, "iceswi", + USEC_TO_NSEC(1)); + if (ret == 0 && sc->sw_intr[v] == 1) { + sc->sw_intr[v] = 0; + break; + } + tries++; + } while (tries < 10); + if (tries == 10) + DPRINTF("%s: missed software interrupt\n", __func__); + } +} + +/** + * ice_flush_txq_interrupts - Unconfigure Hw Tx queues MSI-X interrupt cause + * @vsi: the VSI to configure + * + * Unset the CAUSE_ENA flag of the TQCTL register for each queue, then trigger + * a software interrupt on that cause. This is required as part of the Tx + * queue disable logic to dissociate the Tx queue from the interrupt. + * + * This function must be called prior to ice_vsi_disable_tx, otherwise + * the Tx queue disable may not complete properly. + */ +void +ice_flush_txq_interrupts(struct ice_vsi *vsi) +{ + struct ice_softc *sc = vsi->sc; + struct ice_hw *hw = &sc->hw; + int i; + + for (i = 0; i < vsi->num_tx_queues; i++) { + struct ice_tx_queue *txq = &vsi->tx_queues[i]; + uint32_t reg, val; + int v = txq->irqv->iv_qid + 1; + int tries = 0; + + /* Clear the CAUSE_ENA flag */ + reg = vsi->tx_qmap[txq->me]; + val = ICE_READ(hw, QINT_TQCTL(reg)); + val &= ~QINT_TQCTL_CAUSE_ENA_M; + ICE_WRITE(hw, QINT_TQCTL(reg), val); + + ice_flush(hw); + + /* Trigger a software interrupt to complete interrupt + * dissociation. + */ + sc->sw_intr[v] = -1; + ICE_WRITE(hw, GLINT_DYN_CTL(v), + GLINT_DYN_CTL_SWINT_TRIG_M | GLINT_DYN_CTL_INTENA_MSK_M); + do { + int ret; + + /* Sleep to allow interrupt processing to occur. */ + ret = tsleep_nsec(&sc->sw_intr[v], 0, "iceswi", + USEC_TO_NSEC(1)); + if (ret == 0 && sc->sw_intr[v] == 1) { + sc->sw_intr[v] = 0; + break; + } + tries++; + } while (tries < 10); + if (tries == 10) + DPRINTF("%s: missed software interrupt\n", __func__); + } +} + +int +ice_down(struct ice_softc *sc) +{ + struct ifnet *ifp = &sc->sc_ac.ac_if; + struct ice_hw *hw = &sc->hw; + int i; + + rw_enter_write(&sc->sc_cfg_lock); + + timeout_del(&sc->sc_admin_timer); + ifp->if_flags &= ~IFF_RUNNING; +#if 0 + ASSERT_CTX_LOCKED(sc); +#endif + if (!ice_testandclear_state(&sc->state, ICE_STATE_DRIVER_INITIALIZED)) { + rw_exit_write(&sc->sc_cfg_lock); + return 0; + } + + if (ice_test_state(&sc->state, ICE_STATE_RESET_FAILED)) { + printf("%s: request to stop interface cannot be completed " + "as the device failed to reset\n", sc->sc_dev.dv_xname); + rw_exit_write(&sc->sc_cfg_lock); + return ENODEV; + } + + if (ice_test_state(&sc->state, ICE_STATE_PREPARED_FOR_RESET)) { + DPRINTF("%s: request to stop interface while device is " + "prepared for impending reset\n", __func__); + rw_exit_write(&sc->sc_cfg_lock); + return EBUSY; + } + + NET_UNLOCK(); + + /* + * Disable all possible interrupts except ITR 0 because this handles + * the AdminQ interrupts, and we want to keep processing these even + * when the interface is down. + */ + for (i = 1; i < hw->func_caps.common_cap.num_msix_vectors; i++) + ice_disable_intr(hw, i); +#if 0 + ice_rdma_pf_stop(sc); +#endif + /* Remove the MAC filters, stop Tx, and stop Rx. We don't check the + * return of these functions because there's nothing we can really do + * if they fail, and the functions already print error messages. + * Just try to shut down as much as we can. + */ + ice_rm_pf_default_mac_filters(sc); + + /* Dissociate the Tx and Rx queues from the interrupts */ + ice_flush_txq_interrupts(&sc->pf_vsi); + ice_flush_rxq_interrupts(&sc->pf_vsi); + + /* Disable the Tx and Rx queues */ + ice_vsi_disable_tx(&sc->pf_vsi); + ice_control_all_rx_queues(&sc->pf_vsi, false); + + if (!ice_test_state(&sc->state, ICE_STATE_LINK_ACTIVE_ON_DOWN) && + !(ifp->if_flags & IFF_UP) && sc->link_up) + ice_set_link(sc, false); +#if 0 + if (sc->mirr_if && ice_test_state(&mif->state, ICE_STATE_SUBIF_NEEDS_REINIT)) { + ice_subif_if_stop(sc->mirr_if->subctx); + device_printf(sc->dev, "The subinterface also comes down and up after reset\n"); + } +#endif + + rw_exit_write(&sc->sc_cfg_lock); + NET_LOCK(); + return 0; +} + +int +ice_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) +{ + struct ice_softc *sc = ifp->if_softc; + struct ifreq *ifr = (struct ifreq *)data; + int s, error = 0; + + s = splnet(); + + switch (cmd) { + case SIOCSIFADDR: + ifp->if_flags |= IFF_UP; + /* FALLTHROUGH */ + + case SIOCSIFFLAGS: + if (ISSET(ifp->if_flags, IFF_UP)) { + if (ISSET(ifp->if_flags, IFF_RUNNING)) + error = ENETRESET; + else + error = ice_up(sc); + } else { + if (ISSET(ifp->if_flags, IFF_RUNNING)) + error = ice_down(sc); + } + break; + case SIOCSIFMEDIA: + case SIOCGIFMEDIA: + error = ifmedia_ioctl(ifp, ifr, &sc->media, cmd); + break; + default: + error = ether_ioctl(ifp, &sc->sc_ac, cmd, data); + break; + } + + if (error == ENETRESET) { + error = 0; + if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == + (IFF_UP | IFF_RUNNING)) { + ice_down(sc); + error = ice_up(sc); + } + } + + splx(s); + return error; +} + +uint64_t +ice_tx_setup_offload(struct mbuf *m0, struct ice_tx_queue *txq, + unsigned int prod) +{ + struct ether_extracted ext; + uint64_t offload = 0, hlen; + +#if NVLAN > 0 + if (ISSET(m0->m_flags, M_VLANTAG)) { + uint64_t vtag = m0->m_pkthdr.ether_vtag; + offload |= (ICE_TX_DESC_CMD_IL2TAG1 << ICE_TXD_QW1_CMD_S) | + (vtag << ICE_TXD_QW1_L2TAG1_S); + } +#endif + if (!ISSET(m0->m_pkthdr.csum_flags, + M_IPV4_CSUM_OUT|M_TCP_CSUM_OUT|M_UDP_CSUM_OUT|M_TCP_TSO)) + return offload; + + ether_extract_headers(m0, &ext); + hlen = ext.iphlen; + + if (ext.ip4) { + /* TODO: ipv4 checksum offload */ + offload |= ICE_TX_DESC_CMD_IIPT_IPV4 << ICE_TXD_QW1_CMD_S; + } else if (ext.ip6) + offload |= ICE_TX_DESC_CMD_IIPT_IPV6 << ICE_TXD_QW1_CMD_S; + + offload |= ((ETHER_HDR_LEN >> 1) << ICE_TX_DESC_LEN_MACLEN_S) << + ICE_TXD_QW1_OFFSET_S; + if (ext.ip4 || ext.ip6) + offload |= ((hlen >> 2) << ICE_TX_DESC_LEN_IPLEN_S) << + ICE_TXD_QW1_OFFSET_S; + + /* TODO: enable offloading features */ + + return offload; +} + +static inline int +ice_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, struct mbuf *m) +{ + int error; + + error = bus_dmamap_load_mbuf(dmat, map, m, + BUS_DMA_STREAMING | BUS_DMA_NOWAIT); + if (error != EFBIG) + return (error); + + error = m_defrag(m, M_DONTWAIT); + if (error != 0) + return (error); + + return (bus_dmamap_load_mbuf(dmat, map, m, + BUS_DMA_STREAMING | BUS_DMA_NOWAIT)); +} + +void +ice_start(struct ifqueue *ifq) +{ + struct ifnet *ifp = ifq->ifq_if; + struct ice_softc *sc = ifp->if_softc; + struct ice_tx_queue *txq = ifq->ifq_softc; + struct ice_tx_desc *ring, *txd; + struct ice_tx_map *txm; + bus_dmamap_t map; + struct mbuf *m; + uint64_t qword1; + unsigned int prod, free, last, i; + unsigned int mask; + int post = 0; + uint64_t offload; + uint64_t paddr; + uint64_t seglen; +#if NBPFILTER > 0 + caddr_t if_bpf; +#endif + + if (!LINK_STATE_IS_UP(ifp->if_link_state)) { + ifq_purge(ifq); + return; + } + + prod = txq->txq_prod; + free = txq->txq_cons; + if (free <= prod) + free += txq->desc_count; + free -= prod; + + bus_dmamap_sync(sc->sc_dmat, ICE_DMA_MAP(&txq->tx_desc_mem), + 0, ICE_DMA_LEN(&txq->tx_desc_mem), BUS_DMASYNC_POSTWRITE); + + ring = ICE_DMA_KVA(&txq->tx_desc_mem); + mask = txq->desc_count - 1; + + for (;;) { + /* We need one extra descriptor for TSO packets. */ + if (free <= (ICE_MIN_DESC_COUNT + 1)) { + ifq_set_oactive(ifq); + break; + } + + m = ifq_dequeue(ifq); + if (m == NULL) + break; + + offload = ice_tx_setup_offload(m, txq, prod); + + txm = &txq->tx_map[prod]; + map = txm->txm_map; +#if 0 + if (ISSET(m->m_pkthdr.csum_flags, M_TCP_TSO)) { + prod++; + prod &= mask; + free--; + } +#endif + if (ice_load_mbuf(sc->sc_dmat, map, m) != 0) { + ifq->ifq_errors++; + m_freem(m); + continue; + } + + bus_dmamap_sync(sc->sc_dmat, map, 0, + map->dm_mapsize, BUS_DMASYNC_PREWRITE); + + for (i = 0; i < map->dm_nsegs; i++) { + txd = &ring[prod]; + + paddr = (uint64_t)map->dm_segs[i].ds_addr; + seglen = (uint64_t)map->dm_segs[i].ds_len; + + qword1 = ICE_TX_DESC_DTYPE_DATA | offload | + (seglen << ICE_TXD_QW1_TX_BUF_SZ_S); + + htolem64(&txd->buf_addr, paddr); + htolem64(&txd->cmd_type_offset_bsz, qword1); + + last = prod; + + prod++; + prod &= mask; + } + + /* Set the last descriptor for report */ + qword1 |= (ICE_TX_DESC_CMD_EOP | ICE_TX_DESC_CMD_RS) << + ICE_TXD_QW1_CMD_S; + htolem64(&txd->cmd_type_offset_bsz, qword1); + + txm->txm_m = m; + txm->txm_eop = last; + +#if NBPFILTER > 0 + if_bpf = ifp->if_bpf; + if (if_bpf) + bpf_mtap_ether(if_bpf, m, BPF_DIRECTION_OUT); +#endif + + free -= i; + post = 1; + } + + bus_dmamap_sync(sc->sc_dmat, ICE_DMA_MAP(&txq->tx_desc_mem), + 0, ICE_DMA_LEN(&txq->tx_desc_mem), BUS_DMASYNC_PREWRITE); + + if (post) { + txq->txq_prod = prod; + ICE_WRITE(&sc->hw, txq->tail, prod); + } +} + +void +ice_watchdog(struct ifnet * ifp) +{ + printf("%s\n", __func__); +} + +int +ice_media_change(struct ifnet *ifp) +{ + printf("%s\n", __func__); + return ENXIO; +} + +/** + * ice_get_phy_type_low - Get media associated with phy_type_low + * @phy_type_low: the low 64bits of phy_type from the AdminQ + * + * Given the lower 64bits of the phy_type from the hardware, return the + * ifm_active bit associated. Return IFM_INST_ANY when phy_type_low is unknown. + * Note that only one of ice_get_phy_type_low or ice_get_phy_type_high should + * be called. If phy_type_low is zero, call ice_phy_type_high. + */ +uint64_t +ice_get_phy_type_low(struct ice_softc *sc, uint64_t phy_type_low) +{ + switch (phy_type_low) { + case ICE_PHY_TYPE_LOW_100BASE_TX: + return IFM_100_TX; +#if 0 + case ICE_PHY_TYPE_LOW_100M_SGMII: + return IFM_100_SGMII; +#endif + case ICE_PHY_TYPE_LOW_1000BASE_T: + return IFM_1000_T; + case ICE_PHY_TYPE_LOW_1000BASE_SX: + return IFM_1000_SX; + case ICE_PHY_TYPE_LOW_1000BASE_LX: + return IFM_1000_LX; + case ICE_PHY_TYPE_LOW_1000BASE_KX: + return IFM_1000_KX; +#if 0 + case ICE_PHY_TYPE_LOW_1G_SGMII: + return IFM_1000_SGMII; +#endif + case ICE_PHY_TYPE_LOW_2500BASE_T: + return IFM_2500_T; +#if 0 + case ICE_PHY_TYPE_LOW_2500BASE_X: + return IFM_2500_X; +#endif + case ICE_PHY_TYPE_LOW_2500BASE_KX: + return IFM_2500_KX; + case ICE_PHY_TYPE_LOW_5GBASE_T: + return IFM_5000_T; +#if 0 + case ICE_PHY_TYPE_LOW_5GBASE_KR: + return IFM_5000_KR; +#endif + case ICE_PHY_TYPE_LOW_10GBASE_T: + return IFM_10G_T; + case ICE_PHY_TYPE_LOW_10G_SFI_DA: + return IFM_10G_SFP_CU; + case ICE_PHY_TYPE_LOW_10GBASE_SR: + return IFM_10G_SR; + case ICE_PHY_TYPE_LOW_10GBASE_LR: + return IFM_10G_LR; + case ICE_PHY_TYPE_LOW_10GBASE_KR_CR1: + return IFM_10G_KR; + case ICE_PHY_TYPE_LOW_10G_SFI_AOC_ACC: + return IFM_10G_AOC; + case ICE_PHY_TYPE_LOW_10G_SFI_C2C: + return IFM_10G_SFI; +#if 0 + case ICE_PHY_TYPE_LOW_25GBASE_T: + return IFM_25G_T; +#endif + case ICE_PHY_TYPE_LOW_25GBASE_CR: + return IFM_25G_CR; +#if 0 + case ICE_PHY_TYPE_LOW_25GBASE_CR_S: + return IFM_25G_CR_S; + case ICE_PHY_TYPE_LOW_25GBASE_CR1: + return IFM_25G_CR1; +#endif + case ICE_PHY_TYPE_LOW_25GBASE_SR: + return IFM_25G_SR; + case ICE_PHY_TYPE_LOW_25GBASE_LR: + return IFM_25G_LR; + case ICE_PHY_TYPE_LOW_25GBASE_KR: + return IFM_25G_KR; +#if 0 + case ICE_PHY_TYPE_LOW_25GBASE_KR_S: + return IFM_25G_KR_S; + case ICE_PHY_TYPE_LOW_25GBASE_KR1: + return IFM_25G_KR1; +#endif + case ICE_PHY_TYPE_LOW_25G_AUI_AOC_ACC: + return IFM_25G_AOC; +#if 0 + case ICE_PHY_TYPE_LOW_25G_AUI_C2C: + return IFM_25G_AUI; +#endif + case ICE_PHY_TYPE_LOW_40GBASE_CR4: + return IFM_40G_CR4; + case ICE_PHY_TYPE_LOW_40GBASE_SR4: + return IFM_40G_SR4; + case ICE_PHY_TYPE_LOW_40GBASE_LR4: + return IFM_40G_LR4; + case ICE_PHY_TYPE_LOW_40GBASE_KR4: + return IFM_40G_KR4; +#if 0 + case ICE_PHY_TYPE_LOW_40G_XLAUI_AOC_ACC: + return IFM_40G_XLAUI_AC; + case ICE_PHY_TYPE_LOW_40G_XLAUI: + return IFM_40G_XLAUI; +#endif + case ICE_PHY_TYPE_LOW_50GBASE_CR2: + return IFM_50G_CR2; +#if 0 + case ICE_PHY_TYPE_LOW_50GBASE_SR2: + return IFM_50G_SR2; + case ICE_PHY_TYPE_LOW_50GBASE_LR2: + return IFM_50G_LR2; +#endif + case ICE_PHY_TYPE_LOW_50GBASE_KR2: + return IFM_50G_KR2; +#if 0 + case ICE_PHY_TYPE_LOW_50G_LAUI2_AOC_ACC: + return IFM_50G_LAUI2_AC; + case ICE_PHY_TYPE_LOW_50G_LAUI2: + return IFM_50G_LAUI2; + case ICE_PHY_TYPE_LOW_50G_AUI2_AOC_ACC: + return IFM_50G_AUI2_AC; + case ICE_PHY_TYPE_LOW_50G_AUI2: + return IFM_50G_AUI2; + case ICE_PHY_TYPE_LOW_50GBASE_CP: + return IFM_50G_CP; + case ICE_PHY_TYPE_LOW_50GBASE_SR: + return IFM_50G_SR; + case ICE_PHY_TYPE_LOW_50GBASE_FR: + return IFM_50G_FR; + case ICE_PHY_TYPE_LOW_50GBASE_LR: + return IFM_50G_LR; + case ICE_PHY_TYPE_LOW_50GBASE_KR_PAM4: + return IFM_50G_KR_PAM4; + case ICE_PHY_TYPE_LOW_50G_AUI1_AOC_ACC: + return IFM_50G_AUI1_AC; + case ICE_PHY_TYPE_LOW_50G_AUI1: + return IFM_50G_AUI1; +#endif + case ICE_PHY_TYPE_LOW_100GBASE_CR4: + return IFM_100G_CR4; + case ICE_PHY_TYPE_LOW_100GBASE_SR4: + return IFM_100G_SR4; + case ICE_PHY_TYPE_LOW_100GBASE_LR4: + return IFM_100G_LR4; + case ICE_PHY_TYPE_LOW_100GBASE_KR4: + return IFM_100G_KR4; +#if 0 + case ICE_PHY_TYPE_LOW_100G_CAUI4_AOC_ACC: + return IFM_100G_CAUI4_AC; + case ICE_PHY_TYPE_LOW_100G_CAUI4: + return IFM_100G_CAUI4; + case ICE_PHY_TYPE_LOW_100G_AUI4_AOC_ACC: + return IFM_100G_AUI4_AC; + case ICE_PHY_TYPE_LOW_100G_AUI4: + return IFM_100G_AUI4; + case ICE_PHY_TYPE_LOW_100GBASE_CR_PAM4: + return IFM_100G_CR_PAM4; + case ICE_PHY_TYPE_LOW_100GBASE_KR_PAM4: + return IFM_100G_KR_PAM4; + case ICE_PHY_TYPE_LOW_100GBASE_CP2: + return IFM_100G_CP2; + case ICE_PHY_TYPE_LOW_100GBASE_SR2: + return IFM_100G_SR2; + case ICE_PHY_TYPE_LOW_100GBASE_DR: + return IFM_100G_DR; +#endif + default: + printf("%s: unhandled low PHY type 0x%llx\n", + sc->sc_dev.dv_xname, phy_type_low); + return IFM_INST_ANY; + } +} + +/** + * ice_get_phy_type_high - Get media associated with phy_type_high + * @phy_type_high: the upper 64bits of phy_type from the AdminQ + * + * Given the upper 64bits of the phy_type from the hardware, return the + * ifm_active bit associated. Return IFM_INST_ANY on an unknown value. Note + * that only one of ice_get_phy_type_low or ice_get_phy_type_high should be + * called. If phy_type_high is zero, call ice_get_phy_type_low. + */ +uint64_t +ice_get_phy_type_high(struct ice_softc *sc, uint64_t phy_type_high) +{ + switch (phy_type_high) { +#if 0 + case ICE_PHY_TYPE_HIGH_100GBASE_KR2_PAM4: + return IFM_100G_KR2_PAM4; + case ICE_PHY_TYPE_HIGH_100G_CAUI2_AOC_ACC: + return IFM_100G_CAUI2_AC; + case ICE_PHY_TYPE_HIGH_100G_CAUI2: + return IFM_100G_CAUI2; + case ICE_PHY_TYPE_HIGH_100G_AUI2_AOC_ACC: + return IFM_100G_AUI2_AC; + case ICE_PHY_TYPE_HIGH_100G_AUI2: + return IFM_100G_AUI2; +#endif + default: + printf("%s: unhandled high PHY type 0x%llx\n", + sc->sc_dev.dv_xname, phy_type_high); + return IFM_INST_ANY; + } +} + +void +ice_media_status(struct ifnet *ifp, struct ifmediareq *ifmr) +{ + struct ice_softc *sc = ifp->if_softc; + struct ice_link_status *li = &sc->hw.port_info->phy.link_info; + uint64_t media; + + ifmr->ifm_status = IFM_AVALID; + ifmr->ifm_active = IFM_ETHER; + + /* Never report link up or media types when in recovery mode */ + if (ice_test_state(&sc->state, ICE_STATE_RECOVERY_MODE)) + return; + + if (!sc->link_up) + return; + + ifmr->ifm_status |= IFM_ACTIVE; + ifmr->ifm_active |= IFM_FDX; + + if (li->phy_type_low) { + media = ice_get_phy_type_low(sc, li->phy_type_low); + if (media != IFM_INST_ANY) + ifmr->ifm_active |= media; + } else if (li->phy_type_high) { + media = ice_get_phy_type_high(sc, li->phy_type_high); + if (media != IFM_INST_ANY) + ifmr->ifm_active |= media; + } + + /* Report flow control status as well */ + if (li->an_info & ICE_AQ_LINK_PAUSE_TX) + ifmr->ifm_active |= IFM_ETH_TXPAUSE; + if (li->an_info & ICE_AQ_LINK_PAUSE_RX) + ifmr->ifm_active |= IFM_ETH_RXPAUSE; +} + +/** + * ice_add_media_types - Add supported media types to the media structure + * @sc: ice private softc structure + * @media: ifmedia structure to setup + * + * Looks up the supported phy types, and initializes the various media types + * available. + * + * @pre this function must be protected from being called while another thread + * is accessing the ifmedia types. + */ +enum ice_status +ice_add_media_types(struct ice_softc *sc, struct ifmedia *media) +{ + struct ice_aqc_get_phy_caps_data pcaps = { 0 }; + struct ice_port_info *pi = sc->hw.port_info; + enum ice_status status; + uint64_t phy_low, phy_high; + int bit; +#if 0 + ASSERT_CFG_LOCKED(sc); +#endif + /* the maximum possible media type index is 511. We probably don't + * need most of this space, but this ensures future compatibility when + * additional media types are used. + */ + ice_declare_bitmap(already_added, 511); + + /* Remove all previous media types */ + ifmedia_delete_instance(media, IFM_INST_ANY); + + status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_ACTIVE_CFG, + &pcaps, NULL); + if (status != ICE_SUCCESS) { + printf("%s: ice_aq_get_phy_caps (ACTIVE) failed; status %s, aq_err %s\n", + sc->sc_dev.dv_xname, ice_status_str(status), + ice_aq_str(sc->hw.adminq.sq_last_status)); + return (status); + } + + /* make sure the added bitmap is zero'd */ + memset(already_added, 0, sizeof(already_added)); + + phy_low = le64toh(pcaps.phy_type_low); + for (bit = 0; bit < 64; bit++) { + uint64_t type = BIT_ULL(bit); + uint64_t ostype; + + if ((phy_low & type) == 0) + continue; + + /* get the OS media type */ + ostype = ice_get_phy_type_low(sc, type); + + /* don't bother adding the unknown type */ + if (ostype == IFM_INST_ANY) + continue; + + /* only add each media type to the list once */ + if (ice_is_bit_set(already_added, ostype)) + continue; + + ifmedia_add(media, IFM_ETHER | ostype, 0, NULL); + ice_set_bit(ostype, already_added); + } + + phy_high = le64toh(pcaps.phy_type_high); + for (bit = 0; bit < 64; bit++) { + uint64_t type = BIT_ULL(bit); + uint64_t ostype; + + if ((phy_high & type) == 0) + continue; + + /* get the OS media type */ + ostype = ice_get_phy_type_high(sc, type); + + /* don't bother adding the unknown type */ + if (ostype == IFM_INST_ANY) + continue; + + /* only add each media type to the list once */ + if (ice_is_bit_set(already_added, ostype)) + continue; + + ifmedia_add(media, IFM_ETHER | ostype, 0, NULL); + ice_set_bit(ostype, already_added); + } + + /* Use autoselect media by default */ + ifmedia_add(media, IFM_ETHER | IFM_AUTO, 0, NULL); + ifmedia_set(media, IFM_ETHER | IFM_AUTO); + + return (ICE_SUCCESS); +} + +/** + * ice_is_fw_health_report_supported + * @hw: pointer to the hardware structure + * + * Return true if firmware supports health status reports, + * false otherwise + */ +bool +ice_is_fw_health_report_supported(struct ice_hw *hw) +{ + if (hw->api_maj_ver > ICE_FW_API_HEALTH_REPORT_MAJ) + return true; + + if (hw->api_maj_ver == ICE_FW_API_HEALTH_REPORT_MAJ) { + if (hw->api_min_ver > ICE_FW_API_HEALTH_REPORT_MIN) + return true; + if (hw->api_min_ver == ICE_FW_API_HEALTH_REPORT_MIN && + hw->api_patch >= ICE_FW_API_HEALTH_REPORT_PATCH) + return true; + } + + return false; +} + +/** + * ice_init_device_features - Init device driver features + * @sc: driver softc structure + * + * @pre assumes that the function capabilities bits have been set up by + * ice_init_hw(). + */ +void +ice_init_device_features(struct ice_softc *sc) +{ + struct ice_hw *hw = &sc->hw; + + /* Set capabilities that all devices support */ + ice_set_bit(ICE_FEATURE_SRIOV, sc->feat_cap); + ice_set_bit(ICE_FEATURE_RSS, sc->feat_cap); + ice_set_bit(ICE_FEATURE_RDMA, sc->feat_cap); + ice_set_bit(ICE_FEATURE_LENIENT_LINK_MODE, sc->feat_cap); + ice_set_bit(ICE_FEATURE_LINK_MGMT_VER_1, sc->feat_cap); + ice_set_bit(ICE_FEATURE_LINK_MGMT_VER_2, sc->feat_cap); + ice_set_bit(ICE_FEATURE_HEALTH_STATUS, sc->feat_cap); + ice_set_bit(ICE_FEATURE_FW_LOGGING, sc->feat_cap); + ice_set_bit(ICE_FEATURE_HAS_PBA, sc->feat_cap); + ice_set_bit(ICE_FEATURE_DCB, sc->feat_cap); + ice_set_bit(ICE_FEATURE_TX_BALANCE, sc->feat_cap); + + /* Disable features due to hardware limitations... */ + if (!hw->func_caps.common_cap.rss_table_size) + ice_clear_bit(ICE_FEATURE_RSS, sc->feat_cap); + if (!hw->func_caps.common_cap.iwarp /* || !ice_enable_irdma */) + ice_clear_bit(ICE_FEATURE_RDMA, sc->feat_cap); + if (!hw->func_caps.common_cap.dcb) + ice_clear_bit(ICE_FEATURE_DCB, sc->feat_cap); + /* Disable features due to firmware limitations... */ + if (!ice_is_fw_health_report_supported(hw)) + ice_clear_bit(ICE_FEATURE_HEALTH_STATUS, sc->feat_cap); + if (!ice_fwlog_supported(hw)) + ice_clear_bit(ICE_FEATURE_FW_LOGGING, sc->feat_cap); + if (hw->fwlog_cfg.options & ICE_FWLOG_OPTION_IS_REGISTERED) { + if (ice_is_bit_set(sc->feat_cap, ICE_FEATURE_FW_LOGGING)) + ice_set_bit(ICE_FEATURE_FW_LOGGING, sc->feat_en); + else + ice_fwlog_unregister(hw); + } +#if 0 + /* Disable capabilities not supported by the OS */ + ice_disable_unsupported_features(sc->feat_cap); + + /* RSS is always enabled for iflib */ + if (ice_is_bit_set(sc->feat_cap, ICE_FEATURE_RSS)) + ice_set_bit(ICE_FEATURE_RSS, sc->feat_en); + + /* Disable features based on sysctl settings */ + if (!ice_tx_balance_en) + ice_clear_bit(ICE_FEATURE_TX_BALANCE, sc->feat_cap); +#endif + + if (hw->dev_caps.supported_sensors & ICE_SENSOR_SUPPORT_E810_INT_TEMP) { + ice_set_bit(ICE_FEATURE_TEMP_SENSOR, sc->feat_cap); + ice_set_bit(ICE_FEATURE_TEMP_SENSOR, sc->feat_en); + } +} + +/** + * ice_aq_send_driver_ver + * @hw: pointer to the HW struct + * @dv: driver's major, minor version + * @cd: pointer to command details structure or NULL + * + * Send the driver version (0x0002) to the firmware + */ +enum ice_status +ice_aq_send_driver_ver(struct ice_hw *hw, struct ice_driver_ver *dv, + struct ice_sq_cd *cd) +{ + struct ice_aqc_driver_ver *cmd; + struct ice_aq_desc desc; + uint16_t len; + + cmd = &desc.params.driver_ver; + + if (!dv) + return ICE_ERR_PARAM; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_driver_ver); + + desc.flags |= htole16(ICE_AQ_FLAG_RD); + cmd->major_ver = dv->major_ver; + cmd->minor_ver = dv->minor_ver; + cmd->build_ver = dv->build_ver; + cmd->subbuild_ver = dv->subbuild_ver; + + len = strlen(dv->driver_string); + + return ice_aq_send_cmd(hw, &desc, dv->driver_string, len, cd); +} + +/** + * ice_send_version - Send driver version to firmware + * @sc: the device private softc + * + * Send the driver version to the firmware. This must be called as early as + * possible after ice_init_hw(). + */ +int +ice_send_version(struct ice_softc *sc) +{ + struct ice_driver_ver driver_version = {0}; + struct ice_hw *hw = &sc->hw; + enum ice_status status; + + driver_version.major_ver = ice_major_version; + driver_version.minor_ver = ice_minor_version; + driver_version.build_ver = ice_patch_version; + driver_version.subbuild_ver = ice_rc_version; + + strlcpy((char *)driver_version.driver_string, ice_driver_version, + sizeof(driver_version.driver_string)); + + status = ice_aq_send_driver_ver(hw, &driver_version, NULL); + if (status) { + printf("%s: Unable to send driver version to firmware, " + "err %s aq_err %s\n", sc->sc_dev.dv_xname, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + return (EIO); + } + + return (0); +} + +void +ice_reinit_hw(struct ice_softc *sc) +{ + struct ice_hw *hw = &sc->hw; + + ice_deinit_hw(hw); + + printf("%s: not implemented\n", __func__); +} + +/** + * ice_cfg_tx_topo - Initialize new tx topology if available + * @hw: pointer to the HW struct + * @buf: pointer to Tx topology buffer + * @len: buffer size + * + * The function will apply the new Tx topology from the package buffer + * if available. + */ +enum ice_status +ice_cfg_tx_topo(struct ice_hw *hw, uint8_t *buf, uint32_t len) +{ +#if 0 + u8 *current_topo, *new_topo = NULL; + struct ice_run_time_cfg_seg *seg; + struct ice_buf_hdr *section; + struct ice_pkg_hdr *pkg_hdr; + enum ice_ddp_state state; + u16 i, size = 0, offset; + enum ice_status status; + u32 reg = 0; + u8 flags; + + if (!buf || !len) + return ICE_ERR_PARAM; + + /* Does FW support new Tx topology mode ? */ + if (!hw->func_caps.common_cap.tx_sched_topo_comp_mode_en) { + ice_debug(hw, ICE_DBG_INIT, "FW doesn't support compatibility mode\n"); + return ICE_ERR_NOT_SUPPORTED; + } + + current_topo = (u8 *)ice_malloc(hw, ICE_AQ_MAX_BUF_LEN); + if (!current_topo) + return ICE_ERR_NO_MEMORY; + + /* get the current Tx topology */ + status = ice_get_set_tx_topo(hw, current_topo, ICE_AQ_MAX_BUF_LEN, NULL, + &flags, false); + ice_free(hw, current_topo); + + if (status) { + ice_debug(hw, ICE_DBG_INIT, "Get current topology is failed\n"); + return status; + } + + /* Is default topology already applied ? */ + if (!(flags & ICE_AQC_TX_TOPO_FLAGS_LOAD_NEW) && + hw->num_tx_sched_layers == 9) { + ice_debug(hw, ICE_DBG_INIT, "Loaded default topology\n"); + /* Already default topology is loaded */ + return ICE_ERR_ALREADY_EXISTS; + } + + /* Is new topology already applied ? */ + if ((flags & ICE_AQC_TX_TOPO_FLAGS_LOAD_NEW) && + hw->num_tx_sched_layers == 5) { + ice_debug(hw, ICE_DBG_INIT, "Loaded new topology\n"); + /* Already new topology is loaded */ + return ICE_ERR_ALREADY_EXISTS; + } + + /* Is set topology issued already ? */ + if (flags & ICE_AQC_TX_TOPO_FLAGS_ISSUED) { + ice_debug(hw, ICE_DBG_INIT, "Update tx topology was done by another PF\n"); + /* add a small delay before exiting */ + for (i = 0; i < 20; i++) + ice_msec_delay(100, true); + return ICE_ERR_ALREADY_EXISTS; + } + + /* Change the topology from new to default (5 to 9) */ + if (!(flags & ICE_AQC_TX_TOPO_FLAGS_LOAD_NEW) && + hw->num_tx_sched_layers == 5) { + ice_debug(hw, ICE_DBG_INIT, "Change topology from 5 to 9 layers\n"); + goto update_topo; + } + + pkg_hdr = (struct ice_pkg_hdr *)buf; + state = ice_verify_pkg(pkg_hdr, len); + if (state) { + ice_debug(hw, ICE_DBG_INIT, "failed to verify pkg (err: %d)\n", + state); + return ICE_ERR_CFG; + } + + /* find run time configuration segment */ + seg = (struct ice_run_time_cfg_seg *) + ice_find_seg_in_pkg(hw, SEGMENT_TYPE_ICE_RUN_TIME_CFG, pkg_hdr); + if (!seg) { + ice_debug(hw, ICE_DBG_INIT, "5 layer topology segment is missing\n"); + return ICE_ERR_CFG; + } + + if (LE32_TO_CPU(seg->buf_table.buf_count) < ICE_MIN_S_COUNT) { + ice_debug(hw, ICE_DBG_INIT, "5 layer topology segment count(%d) is wrong\n", + seg->buf_table.buf_count); + return ICE_ERR_CFG; + } + + section = ice_pkg_val_buf(seg->buf_table.buf_array); + + if (!section || LE32_TO_CPU(section->section_entry[0].type) != + ICE_SID_TX_5_LAYER_TOPO) { + ice_debug(hw, ICE_DBG_INIT, "5 layer topology section type is wrong\n"); + return ICE_ERR_CFG; + } + + size = LE16_TO_CPU(section->section_entry[0].size); + offset = LE16_TO_CPU(section->section_entry[0].offset); + if (size < ICE_MIN_S_SZ || size > ICE_MAX_S_SZ) { + ice_debug(hw, ICE_DBG_INIT, "5 layer topology section size is wrong\n"); + return ICE_ERR_CFG; + } + + /* make sure the section fits in the buffer */ + if (offset + size > ICE_PKG_BUF_SIZE) { + ice_debug(hw, ICE_DBG_INIT, "5 layer topology buffer > 4K\n"); + return ICE_ERR_CFG; + } + + /* Get the new topology buffer */ + new_topo = ((u8 *)section) + offset; + +update_topo: + /* acquire global lock to make sure that set topology issued + * by one PF + */ + status = ice_acquire_res(hw, ICE_GLOBAL_CFG_LOCK_RES_ID, ICE_RES_WRITE, + ICE_GLOBAL_CFG_LOCK_TIMEOUT); + if (status) { + ice_debug(hw, ICE_DBG_INIT, "Failed to acquire global lock\n"); + return status; + } + + /* check reset was triggered already or not */ + reg = rd32(hw, GLGEN_RSTAT); + if (reg & GLGEN_RSTAT_DEVSTATE_M) { + /* Reset is in progress, re-init the hw again */ + ice_debug(hw, ICE_DBG_INIT, "Reset is in progress. layer topology might be applied already\n"); + ice_check_reset(hw); + return ICE_SUCCESS; + } + + /* set new topology */ + status = ice_get_set_tx_topo(hw, new_topo, size, NULL, NULL, true); + if (status) { + ice_debug(hw, ICE_DBG_INIT, "Set tx topology is failed\n"); + return status; + } + + /* new topology is updated, delay 1 second before issuing the CORRER */ + for (i = 0; i < 10; i++) + ice_msec_delay(100, true); + ice_reset(hw, ICE_RESET_CORER); + /* CORER will clear the global lock, so no explicit call + * required for release + */ + return ICE_SUCCESS; +#else + return ICE_ERR_NOT_IMPL; +#endif +} + +/** + * pkg_ver_empty - Check if a package version is empty + * @pkg_ver: the package version to check + * @pkg_name: the package name to check + * + * Checks if the package version structure is empty. We consider a package + * version as empty if none of the versions are non-zero and the name string + * is null as well. + * + * This is used to check if the package version was initialized by the driver, + * as we do not expect an actual DDP package file to have a zero'd version and + * name. + * + * @returns true if the package version is valid, or false otherwise. + */ +bool +pkg_ver_empty(struct ice_pkg_ver *pkg_ver, uint8_t *pkg_name) +{ + return (pkg_name[0] == '\0' && + pkg_ver->major == 0 && + pkg_ver->minor == 0 && + pkg_ver->update == 0 && + pkg_ver->draft == 0); +} + +/** + * ice_active_pkg_version_str - Format active package version info into a buffer + * @hw: device hw structure + * @buf: string buffer to store name/version string + * + * Formats the name and version of the active DDP package info into a string + * buffer for use. + */ +void +ice_active_pkg_version_str(struct ice_hw *hw, char *buf, size_t bufsize) +{ + char name_buf[ICE_PKG_NAME_SIZE]; + + /* If the active DDP package info is empty, use "None" */ + if (pkg_ver_empty(&hw->active_pkg_ver, hw->active_pkg_name)) { + snprintf(buf, bufsize, "None"); + return; + } + + /* + * This should already be null-terminated, but since this is a raw + * value from an external source, strlcpy() into a new buffer to + * make sure. + */ + strlcpy(name_buf, (char *)hw->active_pkg_name, bufsize); + + snprintf(buf, bufsize, "%s version %u.%u.%u.%u, track id 0x%08x", + name_buf, + hw->active_pkg_ver.major, + hw->active_pkg_ver.minor, + hw->active_pkg_ver.update, + hw->active_pkg_ver.draft, + hw->active_track_id); +} + +/** + * ice_os_pkg_version_str - Format OS package version info into a buffer + * @hw: device hw structure + * @buf: string buffer to store name/version string + * + * Formats the name and version of the OS DDP package as found in the ice_ddp + * module into a string. + * + * @remark This will almost always be the same as the active package, but + * could be different in some cases. Use ice_active_pkg_version_str to get the + * version of the active DDP package. + */ +void +ice_os_pkg_version_str(struct ice_hw *hw, char *buf, size_t bufsize) +{ + char name_buf[ICE_PKG_NAME_SIZE]; + + /* If the OS DDP package info is empty, use "None" */ + if (pkg_ver_empty(&hw->pkg_ver, hw->pkg_name)) { + snprintf(buf, bufsize, "None"); + return; + } + + /* + * This should already be null-terminated, but since this is a raw + * value from an external source, strlcpy() into a new buffer to + * make sure. + */ + strlcpy(name_buf, (char *)hw->pkg_name, bufsize); + + snprintf(buf, bufsize, "%s version %u.%u.%u.%u", + name_buf, + hw->pkg_ver.major, + hw->pkg_ver.minor, + hw->pkg_ver.update, + hw->pkg_ver.draft); +} + +/** + * ice_is_init_pkg_successful - check if DDP init was successful + * @state: state of the DDP pkg after download + */ +bool +ice_is_init_pkg_successful(enum ice_ddp_state state) +{ + switch (state) { + case ICE_DDP_PKG_SUCCESS: + case ICE_DDP_PKG_SAME_VERSION_ALREADY_LOADED: + case ICE_DDP_PKG_COMPATIBLE_ALREADY_LOADED: + return true; + default: + return false; + } +} + +/** + * ice_pkg_ver_compatible - Check if the package version is compatible + * @pkg_ver: the package version to check + * + * Compares the package version number to the driver's expected major/minor + * version. Returns an integer indicating whether the version is older, newer, + * or compatible with the driver. + * + * @returns 0 if the package version is compatible, -1 if the package version + * is older, and 1 if the package version is newer than the driver version. + */ +int +ice_pkg_ver_compatible(struct ice_pkg_ver *pkg_ver) +{ + if (pkg_ver->major > ICE_PKG_SUPP_VER_MAJ) + return (1); /* newer */ + else if ((pkg_ver->major == ICE_PKG_SUPP_VER_MAJ) && + (pkg_ver->minor > ICE_PKG_SUPP_VER_MNR)) + return (1); /* newer */ + else if ((pkg_ver->major == ICE_PKG_SUPP_VER_MAJ) && + (pkg_ver->minor == ICE_PKG_SUPP_VER_MNR)) + return (0); /* compatible */ + else + return (-1); /* older */ +} + +/** + * ice_log_pkg_init - Log a message about status of DDP initialization + * @sc: the device softc pointer + * @pkg_status: the status result of ice_copy_and_init_pkg + * + * Called by ice_load_pkg after an attempt to download the DDP package + * contents to the device to log an appropriate message for the system + * administrator about download status. + * + * @post ice_is_init_pkg_successful function is used to determine + * whether the download was successful and DDP package is compatible + * with this driver. Otherwise driver will transition to Safe Mode. + */ +void +ice_log_pkg_init(struct ice_softc *sc, enum ice_ddp_state pkg_status) +{ + struct ice_hw *hw = &sc->hw; + char active_pkg[ICE_PKG_NAME_SIZE]; + char os_pkg[ICE_PKG_NAME_SIZE]; + + ice_active_pkg_version_str(hw, active_pkg, sizeof(active_pkg)); + ice_os_pkg_version_str(hw, os_pkg, sizeof(os_pkg)); + + switch (pkg_status) { + case ICE_DDP_PKG_SUCCESS: + DPRINTF("%s: The DDP package was successfully loaded: %s.\n", + __func__, active_pkg); + break; + case ICE_DDP_PKG_SAME_VERSION_ALREADY_LOADED: + case ICE_DDP_PKG_ALREADY_LOADED: + DPRINTF("%s: DDP package already present on device: %s.\n", + __func__, active_pkg); + break; + case ICE_DDP_PKG_COMPATIBLE_ALREADY_LOADED: + DPRINTF("%s: The driver could not load the DDP package file " + "because a compatible DDP package is already present on " + "the device. The device has package %s. The ice-ddp " + "file has package: %s.\n", __func__, active_pkg, os_pkg); + break; + case ICE_DDP_PKG_FILE_VERSION_TOO_HIGH: + printf("%s: The device has a DDP package that is higher than " + "the driver supports. The device has package %s. The " + "driver requires version %d.%d.x.x. Entering Safe Mode.\n", + sc->sc_dev.dv_xname, active_pkg, ICE_PKG_SUPP_VER_MAJ, + ICE_PKG_SUPP_VER_MNR); + break; + case ICE_DDP_PKG_FILE_VERSION_TOO_LOW: + printf("%s: The device has a DDP package that is lower than " + "the driver supports. The device has package %s. The " + "driver requires version %d.%d.x.x. Entering Safe Mode.\n", + sc->sc_dev.dv_xname, active_pkg, ICE_PKG_SUPP_VER_MAJ, + ICE_PKG_SUPP_VER_MNR); + break; + case ICE_DDP_PKG_ALREADY_LOADED_NOT_SUPPORTED: + /* + * This assumes that the active_pkg_ver will not be + * initialized if the ice_ddp package version is not + * supported. + */ + if (pkg_ver_empty(&hw->active_pkg_ver, hw->active_pkg_name)) { + /* The ice_ddp version is not supported */ + if (ice_pkg_ver_compatible(&hw->pkg_ver) > 0) { + DPRINTF("%s: The DDP package in the ice-ddp file " + "is higher than the driver supports. The " + "ice-ddp file has package %s. The driver " + "requires version %d.%d.x.x. Please use " + "an updated driver. Entering Safe Mode.\n", + __func__, os_pkg, ICE_PKG_SUPP_VER_MAJ, + ICE_PKG_SUPP_VER_MNR); + } else if (ice_pkg_ver_compatible(&hw->pkg_ver) < 0) { + DPRINTF("%s: The DDP package in the " + "ice-ddp file is lower than the driver " + "supports. The ice_ddp module has package " + "%s. The driver requires version " + "%d.%d.x.x. Please use an updated " + "ice-ddp file. Entering Safe Mode.\n", + __func__, os_pkg, ICE_PKG_SUPP_VER_MAJ, + ICE_PKG_SUPP_VER_MNR); + } else { + printf("%s: An unknown error occurred when " + "loading the DDP package. The ice-ddp " + "file has package %s. The device has " + "package %s. The driver requires version " + "%d.%d.x.x. Entering Safe Mode.\n", + sc->sc_dev.dv_xname, os_pkg, active_pkg, + ICE_PKG_SUPP_VER_MAJ, ICE_PKG_SUPP_VER_MNR); + } + } else { + if (ice_pkg_ver_compatible(&hw->active_pkg_ver) > 0) { + DPRINTF("%s: The device has a DDP package " + "that is higher than the driver supports. " + "The device has package %s. The driver " + "requires version %d.%d.x.x. Entering " + "Safe Mode.\n", __func__, active_pkg, + ICE_PKG_SUPP_VER_MAJ, ICE_PKG_SUPP_VER_MNR); + } else if (ice_pkg_ver_compatible(&hw->active_pkg_ver) + < 0) { + DPRINTF("%s: The device has a DDP package that " + "is lower than the driver supports. The " + "device has package %s. The driver " + "requires version %d.%d.x.x. " + "Entering Safe Mode.\n", __func__, + active_pkg, ICE_PKG_SUPP_VER_MAJ, + ICE_PKG_SUPP_VER_MNR); + } else { + printf("%s: An unknown error occurred when " + "loading the DDP package. The ice-ddp " + "file has package %s. The device has " + "package %s. The driver requires " + "version %d.%d.x.x. Entering Safe Mode.\n", + sc->sc_dev.dv_xname, os_pkg, active_pkg, + ICE_PKG_SUPP_VER_MAJ, ICE_PKG_SUPP_VER_MNR); + } + } + break; + case ICE_DDP_PKG_INVALID_FILE: + printf("%s: The DDP package in the ice-ddp file is invalid. " + "Entering Safe Mode\n", sc->sc_dev.dv_xname); + break; + case ICE_DDP_PKG_FW_MISMATCH: + printf("%s: The firmware loaded on the device is not " + "compatible with the DDP package. " + "Please update the device's NVM. Entering safe mode.\n", + sc->sc_dev.dv_xname); + break; + case ICE_DDP_PKG_NO_SEC_MANIFEST: + case ICE_DDP_PKG_FILE_SIGNATURE_INVALID: + printf("%s: The DDP package in the ice-ddp file cannot be " + "loaded because its signature is not valid. Please " + "use a valid ice-ddp file. Entering Safe Mode.\n", + sc->sc_dev.dv_xname); + break; + case ICE_DDP_PKG_SECURE_VERSION_NBR_TOO_LOW: + printf("%s: The DDP package in the ice-ddp file could not " + "be loaded because its security revision is too low. " + "Please use an updated ice-ddp file. " + "Entering Safe Mode.\n", sc->sc_dev.dv_xname); + break; + case ICE_DDP_PKG_MANIFEST_INVALID: + case ICE_DDP_PKG_BUFFER_INVALID: + printf("%s: An error occurred on the device while loading " + "the DDP package. Entering Safe Mode.\n", + sc->sc_dev.dv_xname); + break; + default: + printf("%s: An unknown error occurred when loading the " + "DDP package. Entering Safe Mode.\n", + sc->sc_dev.dv_xname); + break; + } +} + +/** + * ice_copy_and_init_pkg - initialize/download a copy of the package + * @hw: pointer to the hardware structure + * @buf: pointer to the package buffer + * @len: size of the package buffer + * + * This function copies the package buffer, and then calls ice_init_pkg() to + * initialize the copied package contents. + * + * The copying is necessary if the package buffer supplied is constant, or if + * the memory may disappear shortly after calling this function. + * + * If the package buffer resides in the data segment and can be modified, the + * caller is free to use ice_init_pkg() instead of ice_copy_and_init_pkg(). + * + * However, if the package buffer needs to be copied first, such as when being + * read from a file, the caller should use ice_copy_and_init_pkg(). + * + * This function will first copy the package buffer, before calling + * ice_init_pkg(). The caller is free to immediately destroy the original + * package buffer, as the new copy will be managed by this function and + * related routines. + */ +enum ice_ddp_state +ice_copy_and_init_pkg(struct ice_hw *hw, const uint8_t *buf, uint32_t len) +{ +#if 0 + enum ice_ddp_state state; + u8 *buf_copy; + + if (!buf || !len) + return ICE_DDP_PKG_ERR; + + buf_copy = (u8 *)ice_memdup(hw, buf, len, ICE_NONDMA_TO_NONDMA); + + state = ice_init_pkg(hw, buf_copy, len); + if (!ice_is_init_pkg_successful(state)) { + /* Free the copy, since we failed to initialize the package */ + ice_free(hw, buf_copy); + } else { + /* Track the copied pkg so we can free it later */ + hw->pkg_copy = buf_copy; + hw->pkg_size = len; + } + return state; +#else + return ICE_DDP_PKG_ERR; +#endif +} + +/** + * ice_load_pkg_file - Load the DDP package file using firmware_get + * @sc: device private softc + * + * Use firmware_get to load the DDP package memory and then request that + * firmware download the package contents and program the relevant hardware + * bits. + * + * This function makes a copy of the DDP package memory which is tracked in + * the ice_hw structure. The copy will be managed and released by + * ice_deinit_hw(). This allows the firmware reference to be immediately + * released using firmware_put. + */ +enum ice_status +ice_load_pkg_file(struct ice_softc *sc) +{ + struct ice_hw *hw = &sc->hw; + enum ice_ddp_state state; + uint8_t *pkg; + size_t pkg_size; + enum ice_status status = ICE_SUCCESS; + uint8_t cached_layer_count; + const char *fwname = "ice-ddp"; + int err; + + /* + * XXX At present this driver always runs in safe mode. + * Do not attempt to load firmware yet. + */ + status = ICE_ERR_NOT_IMPL; + goto err_load_pkg; + + err = loadfirmware(fwname, &pkg, &pkg_size); + if (err) { + printf("%s: could not read firmware %s (error %d); " + "entering safe mode\n", sc->sc_dev.dv_xname, fwname, err); + status = ICE_ERR_CFG; + goto err_load_pkg; + } + + /* Check for topology change */ + if (ice_is_bit_set(sc->feat_cap, ICE_FEATURE_TX_BALANCE)) { + cached_layer_count = hw->num_tx_sched_layers; + status = ice_cfg_tx_topo(&sc->hw, pkg, pkg_size); + /* Success indicates a change was made */ + if (status == ICE_SUCCESS) { + /* 9 -> 5 */ + if (cached_layer_count == 9) + DPRINTF("%s: Transmit balancing feature " + "enabled\n", __func__); + else + DPRINTF("%s: Transmit balancing feature " + "disabled\n", __func__); + ice_set_bit(ICE_FEATURE_TX_BALANCE, sc->feat_en); + free(pkg, M_DEVBUF, pkg_size); + return (status); + } else if (status == ICE_ERR_CFG) { + /* DDP does not support transmit balancing */ + DPRINTF("%s: DDP package does not support transmit balancing " + "feature - please update to the latest DDP package and " + "try again\n", __func__); + } + } + + /* Copy and download the pkg contents */ + state = ice_copy_and_init_pkg(hw, (const uint8_t *)pkg, pkg_size); + + /* Release the firmware reference */ + free(pkg, M_DEVBUF, pkg_size); + + /* Check the active DDP package version and log a message */ + ice_log_pkg_init(sc, state); + + /* Place the driver into safe mode */ + if (ice_is_init_pkg_successful(state)) + return (ICE_ERR_ALREADY_EXISTS); + +err_load_pkg: + ice_zero_bitmap(sc->feat_cap, ICE_FEATURE_COUNT); + ice_zero_bitmap(sc->feat_en, ICE_FEATURE_COUNT); + ice_set_bit(ICE_FEATURE_SAFE_MODE, sc->feat_cap); + ice_set_bit(ICE_FEATURE_SAFE_MODE, sc->feat_en); + + return (status); +} + +/** + * ice_aq_set_event_mask + * @hw: pointer to the HW struct + * @port_num: port number of the physical function + * @mask: event mask to be set + * @cd: pointer to command details structure or NULL + * + * Set event mask (0x0613) + */ +enum ice_status +ice_aq_set_event_mask(struct ice_hw *hw, uint8_t port_num, uint16_t mask, + struct ice_sq_cd *cd) +{ + struct ice_aqc_set_event_mask *cmd; + struct ice_aq_desc desc; + + cmd = &desc.params.set_event_mask; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_set_event_mask); + + cmd->lport_num = port_num; + + cmd->event_mask = htole16(mask); + return ice_aq_send_cmd(hw, &desc, NULL, 0, cd); +} + +/** + * ice_init_link_events - Initialize Link Status Events mask + * @sc: the device softc + * + * Initialize the Link Status Events mask to disable notification of link + * events we don't care about in software. Also request that link status + * events be enabled. + */ +int +ice_init_link_events(struct ice_softc *sc) +{ + struct ice_hw *hw = &sc->hw; + enum ice_status status; + uint16_t wanted_events; + + /* Set the bits for the events that we want to be notified by */ + wanted_events = (ICE_AQ_LINK_EVENT_UPDOWN | + ICE_AQ_LINK_EVENT_MEDIA_NA | + ICE_AQ_LINK_EVENT_MODULE_QUAL_FAIL); + + /* request that every event except the wanted events be masked */ + status = ice_aq_set_event_mask(hw, hw->port_info->lport, ~wanted_events, NULL); + if (status) { + printf("%s: Failed to set link status event mask, " + "err %s aq_err %s\n", sc->sc_dev.dv_xname, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + return (EIO); + } + + /* Request link info with the LSE bit set to enable link status events */ + status = ice_aq_get_link_info(hw->port_info, true, NULL, NULL); + if (status) { + printf("%s: Failed to enable link status events, " + "err %s aq_err %s\n", sc->sc_dev.dv_xname, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + return (EIO); + } + + return (0); +} + +/** + * ice_pkg_get_supported_vlan_mode - chk if DDP supports Double VLAN mode (DVM) + * @hw: pointer to the HW struct + * @dvm: output variable to determine if DDP supports DVM(true) or SVM(false) + */ +enum ice_status +ice_pkg_get_supported_vlan_mode(struct ice_hw *hw, bool *dvm) +{ +#if 0 + u16 meta_init_size = sizeof(struct ice_meta_init_section); + struct ice_meta_init_section *sect; + struct ice_buf_build *bld; + enum ice_status status; + + /* if anything fails, we assume there is no DVM support */ + *dvm = false; + + bld = ice_pkg_buf_alloc_single_section(hw, + ICE_SID_RXPARSER_METADATA_INIT, + meta_init_size, (void **)§); + if (!bld) + return ICE_ERR_NO_MEMORY; + + /* only need to read a single section */ + sect->count = CPU_TO_LE16(1); + sect->offset = CPU_TO_LE16(ICE_META_VLAN_MODE_ENTRY); + + status = ice_aq_upload_section(hw, + (struct ice_buf_hdr *)ice_pkg_buf(bld), + ICE_PKG_BUF_SIZE, NULL); + if (!status) { + ice_declare_bitmap(entry, ICE_META_INIT_BITS); + u32 arr[ICE_META_INIT_DW_CNT]; + u16 i; + + /* convert to host bitmap format */ + for (i = 0; i < ICE_META_INIT_DW_CNT; i++) + arr[i] = LE32_TO_CPU(sect->entry[0].bm[i]); + + ice_bitmap_from_array32(entry, arr, (u16)ICE_META_INIT_BITS); + + /* check if DVM is supported */ + *dvm = ice_is_bit_set(entry, ICE_META_VLAN_MODE_BIT); + } + + ice_pkg_buf_free(hw, bld); + + return status; +#else + return ICE_ERR_NOT_IMPL; +#endif +} + +/** + * ice_pkg_supports_dvm - find out if DDP supports DVM + * @hw: pointer to the HW structure + */ +bool +ice_pkg_supports_dvm(struct ice_hw *hw) +{ + enum ice_status status; + bool pkg_supports_dvm; + + status = ice_pkg_get_supported_vlan_mode(hw, &pkg_supports_dvm); + if (status) { + DNPRINTF(ICE_DBG_PKG, + "Failed to get supported VLAN mode, status %d\n", status); + return false; + } + + return pkg_supports_dvm; +} + +/** + * ice_aq_get_vlan_mode - get the VLAN mode of the device + * @hw: pointer to the HW structure + * @get_params: structure FW fills in based on the current VLAN mode config + * + * Get VLAN Mode Parameters (0x020D) + */ +enum ice_status +ice_aq_get_vlan_mode(struct ice_hw *hw, + struct ice_aqc_get_vlan_mode *get_params) +{ + struct ice_aq_desc desc; + + if (!get_params) + return ICE_ERR_PARAM; + + ice_fill_dflt_direct_cmd_desc(&desc, + ice_aqc_opc_get_vlan_mode_parameters); + + return ice_aq_send_cmd(hw, &desc, get_params, sizeof(*get_params), + NULL); +} + +/** + * ice_fw_supports_dvm - find out if FW supports DVM + * @hw: pointer to the HW structure + */ +bool +ice_fw_supports_dvm(struct ice_hw *hw) +{ + struct ice_aqc_get_vlan_mode get_vlan_mode = { 0 }; + enum ice_status status; + + /* If firmware returns success, then it supports DVM, else it only + * supports SVM + */ + status = ice_aq_get_vlan_mode(hw, &get_vlan_mode); + if (status) { + DNPRINTF(ICE_DBG_NVM, + "%s: Failed to get VLAN mode, status %d\n", + __func__, status); + return false; + } + + return true; +} + +/** + * ice_is_dvm_supported - check if Double VLAN Mode is supported + * @hw: pointer to the hardware structure + * + * Returns true if Double VLAN Mode (DVM) is supported and false if only Single + * VLAN Mode (SVM) is supported. In order for DVM to be supported the DDP and + * firmware must support it, otherwise only SVM is supported. This function + * should only be called while the global config lock is held and after the + * package has been successfully downloaded. + */ +bool +ice_is_dvm_supported(struct ice_hw *hw) +{ + if (!ice_pkg_supports_dvm(hw)) { + DNPRINTF(ICE_DBG_PKG, "DDP doesn't support DVM\n"); + return false; + } + + if (!ice_fw_supports_dvm(hw)) { + DNPRINTF(ICE_DBG_PKG, "FW doesn't support DVM\n"); + return false; + } + + return true; +} + +/** + * ice_aq_set_port_params - set physical port parameters + * @pi: pointer to the port info struct + * @bad_frame_vsi: defines the VSI to which bad frames are forwarded + * @save_bad_pac: if set packets with errors are forwarded to the bad frames VSI + * @pad_short_pac: if set transmit packets smaller than 60 bytes are padded + * @double_vlan: if set double VLAN is enabled + * @cd: pointer to command details structure or NULL + * + * Set Physical port parameters (0x0203) + */ +enum ice_status +ice_aq_set_port_params(struct ice_port_info *pi, uint16_t bad_frame_vsi, + bool save_bad_pac, bool pad_short_pac, bool double_vlan, + struct ice_sq_cd *cd) +{ + struct ice_aqc_set_port_params *cmd; + struct ice_hw *hw = pi->hw; + struct ice_aq_desc desc; + uint16_t cmd_flags = 0; + + cmd = &desc.params.set_port_params; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_set_port_params); + cmd->bad_frame_vsi = htole16(bad_frame_vsi); + if (save_bad_pac) + cmd_flags |= ICE_AQC_SET_P_PARAMS_SAVE_BAD_PACKETS; + if (pad_short_pac) + cmd_flags |= ICE_AQC_SET_P_PARAMS_PAD_SHORT_PACKETS; + if (double_vlan) + cmd_flags |= ICE_AQC_SET_P_PARAMS_DOUBLE_VLAN_ENA; + cmd->cmd_flags = htole16(cmd_flags); + + return ice_aq_send_cmd(hw, &desc, NULL, 0, cd); +} + +/** + * ice_aq_set_vlan_mode - set the VLAN mode of the device + * @hw: pointer to the HW structure + * @set_params: requested VLAN mode configuration + * + * Set VLAN Mode Parameters (0x020C) + */ +enum ice_status +ice_aq_set_vlan_mode(struct ice_hw *hw, + struct ice_aqc_set_vlan_mode *set_params) +{ + uint8_t rdma_packet, mng_vlan_prot_id; + struct ice_aq_desc desc; + + if (!set_params) + return ICE_ERR_PARAM; + + if (set_params->l2tag_prio_tagging > ICE_AQ_VLAN_PRIO_TAG_MAX) + return ICE_ERR_PARAM; + + rdma_packet = set_params->rdma_packet; + if (rdma_packet != ICE_AQ_SVM_VLAN_RDMA_PKT_FLAG_SETTING && + rdma_packet != ICE_AQ_DVM_VLAN_RDMA_PKT_FLAG_SETTING) + return ICE_ERR_PARAM; + + mng_vlan_prot_id = set_params->mng_vlan_prot_id; + if (mng_vlan_prot_id != ICE_AQ_VLAN_MNG_PROTOCOL_ID_OUTER && + mng_vlan_prot_id != ICE_AQ_VLAN_MNG_PROTOCOL_ID_INNER) + return ICE_ERR_PARAM; + + ice_fill_dflt_direct_cmd_desc(&desc, + ice_aqc_opc_set_vlan_mode_parameters); + desc.flags |= htole16(ICE_AQ_FLAG_RD); + + return ice_aq_send_cmd(hw, &desc, set_params, sizeof(*set_params), + NULL); +} + +/** + * ice_set_svm - set single VLAN mode + * @hw: pointer to the HW structure + */ +enum ice_status +ice_set_svm(struct ice_hw *hw) +{ + struct ice_aqc_set_vlan_mode *set_params; + enum ice_status status; + + status = ice_aq_set_port_params(hw->port_info, 0, + false, false, false, NULL); + if (status) { + DNPRINTF(ICE_DBG_INIT, + "Failed to set port parameters for single VLAN mode\n"); + return status; + } + + set_params = (struct ice_aqc_set_vlan_mode *) + ice_malloc(hw, sizeof(*set_params)); + if (!set_params) + return ICE_ERR_NO_MEMORY; + + /* default configuration for SVM configurations */ + set_params->l2tag_prio_tagging = ICE_AQ_VLAN_PRIO_TAG_INNER_CTAG; + set_params->rdma_packet = ICE_AQ_SVM_VLAN_RDMA_PKT_FLAG_SETTING; + set_params->mng_vlan_prot_id = ICE_AQ_VLAN_MNG_PROTOCOL_ID_INNER; + + status = ice_aq_set_vlan_mode(hw, set_params); + if (status) + DNPRINTF(ICE_DBG_INIT, + "Failed to configure port in single VLAN mode\n"); + + ice_free(hw, set_params); + return status; +} + +/** + * ice_set_vlan_mode + * @hw: pointer to the HW structure + */ +enum ice_status +ice_set_vlan_mode(struct ice_hw *hw) +{ + if (!ice_is_dvm_supported(hw)) + return ICE_SUCCESS; + + return ice_set_svm(hw); +} + +/** + * ice_nvm_version_str - Format the NVM version information into a sbuf + * @hw: device hw structure + * @buf: string buffer to store version string + * + * Formats the NVM information including firmware version, API version, NVM + * version, the EETRACK id, and OEM specific version information into a string + * buffer. + */ +const char * +ice_nvm_version_str(struct ice_hw *hw, char *buf, size_t bufsize) +{ + struct ice_nvm_info *nvm = &hw->flash.nvm; + struct ice_orom_info *orom = &hw->flash.orom; + struct ice_netlist_info *netlist = &hw->flash.netlist; + + /* Note that the netlist versions are stored in packed Binary Coded + * Decimal format. The use of '%x' will correctly display these as + * decimal numbers. This works because every 4 bits will be displayed + * as a hexadecimal digit, and the BCD format will only use the values + * 0-9. + */ + snprintf(buf, bufsize, + "fw %u.%u.%u api %u.%u nvm %x.%02x etid %08x netlist %x.%x.%x-%x.%x.%x.%04x oem %u.%u.%u", + hw->fw_maj_ver, hw->fw_min_ver, hw->fw_patch, + hw->api_maj_ver, hw->api_min_ver, + nvm->major, nvm->minor, nvm->eetrack, + netlist->major, netlist->minor, + netlist->type >> 16, netlist->type & 0xFFFF, + netlist->rev, netlist->cust_ver, netlist->hash, + orom->major, orom->build, orom->patch); + + return buf; +} + +/** + * ice_print_nvm_version - Print the NVM info to the kernel message log + * @sc: the device softc structure + * + * Format and print an NVM version string using ice_nvm_version_str(). + */ +void +ice_print_nvm_version(struct ice_softc *sc) +{ + struct ice_hw *hw = &sc->hw; + static char buf[512]; + + printf("%s: %s, address %s\n", sc->sc_dev.dv_xname, + ice_nvm_version_str(hw, buf, sizeof(buf)), + ether_sprintf(hw->port_info->mac.perm_addr)); +} + +/** + * ice_setup_scctx - Setup the softc context structure; in the FreeBSD + * driver this function sets up a context used by iflib. Instead, the + * OpenBSD driver uses it to initialize softc fields which depend on + * driver mode and hw capabilities. + */ +void +ice_setup_scctx(struct ice_softc *sc) +{ + struct ice_hw *hw = &sc->hw; + bool safe_mode, recovery_mode; + int i; + + safe_mode = ice_is_bit_set(sc->feat_en, ICE_FEATURE_SAFE_MODE); + recovery_mode = ice_test_state(&sc->state, ICE_STATE_RECOVERY_MODE); + + /* + * If the driver loads in Safe mode or Recovery mode, limit iflib to + * a single queue pair. + */ + if (safe_mode || recovery_mode) { + sc->isc_ntxqsets = sc->isc_nrxqsets = 1; + sc->isc_ntxqsets_max = 1; + sc->isc_nrxqsets_max = 1; + } else { + sc->isc_ntxqsets = hw->func_caps.common_cap.rss_table_size; + sc->isc_nrxqsets = hw->func_caps.common_cap.rss_table_size; + + sc->isc_ntxqsets_max = hw->func_caps.common_cap.num_txq; + sc->isc_nrxqsets_max = hw->func_caps.common_cap.num_rxq; + } + + sc->isc_txqsizes[0] = roundup(sc->isc_ntxd[0] + * sizeof(struct ice_tx_desc), DBA_ALIGN); + sc->isc_rxqsizes[0] = roundup(sc->isc_nrxd[0] + * sizeof(union ice_32b_rx_flex_desc), DBA_ALIGN); + + sc->isc_tx_nsegments = ICE_MAX_TX_SEGS; + sc->isc_tx_tso_segments_max = ICE_MAX_TSO_SEGS; + sc->isc_tx_tso_size_max = ICE_TSO_SIZE; + sc->isc_tx_tso_segsize_max = ICE_MAX_DMA_SEG_SIZE; +#if 0 + sc->isc_msix_bar = pci_msix_table_bar(dev); +#endif + sc->isc_rss_table_size = hw->func_caps.common_cap.rss_table_size; +#if 0 + /* + * If the driver loads in recovery mode, disable Tx/Rx functionality + */ + if (recovery_mode) + scctx->isc_txrx = &ice_recovery_txrx; + else + scctx->isc_txrx = &ice_txrx; +#endif + /* + * If the driver loads in Safe mode or Recovery mode, disable + * advanced features including hardware offloads. + */ + if (safe_mode || recovery_mode) { + sc->isc_capenable = ICE_SAFE_CAPS; + sc->isc_tx_csum_flags = 0; + } else { + sc->isc_capenable = ICE_FULL_CAPS; +#if 0 + sc->isc_tx_csum_flags = ICE_CSUM_OFFLOAD; +#endif + } + + sc->isc_capabilities = sc->isc_capenable; + + for (i = 0; i < nitems(sc->isc_ntxd); i++) + sc->isc_ntxd[i] = ICE_DEFAULT_DESC_COUNT; + for (i = 0; i < nitems(sc->isc_nrxd); i++) + sc->isc_nrxd[i] = ICE_DEFAULT_DESC_COUNT; + + +} /* ice_setup_scctx */ + +/** + * ice_resmgr_init - Initialize a resource manager structure + * @resmgr: structure to track the resource manager state + * @num_res: the maximum number of resources it can assign + * + * Initialize the state of a resource manager structure, allocating space to + * assign up to the requested number of resources. Uses bit strings to track + * which resources have been assigned. This type of resmgr is intended to be + * used for tracking LAN queue assignments between VSIs. + */ +int +ice_resmgr_init(struct ice_resmgr *resmgr, uint16_t num_res) +{ + resmgr->resources = ice_bit_alloc(num_res); + if (resmgr->resources == NULL) + return (ENOMEM); + + resmgr->num_res = num_res; + resmgr->contig_only = false; + return (0); +} + +/** + * ice_resmgr_init_contig_only - Initialize a resource manager structure + * @resmgr: structure to track the resource manager state + * @num_res: the maximum number of resources it can assign + * + * Functions similarly to ice_resmgr_init(), but the resulting resmgr structure + * will only allow contiguous allocations. This type of resmgr is intended to + * be used with tracking device MSI-X interrupt allocations. + */ +int +ice_resmgr_init_contig_only(struct ice_resmgr *resmgr, uint16_t num_res) +{ + int error; + + error = ice_resmgr_init(resmgr, num_res); + if (error) + return (error); + + resmgr->contig_only = true; + return (0); +} + +/** + * ice_resmgr_destroy - Deallocate memory associated with a resource manager + * @resmgr: resource manager structure + * + * De-allocates the bit string associated with this resource manager. It is + * expected that this function will not be called until all of the assigned + * resources have been released. + */ +void +ice_resmgr_destroy(struct ice_resmgr *resmgr) +{ + if (resmgr->resources != NULL) { + int set; + + set = ice_bit_count(resmgr->resources, 0, resmgr->num_res); + KASSERT(set == 0); + + free(resmgr->resources, M_DEVBUF, + ice_bitstr_size(resmgr->num_res)); + resmgr->resources = NULL; + } + resmgr->num_res = 0; +} + +/** + * ice_resmgr_assign_contiguous - Assign contiguous mapping of resources + * @resmgr: resource manager structure + * @idx: memory to store mapping, at least num_res wide + * @num_res: the number of resources to assign + * + * Assign num_res number of contiguous resources into the idx mapping. On + * success, idx will be updated to map each index to a PF resource. + * + * This function guarantees that the resource mapping will be contiguous, and + * will fail if that is not possible. + */ +int +ice_resmgr_assign_contiguous(struct ice_resmgr *resmgr, uint16_t *idx, + uint16_t num_res) +{ + int start, i; + + ice_bit_ffc_area(resmgr->resources, resmgr->num_res, num_res, &start); + if (start < 0) + return (ENOSPC); + + /* Set each bit and update the index array */ + for (i = 0; i < num_res; i++) { + ice_bit_set(resmgr->resources, start + i); + idx[i] = start + i; + } + + return (0); +} + +/** + * ice_alloc_intr_tracking - Setup interrupt tracking structures + * @sc: device softc structure + * + * Sets up the resource manager for keeping track of interrupt allocations, + * and initializes the tracking maps for the PF's interrupt allocations. + * + * Unlike the scheme for queues, this is done in one step since both the + * manager and the maps both have the same lifetime. + * + * @returns 0 on success, or an error code on failure. + */ +int +ice_alloc_intr_tracking(struct ice_softc *sc) +{ + struct ice_hw *hw = &sc->hw; + size_t nvec; + int err, i; + + nvec = hw->func_caps.common_cap.num_msix_vectors; + + /* Initialize the interrupt allocation manager */ + err = ice_resmgr_init_contig_only(&sc->dev_imgr, nvec); + if (err) { + printf("%s: Unable to initialize PF interrupt manager: " + "error %d\n", sc->sc_dev.dv_xname, err); + return (err); + } + + /* Allocate PF interrupt mapping storage */ + sc->pf_imap = (uint16_t *)mallocarray(nvec, sizeof(uint16_t), + M_DEVBUF, M_NOWAIT); + if (sc->pf_imap == NULL) { + printf("%s: Unable to allocate PF imap memory\n", + sc->sc_dev.dv_xname); + err = ENOMEM; + goto free_imgr; + } +#if 0 + sc->rdma_imap = (uint16_t *)mallocarray(nvec, sizeof(uint16_t), + M_DEVBUF, M_NOWAIT); + if (sc->sc_rdma_imap == NULL) { + printf("%s: Unable to allocate RDMA imap memory\n", + sc->sc_dev.dv_xname); + err = ENOMEM; + goto free_pf_imap; + } +#endif + for (i = 0; i < nvec; i++) { + sc->pf_imap[i] = ICE_INVALID_RES_IDX; +#if 0 + sc->rdma_imap[i] = ICE_INVALID_RES_IDX; +#endif + } + + return (0); +#if 0 +free_pf_imap: + free(sc->pf_imap, M_DEVBUF, nvec * sizeof(uint16_t)); + sc->pf_imap = NULL; +#endif +free_imgr: + ice_resmgr_destroy(&sc->dev_imgr); + return (err); +} + +/** + * ice_resmgr_release_map - Release previously assigned resource mapping + * @resmgr: the resource manager structure + * @idx: previously assigned resource mapping + * @num_res: number of resources in the mapping + * + * Clears the assignment of each resource in the provided resource index. + * Updates the idx to indicate that each of the virtual indexes have + * invalid resource mappings by assigning them to ICE_INVALID_RES_IDX. + */ +void +ice_resmgr_release_map(struct ice_resmgr *resmgr, uint16_t *idx, + uint16_t num_res) +{ + int i; + + for (i = 0; i < num_res; i++) { + if (idx[i] < resmgr->num_res) + ice_bit_clear(resmgr->resources, idx[i]); + idx[i] = ICE_INVALID_RES_IDX; + } +} + +/** + * ice_free_intr_tracking - Free PF interrupt tracking structures + * @sc: device softc structure + * + * Frees the interrupt resource allocation manager and the PF's owned maps. + * + * VF maps are released when the owning VF's are destroyed, which should always + * happen before this function is called. + */ +void +ice_free_intr_tracking(struct ice_softc *sc) +{ + if (sc->pf_imap) { + ice_resmgr_release_map(&sc->dev_imgr, sc->pf_imap, + sc->lan_vectors); + free(sc->pf_imap, M_DEVBUF, + sizeof(uint16_t) * sc->lan_vectors); + sc->pf_imap = NULL; + } +#if 0 + if (sc->rdma_imap) { + ice_resmgr_release_map(&sc->dev_imgr, sc->rdma_imap, + sc->lan_vectors); + free(sc->rdma_imap, M_DEVBUF, + sizeof(uint16_t) * sc->lan_vectors); + sc->rdma_imap = NULL; + } +#endif + ice_resmgr_destroy(&sc->dev_imgr); + + ice_resmgr_destroy(&sc->os_imgr); +} + +/** + * ice_setup_vsi_common - Common VSI setup for both dynamic and static VSIs + * @sc: the device private softc structure + * @vsi: the VSI to setup + * @type: the VSI type of the new VSI + * @idx: the index in the all_vsi array to use + * @dynamic: whether this VSI memory was dynamically allocated + * + * Perform setup for a VSI that is common to both dynamically allocated VSIs + * and the static PF VSI which is embedded in the softc structure. + */ +void +ice_setup_vsi_common(struct ice_softc *sc, struct ice_vsi *vsi, + enum ice_vsi_type type, int idx, bool dynamic) +{ + struct ice_hw *hw = &sc->hw; + + /* Store important values in VSI struct */ + vsi->type = type; + vsi->sc = sc; + vsi->idx = idx; + sc->all_vsi[idx] = vsi; + vsi->dynamic = dynamic; + + /* Set default mirroring rule information */ + vsi->rule_mir_ingress = ICE_INVAL_MIRROR_RULE_ID; + vsi->rule_mir_egress = ICE_INVAL_MIRROR_RULE_ID; +#if 0 + /* Setup the VSI tunables now */ + ice_add_vsi_tunables(vsi, sc->vsi_sysctls); +#endif + vsi->mbuf_sz = MCLBYTES + ETHER_ALIGN; + vsi->max_frame_size = hw->port_info->phy.link_info.max_frame_size; +} + +/** + * ice_setup_pf_vsi - Setup the PF VSI + * @sc: the device private softc + * + * Setup the PF VSI structure which is embedded as sc->pf_vsi in the device + * private softc. Unlike other VSIs, the PF VSI memory is allocated as part of + * the softc memory, instead of being dynamically allocated at creation. + */ +void +ice_setup_pf_vsi(struct ice_softc *sc) +{ + ice_setup_vsi_common(sc, &sc->pf_vsi, ICE_VSI_PF, 0, false); +} + +/** + * ice_alloc_vsi_qmap + * @vsi: VSI structure + * @max_tx_queues: Number of transmit queues to identify + * @max_rx_queues: Number of receive queues to identify + * + * Allocates a max_[t|r]x_queues array of words for the VSI where each + * word contains the index of the queue it represents. In here, all + * words are initialized to an index of ICE_INVALID_RES_IDX, indicating + * all queues for this VSI are not yet assigned an index and thus, + * not ready for use. + * + * Returns an error code on failure. + */ +int +ice_alloc_vsi_qmap(struct ice_vsi *vsi, const int max_tx_queues, + const int max_rx_queues) +{ + struct ice_softc *sc = vsi->sc; + int i; + + KASSERT(max_tx_queues > 0); + KASSERT(max_rx_queues > 0); + + /* Allocate Tx queue mapping memory */ + vsi->tx_qmap = (uint16_t *)mallocarray(max_tx_queues, sizeof(uint16_t), + M_DEVBUF, M_WAITOK); + if (!vsi->tx_qmap) { + printf("%s: Unable to allocate Tx qmap memory\n", + sc->sc_dev.dv_xname); + return (ENOMEM); + } + + /* Allocate Rx queue mapping memory */ + vsi->rx_qmap = (uint16_t *) mallocarray(max_rx_queues, sizeof(uint16_t), + M_DEVBUF, M_WAITOK); + if (!vsi->rx_qmap) { + printf("%s: Unable to allocate Rx qmap memory\n", + sc->sc_dev.dv_xname); + goto free_tx_qmap; + } + + /* Mark every queue map as invalid to start with */ + for (i = 0; i < max_tx_queues; i++) + vsi->tx_qmap[i] = ICE_INVALID_RES_IDX; + for (i = 0; i < max_rx_queues; i++) + vsi->rx_qmap[i] = ICE_INVALID_RES_IDX; + + return 0; + +free_tx_qmap: + free(vsi->tx_qmap, M_DEVBUF, max_tx_queues * sizeof(uint16_t)); + vsi->tx_qmap = NULL; + + return (ENOMEM); +} + +/** + * ice_vsig_find_vsi - find a VSIG that contains a specified VSI + * @hw: pointer to the hardware structure + * @blk: HW block + * @vsi: VSI of interest + * @vsig: pointer to receive the VSI group + * + * This function will lookup the VSI entry in the XLT2 list and return + * the VSI group its associated with. + */ +enum ice_status +ice_vsig_find_vsi(struct ice_hw *hw, enum ice_block blk, uint16_t vsi, + uint16_t *vsig) +{ + if (!vsig || vsi >= ICE_MAX_VSI) + return ICE_ERR_PARAM; + + /* As long as there's a default or valid VSIG associated with the input + * VSI, the functions returns a success. Any handling of VSIG will be + * done by the following add, update or remove functions. + */ + *vsig = hw->blk[blk].xlt2.vsis[vsi].vsig; + + return ICE_SUCCESS; +} + +/** + * ice_vsig_prof_id_count - count profiles in a VSIG + * @hw: pointer to the HW struct + * @blk: hardware block + * @vsig: VSIG to remove the profile from + */ +uint16_t +ice_vsig_prof_id_count(struct ice_hw *hw, enum ice_block blk, + uint16_t vsig) +{ + uint16_t idx = vsig & ICE_VSIG_IDX_M, count = 0; + struct ice_vsig_prof *p; + + TAILQ_FOREACH(p, &hw->blk[blk].xlt2.vsig_tbl[idx].prop_lst, list) + count++; + + return count; +} + +/** + * ice_vsig_get_ref - returns number of VSIs belong to a VSIG + * @hw: pointer to the hardware structure + * @blk: HW block + * @vsig: VSIG to query + * @refs: pointer to variable to receive the reference count + */ +enum ice_status +ice_vsig_get_ref(struct ice_hw *hw, enum ice_block blk, uint16_t vsig, + uint16_t *refs) +{ + uint16_t idx = vsig & ICE_VSIG_IDX_M; + struct ice_vsig_vsi *ptr; + + *refs = 0; + + if (!hw->blk[blk].xlt2.vsig_tbl[idx].in_use) + return ICE_ERR_DOES_NOT_EXIST; + + ptr = hw->blk[blk].xlt2.vsig_tbl[idx].first_vsi; + while (ptr) { + (*refs)++; + ptr = ptr->next_vsi; + } + + return ICE_SUCCESS; +} + +/* Key creation */ + +#define ICE_DC_KEY 0x1 /* don't care */ +#define ICE_DC_KEYINV 0x1 +#define ICE_NM_KEY 0x0 /* never match */ +#define ICE_NM_KEYINV 0x0 +#define ICE_0_KEY 0x1 /* match 0 */ +#define ICE_0_KEYINV 0x0 +#define ICE_1_KEY 0x0 /* match 1 */ +#define ICE_1_KEYINV 0x1 + +/** + * ice_gen_key_word - generate 16-bits of a key/mask word + * @val: the value + * @valid: valid bits mask (change only the valid bits) + * @dont_care: don't care mask + * @nvr_mtch: never match mask + * @key: pointer to an array of where the resulting key portion + * @key_inv: pointer to an array of where the resulting key invert portion + * + * This function generates 16-bits from a 8-bit value, an 8-bit don't care mask + * and an 8-bit never match mask. The 16-bits of output are divided into 8 bits + * of key and 8 bits of key invert. + * + * '0' = b01, always match a 0 bit + * '1' = b10, always match a 1 bit + * '?' = b11, don't care bit (always matches) + * '~' = b00, never match bit + * + * Input: + * val: b0 1 0 1 0 1 + * dont_care: b0 0 1 1 0 0 + * never_mtch: b0 0 0 0 1 1 + * ------------------------------ + * Result: key: b01 10 11 11 00 00 + */ +enum ice_status +ice_gen_key_word(uint8_t val, uint8_t valid, uint8_t dont_care, + uint8_t nvr_mtch, uint8_t *key, uint8_t *key_inv) +{ + uint8_t in_key = *key, in_key_inv = *key_inv; + uint8_t i; + + /* 'dont_care' and 'nvr_mtch' masks cannot overlap */ + if ((dont_care ^ nvr_mtch) != (dont_care | nvr_mtch)) + return ICE_ERR_CFG; + + *key = 0; + *key_inv = 0; + + /* encode the 8 bits into 8-bit key and 8-bit key invert */ + for (i = 0; i < 8; i++) { + *key >>= 1; + *key_inv >>= 1; + + if (!(valid & 0x1)) { /* change only valid bits */ + *key |= (in_key & 0x1) << 7; + *key_inv |= (in_key_inv & 0x1) << 7; + } else if (dont_care & 0x1) { /* don't care bit */ + *key |= ICE_DC_KEY << 7; + *key_inv |= ICE_DC_KEYINV << 7; + } else if (nvr_mtch & 0x1) { /* never match bit */ + *key |= ICE_NM_KEY << 7; + *key_inv |= ICE_NM_KEYINV << 7; + } else if (val & 0x01) { /* exact 1 match */ + *key |= ICE_1_KEY << 7; + *key_inv |= ICE_1_KEYINV << 7; + } else { /* exact 0 match */ + *key |= ICE_0_KEY << 7; + *key_inv |= ICE_0_KEYINV << 7; + } + + dont_care >>= 1; + nvr_mtch >>= 1; + valid >>= 1; + val >>= 1; + in_key >>= 1; + in_key_inv >>= 1; + } + + return ICE_SUCCESS; +} + +/** + * ice_bits_max_set - determine if the number of bits set is within a maximum + * @mask: pointer to the byte array which is the mask + * @size: the number of bytes in the mask + * @max: the max number of set bits + * + * This function determines if there are at most 'max' number of bits set in an + * array. Returns true if the number for bits set is <= max or will return false + * otherwise. + */ +bool +ice_bits_max_set(const uint8_t *mask, uint16_t size, uint16_t max) +{ + uint16_t count = 0; + uint16_t i; + + /* check each byte */ + for (i = 0; i < size; i++) { + /* if 0, go to next byte */ + if (!mask[i]) + continue; + + /* We know there is at least one set bit in this byte because of + * the above check; if we already have found 'max' number of + * bits set, then we can return failure now. + */ + if (count == max) + return false; + + /* count the bits in this byte, checking threshold */ + count += ice_popcount16(mask[i]); + if (count > max) + return false; + } + + return true; +} + +/** + * ice_set_key - generate a variable sized key with multiples of 16-bits + * @key: pointer to where the key will be stored + * @size: the size of the complete key in bytes (must be even) + * @val: array of 8-bit values that makes up the value portion of the key + * @upd: array of 8-bit masks that determine what key portion to update + * @dc: array of 8-bit masks that make up the don't care mask + * @nm: array of 8-bit masks that make up the never match mask + * @off: the offset of the first byte in the key to update + * @len: the number of bytes in the key update + * + * This function generates a key from a value, a don't care mask and a never + * match mask. + * upd, dc, and nm are optional parameters, and can be NULL: + * upd == NULL --> upd mask is all 1's (update all bits) + * dc == NULL --> dc mask is all 0's (no don't care bits) + * nm == NULL --> nm mask is all 0's (no never match bits) + */ +enum ice_status +ice_set_key(uint8_t *key, uint16_t size, uint8_t *val, uint8_t *upd, + uint8_t *dc, uint8_t *nm, uint16_t off, uint16_t len) +{ + uint16_t half_size; + uint16_t i; + + /* size must be a multiple of 2 bytes. */ + if (size % 2) + return ICE_ERR_CFG; + half_size = size / 2; + + if (off + len > half_size) + return ICE_ERR_CFG; + + /* Make sure at most one bit is set in the never match mask. Having more + * than one never match mask bit set will cause HW to consume excessive + * power otherwise; this is a power management efficiency check. + */ +#define ICE_NVR_MTCH_BITS_MAX 1 + if (nm && !ice_bits_max_set(nm, len, ICE_NVR_MTCH_BITS_MAX)) + return ICE_ERR_CFG; + + for (i = 0; i < len; i++) + if (ice_gen_key_word(val[i], upd ? upd[i] : 0xff, + dc ? dc[i] : 0, nm ? nm[i] : 0, + key + off + i, key + half_size + off + i)) + return ICE_ERR_CFG; + + return ICE_SUCCESS; +} + +/** + * ice_prof_gen_key - generate profile ID key + * @hw: pointer to the HW struct + * @blk: the block in which to write profile ID to + * @ptg: packet type group (PTG) portion of key + * @vsig: VSIG portion of key + * @cdid: CDID portion of key + * @flags: flag portion of key + * @vl_msk: valid mask + * @dc_msk: don't care mask + * @nm_msk: never match mask + * @key: output of profile ID key + */ +enum ice_status +ice_prof_gen_key(struct ice_hw *hw, enum ice_block blk, uint8_t ptg, + uint16_t vsig, uint8_t cdid, uint16_t flags, + uint8_t vl_msk[ICE_TCAM_KEY_VAL_SZ], + uint8_t dc_msk[ICE_TCAM_KEY_VAL_SZ], + uint8_t nm_msk[ICE_TCAM_KEY_VAL_SZ], + uint8_t key[ICE_TCAM_KEY_SZ]) +{ + struct ice_prof_id_key inkey; + + inkey.xlt1 = ptg; + inkey.xlt2_cdid = htole16(vsig); + inkey.flags = htole16(flags); + + switch (hw->blk[blk].prof.cdid_bits) { + case 0: + break; + case 2: +#define ICE_CD_2_M 0xC000U +#define ICE_CD_2_S 14 + inkey.xlt2_cdid &= ~htole16(ICE_CD_2_M); + inkey.xlt2_cdid |= htole16(BIT(cdid) << ICE_CD_2_S); + break; + case 4: +#define ICE_CD_4_M 0xF000U +#define ICE_CD_4_S 12 + inkey.xlt2_cdid &= ~htole16(ICE_CD_4_M); + inkey.xlt2_cdid |= htole16(BIT(cdid) << ICE_CD_4_S); + break; + case 8: +#define ICE_CD_8_M 0xFF00U +#define ICE_CD_8_S 16 + inkey.xlt2_cdid &= ~htole16(ICE_CD_8_M); + inkey.xlt2_cdid |= htole16(BIT(cdid) << ICE_CD_8_S); + break; + default: + DNPRINTF(ICE_DBG_PKG, "%s: Error in profile config\n", + __func__); + break; + } + + return ice_set_key(key, ICE_TCAM_KEY_SZ, (uint8_t *)&inkey, + vl_msk, dc_msk, nm_msk, 0, ICE_TCAM_KEY_SZ / 2); +} + +/** + * ice_tcam_write_entry - write TCAM entry + * @hw: pointer to the HW struct + * @blk: the block in which to write profile ID to + * @idx: the entry index to write to + * @prof_id: profile ID + * @ptg: packet type group (PTG) portion of key + * @vsig: VSIG portion of key + * @cdid: CDID portion of key + * @flags: flag portion of key + * @vl_msk: valid mask + * @dc_msk: don't care mask + * @nm_msk: never match mask + */ +enum ice_status +ice_tcam_write_entry(struct ice_hw *hw, enum ice_block blk, uint16_t idx, + uint8_t prof_id, uint8_t ptg, uint16_t vsig, uint8_t cdid, uint16_t flags, + uint8_t vl_msk[ICE_TCAM_KEY_VAL_SZ], + uint8_t dc_msk[ICE_TCAM_KEY_VAL_SZ], + uint8_t nm_msk[ICE_TCAM_KEY_VAL_SZ]) +{ + struct ice_prof_tcam_entry; + enum ice_status status; + + status = ice_prof_gen_key(hw, blk, ptg, vsig, cdid, flags, vl_msk, + dc_msk, nm_msk, hw->blk[blk].prof.t[idx].key); + if (!status) { + hw->blk[blk].prof.t[idx].addr = htole16(idx); + hw->blk[blk].prof.t[idx].prof_id = prof_id; + } + + return status; +} + +/** + * ice_tcam_ent_rsrc_type - get TCAM entry resource type for a block type + * @blk: the block type + * @rsrc_type: pointer to variable to receive the resource type + */ +bool +ice_tcam_ent_rsrc_type(enum ice_block blk, uint16_t *rsrc_type) +{ + switch (blk) { + case ICE_BLK_RSS: + *rsrc_type = ICE_AQC_RES_TYPE_HASH_PROF_BLDR_TCAM; + break; + case ICE_BLK_PE: + *rsrc_type = ICE_AQC_RES_TYPE_QHASH_PROF_BLDR_TCAM; + break; + default: + return false; + } + return true; +} + +/** + * ice_alloc_hw_res - allocate resource + * @hw: pointer to the HW struct + * @type: type of resource + * @num: number of resources to allocate + * @btm: allocate from bottom + * @res: pointer to array that will receive the resources + */ +enum ice_status +ice_alloc_hw_res(struct ice_hw *hw, uint16_t type, uint16_t num, bool btm, + uint16_t *res) +{ + struct ice_aqc_alloc_free_res_elem *buf; + enum ice_status status; + uint16_t buf_len; + + buf_len = ice_struct_size(buf, elem, num); + buf = (struct ice_aqc_alloc_free_res_elem *)ice_malloc(hw, buf_len); + if (!buf) + return ICE_ERR_NO_MEMORY; + + /* Prepare buffer to allocate resource. */ + buf->num_elems = htole16(num); + buf->res_type = htole16(type | ICE_AQC_RES_TYPE_FLAG_DEDICATED | + ICE_AQC_RES_TYPE_FLAG_IGNORE_INDEX); + if (btm) + buf->res_type |= htole16(ICE_AQC_RES_TYPE_FLAG_SCAN_BOTTOM); + + status = ice_aq_alloc_free_res(hw, 1, buf, buf_len, + ice_aqc_opc_alloc_res, NULL); + if (status) + goto ice_alloc_res_exit; + + memcpy(res, buf->elem, sizeof(*buf->elem) * num); + +ice_alloc_res_exit: + ice_free(hw, buf); + return status; +} + +/** + * ice_free_hw_res - free allocated HW resource + * @hw: pointer to the HW struct + * @type: type of resource to free + * @num: number of resources + * @res: pointer to array that contains the resources to free + */ +enum ice_status +ice_free_hw_res(struct ice_hw *hw, uint16_t type, uint16_t num, uint16_t *res) +{ + struct ice_aqc_alloc_free_res_elem *buf; + enum ice_status status; + uint16_t buf_len; + + /* prevent overflow; all callers currently hard-code num as 1 */ + KASSERT(num == 1); + + buf_len = ice_struct_size(buf, elem, num); + buf = (struct ice_aqc_alloc_free_res_elem *)ice_malloc(hw, buf_len); + if (!buf) + return ICE_ERR_NO_MEMORY; + + /* Prepare buffer to free resource. */ + buf->num_elems = htole16(num); + buf->res_type = htole16(type); + memcpy(buf->elem, res, sizeof(*buf->elem) * num); + + status = ice_aq_alloc_free_res(hw, num, buf, buf_len, + ice_aqc_opc_free_res, NULL); + + ice_free(hw, buf); + return status; +} + +/** + * ice_free_tcam_ent - free hardware TCAM entry + * @hw: pointer to the HW struct + * @blk: the block from which to free the TCAM entry + * @tcam_idx: the TCAM entry to free + * + * This function frees an entry in a Profile ID TCAM for a specific block. + */ +enum ice_status +ice_free_tcam_ent(struct ice_hw *hw, enum ice_block blk, uint16_t tcam_idx) +{ + uint16_t res_type; + + if (!ice_tcam_ent_rsrc_type(blk, &res_type)) + return ICE_ERR_PARAM; + + return ice_free_hw_res(hw, res_type, 1, &tcam_idx); +} + +/** + * ice_rel_tcam_idx - release a TCAM index + * @hw: pointer to the HW struct + * @blk: hardware block + * @idx: the index to release + */ +enum ice_status +ice_rel_tcam_idx(struct ice_hw *hw, enum ice_block blk, uint16_t idx) +{ + /* Masks to invoke a never match entry */ + uint8_t vl_msk[ICE_TCAM_KEY_VAL_SZ] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; + uint8_t dc_msk[ICE_TCAM_KEY_VAL_SZ] = { 0xFE, 0xFF, 0xFF, 0xFF, 0xFF }; + uint8_t nm_msk[ICE_TCAM_KEY_VAL_SZ] = { 0x01, 0x00, 0x00, 0x00, 0x00 }; + enum ice_status status; + + /* write the TCAM entry */ + status = ice_tcam_write_entry(hw, blk, idx, 0, 0, 0, 0, 0, vl_msk, + dc_msk, nm_msk); + if (status) + return status; + + /* release the TCAM entry */ + status = ice_free_tcam_ent(hw, blk, idx); + + return status; +} + +/** + * ice_rem_prof_id - remove one profile from a VSIG + * @hw: pointer to the HW struct + * @blk: hardware block + * @prof: pointer to profile structure to remove + */ +enum ice_status +ice_rem_prof_id(struct ice_hw *hw, enum ice_block blk, + struct ice_vsig_prof *prof) +{ + enum ice_status status; + uint16_t i; + + for (i = 0; i < prof->tcam_count; i++) + if (prof->tcam[i].in_use) { + prof->tcam[i].in_use = false; + status = ice_rel_tcam_idx(hw, blk, + prof->tcam[i].tcam_idx); + if (status) + return ICE_ERR_HW_TABLE; + } + + return ICE_SUCCESS; +} + +/** + * ice_rem_vsig - remove VSIG + * @hw: pointer to the HW struct + * @blk: hardware block + * @vsig: the VSIG to remove + * @chg: the change list + */ +enum ice_status +ice_rem_vsig(struct ice_hw *hw, enum ice_block blk, uint16_t vsig, + struct ice_chs_chg_head *chg) +{ + uint16_t idx = vsig & ICE_VSIG_IDX_M; + struct ice_vsig_vsi *vsi_cur; + struct ice_vsig_prof *d, *t; + + /* remove TCAM entries */ + TAILQ_FOREACH_SAFE(d, &hw->blk[blk].xlt2.vsig_tbl[idx].prop_lst, + list, t) { + enum ice_status status; + + status = ice_rem_prof_id(hw, blk, d); + if (status) + return status; + + TAILQ_REMOVE(&hw->blk[blk].xlt2.vsig_tbl[idx].prop_lst, + d, list); + ice_free(hw, d); + } + + /* Move all VSIS associated with this VSIG to the default VSIG */ + vsi_cur = hw->blk[blk].xlt2.vsig_tbl[idx].first_vsi; + /* If the VSIG has at least 1 VSI then iterate through the list + * and remove the VSIs before deleting the group. + */ + if (vsi_cur) { + do { + struct ice_vsig_vsi *tmp = vsi_cur->next_vsi; + struct ice_chs_chg *p; + + p = (struct ice_chs_chg *)ice_malloc(hw, sizeof(*p)); + if (!p) + return ICE_ERR_NO_MEMORY; + + p->type = ICE_VSIG_REM; + p->orig_vsig = vsig; + p->vsig = ICE_DEFAULT_VSIG; + p->vsi = (uint16_t)(vsi_cur - hw->blk[blk].xlt2.vsis); + + TAILQ_INSERT_HEAD(chg, p, list_entry); + + vsi_cur = tmp; + } while (vsi_cur); + } + + return ice_vsig_free(hw, blk, vsig); +} + +/** + * ice_rem_prof_id_vsig - remove a specific profile from a VSIG + * @hw: pointer to the HW struct + * @blk: hardware block + * @vsig: VSIG to remove the profile from + * @hdl: profile handle indicating which profile to remove + * @chg: list to receive a record of changes + */ +enum ice_status +ice_rem_prof_id_vsig(struct ice_hw *hw, enum ice_block blk, uint16_t vsig, + uint64_t hdl, struct ice_chs_chg_head *chg) +{ + uint16_t idx = vsig & ICE_VSIG_IDX_M; + struct ice_vsig_prof *p, *t; + + TAILQ_FOREACH_SAFE(p, &hw->blk[blk].xlt2.vsig_tbl[idx].prop_lst, + list, t) { + if (p->profile_cookie == hdl) { + enum ice_status status; + + if (ice_vsig_prof_id_count(hw, blk, vsig) == 1) + /* this is the last profile, remove the VSIG */ + return ice_rem_vsig(hw, blk, vsig, chg); + + status = ice_rem_prof_id(hw, blk, p); + if (!status) { + TAILQ_REMOVE( + &hw->blk[blk].xlt2.vsig_tbl[idx].prop_lst, + p, list); + ice_free(hw, p); + } + return status; + } + } + + return ICE_ERR_DOES_NOT_EXIST; +} + +/** + * ice_rem_chg_tcam_ent - remove a specific TCAM entry from change list + * @hw: pointer to the HW struct + * @idx: the index of the TCAM entry to remove + * @chg: the list of change structures to search + */ +void +ice_rem_chg_tcam_ent(struct ice_hw *hw, uint16_t idx, + struct ice_chs_chg_head *chg) +{ + struct ice_chs_chg *pos, *tmp; + + TAILQ_FOREACH_SAFE(pos, chg, list_entry, tmp) { + if (pos->type == ICE_TCAM_ADD && pos->tcam_idx == idx) { + TAILQ_REMOVE(chg, pos, list_entry); + ice_free(hw, pos); + } + } +} + +/** + * ice_alloc_tcam_ent - allocate hardware TCAM entry + * @hw: pointer to the HW struct + * @blk: the block to allocate the TCAM for + * @btm: true to allocate from bottom of table, false to allocate from top + * @tcam_idx: pointer to variable to receive the TCAM entry + * + * This function allocates a new entry in a Profile ID TCAM for a specific + * block. + */ +enum ice_status +ice_alloc_tcam_ent(struct ice_hw *hw, enum ice_block blk, bool btm, + uint16_t *tcam_idx) +{ + uint16_t res_type; + + if (!ice_tcam_ent_rsrc_type(blk, &res_type)) + return ICE_ERR_PARAM; + + return ice_alloc_hw_res(hw, res_type, 1, btm, tcam_idx); +} + +/** + * ice_prof_tcam_ena_dis - add enable or disable TCAM change + * @hw: pointer to the HW struct + * @blk: hardware block + * @enable: true to enable, false to disable + * @vsig: the VSIG of the TCAM entry + * @tcam: pointer the TCAM info structure of the TCAM to disable + * @chg: the change list + * + * This function appends an enable or disable TCAM entry in the change log + */ +enum ice_status +ice_prof_tcam_ena_dis(struct ice_hw *hw, enum ice_block blk, bool enable, + uint16_t vsig, struct ice_tcam_inf *tcam, + struct ice_chs_chg_head *chg) +{ + enum ice_status status; + struct ice_chs_chg *p; + uint8_t vl_msk[ICE_TCAM_KEY_VAL_SZ] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; + uint8_t dc_msk[ICE_TCAM_KEY_VAL_SZ] = { 0xFF, 0xFF, 0x00, 0x00, 0x00 }; + uint8_t nm_msk[ICE_TCAM_KEY_VAL_SZ] = { 0x00, 0x00, 0x00, 0x00, 0x00 }; + + /* if disabling, free the TCAM */ + if (!enable) { + status = ice_rel_tcam_idx(hw, blk, tcam->tcam_idx); + + /* if we have already created a change for this TCAM entry, then + * we need to remove that entry, in order to prevent writing to + * a TCAM entry we no longer will have ownership of. + */ + ice_rem_chg_tcam_ent(hw, tcam->tcam_idx, chg); + tcam->tcam_idx = 0; + tcam->in_use = 0; + return status; + } + + /* for re-enabling, reallocate a TCAM */ + status = ice_alloc_tcam_ent(hw, blk, true, &tcam->tcam_idx); + if (status) + return status; + + /* add TCAM to change list */ + p = (struct ice_chs_chg *)ice_malloc(hw, sizeof(*p)); + if (!p) + return ICE_ERR_NO_MEMORY; + + status = ice_tcam_write_entry(hw, blk, tcam->tcam_idx, tcam->prof_id, + tcam->ptg, vsig, 0, 0, vl_msk, dc_msk, + nm_msk); + if (status) + goto err_ice_prof_tcam_ena_dis; + + tcam->in_use = 1; + + p->type = ICE_TCAM_ADD; + p->add_tcam_idx = true; + p->prof_id = tcam->prof_id; + p->ptg = tcam->ptg; + p->vsig = 0; + p->tcam_idx = tcam->tcam_idx; + + /* log change */ + TAILQ_INSERT_HEAD(chg, p, list_entry); + + return ICE_SUCCESS; + +err_ice_prof_tcam_ena_dis: + ice_free(hw, p); + return status; +} + +/** + * ice_adj_prof_priorities - adjust profile based on priorities + * @hw: pointer to the HW struct + * @blk: hardware block + * @vsig: the VSIG for which to adjust profile priorities + * @chg: the change list + */ +enum ice_status +ice_adj_prof_priorities(struct ice_hw *hw, enum ice_block blk, uint16_t vsig, + struct ice_chs_chg_head *chg) +{ + ice_declare_bitmap(ptgs_used, ICE_XLT1_CNT); + enum ice_status status = ICE_SUCCESS; + struct ice_vsig_prof *t; + uint16_t idx; + + ice_zero_bitmap(ptgs_used, ICE_XLT1_CNT); + idx = vsig & ICE_VSIG_IDX_M; + + /* Priority is based on the order in which the profiles are added. The + * newest added profile has highest priority and the oldest added + * profile has the lowest priority. Since the profile property list for + * a VSIG is sorted from newest to oldest, this code traverses the list + * in order and enables the first of each PTG that it finds (that is not + * already enabled); it also disables any duplicate PTGs that it finds + * in the older profiles (that are currently enabled). + */ + + TAILQ_FOREACH(t, &hw->blk[blk].xlt2.vsig_tbl[idx].prop_lst, list) { + uint16_t i; + + for (i = 0; i < t->tcam_count; i++) { + bool used; + + /* Scan the priorities from newest to oldest. + * Make sure that the newest profiles take priority. + */ + used = ice_is_bit_set(ptgs_used, t->tcam[i].ptg); + + if (used && t->tcam[i].in_use) { + /* need to mark this PTG as never match, as it + * was already in use and therefore duplicate + * (and lower priority) + */ + status = ice_prof_tcam_ena_dis(hw, blk, false, + vsig, + &t->tcam[i], + chg); + if (status) + return status; + } else if (!used && !t->tcam[i].in_use) { + /* need to enable this PTG, as it in not in use + * and not enabled (highest priority) + */ + status = ice_prof_tcam_ena_dis(hw, blk, true, + vsig, + &t->tcam[i], + chg); + if (status) + return status; + } + + /* keep track of used ptgs */ + ice_set_bit(t->tcam[i].ptg, ptgs_used); + } + } + + return status; +} + +/** + * ice_get_profs_vsig - get a copy of the list of profiles from a VSIG + * @hw: pointer to the HW struct + * @blk: hardware block + * @vsig: VSIG from which to copy the list + * @lst: output list + * + * This routine makes a copy of the list of profiles in the specified VSIG. + */ +enum ice_status +ice_get_profs_vsig(struct ice_hw *hw, enum ice_block blk, uint16_t vsig, + struct ice_vsig_prof_head *lst) +{ + struct ice_vsig_prof *ent1, *ent2; + uint16_t idx = vsig & ICE_VSIG_IDX_M; + + TAILQ_FOREACH(ent1, &hw->blk[blk].xlt2.vsig_tbl[idx].prop_lst, list) { + struct ice_vsig_prof *p; + + /* copy to the input list */ + p = (struct ice_vsig_prof *)ice_memdup(hw, ent1, sizeof(*p)); + if (!p) + goto err_ice_get_profs_vsig; + + TAILQ_INSERT_TAIL(lst, p, list); + } + + return ICE_SUCCESS; + +err_ice_get_profs_vsig: + TAILQ_FOREACH_SAFE(ent1, lst, list, ent2) { + TAILQ_REMOVE(lst, ent1, list); + ice_free(hw, ent1); + } + + return ICE_ERR_NO_MEMORY; +} + +/** + * ice_rem_prof_from_list - remove a profile from list + * @hw: pointer to the HW struct + * @lst: list to remove the profile from + * @hdl: the profile handle indicating the profile to remove + */ +enum ice_status +ice_rem_prof_from_list(struct ice_hw *hw, struct ice_vsig_prof_head *lst, + uint64_t hdl) +{ + struct ice_vsig_prof *ent, *tmp; + + TAILQ_FOREACH_SAFE(ent, lst, list, tmp) { + if (ent->profile_cookie == hdl) { + TAILQ_REMOVE(lst, ent, list); + ice_free(hw, ent); + return ICE_SUCCESS; + } + } + + return ICE_ERR_DOES_NOT_EXIST; +} + +/** + * ice_vsig_remove_vsi - remove VSI from VSIG + * @hw: pointer to the hardware structure + * @blk: HW block + * @vsi: VSI to remove + * @vsig: VSI group to remove from + * + * The function will remove the input VSI from its VSI group and move it + * to the DEFAULT_VSIG. + */ +enum ice_status +ice_vsig_remove_vsi(struct ice_hw *hw, enum ice_block blk, uint16_t vsi, + uint16_t vsig) +{ + struct ice_vsig_vsi **vsi_head, *vsi_cur, *vsi_tgt; + uint16_t idx; + + idx = vsig & ICE_VSIG_IDX_M; + + if (vsi >= ICE_MAX_VSI || idx >= ICE_MAX_VSIGS) + return ICE_ERR_PARAM; + + if (!hw->blk[blk].xlt2.vsig_tbl[idx].in_use) + return ICE_ERR_DOES_NOT_EXIST; + + /* entry already in default VSIG, don't have to remove */ + if (idx == ICE_DEFAULT_VSIG) + return ICE_SUCCESS; + + vsi_head = &hw->blk[blk].xlt2.vsig_tbl[idx].first_vsi; + if (!(*vsi_head)) + return ICE_ERR_CFG; + + vsi_tgt = &hw->blk[blk].xlt2.vsis[vsi]; + vsi_cur = (*vsi_head); + + /* iterate the VSI list, skip over the entry to be removed */ + while (vsi_cur) { + if (vsi_tgt == vsi_cur) { + (*vsi_head) = vsi_cur->next_vsi; + break; + } + vsi_head = &vsi_cur->next_vsi; + vsi_cur = vsi_cur->next_vsi; + } + + /* verify if VSI was removed from group list */ + if (!vsi_cur) + return ICE_ERR_DOES_NOT_EXIST; + + vsi_cur->vsig = ICE_DEFAULT_VSIG; + vsi_cur->changed = 1; + vsi_cur->next_vsi = NULL; + + return ICE_SUCCESS; +} + +/** + * ice_vsig_add_mv_vsi - add or move a VSI to a VSI group + * @hw: pointer to the hardware structure + * @blk: HW block + * @vsi: VSI to move + * @vsig: destination VSI group + * + * This function will move or add the input VSI to the target VSIG. + * The function will find the original VSIG the VSI belongs to and + * move the entry to the DEFAULT_VSIG, update the original VSIG and + * then move entry to the new VSIG. + */ +enum ice_status +ice_vsig_add_mv_vsi(struct ice_hw *hw, enum ice_block blk, uint16_t vsi, + uint16_t vsig) +{ + struct ice_vsig_vsi *tmp; + enum ice_status status; + uint16_t orig_vsig, idx; + + idx = vsig & ICE_VSIG_IDX_M; + + if (vsi >= ICE_MAX_VSI || idx >= ICE_MAX_VSIGS) + return ICE_ERR_PARAM; + + /* if VSIG not in use and VSIG is not default type this VSIG + * doesn't exist. + */ + if (!hw->blk[blk].xlt2.vsig_tbl[idx].in_use && + vsig != ICE_DEFAULT_VSIG) + return ICE_ERR_DOES_NOT_EXIST; + + status = ice_vsig_find_vsi(hw, blk, vsi, &orig_vsig); + if (status) + return status; + + /* no update required if vsigs match */ + if (orig_vsig == vsig) + return ICE_SUCCESS; + + if (orig_vsig != ICE_DEFAULT_VSIG) { + /* remove entry from orig_vsig and add to default VSIG */ + status = ice_vsig_remove_vsi(hw, blk, vsi, orig_vsig); + if (status) + return status; + } + + if (idx == ICE_DEFAULT_VSIG) + return ICE_SUCCESS; + + /* Create VSI entry and add VSIG and prop_mask values */ + hw->blk[blk].xlt2.vsis[vsi].vsig = vsig; + hw->blk[blk].xlt2.vsis[vsi].changed = 1; + + /* Add new entry to the head of the VSIG list */ + tmp = hw->blk[blk].xlt2.vsig_tbl[idx].first_vsi; + hw->blk[blk].xlt2.vsig_tbl[idx].first_vsi = + &hw->blk[blk].xlt2.vsis[vsi]; + hw->blk[blk].xlt2.vsis[vsi].next_vsi = tmp; + hw->blk[blk].xlt2.t[vsi] = vsig; + + return ICE_SUCCESS; +} + +/** + * ice_move_vsi - move VSI to another VSIG + * @hw: pointer to the HW struct + * @blk: hardware block + * @vsi: the VSI to move + * @vsig: the VSIG to move the VSI to + * @chg: the change list + */ +enum ice_status +ice_move_vsi(struct ice_hw *hw, enum ice_block blk, uint16_t vsi, uint16_t vsig, + struct ice_chs_chg_head *chg) +{ + enum ice_status status; + struct ice_chs_chg *p; + uint16_t orig_vsig; + + p = (struct ice_chs_chg *)ice_malloc(hw, sizeof(*p)); + if (!p) + return ICE_ERR_NO_MEMORY; + + status = ice_vsig_find_vsi(hw, blk, vsi, &orig_vsig); + if (!status) + status = ice_vsig_add_mv_vsi(hw, blk, vsi, vsig); + + if (status) { + ice_free(hw, p); + return status; + } + + p->type = ICE_VSI_MOVE; + p->vsi = vsi; + p->orig_vsig = orig_vsig; + p->vsig = vsig; + + TAILQ_INSERT_HEAD(chg, p, list_entry); + + return ICE_SUCCESS; +} + +/** + * ice_vsig_alloc_val - allocate a new VSIG by value + * @hw: pointer to the hardware structure + * @blk: HW block + * @vsig: the VSIG to allocate + * + * This function will allocate a given VSIG specified by the VSIG parameter. + */ +uint16_t +ice_vsig_alloc_val(struct ice_hw *hw, enum ice_block blk, uint16_t vsig) +{ + uint16_t idx = vsig & ICE_VSIG_IDX_M; + + if (!hw->blk[blk].xlt2.vsig_tbl[idx].in_use) { + TAILQ_INIT(&hw->blk[blk].xlt2.vsig_tbl[idx].prop_lst); + hw->blk[blk].xlt2.vsig_tbl[idx].in_use = true; + } + + return ICE_VSIG_VALUE(idx, hw->pf_id); +} + +/** + * ice_vsig_alloc - Finds a free entry and allocates a new VSIG + * @hw: pointer to the hardware structure + * @blk: HW block + * + * This function will iterate through the VSIG list and mark the first + * unused entry for the new VSIG entry as used and return that value. + */ +uint16_t +ice_vsig_alloc(struct ice_hw *hw, enum ice_block blk) +{ + uint16_t i; + + for (i = 1; i < ICE_MAX_VSIGS; i++) + if (!hw->blk[blk].xlt2.vsig_tbl[i].in_use) + return ice_vsig_alloc_val(hw, blk, i); + + return ICE_DEFAULT_VSIG; +} + +/** + * ice_has_prof_vsig - check to see if VSIG has a specific profile + * @hw: pointer to the hardware structure + * @blk: HW block + * @vsig: VSIG to check against + * @hdl: profile handle + */ +bool +ice_has_prof_vsig(struct ice_hw *hw, enum ice_block blk, uint16_t vsig, + uint64_t hdl) +{ + uint16_t idx = vsig & ICE_VSIG_IDX_M; + struct ice_vsig_prof *ent; + + TAILQ_FOREACH(ent, &hw->blk[blk].xlt2.vsig_tbl[idx].prop_lst, list) { + if (ent->profile_cookie == hdl) + return true; + } + + DNPRINTF(ICE_DBG_INIT, + "%s: Characteristic list for VSI group %d not found\n", + __func__, vsig); + + return false; +} + +/** + * ice_search_prof_id - Search for a profile tracking ID + * @hw: pointer to the HW struct + * @blk: hardware block + * @id: profile tracking ID + * + * This will search for a profile tracking ID which was previously added. + * The profile map lock should be held before calling this function. + */ +struct ice_prof_map * +ice_search_prof_id(struct ice_hw *hw, enum ice_block blk, uint64_t id) +{ + struct ice_prof_map *entry = NULL; + struct ice_prof_map *map; + + TAILQ_FOREACH(map, &hw->blk[blk].es.prof_map, list) { + if (map->profile_cookie == id) { + entry = map; + break; + } + } + + return entry; +} + +/** + * ice_add_prof_id_vsig - add profile to VSIG + * @hw: pointer to the HW struct + * @blk: hardware block + * @vsig: the VSIG to which this profile is to be added + * @hdl: the profile handle indicating the profile to add + * @rev: true to add entries to the end of the list + * @chg: the change list + */ +enum ice_status +ice_add_prof_id_vsig(struct ice_hw *hw, enum ice_block blk, uint16_t vsig, + uint64_t hdl, bool rev, struct ice_chs_chg_head *chg) +{ + /* Masks that ignore flags */ + uint8_t vl_msk[ICE_TCAM_KEY_VAL_SZ] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; + uint8_t dc_msk[ICE_TCAM_KEY_VAL_SZ] = { 0xFF, 0xFF, 0x00, 0x00, 0x00 }; + uint8_t nm_msk[ICE_TCAM_KEY_VAL_SZ] = { 0x00, 0x00, 0x00, 0x00, 0x00 }; + enum ice_status status = ICE_SUCCESS; + struct ice_prof_map *map; + struct ice_vsig_prof *t; + struct ice_chs_chg *p; + uint16_t vsig_idx, i; + + /* Error, if this VSIG already has this profile */ + if (ice_has_prof_vsig(hw, blk, vsig, hdl)) + return ICE_ERR_ALREADY_EXISTS; + + /* new VSIG profile structure */ + t = (struct ice_vsig_prof *)ice_malloc(hw, sizeof(*t)); + if (!t) + return ICE_ERR_NO_MEMORY; +#if 0 + ice_acquire_lock(&hw->blk[blk].es.prof_map_lock); +#endif + /* Get the details on the profile specified by the handle ID */ + map = ice_search_prof_id(hw, blk, hdl); + if (!map) { + status = ICE_ERR_DOES_NOT_EXIST; + goto err_ice_add_prof_id_vsig; + } + + t->profile_cookie = map->profile_cookie; + t->prof_id = map->prof_id; + t->tcam_count = map->ptg_cnt; + + /* create TCAM entries */ + for (i = 0; i < map->ptg_cnt; i++) { + uint16_t tcam_idx; + + /* add TCAM to change list */ + p = (struct ice_chs_chg *)ice_malloc(hw, sizeof(*p)); + if (!p) { + status = ICE_ERR_NO_MEMORY; + goto err_ice_add_prof_id_vsig; + } + + /* allocate the TCAM entry index */ + status = ice_alloc_tcam_ent(hw, blk, true, &tcam_idx); + if (status) { + ice_free(hw, p); + goto err_ice_add_prof_id_vsig; + } + + t->tcam[i].ptg = map->ptg[i]; + t->tcam[i].prof_id = map->prof_id; + t->tcam[i].tcam_idx = tcam_idx; + t->tcam[i].in_use = true; + + p->type = ICE_TCAM_ADD; + p->add_tcam_idx = true; + p->prof_id = t->tcam[i].prof_id; + p->ptg = t->tcam[i].ptg; + p->vsig = vsig; + p->tcam_idx = t->tcam[i].tcam_idx; + + /* write the TCAM entry */ + status = ice_tcam_write_entry(hw, blk, t->tcam[i].tcam_idx, + t->tcam[i].prof_id, + t->tcam[i].ptg, vsig, 0, 0, + vl_msk, dc_msk, nm_msk); + if (status) { + ice_free(hw, p); + goto err_ice_add_prof_id_vsig; + } + + /* log change */ + TAILQ_INSERT_HEAD(chg, p, list_entry); + } + + /* add profile to VSIG */ + vsig_idx = vsig & ICE_VSIG_IDX_M; + if (rev) + TAILQ_INSERT_TAIL( + &hw->blk[blk].xlt2.vsig_tbl[vsig_idx].prop_lst, t, list); + else + TAILQ_INSERT_HEAD( + &hw->blk[blk].xlt2.vsig_tbl[vsig_idx].prop_lst, t, list); +#if 0 + ice_release_lock(&hw->blk[blk].es.prof_map_lock); +#endif + return status; + +err_ice_add_prof_id_vsig: +#if 0 + ice_release_lock(&hw->blk[blk].es.prof_map_lock); +#endif + /* let caller clean up the change list */ + ice_free(hw, t); + return status; +} + +/** + * ice_create_vsig_from_lst - create a new VSIG with a list of profiles + * @hw: pointer to the HW struct + * @blk: hardware block + * @vsi: the initial VSI that will be in VSIG + * @lst: the list of profile that will be added to the VSIG + * @new_vsig: return of new VSIG + * @chg: the change list + */ +enum ice_status +ice_create_vsig_from_lst(struct ice_hw *hw, enum ice_block blk, uint16_t vsi, + struct ice_vsig_prof_head *lst, uint16_t *new_vsig, + struct ice_chs_chg_head *chg) +{ + struct ice_vsig_prof *t; + enum ice_status status; + uint16_t vsig; + + vsig = ice_vsig_alloc(hw, blk); + if (!vsig) + return ICE_ERR_HW_TABLE; + + status = ice_move_vsi(hw, blk, vsi, vsig, chg); + if (status) + return status; + + TAILQ_FOREACH(t, lst, list) { + /* Reverse the order here since we are copying the list */ + status = ice_add_prof_id_vsig(hw, blk, vsig, t->profile_cookie, + true, chg); + if (status) + return status; + } + + *new_vsig = vsig; + + return ICE_SUCCESS; +} + +/** + * ice_upd_prof_hw - update hardware using the change list + * @hw: pointer to the HW struct + * @blk: hardware block + * @chgs: the list of changes to make in hardware + */ +enum ice_status +ice_upd_prof_hw(struct ice_hw *hw, enum ice_block blk, + struct ice_chs_chg_head *chgs) +{ +#if 0 + struct ice_buf_build *b; + struct ice_chs_chg *tmp; + enum ice_status status; + uint16_t pkg_sects; + uint16_t xlt1 = 0; + uint16_t xlt2 = 0; + uint16_t tcam = 0; + uint16_t es = 0; + uint16_t sects; + + /* count number of sections we need */ + TAILQ_FOREACH(p, chgs, list_entry) { + switch (tmp->type) { + case ICE_PTG_ES_ADD: + if (tmp->add_ptg) + xlt1++; + if (tmp->add_prof) + es++; + break; + case ICE_TCAM_ADD: + tcam++; + break; + case ICE_VSIG_ADD: + case ICE_VSI_MOVE: + case ICE_VSIG_REM: + xlt2++; + break; + default: + break; + } + } + sects = xlt1 + xlt2 + tcam + es; + + if (!sects) + return ICE_SUCCESS; + + /* Build update package buffer */ + b = ice_pkg_buf_alloc(hw); + if (!b) + return ICE_ERR_NO_MEMORY; + + status = ice_pkg_buf_reserve_section(b, sects); + if (status) + goto error_tmp; + + /* Preserve order of table update: ES, TCAM, PTG, VSIG */ + if (es) { + status = ice_prof_bld_es(hw, blk, b, chgs); + if (status) + goto error_tmp; + } + + if (tcam) { + status = ice_prof_bld_tcam(hw, blk, b, chgs); + if (status) + goto error_tmp; + } + + if (xlt1) { + status = ice_prof_bld_xlt1(blk, b, chgs); + if (status) + goto error_tmp; + } + + if (xlt2) { + status = ice_prof_bld_xlt2(blk, b, chgs); + if (status) + goto error_tmp; + } + + /* After package buffer build check if the section count in buffer is + * non-zero and matches the number of sections detected for package + * update. + */ + pkg_sects = ice_pkg_buf_get_active_sections(b); + if (!pkg_sects || pkg_sects != sects) { + status = ICE_ERR_INVAL_SIZE; + goto error_tmp; + } + + /* update package */ + status = ice_update_pkg(hw, ice_pkg_buf(b), 1); + if (status == ICE_ERR_AQ_ERROR) + ice_debug(hw, ICE_DBG_INIT, "Unable to update HW profile\n"); + +error_tmp: + ice_pkg_buf_free(hw, b); + return status; +#else + printf("%s: not implemented\n", __func__); + return ICE_ERR_NOT_IMPL; +#endif +} + +/** + * ice_match_prop_lst - determine if properties of two lists match + * @list1: first properties list + * @list2: second properties list + * + * Count, cookies and the order must match in order to be considered equivalent. + */ +bool +ice_match_prop_lst(struct ice_vsig_prof_head *list1, + struct ice_vsig_prof_head *list2) +{ + struct ice_vsig_prof *tmp1, *tmp2; + uint16_t chk_count = 0; + uint16_t count = 0; + + /* compare counts */ + TAILQ_FOREACH(tmp1, list1, list) + count++; + TAILQ_FOREACH(tmp2, list2, list) + chk_count++; + if (!count || count != chk_count) + return false; + + tmp1 = TAILQ_FIRST(list1); + tmp2 = TAILQ_FIRST(list2); + + /* profile cookies must compare, and in the exact same order to take + * into account priority + */ + while (count--) { + if (tmp2->profile_cookie != tmp1->profile_cookie) + return false; + + tmp1 = TAILQ_NEXT(tmp1, list); + tmp2 = TAILQ_NEXT(tmp2, list); + } + + return true; +} +/** + * ice_find_dup_props_vsig - find VSI group with a specified set of properties + * @hw: pointer to the hardware structure + * @blk: HW block + * @chs: characteristic list + * @vsig: returns the VSIG with the matching profiles, if found + * + * Each VSIG is associated with a characteristic set; i.e. all VSIs under + * a group have the same characteristic set. To check if there exists a VSIG + * which has the same characteristics as the input characteristics; this + * function will iterate through the XLT2 list and return the VSIG that has a + * matching configuration. In order to make sure that priorities are accounted + * for, the list must match exactly, including the order in which the + * characteristics are listed. + */ +enum ice_status +ice_find_dup_props_vsig(struct ice_hw *hw, enum ice_block blk, + struct ice_vsig_prof_head *lst, uint16_t *vsig) +{ + struct ice_xlt2 *xlt2 = &hw->blk[blk].xlt2; + uint16_t i; + + for (i = 0; i < xlt2->count; i++) { + if (xlt2->vsig_tbl[i].in_use && + ice_match_prop_lst(lst, &xlt2->vsig_tbl[i].prop_lst)) { + *vsig = ICE_VSIG_VALUE(i, hw->pf_id); + return ICE_SUCCESS; + } + } + return ICE_ERR_DOES_NOT_EXIST; +} + +/** + * ice_rem_prof_id_flow - remove flow + * @hw: pointer to the HW struct + * @blk: hardware block + * @vsi: the VSI from which to remove the profile specified by ID + * @hdl: profile tracking handle + * + * Calling this function will update the hardware tables to remove the + * profile indicated by the ID parameter for the VSIs specified in the VSI + * array. Once successfully called, the flow will be disabled. + */ +enum ice_status +ice_rem_prof_id_flow(struct ice_hw *hw, enum ice_block blk, uint16_t vsi, + uint64_t hdl) +{ + struct ice_vsig_prof *tmp1, *del1; + struct ice_chs_chg *tmp, *del; + struct ice_chs_chg_head chg; + struct ice_vsig_prof_head copy; + enum ice_status status; + uint16_t vsig; + + TAILQ_INIT(©); + TAILQ_INIT(&chg); + + /* determine if VSI is already part of a VSIG */ + status = ice_vsig_find_vsi(hw, blk, vsi, &vsig); + if (!status && vsig) { + bool last_profile; + bool only_vsi; + uint16_t ref; + + /* found in VSIG */ + last_profile = ice_vsig_prof_id_count(hw, blk, vsig) == 1; + status = ice_vsig_get_ref(hw, blk, vsig, &ref); + if (status) + goto err_ice_rem_prof_id_flow; + only_vsi = (ref == 1); + + if (only_vsi) { + /* If the original VSIG only contains one reference, + * which will be the requesting VSI, then the VSI is not + * sharing entries and we can simply remove the specific + * characteristics from the VSIG. + */ + + if (last_profile) { + /* If there are no profiles left for this VSIG, + * then simply remove the VSIG. + */ + status = ice_rem_vsig(hw, blk, vsig, &chg); + if (status) + goto err_ice_rem_prof_id_flow; + } else { + status = ice_rem_prof_id_vsig(hw, blk, vsig, + hdl, &chg); + if (status) + goto err_ice_rem_prof_id_flow; + + /* Adjust priorities */ + status = ice_adj_prof_priorities(hw, blk, vsig, + &chg); + if (status) + goto err_ice_rem_prof_id_flow; + } + + } else { + /* Make a copy of the VSIG's list of Profiles */ + status = ice_get_profs_vsig(hw, blk, vsig, ©); + if (status) + goto err_ice_rem_prof_id_flow; + + /* Remove specified profile entry from the list */ + status = ice_rem_prof_from_list(hw, ©, hdl); + if (status) + goto err_ice_rem_prof_id_flow; + + if (TAILQ_EMPTY(©)) { + status = ice_move_vsi(hw, blk, vsi, + ICE_DEFAULT_VSIG, &chg); + if (status) + goto err_ice_rem_prof_id_flow; + + } else if (!ice_find_dup_props_vsig(hw, blk, ©, + &vsig)) { + /* found an exact match */ + /* add or move VSI to the VSIG that matches */ + /* Search for a VSIG with a matching profile + * list + */ + + /* Found match, move VSI to the matching VSIG */ + status = ice_move_vsi(hw, blk, vsi, vsig, &chg); + if (status) + goto err_ice_rem_prof_id_flow; + } else { + /* since no existing VSIG supports this + * characteristic pattern, we need to create a + * new VSIG and TCAM entries + */ + status = ice_create_vsig_from_lst(hw, blk, vsi, + ©, &vsig, + &chg); + if (status) + goto err_ice_rem_prof_id_flow; + + /* Adjust priorities */ + status = ice_adj_prof_priorities(hw, blk, vsig, + &chg); + if (status) + goto err_ice_rem_prof_id_flow; + } + } + } else { + status = ICE_ERR_DOES_NOT_EXIST; + } + + /* update hardware tables */ + if (!status) + status = ice_upd_prof_hw(hw, blk, &chg); + +err_ice_rem_prof_id_flow: + TAILQ_FOREACH_SAFE(del, &chg, list_entry, tmp) { + TAILQ_REMOVE(&chg, del, list_entry); + ice_free(hw, del); + } + + TAILQ_FOREACH_SAFE(del1, ©, list, tmp1) { + TAILQ_REMOVE(©, del1, list); + ice_free(hw, del1); + } + + return status; +} + +/** + * ice_flow_disassoc_prof - disassociate a VSI from a flow profile + * @hw: pointer to the hardware structure + * @blk: classification stage + * @prof: pointer to flow profile + * @vsi_handle: software VSI handle + * + * Assumption: the caller has acquired the lock to the profile list + * and the software VSI handle has been validated + */ +enum ice_status +ice_flow_disassoc_prof(struct ice_hw *hw, enum ice_block blk, + struct ice_flow_prof *prof, uint16_t vsi_handle) +{ + enum ice_status status = ICE_SUCCESS; + + if (ice_is_bit_set(prof->vsis, vsi_handle)) { + status = ice_rem_prof_id_flow(hw, blk, + hw->vsi_ctx[vsi_handle]->vsi_num, prof->id); + if (!status) + ice_clear_bit(vsi_handle, prof->vsis); + else + DNPRINTF(ICE_DBG_FLOW, + "%s: HW profile remove failed, %d\n", + __func__, status); + } + + return status; +} + +/** + * ice_flow_find_prof_id - Look up a profile with given profile ID + * @hw: pointer to the HW struct + * @blk: classification stage + * @prof_id: unique ID to identify this flow profile + */ +struct ice_flow_prof * +ice_flow_find_prof_id(struct ice_hw *hw, enum ice_block blk, uint64_t prof_id) +{ + struct ice_flow_prof *p; + + TAILQ_FOREACH(p, &hw->fl_profs[blk], l_entry) + if (p->id == prof_id) + return p; + + return NULL; +} + +/** + * ice_rem_flow_all - remove all flows with a particular profile + * @hw: pointer to the HW struct + * @blk: hardware block + * @id: profile tracking ID + */ +enum ice_status +ice_rem_flow_all(struct ice_hw *hw, enum ice_block blk, uint64_t id) +{ + struct ice_chs_chg *del, *tmp; + enum ice_status status; + struct ice_chs_chg_head chg; + uint16_t i; + + TAILQ_INIT(&chg); + + for (i = 1; i < ICE_MAX_VSIGS; i++) + if (hw->blk[blk].xlt2.vsig_tbl[i].in_use) { + if (ice_has_prof_vsig(hw, blk, i, id)) { + status = ice_rem_prof_id_vsig(hw, blk, i, id, + &chg); + if (status) + goto err_ice_rem_flow_all; + } + } + + status = ice_upd_prof_hw(hw, blk, &chg); + +err_ice_rem_flow_all: + TAILQ_FOREACH_SAFE(del, &chg, list_entry, tmp) { + TAILQ_REMOVE(&chg, del, list_entry); + ice_free(hw, del); + } + + return status; +} + +/** + * ice_prof_inc_ref - increment reference count for profile + * @hw: pointer to the HW struct + * @blk: the block from which to free the profile ID + * @prof_id: the profile ID for which to increment the reference count + */ +enum ice_status +ice_prof_inc_ref(struct ice_hw *hw, enum ice_block blk, uint8_t prof_id) +{ + if (prof_id > hw->blk[blk].es.count) + return ICE_ERR_PARAM; + + hw->blk[blk].es.ref_count[prof_id]++; + + return ICE_SUCCESS; +} + +/** + * ice_write_es - write an extraction sequence to hardware + * @hw: pointer to the HW struct + * @blk: the block in which to write the extraction sequence + * @prof_id: the profile ID to write + * @fv: pointer to the extraction sequence to write - NULL to clear extraction + */ +void +ice_write_es(struct ice_hw *hw, enum ice_block blk, uint8_t prof_id, + struct ice_fv_word *fv) +{ + uint16_t off; + + off = prof_id * hw->blk[blk].es.fvw; + if (!fv) { + memset(&hw->blk[blk].es.t[off], 0, hw->blk[blk].es.fvw * + sizeof(*fv)); + hw->blk[blk].es.written[prof_id] = false; + } else { + memcpy(&hw->blk[blk].es.t[off], fv, hw->blk[blk].es.fvw * + sizeof(*fv)); + } +} + +/** + * ice_prof_id_rsrc_type - get profile ID resource type for a block type + * @blk: the block type + * @rsrc_type: pointer to variable to receive the resource type + */ +bool +ice_prof_id_rsrc_type(enum ice_block blk, uint16_t *rsrc_type) +{ + switch (blk) { + case ICE_BLK_RSS: + *rsrc_type = ICE_AQC_RES_TYPE_HASH_PROF_BLDR_PROFID; + break; + case ICE_BLK_PE: + *rsrc_type = ICE_AQC_RES_TYPE_QHASH_PROF_BLDR_PROFID; + break; + default: + return false; + } + return true; +} + +/** + * ice_free_prof_id - free profile ID + * @hw: pointer to the HW struct + * @blk: the block from which to free the profile ID + * @prof_id: the profile ID to free + * + * This function frees a profile ID, which also corresponds to a Field Vector. + */ +enum ice_status +ice_free_prof_id(struct ice_hw *hw, enum ice_block blk, uint8_t prof_id) +{ + uint16_t tmp_prof_id = (uint16_t)prof_id; + uint16_t res_type; + + if (!ice_prof_id_rsrc_type(blk, &res_type)) + return ICE_ERR_PARAM; + + return ice_free_hw_res(hw, res_type, 1, &tmp_prof_id); +} + +/** + * ice_prof_dec_ref - decrement reference count for profile + * @hw: pointer to the HW struct + * @blk: the block from which to free the profile ID + * @prof_id: the profile ID for which to decrement the reference count + */ +enum ice_status +ice_prof_dec_ref(struct ice_hw *hw, enum ice_block blk, uint8_t prof_id) +{ + if (prof_id > hw->blk[blk].es.count) + return ICE_ERR_PARAM; + + if (hw->blk[blk].es.ref_count[prof_id] > 0) { + if (!--hw->blk[blk].es.ref_count[prof_id]) { + ice_write_es(hw, blk, prof_id, NULL); + return ice_free_prof_id(hw, blk, prof_id); + } + } + + return ICE_SUCCESS; +} + +/** + * ice_rem_prof - remove profile + * @hw: pointer to the HW struct + * @blk: hardware block + * @id: profile tracking ID + * + * This will remove the profile specified by the ID parameter, which was + * previously created through ice_add_prof. If any existing entries + * are associated with this profile, they will be removed as well. + */ +enum ice_status +ice_rem_prof(struct ice_hw *hw, enum ice_block blk, uint64_t id) +{ + struct ice_prof_map *pmap; + enum ice_status status; +#if 0 + ice_acquire_lock(&hw->blk[blk].es.prof_map_lock); +#endif + pmap = ice_search_prof_id(hw, blk, id); + if (!pmap) { + status = ICE_ERR_DOES_NOT_EXIST; + goto err_ice_rem_prof; + } + + /* remove all flows with this profile */ + status = ice_rem_flow_all(hw, blk, pmap->profile_cookie); + if (status) + goto err_ice_rem_prof; + + /* dereference profile, and possibly remove */ + ice_prof_dec_ref(hw, blk, pmap->prof_id); + + TAILQ_REMOVE(&hw->blk[blk].es.prof_map, pmap, list); + ice_free(hw, pmap); + +err_ice_rem_prof: +#if 0 + ice_release_lock(&hw->blk[blk].es.prof_map_lock); +#endif + return status; +} + +/** + * ice_flow_rem_prof_sync - remove a flow profile + * @hw: pointer to the hardware structure + * @blk: classification stage + * @prof: pointer to flow profile to remove + * + * Assumption: the caller has acquired the lock to the profile list + */ +enum ice_status +ice_flow_rem_prof_sync(struct ice_hw *hw, enum ice_block blk, + struct ice_flow_prof *prof) +{ + enum ice_status status; + + /* Remove all hardware profiles associated with this flow profile */ + status = ice_rem_prof(hw, blk, prof->id); + if (!status) { + TAILQ_REMOVE(&hw->fl_profs[blk], prof, l_entry); + ice_free(hw, prof); + } + + return status; +} + +/** + * ice_flow_rem_prof - Remove a flow profile and all entries associated with it + * @hw: pointer to the HW struct + * @blk: the block for which the flow profile is to be removed + * @prof_id: unique ID of the flow profile to be removed + */ +enum ice_status +ice_flow_rem_prof(struct ice_hw *hw, enum ice_block blk, uint64_t prof_id) +{ + struct ice_flow_prof *prof; + enum ice_status status; +#if 0 + ice_acquire_lock(&hw->fl_profs_locks[blk]); +#endif + prof = ice_flow_find_prof_id(hw, blk, prof_id); + if (!prof) { + status = ICE_ERR_DOES_NOT_EXIST; + goto out; + } + + /* prof becomes invalid after the call */ + status = ice_flow_rem_prof_sync(hw, blk, prof); + +out: +#if 0 + ice_release_lock(&hw->fl_profs_locks[blk]); +#endif + return status; +} + +/** + * ice_rem_vsi_rss_cfg - remove RSS configurations associated with VSI + * @hw: pointer to the hardware structure + * @vsi_handle: software VSI handle + * + * This function will iterate through all flow profiles and disassociate + * the VSI from that profile. If the flow profile has no VSIs it will + * be removed. + */ +enum ice_status +ice_rem_vsi_rss_cfg(struct ice_hw *hw, uint16_t vsi_handle) +{ + const enum ice_block blk = ICE_BLK_RSS; + struct ice_flow_prof *p, *t; + enum ice_status status = ICE_SUCCESS; + uint16_t vsig; + + if (!ice_is_vsi_valid(hw, vsi_handle)) + return ICE_ERR_PARAM; + + if (TAILQ_EMPTY(&hw->fl_profs[blk])) + return ICE_SUCCESS; +#if 0 + ice_acquire_lock(&hw->rss_locks); +#endif + TAILQ_FOREACH_SAFE(p, &hw->fl_profs[blk], l_entry, t) { + int ret; + + /* check if vsig is already removed */ + ret = ice_vsig_find_vsi(hw, blk, + hw->vsi_ctx[vsi_handle]->vsi_num, &vsig); + if (!ret && !vsig) + break; + + if (ice_is_bit_set(p->vsis, vsi_handle)) { + status = ice_flow_disassoc_prof(hw, blk, p, vsi_handle); + if (status) + break; + + if (!ice_is_any_bit_set(p->vsis, ICE_MAX_VSI)) { + status = ice_flow_rem_prof(hw, blk, p->id); + if (status) + break; + } + } + } +#if 0 + ice_release_lock(&hw->rss_locks); +#endif + return status; +} + +/** + * ice_rem_vsi_rss_list - remove VSI from RSS list + * @hw: pointer to the hardware structure + * @vsi_handle: software VSI handle + * + * Remove the VSI from all RSS configurations in the list. + */ +void +ice_rem_vsi_rss_list(struct ice_hw *hw, uint16_t vsi_handle) +{ + struct ice_rss_cfg *r, *tmp; + + if (TAILQ_EMPTY(&hw->rss_list_head)) + return; +#if 0 + ice_acquire_lock(&hw->rss_locks); +#endif + TAILQ_FOREACH_SAFE(r, &hw->rss_list_head, l_entry, tmp) { + if (ice_test_and_clear_bit(vsi_handle, r->vsis) && + !ice_is_any_bit_set(r->vsis, ICE_MAX_VSI)) { + TAILQ_REMOVE(&hw->rss_list_head, r, l_entry); + ice_free(hw, r); + } + } +#if 0 + ice_release_lock(&hw->rss_locks); +#endif +} + +/** + * ice_clean_vsi_rss_cfg - Cleanup RSS configuration for a given VSI + * @vsi: pointer to the VSI structure + * + * Cleanup the advanced RSS configuration for a given VSI. This is necessary + * during driver removal to ensure that all RSS resources are properly + * released. + * + * @remark this function doesn't report an error as it is expected to be + * called during driver reset and unload, and there isn't much the driver can + * do if freeing RSS resources fails. + */ +void +ice_clean_vsi_rss_cfg(struct ice_vsi *vsi) +{ + struct ice_softc *sc = vsi->sc; + struct ice_hw *hw = &sc->hw; + enum ice_status status; + + status = ice_rem_vsi_rss_cfg(hw, vsi->idx); + if (status) + printf("%s: Failed to remove RSS configuration for VSI %d, " + "err %s\n", sc->sc_dev.dv_xname, vsi->idx, + ice_status_str(status)); + + /* Remove this VSI from the RSS list */ + ice_rem_vsi_rss_list(hw, vsi->idx); +} + +/** + * ice_remove_vsi_mirroring -- Teardown any VSI mirroring rules + * @vsi: VSI to remove mirror rules from + */ +void +ice_remove_vsi_mirroring(struct ice_vsi *vsi) +{ +#if 0 + struct ice_hw *hw = &vsi->sc->hw; + enum ice_status status = ICE_SUCCESS; + bool keep_alloc = false; + + if (vsi->rule_mir_ingress != ICE_INVAL_MIRROR_RULE_ID) + status = ice_aq_delete_mir_rule(hw, vsi->rule_mir_ingress, keep_alloc, NULL); + + if (status) + device_printf(vsi->sc->dev, "Could not remove mirror VSI ingress rule, err %s aq_err %s\n", + ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status)); + + status = ICE_SUCCESS; + + if (vsi->rule_mir_egress != ICE_INVAL_MIRROR_RULE_ID) + status = ice_aq_delete_mir_rule(hw, vsi->rule_mir_egress, keep_alloc, NULL); + + if (status) + device_printf(vsi->sc->dev, "Could not remove mirror VSI egress rule, err %s aq_err %s\n", + ice_status_str(status), ice_aq_str(hw->adminq.sq_last_status)); +#else + printf("%s: not implemented\n", __func__); +#endif +} + +/** + * ice_sched_get_vsi_node - Get a VSI node based on VSI ID + * @pi: pointer to the port information structure + * @tc_node: pointer to the TC node + * @vsi_handle: software VSI handle + * + * This function retrieves a VSI node for a given VSI ID from a given + * TC branch + */ +struct ice_sched_node * +ice_sched_get_vsi_node(struct ice_port_info *pi, struct ice_sched_node *tc_node, + uint16_t vsi_handle) +{ + struct ice_sched_node *node; + uint8_t vsi_layer; + + vsi_layer = ice_sched_get_vsi_layer(pi->hw); + node = ice_sched_get_first_node(pi, tc_node, vsi_layer); + + /* Check whether it already exists */ + while (node) { + if (node->vsi_handle == vsi_handle) + return node; + node = node->sibling; + } + + return node; +} + +/** + * ice_sched_is_leaf_node_present - check for a leaf node in the sub-tree + * @node: pointer to the sub-tree node + * + * This function checks for a leaf node presence in a given sub-tree node. + */ +bool +ice_sched_is_leaf_node_present(struct ice_sched_node *node) +{ + uint8_t i; + + for (i = 0; i < node->num_children; i++) + if (ice_sched_is_leaf_node_present(node->children[i])) + return true; + /* check for a leaf node */ + return (node->info.data.elem_type == ICE_AQC_ELEM_TYPE_LEAF); +} + +/** + * ice_sched_rm_agg_vsi_info - remove aggregator related VSI info entry + * @pi: port information structure + * @vsi_handle: software VSI handle + * + * This function removes single aggregator VSI info entry from + * aggregator list. + */ +void +ice_sched_rm_agg_vsi_info(struct ice_port_info *pi, uint16_t vsi_handle) +{ +#if 0 + struct ice_sched_agg_info *agg_info; + struct ice_sched_agg_info *atmp; + + LIST_FOR_EACH_ENTRY_SAFE(agg_info, atmp, &pi->hw->agg_list, + ice_sched_agg_info, + list_entry) { + struct ice_sched_agg_vsi_info *agg_vsi_info; + struct ice_sched_agg_vsi_info *vtmp; + + LIST_FOR_EACH_ENTRY_SAFE(agg_vsi_info, vtmp, + &agg_info->agg_vsi_list, + ice_sched_agg_vsi_info, list_entry) + if (agg_vsi_info->vsi_handle == vsi_handle) { + LIST_DEL(&agg_vsi_info->list_entry); + ice_free(pi->hw, agg_vsi_info); + return; + } + } +#else + printf("%s: not implemented\n", __func__); +#endif +} + +/** + * ice_sched_rm_vsi_cfg - remove the VSI and its children nodes + * @pi: port information structure + * @vsi_handle: software VSI handle + * @owner: LAN or RDMA + * + * This function removes the VSI and its LAN or RDMA children nodes from the + * scheduler tree. + */ +enum ice_status +ice_sched_rm_vsi_cfg(struct ice_port_info *pi, uint16_t vsi_handle, + uint8_t owner) +{ + enum ice_status status = ICE_ERR_PARAM; + struct ice_vsi_ctx *vsi_ctx; + uint8_t i; + + DNPRINTF(ICE_DBG_SCHED, "%s: removing VSI %d\n", __func__, vsi_handle); + if (!ice_is_vsi_valid(pi->hw, vsi_handle)) + return status; +#if 0 + ice_acquire_lock(&pi->sched_lock); +#endif + vsi_ctx = ice_get_vsi_ctx(pi->hw, vsi_handle); + if (!vsi_ctx) + goto exit_sched_rm_vsi_cfg; + + ice_for_each_traffic_class(i) { + struct ice_sched_node *vsi_node, *tc_node; + uint8_t j = 0; + + tc_node = ice_sched_get_tc_node(pi, i); + if (!tc_node) + continue; + + vsi_node = ice_sched_get_vsi_node(pi, tc_node, vsi_handle); + if (!vsi_node) + continue; + + if (ice_sched_is_leaf_node_present(vsi_node)) { + DNPRINTF(ICE_DBG_SCHED, + "%s: VSI has leaf nodes in TC %d\n", __func__, i); + status = ICE_ERR_IN_USE; + goto exit_sched_rm_vsi_cfg; + } + while (j < vsi_node->num_children) { + if (vsi_node->children[j]->owner == owner) { + ice_free_sched_node(pi, vsi_node->children[j]); + + /* reset the counter again since the num + * children will be updated after node removal + */ + j = 0; + } else { + j++; + } + } + /* remove the VSI if it has no children */ + if (!vsi_node->num_children) { + ice_free_sched_node(pi, vsi_node); + vsi_ctx->sched.vsi_node[i] = NULL; + + /* clean up aggregator related VSI info if any */ + ice_sched_rm_agg_vsi_info(pi, vsi_handle); + } + if (owner == ICE_SCHED_NODE_OWNER_LAN) + vsi_ctx->sched.max_lanq[i] = 0; + else + vsi_ctx->sched.max_rdmaq[i] = 0; + } + status = ICE_SUCCESS; + +exit_sched_rm_vsi_cfg: +#if 0 + ice_release_lock(&pi->sched_lock); +#endif + return status; +} + +/** + * ice_rm_vsi_lan_cfg - remove VSI and its LAN children nodes + * @pi: port information structure + * @vsi_handle: software VSI handle + * + * This function clears the VSI and its LAN children nodes from scheduler tree + * for all TCs. + */ +enum ice_status +ice_rm_vsi_lan_cfg(struct ice_port_info *pi, uint16_t vsi_handle) +{ + return ice_sched_rm_vsi_cfg(pi, vsi_handle, ICE_SCHED_NODE_OWNER_LAN); +} + +/** + * ice_aq_free_vsi + * @hw: pointer to the HW struct + * @vsi_ctx: pointer to a VSI context struct + * @keep_vsi_alloc: keep VSI allocation as part of this PF's resources + * @cd: pointer to command details structure or NULL + * + * Free VSI context info from hardware (0x0213) + */ +enum ice_status +ice_aq_free_vsi(struct ice_hw *hw, struct ice_vsi_ctx *vsi_ctx, + bool keep_vsi_alloc, struct ice_sq_cd *cd) +{ + struct ice_aqc_add_update_free_vsi_resp *resp; + struct ice_aqc_add_get_update_free_vsi *cmd; + struct ice_aq_desc desc; + enum ice_status status; + + cmd = &desc.params.vsi_cmd; + resp = &desc.params.add_update_free_vsi_res; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_free_vsi); + + cmd->vsi_num = htole16(vsi_ctx->vsi_num | ICE_AQ_VSI_IS_VALID); + if (keep_vsi_alloc) + cmd->cmd_flags = htole16(ICE_AQ_VSI_KEEP_ALLOC); + + status = ice_aq_send_cmd(hw, &desc, NULL, 0, cd); + if (!status) { + vsi_ctx->vsis_allocd = le16toh(resp->vsi_used); + vsi_ctx->vsis_unallocated = le16toh(resp->vsi_free); + } + + return status; +} + +/** + * ice_clear_vsi_q_ctx - clear VSI queue contexts for all TCs + * @hw: pointer to the HW struct + * @vsi_handle: VSI handle + */ +void +ice_clear_vsi_q_ctx(struct ice_hw *hw, uint16_t vsi_handle) +{ + struct ice_vsi_ctx *vsi; + uint8_t i; + + vsi = ice_get_vsi_ctx(hw, vsi_handle); + if (!vsi) + return; + ice_for_each_traffic_class(i) { + if (vsi->lan_q_ctx[i]) { + ice_free(hw, vsi->lan_q_ctx[i]); + vsi->lan_q_ctx[i] = NULL; + } + if (vsi->rdma_q_ctx[i]) { + ice_free(hw, vsi->rdma_q_ctx[i]); + vsi->rdma_q_ctx[i] = NULL; + } + } +} + +/** + * ice_clear_vsi_ctx - clear the VSI context entry + * @hw: pointer to the HW struct + * @vsi_handle: VSI handle + * + * clear the VSI context entry + */ +void +ice_clear_vsi_ctx(struct ice_hw *hw, uint16_t vsi_handle) +{ + struct ice_vsi_ctx *vsi; + + vsi = ice_get_vsi_ctx(hw, vsi_handle); + if (vsi) { + ice_clear_vsi_q_ctx(hw, vsi_handle); + ice_free(hw, vsi); + hw->vsi_ctx[vsi_handle] = NULL; + } +} + +/** + * ice_free_vsi- free VSI context from hardware and VSI handle list + * @hw: pointer to the HW struct + * @vsi_handle: unique VSI handle + * @vsi_ctx: pointer to a VSI context struct + * @keep_vsi_alloc: keep VSI allocation as part of this PF's resources + * @cd: pointer to command details structure or NULL + * + * Free VSI context info from hardware as well as from VSI handle list + */ +enum ice_status +ice_free_vsi(struct ice_hw *hw, uint16_t vsi_handle, + struct ice_vsi_ctx *vsi_ctx, bool keep_vsi_alloc, struct ice_sq_cd *cd) +{ + enum ice_status status; + + if (!ice_is_vsi_valid(hw, vsi_handle)) + return ICE_ERR_PARAM; + vsi_ctx->vsi_num = hw->vsi_ctx[vsi_handle]->vsi_num; + status = ice_aq_free_vsi(hw, vsi_ctx, keep_vsi_alloc, cd); + if (!status) + ice_clear_vsi_ctx(hw, vsi_handle); + return status; +} + +/** + * ice_deinit_vsi - Tell firmware to release resources for a VSI + * @vsi: the VSI to release + * + * Helper function which requests the firmware to release the hardware + * resources associated with a given VSI. + */ +void +ice_deinit_vsi(struct ice_vsi *vsi) +{ + struct ice_vsi_ctx ctx = { 0 }; + struct ice_softc *sc = vsi->sc; + struct ice_hw *hw = &sc->hw; + enum ice_status status; + + /* Assert that the VSI pointer matches in the list */ + KASSERT(vsi == sc->all_vsi[vsi->idx]); + + ctx.info = vsi->info; + + status = ice_rm_vsi_lan_cfg(hw->port_info, vsi->idx); + if (status) { + /* + * This should only fail if the VSI handle is invalid, or if + * any of the nodes have leaf nodes which are still in use. + */ + printf("%s: Unable to remove scheduler nodes for VSI %d, " + "err %s\n", sc->sc_dev.dv_xname, vsi->idx, + ice_status_str(status)); + } + + /* Tell firmware to release the VSI resources */ + status = ice_free_vsi(hw, vsi->idx, &ctx, false, NULL); + if (status != 0) { + printf("%s: Free VSI %u AQ call failed, err %s aq_err %s\n", + sc->sc_dev.dv_xname, vsi->idx, ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + } +} + +/** + * ice_free_vsi_qmaps - Free the PF qmaps associated with a VSI + * @vsi: the VSI private structure + * + * Frees the PF qmaps associated with the given VSI. Generally this will be + * called by ice_release_vsi, but may need to be called during attach cleanup, + * depending on when the qmaps were allocated. + */ +void +ice_free_vsi_qmaps(struct ice_vsi *vsi) +{ + struct ice_softc *sc = vsi->sc; + + if (vsi->tx_qmap) { + ice_resmgr_release_map(&sc->tx_qmgr, vsi->tx_qmap, + vsi->num_tx_queues); + free(vsi->tx_qmap, M_DEVBUF, + vsi->num_tx_queues * sizeof(uint16_t)); + vsi->tx_qmap = NULL; + } + + if (vsi->rx_qmap) { + ice_resmgr_release_map(&sc->rx_qmgr, vsi->rx_qmap, + vsi->num_rx_queues); + free(vsi->rx_qmap, M_DEVBUF, + vsi->num_rx_queues * sizeof(uint16_t)); + vsi->rx_qmap = NULL; + } +} + +/** + * ice_release_vsi - Release resources associated with a VSI + * @vsi: the VSI to release + * + * Release software and firmware resources associated with a VSI. Release the + * queue managers associated with this VSI. Also free the VSI structure memory + * if the VSI was allocated dynamically using ice_alloc_vsi(). + */ +void +ice_release_vsi(struct ice_vsi *vsi) +{ + struct ice_softc *sc = vsi->sc; + int idx = vsi->idx; + + /* Assert that the VSI pointer matches in the list */ + KASSERT(vsi == sc->all_vsi[idx]); + + /* Cleanup RSS configuration */ + if (ice_is_bit_set(sc->feat_en, ICE_FEATURE_RSS)) + ice_clean_vsi_rss_cfg(vsi); +#if 0 + ice_del_vsi_sysctl_ctx(vsi); +#endif + /* Remove the configured mirror rule, if it exists */ + ice_remove_vsi_mirroring(vsi); + + /* + * If we unload the driver after a reset fails, we do not need to do + * this step. + */ + if (!ice_test_state(&sc->state, ICE_STATE_RESET_FAILED)) + ice_deinit_vsi(vsi); + + ice_free_vsi_qmaps(vsi); + + if (vsi->dynamic) + free(sc->all_vsi[idx], M_DEVBUF, sizeof(struct ice_vsi)); + + sc->all_vsi[idx] = NULL; +} + +/** + * ice_transition_recovery_mode - Transition to recovery mode + * @sc: the device private softc + * + * Called when the driver detects that the firmware has entered recovery mode + * at run time. + */ +void +ice_transition_recovery_mode(struct ice_softc *sc) +{ +#if 0 + struct ice_vsi *vsi = &sc->pf_vsi; +#endif + struct ifnet *ifp = &sc->sc_ac.ac_if; + int i; + + printf("%s: firmware has switched into recovery mode", + sc->sc_dev.dv_xname); + + /* Tell the stack that the link has gone down */ + ifp->if_link_state = LINK_STATE_DOWN; + if_link_state_change(ifp); +#if 0 + ice_rdma_pf_detach(sc); +#endif + ice_clear_bit(ICE_FEATURE_RDMA, sc->feat_cap); + + ice_clear_bit(ICE_FEATURE_SRIOV, sc->feat_en); + ice_clear_bit(ICE_FEATURE_SRIOV, sc->feat_cap); +#if 0 + ice_vsi_del_txqs_ctx(vsi); + ice_vsi_del_rxqs_ctx(vsi); +#endif + for (i = 0; i < sc->num_available_vsi; i++) { + if (sc->all_vsi[i]) + ice_release_vsi(sc->all_vsi[i]); + } + + if (sc->all_vsi) { + free(sc->all_vsi, M_DEVBUF, + sc->num_available_vsi * sizeof(struct ice_vsi *)); + sc->all_vsi = NULL; + } + sc->num_available_vsi = 0; + + /* Destroy the interrupt manager */ + ice_resmgr_destroy(&sc->dev_imgr); + /* Destroy the queue managers */ + ice_resmgr_destroy(&sc->tx_qmgr); + ice_resmgr_destroy(&sc->rx_qmgr); + + ice_deinit_hw(&sc->hw); +} + +/** + * ice_clear_hw_tbls - clear HW tables and flow profiles + * @hw: pointer to the hardware structure + */ +void +ice_clear_hw_tbls(struct ice_hw *hw) +{ + uint8_t i; + + for (i = 0; i < ICE_BLK_COUNT; i++) { + struct ice_prof_redir *prof_redir = &hw->blk[i].prof_redir; + struct ice_prof_tcam *prof = &hw->blk[i].prof; + struct ice_xlt1 *xlt1 = &hw->blk[i].xlt1; + struct ice_xlt2 *xlt2 = &hw->blk[i].xlt2; + struct ice_es *es = &hw->blk[i].es; + + if (hw->blk[i].is_list_init) { + ice_free_prof_map(hw, i); + ice_free_flow_profs(hw, i); + } + + ice_free_vsig_tbl(hw, (enum ice_block)i); + + if (xlt1->ptypes) + memset(xlt1->ptypes, 0, + xlt1->count * sizeof(*xlt1->ptypes)); + + if (xlt1->ptg_tbl) + memset(xlt1->ptg_tbl, 0, + ICE_MAX_PTGS * sizeof(*xlt1->ptg_tbl)); + + if (xlt1->t) + memset(xlt1->t, 0, xlt1->count * sizeof(*xlt1->t)); + + if (xlt2->vsis) + memset(xlt2->vsis, 0, + xlt2->count * sizeof(*xlt2->vsis)); + + if (xlt2->vsig_tbl) + memset(xlt2->vsig_tbl, 0, + xlt2->count * sizeof(*xlt2->vsig_tbl)); + + if (xlt2->t) + memset(xlt2->t, 0, xlt2->count * sizeof(*xlt2->t)); + + if (prof->t) + memset(prof->t, 0, prof->count * sizeof(*prof->t)); + + if (prof_redir->t) + memset(prof_redir->t, 0, + prof_redir->count * sizeof(*prof_redir->t)); + + if (es->t) + memset(es->t, 0, es->count * sizeof(*es->t) * es->fvw); + + if (es->ref_count) + memset(es->ref_count, 0, + es->count * sizeof(*es->ref_count)); + + if (es->written) + memset(es->written, 0, + es->count * sizeof(*es->written)); + + } +} + +/** + * ice_prepare_for_reset - Prepare device for an impending reset + * @sc: The device private softc + * + * Prepare the driver for an impending reset, shutting down VSIs, clearing the + * scheduler setup, and shutting down controlqs. Uses the + * ICE_STATE_PREPARED_FOR_RESET to indicate whether we've already prepared the + * driver for reset or not. + */ +void +ice_prepare_for_reset(struct ice_softc *sc) +{ + struct ice_hw *hw = &sc->hw; + + /* If we're already prepared, there's nothing to do */ + if (ice_testandset_state(&sc->state, ICE_STATE_PREPARED_FOR_RESET)) + return; + + DPRINTF("%s: preparing to reset device\n", sc->sc_dev.dv_xname); + + /* In recovery mode, hardware is not initialized */ + if (ice_test_state(&sc->state, ICE_STATE_RECOVERY_MODE)) + return; +#if 0 + /* inform the RDMA client */ + ice_rdma_notify_reset(sc); + /* stop the RDMA client */ + ice_rdma_pf_stop(sc); +#endif + /* Release the main PF VSI queue mappings */ + ice_resmgr_release_map(&sc->tx_qmgr, sc->pf_vsi.tx_qmap, + sc->pf_vsi.num_tx_queues); + ice_resmgr_release_map(&sc->rx_qmgr, sc->pf_vsi.rx_qmap, + sc->pf_vsi.num_rx_queues); +#if 0 + if (sc->mirr_if) { + ice_resmgr_release_map(&sc->tx_qmgr, sc->mirr_if->vsi->tx_qmap, + sc->mirr_if->num_irq_vectors); + ice_resmgr_release_map(&sc->rx_qmgr, sc->mirr_if->vsi->rx_qmap, + sc->mirr_if->num_irq_vectors); + } +#endif + ice_clear_hw_tbls(hw); + + if (hw->port_info) + ice_sched_cleanup_all(hw); + + ice_shutdown_all_ctrlq(hw, false); +} + +/** + * ice_configure_misc_interrupts - enable 'other' interrupt causes + * @sc: pointer to device private softc + * + * Enable various "other" interrupt causes, and associate them to interrupt 0, + * which is our administrative interrupt. + */ +void +ice_configure_misc_interrupts(struct ice_softc *sc) +{ + struct ice_hw *hw = &sc->hw; + uint32_t val; + + /* Read the OICR register to clear it */ + ICE_READ(hw, PFINT_OICR); + + /* Enable useful "other" interrupt causes */ + val = (PFINT_OICR_ECC_ERR_M | + PFINT_OICR_MAL_DETECT_M | + PFINT_OICR_GRST_M | + PFINT_OICR_PCI_EXCEPTION_M | + PFINT_OICR_VFLR_M | + PFINT_OICR_HMC_ERR_M | + PFINT_OICR_PE_CRITERR_M); + + ICE_WRITE(hw, PFINT_OICR_ENA, val); + + /* Note that since we're using MSI-X index 0, and ITR index 0, we do + * not explicitly program them when writing to the PFINT_*_CTL + * registers. Nevertheless, these writes are associating the + * interrupts with the ITR 0 vector + */ + + /* Associate the OICR interrupt with ITR 0, and enable it */ + ICE_WRITE(hw, PFINT_OICR_CTL, PFINT_OICR_CTL_CAUSE_ENA_M); + + /* Associate the Mailbox interrupt with ITR 0, and enable it */ + ICE_WRITE(hw, PFINT_MBX_CTL, PFINT_MBX_CTL_CAUSE_ENA_M); + + /* Associate the AdminQ interrupt with ITR 0, and enable it */ + ICE_WRITE(hw, PFINT_FW_CTL, PFINT_FW_CTL_CAUSE_ENA_M); +} + +void +ice_request_stack_reinit(struct ice_softc *sc) +{ + printf("%s: not implemented\n", __func__); +} + +/** + * ice_rebuild_recovery_mode - Rebuild driver state while in recovery mode + * @sc: The device private softc + * + * Handle a driver rebuild while in recovery mode. This will only rebuild the + * limited functionality supported while in recovery mode. + */ +void +ice_rebuild_recovery_mode(struct ice_softc *sc) +{ +#if 0 + /* enable PCIe bus master */ + pci_enable_busmaster(dev); +#endif + /* Configure interrupt causes for the administrative interrupt */ + ice_configure_misc_interrupts(sc); + + /* Enable ITR 0 right away, so that we can handle admin interrupts */ + ice_enable_intr(&sc->hw, 0); + + /* Rebuild is finished. We're no longer prepared to reset */ + ice_clear_state(&sc->state, ICE_STATE_PREPARED_FOR_RESET); + + printf("%s: device rebuild successful\n", sc->sc_dev.dv_xname); + + /* In order to completely restore device functionality, the iflib core + * needs to be reset. We need to request an iflib reset. Additionally, + * because the state of IFC_DO_RESET is cached within task_fn_admin in + * the iflib core, we also want re-run the admin task so that iflib + * resets immediately instead of waiting for the next interrupt. + */ + + ice_request_stack_reinit(sc); +} + +/** + * ice_clean_all_vsi_rss_cfg - Cleanup RSS configuration for all VSIs + * @sc: the device softc pointer + * + * Cleanup the advanced RSS configuration for all VSIs on a given PF + * interface. + * + * @remark This should be called while preparing for a reset, to cleanup stale + * RSS configuration for all VSIs. + */ +void +ice_clean_all_vsi_rss_cfg(struct ice_softc *sc) +{ + int i; + + /* No need to cleanup if RSS is not enabled */ + if (!ice_is_bit_set(sc->feat_en, ICE_FEATURE_RSS)) + return; + + for (i = 0; i < sc->num_available_vsi; i++) { + struct ice_vsi *vsi = sc->all_vsi[i]; + + if (vsi) + ice_clean_vsi_rss_cfg(vsi); + } +} + +/** + * ice_reset_pf_stats - Reset port stats counters + * @sc: Device private softc structure + * + * Reset software tracking values for statistics to zero, and indicate that + * offsets haven't been loaded. Intended to be called after a device reset so + * that statistics count from zero again. + */ +void +ice_reset_pf_stats(struct ice_softc *sc) +{ + memset(&sc->stats.prev, 0, sizeof(sc->stats.prev)); + memset(&sc->stats.cur, 0, sizeof(sc->stats.cur)); + sc->stats.offsets_loaded = false; +} + +/** + * ice_rebuild_pf_vsi_qmap - Rebuild the main PF VSI queue mapping + * @sc: the device softc pointer + * + * Loops over the Tx and Rx queues for the main PF VSI and reassigns the queue + * mapping after a reset occurred. + */ +int +ice_rebuild_pf_vsi_qmap(struct ice_softc *sc) +{ + struct ice_vsi *vsi = &sc->pf_vsi; + struct ice_tx_queue *txq; + struct ice_rx_queue *rxq; + int err, i; + + /* Re-assign Tx queues from PF space to the main VSI */ + err = ice_resmgr_assign_contiguous(&sc->tx_qmgr, vsi->tx_qmap, + vsi->num_tx_queues); + if (err) { + printf("%s: Unable to re-assign PF Tx queues: %d\n", + sc->sc_dev.dv_xname, err); + return (err); + } + + /* Re-assign Rx queues from PF space to this VSI */ + err = ice_resmgr_assign_contiguous(&sc->rx_qmgr, vsi->rx_qmap, + vsi->num_rx_queues); + if (err) { + printf("%s: Unable to re-assign PF Rx queues: %d\n", + sc->sc_dev.dv_xname, err); + goto err_release_tx_queues; + } + + vsi->qmap_type = ICE_RESMGR_ALLOC_CONTIGUOUS; + + /* Re-assign Tx queue tail pointers */ + for (i = 0, txq = vsi->tx_queues; i < vsi->num_tx_queues; i++, txq++) + txq->tail = QTX_COMM_DBELL(vsi->tx_qmap[i]); + + /* Re-assign Rx queue tail pointers */ + for (i = 0, rxq = vsi->rx_queues; i < vsi->num_rx_queues; i++, rxq++) + rxq->tail = QRX_TAIL(vsi->rx_qmap[i]); + + return (0); + +err_release_tx_queues: + ice_resmgr_release_map(&sc->tx_qmgr, sc->pf_vsi.tx_qmap, + sc->pf_vsi.num_tx_queues); + + return (err); +} + +#define ICE_UP_TABLE_TRANSLATE(val, i) \ + (((val) << ICE_AQ_VSI_UP_TABLE_UP##i##_S) & \ + ICE_AQ_VSI_UP_TABLE_UP##i##_M) + +/** + * ice_set_default_vsi_ctx - Setup default VSI context parameters + * @ctx: the VSI context to initialize + * + * Initialize and prepare a default VSI context for configuring a new VSI. + */ +void +ice_set_default_vsi_ctx(struct ice_vsi_ctx *ctx) +{ + uint32_t table = 0; + + memset(&ctx->info, 0, sizeof(ctx->info)); + /* VSI will be allocated from shared pool */ + ctx->alloc_from_pool = true; + /* Enable source pruning by default */ + ctx->info.sw_flags = ICE_AQ_VSI_SW_FLAG_SRC_PRUNE; + /* Traffic from VSI can be sent to LAN */ + ctx->info.sw_flags2 = ICE_AQ_VSI_SW_FLAG_LAN_ENA; + /* Allow all packets untagged/tagged */ + ctx->info.inner_vlan_flags = ((ICE_AQ_VSI_INNER_VLAN_TX_MODE_ALL & + ICE_AQ_VSI_INNER_VLAN_TX_MODE_M) >> + ICE_AQ_VSI_INNER_VLAN_TX_MODE_S); + /* Show VLAN/UP from packets in Rx descriptors */ + ctx->info.inner_vlan_flags |= ((ICE_AQ_VSI_INNER_VLAN_EMODE_STR_BOTH & + ICE_AQ_VSI_INNER_VLAN_EMODE_M) >> + ICE_AQ_VSI_INNER_VLAN_EMODE_S); + /* Have 1:1 UP mapping for both ingress/egress tables */ + table |= ICE_UP_TABLE_TRANSLATE(0, 0); + table |= ICE_UP_TABLE_TRANSLATE(1, 1); + table |= ICE_UP_TABLE_TRANSLATE(2, 2); + table |= ICE_UP_TABLE_TRANSLATE(3, 3); + table |= ICE_UP_TABLE_TRANSLATE(4, 4); + table |= ICE_UP_TABLE_TRANSLATE(5, 5); + table |= ICE_UP_TABLE_TRANSLATE(6, 6); + table |= ICE_UP_TABLE_TRANSLATE(7, 7); + ctx->info.ingress_table = htole32(table); + ctx->info.egress_table = htole32(table); + /* Have 1:1 UP mapping for outer to inner UP table */ + ctx->info.outer_up_table = htole32(table); + /* No Outer tag support, so outer_vlan_flags remains zero */ +} + +/** + * ice_set_rss_vsi_ctx - Setup VSI context parameters for RSS + * @ctx: the VSI context to configure + * @type: the VSI type + * + * Configures the VSI context for RSS, based on the VSI type. + */ +void +ice_set_rss_vsi_ctx(struct ice_vsi_ctx *ctx, enum ice_vsi_type type) +{ + uint8_t lut_type, hash_type; + + switch (type) { + case ICE_VSI_PF: + lut_type = ICE_AQ_VSI_Q_OPT_RSS_LUT_PF; + hash_type = ICE_AQ_VSI_Q_OPT_RSS_TPLZ; + break; + case ICE_VSI_VF: + case ICE_VSI_VMDQ2: + lut_type = ICE_AQ_VSI_Q_OPT_RSS_LUT_VSI; + hash_type = ICE_AQ_VSI_Q_OPT_RSS_TPLZ; + break; + default: + /* Other VSI types do not support RSS */ + return; + } + + ctx->info.q_opt_rss = (((lut_type << ICE_AQ_VSI_Q_OPT_RSS_LUT_S) & + ICE_AQ_VSI_Q_OPT_RSS_LUT_M) | + ((hash_type << ICE_AQ_VSI_Q_OPT_RSS_HASH_S) & + ICE_AQ_VSI_Q_OPT_RSS_HASH_M)); +} + +/** + * ice_vsi_set_rss_params - Set the RSS parameters for the VSI + * @vsi: the VSI to configure + * + * Sets the RSS table size and lookup table type for the VSI based on its + * VSI type. + */ +void +ice_vsi_set_rss_params(struct ice_vsi *vsi) +{ + struct ice_softc *sc = vsi->sc; + struct ice_hw_common_caps *cap; + + cap = &sc->hw.func_caps.common_cap; + + switch (vsi->type) { + case ICE_VSI_PF: + /* The PF VSI inherits RSS instance of the PF */ + vsi->rss_table_size = cap->rss_table_size; + vsi->rss_lut_type = ICE_LUT_PF; + break; + case ICE_VSI_VF: + case ICE_VSI_VMDQ2: + vsi->rss_table_size = ICE_VSIQF_HLUT_ARRAY_SIZE; + vsi->rss_lut_type = ICE_LUT_VSI; + break; + default: + DPRINTF("%s: VSI %d: RSS not supported for VSI type %d\n", + __func__, vsi->idx, vsi->type); + break; + } +} + +/** + * ice_setup_vsi_qmap - Setup the queue mapping for a VSI + * @vsi: the VSI to configure + * @ctx: the VSI context to configure + * + * Configures the context for the given VSI, setting up how the firmware + * should map the queues for this VSI. + * + * @pre vsi->qmap_type is set to a valid type + */ +int +ice_setup_vsi_qmap(struct ice_vsi *vsi, struct ice_vsi_ctx *ctx) +{ + int pow = 0; + uint16_t qmap; + + KASSERT(vsi->rx_qmap != NULL); + + switch (vsi->qmap_type) { + case ICE_RESMGR_ALLOC_CONTIGUOUS: + ctx->info.mapping_flags |= htole16(ICE_AQ_VSI_Q_MAP_CONTIG); + + ctx->info.q_mapping[0] = htole16(vsi->rx_qmap[0]); + ctx->info.q_mapping[1] = htole16(vsi->num_rx_queues); + + break; + case ICE_RESMGR_ALLOC_SCATTERED: + ctx->info.mapping_flags |= htole16(ICE_AQ_VSI_Q_MAP_NONCONTIG); + + for (int i = 0; i < vsi->num_rx_queues; i++) + ctx->info.q_mapping[i] = htole16(vsi->rx_qmap[i]); + break; + default: + return (EOPNOTSUPP); + } + + /* Calculate the next power-of-2 of number of queues */ + if (vsi->num_rx_queues) + pow = flsl(vsi->num_rx_queues - 1); + + /* Assign all the queues to traffic class zero */ + qmap = (pow << ICE_AQ_VSI_TC_Q_NUM_S) & ICE_AQ_VSI_TC_Q_NUM_M; + ctx->info.tc_mapping[0] = htole16(qmap); + + /* Fill out default driver TC queue info for VSI */ + vsi->tc_info[0].qoffset = 0; + vsi->tc_info[0].qcount_rx = vsi->num_rx_queues; + vsi->tc_info[0].qcount_tx = vsi->num_tx_queues; + for (int i = 1; i < ICE_MAX_TRAFFIC_CLASS; i++) { + vsi->tc_info[i].qoffset = 0; + vsi->tc_info[i].qcount_rx = 1; + vsi->tc_info[i].qcount_tx = 1; + } + vsi->tc_map = 0x1; + + return 0; +} + +/** + * ice_aq_add_vsi + * @hw: pointer to the HW struct + * @vsi_ctx: pointer to a VSI context struct + * @cd: pointer to command details structure or NULL + * + * Add a VSI context to the hardware (0x0210) + */ +enum ice_status +ice_aq_add_vsi(struct ice_hw *hw, struct ice_vsi_ctx *vsi_ctx, + struct ice_sq_cd *cd) +{ + struct ice_aqc_add_update_free_vsi_resp *res; + struct ice_aqc_add_get_update_free_vsi *cmd; + struct ice_aq_desc desc; + enum ice_status status; + + cmd = &desc.params.vsi_cmd; + res = &desc.params.add_update_free_vsi_res; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_add_vsi); + + if (!vsi_ctx->alloc_from_pool) + cmd->vsi_num = htole16(vsi_ctx->vsi_num | + ICE_AQ_VSI_IS_VALID); + cmd->vf_id = vsi_ctx->vf_num; + + cmd->vsi_flags = htole16(vsi_ctx->flags); + + desc.flags |= htole16(ICE_AQ_FLAG_RD); + + status = ice_aq_send_cmd(hw, &desc, &vsi_ctx->info, + sizeof(vsi_ctx->info), cd); + + if (!status) { + vsi_ctx->vsi_num = le16toh(res->vsi_num) & ICE_AQ_VSI_NUM_M; + vsi_ctx->vsis_allocd = le16toh(res->vsi_used); + vsi_ctx->vsis_unallocated = le16toh(res->vsi_free); + } + + return status; +} + +/** + * ice_add_vsi - add VSI context to the hardware and VSI handle list + * @hw: pointer to the HW struct + * @vsi_handle: unique VSI handle provided by drivers + * @vsi_ctx: pointer to a VSI context struct + * @cd: pointer to command details structure or NULL + * + * Add a VSI context to the hardware also add it into the VSI handle list. + * If this function gets called after reset for existing VSIs then update + * with the new HW VSI number in the corresponding VSI handle list entry. + */ +enum ice_status +ice_add_vsi(struct ice_hw *hw, uint16_t vsi_handle, struct ice_vsi_ctx *vsi_ctx, + struct ice_sq_cd *cd) +{ + struct ice_vsi_ctx *tmp_vsi_ctx; + enum ice_status status; + + if (vsi_handle >= ICE_MAX_VSI) + return ICE_ERR_PARAM; + status = ice_aq_add_vsi(hw, vsi_ctx, cd); + if (status) + return status; + tmp_vsi_ctx = ice_get_vsi_ctx(hw, vsi_handle); + if (!tmp_vsi_ctx) { + /* Create a new VSI context */ + tmp_vsi_ctx = (struct ice_vsi_ctx *) + ice_malloc(hw, sizeof(*tmp_vsi_ctx)); + if (!tmp_vsi_ctx) { + ice_aq_free_vsi(hw, vsi_ctx, false, cd); + return ICE_ERR_NO_MEMORY; + } + *tmp_vsi_ctx = *vsi_ctx; + + hw->vsi_ctx[vsi_handle] = tmp_vsi_ctx; + } else { + /* update with new HW VSI num */ + tmp_vsi_ctx->vsi_num = vsi_ctx->vsi_num; + } + + return ICE_SUCCESS; +} + +/** + * ice_aq_suspend_sched_elems - suspend scheduler elements + * @hw: pointer to the HW struct + * @elems_req: number of elements to suspend + * @buf: pointer to buffer + * @buf_size: buffer size in bytes + * @elems_ret: returns total number of elements suspended + * @cd: pointer to command details structure or NULL + * + * Suspend scheduling elements (0x0409) + */ +enum ice_status +ice_aq_suspend_sched_elems(struct ice_hw *hw, uint16_t elems_req, uint32_t *buf, + uint16_t buf_size, uint16_t *elems_ret, struct ice_sq_cd *cd) +{ + return ice_aqc_send_sched_elem_cmd(hw, ice_aqc_opc_suspend_sched_elems, + elems_req, (void *)buf, buf_size, + elems_ret, cd); +} + +/** + * ice_aq_resume_sched_elems - resume scheduler elements + * @hw: pointer to the HW struct + * @elems_req: number of elements to resume + * @buf: pointer to buffer + * @buf_size: buffer size in bytes + * @elems_ret: returns total number of elements resumed + * @cd: pointer to command details structure or NULL + * + * resume scheduling elements (0x040A) + */ +enum ice_status +ice_aq_resume_sched_elems(struct ice_hw *hw, uint16_t elems_req, uint32_t *buf, + uint16_t buf_size, uint16_t *elems_ret, struct ice_sq_cd *cd) +{ + return ice_aqc_send_sched_elem_cmd(hw, ice_aqc_opc_resume_sched_elems, + elems_req, (void *)buf, buf_size, + elems_ret, cd); +} + +/** + * ice_sched_suspend_resume_elems - suspend or resume HW nodes + * @hw: pointer to the HW struct + * @num_nodes: number of nodes + * @node_teids: array of node teids to be suspended or resumed + * @suspend: true means suspend / false means resume + * + * This function suspends or resumes HW nodes + */ +enum ice_status +ice_sched_suspend_resume_elems(struct ice_hw *hw, uint8_t num_nodes, + uint32_t *node_teids, bool suspend) +{ + uint16_t i, buf_size, num_elem_ret = 0; + enum ice_status status; + uint32_t *buf; + + buf_size = sizeof(*buf) * num_nodes; + buf = (uint32_t *)ice_malloc(hw, buf_size); + if (!buf) + return ICE_ERR_NO_MEMORY; + + for (i = 0; i < num_nodes; i++) + buf[i] = htole32(node_teids[i]); + + if (suspend) + status = ice_aq_suspend_sched_elems(hw, num_nodes, buf, + buf_size, &num_elem_ret, + NULL); + else + status = ice_aq_resume_sched_elems(hw, num_nodes, buf, + buf_size, &num_elem_ret, + NULL); + if (status != ICE_SUCCESS || num_elem_ret != num_nodes) + DNPRINTF(ICE_DBG_SCHED, "%s: suspend/resume failed\n", + __func__); + + ice_free(hw, buf); + return status; +} + +/** + * ice_sched_calc_vsi_support_nodes - calculate number of VSI support nodes + * @pi: pointer to the port info structure + * @tc_node: pointer to TC node + * @num_nodes: pointer to num nodes array + * + * This function calculates the number of supported nodes needed to add this + * VSI into Tx tree including the VSI, parent and intermediate nodes in below + * layers + */ +void +ice_sched_calc_vsi_support_nodes(struct ice_port_info *pi, + struct ice_sched_node *tc_node, uint16_t *num_nodes) +{ + struct ice_sched_node *node; + uint8_t vsil; + int i; + + vsil = ice_sched_get_vsi_layer(pi->hw); + for (i = vsil; i >= pi->hw->sw_entry_point_layer; i--) { + /* Add intermediate nodes if TC has no children and + * need at least one node for VSI + */ + if (!tc_node->num_children || i == vsil) { + num_nodes[i]++; + } else { + /* If intermediate nodes are reached max children + * then add a new one. + */ + node = ice_sched_get_first_node(pi, tc_node, (uint8_t)i); + /* scan all the siblings */ + while (node) { + if (node->num_children < + pi->hw->max_children[i]) + break; + node = node->sibling; + } + + /* tree has one intermediate node to add this new VSI. + * So no need to calculate supported nodes for below + * layers. + */ + if (node) + break; + /* all the nodes are full, allocate a new one */ + num_nodes[i]++; + } + } +} + +/** + * ice_sched_add_elems - add nodes to HW and SW DB + * @pi: port information structure + * @tc_node: pointer to the branch node + * @parent: pointer to the parent node + * @layer: layer number to add nodes + * @num_nodes: number of nodes + * @num_nodes_added: pointer to num nodes added + * @first_node_teid: if new nodes are added then return the TEID of first node + * @prealloc_nodes: preallocated nodes struct for software DB + * + * This function add nodes to HW as well as to SW DB for a given layer + */ +enum ice_status +ice_sched_add_elems(struct ice_port_info *pi, struct ice_sched_node *tc_node, + struct ice_sched_node *parent, uint8_t layer, uint16_t num_nodes, + uint16_t *num_nodes_added, uint32_t *first_node_teid, + struct ice_sched_node **prealloc_nodes) +{ + struct ice_sched_node *prev, *new_node; + struct ice_aqc_add_elem *buf; + uint16_t i, num_groups_added = 0; + enum ice_status status = ICE_SUCCESS; + struct ice_hw *hw = pi->hw; + uint16_t buf_size; + uint32_t teid; + + buf_size = ice_struct_size(buf, generic, num_nodes); + buf = (struct ice_aqc_add_elem *)ice_malloc(hw, buf_size); + if (!buf) + return ICE_ERR_NO_MEMORY; + + buf->hdr.parent_teid = parent->info.node_teid; + buf->hdr.num_elems = htole16(num_nodes); + for (i = 0; i < num_nodes; i++) { + buf->generic[i].parent_teid = parent->info.node_teid; + buf->generic[i].data.elem_type = ICE_AQC_ELEM_TYPE_SE_GENERIC; + buf->generic[i].data.valid_sections = + ICE_AQC_ELEM_VALID_GENERIC | ICE_AQC_ELEM_VALID_CIR | + ICE_AQC_ELEM_VALID_EIR; + buf->generic[i].data.generic = 0; + buf->generic[i].data.cir_bw.bw_profile_idx = + htole16(ICE_SCHED_DFLT_RL_PROF_ID); + buf->generic[i].data.cir_bw.bw_alloc = + htole16(ICE_SCHED_DFLT_BW_WT); + buf->generic[i].data.eir_bw.bw_profile_idx = + htole16(ICE_SCHED_DFLT_RL_PROF_ID); + buf->generic[i].data.eir_bw.bw_alloc = + htole16(ICE_SCHED_DFLT_BW_WT); + } + + status = ice_aq_add_sched_elems(hw, 1, buf, buf_size, + &num_groups_added, NULL); + if (status != ICE_SUCCESS || num_groups_added != 1) { + DNPRINTF(ICE_DBG_SCHED, "%s: add node failed FW Error %d\n", + __func__, hw->adminq.sq_last_status); + ice_free(hw, buf); + return ICE_ERR_CFG; + } + + *num_nodes_added = num_nodes; + /* add nodes to the SW DB */ + for (i = 0; i < num_nodes; i++) { + if (prealloc_nodes) { + status = ice_sched_add_node(pi, layer, + &buf->generic[i], prealloc_nodes[i]); + } else { + status = ice_sched_add_node(pi, layer, + &buf->generic[i], NULL); + } + + if (status != ICE_SUCCESS) { + DNPRINTF(ICE_DBG_SCHED, + "%s: add nodes in SW DB failed status =%d\n", + __func__, status); + break; + } + + teid = le32toh(buf->generic[i].node_teid); + new_node = ice_sched_find_node_by_teid(parent, teid); + if (!new_node) { + DNPRINTF(ICE_DBG_SCHED, + "%s: Node is missing for teid =%d\n", + __func__, teid); + break; + } + + new_node->sibling = NULL; + new_node->tc_num = tc_node->tc_num; + + /* add it to previous node sibling pointer */ + /* Note: siblings are not linked across branches */ + prev = ice_sched_get_first_node(pi, tc_node, layer); + if (prev && prev != new_node) { + while (prev->sibling) + prev = prev->sibling; + prev->sibling = new_node; + } + + /* initialize the sibling head */ + if (!pi->sib_head[tc_node->tc_num][layer]) + pi->sib_head[tc_node->tc_num][layer] = new_node; + + if (i == 0) + *first_node_teid = teid; + } + + ice_free(hw, buf); + return status; +} + +/** + * ice_sched_add_nodes_to_hw_layer - Add nodes to hw layer + * @pi: port information structure + * @tc_node: pointer to TC node + * @parent: pointer to parent node + * @layer: layer number to add nodes + * @num_nodes: number of nodes to be added + * @first_node_teid: pointer to the first node TEID + * @num_nodes_added: pointer to number of nodes added + * + * Add nodes into specific hw layer. + */ +enum ice_status +ice_sched_add_nodes_to_hw_layer(struct ice_port_info *pi, + struct ice_sched_node *tc_node, + struct ice_sched_node *parent, uint8_t layer, + uint16_t num_nodes, uint32_t *first_node_teid, + uint16_t *num_nodes_added) +{ + uint16_t max_child_nodes; + + *num_nodes_added = 0; + + if (!num_nodes) + return ICE_SUCCESS; + + if (!parent || layer < pi->hw->sw_entry_point_layer) + return ICE_ERR_PARAM; + + /* max children per node per layer */ + max_child_nodes = pi->hw->max_children[parent->tx_sched_layer]; + + /* current number of children + required nodes exceed max children */ + if ((parent->num_children + num_nodes) > max_child_nodes) { + /* Fail if the parent is a TC node */ + if (parent == tc_node) + return ICE_ERR_CFG; + return ICE_ERR_MAX_LIMIT; + } + + return ice_sched_add_elems(pi, tc_node, parent, layer, num_nodes, + num_nodes_added, first_node_teid, NULL); +} + +/** + * ice_sched_add_nodes_to_layer - Add nodes to a given layer + * @pi: port information structure + * @tc_node: pointer to TC node + * @parent: pointer to parent node + * @layer: layer number to add nodes + * @num_nodes: number of nodes to be added + * @first_node_teid: pointer to the first node TEID + * @num_nodes_added: pointer to number of nodes added + * + * This function add nodes to a given layer. + */ +enum ice_status +ice_sched_add_nodes_to_layer(struct ice_port_info *pi, + struct ice_sched_node *tc_node, + struct ice_sched_node *parent, uint8_t layer, + uint16_t num_nodes, uint32_t *first_node_teid, + uint16_t *num_nodes_added) +{ + uint32_t *first_teid_ptr = first_node_teid; + uint16_t new_num_nodes = num_nodes; + enum ice_status status = ICE_SUCCESS; + uint32_t temp; + + *num_nodes_added = 0; + while (*num_nodes_added < num_nodes) { + uint16_t max_child_nodes, num_added = 0; + + status = ice_sched_add_nodes_to_hw_layer(pi, tc_node, parent, + layer, new_num_nodes, + first_teid_ptr, + &num_added); + if (status == ICE_SUCCESS) + *num_nodes_added += num_added; + /* added more nodes than requested ? */ + if (*num_nodes_added > num_nodes) { + DNPRINTF(ICE_DBG_SCHED, "%s: added extra nodes %d %d\n", + __func__, num_nodes, *num_nodes_added); + status = ICE_ERR_CFG; + break; + } + /* break if all the nodes are added successfully */ + if (status == ICE_SUCCESS && (*num_nodes_added == num_nodes)) + break; + /* break if the error is not max limit */ + if (status != ICE_SUCCESS && status != ICE_ERR_MAX_LIMIT) + break; + /* Exceeded the max children */ + max_child_nodes = pi->hw->max_children[parent->tx_sched_layer]; + /* utilize all the spaces if the parent is not full */ + if (parent->num_children < max_child_nodes) { + new_num_nodes = max_child_nodes - parent->num_children; + } else { + /* This parent is full, try the next sibling */ + parent = parent->sibling; + /* Don't modify the first node TEID memory if the + * first node was added already in the above call. + * Instead send some temp memory for all other + * recursive calls. + */ + if (num_added) + first_teid_ptr = &temp; + + new_num_nodes = num_nodes - *num_nodes_added; + } + } + + return status; +} + +/** + * ice_sched_add_vsi_support_nodes - add VSI supported nodes into Tx tree + * @pi: port information structure + * @vsi_handle: software VSI handle + * @tc_node: pointer to TC node + * @num_nodes: pointer to num nodes array + * + * This function adds the VSI supported nodes into Tx tree including the + * VSI, its parent and intermediate nodes in below layers + */ +enum ice_status +ice_sched_add_vsi_support_nodes(struct ice_port_info *pi, uint16_t vsi_handle, + struct ice_sched_node *tc_node, uint16_t *num_nodes) +{ + struct ice_sched_node *parent = tc_node; + uint32_t first_node_teid; + uint16_t num_added = 0; + uint8_t i, vsil; + + if (!pi) + return ICE_ERR_PARAM; + + vsil = ice_sched_get_vsi_layer(pi->hw); + for (i = pi->hw->sw_entry_point_layer; i <= vsil; i++) { + enum ice_status status; + + status = ice_sched_add_nodes_to_layer(pi, tc_node, parent, + i, num_nodes[i], + &first_node_teid, + &num_added); + if (status != ICE_SUCCESS || num_nodes[i] != num_added) + return ICE_ERR_CFG; + + /* The newly added node can be a new parent for the next + * layer nodes + */ + if (num_added) + parent = ice_sched_find_node_by_teid(tc_node, + first_node_teid); + else + parent = parent->children[0]; + + if (!parent) + return ICE_ERR_CFG; + + if (i == vsil) + parent->vsi_handle = vsi_handle; + } + + return ICE_SUCCESS; +} + +/** + * ice_sched_add_vsi_to_topo - add a new VSI into tree + * @pi: port information structure + * @vsi_handle: software VSI handle + * @tc: TC number + * + * This function adds a new VSI into scheduler tree + */ +enum ice_status +ice_sched_add_vsi_to_topo(struct ice_port_info *pi, uint16_t vsi_handle, + uint8_t tc) +{ + uint16_t num_nodes[ICE_AQC_TOPO_MAX_LEVEL_NUM] = { 0 }; + struct ice_sched_node *tc_node; + + tc_node = ice_sched_get_tc_node(pi, tc); + if (!tc_node) + return ICE_ERR_PARAM; + + /* calculate number of supported nodes needed for this VSI */ + ice_sched_calc_vsi_support_nodes(pi, tc_node, num_nodes); + + /* add VSI supported nodes to TC subtree */ + return ice_sched_add_vsi_support_nodes(pi, vsi_handle, tc_node, + num_nodes); +} + +/** + * ice_alloc_lan_q_ctx - allocate LAN queue contexts for the given VSI and TC + * @hw: pointer to the HW struct + * @vsi_handle: VSI handle + * @tc: TC number + * @new_numqs: number of queues + */ +enum ice_status +ice_alloc_lan_q_ctx(struct ice_hw *hw, uint16_t vsi_handle, uint8_t tc, + uint16_t new_numqs) +{ + struct ice_vsi_ctx *vsi_ctx; + struct ice_q_ctx *q_ctx; + + vsi_ctx = ice_get_vsi_ctx(hw, vsi_handle); + if (!vsi_ctx) + return ICE_ERR_PARAM; + + /* allocate LAN queue contexts */ + if (!vsi_ctx->lan_q_ctx[tc]) { + vsi_ctx->lan_q_ctx[tc] = (struct ice_q_ctx *) + ice_calloc(hw, new_numqs, sizeof(*q_ctx)); + if (!vsi_ctx->lan_q_ctx[tc]) + return ICE_ERR_NO_MEMORY; + vsi_ctx->num_lan_q_entries[tc] = new_numqs; + return ICE_SUCCESS; + } + + /* num queues are increased, update the queue contexts */ + if (new_numqs > vsi_ctx->num_lan_q_entries[tc]) { + uint16_t prev_num = vsi_ctx->num_lan_q_entries[tc]; + + q_ctx = (struct ice_q_ctx *) + ice_calloc(hw, new_numqs, sizeof(*q_ctx)); + if (!q_ctx) + return ICE_ERR_NO_MEMORY; + memcpy(q_ctx, vsi_ctx->lan_q_ctx[tc], + prev_num * sizeof(*q_ctx)); + ice_free(hw, vsi_ctx->lan_q_ctx[tc]); + vsi_ctx->lan_q_ctx[tc] = q_ctx; + vsi_ctx->num_lan_q_entries[tc] = new_numqs; + } + + return ICE_SUCCESS; +} + +/** + * ice_sched_calc_vsi_child_nodes - calculate number of VSI child nodes + * @hw: pointer to the HW struct + * @num_qs: number of queues + * @num_nodes: num nodes array + * + * This function calculates the number of VSI child nodes based on the + * number of queues. + */ +void +ice_sched_calc_vsi_child_nodes(struct ice_hw *hw, uint16_t num_qs, uint16_t *num_nodes) +{ + uint16_t num = num_qs; + uint8_t i, qgl, vsil; + + qgl = ice_sched_get_qgrp_layer(hw); + vsil = ice_sched_get_vsi_layer(hw); + + /* calculate num nodes from queue group to VSI layer */ + for (i = qgl; i > vsil; i--) { + /* round to the next integer if there is a remainder */ + num = howmany(num, hw->max_children[i]); + + /* need at least one node */ + num_nodes[i] = num ? num : 1; + } +} + +/** + * ice_sched_add_vsi_child_nodes - add VSI child nodes to tree + * @pi: port information structure + * @vsi_handle: software VSI handle + * @tc_node: pointer to the TC node + * @num_nodes: pointer to the num nodes that needs to be added per layer + * @owner: node owner (LAN or RDMA) + * + * This function adds the VSI child nodes to tree. It gets called for + * LAN and RDMA separately. + */ +enum ice_status +ice_sched_add_vsi_child_nodes(struct ice_port_info *pi, uint16_t vsi_handle, + struct ice_sched_node *tc_node, uint16_t *num_nodes, uint8_t owner) +{ + struct ice_sched_node *parent, *node; + struct ice_hw *hw = pi->hw; + uint32_t first_node_teid; + uint16_t num_added = 0; + uint8_t i, qgl, vsil; + + qgl = ice_sched_get_qgrp_layer(hw); + vsil = ice_sched_get_vsi_layer(hw); + parent = ice_sched_get_vsi_node(pi, tc_node, vsi_handle); + for (i = vsil + 1; i <= qgl; i++) { + enum ice_status status; + + if (!parent) + return ICE_ERR_CFG; + + status = ice_sched_add_nodes_to_layer(pi, tc_node, parent, i, + num_nodes[i], + &first_node_teid, + &num_added); + if (status != ICE_SUCCESS || num_nodes[i] != num_added) + return ICE_ERR_CFG; + + /* The newly added node can be a new parent for the next + * layer nodes + */ + if (num_added) { + parent = ice_sched_find_node_by_teid(tc_node, + first_node_teid); + node = parent; + while (node) { + node->owner = owner; + node = node->sibling; + } + } else { + parent = parent->children[0]; + } + } + + return ICE_SUCCESS; +} + +/** + * ice_sched_update_vsi_child_nodes - update VSI child nodes + * @pi: port information structure + * @vsi_handle: software VSI handle + * @tc: TC number + * @new_numqs: new number of max queues + * @owner: owner of this subtree + * + * This function updates the VSI child nodes based on the number of queues + */ +enum ice_status +ice_sched_update_vsi_child_nodes(struct ice_port_info *pi, uint16_t vsi_handle, + uint8_t tc, uint16_t new_numqs, uint8_t owner) +{ + uint16_t new_num_nodes[ICE_AQC_TOPO_MAX_LEVEL_NUM] = { 0 }; + struct ice_sched_node *vsi_node; + struct ice_sched_node *tc_node; + struct ice_vsi_ctx *vsi_ctx; + enum ice_status status = ICE_SUCCESS; + struct ice_hw *hw = pi->hw; + uint16_t prev_numqs; + + tc_node = ice_sched_get_tc_node(pi, tc); + if (!tc_node) + return ICE_ERR_CFG; + + vsi_node = ice_sched_get_vsi_node(pi, tc_node, vsi_handle); + if (!vsi_node) + return ICE_ERR_CFG; + + vsi_ctx = ice_get_vsi_ctx(hw, vsi_handle); + if (!vsi_ctx) + return ICE_ERR_PARAM; + + if (owner == ICE_SCHED_NODE_OWNER_LAN) + prev_numqs = vsi_ctx->sched.max_lanq[tc]; + else + prev_numqs = vsi_ctx->sched.max_rdmaq[tc]; + /* num queues are not changed or less than the previous number */ + if (new_numqs <= prev_numqs) + return status; + if (owner == ICE_SCHED_NODE_OWNER_LAN) { + status = ice_alloc_lan_q_ctx(hw, vsi_handle, tc, new_numqs); + if (status) + return status; + } else { +#if 0 + status = ice_alloc_rdma_q_ctx(hw, vsi_handle, tc, new_numqs); + if (status) + return status; +#else + return ICE_ERR_NOT_IMPL; +#endif + } + + if (new_numqs) + ice_sched_calc_vsi_child_nodes(hw, new_numqs, new_num_nodes); + /* Keep the max number of queue configuration all the time. Update the + * tree only if number of queues > previous number of queues. This may + * leave some extra nodes in the tree if number of queues < previous + * number but that wouldn't harm anything. Removing those extra nodes + * may complicate the code if those nodes are part of SRL or + * individually rate limited. + */ + status = ice_sched_add_vsi_child_nodes(pi, vsi_handle, tc_node, + new_num_nodes, owner); + if (status) + return status; + if (owner == ICE_SCHED_NODE_OWNER_LAN) + vsi_ctx->sched.max_lanq[tc] = new_numqs; + else + vsi_ctx->sched.max_rdmaq[tc] = new_numqs; + + return ICE_SUCCESS; +} + +/** + * ice_sched_cfg_vsi - configure the new/existing VSI + * @pi: port information structure + * @vsi_handle: software VSI handle + * @tc: TC number + * @maxqs: max number of queues + * @owner: LAN or RDMA + * @enable: TC enabled or disabled + * + * This function adds/updates VSI nodes based on the number of queues. If TC is + * enabled and VSI is in suspended state then resume the VSI back. If TC is + * disabled then suspend the VSI if it is not already. + */ +enum ice_status +ice_sched_cfg_vsi(struct ice_port_info *pi, uint16_t vsi_handle, uint8_t tc, + uint16_t maxqs, uint8_t owner, bool enable) +{ + struct ice_sched_node *vsi_node, *tc_node; + struct ice_vsi_ctx *vsi_ctx; + enum ice_status status = ICE_SUCCESS; + struct ice_hw *hw = pi->hw; + + DNPRINTF(ICE_DBG_SCHED, "%s: add/config VSI %d\n", + __func__, vsi_handle); + tc_node = ice_sched_get_tc_node(pi, tc); + if (!tc_node) + return ICE_ERR_PARAM; + vsi_ctx = ice_get_vsi_ctx(hw, vsi_handle); + if (!vsi_ctx) + return ICE_ERR_PARAM; + vsi_node = ice_sched_get_vsi_node(pi, tc_node, vsi_handle); + + /* suspend the VSI if TC is not enabled */ + if (!enable) { + if (vsi_node && vsi_node->in_use) { + uint32_t teid = le32toh(vsi_node->info.node_teid); + + status = ice_sched_suspend_resume_elems(hw, 1, &teid, + true); + if (!status) + vsi_node->in_use = false; + } + return status; + } + + /* TC is enabled, if it is a new VSI then add it to the tree */ + if (!vsi_node) { + status = ice_sched_add_vsi_to_topo(pi, vsi_handle, tc); + if (status) + return status; + + vsi_node = ice_sched_get_vsi_node(pi, tc_node, vsi_handle); + if (!vsi_node) + return ICE_ERR_CFG; + + vsi_ctx->sched.vsi_node[tc] = vsi_node; + vsi_node->in_use = true; + /* invalidate the max queues whenever VSI gets added first time + * into the scheduler tree (boot or after reset). We need to + * recreate the child nodes all the time in these cases. + */ + vsi_ctx->sched.max_lanq[tc] = 0; + vsi_ctx->sched.max_rdmaq[tc] = 0; + } + + /* update the VSI child nodes */ + status = ice_sched_update_vsi_child_nodes(pi, vsi_handle, tc, maxqs, + owner); + if (status) + return status; + + /* TC is enabled, resume the VSI if it is in the suspend state */ + if (!vsi_node->in_use) { + uint32_t teid = le32toh(vsi_node->info.node_teid); + + status = ice_sched_suspend_resume_elems(hw, 1, &teid, false); + if (!status) + vsi_node->in_use = true; + } + + return status; +} + +static inline bool ice_is_tc_ena(ice_bitmap_t bitmap, uint8_t tc) +{ + return !!(bitmap & BIT(tc)); +} + +/** + * ice_cfg_vsi_qs - configure the new/existing VSI queues + * @pi: port information structure + * @vsi_handle: software VSI handle + * @tc_bitmap: TC bitmap + * @maxqs: max queues array per TC + * @owner: LAN or RDMA + * + * This function adds/updates the VSI queues per TC. + */ +enum ice_status +ice_cfg_vsi_qs(struct ice_port_info *pi, uint16_t vsi_handle, + uint16_t tc_bitmap, uint16_t *maxqs, uint8_t owner) +{ + enum ice_status status = ICE_SUCCESS; + uint8_t i; + + if (!pi || pi->port_state != ICE_SCHED_PORT_STATE_READY) + return ICE_ERR_CFG; + + if (!ice_is_vsi_valid(pi->hw, vsi_handle)) + return ICE_ERR_PARAM; +#if 0 + ice_acquire_lock(&pi->sched_lock); +#endif + ice_for_each_traffic_class(i) { + /* configuration is possible only if TC node is present */ + if (!ice_sched_get_tc_node(pi, i)) + continue; + + status = ice_sched_cfg_vsi(pi, vsi_handle, i, maxqs[i], owner, + ice_is_tc_ena(tc_bitmap, i)); + if (status) + break; + } +#if 0 + ice_release_lock(&pi->sched_lock); +#endif + return status; +} + +/** + * ice_cfg_vsi_lan - configure VSI LAN queues + * @pi: port information structure + * @vsi_handle: software VSI handle + * @tc_bitmap: TC bitmap + * @max_lanqs: max LAN queues array per TC + * + * This function adds/updates the VSI LAN queues per TC. + */ +enum ice_status +ice_cfg_vsi_lan(struct ice_port_info *pi, uint16_t vsi_handle, + uint16_t tc_bitmap, uint16_t *max_lanqs) +{ + return ice_cfg_vsi_qs(pi, vsi_handle, tc_bitmap, max_lanqs, + ICE_SCHED_NODE_OWNER_LAN); +} + +/** + * ice_reset_vsi_stats - Reset VSI statistics counters + * @vsi: VSI structure + * + * Resets the software tracking counters for the VSI statistics, and indicate + * that the offsets haven't been loaded. This is intended to be called + * post-reset so that VSI statistics count from zero again. + */ +void +ice_reset_vsi_stats(struct ice_vsi *vsi) +{ + /* Reset HW stats */ + memset(&vsi->hw_stats.prev, 0, sizeof(vsi->hw_stats.prev)); + memset(&vsi->hw_stats.cur, 0, sizeof(vsi->hw_stats.cur)); + vsi->hw_stats.offsets_loaded = false; +} + +/** + * ice_initialize_vsi - Initialize a VSI for use + * @vsi: the vsi to initialize + * + * Initialize a VSI over the adminq and prepare it for operation. + * + * @pre vsi->num_tx_queues is set + * @pre vsi->num_rx_queues is set + */ +int +ice_initialize_vsi(struct ice_vsi *vsi) +{ + struct ice_vsi_ctx ctx = { 0 }; + struct ice_hw *hw = &vsi->sc->hw; + uint16_t max_txqs[ICE_MAX_TRAFFIC_CLASS] = { 0 }; + enum ice_status status; + int err; + + /* For now, we only have code supporting PF VSIs */ + switch (vsi->type) { + case ICE_VSI_PF: + ctx.flags = ICE_AQ_VSI_TYPE_PF; + break; + case ICE_VSI_VMDQ2: + ctx.flags = ICE_AQ_VSI_TYPE_VMDQ2; + break; + default: + return (ENODEV); + } + + ice_set_default_vsi_ctx(&ctx); + ice_set_rss_vsi_ctx(&ctx, vsi->type); + + /* XXX: VSIs of other types may need different port info? */ + ctx.info.sw_id = hw->port_info->sw_id; + + /* Set some RSS parameters based on the VSI type */ + ice_vsi_set_rss_params(vsi); + + /* Initialize the Rx queue mapping for this VSI */ + err = ice_setup_vsi_qmap(vsi, &ctx); + if (err) + return err; + + /* (Re-)add VSI to HW VSI handle list */ + status = ice_add_vsi(hw, vsi->idx, &ctx, NULL); + if (status != 0) { + DPRINTF("%s: Add VSI AQ call failed, err %s aq_err %s\n", + __func__, ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + return (EIO); + } + vsi->info = ctx.info; + + /* Initialize VSI with just 1 TC to start */ + max_txqs[0] = vsi->num_tx_queues; + + status = ice_cfg_vsi_lan(hw->port_info, vsi->idx, + ICE_DFLT_TRAFFIC_CLASS, max_txqs); + if (status) { + DPRINTF("%s: Failed VSI lan queue config, err %s aq_err %s\n", + __func__, ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + ice_deinit_vsi(vsi); + return (ENODEV); + } + + /* Reset VSI stats */ + ice_reset_vsi_stats(vsi); + + return 0; +} + +/** + * ice_sched_replay_agg - recreate aggregator node(s) + * @hw: pointer to the HW struct + * + * This function recreate aggregator type nodes which are not replayed earlier. + * It also replay aggregator BW information. These aggregator nodes are not + * associated with VSI type node yet. + */ +void +ice_sched_replay_agg(struct ice_hw *hw) +{ +#if 0 + struct ice_port_info *pi = hw->port_info; + struct ice_sched_agg_info *agg_info; + + ice_acquire_lock(&pi->sched_lock); + LIST_FOR_EACH_ENTRY(agg_info, &hw->agg_list, ice_sched_agg_info, + list_entry) + /* replay aggregator (re-create aggregator node) */ + if (!ice_cmp_bitmap(agg_info->tc_bitmap, + agg_info->replay_tc_bitmap, + ICE_MAX_TRAFFIC_CLASS)) { + ice_declare_bitmap(replay_bitmap, + ICE_MAX_TRAFFIC_CLASS); + enum ice_status status; + + ice_zero_bitmap(replay_bitmap, ICE_MAX_TRAFFIC_CLASS); + ice_sched_get_ena_tc_bitmap(pi, + agg_info->replay_tc_bitmap, + replay_bitmap); + status = ice_sched_cfg_agg(hw->port_info, + agg_info->agg_id, + ICE_AGG_TYPE_AGG, + replay_bitmap); + if (status) { + ice_info(hw, "Replay agg id[%d] failed\n", + agg_info->agg_id); + /* Move on to next one */ + continue; + } + /* Replay aggregator node BW (restore aggregator BW) */ + status = ice_sched_replay_agg_bw(hw, agg_info); + if (status) + ice_info(hw, "Replay agg bw [id=%d] failed\n", + agg_info->agg_id); + } + ice_release_lock(&pi->sched_lock); +#endif +} + +/** + * ice_replay_post - post replay configuration cleanup + * @hw: pointer to the HW struct + * + * Post replay cleanup. + */ +void ice_replay_post(struct ice_hw *hw) +{ + /* Delete old entries from replay filter list head */ + ice_rm_sw_replay_rule_info(hw, hw->switch_info); + ice_sched_replay_agg(hw); +} + +/** + * ice_is_main_vsi - checks whether the VSI is main VSI + * @hw: pointer to the HW struct + * @vsi_handle: VSI handle + * + * Checks whether the VSI is the main VSI (the first PF VSI created on + * given PF). + */ +bool +ice_is_main_vsi(struct ice_hw *hw, uint16_t vsi_handle) +{ + return vsi_handle == ICE_MAIN_VSI_HANDLE && hw->vsi_ctx[vsi_handle]; +} + +/** + * ice_replay_pre_init - replay pre initialization + * @hw: pointer to the HW struct + * @sw: pointer to switch info struct for which function initializes filters + * + * Initializes required config data for VSI, FD, ACL, and RSS before replay. + */ +enum ice_status +ice_replay_pre_init(struct ice_hw *hw, struct ice_switch_info *sw) +{ +#if 0 + enum ice_status status; + uint8_t i; + + /* Delete old entries from replay filter list head if there is any */ + ice_rm_sw_replay_rule_info(hw, sw); + /* In start of replay, move entries into replay_rules list, it + * will allow adding rules entries back to filt_rules list, + * which is operational list. + */ + for (i = 0; i < ICE_MAX_NUM_RECIPES; i++) + LIST_REPLACE_INIT(&sw->recp_list[i].filt_rules, + &sw->recp_list[i].filt_replay_rules); + ice_sched_replay_agg_vsi_preinit(hw); + + status = ice_sched_replay_root_node_bw(hw->port_info); + if (status) + return status; + + return ice_sched_replay_tc_node_bw(hw->port_info); +#else + return ICE_ERR_NOT_IMPL; +#endif +} + +/** + * ice_replay_rss_cfg - replay RSS configurations associated with VSI + * @hw: pointer to the hardware structure + * @vsi_handle: software VSI handle + */ +enum ice_status +ice_replay_rss_cfg(struct ice_hw *hw, uint16_t vsi_handle) +{ +#if 0 + enum ice_status status = ICE_SUCCESS; + struct ice_rss_cfg *r; + + if (!ice_is_vsi_valid(hw, vsi_handle)) + return ICE_ERR_PARAM; + + ice_acquire_lock(&hw->rss_locks); + LIST_FOR_EACH_ENTRY(r, &hw->rss_list_head, + ice_rss_cfg, l_entry) { + if (ice_is_bit_set(r->vsis, vsi_handle)) { + status = ice_add_rss_cfg_sync(hw, vsi_handle, &r->hash); + if (status) + break; + } + } + ice_release_lock(&hw->rss_locks); + + return status; +#else + return ICE_ERR_NOT_IMPL; +#endif +} + +/** + * ice_find_vsi_list_entry - Search VSI list map with VSI count 1 + * @recp_list: VSI lists needs to be searched + * @vsi_handle: VSI handle to be found in VSI list + * @vsi_list_id: VSI list ID found containing vsi_handle + * + * Helper function to search a VSI list with single entry containing given VSI + * handle element. This can be extended further to search VSI list with more + * than 1 vsi_count. Returns pointer to VSI list entry if found. + */ +struct ice_vsi_list_map_info * +ice_find_vsi_list_entry(struct ice_sw_recipe *recp_list, uint16_t vsi_handle, + uint16_t *vsi_list_id) +{ + struct ice_vsi_list_map_info *map_info = NULL; + + if (recp_list->adv_rule) { + struct ice_adv_fltr_mgmt_list_head *adv_list_head; + struct ice_adv_fltr_mgmt_list_entry *list_itr; + + adv_list_head = &recp_list->adv_filt_rules; + TAILQ_FOREACH(list_itr, adv_list_head, list_entry) { + if (list_itr->vsi_list_info) { + map_info = list_itr->vsi_list_info; + if (ice_is_bit_set(map_info->vsi_map, + vsi_handle)) { + *vsi_list_id = map_info->vsi_list_id; + return map_info; + } + } + } + } else { + struct ice_fltr_mgmt_list_head *list_head; + struct ice_fltr_mgmt_list_entry *list_itr; + + list_head = &recp_list->filt_rules; + TAILQ_FOREACH(list_itr, list_head, list_entry) { + if (list_itr->vsi_count == 1 && + list_itr->vsi_list_info) { + map_info = list_itr->vsi_list_info; + if (ice_is_bit_set(map_info->vsi_map, + vsi_handle)) { + *vsi_list_id = map_info->vsi_list_id; + return map_info; + } + } + } + } + + return NULL; +} + +/** + * ice_add_vlan_internal - Add one VLAN based filter rule + * @hw: pointer to the hardware structure + * @recp_list: recipe list for which rule has to be added + * @f_entry: filter entry containing one VLAN information + */ +enum ice_status +ice_add_vlan_internal(struct ice_hw *hw, struct ice_sw_recipe *recp_list, + struct ice_fltr_list_entry *f_entry) +{ + struct ice_fltr_mgmt_list_entry *v_list_itr; + struct ice_fltr_info *new_fltr, *cur_fltr; + enum ice_sw_lkup_type lkup_type; + uint16_t vsi_list_id = 0, vsi_handle; +#if 0 + struct ice_lock *rule_lock; /* Lock to protect filter rule list */ +#endif + enum ice_status status = ICE_SUCCESS; + + if (!ice_is_vsi_valid(hw, f_entry->fltr_info.vsi_handle)) + return ICE_ERR_PARAM; + + f_entry->fltr_info.fwd_id.hw_vsi_id = + hw->vsi_ctx[f_entry->fltr_info.vsi_handle]->vsi_num; + new_fltr = &f_entry->fltr_info; + + /* VLAN ID should only be 12 bits */ + if (new_fltr->l_data.vlan.vlan_id > ICE_MAX_VLAN_ID) + return ICE_ERR_PARAM; + + if (new_fltr->src_id != ICE_SRC_ID_VSI) + return ICE_ERR_PARAM; + + new_fltr->src = new_fltr->fwd_id.hw_vsi_id; + lkup_type = new_fltr->lkup_type; + vsi_handle = new_fltr->vsi_handle; +#if 0 + rule_lock = &recp_list->filt_rule_lock; + ice_acquire_lock(rule_lock); +#endif + v_list_itr = ice_find_rule_entry(&recp_list->filt_rules, new_fltr); + if (!v_list_itr) { + struct ice_vsi_list_map_info *map_info = NULL; + + if (new_fltr->fltr_act == ICE_FWD_TO_VSI) { + /* All VLAN pruning rules use a VSI list. Check if + * there is already a VSI list containing VSI that we + * want to add. If found, use the same vsi_list_id for + * this new VLAN rule or else create a new list. + */ + map_info = ice_find_vsi_list_entry(recp_list, + vsi_handle, + &vsi_list_id); + if (!map_info) { + status = ice_create_vsi_list_rule(hw, + &vsi_handle, + 1, + &vsi_list_id, + lkup_type); + if (status) + goto exit; + } + /* Convert the action to forwarding to a VSI list. */ + new_fltr->fltr_act = ICE_FWD_TO_VSI_LIST; + new_fltr->fwd_id.vsi_list_id = vsi_list_id; + } + + status = ice_create_pkt_fwd_rule(hw, recp_list, f_entry); + if (!status) { + v_list_itr = ice_find_rule_entry(&recp_list->filt_rules, + new_fltr); + if (!v_list_itr) { + status = ICE_ERR_DOES_NOT_EXIST; + goto exit; + } + /* reuse VSI list for new rule and increment ref_cnt */ + if (map_info) { + v_list_itr->vsi_list_info = map_info; + map_info->ref_cnt++; + } else { + v_list_itr->vsi_list_info = + ice_create_vsi_list_map(hw, &vsi_handle, + 1, vsi_list_id); + } + } + } else if (v_list_itr->vsi_list_info->ref_cnt == 1) { + /* Update existing VSI list to add new VSI ID only if it used + * by one VLAN rule. + */ + cur_fltr = &v_list_itr->fltr_info; + status = ice_add_update_vsi_list(hw, v_list_itr, cur_fltr, + new_fltr); + } else { + /* If VLAN rule exists and VSI list being used by this rule is + * referenced by more than 1 VLAN rule. Then create a new VSI + * list appending previous VSI with new VSI and update existing + * VLAN rule to point to new VSI list ID + */ + struct ice_fltr_info tmp_fltr; + uint16_t vsi_handle_arr[2]; + uint16_t cur_handle; + + /* Current implementation only supports reusing VSI list with + * one VSI count. We should never hit below condition + */ + if (v_list_itr->vsi_count > 1 && + v_list_itr->vsi_list_info->ref_cnt > 1) { + DNPRINTF(ICE_DBG_SW, "%s: Invalid configuration: " + "Optimization to reuse VSI list with more than " + "one VSI is not being done yet\n", __func__); + status = ICE_ERR_CFG; + goto exit; + } + + cur_handle = + ice_find_first_bit(v_list_itr->vsi_list_info->vsi_map, + ICE_MAX_VSI); + + /* A rule already exists with the new VSI being added */ + if (cur_handle == vsi_handle) { + status = ICE_ERR_ALREADY_EXISTS; + goto exit; + } + + vsi_handle_arr[0] = cur_handle; + vsi_handle_arr[1] = vsi_handle; + status = ice_create_vsi_list_rule(hw, &vsi_handle_arr[0], 2, + &vsi_list_id, lkup_type); + if (status) + goto exit; + + tmp_fltr = v_list_itr->fltr_info; + tmp_fltr.fltr_rule_id = v_list_itr->fltr_info.fltr_rule_id; + tmp_fltr.fwd_id.vsi_list_id = vsi_list_id; + tmp_fltr.fltr_act = ICE_FWD_TO_VSI_LIST; + /* Update the previous switch rule to a new VSI list which + * includes current VSI that is requested + */ + status = ice_update_pkt_fwd_rule(hw, &tmp_fltr); + if (status) + goto exit; + + /* before overriding VSI list map info. decrement ref_cnt of + * previous VSI list + */ + v_list_itr->vsi_list_info->ref_cnt--; + + /* now update to newly created list */ + v_list_itr->fltr_info.fwd_id.vsi_list_id = vsi_list_id; + v_list_itr->vsi_list_info = + ice_create_vsi_list_map(hw, &vsi_handle_arr[0], 2, + vsi_list_id); + v_list_itr->vsi_count++; + } + +exit: +#if 0 + ice_release_lock(rule_lock); +#endif + return status; +} + +/** + * ice_replay_vsi_fltr - Replay filters for requested VSI + * @hw: pointer to the hardware structure + * @pi: pointer to port information structure + * @sw: pointer to switch info struct for which function replays filters + * @vsi_handle: driver VSI handle + * @recp_id: Recipe ID for which rules need to be replayed + * @list_head: list for which filters need to be replayed + * + * Replays the filter of recipe recp_id for a VSI represented via vsi_handle. + * It is required to pass valid VSI handle. + */ +enum ice_status +ice_replay_vsi_fltr(struct ice_hw *hw, struct ice_port_info *pi, + struct ice_switch_info *sw, uint16_t vsi_handle, + uint8_t recp_id, + struct ice_fltr_mgmt_list_head *list_head) +{ + struct ice_fltr_mgmt_list_entry *itr; + enum ice_status status = ICE_SUCCESS; + struct ice_sw_recipe *recp_list; + uint16_t hw_vsi_id; + + if (TAILQ_EMPTY(list_head)) + return status; + recp_list = &sw->recp_list[recp_id]; + hw_vsi_id = hw->vsi_ctx[vsi_handle]->vsi_num; + + TAILQ_FOREACH(itr, list_head, list_entry) { + struct ice_fltr_list_entry f_entry; + + f_entry.fltr_info = itr->fltr_info; + if (itr->vsi_count < 2 && recp_id != ICE_SW_LKUP_VLAN && + itr->fltr_info.vsi_handle == vsi_handle) { + /* update the src in case it is VSI num */ + if (f_entry.fltr_info.src_id == ICE_SRC_ID_VSI) + f_entry.fltr_info.src = hw_vsi_id; + status = ice_add_rule_internal(hw, recp_list, + pi->lport, + &f_entry); + if (status != ICE_SUCCESS) + goto end; + continue; + } + if (!itr->vsi_list_info || + !ice_is_bit_set(itr->vsi_list_info->vsi_map, vsi_handle)) + continue; + /* Clearing it so that the logic can add it back */ + ice_clear_bit(vsi_handle, itr->vsi_list_info->vsi_map); + f_entry.fltr_info.vsi_handle = vsi_handle; + f_entry.fltr_info.fltr_act = ICE_FWD_TO_VSI; + /* update the src in case it is VSI num */ + if (f_entry.fltr_info.src_id == ICE_SRC_ID_VSI) + f_entry.fltr_info.src = hw_vsi_id; + if (recp_id == ICE_SW_LKUP_VLAN) + status = ice_add_vlan_internal(hw, recp_list, &f_entry); + else + status = ice_add_rule_internal(hw, recp_list, + pi->lport, + &f_entry); + if (status != ICE_SUCCESS) + goto end; + } +end: + return status; +} + +/** + * ice_replay_vsi_all_fltr - replay all filters stored in bookkeeping lists + * @hw: pointer to the hardware structure + * @pi: pointer to port information structure + * @vsi_handle: driver VSI handle + * + * Replays filters for requested VSI via vsi_handle. + */ +enum ice_status +ice_replay_vsi_all_fltr(struct ice_hw *hw, struct ice_port_info *pi, + uint16_t vsi_handle) +{ + struct ice_switch_info *sw = NULL; + enum ice_status status = ICE_SUCCESS; + uint8_t i; + + sw = hw->switch_info; + + /* Update the recipes that were created */ + for (i = 0; i < ICE_MAX_NUM_RECIPES; i++) { + struct ice_fltr_mgmt_list_head *head; + + head = &sw->recp_list[i].filt_replay_rules; + if (!sw->recp_list[i].adv_rule) + status = ice_replay_vsi_fltr(hw, pi, sw, vsi_handle, i, + head); + if (status != ICE_SUCCESS) + return status; + } + + return ICE_SUCCESS; +} + +/** + * ice_sched_replay_vsi_agg - replay aggregator & VSI to aggregator node(s) + * @hw: pointer to the HW struct + * @vsi_handle: software VSI handle + * + * This function replays aggregator node, VSI to aggregator type nodes, and + * their node bandwidth information. This function needs to be called with + * scheduler lock held. + */ +enum ice_status +ice_sched_replay_vsi_agg(struct ice_hw *hw, uint16_t vsi_handle) +{ +#if 0 + ice_declare_bitmap(replay_bitmap, ICE_MAX_TRAFFIC_CLASS); + struct ice_sched_agg_vsi_info *agg_vsi_info; + struct ice_port_info *pi = hw->port_info; + struct ice_sched_agg_info *agg_info; + enum ice_status status; + + ice_zero_bitmap(replay_bitmap, ICE_MAX_TRAFFIC_CLASS); + if (!ice_is_vsi_valid(hw, vsi_handle)) + return ICE_ERR_PARAM; + agg_info = ice_get_vsi_agg_info(hw, vsi_handle); + if (!agg_info) + return ICE_SUCCESS; /* Not present in list - default Agg case */ + agg_vsi_info = ice_get_agg_vsi_info(agg_info, vsi_handle); + if (!agg_vsi_info) + return ICE_SUCCESS; /* Not present in list - default Agg case */ + ice_sched_get_ena_tc_bitmap(pi, agg_info->replay_tc_bitmap, + replay_bitmap); + /* Replay aggregator node associated to vsi_handle */ + status = ice_sched_cfg_agg(hw->port_info, agg_info->agg_id, + ICE_AGG_TYPE_AGG, replay_bitmap); + if (status) + return status; + /* Replay aggregator node BW (restore aggregator BW) */ + status = ice_sched_replay_agg_bw(hw, agg_info); + if (status) + return status; + + ice_zero_bitmap(replay_bitmap, ICE_MAX_TRAFFIC_CLASS); + ice_sched_get_ena_tc_bitmap(pi, agg_vsi_info->replay_tc_bitmap, + replay_bitmap); + /* Move this VSI (vsi_handle) to above aggregator */ + status = ice_sched_assoc_vsi_to_agg(pi, agg_info->agg_id, vsi_handle, + replay_bitmap); + if (status) + return status; + /* Replay VSI BW (restore VSI BW) */ + return ice_sched_replay_vsi_bw(hw, vsi_handle, + agg_vsi_info->tc_bitmap); +#else + return ICE_ERR_NOT_IMPL; +#endif +} + +/** + * ice_replay_vsi_agg - replay VSI to aggregator node + * @hw: pointer to the HW struct + * @vsi_handle: software VSI handle + * + * This function replays association of VSI to aggregator type nodes, and + * node bandwidth information. + */ +enum ice_status +ice_replay_vsi_agg(struct ice_hw *hw, uint16_t vsi_handle) +{ +#if 0 + struct ice_port_info *pi = hw->port_info; +#endif + enum ice_status status; +#if 0 + ice_acquire_lock(&pi->sched_lock); +#endif + status = ice_sched_replay_vsi_agg(hw, vsi_handle); +#if 0 + ice_release_lock(&pi->sched_lock); +#endif + return status; +} +/** + * ice_replay_vsi - replay VSI configuration + * @hw: pointer to the HW struct + * @vsi_handle: driver VSI handle + * + * Restore all VSI configuration after reset. It is required to call this + * function with main VSI first. + */ +enum ice_status +ice_replay_vsi(struct ice_hw *hw, uint16_t vsi_handle) +{ + struct ice_switch_info *sw = hw->switch_info; + struct ice_port_info *pi = hw->port_info; + enum ice_status status; + + if (!ice_is_vsi_valid(hw, vsi_handle)) + return ICE_ERR_PARAM; + + /* Replay pre-initialization if there is any */ + if (ice_is_main_vsi(hw, vsi_handle)) { + status = ice_replay_pre_init(hw, sw); + if (status) + return status; + } + /* Replay per VSI all RSS configurations */ + status = ice_replay_rss_cfg(hw, vsi_handle); + if (status) + return status; + /* Replay per VSI all filters */ + status = ice_replay_vsi_all_fltr(hw, pi, vsi_handle); + if (!status) + status = ice_replay_vsi_agg(hw, vsi_handle); + return status; +} + +/** + * ice_replay_all_vsi_cfg - Replace configuration for all VSIs after reset + * @sc: the device softc + * + * Replace the configuration for each VSI, and then cleanup replay + * information. Called after a hardware reset in order to reconfigure the + * active VSIs. + */ +int +ice_replay_all_vsi_cfg(struct ice_softc *sc) +{ + struct ice_hw *hw = &sc->hw; + enum ice_status status; + int i; + + for (i = 0 ; i < sc->num_available_vsi; i++) { + struct ice_vsi *vsi = sc->all_vsi[i]; + + if (!vsi) + continue; + + status = ice_replay_vsi(hw, vsi->idx); + if (status) { + printf("%s: Failed to replay VSI %d, err %s " + "aq_err %s\n", sc->sc_dev.dv_xname, + vsi->idx, ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + return (EIO); + } + } + + /* Cleanup replay filters after successful reconfiguration */ + ice_replay_post(hw); + return (0); +} + +/** + * ice_aq_set_health_status_config - Configure FW health events + * @hw: pointer to the HW struct + * @event_source: type of diagnostic events to enable + * @cd: pointer to command details structure or NULL + * + * Configure the health status event types that the firmware will send to this + * PF. The supported event types are: PF-specific, all PFs, and global + */ +enum ice_status +ice_aq_set_health_status_config(struct ice_hw *hw, uint8_t event_source, + struct ice_sq_cd *cd) +{ + struct ice_aqc_set_health_status_config *cmd; + struct ice_aq_desc desc; + + cmd = &desc.params.set_health_status_config; + + ice_fill_dflt_direct_cmd_desc(&desc, + ice_aqc_opc_set_health_status_config); + + cmd->event_source = event_source; + + return ice_aq_send_cmd(hw, &desc, NULL, 0, cd); +} + +/** + * ice_init_health_events - Enable FW health event reporting + * @sc: device softc + * + * Will try to enable firmware health event reporting, but shouldn't + * cause any grief (to the caller) if this fails. + */ +void +ice_init_health_events(struct ice_softc *sc) +{ + enum ice_status status; + uint8_t health_mask; + + if (!ice_is_bit_set(sc->feat_cap, ICE_FEATURE_HEALTH_STATUS)) + return; + + health_mask = ICE_AQC_HEALTH_STATUS_SET_PF_SPECIFIC_MASK | + ICE_AQC_HEALTH_STATUS_SET_GLOBAL_MASK; + + status = ice_aq_set_health_status_config(&sc->hw, health_mask, NULL); + if (status) { + printf("%s: Failed to enable firmware health events, " + "err %s aq_err %s\n", sc->sc_dev.dv_xname, + ice_status_str(status), + ice_aq_str(sc->hw.adminq.sq_last_status)); + } else + ice_set_bit(ICE_FEATURE_HEALTH_STATUS, sc->feat_en); +} + +/** + * ice_fw_supports_lldp_fltr_ctrl - check NVM version supports lldp_fltr_ctrl + * @hw: pointer to HW struct + */ +bool +ice_fw_supports_lldp_fltr_ctrl(struct ice_hw *hw) +{ + if (hw->mac_type != ICE_MAC_E810 && hw->mac_type != ICE_MAC_GENERIC) + return false; + + return ice_is_fw_api_min_ver(hw, ICE_FW_API_LLDP_FLTR_MAJ, + ICE_FW_API_LLDP_FLTR_MIN, + ICE_FW_API_LLDP_FLTR_PATCH); +} + +/** + * ice_add_ethertype_to_list - Add an Ethertype filter to a filter list + * @vsi: the VSI to target packets to + * @list: the list to add the filter to + * @ethertype: the Ethertype to filter on + * @direction: The direction of the filter (Tx or Rx) + * @action: the action to take + * + * Add an Ethertype filter to a filter list. Used to forward a series of + * filters to the firmware for configuring the switch. + * + * Returns 0 on success, and an error code on failure. + */ +int +ice_add_ethertype_to_list(struct ice_vsi *vsi, struct ice_fltr_list_head *list, + uint16_t ethertype, uint16_t direction, enum ice_sw_fwd_act_type action) +{ + struct ice_fltr_list_entry *entry; + + KASSERT((direction == ICE_FLTR_TX) || (direction == ICE_FLTR_RX)); + + entry = malloc(sizeof(*entry), M_DEVBUF, M_NOWAIT|M_ZERO); + if (!entry) + return (ENOMEM); + + entry->fltr_info.flag = direction; + entry->fltr_info.src_id = ICE_SRC_ID_VSI; + entry->fltr_info.lkup_type = ICE_SW_LKUP_ETHERTYPE; + entry->fltr_info.fltr_act = action; + entry->fltr_info.vsi_handle = vsi->idx; + entry->fltr_info.l_data.ethertype_mac.ethertype = ethertype; + + TAILQ_INSERT_HEAD(list, entry, list_entry); + + return 0; +} + +/** + * ice_lldp_fltr_add_remove - add or remove a LLDP Rx switch filter + * @hw: pointer to HW struct + * @vsi_num: absolute HW index for VSI + * @add: boolean for if adding or removing a filter + */ +enum ice_status +ice_lldp_fltr_add_remove(struct ice_hw *hw, uint16_t vsi_num, bool add) +{ + struct ice_aqc_lldp_filter_ctrl *cmd; + struct ice_aq_desc desc; + + cmd = &desc.params.lldp_filter_ctrl; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_lldp_filter_ctrl); + + if (add) + cmd->cmd_flags = ICE_AQC_LLDP_FILTER_ACTION_ADD; + else + cmd->cmd_flags = ICE_AQC_LLDP_FILTER_ACTION_DELETE; + + cmd->vsi_num = htole16(vsi_num); + + return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL); +} + +/** + * ice_add_eth_mac_rule - Add ethertype and MAC based filter rule + * @hw: pointer to the hardware structure + * @em_list: list of ether type MAC filter, MAC is optional + * @sw: pointer to switch info struct for which function add rule + * @lport: logic port number on which function add rule + * + * This function requires the caller to populate the entries in + * the filter list with the necessary fields (including flags to + * indicate Tx or Rx rules). + */ +enum ice_status +ice_add_eth_mac_rule(struct ice_hw *hw, struct ice_fltr_list_head *em_list, + struct ice_switch_info *sw, uint8_t lport) +{ + struct ice_fltr_list_entry *em_list_itr; + + TAILQ_FOREACH(em_list_itr, em_list, list_entry) { + struct ice_sw_recipe *recp_list; + enum ice_sw_lkup_type l_type; + + l_type = em_list_itr->fltr_info.lkup_type; + recp_list = &sw->recp_list[l_type]; + + if (l_type != ICE_SW_LKUP_ETHERTYPE_MAC && + l_type != ICE_SW_LKUP_ETHERTYPE) + return ICE_ERR_PARAM; + + em_list_itr->status = ice_add_rule_internal(hw, recp_list, + lport, + em_list_itr); + if (em_list_itr->status) + return em_list_itr->status; + } + return ICE_SUCCESS; +} + +/** + * ice_add_eth_mac - Add a ethertype based filter rule + * @hw: pointer to the hardware structure + * @em_list: list of ethertype and forwarding information + * + * Function add ethertype rule for logical port from HW struct + */ +enum ice_status +ice_add_eth_mac(struct ice_hw *hw, struct ice_fltr_list_head *em_list) +{ + if (!em_list || !hw) + return ICE_ERR_PARAM; + + return ice_add_eth_mac_rule(hw, em_list, hw->switch_info, + hw->port_info->lport); +} + +/** + * ice_add_rx_lldp_filter - add ethertype filter for Rx LLDP frames + * @sc: the device private structure + * + * Add a switch ethertype filter which forwards the LLDP frames to the main PF + * VSI. Called when the fw_lldp_agent is disabled, to allow the LLDP frames to + * be forwarded to the stack. + */ +void +ice_add_rx_lldp_filter(struct ice_softc *sc) +{ + struct ice_fltr_list_head ethertype_list; + struct ice_vsi *vsi = &sc->pf_vsi; + struct ice_hw *hw = &sc->hw; + enum ice_status status; + int err; + uint16_t vsi_num; + + /* + * If FW is new enough, use a direct AQ command to perform the filter + * addition. + */ + if (ice_fw_supports_lldp_fltr_ctrl(hw)) { + vsi_num = hw->vsi_ctx[vsi->idx]->vsi_num; + status = ice_lldp_fltr_add_remove(hw, vsi_num, true); + if (status) { + DPRINTF("%s: failed to add Rx LLDP filter, " + "err %s aq_err %s\n", __func__, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + } else + ice_set_state(&sc->state, + ICE_STATE_LLDP_RX_FLTR_FROM_DRIVER); + return; + } + + TAILQ_INIT(ðertype_list); + + /* Forward Rx LLDP frames to the stack */ + err = ice_add_ethertype_to_list(vsi, ðertype_list, ETHERTYPE_LLDP, + ICE_FLTR_RX, ICE_FWD_TO_VSI); + if (err) { + DPRINTF("%s: failed to add Rx LLDP filter, err %d\n", + __func__, err); + goto free_ethertype_list; + } + + status = ice_add_eth_mac(hw, ðertype_list); + if (status && status != ICE_ERR_ALREADY_EXISTS) { + DPRINTF("%s: failed to add Rx LLDP filter, err %s aq_err %s\n", + __func__, ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + } else { + /* + * If status == ICE_ERR_ALREADY_EXISTS, we won't treat an + * already existing filter as an error case. + */ + ice_set_state(&sc->state, ICE_STATE_LLDP_RX_FLTR_FROM_DRIVER); + } + +free_ethertype_list: + ice_free_fltr_list(ðertype_list); +} + +/** + * ice_update_link_info - update status of the HW network link + * @pi: port info structure of the interested logical port + */ +enum ice_status +ice_update_link_info(struct ice_port_info *pi) +{ + struct ice_link_status *li; + enum ice_status status; + + if (!pi) + return ICE_ERR_PARAM; + + li = &pi->phy.link_info; + + status = ice_aq_get_link_info(pi, true, NULL, NULL); + if (status) + return status; + + if (li->link_info & ICE_AQ_MEDIA_AVAILABLE) { + struct ice_aqc_get_phy_caps_data *pcaps; + struct ice_hw *hw; + + hw = pi->hw; + pcaps = (struct ice_aqc_get_phy_caps_data *) + ice_malloc(hw, sizeof(*pcaps)); + if (!pcaps) + return ICE_ERR_NO_MEMORY; + + status = ice_aq_get_phy_caps(pi, false, + ICE_AQC_REPORT_TOPO_CAP_MEDIA, pcaps, NULL); + + if (status == ICE_SUCCESS) + memcpy(li->module_type, &pcaps->module_type, + sizeof(li->module_type)); + + ice_free(hw, pcaps); + } + + return status; +} + +/** + * ice_get_link_status - get status of the HW network link + * @pi: port information structure + * @link_up: pointer to bool (true/false = linkup/linkdown) + * + * Variable link_up is true if link is up, false if link is down. + * The variable link_up is invalid if status is non zero. As a + * result of this call, link status reporting becomes enabled + */ +enum ice_status +ice_get_link_status(struct ice_port_info *pi, bool *link_up) +{ + struct ice_phy_info *phy_info; + enum ice_status status = ICE_SUCCESS; + + if (!pi || !link_up) + return ICE_ERR_PARAM; + + phy_info = &pi->phy; + + if (phy_info->get_link_info) { + status = ice_update_link_info(pi); + if (status) { + DNPRINTF(ICE_DBG_LINK, + "%s: get link status error, status = %d\n", + __func__, status); + } + } + + *link_up = phy_info->link_info.link_info & ICE_AQ_LINK_UP; + + return status; +} + +/** + * ice_set_default_local_mib_settings - Set Local LLDP MIB to default settings + * @sc: device softc structure + * + * Overwrites the driver's SW local LLDP MIB with default settings. This + * ensures the driver has a valid MIB when it next uses the Set Local LLDP MIB + * admin queue command. + */ +void +ice_set_default_local_mib_settings(struct ice_softc *sc) +{ + struct ice_dcbx_cfg *dcbcfg; + struct ice_hw *hw = &sc->hw; + struct ice_port_info *pi; + uint8_t maxtcs, maxtcs_ets, old_pfc_mode; + + pi = hw->port_info; + + dcbcfg = &pi->qos_cfg.local_dcbx_cfg; + + maxtcs = hw->func_caps.common_cap.maxtc; + /* This value is only 3 bits; 8 TCs maps to 0 */ + maxtcs_ets = maxtcs & ICE_IEEE_ETS_MAXTC_M; + + /* VLAN vs DSCP mode needs to be preserved */ + old_pfc_mode = dcbcfg->pfc_mode; + + /** + * Setup the default settings used by the driver for the Set Local + * LLDP MIB Admin Queue command (0x0A08). (1TC w/ 100% BW, ETS, no + * PFC, TSA=2). + */ + memset(dcbcfg, 0, sizeof(*dcbcfg)); + + dcbcfg->etscfg.willing = 1; + dcbcfg->etscfg.tcbwtable[0] = 100; + dcbcfg->etscfg.maxtcs = maxtcs_ets; + dcbcfg->etscfg.tsatable[0] = 2; + + dcbcfg->etsrec = dcbcfg->etscfg; + dcbcfg->etsrec.willing = 0; + + dcbcfg->pfc.willing = 1; + dcbcfg->pfc.pfccap = maxtcs; + + dcbcfg->pfc_mode = old_pfc_mode; +} + +/** + * ice_add_ieee_ets_common_tlv + * @buf: Data buffer to be populated with ice_dcb_ets_cfg data + * @ets_cfg: Container for ice_dcb_ets_cfg data + * + * Populate the TLV buffer with ice_dcb_ets_cfg data + */ +void +ice_add_ieee_ets_common_tlv(uint8_t *buf, struct ice_dcb_ets_cfg *ets_cfg) +{ + uint8_t priority0, priority1; + uint8_t offset = 0; + int i; + + /* Priority Assignment Table (4 octets) + * Octets:| 1 | 2 | 3 | 4 | + * ----------------------------------------- + * |pri0|pri1|pri2|pri3|pri4|pri5|pri6|pri7| + * ----------------------------------------- + * Bits:|7 4|3 0|7 4|3 0|7 4|3 0|7 4|3 0| + * ----------------------------------------- + */ + for (i = 0; i < ICE_MAX_TRAFFIC_CLASS / 2; i++) { + priority0 = ets_cfg->prio_table[i * 2] & 0xF; + priority1 = ets_cfg->prio_table[i * 2 + 1] & 0xF; + buf[offset] = (priority0 << ICE_IEEE_ETS_PRIO_1_S) | priority1; + offset++; + } + + /* TC Bandwidth Table (8 octets) + * Octets:| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | + * --------------------------------- + * |tc0|tc1|tc2|tc3|tc4|tc5|tc6|tc7| + * --------------------------------- + * + * TSA Assignment Table (8 octets) + * Octets:| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | + * --------------------------------- + * |tc0|tc1|tc2|tc3|tc4|tc5|tc6|tc7| + * --------------------------------- + */ + ice_for_each_traffic_class(i) { + buf[offset] = ets_cfg->tcbwtable[i]; + buf[ICE_MAX_TRAFFIC_CLASS + offset] = ets_cfg->tsatable[i]; + offset++; + } +} + +/** + * ice_add_ieee_ets_tlv - Prepare ETS TLV in IEEE format + * @tlv: Fill the ETS config data in IEEE format + * @dcbcfg: Local store which holds the DCB Config + * + * Prepare IEEE 802.1Qaz ETS CFG TLV + */ +void +ice_add_ieee_ets_tlv(struct ice_lldp_org_tlv *tlv, struct ice_dcbx_cfg *dcbcfg) +{ + struct ice_dcb_ets_cfg *etscfg; + uint8_t *buf = tlv->tlvinfo; + uint8_t maxtcwilling = 0; + uint32_t ouisubtype; + uint16_t typelen; + + typelen = ((ICE_TLV_TYPE_ORG << ICE_LLDP_TLV_TYPE_S) | + ICE_IEEE_ETS_TLV_LEN); + tlv->typelen = HTONS(typelen); + + ouisubtype = ((ICE_IEEE_8021QAZ_OUI << ICE_LLDP_TLV_OUI_S) | + ICE_IEEE_SUBTYPE_ETS_CFG); + tlv->ouisubtype = htonl(ouisubtype); + + /* First Octet post subtype + * -------------------------- + * |will-|CBS | Re- | Max | + * |ing | |served| TCs | + * -------------------------- + * |1bit | 1bit|3 bits|3bits| + */ + etscfg = &dcbcfg->etscfg; + if (etscfg->willing) + maxtcwilling = BIT(ICE_IEEE_ETS_WILLING_S); + maxtcwilling |= etscfg->maxtcs & ICE_IEEE_ETS_MAXTC_M; + buf[0] = maxtcwilling; + + /* Begin adding at Priority Assignment Table (offset 1 in buf) */ + ice_add_ieee_ets_common_tlv(&buf[1], etscfg); +} + +/** + * ice_add_ieee_etsrec_tlv - Prepare ETS Recommended TLV in IEEE format + * @tlv: Fill ETS Recommended TLV in IEEE format + * @dcbcfg: Local store which holds the DCB Config + * + * Prepare IEEE 802.1Qaz ETS REC TLV + */ +void +ice_add_ieee_etsrec_tlv(struct ice_lldp_org_tlv *tlv, + struct ice_dcbx_cfg *dcbcfg) +{ + struct ice_dcb_ets_cfg *etsrec; + uint8_t *buf = tlv->tlvinfo; + uint32_t ouisubtype; + uint16_t typelen; + + typelen = ((ICE_TLV_TYPE_ORG << ICE_LLDP_TLV_TYPE_S) | + ICE_IEEE_ETS_TLV_LEN); + tlv->typelen = htons(typelen); + + ouisubtype = ((ICE_IEEE_8021QAZ_OUI << ICE_LLDP_TLV_OUI_S) | + ICE_IEEE_SUBTYPE_ETS_REC); + tlv->ouisubtype = HTONL(ouisubtype); + + etsrec = &dcbcfg->etsrec; + + /* First Octet is reserved */ + /* Begin adding at Priority Assignment Table (offset 1 in buf) */ + ice_add_ieee_ets_common_tlv(&buf[1], etsrec); +} + +/** + * ice_add_ieee_pfc_tlv - Prepare PFC TLV in IEEE format + * @tlv: Fill PFC TLV in IEEE format + * @dcbcfg: Local store which holds the PFC CFG data + * + * Prepare IEEE 802.1Qaz PFC CFG TLV + */ +void +ice_add_ieee_pfc_tlv(struct ice_lldp_org_tlv *tlv, struct ice_dcbx_cfg *dcbcfg) +{ + uint8_t *buf = tlv->tlvinfo; + uint32_t ouisubtype; + uint16_t typelen; + + typelen = ((ICE_TLV_TYPE_ORG << ICE_LLDP_TLV_TYPE_S) | + ICE_IEEE_PFC_TLV_LEN); + tlv->typelen = htons(typelen); + + ouisubtype = ((ICE_IEEE_8021QAZ_OUI << ICE_LLDP_TLV_OUI_S) | + ICE_IEEE_SUBTYPE_PFC_CFG); + tlv->ouisubtype = htonl(ouisubtype); + + /* ---------------------------------------- + * |will-|MBC | Re- | PFC | PFC Enable | + * |ing | |served| cap | | + * ----------------------------------------- + * |1bit | 1bit|2 bits|4bits| 1 octet | + */ + if (dcbcfg->pfc.willing) + buf[0] = BIT(ICE_IEEE_PFC_WILLING_S); + + if (dcbcfg->pfc.mbc) + buf[0] |= BIT(ICE_IEEE_PFC_MBC_S); + + buf[0] |= dcbcfg->pfc.pfccap & 0xF; + buf[1] = dcbcfg->pfc.pfcena; +} + +/** + * ice_add_ieee_app_pri_tlv - Prepare APP TLV in IEEE format + * @tlv: Fill APP TLV in IEEE format + * @dcbcfg: Local store which holds the APP CFG data + * + * Prepare IEEE 802.1Qaz APP CFG TLV + */ +void +ice_add_ieee_app_pri_tlv(struct ice_lldp_org_tlv *tlv, + struct ice_dcbx_cfg *dcbcfg) +{ + uint16_t typelen, len, offset = 0; + uint8_t priority, selector, i = 0; + uint8_t *buf = tlv->tlvinfo; + uint32_t ouisubtype; + + /* No APP TLVs then just return */ + if (dcbcfg->numapps == 0) + return; + ouisubtype = ((ICE_IEEE_8021QAZ_OUI << ICE_LLDP_TLV_OUI_S) | + ICE_IEEE_SUBTYPE_APP_PRI); + tlv->ouisubtype = HTONL(ouisubtype); + + /* Move offset to App Priority Table */ + offset++; + /* Application Priority Table (3 octets) + * Octets:| 1 | 2 | 3 | + * ----------------------------------------- + * |Priority|Rsrvd| Sel | Protocol ID | + * ----------------------------------------- + * Bits:|23 21|20 19|18 16|15 0| + * ----------------------------------------- + */ + while (i < dcbcfg->numapps) { + priority = dcbcfg->app[i].priority & 0x7; + selector = dcbcfg->app[i].selector & 0x7; + buf[offset] = (priority << ICE_IEEE_APP_PRIO_S) | selector; + buf[offset + 1] = (dcbcfg->app[i].prot_id >> 0x8) & 0xFF; + buf[offset + 2] = dcbcfg->app[i].prot_id & 0xFF; + /* Move to next app */ + offset += 3; + i++; + if (i >= ICE_DCBX_MAX_APPS) + break; + } + /* len includes size of ouisubtype + 1 reserved + 3*numapps */ + len = sizeof(tlv->ouisubtype) + 1 + (i * 3); + typelen = ((ICE_TLV_TYPE_ORG << ICE_LLDP_TLV_TYPE_S) | (len & 0x1FF)); + tlv->typelen = HTONS(typelen); +} + +/** + * ice_add_dscp_up_tlv - Prepare DSCP to UP TLV + * @tlv: location to build the TLV data + * @dcbcfg: location of data to convert to TLV + */ +void +ice_add_dscp_up_tlv(struct ice_lldp_org_tlv *tlv, struct ice_dcbx_cfg *dcbcfg) +{ + uint8_t *buf = tlv->tlvinfo; + uint32_t ouisubtype; + uint16_t typelen; + int i; + + typelen = ((ICE_TLV_TYPE_ORG << ICE_LLDP_TLV_TYPE_S) | + ICE_DSCP_UP_TLV_LEN); + tlv->typelen = htons(typelen); + + ouisubtype = (uint32_t)((ICE_DSCP_OUI << ICE_LLDP_TLV_OUI_S) | + ICE_DSCP_SUBTYPE_DSCP2UP); + tlv->ouisubtype = htonl(ouisubtype); + + /* bytes 0 - 63 - IPv4 DSCP2UP LUT */ + for (i = 0; i < ICE_DSCP_NUM_VAL; i++) { + /* IPv4 mapping */ + buf[i] = dcbcfg->dscp_map[i]; + /* IPv6 mapping */ + buf[i + ICE_DSCP_IPV6_OFFSET] = dcbcfg->dscp_map[i]; + } + + /* byte 64 - IPv4 untagged traffic */ + buf[i] = 0; + + /* byte 144 - IPv6 untagged traffic */ + buf[i + ICE_DSCP_IPV6_OFFSET] = 0; +} + +#define ICE_BYTES_PER_TC 8 + +/** + * ice_add_dscp_enf_tlv - Prepare DSCP Enforcement TLV + * @tlv: location to build the TLV data + */ +void +ice_add_dscp_enf_tlv(struct ice_lldp_org_tlv *tlv) +{ + uint8_t *buf = tlv->tlvinfo; + uint32_t ouisubtype; + uint16_t typelen; + + typelen = ((ICE_TLV_TYPE_ORG << ICE_LLDP_TLV_TYPE_S) | + ICE_DSCP_ENF_TLV_LEN); + tlv->typelen = htons(typelen); + + ouisubtype = (uint32_t)((ICE_DSCP_OUI << ICE_LLDP_TLV_OUI_S) | + ICE_DSCP_SUBTYPE_ENFORCE); + tlv->ouisubtype = htonl(ouisubtype); + + /* Allow all DSCP values to be valid for all TC's (IPv4 and IPv6) */ + memset(buf, 0, 2 * (ICE_MAX_TRAFFIC_CLASS * ICE_BYTES_PER_TC)); +} + +/** + * ice_add_dscp_tc_bw_tlv - Prepare DSCP BW for TC TLV + * @tlv: location to build the TLV data + * @dcbcfg: location of the data to convert to TLV + */ +void +ice_add_dscp_tc_bw_tlv(struct ice_lldp_org_tlv *tlv, + struct ice_dcbx_cfg *dcbcfg) +{ + struct ice_dcb_ets_cfg *etscfg; + uint8_t *buf = tlv->tlvinfo; + uint32_t ouisubtype; + uint8_t offset = 0; + uint16_t typelen; + int i; + + typelen = ((ICE_TLV_TYPE_ORG << ICE_LLDP_TLV_TYPE_S) | + ICE_DSCP_TC_BW_TLV_LEN); + tlv->typelen = htons(typelen); + + ouisubtype = (uint32_t)((ICE_DSCP_OUI << ICE_LLDP_TLV_OUI_S) | + ICE_DSCP_SUBTYPE_TCBW); + tlv->ouisubtype = htonl(ouisubtype); + + /* First Octect after subtype + * ---------------------------- + * | RSV | CBS | RSV | Max TCs | + * | 1b | 1b | 3b | 3b | + * ---------------------------- + */ + etscfg = &dcbcfg->etscfg; + buf[0] = etscfg->maxtcs & ICE_IEEE_ETS_MAXTC_M; + + /* bytes 1 - 4 reserved */ + offset = 5; + + /* TC BW table + * bytes 0 - 7 for TC 0 - 7 + * + * TSA Assignment table + * bytes 8 - 15 for TC 0 - 7 + */ + for (i = 0; i < ICE_MAX_TRAFFIC_CLASS; i++) { + buf[offset] = etscfg->tcbwtable[i]; + buf[offset + ICE_MAX_TRAFFIC_CLASS] = etscfg->tsatable[i]; + offset++; + } +} + +/** + * ice_add_dscp_pfc_tlv - Prepare DSCP PFC TLV + * @tlv: Fill PFC TLV in IEEE format + * @dcbcfg: Local store which holds the PFC CFG data + */ +void +ice_add_dscp_pfc_tlv(struct ice_lldp_org_tlv *tlv, struct ice_dcbx_cfg *dcbcfg) +{ + uint8_t *buf = tlv->tlvinfo; + uint32_t ouisubtype; + uint16_t typelen; + + typelen = ((ICE_TLV_TYPE_ORG << ICE_LLDP_TLV_TYPE_S) | + ICE_DSCP_PFC_TLV_LEN); + tlv->typelen = htons(typelen); + + ouisubtype = (uint32_t)((ICE_DSCP_OUI << ICE_LLDP_TLV_OUI_S) | + ICE_DSCP_SUBTYPE_PFC); + tlv->ouisubtype = HTONL(ouisubtype); + + buf[0] = dcbcfg->pfc.pfccap & 0xF; + buf[1] = dcbcfg->pfc.pfcena; +} + +/** + * ice_add_dcb_tlv - Add all IEEE or DSCP TLVs + * @tlv: Fill TLV data in IEEE format + * @dcbcfg: Local store which holds the DCB Config + * @tlvid: Type of IEEE TLV + * + * Add tlv information + */ +void +ice_add_dcb_tlv(struct ice_lldp_org_tlv *tlv, struct ice_dcbx_cfg *dcbcfg, + uint16_t tlvid) +{ + if (dcbcfg->pfc_mode == ICE_QOS_MODE_VLAN) { + switch (tlvid) { + case ICE_IEEE_TLV_ID_ETS_CFG: + ice_add_ieee_ets_tlv(tlv, dcbcfg); + break; + case ICE_IEEE_TLV_ID_ETS_REC: + ice_add_ieee_etsrec_tlv(tlv, dcbcfg); + break; + case ICE_IEEE_TLV_ID_PFC_CFG: + ice_add_ieee_pfc_tlv(tlv, dcbcfg); + break; + case ICE_IEEE_TLV_ID_APP_PRI: + ice_add_ieee_app_pri_tlv(tlv, dcbcfg); + break; + default: + break; + } + } else { + /* pfc_mode == ICE_QOS_MODE_DSCP */ + switch (tlvid) { + case ICE_TLV_ID_DSCP_UP: + ice_add_dscp_up_tlv(tlv, dcbcfg); + break; + case ICE_TLV_ID_DSCP_ENF: + ice_add_dscp_enf_tlv(tlv); + break; + case ICE_TLV_ID_DSCP_TC_BW: + ice_add_dscp_tc_bw_tlv(tlv, dcbcfg); + break; + case ICE_TLV_ID_DSCP_TO_PFC: + ice_add_dscp_pfc_tlv(tlv, dcbcfg); + break; + default: + break; + } + } +} +/** + * ice_dcb_cfg_to_lldp - Convert DCB configuration to MIB format + * @lldpmib: pointer to the HW struct + * @miblen: length of LLDP MIB + * @dcbcfg: Local store which holds the DCB Config + * + * Convert the DCB configuration to MIB format + */ +void +ice_dcb_cfg_to_lldp(uint8_t *lldpmib, uint16_t *miblen, + struct ice_dcbx_cfg *dcbcfg) +{ + uint16_t len, offset = 0, tlvid = ICE_TLV_ID_START; + struct ice_lldp_org_tlv *tlv; + uint16_t typelen; + + tlv = (struct ice_lldp_org_tlv *)lldpmib; + while (1) { + ice_add_dcb_tlv(tlv, dcbcfg, tlvid++); + typelen = ntohs(tlv->typelen); + len = (typelen & ICE_LLDP_TLV_LEN_M) >> ICE_LLDP_TLV_LEN_S; + if (len) + offset += len + 2; + /* END TLV or beyond LLDPDU size */ + if (tlvid >= ICE_TLV_ID_END_OF_LLDPPDU || + offset > ICE_LLDPDU_SIZE) + break; + /* Move to next TLV */ + if (len) + tlv = (struct ice_lldp_org_tlv *) + ((char *)tlv + sizeof(tlv->typelen) + len); + } + *miblen = offset; +} + +/** + * ice_aq_set_lldp_mib - Set the LLDP MIB + * @hw: pointer to the HW struct + * @mib_type: Local, Remote or both Local and Remote MIBs + * @buf: pointer to the caller-supplied buffer to store the MIB block + * @buf_size: size of the buffer (in bytes) + * @cd: pointer to command details structure or NULL + * + * Set the LLDP MIB. (0x0A08) + */ +enum ice_status +ice_aq_set_lldp_mib(struct ice_hw *hw, uint8_t mib_type, void *buf, + uint16_t buf_size, struct ice_sq_cd *cd) +{ + struct ice_aqc_lldp_set_local_mib *cmd; + struct ice_aq_desc desc; + + cmd = &desc.params.lldp_set_mib; + + if (buf_size == 0 || !buf) + return ICE_ERR_PARAM; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_lldp_set_local_mib); + + desc.flags |= htole16((uint16_t)ICE_AQ_FLAG_RD); + desc.datalen = htole16(buf_size); + + cmd->type = mib_type; + cmd->length = htole16(buf_size); + + return ice_aq_send_cmd(hw, &desc, buf, buf_size, cd); +} + +/** + * ice_set_dcb_cfg - Set the local LLDP MIB to FW + * @pi: port information structure + * + * Set DCB configuration to the Firmware + */ +enum ice_status +ice_set_dcb_cfg(struct ice_port_info *pi) +{ + uint8_t mib_type, *lldpmib = NULL; + struct ice_dcbx_cfg *dcbcfg; + enum ice_status ret; + struct ice_hw *hw; + uint16_t miblen; + + if (!pi) + return ICE_ERR_PARAM; + + hw = pi->hw; + + /* update the HW local config */ + dcbcfg = &pi->qos_cfg.local_dcbx_cfg; + /* Allocate the LLDPDU */ + lldpmib = (uint8_t *)ice_malloc(hw, ICE_LLDPDU_SIZE); + if (!lldpmib) + return ICE_ERR_NO_MEMORY; + + mib_type = SET_LOCAL_MIB_TYPE_LOCAL_MIB; + if (dcbcfg->app_mode == ICE_DCBX_APPS_NON_WILLING) + mib_type |= SET_LOCAL_MIB_TYPE_CEE_NON_WILLING; + + ice_dcb_cfg_to_lldp(lldpmib, &miblen, dcbcfg); + ret = ice_aq_set_lldp_mib(hw, mib_type, (void *)lldpmib, miblen, + NULL); + + ice_free(hw, lldpmib); + + return ret; +} + +/** + * ice_set_default_local_lldp_mib - Possibly apply local LLDP MIB to FW + * @sc: device softc structure + * + * This function needs to be called after link up; it makes sure the FW has + * certain PFC/DCB settings. In certain configurations this will re-apply a + * default local LLDP MIB configuration; this is intended to workaround a FW + * behavior where these settings seem to be cleared on link up. + */ +void +ice_set_default_local_lldp_mib(struct ice_softc *sc) +{ + struct ice_hw *hw = &sc->hw; + struct ice_port_info *pi; + enum ice_status status; + + /* Set Local MIB can disrupt flow control settings for + * non-DCB-supported devices. + */ + if (!ice_is_bit_set(sc->feat_en, ICE_FEATURE_DCB)) + return; + + pi = hw->port_info; + + /* Don't overwrite a custom SW configuration */ + if (!pi->qos_cfg.is_sw_lldp && + !ice_test_state(&sc->state, ICE_STATE_MULTIPLE_TCS)) + ice_set_default_local_mib_settings(sc); + + status = ice_set_dcb_cfg(pi); + if (status) { + printf("%s: Error setting Local LLDP MIB: %s aq_err %s\n", + sc->sc_dev.dv_xname, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + } +} + +/** + * ice_aq_speed_to_rate - Convert AdminQ speed enum to baudrate + * @pi: port info data + * + * Returns the baudrate value for the current link speed of a given port. + */ +uint64_t +ice_aq_speed_to_rate(struct ice_port_info *pi) +{ + switch (pi->phy.link_info.link_speed) { + case ICE_AQ_LINK_SPEED_100GB: + return IF_Gbps(100); + case ICE_AQ_LINK_SPEED_50GB: + return IF_Gbps(50); + case ICE_AQ_LINK_SPEED_40GB: + return IF_Gbps(40); + case ICE_AQ_LINK_SPEED_25GB: + return IF_Gbps(25); + case ICE_AQ_LINK_SPEED_10GB: + return IF_Gbps(10); + case ICE_AQ_LINK_SPEED_5GB: + return IF_Gbps(5); + case ICE_AQ_LINK_SPEED_2500MB: + return IF_Mbps(2500); + case ICE_AQ_LINK_SPEED_1000MB: + return IF_Mbps(1000); + case ICE_AQ_LINK_SPEED_100MB: + return IF_Mbps(100); + case ICE_AQ_LINK_SPEED_10MB: + return IF_Mbps(10); + case ICE_AQ_LINK_SPEED_UNKNOWN: + default: + /* return 0 if we don't know the link speed */ + return 0; + } +} + +/** + * ice_update_link_status - notify OS of link state change + * @sc: device private softc structure + * @update_media: true if we should update media even if link didn't change + * + * Called to notify iflib core of link status changes. Should be called once + * during attach_post, and whenever link status changes during runtime. + * + * This call only updates the currently supported media types if the link + * status changed, or if update_media is set to true. + */ +void +ice_update_link_status(struct ice_softc *sc, bool update_media) +{ + struct ifnet *ifp = &sc->sc_ac.ac_if; + struct ice_hw *hw = &sc->hw; + enum ice_status status; + + /* Never report link up when in recovery mode */ + if (ice_test_state(&sc->state, ICE_STATE_RECOVERY_MODE)) + return; + + /* Report link status to iflib only once each time it changes */ + if (!ice_testandset_state(&sc->state, ICE_STATE_LINK_STATUS_REPORTED)) { + if (sc->link_up) { /* link is up */ + uint64_t baudrate; + + baudrate = ice_aq_speed_to_rate(sc->hw.port_info); + if (!(hw->port_info->phy.link_info_old.link_info & + ICE_AQ_LINK_UP)) + ice_set_default_local_lldp_mib(sc); + + ifp->if_baudrate = baudrate; + ifp->if_link_state = LINK_STATE_UP; + if_link_state_change(ifp); +#if 0 + ice_rdma_link_change(sc, LINK_STATE_UP, baudrate); + ice_link_up_msg(sc); +#endif + } else { /* link is down */ + ifp->if_baudrate = 0; + ifp->if_link_state = LINK_STATE_DOWN; + if_link_state_change(ifp); +#if 0 + ice_rdma_link_change(sc, LINK_STATE_DOWN, 0); +#endif + } + update_media = true; + } + + /* Update the supported media types */ + if (update_media && + !ice_test_state(&sc->state, ICE_STATE_PREPARED_FOR_RESET)) { + status = ice_add_media_types(sc, &sc->media); + if (status) + printf("%s: Error adding device media types: " + "%s aq_err %s\n", sc->sc_dev.dv_xname, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + } +} + +/** + * __ice_aq_get_set_rss_key + * @hw: pointer to the HW struct + * @vsi_id: VSI FW index + * @key: pointer to key info struct + * @set: set true to set the key, false to get the key + * + * get (0x0B04) or set (0x0B02) the RSS key per VSI + */ +enum ice_status +ice_aq_get_set_rss_key(struct ice_hw *hw, uint16_t vsi_id, + struct ice_aqc_get_set_rss_keys *key, bool set) +{ + struct ice_aqc_get_set_rss_key *cmd_resp; + uint16_t key_size = sizeof(*key); + struct ice_aq_desc desc; + + cmd_resp = &desc.params.get_set_rss_key; + + if (set) { + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_set_rss_key); + desc.flags |= htole16(ICE_AQ_FLAG_RD); + } else { + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_get_rss_key); + } + + cmd_resp->vsi_id = htole16(((vsi_id << + ICE_AQC_GSET_RSS_KEY_VSI_ID_S) & + ICE_AQC_GSET_RSS_KEY_VSI_ID_M) | + ICE_AQC_GSET_RSS_KEY_VSI_VALID); + + return ice_aq_send_cmd(hw, &desc, key, key_size, NULL); +} + +/** + * ice_aq_set_rss_key + * @hw: pointer to the HW struct + * @vsi_handle: software VSI handle + * @keys: pointer to key info struct + * + * set the RSS key per VSI + */ +enum ice_status +ice_aq_set_rss_key(struct ice_hw *hw, uint16_t vsi_handle, + struct ice_aqc_get_set_rss_keys *keys) +{ + if (!ice_is_vsi_valid(hw, vsi_handle) || !keys) + return ICE_ERR_PARAM; + + return ice_aq_get_set_rss_key(hw, hw->vsi_ctx[vsi_handle]->vsi_num, + keys, true); +} + +/** + * ice_set_rss_key - Configure a given VSI with the default RSS key + * @vsi: the VSI to configure + * + * Program the hardware RSS key. We use rss_getkey to grab the kernel RSS key. + * If the kernel RSS interface is not available, this will fall back to our + * pre-generated hash seed from ice_get_default_rss_key(). + */ +int +ice_set_rss_key(struct ice_vsi *vsi) +{ + struct ice_aqc_get_set_rss_keys keydata = { .standard_rss_key = {0} }; + struct ice_softc *sc = vsi->sc; + struct ice_hw *hw = &sc->hw; + enum ice_status status; + + stoeplitz_to_key(keydata.standard_rss_key, + sizeof(keydata.standard_rss_key)); + + status = ice_aq_set_rss_key(hw, vsi->idx, &keydata); + if (status) { + DPRINTF("%s: ice_aq_set_rss_key: status %s, error %s\n", + __func__, ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + return (EIO); + } + + return (0); +} + +/** + * ice_get_rss_hdr_type - get a RSS profile's header type + * @prof: RSS flow profile + */ +enum ice_rss_cfg_hdr_type +ice_get_rss_hdr_type(struct ice_flow_prof *prof) +{ + enum ice_rss_cfg_hdr_type hdr_type = ICE_RSS_ANY_HEADERS; + + if (prof->segs_cnt == ICE_FLOW_SEG_SINGLE) { + hdr_type = ICE_RSS_OUTER_HEADERS; + } else if (prof->segs_cnt == ICE_FLOW_SEG_MAX) { + const struct ice_flow_seg_info *s; + + s = &prof->segs[ICE_RSS_OUTER_HEADERS]; + if (s->hdrs == ICE_FLOW_SEG_HDR_NONE) + hdr_type = ICE_RSS_INNER_HEADERS; + if (s->hdrs & ICE_FLOW_SEG_HDR_IPV4) + hdr_type = ICE_RSS_INNER_HEADERS_W_OUTER_IPV4; + if (s->hdrs & ICE_FLOW_SEG_HDR_IPV6) + hdr_type = ICE_RSS_INNER_HEADERS_W_OUTER_IPV6; + } + + return hdr_type; +} + +/** + * ice_add_rss_list - add RSS configuration to list + * @hw: pointer to the hardware structure + * @vsi_handle: software VSI handle + * @prof: pointer to flow profile + * + * Assumption: lock has already been acquired for RSS list + */ +enum ice_status +ice_add_rss_list(struct ice_hw *hw, uint16_t vsi_handle, + struct ice_flow_prof *prof) +{ + enum ice_rss_cfg_hdr_type hdr_type; + struct ice_rss_cfg *r, *rss_cfg; + uint64_t seg_match = 0; + uint16_t i; + + ice_for_each_set_bit(i, prof->segs[prof->segs_cnt - 1].match, + ICE_FLOW_FIELD_IDX_MAX) { + seg_match |= 1ULL << i; + } + + hdr_type = ice_get_rss_hdr_type(prof); + TAILQ_FOREACH(r, &hw->rss_list_head, l_entry) + if (r->hash.hash_flds == seg_match && + r->hash.addl_hdrs == prof->segs[prof->segs_cnt - 1].hdrs && + r->hash.hdr_type == hdr_type) { + ice_set_bit(vsi_handle, r->vsis); + return ICE_SUCCESS; + } + + rss_cfg = (struct ice_rss_cfg *)ice_malloc(hw, sizeof(*rss_cfg)); + if (!rss_cfg) + return ICE_ERR_NO_MEMORY; + + rss_cfg->hash.hash_flds = seg_match; + rss_cfg->hash.addl_hdrs = prof->segs[prof->segs_cnt - 1].hdrs; + rss_cfg->hash.hdr_type = hdr_type; + rss_cfg->hash.symm = prof->cfg.symm; + ice_set_bit(vsi_handle, rss_cfg->vsis); + + TAILQ_INSERT_TAIL(&hw->rss_list_head, rss_cfg, l_entry); + + return ICE_SUCCESS; +} + +#define ICE_FLOW_PROF_HASH_S 0 +#define ICE_FLOW_PROF_HASH_M (0xFFFFFFFFULL << ICE_FLOW_PROF_HASH_S) +#define ICE_FLOW_PROF_HDR_S 32 +#define ICE_FLOW_PROF_HDR_M (0x3FFFFFFFULL << ICE_FLOW_PROF_HDR_S) +#define ICE_FLOW_PROF_ENCAP_S 62 +#define ICE_FLOW_PROF_ENCAP_M (0x3ULL << ICE_FLOW_PROF_ENCAP_S) + +/* Flow profile ID format: + * [0:31] - Packet match fields + * [32:61] - Protocol header + * [62:63] - Encapsulation flag: + * 0 if non-tunneled + * 1 if tunneled + * 2 for tunneled with outer IPv4 + * 3 for tunneled with outer IPv6 + */ +#define ICE_FLOW_GEN_PROFID(hash, hdr, encap) \ + ((uint64_t)(((uint64_t)(hash) & ICE_FLOW_PROF_HASH_M) | \ + (((uint64_t)(hdr) << ICE_FLOW_PROF_HDR_S) & \ + ICE_FLOW_PROF_HDR_M) | \ + (((uint64_t)(encap) << ICE_FLOW_PROF_ENCAP_S) & \ + ICE_FLOW_PROF_ENCAP_M))) + +#define ICE_FLOW_SEG_HDRS_L3_MASK \ + (ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_ARP) +#define ICE_FLOW_SEG_HDRS_L4_MASK \ + (ICE_FLOW_SEG_HDR_ICMP | ICE_FLOW_SEG_HDR_TCP | ICE_FLOW_SEG_HDR_UDP | \ + ICE_FLOW_SEG_HDR_SCTP) +/* mask for L4 protocols that are NOT part of IPv4/6 OTHER PTYPE groups */ +#define ICE_FLOW_SEG_HDRS_L4_MASK_NO_OTHER \ + (ICE_FLOW_SEG_HDR_TCP | ICE_FLOW_SEG_HDR_UDP | ICE_FLOW_SEG_HDR_SCTP) + +/** + * ice_is_pow2 - Check if the value is a power of 2 + * @n: 64bit number + * + * Check if the given value is a power of 2. + * + * @remark OpenBSD's powerof2 function treats zero as a power of 2, while this + * function does not. + * + * @returns true or false + */ +static inline bool ice_is_pow2(uint64_t n) { + if (n == 0) + return false; + return powerof2(n); +} + +/** + * ice_flow_val_hdrs - validates packet segments for valid protocol headers + * @segs: array of one or more packet segments that describe the flow + * @segs_cnt: number of packet segments provided + */ +enum ice_status +ice_flow_val_hdrs(struct ice_flow_seg_info *segs, uint8_t segs_cnt) +{ + uint8_t i; + + for (i = 0; i < segs_cnt; i++) { + /* Multiple L3 headers */ + if (segs[i].hdrs & ICE_FLOW_SEG_HDRS_L3_MASK && + !ice_is_pow2(segs[i].hdrs & ICE_FLOW_SEG_HDRS_L3_MASK)) + return ICE_ERR_PARAM; + + /* Multiple L4 headers */ + if (segs[i].hdrs & ICE_FLOW_SEG_HDRS_L4_MASK && + !ice_is_pow2(segs[i].hdrs & ICE_FLOW_SEG_HDRS_L4_MASK)) + return ICE_ERR_PARAM; + } + + return ICE_SUCCESS; +} + +/* Size of known protocol header fields */ +#define ICE_FLOW_FLD_SZ_ETH_TYPE 2 +#define ICE_FLOW_FLD_SZ_VLAN 2 +#define ICE_FLOW_FLD_SZ_IPV4_ADDR 4 +#define ICE_FLOW_FLD_SZ_IPV6_ADDR 16 +#define ICE_FLOW_FLD_SZ_IP_DSCP 1 +#define ICE_FLOW_FLD_SZ_IP_TTL 1 +#define ICE_FLOW_FLD_SZ_IP_PROT 1 +#define ICE_FLOW_FLD_SZ_PORT 2 +#define ICE_FLOW_FLD_SZ_TCP_FLAGS 1 +#define ICE_FLOW_FLD_SZ_ICMP_TYPE 1 +#define ICE_FLOW_FLD_SZ_ICMP_CODE 1 +#define ICE_FLOW_FLD_SZ_ARP_OPER 2 +#define ICE_FLOW_FLD_SZ_GRE_KEYID 4 + +/* Describe properties of a protocol header field */ +struct ice_flow_field_info { + enum ice_flow_seg_hdr hdr; + int16_t off; /* Offset from start of a protocol header, in bits */ + uint16_t size; /* Size of fields in bits */ +}; + +#define ICE_FLOW_FLD_INFO(_hdr, _offset_bytes, _size_bytes) { \ + .hdr = _hdr, \ + .off = (_offset_bytes) * 8, \ + .size = (_size_bytes) * 8, \ +} + +/* Table containing properties of supported protocol header fields */ +static const +struct ice_flow_field_info ice_flds_info[ICE_FLOW_FIELD_IDX_MAX] = { + /* Ether */ + /* ICE_FLOW_FIELD_IDX_ETH_DA */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_ETH, 0, ETHER_ADDR_LEN), + /* ICE_FLOW_FIELD_IDX_ETH_SA */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_ETH, ETHER_ADDR_LEN, ETHER_ADDR_LEN), + /* ICE_FLOW_FIELD_IDX_S_VLAN */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_VLAN, 12, ICE_FLOW_FLD_SZ_VLAN), + /* ICE_FLOW_FIELD_IDX_C_VLAN */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_VLAN, 14, ICE_FLOW_FLD_SZ_VLAN), + /* ICE_FLOW_FIELD_IDX_ETH_TYPE */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_ETH, 0, ICE_FLOW_FLD_SZ_ETH_TYPE), + /* IPv4 / IPv6 */ + /* ICE_FLOW_FIELD_IDX_IPV4_DSCP */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_IPV4, 1, ICE_FLOW_FLD_SZ_IP_DSCP), + /* ICE_FLOW_FIELD_IDX_IPV6_DSCP */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_IPV6, 0, ICE_FLOW_FLD_SZ_IP_DSCP), + /* ICE_FLOW_FIELD_IDX_IPV4_TTL */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_NONE, 8, ICE_FLOW_FLD_SZ_IP_TTL), + /* ICE_FLOW_FIELD_IDX_IPV4_PROT */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_NONE, 9, ICE_FLOW_FLD_SZ_IP_PROT), + /* ICE_FLOW_FIELD_IDX_IPV6_TTL */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_NONE, 7, ICE_FLOW_FLD_SZ_IP_TTL), + /* ICE_FLOW_FIELD_IDX_IPV4_PROT */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_NONE, 6, ICE_FLOW_FLD_SZ_IP_PROT), + /* ICE_FLOW_FIELD_IDX_IPV4_SA */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_IPV4, 12, ICE_FLOW_FLD_SZ_IPV4_ADDR), + /* ICE_FLOW_FIELD_IDX_IPV4_DA */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_IPV4, 16, ICE_FLOW_FLD_SZ_IPV4_ADDR), + /* ICE_FLOW_FIELD_IDX_IPV6_SA */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_IPV6, 8, ICE_FLOW_FLD_SZ_IPV6_ADDR), + /* ICE_FLOW_FIELD_IDX_IPV6_DA */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_IPV6, 24, ICE_FLOW_FLD_SZ_IPV6_ADDR), + /* Transport */ + /* ICE_FLOW_FIELD_IDX_TCP_SRC_PORT */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_TCP, 0, ICE_FLOW_FLD_SZ_PORT), + /* ICE_FLOW_FIELD_IDX_TCP_DST_PORT */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_TCP, 2, ICE_FLOW_FLD_SZ_PORT), + /* ICE_FLOW_FIELD_IDX_UDP_SRC_PORT */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_UDP, 0, ICE_FLOW_FLD_SZ_PORT), + /* ICE_FLOW_FIELD_IDX_UDP_DST_PORT */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_UDP, 2, ICE_FLOW_FLD_SZ_PORT), + /* ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_SCTP, 0, ICE_FLOW_FLD_SZ_PORT), + /* ICE_FLOW_FIELD_IDX_SCTP_DST_PORT */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_SCTP, 2, ICE_FLOW_FLD_SZ_PORT), + /* ICE_FLOW_FIELD_IDX_TCP_FLAGS */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_TCP, 13, ICE_FLOW_FLD_SZ_TCP_FLAGS), + /* ARP */ + /* ICE_FLOW_FIELD_IDX_ARP_SIP */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_ARP, 14, ICE_FLOW_FLD_SZ_IPV4_ADDR), + /* ICE_FLOW_FIELD_IDX_ARP_DIP */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_ARP, 24, ICE_FLOW_FLD_SZ_IPV4_ADDR), + /* ICE_FLOW_FIELD_IDX_ARP_SHA */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_ARP, 8, ETHER_ADDR_LEN), + /* ICE_FLOW_FIELD_IDX_ARP_DHA */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_ARP, 18, ETHER_ADDR_LEN), + /* ICE_FLOW_FIELD_IDX_ARP_OP */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_ARP, 6, ICE_FLOW_FLD_SZ_ARP_OPER), + /* ICMP */ + /* ICE_FLOW_FIELD_IDX_ICMP_TYPE */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_ICMP, 0, ICE_FLOW_FLD_SZ_ICMP_TYPE), + /* ICE_FLOW_FIELD_IDX_ICMP_CODE */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_ICMP, 1, ICE_FLOW_FLD_SZ_ICMP_CODE), + /* GRE */ + /* ICE_FLOW_FIELD_IDX_GRE_KEYID */ + ICE_FLOW_FLD_INFO(ICE_FLOW_SEG_HDR_GRE, 12, ICE_FLOW_FLD_SZ_GRE_KEYID), +}; + +/* Bitmaps indicating relevant packet types for a particular protocol header + * + * Packet types for packets with an Outer/First/Single MAC header + */ +static const uint32_t ice_ptypes_mac_ofos[] = { + 0xFDC00846, 0xBFBF7F7E, 0xF70001DF, 0xFEFDFDFB, + 0x0000077E, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +/* Packet types for packets with an Innermost/Last MAC VLAN header */ +static const uint32_t ice_ptypes_macvlan_il[] = { + 0x00000000, 0xBC000000, 0x000001DF, 0xF0000000, + 0x0000077E, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +/* Packet types for packets with an Outer/First/Single non-frag IPv4 header, + * does NOT include IPV4 other PTYPEs + */ +static const uint32_t ice_ptypes_ipv4_ofos[] = { + 0x1D800000, 0x04000800, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +/* Packet types for packets with an Outer/First/Single non-frag IPv4 header, + * includes IPV4 other PTYPEs + */ +static const uint32_t ice_ptypes_ipv4_ofos_all[] = { + 0x1D800000, 0x04000800, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +/* Packet types for packets with an Innermost/Last IPv4 header */ +static const uint32_t ice_ptypes_ipv4_il[] = { + 0xE0000000, 0xB807700E, 0x80000003, 0xE01DC03B, + 0x0000000E, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +/* Packet types for packets with an Outer/First/Single non-frag IPv6 header, + * does NOT include IVP6 other PTYPEs + */ +static const uint32_t ice_ptypes_ipv6_ofos[] = { + 0x00000000, 0x00000000, 0x76000000, 0x10002000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +/* Packet types for packets with an Outer/First/Single non-frag IPv6 header, + * includes IPV6 other PTYPEs + */ +static const uint32_t ice_ptypes_ipv6_ofos_all[] = { + 0x00000000, 0x00000000, 0x76000000, 0x10002000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +/* Packet types for packets with an Innermost/Last IPv6 header */ +static const uint32_t ice_ptypes_ipv6_il[] = { + 0x00000000, 0x03B80770, 0x000001DC, 0x0EE00000, + 0x00000770, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +/* Packet types for packets with an Outer/First/Single + * non-frag IPv4 header - no L4 + */ +static const uint32_t ice_ptypes_ipv4_ofos_no_l4[] = { + 0x10800000, 0x04000800, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +/* Packet types for packets with an Innermost/Last IPv4 header - no L4 */ +static const uint32_t ice_ptypes_ipv4_il_no_l4[] = { + 0x60000000, 0x18043008, 0x80000002, 0x6010c021, + 0x00000008, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +/* Packet types for packets with an Outer/First/Single + * non-frag IPv6 header - no L4 + */ +static const uint32_t ice_ptypes_ipv6_ofos_no_l4[] = { + 0x00000000, 0x00000000, 0x42000000, 0x10002000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +/* Packet types for packets with an Innermost/Last IPv6 header - no L4 */ +static const uint32_t ice_ptypes_ipv6_il_no_l4[] = { + 0x00000000, 0x02180430, 0x0000010c, 0x086010c0, + 0x00000430, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +/* Packet types for packets with an Outermost/First ARP header */ +static const uint32_t ice_ptypes_arp_of[] = { + 0x00000800, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +/* UDP Packet types for non-tunneled packets or tunneled + * packets with inner UDP. + */ +static const uint32_t ice_ptypes_udp_il[] = { + 0x81000000, 0x20204040, 0x04000010, 0x80810102, + 0x00000040, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +/* Packet types for packets with an Innermost/Last TCP header */ +static const uint32_t ice_ptypes_tcp_il[] = { + 0x04000000, 0x80810102, 0x10000040, 0x02040408, + 0x00000102, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +/* Packet types for packets with an Innermost/Last SCTP header */ +static const uint32_t ice_ptypes_sctp_il[] = { + 0x08000000, 0x01020204, 0x20000081, 0x04080810, + 0x00000204, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +/* Packet types for packets with an Outermost/First ICMP header */ +static const uint32_t ice_ptypes_icmp_of[] = { + 0x10000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +/* Packet types for packets with an Innermost/Last ICMP header */ +static const uint32_t ice_ptypes_icmp_il[] = { + 0x00000000, 0x02040408, 0x40000102, 0x08101020, + 0x00000408, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +/* Packet types for packets with an Outermost/First GRE header */ +static const uint32_t ice_ptypes_gre_of[] = { + 0x00000000, 0xBFBF7800, 0x000001DF, 0xFEFDE000, + 0x0000017E, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +/* Packet types for packets with an Innermost/Last MAC header */ +static const uint32_t ice_ptypes_mac_il[] = { + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, +}; + +/* Manage parameters and info. used during the creation of a flow profile */ +struct ice_flow_prof_params { + enum ice_block blk; + uint16_t entry_length; /* # of bytes formatted entry will require */ + uint8_t es_cnt; + struct ice_flow_prof *prof; + + /* For ACL, the es[0] will have the data of ICE_RX_MDID_PKT_FLAGS_15_0 + * This will give us the direction flags. + */ + struct ice_fv_word es[ICE_MAX_FV_WORDS]; + + ice_declare_bitmap(ptypes, ICE_FLOW_PTYPE_MAX); +}; + +/** + * ice_flow_proc_seg_hdrs - process protocol headers present in pkt segments + * @params: information about the flow to be processed + * + * This function identifies the packet types associated with the protocol + * headers being present in packet segments of the specified flow profile. + */ +enum ice_status +ice_flow_proc_seg_hdrs(struct ice_flow_prof_params *params) +{ + struct ice_flow_prof *prof; + uint8_t i; + + memset(params->ptypes, 0xff, sizeof(params->ptypes)); + + prof = params->prof; + + for (i = 0; i < params->prof->segs_cnt; i++) { + const ice_bitmap_t *src; + uint32_t hdrs; + + hdrs = prof->segs[i].hdrs; + + if (hdrs & ICE_FLOW_SEG_HDR_ETH) { + src = !i ? (const ice_bitmap_t *)ice_ptypes_mac_ofos : + (const ice_bitmap_t *)ice_ptypes_mac_il; + ice_and_bitmap(params->ptypes, params->ptypes, src, + ICE_FLOW_PTYPE_MAX); + } + + if (i && hdrs & ICE_FLOW_SEG_HDR_VLAN) { + src = (const ice_bitmap_t *)ice_ptypes_macvlan_il; + ice_and_bitmap(params->ptypes, params->ptypes, src, + ICE_FLOW_PTYPE_MAX); + } + + if (!i && hdrs & ICE_FLOW_SEG_HDR_ARP) { + ice_and_bitmap(params->ptypes, params->ptypes, + (const ice_bitmap_t *)ice_ptypes_arp_of, + ICE_FLOW_PTYPE_MAX); + } + + if ((hdrs & ICE_FLOW_SEG_HDR_IPV4) && + (hdrs & ICE_FLOW_SEG_HDR_IPV_OTHER)) { + src = i ? (const ice_bitmap_t *)ice_ptypes_ipv4_il : + (const ice_bitmap_t *)ice_ptypes_ipv4_ofos_all; + ice_and_bitmap(params->ptypes, params->ptypes, src, + ICE_FLOW_PTYPE_MAX); + } else if ((hdrs & ICE_FLOW_SEG_HDR_IPV6) && + (hdrs & ICE_FLOW_SEG_HDR_IPV_OTHER)) { + src = i ? (const ice_bitmap_t *)ice_ptypes_ipv6_il : + (const ice_bitmap_t *)ice_ptypes_ipv6_ofos_all; + ice_and_bitmap(params->ptypes, params->ptypes, src, + ICE_FLOW_PTYPE_MAX); + } else if ((hdrs & ICE_FLOW_SEG_HDR_IPV4) && + !(hdrs & ICE_FLOW_SEG_HDRS_L4_MASK_NO_OTHER)) { + src = !i ? (const ice_bitmap_t *)ice_ptypes_ipv4_ofos_no_l4 : + (const ice_bitmap_t *)ice_ptypes_ipv4_il_no_l4; + ice_and_bitmap(params->ptypes, params->ptypes, src, + ICE_FLOW_PTYPE_MAX); + } else if (hdrs & ICE_FLOW_SEG_HDR_IPV4) { + src = !i ? (const ice_bitmap_t *)ice_ptypes_ipv4_ofos : + (const ice_bitmap_t *)ice_ptypes_ipv4_il; + ice_and_bitmap(params->ptypes, params->ptypes, src, + ICE_FLOW_PTYPE_MAX); + } else if ((hdrs & ICE_FLOW_SEG_HDR_IPV6) && + !(hdrs & ICE_FLOW_SEG_HDRS_L4_MASK_NO_OTHER)) { + src = !i ? (const ice_bitmap_t *)ice_ptypes_ipv6_ofos_no_l4 : + (const ice_bitmap_t *)ice_ptypes_ipv6_il_no_l4; + ice_and_bitmap(params->ptypes, params->ptypes, src, + ICE_FLOW_PTYPE_MAX); + } else if (hdrs & ICE_FLOW_SEG_HDR_IPV6) { + src = !i ? (const ice_bitmap_t *)ice_ptypes_ipv6_ofos : + (const ice_bitmap_t *)ice_ptypes_ipv6_il; + ice_and_bitmap(params->ptypes, params->ptypes, src, + ICE_FLOW_PTYPE_MAX); + } + + if (hdrs & ICE_FLOW_SEG_HDR_UDP) { + src = (const ice_bitmap_t *)ice_ptypes_udp_il; + ice_and_bitmap(params->ptypes, params->ptypes, src, + ICE_FLOW_PTYPE_MAX); + } else if (hdrs & ICE_FLOW_SEG_HDR_TCP) { + ice_and_bitmap(params->ptypes, params->ptypes, + (const ice_bitmap_t *)ice_ptypes_tcp_il, + ICE_FLOW_PTYPE_MAX); + } else if (hdrs & ICE_FLOW_SEG_HDR_SCTP) { + src = (const ice_bitmap_t *)ice_ptypes_sctp_il; + ice_and_bitmap(params->ptypes, params->ptypes, src, + ICE_FLOW_PTYPE_MAX); + } + + if (hdrs & ICE_FLOW_SEG_HDR_ICMP) { + src = !i ? (const ice_bitmap_t *)ice_ptypes_icmp_of : + (const ice_bitmap_t *)ice_ptypes_icmp_il; + ice_and_bitmap(params->ptypes, params->ptypes, src, + ICE_FLOW_PTYPE_MAX); + } else if (hdrs & ICE_FLOW_SEG_HDR_GRE) { + if (!i) { + src = (const ice_bitmap_t *)ice_ptypes_gre_of; + ice_and_bitmap(params->ptypes, params->ptypes, + src, ICE_FLOW_PTYPE_MAX); + } + } + } + + return ICE_SUCCESS; +} + +/** + * ice_flow_xtract_fld - Create an extraction sequence entry for the given field + * @hw: pointer to the HW struct + * @params: information about the flow to be processed + * @seg: packet segment index of the field to be extracted + * @fld: ID of field to be extracted + * + * This function determines the protocol ID, offset, and size of the given + * field. It then allocates one or more extraction sequence entries for the + * given field, and fill the entries with protocol ID and offset information. + */ +enum ice_status +ice_flow_xtract_fld(struct ice_hw *hw, struct ice_flow_prof_params *params, + uint8_t seg, enum ice_flow_field fld) +{ + enum ice_flow_field sib = ICE_FLOW_FIELD_IDX_MAX; + uint8_t fv_words = (uint8_t)hw->blk[params->blk].es.fvw; + enum ice_prot_id prot_id = ICE_PROT_ID_INVAL; + struct ice_flow_fld_info *flds; + uint16_t cnt, ese_bits, i; + uint16_t off; + + flds = params->prof->segs[seg].fields; + + switch (fld) { + case ICE_FLOW_FIELD_IDX_ETH_DA: + case ICE_FLOW_FIELD_IDX_ETH_SA: + case ICE_FLOW_FIELD_IDX_S_VLAN: + case ICE_FLOW_FIELD_IDX_C_VLAN: + prot_id = seg == 0 ? ICE_PROT_MAC_OF_OR_S : ICE_PROT_MAC_IL; + break; + case ICE_FLOW_FIELD_IDX_ETH_TYPE: + prot_id = seg == 0 ? ICE_PROT_ETYPE_OL : ICE_PROT_ETYPE_IL; + break; + case ICE_FLOW_FIELD_IDX_IPV4_DSCP: + prot_id = seg == 0 ? ICE_PROT_IPV4_OF_OR_S : ICE_PROT_IPV4_IL; + break; + case ICE_FLOW_FIELD_IDX_IPV6_DSCP: + prot_id = seg == 0 ? ICE_PROT_IPV6_OF_OR_S : ICE_PROT_IPV6_IL; + break; + case ICE_FLOW_FIELD_IDX_IPV4_TTL: + case ICE_FLOW_FIELD_IDX_IPV4_PROT: + prot_id = seg == 0 ? ICE_PROT_IPV4_OF_OR_S : ICE_PROT_IPV4_IL; + /* TTL and PROT share the same extraction seq. entry. + * Each is considered a sibling to the other in terms of sharing + * the same extraction sequence entry. + */ + if (fld == ICE_FLOW_FIELD_IDX_IPV4_TTL) + sib = ICE_FLOW_FIELD_IDX_IPV4_PROT; + else + sib = ICE_FLOW_FIELD_IDX_IPV4_TTL; + break; + case ICE_FLOW_FIELD_IDX_IPV6_TTL: + case ICE_FLOW_FIELD_IDX_IPV6_PROT: + prot_id = seg == 0 ? ICE_PROT_IPV6_OF_OR_S : ICE_PROT_IPV6_IL; + /* TTL and PROT share the same extraction seq. entry. + * Each is considered a sibling to the other in terms of sharing + * the same extraction sequence entry. + */ + if (fld == ICE_FLOW_FIELD_IDX_IPV6_TTL) + sib = ICE_FLOW_FIELD_IDX_IPV6_PROT; + else + sib = ICE_FLOW_FIELD_IDX_IPV6_TTL; + break; + case ICE_FLOW_FIELD_IDX_IPV4_SA: + case ICE_FLOW_FIELD_IDX_IPV4_DA: + prot_id = seg == 0 ? ICE_PROT_IPV4_OF_OR_S : ICE_PROT_IPV4_IL; + break; + case ICE_FLOW_FIELD_IDX_IPV6_SA: + case ICE_FLOW_FIELD_IDX_IPV6_DA: + prot_id = seg == 0 ? ICE_PROT_IPV6_OF_OR_S : ICE_PROT_IPV6_IL; + break; + case ICE_FLOW_FIELD_IDX_TCP_SRC_PORT: + case ICE_FLOW_FIELD_IDX_TCP_DST_PORT: + case ICE_FLOW_FIELD_IDX_TCP_FLAGS: + prot_id = ICE_PROT_TCP_IL; + break; + case ICE_FLOW_FIELD_IDX_UDP_SRC_PORT: + case ICE_FLOW_FIELD_IDX_UDP_DST_PORT: + prot_id = ICE_PROT_UDP_IL_OR_S; + break; + case ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT: + case ICE_FLOW_FIELD_IDX_SCTP_DST_PORT: + prot_id = ICE_PROT_SCTP_IL; + break; + case ICE_FLOW_FIELD_IDX_ARP_SIP: + case ICE_FLOW_FIELD_IDX_ARP_DIP: + case ICE_FLOW_FIELD_IDX_ARP_SHA: + case ICE_FLOW_FIELD_IDX_ARP_DHA: + case ICE_FLOW_FIELD_IDX_ARP_OP: + prot_id = ICE_PROT_ARP_OF; + break; + case ICE_FLOW_FIELD_IDX_ICMP_TYPE: + case ICE_FLOW_FIELD_IDX_ICMP_CODE: + /* ICMP type and code share the same extraction seq. entry */ + prot_id = (params->prof->segs[seg].hdrs & ICE_FLOW_SEG_HDR_IPV4) ? + ICE_PROT_ICMP_IL : ICE_PROT_ICMPV6_IL; + sib = fld == ICE_FLOW_FIELD_IDX_ICMP_TYPE ? + ICE_FLOW_FIELD_IDX_ICMP_CODE : + ICE_FLOW_FIELD_IDX_ICMP_TYPE; + break; + case ICE_FLOW_FIELD_IDX_GRE_KEYID: + prot_id = ICE_PROT_GRE_OF; + break; + default: + return ICE_ERR_NOT_IMPL; + } + + /* Each extraction sequence entry is a word in size, and extracts a + * word-aligned offset from a protocol header. + */ + ese_bits = ICE_FLOW_FV_EXTRACT_SZ * 8; + + flds[fld].xtrct.prot_id = (uint8_t)prot_id; + flds[fld].xtrct.off = (ice_flds_info[fld].off / ese_bits) * + ICE_FLOW_FV_EXTRACT_SZ; + flds[fld].xtrct.disp = (uint8_t)(ice_flds_info[fld].off % ese_bits); + flds[fld].xtrct.idx = params->es_cnt; + + /* Adjust the next field-entry index after accommodating the number of + * entries this field consumes + */ + cnt = howmany(flds[fld].xtrct.disp + ice_flds_info[fld].size, ese_bits); + + /* Fill in the extraction sequence entries needed for this field */ + off = flds[fld].xtrct.off; + for (i = 0; i < cnt; i++) { + /* Only consume an extraction sequence entry if there is no + * sibling field associated with this field or the sibling entry + * already extracts the word shared with this field. + */ + if (sib == ICE_FLOW_FIELD_IDX_MAX || + flds[sib].xtrct.prot_id == ICE_PROT_ID_INVAL || + flds[sib].xtrct.off != off) { + uint8_t idx; + + /* Make sure the number of extraction sequence required + * does not exceed the block's capability + */ + if (params->es_cnt >= fv_words) + return ICE_ERR_MAX_LIMIT; + + /* some blocks require a reversed field vector layout */ + if (hw->blk[params->blk].es.reverse) + idx = fv_words - params->es_cnt - 1; + else + idx = params->es_cnt; + + params->es[idx].prot_id = (uint8_t)prot_id; + params->es[idx].off = off; + params->es_cnt++; + } + + off += ICE_FLOW_FV_EXTRACT_SZ; + } + + return ICE_SUCCESS; +} + +/** + * ice_flow_create_xtrct_seq - Create an extraction sequence for given segments + * @hw: pointer to the HW struct + * @params: information about the flow to be processed + * + * This function iterates through all matched fields in the given segments, and + * creates an extraction sequence for the fields. + */ +enum ice_status +ice_flow_create_xtrct_seq(struct ice_hw *hw, + struct ice_flow_prof_params *params) +{ + enum ice_status status = ICE_SUCCESS; + uint8_t i; + + for (i = 0; i < params->prof->segs_cnt; i++) { + ice_declare_bitmap(match, ICE_FLOW_FIELD_IDX_MAX); + enum ice_flow_field j; + + ice_cp_bitmap(match, params->prof->segs[i].match, + ICE_FLOW_FIELD_IDX_MAX); + ice_for_each_set_bit(j, match, ICE_FLOW_FIELD_IDX_MAX) { + status = ice_flow_xtract_fld(hw, params, i, j); + if (status) + return status; + ice_clear_bit(j, match); + } + } + + return status; +} + +/** + * ice_flow_proc_segs - process all packet segments associated with a profile + * @hw: pointer to the HW struct + * @params: information about the flow to be processed + */ +enum ice_status +ice_flow_proc_segs(struct ice_hw *hw, struct ice_flow_prof_params *params) +{ + enum ice_status status; + + status = ice_flow_proc_seg_hdrs(params); + if (status) + return status; + + status = ice_flow_create_xtrct_seq(hw, params); + if (status) + return status; + + switch (params->blk) { + case ICE_BLK_RSS: + status = ICE_SUCCESS; + break; + default: + return ICE_ERR_NOT_IMPL; + } + + return status; +} + +/** + * ice_find_prof_id - find profile ID for a given field vector + * @hw: pointer to the hardware structure + * @blk: HW block + * @fv: field vector to search for + * @prof_id: receives the profile ID + */ +enum ice_status +ice_find_prof_id(struct ice_hw *hw, enum ice_block blk, + struct ice_fv_word *fv, uint8_t *prof_id) +{ + struct ice_es *es = &hw->blk[blk].es; + uint16_t off; + uint8_t i; + + for (i = 0; i < (uint8_t)es->count; i++) { + off = i * es->fvw; + + if (memcmp(&es->t[off], fv, es->fvw * sizeof(*fv))) + continue; + + *prof_id = i; + return ICE_SUCCESS; + } + + return ICE_ERR_DOES_NOT_EXIST; +} + +/** + * ice_alloc_prof_id - allocate profile ID + * @hw: pointer to the HW struct + * @blk: the block to allocate the profile ID for + * @prof_id: pointer to variable to receive the profile ID + * + * This function allocates a new profile ID, which also corresponds to a Field + * Vector (Extraction Sequence) entry. + */ +enum ice_status +ice_alloc_prof_id(struct ice_hw *hw, enum ice_block blk, uint8_t *prof_id) +{ + enum ice_status status; + uint16_t res_type; + uint16_t get_prof; + + if (!ice_prof_id_rsrc_type(blk, &res_type)) + return ICE_ERR_PARAM; + + status = ice_alloc_hw_res(hw, res_type, 1, false, &get_prof); + if (!status) + *prof_id = (uint8_t)get_prof; + + return status; +} + +/** + * ice_ptg_find_ptype - Search for packet type group using packet type (ptype) + * @hw: pointer to the hardware structure + * @blk: HW block + * @ptype: the ptype to search for + * @ptg: pointer to variable that receives the PTG + * + * This function will search the PTGs for a particular ptype, returning the + * PTG ID that contains it through the PTG parameter, with the value of + * ICE_DEFAULT_PTG (0) meaning it is part the default PTG. + */ +enum ice_status +ice_ptg_find_ptype(struct ice_hw *hw, enum ice_block blk, uint16_t ptype, + uint8_t *ptg) +{ + if (ptype >= ICE_XLT1_CNT || !ptg) + return ICE_ERR_PARAM; + + *ptg = hw->blk[blk].xlt1.ptypes[ptype].ptg; + return ICE_SUCCESS; +} + +/** + * ice_add_prof - add profile + * @hw: pointer to the HW struct + * @blk: hardware block + * @id: profile tracking ID + * @ptypes: bitmap indicating ptypes (ICE_FLOW_PTYPE_MAX bits) + * @es: extraction sequence (length of array is determined by the block) + * + * This function registers a profile, which matches a set of PTGs with a + * particular extraction sequence. While the hardware profile is allocated + * it will not be written until the first call to ice_add_flow that specifies + * the ID value used here. + */ +enum ice_status +ice_add_prof(struct ice_hw *hw, enum ice_block blk, uint64_t id, + ice_bitmap_t *ptypes, struct ice_fv_word *es) +{ + ice_declare_bitmap(ptgs_used, ICE_XLT1_CNT); + struct ice_prof_map *prof; + enum ice_status status; + uint8_t prof_id; + uint16_t ptype; + + ice_zero_bitmap(ptgs_used, ICE_XLT1_CNT); +#if 0 + ice_acquire_lock(&hw->blk[blk].es.prof_map_lock); +#endif + /* search for existing profile */ + status = ice_find_prof_id(hw, blk, es, &prof_id); + if (status) { + /* allocate profile ID */ + status = ice_alloc_prof_id(hw, blk, &prof_id); + if (status) + goto err_ice_add_prof; + + /* and write new es */ + ice_write_es(hw, blk, prof_id, es); + } + + ice_prof_inc_ref(hw, blk, prof_id); + + /* add profile info */ + + prof = (struct ice_prof_map *)ice_malloc(hw, sizeof(*prof)); + if (!prof) + goto err_ice_add_prof; + + prof->profile_cookie = id; + prof->prof_id = prof_id; + prof->ptg_cnt = 0; + prof->context = 0; + + /* build list of ptgs */ + ice_for_each_set_bit(ptype, ptypes, ICE_FLOW_PTYPE_MAX) { + uint8_t ptg; + + /* The package should place all ptypes in a non-zero + * PTG, so the following call should never fail. + */ + if (ice_ptg_find_ptype(hw, blk, ptype, &ptg)) + continue; + + /* If PTG is already added, skip and continue */ + if (ice_is_bit_set(ptgs_used, ptg)) + continue; + + ice_set_bit(ptg, ptgs_used); + prof->ptg[prof->ptg_cnt] = ptg; + + if (++prof->ptg_cnt >= ICE_MAX_PTG_PER_PROFILE) + break; + } + + TAILQ_INSERT_HEAD(&hw->blk[blk].es.prof_map, prof, list); + status = ICE_SUCCESS; + +err_ice_add_prof: +#if 0 + ice_release_lock(&hw->blk[blk].es.prof_map_lock); +#endif + return status; +} + +#define ICE_FV_OFFSET_INVAL 0x1FF + +/** + * ice_flow_add_prof_sync - Add a flow profile for packet segments and fields + * @hw: pointer to the HW struct + * @blk: classification stage + * @dir: flow direction + * @prof_id: unique ID to identify this flow profile + * @segs: array of one or more packet segments that describe the flow + * @segs_cnt: number of packet segments provided + * @acts: array of default actions + * @acts_cnt: number of default actions + * @prof: stores the returned flow profile added + * + * Assumption: the caller has acquired the lock to the profile list + */ +enum ice_status +ice_flow_add_prof_sync(struct ice_hw *hw, enum ice_block blk, + enum ice_flow_dir dir, uint64_t prof_id, + struct ice_flow_seg_info *segs, uint8_t segs_cnt, + struct ice_flow_action *acts, uint8_t acts_cnt, + struct ice_flow_prof **prof) +{ + struct ice_flow_prof_params *params; + enum ice_status status; + uint8_t i; + + if (!prof || (acts_cnt && !acts)) + return ICE_ERR_BAD_PTR; + + params = (struct ice_flow_prof_params *)ice_malloc(hw, sizeof(*params)); + if (!params) + return ICE_ERR_NO_MEMORY; + + params->prof = (struct ice_flow_prof *) + ice_malloc(hw, sizeof(*params->prof)); + if (!params->prof) { + status = ICE_ERR_NO_MEMORY; + goto free_params; + } + + /* initialize extraction sequence to all invalid (0xff) */ + for (i = 0; i < ICE_MAX_FV_WORDS; i++) { + params->es[i].prot_id = ICE_PROT_INVALID; + params->es[i].off = ICE_FV_OFFSET_INVAL; + } + + params->blk = blk; + params->prof->id = prof_id; + params->prof->dir = dir; + params->prof->segs_cnt = segs_cnt; + + /* Make a copy of the segments that need to be persistent in the flow + * profile instance + */ + for (i = 0; i < segs_cnt; i++) + memcpy(¶ms->prof->segs[i], &segs[i], sizeof(*segs)); + + status = ice_flow_proc_segs(hw, params); + if (status) { + DNPRINTF(ICE_DBG_FLOW, + "%s: Error processing a flow's packet segments\n", + __func__); + goto out; + } + + /* Add a HW profile for this flow profile */ + status = ice_add_prof(hw, blk, prof_id, params->ptypes, params->es); + if (status) { + DNPRINTF(ICE_DBG_FLOW, "%s: Error adding a HW flow profile\n", + __func__); + goto out; + } + + *prof = params->prof; + +out: + if (status) { + ice_free(hw, params->prof); + } +free_params: + ice_free(hw, params); + + return status; +} + +/** + * ice_flow_add_prof - Add a flow profile for packet segments and matched fields + * @hw: pointer to the HW struct + * @blk: classification stage + * @dir: flow direction + * @prof_id: unique ID to identify this flow profile + * @segs: array of one or more packet segments that describe the flow + * @segs_cnt: number of packet segments provided + * @acts: array of default actions + * @acts_cnt: number of default actions + * @prof: stores the returned flow profile added + */ +static enum ice_status +ice_flow_add_prof(struct ice_hw *hw, enum ice_block blk, enum ice_flow_dir dir, + uint64_t prof_id, struct ice_flow_seg_info *segs, uint8_t segs_cnt, + struct ice_flow_action *acts, uint8_t acts_cnt, + struct ice_flow_prof **prof) +{ + enum ice_status status; + + if (segs_cnt > ICE_FLOW_SEG_MAX) + return ICE_ERR_MAX_LIMIT; + + if (!segs_cnt) + return ICE_ERR_PARAM; + + if (!segs) + return ICE_ERR_BAD_PTR; + + status = ice_flow_val_hdrs(segs, segs_cnt); + if (status) + return status; +#if 0 + ice_acquire_lock(&hw->fl_profs_locks[blk]); +#endif + status = ice_flow_add_prof_sync(hw, blk, dir, prof_id, segs, segs_cnt, + acts, acts_cnt, prof); + if (!status) + TAILQ_INSERT_HEAD(&hw->fl_profs[blk], *prof, l_entry); +#if 0 + ice_release_lock(&hw->fl_profs_locks[blk]); +#endif + return status; +} + +/** + * ice_get_prof - get profile + * @hw: pointer to the HW struct + * @blk: hardware block + * @hdl: profile handle + * @chg: change list + */ +enum ice_status +ice_get_prof(struct ice_hw *hw, enum ice_block blk, uint64_t hdl, + struct ice_chs_chg_head *chg) +{ + enum ice_status status = ICE_SUCCESS; + struct ice_prof_map *map; + struct ice_chs_chg *p; + uint16_t i; +#if 0 + ice_acquire_lock(&hw->blk[blk].es.prof_map_lock); +#endif + /* Get the details on the profile specified by the handle ID */ + map = ice_search_prof_id(hw, blk, hdl); + if (!map) { + status = ICE_ERR_DOES_NOT_EXIST; + goto err_ice_get_prof; + } + + for (i = 0; i < map->ptg_cnt; i++) + if (!hw->blk[blk].es.written[map->prof_id]) { + /* add ES to change list */ + p = (struct ice_chs_chg *)ice_malloc(hw, sizeof(*p)); + if (!p) { + status = ICE_ERR_NO_MEMORY; + goto err_ice_get_prof; + } + + p->type = ICE_PTG_ES_ADD; + p->ptype = 0; + p->ptg = map->ptg[i]; + p->add_ptg = 0; + + p->add_prof = 1; + p->prof_id = map->prof_id; + + hw->blk[blk].es.written[map->prof_id] = true; + + TAILQ_INSERT_HEAD(chg, p, list_entry); + } + +err_ice_get_prof: +#if 0 + ice_release_lock(&hw->blk[blk].es.prof_map_lock); +#endif + /* let caller clean up the change list */ + return status; +} + +/** + * ice_add_prof_to_lst - add profile entry to a list + * @hw: pointer to the HW struct + * @blk: hardware block + * @lst: the list to be added to + * @hdl: profile handle of entry to add + */ +enum ice_status +ice_add_prof_to_lst(struct ice_hw *hw, enum ice_block blk, + struct ice_vsig_prof_head *lst, uint64_t hdl) +{ + enum ice_status status = ICE_SUCCESS; + struct ice_prof_map *map; + struct ice_vsig_prof *p; + uint16_t i; +#if 0 + ice_acquire_lock(&hw->blk[blk].es.prof_map_lock); +#endif + map = ice_search_prof_id(hw, blk, hdl); + if (!map) { + status = ICE_ERR_DOES_NOT_EXIST; + goto err_ice_add_prof_to_lst; + } + + p = (struct ice_vsig_prof *)ice_malloc(hw, sizeof(*p)); + if (!p) { + status = ICE_ERR_NO_MEMORY; + goto err_ice_add_prof_to_lst; + } + + p->profile_cookie = map->profile_cookie; + p->prof_id = map->prof_id; + p->tcam_count = map->ptg_cnt; + + for (i = 0; i < map->ptg_cnt; i++) { + p->tcam[i].prof_id = map->prof_id; + p->tcam[i].tcam_idx = ICE_INVALID_TCAM; + p->tcam[i].ptg = map->ptg[i]; + } + + TAILQ_INSERT_HEAD(lst, p, list); + +err_ice_add_prof_to_lst: +#if 0 + ice_release_lock(&hw->blk[blk].es.prof_map_lock); +#endif + return status; +} + +/** + * ice_find_prof_vsig - find a VSIG with a specific profile handle + * @hw: pointer to the HW struct + * @blk: hardware block + * @hdl: the profile handle of the profile to search for + * @vsig: returns the VSIG with the matching profile + */ +bool +ice_find_prof_vsig(struct ice_hw *hw, enum ice_block blk, uint64_t hdl, + uint16_t *vsig) +{ + struct ice_vsig_prof *t; + enum ice_status status; + struct ice_vsig_prof_head lst; + + TAILQ_INIT(&lst); + + t = (struct ice_vsig_prof *)ice_malloc(hw, sizeof(*t)); + if (!t) + return false; + + t->profile_cookie = hdl; + TAILQ_INSERT_HEAD(&lst, t, list); + + status = ice_find_dup_props_vsig(hw, blk, &lst, vsig); + + TAILQ_REMOVE(&lst, t, list); + ice_free(hw, t); + + return status == ICE_SUCCESS; +} + +/** + * ice_create_prof_id_vsig - add a new VSIG with a single profile + * @hw: pointer to the HW struct + * @blk: hardware block + * @vsi: the initial VSI that will be in VSIG + * @hdl: the profile handle of the profile that will be added to the VSIG + * @chg: the change list + */ +enum ice_status +ice_create_prof_id_vsig(struct ice_hw *hw, enum ice_block blk, uint16_t vsi, + uint64_t hdl, struct ice_chs_chg_head *chg) +{ + enum ice_status status; + struct ice_chs_chg *p; + uint16_t new_vsig; + + p = (struct ice_chs_chg *)ice_malloc(hw, sizeof(*p)); + if (!p) + return ICE_ERR_NO_MEMORY; + + new_vsig = ice_vsig_alloc(hw, blk); + if (!new_vsig) { + status = ICE_ERR_HW_TABLE; + goto err_ice_create_prof_id_vsig; + } + + status = ice_move_vsi(hw, blk, vsi, new_vsig, chg); + if (status) + goto err_ice_create_prof_id_vsig; + + status = ice_add_prof_id_vsig(hw, blk, new_vsig, hdl, false, chg); + if (status) + goto err_ice_create_prof_id_vsig; + + p->type = ICE_VSIG_ADD; + p->vsi = vsi; + p->orig_vsig = ICE_DEFAULT_VSIG; + p->vsig = new_vsig; + + TAILQ_INSERT_HEAD(chg, p, list_entry); + + return ICE_SUCCESS; + +err_ice_create_prof_id_vsig: + /* let caller clean up the change list */ + ice_free(hw, p); + return status; +} + +/** + * ice_add_prof_id_flow - add profile flow + * @hw: pointer to the HW struct + * @blk: hardware block + * @vsi: the VSI to enable with the profile specified by ID + * @hdl: profile handle + * + * Calling this function will update the hardware tables to enable the + * profile indicated by the ID parameter for the VSIs specified in the VSI + * array. Once successfully called, the flow will be enabled. + */ +enum ice_status +ice_add_prof_id_flow(struct ice_hw *hw, enum ice_block blk, uint16_t vsi, + uint64_t hdl) +{ + struct ice_vsig_prof *tmp1, *del1; + struct ice_chs_chg *tmp, *del; + struct ice_vsig_prof_head union_lst; + enum ice_status status; + struct ice_chs_chg_head chg; + uint16_t vsig; + + TAILQ_INIT(&union_lst); + TAILQ_INIT(&chg); + + /* Get profile */ + status = ice_get_prof(hw, blk, hdl, &chg); + if (status) + return status; + + /* determine if VSI is already part of a VSIG */ + status = ice_vsig_find_vsi(hw, blk, vsi, &vsig); + if (!status && vsig) { + bool only_vsi; + uint16_t or_vsig; + uint16_t ref; + + /* found in VSIG */ + or_vsig = vsig; + + /* make sure that there is no overlap/conflict between the new + * characteristics and the existing ones; we don't support that + * scenario + */ + if (ice_has_prof_vsig(hw, blk, vsig, hdl)) { + status = ICE_ERR_ALREADY_EXISTS; + goto err_ice_add_prof_id_flow; + } + + /* last VSI in the VSIG? */ + status = ice_vsig_get_ref(hw, blk, vsig, &ref); + if (status) + goto err_ice_add_prof_id_flow; + only_vsi = (ref == 1); + + /* create a union of the current profiles and the one being + * added + */ + status = ice_get_profs_vsig(hw, blk, vsig, &union_lst); + if (status) + goto err_ice_add_prof_id_flow; + + status = ice_add_prof_to_lst(hw, blk, &union_lst, hdl); + if (status) + goto err_ice_add_prof_id_flow; + + /* search for an existing VSIG with an exact charc match */ + status = ice_find_dup_props_vsig(hw, blk, &union_lst, &vsig); + if (!status) { + /* move VSI to the VSIG that matches */ + status = ice_move_vsi(hw, blk, vsi, vsig, &chg); + if (status) + goto err_ice_add_prof_id_flow; + + /* VSI has been moved out of or_vsig. If the or_vsig had + * only that VSI it is now empty and can be removed. + */ + if (only_vsi) { + status = ice_rem_vsig(hw, blk, or_vsig, &chg); + if (status) + goto err_ice_add_prof_id_flow; + } + } else if (only_vsi) { + /* If the original VSIG only contains one VSI, then it + * will be the requesting VSI. In this case the VSI is + * not sharing entries and we can simply add the new + * profile to the VSIG. + */ + status = ice_add_prof_id_vsig(hw, blk, vsig, hdl, false, + &chg); + if (status) + goto err_ice_add_prof_id_flow; + + /* Adjust priorities */ + status = ice_adj_prof_priorities(hw, blk, vsig, &chg); + if (status) + goto err_ice_add_prof_id_flow; + } else { + /* No match, so we need a new VSIG */ + status = ice_create_vsig_from_lst(hw, blk, vsi, + &union_lst, &vsig, + &chg); + if (status) + goto err_ice_add_prof_id_flow; + + /* Adjust priorities */ + status = ice_adj_prof_priorities(hw, blk, vsig, &chg); + if (status) + goto err_ice_add_prof_id_flow; + } + } else { + /* need to find or add a VSIG */ + /* search for an existing VSIG with an exact charc match */ + if (ice_find_prof_vsig(hw, blk, hdl, &vsig)) { + /* found an exact match */ + /* add or move VSI to the VSIG that matches */ + status = ice_move_vsi(hw, blk, vsi, vsig, &chg); + if (status) + goto err_ice_add_prof_id_flow; + } else { + /* we did not find an exact match */ + /* we need to add a VSIG */ + status = ice_create_prof_id_vsig(hw, blk, vsi, hdl, + &chg); + if (status) + goto err_ice_add_prof_id_flow; + } + } + + /* update hardware */ + if (!status) + status = ice_upd_prof_hw(hw, blk, &chg); + +err_ice_add_prof_id_flow: + TAILQ_FOREACH_SAFE(del, &chg, list_entry, tmp) { + TAILQ_REMOVE(&chg, del, list_entry); + ice_free(hw, del); + } + + TAILQ_FOREACH_SAFE(del1, &union_lst, list, tmp1) { + TAILQ_REMOVE(&union_lst, del1, list); + ice_free(hw, del1); + } + + return status; +} + +/** + * ice_flow_assoc_prof - associate a VSI with a flow profile + * @hw: pointer to the hardware structure + * @blk: classification stage + * @prof: pointer to flow profile + * @vsi_handle: software VSI handle + * + * Assumption: the caller has acquired the lock to the profile list + * and the software VSI handle has been validated + */ +enum ice_status +ice_flow_assoc_prof(struct ice_hw *hw, enum ice_block blk, + struct ice_flow_prof *prof, uint16_t vsi_handle) +{ + enum ice_status status = ICE_SUCCESS; + + if (!ice_is_bit_set(prof->vsis, vsi_handle)) { + status = ice_add_prof_id_flow(hw, blk, + hw->vsi_ctx[vsi_handle]->vsi_num, + prof->id); + if (!status) + ice_set_bit(vsi_handle, prof->vsis); + else + DNPRINTF(ICE_DBG_FLOW, + "%s: HW profile add failed, %d\n", + __func__, status); + } + + return status; +} + +#define ICE_FLOW_RSS_SEG_HDR_L3_MASKS \ + (ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV6) + +#define ICE_FLOW_RSS_SEG_HDR_L4_MASKS \ + (ICE_FLOW_SEG_HDR_TCP | ICE_FLOW_SEG_HDR_UDP | ICE_FLOW_SEG_HDR_SCTP) + +#define ICE_FLOW_RSS_SEG_HDR_VAL_MASKS \ + (ICE_FLOW_RSS_SEG_HDR_L3_MASKS | \ + ICE_FLOW_RSS_SEG_HDR_L4_MASKS) + +#define ICE_FLOW_SET_HDRS(seg, val) ((seg)->hdrs |= (uint32_t)(val)) + +/** + * ice_flow_set_fld_ext - specifies locations of field from entry's input buffer + * @seg: packet segment the field being set belongs to + * @fld: field to be set + * @field_type: type of the field + * @val_loc: if not ICE_FLOW_FLD_OFF_INVAL, location of the value to match from + * entry's input buffer + * @mask_loc: if not ICE_FLOW_FLD_OFF_INVAL, location of mask value from entry's + * input buffer + * @last_loc: if not ICE_FLOW_FLD_OFF_INVAL, location of last/upper value from + * entry's input buffer + * + * This helper function stores information of a field being matched, including + * the type of the field and the locations of the value to match, the mask, and + * the upper-bound value in the start of the input buffer for a flow entry. + * This function should only be used for fixed-size data structures. + * + * This function also opportunistically determines the protocol headers to be + * present based on the fields being set. Some fields cannot be used alone to + * determine the protocol headers present. Sometimes, fields for particular + * protocol headers are not matched. In those cases, the protocol headers + * must be explicitly set. + */ +void +ice_flow_set_fld_ext(struct ice_flow_seg_info *seg, enum ice_flow_field fld, + enum ice_flow_fld_match_type field_type, uint16_t val_loc, + uint16_t mask_loc, uint16_t last_loc) +{ + ice_set_bit(fld, seg->match); + if (field_type == ICE_FLOW_FLD_TYPE_RANGE) + ice_set_bit(fld, seg->range); + + seg->fields[fld].type = field_type; + seg->fields[fld].src.val = val_loc; + seg->fields[fld].src.mask = mask_loc; + seg->fields[fld].src.last = last_loc; + + ICE_FLOW_SET_HDRS(seg, ice_flds_info[fld].hdr); +} + +/** + * ice_flow_set_fld - specifies locations of field from entry's input buffer + * @seg: packet segment the field being set belongs to + * @fld: field to be set + * @val_loc: if not ICE_FLOW_FLD_OFF_INVAL, location of the value to match from + * entry's input buffer + * @mask_loc: if not ICE_FLOW_FLD_OFF_INVAL, location of mask value from entry's + * input buffer + * @last_loc: if not ICE_FLOW_FLD_OFF_INVAL, location of last/upper value from + * entry's input buffer + * @range: indicate if field being matched is to be in a range + * + * This function specifies the locations, in the form of byte offsets from the + * start of the input buffer for a flow entry, from where the value to match, + * the mask value, and upper value can be extracted. These locations are then + * stored in the flow profile. When adding a flow entry associated with the + * flow profile, these locations will be used to quickly extract the values and + * create the content of a match entry. This function should only be used for + * fixed-size data structures. + */ +void +ice_flow_set_fld(struct ice_flow_seg_info *seg, enum ice_flow_field fld, + uint16_t val_loc, uint16_t mask_loc, uint16_t last_loc, + bool range) +{ + enum ice_flow_fld_match_type t = range ? + ICE_FLOW_FLD_TYPE_RANGE : ICE_FLOW_FLD_TYPE_REG; + + ice_flow_set_fld_ext(seg, fld, t, val_loc, mask_loc, last_loc); +} + +/** + * ice_flow_set_rss_seg_info - setup packet segments for RSS + * @segs: pointer to the flow field segment(s) + * @seg_cnt: segment count + * @cfg: configure parameters + * + * Helper function to extract fields from hash bitmap and use flow + * header value to set flow field segment for further use in flow + * profile entry or removal. + */ +enum ice_status +ice_flow_set_rss_seg_info(struct ice_flow_seg_info *segs, uint8_t seg_cnt, + const struct ice_rss_hash_cfg *cfg) +{ + struct ice_flow_seg_info *seg; + uint64_t val; + uint16_t i; + + /* set inner most segment */ + seg = &segs[seg_cnt - 1]; + + ice_for_each_set_bit(i, (const ice_bitmap_t *)&cfg->hash_flds, + (uint16_t)ICE_FLOW_FIELD_IDX_MAX) + ice_flow_set_fld(seg, (enum ice_flow_field)i, + ICE_FLOW_FLD_OFF_INVAL, ICE_FLOW_FLD_OFF_INVAL, + ICE_FLOW_FLD_OFF_INVAL, false); + + ICE_FLOW_SET_HDRS(seg, cfg->addl_hdrs); + + /* set outer most header */ + if (cfg->hdr_type == ICE_RSS_INNER_HEADERS_W_OUTER_IPV4) + segs[ICE_RSS_OUTER_HEADERS].hdrs |= ICE_FLOW_SEG_HDR_IPV4 | + ICE_FLOW_SEG_HDR_IPV_FRAG | + ICE_FLOW_SEG_HDR_IPV_OTHER; + else if (cfg->hdr_type == ICE_RSS_INNER_HEADERS_W_OUTER_IPV6) + segs[ICE_RSS_OUTER_HEADERS].hdrs |= ICE_FLOW_SEG_HDR_IPV6 | + ICE_FLOW_SEG_HDR_IPV_FRAG | + ICE_FLOW_SEG_HDR_IPV_OTHER; + else if (cfg->hdr_type == ICE_RSS_INNER_HEADERS_W_OUTER_IPV4_GRE) + segs[ICE_RSS_OUTER_HEADERS].hdrs |= ICE_FLOW_SEG_HDR_IPV4 | + ICE_FLOW_SEG_HDR_GRE | + ICE_FLOW_SEG_HDR_IPV_OTHER; + else if (cfg->hdr_type == ICE_RSS_INNER_HEADERS_W_OUTER_IPV6_GRE) + segs[ICE_RSS_OUTER_HEADERS].hdrs |= ICE_FLOW_SEG_HDR_IPV6 | + ICE_FLOW_SEG_HDR_GRE | + ICE_FLOW_SEG_HDR_IPV_OTHER; + + if (seg->hdrs & ~ICE_FLOW_RSS_SEG_HDR_VAL_MASKS) + return ICE_ERR_PARAM; + + val = (uint64_t)(seg->hdrs & ICE_FLOW_RSS_SEG_HDR_L3_MASKS); + if (val && !ice_is_pow2(val)) + return ICE_ERR_CFG; + + val = (uint64_t)(seg->hdrs & ICE_FLOW_RSS_SEG_HDR_L4_MASKS); + if (val && !ice_is_pow2(val)) + return ICE_ERR_CFG; + + return ICE_SUCCESS; +} + +#define ICE_FLOW_FIND_PROF_CHK_FLDS 0x00000001 +#define ICE_FLOW_FIND_PROF_CHK_VSI 0x00000002 +#define ICE_FLOW_FIND_PROF_NOT_CHK_DIR 0x00000004 + +/** + * ice_flow_find_prof_conds - Find a profile matching headers and conditions + * @hw: pointer to the HW struct + * @blk: classification stage + * @dir: flow direction + * @segs: array of one or more packet segments that describe the flow + * @segs_cnt: number of packet segments provided + * @vsi_handle: software VSI handle to check VSI (ICE_FLOW_FIND_PROF_CHK_VSI) + * @conds: additional conditions to be checked (ICE_FLOW_FIND_PROF_CHK_*) + */ +struct ice_flow_prof * +ice_flow_find_prof_conds(struct ice_hw *hw, enum ice_block blk, + enum ice_flow_dir dir, struct ice_flow_seg_info *segs, + uint8_t segs_cnt, uint16_t vsi_handle, uint32_t conds) +{ + struct ice_flow_prof *p, *prof = NULL; +#if 0 + ice_acquire_lock(&hw->fl_profs_locks[blk]); +#endif + TAILQ_FOREACH(p, &hw->fl_profs[blk], l_entry) { + if ((p->dir == dir || conds & ICE_FLOW_FIND_PROF_NOT_CHK_DIR) && + segs_cnt && segs_cnt == p->segs_cnt) { + uint8_t i; + + /* Check for profile-VSI association if specified */ + if ((conds & ICE_FLOW_FIND_PROF_CHK_VSI) && + ice_is_vsi_valid(hw, vsi_handle) && + !ice_is_bit_set(p->vsis, vsi_handle)) + continue; + + /* Protocol headers must be checked. Matched fields are + * checked if specified. + */ + for (i = 0; i < segs_cnt; i++) + if (segs[i].hdrs != p->segs[i].hdrs || + ((conds & ICE_FLOW_FIND_PROF_CHK_FLDS) && + (ice_cmp_bitmap(segs[i].match, + p->segs[i].match, + ICE_FLOW_FIELD_IDX_MAX) == + false))) + break; + + /* A match is found if all segments are matched */ + if (i == segs_cnt) { + prof = p; + break; + } + } + } +#if 0 + ice_release_lock(&hw->fl_profs_locks[blk]); +#endif + return prof; +} + +/** + * ice_rem_rss_list - remove RSS configuration from list + * @hw: pointer to the hardware structure + * @vsi_handle: software VSI handle + * @prof: pointer to flow profile + * + * Assumption: lock has already been acquired for RSS list + */ +void +ice_rem_rss_list(struct ice_hw *hw, uint16_t vsi_handle, + struct ice_flow_prof *prof) +{ + enum ice_rss_cfg_hdr_type hdr_type; + struct ice_rss_cfg *r, *tmp; + uint64_t seg_match = 0; + uint16_t i; + + /* convert match bitmap to u64 for hash field comparison */ + ice_for_each_set_bit(i, prof->segs[prof->segs_cnt - 1].match, + ICE_FLOW_FIELD_IDX_MAX) { + seg_match |= 1ULL << i; + } + + /* Search for RSS hash fields associated to the VSI that match the + * hash configurations associated to the flow profile. If found + * remove from the RSS entry list of the VSI context and delete entry. + */ + hdr_type = ice_get_rss_hdr_type(prof); + TAILQ_FOREACH_SAFE(r, &hw->rss_list_head, l_entry, tmp) { + if (r->hash.hash_flds == seg_match && + r->hash.addl_hdrs == prof->segs[prof->segs_cnt - 1].hdrs && + r->hash.hdr_type == hdr_type) { + ice_clear_bit(vsi_handle, r->vsis); + if (!ice_is_any_bit_set(r->vsis, ICE_MAX_VSI)) { + TAILQ_REMOVE(&hw->rss_list_head, r, l_entry); + ice_free(hw, r); + } + return; + } + } +} + +/** + * ice_add_rss_cfg_sync - add an RSS configuration + * @hw: pointer to the hardware structure + * @vsi_handle: software VSI handle + * @cfg: configure parameters + * + * Assumption: lock has already been acquired for RSS list + */ +enum ice_status +ice_add_rss_cfg_sync(struct ice_hw *hw, uint16_t vsi_handle, + const struct ice_rss_hash_cfg *cfg) +{ + const enum ice_block blk = ICE_BLK_RSS; + struct ice_flow_prof *prof = NULL; + struct ice_flow_seg_info *segs; + enum ice_status status; + uint8_t segs_cnt; + + if (cfg->symm) + return ICE_ERR_PARAM; + + segs_cnt = (cfg->hdr_type == ICE_RSS_OUTER_HEADERS) ? + ICE_FLOW_SEG_SINGLE : + ICE_FLOW_SEG_MAX; + + segs = (struct ice_flow_seg_info *)ice_calloc(hw, segs_cnt, + sizeof(*segs)); + if (!segs) + return ICE_ERR_NO_MEMORY; + + /* Construct the packet segment info from the hashed fields */ + status = ice_flow_set_rss_seg_info(segs, segs_cnt, cfg); + if (status) + goto exit; + + /* Search for a flow profile that has matching headers, hash fields + * and has the input VSI associated to it. If found, no further + * operations required and exit. + */ + prof = ice_flow_find_prof_conds(hw, blk, ICE_FLOW_RX, segs, segs_cnt, + vsi_handle, + ICE_FLOW_FIND_PROF_CHK_FLDS | + ICE_FLOW_FIND_PROF_CHK_VSI); + if (prof) + goto exit; + + /* Check if a flow profile exists with the same protocol headers and + * associated with the input VSI. If so disassociate the VSI from + * this profile. The VSI will be added to a new profile created with + * the protocol header and new hash field configuration. + */ + prof = ice_flow_find_prof_conds(hw, blk, ICE_FLOW_RX, segs, segs_cnt, + vsi_handle, ICE_FLOW_FIND_PROF_CHK_VSI); + if (prof) { + status = ice_flow_disassoc_prof(hw, blk, prof, vsi_handle); + if (!status) + ice_rem_rss_list(hw, vsi_handle, prof); + else + goto exit; + + /* Remove profile if it has no VSIs associated */ + if (!ice_is_any_bit_set(prof->vsis, ICE_MAX_VSI)) { + status = ice_flow_rem_prof(hw, blk, prof->id); + if (status) + goto exit; + } + } + + /* Search for a profile that has same match fields only. If this + * exists then associate the VSI to this profile. + */ + prof = ice_flow_find_prof_conds(hw, blk, ICE_FLOW_RX, segs, segs_cnt, + vsi_handle, + ICE_FLOW_FIND_PROF_CHK_FLDS); + if (prof) { + status = ice_flow_assoc_prof(hw, blk, prof, vsi_handle); + if (!status) + status = ice_add_rss_list(hw, vsi_handle, prof); + goto exit; + } + + /* Create a new flow profile with generated profile and packet + * segment information. + */ + status = ice_flow_add_prof(hw, blk, ICE_FLOW_RX, + ICE_FLOW_GEN_PROFID(cfg->hash_flds, + segs[segs_cnt - 1].hdrs, + cfg->hdr_type), + segs, segs_cnt, NULL, 0, &prof); + if (status) + goto exit; + + status = ice_flow_assoc_prof(hw, blk, prof, vsi_handle); + /* If association to a new flow profile failed then this profile can + * be removed. + */ + if (status) { + ice_flow_rem_prof(hw, blk, prof->id); + goto exit; + } + + status = ice_add_rss_list(hw, vsi_handle, prof); + + prof->cfg.symm = cfg->symm; + +exit: + ice_free(hw, segs); + return status; +} + +/** + * ice_add_rss_cfg - add an RSS configuration with specified hashed fields + * @hw: pointer to the hardware structure + * @vsi_handle: software VSI handle + * @cfg: configure parameters + * + * This function will generate a flow profile based on fields associated with + * the input fields to hash on, the flow type and use the VSI number to add + * a flow entry to the profile. + */ +enum ice_status +ice_add_rss_cfg(struct ice_hw *hw, uint16_t vsi_handle, + const struct ice_rss_hash_cfg *cfg) +{ + struct ice_rss_hash_cfg local_cfg; + enum ice_status status; + + if (!ice_is_vsi_valid(hw, vsi_handle) || !cfg || + cfg->hdr_type > ICE_RSS_ANY_HEADERS || + cfg->hash_flds == ICE_HASH_INVALID) + return ICE_ERR_PARAM; +#if 0 + ice_acquire_lock(&hw->rss_locks); +#endif + local_cfg = *cfg; + if (cfg->hdr_type < ICE_RSS_ANY_HEADERS) { + status = ice_add_rss_cfg_sync(hw, vsi_handle, &local_cfg); + } else { + local_cfg.hdr_type = ICE_RSS_OUTER_HEADERS; + status = ice_add_rss_cfg_sync(hw, vsi_handle, &local_cfg); + if (!status) { + local_cfg.hdr_type = ICE_RSS_INNER_HEADERS; + status = ice_add_rss_cfg_sync(hw, vsi_handle, + &local_cfg); + } + } +#if 0 + ice_release_lock(&hw->rss_locks); +#endif + return status; +} +/** + * ice_set_rss_flow_flds - Program the RSS hash flows after package init + * @vsi: the VSI to configure + * + * If the package file is initialized, the default RSS flows are reset. We + * need to reprogram the expected hash configuration. + */ +void +ice_set_rss_flow_flds(struct ice_vsi *vsi) +{ + struct ice_softc *sc = vsi->sc; + struct ice_hw *hw = &sc->hw; + struct ice_rss_hash_cfg rss_cfg = { 0, 0, ICE_RSS_ANY_HEADERS, false }; + enum ice_status status; + + rss_cfg.addl_hdrs = ICE_FLOW_SEG_HDR_IPV4; + rss_cfg.hash_flds = ICE_FLOW_HASH_IPV4; + status = ice_add_rss_cfg(hw, vsi->idx, &rss_cfg); + if (status) { + DPRINTF("%s: ice_add_rss_cfg on VSI %d failed for ipv4 flow, " + "err %s aq_err %s\n", __func__, vsi->idx, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + } + + rss_cfg.addl_hdrs = ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_TCP; + rss_cfg.hash_flds = ICE_HASH_TCP_IPV4; + status = ice_add_rss_cfg(hw, vsi->idx, &rss_cfg); + if (status) { + DPRINTF("ice_add_rss_cfg on VSI %d failed for tcp4 flow, " + "err %s aq_err %s\n", vsi->idx, ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + } + + rss_cfg.addl_hdrs = ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_UDP; + rss_cfg.hash_flds = ICE_HASH_UDP_IPV4; + status = ice_add_rss_cfg(hw, vsi->idx, &rss_cfg); + if (status) { + DPRINTF("%s: ice_add_rss_cfg on VSI %d failed for udp4 flow, " + "err %s aq_err %s\n", __func__, vsi->idx, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + } + + rss_cfg.addl_hdrs = ICE_FLOW_SEG_HDR_IPV6; + rss_cfg.hash_flds = ICE_FLOW_HASH_IPV6; + status = ice_add_rss_cfg(hw, vsi->idx, &rss_cfg); + if (status) { + DPRINTF("%s: ice_add_rss_cfg on VSI %d failed for ipv6 flow, " + "err %s aq_err %s\n", __func__, vsi->idx, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + } + + rss_cfg.addl_hdrs = ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_TCP; + rss_cfg.hash_flds = ICE_HASH_TCP_IPV6; + status = ice_add_rss_cfg(hw, vsi->idx, &rss_cfg); + if (status) { + DPRINTF("%s: ice_add_rss_cfg on VSI %d failed for tcp6 flow, " + "err %s aq_err %s\n", __func__, vsi->idx, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + } + + rss_cfg.addl_hdrs = ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_UDP; + rss_cfg.hash_flds = ICE_HASH_UDP_IPV6; + status = ice_add_rss_cfg(hw, vsi->idx, &rss_cfg); + if (status) { + DPRINTF("%s: ice_add_rss_cfg on VSI %d failed for udp6 flow, " + "err %s aq_err %s\n", __func__, vsi->idx, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + } +} + +uint16_t +ice_lut_type_to_size(uint16_t lut_type) +{ + switch (lut_type) { + case ICE_LUT_VSI: + return ICE_LUT_VSI_SIZE; + case ICE_LUT_GLOBAL: + return ICE_LUT_GLOBAL_SIZE; + case ICE_LUT_PF: + return ICE_LUT_PF_SIZE; + case ICE_LUT_PF_SMALL: + return ICE_LUT_PF_SMALL_SIZE; + default: + return 0; + } +} + +uint16_t +ice_lut_size_to_flag(uint16_t lut_size) +{ + uint16_t f = 0; + + switch (lut_size) { + case ICE_LUT_GLOBAL_SIZE: + f = ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_512_FLAG; + break; + case ICE_LUT_PF_SIZE: + f = ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_2K_FLAG; + break; + default: + break; + } + return f << ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_S; +} + +/** + * ice_aq_get_set_rss_lut + * @hw: pointer to the hardware structure + * @params: RSS LUT parameters + * @set: set true to set the table, false to get the table + * + * Internal function to get (0x0B05) or set (0x0B03) RSS look up table + */ +enum ice_status +ice_aq_get_set_rss_lut(struct ice_hw *hw, + struct ice_aq_get_set_rss_lut_params *params, bool set) +{ + uint16_t flags, vsi_id, lut_type, lut_size, glob_lut_idx = 0; + uint16_t vsi_handle; + struct ice_aqc_get_set_rss_lut *cmd_resp; + struct ice_aq_desc desc; + enum ice_status status; + uint8_t *lut; + + if (!params) + return ICE_ERR_PARAM; + + vsi_handle = params->vsi_handle; + lut = params->lut; + lut_size = ice_lut_type_to_size(params->lut_type); + lut_type = params->lut_type & ICE_LUT_TYPE_MASK; + cmd_resp = &desc.params.get_set_rss_lut; + if (lut_type == ICE_LUT_GLOBAL) + glob_lut_idx = params->global_lut_id; + + if (!lut || !lut_size || !ice_is_vsi_valid(hw, vsi_handle)) + return ICE_ERR_PARAM; + + if (lut_size > params->lut_size) + return ICE_ERR_INVAL_SIZE; + + if (set && lut_size != params->lut_size) + return ICE_ERR_PARAM; + + vsi_id = hw->vsi_ctx[vsi_handle]->vsi_num; + + if (set) { + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_set_rss_lut); + desc.flags |= htole16(ICE_AQ_FLAG_RD); + } else { + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_get_rss_lut); + } + + cmd_resp->vsi_id = htole16(((vsi_id << + ICE_AQC_GSET_RSS_LUT_VSI_ID_S) & + ICE_AQC_GSET_RSS_LUT_VSI_ID_M) | + ICE_AQC_GSET_RSS_LUT_VSI_VALID); + + flags = ice_lut_size_to_flag(lut_size) | + ((lut_type << ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_S) & + ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_M) | + ((glob_lut_idx << ICE_AQC_GSET_RSS_LUT_GLOBAL_IDX_S) & + ICE_AQC_GSET_RSS_LUT_GLOBAL_IDX_M); + + cmd_resp->flags = htole16(flags); + status = ice_aq_send_cmd(hw, &desc, lut, lut_size, NULL); + params->lut_size = le16toh(desc.datalen); + return status; +} + +/** + * ice_aq_set_rss_lut + * @hw: pointer to the hardware structure + * @set_params: RSS LUT parameters used to specify how to set the RSS LUT + * + * set the RSS lookup table, PF or VSI type + */ +enum ice_status +ice_aq_set_rss_lut(struct ice_hw *hw, + struct ice_aq_get_set_rss_lut_params *set_params) +{ + return ice_aq_get_set_rss_lut(hw, set_params, true); +} + +/** + * ice_set_rss_lut - Program the RSS lookup table for a VSI + * @vsi: the VSI to configure + * + * Programs the RSS lookup table for a given VSI. + */ +int +ice_set_rss_lut(struct ice_vsi *vsi) +{ + struct ice_softc *sc = vsi->sc; + struct ice_hw *hw = &sc->hw; + struct ice_aq_get_set_rss_lut_params lut_params; + enum ice_status status; + int i, err = 0; + uint8_t *lut; + + lut = (uint8_t *)malloc(vsi->rss_table_size, M_DEVBUF, M_NOWAIT|M_ZERO); + if (!lut) { + DPRINTF("%s: Failed to allocate RSS lut memory\n", __func__); + return (ENOMEM); + } + + /* + * Populate the LUT with max no. of queues. This will assign the + * lookup table in a simple round robin fashion. + */ + for (i = 0; i < vsi->rss_table_size; i++) { + /* XXX: this needs to be changed if num_rx_queues ever counts + * more than just the RSS queues */ + lut[i] = i % vsi->num_rx_queues; + } + + lut_params.vsi_handle = vsi->idx; + lut_params.lut_size = vsi->rss_table_size; + lut_params.lut_type = vsi->rss_lut_type; + lut_params.lut = lut; + lut_params.global_lut_id = 0; + status = ice_aq_set_rss_lut(hw, &lut_params); + if (status) { + DPRINTF("%s: Cannot set RSS lut, err %s aq_err %s\n", __func__, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + err = EIO; + } + + free(lut, M_DEVBUF, vsi->rss_table_size); + return err; +} + +/** + * ice_config_rss - Configure RSS for a VSI + * @vsi: the VSI to configure + * + * If FEATURE_RSS is enabled, configures the RSS lookup table and hash key for + * a given VSI. + */ +int +ice_config_rss(struct ice_vsi *vsi) +{ + int err; + + /* Nothing to do, if RSS is not enabled */ + if (!ice_is_bit_set(vsi->sc->feat_en, ICE_FEATURE_RSS)) + return 0; + + err = ice_set_rss_key(vsi); + if (err) + return err; + + ice_set_rss_flow_flds(vsi); + + return ice_set_rss_lut(vsi); +} + +/** + * ice_rebuild - Rebuild driver state post reset + * @sc: The device private softc + * + * Restore driver state after a reset occurred. Restart the controlqs, setup + * the hardware port, and re-enable the VSIs. + */ +void +ice_rebuild(struct ice_softc *sc) +{ + struct ice_hw *hw = &sc->hw; + enum ice_status status; + int err; + + sc->rebuild_ticks = ticks; + + /* If we're rebuilding, then a reset has succeeded. */ + ice_clear_state(&sc->state, ICE_STATE_RESET_FAILED); + + /* + * If the firmware is in recovery mode, only restore the limited + * functionality supported by recovery mode. + */ + if (ice_test_state(&sc->state, ICE_STATE_RECOVERY_MODE)) { + ice_rebuild_recovery_mode(sc); + return; + } +#if 0 + /* enable PCIe bus master */ + pci_enable_busmaster(dev); +#endif + status = ice_init_all_ctrlq(hw); + if (status) { + printf("%s: failed to re-init control queues, err %s\n", + sc->sc_dev.dv_xname, ice_status_str(status)); + goto err_shutdown_ctrlq; + } + + /* Query the allocated resources for Tx scheduler */ + status = ice_sched_query_res_alloc(hw); + if (status) { + printf("%s: Failed to query scheduler resources, " + "err %s aq_err %s\n", sc->sc_dev.dv_xname, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + goto err_shutdown_ctrlq; + } + + /* Re-enable FW logging. Keep going even if this fails */ + status = ice_fwlog_set(hw, &hw->fwlog_cfg); + if (!status) { + /* + * We should have the most updated cached copy of the + * configuration, regardless of whether we're rebuilding + * or not. So we'll simply check to see if logging was + * enabled pre-rebuild. + */ + if (hw->fwlog_cfg.options & ICE_FWLOG_OPTION_IS_REGISTERED) { + status = ice_fwlog_register(hw); + if (status) + printf("%s: failed to re-register fw logging, " + "err %s aq_err %s\n", + sc->sc_dev.dv_xname, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + } + } else { + printf("%s: failed to rebuild fw logging configuration, " + "err %s aq_err %s\n", sc->sc_dev.dv_xname, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + } + err = ice_send_version(sc); + if (err) + goto err_shutdown_ctrlq; + + err = ice_init_link_events(sc); + if (err) { + printf("%s: ice_init_link_events failed: %d\n", + sc->sc_dev.dv_xname, err); + goto err_shutdown_ctrlq; + } + + status = ice_clear_pf_cfg(hw); + if (status) { + printf("%s: failed to clear PF configuration, err %s\n", + sc->sc_dev.dv_xname, ice_status_str(status)); + goto err_shutdown_ctrlq; + } + + ice_clean_all_vsi_rss_cfg(sc); + + ice_clear_pxe_mode(hw); + + status = ice_get_caps(hw); + if (status) { + printf("%s: failed to get capabilities, err %s\n", + sc->sc_dev.dv_xname, ice_status_str(status)); + goto err_shutdown_ctrlq; + } + + status = ice_sched_init_port(hw->port_info); + if (status) { + printf("%s: failed to initialize port, err %s\n", + sc->sc_dev.dv_xname, ice_status_str(status)); + goto err_sched_cleanup; + } + + /* If we previously loaded the package, it needs to be reloaded now */ + if (!ice_is_bit_set(sc->feat_en, ICE_FEATURE_SAFE_MODE)) { +#if 0 + enum ice_ddp_state pkg_state; + + pkg_state = ice_init_pkg(hw, hw->pkg_copy, hw->pkg_size); + if (!ice_is_init_pkg_successful(pkg_state)) { + ice_log_pkg_init(sc, pkg_state); + ice_transition_safe_mode(sc); + } +#endif + } + + ice_reset_pf_stats(sc); + + err = ice_rebuild_pf_vsi_qmap(sc); + if (err) { + printf("%s: Unable to re-assign main VSI queues, err %d\n", + sc->sc_dev.dv_xname, err); + goto err_sched_cleanup; + } + err = ice_initialize_vsi(&sc->pf_vsi); + if (err) { + printf("%s: Unable to re-initialize Main VSI, err %d\n", + sc->sc_dev.dv_xname, err); + goto err_release_queue_allocations; + } + + /* Replay all VSI configuration */ + err = ice_replay_all_vsi_cfg(sc); + if (err) + goto err_deinit_pf_vsi; + + /* Re-enable FW health event reporting */ + ice_init_health_events(sc); + + /* Reconfigure the main PF VSI for RSS */ + err = ice_config_rss(&sc->pf_vsi); + if (err) { + printf("%s: Unable to reconfigure RSS for the main VSI, " + "err %d\n", sc->sc_dev.dv_xname, err); + goto err_deinit_pf_vsi; + } + + if (hw->port_info->qos_cfg.is_sw_lldp) + ice_add_rx_lldp_filter(sc); + + /* Refresh link status */ + ice_clear_state(&sc->state, ICE_STATE_LINK_STATUS_REPORTED); + sc->hw.port_info->phy.get_link_info = true; + ice_get_link_status(sc->hw.port_info, &sc->link_up); + ice_update_link_status(sc, true); + + /* RDMA interface will be restarted by the stack re-init */ + + /* Configure interrupt causes for the administrative interrupt */ + ice_configure_misc_interrupts(sc); + + /* Enable ITR 0 right away, so that we can handle admin interrupts */ + ice_enable_intr(&sc->hw, 0); + + /* Rebuild is finished. We're no longer prepared to reset */ + ice_clear_state(&sc->state, ICE_STATE_PREPARED_FOR_RESET); +#if 0 + /* Reconfigure the subinterface */ + if (sc->mirr_if) { + err = ice_subif_rebuild(sc); + if (err) + goto err_deinit_pf_vsi; + } +#endif + printf("%s: device rebuild successful\n", sc->sc_dev.dv_xname); + + /* In order to completely restore device functionality, the iflib core + * needs to be reset. We need to request an iflib reset. Additionally, + * because the state of IFC_DO_RESET is cached within task_fn_admin in + * the iflib core, we also want re-run the admin task so that iflib + * resets immediately instead of waiting for the next interrupt. + * If LLDP is enabled we need to reconfig DCB to properly reinit all TC + * queues, not only 0. It contains ice_request_stack_reinit as well. + */ +#if 0 + if (hw->port_info->qos_cfg.is_sw_lldp) + ice_request_stack_reinit(sc); + else + ice_do_dcb_reconfig(sc, false); +#endif + return; + +err_deinit_pf_vsi: + ice_deinit_vsi(&sc->pf_vsi); +err_release_queue_allocations: + ice_resmgr_release_map(&sc->tx_qmgr, sc->pf_vsi.tx_qmap, + sc->pf_vsi.num_tx_queues); + ice_resmgr_release_map(&sc->rx_qmgr, sc->pf_vsi.rx_qmap, + sc->pf_vsi.num_rx_queues); +err_sched_cleanup: + ice_sched_cleanup_all(hw); +err_shutdown_ctrlq: + ice_shutdown_all_ctrlq(hw, false); + ice_clear_state(&sc->state, ICE_STATE_PREPARED_FOR_RESET); + ice_set_state(&sc->state, ICE_STATE_RESET_FAILED); + printf("%s: driver reset failed\n", sc->sc_dev.dv_xname); +} + +/** + * ice_handle_reset_event - Handle reset events triggered by OICR + * @sc: The device private softc + * + * Handle reset events triggered by an OICR notification. This includes CORER, + * GLOBR, and EMPR resets triggered by software on this or any other PF or by + * firmware. + * + * @pre assumes the iflib context lock is held, and will unlock it while + * waiting for the hardware to finish reset. + */ +void +ice_handle_reset_event(struct ice_softc *sc) +{ + struct ice_hw *hw = &sc->hw; + enum ice_status status; + + /* When a CORER, GLOBR, or EMPR is about to happen, the hardware will + * trigger an OICR interrupt. Our OICR handler will determine when + * this occurs and set the ICE_STATE_RESET_OICR_RECV bit as + * appropriate. + */ + if (!ice_testandclear_state(&sc->state, ICE_STATE_RESET_OICR_RECV)) + return; + + ice_prepare_for_reset(sc); + + /* + * Release the iflib context lock and wait for the device to finish + * resetting. + */ +#if 0 + IFLIB_CTX_UNLOCK(sc); +#endif + status = ice_check_reset(hw); +#if 0 + IFLIB_CTX_LOCK(sc); +#endif + if (status) { + printf("%s: Device never came out of reset, err %s\n", + sc->sc_dev.dv_xname, ice_status_str(status)); + ice_set_state(&sc->state, ICE_STATE_RESET_FAILED); + return; + } + + /* We're done with the reset, so we can rebuild driver state */ + sc->hw.reset_ongoing = false; + ice_rebuild(sc); + + /* In the unlikely event that a PF reset request occurs at the same + * time as a global reset, clear the request now. This avoids + * resetting a second time right after we reset due to a global event. + */ + if (ice_testandclear_state(&sc->state, ICE_STATE_RESET_PFR_REQ)) + printf("%s: Ignoring PFR request that occurred while a " + "reset was ongoing\n", sc->sc_dev.dv_xname); +} + +/** + * ice_handle_pf_reset_request - Initiate PF reset requested by software + * @sc: The device private softc + * + * Initiate a PF reset requested by software. We handle this in the admin task + * so that only one thread actually handles driver preparation and cleanup, + * rather than having multiple threads possibly attempt to run this code + * simultaneously. + * + * @pre assumes the iflib context lock is held and will unlock it while + * waiting for the PF reset to complete. + */ +void +ice_handle_pf_reset_request(struct ice_softc *sc) +{ + struct ice_hw *hw = &sc->hw; + enum ice_status status; + + /* Check for PF reset requests */ + if (!ice_testandclear_state(&sc->state, ICE_STATE_RESET_PFR_REQ)) + return; + + /* Make sure we're prepared for reset */ + ice_prepare_for_reset(sc); + + /* + * Release the iflib context lock and wait for the device to finish + * resetting. + */ +#if 0 + IFLIB_CTX_UNLOCK(sc); +#endif + status = ice_reset(hw, ICE_RESET_PFR); +#if 0 + IFLIB_CTX_LOCK(sc); +#endif + if (status) { + printf("%s: device PF reset failed, err %s\n", + sc->sc_dev.dv_xname, ice_status_str(status)); + ice_set_state(&sc->state, ICE_STATE_RESET_FAILED); + return; + } +#if 0 + sc->soft_stats.pfr_count++; +#endif + ice_rebuild(sc); +} + +/** + * ice_handle_mdd_event - Handle possibly malicious events + * @sc: the device softc + * + * Called by the admin task if an MDD detection interrupt is triggered. + * Identifies possibly malicious events coming from VFs. Also triggers for + * similar incorrect behavior from the PF as well. + */ +void +ice_handle_mdd_event(struct ice_softc *sc) +{ + struct ice_hw *hw = &sc->hw; + bool mdd_detected = false, request_reinit = false; + uint32_t reg; + + if (!ice_testandclear_state(&sc->state, ICE_STATE_MDD_PENDING)) + return; + + reg = ICE_READ(hw, GL_MDET_TX_TCLAN); + if (reg & GL_MDET_TX_TCLAN_VALID_M) { + uint8_t pf_num = (reg & GL_MDET_TX_TCLAN_PF_NUM_M) >> + GL_MDET_TX_TCLAN_PF_NUM_S; + uint16_t vf_num = (reg & GL_MDET_TX_TCLAN_VF_NUM_M) >> + GL_MDET_TX_TCLAN_VF_NUM_S; + uint8_t event = (reg & GL_MDET_TX_TCLAN_MAL_TYPE_M) >> + GL_MDET_TX_TCLAN_MAL_TYPE_S; + uint16_t queue = (reg & GL_MDET_TX_TCLAN_QNUM_M) >> + GL_MDET_TX_TCLAN_QNUM_S; + + printf("%s: Malicious Driver Detection Tx Descriptor " + "check event '%s' on Tx queue %u PF# %u VF# %u\n", + sc->sc_dev.dv_xname, ice_mdd_tx_tclan_str(event), + queue, pf_num, vf_num); + + /* Only clear this event if it matches this PF, that way other + * PFs can read the event and determine VF and queue number. + */ + if (pf_num == hw->pf_id) + ICE_WRITE(hw, GL_MDET_TX_TCLAN, 0xffffffff); + + mdd_detected = true; + } + + /* Determine what triggered the MDD event */ + reg = ICE_READ(hw, GL_MDET_TX_PQM); + if (reg & GL_MDET_TX_PQM_VALID_M) { + uint8_t pf_num = (reg & GL_MDET_TX_PQM_PF_NUM_M) >> + GL_MDET_TX_PQM_PF_NUM_S; + uint16_t vf_num = (reg & GL_MDET_TX_PQM_VF_NUM_M) >> + GL_MDET_TX_PQM_VF_NUM_S; + uint8_t event = (reg & GL_MDET_TX_PQM_MAL_TYPE_M) >> + GL_MDET_TX_PQM_MAL_TYPE_S; + uint16_t queue = (reg & GL_MDET_TX_PQM_QNUM_M) >> + GL_MDET_TX_PQM_QNUM_S; + + printf("%s: Malicious Driver Detection Tx Quanta check " + "event '%s' on Tx queue %u PF# %u VF# %u\n", + sc->sc_dev.dv_xname, ice_mdd_tx_pqm_str(event), queue, + pf_num, vf_num); + + /* Only clear this event if it matches this PF, that way other + * PFs can read the event and determine VF and queue number. + */ + if (pf_num == hw->pf_id) + ICE_WRITE(hw, GL_MDET_TX_PQM, 0xffffffff); + + mdd_detected = true; + } + + reg = ICE_READ(hw, GL_MDET_RX); + if (reg & GL_MDET_RX_VALID_M) { + uint8_t pf_num = (reg & GL_MDET_RX_PF_NUM_M) >> + GL_MDET_RX_PF_NUM_S; + uint16_t vf_num = (reg & GL_MDET_RX_VF_NUM_M) >> + GL_MDET_RX_VF_NUM_S; + uint8_t event = (reg & GL_MDET_RX_MAL_TYPE_M) >> + GL_MDET_RX_MAL_TYPE_S; + uint16_t queue = (reg & GL_MDET_RX_QNUM_M) >> + GL_MDET_RX_QNUM_S; + + printf("%s: Malicious Driver Detection Rx event '%s' " + "on Rx queue %u PF# %u VF# %u\n", sc->sc_dev.dv_xname, + ice_mdd_rx_str(event), queue, pf_num, vf_num); + + /* Only clear this event if it matches this PF, that way other + * PFs can read the event and determine VF and queue number. + */ + if (pf_num == hw->pf_id) + ICE_WRITE(hw, GL_MDET_RX, 0xffffffff); + + mdd_detected = true; + } + + /* Now, confirm that this event actually affects this PF, by checking + * the PF registers. + */ + if (mdd_detected) { + reg = ICE_READ(hw, PF_MDET_TX_TCLAN); + if (reg & PF_MDET_TX_TCLAN_VALID_M) { + ICE_WRITE(hw, PF_MDET_TX_TCLAN, 0xffff); +#if 0 + sc->soft_stats.tx_mdd_count++; +#endif + request_reinit = true; + } + + reg = ICE_READ(hw, PF_MDET_TX_PQM); + if (reg & PF_MDET_TX_PQM_VALID_M) { + ICE_WRITE(hw, PF_MDET_TX_PQM, 0xffff); +#if 0 + sc->soft_stats.tx_mdd_count++; +#endif + request_reinit = true; + } + + reg = ICE_READ(hw, PF_MDET_RX); + if (reg & PF_MDET_RX_VALID_M) { + ICE_WRITE(hw, PF_MDET_RX, 0xffff); +#if 0 + sc->soft_stats.rx_mdd_count++; +#endif + request_reinit = true; + } + } + + /* TODO: Implement logic to detect and handle events caused by VFs. */ + /* request that the upper stack re-initialize the Tx/Rx queues */ + if (request_reinit) + ice_request_stack_reinit(sc); + ice_flush(hw); +} + +/** + * ice_check_ctrlq_errors - Check for and report controlq errors + * @sc: device private structure + * @qname: name of the controlq + * @cq: the controlq to check + * + * Check and report controlq errors. Currently all we do is report them to the + * kernel message log, but we might want to improve this in the future, such + * as to keep track of statistics. + */ +void +ice_check_ctrlq_errors(struct ice_softc *sc, const char *qname, + struct ice_ctl_q_info *cq) +{ + struct ice_hw *hw = &sc->hw; + uint32_t val; + + /* Check for error indications. Note that all the controlqs use the + * same register layout, so we use the PF_FW_AxQLEN defines only. + */ + val = ICE_READ(hw, cq->rq.len); + if (val & (PF_FW_ARQLEN_ARQVFE_M | PF_FW_ARQLEN_ARQOVFL_M | + PF_FW_ARQLEN_ARQCRIT_M)) { + if (val & PF_FW_ARQLEN_ARQVFE_M) + printf("%s: %s Receive Queue VF Error detected\n", + sc->sc_dev.dv_xname, qname); + if (val & PF_FW_ARQLEN_ARQOVFL_M) + printf("%s: %s Receive Queue Overflow Error detected\n", + sc->sc_dev.dv_xname, qname); + if (val & PF_FW_ARQLEN_ARQCRIT_M) + printf("%s: %s Receive Queue Critical Error detected\n", + sc->sc_dev.dv_xname, qname); + val &= ~(PF_FW_ARQLEN_ARQVFE_M | PF_FW_ARQLEN_ARQOVFL_M | + PF_FW_ARQLEN_ARQCRIT_M); + ICE_WRITE(hw, cq->rq.len, val); + } + + val = ICE_READ(hw, cq->sq.len); + if (val & (PF_FW_ATQLEN_ATQVFE_M | PF_FW_ATQLEN_ATQOVFL_M | + PF_FW_ATQLEN_ATQCRIT_M)) { + if (val & PF_FW_ATQLEN_ATQVFE_M) + printf("%s: %s Send Queue VF Error detected\n", + sc->sc_dev.dv_xname, qname); + if (val & PF_FW_ATQLEN_ATQOVFL_M) + printf("%s: %s Send Queue Overflow Error detected\n", + sc->sc_dev.dv_xname, qname); + if (val & PF_FW_ATQLEN_ATQCRIT_M) + printf("%s: %s Send Queue Critical Error detected\n", + sc->sc_dev.dv_xname, qname); + val &= ~(PF_FW_ATQLEN_ATQVFE_M | PF_FW_ATQLEN_ATQOVFL_M | + PF_FW_ATQLEN_ATQCRIT_M); + ICE_WRITE(hw, cq->sq.len, val); + } +} + +/** + * ice_process_link_event - Process a link event indication from firmware + * @sc: device softc structure + * @e: the received event data + * + * Gets the current link status from hardware, and may print a message if an + * unqualified is detected. + */ +void +ice_process_link_event(struct ice_softc *sc, struct ice_rq_event_info *e) +{ + struct ice_port_info *pi = sc->hw.port_info; + struct ice_hw *hw = &sc->hw; + enum ice_status status; + + /* Sanity check that the data length isn't too small */ + KASSERT(le16toh(e->desc.datalen) >= ICE_GET_LINK_STATUS_DATALEN_V1); + + /* + * Even though the adapter gets link status information inside the + * event, it needs to send a Get Link Status AQ command in order + * to re-enable link events. + */ + pi->phy.get_link_info = true; + ice_get_link_status(pi, &sc->link_up); + + if (pi->phy.link_info.topo_media_conflict & + (ICE_AQ_LINK_TOPO_CONFLICT | ICE_AQ_LINK_MEDIA_CONFLICT | + ICE_AQ_LINK_TOPO_CORRUPT)) + printf("%s: Possible mis-configuration of the Ethernet port " + "detected: topology conflict, or link media conflict, " + "or link topology corrupt\n", sc->sc_dev.dv_xname); + + if ((pi->phy.link_info.link_info & ICE_AQ_MEDIA_AVAILABLE) && + !(pi->phy.link_info.link_info & ICE_AQ_LINK_UP)) { + if (!(pi->phy.link_info.an_info & ICE_AQ_QUALIFIED_MODULE)) + printf("%s: Link is disabled on this device because " + "an unsupported module type was detected!", + sc->sc_dev.dv_xname); + + if (pi->phy.link_info.link_cfg_err & + ICE_AQ_LINK_MODULE_POWER_UNSUPPORTED) + printf("%s: The module's power requirements exceed " + "the device's power supply. Cannot start link.\n", + sc->sc_dev.dv_xname); + if (pi->phy.link_info.link_cfg_err & + ICE_AQ_LINK_INVAL_MAX_POWER_LIMIT) + printf("%s: The installed module is incompatible with " + "the device's NVM image. Cannot start link.\n", + sc->sc_dev.dv_xname); + } + + if (!(pi->phy.link_info.link_info & ICE_AQ_MEDIA_AVAILABLE)) { + if (!ice_testandset_state(&sc->state, ICE_STATE_NO_MEDIA)) { + status = ice_aq_set_link_restart_an(pi, false, NULL); + if (status != ICE_SUCCESS && + hw->adminq.sq_last_status != ICE_AQ_RC_EMODE) + DPRINTF("%s: ice_aq_set_link_restart_an: " + "status %s, aq_err %s\n", __func__, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + } + } + /* ICE_STATE_NO_MEDIA is cleared when polling task detects media */ + + /* Indicate that link status must be reported again */ + ice_clear_state(&sc->state, ICE_STATE_LINK_STATUS_REPORTED); + + /* OS link info is updated elsewhere */ +} + +/** + * ice_info_fwlog - Format and print an array of values to the console + * @hw: private hardware structure + * @rowsize: preferred number of rows to use + * @groupsize: preferred size in bytes to print each chunk + * @buf: the array buffer to print + * @len: size of the array buffer + * + * Format the given array as a series of uint8_t values with hexadecimal + * notation and log the contents to the console log. This variation is + * specific to firmware logging. + * + * TODO: Currently only supports a group size of 1, due to the way hexdump is + * implemented. + */ +void +ice_info_fwlog(struct ice_hw *hw, uint32_t rowsize, uint32_t __unused groupsize, + uint8_t *buf, size_t len) +{ + struct ice_softc *sc = hw->hw_sc; + + if (!ice_fwlog_supported(hw)) + return; + + /* Format the device header to a string */ + printf("%s: FWLOG: ", sc->sc_dev.dv_xname); + + ice_hexdump(buf, len); +} + +/** + * ice_fwlog_event_dump - Dump the event received over the Admin Receive Queue + * @hw: pointer to the HW structure + * @desc: Admin Receive Queue descriptor + * @buf: buffer that contains the FW log event data + * + * If the driver receives the ice_aqc_opc_fw_logs_event on the Admin Receive + * Queue, then it should call this function to dump the FW log data. + */ +void +ice_fwlog_event_dump(struct ice_hw *hw, struct ice_aq_desc *desc, void *buf) +{ + if (!ice_fwlog_supported(hw)) + return; + + ice_info_fwlog(hw, 32, 1, (uint8_t *)buf, le16toh(desc->datalen)); +} + +/** + * ice_handle_fw_log_event - Handle a firmware logging event from the AdminQ + * @sc: pointer to private softc structure + * @desc: the AdminQ descriptor for this firmware event + * @buf: pointer to the buffer accompanying the AQ message + */ +void +ice_handle_fw_log_event(struct ice_softc *sc, struct ice_aq_desc *desc, + void *buf) +{ +#if 0 + /* Trigger a DTrace probe event for this firmware message */ + SDT_PROBE2(ice_fwlog, , , message, (const u8 *)buf, desc->datalen); +#endif + /* Possibly dump the firmware message to the console, if enabled */ + ice_fwlog_event_dump(&sc->hw, desc, buf); +} + +/** + * ice_debug_print_mib_change_event - helper function to log LLDP MIB change events + * @sc: the device private softc + * @event: event received on a control queue + * + * Prints out the type and contents of an LLDP MIB change event in a DCB debug message. + */ +void +ice_debug_print_mib_change_event(struct ice_softc *sc, + struct ice_rq_event_info *event) +{ +#ifdef ICE_DEBUG + struct ice_aqc_lldp_get_mib *params = + (struct ice_aqc_lldp_get_mib *)&event->desc.params.lldp_get_mib; + uint8_t mib_type, bridge_type, tx_status; + + static const char* mib_type_strings[] = { + "Local MIB", + "Remote MIB", + "Reserved", + "Reserved" + }; + static const char* bridge_type_strings[] = { + "Nearest Bridge", + "Non-TPMR Bridge", + "Reserved", + "Reserved" + }; + static const char* tx_status_strings[] = { + "Port's TX active", + "Port's TX suspended and drained", + "Reserved", + "Port's TX suspended and drained; blocked TC pipe flushed" + }; + + mib_type = (params->type & ICE_AQ_LLDP_MIB_TYPE_M) >> + ICE_AQ_LLDP_MIB_TYPE_S; + bridge_type = (params->type & ICE_AQ_LLDP_BRID_TYPE_M) >> + ICE_AQ_LLDP_BRID_TYPE_S; + tx_status = (params->type & ICE_AQ_LLDP_TX_M) >> + ICE_AQ_LLDP_TX_S; + + DNPRINTF(ICE_DBG_DCB, "%s: LLDP MIB Change Event (%s, %s, %s)\n", + sc->sc_dev.dv_xname, + mib_type_strings[mib_type], bridge_type_strings[bridge_type], + tx_status_strings[tx_status]); + + /* Nothing else to report */ + if (!event->msg_buf) + return; + + DNPRINTF(ICE_DBG_DCB, "- %s contents:\n", mib_type_strings[mib_type]); + ice_debug_array(&sc->hw, ICE_DBG_DCB, 16, 1, event->msg_buf, + event->msg_len); +#endif +} + +/** + * ice_aq_get_lldp_mib + * @hw: pointer to the HW struct + * @bridge_type: type of bridge requested + * @mib_type: Local, Remote or both Local and Remote MIBs + * @buf: pointer to the caller-supplied buffer to store the MIB block + * @buf_size: size of the buffer (in bytes) + * @local_len: length of the returned Local LLDP MIB + * @remote_len: length of the returned Remote LLDP MIB + * @cd: pointer to command details structure or NULL + * + * Requests the complete LLDP MIB (entire packet). (0x0A00) + */ +enum ice_status +ice_aq_get_lldp_mib(struct ice_hw *hw, uint8_t bridge_type, uint8_t mib_type, + void *buf, uint16_t buf_size, uint16_t *local_len, uint16_t *remote_len, + struct ice_sq_cd *cd) +{ + struct ice_aqc_lldp_get_mib *cmd; + struct ice_aq_desc desc; + enum ice_status status; + + cmd = &desc.params.lldp_get_mib; + + if (buf_size == 0 || !buf) + return ICE_ERR_PARAM; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_lldp_get_mib); + + cmd->type = mib_type & ICE_AQ_LLDP_MIB_TYPE_M; + cmd->type |= (bridge_type << ICE_AQ_LLDP_BRID_TYPE_S) & + ICE_AQ_LLDP_BRID_TYPE_M; + + desc.datalen = htole16(buf_size); + + status = ice_aq_send_cmd(hw, &desc, buf, buf_size, cd); + if (!status) { + if (local_len) + *local_len = le16toh(cmd->local_len); + if (remote_len) + *remote_len = le16toh(cmd->remote_len); + } + + return status; +} + +/** + * ice_parse_ieee_ets_common_tlv + * @buf: Data buffer to be parsed for ETS CFG/REC data + * @ets_cfg: Container to store parsed data + * + * Parses the common data of IEEE 802.1Qaz ETS CFG/REC TLV + */ +void +ice_parse_ieee_ets_common_tlv(uint8_t *buf, struct ice_dcb_ets_cfg *ets_cfg) +{ + uint8_t offset = 0; + int i; + + /* Priority Assignment Table (4 octets) + * Octets:| 1 | 2 | 3 | 4 | + * ----------------------------------------- + * |pri0|pri1|pri2|pri3|pri4|pri5|pri6|pri7| + * ----------------------------------------- + * Bits:|7 4|3 0|7 4|3 0|7 4|3 0|7 4|3 0| + * ----------------------------------------- + */ + for (i = 0; i < 4; i++) { + ets_cfg->prio_table[i * 2] = + ((buf[offset] & ICE_IEEE_ETS_PRIO_1_M) >> + ICE_IEEE_ETS_PRIO_1_S); + ets_cfg->prio_table[i * 2 + 1] = + ((buf[offset] & ICE_IEEE_ETS_PRIO_0_M) >> + ICE_IEEE_ETS_PRIO_0_S); + offset++; + } + + /* TC Bandwidth Table (8 octets) + * Octets:| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | + * --------------------------------- + * |tc0|tc1|tc2|tc3|tc4|tc5|tc6|tc7| + * --------------------------------- + * + * TSA Assignment Table (8 octets) + * Octets:| 9 | 10| 11| 12| 13| 14| 15| 16| + * --------------------------------- + * |tc0|tc1|tc2|tc3|tc4|tc5|tc6|tc7| + * --------------------------------- + */ + ice_for_each_traffic_class(i) { + ets_cfg->tcbwtable[i] = buf[offset]; + ets_cfg->tsatable[i] = buf[ICE_MAX_TRAFFIC_CLASS + offset++]; + } +} + +/** + * ice_parse_ieee_etscfg_tlv + * @tlv: IEEE 802.1Qaz ETS CFG TLV + * @dcbcfg: Local store to update ETS CFG data + * + * Parses IEEE 802.1Qaz ETS CFG TLV + */ +void +ice_parse_ieee_etscfg_tlv(struct ice_lldp_org_tlv *tlv, + struct ice_dcbx_cfg *dcbcfg) +{ + struct ice_dcb_ets_cfg *etscfg; + uint8_t *buf = tlv->tlvinfo; + + /* First Octet post subtype + * -------------------------- + * |will-|CBS | Re- | Max | + * |ing | |served| TCs | + * -------------------------- + * |1bit | 1bit|3 bits|3bits| + */ + etscfg = &dcbcfg->etscfg; + etscfg->willing = ((buf[0] & ICE_IEEE_ETS_WILLING_M) >> + ICE_IEEE_ETS_WILLING_S); + etscfg->cbs = ((buf[0] & ICE_IEEE_ETS_CBS_M) >> ICE_IEEE_ETS_CBS_S); + etscfg->maxtcs = ((buf[0] & ICE_IEEE_ETS_MAXTC_M) >> + ICE_IEEE_ETS_MAXTC_S); + + /* Begin parsing at Priority Assignment Table (offset 1 in buf) */ + ice_parse_ieee_ets_common_tlv(&buf[1], etscfg); +} + +/** + * ice_parse_ieee_etsrec_tlv + * @tlv: IEEE 802.1Qaz ETS REC TLV + * @dcbcfg: Local store to update ETS REC data + * + * Parses IEEE 802.1Qaz ETS REC TLV + */ +void +ice_parse_ieee_etsrec_tlv(struct ice_lldp_org_tlv *tlv, + struct ice_dcbx_cfg *dcbcfg) +{ + uint8_t *buf = tlv->tlvinfo; + + /* Begin parsing at Priority Assignment Table (offset 1 in buf) */ + ice_parse_ieee_ets_common_tlv(&buf[1], &dcbcfg->etsrec); +} + +/** + * ice_parse_ieee_pfccfg_tlv + * @tlv: IEEE 802.1Qaz PFC CFG TLV + * @dcbcfg: Local store to update PFC CFG data + * + * Parses IEEE 802.1Qaz PFC CFG TLV + */ +void +ice_parse_ieee_pfccfg_tlv(struct ice_lldp_org_tlv *tlv, + struct ice_dcbx_cfg *dcbcfg) +{ + uint8_t *buf = tlv->tlvinfo; + + /* ---------------------------------------- + * |will-|MBC | Re- | PFC | PFC Enable | + * |ing | |served| cap | | + * ----------------------------------------- + * |1bit | 1bit|2 bits|4bits| 1 octet | + */ + dcbcfg->pfc.willing = ((buf[0] & ICE_IEEE_PFC_WILLING_M) >> + ICE_IEEE_PFC_WILLING_S); + dcbcfg->pfc.mbc = ((buf[0] & ICE_IEEE_PFC_MBC_M) >> ICE_IEEE_PFC_MBC_S); + dcbcfg->pfc.pfccap = ((buf[0] & ICE_IEEE_PFC_CAP_M) >> + ICE_IEEE_PFC_CAP_S); + dcbcfg->pfc.pfcena = buf[1]; +} + +/** + * ice_parse_ieee_app_tlv + * @tlv: IEEE 802.1Qaz APP TLV + * @dcbcfg: Local store to update APP PRIO data + * + * Parses IEEE 802.1Qaz APP PRIO TLV + */ +void +ice_parse_ieee_app_tlv(struct ice_lldp_org_tlv *tlv, + struct ice_dcbx_cfg *dcbcfg) +{ + uint16_t offset = 0; + uint16_t typelen; + int i = 0; + uint16_t len; + uint8_t *buf; + + typelen = ntohs(tlv->typelen); + len = ((typelen & ICE_LLDP_TLV_LEN_M) >> ICE_LLDP_TLV_LEN_S); + buf = tlv->tlvinfo; + + /* Removing sizeof(ouisubtype) and reserved byte from len. + * Remaining len div 3 is number of APP TLVs. + */ + len -= (sizeof(tlv->ouisubtype) + 1); + + /* Move offset to App Priority Table */ + offset++; + + /* Application Priority Table (3 octets) + * Octets:| 1 | 2 | 3 | + * ----------------------------------------- + * |Priority|Rsrvd| Sel | Protocol ID | + * ----------------------------------------- + * Bits:|23 21|20 19|18 16|15 0| + * ----------------------------------------- + */ + while (offset < len) { + dcbcfg->app[i].priority = ((buf[offset] & + ICE_IEEE_APP_PRIO_M) >> + ICE_IEEE_APP_PRIO_S); + dcbcfg->app[i].selector = ((buf[offset] & + ICE_IEEE_APP_SEL_M) >> + ICE_IEEE_APP_SEL_S); + dcbcfg->app[i].prot_id = (buf[offset + 1] << 0x8) | + buf[offset + 2]; + /* Move to next app */ + offset += 3; + i++; + if (i >= ICE_DCBX_MAX_APPS) + break; + } + + dcbcfg->numapps = i; +} + +/** + * ice_parse_ieee_tlv + * @tlv: IEEE 802.1Qaz TLV + * @dcbcfg: Local store to update ETS REC data + * + * Get the TLV subtype and send it to parsing function + * based on the subtype value + */ +void +ice_parse_ieee_tlv(struct ice_lldp_org_tlv *tlv, struct ice_dcbx_cfg *dcbcfg) +{ + uint32_t ouisubtype; + uint8_t subtype; + + ouisubtype = ntohl(tlv->ouisubtype); + subtype = (uint8_t)((ouisubtype & ICE_LLDP_TLV_SUBTYPE_M) >> + ICE_LLDP_TLV_SUBTYPE_S); + switch (subtype) { + case ICE_IEEE_SUBTYPE_ETS_CFG: + ice_parse_ieee_etscfg_tlv(tlv, dcbcfg); + break; + case ICE_IEEE_SUBTYPE_ETS_REC: + ice_parse_ieee_etsrec_tlv(tlv, dcbcfg); + break; + case ICE_IEEE_SUBTYPE_PFC_CFG: + ice_parse_ieee_pfccfg_tlv(tlv, dcbcfg); + break; + case ICE_IEEE_SUBTYPE_APP_PRI: + ice_parse_ieee_app_tlv(tlv, dcbcfg); + break; + default: + break; + } +} + +/** + * ice_parse_cee_pgcfg_tlv + * @tlv: CEE DCBX PG CFG TLV + * @dcbcfg: Local store to update ETS CFG data + * + * Parses CEE DCBX PG CFG TLV + */ +void +ice_parse_cee_pgcfg_tlv(struct ice_cee_feat_tlv *tlv, + struct ice_dcbx_cfg *dcbcfg) +{ + struct ice_dcb_ets_cfg *etscfg; + uint8_t *buf = tlv->tlvinfo; + uint16_t offset = 0; + int i; + + etscfg = &dcbcfg->etscfg; + + if (tlv->en_will_err & ICE_CEE_FEAT_TLV_WILLING_M) + etscfg->willing = 1; + + etscfg->cbs = 0; + /* Priority Group Table (4 octets) + * Octets:| 1 | 2 | 3 | 4 | + * ----------------------------------------- + * |pri0|pri1|pri2|pri3|pri4|pri5|pri6|pri7| + * ----------------------------------------- + * Bits:|7 4|3 0|7 4|3 0|7 4|3 0|7 4|3 0| + * ----------------------------------------- + */ + for (i = 0; i < 4; i++) { + etscfg->prio_table[i * 2] = + ((buf[offset] & ICE_CEE_PGID_PRIO_1_M) >> + ICE_CEE_PGID_PRIO_1_S); + etscfg->prio_table[i * 2 + 1] = + ((buf[offset] & ICE_CEE_PGID_PRIO_0_M) >> + ICE_CEE_PGID_PRIO_0_S); + offset++; + } + + /* PG Percentage Table (8 octets) + * Octets:| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | + * --------------------------------- + * |pg0|pg1|pg2|pg3|pg4|pg5|pg6|pg7| + * --------------------------------- + */ + ice_for_each_traffic_class(i) { + etscfg->tcbwtable[i] = buf[offset++]; + + if (etscfg->prio_table[i] == ICE_CEE_PGID_STRICT) + dcbcfg->etscfg.tsatable[i] = ICE_IEEE_TSA_STRICT; + else + dcbcfg->etscfg.tsatable[i] = ICE_IEEE_TSA_ETS; + } + + /* Number of TCs supported (1 octet) */ + etscfg->maxtcs = buf[offset]; +} + +/** + * ice_parse_cee_pfccfg_tlv + * @tlv: CEE DCBX PFC CFG TLV + * @dcbcfg: Local store to update PFC CFG data + * + * Parses CEE DCBX PFC CFG TLV + */ +void +ice_parse_cee_pfccfg_tlv(struct ice_cee_feat_tlv *tlv, + struct ice_dcbx_cfg *dcbcfg) +{ + uint8_t *buf = tlv->tlvinfo; + + if (tlv->en_will_err & ICE_CEE_FEAT_TLV_WILLING_M) + dcbcfg->pfc.willing = 1; + + /* ------------------------ + * | PFC Enable | PFC TCs | + * ------------------------ + * | 1 octet | 1 octet | + */ + dcbcfg->pfc.pfcena = buf[0]; + dcbcfg->pfc.pfccap = buf[1]; +} + +/** + * ice_parse_cee_app_tlv + * @tlv: CEE DCBX APP TLV + * @dcbcfg: Local store to update APP PRIO data + * + * Parses CEE DCBX APP PRIO TLV + */ +void +ice_parse_cee_app_tlv(struct ice_cee_feat_tlv *tlv, struct ice_dcbx_cfg *dcbcfg) +{ + uint16_t len, typelen, offset = 0; + struct ice_cee_app_prio *app; + uint8_t i; + + typelen = NTOHS(tlv->hdr.typelen); + len = ((typelen & ICE_LLDP_TLV_LEN_M) >> ICE_LLDP_TLV_LEN_S); + + dcbcfg->numapps = len / sizeof(*app); + if (!dcbcfg->numapps) + return; + if (dcbcfg->numapps > ICE_DCBX_MAX_APPS) + dcbcfg->numapps = ICE_DCBX_MAX_APPS; + + for (i = 0; i < dcbcfg->numapps; i++) { + uint8_t up, selector; + + app = (struct ice_cee_app_prio *)(tlv->tlvinfo + offset); + for (up = 0; up < ICE_MAX_USER_PRIORITY; up++) + if (app->prio_map & BIT(up)) + break; + + dcbcfg->app[i].priority = up; + + /* Get Selector from lower 2 bits, and convert to IEEE */ + selector = (app->upper_oui_sel & ICE_CEE_APP_SELECTOR_M); + switch (selector) { + case ICE_CEE_APP_SEL_ETHTYPE: + dcbcfg->app[i].selector = ICE_APP_SEL_ETHTYPE; + break; + case ICE_CEE_APP_SEL_TCPIP: + dcbcfg->app[i].selector = ICE_APP_SEL_TCPIP; + break; + default: + /* Keep selector as it is for unknown types */ + dcbcfg->app[i].selector = selector; + } + + dcbcfg->app[i].prot_id = NTOHS(app->protocol); + /* Move to next app */ + offset += sizeof(*app); + } +} + +/** + * ice_parse_cee_tlv + * @tlv: CEE DCBX TLV + * @dcbcfg: Local store to update DCBX config data + * + * Get the TLV subtype and send it to parsing function + * based on the subtype value + */ +void +ice_parse_cee_tlv(struct ice_lldp_org_tlv *tlv, struct ice_dcbx_cfg *dcbcfg) +{ + struct ice_cee_feat_tlv *sub_tlv; + uint8_t subtype, feat_tlv_count = 0; + uint16_t len, tlvlen, typelen; + uint32_t ouisubtype; + + ouisubtype = ntohl(tlv->ouisubtype); + subtype = (uint8_t)((ouisubtype & ICE_LLDP_TLV_SUBTYPE_M) >> + ICE_LLDP_TLV_SUBTYPE_S); + /* Return if not CEE DCBX */ + if (subtype != ICE_CEE_DCBX_TYPE) + return; + + typelen = ntohs(tlv->typelen); + tlvlen = ((typelen & ICE_LLDP_TLV_LEN_M) >> ICE_LLDP_TLV_LEN_S); + len = sizeof(tlv->typelen) + sizeof(ouisubtype) + + sizeof(struct ice_cee_ctrl_tlv); + /* Return if no CEE DCBX Feature TLVs */ + if (tlvlen <= len) + return; + + sub_tlv = (struct ice_cee_feat_tlv *)((char *)tlv + len); + while (feat_tlv_count < ICE_CEE_MAX_FEAT_TYPE) { + uint16_t sublen; + + typelen = ntohs(sub_tlv->hdr.typelen); + sublen = ((typelen & ICE_LLDP_TLV_LEN_M) >> ICE_LLDP_TLV_LEN_S); + subtype = (uint8_t)((typelen & ICE_LLDP_TLV_TYPE_M) >> + ICE_LLDP_TLV_TYPE_S); + switch (subtype) { + case ICE_CEE_SUBTYPE_PG_CFG: + ice_parse_cee_pgcfg_tlv(sub_tlv, dcbcfg); + break; + case ICE_CEE_SUBTYPE_PFC_CFG: + ice_parse_cee_pfccfg_tlv(sub_tlv, dcbcfg); + break; + case ICE_CEE_SUBTYPE_APP_PRI: + ice_parse_cee_app_tlv(sub_tlv, dcbcfg); + break; + default: + return; /* Invalid Sub-type return */ + } + feat_tlv_count++; + /* Move to next sub TLV */ + sub_tlv = (struct ice_cee_feat_tlv *) + ((char *)sub_tlv + sizeof(sub_tlv->hdr.typelen) + + sublen); + } +} +/** + * ice_parse_org_tlv + * @tlv: Organization specific TLV + * @dcbcfg: Local store to update ETS REC data + * + * Currently only IEEE 802.1Qaz TLV is supported, all others + * will be returned + */ +void +ice_parse_org_tlv(struct ice_lldp_org_tlv *tlv, struct ice_dcbx_cfg *dcbcfg) +{ + uint32_t ouisubtype; + uint32_t oui; + + ouisubtype = ntohl(tlv->ouisubtype); + oui = ((ouisubtype & ICE_LLDP_TLV_OUI_M) >> ICE_LLDP_TLV_OUI_S); + switch (oui) { + case ICE_IEEE_8021QAZ_OUI: + ice_parse_ieee_tlv(tlv, dcbcfg); + break; + case ICE_CEE_DCBX_OUI: + ice_parse_cee_tlv(tlv, dcbcfg); + break; + default: + break; + } +} +/** + * ice_lldp_to_dcb_cfg + * @lldpmib: LLDPDU to be parsed + * @dcbcfg: store for LLDPDU data + * + * Parse DCB configuration from the LLDPDU + */ +enum ice_status +ice_lldp_to_dcb_cfg(uint8_t *lldpmib, struct ice_dcbx_cfg *dcbcfg) +{ + struct ice_lldp_org_tlv *tlv; + enum ice_status ret = ICE_SUCCESS; + uint16_t offset = 0; + uint16_t typelen; + uint16_t type; + uint16_t len; + + if (!lldpmib || !dcbcfg) + return ICE_ERR_PARAM; + + /* set to the start of LLDPDU */ + lldpmib += ETHER_HDR_LEN; + tlv = (struct ice_lldp_org_tlv *)lldpmib; + while (1) { + typelen = ntohs(tlv->typelen); + type = ((typelen & ICE_LLDP_TLV_TYPE_M) >> ICE_LLDP_TLV_TYPE_S); + len = ((typelen & ICE_LLDP_TLV_LEN_M) >> ICE_LLDP_TLV_LEN_S); + offset += sizeof(typelen) + len; + + /* END TLV or beyond LLDPDU size */ + if (type == ICE_TLV_TYPE_END || offset > ICE_LLDPDU_SIZE) + break; + + switch (type) { + case ICE_TLV_TYPE_ORG: + ice_parse_org_tlv(tlv, dcbcfg); + break; + default: + break; + } + + /* Move to next TLV */ + tlv = (struct ice_lldp_org_tlv *) + ((char *)tlv + sizeof(tlv->typelen) + len); + } + + return ret; +} +/** + * ice_aq_get_dcb_cfg + * @hw: pointer to the HW struct + * @mib_type: MIB type for the query + * @bridgetype: bridge type for the query (remote) + * @dcbcfg: store for LLDPDU data + * + * Query DCB configuration from the firmware + */ +enum ice_status +ice_aq_get_dcb_cfg(struct ice_hw *hw, uint8_t mib_type, uint8_t bridgetype, + struct ice_dcbx_cfg *dcbcfg) +{ + enum ice_status ret; + uint8_t *lldpmib; + + /* Allocate the LLDPDU */ + lldpmib = (uint8_t *)ice_malloc(hw, ICE_LLDPDU_SIZE); + if (!lldpmib) + return ICE_ERR_NO_MEMORY; + + ret = ice_aq_get_lldp_mib(hw, bridgetype, mib_type, (void *)lldpmib, + ICE_LLDPDU_SIZE, NULL, NULL, NULL); + + if (ret == ICE_SUCCESS) + /* Parse LLDP MIB to get DCB configuration */ + ret = ice_lldp_to_dcb_cfg(lldpmib, dcbcfg); + + ice_free(hw, lldpmib); + + return ret; +} + +/** + * ice_cee_to_dcb_cfg + * @cee_cfg: pointer to CEE configuration struct + * @pi: port information structure + * + * Convert CEE configuration from firmware to DCB configuration + */ +void +ice_cee_to_dcb_cfg(struct ice_aqc_get_cee_dcb_cfg_resp *cee_cfg, + struct ice_port_info *pi) +{ + uint32_t status, tlv_status = le32toh(cee_cfg->tlv_status); + uint32_t ice_aqc_cee_status_mask, ice_aqc_cee_status_shift; + uint8_t i, j, err, sync, oper, app_index, ice_app_sel_type; + uint16_t app_prio = le16toh(cee_cfg->oper_app_prio); + uint16_t ice_aqc_cee_app_mask, ice_aqc_cee_app_shift; + struct ice_dcbx_cfg *cmp_dcbcfg, *dcbcfg; + uint16_t ice_app_prot_id_type; + + dcbcfg = &pi->qos_cfg.local_dcbx_cfg; + dcbcfg->dcbx_mode = ICE_DCBX_MODE_CEE; + dcbcfg->tlv_status = tlv_status; + + /* CEE PG data */ + dcbcfg->etscfg.maxtcs = cee_cfg->oper_num_tc; + + /* Note that the FW creates the oper_prio_tc nibbles reversed + * from those in the CEE Priority Group sub-TLV. + */ + for (i = 0; i < ICE_MAX_TRAFFIC_CLASS / 2; i++) { + dcbcfg->etscfg.prio_table[i * 2] = + ((cee_cfg->oper_prio_tc[i] & ICE_CEE_PGID_PRIO_0_M) >> + ICE_CEE_PGID_PRIO_0_S); + dcbcfg->etscfg.prio_table[i * 2 + 1] = + ((cee_cfg->oper_prio_tc[i] & ICE_CEE_PGID_PRIO_1_M) >> + ICE_CEE_PGID_PRIO_1_S); + } + + ice_for_each_traffic_class(i) { + dcbcfg->etscfg.tcbwtable[i] = cee_cfg->oper_tc_bw[i]; + + if (dcbcfg->etscfg.prio_table[i] == ICE_CEE_PGID_STRICT) { + /* Map it to next empty TC */ + dcbcfg->etscfg.prio_table[i] = cee_cfg->oper_num_tc - 1; + dcbcfg->etscfg.tsatable[i] = ICE_IEEE_TSA_STRICT; + } else { + dcbcfg->etscfg.tsatable[i] = ICE_IEEE_TSA_ETS; + } + } + + /* CEE PFC data */ + dcbcfg->pfc.pfcena = cee_cfg->oper_pfc_en; + dcbcfg->pfc.pfccap = ICE_MAX_TRAFFIC_CLASS; + + /* CEE APP TLV data */ + if (dcbcfg->app_mode == ICE_DCBX_APPS_NON_WILLING) + cmp_dcbcfg = &pi->qos_cfg.desired_dcbx_cfg; + else + cmp_dcbcfg = &pi->qos_cfg.remote_dcbx_cfg; + + app_index = 0; + for (i = 0; i < 3; i++) { + if (i == 0) { + /* FCoE APP */ + ice_aqc_cee_status_mask = ICE_AQC_CEE_FCOE_STATUS_M; + ice_aqc_cee_status_shift = ICE_AQC_CEE_FCOE_STATUS_S; + ice_aqc_cee_app_mask = ICE_AQC_CEE_APP_FCOE_M; + ice_aqc_cee_app_shift = ICE_AQC_CEE_APP_FCOE_S; + ice_app_sel_type = ICE_APP_SEL_ETHTYPE; + ice_app_prot_id_type = ICE_APP_PROT_ID_FCOE; + } else if (i == 1) { + /* iSCSI APP */ + ice_aqc_cee_status_mask = ICE_AQC_CEE_ISCSI_STATUS_M; + ice_aqc_cee_status_shift = ICE_AQC_CEE_ISCSI_STATUS_S; + ice_aqc_cee_app_mask = ICE_AQC_CEE_APP_ISCSI_M; + ice_aqc_cee_app_shift = ICE_AQC_CEE_APP_ISCSI_S; + ice_app_sel_type = ICE_APP_SEL_TCPIP; + ice_app_prot_id_type = ICE_APP_PROT_ID_ISCSI; + + for (j = 0; j < cmp_dcbcfg->numapps; j++) { + uint16_t prot_id = cmp_dcbcfg->app[j].prot_id; + uint8_t sel = cmp_dcbcfg->app[j].selector; + + if (sel == ICE_APP_SEL_TCPIP && + (prot_id == ICE_APP_PROT_ID_ISCSI || + prot_id == ICE_APP_PROT_ID_ISCSI_860)) { + ice_app_prot_id_type = prot_id; + break; + } + } + } else { + /* FIP APP */ + ice_aqc_cee_status_mask = ICE_AQC_CEE_FIP_STATUS_M; + ice_aqc_cee_status_shift = ICE_AQC_CEE_FIP_STATUS_S; + ice_aqc_cee_app_mask = ICE_AQC_CEE_APP_FIP_M; + ice_aqc_cee_app_shift = ICE_AQC_CEE_APP_FIP_S; + ice_app_sel_type = ICE_APP_SEL_ETHTYPE; + ice_app_prot_id_type = ICE_APP_PROT_ID_FIP; + } + + status = (tlv_status & ice_aqc_cee_status_mask) >> + ice_aqc_cee_status_shift; + err = (status & ICE_TLV_STATUS_ERR) ? 1 : 0; + sync = (status & ICE_TLV_STATUS_SYNC) ? 1 : 0; + oper = (status & ICE_TLV_STATUS_OPER) ? 1 : 0; + /* Add FCoE/iSCSI/FIP APP if Error is False and + * Oper/Sync is True + */ + if (!err && sync && oper) { + dcbcfg->app[app_index].priority = + (uint8_t)((app_prio & ice_aqc_cee_app_mask) >> + ice_aqc_cee_app_shift); + dcbcfg->app[app_index].selector = ice_app_sel_type; + dcbcfg->app[app_index].prot_id = ice_app_prot_id_type; + app_index++; + } + } + + dcbcfg->numapps = app_index; +} + +/** + * ice_get_dcb_cfg_from_mib_change + * @pi: port information structure + * @event: pointer to the admin queue receive event + * + * Set DCB configuration from received MIB Change event + */ +void +ice_get_dcb_cfg_from_mib_change(struct ice_port_info *pi, + struct ice_rq_event_info *event) +{ + struct ice_dcbx_cfg *dcbx_cfg = &pi->qos_cfg.local_dcbx_cfg; + struct ice_aqc_lldp_get_mib *mib; + uint8_t change_type, dcbx_mode; + + mib = (struct ice_aqc_lldp_get_mib *)&event->desc.params.raw; + + change_type = mib->type & ICE_AQ_LLDP_MIB_TYPE_M; + if (change_type == ICE_AQ_LLDP_MIB_REMOTE) + dcbx_cfg = &pi->qos_cfg.remote_dcbx_cfg; + + dcbx_mode = ((mib->type & ICE_AQ_LLDP_DCBX_M) >> + ICE_AQ_LLDP_DCBX_S); + + switch (dcbx_mode) { + case ICE_AQ_LLDP_DCBX_IEEE: + dcbx_cfg->dcbx_mode = ICE_DCBX_MODE_IEEE; + ice_lldp_to_dcb_cfg(event->msg_buf, dcbx_cfg); + break; + + case ICE_AQ_LLDP_DCBX_CEE: + pi->qos_cfg.desired_dcbx_cfg = pi->qos_cfg.local_dcbx_cfg; + ice_cee_to_dcb_cfg((struct ice_aqc_get_cee_dcb_cfg_resp *) + event->msg_buf, pi); + break; + } +} + +/** + * ice_aq_get_cee_dcb_cfg + * @hw: pointer to the HW struct + * @buff: response buffer that stores CEE operational configuration + * @cd: pointer to command details structure or NULL + * + * Get CEE DCBX mode operational configuration from firmware (0x0A07) + */ +enum ice_status +ice_aq_get_cee_dcb_cfg(struct ice_hw *hw, + struct ice_aqc_get_cee_dcb_cfg_resp *buff, + struct ice_sq_cd *cd) +{ + struct ice_aq_desc desc; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_get_cee_dcb_cfg); + + return ice_aq_send_cmd(hw, &desc, (void *)buff, sizeof(*buff), cd); +} + +/** + * ice_get_ieee_or_cee_dcb_cfg + * @pi: port information structure + * @dcbx_mode: mode of DCBX (IEEE or CEE) + * + * Get IEEE or CEE mode DCB configuration from the Firmware + */ +enum ice_status +ice_get_ieee_or_cee_dcb_cfg(struct ice_port_info *pi, uint8_t dcbx_mode) +{ + struct ice_dcbx_cfg *dcbx_cfg = NULL; + enum ice_status ret; + + if (!pi) + return ICE_ERR_PARAM; + + if (dcbx_mode == ICE_DCBX_MODE_IEEE) + dcbx_cfg = &pi->qos_cfg.local_dcbx_cfg; + else if (dcbx_mode == ICE_DCBX_MODE_CEE) + dcbx_cfg = &pi->qos_cfg.desired_dcbx_cfg; + + /* Get Local DCB Config in case of ICE_DCBX_MODE_IEEE + * or get CEE DCB Desired Config in case of ICE_DCBX_MODE_CEE + */ + ret = ice_aq_get_dcb_cfg(pi->hw, ICE_AQ_LLDP_MIB_LOCAL, + ICE_AQ_LLDP_BRID_TYPE_NEAREST_BRID, dcbx_cfg); + if (ret) + goto out; + + /* Get Remote DCB Config */ + dcbx_cfg = &pi->qos_cfg.remote_dcbx_cfg; + ret = ice_aq_get_dcb_cfg(pi->hw, ICE_AQ_LLDP_MIB_REMOTE, + ICE_AQ_LLDP_BRID_TYPE_NEAREST_BRID, dcbx_cfg); + /* Don't treat ENOENT as an error for Remote MIBs */ + if (pi->hw->adminq.sq_last_status == ICE_AQ_RC_ENOENT) + ret = ICE_SUCCESS; + +out: + return ret; +} + +/** + * ice_get_dcb_cfg + * @pi: port information structure + * + * Get DCB configuration from the Firmware + */ +enum ice_status +ice_get_dcb_cfg(struct ice_port_info *pi) +{ + struct ice_aqc_get_cee_dcb_cfg_resp cee_cfg; + struct ice_dcbx_cfg *dcbx_cfg; + enum ice_status ret; + + if (!pi) + return ICE_ERR_PARAM; + + ret = ice_aq_get_cee_dcb_cfg(pi->hw, &cee_cfg, NULL); + if (ret == ICE_SUCCESS) { + /* CEE mode */ + ret = ice_get_ieee_or_cee_dcb_cfg(pi, ICE_DCBX_MODE_CEE); + ice_cee_to_dcb_cfg(&cee_cfg, pi); + } else if (pi->hw->adminq.sq_last_status == ICE_AQ_RC_ENOENT) { + /* CEE mode not enabled try querying IEEE data */ + dcbx_cfg = &pi->qos_cfg.local_dcbx_cfg; + dcbx_cfg->dcbx_mode = ICE_DCBX_MODE_IEEE; + ret = ice_get_ieee_or_cee_dcb_cfg(pi, ICE_DCBX_MODE_IEEE); + } + + return ret; +} + +/** + * ice_dcb_needs_reconfig - Returns true if driver needs to reconfigure + * @sc: the device private softc + * @old_cfg: Old DCBX configuration to compare against + * @new_cfg: New DCBX configuration to check + * + * @return true if something changed in new_cfg that requires the driver + * to do some reconfiguration. + */ +bool +ice_dcb_needs_reconfig(struct ice_softc *sc, struct ice_dcbx_cfg *old_cfg, + struct ice_dcbx_cfg *new_cfg) +{ + bool needs_reconfig = false; + + /* No change detected in DCBX config */ + if (!memcmp(old_cfg, new_cfg, sizeof(*old_cfg))) { + DNPRINTF(ICE_DBG_DCB, + "%s: No change detected in local DCBX configuration\n", + sc->sc_dev.dv_xname); + return (false); + } + + /* Check if ETS config has changed */ + if (memcmp(&new_cfg->etscfg, &old_cfg->etscfg, + sizeof(new_cfg->etscfg))) { + /* If Priority Table has changed, driver reconfig is needed */ + if (memcmp(&new_cfg->etscfg.prio_table, + &old_cfg->etscfg.prio_table, + sizeof(new_cfg->etscfg.prio_table))) { + DNPRINTF(ICE_DBG_DCB, "%s: ETS UP2TC changed\n", + __func__); + needs_reconfig = true; + } + + /* These are just informational */ + if (memcmp(&new_cfg->etscfg.tcbwtable, + &old_cfg->etscfg.tcbwtable, + sizeof(new_cfg->etscfg.tcbwtable))) { + DNPRINTF(ICE_DBG_DCB, "%s: ETS TCBW table changed\n", + __func__); + needs_reconfig = true; + } + + if (memcmp(&new_cfg->etscfg.tsatable, + &old_cfg->etscfg.tsatable, + sizeof(new_cfg->etscfg.tsatable))) { + DNPRINTF(ICE_DBG_DCB, "%s: ETS TSA table changed\n", + __func__); + needs_reconfig = true; + } + } + + /* Check if PFC config has changed */ + if (memcmp(&new_cfg->pfc, &old_cfg->pfc, sizeof(new_cfg->pfc))) { + DNPRINTF(ICE_DBG_DCB, "%s: PFC config changed\n", __func__); + needs_reconfig = true; + } + + /* Check if APP table has changed */ + if (memcmp(&new_cfg->app, &old_cfg->app, sizeof(new_cfg->app))) + DNPRINTF(ICE_DBG_DCB, "%s: APP Table changed\n", __func__); + + DNPRINTF(ICE_DBG_DCB, "%s result: %d\n", __func__, needs_reconfig); + + return (needs_reconfig); +} + +/** + * ice_do_dcb_reconfig - notify RDMA and reconfigure PF LAN VSI + * @sc: the device private softc + * @pending_mib: FW has a pending MIB change to execute + * + * @pre Determined that the DCB configuration requires a change + * + * Reconfigures the PF LAN VSI based on updated DCB configuration + * found in the hw struct's/port_info's/ local dcbx configuration. + */ +void +ice_do_dcb_reconfig(struct ice_softc *sc, bool pending_mib) +{ +#if 0 + struct ice_aqc_port_ets_elem port_ets = { 0 }; + struct ice_dcbx_cfg *local_dcbx_cfg; + struct ice_hw *hw = &sc->hw; + struct ice_port_info *pi; + device_t dev = sc->dev; + enum ice_status status; + + pi = sc->hw.port_info; + local_dcbx_cfg = &pi->qos_cfg.local_dcbx_cfg; + + ice_rdma_notify_dcb_qos_change(sc); + /* If there's a pending MIB, tell the FW to execute the MIB change + * now. + */ + if (pending_mib) { + status = ice_lldp_execute_pending_mib(hw); + if ((status == ICE_ERR_AQ_ERROR) && + (hw->adminq.sq_last_status == ICE_AQ_RC_ENOENT)) { + device_printf(dev, + "Execute Pending LLDP MIB AQ call failed, no pending MIB\n"); + } else if (status) { + device_printf(dev, + "Execute Pending LLDP MIB AQ call failed, err %s aq_err %s\n", + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + /* This won't break traffic, but QoS will not work as expected */ + } + } + + /* Set state when there's more than one TC */ + if (ice_dcb_get_num_tc(local_dcbx_cfg) > 1) { + device_printf(dev, "Multiple traffic classes enabled\n"); + ice_set_state(&sc->state, ICE_STATE_MULTIPLE_TCS); + } else { + device_printf(dev, "Multiple traffic classes disabled\n"); + ice_clear_state(&sc->state, ICE_STATE_MULTIPLE_TCS); + } + + /* Disable PF VSI since it's going to be reconfigured */ + ice_stop_pf_vsi(sc); + + /* Query ETS configuration and update SW Tx scheduler info */ + status = ice_query_port_ets(pi, &port_ets, sizeof(port_ets), NULL); + if (status != ICE_SUCCESS) { + device_printf(dev, + "Query Port ETS AQ call failed, err %s aq_err %s\n", + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + /* This won't break traffic, but QoS will not work as expected */ + } + + /* Change PF VSI configuration */ + ice_dcb_recfg(sc); + + /* Send new configuration to RDMA client driver */ + ice_rdma_dcb_qos_update(sc, pi); + + ice_request_stack_reinit(sc); +#else + printf("%s: not implemented", __func__); +#endif +} + +/** + * ice_handle_mib_change_event - handle LLDP MIB change events + * @sc: the device private softc + * @event: event received on a control queue + * + * Checks the updated MIB it receives and possibly reconfigures the PF LAN + * VSI depending on what has changed. This will also print out some debug + * information about the MIB event if ICE_DBG_DCB is enabled in the debug_mask. + */ +void +ice_handle_mib_change_event(struct ice_softc *sc, + struct ice_rq_event_info *event) +{ + struct ice_aqc_lldp_get_mib *params = + (struct ice_aqc_lldp_get_mib *)&event->desc.params.lldp_get_mib; + struct ice_dcbx_cfg tmp_dcbx_cfg, *local_dcbx_cfg; + struct ice_port_info *pi; + struct ice_hw *hw = &sc->hw; + bool needs_reconfig, mib_is_pending; + enum ice_status status; + uint8_t mib_type, bridge_type; +#if 0 + ASSERT_CFG_LOCKED(sc); +#endif + ice_debug_print_mib_change_event(sc, event); + + pi = sc->hw.port_info; + + mib_type = (params->type & ICE_AQ_LLDP_MIB_TYPE_M) >> + ICE_AQ_LLDP_MIB_TYPE_S; + bridge_type = (params->type & ICE_AQ_LLDP_BRID_TYPE_M) >> + ICE_AQ_LLDP_BRID_TYPE_S; + mib_is_pending = (params->state & ICE_AQ_LLDP_MIB_CHANGE_STATE_M) >> + ICE_AQ_LLDP_MIB_CHANGE_STATE_S; + + /* Ignore if event is not for Nearest Bridge */ + if (bridge_type != ICE_AQ_LLDP_BRID_TYPE_NEAREST_BRID) + return; + + /* Check MIB Type and return if event for Remote MIB update */ + if (mib_type == ICE_AQ_LLDP_MIB_REMOTE) { + /* Update the cached remote MIB and return */ + status = ice_aq_get_dcb_cfg(pi->hw, ICE_AQ_LLDP_MIB_REMOTE, + ICE_AQ_LLDP_BRID_TYPE_NEAREST_BRID, + &pi->qos_cfg.remote_dcbx_cfg); + if (status) + printf("%s: Failed to get Remote DCB config; " + "status %s, aq_err %s\n", + sc->sc_dev.dv_xname, ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + /* Not fatal if this fails */ + return; + } + + /* Save line length by aliasing the local dcbx cfg */ + local_dcbx_cfg = &pi->qos_cfg.local_dcbx_cfg; + /* Save off the old configuration and clear current config */ + tmp_dcbx_cfg = *local_dcbx_cfg; + memset(local_dcbx_cfg, 0, sizeof(*local_dcbx_cfg)); + + /* Update the current local_dcbx_cfg with new data */ + if (mib_is_pending) { + ice_get_dcb_cfg_from_mib_change(pi, event); + } else { + /* Get updated DCBX data from firmware */ + status = ice_get_dcb_cfg(pi); + if (status) { + printf("%s: Failed to get Local DCB config; " + "status %s, aq_err %s\n", + sc->sc_dev.dv_xname, ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + return; + } + } + + /* Check to see if DCB needs reconfiguring */ + needs_reconfig = ice_dcb_needs_reconfig(sc, &tmp_dcbx_cfg, + local_dcbx_cfg); + + if (!needs_reconfig && !mib_is_pending) + return; + + /* Reconfigure -- this will also notify FW that configuration is done, + * if the FW MIB change is only pending instead of executed. + */ + ice_do_dcb_reconfig(sc, mib_is_pending); +} + +/** + * ice_handle_lan_overflow_event - helper function to log LAN overflow events + * @sc: device softc + * @event: event received on a control queue + * + * Prints out a message when a LAN overflow event is detected on a receive + * queue. + */ +void +ice_handle_lan_overflow_event(struct ice_softc *sc, + struct ice_rq_event_info *event) +{ +#ifdef ICE_DEBUG + struct ice_aqc_event_lan_overflow *params = + (struct ice_aqc_event_lan_overflow *)&event->desc.params.lan_overflow; + + DNPRINTF(ICE_DBG_DCB, "%s: LAN overflow event detected, " + "prtdcb_ruptq=0x%08x, qtx_ctl=0x%08x\n", + sc->sc_dev.dv_xname, le32toh(params->prtdcb_ruptq), + le32toh(params->qtx_ctl)); +#endif +} + +/** + * ice_print_health_status_string - Print message for given FW health event + * @dev: the PCIe device + * @elem: health status element containing status code + * + * A rather large list of possible health status codes and their associated + * messages. + */ +void +ice_print_health_status_string(struct ice_softc *sc, + struct ice_aqc_health_status_elem *elem) +{ + uint16_t status_code = le16toh(elem->health_status_code); + + switch (status_code) { + case ICE_AQC_HEALTH_STATUS_INFO_RECOVERY: + printf("%s: The device is in firmware recovery mode.\n", + sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_FLASH_ACCESS: + printf("%s: The flash chip cannot be accessed.\n", + sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_NVM_AUTH: + printf("%s: NVM authentication failed.\n", + sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_OROM_AUTH: + printf("%s: Option ROM authentication failed.\n", + sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_DDP_AUTH: + printf("%s: DDP package failed.\n", sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_NVM_COMPAT: + printf("%s: NVM image is incompatible.\n", sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_OROM_COMPAT: + printf("%s: Option ROM is incompatible.\n", sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_DCB_MIB: + printf("%s: Supplied MIB file is invalid. " + "DCB reverted to default configuration.\n", + sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_UNKNOWN_MOD_STRICT: + printf("%s: An unsupported module was detected.\n", + sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_MOD_TYPE: + printf("%s: Module type is not supported.\n", + sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_MOD_QUAL: + printf("%s: Module is not qualified.\n", sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_MOD_COMM: + printf("%s: Device cannot communicate with the module.\n", + sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_MOD_CONFLICT: + printf("%s: Unresolved module conflict.\n", + sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_MOD_NOT_PRESENT: + printf("%s: Module is not present.\n", sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_INFO_MOD_UNDERUTILIZED: + printf("%s: Underutilized module.\n", sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_UNKNOWN_MOD_LENIENT: + printf("%s: An unsupported module was detected.\n", + sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_INVALID_LINK_CFG: + printf("%s: Invalid link configuration.\n", + sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_PORT_ACCESS: + printf("%s: Port hardware access error.\n", + sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_PORT_UNREACHABLE: + printf("%s: A port is unreachable.\n", sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_INFO_PORT_SPEED_MOD_LIMITED: + printf("%s: Port speed is limited due to module.\n", + sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_PARALLEL_FAULT: + printf("%s: A parallel fault was detected.\n", + sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_INFO_PORT_SPEED_PHY_LIMITED: + printf("%s: Port speed is limited by PHY capabilities.\n", + sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_NETLIST_TOPO: + printf("%s: LOM topology netlist is corrupted.\n", + sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_NETLIST: + printf("%s: Unrecoverable netlist error.\n", + sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_TOPO_CONFLICT: + printf("%s: Port topology conflict.\n", sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_LINK_HW_ACCESS: + printf("%s: Unrecoverable hardware access error.\n", + sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_LINK_RUNTIME: + printf("%s: Unrecoverable runtime error.\n", + sc->sc_dev.dv_xname); + break; + case ICE_AQC_HEALTH_STATUS_ERR_DNL_INIT: + printf("%s: Link management engine failed to initialize.\n", + sc->sc_dev.dv_xname); + break; + default: + break; + } +} + +/** + * ice_handle_health_status_event - helper function to output health status + * @sc: device softc structure + * @event: event received on a control queue + * + * Prints out the appropriate string based on the given Health Status Event + * code. + */ +void +ice_handle_health_status_event(struct ice_softc *sc, + struct ice_rq_event_info *event) +{ + struct ice_aqc_health_status_elem *health_info; + uint16_t status_count; + int i; + + if (!ice_is_bit_set(sc->feat_en, ICE_FEATURE_HEALTH_STATUS)) + return; + + health_info = (struct ice_aqc_health_status_elem *)event->msg_buf; + status_count = le16toh( + event->desc.params.get_health_status.health_status_count); + + if (status_count > (event->buf_len / sizeof(*health_info))) { + DPRINTF("%s: Received a health status event with invalid " + "event count\n", sc->sc_dev.dv_xname); + return; + } + + for (i = 0; i < status_count; i++) { + ice_print_health_status_string(sc, health_info); + health_info++; + } +} +/** + * ice_process_ctrlq_event - Respond to a controlq event + * @sc: device private structure + * @qname: the name for this controlq + * @event: the event to process + * + * Perform actions in response to various controlq event notifications. + */ +void +ice_process_ctrlq_event(struct ice_softc *sc, const char *qname, + struct ice_rq_event_info *event) +{ + uint16_t opcode; + + opcode = le16toh(event->desc.opcode); + + switch (opcode) { + case ice_aqc_opc_get_link_status: + ice_process_link_event(sc, event); + break; + case ice_aqc_opc_fw_logs_event: + ice_handle_fw_log_event(sc, &event->desc, event->msg_buf); + break; + case ice_aqc_opc_lldp_set_mib_change: + ice_handle_mib_change_event(sc, event); + break; + case ice_aqc_opc_event_lan_overflow: + ice_handle_lan_overflow_event(sc, event); + break; + case ice_aqc_opc_get_health_status: + ice_handle_health_status_event(sc, event); + break; + default: + printf("%s: %s Receive Queue unhandled event 0x%04x ignored\n", + sc->sc_dev.dv_xname, qname, opcode); + break; + } +} + +/** + * ice_clean_rq_elem + * @hw: pointer to the HW struct + * @cq: pointer to the specific Control queue + * @e: event info from the receive descriptor, includes any buffers + * @pending: number of events that could be left to process + * + * Clean one element from the receive side of a control queue. On return 'e' + * contains contents of the message, and 'pending' contains the number of + * events left to process. + */ +enum ice_status +ice_clean_rq_elem(struct ice_hw *hw, struct ice_ctl_q_info *cq, + struct ice_rq_event_info *e, uint16_t *pending) +{ + uint16_t ntc = cq->rq.next_to_clean; + enum ice_aq_err rq_last_status; + enum ice_status ret_code = ICE_SUCCESS; + struct ice_aq_desc *desc; + struct ice_dma_mem *bi; + uint16_t desc_idx; + uint16_t datalen; + uint16_t flags; + uint16_t ntu; + + /* pre-clean the event info */ + memset(&e->desc, 0, sizeof(e->desc)); +#if 0 + /* take the lock before we start messing with the ring */ + ice_acquire_lock(&cq->rq_lock); +#endif + if (!cq->rq.count) { + DNPRINTF(ICE_DBG_AQ_MSG, + "%s: Control Receive queue not initialized.\n", __func__); + ret_code = ICE_ERR_AQ_EMPTY; + goto clean_rq_elem_err; + } + + /* set next_to_use to head */ + ntu = (uint16_t)(ICE_READ(hw, cq->rq.head) & cq->rq.head_mask); + + if (ntu == ntc) { + /* nothing to do - shouldn't need to update ring's values */ + ret_code = ICE_ERR_AQ_NO_WORK; + goto clean_rq_elem_out; + } + + /* now clean the next descriptor */ + desc = ICE_CTL_Q_DESC(cq->rq, ntc); + desc_idx = ntc; + + rq_last_status = (enum ice_aq_err)le16toh(desc->retval); + flags = le16toh(desc->flags); + if (flags & ICE_AQ_FLAG_ERR) { + ret_code = ICE_ERR_AQ_ERROR; + DNPRINTF(ICE_DBG_AQ_MSG, "%s: Control Receive Queue " + "Event 0x%04X received with error 0x%X\n", + __func__, le16toh(desc->opcode), rq_last_status); + } + memcpy(&e->desc, desc, sizeof(e->desc)); + datalen = le16toh(desc->datalen); + e->msg_len = MIN(datalen, e->buf_len); + if (e->msg_buf && e->msg_len) + memcpy(e->msg_buf, cq->rq.r.rq_bi[desc_idx].va, e->msg_len); + + DNPRINTF(ICE_DBG_AQ_DESC, "%s: ARQ: desc and buffer:\n", __func__); + ice_debug_cq(hw, cq, (void *)desc, e->msg_buf, cq->rq_buf_size, true); + + /* Restore the original datalen and buffer address in the desc, + * FW updates datalen to indicate the event message size + */ + bi = &cq->rq.r.rq_bi[ntc]; + memset(desc, 0, sizeof(*desc)); + + desc->flags = htole16(ICE_AQ_FLAG_BUF); + if (cq->rq_buf_size > ICE_AQ_LG_BUF) + desc->flags |= htole16(ICE_AQ_FLAG_LB); + desc->datalen = htole16(bi->size); + desc->params.generic.addr_high = htole32(ICE_HI_DWORD(bi->pa)); + desc->params.generic.addr_low = htole32(ICE_LO_DWORD(bi->pa)); + + /* set tail = the last cleaned desc index. */ + ICE_WRITE(hw, cq->rq.tail, ntc); + /* ntc is updated to tail + 1 */ + ntc++; + if (ntc == cq->num_rq_entries) + ntc = 0; + cq->rq.next_to_clean = ntc; + cq->rq.next_to_use = ntu; + +clean_rq_elem_out: + /* Set pending if needed, unlock and return */ + if (pending) { + /* re-read HW head to calculate actual pending messages */ + ntu = (uint16_t)(ICE_READ(hw, cq->rq.head) & cq->rq.head_mask); + *pending = (uint16_t)((ntc > ntu ? cq->rq.count : 0) + + (ntu - ntc)); + } +clean_rq_elem_err: +#if 0 + ice_release_lock(&cq->rq_lock); +#endif + return ret_code; +} + +/** + * ice_process_ctrlq - helper function to process controlq rings + * @sc: device private structure + * @q_type: specific control queue type + * @pending: return parameter to track remaining events + * + * Process controlq events for a given control queue type. Returns zero on + * success, and an error code on failure. If successful, pending is the number + * of remaining events left in the queue. + */ +int +ice_process_ctrlq(struct ice_softc *sc, enum ice_ctl_q q_type, + uint16_t *pending) +{ + struct ice_rq_event_info event = { { 0 } }; + struct ice_hw *hw = &sc->hw; + struct ice_ctl_q_info *cq; + enum ice_status status; + const char *qname; + int loop = 0; + + switch (q_type) { + case ICE_CTL_Q_ADMIN: + cq = &hw->adminq; + qname = "Admin"; + break; + case ICE_CTL_Q_MAILBOX: + cq = &hw->mailboxq; + qname = "Mailbox"; + break; + default: + DPRINTF("%s: Unknown control queue type 0x%x\n", + __func__, q_type); + return 0; + } + + ice_check_ctrlq_errors(sc, qname, cq); + + /* + * Control queue processing happens during the admin task which may be + * holding a non-sleepable lock, so we *must* use M_NOWAIT here. + */ + event.buf_len = cq->rq_buf_size; + event.msg_buf = (uint8_t *)malloc(event.buf_len, M_DEVBUF, + M_ZERO | M_NOWAIT); + if (!event.msg_buf) { + printf("%s: Unable to allocate memory for %s Receive Queue " + "event\n", sc->sc_dev.dv_xname, qname); + return (ENOMEM); + } + + do { + status = ice_clean_rq_elem(hw, cq, &event, pending); + if (status == ICE_ERR_AQ_NO_WORK) + break; + if (status) { + if (q_type == ICE_CTL_Q_ADMIN) { + printf("%s: %s Receive Queue event error %s\n", + sc->sc_dev.dv_xname, qname, + ice_status_str(status)); + } else { + printf("%s: %s Receive Queue event error %s\n", + sc->sc_dev.dv_xname, qname, + ice_status_str(status)); + } + free(event.msg_buf, M_DEVBUF, event.buf_len); + return (EIO); + } + /* XXX should we separate this handler by controlq type? */ + ice_process_ctrlq_event(sc, qname, &event); + } while (*pending && (++loop < ICE_CTRLQ_WORK_LIMIT)); + + free(event.msg_buf, M_DEVBUF, event.buf_len); + + return 0; +} + +/** + * ice_poll_for_media_avail - Re-enable link if media is detected + * @sc: device private structure + * + * Intended to be called from the driver's timer function, this function + * sends the Get Link Status AQ command and re-enables HW link if the + * command says that media is available. + * + * If the driver doesn't have the "NO_MEDIA" state set, then this does nothing, + * since media removal events are supposed to be sent to the driver through + * a link status event. + */ +void +ice_poll_for_media_avail(struct ice_softc *sc) +{ + struct ice_hw *hw = &sc->hw; + struct ifnet *ifp = &sc->sc_ac.ac_if; + struct ice_port_info *pi = hw->port_info; + + if (ice_test_state(&sc->state, ICE_STATE_NO_MEDIA)) { + pi->phy.get_link_info = true; + ice_get_link_status(pi, &sc->link_up); + + if (pi->phy.link_info.link_info & ICE_AQ_MEDIA_AVAILABLE) { + enum ice_status status; + + /* Re-enable link and re-apply user link settings */ + if (ice_test_state(&sc->state, + ICE_STATE_LINK_ACTIVE_ON_DOWN) || + (ifp->if_flags & IFF_UP)) { + ice_apply_saved_phy_cfg(sc, + ICE_APPLY_LS_FEC_FC); + + /* Update OS with changes in media capability */ + status = ice_add_media_types(sc, &sc->media); + if (status) { + printf("%s: Error adding device " + "media types: %s aq_err %s\n", + sc->sc_dev.dv_xname, + ice_status_str(status), + ice_aq_str( + hw->adminq.sq_last_status)); + } + } + + ice_clear_state(&sc->state, ICE_STATE_NO_MEDIA); + } + } +} + +/** + * ice_stat_update40 - read 40 bit stat from the chip and update stat values + * @hw: ptr to the hardware info + * @reg: offset of 64 bit HW register to read from + * @prev_stat_loaded: bool to specify if previous stats are loaded + * @prev_stat: ptr to previous loaded stat value + * @cur_stat: ptr to current stat value + */ +void +ice_stat_update40(struct ice_hw *hw, uint32_t reg, bool prev_stat_loaded, + uint64_t *prev_stat, uint64_t *cur_stat) +{ + uint64_t new_data = ICE_READ_8(hw, reg) & (BIT_ULL(40) - 1); + + /* + * Device stats are not reset at PFR, they likely will not be zeroed + * when the driver starts. Thus, save the value from the first read + * without adding to the statistic value so that we report stats which + * count up from zero. + */ + if (!prev_stat_loaded) { + *prev_stat = new_data; + return; + } + + /* + * Calculate the difference between the new and old values, and then + * add it to the software stat value. + */ + if (new_data >= *prev_stat) + *cur_stat += new_data - *prev_stat; + else + /* to manage the potential roll-over */ + *cur_stat += (new_data + BIT_ULL(40)) - *prev_stat; + + /* Update the previously stored value to prepare for next read */ + *prev_stat = new_data; +} + +/** + * ice_stat_update32 - read 32 bit stat from the chip and update stat values + * @hw: ptr to the hardware info + * @reg: offset of HW register to read from + * @prev_stat_loaded: bool to specify if previous stats are loaded + * @prev_stat: ptr to previous loaded stat value + * @cur_stat: ptr to current stat value + */ +void +ice_stat_update32(struct ice_hw *hw, uint32_t reg, bool prev_stat_loaded, + uint64_t *prev_stat, uint64_t *cur_stat) +{ + uint32_t new_data; + + new_data = ICE_READ(hw, reg); + + /* + * Device stats are not reset at PFR, they likely will not be zeroed + * when the driver starts. Thus, save the value from the first read + * without adding to the statistic value so that we report stats which + * count up from zero. + */ + if (!prev_stat_loaded) { + *prev_stat = new_data; + return; + } + + /* + * Calculate the difference between the new and old values, and then + * add it to the software stat value. + */ + if (new_data >= *prev_stat) + *cur_stat += new_data - *prev_stat; + else + /* to manage the potential roll-over */ + *cur_stat += (new_data + BIT_ULL(32)) - *prev_stat; + + /* Update the previously stored value to prepare for next read */ + *prev_stat = new_data; +} + +/** + * ice_stat_update_repc - read GLV_REPC stats from chip and update stat values + * @hw: ptr to the hardware info + * @vsi_handle: VSI handle + * @prev_stat_loaded: bool to specify if the previous stat values are loaded + * @cur_stats: ptr to current stats structure + * + * The GLV_REPC statistic register actually tracks two 16bit statistics, and + * thus cannot be read using the normal ice_stat_update32 function. + * + * Read the GLV_REPC register associated with the given VSI, and update the + * rx_no_desc and rx_error values in the ice_eth_stats structure. + * + * Because the statistics in GLV_REPC stick at 0xFFFF, the register must be + * cleared each time it's read. + * + * Note that the GLV_RDPC register also counts the causes that would trigger + * GLV_REPC. However, it does not give the finer grained detail about why the + * packets are being dropped. The GLV_REPC values can be used to distinguish + * whether Rx packets are dropped due to errors or due to no available + * descriptors. + */ +void +ice_stat_update_repc(struct ice_hw *hw, uint16_t vsi_handle, + bool prev_stat_loaded, struct ice_eth_stats *cur_stats) +{ + uint16_t vsi_num, no_desc, error_cnt; + uint32_t repc; + + if (!ice_is_vsi_valid(hw, vsi_handle)) + return; + + vsi_num = hw->vsi_ctx[vsi_handle]->vsi_num; + + /* If we haven't loaded stats yet, just clear the current value */ + if (!prev_stat_loaded) { + ICE_WRITE(hw, GLV_REPC(vsi_num), 0); + return; + } + + repc = ICE_READ(hw, GLV_REPC(vsi_num)); + no_desc = (repc & GLV_REPC_NO_DESC_CNT_M) >> GLV_REPC_NO_DESC_CNT_S; + error_cnt = (repc & GLV_REPC_ERROR_CNT_M) >> GLV_REPC_ERROR_CNT_S; + + /* Clear the count by writing to the stats register */ + ICE_WRITE(hw, GLV_REPC(vsi_num), 0); + + cur_stats->rx_no_desc += no_desc; + cur_stats->rx_errors += error_cnt; +} + +/** + * ice_update_pf_stats - Update port stats counters + * @sc: device private softc structure + * + * Reads hardware statistics registers and updates the software tracking + * structure with new values. + */ +void +ice_update_pf_stats(struct ice_softc *sc) +{ + struct ice_hw_port_stats *prev_ps, *cur_ps; + struct ice_hw *hw = &sc->hw; + uint8_t lport; + + KASSERT(hw->port_info); + + prev_ps = &sc->stats.prev; + cur_ps = &sc->stats.cur; + lport = hw->port_info->lport; + +#define ICE_PF_STAT_PFC(name, location, index) \ + ice_stat_update40(hw, name(lport, index), \ + sc->stats.offsets_loaded, \ + &prev_ps->location[index], &cur_ps->location[index]) + +#define ICE_PF_STAT40(name, location) \ + ice_stat_update40(hw, name ## L(lport), \ + sc->stats.offsets_loaded, \ + &prev_ps->location, &cur_ps->location) + +#define ICE_PF_STAT32(name, location) \ + ice_stat_update32(hw, name(lport), \ + sc->stats.offsets_loaded, \ + &prev_ps->location, &cur_ps->location) + + ICE_PF_STAT40(GLPRT_GORC, eth.rx_bytes); + ICE_PF_STAT40(GLPRT_UPRC, eth.rx_unicast); + ICE_PF_STAT40(GLPRT_MPRC, eth.rx_multicast); + ICE_PF_STAT40(GLPRT_BPRC, eth.rx_broadcast); + ICE_PF_STAT40(GLPRT_GOTC, eth.tx_bytes); + ICE_PF_STAT40(GLPRT_UPTC, eth.tx_unicast); + ICE_PF_STAT40(GLPRT_MPTC, eth.tx_multicast); + ICE_PF_STAT40(GLPRT_BPTC, eth.tx_broadcast); + /* This stat register doesn't have an lport */ + ice_stat_update32(hw, PRTRPB_RDPC, + sc->stats.offsets_loaded, + &prev_ps->eth.rx_discards, &cur_ps->eth.rx_discards); + + ICE_PF_STAT32(GLPRT_TDOLD, tx_dropped_link_down); + ICE_PF_STAT40(GLPRT_PRC64, rx_size_64); + ICE_PF_STAT40(GLPRT_PRC127, rx_size_127); + ICE_PF_STAT40(GLPRT_PRC255, rx_size_255); + ICE_PF_STAT40(GLPRT_PRC511, rx_size_511); + ICE_PF_STAT40(GLPRT_PRC1023, rx_size_1023); + ICE_PF_STAT40(GLPRT_PRC1522, rx_size_1522); + ICE_PF_STAT40(GLPRT_PRC9522, rx_size_big); + ICE_PF_STAT40(GLPRT_PTC64, tx_size_64); + ICE_PF_STAT40(GLPRT_PTC127, tx_size_127); + ICE_PF_STAT40(GLPRT_PTC255, tx_size_255); + ICE_PF_STAT40(GLPRT_PTC511, tx_size_511); + ICE_PF_STAT40(GLPRT_PTC1023, tx_size_1023); + ICE_PF_STAT40(GLPRT_PTC1522, tx_size_1522); + ICE_PF_STAT40(GLPRT_PTC9522, tx_size_big); + + /* Update Priority Flow Control Stats */ + for (int i = 0; i <= GLPRT_PXOFFRXC_MAX_INDEX; i++) { + ICE_PF_STAT_PFC(GLPRT_PXONRXC, priority_xon_rx, i); + ICE_PF_STAT_PFC(GLPRT_PXOFFRXC, priority_xoff_rx, i); + ICE_PF_STAT_PFC(GLPRT_PXONTXC, priority_xon_tx, i); + ICE_PF_STAT_PFC(GLPRT_PXOFFTXC, priority_xoff_tx, i); + ICE_PF_STAT_PFC(GLPRT_RXON2OFFCNT, priority_xon_2_xoff, i); + } + + ICE_PF_STAT32(GLPRT_LXONRXC, link_xon_rx); + ICE_PF_STAT32(GLPRT_LXOFFRXC, link_xoff_rx); + ICE_PF_STAT32(GLPRT_LXONTXC, link_xon_tx); + ICE_PF_STAT32(GLPRT_LXOFFTXC, link_xoff_tx); + ICE_PF_STAT32(GLPRT_CRCERRS, crc_errors); + ICE_PF_STAT32(GLPRT_ILLERRC, illegal_bytes); + ICE_PF_STAT32(GLPRT_MLFC, mac_local_faults); + ICE_PF_STAT32(GLPRT_MRFC, mac_remote_faults); + ICE_PF_STAT32(GLPRT_RLEC, rx_len_errors); + ICE_PF_STAT32(GLPRT_RUC, rx_undersize); + ICE_PF_STAT32(GLPRT_RFC, rx_fragments); + ICE_PF_STAT32(GLPRT_ROC, rx_oversize); + ICE_PF_STAT32(GLPRT_RJC, rx_jabber); + +#undef ICE_PF_STAT40 +#undef ICE_PF_STAT32 +#undef ICE_PF_STAT_PFC + + sc->stats.offsets_loaded = true; +} + +/** + * ice_update_vsi_hw_stats - Update VSI-specific ethernet statistics counters + * @vsi: the VSI to be updated + * + * Reads hardware stats and updates the ice_vsi_hw_stats tracking structure with + * the updated values. + */ +void +ice_update_vsi_hw_stats(struct ice_vsi *vsi) +{ + struct ice_eth_stats *prev_es, *cur_es; + struct ice_hw *hw = &vsi->sc->hw; + uint16_t vsi_num; + + if (!ice_is_vsi_valid(hw, vsi->idx)) + return; + + /* HW absolute index of a VSI */ + vsi_num = hw->vsi_ctx[vsi->idx]->vsi_num; + prev_es = &vsi->hw_stats.prev; + cur_es = &vsi->hw_stats.cur; + +#define ICE_VSI_STAT40(name, location) \ + ice_stat_update40(hw, name ## L(vsi_num), \ + vsi->hw_stats.offsets_loaded, \ + &prev_es->location, &cur_es->location) + +#define ICE_VSI_STAT32(name, location) \ + ice_stat_update32(hw, name(vsi_num), \ + vsi->hw_stats.offsets_loaded, \ + &prev_es->location, &cur_es->location) + + ICE_VSI_STAT40(GLV_GORC, rx_bytes); + ICE_VSI_STAT40(GLV_UPRC, rx_unicast); + ICE_VSI_STAT40(GLV_MPRC, rx_multicast); + ICE_VSI_STAT40(GLV_BPRC, rx_broadcast); + ICE_VSI_STAT32(GLV_RDPC, rx_discards); + ICE_VSI_STAT40(GLV_GOTC, tx_bytes); + ICE_VSI_STAT40(GLV_UPTC, tx_unicast); + ICE_VSI_STAT40(GLV_MPTC, tx_multicast); + ICE_VSI_STAT40(GLV_BPTC, tx_broadcast); + ICE_VSI_STAT32(GLV_TEPC, tx_errors); + + ice_stat_update_repc(hw, vsi->idx, vsi->hw_stats.offsets_loaded, + cur_es); + +#undef ICE_VSI_STAT40 +#undef ICE_VSI_STAT32 + + vsi->hw_stats.offsets_loaded = true; +} + +void +ice_update_stats(struct ice_softc *sc) +{ + /* Do not attempt to update stats when in recovery mode */ + if (ice_test_state(&sc->state, ICE_STATE_RECOVERY_MODE)) + return; + + /* Update device statistics */ + ice_update_pf_stats(sc); + + /* Update the primary VSI stats */ + ice_update_vsi_hw_stats(&sc->pf_vsi); +#if 0 + /* Update mirror VSI stats */ + if (sc->mirr_if && sc->mirr_if->if_attached) + ice_update_vsi_hw_stats(sc->mirr_if->vsi); +#endif +} + +/** + * ice_if_update_admin_status - update admin status + * @ctx: iflib ctx structure + * + * Called by iflib to update the admin status. For our purposes, this means + * check the adminq, and update the link status. It's ultimately triggered by + * our admin interrupt, or by the ice_if_timer periodically. + * + * @pre assumes the caller holds the iflib CTX lock + */ +void +ice_if_update_admin_status(void *arg) +{ + struct ice_softc *sc = (struct ice_softc *)arg; + enum ice_fw_modes fw_mode; + bool reschedule = false; + uint16_t pending = 0; + int s; +#if 0 + ASSERT_CTX_LOCKED(sc); +#endif + s = splnet(); + + if (ice_driver_is_detaching(sc)) { + splx(s); + return; + } + + /* Check if the firmware entered recovery mode at run time */ + fw_mode = ice_get_fw_mode(&sc->hw); + if (fw_mode == ICE_FW_MODE_REC) { + if (!ice_testandset_state(&sc->state, + ICE_STATE_RECOVERY_MODE)) { + /* If we just entered recovery mode, log a warning to + * the system administrator and deinit driver state + * that is no longer functional. + */ + ice_transition_recovery_mode(sc); + } + } else if (fw_mode == ICE_FW_MODE_ROLLBACK) { + if (!ice_testandset_state(&sc->state, + ICE_STATE_ROLLBACK_MODE)) { + /* Rollback mode isn't fatal, but we don't want to + * repeatedly post a message about it. + */ + ice_print_rollback_msg(&sc->hw); + } + } + + /* Handle global reset events */ + ice_handle_reset_event(sc); + + /* Handle PF reset requests */ + ice_handle_pf_reset_request(sc); + + /* Handle MDD events */ + ice_handle_mdd_event(sc); + + if (ice_test_state(&sc->state, ICE_STATE_RESET_FAILED) || + ice_test_state(&sc->state, ICE_STATE_PREPARED_FOR_RESET) || + ice_test_state(&sc->state, ICE_STATE_RECOVERY_MODE)) { + /* + * If we know the control queues are disabled, skip processing + * the control queues entirely. + */ + ; + } else if (ice_testandclear_state(&sc->state, + ICE_STATE_CONTROLQ_EVENT_PENDING)) { + ice_process_ctrlq(sc, ICE_CTL_Q_ADMIN, &pending); + if (pending > 0) + reschedule = true; + + ice_process_ctrlq(sc, ICE_CTL_Q_MAILBOX, &pending); + if (pending > 0) + reschedule = true; + } + + /* Poll for link up */ + ice_poll_for_media_avail(sc); + + /* Check and update link status */ + ice_update_link_status(sc, false); + + /* Update statistics. */ + ice_update_stats(sc); + + /* + * If there are still messages to process, we need to reschedule + * ourselves. Otherwise, we can just re-enable the interrupt. We'll be + * woken up at the next interrupt or timer event. + */ + if (reschedule) { + ice_set_state(&sc->state, ICE_STATE_CONTROLQ_EVENT_PENDING); + task_add(systq, &sc->sc_admin_task); + } else { + ice_enable_intr(&sc->hw, 0); + } + + splx(s); +} + + +/** + * ice_admin_timer - called periodically to trigger the admin task + * @arg: timeout(9) argument pointing to the device private softc structure + * + * Timer function used as part of a timeout(9) timer that will periodically + * trigger the admin task, even when the interface is down. + * + * @remark because this is a timeout function, it cannot sleep and should not + * attempt taking the iflib CTX lock. + */ +void +ice_admin_timer(void *arg) +{ + struct ice_softc *sc = (struct ice_softc *)arg; + struct ifnet *ifp = &sc->sc_ac.ac_if; + int s; + + s = splnet(); + + if (ice_driver_is_detaching(sc) || + (ifp->if_flags & IFF_RUNNING) == 0) { + splx(s); + return; + } + + /* Fire off the admin task */ + task_add(systq, &sc->sc_admin_task); + + /* Reschedule the admin timer */ + timeout_add_nsec(&sc->sc_admin_timer, SEC_TO_NSEC(1)); + + splx(s); +} + +/** + * @enum hmc_error_type + * @brief enumeration of HMC errors + * + * Enumeration defining the possible HMC errors that might occur. + */ +enum hmc_error_type { + HMC_ERR_PMF_INVALID = 0, + HMC_ERR_VF_IDX_INVALID = 1, + HMC_ERR_VF_PARENT_PF_INVALID = 2, + /* 3 is reserved */ + HMC_ERR_INDEX_TOO_BIG = 4, + HMC_ERR_ADDRESS_TOO_LARGE = 5, + HMC_ERR_SEGMENT_DESC_INVALID = 6, + HMC_ERR_SEGMENT_DESC_TOO_SMALL = 7, + HMC_ERR_PAGE_DESC_INVALID = 8, + HMC_ERR_UNSUPPORTED_REQUEST_COMPLETION = 9, + /* 10 is reserved */ + HMC_ERR_INVALID_OBJECT_TYPE = 11, + /* 12 is reserved */ +}; + +/** + * ice_log_hmc_error - Log an HMC error message + * @hw: device hw structure + * @dev: the device to pass to device_printf() + * + * Log a message when an HMC error interrupt is triggered. + */ +void +ice_log_hmc_error(struct ice_hw *hw) +{ + struct ice_softc *sc = hw->hw_sc; + uint32_t info, data; + uint8_t index, errtype, objtype; + bool isvf; + + info = ICE_READ(hw, PFHMC_ERRORINFO); + data = ICE_READ(hw, PFHMC_ERRORDATA); + + index = (uint8_t)(info & PFHMC_ERRORINFO_PMF_INDEX_M); + errtype = (uint8_t)((info & PFHMC_ERRORINFO_HMC_ERROR_TYPE_M) >> + PFHMC_ERRORINFO_HMC_ERROR_TYPE_S); + objtype = (uint8_t)((info & PFHMC_ERRORINFO_HMC_OBJECT_TYPE_M) >> + PFHMC_ERRORINFO_HMC_OBJECT_TYPE_S); + + isvf = info & PFHMC_ERRORINFO_PMF_ISVF_M; + + printf("%s: %s HMC Error detected on PMF index %d: " + "error type %d, object type %d, data 0x%08x\n", + sc->sc_dev.dv_xname, isvf ? "VF" : "PF", index, + errtype, objtype, data); + + switch (errtype) { + case HMC_ERR_PMF_INVALID: + DPRINTF("Private Memory Function is not valid\n"); + break; + case HMC_ERR_VF_IDX_INVALID: + DPRINTF("Invalid Private Memory Function index for PE enabled VF\n"); + break; + case HMC_ERR_VF_PARENT_PF_INVALID: + DPRINTF("Invalid parent PF for PE enabled VF\n"); + break; + case HMC_ERR_INDEX_TOO_BIG: + DPRINTF("Object index too big\n"); + break; + case HMC_ERR_ADDRESS_TOO_LARGE: + DPRINTF("Address extends beyond segment descriptor limit\n"); + break; + case HMC_ERR_SEGMENT_DESC_INVALID: + DPRINTF("Segment descriptor is invalid\n"); + break; + case HMC_ERR_SEGMENT_DESC_TOO_SMALL: + DPRINTF("Segment descriptor is too small\n"); + break; + case HMC_ERR_PAGE_DESC_INVALID: + DPRINTF("Page descriptor is invalid\n"); + break; + case HMC_ERR_UNSUPPORTED_REQUEST_COMPLETION: + DPRINTF("Unsupported Request completion received from PCIe\n"); + break; + case HMC_ERR_INVALID_OBJECT_TYPE: + DPRINTF("Invalid object type\n"); + break; + default: + DPRINTF("Unknown HMC error\n"); + } + + /* Clear the error indication */ + ICE_WRITE(hw, PFHMC_ERRORINFO, 0); +} + +/** + * Interrupt handler for MSI-X admin interrupt + */ +int +ice_intr0(void *xsc) +{ + struct ice_softc *sc = (struct ice_softc *)xsc; + struct ice_hw *hw = &sc->hw; + struct ifnet *ifp = &sc->sc_ac.ac_if; + uint32_t oicr; + + /* There is no safe way to modify the enabled miscellaneous causes of + * the OICR vector at runtime, as doing so would be prone to race + * conditions. Reading PFINT_OICR will unmask the associated interrupt + * causes and allow future interrupts to occur. The admin interrupt + * vector will not be re-enabled until after we exit this function, + * but any delayed tasks must be resilient against possible "late + * arrival" interrupts that occur while we're already handling the + * task. This is done by using state bits and serializing these + * delayed tasks via the admin status task function. + */ + oicr = ICE_READ(hw, PFINT_OICR); + + /* Processing multiple controlq interrupts on a single vector does not + * provide an indication of which controlq triggered the interrupt. + * We might try reading the INTEVENT bit of the respective PFINT_*_CTL + * registers. However, the INTEVENT bit is not guaranteed to be set as + * it gets automatically cleared when the hardware acknowledges the + * interrupt. + * + * This means we don't really have a good indication of whether or + * which controlq triggered this interrupt. We'll just notify the + * admin task that it should check all the controlqs. + */ + ice_set_state(&sc->state, ICE_STATE_CONTROLQ_EVENT_PENDING); + + if (oicr & PFINT_OICR_VFLR_M) { + ice_set_state(&sc->state, ICE_STATE_VFLR_PENDING); + } + + if (oicr & PFINT_OICR_MAL_DETECT_M) { + ice_set_state(&sc->state, ICE_STATE_MDD_PENDING); + } + + if (oicr & PFINT_OICR_GRST_M) { + uint32_t reset; + + reset = (ICE_READ(hw, GLGEN_RSTAT) & + GLGEN_RSTAT_RESET_TYPE_M) >> GLGEN_RSTAT_RESET_TYPE_S; +#if 0 + if (reset == ICE_RESET_CORER) + sc->soft_stats.corer_count++; + else if (reset == ICE_RESET_GLOBR) + sc->soft_stats.globr_count++; + else + sc->soft_stats.empr_count++; +#endif + /* There are a couple of bits at play for handling resets. + * First, the ICE_STATE_RESET_OICR_RECV bit is used to + * indicate that the driver has received an OICR with a reset + * bit active, indicating that a CORER/GLOBR/EMPR is about to + * happen. Second, we set hw->reset_ongoing to indicate that + * the hardware is in reset. We will set this back to false as + * soon as the driver has determined that the hardware is out + * of reset. + * + * If the driver wishes to trigger a request, it can set one of + * the ICE_STATE_RESET_*_REQ bits, which will trigger the + * correct type of reset. + */ + if (!ice_testandset_state(&sc->state, + ICE_STATE_RESET_OICR_RECV)) { + hw->reset_ongoing = true; + /* + * During the NVM update process, there is a driver + * reset and link goes down and then up. The below + * if-statement prevents a second link flap from + * occurring in ice_up(). + */ + if (ifp->if_flags & IFF_UP) { + ice_set_state(&sc->state, + ICE_STATE_FIRST_INIT_LINK); + } + } + } + + if (oicr & PFINT_OICR_ECC_ERR_M) { + DPRINTF("%s: ECC Error detected!\n", sc->sc_dev.dv_xname); + ice_set_state(&sc->state, ICE_STATE_RESET_PFR_REQ); + } + + if (oicr & (PFINT_OICR_PE_CRITERR_M | PFINT_OICR_HMC_ERR_M)) { + if (oicr & PFINT_OICR_HMC_ERR_M) + /* Log the HMC errors */ + ice_log_hmc_error(hw); +#if 0 + ice_rdma_notify_pe_intr(sc, oicr); +#endif + } + + if (oicr & PFINT_OICR_PCI_EXCEPTION_M) { + DPRINTF("%s: PCI Exception detected!\n", sc->sc_dev.dv_xname); + ice_set_state(&sc->state, ICE_STATE_RESET_PFR_REQ); + } + + task_add(systq, &sc->sc_admin_task); + return 1; +} + +/* + * Macro to help extract the NIC mode flexible Rx descriptor fields from the + * advanced 32byte Rx descriptors. + */ +#define ICE_RX_FLEX_NIC(desc, field) \ + (((struct ice_32b_rx_flex_desc_nic *)desc)->field) + +void +ice_rx_checksum(struct mbuf *m, uint16_t status0) +{ + /* TODO */ +} + +int +ice_rxeof(struct ice_softc *sc, struct ice_rx_queue *rxq) +{ + struct ifiqueue *ifiq = rxq->rxq_ifiq; + struct ifnet *ifp = &sc->sc_ac.ac_if; + union ice_32b_rx_flex_desc *ring, *cur; + struct ice_rx_map *rxm; + bus_dmamap_t map; + unsigned int cons, prod; + struct mbuf_list ml = MBUF_LIST_INITIALIZER(); + struct mbuf *m; + uint16_t status0; + unsigned int eop; + unsigned int len; + unsigned int mask; + int done = 0; + + prod = rxq->rxq_prod; + cons = rxq->rxq_cons; + + if (cons == prod) + return (0); + + rxm = &rxq->rx_map[cons]; + map = rxm->rxm_map; + bus_dmamap_sync(sc->sc_dmat, map, 0, map->dm_mapsize, + BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); + + ring = ICE_DMA_KVA(&rxq->rx_desc_mem); + mask = rxq->desc_count - 1; + + do { + cur = &ring[cons]; + + status0 = le16toh(cur->wb.status_error0); + if ((status0 & BIT(ICE_RX_FLEX_DESC_STATUS0_DD_S)) == 0) + break; + + if_rxr_put(&rxq->rxq_acct, 1); + + rxm = &rxq->rx_map[cons]; + + map = rxm->rxm_map; + bus_dmamap_sync(sc->sc_dmat, map, 0, map->dm_mapsize, + BUS_DMASYNC_POSTREAD); + bus_dmamap_unload(sc->sc_dmat, map); + + m = rxm->rxm_m; + rxm->rxm_m = NULL; + + len = le16toh(cur->wb.pkt_len) & ICE_RX_FLX_DESC_PKT_LEN_M; + m->m_len = len; + m->m_pkthdr.len = 0; + + m->m_next = NULL; + *rxq->rxq_m_tail = m; + rxq->rxq_m_tail = &m->m_next; + + m = rxq->rxq_m_head; + m->m_pkthdr.len += len; + + eop = !!(status0 & BIT(ICE_RX_FLEX_DESC_STATUS0_EOF_S)); + if (eop && (status0 & BIT(ICE_RX_FLEX_DESC_STATUS0_RXE_S))) { + /* + * Make sure packets with bad L2 values are discarded. + * This bit is only valid in the last descriptor. + */ + ifp->if_ierrors++; + m_freem(m); + m = NULL; + rxq->rxq_m_head = NULL; + rxq->rxq_m_tail = &rxq->rxq_m_head; + } else if (eop) { +#if NVLAN > 0 + if (status0 & BIT(ICE_RX_FLEX_DESC_STATUS0_L2TAG1P_S)) { + m->m_pkthdr.ether_vtag = + le16toh(cur->wb.l2tag1); + SET(m->m_flags, M_VLANTAG); + } +#endif + if (status0 & + BIT(ICE_RX_FLEX_DESC_STATUS0_RSS_VALID_S)) { + m->m_pkthdr.ph_flowid = le32toh( + ICE_RX_FLEX_NIC(&cur->wb, rss_hash)); + m->m_pkthdr.csum_flags |= M_FLOWID; + } + + ice_rx_checksum(m, status0); + ml_enqueue(&ml, m); + + rxq->rxq_m_head = NULL; + rxq->rxq_m_tail = &rxq->rxq_m_head; + } + + cons++; + cons &= mask; + + done = 1; + } while (cons != prod); + + if (done) { + rxq->rxq_cons = cons; + if (ifiq_input(ifiq, &ml)) + if_rxr_livelocked(&rxq->rxq_acct); + ice_rxfill(sc, rxq); + } + + bus_dmamap_sync(sc->sc_dmat, map, 0, map->dm_mapsize, + BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); + + return (done); +} + +int +ice_txeof(struct ice_softc *sc, struct ice_tx_queue *txq) +{ + struct ifqueue *ifq = txq->txq_ifq; + struct ice_tx_desc *ring, *txd; + struct ice_tx_map *txm; + bus_dmamap_t map; + unsigned int cons, prod, last; + unsigned int mask; + uint64_t dtype; + int done = 0; + + prod = txq->txq_prod; + cons = txq->txq_cons; + + if (cons == prod) + return (0); + + bus_dmamap_sync(sc->sc_dmat, ICE_DMA_MAP(&txq->tx_desc_mem), + 0, ICE_DMA_LEN(&txq->tx_desc_mem), BUS_DMASYNC_POSTREAD); + + ring = ICE_DMA_KVA(&txq->tx_desc_mem); + mask = txq->desc_count - 1; + + do { + txm = &txq->tx_map[cons]; + last = txm->txm_eop; + txd = &ring[last]; + + dtype = htole64((txd->cmd_type_offset_bsz & + ICE_TXD_QW1_DTYPE_M) >> ICE_TXD_QW1_DTYPE_S); + if (dtype != htole64(ICE_TX_DESC_DTYPE_DESC_DONE)) + break; + + map = txm->txm_map; + + bus_dmamap_sync(sc->sc_dmat, map, 0, map->dm_mapsize, + BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(sc->sc_dmat, map); + m_freem(txm->txm_m); + + txm->txm_m = NULL; + txm->txm_eop = -1; + + cons = last + 1; + cons &= mask; + + done = 1; + } while (cons != prod); + + bus_dmamap_sync(sc->sc_dmat, ICE_DMA_MAP(&txq->tx_desc_mem), + 0, ICE_DMA_LEN(&txq->tx_desc_mem), BUS_DMASYNC_PREREAD); + + txq->txq_cons = cons; + + //ixl_enable(sc, txr->txr_msix); + + if (ifq_is_oactive(ifq)) + ifq_restart(ifq); + + return (done); +} + +int +ice_intr_vector(void *ivp) +{ + struct ice_intr_vector *iv = ivp; + struct ice_softc *sc = iv->iv_sc; + struct ifnet *ifp = &sc->sc_ac.ac_if; + int rv = 0, v = iv->iv_qid + 1; + + if (ISSET(ifp->if_flags, IFF_RUNNING)) { + rv |= ice_rxeof(sc, iv->iv_rxq); + rv |= ice_txeof(sc, iv->iv_txq); + } + + /* Wake threads waiting for software interrupt confirmation. */ + if (sc->sw_intr[v] == -1) { + sc->sw_intr[v] = 1; + wakeup(&sc->sw_intr[v]); + } + + ice_enable_intr(&sc->hw, v); + return rv; +} + +/** + * ice_allocate_msix - Allocate MSI-X vectors for the interface + * @sc: the device private softc + * + * @post on success this function must set the following scctx parameters: + * isc_vectors, isc_nrxqsets, isc_ntxqsets, and isc_intr. + * + * @returns zero on success or an error code on failure. + */ +int +ice_allocate_msix(struct ice_softc *sc) +{ + int err, i; + + sc->sc_ihc = pci_intr_establish(sc->sc_pct, sc->sc_ih, + IPL_NET | IPL_MPSAFE, ice_intr0, sc, sc->sc_dev.dv_xname); + if (sc->sc_ihc == NULL) { + printf("%s: unable to establish interrupt handler\n", + sc->sc_dev.dv_xname); + return ENOTRECOVERABLE; + } + + if (sc->sc_intrmap) { + for (i = 0; i < sc->sc_nqueues; i++) { + struct ice_intr_vector *iv = &sc->sc_vectors[i]; + int v = i + 1; /* 0 is used for adminq */ + + iv->iv_sc = sc; + iv->iv_qid = i; + iv->iv_ihc = pci_intr_establish_cpu(sc->sc_pct, iv->ih, + IPL_NET | IPL_MPSAFE, + intrmap_cpu(sc->sc_intrmap, i), + ice_intr_vector, iv, iv->iv_name); + if (iv->iv_ihc == NULL) { + printf("%s: unable to establish interrupt %d\n", + sc->sc_dev.dv_xname, v); + err = ENOTRECOVERABLE; + goto disestablish; + } + } + } + + sc->isc_vectors = sc->sc_nvectors; + sc->isc_nrxqsets = sc->sc_nqueues; + sc->isc_ntxqsets = sc->sc_nqueues; + + return 0; + +disestablish: + if (sc->sc_intrmap != NULL) { + for (i = 0; i < sc->sc_nqueues; i++) { + struct ice_intr_vector *iv = &sc->sc_vectors[i]; + if (iv->iv_ihc == NULL) + continue; + pci_intr_disestablish(sc->sc_pct, iv->iv_ihc); + } + } + pci_intr_disestablish(sc->sc_pct, sc->sc_ihc); + sc->sc_ihc = NULL; + return err; +} + +void +ice_free_tx_queues(struct ice_softc *sc) +{ + struct ice_vsi *vsi = &sc->pf_vsi; + struct ice_tx_queue *txq; + struct ice_tx_map *map; + int i, j; + + for (i = 0, txq = vsi->tx_queues; i < sc->sc_nqueues; i++, txq++) { + ice_free_dma_mem(&sc->hw, &txq->tx_desc_mem); + for (j = 0; j < txq->desc_count; j++) { + map = &txq->tx_map[j]; + if (map->txm_map != NULL) { + bus_dmamap_destroy(sc->sc_dmat, map->txm_map); + map->txm_map = NULL; + } + } + free(txq->tx_map, M_DEVBUF, txq->desc_count * sizeof(*map)); + txq->tx_map = NULL; + if (txq->tx_rsq != NULL) { + free(txq->tx_rsq, M_DEVBUF, + sc->isc_ntxd[0] * sizeof(uint16_t)); + txq->tx_rsq = NULL; + } + } + + free(vsi->tx_queues, M_DEVBUF, + sc->sc_nqueues * sizeof(struct ice_tx_queue)); + vsi->tx_queues = NULL; +} + +/* ice_tx_queues_alloc - Allocate Tx queue memory */ +int +ice_tx_queues_alloc(struct ice_softc *sc) +{ + struct ice_vsi *vsi = &sc->pf_vsi; + struct ice_tx_queue *txq; + int err, i, j; + + KASSERT(sc->isc_ntxd[0] <= ICE_MAX_DESC_COUNT); +#if 0 + ASSERT_CTX_LOCKED(sc); +#endif + /* Do not bother allocating queues if we're in recovery mode */ + if (ice_test_state(&sc->state, ICE_STATE_RECOVERY_MODE)) + return (0); + + /* Allocate queue structure memory */ + if (!(vsi->tx_queues = + (struct ice_tx_queue *) mallocarray(sc->sc_nqueues, + sizeof(struct ice_tx_queue), M_DEVBUF, M_NOWAIT | M_ZERO))) { + printf("%s: Unable to allocate Tx queue memory\n", + sc->sc_dev.dv_xname); + return (ENOMEM); + } + + /* Allocate Tx descriptor memory */ + for (i = 0, txq = vsi->tx_queues; i < sc->sc_nqueues; i++, txq++) { + txq->tx_base = ice_alloc_dma_mem(&sc->hw, &txq->tx_desc_mem, + sc->isc_ntxd[i] * sizeof(struct ice_tx_desc)); + if (txq->tx_base == NULL) { + printf("%s: Unable to allocate Tx descriptor memory\n", + sc->sc_dev.dv_xname); + err = ENOMEM; + goto free_tx_queues; + } + txq->tx_paddr = txq->tx_desc_mem.pa; + } + + /* Create Tx queue DMA maps. */ + for (i = 0, txq = vsi->tx_queues; i < sc->sc_nqueues; i++, txq++) { + struct ice_tx_map *map; + int j; + + txq->tx_map = mallocarray(sc->isc_ntxd[i], sizeof(*map), + M_DEVBUF, M_NOWAIT| M_ZERO); + if (txq->tx_map == NULL) { + printf("%s: could not allocate Tx DMA map\n", + sc->sc_dev.dv_xname); + err = ENOMEM; + goto free_tx_queues; + } + + for (j = 0; j < sc->isc_ntxd[i]; j++) { + map = &txq->tx_map[j]; + if (bus_dmamap_create(sc->sc_dmat, ICE_MAX_FRAME_SIZE, 1, + ICE_MAX_FRAME_SIZE, 0, + BUS_DMA_WAITOK | BUS_DMA_ALLOCNOW | BUS_DMA_64BIT, + &map->txm_map) != 0) { + printf("%s: could not allocate Tx DMA map\n", + sc->sc_dev.dv_xname); + err = ENOMEM; + goto free_tx_queues; + } + } + } + + /* Allocate report status arrays */ + for (i = 0, txq = vsi->tx_queues; i < sc->sc_nqueues; i++, txq++) { + if (!(txq->tx_rsq = + (uint16_t *) mallocarray(sc->isc_ntxd[0], + sizeof(uint16_t), M_DEVBUF, M_NOWAIT))) { + printf("%s: Unable to allocate tx_rsq memory\n", + sc->sc_dev.dv_xname); + err = ENOMEM; + goto free_tx_queues; + } + /* Initialize report status array */ + for (j = 0; j < sc->isc_ntxd[i]; j++) + txq->tx_rsq[j] = ICE_QIDX_INVALID; + } + + /* Assign queues from PF space to the main VSI */ + err = ice_resmgr_assign_contiguous(&sc->tx_qmgr, vsi->tx_qmap, + sc->sc_nqueues); + if (err) { + printf("%s: Unable to assign PF queues: error %d\n", + sc->sc_dev.dv_xname, err); + goto free_tx_queues; + } + vsi->qmap_type = ICE_RESMGR_ALLOC_CONTIGUOUS; +#if 0 + /* Add Tx queue sysctls context */ + ice_vsi_add_txqs_ctx(vsi); +#endif + for (i = 0, txq = vsi->tx_queues; i < sc->sc_nqueues; i++, txq++) { + /* q_handle == me when only one TC */ + txq->me = txq->q_handle = i; + txq->vsi = vsi; + + /* store the queue size for easier access */ + txq->desc_count = sc->isc_ntxd[i]; + + /* set doorbell address */ + txq->tail = QTX_COMM_DBELL(vsi->tx_qmap[i]); +#if 0 + ice_add_txq_sysctls(txq); +#endif + + txq->txq_cons = txq->txq_prod = 0; + } + + vsi->num_tx_queues = sc->sc_nqueues; + + return (0); + +free_tx_queues: + ice_free_tx_queues(sc); + return err; +} + +uint32_t +ice_hardmtu(struct ice_hw *hw) +{ + return hw->port_info->phy.link_info.max_frame_size - + ETHER_HDR_LEN - ETHER_CRC_LEN; +} + +void +ice_free_rx_queues(struct ice_softc *sc) +{ + struct ice_vsi *vsi = &sc->pf_vsi; + struct ice_rx_queue *rxq; + struct ice_rx_map *map; + int i, j; + + for (i = 0, rxq = vsi->rx_queues; i < sc->sc_nqueues; i++, rxq++) { + ice_free_dma_mem(&sc->hw, &rxq->rx_desc_mem); + for (j = 0; j < rxq->desc_count; j++) { + map = &rxq->rx_map[j]; + if (map->rxm_map != NULL) { + bus_dmamap_destroy(sc->sc_dmat, map->rxm_map); + map->rxm_map = NULL; + } + } + free(rxq->rx_map, M_DEVBUF, rxq->desc_count * sizeof(*map)); + rxq->rx_map = NULL; + } + + free(vsi->rx_queues, M_DEVBUF, + sc->sc_nqueues * sizeof(struct ice_rx_queue)); + vsi->rx_queues = NULL; +} + +void +ice_rxrefill(void *arg) +{ + struct ice_rx_queue *rxq = arg; + struct ice_softc *sc = rxq->vsi->sc; + + ice_rxfill(sc, rxq); +} + +/* ice_rx_queues_alloc - Allocate Rx queue memory */ +int +ice_rx_queues_alloc(struct ice_softc *sc) +{ + struct ice_vsi *vsi = &sc->pf_vsi; + struct ice_rx_queue *rxq; + int err, i; + + KASSERT(sc->isc_nrxd[0] <= ICE_MAX_DESC_COUNT); +#if 0 + ASSERT_CTX_LOCKED(sc); +#endif + /* Do not bother allocating queues if we're in recovery mode */ + if (ice_test_state(&sc->state, ICE_STATE_RECOVERY_MODE)) + return (0); + + /* Allocate queue structure memory */ + if (!(vsi->rx_queues = + (struct ice_rx_queue *) mallocarray(sc->sc_nqueues, + sizeof(struct ice_rx_queue), M_DEVBUF, M_NOWAIT | M_ZERO))) { + printf("%s: Unable to allocate Rx queue memory\n", + sc->sc_dev.dv_xname); + return (ENOMEM); + } + + /* Allocate Rx descriptor memory */ + for (i = 0, rxq = vsi->rx_queues; i < sc->sc_nqueues; i++, rxq++) { + rxq->rx_base = ice_alloc_dma_mem(&sc->hw, &rxq->rx_desc_mem, + sc->isc_nrxd[i] * sizeof(union ice_32b_rx_flex_desc)); + if (rxq->rx_base == NULL) { + printf("%s: Unable to allocate Rx descriptor memory\n", + sc->sc_dev.dv_xname); + err = ENOMEM; + goto free_rx_queues; + } + rxq->rx_paddr = rxq->rx_desc_mem.pa; + } + + /* Create Rx queue DMA maps. */ + for (i = 0, rxq = vsi->rx_queues; i < sc->sc_nqueues; i++, rxq++) { + struct ice_rx_map *map; + int j; + + rxq->rx_map = mallocarray(sc->isc_nrxd[i], sizeof(*map), + M_DEVBUF, M_NOWAIT| M_ZERO); + if (rxq->rx_map == NULL) { + printf("%s: could not allocate Rx DMA map\n", + sc->sc_dev.dv_xname); + err = ENOMEM; + goto free_rx_queues; + } + + for (j = 0; j < sc->isc_nrxd[i]; j++) { + map = &rxq->rx_map[j]; + if (bus_dmamap_create(sc->sc_dmat, vsi->mbuf_sz, 1, + vsi->mbuf_sz, 0, + BUS_DMA_WAITOK | BUS_DMA_ALLOCNOW | BUS_DMA_64BIT, + &map->rxm_map) != 0) { + printf("%s: could not allocate Rx DMA map\n", + sc->sc_dev.dv_xname); + err = ENOMEM; + goto free_rx_queues; + } + } + } + + /* Assign queues from PF space to the main VSI */ + err = ice_resmgr_assign_contiguous(&sc->rx_qmgr, vsi->rx_qmap, + sc->sc_nqueues); + if (err) { + printf("%s: Unable to assign PF queues: error %d\n", + sc->sc_dev.dv_xname, err); + goto free_rx_queues; + } + vsi->qmap_type = ICE_RESMGR_ALLOC_CONTIGUOUS; +#if 0 + /* Add Rx queue sysctls context */ + ice_vsi_add_rxqs_ctx(vsi); +#endif + for (i = 0, rxq = vsi->rx_queues; i < sc->sc_nqueues; i++, rxq++) { + rxq->me = i; + rxq->vsi = vsi; + + /* store the queue size for easier access */ + rxq->desc_count = sc->isc_nrxd[i]; + + /* set tail address */ + rxq->tail = QRX_TAIL(vsi->rx_qmap[i]); +#if 0 + ice_add_rxq_sysctls(rxq); +#endif + if_rxr_init(&rxq->rxq_acct, ICE_MIN_DESC_COUNT, + rxq->desc_count - 1); + timeout_set(&rxq->rxq_refill, ice_rxrefill, rxq); + + rxq->rxq_cons = rxq->rxq_prod = 0; + rxq->rxq_m_head = NULL; + rxq->rxq_m_tail = &rxq->rxq_m_head; + } + + vsi->num_rx_queues = sc->sc_nqueues; + + return (0); + +free_rx_queues: + ice_free_rx_queues(sc); + return err; +} + +/** + * ice_aq_start_stop_dcbx - Start/Stop DCBX service in FW + * @hw: pointer to the HW struct + * @start_dcbx_agent: True if DCBX Agent needs to be started + * False if DCBX Agent needs to be stopped + * @dcbx_agent_status: FW indicates back the DCBX agent status + * True if DCBX Agent is active + * False if DCBX Agent is stopped + * @cd: pointer to command details structure or NULL + * + * Start/Stop the embedded dcbx Agent. In case that this wrapper function + * returns ICE_SUCCESS, caller will need to check if FW returns back the same + * value as stated in dcbx_agent_status, and react accordingly. (0x0A09) + */ +enum ice_status +ice_aq_start_stop_dcbx(struct ice_hw *hw, bool start_dcbx_agent, + bool *dcbx_agent_status, struct ice_sq_cd *cd) +{ + struct ice_aqc_lldp_stop_start_specific_agent *cmd; + enum ice_adminq_opc opcode; + struct ice_aq_desc desc; + enum ice_status status; + + cmd = &desc.params.lldp_agent_ctrl; + + opcode = ice_aqc_opc_lldp_stop_start_specific_agent; + + ice_fill_dflt_direct_cmd_desc(&desc, opcode); + + if (start_dcbx_agent) + cmd->command = ICE_AQC_START_STOP_AGENT_START_DCBX; + + status = ice_aq_send_cmd(hw, &desc, NULL, 0, cd); + + *dcbx_agent_status = false; + + if (status == ICE_SUCCESS && + cmd->command == ICE_AQC_START_STOP_AGENT_START_DCBX) + *dcbx_agent_status = true; + + return status; +} + +/** + * ice_get_dcbx_status + * @hw: pointer to the HW struct + * + * Get the DCBX status from the Firmware + */ +uint8_t +ice_get_dcbx_status(struct ice_hw *hw) +{ + uint32_t reg; + + reg = ICE_READ(hw, PRTDCB_GENS); + return (uint8_t)((reg & PRTDCB_GENS_DCBX_STATUS_M) >> + PRTDCB_GENS_DCBX_STATUS_S); +} + +/** + * ice_start_dcbx_agent - Start DCBX agent in FW via AQ command + * @sc: the device softc + * + * @pre device is DCB capable and the FW LLDP agent has started + * + * Checks DCBX status and starts the DCBX agent if it is not in + * a valid state via an AQ command. + */ +void +ice_start_dcbx_agent(struct ice_softc *sc) +{ + struct ice_hw *hw = &sc->hw; + bool dcbx_agent_status; + enum ice_status status; + + hw->port_info->qos_cfg.dcbx_status = ice_get_dcbx_status(hw); + + if (hw->port_info->qos_cfg.dcbx_status != ICE_DCBX_STATUS_DONE && + hw->port_info->qos_cfg.dcbx_status != ICE_DCBX_STATUS_IN_PROGRESS) { + /* + * Start DCBX agent, but not LLDP. The return value isn't + * checked here because a more detailed dcbx agent status is + * retrieved and checked in ice_init_dcb() and elsewhere. + */ + status = ice_aq_start_stop_dcbx(hw, true, &dcbx_agent_status, + NULL); + if (status && hw->adminq.sq_last_status != ICE_AQ_RC_EPERM) + printf("%s: start_stop_dcbx failed, err %s aq_err %s\n", + sc->sc_dev.dv_xname, ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + } +} + +/** + * ice_aq_cfg_lldp_mib_change + * @hw: pointer to the HW struct + * @ena_update: Enable or Disable event posting + * @cd: pointer to command details structure or NULL + * + * Enable or Disable posting of an event on ARQ when LLDP MIB + * associated with the interface changes (0x0A01) + */ +enum ice_status +ice_aq_cfg_lldp_mib_change(struct ice_hw *hw, bool ena_update, + struct ice_sq_cd *cd) +{ + struct ice_aqc_lldp_set_mib_change *cmd; + struct ice_aq_desc desc; + + cmd = &desc.params.lldp_set_event; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_lldp_set_mib_change); + + if (!ena_update) + cmd->command |= ICE_AQ_LLDP_MIB_UPDATE_DIS; + else + cmd->command |= ICE_AQ_LLDP_MIB_PENDING_ENABLE << + ICE_AQ_LLDP_MIB_PENDING_S; + + return ice_aq_send_cmd(hw, &desc, NULL, 0, cd); +} + +/** + * ice_init_dcb + * @hw: pointer to the HW struct + * @enable_mib_change: enable MIB change event + * + * Update DCB configuration from the Firmware + */ +enum ice_status +ice_init_dcb(struct ice_hw *hw, bool enable_mib_change) +{ + struct ice_qos_cfg *qos_cfg = &hw->port_info->qos_cfg; + enum ice_status ret = ICE_SUCCESS; + + if (!hw->func_caps.common_cap.dcb) + return ICE_ERR_NOT_SUPPORTED; + + qos_cfg->is_sw_lldp = true; + + /* Get DCBX status */ + qos_cfg->dcbx_status = ice_get_dcbx_status(hw); + + if (qos_cfg->dcbx_status == ICE_DCBX_STATUS_DONE || + qos_cfg->dcbx_status == ICE_DCBX_STATUS_IN_PROGRESS || + qos_cfg->dcbx_status == ICE_DCBX_STATUS_NOT_STARTED) { + /* Get current DCBX configuration */ + ret = ice_get_dcb_cfg(hw->port_info); + if (ret) + return ret; + qos_cfg->is_sw_lldp = false; + } else if (qos_cfg->dcbx_status == ICE_DCBX_STATUS_DIS) { + return ICE_ERR_NOT_READY; + } + + /* Configure the LLDP MIB change event */ + if (enable_mib_change) { + ret = ice_aq_cfg_lldp_mib_change(hw, true, NULL); + if (ret) + qos_cfg->is_sw_lldp = true; + } + + return ret; +} + +/** + * ice_aq_query_pfc_mode - Query PFC mode + * @hw: pointer to the HW struct + * @pfcmode_ret: Return PFC mode + * @cd: pointer to command details structure or NULL + * + * This will return an indication if DSCP-based PFC or VLAN-based PFC + * is enabled. (0x0302) + */ +enum ice_status +ice_aq_query_pfc_mode(struct ice_hw *hw, uint8_t *pfcmode_ret, + struct ice_sq_cd *cd) +{ + struct ice_aqc_set_query_pfc_mode *cmd; + struct ice_aq_desc desc; + enum ice_status status; + + cmd = &desc.params.set_query_pfc_mode; + + ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_query_pfc_mode); + + status = ice_aq_send_cmd(hw, &desc, NULL, 0, cd); + + if (!status) + *pfcmode_ret = cmd->pfc_mode; + + return status; +} + +/** + * ice_init_dcb_setup - Initialize DCB settings for HW + * @sc: the device softc + * + * This needs to be called after the fw_lldp_agent sysctl is added, since that + * can update the device's LLDP agent status if a tunable value is set. + * + * Get and store the initial state of DCB settings on driver load. Print out + * informational messages as well. + */ +void +ice_init_dcb_setup(struct ice_softc *sc) +{ + struct ice_dcbx_cfg *local_dcbx_cfg; + struct ice_hw *hw = &sc->hw; + enum ice_status status; + uint8_t pfcmode_ret; + + /* Don't do anything if DCB isn't supported */ + if (!ice_is_bit_set(sc->feat_cap, ICE_FEATURE_DCB)) { + DPRINTF("%s: No DCB support\n", __func__); + return; + } + + /* Starts DCBX agent if it needs starting */ + ice_start_dcbx_agent(sc); + + /* This sets hw->port_info->qos_cfg.is_sw_lldp */ + status = ice_init_dcb(hw, true); + + /* If there is an error, then FW LLDP is not in a usable state */ + if (status != 0 && status != ICE_ERR_NOT_READY) { + /* Don't print an error message if the return code from the AQ + * cmd performed in ice_init_dcb() is EPERM; that means the + * FW LLDP engine is disabled, and that is a valid state. + */ + if (!(status == ICE_ERR_AQ_ERROR && + hw->adminq.sq_last_status == ICE_AQ_RC_EPERM)) { + printf("%s: DCB init failed, err %s aq_err %s\n", + sc->sc_dev.dv_xname, ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + } + hw->port_info->qos_cfg.dcbx_status = ICE_DCBX_STATUS_NOT_STARTED; + } + + switch (hw->port_info->qos_cfg.dcbx_status) { + case ICE_DCBX_STATUS_DIS: + DNPRINTF(ICE_DBG_DCB, "%s: DCBX disabled\n", __func__); + break; + case ICE_DCBX_STATUS_NOT_STARTED: + DNPRINTF(ICE_DBG_DCB, "%s: DCBX not started\n", __func__); + break; + case ICE_DCBX_STATUS_MULTIPLE_PEERS: + DNPRINTF(ICE_DBG_DCB, "%s: DCBX detected multiple peers\n", + __func__); + break; + default: + break; + } + + /* LLDP disabled in FW */ + if (hw->port_info->qos_cfg.is_sw_lldp) { + ice_add_rx_lldp_filter(sc); + DPRINTF("%s: Firmware LLDP agent disabled\n", __func__); + } + + /* Query and cache PFC mode */ + status = ice_aq_query_pfc_mode(hw, &pfcmode_ret, NULL); + if (status) { + printf("%s: PFC mode query failed, err %s aq_err %s\n", + sc->sc_dev.dv_xname, ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + } + local_dcbx_cfg = &hw->port_info->qos_cfg.local_dcbx_cfg; + switch (pfcmode_ret) { + case ICE_AQC_PFC_VLAN_BASED_PFC: + local_dcbx_cfg->pfc_mode = ICE_QOS_MODE_VLAN; + break; + case ICE_AQC_PFC_DSCP_BASED_PFC: + local_dcbx_cfg->pfc_mode = ICE_QOS_MODE_DSCP; + break; + default: + /* DCB is disabled, but we shouldn't get here */ + break; + } + + /* Set default SW MIB for init */ + ice_set_default_local_mib_settings(sc); + + ice_set_bit(ICE_FEATURE_DCB, sc->feat_en); +} + +/** + * ice_set_link_management_mode -- Strict or lenient link management + * @sc: device private structure + * + * Some NVMs give the adapter the option to advertise a superset of link + * configurations. This checks to see if that option is enabled. + * Further, the NVM could also provide a specific set of configurations + * to try; these are cached in the driver's private structure if they + * are available. + */ +void +ice_set_link_management_mode(struct ice_softc *sc) +{ + struct ice_port_info *pi = sc->hw.port_info; + struct ice_link_default_override_tlv tlv = { 0 }; + enum ice_status status; + + /* Port must be in strict mode if FW version is below a certain + * version. (i.e. Don't set lenient mode features) + */ + if (!(ice_fw_supports_link_override(&sc->hw))) + return; + + status = ice_get_link_default_override(&tlv, pi); + if (status != ICE_SUCCESS) { + DPRINTF("%s: ice_get_link_default_override failed; " + "status %s, aq_err %s\n", __func__, ice_status_str(status), + ice_aq_str(sc->hw.adminq.sq_last_status)); + return; + } +#if 0 + if (ice_debug & ICE_DBG_LINK) + ice_print_ldo_tlv(sc, &tlv); +#endif + /* Set lenient link mode */ + if (ice_is_bit_set(sc->feat_cap, ICE_FEATURE_LENIENT_LINK_MODE) && + (!(tlv.options & ICE_LINK_OVERRIDE_STRICT_MODE))) + ice_set_bit(ICE_FEATURE_LENIENT_LINK_MODE, sc->feat_en); + + /* FW supports reporting a default configuration */ + if (ice_is_bit_set(sc->feat_cap, ICE_FEATURE_LINK_MGMT_VER_2) && + ice_fw_supports_report_dflt_cfg(&sc->hw)) { + ice_set_bit(ICE_FEATURE_LINK_MGMT_VER_2, sc->feat_en); + /* Knowing we're at a high enough firmware revision to + * support this link management configuration, we don't + * need to check/support earlier versions. + */ + return; + } + + /* Default overrides only work if in lenient link mode */ + if (ice_is_bit_set(sc->feat_cap, ICE_FEATURE_LINK_MGMT_VER_1) && + ice_is_bit_set(sc->feat_en, ICE_FEATURE_LENIENT_LINK_MODE) && + (tlv.options & ICE_LINK_OVERRIDE_EN)) + ice_set_bit(ICE_FEATURE_LINK_MGMT_VER_1, sc->feat_en); + + /* Cache the LDO TLV structure in the driver, since it + * won't change during the driver's lifetime. + */ + sc->ldo_tlv = tlv; +} + +/** + * ice_init_saved_phy_cfg -- Set cached user PHY cfg settings with NVM defaults + * @sc: device private structure + * + * This should be called before the tunables for these link settings + * (e.g. advertise_speed) are added -- so that these defaults don't overwrite + * the cached values that the sysctl handlers will write. + * + * This also needs to be called before ice_init_link_configuration, to ensure + * that there are sane values that can be written if there is media available + * in the port. + */ +void +ice_init_saved_phy_cfg(struct ice_softc *sc) +{ + struct ice_port_info *pi = sc->hw.port_info; + struct ice_aqc_get_phy_caps_data pcaps = { 0 }; + enum ice_status status; + uint64_t phy_low, phy_high; + uint8_t report_mode = ICE_AQC_REPORT_TOPO_CAP_MEDIA; + + if (ice_is_bit_set(sc->feat_en, ICE_FEATURE_LINK_MGMT_VER_2)) + report_mode = ICE_AQC_REPORT_DFLT_CFG; + status = ice_aq_get_phy_caps(pi, false, report_mode, &pcaps, NULL); + if (status != ICE_SUCCESS) { + DPRINTF("%s: ice_aq_get_phy_caps (%s) failed; status %s, " + "aq_err %s\n", __func__, + report_mode == ICE_AQC_REPORT_DFLT_CFG ? "DFLT" : "w/MEDIA", + ice_status_str(status), + ice_aq_str(sc->hw.adminq.sq_last_status)); + return; + } + + phy_low = le64toh(pcaps.phy_type_low); + phy_high = le64toh(pcaps.phy_type_high); + + /* Save off initial config parameters */ + pi->phy.curr_user_speed_req = + ice_aq_phy_types_to_link_speeds(phy_low, phy_high); + pi->phy.curr_user_fec_req = ice_caps_to_fec_mode(pcaps.caps, + pcaps.link_fec_options); + pi->phy.curr_user_fc_req = ice_caps_to_fc_mode(pcaps.caps); +} + +/** + * ice_read_pba_string - Reads part number string from NVM + * @hw: pointer to hardware structure + * @pba_num: stores the part number string from the NVM + * @pba_num_size: part number string buffer length + * + * Reads the part number string from the NVM. + */ +enum ice_status +ice_read_pba_string(struct ice_hw *hw, uint8_t *pba_num, uint32_t pba_num_size) +{ + uint16_t pba_tlv, pba_tlv_len; + enum ice_status status; + uint16_t pba_word, pba_size; + uint16_t i; + + status = ice_get_pfa_module_tlv(hw, &pba_tlv, &pba_tlv_len, + ICE_SR_PBA_BLOCK_PTR); + if (status != ICE_SUCCESS) { + DNPRINTF(ICE_DBG_INIT, "%s: Failed to read PBA Block TLV.\n", + __func__); + return status; + } + + /* pba_size is the next word */ + status = ice_read_sr_word(hw, (pba_tlv + 2), &pba_size); + if (status != ICE_SUCCESS) { + DNPRINTF(ICE_DBG_INIT, "%s: Failed to read PBA Section size.\n", + __func__); + return status; + } + + if (pba_tlv_len < pba_size) { + DNPRINTF(ICE_DBG_INIT, "%s: Invalid PBA Block TLV size.\n", + __func__); + return ICE_ERR_INVAL_SIZE; + } + + /* Subtract one to get PBA word count (PBA Size word is included in + * total size) + */ + pba_size--; + if (pba_num_size < (((uint32_t)pba_size * 2) + 1)) { + DNPRINTF(ICE_DBG_INIT, "%s: Buffer too small for PBA data.\n", + __func__); + return ICE_ERR_PARAM; + } + + for (i = 0; i < pba_size; i++) { + status = ice_read_sr_word(hw, (pba_tlv + 2 + 1) + i, &pba_word); + if (status != ICE_SUCCESS) { + DNPRINTF(ICE_DBG_INIT, + "%s: Failed to read PBA Block word %d.\n", + __func__, i); + return status; + } + + pba_num[(i * 2)] = (pba_word >> 8) & 0xFF; + pba_num[(i * 2) + 1] = pba_word & 0xFF; + } + pba_num[(pba_size * 2)] = '\0'; + + return status; +} + +/** + * ice_cfg_pba_num - Determine if PBA Number is retrievable + * @sc: the device private softc structure + * + * Sets the feature flag for the existence of a PBA number + * based on the success of the read command. This does not + * cache the result. + */ +void +ice_cfg_pba_num(struct ice_softc *sc) +{ + uint8_t pba_string[32] = ""; + + if ((ice_is_bit_set(sc->feat_cap, ICE_FEATURE_HAS_PBA)) && + (ice_read_pba_string(&sc->hw, pba_string, sizeof(pba_string)) == 0)) + ice_set_bit(ICE_FEATURE_HAS_PBA, sc->feat_en); +} + +/** + * ice_init_link_configuration -- Setup link in different ways depending + * on whether media is available or not. + * @sc: device private structure + * + * Called at the end of the attach process to either set default link + * parameters if there is media available, or force HW link down and + * set a state bit if there is no media. + */ +void +ice_init_link_configuration(struct ice_softc *sc) +{ + struct ice_port_info *pi = sc->hw.port_info; + struct ice_hw *hw = &sc->hw; + enum ice_status status; + + pi->phy.get_link_info = true; + status = ice_get_link_status(pi, &sc->link_up); + if (status != ICE_SUCCESS) { + DPRINTF("%s: ice_get_link_status failed; status %s, " + "aq_err %s\n", __func__, ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + return; + } + + if (pi->phy.link_info.link_info & ICE_AQ_MEDIA_AVAILABLE) { + ice_clear_state(&sc->state, ICE_STATE_NO_MEDIA); + /* Apply default link settings */ + if (!ice_test_state(&sc->state, + ICE_STATE_LINK_ACTIVE_ON_DOWN)) { + ice_set_link(sc, false); + ice_set_state(&sc->state, + ICE_STATE_LINK_STATUS_REPORTED); + } else + ice_apply_saved_phy_cfg(sc, ICE_APPLY_LS_FEC_FC); + } else { + /* + * Set link down, and poll for media available in timer. + * This prevents the driver from receiving spurious + * link-related events. + */ + ice_set_state(&sc->state, ICE_STATE_NO_MEDIA); + status = ice_aq_set_link_restart_an(pi, false, NULL); + if (status != ICE_SUCCESS && + hw->adminq.sq_last_status != ICE_AQ_RC_EMODE) { + DPRINTF("%s: ice_aq_set_link_restart_an: status %s, " + "aq_err %s\n", __func__, ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + } + } +} + +void +ice_attach_hook(struct device *self) +{ + struct ice_softc *sc = (void *)self; + struct ice_hw *hw = &sc->hw; + struct ifnet *ifp = &sc->sc_ac.ac_if; + enum ice_status status; + unsigned nmsix, nqueues_max, nqueues; + int err; + + KASSERT(!cold); + + /* + * Attempt to load a firmware package. + * Success indicates a change was made that requires a reinitialization + * of the hardware + */ + status = ice_load_pkg_file(sc); + if (status == ICE_SUCCESS) { + ice_reinit_hw(sc); + return; + } + + err = ice_init_link_events(sc); + if (err) + goto deinit_hw; + + /* Initialize VLAN mode in FW; if dual VLAN mode is supported by the package + * and firmware, this will force them to use single VLAN mode. + */ + status = ice_set_vlan_mode(hw); + if (status) { + err = EIO; + DPRINTF("%s: Unable to initialize VLAN mode, " + "err %s aq_err %s\n", __func__, + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + goto deinit_hw; + } + + ice_print_nvm_version(sc); + + ice_setup_scctx(sc); + if (ice_is_bit_set(sc->feat_en, ICE_FEATURE_SAFE_MODE)) + ice_set_safe_mode_caps(hw); + + /* + * Figure out how many queues we can use. + * Require at least two MSIX vectors, one for traffic and + * one for misc causes. + */ + nmsix = MIN(sc->sc_nmsix_max, + hw->func_caps.common_cap.num_msix_vectors); + if (nmsix < 2) { + printf("%s: insufficient amount of MSIx vectors available\n", + sc->sc_dev.dv_xname); + goto deinit_hw; + } + sc->sc_nmsix = nmsix; + nqueues_max = MIN(hw->func_caps.common_cap.num_rxq, + hw->func_caps.common_cap.num_txq); + sc->sc_intrmap = intrmap_create(&sc->sc_dev, sc->sc_nmsix - 1, + nqueues_max, INTRMAP_POWEROF2); + nqueues = intrmap_count(sc->sc_intrmap); + KASSERT(nqueues > 0); + KASSERT(powerof2(nqueues)); + sc->sc_nqueues = MIN(nqueues, sc->sc_nvectors); + DPRINTF("%s: %d MSIx vector%s available, using %d queue%s\n", __func__, + sc->sc_nmsix, sc->sc_nmsix > 1 ? "s" : "", + sc->sc_nqueues, sc->sc_nqueues > 1 ? "s" : ""); + + /* Initialize the Tx queue manager */ + err = ice_resmgr_init(&sc->tx_qmgr, hw->func_caps.common_cap.num_txq); + if (err) { + printf("%s: Unable to initialize Tx queue manager: err %d\n", + sc->sc_dev.dv_xname, err); + goto deinit_hw; + } + + /* Initialize the Rx queue manager */ + err = ice_resmgr_init(&sc->rx_qmgr, hw->func_caps.common_cap.num_rxq); + if (err) { + printf("%s: Unable to initialize Rx queue manager: %d\n", + sc->sc_dev.dv_xname, err); + goto free_tx_qmgr; + } + + /* Initialize the PF device interrupt resource manager */ + err = ice_alloc_intr_tracking(sc); + if (err) + /* Errors are already printed */ + goto free_rx_qmgr; + + /* Determine maximum number of VSIs we'll prepare for */ + sc->num_available_vsi = MIN(ICE_MAX_VSI_AVAILABLE, + hw->func_caps.guar_num_vsi); + if (!sc->num_available_vsi) { + err = EIO; + printf("%s: No VSIs allocated to host\n", + sc->sc_dev.dv_xname); + goto free_intr_tracking; + } + + /* Allocate storage for the VSI pointers */ + sc->all_vsi = (struct ice_vsi **) + mallocarray(sc->num_available_vsi, sizeof(struct ice_vsi *), + M_DEVBUF, M_WAITOK | M_ZERO); + if (sc->all_vsi == NULL) { + err = ENOMEM; + printf("%s: Unable to allocate VSI array\n", + sc->sc_dev.dv_xname); + goto free_intr_tracking; + } + + /* + * Prepare the statically allocated primary PF VSI in the softc + * structure. Other VSIs will be dynamically allocated as needed. + */ + ice_setup_pf_vsi(sc); + + err = ice_alloc_vsi_qmap(&sc->pf_vsi, sc->isc_ntxqsets_max, + sc->isc_nrxqsets_max); + if (err) { + printf("%s: Unable to allocate VSI Queue maps\n", + sc->sc_dev.dv_xname); + goto free_main_vsi; + } + + /* Allocate MSI-X vectors. */ + err = ice_allocate_msix(sc); + if (err) + goto free_main_vsi; + + err = ice_tx_queues_alloc(sc); + if (err) + goto free_main_vsi; + + err = ice_rx_queues_alloc(sc); + if (err) + goto free_queues; + + err = ice_initialize_vsi(&sc->pf_vsi); + if (err) + goto free_queues; + + /* Enable FW health event reporting */ + ice_init_health_events(sc); + + /* Configure the main PF VSI for RSS */ + err = ice_config_rss(&sc->pf_vsi); + if (err) { + printf("%s: Unable to configure RSS for the main VSI, " + "err %d\n", sc->sc_dev.dv_xname, err); + goto free_queues; + } +#if 0 + /* Configure switch to drop transmitted LLDP and PAUSE frames */ + err = ice_cfg_pf_ethertype_filters(sc); + if (err) + return err; + + ice_get_and_print_bus_info(sc); +#endif + ice_set_link_management_mode(sc); + + ice_init_saved_phy_cfg(sc); + + ice_cfg_pba_num(sc); +#if 0 + /* Set a default value for PFC mode on attach since the FW state is unknown + * before sysctl tunables are executed and it can't be queried. This fixes an + * issue when loading the driver with the FW LLDP agent enabled but the FW + * was previously in DSCP PFC mode. + */ + status = ice_aq_set_pfc_mode(&sc->hw, ICE_AQC_PFC_VLAN_BASED_PFC, NULL); + if (status != ICE_SUCCESS) + device_printf(sc->dev, "Setting pfc mode failed, status %s\n", ice_status_str(status)); + + ice_add_device_sysctls(sc); +#endif + /* Get DCBX/LLDP state and start DCBX agent */ + ice_init_dcb_setup(sc); + + /* Setup link configuration parameters */ + ice_init_link_configuration(sc); + ice_update_link_status(sc, true); + + /* Configure interrupt causes for the administrative interrupt */ + ice_configure_misc_interrupts(sc); + + /* Enable ITR 0 right away, so that we can handle admin interrupts */ + ice_enable_intr(&sc->hw, 0); +#if 0 + err = ice_rdma_pf_attach(sc); + if (err) + return (err); +#endif + if (ice_test_state(&sc->state, ICE_STATE_LINK_ACTIVE_ON_DOWN) && + !ice_test_state(&sc->state, ICE_STATE_NO_MEDIA)) + ice_set_state(&sc->state, ICE_STATE_FIRST_INIT_LINK); + + ifp->if_softc = sc; + strlcpy(ifp->if_xname, sc->sc_dev.dv_xname, IFNAMSIZ); + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; + ifp->if_xflags = IFXF_MPSAFE; + ifp->if_ioctl = ice_ioctl; + ifp->if_qstart = ice_start; + ifp->if_watchdog = ice_watchdog; + ifp->if_hardmtu = ice_hardmtu(hw); + + ifq_init_maxlen(&ifp->if_snd, ICE_DEFAULT_DESC_COUNT); + + ifp->if_capabilities = IFCAP_VLAN_MTU; +#if NVLAN > 0 + ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING; +#endif + + if_attach(ifp); + ether_ifattach(ifp); + + if_attach_queues(ifp, sc->sc_nqueues); + if_attach_iqueues(ifp, sc->sc_nqueues); + + /* Setup the MAC address */ + err = if_setlladdr(ifp, hw->port_info->mac.perm_addr); + if (err) + printf("%s: could not set MAC address (error %d)\n", + sc->sc_dev.dv_xname, err); + + ice_clear_state(&sc->state, ICE_STATE_ATTACHING); + return; + +free_queues: + ice_free_tx_queues(sc); + ice_free_rx_queues(sc); +free_main_vsi: + /* ice_release_vsi will free the queue maps if they were allocated */ + ice_release_vsi(&sc->pf_vsi); + free(sc->all_vsi, M_DEVBUF, + sc->num_available_vsi * sizeof(struct ice_vis *)); + sc->all_vsi = NULL; +free_intr_tracking: + ice_free_intr_tracking(sc); +free_rx_qmgr: + ice_resmgr_destroy(&sc->rx_qmgr); +free_tx_qmgr: + ice_resmgr_destroy(&sc->tx_qmgr); +deinit_hw: + ice_deinit_hw(hw); +} + +void +ice_attach(struct device *parent, struct device *self, void *aux) +{ + struct ice_softc *sc = (void *)self; + struct ice_hw *hw = &sc->hw; + struct pci_attach_args *pa = aux; + enum ice_fw_modes fw_mode; + pcireg_t memtype; + enum ice_status status; + int err, i; + + rw_init(&sc->sc_cfg_lock, "icecfg"); + + ice_set_state(&sc->state, ICE_STATE_ATTACHING); + + sc->sc_pid = PCI_PRODUCT(pa->pa_id); + sc->sc_pct = pa->pa_pc; + sc->sc_pcitag = pa->pa_tag; + sc->sc_dmat = pa->pa_dmat; + + hw->hw_sc = sc; + + task_set(&sc->sc_admin_task, ice_if_update_admin_status, sc); + timeout_set(&sc->sc_admin_timer, ice_admin_timer, sc); + + memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, PCI_MAPREG_START); + err = pci_mapreg_map(pa, PCI_MAPREG_START, memtype, 0, + &sc->sc_st, &sc->sc_sh, NULL, &sc->sc_sz, 0); + if (err) { + printf("%s: can't map mem space\n", sc->sc_dev.dv_xname); + return; + } + + ice_set_ctrlq_len(hw); + + fw_mode = ice_get_fw_mode(hw); + if (fw_mode == ICE_FW_MODE_REC) { + printf("%s: firmware is in recovery mode\n", + sc->sc_dev.dv_xname); +#if 0 + err = ice_attach_pre_recovery_mode(sc); + if (err) + goto free_pci_mapping; +#endif + return; + } + + /* Initialize the hw data structure */ + status = ice_init_hw(hw); + if (status) { + if (status == ICE_ERR_FW_API_VER) { + printf("%s: incompatible firmware API version\n", + sc->sc_dev.dv_xname); +#if 0 + /* Enter recovery mode, so that the driver remains + * loaded. This way, if the system administrator + * cannot update the driver, they may still attempt to + * downgrade the NVM. + */ + err = ice_attach_pre_recovery_mode(sc); + if (err) + goto free_pci_mapping; +#endif + return; + } else { + printf("%s: could not initialize hardware, " + "status %s aq_err %s\n", + sc->sc_dev.dv_xname, ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + return; + } + } + + if (pci_intr_map_msix(pa, 0, &sc->sc_ih) == 0) { + unsigned int nmsix = pci_intr_msix_count(pa); + + /* + * Require at least two MSIX vectors, one for traffic and + * one for misc causes. + */ + if (nmsix < 2) { + printf(": can't map interrupt\n"); + return; + } + sc->sc_nmsix_max = nmsix; + } else { + printf(": can't map interrupt\n"); + return; + } + + /* + * Map an extra MSI-X vector per CPU, up to a hard-coded limit. + * We may not need them all but we can only figure out the supported + * number of queues once firmware is loaded. + */ + sc->sc_nvectors = MIN(sc->sc_nmsix_max, ncpus); + sc->sc_nvectors = MIN(sc->sc_nvectors, ICE_MAX_VECTORS); + sc->sc_vectors = mallocarray(sizeof(*sc->sc_vectors), sc->sc_nvectors, + M_DEVBUF, M_WAITOK|M_CANFAIL|M_ZERO); + if (sc->sc_vectors == NULL) { + printf(": unable to allocate MSIx interrupt vector array\n"); + return; + } + for (i = 0; i < sc->sc_nvectors; i++) { + struct ice_intr_vector *iv = &sc->sc_vectors[i]; + int v = i + 1; /* 0 is used for adminq */ + + iv->iv_sc = sc; + iv->iv_qid = i; + snprintf(iv->iv_name, sizeof(iv->iv_name), + "%s:%u", sc->sc_dev.dv_xname, i); + if (pci_intr_map_msix(pa, v, &iv->ih)) { + printf(": unable to map MSI-X vector %d\n", v); + goto free_vectors; + } + } + + printf(": %s\n", pci_intr_string(sc->sc_pct, sc->sc_ih)); + + ice_init_device_features(sc); + + /* Keep flag set by default */ + ice_set_state(&sc->state, ICE_STATE_LINK_ACTIVE_ON_DOWN); + + /* Notify firmware of the device driver version */ + err = ice_send_version(sc); + if (err) + goto deinit_hw; + + /* Initialize ifmedia structures. */ + ifmedia_init(&sc->media, IFM_IMASK, ice_media_change, ice_media_status); + ice_add_media_types(sc, &sc->media); + + config_mountroot(self, ice_attach_hook); + return; + +deinit_hw: + ice_deinit_hw(hw); +free_vectors: + free(sc->sc_vectors, M_DEVBUF, + sc->sc_nvectors * sizeof(*sc->sc_vectors)); + sc->sc_vectors = NULL; + sc->sc_nvectors = 0; +} + +struct cfdriver ice_cd = { + NULL, "ice", DV_IFNET +}; + +const struct cfattach ice_ca = { + sizeof(struct ice_softc), ice_match, ice_attach, + NULL, NULL, +}; diff --git a/sys/dev/pci/if_icereg.h b/sys/dev/pci/if_icereg.h new file mode 100644 index 000000000..10e6865c1 --- /dev/null +++ b/sys/dev/pci/if_icereg.h @@ -0,0 +1,15330 @@ +/* $OpenBSD: if_icereg.h,v 1.2 2024/11/25 12:50:47 stsp Exp $ */ + +/* Copyright (c) 2024, Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* Machine generated file. Do not edit. */ + +#ifndef _ICE_HW_AUTOGEN_H_ +#define _ICE_HW_AUTOGEN_H_ + +/* portability goo */ +#define BIT(x) (1UL << (x)) +#define BIT_ULL(x) (1ULL << (x)) +#define MAKEMASK(_m, _s) ((_m) << (_s)) + +#define GL_HIDA(_i) (0x00082000 + ((_i) * 4)) +#define GL_HIBA(_i) (0x00081000 + ((_i) * 4)) +#define GL_HICR 0x00082040 +#define GL_HICR_EN 0x00082044 +#define GLGEN_CSR_DEBUG_C 0x00075750 +#define GLNVM_GENS 0x000B6100 +#define GLNVM_FLA 0x000B6108 +#define GL_HIDA_MAX_INDEX 15 +#define GL_HIBA_MAX_INDEX 1023 +#define GL_RDPU_CNTRL 0x00052054 /* Reset Source: CORER */ +#define GL_RDPU_CNTRL_RX_PAD_EN_S 0 +#define GL_RDPU_CNTRL_RX_PAD_EN_M BIT(0) +#define GL_RDPU_CNTRL_UDP_ZERO_EN_S 1 +#define GL_RDPU_CNTRL_UDP_ZERO_EN_M BIT(1) +#define GL_RDPU_CNTRL_BLNC_EN_S 2 +#define GL_RDPU_CNTRL_BLNC_EN_M BIT(2) +#define GL_RDPU_CNTRL_RECIPE_BYPASS_S 3 +#define GL_RDPU_CNTRL_RECIPE_BYPASS_M BIT(3) +#define GL_RDPU_CNTRL_RLAN_ACK_REQ_PM_TH_S 4 +#define GL_RDPU_CNTRL_RLAN_ACK_REQ_PM_TH_M MAKEMASK(0x3F, 4) +#define GL_RDPU_CNTRL_PE_ACK_REQ_PM_TH_S 10 +#define GL_RDPU_CNTRL_PE_ACK_REQ_PM_TH_M MAKEMASK(0x3F, 10) +#define GL_RDPU_CNTRL_REQ_WB_PM_TH_S 16 +#define GL_RDPU_CNTRL_REQ_WB_PM_TH_M MAKEMASK(0x1F, 16) +#define GL_RDPU_CNTRL_ECO_S 21 +#define GL_RDPU_CNTRL_ECO_M MAKEMASK(0x7FF, 21) +#define MSIX_PBA(_i) (0x00008000 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: FLR */ +#define MSIX_PBA_MAX_INDEX 2 +#define MSIX_PBA_PENBIT_S 0 +#define MSIX_PBA_PENBIT_M MAKEMASK(0xFFFFFFFF, 0) +#define MSIX_TADD(_i) (0x00000000 + ((_i) * 16)) /* _i=0...64 */ /* Reset Source: FLR */ +#define MSIX_TADD_MAX_INDEX 64 +#define MSIX_TADD_MSIXTADD10_S 0 +#define MSIX_TADD_MSIXTADD10_M MAKEMASK(0x3, 0) +#define MSIX_TADD_MSIXTADD_S 2 +#define MSIX_TADD_MSIXTADD_M MAKEMASK(0x3FFFFFFF, 2) +#define MSIX_TUADD(_i) (0x00000004 + ((_i) * 16)) /* _i=0...64 */ /* Reset Source: FLR */ +#define MSIX_TUADD_MAX_INDEX 64 +#define MSIX_TUADD_MSIXTUADD_S 0 +#define MSIX_TUADD_MSIXTUADD_M MAKEMASK(0xFFFFFFFF, 0) +#define MSIX_TVCTRL(_i) (0x0000000C + ((_i) * 16)) /* _i=0...64 */ /* Reset Source: FLR */ +#define MSIX_TVCTRL_MAX_INDEX 64 +#define MSIX_TVCTRL_MASK_S 0 +#define MSIX_TVCTRL_MASK_M BIT(0) +#define PF0_FW_HLP_ARQBAH_PAGE 0x02D00180 /* Reset Source: EMPR */ +#define PF0_FW_HLP_ARQBAH_PAGE_ARQBAH_S 0 +#define PF0_FW_HLP_ARQBAH_PAGE_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_FW_HLP_ARQBAL_PAGE 0x02D00080 /* Reset Source: EMPR */ +#define PF0_FW_HLP_ARQBAL_PAGE_ARQBAL_LSB_S 0 +#define PF0_FW_HLP_ARQBAL_PAGE_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF0_FW_HLP_ARQBAL_PAGE_ARQBAL_S 6 +#define PF0_FW_HLP_ARQBAL_PAGE_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_FW_HLP_ARQH_PAGE 0x02D00380 /* Reset Source: EMPR */ +#define PF0_FW_HLP_ARQH_PAGE_ARQH_S 0 +#define PF0_FW_HLP_ARQH_PAGE_ARQH_M MAKEMASK(0x3FF, 0) +#define PF0_FW_HLP_ARQLEN_PAGE 0x02D00280 /* Reset Source: EMPR */ +#define PF0_FW_HLP_ARQLEN_PAGE_ARQLEN_S 0 +#define PF0_FW_HLP_ARQLEN_PAGE_ARQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_FW_HLP_ARQLEN_PAGE_ARQVFE_S 28 +#define PF0_FW_HLP_ARQLEN_PAGE_ARQVFE_M BIT(28) +#define PF0_FW_HLP_ARQLEN_PAGE_ARQOVFL_S 29 +#define PF0_FW_HLP_ARQLEN_PAGE_ARQOVFL_M BIT(29) +#define PF0_FW_HLP_ARQLEN_PAGE_ARQCRIT_S 30 +#define PF0_FW_HLP_ARQLEN_PAGE_ARQCRIT_M BIT(30) +#define PF0_FW_HLP_ARQLEN_PAGE_ARQENABLE_S 31 +#define PF0_FW_HLP_ARQLEN_PAGE_ARQENABLE_M BIT(31) +#define PF0_FW_HLP_ARQT_PAGE 0x02D00480 /* Reset Source: EMPR */ +#define PF0_FW_HLP_ARQT_PAGE_ARQT_S 0 +#define PF0_FW_HLP_ARQT_PAGE_ARQT_M MAKEMASK(0x3FF, 0) +#define PF0_FW_HLP_ATQBAH_PAGE 0x02D00100 /* Reset Source: EMPR */ +#define PF0_FW_HLP_ATQBAH_PAGE_ATQBAH_S 0 +#define PF0_FW_HLP_ATQBAH_PAGE_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_FW_HLP_ATQBAL_PAGE 0x02D00000 /* Reset Source: EMPR */ +#define PF0_FW_HLP_ATQBAL_PAGE_ATQBAL_LSB_S 0 +#define PF0_FW_HLP_ATQBAL_PAGE_ATQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF0_FW_HLP_ATQBAL_PAGE_ATQBAL_S 6 +#define PF0_FW_HLP_ATQBAL_PAGE_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_FW_HLP_ATQH_PAGE 0x02D00300 /* Reset Source: EMPR */ +#define PF0_FW_HLP_ATQH_PAGE_ATQH_S 0 +#define PF0_FW_HLP_ATQH_PAGE_ATQH_M MAKEMASK(0x3FF, 0) +#define PF0_FW_HLP_ATQLEN_PAGE 0x02D00200 /* Reset Source: EMPR */ +#define PF0_FW_HLP_ATQLEN_PAGE_ATQLEN_S 0 +#define PF0_FW_HLP_ATQLEN_PAGE_ATQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_FW_HLP_ATQLEN_PAGE_ATQVFE_S 28 +#define PF0_FW_HLP_ATQLEN_PAGE_ATQVFE_M BIT(28) +#define PF0_FW_HLP_ATQLEN_PAGE_ATQOVFL_S 29 +#define PF0_FW_HLP_ATQLEN_PAGE_ATQOVFL_M BIT(29) +#define PF0_FW_HLP_ATQLEN_PAGE_ATQCRIT_S 30 +#define PF0_FW_HLP_ATQLEN_PAGE_ATQCRIT_M BIT(30) +#define PF0_FW_HLP_ATQLEN_PAGE_ATQENABLE_S 31 +#define PF0_FW_HLP_ATQLEN_PAGE_ATQENABLE_M BIT(31) +#define PF0_FW_HLP_ATQT_PAGE 0x02D00400 /* Reset Source: EMPR */ +#define PF0_FW_HLP_ATQT_PAGE_ATQT_S 0 +#define PF0_FW_HLP_ATQT_PAGE_ATQT_M MAKEMASK(0x3FF, 0) +#define PF0_FW_PSM_ARQBAH_PAGE 0x02D40180 /* Reset Source: EMPR */ +#define PF0_FW_PSM_ARQBAH_PAGE_ARQBAH_S 0 +#define PF0_FW_PSM_ARQBAH_PAGE_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_FW_PSM_ARQBAL_PAGE 0x02D40080 /* Reset Source: EMPR */ +#define PF0_FW_PSM_ARQBAL_PAGE_ARQBAL_LSB_S 0 +#define PF0_FW_PSM_ARQBAL_PAGE_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF0_FW_PSM_ARQBAL_PAGE_ARQBAL_S 6 +#define PF0_FW_PSM_ARQBAL_PAGE_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_FW_PSM_ARQH_PAGE 0x02D40380 /* Reset Source: EMPR */ +#define PF0_FW_PSM_ARQH_PAGE_ARQH_S 0 +#define PF0_FW_PSM_ARQH_PAGE_ARQH_M MAKEMASK(0x3FF, 0) +#define PF0_FW_PSM_ARQLEN_PAGE 0x02D40280 /* Reset Source: EMPR */ +#define PF0_FW_PSM_ARQLEN_PAGE_ARQLEN_S 0 +#define PF0_FW_PSM_ARQLEN_PAGE_ARQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_FW_PSM_ARQLEN_PAGE_ARQVFE_S 28 +#define PF0_FW_PSM_ARQLEN_PAGE_ARQVFE_M BIT(28) +#define PF0_FW_PSM_ARQLEN_PAGE_ARQOVFL_S 29 +#define PF0_FW_PSM_ARQLEN_PAGE_ARQOVFL_M BIT(29) +#define PF0_FW_PSM_ARQLEN_PAGE_ARQCRIT_S 30 +#define PF0_FW_PSM_ARQLEN_PAGE_ARQCRIT_M BIT(30) +#define PF0_FW_PSM_ARQLEN_PAGE_ARQENABLE_S 31 +#define PF0_FW_PSM_ARQLEN_PAGE_ARQENABLE_M BIT(31) +#define PF0_FW_PSM_ARQT_PAGE 0x02D40480 /* Reset Source: EMPR */ +#define PF0_FW_PSM_ARQT_PAGE_ARQT_S 0 +#define PF0_FW_PSM_ARQT_PAGE_ARQT_M MAKEMASK(0x3FF, 0) +#define PF0_FW_PSM_ATQBAH_PAGE 0x02D40100 /* Reset Source: EMPR */ +#define PF0_FW_PSM_ATQBAH_PAGE_ATQBAH_S 0 +#define PF0_FW_PSM_ATQBAH_PAGE_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_FW_PSM_ATQBAL_PAGE 0x02D40000 /* Reset Source: EMPR */ +#define PF0_FW_PSM_ATQBAL_PAGE_ATQBAL_LSB_S 0 +#define PF0_FW_PSM_ATQBAL_PAGE_ATQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF0_FW_PSM_ATQBAL_PAGE_ATQBAL_S 6 +#define PF0_FW_PSM_ATQBAL_PAGE_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_FW_PSM_ATQH_PAGE 0x02D40300 /* Reset Source: EMPR */ +#define PF0_FW_PSM_ATQH_PAGE_ATQH_S 0 +#define PF0_FW_PSM_ATQH_PAGE_ATQH_M MAKEMASK(0x3FF, 0) +#define PF0_FW_PSM_ATQLEN_PAGE 0x02D40200 /* Reset Source: EMPR */ +#define PF0_FW_PSM_ATQLEN_PAGE_ATQLEN_S 0 +#define PF0_FW_PSM_ATQLEN_PAGE_ATQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_FW_PSM_ATQLEN_PAGE_ATQVFE_S 28 +#define PF0_FW_PSM_ATQLEN_PAGE_ATQVFE_M BIT(28) +#define PF0_FW_PSM_ATQLEN_PAGE_ATQOVFL_S 29 +#define PF0_FW_PSM_ATQLEN_PAGE_ATQOVFL_M BIT(29) +#define PF0_FW_PSM_ATQLEN_PAGE_ATQCRIT_S 30 +#define PF0_FW_PSM_ATQLEN_PAGE_ATQCRIT_M BIT(30) +#define PF0_FW_PSM_ATQLEN_PAGE_ATQENABLE_S 31 +#define PF0_FW_PSM_ATQLEN_PAGE_ATQENABLE_M BIT(31) +#define PF0_FW_PSM_ATQT_PAGE 0x02D40400 /* Reset Source: EMPR */ +#define PF0_FW_PSM_ATQT_PAGE_ATQT_S 0 +#define PF0_FW_PSM_ATQT_PAGE_ATQT_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_CPM_ARQBAH_PAGE 0x02D80190 /* Reset Source: CORER */ +#define PF0_MBX_CPM_ARQBAH_PAGE_ARQBAH_S 0 +#define PF0_MBX_CPM_ARQBAH_PAGE_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_MBX_CPM_ARQBAL_PAGE 0x02D80090 /* Reset Source: CORER */ +#define PF0_MBX_CPM_ARQBAL_PAGE_ARQBAL_LSB_S 0 +#define PF0_MBX_CPM_ARQBAL_PAGE_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF0_MBX_CPM_ARQBAL_PAGE_ARQBAL_S 6 +#define PF0_MBX_CPM_ARQBAL_PAGE_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_MBX_CPM_ARQH_PAGE 0x02D80390 /* Reset Source: CORER */ +#define PF0_MBX_CPM_ARQH_PAGE_ARQH_S 0 +#define PF0_MBX_CPM_ARQH_PAGE_ARQH_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_CPM_ARQLEN_PAGE 0x02D80290 /* Reset Source: PFR */ +#define PF0_MBX_CPM_ARQLEN_PAGE_ARQLEN_S 0 +#define PF0_MBX_CPM_ARQLEN_PAGE_ARQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_CPM_ARQLEN_PAGE_ARQVFE_S 28 +#define PF0_MBX_CPM_ARQLEN_PAGE_ARQVFE_M BIT(28) +#define PF0_MBX_CPM_ARQLEN_PAGE_ARQOVFL_S 29 +#define PF0_MBX_CPM_ARQLEN_PAGE_ARQOVFL_M BIT(29) +#define PF0_MBX_CPM_ARQLEN_PAGE_ARQCRIT_S 30 +#define PF0_MBX_CPM_ARQLEN_PAGE_ARQCRIT_M BIT(30) +#define PF0_MBX_CPM_ARQLEN_PAGE_ARQENABLE_S 31 +#define PF0_MBX_CPM_ARQLEN_PAGE_ARQENABLE_M BIT(31) +#define PF0_MBX_CPM_ARQT_PAGE 0x02D80490 /* Reset Source: CORER */ +#define PF0_MBX_CPM_ARQT_PAGE_ARQT_S 0 +#define PF0_MBX_CPM_ARQT_PAGE_ARQT_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_CPM_ATQBAH_PAGE 0x02D80110 /* Reset Source: CORER */ +#define PF0_MBX_CPM_ATQBAH_PAGE_ATQBAH_S 0 +#define PF0_MBX_CPM_ATQBAH_PAGE_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_MBX_CPM_ATQBAL_PAGE 0x02D80010 /* Reset Source: CORER */ +#define PF0_MBX_CPM_ATQBAL_PAGE_ATQBAL_S 6 +#define PF0_MBX_CPM_ATQBAL_PAGE_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_MBX_CPM_ATQH_PAGE 0x02D80310 /* Reset Source: CORER */ +#define PF0_MBX_CPM_ATQH_PAGE_ATQH_S 0 +#define PF0_MBX_CPM_ATQH_PAGE_ATQH_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_CPM_ATQLEN_PAGE 0x02D80210 /* Reset Source: PFR */ +#define PF0_MBX_CPM_ATQLEN_PAGE_ATQLEN_S 0 +#define PF0_MBX_CPM_ATQLEN_PAGE_ATQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_CPM_ATQLEN_PAGE_ATQVFE_S 28 +#define PF0_MBX_CPM_ATQLEN_PAGE_ATQVFE_M BIT(28) +#define PF0_MBX_CPM_ATQLEN_PAGE_ATQOVFL_S 29 +#define PF0_MBX_CPM_ATQLEN_PAGE_ATQOVFL_M BIT(29) +#define PF0_MBX_CPM_ATQLEN_PAGE_ATQCRIT_S 30 +#define PF0_MBX_CPM_ATQLEN_PAGE_ATQCRIT_M BIT(30) +#define PF0_MBX_CPM_ATQLEN_PAGE_ATQENABLE_S 31 +#define PF0_MBX_CPM_ATQLEN_PAGE_ATQENABLE_M BIT(31) +#define PF0_MBX_CPM_ATQT_PAGE 0x02D80410 /* Reset Source: CORER */ +#define PF0_MBX_CPM_ATQT_PAGE_ATQT_S 0 +#define PF0_MBX_CPM_ATQT_PAGE_ATQT_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_HLP_ARQBAH_PAGE 0x02D00190 /* Reset Source: CORER */ +#define PF0_MBX_HLP_ARQBAH_PAGE_ARQBAH_S 0 +#define PF0_MBX_HLP_ARQBAH_PAGE_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_MBX_HLP_ARQBAL_PAGE 0x02D00090 /* Reset Source: CORER */ +#define PF0_MBX_HLP_ARQBAL_PAGE_ARQBAL_LSB_S 0 +#define PF0_MBX_HLP_ARQBAL_PAGE_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF0_MBX_HLP_ARQBAL_PAGE_ARQBAL_S 6 +#define PF0_MBX_HLP_ARQBAL_PAGE_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_MBX_HLP_ARQH_PAGE 0x02D00390 /* Reset Source: CORER */ +#define PF0_MBX_HLP_ARQH_PAGE_ARQH_S 0 +#define PF0_MBX_HLP_ARQH_PAGE_ARQH_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_HLP_ARQLEN_PAGE 0x02D00290 /* Reset Source: PFR */ +#define PF0_MBX_HLP_ARQLEN_PAGE_ARQLEN_S 0 +#define PF0_MBX_HLP_ARQLEN_PAGE_ARQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_HLP_ARQLEN_PAGE_ARQVFE_S 28 +#define PF0_MBX_HLP_ARQLEN_PAGE_ARQVFE_M BIT(28) +#define PF0_MBX_HLP_ARQLEN_PAGE_ARQOVFL_S 29 +#define PF0_MBX_HLP_ARQLEN_PAGE_ARQOVFL_M BIT(29) +#define PF0_MBX_HLP_ARQLEN_PAGE_ARQCRIT_S 30 +#define PF0_MBX_HLP_ARQLEN_PAGE_ARQCRIT_M BIT(30) +#define PF0_MBX_HLP_ARQLEN_PAGE_ARQENABLE_S 31 +#define PF0_MBX_HLP_ARQLEN_PAGE_ARQENABLE_M BIT(31) +#define PF0_MBX_HLP_ARQT_PAGE 0x02D00490 /* Reset Source: CORER */ +#define PF0_MBX_HLP_ARQT_PAGE_ARQT_S 0 +#define PF0_MBX_HLP_ARQT_PAGE_ARQT_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_HLP_ATQBAH_PAGE 0x02D00110 /* Reset Source: CORER */ +#define PF0_MBX_HLP_ATQBAH_PAGE_ATQBAH_S 0 +#define PF0_MBX_HLP_ATQBAH_PAGE_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_MBX_HLP_ATQBAL_PAGE 0x02D00010 /* Reset Source: CORER */ +#define PF0_MBX_HLP_ATQBAL_PAGE_ATQBAL_S 6 +#define PF0_MBX_HLP_ATQBAL_PAGE_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_MBX_HLP_ATQH_PAGE 0x02D00310 /* Reset Source: CORER */ +#define PF0_MBX_HLP_ATQH_PAGE_ATQH_S 0 +#define PF0_MBX_HLP_ATQH_PAGE_ATQH_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_HLP_ATQLEN_PAGE 0x02D00210 /* Reset Source: PFR */ +#define PF0_MBX_HLP_ATQLEN_PAGE_ATQLEN_S 0 +#define PF0_MBX_HLP_ATQLEN_PAGE_ATQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_HLP_ATQLEN_PAGE_ATQVFE_S 28 +#define PF0_MBX_HLP_ATQLEN_PAGE_ATQVFE_M BIT(28) +#define PF0_MBX_HLP_ATQLEN_PAGE_ATQOVFL_S 29 +#define PF0_MBX_HLP_ATQLEN_PAGE_ATQOVFL_M BIT(29) +#define PF0_MBX_HLP_ATQLEN_PAGE_ATQCRIT_S 30 +#define PF0_MBX_HLP_ATQLEN_PAGE_ATQCRIT_M BIT(30) +#define PF0_MBX_HLP_ATQLEN_PAGE_ATQENABLE_S 31 +#define PF0_MBX_HLP_ATQLEN_PAGE_ATQENABLE_M BIT(31) +#define PF0_MBX_HLP_ATQT_PAGE 0x02D00410 /* Reset Source: CORER */ +#define PF0_MBX_HLP_ATQT_PAGE_ATQT_S 0 +#define PF0_MBX_HLP_ATQT_PAGE_ATQT_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_PSM_ARQBAH_PAGE 0x02D40190 /* Reset Source: CORER */ +#define PF0_MBX_PSM_ARQBAH_PAGE_ARQBAH_S 0 +#define PF0_MBX_PSM_ARQBAH_PAGE_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_MBX_PSM_ARQBAL_PAGE 0x02D40090 /* Reset Source: CORER */ +#define PF0_MBX_PSM_ARQBAL_PAGE_ARQBAL_LSB_S 0 +#define PF0_MBX_PSM_ARQBAL_PAGE_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF0_MBX_PSM_ARQBAL_PAGE_ARQBAL_S 6 +#define PF0_MBX_PSM_ARQBAL_PAGE_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_MBX_PSM_ARQH_PAGE 0x02D40390 /* Reset Source: CORER */ +#define PF0_MBX_PSM_ARQH_PAGE_ARQH_S 0 +#define PF0_MBX_PSM_ARQH_PAGE_ARQH_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_PSM_ARQLEN_PAGE 0x02D40290 /* Reset Source: PFR */ +#define PF0_MBX_PSM_ARQLEN_PAGE_ARQLEN_S 0 +#define PF0_MBX_PSM_ARQLEN_PAGE_ARQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_PSM_ARQLEN_PAGE_ARQVFE_S 28 +#define PF0_MBX_PSM_ARQLEN_PAGE_ARQVFE_M BIT(28) +#define PF0_MBX_PSM_ARQLEN_PAGE_ARQOVFL_S 29 +#define PF0_MBX_PSM_ARQLEN_PAGE_ARQOVFL_M BIT(29) +#define PF0_MBX_PSM_ARQLEN_PAGE_ARQCRIT_S 30 +#define PF0_MBX_PSM_ARQLEN_PAGE_ARQCRIT_M BIT(30) +#define PF0_MBX_PSM_ARQLEN_PAGE_ARQENABLE_S 31 +#define PF0_MBX_PSM_ARQLEN_PAGE_ARQENABLE_M BIT(31) +#define PF0_MBX_PSM_ARQT_PAGE 0x02D40490 /* Reset Source: CORER */ +#define PF0_MBX_PSM_ARQT_PAGE_ARQT_S 0 +#define PF0_MBX_PSM_ARQT_PAGE_ARQT_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_PSM_ATQBAH_PAGE 0x02D40110 /* Reset Source: CORER */ +#define PF0_MBX_PSM_ATQBAH_PAGE_ATQBAH_S 0 +#define PF0_MBX_PSM_ATQBAH_PAGE_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_MBX_PSM_ATQBAL_PAGE 0x02D40010 /* Reset Source: CORER */ +#define PF0_MBX_PSM_ATQBAL_PAGE_ATQBAL_S 6 +#define PF0_MBX_PSM_ATQBAL_PAGE_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_MBX_PSM_ATQH_PAGE 0x02D40310 /* Reset Source: CORER */ +#define PF0_MBX_PSM_ATQH_PAGE_ATQH_S 0 +#define PF0_MBX_PSM_ATQH_PAGE_ATQH_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_PSM_ATQLEN_PAGE 0x02D40210 /* Reset Source: PFR */ +#define PF0_MBX_PSM_ATQLEN_PAGE_ATQLEN_S 0 +#define PF0_MBX_PSM_ATQLEN_PAGE_ATQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_PSM_ATQLEN_PAGE_ATQVFE_S 28 +#define PF0_MBX_PSM_ATQLEN_PAGE_ATQVFE_M BIT(28) +#define PF0_MBX_PSM_ATQLEN_PAGE_ATQOVFL_S 29 +#define PF0_MBX_PSM_ATQLEN_PAGE_ATQOVFL_M BIT(29) +#define PF0_MBX_PSM_ATQLEN_PAGE_ATQCRIT_S 30 +#define PF0_MBX_PSM_ATQLEN_PAGE_ATQCRIT_M BIT(30) +#define PF0_MBX_PSM_ATQLEN_PAGE_ATQENABLE_S 31 +#define PF0_MBX_PSM_ATQLEN_PAGE_ATQENABLE_M BIT(31) +#define PF0_MBX_PSM_ATQT_PAGE 0x02D40410 /* Reset Source: CORER */ +#define PF0_MBX_PSM_ATQT_PAGE_ATQT_S 0 +#define PF0_MBX_PSM_ATQT_PAGE_ATQT_M MAKEMASK(0x3FF, 0) +#define PF0_SB_CPM_ARQBAH_PAGE 0x02D801A0 /* Reset Source: CORER */ +#define PF0_SB_CPM_ARQBAH_PAGE_ARQBAH_S 0 +#define PF0_SB_CPM_ARQBAH_PAGE_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_SB_CPM_ARQBAL_PAGE 0x02D800A0 /* Reset Source: CORER */ +#define PF0_SB_CPM_ARQBAL_PAGE_ARQBAL_LSB_S 0 +#define PF0_SB_CPM_ARQBAL_PAGE_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF0_SB_CPM_ARQBAL_PAGE_ARQBAL_S 6 +#define PF0_SB_CPM_ARQBAL_PAGE_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_SB_CPM_ARQH_PAGE 0x02D803A0 /* Reset Source: CORER */ +#define PF0_SB_CPM_ARQH_PAGE_ARQH_S 0 +#define PF0_SB_CPM_ARQH_PAGE_ARQH_M MAKEMASK(0x3FF, 0) +#define PF0_SB_CPM_ARQLEN_PAGE 0x02D802A0 /* Reset Source: PFR */ +#define PF0_SB_CPM_ARQLEN_PAGE_ARQLEN_S 0 +#define PF0_SB_CPM_ARQLEN_PAGE_ARQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_SB_CPM_ARQLEN_PAGE_ARQVFE_S 28 +#define PF0_SB_CPM_ARQLEN_PAGE_ARQVFE_M BIT(28) +#define PF0_SB_CPM_ARQLEN_PAGE_ARQOVFL_S 29 +#define PF0_SB_CPM_ARQLEN_PAGE_ARQOVFL_M BIT(29) +#define PF0_SB_CPM_ARQLEN_PAGE_ARQCRIT_S 30 +#define PF0_SB_CPM_ARQLEN_PAGE_ARQCRIT_M BIT(30) +#define PF0_SB_CPM_ARQLEN_PAGE_ARQENABLE_S 31 +#define PF0_SB_CPM_ARQLEN_PAGE_ARQENABLE_M BIT(31) +#define PF0_SB_CPM_ARQT_PAGE 0x02D804A0 /* Reset Source: CORER */ +#define PF0_SB_CPM_ARQT_PAGE_ARQT_S 0 +#define PF0_SB_CPM_ARQT_PAGE_ARQT_M MAKEMASK(0x3FF, 0) +#define PF0_SB_CPM_ATQBAH_PAGE 0x02D80120 /* Reset Source: CORER */ +#define PF0_SB_CPM_ATQBAH_PAGE_ATQBAH_S 0 +#define PF0_SB_CPM_ATQBAH_PAGE_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_SB_CPM_ATQBAL_PAGE 0x02D80020 /* Reset Source: CORER */ +#define PF0_SB_CPM_ATQBAL_PAGE_ATQBAL_S 6 +#define PF0_SB_CPM_ATQBAL_PAGE_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_SB_CPM_ATQH_PAGE 0x02D80320 /* Reset Source: CORER */ +#define PF0_SB_CPM_ATQH_PAGE_ATQH_S 0 +#define PF0_SB_CPM_ATQH_PAGE_ATQH_M MAKEMASK(0x3FF, 0) +#define PF0_SB_CPM_ATQLEN_PAGE 0x02D80220 /* Reset Source: PFR */ +#define PF0_SB_CPM_ATQLEN_PAGE_ATQLEN_S 0 +#define PF0_SB_CPM_ATQLEN_PAGE_ATQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_SB_CPM_ATQLEN_PAGE_ATQVFE_S 28 +#define PF0_SB_CPM_ATQLEN_PAGE_ATQVFE_M BIT(28) +#define PF0_SB_CPM_ATQLEN_PAGE_ATQOVFL_S 29 +#define PF0_SB_CPM_ATQLEN_PAGE_ATQOVFL_M BIT(29) +#define PF0_SB_CPM_ATQLEN_PAGE_ATQCRIT_S 30 +#define PF0_SB_CPM_ATQLEN_PAGE_ATQCRIT_M BIT(30) +#define PF0_SB_CPM_ATQLEN_PAGE_ATQENABLE_S 31 +#define PF0_SB_CPM_ATQLEN_PAGE_ATQENABLE_M BIT(31) +#define PF0_SB_CPM_ATQT_PAGE 0x02D80420 /* Reset Source: CORER */ +#define PF0_SB_CPM_ATQT_PAGE_ATQT_S 0 +#define PF0_SB_CPM_ATQT_PAGE_ATQT_M MAKEMASK(0x3FF, 0) +#define PF0_SB_HLP_ARQBAH_PAGE 0x02D001A0 /* Reset Source: CORER */ +#define PF0_SB_HLP_ARQBAH_PAGE_ARQBAH_S 0 +#define PF0_SB_HLP_ARQBAH_PAGE_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_SB_HLP_ARQBAL_PAGE 0x02D000A0 /* Reset Source: CORER */ +#define PF0_SB_HLP_ARQBAL_PAGE_ARQBAL_LSB_S 0 +#define PF0_SB_HLP_ARQBAL_PAGE_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF0_SB_HLP_ARQBAL_PAGE_ARQBAL_S 6 +#define PF0_SB_HLP_ARQBAL_PAGE_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_SB_HLP_ARQH_PAGE 0x02D003A0 /* Reset Source: CORER */ +#define PF0_SB_HLP_ARQH_PAGE_ARQH_S 0 +#define PF0_SB_HLP_ARQH_PAGE_ARQH_M MAKEMASK(0x3FF, 0) +#define PF0_SB_HLP_ARQLEN_PAGE 0x02D002A0 /* Reset Source: PFR */ +#define PF0_SB_HLP_ARQLEN_PAGE_ARQLEN_S 0 +#define PF0_SB_HLP_ARQLEN_PAGE_ARQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_SB_HLP_ARQLEN_PAGE_ARQVFE_S 28 +#define PF0_SB_HLP_ARQLEN_PAGE_ARQVFE_M BIT(28) +#define PF0_SB_HLP_ARQLEN_PAGE_ARQOVFL_S 29 +#define PF0_SB_HLP_ARQLEN_PAGE_ARQOVFL_M BIT(29) +#define PF0_SB_HLP_ARQLEN_PAGE_ARQCRIT_S 30 +#define PF0_SB_HLP_ARQLEN_PAGE_ARQCRIT_M BIT(30) +#define PF0_SB_HLP_ARQLEN_PAGE_ARQENABLE_S 31 +#define PF0_SB_HLP_ARQLEN_PAGE_ARQENABLE_M BIT(31) +#define PF0_SB_HLP_ARQT_PAGE 0x02D004A0 /* Reset Source: CORER */ +#define PF0_SB_HLP_ARQT_PAGE_ARQT_S 0 +#define PF0_SB_HLP_ARQT_PAGE_ARQT_M MAKEMASK(0x3FF, 0) +#define PF0_SB_HLP_ATQBAH_PAGE 0x02D00120 /* Reset Source: CORER */ +#define PF0_SB_HLP_ATQBAH_PAGE_ATQBAH_S 0 +#define PF0_SB_HLP_ATQBAH_PAGE_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_SB_HLP_ATQBAL_PAGE 0x02D00020 /* Reset Source: CORER */ +#define PF0_SB_HLP_ATQBAL_PAGE_ATQBAL_S 6 +#define PF0_SB_HLP_ATQBAL_PAGE_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_SB_HLP_ATQH_PAGE 0x02D00320 /* Reset Source: CORER */ +#define PF0_SB_HLP_ATQH_PAGE_ATQH_S 0 +#define PF0_SB_HLP_ATQH_PAGE_ATQH_M MAKEMASK(0x3FF, 0) +#define PF0_SB_HLP_ATQLEN_PAGE 0x02D00220 /* Reset Source: PFR */ +#define PF0_SB_HLP_ATQLEN_PAGE_ATQLEN_S 0 +#define PF0_SB_HLP_ATQLEN_PAGE_ATQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_SB_HLP_ATQLEN_PAGE_ATQVFE_S 28 +#define PF0_SB_HLP_ATQLEN_PAGE_ATQVFE_M BIT(28) +#define PF0_SB_HLP_ATQLEN_PAGE_ATQOVFL_S 29 +#define PF0_SB_HLP_ATQLEN_PAGE_ATQOVFL_M BIT(29) +#define PF0_SB_HLP_ATQLEN_PAGE_ATQCRIT_S 30 +#define PF0_SB_HLP_ATQLEN_PAGE_ATQCRIT_M BIT(30) +#define PF0_SB_HLP_ATQLEN_PAGE_ATQENABLE_S 31 +#define PF0_SB_HLP_ATQLEN_PAGE_ATQENABLE_M BIT(31) +#define PF0_SB_HLP_ATQT_PAGE 0x02D00420 /* Reset Source: CORER */ +#define PF0_SB_HLP_ATQT_PAGE_ATQT_S 0 +#define PF0_SB_HLP_ATQT_PAGE_ATQT_M MAKEMASK(0x3FF, 0) +#define PF0INT_DYN_CTL(_i) (0x03000000 + ((_i) * 4096)) /* _i=0...2047 */ /* Reset Source: CORER */ +#define PF0INT_DYN_CTL_MAX_INDEX 2047 +#define PF0INT_DYN_CTL_INTENA_S 0 +#define PF0INT_DYN_CTL_INTENA_M BIT(0) +#define PF0INT_DYN_CTL_CLEARPBA_S 1 +#define PF0INT_DYN_CTL_CLEARPBA_M BIT(1) +#define PF0INT_DYN_CTL_SWINT_TRIG_S 2 +#define PF0INT_DYN_CTL_SWINT_TRIG_M BIT(2) +#define PF0INT_DYN_CTL_ITR_INDX_S 3 +#define PF0INT_DYN_CTL_ITR_INDX_M MAKEMASK(0x3, 3) +#define PF0INT_DYN_CTL_INTERVAL_S 5 +#define PF0INT_DYN_CTL_INTERVAL_M MAKEMASK(0xFFF, 5) +#define PF0INT_DYN_CTL_SW_ITR_INDX_ENA_S 24 +#define PF0INT_DYN_CTL_SW_ITR_INDX_ENA_M BIT(24) +#define PF0INT_DYN_CTL_SW_ITR_INDX_S 25 +#define PF0INT_DYN_CTL_SW_ITR_INDX_M MAKEMASK(0x3, 25) +#define PF0INT_DYN_CTL_WB_ON_ITR_S 30 +#define PF0INT_DYN_CTL_WB_ON_ITR_M BIT(30) +#define PF0INT_DYN_CTL_INTENA_MSK_S 31 +#define PF0INT_DYN_CTL_INTENA_MSK_M BIT(31) +#define PF0INT_ITR_0(_i) (0x03000004 + ((_i) * 4096)) /* _i=0...2047 */ /* Reset Source: CORER */ +#define PF0INT_ITR_0_MAX_INDEX 2047 +#define PF0INT_ITR_0_INTERVAL_S 0 +#define PF0INT_ITR_0_INTERVAL_M MAKEMASK(0xFFF, 0) +#define PF0INT_ITR_1(_i) (0x03000008 + ((_i) * 4096)) /* _i=0...2047 */ /* Reset Source: CORER */ +#define PF0INT_ITR_1_MAX_INDEX 2047 +#define PF0INT_ITR_1_INTERVAL_S 0 +#define PF0INT_ITR_1_INTERVAL_M MAKEMASK(0xFFF, 0) +#define PF0INT_ITR_2(_i) (0x0300000C + ((_i) * 4096)) /* _i=0...2047 */ /* Reset Source: CORER */ +#define PF0INT_ITR_2_MAX_INDEX 2047 +#define PF0INT_ITR_2_INTERVAL_S 0 +#define PF0INT_ITR_2_INTERVAL_M MAKEMASK(0xFFF, 0) +#define PF0INT_OICR_CPM_PAGE 0x02D03000 /* Reset Source: CORER */ +#define PF0INT_OICR_CPM_PAGE_INTEVENT_S 0 +#define PF0INT_OICR_CPM_PAGE_INTEVENT_M BIT(0) +#define PF0INT_OICR_CPM_PAGE_QUEUE_S 1 +#define PF0INT_OICR_CPM_PAGE_QUEUE_M BIT(1) +#define PF0INT_OICR_CPM_PAGE_RSV1_S 2 +#define PF0INT_OICR_CPM_PAGE_RSV1_M MAKEMASK(0xFF, 2) +#define PF0INT_OICR_CPM_PAGE_HH_COMP_S 10 +#define PF0INT_OICR_CPM_PAGE_HH_COMP_M BIT(10) +#define PF0INT_OICR_CPM_PAGE_TSYN_TX_S 11 +#define PF0INT_OICR_CPM_PAGE_TSYN_TX_M BIT(11) +#define PF0INT_OICR_CPM_PAGE_TSYN_EVNT_S 12 +#define PF0INT_OICR_CPM_PAGE_TSYN_EVNT_M BIT(12) +#define PF0INT_OICR_CPM_PAGE_TSYN_TGT_S 13 +#define PF0INT_OICR_CPM_PAGE_TSYN_TGT_M BIT(13) +#define PF0INT_OICR_CPM_PAGE_HLP_RDY_S 14 +#define PF0INT_OICR_CPM_PAGE_HLP_RDY_M BIT(14) +#define PF0INT_OICR_CPM_PAGE_CPM_RDY_S 15 +#define PF0INT_OICR_CPM_PAGE_CPM_RDY_M BIT(15) +#define PF0INT_OICR_CPM_PAGE_ECC_ERR_S 16 +#define PF0INT_OICR_CPM_PAGE_ECC_ERR_M BIT(16) +#define PF0INT_OICR_CPM_PAGE_RSV2_S 17 +#define PF0INT_OICR_CPM_PAGE_RSV2_M MAKEMASK(0x3, 17) +#define PF0INT_OICR_CPM_PAGE_MAL_DETECT_S 19 +#define PF0INT_OICR_CPM_PAGE_MAL_DETECT_M BIT(19) +#define PF0INT_OICR_CPM_PAGE_GRST_S 20 +#define PF0INT_OICR_CPM_PAGE_GRST_M BIT(20) +#define PF0INT_OICR_CPM_PAGE_PCI_EXCEPTION_S 21 +#define PF0INT_OICR_CPM_PAGE_PCI_EXCEPTION_M BIT(21) +#define PF0INT_OICR_CPM_PAGE_GPIO_S 22 +#define PF0INT_OICR_CPM_PAGE_GPIO_M BIT(22) +#define PF0INT_OICR_CPM_PAGE_RSV3_S 23 +#define PF0INT_OICR_CPM_PAGE_RSV3_M BIT(23) +#define PF0INT_OICR_CPM_PAGE_STORM_DETECT_S 24 +#define PF0INT_OICR_CPM_PAGE_STORM_DETECT_M BIT(24) +#define PF0INT_OICR_CPM_PAGE_LINK_STAT_CHANGE_S 25 +#define PF0INT_OICR_CPM_PAGE_LINK_STAT_CHANGE_M BIT(25) +#define PF0INT_OICR_CPM_PAGE_HMC_ERR_S 26 +#define PF0INT_OICR_CPM_PAGE_HMC_ERR_M BIT(26) +#define PF0INT_OICR_CPM_PAGE_PE_PUSH_S 27 +#define PF0INT_OICR_CPM_PAGE_PE_PUSH_M BIT(27) +#define PF0INT_OICR_CPM_PAGE_PE_CRITERR_S 28 +#define PF0INT_OICR_CPM_PAGE_PE_CRITERR_M BIT(28) +#define PF0INT_OICR_CPM_PAGE_VFLR_S 29 +#define PF0INT_OICR_CPM_PAGE_VFLR_M BIT(29) +#define PF0INT_OICR_CPM_PAGE_XLR_HW_DONE_S 30 +#define PF0INT_OICR_CPM_PAGE_XLR_HW_DONE_M BIT(30) +#define PF0INT_OICR_CPM_PAGE_SWINT_S 31 +#define PF0INT_OICR_CPM_PAGE_SWINT_M BIT(31) +#define PF0INT_OICR_ENA_CPM_PAGE 0x02D03100 /* Reset Source: CORER */ +#define PF0INT_OICR_ENA_CPM_PAGE_RSV0_S 0 +#define PF0INT_OICR_ENA_CPM_PAGE_RSV0_M BIT(0) +#define PF0INT_OICR_ENA_CPM_PAGE_INT_ENA_S 1 +#define PF0INT_OICR_ENA_CPM_PAGE_INT_ENA_M MAKEMASK(0x7FFFFFFF, 1) +#define PF0INT_OICR_ENA_HLP_PAGE 0x02D01100 /* Reset Source: CORER */ +#define PF0INT_OICR_ENA_HLP_PAGE_RSV0_S 0 +#define PF0INT_OICR_ENA_HLP_PAGE_RSV0_M BIT(0) +#define PF0INT_OICR_ENA_HLP_PAGE_INT_ENA_S 1 +#define PF0INT_OICR_ENA_HLP_PAGE_INT_ENA_M MAKEMASK(0x7FFFFFFF, 1) +#define PF0INT_OICR_ENA_PSM_PAGE 0x02D02100 /* Reset Source: CORER */ +#define PF0INT_OICR_ENA_PSM_PAGE_RSV0_S 0 +#define PF0INT_OICR_ENA_PSM_PAGE_RSV0_M BIT(0) +#define PF0INT_OICR_ENA_PSM_PAGE_INT_ENA_S 1 +#define PF0INT_OICR_ENA_PSM_PAGE_INT_ENA_M MAKEMASK(0x7FFFFFFF, 1) +#define PF0INT_OICR_HLP_PAGE 0x02D01000 /* Reset Source: CORER */ +#define PF0INT_OICR_HLP_PAGE_INTEVENT_S 0 +#define PF0INT_OICR_HLP_PAGE_INTEVENT_M BIT(0) +#define PF0INT_OICR_HLP_PAGE_QUEUE_S 1 +#define PF0INT_OICR_HLP_PAGE_QUEUE_M BIT(1) +#define PF0INT_OICR_HLP_PAGE_RSV1_S 2 +#define PF0INT_OICR_HLP_PAGE_RSV1_M MAKEMASK(0xFF, 2) +#define PF0INT_OICR_HLP_PAGE_HH_COMP_S 10 +#define PF0INT_OICR_HLP_PAGE_HH_COMP_M BIT(10) +#define PF0INT_OICR_HLP_PAGE_TSYN_TX_S 11 +#define PF0INT_OICR_HLP_PAGE_TSYN_TX_M BIT(11) +#define PF0INT_OICR_HLP_PAGE_TSYN_EVNT_S 12 +#define PF0INT_OICR_HLP_PAGE_TSYN_EVNT_M BIT(12) +#define PF0INT_OICR_HLP_PAGE_TSYN_TGT_S 13 +#define PF0INT_OICR_HLP_PAGE_TSYN_TGT_M BIT(13) +#define PF0INT_OICR_HLP_PAGE_HLP_RDY_S 14 +#define PF0INT_OICR_HLP_PAGE_HLP_RDY_M BIT(14) +#define PF0INT_OICR_HLP_PAGE_CPM_RDY_S 15 +#define PF0INT_OICR_HLP_PAGE_CPM_RDY_M BIT(15) +#define PF0INT_OICR_HLP_PAGE_ECC_ERR_S 16 +#define PF0INT_OICR_HLP_PAGE_ECC_ERR_M BIT(16) +#define PF0INT_OICR_HLP_PAGE_RSV2_S 17 +#define PF0INT_OICR_HLP_PAGE_RSV2_M MAKEMASK(0x3, 17) +#define PF0INT_OICR_HLP_PAGE_MAL_DETECT_S 19 +#define PF0INT_OICR_HLP_PAGE_MAL_DETECT_M BIT(19) +#define PF0INT_OICR_HLP_PAGE_GRST_S 20 +#define PF0INT_OICR_HLP_PAGE_GRST_M BIT(20) +#define PF0INT_OICR_HLP_PAGE_PCI_EXCEPTION_S 21 +#define PF0INT_OICR_HLP_PAGE_PCI_EXCEPTION_M BIT(21) +#define PF0INT_OICR_HLP_PAGE_GPIO_S 22 +#define PF0INT_OICR_HLP_PAGE_GPIO_M BIT(22) +#define PF0INT_OICR_HLP_PAGE_RSV3_S 23 +#define PF0INT_OICR_HLP_PAGE_RSV3_M BIT(23) +#define PF0INT_OICR_HLP_PAGE_STORM_DETECT_S 24 +#define PF0INT_OICR_HLP_PAGE_STORM_DETECT_M BIT(24) +#define PF0INT_OICR_HLP_PAGE_LINK_STAT_CHANGE_S 25 +#define PF0INT_OICR_HLP_PAGE_LINK_STAT_CHANGE_M BIT(25) +#define PF0INT_OICR_HLP_PAGE_HMC_ERR_S 26 +#define PF0INT_OICR_HLP_PAGE_HMC_ERR_M BIT(26) +#define PF0INT_OICR_HLP_PAGE_PE_PUSH_S 27 +#define PF0INT_OICR_HLP_PAGE_PE_PUSH_M BIT(27) +#define PF0INT_OICR_HLP_PAGE_PE_CRITERR_S 28 +#define PF0INT_OICR_HLP_PAGE_PE_CRITERR_M BIT(28) +#define PF0INT_OICR_HLP_PAGE_VFLR_S 29 +#define PF0INT_OICR_HLP_PAGE_VFLR_M BIT(29) +#define PF0INT_OICR_HLP_PAGE_XLR_HW_DONE_S 30 +#define PF0INT_OICR_HLP_PAGE_XLR_HW_DONE_M BIT(30) +#define PF0INT_OICR_HLP_PAGE_SWINT_S 31 +#define PF0INT_OICR_HLP_PAGE_SWINT_M BIT(31) +#define PF0INT_OICR_PSM_PAGE 0x02D02000 /* Reset Source: CORER */ +#define PF0INT_OICR_PSM_PAGE_INTEVENT_S 0 +#define PF0INT_OICR_PSM_PAGE_INTEVENT_M BIT(0) +#define PF0INT_OICR_PSM_PAGE_QUEUE_S 1 +#define PF0INT_OICR_PSM_PAGE_QUEUE_M BIT(1) +#define PF0INT_OICR_PSM_PAGE_RSV1_S 2 +#define PF0INT_OICR_PSM_PAGE_RSV1_M MAKEMASK(0xFF, 2) +#define PF0INT_OICR_PSM_PAGE_HH_COMP_S 10 +#define PF0INT_OICR_PSM_PAGE_HH_COMP_M BIT(10) +#define PF0INT_OICR_PSM_PAGE_TSYN_TX_S 11 +#define PF0INT_OICR_PSM_PAGE_TSYN_TX_M BIT(11) +#define PF0INT_OICR_PSM_PAGE_TSYN_EVNT_S 12 +#define PF0INT_OICR_PSM_PAGE_TSYN_EVNT_M BIT(12) +#define PF0INT_OICR_PSM_PAGE_TSYN_TGT_S 13 +#define PF0INT_OICR_PSM_PAGE_TSYN_TGT_M BIT(13) +#define PF0INT_OICR_PSM_PAGE_HLP_RDY_S 14 +#define PF0INT_OICR_PSM_PAGE_HLP_RDY_M BIT(14) +#define PF0INT_OICR_PSM_PAGE_CPM_RDY_S 15 +#define PF0INT_OICR_PSM_PAGE_CPM_RDY_M BIT(15) +#define PF0INT_OICR_PSM_PAGE_ECC_ERR_S 16 +#define PF0INT_OICR_PSM_PAGE_ECC_ERR_M BIT(16) +#define PF0INT_OICR_PSM_PAGE_RSV2_S 17 +#define PF0INT_OICR_PSM_PAGE_RSV2_M MAKEMASK(0x3, 17) +#define PF0INT_OICR_PSM_PAGE_MAL_DETECT_S 19 +#define PF0INT_OICR_PSM_PAGE_MAL_DETECT_M BIT(19) +#define PF0INT_OICR_PSM_PAGE_GRST_S 20 +#define PF0INT_OICR_PSM_PAGE_GRST_M BIT(20) +#define PF0INT_OICR_PSM_PAGE_PCI_EXCEPTION_S 21 +#define PF0INT_OICR_PSM_PAGE_PCI_EXCEPTION_M BIT(21) +#define PF0INT_OICR_PSM_PAGE_GPIO_S 22 +#define PF0INT_OICR_PSM_PAGE_GPIO_M BIT(22) +#define PF0INT_OICR_PSM_PAGE_RSV3_S 23 +#define PF0INT_OICR_PSM_PAGE_RSV3_M BIT(23) +#define PF0INT_OICR_PSM_PAGE_STORM_DETECT_S 24 +#define PF0INT_OICR_PSM_PAGE_STORM_DETECT_M BIT(24) +#define PF0INT_OICR_PSM_PAGE_LINK_STAT_CHANGE_S 25 +#define PF0INT_OICR_PSM_PAGE_LINK_STAT_CHANGE_M BIT(25) +#define PF0INT_OICR_PSM_PAGE_HMC_ERR_S 26 +#define PF0INT_OICR_PSM_PAGE_HMC_ERR_M BIT(26) +#define PF0INT_OICR_PSM_PAGE_PE_PUSH_S 27 +#define PF0INT_OICR_PSM_PAGE_PE_PUSH_M BIT(27) +#define PF0INT_OICR_PSM_PAGE_PE_CRITERR_S 28 +#define PF0INT_OICR_PSM_PAGE_PE_CRITERR_M BIT(28) +#define PF0INT_OICR_PSM_PAGE_VFLR_S 29 +#define PF0INT_OICR_PSM_PAGE_VFLR_M BIT(29) +#define PF0INT_OICR_PSM_PAGE_XLR_HW_DONE_S 30 +#define PF0INT_OICR_PSM_PAGE_XLR_HW_DONE_M BIT(30) +#define PF0INT_OICR_PSM_PAGE_SWINT_S 31 +#define PF0INT_OICR_PSM_PAGE_SWINT_M BIT(31) +#define QRX_TAIL_PAGE(_QRX) (0x03800000 + ((_QRX) * 4096)) /* _i=0...2047 */ /* Reset Source: CORER */ +#define QRX_TAIL_PAGE_MAX_INDEX 2047 +#define QRX_TAIL_PAGE_TAIL_S 0 +#define QRX_TAIL_PAGE_TAIL_M MAKEMASK(0x1FFF, 0) +#define QTX_COMM_DBELL_PAGE(_DBQM) (0x04000000 + ((_DBQM) * 4096)) /* _i=0...16383 */ /* Reset Source: CORER */ +#define QTX_COMM_DBELL_PAGE_MAX_INDEX 16383 +#define QTX_COMM_DBELL_PAGE_QTX_COMM_DBELL_S 0 +#define QTX_COMM_DBELL_PAGE_QTX_COMM_DBELL_M MAKEMASK(0xFFFFFFFF, 0) +#define QTX_COMM_DBLQ_DBELL_PAGE(_DBLQ) (0x02F00000 + ((_DBLQ) * 4096)) /* _i=0...255 */ /* Reset Source: CORER */ +#define QTX_COMM_DBLQ_DBELL_PAGE_MAX_INDEX 255 +#define QTX_COMM_DBLQ_DBELL_PAGE_TAIL_S 0 +#define QTX_COMM_DBLQ_DBELL_PAGE_TAIL_M MAKEMASK(0x1FFF, 0) +#define VSI_MBX_ARQBAH(_VSI) (0x02000018 + ((_VSI) * 4096)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_MBX_ARQBAH_MAX_INDEX 767 +#define VSI_MBX_ARQBAH_ARQBAH_S 0 +#define VSI_MBX_ARQBAH_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VSI_MBX_ARQBAL(_VSI) (0x02000014 + ((_VSI) * 4096)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_MBX_ARQBAL_MAX_INDEX 767 +#define VSI_MBX_ARQBAL_ARQBAL_LSB_S 0 +#define VSI_MBX_ARQBAL_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define VSI_MBX_ARQBAL_ARQBAL_S 6 +#define VSI_MBX_ARQBAL_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VSI_MBX_ARQH(_VSI) (0x02000020 + ((_VSI) * 4096)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_MBX_ARQH_MAX_INDEX 767 +#define VSI_MBX_ARQH_ARQH_S 0 +#define VSI_MBX_ARQH_ARQH_M MAKEMASK(0x3FF, 0) +#define VSI_MBX_ARQLEN(_VSI) (0x0200001C + ((_VSI) * 4096)) /* _i=0...767 */ /* Reset Source: PFR */ +#define VSI_MBX_ARQLEN_MAX_INDEX 767 +#define VSI_MBX_ARQLEN_ARQLEN_S 0 +#define VSI_MBX_ARQLEN_ARQLEN_M MAKEMASK(0x3FF, 0) +#define VSI_MBX_ARQLEN_ARQVFE_S 28 +#define VSI_MBX_ARQLEN_ARQVFE_M BIT(28) +#define VSI_MBX_ARQLEN_ARQOVFL_S 29 +#define VSI_MBX_ARQLEN_ARQOVFL_M BIT(29) +#define VSI_MBX_ARQLEN_ARQCRIT_S 30 +#define VSI_MBX_ARQLEN_ARQCRIT_M BIT(30) +#define VSI_MBX_ARQLEN_ARQENABLE_S 31 +#define VSI_MBX_ARQLEN_ARQENABLE_M BIT(31) +#define VSI_MBX_ARQT(_VSI) (0x02000024 + ((_VSI) * 4096)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_MBX_ARQT_MAX_INDEX 767 +#define VSI_MBX_ARQT_ARQT_S 0 +#define VSI_MBX_ARQT_ARQT_M MAKEMASK(0x3FF, 0) +#define VSI_MBX_ATQBAH(_VSI) (0x02000004 + ((_VSI) * 4096)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_MBX_ATQBAH_MAX_INDEX 767 +#define VSI_MBX_ATQBAH_ATQBAH_S 0 +#define VSI_MBX_ATQBAH_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VSI_MBX_ATQBAL(_VSI) (0x02000000 + ((_VSI) * 4096)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_MBX_ATQBAL_MAX_INDEX 767 +#define VSI_MBX_ATQBAL_ATQBAL_S 6 +#define VSI_MBX_ATQBAL_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VSI_MBX_ATQH(_VSI) (0x0200000C + ((_VSI) * 4096)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_MBX_ATQH_MAX_INDEX 767 +#define VSI_MBX_ATQH_ATQH_S 0 +#define VSI_MBX_ATQH_ATQH_M MAKEMASK(0x3FF, 0) +#define VSI_MBX_ATQLEN(_VSI) (0x02000008 + ((_VSI) * 4096)) /* _i=0...767 */ /* Reset Source: PFR */ +#define VSI_MBX_ATQLEN_MAX_INDEX 767 +#define VSI_MBX_ATQLEN_ATQLEN_S 0 +#define VSI_MBX_ATQLEN_ATQLEN_M MAKEMASK(0x3FF, 0) +#define VSI_MBX_ATQLEN_ATQVFE_S 28 +#define VSI_MBX_ATQLEN_ATQVFE_M BIT(28) +#define VSI_MBX_ATQLEN_ATQOVFL_S 29 +#define VSI_MBX_ATQLEN_ATQOVFL_M BIT(29) +#define VSI_MBX_ATQLEN_ATQCRIT_S 30 +#define VSI_MBX_ATQLEN_ATQCRIT_M BIT(30) +#define VSI_MBX_ATQLEN_ATQENABLE_S 31 +#define VSI_MBX_ATQLEN_ATQENABLE_M BIT(31) +#define VSI_MBX_ATQT(_VSI) (0x02000010 + ((_VSI) * 4096)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_MBX_ATQT_MAX_INDEX 767 +#define VSI_MBX_ATQT_ATQT_S 0 +#define VSI_MBX_ATQT_ATQT_M MAKEMASK(0x3FF, 0) +#define GL_ACL_ACCESS_CMD 0x00391000 /* Reset Source: CORER */ +#define GL_ACL_ACCESS_CMD_TABLE_ID_S 0 +#define GL_ACL_ACCESS_CMD_TABLE_ID_M MAKEMASK(0xFF, 0) +#define GL_ACL_ACCESS_CMD_ENTRY_INDEX_S 8 +#define GL_ACL_ACCESS_CMD_ENTRY_INDEX_M MAKEMASK(0xFFF, 8) +#define GL_ACL_ACCESS_CMD_OPERATION_S 20 +#define GL_ACL_ACCESS_CMD_OPERATION_M BIT(20) +#define GL_ACL_ACCESS_CMD_OBJ_TYPE_S 24 +#define GL_ACL_ACCESS_CMD_OBJ_TYPE_M MAKEMASK(0xF, 24) +#define GL_ACL_ACCESS_CMD_EXECUTE_S 31 +#define GL_ACL_ACCESS_CMD_EXECUTE_M BIT(31) +#define GL_ACL_ACCESS_STATUS 0x00391004 /* Reset Source: CORER */ +#define GL_ACL_ACCESS_STATUS_BUSY_S 0 +#define GL_ACL_ACCESS_STATUS_BUSY_M BIT(0) +#define GL_ACL_ACCESS_STATUS_DONE_S 1 +#define GL_ACL_ACCESS_STATUS_DONE_M BIT(1) +#define GL_ACL_ACCESS_STATUS_ERROR_S 2 +#define GL_ACL_ACCESS_STATUS_ERROR_M BIT(2) +#define GL_ACL_ACCESS_STATUS_OPERATION_S 3 +#define GL_ACL_ACCESS_STATUS_OPERATION_M BIT(3) +#define GL_ACL_ACCESS_STATUS_ERROR_CODE_S 4 +#define GL_ACL_ACCESS_STATUS_ERROR_CODE_M MAKEMASK(0xF, 4) +#define GL_ACL_ACCESS_STATUS_TABLE_ID_S 8 +#define GL_ACL_ACCESS_STATUS_TABLE_ID_M MAKEMASK(0xFF, 8) +#define GL_ACL_ACCESS_STATUS_ENTRY_INDEX_S 16 +#define GL_ACL_ACCESS_STATUS_ENTRY_INDEX_M MAKEMASK(0xFFF, 16) +#define GL_ACL_ACCESS_STATUS_OBJ_TYPE_S 28 +#define GL_ACL_ACCESS_STATUS_OBJ_TYPE_M MAKEMASK(0xF, 28) +#define GL_ACL_ACTMEM_ACT(_i) (0x00393824 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GL_ACL_ACTMEM_ACT_MAX_INDEX 1 +#define GL_ACL_ACTMEM_ACT_VALUE_S 0 +#define GL_ACL_ACTMEM_ACT_VALUE_M MAKEMASK(0xFFFF, 0) +#define GL_ACL_ACTMEM_ACT_MDID_S 20 +#define GL_ACL_ACTMEM_ACT_MDID_M MAKEMASK(0x3F, 20) +#define GL_ACL_ACTMEM_ACT_PRIORITY_S 28 +#define GL_ACL_ACTMEM_ACT_PRIORITY_M MAKEMASK(0x7, 28) +#define GL_ACL_CHICKEN_REGISTER 0x00393810 /* Reset Source: CORER */ +#define GL_ACL_CHICKEN_REGISTER_TCAM_DATA_POL_CH_S 0 +#define GL_ACL_CHICKEN_REGISTER_TCAM_DATA_POL_CH_M BIT(0) +#define GL_ACL_CHICKEN_REGISTER_TCAM_ADDR_POL_CH_S 1 +#define GL_ACL_CHICKEN_REGISTER_TCAM_ADDR_POL_CH_M BIT(1) +#define GL_ACL_DEFAULT_ACT(_i) (0x00391168 + ((_i) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define GL_ACL_DEFAULT_ACT_MAX_INDEX 15 +#define GL_ACL_DEFAULT_ACT_VALUE_S 0 +#define GL_ACL_DEFAULT_ACT_VALUE_M MAKEMASK(0xFFFF, 0) +#define GL_ACL_DEFAULT_ACT_MDID_S 20 +#define GL_ACL_DEFAULT_ACT_MDID_M MAKEMASK(0x3F, 20) +#define GL_ACL_DEFAULT_ACT_PRIORITY_S 28 +#define GL_ACL_DEFAULT_ACT_PRIORITY_M MAKEMASK(0x7, 28) +#define GL_ACL_PROFILE_BWSB_SEL(_i) (0x00391008 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GL_ACL_PROFILE_BWSB_SEL_MAX_INDEX 31 +#define GL_ACL_PROFILE_BWSB_SEL_BSB_SRC_OFF_S 0 +#define GL_ACL_PROFILE_BWSB_SEL_BSB_SRC_OFF_M MAKEMASK(0x3F, 0) +#define GL_ACL_PROFILE_BWSB_SEL_WSB_SRC_OFF_S 8 +#define GL_ACL_PROFILE_BWSB_SEL_WSB_SRC_OFF_M MAKEMASK(0x1F, 8) +#define GL_ACL_PROFILE_DWSB_SEL(_i) (0x00391088 + ((_i) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define GL_ACL_PROFILE_DWSB_SEL_MAX_INDEX 15 +#define GL_ACL_PROFILE_DWSB_SEL_DWORD_SEL_OFF_S 0 +#define GL_ACL_PROFILE_DWSB_SEL_DWORD_SEL_OFF_M MAKEMASK(0xF, 0) +#define GL_ACL_PROFILE_PF_CFG(_i) (0x003910C8 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GL_ACL_PROFILE_PF_CFG_MAX_INDEX 7 +#define GL_ACL_PROFILE_PF_CFG_SCEN_SEL_S 0 +#define GL_ACL_PROFILE_PF_CFG_SCEN_SEL_M MAKEMASK(0x3F, 0) +#define GL_ACL_PROFILE_RC_CFG(_i) (0x003910E8 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GL_ACL_PROFILE_RC_CFG_MAX_INDEX 7 +#define GL_ACL_PROFILE_RC_CFG_LOW_BOUND_S 0 +#define GL_ACL_PROFILE_RC_CFG_LOW_BOUND_M MAKEMASK(0xFFFF, 0) +#define GL_ACL_PROFILE_RC_CFG_HIGH_BOUND_S 16 +#define GL_ACL_PROFILE_RC_CFG_HIGH_BOUND_M MAKEMASK(0xFFFF, 16) +#define GL_ACL_PROFILE_RCF_MASK(_i) (0x00391108 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GL_ACL_PROFILE_RCF_MASK_MAX_INDEX 7 +#define GL_ACL_PROFILE_RCF_MASK_MASK_S 0 +#define GL_ACL_PROFILE_RCF_MASK_MASK_M MAKEMASK(0xFFFF, 0) +#define GL_ACL_SCENARIO_ACT_CFG(_i) (0x003938AC + ((_i) * 4)) /* _i=0...19 */ /* Reset Source: CORER */ +#define GL_ACL_SCENARIO_ACT_CFG_MAX_INDEX 19 +#define GL_ACL_SCENARIO_ACT_CFG_ACTMEM_SEL_S 0 +#define GL_ACL_SCENARIO_ACT_CFG_ACTMEM_SEL_M MAKEMASK(0xF, 0) +#define GL_ACL_SCENARIO_ACT_CFG_ACTMEM_EN_S 8 +#define GL_ACL_SCENARIO_ACT_CFG_ACTMEM_EN_M BIT(8) +#define GL_ACL_SCENARIO_CFG_H(_i) (0x0039386C + ((_i) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define GL_ACL_SCENARIO_CFG_H_MAX_INDEX 15 +#define GL_ACL_SCENARIO_CFG_H_SELECT4_S 0 +#define GL_ACL_SCENARIO_CFG_H_SELECT4_M MAKEMASK(0x1F, 0) +#define GL_ACL_SCENARIO_CFG_H_CHUNKMASK_S 8 +#define GL_ACL_SCENARIO_CFG_H_CHUNKMASK_M MAKEMASK(0xFF, 8) +#define GL_ACL_SCENARIO_CFG_H_START_COMPARE_S 24 +#define GL_ACL_SCENARIO_CFG_H_START_COMPARE_M BIT(24) +#define GL_ACL_SCENARIO_CFG_H_START_SET_S 28 +#define GL_ACL_SCENARIO_CFG_H_START_SET_M BIT(28) +#define GL_ACL_SCENARIO_CFG_L(_i) (0x0039382C + ((_i) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define GL_ACL_SCENARIO_CFG_L_MAX_INDEX 15 +#define GL_ACL_SCENARIO_CFG_L_SELECT0_S 0 +#define GL_ACL_SCENARIO_CFG_L_SELECT0_M MAKEMASK(0x7F, 0) +#define GL_ACL_SCENARIO_CFG_L_SELECT1_S 8 +#define GL_ACL_SCENARIO_CFG_L_SELECT1_M MAKEMASK(0x7F, 8) +#define GL_ACL_SCENARIO_CFG_L_SELECT2_S 16 +#define GL_ACL_SCENARIO_CFG_L_SELECT2_M MAKEMASK(0x7F, 16) +#define GL_ACL_SCENARIO_CFG_L_SELECT3_S 24 +#define GL_ACL_SCENARIO_CFG_L_SELECT3_M MAKEMASK(0x7F, 24) +#define GL_ACL_TCAM_KEY_H 0x00393818 /* Reset Source: CORER */ +#define GL_ACL_TCAM_KEY_H_GL_ACL_FFU_TCAM_KEY_H_S 0 +#define GL_ACL_TCAM_KEY_H_GL_ACL_FFU_TCAM_KEY_H_M MAKEMASK(0xFF, 0) +#define GL_ACL_TCAM_KEY_INV_H 0x00393820 /* Reset Source: CORER */ +#define GL_ACL_TCAM_KEY_INV_H_GL_ACL_FFU_TCAM_KEY_INV_H_S 0 +#define GL_ACL_TCAM_KEY_INV_H_GL_ACL_FFU_TCAM_KEY_INV_H_M MAKEMASK(0xFF, 0) +#define GL_ACL_TCAM_KEY_INV_L 0x0039381C /* Reset Source: CORER */ +#define GL_ACL_TCAM_KEY_INV_L_GL_ACL_FFU_TCAM_KEY_INV_L_S 0 +#define GL_ACL_TCAM_KEY_INV_L_GL_ACL_FFU_TCAM_KEY_INV_L_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_ACL_TCAM_KEY_L 0x00393814 /* Reset Source: CORER */ +#define GL_ACL_TCAM_KEY_L_GL_ACL_FFU_TCAM_KEY_L_S 0 +#define GL_ACL_TCAM_KEY_L_GL_ACL_FFU_TCAM_KEY_L_M MAKEMASK(0xFFFFFFFF, 0) +#define VSI_ACL_DEF_SEL(_VSI) (0x00391800 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_ACL_DEF_SEL_MAX_INDEX 767 +#define VSI_ACL_DEF_SEL_RX_PROFILE_MISS_SEL_S 0 +#define VSI_ACL_DEF_SEL_RX_PROFILE_MISS_SEL_M MAKEMASK(0x3, 0) +#define VSI_ACL_DEF_SEL_RX_TABLES_MISS_SEL_S 4 +#define VSI_ACL_DEF_SEL_RX_TABLES_MISS_SEL_M MAKEMASK(0x3, 4) +#define VSI_ACL_DEF_SEL_TX_PROFILE_MISS_SEL_S 8 +#define VSI_ACL_DEF_SEL_TX_PROFILE_MISS_SEL_M MAKEMASK(0x3, 8) +#define VSI_ACL_DEF_SEL_TX_TABLES_MISS_SEL_S 12 +#define VSI_ACL_DEF_SEL_TX_TABLES_MISS_SEL_M MAKEMASK(0x3, 12) +#define GL_SWT_L2TAG0(_i) (0x000492A8 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GL_SWT_L2TAG0_MAX_INDEX 7 +#define GL_SWT_L2TAG0_DATA_S 0 +#define GL_SWT_L2TAG0_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_SWT_L2TAG1(_i) (0x000492C8 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GL_SWT_L2TAG1_MAX_INDEX 7 +#define GL_SWT_L2TAG1_DATA_S 0 +#define GL_SWT_L2TAG1_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_SWT_L2TAGCTRL(_i) (0x001D2660 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GL_SWT_L2TAGCTRL_MAX_INDEX 7 +#define GL_SWT_L2TAGCTRL_LENGTH_S 0 +#define GL_SWT_L2TAGCTRL_LENGTH_M MAKEMASK(0x7F, 0) +#define GL_SWT_L2TAGCTRL_HAS_UP_S 7 +#define GL_SWT_L2TAGCTRL_HAS_UP_M BIT(7) +#define GL_SWT_L2TAGCTRL_ISVLAN_S 9 +#define GL_SWT_L2TAGCTRL_ISVLAN_M BIT(9) +#define GL_SWT_L2TAGCTRL_INNERUP_S 10 +#define GL_SWT_L2TAGCTRL_INNERUP_M BIT(10) +#define GL_SWT_L2TAGCTRL_OUTERUP_S 11 +#define GL_SWT_L2TAGCTRL_OUTERUP_M BIT(11) +#define GL_SWT_L2TAGCTRL_LONG_S 12 +#define GL_SWT_L2TAGCTRL_LONG_M BIT(12) +#define GL_SWT_L2TAGCTRL_ISMPLS_S 13 +#define GL_SWT_L2TAGCTRL_ISMPLS_M BIT(13) +#define GL_SWT_L2TAGCTRL_ISNSH_S 14 +#define GL_SWT_L2TAGCTRL_ISNSH_M BIT(14) +#define GL_SWT_L2TAGCTRL_ETHERTYPE_S 16 +#define GL_SWT_L2TAGCTRL_ETHERTYPE_M MAKEMASK(0xFFFF, 16) +#define GL_SWT_L2TAGRXEB(_i) (0x00052000 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GL_SWT_L2TAGRXEB_MAX_INDEX 7 +#define GL_SWT_L2TAGRXEB_OFFSET_S 0 +#define GL_SWT_L2TAGRXEB_OFFSET_M MAKEMASK(0xFF, 0) +#define GL_SWT_L2TAGRXEB_LENGTH_S 8 +#define GL_SWT_L2TAGRXEB_LENGTH_M MAKEMASK(0x3, 8) +#define GL_SWT_L2TAGTXIB(_i) (0x000492E8 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GL_SWT_L2TAGTXIB_MAX_INDEX 7 +#define GL_SWT_L2TAGTXIB_OFFSET_S 0 +#define GL_SWT_L2TAGTXIB_OFFSET_M MAKEMASK(0xFF, 0) +#define GL_SWT_L2TAGTXIB_LENGTH_S 8 +#define GL_SWT_L2TAGTXIB_LENGTH_M MAKEMASK(0x3, 8) +#define GLCM_PE_CACHESIZE 0x005046B4 /* Reset Source: CORER */ +#define GLCM_PE_CACHESIZE_WORD_SIZE_S 0 +#define GLCM_PE_CACHESIZE_WORD_SIZE_M MAKEMASK(0xFFF, 0) +#define GLCM_PE_CACHESIZE_SETS_S 12 +#define GLCM_PE_CACHESIZE_SETS_M MAKEMASK(0xF, 12) +#define GLCM_PE_CACHESIZE_WAYS_S 16 +#define GLCM_PE_CACHESIZE_WAYS_M MAKEMASK(0x1FF, 16) +#define GLCOMM_CQ_CTL(_CQ) (0x000F0000 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLCOMM_CQ_CTL_MAX_INDEX 511 +#define GLCOMM_CQ_CTL_COMP_TYPE_S 0 +#define GLCOMM_CQ_CTL_COMP_TYPE_M MAKEMASK(0x7, 0) +#define GLCOMM_CQ_CTL_CMD_S 4 +#define GLCOMM_CQ_CTL_CMD_M MAKEMASK(0x7, 4) +#define GLCOMM_CQ_CTL_ID_S 16 +#define GLCOMM_CQ_CTL_ID_M MAKEMASK(0x3FFF, 16) +#define GLCOMM_MIN_MAX_PKT 0x000FC064 /* Reset Source: CORER */ +#define GLCOMM_MIN_MAX_PKT_MAHDL_S 0 +#define GLCOMM_MIN_MAX_PKT_MAHDL_M MAKEMASK(0x3FFF, 0) +#define GLCOMM_MIN_MAX_PKT_MIHDL_S 16 +#define GLCOMM_MIN_MAX_PKT_MIHDL_M MAKEMASK(0x3F, 16) +#define GLCOMM_MIN_MAX_PKT_LSO_COMS_MIHDL_S 22 +#define GLCOMM_MIN_MAX_PKT_LSO_COMS_MIHDL_M MAKEMASK(0x3FF, 22) +#define GLCOMM_PKT_SHAPER_PROF(_i) (0x002D2DA8 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLCOMM_PKT_SHAPER_PROF_MAX_INDEX 7 +#define GLCOMM_PKT_SHAPER_PROF_PKTCNT_S 0 +#define GLCOMM_PKT_SHAPER_PROF_PKTCNT_M MAKEMASK(0x3F, 0) +#define GLCOMM_QTX_CNTX_CTL 0x002D2DC8 /* Reset Source: CORER */ +#define GLCOMM_QTX_CNTX_CTL_QUEUE_ID_S 0 +#define GLCOMM_QTX_CNTX_CTL_QUEUE_ID_M MAKEMASK(0x3FFF, 0) +#define GLCOMM_QTX_CNTX_CTL_CMD_S 16 +#define GLCOMM_QTX_CNTX_CTL_CMD_M MAKEMASK(0x7, 16) +#define GLCOMM_QTX_CNTX_CTL_CMD_EXEC_S 19 +#define GLCOMM_QTX_CNTX_CTL_CMD_EXEC_M BIT(19) +#define GLCOMM_QTX_CNTX_DATA(_i) (0x002D2D40 + ((_i) * 4)) /* _i=0...9 */ /* Reset Source: CORER */ +#define GLCOMM_QTX_CNTX_DATA_MAX_INDEX 9 +#define GLCOMM_QTX_CNTX_DATA_DATA_S 0 +#define GLCOMM_QTX_CNTX_DATA_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GLCOMM_QTX_CNTX_STAT 0x002D2DCC /* Reset Source: CORER */ +#define GLCOMM_QTX_CNTX_STAT_CMD_IN_PROG_S 0 +#define GLCOMM_QTX_CNTX_STAT_CMD_IN_PROG_M BIT(0) +#define GLCOMM_QUANTA_PROF(_i) (0x002D2D68 + ((_i) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define GLCOMM_QUANTA_PROF_MAX_INDEX 15 +#define GLCOMM_QUANTA_PROF_QUANTA_SIZE_S 0 +#define GLCOMM_QUANTA_PROF_QUANTA_SIZE_M MAKEMASK(0x3FFF, 0) +#define GLCOMM_QUANTA_PROF_MAX_CMD_S 16 +#define GLCOMM_QUANTA_PROF_MAX_CMD_M MAKEMASK(0xFF, 16) +#define GLCOMM_QUANTA_PROF_MAX_DESC_S 24 +#define GLCOMM_QUANTA_PROF_MAX_DESC_M MAKEMASK(0x3F, 24) +#define GLLAN_TCLAN_CACHE_CTL 0x000FC0B8 /* Reset Source: CORER */ +#define GLLAN_TCLAN_CACHE_CTL_MIN_FETCH_THRESH_S 0 +#define GLLAN_TCLAN_CACHE_CTL_MIN_FETCH_THRESH_M MAKEMASK(0x3F, 0) +#define GLLAN_TCLAN_CACHE_CTL_FETCH_CL_ALIGN_S 6 +#define GLLAN_TCLAN_CACHE_CTL_FETCH_CL_ALIGN_M BIT(6) +#define GLLAN_TCLAN_CACHE_CTL_MIN_ALLOC_THRESH_S 7 +#define GLLAN_TCLAN_CACHE_CTL_MIN_ALLOC_THRESH_M MAKEMASK(0x7F, 7) +#define GLLAN_TCLAN_CACHE_CTL_CACHE_ENTRY_CNT_S 14 +#define GLLAN_TCLAN_CACHE_CTL_CACHE_ENTRY_CNT_M MAKEMASK(0xFF, 14) +#define GLLAN_TCLAN_CACHE_CTL_CACHE_DESC_LIM_S 22 +#define GLLAN_TCLAN_CACHE_CTL_CACHE_DESC_LIM_M MAKEMASK(0x3FF, 22) +#define GLTCLAN_CQ_CNTX0(_CQ) (0x000F0800 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX0_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX0_RING_ADDR_LSB_S 0 +#define GLTCLAN_CQ_CNTX0_RING_ADDR_LSB_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTCLAN_CQ_CNTX1(_CQ) (0x000F1000 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX1_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX1_RING_ADDR_MSB_S 0 +#define GLTCLAN_CQ_CNTX1_RING_ADDR_MSB_M MAKEMASK(0x1FFFFFF, 0) +#define GLTCLAN_CQ_CNTX10(_CQ) (0x000F5800 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX10_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX10_CQ_CACHLINE_S 0 +#define GLTCLAN_CQ_CNTX10_CQ_CACHLINE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTCLAN_CQ_CNTX11(_CQ) (0x000F6000 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX11_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX11_CQ_CACHLINE_S 0 +#define GLTCLAN_CQ_CNTX11_CQ_CACHLINE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTCLAN_CQ_CNTX12(_CQ) (0x000F6800 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX12_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX12_CQ_CACHLINE_S 0 +#define GLTCLAN_CQ_CNTX12_CQ_CACHLINE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTCLAN_CQ_CNTX13(_CQ) (0x000F7000 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX13_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX13_CQ_CACHLINE_S 0 +#define GLTCLAN_CQ_CNTX13_CQ_CACHLINE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTCLAN_CQ_CNTX14(_CQ) (0x000F7800 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX14_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX14_CQ_CACHLINE_S 0 +#define GLTCLAN_CQ_CNTX14_CQ_CACHLINE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTCLAN_CQ_CNTX15(_CQ) (0x000F8000 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX15_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX15_CQ_CACHLINE_S 0 +#define GLTCLAN_CQ_CNTX15_CQ_CACHLINE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTCLAN_CQ_CNTX16(_CQ) (0x000F8800 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX16_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX16_CQ_CACHLINE_S 0 +#define GLTCLAN_CQ_CNTX16_CQ_CACHLINE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTCLAN_CQ_CNTX17(_CQ) (0x000F9000 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX17_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX17_CQ_CACHLINE_S 0 +#define GLTCLAN_CQ_CNTX17_CQ_CACHLINE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTCLAN_CQ_CNTX18(_CQ) (0x000F9800 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX18_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX18_CQ_CACHLINE_S 0 +#define GLTCLAN_CQ_CNTX18_CQ_CACHLINE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTCLAN_CQ_CNTX19(_CQ) (0x000FA000 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX19_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX19_CQ_CACHLINE_S 0 +#define GLTCLAN_CQ_CNTX19_CQ_CACHLINE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTCLAN_CQ_CNTX2(_CQ) (0x000F1800 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX2_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX2_RING_LEN_S 0 +#define GLTCLAN_CQ_CNTX2_RING_LEN_M MAKEMASK(0x3FFFF, 0) +#define GLTCLAN_CQ_CNTX20(_CQ) (0x000FA800 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX20_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX20_CQ_CACHLINE_S 0 +#define GLTCLAN_CQ_CNTX20_CQ_CACHLINE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTCLAN_CQ_CNTX21(_CQ) (0x000FB000 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX21_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX21_CQ_CACHLINE_S 0 +#define GLTCLAN_CQ_CNTX21_CQ_CACHLINE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTCLAN_CQ_CNTX3(_CQ) (0x000F2000 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX3_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX3_GENERATION_S 0 +#define GLTCLAN_CQ_CNTX3_GENERATION_M BIT(0) +#define GLTCLAN_CQ_CNTX3_CQ_WR_PTR_S 1 +#define GLTCLAN_CQ_CNTX3_CQ_WR_PTR_M MAKEMASK(0x3FFFFF, 1) +#define GLTCLAN_CQ_CNTX4(_CQ) (0x000F2800 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX4_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX4_PF_NUM_S 0 +#define GLTCLAN_CQ_CNTX4_PF_NUM_M MAKEMASK(0x7, 0) +#define GLTCLAN_CQ_CNTX4_VMVF_NUM_S 3 +#define GLTCLAN_CQ_CNTX4_VMVF_NUM_M MAKEMASK(0x3FF, 3) +#define GLTCLAN_CQ_CNTX4_VMVF_TYPE_S 13 +#define GLTCLAN_CQ_CNTX4_VMVF_TYPE_M MAKEMASK(0x3, 13) +#define GLTCLAN_CQ_CNTX5(_CQ) (0x000F3000 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX5_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX5_TPH_EN_S 0 +#define GLTCLAN_CQ_CNTX5_TPH_EN_M BIT(0) +#define GLTCLAN_CQ_CNTX5_CPU_ID_S 1 +#define GLTCLAN_CQ_CNTX5_CPU_ID_M MAKEMASK(0xFF, 1) +#define GLTCLAN_CQ_CNTX5_FLUSH_ON_ITR_DIS_S 9 +#define GLTCLAN_CQ_CNTX5_FLUSH_ON_ITR_DIS_M BIT(9) +#define GLTCLAN_CQ_CNTX6(_CQ) (0x000F3800 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX6_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX6_CQ_CACHLINE_S 0 +#define GLTCLAN_CQ_CNTX6_CQ_CACHLINE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTCLAN_CQ_CNTX7(_CQ) (0x000F4000 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX7_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX7_CQ_CACHLINE_S 0 +#define GLTCLAN_CQ_CNTX7_CQ_CACHLINE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTCLAN_CQ_CNTX8(_CQ) (0x000F4800 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX8_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX8_CQ_CACHLINE_S 0 +#define GLTCLAN_CQ_CNTX8_CQ_CACHLINE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTCLAN_CQ_CNTX9(_CQ) (0x000F5000 + ((_CQ) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLTCLAN_CQ_CNTX9_MAX_INDEX 511 +#define GLTCLAN_CQ_CNTX9_CQ_CACHLINE_S 0 +#define GLTCLAN_CQ_CNTX9_CQ_CACHLINE_M MAKEMASK(0xFFFFFFFF, 0) +#define QTX_COMM_DBELL(_DBQM) (0x002C0000 + ((_DBQM) * 4)) /* _i=0...16383 */ /* Reset Source: CORER */ +#define QTX_COMM_DBELL_MAX_INDEX 16383 +#define QTX_COMM_DBELL_QTX_COMM_DBELL_S 0 +#define QTX_COMM_DBELL_QTX_COMM_DBELL_M MAKEMASK(0xFFFFFFFF, 0) +#define QTX_COMM_DBLQ_CNTX(_i, _DBLQ) (0x002D0000 + ((_i) * 1024 + (_DBLQ) * 4)) /* _i=0...4, _DBLQ=0...255 */ /* Reset Source: CORER */ +#define QTX_COMM_DBLQ_CNTX_MAX_INDEX 4 +#define QTX_COMM_DBLQ_CNTX_DATA_S 0 +#define QTX_COMM_DBLQ_CNTX_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define QTX_COMM_DBLQ_DBELL(_DBLQ) (0x002D1400 + ((_DBLQ) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define QTX_COMM_DBLQ_DBELL_MAX_INDEX 255 +#define QTX_COMM_DBLQ_DBELL_TAIL_S 0 +#define QTX_COMM_DBLQ_DBELL_TAIL_M MAKEMASK(0x1FFF, 0) +#define QTX_COMM_HEAD(_DBQM) (0x000E0000 + ((_DBQM) * 4)) /* _i=0...16383 */ /* Reset Source: CORER */ +#define QTX_COMM_HEAD_MAX_INDEX 16383 +#define QTX_COMM_HEAD_HEAD_S 0 +#define QTX_COMM_HEAD_HEAD_M MAKEMASK(0x1FFF, 0) +#define QTX_COMM_HEAD_RS_PENDING_S 16 +#define QTX_COMM_HEAD_RS_PENDING_M BIT(16) +#define GL_FW_TOOL_ARQBAH 0x000801C0 /* Reset Source: EMPR */ +#define GL_FW_TOOL_ARQBAH_ARQBAH_S 0 +#define GL_FW_TOOL_ARQBAH_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_FW_TOOL_ARQBAL 0x000800C0 /* Reset Source: EMPR */ +#define GL_FW_TOOL_ARQBAL_ARQBAL_LSB_S 0 +#define GL_FW_TOOL_ARQBAL_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define GL_FW_TOOL_ARQBAL_ARQBAL_S 6 +#define GL_FW_TOOL_ARQBAL_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define GL_FW_TOOL_ARQH 0x000803C0 /* Reset Source: EMPR */ +#define GL_FW_TOOL_ARQH_ARQH_S 0 +#define GL_FW_TOOL_ARQH_ARQH_M MAKEMASK(0x3FF, 0) +#define GL_FW_TOOL_ARQLEN 0x000802C0 /* Reset Source: EMPR */ +#define GL_FW_TOOL_ARQLEN_ARQLEN_S 0 +#define GL_FW_TOOL_ARQLEN_ARQLEN_M MAKEMASK(0x3FF, 0) +#define GL_FW_TOOL_ARQLEN_ARQVFE_S 28 +#define GL_FW_TOOL_ARQLEN_ARQVFE_M BIT(28) +#define GL_FW_TOOL_ARQLEN_ARQOVFL_S 29 +#define GL_FW_TOOL_ARQLEN_ARQOVFL_M BIT(29) +#define GL_FW_TOOL_ARQLEN_ARQCRIT_S 30 +#define GL_FW_TOOL_ARQLEN_ARQCRIT_M BIT(30) +#define GL_FW_TOOL_ARQLEN_ARQENABLE_S 31 +#define GL_FW_TOOL_ARQLEN_ARQENABLE_M BIT(31) +#define GL_FW_TOOL_ARQT 0x000804C0 /* Reset Source: EMPR */ +#define GL_FW_TOOL_ARQT_ARQT_S 0 +#define GL_FW_TOOL_ARQT_ARQT_M MAKEMASK(0x3FF, 0) +#define GL_FW_TOOL_ATQBAH 0x00080140 /* Reset Source: EMPR */ +#define GL_FW_TOOL_ATQBAH_ATQBAH_S 0 +#define GL_FW_TOOL_ATQBAH_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_FW_TOOL_ATQBAL 0x00080040 /* Reset Source: EMPR */ +#define GL_FW_TOOL_ATQBAL_ATQBAL_LSB_S 0 +#define GL_FW_TOOL_ATQBAL_ATQBAL_LSB_M MAKEMASK(0x3F, 0) +#define GL_FW_TOOL_ATQBAL_ATQBAL_S 6 +#define GL_FW_TOOL_ATQBAL_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define GL_FW_TOOL_ATQH 0x00080340 /* Reset Source: EMPR */ +#define GL_FW_TOOL_ATQH_ATQH_S 0 +#define GL_FW_TOOL_ATQH_ATQH_M MAKEMASK(0x3FF, 0) +#define GL_FW_TOOL_ATQLEN 0x00080240 /* Reset Source: EMPR */ +#define GL_FW_TOOL_ATQLEN_ATQLEN_S 0 +#define GL_FW_TOOL_ATQLEN_ATQLEN_M MAKEMASK(0x3FF, 0) +#define GL_FW_TOOL_ATQLEN_ATQVFE_S 28 +#define GL_FW_TOOL_ATQLEN_ATQVFE_M BIT(28) +#define GL_FW_TOOL_ATQLEN_ATQOVFL_S 29 +#define GL_FW_TOOL_ATQLEN_ATQOVFL_M BIT(29) +#define GL_FW_TOOL_ATQLEN_ATQCRIT_S 30 +#define GL_FW_TOOL_ATQLEN_ATQCRIT_M BIT(30) +#define GL_FW_TOOL_ATQLEN_ATQENABLE_S 31 +#define GL_FW_TOOL_ATQLEN_ATQENABLE_M BIT(31) +#define GL_FW_TOOL_ATQT 0x00080440 /* Reset Source: EMPR */ +#define GL_FW_TOOL_ATQT_ATQT_S 0 +#define GL_FW_TOOL_ATQT_ATQT_M MAKEMASK(0x3FF, 0) +#define GL_MBX_PASID 0x00231EC0 /* Reset Source: CORER */ +#define GL_MBX_PASID_PASID_MODE_S 0 +#define GL_MBX_PASID_PASID_MODE_M BIT(0) +#define GL_MBX_PASID_PASID_MODE_VALID_S 1 +#define GL_MBX_PASID_PASID_MODE_VALID_M BIT(1) +#define PF_FW_ARQBAH 0x00080180 /* Reset Source: EMPR */ +#define PF_FW_ARQBAH_ARQBAH_S 0 +#define PF_FW_ARQBAH_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF_FW_ARQBAL 0x00080080 /* Reset Source: EMPR */ +#define PF_FW_ARQBAL_ARQBAL_LSB_S 0 +#define PF_FW_ARQBAL_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF_FW_ARQBAL_ARQBAL_S 6 +#define PF_FW_ARQBAL_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF_FW_ARQH 0x00080380 /* Reset Source: EMPR */ +#define PF_FW_ARQH_ARQH_S 0 +#define PF_FW_ARQH_ARQH_M MAKEMASK(0x3FF, 0) +#define PF_FW_ARQLEN 0x00080280 /* Reset Source: EMPR */ +#define PF_FW_ARQLEN_ARQLEN_S 0 +#define PF_FW_ARQLEN_ARQLEN_M MAKEMASK(0x3FF, 0) +#define PF_FW_ARQLEN_ARQVFE_S 28 +#define PF_FW_ARQLEN_ARQVFE_M BIT(28) +#define PF_FW_ARQLEN_ARQOVFL_S 29 +#define PF_FW_ARQLEN_ARQOVFL_M BIT(29) +#define PF_FW_ARQLEN_ARQCRIT_S 30 +#define PF_FW_ARQLEN_ARQCRIT_M BIT(30) +#define PF_FW_ARQLEN_ARQENABLE_S 31 +#define PF_FW_ARQLEN_ARQENABLE_M BIT(31) +#define PF_FW_ARQT 0x00080480 /* Reset Source: EMPR */ +#define PF_FW_ARQT_ARQT_S 0 +#define PF_FW_ARQT_ARQT_M MAKEMASK(0x3FF, 0) +#define PF_FW_ATQBAH 0x00080100 /* Reset Source: EMPR */ +#define PF_FW_ATQBAH_ATQBAH_S 0 +#define PF_FW_ATQBAH_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF_FW_ATQBAL 0x00080000 /* Reset Source: EMPR */ +#define PF_FW_ATQBAL_ATQBAL_LSB_S 0 +#define PF_FW_ATQBAL_ATQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF_FW_ATQBAL_ATQBAL_S 6 +#define PF_FW_ATQBAL_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF_FW_ATQH 0x00080300 /* Reset Source: EMPR */ +#define PF_FW_ATQH_ATQH_S 0 +#define PF_FW_ATQH_ATQH_M MAKEMASK(0x3FF, 0) +#define PF_FW_ATQLEN 0x00080200 /* Reset Source: EMPR */ +#define PF_FW_ATQLEN_ATQLEN_S 0 +#define PF_FW_ATQLEN_ATQLEN_M MAKEMASK(0x3FF, 0) +#define PF_FW_ATQLEN_ATQVFE_S 28 +#define PF_FW_ATQLEN_ATQVFE_M BIT(28) +#define PF_FW_ATQLEN_ATQOVFL_S 29 +#define PF_FW_ATQLEN_ATQOVFL_M BIT(29) +#define PF_FW_ATQLEN_ATQCRIT_S 30 +#define PF_FW_ATQLEN_ATQCRIT_M BIT(30) +#define PF_FW_ATQLEN_ATQENABLE_S 31 +#define PF_FW_ATQLEN_ATQENABLE_M BIT(31) +#define PF_FW_ATQT 0x00080400 /* Reset Source: EMPR */ +#define PF_FW_ATQT_ATQT_S 0 +#define PF_FW_ATQT_ATQT_M MAKEMASK(0x3FF, 0) +#define PF_MBX_ARQBAH 0x0022E400 /* Reset Source: CORER */ +#define PF_MBX_ARQBAH_ARQBAH_S 0 +#define PF_MBX_ARQBAH_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF_MBX_ARQBAL 0x0022E380 /* Reset Source: CORER */ +#define PF_MBX_ARQBAL_ARQBAL_LSB_S 0 +#define PF_MBX_ARQBAL_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF_MBX_ARQBAL_ARQBAL_S 6 +#define PF_MBX_ARQBAL_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF_MBX_ARQH 0x0022E500 /* Reset Source: CORER */ +#define PF_MBX_ARQH_ARQH_S 0 +#define PF_MBX_ARQH_ARQH_M MAKEMASK(0x3FF, 0) +#define PF_MBX_ARQLEN 0x0022E480 /* Reset Source: PFR */ +#define PF_MBX_ARQLEN_ARQLEN_S 0 +#define PF_MBX_ARQLEN_ARQLEN_M MAKEMASK(0x3FF, 0) +#define PF_MBX_ARQLEN_ARQVFE_S 28 +#define PF_MBX_ARQLEN_ARQVFE_M BIT(28) +#define PF_MBX_ARQLEN_ARQOVFL_S 29 +#define PF_MBX_ARQLEN_ARQOVFL_M BIT(29) +#define PF_MBX_ARQLEN_ARQCRIT_S 30 +#define PF_MBX_ARQLEN_ARQCRIT_M BIT(30) +#define PF_MBX_ARQLEN_ARQENABLE_S 31 +#define PF_MBX_ARQLEN_ARQENABLE_M BIT(31) +#define PF_MBX_ARQT 0x0022E580 /* Reset Source: CORER */ +#define PF_MBX_ARQT_ARQT_S 0 +#define PF_MBX_ARQT_ARQT_M MAKEMASK(0x3FF, 0) +#define PF_MBX_ATQBAH 0x0022E180 /* Reset Source: CORER */ +#define PF_MBX_ATQBAH_ATQBAH_S 0 +#define PF_MBX_ATQBAH_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF_MBX_ATQBAL 0x0022E100 /* Reset Source: CORER */ +#define PF_MBX_ATQBAL_ATQBAL_S 6 +#define PF_MBX_ATQBAL_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF_MBX_ATQH 0x0022E280 /* Reset Source: CORER */ +#define PF_MBX_ATQH_ATQH_S 0 +#define PF_MBX_ATQH_ATQH_M MAKEMASK(0x3FF, 0) +#define PF_MBX_ATQLEN 0x0022E200 /* Reset Source: PFR */ +#define PF_MBX_ATQLEN_ATQLEN_S 0 +#define PF_MBX_ATQLEN_ATQLEN_M MAKEMASK(0x3FF, 0) +#define PF_MBX_ATQLEN_ATQVFE_S 28 +#define PF_MBX_ATQLEN_ATQVFE_M BIT(28) +#define PF_MBX_ATQLEN_ATQOVFL_S 29 +#define PF_MBX_ATQLEN_ATQOVFL_M BIT(29) +#define PF_MBX_ATQLEN_ATQCRIT_S 30 +#define PF_MBX_ATQLEN_ATQCRIT_M BIT(30) +#define PF_MBX_ATQLEN_ATQENABLE_S 31 +#define PF_MBX_ATQLEN_ATQENABLE_M BIT(31) +#define PF_MBX_ATQT 0x0022E300 /* Reset Source: CORER */ +#define PF_MBX_ATQT_ATQT_S 0 +#define PF_MBX_ATQT_ATQT_M MAKEMASK(0x3FF, 0) +#define PF_SB_ARQBAH 0x0022FF00 /* Reset Source: CORER */ +#define PF_SB_ARQBAH_ARQBAH_S 0 +#define PF_SB_ARQBAH_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF_SB_ARQBAL 0x0022FE80 /* Reset Source: CORER */ +#define PF_SB_ARQBAL_ARQBAL_LSB_S 0 +#define PF_SB_ARQBAL_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF_SB_ARQBAL_ARQBAL_S 6 +#define PF_SB_ARQBAL_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF_SB_ARQH 0x00230000 /* Reset Source: CORER */ +#define PF_SB_ARQH_ARQH_S 0 +#define PF_SB_ARQH_ARQH_M MAKEMASK(0x3FF, 0) +#define PF_SB_ARQLEN 0x0022FF80 /* Reset Source: PFR */ +#define PF_SB_ARQLEN_ARQLEN_S 0 +#define PF_SB_ARQLEN_ARQLEN_M MAKEMASK(0x3FF, 0) +#define PF_SB_ARQLEN_ARQVFE_S 28 +#define PF_SB_ARQLEN_ARQVFE_M BIT(28) +#define PF_SB_ARQLEN_ARQOVFL_S 29 +#define PF_SB_ARQLEN_ARQOVFL_M BIT(29) +#define PF_SB_ARQLEN_ARQCRIT_S 30 +#define PF_SB_ARQLEN_ARQCRIT_M BIT(30) +#define PF_SB_ARQLEN_ARQENABLE_S 31 +#define PF_SB_ARQLEN_ARQENABLE_M BIT(31) +#define PF_SB_ARQT 0x00230080 /* Reset Source: CORER */ +#define PF_SB_ARQT_ARQT_S 0 +#define PF_SB_ARQT_ARQT_M MAKEMASK(0x3FF, 0) +#define PF_SB_ATQBAH 0x0022FC80 /* Reset Source: CORER */ +#define PF_SB_ATQBAH_ATQBAH_S 0 +#define PF_SB_ATQBAH_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF_SB_ATQBAL 0x0022FC00 /* Reset Source: CORER */ +#define PF_SB_ATQBAL_ATQBAL_S 6 +#define PF_SB_ATQBAL_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF_SB_ATQH 0x0022FD80 /* Reset Source: CORER */ +#define PF_SB_ATQH_ATQH_S 0 +#define PF_SB_ATQH_ATQH_M MAKEMASK(0x3FF, 0) +#define PF_SB_ATQLEN 0x0022FD00 /* Reset Source: PFR */ +#define PF_SB_ATQLEN_ATQLEN_S 0 +#define PF_SB_ATQLEN_ATQLEN_M MAKEMASK(0x3FF, 0) +#define PF_SB_ATQLEN_ATQVFE_S 28 +#define PF_SB_ATQLEN_ATQVFE_M BIT(28) +#define PF_SB_ATQLEN_ATQOVFL_S 29 +#define PF_SB_ATQLEN_ATQOVFL_M BIT(29) +#define PF_SB_ATQLEN_ATQCRIT_S 30 +#define PF_SB_ATQLEN_ATQCRIT_M BIT(30) +#define PF_SB_ATQLEN_ATQENABLE_S 31 +#define PF_SB_ATQLEN_ATQENABLE_M BIT(31) +#define PF_SB_ATQT 0x0022FE00 /* Reset Source: CORER */ +#define PF_SB_ATQT_ATQT_S 0 +#define PF_SB_ATQT_ATQT_M MAKEMASK(0x3FF, 0) +#define PF_SB_REM_DEV_CTL 0x002300F0 /* Reset Source: CORER */ +#define PF_SB_REM_DEV_CTL_DEST_EN_S 0 +#define PF_SB_REM_DEV_CTL_DEST_EN_M MAKEMASK(0xFFFF, 0) +#define PF0_FW_HLP_ARQBAH 0x000801C8 /* Reset Source: EMPR */ +#define PF0_FW_HLP_ARQBAH_ARQBAH_S 0 +#define PF0_FW_HLP_ARQBAH_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_FW_HLP_ARQBAL 0x000800C8 /* Reset Source: EMPR */ +#define PF0_FW_HLP_ARQBAL_ARQBAL_LSB_S 0 +#define PF0_FW_HLP_ARQBAL_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF0_FW_HLP_ARQBAL_ARQBAL_S 6 +#define PF0_FW_HLP_ARQBAL_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_FW_HLP_ARQH 0x000803C8 /* Reset Source: EMPR */ +#define PF0_FW_HLP_ARQH_ARQH_S 0 +#define PF0_FW_HLP_ARQH_ARQH_M MAKEMASK(0x3FF, 0) +#define PF0_FW_HLP_ARQLEN 0x000802C8 /* Reset Source: EMPR */ +#define PF0_FW_HLP_ARQLEN_ARQLEN_S 0 +#define PF0_FW_HLP_ARQLEN_ARQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_FW_HLP_ARQLEN_ARQVFE_S 28 +#define PF0_FW_HLP_ARQLEN_ARQVFE_M BIT(28) +#define PF0_FW_HLP_ARQLEN_ARQOVFL_S 29 +#define PF0_FW_HLP_ARQLEN_ARQOVFL_M BIT(29) +#define PF0_FW_HLP_ARQLEN_ARQCRIT_S 30 +#define PF0_FW_HLP_ARQLEN_ARQCRIT_M BIT(30) +#define PF0_FW_HLP_ARQLEN_ARQENABLE_S 31 +#define PF0_FW_HLP_ARQLEN_ARQENABLE_M BIT(31) +#define PF0_FW_HLP_ARQT 0x000804C8 /* Reset Source: EMPR */ +#define PF0_FW_HLP_ARQT_ARQT_S 0 +#define PF0_FW_HLP_ARQT_ARQT_M MAKEMASK(0x3FF, 0) +#define PF0_FW_HLP_ATQBAH 0x00080148 /* Reset Source: EMPR */ +#define PF0_FW_HLP_ATQBAH_ATQBAH_S 0 +#define PF0_FW_HLP_ATQBAH_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_FW_HLP_ATQBAL 0x00080048 /* Reset Source: EMPR */ +#define PF0_FW_HLP_ATQBAL_ATQBAL_LSB_S 0 +#define PF0_FW_HLP_ATQBAL_ATQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF0_FW_HLP_ATQBAL_ATQBAL_S 6 +#define PF0_FW_HLP_ATQBAL_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_FW_HLP_ATQH 0x00080348 /* Reset Source: EMPR */ +#define PF0_FW_HLP_ATQH_ATQH_S 0 +#define PF0_FW_HLP_ATQH_ATQH_M MAKEMASK(0x3FF, 0) +#define PF0_FW_HLP_ATQLEN 0x00080248 /* Reset Source: EMPR */ +#define PF0_FW_HLP_ATQLEN_ATQLEN_S 0 +#define PF0_FW_HLP_ATQLEN_ATQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_FW_HLP_ATQLEN_ATQVFE_S 28 +#define PF0_FW_HLP_ATQLEN_ATQVFE_M BIT(28) +#define PF0_FW_HLP_ATQLEN_ATQOVFL_S 29 +#define PF0_FW_HLP_ATQLEN_ATQOVFL_M BIT(29) +#define PF0_FW_HLP_ATQLEN_ATQCRIT_S 30 +#define PF0_FW_HLP_ATQLEN_ATQCRIT_M BIT(30) +#define PF0_FW_HLP_ATQLEN_ATQENABLE_S 31 +#define PF0_FW_HLP_ATQLEN_ATQENABLE_M BIT(31) +#define PF0_FW_HLP_ATQT 0x00080448 /* Reset Source: EMPR */ +#define PF0_FW_HLP_ATQT_ATQT_S 0 +#define PF0_FW_HLP_ATQT_ATQT_M MAKEMASK(0x3FF, 0) +#define PF0_FW_PSM_ARQBAH 0x000801C4 /* Reset Source: EMPR */ +#define PF0_FW_PSM_ARQBAH_ARQBAH_S 0 +#define PF0_FW_PSM_ARQBAH_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_FW_PSM_ARQBAL 0x000800C4 /* Reset Source: EMPR */ +#define PF0_FW_PSM_ARQBAL_ARQBAL_LSB_S 0 +#define PF0_FW_PSM_ARQBAL_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF0_FW_PSM_ARQBAL_ARQBAL_S 6 +#define PF0_FW_PSM_ARQBAL_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_FW_PSM_ARQH 0x000803C4 /* Reset Source: EMPR */ +#define PF0_FW_PSM_ARQH_ARQH_S 0 +#define PF0_FW_PSM_ARQH_ARQH_M MAKEMASK(0x3FF, 0) +#define PF0_FW_PSM_ARQLEN 0x000802C4 /* Reset Source: EMPR */ +#define PF0_FW_PSM_ARQLEN_ARQLEN_S 0 +#define PF0_FW_PSM_ARQLEN_ARQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_FW_PSM_ARQLEN_ARQVFE_S 28 +#define PF0_FW_PSM_ARQLEN_ARQVFE_M BIT(28) +#define PF0_FW_PSM_ARQLEN_ARQOVFL_S 29 +#define PF0_FW_PSM_ARQLEN_ARQOVFL_M BIT(29) +#define PF0_FW_PSM_ARQLEN_ARQCRIT_S 30 +#define PF0_FW_PSM_ARQLEN_ARQCRIT_M BIT(30) +#define PF0_FW_PSM_ARQLEN_ARQENABLE_S 31 +#define PF0_FW_PSM_ARQLEN_ARQENABLE_M BIT(31) +#define PF0_FW_PSM_ARQT 0x000804C4 /* Reset Source: EMPR */ +#define PF0_FW_PSM_ARQT_ARQT_S 0 +#define PF0_FW_PSM_ARQT_ARQT_M MAKEMASK(0x3FF, 0) +#define PF0_FW_PSM_ATQBAH 0x00080144 /* Reset Source: EMPR */ +#define PF0_FW_PSM_ATQBAH_ATQBAH_S 0 +#define PF0_FW_PSM_ATQBAH_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_FW_PSM_ATQBAL 0x00080044 /* Reset Source: EMPR */ +#define PF0_FW_PSM_ATQBAL_ATQBAL_LSB_S 0 +#define PF0_FW_PSM_ATQBAL_ATQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF0_FW_PSM_ATQBAL_ATQBAL_S 6 +#define PF0_FW_PSM_ATQBAL_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_FW_PSM_ATQH 0x00080344 /* Reset Source: EMPR */ +#define PF0_FW_PSM_ATQH_ATQH_S 0 +#define PF0_FW_PSM_ATQH_ATQH_M MAKEMASK(0x3FF, 0) +#define PF0_FW_PSM_ATQLEN 0x00080244 /* Reset Source: EMPR */ +#define PF0_FW_PSM_ATQLEN_ATQLEN_S 0 +#define PF0_FW_PSM_ATQLEN_ATQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_FW_PSM_ATQLEN_ATQVFE_S 28 +#define PF0_FW_PSM_ATQLEN_ATQVFE_M BIT(28) +#define PF0_FW_PSM_ATQLEN_ATQOVFL_S 29 +#define PF0_FW_PSM_ATQLEN_ATQOVFL_M BIT(29) +#define PF0_FW_PSM_ATQLEN_ATQCRIT_S 30 +#define PF0_FW_PSM_ATQLEN_ATQCRIT_M BIT(30) +#define PF0_FW_PSM_ATQLEN_ATQENABLE_S 31 +#define PF0_FW_PSM_ATQLEN_ATQENABLE_M BIT(31) +#define PF0_FW_PSM_ATQT 0x00080444 /* Reset Source: EMPR */ +#define PF0_FW_PSM_ATQT_ATQT_S 0 +#define PF0_FW_PSM_ATQT_ATQT_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_CPM_ARQBAH 0x0022E5D8 /* Reset Source: CORER */ +#define PF0_MBX_CPM_ARQBAH_ARQBAH_S 0 +#define PF0_MBX_CPM_ARQBAH_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_MBX_CPM_ARQBAL 0x0022E5D4 /* Reset Source: CORER */ +#define PF0_MBX_CPM_ARQBAL_ARQBAL_LSB_S 0 +#define PF0_MBX_CPM_ARQBAL_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF0_MBX_CPM_ARQBAL_ARQBAL_S 6 +#define PF0_MBX_CPM_ARQBAL_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_MBX_CPM_ARQH 0x0022E5E0 /* Reset Source: CORER */ +#define PF0_MBX_CPM_ARQH_ARQH_S 0 +#define PF0_MBX_CPM_ARQH_ARQH_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_CPM_ARQLEN 0x0022E5DC /* Reset Source: PFR */ +#define PF0_MBX_CPM_ARQLEN_ARQLEN_S 0 +#define PF0_MBX_CPM_ARQLEN_ARQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_CPM_ARQLEN_ARQVFE_S 28 +#define PF0_MBX_CPM_ARQLEN_ARQVFE_M BIT(28) +#define PF0_MBX_CPM_ARQLEN_ARQOVFL_S 29 +#define PF0_MBX_CPM_ARQLEN_ARQOVFL_M BIT(29) +#define PF0_MBX_CPM_ARQLEN_ARQCRIT_S 30 +#define PF0_MBX_CPM_ARQLEN_ARQCRIT_M BIT(30) +#define PF0_MBX_CPM_ARQLEN_ARQENABLE_S 31 +#define PF0_MBX_CPM_ARQLEN_ARQENABLE_M BIT(31) +#define PF0_MBX_CPM_ARQT 0x0022E5E4 /* Reset Source: CORER */ +#define PF0_MBX_CPM_ARQT_ARQT_S 0 +#define PF0_MBX_CPM_ARQT_ARQT_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_CPM_ATQBAH 0x0022E5C4 /* Reset Source: CORER */ +#define PF0_MBX_CPM_ATQBAH_ATQBAH_S 0 +#define PF0_MBX_CPM_ATQBAH_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_MBX_CPM_ATQBAL 0x0022E5C0 /* Reset Source: CORER */ +#define PF0_MBX_CPM_ATQBAL_ATQBAL_S 6 +#define PF0_MBX_CPM_ATQBAL_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_MBX_CPM_ATQH 0x0022E5CC /* Reset Source: CORER */ +#define PF0_MBX_CPM_ATQH_ATQH_S 0 +#define PF0_MBX_CPM_ATQH_ATQH_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_CPM_ATQLEN 0x0022E5C8 /* Reset Source: PFR */ +#define PF0_MBX_CPM_ATQLEN_ATQLEN_S 0 +#define PF0_MBX_CPM_ATQLEN_ATQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_CPM_ATQLEN_ATQVFE_S 28 +#define PF0_MBX_CPM_ATQLEN_ATQVFE_M BIT(28) +#define PF0_MBX_CPM_ATQLEN_ATQOVFL_S 29 +#define PF0_MBX_CPM_ATQLEN_ATQOVFL_M BIT(29) +#define PF0_MBX_CPM_ATQLEN_ATQCRIT_S 30 +#define PF0_MBX_CPM_ATQLEN_ATQCRIT_M BIT(30) +#define PF0_MBX_CPM_ATQLEN_ATQENABLE_S 31 +#define PF0_MBX_CPM_ATQLEN_ATQENABLE_M BIT(31) +#define PF0_MBX_CPM_ATQT 0x0022E5D0 /* Reset Source: CORER */ +#define PF0_MBX_CPM_ATQT_ATQT_S 0 +#define PF0_MBX_CPM_ATQT_ATQT_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_HLP_ARQBAH 0x0022E600 /* Reset Source: CORER */ +#define PF0_MBX_HLP_ARQBAH_ARQBAH_S 0 +#define PF0_MBX_HLP_ARQBAH_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_MBX_HLP_ARQBAL 0x0022E5FC /* Reset Source: CORER */ +#define PF0_MBX_HLP_ARQBAL_ARQBAL_LSB_S 0 +#define PF0_MBX_HLP_ARQBAL_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF0_MBX_HLP_ARQBAL_ARQBAL_S 6 +#define PF0_MBX_HLP_ARQBAL_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_MBX_HLP_ARQH 0x0022E608 /* Reset Source: CORER */ +#define PF0_MBX_HLP_ARQH_ARQH_S 0 +#define PF0_MBX_HLP_ARQH_ARQH_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_HLP_ARQLEN 0x0022E604 /* Reset Source: PFR */ +#define PF0_MBX_HLP_ARQLEN_ARQLEN_S 0 +#define PF0_MBX_HLP_ARQLEN_ARQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_HLP_ARQLEN_ARQVFE_S 28 +#define PF0_MBX_HLP_ARQLEN_ARQVFE_M BIT(28) +#define PF0_MBX_HLP_ARQLEN_ARQOVFL_S 29 +#define PF0_MBX_HLP_ARQLEN_ARQOVFL_M BIT(29) +#define PF0_MBX_HLP_ARQLEN_ARQCRIT_S 30 +#define PF0_MBX_HLP_ARQLEN_ARQCRIT_M BIT(30) +#define PF0_MBX_HLP_ARQLEN_ARQENABLE_S 31 +#define PF0_MBX_HLP_ARQLEN_ARQENABLE_M BIT(31) +#define PF0_MBX_HLP_ARQT 0x0022E60C /* Reset Source: CORER */ +#define PF0_MBX_HLP_ARQT_ARQT_S 0 +#define PF0_MBX_HLP_ARQT_ARQT_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_HLP_ATQBAH 0x0022E5EC /* Reset Source: CORER */ +#define PF0_MBX_HLP_ATQBAH_ATQBAH_S 0 +#define PF0_MBX_HLP_ATQBAH_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_MBX_HLP_ATQBAL 0x0022E5E8 /* Reset Source: CORER */ +#define PF0_MBX_HLP_ATQBAL_ATQBAL_S 6 +#define PF0_MBX_HLP_ATQBAL_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_MBX_HLP_ATQH 0x0022E5F4 /* Reset Source: CORER */ +#define PF0_MBX_HLP_ATQH_ATQH_S 0 +#define PF0_MBX_HLP_ATQH_ATQH_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_HLP_ATQLEN 0x0022E5F0 /* Reset Source: PFR */ +#define PF0_MBX_HLP_ATQLEN_ATQLEN_S 0 +#define PF0_MBX_HLP_ATQLEN_ATQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_HLP_ATQLEN_ATQVFE_S 28 +#define PF0_MBX_HLP_ATQLEN_ATQVFE_M BIT(28) +#define PF0_MBX_HLP_ATQLEN_ATQOVFL_S 29 +#define PF0_MBX_HLP_ATQLEN_ATQOVFL_M BIT(29) +#define PF0_MBX_HLP_ATQLEN_ATQCRIT_S 30 +#define PF0_MBX_HLP_ATQLEN_ATQCRIT_M BIT(30) +#define PF0_MBX_HLP_ATQLEN_ATQENABLE_S 31 +#define PF0_MBX_HLP_ATQLEN_ATQENABLE_M BIT(31) +#define PF0_MBX_HLP_ATQT 0x0022E5F8 /* Reset Source: CORER */ +#define PF0_MBX_HLP_ATQT_ATQT_S 0 +#define PF0_MBX_HLP_ATQT_ATQT_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_PSM_ARQBAH 0x0022E628 /* Reset Source: CORER */ +#define PF0_MBX_PSM_ARQBAH_ARQBAH_S 0 +#define PF0_MBX_PSM_ARQBAH_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_MBX_PSM_ARQBAL 0x0022E624 /* Reset Source: CORER */ +#define PF0_MBX_PSM_ARQBAL_ARQBAL_LSB_S 0 +#define PF0_MBX_PSM_ARQBAL_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF0_MBX_PSM_ARQBAL_ARQBAL_S 6 +#define PF0_MBX_PSM_ARQBAL_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_MBX_PSM_ARQH 0x0022E630 /* Reset Source: CORER */ +#define PF0_MBX_PSM_ARQH_ARQH_S 0 +#define PF0_MBX_PSM_ARQH_ARQH_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_PSM_ARQLEN 0x0022E62C /* Reset Source: PFR */ +#define PF0_MBX_PSM_ARQLEN_ARQLEN_S 0 +#define PF0_MBX_PSM_ARQLEN_ARQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_PSM_ARQLEN_ARQVFE_S 28 +#define PF0_MBX_PSM_ARQLEN_ARQVFE_M BIT(28) +#define PF0_MBX_PSM_ARQLEN_ARQOVFL_S 29 +#define PF0_MBX_PSM_ARQLEN_ARQOVFL_M BIT(29) +#define PF0_MBX_PSM_ARQLEN_ARQCRIT_S 30 +#define PF0_MBX_PSM_ARQLEN_ARQCRIT_M BIT(30) +#define PF0_MBX_PSM_ARQLEN_ARQENABLE_S 31 +#define PF0_MBX_PSM_ARQLEN_ARQENABLE_M BIT(31) +#define PF0_MBX_PSM_ARQT 0x0022E634 /* Reset Source: CORER */ +#define PF0_MBX_PSM_ARQT_ARQT_S 0 +#define PF0_MBX_PSM_ARQT_ARQT_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_PSM_ATQBAH 0x0022E614 /* Reset Source: CORER */ +#define PF0_MBX_PSM_ATQBAH_ATQBAH_S 0 +#define PF0_MBX_PSM_ATQBAH_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_MBX_PSM_ATQBAL 0x0022E610 /* Reset Source: CORER */ +#define PF0_MBX_PSM_ATQBAL_ATQBAL_S 6 +#define PF0_MBX_PSM_ATQBAL_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_MBX_PSM_ATQH 0x0022E61C /* Reset Source: CORER */ +#define PF0_MBX_PSM_ATQH_ATQH_S 0 +#define PF0_MBX_PSM_ATQH_ATQH_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_PSM_ATQLEN 0x0022E618 /* Reset Source: PFR */ +#define PF0_MBX_PSM_ATQLEN_ATQLEN_S 0 +#define PF0_MBX_PSM_ATQLEN_ATQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_MBX_PSM_ATQLEN_ATQVFE_S 28 +#define PF0_MBX_PSM_ATQLEN_ATQVFE_M BIT(28) +#define PF0_MBX_PSM_ATQLEN_ATQOVFL_S 29 +#define PF0_MBX_PSM_ATQLEN_ATQOVFL_M BIT(29) +#define PF0_MBX_PSM_ATQLEN_ATQCRIT_S 30 +#define PF0_MBX_PSM_ATQLEN_ATQCRIT_M BIT(30) +#define PF0_MBX_PSM_ATQLEN_ATQENABLE_S 31 +#define PF0_MBX_PSM_ATQLEN_ATQENABLE_M BIT(31) +#define PF0_MBX_PSM_ATQT 0x0022E620 /* Reset Source: CORER */ +#define PF0_MBX_PSM_ATQT_ATQT_S 0 +#define PF0_MBX_PSM_ATQT_ATQT_M MAKEMASK(0x3FF, 0) +#define PF0_SB_CPM_ARQBAH 0x0022E650 /* Reset Source: CORER */ +#define PF0_SB_CPM_ARQBAH_ARQBAH_S 0 +#define PF0_SB_CPM_ARQBAH_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_SB_CPM_ARQBAL 0x0022E64C /* Reset Source: CORER */ +#define PF0_SB_CPM_ARQBAL_ARQBAL_LSB_S 0 +#define PF0_SB_CPM_ARQBAL_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF0_SB_CPM_ARQBAL_ARQBAL_S 6 +#define PF0_SB_CPM_ARQBAL_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_SB_CPM_ARQH 0x0022E658 /* Reset Source: CORER */ +#define PF0_SB_CPM_ARQH_ARQH_S 0 +#define PF0_SB_CPM_ARQH_ARQH_M MAKEMASK(0x3FF, 0) +#define PF0_SB_CPM_ARQLEN 0x0022E654 /* Reset Source: PFR */ +#define PF0_SB_CPM_ARQLEN_ARQLEN_S 0 +#define PF0_SB_CPM_ARQLEN_ARQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_SB_CPM_ARQLEN_ARQVFE_S 28 +#define PF0_SB_CPM_ARQLEN_ARQVFE_M BIT(28) +#define PF0_SB_CPM_ARQLEN_ARQOVFL_S 29 +#define PF0_SB_CPM_ARQLEN_ARQOVFL_M BIT(29) +#define PF0_SB_CPM_ARQLEN_ARQCRIT_S 30 +#define PF0_SB_CPM_ARQLEN_ARQCRIT_M BIT(30) +#define PF0_SB_CPM_ARQLEN_ARQENABLE_S 31 +#define PF0_SB_CPM_ARQLEN_ARQENABLE_M BIT(31) +#define PF0_SB_CPM_ARQT 0x0022E65C /* Reset Source: CORER */ +#define PF0_SB_CPM_ARQT_ARQT_S 0 +#define PF0_SB_CPM_ARQT_ARQT_M MAKEMASK(0x3FF, 0) +#define PF0_SB_CPM_ATQBAH 0x0022E63C /* Reset Source: CORER */ +#define PF0_SB_CPM_ATQBAH_ATQBAH_S 0 +#define PF0_SB_CPM_ATQBAH_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_SB_CPM_ATQBAL 0x0022E638 /* Reset Source: CORER */ +#define PF0_SB_CPM_ATQBAL_ATQBAL_S 6 +#define PF0_SB_CPM_ATQBAL_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_SB_CPM_ATQH 0x0022E644 /* Reset Source: CORER */ +#define PF0_SB_CPM_ATQH_ATQH_S 0 +#define PF0_SB_CPM_ATQH_ATQH_M MAKEMASK(0x3FF, 0) +#define PF0_SB_CPM_ATQLEN 0x0022E640 /* Reset Source: PFR */ +#define PF0_SB_CPM_ATQLEN_ATQLEN_S 0 +#define PF0_SB_CPM_ATQLEN_ATQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_SB_CPM_ATQLEN_ATQVFE_S 28 +#define PF0_SB_CPM_ATQLEN_ATQVFE_M BIT(28) +#define PF0_SB_CPM_ATQLEN_ATQOVFL_S 29 +#define PF0_SB_CPM_ATQLEN_ATQOVFL_M BIT(29) +#define PF0_SB_CPM_ATQLEN_ATQCRIT_S 30 +#define PF0_SB_CPM_ATQLEN_ATQCRIT_M BIT(30) +#define PF0_SB_CPM_ATQLEN_ATQENABLE_S 31 +#define PF0_SB_CPM_ATQLEN_ATQENABLE_M BIT(31) +#define PF0_SB_CPM_ATQT 0x0022E648 /* Reset Source: CORER */ +#define PF0_SB_CPM_ATQT_ATQT_S 0 +#define PF0_SB_CPM_ATQT_ATQT_M MAKEMASK(0x3FF, 0) +#define PF0_SB_CPM_REM_DEV_CTL 0x002300F4 /* Reset Source: CORER */ +#define PF0_SB_CPM_REM_DEV_CTL_DEST_EN_S 0 +#define PF0_SB_CPM_REM_DEV_CTL_DEST_EN_M MAKEMASK(0xFFFF, 0) +#define PF0_SB_HLP_ARQBAH 0x002300D8 /* Reset Source: CORER */ +#define PF0_SB_HLP_ARQBAH_ARQBAH_S 0 +#define PF0_SB_HLP_ARQBAH_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_SB_HLP_ARQBAL 0x002300D4 /* Reset Source: CORER */ +#define PF0_SB_HLP_ARQBAL_ARQBAL_LSB_S 0 +#define PF0_SB_HLP_ARQBAL_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define PF0_SB_HLP_ARQBAL_ARQBAL_S 6 +#define PF0_SB_HLP_ARQBAL_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_SB_HLP_ARQH 0x002300E0 /* Reset Source: CORER */ +#define PF0_SB_HLP_ARQH_ARQH_S 0 +#define PF0_SB_HLP_ARQH_ARQH_M MAKEMASK(0x3FF, 0) +#define PF0_SB_HLP_ARQLEN 0x002300DC /* Reset Source: PFR */ +#define PF0_SB_HLP_ARQLEN_ARQLEN_S 0 +#define PF0_SB_HLP_ARQLEN_ARQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_SB_HLP_ARQLEN_ARQVFE_S 28 +#define PF0_SB_HLP_ARQLEN_ARQVFE_M BIT(28) +#define PF0_SB_HLP_ARQLEN_ARQOVFL_S 29 +#define PF0_SB_HLP_ARQLEN_ARQOVFL_M BIT(29) +#define PF0_SB_HLP_ARQLEN_ARQCRIT_S 30 +#define PF0_SB_HLP_ARQLEN_ARQCRIT_M BIT(30) +#define PF0_SB_HLP_ARQLEN_ARQENABLE_S 31 +#define PF0_SB_HLP_ARQLEN_ARQENABLE_M BIT(31) +#define PF0_SB_HLP_ARQT 0x002300E4 /* Reset Source: CORER */ +#define PF0_SB_HLP_ARQT_ARQT_S 0 +#define PF0_SB_HLP_ARQT_ARQT_M MAKEMASK(0x3FF, 0) +#define PF0_SB_HLP_ATQBAH 0x002300C4 /* Reset Source: CORER */ +#define PF0_SB_HLP_ATQBAH_ATQBAH_S 0 +#define PF0_SB_HLP_ATQBAH_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define PF0_SB_HLP_ATQBAL 0x002300C0 /* Reset Source: CORER */ +#define PF0_SB_HLP_ATQBAL_ATQBAL_S 6 +#define PF0_SB_HLP_ATQBAL_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define PF0_SB_HLP_ATQH 0x002300CC /* Reset Source: CORER */ +#define PF0_SB_HLP_ATQH_ATQH_S 0 +#define PF0_SB_HLP_ATQH_ATQH_M MAKEMASK(0x3FF, 0) +#define PF0_SB_HLP_ATQLEN 0x002300C8 /* Reset Source: PFR */ +#define PF0_SB_HLP_ATQLEN_ATQLEN_S 0 +#define PF0_SB_HLP_ATQLEN_ATQLEN_M MAKEMASK(0x3FF, 0) +#define PF0_SB_HLP_ATQLEN_ATQVFE_S 28 +#define PF0_SB_HLP_ATQLEN_ATQVFE_M BIT(28) +#define PF0_SB_HLP_ATQLEN_ATQOVFL_S 29 +#define PF0_SB_HLP_ATQLEN_ATQOVFL_M BIT(29) +#define PF0_SB_HLP_ATQLEN_ATQCRIT_S 30 +#define PF0_SB_HLP_ATQLEN_ATQCRIT_M BIT(30) +#define PF0_SB_HLP_ATQLEN_ATQENABLE_S 31 +#define PF0_SB_HLP_ATQLEN_ATQENABLE_M BIT(31) +#define PF0_SB_HLP_ATQT 0x002300D0 /* Reset Source: CORER */ +#define PF0_SB_HLP_ATQT_ATQT_S 0 +#define PF0_SB_HLP_ATQT_ATQT_M MAKEMASK(0x3FF, 0) +#define PF0_SB_HLP_REM_DEV_CTL 0x002300E8 /* Reset Source: CORER */ +#define PF0_SB_HLP_REM_DEV_CTL_DEST_EN_S 0 +#define PF0_SB_HLP_REM_DEV_CTL_DEST_EN_M MAKEMASK(0xFFFF, 0) +#define SB_REM_DEV_DEST(_i) (0x002300F8 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define SB_REM_DEV_DEST_MAX_INDEX 7 +#define SB_REM_DEV_DEST_DEST_S 0 +#define SB_REM_DEV_DEST_DEST_M MAKEMASK(0xF, 0) +#define SB_REM_DEV_DEST_DEST_VALID_S 31 +#define SB_REM_DEV_DEST_DEST_VALID_M BIT(31) +#define VF_MBX_ARQBAH(_VF) (0x0022B800 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VF_MBX_ARQBAH_MAX_INDEX 255 +#define VF_MBX_ARQBAH_ARQBAH_S 0 +#define VF_MBX_ARQBAH_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_MBX_ARQBAL(_VF) (0x0022B400 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VF_MBX_ARQBAL_MAX_INDEX 255 +#define VF_MBX_ARQBAL_ARQBAL_LSB_S 0 +#define VF_MBX_ARQBAL_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define VF_MBX_ARQBAL_ARQBAL_S 6 +#define VF_MBX_ARQBAL_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VF_MBX_ARQH(_VF) (0x0022C000 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VF_MBX_ARQH_MAX_INDEX 255 +#define VF_MBX_ARQH_ARQH_S 0 +#define VF_MBX_ARQH_ARQH_M MAKEMASK(0x3FF, 0) +#define VF_MBX_ARQLEN(_VF) (0x0022BC00 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: PFR */ +#define VF_MBX_ARQLEN_MAX_INDEX 255 +#define VF_MBX_ARQLEN_ARQLEN_S 0 +#define VF_MBX_ARQLEN_ARQLEN_M MAKEMASK(0x3FF, 0) +#define VF_MBX_ARQLEN_ARQVFE_S 28 +#define VF_MBX_ARQLEN_ARQVFE_M BIT(28) +#define VF_MBX_ARQLEN_ARQOVFL_S 29 +#define VF_MBX_ARQLEN_ARQOVFL_M BIT(29) +#define VF_MBX_ARQLEN_ARQCRIT_S 30 +#define VF_MBX_ARQLEN_ARQCRIT_M BIT(30) +#define VF_MBX_ARQLEN_ARQENABLE_S 31 +#define VF_MBX_ARQLEN_ARQENABLE_M BIT(31) +#define VF_MBX_ARQT(_VF) (0x0022C400 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VF_MBX_ARQT_MAX_INDEX 255 +#define VF_MBX_ARQT_ARQT_S 0 +#define VF_MBX_ARQT_ARQT_M MAKEMASK(0x3FF, 0) +#define VF_MBX_ATQBAH(_VF) (0x0022A400 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VF_MBX_ATQBAH_MAX_INDEX 255 +#define VF_MBX_ATQBAH_ATQBAH_S 0 +#define VF_MBX_ATQBAH_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_MBX_ATQBAL(_VF) (0x0022A000 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VF_MBX_ATQBAL_MAX_INDEX 255 +#define VF_MBX_ATQBAL_ATQBAL_S 6 +#define VF_MBX_ATQBAL_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VF_MBX_ATQH(_VF) (0x0022AC00 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VF_MBX_ATQH_MAX_INDEX 255 +#define VF_MBX_ATQH_ATQH_S 0 +#define VF_MBX_ATQH_ATQH_M MAKEMASK(0x3FF, 0) +#define VF_MBX_ATQLEN(_VF) (0x0022A800 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: PFR */ +#define VF_MBX_ATQLEN_MAX_INDEX 255 +#define VF_MBX_ATQLEN_ATQLEN_S 0 +#define VF_MBX_ATQLEN_ATQLEN_M MAKEMASK(0x3FF, 0) +#define VF_MBX_ATQLEN_ATQVFE_S 28 +#define VF_MBX_ATQLEN_ATQVFE_M BIT(28) +#define VF_MBX_ATQLEN_ATQOVFL_S 29 +#define VF_MBX_ATQLEN_ATQOVFL_M BIT(29) +#define VF_MBX_ATQLEN_ATQCRIT_S 30 +#define VF_MBX_ATQLEN_ATQCRIT_M BIT(30) +#define VF_MBX_ATQLEN_ATQENABLE_S 31 +#define VF_MBX_ATQLEN_ATQENABLE_M BIT(31) +#define VF_MBX_ATQT(_VF) (0x0022B000 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VF_MBX_ATQT_MAX_INDEX 255 +#define VF_MBX_ATQT_ATQT_S 0 +#define VF_MBX_ATQT_ATQT_M MAKEMASK(0x3FF, 0) +#define VF_MBX_CPM_ARQBAH(_VF128) (0x0022D400 + ((_VF128) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define VF_MBX_CPM_ARQBAH_MAX_INDEX 127 +#define VF_MBX_CPM_ARQBAH_ARQBAH_S 0 +#define VF_MBX_CPM_ARQBAH_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_MBX_CPM_ARQBAL(_VF128) (0x0022D200 + ((_VF128) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define VF_MBX_CPM_ARQBAL_MAX_INDEX 127 +#define VF_MBX_CPM_ARQBAL_ARQBAL_LSB_S 0 +#define VF_MBX_CPM_ARQBAL_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define VF_MBX_CPM_ARQBAL_ARQBAL_S 6 +#define VF_MBX_CPM_ARQBAL_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VF_MBX_CPM_ARQH(_VF128) (0x0022D800 + ((_VF128) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define VF_MBX_CPM_ARQH_MAX_INDEX 127 +#define VF_MBX_CPM_ARQH_ARQH_S 0 +#define VF_MBX_CPM_ARQH_ARQH_M MAKEMASK(0x3FF, 0) +#define VF_MBX_CPM_ARQLEN(_VF128) (0x0022D600 + ((_VF128) * 4)) /* _i=0...127 */ /* Reset Source: PFR */ +#define VF_MBX_CPM_ARQLEN_MAX_INDEX 127 +#define VF_MBX_CPM_ARQLEN_ARQLEN_S 0 +#define VF_MBX_CPM_ARQLEN_ARQLEN_M MAKEMASK(0x3FF, 0) +#define VF_MBX_CPM_ARQLEN_ARQVFE_S 28 +#define VF_MBX_CPM_ARQLEN_ARQVFE_M BIT(28) +#define VF_MBX_CPM_ARQLEN_ARQOVFL_S 29 +#define VF_MBX_CPM_ARQLEN_ARQOVFL_M BIT(29) +#define VF_MBX_CPM_ARQLEN_ARQCRIT_S 30 +#define VF_MBX_CPM_ARQLEN_ARQCRIT_M BIT(30) +#define VF_MBX_CPM_ARQLEN_ARQENABLE_S 31 +#define VF_MBX_CPM_ARQLEN_ARQENABLE_M BIT(31) +#define VF_MBX_CPM_ARQT(_VF128) (0x0022DA00 + ((_VF128) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define VF_MBX_CPM_ARQT_MAX_INDEX 127 +#define VF_MBX_CPM_ARQT_ARQT_S 0 +#define VF_MBX_CPM_ARQT_ARQT_M MAKEMASK(0x3FF, 0) +#define VF_MBX_CPM_ATQBAH(_VF128) (0x0022CA00 + ((_VF128) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define VF_MBX_CPM_ATQBAH_MAX_INDEX 127 +#define VF_MBX_CPM_ATQBAH_ATQBAH_S 0 +#define VF_MBX_CPM_ATQBAH_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_MBX_CPM_ATQBAL(_VF128) (0x0022C800 + ((_VF128) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define VF_MBX_CPM_ATQBAL_MAX_INDEX 127 +#define VF_MBX_CPM_ATQBAL_ATQBAL_S 6 +#define VF_MBX_CPM_ATQBAL_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VF_MBX_CPM_ATQH(_VF128) (0x0022CE00 + ((_VF128) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define VF_MBX_CPM_ATQH_MAX_INDEX 127 +#define VF_MBX_CPM_ATQH_ATQH_S 0 +#define VF_MBX_CPM_ATQH_ATQH_M MAKEMASK(0x3FF, 0) +#define VF_MBX_CPM_ATQLEN(_VF128) (0x0022CC00 + ((_VF128) * 4)) /* _i=0...127 */ /* Reset Source: PFR */ +#define VF_MBX_CPM_ATQLEN_MAX_INDEX 127 +#define VF_MBX_CPM_ATQLEN_ATQLEN_S 0 +#define VF_MBX_CPM_ATQLEN_ATQLEN_M MAKEMASK(0x3FF, 0) +#define VF_MBX_CPM_ATQLEN_ATQVFE_S 28 +#define VF_MBX_CPM_ATQLEN_ATQVFE_M BIT(28) +#define VF_MBX_CPM_ATQLEN_ATQOVFL_S 29 +#define VF_MBX_CPM_ATQLEN_ATQOVFL_M BIT(29) +#define VF_MBX_CPM_ATQLEN_ATQCRIT_S 30 +#define VF_MBX_CPM_ATQLEN_ATQCRIT_M BIT(30) +#define VF_MBX_CPM_ATQLEN_ATQENABLE_S 31 +#define VF_MBX_CPM_ATQLEN_ATQENABLE_M BIT(31) +#define VF_MBX_CPM_ATQT(_VF128) (0x0022D000 + ((_VF128) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define VF_MBX_CPM_ATQT_MAX_INDEX 127 +#define VF_MBX_CPM_ATQT_ATQT_S 0 +#define VF_MBX_CPM_ATQT_ATQT_M MAKEMASK(0x3FF, 0) +#define VF_MBX_HLP_ARQBAH(_VF16) (0x0022DD80 + ((_VF16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VF_MBX_HLP_ARQBAH_MAX_INDEX 15 +#define VF_MBX_HLP_ARQBAH_ARQBAH_S 0 +#define VF_MBX_HLP_ARQBAH_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_MBX_HLP_ARQBAL(_VF16) (0x0022DD40 + ((_VF16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VF_MBX_HLP_ARQBAL_MAX_INDEX 15 +#define VF_MBX_HLP_ARQBAL_ARQBAL_LSB_S 0 +#define VF_MBX_HLP_ARQBAL_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define VF_MBX_HLP_ARQBAL_ARQBAL_S 6 +#define VF_MBX_HLP_ARQBAL_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VF_MBX_HLP_ARQH(_VF16) (0x0022DE00 + ((_VF16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VF_MBX_HLP_ARQH_MAX_INDEX 15 +#define VF_MBX_HLP_ARQH_ARQH_S 0 +#define VF_MBX_HLP_ARQH_ARQH_M MAKEMASK(0x3FF, 0) +#define VF_MBX_HLP_ARQLEN(_VF16) (0x0022DDC0 + ((_VF16) * 4)) /* _i=0...15 */ /* Reset Source: PFR */ +#define VF_MBX_HLP_ARQLEN_MAX_INDEX 15 +#define VF_MBX_HLP_ARQLEN_ARQLEN_S 0 +#define VF_MBX_HLP_ARQLEN_ARQLEN_M MAKEMASK(0x3FF, 0) +#define VF_MBX_HLP_ARQLEN_ARQVFE_S 28 +#define VF_MBX_HLP_ARQLEN_ARQVFE_M BIT(28) +#define VF_MBX_HLP_ARQLEN_ARQOVFL_S 29 +#define VF_MBX_HLP_ARQLEN_ARQOVFL_M BIT(29) +#define VF_MBX_HLP_ARQLEN_ARQCRIT_S 30 +#define VF_MBX_HLP_ARQLEN_ARQCRIT_M BIT(30) +#define VF_MBX_HLP_ARQLEN_ARQENABLE_S 31 +#define VF_MBX_HLP_ARQLEN_ARQENABLE_M BIT(31) +#define VF_MBX_HLP_ARQT(_VF16) (0x0022DE40 + ((_VF16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VF_MBX_HLP_ARQT_MAX_INDEX 15 +#define VF_MBX_HLP_ARQT_ARQT_S 0 +#define VF_MBX_HLP_ARQT_ARQT_M MAKEMASK(0x3FF, 0) +#define VF_MBX_HLP_ATQBAH(_VF16) (0x0022DC40 + ((_VF16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VF_MBX_HLP_ATQBAH_MAX_INDEX 15 +#define VF_MBX_HLP_ATQBAH_ATQBAH_S 0 +#define VF_MBX_HLP_ATQBAH_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_MBX_HLP_ATQBAL(_VF16) (0x0022DC00 + ((_VF16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VF_MBX_HLP_ATQBAL_MAX_INDEX 15 +#define VF_MBX_HLP_ATQBAL_ATQBAL_S 6 +#define VF_MBX_HLP_ATQBAL_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VF_MBX_HLP_ATQH(_VF16) (0x0022DCC0 + ((_VF16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VF_MBX_HLP_ATQH_MAX_INDEX 15 +#define VF_MBX_HLP_ATQH_ATQH_S 0 +#define VF_MBX_HLP_ATQH_ATQH_M MAKEMASK(0x3FF, 0) +#define VF_MBX_HLP_ATQLEN(_VF16) (0x0022DC80 + ((_VF16) * 4)) /* _i=0...15 */ /* Reset Source: PFR */ +#define VF_MBX_HLP_ATQLEN_MAX_INDEX 15 +#define VF_MBX_HLP_ATQLEN_ATQLEN_S 0 +#define VF_MBX_HLP_ATQLEN_ATQLEN_M MAKEMASK(0x3FF, 0) +#define VF_MBX_HLP_ATQLEN_ATQVFE_S 28 +#define VF_MBX_HLP_ATQLEN_ATQVFE_M BIT(28) +#define VF_MBX_HLP_ATQLEN_ATQOVFL_S 29 +#define VF_MBX_HLP_ATQLEN_ATQOVFL_M BIT(29) +#define VF_MBX_HLP_ATQLEN_ATQCRIT_S 30 +#define VF_MBX_HLP_ATQLEN_ATQCRIT_M BIT(30) +#define VF_MBX_HLP_ATQLEN_ATQENABLE_S 31 +#define VF_MBX_HLP_ATQLEN_ATQENABLE_M BIT(31) +#define VF_MBX_HLP_ATQT(_VF16) (0x0022DD00 + ((_VF16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VF_MBX_HLP_ATQT_MAX_INDEX 15 +#define VF_MBX_HLP_ATQT_ATQT_S 0 +#define VF_MBX_HLP_ATQT_ATQT_M MAKEMASK(0x3FF, 0) +#define VF_MBX_PSM_ARQBAH(_VF16) (0x0022E000 + ((_VF16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VF_MBX_PSM_ARQBAH_MAX_INDEX 15 +#define VF_MBX_PSM_ARQBAH_ARQBAH_S 0 +#define VF_MBX_PSM_ARQBAH_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_MBX_PSM_ARQBAL(_VF16) (0x0022DFC0 + ((_VF16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VF_MBX_PSM_ARQBAL_MAX_INDEX 15 +#define VF_MBX_PSM_ARQBAL_ARQBAL_LSB_S 0 +#define VF_MBX_PSM_ARQBAL_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define VF_MBX_PSM_ARQBAL_ARQBAL_S 6 +#define VF_MBX_PSM_ARQBAL_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VF_MBX_PSM_ARQH(_VF16) (0x0022E080 + ((_VF16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VF_MBX_PSM_ARQH_MAX_INDEX 15 +#define VF_MBX_PSM_ARQH_ARQH_S 0 +#define VF_MBX_PSM_ARQH_ARQH_M MAKEMASK(0x3FF, 0) +#define VF_MBX_PSM_ARQLEN(_VF16) (0x0022E040 + ((_VF16) * 4)) /* _i=0...15 */ /* Reset Source: PFR */ +#define VF_MBX_PSM_ARQLEN_MAX_INDEX 15 +#define VF_MBX_PSM_ARQLEN_ARQLEN_S 0 +#define VF_MBX_PSM_ARQLEN_ARQLEN_M MAKEMASK(0x3FF, 0) +#define VF_MBX_PSM_ARQLEN_ARQVFE_S 28 +#define VF_MBX_PSM_ARQLEN_ARQVFE_M BIT(28) +#define VF_MBX_PSM_ARQLEN_ARQOVFL_S 29 +#define VF_MBX_PSM_ARQLEN_ARQOVFL_M BIT(29) +#define VF_MBX_PSM_ARQLEN_ARQCRIT_S 30 +#define VF_MBX_PSM_ARQLEN_ARQCRIT_M BIT(30) +#define VF_MBX_PSM_ARQLEN_ARQENABLE_S 31 +#define VF_MBX_PSM_ARQLEN_ARQENABLE_M BIT(31) +#define VF_MBX_PSM_ARQT(_VF16) (0x0022E0C0 + ((_VF16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VF_MBX_PSM_ARQT_MAX_INDEX 15 +#define VF_MBX_PSM_ARQT_ARQT_S 0 +#define VF_MBX_PSM_ARQT_ARQT_M MAKEMASK(0x3FF, 0) +#define VF_MBX_PSM_ATQBAH(_VF16) (0x0022DEC0 + ((_VF16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VF_MBX_PSM_ATQBAH_MAX_INDEX 15 +#define VF_MBX_PSM_ATQBAH_ATQBAH_S 0 +#define VF_MBX_PSM_ATQBAH_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_MBX_PSM_ATQBAL(_VF16) (0x0022DE80 + ((_VF16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VF_MBX_PSM_ATQBAL_MAX_INDEX 15 +#define VF_MBX_PSM_ATQBAL_ATQBAL_S 6 +#define VF_MBX_PSM_ATQBAL_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VF_MBX_PSM_ATQH(_VF16) (0x0022DF40 + ((_VF16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VF_MBX_PSM_ATQH_MAX_INDEX 15 +#define VF_MBX_PSM_ATQH_ATQH_S 0 +#define VF_MBX_PSM_ATQH_ATQH_M MAKEMASK(0x3FF, 0) +#define VF_MBX_PSM_ATQLEN(_VF16) (0x0022DF00 + ((_VF16) * 4)) /* _i=0...15 */ /* Reset Source: PFR */ +#define VF_MBX_PSM_ATQLEN_MAX_INDEX 15 +#define VF_MBX_PSM_ATQLEN_ATQLEN_S 0 +#define VF_MBX_PSM_ATQLEN_ATQLEN_M MAKEMASK(0x3FF, 0) +#define VF_MBX_PSM_ATQLEN_ATQVFE_S 28 +#define VF_MBX_PSM_ATQLEN_ATQVFE_M BIT(28) +#define VF_MBX_PSM_ATQLEN_ATQOVFL_S 29 +#define VF_MBX_PSM_ATQLEN_ATQOVFL_M BIT(29) +#define VF_MBX_PSM_ATQLEN_ATQCRIT_S 30 +#define VF_MBX_PSM_ATQLEN_ATQCRIT_M BIT(30) +#define VF_MBX_PSM_ATQLEN_ATQENABLE_S 31 +#define VF_MBX_PSM_ATQLEN_ATQENABLE_M BIT(31) +#define VF_MBX_PSM_ATQT(_VF16) (0x0022DF80 + ((_VF16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VF_MBX_PSM_ATQT_MAX_INDEX 15 +#define VF_MBX_PSM_ATQT_ATQT_S 0 +#define VF_MBX_PSM_ATQT_ATQT_M MAKEMASK(0x3FF, 0) +#define VF_SB_CPM_ARQBAH(_VF128) (0x0022F400 + ((_VF128) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define VF_SB_CPM_ARQBAH_MAX_INDEX 127 +#define VF_SB_CPM_ARQBAH_ARQBAH_S 0 +#define VF_SB_CPM_ARQBAH_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_SB_CPM_ARQBAL(_VF128) (0x0022F200 + ((_VF128) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define VF_SB_CPM_ARQBAL_MAX_INDEX 127 +#define VF_SB_CPM_ARQBAL_ARQBAL_LSB_S 0 +#define VF_SB_CPM_ARQBAL_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define VF_SB_CPM_ARQBAL_ARQBAL_S 6 +#define VF_SB_CPM_ARQBAL_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VF_SB_CPM_ARQH(_VF128) (0x0022F800 + ((_VF128) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define VF_SB_CPM_ARQH_MAX_INDEX 127 +#define VF_SB_CPM_ARQH_ARQH_S 0 +#define VF_SB_CPM_ARQH_ARQH_M MAKEMASK(0x3FF, 0) +#define VF_SB_CPM_ARQLEN(_VF128) (0x0022F600 + ((_VF128) * 4)) /* _i=0...127 */ /* Reset Source: PFR */ +#define VF_SB_CPM_ARQLEN_MAX_INDEX 127 +#define VF_SB_CPM_ARQLEN_ARQLEN_S 0 +#define VF_SB_CPM_ARQLEN_ARQLEN_M MAKEMASK(0x3FF, 0) +#define VF_SB_CPM_ARQLEN_ARQVFE_S 28 +#define VF_SB_CPM_ARQLEN_ARQVFE_M BIT(28) +#define VF_SB_CPM_ARQLEN_ARQOVFL_S 29 +#define VF_SB_CPM_ARQLEN_ARQOVFL_M BIT(29) +#define VF_SB_CPM_ARQLEN_ARQCRIT_S 30 +#define VF_SB_CPM_ARQLEN_ARQCRIT_M BIT(30) +#define VF_SB_CPM_ARQLEN_ARQENABLE_S 31 +#define VF_SB_CPM_ARQLEN_ARQENABLE_M BIT(31) +#define VF_SB_CPM_ARQT(_VF128) (0x0022FA00 + ((_VF128) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define VF_SB_CPM_ARQT_MAX_INDEX 127 +#define VF_SB_CPM_ARQT_ARQT_S 0 +#define VF_SB_CPM_ARQT_ARQT_M MAKEMASK(0x3FF, 0) +#define VF_SB_CPM_ATQBAH(_VF128) (0x0022EA00 + ((_VF128) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define VF_SB_CPM_ATQBAH_MAX_INDEX 127 +#define VF_SB_CPM_ATQBAH_ATQBAH_S 0 +#define VF_SB_CPM_ATQBAH_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_SB_CPM_ATQBAL(_VF128) (0x0022E800 + ((_VF128) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define VF_SB_CPM_ATQBAL_MAX_INDEX 127 +#define VF_SB_CPM_ATQBAL_ATQBAL_S 6 +#define VF_SB_CPM_ATQBAL_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VF_SB_CPM_ATQH(_VF128) (0x0022EE00 + ((_VF128) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define VF_SB_CPM_ATQH_MAX_INDEX 127 +#define VF_SB_CPM_ATQH_ATQH_S 0 +#define VF_SB_CPM_ATQH_ATQH_M MAKEMASK(0x3FF, 0) +#define VF_SB_CPM_ATQLEN(_VF128) (0x0022EC00 + ((_VF128) * 4)) /* _i=0...127 */ /* Reset Source: PFR */ +#define VF_SB_CPM_ATQLEN_MAX_INDEX 127 +#define VF_SB_CPM_ATQLEN_ATQLEN_S 0 +#define VF_SB_CPM_ATQLEN_ATQLEN_M MAKEMASK(0x3FF, 0) +#define VF_SB_CPM_ATQLEN_ATQVFE_S 28 +#define VF_SB_CPM_ATQLEN_ATQVFE_M BIT(28) +#define VF_SB_CPM_ATQLEN_ATQOVFL_S 29 +#define VF_SB_CPM_ATQLEN_ATQOVFL_M BIT(29) +#define VF_SB_CPM_ATQLEN_ATQCRIT_S 30 +#define VF_SB_CPM_ATQLEN_ATQCRIT_M BIT(30) +#define VF_SB_CPM_ATQLEN_ATQENABLE_S 31 +#define VF_SB_CPM_ATQLEN_ATQENABLE_M BIT(31) +#define VF_SB_CPM_ATQT(_VF128) (0x0022F000 + ((_VF128) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define VF_SB_CPM_ATQT_MAX_INDEX 127 +#define VF_SB_CPM_ATQT_ATQT_S 0 +#define VF_SB_CPM_ATQT_ATQT_M MAKEMASK(0x3FF, 0) +#define VF_SB_CPM_REM_DEV_CTL 0x002300EC /* Reset Source: CORER */ +#define VF_SB_CPM_REM_DEV_CTL_DEST_EN_S 0 +#define VF_SB_CPM_REM_DEV_CTL_DEST_EN_M MAKEMASK(0xFFFF, 0) +#define VP_MBX_CPM_PF_VF_CTRL(_VP128) (0x00231800 + ((_VP128) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define VP_MBX_CPM_PF_VF_CTRL_MAX_INDEX 127 +#define VP_MBX_CPM_PF_VF_CTRL_QUEUE_EN_S 0 +#define VP_MBX_CPM_PF_VF_CTRL_QUEUE_EN_M BIT(0) +#define VP_MBX_HLP_PF_VF_CTRL(_VP16) (0x00231A00 + ((_VP16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VP_MBX_HLP_PF_VF_CTRL_MAX_INDEX 15 +#define VP_MBX_HLP_PF_VF_CTRL_QUEUE_EN_S 0 +#define VP_MBX_HLP_PF_VF_CTRL_QUEUE_EN_M BIT(0) +#define VP_MBX_PF_VF_CTRL(_VSI) (0x00230800 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VP_MBX_PF_VF_CTRL_MAX_INDEX 767 +#define VP_MBX_PF_VF_CTRL_QUEUE_EN_S 0 +#define VP_MBX_PF_VF_CTRL_QUEUE_EN_M BIT(0) +#define VP_MBX_PSM_PF_VF_CTRL(_VP16) (0x00231A40 + ((_VP16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VP_MBX_PSM_PF_VF_CTRL_MAX_INDEX 15 +#define VP_MBX_PSM_PF_VF_CTRL_QUEUE_EN_S 0 +#define VP_MBX_PSM_PF_VF_CTRL_QUEUE_EN_M BIT(0) +#define VP_SB_CPM_PF_VF_CTRL(_VP128) (0x00231C00 + ((_VP128) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define VP_SB_CPM_PF_VF_CTRL_MAX_INDEX 127 +#define VP_SB_CPM_PF_VF_CTRL_QUEUE_EN_S 0 +#define VP_SB_CPM_PF_VF_CTRL_QUEUE_EN_M BIT(0) +#define GL_DCB_TDSCP2TC_BLOCK_DIS 0x00049218 /* Reset Source: CORER */ +#define GL_DCB_TDSCP2TC_BLOCK_DIS_DSCP2TC_BLOCK_DIS_S 0 +#define GL_DCB_TDSCP2TC_BLOCK_DIS_DSCP2TC_BLOCK_DIS_M BIT(0) +#define GL_DCB_TDSCP2TC_BLOCK_IPV4(_i) (0x00049018 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: CORER */ +#define GL_DCB_TDSCP2TC_BLOCK_IPV4_MAX_INDEX 63 +#define GL_DCB_TDSCP2TC_BLOCK_IPV4_TC_BLOCK_LUT_S 0 +#define GL_DCB_TDSCP2TC_BLOCK_IPV4_TC_BLOCK_LUT_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_DCB_TDSCP2TC_BLOCK_IPV6(_i) (0x00049118 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: CORER */ +#define GL_DCB_TDSCP2TC_BLOCK_IPV6_MAX_INDEX 63 +#define GL_DCB_TDSCP2TC_BLOCK_IPV6_TC_BLOCK_LUT_S 0 +#define GL_DCB_TDSCP2TC_BLOCK_IPV6_TC_BLOCK_LUT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLDCB_GENC 0x00083044 /* Reset Source: CORER */ +#define GLDCB_GENC_PCIRTT_S 0 +#define GLDCB_GENC_PCIRTT_M MAKEMASK(0xFFFF, 0) +#define GLDCB_PRS_RETSTCC(_i) (0x002000B0 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLDCB_PRS_RETSTCC_MAX_INDEX 31 +#define GLDCB_PRS_RETSTCC_BWSHARE_S 0 +#define GLDCB_PRS_RETSTCC_BWSHARE_M MAKEMASK(0x7F, 0) +#define GLDCB_PRS_RETSTCC_ETSTC_S 31 +#define GLDCB_PRS_RETSTCC_ETSTC_M BIT(31) +#define GLDCB_PRS_RSPMC 0x00200160 /* Reset Source: CORER */ +#define GLDCB_PRS_RSPMC_RSPM_S 0 +#define GLDCB_PRS_RSPMC_RSPM_M MAKEMASK(0xFF, 0) +#define GLDCB_PRS_RSPMC_RPM_MODE_S 8 +#define GLDCB_PRS_RSPMC_RPM_MODE_M MAKEMASK(0x3, 8) +#define GLDCB_PRS_RSPMC_PRR_MAX_EXP_S 10 +#define GLDCB_PRS_RSPMC_PRR_MAX_EXP_M MAKEMASK(0xF, 10) +#define GLDCB_PRS_RSPMC_PFCTIMER_S 14 +#define GLDCB_PRS_RSPMC_PFCTIMER_M MAKEMASK(0x3FFF, 14) +#define GLDCB_PRS_RSPMC_RPM_DIS_S 31 +#define GLDCB_PRS_RSPMC_RPM_DIS_M BIT(31) +#define GLDCB_RETSTCC(_i) (0x00122140 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLDCB_RETSTCC_MAX_INDEX 31 +#define GLDCB_RETSTCC_BWSHARE_S 0 +#define GLDCB_RETSTCC_BWSHARE_M MAKEMASK(0x7F, 0) +#define GLDCB_RETSTCC_ETSTC_S 31 +#define GLDCB_RETSTCC_ETSTC_M BIT(31) +#define GLDCB_RETSTCS(_i) (0x001221C0 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLDCB_RETSTCS_MAX_INDEX 31 +#define GLDCB_RETSTCS_CREDITS_S 0 +#define GLDCB_RETSTCS_CREDITS_M MAKEMASK(0xFFFFFFFF, 0) +#define GLDCB_RTC2PFC_RCB 0x00122100 /* Reset Source: CORER */ +#define GLDCB_RTC2PFC_RCB_TC2PFC_S 0 +#define GLDCB_RTC2PFC_RCB_TC2PFC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLDCB_SWT_RETSTCC(_i) (0x0020A040 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLDCB_SWT_RETSTCC_MAX_INDEX 31 +#define GLDCB_SWT_RETSTCC_BWSHARE_S 0 +#define GLDCB_SWT_RETSTCC_BWSHARE_M MAKEMASK(0x7F, 0) +#define GLDCB_SWT_RETSTCC_ETSTC_S 31 +#define GLDCB_SWT_RETSTCC_ETSTC_M BIT(31) +#define GLDCB_TC2PFC 0x001D2694 /* Reset Source: CORER */ +#define GLDCB_TC2PFC_TC2PFC_S 0 +#define GLDCB_TC2PFC_TC2PFC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLDCB_TCB_MNG_SP 0x000AE12C /* Reset Source: CORER */ +#define GLDCB_TCB_MNG_SP_MNG_SP_S 0 +#define GLDCB_TCB_MNG_SP_MNG_SP_M BIT(0) +#define GLDCB_TCB_TCLL_CFG 0x000AE134 /* Reset Source: CORER */ +#define GLDCB_TCB_TCLL_CFG_LLTC_S 0 +#define GLDCB_TCB_TCLL_CFG_LLTC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLDCB_TCB_WB_SP 0x000AE310 /* Reset Source: CORER */ +#define GLDCB_TCB_WB_SP_WB_SP_S 0 +#define GLDCB_TCB_WB_SP_WB_SP_M BIT(0) +#define GLDCB_TCUPM_IMM_EN 0x000BC824 /* Reset Source: CORER */ +#define GLDCB_TCUPM_IMM_EN_IMM_EN_S 0 +#define GLDCB_TCUPM_IMM_EN_IMM_EN_M MAKEMASK(0xFFFFFFFF, 0) +#define GLDCB_TCUPM_LEGACY_TC 0x000BC828 /* Reset Source: CORER */ +#define GLDCB_TCUPM_LEGACY_TC_LEGTC_S 0 +#define GLDCB_TCUPM_LEGACY_TC_LEGTC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLDCB_TCUPM_NO_EXCEED_DIS 0x000BC830 /* Reset Source: CORER */ +#define GLDCB_TCUPM_NO_EXCEED_DIS_NON_EXCEED_DIS_S 0 +#define GLDCB_TCUPM_NO_EXCEED_DIS_NON_EXCEED_DIS_M BIT(0) +#define GLDCB_TCUPM_WB_DIS 0x000BC834 /* Reset Source: CORER */ +#define GLDCB_TCUPM_WB_DIS_PORT_DISABLE_S 0 +#define GLDCB_TCUPM_WB_DIS_PORT_DISABLE_M BIT(0) +#define GLDCB_TCUPM_WB_DIS_TC_DISABLE_S 1 +#define GLDCB_TCUPM_WB_DIS_TC_DISABLE_M BIT(1) +#define GLDCB_TFPFCI 0x0009949C /* Reset Source: CORER */ +#define GLDCB_TFPFCI_GLDCB_TFPFCI_S 0 +#define GLDCB_TFPFCI_GLDCB_TFPFCI_M MAKEMASK(0xFFFFFFFF, 0) +#define GLDCB_TLPM_IMM_TCB 0x000A0190 /* Reset Source: CORER */ +#define GLDCB_TLPM_IMM_TCB_IMM_EN_S 0 +#define GLDCB_TLPM_IMM_TCB_IMM_EN_M MAKEMASK(0xFFFFFFFF, 0) +#define GLDCB_TLPM_IMM_TCUPM 0x000A018C /* Reset Source: CORER */ +#define GLDCB_TLPM_IMM_TCUPM_IMM_EN_S 0 +#define GLDCB_TLPM_IMM_TCUPM_IMM_EN_M MAKEMASK(0xFFFFFFFF, 0) +#define GLDCB_TLPM_PCI_DM 0x000A0180 /* Reset Source: CORER */ +#define GLDCB_TLPM_PCI_DM_MONITOR_S 0 +#define GLDCB_TLPM_PCI_DM_MONITOR_M MAKEMASK(0x7FFFF, 0) +#define GLDCB_TLPM_PCI_DTHR 0x000A0184 /* Reset Source: CORER */ +#define GLDCB_TLPM_PCI_DTHR_PCI_TDATA_S 0 +#define GLDCB_TLPM_PCI_DTHR_PCI_TDATA_M MAKEMASK(0xFFF, 0) +#define GLDCB_TPB_IMM_TLPM 0x00099468 /* Reset Source: CORER */ +#define GLDCB_TPB_IMM_TLPM_IMM_EN_S 0 +#define GLDCB_TPB_IMM_TLPM_IMM_EN_M MAKEMASK(0xFFFFFFFF, 0) +#define GLDCB_TPB_IMM_TPB 0x0009946C /* Reset Source: CORER */ +#define GLDCB_TPB_IMM_TPB_IMM_EN_S 0 +#define GLDCB_TPB_IMM_TPB_IMM_EN_M MAKEMASK(0xFFFFFFFF, 0) +#define GLDCB_TPB_TCLL_CFG 0x00099464 /* Reset Source: CORER */ +#define GLDCB_TPB_TCLL_CFG_LLTC_S 0 +#define GLDCB_TPB_TCLL_CFG_LLTC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTCB_BULK_DWRR_REG_QUANTA 0x000AE0E0 /* Reset Source: CORER */ +#define GLTCB_BULK_DWRR_REG_QUANTA_QUANTA_S 0 +#define GLTCB_BULK_DWRR_REG_QUANTA_QUANTA_M MAKEMASK(0x7FF, 0) +#define GLTCB_BULK_DWRR_REG_SAT 0x000AE0F0 /* Reset Source: CORER */ +#define GLTCB_BULK_DWRR_REG_SAT_SATURATION_S 0 +#define GLTCB_BULK_DWRR_REG_SAT_SATURATION_M MAKEMASK(0x1FFFF, 0) +#define GLTCB_BULK_DWRR_WB_QUANTA 0x000AE0E4 /* Reset Source: CORER */ +#define GLTCB_BULK_DWRR_WB_QUANTA_QUANTA_S 0 +#define GLTCB_BULK_DWRR_WB_QUANTA_QUANTA_M MAKEMASK(0x7FF, 0) +#define GLTCB_BULK_DWRR_WB_SAT 0x000AE0F4 /* Reset Source: CORER */ +#define GLTCB_BULK_DWRR_WB_SAT_SATURATION_S 0 +#define GLTCB_BULK_DWRR_WB_SAT_SATURATION_M MAKEMASK(0x1FFFF, 0) +#define GLTCB_CREDIT_EXP_CTL 0x000AE120 /* Reset Source: CORER */ +#define GLTCB_CREDIT_EXP_CTL_EN_S 0 +#define GLTCB_CREDIT_EXP_CTL_EN_M BIT(0) +#define GLTCB_CREDIT_EXP_CTL_MIN_PKT_S 1 +#define GLTCB_CREDIT_EXP_CTL_MIN_PKT_M MAKEMASK(0x1FF, 1) +#define GLTCB_LL_DWRR_REG_QUANTA 0x000AE0E8 /* Reset Source: CORER */ +#define GLTCB_LL_DWRR_REG_QUANTA_QUANTA_S 0 +#define GLTCB_LL_DWRR_REG_QUANTA_QUANTA_M MAKEMASK(0x7FF, 0) +#define GLTCB_LL_DWRR_REG_SAT 0x000AE0F8 /* Reset Source: CORER */ +#define GLTCB_LL_DWRR_REG_SAT_SATURATION_S 0 +#define GLTCB_LL_DWRR_REG_SAT_SATURATION_M MAKEMASK(0x1FFFF, 0) +#define GLTCB_LL_DWRR_WB_QUANTA 0x000AE0EC /* Reset Source: CORER */ +#define GLTCB_LL_DWRR_WB_QUANTA_QUANTA_S 0 +#define GLTCB_LL_DWRR_WB_QUANTA_QUANTA_M MAKEMASK(0x7FF, 0) +#define GLTCB_LL_DWRR_WB_SAT 0x000AE0FC /* Reset Source: CORER */ +#define GLTCB_LL_DWRR_WB_SAT_SATURATION_S 0 +#define GLTCB_LL_DWRR_WB_SAT_SATURATION_M MAKEMASK(0x1FFFF, 0) +#define GLTCB_WB_RL 0x000AE238 /* Reset Source: CORER */ +#define GLTCB_WB_RL_PERIOD_S 0 +#define GLTCB_WB_RL_PERIOD_M MAKEMASK(0xFFFF, 0) +#define GLTCB_WB_RL_EN_S 16 +#define GLTCB_WB_RL_EN_M BIT(16) +#define GLTPB_WB_RL 0x00099460 /* Reset Source: CORER */ +#define GLTPB_WB_RL_PERIOD_S 0 +#define GLTPB_WB_RL_PERIOD_M MAKEMASK(0xFFFF, 0) +#define GLTPB_WB_RL_EN_S 16 +#define GLTPB_WB_RL_EN_M BIT(16) +#define PRTDCB_FCCFG 0x001E4640 /* Reset Source: GLOBR */ +#define PRTDCB_FCCFG_TFCE_S 3 +#define PRTDCB_FCCFG_TFCE_M MAKEMASK(0x3, 3) +#define PRTDCB_FCRTV 0x001E4600 /* Reset Source: GLOBR */ +#define PRTDCB_FCRTV_FC_REFRESH_TH_S 0 +#define PRTDCB_FCRTV_FC_REFRESH_TH_M MAKEMASK(0xFFFF, 0) +#define PRTDCB_FCTTVN(_i) (0x001E4580 + ((_i) * 32)) /* _i=0...3 */ /* Reset Source: GLOBR */ +#define PRTDCB_FCTTVN_MAX_INDEX 3 +#define PRTDCB_FCTTVN_TTV_2N_S 0 +#define PRTDCB_FCTTVN_TTV_2N_M MAKEMASK(0xFFFF, 0) +#define PRTDCB_FCTTVN_TTV_2N_P1_S 16 +#define PRTDCB_FCTTVN_TTV_2N_P1_M MAKEMASK(0xFFFF, 16) +#define PRTDCB_GENC 0x00083000 /* Reset Source: CORER */ +#define PRTDCB_GENC_NUMTC_S 2 +#define PRTDCB_GENC_NUMTC_M MAKEMASK(0xF, 2) +#define PRTDCB_GENC_FCOEUP_S 6 +#define PRTDCB_GENC_FCOEUP_M MAKEMASK(0x7, 6) +#define PRTDCB_GENC_FCOEUP_VALID_S 9 +#define PRTDCB_GENC_FCOEUP_VALID_M BIT(9) +#define PRTDCB_GENC_PFCLDA_S 16 +#define PRTDCB_GENC_PFCLDA_M MAKEMASK(0xFFFF, 16) +#define PRTDCB_GENS 0x00083020 /* Reset Source: CORER */ +#define PRTDCB_GENS_DCBX_STATUS_S 0 +#define PRTDCB_GENS_DCBX_STATUS_M MAKEMASK(0x7, 0) +#define PRTDCB_PRS_RETSC 0x002001A0 /* Reset Source: CORER */ +#define PRTDCB_PRS_RETSC_ETS_MODE_S 0 +#define PRTDCB_PRS_RETSC_ETS_MODE_M BIT(0) +#define PRTDCB_PRS_RETSC_NON_ETS_MODE_S 1 +#define PRTDCB_PRS_RETSC_NON_ETS_MODE_M BIT(1) +#define PRTDCB_PRS_RETSC_ETS_MAX_EXP_S 2 +#define PRTDCB_PRS_RETSC_ETS_MAX_EXP_M MAKEMASK(0xF, 2) +#define PRTDCB_PRS_RPRRC 0x00200180 /* Reset Source: CORER */ +#define PRTDCB_PRS_RPRRC_BWSHARE_S 0 +#define PRTDCB_PRS_RPRRC_BWSHARE_M MAKEMASK(0x3FF, 0) +#define PRTDCB_PRS_RPRRC_BWSHARE_DIS_S 31 +#define PRTDCB_PRS_RPRRC_BWSHARE_DIS_M BIT(31) +#define PRTDCB_RETSC 0x001222A0 /* Reset Source: CORER */ +#define PRTDCB_RETSC_ETS_MODE_S 0 +#define PRTDCB_RETSC_ETS_MODE_M BIT(0) +#define PRTDCB_RETSC_NON_ETS_MODE_S 1 +#define PRTDCB_RETSC_NON_ETS_MODE_M BIT(1) +#define PRTDCB_RETSC_ETS_MAX_EXP_S 2 +#define PRTDCB_RETSC_ETS_MAX_EXP_M MAKEMASK(0xF, 2) +#define PRTDCB_RPRRC 0x001220C0 /* Reset Source: CORER */ +#define PRTDCB_RPRRC_BWSHARE_S 0 +#define PRTDCB_RPRRC_BWSHARE_M MAKEMASK(0x3FF, 0) +#define PRTDCB_RPRRC_BWSHARE_DIS_S 31 +#define PRTDCB_RPRRC_BWSHARE_DIS_M BIT(31) +#define PRTDCB_RPRRS 0x001220E0 /* Reset Source: CORER */ +#define PRTDCB_RPRRS_CREDITS_S 0 +#define PRTDCB_RPRRS_CREDITS_M MAKEMASK(0xFFFFFFFF, 0) +#define PRTDCB_RUP_TDPU 0x00040960 /* Reset Source: CORER */ +#define PRTDCB_RUP_TDPU_NOVLANUP_S 0 +#define PRTDCB_RUP_TDPU_NOVLANUP_M MAKEMASK(0x7, 0) +#define PRTDCB_RUP2TC 0x001D2640 /* Reset Source: CORER */ +#define PRTDCB_RUP2TC_UP0TC_S 0 +#define PRTDCB_RUP2TC_UP0TC_M MAKEMASK(0x7, 0) +#define PRTDCB_RUP2TC_UP1TC_S 3 +#define PRTDCB_RUP2TC_UP1TC_M MAKEMASK(0x7, 3) +#define PRTDCB_RUP2TC_UP2TC_S 6 +#define PRTDCB_RUP2TC_UP2TC_M MAKEMASK(0x7, 6) +#define PRTDCB_RUP2TC_UP3TC_S 9 +#define PRTDCB_RUP2TC_UP3TC_M MAKEMASK(0x7, 9) +#define PRTDCB_RUP2TC_UP4TC_S 12 +#define PRTDCB_RUP2TC_UP4TC_M MAKEMASK(0x7, 12) +#define PRTDCB_RUP2TC_UP5TC_S 15 +#define PRTDCB_RUP2TC_UP5TC_M MAKEMASK(0x7, 15) +#define PRTDCB_RUP2TC_UP6TC_S 18 +#define PRTDCB_RUP2TC_UP6TC_M MAKEMASK(0x7, 18) +#define PRTDCB_RUP2TC_UP7TC_S 21 +#define PRTDCB_RUP2TC_UP7TC_M MAKEMASK(0x7, 21) +#define PRTDCB_SWT_RETSC 0x0020A140 /* Reset Source: CORER */ +#define PRTDCB_SWT_RETSC_ETS_MODE_S 0 +#define PRTDCB_SWT_RETSC_ETS_MODE_M BIT(0) +#define PRTDCB_SWT_RETSC_NON_ETS_MODE_S 1 +#define PRTDCB_SWT_RETSC_NON_ETS_MODE_M BIT(1) +#define PRTDCB_SWT_RETSC_ETS_MAX_EXP_S 2 +#define PRTDCB_SWT_RETSC_ETS_MAX_EXP_M MAKEMASK(0xF, 2) +#define PRTDCB_TCB_DWRR_CREDITS 0x000AE000 /* Reset Source: CORER */ +#define PRTDCB_TCB_DWRR_CREDITS_CREDITS_S 0 +#define PRTDCB_TCB_DWRR_CREDITS_CREDITS_M MAKEMASK(0x3FFFF, 0) +#define PRTDCB_TCB_DWRR_QUANTA 0x000AE020 /* Reset Source: CORER */ +#define PRTDCB_TCB_DWRR_QUANTA_QUANTA_S 0 +#define PRTDCB_TCB_DWRR_QUANTA_QUANTA_M MAKEMASK(0x7FF, 0) +#define PRTDCB_TCB_DWRR_SAT 0x000AE040 /* Reset Source: CORER */ +#define PRTDCB_TCB_DWRR_SAT_SATURATION_S 0 +#define PRTDCB_TCB_DWRR_SAT_SATURATION_M MAKEMASK(0x1FFFF, 0) +#define PRTDCB_TCUPM_NO_EXCEED_DM 0x000BC3C0 /* Reset Source: CORER */ +#define PRTDCB_TCUPM_NO_EXCEED_DM_MONITOR_S 0 +#define PRTDCB_TCUPM_NO_EXCEED_DM_MONITOR_M MAKEMASK(0x7FFFF, 0) +#define PRTDCB_TCUPM_REG_CM 0x000BC360 /* Reset Source: CORER */ +#define PRTDCB_TCUPM_REG_CM_MONITOR_S 0 +#define PRTDCB_TCUPM_REG_CM_MONITOR_M MAKEMASK(0x7FFF, 0) +#define PRTDCB_TCUPM_REG_CTHR 0x000BC380 /* Reset Source: CORER */ +#define PRTDCB_TCUPM_REG_CTHR_PORTOFFTH_H_S 0 +#define PRTDCB_TCUPM_REG_CTHR_PORTOFFTH_H_M MAKEMASK(0x7FFF, 0) +#define PRTDCB_TCUPM_REG_CTHR_PORTOFFTH_L_S 15 +#define PRTDCB_TCUPM_REG_CTHR_PORTOFFTH_L_M MAKEMASK(0x7FFF, 15) +#define PRTDCB_TCUPM_REG_DM 0x000BC3A0 /* Reset Source: CORER */ +#define PRTDCB_TCUPM_REG_DM_MONITOR_S 0 +#define PRTDCB_TCUPM_REG_DM_MONITOR_M MAKEMASK(0x7FFFF, 0) +#define PRTDCB_TCUPM_REG_DTHR 0x000BC3E0 /* Reset Source: CORER */ +#define PRTDCB_TCUPM_REG_DTHR_PORTOFFTH_H_S 0 +#define PRTDCB_TCUPM_REG_DTHR_PORTOFFTH_H_M MAKEMASK(0xFFF, 0) +#define PRTDCB_TCUPM_REG_DTHR_PORTOFFTH_L_S 12 +#define PRTDCB_TCUPM_REG_DTHR_PORTOFFTH_L_M MAKEMASK(0xFFF, 12) +#define PRTDCB_TCUPM_REG_PE_HB_DM 0x000BC400 /* Reset Source: CORER */ +#define PRTDCB_TCUPM_REG_PE_HB_DM_MONITOR_S 0 +#define PRTDCB_TCUPM_REG_PE_HB_DM_MONITOR_M MAKEMASK(0xFFF, 0) +#define PRTDCB_TCUPM_REG_PE_HB_DTHR 0x000BC420 /* Reset Source: CORER */ +#define PRTDCB_TCUPM_REG_PE_HB_DTHR_PORTOFFTH_H_S 0 +#define PRTDCB_TCUPM_REG_PE_HB_DTHR_PORTOFFTH_H_M MAKEMASK(0xFFF, 0) +#define PRTDCB_TCUPM_REG_PE_HB_DTHR_PORTOFFTH_L_S 12 +#define PRTDCB_TCUPM_REG_PE_HB_DTHR_PORTOFFTH_L_M MAKEMASK(0xFFF, 12) +#define PRTDCB_TCUPM_WAIT_PFC_CM 0x000BC440 /* Reset Source: CORER */ +#define PRTDCB_TCUPM_WAIT_PFC_CM_MONITOR_S 0 +#define PRTDCB_TCUPM_WAIT_PFC_CM_MONITOR_M MAKEMASK(0x7FFF, 0) +#define PRTDCB_TCUPM_WAIT_PFC_CTHR 0x000BC460 /* Reset Source: CORER */ +#define PRTDCB_TCUPM_WAIT_PFC_CTHR_PORTOFFTH_S 0 +#define PRTDCB_TCUPM_WAIT_PFC_CTHR_PORTOFFTH_M MAKEMASK(0x7FFF, 0) +#define PRTDCB_TCUPM_WAIT_PFC_DM 0x000BC480 /* Reset Source: CORER */ +#define PRTDCB_TCUPM_WAIT_PFC_DM_MONITOR_S 0 +#define PRTDCB_TCUPM_WAIT_PFC_DM_MONITOR_M MAKEMASK(0x7FFFF, 0) +#define PRTDCB_TCUPM_WAIT_PFC_DTHR 0x000BC4A0 /* Reset Source: CORER */ +#define PRTDCB_TCUPM_WAIT_PFC_DTHR_PORTOFFTH_S 0 +#define PRTDCB_TCUPM_WAIT_PFC_DTHR_PORTOFFTH_M MAKEMASK(0xFFF, 0) +#define PRTDCB_TCUPM_WAIT_PFC_PE_HB_DM 0x000BC4C0 /* Reset Source: CORER */ +#define PRTDCB_TCUPM_WAIT_PFC_PE_HB_DM_MONITOR_S 0 +#define PRTDCB_TCUPM_WAIT_PFC_PE_HB_DM_MONITOR_M MAKEMASK(0xFFF, 0) +#define PRTDCB_TCUPM_WAIT_PFC_PE_HB_DTHR 0x000BC4E0 /* Reset Source: CORER */ +#define PRTDCB_TCUPM_WAIT_PFC_PE_HB_DTHR_PORTOFFTH_S 0 +#define PRTDCB_TCUPM_WAIT_PFC_PE_HB_DTHR_PORTOFFTH_M MAKEMASK(0xFFF, 0) +#define PRTDCB_TDPUC 0x00040940 /* Reset Source: CORER */ +#define PRTDCB_TDPUC_MAX_TXFRAME_S 0 +#define PRTDCB_TDPUC_MAX_TXFRAME_M MAKEMASK(0xFFFF, 0) +#define PRTDCB_TDPUC_MAL_LENGTH_S 16 +#define PRTDCB_TDPUC_MAL_LENGTH_M BIT(16) +#define PRTDCB_TDPUC_MAL_CMD_S 17 +#define PRTDCB_TDPUC_MAL_CMD_M BIT(17) +#define PRTDCB_TDPUC_TTL_DROP_S 18 +#define PRTDCB_TDPUC_TTL_DROP_M BIT(18) +#define PRTDCB_TDPUC_UR_DROP_S 19 +#define PRTDCB_TDPUC_UR_DROP_M BIT(19) +#define PRTDCB_TDPUC_DUMMY_S 20 +#define PRTDCB_TDPUC_DUMMY_M BIT(20) +#define PRTDCB_TDPUC_BIG_PKT_SIZE_S 21 +#define PRTDCB_TDPUC_BIG_PKT_SIZE_M BIT(21) +#define PRTDCB_TDPUC_L2_ACCEPT_FAIL_S 22 +#define PRTDCB_TDPUC_L2_ACCEPT_FAIL_M BIT(22) +#define PRTDCB_TDPUC_DSCP_CHECK_FAIL_S 23 +#define PRTDCB_TDPUC_DSCP_CHECK_FAIL_M BIT(23) +#define PRTDCB_TDPUC_RCU_ANTISPOOF_S 24 +#define PRTDCB_TDPUC_RCU_ANTISPOOF_M BIT(24) +#define PRTDCB_TDPUC_NIC_DSI_S 25 +#define PRTDCB_TDPUC_NIC_DSI_M BIT(25) +#define PRTDCB_TDPUC_NIC_IPSEC_S 26 +#define PRTDCB_TDPUC_NIC_IPSEC_M BIT(26) +#define PRTDCB_TDPUC_CLEAR_DROP_S 31 +#define PRTDCB_TDPUC_CLEAR_DROP_M BIT(31) +#define PRTDCB_TFCS 0x001E4560 /* Reset Source: GLOBR */ +#define PRTDCB_TFCS_TXOFF_S 0 +#define PRTDCB_TFCS_TXOFF_M BIT(0) +#define PRTDCB_TFCS_TXOFF0_S 8 +#define PRTDCB_TFCS_TXOFF0_M BIT(8) +#define PRTDCB_TFCS_TXOFF1_S 9 +#define PRTDCB_TFCS_TXOFF1_M BIT(9) +#define PRTDCB_TFCS_TXOFF2_S 10 +#define PRTDCB_TFCS_TXOFF2_M BIT(10) +#define PRTDCB_TFCS_TXOFF3_S 11 +#define PRTDCB_TFCS_TXOFF3_M BIT(11) +#define PRTDCB_TFCS_TXOFF4_S 12 +#define PRTDCB_TFCS_TXOFF4_M BIT(12) +#define PRTDCB_TFCS_TXOFF5_S 13 +#define PRTDCB_TFCS_TXOFF5_M BIT(13) +#define PRTDCB_TFCS_TXOFF6_S 14 +#define PRTDCB_TFCS_TXOFF6_M BIT(14) +#define PRTDCB_TFCS_TXOFF7_S 15 +#define PRTDCB_TFCS_TXOFF7_M BIT(15) +#define PRTDCB_TLPM_REG_DM 0x000A0000 /* Reset Source: CORER */ +#define PRTDCB_TLPM_REG_DM_MONITOR_S 0 +#define PRTDCB_TLPM_REG_DM_MONITOR_M MAKEMASK(0x7FFFF, 0) +#define PRTDCB_TLPM_REG_DTHR 0x000A0020 /* Reset Source: CORER */ +#define PRTDCB_TLPM_REG_DTHR_PORTOFFTH_H_S 0 +#define PRTDCB_TLPM_REG_DTHR_PORTOFFTH_H_M MAKEMASK(0xFFF, 0) +#define PRTDCB_TLPM_REG_DTHR_PORTOFFTH_L_S 12 +#define PRTDCB_TLPM_REG_DTHR_PORTOFFTH_L_M MAKEMASK(0xFFF, 12) +#define PRTDCB_TLPM_WAIT_PFC_DM 0x000A0040 /* Reset Source: CORER */ +#define PRTDCB_TLPM_WAIT_PFC_DM_MONITOR_S 0 +#define PRTDCB_TLPM_WAIT_PFC_DM_MONITOR_M MAKEMASK(0x7FFFF, 0) +#define PRTDCB_TLPM_WAIT_PFC_DTHR 0x000A0060 /* Reset Source: CORER */ +#define PRTDCB_TLPM_WAIT_PFC_DTHR_PORTOFFTH_S 0 +#define PRTDCB_TLPM_WAIT_PFC_DTHR_PORTOFFTH_M MAKEMASK(0xFFF, 0) +#define PRTDCB_TPFCTS(_i) (0x001E4660 + ((_i) * 32)) /* _i=0...7 */ /* Reset Source: GLOBR */ +#define PRTDCB_TPFCTS_MAX_INDEX 7 +#define PRTDCB_TPFCTS_PFCTIMER_S 0 +#define PRTDCB_TPFCTS_PFCTIMER_M MAKEMASK(0x3FFF, 0) +#define PRTDCB_TUP2TC 0x001D26C0 /* Reset Source: CORER */ +#define PRTDCB_TUP2TC_UP0TC_S 0 +#define PRTDCB_TUP2TC_UP0TC_M MAKEMASK(0x7, 0) +#define PRTDCB_TUP2TC_UP1TC_S 3 +#define PRTDCB_TUP2TC_UP1TC_M MAKEMASK(0x7, 3) +#define PRTDCB_TUP2TC_UP2TC_S 6 +#define PRTDCB_TUP2TC_UP2TC_M MAKEMASK(0x7, 6) +#define PRTDCB_TUP2TC_UP3TC_S 9 +#define PRTDCB_TUP2TC_UP3TC_M MAKEMASK(0x7, 9) +#define PRTDCB_TUP2TC_UP4TC_S 12 +#define PRTDCB_TUP2TC_UP4TC_M MAKEMASK(0x7, 12) +#define PRTDCB_TUP2TC_UP5TC_S 15 +#define PRTDCB_TUP2TC_UP5TC_M MAKEMASK(0x7, 15) +#define PRTDCB_TUP2TC_UP6TC_S 18 +#define PRTDCB_TUP2TC_UP6TC_M MAKEMASK(0x7, 18) +#define PRTDCB_TUP2TC_UP7TC_S 21 +#define PRTDCB_TUP2TC_UP7TC_M MAKEMASK(0x7, 21) +#define PRTDCB_TX_DSCP2UP_CTL 0x00040980 /* Reset Source: CORER */ +#define PRTDCB_TX_DSCP2UP_CTL_DSCP2UP_ENA_S 0 +#define PRTDCB_TX_DSCP2UP_CTL_DSCP2UP_ENA_M BIT(0) +#define PRTDCB_TX_DSCP2UP_CTL_DSCP_DEFAULT_UP_S 1 +#define PRTDCB_TX_DSCP2UP_CTL_DSCP_DEFAULT_UP_M MAKEMASK(0x7, 1) +#define PRTDCB_TX_DSCP2UP_IPV4_LUT(_i) (0x000409A0 + ((_i) * 32)) /* _i=0...7 */ /* Reset Source: CORER */ +#define PRTDCB_TX_DSCP2UP_IPV4_LUT_MAX_INDEX 7 +#define PRTDCB_TX_DSCP2UP_IPV4_LUT_DSCP2UP_LUT_0_S 0 +#define PRTDCB_TX_DSCP2UP_IPV4_LUT_DSCP2UP_LUT_0_M MAKEMASK(0x7, 0) +#define PRTDCB_TX_DSCP2UP_IPV4_LUT_DSCP2UP_LUT_1_S 4 +#define PRTDCB_TX_DSCP2UP_IPV4_LUT_DSCP2UP_LUT_1_M MAKEMASK(0x7, 4) +#define PRTDCB_TX_DSCP2UP_IPV4_LUT_DSCP2UP_LUT_2_S 8 +#define PRTDCB_TX_DSCP2UP_IPV4_LUT_DSCP2UP_LUT_2_M MAKEMASK(0x7, 8) +#define PRTDCB_TX_DSCP2UP_IPV4_LUT_DSCP2UP_LUT_3_S 12 +#define PRTDCB_TX_DSCP2UP_IPV4_LUT_DSCP2UP_LUT_3_M MAKEMASK(0x7, 12) +#define PRTDCB_TX_DSCP2UP_IPV4_LUT_DSCP2UP_LUT_4_S 16 +#define PRTDCB_TX_DSCP2UP_IPV4_LUT_DSCP2UP_LUT_4_M MAKEMASK(0x7, 16) +#define PRTDCB_TX_DSCP2UP_IPV4_LUT_DSCP2UP_LUT_5_S 20 +#define PRTDCB_TX_DSCP2UP_IPV4_LUT_DSCP2UP_LUT_5_M MAKEMASK(0x7, 20) +#define PRTDCB_TX_DSCP2UP_IPV4_LUT_DSCP2UP_LUT_6_S 24 +#define PRTDCB_TX_DSCP2UP_IPV4_LUT_DSCP2UP_LUT_6_M MAKEMASK(0x7, 24) +#define PRTDCB_TX_DSCP2UP_IPV4_LUT_DSCP2UP_LUT_7_S 28 +#define PRTDCB_TX_DSCP2UP_IPV4_LUT_DSCP2UP_LUT_7_M MAKEMASK(0x7, 28) +#define PRTDCB_TX_DSCP2UP_IPV6_LUT(_i) (0x00040AA0 + ((_i) * 32)) /* _i=0...7 */ /* Reset Source: CORER */ +#define PRTDCB_TX_DSCP2UP_IPV6_LUT_MAX_INDEX 7 +#define PRTDCB_TX_DSCP2UP_IPV6_LUT_DSCP2UP_LUT_0_S 0 +#define PRTDCB_TX_DSCP2UP_IPV6_LUT_DSCP2UP_LUT_0_M MAKEMASK(0x7, 0) +#define PRTDCB_TX_DSCP2UP_IPV6_LUT_DSCP2UP_LUT_1_S 4 +#define PRTDCB_TX_DSCP2UP_IPV6_LUT_DSCP2UP_LUT_1_M MAKEMASK(0x7, 4) +#define PRTDCB_TX_DSCP2UP_IPV6_LUT_DSCP2UP_LUT_2_S 8 +#define PRTDCB_TX_DSCP2UP_IPV6_LUT_DSCP2UP_LUT_2_M MAKEMASK(0x7, 8) +#define PRTDCB_TX_DSCP2UP_IPV6_LUT_DSCP2UP_LUT_3_S 12 +#define PRTDCB_TX_DSCP2UP_IPV6_LUT_DSCP2UP_LUT_3_M MAKEMASK(0x7, 12) +#define PRTDCB_TX_DSCP2UP_IPV6_LUT_DSCP2UP_LUT_4_S 16 +#define PRTDCB_TX_DSCP2UP_IPV6_LUT_DSCP2UP_LUT_4_M MAKEMASK(0x7, 16) +#define PRTDCB_TX_DSCP2UP_IPV6_LUT_DSCP2UP_LUT_5_S 20 +#define PRTDCB_TX_DSCP2UP_IPV6_LUT_DSCP2UP_LUT_5_M MAKEMASK(0x7, 20) +#define PRTDCB_TX_DSCP2UP_IPV6_LUT_DSCP2UP_LUT_6_S 24 +#define PRTDCB_TX_DSCP2UP_IPV6_LUT_DSCP2UP_LUT_6_M MAKEMASK(0x7, 24) +#define PRTDCB_TX_DSCP2UP_IPV6_LUT_DSCP2UP_LUT_7_S 28 +#define PRTDCB_TX_DSCP2UP_IPV6_LUT_DSCP2UP_LUT_7_M MAKEMASK(0x7, 28) +#define PRTTCB_BULK_DWRR_REG_CREDITS 0x000AE060 /* Reset Source: CORER */ +#define PRTTCB_BULK_DWRR_REG_CREDITS_CREDITS_S 0 +#define PRTTCB_BULK_DWRR_REG_CREDITS_CREDITS_M MAKEMASK(0x3FFFF, 0) +#define PRTTCB_BULK_DWRR_WB_CREDITS 0x000AE080 /* Reset Source: CORER */ +#define PRTTCB_BULK_DWRR_WB_CREDITS_CREDITS_S 0 +#define PRTTCB_BULK_DWRR_WB_CREDITS_CREDITS_M MAKEMASK(0x3FFFF, 0) +#define PRTTCB_CREDIT_EXP 0x000AE100 /* Reset Source: CORER */ +#define PRTTCB_CREDIT_EXP_EXPANSION_S 0 +#define PRTTCB_CREDIT_EXP_EXPANSION_M MAKEMASK(0xFF, 0) +#define PRTTCB_LL_DWRR_REG_CREDITS 0x000AE0A0 /* Reset Source: CORER */ +#define PRTTCB_LL_DWRR_REG_CREDITS_CREDITS_S 0 +#define PRTTCB_LL_DWRR_REG_CREDITS_CREDITS_M MAKEMASK(0x3FFFF, 0) +#define PRTTCB_LL_DWRR_WB_CREDITS 0x000AE0C0 /* Reset Source: CORER */ +#define PRTTCB_LL_DWRR_WB_CREDITS_CREDITS_S 0 +#define PRTTCB_LL_DWRR_WB_CREDITS_CREDITS_M MAKEMASK(0x3FFFF, 0) +#define TCDCB_TCUPM_WAIT_CM(_i) (0x000BC520 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define TCDCB_TCUPM_WAIT_CM_MAX_INDEX 31 +#define TCDCB_TCUPM_WAIT_CM_MONITOR_S 0 +#define TCDCB_TCUPM_WAIT_CM_MONITOR_M MAKEMASK(0x7FFF, 0) +#define TCDCB_TCUPM_WAIT_CTHR(_i) (0x000BC5A0 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define TCDCB_TCUPM_WAIT_CTHR_MAX_INDEX 31 +#define TCDCB_TCUPM_WAIT_CTHR_TCOFFTH_S 0 +#define TCDCB_TCUPM_WAIT_CTHR_TCOFFTH_M MAKEMASK(0x7FFF, 0) +#define TCDCB_TCUPM_WAIT_DM(_i) (0x000BC620 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define TCDCB_TCUPM_WAIT_DM_MAX_INDEX 31 +#define TCDCB_TCUPM_WAIT_DM_MONITOR_S 0 +#define TCDCB_TCUPM_WAIT_DM_MONITOR_M MAKEMASK(0x7FFFF, 0) +#define TCDCB_TCUPM_WAIT_DTHR(_i) (0x000BC6A0 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define TCDCB_TCUPM_WAIT_DTHR_MAX_INDEX 31 +#define TCDCB_TCUPM_WAIT_DTHR_TCOFFTH_S 0 +#define TCDCB_TCUPM_WAIT_DTHR_TCOFFTH_M MAKEMASK(0xFFF, 0) +#define TCDCB_TCUPM_WAIT_PE_HB_DM(_i) (0x000BC720 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define TCDCB_TCUPM_WAIT_PE_HB_DM_MAX_INDEX 31 +#define TCDCB_TCUPM_WAIT_PE_HB_DM_MONITOR_S 0 +#define TCDCB_TCUPM_WAIT_PE_HB_DM_MONITOR_M MAKEMASK(0xFFF, 0) +#define TCDCB_TCUPM_WAIT_PE_HB_DTHR(_i) (0x000BC7A0 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define TCDCB_TCUPM_WAIT_PE_HB_DTHR_MAX_INDEX 31 +#define TCDCB_TCUPM_WAIT_PE_HB_DTHR_TCOFFTH_S 0 +#define TCDCB_TCUPM_WAIT_PE_HB_DTHR_TCOFFTH_M MAKEMASK(0xFFF, 0) +#define TCDCB_TLPM_WAIT_DM(_i) (0x000A0080 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define TCDCB_TLPM_WAIT_DM_MAX_INDEX 31 +#define TCDCB_TLPM_WAIT_DM_MONITOR_S 0 +#define TCDCB_TLPM_WAIT_DM_MONITOR_M MAKEMASK(0x7FFFF, 0) +#define TCDCB_TLPM_WAIT_DTHR(_i) (0x000A0100 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define TCDCB_TLPM_WAIT_DTHR_MAX_INDEX 31 +#define TCDCB_TLPM_WAIT_DTHR_TCOFFTH_S 0 +#define TCDCB_TLPM_WAIT_DTHR_TCOFFTH_M MAKEMASK(0xFFF, 0) +#define TCTCB_WB_RL_TC_CFG(_i) (0x000AE138 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define TCTCB_WB_RL_TC_CFG_MAX_INDEX 31 +#define TCTCB_WB_RL_TC_CFG_TOKENS_S 0 +#define TCTCB_WB_RL_TC_CFG_TOKENS_M MAKEMASK(0xFFF, 0) +#define TCTCB_WB_RL_TC_CFG_BURST_SIZE_S 12 +#define TCTCB_WB_RL_TC_CFG_BURST_SIZE_M MAKEMASK(0x3FF, 12) +#define TCTCB_WB_RL_TC_STAT(_i) (0x000AE1B8 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define TCTCB_WB_RL_TC_STAT_MAX_INDEX 31 +#define TCTCB_WB_RL_TC_STAT_BUCKET_S 0 +#define TCTCB_WB_RL_TC_STAT_BUCKET_M MAKEMASK(0x1FFFF, 0) +#define TPB_BULK_DWRR_REG_QUANTA 0x00099340 /* Reset Source: CORER */ +#define TPB_BULK_DWRR_REG_QUANTA_QUANTA_S 0 +#define TPB_BULK_DWRR_REG_QUANTA_QUANTA_M MAKEMASK(0x7FF, 0) +#define TPB_BULK_DWRR_REG_SAT 0x00099350 /* Reset Source: CORER */ +#define TPB_BULK_DWRR_REG_SAT_SATURATION_S 0 +#define TPB_BULK_DWRR_REG_SAT_SATURATION_M MAKEMASK(0x1FFFF, 0) +#define TPB_BULK_DWRR_WB_QUANTA 0x00099344 /* Reset Source: CORER */ +#define TPB_BULK_DWRR_WB_QUANTA_QUANTA_S 0 +#define TPB_BULK_DWRR_WB_QUANTA_QUANTA_M MAKEMASK(0x7FF, 0) +#define TPB_BULK_DWRR_WB_SAT 0x00099354 /* Reset Source: CORER */ +#define TPB_BULK_DWRR_WB_SAT_SATURATION_S 0 +#define TPB_BULK_DWRR_WB_SAT_SATURATION_M MAKEMASK(0x1FFFF, 0) +#define TPB_GLDCB_TCB_WB_SP 0x0009966C /* Reset Source: CORER */ +#define TPB_GLDCB_TCB_WB_SP_WB_SP_S 0 +#define TPB_GLDCB_TCB_WB_SP_WB_SP_M BIT(0) +#define TPB_GLTCB_CREDIT_EXP_CTL 0x00099664 /* Reset Source: CORER */ +#define TPB_GLTCB_CREDIT_EXP_CTL_EN_S 0 +#define TPB_GLTCB_CREDIT_EXP_CTL_EN_M BIT(0) +#define TPB_GLTCB_CREDIT_EXP_CTL_MIN_PKT_S 1 +#define TPB_GLTCB_CREDIT_EXP_CTL_MIN_PKT_M MAKEMASK(0x1FF, 1) +#define TPB_LL_DWRR_REG_QUANTA 0x00099348 /* Reset Source: CORER */ +#define TPB_LL_DWRR_REG_QUANTA_QUANTA_S 0 +#define TPB_LL_DWRR_REG_QUANTA_QUANTA_M MAKEMASK(0x7FF, 0) +#define TPB_LL_DWRR_REG_SAT 0x00099358 /* Reset Source: CORER */ +#define TPB_LL_DWRR_REG_SAT_SATURATION_S 0 +#define TPB_LL_DWRR_REG_SAT_SATURATION_M MAKEMASK(0x1FFFF, 0) +#define TPB_LL_DWRR_WB_QUANTA 0x0009934C /* Reset Source: CORER */ +#define TPB_LL_DWRR_WB_QUANTA_QUANTA_S 0 +#define TPB_LL_DWRR_WB_QUANTA_QUANTA_M MAKEMASK(0x7FF, 0) +#define TPB_LL_DWRR_WB_SAT 0x0009935C /* Reset Source: CORER */ +#define TPB_LL_DWRR_WB_SAT_SATURATION_S 0 +#define TPB_LL_DWRR_WB_SAT_SATURATION_M MAKEMASK(0x1FFFF, 0) +#define TPB_PRTDCB_TCB_DWRR_CREDITS 0x000991C0 /* Reset Source: CORER */ +#define TPB_PRTDCB_TCB_DWRR_CREDITS_CREDITS_S 0 +#define TPB_PRTDCB_TCB_DWRR_CREDITS_CREDITS_M MAKEMASK(0x3FFFF, 0) +#define TPB_PRTDCB_TCB_DWRR_QUANTA 0x00099220 /* Reset Source: CORER */ +#define TPB_PRTDCB_TCB_DWRR_QUANTA_QUANTA_S 0 +#define TPB_PRTDCB_TCB_DWRR_QUANTA_QUANTA_M MAKEMASK(0x7FF, 0) +#define TPB_PRTDCB_TCB_DWRR_SAT 0x00099260 /* Reset Source: CORER */ +#define TPB_PRTDCB_TCB_DWRR_SAT_SATURATION_S 0 +#define TPB_PRTDCB_TCB_DWRR_SAT_SATURATION_M MAKEMASK(0x1FFFF, 0) +#define TPB_PRTTCB_BULK_DWRR_REG_CREDITS 0x000992A0 /* Reset Source: CORER */ +#define TPB_PRTTCB_BULK_DWRR_REG_CREDITS_CREDITS_S 0 +#define TPB_PRTTCB_BULK_DWRR_REG_CREDITS_CREDITS_M MAKEMASK(0x3FFFF, 0) +#define TPB_PRTTCB_BULK_DWRR_WB_CREDITS 0x000992C0 /* Reset Source: CORER */ +#define TPB_PRTTCB_BULK_DWRR_WB_CREDITS_CREDITS_S 0 +#define TPB_PRTTCB_BULK_DWRR_WB_CREDITS_CREDITS_M MAKEMASK(0x3FFFF, 0) +#define TPB_PRTTCB_CREDIT_EXP 0x00099644 /* Reset Source: CORER */ +#define TPB_PRTTCB_CREDIT_EXP_EXPANSION_S 0 +#define TPB_PRTTCB_CREDIT_EXP_EXPANSION_M MAKEMASK(0xFF, 0) +#define TPB_PRTTCB_LL_DWRR_REG_CREDITS 0x00099300 /* Reset Source: CORER */ +#define TPB_PRTTCB_LL_DWRR_REG_CREDITS_CREDITS_S 0 +#define TPB_PRTTCB_LL_DWRR_REG_CREDITS_CREDITS_M MAKEMASK(0x3FFFF, 0) +#define TPB_PRTTCB_LL_DWRR_WB_CREDITS 0x00099320 /* Reset Source: CORER */ +#define TPB_PRTTCB_LL_DWRR_WB_CREDITS_CREDITS_S 0 +#define TPB_PRTTCB_LL_DWRR_WB_CREDITS_CREDITS_M MAKEMASK(0x3FFFF, 0) +#define TPB_WB_RL_TC_CFG(_i) (0x00099360 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define TPB_WB_RL_TC_CFG_MAX_INDEX 31 +#define TPB_WB_RL_TC_CFG_TOKENS_S 0 +#define TPB_WB_RL_TC_CFG_TOKENS_M MAKEMASK(0xFFF, 0) +#define TPB_WB_RL_TC_CFG_BURST_SIZE_S 12 +#define TPB_WB_RL_TC_CFG_BURST_SIZE_M MAKEMASK(0x3FF, 12) +#define TPB_WB_RL_TC_STAT(_i) (0x000993E0 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define TPB_WB_RL_TC_STAT_MAX_INDEX 31 +#define TPB_WB_RL_TC_STAT_BUCKET_S 0 +#define TPB_WB_RL_TC_STAT_BUCKET_M MAKEMASK(0x1FFFF, 0) +#define GL_ACLEXT_CDMD_L1SEL(_i) (0x00210054 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_CDMD_L1SEL_MAX_INDEX 2 +#define GL_ACLEXT_CDMD_L1SEL_RX_SEL_S 0 +#define GL_ACLEXT_CDMD_L1SEL_RX_SEL_M MAKEMASK(0x1F, 0) +#define GL_ACLEXT_CDMD_L1SEL_TX_SEL_S 8 +#define GL_ACLEXT_CDMD_L1SEL_TX_SEL_M MAKEMASK(0x1F, 8) +#define GL_ACLEXT_CDMD_L1SEL_AUX0_SEL_S 16 +#define GL_ACLEXT_CDMD_L1SEL_AUX0_SEL_M MAKEMASK(0x1F, 16) +#define GL_ACLEXT_CDMD_L1SEL_AUX1_SEL_S 24 +#define GL_ACLEXT_CDMD_L1SEL_AUX1_SEL_M MAKEMASK(0x1F, 24) +#define GL_ACLEXT_CDMD_L1SEL_BIDIR_ENA_S 30 +#define GL_ACLEXT_CDMD_L1SEL_BIDIR_ENA_M MAKEMASK(0x3, 30) +#define GL_ACLEXT_CTLTBL_L2ADDR(_i) (0x00210084 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_CTLTBL_L2ADDR_MAX_INDEX 2 +#define GL_ACLEXT_CTLTBL_L2ADDR_LINE_OFF_S 0 +#define GL_ACLEXT_CTLTBL_L2ADDR_LINE_OFF_M MAKEMASK(0x7, 0) +#define GL_ACLEXT_CTLTBL_L2ADDR_LINE_IDX_S 8 +#define GL_ACLEXT_CTLTBL_L2ADDR_LINE_IDX_M MAKEMASK(0x7, 8) +#define GL_ACLEXT_CTLTBL_L2ADDR_AUTO_INC_S 31 +#define GL_ACLEXT_CTLTBL_L2ADDR_AUTO_INC_M BIT(31) +#define GL_ACLEXT_CTLTBL_L2DATA(_i) (0x00210090 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_CTLTBL_L2DATA_MAX_INDEX 2 +#define GL_ACLEXT_CTLTBL_L2DATA_DATA_S 0 +#define GL_ACLEXT_CTLTBL_L2DATA_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_ACLEXT_DFLT_L2PRFL(_i) (0x00210138 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_DFLT_L2PRFL_MAX_INDEX 2 +#define GL_ACLEXT_DFLT_L2PRFL_DFLT_PRFL_S 0 +#define GL_ACLEXT_DFLT_L2PRFL_DFLT_PRFL_M MAKEMASK(0xFFFF, 0) +#define GL_ACLEXT_DFLT_L2PRFL_ACL(_i) (0x00393800 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_DFLT_L2PRFL_ACL_MAX_INDEX 2 +#define GL_ACLEXT_DFLT_L2PRFL_ACL_DFLT_PRFL_S 0 +#define GL_ACLEXT_DFLT_L2PRFL_ACL_DFLT_PRFL_M MAKEMASK(0xFFFF, 0) +#define GL_ACLEXT_FLGS_L1SEL0_1(_i) (0x0021006C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_FLGS_L1SEL0_1_MAX_INDEX 2 +#define GL_ACLEXT_FLGS_L1SEL0_1_FLS0_S 0 +#define GL_ACLEXT_FLGS_L1SEL0_1_FLS0_M MAKEMASK(0x1FF, 0) +#define GL_ACLEXT_FLGS_L1SEL0_1_FLS1_S 16 +#define GL_ACLEXT_FLGS_L1SEL0_1_FLS1_M MAKEMASK(0x1FF, 16) +#define GL_ACLEXT_FLGS_L1SEL2_3(_i) (0x00210078 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_FLGS_L1SEL2_3_MAX_INDEX 2 +#define GL_ACLEXT_FLGS_L1SEL2_3_FLS2_S 0 +#define GL_ACLEXT_FLGS_L1SEL2_3_FLS2_M MAKEMASK(0x1FF, 0) +#define GL_ACLEXT_FLGS_L1SEL2_3_FLS3_S 16 +#define GL_ACLEXT_FLGS_L1SEL2_3_FLS3_M MAKEMASK(0x1FF, 16) +#define GL_ACLEXT_FLGS_L1TBL(_i) (0x00210060 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_FLGS_L1TBL_MAX_INDEX 2 +#define GL_ACLEXT_FLGS_L1TBL_LSB_S 0 +#define GL_ACLEXT_FLGS_L1TBL_LSB_M MAKEMASK(0xFFFF, 0) +#define GL_ACLEXT_FLGS_L1TBL_MSB_S 16 +#define GL_ACLEXT_FLGS_L1TBL_MSB_M MAKEMASK(0xFFFF, 16) +#define GL_ACLEXT_FORCE_L1CDID(_i) (0x00210018 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_FORCE_L1CDID_MAX_INDEX 2 +#define GL_ACLEXT_FORCE_L1CDID_STATIC_CDID_S 0 +#define GL_ACLEXT_FORCE_L1CDID_STATIC_CDID_M MAKEMASK(0xF, 0) +#define GL_ACLEXT_FORCE_L1CDID_STATIC_CDID_EN_S 31 +#define GL_ACLEXT_FORCE_L1CDID_STATIC_CDID_EN_M BIT(31) +#define GL_ACLEXT_FORCE_PID(_i) (0x00210000 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_FORCE_PID_MAX_INDEX 2 +#define GL_ACLEXT_FORCE_PID_STATIC_PID_S 0 +#define GL_ACLEXT_FORCE_PID_STATIC_PID_M MAKEMASK(0xFFFF, 0) +#define GL_ACLEXT_FORCE_PID_STATIC_PID_EN_S 31 +#define GL_ACLEXT_FORCE_PID_STATIC_PID_EN_M BIT(31) +#define GL_ACLEXT_K2N_L2ADDR(_i) (0x00210144 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_K2N_L2ADDR_MAX_INDEX 2 +#define GL_ACLEXT_K2N_L2ADDR_LINE_IDX_S 0 +#define GL_ACLEXT_K2N_L2ADDR_LINE_IDX_M MAKEMASK(0x7F, 0) +#define GL_ACLEXT_K2N_L2ADDR_AUTO_INC_S 31 +#define GL_ACLEXT_K2N_L2ADDR_AUTO_INC_M BIT(31) +#define GL_ACLEXT_K2N_L2DATA(_i) (0x00210150 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_K2N_L2DATA_MAX_INDEX 2 +#define GL_ACLEXT_K2N_L2DATA_DATA0_S 0 +#define GL_ACLEXT_K2N_L2DATA_DATA0_M MAKEMASK(0xFF, 0) +#define GL_ACLEXT_K2N_L2DATA_DATA1_S 8 +#define GL_ACLEXT_K2N_L2DATA_DATA1_M MAKEMASK(0xFF, 8) +#define GL_ACLEXT_K2N_L2DATA_DATA2_S 16 +#define GL_ACLEXT_K2N_L2DATA_DATA2_M MAKEMASK(0xFF, 16) +#define GL_ACLEXT_K2N_L2DATA_DATA3_S 24 +#define GL_ACLEXT_K2N_L2DATA_DATA3_M MAKEMASK(0xFF, 24) +#define GL_ACLEXT_L2_PMASK0(_i) (0x002100FC + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_L2_PMASK0_MAX_INDEX 2 +#define GL_ACLEXT_L2_PMASK0_BITMASK_S 0 +#define GL_ACLEXT_L2_PMASK0_BITMASK_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_ACLEXT_L2_PMASK1(_i) (0x00210108 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_L2_PMASK1_MAX_INDEX 2 +#define GL_ACLEXT_L2_PMASK1_BITMASK_S 0 +#define GL_ACLEXT_L2_PMASK1_BITMASK_M MAKEMASK(0xFFFF, 0) +#define GL_ACLEXT_L2_TMASK0(_i) (0x00210498 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_L2_TMASK0_MAX_INDEX 2 +#define GL_ACLEXT_L2_TMASK0_BITMASK_S 0 +#define GL_ACLEXT_L2_TMASK0_BITMASK_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_ACLEXT_L2_TMASK1(_i) (0x002104A4 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_L2_TMASK1_MAX_INDEX 2 +#define GL_ACLEXT_L2_TMASK1_BITMASK_S 0 +#define GL_ACLEXT_L2_TMASK1_BITMASK_M MAKEMASK(0xFF, 0) +#define GL_ACLEXT_L2BMP0_3(_i) (0x002100A8 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_L2BMP0_3_MAX_INDEX 2 +#define GL_ACLEXT_L2BMP0_3_BMP0_S 0 +#define GL_ACLEXT_L2BMP0_3_BMP0_M MAKEMASK(0xFF, 0) +#define GL_ACLEXT_L2BMP0_3_BMP1_S 8 +#define GL_ACLEXT_L2BMP0_3_BMP1_M MAKEMASK(0xFF, 8) +#define GL_ACLEXT_L2BMP0_3_BMP2_S 16 +#define GL_ACLEXT_L2BMP0_3_BMP2_M MAKEMASK(0xFF, 16) +#define GL_ACLEXT_L2BMP0_3_BMP3_S 24 +#define GL_ACLEXT_L2BMP0_3_BMP3_M MAKEMASK(0xFF, 24) +#define GL_ACLEXT_L2BMP4_7(_i) (0x002100B4 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_L2BMP4_7_MAX_INDEX 2 +#define GL_ACLEXT_L2BMP4_7_BMP4_S 0 +#define GL_ACLEXT_L2BMP4_7_BMP4_M MAKEMASK(0xFF, 0) +#define GL_ACLEXT_L2BMP4_7_BMP5_S 8 +#define GL_ACLEXT_L2BMP4_7_BMP5_M MAKEMASK(0xFF, 8) +#define GL_ACLEXT_L2BMP4_7_BMP6_S 16 +#define GL_ACLEXT_L2BMP4_7_BMP6_M MAKEMASK(0xFF, 16) +#define GL_ACLEXT_L2BMP4_7_BMP7_S 24 +#define GL_ACLEXT_L2BMP4_7_BMP7_M MAKEMASK(0xFF, 24) +#define GL_ACLEXT_L2PRTMOD(_i) (0x0021009C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_L2PRTMOD_MAX_INDEX 2 +#define GL_ACLEXT_L2PRTMOD_XLT1_S 0 +#define GL_ACLEXT_L2PRTMOD_XLT1_M MAKEMASK(0x3, 0) +#define GL_ACLEXT_L2PRTMOD_XLT2_S 8 +#define GL_ACLEXT_L2PRTMOD_XLT2_M MAKEMASK(0x3, 8) +#define GL_ACLEXT_N2N_L2ADDR(_i) (0x0021015C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_N2N_L2ADDR_MAX_INDEX 2 +#define GL_ACLEXT_N2N_L2ADDR_LINE_IDX_S 0 +#define GL_ACLEXT_N2N_L2ADDR_LINE_IDX_M MAKEMASK(0x3F, 0) +#define GL_ACLEXT_N2N_L2ADDR_AUTO_INC_S 31 +#define GL_ACLEXT_N2N_L2ADDR_AUTO_INC_M BIT(31) +#define GL_ACLEXT_N2N_L2DATA(_i) (0x00210168 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_N2N_L2DATA_MAX_INDEX 2 +#define GL_ACLEXT_N2N_L2DATA_DATA0_S 0 +#define GL_ACLEXT_N2N_L2DATA_DATA0_M MAKEMASK(0xFF, 0) +#define GL_ACLEXT_N2N_L2DATA_DATA1_S 8 +#define GL_ACLEXT_N2N_L2DATA_DATA1_M MAKEMASK(0xFF, 8) +#define GL_ACLEXT_N2N_L2DATA_DATA2_S 16 +#define GL_ACLEXT_N2N_L2DATA_DATA2_M MAKEMASK(0xFF, 16) +#define GL_ACLEXT_N2N_L2DATA_DATA3_S 24 +#define GL_ACLEXT_N2N_L2DATA_DATA3_M MAKEMASK(0xFF, 24) +#define GL_ACLEXT_P2P_L1ADDR(_i) (0x00210024 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_P2P_L1ADDR_MAX_INDEX 2 +#define GL_ACLEXT_P2P_L1ADDR_LINE_IDX_S 0 +#define GL_ACLEXT_P2P_L1ADDR_LINE_IDX_M BIT(0) +#define GL_ACLEXT_P2P_L1ADDR_AUTO_INC_S 31 +#define GL_ACLEXT_P2P_L1ADDR_AUTO_INC_M BIT(31) +#define GL_ACLEXT_P2P_L1DATA(_i) (0x00210030 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_P2P_L1DATA_MAX_INDEX 2 +#define GL_ACLEXT_P2P_L1DATA_DATA_S 0 +#define GL_ACLEXT_P2P_L1DATA_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_ACLEXT_PID_L2GKTYPE(_i) (0x002100F0 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_PID_L2GKTYPE_MAX_INDEX 2 +#define GL_ACLEXT_PID_L2GKTYPE_PID_GKTYPE_S 0 +#define GL_ACLEXT_PID_L2GKTYPE_PID_GKTYPE_M MAKEMASK(0x3, 0) +#define GL_ACLEXT_PLVL_SEL(_i) (0x0021000C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_PLVL_SEL_MAX_INDEX 2 +#define GL_ACLEXT_PLVL_SEL_PLVL_SEL_S 0 +#define GL_ACLEXT_PLVL_SEL_PLVL_SEL_M BIT(0) +#define GL_ACLEXT_TCAM_L2ADDR(_i) (0x00210114 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_TCAM_L2ADDR_MAX_INDEX 2 +#define GL_ACLEXT_TCAM_L2ADDR_LINE_IDX_S 0 +#define GL_ACLEXT_TCAM_L2ADDR_LINE_IDX_M MAKEMASK(0x3FF, 0) +#define GL_ACLEXT_TCAM_L2ADDR_AUTO_INC_S 31 +#define GL_ACLEXT_TCAM_L2ADDR_AUTO_INC_M BIT(31) +#define GL_ACLEXT_TCAM_L2DATALSB(_i) (0x00210120 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_TCAM_L2DATALSB_MAX_INDEX 2 +#define GL_ACLEXT_TCAM_L2DATALSB_DATALSB_S 0 +#define GL_ACLEXT_TCAM_L2DATALSB_DATALSB_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_ACLEXT_TCAM_L2DATAMSB(_i) (0x0021012C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_TCAM_L2DATAMSB_MAX_INDEX 2 +#define GL_ACLEXT_TCAM_L2DATAMSB_DATAMSB_S 0 +#define GL_ACLEXT_TCAM_L2DATAMSB_DATAMSB_M MAKEMASK(0xFF, 0) +#define GL_ACLEXT_XLT0_L1ADDR(_i) (0x0021003C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_XLT0_L1ADDR_MAX_INDEX 2 +#define GL_ACLEXT_XLT0_L1ADDR_LINE_IDX_S 0 +#define GL_ACLEXT_XLT0_L1ADDR_LINE_IDX_M MAKEMASK(0xFF, 0) +#define GL_ACLEXT_XLT0_L1ADDR_AUTO_INC_S 31 +#define GL_ACLEXT_XLT0_L1ADDR_AUTO_INC_M BIT(31) +#define GL_ACLEXT_XLT0_L1DATA(_i) (0x00210048 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_XLT0_L1DATA_MAX_INDEX 2 +#define GL_ACLEXT_XLT0_L1DATA_DATA_S 0 +#define GL_ACLEXT_XLT0_L1DATA_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_ACLEXT_XLT1_L2ADDR(_i) (0x002100C0 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_XLT1_L2ADDR_MAX_INDEX 2 +#define GL_ACLEXT_XLT1_L2ADDR_LINE_IDX_S 0 +#define GL_ACLEXT_XLT1_L2ADDR_LINE_IDX_M MAKEMASK(0x7FF, 0) +#define GL_ACLEXT_XLT1_L2ADDR_AUTO_INC_S 31 +#define GL_ACLEXT_XLT1_L2ADDR_AUTO_INC_M BIT(31) +#define GL_ACLEXT_XLT1_L2DATA(_i) (0x002100CC + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_XLT1_L2DATA_MAX_INDEX 2 +#define GL_ACLEXT_XLT1_L2DATA_DATA_S 0 +#define GL_ACLEXT_XLT1_L2DATA_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_ACLEXT_XLT2_L2ADDR(_i) (0x002100D8 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_XLT2_L2ADDR_MAX_INDEX 2 +#define GL_ACLEXT_XLT2_L2ADDR_LINE_IDX_S 0 +#define GL_ACLEXT_XLT2_L2ADDR_LINE_IDX_M MAKEMASK(0x1FF, 0) +#define GL_ACLEXT_XLT2_L2ADDR_AUTO_INC_S 31 +#define GL_ACLEXT_XLT2_L2ADDR_AUTO_INC_M BIT(31) +#define GL_ACLEXT_XLT2_L2DATA(_i) (0x002100E4 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_ACLEXT_XLT2_L2DATA_MAX_INDEX 2 +#define GL_ACLEXT_XLT2_L2DATA_DATA_S 0 +#define GL_ACLEXT_XLT2_L2DATA_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_PREEXT_CDMD_L1SEL(_i) (0x0020F054 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_CDMD_L1SEL_MAX_INDEX 2 +#define GL_PREEXT_CDMD_L1SEL_RX_SEL_S 0 +#define GL_PREEXT_CDMD_L1SEL_RX_SEL_M MAKEMASK(0x1F, 0) +#define GL_PREEXT_CDMD_L1SEL_TX_SEL_S 8 +#define GL_PREEXT_CDMD_L1SEL_TX_SEL_M MAKEMASK(0x1F, 8) +#define GL_PREEXT_CDMD_L1SEL_AUX0_SEL_S 16 +#define GL_PREEXT_CDMD_L1SEL_AUX0_SEL_M MAKEMASK(0x1F, 16) +#define GL_PREEXT_CDMD_L1SEL_AUX1_SEL_S 24 +#define GL_PREEXT_CDMD_L1SEL_AUX1_SEL_M MAKEMASK(0x1F, 24) +#define GL_PREEXT_CDMD_L1SEL_BIDIR_ENA_S 30 +#define GL_PREEXT_CDMD_L1SEL_BIDIR_ENA_M MAKEMASK(0x3, 30) +#define GL_PREEXT_CTLTBL_L2ADDR(_i) (0x0020F084 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_CTLTBL_L2ADDR_MAX_INDEX 2 +#define GL_PREEXT_CTLTBL_L2ADDR_LINE_OFF_S 0 +#define GL_PREEXT_CTLTBL_L2ADDR_LINE_OFF_M MAKEMASK(0x7, 0) +#define GL_PREEXT_CTLTBL_L2ADDR_LINE_IDX_S 8 +#define GL_PREEXT_CTLTBL_L2ADDR_LINE_IDX_M MAKEMASK(0x7, 8) +#define GL_PREEXT_CTLTBL_L2ADDR_AUTO_INC_S 31 +#define GL_PREEXT_CTLTBL_L2ADDR_AUTO_INC_M BIT(31) +#define GL_PREEXT_CTLTBL_L2DATA(_i) (0x0020F090 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_CTLTBL_L2DATA_MAX_INDEX 2 +#define GL_PREEXT_CTLTBL_L2DATA_DATA_S 0 +#define GL_PREEXT_CTLTBL_L2DATA_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_PREEXT_DFLT_L2PRFL(_i) (0x0020F138 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_DFLT_L2PRFL_MAX_INDEX 2 +#define GL_PREEXT_DFLT_L2PRFL_DFLT_PRFL_S 0 +#define GL_PREEXT_DFLT_L2PRFL_DFLT_PRFL_M MAKEMASK(0xFFFF, 0) +#define GL_PREEXT_FLGS_L1SEL0_1(_i) (0x0020F06C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_FLGS_L1SEL0_1_MAX_INDEX 2 +#define GL_PREEXT_FLGS_L1SEL0_1_FLS0_S 0 +#define GL_PREEXT_FLGS_L1SEL0_1_FLS0_M MAKEMASK(0x1FF, 0) +#define GL_PREEXT_FLGS_L1SEL0_1_FLS1_S 16 +#define GL_PREEXT_FLGS_L1SEL0_1_FLS1_M MAKEMASK(0x1FF, 16) +#define GL_PREEXT_FLGS_L1SEL2_3(_i) (0x0020F078 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_FLGS_L1SEL2_3_MAX_INDEX 2 +#define GL_PREEXT_FLGS_L1SEL2_3_FLS2_S 0 +#define GL_PREEXT_FLGS_L1SEL2_3_FLS2_M MAKEMASK(0x1FF, 0) +#define GL_PREEXT_FLGS_L1SEL2_3_FLS3_S 16 +#define GL_PREEXT_FLGS_L1SEL2_3_FLS3_M MAKEMASK(0x1FF, 16) +#define GL_PREEXT_FLGS_L1TBL(_i) (0x0020F060 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_FLGS_L1TBL_MAX_INDEX 2 +#define GL_PREEXT_FLGS_L1TBL_LSB_S 0 +#define GL_PREEXT_FLGS_L1TBL_LSB_M MAKEMASK(0xFFFF, 0) +#define GL_PREEXT_FLGS_L1TBL_MSB_S 16 +#define GL_PREEXT_FLGS_L1TBL_MSB_M MAKEMASK(0xFFFF, 16) +#define GL_PREEXT_FORCE_L1CDID(_i) (0x0020F018 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_FORCE_L1CDID_MAX_INDEX 2 +#define GL_PREEXT_FORCE_L1CDID_STATIC_CDID_S 0 +#define GL_PREEXT_FORCE_L1CDID_STATIC_CDID_M MAKEMASK(0xF, 0) +#define GL_PREEXT_FORCE_L1CDID_STATIC_CDID_EN_S 31 +#define GL_PREEXT_FORCE_L1CDID_STATIC_CDID_EN_M BIT(31) +#define GL_PREEXT_FORCE_PID(_i) (0x0020F000 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_FORCE_PID_MAX_INDEX 2 +#define GL_PREEXT_FORCE_PID_STATIC_PID_S 0 +#define GL_PREEXT_FORCE_PID_STATIC_PID_M MAKEMASK(0xFFFF, 0) +#define GL_PREEXT_FORCE_PID_STATIC_PID_EN_S 31 +#define GL_PREEXT_FORCE_PID_STATIC_PID_EN_M BIT(31) +#define GL_PREEXT_K2N_L2ADDR(_i) (0x0020F144 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_K2N_L2ADDR_MAX_INDEX 2 +#define GL_PREEXT_K2N_L2ADDR_LINE_IDX_S 0 +#define GL_PREEXT_K2N_L2ADDR_LINE_IDX_M MAKEMASK(0x7F, 0) +#define GL_PREEXT_K2N_L2ADDR_AUTO_INC_S 31 +#define GL_PREEXT_K2N_L2ADDR_AUTO_INC_M BIT(31) +#define GL_PREEXT_K2N_L2DATA(_i) (0x0020F150 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_K2N_L2DATA_MAX_INDEX 2 +#define GL_PREEXT_K2N_L2DATA_DATA0_S 0 +#define GL_PREEXT_K2N_L2DATA_DATA0_M MAKEMASK(0xFF, 0) +#define GL_PREEXT_K2N_L2DATA_DATA1_S 8 +#define GL_PREEXT_K2N_L2DATA_DATA1_M MAKEMASK(0xFF, 8) +#define GL_PREEXT_K2N_L2DATA_DATA2_S 16 +#define GL_PREEXT_K2N_L2DATA_DATA2_M MAKEMASK(0xFF, 16) +#define GL_PREEXT_K2N_L2DATA_DATA3_S 24 +#define GL_PREEXT_K2N_L2DATA_DATA3_M MAKEMASK(0xFF, 24) +#define GL_PREEXT_L2_PMASK0(_i) (0x0020F0FC + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_L2_PMASK0_MAX_INDEX 2 +#define GL_PREEXT_L2_PMASK0_BITMASK_S 0 +#define GL_PREEXT_L2_PMASK0_BITMASK_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_PREEXT_L2_PMASK1(_i) (0x0020F108 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_L2_PMASK1_MAX_INDEX 2 +#define GL_PREEXT_L2_PMASK1_BITMASK_S 0 +#define GL_PREEXT_L2_PMASK1_BITMASK_M MAKEMASK(0xFFFF, 0) +#define GL_PREEXT_L2_TMASK0(_i) (0x0020F498 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_L2_TMASK0_MAX_INDEX 2 +#define GL_PREEXT_L2_TMASK0_BITMASK_S 0 +#define GL_PREEXT_L2_TMASK0_BITMASK_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_PREEXT_L2_TMASK1(_i) (0x0020F4A4 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_L2_TMASK1_MAX_INDEX 2 +#define GL_PREEXT_L2_TMASK1_BITMASK_S 0 +#define GL_PREEXT_L2_TMASK1_BITMASK_M MAKEMASK(0xFF, 0) +#define GL_PREEXT_L2BMP0_3(_i) (0x0020F0A8 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_L2BMP0_3_MAX_INDEX 2 +#define GL_PREEXT_L2BMP0_3_BMP0_S 0 +#define GL_PREEXT_L2BMP0_3_BMP0_M MAKEMASK(0xFF, 0) +#define GL_PREEXT_L2BMP0_3_BMP1_S 8 +#define GL_PREEXT_L2BMP0_3_BMP1_M MAKEMASK(0xFF, 8) +#define GL_PREEXT_L2BMP0_3_BMP2_S 16 +#define GL_PREEXT_L2BMP0_3_BMP2_M MAKEMASK(0xFF, 16) +#define GL_PREEXT_L2BMP0_3_BMP3_S 24 +#define GL_PREEXT_L2BMP0_3_BMP3_M MAKEMASK(0xFF, 24) +#define GL_PREEXT_L2BMP4_7(_i) (0x0020F0B4 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_L2BMP4_7_MAX_INDEX 2 +#define GL_PREEXT_L2BMP4_7_BMP4_S 0 +#define GL_PREEXT_L2BMP4_7_BMP4_M MAKEMASK(0xFF, 0) +#define GL_PREEXT_L2BMP4_7_BMP5_S 8 +#define GL_PREEXT_L2BMP4_7_BMP5_M MAKEMASK(0xFF, 8) +#define GL_PREEXT_L2BMP4_7_BMP6_S 16 +#define GL_PREEXT_L2BMP4_7_BMP6_M MAKEMASK(0xFF, 16) +#define GL_PREEXT_L2BMP4_7_BMP7_S 24 +#define GL_PREEXT_L2BMP4_7_BMP7_M MAKEMASK(0xFF, 24) +#define GL_PREEXT_L2PRTMOD(_i) (0x0020F09C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_L2PRTMOD_MAX_INDEX 2 +#define GL_PREEXT_L2PRTMOD_XLT1_S 0 +#define GL_PREEXT_L2PRTMOD_XLT1_M MAKEMASK(0x3, 0) +#define GL_PREEXT_L2PRTMOD_XLT2_S 8 +#define GL_PREEXT_L2PRTMOD_XLT2_M MAKEMASK(0x3, 8) +#define GL_PREEXT_N2N_L2ADDR(_i) (0x0020F15C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_N2N_L2ADDR_MAX_INDEX 2 +#define GL_PREEXT_N2N_L2ADDR_LINE_IDX_S 0 +#define GL_PREEXT_N2N_L2ADDR_LINE_IDX_M MAKEMASK(0x3F, 0) +#define GL_PREEXT_N2N_L2ADDR_AUTO_INC_S 31 +#define GL_PREEXT_N2N_L2ADDR_AUTO_INC_M BIT(31) +#define GL_PREEXT_N2N_L2DATA(_i) (0x0020F168 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_N2N_L2DATA_MAX_INDEX 2 +#define GL_PREEXT_N2N_L2DATA_DATA0_S 0 +#define GL_PREEXT_N2N_L2DATA_DATA0_M MAKEMASK(0xFF, 0) +#define GL_PREEXT_N2N_L2DATA_DATA1_S 8 +#define GL_PREEXT_N2N_L2DATA_DATA1_M MAKEMASK(0xFF, 8) +#define GL_PREEXT_N2N_L2DATA_DATA2_S 16 +#define GL_PREEXT_N2N_L2DATA_DATA2_M MAKEMASK(0xFF, 16) +#define GL_PREEXT_N2N_L2DATA_DATA3_S 24 +#define GL_PREEXT_N2N_L2DATA_DATA3_M MAKEMASK(0xFF, 24) +#define GL_PREEXT_P2P_L1ADDR(_i) (0x0020F024 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_P2P_L1ADDR_MAX_INDEX 2 +#define GL_PREEXT_P2P_L1ADDR_LINE_IDX_S 0 +#define GL_PREEXT_P2P_L1ADDR_LINE_IDX_M BIT(0) +#define GL_PREEXT_P2P_L1ADDR_AUTO_INC_S 31 +#define GL_PREEXT_P2P_L1ADDR_AUTO_INC_M BIT(31) +#define GL_PREEXT_P2P_L1DATA(_i) (0x0020F030 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_P2P_L1DATA_MAX_INDEX 2 +#define GL_PREEXT_P2P_L1DATA_DATA_S 0 +#define GL_PREEXT_P2P_L1DATA_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_PREEXT_PID_L2GKTYPE(_i) (0x0020F0F0 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_PID_L2GKTYPE_MAX_INDEX 2 +#define GL_PREEXT_PID_L2GKTYPE_PID_GKTYPE_S 0 +#define GL_PREEXT_PID_L2GKTYPE_PID_GKTYPE_M MAKEMASK(0x3, 0) +#define GL_PREEXT_PLVL_SEL(_i) (0x0020F00C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_PLVL_SEL_MAX_INDEX 2 +#define GL_PREEXT_PLVL_SEL_PLVL_SEL_S 0 +#define GL_PREEXT_PLVL_SEL_PLVL_SEL_M BIT(0) +#define GL_PREEXT_TCAM_L2ADDR(_i) (0x0020F114 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_TCAM_L2ADDR_MAX_INDEX 2 +#define GL_PREEXT_TCAM_L2ADDR_LINE_IDX_S 0 +#define GL_PREEXT_TCAM_L2ADDR_LINE_IDX_M MAKEMASK(0x3FF, 0) +#define GL_PREEXT_TCAM_L2ADDR_AUTO_INC_S 31 +#define GL_PREEXT_TCAM_L2ADDR_AUTO_INC_M BIT(31) +#define GL_PREEXT_TCAM_L2DATALSB(_i) (0x0020F120 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_TCAM_L2DATALSB_MAX_INDEX 2 +#define GL_PREEXT_TCAM_L2DATALSB_DATALSB_S 0 +#define GL_PREEXT_TCAM_L2DATALSB_DATALSB_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_PREEXT_TCAM_L2DATAMSB(_i) (0x0020F12C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_TCAM_L2DATAMSB_MAX_INDEX 2 +#define GL_PREEXT_TCAM_L2DATAMSB_DATAMSB_S 0 +#define GL_PREEXT_TCAM_L2DATAMSB_DATAMSB_M MAKEMASK(0xFF, 0) +#define GL_PREEXT_XLT0_L1ADDR(_i) (0x0020F03C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_XLT0_L1ADDR_MAX_INDEX 2 +#define GL_PREEXT_XLT0_L1ADDR_LINE_IDX_S 0 +#define GL_PREEXT_XLT0_L1ADDR_LINE_IDX_M MAKEMASK(0xFF, 0) +#define GL_PREEXT_XLT0_L1ADDR_AUTO_INC_S 31 +#define GL_PREEXT_XLT0_L1ADDR_AUTO_INC_M BIT(31) +#define GL_PREEXT_XLT0_L1DATA(_i) (0x0020F048 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_XLT0_L1DATA_MAX_INDEX 2 +#define GL_PREEXT_XLT0_L1DATA_DATA_S 0 +#define GL_PREEXT_XLT0_L1DATA_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_PREEXT_XLT1_L2ADDR(_i) (0x0020F0C0 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_XLT1_L2ADDR_MAX_INDEX 2 +#define GL_PREEXT_XLT1_L2ADDR_LINE_IDX_S 0 +#define GL_PREEXT_XLT1_L2ADDR_LINE_IDX_M MAKEMASK(0x7FF, 0) +#define GL_PREEXT_XLT1_L2ADDR_AUTO_INC_S 31 +#define GL_PREEXT_XLT1_L2ADDR_AUTO_INC_M BIT(31) +#define GL_PREEXT_XLT1_L2DATA(_i) (0x0020F0CC + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_XLT1_L2DATA_MAX_INDEX 2 +#define GL_PREEXT_XLT1_L2DATA_DATA_S 0 +#define GL_PREEXT_XLT1_L2DATA_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_PREEXT_XLT2_L2ADDR(_i) (0x0020F0D8 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_XLT2_L2ADDR_MAX_INDEX 2 +#define GL_PREEXT_XLT2_L2ADDR_LINE_IDX_S 0 +#define GL_PREEXT_XLT2_L2ADDR_LINE_IDX_M MAKEMASK(0x1FF, 0) +#define GL_PREEXT_XLT2_L2ADDR_AUTO_INC_S 31 +#define GL_PREEXT_XLT2_L2ADDR_AUTO_INC_M BIT(31) +#define GL_PREEXT_XLT2_L2DATA(_i) (0x0020F0E4 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PREEXT_XLT2_L2DATA_MAX_INDEX 2 +#define GL_PREEXT_XLT2_L2DATA_DATA_S 0 +#define GL_PREEXT_XLT2_L2DATA_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_PSTEXT_CDMD_L1SEL(_i) (0x0020E054 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_CDMD_L1SEL_MAX_INDEX 2 +#define GL_PSTEXT_CDMD_L1SEL_RX_SEL_S 0 +#define GL_PSTEXT_CDMD_L1SEL_RX_SEL_M MAKEMASK(0x1F, 0) +#define GL_PSTEXT_CDMD_L1SEL_TX_SEL_S 8 +#define GL_PSTEXT_CDMD_L1SEL_TX_SEL_M MAKEMASK(0x1F, 8) +#define GL_PSTEXT_CDMD_L1SEL_AUX0_SEL_S 16 +#define GL_PSTEXT_CDMD_L1SEL_AUX0_SEL_M MAKEMASK(0x1F, 16) +#define GL_PSTEXT_CDMD_L1SEL_AUX1_SEL_S 24 +#define GL_PSTEXT_CDMD_L1SEL_AUX1_SEL_M MAKEMASK(0x1F, 24) +#define GL_PSTEXT_CDMD_L1SEL_BIDIR_ENA_S 30 +#define GL_PSTEXT_CDMD_L1SEL_BIDIR_ENA_M MAKEMASK(0x3, 30) +#define GL_PSTEXT_CTLTBL_L2ADDR(_i) (0x0020E084 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_CTLTBL_L2ADDR_MAX_INDEX 2 +#define GL_PSTEXT_CTLTBL_L2ADDR_LINE_OFF_S 0 +#define GL_PSTEXT_CTLTBL_L2ADDR_LINE_OFF_M MAKEMASK(0x7, 0) +#define GL_PSTEXT_CTLTBL_L2ADDR_LINE_IDX_S 8 +#define GL_PSTEXT_CTLTBL_L2ADDR_LINE_IDX_M MAKEMASK(0x7, 8) +#define GL_PSTEXT_CTLTBL_L2ADDR_AUTO_INC_S 31 +#define GL_PSTEXT_CTLTBL_L2ADDR_AUTO_INC_M BIT(31) +#define GL_PSTEXT_CTLTBL_L2DATA(_i) (0x0020E090 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_CTLTBL_L2DATA_MAX_INDEX 2 +#define GL_PSTEXT_CTLTBL_L2DATA_DATA_S 0 +#define GL_PSTEXT_CTLTBL_L2DATA_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_PSTEXT_DFLT_L2PRFL(_i) (0x0020E138 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_DFLT_L2PRFL_MAX_INDEX 2 +#define GL_PSTEXT_DFLT_L2PRFL_DFLT_PRFL_S 0 +#define GL_PSTEXT_DFLT_L2PRFL_DFLT_PRFL_M MAKEMASK(0xFFFF, 0) +#define GL_PSTEXT_FL15_BMPLSB(_i) (0x0020E480 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_FL15_BMPLSB_MAX_INDEX 2 +#define GL_PSTEXT_FL15_BMPLSB_BMPLSB_S 0 +#define GL_PSTEXT_FL15_BMPLSB_BMPLSB_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_PSTEXT_FL15_BMPMSB(_i) (0x0020E48C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_FL15_BMPMSB_MAX_INDEX 2 +#define GL_PSTEXT_FL15_BMPMSB_BMPMSB_S 0 +#define GL_PSTEXT_FL15_BMPMSB_BMPMSB_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_PSTEXT_FLGS_L1SEL0_1(_i) (0x0020E06C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_FLGS_L1SEL0_1_MAX_INDEX 2 +#define GL_PSTEXT_FLGS_L1SEL0_1_FLS0_S 0 +#define GL_PSTEXT_FLGS_L1SEL0_1_FLS0_M MAKEMASK(0x1FF, 0) +#define GL_PSTEXT_FLGS_L1SEL0_1_FLS1_S 16 +#define GL_PSTEXT_FLGS_L1SEL0_1_FLS1_M MAKEMASK(0x1FF, 16) +#define GL_PSTEXT_FLGS_L1SEL2_3(_i) (0x0020E078 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_FLGS_L1SEL2_3_MAX_INDEX 2 +#define GL_PSTEXT_FLGS_L1SEL2_3_FLS2_S 0 +#define GL_PSTEXT_FLGS_L1SEL2_3_FLS2_M MAKEMASK(0x1FF, 0) +#define GL_PSTEXT_FLGS_L1SEL2_3_FLS3_S 16 +#define GL_PSTEXT_FLGS_L1SEL2_3_FLS3_M MAKEMASK(0x1FF, 16) +#define GL_PSTEXT_FLGS_L1TBL(_i) (0x0020E060 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_FLGS_L1TBL_MAX_INDEX 2 +#define GL_PSTEXT_FLGS_L1TBL_LSB_S 0 +#define GL_PSTEXT_FLGS_L1TBL_LSB_M MAKEMASK(0xFFFF, 0) +#define GL_PSTEXT_FLGS_L1TBL_MSB_S 16 +#define GL_PSTEXT_FLGS_L1TBL_MSB_M MAKEMASK(0xFFFF, 16) +#define GL_PSTEXT_FORCE_L1CDID(_i) (0x0020E018 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_FORCE_L1CDID_MAX_INDEX 2 +#define GL_PSTEXT_FORCE_L1CDID_STATIC_CDID_S 0 +#define GL_PSTEXT_FORCE_L1CDID_STATIC_CDID_M MAKEMASK(0xF, 0) +#define GL_PSTEXT_FORCE_L1CDID_STATIC_CDID_EN_S 31 +#define GL_PSTEXT_FORCE_L1CDID_STATIC_CDID_EN_M BIT(31) +#define GL_PSTEXT_FORCE_PID(_i) (0x0020E000 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_FORCE_PID_MAX_INDEX 2 +#define GL_PSTEXT_FORCE_PID_STATIC_PID_S 0 +#define GL_PSTEXT_FORCE_PID_STATIC_PID_M MAKEMASK(0xFFFF, 0) +#define GL_PSTEXT_FORCE_PID_STATIC_PID_EN_S 31 +#define GL_PSTEXT_FORCE_PID_STATIC_PID_EN_M BIT(31) +#define GL_PSTEXT_K2N_L2ADDR(_i) (0x0020E144 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_K2N_L2ADDR_MAX_INDEX 2 +#define GL_PSTEXT_K2N_L2ADDR_LINE_IDX_S 0 +#define GL_PSTEXT_K2N_L2ADDR_LINE_IDX_M MAKEMASK(0x7F, 0) +#define GL_PSTEXT_K2N_L2ADDR_AUTO_INC_S 31 +#define GL_PSTEXT_K2N_L2ADDR_AUTO_INC_M BIT(31) +#define GL_PSTEXT_K2N_L2DATA(_i) (0x0020E150 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_K2N_L2DATA_MAX_INDEX 2 +#define GL_PSTEXT_K2N_L2DATA_DATA0_S 0 +#define GL_PSTEXT_K2N_L2DATA_DATA0_M MAKEMASK(0xFF, 0) +#define GL_PSTEXT_K2N_L2DATA_DATA1_S 8 +#define GL_PSTEXT_K2N_L2DATA_DATA1_M MAKEMASK(0xFF, 8) +#define GL_PSTEXT_K2N_L2DATA_DATA2_S 16 +#define GL_PSTEXT_K2N_L2DATA_DATA2_M MAKEMASK(0xFF, 16) +#define GL_PSTEXT_K2N_L2DATA_DATA3_S 24 +#define GL_PSTEXT_K2N_L2DATA_DATA3_M MAKEMASK(0xFF, 24) +#define GL_PSTEXT_L2_PMASK0(_i) (0x0020E0FC + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_L2_PMASK0_MAX_INDEX 2 +#define GL_PSTEXT_L2_PMASK0_BITMASK_S 0 +#define GL_PSTEXT_L2_PMASK0_BITMASK_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_PSTEXT_L2_PMASK1(_i) (0x0020E108 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_L2_PMASK1_MAX_INDEX 2 +#define GL_PSTEXT_L2_PMASK1_BITMASK_S 0 +#define GL_PSTEXT_L2_PMASK1_BITMASK_M MAKEMASK(0xFFFF, 0) +#define GL_PSTEXT_L2_TMASK0(_i) (0x0020E498 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_L2_TMASK0_MAX_INDEX 2 +#define GL_PSTEXT_L2_TMASK0_BITMASK_S 0 +#define GL_PSTEXT_L2_TMASK0_BITMASK_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_PSTEXT_L2_TMASK1(_i) (0x0020E4A4 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_L2_TMASK1_MAX_INDEX 2 +#define GL_PSTEXT_L2_TMASK1_BITMASK_S 0 +#define GL_PSTEXT_L2_TMASK1_BITMASK_M MAKEMASK(0xFF, 0) +#define GL_PSTEXT_L2PRTMOD(_i) (0x0020E09C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_L2PRTMOD_MAX_INDEX 2 +#define GL_PSTEXT_L2PRTMOD_XLT1_S 0 +#define GL_PSTEXT_L2PRTMOD_XLT1_M MAKEMASK(0x3, 0) +#define GL_PSTEXT_L2PRTMOD_XLT2_S 8 +#define GL_PSTEXT_L2PRTMOD_XLT2_M MAKEMASK(0x3, 8) +#define GL_PSTEXT_N2N_L2ADDR(_i) (0x0020E15C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_N2N_L2ADDR_MAX_INDEX 2 +#define GL_PSTEXT_N2N_L2ADDR_LINE_IDX_S 0 +#define GL_PSTEXT_N2N_L2ADDR_LINE_IDX_M MAKEMASK(0x3F, 0) +#define GL_PSTEXT_N2N_L2ADDR_AUTO_INC_S 31 +#define GL_PSTEXT_N2N_L2ADDR_AUTO_INC_M BIT(31) +#define GL_PSTEXT_N2N_L2DATA(_i) (0x0020E168 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_N2N_L2DATA_MAX_INDEX 2 +#define GL_PSTEXT_N2N_L2DATA_DATA0_S 0 +#define GL_PSTEXT_N2N_L2DATA_DATA0_M MAKEMASK(0xFF, 0) +#define GL_PSTEXT_N2N_L2DATA_DATA1_S 8 +#define GL_PSTEXT_N2N_L2DATA_DATA1_M MAKEMASK(0xFF, 8) +#define GL_PSTEXT_N2N_L2DATA_DATA2_S 16 +#define GL_PSTEXT_N2N_L2DATA_DATA2_M MAKEMASK(0xFF, 16) +#define GL_PSTEXT_N2N_L2DATA_DATA3_S 24 +#define GL_PSTEXT_N2N_L2DATA_DATA3_M MAKEMASK(0xFF, 24) +#define GL_PSTEXT_P2P_L1ADDR(_i) (0x0020E024 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_P2P_L1ADDR_MAX_INDEX 2 +#define GL_PSTEXT_P2P_L1ADDR_LINE_IDX_S 0 +#define GL_PSTEXT_P2P_L1ADDR_LINE_IDX_M BIT(0) +#define GL_PSTEXT_P2P_L1ADDR_AUTO_INC_S 31 +#define GL_PSTEXT_P2P_L1ADDR_AUTO_INC_M BIT(31) +#define GL_PSTEXT_P2P_L1DATA(_i) (0x0020E030 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_P2P_L1DATA_MAX_INDEX 2 +#define GL_PSTEXT_P2P_L1DATA_DATA_S 0 +#define GL_PSTEXT_P2P_L1DATA_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_PSTEXT_PID_L2GKTYPE(_i) (0x0020E0F0 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_PID_L2GKTYPE_MAX_INDEX 2 +#define GL_PSTEXT_PID_L2GKTYPE_PID_GKTYPE_S 0 +#define GL_PSTEXT_PID_L2GKTYPE_PID_GKTYPE_M MAKEMASK(0x3, 0) +#define GL_PSTEXT_PLVL_SEL(_i) (0x0020E00C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_PLVL_SEL_MAX_INDEX 2 +#define GL_PSTEXT_PLVL_SEL_PLVL_SEL_S 0 +#define GL_PSTEXT_PLVL_SEL_PLVL_SEL_M BIT(0) +#define GL_PSTEXT_PRFLM_CTRL(_i) (0x0020E474 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_PRFLM_CTRL_MAX_INDEX 2 +#define GL_PSTEXT_PRFLM_CTRL_PRFL_IDX_S 0 +#define GL_PSTEXT_PRFLM_CTRL_PRFL_IDX_M MAKEMASK(0xFF, 0) +#define GL_PSTEXT_PRFLM_CTRL_RD_REQ_S 30 +#define GL_PSTEXT_PRFLM_CTRL_RD_REQ_M BIT(30) +#define GL_PSTEXT_PRFLM_CTRL_WR_REQ_S 31 +#define GL_PSTEXT_PRFLM_CTRL_WR_REQ_M BIT(31) +#define GL_PSTEXT_PRFLM_DATA_0(_i) (0x0020E174 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: CORER */ +#define GL_PSTEXT_PRFLM_DATA_0_MAX_INDEX 63 +#define GL_PSTEXT_PRFLM_DATA_0_PROT_S 0 +#define GL_PSTEXT_PRFLM_DATA_0_PROT_M MAKEMASK(0xFF, 0) +#define GL_PSTEXT_PRFLM_DATA_0_OFF_S 16 +#define GL_PSTEXT_PRFLM_DATA_0_OFF_M MAKEMASK(0x1FF, 16) +#define GL_PSTEXT_PRFLM_DATA_1(_i) (0x0020E274 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: CORER */ +#define GL_PSTEXT_PRFLM_DATA_1_MAX_INDEX 63 +#define GL_PSTEXT_PRFLM_DATA_1_PROT_S 0 +#define GL_PSTEXT_PRFLM_DATA_1_PROT_M MAKEMASK(0xFF, 0) +#define GL_PSTEXT_PRFLM_DATA_1_OFF_S 16 +#define GL_PSTEXT_PRFLM_DATA_1_OFF_M MAKEMASK(0x1FF, 16) +#define GL_PSTEXT_PRFLM_DATA_2(_i) (0x0020E374 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: CORER */ +#define GL_PSTEXT_PRFLM_DATA_2_MAX_INDEX 63 +#define GL_PSTEXT_PRFLM_DATA_2_PROT_S 0 +#define GL_PSTEXT_PRFLM_DATA_2_PROT_M MAKEMASK(0xFF, 0) +#define GL_PSTEXT_PRFLM_DATA_2_OFF_S 16 +#define GL_PSTEXT_PRFLM_DATA_2_OFF_M MAKEMASK(0x1FF, 16) +#define GL_PSTEXT_TCAM_L2ADDR(_i) (0x0020E114 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_TCAM_L2ADDR_MAX_INDEX 2 +#define GL_PSTEXT_TCAM_L2ADDR_LINE_IDX_S 0 +#define GL_PSTEXT_TCAM_L2ADDR_LINE_IDX_M MAKEMASK(0x3FF, 0) +#define GL_PSTEXT_TCAM_L2ADDR_AUTO_INC_S 31 +#define GL_PSTEXT_TCAM_L2ADDR_AUTO_INC_M BIT(31) +#define GL_PSTEXT_TCAM_L2DATALSB(_i) (0x0020E120 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_TCAM_L2DATALSB_MAX_INDEX 2 +#define GL_PSTEXT_TCAM_L2DATALSB_DATALSB_S 0 +#define GL_PSTEXT_TCAM_L2DATALSB_DATALSB_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_PSTEXT_TCAM_L2DATAMSB(_i) (0x0020E12C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_TCAM_L2DATAMSB_MAX_INDEX 2 +#define GL_PSTEXT_TCAM_L2DATAMSB_DATAMSB_S 0 +#define GL_PSTEXT_TCAM_L2DATAMSB_DATAMSB_M MAKEMASK(0xFF, 0) +#define GL_PSTEXT_XLT0_L1ADDR(_i) (0x0020E03C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_XLT0_L1ADDR_MAX_INDEX 2 +#define GL_PSTEXT_XLT0_L1ADDR_LINE_IDX_S 0 +#define GL_PSTEXT_XLT0_L1ADDR_LINE_IDX_M MAKEMASK(0xFF, 0) +#define GL_PSTEXT_XLT0_L1ADDR_AUTO_INC_S 31 +#define GL_PSTEXT_XLT0_L1ADDR_AUTO_INC_M BIT(31) +#define GL_PSTEXT_XLT0_L1DATA(_i) (0x0020E048 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_XLT0_L1DATA_MAX_INDEX 2 +#define GL_PSTEXT_XLT0_L1DATA_DATA_S 0 +#define GL_PSTEXT_XLT0_L1DATA_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_PSTEXT_XLT1_L2ADDR(_i) (0x0020E0C0 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_XLT1_L2ADDR_MAX_INDEX 2 +#define GL_PSTEXT_XLT1_L2ADDR_LINE_IDX_S 0 +#define GL_PSTEXT_XLT1_L2ADDR_LINE_IDX_M MAKEMASK(0x7FF, 0) +#define GL_PSTEXT_XLT1_L2ADDR_AUTO_INC_S 31 +#define GL_PSTEXT_XLT1_L2ADDR_AUTO_INC_M BIT(31) +#define GL_PSTEXT_XLT1_L2DATA(_i) (0x0020E0CC + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_XLT1_L2DATA_MAX_INDEX 2 +#define GL_PSTEXT_XLT1_L2DATA_DATA_S 0 +#define GL_PSTEXT_XLT1_L2DATA_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_PSTEXT_XLT2_L2ADDR(_i) (0x0020E0D8 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_XLT2_L2ADDR_MAX_INDEX 2 +#define GL_PSTEXT_XLT2_L2ADDR_LINE_IDX_S 0 +#define GL_PSTEXT_XLT2_L2ADDR_LINE_IDX_M MAKEMASK(0x1FF, 0) +#define GL_PSTEXT_XLT2_L2ADDR_AUTO_INC_S 31 +#define GL_PSTEXT_XLT2_L2ADDR_AUTO_INC_M BIT(31) +#define GL_PSTEXT_XLT2_L2DATA(_i) (0x0020E0E4 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GL_PSTEXT_XLT2_L2DATA_MAX_INDEX 2 +#define GL_PSTEXT_XLT2_L2DATA_DATA_S 0 +#define GL_PSTEXT_XLT2_L2DATA_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GLFLXP_PTYPE_TRANSLATION(_i) (0x0045C000 + ((_i) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define GLFLXP_PTYPE_TRANSLATION_MAX_INDEX 255 +#define GLFLXP_PTYPE_TRANSLATION_PTYPE_4N_S 0 +#define GLFLXP_PTYPE_TRANSLATION_PTYPE_4N_M MAKEMASK(0xFF, 0) +#define GLFLXP_PTYPE_TRANSLATION_PTYPE_4N_1_S 8 +#define GLFLXP_PTYPE_TRANSLATION_PTYPE_4N_1_M MAKEMASK(0xFF, 8) +#define GLFLXP_PTYPE_TRANSLATION_PTYPE_4N_2_S 16 +#define GLFLXP_PTYPE_TRANSLATION_PTYPE_4N_2_M MAKEMASK(0xFF, 16) +#define GLFLXP_PTYPE_TRANSLATION_PTYPE_4N_3_S 24 +#define GLFLXP_PTYPE_TRANSLATION_PTYPE_4N_3_M MAKEMASK(0xFF, 24) +#define GLFLXP_RX_CMD_LX_PROT_IDX(_i) (0x0045C400 + ((_i) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define GLFLXP_RX_CMD_LX_PROT_IDX_MAX_INDEX 255 +#define GLFLXP_RX_CMD_LX_PROT_IDX_INNER_CLOUD_OFFSET_INDEX_S 0 +#define GLFLXP_RX_CMD_LX_PROT_IDX_INNER_CLOUD_OFFSET_INDEX_M MAKEMASK(0x7, 0) +#define GLFLXP_RX_CMD_LX_PROT_IDX_L4_OFFSET_INDEX_S 4 +#define GLFLXP_RX_CMD_LX_PROT_IDX_L4_OFFSET_INDEX_M MAKEMASK(0x7, 4) +#define GLFLXP_RX_CMD_LX_PROT_IDX_PAYLOAD_OFFSET_INDEX_S 8 +#define GLFLXP_RX_CMD_LX_PROT_IDX_PAYLOAD_OFFSET_INDEX_M MAKEMASK(0x7, 8) +#define GLFLXP_RX_CMD_LX_PROT_IDX_L3_PROTOCOL_S 12 +#define GLFLXP_RX_CMD_LX_PROT_IDX_L3_PROTOCOL_M MAKEMASK(0x3, 12) +#define GLFLXP_RX_CMD_LX_PROT_IDX_L4_PROTOCOL_S 14 +#define GLFLXP_RX_CMD_LX_PROT_IDX_L4_PROTOCOL_M MAKEMASK(0x3, 14) +#define GLFLXP_RX_CMD_PROTIDS(_i, _j) (0x0045A000 + ((_i) * 4 + (_j) * 1024)) /* _i=0...255, _j=0...5 */ /* Reset Source: CORER */ +#define GLFLXP_RX_CMD_PROTIDS_MAX_INDEX 255 +#define GLFLXP_RX_CMD_PROTIDS_PROTID_4N_S 0 +#define GLFLXP_RX_CMD_PROTIDS_PROTID_4N_M MAKEMASK(0xFF, 0) +#define GLFLXP_RX_CMD_PROTIDS_PROTID_4N_1_S 8 +#define GLFLXP_RX_CMD_PROTIDS_PROTID_4N_1_M MAKEMASK(0xFF, 8) +#define GLFLXP_RX_CMD_PROTIDS_PROTID_4N_2_S 16 +#define GLFLXP_RX_CMD_PROTIDS_PROTID_4N_2_M MAKEMASK(0xFF, 16) +#define GLFLXP_RX_CMD_PROTIDS_PROTID_4N_3_S 24 +#define GLFLXP_RX_CMD_PROTIDS_PROTID_4N_3_M MAKEMASK(0xFF, 24) +#define GLFLXP_RXDID_FLAGS(_i, _j) (0x0045D000 + ((_i) * 4 + (_j) * 256)) /* _i=0...63, _j=0...4 */ /* Reset Source: CORER */ +#define GLFLXP_RXDID_FLAGS_MAX_INDEX 63 +#define GLFLXP_RXDID_FLAGS_FLEXIFLAG_4N_S 0 +#define GLFLXP_RXDID_FLAGS_FLEXIFLAG_4N_M MAKEMASK(0x3F, 0) +#define GLFLXP_RXDID_FLAGS_FLEXIFLAG_4N_1_S 8 +#define GLFLXP_RXDID_FLAGS_FLEXIFLAG_4N_1_M MAKEMASK(0x3F, 8) +#define GLFLXP_RXDID_FLAGS_FLEXIFLAG_4N_2_S 16 +#define GLFLXP_RXDID_FLAGS_FLEXIFLAG_4N_2_M MAKEMASK(0x3F, 16) +#define GLFLXP_RXDID_FLAGS_FLEXIFLAG_4N_3_S 24 +#define GLFLXP_RXDID_FLAGS_FLEXIFLAG_4N_3_M MAKEMASK(0x3F, 24) +#define GLFLXP_RXDID_FLAGS1_OVERRIDE(_i) (0x0045D600 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: CORER */ +#define GLFLXP_RXDID_FLAGS1_OVERRIDE_MAX_INDEX 63 +#define GLFLXP_RXDID_FLAGS1_OVERRIDE_FLEXIFLAGS1_OVERRIDE_S 0 +#define GLFLXP_RXDID_FLAGS1_OVERRIDE_FLEXIFLAGS1_OVERRIDE_M MAKEMASK(0xF, 0) +#define GLFLXP_RXDID_FLX_WRD_0(_i) (0x0045C800 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: CORER */ +#define GLFLXP_RXDID_FLX_WRD_0_MAX_INDEX 63 +#define GLFLXP_RXDID_FLX_WRD_0_PROT_MDID_S 0 +#define GLFLXP_RXDID_FLX_WRD_0_PROT_MDID_M MAKEMASK(0xFF, 0) +#define GLFLXP_RXDID_FLX_WRD_0_EXTRACTION_OFFSET_S 8 +#define GLFLXP_RXDID_FLX_WRD_0_EXTRACTION_OFFSET_M MAKEMASK(0x3FF, 8) +#define GLFLXP_RXDID_FLX_WRD_0_RXDID_OPCODE_S 30 +#define GLFLXP_RXDID_FLX_WRD_0_RXDID_OPCODE_M MAKEMASK(0x3, 30) +#define GLFLXP_RXDID_FLX_WRD_1(_i) (0x0045C900 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: CORER */ +#define GLFLXP_RXDID_FLX_WRD_1_MAX_INDEX 63 +#define GLFLXP_RXDID_FLX_WRD_1_PROT_MDID_S 0 +#define GLFLXP_RXDID_FLX_WRD_1_PROT_MDID_M MAKEMASK(0xFF, 0) +#define GLFLXP_RXDID_FLX_WRD_1_EXTRACTION_OFFSET_S 8 +#define GLFLXP_RXDID_FLX_WRD_1_EXTRACTION_OFFSET_M MAKEMASK(0x3FF, 8) +#define GLFLXP_RXDID_FLX_WRD_1_RXDID_OPCODE_S 30 +#define GLFLXP_RXDID_FLX_WRD_1_RXDID_OPCODE_M MAKEMASK(0x3, 30) +#define GLFLXP_RXDID_FLX_WRD_2(_i) (0x0045CA00 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: CORER */ +#define GLFLXP_RXDID_FLX_WRD_2_MAX_INDEX 63 +#define GLFLXP_RXDID_FLX_WRD_2_PROT_MDID_S 0 +#define GLFLXP_RXDID_FLX_WRD_2_PROT_MDID_M MAKEMASK(0xFF, 0) +#define GLFLXP_RXDID_FLX_WRD_2_EXTRACTION_OFFSET_S 8 +#define GLFLXP_RXDID_FLX_WRD_2_EXTRACTION_OFFSET_M MAKEMASK(0x3FF, 8) +#define GLFLXP_RXDID_FLX_WRD_2_RXDID_OPCODE_S 30 +#define GLFLXP_RXDID_FLX_WRD_2_RXDID_OPCODE_M MAKEMASK(0x3, 30) +#define GLFLXP_RXDID_FLX_WRD_3(_i) (0x0045CB00 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: CORER */ +#define GLFLXP_RXDID_FLX_WRD_3_MAX_INDEX 63 +#define GLFLXP_RXDID_FLX_WRD_3_PROT_MDID_S 0 +#define GLFLXP_RXDID_FLX_WRD_3_PROT_MDID_M MAKEMASK(0xFF, 0) +#define GLFLXP_RXDID_FLX_WRD_3_EXTRACTION_OFFSET_S 8 +#define GLFLXP_RXDID_FLX_WRD_3_EXTRACTION_OFFSET_M MAKEMASK(0x3FF, 8) +#define GLFLXP_RXDID_FLX_WRD_3_RXDID_OPCODE_S 30 +#define GLFLXP_RXDID_FLX_WRD_3_RXDID_OPCODE_M MAKEMASK(0x3, 30) +#define GLFLXP_RXDID_FLX_WRD_4(_i) (0x0045CC00 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: CORER */ +#define GLFLXP_RXDID_FLX_WRD_4_MAX_INDEX 63 +#define GLFLXP_RXDID_FLX_WRD_4_PROT_MDID_S 0 +#define GLFLXP_RXDID_FLX_WRD_4_PROT_MDID_M MAKEMASK(0xFF, 0) +#define GLFLXP_RXDID_FLX_WRD_4_EXTRACTION_OFFSET_S 8 +#define GLFLXP_RXDID_FLX_WRD_4_EXTRACTION_OFFSET_M MAKEMASK(0x3FF, 8) +#define GLFLXP_RXDID_FLX_WRD_4_RXDID_OPCODE_S 30 +#define GLFLXP_RXDID_FLX_WRD_4_RXDID_OPCODE_M MAKEMASK(0x3, 30) +#define GLFLXP_RXDID_FLX_WRD_5(_i) (0x0045CD00 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: CORER */ +#define GLFLXP_RXDID_FLX_WRD_5_MAX_INDEX 63 +#define GLFLXP_RXDID_FLX_WRD_5_PROT_MDID_S 0 +#define GLFLXP_RXDID_FLX_WRD_5_PROT_MDID_M MAKEMASK(0xFF, 0) +#define GLFLXP_RXDID_FLX_WRD_5_EXTRACTION_OFFSET_S 8 +#define GLFLXP_RXDID_FLX_WRD_5_EXTRACTION_OFFSET_M MAKEMASK(0x3FF, 8) +#define GLFLXP_RXDID_FLX_WRD_5_RXDID_OPCODE_S 30 +#define GLFLXP_RXDID_FLX_WRD_5_RXDID_OPCODE_M MAKEMASK(0x3, 30) +#define GLFLXP_TX_SCHED_CORRECT(_i, _j) (0x00458000 + ((_i) * 4 + (_j) * 256)) /* _i=0...63, _j=0...31 */ /* Reset Source: CORER */ +#define GLFLXP_TX_SCHED_CORRECT_MAX_INDEX 63 +#define GLFLXP_TX_SCHED_CORRECT_PROTD_ID_2N_S 0 +#define GLFLXP_TX_SCHED_CORRECT_PROTD_ID_2N_M MAKEMASK(0xFF, 0) +#define GLFLXP_TX_SCHED_CORRECT_RECIPE_2N_S 8 +#define GLFLXP_TX_SCHED_CORRECT_RECIPE_2N_M MAKEMASK(0x1F, 8) +#define GLFLXP_TX_SCHED_CORRECT_PROTD_ID_2N_1_S 16 +#define GLFLXP_TX_SCHED_CORRECT_PROTD_ID_2N_1_M MAKEMASK(0xFF, 16) +#define GLFLXP_TX_SCHED_CORRECT_RECIPE_2N_1_S 24 +#define GLFLXP_TX_SCHED_CORRECT_RECIPE_2N_1_M MAKEMASK(0x1F, 24) +#define QRXFLXP_CNTXT(_QRX) (0x00480000 + ((_QRX) * 4)) /* _i=0...2047 */ /* Reset Source: CORER */ +#define QRXFLXP_CNTXT_MAX_INDEX 2047 +#define QRXFLXP_CNTXT_RXDID_IDX_S 0 +#define QRXFLXP_CNTXT_RXDID_IDX_M MAKEMASK(0x3F, 0) +#define QRXFLXP_CNTXT_RXDID_PRIO_S 8 +#define QRXFLXP_CNTXT_RXDID_PRIO_M MAKEMASK(0x7, 8) +#define QRXFLXP_CNTXT_TS_S 11 +#define QRXFLXP_CNTXT_TS_M BIT(11) +#define GL_FWSTS 0x00083048 /* Reset Source: POR */ +#define GL_FWSTS_FWS0B_S 0 +#define GL_FWSTS_FWS0B_M MAKEMASK(0xFF, 0) +#define GL_FWSTS_FWROWD_S 8 +#define GL_FWSTS_FWROWD_M BIT(8) +#define GL_FWSTS_FWRI_S 9 +#define GL_FWSTS_FWRI_M BIT(9) +#define GL_FWSTS_FWS1B_S 16 +#define GL_FWSTS_FWS1B_M MAKEMASK(0xFF, 16) +#define GL_TCVMLR_DRAIN_CNTR_CTL 0x000A21E0 /* Reset Source: CORER */ +#define GL_TCVMLR_DRAIN_CNTR_CTL_OP_S 0 +#define GL_TCVMLR_DRAIN_CNTR_CTL_OP_M BIT(0) +#define GL_TCVMLR_DRAIN_CNTR_CTL_PORT_S 1 +#define GL_TCVMLR_DRAIN_CNTR_CTL_PORT_M MAKEMASK(0x7, 1) +#define GL_TCVMLR_DRAIN_CNTR_CTL_VALUE_S 4 +#define GL_TCVMLR_DRAIN_CNTR_CTL_VALUE_M MAKEMASK(0x3FFF, 4) +#define GL_TCVMLR_DRAIN_DONE_DEC 0x000A21A8 /* Reset Source: CORER */ +#define GL_TCVMLR_DRAIN_DONE_DEC_TARGET_S 0 +#define GL_TCVMLR_DRAIN_DONE_DEC_TARGET_M BIT(0) +#define GL_TCVMLR_DRAIN_DONE_DEC_INDEX_S 1 +#define GL_TCVMLR_DRAIN_DONE_DEC_INDEX_M MAKEMASK(0x1F, 1) +#define GL_TCVMLR_DRAIN_DONE_DEC_VALUE_S 6 +#define GL_TCVMLR_DRAIN_DONE_DEC_VALUE_M MAKEMASK(0xFF, 6) +#define GL_TCVMLR_DRAIN_DONE_TCLAN(_i) (0x000A20A8 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GL_TCVMLR_DRAIN_DONE_TCLAN_MAX_INDEX 31 +#define GL_TCVMLR_DRAIN_DONE_TCLAN_COUNT_S 0 +#define GL_TCVMLR_DRAIN_DONE_TCLAN_COUNT_M MAKEMASK(0xFF, 0) +#define GL_TCVMLR_DRAIN_DONE_TPB(_i) (0x000A2128 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GL_TCVMLR_DRAIN_DONE_TPB_MAX_INDEX 31 +#define GL_TCVMLR_DRAIN_DONE_TPB_COUNT_S 0 +#define GL_TCVMLR_DRAIN_DONE_TPB_COUNT_M MAKEMASK(0xFF, 0) +#define GL_TCVMLR_DRAIN_MARKER 0x000A2008 /* Reset Source: CORER */ +#define GL_TCVMLR_DRAIN_MARKER_PORT_S 0 +#define GL_TCVMLR_DRAIN_MARKER_PORT_M MAKEMASK(0x7, 0) +#define GL_TCVMLR_DRAIN_MARKER_TC_S 3 +#define GL_TCVMLR_DRAIN_MARKER_TC_M MAKEMASK(0x1F, 3) +#define GL_TCVMLR_ERR_STAT 0x000A2024 /* Reset Source: CORER */ +#define GL_TCVMLR_ERR_STAT_ERROR_S 0 +#define GL_TCVMLR_ERR_STAT_ERROR_M BIT(0) +#define GL_TCVMLR_ERR_STAT_FW_REQ_S 1 +#define GL_TCVMLR_ERR_STAT_FW_REQ_M BIT(1) +#define GL_TCVMLR_ERR_STAT_STAT_S 2 +#define GL_TCVMLR_ERR_STAT_STAT_M MAKEMASK(0x7, 2) +#define GL_TCVMLR_ERR_STAT_ENT_TYPE_S 5 +#define GL_TCVMLR_ERR_STAT_ENT_TYPE_M MAKEMASK(0x7, 5) +#define GL_TCVMLR_ERR_STAT_ENT_ID_S 8 +#define GL_TCVMLR_ERR_STAT_ENT_ID_M MAKEMASK(0x3FFF, 8) +#define GL_TCVMLR_QCFG 0x000A2010 /* Reset Source: CORER */ +#define GL_TCVMLR_QCFG_QID_S 0 +#define GL_TCVMLR_QCFG_QID_M MAKEMASK(0x3FFF, 0) +#define GL_TCVMLR_QCFG_OP_S 14 +#define GL_TCVMLR_QCFG_OP_M BIT(14) +#define GL_TCVMLR_QCFG_PORT_S 15 +#define GL_TCVMLR_QCFG_PORT_M MAKEMASK(0x7, 15) +#define GL_TCVMLR_QCFG_TC_S 18 +#define GL_TCVMLR_QCFG_TC_M MAKEMASK(0x1F, 18) +#define GL_TCVMLR_QCFG_RD 0x000A2014 /* Reset Source: CORER */ +#define GL_TCVMLR_QCFG_RD_QID_S 0 +#define GL_TCVMLR_QCFG_RD_QID_M MAKEMASK(0x3FFF, 0) +#define GL_TCVMLR_QCFG_RD_PORT_S 14 +#define GL_TCVMLR_QCFG_RD_PORT_M MAKEMASK(0x7, 14) +#define GL_TCVMLR_QCFG_RD_TC_S 17 +#define GL_TCVMLR_QCFG_RD_TC_M MAKEMASK(0x1F, 17) +#define GL_TCVMLR_QCNTR 0x000A200C /* Reset Source: CORER */ +#define GL_TCVMLR_QCNTR_CNTR_S 0 +#define GL_TCVMLR_QCNTR_CNTR_M MAKEMASK(0x7FFF, 0) +#define GL_TCVMLR_QCTL 0x000A2004 /* Reset Source: CORER */ +#define GL_TCVMLR_QCTL_QID_S 0 +#define GL_TCVMLR_QCTL_QID_M MAKEMASK(0x3FFF, 0) +#define GL_TCVMLR_QCTL_OP_S 14 +#define GL_TCVMLR_QCTL_OP_M BIT(14) +#define GL_TCVMLR_REQ_STAT 0x000A2018 /* Reset Source: CORER */ +#define GL_TCVMLR_REQ_STAT_ENT_TYPE_S 0 +#define GL_TCVMLR_REQ_STAT_ENT_TYPE_M MAKEMASK(0x7, 0) +#define GL_TCVMLR_REQ_STAT_ENT_ID_S 3 +#define GL_TCVMLR_REQ_STAT_ENT_ID_M MAKEMASK(0x3FFF, 3) +#define GL_TCVMLR_REQ_STAT_OP_S 17 +#define GL_TCVMLR_REQ_STAT_OP_M BIT(17) +#define GL_TCVMLR_REQ_STAT_WRITE_STATUS_S 18 +#define GL_TCVMLR_REQ_STAT_WRITE_STATUS_M MAKEMASK(0x7, 18) +#define GL_TCVMLR_STAT 0x000A201C /* Reset Source: CORER */ +#define GL_TCVMLR_STAT_ENT_TYPE_S 0 +#define GL_TCVMLR_STAT_ENT_TYPE_M MAKEMASK(0x7, 0) +#define GL_TCVMLR_STAT_ENT_ID_S 3 +#define GL_TCVMLR_STAT_ENT_ID_M MAKEMASK(0x3FFF, 3) +#define GL_TCVMLR_STAT_STATUS_S 17 +#define GL_TCVMLR_STAT_STATUS_M MAKEMASK(0x7, 17) +#define GL_XLR_MARKER_TRIG_TCVMLR 0x000A2000 /* Reset Source: CORER */ +#define GL_XLR_MARKER_TRIG_TCVMLR_VM_VF_NUM_S 0 +#define GL_XLR_MARKER_TRIG_TCVMLR_VM_VF_NUM_M MAKEMASK(0x3FF, 0) +#define GL_XLR_MARKER_TRIG_TCVMLR_VM_VF_TYPE_S 10 +#define GL_XLR_MARKER_TRIG_TCVMLR_VM_VF_TYPE_M MAKEMASK(0x3, 10) +#define GL_XLR_MARKER_TRIG_TCVMLR_PF_NUM_S 12 +#define GL_XLR_MARKER_TRIG_TCVMLR_PF_NUM_M MAKEMASK(0x7, 12) +#define GL_XLR_MARKER_TRIG_TCVMLR_PORT_NUM_S 16 +#define GL_XLR_MARKER_TRIG_TCVMLR_PORT_NUM_M MAKEMASK(0x7, 16) +#define GL_XLR_MARKER_TRIG_VMLR 0x00093804 /* Reset Source: CORER */ +#define GL_XLR_MARKER_TRIG_VMLR_VM_VF_NUM_S 0 +#define GL_XLR_MARKER_TRIG_VMLR_VM_VF_NUM_M MAKEMASK(0x3FF, 0) +#define GL_XLR_MARKER_TRIG_VMLR_VM_VF_TYPE_S 10 +#define GL_XLR_MARKER_TRIG_VMLR_VM_VF_TYPE_M MAKEMASK(0x3, 10) +#define GL_XLR_MARKER_TRIG_VMLR_PF_NUM_S 12 +#define GL_XLR_MARKER_TRIG_VMLR_PF_NUM_M MAKEMASK(0x7, 12) +#define GL_XLR_MARKER_TRIG_VMLR_PORT_NUM_S 16 +#define GL_XLR_MARKER_TRIG_VMLR_PORT_NUM_M MAKEMASK(0x7, 16) +#define GLGEN_ANA_ABORT_PTYPE 0x0020C21C /* Reset Source: CORER */ +#define GLGEN_ANA_ABORT_PTYPE_ABORT_S 0 +#define GLGEN_ANA_ABORT_PTYPE_ABORT_M MAKEMASK(0x3FF, 0) +#define GLGEN_ANA_ALU_ACCSS_OUT_OF_PKT 0x0020C208 /* Reset Source: CORER */ +#define GLGEN_ANA_ALU_ACCSS_OUT_OF_PKT_NPC_S 0 +#define GLGEN_ANA_ALU_ACCSS_OUT_OF_PKT_NPC_M MAKEMASK(0xFF, 0) +#define GLGEN_ANA_CFG_CTRL 0x0020C104 /* Reset Source: CORER */ +#define GLGEN_ANA_CFG_CTRL_LINE_IDX_S 0 +#define GLGEN_ANA_CFG_CTRL_LINE_IDX_M MAKEMASK(0x3FFFF, 0) +#define GLGEN_ANA_CFG_CTRL_TABLE_ID_S 18 +#define GLGEN_ANA_CFG_CTRL_TABLE_ID_M MAKEMASK(0xFF, 18) +#define GLGEN_ANA_CFG_CTRL_RESRVED_S 26 +#define GLGEN_ANA_CFG_CTRL_RESRVED_M MAKEMASK(0x7, 26) +#define GLGEN_ANA_CFG_CTRL_OPERATION_ID_S 29 +#define GLGEN_ANA_CFG_CTRL_OPERATION_ID_M MAKEMASK(0x7, 29) +#define GLGEN_ANA_CFG_HTBL_LU_RESULT 0x0020C158 /* Reset Source: CORER */ +#define GLGEN_ANA_CFG_HTBL_LU_RESULT_HIT_S 0 +#define GLGEN_ANA_CFG_HTBL_LU_RESULT_HIT_M BIT(0) +#define GLGEN_ANA_CFG_HTBL_LU_RESULT_PG_MEM_IDX_S 1 +#define GLGEN_ANA_CFG_HTBL_LU_RESULT_PG_MEM_IDX_M MAKEMASK(0x7, 1) +#define GLGEN_ANA_CFG_HTBL_LU_RESULT_ADDR_S 4 +#define GLGEN_ANA_CFG_HTBL_LU_RESULT_ADDR_M MAKEMASK(0x1FF, 4) +#define GLGEN_ANA_CFG_LU_KEY(_i) (0x0020C14C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GLGEN_ANA_CFG_LU_KEY_MAX_INDEX 2 +#define GLGEN_ANA_CFG_LU_KEY_LU_KEY_S 0 +#define GLGEN_ANA_CFG_LU_KEY_LU_KEY_M MAKEMASK(0xFFFFFFFF, 0) +#define GLGEN_ANA_CFG_RDDATA(_i) (0x0020C10C + ((_i) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define GLGEN_ANA_CFG_RDDATA_MAX_INDEX 15 +#define GLGEN_ANA_CFG_RDDATA_RD_DATA_S 0 +#define GLGEN_ANA_CFG_RDDATA_RD_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GLGEN_ANA_CFG_SPLBUF_LU_RESULT 0x0020C15C /* Reset Source: CORER */ +#define GLGEN_ANA_CFG_SPLBUF_LU_RESULT_HIT_S 0 +#define GLGEN_ANA_CFG_SPLBUF_LU_RESULT_HIT_M BIT(0) +#define GLGEN_ANA_CFG_SPLBUF_LU_RESULT_RSV_S 1 +#define GLGEN_ANA_CFG_SPLBUF_LU_RESULT_RSV_M MAKEMASK(0x7, 1) +#define GLGEN_ANA_CFG_SPLBUF_LU_RESULT_ADDR_S 4 +#define GLGEN_ANA_CFG_SPLBUF_LU_RESULT_ADDR_M MAKEMASK(0x1FF, 4) +#define GLGEN_ANA_CFG_WRDATA 0x0020C108 /* Reset Source: CORER */ +#define GLGEN_ANA_CFG_WRDATA_WR_DATA_S 0 +#define GLGEN_ANA_CFG_WRDATA_WR_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GLGEN_ANA_DEF_PTYPE 0x0020C100 /* Reset Source: CORER */ +#define GLGEN_ANA_DEF_PTYPE_DEF_PTYPE_S 0 +#define GLGEN_ANA_DEF_PTYPE_DEF_PTYPE_M MAKEMASK(0x3FF, 0) +#define GLGEN_ANA_ERR_CTRL 0x0020C220 /* Reset Source: CORER */ +#define GLGEN_ANA_ERR_CTRL_ERR_MASK_EN_S 0 +#define GLGEN_ANA_ERR_CTRL_ERR_MASK_EN_M MAKEMASK(0xFFFFFFFF, 0) +#define GLGEN_ANA_FLAG_MAP(_i) (0x0020C000 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: CORER */ +#define GLGEN_ANA_FLAG_MAP_MAX_INDEX 63 +#define GLGEN_ANA_FLAG_MAP_FLAG_EN_S 0 +#define GLGEN_ANA_FLAG_MAP_FLAG_EN_M BIT(0) +#define GLGEN_ANA_FLAG_MAP_EXT_FLAG_ID_S 1 +#define GLGEN_ANA_FLAG_MAP_EXT_FLAG_ID_M MAKEMASK(0x3F, 1) +#define GLGEN_ANA_INV_NODE_PTYPE 0x0020C210 /* Reset Source: CORER */ +#define GLGEN_ANA_INV_NODE_PTYPE_INV_NODE_PTYPE_S 0 +#define GLGEN_ANA_INV_NODE_PTYPE_INV_NODE_PTYPE_M MAKEMASK(0x7FF, 0) +#define GLGEN_ANA_INV_PTYPE_MARKER 0x0020C218 /* Reset Source: CORER */ +#define GLGEN_ANA_INV_PTYPE_MARKER_INV_PTYPE_MARKER_S 0 +#define GLGEN_ANA_INV_PTYPE_MARKER_INV_PTYPE_MARKER_M MAKEMASK(0x7F, 0) +#define GLGEN_ANA_LAST_PROT_ID(_i) (0x0020C1E4 + ((_i) * 4)) /* _i=0...5 */ /* Reset Source: CORER */ +#define GLGEN_ANA_LAST_PROT_ID_MAX_INDEX 5 +#define GLGEN_ANA_LAST_PROT_ID_EN_S 0 +#define GLGEN_ANA_LAST_PROT_ID_EN_M BIT(0) +#define GLGEN_ANA_LAST_PROT_ID_PROT_ID_S 1 +#define GLGEN_ANA_LAST_PROT_ID_PROT_ID_M MAKEMASK(0xFF, 1) +#define GLGEN_ANA_NMPG_KEYMASK(_i) (0x0020C1D0 + ((_i) * 4)) /* _i=0...3 */ /* Reset Source: CORER */ +#define GLGEN_ANA_NMPG_KEYMASK_MAX_INDEX 3 +#define GLGEN_ANA_NMPG_KEYMASK_HASH_KEY_S 0 +#define GLGEN_ANA_NMPG_KEYMASK_HASH_KEY_M MAKEMASK(0xFFFFFFFF, 0) +#define GLGEN_ANA_NMPG0_HASHKEY(_i) (0x0020C1B0 + ((_i) * 4)) /* _i=0...3 */ /* Reset Source: CORER */ +#define GLGEN_ANA_NMPG0_HASHKEY_MAX_INDEX 3 +#define GLGEN_ANA_NMPG0_HASHKEY_HASH_KEY_S 0 +#define GLGEN_ANA_NMPG0_HASHKEY_HASH_KEY_M MAKEMASK(0xFFFFFFFF, 0) +#define GLGEN_ANA_NO_HIT_PG_NM_PG 0x0020C204 /* Reset Source: CORER */ +#define GLGEN_ANA_NO_HIT_PG_NM_PG_NPC_S 0 +#define GLGEN_ANA_NO_HIT_PG_NM_PG_NPC_M MAKEMASK(0xFF, 0) +#define GLGEN_ANA_OUT_OF_PKT 0x0020C200 /* Reset Source: CORER */ +#define GLGEN_ANA_OUT_OF_PKT_NPC_S 0 +#define GLGEN_ANA_OUT_OF_PKT_NPC_M MAKEMASK(0xFF, 0) +#define GLGEN_ANA_P2P(_i) (0x0020C160 + ((_i) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define GLGEN_ANA_P2P_MAX_INDEX 15 +#define GLGEN_ANA_P2P_TARGET_PROF_S 0 +#define GLGEN_ANA_P2P_TARGET_PROF_M MAKEMASK(0xF, 0) +#define GLGEN_ANA_PG_KEYMASK(_i) (0x0020C1C0 + ((_i) * 4)) /* _i=0...3 */ /* Reset Source: CORER */ +#define GLGEN_ANA_PG_KEYMASK_MAX_INDEX 3 +#define GLGEN_ANA_PG_KEYMASK_HASH_KEY_S 0 +#define GLGEN_ANA_PG_KEYMASK_HASH_KEY_M MAKEMASK(0xFFFFFFFF, 0) +#define GLGEN_ANA_PG0_HASHKEY(_i) (0x0020C1A0 + ((_i) * 4)) /* _i=0...3 */ /* Reset Source: CORER */ +#define GLGEN_ANA_PG0_HASHKEY_MAX_INDEX 3 +#define GLGEN_ANA_PG0_HASHKEY_HASH_KEY_S 0 +#define GLGEN_ANA_PG0_HASHKEY_HASH_KEY_M MAKEMASK(0xFFFFFFFF, 0) +#define GLGEN_ANA_PROFIL_CTRL 0x0020C1FC /* Reset Source: CORER */ +#define GLGEN_ANA_PROFIL_CTRL_PROFILE_SELECT_MDID_S 0 +#define GLGEN_ANA_PROFIL_CTRL_PROFILE_SELECT_MDID_M MAKEMASK(0x1F, 0) +#define GLGEN_ANA_PROFIL_CTRL_PROFILE_SELECT_MDSTART_S 5 +#define GLGEN_ANA_PROFIL_CTRL_PROFILE_SELECT_MDSTART_M MAKEMASK(0xF, 5) +#define GLGEN_ANA_PROFIL_CTRL_PROFILE_SELECT_MD_LEN_S 9 +#define GLGEN_ANA_PROFIL_CTRL_PROFILE_SELECT_MD_LEN_M MAKEMASK(0x1F, 9) +#define GLGEN_ANA_PROFIL_CTRL_NUM_CTRL_DOMAIN_S 14 +#define GLGEN_ANA_PROFIL_CTRL_NUM_CTRL_DOMAIN_M MAKEMASK(0x3, 14) +#define GLGEN_ANA_PROFIL_CTRL_DEF_PROF_ID_S 16 +#define GLGEN_ANA_PROFIL_CTRL_DEF_PROF_ID_M MAKEMASK(0xF, 16) +#define GLGEN_ANA_PROFIL_CTRL_SEL_DEF_PROF_ID_S 20 +#define GLGEN_ANA_PROFIL_CTRL_SEL_DEF_PROF_ID_M BIT(20) +#define GLGEN_ANA_TX_ABORT_PTYPE 0x0020D21C /* Reset Source: CORER */ +#define GLGEN_ANA_TX_ABORT_PTYPE_ABORT_S 0 +#define GLGEN_ANA_TX_ABORT_PTYPE_ABORT_M MAKEMASK(0x3FF, 0) +#define GLGEN_ANA_TX_ALU_ACCSS_OUT_OF_PKT 0x0020D208 /* Reset Source: CORER */ +#define GLGEN_ANA_TX_ALU_ACCSS_OUT_OF_PKT_NPC_S 0 +#define GLGEN_ANA_TX_ALU_ACCSS_OUT_OF_PKT_NPC_M MAKEMASK(0xFF, 0) +#define GLGEN_ANA_TX_CFG_CTRL 0x0020D104 /* Reset Source: CORER */ +#define GLGEN_ANA_TX_CFG_CTRL_LINE_IDX_S 0 +#define GLGEN_ANA_TX_CFG_CTRL_LINE_IDX_M MAKEMASK(0x3FFFF, 0) +#define GLGEN_ANA_TX_CFG_CTRL_TABLE_ID_S 18 +#define GLGEN_ANA_TX_CFG_CTRL_TABLE_ID_M MAKEMASK(0xFF, 18) +#define GLGEN_ANA_TX_CFG_CTRL_RESRVED_S 26 +#define GLGEN_ANA_TX_CFG_CTRL_RESRVED_M MAKEMASK(0x7, 26) +#define GLGEN_ANA_TX_CFG_CTRL_OPERATION_ID_S 29 +#define GLGEN_ANA_TX_CFG_CTRL_OPERATION_ID_M MAKEMASK(0x7, 29) +#define GLGEN_ANA_TX_CFG_HTBL_LU_RESULT 0x0020D158 /* Reset Source: CORER */ +#define GLGEN_ANA_TX_CFG_HTBL_LU_RESULT_HIT_S 0 +#define GLGEN_ANA_TX_CFG_HTBL_LU_RESULT_HIT_M BIT(0) +#define GLGEN_ANA_TX_CFG_HTBL_LU_RESULT_PG_MEM_IDX_S 1 +#define GLGEN_ANA_TX_CFG_HTBL_LU_RESULT_PG_MEM_IDX_M MAKEMASK(0x7, 1) +#define GLGEN_ANA_TX_CFG_HTBL_LU_RESULT_ADDR_S 4 +#define GLGEN_ANA_TX_CFG_HTBL_LU_RESULT_ADDR_M MAKEMASK(0x1FF, 4) +#define GLGEN_ANA_TX_CFG_LU_KEY(_i) (0x0020D14C + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define GLGEN_ANA_TX_CFG_LU_KEY_MAX_INDEX 2 +#define GLGEN_ANA_TX_CFG_LU_KEY_LU_KEY_S 0 +#define GLGEN_ANA_TX_CFG_LU_KEY_LU_KEY_M MAKEMASK(0xFFFFFFFF, 0) +#define GLGEN_ANA_TX_CFG_RDDATA(_i) (0x0020D10C + ((_i) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define GLGEN_ANA_TX_CFG_RDDATA_MAX_INDEX 15 +#define GLGEN_ANA_TX_CFG_RDDATA_RD_DATA_S 0 +#define GLGEN_ANA_TX_CFG_RDDATA_RD_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GLGEN_ANA_TX_CFG_SPLBUF_LU_RESULT 0x0020D15C /* Reset Source: CORER */ +#define GLGEN_ANA_TX_CFG_SPLBUF_LU_RESULT_HIT_S 0 +#define GLGEN_ANA_TX_CFG_SPLBUF_LU_RESULT_HIT_M BIT(0) +#define GLGEN_ANA_TX_CFG_SPLBUF_LU_RESULT_RSV_S 1 +#define GLGEN_ANA_TX_CFG_SPLBUF_LU_RESULT_RSV_M MAKEMASK(0x7, 1) +#define GLGEN_ANA_TX_CFG_SPLBUF_LU_RESULT_ADDR_S 4 +#define GLGEN_ANA_TX_CFG_SPLBUF_LU_RESULT_ADDR_M MAKEMASK(0x1FF, 4) +#define GLGEN_ANA_TX_CFG_WRDATA 0x0020D108 /* Reset Source: CORER */ +#define GLGEN_ANA_TX_CFG_WRDATA_WR_DATA_S 0 +#define GLGEN_ANA_TX_CFG_WRDATA_WR_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GLGEN_ANA_TX_DEF_PTYPE 0x0020D100 /* Reset Source: CORER */ +#define GLGEN_ANA_TX_DEF_PTYPE_DEF_PTYPE_S 0 +#define GLGEN_ANA_TX_DEF_PTYPE_DEF_PTYPE_M MAKEMASK(0x3FF, 0) +#define GLGEN_ANA_TX_DFD_PACE_OUT 0x0020D4CC /* Reset Source: CORER */ +#define GLGEN_ANA_TX_DFD_PACE_OUT_PUSH_S 0 +#define GLGEN_ANA_TX_DFD_PACE_OUT_PUSH_M BIT(0) +#define GLGEN_ANA_TX_ERR_CTRL 0x0020D220 /* Reset Source: CORER */ +#define GLGEN_ANA_TX_ERR_CTRL_ERR_MASK_EN_S 0 +#define GLGEN_ANA_TX_ERR_CTRL_ERR_MASK_EN_M MAKEMASK(0xFFFFFFFF, 0) +#define GLGEN_ANA_TX_FLAG_MAP(_i) (0x0020D000 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: CORER */ +#define GLGEN_ANA_TX_FLAG_MAP_MAX_INDEX 63 +#define GLGEN_ANA_TX_FLAG_MAP_FLAG_EN_S 0 +#define GLGEN_ANA_TX_FLAG_MAP_FLAG_EN_M BIT(0) +#define GLGEN_ANA_TX_FLAG_MAP_EXT_FLAG_ID_S 1 +#define GLGEN_ANA_TX_FLAG_MAP_EXT_FLAG_ID_M MAKEMASK(0x3F, 1) +#define GLGEN_ANA_TX_INV_NODE_PTYPE 0x0020D210 /* Reset Source: CORER */ +#define GLGEN_ANA_TX_INV_NODE_PTYPE_INV_NODE_PTYPE_S 0 +#define GLGEN_ANA_TX_INV_NODE_PTYPE_INV_NODE_PTYPE_M MAKEMASK(0x7FF, 0) +#define GLGEN_ANA_TX_INV_PROT_ID 0x0020D214 /* Reset Source: CORER */ +#define GLGEN_ANA_TX_INV_PROT_ID_INV_PROT_ID_S 0 +#define GLGEN_ANA_TX_INV_PROT_ID_INV_PROT_ID_M MAKEMASK(0xFF, 0) +#define GLGEN_ANA_TX_INV_PTYPE_MARKER 0x0020D218 /* Reset Source: CORER */ +#define GLGEN_ANA_TX_INV_PTYPE_MARKER_INV_PTYPE_MARKER_S 0 +#define GLGEN_ANA_TX_INV_PTYPE_MARKER_INV_PTYPE_MARKER_M MAKEMASK(0x7F, 0) +#define GLGEN_ANA_TX_NMPG_KEYMASK(_i) (0x0020D1D0 + ((_i) * 4)) /* _i=0...3 */ /* Reset Source: CORER */ +#define GLGEN_ANA_TX_NMPG_KEYMASK_MAX_INDEX 3 +#define GLGEN_ANA_TX_NMPG_KEYMASK_HASH_KEY_S 0 +#define GLGEN_ANA_TX_NMPG_KEYMASK_HASH_KEY_M MAKEMASK(0xFFFFFFFF, 0) +#define GLGEN_ANA_TX_NMPG0_HASHKEY(_i) (0x0020D1B0 + ((_i) * 4)) /* _i=0...3 */ /* Reset Source: CORER */ +#define GLGEN_ANA_TX_NMPG0_HASHKEY_MAX_INDEX 3 +#define GLGEN_ANA_TX_NMPG0_HASHKEY_HASH_KEY_S 0 +#define GLGEN_ANA_TX_NMPG0_HASHKEY_HASH_KEY_M MAKEMASK(0xFFFFFFFF, 0) +#define GLGEN_ANA_TX_NO_HIT_PG_NM_PG 0x0020D204 /* Reset Source: CORER */ +#define GLGEN_ANA_TX_NO_HIT_PG_NM_PG_NPC_S 0 +#define GLGEN_ANA_TX_NO_HIT_PG_NM_PG_NPC_M MAKEMASK(0xFF, 0) +#define GLGEN_ANA_TX_P2P(_i) (0x0020D160 + ((_i) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define GLGEN_ANA_TX_P2P_MAX_INDEX 15 +#define GLGEN_ANA_TX_P2P_TARGET_PROF_S 0 +#define GLGEN_ANA_TX_P2P_TARGET_PROF_M MAKEMASK(0xF, 0) +#define GLGEN_ANA_TX_PG_KEYMASK(_i) (0x0020D1C0 + ((_i) * 4)) /* _i=0...3 */ /* Reset Source: CORER */ +#define GLGEN_ANA_TX_PG_KEYMASK_MAX_INDEX 3 +#define GLGEN_ANA_TX_PG_KEYMASK_HASH_KEY_S 0 +#define GLGEN_ANA_TX_PG_KEYMASK_HASH_KEY_M MAKEMASK(0xFFFFFFFF, 0) +#define GLGEN_ANA_TX_PG0_HASHKEY(_i) (0x0020D1A0 + ((_i) * 4)) /* _i=0...3 */ /* Reset Source: CORER */ +#define GLGEN_ANA_TX_PG0_HASHKEY_MAX_INDEX 3 +#define GLGEN_ANA_TX_PG0_HASHKEY_HASH_KEY_S 0 +#define GLGEN_ANA_TX_PG0_HASHKEY_HASH_KEY_M MAKEMASK(0xFFFFFFFF, 0) +#define GLGEN_ANA_TX_PROFIL_CTRL 0x0020D1FC /* Reset Source: CORER */ +#define GLGEN_ANA_TX_PROFIL_CTRL_PROFILE_SELECT_MDID_S 0 +#define GLGEN_ANA_TX_PROFIL_CTRL_PROFILE_SELECT_MDID_M MAKEMASK(0x1F, 0) +#define GLGEN_ANA_TX_PROFIL_CTRL_PROFILE_SELECT_MDSTART_S 5 +#define GLGEN_ANA_TX_PROFIL_CTRL_PROFILE_SELECT_MDSTART_M MAKEMASK(0xF, 5) +#define GLGEN_ANA_TX_PROFIL_CTRL_PROFILE_SELECT_MD_LEN_S 9 +#define GLGEN_ANA_TX_PROFIL_CTRL_PROFILE_SELECT_MD_LEN_M MAKEMASK(0x1F, 9) +#define GLGEN_ANA_TX_PROFIL_CTRL_NUM_CTRL_DOMAIN_S 14 +#define GLGEN_ANA_TX_PROFIL_CTRL_NUM_CTRL_DOMAIN_M MAKEMASK(0x3, 14) +#define GLGEN_ANA_TX_PROFIL_CTRL_DEF_PROF_ID_S 16 +#define GLGEN_ANA_TX_PROFIL_CTRL_DEF_PROF_ID_M MAKEMASK(0xF, 16) +#define GLGEN_ANA_TX_PROFIL_CTRL_SEL_DEF_PROF_ID_S 20 +#define GLGEN_ANA_TX_PROFIL_CTRL_SEL_DEF_PROF_ID_M BIT(20) +#define GLGEN_ASSERT_HLP 0x000B81E4 /* Reset Source: POR */ +#define GLGEN_ASSERT_HLP_CORE_ON_RST_S 0 +#define GLGEN_ASSERT_HLP_CORE_ON_RST_M BIT(0) +#define GLGEN_ASSERT_HLP_FULL_ON_RST_S 1 +#define GLGEN_ASSERT_HLP_FULL_ON_RST_M BIT(1) +#define GLGEN_CLKSTAT 0x000B8184 /* Reset Source: POR */ +#define GLGEN_CLKSTAT_U_CLK_SPEED_S 0 +#define GLGEN_CLKSTAT_U_CLK_SPEED_M MAKEMASK(0x7, 0) +#define GLGEN_CLKSTAT_L_CLK_SPEED_S 3 +#define GLGEN_CLKSTAT_L_CLK_SPEED_M MAKEMASK(0x7, 3) +#define GLGEN_CLKSTAT_PSM_CLK_SPEED_S 6 +#define GLGEN_CLKSTAT_PSM_CLK_SPEED_M MAKEMASK(0x7, 6) +#define GLGEN_CLKSTAT_RXCTL_CLK_SPEED_S 9 +#define GLGEN_CLKSTAT_RXCTL_CLK_SPEED_M MAKEMASK(0x7, 9) +#define GLGEN_CLKSTAT_UANA_CLK_SPEED_S 12 +#define GLGEN_CLKSTAT_UANA_CLK_SPEED_M MAKEMASK(0x7, 12) +#define GLGEN_CLKSTAT_PE_CLK_SPEED_S 18 +#define GLGEN_CLKSTAT_PE_CLK_SPEED_M MAKEMASK(0x7, 18) +#define GLGEN_CLKSTAT_SRC 0x000B826C /* Reset Source: POR */ +#define GLGEN_CLKSTAT_SRC_U_CLK_SRC_S 0 +#define GLGEN_CLKSTAT_SRC_U_CLK_SRC_M MAKEMASK(0x3, 0) +#define GLGEN_CLKSTAT_SRC_L_CLK_SRC_S 2 +#define GLGEN_CLKSTAT_SRC_L_CLK_SRC_M MAKEMASK(0x3, 2) +#define GLGEN_CLKSTAT_SRC_PSM_CLK_SRC_S 4 +#define GLGEN_CLKSTAT_SRC_PSM_CLK_SRC_M MAKEMASK(0x3, 4) +#define GLGEN_CLKSTAT_SRC_RXCTL_CLK_SRC_S 6 +#define GLGEN_CLKSTAT_SRC_RXCTL_CLK_SRC_M MAKEMASK(0x3, 6) +#define GLGEN_CLKSTAT_SRC_UANA_CLK_SRC_S 8 +#define GLGEN_CLKSTAT_SRC_UANA_CLK_SRC_M MAKEMASK(0xF, 8) +#define GLGEN_ECC_ERR_INT_TOG_MASK_H 0x00093A00 /* Reset Source: CORER */ +#define GLGEN_ECC_ERR_INT_TOG_MASK_H_CLIENT_NUM_S 0 +#define GLGEN_ECC_ERR_INT_TOG_MASK_H_CLIENT_NUM_M MAKEMASK(0x7F, 0) +#define GLGEN_ECC_ERR_INT_TOG_MASK_L 0x000939FC /* Reset Source: CORER */ +#define GLGEN_ECC_ERR_INT_TOG_MASK_L_CLIENT_NUM_S 0 +#define GLGEN_ECC_ERR_INT_TOG_MASK_L_CLIENT_NUM_M MAKEMASK(0xFFFFFFFF, 0) +#define GLGEN_ECC_ERR_RST_MASK_H 0x000939F8 /* Reset Source: CORER */ +#define GLGEN_ECC_ERR_RST_MASK_H_CLIENT_NUM_S 0 +#define GLGEN_ECC_ERR_RST_MASK_H_CLIENT_NUM_M MAKEMASK(0x7F, 0) +#define GLGEN_ECC_ERR_RST_MASK_L 0x000939F4 /* Reset Source: CORER */ +#define GLGEN_ECC_ERR_RST_MASK_L_CLIENT_NUM_S 0 +#define GLGEN_ECC_ERR_RST_MASK_L_CLIENT_NUM_M MAKEMASK(0xFFFFFFFF, 0) +#define GLGEN_GPIO_CTL(_i) (0x000880C8 + ((_i) * 4)) /* _i=0...6 */ /* Reset Source: POR */ +#define GLGEN_GPIO_CTL_MAX_INDEX 6 +#define GLGEN_GPIO_CTL_IN_VALUE_S 0 +#define GLGEN_GPIO_CTL_IN_VALUE_M BIT(0) +#define GLGEN_GPIO_CTL_IN_TRANSIT_S 1 +#define GLGEN_GPIO_CTL_IN_TRANSIT_M BIT(1) +#define GLGEN_GPIO_CTL_OUT_VALUE_S 2 +#define GLGEN_GPIO_CTL_OUT_VALUE_M BIT(2) +#define GLGEN_GPIO_CTL_NO_P_UP_S 3 +#define GLGEN_GPIO_CTL_NO_P_UP_M BIT(3) +#define GLGEN_GPIO_CTL_PIN_DIR_S 4 +#define GLGEN_GPIO_CTL_PIN_DIR_M BIT(4) +#define GLGEN_GPIO_CTL_TRI_CTL_S 5 +#define GLGEN_GPIO_CTL_TRI_CTL_M BIT(5) +#define GLGEN_GPIO_CTL_PIN_FUNC_S 8 +#define GLGEN_GPIO_CTL_PIN_FUNC_M MAKEMASK(0xF, 8) +#define GLGEN_GPIO_CTL_INT_MODE_S 12 +#define GLGEN_GPIO_CTL_INT_MODE_M MAKEMASK(0x3, 12) +#define GLGEN_MARKER_COUNT 0x000939E8 /* Reset Source: CORER */ +#define GLGEN_MARKER_COUNT_MARKER_COUNT_S 0 +#define GLGEN_MARKER_COUNT_MARKER_COUNT_M MAKEMASK(0xFF, 0) +#define GLGEN_MARKER_COUNT_MARKER_COUNT_EN_S 31 +#define GLGEN_MARKER_COUNT_MARKER_COUNT_EN_M BIT(31) +#define GLGEN_RSTAT 0x000B8188 /* Reset Source: POR */ +#define GLGEN_RSTAT_DEVSTATE_S 0 +#define GLGEN_RSTAT_DEVSTATE_M MAKEMASK(0x3, 0) +#define GLGEN_RSTAT_RESET_TYPE_S 2 +#define GLGEN_RSTAT_RESET_TYPE_M MAKEMASK(0x3, 2) +#define GLGEN_RSTAT_CORERCNT_S 4 +#define GLGEN_RSTAT_CORERCNT_M MAKEMASK(0x3, 4) +#define GLGEN_RSTAT_GLOBRCNT_S 6 +#define GLGEN_RSTAT_GLOBRCNT_M MAKEMASK(0x3, 6) +#define GLGEN_RSTAT_EMPRCNT_S 8 +#define GLGEN_RSTAT_EMPRCNT_M MAKEMASK(0x3, 8) +#define GLGEN_RSTAT_TIME_TO_RST_S 10 +#define GLGEN_RSTAT_TIME_TO_RST_M MAKEMASK(0x3F, 10) +#define GLGEN_RSTAT_RTRIG_FLR_S 16 +#define GLGEN_RSTAT_RTRIG_FLR_M BIT(16) +#define GLGEN_RSTAT_RTRIG_ECC_S 17 +#define GLGEN_RSTAT_RTRIG_ECC_M BIT(17) +#define GLGEN_RSTAT_RTRIG_FW_AUX_S 18 +#define GLGEN_RSTAT_RTRIG_FW_AUX_M BIT(18) +#define GLGEN_RSTCTL 0x000B8180 /* Reset Source: POR */ +#define GLGEN_RSTCTL_GRSTDEL_S 0 +#define GLGEN_RSTCTL_GRSTDEL_M MAKEMASK(0x3F, 0) +#define GLGEN_RSTCTL_ECC_RST_ENA_S 8 +#define GLGEN_RSTCTL_ECC_RST_ENA_M BIT(8) +#define GLGEN_RSTCTL_ECC_RT_EN_S 30 +#define GLGEN_RSTCTL_ECC_RT_EN_M BIT(30) +#define GLGEN_RSTCTL_FLR_RT_EN_S 31 +#define GLGEN_RSTCTL_FLR_RT_EN_M BIT(31) +#define GLGEN_RTRIG 0x000B8190 /* Reset Source: CORER */ +#define GLGEN_RTRIG_CORER_S 0 +#define GLGEN_RTRIG_CORER_M BIT(0) +#define GLGEN_RTRIG_GLOBR_S 1 +#define GLGEN_RTRIG_GLOBR_M BIT(1) +#define GLGEN_RTRIG_EMPFWR_S 2 +#define GLGEN_RTRIG_EMPFWR_M BIT(2) +#define GLGEN_STAT 0x000B612C /* Reset Source: POR */ +#define GLGEN_STAT_RSVD4FW_S 0 +#define GLGEN_STAT_RSVD4FW_M MAKEMASK(0xFF, 0) +#define GLGEN_VFLRSTAT(_i) (0x00093A04 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLGEN_VFLRSTAT_MAX_INDEX 7 +#define GLGEN_VFLRSTAT_VFLRS_S 0 +#define GLGEN_VFLRSTAT_VFLRS_M MAKEMASK(0xFFFFFFFF, 0) +#define GLGEN_XLR_MSK2HLP_RDY 0x000939F0 /* Reset Source: CORER */ +#define GLGEN_XLR_MSK2HLP_RDY_GLGEN_XLR_MSK2HLP_RDY_S 0 +#define GLGEN_XLR_MSK2HLP_RDY_GLGEN_XLR_MSK2HLP_RDY_M BIT(0) +#define GLGEN_XLR_TRNS_WAIT_COUNT 0x000939EC /* Reset Source: CORER */ +#define GLGEN_XLR_TRNS_WAIT_COUNT_W_BTWN_TRNS_COUNT_S 0 +#define GLGEN_XLR_TRNS_WAIT_COUNT_W_BTWN_TRNS_COUNT_M MAKEMASK(0x1F, 0) +#define GLGEN_XLR_TRNS_WAIT_COUNT_W_PEND_TRNS_COUNT_S 8 +#define GLGEN_XLR_TRNS_WAIT_COUNT_W_PEND_TRNS_COUNT_M MAKEMASK(0xFF, 8) +#define GLVFGEN_TIMER 0x000B8214 /* Reset Source: POR */ +#define GLVFGEN_TIMER_GTIME_S 0 +#define GLVFGEN_TIMER_GTIME_M MAKEMASK(0xFFFFFFFF, 0) +#define PFGEN_CTRL 0x00091000 /* Reset Source: CORER */ +#define PFGEN_CTRL_PFSWR_S 0 +#define PFGEN_CTRL_PFSWR_M BIT(0) +#define PFGEN_DRUN 0x00091180 /* Reset Source: CORER */ +#define PFGEN_DRUN_DRVUNLD_S 0 +#define PFGEN_DRUN_DRVUNLD_M BIT(0) +#define PFGEN_PFRSTAT 0x00091080 /* Reset Source: CORER */ +#define PFGEN_PFRSTAT_PFRD_S 0 +#define PFGEN_PFRSTAT_PFRD_M BIT(0) +#define PFGEN_PORTNUM 0x001D2400 /* Reset Source: CORER */ +#define PFGEN_PORTNUM_PORT_NUM_S 0 +#define PFGEN_PORTNUM_PORT_NUM_M MAKEMASK(0x7, 0) +#define PFGEN_STATE 0x00088000 /* Reset Source: CORER */ +#define PFGEN_STATE_PFPEEN_S 0 +#define PFGEN_STATE_PFPEEN_M BIT(0) +#define PFGEN_STATE_RSVD_S 1 +#define PFGEN_STATE_RSVD_M BIT(1) +#define PFGEN_STATE_PFLINKEN_S 2 +#define PFGEN_STATE_PFLINKEN_M BIT(2) +#define PFGEN_STATE_PFSCEN_S 3 +#define PFGEN_STATE_PFSCEN_M BIT(3) +#define PRT_TCVMLR_DRAIN_CNTR 0x000A21C0 /* Reset Source: CORER */ +#define PRT_TCVMLR_DRAIN_CNTR_CNTR_S 0 +#define PRT_TCVMLR_DRAIN_CNTR_CNTR_M MAKEMASK(0x3FFF, 0) +#define PRTGEN_CNF 0x000B8120 /* Reset Source: POR */ +#define PRTGEN_CNF_PORT_DIS_S 0 +#define PRTGEN_CNF_PORT_DIS_M BIT(0) +#define PRTGEN_CNF_ALLOW_PORT_DIS_S 1 +#define PRTGEN_CNF_ALLOW_PORT_DIS_M BIT(1) +#define PRTGEN_CNF_EMP_PORT_DIS_S 2 +#define PRTGEN_CNF_EMP_PORT_DIS_M BIT(2) +#define PRTGEN_CNF2 0x000B8160 /* Reset Source: POR */ +#define PRTGEN_CNF2_ACTIVATE_PORT_LINK_S 0 +#define PRTGEN_CNF2_ACTIVATE_PORT_LINK_M BIT(0) +#define PRTGEN_CNF3 0x000B8280 /* Reset Source: POR */ +#define PRTGEN_CNF3_PORT_STAGERING_EN_S 0 +#define PRTGEN_CNF3_PORT_STAGERING_EN_M BIT(0) +#define PRTGEN_STATUS 0x000B8100 /* Reset Source: POR */ +#define PRTGEN_STATUS_PORT_VALID_S 0 +#define PRTGEN_STATUS_PORT_VALID_M BIT(0) +#define PRTGEN_STATUS_PORT_ACTIVE_S 1 +#define PRTGEN_STATUS_PORT_ACTIVE_M BIT(1) +#define VFGEN_RSTAT(_VF) (0x00074000 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: VFR */ +#define VFGEN_RSTAT_MAX_INDEX 255 +#define VFGEN_RSTAT_VFR_STATE_S 0 +#define VFGEN_RSTAT_VFR_STATE_M MAKEMASK(0x3, 0) +#define VPGEN_VFRSTAT(_VF) (0x00090800 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VPGEN_VFRSTAT_MAX_INDEX 255 +#define VPGEN_VFRSTAT_VFRD_S 0 +#define VPGEN_VFRSTAT_VFRD_M BIT(0) +#define VPGEN_VFRTRIG(_VF) (0x00090000 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VPGEN_VFRTRIG_MAX_INDEX 255 +#define VPGEN_VFRTRIG_VFSWR_S 0 +#define VPGEN_VFRTRIG_VFSWR_M BIT(0) +#define VSIGEN_RSTAT(_VSI) (0x00092800 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSIGEN_RSTAT_MAX_INDEX 767 +#define VSIGEN_RSTAT_VMRD_S 0 +#define VSIGEN_RSTAT_VMRD_M BIT(0) +#define VSIGEN_RTRIG(_VSI) (0x00091800 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSIGEN_RTRIG_MAX_INDEX 767 +#define VSIGEN_RTRIG_VMSWR_S 0 +#define VSIGEN_RTRIG_VMSWR_M BIT(0) +#define GLHMC_APBVTINUSEBASE(_i) (0x00524A00 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_APBVTINUSEBASE_MAX_INDEX 7 +#define GLHMC_APBVTINUSEBASE_FPMAPBINUSEBASE_S 0 +#define GLHMC_APBVTINUSEBASE_FPMAPBINUSEBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_CEQPART(_i) (0x005031C0 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_CEQPART_MAX_INDEX 7 +#define GLHMC_CEQPART_PMCEQBASE_S 0 +#define GLHMC_CEQPART_PMCEQBASE_M MAKEMASK(0x3FF, 0) +#define GLHMC_CEQPART_PMCEQSIZE_S 16 +#define GLHMC_CEQPART_PMCEQSIZE_M MAKEMASK(0x3FF, 16) +#define GLHMC_DBCQMAX 0x005220F0 /* Reset Source: CORER */ +#define GLHMC_DBCQMAX_GLHMC_DBCQMAX_S 0 +#define GLHMC_DBCQMAX_GLHMC_DBCQMAX_M MAKEMASK(0xFFFFF, 0) +#define GLHMC_DBCQPART(_i) (0x00503180 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_DBCQPART_MAX_INDEX 7 +#define GLHMC_DBCQPART_PMDBCQBASE_S 0 +#define GLHMC_DBCQPART_PMDBCQBASE_M MAKEMASK(0x3FFF, 0) +#define GLHMC_DBCQPART_PMDBCQSIZE_S 16 +#define GLHMC_DBCQPART_PMDBCQSIZE_M MAKEMASK(0x7FFF, 16) +#define GLHMC_DBQPMAX 0x005220EC /* Reset Source: CORER */ +#define GLHMC_DBQPMAX_GLHMC_DBQPMAX_S 0 +#define GLHMC_DBQPMAX_GLHMC_DBQPMAX_M MAKEMASK(0x7FFFF, 0) +#define GLHMC_DBQPPART(_i) (0x005044C0 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_DBQPPART_MAX_INDEX 7 +#define GLHMC_DBQPPART_PMDBQPBASE_S 0 +#define GLHMC_DBQPPART_PMDBQPBASE_M MAKEMASK(0x3FFF, 0) +#define GLHMC_DBQPPART_PMDBQPSIZE_S 16 +#define GLHMC_DBQPPART_PMDBQPSIZE_M MAKEMASK(0x7FFF, 16) +#define GLHMC_FSIAVBASE(_i) (0x00525600 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_FSIAVBASE_MAX_INDEX 7 +#define GLHMC_FSIAVBASE_FPMFSIAVBASE_S 0 +#define GLHMC_FSIAVBASE_FPMFSIAVBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_FSIAVCNT(_i) (0x00525700 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_FSIAVCNT_MAX_INDEX 7 +#define GLHMC_FSIAVCNT_FPMFSIAVCNT_S 0 +#define GLHMC_FSIAVCNT_FPMFSIAVCNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_FSIAVMAX 0x00522068 /* Reset Source: CORER */ +#define GLHMC_FSIAVMAX_PMFSIAVMAX_S 0 +#define GLHMC_FSIAVMAX_PMFSIAVMAX_M MAKEMASK(0x3FFFF, 0) +#define GLHMC_FSIAVOBJSZ 0x00522064 /* Reset Source: CORER */ +#define GLHMC_FSIAVOBJSZ_PMFSIAVOBJSZ_S 0 +#define GLHMC_FSIAVOBJSZ_PMFSIAVOBJSZ_M MAKEMASK(0xF, 0) +#define GLHMC_FSIMCBASE(_i) (0x00526000 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_FSIMCBASE_MAX_INDEX 7 +#define GLHMC_FSIMCBASE_FPMFSIMCBASE_S 0 +#define GLHMC_FSIMCBASE_FPMFSIMCBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_FSIMCCNT(_i) (0x00526100 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_FSIMCCNT_MAX_INDEX 7 +#define GLHMC_FSIMCCNT_FPMFSIMCSZ_S 0 +#define GLHMC_FSIMCCNT_FPMFSIMCSZ_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_FSIMCMAX 0x00522060 /* Reset Source: CORER */ +#define GLHMC_FSIMCMAX_PMFSIMCMAX_S 0 +#define GLHMC_FSIMCMAX_PMFSIMCMAX_M MAKEMASK(0x3FFF, 0) +#define GLHMC_FSIMCOBJSZ 0x0052205C /* Reset Source: CORER */ +#define GLHMC_FSIMCOBJSZ_PMFSIMCOBJSZ_S 0 +#define GLHMC_FSIMCOBJSZ_PMFSIMCOBJSZ_M MAKEMASK(0xF, 0) +#define GLHMC_FWPDINV 0x0052207C /* Reset Source: CORER */ +#define GLHMC_FWPDINV_PMSDIDX_S 0 +#define GLHMC_FWPDINV_PMSDIDX_M MAKEMASK(0xFFF, 0) +#define GLHMC_FWPDINV_PMSDPARTSEL_S 15 +#define GLHMC_FWPDINV_PMSDPARTSEL_M BIT(15) +#define GLHMC_FWPDINV_PMPDIDX_S 16 +#define GLHMC_FWPDINV_PMPDIDX_M MAKEMASK(0x1FF, 16) +#define GLHMC_FWPDINV_FPMAT 0x0010207C /* Reset Source: CORER */ +#define GLHMC_FWPDINV_FPMAT_PMSDIDX_S 0 +#define GLHMC_FWPDINV_FPMAT_PMSDIDX_M MAKEMASK(0xFFF, 0) +#define GLHMC_FWPDINV_FPMAT_PMSDPARTSEL_S 15 +#define GLHMC_FWPDINV_FPMAT_PMSDPARTSEL_M BIT(15) +#define GLHMC_FWPDINV_FPMAT_PMPDIDX_S 16 +#define GLHMC_FWPDINV_FPMAT_PMPDIDX_M MAKEMASK(0x1FF, 16) +#define GLHMC_FWSDDATAHIGH 0x00522078 /* Reset Source: CORER */ +#define GLHMC_FWSDDATAHIGH_PMSDDATAHIGH_S 0 +#define GLHMC_FWSDDATAHIGH_PMSDDATAHIGH_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_FWSDDATAHIGH_FPMAT 0x00102078 /* Reset Source: CORER */ +#define GLHMC_FWSDDATAHIGH_FPMAT_PMSDDATAHIGH_S 0 +#define GLHMC_FWSDDATAHIGH_FPMAT_PMSDDATAHIGH_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_FWSDDATALOW 0x00522074 /* Reset Source: CORER */ +#define GLHMC_FWSDDATALOW_PMSDVALID_S 0 +#define GLHMC_FWSDDATALOW_PMSDVALID_M BIT(0) +#define GLHMC_FWSDDATALOW_PMSDTYPE_S 1 +#define GLHMC_FWSDDATALOW_PMSDTYPE_M BIT(1) +#define GLHMC_FWSDDATALOW_PMSDBPCOUNT_S 2 +#define GLHMC_FWSDDATALOW_PMSDBPCOUNT_M MAKEMASK(0x3FF, 2) +#define GLHMC_FWSDDATALOW_PMSDDATALOW_S 12 +#define GLHMC_FWSDDATALOW_PMSDDATALOW_M MAKEMASK(0xFFFFF, 12) +#define GLHMC_FWSDDATALOW_FPMAT 0x00102074 /* Reset Source: CORER */ +#define GLHMC_FWSDDATALOW_FPMAT_PMSDVALID_S 0 +#define GLHMC_FWSDDATALOW_FPMAT_PMSDVALID_M BIT(0) +#define GLHMC_FWSDDATALOW_FPMAT_PMSDTYPE_S 1 +#define GLHMC_FWSDDATALOW_FPMAT_PMSDTYPE_M BIT(1) +#define GLHMC_FWSDDATALOW_FPMAT_PMSDBPCOUNT_S 2 +#define GLHMC_FWSDDATALOW_FPMAT_PMSDBPCOUNT_M MAKEMASK(0x3FF, 2) +#define GLHMC_FWSDDATALOW_FPMAT_PMSDDATALOW_S 12 +#define GLHMC_FWSDDATALOW_FPMAT_PMSDDATALOW_M MAKEMASK(0xFFFFF, 12) +#define GLHMC_PEARPBASE(_i) (0x00524800 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEARPBASE_MAX_INDEX 7 +#define GLHMC_PEARPBASE_FPMPEARPBASE_S 0 +#define GLHMC_PEARPBASE_FPMPEARPBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_PEARPCNT(_i) (0x00524900 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEARPCNT_MAX_INDEX 7 +#define GLHMC_PEARPCNT_FPMPEARPCNT_S 0 +#define GLHMC_PEARPCNT_FPMPEARPCNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_PEARPMAX 0x00522038 /* Reset Source: CORER */ +#define GLHMC_PEARPMAX_PMPEARPMAX_S 0 +#define GLHMC_PEARPMAX_PMPEARPMAX_M MAKEMASK(0x1FFFF, 0) +#define GLHMC_PEARPOBJSZ 0x00522034 /* Reset Source: CORER */ +#define GLHMC_PEARPOBJSZ_PMPEARPOBJSZ_S 0 +#define GLHMC_PEARPOBJSZ_PMPEARPOBJSZ_M MAKEMASK(0x7, 0) +#define GLHMC_PECQBASE(_i) (0x00524200 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PECQBASE_MAX_INDEX 7 +#define GLHMC_PECQBASE_FPMPECQBASE_S 0 +#define GLHMC_PECQBASE_FPMPECQBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_PECQCNT(_i) (0x00524300 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PECQCNT_MAX_INDEX 7 +#define GLHMC_PECQCNT_FPMPECQCNT_S 0 +#define GLHMC_PECQCNT_FPMPECQCNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_PECQOBJSZ 0x00522020 /* Reset Source: CORER */ +#define GLHMC_PECQOBJSZ_PMPECQOBJSZ_S 0 +#define GLHMC_PECQOBJSZ_PMPECQOBJSZ_M MAKEMASK(0xF, 0) +#define GLHMC_PEHDRBASE(_i) (0x00526200 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEHDRBASE_MAX_INDEX 7 +#define GLHMC_PEHDRBASE_GLHMC_PEHDRBASE_S 0 +#define GLHMC_PEHDRBASE_GLHMC_PEHDRBASE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_PEHDRCNT(_i) (0x00526300 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEHDRCNT_MAX_INDEX 7 +#define GLHMC_PEHDRCNT_GLHMC_PEHDRCNT_S 0 +#define GLHMC_PEHDRCNT_GLHMC_PEHDRCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_PEHDRMAX 0x00522008 /* Reset Source: CORER */ +#define GLHMC_PEHDRMAX_PMPEHDRMAX_S 0 +#define GLHMC_PEHDRMAX_PMPEHDRMAX_M MAKEMASK(0x7FFFF, 0) +#define GLHMC_PEHDRMAX_RSVD_S 19 +#define GLHMC_PEHDRMAX_RSVD_M MAKEMASK(0x1FFF, 19) +#define GLHMC_PEHDROBJSZ 0x00522004 /* Reset Source: CORER */ +#define GLHMC_PEHDROBJSZ_PMPEHDROBJSZ_S 0 +#define GLHMC_PEHDROBJSZ_PMPEHDROBJSZ_M MAKEMASK(0xF, 0) +#define GLHMC_PEHDROBJSZ_RSVD_S 4 +#define GLHMC_PEHDROBJSZ_RSVD_M MAKEMASK(0xFFFFFFF, 4) +#define GLHMC_PEHTCNT(_i) (0x00524700 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEHTCNT_MAX_INDEX 7 +#define GLHMC_PEHTCNT_FPMPEHTCNT_S 0 +#define GLHMC_PEHTCNT_FPMPEHTCNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_PEHTCNT_FPMAT(_i) (0x00104700 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEHTCNT_FPMAT_MAX_INDEX 7 +#define GLHMC_PEHTCNT_FPMAT_FPMPEHTCNT_S 0 +#define GLHMC_PEHTCNT_FPMAT_FPMPEHTCNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_PEHTEBASE(_i) (0x00524600 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEHTEBASE_MAX_INDEX 7 +#define GLHMC_PEHTEBASE_FPMPEHTEBASE_S 0 +#define GLHMC_PEHTEBASE_FPMPEHTEBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_PEHTEBASE_FPMAT(_i) (0x00104600 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEHTEBASE_FPMAT_MAX_INDEX 7 +#define GLHMC_PEHTEBASE_FPMAT_FPMPEHTEBASE_S 0 +#define GLHMC_PEHTEBASE_FPMAT_FPMPEHTEBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_PEHTEOBJSZ 0x0052202C /* Reset Source: CORER */ +#define GLHMC_PEHTEOBJSZ_PMPEHTEOBJSZ_S 0 +#define GLHMC_PEHTEOBJSZ_PMPEHTEOBJSZ_M MAKEMASK(0xF, 0) +#define GLHMC_PEHTEOBJSZ_FPMAT 0x0010202C /* Reset Source: CORER */ +#define GLHMC_PEHTEOBJSZ_FPMAT_PMPEHTEOBJSZ_S 0 +#define GLHMC_PEHTEOBJSZ_FPMAT_PMPEHTEOBJSZ_M MAKEMASK(0xF, 0) +#define GLHMC_PEHTMAX 0x00522030 /* Reset Source: CORER */ +#define GLHMC_PEHTMAX_PMPEHTMAX_S 0 +#define GLHMC_PEHTMAX_PMPEHTMAX_M MAKEMASK(0x1FFFFF, 0) +#define GLHMC_PEHTMAX_FPMAT 0x00102030 /* Reset Source: CORER */ +#define GLHMC_PEHTMAX_FPMAT_PMPEHTMAX_S 0 +#define GLHMC_PEHTMAX_FPMAT_PMPEHTMAX_M MAKEMASK(0x1FFFFF, 0) +#define GLHMC_PEMDBASE(_i) (0x00526400 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEMDBASE_MAX_INDEX 7 +#define GLHMC_PEMDBASE_GLHMC_PEMDBASE_S 0 +#define GLHMC_PEMDBASE_GLHMC_PEMDBASE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_PEMDCNT(_i) (0x00526500 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEMDCNT_MAX_INDEX 7 +#define GLHMC_PEMDCNT_GLHMC_PEMDCNT_S 0 +#define GLHMC_PEMDCNT_GLHMC_PEMDCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_PEMDMAX 0x00522010 /* Reset Source: CORER */ +#define GLHMC_PEMDMAX_PMPEMDMAX_S 0 +#define GLHMC_PEMDMAX_PMPEMDMAX_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_PEMDMAX_RSVD_S 24 +#define GLHMC_PEMDMAX_RSVD_M MAKEMASK(0xFF, 24) +#define GLHMC_PEMDOBJSZ 0x0052200C /* Reset Source: CORER */ +#define GLHMC_PEMDOBJSZ_PMPEMDOBJSZ_S 0 +#define GLHMC_PEMDOBJSZ_PMPEMDOBJSZ_M MAKEMASK(0xF, 0) +#define GLHMC_PEMDOBJSZ_RSVD_S 4 +#define GLHMC_PEMDOBJSZ_RSVD_M MAKEMASK(0xFFFFFFF, 4) +#define GLHMC_PEMRBASE(_i) (0x00524C00 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEMRBASE_MAX_INDEX 7 +#define GLHMC_PEMRBASE_FPMPEMRBASE_S 0 +#define GLHMC_PEMRBASE_FPMPEMRBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_PEMRCNT(_i) (0x00524D00 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEMRCNT_MAX_INDEX 7 +#define GLHMC_PEMRCNT_FPMPEMRSZ_S 0 +#define GLHMC_PEMRCNT_FPMPEMRSZ_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_PEMRMAX 0x00522040 /* Reset Source: CORER */ +#define GLHMC_PEMRMAX_PMPEMRMAX_S 0 +#define GLHMC_PEMRMAX_PMPEMRMAX_M MAKEMASK(0x7FFFFF, 0) +#define GLHMC_PEMROBJSZ 0x0052203C /* Reset Source: CORER */ +#define GLHMC_PEMROBJSZ_PMPEMROBJSZ_S 0 +#define GLHMC_PEMROBJSZ_PMPEMROBJSZ_M MAKEMASK(0xF, 0) +#define GLHMC_PEOOISCBASE(_i) (0x00526600 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEOOISCBASE_MAX_INDEX 7 +#define GLHMC_PEOOISCBASE_GLHMC_PEOOISCBASE_S 0 +#define GLHMC_PEOOISCBASE_GLHMC_PEOOISCBASE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_PEOOISCCNT(_i) (0x00526700 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEOOISCCNT_MAX_INDEX 7 +#define GLHMC_PEOOISCCNT_GLHMC_PEOOISCCNT_S 0 +#define GLHMC_PEOOISCCNT_GLHMC_PEOOISCCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_PEOOISCFFLBASE(_i) (0x00526C00 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEOOISCFFLBASE_MAX_INDEX 7 +#define GLHMC_PEOOISCFFLBASE_GLHMC_PEOOISCFFLBASE_S 0 +#define GLHMC_PEOOISCFFLBASE_GLHMC_PEOOISCFFLBASE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_PEOOISCFFLCNT_PMAT(_i) (0x00526D00 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEOOISCFFLCNT_PMAT_MAX_INDEX 7 +#define GLHMC_PEOOISCFFLCNT_PMAT_FPMPEOOISCFLCNT_S 0 +#define GLHMC_PEOOISCFFLCNT_PMAT_FPMPEOOISCFLCNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_PEOOISCFFLMAX 0x005220A4 /* Reset Source: CORER */ +#define GLHMC_PEOOISCFFLMAX_PMPEOOISCFFLMAX_S 0 +#define GLHMC_PEOOISCFFLMAX_PMPEOOISCFFLMAX_M MAKEMASK(0x7FFFF, 0) +#define GLHMC_PEOOISCFFLMAX_RSVD_S 19 +#define GLHMC_PEOOISCFFLMAX_RSVD_M MAKEMASK(0x1FFF, 19) +#define GLHMC_PEOOISCMAX 0x00522018 /* Reset Source: CORER */ +#define GLHMC_PEOOISCMAX_PMPEOOISCMAX_S 0 +#define GLHMC_PEOOISCMAX_PMPEOOISCMAX_M MAKEMASK(0x7FFFF, 0) +#define GLHMC_PEOOISCMAX_RSVD_S 19 +#define GLHMC_PEOOISCMAX_RSVD_M MAKEMASK(0x1FFF, 19) +#define GLHMC_PEOOISCOBJSZ 0x00522014 /* Reset Source: CORER */ +#define GLHMC_PEOOISCOBJSZ_PMPEOOISCOBJSZ_S 0 +#define GLHMC_PEOOISCOBJSZ_PMPEOOISCOBJSZ_M MAKEMASK(0xF, 0) +#define GLHMC_PEOOISCOBJSZ_RSVD_S 4 +#define GLHMC_PEOOISCOBJSZ_RSVD_M MAKEMASK(0xFFFFFFF, 4) +#define GLHMC_PEPBLBASE(_i) (0x00525800 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEPBLBASE_MAX_INDEX 7 +#define GLHMC_PEPBLBASE_FPMPEPBLBASE_S 0 +#define GLHMC_PEPBLBASE_FPMPEPBLBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_PEPBLCNT(_i) (0x00525900 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEPBLCNT_MAX_INDEX 7 +#define GLHMC_PEPBLCNT_FPMPEPBLCNT_S 0 +#define GLHMC_PEPBLCNT_FPMPEPBLCNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_PEPBLMAX 0x0052206C /* Reset Source: CORER */ +#define GLHMC_PEPBLMAX_PMPEPBLMAX_S 0 +#define GLHMC_PEPBLMAX_PMPEPBLMAX_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_PEQ1BASE(_i) (0x00525200 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEQ1BASE_MAX_INDEX 7 +#define GLHMC_PEQ1BASE_FPMPEQ1BASE_S 0 +#define GLHMC_PEQ1BASE_FPMPEQ1BASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_PEQ1CNT(_i) (0x00525300 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEQ1CNT_MAX_INDEX 7 +#define GLHMC_PEQ1CNT_FPMPEQ1CNT_S 0 +#define GLHMC_PEQ1CNT_FPMPEQ1CNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_PEQ1FLBASE(_i) (0x00525400 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEQ1FLBASE_MAX_INDEX 7 +#define GLHMC_PEQ1FLBASE_FPMPEQ1FLBASE_S 0 +#define GLHMC_PEQ1FLBASE_FPMPEQ1FLBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_PEQ1FLMAX 0x00522058 /* Reset Source: CORER */ +#define GLHMC_PEQ1FLMAX_PMPEQ1FLMAX_S 0 +#define GLHMC_PEQ1FLMAX_PMPEQ1FLMAX_M MAKEMASK(0x3FFFFFF, 0) +#define GLHMC_PEQ1MAX 0x00522054 /* Reset Source: CORER */ +#define GLHMC_PEQ1MAX_PMPEQ1MAX_S 0 +#define GLHMC_PEQ1MAX_PMPEQ1MAX_M MAKEMASK(0xFFFFFFF, 0) +#define GLHMC_PEQ1OBJSZ 0x00522050 /* Reset Source: CORER */ +#define GLHMC_PEQ1OBJSZ_PMPEQ1OBJSZ_S 0 +#define GLHMC_PEQ1OBJSZ_PMPEQ1OBJSZ_M MAKEMASK(0xF, 0) +#define GLHMC_PEQPBASE(_i) (0x00524000 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEQPBASE_MAX_INDEX 7 +#define GLHMC_PEQPBASE_FPMPEQPBASE_S 0 +#define GLHMC_PEQPBASE_FPMPEQPBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_PEQPCNT(_i) (0x00524100 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEQPCNT_MAX_INDEX 7 +#define GLHMC_PEQPCNT_FPMPEQPCNT_S 0 +#define GLHMC_PEQPCNT_FPMPEQPCNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_PEQPOBJSZ 0x0052201C /* Reset Source: CORER */ +#define GLHMC_PEQPOBJSZ_PMPEQPOBJSZ_S 0 +#define GLHMC_PEQPOBJSZ_PMPEQPOBJSZ_M MAKEMASK(0xF, 0) +#define GLHMC_PERRFBASE(_i) (0x00526800 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PERRFBASE_MAX_INDEX 7 +#define GLHMC_PERRFBASE_GLHMC_PERRFBASE_S 0 +#define GLHMC_PERRFBASE_GLHMC_PERRFBASE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_PERRFCNT(_i) (0x00526900 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PERRFCNT_MAX_INDEX 7 +#define GLHMC_PERRFCNT_GLHMC_PERRFCNT_S 0 +#define GLHMC_PERRFCNT_GLHMC_PERRFCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_PERRFFLBASE(_i) (0x00526A00 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PERRFFLBASE_MAX_INDEX 7 +#define GLHMC_PERRFFLBASE_GLHMC_PERRFFLBASE_S 0 +#define GLHMC_PERRFFLBASE_GLHMC_PERRFFLBASE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_PERRFFLCNT_PMAT(_i) (0x00526B00 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PERRFFLCNT_PMAT_MAX_INDEX 7 +#define GLHMC_PERRFFLCNT_PMAT_FPMPERRFFLCNT_S 0 +#define GLHMC_PERRFFLCNT_PMAT_FPMPERRFFLCNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_PERRFFLMAX 0x005220A0 /* Reset Source: CORER */ +#define GLHMC_PERRFFLMAX_PMPERRFFLMAX_S 0 +#define GLHMC_PERRFFLMAX_PMPERRFFLMAX_M MAKEMASK(0x3FFFFFF, 0) +#define GLHMC_PERRFFLMAX_RSVD_S 26 +#define GLHMC_PERRFFLMAX_RSVD_M MAKEMASK(0x3F, 26) +#define GLHMC_PERRFMAX 0x0052209C /* Reset Source: CORER */ +#define GLHMC_PERRFMAX_PMPERRFMAX_S 0 +#define GLHMC_PERRFMAX_PMPERRFMAX_M MAKEMASK(0xFFFFFFF, 0) +#define GLHMC_PERRFMAX_RSVD_S 28 +#define GLHMC_PERRFMAX_RSVD_M MAKEMASK(0xF, 28) +#define GLHMC_PERRFOBJSZ 0x00522098 /* Reset Source: CORER */ +#define GLHMC_PERRFOBJSZ_PMPERRFOBJSZ_S 0 +#define GLHMC_PERRFOBJSZ_PMPERRFOBJSZ_M MAKEMASK(0xF, 0) +#define GLHMC_PERRFOBJSZ_RSVD_S 4 +#define GLHMC_PERRFOBJSZ_RSVD_M MAKEMASK(0xFFFFFFF, 4) +#define GLHMC_PETIMERBASE(_i) (0x00525A00 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PETIMERBASE_MAX_INDEX 7 +#define GLHMC_PETIMERBASE_FPMPETIMERBASE_S 0 +#define GLHMC_PETIMERBASE_FPMPETIMERBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_PETIMERCNT(_i) (0x00525B00 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PETIMERCNT_MAX_INDEX 7 +#define GLHMC_PETIMERCNT_FPMPETIMERCNT_S 0 +#define GLHMC_PETIMERCNT_FPMPETIMERCNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_PETIMERMAX 0x00522084 /* Reset Source: CORER */ +#define GLHMC_PETIMERMAX_PMPETIMERMAX_S 0 +#define GLHMC_PETIMERMAX_PMPETIMERMAX_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_PETIMEROBJSZ 0x00522080 /* Reset Source: CORER */ +#define GLHMC_PETIMEROBJSZ_PMPETIMEROBJSZ_S 0 +#define GLHMC_PETIMEROBJSZ_PMPETIMEROBJSZ_M MAKEMASK(0xF, 0) +#define GLHMC_PEXFBASE(_i) (0x00524E00 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEXFBASE_MAX_INDEX 7 +#define GLHMC_PEXFBASE_FPMPEXFBASE_S 0 +#define GLHMC_PEXFBASE_FPMPEXFBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_PEXFCNT(_i) (0x00524F00 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEXFCNT_MAX_INDEX 7 +#define GLHMC_PEXFCNT_FPMPEXFCNT_S 0 +#define GLHMC_PEXFCNT_FPMPEXFCNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_PEXFFLBASE(_i) (0x00525000 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PEXFFLBASE_MAX_INDEX 7 +#define GLHMC_PEXFFLBASE_FPMPEXFFLBASE_S 0 +#define GLHMC_PEXFFLBASE_FPMPEXFFLBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_PEXFFLMAX 0x0052204C /* Reset Source: CORER */ +#define GLHMC_PEXFFLMAX_PMPEXFFLMAX_S 0 +#define GLHMC_PEXFFLMAX_PMPEXFFLMAX_M MAKEMASK(0xFFFFFFF, 0) +#define GLHMC_PEXFMAX 0x00522048 /* Reset Source: CORER */ +#define GLHMC_PEXFMAX_PMPEXFMAX_S 0 +#define GLHMC_PEXFMAX_PMPEXFMAX_M MAKEMASK(0xFFFFFFF, 0) +#define GLHMC_PEXFOBJSZ 0x00522044 /* Reset Source: CORER */ +#define GLHMC_PEXFOBJSZ_PMPEXFOBJSZ_S 0 +#define GLHMC_PEXFOBJSZ_PMPEXFOBJSZ_M MAKEMASK(0xF, 0) +#define GLHMC_PFPESDPART(_i) (0x00520880 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PFPESDPART_MAX_INDEX 7 +#define GLHMC_PFPESDPART_PMSDBASE_S 0 +#define GLHMC_PFPESDPART_PMSDBASE_M MAKEMASK(0xFFF, 0) +#define GLHMC_PFPESDPART_PMSDSIZE_S 16 +#define GLHMC_PFPESDPART_PMSDSIZE_M MAKEMASK(0x1FFF, 16) +#define GLHMC_PFPESDPART_FPMAT(_i) (0x00100880 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_PFPESDPART_FPMAT_MAX_INDEX 7 +#define GLHMC_PFPESDPART_FPMAT_PMSDBASE_S 0 +#define GLHMC_PFPESDPART_FPMAT_PMSDBASE_M MAKEMASK(0xFFF, 0) +#define GLHMC_PFPESDPART_FPMAT_PMSDSIZE_S 16 +#define GLHMC_PFPESDPART_FPMAT_PMSDSIZE_M MAKEMASK(0x1FFF, 16) +#define GLHMC_SDPART(_i) (0x00520800 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_SDPART_MAX_INDEX 7 +#define GLHMC_SDPART_PMSDBASE_S 0 +#define GLHMC_SDPART_PMSDBASE_M MAKEMASK(0xFFF, 0) +#define GLHMC_SDPART_PMSDSIZE_S 16 +#define GLHMC_SDPART_PMSDSIZE_M MAKEMASK(0x1FFF, 16) +#define GLHMC_SDPART_FPMAT(_i) (0x00100800 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLHMC_SDPART_FPMAT_MAX_INDEX 7 +#define GLHMC_SDPART_FPMAT_PMSDBASE_S 0 +#define GLHMC_SDPART_FPMAT_PMSDBASE_M MAKEMASK(0xFFF, 0) +#define GLHMC_SDPART_FPMAT_PMSDSIZE_S 16 +#define GLHMC_SDPART_FPMAT_PMSDSIZE_M MAKEMASK(0x1FFF, 16) +#define GLHMC_VFAPBVTINUSEBASE(_i) (0x0052CA00 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFAPBVTINUSEBASE_MAX_INDEX 31 +#define GLHMC_VFAPBVTINUSEBASE_FPMAPBINUSEBASE_S 0 +#define GLHMC_VFAPBVTINUSEBASE_FPMAPBINUSEBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_VFCEQPART(_i) (0x00502F00 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFCEQPART_MAX_INDEX 31 +#define GLHMC_VFCEQPART_PMCEQBASE_S 0 +#define GLHMC_VFCEQPART_PMCEQBASE_M MAKEMASK(0x3FF, 0) +#define GLHMC_VFCEQPART_PMCEQSIZE_S 16 +#define GLHMC_VFCEQPART_PMCEQSIZE_M MAKEMASK(0x3FF, 16) +#define GLHMC_VFDBCQPART(_i) (0x00502E00 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFDBCQPART_MAX_INDEX 31 +#define GLHMC_VFDBCQPART_PMDBCQBASE_S 0 +#define GLHMC_VFDBCQPART_PMDBCQBASE_M MAKEMASK(0x3FFF, 0) +#define GLHMC_VFDBCQPART_PMDBCQSIZE_S 16 +#define GLHMC_VFDBCQPART_PMDBCQSIZE_M MAKEMASK(0x7FFF, 16) +#define GLHMC_VFDBQPPART(_i) (0x00504520 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFDBQPPART_MAX_INDEX 31 +#define GLHMC_VFDBQPPART_PMDBQPBASE_S 0 +#define GLHMC_VFDBQPPART_PMDBQPBASE_M MAKEMASK(0x3FFF, 0) +#define GLHMC_VFDBQPPART_PMDBQPSIZE_S 16 +#define GLHMC_VFDBQPPART_PMDBQPSIZE_M MAKEMASK(0x7FFF, 16) +#define GLHMC_VFFSIAVBASE(_i) (0x0052D600 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFFSIAVBASE_MAX_INDEX 31 +#define GLHMC_VFFSIAVBASE_FPMFSIAVBASE_S 0 +#define GLHMC_VFFSIAVBASE_FPMFSIAVBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_VFFSIAVCNT(_i) (0x0052D700 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFFSIAVCNT_MAX_INDEX 31 +#define GLHMC_VFFSIAVCNT_FPMFSIAVCNT_S 0 +#define GLHMC_VFFSIAVCNT_FPMFSIAVCNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_VFFSIMCBASE(_i) (0x0052E000 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFFSIMCBASE_MAX_INDEX 31 +#define GLHMC_VFFSIMCBASE_FPMFSIMCBASE_S 0 +#define GLHMC_VFFSIMCBASE_FPMFSIMCBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_VFFSIMCCNT(_i) (0x0052E100 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFFSIMCCNT_MAX_INDEX 31 +#define GLHMC_VFFSIMCCNT_FPMFSIMCSZ_S 0 +#define GLHMC_VFFSIMCCNT_FPMFSIMCSZ_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_VFPDINV(_i) (0x00528300 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPDINV_MAX_INDEX 31 +#define GLHMC_VFPDINV_PMSDIDX_S 0 +#define GLHMC_VFPDINV_PMSDIDX_M MAKEMASK(0xFFF, 0) +#define GLHMC_VFPDINV_PMSDPARTSEL_S 15 +#define GLHMC_VFPDINV_PMSDPARTSEL_M BIT(15) +#define GLHMC_VFPDINV_PMPDIDX_S 16 +#define GLHMC_VFPDINV_PMPDIDX_M MAKEMASK(0x1FF, 16) +#define GLHMC_VFPDINV_FPMAT(_i) (0x00108300 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPDINV_FPMAT_MAX_INDEX 31 +#define GLHMC_VFPDINV_FPMAT_PMSDIDX_S 0 +#define GLHMC_VFPDINV_FPMAT_PMSDIDX_M MAKEMASK(0xFFF, 0) +#define GLHMC_VFPDINV_FPMAT_PMSDPARTSEL_S 15 +#define GLHMC_VFPDINV_FPMAT_PMSDPARTSEL_M BIT(15) +#define GLHMC_VFPDINV_FPMAT_PMPDIDX_S 16 +#define GLHMC_VFPDINV_FPMAT_PMPDIDX_M MAKEMASK(0x1FF, 16) +#define GLHMC_VFPEARPBASE(_i) (0x0052C800 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEARPBASE_MAX_INDEX 31 +#define GLHMC_VFPEARPBASE_FPMPEARPBASE_S 0 +#define GLHMC_VFPEARPBASE_FPMPEARPBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_VFPEARPCNT(_i) (0x0052C900 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEARPCNT_MAX_INDEX 31 +#define GLHMC_VFPEARPCNT_FPMPEARPCNT_S 0 +#define GLHMC_VFPEARPCNT_FPMPEARPCNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_VFPECQBASE(_i) (0x0052C200 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPECQBASE_MAX_INDEX 31 +#define GLHMC_VFPECQBASE_FPMPECQBASE_S 0 +#define GLHMC_VFPECQBASE_FPMPECQBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_VFPECQCNT(_i) (0x0052C300 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPECQCNT_MAX_INDEX 31 +#define GLHMC_VFPECQCNT_FPMPECQCNT_S 0 +#define GLHMC_VFPECQCNT_FPMPECQCNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_VFPEHDRBASE(_i) (0x0052E200 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEHDRBASE_MAX_INDEX 31 +#define GLHMC_VFPEHDRBASE_GLHMC_PEHDRBASE_S 0 +#define GLHMC_VFPEHDRBASE_GLHMC_PEHDRBASE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_VFPEHDRCNT(_i) (0x0052E300 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEHDRCNT_MAX_INDEX 31 +#define GLHMC_VFPEHDRCNT_GLHMC_PEHDRCNT_S 0 +#define GLHMC_VFPEHDRCNT_GLHMC_PEHDRCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_VFPEHTCNT(_i) (0x0052C700 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEHTCNT_MAX_INDEX 31 +#define GLHMC_VFPEHTCNT_FPMPEHTCNT_S 0 +#define GLHMC_VFPEHTCNT_FPMPEHTCNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_VFPEHTCNT_FPMAT(_i) (0x0010C700 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEHTCNT_FPMAT_MAX_INDEX 31 +#define GLHMC_VFPEHTCNT_FPMAT_FPMPEHTCNT_S 0 +#define GLHMC_VFPEHTCNT_FPMAT_FPMPEHTCNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_VFPEHTEBASE(_i) (0x0052C600 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEHTEBASE_MAX_INDEX 31 +#define GLHMC_VFPEHTEBASE_FPMPEHTEBASE_S 0 +#define GLHMC_VFPEHTEBASE_FPMPEHTEBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_VFPEHTEBASE_FPMAT(_i) (0x0010C600 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEHTEBASE_FPMAT_MAX_INDEX 31 +#define GLHMC_VFPEHTEBASE_FPMAT_FPMPEHTEBASE_S 0 +#define GLHMC_VFPEHTEBASE_FPMAT_FPMPEHTEBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_VFPEMDBASE(_i) (0x0052E400 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEMDBASE_MAX_INDEX 31 +#define GLHMC_VFPEMDBASE_GLHMC_PEMDBASE_S 0 +#define GLHMC_VFPEMDBASE_GLHMC_PEMDBASE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_VFPEMDCNT(_i) (0x0052E500 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEMDCNT_MAX_INDEX 31 +#define GLHMC_VFPEMDCNT_GLHMC_PEMDCNT_S 0 +#define GLHMC_VFPEMDCNT_GLHMC_PEMDCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_VFPEMRBASE(_i) (0x0052CC00 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEMRBASE_MAX_INDEX 31 +#define GLHMC_VFPEMRBASE_FPMPEMRBASE_S 0 +#define GLHMC_VFPEMRBASE_FPMPEMRBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_VFPEMRCNT(_i) (0x0052CD00 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEMRCNT_MAX_INDEX 31 +#define GLHMC_VFPEMRCNT_FPMPEMRSZ_S 0 +#define GLHMC_VFPEMRCNT_FPMPEMRSZ_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_VFPEOOISCBASE(_i) (0x0052E600 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEOOISCBASE_MAX_INDEX 31 +#define GLHMC_VFPEOOISCBASE_GLHMC_PEOOISCBASE_S 0 +#define GLHMC_VFPEOOISCBASE_GLHMC_PEOOISCBASE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_VFPEOOISCCNT(_i) (0x0052E700 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEOOISCCNT_MAX_INDEX 31 +#define GLHMC_VFPEOOISCCNT_GLHMC_PEOOISCCNT_S 0 +#define GLHMC_VFPEOOISCCNT_GLHMC_PEOOISCCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_VFPEOOISCFFLBASE(_i) (0x0052EC00 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEOOISCFFLBASE_MAX_INDEX 31 +#define GLHMC_VFPEOOISCFFLBASE_GLHMC_PEOOISCFFLBASE_S 0 +#define GLHMC_VFPEOOISCFFLBASE_GLHMC_PEOOISCFFLBASE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_VFPEPBLBASE(_i) (0x0052D800 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEPBLBASE_MAX_INDEX 31 +#define GLHMC_VFPEPBLBASE_FPMPEPBLBASE_S 0 +#define GLHMC_VFPEPBLBASE_FPMPEPBLBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_VFPEPBLCNT(_i) (0x0052D900 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEPBLCNT_MAX_INDEX 31 +#define GLHMC_VFPEPBLCNT_FPMPEPBLCNT_S 0 +#define GLHMC_VFPEPBLCNT_FPMPEPBLCNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_VFPEQ1BASE(_i) (0x0052D200 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEQ1BASE_MAX_INDEX 31 +#define GLHMC_VFPEQ1BASE_FPMPEQ1BASE_S 0 +#define GLHMC_VFPEQ1BASE_FPMPEQ1BASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_VFPEQ1CNT(_i) (0x0052D300 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEQ1CNT_MAX_INDEX 31 +#define GLHMC_VFPEQ1CNT_FPMPEQ1CNT_S 0 +#define GLHMC_VFPEQ1CNT_FPMPEQ1CNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_VFPEQ1FLBASE(_i) (0x0052D400 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEQ1FLBASE_MAX_INDEX 31 +#define GLHMC_VFPEQ1FLBASE_FPMPEQ1FLBASE_S 0 +#define GLHMC_VFPEQ1FLBASE_FPMPEQ1FLBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_VFPEQPBASE(_i) (0x0052C000 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEQPBASE_MAX_INDEX 31 +#define GLHMC_VFPEQPBASE_FPMPEQPBASE_S 0 +#define GLHMC_VFPEQPBASE_FPMPEQPBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_VFPEQPCNT(_i) (0x0052C100 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEQPCNT_MAX_INDEX 31 +#define GLHMC_VFPEQPCNT_FPMPEQPCNT_S 0 +#define GLHMC_VFPEQPCNT_FPMPEQPCNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_VFPERRFBASE(_i) (0x0052E800 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPERRFBASE_MAX_INDEX 31 +#define GLHMC_VFPERRFBASE_GLHMC_PERRFBASE_S 0 +#define GLHMC_VFPERRFBASE_GLHMC_PERRFBASE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_VFPERRFCNT(_i) (0x0052E900 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPERRFCNT_MAX_INDEX 31 +#define GLHMC_VFPERRFCNT_GLHMC_PERRFCNT_S 0 +#define GLHMC_VFPERRFCNT_GLHMC_PERRFCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_VFPERRFFLBASE(_i) (0x0052EA00 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPERRFFLBASE_MAX_INDEX 31 +#define GLHMC_VFPERRFFLBASE_GLHMC_PERRFFLBASE_S 0 +#define GLHMC_VFPERRFFLBASE_GLHMC_PERRFFLBASE_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_VFPETIMERBASE(_i) (0x0052DA00 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPETIMERBASE_MAX_INDEX 31 +#define GLHMC_VFPETIMERBASE_FPMPETIMERBASE_S 0 +#define GLHMC_VFPETIMERBASE_FPMPETIMERBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_VFPETIMERCNT(_i) (0x0052DB00 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPETIMERCNT_MAX_INDEX 31 +#define GLHMC_VFPETIMERCNT_FPMPETIMERCNT_S 0 +#define GLHMC_VFPETIMERCNT_FPMPETIMERCNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_VFPEXFBASE(_i) (0x0052CE00 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEXFBASE_MAX_INDEX 31 +#define GLHMC_VFPEXFBASE_FPMPEXFBASE_S 0 +#define GLHMC_VFPEXFBASE_FPMPEXFBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_VFPEXFCNT(_i) (0x0052CF00 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEXFCNT_MAX_INDEX 31 +#define GLHMC_VFPEXFCNT_FPMPEXFCNT_S 0 +#define GLHMC_VFPEXFCNT_FPMPEXFCNT_M MAKEMASK(0x1FFFFFFF, 0) +#define GLHMC_VFPEXFFLBASE(_i) (0x0052D000 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFPEXFFLBASE_MAX_INDEX 31 +#define GLHMC_VFPEXFFLBASE_FPMPEXFFLBASE_S 0 +#define GLHMC_VFPEXFFLBASE_FPMPEXFFLBASE_M MAKEMASK(0xFFFFFF, 0) +#define GLHMC_VFSDDATAHIGH(_i) (0x00528200 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFSDDATAHIGH_MAX_INDEX 31 +#define GLHMC_VFSDDATAHIGH_PMSDDATAHIGH_S 0 +#define GLHMC_VFSDDATAHIGH_PMSDDATAHIGH_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_VFSDDATAHIGH_FPMAT(_i) (0x00108200 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFSDDATAHIGH_FPMAT_MAX_INDEX 31 +#define GLHMC_VFSDDATAHIGH_FPMAT_PMSDDATAHIGH_S 0 +#define GLHMC_VFSDDATAHIGH_FPMAT_PMSDDATAHIGH_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHMC_VFSDDATALOW(_i) (0x00528100 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFSDDATALOW_MAX_INDEX 31 +#define GLHMC_VFSDDATALOW_PMSDVALID_S 0 +#define GLHMC_VFSDDATALOW_PMSDVALID_M BIT(0) +#define GLHMC_VFSDDATALOW_PMSDTYPE_S 1 +#define GLHMC_VFSDDATALOW_PMSDTYPE_M BIT(1) +#define GLHMC_VFSDDATALOW_PMSDBPCOUNT_S 2 +#define GLHMC_VFSDDATALOW_PMSDBPCOUNT_M MAKEMASK(0x3FF, 2) +#define GLHMC_VFSDDATALOW_PMSDDATALOW_S 12 +#define GLHMC_VFSDDATALOW_PMSDDATALOW_M MAKEMASK(0xFFFFF, 12) +#define GLHMC_VFSDDATALOW_FPMAT(_i) (0x00108100 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFSDDATALOW_FPMAT_MAX_INDEX 31 +#define GLHMC_VFSDDATALOW_FPMAT_PMSDVALID_S 0 +#define GLHMC_VFSDDATALOW_FPMAT_PMSDVALID_M BIT(0) +#define GLHMC_VFSDDATALOW_FPMAT_PMSDTYPE_S 1 +#define GLHMC_VFSDDATALOW_FPMAT_PMSDTYPE_M BIT(1) +#define GLHMC_VFSDDATALOW_FPMAT_PMSDBPCOUNT_S 2 +#define GLHMC_VFSDDATALOW_FPMAT_PMSDBPCOUNT_M MAKEMASK(0x3FF, 2) +#define GLHMC_VFSDDATALOW_FPMAT_PMSDDATALOW_S 12 +#define GLHMC_VFSDDATALOW_FPMAT_PMSDDATALOW_M MAKEMASK(0xFFFFF, 12) +#define GLHMC_VFSDPART(_i) (0x00528800 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFSDPART_MAX_INDEX 31 +#define GLHMC_VFSDPART_PMSDBASE_S 0 +#define GLHMC_VFSDPART_PMSDBASE_M MAKEMASK(0xFFF, 0) +#define GLHMC_VFSDPART_PMSDSIZE_S 16 +#define GLHMC_VFSDPART_PMSDSIZE_M MAKEMASK(0x1FFF, 16) +#define GLHMC_VFSDPART_FPMAT(_i) (0x00108800 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLHMC_VFSDPART_FPMAT_MAX_INDEX 31 +#define GLHMC_VFSDPART_FPMAT_PMSDBASE_S 0 +#define GLHMC_VFSDPART_FPMAT_PMSDBASE_M MAKEMASK(0xFFF, 0) +#define GLHMC_VFSDPART_FPMAT_PMSDSIZE_S 16 +#define GLHMC_VFSDPART_FPMAT_PMSDSIZE_M MAKEMASK(0x1FFF, 16) +#define GLMDOC_CACHESIZE 0x0051C06C /* Reset Source: CORER */ +#define GLMDOC_CACHESIZE_WORD_SIZE_S 0 +#define GLMDOC_CACHESIZE_WORD_SIZE_M MAKEMASK(0xFF, 0) +#define GLMDOC_CACHESIZE_SETS_S 8 +#define GLMDOC_CACHESIZE_SETS_M MAKEMASK(0xFFF, 8) +#define GLMDOC_CACHESIZE_WAYS_S 20 +#define GLMDOC_CACHESIZE_WAYS_M MAKEMASK(0xF, 20) +#define GLPBLOC0_CACHESIZE 0x00518074 /* Reset Source: CORER */ +#define GLPBLOC0_CACHESIZE_WORD_SIZE_S 0 +#define GLPBLOC0_CACHESIZE_WORD_SIZE_M MAKEMASK(0xFF, 0) +#define GLPBLOC0_CACHESIZE_SETS_S 8 +#define GLPBLOC0_CACHESIZE_SETS_M MAKEMASK(0xFFF, 8) +#define GLPBLOC0_CACHESIZE_WAYS_S 20 +#define GLPBLOC0_CACHESIZE_WAYS_M MAKEMASK(0xF, 20) +#define GLPBLOC1_CACHESIZE 0x0051A074 /* Reset Source: CORER */ +#define GLPBLOC1_CACHESIZE_WORD_SIZE_S 0 +#define GLPBLOC1_CACHESIZE_WORD_SIZE_M MAKEMASK(0xFF, 0) +#define GLPBLOC1_CACHESIZE_SETS_S 8 +#define GLPBLOC1_CACHESIZE_SETS_M MAKEMASK(0xFFF, 8) +#define GLPBLOC1_CACHESIZE_WAYS_S 20 +#define GLPBLOC1_CACHESIZE_WAYS_M MAKEMASK(0xF, 20) +#define GLPDOC_CACHESIZE 0x00530048 /* Reset Source: CORER */ +#define GLPDOC_CACHESIZE_WORD_SIZE_S 0 +#define GLPDOC_CACHESIZE_WORD_SIZE_M MAKEMASK(0xFF, 0) +#define GLPDOC_CACHESIZE_SETS_S 8 +#define GLPDOC_CACHESIZE_SETS_M MAKEMASK(0xFFF, 8) +#define GLPDOC_CACHESIZE_WAYS_S 20 +#define GLPDOC_CACHESIZE_WAYS_M MAKEMASK(0xF, 20) +#define GLPDOC_CACHESIZE_FPMAT 0x00110088 /* Reset Source: CORER */ +#define GLPDOC_CACHESIZE_FPMAT_WORD_SIZE_S 0 +#define GLPDOC_CACHESIZE_FPMAT_WORD_SIZE_M MAKEMASK(0xFF, 0) +#define GLPDOC_CACHESIZE_FPMAT_SETS_S 8 +#define GLPDOC_CACHESIZE_FPMAT_SETS_M MAKEMASK(0xFFF, 8) +#define GLPDOC_CACHESIZE_FPMAT_WAYS_S 20 +#define GLPDOC_CACHESIZE_FPMAT_WAYS_M MAKEMASK(0xF, 20) +#define GLPEOC0_CACHESIZE 0x005140A8 /* Reset Source: CORER */ +#define GLPEOC0_CACHESIZE_WORD_SIZE_S 0 +#define GLPEOC0_CACHESIZE_WORD_SIZE_M MAKEMASK(0xFF, 0) +#define GLPEOC0_CACHESIZE_SETS_S 8 +#define GLPEOC0_CACHESIZE_SETS_M MAKEMASK(0xFFF, 8) +#define GLPEOC0_CACHESIZE_WAYS_S 20 +#define GLPEOC0_CACHESIZE_WAYS_M MAKEMASK(0xF, 20) +#define GLPEOC1_CACHESIZE 0x005160A8 /* Reset Source: CORER */ +#define GLPEOC1_CACHESIZE_WORD_SIZE_S 0 +#define GLPEOC1_CACHESIZE_WORD_SIZE_M MAKEMASK(0xFF, 0) +#define GLPEOC1_CACHESIZE_SETS_S 8 +#define GLPEOC1_CACHESIZE_SETS_M MAKEMASK(0xFFF, 8) +#define GLPEOC1_CACHESIZE_WAYS_S 20 +#define GLPEOC1_CACHESIZE_WAYS_M MAKEMASK(0xF, 20) +#define PFHMC_ERRORDATA 0x00520500 /* Reset Source: PFR */ +#define PFHMC_ERRORDATA_HMC_ERROR_DATA_S 0 +#define PFHMC_ERRORDATA_HMC_ERROR_DATA_M MAKEMASK(0x3FFFFFFF, 0) +#define PFHMC_ERRORDATA_FPMAT 0x00100500 /* Reset Source: PFR */ +#define PFHMC_ERRORDATA_FPMAT_HMC_ERROR_DATA_S 0 +#define PFHMC_ERRORDATA_FPMAT_HMC_ERROR_DATA_M MAKEMASK(0x3FFFFFFF, 0) +#define PFHMC_ERRORINFO 0x00520400 /* Reset Source: PFR */ +#define PFHMC_ERRORINFO_PMF_INDEX_S 0 +#define PFHMC_ERRORINFO_PMF_INDEX_M MAKEMASK(0x1F, 0) +#define PFHMC_ERRORINFO_PMF_ISVF_S 7 +#define PFHMC_ERRORINFO_PMF_ISVF_M BIT(7) +#define PFHMC_ERRORINFO_HMC_ERROR_TYPE_S 8 +#define PFHMC_ERRORINFO_HMC_ERROR_TYPE_M MAKEMASK(0xF, 8) +#define PFHMC_ERRORINFO_HMC_OBJECT_TYPE_S 16 +#define PFHMC_ERRORINFO_HMC_OBJECT_TYPE_M MAKEMASK(0x1F, 16) +#define PFHMC_ERRORINFO_ERROR_DETECTED_S 31 +#define PFHMC_ERRORINFO_ERROR_DETECTED_M BIT(31) +#define PFHMC_ERRORINFO_FPMAT 0x00100400 /* Reset Source: PFR */ +#define PFHMC_ERRORINFO_FPMAT_PMF_INDEX_S 0 +#define PFHMC_ERRORINFO_FPMAT_PMF_INDEX_M MAKEMASK(0x1F, 0) +#define PFHMC_ERRORINFO_FPMAT_PMF_ISVF_S 7 +#define PFHMC_ERRORINFO_FPMAT_PMF_ISVF_M BIT(7) +#define PFHMC_ERRORINFO_FPMAT_HMC_ERROR_TYPE_S 8 +#define PFHMC_ERRORINFO_FPMAT_HMC_ERROR_TYPE_M MAKEMASK(0xF, 8) +#define PFHMC_ERRORINFO_FPMAT_HMC_OBJECT_TYPE_S 16 +#define PFHMC_ERRORINFO_FPMAT_HMC_OBJECT_TYPE_M MAKEMASK(0x1F, 16) +#define PFHMC_ERRORINFO_FPMAT_ERROR_DETECTED_S 31 +#define PFHMC_ERRORINFO_FPMAT_ERROR_DETECTED_M BIT(31) +#define PFHMC_PDINV 0x00520300 /* Reset Source: PFR */ +#define PFHMC_PDINV_PMSDIDX_S 0 +#define PFHMC_PDINV_PMSDIDX_M MAKEMASK(0xFFF, 0) +#define PFHMC_PDINV_PMSDPARTSEL_S 15 +#define PFHMC_PDINV_PMSDPARTSEL_M BIT(15) +#define PFHMC_PDINV_PMPDIDX_S 16 +#define PFHMC_PDINV_PMPDIDX_M MAKEMASK(0x1FF, 16) +#define PFHMC_PDINV_FPMAT 0x00100300 /* Reset Source: PFR */ +#define PFHMC_PDINV_FPMAT_PMSDIDX_S 0 +#define PFHMC_PDINV_FPMAT_PMSDIDX_M MAKEMASK(0xFFF, 0) +#define PFHMC_PDINV_FPMAT_PMSDPARTSEL_S 15 +#define PFHMC_PDINV_FPMAT_PMSDPARTSEL_M BIT(15) +#define PFHMC_PDINV_FPMAT_PMPDIDX_S 16 +#define PFHMC_PDINV_FPMAT_PMPDIDX_M MAKEMASK(0x1FF, 16) +#define PFHMC_SDCMD 0x00520000 /* Reset Source: PFR */ +#define PFHMC_SDCMD_PMSDIDX_S 0 +#define PFHMC_SDCMD_PMSDIDX_M MAKEMASK(0xFFF, 0) +#define PFHMC_SDCMD_PMSDPARTSEL_S 15 +#define PFHMC_SDCMD_PMSDPARTSEL_M BIT(15) +#define PFHMC_SDCMD_PMSDWR_S 31 +#define PFHMC_SDCMD_PMSDWR_M BIT(31) +#define PFHMC_SDCMD_FPMAT 0x00100000 /* Reset Source: PFR */ +#define PFHMC_SDCMD_FPMAT_PMSDIDX_S 0 +#define PFHMC_SDCMD_FPMAT_PMSDIDX_M MAKEMASK(0xFFF, 0) +#define PFHMC_SDCMD_FPMAT_PMSDPARTSEL_S 15 +#define PFHMC_SDCMD_FPMAT_PMSDPARTSEL_M BIT(15) +#define PFHMC_SDCMD_FPMAT_PMSDWR_S 31 +#define PFHMC_SDCMD_FPMAT_PMSDWR_M BIT(31) +#define PFHMC_SDDATAHIGH 0x00520200 /* Reset Source: PFR */ +#define PFHMC_SDDATAHIGH_PMSDDATAHIGH_S 0 +#define PFHMC_SDDATAHIGH_PMSDDATAHIGH_M MAKEMASK(0xFFFFFFFF, 0) +#define PFHMC_SDDATAHIGH_FPMAT 0x00100200 /* Reset Source: PFR */ +#define PFHMC_SDDATAHIGH_FPMAT_PMSDDATAHIGH_S 0 +#define PFHMC_SDDATAHIGH_FPMAT_PMSDDATAHIGH_M MAKEMASK(0xFFFFFFFF, 0) +#define PFHMC_SDDATALOW 0x00520100 /* Reset Source: PFR */ +#define PFHMC_SDDATALOW_PMSDVALID_S 0 +#define PFHMC_SDDATALOW_PMSDVALID_M BIT(0) +#define PFHMC_SDDATALOW_PMSDTYPE_S 1 +#define PFHMC_SDDATALOW_PMSDTYPE_M BIT(1) +#define PFHMC_SDDATALOW_PMSDBPCOUNT_S 2 +#define PFHMC_SDDATALOW_PMSDBPCOUNT_M MAKEMASK(0x3FF, 2) +#define PFHMC_SDDATALOW_PMSDDATALOW_S 12 +#define PFHMC_SDDATALOW_PMSDDATALOW_M MAKEMASK(0xFFFFF, 12) +#define PFHMC_SDDATALOW_FPMAT 0x00100100 /* Reset Source: PFR */ +#define PFHMC_SDDATALOW_FPMAT_PMSDVALID_S 0 +#define PFHMC_SDDATALOW_FPMAT_PMSDVALID_M BIT(0) +#define PFHMC_SDDATALOW_FPMAT_PMSDTYPE_S 1 +#define PFHMC_SDDATALOW_FPMAT_PMSDTYPE_M BIT(1) +#define PFHMC_SDDATALOW_FPMAT_PMSDBPCOUNT_S 2 +#define PFHMC_SDDATALOW_FPMAT_PMSDBPCOUNT_M MAKEMASK(0x3FF, 2) +#define PFHMC_SDDATALOW_FPMAT_PMSDDATALOW_S 12 +#define PFHMC_SDDATALOW_FPMAT_PMSDDATALOW_M MAKEMASK(0xFFFFF, 12) +#define GL_DSI_REPC 0x00294208 /* Reset Source: CORER */ +#define GL_DSI_REPC_NO_DESC_CNT_S 0 +#define GL_DSI_REPC_NO_DESC_CNT_M MAKEMASK(0xFFFF, 0) +#define GL_DSI_REPC_ERROR_CNT_S 16 +#define GL_DSI_REPC_ERROR_CNT_M MAKEMASK(0xFFFF, 16) +#define GL_MDCK_TDAT_TCLAN 0x000FC0DC /* Reset Source: CORER */ +#define GL_MDCK_TDAT_TCLAN_WRONG_ORDER_FORMAT_DESC_S 0 +#define GL_MDCK_TDAT_TCLAN_WRONG_ORDER_FORMAT_DESC_M BIT(0) +#define GL_MDCK_TDAT_TCLAN_UR_S 1 +#define GL_MDCK_TDAT_TCLAN_UR_M BIT(1) +#define GL_MDCK_TDAT_TCLAN_TAIL_DESC_NOT_DDESC_EOP_NOP_S 2 +#define GL_MDCK_TDAT_TCLAN_TAIL_DESC_NOT_DDESC_EOP_NOP_M BIT(2) +#define GL_MDCK_TDAT_TCLAN_FALSE_SCHEDULING_S 3 +#define GL_MDCK_TDAT_TCLAN_FALSE_SCHEDULING_M BIT(3) +#define GL_MDCK_TDAT_TCLAN_TAIL_VALUE_BIGGER_THAN_RING_LEN_S 4 +#define GL_MDCK_TDAT_TCLAN_TAIL_VALUE_BIGGER_THAN_RING_LEN_M BIT(4) +#define GL_MDCK_TDAT_TCLAN_MORE_THAN_8_DCMDS_IN_PKT_S 5 +#define GL_MDCK_TDAT_TCLAN_MORE_THAN_8_DCMDS_IN_PKT_M BIT(5) +#define GL_MDCK_TDAT_TCLAN_NO_HEAD_UPDATE_IN_QUANTA_S 6 +#define GL_MDCK_TDAT_TCLAN_NO_HEAD_UPDATE_IN_QUANTA_M BIT(6) +#define GL_MDCK_TDAT_TCLAN_PKT_LEN_NOT_LEGAL_S 7 +#define GL_MDCK_TDAT_TCLAN_PKT_LEN_NOT_LEGAL_M BIT(7) +#define GL_MDCK_TDAT_TCLAN_TSO_TLEN_NOT_COHERENT_WITH_SUM_BUFS_S 8 +#define GL_MDCK_TDAT_TCLAN_TSO_TLEN_NOT_COHERENT_WITH_SUM_BUFS_M BIT(8) +#define GL_MDCK_TDAT_TCLAN_TSO_TAIL_REACHED_BEFORE_TLEN_END_S 9 +#define GL_MDCK_TDAT_TCLAN_TSO_TAIL_REACHED_BEFORE_TLEN_END_M BIT(9) +#define GL_MDCK_TDAT_TCLAN_TSO_MORE_THAN_3_HDRS_S 10 +#define GL_MDCK_TDAT_TCLAN_TSO_MORE_THAN_3_HDRS_M BIT(10) +#define GL_MDCK_TDAT_TCLAN_TSO_SUM_BUFFS_LT_SUM_HDRS_S 11 +#define GL_MDCK_TDAT_TCLAN_TSO_SUM_BUFFS_LT_SUM_HDRS_M BIT(11) +#define GL_MDCK_TDAT_TCLAN_TSO_ZERO_MSS_TLEN_HDRS_S 12 +#define GL_MDCK_TDAT_TCLAN_TSO_ZERO_MSS_TLEN_HDRS_M BIT(12) +#define GL_MDCK_TDAT_TCLAN_TSO_CTX_DESC_IPSEC_S 13 +#define GL_MDCK_TDAT_TCLAN_TSO_CTX_DESC_IPSEC_M BIT(13) +#define GL_MDCK_TDAT_TCLAN_SSO_COMS_NOT_WHOLE_PKT_NUM_IN_QUANTA_S 14 +#define GL_MDCK_TDAT_TCLAN_SSO_COMS_NOT_WHOLE_PKT_NUM_IN_QUANTA_M BIT(14) +#define GL_MDCK_TDAT_TCLAN_COMS_QUANTA_BYTES_EXCEED_PKTLEN_X_64_S 15 +#define GL_MDCK_TDAT_TCLAN_COMS_QUANTA_BYTES_EXCEED_PKTLEN_X_64_M BIT(15) +#define GL_MDCK_TDAT_TCLAN_COMS_QUANTA_CMDS_EXCEED_S 16 +#define GL_MDCK_TDAT_TCLAN_COMS_QUANTA_CMDS_EXCEED_M BIT(16) +#define GL_MDCK_TDAT_TCLAN_TSO_COMS_TSO_DESCS_LAST_LSO_QUANTA_S 17 +#define GL_MDCK_TDAT_TCLAN_TSO_COMS_TSO_DESCS_LAST_LSO_QUANTA_M BIT(17) +#define GL_MDCK_TDAT_TCLAN_TSO_COMS_TSO_DESCS_TLEN_S 18 +#define GL_MDCK_TDAT_TCLAN_TSO_COMS_TSO_DESCS_TLEN_M BIT(18) +#define GL_MDCK_TDAT_TCLAN_TSO_COMS_QUANTA_FINISHED_TOO_EARLY_S 19 +#define GL_MDCK_TDAT_TCLAN_TSO_COMS_QUANTA_FINISHED_TOO_EARLY_M BIT(19) +#define GL_MDCK_TDAT_TCLAN_COMS_NUM_PKTS_IN_QUANTA_S 20 +#define GL_MDCK_TDAT_TCLAN_COMS_NUM_PKTS_IN_QUANTA_M BIT(20) +#define GLCORE_CLKCTL_H 0x000B81E8 /* Reset Source: POR */ +#define GLCORE_CLKCTL_H_UPPER_CLK_SRC_H_S 0 +#define GLCORE_CLKCTL_H_UPPER_CLK_SRC_H_M MAKEMASK(0x3, 0) +#define GLCORE_CLKCTL_H_LOWER_CLK_SRC_H_S 2 +#define GLCORE_CLKCTL_H_LOWER_CLK_SRC_H_M MAKEMASK(0x3, 2) +#define GLCORE_CLKCTL_H_PSM_CLK_SRC_H_S 4 +#define GLCORE_CLKCTL_H_PSM_CLK_SRC_H_M MAKEMASK(0x3, 4) +#define GLCORE_CLKCTL_H_RXCTL_CLK_SRC_H_S 6 +#define GLCORE_CLKCTL_H_RXCTL_CLK_SRC_H_M MAKEMASK(0x3, 6) +#define GLCORE_CLKCTL_H_UANA_CLK_SRC_H_S 8 +#define GLCORE_CLKCTL_H_UANA_CLK_SRC_H_M MAKEMASK(0x7, 8) +#define GLCORE_CLKCTL_L 0x000B8254 /* Reset Source: POR */ +#define GLCORE_CLKCTL_L_UPPER_CLK_SRC_L_S 0 +#define GLCORE_CLKCTL_L_UPPER_CLK_SRC_L_M MAKEMASK(0x3, 0) +#define GLCORE_CLKCTL_L_LOWER_CLK_SRC_L_S 2 +#define GLCORE_CLKCTL_L_LOWER_CLK_SRC_L_M MAKEMASK(0x3, 2) +#define GLCORE_CLKCTL_L_PSM_CLK_SRC_L_S 4 +#define GLCORE_CLKCTL_L_PSM_CLK_SRC_L_M MAKEMASK(0x3, 4) +#define GLCORE_CLKCTL_L_RXCTL_CLK_SRC_L_S 6 +#define GLCORE_CLKCTL_L_RXCTL_CLK_SRC_L_M MAKEMASK(0x3, 6) +#define GLCORE_CLKCTL_L_UANA_CLK_SRC_L_S 8 +#define GLCORE_CLKCTL_L_UANA_CLK_SRC_L_M MAKEMASK(0x7, 8) +#define GLCORE_CLKCTL_M 0x000B8258 /* Reset Source: POR */ +#define GLCORE_CLKCTL_M_UPPER_CLK_SRC_M_S 0 +#define GLCORE_CLKCTL_M_UPPER_CLK_SRC_M_M MAKEMASK(0x3, 0) +#define GLCORE_CLKCTL_M_LOWER_CLK_SRC_M_S 2 +#define GLCORE_CLKCTL_M_LOWER_CLK_SRC_M_M MAKEMASK(0x3, 2) +#define GLCORE_CLKCTL_M_PSM_CLK_SRC_M_S 4 +#define GLCORE_CLKCTL_M_PSM_CLK_SRC_M_M MAKEMASK(0x3, 4) +#define GLCORE_CLKCTL_M_RXCTL_CLK_SRC_M_S 6 +#define GLCORE_CLKCTL_M_RXCTL_CLK_SRC_M_M MAKEMASK(0x3, 6) +#define GLCORE_CLKCTL_M_UANA_CLK_SRC_M_S 8 +#define GLCORE_CLKCTL_M_UANA_CLK_SRC_M_M MAKEMASK(0x7, 8) +#define GLFOC_CACHESIZE 0x000AA074 /* Reset Source: CORER */ +#define GLFOC_CACHESIZE_WORD_SIZE_S 0 +#define GLFOC_CACHESIZE_WORD_SIZE_M MAKEMASK(0xFF, 0) +#define GLFOC_CACHESIZE_SETS_S 8 +#define GLFOC_CACHESIZE_SETS_M MAKEMASK(0xFFF, 8) +#define GLFOC_CACHESIZE_WAYS_S 20 +#define GLFOC_CACHESIZE_WAYS_M MAKEMASK(0xF, 20) +#define GLMAC_CLKSTAT 0x000B8210 /* Reset Source: POR */ +#define GLMAC_CLKSTAT_P0_CLK_SPEED_S 0 +#define GLMAC_CLKSTAT_P0_CLK_SPEED_M MAKEMASK(0xF, 0) +#define GLMAC_CLKSTAT_P1_CLK_SPEED_S 4 +#define GLMAC_CLKSTAT_P1_CLK_SPEED_M MAKEMASK(0xF, 4) +#define GLMAC_CLKSTAT_P2_CLK_SPEED_S 8 +#define GLMAC_CLKSTAT_P2_CLK_SPEED_M MAKEMASK(0xF, 8) +#define GLMAC_CLKSTAT_P3_CLK_SPEED_S 12 +#define GLMAC_CLKSTAT_P3_CLK_SPEED_M MAKEMASK(0xF, 12) +#define GLMAC_CLKSTAT_P4_CLK_SPEED_S 16 +#define GLMAC_CLKSTAT_P4_CLK_SPEED_M MAKEMASK(0xF, 16) +#define GLMAC_CLKSTAT_P5_CLK_SPEED_S 20 +#define GLMAC_CLKSTAT_P5_CLK_SPEED_M MAKEMASK(0xF, 20) +#define GLMAC_CLKSTAT_P6_CLK_SPEED_S 24 +#define GLMAC_CLKSTAT_P6_CLK_SPEED_M MAKEMASK(0xF, 24) +#define GLMAC_CLKSTAT_P7_CLK_SPEED_S 28 +#define GLMAC_CLKSTAT_P7_CLK_SPEED_M MAKEMASK(0xF, 28) +#define GLTPB_100G_MAC_FC_THRESH 0x00099510 /* Reset Source: CORER */ +#define GLTPB_100G_MAC_FC_THRESH_PORT0_FC_THRESH_S 0 +#define GLTPB_100G_MAC_FC_THRESH_PORT0_FC_THRESH_M MAKEMASK(0xFFFF, 0) +#define GLTPB_100G_MAC_FC_THRESH_PORT1_FC_THRESH_S 16 +#define GLTPB_100G_MAC_FC_THRESH_PORT1_FC_THRESH_M MAKEMASK(0xFFFF, 16) +#define GLTPB_100G_RPB_FC_THRESH 0x0009963C /* Reset Source: CORER */ +#define GLTPB_100G_RPB_FC_THRESH_PORT0_FC_THRESH_S 0 +#define GLTPB_100G_RPB_FC_THRESH_PORT0_FC_THRESH_M MAKEMASK(0xFFFF, 0) +#define GLTPB_100G_RPB_FC_THRESH_PORT1_FC_THRESH_S 16 +#define GLTPB_100G_RPB_FC_THRESH_PORT1_FC_THRESH_M MAKEMASK(0xFFFF, 16) +#define GLTPB_PACING_10G 0x000994E4 /* Reset Source: CORER */ +#define GLTPB_PACING_10G_N_S 0 +#define GLTPB_PACING_10G_N_M MAKEMASK(0xFF, 0) +#define GLTPB_PACING_10G_K_S 8 +#define GLTPB_PACING_10G_K_M MAKEMASK(0xFF, 8) +#define GLTPB_PACING_10G_S_S 16 +#define GLTPB_PACING_10G_S_M MAKEMASK(0x1FF, 16) +#define GLTPB_PACING_25G 0x000994E0 /* Reset Source: CORER */ +#define GLTPB_PACING_25G_N_S 0 +#define GLTPB_PACING_25G_N_M MAKEMASK(0xFF, 0) +#define GLTPB_PACING_25G_K_S 8 +#define GLTPB_PACING_25G_K_M MAKEMASK(0xFF, 8) +#define GLTPB_PACING_25G_S_S 16 +#define GLTPB_PACING_25G_S_M MAKEMASK(0x1FF, 16) +#define GLTPB_PORT_PACING_SPEED 0x000994E8 /* Reset Source: CORER */ +#define GLTPB_PORT_PACING_SPEED_PORT0_SPEED_S 0 +#define GLTPB_PORT_PACING_SPEED_PORT0_SPEED_M BIT(0) +#define GLTPB_PORT_PACING_SPEED_PORT1_SPEED_S 1 +#define GLTPB_PORT_PACING_SPEED_PORT1_SPEED_M BIT(1) +#define GLTPB_PORT_PACING_SPEED_PORT2_SPEED_S 2 +#define GLTPB_PORT_PACING_SPEED_PORT2_SPEED_M BIT(2) +#define GLTPB_PORT_PACING_SPEED_PORT3_SPEED_S 3 +#define GLTPB_PORT_PACING_SPEED_PORT3_SPEED_M BIT(3) +#define GLTPB_PORT_PACING_SPEED_PORT4_SPEED_S 4 +#define GLTPB_PORT_PACING_SPEED_PORT4_SPEED_M BIT(4) +#define GLTPB_PORT_PACING_SPEED_PORT5_SPEED_S 5 +#define GLTPB_PORT_PACING_SPEED_PORT5_SPEED_M BIT(5) +#define GLTPB_PORT_PACING_SPEED_PORT6_SPEED_S 6 +#define GLTPB_PORT_PACING_SPEED_PORT6_SPEED_M BIT(6) +#define GLTPB_PORT_PACING_SPEED_PORT7_SPEED_S 7 +#define GLTPB_PORT_PACING_SPEED_PORT7_SPEED_M BIT(7) +#define TPB_CFG_SCHEDULED_BC_THRESHOLD 0x00099494 /* Reset Source: CORER */ +#define TPB_CFG_SCHEDULED_BC_THRESHOLD_THRESHOLD_S 0 +#define TPB_CFG_SCHEDULED_BC_THRESHOLD_THRESHOLD_M MAKEMASK(0x7FFF, 0) +#define GL_UFUSE_SOC 0x000A400C /* Reset Source: POR */ +#define GL_UFUSE_SOC_PORT_MODE_S 0 +#define GL_UFUSE_SOC_PORT_MODE_M MAKEMASK(0x3, 0) +#define GL_UFUSE_SOC_BANDWIDTH_S 2 +#define GL_UFUSE_SOC_BANDWIDTH_M MAKEMASK(0x3, 2) +#define GL_UFUSE_SOC_PE_DISABLE_S 4 +#define GL_UFUSE_SOC_PE_DISABLE_M BIT(4) +#define GL_UFUSE_SOC_SWITCH_MODE_S 5 +#define GL_UFUSE_SOC_SWITCH_MODE_M BIT(5) +#define GL_UFUSE_SOC_CSR_PROTECTION_ENABLE_S 6 +#define GL_UFUSE_SOC_CSR_PROTECTION_ENABLE_M BIT(6) +#define GL_UFUSE_SOC_SERIAL_50G_S 7 +#define GL_UFUSE_SOC_SERIAL_50G_M BIT(7) +#define GL_UFUSE_SOC_NIC_ID_S 8 +#define GL_UFUSE_SOC_NIC_ID_M BIT(8) +#define GL_UFUSE_SOC_BLOCK_BME_TO_FW_S 9 +#define GL_UFUSE_SOC_BLOCK_BME_TO_FW_M BIT(9) +#define GL_UFUSE_SOC_SOC_TYPE_S 10 +#define GL_UFUSE_SOC_SOC_TYPE_M BIT(10) +#define GL_UFUSE_SOC_BTS_MODE_S 11 +#define GL_UFUSE_SOC_BTS_MODE_M BIT(11) +#define GL_UFUSE_SOC_SPARE_FUSES_S 12 +#define GL_UFUSE_SOC_SPARE_FUSES_M MAKEMASK(0xF, 12) +#define EMPINT_GPIO_ENA 0x000880C0 /* Reset Source: POR */ +#define EMPINT_GPIO_ENA_GPIO0_ENA_S 0 +#define EMPINT_GPIO_ENA_GPIO0_ENA_M BIT(0) +#define EMPINT_GPIO_ENA_GPIO1_ENA_S 1 +#define EMPINT_GPIO_ENA_GPIO1_ENA_M BIT(1) +#define EMPINT_GPIO_ENA_GPIO2_ENA_S 2 +#define EMPINT_GPIO_ENA_GPIO2_ENA_M BIT(2) +#define EMPINT_GPIO_ENA_GPIO3_ENA_S 3 +#define EMPINT_GPIO_ENA_GPIO3_ENA_M BIT(3) +#define EMPINT_GPIO_ENA_GPIO4_ENA_S 4 +#define EMPINT_GPIO_ENA_GPIO4_ENA_M BIT(4) +#define EMPINT_GPIO_ENA_GPIO5_ENA_S 5 +#define EMPINT_GPIO_ENA_GPIO5_ENA_M BIT(5) +#define EMPINT_GPIO_ENA_GPIO6_ENA_S 6 +#define EMPINT_GPIO_ENA_GPIO6_ENA_M BIT(6) +#define GLGEN_MAC_LINK_TOPO 0x000B81DC /* Reset Source: GLOBR */ +#define GLGEN_MAC_LINK_TOPO_LINK_TOPO_S 0 +#define GLGEN_MAC_LINK_TOPO_LINK_TOPO_M MAKEMASK(0x3, 0) +#define GLINT_CEQCTL(_INT) (0x0015C000 + ((_INT) * 4)) /* _i=0...2047 */ /* Reset Source: CORER */ +#define GLINT_CEQCTL_MAX_INDEX 2047 +#define GLINT_CEQCTL_MSIX_INDX_S 0 +#define GLINT_CEQCTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define GLINT_CEQCTL_ITR_INDX_S 11 +#define GLINT_CEQCTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define GLINT_CEQCTL_CAUSE_ENA_S 30 +#define GLINT_CEQCTL_CAUSE_ENA_M BIT(30) +#define GLINT_CEQCTL_INTEVENT_S 31 +#define GLINT_CEQCTL_INTEVENT_M BIT(31) +#define GLINT_CTL 0x0016CC54 /* Reset Source: CORER */ +#define GLINT_CTL_DIS_AUTOMASK_S 0 +#define GLINT_CTL_DIS_AUTOMASK_M BIT(0) +#define GLINT_CTL_RSVD_S 1 +#define GLINT_CTL_RSVD_M MAKEMASK(0x7FFF, 1) +#define GLINT_CTL_ITR_GRAN_200_S 16 +#define GLINT_CTL_ITR_GRAN_200_M MAKEMASK(0xF, 16) +#define GLINT_CTL_ITR_GRAN_100_S 20 +#define GLINT_CTL_ITR_GRAN_100_M MAKEMASK(0xF, 20) +#define GLINT_CTL_ITR_GRAN_50_S 24 +#define GLINT_CTL_ITR_GRAN_50_M MAKEMASK(0xF, 24) +#define GLINT_CTL_ITR_GRAN_25_S 28 +#define GLINT_CTL_ITR_GRAN_25_M MAKEMASK(0xF, 28) +#define GLINT_DYN_CTL(_INT) (0x00160000 + ((_INT) * 4)) /* _i=0...2047 */ /* Reset Source: CORER */ +#define GLINT_DYN_CTL_MAX_INDEX 2047 +#define GLINT_DYN_CTL_INTENA_S 0 +#define GLINT_DYN_CTL_INTENA_M BIT(0) +#define GLINT_DYN_CTL_CLEARPBA_S 1 +#define GLINT_DYN_CTL_CLEARPBA_M BIT(1) +#define GLINT_DYN_CTL_SWINT_TRIG_S 2 +#define GLINT_DYN_CTL_SWINT_TRIG_M BIT(2) +#define GLINT_DYN_CTL_ITR_INDX_S 3 +#define GLINT_DYN_CTL_ITR_INDX_M MAKEMASK(0x3, 3) +#define GLINT_DYN_CTL_INTERVAL_S 5 +#define GLINT_DYN_CTL_INTERVAL_M MAKEMASK(0xFFF, 5) +#define GLINT_DYN_CTL_SW_ITR_INDX_ENA_S 24 +#define GLINT_DYN_CTL_SW_ITR_INDX_ENA_M BIT(24) +#define GLINT_DYN_CTL_SW_ITR_INDX_S 25 +#define GLINT_DYN_CTL_SW_ITR_INDX_M MAKEMASK(0x3, 25) +#define GLINT_DYN_CTL_WB_ON_ITR_S 30 +#define GLINT_DYN_CTL_WB_ON_ITR_M BIT(30) +#define GLINT_DYN_CTL_INTENA_MSK_S 31 +#define GLINT_DYN_CTL_INTENA_MSK_M BIT(31) +#define GLINT_FW_TOOL_CTL 0x0016C840 /* Reset Source: CORER */ +#define GLINT_FW_TOOL_CTL_MSIX_INDX_S 0 +#define GLINT_FW_TOOL_CTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define GLINT_FW_TOOL_CTL_ITR_INDX_S 11 +#define GLINT_FW_TOOL_CTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define GLINT_FW_TOOL_CTL_CAUSE_ENA_S 30 +#define GLINT_FW_TOOL_CTL_CAUSE_ENA_M BIT(30) +#define GLINT_FW_TOOL_CTL_INTEVENT_S 31 +#define GLINT_FW_TOOL_CTL_INTEVENT_M BIT(31) +#define GLINT_ITR(_i, _INT) (0x00154000 + ((_i) * 8192 + (_INT) * 4)) /* _i=0...2, _INT=0...2047 */ /* Reset Source: CORER */ +#define GLINT_ITR_MAX_INDEX 2 +#define GLINT_ITR_INTERVAL_S 0 +#define GLINT_ITR_INTERVAL_M MAKEMASK(0xFFF, 0) +#define GLINT_RATE(_INT) (0x0015A000 + ((_INT) * 4)) /* _i=0...2047 */ /* Reset Source: CORER */ +#define GLINT_RATE_MAX_INDEX 2047 +#define GLINT_RATE_INTERVAL_S 0 +#define GLINT_RATE_INTERVAL_M MAKEMASK(0x3F, 0) +#define GLINT_RATE_INTRL_ENA_S 6 +#define GLINT_RATE_INTRL_ENA_M BIT(6) +#define GLINT_TSYN_PFMSTR(_i) (0x0016CCC0 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLINT_TSYN_PFMSTR_MAX_INDEX 1 +#define GLINT_TSYN_PFMSTR_PF_MASTER_S 0 +#define GLINT_TSYN_PFMSTR_PF_MASTER_M MAKEMASK(0x7, 0) +#define GLINT_TSYN_PHY 0x0016CC50 /* Reset Source: CORER */ +#define GLINT_TSYN_PHY_PHY_INDX_S 0 +#define GLINT_TSYN_PHY_PHY_INDX_M MAKEMASK(0x1F, 0) +#define GLINT_VECT2FUNC(_INT) (0x00162000 + ((_INT) * 4)) /* _i=0...2047 */ /* Reset Source: CORER */ +#define GLINT_VECT2FUNC_MAX_INDEX 2047 +#define GLINT_VECT2FUNC_VF_NUM_S 0 +#define GLINT_VECT2FUNC_VF_NUM_M MAKEMASK(0xFF, 0) +#define GLINT_VECT2FUNC_PF_NUM_S 12 +#define GLINT_VECT2FUNC_PF_NUM_M MAKEMASK(0x7, 12) +#define GLINT_VECT2FUNC_IS_PF_S 16 +#define GLINT_VECT2FUNC_IS_PF_M BIT(16) +#define PF0INT_FW_HLP_CTL 0x0016C844 /* Reset Source: CORER */ +#define PF0INT_FW_HLP_CTL_MSIX_INDX_S 0 +#define PF0INT_FW_HLP_CTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define PF0INT_FW_HLP_CTL_ITR_INDX_S 11 +#define PF0INT_FW_HLP_CTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define PF0INT_FW_HLP_CTL_CAUSE_ENA_S 30 +#define PF0INT_FW_HLP_CTL_CAUSE_ENA_M BIT(30) +#define PF0INT_FW_HLP_CTL_INTEVENT_S 31 +#define PF0INT_FW_HLP_CTL_INTEVENT_M BIT(31) +#define PF0INT_FW_PSM_CTL 0x0016C848 /* Reset Source: CORER */ +#define PF0INT_FW_PSM_CTL_MSIX_INDX_S 0 +#define PF0INT_FW_PSM_CTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define PF0INT_FW_PSM_CTL_ITR_INDX_S 11 +#define PF0INT_FW_PSM_CTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define PF0INT_FW_PSM_CTL_CAUSE_ENA_S 30 +#define PF0INT_FW_PSM_CTL_CAUSE_ENA_M BIT(30) +#define PF0INT_FW_PSM_CTL_INTEVENT_S 31 +#define PF0INT_FW_PSM_CTL_INTEVENT_M BIT(31) +#define PF0INT_MBX_CPM_CTL 0x0016B2C0 /* Reset Source: CORER */ +#define PF0INT_MBX_CPM_CTL_MSIX_INDX_S 0 +#define PF0INT_MBX_CPM_CTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define PF0INT_MBX_CPM_CTL_ITR_INDX_S 11 +#define PF0INT_MBX_CPM_CTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define PF0INT_MBX_CPM_CTL_CAUSE_ENA_S 30 +#define PF0INT_MBX_CPM_CTL_CAUSE_ENA_M BIT(30) +#define PF0INT_MBX_CPM_CTL_INTEVENT_S 31 +#define PF0INT_MBX_CPM_CTL_INTEVENT_M BIT(31) +#define PF0INT_MBX_HLP_CTL 0x0016B2C4 /* Reset Source: CORER */ +#define PF0INT_MBX_HLP_CTL_MSIX_INDX_S 0 +#define PF0INT_MBX_HLP_CTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define PF0INT_MBX_HLP_CTL_ITR_INDX_S 11 +#define PF0INT_MBX_HLP_CTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define PF0INT_MBX_HLP_CTL_CAUSE_ENA_S 30 +#define PF0INT_MBX_HLP_CTL_CAUSE_ENA_M BIT(30) +#define PF0INT_MBX_HLP_CTL_INTEVENT_S 31 +#define PF0INT_MBX_HLP_CTL_INTEVENT_M BIT(31) +#define PF0INT_MBX_PSM_CTL 0x0016B2C8 /* Reset Source: CORER */ +#define PF0INT_MBX_PSM_CTL_MSIX_INDX_S 0 +#define PF0INT_MBX_PSM_CTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define PF0INT_MBX_PSM_CTL_ITR_INDX_S 11 +#define PF0INT_MBX_PSM_CTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define PF0INT_MBX_PSM_CTL_CAUSE_ENA_S 30 +#define PF0INT_MBX_PSM_CTL_CAUSE_ENA_M BIT(30) +#define PF0INT_MBX_PSM_CTL_INTEVENT_S 31 +#define PF0INT_MBX_PSM_CTL_INTEVENT_M BIT(31) +#define PF0INT_OICR_CPM 0x0016CC40 /* Reset Source: CORER */ +#define PF0INT_OICR_CPM_INTEVENT_S 0 +#define PF0INT_OICR_CPM_INTEVENT_M BIT(0) +#define PF0INT_OICR_CPM_QUEUE_S 1 +#define PF0INT_OICR_CPM_QUEUE_M BIT(1) +#define PF0INT_OICR_CPM_RSV1_S 2 +#define PF0INT_OICR_CPM_RSV1_M MAKEMASK(0xFF, 2) +#define PF0INT_OICR_CPM_HH_COMP_S 10 +#define PF0INT_OICR_CPM_HH_COMP_M BIT(10) +#define PF0INT_OICR_CPM_TSYN_TX_S 11 +#define PF0INT_OICR_CPM_TSYN_TX_M BIT(11) +#define PF0INT_OICR_CPM_TSYN_EVNT_S 12 +#define PF0INT_OICR_CPM_TSYN_EVNT_M BIT(12) +#define PF0INT_OICR_CPM_TSYN_TGT_S 13 +#define PF0INT_OICR_CPM_TSYN_TGT_M BIT(13) +#define PF0INT_OICR_CPM_HLP_RDY_S 14 +#define PF0INT_OICR_CPM_HLP_RDY_M BIT(14) +#define PF0INT_OICR_CPM_CPM_RDY_S 15 +#define PF0INT_OICR_CPM_CPM_RDY_M BIT(15) +#define PF0INT_OICR_CPM_ECC_ERR_S 16 +#define PF0INT_OICR_CPM_ECC_ERR_M BIT(16) +#define PF0INT_OICR_CPM_RSV2_S 17 +#define PF0INT_OICR_CPM_RSV2_M MAKEMASK(0x3, 17) +#define PF0INT_OICR_CPM_MAL_DETECT_S 19 +#define PF0INT_OICR_CPM_MAL_DETECT_M BIT(19) +#define PF0INT_OICR_CPM_GRST_S 20 +#define PF0INT_OICR_CPM_GRST_M BIT(20) +#define PF0INT_OICR_CPM_PCI_EXCEPTION_S 21 +#define PF0INT_OICR_CPM_PCI_EXCEPTION_M BIT(21) +#define PF0INT_OICR_CPM_GPIO_S 22 +#define PF0INT_OICR_CPM_GPIO_M BIT(22) +#define PF0INT_OICR_CPM_RSV3_S 23 +#define PF0INT_OICR_CPM_RSV3_M BIT(23) +#define PF0INT_OICR_CPM_STORM_DETECT_S 24 +#define PF0INT_OICR_CPM_STORM_DETECT_M BIT(24) +#define PF0INT_OICR_CPM_LINK_STAT_CHANGE_S 25 +#define PF0INT_OICR_CPM_LINK_STAT_CHANGE_M BIT(25) +#define PF0INT_OICR_CPM_HMC_ERR_S 26 +#define PF0INT_OICR_CPM_HMC_ERR_M BIT(26) +#define PF0INT_OICR_CPM_PE_PUSH_S 27 +#define PF0INT_OICR_CPM_PE_PUSH_M BIT(27) +#define PF0INT_OICR_CPM_PE_CRITERR_S 28 +#define PF0INT_OICR_CPM_PE_CRITERR_M BIT(28) +#define PF0INT_OICR_CPM_VFLR_S 29 +#define PF0INT_OICR_CPM_VFLR_M BIT(29) +#define PF0INT_OICR_CPM_XLR_HW_DONE_S 30 +#define PF0INT_OICR_CPM_XLR_HW_DONE_M BIT(30) +#define PF0INT_OICR_CPM_SWINT_S 31 +#define PF0INT_OICR_CPM_SWINT_M BIT(31) +#define PF0INT_OICR_CTL_CPM 0x0016CC48 /* Reset Source: CORER */ +#define PF0INT_OICR_CTL_CPM_MSIX_INDX_S 0 +#define PF0INT_OICR_CTL_CPM_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define PF0INT_OICR_CTL_CPM_ITR_INDX_S 11 +#define PF0INT_OICR_CTL_CPM_ITR_INDX_M MAKEMASK(0x3, 11) +#define PF0INT_OICR_CTL_CPM_CAUSE_ENA_S 30 +#define PF0INT_OICR_CTL_CPM_CAUSE_ENA_M BIT(30) +#define PF0INT_OICR_CTL_CPM_INTEVENT_S 31 +#define PF0INT_OICR_CTL_CPM_INTEVENT_M BIT(31) +#define PF0INT_OICR_CTL_HLP 0x0016CC5C /* Reset Source: CORER */ +#define PF0INT_OICR_CTL_HLP_MSIX_INDX_S 0 +#define PF0INT_OICR_CTL_HLP_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define PF0INT_OICR_CTL_HLP_ITR_INDX_S 11 +#define PF0INT_OICR_CTL_HLP_ITR_INDX_M MAKEMASK(0x3, 11) +#define PF0INT_OICR_CTL_HLP_CAUSE_ENA_S 30 +#define PF0INT_OICR_CTL_HLP_CAUSE_ENA_M BIT(30) +#define PF0INT_OICR_CTL_HLP_INTEVENT_S 31 +#define PF0INT_OICR_CTL_HLP_INTEVENT_M BIT(31) +#define PF0INT_OICR_CTL_PSM 0x0016CC64 /* Reset Source: CORER */ +#define PF0INT_OICR_CTL_PSM_MSIX_INDX_S 0 +#define PF0INT_OICR_CTL_PSM_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define PF0INT_OICR_CTL_PSM_ITR_INDX_S 11 +#define PF0INT_OICR_CTL_PSM_ITR_INDX_M MAKEMASK(0x3, 11) +#define PF0INT_OICR_CTL_PSM_CAUSE_ENA_S 30 +#define PF0INT_OICR_CTL_PSM_CAUSE_ENA_M BIT(30) +#define PF0INT_OICR_CTL_PSM_INTEVENT_S 31 +#define PF0INT_OICR_CTL_PSM_INTEVENT_M BIT(31) +#define PF0INT_OICR_ENA_CPM 0x0016CC60 /* Reset Source: CORER */ +#define PF0INT_OICR_ENA_CPM_RSV0_S 0 +#define PF0INT_OICR_ENA_CPM_RSV0_M BIT(0) +#define PF0INT_OICR_ENA_CPM_INT_ENA_S 1 +#define PF0INT_OICR_ENA_CPM_INT_ENA_M MAKEMASK(0x7FFFFFFF, 1) +#define PF0INT_OICR_ENA_HLP 0x0016CC4C /* Reset Source: CORER */ +#define PF0INT_OICR_ENA_HLP_RSV0_S 0 +#define PF0INT_OICR_ENA_HLP_RSV0_M BIT(0) +#define PF0INT_OICR_ENA_HLP_INT_ENA_S 1 +#define PF0INT_OICR_ENA_HLP_INT_ENA_M MAKEMASK(0x7FFFFFFF, 1) +#define PF0INT_OICR_ENA_PSM 0x0016CC58 /* Reset Source: CORER */ +#define PF0INT_OICR_ENA_PSM_RSV0_S 0 +#define PF0INT_OICR_ENA_PSM_RSV0_M BIT(0) +#define PF0INT_OICR_ENA_PSM_INT_ENA_S 1 +#define PF0INT_OICR_ENA_PSM_INT_ENA_M MAKEMASK(0x7FFFFFFF, 1) +#define PF0INT_OICR_HLP 0x0016CC68 /* Reset Source: CORER */ +#define PF0INT_OICR_HLP_INTEVENT_S 0 +#define PF0INT_OICR_HLP_INTEVENT_M BIT(0) +#define PF0INT_OICR_HLP_QUEUE_S 1 +#define PF0INT_OICR_HLP_QUEUE_M BIT(1) +#define PF0INT_OICR_HLP_RSV1_S 2 +#define PF0INT_OICR_HLP_RSV1_M MAKEMASK(0xFF, 2) +#define PF0INT_OICR_HLP_HH_COMP_S 10 +#define PF0INT_OICR_HLP_HH_COMP_M BIT(10) +#define PF0INT_OICR_HLP_TSYN_TX_S 11 +#define PF0INT_OICR_HLP_TSYN_TX_M BIT(11) +#define PF0INT_OICR_HLP_TSYN_EVNT_S 12 +#define PF0INT_OICR_HLP_TSYN_EVNT_M BIT(12) +#define PF0INT_OICR_HLP_TSYN_TGT_S 13 +#define PF0INT_OICR_HLP_TSYN_TGT_M BIT(13) +#define PF0INT_OICR_HLP_HLP_RDY_S 14 +#define PF0INT_OICR_HLP_HLP_RDY_M BIT(14) +#define PF0INT_OICR_HLP_CPM_RDY_S 15 +#define PF0INT_OICR_HLP_CPM_RDY_M BIT(15) +#define PF0INT_OICR_HLP_ECC_ERR_S 16 +#define PF0INT_OICR_HLP_ECC_ERR_M BIT(16) +#define PF0INT_OICR_HLP_RSV2_S 17 +#define PF0INT_OICR_HLP_RSV2_M MAKEMASK(0x3, 17) +#define PF0INT_OICR_HLP_MAL_DETECT_S 19 +#define PF0INT_OICR_HLP_MAL_DETECT_M BIT(19) +#define PF0INT_OICR_HLP_GRST_S 20 +#define PF0INT_OICR_HLP_GRST_M BIT(20) +#define PF0INT_OICR_HLP_PCI_EXCEPTION_S 21 +#define PF0INT_OICR_HLP_PCI_EXCEPTION_M BIT(21) +#define PF0INT_OICR_HLP_GPIO_S 22 +#define PF0INT_OICR_HLP_GPIO_M BIT(22) +#define PF0INT_OICR_HLP_RSV3_S 23 +#define PF0INT_OICR_HLP_RSV3_M BIT(23) +#define PF0INT_OICR_HLP_STORM_DETECT_S 24 +#define PF0INT_OICR_HLP_STORM_DETECT_M BIT(24) +#define PF0INT_OICR_HLP_LINK_STAT_CHANGE_S 25 +#define PF0INT_OICR_HLP_LINK_STAT_CHANGE_M BIT(25) +#define PF0INT_OICR_HLP_HMC_ERR_S 26 +#define PF0INT_OICR_HLP_HMC_ERR_M BIT(26) +#define PF0INT_OICR_HLP_PE_PUSH_S 27 +#define PF0INT_OICR_HLP_PE_PUSH_M BIT(27) +#define PF0INT_OICR_HLP_PE_CRITERR_S 28 +#define PF0INT_OICR_HLP_PE_CRITERR_M BIT(28) +#define PF0INT_OICR_HLP_VFLR_S 29 +#define PF0INT_OICR_HLP_VFLR_M BIT(29) +#define PF0INT_OICR_HLP_XLR_HW_DONE_S 30 +#define PF0INT_OICR_HLP_XLR_HW_DONE_M BIT(30) +#define PF0INT_OICR_HLP_SWINT_S 31 +#define PF0INT_OICR_HLP_SWINT_M BIT(31) +#define PF0INT_OICR_PSM 0x0016CC44 /* Reset Source: CORER */ +#define PF0INT_OICR_PSM_INTEVENT_S 0 +#define PF0INT_OICR_PSM_INTEVENT_M BIT(0) +#define PF0INT_OICR_PSM_QUEUE_S 1 +#define PF0INT_OICR_PSM_QUEUE_M BIT(1) +#define PF0INT_OICR_PSM_RSV1_S 2 +#define PF0INT_OICR_PSM_RSV1_M MAKEMASK(0xFF, 2) +#define PF0INT_OICR_PSM_HH_COMP_S 10 +#define PF0INT_OICR_PSM_HH_COMP_M BIT(10) +#define PF0INT_OICR_PSM_TSYN_TX_S 11 +#define PF0INT_OICR_PSM_TSYN_TX_M BIT(11) +#define PF0INT_OICR_PSM_TSYN_EVNT_S 12 +#define PF0INT_OICR_PSM_TSYN_EVNT_M BIT(12) +#define PF0INT_OICR_PSM_TSYN_TGT_S 13 +#define PF0INT_OICR_PSM_TSYN_TGT_M BIT(13) +#define PF0INT_OICR_PSM_HLP_RDY_S 14 +#define PF0INT_OICR_PSM_HLP_RDY_M BIT(14) +#define PF0INT_OICR_PSM_CPM_RDY_S 15 +#define PF0INT_OICR_PSM_CPM_RDY_M BIT(15) +#define PF0INT_OICR_PSM_ECC_ERR_S 16 +#define PF0INT_OICR_PSM_ECC_ERR_M BIT(16) +#define PF0INT_OICR_PSM_RSV2_S 17 +#define PF0INT_OICR_PSM_RSV2_M MAKEMASK(0x3, 17) +#define PF0INT_OICR_PSM_MAL_DETECT_S 19 +#define PF0INT_OICR_PSM_MAL_DETECT_M BIT(19) +#define PF0INT_OICR_PSM_GRST_S 20 +#define PF0INT_OICR_PSM_GRST_M BIT(20) +#define PF0INT_OICR_PSM_PCI_EXCEPTION_S 21 +#define PF0INT_OICR_PSM_PCI_EXCEPTION_M BIT(21) +#define PF0INT_OICR_PSM_GPIO_S 22 +#define PF0INT_OICR_PSM_GPIO_M BIT(22) +#define PF0INT_OICR_PSM_RSV3_S 23 +#define PF0INT_OICR_PSM_RSV3_M BIT(23) +#define PF0INT_OICR_PSM_STORM_DETECT_S 24 +#define PF0INT_OICR_PSM_STORM_DETECT_M BIT(24) +#define PF0INT_OICR_PSM_LINK_STAT_CHANGE_S 25 +#define PF0INT_OICR_PSM_LINK_STAT_CHANGE_M BIT(25) +#define PF0INT_OICR_PSM_HMC_ERR_S 26 +#define PF0INT_OICR_PSM_HMC_ERR_M BIT(26) +#define PF0INT_OICR_PSM_PE_PUSH_S 27 +#define PF0INT_OICR_PSM_PE_PUSH_M BIT(27) +#define PF0INT_OICR_PSM_PE_CRITERR_S 28 +#define PF0INT_OICR_PSM_PE_CRITERR_M BIT(28) +#define PF0INT_OICR_PSM_VFLR_S 29 +#define PF0INT_OICR_PSM_VFLR_M BIT(29) +#define PF0INT_OICR_PSM_XLR_HW_DONE_S 30 +#define PF0INT_OICR_PSM_XLR_HW_DONE_M BIT(30) +#define PF0INT_OICR_PSM_SWINT_S 31 +#define PF0INT_OICR_PSM_SWINT_M BIT(31) +#define PF0INT_SB_CPM_CTL 0x0016B2CC /* Reset Source: CORER */ +#define PF0INT_SB_CPM_CTL_MSIX_INDX_S 0 +#define PF0INT_SB_CPM_CTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define PF0INT_SB_CPM_CTL_ITR_INDX_S 11 +#define PF0INT_SB_CPM_CTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define PF0INT_SB_CPM_CTL_CAUSE_ENA_S 30 +#define PF0INT_SB_CPM_CTL_CAUSE_ENA_M BIT(30) +#define PF0INT_SB_CPM_CTL_INTEVENT_S 31 +#define PF0INT_SB_CPM_CTL_INTEVENT_M BIT(31) +#define PF0INT_SB_HLP_CTL 0x0016B640 /* Reset Source: CORER */ +#define PF0INT_SB_HLP_CTL_MSIX_INDX_S 0 +#define PF0INT_SB_HLP_CTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define PF0INT_SB_HLP_CTL_ITR_INDX_S 11 +#define PF0INT_SB_HLP_CTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define PF0INT_SB_HLP_CTL_CAUSE_ENA_S 30 +#define PF0INT_SB_HLP_CTL_CAUSE_ENA_M BIT(30) +#define PF0INT_SB_HLP_CTL_INTEVENT_S 31 +#define PF0INT_SB_HLP_CTL_INTEVENT_M BIT(31) +#define PFINT_AEQCTL 0x0016CB00 /* Reset Source: CORER */ +#define PFINT_AEQCTL_MSIX_INDX_S 0 +#define PFINT_AEQCTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define PFINT_AEQCTL_ITR_INDX_S 11 +#define PFINT_AEQCTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define PFINT_AEQCTL_CAUSE_ENA_S 30 +#define PFINT_AEQCTL_CAUSE_ENA_M BIT(30) +#define PFINT_AEQCTL_INTEVENT_S 31 +#define PFINT_AEQCTL_INTEVENT_M BIT(31) +#define PFINT_ALLOC 0x001D2600 /* Reset Source: CORER */ +#define PFINT_ALLOC_FIRST_S 0 +#define PFINT_ALLOC_FIRST_M MAKEMASK(0x7FF, 0) +#define PFINT_ALLOC_LAST_S 12 +#define PFINT_ALLOC_LAST_M MAKEMASK(0x7FF, 12) +#define PFINT_ALLOC_VALID_S 31 +#define PFINT_ALLOC_VALID_M BIT(31) +#define PFINT_ALLOC_PCI 0x0009D800 /* Reset Source: PCIR */ +#define PFINT_ALLOC_PCI_FIRST_S 0 +#define PFINT_ALLOC_PCI_FIRST_M MAKEMASK(0x7FF, 0) +#define PFINT_ALLOC_PCI_LAST_S 12 +#define PFINT_ALLOC_PCI_LAST_M MAKEMASK(0x7FF, 12) +#define PFINT_ALLOC_PCI_VALID_S 31 +#define PFINT_ALLOC_PCI_VALID_M BIT(31) +#define PFINT_FW_CTL 0x0016C800 /* Reset Source: CORER */ +#define PFINT_FW_CTL_MSIX_INDX_S 0 +#define PFINT_FW_CTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define PFINT_FW_CTL_ITR_INDX_S 11 +#define PFINT_FW_CTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define PFINT_FW_CTL_CAUSE_ENA_S 30 +#define PFINT_FW_CTL_CAUSE_ENA_M BIT(30) +#define PFINT_FW_CTL_INTEVENT_S 31 +#define PFINT_FW_CTL_INTEVENT_M BIT(31) +#define PFINT_GPIO_ENA 0x00088080 /* Reset Source: CORER */ +#define PFINT_GPIO_ENA_GPIO0_ENA_S 0 +#define PFINT_GPIO_ENA_GPIO0_ENA_M BIT(0) +#define PFINT_GPIO_ENA_GPIO1_ENA_S 1 +#define PFINT_GPIO_ENA_GPIO1_ENA_M BIT(1) +#define PFINT_GPIO_ENA_GPIO2_ENA_S 2 +#define PFINT_GPIO_ENA_GPIO2_ENA_M BIT(2) +#define PFINT_GPIO_ENA_GPIO3_ENA_S 3 +#define PFINT_GPIO_ENA_GPIO3_ENA_M BIT(3) +#define PFINT_GPIO_ENA_GPIO4_ENA_S 4 +#define PFINT_GPIO_ENA_GPIO4_ENA_M BIT(4) +#define PFINT_GPIO_ENA_GPIO5_ENA_S 5 +#define PFINT_GPIO_ENA_GPIO5_ENA_M BIT(5) +#define PFINT_GPIO_ENA_GPIO6_ENA_S 6 +#define PFINT_GPIO_ENA_GPIO6_ENA_M BIT(6) +#define PFINT_MBX_CTL 0x0016B280 /* Reset Source: CORER */ +#define PFINT_MBX_CTL_MSIX_INDX_S 0 +#define PFINT_MBX_CTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define PFINT_MBX_CTL_ITR_INDX_S 11 +#define PFINT_MBX_CTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define PFINT_MBX_CTL_CAUSE_ENA_S 30 +#define PFINT_MBX_CTL_CAUSE_ENA_M BIT(30) +#define PFINT_MBX_CTL_INTEVENT_S 31 +#define PFINT_MBX_CTL_INTEVENT_M BIT(31) +#define PFINT_OICR 0x0016CA00 /* Reset Source: CORER */ +#define PFINT_OICR_INTEVENT_S 0 +#define PFINT_OICR_INTEVENT_M BIT(0) +#define PFINT_OICR_QUEUE_S 1 +#define PFINT_OICR_QUEUE_M BIT(1) +#define PFINT_OICR_RSV1_S 2 +#define PFINT_OICR_RSV1_M MAKEMASK(0xFF, 2) +#define PFINT_OICR_HH_COMP_S 10 +#define PFINT_OICR_HH_COMP_M BIT(10) +#define PFINT_OICR_TSYN_TX_S 11 +#define PFINT_OICR_TSYN_TX_M BIT(11) +#define PFINT_OICR_TSYN_EVNT_S 12 +#define PFINT_OICR_TSYN_EVNT_M BIT(12) +#define PFINT_OICR_TSYN_TGT_S 13 +#define PFINT_OICR_TSYN_TGT_M BIT(13) +#define PFINT_OICR_HLP_RDY_S 14 +#define PFINT_OICR_HLP_RDY_M BIT(14) +#define PFINT_OICR_CPM_RDY_S 15 +#define PFINT_OICR_CPM_RDY_M BIT(15) +#define PFINT_OICR_ECC_ERR_S 16 +#define PFINT_OICR_ECC_ERR_M BIT(16) +#define PFINT_OICR_RSV2_S 17 +#define PFINT_OICR_RSV2_M MAKEMASK(0x3, 17) +#define PFINT_OICR_MAL_DETECT_S 19 +#define PFINT_OICR_MAL_DETECT_M BIT(19) +#define PFINT_OICR_GRST_S 20 +#define PFINT_OICR_GRST_M BIT(20) +#define PFINT_OICR_PCI_EXCEPTION_S 21 +#define PFINT_OICR_PCI_EXCEPTION_M BIT(21) +#define PFINT_OICR_GPIO_S 22 +#define PFINT_OICR_GPIO_M BIT(22) +#define PFINT_OICR_RSV3_S 23 +#define PFINT_OICR_RSV3_M BIT(23) +#define PFINT_OICR_STORM_DETECT_S 24 +#define PFINT_OICR_STORM_DETECT_M BIT(24) +#define PFINT_OICR_LINK_STAT_CHANGE_S 25 +#define PFINT_OICR_LINK_STAT_CHANGE_M BIT(25) +#define PFINT_OICR_HMC_ERR_S 26 +#define PFINT_OICR_HMC_ERR_M BIT(26) +#define PFINT_OICR_PE_PUSH_S 27 +#define PFINT_OICR_PE_PUSH_M BIT(27) +#define PFINT_OICR_PE_CRITERR_S 28 +#define PFINT_OICR_PE_CRITERR_M BIT(28) +#define PFINT_OICR_VFLR_S 29 +#define PFINT_OICR_VFLR_M BIT(29) +#define PFINT_OICR_XLR_HW_DONE_S 30 +#define PFINT_OICR_XLR_HW_DONE_M BIT(30) +#define PFINT_OICR_SWINT_S 31 +#define PFINT_OICR_SWINT_M BIT(31) +#define PFINT_OICR_CTL 0x0016CA80 /* Reset Source: CORER */ +#define PFINT_OICR_CTL_MSIX_INDX_S 0 +#define PFINT_OICR_CTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define PFINT_OICR_CTL_ITR_INDX_S 11 +#define PFINT_OICR_CTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define PFINT_OICR_CTL_CAUSE_ENA_S 30 +#define PFINT_OICR_CTL_CAUSE_ENA_M BIT(30) +#define PFINT_OICR_CTL_INTEVENT_S 31 +#define PFINT_OICR_CTL_INTEVENT_M BIT(31) +#define PFINT_OICR_ENA 0x0016C900 /* Reset Source: CORER */ +#define PFINT_OICR_ENA_RSV0_S 0 +#define PFINT_OICR_ENA_RSV0_M BIT(0) +#define PFINT_OICR_ENA_INT_ENA_S 1 +#define PFINT_OICR_ENA_INT_ENA_M MAKEMASK(0x7FFFFFFF, 1) +#define PFINT_SB_CTL 0x0016B600 /* Reset Source: CORER */ +#define PFINT_SB_CTL_MSIX_INDX_S 0 +#define PFINT_SB_CTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define PFINT_SB_CTL_ITR_INDX_S 11 +#define PFINT_SB_CTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define PFINT_SB_CTL_CAUSE_ENA_S 30 +#define PFINT_SB_CTL_CAUSE_ENA_M BIT(30) +#define PFINT_SB_CTL_INTEVENT_S 31 +#define PFINT_SB_CTL_INTEVENT_M BIT(31) +#define PFINT_TSYN_MSK 0x0016C980 /* Reset Source: CORER */ +#define PFINT_TSYN_MSK_PHY_INDX_S 0 +#define PFINT_TSYN_MSK_PHY_INDX_M MAKEMASK(0x1F, 0) +#define QINT_RQCTL(_QRX) (0x00150000 + ((_QRX) * 4)) /* _i=0...2047 */ /* Reset Source: CORER */ +#define QINT_RQCTL_MAX_INDEX 2047 +#define QINT_RQCTL_MSIX_INDX_S 0 +#define QINT_RQCTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define QINT_RQCTL_ITR_INDX_S 11 +#define QINT_RQCTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define QINT_RQCTL_CAUSE_ENA_S 30 +#define QINT_RQCTL_CAUSE_ENA_M BIT(30) +#define QINT_RQCTL_INTEVENT_S 31 +#define QINT_RQCTL_INTEVENT_M BIT(31) +#define QINT_TQCTL(_DBQM) (0x00140000 + ((_DBQM) * 4)) /* _i=0...16383 */ /* Reset Source: CORER */ +#define QINT_TQCTL_MAX_INDEX 16383 +#define QINT_TQCTL_MSIX_INDX_S 0 +#define QINT_TQCTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define QINT_TQCTL_ITR_INDX_S 11 +#define QINT_TQCTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define QINT_TQCTL_CAUSE_ENA_S 30 +#define QINT_TQCTL_CAUSE_ENA_M BIT(30) +#define QINT_TQCTL_INTEVENT_S 31 +#define QINT_TQCTL_INTEVENT_M BIT(31) +#define VPINT_AEQCTL(_VF) (0x0016B800 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VPINT_AEQCTL_MAX_INDEX 255 +#define VPINT_AEQCTL_MSIX_INDX_S 0 +#define VPINT_AEQCTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define VPINT_AEQCTL_ITR_INDX_S 11 +#define VPINT_AEQCTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define VPINT_AEQCTL_CAUSE_ENA_S 30 +#define VPINT_AEQCTL_CAUSE_ENA_M BIT(30) +#define VPINT_AEQCTL_INTEVENT_S 31 +#define VPINT_AEQCTL_INTEVENT_M BIT(31) +#define VPINT_ALLOC(_VF) (0x001D1000 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VPINT_ALLOC_MAX_INDEX 255 +#define VPINT_ALLOC_FIRST_S 0 +#define VPINT_ALLOC_FIRST_M MAKEMASK(0x7FF, 0) +#define VPINT_ALLOC_LAST_S 12 +#define VPINT_ALLOC_LAST_M MAKEMASK(0x7FF, 12) +#define VPINT_ALLOC_VALID_S 31 +#define VPINT_ALLOC_VALID_M BIT(31) +#define VPINT_ALLOC_PCI(_VF) (0x0009D000 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: PCIR */ +#define VPINT_ALLOC_PCI_MAX_INDEX 255 +#define VPINT_ALLOC_PCI_FIRST_S 0 +#define VPINT_ALLOC_PCI_FIRST_M MAKEMASK(0x7FF, 0) +#define VPINT_ALLOC_PCI_LAST_S 12 +#define VPINT_ALLOC_PCI_LAST_M MAKEMASK(0x7FF, 12) +#define VPINT_ALLOC_PCI_VALID_S 31 +#define VPINT_ALLOC_PCI_VALID_M BIT(31) +#define VPINT_MBX_CPM_CTL(_VP128) (0x0016B000 + ((_VP128) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define VPINT_MBX_CPM_CTL_MAX_INDEX 127 +#define VPINT_MBX_CPM_CTL_MSIX_INDX_S 0 +#define VPINT_MBX_CPM_CTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define VPINT_MBX_CPM_CTL_ITR_INDX_S 11 +#define VPINT_MBX_CPM_CTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define VPINT_MBX_CPM_CTL_CAUSE_ENA_S 30 +#define VPINT_MBX_CPM_CTL_CAUSE_ENA_M BIT(30) +#define VPINT_MBX_CPM_CTL_INTEVENT_S 31 +#define VPINT_MBX_CPM_CTL_INTEVENT_M BIT(31) +#define VPINT_MBX_CTL(_VSI) (0x0016A000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VPINT_MBX_CTL_MAX_INDEX 767 +#define VPINT_MBX_CTL_MSIX_INDX_S 0 +#define VPINT_MBX_CTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define VPINT_MBX_CTL_ITR_INDX_S 11 +#define VPINT_MBX_CTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define VPINT_MBX_CTL_CAUSE_ENA_S 30 +#define VPINT_MBX_CTL_CAUSE_ENA_M BIT(30) +#define VPINT_MBX_CTL_INTEVENT_S 31 +#define VPINT_MBX_CTL_INTEVENT_M BIT(31) +#define VPINT_MBX_HLP_CTL(_VP16) (0x0016B200 + ((_VP16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VPINT_MBX_HLP_CTL_MAX_INDEX 15 +#define VPINT_MBX_HLP_CTL_MSIX_INDX_S 0 +#define VPINT_MBX_HLP_CTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define VPINT_MBX_HLP_CTL_ITR_INDX_S 11 +#define VPINT_MBX_HLP_CTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define VPINT_MBX_HLP_CTL_CAUSE_ENA_S 30 +#define VPINT_MBX_HLP_CTL_CAUSE_ENA_M BIT(30) +#define VPINT_MBX_HLP_CTL_INTEVENT_S 31 +#define VPINT_MBX_HLP_CTL_INTEVENT_M BIT(31) +#define VPINT_MBX_PSM_CTL(_VP16) (0x0016B240 + ((_VP16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VPINT_MBX_PSM_CTL_MAX_INDEX 15 +#define VPINT_MBX_PSM_CTL_MSIX_INDX_S 0 +#define VPINT_MBX_PSM_CTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define VPINT_MBX_PSM_CTL_ITR_INDX_S 11 +#define VPINT_MBX_PSM_CTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define VPINT_MBX_PSM_CTL_CAUSE_ENA_S 30 +#define VPINT_MBX_PSM_CTL_CAUSE_ENA_M BIT(30) +#define VPINT_MBX_PSM_CTL_INTEVENT_S 31 +#define VPINT_MBX_PSM_CTL_INTEVENT_M BIT(31) +#define VPINT_SB_CPM_CTL(_VP128) (0x0016B400 + ((_VP128) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define VPINT_SB_CPM_CTL_MAX_INDEX 127 +#define VPINT_SB_CPM_CTL_MSIX_INDX_S 0 +#define VPINT_SB_CPM_CTL_MSIX_INDX_M MAKEMASK(0x7FF, 0) +#define VPINT_SB_CPM_CTL_ITR_INDX_S 11 +#define VPINT_SB_CPM_CTL_ITR_INDX_M MAKEMASK(0x3, 11) +#define VPINT_SB_CPM_CTL_CAUSE_ENA_S 30 +#define VPINT_SB_CPM_CTL_CAUSE_ENA_M BIT(30) +#define VPINT_SB_CPM_CTL_INTEVENT_S 31 +#define VPINT_SB_CPM_CTL_INTEVENT_M BIT(31) +#define GL_HLP_PRT_IPG_PREAMBLE_SIZE(_i) (0x00049240 + ((_i) * 4)) /* _i=0...20 */ /* Reset Source: CORER */ +#define GL_HLP_PRT_IPG_PREAMBLE_SIZE_MAX_INDEX 20 +#define GL_HLP_PRT_IPG_PREAMBLE_SIZE_IPG_PREAMBLE_SIZE_S 0 +#define GL_HLP_PRT_IPG_PREAMBLE_SIZE_IPG_PREAMBLE_SIZE_M MAKEMASK(0xFF, 0) +#define GL_TDPU_PSM_DEFAULT_RECIPE(_i) (0x00049294 + ((_i) * 4)) /* _i=0...3 */ /* Reset Source: CORER */ +#define GL_TDPU_PSM_DEFAULT_RECIPE_MAX_INDEX 3 +#define GL_TDPU_PSM_DEFAULT_RECIPE_ADD_IPG_S 0 +#define GL_TDPU_PSM_DEFAULT_RECIPE_ADD_IPG_M BIT(0) +#define GL_TDPU_PSM_DEFAULT_RECIPE_SUB_CRC_S 1 +#define GL_TDPU_PSM_DEFAULT_RECIPE_SUB_CRC_M BIT(1) +#define GL_TDPU_PSM_DEFAULT_RECIPE_SUB_ESP_TRAILER_S 2 +#define GL_TDPU_PSM_DEFAULT_RECIPE_SUB_ESP_TRAILER_M BIT(2) +#define GL_TDPU_PSM_DEFAULT_RECIPE_INCLUDE_L2_PAD_S 3 +#define GL_TDPU_PSM_DEFAULT_RECIPE_INCLUDE_L2_PAD_M BIT(3) +#define GL_TDPU_PSM_DEFAULT_RECIPE_DEFAULT_UPDATE_MODE_S 4 +#define GL_TDPU_PSM_DEFAULT_RECIPE_DEFAULT_UPDATE_MODE_M BIT(4) +#define GLLAN_PF_RECIPE(_i) (0x0029420C + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLLAN_PF_RECIPE_MAX_INDEX 7 +#define GLLAN_PF_RECIPE_RECIPE_S 0 +#define GLLAN_PF_RECIPE_RECIPE_M MAKEMASK(0x3, 0) +#define GLLAN_RCTL_0 0x002941F8 /* Reset Source: CORER */ +#define GLLAN_RCTL_0_PXE_MODE_S 0 +#define GLLAN_RCTL_0_PXE_MODE_M BIT(0) +#define GLLAN_RCTL_1 0x002941FC /* Reset Source: CORER */ +#define GLLAN_RCTL_1_RXMAX_EXPANSION_S 12 +#define GLLAN_RCTL_1_RXMAX_EXPANSION_M MAKEMASK(0xF, 12) +#define GLLAN_RCTL_1_RXDRDCTL_S 17 +#define GLLAN_RCTL_1_RXDRDCTL_M BIT(17) +#define GLLAN_RCTL_1_RXDESCRDROEN_S 18 +#define GLLAN_RCTL_1_RXDESCRDROEN_M BIT(18) +#define GLLAN_RCTL_1_RXDATAWRROEN_S 19 +#define GLLAN_RCTL_1_RXDATAWRROEN_M BIT(19) +#define GLLAN_TSOMSK_F 0x00049308 /* Reset Source: CORER */ +#define GLLAN_TSOMSK_F_TCPMSKF_S 0 +#define GLLAN_TSOMSK_F_TCPMSKF_M MAKEMASK(0xFFF, 0) +#define GLLAN_TSOMSK_L 0x00049310 /* Reset Source: CORER */ +#define GLLAN_TSOMSK_L_TCPMSKL_S 0 +#define GLLAN_TSOMSK_L_TCPMSKL_M MAKEMASK(0xFFF, 0) +#define GLLAN_TSOMSK_M 0x0004930C /* Reset Source: CORER */ +#define GLLAN_TSOMSK_M_TCPMSKM_S 0 +#define GLLAN_TSOMSK_M_TCPMSKM_M MAKEMASK(0xFFF, 0) +#define PFLAN_CP_QALLOC 0x00075700 /* Reset Source: CORER */ +#define PFLAN_CP_QALLOC_FIRSTQ_S 0 +#define PFLAN_CP_QALLOC_FIRSTQ_M MAKEMASK(0x1FF, 0) +#define PFLAN_CP_QALLOC_LASTQ_S 16 +#define PFLAN_CP_QALLOC_LASTQ_M MAKEMASK(0x1FF, 16) +#define PFLAN_CP_QALLOC_VALID_S 31 +#define PFLAN_CP_QALLOC_VALID_M BIT(31) +#define PFLAN_DB_QALLOC 0x00075680 /* Reset Source: CORER */ +#define PFLAN_DB_QALLOC_FIRSTQ_S 0 +#define PFLAN_DB_QALLOC_FIRSTQ_M MAKEMASK(0xFF, 0) +#define PFLAN_DB_QALLOC_LASTQ_S 16 +#define PFLAN_DB_QALLOC_LASTQ_M MAKEMASK(0xFF, 16) +#define PFLAN_DB_QALLOC_VALID_S 31 +#define PFLAN_DB_QALLOC_VALID_M BIT(31) +#define PFLAN_RX_QALLOC 0x001D2500 /* Reset Source: CORER */ +#define PFLAN_RX_QALLOC_FIRSTQ_S 0 +#define PFLAN_RX_QALLOC_FIRSTQ_M MAKEMASK(0x7FF, 0) +#define PFLAN_RX_QALLOC_LASTQ_S 16 +#define PFLAN_RX_QALLOC_LASTQ_M MAKEMASK(0x7FF, 16) +#define PFLAN_RX_QALLOC_VALID_S 31 +#define PFLAN_RX_QALLOC_VALID_M BIT(31) +#define PFLAN_TX_QALLOC 0x001D2580 /* Reset Source: CORER */ +#define PFLAN_TX_QALLOC_FIRSTQ_S 0 +#define PFLAN_TX_QALLOC_FIRSTQ_M MAKEMASK(0x3FFF, 0) +#define PFLAN_TX_QALLOC_LASTQ_S 16 +#define PFLAN_TX_QALLOC_LASTQ_M MAKEMASK(0x3FFF, 16) +#define PFLAN_TX_QALLOC_VALID_S 31 +#define PFLAN_TX_QALLOC_VALID_M BIT(31) +#define PRT_TDPUL2TAGSEN 0x00040BA0 /* Reset Source: CORER */ +#define PRT_TDPUL2TAGSEN_ENABLE_S 0 +#define PRT_TDPUL2TAGSEN_ENABLE_M MAKEMASK(0xFF, 0) +#define PRT_TDPUL2TAGSEN_NONLAST_TAG_S 8 +#define PRT_TDPUL2TAGSEN_NONLAST_TAG_M MAKEMASK(0xFF, 8) +#define QRX_CONTEXT(_i, _QRX) (0x00280000 + ((_i) * 8192 + (_QRX) * 4)) /* _i=0...7, _QRX=0...2047 */ /* Reset Source: CORER */ +#define QRX_CONTEXT_MAX_INDEX 7 +#define QRX_CONTEXT_RXQ_CONTEXT_S 0 +#define QRX_CONTEXT_RXQ_CONTEXT_M MAKEMASK(0xFFFFFFFF, 0) +#define QRX_CTRL(_QRX) (0x00120000 + ((_QRX) * 4)) /* _i=0...2047 */ /* Reset Source: PFR */ +#define QRX_CTRL_MAX_INDEX 2047 +#define QRX_CTRL_QENA_REQ_S 0 +#define QRX_CTRL_QENA_REQ_M BIT(0) +#define QRX_CTRL_FAST_QDIS_S 1 +#define QRX_CTRL_FAST_QDIS_M BIT(1) +#define QRX_CTRL_QENA_STAT_S 2 +#define QRX_CTRL_QENA_STAT_M BIT(2) +#define QRX_CTRL_CDE_S 3 +#define QRX_CTRL_CDE_M BIT(3) +#define QRX_CTRL_CDS_S 4 +#define QRX_CTRL_CDS_M BIT(4) +#define QRX_ITR(_QRX) (0x00292000 + ((_QRX) * 4)) /* _i=0...2047 */ /* Reset Source: CORER */ +#define QRX_ITR_MAX_INDEX 2047 +#define QRX_ITR_NO_EXPR_S 0 +#define QRX_ITR_NO_EXPR_M BIT(0) +#define QRX_TAIL(_QRX) (0x00290000 + ((_QRX) * 4)) /* _i=0...2047 */ /* Reset Source: CORER */ +#define QRX_TAIL_MAX_INDEX 2047 +#define QRX_TAIL_TAIL_S 0 +#define QRX_TAIL_TAIL_M MAKEMASK(0x1FFF, 0) +#define VPDSI_RX_QTABLE(_i, _VP16) (0x00074C00 + ((_i) * 64 + (_VP16) * 4)) /* _i=0...15, _VP16=0...15 */ /* Reset Source: CORER */ +#define VPDSI_RX_QTABLE_MAX_INDEX 15 +#define VPDSI_RX_QTABLE_PAGE_INDEX0_S 0 +#define VPDSI_RX_QTABLE_PAGE_INDEX0_M MAKEMASK(0x7F, 0) +#define VPDSI_RX_QTABLE_PAGE_INDEX1_S 8 +#define VPDSI_RX_QTABLE_PAGE_INDEX1_M MAKEMASK(0x7F, 8) +#define VPDSI_RX_QTABLE_PAGE_INDEX2_S 16 +#define VPDSI_RX_QTABLE_PAGE_INDEX2_M MAKEMASK(0x7F, 16) +#define VPDSI_RX_QTABLE_PAGE_INDEX3_S 24 +#define VPDSI_RX_QTABLE_PAGE_INDEX3_M MAKEMASK(0x7F, 24) +#define VPDSI_TX_QTABLE(_i, _VP16) (0x001D2000 + ((_i) * 64 + (_VP16) * 4)) /* _i=0...15, _VP16=0...15 */ /* Reset Source: CORER */ +#define VPDSI_TX_QTABLE_MAX_INDEX 15 +#define VPDSI_TX_QTABLE_PAGE_INDEX0_S 0 +#define VPDSI_TX_QTABLE_PAGE_INDEX0_M MAKEMASK(0x7F, 0) +#define VPDSI_TX_QTABLE_PAGE_INDEX1_S 8 +#define VPDSI_TX_QTABLE_PAGE_INDEX1_M MAKEMASK(0x7F, 8) +#define VPDSI_TX_QTABLE_PAGE_INDEX2_S 16 +#define VPDSI_TX_QTABLE_PAGE_INDEX2_M MAKEMASK(0x7F, 16) +#define VPDSI_TX_QTABLE_PAGE_INDEX3_S 24 +#define VPDSI_TX_QTABLE_PAGE_INDEX3_M MAKEMASK(0x7F, 24) +#define VPLAN_DB_QTABLE(_i, _VF) (0x00070000 + ((_i) * 2048 + (_VF) * 4)) /* _i=0...3, _VF=0...255 */ /* Reset Source: CORER */ +#define VPLAN_DB_QTABLE_MAX_INDEX 3 +#define VPLAN_DB_QTABLE_QINDEX_S 0 +#define VPLAN_DB_QTABLE_QINDEX_M MAKEMASK(0x1FF, 0) +#define VPLAN_DSI_VF_MODE(_VP16) (0x002D2C00 + ((_VP16) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define VPLAN_DSI_VF_MODE_MAX_INDEX 15 +#define VPLAN_DSI_VF_MODE_LAN_DSI_VF_MODE_S 0 +#define VPLAN_DSI_VF_MODE_LAN_DSI_VF_MODE_M BIT(0) +#define VPLAN_RX_QBASE(_VF) (0x00072000 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VPLAN_RX_QBASE_MAX_INDEX 255 +#define VPLAN_RX_QBASE_VFFIRSTQ_S 0 +#define VPLAN_RX_QBASE_VFFIRSTQ_M MAKEMASK(0x7FF, 0) +#define VPLAN_RX_QBASE_VFNUMQ_S 16 +#define VPLAN_RX_QBASE_VFNUMQ_M MAKEMASK(0xFF, 16) +#define VPLAN_RX_QBASE_VFQTABLE_ENA_S 31 +#define VPLAN_RX_QBASE_VFQTABLE_ENA_M BIT(31) +#define VPLAN_RX_QTABLE(_i, _VF) (0x00060000 + ((_i) * 2048 + (_VF) * 4)) /* _i=0...15, _VF=0...255 */ /* Reset Source: CORER */ +#define VPLAN_RX_QTABLE_MAX_INDEX 15 +#define VPLAN_RX_QTABLE_QINDEX_S 0 +#define VPLAN_RX_QTABLE_QINDEX_M MAKEMASK(0xFFF, 0) +#define VPLAN_RXQ_MAPENA(_VF) (0x00073000 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VPLAN_RXQ_MAPENA_MAX_INDEX 255 +#define VPLAN_RXQ_MAPENA_RX_ENA_S 0 +#define VPLAN_RXQ_MAPENA_RX_ENA_M BIT(0) +#define VPLAN_TX_QBASE(_VF) (0x001D1800 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VPLAN_TX_QBASE_MAX_INDEX 255 +#define VPLAN_TX_QBASE_VFFIRSTQ_S 0 +#define VPLAN_TX_QBASE_VFFIRSTQ_M MAKEMASK(0x3FFF, 0) +#define VPLAN_TX_QBASE_VFNUMQ_S 16 +#define VPLAN_TX_QBASE_VFNUMQ_M MAKEMASK(0xFF, 16) +#define VPLAN_TX_QBASE_VFQTABLE_ENA_S 31 +#define VPLAN_TX_QBASE_VFQTABLE_ENA_M BIT(31) +#define VPLAN_TX_QTABLE(_i, _VF) (0x001C0000 + ((_i) * 2048 + (_VF) * 4)) /* _i=0...15, _VF=0...255 */ /* Reset Source: CORER */ +#define VPLAN_TX_QTABLE_MAX_INDEX 15 +#define VPLAN_TX_QTABLE_QINDEX_S 0 +#define VPLAN_TX_QTABLE_QINDEX_M MAKEMASK(0x7FFF, 0) +#define VPLAN_TXQ_MAPENA(_VF) (0x00073800 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VPLAN_TXQ_MAPENA_MAX_INDEX 255 +#define VPLAN_TXQ_MAPENA_TX_ENA_S 0 +#define VPLAN_TXQ_MAPENA_TX_ENA_M BIT(0) +#define VSILAN_QBASE(_VSI) (0x0044C000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: PFR */ +#define VSILAN_QBASE_MAX_INDEX 767 +#define VSILAN_QBASE_VSIBASE_S 0 +#define VSILAN_QBASE_VSIBASE_M MAKEMASK(0x7FF, 0) +#define VSILAN_QBASE_VSIQTABLE_ENA_S 11 +#define VSILAN_QBASE_VSIQTABLE_ENA_M BIT(11) +#define VSILAN_QTABLE(_i, _VSI) (0x00440000 + ((_i) * 4096 + (_VSI) * 4)) /* _i=0...7, _VSI=0...767 */ /* Reset Source: PFR */ +#define VSILAN_QTABLE_MAX_INDEX 7 +#define VSILAN_QTABLE_QINDEX_0_S 0 +#define VSILAN_QTABLE_QINDEX_0_M MAKEMASK(0x7FF, 0) +#define VSILAN_QTABLE_QINDEX_1_S 16 +#define VSILAN_QTABLE_QINDEX_1_M MAKEMASK(0x7FF, 16) +#define PRTMAC_HSEC_CTL_RX_ENABLE_GCP 0x001E31C0 /* Reset Source: GLOBR */ +#define PRTMAC_HSEC_CTL_RX_ENABLE_GCP_HSEC_CTL_RX_ENABLE_GCP_S 0 +#define PRTMAC_HSEC_CTL_RX_ENABLE_GCP_HSEC_CTL_RX_ENABLE_GCP_M BIT(0) +#define PRTMAC_HSEC_CTL_RX_ENABLE_GPP 0x001E34C0 /* Reset Source: GLOBR */ +#define PRTMAC_HSEC_CTL_RX_ENABLE_GPP_HSEC_CTL_RX_ENABLE_GPP_S 0 +#define PRTMAC_HSEC_CTL_RX_ENABLE_GPP_HSEC_CTL_RX_ENABLE_GPP_M BIT(0) +#define PRTMAC_HSEC_CTL_RX_ENABLE_PPP 0x001E35C0 /* Reset Source: GLOBR */ +#define PRTMAC_HSEC_CTL_RX_ENABLE_PPP_HSEC_CTL_RX_ENABLE_PPP_S 0 +#define PRTMAC_HSEC_CTL_RX_ENABLE_PPP_HSEC_CTL_RX_ENABLE_PPP_M BIT(0) +#define PRTMAC_HSEC_CTL_RX_FORWARD_CONTROL 0x001E36C0 /* Reset Source: GLOBR */ +#define PRTMAC_HSEC_CTL_RX_FORWARD_CONTROL_HSEC_CTL_RX_FORWARD_CONTROL_S 0 +#define PRTMAC_HSEC_CTL_RX_FORWARD_CONTROL_HSEC_CTL_RX_FORWARD_CONTROL_M BIT(0) +#define PRTMAC_HSEC_CTL_RX_PAUSE_DA_UCAST_PART1 0x001E3220 /* Reset Source: GLOBR */ +#define PRTMAC_HSEC_CTL_RX_PAUSE_DA_UCAST_PART1_HSEC_CTL_RX_PAUSE_DA_UCAST_PART1_S 0 +#define PRTMAC_HSEC_CTL_RX_PAUSE_DA_UCAST_PART1_HSEC_CTL_RX_PAUSE_DA_UCAST_PART1_M MAKEMASK(0xFFFFFFFF, 0) +#define PRTMAC_HSEC_CTL_RX_PAUSE_DA_UCAST_PART2 0x001E3240 /* Reset Source: GLOBR */ +#define PRTMAC_HSEC_CTL_RX_PAUSE_DA_UCAST_PART2_HSEC_CTL_RX_PAUSE_DA_UCAST_PART2_S 0 +#define PRTMAC_HSEC_CTL_RX_PAUSE_DA_UCAST_PART2_HSEC_CTL_RX_PAUSE_DA_UCAST_PART2_M MAKEMASK(0xFFFF, 0) +#define PRTMAC_HSEC_CTL_RX_PAUSE_ENABLE 0x001E3180 /* Reset Source: GLOBR */ +#define PRTMAC_HSEC_CTL_RX_PAUSE_ENABLE_HSEC_CTL_RX_PAUSE_ENABLE_S 0 +#define PRTMAC_HSEC_CTL_RX_PAUSE_ENABLE_HSEC_CTL_RX_PAUSE_ENABLE_M MAKEMASK(0x1FF, 0) +#define PRTMAC_HSEC_CTL_RX_PAUSE_SA_PART1 0x001E3280 /* Reset Source: GLOBR */ +#define PRTMAC_HSEC_CTL_RX_PAUSE_SA_PART1_HSEC_CTL_RX_PAUSE_SA_PART1_S 0 +#define PRTMAC_HSEC_CTL_RX_PAUSE_SA_PART1_HSEC_CTL_RX_PAUSE_SA_PART1_M MAKEMASK(0xFFFFFFFF, 0) +#define PRTMAC_HSEC_CTL_RX_PAUSE_SA_PART2 0x001E32A0 /* Reset Source: GLOBR */ +#define PRTMAC_HSEC_CTL_RX_PAUSE_SA_PART2_HSEC_CTL_RX_PAUSE_SA_PART2_S 0 +#define PRTMAC_HSEC_CTL_RX_PAUSE_SA_PART2_HSEC_CTL_RX_PAUSE_SA_PART2_M MAKEMASK(0xFFFF, 0) +#define PRTMAC_HSEC_CTL_RX_QUANTA_S 0x001E3C40 /* Reset Source: GLOBR */ +#define PRTMAC_HSEC_CTL_RX_QUANTA_SHIFT_PRTMAC_HSEC_CTL_RX_QUANTA_SHIFT_S 0 +#define PRTMAC_HSEC_CTL_RX_QUANTA_SHIFT_PRTMAC_HSEC_CTL_RX_QUANTA_SHIFT_M MAKEMASK(0xFFFF, 0) +#define PRTMAC_HSEC_CTL_TX_PAUSE_ENABLE 0x001E31A0 /* Reset Source: GLOBR */ +#define PRTMAC_HSEC_CTL_TX_PAUSE_ENABLE_HSEC_CTL_TX_PAUSE_ENABLE_S 0 +#define PRTMAC_HSEC_CTL_TX_PAUSE_ENABLE_HSEC_CTL_TX_PAUSE_ENABLE_M MAKEMASK(0x1FF, 0) +#define PRTMAC_HSEC_CTL_TX_PAUSE_QUANTA(_i) (0x001E36E0 + ((_i) * 32)) /* _i=0...8 */ /* Reset Source: GLOBR */ +#define PRTMAC_HSEC_CTL_TX_PAUSE_QUANTA_MAX_INDEX 8 +#define PRTMAC_HSEC_CTL_TX_PAUSE_QUANTA_HSEC_CTL_TX_PAUSE_QUANTA_S 0 +#define PRTMAC_HSEC_CTL_TX_PAUSE_QUANTA_HSEC_CTL_TX_PAUSE_QUANTA_M MAKEMASK(0xFFFF, 0) +#define PRTMAC_HSEC_CTL_TX_PAUSE_REFRESH_TIMER(_i) (0x001E3800 + ((_i) * 32)) /* _i=0...8 */ /* Reset Source: GLOBR */ +#define PRTMAC_HSEC_CTL_TX_PAUSE_REFRESH_TIMER_MAX_INDEX 8 +#define PRTMAC_HSEC_CTL_TX_PAUSE_REFRESH_TIMER_S 0 +#define PRTMAC_HSEC_CTL_TX_PAUSE_REFRESH_TIMER_M MAKEMASK(0xFFFF, 0) +#define PRTMAC_HSEC_CTL_TX_SA_PART1 0x001E3960 /* Reset Source: GLOBR */ +#define PRTMAC_HSEC_CTL_TX_SA_PART1_HSEC_CTL_TX_SA_PART1_S 0 +#define PRTMAC_HSEC_CTL_TX_SA_PART1_HSEC_CTL_TX_SA_PART1_M MAKEMASK(0xFFFFFFFF, 0) +#define PRTMAC_HSEC_CTL_TX_SA_PART2 0x001E3980 /* Reset Source: GLOBR */ +#define PRTMAC_HSEC_CTL_TX_SA_PART2_HSEC_CTL_TX_SA_PART2_S 0 +#define PRTMAC_HSEC_CTL_TX_SA_PART2_HSEC_CTL_TX_SA_PART2_M MAKEMASK(0xFFFF, 0) +#define PRTMAC_LINK_DOWN_COUNTER 0x001E47C0 /* Reset Source: GLOBR */ +#define PRTMAC_LINK_DOWN_COUNTER_LINK_DOWN_COUNTER_S 0 +#define PRTMAC_LINK_DOWN_COUNTER_LINK_DOWN_COUNTER_M MAKEMASK(0xFFFF, 0) +#define PRTMAC_MD_OVRRIDE_ENABLE(_i) (0x001E3C60 + ((_i) * 32)) /* _i=0...7 */ /* Reset Source: GLOBR */ +#define PRTMAC_MD_OVRRIDE_ENABLE_MAX_INDEX 7 +#define PRTMAC_MD_OVRRIDE_ENABLE_PRTMAC_MD_OVRRIDE_ENABLE_S 0 +#define PRTMAC_MD_OVRRIDE_ENABLE_PRTMAC_MD_OVRRIDE_ENABLE_M MAKEMASK(0xFFFFFFFF, 0) +#define PRTMAC_MD_OVRRIDE_VAL(_i) (0x001E3D60 + ((_i) * 32)) /* _i=0...7 */ /* Reset Source: GLOBR */ +#define PRTMAC_MD_OVRRIDE_VAL_MAX_INDEX 7 +#define PRTMAC_MD_OVRRIDE_VAL_PRTMAC_MD_OVRRIDE_ENABLE_S 0 +#define PRTMAC_MD_OVRRIDE_VAL_PRTMAC_MD_OVRRIDE_ENABLE_M MAKEMASK(0xFFFFFFFF, 0) +#define PRTMAC_RX_CNT_MRKR 0x001E48E0 /* Reset Source: GLOBR */ +#define PRTMAC_RX_CNT_MRKR_RX_CNT_MRKR_S 0 +#define PRTMAC_RX_CNT_MRKR_RX_CNT_MRKR_M MAKEMASK(0xFFFF, 0) +#define PRTMAC_RX_PKT_DRP_CNT 0x001E3C20 /* Reset Source: GLOBR */ +#define PRTMAC_RX_PKT_DRP_CNT_RX_PKT_DRP_CNT_S 0 +#define PRTMAC_RX_PKT_DRP_CNT_RX_PKT_DRP_CNT_M MAKEMASK(0xFFFF, 0) +#define PRTMAC_RX_PKT_DRP_CNT_RX_MKR_PKT_DRP_CNT_S 16 +#define PRTMAC_RX_PKT_DRP_CNT_RX_MKR_PKT_DRP_CNT_M MAKEMASK(0xFFFF, 16) +#define PRTMAC_TX_CNT_MRKR 0x001E48C0 /* Reset Source: GLOBR */ +#define PRTMAC_TX_CNT_MRKR_TX_CNT_MRKR_S 0 +#define PRTMAC_TX_CNT_MRKR_TX_CNT_MRKR_M MAKEMASK(0xFFFF, 0) +#define PRTMAC_TX_LNK_UP_CNT 0x001E4840 /* Reset Source: GLOBR */ +#define PRTMAC_TX_LNK_UP_CNT_TX_LINK_UP_CNT_S 0 +#define PRTMAC_TX_LNK_UP_CNT_TX_LINK_UP_CNT_M MAKEMASK(0xFFFF, 0) +#define GL_MDCK_CFG1_TX_PQM 0x002D2DF4 /* Reset Source: CORER */ +#define GL_MDCK_CFG1_TX_PQM_SSO_MAX_DATA_LEN_S 0 +#define GL_MDCK_CFG1_TX_PQM_SSO_MAX_DATA_LEN_M MAKEMASK(0xFF, 0) +#define GL_MDCK_CFG1_TX_PQM_SSO_MAX_PKT_CNT_S 8 +#define GL_MDCK_CFG1_TX_PQM_SSO_MAX_PKT_CNT_M MAKEMASK(0x3F, 8) +#define GL_MDCK_CFG1_TX_PQM_SSO_MAX_DESC_CNT_S 16 +#define GL_MDCK_CFG1_TX_PQM_SSO_MAX_DESC_CNT_M MAKEMASK(0x3F, 16) +#define GL_MDCK_EN_TX_PQM 0x002D2DFC /* Reset Source: CORER */ +#define GL_MDCK_EN_TX_PQM_PCI_DUMMY_COMP_S 0 +#define GL_MDCK_EN_TX_PQM_PCI_DUMMY_COMP_M BIT(0) +#define GL_MDCK_EN_TX_PQM_PCI_UR_COMP_S 1 +#define GL_MDCK_EN_TX_PQM_PCI_UR_COMP_M BIT(1) +#define GL_MDCK_EN_TX_PQM_RCV_SH_BE_LSO_S 3 +#define GL_MDCK_EN_TX_PQM_RCV_SH_BE_LSO_M BIT(3) +#define GL_MDCK_EN_TX_PQM_Q_FL_MNG_EPY_CH_S 4 +#define GL_MDCK_EN_TX_PQM_Q_FL_MNG_EPY_CH_M BIT(4) +#define GL_MDCK_EN_TX_PQM_Q_EPY_MNG_FL_CH_S 5 +#define GL_MDCK_EN_TX_PQM_Q_EPY_MNG_FL_CH_M BIT(5) +#define GL_MDCK_EN_TX_PQM_LSO_NUMDESCS_ZERO_S 6 +#define GL_MDCK_EN_TX_PQM_LSO_NUMDESCS_ZERO_M BIT(6) +#define GL_MDCK_EN_TX_PQM_LSO_LENGTH_ZERO_S 7 +#define GL_MDCK_EN_TX_PQM_LSO_LENGTH_ZERO_M BIT(7) +#define GL_MDCK_EN_TX_PQM_LSO_MSS_BELOW_MIN_S 8 +#define GL_MDCK_EN_TX_PQM_LSO_MSS_BELOW_MIN_M BIT(8) +#define GL_MDCK_EN_TX_PQM_LSO_MSS_ABOVE_MAX_S 9 +#define GL_MDCK_EN_TX_PQM_LSO_MSS_ABOVE_MAX_M BIT(9) +#define GL_MDCK_EN_TX_PQM_LSO_HDR_SIZE_ZERO_S 10 +#define GL_MDCK_EN_TX_PQM_LSO_HDR_SIZE_ZERO_M BIT(10) +#define GL_MDCK_EN_TX_PQM_RCV_CNT_BE_LSO_S 11 +#define GL_MDCK_EN_TX_PQM_RCV_CNT_BE_LSO_M BIT(11) +#define GL_MDCK_EN_TX_PQM_SKIP_ONE_QT_ONLY_S 12 +#define GL_MDCK_EN_TX_PQM_SKIP_ONE_QT_ONLY_M BIT(12) +#define GL_MDCK_EN_TX_PQM_LSO_PKTCNT_ZERO_S 13 +#define GL_MDCK_EN_TX_PQM_LSO_PKTCNT_ZERO_M BIT(13) +#define GL_MDCK_EN_TX_PQM_SSO_LENGTH_ZERO_S 14 +#define GL_MDCK_EN_TX_PQM_SSO_LENGTH_ZERO_M BIT(14) +#define GL_MDCK_EN_TX_PQM_SSO_LENGTH_EXCEED_S 15 +#define GL_MDCK_EN_TX_PQM_SSO_LENGTH_EXCEED_M BIT(15) +#define GL_MDCK_EN_TX_PQM_SSO_PKTCNT_ZERO_S 16 +#define GL_MDCK_EN_TX_PQM_SSO_PKTCNT_ZERO_M BIT(16) +#define GL_MDCK_EN_TX_PQM_SSO_PKTCNT_EXCEED_S 17 +#define GL_MDCK_EN_TX_PQM_SSO_PKTCNT_EXCEED_M BIT(17) +#define GL_MDCK_EN_TX_PQM_SSO_NUMDESCS_ZERO_S 18 +#define GL_MDCK_EN_TX_PQM_SSO_NUMDESCS_ZERO_M BIT(18) +#define GL_MDCK_EN_TX_PQM_SSO_NUMDESCS_EXCEED_S 19 +#define GL_MDCK_EN_TX_PQM_SSO_NUMDESCS_EXCEED_M BIT(19) +#define GL_MDCK_EN_TX_PQM_TAIL_GT_RING_LENGTH_S 20 +#define GL_MDCK_EN_TX_PQM_TAIL_GT_RING_LENGTH_M BIT(20) +#define GL_MDCK_EN_TX_PQM_RESERVED_DBL_TYPE_S 21 +#define GL_MDCK_EN_TX_PQM_RESERVED_DBL_TYPE_M BIT(21) +#define GL_MDCK_EN_TX_PQM_ILLEGAL_HEAD_DROP_DBL_S 22 +#define GL_MDCK_EN_TX_PQM_ILLEGAL_HEAD_DROP_DBL_M BIT(22) +#define GL_MDCK_EN_TX_PQM_LSO_OVER_COMMS_Q_S 23 +#define GL_MDCK_EN_TX_PQM_LSO_OVER_COMMS_Q_M BIT(23) +#define GL_MDCK_EN_TX_PQM_ILLEGAL_VF_QNUM_S 24 +#define GL_MDCK_EN_TX_PQM_ILLEGAL_VF_QNUM_M BIT(24) +#define GL_MDCK_EN_TX_PQM_QTAIL_GT_RING_LENGTH_S 25 +#define GL_MDCK_EN_TX_PQM_QTAIL_GT_RING_LENGTH_M BIT(25) +#define GL_MDCK_EN_TX_PQM_RSVD_S 26 +#define GL_MDCK_EN_TX_PQM_RSVD_M MAKEMASK(0x3F, 26) +#define GL_MDCK_RX 0x0029422C /* Reset Source: CORER */ +#define GL_MDCK_RX_DESC_ADDR_S 0 +#define GL_MDCK_RX_DESC_ADDR_M BIT(0) +#define GL_MDCK_TX_TDPU 0x00049348 /* Reset Source: CORER */ +#define GL_MDCK_TX_TDPU_TTL_ERR_ITR_DIS_S 0 +#define GL_MDCK_TX_TDPU_TTL_ERR_ITR_DIS_M BIT(0) +#define GL_MDCK_TX_TDPU_RCU_ANTISPOOF_ITR_DIS_S 1 +#define GL_MDCK_TX_TDPU_RCU_ANTISPOOF_ITR_DIS_M BIT(1) +#define GL_MDCK_TX_TDPU_PCIE_UR_ITR_DIS_S 2 +#define GL_MDCK_TX_TDPU_PCIE_UR_ITR_DIS_M BIT(2) +#define GL_MDCK_TX_TDPU_MAL_OFFSET_ITR_DIS_S 3 +#define GL_MDCK_TX_TDPU_MAL_OFFSET_ITR_DIS_M BIT(3) +#define GL_MDCK_TX_TDPU_MAL_CMD_ITR_DIS_S 4 +#define GL_MDCK_TX_TDPU_MAL_CMD_ITR_DIS_M BIT(4) +#define GL_MDCK_TX_TDPU_BIG_PKT_SIZE_ITR_DIS_S 5 +#define GL_MDCK_TX_TDPU_BIG_PKT_SIZE_ITR_DIS_M BIT(5) +#define GL_MDCK_TX_TDPU_L2_ACCEPT_FAIL_ITR_DIS_S 6 +#define GL_MDCK_TX_TDPU_L2_ACCEPT_FAIL_ITR_DIS_M BIT(6) +#define GL_MDCK_TX_TDPU_NIC_DSI_ITR_DIS_S 7 +#define GL_MDCK_TX_TDPU_NIC_DSI_ITR_DIS_M BIT(7) +#define GL_MDCK_TX_TDPU_MAL_IPSEC_CMD_ITR_DIS_S 8 +#define GL_MDCK_TX_TDPU_MAL_IPSEC_CMD_ITR_DIS_M BIT(8) +#define GL_MDCK_TX_TDPU_DSCP_CHECK_FAIL_ITR_DIS_S 9 +#define GL_MDCK_TX_TDPU_DSCP_CHECK_FAIL_ITR_DIS_M BIT(9) +#define GL_MDCK_TX_TDPU_NIC_IPSEC_ITR_DIS_S 10 +#define GL_MDCK_TX_TDPU_NIC_IPSEC_ITR_DIS_M BIT(10) +#define GL_MDET_RX 0x00294C00 /* Reset Source: CORER */ +#define GL_MDET_RX_QNUM_S 0 +#define GL_MDET_RX_QNUM_M MAKEMASK(0x7FFF, 0) +#define GL_MDET_RX_VF_NUM_S 15 +#define GL_MDET_RX_VF_NUM_M MAKEMASK(0xFF, 15) +#define GL_MDET_RX_PF_NUM_S 23 +#define GL_MDET_RX_PF_NUM_M MAKEMASK(0x7, 23) +#define GL_MDET_RX_MAL_TYPE_S 26 +#define GL_MDET_RX_MAL_TYPE_M MAKEMASK(0x1F, 26) +#define GL_MDET_RX_VALID_S 31 +#define GL_MDET_RX_VALID_M BIT(31) +#define GL_MDET_TX_PQM 0x002D2E00 /* Reset Source: CORER */ +#define GL_MDET_TX_PQM_PF_NUM_S 0 +#define GL_MDET_TX_PQM_PF_NUM_M MAKEMASK(0x7, 0) +#define GL_MDET_TX_PQM_VF_NUM_S 4 +#define GL_MDET_TX_PQM_VF_NUM_M MAKEMASK(0xFF, 4) +#define GL_MDET_TX_PQM_QNUM_S 12 +#define GL_MDET_TX_PQM_QNUM_M MAKEMASK(0x3FFF, 12) +#define GL_MDET_TX_PQM_MAL_TYPE_S 26 +#define GL_MDET_TX_PQM_MAL_TYPE_M MAKEMASK(0x1F, 26) +#define GL_MDET_TX_PQM_VALID_S 31 +#define GL_MDET_TX_PQM_VALID_M BIT(31) +#define GL_MDET_TX_TCLAN 0x000FC068 /* Reset Source: CORER */ +#define GL_MDET_TX_TCLAN_QNUM_S 0 +#define GL_MDET_TX_TCLAN_QNUM_M MAKEMASK(0x7FFF, 0) +#define GL_MDET_TX_TCLAN_VF_NUM_S 15 +#define GL_MDET_TX_TCLAN_VF_NUM_M MAKEMASK(0xFF, 15) +#define GL_MDET_TX_TCLAN_PF_NUM_S 23 +#define GL_MDET_TX_TCLAN_PF_NUM_M MAKEMASK(0x7, 23) +#define GL_MDET_TX_TCLAN_MAL_TYPE_S 26 +#define GL_MDET_TX_TCLAN_MAL_TYPE_M MAKEMASK(0x1F, 26) +#define GL_MDET_TX_TCLAN_VALID_S 31 +#define GL_MDET_TX_TCLAN_VALID_M BIT(31) +#define GL_MDET_TX_TDPU 0x00049350 /* Reset Source: CORER */ +#define GL_MDET_TX_TDPU_QNUM_S 0 +#define GL_MDET_TX_TDPU_QNUM_M MAKEMASK(0x7FFF, 0) +#define GL_MDET_TX_TDPU_VF_NUM_S 15 +#define GL_MDET_TX_TDPU_VF_NUM_M MAKEMASK(0xFF, 15) +#define GL_MDET_TX_TDPU_PF_NUM_S 23 +#define GL_MDET_TX_TDPU_PF_NUM_M MAKEMASK(0x7, 23) +#define GL_MDET_TX_TDPU_MAL_TYPE_S 26 +#define GL_MDET_TX_TDPU_MAL_TYPE_M MAKEMASK(0x1F, 26) +#define GL_MDET_TX_TDPU_VALID_S 31 +#define GL_MDET_TX_TDPU_VALID_M BIT(31) +#define GLRLAN_MDET 0x00294200 /* Reset Source: CORER */ +#define GLRLAN_MDET_PCKT_EXTRCT_ERR_S 0 +#define GLRLAN_MDET_PCKT_EXTRCT_ERR_M BIT(0) +#define PF_MDET_RX 0x00294280 /* Reset Source: CORER */ +#define PF_MDET_RX_VALID_S 0 +#define PF_MDET_RX_VALID_M BIT(0) +#define PF_MDET_TX_PQM 0x002D2C80 /* Reset Source: CORER */ +#define PF_MDET_TX_PQM_VALID_S 0 +#define PF_MDET_TX_PQM_VALID_M BIT(0) +#define PF_MDET_TX_TCLAN 0x000FC000 /* Reset Source: CORER */ +#define PF_MDET_TX_TCLAN_VALID_S 0 +#define PF_MDET_TX_TCLAN_VALID_M BIT(0) +#define PF_MDET_TX_TDPU 0x00040800 /* Reset Source: CORER */ +#define PF_MDET_TX_TDPU_VALID_S 0 +#define PF_MDET_TX_TDPU_VALID_M BIT(0) +#define VP_MDET_RX(_VF) (0x00294400 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VP_MDET_RX_MAX_INDEX 255 +#define VP_MDET_RX_VALID_S 0 +#define VP_MDET_RX_VALID_M BIT(0) +#define VP_MDET_TX_PQM(_VF) (0x002D2000 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VP_MDET_TX_PQM_MAX_INDEX 255 +#define VP_MDET_TX_PQM_VALID_S 0 +#define VP_MDET_TX_PQM_VALID_M BIT(0) +#define VP_MDET_TX_TCLAN(_VF) (0x000FB800 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VP_MDET_TX_TCLAN_MAX_INDEX 255 +#define VP_MDET_TX_TCLAN_VALID_S 0 +#define VP_MDET_TX_TCLAN_VALID_M BIT(0) +#define VP_MDET_TX_TDPU(_VF) (0x00040000 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VP_MDET_TX_TDPU_MAX_INDEX 255 +#define VP_MDET_TX_TDPU_VALID_S 0 +#define VP_MDET_TX_TDPU_VALID_M BIT(0) +#define GENERAL_MNG_FW_DBG_CSR(_i) (0x000B6180 + ((_i) * 4)) /* _i=0...9 */ /* Reset Source: POR */ +#define GENERAL_MNG_FW_DBG_CSR_MAX_INDEX 9 +#define GENERAL_MNG_FW_DBG_CSR_GENERAL_FW_DBG_S 0 +#define GENERAL_MNG_FW_DBG_CSR_GENERAL_FW_DBG_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_FWRESETCNT 0x00083100 /* Reset Source: POR */ +#define GL_FWRESETCNT_FWRESETCNT_S 0 +#define GL_FWRESETCNT_FWRESETCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_MNG_FW_RAM_STAT 0x0008309C /* Reset Source: POR */ +#define GL_MNG_FW_RAM_STAT_FW_RAM_RST_STAT_S 0 +#define GL_MNG_FW_RAM_STAT_FW_RAM_RST_STAT_M BIT(0) +#define GL_MNG_FW_RAM_STAT_MNG_MEM_ECC_ERR_S 1 +#define GL_MNG_FW_RAM_STAT_MNG_MEM_ECC_ERR_M BIT(1) +#define GL_MNG_FWSM 0x000B6134 /* Reset Source: POR */ +#define GL_MNG_FWSM_FW_LOADING_M BIT(30) +#define GL_MNG_FWSM_FW_MODES_S 0 +#define GL_MNG_FWSM_FW_MODES_M MAKEMASK(0x7, 0) +#define GL_MNG_FWSM_RSV0_S 3 +#define GL_MNG_FWSM_RSV0_M MAKEMASK(0x7F, 3) +#define GL_MNG_FWSM_EEP_RELOAD_IND_S 10 +#define GL_MNG_FWSM_EEP_RELOAD_IND_M BIT(10) +#define GL_MNG_FWSM_RSV1_S 11 +#define GL_MNG_FWSM_RSV1_M MAKEMASK(0xF, 11) +#define GL_MNG_FWSM_RSV2_S 15 +#define GL_MNG_FWSM_RSV2_M BIT(15) +#define GL_MNG_FWSM_PCIR_AL_FAILURE_S 16 +#define GL_MNG_FWSM_PCIR_AL_FAILURE_M BIT(16) +#define GL_MNG_FWSM_POR_AL_FAILURE_S 17 +#define GL_MNG_FWSM_POR_AL_FAILURE_M BIT(17) +#define GL_MNG_FWSM_RSV3_S 18 +#define GL_MNG_FWSM_RSV3_M BIT(18) +#define GL_MNG_FWSM_EXT_ERR_IND_S 19 +#define GL_MNG_FWSM_EXT_ERR_IND_M MAKEMASK(0x3F, 19) +#define GL_MNG_FWSM_RSV4_S 25 +#define GL_MNG_FWSM_RSV4_M BIT(25) +#define GL_MNG_FWSM_RESERVED_11_S 26 +#define GL_MNG_FWSM_RESERVED_11_M MAKEMASK(0xF, 26) +#define GL_MNG_FWSM_RSV5_S 30 +#define GL_MNG_FWSM_RSV5_M MAKEMASK(0x3, 30) +#define GL_MNG_HWARB_CTRL 0x000B6130 /* Reset Source: POR */ +#define GL_MNG_HWARB_CTRL_NCSI_ARB_EN_S 0 +#define GL_MNG_HWARB_CTRL_NCSI_ARB_EN_M BIT(0) +#define GL_MNG_SHA_EXTEND(_i) (0x00083120 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: EMPR */ +#define GL_MNG_SHA_EXTEND_MAX_INDEX 7 +#define GL_MNG_SHA_EXTEND_GL_MNG_SHA_EXTEND_S 0 +#define GL_MNG_SHA_EXTEND_GL_MNG_SHA_EXTEND_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_MNG_SHA_EXTEND_ROM(_i) (0x00083160 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: EMPR */ +#define GL_MNG_SHA_EXTEND_ROM_MAX_INDEX 7 +#define GL_MNG_SHA_EXTEND_ROM_GL_MNG_SHA_EXTEND_ROM_S 0 +#define GL_MNG_SHA_EXTEND_ROM_GL_MNG_SHA_EXTEND_ROM_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_MNG_SHA_EXTEND_STATUS 0x00083148 /* Reset Source: EMPR */ +#define GL_MNG_SHA_EXTEND_STATUS_STAGE_S 0 +#define GL_MNG_SHA_EXTEND_STATUS_STAGE_M MAKEMASK(0x7, 0) +#define GL_MNG_SHA_EXTEND_STATUS_FW_HALTED_S 30 +#define GL_MNG_SHA_EXTEND_STATUS_FW_HALTED_M BIT(30) +#define GL_MNG_SHA_EXTEND_STATUS_DONE_S 31 +#define GL_MNG_SHA_EXTEND_STATUS_DONE_M BIT(31) +#define GL_SWT_PRT2MDEF(_i) (0x00216018 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: POR */ +#define GL_SWT_PRT2MDEF_MAX_INDEX 31 +#define GL_SWT_PRT2MDEF_MDEFIDX_S 0 +#define GL_SWT_PRT2MDEF_MDEFIDX_M MAKEMASK(0x7, 0) +#define GL_SWT_PRT2MDEF_MDEFENA_S 31 +#define GL_SWT_PRT2MDEF_MDEFENA_M BIT(31) +#define PRT_MNG_MANC 0x00214720 /* Reset Source: POR */ +#define PRT_MNG_MANC_FLOW_CONTROL_DISCARD_S 0 +#define PRT_MNG_MANC_FLOW_CONTROL_DISCARD_M BIT(0) +#define PRT_MNG_MANC_NCSI_DISCARD_S 1 +#define PRT_MNG_MANC_NCSI_DISCARD_M BIT(1) +#define PRT_MNG_MANC_RCV_TCO_EN_S 17 +#define PRT_MNG_MANC_RCV_TCO_EN_M BIT(17) +#define PRT_MNG_MANC_RCV_ALL_S 19 +#define PRT_MNG_MANC_RCV_ALL_M BIT(19) +#define PRT_MNG_MANC_FIXED_NET_TYPE_S 25 +#define PRT_MNG_MANC_FIXED_NET_TYPE_M BIT(25) +#define PRT_MNG_MANC_NET_TYPE_S 26 +#define PRT_MNG_MANC_NET_TYPE_M BIT(26) +#define PRT_MNG_MANC_EN_BMC2OS_S 28 +#define PRT_MNG_MANC_EN_BMC2OS_M BIT(28) +#define PRT_MNG_MANC_EN_BMC2NET_S 29 +#define PRT_MNG_MANC_EN_BMC2NET_M BIT(29) +#define PRT_MNG_MAVTV(_i) (0x00214780 + ((_i) * 32)) /* _i=0...7 */ /* Reset Source: POR */ +#define PRT_MNG_MAVTV_MAX_INDEX 7 +#define PRT_MNG_MAVTV_VID_S 0 +#define PRT_MNG_MAVTV_VID_M MAKEMASK(0xFFF, 0) +#define PRT_MNG_MDEF(_i) (0x00214880 + ((_i) * 32)) /* _i=0...7 */ /* Reset Source: POR */ +#define PRT_MNG_MDEF_MAX_INDEX 7 +#define PRT_MNG_MDEF_MAC_EXACT_AND_S 0 +#define PRT_MNG_MDEF_MAC_EXACT_AND_M MAKEMASK(0xF, 0) +#define PRT_MNG_MDEF_BROADCAST_AND_S 4 +#define PRT_MNG_MDEF_BROADCAST_AND_M BIT(4) +#define PRT_MNG_MDEF_VLAN_AND_S 5 +#define PRT_MNG_MDEF_VLAN_AND_M MAKEMASK(0xFF, 5) +#define PRT_MNG_MDEF_IPV4_ADDRESS_AND_S 13 +#define PRT_MNG_MDEF_IPV4_ADDRESS_AND_M MAKEMASK(0xF, 13) +#define PRT_MNG_MDEF_IPV6_ADDRESS_AND_S 17 +#define PRT_MNG_MDEF_IPV6_ADDRESS_AND_M MAKEMASK(0xF, 17) +#define PRT_MNG_MDEF_MAC_EXACT_OR_S 21 +#define PRT_MNG_MDEF_MAC_EXACT_OR_M MAKEMASK(0xF, 21) +#define PRT_MNG_MDEF_BROADCAST_OR_S 25 +#define PRT_MNG_MDEF_BROADCAST_OR_M BIT(25) +#define PRT_MNG_MDEF_MULTICAST_AND_S 26 +#define PRT_MNG_MDEF_MULTICAST_AND_M BIT(26) +#define PRT_MNG_MDEF_ARP_REQUEST_OR_S 27 +#define PRT_MNG_MDEF_ARP_REQUEST_OR_M BIT(27) +#define PRT_MNG_MDEF_ARP_RESPONSE_OR_S 28 +#define PRT_MNG_MDEF_ARP_RESPONSE_OR_M BIT(28) +#define PRT_MNG_MDEF_NEIGHBOR_DISCOVERY_134_OR_S 29 +#define PRT_MNG_MDEF_NEIGHBOR_DISCOVERY_134_OR_M BIT(29) +#define PRT_MNG_MDEF_PORT_0X298_OR_S 30 +#define PRT_MNG_MDEF_PORT_0X298_OR_M BIT(30) +#define PRT_MNG_MDEF_PORT_0X26F_OR_S 31 +#define PRT_MNG_MDEF_PORT_0X26F_OR_M BIT(31) +#define PRT_MNG_MDEF_EXT(_i) (0x00214A00 + ((_i) * 32)) /* _i=0...7 */ /* Reset Source: POR */ +#define PRT_MNG_MDEF_EXT_MAX_INDEX 7 +#define PRT_MNG_MDEF_EXT_L2_ETHERTYPE_AND_S 0 +#define PRT_MNG_MDEF_EXT_L2_ETHERTYPE_AND_M MAKEMASK(0xF, 0) +#define PRT_MNG_MDEF_EXT_L2_ETHERTYPE_OR_S 4 +#define PRT_MNG_MDEF_EXT_L2_ETHERTYPE_OR_M MAKEMASK(0xF, 4) +#define PRT_MNG_MDEF_EXT_FLEX_PORT_OR_S 8 +#define PRT_MNG_MDEF_EXT_FLEX_PORT_OR_M MAKEMASK(0xFFFF, 8) +#define PRT_MNG_MDEF_EXT_FLEX_TCO_S 24 +#define PRT_MNG_MDEF_EXT_FLEX_TCO_M BIT(24) +#define PRT_MNG_MDEF_EXT_NEIGHBOR_DISCOVERY_135_OR_S 25 +#define PRT_MNG_MDEF_EXT_NEIGHBOR_DISCOVERY_135_OR_M BIT(25) +#define PRT_MNG_MDEF_EXT_NEIGHBOR_DISCOVERY_136_OR_S 26 +#define PRT_MNG_MDEF_EXT_NEIGHBOR_DISCOVERY_136_OR_M BIT(26) +#define PRT_MNG_MDEF_EXT_NEIGHBOR_DISCOVERY_137_OR_S 27 +#define PRT_MNG_MDEF_EXT_NEIGHBOR_DISCOVERY_137_OR_M BIT(27) +#define PRT_MNG_MDEF_EXT_ICMP_OR_S 28 +#define PRT_MNG_MDEF_EXT_ICMP_OR_M BIT(28) +#define PRT_MNG_MDEF_EXT_MLD_S 29 +#define PRT_MNG_MDEF_EXT_MLD_M BIT(29) +#define PRT_MNG_MDEF_EXT_APPLY_TO_NETWORK_TRAFFIC_S 30 +#define PRT_MNG_MDEF_EXT_APPLY_TO_NETWORK_TRAFFIC_M BIT(30) +#define PRT_MNG_MDEF_EXT_APPLY_TO_HOST_TRAFFIC_S 31 +#define PRT_MNG_MDEF_EXT_APPLY_TO_HOST_TRAFFIC_M BIT(31) +#define PRT_MNG_MDEFVSI(_i) (0x00214980 + ((_i) * 32)) /* _i=0...3 */ /* Reset Source: POR */ +#define PRT_MNG_MDEFVSI_MAX_INDEX 3 +#define PRT_MNG_MDEFVSI_MDEFVSI_2N_S 0 +#define PRT_MNG_MDEFVSI_MDEFVSI_2N_M MAKEMASK(0xFFFF, 0) +#define PRT_MNG_MDEFVSI_MDEFVSI_2NP1_S 16 +#define PRT_MNG_MDEFVSI_MDEFVSI_2NP1_M MAKEMASK(0xFFFF, 16) +#define PRT_MNG_METF(_i) (0x00214120 + ((_i) * 32)) /* _i=0...3 */ /* Reset Source: POR */ +#define PRT_MNG_METF_MAX_INDEX 3 +#define PRT_MNG_METF_ETYPE_S 0 +#define PRT_MNG_METF_ETYPE_M MAKEMASK(0xFFFF, 0) +#define PRT_MNG_METF_POLARITY_S 30 +#define PRT_MNG_METF_POLARITY_M BIT(30) +#define PRT_MNG_MFUTP(_i) (0x00214320 + ((_i) * 32)) /* _i=0...15 */ /* Reset Source: POR */ +#define PRT_MNG_MFUTP_MAX_INDEX 15 +#define PRT_MNG_MFUTP_MFUTP_N_S 0 +#define PRT_MNG_MFUTP_MFUTP_N_M MAKEMASK(0xFFFF, 0) +#define PRT_MNG_MFUTP_UDP_S 16 +#define PRT_MNG_MFUTP_UDP_M BIT(16) +#define PRT_MNG_MFUTP_TCP_S 17 +#define PRT_MNG_MFUTP_TCP_M BIT(17) +#define PRT_MNG_MFUTP_SOURCE_DESTINATION_S 18 +#define PRT_MNG_MFUTP_SOURCE_DESTINATION_M BIT(18) +#define PRT_MNG_MIPAF4(_i) (0x002141A0 + ((_i) * 32)) /* _i=0...3 */ /* Reset Source: POR */ +#define PRT_MNG_MIPAF4_MAX_INDEX 3 +#define PRT_MNG_MIPAF4_MIPAF_S 0 +#define PRT_MNG_MIPAF4_MIPAF_M MAKEMASK(0xFFFFFFFF, 0) +#define PRT_MNG_MIPAF6(_i) (0x00214520 + ((_i) * 32)) /* _i=0...15 */ /* Reset Source: POR */ +#define PRT_MNG_MIPAF6_MAX_INDEX 15 +#define PRT_MNG_MIPAF6_MIPAF_S 0 +#define PRT_MNG_MIPAF6_MIPAF_M MAKEMASK(0xFFFFFFFF, 0) +#define PRT_MNG_MMAH(_i) (0x00214220 + ((_i) * 32)) /* _i=0...3 */ /* Reset Source: POR */ +#define PRT_MNG_MMAH_MAX_INDEX 3 +#define PRT_MNG_MMAH_MMAH_S 0 +#define PRT_MNG_MMAH_MMAH_M MAKEMASK(0xFFFF, 0) +#define PRT_MNG_MMAL(_i) (0x002142A0 + ((_i) * 32)) /* _i=0...3 */ /* Reset Source: POR */ +#define PRT_MNG_MMAL_MAX_INDEX 3 +#define PRT_MNG_MMAL_MMAL_S 0 +#define PRT_MNG_MMAL_MMAL_M MAKEMASK(0xFFFFFFFF, 0) +#define PRT_MNG_MNGONLY 0x00214740 /* Reset Source: POR */ +#define PRT_MNG_MNGONLY_EXCLUSIVE_TO_MANAGEABILITY_S 0 +#define PRT_MNG_MNGONLY_EXCLUSIVE_TO_MANAGEABILITY_M MAKEMASK(0xFF, 0) +#define PRT_MNG_MSFM 0x00214760 /* Reset Source: POR */ +#define PRT_MNG_MSFM_PORT_26F_UDP_S 0 +#define PRT_MNG_MSFM_PORT_26F_UDP_M BIT(0) +#define PRT_MNG_MSFM_PORT_26F_TCP_S 1 +#define PRT_MNG_MSFM_PORT_26F_TCP_M BIT(1) +#define PRT_MNG_MSFM_PORT_298_UDP_S 2 +#define PRT_MNG_MSFM_PORT_298_UDP_M BIT(2) +#define PRT_MNG_MSFM_PORT_298_TCP_S 3 +#define PRT_MNG_MSFM_PORT_298_TCP_M BIT(3) +#define PRT_MNG_MSFM_IPV6_0_MASK_S 4 +#define PRT_MNG_MSFM_IPV6_0_MASK_M BIT(4) +#define PRT_MNG_MSFM_IPV6_1_MASK_S 5 +#define PRT_MNG_MSFM_IPV6_1_MASK_M BIT(5) +#define PRT_MNG_MSFM_IPV6_2_MASK_S 6 +#define PRT_MNG_MSFM_IPV6_2_MASK_M BIT(6) +#define PRT_MNG_MSFM_IPV6_3_MASK_S 7 +#define PRT_MNG_MSFM_IPV6_3_MASK_M BIT(7) +#define MSIX_PBA_PAGE(_i) (0x02E08000 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: FLR */ +#define MSIX_PBA_PAGE_MAX_INDEX 63 +#define MSIX_PBA_PAGE_PENBIT_S 0 +#define MSIX_PBA_PAGE_PENBIT_M MAKEMASK(0xFFFFFFFF, 0) +#define MSIX_PBA1(_i) (0x00008000 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: FLR */ +#define MSIX_PBA1_MAX_INDEX 63 +#define MSIX_PBA1_PENBIT_S 0 +#define MSIX_PBA1_PENBIT_M MAKEMASK(0xFFFFFFFF, 0) +#define MSIX_TADD_PAGE(_i) (0x02E00000 + ((_i) * 16)) /* _i=0...2047 */ /* Reset Source: FLR */ +#define MSIX_TADD_PAGE_MAX_INDEX 2047 +#define MSIX_TADD_PAGE_MSIXTADD10_S 0 +#define MSIX_TADD_PAGE_MSIXTADD10_M MAKEMASK(0x3, 0) +#define MSIX_TADD_PAGE_MSIXTADD_S 2 +#define MSIX_TADD_PAGE_MSIXTADD_M MAKEMASK(0x3FFFFFFF, 2) +#define MSIX_TADD1(_i) (0x00000000 + ((_i) * 16)) /* _i=0...2047 */ /* Reset Source: FLR */ +#define MSIX_TADD1_MAX_INDEX 2047 +#define MSIX_TADD1_MSIXTADD10_S 0 +#define MSIX_TADD1_MSIXTADD10_M MAKEMASK(0x3, 0) +#define MSIX_TADD1_MSIXTADD_S 2 +#define MSIX_TADD1_MSIXTADD_M MAKEMASK(0x3FFFFFFF, 2) +#define MSIX_TMSG(_i) (0x00000008 + ((_i) * 16)) /* _i=0...2047 */ /* Reset Source: FLR */ +#define MSIX_TMSG_MAX_INDEX 2047 +#define MSIX_TMSG_MSIXTMSG_S 0 +#define MSIX_TMSG_MSIXTMSG_M MAKEMASK(0xFFFFFFFF, 0) +#define MSIX_TMSG_PAGE(_i) (0x02E00008 + ((_i) * 16)) /* _i=0...2047 */ /* Reset Source: FLR */ +#define MSIX_TMSG_PAGE_MAX_INDEX 2047 +#define MSIX_TMSG_PAGE_MSIXTMSG_S 0 +#define MSIX_TMSG_PAGE_MSIXTMSG_M MAKEMASK(0xFFFFFFFF, 0) +#define MSIX_TUADD_PAGE(_i) (0x02E00004 + ((_i) * 16)) /* _i=0...2047 */ /* Reset Source: FLR */ +#define MSIX_TUADD_PAGE_MAX_INDEX 2047 +#define MSIX_TUADD_PAGE_MSIXTUADD_S 0 +#define MSIX_TUADD_PAGE_MSIXTUADD_M MAKEMASK(0xFFFFFFFF, 0) +#define MSIX_TUADD1(_i) (0x00000004 + ((_i) * 16)) /* _i=0...2047 */ /* Reset Source: FLR */ +#define MSIX_TUADD1_MAX_INDEX 2047 +#define MSIX_TUADD1_MSIXTUADD_S 0 +#define MSIX_TUADD1_MSIXTUADD_M MAKEMASK(0xFFFFFFFF, 0) +#define MSIX_TVCTRL_PAGE(_i) (0x02E0000C + ((_i) * 16)) /* _i=0...2047 */ /* Reset Source: FLR */ +#define MSIX_TVCTRL_PAGE_MAX_INDEX 2047 +#define MSIX_TVCTRL_PAGE_MASK_S 0 +#define MSIX_TVCTRL_PAGE_MASK_M BIT(0) +#define MSIX_TVCTRL1(_i) (0x0000000C + ((_i) * 16)) /* _i=0...2047 */ /* Reset Source: FLR */ +#define MSIX_TVCTRL1_MAX_INDEX 2047 +#define MSIX_TVCTRL1_MASK_S 0 +#define MSIX_TVCTRL1_MASK_M BIT(0) +#define GLNVM_AL_DONE_HLP 0x000824C4 /* Reset Source: POR */ +#define GLNVM_AL_DONE_HLP_HLP_CORER_S 0 +#define GLNVM_AL_DONE_HLP_HLP_CORER_M BIT(0) +#define GLNVM_AL_DONE_HLP_HLP_FULLR_S 1 +#define GLNVM_AL_DONE_HLP_HLP_FULLR_M BIT(1) +#define GLNVM_ALTIMERS 0x000B6140 /* Reset Source: POR */ +#define GLNVM_ALTIMERS_PCI_ALTIMER_S 0 +#define GLNVM_ALTIMERS_PCI_ALTIMER_M MAKEMASK(0xFFF, 0) +#define GLNVM_ALTIMERS_GEN_ALTIMER_S 12 +#define GLNVM_ALTIMERS_GEN_ALTIMER_M MAKEMASK(0xFFFFF, 12) +#define GLNVM_FLA 0x000B6108 /* Reset Source: POR */ +#define GLNVM_FLA_LOCKED_S 6 +#define GLNVM_FLA_LOCKED_M BIT(6) +#define GLNVM_GENS 0x000B6100 /* Reset Source: POR */ +#define GLNVM_GENS_NVM_PRES_S 0 +#define GLNVM_GENS_NVM_PRES_M BIT(0) +#define GLNVM_GENS_SR_SIZE_S 5 +#define GLNVM_GENS_SR_SIZE_M MAKEMASK(0x7, 5) +#define GLNVM_GENS_BANK1VAL_S 8 +#define GLNVM_GENS_BANK1VAL_M BIT(8) +#define GLNVM_GENS_ALT_PRST_S 23 +#define GLNVM_GENS_ALT_PRST_M BIT(23) +#define GLNVM_GENS_FL_AUTO_RD_S 25 +#define GLNVM_GENS_FL_AUTO_RD_M BIT(25) +#define GLNVM_PROTCSR(_i) (0x000B6010 + ((_i) * 4)) /* _i=0...59 */ /* Reset Source: POR */ +#define GLNVM_PROTCSR_MAX_INDEX 59 +#define GLNVM_PROTCSR_ADDR_BLOCK_S 0 +#define GLNVM_PROTCSR_ADDR_BLOCK_M MAKEMASK(0xFFFFFF, 0) +#define GLNVM_ULD 0x000B6008 /* Reset Source: POR */ +#define GLNVM_ULD_PCIER_DONE_S 0 +#define GLNVM_ULD_PCIER_DONE_M BIT(0) +#define GLNVM_ULD_PCIER_DONE_1_S 1 +#define GLNVM_ULD_PCIER_DONE_1_M BIT(1) +#define GLNVM_ULD_CORER_DONE_S 3 +#define GLNVM_ULD_CORER_DONE_M BIT(3) +#define GLNVM_ULD_GLOBR_DONE_S 4 +#define GLNVM_ULD_GLOBR_DONE_M BIT(4) +#define GLNVM_ULD_POR_DONE_S 5 +#define GLNVM_ULD_POR_DONE_M BIT(5) +#define GLNVM_ULD_POR_DONE_1_S 8 +#define GLNVM_ULD_POR_DONE_1_M BIT(8) +#define GLNVM_ULD_PCIER_DONE_2_S 9 +#define GLNVM_ULD_PCIER_DONE_2_M BIT(9) +#define GLNVM_ULD_PE_DONE_S 10 +#define GLNVM_ULD_PE_DONE_M BIT(10) +#define GLNVM_ULD_HLP_CORE_DONE_S 11 +#define GLNVM_ULD_HLP_CORE_DONE_M BIT(11) +#define GLNVM_ULD_HLP_FULL_DONE_S 12 +#define GLNVM_ULD_HLP_FULL_DONE_M BIT(12) +#define GLNVM_ULT 0x000B6154 /* Reset Source: POR */ +#define GLNVM_ULT_CONF_PCIR_AE_S 0 +#define GLNVM_ULT_CONF_PCIR_AE_M BIT(0) +#define GLNVM_ULT_CONF_PCIRTL_AE_S 1 +#define GLNVM_ULT_CONF_PCIRTL_AE_M BIT(1) +#define GLNVM_ULT_RESERVED_1_S 2 +#define GLNVM_ULT_RESERVED_1_M BIT(2) +#define GLNVM_ULT_CONF_CORE_AE_S 3 +#define GLNVM_ULT_CONF_CORE_AE_M BIT(3) +#define GLNVM_ULT_CONF_GLOBAL_AE_S 4 +#define GLNVM_ULT_CONF_GLOBAL_AE_M BIT(4) +#define GLNVM_ULT_CONF_POR_AE_S 5 +#define GLNVM_ULT_CONF_POR_AE_M BIT(5) +#define GLNVM_ULT_RESERVED_2_S 6 +#define GLNVM_ULT_RESERVED_2_M BIT(6) +#define GLNVM_ULT_RESERVED_3_S 7 +#define GLNVM_ULT_RESERVED_3_M BIT(7) +#define GLNVM_ULT_RESERVED_5_S 8 +#define GLNVM_ULT_RESERVED_5_M BIT(8) +#define GLNVM_ULT_CONF_PCIALT_AE_S 9 +#define GLNVM_ULT_CONF_PCIALT_AE_M BIT(9) +#define GLNVM_ULT_CONF_PE_AE_S 10 +#define GLNVM_ULT_CONF_PE_AE_M BIT(10) +#define GLNVM_ULT_RESERVED_4_S 11 +#define GLNVM_ULT_RESERVED_4_M MAKEMASK(0x1FFFFF, 11) +#define GL_COTF_MARKER_STATUS 0x00200200 /* Reset Source: CORER */ +#define GL_COTF_MARKER_STATUS_MRKR_BUSY_S 0 +#define GL_COTF_MARKER_STATUS_MRKR_BUSY_M MAKEMASK(0xFF, 0) +#define GL_COTF_MARKER_TRIG_RCU_PRS(_i) (0x002001D4 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GL_COTF_MARKER_TRIG_RCU_PRS_MAX_INDEX 7 +#define GL_COTF_MARKER_TRIG_RCU_PRS_SET_RST_S 0 +#define GL_COTF_MARKER_TRIG_RCU_PRS_SET_RST_M BIT(0) +#define GL_PRS_MARKER_ERROR 0x00200204 /* Reset Source: CORER */ +#define GL_PRS_MARKER_ERROR_XLR_CFG_ERR_S 0 +#define GL_PRS_MARKER_ERROR_XLR_CFG_ERR_M BIT(0) +#define GL_PRS_MARKER_ERROR_QH_CFG_ERR_S 1 +#define GL_PRS_MARKER_ERROR_QH_CFG_ERR_M BIT(1) +#define GL_PRS_MARKER_ERROR_COTF_CFG_ERR_S 2 +#define GL_PRS_MARKER_ERROR_COTF_CFG_ERR_M BIT(2) +#define GL_PRS_RX_PIPE_INIT0(_i) (0x0020000C + ((_i) * 4)) /* _i=0...6 */ /* Reset Source: CORER */ +#define GL_PRS_RX_PIPE_INIT0_MAX_INDEX 6 +#define GL_PRS_RX_PIPE_INIT0_GPCSR_INIT_S 0 +#define GL_PRS_RX_PIPE_INIT0_GPCSR_INIT_M MAKEMASK(0xFFFF, 0) +#define GL_PRS_RX_PIPE_INIT1 0x00200028 /* Reset Source: CORER */ +#define GL_PRS_RX_PIPE_INIT1_GPCSR_INIT_S 0 +#define GL_PRS_RX_PIPE_INIT1_GPCSR_INIT_M MAKEMASK(0xFFFF, 0) +#define GL_PRS_RX_PIPE_INIT2 0x0020002C /* Reset Source: CORER */ +#define GL_PRS_RX_PIPE_INIT2_GPCSR_INIT_S 0 +#define GL_PRS_RX_PIPE_INIT2_GPCSR_INIT_M MAKEMASK(0xFFFF, 0) +#define GL_PRS_RX_SIZE_CTRL 0x00200004 /* Reset Source: CORER */ +#define GL_PRS_RX_SIZE_CTRL_MIN_SIZE_S 0 +#define GL_PRS_RX_SIZE_CTRL_MIN_SIZE_M MAKEMASK(0x3FF, 0) +#define GL_PRS_RX_SIZE_CTRL_MIN_SIZE_EN_S 15 +#define GL_PRS_RX_SIZE_CTRL_MIN_SIZE_EN_M BIT(15) +#define GL_PRS_RX_SIZE_CTRL_MAX_SIZE_S 16 +#define GL_PRS_RX_SIZE_CTRL_MAX_SIZE_M MAKEMASK(0x3FF, 16) +#define GL_PRS_RX_SIZE_CTRL_MAX_SIZE_EN_S 31 +#define GL_PRS_RX_SIZE_CTRL_MAX_SIZE_EN_M BIT(31) +#define GL_PRS_TX_PIPE_INIT0(_i) (0x00202018 + ((_i) * 4)) /* _i=0...6 */ /* Reset Source: CORER */ +#define GL_PRS_TX_PIPE_INIT0_MAX_INDEX 6 +#define GL_PRS_TX_PIPE_INIT0_GPCSR_INIT_S 0 +#define GL_PRS_TX_PIPE_INIT0_GPCSR_INIT_M MAKEMASK(0xFFFF, 0) +#define GL_PRS_TX_PIPE_INIT1 0x00202034 /* Reset Source: CORER */ +#define GL_PRS_TX_PIPE_INIT1_GPCSR_INIT_S 0 +#define GL_PRS_TX_PIPE_INIT1_GPCSR_INIT_M MAKEMASK(0xFFFF, 0) +#define GL_PRS_TX_PIPE_INIT2 0x00202038 /* Reset Source: CORER */ +#define GL_PRS_TX_PIPE_INIT2_GPCSR_INIT_S 0 +#define GL_PRS_TX_PIPE_INIT2_GPCSR_INIT_M MAKEMASK(0xFFFF, 0) +#define GL_PRS_TX_SIZE_CTRL 0x00202014 /* Reset Source: CORER */ +#define GL_PRS_TX_SIZE_CTRL_MIN_SIZE_S 0 +#define GL_PRS_TX_SIZE_CTRL_MIN_SIZE_M MAKEMASK(0x3FF, 0) +#define GL_PRS_TX_SIZE_CTRL_MIN_SIZE_EN_S 15 +#define GL_PRS_TX_SIZE_CTRL_MIN_SIZE_EN_M BIT(15) +#define GL_PRS_TX_SIZE_CTRL_MAX_SIZE_S 16 +#define GL_PRS_TX_SIZE_CTRL_MAX_SIZE_M MAKEMASK(0x3FF, 16) +#define GL_PRS_TX_SIZE_CTRL_MAX_SIZE_EN_S 31 +#define GL_PRS_TX_SIZE_CTRL_MAX_SIZE_EN_M BIT(31) +#define GL_QH_MARKER_STATUS 0x002001FC /* Reset Source: CORER */ +#define GL_QH_MARKER_STATUS_MRKR_BUSY_S 0 +#define GL_QH_MARKER_STATUS_MRKR_BUSY_M MAKEMASK(0xF, 0) +#define GL_QH_MARKER_TRIG_RCU_PRS(_i) (0x002001C4 + ((_i) * 4)) /* _i=0...3 */ /* Reset Source: CORER */ +#define GL_QH_MARKER_TRIG_RCU_PRS_MAX_INDEX 3 +#define GL_QH_MARKER_TRIG_RCU_PRS_QPID_S 0 +#define GL_QH_MARKER_TRIG_RCU_PRS_QPID_M MAKEMASK(0x3FFFF, 0) +#define GL_QH_MARKER_TRIG_RCU_PRS_PE_TAG_S 18 +#define GL_QH_MARKER_TRIG_RCU_PRS_PE_TAG_M MAKEMASK(0xFF, 18) +#define GL_QH_MARKER_TRIG_RCU_PRS_PORT_NUM_S 26 +#define GL_QH_MARKER_TRIG_RCU_PRS_PORT_NUM_M MAKEMASK(0x7, 26) +#define GL_QH_MARKER_TRIG_RCU_PRS_SET_RST_S 31 +#define GL_QH_MARKER_TRIG_RCU_PRS_SET_RST_M BIT(31) +#define GL_RPRS_ANA_CSR_CTRL 0x00200708 /* Reset Source: CORER */ +#define GL_RPRS_ANA_CSR_CTRL_SELECT_EN_S 0 +#define GL_RPRS_ANA_CSR_CTRL_SELECT_EN_M BIT(0) +#define GL_RPRS_ANA_CSR_CTRL_SELECTED_ANA_S 1 +#define GL_RPRS_ANA_CSR_CTRL_SELECTED_ANA_M BIT(1) +#define GL_TPRS_ANA_CSR_CTRL 0x00202100 /* Reset Source: CORER */ +#define GL_TPRS_ANA_CSR_CTRL_SELECT_EN_S 0 +#define GL_TPRS_ANA_CSR_CTRL_SELECT_EN_M BIT(0) +#define GL_TPRS_ANA_CSR_CTRL_SELECTED_ANA_S 1 +#define GL_TPRS_ANA_CSR_CTRL_SELECTED_ANA_M BIT(1) +#define GL_TPRS_MNG_PM_THR 0x00202004 /* Reset Source: CORER */ +#define GL_TPRS_MNG_PM_THR_MNG_PM_THR_S 0 +#define GL_TPRS_MNG_PM_THR_MNG_PM_THR_M MAKEMASK(0x3FFF, 0) +#define GL_TPRS_PM_CNT(_i) (0x00202008 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GL_TPRS_PM_CNT_MAX_INDEX 1 +#define GL_TPRS_PM_CNT_GL_PRS_PM_CNT_S 0 +#define GL_TPRS_PM_CNT_GL_PRS_PM_CNT_M MAKEMASK(0x3FFF, 0) +#define GL_TPRS_PM_THR 0x00202000 /* Reset Source: CORER */ +#define GL_TPRS_PM_THR_PM_THR_S 0 +#define GL_TPRS_PM_THR_PM_THR_M MAKEMASK(0x3FFF, 0) +#define GL_XLR_MARKER_LOG_RCU_PRS(_i) (0x00200208 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: CORER */ +#define GL_XLR_MARKER_LOG_RCU_PRS_MAX_INDEX 63 +#define GL_XLR_MARKER_LOG_RCU_PRS_XLR_TRIG_S 0 +#define GL_XLR_MARKER_LOG_RCU_PRS_XLR_TRIG_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_XLR_MARKER_STATUS(_i) (0x002001F4 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GL_XLR_MARKER_STATUS_MAX_INDEX 1 +#define GL_XLR_MARKER_STATUS_MRKR_BUSY_S 0 +#define GL_XLR_MARKER_STATUS_MRKR_BUSY_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_XLR_MARKER_TRIG_PE 0x005008C0 /* Reset Source: CORER */ +#define GL_XLR_MARKER_TRIG_PE_VM_VF_NUM_S 0 +#define GL_XLR_MARKER_TRIG_PE_VM_VF_NUM_M MAKEMASK(0x3FF, 0) +#define GL_XLR_MARKER_TRIG_PE_VM_VF_TYPE_S 10 +#define GL_XLR_MARKER_TRIG_PE_VM_VF_TYPE_M MAKEMASK(0x3, 10) +#define GL_XLR_MARKER_TRIG_PE_PF_NUM_S 12 +#define GL_XLR_MARKER_TRIG_PE_PF_NUM_M MAKEMASK(0x7, 12) +#define GL_XLR_MARKER_TRIG_PE_PORT_NUM_S 16 +#define GL_XLR_MARKER_TRIG_PE_PORT_NUM_M MAKEMASK(0x7, 16) +#define GL_XLR_MARKER_TRIG_RCU_PRS 0x002001C0 /* Reset Source: CORER */ +#define GL_XLR_MARKER_TRIG_RCU_PRS_VM_VF_NUM_S 0 +#define GL_XLR_MARKER_TRIG_RCU_PRS_VM_VF_NUM_M MAKEMASK(0x3FF, 0) +#define GL_XLR_MARKER_TRIG_RCU_PRS_VM_VF_TYPE_S 10 +#define GL_XLR_MARKER_TRIG_RCU_PRS_VM_VF_TYPE_M MAKEMASK(0x3, 10) +#define GL_XLR_MARKER_TRIG_RCU_PRS_PF_NUM_S 12 +#define GL_XLR_MARKER_TRIG_RCU_PRS_PF_NUM_M MAKEMASK(0x7, 12) +#define GL_XLR_MARKER_TRIG_RCU_PRS_PORT_NUM_S 16 +#define GL_XLR_MARKER_TRIG_RCU_PRS_PORT_NUM_M MAKEMASK(0x7, 16) +#define GL_CLKGATE_EVENTS 0x0009DE70 /* Reset Source: PERST */ +#define GL_CLKGATE_EVENTS_PRIMARY_CLKGATE_EVENTS_S 0 +#define GL_CLKGATE_EVENTS_PRIMARY_CLKGATE_EVENTS_M MAKEMASK(0xFFFF, 0) +#define GL_CLKGATE_EVENTS_SIDEBAND_CLKGATE_EVENTS_S 16 +#define GL_CLKGATE_EVENTS_SIDEBAND_CLKGATE_EVENTS_M MAKEMASK(0xFFFF, 16) +#define GLPCI_BYTCTH_NP_C 0x000BFDA8 /* Reset Source: PCIR */ +#define GLPCI_BYTCTH_NP_C_PCI_COUNT_BW_BCT_S 0 +#define GLPCI_BYTCTH_NP_C_PCI_COUNT_BW_BCT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPCI_BYTCTH_P 0x0009E970 /* Reset Source: PCIR */ +#define GLPCI_BYTCTH_P_PCI_COUNT_BW_BCT_S 0 +#define GLPCI_BYTCTH_P_PCI_COUNT_BW_BCT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPCI_BYTCTL_NP_C 0x000BFDAC /* Reset Source: PCIR */ +#define GLPCI_BYTCTL_NP_C_PCI_COUNT_BW_BCT_S 0 +#define GLPCI_BYTCTL_NP_C_PCI_COUNT_BW_BCT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPCI_BYTCTL_P 0x0009E994 /* Reset Source: PCIR */ +#define GLPCI_BYTCTL_P_PCI_COUNT_BW_BCT_S 0 +#define GLPCI_BYTCTL_P_PCI_COUNT_BW_BCT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPCI_CAPCTRL 0x0009DE88 /* Reset Source: PCIR */ +#define GLPCI_CAPCTRL_VPD_EN_S 0 +#define GLPCI_CAPCTRL_VPD_EN_M BIT(0) +#define GLPCI_CAPSUP 0x0009DE8C /* Reset Source: PCIR */ +#define GLPCI_CAPSUP_PCIE_VER_S 0 +#define GLPCI_CAPSUP_PCIE_VER_M BIT(0) +#define GLPCI_CAPSUP_RESERVED_2_S 1 +#define GLPCI_CAPSUP_RESERVED_2_M BIT(1) +#define GLPCI_CAPSUP_LTR_EN_S 2 +#define GLPCI_CAPSUP_LTR_EN_M BIT(2) +#define GLPCI_CAPSUP_TPH_EN_S 3 +#define GLPCI_CAPSUP_TPH_EN_M BIT(3) +#define GLPCI_CAPSUP_ARI_EN_S 4 +#define GLPCI_CAPSUP_ARI_EN_M BIT(4) +#define GLPCI_CAPSUP_IOV_EN_S 5 +#define GLPCI_CAPSUP_IOV_EN_M BIT(5) +#define GLPCI_CAPSUP_ACS_EN_S 6 +#define GLPCI_CAPSUP_ACS_EN_M BIT(6) +#define GLPCI_CAPSUP_SEC_EN_S 7 +#define GLPCI_CAPSUP_SEC_EN_M BIT(7) +#define GLPCI_CAPSUP_PASID_EN_S 8 +#define GLPCI_CAPSUP_PASID_EN_M BIT(8) +#define GLPCI_CAPSUP_DLFE_EN_S 9 +#define GLPCI_CAPSUP_DLFE_EN_M BIT(9) +#define GLPCI_CAPSUP_GEN4_EXT_EN_S 10 +#define GLPCI_CAPSUP_GEN4_EXT_EN_M BIT(10) +#define GLPCI_CAPSUP_GEN4_MARG_EN_S 11 +#define GLPCI_CAPSUP_GEN4_MARG_EN_M BIT(11) +#define GLPCI_CAPSUP_ECRC_GEN_EN_S 16 +#define GLPCI_CAPSUP_ECRC_GEN_EN_M BIT(16) +#define GLPCI_CAPSUP_ECRC_CHK_EN_S 17 +#define GLPCI_CAPSUP_ECRC_CHK_EN_M BIT(17) +#define GLPCI_CAPSUP_IDO_EN_S 18 +#define GLPCI_CAPSUP_IDO_EN_M BIT(18) +#define GLPCI_CAPSUP_MSI_MASK_S 19 +#define GLPCI_CAPSUP_MSI_MASK_M BIT(19) +#define GLPCI_CAPSUP_CSR_CONF_EN_S 20 +#define GLPCI_CAPSUP_CSR_CONF_EN_M BIT(20) +#define GLPCI_CAPSUP_WAKUP_EN_S 21 +#define GLPCI_CAPSUP_WAKUP_EN_M BIT(21) +#define GLPCI_CAPSUP_LOAD_SUBSYS_ID_S 30 +#define GLPCI_CAPSUP_LOAD_SUBSYS_ID_M BIT(30) +#define GLPCI_CAPSUP_LOAD_DEV_ID_S 31 +#define GLPCI_CAPSUP_LOAD_DEV_ID_M BIT(31) +#define GLPCI_CNF 0x0009DEA0 /* Reset Source: POR */ +#define GLPCI_CNF_FLEX10_S 1 +#define GLPCI_CNF_FLEX10_M BIT(1) +#define GLPCI_CNF_WAKE_PIN_EN_S 2 +#define GLPCI_CNF_WAKE_PIN_EN_M BIT(2) +#define GLPCI_CNF_MSIX_ECC_BLOCK_DISABLE_S 3 +#define GLPCI_CNF_MSIX_ECC_BLOCK_DISABLE_M BIT(3) +#define GLPCI_CNF2 0x000BE004 /* Reset Source: PCIR */ +#define GLPCI_CNF2_RO_DIS_S 0 +#define GLPCI_CNF2_RO_DIS_M BIT(0) +#define GLPCI_CNF2_CACHELINE_SIZE_S 1 +#define GLPCI_CNF2_CACHELINE_SIZE_M BIT(1) +#define GLPCI_DREVID 0x0009E9AC /* Reset Source: PCIR */ +#define GLPCI_DREVID_DEFAULT_REVID_S 0 +#define GLPCI_DREVID_DEFAULT_REVID_M MAKEMASK(0xFF, 0) +#define GLPCI_GSCL_1_NP_C 0x000BFDA4 /* Reset Source: PCIR */ +#define GLPCI_GSCL_1_NP_C_RT_MODE_S 8 +#define GLPCI_GSCL_1_NP_C_RT_MODE_M BIT(8) +#define GLPCI_GSCL_1_NP_C_RT_EVENT_S 9 +#define GLPCI_GSCL_1_NP_C_RT_EVENT_M MAKEMASK(0x1F, 9) +#define GLPCI_GSCL_1_NP_C_PCI_COUNT_BW_EN_S 14 +#define GLPCI_GSCL_1_NP_C_PCI_COUNT_BW_EN_M BIT(14) +#define GLPCI_GSCL_1_NP_C_PCI_COUNT_BW_EV_S 15 +#define GLPCI_GSCL_1_NP_C_PCI_COUNT_BW_EV_M MAKEMASK(0x1F, 15) +#define GLPCI_GSCL_1_NP_C_GIO_COUNT_RESET_S 29 +#define GLPCI_GSCL_1_NP_C_GIO_COUNT_RESET_M BIT(29) +#define GLPCI_GSCL_1_NP_C_GIO_COUNT_STOP_S 30 +#define GLPCI_GSCL_1_NP_C_GIO_COUNT_STOP_M BIT(30) +#define GLPCI_GSCL_1_NP_C_GIO_COUNT_START_S 31 +#define GLPCI_GSCL_1_NP_C_GIO_COUNT_START_M BIT(31) +#define GLPCI_GSCL_1_P 0x0009E9B4 /* Reset Source: PCIR */ +#define GLPCI_GSCL_1_P_GIO_COUNT_EN_0_S 0 +#define GLPCI_GSCL_1_P_GIO_COUNT_EN_0_M BIT(0) +#define GLPCI_GSCL_1_P_GIO_COUNT_EN_1_S 1 +#define GLPCI_GSCL_1_P_GIO_COUNT_EN_1_M BIT(1) +#define GLPCI_GSCL_1_P_GIO_COUNT_EN_2_S 2 +#define GLPCI_GSCL_1_P_GIO_COUNT_EN_2_M BIT(2) +#define GLPCI_GSCL_1_P_GIO_COUNT_EN_3_S 3 +#define GLPCI_GSCL_1_P_GIO_COUNT_EN_3_M BIT(3) +#define GLPCI_GSCL_1_P_LBC_ENABLE_0_S 4 +#define GLPCI_GSCL_1_P_LBC_ENABLE_0_M BIT(4) +#define GLPCI_GSCL_1_P_LBC_ENABLE_1_S 5 +#define GLPCI_GSCL_1_P_LBC_ENABLE_1_M BIT(5) +#define GLPCI_GSCL_1_P_LBC_ENABLE_2_S 6 +#define GLPCI_GSCL_1_P_LBC_ENABLE_2_M BIT(6) +#define GLPCI_GSCL_1_P_LBC_ENABLE_3_S 7 +#define GLPCI_GSCL_1_P_LBC_ENABLE_3_M BIT(7) +#define GLPCI_GSCL_1_P_PCI_COUNT_BW_EN_S 14 +#define GLPCI_GSCL_1_P_PCI_COUNT_BW_EN_M BIT(14) +#define GLPCI_GSCL_1_P_GIO_64_BIT_EN_S 28 +#define GLPCI_GSCL_1_P_GIO_64_BIT_EN_M BIT(28) +#define GLPCI_GSCL_1_P_GIO_COUNT_RESET_S 29 +#define GLPCI_GSCL_1_P_GIO_COUNT_RESET_M BIT(29) +#define GLPCI_GSCL_1_P_GIO_COUNT_STOP_S 30 +#define GLPCI_GSCL_1_P_GIO_COUNT_STOP_M BIT(30) +#define GLPCI_GSCL_1_P_GIO_COUNT_START_S 31 +#define GLPCI_GSCL_1_P_GIO_COUNT_START_M BIT(31) +#define GLPCI_GSCL_2 0x0009E998 /* Reset Source: PCIR */ +#define GLPCI_GSCL_2_GIO_EVENT_NUM_0_S 0 +#define GLPCI_GSCL_2_GIO_EVENT_NUM_0_M MAKEMASK(0xFF, 0) +#define GLPCI_GSCL_2_GIO_EVENT_NUM_1_S 8 +#define GLPCI_GSCL_2_GIO_EVENT_NUM_1_M MAKEMASK(0xFF, 8) +#define GLPCI_GSCL_2_GIO_EVENT_NUM_2_S 16 +#define GLPCI_GSCL_2_GIO_EVENT_NUM_2_M MAKEMASK(0xFF, 16) +#define GLPCI_GSCL_2_GIO_EVENT_NUM_3_S 24 +#define GLPCI_GSCL_2_GIO_EVENT_NUM_3_M MAKEMASK(0xFF, 24) +#define GLPCI_GSCL_5_8(_i) (0x0009E954 + ((_i) * 4)) /* _i=0...3 */ /* Reset Source: PCIR */ +#define GLPCI_GSCL_5_8_MAX_INDEX 3 +#define GLPCI_GSCL_5_8_LBC_THRESHOLD_N_S 0 +#define GLPCI_GSCL_5_8_LBC_THRESHOLD_N_M MAKEMASK(0xFFFF, 0) +#define GLPCI_GSCL_5_8_LBC_TIMER_N_S 16 +#define GLPCI_GSCL_5_8_LBC_TIMER_N_M MAKEMASK(0xFFFF, 16) +#define GLPCI_GSCN_0_3(_i) (0x0009E99C + ((_i) * 4)) /* _i=0...3 */ /* Reset Source: PCIR */ +#define GLPCI_GSCN_0_3_MAX_INDEX 3 +#define GLPCI_GSCN_0_3_EVENT_COUNTER_S 0 +#define GLPCI_GSCN_0_3_EVENT_COUNTER_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPCI_LATCT_NP_C 0x000BFDA0 /* Reset Source: PCIR */ +#define GLPCI_LATCT_NP_C_PCI_LATENCY_COUNT_S 0 +#define GLPCI_LATCT_NP_C_PCI_LATENCY_COUNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPCI_LBARCTRL 0x0009DE74 /* Reset Source: POR */ +#define GLPCI_LBARCTRL_PREFBAR_S 0 +#define GLPCI_LBARCTRL_PREFBAR_M BIT(0) +#define GLPCI_LBARCTRL_BAR32_S 1 +#define GLPCI_LBARCTRL_BAR32_M BIT(1) +#define GLPCI_LBARCTRL_PAGES_SPACE_EN_PF_S 2 +#define GLPCI_LBARCTRL_PAGES_SPACE_EN_PF_M BIT(2) +#define GLPCI_LBARCTRL_FLASH_EXPOSE_S 3 +#define GLPCI_LBARCTRL_FLASH_EXPOSE_M BIT(3) +#define GLPCI_LBARCTRL_PE_DB_SIZE_S 4 +#define GLPCI_LBARCTRL_PE_DB_SIZE_M MAKEMASK(0x3, 4) +#define GLPCI_LBARCTRL_PAGES_SPACE_EN_VF_S 9 +#define GLPCI_LBARCTRL_PAGES_SPACE_EN_VF_M BIT(9) +#define GLPCI_LBARCTRL_EXROM_SIZE_S 11 +#define GLPCI_LBARCTRL_EXROM_SIZE_M MAKEMASK(0x7, 11) +#define GLPCI_LBARCTRL_VF_PE_DB_SIZE_S 14 +#define GLPCI_LBARCTRL_VF_PE_DB_SIZE_M MAKEMASK(0x3, 14) +#define GLPCI_LINKCAP 0x0009DE90 /* Reset Source: PCIR */ +#define GLPCI_LINKCAP_LINK_SPEEDS_VECTOR_S 0 +#define GLPCI_LINKCAP_LINK_SPEEDS_VECTOR_M MAKEMASK(0x3F, 0) +#define GLPCI_LINKCAP_MAX_LINK_WIDTH_S 9 +#define GLPCI_LINKCAP_MAX_LINK_WIDTH_M MAKEMASK(0xF, 9) +#define GLPCI_NPQ_CFG 0x000BFD80 /* Reset Source: PCIR */ +#define GLPCI_NPQ_CFG_EXTEND_TO_S 0 +#define GLPCI_NPQ_CFG_EXTEND_TO_M BIT(0) +#define GLPCI_NPQ_CFG_SMALL_TO_S 1 +#define GLPCI_NPQ_CFG_SMALL_TO_M BIT(1) +#define GLPCI_NPQ_CFG_WEIGHT_AVG_S 2 +#define GLPCI_NPQ_CFG_WEIGHT_AVG_M MAKEMASK(0xF, 2) +#define GLPCI_NPQ_CFG_NPQ_SPARE_S 6 +#define GLPCI_NPQ_CFG_NPQ_SPARE_M MAKEMASK(0x3FF, 6) +#define GLPCI_NPQ_CFG_NPQ_ERR_STAT_S 16 +#define GLPCI_NPQ_CFG_NPQ_ERR_STAT_M MAKEMASK(0xF, 16) +#define GLPCI_PKTCT_NP_C 0x000BFD9C /* Reset Source: PCIR */ +#define GLPCI_PKTCT_NP_C_PCI_COUNT_BW_PCT_S 0 +#define GLPCI_PKTCT_NP_C_PCI_COUNT_BW_PCT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPCI_PKTCT_P 0x0009E9B0 /* Reset Source: PCIR */ +#define GLPCI_PKTCT_P_PCI_COUNT_BW_PCT_S 0 +#define GLPCI_PKTCT_P_PCI_COUNT_BW_PCT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPCI_PMSUP 0x0009DE94 /* Reset Source: PCIR */ +#define GLPCI_PMSUP_RESERVED_0_S 0 +#define GLPCI_PMSUP_RESERVED_0_M MAKEMASK(0x3, 0) +#define GLPCI_PMSUP_RESERVED_1_S 2 +#define GLPCI_PMSUP_RESERVED_1_M MAKEMASK(0x7, 2) +#define GLPCI_PMSUP_RESERVED_2_S 5 +#define GLPCI_PMSUP_RESERVED_2_M MAKEMASK(0x7, 5) +#define GLPCI_PMSUP_L0S_ACC_LAT_S 8 +#define GLPCI_PMSUP_L0S_ACC_LAT_M MAKEMASK(0x7, 8) +#define GLPCI_PMSUP_L1_ACC_LAT_S 11 +#define GLPCI_PMSUP_L1_ACC_LAT_M MAKEMASK(0x7, 11) +#define GLPCI_PMSUP_RESERVED_3_S 14 +#define GLPCI_PMSUP_RESERVED_3_M BIT(14) +#define GLPCI_PMSUP_OBFF_SUP_S 15 +#define GLPCI_PMSUP_OBFF_SUP_M MAKEMASK(0x3, 15) +#define GLPCI_PUSH_PE_IF_TO_STATUS 0x0009DF44 /* Reset Source: PCIR */ +#define GLPCI_PUSH_PE_IF_TO_STATUS_GLPCI_PUSH_PE_IF_TO_STATUS_S 0 +#define GLPCI_PUSH_PE_IF_TO_STATUS_GLPCI_PUSH_PE_IF_TO_STATUS_M BIT(0) +#define GLPCI_PWRDATA 0x0009DE7C /* Reset Source: PCIR */ +#define GLPCI_PWRDATA_D0_POWER_S 0 +#define GLPCI_PWRDATA_D0_POWER_M MAKEMASK(0xFF, 0) +#define GLPCI_PWRDATA_COMM_POWER_S 8 +#define GLPCI_PWRDATA_COMM_POWER_M MAKEMASK(0xFF, 8) +#define GLPCI_PWRDATA_D3_POWER_S 16 +#define GLPCI_PWRDATA_D3_POWER_M MAKEMASK(0xFF, 16) +#define GLPCI_PWRDATA_DATA_SCALE_S 24 +#define GLPCI_PWRDATA_DATA_SCALE_M MAKEMASK(0x3, 24) +#define GLPCI_REVID 0x0009DE98 /* Reset Source: PCIR */ +#define GLPCI_REVID_NVM_REVID_S 0 +#define GLPCI_REVID_NVM_REVID_M MAKEMASK(0xFF, 0) +#define GLPCI_SERH 0x0009DE84 /* Reset Source: PCIR */ +#define GLPCI_SERH_SER_NUM_H_S 0 +#define GLPCI_SERH_SER_NUM_H_M MAKEMASK(0xFFFF, 0) +#define GLPCI_SERL 0x0009DE80 /* Reset Source: PCIR */ +#define GLPCI_SERL_SER_NUM_L_S 0 +#define GLPCI_SERL_SER_NUM_L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPCI_SUBVENID 0x0009DEE8 /* Reset Source: PCIR */ +#define GLPCI_SUBVENID_SUB_VEN_ID_S 0 +#define GLPCI_SUBVENID_SUB_VEN_ID_M MAKEMASK(0xFFFF, 0) +#define GLPCI_UPADD 0x000BE0D4 /* Reset Source: PCIR */ +#define GLPCI_UPADD_ADDRESS_S 1 +#define GLPCI_UPADD_ADDRESS_M MAKEMASK(0x7FFFFFFF, 1) +#define GLPCI_VENDORID 0x0009DEC8 /* Reset Source: PCIR */ +#define GLPCI_VENDORID_VENDORID_S 0 +#define GLPCI_VENDORID_VENDORID_M MAKEMASK(0xFFFF, 0) +#define GLPCI_VFSUP 0x0009DE9C /* Reset Source: PCIR */ +#define GLPCI_VFSUP_VF_PREFETCH_S 0 +#define GLPCI_VFSUP_VF_PREFETCH_M BIT(0) +#define GLPCI_VFSUP_VR_BAR_TYPE_S 1 +#define GLPCI_VFSUP_VR_BAR_TYPE_M BIT(1) +#define GLPCI_WATMK_CLNT_PIPEMON 0x000BFD90 /* Reset Source: PCIR */ +#define GLPCI_WATMK_CLNT_PIPEMON_DATA_LINES_S 0 +#define GLPCI_WATMK_CLNT_PIPEMON_DATA_LINES_M MAKEMASK(0xFFFF, 0) +#define PF_FUNC_RID 0x0009E880 /* Reset Source: PCIR */ +#define PF_FUNC_RID_FUNCTION_NUMBER_S 0 +#define PF_FUNC_RID_FUNCTION_NUMBER_M MAKEMASK(0x7, 0) +#define PF_FUNC_RID_DEVICE_NUMBER_S 3 +#define PF_FUNC_RID_DEVICE_NUMBER_M MAKEMASK(0x1F, 3) +#define PF_FUNC_RID_BUS_NUMBER_S 8 +#define PF_FUNC_RID_BUS_NUMBER_M MAKEMASK(0xFF, 8) +#define PF_PCI_CIAA 0x0009E580 /* Reset Source: FLR */ +#define PF_PCI_CIAA_ADDRESS_S 0 +#define PF_PCI_CIAA_ADDRESS_M MAKEMASK(0xFFF, 0) +#define PF_PCI_CIAA_VF_NUM_S 12 +#define PF_PCI_CIAA_VF_NUM_M MAKEMASK(0xFF, 12) +#define PF_PCI_CIAD 0x0009E500 /* Reset Source: FLR */ +#define PF_PCI_CIAD_DATA_S 0 +#define PF_PCI_CIAD_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define PFPCI_CLASS 0x0009DB00 /* Reset Source: PCIR */ +#define PFPCI_CLASS_STORAGE_CLASS_S 0 +#define PFPCI_CLASS_STORAGE_CLASS_M BIT(0) +#define PFPCI_CLASS_PF_IS_LAN_S 2 +#define PFPCI_CLASS_PF_IS_LAN_M BIT(2) +#define PFPCI_CNF 0x0009DF00 /* Reset Source: PCIR */ +#define PFPCI_CNF_MSI_EN_S 2 +#define PFPCI_CNF_MSI_EN_M BIT(2) +#define PFPCI_CNF_EXROM_DIS_S 3 +#define PFPCI_CNF_EXROM_DIS_M BIT(3) +#define PFPCI_CNF_IO_BAR_S 4 +#define PFPCI_CNF_IO_BAR_M BIT(4) +#define PFPCI_CNF_INT_PIN_S 5 +#define PFPCI_CNF_INT_PIN_M MAKEMASK(0x3, 5) +#define PFPCI_DEVID 0x0009DE00 /* Reset Source: PCIR */ +#define PFPCI_DEVID_PF_DEV_ID_S 0 +#define PFPCI_DEVID_PF_DEV_ID_M MAKEMASK(0xFFFF, 0) +#define PFPCI_DEVID_VF_DEV_ID_S 16 +#define PFPCI_DEVID_VF_DEV_ID_M MAKEMASK(0xFFFF, 16) +#define PFPCI_FACTPS 0x0009E900 /* Reset Source: FLR */ +#define PFPCI_FACTPS_FUNC_POWER_STATE_S 0 +#define PFPCI_FACTPS_FUNC_POWER_STATE_M MAKEMASK(0x3, 0) +#define PFPCI_FACTPS_FUNC_AUX_EN_S 3 +#define PFPCI_FACTPS_FUNC_AUX_EN_M BIT(3) +#define PFPCI_FUNC 0x0009D980 /* Reset Source: POR */ +#define PFPCI_FUNC_FUNC_DIS_S 0 +#define PFPCI_FUNC_FUNC_DIS_M BIT(0) +#define PFPCI_FUNC_ALLOW_FUNC_DIS_S 1 +#define PFPCI_FUNC_ALLOW_FUNC_DIS_M BIT(1) +#define PFPCI_FUNC_DIS_FUNC_ON_PORT_DIS_S 2 +#define PFPCI_FUNC_DIS_FUNC_ON_PORT_DIS_M BIT(2) +#define PFPCI_PF_FLUSH_DONE 0x0009E400 /* Reset Source: PCIR */ +#define PFPCI_PF_FLUSH_DONE_FLUSH_DONE_S 0 +#define PFPCI_PF_FLUSH_DONE_FLUSH_DONE_M BIT(0) +#define PFPCI_PM 0x0009DA80 /* Reset Source: POR */ +#define PFPCI_PM_PME_EN_S 0 +#define PFPCI_PM_PME_EN_M BIT(0) +#define PFPCI_STATUS1 0x0009DA00 /* Reset Source: POR */ +#define PFPCI_STATUS1_FUNC_VALID_S 0 +#define PFPCI_STATUS1_FUNC_VALID_M BIT(0) +#define PFPCI_SUBSYSID 0x0009D880 /* Reset Source: PCIR */ +#define PFPCI_SUBSYSID_PF_SUBSYS_ID_S 0 +#define PFPCI_SUBSYSID_PF_SUBSYS_ID_M MAKEMASK(0xFFFF, 0) +#define PFPCI_SUBSYSID_VF_SUBSYS_ID_S 16 +#define PFPCI_SUBSYSID_VF_SUBSYS_ID_M MAKEMASK(0xFFFF, 16) +#define PFPCI_VF_FLUSH_DONE(_VF) (0x0009E000 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: PCIR */ +#define PFPCI_VF_FLUSH_DONE_MAX_INDEX 255 +#define PFPCI_VF_FLUSH_DONE_FLUSH_DONE_S 0 +#define PFPCI_VF_FLUSH_DONE_FLUSH_DONE_M BIT(0) +#define PFPCI_VM_FLUSH_DONE 0x0009E480 /* Reset Source: PCIR */ +#define PFPCI_VM_FLUSH_DONE_FLUSH_DONE_S 0 +#define PFPCI_VM_FLUSH_DONE_FLUSH_DONE_M BIT(0) +#define PFPCI_VMINDEX 0x0009E600 /* Reset Source: PCIR */ +#define PFPCI_VMINDEX_VMINDEX_S 0 +#define PFPCI_VMINDEX_VMINDEX_M MAKEMASK(0x3FF, 0) +#define PFPCI_VMPEND 0x0009E800 /* Reset Source: PCIR */ +#define PFPCI_VMPEND_PENDING_S 0 +#define PFPCI_VMPEND_PENDING_M BIT(0) +#define PQ_FIFO_STATUS 0x0009DF40 /* Reset Source: PCIR */ +#define PQ_FIFO_STATUS_PQ_FIFO_COUNT_S 0 +#define PQ_FIFO_STATUS_PQ_FIFO_COUNT_M MAKEMASK(0x7FFFFFFF, 0) +#define PQ_FIFO_STATUS_PQ_FIFO_EMPTY_S 31 +#define PQ_FIFO_STATUS_PQ_FIFO_EMPTY_M BIT(31) +#define GLPE_CPUSTATUS0 0x0050BA5C /* Reset Source: CORER */ +#define GLPE_CPUSTATUS0_PECPUSTATUS0_S 0 +#define GLPE_CPUSTATUS0_PECPUSTATUS0_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPE_CPUSTATUS1 0x0050BA60 /* Reset Source: CORER */ +#define GLPE_CPUSTATUS1_PECPUSTATUS1_S 0 +#define GLPE_CPUSTATUS1_PECPUSTATUS1_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPE_CPUSTATUS2 0x0050BA64 /* Reset Source: CORER */ +#define GLPE_CPUSTATUS2_PECPUSTATUS2_S 0 +#define GLPE_CPUSTATUS2_PECPUSTATUS2_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPE_MDQ_BASE(_i) (0x00536000 + ((_i) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLPE_MDQ_BASE_MAX_INDEX 511 +#define GLPE_MDQ_BASE_MDOC_INDEX_S 0 +#define GLPE_MDQ_BASE_MDOC_INDEX_M MAKEMASK(0xFFFFFFF, 0) +#define GLPE_MDQ_PTR(_i) (0x00537000 + ((_i) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLPE_MDQ_PTR_MAX_INDEX 511 +#define GLPE_MDQ_PTR_MDQ_HEAD_S 0 +#define GLPE_MDQ_PTR_MDQ_HEAD_M MAKEMASK(0x3FFF, 0) +#define GLPE_MDQ_PTR_MDQ_TAIL_S 16 +#define GLPE_MDQ_PTR_MDQ_TAIL_M MAKEMASK(0x3FFF, 16) +#define GLPE_MDQ_SIZE(_i) (0x00536800 + ((_i) * 4)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLPE_MDQ_SIZE_MAX_INDEX 511 +#define GLPE_MDQ_SIZE_MDQ_SIZE_S 0 +#define GLPE_MDQ_SIZE_MDQ_SIZE_M MAKEMASK(0x3FFF, 0) +#define GLPE_PEPM_CTRL 0x0050C000 /* Reset Source: PERST */ +#define GLPE_PEPM_CTRL_PEPM_ENABLE_S 0 +#define GLPE_PEPM_CTRL_PEPM_ENABLE_M BIT(0) +#define GLPE_PEPM_CTRL_PEPM_HALT_S 8 +#define GLPE_PEPM_CTRL_PEPM_HALT_M BIT(8) +#define GLPE_PEPM_CTRL_PEPM_PUSH_MARGIN_S 16 +#define GLPE_PEPM_CTRL_PEPM_PUSH_MARGIN_M MAKEMASK(0xFF, 16) +#define GLPE_PEPM_DEALLOC 0x0050C004 /* Reset Source: PERST */ +#define GLPE_PEPM_DEALLOC_MDQ_CREDITS_S 0 +#define GLPE_PEPM_DEALLOC_MDQ_CREDITS_M MAKEMASK(0x3FFF, 0) +#define GLPE_PEPM_DEALLOC_PSQ_CREDITS_S 14 +#define GLPE_PEPM_DEALLOC_PSQ_CREDITS_M MAKEMASK(0x1F, 14) +#define GLPE_PEPM_DEALLOC_PQID_S 19 +#define GLPE_PEPM_DEALLOC_PQID_M MAKEMASK(0x1FF, 19) +#define GLPE_PEPM_DEALLOC_PORT_S 28 +#define GLPE_PEPM_DEALLOC_PORT_M MAKEMASK(0x7, 28) +#define GLPE_PEPM_DEALLOC_DEALLOC_RDY_S 31 +#define GLPE_PEPM_DEALLOC_DEALLOC_RDY_M BIT(31) +#define GLPE_PEPM_PSQ_COUNT 0x0050C020 /* Reset Source: PERST */ +#define GLPE_PEPM_PSQ_COUNT_PEPM_PSQ_COUNT_S 0 +#define GLPE_PEPM_PSQ_COUNT_PEPM_PSQ_COUNT_M MAKEMASK(0xFFFF, 0) +#define GLPE_PEPM_THRESH(_i) (0x0050C840 + ((_i) * 4)) /* _i=0...511 */ /* Reset Source: PERST */ +#define GLPE_PEPM_THRESH_MAX_INDEX 511 +#define GLPE_PEPM_THRESH_PEPM_PSQ_THRESH_S 0 +#define GLPE_PEPM_THRESH_PEPM_PSQ_THRESH_M MAKEMASK(0x1F, 0) +#define GLPE_PEPM_THRESH_PEPM_MDQ_THRESH_S 16 +#define GLPE_PEPM_THRESH_PEPM_MDQ_THRESH_M MAKEMASK(0x3FFF, 16) +#define GLPE_PFAEQEDROPCNT(_i) (0x00503240 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPE_PFAEQEDROPCNT_MAX_INDEX 7 +#define GLPE_PFAEQEDROPCNT_AEQEDROPCNT_S 0 +#define GLPE_PFAEQEDROPCNT_AEQEDROPCNT_M MAKEMASK(0xFFFF, 0) +#define GLPE_PFCEQEDROPCNT(_i) (0x00503220 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPE_PFCEQEDROPCNT_MAX_INDEX 7 +#define GLPE_PFCEQEDROPCNT_CEQEDROPCNT_S 0 +#define GLPE_PFCEQEDROPCNT_CEQEDROPCNT_M MAKEMASK(0xFFFF, 0) +#define GLPE_PFCQEDROPCNT(_i) (0x00503200 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPE_PFCQEDROPCNT_MAX_INDEX 7 +#define GLPE_PFCQEDROPCNT_CQEDROPCNT_S 0 +#define GLPE_PFCQEDROPCNT_CQEDROPCNT_M MAKEMASK(0xFFFF, 0) +#define GLPE_PFFLMOOISCALLOCERR(_i) (0x0050B960 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPE_PFFLMOOISCALLOCERR_MAX_INDEX 7 +#define GLPE_PFFLMOOISCALLOCERR_ERROR_COUNT_S 0 +#define GLPE_PFFLMOOISCALLOCERR_ERROR_COUNT_M MAKEMASK(0xFFFF, 0) +#define GLPE_PFFLMQ1ALLOCERR(_i) (0x0050B920 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPE_PFFLMQ1ALLOCERR_MAX_INDEX 7 +#define GLPE_PFFLMQ1ALLOCERR_ERROR_COUNT_S 0 +#define GLPE_PFFLMQ1ALLOCERR_ERROR_COUNT_M MAKEMASK(0xFFFF, 0) +#define GLPE_PFFLMRRFALLOCERR(_i) (0x0050B940 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPE_PFFLMRRFALLOCERR_MAX_INDEX 7 +#define GLPE_PFFLMRRFALLOCERR_ERROR_COUNT_S 0 +#define GLPE_PFFLMRRFALLOCERR_ERROR_COUNT_M MAKEMASK(0xFFFF, 0) +#define GLPE_PFFLMXMITALLOCERR(_i) (0x0050B900 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPE_PFFLMXMITALLOCERR_MAX_INDEX 7 +#define GLPE_PFFLMXMITALLOCERR_ERROR_COUNT_S 0 +#define GLPE_PFFLMXMITALLOCERR_ERROR_COUNT_M MAKEMASK(0xFFFF, 0) +#define GLPE_PFTCPNOW50USCNT(_i) (0x0050B8C0 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPE_PFTCPNOW50USCNT_MAX_INDEX 7 +#define GLPE_PFTCPNOW50USCNT_CNT_S 0 +#define GLPE_PFTCPNOW50USCNT_CNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPE_PUSH_PEPM 0x0053241C /* Reset Source: CORER */ +#define GLPE_PUSH_PEPM_MDQ_CREDITS_S 0 +#define GLPE_PUSH_PEPM_MDQ_CREDITS_M MAKEMASK(0xFF, 0) +#define GLPE_VFAEQEDROPCNT(_i) (0x00503100 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLPE_VFAEQEDROPCNT_MAX_INDEX 31 +#define GLPE_VFAEQEDROPCNT_AEQEDROPCNT_S 0 +#define GLPE_VFAEQEDROPCNT_AEQEDROPCNT_M MAKEMASK(0xFFFF, 0) +#define GLPE_VFCEQEDROPCNT(_i) (0x00503080 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLPE_VFCEQEDROPCNT_MAX_INDEX 31 +#define GLPE_VFCEQEDROPCNT_CEQEDROPCNT_S 0 +#define GLPE_VFCEQEDROPCNT_CEQEDROPCNT_M MAKEMASK(0xFFFF, 0) +#define GLPE_VFCQEDROPCNT(_i) (0x00503000 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLPE_VFCQEDROPCNT_MAX_INDEX 31 +#define GLPE_VFCQEDROPCNT_CQEDROPCNT_S 0 +#define GLPE_VFCQEDROPCNT_CQEDROPCNT_M MAKEMASK(0xFFFF, 0) +#define GLPE_VFFLMOOISCALLOCERR(_i) (0x0050B580 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLPE_VFFLMOOISCALLOCERR_MAX_INDEX 31 +#define GLPE_VFFLMOOISCALLOCERR_ERROR_COUNT_S 0 +#define GLPE_VFFLMOOISCALLOCERR_ERROR_COUNT_M MAKEMASK(0xFFFF, 0) +#define GLPE_VFFLMQ1ALLOCERR(_i) (0x0050B480 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLPE_VFFLMQ1ALLOCERR_MAX_INDEX 31 +#define GLPE_VFFLMQ1ALLOCERR_ERROR_COUNT_S 0 +#define GLPE_VFFLMQ1ALLOCERR_ERROR_COUNT_M MAKEMASK(0xFFFF, 0) +#define GLPE_VFFLMRRFALLOCERR(_i) (0x0050B500 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLPE_VFFLMRRFALLOCERR_MAX_INDEX 31 +#define GLPE_VFFLMRRFALLOCERR_ERROR_COUNT_S 0 +#define GLPE_VFFLMRRFALLOCERR_ERROR_COUNT_M MAKEMASK(0xFFFF, 0) +#define GLPE_VFFLMXMITALLOCERR(_i) (0x0050B400 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLPE_VFFLMXMITALLOCERR_MAX_INDEX 31 +#define GLPE_VFFLMXMITALLOCERR_ERROR_COUNT_S 0 +#define GLPE_VFFLMXMITALLOCERR_ERROR_COUNT_M MAKEMASK(0xFFFF, 0) +#define GLPE_VFTCPNOW50USCNT(_i) (0x0050B300 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: PE_CORER */ +#define GLPE_VFTCPNOW50USCNT_MAX_INDEX 31 +#define GLPE_VFTCPNOW50USCNT_CNT_S 0 +#define GLPE_VFTCPNOW50USCNT_CNT_M MAKEMASK(0xFFFFFFFF, 0) +#define PFPE_AEQALLOC 0x00502D00 /* Reset Source: PFR */ +#define PFPE_AEQALLOC_AECOUNT_S 0 +#define PFPE_AEQALLOC_AECOUNT_M MAKEMASK(0xFFFFFFFF, 0) +#define PFPE_CCQPHIGH 0x0050A100 /* Reset Source: PFR */ +#define PFPE_CCQPHIGH_PECCQPHIGH_S 0 +#define PFPE_CCQPHIGH_PECCQPHIGH_M MAKEMASK(0xFFFFFFFF, 0) +#define PFPE_CCQPLOW 0x0050A080 /* Reset Source: PFR */ +#define PFPE_CCQPLOW_PECCQPLOW_S 0 +#define PFPE_CCQPLOW_PECCQPLOW_M MAKEMASK(0xFFFFFFFF, 0) +#define PFPE_CCQPSTATUS 0x0050A000 /* Reset Source: PFR */ +#define PFPE_CCQPSTATUS_CCQP_DONE_S 0 +#define PFPE_CCQPSTATUS_CCQP_DONE_M BIT(0) +#define PFPE_CCQPSTATUS_HMC_PROFILE_S 4 +#define PFPE_CCQPSTATUS_HMC_PROFILE_M MAKEMASK(0x7, 4) +#define PFPE_CCQPSTATUS_RDMA_EN_VFS_S 16 +#define PFPE_CCQPSTATUS_RDMA_EN_VFS_M MAKEMASK(0x3F, 16) +#define PFPE_CCQPSTATUS_CCQP_ERR_S 31 +#define PFPE_CCQPSTATUS_CCQP_ERR_M BIT(31) +#define PFPE_CQACK 0x00502C80 /* Reset Source: PFR */ +#define PFPE_CQACK_PECQID_S 0 +#define PFPE_CQACK_PECQID_M MAKEMASK(0x7FFFF, 0) +#define PFPE_CQARM 0x00502C00 /* Reset Source: PFR */ +#define PFPE_CQARM_PECQID_S 0 +#define PFPE_CQARM_PECQID_M MAKEMASK(0x7FFFF, 0) +#define PFPE_CQPDB 0x00500800 /* Reset Source: PFR */ +#define PFPE_CQPDB_WQHEAD_S 0 +#define PFPE_CQPDB_WQHEAD_M MAKEMASK(0x7FF, 0) +#define PFPE_CQPERRCODES 0x0050A200 /* Reset Source: PFR */ +#define PFPE_CQPERRCODES_CQP_MINOR_CODE_S 0 +#define PFPE_CQPERRCODES_CQP_MINOR_CODE_M MAKEMASK(0xFFFF, 0) +#define PFPE_CQPERRCODES_CQP_MAJOR_CODE_S 16 +#define PFPE_CQPERRCODES_CQP_MAJOR_CODE_M MAKEMASK(0xFFFF, 16) +#define PFPE_CQPTAIL 0x00500880 /* Reset Source: PFR */ +#define PFPE_CQPTAIL_WQTAIL_S 0 +#define PFPE_CQPTAIL_WQTAIL_M MAKEMASK(0x7FF, 0) +#define PFPE_CQPTAIL_CQP_OP_ERR_S 31 +#define PFPE_CQPTAIL_CQP_OP_ERR_M BIT(31) +#define PFPE_IPCONFIG0 0x0050A180 /* Reset Source: PFR */ +#define PFPE_IPCONFIG0_PEIPID_S 0 +#define PFPE_IPCONFIG0_PEIPID_M MAKEMASK(0xFFFF, 0) +#define PFPE_IPCONFIG0_USEENTIREIDRANGE_S 16 +#define PFPE_IPCONFIG0_USEENTIREIDRANGE_M BIT(16) +#define PFPE_IPCONFIG0_UDP_SRC_PORT_MASK_EN_S 17 +#define PFPE_IPCONFIG0_UDP_SRC_PORT_MASK_EN_M BIT(17) +#define PFPE_MRTEIDXMASK 0x0050A300 /* Reset Source: PFR */ +#define PFPE_MRTEIDXMASK_MRTEIDXMASKBITS_S 0 +#define PFPE_MRTEIDXMASK_MRTEIDXMASKBITS_M MAKEMASK(0x1F, 0) +#define PFPE_RCVUNEXPECTEDERROR 0x0050A380 /* Reset Source: PFR */ +#define PFPE_RCVUNEXPECTEDERROR_TCP_RX_UNEXP_ERR_S 0 +#define PFPE_RCVUNEXPECTEDERROR_TCP_RX_UNEXP_ERR_M MAKEMASK(0xFFFFFF, 0) +#define PFPE_TCPNOWTIMER 0x0050A280 /* Reset Source: PFR */ +#define PFPE_TCPNOWTIMER_TCP_NOW_S 0 +#define PFPE_TCPNOWTIMER_TCP_NOW_M MAKEMASK(0xFFFFFFFF, 0) +#define PFPE_WQEALLOC 0x00504400 /* Reset Source: PFR */ +#define PFPE_WQEALLOC_PEQPID_S 0 +#define PFPE_WQEALLOC_PEQPID_M MAKEMASK(0x3FFFF, 0) +#define PFPE_WQEALLOC_WQE_DESC_INDEX_S 20 +#define PFPE_WQEALLOC_WQE_DESC_INDEX_M MAKEMASK(0xFFF, 20) +#define PRT_PEPM_COUNT(_i) (0x0050C040 + ((_i) * 4)) /* _i=0...511 */ /* Reset Source: PERST */ +#define PRT_PEPM_COUNT_MAX_INDEX 511 +#define PRT_PEPM_COUNT_PEPM_PSQ_COUNT_S 0 +#define PRT_PEPM_COUNT_PEPM_PSQ_COUNT_M MAKEMASK(0x1F, 0) +#define PRT_PEPM_COUNT_PEPM_MDQ_COUNT_S 16 +#define PRT_PEPM_COUNT_PEPM_MDQ_COUNT_M MAKEMASK(0x3FFF, 16) +#define VFPE_AEQALLOC(_VF) (0x00502800 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: PFR */ +#define VFPE_AEQALLOC_MAX_INDEX 255 +#define VFPE_AEQALLOC_AECOUNT_S 0 +#define VFPE_AEQALLOC_AECOUNT_M MAKEMASK(0xFFFFFFFF, 0) +#define VFPE_CCQPHIGH(_VF) (0x00508800 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: PFR */ +#define VFPE_CCQPHIGH_MAX_INDEX 255 +#define VFPE_CCQPHIGH_PECCQPHIGH_S 0 +#define VFPE_CCQPHIGH_PECCQPHIGH_M MAKEMASK(0xFFFFFFFF, 0) +#define VFPE_CCQPLOW(_VF) (0x00508400 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: PFR */ +#define VFPE_CCQPLOW_MAX_INDEX 255 +#define VFPE_CCQPLOW_PECCQPLOW_S 0 +#define VFPE_CCQPLOW_PECCQPLOW_M MAKEMASK(0xFFFFFFFF, 0) +#define VFPE_CCQPSTATUS(_VF) (0x00508000 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: PFR */ +#define VFPE_CCQPSTATUS_MAX_INDEX 255 +#define VFPE_CCQPSTATUS_CCQP_DONE_S 0 +#define VFPE_CCQPSTATUS_CCQP_DONE_M BIT(0) +#define VFPE_CCQPSTATUS_HMC_PROFILE_S 4 +#define VFPE_CCQPSTATUS_HMC_PROFILE_M MAKEMASK(0x7, 4) +#define VFPE_CCQPSTATUS_RDMA_EN_VFS_S 16 +#define VFPE_CCQPSTATUS_RDMA_EN_VFS_M MAKEMASK(0x3F, 16) +#define VFPE_CCQPSTATUS_CCQP_ERR_S 31 +#define VFPE_CCQPSTATUS_CCQP_ERR_M BIT(31) +#define VFPE_CQACK(_VF) (0x00502400 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: PFR */ +#define VFPE_CQACK_MAX_INDEX 255 +#define VFPE_CQACK_PECQID_S 0 +#define VFPE_CQACK_PECQID_M MAKEMASK(0x7FFFF, 0) +#define VFPE_CQARM(_VF) (0x00502000 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: PFR */ +#define VFPE_CQARM_MAX_INDEX 255 +#define VFPE_CQARM_PECQID_S 0 +#define VFPE_CQARM_PECQID_M MAKEMASK(0x7FFFF, 0) +#define VFPE_CQPDB(_VF) (0x00500000 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: PFR */ +#define VFPE_CQPDB_MAX_INDEX 255 +#define VFPE_CQPDB_WQHEAD_S 0 +#define VFPE_CQPDB_WQHEAD_M MAKEMASK(0x7FF, 0) +#define VFPE_CQPERRCODES(_VF) (0x00509000 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: PFR */ +#define VFPE_CQPERRCODES_MAX_INDEX 255 +#define VFPE_CQPERRCODES_CQP_MINOR_CODE_S 0 +#define VFPE_CQPERRCODES_CQP_MINOR_CODE_M MAKEMASK(0xFFFF, 0) +#define VFPE_CQPERRCODES_CQP_MAJOR_CODE_S 16 +#define VFPE_CQPERRCODES_CQP_MAJOR_CODE_M MAKEMASK(0xFFFF, 16) +#define VFPE_CQPTAIL(_VF) (0x00500400 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: PFR */ +#define VFPE_CQPTAIL_MAX_INDEX 255 +#define VFPE_CQPTAIL_WQTAIL_S 0 +#define VFPE_CQPTAIL_WQTAIL_M MAKEMASK(0x7FF, 0) +#define VFPE_CQPTAIL_CQP_OP_ERR_S 31 +#define VFPE_CQPTAIL_CQP_OP_ERR_M BIT(31) +#define VFPE_IPCONFIG0(_VF) (0x00508C00 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: PFR */ +#define VFPE_IPCONFIG0_MAX_INDEX 255 +#define VFPE_IPCONFIG0_PEIPID_S 0 +#define VFPE_IPCONFIG0_PEIPID_M MAKEMASK(0xFFFF, 0) +#define VFPE_IPCONFIG0_USEENTIREIDRANGE_S 16 +#define VFPE_IPCONFIG0_USEENTIREIDRANGE_M BIT(16) +#define VFPE_IPCONFIG0_UDP_SRC_PORT_MASK_EN_S 17 +#define VFPE_IPCONFIG0_UDP_SRC_PORT_MASK_EN_M BIT(17) +#define VFPE_RCVUNEXPECTEDERROR(_VF) (0x00509C00 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: PFR */ +#define VFPE_RCVUNEXPECTEDERROR_MAX_INDEX 255 +#define VFPE_RCVUNEXPECTEDERROR_TCP_RX_UNEXP_ERR_S 0 +#define VFPE_RCVUNEXPECTEDERROR_TCP_RX_UNEXP_ERR_M MAKEMASK(0xFFFFFF, 0) +#define VFPE_TCPNOWTIMER(_VF) (0x00509400 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: PFR */ +#define VFPE_TCPNOWTIMER_MAX_INDEX 255 +#define VFPE_TCPNOWTIMER_TCP_NOW_S 0 +#define VFPE_TCPNOWTIMER_TCP_NOW_M MAKEMASK(0xFFFFFFFF, 0) +#define VFPE_WQEALLOC(_VF) (0x00504000 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: PFR */ +#define VFPE_WQEALLOC_MAX_INDEX 255 +#define VFPE_WQEALLOC_PEQPID_S 0 +#define VFPE_WQEALLOC_PEQPID_M MAKEMASK(0x3FFFF, 0) +#define VFPE_WQEALLOC_WQE_DESC_INDEX_S 20 +#define VFPE_WQEALLOC_WQE_DESC_INDEX_M MAKEMASK(0xFFF, 20) +#define GLPES_PFIP4RXDISCARD(_i) (0x00541400 + ((_i) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4RXDISCARD_MAX_INDEX 127 +#define GLPES_PFIP4RXDISCARD_IP4RXDISCARD_S 0 +#define GLPES_PFIP4RXDISCARD_IP4RXDISCARD_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP4RXFRAGSHI(_i) (0x00541C04 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4RXFRAGSHI_MAX_INDEX 127 +#define GLPES_PFIP4RXFRAGSHI_IP4RXFRAGSHI_S 0 +#define GLPES_PFIP4RXFRAGSHI_IP4RXFRAGSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFIP4RXFRAGSLO(_i) (0x00541C00 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4RXFRAGSLO_MAX_INDEX 127 +#define GLPES_PFIP4RXFRAGSLO_IP4RXFRAGSLO_S 0 +#define GLPES_PFIP4RXFRAGSLO_IP4RXFRAGSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP4RXMCOCTSHI(_i) (0x00542404 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4RXMCOCTSHI_MAX_INDEX 127 +#define GLPES_PFIP4RXMCOCTSHI_IP4RXMCOCTSHI_S 0 +#define GLPES_PFIP4RXMCOCTSHI_IP4RXMCOCTSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFIP4RXMCOCTSLO(_i) (0x00542400 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4RXMCOCTSLO_MAX_INDEX 127 +#define GLPES_PFIP4RXMCOCTSLO_IP4RXMCOCTSLO_S 0 +#define GLPES_PFIP4RXMCOCTSLO_IP4RXMCOCTSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP4RXMCPKTSHI(_i) (0x00542C04 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4RXMCPKTSHI_MAX_INDEX 127 +#define GLPES_PFIP4RXMCPKTSHI_IP4RXMCPKTSHI_S 0 +#define GLPES_PFIP4RXMCPKTSHI_IP4RXMCPKTSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFIP4RXMCPKTSLO(_i) (0x00542C00 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4RXMCPKTSLO_MAX_INDEX 127 +#define GLPES_PFIP4RXMCPKTSLO_IP4RXMCPKTSLO_S 0 +#define GLPES_PFIP4RXMCPKTSLO_IP4RXMCPKTSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP4RXOCTSHI(_i) (0x00540404 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4RXOCTSHI_MAX_INDEX 127 +#define GLPES_PFIP4RXOCTSHI_IP4RXOCTSHI_S 0 +#define GLPES_PFIP4RXOCTSHI_IP4RXOCTSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFIP4RXOCTSLO(_i) (0x00540400 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4RXOCTSLO_MAX_INDEX 127 +#define GLPES_PFIP4RXOCTSLO_IP4RXOCTSLO_S 0 +#define GLPES_PFIP4RXOCTSLO_IP4RXOCTSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP4RXPKTSHI(_i) (0x00540C04 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4RXPKTSHI_MAX_INDEX 127 +#define GLPES_PFIP4RXPKTSHI_IP4RXPKTSHI_S 0 +#define GLPES_PFIP4RXPKTSHI_IP4RXPKTSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFIP4RXPKTSLO(_i) (0x00540C00 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4RXPKTSLO_MAX_INDEX 127 +#define GLPES_PFIP4RXPKTSLO_IP4RXPKTSLO_S 0 +#define GLPES_PFIP4RXPKTSLO_IP4RXPKTSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP4RXTRUNC(_i) (0x00541800 + ((_i) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4RXTRUNC_MAX_INDEX 127 +#define GLPES_PFIP4RXTRUNC_IP4RXTRUNC_S 0 +#define GLPES_PFIP4RXTRUNC_IP4RXTRUNC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP4TXFRAGSHI(_i) (0x00547404 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4TXFRAGSHI_MAX_INDEX 127 +#define GLPES_PFIP4TXFRAGSHI_IP4TXFRAGSHI_S 0 +#define GLPES_PFIP4TXFRAGSHI_IP4TXFRAGSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFIP4TXFRAGSLO(_i) (0x00547400 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4TXFRAGSLO_MAX_INDEX 127 +#define GLPES_PFIP4TXFRAGSLO_IP4TXFRAGSLO_S 0 +#define GLPES_PFIP4TXFRAGSLO_IP4TXFRAGSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP4TXMCOCTSHI(_i) (0x00547C04 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4TXMCOCTSHI_MAX_INDEX 127 +#define GLPES_PFIP4TXMCOCTSHI_IP4TXMCOCTSHI_S 0 +#define GLPES_PFIP4TXMCOCTSHI_IP4TXMCOCTSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFIP4TXMCOCTSLO(_i) (0x00547C00 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4TXMCOCTSLO_MAX_INDEX 127 +#define GLPES_PFIP4TXMCOCTSLO_IP4TXMCOCTSLO_S 0 +#define GLPES_PFIP4TXMCOCTSLO_IP4TXMCOCTSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP4TXMCPKTSHI(_i) (0x00548404 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4TXMCPKTSHI_MAX_INDEX 127 +#define GLPES_PFIP4TXMCPKTSHI_IP4TXMCPKTSHI_S 0 +#define GLPES_PFIP4TXMCPKTSHI_IP4TXMCPKTSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFIP4TXMCPKTSLO(_i) (0x00548400 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4TXMCPKTSLO_MAX_INDEX 127 +#define GLPES_PFIP4TXMCPKTSLO_IP4TXMCPKTSLO_S 0 +#define GLPES_PFIP4TXMCPKTSLO_IP4TXMCPKTSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP4TXNOROUTE(_i) (0x0054B400 + ((_i) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4TXNOROUTE_MAX_INDEX 127 +#define GLPES_PFIP4TXNOROUTE_IP4TXNOROUTE_S 0 +#define GLPES_PFIP4TXNOROUTE_IP4TXNOROUTE_M MAKEMASK(0xFFFFFF, 0) +#define GLPES_PFIP4TXOCTSHI(_i) (0x00546404 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4TXOCTSHI_MAX_INDEX 127 +#define GLPES_PFIP4TXOCTSHI_IP4TXOCTSHI_S 0 +#define GLPES_PFIP4TXOCTSHI_IP4TXOCTSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFIP4TXOCTSLO(_i) (0x00546400 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4TXOCTSLO_MAX_INDEX 127 +#define GLPES_PFIP4TXOCTSLO_IP4TXOCTSLO_S 0 +#define GLPES_PFIP4TXOCTSLO_IP4TXOCTSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP4TXPKTSHI(_i) (0x00546C04 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4TXPKTSHI_MAX_INDEX 127 +#define GLPES_PFIP4TXPKTSHI_IP4TXPKTSHI_S 0 +#define GLPES_PFIP4TXPKTSHI_IP4TXPKTSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFIP4TXPKTSLO(_i) (0x00546C00 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP4TXPKTSLO_MAX_INDEX 127 +#define GLPES_PFIP4TXPKTSLO_IP4TXPKTSLO_S 0 +#define GLPES_PFIP4TXPKTSLO_IP4TXPKTSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP6RXDISCARD(_i) (0x00544400 + ((_i) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6RXDISCARD_MAX_INDEX 127 +#define GLPES_PFIP6RXDISCARD_IP6RXDISCARD_S 0 +#define GLPES_PFIP6RXDISCARD_IP6RXDISCARD_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP6RXFRAGSHI(_i) (0x00544C04 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6RXFRAGSHI_MAX_INDEX 127 +#define GLPES_PFIP6RXFRAGSHI_IP6RXFRAGSHI_S 0 +#define GLPES_PFIP6RXFRAGSHI_IP6RXFRAGSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFIP6RXFRAGSLO(_i) (0x00544C00 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6RXFRAGSLO_MAX_INDEX 127 +#define GLPES_PFIP6RXFRAGSLO_IP6RXFRAGSLO_S 0 +#define GLPES_PFIP6RXFRAGSLO_IP6RXFRAGSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP6RXMCOCTSHI(_i) (0x00545404 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6RXMCOCTSHI_MAX_INDEX 127 +#define GLPES_PFIP6RXMCOCTSHI_IP6RXMCOCTSHI_S 0 +#define GLPES_PFIP6RXMCOCTSHI_IP6RXMCOCTSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFIP6RXMCOCTSLO(_i) (0x00545400 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6RXMCOCTSLO_MAX_INDEX 127 +#define GLPES_PFIP6RXMCOCTSLO_IP6RXMCOCTSLO_S 0 +#define GLPES_PFIP6RXMCOCTSLO_IP6RXMCOCTSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP6RXMCPKTSHI(_i) (0x00545C04 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6RXMCPKTSHI_MAX_INDEX 127 +#define GLPES_PFIP6RXMCPKTSHI_IP6RXMCPKTSHI_S 0 +#define GLPES_PFIP6RXMCPKTSHI_IP6RXMCPKTSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFIP6RXMCPKTSLO(_i) (0x00545C00 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6RXMCPKTSLO_MAX_INDEX 127 +#define GLPES_PFIP6RXMCPKTSLO_IP6RXMCPKTSLO_S 0 +#define GLPES_PFIP6RXMCPKTSLO_IP6RXMCPKTSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP6RXOCTSHI(_i) (0x00543404 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6RXOCTSHI_MAX_INDEX 127 +#define GLPES_PFIP6RXOCTSHI_IP6RXOCTSHI_S 0 +#define GLPES_PFIP6RXOCTSHI_IP6RXOCTSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFIP6RXOCTSLO(_i) (0x00543400 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6RXOCTSLO_MAX_INDEX 127 +#define GLPES_PFIP6RXOCTSLO_IP6RXOCTSLO_S 0 +#define GLPES_PFIP6RXOCTSLO_IP6RXOCTSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP6RXPKTSHI(_i) (0x00543C04 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6RXPKTSHI_MAX_INDEX 127 +#define GLPES_PFIP6RXPKTSHI_IP6RXPKTSHI_S 0 +#define GLPES_PFIP6RXPKTSHI_IP6RXPKTSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFIP6RXPKTSLO(_i) (0x00543C00 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6RXPKTSLO_MAX_INDEX 127 +#define GLPES_PFIP6RXPKTSLO_IP6RXPKTSLO_S 0 +#define GLPES_PFIP6RXPKTSLO_IP6RXPKTSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP6RXTRUNC(_i) (0x00544800 + ((_i) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6RXTRUNC_MAX_INDEX 127 +#define GLPES_PFIP6RXTRUNC_IP6RXTRUNC_S 0 +#define GLPES_PFIP6RXTRUNC_IP6RXTRUNC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP6TXFRAGSHI(_i) (0x00549C04 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6TXFRAGSHI_MAX_INDEX 127 +#define GLPES_PFIP6TXFRAGSHI_IP6TXFRAGSHI_S 0 +#define GLPES_PFIP6TXFRAGSHI_IP6TXFRAGSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFIP6TXFRAGSLO(_i) (0x00549C00 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6TXFRAGSLO_MAX_INDEX 127 +#define GLPES_PFIP6TXFRAGSLO_IP6TXFRAGSLO_S 0 +#define GLPES_PFIP6TXFRAGSLO_IP6TXFRAGSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP6TXMCOCTSHI(_i) (0x0054A404 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6TXMCOCTSHI_MAX_INDEX 127 +#define GLPES_PFIP6TXMCOCTSHI_IP6TXMCOCTSHI_S 0 +#define GLPES_PFIP6TXMCOCTSHI_IP6TXMCOCTSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFIP6TXMCOCTSLO(_i) (0x0054A400 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6TXMCOCTSLO_MAX_INDEX 127 +#define GLPES_PFIP6TXMCOCTSLO_IP6TXMCOCTSLO_S 0 +#define GLPES_PFIP6TXMCOCTSLO_IP6TXMCOCTSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP6TXMCPKTSHI(_i) (0x0054AC04 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6TXMCPKTSHI_MAX_INDEX 127 +#define GLPES_PFIP6TXMCPKTSHI_IP6TXMCPKTSHI_S 0 +#define GLPES_PFIP6TXMCPKTSHI_IP6TXMCPKTSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFIP6TXMCPKTSLO(_i) (0x0054AC00 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6TXMCPKTSLO_MAX_INDEX 127 +#define GLPES_PFIP6TXMCPKTSLO_IP6TXMCPKTSLO_S 0 +#define GLPES_PFIP6TXMCPKTSLO_IP6TXMCPKTSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP6TXNOROUTE(_i) (0x0054B800 + ((_i) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6TXNOROUTE_MAX_INDEX 127 +#define GLPES_PFIP6TXNOROUTE_IP6TXNOROUTE_S 0 +#define GLPES_PFIP6TXNOROUTE_IP6TXNOROUTE_M MAKEMASK(0xFFFFFF, 0) +#define GLPES_PFIP6TXOCTSHI(_i) (0x00548C04 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6TXOCTSHI_MAX_INDEX 127 +#define GLPES_PFIP6TXOCTSHI_IP6TXOCTSHI_S 0 +#define GLPES_PFIP6TXOCTSHI_IP6TXOCTSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFIP6TXOCTSLO(_i) (0x00548C00 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6TXOCTSLO_MAX_INDEX 127 +#define GLPES_PFIP6TXOCTSLO_IP6TXOCTSLO_S 0 +#define GLPES_PFIP6TXOCTSLO_IP6TXOCTSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFIP6TXPKTSHI(_i) (0x00549404 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6TXPKTSHI_MAX_INDEX 127 +#define GLPES_PFIP6TXPKTSHI_IP6TXPKTSHI_S 0 +#define GLPES_PFIP6TXPKTSHI_IP6TXPKTSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFIP6TXPKTSLO(_i) (0x00549400 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFIP6TXPKTSLO_MAX_INDEX 127 +#define GLPES_PFIP6TXPKTSLO_IP6TXPKTSLO_S 0 +#define GLPES_PFIP6TXPKTSLO_IP6TXPKTSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFRDMARXRDSHI(_i) (0x0054EC04 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFRDMARXRDSHI_MAX_INDEX 127 +#define GLPES_PFRDMARXRDSHI_RDMARXRDSHI_S 0 +#define GLPES_PFRDMARXRDSHI_RDMARXRDSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFRDMARXRDSLO(_i) (0x0054EC00 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFRDMARXRDSLO_MAX_INDEX 127 +#define GLPES_PFRDMARXRDSLO_RDMARXRDSLO_S 0 +#define GLPES_PFRDMARXRDSLO_RDMARXRDSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFRDMARXSNDSHI(_i) (0x0054F404 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFRDMARXSNDSHI_MAX_INDEX 127 +#define GLPES_PFRDMARXSNDSHI_RDMARXSNDSHI_S 0 +#define GLPES_PFRDMARXSNDSHI_RDMARXSNDSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFRDMARXSNDSLO(_i) (0x0054F400 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFRDMARXSNDSLO_MAX_INDEX 127 +#define GLPES_PFRDMARXSNDSLO_RDMARXSNDSLO_S 0 +#define GLPES_PFRDMARXSNDSLO_RDMARXSNDSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFRDMARXWRSHI(_i) (0x0054E404 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFRDMARXWRSHI_MAX_INDEX 127 +#define GLPES_PFRDMARXWRSHI_RDMARXWRSHI_S 0 +#define GLPES_PFRDMARXWRSHI_RDMARXWRSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFRDMARXWRSLO(_i) (0x0054E400 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFRDMARXWRSLO_MAX_INDEX 127 +#define GLPES_PFRDMARXWRSLO_RDMARXWRSLO_S 0 +#define GLPES_PFRDMARXWRSLO_RDMARXWRSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFRDMATXRDSHI(_i) (0x00550404 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFRDMATXRDSHI_MAX_INDEX 127 +#define GLPES_PFRDMATXRDSHI_RDMARXRDSHI_S 0 +#define GLPES_PFRDMATXRDSHI_RDMARXRDSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFRDMATXRDSLO(_i) (0x00550400 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFRDMATXRDSLO_MAX_INDEX 127 +#define GLPES_PFRDMATXRDSLO_RDMARXRDSLO_S 0 +#define GLPES_PFRDMATXRDSLO_RDMARXRDSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFRDMATXSNDSHI(_i) (0x00550C04 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFRDMATXSNDSHI_MAX_INDEX 127 +#define GLPES_PFRDMATXSNDSHI_RDMARXSNDSHI_S 0 +#define GLPES_PFRDMATXSNDSHI_RDMARXSNDSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFRDMATXSNDSLO(_i) (0x00550C00 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFRDMATXSNDSLO_MAX_INDEX 127 +#define GLPES_PFRDMATXSNDSLO_RDMARXSNDSLO_S 0 +#define GLPES_PFRDMATXSNDSLO_RDMARXSNDSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFRDMATXWRSHI(_i) (0x0054FC04 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFRDMATXWRSHI_MAX_INDEX 127 +#define GLPES_PFRDMATXWRSHI_RDMARXWRSHI_S 0 +#define GLPES_PFRDMATXWRSHI_RDMARXWRSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFRDMATXWRSLO(_i) (0x0054FC00 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFRDMATXWRSLO_MAX_INDEX 127 +#define GLPES_PFRDMATXWRSLO_RDMARXWRSLO_S 0 +#define GLPES_PFRDMATXWRSLO_RDMARXWRSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFRDMAVBNDHI(_i) (0x00551404 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFRDMAVBNDHI_MAX_INDEX 127 +#define GLPES_PFRDMAVBNDHI_RDMAVBNDHI_S 0 +#define GLPES_PFRDMAVBNDHI_RDMAVBNDHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFRDMAVBNDLO(_i) (0x00551400 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFRDMAVBNDLO_MAX_INDEX 127 +#define GLPES_PFRDMAVBNDLO_RDMAVBNDLO_S 0 +#define GLPES_PFRDMAVBNDLO_RDMAVBNDLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFRDMAVINVHI(_i) (0x00551C04 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFRDMAVINVHI_MAX_INDEX 127 +#define GLPES_PFRDMAVINVHI_RDMAVINVHI_S 0 +#define GLPES_PFRDMAVINVHI_RDMAVINVHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFRDMAVINVLO(_i) (0x00551C00 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFRDMAVINVLO_MAX_INDEX 127 +#define GLPES_PFRDMAVINVLO_RDMAVINVLO_S 0 +#define GLPES_PFRDMAVINVLO_RDMAVINVLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFRXVLANERR(_i) (0x00540000 + ((_i) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFRXVLANERR_MAX_INDEX 127 +#define GLPES_PFRXVLANERR_RXVLANERR_S 0 +#define GLPES_PFRXVLANERR_RXVLANERR_M MAKEMASK(0xFFFFFF, 0) +#define GLPES_PFTCPRTXSEG(_i) (0x00552400 + ((_i) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFTCPRTXSEG_MAX_INDEX 127 +#define GLPES_PFTCPRTXSEG_TCPRTXSEG_S 0 +#define GLPES_PFTCPRTXSEG_TCPRTXSEG_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFTCPRXOPTERR(_i) (0x0054C400 + ((_i) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFTCPRXOPTERR_MAX_INDEX 127 +#define GLPES_PFTCPRXOPTERR_TCPRXOPTERR_S 0 +#define GLPES_PFTCPRXOPTERR_TCPRXOPTERR_M MAKEMASK(0xFFFFFF, 0) +#define GLPES_PFTCPRXPROTOERR(_i) (0x0054C800 + ((_i) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFTCPRXPROTOERR_MAX_INDEX 127 +#define GLPES_PFTCPRXPROTOERR_TCPRXPROTOERR_S 0 +#define GLPES_PFTCPRXPROTOERR_TCPRXPROTOERR_M MAKEMASK(0xFFFFFF, 0) +#define GLPES_PFTCPRXSEGSHI(_i) (0x0054BC04 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFTCPRXSEGSHI_MAX_INDEX 127 +#define GLPES_PFTCPRXSEGSHI_TCPRXSEGSHI_S 0 +#define GLPES_PFTCPRXSEGSHI_TCPRXSEGSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFTCPRXSEGSLO(_i) (0x0054BC00 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFTCPRXSEGSLO_MAX_INDEX 127 +#define GLPES_PFTCPRXSEGSLO_TCPRXSEGSLO_S 0 +#define GLPES_PFTCPRXSEGSLO_TCPRXSEGSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFTCPTXSEGHI(_i) (0x0054CC04 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFTCPTXSEGHI_MAX_INDEX 127 +#define GLPES_PFTCPTXSEGHI_TCPTXSEGHI_S 0 +#define GLPES_PFTCPTXSEGHI_TCPTXSEGHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFTCPTXSEGLO(_i) (0x0054CC00 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFTCPTXSEGLO_MAX_INDEX 127 +#define GLPES_PFTCPTXSEGLO_TCPTXSEGLO_S 0 +#define GLPES_PFTCPTXSEGLO_TCPTXSEGLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFUDPRXPKTSHI(_i) (0x0054D404 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFUDPRXPKTSHI_MAX_INDEX 127 +#define GLPES_PFUDPRXPKTSHI_UDPRXPKTSHI_S 0 +#define GLPES_PFUDPRXPKTSHI_UDPRXPKTSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFUDPRXPKTSLO(_i) (0x0054D400 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFUDPRXPKTSLO_MAX_INDEX 127 +#define GLPES_PFUDPRXPKTSLO_UDPRXPKTSLO_S 0 +#define GLPES_PFUDPRXPKTSLO_UDPRXPKTSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_PFUDPTXPKTSHI(_i) (0x0054DC04 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFUDPTXPKTSHI_MAX_INDEX 127 +#define GLPES_PFUDPTXPKTSHI_UDPTXPKTSHI_S 0 +#define GLPES_PFUDPTXPKTSHI_UDPTXPKTSHI_M MAKEMASK(0xFFFF, 0) +#define GLPES_PFUDPTXPKTSLO(_i) (0x0054DC00 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLPES_PFUDPTXPKTSLO_MAX_INDEX 127 +#define GLPES_PFUDPTXPKTSLO_UDPTXPKTSLO_S 0 +#define GLPES_PFUDPTXPKTSLO_UDPTXPKTSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_RDMARXMULTFPDUSHI 0x0055E00C /* Reset Source: CORER */ +#define GLPES_RDMARXMULTFPDUSHI_RDMARXMULTFPDUSHI_S 0 +#define GLPES_RDMARXMULTFPDUSHI_RDMARXMULTFPDUSHI_M MAKEMASK(0xFFFFFF, 0) +#define GLPES_RDMARXMULTFPDUSLO 0x0055E008 /* Reset Source: CORER */ +#define GLPES_RDMARXMULTFPDUSLO_RDMARXMULTFPDUSLO_S 0 +#define GLPES_RDMARXMULTFPDUSLO_RDMARXMULTFPDUSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_RDMARXOOODDPHI 0x0055E014 /* Reset Source: CORER */ +#define GLPES_RDMARXOOODDPHI_RDMARXOOODDPHI_S 0 +#define GLPES_RDMARXOOODDPHI_RDMARXOOODDPHI_M MAKEMASK(0xFFFFFF, 0) +#define GLPES_RDMARXOOODDPLO 0x0055E010 /* Reset Source: CORER */ +#define GLPES_RDMARXOOODDPLO_RDMARXOOODDPLO_S 0 +#define GLPES_RDMARXOOODDPLO_RDMARXOOODDPLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_RDMARXOOONOMARK 0x0055E004 /* Reset Source: CORER */ +#define GLPES_RDMARXOOONOMARK_RDMAOOONOMARK_S 0 +#define GLPES_RDMARXOOONOMARK_RDMAOOONOMARK_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_RDMARXUNALIGN 0x0055E000 /* Reset Source: CORER */ +#define GLPES_RDMARXUNALIGN_RDMRXAUNALIGN_S 0 +#define GLPES_RDMARXUNALIGN_RDMRXAUNALIGN_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_TCPRXFOURHOLEHI 0x0055E03C /* Reset Source: CORER */ +#define GLPES_TCPRXFOURHOLEHI_TCPRXFOURHOLEHI_S 0 +#define GLPES_TCPRXFOURHOLEHI_TCPRXFOURHOLEHI_M MAKEMASK(0xFFFFFF, 0) +#define GLPES_TCPRXFOURHOLELO 0x0055E038 /* Reset Source: CORER */ +#define GLPES_TCPRXFOURHOLELO_TCPRXFOURHOLELO_S 0 +#define GLPES_TCPRXFOURHOLELO_TCPRXFOURHOLELO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_TCPRXONEHOLEHI 0x0055E024 /* Reset Source: CORER */ +#define GLPES_TCPRXONEHOLEHI_TCPRXONEHOLEHI_S 0 +#define GLPES_TCPRXONEHOLEHI_TCPRXONEHOLEHI_M MAKEMASK(0xFFFFFF, 0) +#define GLPES_TCPRXONEHOLELO 0x0055E020 /* Reset Source: CORER */ +#define GLPES_TCPRXONEHOLELO_TCPRXONEHOLELO_S 0 +#define GLPES_TCPRXONEHOLELO_TCPRXONEHOLELO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_TCPRXPUREACKHI 0x0055E01C /* Reset Source: CORER */ +#define GLPES_TCPRXPUREACKHI_TCPRXPUREACKSHI_S 0 +#define GLPES_TCPRXPUREACKHI_TCPRXPUREACKSHI_M MAKEMASK(0xFFFFFF, 0) +#define GLPES_TCPRXPUREACKSLO 0x0055E018 /* Reset Source: CORER */ +#define GLPES_TCPRXPUREACKSLO_TCPRXPUREACKLO_S 0 +#define GLPES_TCPRXPUREACKSLO_TCPRXPUREACKLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_TCPRXTHREEHOLEHI 0x0055E034 /* Reset Source: CORER */ +#define GLPES_TCPRXTHREEHOLEHI_TCPRXTHREEHOLEHI_S 0 +#define GLPES_TCPRXTHREEHOLEHI_TCPRXTHREEHOLEHI_M MAKEMASK(0xFFFFFF, 0) +#define GLPES_TCPRXTHREEHOLELO 0x0055E030 /* Reset Source: CORER */ +#define GLPES_TCPRXTHREEHOLELO_TCPRXTHREEHOLELO_S 0 +#define GLPES_TCPRXTHREEHOLELO_TCPRXTHREEHOLELO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_TCPRXTWOHOLEHI 0x0055E02C /* Reset Source: CORER */ +#define GLPES_TCPRXTWOHOLEHI_TCPRXTWOHOLEHI_S 0 +#define GLPES_TCPRXTWOHOLEHI_TCPRXTWOHOLEHI_M MAKEMASK(0xFFFFFF, 0) +#define GLPES_TCPRXTWOHOLELO 0x0055E028 /* Reset Source: CORER */ +#define GLPES_TCPRXTWOHOLELO_TCPRXTWOHOLELO_S 0 +#define GLPES_TCPRXTWOHOLELO_TCPRXTWOHOLELO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_TCPTXRETRANSFASTHI 0x0055E044 /* Reset Source: CORER */ +#define GLPES_TCPTXRETRANSFASTHI_TCPTXRETRANSFASTHI_S 0 +#define GLPES_TCPTXRETRANSFASTHI_TCPTXRETRANSFASTHI_M MAKEMASK(0xFFFFFF, 0) +#define GLPES_TCPTXRETRANSFASTLO 0x0055E040 /* Reset Source: CORER */ +#define GLPES_TCPTXRETRANSFASTLO_TCPTXRETRANSFASTLO_S 0 +#define GLPES_TCPTXRETRANSFASTLO_TCPTXRETRANSFASTLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_TCPTXTOUTSFASTHI 0x0055E04C /* Reset Source: CORER */ +#define GLPES_TCPTXTOUTSFASTHI_TCPTXTOUTSFASTHI_S 0 +#define GLPES_TCPTXTOUTSFASTHI_TCPTXTOUTSFASTHI_M MAKEMASK(0xFFFFFF, 0) +#define GLPES_TCPTXTOUTSFASTLO 0x0055E048 /* Reset Source: CORER */ +#define GLPES_TCPTXTOUTSFASTLO_TCPTXTOUTSFASTLO_S 0 +#define GLPES_TCPTXTOUTSFASTLO_TCPTXTOUTSFASTLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPES_TCPTXTOUTSHI 0x0055E054 /* Reset Source: CORER */ +#define GLPES_TCPTXTOUTSHI_TCPTXTOUTSHI_S 0 +#define GLPES_TCPTXTOUTSHI_TCPTXTOUTSHI_M MAKEMASK(0xFFFFFF, 0) +#define GLPES_TCPTXTOUTSLO 0x0055E050 /* Reset Source: CORER */ +#define GLPES_TCPTXTOUTSLO_TCPTXTOUTSLO_S 0 +#define GLPES_TCPTXTOUTSLO_TCPTXTOUTSLO_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_PWR_MODE_CTL 0x000B820C /* Reset Source: POR */ +#define GL_PWR_MODE_CTL_SWITCH_PWR_MODE_EN_S 0 +#define GL_PWR_MODE_CTL_SWITCH_PWR_MODE_EN_M BIT(0) +#define GL_PWR_MODE_CTL_NIC_PWR_MODE_EN_S 1 +#define GL_PWR_MODE_CTL_NIC_PWR_MODE_EN_M BIT(1) +#define GL_PWR_MODE_CTL_S5_PWR_MODE_EN_S 2 +#define GL_PWR_MODE_CTL_S5_PWR_MODE_EN_M BIT(2) +#define GL_PWR_MODE_CTL_CAR_MAX_SW_CONFIG_S 3 +#define GL_PWR_MODE_CTL_CAR_MAX_SW_CONFIG_M MAKEMASK(0x3, 3) +#define GL_PWR_MODE_CTL_CAR_MAX_BW_S 30 +#define GL_PWR_MODE_CTL_CAR_MAX_BW_M MAKEMASK(0x3, 30) +#define GL_PWR_MODE_DIVIDE_CTRL_H_DEFAULT 0x000B825C /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_CTRL_H_DEFAULT_DEFAULT_DIV_VAL_PECLK_S 0 +#define GL_PWR_MODE_DIVIDE_CTRL_H_DEFAULT_DEFAULT_DIV_VAL_PECLK_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_CTRL_H_DEFAULT_DEFAULT_DIV_VAL_UCLK_S 3 +#define GL_PWR_MODE_DIVIDE_CTRL_H_DEFAULT_DEFAULT_DIV_VAL_UCLK_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_CTRL_H_DEFAULT_DEFAULT_DIV_VAL_LCLK_S 6 +#define GL_PWR_MODE_DIVIDE_CTRL_H_DEFAULT_DEFAULT_DIV_VAL_LCLK_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_CTRL_H_DEFAULT_DEFAULT_DIV_VAL_PSM_S 9 +#define GL_PWR_MODE_DIVIDE_CTRL_H_DEFAULT_DEFAULT_DIV_VAL_PSM_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_CTRL_H_DEFAULT_DEFAULT_DIV_VAL_RXCTL_S 12 +#define GL_PWR_MODE_DIVIDE_CTRL_H_DEFAULT_DEFAULT_DIV_VAL_RXCTL_M MAKEMASK(0x7, 12) +#define GL_PWR_MODE_DIVIDE_CTRL_H_DEFAULT_DEFAULT_DIV_VAL_UANA_S 15 +#define GL_PWR_MODE_DIVIDE_CTRL_H_DEFAULT_DEFAULT_DIV_VAL_UANA_M MAKEMASK(0x7, 15) +#define GL_PWR_MODE_DIVIDE_CTRL_H_DEFAULT_DEFAULT_DIV_VAL_S5_S 18 +#define GL_PWR_MODE_DIVIDE_CTRL_H_DEFAULT_DEFAULT_DIV_VAL_S5_M MAKEMASK(0x7, 18) +#define GL_PWR_MODE_DIVIDE_CTRL_L_DEFAULT 0x000B8218 /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_CTRL_L_DEFAULT_DEFAULT_DIV_VAL_PECLK_S 0 +#define GL_PWR_MODE_DIVIDE_CTRL_L_DEFAULT_DEFAULT_DIV_VAL_PECLK_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_CTRL_L_DEFAULT_DEFAULT_DIV_VAL_UCLK_S 3 +#define GL_PWR_MODE_DIVIDE_CTRL_L_DEFAULT_DEFAULT_DIV_VAL_UCLK_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_CTRL_L_DEFAULT_DEFAULT_DIV_VAL_LCLK_S 6 +#define GL_PWR_MODE_DIVIDE_CTRL_L_DEFAULT_DEFAULT_DIV_VAL_LCLK_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_CTRL_L_DEFAULT_DEFAULT_DIV_VAL_PSM_S 9 +#define GL_PWR_MODE_DIVIDE_CTRL_L_DEFAULT_DEFAULT_DIV_VAL_PSM_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_CTRL_L_DEFAULT_DEFAULT_DIV_VAL_RXCTL_S 12 +#define GL_PWR_MODE_DIVIDE_CTRL_L_DEFAULT_DEFAULT_DIV_VAL_RXCTL_M MAKEMASK(0x7, 12) +#define GL_PWR_MODE_DIVIDE_CTRL_L_DEFAULT_DEFAULT_DIV_VAL_UANA_S 15 +#define GL_PWR_MODE_DIVIDE_CTRL_L_DEFAULT_DEFAULT_DIV_VAL_UANA_M MAKEMASK(0x7, 15) +#define GL_PWR_MODE_DIVIDE_CTRL_L_DEFAULT_DEFAULT_DIV_VAL_S5_S 18 +#define GL_PWR_MODE_DIVIDE_CTRL_L_DEFAULT_DEFAULT_DIV_VAL_S5_M MAKEMASK(0x7, 18) +#define GL_PWR_MODE_DIVIDE_CTRL_M_DEFAULT 0x000B8260 /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_CTRL_M_DEFAULT_DEFAULT_DIV_VAL_PECLK_S 0 +#define GL_PWR_MODE_DIVIDE_CTRL_M_DEFAULT_DEFAULT_DIV_VAL_PECLK_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_CTRL_M_DEFAULT_DEFAULT_DIV_VAL_UCLK_S 3 +#define GL_PWR_MODE_DIVIDE_CTRL_M_DEFAULT_DEFAULT_DIV_VAL_UCLK_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_CTRL_M_DEFAULT_DEFAULT_DIV_VAL_LCLK_S 6 +#define GL_PWR_MODE_DIVIDE_CTRL_M_DEFAULT_DEFAULT_DIV_VAL_LCLK_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_CTRL_M_DEFAULT_DEFAULT_DIV_VAL_PSM_S 9 +#define GL_PWR_MODE_DIVIDE_CTRL_M_DEFAULT_DEFAULT_DIV_VAL_PSM_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_CTRL_M_DEFAULT_DEFAULT_DIV_VAL_RXCTL_S 12 +#define GL_PWR_MODE_DIVIDE_CTRL_M_DEFAULT_DEFAULT_DIV_VAL_RXCTL_M MAKEMASK(0x7, 12) +#define GL_PWR_MODE_DIVIDE_CTRL_M_DEFAULT_DEFAULT_DIV_VAL_UANA_S 15 +#define GL_PWR_MODE_DIVIDE_CTRL_M_DEFAULT_DEFAULT_DIV_VAL_UANA_M MAKEMASK(0x7, 15) +#define GL_PWR_MODE_DIVIDE_CTRL_M_DEFAULT_DEFAULT_DIV_VAL_S5_S 18 +#define GL_PWR_MODE_DIVIDE_CTRL_M_DEFAULT_DEFAULT_DIV_VAL_S5_M MAKEMASK(0x7, 18) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_LCLK 0x000B8200 /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_LCLK_DIV_VAL_TBW_50G_H_S 0 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_LCLK_DIV_VAL_TBW_50G_H_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_LCLK_DIV_VAL_TBW_25G_H_S 3 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_LCLK_DIV_VAL_TBW_25G_H_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_LCLK_DIV_VAL_TBW_10G_H_S 6 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_LCLK_DIV_VAL_TBW_10G_H_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_LCLK_DIV_VAL_TBW_4G_H_S 9 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_LCLK_DIV_VAL_TBW_4G_H_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_LCLK_DIV_VAL_TBW_A50G_H_S 12 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_LCLK_DIV_VAL_TBW_A50G_H_M MAKEMASK(0xF, 12) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PECLK 0x000B81F0 /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PECLK_DIV_VAL_TBW_50G_H_S 0 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PECLK_DIV_VAL_TBW_50G_H_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PECLK_DIV_VAL_TBW_25G_H_S 3 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PECLK_DIV_VAL_TBW_25G_H_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PECLK_DIV_VAL_TBW_10G_H_S 6 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PECLK_DIV_VAL_TBW_10G_H_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PECLK_DIV_VAL_TBW_4G_H_S 9 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PECLK_DIV_VAL_TBW_4G_H_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PECLK_DIV_VAL_TBW_A50G_H_S 12 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PECLK_DIV_VAL_TBW_A50G_H_M MAKEMASK(0xF, 12) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PSM 0x000B81FC /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PSM_DIV_VAL_TBW_50G_H_S 0 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PSM_DIV_VAL_TBW_50G_H_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PSM_DIV_VAL_TBW_25G_H_S 3 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PSM_DIV_VAL_TBW_25G_H_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PSM_DIV_VAL_TBW_10G_H_S 6 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PSM_DIV_VAL_TBW_10G_H_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PSM_DIV_VAL_TBW_4G_H_S 9 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PSM_DIV_VAL_TBW_4G_H_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PSM_DIV_VAL_TBW_A50G_H_S 12 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_PSM_DIV_VAL_TBW_A50G_H_M MAKEMASK(0xF, 12) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_RXCTL 0x000B81F8 /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_RXCTL_DIV_VAL_TBW_50G_H_S 0 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_RXCTL_DIV_VAL_TBW_50G_H_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_RXCTL_DIV_VAL_TBW_25G_H_S 3 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_RXCTL_DIV_VAL_TBW_25G_H_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_RXCTL_DIV_VAL_TBW_10G_H_S 6 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_RXCTL_DIV_VAL_TBW_10G_H_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_RXCTL_DIV_VAL_TBW_4G_H_S 9 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_RXCTL_DIV_VAL_TBW_4G_H_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_RXCTL_DIV_VAL_TBW_A50G_H_S 12 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_RXCTL_DIV_VAL_TBW_A50G_H_M MAKEMASK(0xF, 12) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UANA 0x000B8208 /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UANA_DIV_VAL_TBW_50G_H_S 0 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UANA_DIV_VAL_TBW_50G_H_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UANA_DIV_VAL_TBW_25G_H_S 3 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UANA_DIV_VAL_TBW_25G_H_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UANA_DIV_VAL_TBW_10G_H_S 6 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UANA_DIV_VAL_TBW_10G_H_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UANA_DIV_VAL_TBW_4G_H_S 9 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UANA_DIV_VAL_TBW_4G_H_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UANA_DIV_VAL_TBW_A50G_H_S 12 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UANA_DIV_VAL_TBW_A50G_H_M MAKEMASK(0xF, 12) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UCLK 0x000B81F4 /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UCLK_DIV_VAL_TBW_50G_H_S 0 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UCLK_DIV_VAL_TBW_50G_H_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UCLK_DIV_VAL_TBW_25G_H_S 3 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UCLK_DIV_VAL_TBW_25G_H_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UCLK_DIV_VAL_TBW_10G_H_S 6 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UCLK_DIV_VAL_TBW_10G_H_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UCLK_DIV_VAL_TBW_4G_H_S 9 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UCLK_DIV_VAL_TBW_4G_H_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UCLK_DIV_VAL_TBW_A50G_H_S 12 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_H_UCLK_DIV_VAL_TBW_A50G_H_M MAKEMASK(0xF, 12) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_LCLK 0x000B8244 /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_LCLK_DIV_VAL_TBW_50G_L_S 0 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_LCLK_DIV_VAL_TBW_50G_L_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_LCLK_DIV_VAL_TBW_25G_L_S 3 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_LCLK_DIV_VAL_TBW_25G_L_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_LCLK_DIV_VAL_TBW_10G_L_S 6 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_LCLK_DIV_VAL_TBW_10G_L_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_LCLK_DIV_VAL_TBW_4G_L_S 9 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_LCLK_DIV_VAL_TBW_4G_L_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_LCLK_DIV_VAL_TBW_A50G_L_S 12 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_LCLK_DIV_VAL_TBW_A50G_L_M MAKEMASK(0x7, 12) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PECLK 0x000B8220 /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PECLK_DIV_VAL_TBW_50G_L_S 0 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PECLK_DIV_VAL_TBW_50G_L_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PECLK_DIV_VAL_TBW_25G_L_S 3 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PECLK_DIV_VAL_TBW_25G_L_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PECLK_DIV_VAL_TBW_10G_L_S 6 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PECLK_DIV_VAL_TBW_10G_L_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PECLK_DIV_VAL_TBW_4G_L_S 9 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PECLK_DIV_VAL_TBW_4G_L_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PECLK_DIV_VAL_TBW_A50G_L_S 12 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PECLK_DIV_VAL_TBW_A50G_L_M MAKEMASK(0x7, 12) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PSM 0x000B8240 /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PSM_DIV_VAL_TBW_50G_L_S 0 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PSM_DIV_VAL_TBW_50G_L_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PSM_DIV_VAL_TBW_25G_L_S 3 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PSM_DIV_VAL_TBW_25G_L_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PSM_DIV_VAL_TBW_10G_L_S 6 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PSM_DIV_VAL_TBW_10G_L_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PSM_DIV_VAL_TBW_4G_L_S 9 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PSM_DIV_VAL_TBW_4G_L_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PSM_DIV_VAL_TBW_A50G_L_S 12 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_PSM_DIV_VAL_TBW_A50G_L_M MAKEMASK(0x7, 12) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_RXCTL 0x000B823C /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_RXCTL_DIV_VAL_TBW_50G_L_S 0 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_RXCTL_DIV_VAL_TBW_50G_L_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_RXCTL_DIV_VAL_TBW_25G_L_S 3 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_RXCTL_DIV_VAL_TBW_25G_L_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_RXCTL_DIV_VAL_TBW_10G_L_S 6 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_RXCTL_DIV_VAL_TBW_10G_L_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_RXCTL_DIV_VAL_TBW_4G_L_S 9 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_RXCTL_DIV_VAL_TBW_4G_L_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_RXCTL_DIV_VAL_TBW_A50G_L_S 12 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_RXCTL_DIV_VAL_TBW_A50G_L_M MAKEMASK(0x7, 12) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UANA 0x000B8248 /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UANA_DIV_VAL_TBW_50G_L_S 0 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UANA_DIV_VAL_TBW_50G_L_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UANA_DIV_VAL_TBW_25G_L_S 3 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UANA_DIV_VAL_TBW_25G_L_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UANA_DIV_VAL_TBW_10G_L_S 6 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UANA_DIV_VAL_TBW_10G_L_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UANA_DIV_VAL_TBW_4G_L_S 9 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UANA_DIV_VAL_TBW_4G_L_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UANA_DIV_VAL_TBW_A50G_L_S 12 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UANA_DIV_VAL_TBW_A50G_L_M MAKEMASK(0x7, 12) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UCLK 0x000B8238 /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UCLK_DIV_VAL_TBW_50G_L_S 0 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UCLK_DIV_VAL_TBW_50G_L_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UCLK_DIV_VAL_TBW_25G_L_S 3 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UCLK_DIV_VAL_TBW_25G_L_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UCLK_DIV_VAL_TBW_10G_L_S 6 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UCLK_DIV_VAL_TBW_10G_L_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UCLK_DIV_VAL_TBW_4G_L_S 9 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UCLK_DIV_VAL_TBW_4G_L_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UCLK_DIV_VAL_TBW_A50G_L_S 12 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_L_UCLK_DIV_VAL_TBW_A50G_L_M MAKEMASK(0x7, 12) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_LCLK 0x000B8230 /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_LCLK_DIV_VAL_TBW_50G_M_S 0 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_LCLK_DIV_VAL_TBW_50G_M_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_LCLK_DIV_VAL_TBW_25G_M_S 3 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_LCLK_DIV_VAL_TBW_25G_M_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_LCLK_DIV_VAL_TBW_10G_M_S 6 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_LCLK_DIV_VAL_TBW_10G_M_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_LCLK_DIV_VAL_TBW_4G_M_S 9 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_LCLK_DIV_VAL_TBW_4G_M_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_LCLK_DIV_VAL_TBW_A50G_M_S 12 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_LCLK_DIV_VAL_TBW_A50G_M_M MAKEMASK(0x7, 12) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PECLK 0x000B821C /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PECLK_DIV_VAL_TBW_50G_M_S 0 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PECLK_DIV_VAL_TBW_50G_M_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PECLK_DIV_VAL_TBW_25G_M_S 3 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PECLK_DIV_VAL_TBW_25G_M_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PECLK_DIV_VAL_TBW_10G_M_S 6 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PECLK_DIV_VAL_TBW_10G_M_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PECLK_DIV_VAL_TBW_4G_M_S 9 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PECLK_DIV_VAL_TBW_4G_M_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PECLK_DIV_VAL_TBW_A50G_M_S 12 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PECLK_DIV_VAL_TBW_A50G_M_M MAKEMASK(0x7, 12) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PSM 0x000B822C /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PSM_DIV_VAL_TBW_50G_M_S 0 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PSM_DIV_VAL_TBW_50G_M_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PSM_DIV_VAL_TBW_25G_M_S 3 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PSM_DIV_VAL_TBW_25G_M_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PSM_DIV_VAL_TBW_10G_M_S 6 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PSM_DIV_VAL_TBW_10G_M_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PSM_DIV_VAL_TBW_4G_M_S 9 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PSM_DIV_VAL_TBW_4G_M_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PSM_DIV_VAL_TBW_A50G_M_S 12 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_PSM_DIV_VAL_TBW_A50G_M_M MAKEMASK(0x7, 12) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_RXCTL 0x000B8228 /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_RXCTL_DIV_VAL_TBW_50G_M_S 0 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_RXCTL_DIV_VAL_TBW_50G_M_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_RXCTL_DIV_VAL_TBW_25G_M_S 3 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_RXCTL_DIV_VAL_TBW_25G_M_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_RXCTL_DIV_VAL_TBW_10G_M_S 6 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_RXCTL_DIV_VAL_TBW_10G_M_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_RXCTL_DIV_VAL_TBW_4G_M_S 9 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_RXCTL_DIV_VAL_TBW_4G_M_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_RXCTL_DIV_VAL_TBW_A50G_M_S 12 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_RXCTL_DIV_VAL_TBW_A50G_M_M MAKEMASK(0x7, 12) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UANA 0x000B8234 /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UANA_DIV_VAL_TBW_50G_M_S 0 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UANA_DIV_VAL_TBW_50G_M_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UANA_DIV_VAL_TBW_25G_M_S 3 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UANA_DIV_VAL_TBW_25G_M_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UANA_DIV_VAL_TBW_10G_M_S 6 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UANA_DIV_VAL_TBW_10G_M_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UANA_DIV_VAL_TBW_4G_M_S 9 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UANA_DIV_VAL_TBW_4G_M_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UANA_DIV_VAL_TBW_A50G_M_S 12 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UANA_DIV_VAL_TBW_A50G_M_M MAKEMASK(0x7, 12) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UCLK 0x000B8224 /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UCLK_DIV_VAL_TBW_50G_M_S 0 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UCLK_DIV_VAL_TBW_50G_M_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UCLK_DIV_VAL_TBW_25G_M_S 3 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UCLK_DIV_VAL_TBW_25G_M_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UCLK_DIV_VAL_TBW_10G_M_S 6 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UCLK_DIV_VAL_TBW_10G_M_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UCLK_DIV_VAL_TBW_4G_M_S 9 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UCLK_DIV_VAL_TBW_4G_M_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UCLK_DIV_VAL_TBW_A50G_M_S 12 +#define GL_PWR_MODE_DIVIDE_S0_CTRL_M_UCLK_DIV_VAL_TBW_A50G_M_M MAKEMASK(0x7, 12) +#define GL_PWR_MODE_DIVIDE_S5_H_CTRL 0x000B81EC /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S5_H_CTRL_DIV_VAL_TBW_50G_H_S 0 +#define GL_PWR_MODE_DIVIDE_S5_H_CTRL_DIV_VAL_TBW_50G_H_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S5_H_CTRL_DIV_VAL_TBW_25G_H_S 3 +#define GL_PWR_MODE_DIVIDE_S5_H_CTRL_DIV_VAL_TBW_25G_H_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S5_H_CTRL_DIV_VAL_TBW_10G_H_S 6 +#define GL_PWR_MODE_DIVIDE_S5_H_CTRL_DIV_VAL_TBW_10G_H_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S5_H_CTRL_DIV_VAL_TBW_4G_H_S 9 +#define GL_PWR_MODE_DIVIDE_S5_H_CTRL_DIV_VAL_TBW_4G_H_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S5_H_CTRL_DIV_VAL_TBW_A50G_H_S 12 +#define GL_PWR_MODE_DIVIDE_S5_H_CTRL_DIV_VAL_TBW_A50G_H_M MAKEMASK(0xF, 12) +#define GL_PWR_MODE_DIVIDE_S5_L_CTRL 0x000B824C /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S5_L_CTRL_DIV_VAL_TBW_50G_L_S 0 +#define GL_PWR_MODE_DIVIDE_S5_L_CTRL_DIV_VAL_TBW_50G_L_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S5_L_CTRL_DIV_VAL_TBW_25G_L_S 3 +#define GL_PWR_MODE_DIVIDE_S5_L_CTRL_DIV_VAL_TBW_25G_L_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S5_L_CTRL_DIV_VAL_TBW_10G_L_S 6 +#define GL_PWR_MODE_DIVIDE_S5_L_CTRL_DIV_VAL_TBW_10G_L_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S5_L_CTRL_DIV_VAL_TBW_4G_L_S 9 +#define GL_PWR_MODE_DIVIDE_S5_L_CTRL_DIV_VAL_TBW_4G_L_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S5_L_CTRL_DIV_VAL_TBW_A50G_L_S 12 +#define GL_PWR_MODE_DIVIDE_S5_L_CTRL_DIV_VAL_TBW_A50G_L_M MAKEMASK(0x7, 12) +#define GL_PWR_MODE_DIVIDE_S5_M_CTRL 0x000B8250 /* Reset Source: POR */ +#define GL_PWR_MODE_DIVIDE_S5_M_CTRL_DIV_VAL_TBW_50G_M_S 0 +#define GL_PWR_MODE_DIVIDE_S5_M_CTRL_DIV_VAL_TBW_50G_M_M MAKEMASK(0x7, 0) +#define GL_PWR_MODE_DIVIDE_S5_M_CTRL_DIV_VAL_TBW_25G_M_S 3 +#define GL_PWR_MODE_DIVIDE_S5_M_CTRL_DIV_VAL_TBW_25G_M_M MAKEMASK(0x7, 3) +#define GL_PWR_MODE_DIVIDE_S5_M_CTRL_DIV_VAL_TBW_10G_M_S 6 +#define GL_PWR_MODE_DIVIDE_S5_M_CTRL_DIV_VAL_TBW_10G_M_M MAKEMASK(0x7, 6) +#define GL_PWR_MODE_DIVIDE_S5_M_CTRL_DIV_VAL_TBW_4G_M_S 9 +#define GL_PWR_MODE_DIVIDE_S5_M_CTRL_DIV_VAL_TBW_4G_M_M MAKEMASK(0x7, 9) +#define GL_PWR_MODE_DIVIDE_S5_M_CTRL_DIV_VAL_TBW_A50G_M_S 12 +#define GL_PWR_MODE_DIVIDE_S5_M_CTRL_DIV_VAL_TBW_A50G_M_M MAKEMASK(0x7, 12) +#define GL_S5_PWR_MODE_EXIT_CTL 0x000B8270 /* Reset Source: POR */ +#define GL_S5_PWR_MODE_EXIT_CTL_S5_PWR_MODE_AUTO_EXIT_S 0 +#define GL_S5_PWR_MODE_EXIT_CTL_S5_PWR_MODE_AUTO_EXIT_M BIT(0) +#define GL_S5_PWR_MODE_EXIT_CTL_S5_PWR_MODE_FW_EXIT_S 1 +#define GL_S5_PWR_MODE_EXIT_CTL_S5_PWR_MODE_FW_EXIT_M BIT(1) +#define GL_S5_PWR_MODE_EXIT_CTL_S5_PWR_MODE_PRST_FLOWS_ON_CORER_S 3 +#define GL_S5_PWR_MODE_EXIT_CTL_S5_PWR_MODE_PRST_FLOWS_ON_CORER_M BIT(3) +#define GLGEN_PME_TO 0x000B81BC /* Reset Source: POR */ +#define GLGEN_PME_TO_PME_TO_FOR_PE_S 0 +#define GLGEN_PME_TO_PME_TO_FOR_PE_M BIT(0) +#define PRTPM_EEE_STAT 0x001E4320 /* Reset Source: GLOBR */ +#define PRTPM_EEE_STAT_EEE_NEG_S 29 +#define PRTPM_EEE_STAT_EEE_NEG_M BIT(29) +#define PRTPM_EEE_STAT_RX_LPI_STATUS_S 30 +#define PRTPM_EEE_STAT_RX_LPI_STATUS_M BIT(30) +#define PRTPM_EEE_STAT_TX_LPI_STATUS_S 31 +#define PRTPM_EEE_STAT_TX_LPI_STATUS_M BIT(31) +#define PRTPM_EEEC 0x001E4380 /* Reset Source: GLOBR */ +#define PRTPM_EEEC_TW_WAKE_MIN_S 16 +#define PRTPM_EEEC_TW_WAKE_MIN_M MAKEMASK(0x3F, 16) +#define PRTPM_EEEC_TX_LU_LPI_DLY_S 24 +#define PRTPM_EEEC_TX_LU_LPI_DLY_M MAKEMASK(0x3, 24) +#define PRTPM_EEEC_TEEE_DLY_S 26 +#define PRTPM_EEEC_TEEE_DLY_M MAKEMASK(0x3F, 26) +#define PRTPM_EEEFWD 0x001E4400 /* Reset Source: GLOBR */ +#define PRTPM_EEEFWD_EEE_FW_CONFIG_DONE_S 31 +#define PRTPM_EEEFWD_EEE_FW_CONFIG_DONE_M BIT(31) +#define PRTPM_EEER 0x001E4360 /* Reset Source: GLOBR */ +#define PRTPM_EEER_TW_SYSTEM_S 0 +#define PRTPM_EEER_TW_SYSTEM_M MAKEMASK(0xFFFF, 0) +#define PRTPM_EEER_TX_LPI_EN_S 16 +#define PRTPM_EEER_TX_LPI_EN_M BIT(16) +#define PRTPM_EEETXC 0x001E43E0 /* Reset Source: GLOBR */ +#define PRTPM_EEETXC_TW_PHY_S 0 +#define PRTPM_EEETXC_TW_PHY_M MAKEMASK(0xFFFF, 0) +#define PRTPM_RLPIC 0x001E43A0 /* Reset Source: GLOBR */ +#define PRTPM_RLPIC_ERLPIC_S 0 +#define PRTPM_RLPIC_ERLPIC_M MAKEMASK(0xFFFFFFFF, 0) +#define PRTPM_TLPIC 0x001E43C0 /* Reset Source: GLOBR */ +#define PRTPM_TLPIC_ETLPIC_S 0 +#define PRTPM_TLPIC_ETLPIC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLRPB_DHW(_i) (0x000AC000 + ((_i) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define GLRPB_DHW_MAX_INDEX 15 +#define GLRPB_DHW_DHW_TCN_S 0 +#define GLRPB_DHW_DHW_TCN_M MAKEMASK(0xFFFFF, 0) +#define GLRPB_DLW(_i) (0x000AC044 + ((_i) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define GLRPB_DLW_MAX_INDEX 15 +#define GLRPB_DLW_DLW_TCN_S 0 +#define GLRPB_DLW_DLW_TCN_M MAKEMASK(0xFFFFF, 0) +#define GLRPB_DPS(_i) (0x000AC084 + ((_i) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define GLRPB_DPS_MAX_INDEX 15 +#define GLRPB_DPS_DPS_TCN_S 0 +#define GLRPB_DPS_DPS_TCN_M MAKEMASK(0xFFFFF, 0) +#define GLRPB_DSI_EN 0x000AC324 /* Reset Source: CORER */ +#define GLRPB_DSI_EN_DSI_EN_S 0 +#define GLRPB_DSI_EN_DSI_EN_M BIT(0) +#define GLRPB_DSI_EN_DSI_L2_MAC_ERR_DROP_EN_S 1 +#define GLRPB_DSI_EN_DSI_L2_MAC_ERR_DROP_EN_M BIT(1) +#define GLRPB_SHW(_i) (0x000AC120 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLRPB_SHW_MAX_INDEX 7 +#define GLRPB_SHW_SHW_S 0 +#define GLRPB_SHW_SHW_M MAKEMASK(0xFFFFF, 0) +#define GLRPB_SLW(_i) (0x000AC140 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLRPB_SLW_MAX_INDEX 7 +#define GLRPB_SLW_SLW_S 0 +#define GLRPB_SLW_SLW_M MAKEMASK(0xFFFFF, 0) +#define GLRPB_SPS(_i) (0x000AC0C4 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLRPB_SPS_MAX_INDEX 7 +#define GLRPB_SPS_SPS_TCN_S 0 +#define GLRPB_SPS_SPS_TCN_M MAKEMASK(0xFFFFF, 0) +#define GLRPB_TC_CFG(_i) (0x000AC2A4 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLRPB_TC_CFG_MAX_INDEX 31 +#define GLRPB_TC_CFG_D_POOL_S 0 +#define GLRPB_TC_CFG_D_POOL_M MAKEMASK(0xFFFF, 0) +#define GLRPB_TC_CFG_S_POOL_S 16 +#define GLRPB_TC_CFG_S_POOL_M MAKEMASK(0xFFFF, 16) +#define GLRPB_TCHW(_i) (0x000AC330 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLRPB_TCHW_MAX_INDEX 31 +#define GLRPB_TCHW_TCHW_S 0 +#define GLRPB_TCHW_TCHW_M MAKEMASK(0xFFFFF, 0) +#define GLRPB_TCLW(_i) (0x000AC3B0 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLRPB_TCLW_MAX_INDEX 31 +#define GLRPB_TCLW_TCLW_S 0 +#define GLRPB_TCLW_TCLW_M MAKEMASK(0xFFFFF, 0) +#define GLQF_APBVT(_i) (0x00450000 + ((_i) * 4)) /* _i=0...2047 */ /* Reset Source: CORER */ +#define GLQF_APBVT_MAX_INDEX 2047 +#define GLQF_APBVT_APBVT_S 0 +#define GLQF_APBVT_APBVT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLQF_FD_CLSN_0 0x00460028 /* Reset Source: CORER */ +#define GLQF_FD_CLSN_0_HITSBCNT_S 0 +#define GLQF_FD_CLSN_0_HITSBCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLQF_FD_CLSN1 0x00460030 /* Reset Source: CORER */ +#define GLQF_FD_CLSN1_HITLBCNT_S 0 +#define GLQF_FD_CLSN1_HITLBCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLQF_FD_CNT 0x00460018 /* Reset Source: CORER */ +#define GLQF_FD_CNT_FD_GCNT_S 0 +#define GLQF_FD_CNT_FD_GCNT_M MAKEMASK(0x7FFF, 0) +#define GLQF_FD_CNT_FD_BCNT_S 16 +#define GLQF_FD_CNT_FD_BCNT_M MAKEMASK(0x7FFF, 16) +#define GLQF_FD_CTL 0x00460000 /* Reset Source: CORER */ +#define GLQF_FD_CTL_FDLONG_S 0 +#define GLQF_FD_CTL_FDLONG_M MAKEMASK(0xF, 0) +#define GLQF_FD_CTL_HASH_REPORT_S 4 +#define GLQF_FD_CTL_HASH_REPORT_M BIT(4) +#define GLQF_FD_CTL_FLT_ADDR_REPORT_S 5 +#define GLQF_FD_CTL_FLT_ADDR_REPORT_M BIT(5) +#define GLQF_FD_SIZE 0x00460010 /* Reset Source: CORER */ +#define GLQF_FD_SIZE_FD_GSIZE_S 0 +#define GLQF_FD_SIZE_FD_GSIZE_M MAKEMASK(0x7FFF, 0) +#define GLQF_FD_SIZE_FD_BSIZE_S 16 +#define GLQF_FD_SIZE_FD_BSIZE_M MAKEMASK(0x7FFF, 16) +#define GLQF_FDCNT_0 0x00460020 /* Reset Source: CORER */ +#define GLQF_FDCNT_0_BUCKETCNT_S 0 +#define GLQF_FDCNT_0_BUCKETCNT_M MAKEMASK(0x7FFF, 0) +#define GLQF_FDCNT_0_CNT_NOT_VLD_S 31 +#define GLQF_FDCNT_0_CNT_NOT_VLD_M BIT(31) +#define GLQF_FDEVICTENA(_i) (0x00452000 + ((_i) * 4)) /* _i=0...3 */ /* Reset Source: CORER */ +#define GLQF_FDEVICTENA_MAX_INDEX 3 +#define GLQF_FDEVICTENA_FDEVICTENA_S 0 +#define GLQF_FDEVICTENA_FDEVICTENA_M MAKEMASK(0xFFFFFFFF, 0) +#define GLQF_FDINSET(_i, _j) (0x00412000 + ((_i) * 4 + (_j) * 512)) /* _i=0...127, _j=0...5 */ /* Reset Source: CORER */ +#define GLQF_FDINSET_MAX_INDEX 127 +#define GLQF_FDINSET_FV_WORD_INDX0_S 0 +#define GLQF_FDINSET_FV_WORD_INDX0_M MAKEMASK(0x1F, 0) +#define GLQF_FDINSET_FV_WORD_VAL0_S 7 +#define GLQF_FDINSET_FV_WORD_VAL0_M BIT(7) +#define GLQF_FDINSET_FV_WORD_INDX1_S 8 +#define GLQF_FDINSET_FV_WORD_INDX1_M MAKEMASK(0x1F, 8) +#define GLQF_FDINSET_FV_WORD_VAL1_S 15 +#define GLQF_FDINSET_FV_WORD_VAL1_M BIT(15) +#define GLQF_FDINSET_FV_WORD_INDX2_S 16 +#define GLQF_FDINSET_FV_WORD_INDX2_M MAKEMASK(0x1F, 16) +#define GLQF_FDINSET_FV_WORD_VAL2_S 23 +#define GLQF_FDINSET_FV_WORD_VAL2_M BIT(23) +#define GLQF_FDINSET_FV_WORD_INDX3_S 24 +#define GLQF_FDINSET_FV_WORD_INDX3_M MAKEMASK(0x1F, 24) +#define GLQF_FDINSET_FV_WORD_VAL3_S 31 +#define GLQF_FDINSET_FV_WORD_VAL3_M BIT(31) +#define GLQF_FDMASK(_i) (0x00410800 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLQF_FDMASK_MAX_INDEX 31 +#define GLQF_FDMASK_MSK_INDEX_S 0 +#define GLQF_FDMASK_MSK_INDEX_M MAKEMASK(0x1F, 0) +#define GLQF_FDMASK_MASK_S 16 +#define GLQF_FDMASK_MASK_M MAKEMASK(0xFFFF, 16) +#define GLQF_FDMASK_SEL(_i) (0x00410400 + ((_i) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLQF_FDMASK_SEL_MAX_INDEX 127 +#define GLQF_FDMASK_SEL_MASK_SEL_S 0 +#define GLQF_FDMASK_SEL_MASK_SEL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLQF_FDSWAP(_i, _j) (0x00413000 + ((_i) * 4 + (_j) * 512)) /* _i=0...127, _j=0...5 */ /* Reset Source: CORER */ +#define GLQF_FDSWAP_MAX_INDEX 127 +#define GLQF_FDSWAP_FV_WORD_INDX0_S 0 +#define GLQF_FDSWAP_FV_WORD_INDX0_M MAKEMASK(0x1F, 0) +#define GLQF_FDSWAP_FV_WORD_VAL0_S 7 +#define GLQF_FDSWAP_FV_WORD_VAL0_M BIT(7) +#define GLQF_FDSWAP_FV_WORD_INDX1_S 8 +#define GLQF_FDSWAP_FV_WORD_INDX1_M MAKEMASK(0x1F, 8) +#define GLQF_FDSWAP_FV_WORD_VAL1_S 15 +#define GLQF_FDSWAP_FV_WORD_VAL1_M BIT(15) +#define GLQF_FDSWAP_FV_WORD_INDX2_S 16 +#define GLQF_FDSWAP_FV_WORD_INDX2_M MAKEMASK(0x1F, 16) +#define GLQF_FDSWAP_FV_WORD_VAL2_S 23 +#define GLQF_FDSWAP_FV_WORD_VAL2_M BIT(23) +#define GLQF_FDSWAP_FV_WORD_INDX3_S 24 +#define GLQF_FDSWAP_FV_WORD_INDX3_M MAKEMASK(0x1F, 24) +#define GLQF_FDSWAP_FV_WORD_VAL3_S 31 +#define GLQF_FDSWAP_FV_WORD_VAL3_M BIT(31) +#define GLQF_HINSET(_i, _j) (0x0040E000 + ((_i) * 4 + (_j) * 512)) /* _i=0...127, _j=0...5 */ /* Reset Source: CORER */ +#define GLQF_HINSET_MAX_INDEX 127 +#define GLQF_HINSET_FV_WORD_INDX0_S 0 +#define GLQF_HINSET_FV_WORD_INDX0_M MAKEMASK(0x1F, 0) +#define GLQF_HINSET_FV_WORD_VAL0_S 7 +#define GLQF_HINSET_FV_WORD_VAL0_M BIT(7) +#define GLQF_HINSET_FV_WORD_INDX1_S 8 +#define GLQF_HINSET_FV_WORD_INDX1_M MAKEMASK(0x1F, 8) +#define GLQF_HINSET_FV_WORD_VAL1_S 15 +#define GLQF_HINSET_FV_WORD_VAL1_M BIT(15) +#define GLQF_HINSET_FV_WORD_INDX2_S 16 +#define GLQF_HINSET_FV_WORD_INDX2_M MAKEMASK(0x1F, 16) +#define GLQF_HINSET_FV_WORD_VAL2_S 23 +#define GLQF_HINSET_FV_WORD_VAL2_M BIT(23) +#define GLQF_HINSET_FV_WORD_INDX3_S 24 +#define GLQF_HINSET_FV_WORD_INDX3_M MAKEMASK(0x1F, 24) +#define GLQF_HINSET_FV_WORD_VAL3_S 31 +#define GLQF_HINSET_FV_WORD_VAL3_M BIT(31) +#define GLQF_HKEY(_i) (0x00456000 + ((_i) * 4)) /* _i=0...12 */ /* Reset Source: CORER */ +#define GLQF_HKEY_MAX_INDEX 12 +#define GLQF_HKEY_KEY_0_S 0 +#define GLQF_HKEY_KEY_0_M MAKEMASK(0xFF, 0) +#define GLQF_HKEY_KEY_1_S 8 +#define GLQF_HKEY_KEY_1_M MAKEMASK(0xFF, 8) +#define GLQF_HKEY_KEY_2_S 16 +#define GLQF_HKEY_KEY_2_M MAKEMASK(0xFF, 16) +#define GLQF_HKEY_KEY_3_S 24 +#define GLQF_HKEY_KEY_3_M MAKEMASK(0xFF, 24) +#define GLQF_HLUT(_i, _j) (0x00438000 + ((_i) * 4 + (_j) * 512)) /* _i=0...127, _j=0...15 */ /* Reset Source: CORER */ +#define GLQF_HLUT_MAX_INDEX 127 +#define GLQF_HLUT_LUT0_S 0 +#define GLQF_HLUT_LUT0_M MAKEMASK(0x3F, 0) +#define GLQF_HLUT_LUT1_S 8 +#define GLQF_HLUT_LUT1_M MAKEMASK(0x3F, 8) +#define GLQF_HLUT_LUT2_S 16 +#define GLQF_HLUT_LUT2_M MAKEMASK(0x3F, 16) +#define GLQF_HLUT_LUT3_S 24 +#define GLQF_HLUT_LUT3_M MAKEMASK(0x3F, 24) +#define GLQF_HLUT_SIZE(_i) (0x00455400 + ((_i) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define GLQF_HLUT_SIZE_MAX_INDEX 15 +#define GLQF_HLUT_SIZE_HSIZE_S 0 +#define GLQF_HLUT_SIZE_HSIZE_M BIT(0) +#define GLQF_HMASK(_i) (0x0040FC00 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLQF_HMASK_MAX_INDEX 31 +#define GLQF_HMASK_MSK_INDEX_S 0 +#define GLQF_HMASK_MSK_INDEX_M MAKEMASK(0x1F, 0) +#define GLQF_HMASK_MASK_S 16 +#define GLQF_HMASK_MASK_M MAKEMASK(0xFFFF, 16) +#define GLQF_HMASK_SEL(_i) (0x00410000 + ((_i) * 4)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GLQF_HMASK_SEL_MAX_INDEX 127 +#define GLQF_HMASK_SEL_MASK_SEL_S 0 +#define GLQF_HMASK_SEL_MASK_SEL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLQF_HSYMM(_i, _j) (0x0040F000 + ((_i) * 4 + (_j) * 512)) /* _i=0...127, _j=0...5 */ /* Reset Source: CORER */ +#define GLQF_HSYMM_MAX_INDEX 127 +#define GLQF_HSYMM_FV_SYMM_INDX0_S 0 +#define GLQF_HSYMM_FV_SYMM_INDX0_M MAKEMASK(0x1F, 0) +#define GLQF_HSYMM_SYMM0_ENA_S 7 +#define GLQF_HSYMM_SYMM0_ENA_M BIT(7) +#define GLQF_HSYMM_FV_SYMM_INDX1_S 8 +#define GLQF_HSYMM_FV_SYMM_INDX1_M MAKEMASK(0x1F, 8) +#define GLQF_HSYMM_SYMM1_ENA_S 15 +#define GLQF_HSYMM_SYMM1_ENA_M BIT(15) +#define GLQF_HSYMM_FV_SYMM_INDX2_S 16 +#define GLQF_HSYMM_FV_SYMM_INDX2_M MAKEMASK(0x1F, 16) +#define GLQF_HSYMM_SYMM2_ENA_S 23 +#define GLQF_HSYMM_SYMM2_ENA_M BIT(23) +#define GLQF_HSYMM_FV_SYMM_INDX3_S 24 +#define GLQF_HSYMM_FV_SYMM_INDX3_M MAKEMASK(0x1F, 24) +#define GLQF_HSYMM_SYMM3_ENA_S 31 +#define GLQF_HSYMM_SYMM3_ENA_M BIT(31) +#define GLQF_PE_APBVT_CNT 0x00455500 /* Reset Source: CORER */ +#define GLQF_PE_APBVT_CNT_APBVT_LAN_S 0 +#define GLQF_PE_APBVT_CNT_APBVT_LAN_M MAKEMASK(0xFFFFFFFF, 0) +#define GLQF_PE_CMD 0x00471080 /* Reset Source: CORER */ +#define GLQF_PE_CMD_ADDREM_STS_S 0 +#define GLQF_PE_CMD_ADDREM_STS_M MAKEMASK(0xFFFFFF, 0) +#define GLQF_PE_CMD_ADDREM_ID_S 28 +#define GLQF_PE_CMD_ADDREM_ID_M MAKEMASK(0xF, 28) +#define GLQF_PE_CTL 0x004710C0 /* Reset Source: CORER */ +#define GLQF_PE_CTL_PELONG_S 0 +#define GLQF_PE_CTL_PELONG_M MAKEMASK(0xF, 0) +#define GLQF_PE_CTL2(_i) (0x00455200 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLQF_PE_CTL2_MAX_INDEX 31 +#define GLQF_PE_CTL2_TO_QH_S 0 +#define GLQF_PE_CTL2_TO_QH_M MAKEMASK(0x3, 0) +#define GLQF_PE_CTL2_APBVT_ENA_S 2 +#define GLQF_PE_CTL2_APBVT_ENA_M BIT(2) +#define GLQF_PE_FVE 0x0020E514 /* Reset Source: CORER */ +#define GLQF_PE_FVE_W_ENA_S 0 +#define GLQF_PE_FVE_W_ENA_M MAKEMASK(0xFFFFFF, 0) +#define GLQF_PE_OSR_STS 0x00471040 /* Reset Source: CORER */ +#define GLQF_PE_OSR_STS_QH_SRCH_MAXOSR_S 0 +#define GLQF_PE_OSR_STS_QH_SRCH_MAXOSR_M MAKEMASK(0x3FF, 0) +#define GLQF_PE_OSR_STS_QH_CMD_MAXOSR_S 16 +#define GLQF_PE_OSR_STS_QH_CMD_MAXOSR_M MAKEMASK(0x3FF, 16) +#define GLQF_PEINSET(_i, _j) (0x00415000 + ((_i) * 4 + (_j) * 128)) /* _i=0...31, _j=0...5 */ /* Reset Source: CORER */ +#define GLQF_PEINSET_MAX_INDEX 31 +#define GLQF_PEINSET_FV_WORD_INDX0_S 0 +#define GLQF_PEINSET_FV_WORD_INDX0_M MAKEMASK(0x1F, 0) +#define GLQF_PEINSET_FV_WORD_VAL0_S 7 +#define GLQF_PEINSET_FV_WORD_VAL0_M BIT(7) +#define GLQF_PEINSET_FV_WORD_INDX1_S 8 +#define GLQF_PEINSET_FV_WORD_INDX1_M MAKEMASK(0x1F, 8) +#define GLQF_PEINSET_FV_WORD_VAL1_S 15 +#define GLQF_PEINSET_FV_WORD_VAL1_M BIT(15) +#define GLQF_PEINSET_FV_WORD_INDX2_S 16 +#define GLQF_PEINSET_FV_WORD_INDX2_M MAKEMASK(0x1F, 16) +#define GLQF_PEINSET_FV_WORD_VAL2_S 23 +#define GLQF_PEINSET_FV_WORD_VAL2_M BIT(23) +#define GLQF_PEINSET_FV_WORD_INDX3_S 24 +#define GLQF_PEINSET_FV_WORD_INDX3_M MAKEMASK(0x1F, 24) +#define GLQF_PEINSET_FV_WORD_VAL3_S 31 +#define GLQF_PEINSET_FV_WORD_VAL3_M BIT(31) +#define GLQF_PEMASK(_i) (0x00415400 + ((_i) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define GLQF_PEMASK_MAX_INDEX 15 +#define GLQF_PEMASK_MSK_INDEX_S 0 +#define GLQF_PEMASK_MSK_INDEX_M MAKEMASK(0x1F, 0) +#define GLQF_PEMASK_MASK_S 16 +#define GLQF_PEMASK_MASK_M MAKEMASK(0xFFFF, 16) +#define GLQF_PEMASK_SEL(_i) (0x00415500 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLQF_PEMASK_SEL_MAX_INDEX 31 +#define GLQF_PEMASK_SEL_MASK_SEL_S 0 +#define GLQF_PEMASK_SEL_MASK_SEL_M MAKEMASK(0xFFFF, 0) +#define GLQF_PETABLE_CLR(_i) (0x000AA078 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLQF_PETABLE_CLR_MAX_INDEX 1 +#define GLQF_PETABLE_CLR_VM_VF_NUM_S 0 +#define GLQF_PETABLE_CLR_VM_VF_NUM_M MAKEMASK(0x3FF, 0) +#define GLQF_PETABLE_CLR_VM_VF_TYPE_S 10 +#define GLQF_PETABLE_CLR_VM_VF_TYPE_M MAKEMASK(0x3, 10) +#define GLQF_PETABLE_CLR_PF_NUM_S 12 +#define GLQF_PETABLE_CLR_PF_NUM_M MAKEMASK(0x7, 12) +#define GLQF_PETABLE_CLR_PE_BUSY_S 16 +#define GLQF_PETABLE_CLR_PE_BUSY_M BIT(16) +#define GLQF_PETABLE_CLR_PE_CLEAR_S 17 +#define GLQF_PETABLE_CLR_PE_CLEAR_M BIT(17) +#define GLQF_PROF2TC(_i, _j) (0x0044D000 + ((_i) * 4 + (_j) * 512)) /* _i=0...127, _j=0...3 */ /* Reset Source: CORER */ +#define GLQF_PROF2TC_MAX_INDEX 127 +#define GLQF_PROF2TC_OVERRIDE_ENA_0_S 0 +#define GLQF_PROF2TC_OVERRIDE_ENA_0_M BIT(0) +#define GLQF_PROF2TC_REGION_0_S 1 +#define GLQF_PROF2TC_REGION_0_M MAKEMASK(0x7, 1) +#define GLQF_PROF2TC_OVERRIDE_ENA_1_S 4 +#define GLQF_PROF2TC_OVERRIDE_ENA_1_M BIT(4) +#define GLQF_PROF2TC_REGION_1_S 5 +#define GLQF_PROF2TC_REGION_1_M MAKEMASK(0x7, 5) +#define GLQF_PROF2TC_OVERRIDE_ENA_2_S 8 +#define GLQF_PROF2TC_OVERRIDE_ENA_2_M BIT(8) +#define GLQF_PROF2TC_REGION_2_S 9 +#define GLQF_PROF2TC_REGION_2_M MAKEMASK(0x7, 9) +#define GLQF_PROF2TC_OVERRIDE_ENA_3_S 12 +#define GLQF_PROF2TC_OVERRIDE_ENA_3_M BIT(12) +#define GLQF_PROF2TC_REGION_3_S 13 +#define GLQF_PROF2TC_REGION_3_M MAKEMASK(0x7, 13) +#define GLQF_PROF2TC_OVERRIDE_ENA_4_S 16 +#define GLQF_PROF2TC_OVERRIDE_ENA_4_M BIT(16) +#define GLQF_PROF2TC_REGION_4_S 17 +#define GLQF_PROF2TC_REGION_4_M MAKEMASK(0x7, 17) +#define GLQF_PROF2TC_OVERRIDE_ENA_5_S 20 +#define GLQF_PROF2TC_OVERRIDE_ENA_5_M BIT(20) +#define GLQF_PROF2TC_REGION_5_S 21 +#define GLQF_PROF2TC_REGION_5_M MAKEMASK(0x7, 21) +#define GLQF_PROF2TC_OVERRIDE_ENA_6_S 24 +#define GLQF_PROF2TC_OVERRIDE_ENA_6_M BIT(24) +#define GLQF_PROF2TC_REGION_6_S 25 +#define GLQF_PROF2TC_REGION_6_M MAKEMASK(0x7, 25) +#define GLQF_PROF2TC_OVERRIDE_ENA_7_S 28 +#define GLQF_PROF2TC_OVERRIDE_ENA_7_M BIT(28) +#define GLQF_PROF2TC_REGION_7_S 29 +#define GLQF_PROF2TC_REGION_7_M MAKEMASK(0x7, 29) +#define PFQF_FD_CNT 0x00460180 /* Reset Source: CORER */ +#define PFQF_FD_CNT_FD_GCNT_S 0 +#define PFQF_FD_CNT_FD_GCNT_M MAKEMASK(0x7FFF, 0) +#define PFQF_FD_CNT_FD_BCNT_S 16 +#define PFQF_FD_CNT_FD_BCNT_M MAKEMASK(0x7FFF, 16) +#define PFQF_FD_ENA 0x0043A000 /* Reset Source: CORER */ +#define PFQF_FD_ENA_FD_ENA_S 0 +#define PFQF_FD_ENA_FD_ENA_M BIT(0) +#define PFQF_FD_SIZE 0x00460100 /* Reset Source: CORER */ +#define PFQF_FD_SIZE_FD_GSIZE_S 0 +#define PFQF_FD_SIZE_FD_GSIZE_M MAKEMASK(0x7FFF, 0) +#define PFQF_FD_SIZE_FD_BSIZE_S 16 +#define PFQF_FD_SIZE_FD_BSIZE_M MAKEMASK(0x7FFF, 16) +#define PFQF_FD_SUBTRACT 0x00460200 /* Reset Source: CORER */ +#define PFQF_FD_SUBTRACT_FD_GCNT_S 0 +#define PFQF_FD_SUBTRACT_FD_GCNT_M MAKEMASK(0x7FFF, 0) +#define PFQF_FD_SUBTRACT_FD_BCNT_S 16 +#define PFQF_FD_SUBTRACT_FD_BCNT_M MAKEMASK(0x7FFF, 16) +#define PFQF_HLUT(_i) (0x00430000 + ((_i) * 64)) /* _i=0...511 */ /* Reset Source: CORER */ +#define PFQF_HLUT_MAX_INDEX 511 +#define PFQF_HLUT_LUT0_S 0 +#define PFQF_HLUT_LUT0_M MAKEMASK(0xFF, 0) +#define PFQF_HLUT_LUT1_S 8 +#define PFQF_HLUT_LUT1_M MAKEMASK(0xFF, 8) +#define PFQF_HLUT_LUT2_S 16 +#define PFQF_HLUT_LUT2_M MAKEMASK(0xFF, 16) +#define PFQF_HLUT_LUT3_S 24 +#define PFQF_HLUT_LUT3_M MAKEMASK(0xFF, 24) +#define PFQF_HLUT_SIZE 0x00455480 /* Reset Source: CORER */ +#define PFQF_HLUT_SIZE_HSIZE_S 0 +#define PFQF_HLUT_SIZE_HSIZE_M MAKEMASK(0x3, 0) +#define PFQF_PE_CLSN0 0x00470480 /* Reset Source: CORER */ +#define PFQF_PE_CLSN0_HITSBCNT_S 0 +#define PFQF_PE_CLSN0_HITSBCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define PFQF_PE_CLSN1 0x00470500 /* Reset Source: CORER */ +#define PFQF_PE_CLSN1_HITLBCNT_S 0 +#define PFQF_PE_CLSN1_HITLBCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define PFQF_PE_CTL1 0x00470000 /* Reset Source: CORER */ +#define PFQF_PE_CTL1_PEHSIZE_S 0 +#define PFQF_PE_CTL1_PEHSIZE_M MAKEMASK(0xF, 0) +#define PFQF_PE_CTL2 0x00470040 /* Reset Source: CORER */ +#define PFQF_PE_CTL2_PEDSIZE_S 0 +#define PFQF_PE_CTL2_PEDSIZE_M MAKEMASK(0xF, 0) +#define PFQF_PE_FILTERING_ENA 0x0043A080 /* Reset Source: CORER */ +#define PFQF_PE_FILTERING_ENA_PE_ENA_S 0 +#define PFQF_PE_FILTERING_ENA_PE_ENA_M BIT(0) +#define PFQF_PE_FLHD 0x00470100 /* Reset Source: CORER */ +#define PFQF_PE_FLHD_FLHD_S 0 +#define PFQF_PE_FLHD_FLHD_M MAKEMASK(0xFFFFFF, 0) +#define PFQF_PE_ST_CTL 0x00470400 /* Reset Source: CORER */ +#define PFQF_PE_ST_CTL_PF_CNT_EN_S 0 +#define PFQF_PE_ST_CTL_PF_CNT_EN_M BIT(0) +#define PFQF_PE_ST_CTL_VFS_CNT_EN_S 1 +#define PFQF_PE_ST_CTL_VFS_CNT_EN_M BIT(1) +#define PFQF_PE_ST_CTL_VF_CNT_EN_S 2 +#define PFQF_PE_ST_CTL_VF_CNT_EN_M BIT(2) +#define PFQF_PE_ST_CTL_VF_NUM_S 16 +#define PFQF_PE_ST_CTL_VF_NUM_M MAKEMASK(0xFF, 16) +#define PFQF_PE_TC_CTL 0x00452080 /* Reset Source: CORER */ +#define PFQF_PE_TC_CTL_TC_EN_PF_S 0 +#define PFQF_PE_TC_CTL_TC_EN_PF_M MAKEMASK(0xFF, 0) +#define PFQF_PE_TC_CTL_TC_EN_VF_S 16 +#define PFQF_PE_TC_CTL_TC_EN_VF_M MAKEMASK(0xFF, 16) +#define PFQF_PECNT_0 0x00470200 /* Reset Source: CORER */ +#define PFQF_PECNT_0_BUCKETCNT_S 0 +#define PFQF_PECNT_0_BUCKETCNT_M MAKEMASK(0x3FFFF, 0) +#define PFQF_PECNT_1 0x00470300 /* Reset Source: CORER */ +#define PFQF_PECNT_1_FLTCNT_S 0 +#define PFQF_PECNT_1_FLTCNT_M MAKEMASK(0x3FFFF, 0) +#define VPQF_PE_CTL1(_VF) (0x00474000 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VPQF_PE_CTL1_MAX_INDEX 255 +#define VPQF_PE_CTL1_PEHSIZE_S 0 +#define VPQF_PE_CTL1_PEHSIZE_M MAKEMASK(0xF, 0) +#define VPQF_PE_CTL2(_VF) (0x00474800 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VPQF_PE_CTL2_MAX_INDEX 255 +#define VPQF_PE_CTL2_PEDSIZE_S 0 +#define VPQF_PE_CTL2_PEDSIZE_M MAKEMASK(0xF, 0) +#define VPQF_PE_FILTERING_ENA(_VF) (0x00455800 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VPQF_PE_FILTERING_ENA_MAX_INDEX 255 +#define VPQF_PE_FILTERING_ENA_PE_ENA_S 0 +#define VPQF_PE_FILTERING_ENA_PE_ENA_M BIT(0) +#define VPQF_PE_FLHD(_VF) (0x00472000 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VPQF_PE_FLHD_MAX_INDEX 255 +#define VPQF_PE_FLHD_FLHD_S 0 +#define VPQF_PE_FLHD_FLHD_M MAKEMASK(0xFFFFFF, 0) +#define VPQF_PECNT_0(_VF) (0x00472800 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VPQF_PECNT_0_MAX_INDEX 255 +#define VPQF_PECNT_0_BUCKETCNT_S 0 +#define VPQF_PECNT_0_BUCKETCNT_M MAKEMASK(0x3FFFF, 0) +#define VPQF_PECNT_1(_VF) (0x00473000 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VPQF_PECNT_1_MAX_INDEX 255 +#define VPQF_PECNT_1_FLTCNT_S 0 +#define VPQF_PECNT_1_FLTCNT_M MAKEMASK(0x3FFFF, 0) +#define GLDCB_RMPMC 0x001223C8 /* Reset Source: CORER */ +#define GLDCB_RMPMC_RSPM_S 0 +#define GLDCB_RMPMC_RSPM_M MAKEMASK(0x3F, 0) +#define GLDCB_RMPMC_MIQ_NODROP_MODE_S 6 +#define GLDCB_RMPMC_MIQ_NODROP_MODE_M MAKEMASK(0x1F, 6) +#define GLDCB_RMPMC_RPM_DIS_S 31 +#define GLDCB_RMPMC_RPM_DIS_M BIT(31) +#define GLDCB_RMPMS 0x001223CC /* Reset Source: CORER */ +#define GLDCB_RMPMS_RMPM_S 0 +#define GLDCB_RMPMS_RMPM_M MAKEMASK(0xFFFF, 0) +#define GLDCB_RPCC 0x00122260 /* Reset Source: CORER */ +#define GLDCB_RPCC_EN_S 0 +#define GLDCB_RPCC_EN_M BIT(0) +#define GLDCB_RPCC_SCL_FACT_S 4 +#define GLDCB_RPCC_SCL_FACT_M MAKEMASK(0x1F, 4) +#define GLDCB_RPCC_THRSH_S 16 +#define GLDCB_RPCC_THRSH_M MAKEMASK(0xFFF, 16) +#define GLDCB_RSPMC 0x001223C4 /* Reset Source: CORER */ +#define GLDCB_RSPMC_RSPM_S 0 +#define GLDCB_RSPMC_RSPM_M MAKEMASK(0xFF, 0) +#define GLDCB_RSPMC_RPM_MODE_S 8 +#define GLDCB_RSPMC_RPM_MODE_M MAKEMASK(0x3, 8) +#define GLDCB_RSPMC_PRR_MAX_EXP_S 10 +#define GLDCB_RSPMC_PRR_MAX_EXP_M MAKEMASK(0xF, 10) +#define GLDCB_RSPMC_PFCTIMER_S 14 +#define GLDCB_RSPMC_PFCTIMER_M MAKEMASK(0x3FFF, 14) +#define GLDCB_RSPMC_RPM_DIS_S 31 +#define GLDCB_RSPMC_RPM_DIS_M BIT(31) +#define GLDCB_RSPMS 0x001223C0 /* Reset Source: CORER */ +#define GLDCB_RSPMS_RSPM_S 0 +#define GLDCB_RSPMS_RSPM_M MAKEMASK(0x3FFFF, 0) +#define GLDCB_RTCTI 0x001223D0 /* Reset Source: CORER */ +#define GLDCB_RTCTI_PFCTIMEOUT_TC_S 0 +#define GLDCB_RTCTI_PFCTIMEOUT_TC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLDCB_RTCTQ(_i) (0x001222C0 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLDCB_RTCTQ_MAX_INDEX 31 +#define GLDCB_RTCTQ_RXQNUM_S 0 +#define GLDCB_RTCTQ_RXQNUM_M MAKEMASK(0x7FF, 0) +#define GLDCB_RTCTQ_IS_PF_Q_S 16 +#define GLDCB_RTCTQ_IS_PF_Q_M BIT(16) +#define GLDCB_RTCTS(_i) (0x00122340 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLDCB_RTCTS_MAX_INDEX 31 +#define GLDCB_RTCTS_PFCTIMER_S 0 +#define GLDCB_RTCTS_PFCTIMER_M MAKEMASK(0x3FFF, 0) +#define GLRCB_CFG_COTF_CNT(_i) (0x001223D4 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLRCB_CFG_COTF_CNT_MAX_INDEX 7 +#define GLRCB_CFG_COTF_CNT_MRKR_COTF_CNT_S 0 +#define GLRCB_CFG_COTF_CNT_MRKR_COTF_CNT_M MAKEMASK(0x3F, 0) +#define GLRCB_CFG_COTF_ST 0x001223F4 /* Reset Source: CORER */ +#define GLRCB_CFG_COTF_ST_MRKR_COTF_ST_S 0 +#define GLRCB_CFG_COTF_ST_MRKR_COTF_ST_M MAKEMASK(0xFF, 0) +#define GLRPRS_PMCFG_DHW(_i) (0x00200388 + ((_i) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define GLRPRS_PMCFG_DHW_MAX_INDEX 15 +#define GLRPRS_PMCFG_DHW_DHW_S 0 +#define GLRPRS_PMCFG_DHW_DHW_M MAKEMASK(0xFFFFF, 0) +#define GLRPRS_PMCFG_DLW(_i) (0x002003C8 + ((_i) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define GLRPRS_PMCFG_DLW_MAX_INDEX 15 +#define GLRPRS_PMCFG_DLW_DLW_S 0 +#define GLRPRS_PMCFG_DLW_DLW_M MAKEMASK(0xFFFFF, 0) +#define GLRPRS_PMCFG_DPS(_i) (0x00200308 + ((_i) * 4)) /* _i=0...15 */ /* Reset Source: CORER */ +#define GLRPRS_PMCFG_DPS_MAX_INDEX 15 +#define GLRPRS_PMCFG_DPS_DPS_S 0 +#define GLRPRS_PMCFG_DPS_DPS_M MAKEMASK(0xFFFFF, 0) +#define GLRPRS_PMCFG_SHW(_i) (0x00200448 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLRPRS_PMCFG_SHW_MAX_INDEX 7 +#define GLRPRS_PMCFG_SHW_SHW_S 0 +#define GLRPRS_PMCFG_SHW_SHW_M MAKEMASK(0xFFFFF, 0) +#define GLRPRS_PMCFG_SLW(_i) (0x00200468 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLRPRS_PMCFG_SLW_MAX_INDEX 7 +#define GLRPRS_PMCFG_SLW_SLW_S 0 +#define GLRPRS_PMCFG_SLW_SLW_M MAKEMASK(0xFFFFF, 0) +#define GLRPRS_PMCFG_SPS(_i) (0x00200408 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLRPRS_PMCFG_SPS_MAX_INDEX 7 +#define GLRPRS_PMCFG_SPS_SPS_S 0 +#define GLRPRS_PMCFG_SPS_SPS_M MAKEMASK(0xFFFFF, 0) +#define GLRPRS_PMCFG_TC_CFG(_i) (0x00200488 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLRPRS_PMCFG_TC_CFG_MAX_INDEX 31 +#define GLRPRS_PMCFG_TC_CFG_D_POOL_S 0 +#define GLRPRS_PMCFG_TC_CFG_D_POOL_M MAKEMASK(0xF, 0) +#define GLRPRS_PMCFG_TC_CFG_S_POOL_S 16 +#define GLRPRS_PMCFG_TC_CFG_S_POOL_M MAKEMASK(0x7, 16) +#define GLRPRS_PMCFG_TCHW(_i) (0x00200588 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLRPRS_PMCFG_TCHW_MAX_INDEX 31 +#define GLRPRS_PMCFG_TCHW_TCHW_S 0 +#define GLRPRS_PMCFG_TCHW_TCHW_M MAKEMASK(0xFFFFF, 0) +#define GLRPRS_PMCFG_TCLW(_i) (0x00200608 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLRPRS_PMCFG_TCLW_MAX_INDEX 31 +#define GLRPRS_PMCFG_TCLW_TCLW_S 0 +#define GLRPRS_PMCFG_TCLW_TCLW_M MAKEMASK(0xFFFFF, 0) +#define GLSWT_PMCFG_TC_CFG(_i) (0x00204900 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLSWT_PMCFG_TC_CFG_MAX_INDEX 31 +#define GLSWT_PMCFG_TC_CFG_D_POOL_S 0 +#define GLSWT_PMCFG_TC_CFG_D_POOL_M MAKEMASK(0xF, 0) +#define GLSWT_PMCFG_TC_CFG_S_POOL_S 16 +#define GLSWT_PMCFG_TC_CFG_S_POOL_M MAKEMASK(0x7, 16) +#define PRTDCB_RLANPMS 0x00122280 /* Reset Source: CORER */ +#define PRTDCB_RLANPMS_LANRPPM_S 0 +#define PRTDCB_RLANPMS_LANRPPM_M MAKEMASK(0x3FFFF, 0) +#define PRTDCB_RPPMC 0x00122240 /* Reset Source: CORER */ +#define PRTDCB_RPPMC_LANRPPM_S 0 +#define PRTDCB_RPPMC_LANRPPM_M MAKEMASK(0xFF, 0) +#define PRTDCB_RPPMC_RDMARPPM_S 8 +#define PRTDCB_RPPMC_RDMARPPM_M MAKEMASK(0xFF, 8) +#define PRTDCB_RRDMAPMS 0x00122120 /* Reset Source: CORER */ +#define PRTDCB_RRDMAPMS_RDMARPPM_S 0 +#define PRTDCB_RRDMAPMS_RDMARPPM_M MAKEMASK(0x3FFFF, 0) +#define GL_STAT_SWR_BPCH(_i) (0x00347804 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GL_STAT_SWR_BPCH_MAX_INDEX 127 +#define GL_STAT_SWR_BPCH_VLBPCH_S 0 +#define GL_STAT_SWR_BPCH_VLBPCH_M MAKEMASK(0xFF, 0) +#define GL_STAT_SWR_BPCL(_i) (0x00347800 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GL_STAT_SWR_BPCL_MAX_INDEX 127 +#define GL_STAT_SWR_BPCL_VLBPCL_S 0 +#define GL_STAT_SWR_BPCL_VLBPCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_STAT_SWR_GORCH(_i) (0x00342004 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GL_STAT_SWR_GORCH_MAX_INDEX 127 +#define GL_STAT_SWR_GORCH_VLBCH_S 0 +#define GL_STAT_SWR_GORCH_VLBCH_M MAKEMASK(0xFF, 0) +#define GL_STAT_SWR_GORCL(_i) (0x00342000 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GL_STAT_SWR_GORCL_MAX_INDEX 127 +#define GL_STAT_SWR_GORCL_VLBCL_S 0 +#define GL_STAT_SWR_GORCL_VLBCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_STAT_SWR_GOTCH(_i) (0x00304004 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GL_STAT_SWR_GOTCH_MAX_INDEX 127 +#define GL_STAT_SWR_GOTCH_VLBCH_S 0 +#define GL_STAT_SWR_GOTCH_VLBCH_M MAKEMASK(0xFF, 0) +#define GL_STAT_SWR_GOTCL(_i) (0x00304000 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GL_STAT_SWR_GOTCL_MAX_INDEX 127 +#define GL_STAT_SWR_GOTCL_VLBCL_S 0 +#define GL_STAT_SWR_GOTCL_VLBCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_STAT_SWR_MPCH(_i) (0x00347404 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GL_STAT_SWR_MPCH_MAX_INDEX 127 +#define GL_STAT_SWR_MPCH_VLMPCH_S 0 +#define GL_STAT_SWR_MPCH_VLMPCH_M MAKEMASK(0xFF, 0) +#define GL_STAT_SWR_MPCL(_i) (0x00347400 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GL_STAT_SWR_MPCL_MAX_INDEX 127 +#define GL_STAT_SWR_MPCL_VLMPCL_S 0 +#define GL_STAT_SWR_MPCL_VLMPCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_STAT_SWR_UPCH(_i) (0x00347004 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GL_STAT_SWR_UPCH_MAX_INDEX 127 +#define GL_STAT_SWR_UPCH_VLUPCH_S 0 +#define GL_STAT_SWR_UPCH_VLUPCH_M MAKEMASK(0xFF, 0) +#define GL_STAT_SWR_UPCL(_i) (0x00347000 + ((_i) * 8)) /* _i=0...127 */ /* Reset Source: CORER */ +#define GL_STAT_SWR_UPCL_MAX_INDEX 127 +#define GL_STAT_SWR_UPCL_VLUPCL_S 0 +#define GL_STAT_SWR_UPCL_VLUPCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_AORCL(_i) (0x003812C0 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_AORCL_MAX_INDEX 7 +#define GLPRT_AORCL_AORCL_S 0 +#define GLPRT_AORCL_AORCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_BPRCH(_i) (0x00381384 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_BPRCH_MAX_INDEX 7 +#define GLPRT_BPRCH_UPRCH_S 0 +#define GLPRT_BPRCH_UPRCH_M MAKEMASK(0xFF, 0) +#define GLPRT_BPRCL(_i) (0x00381380 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_BPRCL_MAX_INDEX 7 +#define GLPRT_BPRCL_UPRCH_S 0 +#define GLPRT_BPRCL_UPRCH_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_BPTCH(_i) (0x00381244 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_BPTCH_MAX_INDEX 7 +#define GLPRT_BPTCH_UPRCH_S 0 +#define GLPRT_BPTCH_UPRCH_M MAKEMASK(0xFF, 0) +#define GLPRT_BPTCL(_i) (0x00381240 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_BPTCL_MAX_INDEX 7 +#define GLPRT_BPTCL_UPRCH_S 0 +#define GLPRT_BPTCL_UPRCH_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_CRCERRS(_i) (0x00380100 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_CRCERRS_MAX_INDEX 7 +#define GLPRT_CRCERRS_CRCERRS_S 0 +#define GLPRT_CRCERRS_CRCERRS_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_CRCERRS_H(_i) (0x00380104 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_CRCERRS_H_MAX_INDEX 7 +#define GLPRT_CRCERRS_H_CRCERRS_S 0 +#define GLPRT_CRCERRS_H_CRCERRS_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_GORCH(_i) (0x00380004 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_GORCH_MAX_INDEX 7 +#define GLPRT_GORCH_GORCH_S 0 +#define GLPRT_GORCH_GORCH_M MAKEMASK(0xFF, 0) +#define GLPRT_GORCL(_i) (0x00380000 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_GORCL_MAX_INDEX 7 +#define GLPRT_GORCL_GORCL_S 0 +#define GLPRT_GORCL_GORCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_GOTCH(_i) (0x00380B44 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_GOTCH_MAX_INDEX 7 +#define GLPRT_GOTCH_GOTCH_S 0 +#define GLPRT_GOTCH_GOTCH_M MAKEMASK(0xFF, 0) +#define GLPRT_GOTCL(_i) (0x00380B40 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_GOTCL_MAX_INDEX 7 +#define GLPRT_GOTCL_GOTCL_S 0 +#define GLPRT_GOTCL_GOTCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_ILLERRC(_i) (0x003801C0 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_ILLERRC_MAX_INDEX 7 +#define GLPRT_ILLERRC_ILLERRC_S 0 +#define GLPRT_ILLERRC_ILLERRC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_ILLERRC_H(_i) (0x003801C4 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_ILLERRC_H_MAX_INDEX 7 +#define GLPRT_ILLERRC_H_ILLERRC_S 0 +#define GLPRT_ILLERRC_H_ILLERRC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_LXOFFRXC(_i) (0x003802C0 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_LXOFFRXC_MAX_INDEX 7 +#define GLPRT_LXOFFRXC_LXOFFRXCNT_S 0 +#define GLPRT_LXOFFRXC_LXOFFRXCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_LXOFFRXC_H(_i) (0x003802C4 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_LXOFFRXC_H_MAX_INDEX 7 +#define GLPRT_LXOFFRXC_H_LXOFFRXCNT_S 0 +#define GLPRT_LXOFFRXC_H_LXOFFRXCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_LXOFFTXC(_i) (0x00381180 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_LXOFFTXC_MAX_INDEX 7 +#define GLPRT_LXOFFTXC_LXOFFTXC_S 0 +#define GLPRT_LXOFFTXC_LXOFFTXC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_LXOFFTXC_H(_i) (0x00381184 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_LXOFFTXC_H_MAX_INDEX 7 +#define GLPRT_LXOFFTXC_H_LXOFFTXC_S 0 +#define GLPRT_LXOFFTXC_H_LXOFFTXC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_LXONRXC(_i) (0x00380280 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_LXONRXC_MAX_INDEX 7 +#define GLPRT_LXONRXC_LXONRXCNT_S 0 +#define GLPRT_LXONRXC_LXONRXCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_LXONRXC_H(_i) (0x00380284 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_LXONRXC_H_MAX_INDEX 7 +#define GLPRT_LXONRXC_H_LXONRXCNT_S 0 +#define GLPRT_LXONRXC_H_LXONRXCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_LXONTXC(_i) (0x00381140 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_LXONTXC_MAX_INDEX 7 +#define GLPRT_LXONTXC_LXONTXC_S 0 +#define GLPRT_LXONTXC_LXONTXC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_LXONTXC_H(_i) (0x00381144 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_LXONTXC_H_MAX_INDEX 7 +#define GLPRT_LXONTXC_H_LXONTXC_S 0 +#define GLPRT_LXONTXC_H_LXONTXC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_MLFC(_i) (0x00380040 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_MLFC_MAX_INDEX 7 +#define GLPRT_MLFC_MLFC_S 0 +#define GLPRT_MLFC_MLFC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_MLFC_H(_i) (0x00380044 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_MLFC_H_MAX_INDEX 7 +#define GLPRT_MLFC_H_MLFC_S 0 +#define GLPRT_MLFC_H_MLFC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_MPRCH(_i) (0x00381344 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_MPRCH_MAX_INDEX 7 +#define GLPRT_MPRCH_MPRCH_S 0 +#define GLPRT_MPRCH_MPRCH_M MAKEMASK(0xFF, 0) +#define GLPRT_MPRCL(_i) (0x00381340 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_MPRCL_MAX_INDEX 7 +#define GLPRT_MPRCL_MPRCL_S 0 +#define GLPRT_MPRCL_MPRCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_MPTCH(_i) (0x00381204 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_MPTCH_MAX_INDEX 7 +#define GLPRT_MPTCH_MPTCH_S 0 +#define GLPRT_MPTCH_MPTCH_M MAKEMASK(0xFF, 0) +#define GLPRT_MPTCL(_i) (0x00381200 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_MPTCL_MAX_INDEX 7 +#define GLPRT_MPTCL_MPTCL_S 0 +#define GLPRT_MPTCL_MPTCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_MRFC(_i) (0x00380080 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_MRFC_MAX_INDEX 7 +#define GLPRT_MRFC_MRFC_S 0 +#define GLPRT_MRFC_MRFC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_MRFC_H(_i) (0x00380084 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_MRFC_H_MAX_INDEX 7 +#define GLPRT_MRFC_H_MRFC_S 0 +#define GLPRT_MRFC_H_MRFC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PRC1023H(_i) (0x00380A04 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PRC1023H_MAX_INDEX 7 +#define GLPRT_PRC1023H_PRC1023H_S 0 +#define GLPRT_PRC1023H_PRC1023H_M MAKEMASK(0xFF, 0) +#define GLPRT_PRC1023L(_i) (0x00380A00 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PRC1023L_MAX_INDEX 7 +#define GLPRT_PRC1023L_PRC1023L_S 0 +#define GLPRT_PRC1023L_PRC1023L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PRC127H(_i) (0x00380944 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PRC127H_MAX_INDEX 7 +#define GLPRT_PRC127H_PRC127H_S 0 +#define GLPRT_PRC127H_PRC127H_M MAKEMASK(0xFF, 0) +#define GLPRT_PRC127L(_i) (0x00380940 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PRC127L_MAX_INDEX 7 +#define GLPRT_PRC127L_PRC127L_S 0 +#define GLPRT_PRC127L_PRC127L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PRC1522H(_i) (0x00380A44 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PRC1522H_MAX_INDEX 7 +#define GLPRT_PRC1522H_PRC1522H_S 0 +#define GLPRT_PRC1522H_PRC1522H_M MAKEMASK(0xFF, 0) +#define GLPRT_PRC1522L(_i) (0x00380A40 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PRC1522L_MAX_INDEX 7 +#define GLPRT_PRC1522L_PRC1522L_S 0 +#define GLPRT_PRC1522L_PRC1522L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PRC255H(_i) (0x00380984 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PRC255H_MAX_INDEX 7 +#define GLPRT_PRC255H_PRTPRC255H_S 0 +#define GLPRT_PRC255H_PRTPRC255H_M MAKEMASK(0xFF, 0) +#define GLPRT_PRC255L(_i) (0x00380980 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PRC255L_MAX_INDEX 7 +#define GLPRT_PRC255L_PRC255L_S 0 +#define GLPRT_PRC255L_PRC255L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PRC511H(_i) (0x003809C4 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PRC511H_MAX_INDEX 7 +#define GLPRT_PRC511H_PRC511H_S 0 +#define GLPRT_PRC511H_PRC511H_M MAKEMASK(0xFF, 0) +#define GLPRT_PRC511L(_i) (0x003809C0 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PRC511L_MAX_INDEX 7 +#define GLPRT_PRC511L_PRC511L_S 0 +#define GLPRT_PRC511L_PRC511L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PRC64H(_i) (0x00380904 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PRC64H_MAX_INDEX 7 +#define GLPRT_PRC64H_PRC64H_S 0 +#define GLPRT_PRC64H_PRC64H_M MAKEMASK(0xFF, 0) +#define GLPRT_PRC64L(_i) (0x00380900 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PRC64L_MAX_INDEX 7 +#define GLPRT_PRC64L_PRC64L_S 0 +#define GLPRT_PRC64L_PRC64L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PRC9522H(_i) (0x00380A84 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PRC9522H_MAX_INDEX 7 +#define GLPRT_PRC9522H_PRC1522H_S 0 +#define GLPRT_PRC9522H_PRC1522H_M MAKEMASK(0xFF, 0) +#define GLPRT_PRC9522L(_i) (0x00380A80 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PRC9522L_MAX_INDEX 7 +#define GLPRT_PRC9522L_PRC1522L_S 0 +#define GLPRT_PRC9522L_PRC1522L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PTC1023H(_i) (0x00380C84 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PTC1023H_MAX_INDEX 7 +#define GLPRT_PTC1023H_PTC1023H_S 0 +#define GLPRT_PTC1023H_PTC1023H_M MAKEMASK(0xFF, 0) +#define GLPRT_PTC1023L(_i) (0x00380C80 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PTC1023L_MAX_INDEX 7 +#define GLPRT_PTC1023L_PTC1023L_S 0 +#define GLPRT_PTC1023L_PTC1023L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PTC127H(_i) (0x00380BC4 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PTC127H_MAX_INDEX 7 +#define GLPRT_PTC127H_PTC127H_S 0 +#define GLPRT_PTC127H_PTC127H_M MAKEMASK(0xFF, 0) +#define GLPRT_PTC127L(_i) (0x00380BC0 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PTC127L_MAX_INDEX 7 +#define GLPRT_PTC127L_PTC127L_S 0 +#define GLPRT_PTC127L_PTC127L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PTC1522H(_i) (0x00380CC4 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PTC1522H_MAX_INDEX 7 +#define GLPRT_PTC1522H_PTC1522H_S 0 +#define GLPRT_PTC1522H_PTC1522H_M MAKEMASK(0xFF, 0) +#define GLPRT_PTC1522L(_i) (0x00380CC0 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PTC1522L_MAX_INDEX 7 +#define GLPRT_PTC1522L_PTC1522L_S 0 +#define GLPRT_PTC1522L_PTC1522L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PTC255H(_i) (0x00380C04 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PTC255H_MAX_INDEX 7 +#define GLPRT_PTC255H_PTC255H_S 0 +#define GLPRT_PTC255H_PTC255H_M MAKEMASK(0xFF, 0) +#define GLPRT_PTC255L(_i) (0x00380C00 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PTC255L_MAX_INDEX 7 +#define GLPRT_PTC255L_PTC255L_S 0 +#define GLPRT_PTC255L_PTC255L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PTC511H(_i) (0x00380C44 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PTC511H_MAX_INDEX 7 +#define GLPRT_PTC511H_PTC511H_S 0 +#define GLPRT_PTC511H_PTC511H_M MAKEMASK(0xFF, 0) +#define GLPRT_PTC511L(_i) (0x00380C40 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PTC511L_MAX_INDEX 7 +#define GLPRT_PTC511L_PTC511L_S 0 +#define GLPRT_PTC511L_PTC511L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PTC64H(_i) (0x00380B84 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PTC64H_MAX_INDEX 7 +#define GLPRT_PTC64H_PTC64H_S 0 +#define GLPRT_PTC64H_PTC64H_M MAKEMASK(0xFF, 0) +#define GLPRT_PTC64L(_i) (0x00380B80 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PTC64L_MAX_INDEX 7 +#define GLPRT_PTC64L_PTC64L_S 0 +#define GLPRT_PTC64L_PTC64L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PTC9522H(_i) (0x00380D04 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PTC9522H_MAX_INDEX 7 +#define GLPRT_PTC9522H_PTC9522H_S 0 +#define GLPRT_PTC9522H_PTC9522H_M MAKEMASK(0xFF, 0) +#define GLPRT_PTC9522L(_i) (0x00380D00 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PTC9522L_MAX_INDEX 7 +#define GLPRT_PTC9522L_PTC9522L_S 0 +#define GLPRT_PTC9522L_PTC9522L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PXOFFRXC(_i, _j) (0x00380500 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PXOFFRXC_MAX_INDEX 7 +#define GLPRT_PXOFFRXC_PRPXOFFRXCNT_S 0 +#define GLPRT_PXOFFRXC_PRPXOFFRXCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PXOFFRXC_H(_i, _j) (0x00380504 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PXOFFRXC_H_MAX_INDEX 7 +#define GLPRT_PXOFFRXC_H_PRPXOFFRXCNT_S 0 +#define GLPRT_PXOFFRXC_H_PRPXOFFRXCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PXOFFTXC(_i, _j) (0x00380F40 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PXOFFTXC_MAX_INDEX 7 +#define GLPRT_PXOFFTXC_PRPXOFFTXCNT_S 0 +#define GLPRT_PXOFFTXC_PRPXOFFTXCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PXOFFTXC_H(_i, _j) (0x00380F44 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PXOFFTXC_H_MAX_INDEX 7 +#define GLPRT_PXOFFTXC_H_PRPXOFFTXCNT_S 0 +#define GLPRT_PXOFFTXC_H_PRPXOFFTXCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PXONRXC(_i, _j) (0x00380300 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PXONRXC_MAX_INDEX 7 +#define GLPRT_PXONRXC_PRPXONRXCNT_S 0 +#define GLPRT_PXONRXC_PRPXONRXCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PXONRXC_H(_i, _j) (0x00380304 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PXONRXC_H_MAX_INDEX 7 +#define GLPRT_PXONRXC_H_PRPXONRXCNT_S 0 +#define GLPRT_PXONRXC_H_PRPXONRXCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PXONTXC(_i, _j) (0x00380D40 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PXONTXC_MAX_INDEX 7 +#define GLPRT_PXONTXC_PRPXONTXC_S 0 +#define GLPRT_PXONTXC_PRPXONTXC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_PXONTXC_H(_i, _j) (0x00380D44 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...7 */ /* Reset Source: CORER */ +#define GLPRT_PXONTXC_H_MAX_INDEX 7 +#define GLPRT_PXONTXC_H_PRPXONTXC_S 0 +#define GLPRT_PXONTXC_H_PRPXONTXC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_RFC(_i) (0x00380AC0 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_RFC_MAX_INDEX 7 +#define GLPRT_RFC_RFC_S 0 +#define GLPRT_RFC_RFC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_RFC_H(_i) (0x00380AC4 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_RFC_H_MAX_INDEX 7 +#define GLPRT_RFC_H_RFC_S 0 +#define GLPRT_RFC_H_RFC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_RJC(_i) (0x00380B00 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_RJC_MAX_INDEX 7 +#define GLPRT_RJC_RJC_S 0 +#define GLPRT_RJC_RJC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_RJC_H(_i) (0x00380B04 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_RJC_H_MAX_INDEX 7 +#define GLPRT_RJC_H_RJC_S 0 +#define GLPRT_RJC_H_RJC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_RLEC(_i) (0x00380140 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_RLEC_MAX_INDEX 7 +#define GLPRT_RLEC_RLEC_S 0 +#define GLPRT_RLEC_RLEC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_RLEC_H(_i) (0x00380144 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_RLEC_H_MAX_INDEX 7 +#define GLPRT_RLEC_H_RLEC_S 0 +#define GLPRT_RLEC_H_RLEC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_ROC(_i) (0x00380240 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_ROC_MAX_INDEX 7 +#define GLPRT_ROC_ROC_S 0 +#define GLPRT_ROC_ROC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_ROC_H(_i) (0x00380244 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_ROC_H_MAX_INDEX 7 +#define GLPRT_ROC_H_ROC_S 0 +#define GLPRT_ROC_H_ROC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_RUC(_i) (0x00380200 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_RUC_MAX_INDEX 7 +#define GLPRT_RUC_RUC_S 0 +#define GLPRT_RUC_RUC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_RUC_H(_i) (0x00380204 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_RUC_H_MAX_INDEX 7 +#define GLPRT_RUC_H_RUC_S 0 +#define GLPRT_RUC_H_RUC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_RXON2OFFCNT(_i, _j) (0x00380700 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...7 */ /* Reset Source: CORER */ +#define GLPRT_RXON2OFFCNT_MAX_INDEX 7 +#define GLPRT_RXON2OFFCNT_PRRXON2OFFCNT_S 0 +#define GLPRT_RXON2OFFCNT_PRRXON2OFFCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_RXON2OFFCNT_H(_i, _j) (0x00380704 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...7 */ /* Reset Source: CORER */ +#define GLPRT_RXON2OFFCNT_H_MAX_INDEX 7 +#define GLPRT_RXON2OFFCNT_H_PRRXON2OFFCNT_S 0 +#define GLPRT_RXON2OFFCNT_H_PRRXON2OFFCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_STDC(_i) (0x00340000 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_STDC_MAX_INDEX 7 +#define GLPRT_STDC_STDC_S 0 +#define GLPRT_STDC_STDC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_TDOLD(_i) (0x00381280 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_TDOLD_MAX_INDEX 7 +#define GLPRT_TDOLD_GLPRT_TDOLD_S 0 +#define GLPRT_TDOLD_GLPRT_TDOLD_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_TDOLD_H(_i) (0x00381284 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_TDOLD_H_MAX_INDEX 7 +#define GLPRT_TDOLD_H_GLPRT_TDOLD_S 0 +#define GLPRT_TDOLD_H_GLPRT_TDOLD_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_UPRCH(_i) (0x00381304 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_UPRCH_MAX_INDEX 7 +#define GLPRT_UPRCH_UPRCH_S 0 +#define GLPRT_UPRCH_UPRCH_M MAKEMASK(0xFF, 0) +#define GLPRT_UPRCL(_i) (0x00381300 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_UPRCL_MAX_INDEX 7 +#define GLPRT_UPRCL_UPRCL_S 0 +#define GLPRT_UPRCL_UPRCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPRT_UPTCH(_i) (0x003811C4 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_UPTCH_MAX_INDEX 7 +#define GLPRT_UPTCH_UPTCH_S 0 +#define GLPRT_UPTCH_UPTCH_M MAKEMASK(0xFF, 0) +#define GLPRT_UPTCL(_i) (0x003811C0 + ((_i) * 8)) /* _i=0...7 */ /* Reset Source: CORER */ +#define GLPRT_UPTCL_MAX_INDEX 7 +#define GLPRT_UPTCL_VUPTCH_S 0 +#define GLPRT_UPTCL_VUPTCH_M MAKEMASK(0xFFFFFFFF, 0) +#define GLSTAT_ACL_CNT_0_H(_i) (0x00388004 + ((_i) * 8)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLSTAT_ACL_CNT_0_H_MAX_INDEX 511 +#define GLSTAT_ACL_CNT_0_H_CNT_MSB_S 0 +#define GLSTAT_ACL_CNT_0_H_CNT_MSB_M MAKEMASK(0xFF, 0) +#define GLSTAT_ACL_CNT_0_L(_i) (0x00388000 + ((_i) * 8)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLSTAT_ACL_CNT_0_L_MAX_INDEX 511 +#define GLSTAT_ACL_CNT_0_L_CNT_LSB_S 0 +#define GLSTAT_ACL_CNT_0_L_CNT_LSB_M MAKEMASK(0xFFFFFFFF, 0) +#define GLSTAT_ACL_CNT_1_H(_i) (0x00389004 + ((_i) * 8)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLSTAT_ACL_CNT_1_H_MAX_INDEX 511 +#define GLSTAT_ACL_CNT_1_H_CNT_MSB_S 0 +#define GLSTAT_ACL_CNT_1_H_CNT_MSB_M MAKEMASK(0xFF, 0) +#define GLSTAT_ACL_CNT_1_L(_i) (0x00389000 + ((_i) * 8)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLSTAT_ACL_CNT_1_L_MAX_INDEX 511 +#define GLSTAT_ACL_CNT_1_L_CNT_LSB_S 0 +#define GLSTAT_ACL_CNT_1_L_CNT_LSB_M MAKEMASK(0xFFFFFFFF, 0) +#define GLSTAT_ACL_CNT_2_H(_i) (0x0038A004 + ((_i) * 8)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLSTAT_ACL_CNT_2_H_MAX_INDEX 511 +#define GLSTAT_ACL_CNT_2_H_CNT_MSB_S 0 +#define GLSTAT_ACL_CNT_2_H_CNT_MSB_M MAKEMASK(0xFF, 0) +#define GLSTAT_ACL_CNT_2_L(_i) (0x0038A000 + ((_i) * 8)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLSTAT_ACL_CNT_2_L_MAX_INDEX 511 +#define GLSTAT_ACL_CNT_2_L_CNT_LSB_S 0 +#define GLSTAT_ACL_CNT_2_L_CNT_LSB_M MAKEMASK(0xFFFFFFFF, 0) +#define GLSTAT_ACL_CNT_3_H(_i) (0x0038B004 + ((_i) * 8)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLSTAT_ACL_CNT_3_H_MAX_INDEX 511 +#define GLSTAT_ACL_CNT_3_H_CNT_MSB_S 0 +#define GLSTAT_ACL_CNT_3_H_CNT_MSB_M MAKEMASK(0xFF, 0) +#define GLSTAT_ACL_CNT_3_L(_i) (0x0038B000 + ((_i) * 8)) /* _i=0...511 */ /* Reset Source: CORER */ +#define GLSTAT_ACL_CNT_3_L_MAX_INDEX 511 +#define GLSTAT_ACL_CNT_3_L_CNT_LSB_S 0 +#define GLSTAT_ACL_CNT_3_L_CNT_LSB_M MAKEMASK(0xFFFFFFFF, 0) +#define GLSTAT_FD_CNT0H(_i) (0x003A0004 + ((_i) * 8)) /* _i=0...4095 */ /* Reset Source: CORER */ +#define GLSTAT_FD_CNT0H_MAX_INDEX 4095 +#define GLSTAT_FD_CNT0H_FD0_CNT_H_S 0 +#define GLSTAT_FD_CNT0H_FD0_CNT_H_M MAKEMASK(0xFF, 0) +#define GLSTAT_FD_CNT0L(_i) (0x003A0000 + ((_i) * 8)) /* _i=0...4095 */ /* Reset Source: CORER */ +#define GLSTAT_FD_CNT0L_MAX_INDEX 4095 +#define GLSTAT_FD_CNT0L_FD0_CNT_L_S 0 +#define GLSTAT_FD_CNT0L_FD0_CNT_L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLSTAT_FD_CNT1H(_i) (0x003A8004 + ((_i) * 8)) /* _i=0...4095 */ /* Reset Source: CORER */ +#define GLSTAT_FD_CNT1H_MAX_INDEX 4095 +#define GLSTAT_FD_CNT1H_FD0_CNT_H_S 0 +#define GLSTAT_FD_CNT1H_FD0_CNT_H_M MAKEMASK(0xFF, 0) +#define GLSTAT_FD_CNT1L(_i) (0x003A8000 + ((_i) * 8)) /* _i=0...4095 */ /* Reset Source: CORER */ +#define GLSTAT_FD_CNT1L_MAX_INDEX 4095 +#define GLSTAT_FD_CNT1L_FD0_CNT_L_S 0 +#define GLSTAT_FD_CNT1L_FD0_CNT_L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLSW_BPRCH(_i) (0x00346204 + ((_i) * 8)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLSW_BPRCH_MAX_INDEX 31 +#define GLSW_BPRCH_BPRCH_S 0 +#define GLSW_BPRCH_BPRCH_M MAKEMASK(0xFF, 0) +#define GLSW_BPRCL(_i) (0x00346200 + ((_i) * 8)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLSW_BPRCL_MAX_INDEX 31 +#define GLSW_BPRCL_BPRCL_S 0 +#define GLSW_BPRCL_BPRCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLSW_BPTCH(_i) (0x00310204 + ((_i) * 8)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLSW_BPTCH_MAX_INDEX 31 +#define GLSW_BPTCH_BPTCH_S 0 +#define GLSW_BPTCH_BPTCH_M MAKEMASK(0xFF, 0) +#define GLSW_BPTCL(_i) (0x00310200 + ((_i) * 8)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLSW_BPTCL_MAX_INDEX 31 +#define GLSW_BPTCL_BPTCL_S 0 +#define GLSW_BPTCL_BPTCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLSW_GORCH(_i) (0x00341004 + ((_i) * 8)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLSW_GORCH_MAX_INDEX 31 +#define GLSW_GORCH_GORCH_S 0 +#define GLSW_GORCH_GORCH_M MAKEMASK(0xFF, 0) +#define GLSW_GORCL(_i) (0x00341000 + ((_i) * 8)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLSW_GORCL_MAX_INDEX 31 +#define GLSW_GORCL_GORCL_S 0 +#define GLSW_GORCL_GORCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLSW_GOTCH(_i) (0x00302004 + ((_i) * 8)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLSW_GOTCH_MAX_INDEX 31 +#define GLSW_GOTCH_GOTCH_S 0 +#define GLSW_GOTCH_GOTCH_M MAKEMASK(0xFF, 0) +#define GLSW_GOTCL(_i) (0x00302000 + ((_i) * 8)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLSW_GOTCL_MAX_INDEX 31 +#define GLSW_GOTCL_GOTCL_S 0 +#define GLSW_GOTCL_GOTCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLSW_MPRCH(_i) (0x00346104 + ((_i) * 8)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLSW_MPRCH_MAX_INDEX 31 +#define GLSW_MPRCH_MPRCH_S 0 +#define GLSW_MPRCH_MPRCH_M MAKEMASK(0xFF, 0) +#define GLSW_MPRCL(_i) (0x00346100 + ((_i) * 8)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLSW_MPRCL_MAX_INDEX 31 +#define GLSW_MPRCL_MPRCL_S 0 +#define GLSW_MPRCL_MPRCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLSW_MPTCH(_i) (0x00310104 + ((_i) * 8)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLSW_MPTCH_MAX_INDEX 31 +#define GLSW_MPTCH_MPTCH_S 0 +#define GLSW_MPTCH_MPTCH_M MAKEMASK(0xFF, 0) +#define GLSW_MPTCL(_i) (0x00310100 + ((_i) * 8)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLSW_MPTCL_MAX_INDEX 31 +#define GLSW_MPTCL_MPTCL_S 0 +#define GLSW_MPTCL_MPTCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLSW_UPRCH(_i) (0x00346004 + ((_i) * 8)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLSW_UPRCH_MAX_INDEX 31 +#define GLSW_UPRCH_UPRCH_S 0 +#define GLSW_UPRCH_UPRCH_M MAKEMASK(0xFF, 0) +#define GLSW_UPRCL(_i) (0x00346000 + ((_i) * 8)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLSW_UPRCL_MAX_INDEX 31 +#define GLSW_UPRCL_UPRCL_S 0 +#define GLSW_UPRCL_UPRCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLSW_UPTCH(_i) (0x00310004 + ((_i) * 8)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLSW_UPTCH_MAX_INDEX 31 +#define GLSW_UPTCH_UPTCH_S 0 +#define GLSW_UPTCH_UPTCH_M MAKEMASK(0xFF, 0) +#define GLSW_UPTCL(_i) (0x00310000 + ((_i) * 8)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GLSW_UPTCL_MAX_INDEX 31 +#define GLSW_UPTCL_UPTCL_S 0 +#define GLSW_UPTCL_UPTCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLSWID_RUPP(_i) (0x00345000 + ((_i) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define GLSWID_RUPP_MAX_INDEX 255 +#define GLSWID_RUPP_RUPP_S 0 +#define GLSWID_RUPP_RUPP_M MAKEMASK(0xFFFFFFFF, 0) +#define GLV_BPRCH(_i) (0x003B6004 + ((_i) * 8)) /* _i=0...767 */ /* Reset Source: CORER */ +#define GLV_BPRCH_MAX_INDEX 767 +#define GLV_BPRCH_BPRCH_S 0 +#define GLV_BPRCH_BPRCH_M MAKEMASK(0xFF, 0) +#define GLV_BPRCL(_i) (0x003B6000 + ((_i) * 8)) /* _i=0...767 */ /* Reset Source: CORER */ +#define GLV_BPRCL_MAX_INDEX 767 +#define GLV_BPRCL_BPRCL_S 0 +#define GLV_BPRCL_BPRCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLV_BPTCH(_i) (0x0030E004 + ((_i) * 8)) /* _i=0...767 */ /* Reset Source: CORER */ +#define GLV_BPTCH_MAX_INDEX 767 +#define GLV_BPTCH_BPTCH_S 0 +#define GLV_BPTCH_BPTCH_M MAKEMASK(0xFF, 0) +#define GLV_BPTCL(_i) (0x0030E000 + ((_i) * 8)) /* _i=0...767 */ /* Reset Source: CORER */ +#define GLV_BPTCL_MAX_INDEX 767 +#define GLV_BPTCL_BPTCL_S 0 +#define GLV_BPTCL_BPTCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLV_GORCH(_i) (0x003B0004 + ((_i) * 8)) /* _i=0...767 */ /* Reset Source: CORER */ +#define GLV_GORCH_MAX_INDEX 767 +#define GLV_GORCH_GORCH_S 0 +#define GLV_GORCH_GORCH_M MAKEMASK(0xFF, 0) +#define GLV_GORCL(_i) (0x003B0000 + ((_i) * 8)) /* _i=0...767 */ /* Reset Source: CORER */ +#define GLV_GORCL_MAX_INDEX 767 +#define GLV_GORCL_GORCL_S 0 +#define GLV_GORCL_GORCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLV_GOTCH(_i) (0x00300004 + ((_i) * 8)) /* _i=0...767 */ /* Reset Source: CORER */ +#define GLV_GOTCH_MAX_INDEX 767 +#define GLV_GOTCH_GOTCH_S 0 +#define GLV_GOTCH_GOTCH_M MAKEMASK(0xFF, 0) +#define GLV_GOTCL(_i) (0x00300000 + ((_i) * 8)) /* _i=0...767 */ /* Reset Source: CORER */ +#define GLV_GOTCL_MAX_INDEX 767 +#define GLV_GOTCL_GOTCL_S 0 +#define GLV_GOTCL_GOTCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLV_MPRCH(_i) (0x003B4004 + ((_i) * 8)) /* _i=0...767 */ /* Reset Source: CORER */ +#define GLV_MPRCH_MAX_INDEX 767 +#define GLV_MPRCH_MPRCH_S 0 +#define GLV_MPRCH_MPRCH_M MAKEMASK(0xFF, 0) +#define GLV_MPRCL(_i) (0x003B4000 + ((_i) * 8)) /* _i=0...767 */ /* Reset Source: CORER */ +#define GLV_MPRCL_MAX_INDEX 767 +#define GLV_MPRCL_MPRCL_S 0 +#define GLV_MPRCL_MPRCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLV_MPTCH(_i) (0x0030C004 + ((_i) * 8)) /* _i=0...767 */ /* Reset Source: CORER */ +#define GLV_MPTCH_MAX_INDEX 767 +#define GLV_MPTCH_MPTCH_S 0 +#define GLV_MPTCH_MPTCH_M MAKEMASK(0xFF, 0) +#define GLV_MPTCL(_i) (0x0030C000 + ((_i) * 8)) /* _i=0...767 */ /* Reset Source: CORER */ +#define GLV_MPTCL_MAX_INDEX 767 +#define GLV_MPTCL_MPTCL_S 0 +#define GLV_MPTCL_MPTCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLV_RDPC(_i) (0x00294C04 + ((_i) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define GLV_RDPC_MAX_INDEX 767 +#define GLV_RDPC_RDPC_S 0 +#define GLV_RDPC_RDPC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLV_REPC(_i) (0x00295804 + ((_i) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define GLV_REPC_MAX_INDEX 767 +#define GLV_REPC_NO_DESC_CNT_S 0 +#define GLV_REPC_NO_DESC_CNT_M MAKEMASK(0xFFFF, 0) +#define GLV_REPC_ERROR_CNT_S 16 +#define GLV_REPC_ERROR_CNT_M MAKEMASK(0xFFFF, 16) +#define GLV_TEPC(_VSI) (0x00312000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define GLV_TEPC_MAX_INDEX 767 +#define GLV_TEPC_TEPC_S 0 +#define GLV_TEPC_TEPC_M MAKEMASK(0xFFFFFFFF, 0) +#define GLV_UPRCH(_i) (0x003B2004 + ((_i) * 8)) /* _i=0...767 */ /* Reset Source: CORER */ +#define GLV_UPRCH_MAX_INDEX 767 +#define GLV_UPRCH_UPRCH_S 0 +#define GLV_UPRCH_UPRCH_M MAKEMASK(0xFF, 0) +#define GLV_UPRCL(_i) (0x003B2000 + ((_i) * 8)) /* _i=0...767 */ /* Reset Source: CORER */ +#define GLV_UPRCL_MAX_INDEX 767 +#define GLV_UPRCL_UPRCL_S 0 +#define GLV_UPRCL_UPRCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLV_UPTCH(_i) (0x0030A004 + ((_i) * 8)) /* _i=0...767 */ /* Reset Source: CORER */ +#define GLV_UPTCH_MAX_INDEX 767 +#define GLV_UPTCH_GLVUPTCH_S 0 +#define GLV_UPTCH_GLVUPTCH_M MAKEMASK(0xFF, 0) +#define GLV_UPTCL(_i) (0x0030A000 + ((_i) * 8)) /* _i=0...767 */ /* Reset Source: CORER */ +#define GLV_UPTCL_MAX_INDEX 767 +#define GLV_UPTCL_UPTCL_S 0 +#define GLV_UPTCL_UPTCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLVEBUP_RBCH(_i, _j) (0x00343004 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...31 */ /* Reset Source: CORER */ +#define GLVEBUP_RBCH_MAX_INDEX 7 +#define GLVEBUP_RBCH_UPBCH_S 0 +#define GLVEBUP_RBCH_UPBCH_M MAKEMASK(0xFF, 0) +#define GLVEBUP_RBCL(_i, _j) (0x00343000 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...31 */ /* Reset Source: CORER */ +#define GLVEBUP_RBCL_MAX_INDEX 7 +#define GLVEBUP_RBCL_UPBCL_S 0 +#define GLVEBUP_RBCL_UPBCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLVEBUP_RPCH(_i, _j) (0x00344004 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...31 */ /* Reset Source: CORER */ +#define GLVEBUP_RPCH_MAX_INDEX 7 +#define GLVEBUP_RPCH_UPPCH_S 0 +#define GLVEBUP_RPCH_UPPCH_M MAKEMASK(0xFF, 0) +#define GLVEBUP_RPCL(_i, _j) (0x00344000 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...31 */ /* Reset Source: CORER */ +#define GLVEBUP_RPCL_MAX_INDEX 7 +#define GLVEBUP_RPCL_UPPCL_S 0 +#define GLVEBUP_RPCL_UPPCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLVEBUP_TBCH(_i, _j) (0x00306004 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...31 */ /* Reset Source: CORER */ +#define GLVEBUP_TBCH_MAX_INDEX 7 +#define GLVEBUP_TBCH_UPBCH_S 0 +#define GLVEBUP_TBCH_UPBCH_M MAKEMASK(0xFF, 0) +#define GLVEBUP_TBCL(_i, _j) (0x00306000 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...31 */ /* Reset Source: CORER */ +#define GLVEBUP_TBCL_MAX_INDEX 7 +#define GLVEBUP_TBCL_UPBCL_S 0 +#define GLVEBUP_TBCL_UPBCL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLVEBUP_TPCH(_i, _j) (0x00308004 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...31 */ /* Reset Source: CORER */ +#define GLVEBUP_TPCH_MAX_INDEX 7 +#define GLVEBUP_TPCH_UPPCH_S 0 +#define GLVEBUP_TPCH_UPPCH_M MAKEMASK(0xFF, 0) +#define GLVEBUP_TPCL(_i, _j) (0x00308000 + ((_i) * 8 + (_j) * 64)) /* _i=0...7, _j=0...31 */ /* Reset Source: CORER */ +#define GLVEBUP_TPCL_MAX_INDEX 7 +#define GLVEBUP_TPCL_UPPCL_S 0 +#define GLVEBUP_TPCL_UPPCL_M MAKEMASK(0xFFFFFFFF, 0) +#define PRTRPB_LDPC 0x000AC280 /* Reset Source: CORER */ +#define PRTRPB_LDPC_CRCERRS_S 0 +#define PRTRPB_LDPC_CRCERRS_M MAKEMASK(0xFFFFFFFF, 0) +#define PRTRPB_RDPC 0x000AC260 /* Reset Source: CORER */ +#define PRTRPB_RDPC_CRCERRS_S 0 +#define PRTRPB_RDPC_CRCERRS_M MAKEMASK(0xFFFFFFFF, 0) +#define PRTTPB_STAT_TC_BYTES_SENTL(_i) (0x00098200 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: CORER */ +#define PRTTPB_STAT_TC_BYTES_SENTL_MAX_INDEX 63 +#define PRTTPB_STAT_TC_BYTES_SENTL_TCCNT_S 0 +#define PRTTPB_STAT_TC_BYTES_SENTL_TCCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define TPB_PRTTPB_STAT_PKT_SENT(_i) (0x00099470 + ((_i) * 4)) /* _i=0...7 */ /* Reset Source: CORER */ +#define TPB_PRTTPB_STAT_PKT_SENT_MAX_INDEX 7 +#define TPB_PRTTPB_STAT_PKT_SENT_PKTCNT_S 0 +#define TPB_PRTTPB_STAT_PKT_SENT_PKTCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define TPB_PRTTPB_STAT_TC_BYTES_SENT(_i) (0x00099094 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: CORER */ +#define TPB_PRTTPB_STAT_TC_BYTES_SENT_MAX_INDEX 63 +#define TPB_PRTTPB_STAT_TC_BYTES_SENT_TCCNT_S 0 +#define TPB_PRTTPB_STAT_TC_BYTES_SENT_TCCNT_M MAKEMASK(0xFFFFFFFF, 0) +#define EMP_SWT_PRUNIND 0x00204020 /* Reset Source: CORER */ +#define EMP_SWT_PRUNIND_OPCODE_S 0 +#define EMP_SWT_PRUNIND_OPCODE_M MAKEMASK(0xF, 0) +#define EMP_SWT_PRUNIND_LIST_INDEX_NUM_S 4 +#define EMP_SWT_PRUNIND_LIST_INDEX_NUM_M MAKEMASK(0x3FF, 4) +#define EMP_SWT_PRUNIND_VSI_NUM_S 16 +#define EMP_SWT_PRUNIND_VSI_NUM_M MAKEMASK(0x3FF, 16) +#define EMP_SWT_PRUNIND_BIT_VALUE_S 31 +#define EMP_SWT_PRUNIND_BIT_VALUE_M BIT(31) +#define EMP_SWT_REPIND 0x0020401C /* Reset Source: CORER */ +#define EMP_SWT_REPIND_OPCODE_S 0 +#define EMP_SWT_REPIND_OPCODE_M MAKEMASK(0xF, 0) +#define EMP_SWT_REPIND_LIST_INDEX_NUMBER_S 4 +#define EMP_SWT_REPIND_LIST_INDEX_NUMBER_M MAKEMASK(0x3FF, 4) +#define EMP_SWT_REPIND_VSI_NUM_S 16 +#define EMP_SWT_REPIND_VSI_NUM_M MAKEMASK(0x3FF, 16) +#define EMP_SWT_REPIND_BIT_VALUE_S 31 +#define EMP_SWT_REPIND_BIT_VALUE_M BIT(31) +#define GL_OVERRIDEC 0x002040A4 /* Reset Source: CORER */ +#define GL_OVERRIDEC_OVERRIDE_ATTEMPTC_S 0 +#define GL_OVERRIDEC_OVERRIDE_ATTEMPTC_M MAKEMASK(0xFFFF, 0) +#define GL_OVERRIDEC_LAST_VSI_S 16 +#define GL_OVERRIDEC_LAST_VSI_M MAKEMASK(0x3FF, 16) +#define GL_PLG_AVG_CALC_CFG 0x0020A5AC /* Reset Source: CORER */ +#define GL_PLG_AVG_CALC_CFG_CYCLE_LEN_S 0 +#define GL_PLG_AVG_CALC_CFG_CYCLE_LEN_M MAKEMASK(0x7FFFFFFF, 0) +#define GL_PLG_AVG_CALC_CFG_MODE_S 31 +#define GL_PLG_AVG_CALC_CFG_MODE_M BIT(31) +#define GL_PLG_AVG_CALC_ST 0x0020A5B0 /* Reset Source: CORER */ +#define GL_PLG_AVG_CALC_ST_IN_DATA_S 0 +#define GL_PLG_AVG_CALC_ST_IN_DATA_M MAKEMASK(0x7FFF, 0) +#define GL_PLG_AVG_CALC_ST_OUT_DATA_S 16 +#define GL_PLG_AVG_CALC_ST_OUT_DATA_M MAKEMASK(0x7FFF, 16) +#define GL_PLG_AVG_CALC_ST_VALID_S 31 +#define GL_PLG_AVG_CALC_ST_VALID_M BIT(31) +#define GL_PRE_CFG_CMD 0x00214090 /* Reset Source: CORER */ +#define GL_PRE_CFG_CMD_ADDR_S 0 +#define GL_PRE_CFG_CMD_ADDR_M MAKEMASK(0x1FFF, 0) +#define GL_PRE_CFG_CMD_TBLIDX_S 16 +#define GL_PRE_CFG_CMD_TBLIDX_M MAKEMASK(0x7, 16) +#define GL_PRE_CFG_CMD_CMD_S 29 +#define GL_PRE_CFG_CMD_CMD_M BIT(29) +#define GL_PRE_CFG_CMD_DONE_S 31 +#define GL_PRE_CFG_CMD_DONE_M BIT(31) +#define GL_PRE_CFG_DATA(_i) (0x00214074 + ((_i) * 4)) /* _i=0...6 */ /* Reset Source: CORER */ +#define GL_PRE_CFG_DATA_MAX_INDEX 6 +#define GL_PRE_CFG_DATA_GL_PRE_RCP_DATA_S 0 +#define GL_PRE_CFG_DATA_GL_PRE_RCP_DATA_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_SWT_FUNCFILT 0x001D2698 /* Reset Source: CORER */ +#define GL_SWT_FUNCFILT_FUNCFILT_S 0 +#define GL_SWT_FUNCFILT_FUNCFILT_M BIT(0) +#define GL_SWT_FW_STS(_i) (0x00216000 + ((_i) * 4)) /* _i=0...5 */ /* Reset Source: CORER */ +#define GL_SWT_FW_STS_MAX_INDEX 5 +#define GL_SWT_FW_STS_GL_SWT_FW_STS_S 0 +#define GL_SWT_FW_STS_GL_SWT_FW_STS_M MAKEMASK(0xFFFFFFFF, 0) +#define GL_SWT_LAT_DOUBLE 0x00204004 /* Reset Source: CORER */ +#define GL_SWT_LAT_DOUBLE_BASE_S 0 +#define GL_SWT_LAT_DOUBLE_BASE_M MAKEMASK(0x7FF, 0) +#define GL_SWT_LAT_DOUBLE_SIZE_S 16 +#define GL_SWT_LAT_DOUBLE_SIZE_M MAKEMASK(0x7FF, 16) +#define GL_SWT_LAT_QUAD 0x00204008 /* Reset Source: CORER */ +#define GL_SWT_LAT_QUAD_BASE_S 0 +#define GL_SWT_LAT_QUAD_BASE_M MAKEMASK(0x7FF, 0) +#define GL_SWT_LAT_QUAD_SIZE_S 16 +#define GL_SWT_LAT_QUAD_SIZE_M MAKEMASK(0x7FF, 16) +#define GL_SWT_LAT_SINGLE 0x00204000 /* Reset Source: CORER */ +#define GL_SWT_LAT_SINGLE_BASE_S 0 +#define GL_SWT_LAT_SINGLE_BASE_M MAKEMASK(0x7FF, 0) +#define GL_SWT_LAT_SINGLE_SIZE_S 16 +#define GL_SWT_LAT_SINGLE_SIZE_M MAKEMASK(0x7FF, 16) +#define GL_SWT_MD_PRI 0x002040AC /* Reset Source: CORER */ +#define GL_SWT_MD_PRI_VSI_PRI_S 0 +#define GL_SWT_MD_PRI_VSI_PRI_M MAKEMASK(0x7, 0) +#define GL_SWT_MD_PRI_LB_PRI_S 4 +#define GL_SWT_MD_PRI_LB_PRI_M MAKEMASK(0x7, 4) +#define GL_SWT_MD_PRI_LAN_EN_PRI_S 8 +#define GL_SWT_MD_PRI_LAN_EN_PRI_M MAKEMASK(0x7, 8) +#define GL_SWT_MD_PRI_QH_PRI_S 12 +#define GL_SWT_MD_PRI_QH_PRI_M MAKEMASK(0x7, 12) +#define GL_SWT_MD_PRI_QL_PRI_S 16 +#define GL_SWT_MD_PRI_QL_PRI_M MAKEMASK(0x7, 16) +#define GL_SWT_MIRTARVSI(_i) (0x00204500 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: CORER */ +#define GL_SWT_MIRTARVSI_MAX_INDEX 63 +#define GL_SWT_MIRTARVSI_VFVMNUMBER_S 0 +#define GL_SWT_MIRTARVSI_VFVMNUMBER_M MAKEMASK(0x3FF, 0) +#define GL_SWT_MIRTARVSI_FUNCTIONTYPE_S 10 +#define GL_SWT_MIRTARVSI_FUNCTIONTYPE_M MAKEMASK(0x3, 10) +#define GL_SWT_MIRTARVSI_PFNUMBER_S 12 +#define GL_SWT_MIRTARVSI_PFNUMBER_M MAKEMASK(0x7, 12) +#define GL_SWT_MIRTARVSI_TARGETVSI_S 20 +#define GL_SWT_MIRTARVSI_TARGETVSI_M MAKEMASK(0x3FF, 20) +#define GL_SWT_MIRTARVSI_RULEENABLE_S 31 +#define GL_SWT_MIRTARVSI_RULEENABLE_M BIT(31) +#define GL_SWT_SWIDFVIDX 0x00214114 /* Reset Source: CORER */ +#define GL_SWT_SWIDFVIDX_SWIDFVIDX_S 0 +#define GL_SWT_SWIDFVIDX_SWIDFVIDX_M MAKEMASK(0x3F, 0) +#define GL_SWT_SWIDFVIDX_PORT_TYPE_S 31 +#define GL_SWT_SWIDFVIDX_PORT_TYPE_M BIT(31) +#define GL_VP_SWITCHID(_i) (0x00214094 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define GL_VP_SWITCHID_MAX_INDEX 31 +#define GL_VP_SWITCHID_SWITCHID_S 0 +#define GL_VP_SWITCHID_SWITCHID_M MAKEMASK(0xFF, 0) +#define GLSWID_STAT_BLOCK(_i) (0x0020A1A4 + ((_i) * 4)) /* _i=0...255 */ /* Reset Source: PFR */ +#define GLSWID_STAT_BLOCK_MAX_INDEX 255 +#define GLSWID_STAT_BLOCK_VEBID_S 0 +#define GLSWID_STAT_BLOCK_VEBID_M MAKEMASK(0x1F, 0) +#define GLSWID_STAT_BLOCK_VEBID_VALID_S 31 +#define GLSWID_STAT_BLOCK_VEBID_VALID_M BIT(31) +#define GLSWT_ACT_RESP_0 0x0020A5A4 /* Reset Source: CORER */ +#define GLSWT_ACT_RESP_0_GLSWT_ACT_RESP_S 0 +#define GLSWT_ACT_RESP_0_GLSWT_ACT_RESP_M MAKEMASK(0xFFFFFFFF, 0) +#define GLSWT_ACT_RESP_1 0x0020A5A8 /* Reset Source: CORER */ +#define GLSWT_ACT_RESP_1_GLSWT_ACT_RESP_S 0 +#define GLSWT_ACT_RESP_1_GLSWT_ACT_RESP_M MAKEMASK(0xFFFFFFFF, 0) +#define GLSWT_ARB_MODE 0x0020A674 /* Reset Source: CORER */ +#define GLSWT_ARB_MODE_FLU_PRI_SHM_S 0 +#define GLSWT_ARB_MODE_FLU_PRI_SHM_M BIT(0) +#define GLSWT_ARB_MODE_TX_RX_FWD_PRI_S 1 +#define GLSWT_ARB_MODE_TX_RX_FWD_PRI_M BIT(1) +#define PRT_SBPVSI 0x00204120 /* Reset Source: CORER */ +#define PRT_SBPVSI_BAD_FRAMES_VSI_S 0 +#define PRT_SBPVSI_BAD_FRAMES_VSI_M MAKEMASK(0x3FF, 0) +#define PRT_SBPVSI_SBP_S 31 +#define PRT_SBPVSI_SBP_M BIT(31) +#define PRT_SCSTS 0x00204140 /* Reset Source: CORER */ +#define PRT_SCSTS_BSCA_S 0 +#define PRT_SCSTS_BSCA_M BIT(0) +#define PRT_SCSTS_BSCAP_S 1 +#define PRT_SCSTS_BSCAP_M BIT(1) +#define PRT_SCSTS_MSCA_S 2 +#define PRT_SCSTS_MSCA_M BIT(2) +#define PRT_SCSTS_MSCAP_S 3 +#define PRT_SCSTS_MSCAP_M BIT(3) +#define PRT_SWT_BSCCNT 0x00204160 /* Reset Source: CORER */ +#define PRT_SWT_BSCCNT_CCOUNT_S 0 +#define PRT_SWT_BSCCNT_CCOUNT_M MAKEMASK(0x1FFFFFF, 0) +#define PRT_SWT_BSCTRH 0x00204180 /* Reset Source: CORER */ +#define PRT_SWT_BSCTRH_UTRESH_S 0 +#define PRT_SWT_BSCTRH_UTRESH_M MAKEMASK(0x7FFFF, 0) +#define PRT_SWT_MIREG 0x002042A0 /* Reset Source: CORER */ +#define PRT_SWT_MIREG_MIRRULE_S 0 +#define PRT_SWT_MIREG_MIRRULE_M MAKEMASK(0x3F, 0) +#define PRT_SWT_MIREG_MIRENA_S 7 +#define PRT_SWT_MIREG_MIRENA_M BIT(7) +#define PRT_SWT_MIRIG 0x00204280 /* Reset Source: CORER */ +#define PRT_SWT_MIRIG_MIRRULE_S 0 +#define PRT_SWT_MIRIG_MIRRULE_M MAKEMASK(0x3F, 0) +#define PRT_SWT_MIRIG_MIRENA_S 7 +#define PRT_SWT_MIRIG_MIRENA_M BIT(7) +#define PRT_SWT_MSCCNT 0x00204100 /* Reset Source: CORER */ +#define PRT_SWT_MSCCNT_CCOUNT_S 0 +#define PRT_SWT_MSCCNT_CCOUNT_M MAKEMASK(0x1FFFFFF, 0) +#define PRT_SWT_MSCTRH 0x002041C0 /* Reset Source: CORER */ +#define PRT_SWT_MSCTRH_UTRESH_S 0 +#define PRT_SWT_MSCTRH_UTRESH_M MAKEMASK(0x7FFFF, 0) +#define PRT_SWT_SCBI 0x002041E0 /* Reset Source: CORER */ +#define PRT_SWT_SCBI_BI_S 0 +#define PRT_SWT_SCBI_BI_M MAKEMASK(0x1FFFFFF, 0) +#define PRT_SWT_SCCRL 0x00204200 /* Reset Source: CORER */ +#define PRT_SWT_SCCRL_MDIPW_S 0 +#define PRT_SWT_SCCRL_MDIPW_M BIT(0) +#define PRT_SWT_SCCRL_MDICW_S 1 +#define PRT_SWT_SCCRL_MDICW_M BIT(1) +#define PRT_SWT_SCCRL_BDIPW_S 2 +#define PRT_SWT_SCCRL_BDIPW_M BIT(2) +#define PRT_SWT_SCCRL_BDICW_S 3 +#define PRT_SWT_SCCRL_BDICW_M BIT(3) +#define PRT_SWT_SCCRL_INTERVAL_S 8 +#define PRT_SWT_SCCRL_INTERVAL_M MAKEMASK(0xFFFFF, 8) +#define PRT_TCTUPR(_i) (0x00040840 + ((_i) * 4)) /* _i=0...31 */ /* Reset Source: CORER */ +#define PRT_TCTUPR_MAX_INDEX 31 +#define PRT_TCTUPR_UP0_S 0 +#define PRT_TCTUPR_UP0_M MAKEMASK(0x7, 0) +#define PRT_TCTUPR_UP1_S 4 +#define PRT_TCTUPR_UP1_M MAKEMASK(0x7, 4) +#define PRT_TCTUPR_UP2_S 8 +#define PRT_TCTUPR_UP2_M MAKEMASK(0x7, 8) +#define PRT_TCTUPR_UP3_S 12 +#define PRT_TCTUPR_UP3_M MAKEMASK(0x7, 12) +#define PRT_TCTUPR_UP4_S 16 +#define PRT_TCTUPR_UP4_M MAKEMASK(0x7, 16) +#define PRT_TCTUPR_UP5_S 20 +#define PRT_TCTUPR_UP5_M MAKEMASK(0x7, 20) +#define PRT_TCTUPR_UP6_S 24 +#define PRT_TCTUPR_UP6_M MAKEMASK(0x7, 24) +#define PRT_TCTUPR_UP7_S 28 +#define PRT_TCTUPR_UP7_M MAKEMASK(0x7, 28) +#define GLHH_ART_CTL 0x000A41D4 /* Reset Source: POR */ +#define GLHH_ART_CTL_ACTIVE_S 0 +#define GLHH_ART_CTL_ACTIVE_M BIT(0) +#define GLHH_ART_CTL_TIME_OUT1_S 1 +#define GLHH_ART_CTL_TIME_OUT1_M BIT(1) +#define GLHH_ART_CTL_TIME_OUT2_S 2 +#define GLHH_ART_CTL_TIME_OUT2_M BIT(2) +#define GLHH_ART_CTL_RESET_HH_S 31 +#define GLHH_ART_CTL_RESET_HH_M BIT(31) +#define GLHH_ART_DATA 0x000A41E0 /* Reset Source: POR */ +#define GLHH_ART_DATA_AGENT_TYPE_S 0 +#define GLHH_ART_DATA_AGENT_TYPE_M MAKEMASK(0x7, 0) +#define GLHH_ART_DATA_SYNC_TYPE_S 3 +#define GLHH_ART_DATA_SYNC_TYPE_M BIT(3) +#define GLHH_ART_DATA_MAX_DELAY_S 4 +#define GLHH_ART_DATA_MAX_DELAY_M MAKEMASK(0xF, 4) +#define GLHH_ART_DATA_TIME_BASE_S 8 +#define GLHH_ART_DATA_TIME_BASE_M MAKEMASK(0xF, 8) +#define GLHH_ART_DATA_RSV_DATA_S 12 +#define GLHH_ART_DATA_RSV_DATA_M MAKEMASK(0xFFFFF, 12) +#define GLHH_ART_TIME_H 0x000A41D8 /* Reset Source: POR */ +#define GLHH_ART_TIME_H_ART_TIME_H_S 0 +#define GLHH_ART_TIME_H_ART_TIME_H_M MAKEMASK(0xFFFFFFFF, 0) +#define GLHH_ART_TIME_L 0x000A41DC /* Reset Source: POR */ +#define GLHH_ART_TIME_L_ART_TIME_L_S 0 +#define GLHH_ART_TIME_L_ART_TIME_L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_AUX_IN_0(_i) (0x000889D8 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_AUX_IN_0_MAX_INDEX 1 +#define GLTSYN_AUX_IN_0_EVNTLVL_S 0 +#define GLTSYN_AUX_IN_0_EVNTLVL_M MAKEMASK(0x3, 0) +#define GLTSYN_AUX_IN_0_INT_ENA_S 4 +#define GLTSYN_AUX_IN_0_INT_ENA_M BIT(4) +#define GLTSYN_AUX_IN_1(_i) (0x000889E0 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_AUX_IN_1_MAX_INDEX 1 +#define GLTSYN_AUX_IN_1_EVNTLVL_S 0 +#define GLTSYN_AUX_IN_1_EVNTLVL_M MAKEMASK(0x3, 0) +#define GLTSYN_AUX_IN_1_INT_ENA_S 4 +#define GLTSYN_AUX_IN_1_INT_ENA_M BIT(4) +#define GLTSYN_AUX_IN_2(_i) (0x000889E8 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_AUX_IN_2_MAX_INDEX 1 +#define GLTSYN_AUX_IN_2_EVNTLVL_S 0 +#define GLTSYN_AUX_IN_2_EVNTLVL_M MAKEMASK(0x3, 0) +#define GLTSYN_AUX_IN_2_INT_ENA_S 4 +#define GLTSYN_AUX_IN_2_INT_ENA_M BIT(4) +#define GLTSYN_AUX_OUT_0(_i) (0x00088998 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_AUX_OUT_0_MAX_INDEX 1 +#define GLTSYN_AUX_OUT_0_OUT_ENA_S 0 +#define GLTSYN_AUX_OUT_0_OUT_ENA_M BIT(0) +#define GLTSYN_AUX_OUT_0_OUTMOD_S 1 +#define GLTSYN_AUX_OUT_0_OUTMOD_M MAKEMASK(0x3, 1) +#define GLTSYN_AUX_OUT_0_OUTLVL_S 3 +#define GLTSYN_AUX_OUT_0_OUTLVL_M BIT(3) +#define GLTSYN_AUX_OUT_0_INT_ENA_S 4 +#define GLTSYN_AUX_OUT_0_INT_ENA_M BIT(4) +#define GLTSYN_AUX_OUT_0_PULSEW_S 8 +#define GLTSYN_AUX_OUT_0_PULSEW_M MAKEMASK(0xF, 8) +#define GLTSYN_AUX_OUT_1(_i) (0x000889A0 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_AUX_OUT_1_MAX_INDEX 1 +#define GLTSYN_AUX_OUT_1_OUT_ENA_S 0 +#define GLTSYN_AUX_OUT_1_OUT_ENA_M BIT(0) +#define GLTSYN_AUX_OUT_1_OUTMOD_S 1 +#define GLTSYN_AUX_OUT_1_OUTMOD_M MAKEMASK(0x3, 1) +#define GLTSYN_AUX_OUT_1_OUTLVL_S 3 +#define GLTSYN_AUX_OUT_1_OUTLVL_M BIT(3) +#define GLTSYN_AUX_OUT_1_INT_ENA_S 4 +#define GLTSYN_AUX_OUT_1_INT_ENA_M BIT(4) +#define GLTSYN_AUX_OUT_1_PULSEW_S 8 +#define GLTSYN_AUX_OUT_1_PULSEW_M MAKEMASK(0xF, 8) +#define GLTSYN_AUX_OUT_2(_i) (0x000889A8 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_AUX_OUT_2_MAX_INDEX 1 +#define GLTSYN_AUX_OUT_2_OUT_ENA_S 0 +#define GLTSYN_AUX_OUT_2_OUT_ENA_M BIT(0) +#define GLTSYN_AUX_OUT_2_OUTMOD_S 1 +#define GLTSYN_AUX_OUT_2_OUTMOD_M MAKEMASK(0x3, 1) +#define GLTSYN_AUX_OUT_2_OUTLVL_S 3 +#define GLTSYN_AUX_OUT_2_OUTLVL_M BIT(3) +#define GLTSYN_AUX_OUT_2_INT_ENA_S 4 +#define GLTSYN_AUX_OUT_2_INT_ENA_M BIT(4) +#define GLTSYN_AUX_OUT_2_PULSEW_S 8 +#define GLTSYN_AUX_OUT_2_PULSEW_M MAKEMASK(0xF, 8) +#define GLTSYN_AUX_OUT_3(_i) (0x000889B0 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_AUX_OUT_3_MAX_INDEX 1 +#define GLTSYN_AUX_OUT_3_OUT_ENA_S 0 +#define GLTSYN_AUX_OUT_3_OUT_ENA_M BIT(0) +#define GLTSYN_AUX_OUT_3_OUTMOD_S 1 +#define GLTSYN_AUX_OUT_3_OUTMOD_M MAKEMASK(0x3, 1) +#define GLTSYN_AUX_OUT_3_OUTLVL_S 3 +#define GLTSYN_AUX_OUT_3_OUTLVL_M BIT(3) +#define GLTSYN_AUX_OUT_3_INT_ENA_S 4 +#define GLTSYN_AUX_OUT_3_INT_ENA_M BIT(4) +#define GLTSYN_AUX_OUT_3_PULSEW_S 8 +#define GLTSYN_AUX_OUT_3_PULSEW_M MAKEMASK(0xF, 8) +#define GLTSYN_CLKO_0(_i) (0x000889B8 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_CLKO_0_MAX_INDEX 1 +#define GLTSYN_CLKO_0_TSYNCLKO_S 0 +#define GLTSYN_CLKO_0_TSYNCLKO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_CLKO_1(_i) (0x000889C0 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_CLKO_1_MAX_INDEX 1 +#define GLTSYN_CLKO_1_TSYNCLKO_S 0 +#define GLTSYN_CLKO_1_TSYNCLKO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_CLKO_2(_i) (0x000889C8 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_CLKO_2_MAX_INDEX 1 +#define GLTSYN_CLKO_2_TSYNCLKO_S 0 +#define GLTSYN_CLKO_2_TSYNCLKO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_CLKO_3(_i) (0x000889D0 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_CLKO_3_MAX_INDEX 1 +#define GLTSYN_CLKO_3_TSYNCLKO_S 0 +#define GLTSYN_CLKO_3_TSYNCLKO_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_CMD 0x00088810 /* Reset Source: CORER */ +#define GLTSYN_CMD_CMD_S 0 +#define GLTSYN_CMD_CMD_M MAKEMASK(0xFF, 0) +#define GLTSYN_CMD_SEL_MASTER_S 8 +#define GLTSYN_CMD_SEL_MASTER_M BIT(8) +#define GLTSYN_CMD_SYNC 0x00088814 /* Reset Source: CORER */ +#define GLTSYN_CMD_SYNC_SYNC_S 0 +#define GLTSYN_CMD_SYNC_SYNC_M MAKEMASK(0x3, 0) +#define GLTSYN_ENA(_i) (0x00088808 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_ENA_MAX_INDEX 1 +#define GLTSYN_ENA_TSYN_ENA_S 0 +#define GLTSYN_ENA_TSYN_ENA_M BIT(0) +#define GLTSYN_EVNT_H_0(_i) (0x00088970 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_EVNT_H_0_MAX_INDEX 1 +#define GLTSYN_EVNT_H_0_TSYNEVNT_H_S 0 +#define GLTSYN_EVNT_H_0_TSYNEVNT_H_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_EVNT_H_1(_i) (0x00088980 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_EVNT_H_1_MAX_INDEX 1 +#define GLTSYN_EVNT_H_1_TSYNEVNT_H_S 0 +#define GLTSYN_EVNT_H_1_TSYNEVNT_H_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_EVNT_H_2(_i) (0x00088990 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_EVNT_H_2_MAX_INDEX 1 +#define GLTSYN_EVNT_H_2_TSYNEVNT_H_S 0 +#define GLTSYN_EVNT_H_2_TSYNEVNT_H_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_EVNT_L_0(_i) (0x00088968 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_EVNT_L_0_MAX_INDEX 1 +#define GLTSYN_EVNT_L_0_TSYNEVNT_L_S 0 +#define GLTSYN_EVNT_L_0_TSYNEVNT_L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_EVNT_L_1(_i) (0x00088978 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_EVNT_L_1_MAX_INDEX 1 +#define GLTSYN_EVNT_L_1_TSYNEVNT_L_S 0 +#define GLTSYN_EVNT_L_1_TSYNEVNT_L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_EVNT_L_2(_i) (0x00088988 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_EVNT_L_2_MAX_INDEX 1 +#define GLTSYN_EVNT_L_2_TSYNEVNT_L_S 0 +#define GLTSYN_EVNT_L_2_TSYNEVNT_L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_HHTIME_H(_i) (0x00088900 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_HHTIME_H_MAX_INDEX 1 +#define GLTSYN_HHTIME_H_TSYNEVNT_H_S 0 +#define GLTSYN_HHTIME_H_TSYNEVNT_H_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_HHTIME_L(_i) (0x000888F8 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_HHTIME_L_MAX_INDEX 1 +#define GLTSYN_HHTIME_L_TSYNEVNT_L_S 0 +#define GLTSYN_HHTIME_L_TSYNEVNT_L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_INCVAL_H(_i) (0x00088920 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_INCVAL_H_MAX_INDEX 1 +#define GLTSYN_INCVAL_H_INCVAL_H_S 0 +#define GLTSYN_INCVAL_H_INCVAL_H_M MAKEMASK(0xFF, 0) +#define GLTSYN_INCVAL_L(_i) (0x00088918 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_INCVAL_L_MAX_INDEX 1 +#define GLTSYN_INCVAL_L_INCVAL_L_S 0 +#define GLTSYN_INCVAL_L_INCVAL_L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_SHADJ_H(_i) (0x00088910 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_SHADJ_H_MAX_INDEX 1 +#define GLTSYN_SHADJ_H_ADJUST_H_S 0 +#define GLTSYN_SHADJ_H_ADJUST_H_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_SHADJ_L(_i) (0x00088908 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_SHADJ_L_MAX_INDEX 1 +#define GLTSYN_SHADJ_L_ADJUST_L_S 0 +#define GLTSYN_SHADJ_L_ADJUST_L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_SHTIME_0(_i) (0x000888E0 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_SHTIME_0_MAX_INDEX 1 +#define GLTSYN_SHTIME_0_TSYNTIME_0_S 0 +#define GLTSYN_SHTIME_0_TSYNTIME_0_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_SHTIME_H(_i) (0x000888F0 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_SHTIME_H_MAX_INDEX 1 +#define GLTSYN_SHTIME_H_TSYNTIME_H_S 0 +#define GLTSYN_SHTIME_H_TSYNTIME_H_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_SHTIME_L(_i) (0x000888E8 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_SHTIME_L_MAX_INDEX 1 +#define GLTSYN_SHTIME_L_TSYNTIME_L_S 0 +#define GLTSYN_SHTIME_L_TSYNTIME_L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_STAT(_i) (0x000888C0 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_STAT_MAX_INDEX 1 +#define GLTSYN_STAT_EVENT0_S 0 +#define GLTSYN_STAT_EVENT0_M BIT(0) +#define GLTSYN_STAT_EVENT1_S 1 +#define GLTSYN_STAT_EVENT1_M BIT(1) +#define GLTSYN_STAT_EVENT2_S 2 +#define GLTSYN_STAT_EVENT2_M BIT(2) +#define GLTSYN_STAT_TGT0_S 4 +#define GLTSYN_STAT_TGT0_M BIT(4) +#define GLTSYN_STAT_TGT1_S 5 +#define GLTSYN_STAT_TGT1_M BIT(5) +#define GLTSYN_STAT_TGT2_S 6 +#define GLTSYN_STAT_TGT2_M BIT(6) +#define GLTSYN_STAT_TGT3_S 7 +#define GLTSYN_STAT_TGT3_M BIT(7) +#define GLTSYN_SYNC_DLAY 0x00088818 /* Reset Source: CORER */ +#define GLTSYN_SYNC_DLAY_SYNC_DELAY_S 0 +#define GLTSYN_SYNC_DLAY_SYNC_DELAY_M MAKEMASK(0x1F, 0) +#define GLTSYN_TGT_H_0(_i) (0x00088930 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_TGT_H_0_MAX_INDEX 1 +#define GLTSYN_TGT_H_0_TSYNTGTT_H_S 0 +#define GLTSYN_TGT_H_0_TSYNTGTT_H_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_TGT_H_1(_i) (0x00088940 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_TGT_H_1_MAX_INDEX 1 +#define GLTSYN_TGT_H_1_TSYNTGTT_H_S 0 +#define GLTSYN_TGT_H_1_TSYNTGTT_H_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_TGT_H_2(_i) (0x00088950 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_TGT_H_2_MAX_INDEX 1 +#define GLTSYN_TGT_H_2_TSYNTGTT_H_S 0 +#define GLTSYN_TGT_H_2_TSYNTGTT_H_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_TGT_H_3(_i) (0x00088960 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_TGT_H_3_MAX_INDEX 1 +#define GLTSYN_TGT_H_3_TSYNTGTT_H_S 0 +#define GLTSYN_TGT_H_3_TSYNTGTT_H_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_TGT_L_0(_i) (0x00088928 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_TGT_L_0_MAX_INDEX 1 +#define GLTSYN_TGT_L_0_TSYNTGTT_L_S 0 +#define GLTSYN_TGT_L_0_TSYNTGTT_L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_TGT_L_1(_i) (0x00088938 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_TGT_L_1_MAX_INDEX 1 +#define GLTSYN_TGT_L_1_TSYNTGTT_L_S 0 +#define GLTSYN_TGT_L_1_TSYNTGTT_L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_TGT_L_2(_i) (0x00088948 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_TGT_L_2_MAX_INDEX 1 +#define GLTSYN_TGT_L_2_TSYNTGTT_L_S 0 +#define GLTSYN_TGT_L_2_TSYNTGTT_L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_TGT_L_3(_i) (0x00088958 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_TGT_L_3_MAX_INDEX 1 +#define GLTSYN_TGT_L_3_TSYNTGTT_L_S 0 +#define GLTSYN_TGT_L_3_TSYNTGTT_L_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_TIME_0(_i) (0x000888C8 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_TIME_0_MAX_INDEX 1 +#define GLTSYN_TIME_0_TSYNTIME_0_S 0 +#define GLTSYN_TIME_0_TSYNTIME_0_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_TIME_H(_i) (0x000888D8 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_TIME_H_MAX_INDEX 1 +#define GLTSYN_TIME_H_TSYNTIME_H_S 0 +#define GLTSYN_TIME_H_TSYNTIME_H_M MAKEMASK(0xFFFFFFFF, 0) +#define GLTSYN_TIME_L(_i) (0x000888D0 + ((_i) * 4)) /* _i=0...1 */ /* Reset Source: CORER */ +#define GLTSYN_TIME_L_MAX_INDEX 1 +#define GLTSYN_TIME_L_TSYNTIME_L_S 0 +#define GLTSYN_TIME_L_TSYNTIME_L_M MAKEMASK(0xFFFFFFFF, 0) +#define PFHH_SEM 0x000A4200 /* Reset Source: PFR */ +#define PFHH_SEM_BUSY_S 0 +#define PFHH_SEM_BUSY_M BIT(0) +#define PFHH_SEM_PF_OWNER_S 4 +#define PFHH_SEM_PF_OWNER_M MAKEMASK(0x7, 4) +#define PFTSYN_SEM 0x00088880 /* Reset Source: PFR */ +#define PFTSYN_SEM_BUSY_S 0 +#define PFTSYN_SEM_BUSY_M BIT(0) +#define PFTSYN_SEM_PF_OWNER_S 4 +#define PFTSYN_SEM_PF_OWNER_M MAKEMASK(0x7, 4) +#define GLPE_TSCD_FLR(_i) (0x0051E24C + ((_i) * 4)) /* _i=0...3 */ /* Reset Source: CORER */ +#define GLPE_TSCD_FLR_MAX_INDEX 3 +#define GLPE_TSCD_FLR_DRAIN_VCTR_ID_S 0 +#define GLPE_TSCD_FLR_DRAIN_VCTR_ID_M MAKEMASK(0x3, 0) +#define GLPE_TSCD_FLR_PORT_S 2 +#define GLPE_TSCD_FLR_PORT_M MAKEMASK(0x7, 2) +#define GLPE_TSCD_FLR_PF_NUM_S 5 +#define GLPE_TSCD_FLR_PF_NUM_M MAKEMASK(0x7, 5) +#define GLPE_TSCD_FLR_VM_VF_TYPE_S 8 +#define GLPE_TSCD_FLR_VM_VF_TYPE_M MAKEMASK(0x3, 8) +#define GLPE_TSCD_FLR_VM_VF_NUM_S 16 +#define GLPE_TSCD_FLR_VM_VF_NUM_M MAKEMASK(0x3FF, 16) +#define GLPE_TSCD_FLR_VLD_S 31 +#define GLPE_TSCD_FLR_VLD_M BIT(31) +#define GLPE_TSCD_PEPM 0x0051E228 /* Reset Source: CORER */ +#define GLPE_TSCD_PEPM_MDQ_CREDITS_S 0 +#define GLPE_TSCD_PEPM_MDQ_CREDITS_M MAKEMASK(0xFF, 0) +#define PF_VIRT_VSTATUS 0x0009E680 /* Reset Source: PFR */ +#define PF_VIRT_VSTATUS_NUM_VFS_S 0 +#define PF_VIRT_VSTATUS_NUM_VFS_M MAKEMASK(0xFF, 0) +#define PF_VIRT_VSTATUS_TOTAL_VFS_S 8 +#define PF_VIRT_VSTATUS_TOTAL_VFS_M MAKEMASK(0xFF, 8) +#define PF_VIRT_VSTATUS_IOV_ACTIVE_S 16 +#define PF_VIRT_VSTATUS_IOV_ACTIVE_M BIT(16) +#define PF_VT_PFALLOC 0x001D2480 /* Reset Source: CORER */ +#define PF_VT_PFALLOC_FIRSTVF_S 0 +#define PF_VT_PFALLOC_FIRSTVF_M MAKEMASK(0xFF, 0) +#define PF_VT_PFALLOC_LASTVF_S 8 +#define PF_VT_PFALLOC_LASTVF_M MAKEMASK(0xFF, 8) +#define PF_VT_PFALLOC_VALID_S 31 +#define PF_VT_PFALLOC_VALID_M BIT(31) +#define PF_VT_PFALLOC_HIF 0x0009DD80 /* Reset Source: PCIR */ +#define PF_VT_PFALLOC_HIF_FIRSTVF_S 0 +#define PF_VT_PFALLOC_HIF_FIRSTVF_M MAKEMASK(0xFF, 0) +#define PF_VT_PFALLOC_HIF_LASTVF_S 8 +#define PF_VT_PFALLOC_HIF_LASTVF_M MAKEMASK(0xFF, 8) +#define PF_VT_PFALLOC_HIF_VALID_S 31 +#define PF_VT_PFALLOC_HIF_VALID_M BIT(31) +#define PF_VT_PFALLOC_PCIE 0x000BE080 /* Reset Source: PCIR */ +#define PF_VT_PFALLOC_PCIE_FIRSTVF_S 0 +#define PF_VT_PFALLOC_PCIE_FIRSTVF_M MAKEMASK(0xFF, 0) +#define PF_VT_PFALLOC_PCIE_LASTVF_S 8 +#define PF_VT_PFALLOC_PCIE_LASTVF_M MAKEMASK(0xFF, 8) +#define PF_VT_PFALLOC_PCIE_VALID_S 31 +#define PF_VT_PFALLOC_PCIE_VALID_M BIT(31) +#define VSI_L2TAGSTXVALID(_VSI) (0x00046000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_L2TAGSTXVALID_MAX_INDEX 767 +#define VSI_L2TAGSTXVALID_L2TAG1INSERTID_S 0 +#define VSI_L2TAGSTXVALID_L2TAG1INSERTID_M MAKEMASK(0x7, 0) +#define VSI_L2TAGSTXVALID_L2TAG1INSERTID_VALID_S 3 +#define VSI_L2TAGSTXVALID_L2TAG1INSERTID_VALID_M BIT(3) +#define VSI_L2TAGSTXVALID_L2TAG2INSERTID_S 4 +#define VSI_L2TAGSTXVALID_L2TAG2INSERTID_M MAKEMASK(0x7, 4) +#define VSI_L2TAGSTXVALID_L2TAG2INSERTID_VALID_S 7 +#define VSI_L2TAGSTXVALID_L2TAG2INSERTID_VALID_M BIT(7) +#define VSI_L2TAGSTXVALID_TIR0INSERTID_S 16 +#define VSI_L2TAGSTXVALID_TIR0INSERTID_M MAKEMASK(0x7, 16) +#define VSI_L2TAGSTXVALID_TIR0_INSERT_S 19 +#define VSI_L2TAGSTXVALID_TIR0_INSERT_M BIT(19) +#define VSI_L2TAGSTXVALID_TIR1INSERTID_S 20 +#define VSI_L2TAGSTXVALID_TIR1INSERTID_M MAKEMASK(0x7, 20) +#define VSI_L2TAGSTXVALID_TIR1_INSERT_S 23 +#define VSI_L2TAGSTXVALID_TIR1_INSERT_M BIT(23) +#define VSI_L2TAGSTXVALID_TIR2INSERTID_S 24 +#define VSI_L2TAGSTXVALID_TIR2INSERTID_M MAKEMASK(0x7, 24) +#define VSI_L2TAGSTXVALID_TIR2_INSERT_S 27 +#define VSI_L2TAGSTXVALID_TIR2_INSERT_M BIT(27) +#define VSI_PASID(_VSI) (0x0009C000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: PFR */ +#define VSI_PASID_MAX_INDEX 767 +#define VSI_PASID_PASID_S 0 +#define VSI_PASID_PASID_M MAKEMASK(0xFFFFF, 0) +#define VSI_PASID_EN_S 31 +#define VSI_PASID_EN_M BIT(31) +#define VSI_RUPR(_VSI) (0x00050000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_RUPR_MAX_INDEX 767 +#define VSI_RUPR_UP0_S 0 +#define VSI_RUPR_UP0_M MAKEMASK(0x7, 0) +#define VSI_RUPR_UP1_S 3 +#define VSI_RUPR_UP1_M MAKEMASK(0x7, 3) +#define VSI_RUPR_UP2_S 6 +#define VSI_RUPR_UP2_M MAKEMASK(0x7, 6) +#define VSI_RUPR_UP3_S 9 +#define VSI_RUPR_UP3_M MAKEMASK(0x7, 9) +#define VSI_RUPR_UP4_S 12 +#define VSI_RUPR_UP4_M MAKEMASK(0x7, 12) +#define VSI_RUPR_UP5_S 15 +#define VSI_RUPR_UP5_M MAKEMASK(0x7, 15) +#define VSI_RUPR_UP6_S 18 +#define VSI_RUPR_UP6_M MAKEMASK(0x7, 18) +#define VSI_RUPR_UP7_S 21 +#define VSI_RUPR_UP7_M MAKEMASK(0x7, 21) +#define VSI_RXSWCTRL(_VSI) (0x00205000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_RXSWCTRL_MAX_INDEX 767 +#define VSI_RXSWCTRL_MACVSIPRUNEENABLE_S 8 +#define VSI_RXSWCTRL_MACVSIPRUNEENABLE_M BIT(8) +#define VSI_RXSWCTRL_PRUNEENABLE_S 9 +#define VSI_RXSWCTRL_PRUNEENABLE_M MAKEMASK(0xF, 9) +#define VSI_RXSWCTRL_SRCPRUNEENABLE_S 13 +#define VSI_RXSWCTRL_SRCPRUNEENABLE_M BIT(13) +#define VSI_SRCSWCTRL(_VSI) (0x00209000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_SRCSWCTRL_MAX_INDEX 767 +#define VSI_SRCSWCTRL_ALLOWDESTOVERRIDE_S 0 +#define VSI_SRCSWCTRL_ALLOWDESTOVERRIDE_M BIT(0) +#define VSI_SRCSWCTRL_ALLOWLOOPBACK_S 1 +#define VSI_SRCSWCTRL_ALLOWLOOPBACK_M BIT(1) +#define VSI_SRCSWCTRL_LANENABLE_S 2 +#define VSI_SRCSWCTRL_LANENABLE_M BIT(2) +#define VSI_SRCSWCTRL_MACAS_S 3 +#define VSI_SRCSWCTRL_MACAS_M BIT(3) +#define VSI_SRCSWCTRL_PRUNEENABLE_S 4 +#define VSI_SRCSWCTRL_PRUNEENABLE_M MAKEMASK(0xF, 4) +#define VSI_SWITCHID(_VSI) (0x00215000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_SWITCHID_MAX_INDEX 767 +#define VSI_SWITCHID_SWITCHID_S 0 +#define VSI_SWITCHID_SWITCHID_M MAKEMASK(0xFF, 0) +#define VSI_SWT_MIREG(_VSI) (0x00207000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_SWT_MIREG_MAX_INDEX 767 +#define VSI_SWT_MIREG_MIRRULE_S 0 +#define VSI_SWT_MIREG_MIRRULE_M MAKEMASK(0x3F, 0) +#define VSI_SWT_MIREG_MIRENA_S 7 +#define VSI_SWT_MIREG_MIRENA_M BIT(7) +#define VSI_SWT_MIRIG(_VSI) (0x00208000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_SWT_MIRIG_MAX_INDEX 767 +#define VSI_SWT_MIRIG_MIRRULE_S 0 +#define VSI_SWT_MIRIG_MIRRULE_M MAKEMASK(0x3F, 0) +#define VSI_SWT_MIRIG_MIRENA_S 7 +#define VSI_SWT_MIRIG_MIRENA_M BIT(7) +#define VSI_TAIR(_VSI) (0x00044000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: PFR */ +#define VSI_TAIR_MAX_INDEX 767 +#define VSI_TAIR_PORT_TAG_ID_S 0 +#define VSI_TAIR_PORT_TAG_ID_M MAKEMASK(0xFFFF, 0) +#define VSI_TAR(_VSI) (0x00045000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_TAR_MAX_INDEX 767 +#define VSI_TAR_ACCEPTTAGGED_S 0 +#define VSI_TAR_ACCEPTTAGGED_M MAKEMASK(0x3FF, 0) +#define VSI_TAR_ACCEPTUNTAGGED_S 16 +#define VSI_TAR_ACCEPTUNTAGGED_M MAKEMASK(0x3FF, 16) +#define VSI_TIR_0(_VSI) (0x00041000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_TIR_0_MAX_INDEX 767 +#define VSI_TIR_0_PORT_TAG_ID_S 0 +#define VSI_TIR_0_PORT_TAG_ID_M MAKEMASK(0xFFFF, 0) +#define VSI_TIR_1(_VSI) (0x00042000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_TIR_1_MAX_INDEX 767 +#define VSI_TIR_1_PORT_TAG_ID_S 0 +#define VSI_TIR_1_PORT_TAG_ID_M MAKEMASK(0xFFFFFFFF, 0) +#define VSI_TIR_2(_VSI) (0x00043000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_TIR_2_MAX_INDEX 767 +#define VSI_TIR_2_PORT_TAG_ID_S 0 +#define VSI_TIR_2_PORT_TAG_ID_M MAKEMASK(0xFFFF, 0) +#define VSI_TSR(_VSI) (0x00051000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_TSR_MAX_INDEX 767 +#define VSI_TSR_STRIPTAG_S 0 +#define VSI_TSR_STRIPTAG_M MAKEMASK(0x3FF, 0) +#define VSI_TSR_SHOWTAG_S 10 +#define VSI_TSR_SHOWTAG_M MAKEMASK(0x3FF, 10) +#define VSI_TSR_SHOWPRIONLY_S 20 +#define VSI_TSR_SHOWPRIONLY_M MAKEMASK(0x3FF, 20) +#define VSI_TUPIOM(_VSI) (0x00048000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_TUPIOM_MAX_INDEX 767 +#define VSI_TUPIOM_UP0_S 0 +#define VSI_TUPIOM_UP0_M MAKEMASK(0x7, 0) +#define VSI_TUPIOM_UP1_S 3 +#define VSI_TUPIOM_UP1_M MAKEMASK(0x7, 3) +#define VSI_TUPIOM_UP2_S 6 +#define VSI_TUPIOM_UP2_M MAKEMASK(0x7, 6) +#define VSI_TUPIOM_UP3_S 9 +#define VSI_TUPIOM_UP3_M MAKEMASK(0x7, 9) +#define VSI_TUPIOM_UP4_S 12 +#define VSI_TUPIOM_UP4_M MAKEMASK(0x7, 12) +#define VSI_TUPIOM_UP5_S 15 +#define VSI_TUPIOM_UP5_M MAKEMASK(0x7, 15) +#define VSI_TUPIOM_UP6_S 18 +#define VSI_TUPIOM_UP6_M MAKEMASK(0x7, 18) +#define VSI_TUPIOM_UP7_S 21 +#define VSI_TUPIOM_UP7_M MAKEMASK(0x7, 21) +#define VSI_TUPR(_VSI) (0x00047000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSI_TUPR_MAX_INDEX 767 +#define VSI_TUPR_UP0_S 0 +#define VSI_TUPR_UP0_M MAKEMASK(0x7, 0) +#define VSI_TUPR_UP1_S 3 +#define VSI_TUPR_UP1_M MAKEMASK(0x7, 3) +#define VSI_TUPR_UP2_S 6 +#define VSI_TUPR_UP2_M MAKEMASK(0x7, 6) +#define VSI_TUPR_UP3_S 9 +#define VSI_TUPR_UP3_M MAKEMASK(0x7, 9) +#define VSI_TUPR_UP4_S 12 +#define VSI_TUPR_UP4_M MAKEMASK(0x7, 12) +#define VSI_TUPR_UP5_S 15 +#define VSI_TUPR_UP5_M MAKEMASK(0x7, 15) +#define VSI_TUPR_UP6_S 18 +#define VSI_TUPR_UP6_M MAKEMASK(0x7, 18) +#define VSI_TUPR_UP7_S 21 +#define VSI_TUPR_UP7_M MAKEMASK(0x7, 21) +#define VSI_VSI2F(_VSI) (0x001D0000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: PFR */ +#define VSI_VSI2F_MAX_INDEX 767 +#define VSI_VSI2F_VFVMNUMBER_S 0 +#define VSI_VSI2F_VFVMNUMBER_M MAKEMASK(0x3FF, 0) +#define VSI_VSI2F_FUNCTIONTYPE_S 10 +#define VSI_VSI2F_FUNCTIONTYPE_M MAKEMASK(0x3, 10) +#define VSI_VSI2F_PFNUMBER_S 12 +#define VSI_VSI2F_PFNUMBER_M MAKEMASK(0x7, 12) +#define VSI_VSI2F_BUFFERNUMBER_S 16 +#define VSI_VSI2F_BUFFERNUMBER_M MAKEMASK(0x7, 16) +#define VSI_VSI2F_VSI_NUMBER_S 20 +#define VSI_VSI2F_VSI_NUMBER_M MAKEMASK(0x3FF, 20) +#define VSI_VSI2F_VSI_ENABLE_S 31 +#define VSI_VSI2F_VSI_ENABLE_M BIT(31) +#define VSIQF_FD_CNT(_VSI) (0x00464000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: PFR */ +#define VSIQF_FD_CNT_MAX_INDEX 767 +#define VSIQF_FD_CNT_FD_GCNT_S 0 +#define VSIQF_FD_CNT_FD_GCNT_M MAKEMASK(0x3FFF, 0) +#define VSIQF_FD_CNT_FD_BCNT_S 16 +#define VSIQF_FD_CNT_FD_BCNT_M MAKEMASK(0x3FFF, 16) +#define VSIQF_FD_CTL1(_VSI) (0x00411000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSIQF_FD_CTL1_MAX_INDEX 767 +#define VSIQF_FD_CTL1_FLT_ENA_S 0 +#define VSIQF_FD_CTL1_FLT_ENA_M BIT(0) +#define VSIQF_FD_CTL1_CFG_ENA_S 1 +#define VSIQF_FD_CTL1_CFG_ENA_M BIT(1) +#define VSIQF_FD_CTL1_EVICT_ENA_S 2 +#define VSIQF_FD_CTL1_EVICT_ENA_M BIT(2) +#define VSIQF_FD_DFLT(_VSI) (0x00457000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSIQF_FD_DFLT_MAX_INDEX 767 +#define VSIQF_FD_DFLT_DEFLT_QINDX_S 0 +#define VSIQF_FD_DFLT_DEFLT_QINDX_M MAKEMASK(0x7FF, 0) +#define VSIQF_FD_DFLT_DEFLT_TOQUEUE_S 12 +#define VSIQF_FD_DFLT_DEFLT_TOQUEUE_M MAKEMASK(0x7, 12) +#define VSIQF_FD_DFLT_COMP_QINDX_S 16 +#define VSIQF_FD_DFLT_COMP_QINDX_M MAKEMASK(0x7FF, 16) +#define VSIQF_FD_DFLT_DEFLT_QINDX_PRIO_S 28 +#define VSIQF_FD_DFLT_DEFLT_QINDX_PRIO_M MAKEMASK(0x7, 28) +#define VSIQF_FD_DFLT_DEFLT_DROP_S 31 +#define VSIQF_FD_DFLT_DEFLT_DROP_M BIT(31) +#define VSIQF_FD_SIZE(_VSI) (0x00462000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSIQF_FD_SIZE_MAX_INDEX 767 +#define VSIQF_FD_SIZE_FD_GSIZE_S 0 +#define VSIQF_FD_SIZE_FD_GSIZE_M MAKEMASK(0x3FFF, 0) +#define VSIQF_FD_SIZE_FD_BSIZE_S 16 +#define VSIQF_FD_SIZE_FD_BSIZE_M MAKEMASK(0x3FFF, 16) +#define VSIQF_HASH_CTL(_VSI) (0x0040D000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSIQF_HASH_CTL_MAX_INDEX 767 +#define VSIQF_HASH_CTL_HASH_LUT_SEL_S 0 +#define VSIQF_HASH_CTL_HASH_LUT_SEL_M MAKEMASK(0x3, 0) +#define VSIQF_HASH_CTL_GLOB_LUT_S 2 +#define VSIQF_HASH_CTL_GLOB_LUT_M MAKEMASK(0xF, 2) +#define VSIQF_HASH_CTL_HASH_SCHEME_S 6 +#define VSIQF_HASH_CTL_HASH_SCHEME_M MAKEMASK(0x3, 6) +#define VSIQF_HASH_CTL_TC_OVER_SEL_S 8 +#define VSIQF_HASH_CTL_TC_OVER_SEL_M MAKEMASK(0x1F, 8) +#define VSIQF_HASH_CTL_TC_OVER_ENA_S 15 +#define VSIQF_HASH_CTL_TC_OVER_ENA_M BIT(15) +#define VSIQF_HKEY(_i, _VSI) (0x00400000 + ((_i) * 4096 + (_VSI) * 4)) /* _i=0...12, _VSI=0...767 */ /* Reset Source: PFR */ +#define VSIQF_HKEY_MAX_INDEX 12 +#define VSIQF_HKEY_KEY_0_S 0 +#define VSIQF_HKEY_KEY_0_M MAKEMASK(0xFF, 0) +#define VSIQF_HKEY_KEY_1_S 8 +#define VSIQF_HKEY_KEY_1_M MAKEMASK(0xFF, 8) +#define VSIQF_HKEY_KEY_2_S 16 +#define VSIQF_HKEY_KEY_2_M MAKEMASK(0xFF, 16) +#define VSIQF_HKEY_KEY_3_S 24 +#define VSIQF_HKEY_KEY_3_M MAKEMASK(0xFF, 24) +#define VSIQF_HLUT(_i, _VSI) (0x00420000 + ((_i) * 4096 + (_VSI) * 4)) /* _i=0...15, _VSI=0...767 */ /* Reset Source: PFR */ +#define VSIQF_HLUT_MAX_INDEX 15 +#define VSIQF_HLUT_LUT0_S 0 +#define VSIQF_HLUT_LUT0_M MAKEMASK(0xF, 0) +#define VSIQF_HLUT_LUT1_S 8 +#define VSIQF_HLUT_LUT1_M MAKEMASK(0xF, 8) +#define VSIQF_HLUT_LUT2_S 16 +#define VSIQF_HLUT_LUT2_M MAKEMASK(0xF, 16) +#define VSIQF_HLUT_LUT3_S 24 +#define VSIQF_HLUT_LUT3_M MAKEMASK(0xF, 24) +#define VSIQF_PE_CTL1(_VSI) (0x00414000 + ((_VSI) * 4)) /* _i=0...767 */ /* Reset Source: CORER */ +#define VSIQF_PE_CTL1_MAX_INDEX 767 +#define VSIQF_PE_CTL1_PE_FLTENA_S 0 +#define VSIQF_PE_CTL1_PE_FLTENA_M BIT(0) +#define VSIQF_TC_REGION(_i, _VSI) (0x00448000 + ((_i) * 4096 + (_VSI) * 4)) /* _i=0...3, _VSI=0...767 */ /* Reset Source: CORER */ +#define VSIQF_TC_REGION_MAX_INDEX 3 +#define VSIQF_TC_REGION_TC_BASE0_S 0 +#define VSIQF_TC_REGION_TC_BASE0_M MAKEMASK(0x7FF, 0) +#define VSIQF_TC_REGION_TC_SIZE0_S 11 +#define VSIQF_TC_REGION_TC_SIZE0_M MAKEMASK(0xF, 11) +#define VSIQF_TC_REGION_TC_BASE1_S 16 +#define VSIQF_TC_REGION_TC_BASE1_M MAKEMASK(0x7FF, 16) +#define VSIQF_TC_REGION_TC_SIZE1_S 27 +#define VSIQF_TC_REGION_TC_SIZE1_M MAKEMASK(0xF, 27) +#define GLPM_WUMC 0x0009DEE4 /* Reset Source: POR */ +#define GLPM_WUMC_MNG_WU_PF_S 16 +#define GLPM_WUMC_MNG_WU_PF_M MAKEMASK(0xFF, 16) +#define PFPM_APM 0x000B8080 /* Reset Source: POR */ +#define PFPM_APM_APME_S 0 +#define PFPM_APM_APME_M BIT(0) +#define PFPM_WUC 0x0009DC80 /* Reset Source: POR */ +#define PFPM_WUC_EN_APM_D0_S 5 +#define PFPM_WUC_EN_APM_D0_M BIT(5) +#define PFPM_WUFC 0x0009DC00 /* Reset Source: POR */ +#define PFPM_WUFC_LNKC_S 0 +#define PFPM_WUFC_LNKC_M BIT(0) +#define PFPM_WUFC_MAG_S 1 +#define PFPM_WUFC_MAG_M BIT(1) +#define PFPM_WUFC_MNG_S 3 +#define PFPM_WUFC_MNG_M BIT(3) +#define PFPM_WUFC_FLX0_ACT_S 4 +#define PFPM_WUFC_FLX0_ACT_M BIT(4) +#define PFPM_WUFC_FLX1_ACT_S 5 +#define PFPM_WUFC_FLX1_ACT_M BIT(5) +#define PFPM_WUFC_FLX2_ACT_S 6 +#define PFPM_WUFC_FLX2_ACT_M BIT(6) +#define PFPM_WUFC_FLX3_ACT_S 7 +#define PFPM_WUFC_FLX3_ACT_M BIT(7) +#define PFPM_WUFC_FLX4_ACT_S 8 +#define PFPM_WUFC_FLX4_ACT_M BIT(8) +#define PFPM_WUFC_FLX5_ACT_S 9 +#define PFPM_WUFC_FLX5_ACT_M BIT(9) +#define PFPM_WUFC_FLX6_ACT_S 10 +#define PFPM_WUFC_FLX6_ACT_M BIT(10) +#define PFPM_WUFC_FLX7_ACT_S 11 +#define PFPM_WUFC_FLX7_ACT_M BIT(11) +#define PFPM_WUFC_FLX0_S 16 +#define PFPM_WUFC_FLX0_M BIT(16) +#define PFPM_WUFC_FLX1_S 17 +#define PFPM_WUFC_FLX1_M BIT(17) +#define PFPM_WUFC_FLX2_S 18 +#define PFPM_WUFC_FLX2_M BIT(18) +#define PFPM_WUFC_FLX3_S 19 +#define PFPM_WUFC_FLX3_M BIT(19) +#define PFPM_WUFC_FLX4_S 20 +#define PFPM_WUFC_FLX4_M BIT(20) +#define PFPM_WUFC_FLX5_S 21 +#define PFPM_WUFC_FLX5_M BIT(21) +#define PFPM_WUFC_FLX6_S 22 +#define PFPM_WUFC_FLX6_M BIT(22) +#define PFPM_WUFC_FLX7_S 23 +#define PFPM_WUFC_FLX7_M BIT(23) +#define PFPM_WUFC_FW_RST_WK_S 31 +#define PFPM_WUFC_FW_RST_WK_M BIT(31) +#define PFPM_WUS 0x0009DB80 /* Reset Source: POR */ +#define PFPM_WUS_LNKC_S 0 +#define PFPM_WUS_LNKC_M BIT(0) +#define PFPM_WUS_MAG_S 1 +#define PFPM_WUS_MAG_M BIT(1) +#define PFPM_WUS_PME_STATUS_S 2 +#define PFPM_WUS_PME_STATUS_M BIT(2) +#define PFPM_WUS_MNG_S 3 +#define PFPM_WUS_MNG_M BIT(3) +#define PFPM_WUS_FLX0_S 16 +#define PFPM_WUS_FLX0_M BIT(16) +#define PFPM_WUS_FLX1_S 17 +#define PFPM_WUS_FLX1_M BIT(17) +#define PFPM_WUS_FLX2_S 18 +#define PFPM_WUS_FLX2_M BIT(18) +#define PFPM_WUS_FLX3_S 19 +#define PFPM_WUS_FLX3_M BIT(19) +#define PFPM_WUS_FLX4_S 20 +#define PFPM_WUS_FLX4_M BIT(20) +#define PFPM_WUS_FLX5_S 21 +#define PFPM_WUS_FLX5_M BIT(21) +#define PFPM_WUS_FLX6_S 22 +#define PFPM_WUS_FLX6_M BIT(22) +#define PFPM_WUS_FLX7_S 23 +#define PFPM_WUS_FLX7_M BIT(23) +#define PFPM_WUS_FW_RST_WK_S 31 +#define PFPM_WUS_FW_RST_WK_M BIT(31) +#define PRTPM_SAH(_i) (0x001E3BA0 + ((_i) * 32)) /* _i=0...3 */ /* Reset Source: PFR */ +#define PRTPM_SAH_MAX_INDEX 3 +#define PRTPM_SAH_PFPM_SAH_S 0 +#define PRTPM_SAH_PFPM_SAH_M MAKEMASK(0xFFFF, 0) +#define PRTPM_SAH_PF_NUM_S 26 +#define PRTPM_SAH_PF_NUM_M MAKEMASK(0xF, 26) +#define PRTPM_SAH_MC_MAG_EN_S 30 +#define PRTPM_SAH_MC_MAG_EN_M BIT(30) +#define PRTPM_SAH_AV_S 31 +#define PRTPM_SAH_AV_M BIT(31) +#define PRTPM_SAL(_i) (0x001E3B20 + ((_i) * 32)) /* _i=0...3 */ /* Reset Source: PFR */ +#define PRTPM_SAL_MAX_INDEX 3 +#define PRTPM_SAL_PFPM_SAL_S 0 +#define PRTPM_SAL_PFPM_SAL_M MAKEMASK(0xFFFFFFFF, 0) +#define GLPE_CQM_FUNC_INVALIDATE 0x00503300 /* Reset Source: CORER */ +#define GLPE_CQM_FUNC_INVALIDATE_PF_NUM_S 0 +#define GLPE_CQM_FUNC_INVALIDATE_PF_NUM_M MAKEMASK(0x7, 0) +#define GLPE_CQM_FUNC_INVALIDATE_VM_VF_NUM_S 3 +#define GLPE_CQM_FUNC_INVALIDATE_VM_VF_NUM_M MAKEMASK(0x3FF, 3) +#define GLPE_CQM_FUNC_INVALIDATE_VM_VF_TYPE_S 13 +#define GLPE_CQM_FUNC_INVALIDATE_VM_VF_TYPE_M MAKEMASK(0x3, 13) +#define GLPE_CQM_FUNC_INVALIDATE_ENABLE_S 31 +#define GLPE_CQM_FUNC_INVALIDATE_ENABLE_M BIT(31) +#define VFPE_MRTEIDXMASK 0x00009000 /* Reset Source: PFR */ +#define VFPE_MRTEIDXMASK_MRTEIDXMASKBITS_S 0 +#define VFPE_MRTEIDXMASK_MRTEIDXMASKBITS_M MAKEMASK(0x1F, 0) +#define GLTSYN_HH_DLAY 0x0008881C /* Reset Source: CORER */ +#define GLTSYN_HH_DLAY_SYNC_DELAY_S 0 +#define GLTSYN_HH_DLAY_SYNC_DELAY_M MAKEMASK(0xF, 0) +#define VF_MBX_ARQBAH1 0x00006000 /* Reset Source: CORER */ +#define VF_MBX_ARQBAH1_ARQBAH_S 0 +#define VF_MBX_ARQBAH1_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_MBX_ARQBAL1 0x00006C00 /* Reset Source: CORER */ +#define VF_MBX_ARQBAL1_ARQBAL_LSB_S 0 +#define VF_MBX_ARQBAL1_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define VF_MBX_ARQBAL1_ARQBAL_S 6 +#define VF_MBX_ARQBAL1_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VF_MBX_ARQH1 0x00007400 /* Reset Source: CORER */ +#define VF_MBX_ARQH1_ARQH_S 0 +#define VF_MBX_ARQH1_ARQH_M MAKEMASK(0x3FF, 0) +#define VF_MBX_ARQLEN1 0x00008000 /* Reset Source: PFR */ +#define VF_MBX_ARQLEN1_ARQLEN_S 0 +#define VF_MBX_ARQLEN1_ARQLEN_M MAKEMASK(0x3FF, 0) +#define VF_MBX_ARQLEN1_ARQVFE_S 28 +#define VF_MBX_ARQLEN1_ARQVFE_M BIT(28) +#define VF_MBX_ARQLEN1_ARQOVFL_S 29 +#define VF_MBX_ARQLEN1_ARQOVFL_M BIT(29) +#define VF_MBX_ARQLEN1_ARQCRIT_S 30 +#define VF_MBX_ARQLEN1_ARQCRIT_M BIT(30) +#define VF_MBX_ARQLEN1_ARQENABLE_S 31 +#define VF_MBX_ARQLEN1_ARQENABLE_M BIT(31) +#define VF_MBX_ARQT1 0x00007000 /* Reset Source: CORER */ +#define VF_MBX_ARQT1_ARQT_S 0 +#define VF_MBX_ARQT1_ARQT_M MAKEMASK(0x3FF, 0) +#define VF_MBX_ATQBAH1 0x00007800 /* Reset Source: CORER */ +#define VF_MBX_ATQBAH1_ATQBAH_S 0 +#define VF_MBX_ATQBAH1_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_MBX_ATQBAL1 0x00007C00 /* Reset Source: CORER */ +#define VF_MBX_ATQBAL1_ATQBAL_S 6 +#define VF_MBX_ATQBAL1_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VF_MBX_ATQH1 0x00006400 /* Reset Source: CORER */ +#define VF_MBX_ATQH1_ATQH_S 0 +#define VF_MBX_ATQH1_ATQH_M MAKEMASK(0x3FF, 0) +#define VF_MBX_ATQLEN1 0x00006800 /* Reset Source: PFR */ +#define VF_MBX_ATQLEN1_ATQLEN_S 0 +#define VF_MBX_ATQLEN1_ATQLEN_M MAKEMASK(0x3FF, 0) +#define VF_MBX_ATQLEN1_ATQVFE_S 28 +#define VF_MBX_ATQLEN1_ATQVFE_M BIT(28) +#define VF_MBX_ATQLEN1_ATQOVFL_S 29 +#define VF_MBX_ATQLEN1_ATQOVFL_M BIT(29) +#define VF_MBX_ATQLEN1_ATQCRIT_S 30 +#define VF_MBX_ATQLEN1_ATQCRIT_M BIT(30) +#define VF_MBX_ATQLEN1_ATQENABLE_S 31 +#define VF_MBX_ATQLEN1_ATQENABLE_M BIT(31) +#define VF_MBX_ATQT1 0x00008400 /* Reset Source: CORER */ +#define VF_MBX_ATQT1_ATQT_S 0 +#define VF_MBX_ATQT1_ATQT_M MAKEMASK(0x3FF, 0) +#define PFPCI_VF_FLUSH_DONE1 0x0000E400 /* Reset Source: PCIR */ +#define PFPCI_VF_FLUSH_DONE1_FLUSH_DONE_S 0 +#define PFPCI_VF_FLUSH_DONE1_FLUSH_DONE_M BIT(0) +#define VFGEN_RSTAT1 0x00008800 /* Reset Source: VFR */ +#define VFGEN_RSTAT1_VFR_STATE_S 0 +#define VFGEN_RSTAT1_VFR_STATE_M MAKEMASK(0x3, 0) +#define VFINT_DYN_CTL0 0x00005C00 /* Reset Source: CORER */ +#define VFINT_DYN_CTL0_INTENA_S 0 +#define VFINT_DYN_CTL0_INTENA_M BIT(0) +#define VFINT_DYN_CTL0_CLEARPBA_S 1 +#define VFINT_DYN_CTL0_CLEARPBA_M BIT(1) +#define VFINT_DYN_CTL0_SWINT_TRIG_S 2 +#define VFINT_DYN_CTL0_SWINT_TRIG_M BIT(2) +#define VFINT_DYN_CTL0_ITR_INDX_S 3 +#define VFINT_DYN_CTL0_ITR_INDX_M MAKEMASK(0x3, 3) +#define VFINT_DYN_CTL0_INTERVAL_S 5 +#define VFINT_DYN_CTL0_INTERVAL_M MAKEMASK(0xFFF, 5) +#define VFINT_DYN_CTL0_SW_ITR_INDX_ENA_S 24 +#define VFINT_DYN_CTL0_SW_ITR_INDX_ENA_M BIT(24) +#define VFINT_DYN_CTL0_SW_ITR_INDX_S 25 +#define VFINT_DYN_CTL0_SW_ITR_INDX_M MAKEMASK(0x3, 25) +#define VFINT_DYN_CTL0_WB_ON_ITR_S 30 +#define VFINT_DYN_CTL0_WB_ON_ITR_M BIT(30) +#define VFINT_DYN_CTL0_INTENA_MSK_S 31 +#define VFINT_DYN_CTL0_INTENA_MSK_M BIT(31) +#define VFINT_DYN_CTLN(_i) (0x00003800 + ((_i) * 4)) /* _i=0...63 */ /* Reset Source: CORER */ +#define VFINT_DYN_CTLN_MAX_INDEX 63 +#define VFINT_DYN_CTLN_INTENA_S 0 +#define VFINT_DYN_CTLN_INTENA_M BIT(0) +#define VFINT_DYN_CTLN_CLEARPBA_S 1 +#define VFINT_DYN_CTLN_CLEARPBA_M BIT(1) +#define VFINT_DYN_CTLN_SWINT_TRIG_S 2 +#define VFINT_DYN_CTLN_SWINT_TRIG_M BIT(2) +#define VFINT_DYN_CTLN_ITR_INDX_S 3 +#define VFINT_DYN_CTLN_ITR_INDX_M MAKEMASK(0x3, 3) +#define VFINT_DYN_CTLN_INTERVAL_S 5 +#define VFINT_DYN_CTLN_INTERVAL_M MAKEMASK(0xFFF, 5) +#define VFINT_DYN_CTLN_SW_ITR_INDX_ENA_S 24 +#define VFINT_DYN_CTLN_SW_ITR_INDX_ENA_M BIT(24) +#define VFINT_DYN_CTLN_SW_ITR_INDX_S 25 +#define VFINT_DYN_CTLN_SW_ITR_INDX_M MAKEMASK(0x3, 25) +#define VFINT_DYN_CTLN_WB_ON_ITR_S 30 +#define VFINT_DYN_CTLN_WB_ON_ITR_M BIT(30) +#define VFINT_DYN_CTLN_INTENA_MSK_S 31 +#define VFINT_DYN_CTLN_INTENA_MSK_M BIT(31) +#define VFINT_ITR0(_i) (0x00004C00 + ((_i) * 4)) /* _i=0...2 */ /* Reset Source: CORER */ +#define VFINT_ITR0_MAX_INDEX 2 +#define VFINT_ITR0_INTERVAL_S 0 +#define VFINT_ITR0_INTERVAL_M MAKEMASK(0xFFF, 0) +#define VFINT_ITRN(_i, _j) (0x00002800 + ((_i) * 4 + (_j) * 12)) /* _i=0...2, _j=0...63 */ /* Reset Source: CORER */ +#define VFINT_ITRN_MAX_INDEX 2 +#define VFINT_ITRN_INTERVAL_S 0 +#define VFINT_ITRN_INTERVAL_M MAKEMASK(0xFFF, 0) +#define QRX_TAIL1(_QRX) (0x00002000 + ((_QRX) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define QRX_TAIL1_MAX_INDEX 255 +#define QRX_TAIL1_TAIL_S 0 +#define QRX_TAIL1_TAIL_M MAKEMASK(0x1FFF, 0) +#define QTX_TAIL(_DBQM) (0x00000000 + ((_DBQM) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define QTX_TAIL_MAX_INDEX 255 +#define QTX_TAIL_QTX_COMM_DBELL_S 0 +#define QTX_TAIL_QTX_COMM_DBELL_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_MBX_CPM_ARQBAH1 0x0000F060 /* Reset Source: CORER */ +#define VF_MBX_CPM_ARQBAH1_ARQBAH_S 0 +#define VF_MBX_CPM_ARQBAH1_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_MBX_CPM_ARQBAL1 0x0000F050 /* Reset Source: CORER */ +#define VF_MBX_CPM_ARQBAL1_ARQBAL_LSB_S 0 +#define VF_MBX_CPM_ARQBAL1_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define VF_MBX_CPM_ARQBAL1_ARQBAL_S 6 +#define VF_MBX_CPM_ARQBAL1_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VF_MBX_CPM_ARQH1 0x0000F080 /* Reset Source: CORER */ +#define VF_MBX_CPM_ARQH1_ARQH_S 0 +#define VF_MBX_CPM_ARQH1_ARQH_M MAKEMASK(0x3FF, 0) +#define VF_MBX_CPM_ARQLEN1 0x0000F070 /* Reset Source: PFR */ +#define VF_MBX_CPM_ARQLEN1_ARQLEN_S 0 +#define VF_MBX_CPM_ARQLEN1_ARQLEN_M MAKEMASK(0x3FF, 0) +#define VF_MBX_CPM_ARQLEN1_ARQVFE_S 28 +#define VF_MBX_CPM_ARQLEN1_ARQVFE_M BIT(28) +#define VF_MBX_CPM_ARQLEN1_ARQOVFL_S 29 +#define VF_MBX_CPM_ARQLEN1_ARQOVFL_M BIT(29) +#define VF_MBX_CPM_ARQLEN1_ARQCRIT_S 30 +#define VF_MBX_CPM_ARQLEN1_ARQCRIT_M BIT(30) +#define VF_MBX_CPM_ARQLEN1_ARQENABLE_S 31 +#define VF_MBX_CPM_ARQLEN1_ARQENABLE_M BIT(31) +#define VF_MBX_CPM_ARQT1 0x0000F090 /* Reset Source: CORER */ +#define VF_MBX_CPM_ARQT1_ARQT_S 0 +#define VF_MBX_CPM_ARQT1_ARQT_M MAKEMASK(0x3FF, 0) +#define VF_MBX_CPM_ATQBAH1 0x0000F010 /* Reset Source: CORER */ +#define VF_MBX_CPM_ATQBAH1_ATQBAH_S 0 +#define VF_MBX_CPM_ATQBAH1_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_MBX_CPM_ATQBAL1 0x0000F000 /* Reset Source: CORER */ +#define VF_MBX_CPM_ATQBAL1_ATQBAL_S 6 +#define VF_MBX_CPM_ATQBAL1_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VF_MBX_CPM_ATQH1 0x0000F030 /* Reset Source: CORER */ +#define VF_MBX_CPM_ATQH1_ATQH_S 0 +#define VF_MBX_CPM_ATQH1_ATQH_M MAKEMASK(0x3FF, 0) +#define VF_MBX_CPM_ATQLEN1 0x0000F020 /* Reset Source: PFR */ +#define VF_MBX_CPM_ATQLEN1_ATQLEN_S 0 +#define VF_MBX_CPM_ATQLEN1_ATQLEN_M MAKEMASK(0x3FF, 0) +#define VF_MBX_CPM_ATQLEN1_ATQVFE_S 28 +#define VF_MBX_CPM_ATQLEN1_ATQVFE_M BIT(28) +#define VF_MBX_CPM_ATQLEN1_ATQOVFL_S 29 +#define VF_MBX_CPM_ATQLEN1_ATQOVFL_M BIT(29) +#define VF_MBX_CPM_ATQLEN1_ATQCRIT_S 30 +#define VF_MBX_CPM_ATQLEN1_ATQCRIT_M BIT(30) +#define VF_MBX_CPM_ATQLEN1_ATQENABLE_S 31 +#define VF_MBX_CPM_ATQLEN1_ATQENABLE_M BIT(31) +#define VF_MBX_CPM_ATQT1 0x0000F040 /* Reset Source: CORER */ +#define VF_MBX_CPM_ATQT1_ATQT_S 0 +#define VF_MBX_CPM_ATQT1_ATQT_M MAKEMASK(0x3FF, 0) +#define VF_MBX_HLP_ARQBAH1 0x00020060 /* Reset Source: CORER */ +#define VF_MBX_HLP_ARQBAH1_ARQBAH_S 0 +#define VF_MBX_HLP_ARQBAH1_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_MBX_HLP_ARQBAL1 0x00020050 /* Reset Source: CORER */ +#define VF_MBX_HLP_ARQBAL1_ARQBAL_LSB_S 0 +#define VF_MBX_HLP_ARQBAL1_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define VF_MBX_HLP_ARQBAL1_ARQBAL_S 6 +#define VF_MBX_HLP_ARQBAL1_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VF_MBX_HLP_ARQH1 0x00020080 /* Reset Source: CORER */ +#define VF_MBX_HLP_ARQH1_ARQH_S 0 +#define VF_MBX_HLP_ARQH1_ARQH_M MAKEMASK(0x3FF, 0) +#define VF_MBX_HLP_ARQLEN1 0x00020070 /* Reset Source: PFR */ +#define VF_MBX_HLP_ARQLEN1_ARQLEN_S 0 +#define VF_MBX_HLP_ARQLEN1_ARQLEN_M MAKEMASK(0x3FF, 0) +#define VF_MBX_HLP_ARQLEN1_ARQVFE_S 28 +#define VF_MBX_HLP_ARQLEN1_ARQVFE_M BIT(28) +#define VF_MBX_HLP_ARQLEN1_ARQOVFL_S 29 +#define VF_MBX_HLP_ARQLEN1_ARQOVFL_M BIT(29) +#define VF_MBX_HLP_ARQLEN1_ARQCRIT_S 30 +#define VF_MBX_HLP_ARQLEN1_ARQCRIT_M BIT(30) +#define VF_MBX_HLP_ARQLEN1_ARQENABLE_S 31 +#define VF_MBX_HLP_ARQLEN1_ARQENABLE_M BIT(31) +#define VF_MBX_HLP_ARQT1 0x00020090 /* Reset Source: CORER */ +#define VF_MBX_HLP_ARQT1_ARQT_S 0 +#define VF_MBX_HLP_ARQT1_ARQT_M MAKEMASK(0x3FF, 0) +#define VF_MBX_HLP_ATQBAH1 0x00020010 /* Reset Source: CORER */ +#define VF_MBX_HLP_ATQBAH1_ATQBAH_S 0 +#define VF_MBX_HLP_ATQBAH1_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_MBX_HLP_ATQBAL1 0x00020000 /* Reset Source: CORER */ +#define VF_MBX_HLP_ATQBAL1_ATQBAL_S 6 +#define VF_MBX_HLP_ATQBAL1_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VF_MBX_HLP_ATQH1 0x00020030 /* Reset Source: CORER */ +#define VF_MBX_HLP_ATQH1_ATQH_S 0 +#define VF_MBX_HLP_ATQH1_ATQH_M MAKEMASK(0x3FF, 0) +#define VF_MBX_HLP_ATQLEN1 0x00020020 /* Reset Source: PFR */ +#define VF_MBX_HLP_ATQLEN1_ATQLEN_S 0 +#define VF_MBX_HLP_ATQLEN1_ATQLEN_M MAKEMASK(0x3FF, 0) +#define VF_MBX_HLP_ATQLEN1_ATQVFE_S 28 +#define VF_MBX_HLP_ATQLEN1_ATQVFE_M BIT(28) +#define VF_MBX_HLP_ATQLEN1_ATQOVFL_S 29 +#define VF_MBX_HLP_ATQLEN1_ATQOVFL_M BIT(29) +#define VF_MBX_HLP_ATQLEN1_ATQCRIT_S 30 +#define VF_MBX_HLP_ATQLEN1_ATQCRIT_M BIT(30) +#define VF_MBX_HLP_ATQLEN1_ATQENABLE_S 31 +#define VF_MBX_HLP_ATQLEN1_ATQENABLE_M BIT(31) +#define VF_MBX_HLP_ATQT1 0x00020040 /* Reset Source: CORER */ +#define VF_MBX_HLP_ATQT1_ATQT_S 0 +#define VF_MBX_HLP_ATQT1_ATQT_M MAKEMASK(0x3FF, 0) +#define VF_MBX_PSM_ARQBAH1 0x00021060 /* Reset Source: CORER */ +#define VF_MBX_PSM_ARQBAH1_ARQBAH_S 0 +#define VF_MBX_PSM_ARQBAH1_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_MBX_PSM_ARQBAL1 0x00021050 /* Reset Source: CORER */ +#define VF_MBX_PSM_ARQBAL1_ARQBAL_LSB_S 0 +#define VF_MBX_PSM_ARQBAL1_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define VF_MBX_PSM_ARQBAL1_ARQBAL_S 6 +#define VF_MBX_PSM_ARQBAL1_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VF_MBX_PSM_ARQH1 0x00021080 /* Reset Source: CORER */ +#define VF_MBX_PSM_ARQH1_ARQH_S 0 +#define VF_MBX_PSM_ARQH1_ARQH_M MAKEMASK(0x3FF, 0) +#define VF_MBX_PSM_ARQLEN1 0x00021070 /* Reset Source: PFR */ +#define VF_MBX_PSM_ARQLEN1_ARQLEN_S 0 +#define VF_MBX_PSM_ARQLEN1_ARQLEN_M MAKEMASK(0x3FF, 0) +#define VF_MBX_PSM_ARQLEN1_ARQVFE_S 28 +#define VF_MBX_PSM_ARQLEN1_ARQVFE_M BIT(28) +#define VF_MBX_PSM_ARQLEN1_ARQOVFL_S 29 +#define VF_MBX_PSM_ARQLEN1_ARQOVFL_M BIT(29) +#define VF_MBX_PSM_ARQLEN1_ARQCRIT_S 30 +#define VF_MBX_PSM_ARQLEN1_ARQCRIT_M BIT(30) +#define VF_MBX_PSM_ARQLEN1_ARQENABLE_S 31 +#define VF_MBX_PSM_ARQLEN1_ARQENABLE_M BIT(31) +#define VF_MBX_PSM_ARQT1 0x00021090 /* Reset Source: CORER */ +#define VF_MBX_PSM_ARQT1_ARQT_S 0 +#define VF_MBX_PSM_ARQT1_ARQT_M MAKEMASK(0x3FF, 0) +#define VF_MBX_PSM_ATQBAH1 0x00021010 /* Reset Source: CORER */ +#define VF_MBX_PSM_ATQBAH1_ATQBAH_S 0 +#define VF_MBX_PSM_ATQBAH1_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_MBX_PSM_ATQBAL1 0x00021000 /* Reset Source: CORER */ +#define VF_MBX_PSM_ATQBAL1_ATQBAL_S 6 +#define VF_MBX_PSM_ATQBAL1_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VF_MBX_PSM_ATQH1 0x00021030 /* Reset Source: CORER */ +#define VF_MBX_PSM_ATQH1_ATQH_S 0 +#define VF_MBX_PSM_ATQH1_ATQH_M MAKEMASK(0x3FF, 0) +#define VF_MBX_PSM_ATQLEN1 0x00021020 /* Reset Source: PFR */ +#define VF_MBX_PSM_ATQLEN1_ATQLEN_S 0 +#define VF_MBX_PSM_ATQLEN1_ATQLEN_M MAKEMASK(0x3FF, 0) +#define VF_MBX_PSM_ATQLEN1_ATQVFE_S 28 +#define VF_MBX_PSM_ATQLEN1_ATQVFE_M BIT(28) +#define VF_MBX_PSM_ATQLEN1_ATQOVFL_S 29 +#define VF_MBX_PSM_ATQLEN1_ATQOVFL_M BIT(29) +#define VF_MBX_PSM_ATQLEN1_ATQCRIT_S 30 +#define VF_MBX_PSM_ATQLEN1_ATQCRIT_M BIT(30) +#define VF_MBX_PSM_ATQLEN1_ATQENABLE_S 31 +#define VF_MBX_PSM_ATQLEN1_ATQENABLE_M BIT(31) +#define VF_MBX_PSM_ATQT1 0x00021040 /* Reset Source: CORER */ +#define VF_MBX_PSM_ATQT1_ATQT_S 0 +#define VF_MBX_PSM_ATQT1_ATQT_M MAKEMASK(0x3FF, 0) +#define VF_SB_CPM_ARQBAH1 0x0000F160 /* Reset Source: CORER */ +#define VF_SB_CPM_ARQBAH1_ARQBAH_S 0 +#define VF_SB_CPM_ARQBAH1_ARQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_SB_CPM_ARQBAL1 0x0000F150 /* Reset Source: CORER */ +#define VF_SB_CPM_ARQBAL1_ARQBAL_LSB_S 0 +#define VF_SB_CPM_ARQBAL1_ARQBAL_LSB_M MAKEMASK(0x3F, 0) +#define VF_SB_CPM_ARQBAL1_ARQBAL_S 6 +#define VF_SB_CPM_ARQBAL1_ARQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VF_SB_CPM_ARQH1 0x0000F180 /* Reset Source: CORER */ +#define VF_SB_CPM_ARQH1_ARQH_S 0 +#define VF_SB_CPM_ARQH1_ARQH_M MAKEMASK(0x3FF, 0) +#define VF_SB_CPM_ARQLEN1 0x0000F170 /* Reset Source: PFR */ +#define VF_SB_CPM_ARQLEN1_ARQLEN_S 0 +#define VF_SB_CPM_ARQLEN1_ARQLEN_M MAKEMASK(0x3FF, 0) +#define VF_SB_CPM_ARQLEN1_ARQVFE_S 28 +#define VF_SB_CPM_ARQLEN1_ARQVFE_M BIT(28) +#define VF_SB_CPM_ARQLEN1_ARQOVFL_S 29 +#define VF_SB_CPM_ARQLEN1_ARQOVFL_M BIT(29) +#define VF_SB_CPM_ARQLEN1_ARQCRIT_S 30 +#define VF_SB_CPM_ARQLEN1_ARQCRIT_M BIT(30) +#define VF_SB_CPM_ARQLEN1_ARQENABLE_S 31 +#define VF_SB_CPM_ARQLEN1_ARQENABLE_M BIT(31) +#define VF_SB_CPM_ARQT1 0x0000F190 /* Reset Source: CORER */ +#define VF_SB_CPM_ARQT1_ARQT_S 0 +#define VF_SB_CPM_ARQT1_ARQT_M MAKEMASK(0x3FF, 0) +#define VF_SB_CPM_ATQBAH1 0x0000F110 /* Reset Source: CORER */ +#define VF_SB_CPM_ATQBAH1_ATQBAH_S 0 +#define VF_SB_CPM_ATQBAH1_ATQBAH_M MAKEMASK(0xFFFFFFFF, 0) +#define VF_SB_CPM_ATQBAL1 0x0000F100 /* Reset Source: CORER */ +#define VF_SB_CPM_ATQBAL1_ATQBAL_S 6 +#define VF_SB_CPM_ATQBAL1_ATQBAL_M MAKEMASK(0x3FFFFFF, 6) +#define VF_SB_CPM_ATQH1 0x0000F130 /* Reset Source: CORER */ +#define VF_SB_CPM_ATQH1_ATQH_S 0 +#define VF_SB_CPM_ATQH1_ATQH_M MAKEMASK(0x3FF, 0) +#define VF_SB_CPM_ATQLEN1 0x0000F120 /* Reset Source: PFR */ +#define VF_SB_CPM_ATQLEN1_ATQLEN_S 0 +#define VF_SB_CPM_ATQLEN1_ATQLEN_M MAKEMASK(0x3FF, 0) +#define VF_SB_CPM_ATQLEN1_ATQVFE_S 28 +#define VF_SB_CPM_ATQLEN1_ATQVFE_M BIT(28) +#define VF_SB_CPM_ATQLEN1_ATQOVFL_S 29 +#define VF_SB_CPM_ATQLEN1_ATQOVFL_M BIT(29) +#define VF_SB_CPM_ATQLEN1_ATQCRIT_S 30 +#define VF_SB_CPM_ATQLEN1_ATQCRIT_M BIT(30) +#define VF_SB_CPM_ATQLEN1_ATQENABLE_S 31 +#define VF_SB_CPM_ATQLEN1_ATQENABLE_M BIT(31) +#define VF_SB_CPM_ATQT1 0x0000F140 /* Reset Source: CORER */ +#define VF_SB_CPM_ATQT1_ATQT_S 0 +#define VF_SB_CPM_ATQT1_ATQT_M MAKEMASK(0x3FF, 0) +#define VFINT_DYN_CTL(_i) (0x00023000 + ((_i) * 4096)) /* _i=0...7 */ /* Reset Source: CORER */ +#define VFINT_DYN_CTL_MAX_INDEX 7 +#define VFINT_DYN_CTL_INTENA_S 0 +#define VFINT_DYN_CTL_INTENA_M BIT(0) +#define VFINT_DYN_CTL_CLEARPBA_S 1 +#define VFINT_DYN_CTL_CLEARPBA_M BIT(1) +#define VFINT_DYN_CTL_SWINT_TRIG_S 2 +#define VFINT_DYN_CTL_SWINT_TRIG_M BIT(2) +#define VFINT_DYN_CTL_ITR_INDX_S 3 +#define VFINT_DYN_CTL_ITR_INDX_M MAKEMASK(0x3, 3) +#define VFINT_DYN_CTL_INTERVAL_S 5 +#define VFINT_DYN_CTL_INTERVAL_M MAKEMASK(0xFFF, 5) +#define VFINT_DYN_CTL_SW_ITR_INDX_ENA_S 24 +#define VFINT_DYN_CTL_SW_ITR_INDX_ENA_M BIT(24) +#define VFINT_DYN_CTL_SW_ITR_INDX_S 25 +#define VFINT_DYN_CTL_SW_ITR_INDX_M MAKEMASK(0x3, 25) +#define VFINT_DYN_CTL_WB_ON_ITR_S 30 +#define VFINT_DYN_CTL_WB_ON_ITR_M BIT(30) +#define VFINT_DYN_CTL_INTENA_MSK_S 31 +#define VFINT_DYN_CTL_INTENA_MSK_M BIT(31) +#define VFINT_ITR_0(_i) (0x00023004 + ((_i) * 4096)) /* _i=0...7 */ /* Reset Source: CORER */ +#define VFINT_ITR_0_MAX_INDEX 7 +#define VFINT_ITR_0_INTERVAL_S 0 +#define VFINT_ITR_0_INTERVAL_M MAKEMASK(0xFFF, 0) +#define VFINT_ITR_1(_i) (0x00023008 + ((_i) * 4096)) /* _i=0...7 */ /* Reset Source: CORER */ +#define VFINT_ITR_1_MAX_INDEX 7 +#define VFINT_ITR_1_INTERVAL_S 0 +#define VFINT_ITR_1_INTERVAL_M MAKEMASK(0xFFF, 0) +#define VFINT_ITR_2(_i) (0x0002300C + ((_i) * 4096)) /* _i=0...7 */ /* Reset Source: CORER */ +#define VFINT_ITR_2_MAX_INDEX 7 +#define VFINT_ITR_2_INTERVAL_S 0 +#define VFINT_ITR_2_INTERVAL_M MAKEMASK(0xFFF, 0) +#define VFQRX_TAIL(_QRX) (0x0002E000 + ((_QRX) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VFQRX_TAIL_MAX_INDEX 255 +#define VFQRX_TAIL_TAIL_S 0 +#define VFQRX_TAIL_TAIL_M MAKEMASK(0x1FFF, 0) +#define VFQTX_COMM_DBELL(_DBQM) (0x00030000 + ((_DBQM) * 4)) /* _i=0...255 */ /* Reset Source: CORER */ +#define VFQTX_COMM_DBELL_MAX_INDEX 255 +#define VFQTX_COMM_DBELL_QTX_COMM_DBELL_S 0 +#define VFQTX_COMM_DBELL_QTX_COMM_DBELL_M MAKEMASK(0xFFFFFFFF, 0) +#define VFQTX_COMM_DBLQ_DBELL(_DBLQ) (0x00022000 + ((_DBLQ) * 4)) /* _i=0...3 */ /* Reset Source: CORER */ +#define VFQTX_COMM_DBLQ_DBELL_MAX_INDEX 3 +#define VFQTX_COMM_DBLQ_DBELL_TAIL_S 0 +#define VFQTX_COMM_DBLQ_DBELL_TAIL_M MAKEMASK(0x1FFF, 0) +#define MSIX_TMSG1(_i) (0x00000008 + ((_i) * 16)) /* _i=0...64 */ /* Reset Source: FLR */ +#define MSIX_TMSG1_MAX_INDEX 64 +#define MSIX_TMSG1_MSIXTMSG_S 0 +#define MSIX_TMSG1_MSIXTMSG_M MAKEMASK(0xFFFFFFFF, 0) +#define VFPE_AEQALLOC1 0x0000A400 /* Reset Source: VFR */ +#define VFPE_AEQALLOC1_AECOUNT_S 0 +#define VFPE_AEQALLOC1_AECOUNT_M MAKEMASK(0xFFFFFFFF, 0) +#define VFPE_CCQPHIGH1 0x00009800 /* Reset Source: VFR */ +#define VFPE_CCQPHIGH1_PECCQPHIGH_S 0 +#define VFPE_CCQPHIGH1_PECCQPHIGH_M MAKEMASK(0xFFFFFFFF, 0) +#define VFPE_CCQPLOW1 0x0000AC00 /* Reset Source: VFR */ +#define VFPE_CCQPLOW1_PECCQPLOW_S 0 +#define VFPE_CCQPLOW1_PECCQPLOW_M MAKEMASK(0xFFFFFFFF, 0) +#define VFPE_CCQPSTATUS1 0x0000B800 /* Reset Source: VFR */ +#define VFPE_CCQPSTATUS1_CCQP_DONE_S 0 +#define VFPE_CCQPSTATUS1_CCQP_DONE_M BIT(0) +#define VFPE_CCQPSTATUS1_HMC_PROFILE_S 4 +#define VFPE_CCQPSTATUS1_HMC_PROFILE_M MAKEMASK(0x7, 4) +#define VFPE_CCQPSTATUS1_RDMA_EN_VFS_S 16 +#define VFPE_CCQPSTATUS1_RDMA_EN_VFS_M MAKEMASK(0x3F, 16) +#define VFPE_CCQPSTATUS1_CCQP_ERR_S 31 +#define VFPE_CCQPSTATUS1_CCQP_ERR_M BIT(31) +#define VFPE_CQACK1 0x0000B000 /* Reset Source: VFR */ +#define VFPE_CQACK1_PECQID_S 0 +#define VFPE_CQACK1_PECQID_M MAKEMASK(0x7FFFF, 0) +#define VFPE_CQARM1 0x0000B400 /* Reset Source: VFR */ +#define VFPE_CQARM1_PECQID_S 0 +#define VFPE_CQARM1_PECQID_M MAKEMASK(0x7FFFF, 0) +#define VFPE_CQPDB1 0x0000BC00 /* Reset Source: VFR */ +#define VFPE_CQPDB1_WQHEAD_S 0 +#define VFPE_CQPDB1_WQHEAD_M MAKEMASK(0x7FF, 0) +#define VFPE_CQPERRCODES1 0x00009C00 /* Reset Source: VFR */ +#define VFPE_CQPERRCODES1_CQP_MINOR_CODE_S 0 +#define VFPE_CQPERRCODES1_CQP_MINOR_CODE_M MAKEMASK(0xFFFF, 0) +#define VFPE_CQPERRCODES1_CQP_MAJOR_CODE_S 16 +#define VFPE_CQPERRCODES1_CQP_MAJOR_CODE_M MAKEMASK(0xFFFF, 16) +#define VFPE_CQPTAIL1 0x0000A000 /* Reset Source: VFR */ +#define VFPE_CQPTAIL1_WQTAIL_S 0 +#define VFPE_CQPTAIL1_WQTAIL_M MAKEMASK(0x7FF, 0) +#define VFPE_CQPTAIL1_CQP_OP_ERR_S 31 +#define VFPE_CQPTAIL1_CQP_OP_ERR_M BIT(31) +#define VFPE_IPCONFIG01 0x00008C00 /* Reset Source: VFR */ +#define VFPE_IPCONFIG01_PEIPID_S 0 +#define VFPE_IPCONFIG01_PEIPID_M MAKEMASK(0xFFFF, 0) +#define VFPE_IPCONFIG01_USEENTIREIDRANGE_S 16 +#define VFPE_IPCONFIG01_USEENTIREIDRANGE_M BIT(16) +#define VFPE_IPCONFIG01_UDP_SRC_PORT_MASK_EN_S 17 +#define VFPE_IPCONFIG01_UDP_SRC_PORT_MASK_EN_M BIT(17) +#define VFPE_MRTEIDXMASK1(_VF) (0x00509800 + ((_VF) * 4)) /* _i=0...255 */ /* Reset Source: PFR */ +#define VFPE_MRTEIDXMASK1_MAX_INDEX 255 +#define VFPE_MRTEIDXMASK1_MRTEIDXMASKBITS_S 0 +#define VFPE_MRTEIDXMASK1_MRTEIDXMASKBITS_M MAKEMASK(0x1F, 0) +#define VFPE_RCVUNEXPECTEDERROR1 0x00009400 /* Reset Source: VFR */ +#define VFPE_RCVUNEXPECTEDERROR1_TCP_RX_UNEXP_ERR_S 0 +#define VFPE_RCVUNEXPECTEDERROR1_TCP_RX_UNEXP_ERR_M MAKEMASK(0xFFFFFF, 0) +#define VFPE_TCPNOWTIMER1 0x0000A800 /* Reset Source: VFR */ +#define VFPE_TCPNOWTIMER1_TCP_NOW_S 0 +#define VFPE_TCPNOWTIMER1_TCP_NOW_M MAKEMASK(0xFFFFFFFF, 0) +#define VFPE_WQEALLOC1 0x0000C000 /* Reset Source: VFR */ +#define VFPE_WQEALLOC1_PEQPID_S 0 +#define VFPE_WQEALLOC1_PEQPID_M MAKEMASK(0x3FFFF, 0) +#define VFPE_WQEALLOC1_WQE_DESC_INDEX_S 20 +#define VFPE_WQEALLOC1_WQE_DESC_INDEX_M MAKEMASK(0xFFF, 20) +#endif /* !_ICE_HW_AUTOGEN_H_ */ + +#ifndef _ICE_ADMINQ_CMD_H_ +#define _ICE_ADMINQ_CMD_H_ + +/* This header file defines the Admin Queue commands, error codes and + * descriptor format. It is shared between Firmware and Software. + */ + +#if 0 +#include "ice_osdep.h" +#include "ice_defs.h" +#include "ice_bitops.h" +#endif + +#define ICE_MAX_VSI 768 +#define ICE_AQC_TOPO_MAX_LEVEL_NUM 0x9 +#define ICE_AQ_SET_MAC_FRAME_SIZE_MAX 9728 + +enum ice_aq_res_access_type { + ICE_RES_READ = 1, + ICE_RES_WRITE +}; + +struct ice_aqc_generic { + uint32_t param0; + uint32_t param1; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Get version (direct 0x0001) */ +struct ice_aqc_get_ver { + uint32_t rom_ver; + uint32_t fw_build; + uint8_t fw_branch; + uint8_t fw_major; + uint8_t fw_minor; + uint8_t fw_patch; + uint8_t api_branch; + uint8_t api_major; + uint8_t api_minor; + uint8_t api_patch; +}; + +/* Send driver version (indirect 0x0002) */ +struct ice_aqc_driver_ver { + uint8_t major_ver; + uint8_t minor_ver; + uint8_t build_ver; + uint8_t subbuild_ver; + uint8_t reserved[4]; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Queue Shutdown (direct 0x0003) */ +struct ice_aqc_q_shutdown { + uint8_t driver_unloading; +#define ICE_AQC_DRIVER_UNLOADING BIT(0) + uint8_t reserved[15]; +}; + +/* Get Expanded Error Code (0x0005, direct) */ +struct ice_aqc_get_exp_err { + uint32_t reason; +#define ICE_AQC_EXPANDED_ERROR_NOT_PROVIDED 0xFFFFFFFF + uint32_t identifier; + uint8_t rsvd[8]; +}; + +/* Request resource ownership (direct 0x0008) + * Release resource ownership (direct 0x0009) + */ +struct ice_aqc_req_res { + uint16_t res_id; +#define ICE_AQC_RES_ID_NVM 1 +#define ICE_AQC_RES_ID_SDP 2 +#define ICE_AQC_RES_ID_CHNG_LOCK 3 +#define ICE_AQC_RES_ID_GLBL_LOCK 4 + uint16_t access_type; +#define ICE_AQC_RES_ACCESS_READ 1 +#define ICE_AQC_RES_ACCESS_WRITE 2 + + /* Upon successful completion, FW writes this value and driver is + * expected to release resource before timeout. This value is provided + * in milliseconds. + */ + uint32_t timeout; +#define ICE_AQ_RES_NVM_READ_DFLT_TIMEOUT_MS 3000 +#define ICE_AQ_RES_NVM_WRITE_DFLT_TIMEOUT_MS 180000 +#define ICE_AQ_RES_CHNG_LOCK_DFLT_TIMEOUT_MS 1000 +#define ICE_AQ_RES_GLBL_LOCK_DFLT_TIMEOUT_MS 3000 + /* For SDP: pin ID of the SDP */ + uint32_t res_number; + /* Status is only used for ICE_AQC_RES_ID_GLBL_LOCK */ + uint16_t status; +#define ICE_AQ_RES_GLBL_SUCCESS 0 +#define ICE_AQ_RES_GLBL_IN_PROG 1 +#define ICE_AQ_RES_GLBL_DONE 2 + uint8_t reserved[2]; +}; + +/* Get function capabilities (indirect 0x000A) + * Get device capabilities (indirect 0x000B) + */ +struct ice_aqc_list_caps { + uint8_t cmd_flags; + uint8_t pf_index; + uint8_t reserved[2]; + uint32_t count; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Device/Function buffer entry, repeated per reported capability */ +struct ice_aqc_list_caps_elem { + uint16_t cap; +#define ICE_AQC_CAPS_SWITCHING_MODE 0x0001 +#define ICE_AQC_CAPS_MANAGEABILITY_MODE 0x0002 +#define ICE_AQC_CAPS_OS2BMC 0x0004 +#define ICE_AQC_CAPS_VALID_FUNCTIONS 0x0005 +#define ICE_AQC_MAX_VALID_FUNCTIONS 0x8 +#define ICE_AQC_CAPS_ALTERNATE_RAM 0x0006 +#define ICE_AQC_CAPS_WOL_PROXY 0x0008 +#define ICE_AQC_CAPS_SRIOV 0x0012 +#define ICE_AQC_CAPS_VF 0x0013 +#define ICE_AQC_CAPS_VMDQ 0x0014 +#define ICE_AQC_CAPS_802_1QBG 0x0015 +#define ICE_AQC_CAPS_802_1BR 0x0016 +#define ICE_AQC_CAPS_VSI 0x0017 +#define ICE_AQC_CAPS_DCB 0x0018 +#define ICE_AQC_CAPS_RSVD 0x0021 +#define ICE_AQC_CAPS_ISCSI 0x0022 +#define ICE_AQC_CAPS_RSS 0x0040 +#define ICE_AQC_CAPS_RXQS 0x0041 +#define ICE_AQC_CAPS_TXQS 0x0042 +#define ICE_AQC_CAPS_MSIX 0x0043 +#define ICE_AQC_CAPS_MAX_MTU 0x0047 +#define ICE_AQC_CAPS_CEM 0x00F2 +#define ICE_AQC_CAPS_IWARP 0x0051 +#define ICE_AQC_CAPS_LED 0x0061 +#define ICE_AQC_CAPS_SDP 0x0062 +#define ICE_AQC_CAPS_WR_CSR_PROT 0x0064 +#define ICE_AQC_CAPS_SENSOR_READING 0x0067 +#define ICE_AQC_CAPS_LOGI_TO_PHYSI_PORT_MAP 0x0073 +#define ICE_AQC_CAPS_SKU 0x0074 +#define ICE_AQC_CAPS_PORT_MAP 0x0075 +#define ICE_AQC_CAPS_PCIE_RESET_AVOIDANCE 0x0076 +#define ICE_AQC_CAPS_POST_UPDATE_RESET_RESTRICT 0x0077 +#define ICE_AQC_CAPS_NVM_MGMT 0x0080 +#define ICE_AQC_CAPS_EXT_TOPO_DEV_IMG0 0x0081 +#define ICE_AQC_CAPS_EXT_TOPO_DEV_IMG1 0x0082 +#define ICE_AQC_CAPS_EXT_TOPO_DEV_IMG2 0x0083 +#define ICE_AQC_CAPS_EXT_TOPO_DEV_IMG3 0x0084 +#define ICE_AQC_CAPS_TX_SCHED_TOPO_COMP_MODE 0x0085 +#define ICE_AQC_CAPS_NAC_TOPOLOGY 0x0087 +#define ICE_AQC_CAPS_DYN_FLATTENING 0x008A +#define ICE_AQC_CAPS_OROM_RECOVERY_UPDATE 0x0090 +#define ICE_AQC_CAPS_ROCEV2_LAG 0x0092 +#define ICE_AQC_BIT_ROCEV2_LAG 0x01 +#define ICE_AQC_BIT_SRIOV_LAG 0x02 + + uint8_t major_ver; + uint8_t minor_ver; + /* Number of resources described by this capability */ + uint32_t number; + /* Only meaningful for some types of resources */ + uint32_t logical_id; + /* Only meaningful for some types of resources */ + uint32_t phys_id; + uint64_t rsvd1; + uint64_t rsvd2; +}; + +/* Manage MAC address, read command - indirect (0x0107) + * This struct is also used for the response + */ +struct ice_aqc_manage_mac_read { + uint16_t flags; /* Zeroed by device driver */ +#define ICE_AQC_MAN_MAC_LAN_ADDR_VALID BIT(4) +#define ICE_AQC_MAN_MAC_SAN_ADDR_VALID BIT(5) +#define ICE_AQC_MAN_MAC_PORT_ADDR_VALID BIT(6) +#define ICE_AQC_MAN_MAC_WOL_ADDR_VALID BIT(7) +#define ICE_AQC_MAN_MAC_MC_MAG_EN BIT(8) +#define ICE_AQC_MAN_MAC_WOL_PRESERVE_ON_PFR BIT(9) +#define ICE_AQC_MAN_MAC_READ_S 4 +#define ICE_AQC_MAN_MAC_READ_M (0xF << ICE_AQC_MAN_MAC_READ_S) + uint8_t rsvd[2]; + uint8_t num_addr; /* Used in response */ + uint8_t rsvd1[3]; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Response buffer format for manage MAC read command */ +struct ice_aqc_manage_mac_read_resp { + uint8_t lport_num; + uint8_t addr_type; +#define ICE_AQC_MAN_MAC_ADDR_TYPE_LAN 0 +#define ICE_AQC_MAN_MAC_ADDR_TYPE_WOL 1 + uint8_t mac_addr[ETHER_ADDR_LEN]; +}; + +/* Manage MAC address, write command - direct (0x0108) */ +struct ice_aqc_manage_mac_write { + uint8_t rsvd; + uint8_t flags; +#define ICE_AQC_MAN_MAC_WR_MC_MAG_EN BIT(0) +#define ICE_AQC_MAN_MAC_WR_WOL_LAA_PFR_KEEP BIT(1) +#define ICE_AQC_MAN_MAC_WR_S 6 +#define ICE_AQC_MAN_MAC_WR_M MAKEMASK(3, ICE_AQC_MAN_MAC_WR_S) +#define ICE_AQC_MAN_MAC_UPDATE_LAA 0 +#define ICE_AQC_MAN_MAC_UPDATE_LAA_WOL BIT(ICE_AQC_MAN_MAC_WR_S) + /* byte stream in network order */ + uint8_t mac_addr[ETHER_ADDR_LEN]; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Clear PXE Command and response (direct 0x0110) */ +struct ice_aqc_clear_pxe { + uint8_t rx_cnt; +#define ICE_AQC_CLEAR_PXE_RX_CNT 0x2 + uint8_t reserved[15]; +}; + +/* Configure No-Drop Policy Command (direct 0x0112) */ +struct ice_aqc_config_no_drop_policy { + uint8_t opts; +#define ICE_AQC_FORCE_NO_DROP BIT(0) + uint8_t rsvd[15]; +}; + +/* Get switch configuration (0x0200) */ +struct ice_aqc_get_sw_cfg { + /* Reserved for command and copy of request flags for response */ + uint16_t flags; + /* First desc in case of command and next_elem in case of response + * In case of response, if it is not zero, means all the configuration + * was not returned and new command shall be sent with this value in + * the 'first desc' field + */ + uint16_t element; + /* Reserved for command, only used for response */ + uint16_t num_elems; + uint16_t rsvd; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Each entry in the response buffer is of the following type: */ +struct ice_aqc_get_sw_cfg_resp_elem { + /* VSI/Port Number */ + uint16_t vsi_port_num; +#define ICE_AQC_GET_SW_CONF_RESP_VSI_PORT_NUM_S 0 +#define ICE_AQC_GET_SW_CONF_RESP_VSI_PORT_NUM_M \ + (0x3FF << ICE_AQC_GET_SW_CONF_RESP_VSI_PORT_NUM_S) +#define ICE_AQC_GET_SW_CONF_RESP_TYPE_S 14 +#define ICE_AQC_GET_SW_CONF_RESP_TYPE_M (0x3 << ICE_AQC_GET_SW_CONF_RESP_TYPE_S) +#define ICE_AQC_GET_SW_CONF_RESP_PHYS_PORT 0 +#define ICE_AQC_GET_SW_CONF_RESP_VIRT_PORT 1 +#define ICE_AQC_GET_SW_CONF_RESP_VSI 2 + + /* SWID VSI/Port belongs to */ + uint16_t swid; + + /* Bit 14..0 : PF/VF number VSI belongs to + * Bit 15 : VF indication bit + */ + uint16_t pf_vf_num; +#define ICE_AQC_GET_SW_CONF_RESP_FUNC_NUM_S 0 +#define ICE_AQC_GET_SW_CONF_RESP_FUNC_NUM_M \ + (0x7FFF << ICE_AQC_GET_SW_CONF_RESP_FUNC_NUM_S) +#define ICE_AQC_GET_SW_CONF_RESP_IS_VF BIT(15) +}; + +/* Set Port parameters, (direct, 0x0203) */ +struct ice_aqc_set_port_params { + uint16_t cmd_flags; +#define ICE_AQC_SET_P_PARAMS_SAVE_BAD_PACKETS BIT(0) +#define ICE_AQC_SET_P_PARAMS_PAD_SHORT_PACKETS BIT(1) +#define ICE_AQC_SET_P_PARAMS_DOUBLE_VLAN_ENA BIT(2) + uint16_t bad_frame_vsi; +#define ICE_AQC_SET_P_PARAMS_VSI_S 0 +#define ICE_AQC_SET_P_PARAMS_VSI_M (0x3FF << ICE_AQC_SET_P_PARAMS_VSI_S) +#define ICE_AQC_SET_P_PARAMS_VSI_VALID BIT(15) + uint16_t swid; +#define ICE_AQC_SET_P_PARAMS_SWID_S 0 +#define ICE_AQC_SET_P_PARAMS_SWID_M (0xFF << ICE_AQC_SET_P_PARAMS_SWID_S) +#define ICE_AQC_SET_P_PARAMS_LOGI_PORT_ID_S 8 +#define ICE_AQC_SET_P_PARAMS_LOGI_PORT_ID_M \ + (0x3F << ICE_AQC_SET_P_PARAMS_LOGI_PORT_ID_S) +#define ICE_AQC_SET_P_PARAMS_IS_LOGI_PORT BIT(14) +#define ICE_AQC_SET_P_PARAMS_SWID_VALID BIT(15) + uint8_t reserved[10]; +}; + +/* These resource type defines are used for all switch resource + * commands where a resource type is required, such as: + * Get Resource Allocation command (indirect 0x0204) + * Allocate Resources command (indirect 0x0208) + * Free Resources command (indirect 0x0209) + * Get Allocated Resource Descriptors Command (indirect 0x020A) + */ +#define ICE_AQC_RES_TYPE_VEB_COUNTER 0x00 +#define ICE_AQC_RES_TYPE_VLAN_COUNTER 0x01 +#define ICE_AQC_RES_TYPE_MIRROR_RULE 0x02 +#define ICE_AQC_RES_TYPE_VSI_LIST_REP 0x03 +#define ICE_AQC_RES_TYPE_VSI_LIST_PRUNE 0x04 +#define ICE_AQC_RES_TYPE_RECIPE 0x05 +#define ICE_AQC_RES_TYPE_PROFILE 0x06 +#define ICE_AQC_RES_TYPE_SWID 0x07 +#define ICE_AQC_RES_TYPE_VSI 0x08 +#define ICE_AQC_RES_TYPE_FLU 0x09 +#define ICE_AQC_RES_TYPE_WIDE_TABLE_1 0x0A +#define ICE_AQC_RES_TYPE_WIDE_TABLE_2 0x0B +#define ICE_AQC_RES_TYPE_WIDE_TABLE_4 0x0C +#define ICE_AQC_RES_TYPE_GLOBAL_RSS_HASH 0x20 +#define ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK 0x21 +#define ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES 0x22 +#define ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES 0x23 +#define ICE_AQC_RES_TYPE_FLEX_DESC_PROG 0x30 +#define ICE_AQC_RES_TYPE_SWITCH_PROF_BLDR_PROFID 0x48 +#define ICE_AQC_RES_TYPE_SWITCH_PROF_BLDR_TCAM 0x49 +#define ICE_AQC_RES_TYPE_ACL_PROF_BLDR_PROFID 0x50 +#define ICE_AQC_RES_TYPE_ACL_PROF_BLDR_TCAM 0x51 +#define ICE_AQC_RES_TYPE_HASH_PROF_BLDR_PROFID 0x60 +#define ICE_AQC_RES_TYPE_HASH_PROF_BLDR_TCAM 0x61 +/* Resource types 0x62-67 are reserved for Hash profile builder */ +#define ICE_AQC_RES_TYPE_QHASH_PROF_BLDR_PROFID 0x68 +#define ICE_AQC_RES_TYPE_QHASH_PROF_BLDR_TCAM 0x69 + +#define ICE_AQC_RES_TYPE_FLAG_SHARED BIT(7) +#define ICE_AQC_RES_TYPE_FLAG_SCAN_BOTTOM BIT(12) +#define ICE_AQC_RES_TYPE_FLAG_IGNORE_INDEX BIT(13) +#define ICE_AQC_RES_TYPE_FLAG_SUBSCRIBE_SHARED BIT(14) +#define ICE_AQC_RES_TYPE_FLAG_SUBSCRIBE_CTL BIT(15) + +#define ICE_AQC_RES_TYPE_FLAG_DEDICATED 0x00 + +#define ICE_AQC_RES_TYPE_S 0 +#define ICE_AQC_RES_TYPE_M (0x07F << ICE_AQC_RES_TYPE_S) + +/* Get Resource Allocation command (indirect 0x0204) */ +struct ice_aqc_get_res_alloc { + uint16_t resp_elem_num; /* Used in response, reserved in command */ + uint8_t reserved[6]; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Get Resource Allocation Response Buffer per response */ +struct ice_aqc_get_res_resp_elem { + uint16_t res_type; /* Types defined above cmd 0x0204 */ + uint16_t total_capacity; /* Resources available to all PF's */ + uint16_t total_function; /* Resources allocated for a PF */ + uint16_t total_shared; /* Resources allocated as shared */ + uint16_t total_free; /* Resources un-allocated/not reserved by any PF */ +}; + +/* Allocate Resources command (indirect 0x0208) + * Free Resources command (indirect 0x0209) + */ +struct ice_aqc_alloc_free_res_cmd { + uint16_t num_entries; /* Number of Resource entries */ + uint8_t reserved[6]; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Resource descriptor */ +struct ice_aqc_res_elem { + union { + uint16_t sw_resp; + uint16_t flu_resp; + } e; +}; + +/* Buffer for Allocate/Free Resources commands */ +struct ice_aqc_alloc_free_res_elem { + uint16_t res_type; /* Types defined above cmd 0x0204 */ +#define ICE_AQC_RES_TYPE_VSI_PRUNE_LIST_S 8 +#define ICE_AQC_RES_TYPE_VSI_PRUNE_LIST_M \ + (0xF << ICE_AQC_RES_TYPE_VSI_PRUNE_LIST_S) + uint16_t num_elems; + struct ice_aqc_res_elem elem[STRUCT_HACK_VAR_LEN]; +}; + +/* Get Allocated Resource Descriptors Command (indirect 0x020A) */ +struct ice_aqc_get_allocd_res_desc { + union { + struct { + uint16_t res; /* Types defined above cmd 0x0204 */ + uint16_t first_desc; + uint32_t reserved; + } cmd; + struct { + uint16_t res; + uint16_t next_desc; + uint16_t num_desc; + uint16_t reserved; + } resp; + } ops; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Request buffer for Set VLAN Mode AQ command (indirect 0x020C) */ +struct ice_aqc_set_vlan_mode { + uint8_t reserved; + uint8_t l2tag_prio_tagging; +#define ICE_AQ_VLAN_PRIO_TAG_S 0 +#define ICE_AQ_VLAN_PRIO_TAG_M (0x7 << ICE_AQ_VLAN_PRIO_TAG_S) +#define ICE_AQ_VLAN_PRIO_TAG_NOT_SUPPORTED 0x0 +#define ICE_AQ_VLAN_PRIO_TAG_STAG 0x1 +#define ICE_AQ_VLAN_PRIO_TAG_OUTER_CTAG 0x2 +#define ICE_AQ_VLAN_PRIO_TAG_OUTER_VLAN 0x3 +#define ICE_AQ_VLAN_PRIO_TAG_INNER_CTAG 0x4 +#define ICE_AQ_VLAN_PRIO_TAG_MAX 0x4 +#define ICE_AQ_VLAN_PRIO_TAG_ERROR 0x7 + uint8_t l2tag_reserved[64]; + uint8_t rdma_packet; +#define ICE_AQ_VLAN_RDMA_TAG_S 0 +#define ICE_AQ_VLAN_RDMA_TAG_M (0x3F << ICE_AQ_VLAN_RDMA_TAG_S) +#define ICE_AQ_SVM_VLAN_RDMA_PKT_FLAG_SETTING 0x10 +#define ICE_AQ_DVM_VLAN_RDMA_PKT_FLAG_SETTING 0x1A + uint8_t rdma_reserved[2]; + uint8_t mng_vlan_prot_id; +#define ICE_AQ_VLAN_MNG_PROTOCOL_ID_OUTER 0x10 +#define ICE_AQ_VLAN_MNG_PROTOCOL_ID_INNER 0x11 + uint8_t prot_id_reserved[30]; +}; + +/* Response buffer for Get VLAN Mode AQ command (indirect 0x020D) */ +struct ice_aqc_get_vlan_mode { + uint8_t vlan_mode; +#define ICE_AQ_VLAN_MODE_DVM_ENA BIT(0) + uint8_t l2tag_prio_tagging; + uint8_t reserved[98]; +}; + +/* Add VSI (indirect 0x0210) + * Update VSI (indirect 0x0211) + * Get VSI (indirect 0x0212) + * Free VSI (indirect 0x0213) + */ +struct ice_aqc_add_get_update_free_vsi { + uint16_t vsi_num; +#define ICE_AQ_VSI_NUM_S 0 +#define ICE_AQ_VSI_NUM_M (0x03FF << ICE_AQ_VSI_NUM_S) +#define ICE_AQ_VSI_IS_VALID BIT(15) + uint16_t cmd_flags; +#define ICE_AQ_VSI_KEEP_ALLOC 0x1 + uint8_t vf_id; + uint8_t reserved; + uint16_t vsi_flags; +#define ICE_AQ_VSI_TYPE_S 0 +#define ICE_AQ_VSI_TYPE_M (0x3 << ICE_AQ_VSI_TYPE_S) +#define ICE_AQ_VSI_TYPE_VF 0x0 +#define ICE_AQ_VSI_TYPE_VMDQ2 0x1 +#define ICE_AQ_VSI_TYPE_PF 0x2 +#define ICE_AQ_VSI_TYPE_EMP_MNG 0x3 + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Response descriptor for: + * Add VSI (indirect 0x0210) + * Update VSI (indirect 0x0211) + * Free VSI (indirect 0x0213) + */ +struct ice_aqc_add_update_free_vsi_resp { + uint16_t vsi_num; + uint16_t ext_status; + uint16_t vsi_used; + uint16_t vsi_free; + uint32_t addr_high; + uint32_t addr_low; +}; + +struct ice_aqc_get_vsi_resp { + uint16_t vsi_num; + uint8_t vf_id; + /* The vsi_flags field uses the ICE_AQ_VSI_TYPE_* defines for values. + * These are found above in struct ice_aqc_add_get_update_free_vsi. + */ + uint8_t vsi_flags; + uint16_t vsi_used; + uint16_t vsi_free; + uint32_t addr_high; + uint32_t addr_low; +}; + +struct ice_aqc_vsi_props { + uint16_t valid_sections; +#define ICE_AQ_VSI_PROP_SW_VALID BIT(0) +#define ICE_AQ_VSI_PROP_SECURITY_VALID BIT(1) +#define ICE_AQ_VSI_PROP_VLAN_VALID BIT(2) +#define ICE_AQ_VSI_PROP_OUTER_TAG_VALID BIT(3) +#define ICE_AQ_VSI_PROP_INGRESS_UP_VALID BIT(4) +#define ICE_AQ_VSI_PROP_EGRESS_UP_VALID BIT(5) +#define ICE_AQ_VSI_PROP_RXQ_MAP_VALID BIT(6) +#define ICE_AQ_VSI_PROP_Q_OPT_VALID BIT(7) +#define ICE_AQ_VSI_PROP_OUTER_UP_VALID BIT(8) +#define ICE_AQ_VSI_PROP_FLOW_DIR_VALID BIT(11) +#define ICE_AQ_VSI_PROP_PASID_VALID BIT(12) + /* switch section */ + uint8_t sw_id; + uint8_t sw_flags; +#define ICE_AQ_VSI_SW_FLAG_ALLOW_LB BIT(5) +#define ICE_AQ_VSI_SW_FLAG_LOCAL_LB BIT(6) +#define ICE_AQ_VSI_SW_FLAG_SRC_PRUNE BIT(7) + uint8_t sw_flags2; +#define ICE_AQ_VSI_SW_FLAG_RX_PRUNE_EN_S 0 +#define ICE_AQ_VSI_SW_FLAG_RX_PRUNE_EN_M (0xF << ICE_AQ_VSI_SW_FLAG_RX_PRUNE_EN_S) +#define ICE_AQ_VSI_SW_FLAG_RX_VLAN_PRUNE_ENA BIT(0) +#define ICE_AQ_VSI_SW_FLAG_RX_PASS_PRUNE_ENA BIT(3) +#define ICE_AQ_VSI_SW_FLAG_LAN_ENA BIT(4) + uint8_t veb_stat_id; +#define ICE_AQ_VSI_SW_VEB_STAT_ID_S 0 +#define ICE_AQ_VSI_SW_VEB_STAT_ID_M (0x1F << ICE_AQ_VSI_SW_VEB_STAT_ID_S) +#define ICE_AQ_VSI_SW_VEB_STAT_ID_VALID BIT(5) + /* security section */ + uint8_t sec_flags; +#define ICE_AQ_VSI_SEC_FLAG_ALLOW_DEST_OVRD BIT(0) +#define ICE_AQ_VSI_SEC_FLAG_ENA_MAC_ANTI_SPOOF BIT(2) +#define ICE_AQ_VSI_SEC_TX_PRUNE_ENA_S 4 +#define ICE_AQ_VSI_SEC_TX_PRUNE_ENA_M (0xF << ICE_AQ_VSI_SEC_TX_PRUNE_ENA_S) +#define ICE_AQ_VSI_SEC_TX_VLAN_PRUNE_ENA BIT(0) + uint8_t sec_reserved; + /* VLAN section */ + uint16_t port_based_inner_vlan; /* VLANS include priority bits */ + uint8_t inner_vlan_reserved[2]; + uint8_t inner_vlan_flags; +#define ICE_AQ_VSI_INNER_VLAN_TX_MODE_S 0 +#define ICE_AQ_VSI_INNER_VLAN_TX_MODE_M (0x3 << ICE_AQ_VSI_INNER_VLAN_TX_MODE_S) +#define ICE_AQ_VSI_INNER_VLAN_TX_MODE_ACCEPTUNTAGGED 0x1 +#define ICE_AQ_VSI_INNER_VLAN_TX_MODE_ACCEPTTAGGED 0x2 +#define ICE_AQ_VSI_INNER_VLAN_TX_MODE_ALL 0x3 +#define ICE_AQ_VSI_INNER_VLAN_INSERT_PVID BIT(2) +#define ICE_AQ_VSI_INNER_VLAN_EMODE_S 3 +#define ICE_AQ_VSI_INNER_VLAN_EMODE_M (0x3 << ICE_AQ_VSI_INNER_VLAN_EMODE_S) +#define ICE_AQ_VSI_INNER_VLAN_EMODE_STR_BOTH (0x0 << ICE_AQ_VSI_INNER_VLAN_EMODE_S) +#define ICE_AQ_VSI_INNER_VLAN_EMODE_STR_UP (0x1 << ICE_AQ_VSI_INNER_VLAN_EMODE_S) +#define ICE_AQ_VSI_INNER_VLAN_EMODE_STR (0x2 << ICE_AQ_VSI_INNER_VLAN_EMODE_S) +#define ICE_AQ_VSI_INNER_VLAN_EMODE_NOTHING (0x3 << ICE_AQ_VSI_INNER_VLAN_EMODE_S) +#define ICE_AQ_VSI_INNER_VLAN_BLOCK_TX_DESC BIT(5) + uint8_t inner_vlan_reserved2[3]; + /* ingress egress up sections */ + uint32_t ingress_table; /* bitmap, 3 bits per up */ +#define ICE_AQ_VSI_UP_TABLE_UP0_S 0 +#define ICE_AQ_VSI_UP_TABLE_UP0_M (0x7 << ICE_AQ_VSI_UP_TABLE_UP0_S) +#define ICE_AQ_VSI_UP_TABLE_UP1_S 3 +#define ICE_AQ_VSI_UP_TABLE_UP1_M (0x7 << ICE_AQ_VSI_UP_TABLE_UP1_S) +#define ICE_AQ_VSI_UP_TABLE_UP2_S 6 +#define ICE_AQ_VSI_UP_TABLE_UP2_M (0x7 << ICE_AQ_VSI_UP_TABLE_UP2_S) +#define ICE_AQ_VSI_UP_TABLE_UP3_S 9 +#define ICE_AQ_VSI_UP_TABLE_UP3_M (0x7 << ICE_AQ_VSI_UP_TABLE_UP3_S) +#define ICE_AQ_VSI_UP_TABLE_UP4_S 12 +#define ICE_AQ_VSI_UP_TABLE_UP4_M (0x7 << ICE_AQ_VSI_UP_TABLE_UP4_S) +#define ICE_AQ_VSI_UP_TABLE_UP5_S 15 +#define ICE_AQ_VSI_UP_TABLE_UP5_M (0x7 << ICE_AQ_VSI_UP_TABLE_UP5_S) +#define ICE_AQ_VSI_UP_TABLE_UP6_S 18 +#define ICE_AQ_VSI_UP_TABLE_UP6_M (0x7 << ICE_AQ_VSI_UP_TABLE_UP6_S) +#define ICE_AQ_VSI_UP_TABLE_UP7_S 21 +#define ICE_AQ_VSI_UP_TABLE_UP7_M (0x7 << ICE_AQ_VSI_UP_TABLE_UP7_S) + uint32_t egress_table; /* same defines as for ingress table */ + /* outer tags section */ + uint16_t port_based_outer_vlan; + uint8_t outer_vlan_flags; +#define ICE_AQ_VSI_OUTER_VLAN_EMODE_S 0 +#define ICE_AQ_VSI_OUTER_VLAN_EMODE_M (0x3 << ICE_AQ_VSI_OUTER_VLAN_EMODE_S) +#define ICE_AQ_VSI_OUTER_VLAN_EMODE_SHOW_BOTH 0x0 +#define ICE_AQ_VSI_OUTER_VLAN_EMODE_SHOW_UP 0x1 +#define ICE_AQ_VSI_OUTER_VLAN_EMODE_SHOW 0x2 +#define ICE_AQ_VSI_OUTER_VLAN_EMODE_NOTHING 0x3 +#define ICE_AQ_VSI_OUTER_TAG_TYPE_S 2 +#define ICE_AQ_VSI_OUTER_TAG_TYPE_M (0x3 << ICE_AQ_VSI_OUTER_TAG_TYPE_S) +#define ICE_AQ_VSI_OUTER_TAG_NONE 0x0 +#define ICE_AQ_VSI_OUTER_TAG_STAG 0x1 +#define ICE_AQ_VSI_OUTER_TAG_VLAN_8100 0x2 +#define ICE_AQ_VSI_OUTER_TAG_VLAN_9100 0x3 +#define ICE_AQ_VSI_OUTER_VLAN_PORT_BASED_INSERT BIT(4) +#define ICE_AQ_VSI_OUTER_VLAN_TX_MODE_S 5 +#define ICE_AQ_VSI_OUTER_VLAN_TX_MODE_M (0x3 << ICE_AQ_VSI_OUTER_VLAN_TX_MODE_S) +#define ICE_AQ_VSI_OUTER_VLAN_TX_MODE_ACCEPTUNTAGGED 0x1 +#define ICE_AQ_VSI_OUTER_VLAN_TX_MODE_ACCEPTTAGGED 0x2 +#define ICE_AQ_VSI_OUTER_VLAN_TX_MODE_ALL 0x3 +#define ICE_AQ_VSI_OUTER_VLAN_BLOCK_TX_DESC BIT(7) + uint8_t outer_vlan_reserved; + /* queue mapping section */ + uint16_t mapping_flags; +#define ICE_AQ_VSI_Q_MAP_CONTIG 0x0 +#define ICE_AQ_VSI_Q_MAP_NONCONTIG BIT(0) + uint16_t q_mapping[16]; +#define ICE_AQ_VSI_Q_S 0 +#define ICE_AQ_VSI_Q_M (0x7FF << ICE_AQ_VSI_Q_S) + uint16_t tc_mapping[8]; +#define ICE_AQ_VSI_TC_Q_OFFSET_S 0 +#define ICE_AQ_VSI_TC_Q_OFFSET_M (0x7FF << ICE_AQ_VSI_TC_Q_OFFSET_S) +#define ICE_AQ_VSI_TC_Q_NUM_S 11 +#define ICE_AQ_VSI_TC_Q_NUM_M (0xF << ICE_AQ_VSI_TC_Q_NUM_S) + /* queueing option section */ + uint8_t q_opt_rss; +#define ICE_AQ_VSI_Q_OPT_RSS_LUT_S 0 +#define ICE_AQ_VSI_Q_OPT_RSS_LUT_M (0x3 << ICE_AQ_VSI_Q_OPT_RSS_LUT_S) +#define ICE_AQ_VSI_Q_OPT_RSS_LUT_VSI 0x0 +#define ICE_AQ_VSI_Q_OPT_RSS_LUT_PF 0x2 +#define ICE_AQ_VSI_Q_OPT_RSS_LUT_GBL 0x3 +#define ICE_AQ_VSI_Q_OPT_RSS_GBL_LUT_S 2 +#define ICE_AQ_VSI_Q_OPT_RSS_GBL_LUT_M (0xF << ICE_AQ_VSI_Q_OPT_RSS_GBL_LUT_S) +#define ICE_AQ_VSI_Q_OPT_RSS_HASH_S 6 +#define ICE_AQ_VSI_Q_OPT_RSS_HASH_M (0x3 << ICE_AQ_VSI_Q_OPT_RSS_HASH_S) +#define ICE_AQ_VSI_Q_OPT_RSS_TPLZ (0x0 << ICE_AQ_VSI_Q_OPT_RSS_HASH_S) +#define ICE_AQ_VSI_Q_OPT_RSS_SYM_TPLZ (0x1 << ICE_AQ_VSI_Q_OPT_RSS_HASH_S) +#define ICE_AQ_VSI_Q_OPT_RSS_XOR (0x2 << ICE_AQ_VSI_Q_OPT_RSS_HASH_S) +#define ICE_AQ_VSI_Q_OPT_RSS_JHASH (0x3 << ICE_AQ_VSI_Q_OPT_RSS_HASH_S) + uint8_t q_opt_tc; +#define ICE_AQ_VSI_Q_OPT_TC_OVR_S 0 +#define ICE_AQ_VSI_Q_OPT_TC_OVR_M (0x1F << ICE_AQ_VSI_Q_OPT_TC_OVR_S) +#define ICE_AQ_VSI_Q_OPT_PROF_TC_OVR BIT(7) + uint8_t q_opt_flags; +#define ICE_AQ_VSI_Q_OPT_PE_FLTR_EN BIT(0) + uint8_t q_opt_reserved[3]; + /* outer up section */ + uint32_t outer_up_table; /* same structure and defines as ingress tbl */ + /* section 10 */ + uint16_t sect_10_reserved; + /* flow director section */ + uint16_t fd_options; +#define ICE_AQ_VSI_FD_ENABLE BIT(0) +#define ICE_AQ_VSI_FD_TX_AUTO_ENABLE BIT(1) +#define ICE_AQ_VSI_FD_PROG_ENABLE BIT(3) + uint16_t max_fd_fltr_dedicated; + uint16_t max_fd_fltr_shared; + uint16_t fd_def_q; +#define ICE_AQ_VSI_FD_DEF_Q_S 0 +#define ICE_AQ_VSI_FD_DEF_Q_M (0x7FF << ICE_AQ_VSI_FD_DEF_Q_S) +#define ICE_AQ_VSI_FD_DEF_GRP_S 12 +#define ICE_AQ_VSI_FD_DEF_GRP_M (0x7 << ICE_AQ_VSI_FD_DEF_GRP_S) + uint16_t fd_report_opt; +#define ICE_AQ_VSI_FD_REPORT_Q_S 0 +#define ICE_AQ_VSI_FD_REPORT_Q_M (0x7FF << ICE_AQ_VSI_FD_REPORT_Q_S) +#define ICE_AQ_VSI_FD_DEF_PRIORITY_S 12 +#define ICE_AQ_VSI_FD_DEF_PRIORITY_M (0x7 << ICE_AQ_VSI_FD_DEF_PRIORITY_S) +#define ICE_AQ_VSI_FD_DEF_DROP BIT(15) + /* PASID section */ + uint32_t pasid_id; +#define ICE_AQ_VSI_PASID_ID_S 0 +#define ICE_AQ_VSI_PASID_ID_M (0xFFFFF << ICE_AQ_VSI_PASID_ID_S) +#define ICE_AQ_VSI_PASID_ID_VALID BIT(31) + uint8_t reserved[24]; +}; + +/* Add/update mirror rule - direct (0x0260) */ +#define ICE_AQC_RULE_ID_VALID_S 7 +#define ICE_AQC_RULE_ID_VALID_M (0x1 << ICE_AQC_RULE_ID_VALID_S) +#define ICE_AQC_RULE_ID_S 0 +#define ICE_AQC_RULE_ID_M (0x3F << ICE_AQC_RULE_ID_S) + +/* Following defines to be used while processing caller specified mirror list + * of VSI indexes. + */ +/* Action: Byte.bit (1.7) + * 0 = Remove VSI from mirror rule + * 1 = Add VSI to mirror rule + */ +#define ICE_AQC_RULE_ACT_S 15 +#define ICE_AQC_RULE_ACT_M (0x1 << ICE_AQC_RULE_ACT_S) +/* Action: 1.2:0.0 = Mirrored VSI */ +#define ICE_AQC_RULE_MIRRORED_VSI_S 0 +#define ICE_AQC_RULE_MIRRORED_VSI_M (0x7FF << ICE_AQC_RULE_MIRRORED_VSI_S) + +/* This is to be used by add/update mirror rule Admin Queue command. + * In case of add mirror rule - if rule ID is specified as + * INVAL_MIRROR_RULE_ID, new rule ID is allocated from shared pool. + * If specified rule_id is valid, then it is used. If specified rule_id + * is in use then new mirroring rule is added. + */ +#define ICE_INVAL_MIRROR_RULE_ID 0xFFFF + +struct ice_aqc_add_update_mir_rule { + uint16_t rule_id; + + uint16_t rule_type; +#define ICE_AQC_RULE_TYPE_S 0 +#define ICE_AQC_RULE_TYPE_M (0x7 << ICE_AQC_RULE_TYPE_S) + /* VPORT ingress/egress */ +#define ICE_AQC_RULE_TYPE_VPORT_INGRESS 0x1 +#define ICE_AQC_RULE_TYPE_VPORT_EGRESS 0x2 + /* Physical port ingress mirroring. + * All traffic received by this port + */ +#define ICE_AQC_RULE_TYPE_PPORT_INGRESS 0x6 + /* Physical port egress mirroring. All traffic sent by this port */ +#define ICE_AQC_RULE_TYPE_PPORT_EGRESS 0x7 + + /* Number of mirrored entries. + * The values are in the command buffer + */ + uint16_t num_entries; + + /* Destination VSI */ + uint16_t dest; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Delete mirror rule - direct(0x0261) */ +struct ice_aqc_delete_mir_rule { + uint16_t rule_id; + uint16_t rsvd; + + /* Byte.bit: 20.0 = Keep allocation. If set VSI stays part of + * the PF allocated resources, otherwise it is returned to the + * shared pool + */ +#define ICE_AQC_FLAG_KEEP_ALLOCD_S 0 +#define ICE_AQC_FLAG_KEEP_ALLOCD_M (0x1 << ICE_AQC_FLAG_KEEP_ALLOCD_S) + uint16_t flags; + + uint8_t reserved[10]; +}; + +/* Set/Get storm config - (direct 0x0280, 0x0281) */ +/* This structure holds get storm configuration response and same structure + * is used to perform set_storm_cfg + */ +struct ice_aqc_storm_cfg { + uint32_t bcast_thresh_size; + uint32_t mcast_thresh_size; + /* Bit 18:0 - Traffic upper threshold size + * Bit 31:19 - Reserved + */ +#define ICE_AQ_THRESHOLD_S 0 +#define ICE_AQ_THRESHOLD_M (0x7FFFF << ICE_AQ_THRESHOLD_S) + + uint32_t storm_ctrl_ctrl; + /* Bit 0: MDIPW - Drop Multicast packets in previous window + * Bit 1: MDICW - Drop multicast packets in current window + * Bit 2: BDIPW - Drop broadcast packets in previous window + * Bit 3: BDICW - Drop broadcast packets in current window + */ +#define ICE_AQ_STORM_CTRL_MDIPW_DROP_MULTICAST BIT(0) +#define ICE_AQ_STORM_CTRL_MDICW_DROP_MULTICAST BIT(1) +#define ICE_AQ_STORM_CTRL_BDIPW_DROP_MULTICAST BIT(2) +#define ICE_AQ_STORM_CTRL_BDICW_DROP_MULTICAST BIT(3) + /* Bit 7:5 : Reserved */ + /* Bit 27:8 : Interval - BSC/MSC Time-interval specification: The + * interval size for applying ingress broadcast or multicast storm + * control. + */ +#define ICE_AQ_STORM_BSC_MSC_TIME_INTERVAL_S 8 +#define ICE_AQ_STORM_BSC_MSC_TIME_INTERVAL_M \ + (0xFFFFF << ICE_AQ_STORM_BSC_MSC_TIME_INTERVAL_S) + uint32_t reserved; +}; + +#define ICE_MAX_NUM_RECIPES 64 + +/* Add/Update/Remove/Get switch rules (indirect 0x02A0, 0x02A1, 0x02A2, 0x02A3) + */ +struct ice_aqc_sw_rules { + /* ops: add switch rules, referring the number of rules. + * ops: update switch rules, referring the number of filters + * ops: remove switch rules, referring the entry index. + * ops: get switch rules, referring to the number of filters. + */ + uint16_t num_rules_fltr_entry_index; + uint8_t reserved[6]; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Add switch rule response: + * Content of return buffer is same as the input buffer. The status field and + * LUT index are updated as part of the response + */ +struct ice_aqc_sw_rules_elem_hdr { + uint16_t type; /* Switch rule type, one of T_... */ +#define ICE_AQC_SW_RULES_T_LKUP_RX 0x0 +#define ICE_AQC_SW_RULES_T_LKUP_TX 0x1 +#define ICE_AQC_SW_RULES_T_LG_ACT 0x2 +#define ICE_AQC_SW_RULES_T_VSI_LIST_SET 0x3 +#define ICE_AQC_SW_RULES_T_VSI_LIST_CLEAR 0x4 +#define ICE_AQC_SW_RULES_T_PRUNE_LIST_SET 0x5 +#define ICE_AQC_SW_RULES_T_PRUNE_LIST_CLEAR 0x6 + uint16_t status; +}; + +/* Add/Update/Get/Remove lookup Rx/Tx command/response entry + * This structures describes the lookup rules and associated actions. "index" + * is returned as part of a response to a successful Add command, and can be + * used to identify the rule for Update/Get/Remove commands. + */ +struct ice_sw_rule_lkup_rx_tx { + struct ice_aqc_sw_rules_elem_hdr hdr; + + uint16_t recipe_id; +#define ICE_SW_RECIPE_LOGICAL_PORT_FWD 10 + /* Source port for LOOKUP_RX and source VSI in case of LOOKUP_TX */ + uint16_t src; + uint32_t act; + + /* Bit 0:1 - Action type */ +#define ICE_SINGLE_ACT_TYPE_S 0x00 +#define ICE_SINGLE_ACT_TYPE_M (0x3 << ICE_SINGLE_ACT_TYPE_S) + + /* Bit 2 - Loop back enable + * Bit 3 - LAN enable + */ +#define ICE_SINGLE_ACT_LB_ENABLE BIT(2) +#define ICE_SINGLE_ACT_LAN_ENABLE BIT(3) + + /* Action type = 0 - Forward to VSI or VSI list */ +#define ICE_SINGLE_ACT_VSI_FORWARDING 0x0 + +#define ICE_SINGLE_ACT_VSI_ID_S 4 +#define ICE_SINGLE_ACT_VSI_ID_M (0x3FF << ICE_SINGLE_ACT_VSI_ID_S) +#define ICE_SINGLE_ACT_VSI_LIST_ID_S 4 +#define ICE_SINGLE_ACT_VSI_LIST_ID_M (0x3FF << ICE_SINGLE_ACT_VSI_LIST_ID_S) + /* This bit needs to be set if action is forward to VSI list */ +#define ICE_SINGLE_ACT_VSI_LIST BIT(14) +#define ICE_SINGLE_ACT_VALID_BIT BIT(17) +#define ICE_SINGLE_ACT_DROP BIT(18) + + /* Action type = 1 - Forward to Queue of Queue group */ +#define ICE_SINGLE_ACT_TO_Q 0x1 +#define ICE_SINGLE_ACT_Q_INDEX_S 4 +#define ICE_SINGLE_ACT_Q_INDEX_M (0x7FF << ICE_SINGLE_ACT_Q_INDEX_S) +#define ICE_SINGLE_ACT_Q_REGION_S 15 +#define ICE_SINGLE_ACT_Q_REGION_M (0x7 << ICE_SINGLE_ACT_Q_REGION_S) +#define ICE_SINGLE_ACT_Q_PRIORITY BIT(18) + + /* Action type = 2 - Prune */ +#define ICE_SINGLE_ACT_PRUNE 0x2 +#define ICE_SINGLE_ACT_EGRESS BIT(15) +#define ICE_SINGLE_ACT_INGRESS BIT(16) +#define ICE_SINGLE_ACT_PRUNET BIT(17) + /* Bit 18 should be set to 0 for this action */ + + /* Action type = 2 - Pointer */ +#define ICE_SINGLE_ACT_PTR 0x2 +#define ICE_SINGLE_ACT_PTR_VAL_S 4 +#define ICE_SINGLE_ACT_PTR_VAL_M (0x1FFF << ICE_SINGLE_ACT_PTR_VAL_S) + /* Bit 17 should be set if pointed action includes a FWD cmd */ +#define ICE_SINGLE_ACT_PTR_HAS_FWD BIT(17) + /* Bit 18 should be set to 1 */ +#define ICE_SINGLE_ACT_PTR_BIT BIT(18) + + /* Action type = 3 - Other actions. Last two bits + * are other action identifier + */ +#define ICE_SINGLE_ACT_OTHER_ACTS 0x3 +#define ICE_SINGLE_OTHER_ACT_IDENTIFIER_S 17 +#define ICE_SINGLE_OTHER_ACT_IDENTIFIER_M \ + (0x3 << ICE_SINGLE_OTHER_ACT_IDENTIFIER_S) + + /* Bit 17:18 - Defines other actions */ + /* Other action = 0 - Mirror VSI */ +#define ICE_SINGLE_OTHER_ACT_MIRROR 0 +#define ICE_SINGLE_ACT_MIRROR_VSI_ID_S 4 +#define ICE_SINGLE_ACT_MIRROR_VSI_ID_M \ + (0x3FF << ICE_SINGLE_ACT_MIRROR_VSI_ID_S) + + /* Other action = 3 - Set Stat count */ +#define ICE_SINGLE_OTHER_ACT_STAT_COUNT 3 +#define ICE_SINGLE_ACT_STAT_COUNT_INDEX_S 4 +#define ICE_SINGLE_ACT_STAT_COUNT_INDEX_M \ + (0x7F << ICE_SINGLE_ACT_STAT_COUNT_INDEX_S) + + uint16_t index; /* The index of the rule in the lookup table */ + /* Length and values of the header to be matched per recipe or + * lookup-type + */ + uint16_t hdr_len; + uint8_t hdr_data[STRUCT_HACK_VAR_LEN]; +}; + +/* Add/Update/Remove large action command/response entry + * "index" is returned as part of a response to a successful Add command, and + * can be used to identify the action for Update/Get/Remove commands. + */ +struct ice_sw_rule_lg_act { + struct ice_aqc_sw_rules_elem_hdr hdr; + + uint16_t index; /* Index in large action table */ + uint16_t size; + /* Max number of large actions */ +#define ICE_MAX_LG_ACT 4 + /* Bit 0:1 - Action type */ +#define ICE_LG_ACT_TYPE_S 0 +#define ICE_LG_ACT_TYPE_M (0x7 << ICE_LG_ACT_TYPE_S) + + /* Action type = 0 - Forward to VSI or VSI list */ +#define ICE_LG_ACT_VSI_FORWARDING 0 +#define ICE_LG_ACT_VSI_ID_S 3 +#define ICE_LG_ACT_VSI_ID_M (0x3FF << ICE_LG_ACT_VSI_ID_S) +#define ICE_LG_ACT_VSI_LIST_ID_S 3 +#define ICE_LG_ACT_VSI_LIST_ID_M (0x3FF << ICE_LG_ACT_VSI_LIST_ID_S) + /* This bit needs to be set if action is forward to VSI list */ +#define ICE_LG_ACT_VSI_LIST BIT(13) + +#define ICE_LG_ACT_VALID_BIT BIT(16) + + /* Action type = 1 - Forward to Queue of Queue group */ +#define ICE_LG_ACT_TO_Q 0x1 +#define ICE_LG_ACT_Q_INDEX_S 3 +#define ICE_LG_ACT_Q_INDEX_M (0x7FF << ICE_LG_ACT_Q_INDEX_S) +#define ICE_LG_ACT_Q_REGION_S 14 +#define ICE_LG_ACT_Q_REGION_M (0x7 << ICE_LG_ACT_Q_REGION_S) +#define ICE_LG_ACT_Q_PRIORITY_SET BIT(17) + + /* Action type = 2 - Prune */ +#define ICE_LG_ACT_PRUNE 0x2 +#define ICE_LG_ACT_EGRESS BIT(14) +#define ICE_LG_ACT_INGRESS BIT(15) +#define ICE_LG_ACT_PRUNET BIT(16) + + /* Action type = 3 - Mirror VSI */ +#define ICE_LG_OTHER_ACT_MIRROR 0x3 +#define ICE_LG_ACT_MIRROR_VSI_ID_S 3 +#define ICE_LG_ACT_MIRROR_VSI_ID_M (0x3FF << ICE_LG_ACT_MIRROR_VSI_ID_S) + + /* Action type = 5 - Generic Value */ +#define ICE_LG_ACT_GENERIC 0x5 +#define ICE_LG_ACT_GENERIC_VALUE_S 3 +#define ICE_LG_ACT_GENERIC_VALUE_M (0xFFFF << ICE_LG_ACT_GENERIC_VALUE_S) +#define ICE_LG_ACT_GENERIC_OFFSET_S 19 +#define ICE_LG_ACT_GENERIC_OFFSET_M (0x7 << ICE_LG_ACT_GENERIC_OFFSET_S) +#define ICE_LG_ACT_GENERIC_PRIORITY_S 22 +#define ICE_LG_ACT_GENERIC_PRIORITY_M (0x7 << ICE_LG_ACT_GENERIC_PRIORITY_S) +#define ICE_LG_ACT_GENERIC_OFF_RX_DESC_PROF_IDX 7 + + /* Action = 7 - Set Stat count */ +#define ICE_LG_ACT_STAT_COUNT 0x7 +#define ICE_LG_ACT_STAT_COUNT_S 3 +#define ICE_LG_ACT_STAT_COUNT_M (0x7F << ICE_LG_ACT_STAT_COUNT_S) + uint32_t act[STRUCT_HACK_VAR_LEN]; /* array of size for actions */ +} __packed; + +/* Add/Update/Remove VSI list command/response entry + * "index" is returned as part of a response to a successful Add command, and + * can be used to identify the VSI list for Update/Get/Remove commands. + */ +struct ice_sw_rule_vsi_list { + struct ice_aqc_sw_rules_elem_hdr hdr; + + uint16_t index; /* Index of VSI/Prune list */ + uint16_t number_vsi; + uint16_t vsi[STRUCT_HACK_VAR_LEN]; /* Array of number_vsi VSI numbers */ +} __packed; + +/* Query VSI list command/response entry */ +struct ice_sw_rule_vsi_list_query { + uint16_t index; + uint8_t vsi_list[howmany(ICE_MAX_VSI, 8)]; +} __packed; + +/* PFC Ignore (direct 0x0301) + * The command and response use the same descriptor structure + */ +struct ice_aqc_pfc_ignore { + uint8_t tc_bitmap; + uint8_t cmd_flags; /* unused in response */ +#define ICE_AQC_PFC_IGNORE_SET BIT(7) +#define ICE_AQC_PFC_IGNORE_CLEAR 0 + uint8_t reserved[14]; +}; + +/* Query PFC Mode (direct 0x0302) + * Set PFC Mode (direct 0x0303) + */ +struct ice_aqc_set_query_pfc_mode { + uint8_t pfc_mode; +/* For Set Command response, reserved in all other cases */ +#define ICE_AQC_PFC_NOT_CONFIGURED 0 +/* For Query Command response, reserved in all other cases */ +#define ICE_AQC_DCB_DIS 0 +#define ICE_AQC_PFC_VLAN_BASED_PFC 1 +#define ICE_AQC_PFC_DSCP_BASED_PFC 2 + uint8_t rsvd[15]; +}; + +/* Set DCB Parameters (direct 0x0306) */ +struct ice_aqc_set_dcb_params { + uint8_t cmd_flags; /* unused in response */ +#define ICE_AQC_LINK_UP_DCB_CFG BIT(0) +#define ICE_AQC_PERSIST_DCB_CFG BIT(1) + uint8_t valid_flags; /* unused in response */ +#define ICE_AQC_LINK_UP_DCB_CFG_VALID BIT(0) +#define ICE_AQC_PERSIST_DCB_CFG_VALID BIT(1) + uint8_t rsvd[14]; +}; + +/* Get Default Topology (indirect 0x0400) */ +struct ice_aqc_get_topo { + uint8_t port_num; + uint8_t num_branches; + uint16_t reserved1; + uint32_t reserved2; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Get/Set Tx Topology (indirect 0x0418/0x0417) */ +struct ice_aqc_get_set_tx_topo { + uint8_t set_flags; +#define ICE_AQC_TX_TOPO_FLAGS_CORRER BIT(0) +#define ICE_AQC_TX_TOPO_FLAGS_SRC_RAM BIT(1) +#define ICE_AQC_TX_TOPO_FLAGS_SET_PSM BIT(2) +#define ICE_AQC_TX_TOPO_FLAGS_LOAD_NEW BIT(4) +#define ICE_AQC_TX_TOPO_FLAGS_ISSUED BIT(5) + uint8_t get_flags; +#define ICE_AQC_TX_TOPO_GET_NO_UPDATE 0 +#define ICE_AQC_TX_TOPO_GET_PSM 1 +#define ICE_AQC_TX_TOPO_GET_RAM 2 + uint16_t reserved1; + uint32_t reserved2; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Update TSE (indirect 0x0403) + * Get TSE (indirect 0x0404) + * Add TSE (indirect 0x0401) + * Delete TSE (indirect 0x040F) + * Move TSE (indirect 0x0408) + * Suspend Nodes (indirect 0x0409) + * Resume Nodes (indirect 0x040A) + */ +struct ice_aqc_sched_elem_cmd { + uint16_t num_elem_req; /* Used by commands */ + uint16_t num_elem_resp; /* Used by responses */ + uint32_t reserved; + uint32_t addr_high; + uint32_t addr_low; +}; + +struct ice_aqc_txsched_move_grp_info_hdr { + uint32_t src_parent_teid; + uint32_t dest_parent_teid; + uint16_t num_elems; + uint8_t flags; + uint8_t reserved; +}; + +struct ice_aqc_move_elem { + struct ice_aqc_txsched_move_grp_info_hdr hdr; + uint32_t teid[STRUCT_HACK_VAR_LEN]; +}; + +struct ice_aqc_elem_info_bw { + uint16_t bw_profile_idx; + uint16_t bw_alloc; +}; + +struct ice_aqc_txsched_elem { + uint8_t elem_type; /* Special field, reserved for some aq calls */ +#define ICE_AQC_ELEM_TYPE_UNDEFINED 0x0 +#define ICE_AQC_ELEM_TYPE_ROOT_PORT 0x1 +#define ICE_AQC_ELEM_TYPE_TC 0x2 +#define ICE_AQC_ELEM_TYPE_SE_GENERIC 0x3 +#define ICE_AQC_ELEM_TYPE_ENTRY_POINT 0x4 +#define ICE_AQC_ELEM_TYPE_LEAF 0x5 +#define ICE_AQC_ELEM_TYPE_SE_PADDED 0x6 + uint8_t valid_sections; +#define ICE_AQC_ELEM_VALID_GENERIC BIT(0) +#define ICE_AQC_ELEM_VALID_CIR BIT(1) +#define ICE_AQC_ELEM_VALID_EIR BIT(2) +#define ICE_AQC_ELEM_VALID_SHARED BIT(3) + uint8_t generic; +#define ICE_AQC_ELEM_GENERIC_MODE_M 0x1 +#define ICE_AQC_ELEM_GENERIC_PRIO_S 0x1 +#define ICE_AQC_ELEM_GENERIC_PRIO_M (0x7 << ICE_AQC_ELEM_GENERIC_PRIO_S) +#define ICE_AQC_ELEM_GENERIC_SP_S 0x4 +#define ICE_AQC_ELEM_GENERIC_SP_M (0x1 << ICE_AQC_ELEM_GENERIC_SP_S) +#define ICE_AQC_ELEM_GENERIC_ADJUST_VAL_S 0x5 +#define ICE_AQC_ELEM_GENERIC_ADJUST_VAL_M \ + (0x3 << ICE_AQC_ELEM_GENERIC_ADJUST_VAL_S) + uint8_t flags; /* Special field, reserved for some aq calls */ +#define ICE_AQC_ELEM_FLAG_SUSPEND_M 0x1 + struct ice_aqc_elem_info_bw cir_bw; + struct ice_aqc_elem_info_bw eir_bw; + uint16_t srl_id; + uint16_t reserved2; +}; + +struct ice_aqc_txsched_elem_data { + uint32_t parent_teid; + uint32_t node_teid; + struct ice_aqc_txsched_elem data; +}; + +struct ice_aqc_txsched_topo_grp_info_hdr { + uint32_t parent_teid; + uint16_t num_elems; + uint16_t reserved2; +}; + +struct ice_aqc_add_elem { + struct ice_aqc_txsched_topo_grp_info_hdr hdr; + struct ice_aqc_txsched_elem_data generic[STRUCT_HACK_VAR_LEN]; +}; + +struct ice_aqc_get_topo_elem { + struct ice_aqc_txsched_topo_grp_info_hdr hdr; + struct ice_aqc_txsched_elem_data + generic[ICE_AQC_TOPO_MAX_LEVEL_NUM]; +}; + +struct ice_aqc_delete_elem { + struct ice_aqc_txsched_topo_grp_info_hdr hdr; + uint32_t teid[STRUCT_HACK_VAR_LEN]; +}; + +/* Query Port ETS (indirect 0x040E) + * + * This indirect command is used to query port TC node configuration. + */ +struct ice_aqc_query_port_ets { + uint32_t port_teid; + uint32_t reserved; + uint32_t addr_high; + uint32_t addr_low; +}; + +struct ice_aqc_port_ets_elem { + uint8_t tc_valid_bits; + uint8_t reserved[3]; + /* 3 bits for UP per TC 0-7, 4th byte reserved */ + uint32_t up2tc; + uint8_t tc_bw_share[8]; + uint32_t port_eir_prof_id; + uint32_t port_cir_prof_id; + /* 3 bits per Node priority to TC 0-7, 4th byte reserved */ + uint32_t tc_node_prio; +#define ICE_TC_NODE_PRIO_S 0x4 + uint8_t reserved1[4]; + uint32_t tc_node_teid[8]; /* Used for response, reserved in command */ +}; + +/* Rate limiting profile for + * Add RL profile (indirect 0x0410) + * Query RL profile (indirect 0x0411) + * Remove RL profile (indirect 0x0415) + * These indirect commands acts on single or multiple + * RL profiles with specified data. + */ +struct ice_aqc_rl_profile { + uint16_t num_profiles; + uint16_t num_processed; /* Only for response. Reserved in Command. */ + uint8_t reserved[4]; + uint32_t addr_high; + uint32_t addr_low; +}; + +struct ice_aqc_rl_profile_elem { + uint8_t level; + uint8_t flags; +#define ICE_AQC_RL_PROFILE_TYPE_S 0x0 +#define ICE_AQC_RL_PROFILE_TYPE_M (0x3 << ICE_AQC_RL_PROFILE_TYPE_S) +#define ICE_AQC_RL_PROFILE_TYPE_CIR 0 +#define ICE_AQC_RL_PROFILE_TYPE_EIR 1 +#define ICE_AQC_RL_PROFILE_TYPE_SRL 2 +/* The following flag is used for Query RL Profile Data */ +#define ICE_AQC_RL_PROFILE_INVAL_S 0x7 +#define ICE_AQC_RL_PROFILE_INVAL_M (0x1 << ICE_AQC_RL_PROFILE_INVAL_S) + + uint16_t profile_id; + uint16_t max_burst_size; + uint16_t rl_multiply; + uint16_t wake_up_calc; + uint16_t rl_encode; +}; + +/* Config Node Attributes (indirect 0x0419) + * Query Node Attributes (indirect 0x041A) + */ +struct ice_aqc_node_attr { + uint16_t num_entries; /* Number of attributes structures in the buffer */ + uint8_t reserved[6]; + uint32_t addr_high; + uint32_t addr_low; +}; + +struct ice_aqc_node_attr_elem { + uint32_t node_teid; + uint16_t max_children; + uint16_t children_level; +}; + +/* Configure L2 Node CGD (indirect 0x0414) + * This indirect command allows configuring a congestion domain for given L2 + * node TEIDs in the scheduler topology. + */ +struct ice_aqc_cfg_l2_node_cgd { + uint16_t num_l2_nodes; + uint8_t reserved[6]; + uint32_t addr_high; + uint32_t addr_low; +}; + +struct ice_aqc_cfg_l2_node_cgd_elem { + uint32_t node_teid; + uint8_t cgd; + uint8_t reserved[3]; +}; + +/* Query Scheduler Resource Allocation (indirect 0x0412) + * This indirect command retrieves the scheduler resources allocated by + * EMP Firmware to the given PF. + */ +struct ice_aqc_query_txsched_res { + uint8_t reserved[8]; + uint32_t addr_high; + uint32_t addr_low; +}; + +struct ice_aqc_generic_sched_props { + uint16_t phys_levels; + uint16_t logical_levels; + uint8_t flattening_bitmap; + uint8_t max_device_cgds; + uint8_t max_pf_cgds; + uint8_t rsvd0; + uint16_t rdma_qsets; + uint8_t rsvd1[22]; +}; + +struct ice_aqc_layer_props { + uint8_t logical_layer; + uint8_t chunk_size; + uint16_t max_device_nodes; + uint16_t max_pf_nodes; + uint8_t rsvd0[4]; + uint16_t max_sibl_grp_sz; + uint16_t max_cir_rl_profiles; + uint16_t max_eir_rl_profiles; + uint16_t max_srl_profiles; + uint8_t rsvd1[14]; +}; + +struct ice_aqc_query_txsched_res_resp { + struct ice_aqc_generic_sched_props sched_props; + struct ice_aqc_layer_props layer_props[ICE_AQC_TOPO_MAX_LEVEL_NUM]; +}; + +/* Query Node to Root Topology (indirect 0x0413) + * This command uses ice_aqc_get_elem as its data buffer. + */ +struct ice_aqc_query_node_to_root { + uint32_t teid; + uint32_t num_nodes; /* Response only */ + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Get PHY capabilities (indirect 0x0600) */ +struct ice_aqc_get_phy_caps { + uint8_t lport_num; + uint8_t reserved; + uint16_t param0; + /* 18.0 - Report qualified modules */ +#define ICE_AQC_GET_PHY_RQM BIT(0) + /* 18.1 - 18.3 : Report mode + * 000b - Report topology capabilities, without media + * 001b - Report topology capabilities, with media + * 010b - Report Active configuration + * 011b - Report PHY Type and FEC mode capabilities + * 100b - Report Default capabilities + */ +#define ICE_AQC_REPORT_MODE_S 1 +#define ICE_AQC_REPORT_MODE_M (7 << ICE_AQC_REPORT_MODE_S) +#define ICE_AQC_REPORT_TOPO_CAP_NO_MEDIA 0 +#define ICE_AQC_REPORT_TOPO_CAP_MEDIA BIT(1) +#define ICE_AQC_REPORT_ACTIVE_CFG BIT(2) +#define ICE_AQC_REPORT_DFLT_CFG BIT(3) + uint32_t reserved1; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* This is #define of PHY type (Extended): + * The first set of defines is for phy_type_low. + */ +#define ICE_PHY_TYPE_LOW_100BASE_TX BIT_ULL(0) +#define ICE_PHY_TYPE_LOW_100M_SGMII BIT_ULL(1) +#define ICE_PHY_TYPE_LOW_1000BASE_T BIT_ULL(2) +#define ICE_PHY_TYPE_LOW_1000BASE_SX BIT_ULL(3) +#define ICE_PHY_TYPE_LOW_1000BASE_LX BIT_ULL(4) +#define ICE_PHY_TYPE_LOW_1000BASE_KX BIT_ULL(5) +#define ICE_PHY_TYPE_LOW_1G_SGMII BIT_ULL(6) +#define ICE_PHY_TYPE_LOW_2500BASE_T BIT_ULL(7) +#define ICE_PHY_TYPE_LOW_2500BASE_X BIT_ULL(8) +#define ICE_PHY_TYPE_LOW_2500BASE_KX BIT_ULL(9) +#define ICE_PHY_TYPE_LOW_5GBASE_T BIT_ULL(10) +#define ICE_PHY_TYPE_LOW_5GBASE_KR BIT_ULL(11) +#define ICE_PHY_TYPE_LOW_10GBASE_T BIT_ULL(12) +#define ICE_PHY_TYPE_LOW_10G_SFI_DA BIT_ULL(13) +#define ICE_PHY_TYPE_LOW_10GBASE_SR BIT_ULL(14) +#define ICE_PHY_TYPE_LOW_10GBASE_LR BIT_ULL(15) +#define ICE_PHY_TYPE_LOW_10GBASE_KR_CR1 BIT_ULL(16) +#define ICE_PHY_TYPE_LOW_10G_SFI_AOC_ACC BIT_ULL(17) +#define ICE_PHY_TYPE_LOW_10G_SFI_C2C BIT_ULL(18) +#define ICE_PHY_TYPE_LOW_25GBASE_T BIT_ULL(19) +#define ICE_PHY_TYPE_LOW_25GBASE_CR BIT_ULL(20) +#define ICE_PHY_TYPE_LOW_25GBASE_CR_S BIT_ULL(21) +#define ICE_PHY_TYPE_LOW_25GBASE_CR1 BIT_ULL(22) +#define ICE_PHY_TYPE_LOW_25GBASE_SR BIT_ULL(23) +#define ICE_PHY_TYPE_LOW_25GBASE_LR BIT_ULL(24) +#define ICE_PHY_TYPE_LOW_25GBASE_KR BIT_ULL(25) +#define ICE_PHY_TYPE_LOW_25GBASE_KR_S BIT_ULL(26) +#define ICE_PHY_TYPE_LOW_25GBASE_KR1 BIT_ULL(27) +#define ICE_PHY_TYPE_LOW_25G_AUI_AOC_ACC BIT_ULL(28) +#define ICE_PHY_TYPE_LOW_25G_AUI_C2C BIT_ULL(29) +#define ICE_PHY_TYPE_LOW_40GBASE_CR4 BIT_ULL(30) +#define ICE_PHY_TYPE_LOW_40GBASE_SR4 BIT_ULL(31) +#define ICE_PHY_TYPE_LOW_40GBASE_LR4 BIT_ULL(32) +#define ICE_PHY_TYPE_LOW_40GBASE_KR4 BIT_ULL(33) +#define ICE_PHY_TYPE_LOW_40G_XLAUI_AOC_ACC BIT_ULL(34) +#define ICE_PHY_TYPE_LOW_40G_XLAUI BIT_ULL(35) +#define ICE_PHY_TYPE_LOW_50GBASE_CR2 BIT_ULL(36) +#define ICE_PHY_TYPE_LOW_50GBASE_SR2 BIT_ULL(37) +#define ICE_PHY_TYPE_LOW_50GBASE_LR2 BIT_ULL(38) +#define ICE_PHY_TYPE_LOW_50GBASE_KR2 BIT_ULL(39) +#define ICE_PHY_TYPE_LOW_50G_LAUI2_AOC_ACC BIT_ULL(40) +#define ICE_PHY_TYPE_LOW_50G_LAUI2 BIT_ULL(41) +#define ICE_PHY_TYPE_LOW_50G_AUI2_AOC_ACC BIT_ULL(42) +#define ICE_PHY_TYPE_LOW_50G_AUI2 BIT_ULL(43) +#define ICE_PHY_TYPE_LOW_50GBASE_CP BIT_ULL(44) +#define ICE_PHY_TYPE_LOW_50GBASE_SR BIT_ULL(45) +#define ICE_PHY_TYPE_LOW_50GBASE_FR BIT_ULL(46) +#define ICE_PHY_TYPE_LOW_50GBASE_LR BIT_ULL(47) +#define ICE_PHY_TYPE_LOW_50GBASE_KR_PAM4 BIT_ULL(48) +#define ICE_PHY_TYPE_LOW_50G_AUI1_AOC_ACC BIT_ULL(49) +#define ICE_PHY_TYPE_LOW_50G_AUI1 BIT_ULL(50) +#define ICE_PHY_TYPE_LOW_100GBASE_CR4 BIT_ULL(51) +#define ICE_PHY_TYPE_LOW_100GBASE_SR4 BIT_ULL(52) +#define ICE_PHY_TYPE_LOW_100GBASE_LR4 BIT_ULL(53) +#define ICE_PHY_TYPE_LOW_100GBASE_KR4 BIT_ULL(54) +#define ICE_PHY_TYPE_LOW_100G_CAUI4_AOC_ACC BIT_ULL(55) +#define ICE_PHY_TYPE_LOW_100G_CAUI4 BIT_ULL(56) +#define ICE_PHY_TYPE_LOW_100G_AUI4_AOC_ACC BIT_ULL(57) +#define ICE_PHY_TYPE_LOW_100G_AUI4 BIT_ULL(58) +#define ICE_PHY_TYPE_LOW_100GBASE_CR_PAM4 BIT_ULL(59) +#define ICE_PHY_TYPE_LOW_100GBASE_KR_PAM4 BIT_ULL(60) +#define ICE_PHY_TYPE_LOW_100GBASE_CP2 BIT_ULL(61) +#define ICE_PHY_TYPE_LOW_100GBASE_SR2 BIT_ULL(62) +#define ICE_PHY_TYPE_LOW_100GBASE_DR BIT_ULL(63) +#define ICE_PHY_TYPE_LOW_MAX_INDEX 63 +/* The second set of defines is for phy_type_high. */ +#define ICE_PHY_TYPE_HIGH_100GBASE_KR2_PAM4 BIT_ULL(0) +#define ICE_PHY_TYPE_HIGH_100G_CAUI2_AOC_ACC BIT_ULL(1) +#define ICE_PHY_TYPE_HIGH_100G_CAUI2 BIT_ULL(2) +#define ICE_PHY_TYPE_HIGH_100G_AUI2_AOC_ACC BIT_ULL(3) +#define ICE_PHY_TYPE_HIGH_100G_AUI2 BIT_ULL(4) +#define ICE_PHY_TYPE_HIGH_MAX_INDEX 4 + +struct ice_aqc_get_phy_caps_data { + uint64_t phy_type_low; /* Use values from ICE_PHY_TYPE_LOW_* */ + uint64_t phy_type_high; /* Use values from ICE_PHY_TYPE_HIGH_* */ + uint8_t caps; +#define ICE_AQC_PHY_EN_TX_LINK_PAUSE BIT(0) +#define ICE_AQC_PHY_EN_RX_LINK_PAUSE BIT(1) +#define ICE_AQC_PHY_LOW_POWER_MODE BIT(2) +#define ICE_AQC_PHY_EN_LINK BIT(3) +#define ICE_AQC_PHY_AN_MODE BIT(4) +#define ICE_AQC_PHY_EN_MOD_QUAL BIT(5) +#define ICE_AQC_PHY_EN_LESM BIT(6) +#define ICE_AQC_PHY_EN_AUTO_FEC BIT(7) +#define ICE_AQC_PHY_CAPS_MASK MAKEMASK(0xff, 0) + uint8_t low_power_ctrl_an; +#define ICE_AQC_PHY_EN_D3COLD_LOW_POWER_AUTONEG BIT(0) +#define ICE_AQC_PHY_AN_EN_CLAUSE28 BIT(1) +#define ICE_AQC_PHY_AN_EN_CLAUSE73 BIT(2) +#define ICE_AQC_PHY_AN_EN_CLAUSE37 BIT(3) + uint16_t eee_cap; +#define ICE_AQC_PHY_EEE_EN_100BASE_TX BIT(0) +#define ICE_AQC_PHY_EEE_EN_1000BASE_T BIT(1) +#define ICE_AQC_PHY_EEE_EN_10GBASE_T BIT(2) +#define ICE_AQC_PHY_EEE_EN_1000BASE_KX BIT(3) +#define ICE_AQC_PHY_EEE_EN_10GBASE_KR BIT(4) +#define ICE_AQC_PHY_EEE_EN_25GBASE_KR BIT(5) +#define ICE_AQC_PHY_EEE_EN_40GBASE_KR4 BIT(6) +#define ICE_AQC_PHY_EEE_EN_50GBASE_KR2 BIT(7) +#define ICE_AQC_PHY_EEE_EN_50GBASE_KR_PAM4 BIT(8) +#define ICE_AQC_PHY_EEE_EN_100GBASE_KR4 BIT(9) +#define ICE_AQC_PHY_EEE_EN_100GBASE_KR2_PAM4 BIT(10) + uint16_t eeer_value; + uint8_t phy_id_oui[4]; /* PHY/Module ID connected on the port */ + uint8_t phy_fw_ver[8]; + uint8_t link_fec_options; +#define ICE_AQC_PHY_FEC_10G_KR_40G_KR4_EN BIT(0) +#define ICE_AQC_PHY_FEC_10G_KR_40G_KR4_REQ BIT(1) +#define ICE_AQC_PHY_FEC_25G_RS_528_REQ BIT(2) +#define ICE_AQC_PHY_FEC_25G_KR_REQ BIT(3) +#define ICE_AQC_PHY_FEC_25G_RS_544_REQ BIT(4) +#define ICE_AQC_PHY_FEC_DIS BIT(5) +#define ICE_AQC_PHY_FEC_25G_RS_CLAUSE91_EN BIT(6) +#define ICE_AQC_PHY_FEC_25G_KR_CLAUSE74_EN BIT(7) +#define ICE_AQC_PHY_FEC_MASK MAKEMASK(0xdf, 0) + uint8_t module_compliance_enforcement; +#define ICE_AQC_MOD_ENFORCE_STRICT_MODE BIT(0) + uint8_t extended_compliance_code; +#define ICE_MODULE_TYPE_TOTAL_BYTE 3 + uint8_t module_type[ICE_MODULE_TYPE_TOTAL_BYTE]; +#define ICE_AQC_MOD_TYPE_BYTE0_SFP_PLUS 0xA0 +#define ICE_AQC_MOD_TYPE_BYTE0_QSFP_PLUS 0x80 +#define ICE_AQC_MOD_TYPE_IDENT 1 +#define ICE_AQC_MOD_TYPE_BYTE1_SFP_PLUS_CU_PASSIVE BIT(0) +#define ICE_AQC_MOD_TYPE_BYTE1_SFP_PLUS_CU_ACTIVE BIT(1) +#define ICE_AQC_MOD_TYPE_BYTE1_10G_BASE_SR BIT(4) +#define ICE_AQC_MOD_TYPE_BYTE1_10G_BASE_LR BIT(5) +#define ICE_AQC_MOD_TYPE_BYTE1_10G_BASE_LRM BIT(6) +#define ICE_AQC_MOD_TYPE_BYTE1_10G_BASE_ER BIT(7) +#define ICE_AQC_MOD_TYPE_BYTE2_SFP_PLUS 0xA0 +#define ICE_AQC_MOD_TYPE_BYTE2_QSFP_PLUS 0x86 + uint8_t qualified_module_count; + uint8_t rsvd2[7]; /* Bytes 47:41 reserved */ +#define ICE_AQC_QUAL_MOD_COUNT_MAX 16 + struct { + uint8_t v_oui[3]; + uint8_t rsvd3; + uint8_t v_part[16]; + uint32_t v_rev; + uint64_t rsvd4; + } qual_modules[ICE_AQC_QUAL_MOD_COUNT_MAX]; +}; + +/* Set PHY capabilities (direct 0x0601) + * NOTE: This command must be followed by setup link and restart auto-neg + */ +struct ice_aqc_set_phy_cfg { + uint8_t lport_num; + uint8_t reserved[7]; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Set PHY config command data structure */ +struct ice_aqc_set_phy_cfg_data { + uint64_t phy_type_low; /* Use values from ICE_PHY_TYPE_LOW_* */ + uint64_t phy_type_high; /* Use values from ICE_PHY_TYPE_HIGH_* */ + uint8_t caps; +#define ICE_AQ_PHY_ENA_VALID_MASK MAKEMASK(0xef, 0) +#define ICE_AQ_PHY_ENA_TX_PAUSE_ABILITY BIT(0) +#define ICE_AQ_PHY_ENA_RX_PAUSE_ABILITY BIT(1) +#define ICE_AQ_PHY_ENA_LOW_POWER BIT(2) +#define ICE_AQ_PHY_ENA_LINK BIT(3) +#define ICE_AQ_PHY_ENA_AUTO_LINK_UPDT BIT(5) +#define ICE_AQ_PHY_ENA_LESM BIT(6) +#define ICE_AQ_PHY_ENA_AUTO_FEC BIT(7) + uint8_t low_power_ctrl_an; + uint16_t eee_cap; /* Value from ice_aqc_get_phy_caps */ + uint16_t eeer_value; + uint8_t link_fec_opt; /* Use defines from ice_aqc_get_phy_caps */ + uint8_t module_compliance_enforcement; +}; + +/* Set MAC Config command data structure (direct 0x0603) */ +struct ice_aqc_set_mac_cfg { + uint16_t max_frame_size; + uint8_t params; +#define ICE_AQ_SET_MAC_PACE_S 3 +#define ICE_AQ_SET_MAC_PACE_M (0xF << ICE_AQ_SET_MAC_PACE_S) +#define ICE_AQ_SET_MAC_PACE_TYPE_M BIT(7) +#define ICE_AQ_SET_MAC_PACE_TYPE_RATE 0 +#define ICE_AQ_SET_MAC_PACE_TYPE_FIXED ICE_AQ_SET_MAC_PACE_TYPE_M + uint8_t tx_tmr_priority; + uint16_t tx_tmr_value; + uint16_t fc_refresh_threshold; + uint8_t drop_opts; +#define ICE_AQ_SET_MAC_AUTO_DROP_MASK BIT(0) +#define ICE_AQ_SET_MAC_AUTO_DROP_NONE 0 +#define ICE_AQ_SET_MAC_AUTO_DROP_BLOCKING_PKTS BIT(0) + uint8_t reserved[7]; +}; + +/* Restart AN command data structure (direct 0x0605) + * Also used for response, with only the lport_num field present. + */ +struct ice_aqc_restart_an { + uint8_t lport_num; + uint8_t reserved; + uint8_t cmd_flags; +#define ICE_AQC_RESTART_AN_LINK_RESTART BIT(1) +#define ICE_AQC_RESTART_AN_LINK_ENABLE BIT(2) + uint8_t reserved2[13]; +}; + +/* Get link status (indirect 0x0607), also used for Link Status Event */ +struct ice_aqc_get_link_status { + uint8_t lport_num; + uint8_t reserved; + uint16_t cmd_flags; +#define ICE_AQ_LSE_M 0x3 +#define ICE_AQ_LSE_NOP 0x0 +#define ICE_AQ_LSE_DIS 0x2 +#define ICE_AQ_LSE_ENA 0x3 + /* only response uses this flag */ +#define ICE_AQ_LSE_IS_ENABLED 0x1 + uint32_t reserved2; + uint32_t addr_high; + uint32_t addr_low; +}; + +enum ice_get_link_status_data_version { + ICE_GET_LINK_STATUS_DATA_V1 = 1, +}; + +#define ICE_GET_LINK_STATUS_DATALEN_V1 32 + +/* Get link status response data structure, also used for Link Status Event */ +struct ice_aqc_get_link_status_data { + uint8_t topo_media_conflict; +#define ICE_AQ_LINK_TOPO_CONFLICT BIT(0) +#define ICE_AQ_LINK_MEDIA_CONFLICT BIT(1) +#define ICE_AQ_LINK_TOPO_CORRUPT BIT(2) +#define ICE_AQ_LINK_TOPO_UNREACH_PRT BIT(4) +#define ICE_AQ_LINK_TOPO_UNDRUTIL_PRT BIT(5) +#define ICE_AQ_LINK_TOPO_UNDRUTIL_MEDIA BIT(6) +#define ICE_AQ_LINK_TOPO_UNSUPP_MEDIA BIT(7) + uint8_t link_cfg_err; +#define ICE_AQ_LINK_CFG_ERR BIT(0) +#define ICE_AQ_LINK_ACT_PORT_OPT_INVAL BIT(2) +#define ICE_AQ_LINK_FEAT_ID_OR_CONFIG_ID_INVAL BIT(3) +#define ICE_AQ_LINK_TOPO_CRITICAL_SDP_ERR BIT(4) +#define ICE_AQ_LINK_MODULE_POWER_UNSUPPORTED BIT(5) +#define ICE_AQ_LINK_EXTERNAL_PHY_LOAD_FAILURE BIT(6) +#define ICE_AQ_LINK_INVAL_MAX_POWER_LIMIT BIT(7) + uint8_t link_info; +#define ICE_AQ_LINK_UP BIT(0) /* Link Status */ +#define ICE_AQ_LINK_FAULT BIT(1) +#define ICE_AQ_LINK_FAULT_TX BIT(2) +#define ICE_AQ_LINK_FAULT_RX BIT(3) +#define ICE_AQ_LINK_FAULT_REMOTE BIT(4) +#define ICE_AQ_LINK_UP_PORT BIT(5) /* External Port Link Status */ +#define ICE_AQ_MEDIA_AVAILABLE BIT(6) +#define ICE_AQ_SIGNAL_DETECT BIT(7) + uint8_t an_info; +#define ICE_AQ_AN_COMPLETED BIT(0) +#define ICE_AQ_LP_AN_ABILITY BIT(1) +#define ICE_AQ_PD_FAULT BIT(2) /* Parallel Detection Fault */ +#define ICE_AQ_FEC_EN BIT(3) +#define ICE_AQ_PHY_LOW_POWER BIT(4) /* Low Power State */ +#define ICE_AQ_LINK_PAUSE_TX BIT(5) +#define ICE_AQ_LINK_PAUSE_RX BIT(6) +#define ICE_AQ_QUALIFIED_MODULE BIT(7) + uint8_t ext_info; +#define ICE_AQ_LINK_PHY_TEMP_ALARM BIT(0) +#define ICE_AQ_LINK_EXCESSIVE_ERRORS BIT(1) /* Excessive Link Errors */ + /* Port Tx Suspended */ +#define ICE_AQ_LINK_TX_S 2 +#define ICE_AQ_LINK_TX_M (0x03 << ICE_AQ_LINK_TX_S) +#define ICE_AQ_LINK_TX_ACTIVE 0 +#define ICE_AQ_LINK_TX_DRAINED 1 +#define ICE_AQ_LINK_TX_FLUSHED 3 + uint8_t lb_status; +#define ICE_AQ_LINK_LB_PHY_LCL BIT(0) +#define ICE_AQ_LINK_LB_PHY_RMT BIT(1) +#define ICE_AQ_LINK_LB_MAC_LCL BIT(2) +#define ICE_AQ_LINK_LB_PHY_IDX_S 3 +#define ICE_AQ_LINK_LB_PHY_IDX_M (0x7 << ICE_AQ_LB_PHY_IDX_S) + uint16_t max_frame_size; + uint8_t cfg; +#define ICE_AQ_LINK_25G_KR_FEC_EN BIT(0) +#define ICE_AQ_LINK_25G_RS_528_FEC_EN BIT(1) +#define ICE_AQ_LINK_25G_RS_544_FEC_EN BIT(2) +#define ICE_AQ_FEC_MASK MAKEMASK(0x7, 0) + /* Pacing Config */ +#define ICE_AQ_CFG_PACING_S 3 +#define ICE_AQ_CFG_PACING_M (0xF << ICE_AQ_CFG_PACING_S) +#define ICE_AQ_CFG_PACING_TYPE_M BIT(7) +#define ICE_AQ_CFG_PACING_TYPE_AVG 0 +#define ICE_AQ_CFG_PACING_TYPE_FIXED ICE_AQ_CFG_PACING_TYPE_M + /* External Device Power Ability */ + uint8_t power_desc; +#define ICE_AQ_PWR_CLASS_M 0x3F +#define ICE_AQ_LINK_PWR_BASET_LOW_HIGH 0 +#define ICE_AQ_LINK_PWR_BASET_HIGH 1 +#define ICE_AQ_LINK_PWR_QSFP_CLASS_1 0 +#define ICE_AQ_LINK_PWR_QSFP_CLASS_2 1 +#define ICE_AQ_LINK_PWR_QSFP_CLASS_3 2 +#define ICE_AQ_LINK_PWR_QSFP_CLASS_4 3 + uint16_t link_speed; +#define ICE_AQ_LINK_SPEED_M 0x7FF +#define ICE_AQ_LINK_SPEED_10MB BIT(0) +#define ICE_AQ_LINK_SPEED_100MB BIT(1) +#define ICE_AQ_LINK_SPEED_1000MB BIT(2) +#define ICE_AQ_LINK_SPEED_2500MB BIT(3) +#define ICE_AQ_LINK_SPEED_5GB BIT(4) +#define ICE_AQ_LINK_SPEED_10GB BIT(5) +#define ICE_AQ_LINK_SPEED_20GB BIT(6) +#define ICE_AQ_LINK_SPEED_25GB BIT(7) +#define ICE_AQ_LINK_SPEED_40GB BIT(8) +#define ICE_AQ_LINK_SPEED_50GB BIT(9) +#define ICE_AQ_LINK_SPEED_100GB BIT(10) +#define ICE_AQ_LINK_SPEED_UNKNOWN BIT(15) + uint32_t reserved3; /* Aligns next field to 8-byte boundary */ + uint64_t phy_type_low; /* Use values from ICE_PHY_TYPE_LOW_* */ + uint64_t phy_type_high; /* Use values from ICE_PHY_TYPE_HIGH_* */ +}; + +/* Set event mask command (direct 0x0613) */ +struct ice_aqc_set_event_mask { + uint8_t lport_num; + uint8_t reserved[7]; + uint16_t event_mask; +#define ICE_AQ_LINK_EVENT_UPDOWN BIT(1) +#define ICE_AQ_LINK_EVENT_MEDIA_NA BIT(2) +#define ICE_AQ_LINK_EVENT_LINK_FAULT BIT(3) +#define ICE_AQ_LINK_EVENT_PHY_TEMP_ALARM BIT(4) +#define ICE_AQ_LINK_EVENT_EXCESSIVE_ERRORS BIT(5) +#define ICE_AQ_LINK_EVENT_SIGNAL_DETECT BIT(6) +#define ICE_AQ_LINK_EVENT_AN_COMPLETED BIT(7) +#define ICE_AQ_LINK_EVENT_MODULE_QUAL_FAIL BIT(8) +#define ICE_AQ_LINK_EVENT_PORT_TX_SUSPENDED BIT(9) +#define ICE_AQ_LINK_EVENT_TOPO_CONFLICT BIT(10) +#define ICE_AQ_LINK_EVENT_MEDIA_CONFLICT BIT(11) +#define ICE_AQ_LINK_EVENT_PHY_FW_LOAD_FAIL BIT(12) + uint8_t reserved1[6]; +}; + +/* Set PHY Loopback command (direct 0x0619) */ +struct ice_aqc_set_phy_lb { + uint8_t lport_num; + uint8_t lport_num_valid; +#define ICE_AQ_PHY_LB_PORT_NUM_VALID BIT(0) + uint8_t phy_index; + uint8_t lb_mode; +#define ICE_AQ_PHY_LB_EN BIT(0) +#define ICE_AQ_PHY_LB_TYPE_M BIT(1) +#define ICE_AQ_PHY_LB_TYPE_LOCAL 0 +#define ICE_AQ_PHY_LB_TYPE_REMOTE ICE_AQ_PHY_LB_TYPE_M +#define ICE_AQ_PHY_LB_LEVEL_M BIT(2) +#define ICE_AQ_PHY_LB_LEVEL_PMD 0 +#define ICE_AQ_PHY_LB_LEVEL_PCS ICE_AQ_PHY_LB_LEVEL_M + uint8_t reserved2[12]; +}; + +/* Set MAC Loopback command (direct 0x0620) */ +struct ice_aqc_set_mac_lb { + uint8_t lb_mode; +#define ICE_AQ_MAC_LB_EN BIT(0) +#define ICE_AQ_MAC_LB_OSC_CLK BIT(1) + uint8_t reserved[15]; +}; + +/* Get sensor reading (direct 0x0632) */ +struct ice_aqc_get_sensor_reading { + uint8_t sensor; +#define ICE_AQC_INT_TEMP_SENSOR 0x0 + uint8_t format; +#define ICE_AQC_INT_TEMP_FORMAT 0x0 + uint8_t reserved[6]; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Get sensor reading response (direct 0x0632) */ +struct ice_aqc_get_sensor_reading_resp { + union { + uint8_t raw[8]; + /* Output data for sensor 0x00, format 0x00 */ + struct { + int8_t temp; + uint8_t temp_warning_threshold; + uint8_t temp_critical_threshold; + uint8_t temp_fatal_threshold; + uint8_t reserved[4]; + } s0f0; + } data; +}; + +/* DNL Get Status command (indirect 0x0680) + * Structure used for the response, the command uses the generic + * ice_aqc_generic struct to pass a buffer address to the FW. + */ +struct ice_aqc_dnl_get_status { + uint8_t ctx; + uint8_t status; +#define ICE_AQ_DNL_STATUS_IDLE 0x0 +#define ICE_AQ_DNL_STATUS_RESERVED 0x1 +#define ICE_AQ_DNL_STATUS_STOPPED 0x2 +#define ICE_AQ_DNL_STATUS_FATAL 0x3 /* Fatal DNL engine error */ +#define ICE_AQ_DNL_SRC_S 3 +#define ICE_AQ_DNL_SRC_M (0x3 << ICE_AQ_DNL_SRC_S) +#define ICE_AQ_DNL_SRC_NVM (0x0 << ICE_AQ_DNL_SRC_S) +#define ICE_AQ_DNL_SRC_NVM_SCRATCH (0x1 << ICE_AQ_DNL_SRC_S) + uint8_t stack_ptr; +#define ICE_AQ_DNL_ST_PTR_S 0x0 +#define ICE_AQ_DNL_ST_PTR_M (0x7 << ICE_AQ_DNL_ST_PTR_S) + uint8_t engine_flags; +#define ICE_AQ_DNL_FLAGS_ERROR BIT(2) +#define ICE_AQ_DNL_FLAGS_NEGATIVE BIT(3) +#define ICE_AQ_DNL_FLAGS_OVERFLOW BIT(4) +#define ICE_AQ_DNL_FLAGS_ZERO BIT(5) +#define ICE_AQ_DNL_FLAGS_CARRY BIT(6) +#define ICE_AQ_DNL_FLAGS_JUMP BIT(7) + uint16_t pc; + uint16_t activity_id; + uint32_t addr_high; + uint32_t addr_low; +}; + +struct ice_aqc_dnl_get_status_data { + uint16_t activity_err_code; + uint16_t act_err_code; +#define ICE_AQ_DNL_ACT_ERR_SUCCESS 0x0000 /* no error */ +#define ICE_AQ_DNL_ACT_ERR_PARSE 0x8001 /* NVM parse error */ +#define ICE_AQ_DNL_ACT_ERR_UNSUPPORTED 0x8002 /* unsupported action */ +#define ICE_AQ_DNL_ACT_ERR_NOT_FOUND 0x8003 /* activity not found */ +#define ICE_AQ_DNL_ACT_ERR_BAD_JUMP 0x8004 /* an illegal jump */ +#define ICE_AQ_DNL_ACT_ERR_PSTO_OVER 0x8005 /* persistent store overflow */ +#define ICE_AQ_DNL_ACT_ERR_ST_OVERFLOW 0x8006 /* stack overflow */ +#define ICE_AQ_DNL_ACT_ERR_TIMEOUT 0x8007 /* activity timeout */ +#define ICE_AQ_DNL_ACT_ERR_BREAK 0x0008 /* stopped at breakpoint */ +#define ICE_AQ_DNL_ACT_ERR_INVAL_ARG 0x0101 /* invalid action argument */ + uint32_t execution_time; /* in nanoseconds */ + uint16_t lib_ver; + uint8_t psto_local_sz; + uint8_t psto_global_sz; + uint8_t stack_sz; +#define ICE_AQ_DNL_STACK_SZ_S 0 +#define ICE_AQ_DNL_STACK_SZ_M (0xF << ICE_AQ_DNL_STACK_SZ_S) + uint8_t port_count; +#define ICE_AQ_DNL_PORT_CNT_S 0 +#define ICE_AQ_DNL_PORT_CNT_M (0x1F << ICE_AQ_DNL_PORT_CNT_S) + uint16_t act_cache_cntr; + uint32_t i2c_clk_cntr; + uint32_t mdio_clk_cntr; + uint32_t sb_iosf_clk_cntr; +}; + +/* DNL run command (direct 0x0681) */ +struct ice_aqc_dnl_run_command { + uint8_t reserved0; + uint8_t command; +#define ICE_AQ_DNL_CMD_S 0 +#define ICE_AQ_DNL_CMD_M (0x7 << ICE_AQ_DNL_CMD_S) +#define ICE_AQ_DNL_CMD_RESET 0x0 +#define ICE_AQ_DNL_CMD_RUN 0x1 +#define ICE_AQ_DNL_CMD_STEP 0x3 +#define ICE_AQ_DNL_CMD_ABORT 0x4 +#define ICE_AQ_DNL_CMD_SET_PC 0x7 +#define ICE_AQ_DNL_CMD_SRC_S 3 +#define ICE_AQ_DNL_CMD_SRC_M (0x3 << ICE_AQ_DNL_CMD_SRC_S) +#define ICE_AQ_DNL_CMD_SRC_DNL 0x0 +#define ICE_AQ_DNL_CMD_SRC_SCRATCH 0x1 + uint16_t new_pc; + uint8_t reserved1[12]; +}; + +/* DNL call command (indirect 0x0682) + * Struct is used for both command and response + */ +struct ice_aqc_dnl_call_command { + uint8_t ctx; /* Used in command, reserved in response */ + uint8_t reserved; + uint16_t activity_id; + uint32_t reserved1; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* DNL call command/response buffer (indirect 0x0682) */ +struct ice_aqc_dnl_call { + uint32_t stores[4]; +}; + +/* Used for both commands: + * DNL read sto command (indirect 0x0683) + * DNL write sto command (indirect 0x0684) + */ +struct ice_aqc_dnl_read_write_command { + uint8_t ctx; + uint8_t sto_sel; /* STORE select */ +#define ICE_AQC_DNL_STORE_SELECT_STORE 0x0 +#define ICE_AQC_DNL_STORE_SELECT_PSTO 0x1 +#define ICE_AQC_DNL_STORE_SELECT_STACK 0x2 + uint16_t offset; + uint32_t data; /* Used for write sto only */ + uint32_t addr_high; /* Used for read sto only */ + uint32_t addr_low; /* Used for read sto only */ +}; + +/* Used for both command responses: + * DNL read sto response (indirect 0x0683) + * DNL write sto response (indirect 0x0684) + */ +struct ice_aqc_dnl_read_write_response { + uint8_t reserved; + uint8_t status; /* Reserved for read command */ + uint16_t size; /* Reserved for write command */ + uint32_t data; /* Reserved for write command */ + uint32_t addr_high; /* Reserved for write command */ + uint32_t addr_low; /* Reserved for write command */ +}; + +/* DNL set breakpoints command (indirect 0x0686) */ +struct ice_aqc_dnl_set_breakpoints_command { + uint32_t reserved[2]; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* DNL set breakpoints data buffer structure (indirect 0x0686) */ +struct ice_aqc_dnl_set_breakpoints { + uint8_t ctx; + uint8_t ena; /* 0- disabled, 1- enabled */ + uint16_t offset; + uint16_t activity_id; +}; + +/* DNL read log data command(indirect 0x0687) */ +struct ice_aqc_dnl_read_log_command { + uint16_t reserved0; + uint16_t offset; + uint32_t reserved1; + uint32_t addr_high; + uint32_t addr_low; + +}; + +/* DNL read log data response(indirect 0x0687) */ +struct ice_aqc_dnl_read_log_response { + uint16_t reserved; + uint16_t size; + uint32_t data; + uint32_t addr_high; + uint32_t addr_low; + +}; + +struct ice_aqc_link_topo_params { + uint8_t lport_num; + uint8_t lport_num_valid; +#define ICE_AQC_LINK_TOPO_PORT_NUM_VALID BIT(0) + uint8_t node_type_ctx; +#define ICE_AQC_LINK_TOPO_NODE_TYPE_S 0 +#define ICE_AQC_LINK_TOPO_NODE_TYPE_M (0xF << ICE_AQC_LINK_TOPO_NODE_TYPE_S) +#define ICE_AQC_LINK_TOPO_NODE_TYPE_PHY 0 +#define ICE_AQC_LINK_TOPO_NODE_TYPE_GPIO_CTRL 1 +#define ICE_AQC_LINK_TOPO_NODE_TYPE_MUX_CTRL 2 +#define ICE_AQC_LINK_TOPO_NODE_TYPE_LED_CTRL 3 +#define ICE_AQC_LINK_TOPO_NODE_TYPE_LED 4 +#define ICE_AQC_LINK_TOPO_NODE_TYPE_THERMAL 5 +#define ICE_AQC_LINK_TOPO_NODE_TYPE_CAGE 6 +#define ICE_AQC_LINK_TOPO_NODE_TYPE_MEZZ 7 +#define ICE_AQC_LINK_TOPO_NODE_TYPE_ID_EEPROM 8 +#define ICE_AQC_LINK_TOPO_NODE_CTX_S 4 +#define ICE_AQC_LINK_TOPO_NODE_CTX_M \ + (0xF << ICE_AQC_LINK_TOPO_NODE_CTX_S) +#define ICE_AQC_LINK_TOPO_NODE_CTX_GLOBAL 0 +#define ICE_AQC_LINK_TOPO_NODE_CTX_BOARD 1 +#define ICE_AQC_LINK_TOPO_NODE_CTX_PORT 2 +#define ICE_AQC_LINK_TOPO_NODE_CTX_NODE 3 +#define ICE_AQC_LINK_TOPO_NODE_CTX_PROVIDED 4 +#define ICE_AQC_LINK_TOPO_NODE_CTX_OVERRIDE 5 + uint8_t index; +}; + +struct ice_aqc_link_topo_addr { + struct ice_aqc_link_topo_params topo_params; + uint16_t handle; +#define ICE_AQC_LINK_TOPO_HANDLE_S 0 +#define ICE_AQC_LINK_TOPO_HANDLE_M (0x3FF << ICE_AQC_LINK_TOPO_HANDLE_S) +/* Used to decode the handle field */ +#define ICE_AQC_LINK_TOPO_HANDLE_BRD_TYPE_M BIT(9) +#define ICE_AQC_LINK_TOPO_HANDLE_BRD_TYPE_LOM BIT(9) +#define ICE_AQC_LINK_TOPO_HANDLE_BRD_TYPE_MEZZ 0 +#define ICE_AQC_LINK_TOPO_HANDLE_NODE_S 0 +/* In case of a Mezzanine type */ +#define ICE_AQC_LINK_TOPO_HANDLE_MEZZ_NODE_M \ + (0x3F << ICE_AQC_LINK_TOPO_HANDLE_NODE_S) +#define ICE_AQC_LINK_TOPO_HANDLE_MEZZ_S 6 +#define ICE_AQC_LINK_TOPO_HANDLE_MEZZ_M (0x7 << ICE_AQC_LINK_TOPO_HANDLE_MEZZ_S) +/* In case of a LOM type */ +#define ICE_AQC_LINK_TOPO_HANDLE_LOM_NODE_M \ + (0x1FF << ICE_AQC_LINK_TOPO_HANDLE_NODE_S) +}; + +/* Get Link Topology Handle (direct, 0x06E0) */ +struct ice_aqc_get_link_topo { + struct ice_aqc_link_topo_addr addr; + uint8_t node_part_num; +#define ICE_ACQ_GET_LINK_TOPO_NODE_NR_PCA9575 0x21 + uint8_t rsvd[9]; +}; + +/* Read/Write I2C (direct, 0x06E2/0x06E3) */ +struct ice_aqc_i2c { + struct ice_aqc_link_topo_addr topo_addr; + uint16_t i2c_addr; + uint8_t i2c_params; +#define ICE_AQC_I2C_DATA_SIZE_S 0 +#define ICE_AQC_I2C_DATA_SIZE_M (0xF << ICE_AQC_I2C_DATA_SIZE_S) +#define ICE_AQC_I2C_ADDR_TYPE_M BIT(4) +#define ICE_AQC_I2C_ADDR_TYPE_7BIT 0 +#define ICE_AQC_I2C_ADDR_TYPE_10BIT ICE_AQC_I2C_ADDR_TYPE_M +#define ICE_AQC_I2C_DATA_OFFSET_S 5 +#define ICE_AQC_I2C_DATA_OFFSET_M (0x3 << ICE_AQC_I2C_DATA_OFFSET_S) +#define ICE_AQC_I2C_USE_REPEATED_START BIT(7) + uint8_t rsvd; + uint16_t i2c_bus_addr; +#define ICE_AQC_I2C_ADDR_7BIT_MASK 0x7F +#define ICE_AQC_I2C_ADDR_10BIT_MASK 0x3FF + uint8_t i2c_data[4]; /* Used only by write command, reserved in read. */ +}; + +/* Read I2C Response (direct, 0x06E2) */ +struct ice_aqc_read_i2c_resp { + uint8_t i2c_data[16]; +}; + +/* Read/Write MDIO (direct, 0x06E4/0x06E5) */ +struct ice_aqc_mdio { + struct ice_aqc_link_topo_addr topo_addr; + uint8_t mdio_device_addr; +#define ICE_AQC_MDIO_DEV_S 0 +#define ICE_AQC_MDIO_DEV_M (0x1F << ICE_AQC_MDIO_DEV_S) +#define ICE_AQC_MDIO_CLAUSE_22 BIT(5) +#define ICE_AQC_MDIO_CLAUSE_45 BIT(6) + uint8_t mdio_bus_address; +#define ICE_AQC_MDIO_BUS_ADDR_S 0 +#define ICE_AQC_MDIO_BUS_ADDR_M (0x1F << ICE_AQC_MDIO_BUS_ADDR_S) + uint16_t offset; + uint16_t data; /* Input in write cmd, output in read cmd. */ + uint8_t rsvd1[4]; +}; + +/* Set/Get GPIO By Function (direct, 0x06E6/0x06E7) */ +struct ice_aqc_gpio_by_func { + struct ice_aqc_link_topo_addr topo_addr; + uint8_t io_func_num; +#define ICE_AQC_GPIO_FUNC_S 0 +#define ICE_AQC_GPIO_FUNC_M (0x1F << ICE_AQC_GPIO_IO_FUNC_NUM_S) + uint8_t io_value; /* Input in write cmd, output in read cmd. */ +#define ICE_AQC_GPIO_ON BIT(0) +#define ICE_AQC_GPIO_OFF 0 + uint8_t rsvd[8]; +}; + +/* Set LED (direct, 0x06E8) */ +struct ice_aqc_set_led { + struct ice_aqc_link_topo_addr topo_addr; + uint8_t color_and_blink; +#define ICE_AQC_LED_COLOR_S 0 +#define ICE_AQC_LED_COLOR_M (0x7 << ICE_AQC_LED_COLOR_S) +#define ICE_AQC_LED_COLOR_SKIP 0 +#define ICE_AQC_LED_COLOR_RED 1 +#define ICE_AQC_LED_COLOR_ORANGE 2 +#define ICE_AQC_LED_COLOR_YELLOW 3 +#define ICE_AQC_LED_COLOR_GREEN 4 +#define ICE_AQC_LED_COLOR_BLUE 5 +#define ICE_AQC_LED_COLOR_PURPLE 6 +#define ICE_AQC_LED_BLINK_S 3 +#define ICE_AQC_LED_BLINK_M (0x7 << ICE_AQC_LED_BLINK_S) +#define ICE_AQC_LED_BLINK_NONE 0 +#define ICE_AQC_LED_BLINK_SLOW 1 +#define ICE_AQC_LED_BLINK_SLOW_MAC 2 +#define ICE_AQC_LED_BLINK_SLOW_FLTR 3 +#define ICE_AQC_LED_BLINK_FAST 5 +#define ICE_AQC_LED_BLINK_FAST_MAC 6 +#define ICE_AQC_LED_BLINK_FAST_FLTR 7 + uint8_t rsvd[9]; +}; + +/* Set Port Identification LED (direct, 0x06E9) */ +struct ice_aqc_set_port_id_led { + uint8_t lport_num; + uint8_t lport_num_valid; +#define ICE_AQC_PORT_ID_PORT_NUM_VALID BIT(0) + uint8_t ident_mode; +#define ICE_AQC_PORT_IDENT_LED_BLINK BIT(0) +#define ICE_AQC_PORT_IDENT_LED_ORIG 0 + uint8_t rsvd[13]; +}; + +/* Get Port Options (indirect, 0x06EA) */ +struct ice_aqc_get_port_options { + uint8_t lport_num; + uint8_t lport_num_valid; +#define ICE_AQC_PORT_OPT_PORT_NUM_VALID BIT(0) + uint8_t port_options_count; +#define ICE_AQC_PORT_OPT_COUNT_S 0 +#define ICE_AQC_PORT_OPT_COUNT_M (0xF << ICE_AQC_PORT_OPT_COUNT_S) +#define ICE_AQC_PORT_OPT_MAX 16 + uint8_t innermost_phy_index; + uint8_t port_options; +#define ICE_AQC_PORT_OPT_ACTIVE_S 0 +#define ICE_AQC_PORT_OPT_ACTIVE_M (0xF << ICE_AQC_PORT_OPT_ACTIVE_S) +#define ICE_AQC_PORT_OPT_FORCED BIT(6) +#define ICE_AQC_PORT_OPT_VALID BIT(7) + uint8_t pending_port_option_status; +#define ICE_AQC_PENDING_PORT_OPT_IDX_S 0 +#define ICE_AQC_PENDING_PORT_OPT_IDX_M (0xF << ICE_AQC_PENDING_PORT_OPT_IDX_S) +#define ICE_AQC_PENDING_PORT_OPT_VALID BIT(7) + uint8_t rsvd[2]; + uint32_t addr_high; + uint32_t addr_low; +}; + +struct ice_aqc_get_port_options_elem { + uint8_t pmd; +#define ICE_AQC_PORT_INV_PORT_OPT 4 +#define ICE_AQC_PORT_OPT_PMD_COUNT_S 0 +#define ICE_AQC_PORT_OPT_PMD_COUNT_M (0xF << ICE_AQC_PORT_OPT_PMD_COUNT_S) +#define ICE_AQC_PORT_OPT_PMD_WIDTH_S 4 +#define ICE_AQC_PORT_OPT_PMD_WIDTH_M (0xF << ICE_AQC_PORT_OPT_PMD_WIDTH_S) + uint8_t max_lane_speed; +#define ICE_AQC_PORT_OPT_MAX_LANE_S 0 +#define ICE_AQC_PORT_OPT_MAX_LANE_M (0xF << ICE_AQC_PORT_OPT_MAX_LANE_S) +#define ICE_AQC_PORT_OPT_MAX_LANE_100M 0 +#define ICE_AQC_PORT_OPT_MAX_LANE_1G 1 +#define ICE_AQC_PORT_OPT_MAX_LANE_2500M 2 +#define ICE_AQC_PORT_OPT_MAX_LANE_5G 3 +#define ICE_AQC_PORT_OPT_MAX_LANE_10G 4 +#define ICE_AQC_PORT_OPT_MAX_LANE_25G 5 +#define ICE_AQC_PORT_OPT_MAX_LANE_50G 6 +#define ICE_AQC_PORT_OPT_MAX_LANE_100G 7 + uint8_t global_scid[2]; + uint8_t phy_scid[2]; + uint8_t pf2port_cid[2]; +}; + +/* Set Port Option (direct, 0x06EB) */ +struct ice_aqc_set_port_option { + uint8_t lport_num; + uint8_t lport_num_valid; +#define ICE_AQC_SET_PORT_OPT_PORT_NUM_VALID BIT(0) + uint8_t selected_port_option; + uint8_t rsvd[13]; +}; + +/* Set/Get GPIO (direct, 0x06EC/0x06ED) */ +struct ice_aqc_gpio { + uint16_t gpio_ctrl_handle; +#define ICE_AQC_GPIO_HANDLE_S 0 +#define ICE_AQC_GPIO_HANDLE_M (0x3FF << ICE_AQC_GPIO_HANDLE_S) + uint8_t gpio_num; + uint8_t gpio_val; + uint8_t rsvd[12]; +}; + +/* Read/Write SFF EEPROM command (indirect 0x06EE) */ +struct ice_aqc_sff_eeprom { + uint8_t lport_num; + uint8_t lport_num_valid; +#define ICE_AQC_SFF_PORT_NUM_VALID BIT(0) + uint16_t i2c_bus_addr; +#define ICE_AQC_SFF_I2CBUS_7BIT_M 0x7F +#define ICE_AQC_SFF_I2CBUS_10BIT_M 0x3FF +#define ICE_AQC_SFF_I2CBUS_TYPE_M BIT(10) +#define ICE_AQC_SFF_I2CBUS_TYPE_7BIT 0 +#define ICE_AQC_SFF_I2CBUS_TYPE_10BIT ICE_AQC_SFF_I2CBUS_TYPE_M +#define ICE_AQC_SFF_SET_EEPROM_PAGE_S 11 +#define ICE_AQC_SFF_SET_EEPROM_PAGE_M (0x3 << ICE_AQC_SFF_SET_EEPROM_PAGE_S) +#define ICE_AQC_SFF_NO_PAGE_CHANGE 0 +#define ICE_AQC_SFF_SET_23_ON_MISMATCH 1 +#define ICE_AQC_SFF_SET_22_ON_MISMATCH 2 +#define ICE_AQC_SFF_IS_WRITE BIT(15) + uint16_t i2c_mem_addr; + uint16_t eeprom_page; +#define ICE_AQC_SFF_EEPROM_BANK_S 0 +#define ICE_AQC_SFF_EEPROM_BANK_M (0xFF << ICE_AQC_SFF_EEPROM_BANK_S) +#define ICE_AQC_SFF_EEPROM_PAGE_S 8 +#define ICE_AQC_SFF_EEPROM_PAGE_M (0xFF << ICE_AQC_SFF_EEPROM_PAGE_S) + uint32_t addr_high; + uint32_t addr_low; +}; + +/* SW Set GPIO command (indirect 0x6EF) + * SW Get GPIO command (indirect 0x6F0) + */ +struct ice_aqc_sw_gpio { + uint16_t gpio_ctrl_handle; +#define ICE_AQC_SW_GPIO_CONTROLLER_HANDLE_S 0 +#define ICE_AQC_SW_GPIO_CONTROLLER_HANDLE_M (0x3FF << ICE_AQC_SW_GPIO_CONTROLLER_HANDLE_S) + uint8_t gpio_num; +#define ICE_AQC_SW_GPIO_NUMBER_S 0 +#define ICE_AQC_SW_GPIO_NUMBER_M (0x1F << ICE_AQC_SW_GPIO_NUMBER_S) + uint8_t gpio_params; +#define ICE_AQC_SW_GPIO_PARAMS_DIRECTION BIT(1) +#define ICE_AQC_SW_GPIO_PARAMS_VALUE BIT(0) + uint8_t rsvd[12]; +}; + +/* Program Topology Device NVM (direct, 0x06F2) */ +struct ice_aqc_prog_topo_dev_nvm { + struct ice_aqc_link_topo_params topo_params; + uint8_t rsvd[12]; +}; + +/* Read Topology Device NVM (direct, 0x06F3) */ +struct ice_aqc_read_topo_dev_nvm { + struct ice_aqc_link_topo_params topo_params; + uint32_t start_address; +#define ICE_AQC_READ_TOPO_DEV_NVM_DATA_READ_SIZE 8 + uint8_t data_read[ICE_AQC_READ_TOPO_DEV_NVM_DATA_READ_SIZE]; +}; + +/* NVM Read command (indirect 0x0701) + * NVM Erase commands (direct 0x0702) + * NVM Write commands (indirect 0x0703) + * NVM Write Activate commands (direct 0x0707) + * NVM Shadow RAM Dump commands (direct 0x0707) + */ +struct ice_aqc_nvm { +#define ICE_AQC_NVM_MAX_OFFSET 0xFFFFFF + uint16_t offset_low; + uint8_t offset_high; /* For Write Activate offset_high is used as flags2 */ + uint8_t cmd_flags; +#define ICE_AQC_NVM_LAST_CMD BIT(0) +#define ICE_AQC_NVM_PCIR_REQ BIT(0) /* Used by NVM Write reply */ +#define ICE_AQC_NVM_PRESERVATION_S 1 /* Used by NVM Write Activate only */ +#define ICE_AQC_NVM_PRESERVATION_M (3 << ICE_AQC_NVM_PRESERVATION_S) +#define ICE_AQC_NVM_NO_PRESERVATION (0 << ICE_AQC_NVM_PRESERVATION_S) +#define ICE_AQC_NVM_PRESERVE_ALL BIT(1) +#define ICE_AQC_NVM_FACTORY_DEFAULT (2 << ICE_AQC_NVM_PRESERVATION_S) +#define ICE_AQC_NVM_PRESERVE_SELECTED (3 << ICE_AQC_NVM_PRESERVATION_S) +#define ICE_AQC_NVM_ACTIV_SEL_NVM BIT(3) /* Write Activate/SR Dump only */ +#define ICE_AQC_NVM_ACTIV_SEL_OROM BIT(4) +#define ICE_AQC_NVM_ACTIV_SEL_NETLIST BIT(5) +#define ICE_AQC_NVM_SPECIAL_UPDATE BIT(6) +#define ICE_AQC_NVM_REVERT_LAST_ACTIV BIT(6) /* Write Activate only */ +#define ICE_AQC_NVM_ACTIV_SEL_MASK MAKEMASK(0x7, 3) +#define ICE_AQC_NVM_FLASH_ONLY BIT(7) +#define ICE_AQC_NVM_RESET_LVL_M MAKEMASK(0x3, 0) /* Write reply only */ +#define ICE_AQC_NVM_POR_FLAG 0 +#define ICE_AQC_NVM_PERST_FLAG 1 +#define ICE_AQC_NVM_EMPR_FLAG 2 +#define ICE_AQC_NVM_EMPR_ENA BIT(0) /* Write Activate reply only */ + /* For Write Activate, several flags are sent as part of a separate + * flags2 field using a separate byte. For simplicity of the software + * interface, we pass the flags as a 16 bit value so these flags are + * all offset by 8 bits + */ +#define ICE_AQC_NVM_ACTIV_REQ_EMPR BIT(8) /* NVM Write Activate only */ + uint16_t module_typeid; + uint16_t length; +#define ICE_AQC_NVM_ERASE_LEN 0xFFFF + uint32_t addr_high; + uint32_t addr_low; +}; + +/* NVM Module_Type ID, needed offset and read_len for struct ice_aqc_nvm. */ +#define ICE_AQC_NVM_SECTOR_UNIT 4096 /* In Bytes */ +#define ICE_AQC_NVM_WORD_UNIT 2 /* In Bytes */ + +#define ICE_AQC_NVM_START_POINT 0 +#define ICE_AQC_NVM_EMP_SR_PTR_OFFSET 0x90 +#define ICE_AQC_NVM_EMP_SR_PTR_RD_LEN 2 /* In Bytes */ +#define ICE_AQC_NVM_EMP_SR_PTR_M MAKEMASK(0x7FFF, 0) +#define ICE_AQC_NVM_EMP_SR_PTR_TYPE_S 15 +#define ICE_AQC_NVM_EMP_SR_PTR_TYPE_M BIT(15) +#define ICE_AQC_NVM_EMP_SR_PTR_TYPE_SECTOR 1 + +#define ICE_AQC_NVM_LLDP_CFG_PTR_OFFSET 0x46 +#define ICE_AQC_NVM_LLDP_CFG_HEADER_LEN 2 /* In Bytes */ +#define ICE_AQC_NVM_LLDP_CFG_PTR_RD_LEN 2 /* In Bytes */ + +#define ICE_AQC_NVM_LLDP_PRESERVED_MOD_ID 0x129 +#define ICE_AQC_NVM_CUR_LLDP_PERSIST_RD_OFFSET 2 /* In Bytes */ +#define ICE_AQC_NVM_LLDP_STATUS_M MAKEMASK(0xF, 0) +#define ICE_AQC_NVM_LLDP_STATUS_M_LEN 4 /* In Bits */ +#define ICE_AQC_NVM_LLDP_STATUS_RD_LEN 4 /* In Bytes */ + +#define ICE_AQC_NVM_MINSREV_MOD_ID 0x130 +#define ICE_AQC_NVM_TX_TOPO_MOD_ID 0x14B +#define ICE_AQC_NVM_CMPO_MOD_ID 0x153 + +/* Cage Max Power override NVM module */ +struct ice_aqc_nvm_cmpo { + uint16_t length; +#define ICE_AQC_NVM_CMPO_ENABLE BIT(8) + uint16_t cages_cfg[8]; +}; + +/* Used for reading and writing MinSRev using 0x0701 and 0x0703. Note that the + * type field is excluded from the section when reading and writing from + * a module using the module_typeid field with these AQ commands. + */ +struct ice_aqc_nvm_minsrev { + uint16_t length; + uint16_t validity; +#define ICE_AQC_NVM_MINSREV_NVM_VALID BIT(0) +#define ICE_AQC_NVM_MINSREV_OROM_VALID BIT(1) + uint16_t nvm_minsrev_l; + uint16_t nvm_minsrev_h; + uint16_t orom_minsrev_l; + uint16_t orom_minsrev_h; +}; + +struct ice_aqc_nvm_tx_topo_user_sel { + uint16_t length; + uint8_t data; +#define ICE_AQC_NVM_TX_TOPO_USER_SEL BIT(4) + uint8_t reserved; +}; + +/* Used for 0x0704 as well as for 0x0705 commands */ +struct ice_aqc_nvm_cfg { + uint8_t cmd_flags; +#define ICE_AQC_ANVM_MULTIPLE_ELEMS BIT(0) +#define ICE_AQC_ANVM_IMMEDIATE_FIELD BIT(1) +#define ICE_AQC_ANVM_NEW_CFG BIT(2) + uint8_t reserved; + uint16_t count; + uint16_t id; + uint8_t reserved1[2]; + uint32_t addr_high; + uint32_t addr_low; +}; + +struct ice_aqc_nvm_cfg_data { + uint16_t field_id; + uint16_t field_options; + uint16_t field_value; +}; + +/* NVM Checksum Command (direct, 0x0706) */ +struct ice_aqc_nvm_checksum { + uint8_t flags; +#define ICE_AQC_NVM_CHECKSUM_VERIFY BIT(0) +#define ICE_AQC_NVM_CHECKSUM_RECALC BIT(1) + uint8_t rsvd; + uint16_t checksum; /* Used only by response */ +#define ICE_AQC_NVM_CHECKSUM_CORRECT 0xBABA + uint8_t rsvd2[12]; +}; + +/* + * Send to PF command (indirect 0x0801) ID is only used by PF + * + * Send to VF command (indirect 0x0802) ID is only used by PF + * + */ +struct ice_aqc_pf_vf_msg { + uint32_t id; + uint32_t reserved; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Write/Read Alternate - Direct (direct 0x0900/0x0902) */ +struct ice_aqc_read_write_alt_direct { + uint32_t dword0_addr; + uint32_t dword0_value; + uint32_t dword1_addr; + uint32_t dword1_value; +}; + +/* Write/Read Alternate - Indirect (indirect 0x0901/0x0903) */ +struct ice_aqc_read_write_alt_indirect { + uint32_t base_dword_addr; + uint32_t num_dwords; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Done Alternate Write (direct 0x0904) */ +struct ice_aqc_done_alt_write { + uint8_t flags; +#define ICE_AQC_CMD_UEFI_BIOS_MODE BIT(0) +#define ICE_AQC_RESP_RESET_NEEDED BIT(1) + uint8_t reserved[15]; +}; + +/* Clear Port Alternate Write (direct 0x0906) */ +struct ice_aqc_clear_port_alt_write { + uint8_t reserved[16]; +}; + +/* Get LLDP MIB (indirect 0x0A00) + * Note: This is also used by the LLDP MIB Change Event (0x0A01) + * as the format is the same. + */ +struct ice_aqc_lldp_get_mib { + uint8_t type; +#define ICE_AQ_LLDP_MIB_TYPE_S 0 +#define ICE_AQ_LLDP_MIB_TYPE_M (0x3 << ICE_AQ_LLDP_MIB_TYPE_S) +#define ICE_AQ_LLDP_MIB_LOCAL 0 +#define ICE_AQ_LLDP_MIB_REMOTE 1 +#define ICE_AQ_LLDP_MIB_LOCAL_AND_REMOTE 2 +#define ICE_AQ_LLDP_BRID_TYPE_S 2 +#define ICE_AQ_LLDP_BRID_TYPE_M (0x3 << ICE_AQ_LLDP_BRID_TYPE_S) +#define ICE_AQ_LLDP_BRID_TYPE_NEAREST_BRID 0 +#define ICE_AQ_LLDP_BRID_TYPE_NON_TPMR 1 +/* Tx pause flags in the 0xA01 event use ICE_AQ_LLDP_TX_* */ +#define ICE_AQ_LLDP_TX_S 0x4 +#define ICE_AQ_LLDP_TX_M (0x03 << ICE_AQ_LLDP_TX_S) +#define ICE_AQ_LLDP_TX_ACTIVE 0 +#define ICE_AQ_LLDP_TX_SUSPENDED 1 +#define ICE_AQ_LLDP_TX_FLUSHED 3 +/* DCBX mode */ +#define ICE_AQ_LLDP_DCBX_S 6 +#define ICE_AQ_LLDP_DCBX_M (0x3 << ICE_AQ_LLDP_DCBX_S) +#define ICE_AQ_LLDP_DCBX_NA 0 +#define ICE_AQ_LLDP_DCBX_CEE 1 +#define ICE_AQ_LLDP_DCBX_IEEE 2 +/* The following bytes are reserved for the Get LLDP MIB command (0x0A00) + * and in the LLDP MIB Change Event (0x0A01). They are valid for the + * Get LLDP MIB (0x0A00) response only. + */ + uint8_t state; +#define ICE_AQ_LLDP_MIB_CHANGE_STATE_S 0 +#define ICE_AQ_LLDP_MIB_CHANGE_STATE_M \ + (0x1 << ICE_AQ_LLDP_MIB_CHANGE_STATE_S) +#define ICE_AQ_LLDP_MIB_CHANGE_EXECUTED 0 +#define ICE_AQ_LLDP_MIB_CHANGE_PENDING 1 + uint16_t local_len; + uint16_t remote_len; + uint8_t reserved[2]; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Configure LLDP MIB Change Event (direct 0x0A01) */ +/* For MIB Change Event use ice_aqc_lldp_get_mib structure above */ +struct ice_aqc_lldp_set_mib_change { + uint8_t command; +#define ICE_AQ_LLDP_MIB_UPDATE_ENABLE 0x0 +#define ICE_AQ_LLDP_MIB_UPDATE_DIS 0x1 +#define ICE_AQ_LLDP_MIB_PENDING_S 1 +#define ICE_AQ_LLDP_MIB_PENDING_M \ + (0x1 << ICE_AQ_LLDP_MIB_PENDING_S) +#define ICE_AQ_LLDP_MIB_PENDING_DISABLE 0 +#define ICE_AQ_LLDP_MIB_PENDING_ENABLE 1 + uint8_t reserved[15]; +}; + +/* Add LLDP TLV (indirect 0x0A02) + * Delete LLDP TLV (indirect 0x0A04) + */ +struct ice_aqc_lldp_add_delete_tlv { + uint8_t type; /* only nearest bridge and non-TPMR from 0x0A00 */ + uint8_t reserved1[1]; + uint16_t len; + uint8_t reserved2[4]; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Update LLDP TLV (indirect 0x0A03) */ +struct ice_aqc_lldp_update_tlv { + uint8_t type; /* only nearest bridge and non-TPMR from 0x0A00 */ + uint8_t reserved; + uint16_t old_len; + uint16_t new_offset; + uint16_t new_len; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Stop LLDP (direct 0x0A05) */ +struct ice_aqc_lldp_stop { + uint8_t command; +#define ICE_AQ_LLDP_AGENT_STATE_MASK BIT(0) +#define ICE_AQ_LLDP_AGENT_STOP 0x0 +#define ICE_AQ_LLDP_AGENT_SHUTDOWN ICE_AQ_LLDP_AGENT_STATE_MASK +#define ICE_AQ_LLDP_AGENT_PERSIST_DIS BIT(1) + uint8_t reserved[15]; +}; + +/* Start LLDP (direct 0x0A06) */ +struct ice_aqc_lldp_start { + uint8_t command; +#define ICE_AQ_LLDP_AGENT_START BIT(0) +#define ICE_AQ_LLDP_AGENT_PERSIST_ENA BIT(1) + uint8_t reserved[15]; +}; + +/* Get CEE DCBX Oper Config (0x0A07) + * The command uses the generic descriptor struct and + * returns the struct below as an indirect response. + */ +struct ice_aqc_get_cee_dcb_cfg_resp { + uint8_t oper_num_tc; + uint8_t oper_prio_tc[4]; + uint8_t oper_tc_bw[8]; + uint8_t oper_pfc_en; + uint16_t oper_app_prio; +#define ICE_AQC_CEE_APP_FCOE_S 0 +#define ICE_AQC_CEE_APP_FCOE_M (0x7 << ICE_AQC_CEE_APP_FCOE_S) +#define ICE_AQC_CEE_APP_ISCSI_S 3 +#define ICE_AQC_CEE_APP_ISCSI_M (0x7 << ICE_AQC_CEE_APP_ISCSI_S) +#define ICE_AQC_CEE_APP_FIP_S 8 +#define ICE_AQC_CEE_APP_FIP_M (0x7 << ICE_AQC_CEE_APP_FIP_S) + uint32_t tlv_status; +#define ICE_AQC_CEE_PG_STATUS_S 0 +#define ICE_AQC_CEE_PG_STATUS_M (0x7 << ICE_AQC_CEE_PG_STATUS_S) +#define ICE_AQC_CEE_PFC_STATUS_S 3 +#define ICE_AQC_CEE_PFC_STATUS_M (0x7 << ICE_AQC_CEE_PFC_STATUS_S) +#define ICE_AQC_CEE_FCOE_STATUS_S 8 +#define ICE_AQC_CEE_FCOE_STATUS_M (0x7 << ICE_AQC_CEE_FCOE_STATUS_S) +#define ICE_AQC_CEE_ISCSI_STATUS_S 11 +#define ICE_AQC_CEE_ISCSI_STATUS_M (0x7 << ICE_AQC_CEE_ISCSI_STATUS_S) +#define ICE_AQC_CEE_FIP_STATUS_S 16 +#define ICE_AQC_CEE_FIP_STATUS_M (0x7 << ICE_AQC_CEE_FIP_STATUS_S) + uint8_t reserved[12]; +}; + +/* Set Local LLDP MIB (indirect 0x0A08) + * Used to replace the local MIB of a given LLDP agent. e.g. DCBX + */ +struct ice_aqc_lldp_set_local_mib { + uint8_t type; +#define SET_LOCAL_MIB_TYPE_DCBX_M BIT(0) +#define SET_LOCAL_MIB_TYPE_LOCAL_MIB 0 +#define SET_LOCAL_MIB_TYPE_CEE_M BIT(1) +#define SET_LOCAL_MIB_TYPE_CEE_WILLING 0 +#define SET_LOCAL_MIB_TYPE_CEE_NON_WILLING SET_LOCAL_MIB_TYPE_CEE_M + uint8_t reserved0; + uint16_t length; + uint8_t reserved1[4]; + uint32_t addr_high; + uint32_t addr_low; +}; + +struct ice_aqc_lldp_set_local_mib_resp { + uint8_t status; +#define SET_LOCAL_MIB_RESP_EVENT_M BIT(0) +#define SET_LOCAL_MIB_RESP_MIB_CHANGE_SILENT 0 +#define SET_LOCAL_MIB_RESP_MIB_CHANGE_EVENT SET_LOCAL_MIB_RESP_EVENT_M + uint8_t reserved[15]; +}; + +/* Stop/Start LLDP Agent (direct 0x0A09) + * Used for stopping/starting specific LLDP agent. e.g. DCBX. + * The same structure is used for the response, with the command field + * being used as the status field. + */ +struct ice_aqc_lldp_stop_start_specific_agent { + uint8_t command; +#define ICE_AQC_START_STOP_AGENT_M BIT(0) +#define ICE_AQC_START_STOP_AGENT_STOP_DCBX 0 +#define ICE_AQC_START_STOP_AGENT_START_DCBX ICE_AQC_START_STOP_AGENT_M + uint8_t reserved[15]; +}; + +/* LLDP Filter Control (direct 0x0A0A) */ +struct ice_aqc_lldp_filter_ctrl { + uint8_t cmd_flags; +#define ICE_AQC_LLDP_FILTER_ACTION_M MAKEMASK(3, 0) +#define ICE_AQC_LLDP_FILTER_ACTION_ADD 0x0 +#define ICE_AQC_LLDP_FILTER_ACTION_DELETE 0x1 +#define ICE_AQC_LLDP_FILTER_ACTION_UPDATE 0x2 + uint8_t reserved1; + uint16_t vsi_num; + uint8_t reserved2[12]; +}; + +/* Get/Set RSS key (indirect 0x0B04/0x0B02) */ +struct ice_aqc_get_set_rss_key { +#define ICE_AQC_GSET_RSS_KEY_VSI_VALID BIT(15) +#define ICE_AQC_GSET_RSS_KEY_VSI_ID_S 0 +#define ICE_AQC_GSET_RSS_KEY_VSI_ID_M (0x3FF << ICE_AQC_GSET_RSS_KEY_VSI_ID_S) + uint16_t vsi_id; + uint8_t reserved[6]; + uint32_t addr_high; + uint32_t addr_low; +}; + +#define ICE_AQC_GET_SET_RSS_KEY_DATA_RSS_KEY_SIZE 0x28 +#define ICE_AQC_GET_SET_RSS_KEY_DATA_HASH_KEY_SIZE 0xC +#define ICE_GET_SET_RSS_KEY_EXTEND_KEY_SIZE \ + (ICE_AQC_GET_SET_RSS_KEY_DATA_RSS_KEY_SIZE + \ + ICE_AQC_GET_SET_RSS_KEY_DATA_HASH_KEY_SIZE) + +/** + * struct ice_aqc_get_set_rss_keys - Get/Set RSS hash key command buffer + * @standard_rss_key: 40 most significant bytes of hash key + * @extended_hash_key: 12 least significant bytes of hash key + * + * Set/Get 40 byte hash key using standard_rss_key field, and set + * extended_hash_key field to zero. Set/Get 52 byte hash key using + * standard_rss_key field for 40 most significant bytes and the + * extended_hash_key field for the 12 least significant bytes of hash key. + */ +struct ice_aqc_get_set_rss_keys { + uint8_t standard_rss_key[ICE_AQC_GET_SET_RSS_KEY_DATA_RSS_KEY_SIZE]; + uint8_t extended_hash_key[ICE_AQC_GET_SET_RSS_KEY_DATA_HASH_KEY_SIZE]; +}; + +enum ice_lut_type { + ICE_LUT_VSI = 0, + ICE_LUT_PF = 1, + ICE_LUT_GLOBAL = 2, + ICE_LUT_TYPE_MASK = 3, + ICE_LUT_PF_SMALL = 5, /* yields ICE_LUT_PF when &= ICE_LUT_TYPE_MASK */ +}; + +enum ice_lut_size { + ICE_LUT_VSI_SIZE = 64, + ICE_LUT_PF_SMALL_SIZE = 128, + ICE_LUT_GLOBAL_SIZE = 512, + ICE_LUT_PF_SIZE = 2048, +}; + +/* Get/Set RSS LUT (indirect 0x0B05/0x0B03) */ +struct ice_aqc_get_set_rss_lut { +#define ICE_AQC_GSET_RSS_LUT_VSI_VALID BIT(15) +#define ICE_AQC_GSET_RSS_LUT_VSI_ID_S 0 +#define ICE_AQC_GSET_RSS_LUT_VSI_ID_M (0x3FF << ICE_AQC_GSET_RSS_LUT_VSI_ID_S) + uint16_t vsi_id; +#define ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_S 0 +#define ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_M \ + (ICE_LUT_TYPE_MASK << ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_S) + +#define ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_S 2 +#define ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_M \ + (ICE_LUT_TYPE_MASK << ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_S) + +#define ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_512_FLAG 1 +#define ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_2K_FLAG 2 + +#define ICE_AQC_GSET_RSS_LUT_GLOBAL_IDX_S 4 +#define ICE_AQC_GSET_RSS_LUT_GLOBAL_IDX_M \ + (0xF << ICE_AQC_GSET_RSS_LUT_GLOBAL_IDX_S) + + uint16_t flags; + uint32_t reserved; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Add Tx LAN Queues (indirect 0x0C30) */ +struct ice_aqc_add_txqs { + uint8_t num_qgrps; + uint8_t reserved[3]; + uint32_t reserved1; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* This is the descriptor of each queue entry for the Add Tx LAN Queues + * command (0x0C30). Only used within struct ice_aqc_add_tx_qgrp. + */ +struct ice_aqc_add_txqs_perq { + uint16_t txq_id; + uint8_t rsvd[2]; + uint32_t q_teid; + uint8_t txq_ctx[22]; + uint8_t rsvd2[2]; + struct ice_aqc_txsched_elem info; +}; + +/* The format of the command buffer for Add Tx LAN Queues (0x0C30) + * is an array of the following structs. Please note that the length of + * each struct ice_aqc_add_tx_qgrp is variable due + * to the variable number of queues in each group! + */ +struct ice_aqc_add_tx_qgrp { + uint32_t parent_teid; + uint8_t num_txqs; + uint8_t rsvd[3]; + struct ice_aqc_add_txqs_perq txqs[STRUCT_HACK_VAR_LEN]; +}; + +/* Disable Tx LAN Queues (indirect 0x0C31) */ +struct ice_aqc_dis_txqs { + uint8_t cmd_type; +#define ICE_AQC_Q_DIS_CMD_S 0 +#define ICE_AQC_Q_DIS_CMD_M (0x3 << ICE_AQC_Q_DIS_CMD_S) +#define ICE_AQC_Q_DIS_CMD_NO_FUNC_RESET (0 << ICE_AQC_Q_DIS_CMD_S) +#define ICE_AQC_Q_DIS_CMD_VM_RESET BIT(ICE_AQC_Q_DIS_CMD_S) +#define ICE_AQC_Q_DIS_CMD_VF_RESET (2 << ICE_AQC_Q_DIS_CMD_S) +#define ICE_AQC_Q_DIS_CMD_PF_RESET (3 << ICE_AQC_Q_DIS_CMD_S) +#define ICE_AQC_Q_DIS_CMD_SUBSEQ_CALL BIT(2) +#define ICE_AQC_Q_DIS_CMD_FLUSH_PIPE BIT(3) + uint8_t num_entries; + uint16_t vmvf_and_timeout; +#define ICE_AQC_Q_DIS_VMVF_NUM_S 0 +#define ICE_AQC_Q_DIS_VMVF_NUM_M (0x3FF << ICE_AQC_Q_DIS_VMVF_NUM_S) +#define ICE_AQC_Q_DIS_TIMEOUT_S 10 +#define ICE_AQC_Q_DIS_TIMEOUT_M (0x3F << ICE_AQC_Q_DIS_TIMEOUT_S) + uint32_t blocked_cgds; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* The buffer for Disable Tx LAN Queues (indirect 0x0C31) + * contains the following structures, arrayed one after the + * other. + * Note: Since the q_id is 16 bits wide, if the + * number of queues is even, then 2 bytes of alignment MUST be + * added before the start of the next group, to allow correct + * alignment of the parent_teid field. + */ +struct ice_aqc_dis_txq_item { + uint32_t parent_teid; + uint8_t num_qs; + uint8_t rsvd; + /* The length of the q_id array varies according to num_qs */ +#define ICE_AQC_Q_DIS_BUF_ELEM_TYPE_S 15 +#define ICE_AQC_Q_DIS_BUF_ELEM_TYPE_LAN_Q \ + (0 << ICE_AQC_Q_DIS_BUF_ELEM_TYPE_S) +#define ICE_AQC_Q_DIS_BUF_ELEM_TYPE_RDMA_QSET \ + (1 << ICE_AQC_Q_DIS_BUF_ELEM_TYPE_S) + uint16_t q_id[STRUCT_HACK_VAR_LEN]; +} __packed; + +/* Tx LAN Queues Cleanup Event (0x0C31) */ +struct ice_aqc_txqs_cleanup { + uint16_t caller_opc; + uint16_t cmd_tag; + uint8_t reserved[12]; +}; + +/* Move / Reconfigure Tx Queues (indirect 0x0C32) */ +struct ice_aqc_move_txqs { + uint8_t cmd_type; +#define ICE_AQC_Q_CMD_TYPE_S 0 +#define ICE_AQC_Q_CMD_TYPE_M (0x3 << ICE_AQC_Q_CMD_TYPE_S) +#define ICE_AQC_Q_CMD_TYPE_MOVE 1 +#define ICE_AQC_Q_CMD_TYPE_TC_CHANGE 2 +#define ICE_AQC_Q_CMD_TYPE_MOVE_AND_TC 3 +#define ICE_AQC_Q_CMD_SUBSEQ_CALL BIT(2) +#define ICE_AQC_Q_CMD_FLUSH_PIPE BIT(3) + uint8_t num_qs; + uint8_t rsvd; + uint8_t timeout; +#define ICE_AQC_Q_CMD_TIMEOUT_S 2 +#define ICE_AQC_Q_CMD_TIMEOUT_M (0x3F << ICE_AQC_Q_CMD_TIMEOUT_S) + uint32_t blocked_cgds; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Per-queue data buffer for the Move Tx LAN Queues command/response */ +struct ice_aqc_move_txqs_elem { + uint16_t txq_id; + uint8_t q_cgd; + uint8_t rsvd; + uint32_t q_teid; +}; + +/* Indirect data buffer for the Move Tx LAN Queues command/response */ +struct ice_aqc_move_txqs_data { + uint32_t src_teid; + uint32_t dest_teid; + struct ice_aqc_move_txqs_elem txqs[STRUCT_HACK_VAR_LEN]; +}; + +/* Add Tx RDMA Queue Set (indirect 0x0C33) */ +struct ice_aqc_add_rdma_qset { + uint8_t num_qset_grps; + uint8_t reserved[7]; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* This is the descriptor of each qset entry for the Add Tx RDMA Queue Set + * command (0x0C33). Only used within struct ice_aqc_add_rdma_qset. + */ +struct ice_aqc_add_tx_rdma_qset_entry { + uint16_t tx_qset_id; + uint8_t rsvd[2]; + uint32_t qset_teid; + struct ice_aqc_txsched_elem info; +}; + +/* The format of the command buffer for Add Tx RDMA Queue Set(0x0C33) + * is an array of the following structs. Please note that the length of + * each struct ice_aqc_add_rdma_qset is variable due to the variable + * number of queues in each group! + */ +struct ice_aqc_add_rdma_qset_data { + uint32_t parent_teid; + uint16_t num_qsets; + uint8_t rsvd[2]; + struct ice_aqc_add_tx_rdma_qset_entry rdma_qsets[STRUCT_HACK_VAR_LEN]; +}; + +/* Move RDMA Queue Set (indirect 0x0C34) */ +struct ice_aqc_move_rdma_qset_cmd { + uint8_t num_rdma_qset; /* Used by commands and response */ +#define ICE_AQC_PF_MODE_SAME_PF 0x0 +#define ICE_AQC_PF_MODE_GIVE_OWNERSHIP 0x1 +#define ICE_AQC_PF_MODE_KEEP_OWNERSHIP 0x2 + uint8_t flags; + uint8_t reserved[6]; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Buffer */ +struct ice_aqc_move_rdma_qset_buffer_desc { + uint16_t tx_qset_id; + uint16_t qset_teid; +}; + +struct ice_aqc_move_rdma_qset_buffer { + uint32_t src_parent_teid; + uint32_t dest_parent_teid; + struct ice_aqc_move_rdma_qset_buffer_desc descs[STRUCT_HACK_VAR_LEN]; +}; + +/* Download Package (indirect 0x0C40) */ +/* Also used for Update Package (indirect 0x0C41 and 0x0C42) */ +struct ice_aqc_download_pkg { + uint8_t flags; +#define ICE_AQC_DOWNLOAD_PKG_LAST_BUF 0x01 + uint8_t reserved[3]; + uint32_t reserved1; + uint32_t addr_high; + uint32_t addr_low; +}; + +struct ice_aqc_download_pkg_resp { + uint32_t error_offset; + uint32_t error_info; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Get Package Info List (indirect 0x0C43) */ +struct ice_aqc_get_pkg_info_list { + uint32_t reserved1; + uint32_t reserved2; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Version format for packages */ +struct ice_pkg_ver { + uint8_t major; + uint8_t minor; + uint8_t update; + uint8_t draft; +}; + +#define ICE_PKG_NAME_SIZE 32 +#define ICE_SEG_ID_SIZE 28 +#define ICE_SEG_NAME_SIZE 28 + +struct ice_aqc_get_pkg_info { + struct ice_pkg_ver ver; + char name[ICE_SEG_NAME_SIZE]; + uint32_t track_id; + uint8_t is_in_nvm; + uint8_t is_active; + uint8_t is_active_at_boot; + uint8_t is_modified; +}; + +/* Get Package Info List response buffer format (0x0C43) */ +struct ice_aqc_get_pkg_info_resp { + uint32_t count; + struct ice_aqc_get_pkg_info pkg_info[STRUCT_HACK_VAR_LEN]; +}; + +/* Driver Shared Parameters (direct, 0x0C90) */ +struct ice_aqc_driver_shared_params { + uint8_t set_or_get_op; +#define ICE_AQC_DRIVER_PARAM_OP_MASK BIT(0) +#define ICE_AQC_DRIVER_PARAM_SET ((uint8_t)0) +#define ICE_AQC_DRIVER_PARAM_GET ((uint8_t)1) + uint8_t param_indx; +#define ICE_AQC_DRIVER_PARAM_MAX_IDX 15 + uint8_t rsvd[2]; + uint32_t param_val; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Lan Queue Overflow Event (direct, 0x1001) */ +struct ice_aqc_event_lan_overflow { + uint32_t prtdcb_ruptq; + uint32_t qtx_ctl; + uint8_t reserved[8]; +}; + +/* Debug Dump Internal Data (indirect 0xFF08) */ +struct ice_aqc_debug_dump_internals { + uint16_t cluster_id; /* Expresses next cluster ID in response */ +#define ICE_AQC_DBG_DUMP_CLUSTER_ID_SW 0 +#define ICE_AQC_DBG_DUMP_CLUSTER_ID_TXSCHED 2 +#define ICE_AQC_DBG_DUMP_CLUSTER_ID_PROFILES 3 +/* EMP_DRAM only dumpable in device debug mode */ +#define ICE_AQC_DBG_DUMP_CLUSTER_ID_EMP_DRAM 4 +#define ICE_AQC_DBG_DUMP_CLUSTER_ID_LINK 5 +/* AUX_REGS only dumpable in device debug mode */ +#define ICE_AQC_DBG_DUMP_CLUSTER_ID_AUX_REGS 6 +#define ICE_AQC_DBG_DUMP_CLUSTER_ID_DCB 7 +#define ICE_AQC_DBG_DUMP_CLUSTER_ID_L2P 8 +#define ICE_AQC_DBG_DUMP_CLUSTER_ID_QUEUE_MNG 9 +#define ICE_AQC_DBG_DUMP_CLUSTER_ID_FULL_CSR_SPACE 21 +#define ICE_AQC_DBG_DUMP_CLUSTER_ID_MNG_TRANSACTIONS 22 + uint16_t table_id; /* Used only for non-memory clusters */ + uint32_t idx; /* In table entries for tables, in bytes for memory */ + uint32_t addr_high; + uint32_t addr_low; +}; + +enum ice_aqc_fw_logging_mod { + ICE_AQC_FW_LOG_ID_GENERAL = 0, + ICE_AQC_FW_LOG_ID_CTRL, + ICE_AQC_FW_LOG_ID_LINK, + ICE_AQC_FW_LOG_ID_LINK_TOPO, + ICE_AQC_FW_LOG_ID_DNL, + ICE_AQC_FW_LOG_ID_I2C, + ICE_AQC_FW_LOG_ID_SDP, + ICE_AQC_FW_LOG_ID_MDIO, + ICE_AQC_FW_LOG_ID_ADMINQ, + ICE_AQC_FW_LOG_ID_HDMA, + ICE_AQC_FW_LOG_ID_LLDP, + ICE_AQC_FW_LOG_ID_DCBX, + ICE_AQC_FW_LOG_ID_DCB, + ICE_AQC_FW_LOG_ID_XLR, + ICE_AQC_FW_LOG_ID_NVM, + ICE_AQC_FW_LOG_ID_AUTH, + ICE_AQC_FW_LOG_ID_VPD, + ICE_AQC_FW_LOG_ID_IOSF, + ICE_AQC_FW_LOG_ID_PARSER, + ICE_AQC_FW_LOG_ID_SW, + ICE_AQC_FW_LOG_ID_SCHEDULER, + ICE_AQC_FW_LOG_ID_TXQ, + ICE_AQC_FW_LOG_ID_RSVD, + ICE_AQC_FW_LOG_ID_POST, + ICE_AQC_FW_LOG_ID_WATCHDOG, + ICE_AQC_FW_LOG_ID_TASK_DISPATCH, + ICE_AQC_FW_LOG_ID_MNG, + ICE_AQC_FW_LOG_ID_SYNCE, + ICE_AQC_FW_LOG_ID_HEALTH, + ICE_AQC_FW_LOG_ID_TSDRV, + ICE_AQC_FW_LOG_ID_PFREG, + ICE_AQC_FW_LOG_ID_MDLVER, + ICE_AQC_FW_LOG_ID_MAX, +}; + +/* Set Health Status (direct 0xFF20) */ +struct ice_aqc_set_health_status_config { + uint8_t event_source; +#define ICE_AQC_HEALTH_STATUS_SET_PF_SPECIFIC_MASK BIT(0) +#define ICE_AQC_HEALTH_STATUS_SET_ALL_PF_MASK BIT(1) +#define ICE_AQC_HEALTH_STATUS_SET_GLOBAL_MASK BIT(2) + uint8_t reserved[15]; +}; + +#define ICE_AQC_HEALTH_STATUS_ERR_UNKNOWN_MOD_STRICT 0x101 +#define ICE_AQC_HEALTH_STATUS_ERR_MOD_TYPE 0x102 +#define ICE_AQC_HEALTH_STATUS_ERR_MOD_QUAL 0x103 +#define ICE_AQC_HEALTH_STATUS_ERR_MOD_COMM 0x104 +#define ICE_AQC_HEALTH_STATUS_ERR_MOD_CONFLICT 0x105 +#define ICE_AQC_HEALTH_STATUS_ERR_MOD_NOT_PRESENT 0x106 +#define ICE_AQC_HEALTH_STATUS_INFO_MOD_UNDERUTILIZED 0x107 +#define ICE_AQC_HEALTH_STATUS_ERR_UNKNOWN_MOD_LENIENT 0x108 +#define ICE_AQC_HEALTH_STATUS_ERR_MOD_DIAGNOSTIC_FEATURE 0x109 +#define ICE_AQC_HEALTH_STATUS_ERR_INVALID_LINK_CFG 0x10B +#define ICE_AQC_HEALTH_STATUS_ERR_PORT_ACCESS 0x10C +#define ICE_AQC_HEALTH_STATUS_ERR_PORT_UNREACHABLE 0x10D +#define ICE_AQC_HEALTH_STATUS_INFO_PORT_SPEED_MOD_LIMITED 0x10F +#define ICE_AQC_HEALTH_STATUS_ERR_PARALLEL_FAULT 0x110 +#define ICE_AQC_HEALTH_STATUS_INFO_PORT_SPEED_PHY_LIMITED 0x111 +#define ICE_AQC_HEALTH_STATUS_ERR_NETLIST_TOPO 0x112 +#define ICE_AQC_HEALTH_STATUS_ERR_NETLIST 0x113 +#define ICE_AQC_HEALTH_STATUS_ERR_TOPO_CONFLICT 0x114 +#define ICE_AQC_HEALTH_STATUS_ERR_LINK_HW_ACCESS 0x115 +#define ICE_AQC_HEALTH_STATUS_ERR_LINK_RUNTIME 0x116 +#define ICE_AQC_HEALTH_STATUS_ERR_DNL_INIT 0x117 +#define ICE_AQC_HEALTH_STATUS_ERR_PHY_NVM_PROG 0x120 +#define ICE_AQC_HEALTH_STATUS_ERR_PHY_FW_LOAD 0x121 +#define ICE_AQC_HEALTH_STATUS_INFO_RECOVERY 0x500 +#define ICE_AQC_HEALTH_STATUS_ERR_FLASH_ACCESS 0x501 +#define ICE_AQC_HEALTH_STATUS_ERR_NVM_AUTH 0x502 +#define ICE_AQC_HEALTH_STATUS_ERR_OROM_AUTH 0x503 +#define ICE_AQC_HEALTH_STATUS_ERR_DDP_AUTH 0x504 +#define ICE_AQC_HEALTH_STATUS_ERR_NVM_COMPAT 0x505 +#define ICE_AQC_HEALTH_STATUS_ERR_OROM_COMPAT 0x506 +#define ICE_AQC_HEALTH_STATUS_ERR_NVM_SEC_VIOLATION 0x507 +#define ICE_AQC_HEALTH_STATUS_ERR_OROM_SEC_VIOLATION 0x508 +#define ICE_AQC_HEALTH_STATUS_ERR_DCB_MIB 0x509 +#define ICE_AQC_HEALTH_STATUS_ERR_MNG_TIMEOUT 0x50A +#define ICE_AQC_HEALTH_STATUS_ERR_BMC_RESET 0x50B +#define ICE_AQC_HEALTH_STATUS_ERR_LAST_MNG_FAIL 0x50C +#define ICE_AQC_HEALTH_STATUS_ERR_RESOURCE_ALLOC_FAIL 0x50D +#define ICE_AQC_HEALTH_STATUS_ERR_FW_LOOP 0x1000 +#define ICE_AQC_HEALTH_STATUS_ERR_FW_PFR_FAIL 0x1001 +#define ICE_AQC_HEALTH_STATUS_ERR_LAST_FAIL_AQ 0x1002 + +/* Get Health Status codes (indirect 0xFF21) */ +struct ice_aqc_get_supported_health_status_codes { + uint16_t health_code_count; + uint8_t reserved[6]; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Get Health Status (indirect 0xFF22) */ +struct ice_aqc_get_health_status { + uint16_t health_status_count; + uint8_t reserved[6]; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Get Health Status event buffer entry, (0xFF22) + * repeated per reported health status + */ +struct ice_aqc_health_status_elem { + uint16_t health_status_code; + uint16_t event_source; +#define ICE_AQC_HEALTH_STATUS_PF (0x1) +#define ICE_AQC_HEALTH_STATUS_PORT (0x2) +#define ICE_AQC_HEALTH_STATUS_GLOBAL (0x3) + uint32_t internal_data1; +#define ICE_AQC_HEALTH_STATUS_UNDEFINED_DATA (0xDEADBEEF) + uint32_t internal_data2; +}; + +/* Clear Health Status (direct 0xFF23) */ +struct ice_aqc_clear_health_status { + uint32_t reserved[4]; +}; + +/* Set FW Logging configuration (indirect 0xFF30) + * Register for FW Logging (indirect 0xFF31) + * Query FW Logging (indirect 0xFF32) + * FW Log Event (indirect 0xFF33) + * Get FW Log (indirect 0xFF34) + * Clear FW Log (indirect 0xFF35) + */ +struct ice_aqc_fw_log { + uint8_t cmd_flags; +#define ICE_AQC_FW_LOG_CONF_UART_EN BIT(0) +#define ICE_AQC_FW_LOG_CONF_AQ_EN BIT(1) +#define ICE_AQC_FW_LOG_QUERY_REGISTERED BIT(2) +#define ICE_AQC_FW_LOG_CONF_SET_VALID BIT(3) +#define ICE_AQC_FW_LOG_AQ_REGISTER BIT(0) +#define ICE_AQC_FW_LOG_AQ_QUERY BIT(2) +#define ICE_AQC_FW_LOG_PERSISTENT BIT(0) + uint8_t rsp_flag; +#define ICE_AQC_FW_LOG_MORE_DATA BIT(1) + uint16_t fw_rt_msb; + union { + struct { + uint32_t fw_rt_lsb; + } sync; + struct { + uint16_t log_resolution; +#define ICE_AQC_FW_LOG_MIN_RESOLUTION (1) +#define ICE_AQC_FW_LOG_MAX_RESOLUTION (128) + uint16_t mdl_cnt; + } cfg; + } ops; + uint32_t addr_high; + uint32_t addr_low; +}; + +/* Response Buffer for: + * Set Firmware Logging Configuration (0xFF30) + * Query FW Logging (0xFF32) + */ +struct ice_aqc_fw_log_cfg_resp { + uint16_t module_identifier; + uint8_t log_level; + uint8_t rsvd0; +}; + +struct ice_aq_get_set_rss_lut_params { + uint16_t vsi_handle; /* software VSI handle */ + uint16_t lut_size; /* size of the LUT buffer */ + uint8_t lut_type; /* type of the LUT (i.e. VSI, PF, Global) */ + uint8_t *lut; /* input RSS LUT for set / output for get */ + uint8_t global_lut_id; /* only valid when lut_type is global */ +}; + +/** + * struct ice_aq_desc - Admin Queue (AQ) descriptor + * @flags: ICE_AQ_FLAG_* flags + * @opcode: AQ command opcode + * @datalen: length in bytes of indirect/external data buffer + * @retval: return value from firmware + * @cookie_high: opaque data high-half + * @cookie_low: opaque data low-half + * @params: command-specific parameters + * + * Descriptor format for commands the driver posts on the Admin Transmit Queue + * (ATQ). The firmware writes back onto the command descriptor and returns + * the result of the command. Asynchronous events that are not an immediate + * result of the command are written to the Admin Receive Queue (ARQ) using + * the same descriptor format. Descriptors are in little-endian notation with + * 32-bit words. + */ +struct ice_aq_desc { + uint16_t flags; + uint16_t opcode; + uint16_t datalen; + uint16_t retval; + uint32_t cookie_high; + uint32_t cookie_low; + union { + uint8_t raw[16]; + struct ice_aqc_generic generic; + struct ice_aqc_get_ver get_ver; + struct ice_aqc_driver_ver driver_ver; + struct ice_aqc_q_shutdown q_shutdown; + struct ice_aqc_get_exp_err exp_err; + struct ice_aqc_req_res res_owner; + struct ice_aqc_manage_mac_read mac_read; + struct ice_aqc_manage_mac_write mac_write; + struct ice_aqc_clear_pxe clear_pxe; + struct ice_aqc_config_no_drop_policy no_drop; + struct ice_aqc_add_update_mir_rule add_update_rule; + struct ice_aqc_delete_mir_rule del_rule; + struct ice_aqc_list_caps get_cap; + struct ice_aqc_get_phy_caps get_phy; + struct ice_aqc_set_phy_cfg set_phy; + struct ice_aqc_restart_an restart_an; + struct ice_aqc_get_sensor_reading get_sensor_reading; + struct ice_aqc_get_sensor_reading_resp get_sensor_reading_resp; + struct ice_aqc_dnl_get_status get_status; + struct ice_aqc_dnl_run_command dnl_run; + struct ice_aqc_dnl_call_command dnl_call; + struct ice_aqc_dnl_read_write_command dnl_read_write; + struct ice_aqc_dnl_read_write_response dnl_read_write_resp; + struct ice_aqc_dnl_set_breakpoints_command dnl_set_brk; + struct ice_aqc_dnl_read_log_command dnl_read_log; + struct ice_aqc_dnl_read_log_response dnl_read_log_resp; + struct ice_aqc_i2c read_write_i2c; + struct ice_aqc_read_i2c_resp read_i2c_resp; + struct ice_aqc_mdio read_write_mdio; + struct ice_aqc_gpio_by_func read_write_gpio_by_func; + struct ice_aqc_gpio read_write_gpio; + struct ice_aqc_sw_gpio sw_read_write_gpio; + struct ice_aqc_set_led set_led; + struct ice_aqc_mdio read_mdio; + struct ice_aqc_mdio write_mdio; + struct ice_aqc_sff_eeprom read_write_sff_param; + struct ice_aqc_set_port_id_led set_port_id_led; + struct ice_aqc_get_port_options get_port_options; + struct ice_aqc_set_port_option set_port_option; + struct ice_aqc_get_sw_cfg get_sw_conf; + struct ice_aqc_set_port_params set_port_params; + struct ice_aqc_sw_rules sw_rules; + struct ice_aqc_storm_cfg storm_conf; + struct ice_aqc_get_topo get_topo; + struct ice_aqc_sched_elem_cmd sched_elem_cmd; + struct ice_aqc_query_txsched_res query_sched_res; + struct ice_aqc_query_node_to_root query_node_to_root; + struct ice_aqc_cfg_l2_node_cgd cfg_l2_node_cgd; + struct ice_aqc_query_port_ets port_ets; + struct ice_aqc_rl_profile rl_profile; + struct ice_aqc_node_attr node_attr; + struct ice_aqc_nvm nvm; + struct ice_aqc_nvm_cfg nvm_cfg; + struct ice_aqc_nvm_checksum nvm_checksum; + struct ice_aqc_pf_vf_msg virt; + struct ice_aqc_read_write_alt_direct read_write_alt_direct; + struct ice_aqc_read_write_alt_indirect read_write_alt_indirect; + struct ice_aqc_done_alt_write done_alt_write; + struct ice_aqc_clear_port_alt_write clear_port_alt_write; + struct ice_aqc_pfc_ignore pfc_ignore; + struct ice_aqc_set_query_pfc_mode set_query_pfc_mode; + struct ice_aqc_set_dcb_params set_dcb_params; + struct ice_aqc_lldp_get_mib lldp_get_mib; + struct ice_aqc_lldp_set_mib_change lldp_set_event; + struct ice_aqc_lldp_add_delete_tlv lldp_add_delete_tlv; + struct ice_aqc_lldp_update_tlv lldp_update_tlv; + struct ice_aqc_lldp_stop lldp_stop; + struct ice_aqc_lldp_start lldp_start; + struct ice_aqc_lldp_set_local_mib lldp_set_mib; + struct ice_aqc_lldp_stop_start_specific_agent lldp_agent_ctrl; + struct ice_aqc_lldp_filter_ctrl lldp_filter_ctrl; + struct ice_aqc_get_set_rss_lut get_set_rss_lut; + struct ice_aqc_get_set_rss_key get_set_rss_key; + struct ice_aqc_add_txqs add_txqs; + struct ice_aqc_dis_txqs dis_txqs; + struct ice_aqc_move_txqs move_txqs; + struct ice_aqc_add_rdma_qset add_rdma_qset; + struct ice_aqc_move_rdma_qset_cmd move_rdma_qset; + struct ice_aqc_txqs_cleanup txqs_cleanup; + struct ice_aqc_add_get_update_free_vsi vsi_cmd; + struct ice_aqc_add_update_free_vsi_resp add_update_free_vsi_res; + struct ice_aqc_get_vsi_resp get_vsi_resp; + struct ice_aqc_download_pkg download_pkg; + struct ice_aqc_get_pkg_info_list get_pkg_info_list; + struct ice_aqc_driver_shared_params drv_shared_params; + struct ice_aqc_fw_log fw_log; + struct ice_aqc_debug_dump_internals debug_dump; + struct ice_aqc_set_mac_lb set_mac_lb; + struct ice_aqc_alloc_free_res_cmd sw_res_ctrl; + struct ice_aqc_get_res_alloc get_res; + struct ice_aqc_get_allocd_res_desc get_res_desc; + struct ice_aqc_set_mac_cfg set_mac_cfg; + struct ice_aqc_set_event_mask set_event_mask; + struct ice_aqc_get_link_status get_link_status; + struct ice_aqc_event_lan_overflow lan_overflow; + struct ice_aqc_get_link_topo get_link_topo; + struct ice_aqc_set_health_status_config + set_health_status_config; + struct ice_aqc_get_supported_health_status_codes + get_supported_health_status_codes; + struct ice_aqc_get_health_status get_health_status; + struct ice_aqc_clear_health_status clear_health_status; + struct ice_aqc_prog_topo_dev_nvm prog_topo_dev_nvm; + struct ice_aqc_read_topo_dev_nvm read_topo_dev_nvm; + struct ice_aqc_get_set_tx_topo get_set_tx_topo; + } params; +}; + +/* FW defined boundary for a large buffer, 4k >= Large buffer > 512 bytes */ +#define ICE_AQ_LG_BUF 512 + +/* Flags sub-structure + * |0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |10 |11 |12 |13 |14 |15 | + * |DD |CMP|ERR|VFE| * * RESERVED * * |LB |RD |VFC|BUF|SI |EI |FE | + */ + +/* command flags and offsets */ +#define ICE_AQ_FLAG_DD_S 0 +#define ICE_AQ_FLAG_CMP_S 1 +#define ICE_AQ_FLAG_ERR_S 2 +#define ICE_AQ_FLAG_VFE_S 3 +#define ICE_AQ_FLAG_LB_S 9 +#define ICE_AQ_FLAG_RD_S 10 +#define ICE_AQ_FLAG_VFC_S 11 +#define ICE_AQ_FLAG_BUF_S 12 +#define ICE_AQ_FLAG_SI_S 13 +#define ICE_AQ_FLAG_EI_S 14 +#define ICE_AQ_FLAG_FE_S 15 + +#define ICE_AQ_FLAG_DD BIT(ICE_AQ_FLAG_DD_S) /* 0x1 */ +#define ICE_AQ_FLAG_CMP BIT(ICE_AQ_FLAG_CMP_S) /* 0x2 */ +#define ICE_AQ_FLAG_ERR BIT(ICE_AQ_FLAG_ERR_S) /* 0x4 */ +#define ICE_AQ_FLAG_VFE BIT(ICE_AQ_FLAG_VFE_S) /* 0x8 */ +#define ICE_AQ_FLAG_LB BIT(ICE_AQ_FLAG_LB_S) /* 0x200 */ +#define ICE_AQ_FLAG_RD BIT(ICE_AQ_FLAG_RD_S) /* 0x400 */ +#define ICE_AQ_FLAG_VFC BIT(ICE_AQ_FLAG_VFC_S) /* 0x800 */ +#define ICE_AQ_FLAG_BUF BIT(ICE_AQ_FLAG_BUF_S) /* 0x1000 */ +#define ICE_AQ_FLAG_SI BIT(ICE_AQ_FLAG_SI_S) /* 0x2000 */ +#define ICE_AQ_FLAG_EI BIT(ICE_AQ_FLAG_EI_S) /* 0x4000 */ +#define ICE_AQ_FLAG_FE BIT(ICE_AQ_FLAG_FE_S) /* 0x8000 */ + +/* error codes */ +enum ice_aq_err { + ICE_AQ_RC_OK = 0, /* Success */ + ICE_AQ_RC_EPERM = 1, /* Operation not permitted */ + ICE_AQ_RC_ENOENT = 2, /* No such element */ + ICE_AQ_RC_ESRCH = 3, /* Bad opcode */ + ICE_AQ_RC_EINTR = 4, /* Operation interrupted */ + ICE_AQ_RC_EIO = 5, /* I/O error */ + ICE_AQ_RC_ENXIO = 6, /* No such resource */ + ICE_AQ_RC_E2BIG = 7, /* Arg too long */ + ICE_AQ_RC_EAGAIN = 8, /* Try again */ + ICE_AQ_RC_ENOMEM = 9, /* Out of memory */ + ICE_AQ_RC_EACCES = 10, /* Permission denied */ + ICE_AQ_RC_EFAULT = 11, /* Bad address */ + ICE_AQ_RC_EBUSY = 12, /* Device or resource busy */ + ICE_AQ_RC_EEXIST = 13, /* Object already exists */ + ICE_AQ_RC_EINVAL = 14, /* Invalid argument */ + ICE_AQ_RC_ENOTTY = 15, /* Not a typewriter */ + ICE_AQ_RC_ENOSPC = 16, /* No space left or allocation failure */ + ICE_AQ_RC_ENOSYS = 17, /* Function not implemented */ + ICE_AQ_RC_ERANGE = 18, /* Parameter out of range */ + ICE_AQ_RC_EFLUSHED = 19, /* Cmd flushed due to prev cmd error */ + ICE_AQ_RC_BAD_ADDR = 20, /* Descriptor contains a bad pointer */ + ICE_AQ_RC_EMODE = 21, /* Op not allowed in current dev mode */ + ICE_AQ_RC_EFBIG = 22, /* File too big */ + ICE_AQ_RC_ESBCOMP = 23, /* SB-IOSF completion unsuccessful */ + ICE_AQ_RC_ENOSEC = 24, /* Missing security manifest */ + ICE_AQ_RC_EBADSIG = 25, /* Bad RSA signature */ + ICE_AQ_RC_ESVN = 26, /* SVN number prohibits this package */ + ICE_AQ_RC_EBADMAN = 27, /* Manifest hash mismatch */ + ICE_AQ_RC_EBADBUF = 28, /* Buffer hash mismatches manifest */ + ICE_AQ_RC_EACCES_BMCU = 29, /* BMC Update in progress */ +}; + +/* Admin Queue command opcodes */ +enum ice_adminq_opc { + /* AQ commands */ + ice_aqc_opc_get_ver = 0x0001, + ice_aqc_opc_driver_ver = 0x0002, + ice_aqc_opc_q_shutdown = 0x0003, + ice_aqc_opc_get_exp_err = 0x0005, + + /* resource ownership */ + ice_aqc_opc_req_res = 0x0008, + ice_aqc_opc_release_res = 0x0009, + + /* device/function capabilities */ + ice_aqc_opc_list_func_caps = 0x000A, + ice_aqc_opc_list_dev_caps = 0x000B, + + /* manage MAC address */ + ice_aqc_opc_manage_mac_read = 0x0107, + ice_aqc_opc_manage_mac_write = 0x0108, + + /* PXE */ + ice_aqc_opc_clear_pxe_mode = 0x0110, + + ice_aqc_opc_config_no_drop_policy = 0x0112, + + /* internal switch commands */ + ice_aqc_opc_get_sw_cfg = 0x0200, + ice_aqc_opc_set_port_params = 0x0203, + + /* Alloc/Free/Get Resources */ + ice_aqc_opc_get_res_alloc = 0x0204, + ice_aqc_opc_alloc_res = 0x0208, + ice_aqc_opc_free_res = 0x0209, + ice_aqc_opc_get_allocd_res_desc = 0x020A, + ice_aqc_opc_set_vlan_mode_parameters = 0x020C, + ice_aqc_opc_get_vlan_mode_parameters = 0x020D, + + /* VSI commands */ + ice_aqc_opc_add_vsi = 0x0210, + ice_aqc_opc_update_vsi = 0x0211, + ice_aqc_opc_get_vsi_params = 0x0212, + ice_aqc_opc_free_vsi = 0x0213, + + /* Mirroring rules - add/update, delete */ + ice_aqc_opc_add_update_mir_rule = 0x0260, + ice_aqc_opc_del_mir_rule = 0x0261, + + /* storm configuration */ + ice_aqc_opc_set_storm_cfg = 0x0280, + ice_aqc_opc_get_storm_cfg = 0x0281, + + /* switch rules population commands */ + ice_aqc_opc_add_sw_rules = 0x02A0, + ice_aqc_opc_update_sw_rules = 0x02A1, + ice_aqc_opc_remove_sw_rules = 0x02A2, + ice_aqc_opc_get_sw_rules = 0x02A3, + ice_aqc_opc_clear_pf_cfg = 0x02A4, + + /* DCB commands */ + ice_aqc_opc_pfc_ignore = 0x0301, + ice_aqc_opc_query_pfc_mode = 0x0302, + ice_aqc_opc_set_pfc_mode = 0x0303, + ice_aqc_opc_set_dcb_params = 0x0306, + + /* transmit scheduler commands */ + ice_aqc_opc_get_dflt_topo = 0x0400, + ice_aqc_opc_add_sched_elems = 0x0401, + ice_aqc_opc_cfg_sched_elems = 0x0403, + ice_aqc_opc_get_sched_elems = 0x0404, + ice_aqc_opc_move_sched_elems = 0x0408, + ice_aqc_opc_suspend_sched_elems = 0x0409, + ice_aqc_opc_resume_sched_elems = 0x040A, + ice_aqc_opc_query_port_ets = 0x040E, + ice_aqc_opc_delete_sched_elems = 0x040F, + ice_aqc_opc_add_rl_profiles = 0x0410, + ice_aqc_opc_query_rl_profiles = 0x0411, + ice_aqc_opc_query_sched_res = 0x0412, + ice_aqc_opc_query_node_to_root = 0x0413, + ice_aqc_opc_cfg_l2_node_cgd = 0x0414, + ice_aqc_opc_remove_rl_profiles = 0x0415, + ice_aqc_opc_set_tx_topo = 0x0417, + ice_aqc_opc_get_tx_topo = 0x0418, + ice_aqc_opc_cfg_node_attr = 0x0419, + ice_aqc_opc_query_node_attr = 0x041A, + + /* PHY commands */ + ice_aqc_opc_get_phy_caps = 0x0600, + ice_aqc_opc_set_phy_cfg = 0x0601, + ice_aqc_opc_set_mac_cfg = 0x0603, + ice_aqc_opc_restart_an = 0x0605, + ice_aqc_opc_get_link_status = 0x0607, + ice_aqc_opc_set_event_mask = 0x0613, + ice_aqc_opc_set_mac_lb = 0x0620, + ice_aqc_opc_get_sensor_reading = 0x0632, + ice_aqc_opc_dnl_get_status = 0x0680, + ice_aqc_opc_dnl_run = 0x0681, + ice_aqc_opc_dnl_call = 0x0682, + ice_aqc_opc_dnl_read_sto = 0x0683, + ice_aqc_opc_dnl_write_sto = 0x0684, + ice_aqc_opc_dnl_set_breakpoints = 0x0686, + ice_aqc_opc_dnl_read_log = 0x0687, + ice_aqc_opc_get_link_topo = 0x06E0, + ice_aqc_opc_read_i2c = 0x06E2, + ice_aqc_opc_write_i2c = 0x06E3, + ice_aqc_opc_read_mdio = 0x06E4, + ice_aqc_opc_write_mdio = 0x06E5, + ice_aqc_opc_set_gpio_by_func = 0x06E6, + ice_aqc_opc_get_gpio_by_func = 0x06E7, + ice_aqc_opc_set_led = 0x06E8, + ice_aqc_opc_set_port_id_led = 0x06E9, + ice_aqc_opc_get_port_options = 0x06EA, + ice_aqc_opc_set_port_option = 0x06EB, + ice_aqc_opc_set_gpio = 0x06EC, + ice_aqc_opc_get_gpio = 0x06ED, + ice_aqc_opc_sff_eeprom = 0x06EE, + ice_aqc_opc_sw_set_gpio = 0x06EF, + ice_aqc_opc_sw_get_gpio = 0x06F0, + ice_aqc_opc_prog_topo_dev_nvm = 0x06F2, + ice_aqc_opc_read_topo_dev_nvm = 0x06F3, + + /* NVM commands */ + ice_aqc_opc_nvm_read = 0x0701, + ice_aqc_opc_nvm_erase = 0x0702, + ice_aqc_opc_nvm_write = 0x0703, + ice_aqc_opc_nvm_cfg_read = 0x0704, + ice_aqc_opc_nvm_cfg_write = 0x0705, + ice_aqc_opc_nvm_checksum = 0x0706, + ice_aqc_opc_nvm_write_activate = 0x0707, + ice_aqc_opc_nvm_sr_dump = 0x0707, + ice_aqc_opc_nvm_save_factory_settings = 0x0708, + ice_aqc_opc_nvm_update_empr = 0x0709, + ice_aqc_opc_nvm_pkg_data = 0x070A, + ice_aqc_opc_nvm_pass_component_tbl = 0x070B, + + /* PF/VF mailbox commands */ + ice_mbx_opc_send_msg_to_pf = 0x0801, + ice_mbx_opc_send_msg_to_vf = 0x0802, + /* Alternate Structure Commands */ + ice_aqc_opc_write_alt_direct = 0x0900, + ice_aqc_opc_write_alt_indirect = 0x0901, + ice_aqc_opc_read_alt_direct = 0x0902, + ice_aqc_opc_read_alt_indirect = 0x0903, + ice_aqc_opc_done_alt_write = 0x0904, + ice_aqc_opc_clear_port_alt_write = 0x0906, + /* LLDP commands */ + ice_aqc_opc_lldp_get_mib = 0x0A00, + ice_aqc_opc_lldp_set_mib_change = 0x0A01, + ice_aqc_opc_lldp_add_tlv = 0x0A02, + ice_aqc_opc_lldp_update_tlv = 0x0A03, + ice_aqc_opc_lldp_delete_tlv = 0x0A04, + ice_aqc_opc_lldp_stop = 0x0A05, + ice_aqc_opc_lldp_start = 0x0A06, + ice_aqc_opc_get_cee_dcb_cfg = 0x0A07, + ice_aqc_opc_lldp_set_local_mib = 0x0A08, + ice_aqc_opc_lldp_stop_start_specific_agent = 0x0A09, + ice_aqc_opc_lldp_filter_ctrl = 0x0A0A, + ice_execute_pending_lldp_mib = 0x0A0B, + + /* RSS commands */ + ice_aqc_opc_set_rss_key = 0x0B02, + ice_aqc_opc_set_rss_lut = 0x0B03, + ice_aqc_opc_get_rss_key = 0x0B04, + ice_aqc_opc_get_rss_lut = 0x0B05, + + /* Tx queue handling commands/events */ + ice_aqc_opc_add_txqs = 0x0C30, + ice_aqc_opc_dis_txqs = 0x0C31, + ice_aqc_opc_txqs_cleanup = 0x0C31, + ice_aqc_opc_move_recfg_txqs = 0x0C32, + ice_aqc_opc_add_rdma_qset = 0x0C33, + ice_aqc_opc_move_rdma_qset = 0x0C34, + + /* package commands */ + ice_aqc_opc_download_pkg = 0x0C40, + ice_aqc_opc_upload_section = 0x0C41, + ice_aqc_opc_update_pkg = 0x0C42, + ice_aqc_opc_get_pkg_info_list = 0x0C43, + + ice_aqc_opc_driver_shared_params = 0x0C90, + + /* Standalone Commands/Events */ + ice_aqc_opc_event_lan_overflow = 0x1001, + + /* debug commands */ + ice_aqc_opc_debug_dump_internals = 0xFF08, + + /* SystemDiagnostic commands */ + ice_aqc_opc_set_health_status_config = 0xFF20, + ice_aqc_opc_get_supported_health_status_codes = 0xFF21, + ice_aqc_opc_get_health_status = 0xFF22, + ice_aqc_opc_clear_health_status = 0xFF23, + + /* FW Logging Commands */ + ice_aqc_opc_fw_logs_config = 0xFF30, + ice_aqc_opc_fw_logs_register = 0xFF31, + ice_aqc_opc_fw_logs_query = 0xFF32, + ice_aqc_opc_fw_logs_event = 0xFF33, + ice_aqc_opc_fw_logs_get = 0xFF34, + ice_aqc_opc_fw_logs_clear = 0xFF35 +}; + +#endif /* _ICE_ADMINQ_CMD_H_ */ + +#ifndef _ICE_FWLOG_H_ +#define _ICE_FWLOG_H_ + +/* Only a single log level should be set and all log levels under the set value + * are enabled, e.g. if log level is set to ICE_FW_LOG_LEVEL_VERBOSE, then all + * other log levels are included (except ICE_FW_LOG_LEVEL_NONE) + */ +enum ice_fwlog_level { + ICE_FWLOG_LEVEL_NONE = 0, + ICE_FWLOG_LEVEL_ERROR = 1, + ICE_FWLOG_LEVEL_WARNING = 2, + ICE_FWLOG_LEVEL_NORMAL = 3, + ICE_FWLOG_LEVEL_VERBOSE = 4, + ICE_FWLOG_LEVEL_INVALID, /* all values >= this entry are invalid */ +}; + +struct ice_fwlog_module_entry { + /* module ID for the corresponding firmware logging event */ + uint16_t module_id; + /* verbosity level for the module_id */ + uint8_t log_level; +}; + +struct ice_fwlog_cfg { + /* list of modules for configuring log level */ + struct ice_fwlog_module_entry module_entries[ICE_AQC_FW_LOG_ID_MAX]; +#define ICE_FWLOG_OPTION_ARQ_ENA BIT(0) +#define ICE_FWLOG_OPTION_UART_ENA BIT(1) + /* set before calling ice_fwlog_init() so the PF registers for firmware + * logging on initialization + */ +#define ICE_FWLOG_OPTION_REGISTER_ON_INIT BIT(2) + /* set in the ice_fwlog_get() response if the PF is registered for FW + * logging events over ARQ + */ +#define ICE_FWLOG_OPTION_IS_REGISTERED BIT(3) + /* options used to configure firmware logging */ + uint16_t options; + /* minimum number of log events sent per Admin Receive Queue event */ + uint16_t log_resolution; +}; + +#endif /* _ICE_FWLOG_H_ */ + +#ifndef _ICE_NVM_H_ +#define _ICE_NVM_H_ + +#define ICE_NVM_CMD_READ 0x0000000B +#define ICE_NVM_CMD_WRITE 0x0000000C + +/* NVM Access config bits */ +#define ICE_NVM_CFG_MODULE_M MAKEMASK(0xFF, 0) +#define ICE_NVM_CFG_MODULE_S 0 +#define ICE_NVM_CFG_FLAGS_M MAKEMASK(0xF, 8) +#define ICE_NVM_CFG_FLAGS_S 8 +#define ICE_NVM_CFG_EXT_FLAGS_M MAKEMASK(0xF, 12) +#define ICE_NVM_CFG_EXT_FLAGS_S 12 +#define ICE_NVM_CFG_ADAPTER_INFO_M MAKEMASK(0xFFFF, 16) +#define ICE_NVM_CFG_ADAPTER_INFO_S 16 + +/* NVM Read Get Driver Features */ +#define ICE_NVM_GET_FEATURES_MODULE 0xE +#define ICE_NVM_GET_FEATURES_FLAGS 0xF + +/* NVM Read/Write Mapped Space */ +#define ICE_NVM_REG_RW_MODULE 0x0 +#define ICE_NVM_REG_RW_FLAGS 0x1 + +struct ice_orom_civd_info { + uint8_t signature[4]; /* Must match ASCII '$CIV' characters */ + uint8_t checksum; /* Simple modulo 256 sum of all structure bytes must equal 0 */ + uint32_t combo_ver; /* Combo Image Version number */ + uint8_t combo_name_len; /* Length of the unicode combo image version string, max of 32 */ + uint16_t combo_name[32]; /* Unicode string representing the Combo Image version */ +} __packed; + +#define ICE_NVM_ACCESS_MAJOR_VER 0 +#define ICE_NVM_ACCESS_MINOR_VER 5 + +/* NVM Access feature flags. Other bits in the features field are reserved and + * should be set to zero when reporting the ice_nvm_features structure. + */ +#define ICE_NVM_FEATURES_0_REG_ACCESS BIT(1) + +/* NVM Access Features */ +struct ice_nvm_features { + uint8_t major; /* Major version (informational only) */ + uint8_t minor; /* Minor version (informational only) */ + uint16_t size; /* size of ice_nvm_features structure */ + uint8_t features[12]; /* Array of feature bits */ +}; + +/* NVM Access command */ +struct ice_nvm_access_cmd { + uint32_t command; /* NVM command: READ or WRITE */ + uint32_t config; /* NVM command configuration */ + uint32_t offset; /* offset to read/write, in bytes */ + uint32_t data_size; /* size of data field, in bytes */ +}; + +/* NVM Access data */ +union ice_nvm_access_data { + uint32_t regval; /* Storage for register value */ + struct ice_nvm_features drv_features; /* NVM features */ +}; + +#endif /* _ICE_NVM_H_ */ + +/* Switch recipe ID enum values are specific to hardware */ +enum ice_sw_lkup_type { + ICE_SW_LKUP_ETHERTYPE = 0, + ICE_SW_LKUP_MAC = 1, + ICE_SW_LKUP_MAC_VLAN = 2, + ICE_SW_LKUP_PROMISC = 3, + ICE_SW_LKUP_VLAN = 4, + ICE_SW_LKUP_DFLT = 5, + ICE_SW_LKUP_ETHERTYPE_MAC = 8, + ICE_SW_LKUP_PROMISC_VLAN = 9, + ICE_SW_LKUP_LAST +}; + +#ifndef _ICE_LAN_TX_RX_H_ +#define _ICE_LAN_TX_RX_H_ + +/* Rx Descriptors */ +union ice_16byte_rx_desc { + struct { + uint64_t pkt_addr; /* Packet buffer address */ + uint64_t hdr_addr; /* Header buffer address */ + } read; + struct { + struct { + struct { + uint16_t mirroring_status; + uint16_t l2tag1; + } lo_dword; + union { + uint32_t rss; /* RSS Hash */ + uint32_t fd_id; /* Flow Director filter ID */ + } hi_dword; + } qword0; + struct { + /* ext status/error/PTYPE/length */ + uint64_t status_error_len; + } qword1; + } wb; /* writeback */ +}; + +union ice_32byte_rx_desc { + struct { + uint64_t pkt_addr; /* Packet buffer address */ + uint64_t hdr_addr; /* Header buffer address */ + /* bit 0 of hdr_addr is DD bit */ + uint64_t rsvd1; + uint64_t rsvd2; + } read; + struct { + struct { + struct { + uint16_t mirroring_status; + uint16_t l2tag1; + } lo_dword; + union { + uint32_t rss; /* RSS Hash */ + uint32_t fd_id; /* Flow Director filter ID */ + } hi_dword; + } qword0; + struct { + /* status/error/PTYPE/length */ + uint64_t status_error_len; + } qword1; + struct { + uint16_t ext_status; /* extended status */ + uint16_t rsvd; + uint16_t l2tag2_1; + uint16_t l2tag2_2; + } qword2; + struct { + uint32_t reserved; + uint32_t fd_id; + } qword3; + } wb; /* writeback */ +}; + +struct ice_fltr_desc { + uint64_t qidx_compq_space_stat; + uint64_t dtype_cmd_vsi_fdid; +}; + +#define ICE_FXD_FLTR_QW0_QINDEX_S 0 +#define ICE_FXD_FLTR_QW0_QINDEX_M (0x7FFULL << ICE_FXD_FLTR_QW0_QINDEX_S) +#define ICE_FXD_FLTR_QW0_COMP_Q_S 11 +#define ICE_FXD_FLTR_QW0_COMP_Q_M BIT_ULL(ICE_FXD_FLTR_QW0_COMP_Q_S) +#define ICE_FXD_FLTR_QW0_COMP_Q_ZERO 0x0ULL +#define ICE_FXD_FLTR_QW0_COMP_Q_QINDX 0x1ULL + +#define ICE_FXD_FLTR_QW0_COMP_REPORT_S 12 +#define ICE_FXD_FLTR_QW0_COMP_REPORT_M \ + (0x3ULL << ICE_FXD_FLTR_QW0_COMP_REPORT_S) +#define ICE_FXD_FLTR_QW0_COMP_REPORT_NONE 0x0ULL +#define ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL 0x1ULL +#define ICE_FXD_FLTR_QW0_COMP_REPORT_SW 0x2ULL + +#define ICE_FXD_FLTR_QW0_FD_SPACE_S 14 +#define ICE_FXD_FLTR_QW0_FD_SPACE_M (0x3ULL << ICE_FXD_FLTR_QW0_FD_SPACE_S) +#define ICE_FXD_FLTR_QW0_FD_SPACE_GUAR 0x0ULL +#define ICE_FXD_FLTR_QW0_FD_SPACE_BEST_EFFORT 0x1ULL +#define ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST 0x2ULL +#define ICE_FXD_FLTR_QW0_FD_SPACE_BEST_GUAR 0x3ULL + +#define ICE_FXD_FLTR_QW0_STAT_CNT_S 16 +#define ICE_FXD_FLTR_QW0_STAT_CNT_M \ + (0x1FFFULL << ICE_FXD_FLTR_QW0_STAT_CNT_S) +#define ICE_FXD_FLTR_QW0_STAT_ENA_S 29 +#define ICE_FXD_FLTR_QW0_STAT_ENA_M (0x3ULL << ICE_FXD_FLTR_QW0_STAT_ENA_S) +#define ICE_FXD_FLTR_QW0_STAT_ENA_NONE 0x0ULL +#define ICE_FXD_FLTR_QW0_STAT_ENA_PKTS 0x1ULL +#define ICE_FXD_FLTR_QW0_STAT_ENA_BYTES 0x2ULL +#define ICE_FXD_FLTR_QW0_STAT_ENA_PKTS_BYTES 0x3ULL + +#define ICE_FXD_FLTR_QW0_EVICT_ENA_S 31 +#define ICE_FXD_FLTR_QW0_EVICT_ENA_M BIT_ULL(ICE_FXD_FLTR_QW0_EVICT_ENA_S) +#define ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE 0x0ULL +#define ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE 0x1ULL + +#define ICE_FXD_FLTR_QW0_TO_Q_S 32 +#define ICE_FXD_FLTR_QW0_TO_Q_M (0x7ULL << ICE_FXD_FLTR_QW0_TO_Q_S) +#define ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX 0x0ULL + +#define ICE_FXD_FLTR_QW0_TO_Q_PRI_S 35 +#define ICE_FXD_FLTR_QW0_TO_Q_PRI_M (0x7ULL << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) +#define ICE_FXD_FLTR_QW0_TO_Q_PRIO1 0x1ULL + +#define ICE_FXD_FLTR_QW0_DPU_RECIPE_S 38 +#define ICE_FXD_FLTR_QW0_DPU_RECIPE_M \ + (0x3ULL << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) +#define ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT 0x0ULL + +#define ICE_FXD_FLTR_QW0_DROP_S 40 +#define ICE_FXD_FLTR_QW0_DROP_M BIT_ULL(ICE_FXD_FLTR_QW0_DROP_S) +#define ICE_FXD_FLTR_QW0_DROP_NO 0x0ULL +#define ICE_FXD_FLTR_QW0_DROP_YES 0x1ULL + +#define ICE_FXD_FLTR_QW0_FLEX_PRI_S 41 +#define ICE_FXD_FLTR_QW0_FLEX_PRI_M (0x7ULL << ICE_FXD_FLTR_QW0_FLEX_PRI_S) +#define ICE_FXD_FLTR_QW0_FLEX_PRI_NONE 0x0ULL + +#define ICE_FXD_FLTR_QW0_FLEX_MDID_S 44 +#define ICE_FXD_FLTR_QW0_FLEX_MDID_M (0xFULL << ICE_FXD_FLTR_QW0_FLEX_MDID_S) +#define ICE_FXD_FLTR_QW0_FLEX_MDID0 0x0ULL + +#define ICE_FXD_FLTR_QW0_FLEX_VAL_S 48 +#define ICE_FXD_FLTR_QW0_FLEX_VAL_M \ + (0xFFFFULL << ICE_FXD_FLTR_QW0_FLEX_VAL_S) +#define ICE_FXD_FLTR_QW0_FLEX_VAL0 0x0ULL + +#define ICE_FXD_FLTR_QW1_DTYPE_S 0 +#define ICE_FXD_FLTR_QW1_DTYPE_M (0xFULL << ICE_FXD_FLTR_QW1_DTYPE_S) +#define ICE_FXD_FLTR_QW1_PCMD_S 4 +#define ICE_FXD_FLTR_QW1_PCMD_M BIT_ULL(ICE_FXD_FLTR_QW1_PCMD_S) +#define ICE_FXD_FLTR_QW1_PCMD_ADD 0x0ULL +#define ICE_FXD_FLTR_QW1_PCMD_REMOVE 0x1ULL + +#define ICE_FXD_FLTR_QW1_PROF_PRI_S 5 +#define ICE_FXD_FLTR_QW1_PROF_PRI_M (0x7ULL << ICE_FXD_FLTR_QW1_PROF_PRI_S) +#define ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO 0x0ULL + +#define ICE_FXD_FLTR_QW1_PROF_S 8 +#define ICE_FXD_FLTR_QW1_PROF_M (0x3FULL << ICE_FXD_FLTR_QW1_PROF_S) +#define ICE_FXD_FLTR_QW1_PROF_ZERO 0x0ULL + +#define ICE_FXD_FLTR_QW1_FD_VSI_S 14 +#define ICE_FXD_FLTR_QW1_FD_VSI_M (0x3FFULL << ICE_FXD_FLTR_QW1_FD_VSI_S) +#define ICE_FXD_FLTR_QW1_SWAP_S 24 +#define ICE_FXD_FLTR_QW1_SWAP_M BIT_ULL(ICE_FXD_FLTR_QW1_SWAP_S) +#define ICE_FXD_FLTR_QW1_SWAP_NOT_SET 0x0ULL +#define ICE_FXD_FLTR_QW1_SWAP_SET 0x1ULL + +#define ICE_FXD_FLTR_QW1_FDID_PRI_S 25 +#define ICE_FXD_FLTR_QW1_FDID_PRI_M (0x7ULL << ICE_FXD_FLTR_QW1_FDID_PRI_S) +#define ICE_FXD_FLTR_QW1_FDID_PRI_ONE 0x1ULL +#define ICE_FXD_FLTR_QW1_FDID_PRI_THREE 0x3ULL + +#define ICE_FXD_FLTR_QW1_FDID_MDID_S 28 +#define ICE_FXD_FLTR_QW1_FDID_MDID_M (0xFULL << ICE_FXD_FLTR_QW1_FDID_MDID_S) +#define ICE_FXD_FLTR_QW1_FDID_MDID_FD 0x05ULL + +#define ICE_FXD_FLTR_QW1_FDID_S 32 +#define ICE_FXD_FLTR_QW1_FDID_M \ + (0xFFFFFFFFULL << ICE_FXD_FLTR_QW1_FDID_S) +#define ICE_FXD_FLTR_QW1_FDID_ZERO 0x0ULL + +enum ice_rx_desc_status_bits { + /* Note: These are predefined bit offsets */ + ICE_RX_DESC_STATUS_DD_S = 0, + ICE_RX_DESC_STATUS_EOF_S = 1, + ICE_RX_DESC_STATUS_L2TAG1P_S = 2, + ICE_RX_DESC_STATUS_L3L4P_S = 3, + ICE_RX_DESC_STATUS_CRCP_S = 4, + ICE_RX_DESC_STATUS_TSYNINDX_S = 5, + ICE_RX_DESC_STATUS_TSYNVALID_S = 7, + ICE_RX_DESC_STATUS_EXT_UDP_0_S = 8, + ICE_RX_DESC_STATUS_UMBCAST_S = 9, + ICE_RX_DESC_STATUS_FLM_S = 11, + ICE_RX_DESC_STATUS_FLTSTAT_S = 12, + ICE_RX_DESC_STATUS_LPBK_S = 14, + ICE_RX_DESC_STATUS_IPV6EXADD_S = 15, + ICE_RX_DESC_STATUS_RESERVED2_S = 16, + ICE_RX_DESC_STATUS_INT_UDP_0_S = 18, + ICE_RX_DESC_STATUS_LAST /* this entry must be last!!! */ +}; + +#define ICE_RXD_QW1_STATUS_S 0 +#define ICE_RXD_QW1_STATUS_M ((BIT(ICE_RX_DESC_STATUS_LAST) - 1) << \ + ICE_RXD_QW1_STATUS_S) + +#define ICE_RXD_QW1_STATUS_TSYNINDX_S ICE_RX_DESC_STATUS_TSYNINDX_S +#define ICE_RXD_QW1_STATUS_TSYNINDX_M (0x3UL << ICE_RXD_QW1_STATUS_TSYNINDX_S) + +#define ICE_RXD_QW1_STATUS_TSYNVALID_S ICE_RX_DESC_STATUS_TSYNVALID_S +#define ICE_RXD_QW1_STATUS_TSYNVALID_M BIT_ULL(ICE_RXD_QW1_STATUS_TSYNVALID_S) + +enum ice_rx_desc_fltstat_values { + ICE_RX_DESC_FLTSTAT_NO_DATA = 0, + ICE_RX_DESC_FLTSTAT_RSV_FD_ID = 1, /* 16byte desc? FD_ID : RSV */ + ICE_RX_DESC_FLTSTAT_RSV = 2, + ICE_RX_DESC_FLTSTAT_RSS_HASH = 3, +}; + +#define ICE_RXD_QW1_ERROR_S 19 +#define ICE_RXD_QW1_ERROR_M (0xFFUL << ICE_RXD_QW1_ERROR_S) + +enum ice_rx_desc_error_bits { + /* Note: These are predefined bit offsets */ + ICE_RX_DESC_ERROR_RXE_S = 0, + ICE_RX_DESC_ERROR_RECIPE_S = 1, + ICE_RX_DESC_ERROR_HBO_S = 2, + ICE_RX_DESC_ERROR_L3L4E_S = 3, /* 3 BITS */ + ICE_RX_DESC_ERROR_IPE_S = 3, + ICE_RX_DESC_ERROR_L4E_S = 4, + ICE_RX_DESC_ERROR_EIPE_S = 5, + ICE_RX_DESC_ERROR_OVERSIZE_S = 6, + ICE_RX_DESC_ERROR_PPRS_S = 7 +}; + +enum ice_rx_desc_error_l3l4e_masks { + ICE_RX_DESC_ERROR_L3L4E_NONE = 0, + ICE_RX_DESC_ERROR_L3L4E_PROT = 1, +}; + +#define ICE_RXD_QW1_PTYPE_S 30 +#define ICE_RXD_QW1_PTYPE_M (0xFFULL << ICE_RXD_QW1_PTYPE_S) + +/* Packet type non-ip values */ +enum ice_rx_l2_ptype { + ICE_RX_PTYPE_L2_RESERVED = 0, + ICE_RX_PTYPE_L2_MAC_PAY2 = 1, + ICE_RX_PTYPE_L2_FIP_PAY2 = 3, + ICE_RX_PTYPE_L2_OUI_PAY2 = 4, + ICE_RX_PTYPE_L2_MACCNTRL_PAY2 = 5, + ICE_RX_PTYPE_L2_LLDP_PAY2 = 6, + ICE_RX_PTYPE_L2_ECP_PAY2 = 7, + ICE_RX_PTYPE_L2_EVB_PAY2 = 8, + ICE_RX_PTYPE_L2_QCN_PAY2 = 9, + ICE_RX_PTYPE_L2_EAPOL_PAY2 = 10, + ICE_RX_PTYPE_L2_ARP = 11, +}; + +struct ice_rx_ptype_decoded { + uint32_t known:1; + uint32_t outer_ip:1; + uint32_t outer_ip_ver:2; + uint32_t outer_frag:1; + uint32_t tunnel_type:3; + uint32_t tunnel_end_prot:2; + uint32_t tunnel_end_frag:1; + uint32_t inner_prot:4; + uint32_t payload_layer:3; +}; + +enum ice_rx_ptype_outer_ip { + ICE_RX_PTYPE_OUTER_L2 = 0, + ICE_RX_PTYPE_OUTER_IP = 1, +}; + +enum ice_rx_ptype_outer_ip_ver { + ICE_RX_PTYPE_OUTER_NONE = 0, + ICE_RX_PTYPE_OUTER_IPV4 = 1, + ICE_RX_PTYPE_OUTER_IPV6 = 2, +}; + +enum ice_rx_ptype_outer_fragmented { + ICE_RX_PTYPE_NOT_FRAG = 0, + ICE_RX_PTYPE_FRAG = 1, +}; + +enum ice_rx_ptype_tunnel_type { + ICE_RX_PTYPE_TUNNEL_NONE = 0, + ICE_RX_PTYPE_TUNNEL_IP_IP = 1, + ICE_RX_PTYPE_TUNNEL_IP_GRENAT = 2, + ICE_RX_PTYPE_TUNNEL_IP_GRENAT_MAC = 3, + ICE_RX_PTYPE_TUNNEL_IP_GRENAT_MAC_VLAN = 4, +}; + +enum ice_rx_ptype_tunnel_end_prot { + ICE_RX_PTYPE_TUNNEL_END_NONE = 0, + ICE_RX_PTYPE_TUNNEL_END_IPV4 = 1, + ICE_RX_PTYPE_TUNNEL_END_IPV6 = 2, +}; + +enum ice_rx_ptype_inner_prot { + ICE_RX_PTYPE_INNER_PROT_NONE = 0, + ICE_RX_PTYPE_INNER_PROT_UDP = 1, + ICE_RX_PTYPE_INNER_PROT_TCP = 2, + ICE_RX_PTYPE_INNER_PROT_SCTP = 3, + ICE_RX_PTYPE_INNER_PROT_ICMP = 4, +}; + +enum ice_rx_ptype_payload_layer { + ICE_RX_PTYPE_PAYLOAD_LAYER_NONE = 0, + ICE_RX_PTYPE_PAYLOAD_LAYER_PAY2 = 1, + ICE_RX_PTYPE_PAYLOAD_LAYER_PAY3 = 2, + ICE_RX_PTYPE_PAYLOAD_LAYER_PAY4 = 3, +}; + +#define ICE_RXD_QW1_LEN_PBUF_S 38 +#define ICE_RXD_QW1_LEN_PBUF_M (0x3FFFULL << ICE_RXD_QW1_LEN_PBUF_S) + +#define ICE_RXD_QW1_LEN_HBUF_S 52 +#define ICE_RXD_QW1_LEN_HBUF_M (0x7FFULL << ICE_RXD_QW1_LEN_HBUF_S) + +#define ICE_RXD_QW1_LEN_SPH_S 63 +#define ICE_RXD_QW1_LEN_SPH_M BIT_ULL(ICE_RXD_QW1_LEN_SPH_S) + +enum ice_rx_desc_ext_status_bits { + /* Note: These are predefined bit offsets */ + ICE_RX_DESC_EXT_STATUS_L2TAG2P_S = 0, + ICE_RX_DESC_EXT_STATUS_L2TAG3P_S = 1, + ICE_RX_DESC_EXT_STATUS_FLEXBL_S = 2, + ICE_RX_DESC_EXT_STATUS_FLEXBH_S = 4, + ICE_RX_DESC_EXT_STATUS_FDLONGB_S = 9, + ICE_RX_DESC_EXT_STATUS_PELONGB_S = 11, +}; + +enum ice_rx_desc_pe_status_bits { + /* Note: These are predefined bit offsets */ + ICE_RX_DESC_PE_STATUS_QPID_S = 0, /* 18 BITS */ + ICE_RX_DESC_PE_STATUS_L4PORT_S = 0, /* 16 BITS */ + ICE_RX_DESC_PE_STATUS_IPINDEX_S = 16, /* 8 BITS */ + ICE_RX_DESC_PE_STATUS_QPIDHIT_S = 24, + ICE_RX_DESC_PE_STATUS_APBVTHIT_S = 25, + ICE_RX_DESC_PE_STATUS_PORTV_S = 26, + ICE_RX_DESC_PE_STATUS_URG_S = 27, + ICE_RX_DESC_PE_STATUS_IPFRAG_S = 28, + ICE_RX_DESC_PE_STATUS_IPOPT_S = 29 +}; + +#define ICE_RX_PROG_STATUS_DESC_LEN_S 38 +#define ICE_RX_PROG_STATUS_DESC_LEN 0x2000000 + +#define ICE_RX_PROG_STATUS_DESC_QW1_PROGID_S 2 +#define ICE_RX_PROG_STATUS_DESC_QW1_PROGID_M \ + (0x7UL << ICE_RX_PROG_STATUS_DESC_QW1_PROGID_S) + +#define ICE_RX_PROG_STATUS_DESC_QW1_ERROR_S 19 +#define ICE_RX_PROG_STATUS_DESC_QW1_ERROR_M \ + (0x3FUL << ICE_RX_PROG_STATUS_DESC_QW1_ERROR_S) + +enum ice_rx_prog_status_desc_status_bits { + /* Note: These are predefined bit offsets */ + ICE_RX_PROG_STATUS_DESC_DD_S = 0, + ICE_RX_PROG_STATUS_DESC_PROG_ID_S = 2 /* 3 BITS */ +}; + +enum ice_rx_prog_status_desc_prog_id_masks { + ICE_RX_PROG_STATUS_DESC_FD_FLTR_STATUS = 1, +}; + +enum ice_rx_prog_status_desc_error_bits { + /* Note: These are predefined bit offsets */ + ICE_RX_PROG_STATUS_DESC_FD_TBL_FULL_S = 0, + ICE_RX_PROG_STATUS_DESC_NO_FD_ENTRY_S = 1, +}; + +/* Rx Flex Descriptors + * These descriptors are used instead of the legacy version descriptors when + * ice_rlan_ctx.adv_desc is set + */ + +union ice_32b_rx_flex_desc { + struct { + uint64_t pkt_addr; /* Packet buffer address */ + uint64_t hdr_addr; /* Header buffer address */ + /* bit 0 of hdr_addr is DD bit */ + uint64_t rsvd1; + uint64_t rsvd2; + } read; + struct { + /* Qword 0 */ + uint8_t rxdid; /* descriptor builder profile ID */ + uint8_t mir_id_umb_cast; /* mirror=[5:0], umb=[7:6] */ + uint16_t ptype_flex_flags0; /* ptype=[9:0], ff0=[15:10] */ + uint16_t pkt_len; /* [15:14] are reserved */ + uint16_t hdr_len_sph_flex_flags1; /* header=[10:0] */ + /* sph=[11:11] */ + /* ff1/ext=[15:12] */ + + /* Qword 1 */ + uint16_t status_error0; + uint16_t l2tag1; + uint16_t flex_meta0; + uint16_t flex_meta1; + + /* Qword 2 */ + uint16_t status_error1; + uint8_t flex_flags2; + uint8_t time_stamp_low; + uint16_t l2tag2_1st; + uint16_t l2tag2_2nd; + + /* Qword 3 */ + uint16_t flex_meta2; + uint16_t flex_meta3; + union { + struct { + uint16_t flex_meta4; + uint16_t flex_meta5; + } flex; + uint32_t ts_high; + } flex_ts; + } wb; /* writeback */ +}; + +/* Rx Flex Descriptor NIC Profile + * RxDID Profile ID 2 + * Flex-field 0: RSS hash lower 16-bits + * Flex-field 1: RSS hash upper 16-bits + * Flex-field 2: Flow ID lower 16-bits + * Flex-field 3: Flow ID higher 16-bits + * Flex-field 4: reserved, VLAN ID taken from L2Tag + */ +struct ice_32b_rx_flex_desc_nic { + /* Qword 0 */ + uint8_t rxdid; + uint8_t mir_id_umb_cast; + uint16_t ptype_flexi_flags0; + uint16_t pkt_len; + uint16_t hdr_len_sph_flex_flags1; + + /* Qword 1 */ + uint16_t status_error0; + uint16_t l2tag1; + uint32_t rss_hash; + + /* Qword 2 */ + uint16_t status_error1; + uint8_t flexi_flags2; + uint8_t ts_low; + uint16_t l2tag2_1st; + uint16_t l2tag2_2nd; + + /* Qword 3 */ + uint32_t flow_id; + union { + struct { + uint16_t rsvd; + uint16_t flow_id_ipv6; + } flex; + uint32_t ts_high; + } flex_ts; +}; + +/* Rx Flex Descriptor Switch Profile + * RxDID Profile ID 3 + * Flex-field 0: Source VSI + */ +struct ice_32b_rx_flex_desc_sw { + /* Qword 0 */ + uint8_t rxdid; + uint8_t mir_id_umb_cast; + uint16_t ptype_flexi_flags0; + uint16_t pkt_len; + uint16_t hdr_len_sph_flex_flags1; + + /* Qword 1 */ + uint16_t status_error0; + uint16_t l2tag1; + uint16_t src_vsi; /* [10:15] are reserved */ + uint16_t flex_md1_rsvd; + + /* Qword 2 */ + uint16_t status_error1; + uint8_t flex_flags2; + uint8_t ts_low; + uint16_t l2tag2_1st; + uint16_t l2tag2_2nd; + + /* Qword 3 */ + uint32_t rsvd; /* flex words 2-3 are reserved */ + uint32_t ts_high; +}; + +/* Rx Flex Descriptor NIC VEB Profile + * RxDID Profile ID 4 + * Flex-field 0: Destination VSI + */ +struct ice_32b_rx_flex_desc_nic_veb_dbg { + /* Qword 0 */ + uint8_t rxdid; + uint8_t mir_id_umb_cast; + uint16_t ptype_flexi_flags0; + uint16_t pkt_len; + uint16_t hdr_len_sph_flex_flags1; + + /* Qword 1 */ + uint16_t status_error0; + uint16_t l2tag1; + uint16_t dst_vsi; /* [0:12]: destination VSI */ + /* 13: VSI valid bit */ + /* [14:15] are reserved */ + uint16_t flex_field_1; + + /* Qword 2 */ + uint16_t status_error1; + uint8_t flex_flags2; + uint8_t ts_low; + uint16_t l2tag2_1st; + uint16_t l2tag2_2nd; + + /* Qword 3 */ + uint32_t rsvd; /* flex words 2-3 are reserved */ + uint32_t ts_high; +}; + +/* Rx Flex Descriptor NIC ACL Profile + * RxDID Profile ID 5 + * Flex-field 0: ACL Counter 0 + * Flex-field 1: ACL Counter 1 + * Flex-field 2: ACL Counter 2 + */ +struct ice_32b_rx_flex_desc_nic_acl_dbg { + /* Qword 0 */ + uint8_t rxdid; + uint8_t mir_id_umb_cast; + uint16_t ptype_flexi_flags0; + uint16_t pkt_len; + uint16_t hdr_len_sph_flex_flags1; + + /* Qword 1 */ + uint16_t status_error0; + uint16_t l2tag1; + uint16_t acl_ctr0; + uint16_t acl_ctr1; + + /* Qword 2 */ + uint16_t status_error1; + uint8_t flex_flags2; + uint8_t ts_low; + uint16_t l2tag2_1st; + uint16_t l2tag2_2nd; + + /* Qword 3 */ + uint16_t acl_ctr2; + uint16_t rsvd; /* flex words 2-3 are reserved */ + uint32_t ts_high; +}; + +/* Rx Flex Descriptor NIC Profile + * RxDID Profile ID 6 + * Flex-field 0: RSS hash lower 16-bits + * Flex-field 1: RSS hash upper 16-bits + * Flex-field 2: Flow ID lower 16-bits + * Flex-field 3: Source VSI + * Flex-field 4: reserved, VLAN ID taken from L2Tag + */ +struct ice_32b_rx_flex_desc_nic_2 { + /* Qword 0 */ + uint8_t rxdid; + uint8_t mir_id_umb_cast; + uint16_t ptype_flexi_flags0; + uint16_t pkt_len; + uint16_t hdr_len_sph_flex_flags1; + + /* Qword 1 */ + uint16_t status_error0; + uint16_t l2tag1; + uint32_t rss_hash; + + /* Qword 2 */ + uint16_t status_error1; + uint8_t flexi_flags2; + uint8_t ts_low; + uint16_t l2tag2_1st; + uint16_t l2tag2_2nd; + + /* Qword 3 */ + uint16_t flow_id; + uint16_t src_vsi; + union { + struct { + uint16_t rsvd; + uint16_t flow_id_ipv6; + } flex; + uint32_t ts_high; + } flex_ts; +}; + +/* Receive Flex Descriptor profile IDs: There are a total + * of 64 profiles where profile IDs 0/1 are for legacy; and + * profiles 2-63 are flex profiles that can be programmed + * with a specific metadata (profile 7 reserved for HW) + */ +enum ice_rxdid { + ICE_RXDID_LEGACY_0 = 0, + ICE_RXDID_LEGACY_1 = 1, + ICE_RXDID_FLEX_NIC = 2, + ICE_RXDID_FLEX_NIC_2 = 6, + ICE_RXDID_HW = 7, + ICE_RXDID_LAST = 63, +}; + +/* Recceive Flex descriptor Dword Index */ +enum ice_flex_word { + ICE_RX_FLEX_DWORD_0 = 0, + ICE_RX_FLEX_DWORD_1, + ICE_RX_FLEX_DWORD_2, + ICE_RX_FLEX_DWORD_3, + ICE_RX_FLEX_DWORD_4, + ICE_RX_FLEX_DWORD_5 +}; + +/* Receive Flex Descriptor Rx opcode values */ +enum ice_flex_opcode { + ICE_RX_OPC_DEBUG = 0, + ICE_RX_OPC_MDID, + ICE_RX_OPC_EXTRACT, + ICE_RX_OPC_PROTID +}; + +/* Receive Descriptor MDID values that access packet flags */ +enum ice_flex_mdid_pkt_flags { + ICE_RX_MDID_PKT_FLAGS_15_0 = 20, + ICE_RX_MDID_PKT_FLAGS_31_16, + ICE_RX_MDID_PKT_FLAGS_47_32, + ICE_RX_MDID_PKT_FLAGS_63_48, +}; + +/* Generic descriptor MDID values */ +enum ice_flex_mdid { + ICE_MDID_GENERIC_WORD_0, + ICE_MDID_GENERIC_WORD_1, + ICE_MDID_GENERIC_WORD_2, + ICE_MDID_GENERIC_WORD_3, + ICE_MDID_GENERIC_WORD_4, + ICE_MDID_FLOW_ID_LOWER, + ICE_MDID_FLOW_ID_HIGH, + ICE_MDID_RX_DESCR_PROF_IDX, + ICE_MDID_RX_PKT_DROP, + ICE_MDID_RX_DST_Q = 12, + ICE_MDID_RX_DST_VSI, + ICE_MDID_SRC_VSI = 19, + ICE_MDID_ACL_NOP = 55, + /* Entry 56 */ + ICE_MDID_RX_HASH_LOW, + ICE_MDID_ACL_CNTR_PKT = ICE_MDID_RX_HASH_LOW, + /* Entry 57 */ + ICE_MDID_RX_HASH_HIGH, + ICE_MDID_ACL_CNTR_BYTES = ICE_MDID_RX_HASH_HIGH, + ICE_MDID_ACL_CNTR_PKT_BYTES +}; + +/* for ice_32byte_rx_flex_desc.mir_id_umb_cast member */ +#define ICE_RX_FLEX_DESC_MIRROR_M (0x3F) /* 6-bits */ + +/* Rx/Tx Flag64 packet flag bits */ +enum ice_flg64_bits { + ICE_FLG_PKT_DSI = 0, + /* If there is a 1 in this bit position then that means Rx packet */ + ICE_FLG_PKT_DIR = 4, + ICE_FLG_EVLAN_x8100 = 14, + ICE_FLG_EVLAN_x9100, + ICE_FLG_VLAN_x8100, + ICE_FLG_TNL_MAC = 22, + ICE_FLG_TNL_VLAN, + ICE_FLG_PKT_FRG, + ICE_FLG_FIN = 32, + ICE_FLG_SYN, + ICE_FLG_RST, + ICE_FLG_TNL0 = 38, + ICE_FLG_TNL1, + ICE_FLG_TNL2, + ICE_FLG_UDP_GRE, + ICE_FLG_RSVD = 63 +}; + +enum ice_rx_flex_desc_umb_cast_bits { /* field is 2 bits long */ + ICE_RX_FLEX_DESC_UMB_CAST_S = 6, + ICE_RX_FLEX_DESC_UMB_CAST_LAST /* this entry must be last!!! */ +}; + +enum ice_umbcast_dest_addr_types { + ICE_DEST_UNICAST = 0, + ICE_DEST_MULTICAST, + ICE_DEST_BROADCAST, + ICE_DEST_MIRRORED, +}; + +/* for ice_32byte_rx_flex_desc.ptype_flexi_flags0 member */ +#define ICE_RX_FLEX_DESC_PTYPE_M (0x3FF) /* 10-bits */ + +enum ice_rx_flex_desc_flexi_flags0_bits { /* field is 6 bits long */ + ICE_RX_FLEX_DESC_FLEXI_FLAGS0_S = 10, + ICE_RX_FLEX_DESC_FLEXI_FLAGS0_LAST /* this entry must be last!!! */ +}; + +/* for ice_32byte_rx_flex_desc.pkt_length member */ +#define ICE_RX_FLX_DESC_PKT_LEN_M (0x3FFF) /* 14-bits */ + +/* for ice_32byte_rx_flex_desc.header_length_sph_flexi_flags1 member */ +#define ICE_RX_FLEX_DESC_HEADER_LEN_M (0x7FF) /* 11-bits */ + +enum ice_rx_flex_desc_sph_bits { /* field is 1 bit long */ + ICE_RX_FLEX_DESC_SPH_S = 11, + ICE_RX_FLEX_DESC_SPH_LAST /* this entry must be last!!! */ +}; + +enum ice_rx_flex_desc_flexi_flags1_bits { /* field is 4 bits long */ + ICE_RX_FLEX_DESC_FLEXI_FLAGS1_S = 12, + ICE_RX_FLEX_DESC_FLEXI_FLAGS1_LAST /* this entry must be last!!! */ +}; + +enum ice_rx_flex_desc_ext_status_bits { /* field is 4 bits long */ + ICE_RX_FLEX_DESC_EXT_STATUS_EXT_UDP_S = 12, + ICE_RX_FLEX_DESC_EXT_STATUS_INT_UDP_S = 13, + ICE_RX_FLEX_DESC_EXT_STATUS_RECIPE_S = 14, + ICE_RX_FLEX_DESC_EXT_STATUS_OVERSIZE_S = 15, + ICE_RX_FLEX_DESC_EXT_STATUS_LAST /* entry must be last!!! */ +}; + +enum ice_rx_flex_desc_status_error_0_bits { + /* Note: These are predefined bit offsets */ + ICE_RX_FLEX_DESC_STATUS0_DD_S = 0, + ICE_RX_FLEX_DESC_STATUS0_EOF_S, + ICE_RX_FLEX_DESC_STATUS0_HBO_S, + ICE_RX_FLEX_DESC_STATUS0_L3L4P_S, + ICE_RX_FLEX_DESC_STATUS0_XSUM_IPE_S, + ICE_RX_FLEX_DESC_STATUS0_XSUM_L4E_S, + ICE_RX_FLEX_DESC_STATUS0_XSUM_EIPE_S, + ICE_RX_FLEX_DESC_STATUS0_XSUM_EUDPE_S, + ICE_RX_FLEX_DESC_STATUS0_LPBK_S, + ICE_RX_FLEX_DESC_STATUS0_IPV6EXADD_S, + ICE_RX_FLEX_DESC_STATUS0_RXE_S, + ICE_RX_FLEX_DESC_STATUS0_CRCP_S, + ICE_RX_FLEX_DESC_STATUS0_RSS_VALID_S, + ICE_RX_FLEX_DESC_STATUS0_L2TAG1P_S, + ICE_RX_FLEX_DESC_STATUS0_XTRMD0_VALID_S, + ICE_RX_FLEX_DESC_STATUS0_XTRMD1_VALID_S, + ICE_RX_FLEX_DESC_STATUS0_LAST /* this entry must be last!!! */ +}; + +enum ice_rx_flex_desc_status_error_1_bits { + /* Note: These are predefined bit offsets */ + ICE_RX_FLEX_DESC_STATUS1_CPM_S = 0, /* 4 bits */ + ICE_RX_FLEX_DESC_STATUS1_NAT_S = 4, + ICE_RX_FLEX_DESC_STATUS1_CRYPTO_S = 5, + /* [10:6] reserved */ + ICE_RX_FLEX_DESC_STATUS1_L2TAG2P_S = 11, + ICE_RX_FLEX_DESC_STATUS1_XTRMD2_VALID_S = 12, + ICE_RX_FLEX_DESC_STATUS1_XTRMD3_VALID_S = 13, + ICE_RX_FLEX_DESC_STATUS1_XTRMD4_VALID_S = 14, + ICE_RX_FLEX_DESC_STATUS1_XTRMD5_VALID_S = 15, + ICE_RX_FLEX_DESC_STATUS1_LAST /* this entry must be last!!! */ +}; + +enum ice_rx_flex_desc_exstat_bits { + /* Note: These are predefined bit offsets */ + ICE_RX_FLEX_DESC_EXSTAT_EXTUDP_S = 0, + ICE_RX_FLEX_DESC_EXSTAT_INTUDP_S = 1, + ICE_RX_FLEX_DESC_EXSTAT_RECIPE_S = 2, + ICE_RX_FLEX_DESC_EXSTAT_OVERSIZE_S = 3, +}; + +/* + * For ice_32b_rx_flex_desc.ts_low: + * [0]: Timestamp-low validity bit + * [1:7]: Timestamp-low value + */ +#define ICE_RX_FLEX_DESC_TS_L_VALID_S 0x01 +#define ICE_RX_FLEX_DESC_TS_L_VALID_M ICE_RX_FLEX_DESC_TS_L_VALID_S +#define ICE_RX_FLEX_DESC_TS_L_M 0xFE + +#define ICE_RXQ_CTX_SIZE_DWORDS 8 +#define ICE_RXQ_CTX_SZ (ICE_RXQ_CTX_SIZE_DWORDS * sizeof(uint32_t)) +#define ICE_TXQ_CTX_SIZE_DWORDS 10 +#define ICE_TXQ_CTX_SZ (ICE_TXQ_CTX_SIZE_DWORDS * sizeof(uint32_t)) +#define ICE_TX_CMPLTNQ_CTX_SIZE_DWORDS 22 +#define ICE_TX_DRBELL_Q_CTX_SIZE_DWORDS 5 +#define GLTCLAN_CQ_CNTX(i, CQ) (GLTCLAN_CQ_CNTX0(CQ) + ((i) * 0x0800)) + +/* RLAN Rx queue context data + * + * The sizes of the variables may be larger than needed due to crossing byte + * boundaries. If we do not have the width of the variable set to the correct + * size then we could end up shifting bits off the top of the variable when the + * variable is at the top of a byte and crosses over into the next byte. + */ +struct ice_rlan_ctx { + uint16_t head; + uint16_t cpuid; /* bigger than needed, see above for reason */ +#define ICE_RLAN_BASE_S 7 + uint64_t base; + uint16_t qlen; +#define ICE_RLAN_CTX_DBUF_S 7 + uint16_t dbuf; /* bigger than needed, see above for reason */ +#define ICE_RLAN_CTX_HBUF_S 6 + uint16_t hbuf; /* bigger than needed, see above for reason */ + uint8_t dtype; + uint8_t dsize; + uint8_t crcstrip; + uint8_t l2tsel; + uint8_t hsplit_0; + uint8_t hsplit_1; + uint8_t showiv; + uint32_t rxmax; /* bigger than needed, see above for reason */ + uint8_t tphrdesc_ena; + uint8_t tphwdesc_ena; + uint8_t tphdata_ena; + uint8_t tphhead_ena; + uint16_t lrxqthresh; /* bigger than needed, see above for reason */ + uint8_t prefena; /* NOTE: normally must be set to 1 at init */ +}; + +struct ice_ctx_ele { + uint16_t offset; + uint16_t size_of; + uint16_t width; + uint16_t lsb; +}; + +#define ICE_CTX_STORE(_struct, _ele, _width, _lsb) { \ + .offset = offsetof(struct _struct, _ele), \ + .size_of = sizeof(((struct _struct *)0)->_ele), \ + .width = _width, \ + .lsb = _lsb, \ +} + +/* for hsplit_0 field of Rx RLAN context */ +enum ice_rlan_ctx_rx_hsplit_0 { + ICE_RLAN_RX_HSPLIT_0_NO_SPLIT = 0, + ICE_RLAN_RX_HSPLIT_0_SPLIT_L2 = 1, + ICE_RLAN_RX_HSPLIT_0_SPLIT_IP = 2, + ICE_RLAN_RX_HSPLIT_0_SPLIT_TCP_UDP = 4, + ICE_RLAN_RX_HSPLIT_0_SPLIT_SCTP = 8, +}; + +/* for hsplit_1 field of Rx RLAN context */ +enum ice_rlan_ctx_rx_hsplit_1 { + ICE_RLAN_RX_HSPLIT_1_NO_SPLIT = 0, + ICE_RLAN_RX_HSPLIT_1_SPLIT_L2 = 1, + ICE_RLAN_RX_HSPLIT_1_SPLIT_ALWAYS = 2, +}; + +/* Tx Descriptor */ +struct ice_tx_desc { + uint64_t buf_addr; /* Address of descriptor's data buf */ + uint64_t cmd_type_offset_bsz; +}; + +#define ICE_TXD_QW1_DTYPE_S 0 +#define ICE_TXD_QW1_DTYPE_M (0xFUL << ICE_TXD_QW1_DTYPE_S) + +enum ice_tx_desc_dtype_value { + ICE_TX_DESC_DTYPE_DATA = 0x0, + ICE_TX_DESC_DTYPE_CTX = 0x1, + ICE_TX_DESC_DTYPE_IPSEC = 0x3, + ICE_TX_DESC_DTYPE_FLTR_PROG = 0x8, + ICE_TX_DESC_DTYPE_HLP_META = 0x9, + /* DESC_DONE - HW has completed write-back of descriptor */ + ICE_TX_DESC_DTYPE_DESC_DONE = 0xF, +}; + +#define ICE_TXD_QW1_CMD_S 4 +#define ICE_TXD_QW1_CMD_M (0xFFFUL << ICE_TXD_QW1_CMD_S) + +enum ice_tx_desc_cmd_bits { + ICE_TX_DESC_CMD_EOP = 0x0001, + ICE_TX_DESC_CMD_RS = 0x0002, + ICE_TX_DESC_CMD_RSVD = 0x0004, + ICE_TX_DESC_CMD_IL2TAG1 = 0x0008, + ICE_TX_DESC_CMD_DUMMY = 0x0010, + ICE_TX_DESC_CMD_IIPT_NONIP = 0x0000, + ICE_TX_DESC_CMD_IIPT_IPV6 = 0x0020, + ICE_TX_DESC_CMD_IIPT_IPV4 = 0x0040, + ICE_TX_DESC_CMD_IIPT_IPV4_CSUM = 0x0060, + ICE_TX_DESC_CMD_RSVD2 = 0x0080, + ICE_TX_DESC_CMD_L4T_EOFT_UNK = 0x0000, + ICE_TX_DESC_CMD_L4T_EOFT_TCP = 0x0100, + ICE_TX_DESC_CMD_L4T_EOFT_SCTP = 0x0200, + ICE_TX_DESC_CMD_L4T_EOFT_UDP = 0x0300, + ICE_TX_DESC_CMD_RE = 0x0400, + ICE_TX_DESC_CMD_RSVD3 = 0x0800, +}; + +#define ICE_TXD_QW1_OFFSET_S 16 +#define ICE_TXD_QW1_OFFSET_M (0x3FFFFULL << ICE_TXD_QW1_OFFSET_S) + +enum ice_tx_desc_len_fields { + /* Note: These are predefined bit offsets */ + ICE_TX_DESC_LEN_MACLEN_S = 0, /* 7 BITS */ + ICE_TX_DESC_LEN_IPLEN_S = 7, /* 7 BITS */ + ICE_TX_DESC_LEN_L4_LEN_S = 14 /* 4 BITS */ +}; + +#define ICE_TXD_QW1_MACLEN_M (0x7FUL << ICE_TX_DESC_LEN_MACLEN_S) +#define ICE_TXD_QW1_IPLEN_M (0x7FUL << ICE_TX_DESC_LEN_IPLEN_S) +#define ICE_TXD_QW1_L4LEN_M (0xFUL << ICE_TX_DESC_LEN_L4_LEN_S) + +/* Tx descriptor field limits in bytes */ +#define ICE_TXD_MACLEN_MAX ((ICE_TXD_QW1_MACLEN_M >> \ + ICE_TX_DESC_LEN_MACLEN_S) * ICE_BYTES_PER_WORD) +#define ICE_TXD_IPLEN_MAX ((ICE_TXD_QW1_IPLEN_M >> \ + ICE_TX_DESC_LEN_IPLEN_S) * ICE_BYTES_PER_DWORD) +#define ICE_TXD_L4LEN_MAX ((ICE_TXD_QW1_L4LEN_M >> \ + ICE_TX_DESC_LEN_L4_LEN_S) * ICE_BYTES_PER_DWORD) + +#define ICE_TXD_QW1_TX_BUF_SZ_S 34 +#define ICE_TXD_QW1_TX_BUF_SZ_M (0x3FFFULL << ICE_TXD_QW1_TX_BUF_SZ_S) + +#define ICE_TXD_QW1_L2TAG1_S 48 +#define ICE_TXD_QW1_L2TAG1_M (0xFFFFULL << ICE_TXD_QW1_L2TAG1_S) + +/* Context descriptors */ +struct ice_tx_ctx_desc { + uint32_t tunneling_params; + uint16_t l2tag2; + uint16_t rsvd; + uint64_t qw1; +}; + +#define ICE_TX_GCS_DESC_START 0 /* 7 BITS */ +#define ICE_TX_GCS_DESC_OFFSET 7 /* 4 BITS */ +#define ICE_TX_GCS_DESC_TYPE 11 /* 2 BITS */ +#define ICE_TX_GCS_DESC_ENA 13 /* 1 BIT */ + +#define ICE_TXD_CTX_QW1_DTYPE_S 0 +#define ICE_TXD_CTX_QW1_DTYPE_M (0xFUL << ICE_TXD_CTX_QW1_DTYPE_S) + +#define ICE_TXD_CTX_QW1_CMD_S 4 +#define ICE_TXD_CTX_QW1_CMD_M (0x7FUL << ICE_TXD_CTX_QW1_CMD_S) + +#define ICE_TXD_CTX_QW1_IPSEC_S 11 +#define ICE_TXD_CTX_QW1_IPSEC_M (0x7FUL << ICE_TXD_CTX_QW1_IPSEC_S) + +#define ICE_TXD_CTX_QW1_TSO_LEN_S 30 +#define ICE_TXD_CTX_QW1_TSO_LEN_M \ + (0x3FFFFULL << ICE_TXD_CTX_QW1_TSO_LEN_S) + +#define ICE_TXD_CTX_QW1_TSYN_S ICE_TXD_CTX_QW1_TSO_LEN_S +#define ICE_TXD_CTX_QW1_TSYN_M ICE_TXD_CTX_QW1_TSO_LEN_M + +#define ICE_TXD_CTX_QW1_MSS_S 50 +#define ICE_TXD_CTX_QW1_MSS_M (0x3FFFULL << ICE_TXD_CTX_QW1_MSS_S) +#define ICE_TXD_CTX_MIN_MSS 64 +#define ICE_TXD_CTX_MAX_MSS 9668 + +#define ICE_TXD_CTX_QW1_VSI_S 50 +#define ICE_TXD_CTX_QW1_VSI_M (0x3FFULL << ICE_TXD_CTX_QW1_VSI_S) + +enum ice_tx_ctx_desc_cmd_bits { + ICE_TX_CTX_DESC_TSO = 0x01, + ICE_TX_CTX_DESC_TSYN = 0x02, + ICE_TX_CTX_DESC_IL2TAG2 = 0x04, + ICE_TX_CTX_DESC_IL2TAG2_IL2H = 0x08, + ICE_TX_CTX_DESC_SWTCH_NOTAG = 0x00, + ICE_TX_CTX_DESC_SWTCH_UPLINK = 0x10, + ICE_TX_CTX_DESC_SWTCH_LOCAL = 0x20, + ICE_TX_CTX_DESC_SWTCH_VSI = 0x30, + ICE_TX_CTX_DESC_RESERVED = 0x40 +}; + +enum ice_tx_ctx_desc_eipt_offload { + ICE_TX_CTX_EIPT_NONE = 0x0, + ICE_TX_CTX_EIPT_IPV6 = 0x1, + ICE_TX_CTX_EIPT_IPV4_NO_CSUM = 0x2, + ICE_TX_CTX_EIPT_IPV4 = 0x3 +}; + +#define ICE_TXD_CTX_QW0_EIPT_S 0 +#define ICE_TXD_CTX_QW0_EIPT_M (0x3ULL << ICE_TXD_CTX_QW0_EIPT_S) + +#define ICE_TXD_CTX_QW0_EIPLEN_S 2 +#define ICE_TXD_CTX_QW0_EIPLEN_M (0x7FUL << ICE_TXD_CTX_QW0_EIPLEN_S) + +#define ICE_TXD_CTX_QW0_L4TUNT_S 9 +#define ICE_TXD_CTX_QW0_L4TUNT_M (0x3ULL << ICE_TXD_CTX_QW0_L4TUNT_S) + +#define ICE_TXD_CTX_UDP_TUNNELING BIT_ULL(ICE_TXD_CTX_QW0_L4TUNT_S) +#define ICE_TXD_CTX_GRE_TUNNELING (0x2ULL << ICE_TXD_CTX_QW0_L4TUNT_S) + +#define ICE_TXD_CTX_QW0_EIP_NOINC_S 11 +#define ICE_TXD_CTX_QW0_EIP_NOINC_M BIT_ULL(ICE_TXD_CTX_QW0_EIP_NOINC_S) + +#define ICE_TXD_CTX_EIP_NOINC_IPID_CONST ICE_TXD_CTX_QW0_EIP_NOINC_M + +#define ICE_TXD_CTX_QW0_NATLEN_S 12 +#define ICE_TXD_CTX_QW0_NATLEN_M (0X7FULL << ICE_TXD_CTX_QW0_NATLEN_S) + +#define ICE_TXD_CTX_QW0_DECTTL_S 19 +#define ICE_TXD_CTX_QW0_DECTTL_M (0xFULL << ICE_TXD_CTX_QW0_DECTTL_S) + +#define ICE_TXD_CTX_QW0_L4T_CS_S 23 +#define ICE_TXD_CTX_QW0_L4T_CS_M BIT_ULL(ICE_TXD_CTX_QW0_L4T_CS_S) + +#define ICE_LAN_TXQ_MAX_QGRPS 127 +#define ICE_LAN_TXQ_MAX_QDIS 1023 + +/* Tx queue context data + * + * The sizes of the variables may be larger than needed due to crossing byte + * boundaries. If we do not have the width of the variable set to the correct + * size then we could end up shifting bits off the top of the variable when the + * variable is at the top of a byte and crosses over into the next byte. + */ +struct ice_tlan_ctx { +#define ICE_TLAN_CTX_BASE_S 7 + uint64_t base; /* base is defined in 128-byte units */ + uint8_t port_num; + uint16_t cgd_num; /* bigger than needed, see above for reason */ + uint8_t pf_num; + uint16_t vmvf_num; + uint8_t vmvf_type; +#define ICE_TLAN_CTX_VMVF_TYPE_VF 0 +#define ICE_TLAN_CTX_VMVF_TYPE_VMQ 1 +#define ICE_TLAN_CTX_VMVF_TYPE_PF 2 + uint16_t src_vsi; + uint8_t tsyn_ena; + uint8_t internal_usage_flag; + uint8_t alt_vlan; + uint16_t cpuid; /* bigger than needed, see above for reason */ + uint8_t wb_mode; + uint8_t tphrd_desc; + uint8_t tphrd; + uint8_t tphwr_desc; + uint16_t cmpq_id; + uint16_t qnum_in_func; + uint8_t itr_notification_mode; + uint8_t adjust_prof_id; + uint32_t qlen; /* bigger than needed, see above for reason */ + uint8_t quanta_prof_idx; + uint8_t tso_ena; + uint16_t tso_qnum; + uint8_t legacy_int; + uint8_t drop_ena; + uint8_t cache_prof_idx; + uint8_t pkt_shaper_prof_idx; + uint8_t int_q_state; /* width not needed - internal - DO NOT WRITE!!! */ + uint16_t tail; +}; + +/* LAN Tx Completion Queue data */ +struct ice_tx_cmpltnq { + uint16_t txq_id; + uint8_t generation; + uint16_t tx_head; + uint8_t cmpl_type; +} __packed; + +/* FIXME: move to a .c file that references this variable */ +/* LAN Tx Completion Queue data info */ +static const struct ice_ctx_ele ice_tx_cmpltnq_info[] = { + /* Field Width LSB */ + ICE_CTX_STORE(ice_tx_cmpltnq, txq_id, 14, 0), + ICE_CTX_STORE(ice_tx_cmpltnq, generation, 1, 15), + ICE_CTX_STORE(ice_tx_cmpltnq, tx_head, 13, 16), + ICE_CTX_STORE(ice_tx_cmpltnq, cmpl_type, 3, 29), + { 0 } +}; + +/* LAN Tx Completion Queue Context */ +struct ice_tx_cmpltnq_ctx { + uint64_t base; +#define ICE_TX_CMPLTNQ_CTX_BASE_S 7 + uint32_t q_len; +#define ICE_TX_CMPLTNQ_CTX_Q_LEN_S 4 + uint8_t generation; + uint32_t wrt_ptr; + uint8_t pf_num; + uint16_t vmvf_num; + uint8_t vmvf_type; +#define ICE_TX_CMPLTNQ_CTX_VMVF_TYPE_VF 0 +#define ICE_TX_CMPLTNQ_CTX_VMVF_TYPE_VMQ 1 +#define ICE_TX_CMPLTNQ_CTX_VMVF_TYPE_PF 2 + uint8_t tph_desc_wr; + uint8_t cpuid; + uint32_t cmpltn_cache[16]; +} __packed; + +/* LAN Tx Doorbell Descriptor Format */ +struct ice_tx_drbell_fmt { + uint16_t txq_id; + uint8_t dd; + uint8_t rs; + uint32_t db; +}; + +/* FIXME: move to a .c file that references this variable */ +/* LAN Tx Doorbell Descriptor format info */ +static const struct ice_ctx_ele ice_tx_drbell_fmt_info[] = { + /* Field Width LSB */ + ICE_CTX_STORE(ice_tx_drbell_fmt, txq_id, 14, 0), + ICE_CTX_STORE(ice_tx_drbell_fmt, dd, 1, 14), + ICE_CTX_STORE(ice_tx_drbell_fmt, rs, 1, 15), + ICE_CTX_STORE(ice_tx_drbell_fmt, db, 32, 32), + { 0 } +}; + +/* LAN Tx Doorbell Queue Context */ +struct ice_tx_drbell_q_ctx { + uint64_t base; +#define ICE_TX_DRBELL_Q_CTX_BASE_S 7 + uint16_t ring_len; +#define ICE_TX_DRBELL_Q_CTX_RING_LEN_S 4 + uint8_t pf_num; + uint16_t vf_num; + uint8_t vmvf_type; +#define ICE_TX_DRBELL_Q_CTX_VMVF_TYPE_VF 0 +#define ICE_TX_DRBELL_Q_CTX_VMVF_TYPE_VMQ 1 +#define ICE_TX_DRBELL_Q_CTX_VMVF_TYPE_PF 2 + uint8_t cpuid; + uint8_t tph_desc_rd; + uint8_t tph_desc_wr; + uint8_t db_q_en; + uint16_t rd_head; + uint16_t rd_tail; +} __packed; + +/* The ice_ptype_lkup table is used to convert from the 10-bit ptype in the + * hardware to a bit-field that can be used by SW to more easily determine the + * packet type. + * + * Macros are used to shorten the table lines and make this table human + * readable. + * + * We store the PTYPE in the top byte of the bit field - this is just so that + * we can check that the table doesn't have a row missing, as the index into + * the table should be the PTYPE. + * + * Typical work flow: + * + * IF NOT ice_ptype_lkup[ptype].known + * THEN + * Packet is unknown + * ELSE IF ice_ptype_lkup[ptype].outer_ip == ICE_RX_PTYPE_OUTER_IP + * Use the rest of the fields to look at the tunnels, inner protocols, etc + * ELSE + * Use the enum ice_rx_l2_ptype to decode the packet type + * ENDIF + */ + +/* macro to make the table lines short */ +#define ICE_PTT(PTYPE, OUTER_IP, OUTER_IP_VER, OUTER_FRAG, T, TE, TEF, I, PL)\ + { 1, \ + ICE_RX_PTYPE_OUTER_##OUTER_IP, \ + ICE_RX_PTYPE_OUTER_##OUTER_IP_VER, \ + ICE_RX_PTYPE_##OUTER_FRAG, \ + ICE_RX_PTYPE_TUNNEL_##T, \ + ICE_RX_PTYPE_TUNNEL_END_##TE, \ + ICE_RX_PTYPE_##TEF, \ + ICE_RX_PTYPE_INNER_PROT_##I, \ + ICE_RX_PTYPE_PAYLOAD_LAYER_##PL } + +#define ICE_PTT_UNUSED_ENTRY(PTYPE) { 0, 0, 0, 0, 0, 0, 0, 0, 0 } + +/* shorter macros makes the table fit but are terse */ +#define ICE_RX_PTYPE_NOF ICE_RX_PTYPE_NOT_FRAG +#define ICE_RX_PTYPE_FRG ICE_RX_PTYPE_FRAG + +/* Lookup table mapping the 10-bit HW PTYPE to the bit field for decoding */ +static const struct ice_rx_ptype_decoded ice_ptype_lkup[1024] = { + /* L2 Packet types */ + ICE_PTT_UNUSED_ENTRY(0), + ICE_PTT(1, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2), + ICE_PTT_UNUSED_ENTRY(2), + ICE_PTT_UNUSED_ENTRY(3), + ICE_PTT_UNUSED_ENTRY(4), + ICE_PTT_UNUSED_ENTRY(5), + ICE_PTT(6, L2, NONE, NOF, NONE, NONE, NOF, NONE, NONE), + ICE_PTT(7, L2, NONE, NOF, NONE, NONE, NOF, NONE, NONE), + ICE_PTT_UNUSED_ENTRY(8), + ICE_PTT_UNUSED_ENTRY(9), + ICE_PTT(10, L2, NONE, NOF, NONE, NONE, NOF, NONE, NONE), + ICE_PTT(11, L2, NONE, NOF, NONE, NONE, NOF, NONE, NONE), + ICE_PTT_UNUSED_ENTRY(12), + ICE_PTT_UNUSED_ENTRY(13), + ICE_PTT_UNUSED_ENTRY(14), + ICE_PTT_UNUSED_ENTRY(15), + ICE_PTT_UNUSED_ENTRY(16), + ICE_PTT_UNUSED_ENTRY(17), + ICE_PTT_UNUSED_ENTRY(18), + ICE_PTT_UNUSED_ENTRY(19), + ICE_PTT_UNUSED_ENTRY(20), + ICE_PTT_UNUSED_ENTRY(21), + + /* Non Tunneled IPv4 */ + ICE_PTT(22, IP, IPV4, FRG, NONE, NONE, NOF, NONE, PAY3), + ICE_PTT(23, IP, IPV4, NOF, NONE, NONE, NOF, NONE, PAY3), + ICE_PTT(24, IP, IPV4, NOF, NONE, NONE, NOF, UDP, PAY4), + ICE_PTT_UNUSED_ENTRY(25), + ICE_PTT(26, IP, IPV4, NOF, NONE, NONE, NOF, TCP, PAY4), + ICE_PTT(27, IP, IPV4, NOF, NONE, NONE, NOF, SCTP, PAY4), + ICE_PTT(28, IP, IPV4, NOF, NONE, NONE, NOF, ICMP, PAY4), + + /* IPv4 --> IPv4 */ + ICE_PTT(29, IP, IPV4, NOF, IP_IP, IPV4, FRG, NONE, PAY3), + ICE_PTT(30, IP, IPV4, NOF, IP_IP, IPV4, NOF, NONE, PAY3), + ICE_PTT(31, IP, IPV4, NOF, IP_IP, IPV4, NOF, UDP, PAY4), + ICE_PTT_UNUSED_ENTRY(32), + ICE_PTT(33, IP, IPV4, NOF, IP_IP, IPV4, NOF, TCP, PAY4), + ICE_PTT(34, IP, IPV4, NOF, IP_IP, IPV4, NOF, SCTP, PAY4), + ICE_PTT(35, IP, IPV4, NOF, IP_IP, IPV4, NOF, ICMP, PAY4), + + /* IPv4 --> IPv6 */ + ICE_PTT(36, IP, IPV4, NOF, IP_IP, IPV6, FRG, NONE, PAY3), + ICE_PTT(37, IP, IPV4, NOF, IP_IP, IPV6, NOF, NONE, PAY3), + ICE_PTT(38, IP, IPV4, NOF, IP_IP, IPV6, NOF, UDP, PAY4), + ICE_PTT_UNUSED_ENTRY(39), + ICE_PTT(40, IP, IPV4, NOF, IP_IP, IPV6, NOF, TCP, PAY4), + ICE_PTT(41, IP, IPV4, NOF, IP_IP, IPV6, NOF, SCTP, PAY4), + ICE_PTT(42, IP, IPV4, NOF, IP_IP, IPV6, NOF, ICMP, PAY4), + + /* IPv4 --> GRE/NAT */ + ICE_PTT(43, IP, IPV4, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3), + + /* IPv4 --> GRE/NAT --> IPv4 */ + ICE_PTT(44, IP, IPV4, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3), + ICE_PTT(45, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3), + ICE_PTT(46, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4), + ICE_PTT_UNUSED_ENTRY(47), + ICE_PTT(48, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4), + ICE_PTT(49, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4), + ICE_PTT(50, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4), + + /* IPv4 --> GRE/NAT --> IPv6 */ + ICE_PTT(51, IP, IPV4, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3), + ICE_PTT(52, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3), + ICE_PTT(53, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4), + ICE_PTT_UNUSED_ENTRY(54), + ICE_PTT(55, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4), + ICE_PTT(56, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4), + ICE_PTT(57, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4), + + /* IPv4 --> GRE/NAT --> MAC */ + ICE_PTT(58, IP, IPV4, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3), + + /* IPv4 --> GRE/NAT --> MAC --> IPv4 */ + ICE_PTT(59, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3), + ICE_PTT(60, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3), + ICE_PTT(61, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4), + ICE_PTT_UNUSED_ENTRY(62), + ICE_PTT(63, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4), + ICE_PTT(64, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4), + ICE_PTT(65, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4), + + /* IPv4 --> GRE/NAT -> MAC --> IPv6 */ + ICE_PTT(66, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3), + ICE_PTT(67, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3), + ICE_PTT(68, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4), + ICE_PTT_UNUSED_ENTRY(69), + ICE_PTT(70, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4), + ICE_PTT(71, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4), + ICE_PTT(72, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4), + + /* IPv4 --> GRE/NAT --> MAC/VLAN */ + ICE_PTT(73, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3), + + /* IPv4 ---> GRE/NAT -> MAC/VLAN --> IPv4 */ + ICE_PTT(74, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3), + ICE_PTT(75, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3), + ICE_PTT(76, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4), + ICE_PTT_UNUSED_ENTRY(77), + ICE_PTT(78, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4), + ICE_PTT(79, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4), + ICE_PTT(80, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4), + + /* IPv4 -> GRE/NAT -> MAC/VLAN --> IPv6 */ + ICE_PTT(81, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3), + ICE_PTT(82, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3), + ICE_PTT(83, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4), + ICE_PTT_UNUSED_ENTRY(84), + ICE_PTT(85, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4), + ICE_PTT(86, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4), + ICE_PTT(87, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4), + + /* Non Tunneled IPv6 */ + ICE_PTT(88, IP, IPV6, FRG, NONE, NONE, NOF, NONE, PAY3), + ICE_PTT(89, IP, IPV6, NOF, NONE, NONE, NOF, NONE, PAY3), + ICE_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP, PAY4), + ICE_PTT_UNUSED_ENTRY(91), + ICE_PTT(92, IP, IPV6, NOF, NONE, NONE, NOF, TCP, PAY4), + ICE_PTT(93, IP, IPV6, NOF, NONE, NONE, NOF, SCTP, PAY4), + ICE_PTT(94, IP, IPV6, NOF, NONE, NONE, NOF, ICMP, PAY4), + + /* IPv6 --> IPv4 */ + ICE_PTT(95, IP, IPV6, NOF, IP_IP, IPV4, FRG, NONE, PAY3), + ICE_PTT(96, IP, IPV6, NOF, IP_IP, IPV4, NOF, NONE, PAY3), + ICE_PTT(97, IP, IPV6, NOF, IP_IP, IPV4, NOF, UDP, PAY4), + ICE_PTT_UNUSED_ENTRY(98), + ICE_PTT(99, IP, IPV6, NOF, IP_IP, IPV4, NOF, TCP, PAY4), + ICE_PTT(100, IP, IPV6, NOF, IP_IP, IPV4, NOF, SCTP, PAY4), + ICE_PTT(101, IP, IPV6, NOF, IP_IP, IPV4, NOF, ICMP, PAY4), + + /* IPv6 --> IPv6 */ + ICE_PTT(102, IP, IPV6, NOF, IP_IP, IPV6, FRG, NONE, PAY3), + ICE_PTT(103, IP, IPV6, NOF, IP_IP, IPV6, NOF, NONE, PAY3), + ICE_PTT(104, IP, IPV6, NOF, IP_IP, IPV6, NOF, UDP, PAY4), + ICE_PTT_UNUSED_ENTRY(105), + ICE_PTT(106, IP, IPV6, NOF, IP_IP, IPV6, NOF, TCP, PAY4), + ICE_PTT(107, IP, IPV6, NOF, IP_IP, IPV6, NOF, SCTP, PAY4), + ICE_PTT(108, IP, IPV6, NOF, IP_IP, IPV6, NOF, ICMP, PAY4), + + /* IPv6 --> GRE/NAT */ + ICE_PTT(109, IP, IPV6, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3), + + /* IPv6 --> GRE/NAT -> IPv4 */ + ICE_PTT(110, IP, IPV6, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3), + ICE_PTT(111, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3), + ICE_PTT(112, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4), + ICE_PTT_UNUSED_ENTRY(113), + ICE_PTT(114, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4), + ICE_PTT(115, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4), + ICE_PTT(116, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4), + + /* IPv6 --> GRE/NAT -> IPv6 */ + ICE_PTT(117, IP, IPV6, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3), + ICE_PTT(118, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3), + ICE_PTT(119, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4), + ICE_PTT_UNUSED_ENTRY(120), + ICE_PTT(121, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4), + ICE_PTT(122, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4), + ICE_PTT(123, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4), + + /* IPv6 --> GRE/NAT -> MAC */ + ICE_PTT(124, IP, IPV6, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3), + + /* IPv6 --> GRE/NAT -> MAC -> IPv4 */ + ICE_PTT(125, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3), + ICE_PTT(126, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3), + ICE_PTT(127, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4), + ICE_PTT_UNUSED_ENTRY(128), + ICE_PTT(129, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4), + ICE_PTT(130, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4), + ICE_PTT(131, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4), + + /* IPv6 --> GRE/NAT -> MAC -> IPv6 */ + ICE_PTT(132, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3), + ICE_PTT(133, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3), + ICE_PTT(134, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4), + ICE_PTT_UNUSED_ENTRY(135), + ICE_PTT(136, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4), + ICE_PTT(137, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4), + ICE_PTT(138, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4), + + /* IPv6 --> GRE/NAT -> MAC/VLAN */ + ICE_PTT(139, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3), + + /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv4 */ + ICE_PTT(140, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3), + ICE_PTT(141, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3), + ICE_PTT(142, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4), + ICE_PTT_UNUSED_ENTRY(143), + ICE_PTT(144, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4), + ICE_PTT(145, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4), + ICE_PTT(146, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4), + + /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv6 */ + ICE_PTT(147, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3), + ICE_PTT(148, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3), + ICE_PTT(149, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4), + ICE_PTT_UNUSED_ENTRY(150), + ICE_PTT(151, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4), + ICE_PTT(152, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4), + ICE_PTT(153, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4), + + /* unused entries */ + ICE_PTT_UNUSED_ENTRY(154), + ICE_PTT_UNUSED_ENTRY(155), + ICE_PTT_UNUSED_ENTRY(156), + ICE_PTT_UNUSED_ENTRY(157), + ICE_PTT_UNUSED_ENTRY(158), + ICE_PTT_UNUSED_ENTRY(159), + + ICE_PTT_UNUSED_ENTRY(160), + ICE_PTT_UNUSED_ENTRY(161), + ICE_PTT_UNUSED_ENTRY(162), + ICE_PTT_UNUSED_ENTRY(163), + ICE_PTT_UNUSED_ENTRY(164), + ICE_PTT_UNUSED_ENTRY(165), + ICE_PTT_UNUSED_ENTRY(166), + ICE_PTT_UNUSED_ENTRY(167), + ICE_PTT_UNUSED_ENTRY(168), + ICE_PTT_UNUSED_ENTRY(169), + + ICE_PTT_UNUSED_ENTRY(170), + ICE_PTT_UNUSED_ENTRY(171), + ICE_PTT_UNUSED_ENTRY(172), + ICE_PTT_UNUSED_ENTRY(173), + ICE_PTT_UNUSED_ENTRY(174), + ICE_PTT_UNUSED_ENTRY(175), + ICE_PTT_UNUSED_ENTRY(176), + ICE_PTT_UNUSED_ENTRY(177), + ICE_PTT_UNUSED_ENTRY(178), + ICE_PTT_UNUSED_ENTRY(179), + + ICE_PTT_UNUSED_ENTRY(180), + ICE_PTT_UNUSED_ENTRY(181), + ICE_PTT_UNUSED_ENTRY(182), + ICE_PTT_UNUSED_ENTRY(183), + ICE_PTT_UNUSED_ENTRY(184), + ICE_PTT_UNUSED_ENTRY(185), + ICE_PTT_UNUSED_ENTRY(186), + ICE_PTT_UNUSED_ENTRY(187), + ICE_PTT_UNUSED_ENTRY(188), + ICE_PTT_UNUSED_ENTRY(189), + + ICE_PTT_UNUSED_ENTRY(190), + ICE_PTT_UNUSED_ENTRY(191), + ICE_PTT_UNUSED_ENTRY(192), + ICE_PTT_UNUSED_ENTRY(193), + ICE_PTT_UNUSED_ENTRY(194), + ICE_PTT_UNUSED_ENTRY(195), + ICE_PTT_UNUSED_ENTRY(196), + ICE_PTT_UNUSED_ENTRY(197), + ICE_PTT_UNUSED_ENTRY(198), + ICE_PTT_UNUSED_ENTRY(199), + + ICE_PTT_UNUSED_ENTRY(200), + ICE_PTT_UNUSED_ENTRY(201), + ICE_PTT_UNUSED_ENTRY(202), + ICE_PTT_UNUSED_ENTRY(203), + ICE_PTT_UNUSED_ENTRY(204), + ICE_PTT_UNUSED_ENTRY(205), + ICE_PTT_UNUSED_ENTRY(206), + ICE_PTT_UNUSED_ENTRY(207), + ICE_PTT_UNUSED_ENTRY(208), + ICE_PTT_UNUSED_ENTRY(209), + + ICE_PTT_UNUSED_ENTRY(210), + ICE_PTT_UNUSED_ENTRY(211), + ICE_PTT_UNUSED_ENTRY(212), + ICE_PTT_UNUSED_ENTRY(213), + ICE_PTT_UNUSED_ENTRY(214), + ICE_PTT_UNUSED_ENTRY(215), + ICE_PTT_UNUSED_ENTRY(216), + ICE_PTT_UNUSED_ENTRY(217), + ICE_PTT_UNUSED_ENTRY(218), + ICE_PTT_UNUSED_ENTRY(219), + + ICE_PTT_UNUSED_ENTRY(220), + ICE_PTT_UNUSED_ENTRY(221), + ICE_PTT_UNUSED_ENTRY(222), + ICE_PTT_UNUSED_ENTRY(223), + ICE_PTT_UNUSED_ENTRY(224), + ICE_PTT_UNUSED_ENTRY(225), + ICE_PTT_UNUSED_ENTRY(226), + ICE_PTT_UNUSED_ENTRY(227), + ICE_PTT_UNUSED_ENTRY(228), + ICE_PTT_UNUSED_ENTRY(229), + + ICE_PTT_UNUSED_ENTRY(230), + ICE_PTT_UNUSED_ENTRY(231), + ICE_PTT_UNUSED_ENTRY(232), + ICE_PTT_UNUSED_ENTRY(233), + ICE_PTT_UNUSED_ENTRY(234), + ICE_PTT_UNUSED_ENTRY(235), + ICE_PTT_UNUSED_ENTRY(236), + ICE_PTT_UNUSED_ENTRY(237), + ICE_PTT_UNUSED_ENTRY(238), + ICE_PTT_UNUSED_ENTRY(239), + + ICE_PTT_UNUSED_ENTRY(240), + ICE_PTT_UNUSED_ENTRY(241), + ICE_PTT_UNUSED_ENTRY(242), + ICE_PTT_UNUSED_ENTRY(243), + ICE_PTT_UNUSED_ENTRY(244), + ICE_PTT_UNUSED_ENTRY(245), + ICE_PTT_UNUSED_ENTRY(246), + ICE_PTT_UNUSED_ENTRY(247), + ICE_PTT_UNUSED_ENTRY(248), + ICE_PTT_UNUSED_ENTRY(249), + + ICE_PTT_UNUSED_ENTRY(250), + ICE_PTT_UNUSED_ENTRY(251), + ICE_PTT_UNUSED_ENTRY(252), + ICE_PTT_UNUSED_ENTRY(253), + ICE_PTT_UNUSED_ENTRY(254), + ICE_PTT_UNUSED_ENTRY(255), + ICE_PTT_UNUSED_ENTRY(256), + ICE_PTT_UNUSED_ENTRY(257), + ICE_PTT_UNUSED_ENTRY(258), + ICE_PTT_UNUSED_ENTRY(259), + + ICE_PTT_UNUSED_ENTRY(260), + ICE_PTT_UNUSED_ENTRY(261), + ICE_PTT_UNUSED_ENTRY(262), + ICE_PTT_UNUSED_ENTRY(263), + ICE_PTT_UNUSED_ENTRY(264), + ICE_PTT_UNUSED_ENTRY(265), + ICE_PTT_UNUSED_ENTRY(266), + ICE_PTT_UNUSED_ENTRY(267), + ICE_PTT_UNUSED_ENTRY(268), + ICE_PTT_UNUSED_ENTRY(269), + + ICE_PTT_UNUSED_ENTRY(270), + ICE_PTT_UNUSED_ENTRY(271), + ICE_PTT_UNUSED_ENTRY(272), + ICE_PTT_UNUSED_ENTRY(273), + ICE_PTT_UNUSED_ENTRY(274), + ICE_PTT_UNUSED_ENTRY(275), + ICE_PTT_UNUSED_ENTRY(276), + ICE_PTT_UNUSED_ENTRY(277), + ICE_PTT_UNUSED_ENTRY(278), + ICE_PTT_UNUSED_ENTRY(279), + + ICE_PTT_UNUSED_ENTRY(280), + ICE_PTT_UNUSED_ENTRY(281), + ICE_PTT_UNUSED_ENTRY(282), + ICE_PTT_UNUSED_ENTRY(283), + ICE_PTT_UNUSED_ENTRY(284), + ICE_PTT_UNUSED_ENTRY(285), + ICE_PTT_UNUSED_ENTRY(286), + ICE_PTT_UNUSED_ENTRY(287), + ICE_PTT_UNUSED_ENTRY(288), + ICE_PTT_UNUSED_ENTRY(289), + + ICE_PTT_UNUSED_ENTRY(290), + ICE_PTT_UNUSED_ENTRY(291), + ICE_PTT_UNUSED_ENTRY(292), + ICE_PTT_UNUSED_ENTRY(293), + ICE_PTT_UNUSED_ENTRY(294), + ICE_PTT_UNUSED_ENTRY(295), + ICE_PTT_UNUSED_ENTRY(296), + ICE_PTT_UNUSED_ENTRY(297), + ICE_PTT_UNUSED_ENTRY(298), + ICE_PTT_UNUSED_ENTRY(299), + + ICE_PTT_UNUSED_ENTRY(300), + ICE_PTT_UNUSED_ENTRY(301), + ICE_PTT_UNUSED_ENTRY(302), + ICE_PTT_UNUSED_ENTRY(303), + ICE_PTT_UNUSED_ENTRY(304), + ICE_PTT_UNUSED_ENTRY(305), + ICE_PTT_UNUSED_ENTRY(306), + ICE_PTT_UNUSED_ENTRY(307), + ICE_PTT_UNUSED_ENTRY(308), + ICE_PTT_UNUSED_ENTRY(309), + + ICE_PTT_UNUSED_ENTRY(310), + ICE_PTT_UNUSED_ENTRY(311), + ICE_PTT_UNUSED_ENTRY(312), + ICE_PTT_UNUSED_ENTRY(313), + ICE_PTT_UNUSED_ENTRY(314), + ICE_PTT_UNUSED_ENTRY(315), + ICE_PTT_UNUSED_ENTRY(316), + ICE_PTT_UNUSED_ENTRY(317), + ICE_PTT_UNUSED_ENTRY(318), + ICE_PTT_UNUSED_ENTRY(319), + + ICE_PTT_UNUSED_ENTRY(320), + ICE_PTT_UNUSED_ENTRY(321), + ICE_PTT_UNUSED_ENTRY(322), + ICE_PTT_UNUSED_ENTRY(323), + ICE_PTT_UNUSED_ENTRY(324), + ICE_PTT_UNUSED_ENTRY(325), + ICE_PTT_UNUSED_ENTRY(326), + ICE_PTT_UNUSED_ENTRY(327), + ICE_PTT_UNUSED_ENTRY(328), + ICE_PTT_UNUSED_ENTRY(329), + + ICE_PTT_UNUSED_ENTRY(330), + ICE_PTT_UNUSED_ENTRY(331), + ICE_PTT_UNUSED_ENTRY(332), + ICE_PTT_UNUSED_ENTRY(333), + ICE_PTT_UNUSED_ENTRY(334), + ICE_PTT_UNUSED_ENTRY(335), + ICE_PTT_UNUSED_ENTRY(336), + ICE_PTT_UNUSED_ENTRY(337), + ICE_PTT_UNUSED_ENTRY(338), + ICE_PTT_UNUSED_ENTRY(339), + + ICE_PTT_UNUSED_ENTRY(340), + ICE_PTT_UNUSED_ENTRY(341), + ICE_PTT_UNUSED_ENTRY(342), + ICE_PTT_UNUSED_ENTRY(343), + ICE_PTT_UNUSED_ENTRY(344), + ICE_PTT_UNUSED_ENTRY(345), + ICE_PTT_UNUSED_ENTRY(346), + ICE_PTT_UNUSED_ENTRY(347), + ICE_PTT_UNUSED_ENTRY(348), + ICE_PTT_UNUSED_ENTRY(349), + + ICE_PTT_UNUSED_ENTRY(350), + ICE_PTT_UNUSED_ENTRY(351), + ICE_PTT_UNUSED_ENTRY(352), + ICE_PTT_UNUSED_ENTRY(353), + ICE_PTT_UNUSED_ENTRY(354), + ICE_PTT_UNUSED_ENTRY(355), + ICE_PTT_UNUSED_ENTRY(356), + ICE_PTT_UNUSED_ENTRY(357), + ICE_PTT_UNUSED_ENTRY(358), + ICE_PTT_UNUSED_ENTRY(359), + + ICE_PTT_UNUSED_ENTRY(360), + ICE_PTT_UNUSED_ENTRY(361), + ICE_PTT_UNUSED_ENTRY(362), + ICE_PTT_UNUSED_ENTRY(363), + ICE_PTT_UNUSED_ENTRY(364), + ICE_PTT_UNUSED_ENTRY(365), + ICE_PTT_UNUSED_ENTRY(366), + ICE_PTT_UNUSED_ENTRY(367), + ICE_PTT_UNUSED_ENTRY(368), + ICE_PTT_UNUSED_ENTRY(369), + + ICE_PTT_UNUSED_ENTRY(370), + ICE_PTT_UNUSED_ENTRY(371), + ICE_PTT_UNUSED_ENTRY(372), + ICE_PTT_UNUSED_ENTRY(373), + ICE_PTT_UNUSED_ENTRY(374), + ICE_PTT_UNUSED_ENTRY(375), + ICE_PTT_UNUSED_ENTRY(376), + ICE_PTT_UNUSED_ENTRY(377), + ICE_PTT_UNUSED_ENTRY(378), + ICE_PTT_UNUSED_ENTRY(379), + + ICE_PTT_UNUSED_ENTRY(380), + ICE_PTT_UNUSED_ENTRY(381), + ICE_PTT_UNUSED_ENTRY(382), + ICE_PTT_UNUSED_ENTRY(383), + ICE_PTT_UNUSED_ENTRY(384), + ICE_PTT_UNUSED_ENTRY(385), + ICE_PTT_UNUSED_ENTRY(386), + ICE_PTT_UNUSED_ENTRY(387), + ICE_PTT_UNUSED_ENTRY(388), + ICE_PTT_UNUSED_ENTRY(389), + + ICE_PTT_UNUSED_ENTRY(390), + ICE_PTT_UNUSED_ENTRY(391), + ICE_PTT_UNUSED_ENTRY(392), + ICE_PTT_UNUSED_ENTRY(393), + ICE_PTT_UNUSED_ENTRY(394), + ICE_PTT_UNUSED_ENTRY(395), + ICE_PTT_UNUSED_ENTRY(396), + ICE_PTT_UNUSED_ENTRY(397), + ICE_PTT_UNUSED_ENTRY(398), + ICE_PTT_UNUSED_ENTRY(399), + + ICE_PTT_UNUSED_ENTRY(400), + ICE_PTT_UNUSED_ENTRY(401), + ICE_PTT_UNUSED_ENTRY(402), + ICE_PTT_UNUSED_ENTRY(403), + ICE_PTT_UNUSED_ENTRY(404), + ICE_PTT_UNUSED_ENTRY(405), + ICE_PTT_UNUSED_ENTRY(406), + ICE_PTT_UNUSED_ENTRY(407), + ICE_PTT_UNUSED_ENTRY(408), + ICE_PTT_UNUSED_ENTRY(409), + + ICE_PTT_UNUSED_ENTRY(410), + ICE_PTT_UNUSED_ENTRY(411), + ICE_PTT_UNUSED_ENTRY(412), + ICE_PTT_UNUSED_ENTRY(413), + ICE_PTT_UNUSED_ENTRY(414), + ICE_PTT_UNUSED_ENTRY(415), + ICE_PTT_UNUSED_ENTRY(416), + ICE_PTT_UNUSED_ENTRY(417), + ICE_PTT_UNUSED_ENTRY(418), + ICE_PTT_UNUSED_ENTRY(419), + + ICE_PTT_UNUSED_ENTRY(420), + ICE_PTT_UNUSED_ENTRY(421), + ICE_PTT_UNUSED_ENTRY(422), + ICE_PTT_UNUSED_ENTRY(423), + ICE_PTT_UNUSED_ENTRY(424), + ICE_PTT_UNUSED_ENTRY(425), + ICE_PTT_UNUSED_ENTRY(426), + ICE_PTT_UNUSED_ENTRY(427), + ICE_PTT_UNUSED_ENTRY(428), + ICE_PTT_UNUSED_ENTRY(429), + + ICE_PTT_UNUSED_ENTRY(430), + ICE_PTT_UNUSED_ENTRY(431), + ICE_PTT_UNUSED_ENTRY(432), + ICE_PTT_UNUSED_ENTRY(433), + ICE_PTT_UNUSED_ENTRY(434), + ICE_PTT_UNUSED_ENTRY(435), + ICE_PTT_UNUSED_ENTRY(436), + ICE_PTT_UNUSED_ENTRY(437), + ICE_PTT_UNUSED_ENTRY(438), + ICE_PTT_UNUSED_ENTRY(439), + + ICE_PTT_UNUSED_ENTRY(440), + ICE_PTT_UNUSED_ENTRY(441), + ICE_PTT_UNUSED_ENTRY(442), + ICE_PTT_UNUSED_ENTRY(443), + ICE_PTT_UNUSED_ENTRY(444), + ICE_PTT_UNUSED_ENTRY(445), + ICE_PTT_UNUSED_ENTRY(446), + ICE_PTT_UNUSED_ENTRY(447), + ICE_PTT_UNUSED_ENTRY(448), + ICE_PTT_UNUSED_ENTRY(449), + + ICE_PTT_UNUSED_ENTRY(450), + ICE_PTT_UNUSED_ENTRY(451), + ICE_PTT_UNUSED_ENTRY(452), + ICE_PTT_UNUSED_ENTRY(453), + ICE_PTT_UNUSED_ENTRY(454), + ICE_PTT_UNUSED_ENTRY(455), + ICE_PTT_UNUSED_ENTRY(456), + ICE_PTT_UNUSED_ENTRY(457), + ICE_PTT_UNUSED_ENTRY(458), + ICE_PTT_UNUSED_ENTRY(459), + + ICE_PTT_UNUSED_ENTRY(460), + ICE_PTT_UNUSED_ENTRY(461), + ICE_PTT_UNUSED_ENTRY(462), + ICE_PTT_UNUSED_ENTRY(463), + ICE_PTT_UNUSED_ENTRY(464), + ICE_PTT_UNUSED_ENTRY(465), + ICE_PTT_UNUSED_ENTRY(466), + ICE_PTT_UNUSED_ENTRY(467), + ICE_PTT_UNUSED_ENTRY(468), + ICE_PTT_UNUSED_ENTRY(469), + + ICE_PTT_UNUSED_ENTRY(470), + ICE_PTT_UNUSED_ENTRY(471), + ICE_PTT_UNUSED_ENTRY(472), + ICE_PTT_UNUSED_ENTRY(473), + ICE_PTT_UNUSED_ENTRY(474), + ICE_PTT_UNUSED_ENTRY(475), + ICE_PTT_UNUSED_ENTRY(476), + ICE_PTT_UNUSED_ENTRY(477), + ICE_PTT_UNUSED_ENTRY(478), + ICE_PTT_UNUSED_ENTRY(479), + + ICE_PTT_UNUSED_ENTRY(480), + ICE_PTT_UNUSED_ENTRY(481), + ICE_PTT_UNUSED_ENTRY(482), + ICE_PTT_UNUSED_ENTRY(483), + ICE_PTT_UNUSED_ENTRY(484), + ICE_PTT_UNUSED_ENTRY(485), + ICE_PTT_UNUSED_ENTRY(486), + ICE_PTT_UNUSED_ENTRY(487), + ICE_PTT_UNUSED_ENTRY(488), + ICE_PTT_UNUSED_ENTRY(489), + + ICE_PTT_UNUSED_ENTRY(490), + ICE_PTT_UNUSED_ENTRY(491), + ICE_PTT_UNUSED_ENTRY(492), + ICE_PTT_UNUSED_ENTRY(493), + ICE_PTT_UNUSED_ENTRY(494), + ICE_PTT_UNUSED_ENTRY(495), + ICE_PTT_UNUSED_ENTRY(496), + ICE_PTT_UNUSED_ENTRY(497), + ICE_PTT_UNUSED_ENTRY(498), + ICE_PTT_UNUSED_ENTRY(499), + + ICE_PTT_UNUSED_ENTRY(500), + ICE_PTT_UNUSED_ENTRY(501), + ICE_PTT_UNUSED_ENTRY(502), + ICE_PTT_UNUSED_ENTRY(503), + ICE_PTT_UNUSED_ENTRY(504), + ICE_PTT_UNUSED_ENTRY(505), + ICE_PTT_UNUSED_ENTRY(506), + ICE_PTT_UNUSED_ENTRY(507), + ICE_PTT_UNUSED_ENTRY(508), + ICE_PTT_UNUSED_ENTRY(509), + + ICE_PTT_UNUSED_ENTRY(510), + ICE_PTT_UNUSED_ENTRY(511), + ICE_PTT_UNUSED_ENTRY(512), + ICE_PTT_UNUSED_ENTRY(513), + ICE_PTT_UNUSED_ENTRY(514), + ICE_PTT_UNUSED_ENTRY(515), + ICE_PTT_UNUSED_ENTRY(516), + ICE_PTT_UNUSED_ENTRY(517), + ICE_PTT_UNUSED_ENTRY(518), + ICE_PTT_UNUSED_ENTRY(519), + + ICE_PTT_UNUSED_ENTRY(520), + ICE_PTT_UNUSED_ENTRY(521), + ICE_PTT_UNUSED_ENTRY(522), + ICE_PTT_UNUSED_ENTRY(523), + ICE_PTT_UNUSED_ENTRY(524), + ICE_PTT_UNUSED_ENTRY(525), + ICE_PTT_UNUSED_ENTRY(526), + ICE_PTT_UNUSED_ENTRY(527), + ICE_PTT_UNUSED_ENTRY(528), + ICE_PTT_UNUSED_ENTRY(529), + + ICE_PTT_UNUSED_ENTRY(530), + ICE_PTT_UNUSED_ENTRY(531), + ICE_PTT_UNUSED_ENTRY(532), + ICE_PTT_UNUSED_ENTRY(533), + ICE_PTT_UNUSED_ENTRY(534), + ICE_PTT_UNUSED_ENTRY(535), + ICE_PTT_UNUSED_ENTRY(536), + ICE_PTT_UNUSED_ENTRY(537), + ICE_PTT_UNUSED_ENTRY(538), + ICE_PTT_UNUSED_ENTRY(539), + + ICE_PTT_UNUSED_ENTRY(540), + ICE_PTT_UNUSED_ENTRY(541), + ICE_PTT_UNUSED_ENTRY(542), + ICE_PTT_UNUSED_ENTRY(543), + ICE_PTT_UNUSED_ENTRY(544), + ICE_PTT_UNUSED_ENTRY(545), + ICE_PTT_UNUSED_ENTRY(546), + ICE_PTT_UNUSED_ENTRY(547), + ICE_PTT_UNUSED_ENTRY(548), + ICE_PTT_UNUSED_ENTRY(549), + + ICE_PTT_UNUSED_ENTRY(550), + ICE_PTT_UNUSED_ENTRY(551), + ICE_PTT_UNUSED_ENTRY(552), + ICE_PTT_UNUSED_ENTRY(553), + ICE_PTT_UNUSED_ENTRY(554), + ICE_PTT_UNUSED_ENTRY(555), + ICE_PTT_UNUSED_ENTRY(556), + ICE_PTT_UNUSED_ENTRY(557), + ICE_PTT_UNUSED_ENTRY(558), + ICE_PTT_UNUSED_ENTRY(559), + + ICE_PTT_UNUSED_ENTRY(560), + ICE_PTT_UNUSED_ENTRY(561), + ICE_PTT_UNUSED_ENTRY(562), + ICE_PTT_UNUSED_ENTRY(563), + ICE_PTT_UNUSED_ENTRY(564), + ICE_PTT_UNUSED_ENTRY(565), + ICE_PTT_UNUSED_ENTRY(566), + ICE_PTT_UNUSED_ENTRY(567), + ICE_PTT_UNUSED_ENTRY(568), + ICE_PTT_UNUSED_ENTRY(569), + + ICE_PTT_UNUSED_ENTRY(570), + ICE_PTT_UNUSED_ENTRY(571), + ICE_PTT_UNUSED_ENTRY(572), + ICE_PTT_UNUSED_ENTRY(573), + ICE_PTT_UNUSED_ENTRY(574), + ICE_PTT_UNUSED_ENTRY(575), + ICE_PTT_UNUSED_ENTRY(576), + ICE_PTT_UNUSED_ENTRY(577), + ICE_PTT_UNUSED_ENTRY(578), + ICE_PTT_UNUSED_ENTRY(579), + + ICE_PTT_UNUSED_ENTRY(580), + ICE_PTT_UNUSED_ENTRY(581), + ICE_PTT_UNUSED_ENTRY(582), + ICE_PTT_UNUSED_ENTRY(583), + ICE_PTT_UNUSED_ENTRY(584), + ICE_PTT_UNUSED_ENTRY(585), + ICE_PTT_UNUSED_ENTRY(586), + ICE_PTT_UNUSED_ENTRY(587), + ICE_PTT_UNUSED_ENTRY(588), + ICE_PTT_UNUSED_ENTRY(589), + + ICE_PTT_UNUSED_ENTRY(590), + ICE_PTT_UNUSED_ENTRY(591), + ICE_PTT_UNUSED_ENTRY(592), + ICE_PTT_UNUSED_ENTRY(593), + ICE_PTT_UNUSED_ENTRY(594), + ICE_PTT_UNUSED_ENTRY(595), + ICE_PTT_UNUSED_ENTRY(596), + ICE_PTT_UNUSED_ENTRY(597), + ICE_PTT_UNUSED_ENTRY(598), + ICE_PTT_UNUSED_ENTRY(599), + + ICE_PTT_UNUSED_ENTRY(600), + ICE_PTT_UNUSED_ENTRY(601), + ICE_PTT_UNUSED_ENTRY(602), + ICE_PTT_UNUSED_ENTRY(603), + ICE_PTT_UNUSED_ENTRY(604), + ICE_PTT_UNUSED_ENTRY(605), + ICE_PTT_UNUSED_ENTRY(606), + ICE_PTT_UNUSED_ENTRY(607), + ICE_PTT_UNUSED_ENTRY(608), + ICE_PTT_UNUSED_ENTRY(609), + + ICE_PTT_UNUSED_ENTRY(610), + ICE_PTT_UNUSED_ENTRY(611), + ICE_PTT_UNUSED_ENTRY(612), + ICE_PTT_UNUSED_ENTRY(613), + ICE_PTT_UNUSED_ENTRY(614), + ICE_PTT_UNUSED_ENTRY(615), + ICE_PTT_UNUSED_ENTRY(616), + ICE_PTT_UNUSED_ENTRY(617), + ICE_PTT_UNUSED_ENTRY(618), + ICE_PTT_UNUSED_ENTRY(619), + + ICE_PTT_UNUSED_ENTRY(620), + ICE_PTT_UNUSED_ENTRY(621), + ICE_PTT_UNUSED_ENTRY(622), + ICE_PTT_UNUSED_ENTRY(623), + ICE_PTT_UNUSED_ENTRY(624), + ICE_PTT_UNUSED_ENTRY(625), + ICE_PTT_UNUSED_ENTRY(626), + ICE_PTT_UNUSED_ENTRY(627), + ICE_PTT_UNUSED_ENTRY(628), + ICE_PTT_UNUSED_ENTRY(629), + + ICE_PTT_UNUSED_ENTRY(630), + ICE_PTT_UNUSED_ENTRY(631), + ICE_PTT_UNUSED_ENTRY(632), + ICE_PTT_UNUSED_ENTRY(633), + ICE_PTT_UNUSED_ENTRY(634), + ICE_PTT_UNUSED_ENTRY(635), + ICE_PTT_UNUSED_ENTRY(636), + ICE_PTT_UNUSED_ENTRY(637), + ICE_PTT_UNUSED_ENTRY(638), + ICE_PTT_UNUSED_ENTRY(639), + + ICE_PTT_UNUSED_ENTRY(640), + ICE_PTT_UNUSED_ENTRY(641), + ICE_PTT_UNUSED_ENTRY(642), + ICE_PTT_UNUSED_ENTRY(643), + ICE_PTT_UNUSED_ENTRY(644), + ICE_PTT_UNUSED_ENTRY(645), + ICE_PTT_UNUSED_ENTRY(646), + ICE_PTT_UNUSED_ENTRY(647), + ICE_PTT_UNUSED_ENTRY(648), + ICE_PTT_UNUSED_ENTRY(649), + + ICE_PTT_UNUSED_ENTRY(650), + ICE_PTT_UNUSED_ENTRY(651), + ICE_PTT_UNUSED_ENTRY(652), + ICE_PTT_UNUSED_ENTRY(653), + ICE_PTT_UNUSED_ENTRY(654), + ICE_PTT_UNUSED_ENTRY(655), + ICE_PTT_UNUSED_ENTRY(656), + ICE_PTT_UNUSED_ENTRY(657), + ICE_PTT_UNUSED_ENTRY(658), + ICE_PTT_UNUSED_ENTRY(659), + + ICE_PTT_UNUSED_ENTRY(660), + ICE_PTT_UNUSED_ENTRY(661), + ICE_PTT_UNUSED_ENTRY(662), + ICE_PTT_UNUSED_ENTRY(663), + ICE_PTT_UNUSED_ENTRY(664), + ICE_PTT_UNUSED_ENTRY(665), + ICE_PTT_UNUSED_ENTRY(666), + ICE_PTT_UNUSED_ENTRY(667), + ICE_PTT_UNUSED_ENTRY(668), + ICE_PTT_UNUSED_ENTRY(669), + + ICE_PTT_UNUSED_ENTRY(670), + ICE_PTT_UNUSED_ENTRY(671), + ICE_PTT_UNUSED_ENTRY(672), + ICE_PTT_UNUSED_ENTRY(673), + ICE_PTT_UNUSED_ENTRY(674), + ICE_PTT_UNUSED_ENTRY(675), + ICE_PTT_UNUSED_ENTRY(676), + ICE_PTT_UNUSED_ENTRY(677), + ICE_PTT_UNUSED_ENTRY(678), + ICE_PTT_UNUSED_ENTRY(679), + + ICE_PTT_UNUSED_ENTRY(680), + ICE_PTT_UNUSED_ENTRY(681), + ICE_PTT_UNUSED_ENTRY(682), + ICE_PTT_UNUSED_ENTRY(683), + ICE_PTT_UNUSED_ENTRY(684), + ICE_PTT_UNUSED_ENTRY(685), + ICE_PTT_UNUSED_ENTRY(686), + ICE_PTT_UNUSED_ENTRY(687), + ICE_PTT_UNUSED_ENTRY(688), + ICE_PTT_UNUSED_ENTRY(689), + + ICE_PTT_UNUSED_ENTRY(690), + ICE_PTT_UNUSED_ENTRY(691), + ICE_PTT_UNUSED_ENTRY(692), + ICE_PTT_UNUSED_ENTRY(693), + ICE_PTT_UNUSED_ENTRY(694), + ICE_PTT_UNUSED_ENTRY(695), + ICE_PTT_UNUSED_ENTRY(696), + ICE_PTT_UNUSED_ENTRY(697), + ICE_PTT_UNUSED_ENTRY(698), + ICE_PTT_UNUSED_ENTRY(699), + + ICE_PTT_UNUSED_ENTRY(700), + ICE_PTT_UNUSED_ENTRY(701), + ICE_PTT_UNUSED_ENTRY(702), + ICE_PTT_UNUSED_ENTRY(703), + ICE_PTT_UNUSED_ENTRY(704), + ICE_PTT_UNUSED_ENTRY(705), + ICE_PTT_UNUSED_ENTRY(706), + ICE_PTT_UNUSED_ENTRY(707), + ICE_PTT_UNUSED_ENTRY(708), + ICE_PTT_UNUSED_ENTRY(709), + + ICE_PTT_UNUSED_ENTRY(710), + ICE_PTT_UNUSED_ENTRY(711), + ICE_PTT_UNUSED_ENTRY(712), + ICE_PTT_UNUSED_ENTRY(713), + ICE_PTT_UNUSED_ENTRY(714), + ICE_PTT_UNUSED_ENTRY(715), + ICE_PTT_UNUSED_ENTRY(716), + ICE_PTT_UNUSED_ENTRY(717), + ICE_PTT_UNUSED_ENTRY(718), + ICE_PTT_UNUSED_ENTRY(719), + + ICE_PTT_UNUSED_ENTRY(720), + ICE_PTT_UNUSED_ENTRY(721), + ICE_PTT_UNUSED_ENTRY(722), + ICE_PTT_UNUSED_ENTRY(723), + ICE_PTT_UNUSED_ENTRY(724), + ICE_PTT_UNUSED_ENTRY(725), + ICE_PTT_UNUSED_ENTRY(726), + ICE_PTT_UNUSED_ENTRY(727), + ICE_PTT_UNUSED_ENTRY(728), + ICE_PTT_UNUSED_ENTRY(729), + + ICE_PTT_UNUSED_ENTRY(730), + ICE_PTT_UNUSED_ENTRY(731), + ICE_PTT_UNUSED_ENTRY(732), + ICE_PTT_UNUSED_ENTRY(733), + ICE_PTT_UNUSED_ENTRY(734), + ICE_PTT_UNUSED_ENTRY(735), + ICE_PTT_UNUSED_ENTRY(736), + ICE_PTT_UNUSED_ENTRY(737), + ICE_PTT_UNUSED_ENTRY(738), + ICE_PTT_UNUSED_ENTRY(739), + + ICE_PTT_UNUSED_ENTRY(740), + ICE_PTT_UNUSED_ENTRY(741), + ICE_PTT_UNUSED_ENTRY(742), + ICE_PTT_UNUSED_ENTRY(743), + ICE_PTT_UNUSED_ENTRY(744), + ICE_PTT_UNUSED_ENTRY(745), + ICE_PTT_UNUSED_ENTRY(746), + ICE_PTT_UNUSED_ENTRY(747), + ICE_PTT_UNUSED_ENTRY(748), + ICE_PTT_UNUSED_ENTRY(749), + + ICE_PTT_UNUSED_ENTRY(750), + ICE_PTT_UNUSED_ENTRY(751), + ICE_PTT_UNUSED_ENTRY(752), + ICE_PTT_UNUSED_ENTRY(753), + ICE_PTT_UNUSED_ENTRY(754), + ICE_PTT_UNUSED_ENTRY(755), + ICE_PTT_UNUSED_ENTRY(756), + ICE_PTT_UNUSED_ENTRY(757), + ICE_PTT_UNUSED_ENTRY(758), + ICE_PTT_UNUSED_ENTRY(759), + + ICE_PTT_UNUSED_ENTRY(760), + ICE_PTT_UNUSED_ENTRY(761), + ICE_PTT_UNUSED_ENTRY(762), + ICE_PTT_UNUSED_ENTRY(763), + ICE_PTT_UNUSED_ENTRY(764), + ICE_PTT_UNUSED_ENTRY(765), + ICE_PTT_UNUSED_ENTRY(766), + ICE_PTT_UNUSED_ENTRY(767), + ICE_PTT_UNUSED_ENTRY(768), + ICE_PTT_UNUSED_ENTRY(769), + + ICE_PTT_UNUSED_ENTRY(770), + ICE_PTT_UNUSED_ENTRY(771), + ICE_PTT_UNUSED_ENTRY(772), + ICE_PTT_UNUSED_ENTRY(773), + ICE_PTT_UNUSED_ENTRY(774), + ICE_PTT_UNUSED_ENTRY(775), + ICE_PTT_UNUSED_ENTRY(776), + ICE_PTT_UNUSED_ENTRY(777), + ICE_PTT_UNUSED_ENTRY(778), + ICE_PTT_UNUSED_ENTRY(779), + + ICE_PTT_UNUSED_ENTRY(780), + ICE_PTT_UNUSED_ENTRY(781), + ICE_PTT_UNUSED_ENTRY(782), + ICE_PTT_UNUSED_ENTRY(783), + ICE_PTT_UNUSED_ENTRY(784), + ICE_PTT_UNUSED_ENTRY(785), + ICE_PTT_UNUSED_ENTRY(786), + ICE_PTT_UNUSED_ENTRY(787), + ICE_PTT_UNUSED_ENTRY(788), + ICE_PTT_UNUSED_ENTRY(789), + + ICE_PTT_UNUSED_ENTRY(790), + ICE_PTT_UNUSED_ENTRY(791), + ICE_PTT_UNUSED_ENTRY(792), + ICE_PTT_UNUSED_ENTRY(793), + ICE_PTT_UNUSED_ENTRY(794), + ICE_PTT_UNUSED_ENTRY(795), + ICE_PTT_UNUSED_ENTRY(796), + ICE_PTT_UNUSED_ENTRY(797), + ICE_PTT_UNUSED_ENTRY(798), + ICE_PTT_UNUSED_ENTRY(799), + + ICE_PTT_UNUSED_ENTRY(800), + ICE_PTT_UNUSED_ENTRY(801), + ICE_PTT_UNUSED_ENTRY(802), + ICE_PTT_UNUSED_ENTRY(803), + ICE_PTT_UNUSED_ENTRY(804), + ICE_PTT_UNUSED_ENTRY(805), + ICE_PTT_UNUSED_ENTRY(806), + ICE_PTT_UNUSED_ENTRY(807), + ICE_PTT_UNUSED_ENTRY(808), + ICE_PTT_UNUSED_ENTRY(809), + + ICE_PTT_UNUSED_ENTRY(810), + ICE_PTT_UNUSED_ENTRY(811), + ICE_PTT_UNUSED_ENTRY(812), + ICE_PTT_UNUSED_ENTRY(813), + ICE_PTT_UNUSED_ENTRY(814), + ICE_PTT_UNUSED_ENTRY(815), + ICE_PTT_UNUSED_ENTRY(816), + ICE_PTT_UNUSED_ENTRY(817), + ICE_PTT_UNUSED_ENTRY(818), + ICE_PTT_UNUSED_ENTRY(819), + + ICE_PTT_UNUSED_ENTRY(820), + ICE_PTT_UNUSED_ENTRY(821), + ICE_PTT_UNUSED_ENTRY(822), + ICE_PTT_UNUSED_ENTRY(823), + ICE_PTT_UNUSED_ENTRY(824), + ICE_PTT_UNUSED_ENTRY(825), + ICE_PTT_UNUSED_ENTRY(826), + ICE_PTT_UNUSED_ENTRY(827), + ICE_PTT_UNUSED_ENTRY(828), + ICE_PTT_UNUSED_ENTRY(829), + + ICE_PTT_UNUSED_ENTRY(830), + ICE_PTT_UNUSED_ENTRY(831), + ICE_PTT_UNUSED_ENTRY(832), + ICE_PTT_UNUSED_ENTRY(833), + ICE_PTT_UNUSED_ENTRY(834), + ICE_PTT_UNUSED_ENTRY(835), + ICE_PTT_UNUSED_ENTRY(836), + ICE_PTT_UNUSED_ENTRY(837), + ICE_PTT_UNUSED_ENTRY(838), + ICE_PTT_UNUSED_ENTRY(839), + + ICE_PTT_UNUSED_ENTRY(840), + ICE_PTT_UNUSED_ENTRY(841), + ICE_PTT_UNUSED_ENTRY(842), + ICE_PTT_UNUSED_ENTRY(843), + ICE_PTT_UNUSED_ENTRY(844), + ICE_PTT_UNUSED_ENTRY(845), + ICE_PTT_UNUSED_ENTRY(846), + ICE_PTT_UNUSED_ENTRY(847), + ICE_PTT_UNUSED_ENTRY(848), + ICE_PTT_UNUSED_ENTRY(849), + + ICE_PTT_UNUSED_ENTRY(850), + ICE_PTT_UNUSED_ENTRY(851), + ICE_PTT_UNUSED_ENTRY(852), + ICE_PTT_UNUSED_ENTRY(853), + ICE_PTT_UNUSED_ENTRY(854), + ICE_PTT_UNUSED_ENTRY(855), + ICE_PTT_UNUSED_ENTRY(856), + ICE_PTT_UNUSED_ENTRY(857), + ICE_PTT_UNUSED_ENTRY(858), + ICE_PTT_UNUSED_ENTRY(859), + + ICE_PTT_UNUSED_ENTRY(860), + ICE_PTT_UNUSED_ENTRY(861), + ICE_PTT_UNUSED_ENTRY(862), + ICE_PTT_UNUSED_ENTRY(863), + ICE_PTT_UNUSED_ENTRY(864), + ICE_PTT_UNUSED_ENTRY(865), + ICE_PTT_UNUSED_ENTRY(866), + ICE_PTT_UNUSED_ENTRY(867), + ICE_PTT_UNUSED_ENTRY(868), + ICE_PTT_UNUSED_ENTRY(869), + + ICE_PTT_UNUSED_ENTRY(870), + ICE_PTT_UNUSED_ENTRY(871), + ICE_PTT_UNUSED_ENTRY(872), + ICE_PTT_UNUSED_ENTRY(873), + ICE_PTT_UNUSED_ENTRY(874), + ICE_PTT_UNUSED_ENTRY(875), + ICE_PTT_UNUSED_ENTRY(876), + ICE_PTT_UNUSED_ENTRY(877), + ICE_PTT_UNUSED_ENTRY(878), + ICE_PTT_UNUSED_ENTRY(879), + + ICE_PTT_UNUSED_ENTRY(880), + ICE_PTT_UNUSED_ENTRY(881), + ICE_PTT_UNUSED_ENTRY(882), + ICE_PTT_UNUSED_ENTRY(883), + ICE_PTT_UNUSED_ENTRY(884), + ICE_PTT_UNUSED_ENTRY(885), + ICE_PTT_UNUSED_ENTRY(886), + ICE_PTT_UNUSED_ENTRY(887), + ICE_PTT_UNUSED_ENTRY(888), + ICE_PTT_UNUSED_ENTRY(889), + + ICE_PTT_UNUSED_ENTRY(890), + ICE_PTT_UNUSED_ENTRY(891), + ICE_PTT_UNUSED_ENTRY(892), + ICE_PTT_UNUSED_ENTRY(893), + ICE_PTT_UNUSED_ENTRY(894), + ICE_PTT_UNUSED_ENTRY(895), + ICE_PTT_UNUSED_ENTRY(896), + ICE_PTT_UNUSED_ENTRY(897), + ICE_PTT_UNUSED_ENTRY(898), + ICE_PTT_UNUSED_ENTRY(899), + + ICE_PTT_UNUSED_ENTRY(900), + ICE_PTT_UNUSED_ENTRY(901), + ICE_PTT_UNUSED_ENTRY(902), + ICE_PTT_UNUSED_ENTRY(903), + ICE_PTT_UNUSED_ENTRY(904), + ICE_PTT_UNUSED_ENTRY(905), + ICE_PTT_UNUSED_ENTRY(906), + ICE_PTT_UNUSED_ENTRY(907), + ICE_PTT_UNUSED_ENTRY(908), + ICE_PTT_UNUSED_ENTRY(909), + + ICE_PTT_UNUSED_ENTRY(910), + ICE_PTT_UNUSED_ENTRY(911), + ICE_PTT_UNUSED_ENTRY(912), + ICE_PTT_UNUSED_ENTRY(913), + ICE_PTT_UNUSED_ENTRY(914), + ICE_PTT_UNUSED_ENTRY(915), + ICE_PTT_UNUSED_ENTRY(916), + ICE_PTT_UNUSED_ENTRY(917), + ICE_PTT_UNUSED_ENTRY(918), + ICE_PTT_UNUSED_ENTRY(919), + + ICE_PTT_UNUSED_ENTRY(920), + ICE_PTT_UNUSED_ENTRY(921), + ICE_PTT_UNUSED_ENTRY(922), + ICE_PTT_UNUSED_ENTRY(923), + ICE_PTT_UNUSED_ENTRY(924), + ICE_PTT_UNUSED_ENTRY(925), + ICE_PTT_UNUSED_ENTRY(926), + ICE_PTT_UNUSED_ENTRY(927), + ICE_PTT_UNUSED_ENTRY(928), + ICE_PTT_UNUSED_ENTRY(929), + + ICE_PTT_UNUSED_ENTRY(930), + ICE_PTT_UNUSED_ENTRY(931), + ICE_PTT_UNUSED_ENTRY(932), + ICE_PTT_UNUSED_ENTRY(933), + ICE_PTT_UNUSED_ENTRY(934), + ICE_PTT_UNUSED_ENTRY(935), + ICE_PTT_UNUSED_ENTRY(936), + ICE_PTT_UNUSED_ENTRY(937), + ICE_PTT_UNUSED_ENTRY(938), + ICE_PTT_UNUSED_ENTRY(939), + + ICE_PTT_UNUSED_ENTRY(940), + ICE_PTT_UNUSED_ENTRY(941), + ICE_PTT_UNUSED_ENTRY(942), + ICE_PTT_UNUSED_ENTRY(943), + ICE_PTT_UNUSED_ENTRY(944), + ICE_PTT_UNUSED_ENTRY(945), + ICE_PTT_UNUSED_ENTRY(946), + ICE_PTT_UNUSED_ENTRY(947), + ICE_PTT_UNUSED_ENTRY(948), + ICE_PTT_UNUSED_ENTRY(949), + + ICE_PTT_UNUSED_ENTRY(950), + ICE_PTT_UNUSED_ENTRY(951), + ICE_PTT_UNUSED_ENTRY(952), + ICE_PTT_UNUSED_ENTRY(953), + ICE_PTT_UNUSED_ENTRY(954), + ICE_PTT_UNUSED_ENTRY(955), + ICE_PTT_UNUSED_ENTRY(956), + ICE_PTT_UNUSED_ENTRY(957), + ICE_PTT_UNUSED_ENTRY(958), + ICE_PTT_UNUSED_ENTRY(959), + + ICE_PTT_UNUSED_ENTRY(960), + ICE_PTT_UNUSED_ENTRY(961), + ICE_PTT_UNUSED_ENTRY(962), + ICE_PTT_UNUSED_ENTRY(963), + ICE_PTT_UNUSED_ENTRY(964), + ICE_PTT_UNUSED_ENTRY(965), + ICE_PTT_UNUSED_ENTRY(966), + ICE_PTT_UNUSED_ENTRY(967), + ICE_PTT_UNUSED_ENTRY(968), + ICE_PTT_UNUSED_ENTRY(969), + + ICE_PTT_UNUSED_ENTRY(970), + ICE_PTT_UNUSED_ENTRY(971), + ICE_PTT_UNUSED_ENTRY(972), + ICE_PTT_UNUSED_ENTRY(973), + ICE_PTT_UNUSED_ENTRY(974), + ICE_PTT_UNUSED_ENTRY(975), + ICE_PTT_UNUSED_ENTRY(976), + ICE_PTT_UNUSED_ENTRY(977), + ICE_PTT_UNUSED_ENTRY(978), + ICE_PTT_UNUSED_ENTRY(979), + + ICE_PTT_UNUSED_ENTRY(980), + ICE_PTT_UNUSED_ENTRY(981), + ICE_PTT_UNUSED_ENTRY(982), + ICE_PTT_UNUSED_ENTRY(983), + ICE_PTT_UNUSED_ENTRY(984), + ICE_PTT_UNUSED_ENTRY(985), + ICE_PTT_UNUSED_ENTRY(986), + ICE_PTT_UNUSED_ENTRY(987), + ICE_PTT_UNUSED_ENTRY(988), + ICE_PTT_UNUSED_ENTRY(989), + + ICE_PTT_UNUSED_ENTRY(990), + ICE_PTT_UNUSED_ENTRY(991), + ICE_PTT_UNUSED_ENTRY(992), + ICE_PTT_UNUSED_ENTRY(993), + ICE_PTT_UNUSED_ENTRY(994), + ICE_PTT_UNUSED_ENTRY(995), + ICE_PTT_UNUSED_ENTRY(996), + ICE_PTT_UNUSED_ENTRY(997), + ICE_PTT_UNUSED_ENTRY(998), + ICE_PTT_UNUSED_ENTRY(999), + + ICE_PTT_UNUSED_ENTRY(1000), + ICE_PTT_UNUSED_ENTRY(1001), + ICE_PTT_UNUSED_ENTRY(1002), + ICE_PTT_UNUSED_ENTRY(1003), + ICE_PTT_UNUSED_ENTRY(1004), + ICE_PTT_UNUSED_ENTRY(1005), + ICE_PTT_UNUSED_ENTRY(1006), + ICE_PTT_UNUSED_ENTRY(1007), + ICE_PTT_UNUSED_ENTRY(1008), + ICE_PTT_UNUSED_ENTRY(1009), + + ICE_PTT_UNUSED_ENTRY(1010), + ICE_PTT_UNUSED_ENTRY(1011), + ICE_PTT_UNUSED_ENTRY(1012), + ICE_PTT_UNUSED_ENTRY(1013), + ICE_PTT_UNUSED_ENTRY(1014), + ICE_PTT_UNUSED_ENTRY(1015), + ICE_PTT_UNUSED_ENTRY(1016), + ICE_PTT_UNUSED_ENTRY(1017), + ICE_PTT_UNUSED_ENTRY(1018), + ICE_PTT_UNUSED_ENTRY(1019), + + ICE_PTT_UNUSED_ENTRY(1020), + ICE_PTT_UNUSED_ENTRY(1021), + ICE_PTT_UNUSED_ENTRY(1022), + ICE_PTT_UNUSED_ENTRY(1023) +}; + +static inline struct ice_rx_ptype_decoded ice_decode_rx_desc_ptype(uint16_t ptype) +{ + return ice_ptype_lkup[ptype]; +} + +#define ICE_LINK_SPEED_UNKNOWN 0 +#define ICE_LINK_SPEED_10MBPS 10 +#define ICE_LINK_SPEED_100MBPS 100 +#define ICE_LINK_SPEED_1000MBPS 1000 +#define ICE_LINK_SPEED_2500MBPS 2500 +#define ICE_LINK_SPEED_5000MBPS 5000 +#define ICE_LINK_SPEED_10000MBPS 10000 +#define ICE_LINK_SPEED_20000MBPS 20000 +#define ICE_LINK_SPEED_25000MBPS 25000 +#define ICE_LINK_SPEED_40000MBPS 40000 +#define ICE_LINK_SPEED_50000MBPS 50000 +#define ICE_LINK_SPEED_100000MBPS 100000 +#endif /* _ICE_LAN_TX_RX_H_ */ diff --git a/sys/dev/pci/if_icevar.h b/sys/dev/pci/if_icevar.h new file mode 100644 index 000000000..ca5fd00f5 --- /dev/null +++ b/sys/dev/pci/if_icevar.h @@ -0,0 +1,4371 @@ +/* $OpenBSD: if_icevar.h,v 1.5 2024/11/26 17:34:00 stsp Exp $ */ + +/* Copyright (c) 2024, Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Ported from FreeBSD ice(4) by Stefan Sperling in 2024. + * + * Copyright (c) 2024 Stefan Sperling + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* Code derived from FreeBSD sys/bitstring.h: + * + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Paul Vixie. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Copyright (c) 2014 Spectra Logic Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions, and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. + */ + +#ifndef _ICE_BITOPS_H_ +#define _ICE_BITOPS_H_ + +/* Define the size of the bitmap chunk */ +typedef uint32_t ice_bitmap_t; + +/* NOTE! + * Do not use any of the functions declared in this file + * on memory that was not declared with ice_declare_bitmap. + * Not following this rule might cause issues like split + * locks. + */ + +/* Number of bits per bitmap chunk */ +#define BITS_PER_CHUNK (8 * sizeof(ice_bitmap_t)) +/* Determine which chunk a bit belongs in */ +#define BIT_CHUNK(nr) ((nr) / BITS_PER_CHUNK) +/* How many chunks are required to store this many bits */ +#define BITS_TO_CHUNKS(sz) (((sz) + BITS_PER_CHUNK - 1) / BITS_PER_CHUNK) +/* Which bit inside a chunk this bit corresponds to */ +#define BIT_IN_CHUNK(nr) ((nr) % BITS_PER_CHUNK) +/* How many bits are valid in the last chunk, assumes nr > 0 */ +#define LAST_CHUNK_BITS(nr) ((((nr) - 1) % BITS_PER_CHUNK) + 1) +/* Generate a bitmask of valid bits in the last chunk, assumes nr > 0 */ +#define LAST_CHUNK_MASK(nr) (((ice_bitmap_t)~0) >> \ + (BITS_PER_CHUNK - LAST_CHUNK_BITS(nr))) + +#define ice_declare_bitmap(A, sz) \ + ice_bitmap_t A[BITS_TO_CHUNKS(sz)] + +static inline bool ice_is_bit_set_internal(uint16_t nr, const ice_bitmap_t *bitmap) +{ + return !!(*bitmap & BIT(nr)); +} + +/* + * If atomic version of the bitops are required, each specific OS + * implementation will need to implement OS/platform specific atomic + * version of the functions below: + * + * ice_clear_bit_internal + * ice_set_bit_internal + * ice_test_and_clear_bit_internal + * ice_test_and_set_bit_internal + * + * and define macro ICE_ATOMIC_BITOPS to overwrite the default non-atomic + * implementation. + */ +static inline void ice_clear_bit_internal(uint16_t nr, ice_bitmap_t *bitmap) +{ + *bitmap &= ~BIT(nr); +} + +static inline void ice_set_bit_internal(uint16_t nr, ice_bitmap_t *bitmap) +{ + *bitmap |= BIT(nr); +} + +static inline bool ice_test_and_clear_bit_internal(uint16_t nr, + ice_bitmap_t *bitmap) +{ + if (ice_is_bit_set_internal(nr, bitmap)) { + ice_clear_bit_internal(nr, bitmap); + return true; + } + return false; +} + +static inline bool ice_test_and_set_bit_internal(uint16_t nr, ice_bitmap_t *bitmap) +{ + if (ice_is_bit_set_internal(nr, bitmap)) + return true; + + ice_set_bit_internal(nr, bitmap); + return false; +} + +/** + * ice_is_bit_set - Check state of a bit in a bitmap + * @bitmap: the bitmap to check + * @nr: the bit to check + * + * Returns true if bit nr of bitmap is set. False otherwise. Assumes that nr + * is less than the size of the bitmap. + */ +static inline bool ice_is_bit_set(const ice_bitmap_t *bitmap, uint16_t nr) +{ + return ice_is_bit_set_internal(BIT_IN_CHUNK(nr), + &bitmap[BIT_CHUNK(nr)]); +} + +/** + * ice_clear_bit - Clear a bit in a bitmap + * @bitmap: the bitmap to change + * @nr: the bit to change + * + * Clears the bit nr in bitmap. Assumes that nr is less than the size of the + * bitmap. + */ +static inline void ice_clear_bit(uint16_t nr, ice_bitmap_t *bitmap) +{ + ice_clear_bit_internal(BIT_IN_CHUNK(nr), &bitmap[BIT_CHUNK(nr)]); +} + +/** + * ice_set_bit - Set a bit in a bitmap + * @bitmap: the bitmap to change + * @nr: the bit to change + * + * Sets the bit nr in bitmap. Assumes that nr is less than the size of the + * bitmap. + */ +static inline void ice_set_bit(uint16_t nr, ice_bitmap_t *bitmap) +{ + ice_set_bit_internal(BIT_IN_CHUNK(nr), &bitmap[BIT_CHUNK(nr)]); +} + +/** + * ice_test_and_clear_bit - Atomically clear a bit and return the old bit value + * @nr: the bit to change + * @bitmap: the bitmap to change + * + * Check and clear the bit nr in bitmap. Assumes that nr is less than the size + * of the bitmap. + */ +static inline bool +ice_test_and_clear_bit(uint16_t nr, ice_bitmap_t *bitmap) +{ + return ice_test_and_clear_bit_internal(BIT_IN_CHUNK(nr), + &bitmap[BIT_CHUNK(nr)]); +} + +/** + * ice_test_and_set_bit - Atomically set a bit and return the old bit value + * @nr: the bit to change + * @bitmap: the bitmap to change + * + * Check and set the bit nr in bitmap. Assumes that nr is less than the size of + * the bitmap. + */ +static inline bool +ice_test_and_set_bit(uint16_t nr, ice_bitmap_t *bitmap) +{ + return ice_test_and_set_bit_internal(BIT_IN_CHUNK(nr), + &bitmap[BIT_CHUNK(nr)]); +} + +/* ice_zero_bitmap - set bits of bitmap to zero. + * @bmp: bitmap to set zeros + * @size: Size of the bitmaps in bits + * + * Set all of the bits in a bitmap to zero. Note that this function assumes it + * operates on an ice_bitmap_t which was declared using ice_declare_bitmap. It + * will zero every bit in the last chunk, even if those bits are beyond the + * size. + */ +static inline void ice_zero_bitmap(ice_bitmap_t *bmp, uint16_t size) +{ + memset(bmp, 0, BITS_TO_CHUNKS(size) * sizeof(ice_bitmap_t)); +} + +/** + * ice_and_bitmap - bitwise AND 2 bitmaps and store result in dst bitmap + * @dst: Destination bitmap that receive the result of the operation + * @bmp1: The first bitmap to intersect + * @bmp2: The second bitmap to intersect wit the first + * @size: Size of the bitmaps in bits + * + * This function performs a bitwise AND on two "source" bitmaps of the same size + * and stores the result to "dst" bitmap. The "dst" bitmap must be of the same + * size as the "source" bitmaps to avoid buffer overflows. This function returns + * a non-zero value if at least one bit location from both "source" bitmaps is + * non-zero. + */ +static inline int +ice_and_bitmap(ice_bitmap_t *dst, const ice_bitmap_t *bmp1, + const ice_bitmap_t *bmp2, uint16_t size) +{ + ice_bitmap_t res = 0, mask; + uint16_t i; + + /* Handle all but the last chunk */ + for (i = 0; i < BITS_TO_CHUNKS(size) - 1; i++) { + dst[i] = bmp1[i] & bmp2[i]; + res |= dst[i]; + } + + /* We want to take care not to modify any bits outside of the bitmap + * size, even in the destination bitmap. Thus, we won't directly + * assign the last bitmap, but instead use a bitmask to ensure we only + * modify bits which are within the size, and leave any bits above the + * size value alone. + */ + mask = LAST_CHUNK_MASK(size); + dst[i] = (dst[i] & ~mask) | ((bmp1[i] & bmp2[i]) & mask); + res |= dst[i] & mask; + + return res != 0; +} + +/** + * ice_or_bitmap - bitwise OR 2 bitmaps and store result in dst bitmap + * @dst: Destination bitmap that receive the result of the operation + * @bmp1: The first bitmap to intersect + * @bmp2: The second bitmap to intersect wit the first + * @size: Size of the bitmaps in bits + * + * This function performs a bitwise OR on two "source" bitmaps of the same size + * and stores the result to "dst" bitmap. The "dst" bitmap must be of the same + * size as the "source" bitmaps to avoid buffer overflows. + */ +static inline void +ice_or_bitmap(ice_bitmap_t *dst, const ice_bitmap_t *bmp1, + const ice_bitmap_t *bmp2, uint16_t size) +{ + ice_bitmap_t mask; + uint16_t i; + + /* Handle all but last chunk */ + for (i = 0; i < BITS_TO_CHUNKS(size) - 1; i++) + dst[i] = bmp1[i] | bmp2[i]; + + /* We want to only OR bits within the size. Furthermore, we also do + * not want to modify destination bits which are beyond the specified + * size. Use a bitmask to ensure that we only modify the bits that are + * within the specified size. + */ + mask = LAST_CHUNK_MASK(size); + dst[i] = (dst[i] & ~mask) | ((bmp1[i] | bmp2[i]) & mask); +} + +/** + * ice_xor_bitmap - bitwise XOR 2 bitmaps and store result in dst bitmap + * @dst: Destination bitmap that receive the result of the operation + * @bmp1: The first bitmap of XOR operation + * @bmp2: The second bitmap to XOR with the first + * @size: Size of the bitmaps in bits + * + * This function performs a bitwise XOR on two "source" bitmaps of the same size + * and stores the result to "dst" bitmap. The "dst" bitmap must be of the same + * size as the "source" bitmaps to avoid buffer overflows. + */ +static inline void +ice_xor_bitmap(ice_bitmap_t *dst, const ice_bitmap_t *bmp1, + const ice_bitmap_t *bmp2, uint16_t size) +{ + ice_bitmap_t mask; + uint16_t i; + + /* Handle all but last chunk */ + for (i = 0; i < BITS_TO_CHUNKS(size) - 1; i++) + dst[i] = bmp1[i] ^ bmp2[i]; + + /* We want to only XOR bits within the size. Furthermore, we also do + * not want to modify destination bits which are beyond the specified + * size. Use a bitmask to ensure that we only modify the bits that are + * within the specified size. + */ + mask = LAST_CHUNK_MASK(size); + dst[i] = (dst[i] & ~mask) | ((bmp1[i] ^ bmp2[i]) & mask); +} + +/** + * ice_andnot_bitmap - bitwise ANDNOT 2 bitmaps and result in dst bitmap + * @dst: Destination bitmap that receive the result of the operation + * @bmp1: The first bitmap of ANDNOT operation + * @bmp2: The second bitmap to ANDNOT operation + * @size: Size of the bitmaps in bits + * + * This function performs a bitwise ANDNOT on two "source" bitmaps of the same + * size, and stores the result to "dst" bitmap. The "dst" bitmap must be of the + * same size as the "source" bitmaps to avoid buffer overflows. + */ +static inline void +ice_andnot_bitmap(ice_bitmap_t *dst, const ice_bitmap_t *bmp1, + const ice_bitmap_t *bmp2, uint16_t size) +{ + ice_bitmap_t mask; + uint16_t i; + + /* Handle all but last chunk */ + for (i = 0; i < BITS_TO_CHUNKS(size) - 1; i++) + dst[i] = bmp1[i] & ~bmp2[i]; + + /* We want to only clear bits within the size. Furthermore, we also do + * not want to modify destination bits which are beyond the specified + * size. Use a bitmask to ensure that we only modify the bits that are + * within the specified size. + */ + mask = LAST_CHUNK_MASK(size); + dst[i] = (dst[i] & ~mask) | ((bmp1[i] & ~bmp2[i]) & mask); +} + +/** + * ice_find_next_bit - Find the index of the next set bit of a bitmap + * @bitmap: the bitmap to scan + * @size: the size in bits of the bitmap + * @offset: the offset to start at + * + * Scans the bitmap and returns the index of the first set bit which is equal + * to or after the specified offset. Will return size if no bits are set. + */ +static inline uint16_t +ice_find_next_bit(const ice_bitmap_t *bitmap, uint16_t size, uint16_t offset) +{ + uint16_t i, j; + + if (offset >= size) + return size; + + /* Since the starting position may not be directly on a chunk + * boundary, we need to be careful to handle the first chunk specially + */ + i = BIT_CHUNK(offset); + if (bitmap[i] != 0) { + uint16_t off = i * BITS_PER_CHUNK; + + for (j = offset % BITS_PER_CHUNK; j < BITS_PER_CHUNK; j++) { + if (ice_is_bit_set(bitmap, off + j)) + return min(size, (uint16_t)(off + j)); + } + } + + /* Now we handle the remaining chunks, if any */ + for (i++; i < BITS_TO_CHUNKS(size); i++) { + if (bitmap[i] != 0) { + uint16_t off = i * BITS_PER_CHUNK; + + for (j = 0; j < BITS_PER_CHUNK; j++) { + if (ice_is_bit_set(bitmap, off + j)) + return min(size, (uint16_t)(off + j)); + } + } + } + return size; +} + +/** + * ice_find_first_bit - Find the index of the first set bit of a bitmap + * @bitmap: the bitmap to scan + * @size: the size in bits of the bitmap + * + * Scans the bitmap and returns the index of the first set bit. Will return + * size if no bits are set. + */ +static inline uint16_t ice_find_first_bit(const ice_bitmap_t *bitmap, uint16_t size) +{ + return ice_find_next_bit(bitmap, size, 0); +} + +#define ice_for_each_set_bit(_bitpos, _addr, _maxlen) \ + for ((_bitpos) = ice_find_first_bit((_addr), (_maxlen)); \ + (_bitpos) < (_maxlen); \ + (_bitpos) = ice_find_next_bit((_addr), (_maxlen), (_bitpos) + 1)) + +/** + * ice_is_any_bit_set - Return true of any bit in the bitmap is set + * @bitmap: the bitmap to check + * @size: the size of the bitmap + * + * Equivalent to checking if ice_find_first_bit returns a value less than the + * bitmap size. + */ +static inline bool ice_is_any_bit_set(ice_bitmap_t *bitmap, uint16_t size) +{ + return ice_find_first_bit(bitmap, size) < size; +} + +/** + * ice_cp_bitmap - copy bitmaps + * @dst: bitmap destination + * @src: bitmap to copy from + * @size: Size of the bitmaps in bits + * + * This function copy bitmap from src to dst. Note that this function assumes + * it is operating on a bitmap declared using ice_declare_bitmap. It will copy + * the entire last chunk even if this contains bits beyond the size. + */ +static inline void ice_cp_bitmap(ice_bitmap_t *dst, ice_bitmap_t *src, uint16_t size) +{ + memcpy(dst, src, BITS_TO_CHUNKS(size) * sizeof(ice_bitmap_t)); +} + +/** + * ice_bitmap_set - set a number of bits in bitmap from a starting position + * @dst: bitmap destination + * @pos: first bit position to set + * @num_bits: number of bits to set + * + * This function sets bits in a bitmap from pos to (pos + num_bits) - 1. + * Note that this function assumes it is operating on a bitmap declared using + * ice_declare_bitmap. + */ +static inline void +ice_bitmap_set(ice_bitmap_t *dst, uint16_t pos, uint16_t num_bits) +{ + uint16_t i; + + for (i = pos; i < pos + num_bits; i++) + ice_set_bit(i, dst); +} + +/** + * ice_bitmap_hweight - hamming weight of bitmap + * @bm: bitmap pointer + * @size: size of bitmap (in bits) + * + * This function determines the number of set bits in a bitmap. + * Note that this function assumes it is operating on a bitmap declared using + * ice_declare_bitmap. + */ +static inline int +ice_bitmap_hweight(ice_bitmap_t *bm, uint16_t size) +{ + int count = 0; + uint16_t bit = 0; + + while (size > (bit = ice_find_next_bit(bm, size, bit))) { + count++; + bit++; + } + + return count; +} + +/** + * ice_cmp_bitmap - compares two bitmaps + * @bmp1: the bitmap to compare + * @bmp2: the bitmap to compare with bmp1 + * @size: Size of the bitmaps in bits + * + * This function compares two bitmaps, and returns result as true or false. + */ +static inline bool +ice_cmp_bitmap(ice_bitmap_t *bmp1, ice_bitmap_t *bmp2, uint16_t size) +{ + ice_bitmap_t mask; + uint16_t i; + + /* Handle all but last chunk */ + for (i = 0; i < BITS_TO_CHUNKS(size) - 1; i++) + if (bmp1[i] != bmp2[i]) + return false; + + /* We want to only compare bits within the size */ + mask = LAST_CHUNK_MASK(size); + if ((bmp1[i] & mask) != (bmp2[i] & mask)) + return false; + + return true; +} + +/** + * ice_bitmap_from_array32 - copies u32 array source into bitmap destination + * @dst: the destination bitmap + * @src: the source u32 array + * @size: size of the bitmap (in bits) + * + * This function copies the src bitmap stored in an u32 array into the dst + * bitmap stored as an ice_bitmap_t. + */ +static inline void +ice_bitmap_from_array32(ice_bitmap_t *dst, uint32_t *src, uint16_t size) +{ + uint32_t remaining_bits, i; + +#define BITS_PER_U32 (sizeof(uint32_t) * 8) + /* clear bitmap so we only have to set when iterating */ + ice_zero_bitmap(dst, size); + + for (i = 0; i < (uint32_t)(size / BITS_PER_U32); i++) { + uint32_t bit_offset = i * BITS_PER_U32; + uint32_t entry = src[i]; + uint32_t j; + + for (j = 0; j < BITS_PER_U32; j++) { + if (entry & BIT(j)) + ice_set_bit((uint16_t)(j + bit_offset), dst); + } + } + + /* still need to check the leftover bits (i.e. if size isn't evenly + * divisible by BITS_PER_U32 + **/ + remaining_bits = size % BITS_PER_U32; + if (remaining_bits) { + uint32_t bit_offset = i * BITS_PER_U32; + uint32_t entry = src[i]; + uint32_t j; + + for (j = 0; j < remaining_bits; j++) { + if (entry & BIT(j)) + ice_set_bit((uint16_t)(j + bit_offset), dst); + } + } +} + +#undef BIT_CHUNK +#undef BIT_IN_CHUNK +#undef LAST_CHUNK_BITS +#undef LAST_CHUNK_MASK + +#endif /* _ICE_BITOPS_H_ */ + +/* + * @struct ice_dma_mem + * @brief DMA memory allocation + * + * Contains DMA allocation bits, used to simplify DMA allocations. + */ +struct ice_dma_mem { + void *va; + uint64_t pa; + bus_size_t size; + + bus_dma_tag_t tag; + bus_dmamap_t map; + bus_dma_segment_t seg; +}; +#define ICE_DMA_MAP(_m) ((_m)->map) +#define ICE_DMA_DVA(_m) ((_m)->map->dm_segs[0].ds_addr) +#define ICE_DMA_KVA(_m) ((void *)(_m)->va) +#define ICE_DMA_LEN(_m) ((_m)->size) + +#define ICE_STR_BUF_LEN 32 + +/** + * @struct ice_lock + * @brief simplified lock API + * + * Contains a simple lock implementation used to lock various resources. + */ +struct ice_lock { + struct mutex mutex; + char name[ICE_STR_BUF_LEN]; +}; + +extern uint16_t ice_lock_count; + +/* + * ice_init_lock - Initialize a lock for use + * @lock: the lock memory to initialize + * + * OS compatibility layer to provide a simple locking mechanism. We use + * a mutex for this purpose. + */ +static inline void +ice_init_lock(struct ice_lock *lock) +{ + /* + * Make each lock unique by incrementing a counter each time this + * function is called. Use of a uint16_t allows 65535 possible locks before + * we'd hit a duplicate. + */ + memset(lock->name, 0, sizeof(lock->name)); + snprintf(lock->name, ICE_STR_BUF_LEN, "ice_lock_%u", ice_lock_count++); + mtx_init_flags(&lock->mutex, IPL_NET, lock->name, 0); +} + +/* FW update timeout definitions are in milliseconds */ +#define ICE_NVM_TIMEOUT 180000 +#define ICE_CHANGE_LOCK_TIMEOUT 1000 +#define ICE_GLOBAL_CFG_LOCK_TIMEOUT 3000 + +#define ICE_PF_RESET_WAIT_COUNT 500 + +/* Error Codes */ +enum ice_status { + ICE_SUCCESS = 0, + + /* Generic codes : Range -1..-49 */ + ICE_ERR_PARAM = -1, + ICE_ERR_NOT_IMPL = -2, + ICE_ERR_NOT_READY = -3, + ICE_ERR_NOT_SUPPORTED = -4, + ICE_ERR_BAD_PTR = -5, + ICE_ERR_INVAL_SIZE = -6, + ICE_ERR_DEVICE_NOT_SUPPORTED = -8, + ICE_ERR_RESET_FAILED = -9, + ICE_ERR_FW_API_VER = -10, + ICE_ERR_NO_MEMORY = -11, + ICE_ERR_CFG = -12, + ICE_ERR_OUT_OF_RANGE = -13, + ICE_ERR_ALREADY_EXISTS = -14, + ICE_ERR_DOES_NOT_EXIST = -15, + ICE_ERR_IN_USE = -16, + ICE_ERR_MAX_LIMIT = -17, + ICE_ERR_RESET_ONGOING = -18, + ICE_ERR_HW_TABLE = -19, + ICE_ERR_FW_DDP_MISMATCH = -20, + + /* NVM specific error codes: Range -50..-59 */ + ICE_ERR_NVM = -50, + ICE_ERR_NVM_CHECKSUM = -51, + ICE_ERR_BUF_TOO_SHORT = -52, + ICE_ERR_NVM_BLANK_MODE = -53, + + /* ARQ/ASQ specific error codes. Range -100..-109 */ + ICE_ERR_AQ_ERROR = -100, + ICE_ERR_AQ_TIMEOUT = -101, + ICE_ERR_AQ_FULL = -102, + ICE_ERR_AQ_NO_WORK = -103, + ICE_ERR_AQ_EMPTY = -104, + ICE_ERR_AQ_FW_CRITICAL = -105, +}; + +#define ICE_SQ_SEND_DELAY_TIME_MS 10 +#define ICE_SQ_SEND_MAX_EXECUTE 3 + +enum ice_fw_modes { + ICE_FW_MODE_NORMAL, + ICE_FW_MODE_DBG, + ICE_FW_MODE_REC, + ICE_FW_MODE_ROLLBACK +}; + +#define ICE_AQ_LEN 1023 +#define ICE_MBXQ_LEN 512 +#define ICE_SBQ_LEN 512 + +#define ICE_CTRLQ_WORK_LIMIT 256 + +#define ICE_DFLT_TRAFFIC_CLASS BIT(0) + +/* wait up to 50 microseconds for queue state change */ +#define ICE_Q_WAIT_RETRY_LIMIT 5 + +/* Maximum buffer lengths for all control queue types */ +#define ICE_AQ_MAX_BUF_LEN 4096 +#define ICE_MBXQ_MAX_BUF_LEN 4096 + +#define ICE_CTL_Q_DESC(R, i) \ + (&(((struct ice_aq_desc *)((R).desc_buf.va))[i])) + +#define ICE_CTL_Q_DESC_UNUSED(R) \ + ((uint16_t)((((R)->next_to_clean > (R)->next_to_use) ? 0 : (R)->count) + \ + (R)->next_to_clean - (R)->next_to_use - 1)) + +/* Defines that help manage the driver vs FW API checks. + * Take a look at ice_aq_ver_check in ice_controlq.c for actual usage. + */ +#define EXP_FW_API_VER_BRANCH 0x00 +#define EXP_FW_API_VER_MAJOR 0x01 +#define EXP_FW_API_VER_MINOR 0x05 + +/* Alignment for queues */ +#define DBA_ALIGN 128 + +/* Maximum TSO size is (256K)-1 */ +#define ICE_TSO_SIZE ((256*1024) - 1) + +/* Minimum size for TSO MSS */ +#define ICE_MIN_TSO_MSS 64 + +#define ICE_MAX_TX_SEGS 8 +#define ICE_MAX_TSO_SEGS 128 + +#define ICE_MAX_DMA_SEG_SIZE ((16*1024) - 1) + +#define ICE_MAX_RX_SEGS 5 + +#define ICE_MAX_TSO_HDR_SEGS 3 + +#define ICE_MSIX_BAR 3 + +#define ICE_DEFAULT_DESC_COUNT 1024 +#define ICE_MAX_DESC_COUNT 8160 +#define ICE_MIN_DESC_COUNT 64 +#define ICE_DESC_COUNT_INCR 32 + +/* Maximum size of a single frame (for Tx and Rx) */ +#define ICE_MAX_FRAME_SIZE ICE_AQ_SET_MAC_FRAME_SIZE_MAX + +/* Maximum MTU size */ +#define ICE_MAX_MTU (ICE_MAX_FRAME_SIZE - \ + ETHER_HDR_LEN - ETHER_CRC_LEN - ETHER_VLAN_ENCAP_LEN) + +#define ICE_QIDX_INVALID 0xffff + +/* + * Hardware requires that TSO packets have an segment size of at least 64 + * bytes. To avoid sending bad frames to the hardware, the driver forces the + * MSS for all TSO packets to have a segment size of at least 64 bytes. + * + * However, if the MTU is reduced below a certain size, then the resulting + * larger MSS can result in transmitting segmented frames with a packet size + * larger than the MTU. + * + * Avoid this by preventing the MTU from being lowered below this limit. + * Alternative solutions require changing the TCP stack to disable offloading + * the segmentation when the requested segment size goes below 64 bytes. + */ +#define ICE_MIN_MTU 112 + +/* + * The default number of queues reserved for a VF is 4, according to the + * AVF Base Mode specification. + */ +#define ICE_DEFAULT_VF_QUEUES 4 + +/* + * An invalid VSI number to indicate that mirroring should be disabled. + */ +#define ICE_INVALID_MIRROR_VSI ((u16)-1) +/* + * The maximum number of RX queues allowed per TC in a VSI. + */ +#define ICE_MAX_RXQS_PER_TC 256 + +/* + * There are three settings that can be updated independently or + * altogether: Link speed, FEC, and Flow Control. These macros allow + * the caller to specify which setting(s) to update. + */ +#define ICE_APPLY_LS BIT(0) +#define ICE_APPLY_FEC BIT(1) +#define ICE_APPLY_FC BIT(2) +#define ICE_APPLY_LS_FEC (ICE_APPLY_LS | ICE_APPLY_FEC) +#define ICE_APPLY_LS_FC (ICE_APPLY_LS | ICE_APPLY_FC) +#define ICE_APPLY_FEC_FC (ICE_APPLY_FEC | ICE_APPLY_FC) +#define ICE_APPLY_LS_FEC_FC (ICE_APPLY_LS_FEC | ICE_APPLY_FC) + +/** + * @enum ice_dyn_idx_t + * @brief Dynamic Control ITR indexes + * + * This enum matches hardware bits and is meant to be used by DYN_CTLN + * registers and QINT registers or more generally anywhere in the manual + * mentioning ITR_INDX, ITR_NONE cannot be used as an index 'n' into any + * register but instead is a special value meaning "don't update" ITR0/1/2. + */ +enum ice_dyn_idx_t { + ICE_IDX_ITR0 = 0, + ICE_IDX_ITR1 = 1, + ICE_IDX_ITR2 = 2, + ICE_ITR_NONE = 3 /* ITR_NONE must not be used as an index */ +}; + +/* By convenction ITR0 is used for RX, and ITR1 is used for TX */ +#define ICE_RX_ITR ICE_IDX_ITR0 +#define ICE_TX_ITR ICE_IDX_ITR1 + +#define ICE_ITR_MAX 8160 + +/* Define the default Tx and Rx ITR as 50us (translates to ~20k int/sec max) */ +#define ICE_DFLT_TX_ITR 50 +#define ICE_DFLT_RX_ITR 50 + +/** + * @enum ice_rx_dtype + * @brief DTYPE header split options + * + * This enum matches the Rx context bits to define whether header split is + * enabled or not. + */ +enum ice_rx_dtype { + ICE_RX_DTYPE_NO_SPLIT = 0, + ICE_RX_DTYPE_HEADER_SPLIT = 1, + ICE_RX_DTYPE_SPLIT_ALWAYS = 2, +}; + +#if 0 +/* List of hardware offloads we support */ +#define ICE_CSUM_OFFLOAD (CSUM_IP | CSUM_IP_TCP | CSUM_IP_UDP | CSUM_IP_SCTP | \ + CSUM_IP6_TCP| CSUM_IP6_UDP | CSUM_IP6_SCTP | \ + CSUM_IP_TSO | CSUM_IP6_TSO) + +/* Macros to decide what kind of hardware offload to enable */ +#define ICE_CSUM_TCP (CSUM_IP_TCP|CSUM_IP_TSO|CSUM_IP6_TSO|CSUM_IP6_TCP) +#define ICE_CSUM_UDP (CSUM_IP_UDP|CSUM_IP6_UDP) +#define ICE_CSUM_SCTP (CSUM_IP_SCTP|CSUM_IP6_SCTP) +#define ICE_CSUM_IP (CSUM_IP|CSUM_IP_TSO) + +/* List of known RX CSUM offload flags */ +#define ICE_RX_CSUM_FLAGS (CSUM_L3_CALC | CSUM_L3_VALID | CSUM_L4_CALC | \ + CSUM_L4_VALID | CSUM_L5_CALC | CSUM_L5_VALID | \ + CSUM_COALESCED) +#endif + +/* List of interface capabilities supported by ice hardware */ +#define ICE_FULL_CAPS \ + (IFCAP_TSOv4 | IFCAP_TSOv6 | \ + IFCAP_CSUM_TCPv4 | IFCAP_CSUM_TCPv6| \ + IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_HWOFFLOAD | \ + IFCAP_VLAN_MTU | IFCAP_LRO) + +/* Safe mode disables support for hardware checksums and TSO */ +#define ICE_SAFE_CAPS \ + (ICE_FULL_CAPS & ~(IFCAP_CSUM_TCPv4 | IFCAP_CSUM_TCPv6 | \ + IFCAP_TSOv4 | IFCAP_TSOv6 | IFCAP_VLAN_HWOFFLOAD)) + +#define ICE_CAPS(sc) \ + (ice_is_bit_set(sc->feat_en, ICE_FEATURE_SAFE_MODE) ? ICE_SAFE_CAPS : ICE_FULL_CAPS) + + +/* Different control queue types: These are mainly for SW consumption. */ +enum ice_ctl_q { + ICE_CTL_Q_UNKNOWN = 0, + ICE_CTL_Q_ADMIN, + ICE_CTL_Q_MAILBOX, +}; + +/* Control Queue timeout settings - max delay 1s */ +#define ICE_CTL_Q_SQ_CMD_TIMEOUT 100000 /* Count 100000 times */ +#define ICE_CTL_Q_ADMIN_INIT_TIMEOUT 10 /* Count 10 times */ +#define ICE_CTL_Q_ADMIN_INIT_MSEC 100 /* Check every 100msec */ + +struct ice_ctl_q_ring { + void *dma_head; /* Virtual address to DMA head */ + struct ice_dma_mem desc_buf; /* descriptor ring memory */ + + union { + struct ice_dma_mem *sq_bi; + struct ice_dma_mem *rq_bi; + } r; + + uint16_t count; /* Number of descriptors */ + + /* used for interrupt processing */ + uint16_t next_to_use; + uint16_t next_to_clean; + + /* used for queue tracking */ + uint32_t head; + uint32_t tail; + uint32_t len; + uint32_t bah; + uint32_t bal; + uint32_t len_mask; + uint32_t len_ena_mask; + uint32_t len_crit_mask; + uint32_t head_mask; +}; + +/* sq transaction details */ +struct ice_sq_cd { + struct ice_aq_desc *wb_desc; +}; + +/* rq event information */ +struct ice_rq_event_info { + struct ice_aq_desc desc; + uint16_t msg_len; + uint16_t buf_len; + uint8_t *msg_buf; +}; + +/* Control Queue information */ +struct ice_ctl_q_info { + enum ice_ctl_q qtype; + struct ice_ctl_q_ring rq; /* receive queue */ + struct ice_ctl_q_ring sq; /* send queue */ + uint32_t sq_cmd_timeout; /* send queue cmd write back timeout */ + + uint16_t num_rq_entries; /* receive queue depth */ + uint16_t num_sq_entries; /* send queue depth */ + uint16_t rq_buf_size; /* receive queue buffer size */ + uint16_t sq_buf_size; /* send queue buffer size */ + enum ice_aq_err sq_last_status; /* last status on send queue */ + struct ice_lock sq_lock; /* Send queue lock */ + struct ice_lock rq_lock; /* Receive queue lock */ +}; + +enum ice_mac_type { + ICE_MAC_UNKNOWN = 0, + ICE_MAC_VF, + ICE_MAC_E810, + ICE_MAC_GENERIC, + ICE_MAC_GENERIC_3K, + ICE_MAC_GENERIC_3K_E825, +}; + +/* + * Reset types used to determine which kind of reset was requested. These + * defines match what the RESET_TYPE field of the GLGEN_RSTAT register. + * ICE_RESET_PFR does not match any RESET_TYPE field in the GLGEN_RSTAT register + * because its reset source is different than the other types listed. + */ +enum ice_reset_req { + ICE_RESET_POR = 0, + ICE_RESET_INVAL = 0, + ICE_RESET_CORER = 1, + ICE_RESET_GLOBR = 2, + ICE_RESET_EMPR = 3, + ICE_RESET_PFR = 4, +}; + +/* Common HW capabilities for SW use */ +struct ice_hw_common_caps { + /* Write CSR protection */ + uint64_t wr_csr_prot; + uint32_t switching_mode; + /* switching mode supported - EVB switching (including cloud) */ +#define ICE_NVM_IMAGE_TYPE_EVB 0x0 + + /* Manageablity mode & supported protocols over MCTP */ + uint32_t mgmt_mode; +#define ICE_MGMT_MODE_PASS_THRU_MODE_M 0xF +#define ICE_MGMT_MODE_CTL_INTERFACE_M 0xF0 +#define ICE_MGMT_MODE_REDIR_SB_INTERFACE_M 0xF00 + + uint32_t mgmt_protocols_mctp; +#define ICE_MGMT_MODE_PROTO_RSVD BIT(0) +#define ICE_MGMT_MODE_PROTO_PLDM BIT(1) +#define ICE_MGMT_MODE_PROTO_OEM BIT(2) +#define ICE_MGMT_MODE_PROTO_NC_SI BIT(3) + + uint32_t os2bmc; + uint32_t valid_functions; + /* DCB capabilities */ + uint32_t active_tc_bitmap; + uint32_t maxtc; + + /* RSS related capabilities */ + uint32_t rss_table_size; /* 512 for PFs and 64 for VFs */ + uint32_t rss_table_entry_width; /* RSS Entry width in bits */ + + /* Tx/Rx queues */ + uint32_t num_rxq; /* Number/Total Rx queues */ + uint32_t rxq_first_id; /* First queue ID for Rx queues */ + uint32_t num_txq; /* Number/Total Tx queues */ + uint32_t txq_first_id; /* First queue ID for Tx queues */ + + /* MSI-X vectors */ + uint32_t num_msix_vectors; + uint32_t msix_vector_first_id; + + /* Max MTU for function or device */ + uint32_t max_mtu; + + /* WOL related */ + uint32_t num_wol_proxy_fltr; + uint32_t wol_proxy_vsi_seid; + + /* LED/SDP pin count */ + uint32_t led_pin_num; + uint32_t sdp_pin_num; + + /* LED/SDP - Supports up to 12 LED pins and 8 SDP signals */ +#define ICE_MAX_SUPPORTED_GPIO_LED 12 +#define ICE_MAX_SUPPORTED_GPIO_SDP 8 + uint8_t led[ICE_MAX_SUPPORTED_GPIO_LED]; + uint8_t sdp[ICE_MAX_SUPPORTED_GPIO_SDP]; + + /* SR-IOV virtualization */ + uint8_t sr_iov_1_1; /* SR-IOV enabled */ + + /* VMDQ */ + uint8_t vmdq; /* VMDQ supported */ + + /* EVB capabilities */ + uint8_t evb_802_1_qbg; /* Edge Virtual Bridging */ + uint8_t evb_802_1_qbh; /* Bridge Port Extension */ + + uint8_t dcb; + uint8_t iscsi; + uint8_t mgmt_cem; + uint8_t iwarp; + uint8_t roce_lag; + + /* WoL and APM support */ +#define ICE_WOL_SUPPORT_M BIT(0) +#define ICE_ACPI_PROG_MTHD_M BIT(1) +#define ICE_PROXY_SUPPORT_M BIT(2) + uint8_t apm_wol_support; + uint8_t acpi_prog_mthd; + uint8_t proxy_support; + bool sec_rev_disabled; + bool update_disabled; + bool nvm_unified_update; + bool netlist_auth; +#define ICE_NVM_MGMT_SEC_REV_DISABLED BIT(0) +#define ICE_NVM_MGMT_UPDATE_DISABLED BIT(1) +#define ICE_NVM_MGMT_UNIFIED_UPD_SUPPORT BIT(3) +#define ICE_NVM_MGMT_NETLIST_AUTH_SUPPORT BIT(5) + /* PCIe reset avoidance */ + bool pcie_reset_avoidance; /* false: not supported, true: supported */ + /* Post update reset restriction */ + bool reset_restrict_support; /* false: not supported, true: supported */ + + /* External topology device images within the NVM */ +#define ICE_EXT_TOPO_DEV_IMG_COUNT 4 + uint32_t ext_topo_dev_img_ver_high[ICE_EXT_TOPO_DEV_IMG_COUNT]; + uint32_t ext_topo_dev_img_ver_low[ICE_EXT_TOPO_DEV_IMG_COUNT]; + uint8_t ext_topo_dev_img_part_num[ICE_EXT_TOPO_DEV_IMG_COUNT]; +#define ICE_EXT_TOPO_DEV_IMG_PART_NUM_S 8 +#define ICE_EXT_TOPO_DEV_IMG_PART_NUM_M \ + MAKEMASK(0xFF, ICE_EXT_TOPO_DEV_IMG_PART_NUM_S) + bool ext_topo_dev_img_load_en[ICE_EXT_TOPO_DEV_IMG_COUNT]; +#define ICE_EXT_TOPO_DEV_IMG_LOAD_EN BIT(0) + bool ext_topo_dev_img_prog_en[ICE_EXT_TOPO_DEV_IMG_COUNT]; +#define ICE_EXT_TOPO_DEV_IMG_PROG_EN BIT(1) + bool ext_topo_dev_img_ver_schema[ICE_EXT_TOPO_DEV_IMG_COUNT]; +#define ICE_EXT_TOPO_DEV_IMG_VER_SCHEMA BIT(2) + bool tx_sched_topo_comp_mode_en; + bool dyn_flattening_en; + /* Support for OROM update in Recovery Mode */ + bool orom_recovery_update; +}; + +#define ICE_NAC_TOPO_PRIMARY_M BIT(0) +#define ICE_NAC_TOPO_DUAL_M BIT(1) +#define ICE_NAC_TOPO_ID_M MAKEMASK(0xf, 0) + +enum ice_aq_res_ids { + ICE_NVM_RES_ID = 1, + ICE_SPD_RES_ID, + ICE_CHANGE_LOCK_RES_ID, + ICE_GLOBAL_CFG_LOCK_RES_ID +}; + +/* FW update timeout definitions are in milliseconds */ +#define ICE_NVM_TIMEOUT 180000 +#define ICE_CHANGE_LOCK_TIMEOUT 1000 +#define ICE_GLOBAL_CFG_LOCK_TIMEOUT 3000 + +struct ice_link_default_override_tlv { + uint8_t options; +#define ICE_LINK_OVERRIDE_OPT_M 0x3F +#define ICE_LINK_OVERRIDE_STRICT_MODE BIT(0) +#define ICE_LINK_OVERRIDE_EPCT_DIS BIT(1) +#define ICE_LINK_OVERRIDE_PORT_DIS BIT(2) +#define ICE_LINK_OVERRIDE_EN BIT(3) +#define ICE_LINK_OVERRIDE_AUTO_LINK_DIS BIT(4) +#define ICE_LINK_OVERRIDE_EEE_EN BIT(5) + uint8_t phy_config; +#define ICE_LINK_OVERRIDE_PHY_CFG_S 8 +#define ICE_LINK_OVERRIDE_PHY_CFG_M (0xC3 << ICE_LINK_OVERRIDE_PHY_CFG_S) +#define ICE_LINK_OVERRIDE_PAUSE_M 0x3 +#define ICE_LINK_OVERRIDE_LESM_EN BIT(6) +#define ICE_LINK_OVERRIDE_AUTO_FEC_EN BIT(7) + uint8_t fec_options; +#define ICE_LINK_OVERRIDE_FEC_OPT_M 0xFF + uint8_t rsvd1; + uint64_t phy_type_low; + uint64_t phy_type_high; +}; + +#define ICE_NVM_VER_LEN 32 + +#define ICE_NVM_VER_LEN 32 + +#define ICE_MAX_TRAFFIC_CLASS 8 + +/* Max number of port to queue branches w.r.t topology */ +#define ICE_TXSCHED_MAX_BRANCHES ICE_MAX_TRAFFIC_CLASS + +#define ice_for_each_traffic_class(_i) \ + for ((_i) = 0; (_i) < ICE_MAX_TRAFFIC_CLASS; (_i)++) + +#define ICE_INVAL_TEID 0xFFFFFFFF +#define ICE_DFLT_AGG_ID 0 + +struct ice_sched_node { + struct ice_sched_node *parent; + struct ice_sched_node *sibling; /* next sibling in the same layer */ + struct ice_sched_node **children; + struct ice_aqc_txsched_elem_data info; + uint32_t agg_id; /* aggregator group ID */ + uint16_t vsi_handle; + uint8_t in_use; /* suspended or in use */ + uint8_t tx_sched_layer; /* Logical Layer (1-9) */ + uint8_t num_children; + uint8_t tc_num; + uint8_t owner; +#define ICE_SCHED_NODE_OWNER_LAN 0 +#define ICE_SCHED_NODE_OWNER_AE 1 +#define ICE_SCHED_NODE_OWNER_RDMA 2 +}; + +/* Access Macros for Tx Sched Elements data */ +#define ICE_TXSCHED_GET_NODE_TEID(x) le32toh((x)->info.node_teid) +#define ICE_TXSCHED_GET_PARENT_TEID(x) le32toh((x)->info.parent_teid) +#define ICE_TXSCHED_GET_CIR_RL_ID(x) \ + le16toh((x)->info.cir_bw.bw_profile_idx) +#define ICE_TXSCHED_GET_EIR_RL_ID(x) \ + le16toh((x)->info.eir_bw.bw_profile_idx) +#define ICE_TXSCHED_GET_SRL_ID(x) le16toh((x)->info.srl_id) +#define ICE_TXSCHED_GET_CIR_BWALLOC(x) \ + le16toh((x)->info.cir_bw.bw_alloc) +#define ICE_TXSCHED_GET_EIR_BWALLOC(x) \ + le16toh((x)->info.eir_bw.bw_alloc) + +/* Rate limit types */ +enum ice_rl_type { + ICE_UNKNOWN_BW = 0, + ICE_MIN_BW, /* for CIR profile */ + ICE_MAX_BW, /* for EIR profile */ + ICE_SHARED_BW /* for shared profile */ +}; + +#define ICE_SCHED_MIN_BW 500 /* in Kbps */ +#define ICE_SCHED_MAX_BW 100000000 /* in Kbps */ +#define ICE_SCHED_DFLT_BW 0xFFFFFFFF /* unlimited */ +#define ICE_SCHED_NO_PRIORITY 0 +#define ICE_SCHED_NO_BW_WT 0 +#define ICE_SCHED_DFLT_RL_PROF_ID 0 +#define ICE_SCHED_NO_SHARED_RL_PROF_ID 0xFFFF +#define ICE_SCHED_DFLT_BW_WT 4 +#define ICE_SCHED_INVAL_PROF_ID 0xFFFF +#define ICE_SCHED_DFLT_BURST_SIZE (15 * 1024) /* in bytes (15k) */ + +struct ice_driver_ver { + uint8_t major_ver; + uint8_t minor_ver; + uint8_t build_ver; + uint8_t subbuild_ver; + uint8_t driver_string[32]; +}; + +enum ice_fc_mode { + ICE_FC_NONE = 0, + ICE_FC_RX_PAUSE, + ICE_FC_TX_PAUSE, + ICE_FC_FULL, + ICE_FC_AUTO, + ICE_FC_PFC, + ICE_FC_DFLT +}; + +enum ice_fec_mode { + ICE_FEC_NONE = 0, + ICE_FEC_RS, + ICE_FEC_BASER, + ICE_FEC_AUTO, + ICE_FEC_DIS_AUTO +}; + +/* Flow control (FC) parameters */ +struct ice_fc_info { + enum ice_fc_mode current_mode; /* FC mode in effect */ + enum ice_fc_mode req_mode; /* FC mode requested by caller */ +}; + +/* Option ROM version information */ +struct ice_orom_info { + uint8_t major; /* Major version of OROM */ + uint8_t patch; /* Patch version of OROM */ + uint16_t build; /* Build version of OROM */ + uint32_t srev; /* Security revision */ +}; + +/* NVM version information */ +struct ice_nvm_info { + uint32_t eetrack; + uint32_t srev; + uint8_t major; + uint8_t minor; +}; + +/* Minimum Security Revision information */ +struct ice_minsrev_info { + uint32_t nvm; + uint32_t orom; + uint8_t nvm_valid : 1; + uint8_t orom_valid : 1; +}; + +/* netlist version information */ +struct ice_netlist_info { + uint32_t major; /* major high/low */ + uint32_t minor; /* minor high/low */ + uint32_t type; /* type high/low */ + uint32_t rev; /* revision high/low */ + uint32_t hash; /* SHA-1 hash word */ + uint16_t cust_ver; /* customer version */ +}; + +/* Enumeration of possible flash banks for the NVM, OROM, and Netlist modules + * of the flash image. + */ +enum ice_flash_bank { + ICE_INVALID_FLASH_BANK, + ICE_1ST_FLASH_BANK, + ICE_2ND_FLASH_BANK, +}; + +/* Enumeration of which flash bank is desired to read from, either the active + * bank or the inactive bank. Used to abstract 1st and 2nd bank notion from + * code which just wants to read the active or inactive flash bank. + */ +enum ice_bank_select { + ICE_ACTIVE_FLASH_BANK, + ICE_INACTIVE_FLASH_BANK, +}; + +/* information for accessing NVM, OROM, and Netlist flash banks */ +struct ice_bank_info { + uint32_t nvm_ptr; /* Pointer to 1st NVM bank */ + uint32_t nvm_size; /* Size of NVM bank */ + uint32_t orom_ptr; /* Pointer to 1st OROM bank */ + uint32_t orom_size; /* Size of OROM bank */ + uint32_t netlist_ptr; /* Pointer to 1st Netlist bank */ + uint32_t netlist_size; /* Size of Netlist bank */ + enum ice_flash_bank nvm_bank; /* Active NVM bank */ + enum ice_flash_bank orom_bank; /* Active OROM bank */ + enum ice_flash_bank netlist_bank; /* Active Netlist bank */ +}; + +/* Flash Chip Information */ +struct ice_flash_info { + struct ice_orom_info orom; /* Option ROM version info */ + struct ice_nvm_info nvm; /* NVM version information */ + struct ice_netlist_info netlist;/* Netlist version info */ + struct ice_bank_info banks; /* Flash Bank information */ + uint16_t sr_words; /* Shadow RAM size in words */ + uint32_t flash_size; /* Size of available flash in bytes */ + uint8_t blank_nvm_mode; /* is NVM empty (no FW present) */ +}; + +/* Checksum and Shadow RAM pointers */ +#define ICE_SR_NVM_CTRL_WORD 0x00 +#define ICE_SR_PHY_ANALOG_PTR 0x04 +#define ICE_SR_OPTION_ROM_PTR 0x05 +#define ICE_SR_RO_PCIR_REGS_AUTO_LOAD_PTR 0x06 +#define ICE_SR_AUTO_GENERATED_POINTERS_PTR 0x07 +#define ICE_SR_PCIR_REGS_AUTO_LOAD_PTR 0x08 +#define ICE_SR_EMP_GLOBAL_MODULE_PTR 0x09 +#define ICE_SR_EMP_IMAGE_PTR 0x0B +#define ICE_SR_PE_IMAGE_PTR 0x0C +#define ICE_SR_CSR_PROTECTED_LIST_PTR 0x0D +#define ICE_SR_MNG_CFG_PTR 0x0E +#define ICE_SR_EMP_MODULE_PTR 0x0F +#define ICE_SR_PBA_BLOCK_PTR 0x16 +#define ICE_SR_BOOT_CFG_PTR 0x132 +#define ICE_SR_NVM_WOL_CFG 0x19 +#define ICE_NVM_OROM_VER_OFF 0x02 +#define ICE_SR_NVM_DEV_STARTER_VER 0x18 +#define ICE_SR_ALTERNATE_SAN_MAC_ADDR_PTR 0x27 +#define ICE_SR_PERMANENT_SAN_MAC_ADDR_PTR 0x28 +#define ICE_SR_NVM_MAP_VER 0x29 +#define ICE_SR_NVM_IMAGE_VER 0x2A +#define ICE_SR_NVM_STRUCTURE_VER 0x2B +#define ICE_SR_NVM_EETRACK_LO 0x2D +#define ICE_SR_NVM_EETRACK_HI 0x2E +#define ICE_NVM_VER_LO_SHIFT 0 +#define ICE_NVM_VER_LO_MASK (0xff << ICE_NVM_VER_LO_SHIFT) +#define ICE_NVM_VER_HI_SHIFT 12 +#define ICE_NVM_VER_HI_MASK (0xf << ICE_NVM_VER_HI_SHIFT) +#define ICE_OEM_EETRACK_ID 0xffffffff +#define ICE_OROM_VER_PATCH_SHIFT 0 +#define ICE_OROM_VER_PATCH_MASK (0xff << ICE_OROM_VER_PATCH_SHIFT) +#define ICE_OROM_VER_BUILD_SHIFT 8 +#define ICE_OROM_VER_BUILD_MASK (0xffff << ICE_OROM_VER_BUILD_SHIFT) +#define ICE_OROM_VER_SHIFT 24 +#define ICE_OROM_VER_MASK (0xff << ICE_OROM_VER_SHIFT) +#define ICE_SR_VPD_PTR 0x2F +#define ICE_SR_PXE_SETUP_PTR 0x30 +#define ICE_SR_PXE_CFG_CUST_OPTIONS_PTR 0x31 +#define ICE_SR_NVM_ORIGINAL_EETRACK_LO 0x34 +#define ICE_SR_NVM_ORIGINAL_EETRACK_HI 0x35 +#define ICE_SR_VLAN_CFG_PTR 0x37 +#define ICE_SR_POR_REGS_AUTO_LOAD_PTR 0x38 +#define ICE_SR_EMPR_REGS_AUTO_LOAD_PTR 0x3A +#define ICE_SR_GLOBR_REGS_AUTO_LOAD_PTR 0x3B +#define ICE_SR_CORER_REGS_AUTO_LOAD_PTR 0x3C +#define ICE_SR_PHY_CFG_SCRIPT_PTR 0x3D +#define ICE_SR_PCIE_ALT_AUTO_LOAD_PTR 0x3E +#define ICE_SR_SW_CHECKSUM_WORD 0x3F +#define ICE_SR_PFA_PTR 0x40 +#define ICE_SR_1ST_SCRATCH_PAD_PTR 0x41 +#define ICE_SR_1ST_NVM_BANK_PTR 0x42 +#define ICE_SR_NVM_BANK_SIZE 0x43 +#define ICE_SR_1ST_OROM_BANK_PTR 0x44 +#define ICE_SR_OROM_BANK_SIZE 0x45 +#define ICE_SR_NETLIST_BANK_PTR 0x46 +#define ICE_SR_NETLIST_BANK_SIZE 0x47 +#define ICE_SR_EMP_SR_SETTINGS_PTR 0x48 +#define ICE_SR_CONFIGURATION_METADATA_PTR 0x4D +#define ICE_SR_IMMEDIATE_VALUES_PTR 0x4E +#define ICE_SR_LINK_DEFAULT_OVERRIDE_PTR 0x134 +#define ICE_SR_POR_REGISTERS_AUTOLOAD_PTR 0x118 + +/* CSS Header words */ +#define ICE_NVM_CSS_HDR_LEN_L 0x02 +#define ICE_NVM_CSS_HDR_LEN_H 0x03 +#define ICE_NVM_CSS_SREV_L 0x14 +#define ICE_NVM_CSS_SREV_H 0x15 + +/* Length of Authentication header section in words */ +#define ICE_NVM_AUTH_HEADER_LEN 0x08 + +/* The Link Topology Netlist section is stored as a series of words. It is + * stored in the NVM as a TLV, with the first two words containing the type + * and length. + */ +#define ICE_NETLIST_LINK_TOPO_MOD_ID 0x011B +#define ICE_NETLIST_TYPE_OFFSET 0x0000 +#define ICE_NETLIST_LEN_OFFSET 0x0001 + +/* The Link Topology section follows the TLV header. When reading the netlist + * using ice_read_netlist_module, we need to account for the 2-word TLV + * header. + */ +#define ICE_NETLIST_LINK_TOPO_OFFSET(n) ((n) + 2) + +#define ICE_LINK_TOPO_MODULE_LEN ICE_NETLIST_LINK_TOPO_OFFSET(0x0000) +#define ICE_LINK_TOPO_NODE_COUNT ICE_NETLIST_LINK_TOPO_OFFSET(0x0001) + +#define ICE_LINK_TOPO_NODE_COUNT_M MAKEMASK(0x3FF, 0) + +/* The Netlist ID Block is located after all of the Link Topology nodes. */ +#define ICE_NETLIST_ID_BLK_SIZE 0x30 +#define ICE_NETLIST_ID_BLK_OFFSET(n) ICE_NETLIST_LINK_TOPO_OFFSET(0x0004 + 2 * (n)) + +/* netlist ID block field offsets (word offsets) */ +#define ICE_NETLIST_ID_BLK_MAJOR_VER_LOW 0x02 +#define ICE_NETLIST_ID_BLK_MAJOR_VER_HIGH 0x03 +#define ICE_NETLIST_ID_BLK_MINOR_VER_LOW 0x04 +#define ICE_NETLIST_ID_BLK_MINOR_VER_HIGH 0x05 +#define ICE_NETLIST_ID_BLK_TYPE_LOW 0x06 +#define ICE_NETLIST_ID_BLK_TYPE_HIGH 0x07 +#define ICE_NETLIST_ID_BLK_REV_LOW 0x08 +#define ICE_NETLIST_ID_BLK_REV_HIGH 0x09 +#define ICE_NETLIST_ID_BLK_SHA_HASH_WORD(n) (0x0A + (n)) +#define ICE_NETLIST_ID_BLK_CUST_VER 0x2F + +/* Auxiliary field, mask and shift definition for Shadow RAM and NVM Flash */ +#define ICE_SR_VPD_SIZE_WORDS 512 +#define ICE_SR_PCIE_ALT_SIZE_WORDS 512 +#define ICE_SR_CTRL_WORD_1_S 0x06 +#define ICE_SR_CTRL_WORD_1_M (0x03 << ICE_SR_CTRL_WORD_1_S) +#define ICE_SR_CTRL_WORD_VALID 0x1 +#define ICE_SR_CTRL_WORD_OROM_BANK BIT(3) +#define ICE_SR_CTRL_WORD_NETLIST_BANK BIT(4) +#define ICE_SR_CTRL_WORD_NVM_BANK BIT(5) + +#define ICE_SR_NVM_PTR_4KB_UNITS BIT(15) + +/* Shadow RAM related */ +#define ICE_SR_SECTOR_SIZE_IN_WORDS 0x800 +#define ICE_SR_BUF_ALIGNMENT 4096 +#define ICE_SR_WORDS_IN_1KB 512 +/* Checksum should be calculated such that after adding all the words, + * including the checksum word itself, the sum should be 0xBABA. + */ +#define ICE_SR_SW_CHECKSUM_BASE 0xBABA + +/* Link override related */ +#define ICE_SR_PFA_LINK_OVERRIDE_WORDS 10 +#define ICE_SR_PFA_LINK_OVERRIDE_PHY_WORDS 4 +#define ICE_SR_PFA_LINK_OVERRIDE_OFFSET 2 +#define ICE_SR_PFA_LINK_OVERRIDE_FEC_OFFSET 1 +#define ICE_SR_PFA_LINK_OVERRIDE_PHY_OFFSET 2 +#define ICE_FW_API_LINK_OVERRIDE_MAJ 1 +#define ICE_FW_API_LINK_OVERRIDE_MIN 5 +#define ICE_FW_API_LINK_OVERRIDE_PATCH 2 + +#define ICE_PBA_FLAG_DFLT 0xFAFA +/* Hash redirection LUT for VSI - maximum array size */ +#define ICE_VSIQF_HLUT_ARRAY_SIZE ((VSIQF_HLUT_MAX_INDEX + 1) * 4) + +/* + * Defines for values in the VF_PE_DB_SIZE bits in the GLPCI_LBARCTRL register. + * This is needed to determine the BAR0 space for the VFs + */ +#define GLPCI_LBARCTRL_VF_PE_DB_SIZE_0KB 0x0 +#define GLPCI_LBARCTRL_VF_PE_DB_SIZE_8KB 0x1 +#define GLPCI_LBARCTRL_VF_PE_DB_SIZE_64KB 0x2 + +/* AQ API version for LLDP_FILTER_CONTROL */ +#define ICE_FW_API_LLDP_FLTR_MAJ 1 +#define ICE_FW_API_LLDP_FLTR_MIN 7 +#define ICE_FW_API_LLDP_FLTR_PATCH 1 + +/* AQ API version for report default configuration */ +#define ICE_FW_API_REPORT_DFLT_CFG_MAJ 1 +#define ICE_FW_API_REPORT_DFLT_CFG_MIN 7 +#define ICE_FW_API_REPORT_DFLT_CFG_PATCH 3 + +/* FW branch number for hardware families */ +#define ICE_FW_VER_BRANCH_E82X 0 +#define ICE_FW_VER_BRANCH_E810 1 + +/* FW version for FEC disable in Auto FEC mode */ +#define ICE_FW_FEC_DIS_AUTO_MAJ 7 +#define ICE_FW_FEC_DIS_AUTO_MIN 0 +#define ICE_FW_FEC_DIS_AUTO_PATCH 5 +#define ICE_FW_FEC_DIS_AUTO_MAJ_E82X 7 +#define ICE_FW_FEC_DIS_AUTO_MIN_E82X 1 +#define ICE_FW_FEC_DIS_AUTO_PATCH_E82X 2 + +/* AQ API version for FW health reports */ +#define ICE_FW_API_HEALTH_REPORT_MAJ 1 +#define ICE_FW_API_HEALTH_REPORT_MIN 7 +#define ICE_FW_API_HEALTH_REPORT_PATCH 6 + +/* AQ API version for FW auto drop reports */ +#define ICE_FW_API_AUTO_DROP_MAJ 1 +#define ICE_FW_API_AUTO_DROP_MIN 4 + +/* Function specific capabilities */ +struct ice_hw_func_caps { + struct ice_hw_common_caps common_cap; + uint32_t num_allocd_vfs; /* Number of allocated VFs */ + uint32_t vf_base_id; /* Logical ID of the first VF */ + uint32_t guar_num_vsi; +}; + +struct ice_nac_topology { + uint32_t mode; + uint8_t id; +}; + +/* Device wide capabilities */ +struct ice_hw_dev_caps { + struct ice_hw_common_caps common_cap; + uint32_t num_vfs_exposed; /* Total number of VFs exposed */ + uint32_t num_vsi_allocd_to_host; /* Excluding EMP VSI */ + uint32_t num_funcs; + struct ice_nac_topology nac_topo; + /* bitmap of supported sensors */ + uint32_t supported_sensors; +#define ICE_SENSOR_SUPPORT_E810_INT_TEMP BIT(0) +}; + +#define SCHED_NODE_NAME_MAX_LEN 32 + +#define ICE_SCHED_5_LAYERS 5 +#define ICE_SCHED_9_LAYERS 9 + +#define ICE_QGRP_LAYER_OFFSET 2 +#define ICE_VSI_LAYER_OFFSET 4 +#define ICE_AGG_LAYER_OFFSET 6 +#define ICE_SCHED_INVAL_LAYER_NUM 0xFF +/* Burst size is a 12 bits register that is configured while creating the RL + * profile(s). MSB is a granularity bit and tells the granularity type + * 0 - LSB bits are in 64 bytes granularity + * 1 - LSB bits are in 1K bytes granularity + */ +#define ICE_64_BYTE_GRANULARITY 0 +#define ICE_KBYTE_GRANULARITY BIT(11) +#define ICE_MIN_BURST_SIZE_ALLOWED 64 /* In Bytes */ +#define ICE_MAX_BURST_SIZE_ALLOWED \ + ((BIT(11) - 1) * 1024) /* In Bytes */ +#define ICE_MAX_BURST_SIZE_64_BYTE_GRANULARITY \ + ((BIT(11) - 1) * 64) /* In Bytes */ +#define ICE_MAX_BURST_SIZE_KBYTE_GRANULARITY ICE_MAX_BURST_SIZE_ALLOWED + +#define ICE_RL_PROF_ACCURACY_BYTES 128 +#define ICE_RL_PROF_MULTIPLIER 10000 +#define ICE_RL_PROF_TS_MULTIPLIER 32 +#define ICE_RL_PROF_FRACTION 512 + +#define ICE_PSM_CLK_367MHZ_IN_HZ 367647059 +#define ICE_PSM_CLK_416MHZ_IN_HZ 416666667 +#define ICE_PSM_CLK_446MHZ_IN_HZ 446428571 +#define ICE_PSM_CLK_390MHZ_IN_HZ 390625000 + +#define PSM_CLK_SRC_367_MHZ 0x0 +#define PSM_CLK_SRC_416_MHZ 0x1 +#define PSM_CLK_SRC_446_MHZ 0x2 +#define PSM_CLK_SRC_390_MHZ 0x3 + +#define ICE_SCHED_MIN_BW 500 /* in Kbps */ +#define ICE_SCHED_MAX_BW 100000000 /* in Kbps */ +#define ICE_SCHED_DFLT_BW 0xFFFFFFFF /* unlimited */ +#define ICE_SCHED_NO_PRIORITY 0 +#define ICE_SCHED_NO_BW_WT 0 +#define ICE_SCHED_DFLT_RL_PROF_ID 0 +#define ICE_SCHED_NO_SHARED_RL_PROF_ID 0xFFFF +#define ICE_SCHED_DFLT_BW_WT 4 +#define ICE_SCHED_INVAL_PROF_ID 0xFFFF +#define ICE_SCHED_DFLT_BURST_SIZE (15 * 1024) /* in bytes (15k) */ + +/* Access Macros for Tx Sched RL Profile data */ +#define ICE_TXSCHED_GET_RL_PROF_ID(p) le16toh((p)->info.profile_id) +#define ICE_TXSCHED_GET_RL_MBS(p) le16toh((p)->info.max_burst_size) +#define ICE_TXSCHED_GET_RL_MULTIPLIER(p) le16toh((p)->info.rl_multiply) +#define ICE_TXSCHED_GET_RL_WAKEUP_MV(p) le16toh((p)->info.wake_up_calc) +#define ICE_TXSCHED_GET_RL_ENCODE(p) le16toh((p)->info.rl_encode) + +#define ICE_MAX_PORT_PER_PCI_DEV 8 + +/* The following tree example shows the naming conventions followed under + * ice_port_info struct for default scheduler tree topology. + * + * A tree on a port + * * ---> root node + * (TC0)/ / / / \ \ \ \(TC7) ---> num_branches (range:1- 8) + * * * * * * * * * | + * / | + * * | + * / |-> num_elements (range:1 - 9) + * * | implies num_of_layers + * / | + * (a)* | + * + * (a) is the last_node_teid(not of type Leaf). A leaf node is created under + * (a) as child node where queues get added, add Tx/Rx queue admin commands; + * need TEID of (a) to add queues. + * + * This tree + * -> has 8 branches (one for each TC) + * -> First branch (TC0) has 4 elements + * -> has 4 layers + * -> (a) is the topmost layer node created by firmware on branch 0 + * + * Note: Above asterisk tree covers only basic terminology and scenario. + * Refer to the documentation for more info. + */ + + /* Data structure for saving BW information */ +enum ice_bw_type { + ICE_BW_TYPE_PRIO, + ICE_BW_TYPE_CIR, + ICE_BW_TYPE_CIR_WT, + ICE_BW_TYPE_EIR, + ICE_BW_TYPE_EIR_WT, + ICE_BW_TYPE_SHARED, + ICE_BW_TYPE_CNT /* This must be last */ +}; + +struct ice_bw { + uint32_t bw; + uint16_t bw_alloc; +}; + +struct ice_bw_type_info { + ice_declare_bitmap(bw_t_bitmap, ICE_BW_TYPE_CNT); + uint8_t generic; + struct ice_bw cir_bw; + struct ice_bw eir_bw; + uint32_t shared_bw; +}; + +/* VSI queue context structure for given TC */ +struct ice_q_ctx { + uint16_t q_handle; + uint32_t q_teid; + /* bw_t_info saves queue BW information */ + struct ice_bw_type_info bw_t_info; +}; + +struct ice_sched_agg_vsi_info { + TAILQ_ENTRY(ice_sched_agg_vsi_info) list_entry; + ice_declare_bitmap(tc_bitmap, ICE_MAX_TRAFFIC_CLASS); + uint16_t vsi_handle; + /* save aggregator VSI TC bitmap */ + ice_declare_bitmap(replay_tc_bitmap, ICE_MAX_TRAFFIC_CLASS); +}; + +/* VSI type list entry to locate corresponding VSI/aggregator nodes */ +struct ice_sched_vsi_info { + struct ice_sched_node *vsi_node[ICE_MAX_TRAFFIC_CLASS]; + struct ice_sched_node *ag_node[ICE_MAX_TRAFFIC_CLASS]; + uint16_t max_lanq[ICE_MAX_TRAFFIC_CLASS]; + uint16_t max_rdmaq[ICE_MAX_TRAFFIC_CLASS]; + /* bw_t_info saves VSI BW information */ + struct ice_bw_type_info bw_t_info[ICE_MAX_TRAFFIC_CLASS]; +}; + +/* The aggregator type determines if identifier is for a VSI group, + * aggregator group, aggregator of queues, or queue group. + */ +enum ice_agg_type { + ICE_AGG_TYPE_UNKNOWN = 0, + ICE_AGG_TYPE_TC, + ICE_AGG_TYPE_AGG, /* aggregator */ + ICE_AGG_TYPE_VSI, + ICE_AGG_TYPE_QG, + ICE_AGG_TYPE_Q +}; + +TAILQ_HEAD(ice_vsi_list_head, ice_sched_agg_vsi_info); + +/* + * For now, set this to the hardware maximum. Each function gets a smaller + * number assigned to it in hw->func_caps.guar_num_vsi, though there + * appears to be no guarantee that is the maximum number that a function + * can use. + */ +#define ICE_MAX_VSI_AVAILABLE 768 + +struct ice_sched_agg_info { + struct ice_vsi_list_head agg_vsi_list; + TAILQ_ENTRY(ice_sched_agg_info) list_entry; + ice_declare_bitmap(tc_bitmap, ICE_MAX_TRAFFIC_CLASS); + uint32_t agg_id; + enum ice_agg_type agg_type; + /* bw_t_info saves aggregator BW information */ + struct ice_bw_type_info bw_t_info[ICE_MAX_TRAFFIC_CLASS]; + /* save aggregator TC bitmap */ + ice_declare_bitmap(replay_tc_bitmap, ICE_MAX_TRAFFIC_CLASS); +}; + +#define ICE_DCBX_OFFLOAD_DIS 0 +#define ICE_DCBX_OFFLOAD_ENABLED 1 + +#define ICE_DCBX_STATUS_NOT_STARTED 0 +#define ICE_DCBX_STATUS_IN_PROGRESS 1 +#define ICE_DCBX_STATUS_DONE 2 +#define ICE_DCBX_STATUS_MULTIPLE_PEERS 3 +#define ICE_DCBX_STATUS_DIS 7 + +#define ICE_TLV_TYPE_END 0 +#define ICE_TLV_TYPE_ORG 127 + +#define ICE_IEEE_8021QAZ_OUI 0x0080C2 +#define ICE_IEEE_SUBTYPE_ETS_CFG 9 +#define ICE_IEEE_SUBTYPE_ETS_REC 10 +#define ICE_IEEE_SUBTYPE_PFC_CFG 11 +#define ICE_IEEE_SUBTYPE_APP_PRI 12 + +#define ICE_CEE_DCBX_OUI 0x001B21 +#define ICE_CEE_DCBX_TYPE 2 + +#define ICE_DSCP_OUI 0xFFFFFF +#define ICE_DSCP_SUBTYPE_DSCP2UP 0x41 +#define ICE_DSCP_SUBTYPE_ENFORCE 0x42 +#define ICE_DSCP_SUBTYPE_TCBW 0x43 +#define ICE_DSCP_SUBTYPE_PFC 0x44 +#define ICE_DSCP_IPV6_OFFSET 80 + +#define ICE_CEE_SUBTYPE_CTRL 1 +#define ICE_CEE_SUBTYPE_PG_CFG 2 +#define ICE_CEE_SUBTYPE_PFC_CFG 3 +#define ICE_CEE_SUBTYPE_APP_PRI 4 + +#define ICE_CEE_MAX_FEAT_TYPE 3 +#define ICE_LLDP_ADMINSTATUS_DIS 0 +#define ICE_LLDP_ADMINSTATUS_ENA_RX 1 +#define ICE_LLDP_ADMINSTATUS_ENA_TX 2 +#define ICE_LLDP_ADMINSTATUS_ENA_RXTX 3 + +/* Defines for LLDP TLV header */ +#define ICE_LLDP_TLV_LEN_S 0 +#define ICE_LLDP_TLV_LEN_M (0x01FF << ICE_LLDP_TLV_LEN_S) +#define ICE_LLDP_TLV_TYPE_S 9 +#define ICE_LLDP_TLV_TYPE_M (0x7F << ICE_LLDP_TLV_TYPE_S) +#define ICE_LLDP_TLV_SUBTYPE_S 0 +#define ICE_LLDP_TLV_SUBTYPE_M (0xFF << ICE_LLDP_TLV_SUBTYPE_S) +#define ICE_LLDP_TLV_OUI_S 8 +#define ICE_LLDP_TLV_OUI_M (0xFFFFFFUL << ICE_LLDP_TLV_OUI_S) + +/* Defines for IEEE ETS TLV */ +#define ICE_IEEE_ETS_MAXTC_S 0 +#define ICE_IEEE_ETS_MAXTC_M (0x7 << ICE_IEEE_ETS_MAXTC_S) +#define ICE_IEEE_ETS_CBS_S 6 +#define ICE_IEEE_ETS_CBS_M BIT(ICE_IEEE_ETS_CBS_S) +#define ICE_IEEE_ETS_WILLING_S 7 +#define ICE_IEEE_ETS_WILLING_M BIT(ICE_IEEE_ETS_WILLING_S) +#define ICE_IEEE_ETS_PRIO_0_S 0 +#define ICE_IEEE_ETS_PRIO_0_M (0x7 << ICE_IEEE_ETS_PRIO_0_S) +#define ICE_IEEE_ETS_PRIO_1_S 4 +#define ICE_IEEE_ETS_PRIO_1_M (0x7 << ICE_IEEE_ETS_PRIO_1_S) +#define ICE_CEE_PGID_PRIO_0_S 0 +#define ICE_CEE_PGID_PRIO_0_M (0xF << ICE_CEE_PGID_PRIO_0_S) +#define ICE_CEE_PGID_PRIO_1_S 4 +#define ICE_CEE_PGID_PRIO_1_M (0xF << ICE_CEE_PGID_PRIO_1_S) +#define ICE_CEE_PGID_STRICT 15 + +/* Defines for IEEE TSA types */ +#define ICE_IEEE_TSA_STRICT 0 +#define ICE_IEEE_TSA_CBS 1 +#define ICE_IEEE_TSA_ETS 2 +#define ICE_IEEE_TSA_VENDOR 255 + +/* Defines for IEEE PFC TLV */ +#define ICE_IEEE_PFC_CAP_S 0 +#define ICE_IEEE_PFC_CAP_M (0xF << ICE_IEEE_PFC_CAP_S) +#define ICE_IEEE_PFC_MBC_S 6 +#define ICE_IEEE_PFC_MBC_M BIT(ICE_IEEE_PFC_MBC_S) +#define ICE_IEEE_PFC_WILLING_S 7 +#define ICE_IEEE_PFC_WILLING_M BIT(ICE_IEEE_PFC_WILLING_S) + +/* Defines for IEEE APP TLV */ +#define ICE_IEEE_APP_SEL_S 0 +#define ICE_IEEE_APP_SEL_M (0x7 << ICE_IEEE_APP_SEL_S) +#define ICE_IEEE_APP_PRIO_S 5 +#define ICE_IEEE_APP_PRIO_M (0x7 << ICE_IEEE_APP_PRIO_S) + +/* TLV definitions for preparing MIB */ +#define ICE_TLV_ID_CHASSIS_ID 0 +#define ICE_TLV_ID_PORT_ID 1 +#define ICE_TLV_ID_TIME_TO_LIVE 2 +#define ICE_IEEE_TLV_ID_ETS_CFG 3 +#define ICE_IEEE_TLV_ID_ETS_REC 4 +#define ICE_IEEE_TLV_ID_PFC_CFG 5 +#define ICE_IEEE_TLV_ID_APP_PRI 6 +#define ICE_TLV_ID_END_OF_LLDPPDU 7 +#define ICE_TLV_ID_START ICE_IEEE_TLV_ID_ETS_CFG +#define ICE_TLV_ID_DSCP_UP 3 +#define ICE_TLV_ID_DSCP_ENF 4 +#define ICE_TLV_ID_DSCP_TC_BW 5 +#define ICE_TLV_ID_DSCP_TO_PFC 6 + +#define ICE_IEEE_ETS_TLV_LEN 25 +#define ICE_IEEE_PFC_TLV_LEN 6 +#define ICE_IEEE_APP_TLV_LEN 11 + +#define ICE_DSCP_UP_TLV_LEN 148 +#define ICE_DSCP_ENF_TLV_LEN 132 +#define ICE_DSCP_TC_BW_TLV_LEN 25 +#define ICE_DSCP_PFC_TLV_LEN 6 + +/* IEEE 802.1AB LLDP Organization specific TLV */ +struct ice_lldp_org_tlv { + uint16_t typelen; + uint32_t ouisubtype; + uint8_t tlvinfo[STRUCT_HACK_VAR_LEN]; +} __packed; + +struct ice_cee_tlv_hdr { + uint16_t typelen; + uint8_t operver; + uint8_t maxver; +}; + +struct ice_cee_ctrl_tlv { + struct ice_cee_tlv_hdr hdr; + uint32_t seqno; + uint32_t ackno; +}; + +struct ice_cee_feat_tlv { + struct ice_cee_tlv_hdr hdr; + uint8_t en_will_err; /* Bits: |En|Will|Err|Reserved(5)| */ +#define ICE_CEE_FEAT_TLV_ENA_M 0x80 +#define ICE_CEE_FEAT_TLV_WILLING_M 0x40 +#define ICE_CEE_FEAT_TLV_ERR_M 0x20 + uint8_t subtype; + uint8_t tlvinfo[STRUCT_HACK_VAR_LEN]; +}; + +struct ice_cee_app_prio { + uint16_t protocol; + uint8_t upper_oui_sel; /* Bits: |Upper OUI(6)|Selector(2)| */ +#define ICE_CEE_APP_SELECTOR_M 0x03 + uint16_t lower_oui; + uint8_t prio_map; +} __packed; + +/* CEE or IEEE 802.1Qaz ETS Configuration data */ +struct ice_dcb_ets_cfg { + uint8_t willing; + uint8_t cbs; + uint8_t maxtcs; + uint8_t prio_table[ICE_MAX_TRAFFIC_CLASS]; + uint8_t tcbwtable[ICE_MAX_TRAFFIC_CLASS]; + uint8_t tsatable[ICE_MAX_TRAFFIC_CLASS]; +}; + +/* CEE or IEEE 802.1Qaz PFC Configuration data */ +struct ice_dcb_pfc_cfg { + uint8_t willing; + uint8_t mbc; + uint8_t pfccap; + uint8_t pfcena; +}; + +/* CEE or IEEE 802.1Qaz Application Priority data */ +struct ice_dcb_app_priority_table { + uint16_t prot_id; + uint8_t priority; + uint8_t selector; +}; + +#define ICE_MAX_USER_PRIORITY 8 +#define ICE_DCBX_MAX_APPS 64 +#define ICE_DSCP_NUM_VAL 64 +#define ICE_LLDPDU_SIZE 1500 +#define ICE_TLV_STATUS_OPER 0x1 +#define ICE_TLV_STATUS_SYNC 0x2 +#define ICE_TLV_STATUS_ERR 0x4 +#define ICE_APP_PROT_ID_FCOE 0x8906 +#define ICE_APP_PROT_ID_ISCSI 0x0cbc +#define ICE_APP_PROT_ID_ISCSI_860 0x035c +#define ICE_APP_PROT_ID_FIP 0x8914 +#define ICE_APP_SEL_ETHTYPE 0x1 +#define ICE_APP_SEL_TCPIP 0x2 +#define ICE_CEE_APP_SEL_ETHTYPE 0x0 +#define ICE_CEE_APP_SEL_TCPIP 0x1 + +struct ice_dcbx_cfg { + uint32_t numapps; + uint32_t tlv_status; /* CEE mode TLV status */ + struct ice_dcb_ets_cfg etscfg; + struct ice_dcb_ets_cfg etsrec; + struct ice_dcb_pfc_cfg pfc; +#define ICE_QOS_MODE_VLAN 0x0 +#define ICE_QOS_MODE_DSCP 0x1 + uint8_t pfc_mode; + struct ice_dcb_app_priority_table app[ICE_DCBX_MAX_APPS]; + /* when DSCP mapping defined by user set its bit to 1 */ + ice_declare_bitmap(dscp_mapped, ICE_DSCP_NUM_VAL); + /* array holding DSCP -> UP/TC values for DSCP L3 QoS mode */ + uint8_t dscp_map[ICE_DSCP_NUM_VAL]; + uint8_t dcbx_mode; +#define ICE_DCBX_MODE_CEE 0x1 +#define ICE_DCBX_MODE_IEEE 0x2 + uint8_t app_mode; +#define ICE_DCBX_APPS_NON_WILLING 0x1 +}; + +struct ice_qos_cfg { + struct ice_dcbx_cfg local_dcbx_cfg; /* Oper/Local Cfg */ + struct ice_dcbx_cfg desired_dcbx_cfg; /* CEE Desired Cfg */ + struct ice_dcbx_cfg remote_dcbx_cfg; /* Peer Cfg */ + uint8_t dcbx_status : 3; /* see ICE_DCBX_STATUS_DIS */ + uint8_t is_sw_lldp : 1; +}; + +/* Information about MAC such as address, etc... */ +struct ice_mac_info { + uint8_t lan_addr[ETHER_ADDR_LEN]; + uint8_t perm_addr[ETHER_ADDR_LEN]; + uint8_t port_addr[ETHER_ADDR_LEN]; + uint8_t wol_addr[ETHER_ADDR_LEN]; +}; + +/* Media Types */ +enum ice_media_type { + ICE_MEDIA_NONE = 0, + ICE_MEDIA_UNKNOWN, + ICE_MEDIA_FIBER, + ICE_MEDIA_BASET, + ICE_MEDIA_BACKPLANE, + ICE_MEDIA_DA, + ICE_MEDIA_AUI, +}; + +#define ICE_MEDIA_BASET_PHY_TYPE_LOW_M (ICE_PHY_TYPE_LOW_100BASE_TX | \ + ICE_PHY_TYPE_LOW_1000BASE_T | \ + ICE_PHY_TYPE_LOW_2500BASE_T | \ + ICE_PHY_TYPE_LOW_5GBASE_T | \ + ICE_PHY_TYPE_LOW_10GBASE_T | \ + ICE_PHY_TYPE_LOW_25GBASE_T) + +#define ICE_MEDIA_C2M_PHY_TYPE_LOW_M (ICE_PHY_TYPE_LOW_10G_SFI_AOC_ACC | \ + ICE_PHY_TYPE_LOW_25G_AUI_AOC_ACC | \ + ICE_PHY_TYPE_LOW_40G_XLAUI_AOC_ACC | \ + ICE_PHY_TYPE_LOW_50G_LAUI2_AOC_ACC | \ + ICE_PHY_TYPE_LOW_50G_AUI2_AOC_ACC | \ + ICE_PHY_TYPE_LOW_50G_AUI1_AOC_ACC | \ + ICE_PHY_TYPE_LOW_100G_CAUI4_AOC_ACC | \ + ICE_PHY_TYPE_LOW_100G_AUI4_AOC_ACC) + +#define ICE_MEDIA_C2M_PHY_TYPE_HIGH_M (ICE_PHY_TYPE_HIGH_100G_CAUI2_AOC_ACC | \ + ICE_PHY_TYPE_HIGH_100G_AUI2_AOC_ACC) + +#define ICE_MEDIA_OPT_PHY_TYPE_LOW_M (ICE_PHY_TYPE_LOW_1000BASE_SX | \ + ICE_PHY_TYPE_LOW_1000BASE_LX | \ + ICE_PHY_TYPE_LOW_10GBASE_SR | \ + ICE_PHY_TYPE_LOW_10GBASE_LR | \ + ICE_PHY_TYPE_LOW_25GBASE_SR | \ + ICE_PHY_TYPE_LOW_25GBASE_LR | \ + ICE_PHY_TYPE_LOW_40GBASE_SR4 | \ + ICE_PHY_TYPE_LOW_40GBASE_LR4 | \ + ICE_PHY_TYPE_LOW_50GBASE_SR2 | \ + ICE_PHY_TYPE_LOW_50GBASE_LR2 | \ + ICE_PHY_TYPE_LOW_50GBASE_SR | \ + ICE_PHY_TYPE_LOW_50GBASE_LR | \ + ICE_PHY_TYPE_LOW_100GBASE_SR4 | \ + ICE_PHY_TYPE_LOW_100GBASE_LR4 | \ + ICE_PHY_TYPE_LOW_100GBASE_SR2 | \ + ICE_PHY_TYPE_LOW_50GBASE_FR | \ + ICE_PHY_TYPE_LOW_100GBASE_DR) + +#define ICE_MEDIA_BP_PHY_TYPE_LOW_M (ICE_PHY_TYPE_LOW_1000BASE_KX | \ + ICE_PHY_TYPE_LOW_2500BASE_KX | \ + ICE_PHY_TYPE_LOW_5GBASE_KR | \ + ICE_PHY_TYPE_LOW_10GBASE_KR_CR1 | \ + ICE_PHY_TYPE_LOW_25GBASE_KR | \ + ICE_PHY_TYPE_LOW_25GBASE_KR_S | \ + ICE_PHY_TYPE_LOW_25GBASE_KR1 | \ + ICE_PHY_TYPE_LOW_40GBASE_KR4 | \ + ICE_PHY_TYPE_LOW_50GBASE_KR2 | \ + ICE_PHY_TYPE_LOW_50GBASE_KR_PAM4 | \ + ICE_PHY_TYPE_LOW_100GBASE_KR4 | \ + ICE_PHY_TYPE_LOW_100GBASE_KR_PAM4) + +#define ICE_MEDIA_BP_PHY_TYPE_HIGH_M ICE_PHY_TYPE_HIGH_100GBASE_KR2_PAM4 + +#define ICE_MEDIA_DAC_PHY_TYPE_LOW_M (ICE_PHY_TYPE_LOW_10G_SFI_DA | \ + ICE_PHY_TYPE_LOW_25GBASE_CR | \ + ICE_PHY_TYPE_LOW_25GBASE_CR_S | \ + ICE_PHY_TYPE_LOW_25GBASE_CR1 | \ + ICE_PHY_TYPE_LOW_40GBASE_CR4 | \ + ICE_PHY_TYPE_LOW_50GBASE_CR2 | \ + ICE_PHY_TYPE_LOW_100GBASE_CR4 | \ + ICE_PHY_TYPE_LOW_100GBASE_CR_PAM4 | \ + ICE_PHY_TYPE_LOW_50GBASE_CP | \ + ICE_PHY_TYPE_LOW_100GBASE_CP2) + +#define ICE_MEDIA_C2C_PHY_TYPE_LOW_M (ICE_PHY_TYPE_LOW_100M_SGMII | \ + ICE_PHY_TYPE_LOW_1G_SGMII | \ + ICE_PHY_TYPE_LOW_2500BASE_X | \ + ICE_PHY_TYPE_LOW_10G_SFI_C2C | \ + ICE_PHY_TYPE_LOW_25G_AUI_C2C | \ + ICE_PHY_TYPE_LOW_40G_XLAUI | \ + ICE_PHY_TYPE_LOW_50G_LAUI2 | \ + ICE_PHY_TYPE_LOW_50G_AUI2 | \ + ICE_PHY_TYPE_LOW_50G_AUI1 | \ + ICE_PHY_TYPE_LOW_100G_CAUI4 | \ + ICE_PHY_TYPE_LOW_100G_AUI4) + +#define ICE_MEDIA_C2C_PHY_TYPE_HIGH_M (ICE_PHY_TYPE_HIGH_100G_CAUI2 | \ + ICE_PHY_TYPE_HIGH_100G_AUI2) + +#define ICE_IPV6_ADDR_LENGTH 16 + +/* Each recipe can match up to 5 different fields. Fields to match can be meta- + * data, values extracted from packet headers, or results from other recipes. + * One of the 5 fields is reserved for matching the switch ID. So, up to 4 + * recipes can provide intermediate results to another one through chaining, + * e.g. recipes 0, 1, 2, and 3 can provide intermediate results to recipe 4. + */ +#define ICE_NUM_WORDS_RECIPE 4 + +/* Max recipes that can be chained */ +#define ICE_MAX_CHAIN_RECIPE 5 + +/* 1 word reserved for switch ID from allowed 5 words. + * So a recipe can have max 4 words. And you can chain 5 such recipes + * together. So maximum words that can be programmed for look up is 5 * 4. + */ +#define ICE_MAX_CHAIN_WORDS (ICE_NUM_WORDS_RECIPE * ICE_MAX_CHAIN_RECIPE) + +/* Field vector index corresponding to chaining */ +#define ICE_CHAIN_FV_INDEX_START 47 + +enum ice_protocol_type { + ICE_MAC_OFOS = 0, + ICE_MAC_IL, + ICE_ETYPE_OL, + ICE_ETYPE_IL, + ICE_VLAN_OFOS, + ICE_IPV4_OFOS, + ICE_IPV4_IL, + ICE_IPV6_OFOS, + ICE_IPV6_IL, + ICE_TCP_IL, + ICE_UDP_OF, + ICE_UDP_ILOS, + ICE_SCTP_IL, + ICE_VXLAN, + ICE_GENEVE, + ICE_VXLAN_GPE, + ICE_NVGRE, + ICE_GTP, + ICE_GTP_NO_PAY, + ICE_PPPOE, + ICE_L2TPV3, + ICE_PROTOCOL_LAST +}; + +enum ice_sw_tunnel_type { + ICE_NON_TUN = 0, + ICE_SW_TUN_AND_NON_TUN, + ICE_SW_TUN_VXLAN_GPE, + ICE_SW_TUN_GENEVE, /* GENEVE matches only non-VLAN pkts */ + ICE_SW_TUN_GENEVE_VLAN, /* GENEVE matches both VLAN and non-VLAN pkts */ + ICE_SW_TUN_VXLAN, /* VXLAN matches only non-VLAN pkts */ + ICE_SW_TUN_VXLAN_VLAN, /* VXLAN matches both VLAN and non-VLAN pkts */ + ICE_SW_TUN_NVGRE, + ICE_SW_TUN_UDP, /* This means all "UDP" tunnel types: VXLAN-GPE, VXLAN + * and GENEVE + */ + ICE_SW_TUN_GTPU, + ICE_SW_TUN_GTPC, + ICE_ALL_TUNNELS /* All tunnel types including NVGRE */ +}; + +/* Decoders for ice_prot_id: + * - F: First + * - I: Inner + * - L: Last + * - O: Outer + * - S: Single + */ +enum ice_prot_id { + ICE_PROT_ID_INVAL = 0, + ICE_PROT_MAC_OF_OR_S = 1, + ICE_PROT_MAC_O2 = 2, + ICE_PROT_MAC_IL = 4, + ICE_PROT_MAC_IN_MAC = 7, + ICE_PROT_ETYPE_OL = 9, + ICE_PROT_ETYPE_IL = 10, + ICE_PROT_PAY = 15, + ICE_PROT_EVLAN_O = 16, + ICE_PROT_VLAN_O = 17, + ICE_PROT_VLAN_IF = 18, + ICE_PROT_MPLS_OL_MINUS_1 = 27, + ICE_PROT_MPLS_OL_OR_OS = 28, + ICE_PROT_MPLS_IL = 29, + ICE_PROT_IPV4_OF_OR_S = 32, + ICE_PROT_IPV4_IL = 33, + ICE_PROT_IPV4_IL_IL = 34, + ICE_PROT_IPV6_OF_OR_S = 40, + ICE_PROT_IPV6_IL = 41, + ICE_PROT_IPV6_IL_IL = 42, + ICE_PROT_IPV6_NEXT_PROTO = 43, + ICE_PROT_IPV6_FRAG = 47, + ICE_PROT_TCP_IL = 49, + ICE_PROT_UDP_OF = 52, + ICE_PROT_UDP_IL_OR_S = 53, + ICE_PROT_GRE_OF = 64, + ICE_PROT_NSH_F = 84, + ICE_PROT_ESP_F = 88, + ICE_PROT_ESP_2 = 89, + ICE_PROT_SCTP_IL = 96, + ICE_PROT_ICMP_IL = 98, + ICE_PROT_ICMPV6_IL = 100, + ICE_PROT_VRRP_F = 101, + ICE_PROT_OSPF = 102, + ICE_PROT_ATAOE_OF = 114, + ICE_PROT_CTRL_OF = 116, + ICE_PROT_LLDP_OF = 117, + ICE_PROT_ARP_OF = 118, + ICE_PROT_EAPOL_OF = 120, + ICE_PROT_META_ID = 255, /* when offset == metaddata */ + ICE_PROT_INVALID = 255 /* when offset == ICE_FV_OFFSET_INVAL */ +}; + +#define ICE_VNI_OFFSET 12 /* offset of VNI from ICE_PROT_UDP_OF */ + +#define ICE_NAN_OFFSET 511 +#define ICE_MAC_OFOS_HW 1 +#define ICE_MAC_IL_HW 4 +#define ICE_ETYPE_OL_HW 9 +#define ICE_ETYPE_IL_HW 10 +#define ICE_VLAN_OF_HW 16 +#define ICE_VLAN_OL_HW 17 +#define ICE_IPV4_OFOS_HW 32 +#define ICE_IPV4_IL_HW 33 +#define ICE_IPV6_OFOS_HW 40 +#define ICE_IPV6_IL_HW 41 +#define ICE_TCP_IL_HW 49 +#define ICE_UDP_ILOS_HW 53 +#define ICE_SCTP_IL_HW 96 +#define ICE_PPPOE_HW 103 +#define ICE_L2TPV3_HW 104 + +/* ICE_UDP_OF is used to identify all 3 tunnel types + * VXLAN, GENEVE and VXLAN_GPE. To differentiate further + * need to use flags from the field vector + */ +#define ICE_UDP_OF_HW 52 /* UDP Tunnels */ +#define ICE_GRE_OF_HW 64 /* NVGRE */ +#define ICE_META_DATA_ID_HW 255 /* this is used for tunnel and VLAN type */ + +#define ICE_MDID_SIZE 2 +#define ICE_TUN_FLAG_MDID 20 +#define ICE_TUN_FLAG_MDID_OFF(word) \ + (ICE_MDID_SIZE * (ICE_TUN_FLAG_MDID + (word))) +#define ICE_TUN_FLAG_MASK 0xFF +#define ICE_FROM_NETWORK_FLAG_MASK 0x8 +#define ICE_DIR_FLAG_MASK 0x10 +#define ICE_TUN_FLAG_IN_VLAN_MASK 0x80 /* VLAN inside tunneled header */ +#define ICE_TUN_FLAG_VLAN_MASK 0x01 +#define ICE_TUN_FLAG_FV_IND 2 + +#define ICE_VLAN_FLAG_MDID 20 +#define ICE_VLAN_FLAG_MDID_OFF (ICE_MDID_SIZE * ICE_VLAN_FLAG_MDID) +#define ICE_PKT_FLAGS_0_TO_15_VLAN_FLAGS_MASK 0xD000 + +#define ICE_PROTOCOL_MAX_ENTRIES 16 + +/* Mapping of software defined protocol ID to hardware defined protocol ID */ +struct ice_protocol_entry { + enum ice_protocol_type type; + uint8_t protocol_id; +}; + +struct ice_ether_hdr { + uint8_t dst_addr[ETHER_ADDR_LEN]; + uint8_t src_addr[ETHER_ADDR_LEN]; +}; + +struct ice_ethtype_hdr { + uint16_t ethtype_id; +}; + +struct ice_ether_vlan_hdr { + uint8_t dst_addr[ETHER_ADDR_LEN]; + uint8_t src_addr[ETHER_ADDR_LEN]; + uint32_t vlan_id; +}; + +struct ice_vlan_hdr { + uint16_t type; + uint16_t vlan; +}; + +struct ice_ipv4_hdr { + uint8_t version; + uint8_t tos; + uint16_t total_length; + uint16_t id; + uint16_t frag_off; + uint8_t time_to_live; + uint8_t protocol; + uint16_t check; + uint32_t src_addr; + uint32_t dst_addr; +}; + +struct ice_le_ver_tc_flow { + union { + struct { + uint32_t flow_label : 20; + uint32_t tc : 8; + uint32_t version : 4; + } fld; + uint32_t val; + } u; +}; + +struct ice_ipv6_hdr { + uint32_t be_ver_tc_flow; + uint16_t payload_len; + uint8_t next_hdr; + uint8_t hop_limit; + uint8_t src_addr[ICE_IPV6_ADDR_LENGTH]; + uint8_t dst_addr[ICE_IPV6_ADDR_LENGTH]; +}; + +struct ice_sctp_hdr { + uint16_t src_port; + uint16_t dst_port; + uint32_t verification_tag; + uint32_t check; +}; + +struct ice_l4_hdr { + uint16_t src_port; + uint16_t dst_port; + uint16_t len; + uint16_t check; +}; + +struct ice_udp_tnl_hdr { + uint16_t field; + uint16_t proto_type; + uint32_t vni; /* only use lower 24-bits */ +}; + +struct ice_udp_gtp_hdr { + uint8_t flags; + uint8_t msg_type; + uint16_t rsrvd_len; + uint32_t teid; + uint16_t rsrvd_seq_nbr; + uint8_t rsrvd_n_pdu_nbr; + uint8_t rsrvd_next_ext; + uint8_t rsvrd_ext_len; + uint8_t pdu_type; + uint8_t qfi; + uint8_t rsvrd; +}; +struct ice_pppoe_hdr { + uint8_t rsrvd_ver_type; + uint8_t rsrvd_code; + uint16_t session_id; + uint16_t length; + uint16_t ppp_prot_id; /* control and data only */ +}; + +struct ice_l2tpv3_sess_hdr { + uint32_t session_id; + uint64_t cookie; +}; + +struct ice_nvgre { + uint16_t flags; + uint16_t protocol; + uint32_t tni_flow; +}; + +union ice_prot_hdr { + struct ice_ether_hdr eth_hdr; + struct ice_ethtype_hdr ethertype; + struct ice_vlan_hdr vlan_hdr; + struct ice_ipv4_hdr ipv4_hdr; + struct ice_ipv6_hdr ipv6_hdr; + struct ice_l4_hdr l4_hdr; + struct ice_sctp_hdr sctp_hdr; + struct ice_udp_tnl_hdr tnl_hdr; + struct ice_nvgre nvgre_hdr; + struct ice_udp_gtp_hdr gtp_hdr; + struct ice_pppoe_hdr pppoe_hdr; + struct ice_l2tpv3_sess_hdr l2tpv3_sess_hdr; +}; + +/* This is mapping table entry that maps every word within a given protocol + * structure to the real byte offset as per the specification of that + * protocol header. + * for e.g. dst address is 3 words in ethertype header and corresponding bytes + * are 0, 2, 3 in the actual packet header and src address is at 4, 6, 8 + */ +struct ice_prot_ext_tbl_entry { + enum ice_protocol_type prot_type; + /* Byte offset into header of given protocol type */ + uint8_t offs[sizeof(union ice_prot_hdr)]; +}; + +/* Extraction Sequence (Field Vector) Table */ +struct ice_fv_word { + uint8_t prot_id; + uint16_t off; /* Offset within the protocol header */ + uint8_t nresvrd; +} __packed; + +#define ICE_MAX_FV_WORDS 48 + +struct ice_fv { + struct ice_fv_word ew[ICE_MAX_FV_WORDS]; +}; + +/* Extractions to be looked up for a given recipe */ +struct ice_prot_lkup_ext { + uint16_t prot_type; + uint8_t n_val_words; + /* create a buffer to hold max words per recipe */ + uint16_t field_off[ICE_MAX_CHAIN_WORDS]; + uint16_t field_mask[ICE_MAX_CHAIN_WORDS]; + + struct ice_fv_word fv_words[ICE_MAX_CHAIN_WORDS]; + + /* Indicate field offsets that have field vector indices assigned */ + ice_declare_bitmap(done, ICE_MAX_CHAIN_WORDS); +}; + +struct ice_pref_recipe_group { + uint8_t n_val_pairs; /* Number of valid pairs */ + struct ice_fv_word pairs[ICE_NUM_WORDS_RECIPE]; + uint16_t mask[ICE_NUM_WORDS_RECIPE]; +}; + +struct ice_recp_grp_entry { + TAILQ_ENTRY(ice_recp_grp_entry) l_entry; +#define ICE_INVAL_CHAIN_IND 0xFF + uint16_t rid; + uint8_t chain_idx; + uint16_t fv_idx[ICE_NUM_WORDS_RECIPE]; + uint16_t fv_mask[ICE_NUM_WORDS_RECIPE]; + struct ice_pref_recipe_group r_group; +}; + +/* Software VSI types. */ +enum ice_vsi_type { + ICE_VSI_PF = 0, + ICE_VSI_VF = 1, + ICE_VSI_VMDQ2 = 2, + ICE_VSI_LB = 6, +}; + + +struct ice_link_status { + /* Refer to ice_aq_phy_type for bits definition */ + uint64_t phy_type_low; + uint64_t phy_type_high; + uint8_t topo_media_conflict; + uint16_t max_frame_size; + uint16_t link_speed; + uint16_t req_speeds; + uint8_t link_cfg_err; + uint8_t lse_ena; /* Link Status Event notification */ + uint8_t link_info; + uint8_t an_info; + uint8_t ext_info; + uint8_t fec_info; + uint8_t pacing; + /* Refer to #define from module_type[ICE_MODULE_TYPE_TOTAL_BYTE] of + * ice_aqc_get_phy_caps structure + */ + uint8_t module_type[ICE_MODULE_TYPE_TOTAL_BYTE]; +}; + + +/* PHY info such as phy_type, etc... */ +struct ice_phy_info { + struct ice_link_status link_info; + struct ice_link_status link_info_old; + uint64_t phy_type_low; + uint64_t phy_type_high; + enum ice_media_type media_type; + uint8_t get_link_info; + /* Please refer to struct ice_aqc_get_link_status_data to get + * detail of enable bit in curr_user_speed_req + */ + uint16_t curr_user_speed_req; + enum ice_fec_mode curr_user_fec_req; + enum ice_fc_mode curr_user_fc_req; + struct ice_aqc_set_phy_cfg_data curr_user_phy_cfg; +}; + +struct ice_port_info { + struct ice_sched_node *root; /* Root Node per Port */ + struct ice_hw *hw; /* back pointer to HW instance */ + uint32_t last_node_teid; /* scheduler last node info */ + uint16_t sw_id; /* Initial switch ID belongs to port */ + uint16_t pf_vf_num; + uint8_t port_state; +#define ICE_SCHED_PORT_STATE_INIT 0x0 +#define ICE_SCHED_PORT_STATE_READY 0x1 + uint8_t lport; +#define ICE_LPORT_MASK 0xff + struct ice_fc_info fc; + struct ice_mac_info mac; + struct ice_phy_info phy; + struct ice_lock sched_lock; /* protect access to TXSched tree */ + struct ice_sched_node * + sib_head[ICE_MAX_TRAFFIC_CLASS][ICE_AQC_TOPO_MAX_LEVEL_NUM]; + struct ice_bw_type_info root_node_bw_t_info; + struct ice_bw_type_info tc_node_bw_t_info[ICE_MAX_TRAFFIC_CLASS]; + struct ice_qos_cfg qos_cfg; + uint8_t is_vf:1; + uint8_t is_custom_tx_enabled:1; +}; + +TAILQ_HEAD(ice_vsi_list_map_head, ice_vsi_list_map_info); + +#define ICE_MAX_NUM_PROFILES 256 + +#define ICE_SW_CFG_MAX_BUF_LEN 2048 +#define ICE_MAX_SW 256 +#define ICE_DFLT_VSI_INVAL 0xff + +#define ICE_VSI_INVAL_ID 0xFFFF +#define ICE_INVAL_Q_HANDLE 0xFFFF + +#define ICE_FLTR_RX BIT(0) +#define ICE_FLTR_TX BIT(1) +#define ICE_FLTR_RX_LB BIT(2) +#define ICE_FLTR_TX_RX (ICE_FLTR_RX | ICE_FLTR_TX) + +#define ICE_DUMMY_ETH_HDR_LEN 16 + +/* VSI context structure for add/get/update/free operations */ +struct ice_vsi_ctx { + uint16_t vsi_num; + uint16_t vsis_allocd; + uint16_t vsis_unallocated; + uint16_t flags; + struct ice_aqc_vsi_props info; + struct ice_sched_vsi_info sched; + uint8_t alloc_from_pool; + uint8_t vf_num; + uint16_t num_lan_q_entries[ICE_MAX_TRAFFIC_CLASS]; + struct ice_q_ctx *lan_q_ctx[ICE_MAX_TRAFFIC_CLASS]; + uint16_t num_rdma_q_entries[ICE_MAX_TRAFFIC_CLASS]; + struct ice_q_ctx *rdma_q_ctx[ICE_MAX_TRAFFIC_CLASS]; +}; + + +struct ice_switch_info { + struct ice_vsi_list_map_head vsi_list_map_head; + struct ice_sw_recipe *recp_list; + uint16_t prof_res_bm_init; + uint16_t max_used_prof_index; + + ice_declare_bitmap(prof_res_bm[ICE_MAX_NUM_PROFILES], ICE_MAX_FV_WORDS); +}; + +TAILQ_HEAD(ice_rl_prof_list_head, ice_aqc_rl_profile_info); +TAILQ_HEAD(ice_agg_list_head, ice_sched_agg_info); + +/* BW rate limit profile parameters list entry along + * with bandwidth maintained per layer in port info + */ +struct ice_aqc_rl_profile_info { + struct ice_aqc_rl_profile_elem profile; + TAILQ_ENTRY(ice_aqc_rl_profile_info) list_entry; + uint32_t bw; /* requested */ + uint16_t prof_id_ref; /* profile ID to node association ref count */ +}; + +/* Bookkeeping structure to hold bitmap of VSIs corresponding to VSI list ID */ +struct ice_vsi_list_map_info { + TAILQ_ENTRY(ice_vsi_list_map_info) list_entry; + ice_declare_bitmap(vsi_map, ICE_MAX_VSI); + uint16_t vsi_list_id; + /* counter to track how many rules are reusing this VSI list */ + uint16_t ref_cnt; +}; + +struct ice_adv_lkup_elem { + enum ice_protocol_type type; + union ice_prot_hdr h_u; /* Header values */ + union ice_prot_hdr m_u; /* Mask of header values to match */ +}; + +/* + * This structure allows to pass info about lb_en and lan_en + * flags to ice_add_adv_rule. Values in act would be used + * only if act_valid was set to true, otherwise dflt + * values would be used. + */ +struct ice_adv_rule_flags_info { + uint32_t act; + uint8_t act_valid; /* indicate if flags in act are valid */ +}; + +enum ice_sw_fwd_act_type { + ICE_FWD_TO_VSI = 0, + ICE_FWD_TO_VSI_LIST, /* Do not use this when adding filter */ + ICE_FWD_TO_Q, + ICE_FWD_TO_QGRP, + ICE_DROP_PACKET, + ICE_LG_ACTION, + ICE_INVAL_ACT +}; + +struct ice_sw_act_ctrl { + /* Source VSI for LOOKUP_TX or source port for LOOKUP_RX */ + uint16_t src; + uint16_t flag; + enum ice_sw_fwd_act_type fltr_act; + /* Depending on filter action */ + union { + /* This is a queue ID in case of ICE_FWD_TO_Q and starting + * queue ID in case of ICE_FWD_TO_QGRP. + */ + uint16_t q_id:11; + uint16_t vsi_id:10; + uint16_t hw_vsi_id:10; + uint16_t vsi_list_id:10; + } fwd_id; + /* software VSI handle */ + uint16_t vsi_handle; + uint8_t qgrp_size; +}; + +struct ice_adv_rule_info { + enum ice_sw_tunnel_type tun_type; + struct ice_sw_act_ctrl sw_act; + uint32_t priority; + uint8_t rx; /* true means LOOKUP_RX otherwise LOOKUP_TX */ + uint8_t add_dir_lkup; + uint16_t fltr_rule_id; + uint16_t lg_id; + uint16_t vlan_type; + struct ice_adv_rule_flags_info flags_info; +}; + +struct ice_adv_fltr_mgmt_list_entry { + TAILQ_ENTRY(ice_adv_fltr_mgmt_list_entry) list_entry; + + struct ice_adv_lkup_elem *lkups; + struct ice_adv_rule_info rule_info; + uint16_t lkups_cnt; + struct ice_vsi_list_map_info *vsi_list_info; + uint16_t vsi_count; +}; + +enum ice_promisc_flags { + ICE_PROMISC_UCAST_RX = 0, + ICE_PROMISC_UCAST_TX, + ICE_PROMISC_MCAST_RX, + ICE_PROMISC_MCAST_TX, + ICE_PROMISC_BCAST_RX, + ICE_PROMISC_BCAST_TX, + ICE_PROMISC_VLAN_RX, + ICE_PROMISC_VLAN_TX, + ICE_PROMISC_UCAST_RX_LB, + /* Max value */ + ICE_PROMISC_MAX, +}; + +/* type of filter src ID */ +enum ice_src_id { + ICE_SRC_ID_UNKNOWN = 0, + ICE_SRC_ID_VSI, + ICE_SRC_ID_QUEUE, + ICE_SRC_ID_LPORT, +}; + +struct ice_fltr_info { + /* Look up information: how to look up packet */ + enum ice_sw_lkup_type lkup_type; + /* Forward action: filter action to do after lookup */ + enum ice_sw_fwd_act_type fltr_act; + /* rule ID returned by firmware once filter rule is created */ + uint16_t fltr_rule_id; + uint16_t flag; + + /* Source VSI for LOOKUP_TX or source port for LOOKUP_RX */ + uint16_t src; + enum ice_src_id src_id; + + union { + struct { + uint8_t mac_addr[ETHER_ADDR_LEN]; + } mac; + struct { + uint8_t mac_addr[ETHER_ADDR_LEN]; + uint16_t vlan_id; + } mac_vlan; + struct { + uint16_t vlan_id; + uint16_t tpid; + uint8_t tpid_valid; + } vlan; + /* Set lkup_type as ICE_SW_LKUP_ETHERTYPE + * if just using ethertype as filter. Set lkup_type as + * ICE_SW_LKUP_ETHERTYPE_MAC if MAC also needs to be + * passed in as filter. + */ + struct { + uint16_t ethertype; + uint8_t mac_addr[ETHER_ADDR_LEN]; /* optional */ + } ethertype_mac; + } l_data; /* Make sure to zero out the memory of l_data before using + * it or only set the data associated with lookup match + * rest everything should be zero + */ + + /* Depending on filter action */ + union { + /* queue ID in case of ICE_FWD_TO_Q and starting + * queue ID in case of ICE_FWD_TO_QGRP. + */ + uint16_t q_id:11; + uint16_t hw_vsi_id:10; + uint16_t vsi_list_id:10; + } fwd_id; + + /* Sw VSI handle */ + uint16_t vsi_handle; + + /* Set to num_queues if action is ICE_FWD_TO_QGRP. This field + * determines the range of queues the packet needs to be forwarded to. + * Note that qgrp_size must be set to a power of 2. + */ + uint8_t qgrp_size; + + /* Rule creations populate these indicators basing on the switch type */ + uint8_t lb_en; /* Indicate if packet can be looped back */ + uint8_t lan_en; /* Indicate if packet can be forwarded to the uplink */ +}; + +/** + * enum ice_fltr_marker - Marker for syncing OS and driver filter lists + * @ICE_FLTR_NOT_FOUND: initial state, indicates filter has not been found + * @ICE_FLTR_FOUND: set when a filter has been found in both lists + * + * This enumeration is used to help sync an operating system provided filter + * list with the filters previously added. + * + * This is required for FreeBSD because the operating system does not provide + * individual indications of whether a filter has been added or deleted, but + * instead just notifies the driver with the entire new list. + * + * To use this marker state, the driver shall initially reset all filters to + * the ICE_FLTR_NOT_FOUND state. Then, for each filter in the OS list, it + * shall search the driver list for the filter. If found, the filter state + * will be set to ICE_FLTR_FOUND. If not found, that filter will be added. + * Finally, the driver shall search the internal filter list for all filters + * still marked as ICE_FLTR_NOT_FOUND and remove them. + */ +enum ice_fltr_marker { + ICE_FLTR_NOT_FOUND, + ICE_FLTR_FOUND, +}; + +struct ice_fltr_list_entry { + TAILQ_ENTRY(ice_fltr_list_entry) list_entry; + enum ice_status status; + struct ice_fltr_info fltr_info; +}; + +/* This defines an entry in the list that maintains MAC or VLAN membership + * to HW list mapping, since multiple VSIs can subscribe to the same MAC or + * VLAN. As an optimization the VSI list should be created only when a + * second VSI becomes a subscriber to the same MAC address. VSI lists are always + * used for VLAN membership. + */ +struct ice_fltr_mgmt_list_entry { + /* back pointer to VSI list ID to VSI list mapping */ + struct ice_vsi_list_map_info *vsi_list_info; + uint16_t vsi_count; +#define ICE_INVAL_LG_ACT_INDEX 0xffff + uint16_t lg_act_idx; +#define ICE_INVAL_SW_MARKER_ID 0xffff + uint16_t sw_marker_id; + TAILQ_ENTRY(ice_fltr_mgmt_list_entry) list_entry; + struct ice_fltr_info fltr_info; +#define ICE_INVAL_COUNTER_ID 0xff + uint8_t counter_index; + enum ice_fltr_marker marker; +}; + + +#define ICE_IPV4_MAKE_PREFIX_MASK(prefix) ((uint32_t)((~0ULL) << (32 - (prefix)))) +#define ICE_FLOW_PROF_ID_INVAL 0xfffffffffffffffful +#define ICE_FLOW_PROF_ID_BYPASS 0 +#define ICE_FLOW_PROF_ID_DEFAULT 1 +#define ICE_FLOW_ENTRY_HANDLE_INVAL 0 +#define ICE_FLOW_VSI_INVAL 0xffff +#define ICE_FLOW_FLD_OFF_INVAL 0xffff + +/* Generate flow hash field from flow field type(s) */ +#define ICE_FLOW_HASH_IPV4 \ + (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) | \ + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)) +#define ICE_FLOW_HASH_IPV6 \ + (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) | \ + BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)) +#define ICE_FLOW_HASH_TCP_PORT \ + (BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT) | \ + BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)) +#define ICE_FLOW_HASH_UDP_PORT \ + (BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT) | \ + BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)) +#define ICE_FLOW_HASH_SCTP_PORT \ + (BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT) | \ + BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)) + +#define ICE_HASH_INVALID 0 +#define ICE_HASH_TCP_IPV4 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_TCP_PORT) +#define ICE_HASH_TCP_IPV6 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_TCP_PORT) +#define ICE_HASH_UDP_IPV4 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_UDP_PORT) +#define ICE_HASH_UDP_IPV6 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_UDP_PORT) +#define ICE_HASH_SCTP_IPV4 (ICE_FLOW_HASH_IPV4 | ICE_FLOW_HASH_SCTP_PORT) +#define ICE_HASH_SCTP_IPV6 (ICE_FLOW_HASH_IPV6 | ICE_FLOW_HASH_SCTP_PORT) + +/* Protocol header fields within a packet segment. A segment consists of one or + * more protocol headers that make up a logical group of protocol headers. Each + * logical group of protocol headers encapsulates or is encapsulated using/by + * tunneling or encapsulation protocols for network virtualization such as GRE, + * VxLAN, etc. + */ +enum ice_flow_seg_hdr { + ICE_FLOW_SEG_HDR_NONE = 0x00000000, + ICE_FLOW_SEG_HDR_ETH = 0x00000001, + ICE_FLOW_SEG_HDR_VLAN = 0x00000002, + ICE_FLOW_SEG_HDR_IPV4 = 0x00000004, + ICE_FLOW_SEG_HDR_IPV6 = 0x00000008, + ICE_FLOW_SEG_HDR_ARP = 0x00000010, + ICE_FLOW_SEG_HDR_ICMP = 0x00000020, + ICE_FLOW_SEG_HDR_TCP = 0x00000040, + ICE_FLOW_SEG_HDR_UDP = 0x00000080, + ICE_FLOW_SEG_HDR_SCTP = 0x00000100, + ICE_FLOW_SEG_HDR_GRE = 0x00000200, + /* The following is an additive bit for ICE_FLOW_SEG_HDR_IPV4 and + * ICE_FLOW_SEG_HDR_IPV6. + */ + ICE_FLOW_SEG_HDR_IPV_FRAG = 0x40000000, + ICE_FLOW_SEG_HDR_IPV_OTHER = 0x80000000, +}; + +enum ice_flow_field { + /* L2 */ + ICE_FLOW_FIELD_IDX_ETH_DA, + ICE_FLOW_FIELD_IDX_ETH_SA, + ICE_FLOW_FIELD_IDX_S_VLAN, + ICE_FLOW_FIELD_IDX_C_VLAN, + ICE_FLOW_FIELD_IDX_ETH_TYPE, + /* L3 */ + ICE_FLOW_FIELD_IDX_IPV4_DSCP, + ICE_FLOW_FIELD_IDX_IPV6_DSCP, + ICE_FLOW_FIELD_IDX_IPV4_TTL, + ICE_FLOW_FIELD_IDX_IPV4_PROT, + ICE_FLOW_FIELD_IDX_IPV6_TTL, + ICE_FLOW_FIELD_IDX_IPV6_PROT, + ICE_FLOW_FIELD_IDX_IPV4_SA, + ICE_FLOW_FIELD_IDX_IPV4_DA, + ICE_FLOW_FIELD_IDX_IPV6_SA, + ICE_FLOW_FIELD_IDX_IPV6_DA, + /* L4 */ + ICE_FLOW_FIELD_IDX_TCP_SRC_PORT, + ICE_FLOW_FIELD_IDX_TCP_DST_PORT, + ICE_FLOW_FIELD_IDX_UDP_SRC_PORT, + ICE_FLOW_FIELD_IDX_UDP_DST_PORT, + ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT, + ICE_FLOW_FIELD_IDX_SCTP_DST_PORT, + ICE_FLOW_FIELD_IDX_TCP_FLAGS, + /* ARP */ + ICE_FLOW_FIELD_IDX_ARP_SIP, + ICE_FLOW_FIELD_IDX_ARP_DIP, + ICE_FLOW_FIELD_IDX_ARP_SHA, + ICE_FLOW_FIELD_IDX_ARP_DHA, + ICE_FLOW_FIELD_IDX_ARP_OP, + /* ICMP */ + ICE_FLOW_FIELD_IDX_ICMP_TYPE, + ICE_FLOW_FIELD_IDX_ICMP_CODE, + /* GRE */ + ICE_FLOW_FIELD_IDX_GRE_KEYID, + /* The total number of enums must not exceed 64 */ + ICE_FLOW_FIELD_IDX_MAX +}; + +/* Flow headers and fields for AVF support */ +enum ice_flow_avf_hdr_field { + /* Values 0 - 28 are reserved for future use */ + ICE_AVF_FLOW_FIELD_INVALID = 0, + ICE_AVF_FLOW_FIELD_UNICAST_IPV4_UDP = 29, + ICE_AVF_FLOW_FIELD_MULTICAST_IPV4_UDP, + ICE_AVF_FLOW_FIELD_IPV4_UDP, + ICE_AVF_FLOW_FIELD_IPV4_TCP_SYN_NO_ACK, + ICE_AVF_FLOW_FIELD_IPV4_TCP, + ICE_AVF_FLOW_FIELD_IPV4_SCTP, + ICE_AVF_FLOW_FIELD_IPV4_OTHER, + ICE_AVF_FLOW_FIELD_FRAG_IPV4, + /* Values 37-38 are reserved */ + ICE_AVF_FLOW_FIELD_UNICAST_IPV6_UDP = 39, + ICE_AVF_FLOW_FIELD_MULTICAST_IPV6_UDP, + ICE_AVF_FLOW_FIELD_IPV6_UDP, + ICE_AVF_FLOW_FIELD_IPV6_TCP_SYN_NO_ACK, + ICE_AVF_FLOW_FIELD_IPV6_TCP, + ICE_AVF_FLOW_FIELD_IPV6_SCTP, + ICE_AVF_FLOW_FIELD_IPV6_OTHER, + ICE_AVF_FLOW_FIELD_FRAG_IPV6, + ICE_AVF_FLOW_FIELD_RSVD47, + ICE_AVF_FLOW_FIELD_FCOE_OX, + ICE_AVF_FLOW_FIELD_FCOE_RX, + ICE_AVF_FLOW_FIELD_FCOE_OTHER, + /* Values 51-62 are reserved */ + ICE_AVF_FLOW_FIELD_L2_PAYLOAD = 63, + ICE_AVF_FLOW_FIELD_MAX +}; + +/* Supported RSS offloads This macro is defined to support + * VIRTCHNL_OP_GET_RSS_HENA_CAPS ops. PF driver sends the RSS hardware + * capabilities to the caller of this ops. + */ +#define ICE_DEFAULT_RSS_HENA ( \ + BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_UDP) | \ + BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_SCTP) | \ + BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_TCP) | \ + BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_OTHER) | \ + BIT_ULL(ICE_AVF_FLOW_FIELD_FRAG_IPV4) | \ + BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_UDP) | \ + BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_TCP) | \ + BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_SCTP) | \ + BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_OTHER) | \ + BIT_ULL(ICE_AVF_FLOW_FIELD_FRAG_IPV6) | \ + BIT_ULL(ICE_AVF_FLOW_FIELD_IPV4_TCP_SYN_NO_ACK) | \ + BIT_ULL(ICE_AVF_FLOW_FIELD_UNICAST_IPV4_UDP) | \ + BIT_ULL(ICE_AVF_FLOW_FIELD_MULTICAST_IPV4_UDP) | \ + BIT_ULL(ICE_AVF_FLOW_FIELD_IPV6_TCP_SYN_NO_ACK) | \ + BIT_ULL(ICE_AVF_FLOW_FIELD_UNICAST_IPV6_UDP) | \ + BIT_ULL(ICE_AVF_FLOW_FIELD_MULTICAST_IPV6_UDP)) + +enum ice_rss_cfg_hdr_type { + ICE_RSS_OUTER_HEADERS, /* take outer headers as inputset. */ + ICE_RSS_INNER_HEADERS, /* take inner headers as inputset. */ + /* take inner headers as inputset for packet with outer IPv4. */ + ICE_RSS_INNER_HEADERS_W_OUTER_IPV4, + /* take inner headers as inputset for packet with outer IPv6. */ + ICE_RSS_INNER_HEADERS_W_OUTER_IPV6, + /* take outer headers first then inner headers as inputset */ + /* take inner as inputset for GTPoGRE with outer IPv4 + GRE. */ + ICE_RSS_INNER_HEADERS_W_OUTER_IPV4_GRE, + /* take inner as inputset for GTPoGRE with outer IPv6 + GRE. */ + ICE_RSS_INNER_HEADERS_W_OUTER_IPV6_GRE, + ICE_RSS_ANY_HEADERS +}; + +struct ice_rss_hash_cfg { + uint32_t addl_hdrs; /* protocol header fields */ + uint64_t hash_flds; /* hash bit field (ICE_FLOW_HASH_*) to configure */ + enum ice_rss_cfg_hdr_type hdr_type; /* to specify inner or outer */ + bool symm; /* symmetric or asymmetric hash */ +}; + +enum ice_flow_dir { + ICE_FLOW_DIR_UNDEFINED = 0, + ICE_FLOW_TX = 0x01, + ICE_FLOW_RX = 0x02, + ICE_FLOW_TX_RX = ICE_FLOW_RX | ICE_FLOW_TX +}; + +enum ice_flow_priority { + ICE_FLOW_PRIO_LOW, + ICE_FLOW_PRIO_NORMAL, + ICE_FLOW_PRIO_HIGH +}; + +#define ICE_FLOW_SEG_SINGLE 1 +#define ICE_FLOW_SEG_MAX 2 +#define ICE_FLOW_PROFILE_MAX 1024 +#define ICE_FLOW_ACL_FIELD_VECTOR_MAX 32 +#define ICE_FLOW_FV_EXTRACT_SZ 2 + +#define ICE_FLOW_SET_HDRS(seg, val) ((seg)->hdrs |= (uint32_t)(val)) + +struct ice_flow_seg_xtrct { + uint8_t prot_id; /* Protocol ID of extracted header field */ + uint16_t off; /* Starting offset of the field in header in bytes */ + uint8_t idx; /* Index of FV entry used */ + uint8_t disp; /* Displacement of field in bits fr. FV entry's start */ +}; + +enum ice_flow_fld_match_type { + ICE_FLOW_FLD_TYPE_REG, /* Value, mask */ + ICE_FLOW_FLD_TYPE_RANGE, /* Value, mask, last (upper bound) */ + ICE_FLOW_FLD_TYPE_PREFIX, /* IP address, prefix, size of prefix */ + ICE_FLOW_FLD_TYPE_SIZE, /* Value, mask, size of match */ +}; + +struct ice_flow_fld_loc { + /* Describe offsets of field information relative to the beginning of + * input buffer provided when adding flow entries. + */ + uint16_t val; /* Offset where the value is located */ + uint16_t mask; /* Offset where the mask/prefix value is located */ + uint16_t last; /* Length or offset where the upper value is located */ +}; + +struct ice_flow_fld_info { + enum ice_flow_fld_match_type type; + /* Location where to retrieve data from an input buffer */ + struct ice_flow_fld_loc src; + /* Location where to put the data into the final entry buffer */ + struct ice_flow_fld_loc entry; + struct ice_flow_seg_xtrct xtrct; +}; + +struct ice_flow_seg_info { + uint32_t hdrs; /* Bitmask indicating protocol headers present */ + /* Bitmask indicating header fields to be matched */ + ice_declare_bitmap(match, ICE_FLOW_FIELD_IDX_MAX); + /* Bitmask indicating header fields matched as ranges */ + ice_declare_bitmap(range, ICE_FLOW_FIELD_IDX_MAX); + + struct ice_flow_fld_info fields[ICE_FLOW_FIELD_IDX_MAX]; +}; + +#define ICE_FLOW_ENTRY_HNDL(e) ((uint64_t)e) + +struct ice_flow_prof { + TAILQ_ENTRY(ice_flow_prof) l_entry; + + uint64_t id; + enum ice_flow_dir dir; + uint8_t segs_cnt; + + struct ice_flow_seg_info segs[ICE_FLOW_SEG_MAX]; + + /* software VSI handles referenced by this flow profile */ + ice_declare_bitmap(vsis, ICE_MAX_VSI); + + union { + /* struct sw_recipe */ + bool symm; /* Symmetric Hash for RSS */ + } cfg; +}; + +struct ice_rss_cfg { + TAILQ_ENTRY(ice_rss_cfg) l_entry; + /* bitmap of VSIs added to the RSS entry */ + ice_declare_bitmap(vsis, ICE_MAX_VSI); + struct ice_rss_hash_cfg hash; +}; + +TAILQ_HEAD(ice_rss_cfg_head, ice_rss_cfg); + +enum ice_flow_action_type { + ICE_FLOW_ACT_NOP, + ICE_FLOW_ACT_ALLOW, + ICE_FLOW_ACT_DROP, + ICE_FLOW_ACT_CNTR_PKT, + ICE_FLOW_ACT_FWD_VSI, + ICE_FLOW_ACT_FWD_VSI_LIST, /* Should be abstracted away */ + ICE_FLOW_ACT_FWD_QUEUE, /* Can Queues be abstracted away? */ + ICE_FLOW_ACT_FWD_QUEUE_GROUP, /* Can Queues be abstracted away? */ + ICE_FLOW_ACT_PUSH, + ICE_FLOW_ACT_POP, + ICE_FLOW_ACT_MODIFY, + ICE_FLOW_ACT_CNTR_BYTES, + ICE_FLOW_ACT_CNTR_PKT_BYTES, + ICE_FLOW_ACT_GENERIC_0, + ICE_FLOW_ACT_GENERIC_1, + ICE_FLOW_ACT_GENERIC_2, + ICE_FLOW_ACT_GENERIC_3, + ICE_FLOW_ACT_GENERIC_4, + ICE_FLOW_ACT_RPT_FLOW_ID, + ICE_FLOW_ACT_BUILD_PROF_IDX, +}; + +struct ice_flow_action { + enum ice_flow_action_type type; + union { + uint32_t dummy; + } data; +}; + +TAILQ_HEAD(ice_recp_grp_entry_head, ice_recp_grp_entry); +TAILQ_HEAD(ice_fltr_list_head, ice_fltr_list_entry); +TAILQ_HEAD(ice_fltr_mgmt_list_head, ice_fltr_mgmt_list_entry); +TAILQ_HEAD(ice_adv_fltr_mgmt_list_head, ice_adv_fltr_mgmt_list_entry); + +/* Package minimal version supported */ +#define ICE_PKG_SUPP_VER_MAJ 1 +#define ICE_PKG_SUPP_VER_MNR 3 + +/* Package format version */ +#define ICE_PKG_FMT_VER_MAJ 1 +#define ICE_PKG_FMT_VER_MNR 0 +#define ICE_PKG_FMT_VER_UPD 0 +#define ICE_PKG_FMT_VER_DFT 0 + +#define ICE_PKG_CNT 4 + +enum ice_ddp_state { + /* Indicates that this call to ice_init_pkg + * successfully loaded the requested DDP package + */ + ICE_DDP_PKG_SUCCESS = 0, + + /* Generic error for already loaded errors, it is mapped later to + * the more specific one (one of the next 3) + */ + ICE_DDP_PKG_ALREADY_LOADED = -1, + + /* Indicates that a DDP package of the same version has already been + * loaded onto the device by a previous call or by another PF + */ + ICE_DDP_PKG_SAME_VERSION_ALREADY_LOADED = -2, + + /* The device has a DDP package that is not supported by the driver */ + ICE_DDP_PKG_ALREADY_LOADED_NOT_SUPPORTED = -3, + + /* The device has a compatible package + * (but different from the request) already loaded + */ + ICE_DDP_PKG_COMPATIBLE_ALREADY_LOADED = -4, + + /* The firmware loaded on the device is not compatible with + * the DDP package loaded + */ + ICE_DDP_PKG_FW_MISMATCH = -5, + + /* The DDP package file is invalid */ + ICE_DDP_PKG_INVALID_FILE = -6, + + /* The version of the DDP package provided is higher than + * the driver supports + */ + ICE_DDP_PKG_FILE_VERSION_TOO_HIGH = -7, + + /* The version of the DDP package provided is lower than the + * driver supports + */ + ICE_DDP_PKG_FILE_VERSION_TOO_LOW = -8, + + /* Missing security manifest in DDP pkg */ + ICE_DDP_PKG_NO_SEC_MANIFEST = -9, + + /* The RSA signature of the DDP package file provided is invalid */ + ICE_DDP_PKG_FILE_SIGNATURE_INVALID = -10, + + /* The DDP package file security revision is too low and not + * supported by firmware + */ + ICE_DDP_PKG_SECURE_VERSION_NBR_TOO_LOW = -11, + + /* Manifest hash mismatch */ + ICE_DDP_PKG_MANIFEST_INVALID = -12, + + /* Buffer hash mismatches manifest */ + ICE_DDP_PKG_BUFFER_INVALID = -13, + + /* Other errors */ + ICE_DDP_PKG_ERR = -14, +}; + + +/* ice package section IDs */ +#define ICE_SID_METADATA 1 +#define ICE_SID_XLT0_SW 10 +#define ICE_SID_XLT_KEY_BUILDER_SW 11 +#define ICE_SID_XLT1_SW 12 +#define ICE_SID_XLT2_SW 13 +#define ICE_SID_PROFID_TCAM_SW 14 +#define ICE_SID_PROFID_REDIR_SW 15 +#define ICE_SID_FLD_VEC_SW 16 +#define ICE_SID_CDID_KEY_BUILDER_SW 17 +#define ICE_SID_CDID_REDIR_SW 18 + +#define ICE_SID_XLT0_ACL 20 +#define ICE_SID_XLT_KEY_BUILDER_ACL 21 +#define ICE_SID_XLT1_ACL 22 +#define ICE_SID_XLT2_ACL 23 +#define ICE_SID_PROFID_TCAM_ACL 24 +#define ICE_SID_PROFID_REDIR_ACL 25 +#define ICE_SID_FLD_VEC_ACL 26 +#define ICE_SID_CDID_KEY_BUILDER_ACL 27 +#define ICE_SID_CDID_REDIR_ACL 28 + +#define ICE_SID_XLT0_FD 30 +#define ICE_SID_XLT_KEY_BUILDER_FD 31 +#define ICE_SID_XLT1_FD 32 +#define ICE_SID_XLT2_FD 33 +#define ICE_SID_PROFID_TCAM_FD 34 +#define ICE_SID_PROFID_REDIR_FD 35 +#define ICE_SID_FLD_VEC_FD 36 +#define ICE_SID_CDID_KEY_BUILDER_FD 37 +#define ICE_SID_CDID_REDIR_FD 38 + +#define ICE_SID_XLT0_RSS 40 +#define ICE_SID_XLT_KEY_BUILDER_RSS 41 +#define ICE_SID_XLT1_RSS 42 +#define ICE_SID_XLT2_RSS 43 +#define ICE_SID_PROFID_TCAM_RSS 44 +#define ICE_SID_PROFID_REDIR_RSS 45 +#define ICE_SID_FLD_VEC_RSS 46 +#define ICE_SID_CDID_KEY_BUILDER_RSS 47 +#define ICE_SID_CDID_REDIR_RSS 48 + +#define ICE_SID_RXPARSER_CAM 50 +#define ICE_SID_RXPARSER_NOMATCH_CAM 51 +#define ICE_SID_RXPARSER_IMEM 52 +#define ICE_SID_RXPARSER_XLT0_BUILDER 53 +#define ICE_SID_RXPARSER_NODE_PTYPE 54 +#define ICE_SID_RXPARSER_MARKER_PTYPE 55 +#define ICE_SID_RXPARSER_BOOST_TCAM 56 +#define ICE_SID_RXPARSER_PROTO_GRP 57 +#define ICE_SID_RXPARSER_METADATA_INIT 58 +#define ICE_SID_RXPARSER_XLT0 59 + +#define ICE_SID_TXPARSER_CAM 60 +#define ICE_SID_TXPARSER_NOMATCH_CAM 61 +#define ICE_SID_TXPARSER_IMEM 62 +#define ICE_SID_TXPARSER_XLT0_BUILDER 63 +#define ICE_SID_TXPARSER_NODE_PTYPE 64 +#define ICE_SID_TXPARSER_MARKER_PTYPE 65 +#define ICE_SID_TXPARSER_BOOST_TCAM 66 +#define ICE_SID_TXPARSER_PROTO_GRP 67 +#define ICE_SID_TXPARSER_METADATA_INIT 68 +#define ICE_SID_TXPARSER_XLT0 69 + +#define ICE_SID_RXPARSER_INIT_REDIR 70 +#define ICE_SID_TXPARSER_INIT_REDIR 71 +#define ICE_SID_RXPARSER_MARKER_GRP 72 +#define ICE_SID_TXPARSER_MARKER_GRP 73 +#define ICE_SID_RXPARSER_LAST_PROTO 74 +#define ICE_SID_TXPARSER_LAST_PROTO 75 +#define ICE_SID_RXPARSER_PG_SPILL 76 +#define ICE_SID_TXPARSER_PG_SPILL 77 +#define ICE_SID_RXPARSER_NOMATCH_SPILL 78 +#define ICE_SID_TXPARSER_NOMATCH_SPILL 79 + +#define ICE_SID_XLT0_PE 80 +#define ICE_SID_XLT_KEY_BUILDER_PE 81 +#define ICE_SID_XLT1_PE 82 +#define ICE_SID_XLT2_PE 83 +#define ICE_SID_PROFID_TCAM_PE 84 +#define ICE_SID_PROFID_REDIR_PE 85 +#define ICE_SID_FLD_VEC_PE 86 +#define ICE_SID_CDID_KEY_BUILDER_PE 87 +#define ICE_SID_CDID_REDIR_PE 88 + +#define ICE_SID_RXPARSER_FLAG_REDIR 97 + +/* Label Metadata section IDs */ +#define ICE_SID_LBL_FIRST 0x80000010 +#define ICE_SID_LBL_RXPARSER_IMEM 0x80000010 +#define ICE_SID_LBL_TXPARSER_IMEM 0x80000011 +#define ICE_SID_LBL_RESERVED_12 0x80000012 +#define ICE_SID_LBL_RESERVED_13 0x80000013 +#define ICE_SID_LBL_RXPARSER_MARKER 0x80000014 +#define ICE_SID_LBL_TXPARSER_MARKER 0x80000015 +#define ICE_SID_LBL_PTYPE 0x80000016 +#define ICE_SID_LBL_PROTOCOL_ID 0x80000017 +#define ICE_SID_LBL_RXPARSER_TMEM 0x80000018 +#define ICE_SID_LBL_TXPARSER_TMEM 0x80000019 +#define ICE_SID_LBL_RXPARSER_PG 0x8000001A +#define ICE_SID_LBL_TXPARSER_PG 0x8000001B +#define ICE_SID_LBL_RXPARSER_M_TCAM 0x8000001C +#define ICE_SID_LBL_TXPARSER_M_TCAM 0x8000001D +#define ICE_SID_LBL_SW_PROFID_TCAM 0x8000001E +#define ICE_SID_LBL_ACL_PROFID_TCAM 0x8000001F +#define ICE_SID_LBL_PE_PROFID_TCAM 0x80000020 +#define ICE_SID_LBL_RSS_PROFID_TCAM 0x80000021 +#define ICE_SID_LBL_FD_PROFID_TCAM 0x80000022 +#define ICE_SID_LBL_FLAG 0x80000023 +#define ICE_SID_LBL_REG 0x80000024 +#define ICE_SID_LBL_SW_PTG 0x80000025 +#define ICE_SID_LBL_ACL_PTG 0x80000026 +#define ICE_SID_LBL_PE_PTG 0x80000027 +#define ICE_SID_LBL_RSS_PTG 0x80000028 +#define ICE_SID_LBL_FD_PTG 0x80000029 +#define ICE_SID_LBL_SW_VSIG 0x8000002A +#define ICE_SID_LBL_ACL_VSIG 0x8000002B +#define ICE_SID_LBL_PE_VSIG 0x8000002C +#define ICE_SID_LBL_RSS_VSIG 0x8000002D +#define ICE_SID_LBL_FD_VSIG 0x8000002E +#define ICE_SID_LBL_PTYPE_META 0x8000002F +#define ICE_SID_LBL_SW_PROFID 0x80000030 +#define ICE_SID_LBL_ACL_PROFID 0x80000031 +#define ICE_SID_LBL_PE_PROFID 0x80000032 +#define ICE_SID_LBL_RSS_PROFID 0x80000033 +#define ICE_SID_LBL_FD_PROFID 0x80000034 +#define ICE_SID_LBL_RXPARSER_MARKER_GRP 0x80000035 +#define ICE_SID_LBL_TXPARSER_MARKER_GRP 0x80000036 +#define ICE_SID_LBL_RXPARSER_PROTO 0x80000037 +#define ICE_SID_LBL_TXPARSER_PROTO 0x80000038 +/* The following define MUST be updated to reflect the last label section ID */ +#define ICE_SID_LBL_LAST 0x80000038 + +/* Label ICE runtime configuration section IDs */ +#define ICE_SID_TX_5_LAYER_TOPO 0x10 + +enum ice_block { + ICE_BLK_SW = 0, + ICE_BLK_ACL, + ICE_BLK_FD, + ICE_BLK_RSS, + ICE_BLK_PE, + ICE_BLK_COUNT +}; + +/* Tunnel enabling */ + +enum ice_tunnel_type { + TNL_VXLAN = 0, + TNL_GENEVE, + TNL_GRETAP, + TNL_GTP, + TNL_GTPC, + TNL_GTPU, + TNL_LAST = 0xFF, + TNL_ALL = 0xFF, +}; + +struct ice_tunnel_type_scan { + enum ice_tunnel_type type; + const char *label_prefix; +}; + +struct ice_tunnel_entry { + enum ice_tunnel_type type; + uint16_t boost_addr; + uint16_t port; + uint16_t ref; + struct ice_boost_tcam_entry *boost_entry; + uint8_t valid; + uint8_t in_use; + uint8_t marked; +}; + +#define ICE_TUNNEL_MAX_ENTRIES 16 + +struct ice_tunnel_table { + struct ice_tunnel_entry tbl[ICE_TUNNEL_MAX_ENTRIES]; + uint16_t count; +}; + +struct ice_pkg_es { + uint16_t count; + uint16_t offset; + struct ice_fv_word es[STRUCT_HACK_VAR_LEN]; +}; + +TAILQ_HEAD(ice_prof_map_head, ice_prof_map); + +struct ice_es { + uint32_t sid; + uint16_t count; + uint16_t fvw; + uint16_t *ref_count; + struct ice_prof_map_head prof_map; + struct ice_fv_word *t; + struct ice_lock prof_map_lock; /* protect access to profiles list */ + uint8_t *written; + uint8_t reverse; /* set to true to reverse FV order */ +}; + +/* PTYPE Group management */ + +/* Note: XLT1 table takes 13-bit as input, and results in an 8-bit packet type + * group (PTG) ID as output. + * + * Note: PTG 0 is the default packet type group and it is assumed that all PTYPE + * are a part of this group until moved to a new PTG. + */ +#define ICE_DEFAULT_PTG 0 + +struct ice_ptg_entry { + struct ice_ptg_ptype *first_ptype; + uint8_t in_use; +}; + +struct ice_ptg_ptype { + struct ice_ptg_ptype *next_ptype; + uint8_t ptg; +}; + +#define ICE_MAX_TCAM_PER_PROFILE 32 +#define ICE_MAX_PTG_PER_PROFILE 32 + +struct ice_prof_map { + TAILQ_ENTRY(ice_prof_map) list; + uint64_t profile_cookie; + uint64_t context; + uint8_t prof_id; + uint8_t ptg_cnt; + uint8_t ptg[ICE_MAX_PTG_PER_PROFILE]; +}; + +#define ICE_INVALID_TCAM 0xFFFF + +struct ice_tcam_inf { + uint16_t tcam_idx; + uint8_t ptg; + uint8_t prof_id; + uint8_t in_use; +}; + +struct ice_vsig_prof { + TAILQ_ENTRY(ice_vsig_prof) list; + uint64_t profile_cookie; + uint8_t prof_id; + uint8_t tcam_count; + struct ice_tcam_inf tcam[ICE_MAX_TCAM_PER_PROFILE]; +}; + +TAILQ_HEAD(ice_vsig_prof_head, ice_vsig_prof); + +struct ice_vsig_entry { + struct ice_vsig_prof_head prop_lst; + struct ice_vsig_vsi *first_vsi; + uint8_t in_use; +}; + +struct ice_vsig_vsi { + struct ice_vsig_vsi *next_vsi; + uint32_t prop_mask; + uint16_t changed; + uint16_t vsig; +}; + +#define ICE_XLT1_CNT 1024 +#define ICE_MAX_PTGS 256 + +/* XLT1 Table */ +struct ice_xlt1 { + struct ice_ptg_entry *ptg_tbl; + struct ice_ptg_ptype *ptypes; + uint8_t *t; + uint32_t sid; + uint16_t count; +}; + + +#define ICE_XLT2_CNT 768 +#define ICE_MAX_VSIGS 768 + +/* VSIG bit layout: + * [0:12]: incremental VSIG index 1 to ICE_MAX_VSIGS + * [13:15]: PF number of device + */ +#define ICE_VSIG_IDX_M (0x1FFF) +#define ICE_PF_NUM_S 13 +#define ICE_PF_NUM_M (0x07 << ICE_PF_NUM_S) +#define ICE_VSIG_VALUE(vsig, pf_id) \ + ((uint16_t)((((uint16_t)(vsig)) & ICE_VSIG_IDX_M) | \ + (((uint16_t)(pf_id) << ICE_PF_NUM_S) & ICE_PF_NUM_M))) +#define ICE_DEFAULT_VSIG 0 + +/* XLT2 Table */ +struct ice_xlt2 { + struct ice_vsig_entry *vsig_tbl; + struct ice_vsig_vsi *vsis; + uint16_t *t; + uint32_t sid; + uint16_t count; +}; + +/* Extraction sequence - list of match fields: + * protocol ID, offset, profile length + */ +union ice_match_fld { + struct { + uint8_t prot_id; + uint8_t offset; + uint8_t length; + uint8_t reserved; /* must be zero */ + } fld; + uint32_t val; +}; + +#define ICE_MATCH_LIST_SZ 20 +#pragma pack(1) +struct ice_match { + uint8_t count; + union ice_match_fld list[ICE_MATCH_LIST_SZ]; +}; + +/* Profile ID Management */ +struct ice_prof_id_key { + uint16_t flags; + uint8_t xlt1; + uint16_t xlt2_cdid; +}; + +/* Keys are made up of two values, each one-half the size of the key. + * For TCAM, the entire key is 80 bits wide (or 2, 40-bit wide values) + */ +#define ICE_TCAM_KEY_VAL_SZ 5 +#define ICE_TCAM_KEY_SZ (2 * ICE_TCAM_KEY_VAL_SZ) + +struct ice_prof_tcam_entry { + uint16_t addr; + uint8_t key[ICE_TCAM_KEY_SZ]; + uint8_t prof_id; +}; +#pragma pack() + +struct ice_prof_id_section { + uint16_t count; + struct ice_prof_tcam_entry entry[STRUCT_HACK_VAR_LEN]; +}; + +struct ice_prof_tcam { + uint32_t sid; + uint16_t count; + uint16_t max_prof_id; + struct ice_prof_tcam_entry *t; + uint8_t cdid_bits; /* # CDID bits to use in key, 0, 2, 4, or 8 */ +}; + +enum ice_chg_type { + ICE_TCAM_NONE = 0, + ICE_PTG_ES_ADD, + ICE_TCAM_ADD, + ICE_VSIG_ADD, + ICE_VSIG_REM, + ICE_VSI_MOVE, +}; + +TAILQ_HEAD(ice_chs_chg_head, ice_chs_chg); + +struct ice_chs_chg { + TAILQ_ENTRY(ice_chs_chg) list_entry; + enum ice_chg_type type; + + uint8_t add_ptg; + uint8_t add_vsig; + uint8_t add_tcam_idx; + uint8_t add_prof; + uint16_t ptype; + uint8_t ptg; + uint8_t prof_id; + uint16_t vsi; + uint16_t vsig; + uint16_t orig_vsig; + uint16_t tcam_idx; +}; + +#define ICE_FLOW_PTYPE_MAX ICE_XLT1_CNT + +struct ice_prof_redir { + uint8_t *t; + uint32_t sid; + uint16_t count; +}; + +/* Tables per block */ +struct ice_blk_info { + struct ice_xlt1 xlt1; + struct ice_xlt2 xlt2; + struct ice_prof_tcam prof; + struct ice_prof_redir prof_redir; + struct ice_es es; + uint8_t overwrite; /* set to true to allow overwrite of table entries */ + uint8_t is_list_init; +}; + + +struct ice_sw_recipe { + /* For a chained recipe the root recipe is what should be used for + * programming rules + */ + uint8_t is_root; + uint8_t root_rid; + uint8_t recp_created; + + /* Number of extraction words */ + uint8_t n_ext_words; + /* Protocol ID and Offset pair (extraction word) to describe the + * recipe + */ + struct ice_fv_word ext_words[ICE_MAX_CHAIN_WORDS]; + uint16_t word_masks[ICE_MAX_CHAIN_WORDS]; + + /* if this recipe is a collection of other recipe */ + uint8_t big_recp; + + /* if this recipe is part of another bigger recipe then chain index + * corresponding to this recipe + */ + uint8_t chain_idx; + + /* if this recipe is a collection of other recipe then count of other + * recipes and recipe IDs of those recipes + */ + uint8_t n_grp_count; + + /* Bit map specifying the IDs associated with this group of recipe */ + ice_declare_bitmap(r_bitmap, ICE_MAX_NUM_RECIPES); +#if 0 + enum ice_sw_tunnel_type tun_type; +#endif + /* List of type ice_fltr_mgmt_list_entry or adv_rule */ + uint8_t adv_rule; + struct ice_fltr_mgmt_list_head filt_rules; + struct ice_adv_fltr_mgmt_list_head adv_filt_rules; + struct ice_fltr_mgmt_list_head filt_replay_rules; + struct ice_lock filt_rule_lock; /* protect filter rule structure */ +#if 0 + /* Profiles this recipe should be associated with */ + struct LIST_HEAD_TYPE fv_list; +#endif + /* Profiles this recipe is associated with */ + uint8_t num_profs, *prof_ids; + + /* Bit map for possible result indexes */ + ice_declare_bitmap(res_idxs, ICE_MAX_FV_WORDS); + + /* This allows user to specify the recipe priority. + * For now, this becomes 'fwd_priority' when recipe + * is created, usually recipes can have 'fwd' and 'join' + * priority. + */ + uint8_t priority; + + struct ice_recp_grp_entry_head rg_list; + + /* AQ buffer associated with this recipe */ + struct ice_aqc_recipe_data_elem *root_buf; +#if 0 + /* This struct saves the fv_words for a given lookup */ + struct ice_prot_lkup_ext lkup_exts; +#endif +}; + +TAILQ_HEAD(ice_flow_prof_head, ice_flow_prof); + +/* Port hardware description */ +struct ice_hw { + struct ice_softc *hw_sc; +#if 0 + uint8_t *hw_addr; + void *back; +#endif + struct ice_aqc_layer_props *layer_info; + struct ice_port_info *port_info; +#if 0 + /* 2D Array for each Tx Sched RL Profile type */ + struct ice_sched_rl_profile **cir_profiles; + struct ice_sched_rl_profile **eir_profiles; + struct ice_sched_rl_profile **srl_profiles; +#endif + /* PSM clock frequency for calculating RL profile params */ + uint32_t psm_clk_freq; + enum ice_mac_type mac_type; +#if 0 + /* pci info */ + uint16_t device_id; + uint16_t vendor_id; + uint16_t subsystem_device_id; + uint16_t subsystem_vendor_id; + uint8_t revision_id; +#endif + uint8_t pf_id; /* device profile info */ +#if 0 + enum ice_phy_model phy_model; + uint8_t phy_ports; + uint8_t max_phy_port; + +#endif + uint16_t max_burst_size; /* driver sets this value */ + + /* Tx Scheduler values */ + uint8_t num_tx_sched_layers; + uint8_t num_tx_sched_phys_layers; + uint8_t flattened_layers; + uint8_t max_cgds; + uint8_t sw_entry_point_layer; + uint16_t max_children[ICE_AQC_TOPO_MAX_LEVEL_NUM]; + struct ice_agg_list_head agg_list; /* lists all aggregator */ + /* List contain profile ID(s) and other params per layer */ + struct ice_rl_prof_list_head rl_prof_list[ICE_AQC_TOPO_MAX_LEVEL_NUM]; + struct ice_vsi_ctx *vsi_ctx[ICE_MAX_VSI]; + uint8_t evb_veb; /* true for VEB, false for VEPA */ + uint8_t reset_ongoing; /* true if HW is in reset, false otherwise */ +#if 0 + struct ice_bus_info bus; +#endif + struct ice_flash_info flash; + struct ice_hw_dev_caps dev_caps; /* device capabilities */ + struct ice_hw_func_caps func_caps; /* function capabilities */ + struct ice_switch_info *switch_info; /* switch filter lists */ + + /* Control Queue info */ + struct ice_ctl_q_info adminq; + struct ice_ctl_q_info mailboxq; + uint8_t api_branch; /* API branch version */ + uint8_t api_maj_ver; /* API major version */ + uint8_t api_min_ver; /* API minor version */ + uint8_t api_patch; /* API patch version */ + uint8_t fw_branch; /* firmware branch version */ + uint8_t fw_maj_ver; /* firmware major version */ + uint8_t fw_min_ver; /* firmware minor version */ + uint8_t fw_patch; /* firmware patch version */ + uint32_t fw_build; /* firmware build number */ + struct ice_fwlog_cfg fwlog_cfg; + bool fwlog_support_ena; /* does hardware support FW logging? */ + +/* Device max aggregate bandwidths corresponding to the GL_PWR_MODE_CTL + * register. Used for determining the ITR/INTRL granularity during + * initialization. + */ +#define ICE_MAX_AGG_BW_200G 0x0 +#define ICE_MAX_AGG_BW_100G 0X1 +#define ICE_MAX_AGG_BW_50G 0x2 +#define ICE_MAX_AGG_BW_25G 0x3 + /* ITR granularity for different speeds */ +#define ICE_ITR_GRAN_ABOVE_25 2 +#define ICE_ITR_GRAN_MAX_25 4 + /* ITR granularity in 1 us */ + uint8_t itr_gran; + /* INTRL granularity for different speeds */ +#define ICE_INTRL_GRAN_ABOVE_25 4 +#define ICE_INTRL_GRAN_MAX_25 8 + /* INTRL granularity in 1 us */ + uint8_t intrl_gran; + + /* true if VSIs can share unicast MAC addr */ + uint8_t umac_shared; +#if 0 + +#define ICE_PHY_PER_NAC_E822 1 +#define ICE_MAX_QUAD 2 +#define ICE_QUADS_PER_PHY_E822 2 +#define ICE_PORTS_PER_PHY_E822 8 +#define ICE_PORTS_PER_QUAD 4 +#define ICE_PORTS_PER_PHY_E810 4 +#define ICE_NUM_EXTERNAL_PORTS (ICE_MAX_QUAD * ICE_PORTS_PER_QUAD) +#endif + /* Active package version (currently active) */ + struct ice_pkg_ver active_pkg_ver; + uint32_t pkg_seg_id; + uint32_t pkg_sign_type; + uint32_t active_track_id; + uint8_t pkg_has_signing_seg:1; + uint8_t active_pkg_name[ICE_PKG_NAME_SIZE]; + uint8_t active_pkg_in_nvm; + + /* Driver's package ver - (from the Ice Metadata section) */ + struct ice_pkg_ver pkg_ver; + uint8_t pkg_name[ICE_PKG_NAME_SIZE]; +#if 0 + /* Driver's Ice segment format version and id (from the Ice seg) */ + struct ice_pkg_ver ice_seg_fmt_ver; + uint8_t ice_seg_id[ICE_SEG_ID_SIZE]; + + /* Pointer to the ice segment */ + struct ice_seg *seg; + + /* Pointer to allocated copy of pkg memory */ + uint8_t *pkg_copy; + u32 pkg_size; + + /* tunneling info */ + struct ice_lock tnl_lock; + struct ice_tunnel_table tnl; +#endif + /* HW block tables */ + struct ice_blk_info blk[ICE_BLK_COUNT]; +#if 0 + struct ice_lock fl_profs_locks[ICE_BLK_COUNT]; /* lock fltr profiles */ +#endif + struct ice_flow_prof_head fl_profs[ICE_BLK_COUNT]; +#if 0 + struct ice_lock rss_locks; /* protect RSS configuration */ +#endif + struct ice_rss_cfg_head rss_list_head; +#if 0 + uint16_t vsi_owning_pf_lut; /* SW IDX of VSI that acquired PF RSS LUT */ + struct ice_mbx_snapshot mbx_snapshot; + uint8_t dvm_ena; + + bool subscribable_recipes_supported; +#endif +}; + +/** + * @enum ice_state + * @brief Driver state flags + * + * Used to indicate the status of various driver events. Intended to be + * modified only using atomic operations, so that we can use it even in places + * which aren't locked. + */ +enum ice_state { + ICE_STATE_CONTROLQ_EVENT_PENDING, + ICE_STATE_VFLR_PENDING, + ICE_STATE_MDD_PENDING, + ICE_STATE_RESET_OICR_RECV, + ICE_STATE_RESET_PFR_REQ, + ICE_STATE_PREPARED_FOR_RESET, + ICE_STATE_SUBIF_NEEDS_REINIT, + ICE_STATE_RESET_FAILED, + ICE_STATE_DRIVER_INITIALIZED, + ICE_STATE_NO_MEDIA, + ICE_STATE_RECOVERY_MODE, + ICE_STATE_ROLLBACK_MODE, + ICE_STATE_LINK_STATUS_REPORTED, + ICE_STATE_ATTACHING, + ICE_STATE_DETACHING, + ICE_STATE_LINK_DEFAULT_OVERRIDE_PENDING, + ICE_STATE_LLDP_RX_FLTR_FROM_DRIVER, + ICE_STATE_MULTIPLE_TCS, + ICE_STATE_DO_FW_DEBUG_DUMP, + ICE_STATE_LINK_ACTIVE_ON_DOWN, + ICE_STATE_FIRST_INIT_LINK, + ICE_STATE_DO_CREATE_MIRR_INTFC, + ICE_STATE_DO_DESTROY_MIRR_INTFC, + /* This entry must be last */ + ICE_STATE_LAST, +}; + +/** + * ice_set_state - Set the specified state + * @s: the state bitmap + * @bit: the state to set + * + * Atomically update the state bitmap with the specified bit set. + */ +static inline void +ice_set_state(volatile uint32_t *s, enum ice_state bit) +{ + atomic_setbits_int(s, (1UL << bit)); +} + +/** + * ice_clear_state - Clear the specified state + * @s: the state bitmap + * @bit: the state to clear + * + * Atomically update the state bitmap with the specified bit cleared. + */ +static inline void +ice_clear_state(volatile uint32_t *s, enum ice_state bit) +{ + atomic_clearbits_int(s, (1UL << bit)); +} + +/** + * ice_testandset_state - Test and set the specified state + * @s: the state bitmap + * @bit: the bit to test + * + * Atomically update the state bitmap, setting the specified bit. Returns the + * previous value of the bit. + */ +static inline uint32_t +ice_testandset_state(volatile uint32_t *s, enum ice_state bit) +{ + uint32_t expected = *s; + uint32_t previous; + + previous = atomic_cas_uint(s, expected, expected | (1UL << bit)); + return (previous & (1UL << bit)) ? 1 : 0; +} + +/** + * ice_testandclear_state - Test and clear the specified state + * @s: the state bitmap + * @bit: the bit to test + * + * Atomically update the state bitmap, clearing the specified bit. Returns the + * previous value of the bit. + */ +static inline uint32_t +ice_testandclear_state(volatile uint32_t *s, enum ice_state bit) +{ + uint32_t expected = *s; + uint32_t previous; + + previous = atomic_cas_uint(s, expected, expected & ~(1UL << bit)); + return (previous & (1UL << bit)) ? 1 : 0; +} + +/** + * ice_test_state - Test the specified state + * @s: the state bitmap + * @bit: the bit to test + * + * Return true if the state is set, false otherwise. Use this only if the flow + * does not need to update the state. If you must update the state as well, + * prefer ice_testandset_state or ice_testandclear_state. + */ +static inline uint32_t +ice_test_state(volatile uint32_t *s, enum ice_state bit) +{ + return (*s & (1UL << bit)) ? 1 : 0; +} + +static inline uint32_t ice_round_to_num(uint32_t N, uint32_t R) +{ + return ((((N) % (R)) < ((R) / 2)) ? (((N) / (R)) * (R)) : + ((((N) + (R) - 1) / (R)) * (R))); +} + +/* based on parity() in sys/net/toepliz.c */ +static inline uint16_t +ice_popcount16(uint16_t n16) +{ + n16 = ((n16 & 0xaaaa) >> 1) + (n16 & 0x5555); + n16 = ((n16 & 0xcccc) >> 2) + (n16 & 0x3333); + n16 = ((n16 & 0xf0f0) >> 4) + (n16 & 0x0f0f); + n16 = ((n16 & 0xff00) >> 8) + (n16 & 0x00ff); + + return (n16); +} + +/* based on parity() in sys/net/toepliz.c */ +static inline uint32_t +ice_popcount32(uint32_t n32) +{ + n32 = ((n32 & 0xaaaaaaaa) >> 1) + (n32 & 0x55555555); + n32 = ((n32 & 0xcccccccc) >> 2) + (n32 & 0x33333333); + n32 = ((n32 & 0xf0f0f0f0) >> 4) + (n32 & 0x0f0f0f0f); + n32 = ((n32 & 0xff00ff00) >> 8) + (n32 & 0x00ff00ff); + n32 = ((n32 & 0xffff0000) >> 16) + (n32 & 0x0000ffff); + + return (n32); +} + +#define ice_ilog2(x) ((sizeof(x) <= 4) ? (fls(x) - 1) : (flsl(x) - 1)) + +/* + * ice_bit_* functions derived from FreeBSD sys/bitstring.h + */ + +typedef uint32_t ice_bitstr_t; + +#define ICE_BITSTR_MASK (~0UL) +#define ICE_BITSTR_BITS (sizeof(ice_bitstr_t) * 8) + +/* round up x to the next multiple of y if y is a power of two */ +#define ice_bit_roundup(x, y) \ + (((size_t)(x) + (y) - 1) & ~((size_t)(y) - 1)) + +/* Number of bytes allocated for a bit string of nbits bits */ +#define ice_bitstr_size(nbits) (ice_bit_roundup((nbits), ICE_BITSTR_BITS) / 8) + +static inline ice_bitstr_t * +ice_bit_alloc(size_t nbits) +{ + return malloc(ice_bitstr_size(nbits), M_DEVBUF, M_NOWAIT | M_ZERO); +} + +/* Allocate a bit string on the stack */ +#define ice_bit_decl(name, nbits) \ + ((name)[bitstr_size(nbits) / sizeof(ice_bitstr_t)]) + +/* ice_bitstr_t in bit string containing the bit. */ +static inline size_t +ice_bit_idx(size_t bit) +{ + return (bit / ICE_BITSTR_BITS); +} + +/* bit number within ice_bitstr_t at ice_bit_idx(_bit). */ +static inline size_t +ice_bit_offset(size_t bit) +{ + return (bit % ICE_BITSTR_BITS); +} + +/* Mask for the bit within its long. */ +static inline ice_bitstr_t +ice_bit_mask(size_t bit) +{ + return (1UL << ice_bit_offset(bit)); +} + +static inline ice_bitstr_t +ice_bit_make_mask(size_t start, size_t stop) +{ + return ((ICE_BITSTR_MASK << ice_bit_offset(start)) & + (ICE_BITSTR_MASK >> (ICE_BITSTR_BITS - ice_bit_offset(stop) - 1))); +} + +/* Is bit N of bit string set? */ +static inline int +ice_bit_test(const ice_bitstr_t *bitstr, size_t bit) +{ + return ((bitstr[ice_bit_idx(bit)] & ice_bit_mask(bit)) != 0); +} + +/* Set bit N of bit string. */ +static inline void +ice_bit_set(ice_bitstr_t *bitstr, size_t bit) +{ + bitstr[ice_bit_idx(bit)] |= ice_bit_mask(bit); +} + +/* clear bit N of bit string name */ +static inline void +ice_bit_clear(ice_bitstr_t *bitstr, size_t bit) +{ + bitstr[ice_bit_idx(bit)] &= ~ice_bit_mask(bit); +} + +/* Count the number of bits set in a bitstr of size nbits at or after start */ +static inline ssize_t +ice_bit_count(ice_bitstr_t *bitstr, size_t start, size_t nbits) +{ + ice_bitstr_t *curbitstr, mask; + size_t curbitstr_len; + ssize_t value = 0; + + if (start >= nbits) + return (0); + + curbitstr = bitstr + ice_bit_idx(start); + nbits -= ICE_BITSTR_BITS * ice_bit_idx(start); + start -= ICE_BITSTR_BITS * ice_bit_idx(start); + + if (start > 0) { + curbitstr_len = (int)ICE_BITSTR_BITS < nbits ? + (int)ICE_BITSTR_BITS : nbits; + mask = ice_bit_make_mask(start, + ice_bit_offset(curbitstr_len - 1)); + value += ice_popcount32(*curbitstr & mask); + curbitstr++; + if (nbits < ICE_BITSTR_BITS) + return (value); + nbits -= ICE_BITSTR_BITS; + } + while (nbits >= (int)ICE_BITSTR_BITS) { + value += ice_popcount32(*curbitstr); + curbitstr++; + nbits -= ICE_BITSTR_BITS; + } + if (nbits > 0) { + mask = ice_bit_make_mask(0, ice_bit_offset(nbits - 1)); + value += ice_popcount32(*curbitstr & mask); + } + + return (value); +} + +/* Find the first 'match'-bit in bit string at or after bit start. */ +static inline ssize_t +ice_bit_ff_at(ice_bitstr_t *bitstr, size_t start, size_t nbits, int match) +{ + ice_bitstr_t *curbitstr; + ice_bitstr_t *stopbitstr; + ice_bitstr_t mask; + ice_bitstr_t test; + ssize_t value; + + if (start >= nbits || nbits <= 0) + return (-1); + + curbitstr = bitstr + ice_bit_idx(start); + stopbitstr = bitstr + ice_bit_idx(nbits - 1); + mask = match ? 0 : ICE_BITSTR_MASK; + + test = mask ^ *curbitstr; + if (ice_bit_offset(start) != 0) + test &= ice_bit_make_mask(start, ICE_BITSTR_BITS - 1); + while (test == 0 && curbitstr < stopbitstr) + test = mask ^ *(++curbitstr); + + value = ((curbitstr - bitstr) * ICE_BITSTR_BITS) + ffs(test) - 1; + if (test == 0 || + (ice_bit_offset(nbits) != 0 && (size_t)value >= nbits)) + value = -1; + return (value); +} + +/* Find contiguous sequence of at least size 'match'-bits at or after start */ +static inline ssize_t +ice_bit_ff_area_at(ice_bitstr_t *bitstr, size_t start, size_t nbits, + size_t size, int match) +{ + ice_bitstr_t *curbitstr, mask, test; + size_t last, shft, maxshft; + ssize_t value; + + if (start + size > nbits || nbits <= 0) + return (-1); + + mask = match ? ICE_BITSTR_MASK : 0; + maxshft = ice_bit_idx(size - 1) == 0 ? size : (int)ICE_BITSTR_BITS; + value = start; + curbitstr = bitstr + ice_bit_idx(start); + test = ~(ICE_BITSTR_MASK << ice_bit_offset(start)); + for (last = size - 1, test |= mask ^ *curbitstr; + !(ice_bit_idx(last) == 0 && + (test & ice_bit_make_mask(0, last)) == 0); + last -= ICE_BITSTR_BITS, test = mask ^ *++curbitstr) { + if (test == 0) + continue; + /* Shrink-left every 0-area in _test by maxshft-1 bits. */ + for (shft = maxshft; shft > 1 && (test & (test + 1)) != 0; + shft = (shft + 1) / 2) + test |= test >> shft / 2; + /* Find the start of the first 0-area in 'test'. */ + last = ffs(~(test >> 1)); + value = (curbitstr - bitstr) * ICE_BITSTR_BITS + last; + /* If there's insufficient space left, give up. */ + if (value + size > nbits) { + value = -1; + break; + } + last += size - 1; + /* If a solution is contained in 'test', success! */ + if (ice_bit_idx(last) == 0) + break; + /* A solution here needs bits from the next word. */ + } + + return (value); +} + +/* Find contiguous sequence of at least size set bits in bit string */ +#define ice_bit_ffs_area(_bitstr, _nbits, _size, _resultp) \ + *(_resultp) = ice_bit_ff_area_at((_bitstr), 0, (_nbits), (_size), 1) + +/* Find contiguous sequence of at least size cleared bits in bit string */ +#define ice_bit_ffc_area(_bitstr, _nbits, _size, _resultp) \ + *(_resultp) = ice_bit_ff_area_at((_bitstr), 0, (_nbits), (_size), 0) + + +/** + * @file ice_resmgr.h + * @brief Resource manager interface + * + * Defines an interface for managing PF hardware queues and interrupts for assigning them to + * hardware VSIs and VFs. + * + * For queue management: + * The total number of available Tx and Rx queues is not equal, so it is + * expected that each PF will allocate two ice_resmgr structures, one for Tx + * and one for Rx. These should be allocated in attach() prior to initializing + * VSIs, and destroyed in detach(). + * + * For interrupt management: + * The PF allocates an ice_resmgr structure that does not allow scattered + * allocations since interrupt allocations must be contiguous. + */ + +/* + * For managing VSI queue allocations + */ +/* Hardware only supports a limited number of resources in scattered mode */ +#define ICE_MAX_SCATTERED_QUEUES 16 +/* Use highest value to indicate invalid resource mapping */ +#define ICE_INVALID_RES_IDX 0xFFFF + +/** + * @struct ice_resmgr + * @brief Resource manager + * + * Represent resource allocations using a bitstring, where bit zero represents + * the first resource. If a particular bit is set this indicates that the + * resource has been allocated and is not free. + */ +struct ice_resmgr { + ice_bitstr_t *resources; + uint16_t num_res; + bool contig_only; +}; + +/** + * @enum ice_resmgr_alloc_type + * @brief resource manager allocation types + * + * Enumeration of possible allocation types that can be used when + * assigning resources. For now, SCATTERED is only used with + * managing queue allocations. + */ +enum ice_resmgr_alloc_type { + ICE_RESMGR_ALLOC_INVALID = 0, + ICE_RESMGR_ALLOC_CONTIGUOUS, + ICE_RESMGR_ALLOC_SCATTERED +}; + +/** + * @struct ice_tc_info + * @brief Traffic class information for a VSI + * + * Stores traffic class information used in configuring + * a VSI. + */ +struct ice_tc_info { + uint16_t qoffset; /* Offset in VSI queue space */ + uint16_t qcount_tx; /* TX queues for this Traffic Class */ + uint16_t qcount_rx; /* RX queues */ +}; + +/* Statistics collected by each port, VSI, VEB, and S-channel */ +struct ice_eth_stats { + uint64_t rx_bytes; /* gorc */ + uint64_t rx_unicast; /* uprc */ + uint64_t rx_multicast; /* mprc */ + uint64_t rx_broadcast; /* bprc */ + uint64_t rx_discards; /* rdpc */ + uint64_t rx_unknown_protocol; /* rupp */ + uint64_t tx_bytes; /* gotc */ + uint64_t tx_unicast; /* uptc */ + uint64_t tx_multicast; /* mptc */ + uint64_t tx_broadcast; /* bptc */ + uint64_t tx_discards; /* tdpc */ + uint64_t tx_errors; /* tepc */ + uint64_t rx_no_desc; /* repc */ + uint64_t rx_errors; /* repc */ +}; + +/** + * @struct ice_vsi_hw_stats + * @brief hardware statistics for a VSI + * + * Stores statistics that are generated by hardware for a VSI. + */ +struct ice_vsi_hw_stats { + struct ice_eth_stats prev; + struct ice_eth_stats cur; + bool offsets_loaded; +}; + +/* Statistics collected by the MAC */ +struct ice_hw_port_stats { + /* eth stats collected by the port */ + struct ice_eth_stats eth; + /* additional port specific stats */ + uint64_t tx_dropped_link_down; /* tdold */ + uint64_t crc_errors; /* crcerrs */ + uint64_t illegal_bytes; /* illerrc */ + uint64_t error_bytes; /* errbc */ + uint64_t mac_local_faults; /* mlfc */ + uint64_t mac_remote_faults; /* mrfc */ + uint64_t rx_len_errors; /* rlec */ + uint64_t link_xon_rx; /* lxonrxc */ + uint64_t link_xoff_rx; /* lxoffrxc */ + uint64_t link_xon_tx; /* lxontxc */ + uint64_t link_xoff_tx; /* lxofftxc */ + uint64_t priority_xon_rx[8]; /* pxonrxc[8] */ + uint64_t priority_xoff_rx[8]; /* pxoffrxc[8] */ + uint64_t priority_xon_tx[8]; /* pxontxc[8] */ + uint64_t priority_xoff_tx[8]; /* pxofftxc[8] */ + uint64_t priority_xon_2_xoff[8];/* pxon2offc[8] */ + uint64_t rx_size_64; /* prc64 */ + uint64_t rx_size_127; /* prc127 */ + uint64_t rx_size_255; /* prc255 */ + uint64_t rx_size_511; /* prc511 */ + uint64_t rx_size_1023; /* prc1023 */ + uint64_t rx_size_1522; /* prc1522 */ + uint64_t rx_size_big; /* prc9522 */ + uint64_t rx_undersize; /* ruc */ + uint64_t rx_fragments; /* rfc */ + uint64_t rx_oversize; /* roc */ + uint64_t rx_jabber; /* rjc */ + uint64_t tx_size_64; /* ptc64 */ + uint64_t tx_size_127; /* ptc127 */ + uint64_t tx_size_255; /* ptc255 */ + uint64_t tx_size_511; /* ptc511 */ + uint64_t tx_size_1023; /* ptc1023 */ + uint64_t tx_size_1522; /* ptc1522 */ + uint64_t tx_size_big; /* ptc9522 */ + uint64_t mac_short_pkt_dropped; /* mspdc */ + /* EEE LPI */ + uint32_t tx_lpi_status; + uint32_t rx_lpi_status; + uint64_t tx_lpi_count; /* etlpic */ + uint64_t rx_lpi_count; /* erlpic */ +}; + +/** + * @struct ice_pf_hw_stats + * @brief hardware statistics for a PF + * + * Stores statistics that are generated by hardware for each PF. + */ +struct ice_pf_hw_stats { + struct ice_hw_port_stats prev; + struct ice_hw_port_stats cur; + bool offsets_loaded; +}; + +/** + * @struct ice_pf_sw_stats + * @brief software statistics for a PF + * + * Contains software generated statistics relevant to a PF. + */ +struct ice_pf_sw_stats { + /* # of reset events handled, by type */ + uint32_t corer_count; + uint32_t globr_count; + uint32_t empr_count; + uint32_t pfr_count; + + /* # of detected MDD events for Tx and Rx */ + uint32_t tx_mdd_count; + uint32_t rx_mdd_count; +}; + +struct ice_tx_map { + struct mbuf *txm_m; + bus_dmamap_t txm_map; + unsigned int txm_eop; +}; + +/** + * @struct ice_tx_queue + * @brief Driver Tx queue structure + * + * @vsi: backpointer the VSI structure + * @me: this queue's index into the queue array + * @irqv: always NULL for iflib + * @desc_count: the number of descriptors + * @tx_paddr: the physical address for this queue + * @q_teid: the Tx queue TEID returned from firmware + * @stats: queue statistics + * @tc: traffic class queue belongs to + * @q_handle: qidx in tc; used in TXQ enable functions + */ +struct ice_tx_queue { + struct ice_vsi *vsi; + struct ice_tx_desc *tx_base; + struct ice_dma_mem tx_desc_mem; + bus_addr_t tx_paddr; + struct ice_tx_map *tx_map; +#if 0 + struct tx_stats stats; +#endif + uint64_t tso; + uint16_t desc_count; + uint32_t tail; + struct ice_intr_vector *irqv; + uint32_t q_teid; + uint32_t me; + uint16_t q_handle; + uint8_t tc; + + /* descriptor writeback status */ + uint16_t *tx_rsq; + uint16_t tx_rs_cidx; + uint16_t tx_rs_pidx; + uint16_t tx_cidx_processed; + + struct ifqueue *txq_ifq; + + unsigned int txq_prod; + unsigned int txq_cons; +}; + +struct ice_rx_map { + struct mbuf *rxm_m; + bus_dmamap_t rxm_map; +}; + +/** + * @struct ice_rx_queue + * @brief Driver Rx queue structure + * + * @vsi: backpointer the VSI structure + * @me: this queue's index into the queue array + * @irqv: pointer to vector structure associated with this queue + * @desc_count: the number of descriptors + * @rx_paddr: the physical address for this queue + * @tail: the tail register address for this queue + * @stats: queue statistics + * @tc: traffic class queue belongs to + */ +struct ice_rx_queue { + struct ice_vsi *vsi; + union ice_32b_rx_flex_desc *rx_base; + struct ice_dma_mem rx_desc_mem; + bus_addr_t rx_paddr; + struct ice_rx_map *rx_map; +#if 0 + struct rx_stats stats; +#endif + uint16_t desc_count; + uint32_t tail; + struct ice_intr_vector *irqv; + uint32_t me; + uint8_t tc; + + struct if_rxring rxq_acct; + struct timeout rxq_refill; + unsigned int rxq_prod; + unsigned int rxq_cons; + struct ifiqueue *rxq_ifiq; + struct mbuf *rxq_m_head; + struct mbuf **rxq_m_tail; +}; + +/** + * @struct ice_vsi + * @brief VSI structure + * + * Contains data relevant to a single VSI + */ +struct ice_vsi { + /* back pointer to the softc */ + struct ice_softc *sc; + + bool dynamic; /* if true, dynamically allocated */ + + enum ice_vsi_type type; /* type of this VSI */ + uint16_t idx; /* software index to sc->all_vsi[] */ + + uint16_t *tx_qmap; /* Tx VSI to PF queue mapping */ + uint16_t *rx_qmap; /* Rx VSI to PF queue mapping */ + + enum ice_resmgr_alloc_type qmap_type; + + struct ice_tx_queue *tx_queues; /* Tx queue array */ + struct ice_rx_queue *rx_queues; /* Rx queue array */ + + int num_tx_queues; + int num_rx_queues; + int num_vectors; + + int16_t rx_itr; + int16_t tx_itr; + + /* RSS configuration */ + uint16_t rss_table_size; /* HW RSS table size */ + uint8_t rss_lut_type; /* Used to configure Get/Set RSS LUT AQ call */ + + int max_frame_size; + uint16_t mbuf_sz; + + struct ice_aqc_vsi_props info; + + /* DCB configuration */ + uint8_t num_tcs; /* Total number of enabled TCs */ + uint16_t tc_map; /* bitmap of enabled Traffic Classes */ + /* Information for each traffic class */ + struct ice_tc_info tc_info[ICE_MAX_TRAFFIC_CLASS]; +#if 0 + /* context for per-VSI sysctls */ + struct sysctl_ctx_list ctx; + struct sysctl_oid *vsi_node; + + /* context for per-txq sysctls */ + struct sysctl_ctx_list txqs_ctx; + struct sysctl_oid *txqs_node; + + /* context for per-rxq sysctls */ + struct sysctl_ctx_list rxqs_ctx; + struct sysctl_oid *rxqs_node; +#endif + /* VSI-level stats */ + struct ice_vsi_hw_stats hw_stats; + + /* VSI mirroring details */ + uint16_t mirror_src_vsi; + uint16_t rule_mir_ingress; + uint16_t rule_mir_egress; +}; + +/* Driver always calls main vsi_handle first */ +#define ICE_MAIN_VSI_HANDLE 0 diff --git a/sys/dev/pci/if_iwx.c b/sys/dev/pci/if_iwx.c index f3c693a83..6ff1a1316 100644 --- a/sys/dev/pci/if_iwx.c +++ b/sys/dev/pci/if_iwx.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_iwx.c,v 1.187 2024/06/26 01:40:49 jsg Exp $ */ +/* $OpenBSD: if_iwx.c,v 1.188 2024/11/08 09:12:46 kettenis Exp $ */ /* * Copyright (c) 2014, 2016 genua gmbh @@ -409,7 +409,9 @@ int iwx_power_update_device(struct iwx_softc *); int iwx_enable_beacon_filter(struct iwx_softc *, struct iwx_node *); int iwx_disable_beacon_filter(struct iwx_softc *); int iwx_add_sta_cmd(struct iwx_softc *, struct iwx_node *, int); +int iwx_mld_add_sta_cmd(struct iwx_softc *, struct iwx_node *, int); int iwx_rm_sta_cmd(struct iwx_softc *, struct iwx_node *); +int iwx_mld_rm_sta_cmd(struct iwx_softc *, struct iwx_node *); int iwx_rm_sta(struct iwx_softc *, struct iwx_node *); int iwx_fill_probe_req(struct iwx_softc *, struct iwx_scan_probe_req *); int iwx_config_umac_scan_reduced(struct iwx_softc *); @@ -430,6 +432,8 @@ void iwx_mac_ctxt_cmd_common(struct iwx_softc *, struct iwx_node *, void iwx_mac_ctxt_cmd_fill_sta(struct iwx_softc *, struct iwx_node *, struct iwx_mac_data_sta *, int); int iwx_mac_ctxt_cmd(struct iwx_softc *, struct iwx_node *, uint32_t, int); +int iwx_mld_mac_ctxt_cmd(struct iwx_softc *, struct iwx_node *, uint32_t, + int); int iwx_clear_statistics(struct iwx_softc *); void iwx_add_task(struct iwx_softc *, struct taskq *, struct task *); void iwx_del_task(struct iwx_softc *, struct taskq *, struct task *); @@ -2717,6 +2721,8 @@ iwx_stop_device(struct iwx_softc *sc) iwx_ctxt_info_free_paging(sc); iwx_dma_contig_free(&sc->pnvm_dma); + for (i = 0; i < sc->pnvm_segs; i++) + iwx_dma_contig_free(&sc->pnvm_seg_dma[i]); } void @@ -4033,6 +4039,70 @@ iwx_start_fw(struct iwx_softc *sc) return iwx_load_firmware(sc); } +int +iwx_pnvm_setup_fragmented(struct iwx_softc *sc, uint8_t **pnvm_data, + size_t *pnvm_size, int pnvm_segs) +{ + struct iwx_pnvm_info_dram *pnvm_info; + int i, err; + + err = iwx_dma_contig_alloc(sc->sc_dmat, &sc->pnvm_dma, + sizeof(struct iwx_pnvm_info_dram), 0); + if (err) + return err; + pnvm_info = (struct iwx_pnvm_info_dram *)sc->pnvm_dma.vaddr; + + for (i = 0; i < pnvm_segs; i++) { + err = iwx_dma_contig_alloc(sc->sc_dmat, &sc->pnvm_seg_dma[i], + pnvm_size[i], 0); + if (err) + goto fail; + memcpy(sc->pnvm_seg_dma[i].vaddr, pnvm_data[i], pnvm_size[i]); + pnvm_info->pnvm_img[i] = htole64(sc->pnvm_seg_dma[i].paddr); + sc->pnvm_size += pnvm_size[i]; + sc->pnvm_segs++; + } + + return 0; + +fail: + for (i = 0; i < pnvm_segs; i++) + iwx_dma_contig_free(&sc->pnvm_seg_dma[i]); + sc->pnvm_size = 0; + sc->pnvm_segs = 0; + iwx_dma_contig_free(&sc->pnvm_dma); + + return err; +} + +int +iwx_pnvm_setup(struct iwx_softc *sc, uint8_t **pnvm_data, + size_t *pnvm_size, int pnvm_segs) +{ + uint8_t *data; + size_t size = 0; + int i, err; + + if (isset(sc->sc_enabled_capa, IWX_UCODE_TLV_CAPA_FRAGMENTED_PNVM_IMG)) + return iwx_pnvm_setup_fragmented(sc, pnvm_data, pnvm_size, pnvm_segs); + + for (i = 0; i < pnvm_segs; i++) + size += pnvm_size[i]; + + err = iwx_dma_contig_alloc(sc->sc_dmat, &sc->pnvm_dma, size, 0); + if (err) + return err; + + data = sc->pnvm_dma.vaddr; + for (i = 0; i < pnvm_segs; i++) { + memcpy(data, pnvm_data[i], pnvm_size[i]); + data += pnvm_size[i]; + } + sc->pnvm_size = size; + + return 0; +} + int iwx_pnvm_handle_section(struct iwx_softc *sc, const uint8_t *data, size_t len) @@ -4040,10 +4110,13 @@ iwx_pnvm_handle_section(struct iwx_softc *sc, const uint8_t *data, const struct iwx_ucode_tlv *tlv; uint32_t sha1 = 0; uint16_t mac_type = 0, rf_id = 0; - uint8_t *pnvm_data = NULL, *tmp; + uint8_t *pnvm_data[IWX_MAX_DRAM_ENTRY]; + size_t pnvm_size[IWX_MAX_DRAM_ENTRY]; + int pnvm_segs = 0; int hw_match = 0; uint32_t size = 0; int err; + int i; while (len >= sizeof(*tlv)) { uint32_t tlv_len, tlv_type; @@ -4096,16 +4169,19 @@ iwx_pnvm_handle_section(struct iwx_softc *sc, const uint8_t *data, if (le32_to_cpup((const uint32_t *)data) == 0xddddeeee) break; - tmp = malloc(size + data_len, M_DEVBUF, + if (pnvm_segs >= nitems(pnvm_data)) { + err = ERANGE; + goto out; + } + + pnvm_data[pnvm_segs] = malloc(data_len, M_DEVBUF, M_WAITOK | M_CANFAIL | M_ZERO); - if (tmp == NULL) { + if (pnvm_data[pnvm_segs] == NULL) { err = ENOMEM; goto out; } - memcpy(tmp, pnvm_data, size); - memcpy(tmp + size, section->data, data_len); - free(pnvm_data, M_DEVBUF, size); - pnvm_data = tmp; + memcpy(pnvm_data[pnvm_segs], section->data, data_len); + pnvm_size[pnvm_segs++] = data_len; size += data_len; break; } @@ -4127,18 +4203,19 @@ done: goto out; } - err = iwx_dma_contig_alloc(sc->sc_dmat, &sc->pnvm_dma, size, 0); + err = iwx_pnvm_setup(sc, pnvm_data, pnvm_size, pnvm_segs); if (err) { printf("%s: could not allocate DMA memory for PNVM\n", DEVNAME(sc)); err = ENOMEM; goto out; } - memcpy(sc->pnvm_dma.vaddr, pnvm_data, size); + iwx_ctxt_info_gen3_set_pnvm(sc); sc->sc_pnvm_ver = sha1; out: - free(pnvm_data, M_DEVBUF, size); + for (i = 0; i < pnvm_segs; i++) + free(pnvm_data[i], M_DEVBUF, pnvm_size[i]); return err; } @@ -4186,15 +4263,19 @@ iwx_ctxt_info_gen3_set_pnvm(struct iwx_softc *sc) { struct iwx_prph_scratch *prph_scratch; struct iwx_prph_scratch_ctrl_cfg *prph_sc_ctrl; + int i; prph_scratch = sc->prph_scratch_dma.vaddr; prph_sc_ctrl = &prph_scratch->ctrl_cfg; prph_sc_ctrl->pnvm_cfg.pnvm_base_addr = htole64(sc->pnvm_dma.paddr); - prph_sc_ctrl->pnvm_cfg.pnvm_size = htole32(sc->pnvm_dma.size); + prph_sc_ctrl->pnvm_cfg.pnvm_size = htole32(sc->pnvm_size); - bus_dmamap_sync(sc->sc_dmat, sc->pnvm_dma.map, 0, sc->pnvm_dma.size, - BUS_DMASYNC_PREWRITE); + bus_dmamap_sync(sc->sc_dmat, sc->pnvm_dma.map, 0, + sc->pnvm_dma.size, BUS_DMASYNC_PREWRITE); + for (i = 0; i < sc->pnvm_segs; i++) + bus_dmamap_sync(sc->sc_dmat, sc->pnvm_seg_dma[i].map, 0, + sc->pnvm_seg_dma[i].size, BUS_DMASYNC_PREWRITE); } /* @@ -4392,6 +4473,16 @@ iwx_run_init_mvm_ucode(struct iwx_softc *sc, int readnvm) sc->sc_nvm.hw_addr); } + + /* + * Only enable the MLD API on MA devices for now as the API 77 + * firmware on some of the older firmware devices also claims + * support, but doesn't actually work. + */ + if (isset(sc->sc_enabled_capa, IWX_UCODE_TLV_CAPA_MLD_API_SUPPORT) && + IWX_CSR_HW_REV_TYPE(sc->sc_hw_rev) == IWX_CFG_MAC_TYPE_MA) + sc->sc_use_mld_api = 1; + return 0; } @@ -5508,6 +5599,10 @@ iwx_binding_cmd(struct iwx_softc *sc, struct iwx_node *in, uint32_t action) int i, err, active = (sc->sc_flags & IWX_FLAG_BINDING_ACTIVE); uint32_t status; + /* No need to bind with MLD firmware. */ + if (sc->sc_use_mld_api) + return 0; + if (action == IWX_FW_CTXT_ACTION_ADD && active) panic("binding already added"); if (action == IWX_FW_CTXT_ACTION_REMOVE && !active) @@ -6428,6 +6523,10 @@ iwx_drain_sta(struct iwx_softc *sc, struct iwx_node* in, int drain) int err; uint32_t status; + /* No need to drain with MLD firmware. */ + if (sc->sc_use_mld_api) + return 0; + memset(&cmd, 0, sizeof(cmd)); cmd.mac_id_n_color = htole32(IWX_FW_CMD_ID_AND_COLOR(in->in_id, in->in_color)); @@ -6619,6 +6718,9 @@ iwx_add_sta_cmd(struct iwx_softc *sc, struct iwx_node *in, int update) if (!update && (sc->sc_flags & IWX_FLAG_STA_ACTIVE)) panic("STA already added"); + if (sc->sc_use_mld_api) + return iwx_mld_add_sta_cmd(sc, in, update); + memset(&add_sta_cmd, 0, sizeof(add_sta_cmd)); if (ic->ic_opmode == IEEE80211_M_MONITOR) { @@ -6724,6 +6826,170 @@ iwx_add_sta_cmd(struct iwx_softc *sc, struct iwx_node *in, int update) return err; } +void +iwx_mld_modify_link_fill(struct iwx_softc *sc, struct iwx_node *in, + struct iwx_link_config_cmd *cmd, int changes, int active) +{ +#define IWX_EXP2(x) ((1 << (x)) - 1) /* CWmin = 2^ECWmin - 1 */ + struct ieee80211com *ic = &sc->sc_ic; + struct ieee80211_node *ni = &in->in_ni; + int cck_ack_rates, ofdm_ack_rates; + int i; + + cmd->link_id = htole32(0); + cmd->mac_id = htole32(in->in_id); + KASSERT(in->in_phyctxt); + cmd->phy_id = htole32(in->in_phyctxt->id); + IEEE80211_ADDR_COPY(cmd->local_link_addr, ic->ic_myaddr); + cmd->active = htole32(active); + + iwx_ack_rates(sc, in, &cck_ack_rates, &ofdm_ack_rates); + cmd->cck_rates = htole32(cck_ack_rates); + cmd->ofdm_rates = htole32(ofdm_ack_rates); + cmd->cck_short_preamble + = htole32((ic->ic_flags & IEEE80211_F_SHPREAMBLE) ? 1 : 0); + cmd->short_slot + = htole32((ic->ic_flags & IEEE80211_F_SHSLOT) ? 1 : 0); + + for (i = 0; i < EDCA_NUM_AC; i++) { + struct ieee80211_edca_ac_params *ac = &ic->ic_edca_ac[i]; + int txf = iwx_ac_to_tx_fifo[i]; + + cmd->ac[txf].cw_min = htole16(IWX_EXP2(ac->ac_ecwmin)); + cmd->ac[txf].cw_max = htole16(IWX_EXP2(ac->ac_ecwmax)); + cmd->ac[txf].aifsn = ac->ac_aifsn; + cmd->ac[txf].fifos_mask = (1 << txf); + cmd->ac[txf].edca_txop = htole16(ac->ac_txoplimit * 32); + } + if (ni->ni_flags & IEEE80211_NODE_QOS) + cmd->qos_flags |= htole32(IWX_MAC_QOS_FLG_UPDATE_EDCA); + + if (ni->ni_flags & IEEE80211_NODE_HT) { + enum ieee80211_htprot htprot = + (ni->ni_htop1 & IEEE80211_HTOP1_PROT_MASK); + switch (htprot) { + case IEEE80211_HTPROT_NONE: + break; + case IEEE80211_HTPROT_NONMEMBER: + case IEEE80211_HTPROT_NONHT_MIXED: + cmd->protection_flags |= + htole32(IWX_LINK_PROT_FLG_HT_PROT | + IWX_LINK_PROT_FLG_FAT_PROT); + break; + case IEEE80211_HTPROT_20MHZ: + if (in->in_phyctxt && + (in->in_phyctxt->sco == IEEE80211_HTOP0_SCO_SCA || + in->in_phyctxt->sco == IEEE80211_HTOP0_SCO_SCB)) { + cmd->protection_flags |= + htole32(IWX_LINK_PROT_FLG_HT_PROT | + IWX_LINK_PROT_FLG_FAT_PROT); + } + break; + default: + break; + } + + cmd->qos_flags |= htole32(IWX_MAC_QOS_FLG_TGN); + } + if (ic->ic_flags & IEEE80211_F_USEPROT) + cmd->protection_flags |= htole32(IWX_LINK_PROT_FLG_TGG_PROTECT); + + cmd->bi = htole32(ni->ni_intval); + cmd->dtim_interval = htole32(ni->ni_intval * ni->ni_dtimperiod); + + cmd->modify_mask = htole32(changes); + cmd->flags = 0; + cmd->flags_mask = 0; + cmd->spec_link_id = 0; + cmd->listen_lmac = 0; + cmd->action = IWX_FW_CTXT_ACTION_MODIFY; +#undef IWX_EXP2 +} + +int +iwx_mld_add_sta_cmd(struct iwx_softc *sc, struct iwx_node *in, int update) +{ + struct ieee80211com *ic = &sc->sc_ic; + struct iwx_link_config_cmd link_cmd; + struct iwx_mvm_sta_cfg_cmd sta_cmd; + uint32_t aggsize; + const uint32_t max_aggsize = (IWX_STA_FLG_MAX_AGG_SIZE_64K >> + IWX_STA_FLG_MAX_AGG_SIZE_SHIFT); + int err, changes; + + if (!update) { + memset(&link_cmd, 0, sizeof(link_cmd)); + link_cmd.link_id = htole32(0); + link_cmd.mac_id = htole32(in->in_id); + link_cmd.spec_link_id = 0; + if (in->in_phyctxt) + link_cmd.phy_id = htole32(in->in_phyctxt->id); + else + link_cmd.phy_id = htole32(IWX_FW_CTXT_INVALID); + IEEE80211_ADDR_COPY(link_cmd.local_link_addr, ic->ic_myaddr); + link_cmd.listen_lmac = 0; + link_cmd.action = IWX_FW_CTXT_ACTION_ADD; + + err = iwx_send_cmd_pdu(sc, + IWX_WIDE_ID(IWX_MAC_CONF_GROUP, IWX_LINK_CONFIG_CMD), + 0, sizeof(link_cmd), &link_cmd); + if (err) + return err; + } + + changes = IWX_LINK_CONTEXT_MODIFY_ACTIVE; + changes |= IWX_LINK_CONTEXT_MODIFY_RATES_INFO; + if (update) { + changes |= IWX_LINK_CONTEXT_MODIFY_PROTECT_FLAGS; + changes |= IWX_LINK_CONTEXT_MODIFY_QOS_PARAMS; + changes |= IWX_LINK_CONTEXT_MODIFY_BEACON_TIMING; + } + + memset(&link_cmd, 0, sizeof(link_cmd)); + iwx_mld_modify_link_fill(sc, in, &link_cmd, changes, 1); + err = iwx_send_cmd_pdu(sc, + IWX_WIDE_ID(IWX_MAC_CONF_GROUP, IWX_LINK_CONFIG_CMD), + 0, sizeof(link_cmd), &link_cmd); + if (err) + return err; + + memset(&sta_cmd, 0, sizeof(sta_cmd)); + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + sta_cmd.sta_id = htole32(IWX_MONITOR_STA_ID); + sta_cmd.station_type = htole32(IWX_STA_GENERAL_PURPOSE); + } else { + sta_cmd.sta_id = htole32(IWX_STATION_ID); + sta_cmd.station_type = htole32(IWX_STA_LINK); + } + sta_cmd.link_id = htole32(0); + IEEE80211_ADDR_COPY(sta_cmd.peer_mld_address, in->in_macaddr); + IEEE80211_ADDR_COPY(sta_cmd.peer_link_address, in->in_macaddr); + sta_cmd.assoc_id = htole32(in->in_ni.ni_associd); + + if (in->in_ni.ni_flags & IEEE80211_NODE_HT) { + if (iwx_mimo_enabled(sc)) + sta_cmd.mimo = htole32(1); + + if (in->in_ni.ni_flags & IEEE80211_NODE_VHT) { + aggsize = (in->in_ni.ni_vhtcaps & + IEEE80211_VHTCAP_MAX_AMPDU_LEN_MASK) >> + IEEE80211_VHTCAP_MAX_AMPDU_LEN_SHIFT; + } else { + aggsize = (in->in_ni.ni_ampdu_param & + IEEE80211_AMPDU_PARAM_LE); + } + if (aggsize > max_aggsize) + aggsize = max_aggsize; + + sta_cmd.tx_ampdu_spacing = htole32(0); + sta_cmd.tx_ampdu_max_size = aggsize; + } + + return iwx_send_cmd_pdu(sc, + IWX_WIDE_ID(IWX_MAC_CONF_GROUP, IWX_STA_CONFIG_CMD), + 0, sizeof(sta_cmd), &sta_cmd); +} + int iwx_rm_sta_cmd(struct iwx_softc *sc, struct iwx_node *in) { @@ -6734,6 +7000,9 @@ iwx_rm_sta_cmd(struct iwx_softc *sc, struct iwx_node *in) if ((sc->sc_flags & IWX_FLAG_STA_ACTIVE) == 0) panic("sta already removed"); + if (sc->sc_use_mld_api) + return iwx_mld_rm_sta_cmd(sc, in); + memset(&rm_sta_cmd, 0, sizeof(rm_sta_cmd)); if (ic->ic_opmode == IEEE80211_M_MONITOR) rm_sta_cmd.sta_id = IWX_MONITOR_STA_ID; @@ -6813,6 +7082,41 @@ iwx_rm_sta(struct iwx_softc *sc, struct iwx_node *in) return 0; } +int +iwx_mld_rm_sta_cmd(struct iwx_softc *sc, struct iwx_node *in) +{ + struct iwx_mvm_remove_sta_cmd sta_cmd; + struct iwx_link_config_cmd link_cmd; + int err; + + memset(&sta_cmd, 0, sizeof(sta_cmd)); + sta_cmd.sta_id = htole32(IWX_STATION_ID); + + err = iwx_send_cmd_pdu(sc, + IWX_WIDE_ID(IWX_MAC_CONF_GROUP, IWX_STA_REMOVE_CMD), + 0, sizeof(sta_cmd), &sta_cmd); + if (err) + return err; + + memset(&link_cmd, 0, sizeof(link_cmd)); + iwx_mld_modify_link_fill(sc, in, &link_cmd, + IWX_LINK_CONTEXT_MODIFY_ACTIVE, 0); + err = iwx_send_cmd_pdu(sc, + IWX_WIDE_ID(IWX_MAC_CONF_GROUP, IWX_LINK_CONFIG_CMD), + 0, sizeof(link_cmd), &link_cmd); + if (err) + return err; + + memset(&link_cmd, 0, sizeof(link_cmd)); + link_cmd.link_id = htole32(0); + link_cmd.spec_link_id = 0; + link_cmd.action = IWX_FW_CTXT_ACTION_REMOVE; + + return iwx_send_cmd_pdu(sc, + IWX_WIDE_ID(IWX_MAC_CONF_GROUP, IWX_LINK_CONFIG_CMD), + 0, sizeof(link_cmd), &link_cmd); +} + uint8_t iwx_umac_scan_fill_channels(struct iwx_softc *sc, struct iwx_scan_channel_cfg_umac *chan, size_t chan_nitems, @@ -7424,6 +7728,9 @@ iwx_mac_ctxt_cmd(struct iwx_softc *sc, struct iwx_node *in, uint32_t action, if (action == IWX_FW_CTXT_ACTION_REMOVE && !active) panic("MAC already removed"); + if (sc->sc_use_mld_api) + return iwx_mld_mac_ctxt_cmd(sc, in, action, assoc); + memset(&cmd, 0, sizeof(cmd)); iwx_mac_ctxt_cmd_common(sc, in, &cmd, action); @@ -7451,6 +7758,53 @@ iwx_mac_ctxt_cmd(struct iwx_softc *sc, struct iwx_node *in, uint32_t action, return iwx_send_cmd_pdu(sc, IWX_MAC_CONTEXT_CMD, 0, sizeof(cmd), &cmd); } +int +iwx_mld_mac_ctxt_cmd(struct iwx_softc *sc, struct iwx_node *in, + uint32_t action, int assoc) +{ + struct ieee80211com *ic = &sc->sc_ic; + struct ieee80211_node *ni = &in->in_ni; + struct iwx_mac_config_cmd cmd; + + memset(&cmd, 0, sizeof(cmd)); + cmd.id_and_color = htole32(in->in_id); + cmd.action = htole32(action); + + if (action == IWX_FW_CTXT_ACTION_REMOVE) { + return iwx_send_cmd_pdu(sc, + IWX_WIDE_ID(IWX_MAC_CONF_GROUP, IWX_MAC_CONFIG_CMD), + 0, sizeof(cmd), &cmd); + } + + if (ic->ic_opmode == IEEE80211_M_MONITOR) + cmd.mac_type = htole32(IWX_FW_MAC_TYPE_LISTENER); + else if (ic->ic_opmode == IEEE80211_M_STA) + cmd.mac_type = htole32(IWX_FW_MAC_TYPE_BSS_STA); + else + panic("unsupported operating mode %d", ic->ic_opmode); + IEEE80211_ADDR_COPY(cmd.local_mld_addr, ic->ic_myaddr); + cmd.client.assoc_id = htole32(ni->ni_associd); + + cmd.filter_flags = htole32(IWX_MAC_CFG_FILTER_ACCEPT_GRP); + if (ic->ic_opmode == IEEE80211_M_MONITOR) { + cmd.filter_flags |= htole32(IWX_MAC_CFG_FILTER_PROMISC | + IWX_MAC_FILTER_IN_CONTROL_AND_MGMT | + IWX_MAC_CFG_FILTER_ACCEPT_BEACON | + IWX_MAC_CFG_FILTER_ACCEPT_PROBE_REQ | + IWX_MAC_CFG_FILTER_ACCEPT_GRP); + } else if (!assoc || !ni->ni_associd || !ni->ni_dtimperiod) { + /* + * Allow beacons to pass through as long as we are not + * associated or we do not have dtim period information. + */ + cmd.filter_flags |= htole32(IWX_MAC_CFG_FILTER_ACCEPT_BEACON); + } + + return iwx_send_cmd_pdu(sc, + IWX_WIDE_ID(IWX_MAC_CONF_GROUP, IWX_MAC_CONFIG_CMD), + 0, sizeof(cmd), &cmd); +} + int iwx_clear_statistics(struct iwx_softc *sc) { @@ -8433,23 +8787,46 @@ iwx_set_key(struct ieee80211com *ic, struct ieee80211_node *ni, } int -iwx_add_sta_key(struct iwx_softc *sc, int sta_id, struct ieee80211_node *ni, - struct ieee80211_key *k) +iwx_mld_add_sta_key_cmd(struct iwx_softc *sc, int sta_id, + struct ieee80211_node *ni, struct ieee80211_key *k) { struct ieee80211com *ic = &sc->sc_ic; - struct iwx_node *in = (void *)ni; - struct iwx_add_sta_key_cmd cmd; - uint32_t status; - const int want_keymask = (IWX_NODE_FLAG_HAVE_PAIRWISE_KEY | - IWX_NODE_FLAG_HAVE_GROUP_KEY); + struct iwx_sec_key_cmd cmd; + uint32_t flags = IWX_SEC_KEY_FLAG_CIPHER_CCMP; int err; - /* - * Keys are stored in 'ni' so 'k' is valid if 'ni' is valid. - * Currently we only implement station mode where 'ni' is always - * ic->ic_bss so there is no need to validate arguments beyond this: - */ - KASSERT(ni == ic->ic_bss); + if (k->k_flags & IEEE80211_KEY_GROUP) + flags |= IWX_SEC_KEY_FLAG_MCAST_KEY; + + memset(&cmd, 0, sizeof(cmd)); + cmd.u.add.sta_mask = htole32(1 << sta_id); + cmd.u.add.key_id = htole32(k->k_id); + cmd.u.add.key_flags = htole32(flags); + cmd.u.add.tx_seq = htole64(k->k_tsc); + memcpy(cmd.u.add.key, k->k_key, k->k_len); + cmd.action = IWX_FW_CTXT_ACTION_ADD; + + err = iwx_send_cmd_pdu(sc, + IWX_WIDE_ID(IWX_DATA_PATH_GROUP, IWX_SEC_KEY_CMD), + 0, sizeof(cmd), &cmd); + if (err) { + IEEE80211_SEND_MGMT(ic, ni, IEEE80211_FC0_SUBTYPE_DEAUTH, + IEEE80211_REASON_AUTH_LEAVE); + ieee80211_new_state(ic, IEEE80211_S_SCAN, -1); + return err; + } + + return 0; +} + +int +iwx_add_sta_key_cmd(struct iwx_softc *sc, int sta_id, + struct ieee80211_node *ni, struct ieee80211_key *k) +{ + struct ieee80211com *ic = &sc->sc_ic; + struct iwx_add_sta_key_cmd cmd; + uint32_t status; + int err; memset(&cmd, 0, sizeof(cmd)); @@ -8482,6 +8859,36 @@ iwx_add_sta_key(struct iwx_softc *sc, int sta_id, struct ieee80211_node *ni, return err; } + return 0; +} + +int +iwx_add_sta_key(struct iwx_softc *sc, int sta_id, struct ieee80211_node *ni, + struct ieee80211_key *k) +{ + struct ieee80211com *ic = &sc->sc_ic; + struct iwx_node *in = (void *)ni; + const int want_keymask = (IWX_NODE_FLAG_HAVE_PAIRWISE_KEY | + IWX_NODE_FLAG_HAVE_GROUP_KEY); + uint8_t sec_key_ver; + int err; + + /* + * Keys are stored in 'ni' so 'k' is valid if 'ni' is valid. + * Currently we only implement station mode where 'ni' is always + * ic->ic_bss so there is no need to validate arguments beyond this: + */ + KASSERT(ni == ic->ic_bss); + + sec_key_ver = iwx_lookup_cmd_ver(sc, IWX_DATA_PATH_GROUP, + IWX_SEC_KEY_CMD); + if (sec_key_ver != 0 && sec_key_ver != IWX_FW_CMD_VER_UNKNOWN) + err = iwx_mld_add_sta_key_cmd(sc, sta_id, ni, k); + else + err = iwx_add_sta_key_cmd(sc, sta_id, ni, k); + if (err) + return err; + if (k->k_flags & IEEE80211_KEY_GROUP) in->in_flags |= IWX_NODE_FLAG_HAVE_GROUP_KEY; else @@ -9926,8 +10333,18 @@ iwx_rx_pkt(struct iwx_softc *sc, struct iwx_rx_data *data, struct mbuf_list *ml) IWX_SCD_QUEUE_CONFIG_CMD): case IWX_WIDE_ID(IWX_DATA_PATH_GROUP, IWX_RX_BAID_ALLOCATION_CONFIG_CMD): + case IWX_WIDE_ID(IWX_DATA_PATH_GROUP, + IWX_SEC_KEY_CMD): case IWX_WIDE_ID(IWX_MAC_CONF_GROUP, IWX_SESSION_PROTECTION_CMD): + case IWX_WIDE_ID(IWX_MAC_CONF_GROUP, + IWX_MAC_CONFIG_CMD): + case IWX_WIDE_ID(IWX_MAC_CONF_GROUP, + IWX_LINK_CONFIG_CMD): + case IWX_WIDE_ID(IWX_MAC_CONF_GROUP, + IWX_STA_CONFIG_CMD): + case IWX_WIDE_ID(IWX_MAC_CONF_GROUP, + IWX_STA_REMOVE_CMD): case IWX_WIDE_ID(IWX_REGULATORY_AND_NVM_GROUP, IWX_NVM_GET_INFO): case IWX_ADD_STA_KEY: @@ -10399,7 +10816,7 @@ static const struct pci_matchid iwx_devices[] = { { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_22500_11,}, { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_22500_12,}, { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_22500_13,}, - /* _14 is an MA device, not yet supported */ + { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_22500_14,}, { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_22500_15,}, { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_22500_16,}, { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_22500_17,}, @@ -10528,6 +10945,10 @@ static const struct iwx_dev_info iwx_dev_info_table[] = { IWX_DEV_INFO(0x7f70, 0x1671, iwx_2ax_cfg_so_gf_a0), /* killer_1675s */ IWX_DEV_INFO(0x7f70, 0x1672, iwx_2ax_cfg_so_gf_a0), /* killer_1675i */ + /* MA with GF2 */ + IWX_DEV_INFO(0x7e40, 0x1671, iwx_cfg_ma_b0_gf_a0), /* killer_1675s */ + IWX_DEV_INFO(0x7e40, 0x1672, iwx_cfg_ma_b0_gf_a0), /* killer_1675i */ + /* Qu with Jf, C step */ _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY, IWX_CFG_MAC_TYPE_QU, IWX_SILICON_C_STEP, @@ -10772,6 +11193,28 @@ static const struct iwx_dev_info iwx_dev_info_table[] = { IWX_CFG_RF_TYPE_JF1, IWX_CFG_RF_ID_JF1_DIV, IWX_CFG_NO_160, IWX_CFG_CORES_BT, IWX_CFG_NO_CDB, IWX_CFG_ANY, iwx_2ax_cfg_so_jf_b0), /* 9462 */ + + /* Ma */ + _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY, + IWX_CFG_MAC_TYPE_MA, IWX_CFG_ANY, + IWX_CFG_RF_TYPE_HR2, IWX_CFG_ANY, + IWX_CFG_ANY, IWX_CFG_ANY, IWX_CFG_NO_CDB, + IWX_CFG_ANY, iwx_cfg_ma_b0_hr_b0), /* ax201 */ + _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY, + IWX_CFG_MAC_TYPE_MA, IWX_CFG_ANY, + IWX_CFG_RF_TYPE_GF, IWX_CFG_ANY, + IWX_CFG_ANY, IWX_CFG_ANY, IWX_CFG_NO_CDB, + IWX_CFG_ANY, iwx_cfg_ma_b0_gf_a0), /* ax211 */ + _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY, + IWX_CFG_MAC_TYPE_MA, IWX_CFG_ANY, + IWX_CFG_RF_TYPE_GF, IWX_CFG_ANY, + IWX_CFG_ANY, IWX_CFG_ANY, IWX_CFG_CDB, + IWX_CFG_ANY, iwx_cfg_ma_b0_gf4_a0), /* ax211 */ + _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY, + IWX_CFG_MAC_TYPE_MA, IWX_CFG_ANY, + IWX_CFG_RF_TYPE_FM, IWX_CFG_ANY, + IWX_CFG_ANY, IWX_CFG_ANY, IWX_CFG_NO_CDB, + IWX_CFG_ANY, iwx_cfg_ma_a0_fm_a0), /* ax231 */ }; int @@ -11098,7 +11541,6 @@ iwx_attach(struct device *parent, struct device *self, void *aux) case PCI_PRODUCT_INTEL_WL_22500_10: case PCI_PRODUCT_INTEL_WL_22500_11: case PCI_PRODUCT_INTEL_WL_22500_13: - /* _14 is an MA device, not yet supported */ case PCI_PRODUCT_INTEL_WL_22500_15: case PCI_PRODUCT_INTEL_WL_22500_16: sc->sc_fwname = IWX_SO_A_GF_A_FW; @@ -11124,6 +11566,17 @@ iwx_attach(struct device *parent, struct device *self, void *aux) sc->sc_uhb_supported = 0; sc->sc_imr_enabled = 1; break; + case PCI_PRODUCT_INTEL_WL_22500_14: + sc->sc_fwname = IWX_MA_B_GF_A_FW; + sc->sc_pnvm_name = IWX_MA_B_GF_A_PNVM; + sc->sc_device_family = IWX_DEVICE_FAMILY_AX210; + sc->sc_integrated = 1; + sc->sc_ltr_delay = IWX_SOC_FLAGS_LTR_APPLY_DELAY_NONE; + sc->sc_low_latency_xtal = 0; + sc->sc_xtal_latency = 0; + sc->sc_tx_with_siso_diversity = 0; + sc->sc_uhb_supported = 1; + break; default: printf("%s: unknown adapter type\n", DEVNAME(sc)); return; diff --git a/sys/dev/pci/if_iwxreg.h b/sys/dev/pci/if_iwxreg.h index aea79ce96..968f7dea6 100644 --- a/sys/dev/pci/if_iwxreg.h +++ b/sys/dev/pci/if_iwxreg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: if_iwxreg.h,v 1.53 2024/05/08 14:03:54 stsp Exp $ */ +/* $OpenBSD: if_iwxreg.h,v 1.55 2024/11/08 09:12:46 kettenis Exp $ */ /*- * Based on BSD-licensed source modules in the Linux iwlwifi driver, @@ -141,6 +141,10 @@ struct iwx_context_info_dram { uint64_t virtual_img[IWX_MAX_DRAM_ENTRY]; } __packed; +struct iwx_pnvm_info_dram { + uint64_t pnvm_img[IWX_MAX_DRAM_ENTRY]; +} __packed; + /* * struct iwx_context_info_rbd_cfg - RBDs configuration * @free_rbd_addr: default queue free RB CB base address @@ -1363,6 +1367,7 @@ enum msix_ivar_for_cause { #define IWX_UCODE_TLV_CAPA_LAR_MULTI_MCC 29 #define IWX_UCODE_TLV_CAPA_BT_COEX_RRC 30 #define IWX_UCODE_TLV_CAPA_GSCAN_SUPPORT 31 +#define IWX_UCODE_TLV_CAPA_FRAGMENTED_PNVM_IMG 32 #define IWX_UCODE_TLV_CAPA_NAN_SUPPORT 34 #define IWX_UCODE_TLV_CAPA_UMAC_UPLOAD 35 #define IWM_UCODE_TLV_CAPA_SOC_LATENCY_SUPPORT 37 @@ -1414,6 +1419,7 @@ enum msix_ivar_for_cause { #define IWX_UCODE_TLV_CAPA_MLME_OFFLOAD 96 #define IWX_UCODE_TLV_CAPA_BIGTK_SUPPORT 100 #define IWX_UCODE_TLV_CAPA_RFIM_SUPPORT 102 +#define IWX_UCODE_TLV_CAPA_MLD_API_SUPPORT 110 #define IWX_NUM_UCODE_TLV_CAPA 128 @@ -2001,6 +2007,10 @@ struct iwx_tx_queue_cfg_rsp { /* MAC_CONF group subcommand IDs */ #define IWX_SESSION_PROTECTION_CMD 0x05 +#define IWX_MAC_CONFIG_CMD 0x08 +#define IWX_LINK_CONFIG_CMD 0x09 +#define IWX_STA_CONFIG_CMD 0x0a +#define IWX_STA_REMOVE_CMD 0x0c #define IWX_SESSION_PROTECTION_NOTIF 0xfb /* DATA_PATH group subcommand IDs */ @@ -2009,6 +2019,7 @@ struct iwx_tx_queue_cfg_rsp { #define IWX_TLC_MNG_CONFIG_CMD 0x0f #define IWX_RX_BAID_ALLOCATION_CONFIG_CMD 0x16 #define IWX_SCD_QUEUE_CONFIG_CMD 0x17 +#define IWX_SEC_KEY_CMD 0x18 #define IWX_RX_NO_DATA_NOTIF 0xf5 #define IWX_THERMAL_DUAL_CHAIN_REQUEST 0xf6 #define IWX_TLC_MNG_UPDATE_NOTIF 0xf7 @@ -2016,7 +2027,6 @@ struct iwx_tx_queue_cfg_rsp { /* REGULATORY_AND_NVM group subcommand IDs */ #define IWX_NVM_ACCESS_COMPLETE 0x00 #define IWX_NVM_GET_INFO 0x02 -#define IWX_NVM_GET_INFO 0x02 #define IWX_PNVM_INIT_COMPLETE 0xfe /* @@ -4509,6 +4519,404 @@ struct iwx_mac_ctx_cmd { }; } __packed; /* IWX_MAC_CONTEXT_CMD_API_S_VER_1 */ +/** + * struct iwx_mac_client_data - configuration data for client MAC context + * + * @is_assoc: 1 for associated state, 0 otherwise + * @esr_transition_timeout: the timeout required by the AP for the eSR transition. + * Available only from version 2 of the command. + * This values comes from the EMLSR transition delay in the EML Capabilities + * subfield. + * @medium_sync_delay: the value as it appeasr in P802.11be_D2.2 Figure 9-1002j. + * @assoc_id: unique ID assigned by the AP during association + * @reserved1: alignment + * @data_policy: see &enum iwx_mac_data_policy + * @reserved2: alignment + * @ctwin: client traffic window in TU (period after TBTT when GO is present). + * 0 indicates that there is no CT window. + */ +struct iwx_mac_client_data { + uint8_t is_assoc; + uint8_t esr_transition_timeout; + uint16_t medium_sync_delay; + + uint16_t assoc_id; + uint16_t reserved1; + uint16_t data_policy; + uint16_t reserved2; + uint32_t ctwin; +} __packed; /* MAC_CONTEXT_CONFIG_CLIENT_DATA_API_S_VER_2 */ + +/** + * struct iwx_mac_p2p_dev_data - configuration data for P2P device MAC context + * + * @is_disc_extended: if set to true, P2P Device discoverability is enabled on + * other channels as well. This should be to true only in case that the + * device is discoverable and there is an active GO. Note that setting this + * field when not needed, will increase the number of interrupts and have + * effect on the platform power, as this setting opens the Rx filters on + * all macs. + */ +struct iwx_mac_p2p_dev_data { + uint32_t is_disc_extended; +} __packed; /* MAC_CONTEXT_CONFIG_P2P_DEV_DATA_API_S_VER_1 */ + +/** + * enum iwx_mac_config_filter_flags - MAC context configuration filter flags + * + * @IWX_MAC_CFG_FILTER_PROMISC: accept all data frames + * @IWX_MAC_CFG_FILTER_ACCEPT_CONTROL_AND_MGMT: pass all management and + * control frames to the host + * @IWX_MAC_CFG_FILTER_ACCEPT_GRP: accept multicast frames + * @IWX_MAC_CFG_FILTER_ACCEPT_BEACON: accept beacon frames + * @IWX_MAC_CFG_FILTER_ACCEPT_BCAST_PROBE_RESP: accept broadcast probe response + * @IWX_MAC_CFG_FILTER_ACCEPT_PROBE_REQ: accept probe requests + */ +enum iwx_mac_config_filter_flags { + IWX_MAC_CFG_FILTER_PROMISC = (1 << 0), + IWX_MAC_CFG_FILTER_ACCEPT_CONTROL_AND_MGMT = (1 << 1), + IWX_MAC_CFG_FILTER_ACCEPT_GRP = (1 << 2), + IWX_MAC_CFG_FILTER_ACCEPT_BEACON = (1 << 3), + IWX_MAC_CFG_FILTER_ACCEPT_BCAST_PROBE_RESP = (1 << 4), + IWX_MAC_CFG_FILTER_ACCEPT_PROBE_REQ = (1 << 5), +}; /* MAC_FILTER_FLAGS_MASK_E_VER_1 */ + +/** + * struct iwx_mac_config_cmd - command structure to configure MAC contexts in + * MLD API + * ( MAC_CONTEXT_CONFIG_CMD = 0x8 ) + * + * @id_and_color: ID and color of the MAC + * @action: action to perform, see &enum iwx_ctxt_action + * @mac_type: one of &enum iwx_mac_types + * @local_mld_addr: mld address + * @reserved_for_local_mld_addr: reserved + * @filter_flags: combination of &enum iwx_mac_config_filter_flags + * @he_support: does this MAC support HE + * @he_ap_support: HE AP enabled, "pseudo HE", no trigger frame handling + * @eht_support: does this MAC support EHT. Requires he_support + * @nic_not_ack_enabled: mark that the NIC doesn't support receiving + * ACK-enabled AGG, (i.e. both BACK and non-BACK frames in single AGG). + * If the NIC is not ACK_ENABLED it may use the EOF-bit in first non-0 + * len delim to determine if AGG or single. + */ +struct iwx_mac_config_cmd { + /* COMMON_INDEX_HDR_API_S_VER_1 */ + uint32_t id_and_color; + uint32_t action; + /* MAC_CONTEXT_TYPE_API_E */ + uint32_t mac_type; + uint8_t local_mld_addr[6]; + uint16_t reserved_for_local_mld_addr; + uint32_t filter_flags; + uint16_t he_support; + uint16_t he_ap_support; + uint32_t eht_support; + uint32_t nic_not_ack_enabled; + /* MAC_CONTEXT_CONFIG_SPECIFIC_DATA_API_U_VER_2 */ + union { + struct iwx_mac_client_data client; + struct iwx_mac_p2p_dev_data p2p_dev; + }; +} __packed; /* MAC_CONTEXT_CONFIG_CMD_API_S_VER_2 */ + +/** + * struct iwx_he_backoff_conf - used for backoff configuration + * Per each trigger-based AC, (set by MU EDCA Parameter set info-element) + * used for backoff configuration of TXF5..TXF8 trigger based. + * The MU-TIMER is reloaded w/ MU_TIME each time a frame from the AC is sent via + * trigger-based TX. + * @cwmin: CW min + * @cwmax: CW max + * @aifsn: AIFSN + * AIFSN=0, means that no backoff from the specified TRIG-BASED AC is + * allowed till the MU-TIMER is 0 + * @mu_time: MU time in 8TU units + */ +struct iwx_he_backoff_conf { + uint16_t cwmin; + uint16_t cwmax; + uint16_t aifsn; + uint16_t mu_time; +} __packed; /* AC_QOS_DOT11AX_API_S */ + +/** + * enum iwx_link_ctx_modify_flags - indicate to the fw what fields are being + * modified in &iwx_link_ctx_cfg_cmd + * + * @IWX_LINK_CONTEXT_MODIFY_ACTIVE: covers iwx_link_ctx_cfg_cmd::active + * @IWX_LINK_CONTEXT_MODIFY_RATES_INFO: covers iwx_link_ctx_cfg_cmd::cck_rates, + * iwx_link_ctx_cfg_cmd::ofdm_rates, + * iwx_link_ctx_cfg_cmd::cck_short_preamble, + * iwx_link_ctx_cfg_cmd::short_slot + * @IWX_LINK_CONTEXT_MODIFY_PROTECT_FLAGS: covers + * iwx_link_ctx_cfg_cmd::protection_flags + * @IWX_LINK_CONTEXT_MODIFY_QOS_PARAMS: covers iwx_link_ctx_cfg_cmd::qos_flags, + * iwx_link_ctx_cfg_cmd::ac, + * @IWX_LINK_CONTEXT_MODIFY_BEACON_TIMING: covers iwx_link_ctx_cfg_cmd::bi, + * iwx_link_ctx_cfg_cmd::dtim_interval, + * iwx_link_ctx_cfg_cmd::dtim_time, + * iwx_link_ctx_cfg_cmd::dtim_tsf, + * iwx_link_ctx_cfg_cmd::assoc_beacon_arrive_time. + * This flag can be set only once after assoc. + * @IWX_LINK_CONTEXT_MODIFY_HE_PARAMS: covers + * iwx_link_ctx_cfg_cmd::htc_trig_based_pkt_ext + * iwx_link_ctx_cfg_cmd::rand_alloc_ecwmin, + * iwx_link_ctx_cfg_cmd::rand_alloc_ecwmax, + * iwx_link_ctx_cfg_cmd::trig_based_txf, + * iwx_link_ctx_cfg_cmd::bss_color, + * iwx_link_ctx_cfg_cmd::ndp_fdbk_buff_th_exp, + * iwx_link_ctx_cfg_cmd::ref_bssid_addr + * iwx_link_ctx_cfg_cmd::bssid_index, + * iwx_link_ctx_cfg_cmd::frame_time_rts_th. + * This flag can be set any time. + * @IWX_LINK_CONTEXT_MODIFY_BSS_COLOR_DISABLE: covers + * iwx_link_ctx_cfg_cmd::bss_color_disable + * @IWX_LINK_CONTEXT_MODIFY_EHT_PARAMS: covers iwx_link_ctx_cfg_cmd::puncture_mask. + * This flag can be set only if the MAC that this link relates to has + * eht_support set to true. + * @IWX_LINK_CONTEXT_MODIFY_ALL: set all above flags + */ +enum iwx_link_ctx_modify_flags { + IWX_LINK_CONTEXT_MODIFY_ACTIVE = (1 << 0), + IWX_LINK_CONTEXT_MODIFY_RATES_INFO = (1 << 1), + IWX_LINK_CONTEXT_MODIFY_PROTECT_FLAGS = (1 << 2), + IWX_LINK_CONTEXT_MODIFY_QOS_PARAMS = (1 << 3), + IWX_LINK_CONTEXT_MODIFY_BEACON_TIMING = (1 << 4), + IWX_LINK_CONTEXT_MODIFY_HE_PARAMS = (1 << 5), + IWX_LINK_CONTEXT_MODIFY_BSS_COLOR_DISABLE = (1 << 6), + IWX_LINK_CONTEXT_MODIFY_EHT_PARAMS = (1 << 7), + IWX_LINK_CONTEXT_MODIFY_ALL = 0xff, +}; /* LINK_CONTEXT_MODIFY_MASK_E_VER_1 */ + +/** + * enum iwx_link_ctx_protection_flags - link protection flags + * @IWX_LINK_PROT_FLG_TGG_PROTECT: 11g protection when transmitting OFDM frames, + * this will require CCK RTS/CTS2self. + * RTS/CTS will protect full burst time. + * @IWX_LINK_PROT_FLG_HT_PROT: enable HT protection + * @IWX_LINK_PROT_FLG_FAT_PROT: protect 40 MHz transmissions + * @IWX_LINK_PROT_FLG_SELF_CTS_EN: allow CTS2self + */ +enum iwx_link_ctx_protection_flags { + IWX_LINK_PROT_FLG_TGG_PROTECT = (1 << 0), + IWX_LINK_PROT_FLG_HT_PROT = (1 << 1), + IWX_LINK_PROT_FLG_FAT_PROT = (1 << 2), + IWX_LINK_PROT_FLG_SELF_CTS_EN = (1 << 3), +}; /* LINK_PROTECT_FLAGS_E_VER_1 */ + +/** + * struct iwx_link_config_cmd - command structure to configure the LINK context + * in MLD API + * ( LINK_CONFIG_CMD =0x9 ) + * + * @action: action to perform, see &enum iwx_ctxt_action + * @link_id: the id of the link that this cmd configures + * @mac_id: interface ID. Relevant only if action is FW_CTXT_ACTION_ADD + * @phy_id: PHY index. Can be changed only if the link was inactive + * (and stays inactive). If the link is active (or becomes active), + * this field is ignored. + * @local_link_addr: the links MAC address. Can be changed only if the link was + * inactive (and stays inactive). If the link is active + * (or becomes active), this field is ignored. + * @reserved_for_local_link_addr: reserved + * @modify_mask: from &enum iwx_link_ctx_modify_flags, selects what to change. + * Relevant only if action is FW_CTXT_ACTION_MODIFY + * @active: indicates whether the link is active or not + * @listen_lmac: indicates whether the link should be allocated on the Listen + * Lmac or on the Main Lmac. Cannot be changed on an active Link. + * Relevant only for eSR. + * @cck_rates: basic rates available for CCK + * @ofdm_rates: basic rates available for OFDM + * @cck_short_preamble: 1 for enabling short preamble, 0 otherwise + * @short_slot: 1 for enabling short slots, 0 otherwise + * @protection_flags: combination of &enum iwx_link_ctx_protection_flags + * @qos_flags: from &enum iwx_mac_qos_flags + * @ac: one iwx_mac_qos configuration for each AC + * @htc_trig_based_pkt_ext: default PE in 4us units + * @rand_alloc_ecwmin: random CWmin = 2**ECWmin-1 + * @rand_alloc_ecwmax: random CWmax = 2**ECWmax-1 + * @ndp_fdbk_buff_th_exp: set exponent for the NDP feedback buffered threshold + * @trig_based_txf: MU EDCA Parameter set for the trigger based traffic queues + * @bi: beacon interval in TU, applicable only when associated + * @dtim_interval: DTIM interval in TU. + * Relevant only for GO, otherwise this is offloaded. + * @puncture_mask: puncture mask for EHT + * @frame_time_rts_th: HE duration RTS threshold, in units of 32us + * @flags: a combination from &enum iwx_link_ctx_flags + * @flags_mask: what of %flags have changed. Also &enum iwx_link_ctx_flags + * Below fields are for multi-bssid: + * @ref_bssid_addr: reference BSSID used by the AP + * @reserved_for_ref_bssid_addr: reserved + * @bssid_index: index of the associated VAP + * @bss_color: 11ax AP ID that is used in the HE SIG-A to mark inter BSS frame + * @spec_link_id: link_id as the AP knows it + * @reserved: alignment + * @ibss_bssid_addr: bssid for ibss + * @reserved_for_ibss_bssid_addr: reserved + * @reserved1: reserved for future use + */ +struct iwx_link_config_cmd { + uint32_t action; + uint32_t link_id; + uint32_t mac_id; + uint32_t phy_id; + uint8_t local_link_addr[6]; + uint16_t reserved_for_local_link_addr; + uint32_t modify_mask; + uint32_t active; + uint32_t listen_lmac; + uint32_t cck_rates; + uint32_t ofdm_rates; + uint32_t cck_short_preamble; + uint32_t short_slot; + uint32_t protection_flags; + /* MAC_QOS_PARAM_API_S_VER_1 */ + uint32_t qos_flags; + struct iwx_ac_qos ac[IWX_AC_NUM + 1]; + uint8_t htc_trig_based_pkt_ext; + uint8_t rand_alloc_ecwmin; + uint8_t rand_alloc_ecwmax; + uint8_t ndp_fdbk_buff_th_exp; + struct iwx_he_backoff_conf trig_based_txf[IWX_AC_NUM]; + uint32_t bi; + uint32_t dtim_interval; + uint16_t puncture_mask; + uint16_t frame_time_rts_th; + uint32_t flags; + uint32_t flags_mask; + /* The below fields are for multi-bssid */ + uint8_t ref_bssid_addr[6]; + uint16_t reserved_for_ref_bssid_addr; + uint8_t bssid_index; + uint8_t bss_color; + uint8_t spec_link_id; + uint8_t reserved; + uint8_t ibss_bssid_addr[6]; + uint16_t reserved_for_ibss_bssid_addr; + uint32_t reserved1[8]; +} __packed; /* LINK_CONTEXT_CONFIG_CMD_API_S_VER_1 */ + +#define MAX_HE_SUPP_NSS 2 +#define MAX_CHANNEL_BW_INDX_API_D_VER_2 4 +#define MAX_CHANNEL_BW_INDX_API_D_VER_3 5 + +/** + * struct iwx_he_pkt_ext_v1 - QAM thresholds + * The required PPE is set via HE Capabilities IE, per Nss x BW x MCS + * The IE is organized in the following way: + * Support for Nss x BW (or RU) matrix: + * (0=SISO, 1=MIMO2) x (0-20MHz, 1-40MHz, 2-80MHz, 3-160MHz) + * Each entry contains 2 QAM thresholds for 8us and 16us: + * 0=BPSK, 1=QPSK, 2=16QAM, 3=64QAM, 4=256QAM, 5=1024QAM, 6=RES, 7=NONE + * i.e. QAM_th1 < QAM_th2 such if TX uses QAM_tx: + * QAM_tx < QAM_th1 --> PPE=0us + * QAM_th1 <= QAM_tx < QAM_th2 --> PPE=8us + * QAM_th2 <= QAM_tx --> PPE=16us + * @pkt_ext_qam_th: QAM thresholds + * For each Nss/Bw define 2 QAM thrsholds (0..5) + * For rates below the low_th, no need for PPE + * For rates between low_th and high_th, need 8us PPE + * For rates equal or higher then the high_th, need 16us PPE + * Nss (0-siso, 1-mimo2) x BW (0-20MHz, 1-40MHz, 2-80MHz, 3-160MHz) x + * (0-low_th, 1-high_th) + */ +struct iwx_he_pkt_ext_v1 { + uint8_t pkt_ext_qam_th[MAX_HE_SUPP_NSS][MAX_CHANNEL_BW_INDX_API_D_VER_2][2]; +} __packed; /* PKT_EXT_DOT11AX_API_S_VER_1 */ + +/** + * struct iwx_he_pkt_ext_v2 - QAM thresholds + * The required PPE is set via HE Capabilities IE, per Nss x BW x MCS + * The IE is organized in the following way: + * Support for Nss x BW (or RU) matrix: + * (0=SISO, 1=MIMO2) x (0-20MHz, 1-40MHz, 2-80MHz, 3-160MHz) + * Each entry contains 2 QAM thresholds for 8us and 16us: + * 0=BPSK, 1=QPSK, 2=16QAM, 3=64QAM, 4=256QAM, 5=1024QAM, 6=RES, 7=NONE + * i.e. QAM_th1 < QAM_th2 such if TX uses QAM_tx: + * QAM_tx < QAM_th1 --> PPE=0us + * QAM_th1 <= QAM_tx < QAM_th2 --> PPE=8us + * QAM_th2 <= QAM_tx --> PPE=16us + * @pkt_ext_qam_th: QAM thresholds + * For each Nss/Bw define 2 QAM thrsholds (0..5) + * For rates below the low_th, no need for PPE + * For rates between low_th and high_th, need 8us PPE + * For rates equal or higher then the high_th, need 16us PPE + * Nss (0-siso, 1-mimo2) x + * BW (0-20MHz, 1-40MHz, 2-80MHz, 3-160MHz, 4-320MHz) x + * (0-low_th, 1-high_th) + */ +struct iwx_he_pkt_ext_v2 { + uint8_t pkt_ext_qam_th[MAX_HE_SUPP_NSS][MAX_CHANNEL_BW_INDX_API_D_VER_3][2]; +} __packed; /* PKT_EXT_DOT11AX_API_S_VER_2 */ + +/** + * struct iwx_mvm_sta_cfg_cmd - cmd structure to add a peer sta to the uCode's + * station table + * ( STA_CONFIG_CMD = 0xA ) + * + * @sta_id: index of station in uCode's station table + * @link_id: the id of the link that is used to communicate with this sta + * @peer_mld_address: the peers mld address + * @reserved_for_peer_mld_address: reserved + * @peer_link_address: the address of the link that is used to communicate + * with this sta + * @reserved_for_peer_link_address: reserved + * @station_type: type of this station. See &enum iwx_fw_sta_type + * @assoc_id: for GO only + * @beamform_flags: beam forming controls + * @mfp: indicates whether the STA uses management frame protection or not. + * @mimo: indicates whether the sta uses mimo or not + * @mimo_protection: indicates whether the sta uses mimo protection or not + * @ack_enabled: indicates that the AP supports receiving ACK- + * enabled AGG, i.e. both BACK and non-BACK frames in a single AGG + * @trig_rnd_alloc: indicates that trigger based random allocation + * is enabled according to UORA element existence + * @tx_ampdu_spacing: minimum A-MPDU spacing: + * 4 - 2us density, 5 - 4us density, 6 - 8us density, 7 - 16us density + * @tx_ampdu_max_size: maximum A-MPDU length: 0 - 8K, 1 - 16K, 2 - 32K, + * 3 - 64K, 4 - 128K, 5 - 256K, 6 - 512K, 7 - 1024K. + * @sp_length: the size of the SP in actual number of frames + * @uapsd_acs: 4 LS bits are trigger enabled ACs, 4 MS bits are the deliver + * enabled ACs. + * @pkt_ext: optional, exists according to PPE-present bit in the HE/EHT-PHY + * capa + * @htc_flags: which features are supported in HTC + */ +struct iwx_mvm_sta_cfg_cmd { + uint32_t sta_id; + uint32_t link_id; + uint8_t peer_mld_address[6]; + uint16_t reserved_for_peer_mld_address; + uint8_t peer_link_address[6]; + uint16_t reserved_for_peer_link_address; + uint32_t station_type; + uint32_t assoc_id; + uint32_t beamform_flags; + uint32_t mfp; + uint32_t mimo; + uint32_t mimo_protection; + uint32_t ack_enabled; + uint32_t trig_rnd_alloc; + uint32_t tx_ampdu_spacing; + uint32_t tx_ampdu_max_size; + uint32_t sp_length; + uint32_t uapsd_acs; + struct iwx_he_pkt_ext_v2 pkt_ext; + uint32_t htc_flags; +} __packed; /* STA_CMD_API_S_VER_1 */ + +/** + * struct iwx_mvm_remove_sta_cmd - a cmd structure to remove a sta added by + * STA_CONFIG_CMD or AUX_STA_CONFIG_CMD + * ( STA_REMOVE_CMD = 0xC ) + * + * @sta_id: index of station to remove + */ +struct iwx_mvm_remove_sta_cmd { + uint32_t sta_id; +} __packed; /* REMOVE_STA_API_S_VER_1 */ + static inline uint32_t iwx_reciprocal(uint32_t v) { if (!v) @@ -5481,6 +5889,80 @@ struct iwx_scd_queue_cfg_cmd { } __packed u; /* TX_QUEUE_CFG_CMD_OPERATION_API_U_VER_1 */ } __packed; /* TX_QUEUE_CFG_CMD_API_S_VER_3 */ +/** + * enum iwx_sec_key_flags - security key command key flags + * @IWX_SEC_KEY_FLAG_CIPHER_MASK: cipher mask + * @IWX_SEC_KEY_FLAG_CIPHER_WEP: WEP cipher + * @IWX_SEC_KEY_FLAG_CIPHER_CCMP: CCMP/CMAC cipher + * @IWX_SEC_KEY_FLAG_CIPHER_TKIP: TKIP cipher + * @IWX_SEC_KEY_FLAG_CIPHER_GCMP: GCMP/GMAC cipher + * @IWX_SEC_KEY_FLAG_NO_TX: don't install for TX + * @IWX_SEC_KEY_FLAG_KEY_SIZE: large key size (WEP-104, GCMP-256, GMAC-256) + * @IWX_SEC_KEY_FLAG_MFP: MFP is in used for this key + * @IWX_SEC_KEY_FLAG_MCAST_KEY: this is a multicast key + * @IWX_SEC_KEY_FLAG_SPP_AMSDU: SPP A-MSDU should be used + */ +enum iwx_sec_key_flags { + IWX_SEC_KEY_FLAG_CIPHER_MASK = 0x07, + IWX_SEC_KEY_FLAG_CIPHER_WEP = 0x01, + IWX_SEC_KEY_FLAG_CIPHER_CCMP = 0x02, + IWX_SEC_KEY_FLAG_CIPHER_TKIP = 0x03, + IWX_SEC_KEY_FLAG_CIPHER_GCMP = 0x05, + IWX_SEC_KEY_FLAG_NO_TX = 0x08, + IWX_SEC_KEY_FLAG_KEY_SIZE = 0x10, + IWX_SEC_KEY_FLAG_MFP = 0x20, + IWX_SEC_KEY_FLAG_MCAST_KEY = 0x40, + IWX_SEC_KEY_FLAG_SPP_AMSDU = 0x80, +}; + +#define IWX_SEC_WEP_KEY_OFFSET 3 + +/** + * struct iwx_sec_key_cmd - security key command + * @action: action from &enum iwx_ctxt_action + * @u.add.sta_mask: station mask for the new key + * @u.add.key_id: key ID (0-7) for the new key + * @u.add.key_flags: key flags per &enum iwx_sec_key_flags + * @u.add.key: key material. WEP keys should start from &IWX_SEC_WEP_KEY_OFFSET. + * @u.add.tkip_mic_rx_key: TKIP MIC RX key + * @u.add.tkip_mic_tx_key: TKIP MIC TX key + * @u.add.rx_seq: RX sequence counter value + * @u.add.tx_seq: TX sequence counter value + * @u.modify.old_sta_mask: old station mask + * @u.modify.new_sta_mask: new station mask + * @u.modify.key_id: key ID + * @u.modify.key_flags: new key flags + * @u.remove.sta_mask: station mask + * @u.remove.key_id: key ID + * @u.remove.key_flags: key flags + */ +struct iwx_sec_key_cmd { + uint32_t action; + union { + struct { + uint32_t sta_mask; + uint32_t key_id; + uint32_t key_flags; + uint8_t key[32]; + uint8_t tkip_mic_rx_key[8]; + uint8_t tkip_mic_tx_key[8]; + uint64_t rx_seq; + uint64_t tx_seq; + } __packed add; /* SEC_KEY_ADD_CMD_API_S_VER_1 */ + struct { + uint32_t old_sta_mask; + uint32_t new_sta_mask; + uint32_t key_id; + uint32_t key_flags; + } __packed modify; /* SEC_KEY_MODIFY_CMD_API_S_VER_1 */ + struct { + uint32_t sta_mask; + uint32_t key_id; + uint32_t key_flags; + } __packed remove; /* SEC_KEY_REMOVE_CMD_API_S_VER_1 */ + } __packed u; /* SEC_KEY_OPERATION_API_U_VER_1 */ +} __packed; /* SEC_KEY_CMD_API_S_VER_1 */ + /** * Options for TLC config flags * @IWX_TLC_MNG_CFG_FLAGS_STBC_MSK: enable STBC. For HE this enables STBC for diff --git a/sys/dev/pci/if_iwxvar.h b/sys/dev/pci/if_iwxvar.h index 65f91b4fa..e82e5bf0f 100644 --- a/sys/dev/pci/if_iwxvar.h +++ b/sys/dev/pci/if_iwxvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: if_iwxvar.h,v 1.41 2023/03/06 11:53:24 stsp Exp $ */ +/* $OpenBSD: if_iwxvar.h,v 1.42 2024/11/08 09:12:46 kettenis Exp $ */ /* * Copyright (c) 2014 genua mbh @@ -123,7 +123,7 @@ struct iwx_tx_radiotap_header { (1 << IEEE80211_RADIOTAP_RATE) | \ (1 << IEEE80211_RADIOTAP_CHANNEL)) -#define IWX_UCODE_SECT_MAX 57 +#define IWX_UCODE_SECT_MAX 60 /* * fw_status is used to determine if we've already parsed the firmware file @@ -486,6 +486,14 @@ struct iwx_device_cfg { #define IWX_SO_A_GF4_A_PNVM "iwx-so-a0-gf4-a0.pnvm" #define IWX_SO_A_HR_B_FW "iwx-so-a0-hr-b0-77" #define IWX_SO_A_JF_B_FW "iwx-so-a0-jf-b0-77" +#define IWX_MA_B_HR_B_FW "iwx-ma-a0-hr-b0-83" +#define IWX_MA_B_HR_B_PNVM "iwx-ma-a0-hr-b0.pnvm" +#define IWX_MA_B_GF_A_FW "iwx-ma-b0-gf-a0-83" +#define IWX_MA_B_GF_A_PNVM "iwx-ma-b0-gf-a0.pnvm" +#define IWX_MA_B_GF4_A_FW "iwx-ma-b0-gf4-a0-83" +#define IWX_MA_B_GF4_A_PNVM "iwx-ma-b0-gf4-a0.pnvm" +#define IWX_MA_A_FM_A_FW "iwx-ma-a0-fm-a0-83" +#define IWX_MA_A_FM_A_PNVM "iwx-ma-a0-fm-a0.pnvm" const struct iwx_device_cfg iwx_9560_quz_a0_jf_b0_cfg = { .fw_name = IWX_QUZ_A_JF_B_FW, @@ -574,6 +582,26 @@ const struct iwx_device_cfg iwx_2ax_cfg_so_jf_b0 = { .fw_name = IWX_SO_A_JF_B_FW, }; +const struct iwx_device_cfg iwx_cfg_ma_b0_hr_b0 = { + .fw_name = IWX_MA_B_HR_B_FW, + .pnvm_name = IWX_MA_B_HR_B_PNVM, +}; + +const struct iwx_device_cfg iwx_cfg_ma_b0_gf_a0 = { + .fw_name = IWX_MA_B_GF_A_FW, + .pnvm_name = IWX_MA_B_GF_A_PNVM, +}; + +const struct iwx_device_cfg iwx_cfg_ma_b0_gf4_a0 = { + .fw_name = IWX_MA_B_GF4_A_FW, + .pnvm_name = IWX_MA_B_GF4_A_PNVM, +}; + +const struct iwx_device_cfg iwx_cfg_ma_a0_fm_a0 = { + .fw_name = IWX_MA_A_FM_A_FW, + .pnvm_name = IWX_MA_A_FM_A_PNVM, +}; + #define IWX_CFG_ANY (~0) #define IWX_CFG_MAC_TYPE_QU 0x33 @@ -693,6 +721,9 @@ struct iwx_softc { struct iwx_dma_info prph_info_dma; struct iwx_dma_info iml_dma; struct iwx_dma_info pnvm_dma; + struct iwx_dma_info pnvm_seg_dma[IWX_MAX_DRAM_ENTRY]; + uint32_t pnvm_size; + int pnvm_segs; uint32_t sc_pnvm_ver; int sc_fw_chunk_done; @@ -713,6 +744,7 @@ struct iwx_softc { struct iwx_fw_cmd_version cmd_versions[IWX_MAX_FW_CMD_VERSIONS]; int n_cmd_versions; int sc_rate_n_flags_version; + int sc_use_mld_api; int sc_intmask; int sc_flags; diff --git a/sys/dev/pci/if_ixgb_osdep.h b/sys/dev/pci/if_ixgb_osdep.h index defc1d840..23a9c38ef 100644 --- a/sys/dev/pci/if_ixgb_osdep.h +++ b/sys/dev/pci/if_ixgb_osdep.h @@ -31,7 +31,7 @@ POSSIBILITY OF SUCH DAMAGE. ***************************************************************************/ -/* $OpenBSD: if_ixgb_osdep.h,v 1.4 2011/07/26 14:57:57 deraadt Exp $ */ +/* $OpenBSD: if_ixgb_osdep.h,v 1.5 2024/10/22 21:50:02 jsg Exp $ */ #ifndef _IXGB_OPENBSD_OS_H_ #define _IXGB_OPENBSD_OS_H_ @@ -62,8 +62,7 @@ POSSIBILITY OF SUCH DAMAGE. #define le16_to_cpu letoh16 -struct ixgb_osdep -{ +struct ixgb_osdep { bus_space_tag_t mem_bus_space_tag; bus_space_handle_t mem_bus_space_handle; struct device *dev; diff --git a/sys/dev/pci/if_ixl.c b/sys/dev/pci/if_ixl.c index 66fd7c540..b681ae6c3 100644 --- a/sys/dev/pci/if_ixl.c +++ b/sys/dev/pci/if_ixl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_ixl.c,v 1.101 2024/05/24 06:02:53 jsg Exp $ */ +/* $OpenBSD: if_ixl.c,v 1.102 2024/10/30 18:02:45 jan Exp $ */ /* * Copyright (c) 2013-2015, Intel Corporation @@ -49,6 +49,7 @@ #include "bpfilter.h" #include "kstat.h" +#include "vlan.h" #include #include @@ -1966,7 +1967,10 @@ ixl_attach(struct device *parent, struct device *self, void *aux) strlcpy(ifp->if_xname, DEVNAME(sc), IFNAMSIZ); ifq_init_maxlen(&ifp->if_snd, sc->sc_tx_ring_ndescs); - ifp->if_capabilities = IFCAP_VLAN_HWTAGGING; + ifp->if_capabilities = IFCAP_VLAN_MTU; +#if NVLAN > 0 + ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING; +#endif ifp->if_capabilities |= IFCAP_CSUM_IPv4 | IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4 | IFCAP_CSUM_TCPv6 | IFCAP_CSUM_UDPv6; @@ -2806,11 +2810,13 @@ ixl_tx_setup_offload(struct mbuf *m0, struct ixl_tx_ring *txr, uint64_t hlen; uint64_t offload = 0; +#if NVLAN > 0 if (ISSET(m0->m_flags, M_VLANTAG)) { uint64_t vtag = m0->m_pkthdr.ether_vtag; offload |= IXL_TX_DESC_CMD_IL2TAG1; offload |= vtag << IXL_TX_DESC_L2TAG1_SHIFT; } +#endif if (!ISSET(m0->m_pkthdr.csum_flags, M_IPV4_CSUM_OUT|M_TCP_CSUM_OUT|M_UDP_CSUM_OUT|M_TCP_TSO)) @@ -3309,11 +3315,13 @@ ixl_rxeof(struct ixl_softc *sc, struct ixl_rx_ring *rxr) m->m_pkthdr.csum_flags |= M_FLOWID; } +#if NVLAN > 0 if (ISSET(word, IXL_RX_DESC_L2TAG1P)) { m->m_pkthdr.ether_vtag = lemtoh16(&rxd->l2tag1); SET(m->m_flags, M_VLANTAG); } +#endif ixl_rx_checksum(m, word); ml_enqueue(&ml, m); diff --git a/sys/dev/pci/if_ixv.c b/sys/dev/pci/if_ixv.c new file mode 100644 index 000000000..f5525a400 --- /dev/null +++ b/sys/dev/pci/if_ixv.c @@ -0,0 +1,1573 @@ +/* $OpenBSD: if_ixv.c,v 1.1 2024/11/02 04:37:20 yasuoka Exp $ */ + +/****************************************************************************** + + Copyright (c) 2001-2017, Intel Corporation + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of the Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +******************************************************************************/ + +#include +#include +#include + +/************************************************************************ + * Driver version + ************************************************************************/ +char ixv_driver_version[] = "1.5.32"; + +/************************************************************************ + * PCI Device ID Table + * + * Used by probe to select devices to load on + * + * { Vendor ID, Device ID } + ************************************************************************/ +const struct pci_matchid ixv_devices[] = { + {PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82599VF}, + {PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_X540_VF}, + {PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_X550_VF}, + {PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_X550EM_X_VF}, + {PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_X550EM_A_VF} +}; + +/************************************************************************ + * Function prototypes + ************************************************************************/ +static int ixv_probe(struct device *, void *, void *); +static void ixv_identify_hardware(struct ix_softc *sc); +static void ixv_attach(struct device *, struct device *, void *); +static int ixv_detach(struct device *, int); +static int ixv_ioctl(struct ifnet *, u_long, caddr_t); +static void ixv_watchdog(struct ifnet *); +static void ixv_init(struct ix_softc *); +static void ixv_stop(void *); +static int ixv_allocate_msix(struct ix_softc *); +static void ixv_setup_interface(struct device *, struct ix_softc *); +static int ixv_negotiate_api(struct ix_softc *); + +static void ixv_initialize_transmit_units(struct ix_softc *); +static void ixv_initialize_receive_units(struct ix_softc *); +static void ixv_initialize_rss_mapping(struct ix_softc *); + +static void ixv_enable_intr(struct ix_softc *); +static void ixv_disable_intr(struct ix_softc *); +static void ixv_iff(struct ix_softc *); +static void ixv_set_ivar(struct ix_softc *, uint8_t, uint8_t, int8_t); +static void ixv_configure_ivars(struct ix_softc *); +static uint8_t *ixv_mc_array_itr(struct ixgbe_hw *, uint8_t **, uint32_t *); + +static void ixv_setup_vlan_support(struct ix_softc *); + +/* The MSI-X Interrupt handlers */ +static int ixv_msix_que(void *); +static int ixv_msix_mbx(void *); + +/* Share functions between ixv and ix. */ +void ixgbe_start(struct ifqueue *ifq); +int ixgbe_activate(struct device *, int); +int ixgbe_allocate_queues(struct ix_softc *); +int ixgbe_setup_transmit_structures(struct ix_softc *); +int ixgbe_setup_receive_structures(struct ix_softc *); +void ixgbe_free_transmit_structures(struct ix_softc *); +void ixgbe_free_receive_structures(struct ix_softc *); +int ixgbe_txeof(struct ix_txring *); +int ixgbe_rxeof(struct ix_rxring *); +void ixgbe_rxrefill(void *); +void ixgbe_update_link_status(struct ix_softc *); +int ixgbe_allocate_pci_resources(struct ix_softc *); +void ixgbe_free_pci_resources(struct ix_softc *); +void ixgbe_media_status(struct ifnet *, struct ifmediareq *); +int ixgbe_media_change(struct ifnet *); +void ixgbe_add_media_types(struct ix_softc *); +int ixgbe_get_sffpage(struct ix_softc *, struct if_sffpage *); +int ixgbe_rxrinfo(struct ix_softc *, struct if_rxrinfo *); + +#if NKSTAT > 0 +static void ixv_kstats(struct ix_softc *); +static void ixv_rxq_kstats(struct ix_softc *, struct ix_rxring *); +static void ixv_txq_kstats(struct ix_softc *, struct ix_txring *); +static void ixv_kstats_tick(void *); +#endif + +/************************************************************************ + * Value Definitions + ************************************************************************/ +/* + Default value for Extended Interrupt Throttling Register. + 128 * 2.048 uSec will be minimum interrupt iterval for 10GbE link. + Minimum interrupt interval can be set from 0 to 2044 in increments of 4. + */ +#define IXGBE_EITR_DEFAULT 128 + +/********************************************************************* + * OpenBSD Device Interface Entry Points + *********************************************************************/ + +struct cfdriver ixv_cd = { + NULL, "ixv", DV_IFNET +}; + +const struct cfattach ixv_ca = { + sizeof(struct ix_softc), ixv_probe, ixv_attach, ixv_detach, + ixgbe_activate +}; + +/************************************************************************ + * ixv_probe - Device identification routine + * + * Determines if the driver should be loaded on + * adapter based on its PCI vendor/device ID. + * + * return BUS_PROBE_DEFAULT on success, positive on failure + ************************************************************************/ +static int +ixv_probe(struct device *parent, void *match, void *aux) +{ + INIT_DEBUGOUT("ixv_probe: begin"); + + return (pci_matchbyid((struct pci_attach_args *)aux, ixv_devices, + nitems(ixv_devices))); +} + +/********************************************************************* + * + * Determine hardware revision. + * + **********************************************************************/ +static void +ixv_identify_hardware(struct ix_softc *sc) +{ + struct ixgbe_osdep *os = &sc->osdep; + struct pci_attach_args *pa = &os->os_pa; + uint32_t reg; + + /* Save off the information about this board */ + sc->hw.vendor_id = PCI_VENDOR(pa->pa_id); + sc->hw.device_id = PCI_PRODUCT(pa->pa_id); + + reg = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG); + sc->hw.revision_id = PCI_REVISION(reg); + + reg = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG); + sc->hw.subsystem_vendor_id = PCI_VENDOR(reg); + sc->hw.subsystem_device_id = PCI_PRODUCT(reg); + + sc->num_segs = IXGBE_82599_SCATTER; +} + +/************************************************************************ + * ixv_attach - Device initialization routine + * + * Called when the driver is being loaded. + * Identifies the type of hardware, allocates all resources + * and initializes the hardware. + * + * return 0 on success, positive on failure + ************************************************************************/ +static void +ixv_attach(struct device *parent, struct device *self, void *aux) +{ + struct pci_attach_args *pa = (struct pci_attach_args *)aux; + struct ix_softc *sc = (struct ix_softc *)self; + struct ixgbe_hw *hw; + int error; + + INIT_DEBUGOUT("ixv_attach: begin"); + + sc->osdep.os_sc = sc; + sc->osdep.os_pa = *pa; + + rw_init(&sc->sfflock, "ixvsff"); + + /* Allocate, clear, and link in our adapter structure */ + sc->dev = *self; + sc->hw.back = sc; + hw = &sc->hw; + + /* Indicate to RX setup to use Jumbo Clusters */ + sc->num_tx_desc = DEFAULT_TXD; + sc->num_rx_desc = DEFAULT_RXD; + + ixv_identify_hardware(sc); + +#if NKSTAT > 0 + ixv_kstats(sc); +#endif + + /* Allocate multicast array memory */ + sc->mta = mallocarray(IXGBE_ETH_LENGTH_OF_ADDRESS, + IXGBE_MAX_MULTICAST_ADDRESSES_VF, M_DEVBUF, M_NOWAIT); + if (sc->mta == NULL) { + printf("Can not allocate multicast setup array\n"); + return; + } + + /* Do base PCI setup - map BAR0 */ + if (ixgbe_allocate_pci_resources(sc)) { + printf("ixgbe_allocate_pci_resources() failed!\n"); + goto err_out; + } + + /* Allocate our TX/RX Queues */ + if (ixgbe_allocate_queues(sc)) { + printf("ixgbe_allocate_queues() failed!\n"); + goto err_out; + } + + /* A subset of set_mac_type */ + switch (hw->device_id) { + case IXGBE_DEV_ID_82599_VF: + hw->mac.type = ixgbe_mac_82599_vf; + break; + case IXGBE_DEV_ID_X540_VF: + hw->mac.type = ixgbe_mac_X540_vf; + break; + case IXGBE_DEV_ID_X550_VF: + hw->mac.type = ixgbe_mac_X550_vf; + break; + case IXGBE_DEV_ID_X550EM_X_VF: + hw->mac.type = ixgbe_mac_X550EM_x_vf; + break; + case IXGBE_DEV_ID_X550EM_A_VF: + hw->mac.type = ixgbe_mac_X550EM_a_vf; + break; + default: + /* Shouldn't get here since probe succeeded */ + printf("Unknown device ID!\n"); + goto err_out; + } + + /* Initialize the shared code */ + if (ixgbe_init_ops_vf(hw)) { + printf("ixgbe_init_ops_vf() failed!\n"); + goto err_out; + } + + /* Setup the mailbox */ + ixgbe_init_mbx_params_vf(hw); + + /* Set the right number of segments */ + sc->num_segs = IXGBE_82599_SCATTER; + + error = hw->mac.ops.reset_hw(hw); + switch (error) { + case 0: + break; + case IXGBE_ERR_RESET_FAILED: + printf("...reset_hw() failure: Reset Failed!\n"); + goto err_out; + default: + printf("...reset_hw() failed with error %d\n", + error); + goto err_out; + } + + error = hw->mac.ops.init_hw(hw); + if (error) { + printf("...init_hw() failed with error %d\n", + error); + goto err_out; + } + + /* Negotiate mailbox API version */ + if (ixv_negotiate_api(sc)) { + printf("Mailbox API negotiation failed during attach!\n"); + goto err_out; + } + + /* If no mac address was assigned, make a random one */ + if (memcmp(hw->mac.addr, etheranyaddr, ETHER_ADDR_LEN) == 0) { + ether_fakeaddr(&sc->arpcom.ac_if); + bcopy(sc->arpcom.ac_enaddr, hw->mac.addr, ETHER_ADDR_LEN); + bcopy(sc->arpcom.ac_enaddr, hw->mac.perm_addr, ETHER_ADDR_LEN); + } else + bcopy(hw->mac.addr, sc->arpcom.ac_enaddr, ETHER_ADDR_LEN); + + /* Setup OS specific network interface */ + ixv_setup_interface(self, sc); + + /* Setup MSI-X */ + if (ixv_allocate_msix(sc)) { + printf("ixv_allocate_msix() failed!\n"); + goto err_late; + } + + /* Check if VF was disabled by PF */ + if (hw->mac.ops.get_link_state(hw, &sc->link_enabled)) { + /* PF is not capable of controlling VF state. Enable the link. */ + sc->link_enabled = TRUE; + } + + /* Set an initial default flow control value */ + sc->fc = ixgbe_fc_full; + + INIT_DEBUGOUT("ixv_attach: end"); + + return; + +err_late: + ixgbe_free_transmit_structures(sc); + ixgbe_free_receive_structures(sc); +err_out: + ixgbe_free_pci_resources(sc); + free(sc->mta, M_DEVBUF, IXGBE_ETH_LENGTH_OF_ADDRESS * + IXGBE_MAX_MULTICAST_ADDRESSES_VF); +} /* ixv_attach */ + +/************************************************************************ + * ixv_detach - Device removal routine + * + * Called when the driver is being removed. + * Stops the adapter and deallocates all the resources + * that were allocated for driver operation. + * + * return 0 on success, positive on failure + ************************************************************************/ +static int +ixv_detach(struct device *self, int flags) +{ + struct ix_softc *sc = (struct ix_softc *)self; + struct ifnet *ifp = &sc->arpcom.ac_if; + + INIT_DEBUGOUT("ixv_detach: begin"); + + ixv_stop(sc); + ether_ifdetach(ifp); + if_detach(ifp); + + free(sc->mta, M_DEVBUF, IXGBE_ETH_LENGTH_OF_ADDRESS * + IXGBE_MAX_MULTICAST_ADDRESSES_VF); + + ixgbe_free_pci_resources(sc); + + ixgbe_free_transmit_structures(sc); + ixgbe_free_receive_structures(sc); + + return (0); +} /* ixv_detach */ + +/********************************************************************* + * Watchdog entry point + * + **********************************************************************/ +static void +ixv_watchdog(struct ifnet * ifp) +{ + struct ix_softc *sc = (struct ix_softc *)ifp->if_softc; + struct ix_txring *txr = sc->tx_rings; + struct ixgbe_hw *hw = &sc->hw; + int tx_hang = FALSE; + int i; + + /* + * The timer is set to 5 every time ixgbe_start() queues a packet. + * Anytime all descriptors are clean the timer is set to 0. + */ + for (i = 0; i < sc->num_queues; i++, txr++) { + if (txr->watchdog_timer == 0 || --txr->watchdog_timer) + continue; + else { + tx_hang = TRUE; + break; + } + } + if (tx_hang == FALSE) + return; + + + printf("%s: Watchdog timeout -- resetting\n", ifp->if_xname); + for (i = 0; i < sc->num_queues; i++, txr++) { + printf("%s: Queue(%d) tdh = %d, hw tdt = %d\n", ifp->if_xname, i, + IXGBE_READ_REG(hw, IXGBE_VFTDH(i)), + IXGBE_READ_REG(hw, txr->tail)); + printf("%s: TX(%d) Next TX to Clean = %d\n", ifp->if_xname, + i, txr->next_to_clean); + } + ifp->if_flags &= ~IFF_RUNNING; + + ixv_init(sc); +} + +/************************************************************************ + * ixv_init - Init entry point + * + * Used in two ways: It is used by the stack as an init entry + * point in network interface structure. It is also used + * by the driver as a hw/sw initialization routine to get + * to a consistent state. + * + * return 0 on success, positive on failure + ************************************************************************/ +void +ixv_init(struct ix_softc *sc) +{ + struct ifnet *ifp = &sc->arpcom.ac_if; + struct ixgbe_hw *hw = &sc->hw; + struct ix_queue *que = sc->queues; + uint32_t mask; + int i, s, error = 0; + + INIT_DEBUGOUT("ixv_init: begin"); + + s = splnet(); + + hw->adapter_stopped = FALSE; + hw->mac.ops.stop_adapter(hw); + + /* reprogram the RAR[0] in case user changed it. */ + hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV); + + /* Get the latest mac address, User can use a LAA */ + bcopy(sc->arpcom.ac_enaddr, sc->hw.mac.addr, + IXGBE_ETH_LENGTH_OF_ADDRESS); + + sc->max_frame_size = ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN; + + hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, 1); + + /* Prepare transmit descriptors and buffers */ + if (ixgbe_setup_transmit_structures(sc)) { + printf("Could not setup transmit structures\n"); + ixv_stop(sc); + splx(s); + return; + } + + /* Reset VF and renegotiate mailbox API version */ + hw->mac.ops.reset_hw(hw); + error = ixv_negotiate_api(sc); + if (error) { + printf("Mailbox API negotiation failed in init!\n"); + splx(s); + return; + } + + ixv_initialize_transmit_units(sc); + + /* Setup Multicast table */ + ixv_iff(sc); + + /* Use 2k clusters, even for jumbo frames */ + sc->rx_mbuf_sz = MCLBYTES + ETHER_ALIGN; + + /* Prepare receive descriptors and buffers */ + if (ixgbe_setup_receive_structures(sc)) { + printf("Could not setup receive structures\n"); + ixv_stop(sc); + splx(s); + return; + } + + /* Configure RX settings */ + ixv_initialize_receive_units(sc); + + /* Set up VLAN offload and filter */ + ixv_setup_vlan_support(sc); + + /* Set up MSI-X routing */ + ixv_configure_ivars(sc); + + /* Set up auto-mask */ + mask = (1 << sc->linkvec); + for (i = 0; i < sc->num_queues; i++, que++) + mask |= (1 << que->msix); + IXGBE_WRITE_REG(hw, IXGBE_VTEIAM, mask); + + /* Set moderation on the Link interrupt */ + IXGBE_WRITE_REG(&sc->hw, IXGBE_VTEITR(sc->linkvec), + IXGBE_LINK_ITR); + + /* Config/Enable Link */ + error = hw->mac.ops.get_link_state(hw, &sc->link_enabled); + if (error) { + /* PF is not capable of controlling VF state. Enable the link. */ + sc->link_enabled = TRUE; + } else if (sc->link_enabled == FALSE) + printf("VF is disabled by PF\n"); + + hw->mac.ops.check_link(hw, &sc->link_speed, &sc->link_up, + FALSE); + + /* And now turn on interrupts */ + ixv_enable_intr(sc); + + /* Now inform the stack we're ready */ + ifp->if_flags |= IFF_RUNNING; + for (i = 0; i < sc->num_queues; i++) + ifq_clr_oactive(ifp->if_ifqs[i]); + + splx(s); +} /* ixv_init */ + +/* + * MSI-X Interrupt Handlers and Tasklets + */ + +static inline void +ixv_enable_queue(struct ix_softc *sc, uint32_t vector) +{ + struct ixgbe_hw *hw = &sc->hw; + uint32_t queue = 1 << vector; + uint32_t mask; + + mask = (IXGBE_EIMS_RTX_QUEUE & queue); + IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask); +} /* ixv_enable_queue */ + +static inline void +ixv_disable_queue(struct ix_softc *sc, uint32_t vector) +{ + struct ixgbe_hw *hw = &sc->hw; + uint64_t queue = (1ULL << vector); + uint32_t mask; + + mask = (IXGBE_EIMS_RTX_QUEUE & queue); + IXGBE_WRITE_REG(hw, IXGBE_VTEIMC, mask); +} /* ixv_disable_queue */ + +/************************************************************************ + * ixv_msix_que - MSI Queue Interrupt Service routine + ************************************************************************/ +int +ixv_msix_que(void *arg) +{ + struct ix_queue *que = arg; + struct ix_softc *sc = que->sc; + struct ifnet *ifp = &sc->arpcom.ac_if; + struct ix_txring *txr = que->txr; + struct ix_rxring *rxr = que->rxr; + + if ((ifp->if_flags & IFF_RUNNING) == 0) + return 1; + + ixv_disable_queue(sc, que->msix); + + ixgbe_rxeof(rxr); + ixgbe_txeof(txr); + ixgbe_rxrefill(rxr); + + /* Reenable this interrupt */ + ixv_enable_queue(sc, que->msix); + + return 1; +} /* ixv_msix_que */ + + +/************************************************************************ + * ixv_msix_mbx + ************************************************************************/ +static int +ixv_msix_mbx(void *arg) +{ + struct ix_softc *sc = arg; + struct ixgbe_hw *hw = &sc->hw; + + sc->hw.mac.get_link_status = TRUE; + KERNEL_LOCK(); + ixgbe_update_link_status(sc); + KERNEL_UNLOCK(); + + IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, (1 << sc->linkvec)); + + + return 1; +} /* ixv_msix_mbx */ + +/************************************************************************ + * ixv_negotiate_api + * + * Negotiate the Mailbox API with the PF; + * start with the most featured API first. + ************************************************************************/ +static int +ixv_negotiate_api(struct ix_softc *sc) +{ + struct ixgbe_hw *hw = &sc->hw; + int mbx_api[] = { ixgbe_mbox_api_12, + ixgbe_mbox_api_11, + ixgbe_mbox_api_10, + ixgbe_mbox_api_unknown }; + int i = 0; + + while (mbx_api[i] != ixgbe_mbox_api_unknown) { + if (ixgbevf_negotiate_api_version(hw, mbx_api[i]) == 0) + return (0); + i++; + } + + return (EINVAL); +} /* ixv_negotiate_api */ + + +/************************************************************************ + * ixv_iff - Multicast Update + * + * Called whenever multicast address list is updated. + ************************************************************************/ +static void +ixv_iff(struct ix_softc *sc) +{ + struct ifnet *ifp = &sc->arpcom.ac_if; + struct ixgbe_hw *hw = &sc->hw; + struct arpcom *ac = &sc->arpcom; + uint8_t *mta, *update_ptr; + struct ether_multi *enm; + struct ether_multistep step; + int xcast_mode, mcnt = 0; + + IOCTL_DEBUGOUT("ixv_iff: begin"); + + mta = sc->mta; + bzero(mta, sizeof(uint8_t) * IXGBE_ETH_LENGTH_OF_ADDRESS * + IXGBE_MAX_MULTICAST_ADDRESSES_VF); + + ifp->if_flags &= ~IFF_ALLMULTI; + if (ifp->if_flags & IFF_PROMISC || ac->ac_multirangecnt > 0 || + ac->ac_multicnt > IXGBE_MAX_MULTICAST_ADDRESSES_VF) { + ifp->if_flags |= IFF_ALLMULTI; + } else { + ETHER_FIRST_MULTI(step, &sc->arpcom, enm); + while (enm != NULL) { + bcopy(enm->enm_addrlo, + &mta[mcnt * IXGBE_ETH_LENGTH_OF_ADDRESS], + IXGBE_ETH_LENGTH_OF_ADDRESS); + mcnt++; + + ETHER_NEXT_MULTI(step, enm); + } + + update_ptr = mta; + hw->mac.ops.update_mc_addr_list(hw, update_ptr, mcnt, + ixv_mc_array_itr, TRUE); + } + + /* request the most inclusive mode we need */ + if (ISSET(ifp->if_flags, IFF_PROMISC)) + xcast_mode = IXGBEVF_XCAST_MODE_PROMISC; + else if (ISSET(ifp->if_flags, IFF_ALLMULTI)) + xcast_mode = IXGBEVF_XCAST_MODE_ALLMULTI; + else if (ISSET(ifp->if_flags, (IFF_BROADCAST | IFF_MULTICAST))) + xcast_mode = IXGBEVF_XCAST_MODE_MULTI; + else + xcast_mode = IXGBEVF_XCAST_MODE_NONE; + + hw->mac.ops.update_xcast_mode(hw, xcast_mode); + + +} /* ixv_iff */ + +/************************************************************************ + * ixv_mc_array_itr + * + * An iterator function needed by the multicast shared code. + * It feeds the shared code routine the addresses in the + * array of ixv_iff() one by one. + ************************************************************************/ +static uint8_t * +ixv_mc_array_itr(struct ixgbe_hw *hw, uint8_t **update_ptr, uint32_t *vmdq) +{ + uint8_t *mta = *update_ptr; + + *vmdq = 0; + *update_ptr = mta + IXGBE_ETH_LENGTH_OF_ADDRESS; + + return (mta); +} /* ixv_mc_array_itr */ + +/************************************************************************ + * ixv_stop - Stop the hardware + * + * Disables all traffic on the adapter by issuing a + * global reset on the MAC and deallocates TX/RX buffers. + ************************************************************************/ +static void +ixv_stop(void *arg) +{ + struct ix_softc *sc = arg; + struct ifnet *ifp = &sc->arpcom.ac_if; + struct ixgbe_hw *hw = &sc->hw; + int i; + + INIT_DEBUGOUT("ixv_stop: begin\n"); +#if NKSTAT > 0 + timeout_del(&sc->sc_kstat_tmo); +#endif + ixv_disable_intr(sc); + + + /* Tell the stack that the interface is no longer active */ + ifp->if_flags &= ~IFF_RUNNING; + + hw->mac.ops.reset_hw(hw); + sc->hw.adapter_stopped = FALSE; + hw->mac.ops.stop_adapter(hw); + + /* reprogram the RAR[0] in case user changed it. */ + hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV); + + intr_barrier(sc->tag); + for (i = 0; i < sc->num_queues; i++) { + struct ifqueue *ifq = ifp->if_ifqs[i]; + ifq_barrier(ifq); + ifq_clr_oactive(ifq); + + if (sc->queues[i].tag != NULL) + intr_barrier(sc->queues[i].tag); + timeout_del(&sc->rx_rings[i].rx_refill); + } + + KASSERT((ifp->if_flags & IFF_RUNNING) == 0); + + /* Should we really clear all structures on stop? */ + ixgbe_free_transmit_structures(sc); + ixgbe_free_receive_structures(sc); + + ixgbe_update_link_status(sc); +} /* ixv_stop */ + +/************************************************************************ + * ixv_setup_interface + * + * Setup networking device structure and register an interface. + ************************************************************************/ +static void +ixv_setup_interface(struct device *dev, struct ix_softc *sc) +{ + struct ifnet *ifp; + int i; + + ifp = &sc->arpcom.ac_if; + + strlcpy(ifp->if_xname, sc->dev.dv_xname, IFNAMSIZ); + ifp->if_softc = sc; + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; + ifp->if_xflags = IFXF_MPSAFE; + ifp->if_ioctl = ixv_ioctl; + ifp->if_qstart = ixgbe_start; + ifp->if_timer = 0; + ifp->if_watchdog = ixv_watchdog; + ifp->if_hardmtu = IXGBE_MAX_FRAME_SIZE - + ETHER_HDR_LEN - ETHER_CRC_LEN; + ifq_init_maxlen(&ifp->if_snd, sc->num_tx_desc - 1); + + ifp->if_capabilities = IFCAP_VLAN_MTU; + +#if NVLAN > 0 + ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING; +#endif + + ifp->if_capabilities |= IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4; + ifp->if_capabilities |= IFCAP_CSUM_TCPv6 | IFCAP_CSUM_UDPv6; + ifp->if_capabilities |= IFCAP_CSUM_IPv4; + + /* + * Specify the media types supported by this sc and register + * callbacks to update media and link information + */ + ifmedia_init(&sc->media, IFM_IMASK, ixgbe_media_change, + ixgbe_media_status); + ixgbe_add_media_types(sc); + ifmedia_set(&sc->media, IFM_ETHER | IFM_AUTO); + + if_attach(ifp); + ether_ifattach(ifp); + + if_attach_queues(ifp, sc->num_queues); + if_attach_iqueues(ifp, sc->num_queues); + for (i = 0; i < sc->num_queues; i++) { + struct ifqueue *ifq = ifp->if_ifqs[i]; + struct ifiqueue *ifiq = ifp->if_iqs[i]; + struct ix_txring *txr = &sc->tx_rings[i]; + struct ix_rxring *rxr = &sc->rx_rings[i]; + + ifq->ifq_softc = txr; + txr->ifq = ifq; + + ifiq->ifiq_softc = rxr; + rxr->ifiq = ifiq; + +#if NKSTAT > 0 + ixv_txq_kstats(sc, txr); + ixv_rxq_kstats(sc, rxr); +#endif + } + + sc->max_frame_size = IXGBE_MAX_FRAME_SIZE; +} /* ixv_setup_interface */ + +/************************************************************************ + * ixv_initialize_transmit_units - Enable transmit unit. + ************************************************************************/ +static void +ixv_initialize_transmit_units(struct ix_softc *sc) +{ + struct ifnet *ifp = &sc->arpcom.ac_if; + struct ix_txring *txr; + struct ixgbe_hw *hw = &sc->hw; + uint64_t tdba; + uint32_t txctrl, txdctl; + int i; + + for (i = 0; i < sc->num_queues; i++) { + txr = &sc->tx_rings[i]; + tdba = txr->txdma.dma_map->dm_segs[0].ds_addr; + + /* Set WTHRESH to 8, burst writeback */ + txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(i)); + txdctl |= (8 << 16); + IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(i), txdctl); + + /* Set Tx Tail register */ + txr->tail = IXGBE_VFTDT(i); + + /* Set the HW Tx Head and Tail indices */ + IXGBE_WRITE_REG(&sc->hw, IXGBE_VFTDH(i), 0); + IXGBE_WRITE_REG(&sc->hw, txr->tail, 0); + + /* Setup Transmit Descriptor Cmd Settings */ + txr->txd_cmd = IXGBE_TXD_CMD_IFCS; + txr->queue_status = IXGBE_QUEUE_IDLE; + txr->watchdog_timer = 0; + + /* Set Ring parameters */ + IXGBE_WRITE_REG(hw, IXGBE_VFTDBAL(i), + (tdba & 0x00000000ffffffffULL)); + IXGBE_WRITE_REG(hw, IXGBE_VFTDBAH(i), (tdba >> 32)); + IXGBE_WRITE_REG(hw, IXGBE_VFTDLEN(i), + sc->num_tx_desc * sizeof(struct ixgbe_legacy_tx_desc)); + txctrl = IXGBE_READ_REG(hw, IXGBE_VFDCA_TXCTRL(i)); + txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN; + IXGBE_WRITE_REG(hw, IXGBE_VFDCA_TXCTRL(i), txctrl); + + /* Now enable */ + txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(i)); + txdctl |= IXGBE_TXDCTL_ENABLE; + IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(i), txdctl); + } + ifp->if_timer = 0; + + return; +} /* ixv_initialize_transmit_units */ + +/************************************************************************ + * ixv_initialize_rss_mapping + ************************************************************************/ +static void +ixv_initialize_rss_mapping(struct ix_softc *sc) +{ + struct ixgbe_hw *hw = &sc->hw; + uint32_t reta = 0, mrqc, rss_key[10]; + int queue_id; + int i, j; + + /* set up random bits */ + stoeplitz_to_key(&rss_key, sizeof(rss_key)); + + /* Now fill out hash function seeds */ + for (i = 0; i < 10; i++) + IXGBE_WRITE_REG(hw, IXGBE_VFRSSRK(i), rss_key[i]); + + /* Set up the redirection table */ + for (i = 0, j = 0; i < 64; i++, j++) { + if (j == sc->num_queues) + j = 0; + + /* + * Fetch the RSS bucket id for the given indirection + * entry. Cap it at the number of configured buckets + * (which is num_queues.) + */ + queue_id = queue_id % sc->num_queues; + + /* + * The low 8 bits are for hash value (n+0); + * The next 8 bits are for hash value (n+1), etc. + */ + reta >>= 8; + reta |= ((uint32_t)queue_id) << 24; + if ((i & 3) == 3) { + IXGBE_WRITE_REG(hw, IXGBE_VFRETA(i >> 2), reta); + reta = 0; + } + } + + /* + * Disable UDP - IP fragments aren't currently being handled + * and so we end up with a mix of 2-tuple and 4-tuple + * traffic. + */ + mrqc = IXGBE_MRQC_RSSEN + | IXGBE_MRQC_RSS_FIELD_IPV4 + | IXGBE_MRQC_RSS_FIELD_IPV4_TCP + | IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP + | IXGBE_MRQC_RSS_FIELD_IPV6_EX + | IXGBE_MRQC_RSS_FIELD_IPV6 + | IXGBE_MRQC_RSS_FIELD_IPV6_TCP + ; + IXGBE_WRITE_REG(hw, IXGBE_VFMRQC, mrqc); +} /* ixv_initialize_rss_mapping */ + + +/************************************************************************ + * ixv_initialize_receive_units - Setup receive registers and features. + ************************************************************************/ +static void +ixv_initialize_receive_units(struct ix_softc *sc) +{ + struct ix_rxring *rxr = sc->rx_rings; + struct ixgbe_hw *hw = &sc->hw; + uint64_t rdba; + uint32_t reg, rxdctl, bufsz, psrtype; + int i, j, k; + + bufsz = (sc->rx_mbuf_sz - ETHER_ALIGN) >> IXGBE_SRRCTL_BSIZEPKT_SHIFT; + + psrtype = IXGBE_PSRTYPE_TCPHDR + | IXGBE_PSRTYPE_UDPHDR + | IXGBE_PSRTYPE_IPV4HDR + | IXGBE_PSRTYPE_IPV6HDR + | IXGBE_PSRTYPE_L2HDR; + + if (sc->num_queues > 1) + psrtype |= 1 << 29; + + IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE, psrtype); + + /* Tell PF our max_frame size */ + if (ixgbevf_rlpml_set_vf(hw, sc->max_frame_size) != 0) { + printf("There is a problem with the PF setup." + " It is likely the receive unit for this VF will not function correctly.\n"); + } + + for (i = 0; i < sc->num_queues; i++, rxr++) { + rdba = rxr->rxdma.dma_map->dm_segs[0].ds_addr; + + /* Disable the queue */ + rxdctl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i)); + rxdctl &= ~IXGBE_RXDCTL_ENABLE; + IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(i), rxdctl); + for (j = 0; j < 10; j++) { + if (IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i)) & + IXGBE_RXDCTL_ENABLE) + msec_delay(1); + else + break; + } + + /* Setup the Base and Length of the Rx Descriptor Ring */ + IXGBE_WRITE_REG(hw, IXGBE_VFRDBAL(i), + (rdba & 0x00000000ffffffffULL)); + IXGBE_WRITE_REG(hw, IXGBE_VFRDBAH(i), (rdba >> 32)); + IXGBE_WRITE_REG(hw, IXGBE_VFRDLEN(i), + sc->num_rx_desc * sizeof(union ixgbe_adv_rx_desc)); + + /* Capture Rx Tail index */ + rxr->tail = IXGBE_VFRDT(rxr->me); + + /* Reset the ring indices */ + IXGBE_WRITE_REG(hw, IXGBE_VFRDH(rxr->me), 0); + IXGBE_WRITE_REG(hw, rxr->tail, 0); + + /* Set up the SRRCTL register */ + reg = IXGBE_READ_REG(hw, IXGBE_VFSRRCTL(i)); + reg &= ~IXGBE_SRRCTL_BSIZEHDR_MASK; + reg &= ~IXGBE_SRRCTL_BSIZEPKT_MASK; + reg |= bufsz; + reg |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF; + IXGBE_WRITE_REG(hw, IXGBE_VFSRRCTL(i), reg); + + /* Do the queue enabling last */ + rxdctl |= IXGBE_RXDCTL_ENABLE | IXGBE_RXDCTL_VME; + IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(i), rxdctl); + for (k = 0; k < 10; k++) { + if (IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i)) & + IXGBE_RXDCTL_ENABLE) + break; + msec_delay(1); + } + + /* Set the Tail Pointer */ + IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rxr->me), + sc->num_rx_desc - 1); + } + + /* + * Do not touch RSS and RETA settings for older hardware + * as those are shared among PF and all VF. + */ + if (sc->hw.mac.type >= ixgbe_mac_X550_vf) + ixv_initialize_rss_mapping(sc); + + return; +} /* ixv_initialize_receive_units */ + +/************************************************************************ + * ixv_setup_vlan_support + ************************************************************************/ +static void +ixv_setup_vlan_support(struct ix_softc *sc) +{ + struct ixgbe_hw *hw = &sc->hw; + uint32_t ctrl, vid, vfta, retry; + int i, j; + + /* + * We get here thru init, meaning + * a soft reset, this has already cleared + * the VFTA and other state, so if there + * have been no vlan's registered do nothing. + */ + if (sc->num_vlans == 0) + return; + + /* Enable the queues */ + for (i = 0; i < sc->num_queues; i++) { + ctrl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i)); + ctrl |= IXGBE_RXDCTL_VME; + IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(i), ctrl); + /* + * Let Rx path know that it needs to store VLAN tag + * as part of extra mbuf info. + */ + } + + /* + * A soft reset zero's out the VFTA, so + * we need to repopulate it now. + */ + for (i = 0; i < IXGBE_VFTA_SIZE; i++) { + if (sc->shadow_vfta[i] == 0) + continue; + vfta = sc->shadow_vfta[i]; + /* + * Reconstruct the vlan id's + * based on the bits set in each + * of the array ints. + */ + for (j = 0; j < 32; j++) { + retry = 0; + if ((vfta & (1 << j)) == 0) + continue; + vid = (i * 32) + j; + /* Call the shared code mailbox routine */ + while (hw->mac.ops.set_vfta(hw, vid, 0, TRUE, FALSE)) { + if (++retry > 5) + break; + } + } + } +} /* ixv_setup_vlan_support */ + +/************************************************************************ + * ixv_enable_intr + ************************************************************************/ +static void +ixv_enable_intr(struct ix_softc *sc) +{ + struct ixgbe_hw *hw = &sc->hw; + struct ix_queue *que = sc->queues; + uint32_t mask; + int i; + + /* For VTEIAC */ + mask = (1 << sc->linkvec); + for (i = 0; i < sc->num_queues; i++, que++) + mask |= (1 << que->msix); + IXGBE_WRITE_REG(hw, IXGBE_VTEIAC, mask); + + /* For VTEIMS */ + IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, (1 << sc->linkvec)); + que = sc->queues; + for (i = 0; i < sc->num_queues; i++, que++) + ixv_enable_queue(sc, que->msix); + + IXGBE_WRITE_FLUSH(hw); + + return; +} /* ixv_enable_intr */ + +/************************************************************************ + * ixv_disable_intr + ************************************************************************/ +static void +ixv_disable_intr(struct ix_softc *sc) +{ + IXGBE_WRITE_REG(&sc->hw, IXGBE_VTEIAC, 0); + IXGBE_WRITE_REG(&sc->hw, IXGBE_VTEIMC, ~0); + IXGBE_WRITE_FLUSH(&sc->hw); + + return; +} /* ixv_disable_intr */ + +/************************************************************************ + * ixv_set_ivar + * + * Setup the correct IVAR register for a particular MSI-X interrupt + * - entry is the register array entry + * - vector is the MSI-X vector for this queue + * - type is RX/TX/MISC + ************************************************************************/ +static void +ixv_set_ivar(struct ix_softc *sc, uint8_t entry, uint8_t vector, int8_t type) +{ + struct ixgbe_hw *hw = &sc->hw; + uint32_t ivar, index; + + vector |= IXGBE_IVAR_ALLOC_VAL; + + if (type == -1) { /* MISC IVAR */ + ivar = IXGBE_READ_REG(hw, IXGBE_VTIVAR_MISC); + ivar &= ~0xFF; + ivar |= vector; + IXGBE_WRITE_REG(hw, IXGBE_VTIVAR_MISC, ivar); + } else { /* RX/TX IVARS */ + index = (16 * (entry & 1)) + (8 * type); + ivar = IXGBE_READ_REG(hw, IXGBE_VTIVAR(entry >> 1)); + ivar &= ~(0xFF << index); + ivar |= (vector << index); + IXGBE_WRITE_REG(hw, IXGBE_VTIVAR(entry >> 1), ivar); + } +} /* ixv_set_ivar */ + +/************************************************************************ + * ixv_configure_ivars + ************************************************************************/ +static void +ixv_configure_ivars(struct ix_softc *sc) +{ + struct ix_queue *que = sc->queues; + int i; + + for (i = 0; i < sc->num_queues; i++, que++) { + /* First the RX queue entry */ + ixv_set_ivar(sc, i, que->msix, 0); + /* ... and the TX */ + ixv_set_ivar(sc, i, que->msix, 1); + /* Set an initial value in EITR */ + IXGBE_WRITE_REG(&sc->hw, IXGBE_VTEITR(que->msix), + IXGBE_EITR_DEFAULT); + } + + /* For the mailbox interrupt */ + ixv_set_ivar(sc, 1, sc->linkvec, -1); +} /* ixv_configure_ivars */ + +/************************************************************************ + * ixv_ioctl - Ioctl entry point + * + * Called when the user wants to configure the interface. + * + * return 0 on success, positive on failure + ************************************************************************/ +static int +ixv_ioctl(struct ifnet *ifp, u_long command, caddr_t data) +{ + struct ix_softc *sc = ifp->if_softc; + struct ifreq *ifr = (struct ifreq *)data; + int s, error = 0; + + s = splnet(); + + switch (command) { + case SIOCSIFADDR: + IOCTL_DEBUGOUT("ioctl: SIOCxIFADDR (Get/Set Interface Addr)"); + ifp->if_flags |= IFF_UP; + if (!(ifp->if_flags & IFF_RUNNING)) + ixv_init(sc); + break; + + case SIOCSIFFLAGS: + IOCTL_DEBUGOUT("ioctl: SIOCSIFFLAGS (Set Interface Flags)"); + if (ifp->if_flags & IFF_UP) { + if (ifp->if_flags & IFF_RUNNING) + error = ENETRESET; + else + ixv_init(sc); + } else { + if (ifp->if_flags & IFF_RUNNING) + ixv_stop(sc); + } + break; + + case SIOCSIFMEDIA: + case SIOCGIFMEDIA: + IOCTL_DEBUGOUT("ioctl: SIOCxIFMEDIA (Get/Set Interface Media)"); + error = ifmedia_ioctl(ifp, ifr, &sc->media, command); + break; + + case SIOCGIFRXR: + error = ixgbe_rxrinfo(sc, (struct if_rxrinfo *)ifr->ifr_data); + break; + + default: + error = ether_ioctl(ifp, &sc->arpcom, command, data); + } + + switch (error) { + case 0: + if (command == SIOCSIFMTU) + ixv_init(sc); + break; + case ENETRESET: + if (ifp->if_flags & IFF_RUNNING) { + ixv_disable_intr(sc); + ixv_iff(sc); + ixv_enable_intr(sc); + } + error = 0; + } + + splx(s); + return (error); +} /* ixv_ioctl */ + +/************************************************************************ + * ixv_allocate_msix - Setup MSI-X Interrupt resources and handlers + ************************************************************************/ +static int +ixv_allocate_msix(struct ix_softc *sc) +{ + struct ixgbe_osdep *os = &sc->osdep; + struct pci_attach_args *pa = &os->os_pa; + int i = 0, error = 0, off; + struct ix_queue *que; + pci_intr_handle_t ih; + pcireg_t reg; + + for (i = 0, que = sc->queues; i < sc->num_queues; i++, que++) { + if (pci_intr_map_msix(pa, i, &ih)) { + printf("ixv_allocate_msix: " + "pci_intr_map_msix vec %d failed\n", i); + error = ENOMEM; + goto fail; + } + + que->tag = pci_intr_establish_cpu(pa->pa_pc, ih, + IPL_NET | IPL_MPSAFE, intrmap_cpu(sc->sc_intrmap, i), + ixv_msix_que, que, que->name); + if (que->tag == NULL) { + printf("ixv_allocate_msix: " + "pci_intr_establish vec %d failed\n", i); + error = ENOMEM; + goto fail; + } + + que->msix = i; + } + + /* and Mailbox */ + if (pci_intr_map_msix(pa, i, &ih)) { + printf("ixgbe_allocate_msix: " + "pci_intr_map_msix mbox vector failed\n"); + error = ENOMEM; + goto fail; + } + + sc->tag = pci_intr_establish(pa->pa_pc, ih, IPL_NET | IPL_MPSAFE, + ixv_msix_mbx, sc, sc->dev.dv_xname); + if (sc->tag == NULL) { + printf("ixv_allocate_msix: " + "pci_intr_establish mbox vector failed\n"); + error = ENOMEM; + goto fail; + } + sc->linkvec = i; + + /* + * Due to a broken design QEMU will fail to properly + * enable the guest for MSI-X unless the vectors in + * the table are all set up, so we must rewrite the + * ENABLE in the MSI-X control register again at this + * point to cause it to successfully initialize us. + */ + if (sc->hw.mac.type == ixgbe_mac_82599_vf) { + pci_get_capability(pa->pa_pc, pa->pa_tag, PCI_CAP_MSIX, &off, NULL); + reg = pci_conf_read(pa->pa_pc, pa->pa_tag, off); + pci_conf_write(pa->pa_pc, pa->pa_tag, off, reg | PCI_MSIX_MC_MSIXE); + } + + printf(", %s, %d queue%s\n", pci_intr_string(pa->pa_pc, ih), + i, (i > 1) ? "s" : ""); + + return (0); + +fail: + for (que = sc->queues; i > 0; i--, que++) { + if (que->tag == NULL) + continue; + pci_intr_disestablish(pa->pa_pc, que->tag); + que->tag = NULL; + } + return (error); +} /* ixv_allocate_msix */ + +#if NKSTAT > 0 +enum ixv_counter_idx { + ixv_good_packets_received_count, + ixv_good_packets_transmitted_count, + ixv_good_octets_received_count, + ixv_good_octets_transmitted_count, + ixv_multicast_packets_received_count, + + ixv_counter_num, +}; + +CTASSERT(KSTAT_KV_U_PACKETS <= 0xff); +CTASSERT(KSTAT_KV_U_BYTES <= 0xff); + +struct ixv_counter { + char name[KSTAT_KV_NAMELEN]; + uint32_t reg; + uint8_t width; + uint8_t unit; +}; + +static const struct ixv_counter ixv_counters[ixv_counter_num] = { + [ixv_good_packets_received_count] = { "rx good", IXGBE_VFGPRC, 32, KSTAT_KV_U_PACKETS }, + [ixv_good_packets_transmitted_count] = { "tx good", IXGBE_VFGPTC, 32, KSTAT_KV_U_PACKETS }, + [ixv_good_octets_received_count] = { "rx total", IXGBE_VFGORC_LSB, 36, KSTAT_KV_U_BYTES }, + [ixv_good_octets_transmitted_count] = { "tx total", IXGBE_VFGOTC_LSB, 36, KSTAT_KV_U_BYTES }, + [ixv_multicast_packets_received_count] = { "rx mcast", IXGBE_VFMPRC, 32, KSTAT_KV_U_PACKETS }, +}; + +struct ixv_rxq_kstats { + struct kstat_kv qprc; + struct kstat_kv qbrc; + struct kstat_kv qprdc; +}; + +static const struct ixv_rxq_kstats ixv_rxq_kstats_tpl = { + KSTAT_KV_UNIT_INITIALIZER("packets", + KSTAT_KV_T_COUNTER64, KSTAT_KV_U_PACKETS), + KSTAT_KV_UNIT_INITIALIZER("bytes", + KSTAT_KV_T_COUNTER64, KSTAT_KV_U_BYTES), + KSTAT_KV_UNIT_INITIALIZER("qdrops", + KSTAT_KV_T_COUNTER64, KSTAT_KV_U_PACKETS), +}; + +struct ixv_txq_kstats { + struct kstat_kv qptc; + struct kstat_kv qbtc; +}; + +static const struct ixv_txq_kstats ixv_txq_kstats_tpl = { + KSTAT_KV_UNIT_INITIALIZER("packets", + KSTAT_KV_T_COUNTER64, KSTAT_KV_U_PACKETS), + KSTAT_KV_UNIT_INITIALIZER("bytes", + KSTAT_KV_T_COUNTER64, KSTAT_KV_U_BYTES), +}; + +static int ixv_kstats_read(struct kstat *ks); +static int ixv_rxq_kstats_read(struct kstat *ks); +static int ixv_txq_kstats_read(struct kstat *ks); + +static void +ixv_kstats(struct ix_softc *sc) +{ + struct kstat *ks; + struct kstat_kv *kvs; + unsigned int i; + + mtx_init(&sc->sc_kstat_mtx, IPL_SOFTCLOCK); + timeout_set(&sc->sc_kstat_tmo, ixv_kstats_tick, sc); + + ks = kstat_create(sc->dev.dv_xname, 0, "ixv-stats", 0, + KSTAT_T_KV, 0); + if (ks == NULL) + return; + + kvs = mallocarray(nitems(ixv_counters), sizeof(*kvs), + M_DEVBUF, M_WAITOK|M_ZERO); + + for (i = 0; i < nitems(ixv_counters); i++) { + const struct ixv_counter *ixc = &ixv_counters[i]; + + kstat_kv_unit_init(&kvs[i], ixc->name, + KSTAT_KV_T_COUNTER64, ixc->unit); + } + + kstat_set_mutex(ks, &sc->sc_kstat_mtx); + ks->ks_softc = sc; + ks->ks_data = kvs; + ks->ks_datalen = nitems(ixv_counters) * sizeof(*kvs); + ks->ks_read = ixv_kstats_read; + + sc->sc_kstat = ks; + kstat_install(ks); +} + +static void +ixv_rxq_kstats(struct ix_softc *sc, struct ix_rxring *rxr) +{ + struct ixv_rxq_kstats *stats; + struct kstat *ks; + + ks = kstat_create(sc->dev.dv_xname, 0, "ixv-rxq", rxr->me, + KSTAT_T_KV, 0); + if (ks == NULL) + return; + + stats = malloc(sizeof(*stats), M_DEVBUF, M_WAITOK|M_ZERO); + *stats = ixv_rxq_kstats_tpl; + + kstat_set_mutex(ks, &sc->sc_kstat_mtx); + ks->ks_softc = rxr; + ks->ks_data = stats; + ks->ks_datalen = sizeof(*stats); + ks->ks_read = ixv_rxq_kstats_read; + + rxr->kstat = ks; + kstat_install(ks); +} + +static void +ixv_txq_kstats(struct ix_softc *sc, struct ix_txring *txr) +{ + struct ixv_txq_kstats *stats; + struct kstat *ks; + + ks = kstat_create(sc->dev.dv_xname, 0, "ixv-txq", txr->me, + KSTAT_T_KV, 0); + if (ks == NULL) + return; + + stats = malloc(sizeof(*stats), M_DEVBUF, M_WAITOK|M_ZERO); + *stats = ixv_txq_kstats_tpl; + + kstat_set_mutex(ks, &sc->sc_kstat_mtx); + ks->ks_softc = txr; + ks->ks_data = stats; + ks->ks_datalen = sizeof(*stats); + ks->ks_read = ixv_txq_kstats_read; + + txr->kstat = ks; + kstat_install(ks); +} + +/********************************************************************** + * + * Update the board statistics counters. + * + **********************************************************************/ + +static void +ixv_kstats_tick(void *arg) +{ + struct ix_softc *sc = arg; + int i; + + timeout_add_sec(&sc->sc_kstat_tmo, 1); + + mtx_enter(&sc->sc_kstat_mtx); + ixv_kstats_read(sc->sc_kstat); + for (i = 0; i < sc->num_queues; i++) { + ixv_rxq_kstats_read(sc->rx_rings[i].kstat); + ixv_txq_kstats_read(sc->tx_rings[i].kstat); + } + mtx_leave(&sc->sc_kstat_mtx); +} + +static uint64_t +ixv_read36(struct ixgbe_hw *hw, bus_size_t loreg, bus_size_t hireg) +{ + uint64_t lo, hi; + + lo = IXGBE_READ_REG(hw, loreg); + hi = IXGBE_READ_REG(hw, hireg); + + return (((hi & 0xf) << 32) | lo); +} + +static int +ixv_kstats_read(struct kstat *ks) +{ + struct ix_softc *sc = ks->ks_softc; + struct kstat_kv *kvs = ks->ks_data; + struct ixgbe_hw *hw = &sc->hw; + unsigned int i; + + for (i = 0; i < nitems(ixv_counters); i++) { + const struct ixv_counter *ixc = &ixv_counters[i]; + uint32_t reg = ixc->reg; + uint64_t v; + + if (reg == 0) + continue; + + if (ixc->width > 32) + v = ixv_read36(hw, reg, reg + 4); + else + v = IXGBE_READ_REG(hw, reg); + + kstat_kv_u64(&kvs[i]) = v; + } + + getnanouptime(&ks->ks_updated); + + return (0); +} + +int +ixv_rxq_kstats_read(struct kstat *ks) +{ + struct ixv_rxq_kstats *stats = ks->ks_data; + struct ix_rxring *rxr = ks->ks_softc; + struct ix_softc *sc = rxr->sc; + struct ixgbe_hw *hw = &sc->hw; + uint32_t i = rxr->me; + + kstat_kv_u64(&stats->qprc) += IXGBE_READ_REG(hw, IXGBE_QPRC(i)); + kstat_kv_u64(&stats->qprdc) += IXGBE_READ_REG(hw, IXGBE_QPRDC(i)); + kstat_kv_u64(&stats->qbrc) += + ixv_read36(hw, IXGBE_QBRC_L(i), IXGBE_QBRC_H(i)); + + getnanouptime(&ks->ks_updated); + + return (0); +} + +int +ixv_txq_kstats_read(struct kstat *ks) +{ + struct ixv_txq_kstats *stats = ks->ks_data; + struct ix_txring *txr = ks->ks_softc; + struct ix_softc *sc = txr->sc; + struct ixgbe_hw *hw = &sc->hw; + uint32_t i = txr->me; + + kstat_kv_u64(&stats->qptc) += IXGBE_READ_REG(hw, IXGBE_QPTC(i)); + kstat_kv_u64(&stats->qbtc) += + ixv_read36(hw, IXGBE_QBTC_L(i), IXGBE_QBTC_H(i)); + + getnanouptime(&ks->ks_updated); + + return (0); +} +#endif /* NKVSTAT > 0 */ diff --git a/sys/dev/pci/if_mcx.c b/sys/dev/pci/if_mcx.c index cef354d2d..fc6036dd1 100644 --- a/sys/dev/pci/if_mcx.c +++ b/sys/dev/pci/if_mcx.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_mcx.c,v 1.116 2024/10/04 06:37:22 jmatthew Exp $ */ +/* $OpenBSD: if_mcx.c,v 1.118 2024/12/20 03:31:09 jmatthew Exp $ */ /* * Copyright (c) 2017 David Gwynne @@ -919,7 +919,6 @@ struct mcx_cap_device { #define MCX_CAP_DEVICE_DC_CONNECT_CP 0x00040000 #define MCX_CAP_DEVICE_DC_CNAK_DRACE 0x00020000 #define MCX_CAP_DEVICE_DRAIN_SIGERR 0x00010000 -#define MCX_CAP_DEVICE_DRAIN_SIGERR 0x00010000 #define MCX_CAP_DEVICE_CMDIF_CHECKSUM 0x0000c000 #define MCX_CAP_DEVICE_SIGERR_QCE 0x00002000 #define MCX_CAP_DEVICE_WQ_SIGNATURE 0x00000800 @@ -8279,7 +8278,7 @@ mcx_dmamem_alloc(struct mcx_softc *sc, struct mcx_dmamem *mxm, return (1); if (bus_dmamem_alloc(sc->sc_dmat, mxm->mxm_size, align, 0, &mxm->mxm_seg, 1, &mxm->mxm_nsegs, - BUS_DMA_WAITOK | BUS_DMA_ZERO) != 0) + BUS_DMA_WAITOK | BUS_DMA_ZERO | BUS_DMA_64BIT) != 0) goto destroy; if (bus_dmamem_map(sc->sc_dmat, &mxm->mxm_seg, mxm->mxm_nsegs, mxm->mxm_size, &mxm->mxm_kva, BUS_DMA_WAITOK) != 0) @@ -8327,7 +8326,8 @@ mcx_hwmem_alloc(struct mcx_softc *sc, struct mcx_hwmem *mhm, unsigned int pages) seglen = sizeof(*segs) * pages; if (bus_dmamem_alloc(sc->sc_dmat, len, MCX_PAGE_SIZE, 0, - segs, pages, &mhm->mhm_seg_count, BUS_DMA_NOWAIT) != 0) + segs, pages, &mhm->mhm_seg_count, + BUS_DMA_NOWAIT|BUS_DMA_64BIT) != 0) goto free_segs; if (mhm->mhm_seg_count < pages) { @@ -8350,7 +8350,7 @@ mcx_hwmem_alloc(struct mcx_softc *sc, struct mcx_hwmem *mhm, unsigned int pages) mhm->mhm_segs = segs; if (bus_dmamap_create(sc->sc_dmat, len, pages, MCX_PAGE_SIZE, - MCX_PAGE_SIZE, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW /*|BUS_DMA_64BIT*/, + MCX_PAGE_SIZE, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW|BUS_DMA_64BIT, &mhm->mhm_map) != 0) goto free_dmamem; diff --git a/sys/dev/pci/if_qwz_pci.c b/sys/dev/pci/if_qwz_pci.c index 6acaade99..cbddfe285 100644 --- a/sys/dev/pci/if_qwz_pci.c +++ b/sys/dev/pci/if_qwz_pci.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_qwz_pci.c,v 1.4 2024/08/20 21:24:15 patrick Exp $ */ +/* $OpenBSD: if_qwz_pci.c,v 1.6 2024/12/09 09:35:33 patrick Exp $ */ /* * Copyright 2023 Stefan Sperling @@ -196,9 +196,8 @@ #define MHI_CHAN_CTX_POLLCFG_MASK GENMASK(15, 10) #define MHI_CHAN_CTX_RESERVED_MASK GENMASK(31, 16) -#define QWZ_MHI_CONFIG_QCA6390_MAX_CHANNELS 128 -#define QWZ_MHI_CONFIG_QCA6390_TIMEOUT_MS 2000 -#define QWZ_MHI_CONFIG_QCA9074_MAX_CHANNELS 30 +#define QWZ_MHI_CONFIG_WCN7850_MAX_CHANNELS 128 +#define QWZ_MHI_CONFIG_WCN7850_TIMEOUT_MS 2000 #define MHI_CHAN_TYPE_INVALID 0 #define MHI_CHAN_TYPE_OUTBOUND 1 /* to device */ @@ -392,8 +391,7 @@ void qwz_pci_attach_hook(struct device *); void qwz_pci_free_xfer_rings(struct qwz_pci_softc *); int qwz_pci_alloc_xfer_ring(struct qwz_softc *, struct qwz_pci_xfer_ring *, uint32_t, uint32_t, uint32_t, size_t); -int qwz_pci_alloc_xfer_rings_qca6390(struct qwz_pci_softc *); -int qwz_pci_alloc_xfer_rings_qcn9074(struct qwz_pci_softc *); +int qwz_pci_alloc_xfer_rings_wcn7850(struct qwz_pci_softc *); void qwz_pci_free_event_rings(struct qwz_pci_softc *); int qwz_pci_alloc_event_ring(struct qwz_softc *, struct qwz_pci_event_ring *, uint32_t, uint32_t, uint32_t, size_t); @@ -489,7 +487,7 @@ static const struct qwz_pci_ops qwz_pci_ops_wcn7850 = { .release = qwz_pci_bus_release, .window_write32 = qwz_pci_window_write32, .window_read32 = qwz_pci_window_read32, - .alloc_xfer_rings = qwz_pci_alloc_xfer_rings_qca6390, + .alloc_xfer_rings = qwz_pci_alloc_xfer_rings_wcn7850, }; const struct cfattach qwz_pci_ca = { @@ -825,6 +823,7 @@ qwz_pci_attach(struct device *parent, struct device *self, void *aux) case PCI_PRODUCT_QUALCOMM_WCN7850: sc->static_window_map = 0; psc->sc_pci_ops = &qwz_pci_ops_wcn7850; + sc->hal_rx_ops = &hal_rx_wcn7850_ops; sc->id.bdf_search = ATH12K_BDF_SEARCH_BUS_AND_BOARD; qwz_pci_read_hw_version(sc, &soc_hw_version_major, &soc_hw_version_minor); @@ -833,12 +832,12 @@ qwz_pci_attach(struct device *parent, struct device *self, void *aux) sc->sc_hw_rev = ATH12K_HW_WCN7850_HW20; break; default: - printf(": unknown hardware version found for WCN785: " + printf(": unknown hardware version found for WCN7850: " "%d\n", soc_hw_version_major); return; } - psc->max_chan = QWZ_MHI_CONFIG_QCA6390_MAX_CHANNELS; + psc->max_chan = QWZ_MHI_CONFIG_WCN7850_MAX_CHANNELS; break; default: printf(": unsupported chip\n"); @@ -1191,7 +1190,7 @@ fail: } int -qwz_pci_alloc_xfer_rings_qca6390(struct qwz_pci_softc *psc) +qwz_pci_alloc_xfer_rings_wcn7850(struct qwz_pci_softc *psc) { struct qwz_softc *sc = &psc->sc_sc; int ret; @@ -1214,30 +1213,6 @@ fail: return ret; } -int -qwz_pci_alloc_xfer_rings_qcn9074(struct qwz_pci_softc *psc) -{ - struct qwz_softc *sc = &psc->sc_sc; - int ret; - - ret = qwz_pci_alloc_xfer_ring(sc, - &psc->xfer_rings[QWZ_PCI_XFER_RING_IPCR_OUTBOUND], - 20, MHI_CHAN_TYPE_OUTBOUND, 1, 32); - if (ret) - goto fail; - - ret = qwz_pci_alloc_xfer_ring(sc, - &psc->xfer_rings[QWZ_PCI_XFER_RING_IPCR_INBOUND], - 21, MHI_CHAN_TYPE_INBOUND, 1, 32); - if (ret) - goto fail; - - return 0; -fail: - qwz_pci_free_xfer_rings(psc); - return ret; -} - void qwz_pci_free_event_rings(struct qwz_pci_softc *psc) { diff --git a/sys/dev/pci/if_se.c b/sys/dev/pci/if_se.c index 4a5b40dc5..18bd06c18 100644 --- a/sys/dev/pci/if_se.c +++ b/sys/dev/pci/if_se.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_se.c,v 1.26 2024/08/31 16:23:09 deraadt Exp $ */ +/* $OpenBSD: if_se.c,v 1.27 2024/11/05 18:58:59 miod Exp $ */ /*- * Copyright (c) 2009, 2010 Christopher Zimmermann @@ -142,7 +142,7 @@ const struct cfattach se_ca = { }; struct cfdriver se_cd = { - 0, "se", DV_IFNET + NULL, "se", DV_IFNET }; uint32_t diff --git a/sys/dev/pci/if_sk.c b/sys/dev/pci/if_sk.c index 400d8dcda..bda3dad08 100644 --- a/sys/dev/pci/if_sk.c +++ b/sys/dev/pci/if_sk.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_sk.c,v 1.199 2024/09/04 07:54:52 mglocker Exp $ */ +/* $OpenBSD: if_sk.c,v 1.200 2024/11/05 18:58:59 miod Exp $ */ /* * Copyright (c) 1997, 1998, 1999, 2000 @@ -2529,7 +2529,7 @@ const struct cfattach skc_ca = { }; struct cfdriver skc_cd = { - 0, "skc", DV_DULL + NULL, "skc", DV_DULL }; const struct cfattach sk_ca = { diff --git a/sys/dev/pci/ixgbe.c b/sys/dev/pci/ixgbe.c index 965d70730..51ee44562 100644 --- a/sys/dev/pci/ixgbe.c +++ b/sys/dev/pci/ixgbe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ixgbe.c,v 1.27 2022/01/27 18:28:45 bluhm Exp $ */ +/* $OpenBSD: ixgbe.c,v 1.28 2024/10/27 04:44:41 yasuoka Exp $ */ /****************************************************************************** SPDX-License-Identifier: BSD-3-Clause @@ -70,7 +70,6 @@ int32_t prot_autoc_write_generic(struct ixgbe_hw *, uint32_t, bool); /* MBX */ int32_t ixgbe_poll_for_msg(struct ixgbe_hw *hw, uint16_t mbx_id); int32_t ixgbe_poll_for_ack(struct ixgbe_hw *hw, uint16_t mbx_id); -uint32_t ixgbe_read_v2p_mailbox(struct ixgbe_hw *hw); int32_t ixgbe_check_for_bit_pf(struct ixgbe_hw *hw, uint32_t mask, int32_t index); int32_t ixgbe_check_for_msg_pf(struct ixgbe_hw *hw, uint16_t vf_number); @@ -4473,7 +4472,6 @@ void ixgbe_enable_rx(struct ixgbe_hw *hw) int32_t ixgbe_read_mbx(struct ixgbe_hw *hw, uint32_t *msg, uint16_t size, uint16_t mbx_id) { struct ixgbe_mbx_info *mbx = &hw->mbx; - int32_t ret_val = IXGBE_ERR_MBX; DEBUGFUNC("ixgbe_read_mbx"); @@ -4482,7 +4480,40 @@ int32_t ixgbe_read_mbx(struct ixgbe_hw *hw, uint32_t *msg, uint16_t size, uint16 size = mbx->size; if (mbx->ops.read) - ret_val = mbx->ops.read(hw, msg, size, mbx_id); + return mbx->ops.read(hw, msg, size, mbx_id); + + return IXGBE_ERR_CONFIG; +} + +/** + * ixgbe_poll_mbx - Wait for message and read it from the mailbox + * @hw: pointer to the HW structure + * @msg: The message buffer + * @size: Length of buffer + * @mbx_id: id of mailbox to read + * + * returns SUCCESS if it successfully read message from buffer + **/ +int32_t ixgbe_poll_mbx(struct ixgbe_hw *hw, uint32_t *msg, uint16_t size, + uint16_t mbx_id) +{ + struct ixgbe_mbx_info *mbx = &hw->mbx; + int32_t ret_val; + + DEBUGFUNC("ixgbe_poll_mbx"); + + if (!mbx->ops.read || !mbx->ops.check_for_msg || + !mbx->timeout) + return IXGBE_ERR_CONFIG; + + /* limit read to size of mailbox */ + if (size > mbx->size) + size = mbx->size; + + ret_val = ixgbe_poll_for_msg(hw, mbx_id); + /* if ack received read message, otherwise we timed out */ + if (!ret_val) + return mbx->ops.read(hw, msg, size, mbx_id); return ret_val; } @@ -4499,15 +4530,25 @@ int32_t ixgbe_read_mbx(struct ixgbe_hw *hw, uint32_t *msg, uint16_t size, uint16 int32_t ixgbe_write_mbx(struct ixgbe_hw *hw, uint32_t *msg, uint16_t size, uint16_t mbx_id) { struct ixgbe_mbx_info *mbx = &hw->mbx; - int32_t ret_val = IXGBE_SUCCESS; + int32_t ret_val = IXGBE_ERR_MBX; DEBUGFUNC("ixgbe_write_mbx"); - if (size > mbx->size) - ret_val = IXGBE_ERR_MBX; + /* + * exit if either we can't write, release + * or there is no timeout defined + */ + if (!mbx->ops.write || !mbx->ops.check_for_ack || + !mbx->ops.release || !mbx->timeout) + return IXGBE_ERR_CONFIG; - else if (mbx->ops.write) + if (size > mbx->size) { + ret_val = IXGBE_ERR_PARAM; + ERROR_REPORT2(IXGBE_ERROR_ARGUMENT, + "Invalid mailbox message size %u", size); + } else { ret_val = mbx->ops.write(hw, msg, size, mbx_id); + } return ret_val; } @@ -4587,7 +4628,7 @@ int32_t ixgbe_poll_for_msg(struct ixgbe_hw *hw, uint16_t mbx_id) DEBUGFUNC("ixgbe_poll_for_msg"); if (!countdown || !mbx->ops.check_for_msg) - goto out; + return IXGBE_ERR_CONFIG; while (countdown && mbx->ops.check_for_msg(hw, mbx_id)) { countdown--; @@ -4596,12 +4637,13 @@ int32_t ixgbe_poll_for_msg(struct ixgbe_hw *hw, uint16_t mbx_id) usec_delay(mbx->usec_delay); } - if (countdown == 0) + if (countdown == 0) { ERROR_REPORT2(IXGBE_ERROR_POLLING, - "Polling for VF%d mailbox message timedout", mbx_id); + "Polling for VF%u mailbox message timedout", mbx_id); + return IXGBE_ERR_TIMEOUT; + } -out: - return countdown ? IXGBE_SUCCESS : IXGBE_ERR_MBX; + return IXGBE_SUCCESS; } /** @@ -4619,7 +4661,7 @@ int32_t ixgbe_poll_for_ack(struct ixgbe_hw *hw, uint16_t mbx_id) DEBUGFUNC("ixgbe_poll_for_ack"); if (!countdown || !mbx->ops.check_for_ack) - goto out; + return IXGBE_ERR_CONFIG; while (countdown && mbx->ops.check_for_ack(hw, mbx_id)) { countdown--; @@ -4628,12 +4670,180 @@ int32_t ixgbe_poll_for_ack(struct ixgbe_hw *hw, uint16_t mbx_id) usec_delay(mbx->usec_delay); } - if (countdown == 0) + if (countdown == 0) { ERROR_REPORT2(IXGBE_ERROR_POLLING, - "Polling for VF%d mailbox ack timedout", mbx_id); + "Polling for VF%u mailbox ack timedout", mbx_id); + return IXGBE_ERR_TIMEOUT; + } -out: - return countdown ? IXGBE_SUCCESS : IXGBE_ERR_MBX; + return IXGBE_SUCCESS; +} + +/** + * ixgbe_read_mailbox_vf - read VF's mailbox register + * @hw: pointer to the HW structure + * + * This function is used to read the mailbox register dedicated for VF without + * losing the read to clear status bits. + **/ +static uint32_t ixgbe_read_mailbox_vf(struct ixgbe_hw *hw) +{ + uint32_t vf_mailbox = IXGBE_READ_REG(hw, IXGBE_VFMAILBOX); + + vf_mailbox |= hw->mbx.vf_mailbox; + hw->mbx.vf_mailbox |= vf_mailbox & IXGBE_VFMAILBOX_R2C_BITS; + + return vf_mailbox; +} + +static void ixgbe_clear_msg_vf(struct ixgbe_hw *hw) +{ + uint32_t vf_mailbox = ixgbe_read_mailbox_vf(hw); + + if (vf_mailbox & IXGBE_VFMAILBOX_PFSTS) { + hw->mbx.stats.reqs++; + hw->mbx.vf_mailbox &= ~IXGBE_VFMAILBOX_PFSTS; + } +} + +static void ixgbe_clear_ack_vf(struct ixgbe_hw *hw) +{ + uint32_t vf_mailbox = ixgbe_read_mailbox_vf(hw); + + if (vf_mailbox & IXGBE_VFMAILBOX_PFACK) { + hw->mbx.stats.acks++; + hw->mbx.vf_mailbox &= ~IXGBE_VFMAILBOX_PFACK; + } +} + +static void ixgbe_clear_rst_vf(struct ixgbe_hw *hw) +{ + uint32_t vf_mailbox = ixgbe_read_mailbox_vf(hw); + + if (vf_mailbox & (IXGBE_VFMAILBOX_RSTI | IXGBE_VFMAILBOX_RSTD)) { + hw->mbx.stats.rsts++; + hw->mbx.vf_mailbox &= ~(IXGBE_VFMAILBOX_RSTI | + IXGBE_VFMAILBOX_RSTD); + } +} + +/** + * ixgbe_check_for_bit_vf - Determine if a status bit was set + * @hw: pointer to the HW structure + * @mask: bitmask for bits to be tested and cleared + * + * This function is used to check for the read to clear bits within + * the V2P mailbox. + **/ +static int32_t ixgbe_check_for_bit_vf(struct ixgbe_hw *hw, uint32_t mask) +{ + uint32_t vf_mailbox = ixgbe_read_mailbox_vf(hw); + + if (vf_mailbox & mask) + return IXGBE_SUCCESS; + + return IXGBE_ERR_MBX; +} + +/** + * ixgbe_check_for_msg_vf - checks to see if the PF has sent mail + * @hw: pointer to the HW structure + * @mbx_id: id of mailbox to check + * + * returns SUCCESS if the PF has set the Status bit or else ERR_MBX + **/ +static int32_t ixgbe_check_for_msg_vf(struct ixgbe_hw *hw, uint16_t mbx_id) +{ + DEBUGFUNC("ixgbe_check_for_msg_vf"); + + if (!ixgbe_check_for_bit_vf(hw, IXGBE_VFMAILBOX_PFSTS)) + return IXGBE_SUCCESS; + + return IXGBE_ERR_MBX; +} + +/** + * ixgbe_check_for_ack_vf - checks to see if the PF has ACK'd + * @hw: pointer to the HW structure + * @mbx_id: id of mailbox to check + * + * returns SUCCESS if the PF has set the ACK bit or else ERR_MBX + **/ +static int32_t ixgbe_check_for_ack_vf(struct ixgbe_hw *hw, uint16_t mbx_id) +{ + DEBUGFUNC("ixgbe_check_for_ack_vf"); + + if (!ixgbe_check_for_bit_vf(hw, IXGBE_VFMAILBOX_PFACK)) { + /* TODO: should this be autocleared? */ + ixgbe_clear_ack_vf(hw); + return IXGBE_SUCCESS; + } + + return IXGBE_ERR_MBX; +} + +/** + * ixgbe_check_for_rst_vf - checks to see if the PF has reset + * @hw: pointer to the HW structure + * @mbx_id: id of mailbox to check + * + * returns TRUE if the PF has set the reset done bit or else FALSE + **/ +static int32_t ixgbe_check_for_rst_vf(struct ixgbe_hw *hw, uint16_t mbx_id) +{ + DEBUGFUNC("ixgbe_check_for_rst_vf"); + + if (!ixgbe_check_for_bit_vf(hw, IXGBE_VFMAILBOX_RSTI | + IXGBE_VFMAILBOX_RSTD)) { + /* TODO: should this be autocleared? */ + ixgbe_clear_rst_vf(hw); + return IXGBE_SUCCESS; + } + + return IXGBE_ERR_MBX; +} + +/** + * ixgbe_obtain_mbx_lock_vf - obtain mailbox lock + * @hw: pointer to the HW structure + * + * return SUCCESS if we obtained the mailbox lock + **/ +static int32_t ixgbe_obtain_mbx_lock_vf(struct ixgbe_hw *hw) +{ + struct ixgbe_mbx_info *mbx = &hw->mbx; + int countdown = mbx->timeout; + int32_t ret_val = IXGBE_ERR_MBX; + uint32_t vf_mailbox; + + DEBUGFUNC("ixgbe_obtain_mbx_lock_vf"); + + if (!mbx->timeout) + return IXGBE_ERR_CONFIG; + + while (countdown--) { + /* Reserve mailbox for VF use */ + vf_mailbox = ixgbe_read_mailbox_vf(hw); + vf_mailbox |= IXGBE_VFMAILBOX_VFU; + IXGBE_WRITE_REG(hw, IXGBE_VFMAILBOX, vf_mailbox); + + /* Verify that VF is the owner of the lock */ + if (ixgbe_read_mailbox_vf(hw) & IXGBE_VFMAILBOX_VFU) { + ret_val = IXGBE_SUCCESS; + break; + } + + /* Wait a bit before trying again */ + usec_delay(mbx->usec_delay); + } + + if (ret_val != IXGBE_SUCCESS) { + ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE, + "Failed to obtain mailbox lock"); + ret_val = IXGBE_ERR_TIMEOUT; + } + + return ret_val; } /** @@ -4711,34 +4921,14 @@ void ixgbe_init_mbx_ops_generic(struct ixgbe_hw *hw) mbx->ops.write_posted = ixgbe_write_posted_mbx; } -/** - * ixgbe_read_v2p_mailbox - read v2p mailbox - * @hw: pointer to the HW structure - * - * This function is used to read the v2p mailbox without losing the read to - * clear status bits. - **/ -uint32_t ixgbe_read_v2p_mailbox(struct ixgbe_hw *hw) -{ - uint32_t v2p_mailbox = IXGBE_READ_REG(hw, IXGBE_VFMAILBOX); - - v2p_mailbox |= hw->mbx.v2p_mailbox; - hw->mbx.v2p_mailbox |= v2p_mailbox & IXGBE_VFMAILBOX_R2C_BITS; - - return v2p_mailbox; -} - int32_t ixgbe_check_for_bit_pf(struct ixgbe_hw *hw, uint32_t mask, int32_t index) { - uint32_t mbvficr = IXGBE_READ_REG(hw, IXGBE_MBVFICR(index)); - int32_t ret_val = IXGBE_ERR_MBX; + uint32_t pfmbicr = IXGBE_READ_REG(hw, IXGBE_PFMBICR(index)); - if (mbvficr & mask) { - ret_val = IXGBE_SUCCESS; - IXGBE_WRITE_REG(hw, IXGBE_MBVFICR(index), mask); - } + if (pfmbicr & mask) + return IXGBE_SUCCESS; - return ret_val; + return IXGBE_ERR_MBX; } /** @@ -4748,21 +4938,47 @@ int32_t ixgbe_check_for_bit_pf(struct ixgbe_hw *hw, uint32_t mask, int32_t index * * returns SUCCESS if the VF has set the Status bit or else ERR_MBX **/ -int32_t ixgbe_check_for_msg_pf(struct ixgbe_hw *hw, uint16_t vf_number) +int32_t ixgbe_check_for_msg_pf(struct ixgbe_hw *hw, uint16_t vf_id) { - int32_t ret_val = IXGBE_ERR_MBX; - int32_t index = IXGBE_MBVFICR_INDEX(vf_number); - uint32_t vf_bit = vf_number % 16; - + uint32_t vf_shift = IXGBE_PFMBICR_SHIFT(vf_id); + int32_t index = IXGBE_PFMBICR_INDEX(vf_id); DEBUGFUNC("ixgbe_check_for_msg_pf"); - if (!ixgbe_check_for_bit_pf(hw, IXGBE_MBVFICR_VFREQ_VF1 << vf_bit, - index)) { - ret_val = IXGBE_SUCCESS; - hw->mbx.stats.reqs++; - } + if (!ixgbe_check_for_bit_pf(hw, IXGBE_PFMBICR_VFREQ_VF1 << vf_shift, + index)) + return IXGBE_SUCCESS; - return ret_val; + return IXGBE_ERR_MBX; +} + +static void ixgbe_clear_msg_pf(struct ixgbe_hw *hw, uint16_t vf_id) +{ + uint32_t vf_shift = IXGBE_PFMBICR_SHIFT(vf_id); + int32_t index = IXGBE_PFMBICR_INDEX(vf_id); + uint32_t pfmbicr; + + pfmbicr = IXGBE_READ_REG(hw, IXGBE_PFMBICR(index)); + + if (pfmbicr & (IXGBE_PFMBICR_VFREQ_VF1 << vf_shift)) + hw->mbx.stats.reqs++; + + IXGBE_WRITE_REG(hw, IXGBE_PFMBICR(index), + IXGBE_PFMBICR_VFREQ_VF1 << vf_shift); +} + +static void ixgbe_clear_ack_pf(struct ixgbe_hw *hw, uint16_t vf_id) +{ + uint32_t vf_shift = IXGBE_PFMBICR_SHIFT(vf_id); + int32_t index = IXGBE_PFMBICR_INDEX(vf_id); + uint32_t pfmbicr; + + pfmbicr = IXGBE_READ_REG(hw, IXGBE_PFMBICR(index)); + + if (pfmbicr & (IXGBE_PFMBICR_VFACK_VF1 << vf_shift)) + hw->mbx.stats.acks++; + + IXGBE_WRITE_REG(hw, IXGBE_PFMBICR(index), + IXGBE_PFMBICR_VFACK_VF1 << vf_shift); } /** @@ -4772,18 +4988,19 @@ int32_t ixgbe_check_for_msg_pf(struct ixgbe_hw *hw, uint16_t vf_number) * * returns SUCCESS if the VF has set the Status bit or else ERR_MBX **/ -int32_t ixgbe_check_for_ack_pf(struct ixgbe_hw *hw, uint16_t vf_number) +int32_t ixgbe_check_for_ack_pf(struct ixgbe_hw *hw, uint16_t vf_id) { + uint32_t vf_shift = IXGBE_PFMBICR_SHIFT(vf_id); + int32_t index = IXGBE_PFMBICR_INDEX(vf_id); int32_t ret_val = IXGBE_ERR_MBX; - int32_t index = IXGBE_MBVFICR_INDEX(vf_number); - uint32_t vf_bit = vf_number % 16; DEBUGFUNC("ixgbe_check_for_ack_pf"); - if (!ixgbe_check_for_bit_pf(hw, IXGBE_MBVFICR_VFACK_VF1 << vf_bit, + if (!ixgbe_check_for_bit_pf(hw, IXGBE_PFMBICR_VFACK_VF1 << vf_shift, index)) { ret_val = IXGBE_SUCCESS; - hw->mbx.stats.acks++; + /* TODO: should this be autocleared? */ + ixgbe_clear_ack_pf(hw, vf_id); } return ret_val; @@ -4796,24 +5013,24 @@ int32_t ixgbe_check_for_ack_pf(struct ixgbe_hw *hw, uint16_t vf_number) * * returns SUCCESS if the VF has set the Status bit or else ERR_MBX **/ -int32_t ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, uint16_t vf_number) +int32_t ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, uint16_t vf_id) { - uint32_t reg_offset = (vf_number < 32) ? 0 : 1; - uint32_t vf_shift = vf_number % 32; - uint32_t vflre = 0; + uint32_t vf_shift = IXGBE_PFVFLRE_SHIFT(vf_id); + uint32_t index = IXGBE_PFVFLRE_INDEX(vf_id); int32_t ret_val = IXGBE_ERR_MBX; + uint32_t vflre = 0; DEBUGFUNC("ixgbe_check_for_rst_pf"); switch (hw->mac.type) { case ixgbe_mac_82599EB: - vflre = IXGBE_READ_REG(hw, IXGBE_VFLRE(reg_offset)); + vflre = IXGBE_READ_REG(hw, IXGBE_PFVFLRE(index)); break; case ixgbe_mac_X550: case ixgbe_mac_X550EM_x: case ixgbe_mac_X550EM_a: case ixgbe_mac_X540: - vflre = IXGBE_READ_REG(hw, IXGBE_VFLREC(reg_offset)); + vflre = IXGBE_READ_REG(hw, IXGBE_PFVFLREC(index)); break; default: break; @@ -4821,7 +5038,7 @@ int32_t ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, uint16_t vf_number) if (vflre & (1 << vf_shift)) { ret_val = IXGBE_SUCCESS; - IXGBE_WRITE_REG(hw, IXGBE_VFLREC(reg_offset), (1 << vf_shift)); + IXGBE_WRITE_REG(hw, IXGBE_PFVFLREC(index), (1 << vf_shift)); hw->mbx.stats.rsts++; } @@ -4835,24 +5052,40 @@ int32_t ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, uint16_t vf_number) * * return SUCCESS if we obtained the mailbox lock **/ -int32_t ixgbe_obtain_mbx_lock_pf(struct ixgbe_hw *hw, uint16_t vf_number) +int32_t ixgbe_obtain_mbx_lock_pf(struct ixgbe_hw *hw, uint16_t vf_id) { + struct ixgbe_mbx_info *mbx = &hw->mbx; + int countdown = mbx->timeout; int32_t ret_val = IXGBE_ERR_MBX; - uint32_t p2v_mailbox; + uint32_t pf_mailbox; DEBUGFUNC("ixgbe_obtain_mbx_lock_pf"); - /* Take ownership of the buffer */ - IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_number), IXGBE_PFMAILBOX_PFU); + if (!mbx->timeout) + return IXGBE_ERR_CONFIG; - /* reserve mailbox for vf use */ - p2v_mailbox = IXGBE_READ_REG(hw, IXGBE_PFMAILBOX(vf_number)); - if (p2v_mailbox & IXGBE_PFMAILBOX_PFU) - ret_val = IXGBE_SUCCESS; - else - ERROR_REPORT2(IXGBE_ERROR_POLLING, - "Failed to obtain mailbox lock for VF%d", vf_number); + while (countdown--) { + /* Reserve mailbox for PF use */ + pf_mailbox = IXGBE_READ_REG(hw, IXGBE_PFMAILBOX(vf_id)); + pf_mailbox |= IXGBE_PFMAILBOX_PFU; + IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_id), pf_mailbox); + /* Verify that PF is the owner of the lock */ + pf_mailbox = IXGBE_READ_REG(hw, IXGBE_PFMAILBOX(vf_id)); + if (pf_mailbox & IXGBE_PFMAILBOX_PFU) { + ret_val = IXGBE_SUCCESS; + break; + } + + /* Wait a bit before trying again */ + usec_delay(mbx->usec_delay); + } + + if (ret_val != IXGBE_SUCCESS) { + ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE, + "Failed to obtain mailbox lock"); + ret_val = IXGBE_ERR_TIMEOUT; + } return ret_val; } @@ -4867,35 +5100,79 @@ int32_t ixgbe_obtain_mbx_lock_pf(struct ixgbe_hw *hw, uint16_t vf_number) * returns SUCCESS if it successfully copied message into the buffer **/ int32_t ixgbe_write_mbx_pf(struct ixgbe_hw *hw, uint32_t *msg, uint16_t size, - uint16_t vf_number) + uint16_t vf_id) { + uint32_t pf_mailbox; int32_t ret_val; uint16_t i; DEBUGFUNC("ixgbe_write_mbx_pf"); /* lock the mailbox to prevent pf/vf race condition */ - ret_val = ixgbe_obtain_mbx_lock_pf(hw, vf_number); + ret_val = ixgbe_obtain_mbx_lock_pf(hw, vf_id); if (ret_val) - goto out_no_write; + goto out; /* flush msg and acks as we are overwriting the message buffer */ - ixgbe_check_for_msg_pf(hw, vf_number); - ixgbe_check_for_ack_pf(hw, vf_number); + ixgbe_clear_msg_pf(hw, vf_id); + ixgbe_clear_ack_pf(hw, vf_id); /* copy the caller specified message to the mailbox memory buffer */ for (i = 0; i < size; i++) - IXGBE_WRITE_REG_ARRAY(hw, IXGBE_PFMBMEM(vf_number), i, msg[i]); + IXGBE_WRITE_REG_ARRAY(hw, IXGBE_PFMBMEM(vf_id), i, msg[i]); - /* Interrupt VF to tell it a message has been sent and release buffer*/ - IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_number), IXGBE_PFMAILBOX_STS); + /* Interrupt VF to tell it a message has been sent */ + pf_mailbox = IXGBE_READ_REG(hw, IXGBE_PFMAILBOX(vf_id)); + pf_mailbox |= IXGBE_PFMAILBOX_STS; + IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_id), pf_mailbox); + + /* if msg sent wait until we receive an ack */ + ixgbe_poll_for_ack(hw, vf_id); /* update stats */ hw->mbx.stats.msgs_tx++; -out_no_write: - return ret_val; +out: + hw->mbx.ops.release(hw, vf_id); + return ret_val; +} + +/** + * ixgbe_read_mbx_pf_legacy - Read a message from the mailbox + * @hw: pointer to the HW structure + * @msg: The message buffer + * @size: Length of buffer + * @vf_id: the VF index + * + * This function copies a message from the mailbox buffer to the caller's + * memory buffer. The presumption is that the caller knows that there was + * a message due to a VF request so no polling for message is needed. + **/ +static int32_t ixgbe_read_mbx_pf_legacy(struct ixgbe_hw *hw, uint32_t *msg, + uint16_t size, uint16_t vf_id) +{ + int32_t ret_val; + uint16_t i; + + DEBUGFUNC("ixgbe_read_mbx_pf_legacy"); + + /* lock the mailbox to prevent pf/vf race condition */ + ret_val = ixgbe_obtain_mbx_lock_pf(hw, vf_id); + if (ret_val != IXGBE_SUCCESS) + return ret_val; + + /* copy the message to the mailbox memory buffer */ + for (i = 0; i < size; i++) + msg[i] = IXGBE_READ_REG_ARRAY(hw, IXGBE_PFMBMEM(vf_id), i); + + /* Acknowledge the message and release buffer */ + IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_id), IXGBE_PFMAILBOX_ACK); + + /* update stats */ + hw->mbx.stats.msgs_rx++; + + return IXGBE_SUCCESS; } /** @@ -4910,30 +5187,213 @@ out_no_write: * a message due to a VF request so no polling for message is needed. **/ int32_t ixgbe_read_mbx_pf(struct ixgbe_hw *hw, uint32_t *msg, uint16_t size, - uint16_t vf_number) + uint16_t vf_id) { + uint32_t pf_mailbox; int32_t ret_val; uint16_t i; DEBUGFUNC("ixgbe_read_mbx_pf"); - /* lock the mailbox to prevent pf/vf race condition */ - ret_val = ixgbe_obtain_mbx_lock_pf(hw, vf_number); - if (ret_val) - goto out_no_read; + /* check if there is a message from VF */ + ret_val = ixgbe_check_for_msg_pf(hw, vf_id); + if (ret_val != IXGBE_SUCCESS) + return IXGBE_ERR_MBX_NOMSG; + + ixgbe_clear_msg_pf(hw, vf_id); /* copy the message to the mailbox memory buffer */ for (i = 0; i < size; i++) - msg[i] = IXGBE_READ_REG_ARRAY(hw, IXGBE_PFMBMEM(vf_number), i); + msg[i] = IXGBE_READ_REG_ARRAY(hw, IXGBE_PFMBMEM(vf_id), i); /* Acknowledge the message and release buffer */ - IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_number), IXGBE_PFMAILBOX_ACK); + pf_mailbox = IXGBE_READ_REG(hw, IXGBE_PFMAILBOX(vf_id)); + pf_mailbox |= IXGBE_PFMAILBOX_ACK; + IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_id), pf_mailbox); /* update stats */ hw->mbx.stats.msgs_rx++; -out_no_read: - return ret_val; + return IXGBE_SUCCESS; +} + +/** + * ixgbe_release_mbx_lock_dummy - release mailbox lock + * @hw: pointer to the HW structure + * @mbx_id: id of mailbox to read + **/ +static void ixgbe_release_mbx_lock_dummy(struct ixgbe_hw *hw, uint16_t mbx_id) +{ + DEBUGFUNC("ixgbe_release_mbx_lock_dummy"); +} + +/** + * ixgbe_write_mbx_vf_legacy - Write a message to the mailbox + * @hw: pointer to the HW structure + * @msg: The message buffer + * @size: Length of buffer + * @mbx_id: id of mailbox to write + * + * returns SUCCESS if it successfully copied message into the buffer + **/ +static int32_t ixgbe_write_mbx_vf_legacy(struct ixgbe_hw *hw, uint32_t *msg, + uint16_t size, uint16_t mbx_id) +{ + int32_t ret_val; + uint16_t i; + + DEBUGFUNC("ixgbe_write_mbx_vf_legacy"); + + /* lock the mailbox to prevent pf/vf race condition */ + ret_val = ixgbe_obtain_mbx_lock_vf(hw); + if (ret_val) + return ret_val; + + /* flush msg and acks as we are overwriting the message buffer */ + ixgbe_check_for_msg_vf(hw, 0); + ixgbe_clear_msg_vf(hw); + ixgbe_check_for_ack_vf(hw, 0); + ixgbe_clear_ack_vf(hw); + + /* copy the caller specified message to the mailbox memory buffer */ + for (i = 0; i < size; i++) + IXGBE_WRITE_REG_ARRAY(hw, IXGBE_VFMBMEM, i, msg[i]); + + /* update stats */ + hw->mbx.stats.msgs_tx++; + + /* interrupt the PF to tell it a message has been sent */ + IXGBE_WRITE_REG(hw, IXGBE_VFMAILBOX, IXGBE_VFMAILBOX_REQ); + + return IXGBE_SUCCESS; +} + +/** + * ixgbe_read_mbx_vf_legacy - Reads a message from the inbox intended for vf + * @hw: pointer to the HW structure + * @msg: The message buffer + * @size: Length of buffer + * @mbx_id: id of mailbox to read + * + * returns SUCCESS if it successfully read message from buffer + **/ +static int32_t ixgbe_read_mbx_vf_legacy(struct ixgbe_hw *hw, uint32_t *msg, + uint16_t size, uint16_t mbx_id) +{ + int32_t ret_val; + uint16_t i; + + DEBUGFUNC("ixgbe_read_mbx_vf_legacy"); + + /* lock the mailbox to prevent pf/vf race condition */ + ret_val = ixgbe_obtain_mbx_lock_vf(hw); + if (ret_val) + return ret_val; + + /* copy the message from the mailbox memory buffer */ + for (i = 0; i < size; i++) + msg[i] = IXGBE_READ_REG_ARRAY(hw, IXGBE_VFMBMEM, i); + + /* Acknowledge receipt and release mailbox, then we're done */ + IXGBE_WRITE_REG(hw, IXGBE_VFMAILBOX, IXGBE_VFMAILBOX_ACK); + + /* update stats */ + hw->mbx.stats.msgs_rx++; + + return IXGBE_SUCCESS; +} + +/** + * ixgbe_init_mbx_params_vf - set initial values for vf mailbox + * @hw: pointer to the HW structure + * + * Initializes single set the hw->mbx struct to correct values for vf mailbox + * Set of legacy functions is being used here + */ +void ixgbe_init_mbx_params_vf(struct ixgbe_hw *hw) +{ + struct ixgbe_mbx_info *mbx = &hw->mbx; + + mbx->timeout = IXGBE_VF_MBX_INIT_TIMEOUT; + mbx->usec_delay = IXGBE_VF_MBX_INIT_DELAY; + + mbx->size = IXGBE_VFMAILBOX_SIZE; + + mbx->ops.release = ixgbe_release_mbx_lock_dummy; + mbx->ops.read = ixgbe_read_mbx_vf_legacy; + mbx->ops.write = ixgbe_write_mbx_vf_legacy; + mbx->ops.check_for_msg = ixgbe_check_for_msg_vf; + mbx->ops.check_for_ack = ixgbe_check_for_ack_vf; + mbx->ops.check_for_rst = ixgbe_check_for_rst_vf; + mbx->ops.clear = NULL; + + mbx->stats.msgs_tx = 0; + mbx->stats.msgs_rx = 0; + mbx->stats.reqs = 0; + mbx->stats.acks = 0; + mbx->stats.rsts = 0; +} + +/** + * ixgbe_write_mbx_pf_legacy - Places a message in the mailbox + * @hw: pointer to the HW structure + * @msg: The message buffer + * @size: Length of buffer + * @vf_id: the VF index + * + * returns SUCCESS if it successfully copied message into the buffer + **/ +static int32_t ixgbe_write_mbx_pf_legacy(struct ixgbe_hw *hw, uint32_t *msg, + uint16_t size, uint16_t vf_id) +{ + int32_t ret_val; + uint16_t i; + + DEBUGFUNC("ixgbe_write_mbx_pf_legacy"); + + /* lock the mailbox to prevent pf/vf race condition */ + ret_val = ixgbe_obtain_mbx_lock_pf(hw, vf_id); + if (ret_val) + return ret_val; + + /* flush msg and acks as we are overwriting the message buffer */ + ixgbe_check_for_msg_pf(hw, vf_id); + ixgbe_clear_msg_pf(hw, vf_id); + ixgbe_check_for_ack_pf(hw, vf_id); + ixgbe_clear_ack_pf(hw, vf_id); + + /* copy the caller specified message to the mailbox memory buffer */ + for (i = 0; i < size; i++) + IXGBE_WRITE_REG_ARRAY(hw, IXGBE_PFMBMEM(vf_id), i, msg[i]); + + /* Interrupt VF to tell it a message has been sent and release buffer*/ + IXGBE_WRITE_REG(hw, IXGBE_PFMAILBOX(vf_id), IXGBE_PFMAILBOX_STS); + + /* update stats */ + hw->mbx.stats.msgs_tx++; + + return IXGBE_SUCCESS; +} + +/** + * ixgbe_clear_mbx_pf - Clear Mailbox Memory + * @hw: pointer to the HW structure + * @vf_id: the VF index + * + * Set VFMBMEM of given VF to 0x0. + **/ +static int32_t ixgbe_clear_mbx_pf(struct ixgbe_hw *hw, uint16_t vf_id) +{ + uint16_t mbx_size = hw->mbx.size; + uint16_t i; + + if (vf_id > 63) + return IXGBE_ERR_PARAM; + + for (i = 0; i < mbx_size; ++i) + IXGBE_WRITE_REG_ARRAY(hw, IXGBE_PFMBMEM(vf_id), i, 0x0); + + return IXGBE_SUCCESS; } /** @@ -4953,22 +5413,24 @@ void ixgbe_init_mbx_params_pf(struct ixgbe_hw *hw) hw->mac.type != ixgbe_mac_X540) return; - mbx->timeout = 0; - mbx->usec_delay = 0; - + /* Initialize common mailbox settings */ + mbx->timeout = IXGBE_VF_MBX_INIT_TIMEOUT; + mbx->usec_delay = IXGBE_VF_MBX_INIT_DELAY; mbx->size = IXGBE_VFMAILBOX_SIZE; - mbx->ops.read = ixgbe_read_mbx_pf; - mbx->ops.write = ixgbe_write_mbx_pf; - mbx->ops.read_posted = ixgbe_read_posted_mbx; - mbx->ops.write_posted = ixgbe_write_posted_mbx; - mbx->ops.check_for_msg = ixgbe_check_for_msg_pf; - mbx->ops.check_for_ack = ixgbe_check_for_ack_pf; - mbx->ops.check_for_rst = ixgbe_check_for_rst_pf; - + /* Initialize counters with zeroes */ mbx->stats.msgs_tx = 0; mbx->stats.msgs_rx = 0; mbx->stats.reqs = 0; mbx->stats.acks = 0; mbx->stats.rsts = 0; + + /* Initialize mailbox operations */ + mbx->ops.release = ixgbe_release_mbx_lock_dummy; + mbx->ops.read = ixgbe_read_mbx_pf_legacy; + mbx->ops.write = ixgbe_write_mbx_pf_legacy; + mbx->ops.check_for_msg = ixgbe_check_for_msg_pf; + mbx->ops.check_for_ack = ixgbe_check_for_ack_pf; + mbx->ops.check_for_rst = ixgbe_check_for_rst_pf; + mbx->ops.clear = ixgbe_clear_mbx_pf; } diff --git a/sys/dev/pci/ixgbe.h b/sys/dev/pci/ixgbe.h index e0a03bd26..9944b30e5 100644 --- a/sys/dev/pci/ixgbe.h +++ b/sys/dev/pci/ixgbe.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ixgbe.h,v 1.36 2024/06/09 05:18:12 jsg Exp $ */ +/* $OpenBSD: ixgbe.h,v 1.37 2024/10/27 04:44:41 yasuoka Exp $ */ /****************************************************************************** @@ -278,6 +278,7 @@ int32_t ixgbe_clear_vmdq(struct ixgbe_hw *hw, uint32_t rar, uint32_t vmdq); int32_t ixgbe_init_uta_tables(struct ixgbe_hw *hw); void ixgbe_add_uc_addr(struct ixgbe_hw *hw, uint8_t *addr, uint32_t vmdq); +int32_t ixgbe_mta_vector(struct ixgbe_hw *hw, uint8_t *mc_addr); void ixgbe_set_mta(struct ixgbe_hw *hw, uint8_t *mc_addr); void ixgbe_disable_rx(struct ixgbe_hw *hw); @@ -354,8 +355,37 @@ int32_t ixgbe_write_i2c_combined_generic(struct ixgbe_hw *, uint8_t addr, uint16 int32_t ixgbe_write_i2c_combined_generic_unlocked(struct ixgbe_hw *, uint8_t addr, uint16_t reg, uint16_t val); +/* Virtual Functions */ +int32_t ixgbe_init_ops_vf(struct ixgbe_hw *hw); +int32_t ixgbe_init_hw_vf(struct ixgbe_hw *hw); +int32_t ixgbe_start_hw_vf(struct ixgbe_hw *hw); +int32_t ixgbe_reset_hw_vf(struct ixgbe_hw *hw); +int32_t ixgbe_stop_adapter_vf(struct ixgbe_hw *hw); +uint32_t ixgbe_get_num_of_tx_queues_vf(struct ixgbe_hw *hw); +uint32_t ixgbe_get_num_of_rx_queues_vf(struct ixgbe_hw *hw); +int32_t ixgbe_get_mac_addr_vf(struct ixgbe_hw *hw, uint8_t *mac_addr); +int32_t ixgbe_setup_mac_link_vf(struct ixgbe_hw *hw, ixgbe_link_speed speed, + bool autoneg_wait_to_complete); +int32_t ixgbe_check_mac_link_vf(struct ixgbe_hw *hw, ixgbe_link_speed *speed, + bool *link_up, bool autoneg_wait_to_complete); +int32_t ixgbe_set_rar_vf(struct ixgbe_hw *hw, uint32_t index, uint8_t *addr, uint32_t vmdq, + uint32_t enable_addr); +int32_t ixgbevf_set_uc_addr_vf(struct ixgbe_hw *hw, uint32_t index, uint8_t *addr); +int32_t ixgbe_update_mc_addr_list_vf(struct ixgbe_hw *hw, uint8_t *mc_addr_list, + uint32_t mc_addr_count, ixgbe_mc_addr_itr, + bool clear); +int32_t ixgbevf_update_xcast_mode(struct ixgbe_hw *hw, int xcast_mode); +int32_t ixgbe_get_link_state_vf(struct ixgbe_hw *hw, bool *link_state); +int32_t ixgbe_set_vfta_vf(struct ixgbe_hw *hw, uint32_t vlan, uint32_t vind, + bool vlan_on, bool vlvf_bypass); +int32_t ixgbevf_rlpml_set_vf(struct ixgbe_hw *hw, uint16_t max_size); +int ixgbevf_negotiate_api_version(struct ixgbe_hw *hw, int api); +int ixgbevf_get_queues(struct ixgbe_hw *hw, unsigned int *num_tcs, + unsigned int *default_tc); + /* MBX */ int32_t ixgbe_read_mbx(struct ixgbe_hw *, uint32_t *, uint16_t, uint16_t); +int32_t ixgbe_poll_mbx(struct ixgbe_hw *, uint32_t *, uint16_t, uint16_t); int32_t ixgbe_write_mbx(struct ixgbe_hw *, uint32_t *, uint16_t, uint16_t); int32_t ixgbe_read_posted_mbx(struct ixgbe_hw *, uint32_t *, uint16_t, uint16_t); int32_t ixgbe_write_posted_mbx(struct ixgbe_hw *, uint32_t *, uint16_t, uint16_t); @@ -363,6 +393,9 @@ int32_t ixgbe_check_for_msg(struct ixgbe_hw *, uint16_t); int32_t ixgbe_check_for_ack(struct ixgbe_hw *, uint16_t); int32_t ixgbe_check_for_rst(struct ixgbe_hw *, uint16_t); void ixgbe_init_mbx_ops_generic(struct ixgbe_hw *hw); +void ixgbe_init_mbx_params_vf(struct ixgbe_hw *); +void ixgbe_upgrade_mbx_params_vf(struct ixgbe_hw *); void ixgbe_init_mbx_params_pf(struct ixgbe_hw *); +void ixgbe_upgrade_mbx_params_pf(struct ixgbe_hw *, uint16_t); #endif /* _IXGBE_H_ */ diff --git a/sys/dev/pci/ixgbe_type.h b/sys/dev/pci/ixgbe_type.h index 64d492667..249221a4d 100644 --- a/sys/dev/pci/ixgbe_type.h +++ b/sys/dev/pci/ixgbe_type.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ixgbe_type.h,v 1.39 2024/09/04 07:54:52 mglocker Exp $ */ +/* $OpenBSD: ixgbe_type.h,v 1.40 2024/10/27 04:44:41 yasuoka Exp $ */ /****************************************************************************** SPDX-License-Identifier: BSD-3-Clause @@ -463,8 +463,14 @@ struct ixgbe_nvm_version { #define IXGBE_PFMAILBOX(_i) (0x04B00 + (4 * (_i))) /* 64 total */ /* 64 Mailboxes, 16 DW each */ #define IXGBE_PFMBMEM(_i) (0x13000 + (64 * (_i))) +#define IXGBE_PFMBICR_INDEX(_i) ((_i) >> 4) +#define IXGBE_PFMBICR_SHIFT(_i) ((_i) % 16) #define IXGBE_PFMBICR(_i) (0x00710 + (4 * (_i))) /* 4 total */ #define IXGBE_PFMBIMR(_i) (0x00720 + (4 * (_i))) /* 4 total */ +#define IXGBE_PFVFLRE(_i) ((((_i) & 1) ? 0x001C0 : 0x00600)) +#define IXGBE_PFVFLREC(_i) (0x00700 + ((_i) * 4)) +#define IXGBE_PFVFLRE_INDEX(_i) ((_i) >> 5) +#define IXGBE_PFVFLRE_SHIFT(_i) ((_i) % 32) #define IXGBE_VFRE(_i) (0x051E0 + ((_i) * 4)) #define IXGBE_VFTE(_i) (0x08110 + ((_i) * 4)) #define IXGBE_VMECM(_i) (0x08790 + ((_i) * 4)) @@ -3949,6 +3955,7 @@ struct ixgbe_mac_operations { int32_t (*update_mc_addr_list)(struct ixgbe_hw *, uint8_t *, uint32_t, ixgbe_mc_addr_itr, bool clear); int32_t (*update_xcast_mode)(struct ixgbe_hw *, int); + int32_t (*get_link_state)(struct ixgbe_hw *hw, bool *link_state); int32_t (*enable_mc)(struct ixgbe_hw *); int32_t (*disable_mc)(struct ixgbe_hw *); int32_t (*clear_vfta)(struct ixgbe_hw *); @@ -3968,7 +3975,7 @@ struct ixgbe_mac_operations { /* Manageability interface */ void (*disable_rx)(struct ixgbe_hw *hw); void (*enable_rx)(struct ixgbe_hw *hw); - void (*stop_mac_link_on_d3)(struct ixgbe_hw *); + void (*stop_mac_link_on_d3)(struct ixgbe_hw *); void (*set_source_address_pruning)(struct ixgbe_hw *, bool, unsigned int); int32_t (*dmac_update_tcs)(struct ixgbe_hw *hw); @@ -4093,7 +4100,7 @@ struct ixgbe_phy_info { }; #define IXGBE_VFMAILBOX_SIZE 16 /* 16 32 bit words - 64 bytes */ -#define IXGBE_ERR_MBX -100 +#define IXGBE_MAX_MULTICAST_ADDRESSES_VF 30 #define IXGBE_VFMAILBOX 0x002FC #define IXGBE_VFMBMEM 0x00200 @@ -4115,22 +4122,25 @@ struct ixgbe_phy_info { #define IXGBE_PFMAILBOX_PFU 0x00000008 /* PF owns the mailbox buffer */ #define IXGBE_PFMAILBOX_RVFU 0x00000010 /* Reset VFU - used when VF stuck */ -#define IXGBE_MBVFICR_VFREQ_MASK 0x0000FFFF /* bits for VF messages */ -#define IXGBE_MBVFICR_VFREQ_VF1 0x00000001 /* bit for VF 1 message */ -#define IXGBE_MBVFICR_VFACK_MASK 0xFFFF0000 /* bits for VF acks */ -#define IXGBE_MBVFICR_VFACK_VF1 0x00010000 /* bit for VF 1 ack */ +#define IXGBE_PFMBICR_VFREQ_MASK 0x0000FFFF /* bits for VF messages */ +#define IXGBE_PFMBICR_VFREQ_VF1 0x00000001 /* bit for VF 1 message */ +#define IXGBE_PFMBICR_VFACK_MASK 0xFFFF0000 /* bits for VF acks */ +#define IXGBE_PFMBICR_VFACK_VF1 0x00010000 /* bit for VF 1 ack */ /* If it's a IXGBE_VF_* msg then it originates in the VF and is sent to the * PF. The reverse is TRUE if it is IXGBE_PF_*. - * Message ACK's are the value or'd with 0xF0000000 + * Message results are the value or'd with 0xF0000000 */ -#define IXGBE_VT_MSGTYPE_ACK 0x80000000 /* Messages below or'd with - * this are the ACK */ -#define IXGBE_VT_MSGTYPE_NACK 0x40000000 /* Messages below or'd with - * this are the NACK */ -#define IXGBE_VT_MSGTYPE_CTS 0x20000000 /* Indicates that VF is still - * clear to send requests */ +#define IXGBE_VT_MSGTYPE_SUCCESS 0x80000000 /* Messages or'd with this + * have succeeded + */ +#define IXGBE_VT_MSGTYPE_FAILURE 0x40000000 /* Messages or'd with this + * have failed + */ +#define IXGBE_VT_MSGTYPE_CTS 0x20000000 /* Indicates that VF is still + * clear to send requests + */ #define IXGBE_VT_MSGINFO_SHIFT 16 /* bits 23:16 are used for extra info for certain messages */ #define IXGBE_VT_MSGINFO_MASK (0xFF << IXGBE_VT_MSGINFO_SHIFT) @@ -4147,6 +4157,9 @@ enum ixgbe_pfvf_api_rev { ixgbe_mbox_api_11, /* API version 1.1, linux/freebsd VF driver */ ixgbe_mbox_api_12, /* API version 1.2, linux/freebsd VF driver */ ixgbe_mbox_api_13, /* API version 1.3, linux/freebsd VF driver */ + /* API 1.4 is being used in the upstream for IPsec */ + ixgbe_mbox_api_14, /* API version 1.4, linux/freebsd VF driver */ + ixgbe_mbox_api_15, /* API version 1.5, linux/freebsd VF driver */ /* This value should always be last */ ixgbe_mbox_api_unknown, /* indicates that API version is not known */ }; @@ -4169,6 +4182,7 @@ enum ixgbe_pfvf_api_rev { #define IXGBE_VF_GET_RETA 0x0a /* VF request for RETA */ #define IXGBE_VF_GET_RSS_KEY 0x0b /* get RSS key */ #define IXGBE_VF_UPDATE_XCAST_MODE 0x0c +#define IXGBE_VF_GET_LINK_STATE 0x10 /* get vf link state */ /* mode choices for IXGBE_VF_UPDATE_XCAST_MODE */ enum ixgbevf_xcast_modes { @@ -4207,9 +4221,61 @@ enum ixgbevf_xcast_modes { #define IXGBE_VF_MBX_INIT_TIMEOUT 2000 /* number of retries on mailbox */ #define IXGBE_VF_MBX_INIT_DELAY 500 /* microseconds between retries */ +#define IXGBE_VF_IRQ_CLEAR_MASK 7 +#define IXGBE_VF_MAX_TX_QUEUES 8 +#define IXGBE_VF_MAX_RX_QUEUES 8 +/* DCB define */ +#define IXGBE_VF_MAX_TRAFFIC_CLASS 8 + +#define IXGBE_VFCTRL 0x00000 +#define IXGBE_VFSTATUS 0x00008 +#define IXGBE_VFLINKS 0x00010 +#define IXGBE_VFFRTIMER 0x00048 +#define IXGBE_VFRXMEMWRAP 0x03190 +#define IXGBE_VTEICR 0x00100 +#define IXGBE_VTEICS 0x00104 +#define IXGBE_VTEIMS 0x00108 +#define IXGBE_VTEIMC 0x0010C +#define IXGBE_VTEIAC 0x00110 +#define IXGBE_VTEIAM 0x00114 +#define IXGBE_VTEITR(x) (0x00820 + (4 * (x))) +#define IXGBE_VTIVAR(x) (0x00120 + (4 * (x))) +#define IXGBE_VTIVAR_MISC 0x00140 +#define IXGBE_VTRSCINT(x) (0x00180 + (4 * (x))) +/* define IXGBE_VFPBACL still says TBD in EAS */ +#define IXGBE_VFRDBAL(x) (0x01000 + (0x40 * (x))) +#define IXGBE_VFRDBAH(x) (0x01004 + (0x40 * (x))) +#define IXGBE_VFRDLEN(x) (0x01008 + (0x40 * (x))) +#define IXGBE_VFRDH(x) (0x01010 + (0x40 * (x))) +#define IXGBE_VFRDT(x) (0x01018 + (0x40 * (x))) +#define IXGBE_VFRXDCTL(x) (0x01028 + (0x40 * (x))) +#define IXGBE_VFSRRCTL(x) (0x01014 + (0x40 * (x))) +#define IXGBE_VFRSCCTL(x) (0x0102C + (0x40 * (x))) +#define IXGBE_VFPSRTYPE 0x00300 +#define IXGBE_VFTDBAL(x) (0x02000 + (0x40 * (x))) +#define IXGBE_VFTDBAH(x) (0x02004 + (0x40 * (x))) +#define IXGBE_VFTDLEN(x) (0x02008 + (0x40 * (x))) +#define IXGBE_VFTDH(x) (0x02010 + (0x40 * (x))) +#define IXGBE_VFTDT(x) (0x02018 + (0x40 * (x))) +#define IXGBE_VFTXDCTL(x) (0x02028 + (0x40 * (x))) +#define IXGBE_VFTDWBAL(x) (0x02038 + (0x40 * (x))) +#define IXGBE_VFTDWBAH(x) (0x0203C + (0x40 * (x))) +#define IXGBE_VFDCA_RXCTRL(x) (0x0100C + (0x40 * (x))) +#define IXGBE_VFDCA_TXCTRL(x) (0x0200c + (0x40 * (x))) +#define IXGBE_VFGPRC 0x0101C +#define IXGBE_VFGPTC 0x0201C +#define IXGBE_VFGORC_LSB 0x01020 +#define IXGBE_VFGORC_MSB 0x01024 +#define IXGBE_VFGOTC_LSB 0x02020 +#define IXGBE_VFGOTC_MSB 0x02024 +#define IXGBE_VFMPRC 0x01034 +#define IXGBE_VFMRQC 0x3000 +#define IXGBE_VFRSSRK(x) (0x3100 + ((x) * 4)) +#define IXGBE_VFRETA(x) (0x3200 + ((x) * 4)) struct ixgbe_mbx_operations { void (*init_params)(struct ixgbe_hw *hw); + void (*release)(struct ixgbe_hw *, uint16_t); int32_t (*read)(struct ixgbe_hw *, uint32_t *, uint16_t, uint16_t); int32_t (*write)(struct ixgbe_hw *, uint32_t *, uint16_t, uint16_t); int32_t (*read_posted)(struct ixgbe_hw *, uint32_t *, uint16_t, uint16_t); @@ -4217,6 +4283,7 @@ struct ixgbe_mbx_operations { int32_t (*check_for_msg)(struct ixgbe_hw *, uint16_t); int32_t (*check_for_ack)(struct ixgbe_hw *, uint16_t); int32_t (*check_for_rst)(struct ixgbe_hw *, uint16_t); + int32_t (*clear)(struct ixgbe_hw *, uint16_t); }; struct ixgbe_mbx_stats { @@ -4233,7 +4300,7 @@ struct ixgbe_mbx_info { struct ixgbe_mbx_stats stats; uint32_t timeout; uint32_t usec_delay; - uint32_t v2p_mailbox; + uint32_t vf_mailbox; uint16_t size; }; @@ -4307,6 +4374,9 @@ struct ixgbe_hw { #define IXGBE_ERR_FDIR_CMD_INCOMPLETE -38 #define IXGBE_ERR_FW_RESP_INVALID -39 #define IXGBE_ERR_TOKEN_RETRY -40 +#define IXGBE_ERR_MBX -41 +#define IXGBE_ERR_MBX_NOMSG -42 +#define IXGBE_ERR_TIMEOUT -43 #define IXGBE_NOT_IMPLEMENTED 0x7FFFFFFF diff --git a/sys/dev/pci/ixgbe_vf.c b/sys/dev/pci/ixgbe_vf.c new file mode 100644 index 000000000..844e371ce --- /dev/null +++ b/sys/dev/pci/ixgbe_vf.c @@ -0,0 +1,799 @@ +/* $OpenBSD: ixgbe_vf.c,v 1.1 2024/11/02 04:37:20 yasuoka Exp $ */ + +/****************************************************************************** + + Copyright (c) 2001-2017, Intel Corporation + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of the Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +******************************************************************************/ + +#include +#include + +#ifndef IXGBE_VFWRITE_REG +#define IXGBE_VFWRITE_REG IXGBE_WRITE_REG +#endif +#ifndef IXGBE_VFREAD_REG +#define IXGBE_VFREAD_REG IXGBE_READ_REG +#endif + +/** + Dummy handlers. + They are called from ix driver code, + and there is nothing to do for VF. + */ +static uint64_t +ixgbe_dummy_uint64_handler_vf(struct ixgbe_hw *hw) +{ + return 0; +} + +static int32_t +ixgbe_dummy_handler_vf(struct ixgbe_hw *hw) +{ + return 0; +} + +static void +ixgbe_dummy_void_handler_vf(struct ixgbe_hw *hw) +{ + return; +} + +/** + * ixgbe_init_ops_vf - Initialize the pointers for vf + * @hw: pointer to hardware structure + * + * This will assign function pointers, adapter-specific functions can + * override the assignment of generic function pointers by assigning + * their own adapter-specific function pointers. + * Does not touch the hardware. + **/ +int32_t ixgbe_init_ops_vf(struct ixgbe_hw *hw) +{ + /* MAC */ + hw->mac.ops.init_hw = ixgbe_init_hw_vf; + hw->mac.ops.reset_hw = ixgbe_reset_hw_vf; + hw->mac.ops.start_hw = ixgbe_start_hw_vf; + /* Cannot clear stats on VF */ + hw->mac.ops.clear_hw_cntrs = NULL; + hw->mac.ops.get_media_type = NULL; + hw->mac.ops.get_supported_physical_layer = + ixgbe_dummy_uint64_handler_vf; + hw->mac.ops.get_mac_addr = ixgbe_get_mac_addr_vf; + hw->mac.ops.stop_adapter = ixgbe_stop_adapter_vf; + hw->mac.ops.get_bus_info = NULL; + hw->mac.ops.negotiate_api_version = ixgbevf_negotiate_api_version; + + /* Link */ + hw->mac.ops.setup_link = ixgbe_setup_mac_link_vf; + hw->mac.ops.check_link = ixgbe_check_mac_link_vf; + hw->mac.ops.get_link_capabilities = NULL; + + /* RAR, Multicast, VLAN */ + hw->mac.ops.set_rar = ixgbe_set_rar_vf; + hw->mac.ops.set_uc_addr = ixgbevf_set_uc_addr_vf; + hw->mac.ops.init_rx_addrs = NULL; + hw->mac.ops.update_mc_addr_list = ixgbe_update_mc_addr_list_vf; + hw->mac.ops.update_xcast_mode = ixgbevf_update_xcast_mode; + hw->mac.ops.get_link_state = ixgbe_get_link_state_vf; + hw->mac.ops.enable_mc = NULL; + hw->mac.ops.disable_mc = NULL; + hw->mac.ops.clear_vfta = NULL; + hw->mac.ops.set_vfta = ixgbe_set_vfta_vf; + hw->mac.ops.set_rlpml = ixgbevf_rlpml_set_vf; + + /* Flow Control */ + hw->mac.ops.fc_enable = ixgbe_dummy_handler_vf; + hw->mac.ops.setup_fc = ixgbe_dummy_handler_vf; + hw->mac.ops.fc_autoneg = ixgbe_dummy_void_handler_vf; + + hw->mac.max_tx_queues = 1; + hw->mac.max_rx_queues = 1; + + hw->mbx.ops.init_params = ixgbe_init_mbx_params_vf; + + return IXGBE_SUCCESS; +} + +/* ixgbe_virt_clr_reg - Set register to default (power on) state. + * @hw: pointer to hardware structure + */ +static void ixgbe_virt_clr_reg(struct ixgbe_hw *hw) +{ + int i; + uint32_t vfsrrctl; + uint32_t vfdca_rxctrl; + uint32_t vfdca_txctrl; + + /* VRSRRCTL default values (BSIZEPACKET = 2048, BSIZEHEADER = 256) */ + vfsrrctl = 0x100 << IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT; + vfsrrctl |= 0x800 >> IXGBE_SRRCTL_BSIZEPKT_SHIFT; + + /* DCA_RXCTRL default value */ + vfdca_rxctrl = IXGBE_DCA_RXCTRL_DESC_RRO_EN | + IXGBE_DCA_RXCTRL_DATA_WRO_EN | + IXGBE_DCA_RXCTRL_HEAD_WRO_EN; + + /* DCA_TXCTRL default value */ + vfdca_txctrl = IXGBE_DCA_TXCTRL_DESC_RRO_EN | + IXGBE_DCA_TXCTRL_DESC_WRO_EN | + IXGBE_DCA_TXCTRL_DATA_RRO_EN; + + IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE, 0); + + for (i = 0; i < 7; i++) { + IXGBE_WRITE_REG(hw, IXGBE_VFRDH(i), 0); + IXGBE_WRITE_REG(hw, IXGBE_VFRDT(i), 0); + IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(i), 0); + IXGBE_WRITE_REG(hw, IXGBE_VFSRRCTL(i), vfsrrctl); + IXGBE_WRITE_REG(hw, IXGBE_VFTDH(i), 0); + IXGBE_WRITE_REG(hw, IXGBE_VFTDT(i), 0); + IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(i), 0); + IXGBE_WRITE_REG(hw, IXGBE_VFTDWBAH(i), 0); + IXGBE_WRITE_REG(hw, IXGBE_VFTDWBAL(i), 0); + IXGBE_WRITE_REG(hw, IXGBE_VFDCA_RXCTRL(i), vfdca_rxctrl); + IXGBE_WRITE_REG(hw, IXGBE_VFDCA_TXCTRL(i), vfdca_txctrl); + } + + IXGBE_WRITE_FLUSH(hw); +} + +/** + * ixgbe_start_hw_vf - Prepare hardware for Tx/Rx + * @hw: pointer to hardware structure + * + * Starts the hardware by filling the bus info structure and media type, clears + * all on chip counters, initializes receive address registers, multicast + * table, VLAN filter table, calls routine to set up link and flow control + * settings, and leaves transmit and receive units disabled and uninitialized + **/ +int32_t ixgbe_start_hw_vf(struct ixgbe_hw *hw) +{ + /* Clear adapter stopped flag */ + hw->adapter_stopped = FALSE; + + return IXGBE_SUCCESS; +} + +/** + * ixgbe_init_hw_vf - virtual function hardware initialization + * @hw: pointer to hardware structure + * + * Initialize the hardware by resetting the hardware and then starting + * the hardware + **/ +int32_t ixgbe_init_hw_vf(struct ixgbe_hw *hw) +{ + int32_t status = hw->mac.ops.start_hw(hw); + + hw->mac.ops.get_mac_addr(hw, hw->mac.addr); + + return status; +} + +/** + * ixgbe_reset_hw_vf - Performs hardware reset + * @hw: pointer to hardware structure + * + * Resets the hardware by resetting the transmit and receive units, masks and + * clears all interrupts. + **/ +int32_t ixgbe_reset_hw_vf(struct ixgbe_hw *hw) +{ + struct ixgbe_mbx_info *mbx = &hw->mbx; + uint32_t timeout = IXGBE_VF_INIT_TIMEOUT; + int32_t ret_val = IXGBE_ERR_INVALID_MAC_ADDR; + uint32_t msgbuf[IXGBE_VF_PERMADDR_MSG_LEN]; + uint8_t *addr = (uint8_t *)(&msgbuf[1]); + + DEBUGFUNC("ixgbevf_reset_hw_vf"); + + /* Call adapter stop to disable tx/rx and clear interrupts */ + hw->mac.ops.stop_adapter(hw); + + /* reset the api version */ + hw->api_version = ixgbe_mbox_api_10; + ixgbe_init_mbx_params_vf(hw); + + DEBUGOUT("Issuing a function level reset to MAC\n"); + + IXGBE_VFWRITE_REG(hw, IXGBE_VFCTRL, IXGBE_CTRL_RST); + IXGBE_WRITE_FLUSH(hw); + + msec_delay(50); + + /* we cannot reset while the RSTI / RSTD bits are asserted */ + while (!mbx->ops.check_for_rst(hw, 0) && timeout) { + timeout--; + usec_delay(5); + } + + if (!timeout) + return IXGBE_ERR_RESET_FAILED; + + /* Reset VF registers to initial values */ + ixgbe_virt_clr_reg(hw); + + /* mailbox timeout can now become active */ + mbx->timeout = IXGBE_VF_MBX_INIT_TIMEOUT; + + msgbuf[0] = IXGBE_VF_RESET; + ixgbe_write_mbx(hw, msgbuf, 1, 0); + + msec_delay(10); + + /* + * set our "perm_addr" based on info provided by PF + * also set up the mc_filter_type which is piggy backed + * on the mac address in word 3 + */ + ret_val = ixgbe_poll_mbx(hw, msgbuf, + IXGBE_VF_PERMADDR_MSG_LEN, 0); + if (ret_val) + return ret_val; + + if (msgbuf[0] != (IXGBE_VF_RESET | IXGBE_VT_MSGTYPE_SUCCESS) && + msgbuf[0] != (IXGBE_VF_RESET | IXGBE_VT_MSGTYPE_FAILURE)) + return IXGBE_ERR_INVALID_MAC_ADDR; + + if (msgbuf[0] == (IXGBE_VF_RESET | IXGBE_VT_MSGTYPE_SUCCESS)) + memcpy(hw->mac.perm_addr, addr, IXGBE_ETH_LENGTH_OF_ADDRESS); + + hw->mac.mc_filter_type = msgbuf[IXGBE_VF_MC_TYPE_WORD]; + + return ret_val; +} + +/** + * ixgbe_stop_adapter_vf - Generic stop Tx/Rx units + * @hw: pointer to hardware structure + * + * Sets the adapter_stopped flag within ixgbe_hw struct. Clears interrupts, + * disables transmit and receive units. The adapter_stopped flag is used by + * the shared code and drivers to determine if the adapter is in a stopped + * state and should not touch the hardware. + **/ +int32_t ixgbe_stop_adapter_vf(struct ixgbe_hw *hw) +{ + uint32_t reg_val; + uint16_t i; + + /* + * Set the adapter_stopped flag so other driver functions stop touching + * the hardware + */ + hw->adapter_stopped = TRUE; + + /* Clear interrupt mask to stop from interrupts being generated */ + IXGBE_VFWRITE_REG(hw, IXGBE_VTEIMC, IXGBE_VF_IRQ_CLEAR_MASK); + + /* Clear any pending interrupts, flush previous writes */ + IXGBE_VFREAD_REG(hw, IXGBE_VTEICR); + + /* Disable the transmit unit. Each queue must be disabled. */ + for (i = 0; i < hw->mac.max_tx_queues; i++) + IXGBE_VFWRITE_REG(hw, IXGBE_VFTXDCTL(i), IXGBE_TXDCTL_SWFLSH); + + /* Disable the receive unit by stopping each queue */ + for (i = 0; i < hw->mac.max_rx_queues; i++) { + reg_val = IXGBE_VFREAD_REG(hw, IXGBE_VFRXDCTL(i)); + reg_val &= ~IXGBE_RXDCTL_ENABLE; + IXGBE_VFWRITE_REG(hw, IXGBE_VFRXDCTL(i), reg_val); + } + /* Clear packet split and pool config */ + IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE, 0); + + /* flush all queues disables */ + IXGBE_WRITE_FLUSH(hw); + msec_delay(2); + + return IXGBE_SUCCESS; +} + +static int32_t ixgbevf_write_msg_read_ack(struct ixgbe_hw *hw, uint32_t *msg, + uint32_t *retmsg, uint16_t size) +{ + int32_t retval = ixgbe_write_mbx(hw, msg, size, 0); + + if (retval) + return retval; + + return ixgbe_poll_mbx(hw, retmsg, size, 0); +} + +/** + * ixgbe_set_rar_vf - set device MAC address + * @hw: pointer to hardware structure + * @index: Receive address register to write + * @addr: Address to put into receive address register + * @vmdq: VMDq "set" or "pool" index + * @enable_addr: set flag that address is active + **/ +int32_t ixgbe_set_rar_vf(struct ixgbe_hw *hw, uint32_t index, uint8_t *addr, + uint32_t vmdq, uint32_t enable_addr) +{ + uint32_t msgbuf[3]; + uint8_t *msg_addr = (uint8_t *)(&msgbuf[1]); + int32_t ret_val; + + memset(msgbuf, 0, 12); + msgbuf[0] = IXGBE_VF_SET_MAC_ADDR; + memcpy(msg_addr, addr, 6); + ret_val = ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, 3); + + msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS; + + /* if nacked the address was rejected, use "perm_addr" */ + if (!ret_val && + (msgbuf[0] == (IXGBE_VF_SET_MAC_ADDR | IXGBE_VT_MSGTYPE_FAILURE))) { + ixgbe_get_mac_addr_vf(hw, hw->mac.addr); + return IXGBE_ERR_MBX; + } + + return ret_val; +} + +/** + * ixgbe_update_mc_addr_list_vf - Update Multicast addresses + * @hw: pointer to the HW structure + * @mc_addr_list: array of multicast addresses to program + * @mc_addr_count: number of multicast addresses to program + * @next: caller supplied function to return next address in list + * @clear: unused + * + * Updates the Multicast Table Array. + **/ +int32_t ixgbe_update_mc_addr_list_vf(struct ixgbe_hw *hw, uint8_t *mc_addr_list, + uint32_t mc_addr_count, ixgbe_mc_addr_itr next, + bool clear) +{ + uint32_t msgbuf[IXGBE_VFMAILBOX_SIZE]; + uint16_t *vector_list = (uint16_t *)&msgbuf[1]; + uint32_t vector; + uint32_t cnt, i; + uint32_t vmdq; + + DEBUGFUNC("ixgbe_update_mc_addr_list_vf"); + + /* Each entry in the list uses 1 16 bit word. We have 30 + * 16 bit words available in our HW msg buffer (minus 1 for the + * msg type). That's 30 hash values if we pack 'em right. If + * there are more than 30 MC addresses to add then punt the + * extras for now and then add code to handle more than 30 later. + * It would be unusual for a server to request that many multi-cast + * addresses except for in large enterprise network environments. + */ + + DEBUGOUT1("MC Addr Count = %d\n", mc_addr_count); + + cnt = (mc_addr_count > IXGBE_MAX_MULTICAST_ADDRESSES_VF) ? IXGBE_MAX_MULTICAST_ADDRESSES_VF : mc_addr_count; + msgbuf[0] = IXGBE_VF_SET_MULTICAST; + msgbuf[0] |= cnt << IXGBE_VT_MSGINFO_SHIFT; + + for (i = 0; i < cnt; i++) { + vector = ixgbe_mta_vector(hw, next(hw, &mc_addr_list, &vmdq)); + DEBUGOUT1("Hash value = 0x%03X\n", vector); + vector_list[i] = (uint16_t)vector; + } + + return ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, IXGBE_VFMAILBOX_SIZE); +} + +/** + * ixgbevf_update_xcast_mode - Update Multicast mode + * @hw: pointer to the HW structure + * @xcast_mode: new multicast mode + * + * Updates the Multicast Mode of VF. + **/ +int32_t ixgbevf_update_xcast_mode(struct ixgbe_hw *hw, int xcast_mode) +{ + uint32_t msgbuf[2]; + int32_t err; + + switch (hw->api_version) { + case ixgbe_mbox_api_12: + /* New modes were introduced in 1.3 version */ + if (xcast_mode > IXGBEVF_XCAST_MODE_ALLMULTI) + return IXGBE_ERR_FEATURE_NOT_SUPPORTED; + /* Fall through */ + case ixgbe_mbox_api_13: + case ixgbe_mbox_api_15: + break; + default: + return IXGBE_ERR_FEATURE_NOT_SUPPORTED; + } + + msgbuf[0] = IXGBE_VF_UPDATE_XCAST_MODE; + msgbuf[1] = xcast_mode; + + err = ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, 2); + if (err) + return err; + + msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS; + if (msgbuf[0] == (IXGBE_VF_UPDATE_XCAST_MODE | IXGBE_VT_MSGTYPE_FAILURE)) + return IXGBE_ERR_FEATURE_NOT_SUPPORTED; + return IXGBE_SUCCESS; +} + +/** + * ixgbe_get_link_state_vf - Get VF link state from PF + * @hw: pointer to the HW structure + * @link_state: link state storage + * + * Returns state of the operation error or success. + **/ +int32_t ixgbe_get_link_state_vf(struct ixgbe_hw *hw, bool *link_state) +{ + uint32_t msgbuf[2]; + int32_t err; + int32_t ret_val; + + msgbuf[0] = IXGBE_VF_GET_LINK_STATE; + msgbuf[1] = 0x0; + + err = ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, 2); + + if (err || (msgbuf[0] & IXGBE_VT_MSGTYPE_FAILURE)) { + ret_val = IXGBE_ERR_MBX; + } else { + ret_val = IXGBE_SUCCESS; + *link_state = msgbuf[1]; + } + + return ret_val; +} + +/** + * ixgbe_set_vfta_vf - Set/Unset vlan filter table address + * @hw: pointer to the HW structure + * @vlan: 12 bit VLAN ID + * @vind: unused by VF drivers + * @vlan_on: if TRUE then set bit, else clear bit + * @vlvf_bypass: boolean flag indicating updating default pool is okay + * + * Turn on/off specified VLAN in the VLAN filter table. + **/ +int32_t ixgbe_set_vfta_vf(struct ixgbe_hw *hw, uint32_t vlan, uint32_t vind, + bool vlan_on, bool vlvf_bypass) +{ + uint32_t msgbuf[2]; + int32_t ret_val; + + msgbuf[0] = IXGBE_VF_SET_VLAN; + msgbuf[1] = vlan; + /* Setting the 8 bit field MSG INFO to TRUE indicates "add" */ + msgbuf[0] |= vlan_on << IXGBE_VT_MSGINFO_SHIFT; + + ret_val = ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, 2); + if (!ret_val && (msgbuf[0] & IXGBE_VT_MSGTYPE_SUCCESS)) + return IXGBE_SUCCESS; + + return ret_val | (msgbuf[0] & IXGBE_VT_MSGTYPE_FAILURE); +} + +/** + * ixgbe_get_num_of_tx_queues_vf - Get number of TX queues + * @hw: pointer to hardware structure + * + * Returns the number of transmit queues for the given adapter. + **/ +uint32_t ixgbe_get_num_of_tx_queues_vf(struct ixgbe_hw *hw) +{ + return IXGBE_VF_MAX_TX_QUEUES; +} + +/** + * ixgbe_get_num_of_rx_queues_vf - Get number of RX queues + * @hw: pointer to hardware structure + * + * Returns the number of receive queues for the given adapter. + **/ +uint32_t ixgbe_get_num_of_rx_queues_vf(struct ixgbe_hw *hw) +{ + return IXGBE_VF_MAX_RX_QUEUES; +} + +/** + * ixgbe_get_mac_addr_vf - Read device MAC address + * @hw: pointer to the HW structure + * @mac_addr: the MAC address + **/ +int32_t ixgbe_get_mac_addr_vf(struct ixgbe_hw *hw, uint8_t *mac_addr) +{ + int i; + + for (i = 0; i < IXGBE_ETH_LENGTH_OF_ADDRESS; i++) + mac_addr[i] = hw->mac.perm_addr[i]; + + return IXGBE_SUCCESS; +} + +int32_t ixgbevf_set_uc_addr_vf(struct ixgbe_hw *hw, uint32_t index, uint8_t *addr) +{ + uint32_t msgbuf[3], msgbuf_chk; + uint8_t *msg_addr = (uint8_t *)(&msgbuf[1]); + int32_t ret_val; + + memset(msgbuf, 0, sizeof(msgbuf)); + /* + * If index is one then this is the start of a new list and needs + * indication to the PF so it can do it's own list management. + * If it is zero then that tells the PF to just clear all of + * this VF's macvlans and there is no new list. + */ + msgbuf[0] |= index << IXGBE_VT_MSGINFO_SHIFT; + msgbuf[0] |= IXGBE_VF_SET_MACVLAN; + msgbuf_chk = msgbuf[0]; + if (addr) + memcpy(msg_addr, addr, 6); + + ret_val = ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, 3); + if (!ret_val) { + msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS; + + if (msgbuf[0] == (msgbuf_chk | IXGBE_VT_MSGTYPE_FAILURE)) + return IXGBE_ERR_OUT_OF_MEM; + } + + return ret_val; +} + +/** + * ixgbe_setup_mac_link_vf - Setup MAC link settings + * @hw: pointer to hardware structure + * @speed: new link speed + * @autoneg_wait_to_complete: TRUE when waiting for completion is needed + * + * Set the link speed in the AUTOC register and restarts link. + **/ +int32_t ixgbe_setup_mac_link_vf(struct ixgbe_hw *hw, ixgbe_link_speed speed, + bool autoneg_wait_to_complete) +{ + return IXGBE_SUCCESS; +} + +/** + * ixgbe_check_mac_link_vf - Get link/speed status + * @hw: pointer to hardware structure + * @speed: pointer to link speed + * @link_up: TRUE is link is up, FALSE otherwise + * @autoneg_wait_to_complete: TRUE when waiting for completion is needed + * + * Reads the links register to determine if link is up and the current speed + **/ +int32_t ixgbe_check_mac_link_vf(struct ixgbe_hw *hw, ixgbe_link_speed *speed, + bool *link_up, bool autoneg_wait_to_complete) +{ + struct ixgbe_mbx_info *mbx = &hw->mbx; + struct ixgbe_mac_info *mac = &hw->mac; + int32_t ret_val = IXGBE_SUCCESS; + uint32_t in_msg = 0; + uint32_t links_reg; + + /* If we were hit with a reset drop the link */ + if (!mbx->ops.check_for_rst(hw, 0) || !mbx->timeout) + mac->get_link_status = TRUE; + + if (!mac->get_link_status) + goto out; + + /* if link status is down no point in checking to see if pf is up */ + links_reg = IXGBE_READ_REG(hw, IXGBE_VFLINKS); + if (!(links_reg & IXGBE_LINKS_UP)) + goto out; + + /* for SFP+ modules and DA cables on 82599 it can take up to 500usecs + * before the link status is correct + */ + if (mac->type == ixgbe_mac_82599_vf) { + int i; + + for (i = 0; i < 5; i++) { + usec_delay(100); + links_reg = IXGBE_READ_REG(hw, IXGBE_VFLINKS); + + if (!(links_reg & IXGBE_LINKS_UP)) + goto out; + } + } + + switch (links_reg & IXGBE_LINKS_SPEED_82599) { + case IXGBE_LINKS_SPEED_10G_82599: + *speed = IXGBE_LINK_SPEED_10GB_FULL; + if (hw->mac.type >= ixgbe_mac_X550_vf) { + if (links_reg & IXGBE_LINKS_SPEED_NON_STD) + *speed = IXGBE_LINK_SPEED_2_5GB_FULL; + } + break; + case IXGBE_LINKS_SPEED_1G_82599: + *speed = IXGBE_LINK_SPEED_1GB_FULL; + break; + case IXGBE_LINKS_SPEED_100_82599: + *speed = IXGBE_LINK_SPEED_100_FULL; + if (hw->mac.type == ixgbe_mac_X550_vf) { + if (links_reg & IXGBE_LINKS_SPEED_NON_STD) + *speed = IXGBE_LINK_SPEED_5GB_FULL; + } + break; + case IXGBE_LINKS_SPEED_10_X550EM_A: + *speed = IXGBE_LINK_SPEED_UNKNOWN; + /* Since Reserved in older MAC's */ + if (hw->mac.type >= ixgbe_mac_X550_vf) + *speed = IXGBE_LINK_SPEED_10_FULL; + break; + default: + *speed = IXGBE_LINK_SPEED_UNKNOWN; + } + + /* if the read failed it could just be a mailbox collision, best wait + * until we are called again and don't report an error + */ + if (ixgbe_read_mbx(hw, &in_msg, 1, 0)) { + if (hw->api_version >= ixgbe_mbox_api_15) + mac->get_link_status = FALSE; + goto out; + } + + if (!(in_msg & IXGBE_VT_MSGTYPE_CTS)) { + /* msg is not CTS and is NACK we must have lost CTS status */ + if (in_msg & IXGBE_VT_MSGTYPE_FAILURE) + ret_val = IXGBE_ERR_MBX; + goto out; + } + + /* the pf is talking, if we timed out in the past we reinit */ + if (!mbx->timeout) { + ret_val = IXGBE_ERR_TIMEOUT; + goto out; + } + + /* if we passed all the tests above then the link is up and we no + * longer need to check for link + */ + mac->get_link_status = FALSE; + +out: + *link_up = !mac->get_link_status; + return ret_val; +} + +/** + * ixgbevf_rlpml_set_vf - Set the maximum receive packet length + * @hw: pointer to the HW structure + * @max_size: value to assign to max frame size + **/ +int32_t ixgbevf_rlpml_set_vf(struct ixgbe_hw *hw, uint16_t max_size) +{ + uint32_t msgbuf[2]; + int32_t retval; + + msgbuf[0] = IXGBE_VF_SET_LPE; + msgbuf[1] = max_size; + + retval = ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, 2); + if (retval) + return retval; + if ((msgbuf[0] & IXGBE_VF_SET_LPE) && + (msgbuf[0] & IXGBE_VT_MSGTYPE_FAILURE)) + return IXGBE_ERR_MBX; + + return 0; +} + +/** + * ixgbevf_negotiate_api_version - Negotiate supported API version + * @hw: pointer to the HW structure + * @api: integer containing requested API version + **/ +int ixgbevf_negotiate_api_version(struct ixgbe_hw *hw, int api) +{ + int err; + uint32_t msg[3]; + + /* Negotiate the mailbox API version */ + msg[0] = IXGBE_VF_API_NEGOTIATE; + msg[1] = api; + msg[2] = 0; + + err = ixgbevf_write_msg_read_ack(hw, msg, msg, 3); + if (!err) { + msg[0] &= ~IXGBE_VT_MSGTYPE_CTS; + + /* Store value and return 0 on success */ + if (msg[0] == (IXGBE_VF_API_NEGOTIATE | IXGBE_VT_MSGTYPE_SUCCESS)) { + hw->api_version = api; + return 0; + } + + err = IXGBE_ERR_INVALID_ARGUMENT; + } + + return err; +} + +int ixgbevf_get_queues(struct ixgbe_hw *hw, unsigned int *num_tcs, + unsigned int *default_tc) +{ + int err; + uint32_t msg[5]; + + /* do nothing if API doesn't support ixgbevf_get_queues */ + switch (hw->api_version) { + case ixgbe_mbox_api_11: + case ixgbe_mbox_api_12: + case ixgbe_mbox_api_13: + case ixgbe_mbox_api_15: + break; + default: + return 0; + } + + /* Fetch queue configuration from the PF */ + msg[0] = IXGBE_VF_GET_QUEUES; + msg[1] = msg[2] = msg[3] = msg[4] = 0; + + err = ixgbevf_write_msg_read_ack(hw, msg, msg, 5); + if (!err) { + msg[0] &= ~IXGBE_VT_MSGTYPE_CTS; + + /* + * if we didn't get a SUCCESS there must have been + * some sort of mailbox error so we should treat it + * as such + */ + if (msg[0] != (IXGBE_VF_GET_QUEUES | IXGBE_VT_MSGTYPE_SUCCESS)) + return IXGBE_ERR_MBX; + + /* record and validate values from message */ + hw->mac.max_tx_queues = msg[IXGBE_VF_TX_QUEUES]; + if (hw->mac.max_tx_queues == 0 || + hw->mac.max_tx_queues > IXGBE_VF_MAX_TX_QUEUES) + hw->mac.max_tx_queues = IXGBE_VF_MAX_TX_QUEUES; + + hw->mac.max_rx_queues = msg[IXGBE_VF_RX_QUEUES]; + if (hw->mac.max_rx_queues == 0 || + hw->mac.max_rx_queues > IXGBE_VF_MAX_RX_QUEUES) + hw->mac.max_rx_queues = IXGBE_VF_MAX_RX_QUEUES; + + *num_tcs = msg[IXGBE_VF_TRANS_VLAN]; + /* in case of unknown state assume we cannot tag frames */ + if (*num_tcs > hw->mac.max_rx_queues) + *num_tcs = 1; + + *default_tc = msg[IXGBE_VF_DEF_QUEUE]; + /* default to queue 0 on out-of-bounds queue number */ + if (*default_tc >= hw->mac.max_tx_queues) + *default_tc = 0; + } + + return err; +} diff --git a/sys/dev/pci/nvme_pci.c b/sys/dev/pci/nvme_pci.c index d827b5405..7ad4daffb 100644 --- a/sys/dev/pci/nvme_pci.c +++ b/sys/dev/pci/nvme_pci.c @@ -1,4 +1,4 @@ -/* $OpenBSD: nvme_pci.c,v 1.12 2024/09/18 00:03:19 jmatthew Exp $ */ +/* $OpenBSD: nvme_pci.c,v 1.13 2024/11/19 02:31:35 jcs Exp $ */ /* * Copyright (c) 2014 David Gwynne @@ -131,7 +131,7 @@ unmap: int nvme_pci_detach(struct device *self, int flags) { - return (0); + return config_detach_children(self, flags); } int diff --git a/sys/dev/pci/pcidevs b/sys/dev/pci/pcidevs index 9d38a16ff..5683ccb99 100644 --- a/sys/dev/pci/pcidevs +++ b/sys/dev/pci/pcidevs @@ -1,4 +1,4 @@ -$OpenBSD: pcidevs,v 1.2092 2024/10/17 08:22:34 dlg Exp $ +$OpenBSD: pcidevs,v 1.2094 2024/11/09 10:23:06 miod Exp $ /* $NetBSD: pcidevs,v 1.30 1997/06/24 06:20:24 thorpej Exp $ */ /* @@ -3222,6 +3222,7 @@ product EUMITCOM WL11000P 0x1100 WL11000P product EXAR XR17C152 0x0152 XR17C152 product EXAR XR17C154 0x0154 XR17C154 product EXAR XR17C158 0x0158 XR17C158 +product EXAR XR17V352 0x0352 XR17V352 product EXAR XR17V354 0x0354 XR17V354 /* FORE products */ @@ -4178,6 +4179,8 @@ product INTEL XL710_20G_BP_2 0x1588 XL710 20GbE Backplane product INTEL X710_T4_10G 0x1589 X710-T4 10GbaseT product INTEL XXV710_25G_BP 0x158a XXV710 25GbE Backplane product INTEL XXV710_25G_SFP28 0x158b XXV710 SFP28 +product INTEL E810_XXV_QSFP 0x159a E810 XXV QSFP +product INTEL E810_XXV_SFP 0x159b E810 XXV SFP product INTEL I218_LM_2 0x15a0 I218-LM product INTEL I218_V_2 0x15a1 I218-V product INTEL I218_LM_3 0x15a2 I218-LM diff --git a/sys/dev/pci/pcidevs.h b/sys/dev/pci/pcidevs.h index 28b56f64c..f14af3063 100644 --- a/sys/dev/pci/pcidevs.h +++ b/sys/dev/pci/pcidevs.h @@ -2,7 +2,7 @@ * THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT. * * generated from: - * OpenBSD: pcidevs,v 1.2092 2024/10/17 08:22:34 dlg Exp + * OpenBSD: pcidevs,v 1.2094 2024/11/09 10:23:06 miod Exp */ /* $NetBSD: pcidevs,v 1.30 1997/06/24 06:20:24 thorpej Exp $ */ @@ -3227,6 +3227,7 @@ #define PCI_PRODUCT_EXAR_XR17C152 0x0152 /* XR17C152 */ #define PCI_PRODUCT_EXAR_XR17C154 0x0154 /* XR17C154 */ #define PCI_PRODUCT_EXAR_XR17C158 0x0158 /* XR17C158 */ +#define PCI_PRODUCT_EXAR_XR17V352 0x0352 /* XR17V352 */ #define PCI_PRODUCT_EXAR_XR17V354 0x0354 /* XR17V354 */ /* FORE products */ @@ -4183,6 +4184,8 @@ #define PCI_PRODUCT_INTEL_X710_T4_10G 0x1589 /* X710-T4 10GbaseT */ #define PCI_PRODUCT_INTEL_XXV710_25G_BP 0x158a /* XXV710 25GbE Backplane */ #define PCI_PRODUCT_INTEL_XXV710_25G_SFP28 0x158b /* XXV710 SFP28 */ +#define PCI_PRODUCT_INTEL_E810_XXV_QSFP 0x159a /* E810 XXV QSFP */ +#define PCI_PRODUCT_INTEL_E810_XXV_SFP 0x159b /* E810 XXV SFP */ #define PCI_PRODUCT_INTEL_I218_LM_2 0x15a0 /* I218-LM */ #define PCI_PRODUCT_INTEL_I218_V_2 0x15a1 /* I218-V */ #define PCI_PRODUCT_INTEL_I218_LM_3 0x15a2 /* I218-LM */ diff --git a/sys/dev/pci/pcidevs_data.h b/sys/dev/pci/pcidevs_data.h index 0ed3cdb9b..546ae7d8a 100644 --- a/sys/dev/pci/pcidevs_data.h +++ b/sys/dev/pci/pcidevs_data.h @@ -2,7 +2,7 @@ * THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT. * * generated from: - * OpenBSD: pcidevs,v 1.2092 2024/10/17 08:22:34 dlg Exp + * OpenBSD: pcidevs,v 1.2094 2024/11/09 10:23:06 miod Exp */ /* $NetBSD: pcidevs,v 1.30 1997/06/24 06:20:24 thorpej Exp $ */ @@ -10459,6 +10459,10 @@ static const struct pci_known_product pci_known_products[] = { PCI_VENDOR_EXAR, PCI_PRODUCT_EXAR_XR17C158, "XR17C158", }, + { + PCI_VENDOR_EXAR, PCI_PRODUCT_EXAR_XR17V352, + "XR17V352", + }, { PCI_VENDOR_EXAR, PCI_PRODUCT_EXAR_XR17V354, "XR17V354", @@ -14059,6 +14063,14 @@ static const struct pci_known_product pci_known_products[] = { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_XXV710_25G_SFP28, "XXV710 SFP28", }, + { + PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_E810_XXV_QSFP, + "E810 XXV QSFP", + }, + { + PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_E810_XXV_SFP, + "E810 XXV SFP", + }, { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM_2, "I218-LM", diff --git a/sys/dev/pci/psp_pci.c b/sys/dev/pci/psp_pci.c new file mode 100644 index 000000000..bd70866ed --- /dev/null +++ b/sys/dev/pci/psp_pci.c @@ -0,0 +1,126 @@ +/* $OpenBSD: psp_pci.c,v 1.2 2024/11/08 17:34:22 bluhm Exp $ */ + +/* + * Copyright (c) 2023-2024 Hans-Joerg Hoexer + * Copyright (c) 2024 Alexander Bluhm + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include + +#include + +#include +#include + +#include +#include + +static const struct pci_matchid psp_pci_devices[] = { + { PCI_VENDOR_AMD, PCI_PRODUCT_AMD_17_CCP_1 }, + { PCI_VENDOR_AMD, PCI_PRODUCT_AMD_17_3X_CCP }, + { PCI_VENDOR_AMD, PCI_PRODUCT_AMD_19_1X_PSP }, +}; + +int +psp_pci_match(struct ccp_softc *sc, struct pci_attach_args *pa) +{ + bus_size_t reg_capabilities; + uint32_t capabilities; + + if (!pci_matchbyid(pa, psp_pci_devices, nitems(psp_pci_devices))) + return (0); + + if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_AMD_17_CCP_1) + reg_capabilities = PSPV1_REG_CAPABILITIES; + else + reg_capabilities = PSP_REG_CAPABILITIES; + capabilities = bus_space_read_4(sc->sc_iot, sc->sc_ioh, + reg_capabilities); + if (!ISSET(capabilities, PSP_CAP_SEV)) + return (0); + + return (1); +} + +void +psp_pci_intr_map(struct ccp_softc *sc, struct pci_attach_args *pa) +{ + pci_intr_handle_t ih; + const char *intrstr = NULL; + bus_size_t reg_inten, reg_intsts; + + /* clear and disable interrupts */ + if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_AMD_17_CCP_1) { + reg_inten = PSPV1_REG_INTEN; + reg_intsts = PSPV1_REG_INTSTS; + } else { + reg_inten = PSP_REG_INTEN; + reg_intsts = PSP_REG_INTSTS; + } + bus_space_write_4(sc->sc_iot, sc->sc_ioh, reg_inten, 0); + bus_space_write_4(sc->sc_iot, sc->sc_ioh, reg_intsts, -1); + + if (pci_intr_map_msix(pa, 0, &ih) != 0 && + pci_intr_map_msi(pa, &ih) != 0 && pci_intr_map(pa, &ih) != 0) { + printf(": couldn't map interrupt\n"); + return; + } + + intrstr = pci_intr_string(pa->pa_pc, ih); + sc->sc_irqh = pci_intr_establish(pa->pa_pc, ih, IPL_BIO | IPL_MPSAFE, + psp_sev_intr, sc, sc->sc_dev.dv_xname); + if (sc->sc_irqh != NULL) + printf(": %s", intrstr); +} + +void +psp_pci_attach(struct ccp_softc *sc, struct pci_attach_args *pa) +{ + struct psp_attach_args arg; + struct device *self = (struct device *)sc; + bus_size_t reg_capabilities; + + memset(&arg, 0, sizeof(arg)); + arg.iot = sc->sc_iot; + arg.ioh = sc->sc_ioh; + arg.dmat = pa->pa_dmat; + switch (PCI_PRODUCT(pa->pa_id)) { + case PCI_PRODUCT_AMD_17_CCP_1: + arg.version = 1; + reg_capabilities = PSPV1_REG_CAPABILITIES; + break; + case PCI_PRODUCT_AMD_17_3X_CCP: + arg.version = 2; + reg_capabilities = PSP_REG_CAPABILITIES; + break; + case PCI_PRODUCT_AMD_19_1X_PSP: + arg.version = 4; + reg_capabilities = PSP_REG_CAPABILITIES; + break; + default: + reg_capabilities = PSP_REG_CAPABILITIES; + break; + } + arg.capabilities = bus_space_read_4(sc->sc_iot, sc->sc_ioh, + reg_capabilities); + + sc->sc_psp = config_found_sm(self, &arg, pspprint, pspsubmatch); + if (sc->sc_psp == NULL) { + pci_intr_disestablish(pa->pa_pc, sc->sc_irqh); + return; + } +} diff --git a/sys/dev/pci/puc.c b/sys/dev/pci/puc.c index 4c7b41513..30e191bd2 100644 --- a/sys/dev/pci/puc.c +++ b/sys/dev/pci/puc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: puc.c,v 1.31 2022/03/11 18:00:51 mpi Exp $ */ +/* $OpenBSD: puc.c,v 1.32 2024/11/09 10:23:06 miod Exp $ */ /* $NetBSD: puc.c,v 1.3 1999/02/06 06:29:54 cgd Exp $ */ /* @@ -161,7 +161,8 @@ puc_pci_attach(struct device *parent, struct device *self, void *aux) PCI_PRODUCT(pa->pa_id), PCI_VENDOR(subsys), PCI_PRODUCT(subsys)); if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_EXAR && - PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_EXAR_XR17V354) + (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_EXAR_XR17V352 || + PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_EXAR_XR17V354)) sc->sc_xr17v35x = 1; puc_print_ports(sc->sc_desc); diff --git a/sys/dev/pci/pucdata.c b/sys/dev/pci/pucdata.c index f3325a1d9..c785ae2b8 100644 --- a/sys/dev/pci/pucdata.c +++ b/sys/dev/pci/pucdata.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pucdata.c,v 1.120 2024/03/06 00:11:25 jsg Exp $ */ +/* $OpenBSD: pucdata.c,v 1.121 2024/11/09 10:23:06 miod Exp $ */ /* $NetBSD: pucdata.c,v 1.6 1999/07/03 05:55:23 cgd Exp $ */ /* @@ -2156,6 +2156,15 @@ const struct puc_device_description puc_devs[] = { }, }, + { /* Exar XR17V352 Dual UART */ + { PCI_VENDOR_EXAR, PCI_PRODUCT_EXAR_XR17V352, 0, 0 }, + { 0xffff, 0xffff, 0, 0 }, + { + { PUC_PORT_COM_XR17V35X, 0x10, 0x0000 }, + { PUC_PORT_COM_XR17V35X, 0x10, 0x0400 }, + }, + }, + { /* Exar XR17V354 Quad UART */ { PCI_VENDOR_EXAR, PCI_PRODUCT_EXAR_XR17V354, 0, 0 }, { 0xffff, 0xffff, 0, 0 }, diff --git a/sys/dev/pci/virtio_pci.c b/sys/dev/pci/virtio_pci.c index f9c8801ce..8463f6223 100644 --- a/sys/dev/pci/virtio_pci.c +++ b/sys/dev/pci/virtio_pci.c @@ -1,4 +1,4 @@ -/* $OpenBSD: virtio_pci.c,v 1.43 2024/09/19 06:19:05 sf Exp $ */ +/* $OpenBSD: virtio_pci.c,v 1.48 2024/12/20 22:18:27 sf Exp $ */ /* $NetBSD: virtio.c,v 1.3 2011/11/02 23:05:52 njoly Exp $ */ /* @@ -74,6 +74,7 @@ void virtio_pci_write_device_config_8(struct virtio_softc *, int, uint64_t); uint16_t virtio_pci_read_queue_size(struct virtio_softc *, uint16_t); void virtio_pci_setup_queue(struct virtio_softc *, struct virtqueue *, uint64_t); void virtio_pci_setup_intrs(struct virtio_softc *); +int virtio_pci_attach_finish(struct virtio_softc *, struct virtio_attach_args *); int virtio_pci_get_status(struct virtio_softc *); void virtio_pci_set_status(struct virtio_softc *, int); int virtio_pci_negotiate_features(struct virtio_softc *, const struct virtio_feature_name *); @@ -82,6 +83,7 @@ void virtio_pci_set_msix_queue_vector(struct virtio_pci_softc *, uint32_t, uint void virtio_pci_set_msix_config_vector(struct virtio_pci_softc *, uint16_t); int virtio_pci_msix_establish(struct virtio_pci_softc *, struct virtio_pci_attach_args *, int, int (*)(void *), void *); int virtio_pci_setup_msix(struct virtio_pci_softc *, struct virtio_pci_attach_args *, int); +void virtio_pci_intr_barrier(struct virtio_softc *); void virtio_pci_free_irqs(struct virtio_pci_softc *); int virtio_pci_poll_intr(void *); int virtio_pci_legacy_intr(void *); @@ -174,7 +176,9 @@ const struct virtio_ops virtio_pci_ops = { virtio_pci_get_status, virtio_pci_set_status, virtio_pci_negotiate_features, + virtio_pci_attach_finish, virtio_pci_poll_intr, + virtio_pci_intr_barrier, }; static inline uint64_t @@ -590,8 +594,6 @@ virtio_pci_attach(struct device *parent, struct device *self, void *aux) pcitag_t tag = pa->pa_tag; int revision, ret = ENODEV; pcireg_t id; - char const *intrstr; - pci_intr_handle_t ih; struct virtio_pci_attach_args vpa = { { 0 }, pa }; revision = PCI_REVISION(pa->pa_class); @@ -643,13 +645,13 @@ virtio_pci_attach(struct device *parent, struct device *self, void *aux) } if (ret != 0) { printf(": Cannot attach (%d)\n", ret); - goto fail_0; + goto free; } sc->sc_devcfg_offset = VIRTIO_CONFIG_DEVICE_CONFIG_NOMSI; sc->sc_irq_type = IRQ_NO_MSIX; if (virtio_pci_adjust_config_region(sc) != 0) - goto fail_0; + goto err; virtio_device_reset(vsc); virtio_set_status(vsc, VIRTIO_CONFIG_DEVICE_STATUS_ACK); @@ -662,25 +664,47 @@ virtio_pci_attach(struct device *parent, struct device *self, void *aux) if (vsc->sc_child == NULL) { printf("%s: no matching child driver; not configured\n", vsc->sc_dev.dv_xname); - goto fail_1; + goto err; } if (vsc->sc_child == VIRTIO_CHILD_ERROR) { printf("%s: virtio configuration failed\n", vsc->sc_dev.dv_xname); - goto fail_1; + goto err; } - if (virtio_pci_setup_msix(sc, &vpa, 0) == 0) { + return; + +err: + /* no pci_mapreg_unmap() or pci_intr_unmap() */ + virtio_set_status(vsc, VIRTIO_CONFIG_DEVICE_STATUS_FAILED); +free: + free(sc->sc_intr, M_DEVBUF, sc->sc_nintr * sizeof(*sc->sc_intr)); +} + +int +virtio_pci_attach_finish(struct virtio_softc *vsc, + struct virtio_attach_args *va) +{ + struct virtio_pci_softc *sc = (struct virtio_pci_softc *)vsc; + struct virtio_pci_attach_args *vpa = + (struct virtio_pci_attach_args *)va; + pci_intr_handle_t ih; + pci_chipset_tag_t pc = vpa->vpa_pa->pa_pc; + char const *intrstr; + + if (virtio_pci_setup_msix(sc, vpa, 0) == 0) { sc->sc_irq_type = IRQ_MSIX_PER_VQ; intrstr = "msix per-VQ"; - } else if (virtio_pci_setup_msix(sc, &vpa, 1) == 0) { + } else if (virtio_pci_setup_msix(sc, vpa, 1) == 0) { sc->sc_irq_type = IRQ_MSIX_SHARED; intrstr = "msix shared"; } else { int (*ih_func)(void *) = virtio_pci_legacy_intr; - if (pci_intr_map_msi(pa, &ih) != 0 && pci_intr_map(pa, &ih) != 0) { - printf("%s: couldn't map interrupt\n", vsc->sc_dev.dv_xname); - goto fail_2; + if (pci_intr_map_msi(vpa->vpa_pa, &ih) != 0 && + pci_intr_map(vpa->vpa_pa, &ih) != 0) { + printf("%s: couldn't map interrupt\n", + vsc->sc_dev.dv_xname); + return -EIO; } intrstr = pci_intr_string(pc, ih); /* @@ -694,25 +718,17 @@ virtio_pci_attach(struct device *parent, struct device *self, void *aux) vsc->sc_ipl | IPL_MPSAFE, ih_func, sc, vsc->sc_child->dv_xname); if (sc->sc_intr[0].ih == NULL) { - printf("%s: couldn't establish interrupt", vsc->sc_dev.dv_xname); + printf("%s: couldn't establish interrupt", + vsc->sc_dev.dv_xname); if (intrstr != NULL) printf(" at %s", intrstr); printf("\n"); - goto fail_2; + return -EIO; } } - virtio_pci_setup_intrs(vsc); + printf("%s: %s\n", vsc->sc_dev.dv_xname, intrstr); - - return; - -fail_2: - config_detach(vsc->sc_child, 0); -fail_1: - /* no pci_mapreg_unmap() or pci_intr_unmap() */ - virtio_set_status(vsc, VIRTIO_CONFIG_DEVICE_STATUS_FAILED); -fail_0: - free(sc->sc_intr, M_DEVBUF, sc->sc_nintr * sizeof(*sc->sc_intr)); + return 0; } int @@ -821,6 +837,11 @@ virtio_pci_negotiate_features_10(struct virtio_softc *vsc, uint64_t host, negotiated; vsc->sc_driver_features |= VIRTIO_F_VERSION_1; + /* + * XXX Without this SEV doesn't work with a KVM/qemu hypervisor on + * XXX amd64. + */ + vsc->sc_driver_features |= VIRTIO_F_ACCESS_PLATFORM; /* notify on empty is 0.9 only */ vsc->sc_driver_features &= ~VIRTIO_F_NOTIFY_ON_EMPTY; CWRITE(sc, device_feature_select, 0); @@ -1057,6 +1078,18 @@ fail: return 1; } +void +virtio_pci_intr_barrier(struct virtio_softc *vsc) +{ + struct virtio_pci_softc *sc = (struct virtio_pci_softc *)vsc; + int i; + + for (i = 0; i < sc->sc_nintr; i++) { + if (sc->sc_intr[i].ih != NULL) + intr_barrier(sc->sc_intr[i].ih); + } +} + /* * Interrupt handler. */ diff --git a/sys/dev/pv/if_vio.c b/sys/dev/pv/if_vio.c index 06ad4b8fd..3c532da0d 100644 --- a/sys/dev/pv/if_vio.c +++ b/sys/dev/pv/if_vio.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_vio.c,v 1.57 2024/10/03 08:59:49 sf Exp $ */ +/* $OpenBSD: if_vio.c,v 1.63 2025/01/06 14:23:52 sf Exp $ */ /* * Copyright (c) 2012 Stefan Fritsch, Alexander Fiveg. @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -224,8 +225,12 @@ struct vio_queue { struct mbuf **viq_rxmbufs; struct mbuf **viq_txmbufs; struct if_rxring viq_rxring; + struct ifiqueue *viq_ifiq; + struct ifqueue *viq_ifq; struct virtqueue *viq_rxvq; struct virtqueue *viq_txvq; + struct mutex viq_txmtx, viq_rxmtx; + int viq_txfree_slots; }; struct vio_softc { @@ -256,6 +261,7 @@ struct vio_softc { struct vio_queue *sc_q; uint16_t sc_nqueues; + int sc_tx_slots_per_req; int sc_rx_mbuf_size; enum vio_ctrl_state sc_ctrl_inuse; @@ -270,6 +276,9 @@ struct vio_softc { #define VIO_HAVE_MRG_RXBUF(sc) \ ((sc)->sc_hdr_size == sizeof(struct virtio_net_hdr)) +/* vioq N uses the rx/tx vq pair 2*N and 2*N + 1 */ +#define VIO_VQ2Q(sc, vq) (&sc->sc_q[vq->vq_index/2]) + #define VIRTIO_NET_CTRL_MAC_MC_ENTRIES 64 /* for more entries, use ALLMULTI */ #define VIRTIO_NET_CTRL_MAC_UC_ENTRIES 1 /* one entry for own unicast addr */ #define VIRTIO_NET_CTRL_TIMEOUT (5*1000*1000*1000ULL) /* 5 seconds */ @@ -286,7 +295,7 @@ void vio_attach(struct device *, struct device *, void *); /* ifnet interface functions */ int vio_init(struct ifnet *); void vio_stop(struct ifnet *, int); -void vio_start(struct ifnet *); +void vio_start(struct ifqueue *); int vio_ioctl(struct ifnet *, u_long, caddr_t); void vio_get_lladdr(struct arpcom *ac, struct virtio_softc *vsc); void vio_put_lladdr(struct arpcom *ac, struct virtio_softc *vsc); @@ -302,6 +311,7 @@ void vio_rxtick(void *); /* tx */ int vio_tx_intr(struct virtqueue *); +int vio_tx_dequeue(struct virtqueue *); int vio_txeof(struct virtqueue *); void vio_tx_drain(struct vio_softc *); int vio_encap(struct vio_queue *, int, struct mbuf *); @@ -587,6 +597,7 @@ vio_attach(struct device *parent, struct device *self, void *aux) { struct vio_softc *sc = (struct vio_softc *)self; struct virtio_softc *vsc = (struct virtio_softc *)parent; + struct virtio_attach_args *va = aux; int i, tx_max_segments; struct ifnet *ifp = &sc->sc_ac.ac_if; @@ -599,8 +610,7 @@ vio_attach(struct device *parent, struct device *self, void *aux) sc->sc_virtio = vsc; vsc->sc_child = self; - vsc->sc_ipl = IPL_NET; - vsc->sc_config_change = NULL; + vsc->sc_ipl = IPL_NET | IPL_MPSAFE; vsc->sc_driver_features = VIRTIO_NET_F_MAC | VIRTIO_NET_F_STATUS | VIRTIO_NET_F_CTRL_VQ | VIRTIO_NET_F_CTRL_RX | VIRTIO_NET_F_MRG_RXBUF | VIRTIO_NET_F_CSUM | @@ -613,7 +623,8 @@ vio_attach(struct device *parent, struct device *self, void *aux) vsc->sc_driver_features |= VIRTIO_NET_F_GUEST_TSO4; vsc->sc_driver_features |= VIRTIO_NET_F_GUEST_TSO6; - virtio_negotiate_features(vsc, virtio_net_feature_names); + if (virtio_negotiate_features(vsc, virtio_net_feature_names) != 0) + goto err; sc->sc_nqueues = 1; vsc->sc_nvqs = 2 * sc->sc_nqueues; @@ -649,6 +660,7 @@ vio_attach(struct device *parent, struct device *self, void *aux) ifp->if_capabilities = 0; ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; + ifp->if_xflags = IFXF_MPSAFE; #if NVLAN > 0 ifp->if_capabilities |= IFCAP_VLAN_MTU; ifp->if_capabilities |= IFCAP_VLAN_HWOFFLOAD; @@ -687,11 +699,18 @@ vio_attach(struct device *parent, struct device *self, void *aux) tx_max_segments = 32; } + if (virtio_has_feature(vsc, VIRTIO_F_RING_INDIRECT_DESC)) + sc->sc_tx_slots_per_req = 1; + else + sc->sc_tx_slots_per_req = tx_max_segments + 1; + for (i = 0; i < sc->sc_nqueues; i++) { int vqidx = 2 * i; struct vio_queue *vioq = &sc->sc_q[i]; vioq->viq_rxvq = &vsc->sc_vqs[vqidx]; + mtx_init(&vioq->viq_txmtx, IPL_NET); + mtx_init(&vioq->viq_rxmtx, IPL_NET); vioq->viq_sc = sc; if (virtio_alloc_vq(vsc, vioq->viq_rxvq, vqidx, 2, "rx") != 0) goto err; @@ -709,6 +728,7 @@ vio_attach(struct device *parent, struct device *self, void *aux) virtio_postpone_intr_far(vioq->viq_txvq); else virtio_stop_vq_intr(vsc, vioq->viq_txvq); + vioq->viq_txfree_slots = vioq->viq_txvq->vq_num - 1; } /* control queue */ @@ -726,7 +746,7 @@ vio_attach(struct device *parent, struct device *self, void *aux) strlcpy(ifp->if_xname, self->dv_xname, IFNAMSIZ); ifp->if_softc = sc; - ifp->if_start = vio_start; + ifp->if_qstart = vio_start; ifp->if_ioctl = vio_ioctl; ifq_init_maxlen(&ifp->if_snd, vsc->sc_vqs[1].vq_num - 1); @@ -734,12 +754,24 @@ vio_attach(struct device *parent, struct device *self, void *aux) ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_AUTO, 0, NULL); ifmedia_set(&sc->sc_media, IFM_ETHER | IFM_AUTO); vsc->sc_config_change = vio_config_change; - timeout_set(&sc->sc_txtick, vio_txtick, sc->sc_q[0].viq_txvq); - timeout_set(&sc->sc_rxtick, vio_rxtick, sc->sc_q[0].viq_rxvq); + timeout_set(&sc->sc_txtick, vio_txtick, sc); + timeout_set(&sc->sc_rxtick, vio_rxtick, sc); + + if (virtio_attach_finish(vsc, va) != 0) + goto err; - virtio_set_status(vsc, VIRTIO_CONFIG_DEVICE_STATUS_DRIVER_OK); if_attach(ifp); ether_ifattach(ifp); + vio_link_state(ifp); + + if_attach_queues(ifp, sc->sc_nqueues); + if_attach_iqueues(ifp, sc->sc_nqueues); + + for (i = 0; i < sc->sc_nqueues; i++) { + ifp->if_ifqs[i]->ifq_softc = &sc->sc_q[i]; + sc->sc_q[i].viq_ifq = ifp->if_ifqs[i]; + sc->sc_q[i].viq_ifiq = ifp->if_iqs[i]; + } return; @@ -777,8 +809,10 @@ int vio_config_change(struct virtio_softc *vsc) { struct vio_softc *sc = (struct vio_softc *)vsc->sc_child; + KERNEL_LOCK(); vio_link_state(&sc->sc_ac.ac_if); vio_needs_reset(sc); + KERNEL_UNLOCK(); return 1; } @@ -814,12 +848,14 @@ vio_init(struct ifnet *ifp) for (qidx = 0; qidx < sc->sc_nqueues; qidx++) { struct vio_queue *vioq = &sc->sc_q[qidx]; + mtx_enter(&vioq->viq_rxmtx); if_rxr_init(&vioq->viq_rxring, 2 * ((ifp->if_hardmtu / sc->sc_rx_mbuf_size) + 1), vioq->viq_rxvq->vq_num); vio_populate_rx_mbufs(sc, vioq); + ifq_clr_oactive(vioq->viq_ifq); + mtx_leave(&vioq->viq_rxmtx); } - ifq_clr_oactive(&ifp->if_snd); vio_iff(sc); vio_link_state(ifp); @@ -854,11 +890,14 @@ vio_stop(struct ifnet *ifp, int disable) CLR(ifp->if_flags, IFF_RUNNING); timeout_del(&sc->sc_txtick); timeout_del(&sc->sc_rxtick); - ifq_clr_oactive(&ifp->if_snd); /* only way to stop I/O and DMA is resetting... */ virtio_reset(vsc); - for (i = 0; i < sc->sc_nqueues; i++) + virtio_intr_barrier(vsc); + for (i = 0; i < sc->sc_nqueues; i++) { + mtx_enter(&sc->sc_q[i].viq_rxmtx); vio_rxeof(&sc->sc_q[i]); + mtx_leave(&sc->sc_q[i].viq_rxmtx); + } if (virtio_has_feature(vsc, VIRTIO_NET_F_CTRL_VQ)) vio_ctrl_wakeup(sc, RESET); @@ -960,35 +999,43 @@ vio_tx_offload(struct virtio_net_hdr *hdr, struct mbuf *m) } void -vio_start(struct ifnet *ifp) +vio_start(struct ifqueue *viq_ifq) { + struct ifnet *ifp = viq_ifq->ifq_if; + struct vio_queue *vioq = viq_ifq->ifq_softc; struct vio_softc *sc = ifp->if_softc; struct virtio_softc *vsc = sc->sc_virtio; - struct vio_queue *vioq = &sc->sc_q[0]; struct virtqueue *vq = vioq->viq_txvq; struct mbuf *m; - int queued = 0; + int queued = 0, free_slots, used_slots, r; - vio_txeof(vq); - - if (!(ifp->if_flags & IFF_RUNNING) || ifq_is_oactive(&ifp->if_snd)) - return; - if (ifq_empty(&ifp->if_snd)) - return; + mtx_enter(&vioq->viq_txmtx); + r = vio_tx_dequeue(vq); + if (r && ifq_is_oactive(viq_ifq)) + ifq_clr_oactive(viq_ifq); again: + free_slots = vioq->viq_txfree_slots; + KASSERT(free_slots >= 0); + used_slots = 0; for (;;) { - int slot, r; + int slot; struct virtio_net_hdr *hdr; - m = ifq_deq_begin(&ifp->if_snd); + if (free_slots - used_slots < sc->sc_tx_slots_per_req) { + ifq_set_oactive(viq_ifq); + break; + } + + m = ifq_dequeue(viq_ifq); if (m == NULL) break; r = virtio_enqueue_prep(vq, &slot); if (r == EAGAIN) { - ifq_deq_rollback(&ifp->if_snd, m); - ifq_set_oactive(&ifp->if_snd); + printf("%s: virtio_enqueue_prep failed?\n", __func__); + m_freem(m); + viq_ifq->ifq_errors++; break; } if (r != 0) @@ -1002,22 +1049,27 @@ again: r = vio_encap(vioq, slot, m); if (r != 0) { virtio_enqueue_abort(vq, slot); - ifq_deq_commit(&ifp->if_snd, m); m_freem(m); - ifp->if_oerrors++; + viq_ifq->ifq_errors++; continue; } r = virtio_enqueue_reserve(vq, slot, vioq->viq_txdmamaps[slot]->dm_nsegs + 1); if (r != 0) { + printf("%s: virtio_enqueue_reserve failed?\n", + __func__); + m_freem(m); + viq_ifq->ifq_errors++; bus_dmamap_unload(vsc->sc_dmat, vioq->viq_txdmamaps[slot]); - ifq_deq_rollback(&ifp->if_snd, m); vioq->viq_txmbufs[slot] = NULL; - ifq_set_oactive(&ifp->if_snd); break; } - ifq_deq_commit(&ifp->if_snd, m); + if (sc->sc_tx_slots_per_req == 1) + used_slots++; + else + used_slots += vioq->viq_txdmamaps[slot]->dm_nsegs + 1; + bus_dmamap_sync(vsc->sc_dmat, vioq->viq_txdmamaps[slot], 0, vioq->viq_txdmamaps[slot]->dm_mapsize, @@ -1031,14 +1083,23 @@ again: bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_OUT); #endif } - if (ifq_is_oactive(&ifp->if_snd)) { - int r; + if (used_slots > 0) { + if (used_slots > vioq->viq_txfree_slots) + printf("%s: used_slots %d viq_txfree_slots %d " + "free_slots %d\n", __func__, used_slots, + vioq->viq_txfree_slots, free_slots); + vioq->viq_txfree_slots -= used_slots; + KASSERT(vioq->viq_txfree_slots >= 0); + } + if (ifq_is_oactive(viq_ifq) && ISSET(ifp->if_flags, IFF_RUNNING)) { if (virtio_has_feature(vsc, VIRTIO_F_RING_EVENT_IDX)) - r = virtio_postpone_intr_smart(vioq->viq_txvq); + r = virtio_postpone_intr_smart(vq); else - r = virtio_start_vq_intr(vsc, vioq->viq_txvq); + r = virtio_start_vq_intr(vsc, vq); if (r) { - vio_txeof(vq); + r = vio_tx_dequeue(vq); + if (r) + ifq_clr_oactive(viq_ifq); goto again; } } @@ -1047,6 +1108,7 @@ again: virtio_notify(vsc, vq); timeout_add_sec(&sc->sc_txtick, 1); } + mtx_leave(&vioq->viq_txmtx); } #if VIRTIO_DEBUG @@ -1054,19 +1116,20 @@ void vio_dump(struct vio_softc *sc) { struct ifnet *ifp = &sc->sc_ac.ac_if; - struct virtio_softc *vsc = sc->sc_virtio; int i; printf("%s status dump:\n", ifp->if_xname); printf("tx tick active: %d\n", !timeout_triggered(&sc->sc_txtick)); + printf("max tx slots per req %d\n", sc->sc_tx_slots_per_req); printf("rx tick active: %d\n", !timeout_triggered(&sc->sc_rxtick)); for (i = 0; i < sc->sc_nqueues; i++) { printf("%d: TX virtqueue:\n", i); + printf(" tx free slots %d\n", sc->sc_q[i].viq_txfree_slots); virtio_vq_dump(sc->sc_q[i].viq_txvq); printf("%d: RX virtqueue:\n", i); virtio_vq_dump(sc->sc_q[i].viq_rxvq); } - if (virtio_has_feature(vsc, VIRTIO_NET_F_CTRL_VQ)) { + if (sc->sc_ctl_vq != NULL) { printf("CTL virtqueue:\n"); virtio_vq_dump(sc->sc_ctl_vq); printf("ctrl_inuse: %d\n", sc->sc_ctrl_inuse); @@ -1170,6 +1233,7 @@ vio_populate_rx_mbufs(struct vio_softc *sc, struct vio_queue *vioq) struct virtqueue *vq = vioq->viq_rxvq; int mrg_rxbuf = VIO_HAVE_MRG_RXBUF(sc); + MUTEX_ASSERT_LOCKED(&vioq->viq_rxmtx); for (slots = if_rxr_get(&vioq->viq_rxring, vq->vq_num); slots > 0; slots--) { int slot; @@ -1272,6 +1336,7 @@ vio_rxeof(struct vio_queue *vioq) int slot, len, bufs_left; struct virtio_net_hdr *hdr; + MUTEX_ASSERT_LOCKED(&vioq->viq_rxmtx); while (virtio_dequeue(vsc, vioq->viq_rxvq, &slot, &len) == 0) { r = 1; bus_dmamap_sync(vsc->sc_dmat, vioq->viq_rxdmamaps[slot], 0, @@ -1315,7 +1380,7 @@ vio_rxeof(struct vio_queue *vioq) m_freem(m0); } - if (ifiq_input(&ifp->if_rcv, &ml)) + if (ifiq_input(vioq->viq_ifiq, &ml)) if_rxr_livelocked(&vioq->viq_rxring); return r; @@ -1326,10 +1391,10 @@ vio_rx_intr(struct virtqueue *vq) { struct virtio_softc *vsc = vq->vq_owner; struct vio_softc *sc = (struct vio_softc *)vsc->sc_child; - /* vioq N uses the rx/tx vq pair 2*N and 2*N + 1 */ - struct vio_queue *vioq = &sc->sc_q[vq->vq_index/2]; + struct vio_queue *vioq = VIO_VQ2Q(sc, vq); int r, sum = 0; + mtx_enter(&vioq->viq_rxmtx); again: r = vio_rxeof(vioq); sum += r; @@ -1342,24 +1407,21 @@ again: } } + mtx_leave(&vioq->viq_rxmtx); return sum; } void vio_rxtick(void *arg) { - struct virtqueue *vq = arg; - struct virtio_softc *vsc = vq->vq_owner; - struct vio_softc *sc = (struct vio_softc *)vsc->sc_child; - struct vio_queue *vioq; - int s, qidx; + struct vio_softc *sc = arg; + int i; - s = splnet(); - for (qidx = 0; qidx < sc->sc_nqueues; qidx++) { - vioq = &sc->sc_q[qidx]; - vio_populate_rx_mbufs(sc, vioq); + for (i = 0; i < sc->sc_nqueues; i++) { + mtx_enter(&sc->sc_q[i].viq_rxmtx); + vio_populate_rx_mbufs(sc, &sc->sc_q[i]); + mtx_leave(&sc->sc_q[i].viq_rxmtx); } - splx(s); } /* free all the mbufs; called from if_stop(disable) */ @@ -1394,37 +1456,35 @@ vio_tx_intr(struct virtqueue *vq) { struct virtio_softc *vsc = vq->vq_owner; struct vio_softc *sc = (struct vio_softc *)vsc->sc_child; - struct ifnet *ifp = &sc->sc_ac.ac_if; + struct vio_queue *vioq = VIO_VQ2Q(sc, vq); int r; r = vio_txeof(vq); - vio_start(ifp); + vio_start(vioq->viq_ifq); return r; } void vio_txtick(void *arg) { - struct virtqueue *vq = arg; - int s = splnet(); - virtio_check_vq(vq->vq_owner, vq); - splx(s); + struct vio_softc *sc = arg; + int i; + + for (i = 0; i < sc->sc_nqueues; i++) + virtio_check_vq(sc->sc_virtio, sc->sc_q[i].viq_txvq); } int -vio_txeof(struct virtqueue *vq) +vio_tx_dequeue(struct virtqueue *vq) { struct virtio_softc *vsc = vq->vq_owner; struct vio_softc *sc = (struct vio_softc *)vsc->sc_child; - /* vioq N uses the rx/tx vq pair 2*N and 2*N + 1 */ - struct vio_queue *vioq = &sc->sc_q[vq->vq_index/2]; - struct ifnet *ifp = &sc->sc_ac.ac_if; + struct vio_queue *vioq = VIO_VQ2Q(sc, vq); struct mbuf *m; int r = 0; - int slot, len; + int slot, len, freed = 0; - if (!ISSET(ifp->if_flags, IFF_RUNNING)) - return 0; + MUTEX_ASSERT_LOCKED(&vioq->viq_txmtx); while (virtio_dequeue(vsc, vq, &slot, &len) == 0) { struct virtio_net_hdr *hdr = &vioq->viq_txhdrs[slot]; @@ -1437,13 +1497,34 @@ vio_txeof(struct virtqueue *vq) m = vioq->viq_txmbufs[slot]; bus_dmamap_unload(vsc->sc_dmat, vioq->viq_txdmamaps[slot]); vioq->viq_txmbufs[slot] = NULL; - virtio_dequeue_commit(vq, slot); + freed += virtio_dequeue_commit(vq, slot); m_freem(m); } + KASSERT(vioq->viq_txfree_slots >= 0); + vioq->viq_txfree_slots += freed; + return r; +} + + +int +vio_txeof(struct virtqueue *vq) +{ + struct virtio_softc *vsc = vq->vq_owner; + struct vio_softc *sc = (struct vio_softc *)vsc->sc_child; + struct vio_queue *vioq = VIO_VQ2Q(sc, vq); + int r; + + mtx_enter(&vioq->viq_txmtx); + r = vio_tx_dequeue(vq); + mtx_leave(&vioq->viq_txmtx); if (r) { - ifq_clr_oactive(&ifp->if_snd); - virtio_stop_vq_intr(vsc, vioq->viq_txvq); + if (ifq_is_oactive(vioq->viq_ifq)) { + mtx_enter(&vioq->viq_txmtx); + virtio_stop_vq_intr(vsc, vq); + mtx_leave(&vioq->viq_txmtx); + ifq_restart(vioq->viq_ifq); + } } if (vq->vq_used_idx == vq->vq_avail_idx) timeout_del(&sc->sc_txtick); @@ -1488,6 +1569,8 @@ vio_tx_drain(struct vio_softc *sc) for (q = 0; q < sc->sc_nqueues; q++) { vioq = &sc->sc_q[q]; + ifq_barrier(vioq->viq_ifq); + mtx_enter(&vioq->viq_txmtx); for (i = 0; i < vioq->viq_txvq->vq_num; i++) { if (vioq->viq_txmbufs[i] == NULL) continue; @@ -1496,6 +1579,10 @@ vio_tx_drain(struct vio_softc *sc) m_freem(vioq->viq_txmbufs[i]); vioq->viq_txmbufs[i] = NULL; } + ifq_purge(vioq->viq_ifq); + ifq_clr_oactive(vioq->viq_ifq); + vioq->viq_txfree_slots = vioq->viq_txvq->vq_num - 1; + mtx_leave(&vioq->viq_txmtx); } } @@ -1681,18 +1768,23 @@ vio_ctrleof(struct virtqueue *vq) { struct virtio_softc *vsc = vq->vq_owner; struct vio_softc *sc = (struct vio_softc *)vsc->sc_child; - int r = 0, ret, slot; + int r = 0, ret, slot, s; + KERNEL_LOCK(); + s = splnet(); again: ret = virtio_dequeue(vsc, vq, &slot, NULL); if (ret == ENOENT) - return r; + goto out; virtio_dequeue_commit(vq, slot); r++; vio_ctrl_wakeup(sc, DONE); if (virtio_start_vq_intr(vsc, vq)) goto again; +out: + splx(s); + KERNEL_UNLOCK(); return r; } diff --git a/sys/dev/pv/vioblk.c b/sys/dev/pv/vioblk.c index 153a27621..ed2ff2018 100644 --- a/sys/dev/pv/vioblk.c +++ b/sys/dev/pv/vioblk.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vioblk.c,v 1.43 2024/08/27 18:44:12 sf Exp $ */ +/* $OpenBSD: vioblk.c,v 1.44 2024/12/20 22:18:27 sf Exp $ */ /* * Copyright (c) 2012 Stefan Fritsch. @@ -170,12 +170,12 @@ vioblk_attach(struct device *parent, struct device *self, void *aux) { struct vioblk_softc *sc = (struct vioblk_softc *)self; struct virtio_softc *vsc = (struct virtio_softc *)parent; + struct virtio_attach_args *va = aux; struct scsibus_attach_args saa; int qsize; vsc->sc_vqs = &sc->sc_vq[0]; vsc->sc_nvqs = 1; - vsc->sc_config_change = NULL; if (vsc->sc_child) panic("already attached to something else"); vsc->sc_child = self; @@ -184,7 +184,8 @@ vioblk_attach(struct device *parent, struct device *self, void *aux) vsc->sc_driver_features = VIRTIO_BLK_F_RO | VIRTIO_F_NOTIFY_ON_EMPTY | VIRTIO_BLK_F_SIZE_MAX | VIRTIO_BLK_F_SEG_MAX | VIRTIO_BLK_F_FLUSH; - virtio_negotiate_features(vsc, vioblk_feature_names); + if (virtio_negotiate_features(vsc, vioblk_feature_names) != 0) + goto err; if (virtio_has_feature(vsc, VIRTIO_BLK_F_SIZE_MAX)) { uint32_t size_max = virtio_read_device_config_4(vsc, @@ -252,10 +253,11 @@ vioblk_attach(struct device *parent, struct device *self, void *aux) saa.saa_quirks = 0; saa.saa_wwpn = saa.saa_wwnn = 0; - virtio_set_status(vsc, VIRTIO_CONFIG_DEVICE_STATUS_DRIVER_OK); + if (virtio_attach_finish(vsc, va) != 0) + goto err; config_found(self, &saa, scsiprint); - return; + err: vsc->sc_child = VIRTIO_CHILD_ERROR; return; diff --git a/sys/dev/pv/viocon.c b/sys/dev/pv/viocon.c index 681a842cd..ca3eb97b9 100644 --- a/sys/dev/pv/viocon.c +++ b/sys/dev/pv/viocon.c @@ -1,4 +1,4 @@ -/* $OpenBSD: viocon.c,v 1.15 2024/08/27 18:44:12 sf Exp $ */ +/* $OpenBSD: viocon.c,v 1.16 2024/12/20 22:18:27 sf Exp $ */ /* * Copyright (c) 2013-2015 Stefan Fritsch @@ -179,7 +179,6 @@ viocon_attach(struct device *parent, struct device *self, void *aux) panic("already attached to something else"); vsc->sc_child = self; vsc->sc_ipl = IPL_TTY; - vsc->sc_config_change = NULL; sc->sc_virtio = vsc; sc->sc_max_ports = maxports; @@ -193,7 +192,8 @@ viocon_attach(struct device *parent, struct device *self, void *aux) } vsc->sc_driver_features = VIRTIO_CONSOLE_F_SIZE; - virtio_negotiate_features(vsc, viocon_feature_names); + if (virtio_negotiate_features(vsc, viocon_feature_names) != 0) + goto err; printf("\n"); DPRINTF("%s: softc: %p\n", __func__, sc); @@ -201,10 +201,11 @@ viocon_attach(struct device *parent, struct device *self, void *aux) printf("\n%s: viocon_port_create failed\n", __func__); goto err; } + if (virtio_attach_finish(vsc, va) != 0) + goto err; viocon_rx_fill(sc->sc_ports[0]); - virtio_set_status(vsc, VIRTIO_CONFIG_DEVICE_STATUS_DRIVER_OK); - return; + err: vsc->sc_child = VIRTIO_CHILD_ERROR; free(vsc->sc_vqs, M_DEVBUF, 2 * (maxports + 1) * sizeof(struct virtqueue)); diff --git a/sys/dev/pv/viogpu.c b/sys/dev/pv/viogpu.c index 7f3be0954..ee4433e46 100644 --- a/sys/dev/pv/viogpu.c +++ b/sys/dev/pv/viogpu.c @@ -1,4 +1,4 @@ -/* $OpenBSD: viogpu.c,v 1.9 2024/08/27 18:44:12 sf Exp $ */ +/* $OpenBSD: viogpu.c,v 1.11 2024/12/20 22:18:27 sf Exp $ */ /* * Copyright (c) 2021-2023 joshua stein @@ -150,6 +150,7 @@ viogpu_attach(struct device *parent, struct device *self, void *aux) { struct viogpu_softc *sc = (struct viogpu_softc *)self; struct virtio_softc *vsc = (struct virtio_softc *)parent; + struct virtio_attach_args *va = aux; struct wsemuldisplaydev_attach_args waa; struct rasops_info *ri = &sc->sc_ri; uint32_t defattr; @@ -161,10 +162,11 @@ viogpu_attach(struct device *parent, struct device *self, void *aux) } vsc->sc_child = self; - virtio_negotiate_features(vsc, viogpu_feature_names); + if (virtio_negotiate_features(vsc, viogpu_feature_names) != 0) + goto err; if (!vsc->sc_version_1) { printf(": requires virtio version 1\n"); - return; + goto err; } vsc->sc_ipl = IPL_TTY; @@ -175,13 +177,13 @@ viogpu_attach(struct device *parent, struct device *self, void *aux) vsc->sc_vqs = sc->sc_vqs; if (virtio_alloc_vq(vsc, &sc->sc_vqs[VQCTRL], VQCTRL, 1, "control")) { printf(": alloc_vq failed\n"); - return; + goto err; } sc->sc_vqs[VQCTRL].vq_done = viogpu_vq_done; if (virtio_alloc_vq(vsc, &sc->sc_vqs[VQCURS], VQCURS, 1, "cursor")) { printf(": alloc_vq failed\n"); - return; + goto err; } vsc->sc_nvqs = nitems(sc->sc_vqs); @@ -191,7 +193,7 @@ viogpu_attach(struct device *parent, struct device *self, void *aux) sc->sc_dma_size, 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &sc->sc_dma_map) != 0) { printf(": create failed"); - goto err; + goto errdma; } if (bus_dmamem_alloc(vsc->sc_dmat, sc->sc_dma_size, 16, 0, &sc->sc_dma_seg, 1, &nsegs, BUS_DMA_NOWAIT | BUS_DMA_ZERO) != 0) { @@ -209,7 +211,8 @@ viogpu_attach(struct device *parent, struct device *self, void *aux) goto unmap; } - virtio_set_status(vsc, VIRTIO_CONFIG_DEVICE_STATUS_DRIVER_OK); + if (virtio_attach_finish(vsc, va) != 0) + goto unmap; if (viogpu_get_display_info(sc) != 0) goto unmap; @@ -302,8 +305,10 @@ free: bus_dmamem_free(vsc->sc_dmat, &sc->sc_dma_seg, 1); destroy: bus_dmamap_destroy(vsc->sc_dmat, sc->sc_dma_map); -err: +errdma: printf(": DMA setup failed\n"); +err: + vsc->sc_child = VIRTIO_CHILD_ERROR; return; } @@ -369,7 +374,7 @@ viogpu_send_cmd(struct viogpu_softc *sc, void *cmd, size_t cmd_size, void *ret, memcpy(sc->sc_cmd, cmd, cmd_size); memset(sc->sc_cmd + cmd_size, 0, ret_size); -#if VIRTIO_DEBUG +#if VIRTIO_DEBUG >= 3 printf("%s: [%ld -> %ld]: ", __func__, cmd_size, ret_size); for (int i = 0; i < cmd_size; i++) { printf(" %02x", ((unsigned char *)sc->sc_cmd)[i]); diff --git a/sys/dev/pv/viomb.c b/sys/dev/pv/viomb.c index e8d16c581..de89a48d8 100644 --- a/sys/dev/pv/viomb.c +++ b/sys/dev/pv/viomb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: viomb.c,v 1.12 2024/08/27 18:44:12 sf Exp $ */ +/* $OpenBSD: viomb.c,v 1.13 2024/12/20 22:18:27 sf Exp $ */ /* $NetBSD: viomb.c,v 1.1 2011/10/30 12:12:21 hannken Exp $ */ /* @@ -135,6 +135,7 @@ viomb_attach(struct device *parent, struct device *self, void *aux) { struct viomb_softc *sc = (struct viomb_softc *)self; struct virtio_softc *vsc = (struct virtio_softc *)parent; + struct virtio_attach_args *va = aux; int i; if (vsc->sc_child != NULL) { @@ -219,8 +220,10 @@ viomb_attach(struct device *parent, struct device *self, void *aux) sensordev_install(&sc->sc_sensdev); printf("\n"); - virtio_set_status(vsc, VIRTIO_CONFIG_DEVICE_STATUS_DRIVER_OK); + if (virtio_attach_finish(vsc, va) != 0) + goto err_dmamap; return; + err_dmamap: bus_dmamap_destroy(vsc->sc_dmat, sc->sc_req.bl_dmamap); err: diff --git a/sys/dev/pv/viornd.c b/sys/dev/pv/viornd.c index 8139b4a6a..484f7ce1b 100644 --- a/sys/dev/pv/viornd.c +++ b/sys/dev/pv/viornd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: viornd.c,v 1.11 2024/08/27 18:44:12 sf Exp $ */ +/* $OpenBSD: viornd.c,v 1.12 2024/12/20 22:18:27 sf Exp $ */ /* * Copyright (c) 2014 Stefan Fritsch @@ -83,18 +83,19 @@ viornd_attach(struct device *parent, struct device *self, void *aux) { struct viornd_softc *sc = (struct viornd_softc *)self; struct virtio_softc *vsc = (struct virtio_softc *)parent; + struct virtio_attach_args *va = aux; unsigned int shift; vsc->sc_vqs = &sc->sc_vq; vsc->sc_nvqs = 1; - vsc->sc_config_change = NULL; if (vsc->sc_child != NULL) panic("already attached to something else"); vsc->sc_child = self; vsc->sc_ipl = IPL_NET; sc->sc_virtio = vsc; - virtio_negotiate_features(vsc, NULL); + if (virtio_negotiate_features(vsc, NULL) != 0) + goto err; if (sc->sc_dev.dv_cfdata->cf_flags & VIORND_ONESHOT) { sc->sc_interval = 0; @@ -136,7 +137,8 @@ viornd_attach(struct device *parent, struct device *self, void *aux) timeout_add(&sc->sc_tick, 1); printf("\n"); - virtio_set_status(vsc, VIRTIO_CONFIG_DEVICE_STATUS_DRIVER_OK); + if (virtio_attach_finish(vsc, va) != 0) + goto err2; return; err2: bus_dmamap_destroy(vsc->sc_dmat, sc->sc_dmamap); diff --git a/sys/dev/pv/vioscsi.c b/sys/dev/pv/vioscsi.c index 41dbc113d..3ebac61ab 100644 --- a/sys/dev/pv/vioscsi.c +++ b/sys/dev/pv/vioscsi.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vioscsi.c,v 1.34 2024/08/27 18:44:12 sf Exp $ */ +/* $OpenBSD: vioscsi.c,v 1.35 2024/12/20 22:18:27 sf Exp $ */ /* * Copyright (c) 2013 Google Inc. * @@ -105,6 +105,7 @@ vioscsi_attach(struct device *parent, struct device *self, void *aux) { struct virtio_softc *vsc = (struct virtio_softc *)parent; struct vioscsi_softc *sc = (struct vioscsi_softc *)self; + struct virtio_attach_args *va = aux; struct scsibus_attach_args saa; int i, rv; @@ -120,7 +121,8 @@ vioscsi_attach(struct device *parent, struct device *self, void *aux) vsc->sc_vqs = sc->sc_vqs; vsc->sc_nvqs = nitems(sc->sc_vqs); - virtio_negotiate_features(vsc, NULL); + if (virtio_negotiate_features(vsc, NULL) != 0) + goto err; uint32_t cmd_per_lun = virtio_read_device_config_4(vsc, VIRTIO_SCSI_CONFIG_CMD_PER_LUN); uint32_t seg_max = virtio_read_device_config_4(vsc, @@ -166,7 +168,8 @@ vioscsi_attach(struct device *parent, struct device *self, void *aux) saa.saa_quirks = saa.saa_flags = 0; saa.saa_wwpn = saa.saa_wwnn = 0; - virtio_set_status(vsc, VIRTIO_CONFIG_DEVICE_STATUS_DRIVER_OK); + if (virtio_attach_finish(vsc, va) != 0) + goto err; config_found(self, &saa, scsiprint); return; diff --git a/sys/dev/pv/virtio.c b/sys/dev/pv/virtio.c index 6d9fe06d6..69eb26386 100644 --- a/sys/dev/pv/virtio.c +++ b/sys/dev/pv/virtio.c @@ -1,4 +1,4 @@ -/* $OpenBSD: virtio.c,v 1.32 2024/09/02 08:26:26 sf Exp $ */ +/* $OpenBSD: virtio.c,v 1.36 2024/12/20 22:18:27 sf Exp $ */ /* $NetBSD: virtio.c,v 1.3 2011/11/02 23:05:52 njoly Exp $ */ /* @@ -154,6 +154,25 @@ virtio_reset(struct virtio_softc *sc) sc->sc_active_features = 0; } +int +virtio_attach_finish(struct virtio_softc *sc, struct virtio_attach_args *va) +{ + int i, ret; + + ret = sc->sc_ops->attach_finish(sc, va); + if (ret != 0) + return ret; + + sc->sc_ops->setup_intrs(sc); + for (i = 0; i < sc->sc_nvqs; i++) { + struct virtqueue *vq = &sc->sc_vqs[i]; + + virtio_setup_queue(sc, vq, vq->vq_dmamap->dm_segs[0].ds_addr); + } + virtio_set_status(sc, VIRTIO_CONFIG_DEVICE_STATUS_DRIVER_OK); + return 0; +} + void virtio_reinit_start(struct virtio_softc *sc) { @@ -162,6 +181,7 @@ virtio_reinit_start(struct virtio_softc *sc) virtio_set_status(sc, VIRTIO_CONFIG_DEVICE_STATUS_ACK); virtio_set_status(sc, VIRTIO_CONFIG_DEVICE_STATUS_DRIVER); virtio_negotiate_features(sc, NULL); + sc->sc_ops->setup_intrs(sc); for (i = 0; i < sc->sc_nvqs; i++) { int n; struct virtqueue *vq = &sc->sc_vqs[i]; @@ -175,7 +195,6 @@ virtio_reinit_start(struct virtio_softc *sc) virtio_init_vq(sc, vq); virtio_setup_queue(sc, vq, vq->vq_dmamap->dm_segs[0].ds_addr); } - sc->sc_ops->setup_intrs(sc); } void @@ -421,7 +440,6 @@ virtio_alloc_vq(struct virtio_softc *sc, struct virtqueue *vq, int index, } virtio_init_vq(sc, vq); - virtio_setup_queue(sc, vq, vq->vq_dmamap->dm_segs[0].ds_addr); #if VIRTIO_DEBUG printf("\nallocated %u byte for virtqueue %d for %s, size %d\n", @@ -848,22 +866,25 @@ virtio_dequeue(struct virtio_softc *sc, struct virtqueue *vq, * * Don't call this if you use statically allocated slots * and virtio_enqueue_trim(). + * + * returns the number of freed slots. */ int virtio_dequeue_commit(struct virtqueue *vq, int slot) { struct vq_entry *qe = &vq->vq_entries[slot]; struct vring_desc *vd = &vq->vq_desc[0]; - int s = slot; + int s = slot, r = 1; while (vd[s].flags & VRING_DESC_F_NEXT) { s = vd[s].next; vq_free_entry(vq, qe); qe = &vq->vq_entries[s]; + r++; } vq_free_entry(vq, qe); - return 0; + return r; } /* diff --git a/sys/dev/pv/virtiovar.h b/sys/dev/pv/virtiovar.h index 193a0b586..03a18b2dd 100644 --- a/sys/dev/pv/virtiovar.h +++ b/sys/dev/pv/virtiovar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: virtiovar.h,v 1.22 2024/09/02 08:26:26 sf Exp $ */ +/* $OpenBSD: virtiovar.h,v 1.26 2024/12/20 22:18:27 sf Exp $ */ /* $NetBSD: virtiovar.h,v 1.1 2011/10/30 12:12:21 hannken Exp $ */ /* @@ -161,7 +161,9 @@ struct virtio_ops { int (*get_status)(struct virtio_softc *); void (*set_status)(struct virtio_softc *, int); int (*neg_features)(struct virtio_softc *, const struct virtio_feature_name *); + int (*attach_finish)(struct virtio_softc *, struct virtio_attach_args *); int (*poll_intr)(void *); + void (*intr_barrier)(struct virtio_softc *); }; #define VIRTIO_CHILD_ERROR ((void*)1) @@ -203,6 +205,7 @@ struct virtio_softc { #define virtio_poll_intr(sc) (sc)->sc_ops->poll_intr(sc) #define virtio_get_status(sc) (sc)->sc_ops->get_status(sc) #define virtio_set_status(sc, i) (sc)->sc_ops->set_status(sc, i) +#define virtio_intr_barrier(sc) (sc)->sc_ops->intr_barrier(sc) /* only for transport drivers */ #define virtio_device_reset(sc) virtio_set_status((sc), 0) @@ -218,6 +221,7 @@ virtio_has_feature(struct virtio_softc *sc, uint64_t fbit) int virtio_alloc_vq(struct virtio_softc*, struct virtqueue*, int, int, const char*); int virtio_free_vq(struct virtio_softc*, struct virtqueue*); +int virtio_attach_finish(struct virtio_softc *, struct virtio_attach_args *); void virtio_reset(struct virtio_softc *); void virtio_reinit_start(struct virtio_softc *); void virtio_reinit_end(struct virtio_softc *); diff --git a/sys/dev/pv/vmmci.c b/sys/dev/pv/vmmci.c index acf5482b7..2c83b512b 100644 --- a/sys/dev/pv/vmmci.c +++ b/sys/dev/pv/vmmci.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vmmci.c,v 1.12 2024/08/26 19:37:54 sf Exp $ */ +/* $OpenBSD: vmmci.c,v 1.13 2024/12/20 22:18:27 sf Exp $ */ /* * Copyright (c) 2017 Reyk Floeter @@ -89,6 +89,7 @@ vmmci_attach(struct device *parent, struct device *self, void *aux) { struct vmmci_softc *sc = (struct vmmci_softc *)self; struct virtio_softc *vsc = (struct virtio_softc *)parent; + struct virtio_attach_args *va = aux; if (vsc->sc_child != NULL) panic("already attached to something else"); @@ -101,7 +102,8 @@ vmmci_attach(struct device *parent, struct device *self, void *aux) vsc->sc_driver_features = VMMCI_F_TIMESYNC | VMMCI_F_ACK | VMMCI_F_SYNCRTC; - virtio_negotiate_features(vsc, NULL); + if (virtio_negotiate_features(vsc, NULL) != 0) + goto err; if (virtio_has_feature(vsc, VMMCI_F_TIMESYNC)) { strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname, @@ -115,7 +117,12 @@ vmmci_attach(struct device *parent, struct device *self, void *aux) } printf("\n"); - virtio_set_status(vsc, VIRTIO_CONFIG_DEVICE_STATUS_DRIVER_OK); + if (virtio_attach_finish(vsc, va) != 0) + goto err; + return; + +err: + vsc->sc_child = VIRTIO_CHILD_ERROR; } int diff --git a/sys/dev/pv/xen.c b/sys/dev/pv/xen.c index 0c6ad0a90..3bcc91430 100644 --- a/sys/dev/pv/xen.c +++ b/sys/dev/pv/xen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: xen.c,v 1.98 2024/05/24 10:05:55 jsg Exp $ */ +/* $OpenBSD: xen.c,v 1.100 2024/11/27 02:38:35 jsg Exp $ */ /* * Copyright (c) 2015, 2016, 2017 Mike Belopuhov @@ -1355,6 +1355,7 @@ xen_attach_device(struct xen_softc *sc, struct xen_devlist *xdl, struct xen_device *xdv; unsigned long long res; + memset(&xa, 0, sizeof(xa)); xa.xa_dmat = &xen_bus_dma_tag; strlcpy(xa.xa_name, name, sizeof(xa.xa_name)); @@ -1364,15 +1365,14 @@ xen_attach_device(struct xen_softc *sc, struct xen_devlist *xdl, sizeof(xa.xa_backend))) { DPRINTF("%s: failed to identify \"backend\" for " "\"%s\"\n", sc->sc_dev.dv_xname, xa.xa_node); - return (EIO); } if (xs_getnum(sc, xa.xa_node, "backend-id", &res) || res > UINT16_MAX) { DPRINTF("%s: invalid \"backend-id\" for \"%s\"\n", sc->sc_dev.dv_xname, xa.xa_node); - return (EIO); } - xa.xa_domid = (uint16_t)res; + if (res <= UINT16_MAX) + xa.xa_domid = (uint16_t)res; xdv = malloc(sizeof(struct xen_device), M_DEVBUF, M_ZERO | M_NOWAIT); if (xdv == NULL) @@ -1426,7 +1426,7 @@ xen_probe_devices(struct xen_softc *sc) printf("%s: failed to attach \"%s/%s\"\n", sc->sc_dev.dv_xname, path, (const char *)iovp2[j].iov_base); - goto out; + continue; } } /* Setup a watch for every device subtree */ diff --git a/sys/dev/rnd.c b/sys/dev/rnd.c index 259721d90..dab962129 100644 --- a/sys/dev/rnd.c +++ b/sys/dev/rnd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rnd.c,v 1.229 2024/08/02 01:53:21 guenther Exp $ */ +/* $OpenBSD: rnd.c,v 1.230 2024/12/30 02:46:00 guenther Exp $ */ /* * Copyright (c) 2011,2020 Theo de Raadt. @@ -799,9 +799,6 @@ randomioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) case FIOASYNC: /* No async flag in softc so this is a no-op. */ break; - case FIONBIO: - /* Handled in the upper FS layer. */ - break; default: return ENOTTY; } diff --git a/sys/dev/sbus/cgtwelvereg.h b/sys/dev/sbus/cgtwelvereg.h index fc6cdf190..c73a667f4 100644 --- a/sys/dev/sbus/cgtwelvereg.h +++ b/sys/dev/sbus/cgtwelvereg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cgtwelvereg.h,v 1.2 2006/07/20 11:23:49 martin Exp $ */ +/* $OpenBSD: cgtwelvereg.h,v 1.3 2024/10/22 21:50:02 jsg Exp $ */ /* * Copyright (c) 2002 Miodrag Vallat. All rights reserved. @@ -200,8 +200,7 @@ struct cgtwelve_apu { u_int32_t test; }; -struct cgtwelve_dac -{ +struct cgtwelve_dac { u_int32_t addr_lo; u_int8_t pad1[0x100 - 4]; u_int32_t addr_hi; diff --git a/sys/dev/softraid.c b/sys/dev/softraid.c index 3acccfaf6..c50a15072 100644 --- a/sys/dev/softraid.c +++ b/sys/dev/softraid.c @@ -1,4 +1,4 @@ -/* $OpenBSD: softraid.c,v 1.431 2024/08/18 19:44:10 phessler Exp $ */ +/* $OpenBSD: softraid.c,v 1.432 2024/12/24 19:19:18 krw Exp $ */ /* * Copyright (c) 2007, 2008, 2009 Marco Peereboom * Copyright (c) 2008 Chris Kuethe @@ -5062,8 +5062,8 @@ sr_hibernate_io(dev_t dev, daddr_t blkno, vaddr_t addr, size_t size, int op, voi * We share the page with the underlying device's own * side-effect free I/O function, so we pad our data to * the end of the page. Presently this does not overlap - * with either of the two other side-effect free i/o - * functions (ahci/wd). + * with the other side-effect free i/o functions + * (ahci/wd/nvme/ufshci/sdmmc). */ struct { char pad[3072]; diff --git a/sys/dev/usb/fido.c b/sys/dev/usb/fido.c index af9cef6bf..719976ec0 100644 --- a/sys/dev/usb/fido.c +++ b/sys/dev/usb/fido.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fido.c,v 1.6 2024/05/23 03:21:08 jsg Exp $ */ +/* $OpenBSD: fido.c,v 1.7 2024/12/30 02:46:00 guenther Exp $ */ /* * Copyright (c) 2019 Reyk Floeter @@ -78,7 +78,6 @@ fidoioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p) int error; switch (cmd) { - case FIONBIO: case FIOASYNC: case USB_GET_DEVICEINFO: break; diff --git a/sys/dev/usb/if_urtwn.c b/sys/dev/usb/if_urtwn.c index a579dffb3..4700f3e61 100644 --- a/sys/dev/usb/if_urtwn.c +++ b/sys/dev/usb/if_urtwn.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_urtwn.c,v 1.111 2024/09/01 03:09:00 jsg Exp $ */ +/* $OpenBSD: if_urtwn.c,v 1.112 2024/10/22 22:21:25 jsg Exp $ */ /*- * Copyright (c) 2010 Damien Bergamini @@ -239,7 +239,6 @@ static const struct urtwn_type { struct usb_devno dev; uint32_t chip; } urtwn_devs[] = { - URTWN_DEV_8192CU(ABOCOM, RTL8188CU_1), URTWN_DEV_8192CU(ABOCOM, RTL8188CU_1), URTWN_DEV_8192CU(ABOCOM, RTL8188CU_2), URTWN_DEV_8192CU(ABOCOM, RTL8192CU), diff --git a/sys/dev/usb/uaudio.c b/sys/dev/usb/uaudio.c index e94548851..7bc61f494 100644 --- a/sys/dev/usb/uaudio.c +++ b/sys/dev/usb/uaudio.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uaudio.c,v 1.176 2024/09/01 03:09:00 jsg Exp $ */ +/* $OpenBSD: uaudio.c,v 1.178 2025/01/07 12:49:40 ratchov Exp $ */ /* * Copyright (c) 2018 Alexandre Ratchov * @@ -86,12 +86,22 @@ #define UAUDIO_AC_CLKMULT 0xc #define UAUDIO_AC_RATECONV 0xd +/* + * AC class-specific CLKSRC controls + */ +#define UAUDIO_CLKSRC_FREQCTL 0x2 + /* * AS class-specific interface sub-types */ #define UAUDIO_AS_GENERAL 0x1 #define UAUDIO_AS_FORMAT 0x2 +/* + * AS class-specific endpoint sub-types + */ +#define UAUDIO_AS_EP_GENERAL 0x1 + /* * AS class-specific endpoint sub-type */ @@ -229,6 +239,7 @@ struct uaudio_softc { /* sample rates, if this is a clock source */ struct uaudio_ranges rates; + int cap_freqctl; /* mixer(4) bits */ #define UAUDIO_CLASS_OUT 0 @@ -284,6 +295,7 @@ struct uaudio_softc { int fps; /* USB (micro-)frames per second */ int bps, bits, nch; /* audio encoding */ int v1_rates; /* if UAC 1.0, bitmap of rates */ + int v1_cap_freqctl; /* can set the sample rate */ } *alts; /* @@ -1032,10 +1044,10 @@ uaudio_alt_getrates(struct uaudio_softc *sc, struct uaudio_alt *p) } /* - * return the clock unit of the given terminal unit (v2 only) + * return the clock source unit */ -int -uaudio_clock_id(struct uaudio_softc *sc) +struct uaudio_unit * +uaudio_clock(struct uaudio_softc *sc) { struct uaudio_unit *u; @@ -1043,11 +1055,11 @@ uaudio_clock_id(struct uaudio_softc *sc) while (1) { if (u == NULL) { DPRINTF("%s: NULL clock pointer\n", __func__); - return -1; + return NULL; } switch (u->type) { case UAUDIO_AC_CLKSRC: - return u->id; + return u; case UAUDIO_AC_CLKSEL: u = u->clock; break; @@ -1057,7 +1069,7 @@ uaudio_clock_id(struct uaudio_softc *sc) break; default: DPRINTF("%s: no clock\n", __func__); - return -1; + return NULL; } } } @@ -1287,6 +1299,7 @@ uaudio_process_unit(struct uaudio_softc *sc, u->mixent_list = NULL; u->nch = 0; u->name[0] = 0; + u->cap_freqctl = 0; uaudio_ranges_init(&u->rates); u->unit_next = sc->unit_list; sc->unit_list = u; @@ -1494,6 +1507,7 @@ uaudio_process_unit(struct uaudio_softc *sc, return 0; DPRINTF("%02u: clock source, attr = 0x%x, ctl = 0x%x\n", u->id, u->term, ctl); + u->cap_freqctl = !!(ctl & UAUDIO_CLKSRC_FREQCTL); break; case UAUDIO_AC_CLKSEL: DPRINTF("%02u: clock sel\n", u->id); @@ -2222,6 +2236,8 @@ uaudio_process_ac(struct uaudio_softc *sc, struct uaudio_blob *p, int ifnum) if (uaudio_debug) { printf("%02u: clock rates: ", u->id); uaudio_ranges_print(&u->rates); + if (!u->cap_freqctl) + printf("%02u: no rate control\n", u->id); } #endif break; @@ -2393,6 +2409,31 @@ uaudio_process_as_ep(struct uaudio_softc *sc, return 1; } +/* + * Parse AS class-specifig endpoint descriptor + */ +int +uaudio_process_as_cs_ep(struct uaudio_softc *sc, + struct uaudio_blob *p, struct uaudio_alt *a, int nep) +{ + unsigned int subtype, attr; + + if (!uaudio_getnum(p, 1, &subtype)) + return 0; + if (subtype != UAUDIO_AS_EP_GENERAL) { + DPRINTF("%s: %d: bad cs ep subtype\n", __func__, subtype); + return 0; + } + if (!uaudio_getnum(p, 1, &attr)) + return 0; + if (sc->version == UAUDIO_V1) { + a->v1_cap_freqctl = !!(attr & UAUDIO_EP_FREQCTL); + if (!a->v1_cap_freqctl) + DPRINTF("alt %d: no rate control\n", a->altnum); + } + return 1; +} + /* * Parse AS general descriptor. Non-PCM interfaces are skipped. UAC * v2.0 report the number of channels. For UAC v1.0 we set the number @@ -2546,6 +2587,7 @@ uaudio_process_as(struct uaudio_softc *sc, a = malloc(sizeof(struct uaudio_alt), M_USBDEV, M_WAITOK); a->mode = 0; a->nch = 0; + a->v1_cap_freqctl = 0; a->v1_rates = 0; a->data_addr = 0; a->sync_addr = 0; @@ -2590,14 +2632,16 @@ uaudio_process_as(struct uaudio_softc *sc, goto failed; if (!uaudio_getnum(&dp, 1, &type)) goto failed; - if (type == UDESC_CS_ENDPOINT) - continue; - if (type != UDESC_ENDPOINT) { + if (type == UDESC_CS_ENDPOINT) { + if (!uaudio_process_as_cs_ep(sc, &dp, a, nep)) + goto failed; + } else if (type == UDESC_ENDPOINT) { + if (!uaudio_process_as_ep(sc, &dp, a, nep)) + goto failed; + } else { p->rptr = savep; break; } - if (!uaudio_process_as_ep(sc, &dp, a, nep)) - goto failed; } if (a->mode == 0) { @@ -2772,8 +2816,8 @@ uaudio_process_conf(struct uaudio_softc *sc, struct uaudio_blob *p) break; } if (nep == 0) { - DPRINTF("%s: " - "stop altnum %d\n", __func__, altnum); + DPRINTF("%s: stop altnum %d, ifnum %d\n", + __func__, altnum, ifnum); break; /* 0 is "stop sound", skip it */ } if (!uaudio_process_as(sc, p, ifnum, altnum, nep)) @@ -2901,10 +2945,11 @@ uaudio_stream_open(struct uaudio_softc *sc, int dir, { struct uaudio_stream *s; struct uaudio_alt *a; + struct uaudio_unit *clock; struct usbd_interface *iface; unsigned char req_buf[4]; unsigned int bpa, spf_max, min_blksz; - int err, clock_id, i; + int err, i; if (dir == AUMODE_PLAY) { s = &sc->pstream; @@ -3047,23 +3092,21 @@ uaudio_stream_open(struct uaudio_softc *sc, int dir, * * Certain devices are able to lock their clock to the data * rate and expose no frequency control. In this case, the - * request to set the frequency will fail, but this error is - * safe to ignore. - * - * Such devices expose this capability in the class-specific - * endpoint descriptor (UAC v1.0) or in the clock unit - * descriptor (UAC v2.0) but we don't want to use them for now - * as certain devices have them wrong, missing or misplaced. + * request to set the frequency will fail and freeze the device. */ switch (sc->version) { case UAUDIO_V1: + if (!a->v1_cap_freqctl) { + DPRINTF("%s: not setting endpoint rate\n", __func__); + break; + } req_buf[0] = sc->rate; req_buf[1] = sc->rate >> 8; req_buf[2] = sc->rate >> 16; if (!uaudio_req(sc, UT_WRITE_CLASS_ENDPOINT, UAUDIO_V1_REQ_SET_CUR, UAUDIO_REQSEL_RATE, 0, a->data_addr, 0, req_buf, 3)) { - DPRINTF("%s: not setting endpoint rate\n", __func__); + printf("%s: failed to set endpoint rate\n", DEVNAME(sc)); } break; case UAUDIO_V2: @@ -3071,15 +3114,19 @@ uaudio_stream_open(struct uaudio_softc *sc, int dir, req_buf[1] = sc->rate >> 8; req_buf[2] = sc->rate >> 16; req_buf[3] = sc->rate >> 24; - clock_id = uaudio_clock_id(sc); - if (clock_id < 0) { - printf("%s: can't get clock id\n", DEVNAME(sc)); + clock = uaudio_clock(sc); + if (clock == NULL) { + printf("%s: can't get clock\n", DEVNAME(sc)); goto failed; } + if (!clock->cap_freqctl) { + DPRINTF("%s: not setting clock rate\n", __func__); + break; + } if (!uaudio_req(sc, UT_WRITE_CLASS_INTERFACE, UAUDIO_V2_REQ_CUR, UAUDIO_REQSEL_RATE, 0, - sc->ctl_ifnum, clock_id, req_buf, 4)) { - DPRINTF("%s: not setting clock rate\n", __func__); + sc->ctl_ifnum, clock->id, req_buf, 4)) { + printf("%s: failed to set clock rate\n", DEVNAME(sc)); } break; } diff --git a/sys/dev/usb/uchcom.c b/sys/dev/usb/uchcom.c index c620ea9f4..19b50b5ad 100644 --- a/sys/dev/usb/uchcom.c +++ b/sys/dev/usb/uchcom.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uchcom.c,v 1.36 2024/05/23 03:21:09 jsg Exp $ */ +/* $OpenBSD: uchcom.c,v 1.37 2024/10/22 21:50:02 jsg Exp $ */ /* $NetBSD: uchcom.c,v 1.1 2007/09/03 17:57:37 tshiozak Exp $ */ /* @@ -127,8 +127,7 @@ int uchcomdebug = 0; #define UCHCOM_TYPE_CH343 1 -struct uchcom_softc -{ +struct uchcom_softc { struct device sc_dev; struct usbd_device *sc_udev; struct device *sc_subdev; @@ -151,8 +150,7 @@ struct uchcom_softc int sc_lcr2; }; -struct uchcom_endpoints -{ +struct uchcom_endpoints { int ep_bulkin; int ep_bulkin_size; int ep_bulkout; @@ -160,15 +158,13 @@ struct uchcom_endpoints int ep_intr_size; }; -struct uchcom_divider -{ +struct uchcom_divider { uint8_t dv_prescaler; uint8_t dv_div; uint8_t dv_mod; }; -struct uchcom_divider_record -{ +struct uchcom_divider_record { uint32_t dvr_high; uint32_t dvr_low; uint32_t dvr_base_clock; diff --git a/sys/dev/usb/udl.c b/sys/dev/usb/udl.c index da7eea766..0647de92b 100644 --- a/sys/dev/usb/udl.c +++ b/sys/dev/usb/udl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: udl.c,v 1.100 2024/05/23 03:21:09 jsg Exp $ */ +/* $OpenBSD: udl.c,v 1.103 2024/11/09 08:26:29 miod Exp $ */ /* * Copyright (c) 2009 Marcus Glocker @@ -230,26 +230,44 @@ struct udl_type { }; static const struct udl_type udl_devs[] = { - { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LCD4300U }, DL120 }, - { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LCD8000U }, DL120 }, { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_GUC2020 }, DL160 }, { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LD220 }, DL165 }, + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LD190 }, DLUNK }, + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_U70 }, DLUNK }, + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_TOSHIBA }, DLUNK }, + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_POLARIS2 }, DLUNK }, { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_VCUD60 }, DL160 }, + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_CONV }, DL160 }, { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_DLDVI }, DL160 }, + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_USBRGB }, DLUNK }, + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LCDUSB7X }, DLUNK }, + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LCDUSB10X }, + DLUNK }, { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_VGA10 }, DL120 }, { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_WSDVI }, DLUNK }, { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_EC008 }, DL160 }, + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_FYDVI2 }, DLUNK }, + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_GXDVIU2 }, DLUNK }, + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LCD4300U }, DL120 }, + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LCD8000U }, DL120 }, { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_HPDOCK }, DL160 }, { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_NL571 }, DL160 }, { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_M01061 }, DL195 }, { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_NBDOCK }, DL165 }, + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_GXDVIU2B }, DLUNK }, { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_SWDVI }, DLUNK }, - { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_UM7X0 }, DL120 }, - { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_CONV }, DL160 }, { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LUM70 }, DL125 }, - { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_POLARIS2 }, DLUNK }, + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LCD8000UD_DVI }, + DLUNK }, + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LDEWX015U }, + DLUNK }, + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_KC002N }, DLUNK }, + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_MIMO }, DLUNK }, + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_PLUGABLE }, DLUNK }, { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LT1421 }, DLUNK }, - { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_TOSHIBA }, DLUNK } + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_SD_U2VDH }, DLUNK }, + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_UM7X0 }, DL120 }, + { { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_FYDVI }, DLUNK } }; #define udl_lookup(v, p) ((struct udl_type *)usb_lookup(udl_devs, v, p)) @@ -2026,8 +2044,8 @@ udl_select_mode(struct udl_softc *sc) int index = MAX_DL_MODES, i; /* try to get the preferred mode from EDID */ - edid_parse(sc->sc_edid, &sc->sc_edid_info); -#ifdef UDL_DEBUG + edid_parse(DN(sc), sc->sc_edid, &sc->sc_edid_info); +#if defined(UDL_DEBUG) && defined(EDID_DEBUG) edid_print(&sc->sc_edid_info); #endif if (sc->sc_edid_info.edid_preferred_mode != NULL) { diff --git a/sys/dev/usb/uftdi.c b/sys/dev/usb/uftdi.c index 134f3bf76..530b6796b 100644 --- a/sys/dev/usb/uftdi.c +++ b/sys/dev/usb/uftdi.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uftdi.c,v 1.79 2024/05/23 03:21:09 jsg Exp $ */ +/* $OpenBSD: uftdi.c,v 1.80 2024/11/09 08:37:44 miod Exp $ */ /* $NetBSD: uftdi.c,v 1.14 2003/02/23 04:20:07 simonb Exp $ */ /* @@ -143,6 +143,25 @@ static const struct usb_devno uftdi_devs[] = { { USB_VENDOR_BBELECTR, USB_PRODUCT_BBELECTR_USPTL4 }, { USB_VENDOR_BBELECTR, USB_PRODUCT_BBELECTR_USTL4 }, { USB_VENDOR_BBELECTR, USB_PRODUCT_BBELECTR_ZZ_PROG1 }, + { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US101 }, + { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US159 }, + { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US235 }, + { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US257 }, + { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US279_12 }, + { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US279_34 }, + { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US279_56 }, + { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US279_78 }, + { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US313 }, + { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US320 }, + { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US324 }, + { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US346_12 }, + { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US346_34 }, + { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US701_12 }, + { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US701_34 }, + { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US842_12 }, + { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US842_34 }, + { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US842_56 }, + { USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US842_78 }, { USB_VENDOR_DRESDENELEC, USB_PRODUCT_DRESDENELEC_STB }, { USB_VENDOR_DRESDENELEC, USB_PRODUCT_DRESDENELEC_WHT }, { USB_VENDOR_ELEKTOR, USB_PRODUCT_ELEKTOR_FT323R }, diff --git a/sys/dev/usb/ugen.c b/sys/dev/usb/ugen.c index 08b786dda..9c2a081a0 100644 --- a/sys/dev/usb/ugen.c +++ b/sys/dev/usb/ugen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ugen.c,v 1.118 2024/05/23 03:21:09 jsg Exp $ */ +/* $OpenBSD: ugen.c,v 1.119 2024/12/30 02:46:00 guenther Exp $ */ /* $NetBSD: ugen.c,v 1.63 2002/11/26 18:49:48 christos Exp $ */ /* $FreeBSD: src/sys/dev/usb/ugen.c,v 1.26 1999/11/17 22:33:41 n_hibma Exp $ */ @@ -978,9 +978,6 @@ ugen_do_ioctl(struct ugen_softc *sc, int endpt, u_long cmd, caddr_t addr, return (EIO); switch (cmd) { - case FIONBIO: - /* All handled in the upper FS layer. */ - return (0); case USB_SET_SHORT_XFER: if (endpt == USB_CONTROL_ENDPOINT) return (EINVAL); diff --git a/sys/dev/usb/uhid.c b/sys/dev/usb/uhid.c index 31d880e8c..c17a1fd19 100644 --- a/sys/dev/usb/uhid.c +++ b/sys/dev/usb/uhid.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uhid.c,v 1.91 2024/05/23 03:21:09 jsg Exp $ */ +/* $OpenBSD: uhid.c,v 1.92 2024/12/30 02:46:00 guenther Exp $ */ /* $NetBSD: uhid.c,v 1.57 2003/03/11 16:44:00 augustss Exp $ */ /* @@ -374,7 +374,6 @@ uhid_do_ioctl(struct uhid_softc *sc, u_long cmd, caddr_t addr, return (EIO); switch (cmd) { - case FIONBIO: case FIOASYNC: /* All handled in the upper FS layer. */ break; diff --git a/sys/dev/usb/ujoy.c b/sys/dev/usb/ujoy.c index 9d7d48ced..955704199 100644 --- a/sys/dev/usb/ujoy.c +++ b/sys/dev/usb/ujoy.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ujoy.c,v 1.5 2024/05/23 03:21:09 jsg Exp $ */ +/* $OpenBSD: ujoy.c,v 1.6 2024/12/30 02:46:00 guenther Exp $ */ /* * Copyright (c) 2021 Thomas Frohwein @@ -125,7 +125,6 @@ int ujoyioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p) { switch (cmd) { - case FIONBIO: case FIOASYNC: case USB_GET_DEVICEINFO: case USB_GET_REPORT: diff --git a/sys/dev/usb/upd.c b/sys/dev/usb/upd.c index 9fa5fd73a..5edb32a7c 100644 --- a/sys/dev/usb/upd.c +++ b/sys/dev/usb/upd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: upd.c,v 1.32 2024/05/23 03:21:09 jsg Exp $ */ +/* $OpenBSD: upd.c,v 1.33 2024/12/01 09:05:05 landry Exp $ */ /* * Copyright (c) 2015 David Higgs @@ -60,6 +60,8 @@ static struct upd_usage_entry upd_usage_batdep[] = { SENSOR_PERCENT, "RemainingCapacity" }, { HUP_BATTERY, HUB_FULLCHARGE_CAPACITY, SENSOR_PERCENT, "FullChargeCapacity" }, + { HUP_POWER, HUP_PERCENT_LOAD, + SENSOR_PERCENT, "PercentLoad" }, { HUP_BATTERY, HUB_CHARGING, SENSOR_INDICATOR, "Charging" }, { HUP_BATTERY, HUB_DISCHARGING, @@ -411,6 +413,7 @@ upd_sensor_update(struct upd_softc *sc, struct upd_sensor *sensor, case HUB_ABS_STATEOF_CHARGE: case HUB_REM_CAPACITY: case HUB_FULLCHARGE_CAPACITY: + case HUP_PERCENT_LOAD: adjust = 1000; /* scale adjust */ break; case HUB_ATRATE_TIMETOFULL: diff --git a/sys/dev/usb/usb.c b/sys/dev/usb/usb.c index 395bc2576..a59e00efc 100644 --- a/sys/dev/usb/usb.c +++ b/sys/dev/usb/usb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: usb.c,v 1.133 2024/09/04 07:54:52 mglocker Exp $ */ +/* $OpenBSD: usb.c,v 1.134 2024/12/22 22:36:23 kirill Exp $ */ /* $NetBSD: usb.c,v 1.77 2003/01/01 00:10:26 thorpej Exp $ */ /* @@ -952,7 +952,7 @@ usb_tap(struct usbd_bus *bus, struct usbd_xfer *xfer, uint8_t dir) struct usbpcap_iso_hdr_full uih; } h; struct usbpcap_pkt_hdr *uph = &h.uch.uch_hdr; - uint32_t nframes, offset; + uint32_t nframes, psize; unsigned int bpfdir; void *data = NULL; size_t flen; @@ -970,8 +970,13 @@ usb_tap(struct usbd_bus *bus, struct usbd_xfer *xfer, uint8_t dir) uph->uph_xfertype = USBPCAP_TRANSFER_CONTROL; break; case UE_ISOCHRONOUS: - offset = 0; nframes = xfer->nframes; + /* + * All our drivers use a fixed size (psize) for + * ISOCHRONOUS packets. Calculate it to determine the + * correct offset below. + */ + psize = xfer->length / nframes; #ifdef DIAGNOSTIC if (nframes > _USBPCAP_MAX_ISOFRAMES) { printf("%s: too many frames: %d > %d\n", __func__, @@ -987,11 +992,14 @@ usb_tap(struct usbd_bus *bus, struct usbd_xfer *xfer, uint8_t dir) h.uih.uih_nframes = nframes; h.uih.uih_errors = 0; /* we don't have per-frame error */ for (i = 0; i < nframes; i++) { - h.uih.uih_frames[i].uip_offset = offset; + /* + * We can't use length, because IN frame may + * have shorter length of packet whan expected. + */ + h.uih.uih_frames[i].uip_offset = i * psize; h.uih.uih_frames[i].uip_length = xfer->frlengths[i]; /* See above, we don't have per-frame error */ h.uih.uih_frames[i].uip_status = 0; - offset += xfer->frlengths[i]; } break; case UE_BULK: @@ -1051,6 +1059,12 @@ usb_tap(struct usbd_bus *bus, struct usbd_xfer *xfer, uint8_t dir) } } + /* ISOCHRONOUS IN from device may have gaps, use full buffer */ + if (bpfdir == BPF_DIRECTION_IN && uph->uph_dlen > 0 && + uph->uph_xfertype == USBPCAP_TRANSFER_ISOCHRONOUS) { + uph->uph_dlen = xfer->length; + } + /* Dump bulk/intr/iso data, ctrl DATA or STATUS stage. */ bpf_tap_hdr(bpf, uph, uph->uph_hlen, data, uph->uph_dlen, bpfdir); diff --git a/sys/dev/usb/usbdevs b/sys/dev/usb/usbdevs index 1c3abfaf2..03ae93c72 100644 --- a/sys/dev/usb/usbdevs +++ b/sys/dev/usb/usbdevs @@ -1,4 +1,4 @@ -$OpenBSD: usbdevs,v 1.769 2024/10/07 13:26:18 sthen Exp $ +$OpenBSD: usbdevs,v 1.773 2024/12/14 10:02:47 kirill Exp $ /* $NetBSD: usbdevs,v 1.322 2003/05/10 17:47:14 hamajima Exp $ */ /* @@ -1284,6 +1284,27 @@ product BILLIONTON USBEL100 0x0988 USB100EL product BILLIONTON USBE100 0x8511 USBE100 product BILLIONTON USB2AR 0x90ff USB2AR Ethernet +/* Brainboxes Limited Products */ +product BRAINBOXES US101 0x1011 US-101 USB2Serial 1xRS232 +product BRAINBOXES US324 0x1013 US-324 USB2Serial 1xRS422/485 +product BRAINBOXES US235 0x1017 US-235 USB2Serial 1xRS232 +product BRAINBOXES US320 0x1019 US-320 USB2Serial 1xRS422/485 +product BRAINBOXES US159 0x1021 US-159 USB2Serial 1xRS232 +product BRAINBOXES US701_12 0x2011 US-701 USB2Serial 4xRS232 (Port 1 and 2) +product BRAINBOXES US701_34 0x2012 US-701 USB2Serial 4xRS232 (Port 3 and 4) +product BRAINBOXES US279_12 0x2021 US-279 USB2Serial 8xRS232 (Port 1 and 2) +product BRAINBOXES US279_34 0x2022 US-279 USB2Serial 8xRS232 (Port 3 and 4) +product BRAINBOXES US279_56 0x2023 US-279 USB2Serial 8xRS232 (Port 5 and 6) +product BRAINBOXES US279_78 0x2024 US-279 USB2Serial 8xRS232 (Port 7 and 8) +product BRAINBOXES US346_12 0x3011 US-346 USB2Serial 4xRS422/485 (Port 1 and 2) +product BRAINBOXES US346_34 0x3012 US-346 USB2Serial 4xRS422/485 (Port 3 and 4) +product BRAINBOXES US257 0x5001 US-257 USB2Serial 2xRS232 +product BRAINBOXES US313 0x6001 US-313 USB2Serial 2xRS422/485 +product BRAINBOXES US842_12 0x8001 US-842 USB2Serial 8xRS422/485 (Port 1 and 2) +product BRAINBOXES US842_34 0x8002 US-842 USB2Serial 8xRS422/485 (Port 3 and 4) +product BRAINBOXES US842_56 0x8003 US-842 USB2Serial 8xRS422/485 (Port 5 and 6) +product BRAINBOXES US842_78 0x8004 US-842 USB2Serial 8xRS422/485 (Port 7 and 8) + /* Broadcom products */ product BROADCOM BCMFW 0x0bdc BCMFW product BROADCOM BCM2033 0x2000 BCM2033 @@ -1582,24 +1603,39 @@ product DIGITALSTREAM PS2 0x0001 PS/2 Active /* DisplayLink products */ product DISPLAYLINK GUC2020 0x0059 IOGEAR DVI GUC2020 product DISPLAYLINK LD220 0x0100 Samsung LD220 +product DISPLAYLINK LD190 0x0102 Samsung LD190 +product DISPLAYLINK U70 0x0103 Samsung U70 product DISPLAYLINK TOSHIBA 0x0110 TOSHIBA Video Dock product DISPLAYLINK POLARIS2 0x0117 Polaris2 USB dock product DISPLAYLINK VCUD60 0x0136 Rextron DVI product DISPLAYLINK CONV 0x0138 StarTech CONV-USB2DVI product DISPLAYLINK DLDVI 0x0141 DisplayLink DVI +product DISPLAYLINK USBRGB 0x0150 IO-DATA USB-RGB +product DISPLAYLINK LCDUSB7X 0x0153 IO-DATA LCD-USB7X +product DISPLAYLINK LCDUSB10X 0x0156 IO-DATA LCD-USB10XB-T product DISPLAYLINK VGA10 0x015a CMP-USBVGA10 product DISPLAYLINK WSDVI 0x0198 WS Tech DVI product DISPLAYLINK EC008 0x019b EasyCAP008 DVI +product DISPLAYLINK FYDVI2 0x019e DisplayLink FY-DVI2 +product DISPLAYLINK GXDVIU2 0x01ac BUFFALO GX-DVI/U2 product DISPLAYLINK LCD4300U 0x01ba LCD-4300U product DISPLAYLINK LCD8000U 0x01bb LCD-8000U product DISPLAYLINK HPDOCK 0x01d4 HP USB Docking product DISPLAYLINK NL571 0x01d7 HP USB DVI product DISPLAYLINK M01061 0x01e2 Lenovo DVI product DISPLAYLINK NBDOCK 0x0215 VideoHome NBdock1920 +product DISPLAYLINK GXDVIU2B 0x0223 BUFFALO GX-DVI/U2B product DISPLAYLINK SWDVI 0x024c SUNWEIT DVI product DISPLAYLINK LUM70 0x02a9 Lilliput UM-70 +product DISPLAYLINK LCD8000UD_DVI 0x02b8 LCD-8000UD-DVI +product DISPLAYLINK LDEWX015U 0x02e3 Logitec LDE-WX015U +product DISPLAYLINK KC002N 0x02ee SANWA SUPPLY 500-KC002N +product DISPLAYLINK MIMO 0x0335 DisplayLink MIMO +product DISPLAYLINK PLUGABLE 0x0377 Plugable docking station product DISPLAYLINK LT1421 0x03e0 Lenovo ThinkVision LT1421 +product DISPLAYLINK SD_U2VDH 0x046d AREA SD-U2VDH product DISPLAYLINK UM7X0 0x401a nanovision MiMo +product DISPLAYLINK FYDVI 0x8060 DisplayLink FY-DVI /* D-Link products */ /*product DLINK DSBS25 0x0100 DSB-S25 serial */ diff --git a/sys/dev/usb/usbdevs.h b/sys/dev/usb/usbdevs.h index 036c6e3b8..df2530eea 100644 --- a/sys/dev/usb/usbdevs.h +++ b/sys/dev/usb/usbdevs.h @@ -1,10 +1,10 @@ -/* $OpenBSD: usbdevs.h,v 1.781 2024/10/07 13:26:32 sthen Exp $ */ +/* $OpenBSD: usbdevs.h,v 1.785 2024/12/14 10:04:51 kirill Exp $ */ /* * THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. * * generated from: - * OpenBSD: usbdevs,v 1.769 2024/10/07 13:26:18 sthen Exp + * OpenBSD: usbdevs,v 1.773 2024/12/14 10:02:47 kirill Exp */ /* $NetBSD: usbdevs,v 1.322 2003/05/10 17:47:14 hamajima Exp $ */ @@ -1291,6 +1291,27 @@ #define USB_PRODUCT_BILLIONTON_USBE100 0x8511 /* USBE100 */ #define USB_PRODUCT_BILLIONTON_USB2AR 0x90ff /* USB2AR Ethernet */ +/* Brainboxes Limited Products */ +#define USB_PRODUCT_BRAINBOXES_US101 0x1011 /* US-101 USB2Serial 1xRS232 */ +#define USB_PRODUCT_BRAINBOXES_US324 0x1013 /* US-324 USB2Serial 1xRS422/485 */ +#define USB_PRODUCT_BRAINBOXES_US235 0x1017 /* US-235 USB2Serial 1xRS232 */ +#define USB_PRODUCT_BRAINBOXES_US320 0x1019 /* US-320 USB2Serial 1xRS422/485 */ +#define USB_PRODUCT_BRAINBOXES_US159 0x1021 /* US-159 USB2Serial 1xRS232 */ +#define USB_PRODUCT_BRAINBOXES_US701_12 0x2011 /* US-701 USB2Serial 4xRS232 (Port 1 and 2) */ +#define USB_PRODUCT_BRAINBOXES_US701_34 0x2012 /* US-701 USB2Serial 4xRS232 (Port 3 and 4) */ +#define USB_PRODUCT_BRAINBOXES_US279_12 0x2021 /* US-279 USB2Serial 8xRS232 (Port 1 and 2) */ +#define USB_PRODUCT_BRAINBOXES_US279_34 0x2022 /* US-279 USB2Serial 8xRS232 (Port 3 and 4) */ +#define USB_PRODUCT_BRAINBOXES_US279_56 0x2023 /* US-279 USB2Serial 8xRS232 (Port 5 and 6) */ +#define USB_PRODUCT_BRAINBOXES_US279_78 0x2024 /* US-279 USB2Serial 8xRS232 (Port 7 and 8) */ +#define USB_PRODUCT_BRAINBOXES_US346_12 0x3011 /* US-346 USB2Serial 4xRS422/485 (Port 1 and 2) */ +#define USB_PRODUCT_BRAINBOXES_US346_34 0x3012 /* US-346 USB2Serial 4xRS422/485 (Port 3 and 4) */ +#define USB_PRODUCT_BRAINBOXES_US257 0x5001 /* US-257 USB2Serial 2xRS232 */ +#define USB_PRODUCT_BRAINBOXES_US313 0x6001 /* US-313 USB2Serial 2xRS422/485 */ +#define USB_PRODUCT_BRAINBOXES_US842_12 0x8001 /* US-842 USB2Serial 8xRS422/485 (Port 1 and 2) */ +#define USB_PRODUCT_BRAINBOXES_US842_34 0x8002 /* US-842 USB2Serial 8xRS422/485 (Port 3 and 4) */ +#define USB_PRODUCT_BRAINBOXES_US842_56 0x8003 /* US-842 USB2Serial 8xRS422/485 (Port 5 and 6) */ +#define USB_PRODUCT_BRAINBOXES_US842_78 0x8004 /* US-842 USB2Serial 8xRS422/485 (Port 7 and 8) */ + /* Broadcom products */ #define USB_PRODUCT_BROADCOM_BCMFW 0x0bdc /* BCMFW */ #define USB_PRODUCT_BROADCOM_BCM2033 0x2000 /* BCM2033 */ @@ -1589,24 +1610,39 @@ /* DisplayLink products */ #define USB_PRODUCT_DISPLAYLINK_GUC2020 0x0059 /* IOGEAR DVI GUC2020 */ #define USB_PRODUCT_DISPLAYLINK_LD220 0x0100 /* Samsung LD220 */ +#define USB_PRODUCT_DISPLAYLINK_LD190 0x0102 /* Samsung LD190 */ +#define USB_PRODUCT_DISPLAYLINK_U70 0x0103 /* Samsung U70 */ #define USB_PRODUCT_DISPLAYLINK_TOSHIBA 0x0110 /* TOSHIBA Video Dock */ #define USB_PRODUCT_DISPLAYLINK_POLARIS2 0x0117 /* Polaris2 USB dock */ #define USB_PRODUCT_DISPLAYLINK_VCUD60 0x0136 /* Rextron DVI */ #define USB_PRODUCT_DISPLAYLINK_CONV 0x0138 /* StarTech CONV-USB2DVI */ #define USB_PRODUCT_DISPLAYLINK_DLDVI 0x0141 /* DisplayLink DVI */ +#define USB_PRODUCT_DISPLAYLINK_USBRGB 0x0150 /* IO-DATA USB-RGB */ +#define USB_PRODUCT_DISPLAYLINK_LCDUSB7X 0x0153 /* IO-DATA LCD-USB7X */ +#define USB_PRODUCT_DISPLAYLINK_LCDUSB10X 0x0156 /* IO-DATA LCD-USB10XB-T */ #define USB_PRODUCT_DISPLAYLINK_VGA10 0x015a /* CMP-USBVGA10 */ #define USB_PRODUCT_DISPLAYLINK_WSDVI 0x0198 /* WS Tech DVI */ #define USB_PRODUCT_DISPLAYLINK_EC008 0x019b /* EasyCAP008 DVI */ +#define USB_PRODUCT_DISPLAYLINK_FYDVI2 0x019e /* DisplayLink FY-DVI2 */ +#define USB_PRODUCT_DISPLAYLINK_GXDVIU2 0x01ac /* BUFFALO GX-DVI/U2 */ #define USB_PRODUCT_DISPLAYLINK_LCD4300U 0x01ba /* LCD-4300U */ #define USB_PRODUCT_DISPLAYLINK_LCD8000U 0x01bb /* LCD-8000U */ #define USB_PRODUCT_DISPLAYLINK_HPDOCK 0x01d4 /* HP USB Docking */ #define USB_PRODUCT_DISPLAYLINK_NL571 0x01d7 /* HP USB DVI */ #define USB_PRODUCT_DISPLAYLINK_M01061 0x01e2 /* Lenovo DVI */ #define USB_PRODUCT_DISPLAYLINK_NBDOCK 0x0215 /* VideoHome NBdock1920 */ +#define USB_PRODUCT_DISPLAYLINK_GXDVIU2B 0x0223 /* BUFFALO GX-DVI/U2B */ #define USB_PRODUCT_DISPLAYLINK_SWDVI 0x024c /* SUNWEIT DVI */ #define USB_PRODUCT_DISPLAYLINK_LUM70 0x02a9 /* Lilliput UM-70 */ +#define USB_PRODUCT_DISPLAYLINK_LCD8000UD_DVI 0x02b8 /* LCD-8000UD-DVI */ +#define USB_PRODUCT_DISPLAYLINK_LDEWX015U 0x02e3 /* Logitec LDE-WX015U */ +#define USB_PRODUCT_DISPLAYLINK_KC002N 0x02ee /* SANWA SUPPLY 500-KC002N */ +#define USB_PRODUCT_DISPLAYLINK_MIMO 0x0335 /* DisplayLink MIMO */ +#define USB_PRODUCT_DISPLAYLINK_PLUGABLE 0x0377 /* Plugable docking station */ #define USB_PRODUCT_DISPLAYLINK_LT1421 0x03e0 /* Lenovo ThinkVision LT1421 */ +#define USB_PRODUCT_DISPLAYLINK_SD_U2VDH 0x046d /* AREA SD-U2VDH */ #define USB_PRODUCT_DISPLAYLINK_UM7X0 0x401a /* nanovision MiMo */ +#define USB_PRODUCT_DISPLAYLINK_FYDVI 0x8060 /* DisplayLink FY-DVI */ /* D-Link products */ /*product DLINK DSBS25 0x0100 DSB-S25 serial */ diff --git a/sys/dev/usb/usbdevs_data.h b/sys/dev/usb/usbdevs_data.h index 0da58563b..8018d27ef 100644 --- a/sys/dev/usb/usbdevs_data.h +++ b/sys/dev/usb/usbdevs_data.h @@ -1,10 +1,10 @@ -/* $OpenBSD: usbdevs_data.h,v 1.775 2024/10/07 13:26:32 sthen Exp $ */ +/* $OpenBSD: usbdevs_data.h,v 1.779 2024/12/14 10:04:51 kirill Exp $ */ /* * THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. * * generated from: - * OpenBSD: usbdevs,v 1.769 2024/10/07 13:26:18 sthen Exp + * OpenBSD: usbdevs,v 1.773 2024/12/14 10:02:47 kirill Exp */ /* $NetBSD: usbdevs,v 1.322 2003/05/10 17:47:14 hamajima Exp $ */ @@ -1785,6 +1785,82 @@ const struct usb_known_product usb_known_products[] = { USB_VENDOR_BILLIONTON, USB_PRODUCT_BILLIONTON_USB2AR, "USB2AR Ethernet", }, + { + USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US101, + "US-101 USB2Serial 1xRS232", + }, + { + USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US324, + "US-324 USB2Serial 1xRS422/485", + }, + { + USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US235, + "US-235 USB2Serial 1xRS232", + }, + { + USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US320, + "US-320 USB2Serial 1xRS422/485", + }, + { + USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US159, + "US-159 USB2Serial 1xRS232", + }, + { + USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US701_12, + "US-701 USB2Serial 4xRS232 (Port 1 and 2)", + }, + { + USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US701_34, + "US-701 USB2Serial 4xRS232 (Port 3 and 4)", + }, + { + USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US279_12, + "US-279 USB2Serial 8xRS232 (Port 1 and 2)", + }, + { + USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US279_34, + "US-279 USB2Serial 8xRS232 (Port 3 and 4)", + }, + { + USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US279_56, + "US-279 USB2Serial 8xRS232 (Port 5 and 6)", + }, + { + USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US279_78, + "US-279 USB2Serial 8xRS232 (Port 7 and 8)", + }, + { + USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US346_12, + "US-346 USB2Serial 4xRS422/485 (Port 1 and 2)", + }, + { + USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US346_34, + "US-346 USB2Serial 4xRS422/485 (Port 3 and 4)", + }, + { + USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US257, + "US-257 USB2Serial 2xRS232", + }, + { + USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US313, + "US-313 USB2Serial 2xRS422/485", + }, + { + USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US842_12, + "US-842 USB2Serial 8xRS422/485 (Port 1 and 2)", + }, + { + USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US842_34, + "US-842 USB2Serial 8xRS422/485 (Port 3 and 4)", + }, + { + USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US842_56, + "US-842 USB2Serial 8xRS422/485 (Port 5 and 6)", + }, + { + USB_VENDOR_BRAINBOXES, USB_PRODUCT_BRAINBOXES_US842_78, + "US-842 USB2Serial 8xRS422/485 (Port 7 and 8)", + }, { USB_VENDOR_BROADCOM, USB_PRODUCT_BROADCOM_BCMFW, "BCMFW", @@ -2605,6 +2681,14 @@ const struct usb_known_product usb_known_products[] = { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LD220, "Samsung LD220", }, + { + USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LD190, + "Samsung LD190", + }, + { + USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_U70, + "Samsung U70", + }, { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_TOSHIBA, "TOSHIBA Video Dock", @@ -2625,6 +2709,18 @@ const struct usb_known_product usb_known_products[] = { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_DLDVI, "DisplayLink DVI", }, + { + USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_USBRGB, + "IO-DATA USB-RGB", + }, + { + USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LCDUSB7X, + "IO-DATA LCD-USB7X", + }, + { + USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LCDUSB10X, + "IO-DATA LCD-USB10XB-T", + }, { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_VGA10, "CMP-USBVGA10", @@ -2637,6 +2733,14 @@ const struct usb_known_product usb_known_products[] = { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_EC008, "EasyCAP008 DVI", }, + { + USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_FYDVI2, + "DisplayLink FY-DVI2", + }, + { + USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_GXDVIU2, + "BUFFALO GX-DVI/U2", + }, { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LCD4300U, "LCD-4300U", @@ -2661,6 +2765,10 @@ const struct usb_known_product usb_known_products[] = { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_NBDOCK, "VideoHome NBdock1920", }, + { + USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_GXDVIU2B, + "BUFFALO GX-DVI/U2B", + }, { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_SWDVI, "SUNWEIT DVI", @@ -2669,14 +2777,42 @@ const struct usb_known_product usb_known_products[] = { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LUM70, "Lilliput UM-70", }, + { + USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LCD8000UD_DVI, + "LCD-8000UD-DVI", + }, + { + USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LDEWX015U, + "Logitec LDE-WX015U", + }, + { + USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_KC002N, + "SANWA SUPPLY 500-KC002N", + }, + { + USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_MIMO, + "DisplayLink MIMO", + }, + { + USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_PLUGABLE, + "Plugable docking station", + }, { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LT1421, "Lenovo ThinkVision LT1421", }, + { + USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_SD_U2VDH, + "AREA SD-U2VDH", + }, { USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_UM7X0, "nanovision MiMo", }, + { + USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_FYDVI, + "DisplayLink FY-DVI", + }, { USB_VENDOR_DLINK, USB_PRODUCT_DLINK_DUBE100, "10/100 Ethernet", diff --git a/sys/dev/usb/uvideo.c b/sys/dev/usb/uvideo.c index 2071b961b..25f68ba48 100644 --- a/sys/dev/usb/uvideo.c +++ b/sys/dev/usb/uvideo.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvideo.c,v 1.222 2024/09/01 03:09:00 jsg Exp $ */ +/* $OpenBSD: uvideo.c,v 1.233 2025/01/01 11:42:07 kirill Exp $ */ /* * Copyright (c) 2008 Robert Nagy @@ -168,7 +168,7 @@ usbd_status uvideo_vs_decode_stream_header(struct uvideo_softc *, uint8_t *, int); usbd_status uvideo_vs_decode_stream_header_isight(struct uvideo_softc *, uint8_t *, int); -int uvideo_mmap_queue(struct uvideo_softc *, uint8_t *, int); +int uvideo_mmap_queue(struct uvideo_softc *, uint8_t *, int, int); void uvideo_read(struct uvideo_softc *, uint8_t *, int); usbd_status uvideo_usb_control(struct uvideo_softc *, uint8_t, uint8_t, uint16_t, uint8_t *, size_t); @@ -1204,6 +1204,7 @@ uvideo_vs_parse_desc_alt(struct uvideo_softc *sc, int vs_nr, int iface, int numa usb_interface_descriptor_t *id; usb_endpoint_descriptor_t *ed; uint8_t ep_dir, ep_type; + int bulk_endpoint; vs = &sc->sc_vs_coll[vs_nr]; @@ -1218,6 +1219,9 @@ uvideo_vs_parse_desc_alt(struct uvideo_softc *sc, int vs_nr, int iface, int numa } desc = usbd_desc_iter_next(&iter); } + + vs->bulk_endpoint = 1; + while (desc) { /* Crossed device function boundary. */ if (desc->bDescriptorType == UDESC_IFACE_ASSOC) @@ -1248,12 +1252,20 @@ uvideo_vs_parse_desc_alt(struct uvideo_softc *sc, int vs_nr, int iface, int numa ep_dir = UE_GET_DIR(ed->bEndpointAddress); ep_type = UE_GET_XFERTYPE(ed->bmAttributes); if (ep_dir == UE_DIR_IN && ep_type == UE_ISOCHRONOUS) - vs->bulk_endpoint = 0; + bulk_endpoint = 0; else if (ep_dir == UE_DIR_IN && ep_type == UE_BULK) - vs->bulk_endpoint = 1; + bulk_endpoint = 1; else goto next; + /* + * Section 2.4.3 does not prohibit the mix of bulk and + * isochronous endpoints when the bulk endpoints are + * used solely for still image transfer. + */ + if (bulk_endpoint && !vs->bulk_endpoint) + goto next; + /* save endpoint with largest bandwidth */ if (UGETW(ed->wMaxPacketSize) > vs->psize) { vs->ifaceh = &sc->sc_udev->ifaces[iface]; @@ -1262,6 +1274,7 @@ uvideo_vs_parse_desc_alt(struct uvideo_softc *sc, int vs_nr, int iface, int numa vs->curalt = id->bAlternateSetting; vs->psize = UGETW(ed->wMaxPacketSize); vs->iface = iface; + vs->bulk_endpoint = bulk_endpoint; } next: desc = usbd_desc_iter_next(&iter); @@ -1285,9 +1298,10 @@ uvideo_vs_set_alt(struct uvideo_softc *sc, struct usbd_interface *ifaceh, const usb_descriptor_t *desc; usb_interface_descriptor_t *id; usb_endpoint_descriptor_t *ed; - int diff, best_diff = INT_MAX; + int diff, best_diff = INT_MAX, bulk_endpoint; usbd_status error; uint32_t psize; + uint8_t ep_type; usbd_desc_iter_init(sc->sc_udev, &iter); desc = usbd_desc_iter_next(&iter); @@ -1319,6 +1333,15 @@ uvideo_vs_set_alt(struct uvideo_softc *sc, struct usbd_interface *ifaceh, goto next; ed = (usb_endpoint_descriptor_t *)(uint8_t *)desc; + ep_type = UE_GET_XFERTYPE(ed->bmAttributes); + if (ep_type == UE_ISOCHRONOUS) + bulk_endpoint = 0; + else if (ep_type == UE_BULK) + bulk_endpoint = 1; + + if (bulk_endpoint && !sc->sc_vs_cur->bulk_endpoint) + goto next; + /* save endpoint with requested bandwidth */ psize = UGETW(ed->wMaxPacketSize); psize = UE_GET_SIZE(psize) * (1 + UE_GET_TRANS(psize)); @@ -1557,7 +1580,7 @@ uvideo_vs_negotiation(struct uvideo_softc *sc, int commit) * Uncompressed formats have fixed bits per pixel, which means * the frame buffer size is fixed and can be calculated. Because * some devices return incorrect values, always override the - * the frame size with a calculated value. + * frame size with a calculated value. */ if (frame->bDescriptorSubtype == UDESCSUB_VS_FRAME_UNCOMPRESSED) { USETDW(pc->dwMaxVideoFrameSize, @@ -1882,6 +1905,10 @@ uvideo_vs_open(struct uvideo_softc *sc) return (error); } + /* 2.4.3 the bulk endpoint only supports the alternative setting of 0 */ + if (sc->sc_vs_cur->bulk_endpoint) + goto skip_set_alt; + error = uvideo_vs_set_alt(sc, sc->sc_vs_cur->ifaceh, UGETDW(sc->sc_desc_probe.dwMaxPayloadTransferSize)); if (error != USBD_NORMAL_COMPLETION) { @@ -1899,6 +1926,7 @@ uvideo_vs_open(struct uvideo_softc *sc) return (USBD_INVAL); } +skip_set_alt: DPRINTF(1, "%s: open pipe for bEndpointAddress=0x%02x\n", DEVNAME(sc), sc->sc_vs_cur->endpoint); error = usbd_open_pipe( @@ -1935,6 +1963,11 @@ uvideo_vs_close(struct uvideo_softc *sc) { if (sc->sc_vs_cur->bulk_running == 1) { sc->sc_vs_cur->bulk_running = 0; + + /* Bulk thread may sleep in usbd_transfer, abort it */ + if (sc->sc_vs_cur->pipeh) + usbd_abort_pipe(sc->sc_vs_cur->pipeh); + usbd_ref_wait(sc->sc_udev); } @@ -2029,6 +2062,9 @@ uvideo_vs_start_bulk_thread(void *arg) break; } + usbd_get_xfer_status(sc->sc_vs_cur->bxfer.xfer, + NULL, NULL, &size, NULL); + DPRINTF(2, "%s: *** buffer len = %d\n", DEVNAME(sc), size); (void)sc->sc_decode_stream_header(sc, @@ -2135,18 +2171,9 @@ uvideo_vs_decode_stream_header(struct uvideo_softc *sc, uint8_t *frame, DPRINTF(2, "%s: stream header len = %d\n", DEVNAME(sc), sh->bLength); - if (sh->bLength > UVIDEO_SH_MAX_LEN || sh->bLength < UVIDEO_SH_MIN_LEN) + if (sh->bLength > frame_size || sh->bLength < UVIDEO_SH_MIN_LEN) /* invalid header size */ return (USBD_INVAL); - if (sh->bLength == frame_size && !(sh->bFlags & UVIDEO_SH_FLAG_EOF)) { - /* stream header without payload and no EOF */ - return (USBD_INVAL); - } - if (sh->bFlags & UVIDEO_SH_FLAG_ERR) { - /* stream error, skip xfer */ - DPRINTF(1, "%s: %s: stream error!\n", DEVNAME(sc), __func__); - return (USBD_CANCELLED); - } DPRINTF(2, "%s: frame_size = %d\n", DEVNAME(sc), frame_size); @@ -2165,6 +2192,7 @@ uvideo_vs_decode_stream_header(struct uvideo_softc *sc, uint8_t *frame, fb->sample = 1; fb->fid = sh->bFlags & UVIDEO_SH_FLAG_FID; fb->offset = 0; + fb->error = 0; } else { /* continues sample for a frame, check consistency */ if (fb->fid != (sh->bFlags & UVIDEO_SH_FLAG_FID)) { @@ -2173,12 +2201,25 @@ uvideo_vs_decode_stream_header(struct uvideo_softc *sc, uint8_t *frame, fb->sample = 1; fb->fid = sh->bFlags & UVIDEO_SH_FLAG_FID; fb->offset = 0; + fb->error = 0; } } + if (sh->bFlags & UVIDEO_SH_FLAG_ERR) { + /* stream error, skip xfer */ + DPRINTF(1, "%s: %s: stream error!\n", DEVNAME(sc), __func__); + fb->error = 1; + } + /* save sample */ sample_len = frame_size - sh->bLength; - if ((fb->offset + sample_len) <= fb->buf_size) { + if (sample_len > fb->buf_size - fb->offset) { + DPRINTF(1, "%s: %s: frame too large, marked as error\n", + DEVNAME(sc), __func__); + sample_len = fb->buf_size - fb->offset; + fb->error = 1; + } + if (sample_len > 0) { bcopy(frame + sh->bLength, fb->buf + fb->offset, sample_len); fb->offset += sample_len; } @@ -2188,31 +2229,34 @@ uvideo_vs_decode_stream_header(struct uvideo_softc *sc, uint8_t *frame, DPRINTF(2, "%s: %s: EOF (frame size = %d bytes)\n", DEVNAME(sc), __func__, fb->offset); - if (fb->offset > fb->buf_size) { - DPRINTF(1, "%s: %s: frame too large, skipped!\n", - DEVNAME(sc), __func__); - } else if (fb->offset < fb->buf_size && + if (fb->offset < fb->buf_size && !(fb->fmt_flags & V4L2_FMT_FLAG_COMPRESSED)) { - DPRINTF(1, "%s: %s: frame too small, skipped!\n", + DPRINTF(1, "%s: %s: frame too small, marked as error\n", + DEVNAME(sc), __func__); + fb->error = 1; + } + +#ifdef UVIDEO_DUMP + /* do the file write in process context */ + usb_rem_task(sc->sc_udev, &sc->sc_task_write); + usb_add_task(sc->sc_udev, &sc->sc_task_write); +#endif + if (sc->sc_mmap_flag) { + /* mmap */ + if (uvideo_mmap_queue(sc, fb->buf, fb->offset, + fb->error)) + return (USBD_NOMEM); + } else if (fb->error) { + DPRINTF(1, "%s: %s: error frame, skipped!\n", DEVNAME(sc), __func__); } else { -#ifdef UVIDEO_DUMP - /* do the file write in process context */ - usb_rem_task(sc->sc_udev, &sc->sc_task_write); - usb_add_task(sc->sc_udev, &sc->sc_task_write); -#endif - if (sc->sc_mmap_flag) { - /* mmap */ - if (uvideo_mmap_queue(sc, fb->buf, fb->offset)) - return (USBD_NOMEM); - } else { - /* read */ - uvideo_read(sc, fb->buf, fb->offset); - } + /* read */ + uvideo_read(sc, fb->buf, fb->offset); } fb->sample = 0; fb->fid = 0; + fb->error = 0; } return (USBD_NORMAL_COMPLETION); @@ -2257,7 +2301,7 @@ uvideo_vs_decode_stream_header_isight(struct uvideo_softc *sc, uint8_t *frame, if (header) { if (sc->sc_mmap_flag) { /* mmap */ - if (uvideo_mmap_queue(sc, fb->buf, fb->offset)) + if (uvideo_mmap_queue(sc, fb->buf, fb->offset, 0)) return (USBD_NOMEM); } else { /* read */ @@ -2277,7 +2321,7 @@ uvideo_vs_decode_stream_header_isight(struct uvideo_softc *sc, uint8_t *frame, } int -uvideo_mmap_queue(struct uvideo_softc *sc, uint8_t *buf, int len) +uvideo_mmap_queue(struct uvideo_softc *sc, uint8_t *buf, int len, int err) { int i; @@ -2302,6 +2346,11 @@ uvideo_mmap_queue(struct uvideo_softc *sc, uint8_t *buf, int len) /* timestamp it */ getmicrotime(&sc->sc_mmap[i].v4l2_buf.timestamp); + /* forward error bit */ + sc->sc_mmap[i].v4l2_buf.flags &= ~V4L2_BUF_FLAG_ERROR; + if (err) + sc->sc_mmap[i].v4l2_buf.flags |= V4L2_BUF_FLAG_ERROR; + /* queue it */ sc->sc_mmap[i].v4l2_buf.flags |= V4L2_BUF_FLAG_DONE; sc->sc_mmap[i].v4l2_buf.flags &= ~V4L2_BUF_FLAG_QUEUED; @@ -2905,9 +2954,9 @@ uvideo_querycap(void *v, struct v4l2_capability *caps) struct uvideo_softc *sc = v; bzero(caps, sizeof(*caps)); - strlcpy(caps->driver, DEVNAME(sc), sizeof(caps->driver)); + strlcpy(caps->driver, "uvideo", sizeof(caps->driver)); strlcpy(caps->card, sc->sc_udev->product, sizeof(caps->card)); - strlcpy(caps->bus_info, "usb", sizeof(caps->bus_info)); + strlcpy(caps->bus_info, DEVNAME(sc), sizeof(caps->bus_info)); caps->version = 1; caps->device_caps = V4L2_CAP_VIDEO_CAPTURE diff --git a/sys/dev/usb/uvideo.h b/sys/dev/usb/uvideo.h index f783baf43..ce5d25db7 100644 --- a/sys/dev/usb/uvideo.h +++ b/sys/dev/usb/uvideo.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uvideo.h,v 1.60 2019/12/08 13:21:21 mglocker Exp $ */ +/* $OpenBSD: uvideo.h,v 1.61 2024/12/22 20:30:04 kirill Exp $ */ /* * Copyright (c) 2007 Robert Nagy @@ -449,6 +449,7 @@ struct uvideo_vs_iface { struct uvideo_frame_buffer { int sample; uint8_t fid; + uint8_t error; int offset; int buf_size; uint8_t *buf; diff --git a/sys/dev/video.c b/sys/dev/video.c index 5fc93e303..2dbdcd9cc 100644 --- a/sys/dev/video.c +++ b/sys/dev/video.c @@ -1,4 +1,4 @@ -/* $OpenBSD: video.c,v 1.57 2022/07/02 08:50:41 visa Exp $ */ +/* $OpenBSD: video.c,v 1.59 2024/12/16 21:22:51 mvs Exp $ */ /* * Copyright (c) 2008 Robert Nagy @@ -20,12 +20,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include #include #include @@ -34,6 +36,12 @@ #include +/* + * Locks used to protect struct members and global data + * a atomic + * m sc_mtx + */ + #ifdef VIDEO_DEBUG int video_debug = 1; #define DPRINTF(l, x...) do { if ((l) <= video_debug) printf(x); } while (0) @@ -50,6 +58,7 @@ struct video_softc { struct process *sc_owner; /* owner process */ uint8_t sc_open; /* device opened */ + struct mutex sc_mtx; int sc_fsize; uint8_t *sc_fbuffer; caddr_t sc_fbuffer_mmap; @@ -58,9 +67,9 @@ struct video_softc { #define VIDMODE_NONE 0 #define VIDMODE_MMAP 1 #define VIDMODE_READ 2 - int sc_frames_ready; + int sc_frames_ready; /* [m] */ - struct selinfo sc_rsel; /* read selector */ + struct klist sc_rklist; /* [m] read selector */ }; int videoprobe(struct device *, void *, void *); @@ -85,7 +94,7 @@ struct cfdriver video_cd = { /* * Global flag to control if video recording is enabled by kern.video.record. */ -int video_record_enable = 0; +int video_record_enable = 0; /* [a] */ int videoprobe(struct device *parent, void *match, void *aux) @@ -105,6 +114,8 @@ videoattach(struct device *parent, struct device *self, void *aux) sc->sc_dev = parent; sc->sc_fbufferlen = 0; sc->sc_owner = NULL; + mtx_init(&sc->sc_mtx, IPL_MPFLOOR); + klist_init_mutex(&sc->sc_rklist, &sc->sc_mtx); if (sc->hw_if->get_bufsize) sc->sc_fbufferlen = (sc->hw_if->get_bufsize)(sc->hw_hdl); @@ -205,21 +216,28 @@ videoread(dev_t dev, struct uio *uio, int ioflag) DPRINTF(1, "resid=%zu\n", uio->uio_resid); + mtx_enter(&sc->sc_mtx); + if (sc->sc_frames_ready < 1) { /* block userland read until a frame is ready */ - error = tsleep_nsec(sc, PWAIT | PCATCH, "vid_rd", INFSLP); + error = msleep_nsec(sc, &sc->sc_mtx, PWAIT | PCATCH, + "vid_rd", INFSLP); if (sc->sc_dying) error = EIO; - if (error) + if (error) { + mtx_leave(&sc->sc_mtx); return (error); + } } + sc->sc_frames_ready--; + + mtx_leave(&sc->sc_mtx); /* move no more than 1 frame to userland, as per specification */ size = ulmin(uio->uio_resid, sc->sc_fsize); - if (!video_record_enable) + if (!atomic_load_int(&video_record_enable)) bzero(sc->sc_fbuffer, size); error = uiomove(sc->sc_fbuffer, size, uio); - sc->sc_frames_ready--; if (error) return (error); @@ -354,9 +372,11 @@ videoioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct proc *p) } error = (sc->hw_if->dqbuf)(sc->hw_hdl, (struct v4l2_buffer *)data); - if (!video_record_enable) + if (!atomic_load_int(&video_record_enable)) bzero(sc->sc_fbuffer_mmap + vb->m.offset, vb->length); + mtx_enter(&sc->sc_mtx); sc->sc_frames_ready--; + mtx_leave(&sc->sc_mtx); break; case VIDIOC_STREAMON: if (sc->hw_if->streamon) @@ -429,11 +449,8 @@ void filt_videodetach(struct knote *kn) { struct video_softc *sc = kn->kn_hook; - int s; - s = splhigh(); - klist_remove_locked(&sc->sc_rsel.si_note, kn); - splx(s); + klist_remove(&sc->sc_rklist, kn); } int @@ -447,11 +464,39 @@ filt_videoread(struct knote *kn, long hint) return (0); } +int +filt_videomodify(struct kevent *kev, struct knote *kn) +{ + struct video_softc *sc = kn->kn_hook; + int active; + + mtx_enter(&sc->sc_mtx); + active = knote_modify(kev, kn); + mtx_leave(&sc->sc_mtx); + + return (active); +} + +int +filt_videoprocess(struct knote *kn, struct kevent *kev) +{ + struct video_softc *sc = kn->kn_hook; + int active; + + mtx_enter(&sc->sc_mtx); + active = knote_process(kn, kev); + mtx_leave(&sc->sc_mtx); + + return (active); +} + const struct filterops video_filtops = { - .f_flags = FILTEROP_ISFD, + .f_flags = FILTEROP_ISFD | FILTEROP_MPSAFE, .f_attach = NULL, .f_detach = filt_videodetach, .f_event = filt_videoread, + .f_modify = filt_videomodify, + .f_process = filt_videoprocess, }; int @@ -459,7 +504,7 @@ videokqfilter(dev_t dev, struct knote *kn) { int unit = VIDEOUNIT(dev); struct video_softc *sc; - int s, error; + int error; KERNEL_ASSERT_LOCKED(); @@ -493,9 +538,7 @@ videokqfilter(dev_t dev, struct knote *kn) sc->sc_vidmode = VIDMODE_READ; } - s = splhigh(); - klist_insert_locked(&sc->sc_rsel.si_note, kn); - splx(s); + klist_insert(&sc->sc_rklist, kn); return (0); } @@ -528,13 +571,15 @@ video_intr(void *addr) struct video_softc *sc = (struct video_softc *)addr; DPRINTF(3, "video_intr sc=%p\n", sc); + mtx_enter(&sc->sc_mtx); if (sc->sc_vidmode != VIDMODE_NONE) sc->sc_frames_ready++; else printf("%s: interrupt but no streams!\n", __func__); if (sc->sc_vidmode == VIDMODE_READ) wakeup(sc); - selwakeup(&sc->sc_rsel); + knote_locked(&sc->sc_rklist, 0); + mtx_leave(&sc->sc_mtx); } int @@ -548,7 +593,9 @@ video_stop(struct video_softc *sc) error = sc->hw_if->close(sc->hw_hdl); sc->sc_vidmode = VIDMODE_NONE; + mtx_enter(&sc->sc_mtx); sc->sc_frames_ready = 0; + mtx_leave(&sc->sc_mtx); sc->sc_owner = NULL; return (error); @@ -582,7 +629,7 @@ int videodetach(struct device *self, int flags) { struct video_softc *sc = (struct video_softc *)self; - int s, maj, mn; + int maj, mn; /* locate the major number */ for (maj = 0; maj < nchrdev; maj++) @@ -593,9 +640,8 @@ videodetach(struct device *self, int flags) mn = self->dv_unit; vdevgone(maj, mn, mn, VCHR); - s = splhigh(); - klist_invalidate(&sc->sc_rsel.si_note); - splx(s); + klist_invalidate(&sc->sc_rklist); + klist_free(&sc->sc_rklist); free(sc->sc_fbuffer, M_DEVBUF, sc->sc_fbufferlen); diff --git a/sys/dev/videomode/edid.c b/sys/dev/videomode/edid.c index afb50454a..9756c83eb 100644 --- a/sys/dev/videomode/edid.c +++ b/sys/dev/videomode/edid.c @@ -1,4 +1,5 @@ -/* $NetBSD: edid.c,v 1.5 2007/03/07 19:56:40 macallan Exp $ */ +/* $OpenBSD: edid.c,v 1.8 2024/11/06 09:34:10 miod Exp $ */ +/* $NetBSD: edid.c,v 1.15 2020/01/25 15:59:11 maxv Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -35,7 +36,6 @@ #include #include #include -#include #include #include #include @@ -46,20 +46,25 @@ const char *edid_findvendor(const char *); const char *edid_findproduct(const char *, uint16_t); void edid_strchomp(char *); const struct videomode *edid_mode_lookup_list(const char *); +struct videomode *edid_search_mode(struct edid_info *, + const struct videomode *); int edid_std_timing(uint8_t *, struct videomode *); int edid_det_timing(uint8_t *, struct videomode *); +void bump_preferred_mode(struct edid_info *, struct videomode *); void edid_block(struct edid_info *, uint8_t *); +/* #define EDID_DEBUG */ #define EDIDVERBOSE 1 #define DIVIDE(x,y) (((x) + ((y) / 2)) / (y)) +/* These are reversed established timing order */ static const char *_edid_modes[] = { "1280x1024x75", "1024x768x75", "1024x768x70", "1024x768x60", "1024x768x87i", - "832x768x74", /* rounding error, 74.55 Hz aka "832x624x75" */ + "832x624x74", /* rounding error, 74.55 Hz aka "832x624x75" */ "800x600x75", "800x600x72", "800x600x60", @@ -68,8 +73,8 @@ static const char *_edid_modes[] = { "640x480x72", "640x480x67", "640x480x60", - "720x400x85", /* should this really be "720x400x88" ? */ - "720x400x70", /* hmm... videomode.c doesn't have this one */ + "720x400x87", /* rounding error, 87.85 Hz aka "720x400x88" */ + "720x400x70", }; #ifdef EDIDVERBOSE @@ -95,7 +100,7 @@ edid_findvendor(const char *vendor) for (n = 0; n < edid_nvendors; n++) if (memcmp(edid_vendors[n].vendor, vendor, 3) == 0) - return (edid_vendors[n].name); + return edid_vendors[n].name; #endif return NULL; } @@ -107,9 +112,9 @@ edid_findproduct(const char *vendor, uint16_t product) int n; for (n = 0; n < edid_nproducts; n++) - if ((edid_products[n].product == product) && - (memcmp(edid_products[n].vendor, vendor, 3) == 0)) - return (edid_products[n].name); + if (edid_products[n].product == product && + memcmp(edid_products[n].vendor, vendor, 3) == 0) + return edid_products[n].name; #endif /* EDIDVERBOSE */ return NULL; @@ -120,11 +125,11 @@ edid_strchomp(char *ptr) { for (;;) { switch (*ptr) { - case 0: + case '\0': return; case '\r': case '\n': - *ptr = 0; + *ptr = '\0'; return; } ptr++; @@ -148,6 +153,7 @@ edid_is_valid(uint8_t *d) return 0; } +#ifdef EDID_DEBUG void edid_print(struct edid_info *edid) { @@ -264,21 +270,37 @@ edid_print(struct edid_info *edid) } printf("Video modes:\n"); for (i = 0; i < edid->edid_nmodes; i++) { - printf("\t%dx%d @ %dHz\n", + printf("\t%dx%d @ %dHz", edid->edid_modes[i].hdisplay, edid->edid_modes[i].vdisplay, DIVIDE(DIVIDE(edid->edid_modes[i].dot_clock * 1000, - edid->edid_modes[i].htotal), + edid->edid_modes[i].htotal), edid->edid_modes[i].vtotal)); + printf(" (%d %d %d %d %d %d %d", + edid->edid_modes[i].dot_clock, + edid->edid_modes[i].hsync_start, + edid->edid_modes[i].hsync_end, + edid->edid_modes[i].htotal, + edid->edid_modes[i].vsync_start, + edid->edid_modes[i].vsync_end, + edid->edid_modes[i].vtotal); + printf(" %s%sH %s%sV)\n", + edid->edid_modes[i].flags & VID_PHSYNC ? "+" : "", + edid->edid_modes[i].flags & VID_NHSYNC ? "-" : "", + edid->edid_modes[i].flags & VID_PVSYNC ? "+" : "", + edid->edid_modes[i].flags & VID_NVSYNC ? "-" : ""); } if (edid->edid_preferred_mode) printf("Preferred mode: %dx%d @ %dHz\n", edid->edid_preferred_mode->hdisplay, edid->edid_preferred_mode->vdisplay, DIVIDE(DIVIDE(edid->edid_preferred_mode->dot_clock * 1000, - edid->edid_preferred_mode->htotal), + edid->edid_preferred_mode->htotal), edid->edid_preferred_mode->vtotal)); + + printf("Number of extension blocks: %d\n", edid->edid_ext_block_count); } +#endif const struct videomode * edid_mode_lookup_list(const char *name) @@ -291,6 +313,26 @@ edid_mode_lookup_list(const char *name) return NULL; } +struct videomode * +edid_search_mode(struct edid_info *edid, const struct videomode *mode) +{ + int refresh, i; + + refresh = DIVIDE(DIVIDE(mode->dot_clock * 1000, + mode->htotal), mode->vtotal); + for (i = 0; i < edid->edid_nmodes; i++) { + if (mode->hdisplay == edid->edid_modes[i].hdisplay && + mode->vdisplay == edid->edid_modes[i].vdisplay && + refresh == DIVIDE(DIVIDE( + edid->edid_modes[i].dot_clock * 1000, + edid->edid_modes[i].htotal), + edid->edid_modes[i].vtotal)) { + return &edid->edid_modes[i]; + } + } + return NULL; +} + int edid_std_timing(uint8_t *data, struct videomode *vmp) { @@ -322,13 +364,11 @@ edid_std_timing(uint8_t *data, struct videomode *vmp) f = EDID_STD_TIMING_VFREQ(data); /* first try to lookup the mode as a DMT timing */ - snprintf(name, sizeof (name), "%dx%dx%d", x, y, f); + snprintf(name, sizeof(name), "%dx%dx%d", x, y, f); if ((lookup = edid_mode_lookup_list(name)) != NULL) { *vmp = *lookup; - } - - /* failing that, calculate it using gtf */ - else { + } else { + /* failing that, calculate it using gtf */ /* * Hmm. I'm not using alternate GTF timings, which * could, in theory, be present. @@ -349,7 +389,7 @@ edid_det_timing(uint8_t *data, struct videomode *vmp) /* we don't support stereo modes (for now) */ if (flags & (EDID_DET_TIMING_FLAG_STEREO | - EDID_DET_TIMING_FLAG_STEREO1)) + EDID_DET_TIMING_FLAG_STEREO_MODE)) return 0; vmp->dot_clock = EDID_DET_TIMING_DOT_CLOCK(data) / 1000; @@ -364,7 +404,7 @@ edid_det_timing(uint8_t *data, struct videomode *vmp) vsyncwid = EDID_DET_TIMING_VSYNC_WIDTH(data); vsyncoff = EDID_DET_TIMING_VSYNC_OFFSET(data); - /* XXX: I'm not doing anything with the borders, should I? */ + /* Borders are contained within the blank areas. */ vmp->hdisplay = hactive; vmp->htotal = hactive + hblank; @@ -393,19 +433,40 @@ edid_det_timing(uint8_t *data, struct videomode *vmp) return 1; } +void bump_preferred_mode(struct edid_info *edid, struct videomode *m) +{ + /* + * XXX + * Iiyama 4800 series monitors may have their native resolution in the + * 2nd detailed timing descriptor instead of the 1st. Try to detect + * that here and pick the native mode anyway. + */ + if (edid->edid_preferred_mode == NULL) { + edid->edid_preferred_mode = m; + } else if ((strncmp(edid->edid_vendor, "IVM", 3) == 0) && + (edid->edid_product == 0x4800) && + (edid->edid_preferred_mode->dot_clock < m->dot_clock)) + edid->edid_preferred_mode = m; +} + void edid_block(struct edid_info *edid, uint8_t *data) { int i; - struct videomode mode; + struct videomode mode, *exist_mode; if (EDID_BLOCK_IS_DET_TIMING(data)) { - if (edid_det_timing(data, &mode)) { + if (!edid_det_timing(data, &mode)) + return; + /* Does this mode already exist? */ + exist_mode = edid_search_mode(edid, &mode); + if (exist_mode != NULL) { + *exist_mode = mode; + bump_preferred_mode(edid, exist_mode); + } else { edid->edid_modes[edid->edid_nmodes] = mode; - if (edid->edid_preferred_mode == NULL) { - edid->edid_preferred_mode = - &edid->edid_modes[edid->edid_nmodes]; - } + bump_preferred_mode(edid, + &edid->edid_modes[edid->edid_nmodes]); edid->edid_nmodes++; } return; @@ -413,44 +474,33 @@ edid_block(struct edid_info *edid, uint8_t *data) switch (EDID_BLOCK_TYPE(data)) { case EDID_DESC_BLOCK_TYPE_SERIAL: - memcpy(edid->edid_serial, - data + EDID_DESC_ASCII_DATA_OFFSET, + memcpy(edid->edid_serial, data + EDID_DESC_ASCII_DATA_OFFSET, EDID_DESC_ASCII_DATA_LEN); - edid->edid_serial[sizeof (edid->edid_serial) - 1] = 0; + edid->edid_serial[EDID_DESC_ASCII_DATA_LEN] = 0; break; case EDID_DESC_BLOCK_TYPE_ASCII: - memcpy(edid->edid_comment, - data + EDID_DESC_ASCII_DATA_OFFSET, + memcpy(edid->edid_comment, data + EDID_DESC_ASCII_DATA_OFFSET, EDID_DESC_ASCII_DATA_LEN); - edid->edid_comment[sizeof (edid->edid_comment) - 1] = 0; + edid->edid_comment[EDID_DESC_ASCII_DATA_LEN] = 0; break; case EDID_DESC_BLOCK_TYPE_RANGE: edid->edid_have_range = 1; - edid->edid_range.er_min_vfreq = - EDID_DESC_RANGE_MIN_VFREQ(data); - edid->edid_range.er_max_vfreq = - EDID_DESC_RANGE_MAX_VFREQ(data); - edid->edid_range.er_min_hfreq = - EDID_DESC_RANGE_MIN_HFREQ(data); - edid->edid_range.er_max_hfreq = - EDID_DESC_RANGE_MAX_HFREQ(data); - edid->edid_range.er_max_clock = - EDID_DESC_RANGE_MAX_CLOCK(data); - if (EDID_DESC_RANGE_HAVE_GTF2(data)) { - edid->edid_range.er_have_gtf2 = 1; - edid->edid_range.er_gtf2_hfreq = - EDID_DESC_RANGE_GTF2_HFREQ(data); - edid->edid_range.er_gtf2_c = - EDID_DESC_RANGE_GTF2_C(data); - edid->edid_range.er_gtf2_m = - EDID_DESC_RANGE_GTF2_M(data); - edid->edid_range.er_gtf2_j = - EDID_DESC_RANGE_GTF2_J(data); - edid->edid_range.er_gtf2_k = - EDID_DESC_RANGE_GTF2_K(data); - } + edid->edid_range.er_min_vfreq = EDID_DESC_RANGE_MIN_VFREQ(data); + edid->edid_range.er_max_vfreq = EDID_DESC_RANGE_MAX_VFREQ(data); + edid->edid_range.er_min_hfreq = EDID_DESC_RANGE_MIN_HFREQ(data); + edid->edid_range.er_max_hfreq = EDID_DESC_RANGE_MAX_HFREQ(data); + edid->edid_range.er_max_clock = EDID_DESC_RANGE_MAX_CLOCK(data); + if (!EDID_DESC_RANGE_HAVE_GTF2(data)) + break; + edid->edid_range.er_have_gtf2 = 1; + edid->edid_range.er_gtf2_hfreq = + EDID_DESC_RANGE_GTF2_HFREQ(data); + edid->edid_range.er_gtf2_c = EDID_DESC_RANGE_GTF2_C(data); + edid->edid_range.er_gtf2_m = EDID_DESC_RANGE_GTF2_M(data); + edid->edid_range.er_gtf2_j = EDID_DESC_RANGE_GTF2_J(data); + edid->edid_range.er_gtf2_k = EDID_DESC_RANGE_GTF2_K(data); break; case EDID_DESC_BLOCK_TYPE_NAME: @@ -458,14 +508,20 @@ edid_block(struct edid_info *edid, uint8_t *data) memcpy(edid->edid_productname, data + EDID_DESC_ASCII_DATA_OFFSET, EDID_DESC_ASCII_DATA_LEN); + edid->edid_productname[EDID_DESC_ASCII_DATA_LEN] = '\0'; break; case EDID_DESC_BLOCK_TYPE_STD_TIMING: data += EDID_DESC_STD_TIMING_START; for (i = 0; i < EDID_DESC_STD_TIMING_COUNT; i++) { if (edid_std_timing(data, &mode)) { - edid->edid_modes[edid->edid_nmodes] = mode; - edid->edid_nmodes++; + /* Does this mode already exist? */ + exist_mode = edid_search_mode(edid, &mode); + if (exist_mode == NULL) { + edid->edid_modes[edid->edid_nmodes] = + mode; + edid->edid_nmodes++; + } } data += 2; } @@ -478,10 +534,10 @@ edid_block(struct edid_info *edid, uint8_t *data) } /* - * Gets EDID version in BCD, e.g. EDID v1.3 returned as 0x0103 + * Gets EDID version in BCD, e.g. EDID v1.3 returned as 0x0103 */ int -edid_parse(uint8_t *data, struct edid_info *edid) +edid_parse(const char *devname, uint8_t *data, struct edid_info *edid) { uint16_t manfid, estmodes; const struct videomode *vmp; @@ -505,19 +561,21 @@ edid_parse(uint8_t *data, struct edid_info *edid) name = edid_findvendor(edid->edid_vendor); if (name != NULL) { - snprintf(edid->edid_vendorname, - sizeof (edid->edid_vendorname), "%s", name); - } - edid->edid_vendorname[sizeof (edid->edid_vendorname) - 1] = 0; + strlcpy(edid->edid_vendorname, name, + sizeof(edid->edid_vendorname)); + } else + edid->edid_vendorname[0] = '\0'; name = edid_findproduct(edid->edid_vendor, edid->edid_product); if (name != NULL) { - snprintf(edid->edid_productname, - sizeof (edid->edid_productname), "%s", name); - } - edid->edid_productname[sizeof (edid->edid_productname) - 1] = 0; + strlcpy(edid->edid_productname, name, + sizeof(edid->edid_productname)); + } else + edid->edid_productname[0] = '\0'; - snprintf(edid->edid_serial, sizeof (edid->edid_serial), "%08x", + edid->edid_comment[0] = '\0'; + + snprintf(edid->edid_serial, sizeof(edid->edid_serial), "%08x", EDID_SERIAL_NUMBER(data)); edid->edid_week = EDID_WEEK(data); @@ -543,11 +601,14 @@ edid_parse(uint8_t *data, struct edid_info *edid) edid->edid_chroma.ec_whitex = EDID_CHROMA_WHITEX(data); edid->edid_chroma.ec_whitey = EDID_CHROMA_WHITEY(data); + edid->edid_ext_block_count = EDID_EXT_BLOCK_COUNT(data); + /* lookup established modes */ edid->edid_nmodes = 0; edid->edid_preferred_mode = NULL; estmodes = EDID_EST_TIMING(data); - for (i = 0; i < 16; i++) { + /* Iterate in established timing order */ + for (i = 15; i >= 0; i--) { if (estmodes & (1 << i)) { vmp = edid_mode_lookup_list(_edid_modes[i]); if (vmp != NULL) { @@ -556,19 +617,23 @@ edid_parse(uint8_t *data, struct edid_info *edid) } #ifdef DIAGNOSTIC else - printf("no data for est. mode %s\n", - _edid_modes[i]); + printf("%s: no data for est. mode %s\n", + devname, _edid_modes[i]); #endif } } /* do standard timing section */ for (i = 0; i < EDID_STD_TIMING_COUNT; i++) { - struct videomode mode; + struct videomode mode, *exist_mode; if (edid_std_timing(data + EDID_OFFSET_STD_TIMING + i * 2, &mode)) { - edid->edid_modes[edid->edid_nmodes] = mode; - edid->edid_nmodes++; + /* Does this mode already exist? */ + exist_mode = edid_search_mode(edid, &mode); + if (exist_mode == NULL) { + edid->edid_modes[edid->edid_nmodes] = mode; + edid->edid_nmodes++; + } } } /* do detailed timings and descriptors */ @@ -594,13 +659,14 @@ edid_parse(uint8_t *data, struct edid_info *edid) if (edid->edid_modes[i].dot_clock > max_dotclock) max_dotclock = edid->edid_modes[i].dot_clock; - printf("max_dotclock according to supported modes: %d\n", - max_dotclock); +#ifdef DIAGNOSTIC + printf("%s: max_dotclock according to supported modes: %d\n", + devname, max_dotclock); +#endif mhz = (max_dotclock + 999) / 1000; if (edid->edid_have_range) { - if (mhz > edid->edid_range.er_max_clock) edid->edid_range.er_max_clock = mhz; } else diff --git a/sys/dev/videomode/edidreg.h b/sys/dev/videomode/edidreg.h index 260e6a10d..bcac6797b 100644 --- a/sys/dev/videomode/edidreg.h +++ b/sys/dev/videomode/edidreg.h @@ -1,4 +1,5 @@ -/* $NetBSD: edidreg.h,v 1.2 2006/05/13 00:39:19 gdamore Exp $ */ +/* $OpenBSD: edidreg.h,v 1.2 2024/11/06 09:34:10 miod Exp $ */ +/* $NetBSD: edidreg.h,v 1.4 2014/11/17 00:46:04 jmcneill Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -203,11 +204,11 @@ #define EDID_DET_TIMING_VBORDER(ptr) ((ptr)[16]) #define EDID_DET_TIMING_FLAGS(ptr) ((ptr)[17]) #define EDID_DET_TIMING_FLAG_INTERLACE 0x80 -#define EDID_DET_TIMING_FLAG_STEREO 0x60 /* wtf? */ +#define EDID_DET_TIMING_FLAG_STEREO 0x60 /* stereo or not */ #define EDID_DET_TIMING_FLAG_SYNC_SEPARATE 0x18 -#define EDID_DET_TIMING_FLAG_HSYNC_POSITIVE 0x04 -#define EDID_DET_TIMING_FLAG_VSYNC_POSITIVE 0x02 -#define EDID_DET_TIMING_FLAG_STEREO1 0x01 /* wtf? */ +#define EDID_DET_TIMING_FLAG_VSYNC_POSITIVE 0x04 +#define EDID_DET_TIMING_FLAG_HSYNC_POSITIVE 0x02 +#define EDID_DET_TIMING_FLAG_STEREO_MODE 0x01 /* stereo mode */ /* N.B.: these tests assume that we already checked for detailed timing! */ @@ -250,4 +251,6 @@ #define EDID_DESC_STD_TIMING_START 5 #define EDID_DESC_STD_TIMING_COUNT 6 +#define EDID_EXT_BLOCK_COUNT(ptr) ((ptr)[126]) + #endif /* _DEV_VIDEOMODE_EDIDREG_H */ diff --git a/sys/dev/videomode/edidvar.h b/sys/dev/videomode/edidvar.h index 2d7b5e43d..ebf4465c7 100644 --- a/sys/dev/videomode/edidvar.h +++ b/sys/dev/videomode/edidvar.h @@ -1,4 +1,5 @@ -/* $NetBSD: edidvar.h,v 1.2 2006/05/11 19:05:41 gdamore Exp $ */ +/* $OpenBSD: edidvar.h,v 1.3 2024/11/06 09:34:10 miod Exp $ */ +/* $NetBSD: edidvar.h,v 1.5 2021/12/19 11:01:01 riastradh Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -34,6 +35,8 @@ #ifndef _DEV_VIDEOMODE_EDIDVAR_H #define _DEV_VIDEOMODE_EDIDVAR_H +#include + struct edid_chroma { uint16_t ec_redx; uint16_t ec_redy; @@ -75,6 +78,7 @@ struct edid_info { uint8_t edid_max_vsize; /* in cm */ uint8_t edid_gamma; uint8_t edid_features; + uint8_t edid_ext_block_count; int edid_have_range; struct edid_range edid_range; @@ -87,7 +91,7 @@ struct edid_info { }; int edid_is_valid(uint8_t *); -int edid_parse(uint8_t *, struct edid_info *); +int edid_parse(const char *, uint8_t *, struct edid_info *); void edid_print(struct edid_info *); #endif /* _DEV_VIDEOMODE_EDIDVAR_H */ diff --git a/sys/dev/videomode/modelines b/sys/dev/videomode/modelines index f3669eed9..e8e705b0b 100644 --- a/sys/dev/videomode/modelines +++ b/sys/dev/videomode/modelines @@ -1,4 +1,5 @@ -// $NetBSD: modelines,v 1.7 2009/01/21 14:40:25 jnemeth Exp $ +// $OpenBSD: modelines,v 1.2 2024/11/06 09:32:09 miod Exp $ +// $NetBSD: modelines,v 1.9 2011/03/30 18:45:04 jdc Exp $ // // This file was imported from XFree86, and is made of the contents of both // the vesamodes and extramodes files. As a result these should correspond @@ -21,14 +22,20 @@ ModeLine "640x350" 31.5 640 672 736 832 350 382 385 445 +hsync -vsy # 640x400 @ 85Hz (VESA) hsync: 37.9kHz ModeLine "640x400" 31.5 640 672 736 832 400 401 404 445 -hsync +vsync +# 720x400 @ 70Hz (EDID established timing) hsync: 31.47kHz +ModeLine "720x400" 28.32 720 738 846 900 400 412 414 449 -hsync +vsync + # 720x400 @ 85Hz (VESA) hsync: 37.9kHz ModeLine "720x400" 35.5 720 756 828 936 400 401 404 446 -hsync +vsync +# 720x400 @ 88Hz (EDID established timing) hsync: 39.44kHz +ModeLine "720x400" 35.5 720 738 846 900 400 421 423 449 -hsync -vsync + # 640x480 @ 60Hz (Industry standard) hsync: 31.5kHz -ModeLine "640x480" 25.2 640 656 752 800 480 490 492 525 -hsync -vsync +ModeLine "640x480" 25.175 640 656 752 800 480 490 492 525 -hsync -vsync # 640x480 @ 72Hz (VESA) hsync: 37.9kHz -ModeLine "640x480" 31.5 640 664 704 832 480 489 491 520 -hsync -vsync +ModeLine "640x480" 31.5 640 664 704 832 480 489 492 520 -hsync -vsync # 640x480 @ 75Hz (VESA) hsync: 37.5kHz ModeLine "640x480" 31.5 640 656 720 840 480 481 484 500 -hsync -vsync @@ -49,7 +56,7 @@ ModeLine "800x600" 50.0 800 856 976 1040 600 637 643 666 +hsync +vsy ModeLine "800x600" 49.5 800 816 896 1056 600 601 604 625 +hsync +vsync # 800x600 @ 85Hz (VESA) hsync: 53.7kHz -ModeLine "800x600" 56.3 800 832 896 1048 600 601 604 631 +hsync +vsync +ModeLine "800x600" 56.25 800 832 896 1048 600 601 604 631 +hsync +vsync # 1024x768i @ 43Hz (industry standard) hsync: 35.5kHz ModeLine "1024x768" 44.9 1024 1032 1208 1264 768 768 776 817 +hsync +vsync Interlace @@ -61,7 +68,7 @@ ModeLine "1024x768" 65.0 1024 1048 1184 1344 768 771 777 806 -hsync -vsy ModeLine "1024x768" 75.0 1024 1048 1184 1328 768 771 777 806 -hsync -vsync # 1024x768 @ 75Hz (VESA) hsync: 60.0kHz -ModeLine "1024x768" 78.8 1024 1040 1136 1312 768 769 772 800 +hsync +vsync +ModeLine "1024x768" 78.75 1024 1040 1136 1312 768 769 772 800 +hsync +vsync # 1024x768 @ 85Hz (VESA) hsync: 68.7kHz ModeLine "1024x768" 94.5 1024 1072 1168 1376 768 769 772 808 +hsync +vsync diff --git a/sys/dev/videomode/modelines2c.awk b/sys/dev/videomode/modelines2c.awk index 3b812b926..c77ce88e3 100644 --- a/sys/dev/videomode/modelines2c.awk +++ b/sys/dev/videomode/modelines2c.awk @@ -1,6 +1,6 @@ #! /usr/bin/awk -f -# $NetBSD: modelines2c.awk,v 1.4 2006/10/26 23:19:50 bjh21 Exp $ -# $OpenBSD: modelines2c.awk,v 1.2 2012/12/05 23:20:22 deraadt Exp $ +# $NetBSD: modelines2c.awk,v 1.5 2011/03/21 19:32:26 jdc Exp $ +# $OpenBSD: modelines2c.awk,v 1.3 2024/11/06 09:34:10 miod Exp $ # # Copyright (c) 2006 Itronix Inc. # All rights reserved. @@ -104,8 +104,9 @@ NR == 1 { ifactor = 2.0; } - # why the additional .1 to vrefresh? well it seems that awk likes to - # make some "rounding errors", and this will compensate + # We truncate the vrefresh figure, but some mode descriptions rely + # on rounding, so we can't win here. Adding an additional .1 + # compensates to some extent. hrefresh= (dotclock * 1000000) / htotal; vrefresh= int(((hrefresh * ifactor) / vtotal) + .1); diff --git a/sys/dev/videomode/videomode.c b/sys/dev/videomode/videomode.c index 2de6364ed..f1977bffc 100644 --- a/sys/dev/videomode/videomode.c +++ b/sys/dev/videomode/videomode.c @@ -1,12 +1,13 @@ -/* $OpenBSD: videomode.c,v 1.2 2012/12/05 23:20:22 deraadt Exp $ */ +/* $OpenBSD: videomode.c,v 1.3 2024/11/06 09:34:43 miod Exp $ */ /* * THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT. * * generated from: - * NetBSD: modelines,v 1.7 2009/01/21 14:40:25 jnemeth Exp + * OpenBSD: modelines,v 1.2 2024/11/06 09:32:09 miod Exp */ +#include #include /* @@ -25,20 +26,22 @@ const struct videomode videomode_list[] = { M("640x350x85",640,350,31500,672,736,832,382,385,445,HP|VN), M("640x400x85",640,400,31500,672,736,832,401,404,445,HN|VP), +M("720x400x70",720,400,28320,738,846,900,412,414,449,HN|VP), M("720x400x85",720,400,35500,756,828,936,401,404,446,HN|VP), -M("640x480x60",640,480,25200,656,752,800,490,492,525,HN|VN), -M("640x480x72",640,480,31500,664,704,832,489,491,520,HN|VN), +M("720x400x87",720,400,35500,738,846,900,421,423,449,HN|VN), +M("640x480x60",640,480,25175,656,752,800,490,492,525,HN|VN), +M("640x480x72",640,480,31500,664,704,832,489,492,520,HN|VN), M("640x480x75",640,480,31500,656,720,840,481,484,500,HN|VN), M("640x480x85",640,480,36000,696,752,832,481,484,509,HN|VN), M("800x600x56",800,600,36000,824,896,1024,601,603,625,HP|VP), M("800x600x60",800,600,40000,840,968,1056,601,605,628,HP|VP), M("800x600x72",800,600,50000,856,976,1040,637,643,666,HP|VP), M("800x600x75",800,600,49500,816,896,1056,601,604,625,HP|VP), -M("800x600x85",800,600,56300,832,896,1048,601,604,631,HP|VP), +M("800x600x85",800,600,56250,832,896,1048,601,604,631,HP|VP), M("1024x768x87i",1024,768,44900,1032,1208,1264,768,776,817,HP|VP|I), M("1024x768x60",1024,768,65000,1048,1184,1344,771,777,806,HN|VN), M("1024x768x70",1024,768,75000,1048,1184,1328,771,777,806,HN|VN), -M("1024x768x75",1024,768,78800,1040,1136,1312,769,772,800,HP|VP), +M("1024x768x75",1024,768,78750,1040,1136,1312,769,772,800,HP|VP), M("1024x768x85",1024,768,94500,1072,1168,1376,769,772,808,HP|VP), M("1024x768x89",1024,768,100000,1108,1280,1408,768,780,796,HP|VP), M("1152x864x75",1152,864,108000,1216,1344,1600,865,868,900,HP|VP), @@ -72,20 +75,22 @@ M("1152x900x76",1152,900,105560,1168,1280,1472,902,906,943,HN|VN), M("320x175x85",320,175,15750,336,368,416,191,192,222,HP|VN|DS), M("320x200x85",320,200,15750,336,368,416,200,202,222,HN|VP|DS), +M("360x200x70",360,200,14160,369,423,450,206,207,224,HN|VP|DS), M("360x200x85",360,200,17750,378,414,468,200,202,223,HN|VP|DS), -M("320x240x60",320,240,12600,328,376,400,245,246,262,HN|VN|DS), -M("320x240x72",320,240,15750,332,352,416,244,245,260,HN|VN|DS), +M("360x200x87",360,200,17750,369,423,450,210,211,224,HN|VN|DS), +M("320x240x60",320,240,12587,328,376,400,245,246,262,HN|VN|DS), +M("320x240x72",320,240,15750,332,352,416,244,246,260,HN|VN|DS), M("320x240x75",320,240,15750,328,360,420,240,242,250,HN|VN|DS), M("320x240x85",320,240,18000,348,376,416,240,242,254,HN|VN|DS), M("400x300x56",400,300,18000,412,448,512,300,301,312,HP|VP|DS), M("400x300x60",400,300,20000,420,484,528,300,302,314,HP|VP|DS), M("400x300x72",400,300,25000,428,488,520,318,321,333,HP|VP|DS), M("400x300x75",400,300,24750,408,448,528,300,302,312,HP|VP|DS), -M("400x300x85",400,300,28150,416,448,524,300,302,315,HP|VP|DS), +M("400x300x85",400,300,28125,416,448,524,300,302,315,HP|VP|DS), M("512x384x87i",512,384,22450,516,604,632,384,388,408,HP|VP|DS|I), M("512x384x60",512,384,32500,524,592,672,385,388,403,HN|VN|DS), M("512x384x70",512,384,37500,524,592,664,385,388,403,HN|VN|DS), -M("512x384x75",512,384,39400,520,568,656,384,386,400,HP|VP|DS), +M("512x384x75",512,384,39375,520,568,656,384,386,400,HP|VP|DS), M("512x384x85",512,384,47250,536,584,688,384,386,404,HP|VP|DS), M("512x384x89",512,384,50000,554,640,704,384,390,398,HP|VP|DS), M("576x432x75",576,432,54000,608,672,800,432,434,450,HP|VP|DS), @@ -116,4 +121,4 @@ M("576x450x66",576,450,47250,596,660,764,451,453,468,HN|VN|DS), M("576x450x76",576,450,52780,584,640,736,451,453,471,HN|VN|DS), }; -const int videomode_count = 44; +const int videomode_count = 46; diff --git a/sys/dev/wscons/files.wscons b/sys/dev/wscons/files.wscons index 920f00329..a7c9e201a 100644 --- a/sys/dev/wscons/files.wscons +++ b/sys/dev/wscons/files.wscons @@ -1,4 +1,4 @@ -# $OpenBSD: files.wscons,v 1.17 2017/02/27 15:59:56 bru Exp $ +# $OpenBSD: files.wscons,v 1.18 2024/11/05 16:53:30 miod Exp $ # $NetBSD: files.wscons,v 1.34 2005/05/04 01:52:16 augustss Exp $ # @@ -15,7 +15,7 @@ # this loses, but there's no way to define attributes which have attributes device wsdisplay #tty? -attach wsdisplay at wsemuldisplaydev with wsdisplay_emul +attach wsdisplay at wsemuldisplaydev device wskbd attach wskbd at wskbddev device wsmouse diff --git a/sys/dev/wscons/wsdisplay.c b/sys/dev/wscons/wsdisplay.c index 58eb734ea..b74df4643 100644 --- a/sys/dev/wscons/wsdisplay.c +++ b/sys/dev/wscons/wsdisplay.c @@ -1,4 +1,4 @@ -/* $OpenBSD: wsdisplay.c,v 1.153 2024/09/30 01:41:49 jsg Exp $ */ +/* $OpenBSD: wsdisplay.c,v 1.154 2024/11/05 16:53:30 miod Exp $ */ /* $NetBSD: wsdisplay.c,v 1.82 2005/02/27 00:27:52 perry Exp $ */ /* @@ -203,9 +203,9 @@ struct wsdisplay_softc { extern struct cfdriver wsdisplay_cd; /* Autoconfiguration definitions. */ -int wsdisplay_emul_match(struct device *, void *, void *); -void wsdisplay_emul_attach(struct device *, struct device *, void *); -int wsdisplay_emul_detach(struct device *, int); +int wsdisplay_match(struct device *, void *, void *); +void wsdisplay_attach(struct device *, struct device *, void *); +int wsdisplay_detach(struct device *, int); int wsdisplay_activate(struct device *, int); @@ -215,9 +215,9 @@ struct cfdriver wsdisplay_cd = { NULL, "wsdisplay", DV_TTY }; -const struct cfattach wsdisplay_emul_ca = { - sizeof(struct wsdisplay_softc), wsdisplay_emul_match, - wsdisplay_emul_attach, wsdisplay_emul_detach, wsdisplay_activate +const struct cfattach wsdisplay_ca = { + sizeof(struct wsdisplay_softc), wsdisplay_match, + wsdisplay_attach, wsdisplay_detach, wsdisplay_activate }; void wsdisplaystart(struct tty *); @@ -231,11 +231,6 @@ int wsdisplayparam(struct tty *, struct termios *); #define WSSCREEN_HAS_TTY(scr) ((scr)->scr_tty != NULL) -void wsdisplay_common_attach(struct wsdisplay_softc *sc, - int console, int mux, const struct wsscreen_list *, - const struct wsdisplay_accessops *accessops, - void *accesscookie, u_int defaultscreens); -int wsdisplay_common_detach(struct wsdisplay_softc *, int); void wsdisplay_kbdholdscr(struct wsscreen *, int); #ifdef WSDISPLAY_COMPAT_RAWKBD @@ -535,7 +530,7 @@ wsdisplay_delscreen(struct wsdisplay_softc *sc, int idx, int flags) * Autoconfiguration functions. */ int -wsdisplay_emul_match(struct device *parent, void *match, void *aux) +wsdisplay_match(struct device *parent, void *match, void *aux) { struct cfdata *cf = match; struct wsemuldisplaydev_attach_args *ap = aux; @@ -566,39 +561,6 @@ wsdisplay_emul_match(struct device *parent, void *match, void *aux) return (1); } -void -wsdisplay_emul_attach(struct device *parent, struct device *self, void *aux) -{ - struct wsdisplay_softc *sc = (struct wsdisplay_softc *)self; - struct wsemuldisplaydev_attach_args *ap = aux; - - wsdisplay_common_attach(sc, ap->console, - sc->sc_dv.dv_cfdata->wsemuldisplaydevcf_mux, ap->scrdata, - ap->accessops, ap->accesscookie, ap->defaultscreens); - - if (ap->console && cn_tab == &wsdisplay_cons) { - int maj; - - /* locate the major number */ - for (maj = 0; maj < nchrdev; maj++) - if (cdevsw[maj].d_open == wsdisplayopen) - break; - - cn_tab->cn_dev = makedev(maj, WSDISPLAYMINOR(self->dv_unit, 0)); - } -} - -/* - * Detach a display. - */ -int -wsdisplay_emul_detach(struct device *self, int flags) -{ - struct wsdisplay_softc *sc = (struct wsdisplay_softc *)self; - - return (wsdisplay_common_detach(sc, flags)); -} - int wsdisplay_activate(struct device *self, int act) { @@ -613,9 +575,13 @@ wsdisplay_activate(struct device *self, int act) return (ret); } +/* + * Detach a display. + */ int -wsdisplay_common_detach(struct wsdisplay_softc *sc, int flags) +wsdisplay_detach(struct device *self, int flags) { + struct wsdisplay_softc *sc = (struct wsdisplay_softc *)self; int i; int rc; @@ -699,15 +665,16 @@ wsemuldisplaydevsubmatch(struct device *parent, void *match, void *aux) } void -wsdisplay_common_attach(struct wsdisplay_softc *sc, int console, int kbdmux, - const struct wsscreen_list *scrdata, - const struct wsdisplay_accessops *accessops, void *accesscookie, - u_int defaultscreens) +wsdisplay_attach(struct device *parent, struct device *self, void *aux) { + struct wsdisplay_softc *sc = (struct wsdisplay_softc *)self; + struct wsemuldisplaydev_attach_args *ap = aux; + u_int defaultscreens = ap->defaultscreens; int i, start = 0; #if NWSKBD > 0 struct wsevsrc *kme; #if NWSMUX > 0 + int kbdmux = sc->sc_dv.dv_cfdata->wsemuldisplaydevcf_mux; struct wsmux_softc *mux; if (kbdmux >= 0) @@ -729,12 +696,12 @@ wsdisplay_common_attach(struct wsdisplay_softc *sc, int console, int kbdmux, #endif /* NWSMUX > 0 */ #endif /* NWSKBD > 0 */ - sc->sc_isconsole = console; + sc->sc_isconsole = ap->console; sc->sc_resumescreen = WSDISPLAY_NULLSCREEN; sc->sc_taskq = taskq_create(sc->sc_dv.dv_xname, 1, IPL_TTY, 0); - if (console) { + if (ap->console) { KASSERT(wsdisplay_console_initted); KASSERT(wsdisplay_console_device == NULL); @@ -771,9 +738,9 @@ wsdisplay_common_attach(struct wsdisplay_softc *sc, int console, int kbdmux, wsmux_set_display(mux, &sc->sc_dv); #endif - sc->sc_accessops = accessops; - sc->sc_accesscookie = accesscookie; - sc->sc_scrdata = scrdata; + sc->sc_accessops = ap->accessops; + sc->sc_accesscookie = ap->accesscookie; + sc->sc_scrdata = ap->scrdata; /* * Set up a number of virtual screens if wanted. The @@ -802,7 +769,7 @@ wsdisplay_common_attach(struct wsdisplay_softc *sc, int console, int kbdmux, #endif #if NWSKBD > 0 && NWSMUX == 0 - if (console == 0) { + if (ap->console == 0) { /* * In the non-wsmux world, always connect wskbd0 and wsdisplay0 * together. @@ -817,6 +784,17 @@ wsdisplay_common_attach(struct wsdisplay_softc *sc, int console, int kbdmux, } } #endif + + if (ap->console && cn_tab == &wsdisplay_cons) { + int maj; + + /* locate the major number */ + for (maj = 0; maj < nchrdev; maj++) + if (cdevsw[maj].d_open == wsdisplayopen) + break; + + cn_tab->cn_dev = makedev(maj, WSDISPLAYMINOR(self->dv_unit, 0)); + } } void diff --git a/sys/dev/wscons/wsemul_vt100.c b/sys/dev/wscons/wsemul_vt100.c index 1c122fe68..e2184d512 100644 --- a/sys/dev/wscons/wsemul_vt100.c +++ b/sys/dev/wscons/wsemul_vt100.c @@ -1,4 +1,4 @@ -/* $OpenBSD: wsemul_vt100.c,v 1.47 2023/08/02 19:20:19 miod Exp $ */ +/* $OpenBSD: wsemul_vt100.c,v 1.48 2024/11/05 08:12:08 miod Exp $ */ /* $NetBSD: wsemul_vt100.c,v 1.13 2000/04/28 21:56:16 mycroft Exp $ */ /* @@ -80,14 +80,12 @@ void wsemul_vt100_init(struct wsemul_vt100_emuldata *, const struct wsscreen_descr *, void *, int, int, uint32_t); int wsemul_vt100_jump_scroll(struct wsemul_vt100_emuldata *, const u_char *, u_int, int); -int wsemul_vt100_output_normal(struct wsemul_vt100_emuldata *, - struct wsemul_inputstate *, int); int wsemul_vt100_output_c0c1(struct wsemul_vt100_emuldata *, struct wsemul_inputstate *, int); int wsemul_vt100_nextline(struct wsemul_vt100_emuldata *); typedef int vt100_handler(struct wsemul_vt100_emuldata *, struct - wsemul_inputstate *); + wsemul_inputstate *, int); vt100_handler wsemul_vt100_output_esc, wsemul_vt100_output_csi, @@ -312,9 +310,11 @@ wsemul_vt100_reset(struct wsemul_vt100_emuldata *edp) edp->instate.inchar = 0; edp->instate.lbound = 0; edp->instate.mbleft = 0; + edp->instate.last_output = 0; edp->kstate.inchar = 0; edp->kstate.lbound = 0; edp->kstate.mbleft = 0; + edp->kstate.last_output = 0; } /* @@ -347,22 +347,14 @@ wsemul_vt100_nextline(struct wsemul_vt100_emuldata *edp) int wsemul_vt100_output_normal(struct wsemul_vt100_emuldata *edp, - struct wsemul_inputstate *instate, int kernel) + struct wsemul_inputstate *instate, int kernel, int count) { u_int *ct, dc; u_char c; int oldsschartab = edp->sschartab; + int m; int rc = 0; - if ((edp->flags & (VTFL_LASTCHAR | VTFL_DECAWM)) == - (VTFL_LASTCHAR | VTFL_DECAWM)) { - rc = wsemul_vt100_nextline(edp); - if (rc != 0) - return rc; - edp->ccol = 0; - edp->flags &= ~VTFL_LASTCHAR; - } - #ifdef HAVE_UTF8_SUPPORT if (edp->flags & VTFL_UTF8) { (*edp->emulops->mapchar)(edp->emulcookie, instate->inchar, &dc); @@ -383,26 +375,41 @@ wsemul_vt100_output_normal(struct wsemul_vt100_emuldata *edp, dc = ct ? ct[c] : c; } - if ((edp->flags & VTFL_INSERTMODE) && COLS_LEFT) { - WSEMULOP(rc, edp, &edp->abortstate, copycols, - COPYCOLS(edp->ccol, edp->ccol + 1, COLS_LEFT)); - if (rc != 0) { - /* undo potential sschartab update */ - edp->sschartab = oldsschartab; - - return rc; + for (m = 0; m < count; m++) { + if ((edp->flags & (VTFL_LASTCHAR | VTFL_DECAWM)) == + (VTFL_LASTCHAR | VTFL_DECAWM)) { + rc = wsemul_vt100_nextline(edp); + if (rc != 0) + return rc; + edp->ccol = 0; + edp->flags &= ~VTFL_LASTCHAR; + } + + if ((edp->flags & VTFL_INSERTMODE) && COLS_LEFT) { + WSEMULOP(rc, edp, &edp->abortstate, copycols, + COPYCOLS(edp->ccol, edp->ccol + 1, COLS_LEFT)); + if (rc != 0) + break; } - } #ifdef HAVE_DOUBLE_WIDTH_HEIGHT - WSEMULOP(rc, edp, &edp->abortstate, putchar, - (edp->emulcookie, edp->crow, edp->ccol << edp->dw, dc, - kernel ? edp->kernattr : edp->curattr)); + WSEMULOP(rc, edp, &edp->abortstate, putchar, + (edp->emulcookie, edp->crow, edp->ccol << edp->dw, dc, + kernel ? edp->kernattr : edp->curattr)); #else - WSEMULOP(rc, edp, &edp->abortstate, putchar, - (edp->emulcookie, edp->crow, edp->ccol, dc, - kernel ? edp->kernattr : edp->curattr)); + WSEMULOP(rc, edp, &edp->abortstate, putchar, + (edp->emulcookie, edp->crow, edp->ccol, dc, + kernel ? edp->kernattr : edp->curattr)); #endif + if (rc != 0) + break; + + if (COLS_LEFT) + edp->ccol++; + else + edp->flags |= VTFL_LASTCHAR; + } + if (rc != 0) { /* undo potential sschartab update */ edp->sschartab = oldsschartab; @@ -410,11 +417,6 @@ wsemul_vt100_output_normal(struct wsemul_vt100_emuldata *edp, return rc; } - if (COLS_LEFT) - edp->ccol++; - else - edp->flags |= VTFL_LASTCHAR; - return 0; } @@ -503,7 +505,7 @@ wsemul_vt100_output_c0c1(struct wsemul_vt100_emuldata *edp, int wsemul_vt100_output_esc(struct wsemul_vt100_emuldata *edp, - struct wsemul_inputstate *instate) + struct wsemul_inputstate *instate, int kernel) { u_int newstate = VT100_EMUL_STATE_NORMAL; int rc = 0; @@ -656,7 +658,7 @@ wsemul_vt100_output_esc(struct wsemul_vt100_emuldata *edp, int wsemul_vt100_output_scs94(struct wsemul_vt100_emuldata *edp, - struct wsemul_inputstate *instate) + struct wsemul_inputstate *instate, int kernel) { u_int newstate = VT100_EMUL_STATE_NORMAL; @@ -699,7 +701,7 @@ wsemul_vt100_output_scs94(struct wsemul_vt100_emuldata *edp, int wsemul_vt100_output_scs94_percent(struct wsemul_vt100_emuldata *edp, - struct wsemul_inputstate *instate) + struct wsemul_inputstate *instate, int kernel) { switch (instate->inchar) { case '5': /* DEC supplemental graphic */ @@ -721,7 +723,7 @@ wsemul_vt100_output_scs94_percent(struct wsemul_vt100_emuldata *edp, int wsemul_vt100_output_scs96(struct wsemul_vt100_emuldata *edp, - struct wsemul_inputstate *instate) + struct wsemul_inputstate *instate, int kernel) { u_int newstate = VT100_EMUL_STATE_NORMAL; int nrc; @@ -781,7 +783,7 @@ setnrc: int wsemul_vt100_output_scs96_percent(struct wsemul_vt100_emuldata *edp, - struct wsemul_inputstate *instate) + struct wsemul_inputstate *instate, int kernel) { switch (instate->inchar) { case '6': /* portuguese */ @@ -802,7 +804,7 @@ wsemul_vt100_output_scs96_percent(struct wsemul_vt100_emuldata *edp, int wsemul_vt100_output_esc_spc(struct wsemul_vt100_emuldata *edp, - struct wsemul_inputstate *instate) + struct wsemul_inputstate *instate, int kernel) { switch (instate->inchar) { case 'F': /* 7-bit controls */ @@ -824,7 +826,7 @@ wsemul_vt100_output_esc_spc(struct wsemul_vt100_emuldata *edp, int wsemul_vt100_output_string(struct wsemul_vt100_emuldata *edp, - struct wsemul_inputstate *instate) + struct wsemul_inputstate *instate, int kernel) { if (edp->dcsarg && edp->dcstype && edp->dcspos < DCS_MAXLEN) { if (instate->inchar & ~0xff) { @@ -841,7 +843,7 @@ wsemul_vt100_output_string(struct wsemul_vt100_emuldata *edp, int wsemul_vt100_output_string_esc(struct wsemul_vt100_emuldata *edp, - struct wsemul_inputstate *instate) + struct wsemul_inputstate *instate, int kernel) { if (instate->inchar == '\\') { /* ST complete */ wsemul_vt100_handle_dcs(edp); @@ -854,7 +856,7 @@ wsemul_vt100_output_string_esc(struct wsemul_vt100_emuldata *edp, int wsemul_vt100_output_dcs(struct wsemul_vt100_emuldata *edp, - struct wsemul_inputstate *instate) + struct wsemul_inputstate *instate, int kernel) { u_int newstate = VT100_EMUL_STATE_DCS; @@ -902,7 +904,7 @@ wsemul_vt100_output_dcs(struct wsemul_vt100_emuldata *edp, int wsemul_vt100_output_dcs_dollar(struct wsemul_vt100_emuldata *edp, - struct wsemul_inputstate *instate) + struct wsemul_inputstate *instate, int kernel) { switch (instate->inchar) { case 'p': /* DECRSTS terminal state restore */ @@ -945,7 +947,7 @@ wsemul_vt100_output_dcs_dollar(struct wsemul_vt100_emuldata *edp, int wsemul_vt100_output_esc_percent(struct wsemul_vt100_emuldata *edp, - struct wsemul_inputstate *instate) + struct wsemul_inputstate *instate, int kernel) { switch (instate->inchar) { #ifdef HAVE_UTF8_SUPPORT @@ -969,7 +971,7 @@ wsemul_vt100_output_esc_percent(struct wsemul_vt100_emuldata *edp, int wsemul_vt100_output_esc_hash(struct wsemul_vt100_emuldata *edp, - struct wsemul_inputstate *instate) + struct wsemul_inputstate *instate, int kernel) { int rc = 0; @@ -1049,7 +1051,7 @@ wsemul_vt100_output_esc_hash(struct wsemul_vt100_emuldata *edp, int wsemul_vt100_output_csi(struct wsemul_vt100_emuldata *edp, - struct wsemul_inputstate *instate) + struct wsemul_inputstate *instate, int kernel) { u_int newstate = VT100_EMUL_STATE_CSI; int oargs; @@ -1082,7 +1084,7 @@ wsemul_vt100_output_csi(struct wsemul_vt100_emuldata *edp, oargs = edp->nargs; if (edp->nargs < VT100_EMUL_NARGS) edp->nargs++; - rc = wsemul_vt100_handle_csi(edp, instate); + rc = wsemul_vt100_handle_csi(edp, instate, kernel); if (rc != 0) { /* undo nargs progress */ edp->nargs = oargs; @@ -1215,9 +1217,11 @@ wsemul_vt100_output(void *cookie, const u_char *data, u_int count, int kernel) } if (edp->state == VT100_EMUL_STATE_NORMAL || kernel) { - rc = wsemul_vt100_output_normal(edp, instate, kernel); + rc = + wsemul_vt100_output_normal(edp, instate, kernel, 1); if (rc != 0) break; + instate->last_output = instate->inchar; processed += prev_count - count; continue; } @@ -1225,7 +1229,7 @@ wsemul_vt100_output(void *cookie, const u_char *data, u_int count, int kernel) if (edp->state > nitems(vt100_output)) panic("wsemul_vt100: invalid state %d", edp->state); #endif - rc = vt100_output[edp->state - 1](edp, instate); + rc = vt100_output[edp->state - 1](edp, instate, kernel); if (rc != 0) break; processed += prev_count - count; diff --git a/sys/dev/wscons/wsemul_vt100_subr.c b/sys/dev/wscons/wsemul_vt100_subr.c index 9c04ce369..573aa52ec 100644 --- a/sys/dev/wscons/wsemul_vt100_subr.c +++ b/sys/dev/wscons/wsemul_vt100_subr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: wsemul_vt100_subr.c,v 1.30 2023/02/26 15:09:53 miod Exp $ */ +/* $OpenBSD: wsemul_vt100_subr.c,v 1.32 2024/11/05 15:54:12 miod Exp $ */ /* $NetBSD: wsemul_vt100_subr.c,v 1.7 2000/04/28 21:56:16 mycroft Exp $ */ /* @@ -225,7 +225,7 @@ wsemul_vt100_el(struct wsemul_vt100_emuldata *edp, int arg) */ int wsemul_vt100_handle_csi(struct wsemul_vt100_emuldata *edp, - struct wsemul_inputstate *instate) + struct wsemul_inputstate *instate, int kernel) { int n, m, help, flags, fgcol, bgcol; uint32_t attr, bkgdattr; @@ -548,6 +548,16 @@ wsemul_vt100_handle_csi(struct wsemul_vt100_emuldata *edp, break; } break; + case 'b': /* REP */ + /* + * We arbitrarily limit the repeat count to 65535 to avoid + * uninterruptible flooding of the console. This matches + * current xterm behaviour. + */ + n = min(DEF1_ARG(0), 65535); + instate->inchar = instate->last_output; + rc = wsemul_vt100_output_normal(edp, instate, kernel, n); + break; case 'c': /* DA primary */ if (ARG(0) == 0) wsdisplay_emulinput(edp->cbcookie, WSEMUL_VT_ID1, @@ -729,6 +739,17 @@ wsemul_vt100_handle_csi(struct wsemul_vt100_emuldata *edp, edp->scrreg_startrow : 0); edp->ccol = 0; break; + case 's': + edp->flags |= VTFL_SAVEDCURS; + edp->savedcursor_row = edp->crow; + edp->savedcursor_col = edp->ccol; + break; + case 'u': + if (edp->flags & VTFL_SAVEDCURS) { + edp->crow = edp->savedcursor_row; + edp->ccol = edp->savedcursor_col; + } + break; case 'y': switch (ARG(0)) { case 4: /* DECTST invoke confidence test */ diff --git a/sys/dev/wscons/wsemul_vt100var.h b/sys/dev/wscons/wsemul_vt100var.h index 4b7c7a6c7..a3875d7bb 100644 --- a/sys/dev/wscons/wsemul_vt100var.h +++ b/sys/dev/wscons/wsemul_vt100var.h @@ -1,4 +1,4 @@ -/* $OpenBSD: wsemul_vt100var.h,v 1.13 2023/03/06 17:14:44 miod Exp $ */ +/* $OpenBSD: wsemul_vt100var.h,v 1.14 2024/11/05 08:12:08 miod Exp $ */ /* $NetBSD: wsemul_vt100var.h,v 1.5 2000/04/28 21:56:17 mycroft Exp $ */ /* @@ -153,10 +153,13 @@ int wsemul_vt100_scrolldown(struct wsemul_vt100_emuldata *, int); int wsemul_vt100_ed(struct wsemul_vt100_emuldata *, int); int wsemul_vt100_el(struct wsemul_vt100_emuldata *, int); int wsemul_vt100_handle_csi(struct wsemul_vt100_emuldata *, - struct wsemul_inputstate *); + struct wsemul_inputstate *, int); void wsemul_vt100_handle_dcs(struct wsemul_vt100_emuldata *); int wsemul_vt100_translate(void *cookie, kbd_t, keysym_t, const u_char **); void vt100_initchartables(struct wsemul_vt100_emuldata *); int vt100_setnrc(struct wsemul_vt100_emuldata *, int); + +int wsemul_vt100_output_normal(struct wsemul_vt100_emuldata *, + struct wsemul_inputstate *, int, int); diff --git a/sys/dev/wscons/wsemulvar.h b/sys/dev/wscons/wsemulvar.h index a0a88e727..a0200db44 100644 --- a/sys/dev/wscons/wsemulvar.h +++ b/sys/dev/wscons/wsemulvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: wsemulvar.h,v 1.19 2023/03/06 17:14:44 miod Exp $ */ +/* $OpenBSD: wsemulvar.h,v 1.20 2024/11/05 08:12:08 miod Exp $ */ /* $NetBSD: wsemulvar.h,v 1.6 1999/01/17 15:46:15 drochner Exp $ */ /* @@ -81,6 +81,9 @@ struct wsemul_inputstate { uint32_t inchar; /* character being reconstructed */ uint32_t lbound; /* lower bound of above */ u_int mbleft; /* multibyte bytes left until char complete */ + + uint32_t last_output; /* last printable character */ + /* (used by vt100 emul only) */ }; extern const struct wsemul_ops wsemul_dumb_ops; diff --git a/sys/dev/wscons/wskbd.c b/sys/dev/wscons/wskbd.c index 1ea596fc2..d926449ed 100644 --- a/sys/dev/wscons/wskbd.c +++ b/sys/dev/wscons/wskbd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: wskbd.c,v 1.119 2024/03/25 13:01:49 mvs Exp $ */ +/* $OpenBSD: wskbd.c,v 1.120 2024/12/30 02:46:00 guenther Exp $ */ /* $NetBSD: wskbd.c,v 1.80 2005/05/04 01:52:16 augustss Exp $ */ /* @@ -1002,9 +1002,6 @@ wskbd_do_ioctl_sc(struct wskbd_softc *sc, u_long cmd, caddr_t data, int flag, * Try the generic ioctls that the wskbd interface supports. */ switch (cmd) { - case FIONBIO: /* we will remove this someday (soon???) */ - return (0); - case FIOASYNC: if (sc->sc_base.me_evp == NULL) return (EINVAL); diff --git a/sys/dev/wscons/wsmouse.c b/sys/dev/wscons/wsmouse.c index f923e6da3..1f8357795 100644 --- a/sys/dev/wscons/wsmouse.c +++ b/sys/dev/wscons/wsmouse.c @@ -1,4 +1,4 @@ -/* $OpenBSD: wsmouse.c,v 1.73 2024/06/26 01:40:49 jsg Exp $ */ +/* $OpenBSD: wsmouse.c,v 1.74 2024/12/30 02:46:00 guenther Exp $ */ /* $NetBSD: wsmouse.c,v 1.35 2005/02/27 00:27:52 perry Exp $ */ /* @@ -492,9 +492,6 @@ wsmouse_do_ioctl(struct wsmouse_softc *sc, u_long cmd, caddr_t data, int flag, } switch (cmd) { - case FIONBIO: /* we will remove this someday (soon???) */ - return (0); - case FIOASYNC: if (sc->sc_base.me_evp == NULL) return (EINVAL); diff --git a/sys/dev/wscons/wsmux.c b/sys/dev/wscons/wsmux.c index 3176c6e6f..43cd9cd8f 100644 --- a/sys/dev/wscons/wsmux.c +++ b/sys/dev/wscons/wsmux.c @@ -1,4 +1,4 @@ -/* $OpenBSD: wsmux.c,v 1.59 2024/08/16 12:22:17 miod Exp $ */ +/* $OpenBSD: wsmux.c,v 1.60 2024/12/30 02:46:00 guenther Exp $ */ /* $NetBSD: wsmux.c,v 1.37 2005/04/30 03:47:12 augustss Exp $ */ /* @@ -491,10 +491,6 @@ wsmux_do_ioctl(struct device *dv, u_long cmd, caddr_t data, int flag, DPRINTF(("%s: save rawkbd = %d\n", __func__, sc->sc_rawkbd)); break; #endif - case FIONBIO: - DPRINTF(("%s: FIONBIO\n", sc->sc_base.me_dv.dv_xname)); - return (0); - case FIOASYNC: DPRINTF(("%s: FIOASYNC\n", sc->sc_base.me_dv.dv_xname)); evar = sc->sc_base.me_evp; diff --git a/sys/kern/Makefile b/sys/kern/Makefile index a87ebddd6..c0596225e 100644 --- a/sys/kern/Makefile +++ b/sys/kern/Makefile @@ -1,10 +1,10 @@ -# $OpenBSD: Makefile,v 1.52 2022/10/01 23:49:38 deraadt Exp $ +# $OpenBSD: Makefile,v 1.53 2024/11/03 07:58:42 jsg Exp $ # Makefile for kernel tags files, init_sysent, etc. ARCH= alpha amd64 armv7 arm64 \ hppa i386 landisk loongson \ - luna88k macppc octeon \ + luna88k macppc octeon powerpc64 riscv64 \ sparc64 all: diff --git a/sys/kern/exec_subr.c b/sys/kern/exec_subr.c index 4ebca1b98..9f4aea64a 100644 --- a/sys/kern/exec_subr.c +++ b/sys/kern/exec_subr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: exec_subr.c,v 1.67 2024/04/02 08:39:16 deraadt Exp $ */ +/* $OpenBSD: exec_subr.c,v 1.68 2024/11/02 10:02:23 jsg Exp $ */ /* $NetBSD: exec_subr.c,v 1.9 1994/12/04 03:10:42 mycroft Exp $ */ /* @@ -42,14 +42,11 @@ #include -#ifdef DEBUG /* * new_vmcmd(): * create a new vmcmd structure and fill in its fields based * on function call arguments. make sure objects ref'd by * the vmcmd are 'held'. - * - * If not debugging, this is a macro, so it's expanded inline. */ void @@ -71,7 +68,6 @@ new_vmcmd(struct exec_vmcmd_set *evsp, vcp->ev_prot = prot; vcp->ev_flags = flags; } -#endif /* DEBUG */ void vmcmdset_extend(struct exec_vmcmd_set *evsp) diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c index 41ea4b608..5c48baa98 100644 --- a/sys/kern/init_main.c +++ b/sys/kern/init_main.c @@ -1,4 +1,4 @@ -/* $OpenBSD: init_main.c,v 1.326 2024/04/02 08:39:16 deraadt Exp $ */ +/* $OpenBSD: init_main.c,v 1.328 2025/01/01 07:44:54 jsg Exp $ */ /* $NetBSD: init_main.c,v 1.84.4.1 1996/06/02 09:08:06 mrg Exp $ */ /* @@ -107,7 +107,7 @@ const char copyright[] = "Copyright (c) 1982, 1986, 1989, 1991, 1993\n" "\tThe Regents of the University of California. All rights reserved.\n" "Copyright (c) 1995-2024 OpenBSD. All rights reserved. https://www.OpenBSD.org\n" -"Copyright (c) 2018-2024 SecBSD. All rights reserved. https://secbsd.org\n"; +"Copyright (c) 2018-2025 SecBSD. All rights reserved. https://secbsd.org\n"; /* Components of the first process -- never freed. */ struct session session0; @@ -141,6 +141,7 @@ void db_ctf_init(void); void prof_init(void); void init_exec(void); void futex_init(void); +void tslp_init(void); void taskq_init(void); void timeout_proc_init(void); void pool_gc_pages(void *); @@ -251,6 +252,7 @@ main(void *framep) * Initialize futexes. */ futex_init(); + tslp_init(); /* Create credentials. */ p->p_ucred = crget(); diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c index 4ffc82c66..b7cc8de9e 100644 --- a/sys/kern/init_sysent.c +++ b/sys/kern/init_sysent.c @@ -1,10 +1,10 @@ -/* $OpenBSD: init_sysent.c,v 1.282 2024/08/02 14:35:56 mvs Exp $ */ +/* $OpenBSD: init_sysent.c,v 1.283 2025/01/06 08:57:49 mpi Exp $ */ /* * System call switch table. * * DO NOT EDIT-- this file is automatically generated. - * created from; OpenBSD: syscalls.master,v 1.265 2024/08/02 14:34:45 mvs Exp + * created from; OpenBSD: syscalls.master,v 1.266 2025/01/06 08:57:23 mpi Exp */ #include @@ -138,7 +138,7 @@ const struct sysent sysent[] = { #endif { 0, 0, 0, sys_sigpending }, /* 52 = sigpending */ - { 2, s(struct sys_fstat_args), 0, + { 2, s(struct sys_fstat_args), SY_NOLOCK | 0, sys_fstat }, /* 53 = fstat */ { 3, s(struct sys_ioctl_args), SY_NOLOCK | 0, sys_ioctl }, /* 54 = ioctl */ diff --git a/sys/kern/kern_clockintr.c b/sys/kern/kern_clockintr.c index d28c5da47..92fd8a284 100644 --- a/sys/kern/kern_clockintr.c +++ b/sys/kern/kern_clockintr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_clockintr.c,v 1.70 2024/02/25 19:15:50 cheloha Exp $ */ +/* $OpenBSD: kern_clockintr.c,v 1.71 2024/11/07 16:02:29 miod Exp $ */ /* * Copyright (c) 2003 Dale Rahn * Copyright (c) 2020 Mark Kettenis @@ -653,7 +653,7 @@ void db_show_clockintr(const struct clockintr *cl, const char *state, u_int cpu) { struct timespec ts; - char *name; + const char *name; db_expr_t offset; int width = sizeof(long) * 2; diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index 1142c66f5..a00728682 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_descrip.c,v 1.209 2024/08/20 13:29:25 mvs Exp $ */ +/* $OpenBSD: kern_descrip.c,v 1.210 2024/12/30 02:46:00 guenther Exp $ */ /* $NetBSD: kern_descrip.c,v 1.42 1996/03/30 22:24:38 christos Exp $ */ /* @@ -484,17 +484,8 @@ restart: tmp &= ~FCNTLFLAGS; tmp |= FFLAGS((long)SCARG(uap, arg)) & FCNTLFLAGS; } while (atomic_cas_uint(&fp->f_flag, prev, tmp) != prev); - tmp = fp->f_flag & FNONBLOCK; - error = (*fp->f_ops->fo_ioctl)(fp, FIONBIO, (caddr_t)&tmp, p); - if (error) - break; tmp = fp->f_flag & FASYNC; error = (*fp->f_ops->fo_ioctl)(fp, FIOASYNC, (caddr_t)&tmp, p); - if (!error) - break; - atomic_clearbits_int(&fp->f_flag, FNONBLOCK); - tmp = 0; - (void) (*fp->f_ops->fo_ioctl)(fp, FIONBIO, (caddr_t)&tmp, p); break; case F_GETOWN: diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index d5dd1f387..aec356ade 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_exit.c,v 1.239 2024/10/15 13:49:26 claudio Exp $ */ +/* $OpenBSD: kern_exit.c,v 1.240 2024/12/17 14:45:00 claudio Exp $ */ /* $NetBSD: kern_exit.c,v 1.39 1996/04/22 01:38:25 christos Exp $ */ /* @@ -543,10 +543,9 @@ loop: proc_finish_wait(q, pr); return (0); } - if ((options & WTRAPPED) && - (pr->ps_flags & PS_TRACED) && - (pr->ps_flags & PS_WAITED) == 0 && pr->ps_single && - pr->ps_single->p_stat == SSTOP) { + if ((options & WTRAPPED) && (pr->ps_flags & PS_TRACED) && + (pr->ps_flags & PS_WAITED) == 0 && + (pr->ps_flags & PS_TRAPPED)) { if (single_thread_wait(pr, 0)) goto loop; @@ -570,7 +569,8 @@ loop: } if (((pr->ps_flags & PS_TRACED) || (options & WUNTRACED)) && (pr->ps_flags & PS_WAITED) == 0 && - (pr->ps_flags & PS_STOPPED)) { + (pr->ps_flags & PS_STOPPED) && + (pr->ps_flags & PS_TRAPPED) == 0) { if ((options & WNOWAIT) == 0) atomic_setbits_int(&pr->ps_flags, PS_WAITED); diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index 3d3dfdac7..47a82b45c 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_fork.c,v 1.267 2024/10/08 12:02:24 claudio Exp $ */ +/* $OpenBSD: kern_fork.c,v 1.268 2024/11/10 06:51:59 jsg Exp $ */ /* $NetBSD: kern_fork.c,v 1.29 1996/02/09 18:59:34 christos Exp $ */ /* @@ -61,7 +61,7 @@ #include -#include +#include #include int nprocesses = 1; /* process 0 */ diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c index 113541f14..71f3ad5eb 100644 --- a/sys/kern/kern_ktrace.c +++ b/sys/kern/kern_ktrace.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_ktrace.c,v 1.114 2023/12/15 15:12:08 deraadt Exp $ */ +/* $OpenBSD: kern_ktrace.c,v 1.115 2024/12/27 11:57:16 mpi Exp $ */ /* $NetBSD: kern_ktrace.c,v 1.23 1996/02/09 18:59:36 christos Exp $ */ /* @@ -179,7 +179,9 @@ ktrsyscall(struct proc *p, register_t code, size_t argsize, register_t args[]) *argp++ = args[i]; if (nargs && copyin((void *)args[0], argp, nargs * sizeof(int))) memset(argp, 0, nargs * sizeof(int)); + KERNEL_LOCK(); ktrwrite(p, &kth, ktp, len); + KERNEL_UNLOCK(); free(ktp, M_TEMP, len); atomic_clearbits_int(&p->p_flag, P_INKTR); } @@ -203,7 +205,9 @@ ktrsysret(struct proc *p, register_t code, int error, len = sizeof(long long); else len = sizeof(register_t); + KERNEL_LOCK(); ktrwrite2(p, &kth, &ktp, sizeof(ktp), retval, len); + KERNEL_UNLOCK(); atomic_clearbits_int(&p->p_flag, P_INKTR); } @@ -214,7 +218,9 @@ ktrnamei(struct proc *p, char *path) atomic_setbits_int(&p->p_flag, P_INKTR); ktrinitheader(&kth, p, KTR_NAMEI); + KERNEL_LOCK(); ktrwrite(p, &kth, path, strlen(path)); + KERNEL_UNLOCK(); atomic_clearbits_int(&p->p_flag, P_INKTR); } @@ -351,7 +357,7 @@ void ktrexec(struct proc *p, int type, const char *data, ssize_t len) { struct ktr_header kth; - int count; + int count, error; int buflen; assert(type == KTR_EXECARGS || type == KTR_EXECENV); @@ -373,7 +379,10 @@ ktrexec(struct proc *p, int type, const char *data, ssize_t len) sched_pause(preempt); count = lmin(len, buflen); - if (ktrwrite(p, &kth, data, count) != 0) + KERNEL_LOCK(); + error = ktrwrite(p, &kth, data, count); + KERNEL_UNLOCK(); + if (error != 0) break; len -= count; diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index ab9f6c378..34ad5b981 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_proc.c,v 1.100 2024/10/15 13:49:26 claudio Exp $ */ +/* $OpenBSD: kern_proc.c,v 1.101 2024/10/22 11:54:04 claudio Exp $ */ /* $NetBSD: kern_proc.c,v 1.14 1996/02/09 18:59:41 christos Exp $ */ /* @@ -319,7 +319,9 @@ enterthispgrp(struct process *pr, struct pgrp *pgrp) fixjobc(pr, savepgrp, 0); LIST_REMOVE(pr, ps_pglist); + mtx_enter(&pr->ps_mtx); pr->ps_pgrp = pgrp; + mtx_leave(&pr->ps_mtx); LIST_INSERT_HEAD(&pgrp->pg_members, pr, ps_pglist); if (LIST_EMPTY(&savepgrp->pg_members)) pgdelete(savepgrp); @@ -337,7 +339,9 @@ leavepgrp(struct process *pr) LIST_REMOVE(pr, ps_pglist); if (LIST_EMPTY(&pr->ps_pgrp->pg_members)) pgdelete(pr->ps_pgrp); + mtx_enter(&pr->ps_mtx); pr->ps_pgrp = NULL; + mtx_leave(&pr->ps_mtx); } /* diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c index 13b06bbd6..b79a13261 100644 --- a/sys/kern/kern_resource.c +++ b/sys/kern/kern_resource.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_resource.c,v 1.92 2024/10/15 12:26:53 claudio Exp $ */ +/* $OpenBSD: kern_resource.c,v 1.93 2024/11/10 06:45:36 jsg Exp $ */ /* $NetBSD: kern_resource.c,v 1.38 1996/10/23 07:19:38 matthias Exp $ */ /*- @@ -51,7 +51,6 @@ #include #include -#include #include /* Resource usage check interval in msec */ diff --git a/sys/kern/kern_rwlock.c b/sys/kern/kern_rwlock.c index 4e3ac5248..0971acc94 100644 --- a/sys/kern/kern_rwlock.c +++ b/sys/kern/kern_rwlock.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_rwlock.c,v 1.50 2023/07/14 07:07:08 claudio Exp $ */ +/* $OpenBSD: kern_rwlock.c,v 1.53 2025/01/04 02:34:11 dlg Exp $ */ /* * Copyright (c) 2002, 2003 Artur Grabowski @@ -26,10 +26,12 @@ #include #include -void rw_do_exit(struct rwlock *, unsigned long); - -/* XXX - temporary measure until proc0 is properly aligned */ -#define RW_PROC(p) (((long)p) & ~RWLOCK_MASK) +#ifdef RWDIAG +#include /* for hz */ +#define RW_SLEEP_TMO 10 * hz +#else +#define RW_SLEEP_TMO 0 +#endif /* * Other OSes implement more sophisticated mechanism to determine how long the @@ -40,166 +42,131 @@ void rw_do_exit(struct rwlock *, unsigned long); #define RW_SPINS 1000 #ifdef MULTIPROCESSOR -#define rw_cas(p, o, n) (atomic_cas_ulong(p, o, n) != o) +#define rw_cas(p, e, n) atomic_cas_ulong(p, e, n) +#define rw_inc(p) atomic_inc_int(p) +#define rw_dec(p) atomic_dec_int(p) #else -static inline int -rw_cas(volatile unsigned long *p, unsigned long o, unsigned long n) +static inline unsigned long +rw_cas(volatile unsigned long *p, unsigned long e, unsigned long n) { - if (*p != o) - return (1); - *p = n; + unsigned long o = *p; - return (0); + if (o == e) + *p = n; + + return (o); +} + +static inline void +rw_inc(volatile unsigned int *p) +{ + ++(*p); +} + +static inline void +rw_dec(volatile unsigned int *p) +{ + (*p)--; } #endif -/* - * Magic wand for lock operations. Every operation checks if certain - * flags are set and if they aren't, it increments the lock with some - * value (that might need some computing in a few cases). If the operation - * fails, we need to set certain flags while waiting for the lock. - * - * RW_WRITE The lock must be completely empty. We increment it with - * RWLOCK_WRLOCK and the proc pointer of the holder. - * Sets RWLOCK_WAIT|RWLOCK_WRWANT while waiting. - * RW_READ RWLOCK_WRLOCK|RWLOCK_WRWANT may not be set. We increment - * with RWLOCK_READ_INCR. RWLOCK_WAIT while waiting. - */ -static const struct rwlock_op { - unsigned long inc; - unsigned long check; - unsigned long wait_set; - long proc_mult; - int wait_prio; -} rw_ops[] = { - { /* RW_WRITE */ - RWLOCK_WRLOCK, - ULONG_MAX, - RWLOCK_WAIT | RWLOCK_WRWANT, - 1, - PLOCK - 4 - }, - { /* RW_READ */ - RWLOCK_READ_INCR, - RWLOCK_WRLOCK | RWLOCK_WRWANT, - RWLOCK_WAIT, - 0, - PLOCK - }, - { /* Sparse Entry. */ - 0, - }, - { /* RW_DOWNGRADE */ - RWLOCK_READ_INCR - RWLOCK_WRLOCK, - 0, - 0, - -1, - PLOCK - }, -}; +static int rw_do_enter_read(struct rwlock *, int); +static void rw_do_exit_read(struct rwlock *, unsigned long); +static int rw_do_enter_write(struct rwlock *, int); +static int rw_downgrade(struct rwlock *, int); + +static void rw_exited(struct rwlock *); + +static unsigned long +rw_self(void) +{ + unsigned long self = (unsigned long)curproc; + + CLR(self, RWLOCK_MASK); + SET(self, RWLOCK_WRLOCK); + + return (self); +} void rw_enter_read(struct rwlock *rwl) { - unsigned long owner = rwl->rwl_owner; - - if (__predict_false((owner & (RWLOCK_WRLOCK | RWLOCK_WRWANT)) || - rw_cas(&rwl->rwl_owner, owner, owner + RWLOCK_READ_INCR))) - rw_enter(rwl, RW_READ); - else { - membar_enter_after_atomic(); - WITNESS_CHECKORDER(&rwl->rwl_lock_obj, LOP_NEWORDER, NULL); - WITNESS_LOCK(&rwl->rwl_lock_obj, 0); - } + rw_do_enter_read(rwl, 0); } void rw_enter_write(struct rwlock *rwl) { - struct proc *p = curproc; - - if (__predict_false(rw_cas(&rwl->rwl_owner, 0, - RW_PROC(p) | RWLOCK_WRLOCK))) - rw_enter(rwl, RW_WRITE); - else { - membar_enter_after_atomic(); - WITNESS_CHECKORDER(&rwl->rwl_lock_obj, - LOP_EXCLUSIVE | LOP_NEWORDER, NULL); - WITNESS_LOCK(&rwl->rwl_lock_obj, LOP_EXCLUSIVE); - } + rw_do_enter_write(rwl, 0); } void rw_exit_read(struct rwlock *rwl) { - unsigned long owner; + /* maybe we're the last one? */ + rw_do_exit_read(rwl, RWLOCK_READ_INCR); +} + +static void +rw_do_exit_read(struct rwlock *rwl, unsigned long owner) +{ + unsigned long decr; + unsigned long nowner; - rw_assert_rdlock(rwl); WITNESS_UNLOCK(&rwl->rwl_lock_obj, 0); - membar_exit_before_atomic(); - owner = rwl->rwl_owner; - if (__predict_false((owner & RWLOCK_WAIT) || - rw_cas(&rwl->rwl_owner, owner, owner - RWLOCK_READ_INCR))) - rw_do_exit(rwl, 0); + for (;;) { + decr = owner - RWLOCK_READ_INCR; + nowner = rw_cas(&rwl->rwl_owner, owner, decr); + if (owner == nowner) + break; + + if (__predict_false(ISSET(nowner, RWLOCK_WRLOCK))) { + panic("%s rwlock %p: exit read on write locked lock" + " (owner 0x%lx)", rwl->rwl_name, rwl, nowner); + } + if (__predict_false(nowner == 0)) { + panic("%s rwlock %p: exit read on unlocked lock", + rwl->rwl_name, rwl); + } + + owner = nowner; + } + + /* read lock didn't change anything, so no barrier needed? */ + + if (decr == 0) { + /* last one out */ + rw_exited(rwl); + } } void rw_exit_write(struct rwlock *rwl) { + unsigned long self = rw_self(); unsigned long owner; - rw_assert_wrlock(rwl); WITNESS_UNLOCK(&rwl->rwl_lock_obj, LOP_EXCLUSIVE); membar_exit_before_atomic(); - owner = rwl->rwl_owner; - if (__predict_false((owner & RWLOCK_WAIT) || - rw_cas(&rwl->rwl_owner, owner, 0))) - rw_do_exit(rwl, RWLOCK_WRLOCK); -} - -#ifdef DIAGNOSTIC -/* - * Put the diagnostic functions here to keep the main code free - * from ifdef clutter. - */ -static void -rw_enter_diag(struct rwlock *rwl, int flags) -{ - switch (flags & RW_OPMASK) { - case RW_WRITE: - case RW_READ: - if (RW_PROC(curproc) == RW_PROC(rwl->rwl_owner)) - panic("rw_enter: %s locking against myself", - rwl->rwl_name); - break; - case RW_DOWNGRADE: - /* - * If we're downgrading, we must hold the write lock. - */ - if ((rwl->rwl_owner & RWLOCK_WRLOCK) == 0) - panic("rw_enter: %s downgrade of non-write lock", - rwl->rwl_name); - if (RW_PROC(curproc) != RW_PROC(rwl->rwl_owner)) - panic("rw_enter: %s downgrade, not holder", - rwl->rwl_name); - break; - - default: - panic("rw_enter: unknown op 0x%x", flags); + owner = rw_cas(&rwl->rwl_owner, self, 0); + if (__predict_false(owner != self)) { + panic("%s rwlock %p: exit write when lock not held " + "(owner 0x%lx, self 0x%lx)", rwl->rwl_name, rwl, + owner, self); } -} -#else -#define rw_enter_diag(r, f) -#endif + rw_exited(rwl); +} static void _rw_init_flags_witness(struct rwlock *rwl, const char *name, int lo_flags, const struct lock_type *type) { rwl->rwl_owner = 0; + rwl->rwl_waiters = 0; + rwl->rwl_readers = 0; rwl->rwl_name = name; #ifdef WITNESS @@ -223,90 +190,246 @@ _rw_init_flags(struct rwlock *rwl, const char *name, int flags, int rw_enter(struct rwlock *rwl, int flags) { - const struct rwlock_op *op; - unsigned long inc, o; + int op = flags & RW_OPMASK; + int error; + + switch (op) { + case RW_WRITE: + error = rw_do_enter_write(rwl, flags); + break; + case RW_READ: + error = rw_do_enter_read(rwl, flags); + break; + case RW_DOWNGRADE: + error = rw_downgrade(rwl, flags); + break; + default: + panic("%s rwlock %p: %s unexpected op 0x%x", + rwl->rwl_name, rwl, __func__, op); + /* NOTREACHED */ + } + + return (error); +} + +static int +rw_do_enter_write(struct rwlock *rwl, int flags) +{ + unsigned long self = rw_self(); + unsigned long owner; + int prio; + int error; + +#ifdef WITNESS + int lop_flags = LOP_NEWORDER | LOP_EXCLUSIVE; + if (ISSET(flags, RW_DUPOK)) + lop_flags |= LOP_DUPOK; + + if (!ISSET(flags, RW_NOSLEEP)) + WITNESS_CHECKORDER(&rwl->rwl_lock_obj, lop_flags, NULL); +#endif + + owner = rw_cas(&rwl->rwl_owner, 0, self); + if (owner == 0) { + /* wow, we won. so easy */ + goto locked; + } + if (__predict_false(owner == self)) { + panic("%s rwlock %p: enter write deadlock", + rwl->rwl_name, rwl); + } + #ifdef MULTIPROCESSOR /* * If process holds the kernel lock, then we want to give up on CPU * as soon as possible so other processes waiting for the kernel lock * can progress. Hence no spinning if we hold the kernel lock. */ - unsigned int spin = (_kernel_lock_held()) ? 0 : RW_SPINS; -#endif - int error, prio; -#ifdef WITNESS - int lop_flags; + if (!_kernel_lock_held()) { + int spins; - lop_flags = LOP_NEWORDER; - if (flags & RW_WRITE) - lop_flags |= LOP_EXCLUSIVE; - if (flags & RW_DUPOK) - lop_flags |= LOP_DUPOK; - if ((flags & RW_NOSLEEP) == 0 && (flags & RW_DOWNGRADE) == 0) - WITNESS_CHECKORDER(&rwl->rwl_lock_obj, lop_flags, NULL); -#endif - - op = &rw_ops[(flags & RW_OPMASK) - 1]; - - inc = op->inc + RW_PROC(curproc) * op->proc_mult; -retry: - while (__predict_false(((o = rwl->rwl_owner) & op->check) != 0)) { - unsigned long set = o | op->wait_set; - int do_sleep; - - /* Avoid deadlocks after panic or in DDB */ - if (panicstr || db_active) - return (0); - -#ifdef MULTIPROCESSOR /* * It makes sense to try to spin just in case the lock * is acquired by writer. */ - if ((o & RWLOCK_WRLOCK) && (spin != 0)) { - spin--; + + for (spins = 0; spins < RW_SPINS; spins++) { CPU_BUSY_CYCLE(); - continue; + owner = atomic_load_long(&rwl->rwl_owner); + if (owner != 0) + continue; + + owner = rw_cas(&rwl->rwl_owner, 0, self); + if (owner == 0) { + /* ok, we won now. */ + goto locked; + } } + } #endif - rw_enter_diag(rwl, flags); + if (ISSET(flags, RW_NOSLEEP)) + return (EBUSY); - if (flags & RW_NOSLEEP) - return (EBUSY); + prio = PLOCK - 4; + if (ISSET(flags, RW_INTR)) + prio |= PCATCH; - prio = op->wait_prio; - if (flags & RW_INTR) - prio |= PCATCH; - sleep_setup(rwl, prio, rwl->rwl_name); - - do_sleep = !rw_cas(&rwl->rwl_owner, o, set); - - error = sleep_finish(0, do_sleep); - if ((flags & RW_INTR) && - (error != 0)) + rw_inc(&rwl->rwl_waiters); + membar_producer(); + do { + sleep_setup(&rwl->rwl_waiters, prio, rwl->rwl_name); + membar_consumer(); + owner = atomic_load_long(&rwl->rwl_owner); + error = sleep_finish(RW_SLEEP_TMO, owner != 0); +#ifdef RWDIAG + if (error == EWOULDBLOCK) { + printf("%s rwlock %p: %s timeout owner 0x%lx " + "(self 0x%lx)", rwl->rwl_name, rwl, __func__, + owner, self); + db_enter(); + } +#endif + if (ISSET(flags, RW_INTR) && (error != 0)) { + rw_dec(&rwl->rwl_waiters); return (error); - if (flags & RW_SLEEPFAIL) + } + if (ISSET(flags, RW_SLEEPFAIL)) { + rw_dec(&rwl->rwl_waiters); + rw_exited(rwl); return (EAGAIN); + } + + owner = rw_cas(&rwl->rwl_owner, 0, self); + } while (owner != 0); + rw_dec(&rwl->rwl_waiters); + +locked: + membar_enter_after_atomic(); + WITNESS_LOCK(&rwl->rwl_lock_obj, lop_flags); + + return (0); +} + +static int +rw_read_incr(struct rwlock *rwl, unsigned long owner) +{ + unsigned long incr; + unsigned long nowner; + + do { + incr = owner + RWLOCK_READ_INCR; + nowner = rw_cas(&rwl->rwl_owner, owner, incr); + if (nowner == owner) + return (1); + + owner = nowner; + } while (!ISSET(owner, RWLOCK_WRLOCK)); + + return (0); +} + +static int +rw_do_enter_read(struct rwlock *rwl, int flags) +{ + unsigned long owner; + int error; + int prio; + +#ifdef WITNESS + int lop_flags = LOP_NEWORDER; + if (ISSET(flags, RW_DUPOK)) + lop_flags |= LOP_DUPOK; + if (!ISSET(flags, RW_NOSLEEP)) + WITNESS_CHECKORDER(&rwl->rwl_lock_obj, lop_flags, NULL); +#endif + + owner = rw_cas(&rwl->rwl_owner, 0, RWLOCK_READ_INCR); + if (owner == 0) { + /* ermagerd, we won! */ + goto locked; } - if (__predict_false(rw_cas(&rwl->rwl_owner, o, o + inc))) - goto retry; + if (ISSET(owner, RWLOCK_WRLOCK)) { + if (__predict_false(owner == rw_self())) { + panic("%s rwlock %p: enter read deadlock", + rwl->rwl_name, rwl); + } + } else if (atomic_load_int(&rwl->rwl_waiters) == 0) { + if (rw_read_incr(rwl, owner)) { + /* nailed it */ + goto locked; + } + } + + if (ISSET(flags, RW_NOSLEEP)) + return (EBUSY); + + prio = PLOCK; + if (ISSET(flags, RW_INTR)) + prio |= PCATCH; + + rw_inc(&rwl->rwl_readers); + membar_producer(); + do { + sleep_setup(&rwl->rwl_readers, prio, rwl->rwl_name); + membar_consumer(); + error = sleep_finish(RW_SLEEP_TMO, + atomic_load_int(&rwl->rwl_waiters) > 0 || + ISSET(atomic_load_long(&rwl->rwl_owner), RWLOCK_WRLOCK)); +#ifdef RWDIAG + if (error == EWOULDBLOCK) { + printf("%s rwlock %p: %s timeout owner 0x%lx\n", + rwl->rwl_name, rwl, __func__, owner); + db_enter(); + } +#endif + if (ISSET(flags, RW_INTR) && (error != 0)) + goto fail; + if (ISSET(flags, RW_SLEEPFAIL)) { + error = EAGAIN; + goto fail; + } + } while (!rw_read_incr(rwl, 0)); + rw_dec(&rwl->rwl_readers); + +locked: membar_enter_after_atomic(); + WITNESS_LOCK(&rwl->rwl_lock_obj, lop_flags); - /* - * If old lock had RWLOCK_WAIT and RWLOCK_WRLOCK set, it means we - * downgraded a write lock and had possible read waiter, wake them - * to let them retry the lock. - */ - if (__predict_false((o & (RWLOCK_WRLOCK|RWLOCK_WAIT)) == - (RWLOCK_WRLOCK|RWLOCK_WAIT))) - wakeup(rwl); + return (0); +fail: + rw_dec(&rwl->rwl_readers); + return (error); +} - if (flags & RW_DOWNGRADE) +static int +rw_downgrade(struct rwlock *rwl, int flags) +{ + unsigned long self = rw_self(); + unsigned long owner; + + membar_exit_before_atomic(); + owner = atomic_cas_ulong(&rwl->rwl_owner, self, RWLOCK_READ_INCR); + if (__predict_false(owner != self)) { + panic("%s rwlock %p: downgrade when lock not held " + "(owner 0x%lx, self 0x%lx)", rwl->rwl_name, rwl, + owner, self); + } + +#ifdef WITNESS + { + int lop_flags = LOP_NEWORDER; + if (ISSET(flags, RW_DUPOK)) + lop_flags |= LOP_DUPOK; WITNESS_DOWNGRADE(&rwl->rwl_lock_obj, lop_flags); - else - WITNESS_LOCK(&rwl->rwl_lock_obj, lop_flags); + } +#endif + + membar_consumer(); + if (atomic_load_int(&rwl->rwl_waiters) == 0 && + atomic_load_int(&rwl->rwl_readers) > 0) + wakeup(&rwl->rwl_readers); return (0); } @@ -314,53 +437,38 @@ retry: void rw_exit(struct rwlock *rwl) { - unsigned long wrlock; + unsigned long owner; - /* Avoid deadlocks after panic or in DDB */ - if (panicstr || db_active) - return; + owner = atomic_load_long(&rwl->rwl_owner); + if (__predict_false(owner == 0)) { + panic("%s rwlock %p: exit on unlocked lock", + rwl->rwl_name, rwl); + } - wrlock = rwl->rwl_owner & RWLOCK_WRLOCK; - if (wrlock) - rw_assert_wrlock(rwl); + if (ISSET(owner, RWLOCK_WRLOCK)) + rw_exit_write(rwl); else - rw_assert_rdlock(rwl); - WITNESS_UNLOCK(&rwl->rwl_lock_obj, wrlock ? LOP_EXCLUSIVE : 0); - - membar_exit_before_atomic(); - rw_do_exit(rwl, wrlock); + rw_do_exit_read(rwl, owner); } -/* membar_exit_before_atomic() has to precede call of this function. */ -void -rw_do_exit(struct rwlock *rwl, unsigned long wrlock) +static void +rw_exited(struct rwlock *rwl) { - unsigned long owner, set; - - do { - owner = rwl->rwl_owner; - if (wrlock) - set = 0; - else - set = (owner - RWLOCK_READ_INCR) & - ~(RWLOCK_WAIT|RWLOCK_WRWANT); - /* - * Potential MP race here. If the owner had WRWANT set, we - * cleared it and a reader can sneak in before a writer. - */ - } while (__predict_false(rw_cas(&rwl->rwl_owner, owner, set))); - - if (owner & RWLOCK_WAIT) - wakeup(rwl); + membar_consumer(); + if (atomic_load_int(&rwl->rwl_waiters) > 0) + wakeup_one(&rwl->rwl_waiters); + else if (atomic_load_int(&rwl->rwl_readers) > 0) + wakeup(&rwl->rwl_readers); } int rw_status(struct rwlock *rwl) { - unsigned long owner = rwl->rwl_owner; + unsigned long owner; - if (owner & RWLOCK_WRLOCK) { - if (RW_PROC(curproc) == RW_PROC(owner)) + owner = atomic_load_long(&rwl->rwl_owner); + if (ISSET(owner, RWLOCK_WRLOCK)) { + if (rw_self() == owner) return RW_WRITE; else return RW_WRITE_OTHER; @@ -380,11 +488,10 @@ rw_assert_wrlock(struct rwlock *rwl) #ifdef WITNESS witness_assert(&rwl->rwl_lock_obj, LA_XLOCKED); #else - if (!(rwl->rwl_owner & RWLOCK_WRLOCK)) - panic("%s: lock not held", rwl->rwl_name); - - if (RW_PROC(curproc) != RW_PROC(rwl->rwl_owner)) - panic("%s: lock not held by this process", rwl->rwl_name); + if (atomic_load_long(&rwl->rwl_owner) != rw_self()) { + panic("%s rwlock %p: lock not held by this process", + rwl->rwl_name, rwl); + } #endif } @@ -397,8 +504,8 @@ rw_assert_rdlock(struct rwlock *rwl) #ifdef WITNESS witness_assert(&rwl->rwl_lock_obj, LA_SLOCKED); #else - if (!RW_PROC(rwl->rwl_owner) || (rwl->rwl_owner & RWLOCK_WRLOCK)) - panic("%s: lock not shared", rwl->rwl_name); + if (rw_status(rwl) != RW_READ) + panic("%s rwlock %p: lock not shared", rwl->rwl_name, rwl); #endif } @@ -413,9 +520,11 @@ rw_assert_anylock(struct rwlock *rwl) #else switch (rw_status(rwl)) { case RW_WRITE_OTHER: - panic("%s: lock held by different process", rwl->rwl_name); + panic("%s rwlock %p: lock held by different process " + "(self %lx, owner %lx)", rwl->rwl_name, rwl, + rw_self(), rwl->rwl_owner); case 0: - panic("%s: lock not held", rwl->rwl_name); + panic("%s rwlock %p: lock not held", rwl->rwl_name, rwl); } #endif } @@ -429,8 +538,8 @@ rw_assert_unlocked(struct rwlock *rwl) #ifdef WITNESS witness_assert(&rwl->rwl_lock_obj, LA_UNLOCKED); #else - if (RW_PROC(curproc) == RW_PROC(rwl->rwl_owner)) - panic("%s: lock held", rwl->rwl_name); + if (atomic_load_long(&rwl->rwl_owner) == rw_self()) + panic("%s rwlock %p: lock held", rwl->rwl_name, rwl); #endif } #endif @@ -450,7 +559,7 @@ rrw_enter(struct rrwlock *rrwl, int flags) { int rv; - if (RW_PROC(rrwl->rrwl_lock.rwl_owner) == RW_PROC(curproc)) { + if (atomic_load_long(&rrwl->rrwl_lock.rwl_owner) == rw_self()) { if (flags & RW_RECURSEFAIL) return (EDEADLK); else { @@ -472,7 +581,7 @@ void rrw_exit(struct rrwlock *rrwl) { - if (RW_PROC(rrwl->rrwl_lock.rwl_owner) == RW_PROC(curproc)) { + if (atomic_load_long(&rrwl->rrwl_lock.rwl_owner) == rw_self()) { KASSERT(rrwl->rrwl_wcnt > 0); rrwl->rrwl_wcnt--; if (rrwl->rrwl_wcnt != 0) { diff --git a/sys/kern/kern_sched.c b/sys/kern/kern_sched.c index 8ef175da9..b3fb8b11b 100644 --- a/sys/kern/kern_sched.c +++ b/sys/kern/kern_sched.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_sched.c,v 1.102 2024/10/08 11:57:59 claudio Exp $ */ +/* $OpenBSD: kern_sched.c,v 1.103 2024/11/24 13:05:14 claudio Exp $ */ /* * Copyright (c) 2007, 2008 Artur Grabowski * @@ -277,6 +277,7 @@ setrunqueue(struct cpu_info *ci, struct proc *p, uint8_t prio) KASSERT(ci != NULL); SCHED_ASSERT_LOCKED(); KASSERT(p->p_wchan == NULL); + KASSERT(!ISSET(p->p_flag, P_WSLEEP)); p->p_cpu = ci; p->p_stat = SRUN; @@ -367,6 +368,7 @@ again: } KASSERT(p->p_wchan == NULL); + KASSERT(!ISSET(p->p_flag, P_WSLEEP)); return (p); } diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index 4db30445e..9855771cc 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_sig.c,v 1.343 2024/10/17 09:11:35 claudio Exp $ */ +/* $OpenBSD: kern_sig.c,v 1.355 2025/01/06 13:17:56 claudio Exp $ */ /* $NetBSD: kern_sig.c,v 1.54 1996/04/22 01:38:32 christos Exp $ */ /* @@ -68,7 +68,12 @@ #include #include -int nosuidcoredump = 1; +/* + * Locks used to protect data: + * a atomic + */ + +int nosuidcoredump = 1; /* [a] */ /* * The array below categorizes the signals and their default actions. @@ -115,15 +120,20 @@ const int sigprop[NSIG] = { void setsigvec(struct proc *, int, struct sigaction *); +int proc_trap(struct proc *, int); void proc_stop(struct proc *p, int); void proc_stop_sweep(void *); void *proc_stop_si; +void process_continue(struct proc *, int); + void setsigctx(struct proc *, int, struct sigctx *); void postsig_done(struct proc *, int, sigset_t, int); void postsig(struct proc *, int, struct sigctx *); int cansignal(struct proc *, struct process *, int); +void ptsignal_locked(struct proc *, int, enum signal_type); + struct pool sigacts_pool; /* memory pool for sigacts structures */ void sigio_del(struct sigiolst *); @@ -832,30 +842,20 @@ trapsignal(struct proc *p, int signum, u_long trapno, int code, */ if (((pr->ps_flags & (PS_TRACED | PS_PPWAIT)) == PS_TRACED) && signum != SIGKILL && (p->p_sigmask & mask) != 0) { - single_thread_set(p, SINGLE_SUSPEND | SINGLE_NOWAIT); - pr->ps_xsig = signum; + signum = proc_trap(p, signum); - SCHED_LOCK(); - proc_stop(p, 1); - SCHED_UNLOCK(); - - signum = pr->ps_xsig; - pr->ps_xsig = 0; - if ((p->p_flag & P_TRACESINGLE) == 0) - single_thread_clear(p, 0); - atomic_clearbits_int(&p->p_flag, P_TRACESINGLE); + mask = sigmask(signum); + setsigctx(p, signum, &ctx); /* * If we are no longer being traced, or the parent * didn't give us a signal, skip sending the signal. */ - if ((pr->ps_flags & PS_TRACED) == 0 || - signum == 0) + if ((pr->ps_flags & PS_TRACED) == 0 || signum == 0) return; /* update signal info */ p->p_sisig = signum; - mask = sigmask(signum); } /* @@ -877,9 +877,7 @@ trapsignal(struct proc *p, int signum, u_long trapno, int code, sigexit(p, signum); /* NOTREACHED */ } - KERNEL_LOCK(); ptsignal(p, signum, STHREAD); - KERNEL_UNLOCK(); } } @@ -905,11 +903,14 @@ psignal(struct proc *p, int signum) void prsignal(struct process *pr, int signum) { + mtx_enter(&pr->ps_mtx); /* Ignore signal if the target process is exiting */ if (pr->ps_flags & PS_EXITING) { + mtx_leave(&pr->ps_mtx); return; } - ptsignal(TAILQ_FIRST(&pr->ps_threads), signum, SPROCESS); + ptsignal_locked(TAILQ_FIRST(&pr->ps_threads), signum, SPROCESS); + mtx_leave(&pr->ps_mtx); } /* @@ -919,6 +920,16 @@ prsignal(struct process *pr, int signum) */ void ptsignal(struct proc *p, int signum, enum signal_type type) +{ + struct process *pr = p->p_p; + + mtx_enter(&pr->ps_mtx); + ptsignal_locked(p, signum, type); + mtx_leave(&pr->ps_mtx); +} + +void +ptsignal_locked(struct proc *p, int signum, enum signal_type type) { int prop; sig_t action, altaction = SIG_DFL; @@ -928,7 +939,7 @@ ptsignal(struct proc *p, int signum, enum signal_type type) struct proc *q; int wakeparent = 0; - KERNEL_ASSERT_LOCKED(); + MUTEX_ASSERT_LOCKED(&pr->ps_mtx); #ifdef DIAGNOSTIC if ((u_int)signum >= NSIG || signum == 0) @@ -998,7 +1009,7 @@ ptsignal(struct proc *p, int signum, enum signal_type type) } if (type != SPROPAGATED) - knote(&pr->ps_klist, NOTE_SIGNAL | signum); + knote_locked(&pr->ps_klist, NOTE_SIGNAL | signum); prop = sigprop[signum]; @@ -1017,10 +1028,8 @@ ptsignal(struct proc *p, int signum, enum signal_type type) * and if it is set to SIG_IGN, * action will be SIG_DFL here.) */ - mtx_enter(&pr->ps_mtx); sigignore = pr->ps_sigacts->ps_sigignore; sigcatch = pr->ps_sigacts->ps_sigcatch; - mtx_leave(&pr->ps_mtx); if (sigignore & mask) return; @@ -1058,10 +1067,10 @@ ptsignal(struct proc *p, int signum, enum signal_type type) /* * XXX delay processing of SA_STOP signals unless action == SIG_DFL? */ - if (prop & (SA_CONT | SA_STOP) && type != SPROPAGATED) + if (prop & SA_STOP && type != SPROPAGATED) TAILQ_FOREACH(q, &pr->ps_threads, p_thr_link) if (q != p) - ptsignal(q, signum, SPROPAGATED); + ptsignal_locked(q, signum, SPROPAGATED); SCHED_LOCK(); @@ -1095,15 +1104,12 @@ ptsignal(struct proc *p, int signum, enum signal_type type) * it has no further action. If SIGCONT is held, we * continue the process and leave the signal in * p_siglist. If the process catches SIGCONT, let it - * handle the signal itself. If it isn't waiting on - * an event, then it goes back to run state. - * Otherwise, process goes back to sleep state. + * handle the signal itself. At the end continue + * the process. */ atomic_setbits_int(&pr->ps_flags, PS_CONTINUED); atomic_clearbits_int(&pr->ps_flags, - PS_WAITED | PS_STOPPED); - atomic_clearbits_int(&p->p_flag, P_SUSPSIG); - wakeparent = 1; + PS_WAITED | PS_STOPPED | PS_STOPPING | PS_TRAPPED); if (action == SIG_DFL) mask = 0; if (action == SIG_CATCH) { @@ -1111,16 +1117,10 @@ ptsignal(struct proc *p, int signum, enum signal_type type) if (p->p_usrpri > PUSER) p->p_usrpri = PUSER; unsleep(p); - setrunnable(p); - goto out; } - if (p->p_wchan == NULL) { - unsleep(p); - setrunnable(p); - goto out; - } - atomic_clearbits_int(&p->p_flag, P_WSLEEP); - p->p_stat = SSLEEP; + + process_continue(p, P_SUSPSIG); + wakeparent = 1; goto out; } @@ -1276,10 +1276,11 @@ out: void setsigctx(struct proc *p, int signum, struct sigctx *sctx) { - struct sigacts *ps = p->p_p->ps_sigacts; + struct process *pr = p->p_p; + struct sigacts *ps = pr->ps_sigacts; sigset_t mask; - mtx_enter(&p->p_p->ps_mtx); + mtx_enter(&pr->ps_mtx); mask = sigmask(signum); sctx->sig_action = ps->ps_sigact[signum]; sctx->sig_catchmask = ps->ps_catchmask[signum]; @@ -1289,7 +1290,21 @@ setsigctx(struct proc *p, int signum, struct sigctx *sctx) sctx->sig_onstack = (ps->ps_sigonstack & mask) != 0; sctx->sig_ignore = (ps->ps_sigignore & mask) != 0; sctx->sig_catch = (ps->ps_sigcatch & mask) != 0; - mtx_leave(&p->p_p->ps_mtx); + sctx->sig_stop = sigprop[signum] & SA_STOP && + (long)sctx->sig_action == (long)SIG_DFL; + if (sctx->sig_stop) { + /* + * If the process is a member of an orphaned + * process group, ignore tty stop signals. + */ + if (pr->ps_flags & PS_TRACED || + (pr->ps_pgrp->pg_jobc == 0 && + sigprop[signum] & SA_TTYSTOP)) { + sctx->sig_stop = 0; + sctx->sig_ignore = 1; + } + } + mtx_leave(&pr->ps_mtx); } /* @@ -1312,7 +1327,7 @@ int cursig(struct proc *p, struct sigctx *sctx, int deep) { struct process *pr = p->p_p; - int signum, mask, prop; + int signum, mask, keep = 0, prop; sigset_t ps_siglist; KASSERT(p == curproc); @@ -1323,9 +1338,9 @@ cursig(struct proc *p, struct sigctx *sctx, int deep) mask = SIGPENDING(p); if (pr->ps_flags & PS_PPWAIT) mask &= ~STOPSIGMASK; - if (mask == 0) /* no signal to send */ - return (0); - signum = ffs((long)mask); + signum = ffs(mask); + if (signum == 0) /* no signal to send */ + goto keep; mask = sigmask(signum); /* take the signal! */ @@ -1350,8 +1365,22 @@ cursig(struct proc *p, struct sigctx *sctx, int deep) * cursig is called again and there the signal can be * handled cleanly. */ - if (deep) + if (deep) { + /* + * Do not stop the thread here if multiple + * signals are pending and at least one of + * them would force an unwind. + * + * ffs() favors low numbered signals and + * so stop signals may be picked up before + * other pending signals. + */ + if (sctx->sig_stop && SIGPENDING(p)) { + keep |= mask; + continue; + } goto keep; + } /* * If traced, always stop, and stay stopped until released @@ -1360,48 +1389,28 @@ cursig(struct proc *p, struct sigctx *sctx, int deep) */ if (((pr->ps_flags & (PS_TRACED | PS_PPWAIT)) == PS_TRACED) && signum != SIGKILL) { - single_thread_set(p, SINGLE_SUSPEND | SINGLE_NOWAIT); - pr->ps_xsig = signum; + signum = proc_trap(p, signum); - SCHED_LOCK(); - proc_stop(p, 1); - SCHED_UNLOCK(); - - /* - * re-take the signal before releasing - * the other threads. Must check the continue - * conditions below and only take the signal if - * those are not true. - */ - signum = pr->ps_xsig; - pr->ps_xsig = 0; mask = sigmask(signum); setsigctx(p, signum, sctx); - if (!((pr->ps_flags & PS_TRACED) == 0 || - signum == 0 || - (p->p_sigmask & mask) != 0)) { - atomic_clearbits_int(&p->p_siglist, mask); - atomic_clearbits_int(&pr->ps_siglist, mask); - } - - if ((p->p_flag & P_TRACESINGLE) == 0) - single_thread_clear(p, 0); - atomic_clearbits_int(&p->p_flag, P_TRACESINGLE); /* * If we are no longer being traced, or the parent - * didn't give us a signal, look for more signals. + * didn't give us a signal, or the signal is ignored, + * look for more signals. */ - if ((pr->ps_flags & PS_TRACED) == 0 || - signum == 0) + if ((pr->ps_flags & PS_TRACED) == 0 || signum == 0 || + sctx->sig_ignore) continue; /* * If the new signal is being masked, look for other - * signals. + * signals but leave it for later. */ - if ((p->p_sigmask & mask) != 0) + if ((p->p_sigmask & mask) != 0) { + atomic_setbits_int(&p->p_siglist, mask); continue; + } } @@ -1431,15 +1440,9 @@ cursig(struct proc *p, struct sigctx *sctx, int deep) /* * If there is a pending stop signal to process * with default action, stop here, - * then clear the signal. However, - * if process is member of an orphaned - * process group, ignore tty stop signals. + * then clear the signal. */ - if (prop & SA_STOP) { - if (pr->ps_flags & PS_TRACED || - (pr->ps_pgrp->pg_jobc == 0 && - prop & SA_TTYSTOP)) - break; /* == ignore */ + if (sctx->sig_stop) { pr->ps_xsig = signum; SCHED_LOCK(); proc_stop(p, 1); @@ -1475,10 +1478,85 @@ cursig(struct proc *p, struct sigctx *sctx, int deep) /* NOTREACHED */ keep: - atomic_setbits_int(&p->p_siglist, mask); /*leave the signal for later */ + /* + * if we stashed a stop signal but no other signal is pending + * anymore pick the stop signal up again. + */ + if (keep != 0 && signum == 0) { + signum = ffs(keep); + setsigctx(p, signum, sctx); + } + /* move the signal to p_siglist for later */ + atomic_setbits_int(&p->p_siglist, mask | keep); return (signum); } +int +proc_trap(struct proc *p, int signum) +{ + struct process *pr = p->p_p; + + single_thread_set(p, SINGLE_SUSPEND | SINGLE_NOWAIT); + pr->ps_xsig = signum; + + SCHED_LOCK(); + atomic_setbits_int(&pr->ps_flags, PS_TRAPPED); + proc_stop(p, 1); + atomic_clearbits_int(&pr->ps_flags, + PS_WAITED | PS_STOPPED | PS_TRAPPED); + SCHED_UNLOCK(); + + signum = pr->ps_xsig; + pr->ps_xsig = 0; + if ((p->p_flag & P_TRACESINGLE) == 0) + single_thread_clear(p, 0); + atomic_clearbits_int(&p->p_flag, P_TRACESINGLE); + + return signum; +} + +/* + * Continue all threads of a process that were stopped because of `flag'." + */ +void +process_continue(struct proc *p, int flag) +{ + struct process *pr = p->p_p; + struct proc *q; + + MUTEX_ASSERT_LOCKED(&pr->ps_mtx); + + /* wake all if called from a different process */ + if (curproc != p) + p = NULL; + + TAILQ_FOREACH(q, &pr->ps_threads, p_thr_link) { + if (q == p) + continue; + if (!ISSET(q->p_flag, flag)) + continue; + atomic_clearbits_int(&q->p_flag, flag); + + /* + * clearing either makes the thread runnable or puts + * it back into some sleep queue + */ + /* + * XXX in ptsignal the SCHED_LOCK is already held so we can't + * grab it here until that is fixed. + */ + /* XXX SCHED_LOCK(); */ + SCHED_ASSERT_LOCKED(); + if (q->p_wchan == NULL) + setrunnable(q); + else { + atomic_clearbits_int(&q->p_flag, P_WSLEEP); + q->p_stat = SSLEEP; + } + /* XXX SCHED_UNLOCK(); */ + } +} + /* * Put the argument process into the stopped state and notify the parent * via wakeup. Signals are handled elsewhere. The process must not be @@ -1709,6 +1787,7 @@ coredump(struct proc *p) int error, len, incrash = 0; char *name; const char *dir = "/var/crash"; + int nosuidcoredump_local = atomic_load_int(&nosuidcoredump); atomic_setbits_int(&pr->ps_flags, PS_COREDUMP); @@ -1728,8 +1807,8 @@ coredump(struct proc *p) * determines coredump placement policy. */ if (((pr->ps_flags & PS_SUGID) && (error = suser(p))) || - ((pr->ps_flags & PS_SUGID) && nosuidcoredump)) { - if (nosuidcoredump == 3) { + ((pr->ps_flags & PS_SUGID) && nosuidcoredump_local)) { + if (nosuidcoredump_local == 3) { /* * If the program directory does not exist, dumps of * that core will silently fail. @@ -1737,7 +1816,7 @@ coredump(struct proc *p) len = snprintf(name, MAXPATHLEN, "%s/%s/%u.core", dir, pr->ps_comm, pr->ps_pid); incrash = KERNELPATH; - } else if (nosuidcoredump == 2) { + } else if (nosuidcoredump_local == 2) { len = snprintf(name, MAXPATHLEN, "%s/%s.core", dir, pr->ps_comm); incrash = KERNELPATH; @@ -1802,7 +1881,7 @@ coredump(struct proc *p) vn_close(vp, FWRITE, cred, p); goto out; } - VATTR_NULL(&vattr); + vattr_null(&vattr); vattr.va_size = 0; VOP_SETATTR(vp, &vattr, cred, p); pr->ps_acflag |= ACORE; @@ -2003,15 +2082,11 @@ userret(struct proc *p) /* send SIGPROF or SIGVTALRM if their timers interrupted this thread */ if (p->p_flag & P_PROFPEND) { atomic_clearbits_int(&p->p_flag, P_PROFPEND); - KERNEL_LOCK(); psignal(p, SIGPROF); - KERNEL_UNLOCK(); } if (p->p_flag & P_ALRMPEND) { atomic_clearbits_int(&p->p_flag, P_ALRMPEND); - KERNEL_LOCK(); psignal(p, SIGVTALRM); - KERNEL_UNLOCK(); } if (SIGPENDING(p) != 0) { @@ -2212,7 +2287,6 @@ void single_thread_clear(struct proc *p, int flag) { struct process *pr = p->p_p; - struct proc *q; KASSERT(pr->ps_single == p); KASSERT(curproc == p); @@ -2221,27 +2295,10 @@ single_thread_clear(struct proc *p, int flag) pr->ps_single = NULL; atomic_clearbits_int(&pr->ps_flags, PS_SINGLEUNWIND | PS_SINGLEEXIT); - TAILQ_FOREACH(q, &pr->ps_threads, p_thr_link) { - if (q == p || (q->p_flag & P_SUSPSINGLE) == 0) - continue; - atomic_clearbits_int(&q->p_flag, P_SUSPSINGLE); + SCHED_LOCK(); + process_continue(p, P_SUSPSINGLE); + SCHED_UNLOCK(); - /* - * if the thread was only stopped for single threading - * then clearing that either makes it runnable or puts - * it back into some sleep queue - */ - SCHED_LOCK(); - if (q->p_stat == SSTOP && (q->p_flag & flag) == 0) { - if (q->p_wchan == NULL) - setrunnable(q); - else { - atomic_clearbits_int(&q->p_flag, P_WSLEEP); - q->p_stat = SSLEEP; - } - } - SCHED_UNLOCK(); - } mtx_leave(&pr->ps_mtx); } diff --git a/sys/kern/kern_synch.c b/sys/kern/kern_synch.c index dda123c1d..7f5e9cf2a 100644 --- a/sys/kern/kern_synch.c +++ b/sys/kern/kern_synch.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_synch.c,v 1.207 2024/10/17 09:11:35 claudio Exp $ */ +/* $OpenBSD: kern_synch.c,v 1.215 2024/12/05 14:53:55 claudio Exp $ */ /* $NetBSD: kern_synch.c,v 1.37 1996/04/22 01:38:37 christos Exp $ */ /* @@ -62,9 +62,9 @@ #include #endif -int sleep_signal_check(struct proc *); -int thrsleep(struct proc *, struct sys___thrsleep_args *); -int thrsleep_unlock(void *); +int sleep_signal_check(struct proc *, int); + +extern void proc_stop(struct proc *p, int); /* * We're only looking at 7 bits of the address; everything is @@ -337,9 +337,9 @@ sleep_setup(const volatile void *ident, int prio, const char *wmesg) if (p->p_flag & P_CANTSLEEP) panic("sleep: %s failed insomnia", p->p_p->ps_comm); if (ident == NULL) - panic("tsleep: no ident"); + panic("sleep: no ident"); if (p->p_stat != SONPROC) - panic("tsleep: not SONPROC"); + panic("sleep: not SONPROC but %d", p->p_stat); #endif /* exiting processes are not allowed to catch signals */ if (p->p_flag & P_WEXIT) @@ -385,7 +385,7 @@ sleep_finish(int timo, int do_sleep) * we must be ready for sleep when sleep_signal_check() is * called. */ - if ((error = sleep_signal_check(p)) != 0) { + if ((error = sleep_signal_check(p, 0)) != 0) { catch = 0; do_sleep = 0; } @@ -393,12 +393,21 @@ sleep_finish(int timo, int do_sleep) SCHED_LOCK(); /* - * If the wakeup happens while going to sleep, p->p_wchan + * A few checks need to happen before going to sleep: + * - If the wakeup happens while going to sleep, p->p_wchan * will be NULL. In that case unwind immediately but still * check for possible signals and timeouts. + * - If the sleep is aborted call unsleep and take us of the + * sleep queue. + * - If requested to stop force a switch even if the sleep + * condition got cleared. */ if (p->p_wchan == NULL) do_sleep = 0; + if (do_sleep == 0) + unsleep(p); + if (p->p_stat == SSTOP) + do_sleep = 1; atomic_clearbits_int(&p->p_flag, P_WSLEEP); if (do_sleep) { @@ -406,9 +415,7 @@ sleep_finish(int timo, int do_sleep) p->p_ru.ru_nvcsw++; mi_switch(); } else { - KASSERT(p->p_stat == SONPROC || p->p_stat == SSLEEP || - p->p_stat == SSTOP); - unsleep(p); + KASSERT(p->p_stat == SONPROC || p->p_stat == SSLEEP); p->p_stat = SONPROC; } @@ -436,9 +443,12 @@ sleep_finish(int timo, int do_sleep) atomic_clearbits_int(&p->p_flag, P_TIMEOUT); } - /* Check if thread was woken up because of a unwind or signal */ + /* + * Check if thread was woken up because of a unwind or signal + * but ignore any pending stop condition. + */ if (catch != 0) - error = sleep_signal_check(p); + error = sleep_signal_check(p, 1); /* Signal errors are higher priority than timeouts. */ if (error == 0 && error1 != 0) @@ -449,9 +459,12 @@ sleep_finish(int timo, int do_sleep) /* * Check and handle signals and suspensions around a sleep cycle. + * The 2nd call in sleep_finish() sets nostop = 1 and then stop + * signals can be ignored since the sleep is over and the process + * will stop in userret. */ int -sleep_signal_check(struct proc *p) +sleep_signal_check(struct proc *p, int nostop) { struct sigctx ctx; int err, sig; @@ -459,7 +472,14 @@ sleep_signal_check(struct proc *p) if ((err = single_thread_check(p, 1)) != 0) return err; if ((sig = cursig(p, &ctx, 1)) != 0) { - if (ctx.sig_intr) + if (ctx.sig_stop) { + if (nostop) + return 0; + p->p_p->ps_xsig = sig; + SCHED_LOCK(); + proc_stop(p, 0); + SCHED_UNLOCK(); + } else if (ctx.sig_intr && !ctx.sig_ignore) return EINTR; else return ERESTART; @@ -598,28 +618,66 @@ sys_sched_yield(struct proc *p, void *v, register_t *retval) return (0); } -int -thrsleep_unlock(void *lock) +static inline int +thrsleep_unlock(_atomic_lock_t *atomiclock) { static _atomic_lock_t unlocked = _ATOMIC_LOCK_UNLOCKED; - _atomic_lock_t *atomiclock = lock; - if (!lock) + if (atomiclock == NULL) return 0; return copyout(&unlocked, atomiclock, sizeof(unlocked)); } struct tslpentry { - TAILQ_ENTRY(tslpentry) tslp_link; - long tslp_ident; + TAILQ_ENTRY(tslpentry) tslp_link; + struct process *tslp_ps; + long tslp_ident; + struct proc *volatile tslp_p; }; -/* thrsleep queue shared between processes */ -static struct tslpqueue thrsleep_queue = TAILQ_HEAD_INITIALIZER(thrsleep_queue); -static struct rwlock thrsleep_lock = RWLOCK_INITIALIZER("thrsleeplk"); +struct tslp_bucket { + struct tslpqueue tsb_list; + struct mutex tsb_lock; +} __aligned(64); -int +/* thrsleep queue shared between processes */ +static struct tslp_bucket tsb_shared; + +#define TSLP_BUCKET_BITS 6 +#define TSLP_BUCKET_SIZE (1UL << TSLP_BUCKET_BITS) +#define TSLP_BUCKET_MASK (TSLP_BUCKET_SIZE - 1) + +static struct tslp_bucket tsb_buckets[TSLP_BUCKET_SIZE]; + +void +tslp_init(void) +{ + struct tslp_bucket *tsb; + size_t i; + + TAILQ_INIT(&tsb_shared.tsb_list); + mtx_init(&tsb_shared.tsb_lock, IPL_MPFLOOR); + + for (i = 0; i < nitems(tsb_buckets); i++) { + tsb = &tsb_buckets[i]; + + TAILQ_INIT(&tsb->tsb_list); + mtx_init(&tsb->tsb_lock, IPL_MPFLOOR); + } +} + +static struct tslp_bucket * +thrsleep_bucket(long ident) +{ + ident >>= 3; + ident ^= ident >> TSLP_BUCKET_BITS; + ident &= TSLP_BUCKET_MASK; + + return &tsb_buckets[ident]; +} + +static int thrsleep(struct proc *p, struct sys___thrsleep_args *v) { struct sys___thrsleep_args /* { @@ -631,18 +689,19 @@ thrsleep(struct proc *p, struct sys___thrsleep_args *v) } */ *uap = v; long ident = (long)SCARG(uap, ident); struct tslpentry entry; - struct tslpqueue *queue; - struct rwlock *qlock; + struct tslp_bucket *tsb; struct timespec *tsp = (struct timespec *)SCARG(uap, tp); void *lock = SCARG(uap, lock); - uint64_t nsecs = INFSLP; - int abort = 0, error; + const uint32_t *abortp = SCARG(uap, abort); clockid_t clock_id = SCARG(uap, clock_id); + uint64_t to_ticks = 0; + int error = 0; if (ident == 0) return (EINVAL); if (tsp != NULL) { struct timespec now; + uint64_t nsecs; if ((error = clock_gettime(p, clock_id, &now))) return (error); @@ -660,49 +719,62 @@ thrsleep(struct proc *p, struct sys___thrsleep_args *v) timespecsub(tsp, &now, tsp); nsecs = MIN(TIMESPEC_TO_NSEC(tsp), MAXTSLP); + to_ticks = (nsecs + tick_nsec - 1) / (tick_nsec + 1) + 1; + if (to_ticks > INT_MAX) + to_ticks = INT_MAX; } - if (ident == -1) { - queue = &thrsleep_queue; - qlock = &thrsleep_lock; - } else { - queue = &p->p_p->ps_tslpqueue; - qlock = &p->p_p->ps_lock; - } + tsb = (ident == -1) ? &tsb_shared : thrsleep_bucket(ident); /* Interlock with wakeup. */ + entry.tslp_ps = p->p_p; entry.tslp_ident = ident; - rw_enter_write(qlock); - TAILQ_INSERT_TAIL(queue, &entry, tslp_link); - rw_exit_write(qlock); + entry.tslp_p = p; + + mtx_enter(&tsb->tsb_lock); + TAILQ_INSERT_TAIL(&tsb->tsb_list, &entry, tslp_link); + mtx_leave(&tsb->tsb_lock); error = thrsleep_unlock(lock); - - if (error == 0 && SCARG(uap, abort) != NULL) - error = copyin(SCARG(uap, abort), &abort, sizeof(abort)); - - rw_enter_write(qlock); if (error != 0) - goto out; - if (abort != 0) { - error = EINTR; - goto out; - } - if (entry.tslp_ident != 0) { - error = rwsleep_nsec(&entry, qlock, PWAIT|PCATCH, "thrsleep", - nsecs); + goto leave; + + if (abortp != NULL) { + uint32_t abort; + error = copyin32(abortp, &abort); + if (error != 0) + goto leave; + if (abort) { + error = EINTR; + goto leave; + } } -out: - if (entry.tslp_ident != 0) - TAILQ_REMOVE(queue, &entry, tslp_link); - rw_exit_write(qlock); + sleep_setup(&entry, PWAIT|PCATCH, "thrsleep"); + error = sleep_finish(to_ticks, entry.tslp_p != NULL); + if (error != 0 || entry.tslp_p != NULL) { + mtx_enter(&tsb->tsb_lock); + if (entry.tslp_p != NULL) + TAILQ_REMOVE(&tsb->tsb_list, &entry, tslp_link); + else + error = 0; + mtx_leave(&tsb->tsb_lock); - if (error == ERESTART) - error = ECANCELED; + if (error == ERESTART) + error = ECANCELED; + } return (error); +leave: + if (entry.tslp_p != NULL) { + mtx_enter(&tsb->tsb_lock); + if (entry.tslp_p != NULL) + TAILQ_REMOVE(&tsb->tsb_list, &entry, tslp_link); + mtx_leave(&tsb->tsb_lock); + } + + return (error); } int @@ -734,6 +806,21 @@ sys___thrsleep(struct proc *p, void *v, register_t *retval) return 0; } +static void +tslp_wakeups(struct tslpqueue *tslpq) +{ + struct tslpentry *entry, *nentry; + struct proc *p; + + SCHED_LOCK(); + TAILQ_FOREACH_SAFE(entry, tslpq, tslp_link, nentry) { + p = entry->tslp_p; + entry->tslp_p = NULL; + wakeup_proc(p, 0); + } + SCHED_UNLOCK(); +} + int sys___thrwakeup(struct proc *p, void *v, register_t *retval) { @@ -741,50 +828,53 @@ sys___thrwakeup(struct proc *p, void *v, register_t *retval) syscallarg(const volatile void *) ident; syscallarg(int) n; } */ *uap = v; - struct tslpentry *entry, *tmp; - struct tslpqueue *queue; - struct rwlock *qlock; + struct tslpentry *entry, *nentry; + struct tslp_bucket *tsb; long ident = (long)SCARG(uap, ident); int n = SCARG(uap, n); int found = 0; + struct tslpqueue wq = TAILQ_HEAD_INITIALIZER(wq); - if (ident == 0) + if (ident == 0) { *retval = EINVAL; - else { - if (ident == -1) { - queue = &thrsleep_queue; - qlock = &thrsleep_lock; - /* - * Wake up all waiters with ident -1. This is needed - * because ident -1 can be shared by multiple userspace - * lock state machines concurrently. The implementation - * has no way to direct the wakeup to a particular - * state machine. - */ - n = 0; - } else { - queue = &p->p_p->ps_tslpqueue; - qlock = &p->p_p->ps_lock; - } - - rw_enter_write(qlock); - TAILQ_FOREACH_SAFE(entry, queue, tslp_link, tmp) { - if (entry->tslp_ident == ident) { - TAILQ_REMOVE(queue, entry, tslp_link); - entry->tslp_ident = 0; - wakeup_one(entry); - if (++found == n) - break; - } - } - rw_exit_write(qlock); - - if (ident == -1) - *retval = 0; - else - *retval = found ? 0 : ESRCH; + return (0); } + if (ident == -1) { + /* + * Wake up all waiters with ident -1. This is needed + * because ident -1 can be shared by multiple userspace + * lock state machines concurrently. The implementation + * has no way to direct the wakeup to a particular + * state machine. + */ + mtx_enter(&tsb_shared.tsb_lock); + tslp_wakeups(&tsb_shared.tsb_list); + TAILQ_INIT(&tsb_shared.tsb_list); + mtx_leave(&tsb_shared.tsb_lock); + + *retval = 0; + return (0); + } + + tsb = thrsleep_bucket(ident); + + mtx_enter(&tsb->tsb_lock); + TAILQ_FOREACH_SAFE(entry, &tsb->tsb_list, tslp_link, nentry) { + if (entry->tslp_ident == ident && entry->tslp_ps == p->p_p) { + TAILQ_REMOVE(&tsb->tsb_list, entry, tslp_link); + TAILQ_INSERT_TAIL(&wq, entry, tslp_link); + + if (++found == n) + break; + } + } + + if (found) + tslp_wakeups(&wq); + mtx_leave(&tsb->tsb_lock); + + *retval = found ? 0 : ESRCH; return (0); } diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c index f522cf0f0..af2a6870a 100644 --- a/sys/kern/kern_sysctl.c +++ b/sys/kern/kern_sysctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_sysctl.c,v 1.448 2024/09/30 12:32:26 claudio Exp $ */ +/* $OpenBSD: kern_sysctl.c,v 1.460 2025/01/04 09:26:01 mvs Exp $ */ /* $NetBSD: kern_sysctl.c,v 1.17 1996/05/20 17:49:05 mrg Exp $ */ /*- @@ -122,6 +122,11 @@ #include "ucom.h" #include "video.h" +/* + * Locks used to protect data: + * a atomic + */ + extern struct forkstat forkstat; extern struct nchstats nchstats; extern int fscale; @@ -132,7 +137,7 @@ extern int audio_record_enable; extern int video_record_enable; extern int autoconf_serial; -int allowkmem; +int allowkmem; /* [a] */ int sysctl_securelevel(void *, size_t *, void *, size_t, struct proc *); int sysctl_diskinit(int, struct proc *); @@ -156,6 +161,10 @@ void fill_kproc(struct process *, struct kinfo_proc *, struct proc *, int); int kern_sysctl_locked(int *, u_int, void *, size_t *, void *, size_t, struct proc *); +int kern_sysctl_dirs(int, int *, u_int, void *, size_t *, void *, + size_t, struct proc *); +int kern_sysctl_dirs_locked(int, int *, u_int, void *, size_t *, void *, + size_t, struct proc *); int hw_sysctl_locked(int *, u_int, void *, size_t *,void *, size_t, struct proc *); @@ -257,6 +266,7 @@ sys_sysctl(struct proc *p, void *v, register_t *retval) fn = net_sysctl; break; case CTL_FS: + dolock = 0; fn = fs_sysctl; break; case CTL_VFS: @@ -388,6 +398,40 @@ const struct sysctl_bounded_args kern_vars[] = { int kern_sysctl_dirs(int top_name, int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen, struct proc *p) +{ + size_t savelen; + int error; + + switch (top_name) { + case KERN_POOL: + return (sysctl_dopool(name, namelen, oldp, oldlenp)); +#if NAUDIO > 0 + case KERN_AUDIO: + return (sysctl_audio(name, namelen, oldp, oldlenp, + newp, newlen)); +#endif +#if NVIDEO > 0 + case KERN_VIDEO: + return (sysctl_video(name, namelen, oldp, oldlenp, + newp, newlen)); +#endif + default: + break; + } + + savelen = *oldlenp; + if ((error = sysctl_vslock(oldp, savelen))) + return (error); + error = kern_sysctl_dirs_locked(top_name, name, namelen, + oldp, oldlenp, newp, newlen, p); + sysctl_vsunlock(oldp, savelen); + + return (error); +} + +int +kern_sysctl_dirs_locked(int top_name, int *name, u_int namelen, + void *oldp, size_t *oldlenp, void *newp, size_t newlen, struct proc *p) { switch (top_name) { #ifndef SMALL_KERNEL @@ -416,8 +460,6 @@ kern_sysctl_dirs(int top_name, int *name, u_int namelen, case KERN_TTY: return (sysctl_tty(name, namelen, oldp, oldlenp, newp, newlen)); - case KERN_POOL: - return (sysctl_dopool(name, namelen, oldp, oldlenp)); #if defined(SYSVMSG) || defined(SYSVSEM) || defined(SYSVSHM) case KERN_SYSVIPC_INFO: return (sysctl_sysvipc(name, namelen, oldp, oldlenp)); @@ -455,11 +497,6 @@ kern_sysctl_dirs(int top_name, int *name, u_int namelen, case KERN_WITNESS: return witness_sysctl(name, namelen, oldp, oldlenp, newp, newlen); -#endif -#if NVIDEO > 0 - case KERN_VIDEO: - return (sysctl_video(name, namelen, oldp, oldlenp, - newp, newlen)); #endif case KERN_CPUSTATS: return (sysctl_cpustats(name, namelen, oldp, oldlenp, @@ -483,27 +520,14 @@ kern_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t savelen; /* dispatch the non-terminal nodes first */ - if (namelen != 1) { - switch (name[0]) { -#if NAUDIO > 0 - case KERN_AUDIO: - return (sysctl_audio(name + 1, namelen - 1, - oldp, oldlenp, newp, newlen)); -#endif - default: - break; - } - - savelen = *oldlenp; - if ((error = sysctl_vslock(oldp, savelen))) - return (error); - error = kern_sysctl_dirs(name[0], name + 1, namelen - 1, - oldp, oldlenp, newp, newlen, p); - sysctl_vsunlock(oldp, savelen); - return (error); - } + if (namelen != 1) + return (kern_sysctl_dirs(name[0], name + 1, namelen - 1, + oldp, oldlenp, newp, newlen, p)); switch (name[0]) { + case KERN_ALLOWKMEM: + return (sysctl_securelevel_int(oldp, oldlenp, newp, newlen, + &allowkmem)); case KERN_OSTYPE: return (sysctl_rdstring(oldp, oldlenp, newp, ostype)); case KERN_OSRELEASE: @@ -564,6 +588,8 @@ kern_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, return (ENXIO); return (sysctl_rdint(oldp, oldlenp, newp, mp->msg_bufs)); } + case KERN_TIMEOUT_STATS: + return (timeout_sysctl(oldp, oldlenp, newp, newlen)); case KERN_OSREV: case KERN_MAXPROC: case KERN_MAXFILES: @@ -580,6 +606,7 @@ kern_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, case KERN_NTHREADS: case KERN_SOMAXCONN: case KERN_SOMINCONN: + case KERN_NOSUIDCOREDUMP: case KERN_FSYNC: case KERN_SYSVMSG: case KERN_SYSVSEM: @@ -587,7 +614,9 @@ kern_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, case KERN_FSCALE: case KERN_CCPU: case KERN_NPROCS: + case KERN_WXABORT: case KERN_NETLIVELOCKS: + case KERN_GLOBAL_PTRACE: case KERN_AUTOCONF_SERIAL: return (sysctl_bounded_arr(kern_vars, nitems(kern_vars), name, namelen, oldp, oldlenp, newp, newlen)); @@ -614,9 +643,6 @@ kern_sysctl_locked(int *name, u_int namelen, void *oldp, size_t *oldlenp, switch (name[0]) { case KERN_SECURELVL: return (sysctl_securelevel(oldp, oldlenp, newp, newlen, p)); - case KERN_ALLOWKMEM: - return (sysctl_securelevel_int(oldp, oldlenp, newp, newlen, - &allowkmem)); case KERN_HOSTNAME: error = sysctl_tstring(oldp, oldlenp, newp, newlen, hostname, sizeof(hostname)); @@ -736,8 +762,6 @@ kern_sysctl_locked(int *name, u_int namelen, void *oldp, size_t *oldlenp, case KERN_PFSTATUS: return (pf_sysctl(oldp, oldlenp, newp, newlen)); #endif - case KERN_TIMEOUT_STATS: - return (timeout_sysctl(oldp, oldlenp, newp, newlen)); case KERN_UTC_OFFSET: return (sysctl_utc_offset(oldp, oldlenp, newp, newlen)); default: @@ -1167,7 +1191,7 @@ int sysctl_securelevel_int(void *oldp, size_t *oldlenp, void *newp, size_t newlen, int *valp) { - if (atomic_load_int(&securelevel) > 0) + if ((int)atomic_load_int(&securelevel) > 0) return (sysctl_rdint(oldp, oldlenp, newp, *valp)); return (sysctl_int(oldp, oldlenp, newp, newlen, valp)); } @@ -1683,24 +1707,36 @@ sysctl_file(int *name, u_int namelen, char *where, size_t *sizep, mtx_leave(&tcb6table.inpt_mtx); #endif mtx_enter(&udbtable.inpt_mtx); - TAILQ_FOREACH(inp, &udbtable.inpt_queue, inp_queue) + TAILQ_FOREACH(inp, &udbtable.inpt_queue, inp_queue) { + if (in_pcb_is_iterator(inp)) + continue; FILLSO(inp->inp_socket); + } mtx_leave(&udbtable.inpt_mtx); #ifdef INET6 mtx_enter(&udb6table.inpt_mtx); - TAILQ_FOREACH(inp, &udb6table.inpt_queue, inp_queue) + TAILQ_FOREACH(inp, &udb6table.inpt_queue, inp_queue) { + if (in_pcb_is_iterator(inp)) + continue; FILLSO(inp->inp_socket); + } mtx_leave(&udb6table.inpt_mtx); #endif mtx_enter(&rawcbtable.inpt_mtx); - TAILQ_FOREACH(inp, &rawcbtable.inpt_queue, inp_queue) + TAILQ_FOREACH(inp, &rawcbtable.inpt_queue, inp_queue) { + if (in_pcb_is_iterator(inp)) + continue; FILLSO(inp->inp_socket); + } mtx_leave(&rawcbtable.inpt_mtx); #ifdef INET6 mtx_enter(&rawin6pcbtable.inpt_mtx); TAILQ_FOREACH(inp, &rawin6pcbtable.inpt_queue, - inp_queue) + inp_queue) { + if (in_pcb_is_iterator(inp)) + continue; FILLSO(inp->inp_socket); + } mtx_leave(&rawin6pcbtable.inpt_mtx); #endif NET_UNLOCK(); diff --git a/sys/kern/kern_timeout.c b/sys/kern/kern_timeout.c index 5a8a7e46a..18e1cbb61 100644 --- a/sys/kern/kern_timeout.c +++ b/sys/kern/kern_timeout.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_timeout.c,v 1.99 2024/08/11 00:49:34 dlg Exp $ */ +/* $OpenBSD: kern_timeout.c,v 1.100 2024/11/07 16:02:29 miod Exp $ */ /* * Copyright (c) 2001 Thomas Nordin * Copyright (c) 2000-2001 Artur Grabowski @@ -937,7 +937,7 @@ db_show_timeout(struct timeout *to, struct circq *bucket) char buf[8]; db_expr_t offset; struct circq *wheel; - char *name, *where; + const char *name, *where; int width = sizeof(long) * 2; db_find_sym_and_offset((vaddr_t)to->to_func, &name, &offset); diff --git a/sys/kern/sched_bsd.c b/sys/kern/sched_bsd.c index 4d3daa5b5..31bce5d87 100644 --- a/sys/kern/sched_bsd.c +++ b/sys/kern/sched_bsd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sched_bsd.c,v 1.96 2024/10/09 08:58:19 claudio Exp $ */ +/* $OpenBSD: sched_bsd.c,v 1.98 2024/11/24 13:02:37 claudio Exp $ */ /* $NetBSD: kern_synch.c,v 1.37 1996/04/22 01:38:37 christos Exp $ */ /*- @@ -465,6 +465,11 @@ setrunnable(struct proc *p) panic("setrunnable"); case SSTOP: prio = p->p_usrpri; + /* if not yet asleep, unstop but don't add to runqueue */ + if (ISSET(p->p_flag, P_WSLEEP)) { + p->p_stat = SSLEEP; + return; + } setrunqueue(NULL, p, prio); break; case SSLEEP: @@ -538,7 +543,8 @@ void (*cpu_setperf)(int); #define PERFPOL_AUTO 1 #define PERFPOL_HIGH 2 int perflevel = 100; -int perfpolicy = PERFPOL_AUTO; +int perfpolicy_on_ac = PERFPOL_HIGH; +int perfpolicy_on_battery = PERFPOL_AUTO; #ifndef SMALL_KERNEL /* @@ -550,6 +556,19 @@ void setperf_auto(void *); struct timeout setperf_to = TIMEOUT_INITIALIZER(setperf_auto, NULL); extern int hw_power; +static inline int +perfpolicy_dynamic(void) +{ + return (perfpolicy_on_ac == PERFPOL_AUTO || + perfpolicy_on_battery == PERFPOL_AUTO); +} + +static inline int +current_perfpolicy(void) +{ + return (hw_power) ? perfpolicy_on_ac : perfpolicy_on_battery; +} + void setperf_auto(void *v) { @@ -561,13 +580,13 @@ setperf_auto(void *v) struct cpu_info *ci; uint64_t idle, total, allidle = 0, alltotal = 0; - if (perfpolicy != PERFPOL_AUTO) + if (!perfpolicy_dynamic()) return; if (cpu_setperf == NULL) return; - if (hw_power) { + if (current_perfpolicy() == PERFPOL_HIGH) { speedup = 1; goto faster; } @@ -625,7 +644,7 @@ sysctl_hwsetperf(void *oldp, size_t *oldlenp, void *newp, size_t newlen) if (!cpu_setperf) return EOPNOTSUPP; - if (perfpolicy != PERFPOL_MANUAL) + if (perfpolicy_on_ac != PERFPOL_MANUAL) return sysctl_rdint(oldp, oldlenp, newp, perflevel); err = sysctl_int_bounded(oldp, oldlenp, newp, newlen, @@ -643,12 +662,13 @@ int sysctl_hwperfpolicy(void *oldp, size_t *oldlenp, void *newp, size_t newlen) { char policy[32]; - int err; + char *policy_on_battery; + int err, perfpolicy; if (!cpu_setperf) return EOPNOTSUPP; - switch (perfpolicy) { + switch (current_perfpolicy()) { case PERFPOL_MANUAL: strlcpy(policy, "manual", sizeof(policy)); break; @@ -669,6 +689,13 @@ sysctl_hwperfpolicy(void *oldp, size_t *oldlenp, void *newp, size_t newlen) err = sysctl_string(oldp, oldlenp, newp, newlen, policy, sizeof(policy)); if (err) return err; + + policy_on_battery = strchr(policy, ','); + if (policy_on_battery != NULL) { + *policy_on_battery = '\0'; + policy_on_battery++; + } + if (strcmp(policy, "manual") == 0) perfpolicy = PERFPOL_MANUAL; else if (strcmp(policy, "auto") == 0) @@ -678,12 +705,31 @@ sysctl_hwperfpolicy(void *oldp, size_t *oldlenp, void *newp, size_t newlen) else return EINVAL; - if (perfpolicy == PERFPOL_AUTO) { - timeout_add_msec(&setperf_to, 200); - } else if (perfpolicy == PERFPOL_HIGH) { + if (policy_on_battery == NULL) + perfpolicy_on_battery = perfpolicy_on_ac = perfpolicy; + else { + if (strcmp(policy_on_battery, "manual") == 0 || + perfpolicy == PERFPOL_MANUAL) { + /* Not handled */ + return EINVAL; + } + if (strcmp(policy_on_battery, "auto") == 0) + perfpolicy_on_battery = PERFPOL_AUTO; + else if (strcmp(policy_on_battery, "high") == 0) + perfpolicy_on_battery = PERFPOL_HIGH; + else + return EINVAL; + perfpolicy_on_ac = perfpolicy; + } + + if (current_perfpolicy() == PERFPOL_HIGH) { perflevel = 100; cpu_setperf(perflevel); } + + if (perfpolicy_dynamic()) + timeout_add_msec(&setperf_to, 200); + return 0; } #endif @@ -698,7 +744,7 @@ scheduler_start(void) update_loadavg(NULL); #ifndef SMALL_KERNEL - if (perfpolicy == PERFPOL_AUTO) + if (perfpolicy_dynamic()) timeout_add_msec(&setperf_to, 200); #endif } diff --git a/sys/kern/subr_disk.c b/sys/kern/subr_disk.c index bf169beff..6eb96f245 100644 --- a/sys/kern/subr_disk.c +++ b/sys/kern/subr_disk.c @@ -1,4 +1,4 @@ -/* $OpenBSD: subr_disk.c,v 1.272 2023/11/15 20:23:19 kn Exp $ */ +/* $OpenBSD: subr_disk.c,v 1.273 2024/10/30 06:16:27 jsg Exp $ */ /* $NetBSD: subr_disk.c,v 1.17 1996/03/16 23:17:08 christos Exp $ */ /* @@ -1423,7 +1423,7 @@ void setroot(struct device *bootdv, int part, int exitflags) { int majdev, unit, len, s, slept = 0; - struct swdevt *swp; + dev_t *swp; struct device *dv; dev_t nrootdev, nswapdev = NODEV, temp = NODEV; struct ifnet *ifp = NULL; @@ -1564,8 +1564,8 @@ setroot(struct device *bootdv, int part, int exitflags) gotswap: rootdev = nrootdev; dumpdev = nswapdev; - swdevt[0].sw_dev = nswapdev; - swdevt[1].sw_dev = NODEV; + swdevt[0] = nswapdev; + swdevt[1] = NODEV; #if defined(NFSCLIENT) } else if (mountroot == nfs_mountroot) { rootdv = bootdv; @@ -1605,8 +1605,8 @@ gotswap: nswapdev = NODEV; } dumpdev = nswapdev; - swdevt[0].sw_dev = nswapdev; - /* swdevt[1].sw_dev = NODEV; */ + swdevt[0] = nswapdev; + /* swdevt[1] = NODEV; */ } else { /* Completely pre-configured, but we want rootdv .. */ majdev = major(rootdev); @@ -1653,27 +1653,27 @@ gotswap: /* * Make the swap partition on the root drive the primary swap. */ - for (swp = swdevt; swp->sw_dev != NODEV; swp++) { - if (major(rootdev) == major(swp->sw_dev) && - DISKUNIT(rootdev) == DISKUNIT(swp->sw_dev)) { - temp = swdevt[0].sw_dev; - swdevt[0].sw_dev = swp->sw_dev; - swp->sw_dev = temp; + for (swp = swdevt; *swp != NODEV; swp++) { + if (major(rootdev) == major(*swp) && + DISKUNIT(rootdev) == DISKUNIT(*swp)) { + temp = swdevt[0]; + swdevt[0] = *swp; + *swp = temp; break; } } - if (swp->sw_dev != NODEV) { + if (*swp != NODEV) { /* * If dumpdev was the same as the old primary swap device, * move it to the new primary swap device. */ if (temp == dumpdev) - dumpdev = swdevt[0].sw_dev; + dumpdev = swdevt[0]; } - if (swdevt[0].sw_dev != NODEV) - printf(" swap on %s%d%c", findblkname(major(swdevt[0].sw_dev)), - DISKUNIT(swdevt[0].sw_dev), - 'a' + DISKPART(swdevt[0].sw_dev)); + if (swdevt[0] != NODEV) + printf(" swap on %s%d%c", findblkname(major(swdevt[0])), + DISKUNIT(swdevt[0]), + 'a' + DISKPART(swdevt[0])); if (dumpdev != NODEV) printf(" dump on %s%d%c", findblkname(major(dumpdev)), DISKUNIT(dumpdev), 'a' + DISKPART(dumpdev)); diff --git a/sys/kern/subr_hibernate.c b/sys/kern/subr_hibernate.c index 464bc48ba..a05b965a6 100644 --- a/sys/kern/subr_hibernate.c +++ b/sys/kern/subr_hibernate.c @@ -1,4 +1,4 @@ -/* $OpenBSD: subr_hibernate.c,v 1.142 2024/08/18 08:01:03 mpi Exp $ */ +/* $OpenBSD: subr_hibernate.c,v 1.149 2025/01/06 21:37:16 krw Exp $ */ /* * Copyright (c) 2011 Ariane van der Steldt @@ -132,6 +132,57 @@ struct hiballoc_entry { RBT_ENTRY(hiballoc_entry) hibe_entry; }; +#define IO_TYPE_IMG 1 +#define IO_TYPE_CHK 2 +#define IO_TYPE_SIG 3 + +int +hibernate_write(union hibernate_info *hib, daddr_t offset, vaddr_t addr, + size_t size, int io_type) +{ + const uint64_t blks = btodb(size); + + if (hib == NULL || offset < 0 || blks == 0) { + printf("%s: hib is NULL, offset < 0 or blks == 0\n", __func__); + return (EINVAL); + } + + switch (io_type) { + case IO_TYPE_IMG: + if (offset + blks > hib->image_size) { + printf("%s: image write is out of bounds: " + "offset-image=%lld, offset-write=%lld, blks=%llu\n", + __func__, hib->image_offset, offset, blks); + return (EIO); + } + offset += hib->image_offset; + break; + case IO_TYPE_CHK: + if (offset + blks > btodb(HIBERNATE_CHUNK_TABLE_SIZE)) { + printf("%s: chunktable write is out of bounds: " + "offset-chunk=%lld, offset-write=%lld, blks=%llu\n", + __func__, hib->chunktable_offset, offset, blks); + return (EIO); + } + offset += hib->chunktable_offset; + break; + case IO_TYPE_SIG: + if (offset != hib->sig_offset || size != hib->sec_size) { + printf("%s: signature write is out of bounds: " + "offset-sig=%lld, offset-write=%lld, blks=%llu\n", + __func__, hib->sig_offset, offset, blks); + return (EIO); + } + break; + default: + printf("%s: unsupported io type %d\n", __func__, io_type); + return (EINVAL); + } + + return (hib->io_func(hib->dev, offset, addr, size, HIB_W, + hib->io_page)); +} + /* * Sort hibernate memory ranges by ascending PA */ @@ -573,12 +624,12 @@ get_hibernate_info(union hibernate_info *hib, int suspend) #endif /* ! NO_PROPOLICE */ /* Determine I/O function to use */ - hib->io_func = get_hibernate_io_function(swdevt[0].sw_dev); + hib->io_func = get_hibernate_io_function(swdevt[0]); if (hib->io_func == NULL) return (1); /* Calculate hibernate device */ - hib->dev = swdevt[0].sw_dev; + hib->dev = swdevt[0]; /* Read disklabel (used to calculate signature and image offsets) */ dl_ret = disk_readlabel(&dl, hib->dev, err_string, sizeof(err_string)); @@ -884,9 +935,8 @@ hibernate_write_signature(union hibernate_info *hib) memcpy(&disk_hib, hib, DEV_BSIZE); /* Write hibernate info to disk */ - return (hib->io_func(hib->dev, hib->sig_offset, - (vaddr_t)&disk_hib, hib->sec_size, HIB_W, - hib->io_page)); + return (hibernate_write(hib, hib->sig_offset, + (vaddr_t)&disk_hib, hib->sec_size, IO_TYPE_SIG)); } /* @@ -908,10 +958,9 @@ hibernate_write_chunktable(union hibernate_info *hib) /* Write chunk table */ for (i = 0; i < hibernate_chunk_table_size; i += MAXPHYS) { - if ((err = hib->io_func(hib->dev, - hib->chunktable_offset + (i/DEV_BSIZE), + if ((err = hibernate_write(hib, btodb(i), (vaddr_t)(hibernate_chunk_table_start + i), - MAXPHYS, HIB_W, hib->io_page))) { + MAXPHYS, IO_TYPE_CHK))) { DPRINTF("chunktable write error: %d\n", err); return (err); } @@ -1392,14 +1441,13 @@ hibernate_write_rle(union hibernate_info *hib, paddr_t inaddr, /* Did we fill the output page? If so, flush to disk */ if (*out_remaining == 0) { - if ((err = hib->io_func(hib->dev, *blkctr + hib->image_offset, - (vaddr_t)hibernate_io_page, PAGE_SIZE, HIB_W, - hib->io_page))) { + if ((err = hibernate_write(hib, *blkctr, + (vaddr_t)hibernate_io_page, PAGE_SIZE, IO_TYPE_IMG))) { DPRINTF("hib write error %d\n", err); - return (err); + return -1; } - *blkctr += PAGE_SIZE / DEV_BSIZE; + *blkctr += btodb(PAGE_SIZE); *out_remaining = PAGE_SIZE; /* If we didn't deflate the entire RLE byte, finish it now */ @@ -1493,7 +1541,7 @@ hibernate_write_chunks(union hibernate_info *hib) range_base = chunks[i].base; range_end = chunks[i].end; - chunks[i].offset = blkctr + hib->image_offset; + chunks[i].offset = blkctr; /* Reset zlib for deflate */ if (hibernate_zlib_reset(hib, 1) != Z_OK) { @@ -1521,6 +1569,7 @@ hibernate_write_chunks(union hibernate_info *hib) /* Deflate from temp_inaddr to IO page */ if (inaddr != range_end) { + rle = 0; if (inaddr % PAGE_SIZE == 0) { rle = hibernate_write_rle(hib, inaddr, @@ -1529,7 +1578,10 @@ hibernate_write_chunks(union hibernate_info *hib) &out_remaining); } - if (rle == 0) { + switch (rle) { + case -1: + return EIO; + case 0: pmap_kenter_pa(hibernate_temp_page, inaddr & PMAP_PA_MASK, PROT_READ); @@ -1540,25 +1592,26 @@ hibernate_write_chunks(union hibernate_info *hib) inaddr += hibernate_deflate(hib, temp_inaddr, &out_remaining); - } else { + break; + default: inaddr += rle * PAGE_SIZE; if (inaddr > range_end) inaddr = range_end; + break; } } if (out_remaining == 0) { /* Filled up the page */ - if ((err = hib->io_func(hib->dev, - blkctr + hib->image_offset, + if ((err = hibernate_write(hib, blkctr, (vaddr_t)hibernate_io_page, - PAGE_SIZE, HIB_W, hib->io_page))) { + PAGE_SIZE, IO_TYPE_IMG))) { DPRINTF("hib write error %d\n", err); return (err); } - blkctr += PAGE_SIZE / DEV_BSIZE; + blkctr += btodb(PAGE_SIZE); } } } @@ -1598,20 +1651,17 @@ hibernate_write_chunks(union hibernate_info *hib) used = ROUNDUP(2 * PAGE_SIZE - out_remaining, hib->sec_size); /* Write final block(s) for this chunk */ - if ((err = hib->io_func(hib->dev, blkctr + hib->image_offset, - (vaddr_t)hibernate_io_page, used, - HIB_W, hib->io_page))) { + if ((err = hibernate_write(hib, blkctr, + (vaddr_t)hibernate_io_page, used, IO_TYPE_IMG))) { DPRINTF("hib final write error %d\n", err); return (err); } - blkctr += used / DEV_BSIZE; + blkctr += btodb(used); - chunks[i].compressed_size = (blkctr + hib->image_offset - - chunks[i].offset) * DEV_BSIZE; + chunks[i].compressed_size = dbtob(blkctr - chunks[i].offset); } - hib->chunktable_offset = hib->image_offset + blkctr; return (0); } @@ -1651,8 +1701,9 @@ hibernate_zlib_reset(union hibernate_info *hib, int deflate) hibernate_state->hib_stream.zfree = (free_func)hibernate_zlib_free; /* Initialize the hiballoc arena for zlib allocs/frees */ - hiballoc_init(&hibernate_state->hiballoc_arena, - (caddr_t)hibernate_zlib_start, hibernate_zlib_size); + if (hiballoc_init(&hibernate_state->hiballoc_arena, + (caddr_t)hibernate_zlib_start, hibernate_zlib_size)) + return 1; if (deflate) { return deflateInit(&hibernate_state->hib_stream, @@ -1688,7 +1739,7 @@ hibernate_read_image(union hibernate_info *hib) pmap_activate(curproc); /* Calculate total chunk table size in disk blocks */ - chunktable_size = HIBERNATE_CHUNK_TABLE_SIZE / DEV_BSIZE; + chunktable_size = btodb(HIBERNATE_CHUNK_TABLE_SIZE); blkctr = hib->chunktable_offset; @@ -1706,9 +1757,13 @@ hibernate_read_image(union hibernate_info *hib) /* Read the chunktable from disk into the piglet chunktable */ for (i = 0; i < HIBERNATE_CHUNK_TABLE_SIZE; - i += MAXPHYS, blkctr += MAXPHYS/DEV_BSIZE) - hibernate_block_io(hib, blkctr, MAXPHYS, - chunktable + i, 0); + i += MAXPHYS, blkctr += btodb(MAXPHYS)) { + if (hibernate_block_io(hib, blkctr, MAXPHYS, + chunktable + i, 0)) { + status = 1; + goto unmap; + } + } blkctr = hib->image_offset; compressed_size = 0; @@ -1721,8 +1776,7 @@ hibernate_read_image(union hibernate_info *hib) disk_size = compressed_size; printf("unhibernating @ block %lld length %luMB\n", - hib->sig_offset - chunktable_size, - compressed_size / (1024 * 1024)); + hib->image_offset, compressed_size / (1024 * 1024)); /* Allocate the pig area */ pig_sz = compressed_size + HIBERNATE_CHUNK_SIZE; @@ -1737,8 +1791,11 @@ hibernate_read_image(union hibernate_info *hib) image_end = pig_end & ~(HIBERNATE_CHUNK_SIZE - 1); image_start = image_end - disk_size; - hibernate_read_chunks(hib, image_start, image_end, disk_size, - chunks); + if (hibernate_read_chunks(hib, image_start, image_end, disk_size, + chunks)) { + status = 1; + goto unmap; + } /* Prepare the resume time pmap/page table */ hibernate_populate_resume_pt(hib, image_start, image_end); @@ -1765,7 +1822,7 @@ hibernate_read_chunks(union hibernate_info *hib, paddr_t pig_start, paddr_t img_cur, piglet_base; daddr_t blkctr; size_t processed, compressed_size, read_size; - int nchunks, nfchunks, num_io_pages; + int err, nchunks, nfchunks, num_io_pages; vaddr_t tempva, hibernate_fchunk_area; short *fchunks, i, j; @@ -1830,12 +1887,12 @@ hibernate_read_chunks(union hibernate_info *hib, paddr_t pig_start, img_cur = pig_start; - for (i = 0; i < nfchunks; i++) { - blkctr = chunks[fchunks[i]].offset; + for (i = 0, err = 0; i < nfchunks && err == 0; i++) { + blkctr = chunks[fchunks[i]].offset + hib->image_offset; processed = 0; compressed_size = chunks[fchunks[i]].compressed_size; - while (processed < compressed_size) { + while (processed < compressed_size && err == 0) { if (compressed_size - processed >= MAXPHYS) read_size = MAXPHYS; else @@ -1861,10 +1918,10 @@ hibernate_read_chunks(union hibernate_info *hib, paddr_t pig_start, pmap_update(pmap_kernel()); - hibernate_block_io(hib, blkctr, read_size, + err = hibernate_block_io(hib, blkctr, read_size, tempva + (img_cur & PAGE_MASK), 0); - blkctr += (read_size / DEV_BSIZE); + blkctr += btodb(read_size); pmap_kremove(tempva, num_io_pages * PAGE_SIZE); pmap_update(pmap_kernel()); @@ -1877,7 +1934,7 @@ hibernate_read_chunks(union hibernate_info *hib, paddr_t pig_start, pmap_kremove(hibernate_fchunk_area, 24 * PAGE_SIZE); pmap_update(pmap_kernel()); - return (0); + return (i != nfchunks); } /* @@ -1915,7 +1972,7 @@ hibernate_suspend(void) return (1); } - if (end - start < 1000) { + if (end - start + 1 < 1000) { printf("hibernate: insufficient swap (%lu is too small)\n", end - start + 1); return (1); @@ -1928,9 +1985,13 @@ hibernate_suspend(void) /* Calculate block offsets in swap */ hib->image_offset = ctod(start); + hib->image_size = ctod(end - start + 1) - + btodb(HIBERNATE_CHUNK_TABLE_SIZE); + hib->chunktable_offset = hib->image_offset + hib->image_size; - DPRINTF("hibernate @ block %lld max-length %lu blocks\n", - hib->image_offset, ctod(end) - ctod(start) + 1); + DPRINTF("hibernate @ block %lld chunks-length %lu blocks, " + "chunktable-length %d blocks\n", hib->image_offset, hib->image_size, + btodb(HIBERNATE_CHUNK_TABLE_SIZE)); pmap_activate(curproc); DPRINTF("hibernate: writing chunks\n"); diff --git a/sys/kern/subr_log.c b/sys/kern/subr_log.c index e64b85d27..decf2f947 100644 --- a/sys/kern/subr_log.c +++ b/sys/kern/subr_log.c @@ -1,4 +1,4 @@ -/* $OpenBSD: subr_log.c,v 1.79 2024/07/24 13:37:05 claudio Exp $ */ +/* $OpenBSD: subr_log.c,v 1.80 2024/12/30 02:46:00 guenther Exp $ */ /* $NetBSD: subr_log.c,v 1.11 1996/03/30 22:24:44 christos Exp $ */ /* @@ -436,9 +436,6 @@ logioctl(dev_t dev, u_long com, caddr_t data, int flag, struct proc *p) mtx_leave(&log_mtx); break; - case FIONBIO: - break; - case FIOASYNC: mtx_enter(&log_mtx); if (*(int *)data) diff --git a/sys/kern/subr_pool.c b/sys/kern/subr_pool.c index 587eff136..381d59667 100644 --- a/sys/kern/subr_pool.c +++ b/sys/kern/subr_pool.c @@ -1,4 +1,4 @@ -/* $OpenBSD: subr_pool.c,v 1.236 2022/08/14 01:58:28 jsg Exp $ */ +/* $OpenBSD: subr_pool.c,v 1.237 2025/01/04 09:26:01 mvs Exp $ */ /* $NetBSD: subr_pool.c,v 1.61 2001/09/26 07:14:56 chs Exp $ */ /*- @@ -400,6 +400,7 @@ pool_init(struct pool *pp, size_t size, u_int align, int ipl, int flags, * Initialize the pool structure. */ memset(pp, 0, sizeof(*pp)); + refcnt_init(&pp->pr_refcnt); if (ISSET(flags, PR_RWLOCK)) { KASSERT(flags & PR_WAITOK); pp->pr_lock_ops = &pool_lock_ops_rw; @@ -492,11 +493,6 @@ pool_destroy(struct pool *pp) struct pool_page_header *ph; struct pool *prev, *iter; -#ifdef MULTIPROCESSOR - if (pp->pr_cache != NULL) - pool_cache_destroy(pp); -#endif - #ifdef DIAGNOSTIC if (pp->pr_nout != 0) panic("%s: pool busy: still out: %u", __func__, pp->pr_nout); @@ -520,6 +516,14 @@ pool_destroy(struct pool *pp) } rw_exit_write(&pool_lock); + /* Wait for concurrent sysctl_dopool() */ + refcnt_finalize(&pp->pr_refcnt, "pooldtor"); + +#ifdef MULTIPROCESSOR + if (pp->pr_cache != NULL) + pool_cache_destroy(pp); +#endif + /* Remove all pages */ while ((ph = TAILQ_FIRST(&pp->pr_emptypages)) != NULL) { pl_enter(pp, &pp->pr_lock); @@ -1467,7 +1471,7 @@ sysctl_dopool(int *name, u_int namelen, char *oldp, size_t *oldlenp) { struct kinfo_pool pi; struct pool *pp; - int rv = ENOENT; + int rv = EOPNOTSUPP; switch (name[0]) { case KERN_POOL_NPOOLS: @@ -1488,14 +1492,16 @@ sysctl_dopool(int *name, u_int namelen, char *oldp, size_t *oldlenp) return (ENOTDIR); rw_enter_read(&pool_lock); - SIMPLEQ_FOREACH(pp, &pool_head, pr_poollist) { - if (name[1] == pp->pr_serial) + if (name[1] == pp->pr_serial) { + refcnt_take(&pp->pr_refcnt); break; + } } + rw_exit_read(&pool_lock); if (pp == NULL) - goto done; + return (ENOENT); switch (name[0]) { case KERN_POOL_NAME: @@ -1537,8 +1543,7 @@ sysctl_dopool(int *name, u_int namelen, char *oldp, size_t *oldlenp) break; } -done: - rw_exit_read(&pool_lock); + refcnt_rele_wake(&pp->pr_refcnt); return (rv); } diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index 935962c3e..00d8e6337 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sys_generic.c,v 1.158 2024/08/12 19:32:05 anton Exp $ */ +/* $OpenBSD: sys_generic.c,v 1.160 2024/12/30 02:46:00 guenther Exp $ */ /* $NetBSD: sys_generic.c,v 1.24 1996/03/29 00:25:32 cgd Exp $ */ /* @@ -382,11 +382,8 @@ dofilewritev(struct proc *p, int fd, struct uio *uio, int flags, if (uio->uio_resid != cnt && (error == ERESTART || error == EINTR || error == EWOULDBLOCK)) error = 0; - if (error == EPIPE) { - KERNEL_LOCK(); + if (error == EPIPE) ptsignal(p, SIGPIPE, STHREAD); - KERNEL_UNLOCK(); - } } cnt -= uio->uio_resid; @@ -494,7 +491,7 @@ sys_ioctl(struct proc *p, void *v, register_t *retval) atomic_setbits_int(&fp->f_flag, FNONBLOCK); else atomic_clearbits_int(&fp->f_flag, FNONBLOCK); - error = (*fp->f_ops->fo_ioctl)(fp, FIONBIO, (caddr_t)&tmp, p); + error = 0; break; case FIOASYNC: diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c index 0c5b5406b..08e18de02 100644 --- a/sys/kern/sys_pipe.c +++ b/sys/kern/sys_pipe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sys_pipe.c,v 1.146 2023/05/09 14:22:17 visa Exp $ */ +/* $OpenBSD: sys_pipe.c,v 1.148 2024/12/30 02:46:00 guenther Exp $ */ /* * Copyright (c) 1996 John S. Dyson @@ -253,9 +253,7 @@ pipe_buffer_realloc(struct pipe *cpipe, u_int size) /* buffer should be empty */ KASSERT(cpipe->pipe_buffer.cnt == 0); - KERNEL_LOCK(); buffer = km_alloc(size, &kv_any, &kp_pageable, &kd_waitok); - KERNEL_UNLOCK(); if (buffer == NULL) return (ENOMEM); @@ -676,9 +674,6 @@ pipe_ioctl(struct file *fp, u_long cmd, caddr_t data, struct proc *p) switch (cmd) { - case FIONBIO: - break; - case FIOASYNC: rw_enter_write(mpipe->pipe_lock); if (*(int *)data) { @@ -767,9 +762,7 @@ pipe_buffer_free(struct pipe *cpipe) size = cpipe->pipe_buffer.size; - KERNEL_LOCK(); km_free(cpipe->pipe_buffer.buffer, size, &kv_any, &kp_pageable); - KERNEL_UNLOCK(); cpipe->pipe_buffer.buffer = NULL; diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index 6ab263c7e..d06b8f9e1 100644 --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sys_process.c,v 1.102 2024/10/08 12:02:24 claudio Exp $ */ +/* $OpenBSD: sys_process.c,v 1.105 2024/12/15 18:25:12 mvs Exp $ */ /* $NetBSD: sys_process.c,v 1.55 1996/05/15 06:17:47 tls Exp $ */ /*- @@ -70,6 +70,11 @@ #ifdef PTRACE +/* + * Locks used to protect data: + * a atomic + */ + static inline int process_checktracestate(struct process *_curpr, struct process *_tr, struct proc *_t); static inline struct process *process_tprfind(pid_t _tpid, struct proc **_tp); @@ -78,7 +83,7 @@ int ptrace_ctrl(struct proc *, int, pid_t, caddr_t, int); int ptrace_ustate(struct proc *, int, pid_t, void *, int, register_t *); int ptrace_kstate(struct proc *, int, pid_t, void *); -int global_ptrace; /* permit tracing of not children */ +int global_ptrace; /* [a] permit tracing of not children */ /* @@ -206,6 +211,24 @@ sys_ptrace(struct proc *p, void *v, register_t *retval) mode = OUT; size = sizeof u.u_pacmask; break; +#endif +#ifdef PT_GETXSTATE_INFO + case PT_GETXSTATE_INFO: + mode = OUT_ALLOC; + size = sizeof(struct ptrace_xstate_info); + break; +#endif +#ifdef PT_GETXSTATE + case PT_GETXSTATE: + mode = OUT_ALLOC; + size = fpu_save_len; + break; +#endif +#ifdef PT_SETXSTATE + case PT_SETXSTATE: + mode = IN_ALLOC; + size = fpu_save_len; + break; #endif default: return EINVAL; @@ -393,8 +416,8 @@ ptrace_ctrl(struct proc *p, int req, pid_t pid, caddr_t addr, int data) /* * (5.5) it's not a child of the tracing process. */ - if (global_ptrace == 0 && !inferior(tr, p->p_p) && - (error = suser(p)) != 0) + if (atomic_load_int(&global_ptrace) == 0 && + !inferior(tr, p->p_p) && (error = suser(p)) != 0) goto fail; /* @@ -759,6 +782,18 @@ ptrace_ustate(struct proc *p, int req, pid_t pid, void *addr, int data, ((register_t *)addr)[0] = process_get_pacmask(t); ((register_t *)addr)[1] = process_get_pacmask(t); return 0; +#endif +#ifdef PT_GETXSTATE_INFO + case PT_GETXSTATE_INFO: + return process_read_xstate_info(t, addr); +#endif +#ifdef PT_GETXSTATE + case PT_GETXSTATE: + return process_read_xstate(t, addr); +#endif +#ifdef PT_SETXSTATE + case PT_SETXSTATE: + return process_write_xstate(t, addr); #endif default: KASSERTMSG(0, "%s: unhandled request %d", __func__, req); diff --git a/sys/kern/sys_socket.c b/sys/kern/sys_socket.c index e0a34c6fe..9a0731b8e 100644 --- a/sys/kern/sys_socket.c +++ b/sys/kern/sys_socket.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sys_socket.c,v 1.65 2024/04/30 17:59:15 mvs Exp $ */ +/* $OpenBSD: sys_socket.c,v 1.67 2024/12/30 02:46:00 guenther Exp $ */ /* $NetBSD: sys_socket.c,v 1.13 1995/08/12 23:59:09 mycroft Exp $ */ /* @@ -86,9 +86,6 @@ soo_ioctl(struct file *fp, u_long cmd, caddr_t data, struct proc *p) switch (cmd) { - case FIONBIO: - break; - case FIOASYNC: solock(so); mtx_enter(&so->so_rcv.sb_mtx); @@ -153,8 +150,10 @@ soo_stat(struct file *fp, struct stat *ub, struct proc *p) so->so_rcv.sb_cc != 0) ub->st_mode |= S_IRUSR | S_IRGRP | S_IROTH; mtx_leave(&so->so_rcv.sb_mtx); + mtx_enter(&so->so_snd.sb_mtx); if ((so->so_snd.sb_state & SS_CANTSENDMORE) == 0) ub->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH; + mtx_leave(&so->so_snd.sb_mtx); ub->st_uid = so->so_euid; ub->st_gid = so->so_egid; (void)pru_sense(so, ub); diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c index 7d89cdcce..0319f9b53 100644 --- a/sys/kern/syscalls.c +++ b/sys/kern/syscalls.c @@ -1,10 +1,10 @@ -/* $OpenBSD: syscalls.c,v 1.280 2024/08/02 14:35:56 mvs Exp $ */ +/* $OpenBSD: syscalls.c,v 1.281 2025/01/06 08:57:49 mpi Exp $ */ /* * System call names. * * DO NOT EDIT-- this file is automatically generated. - * created from; OpenBSD: syscalls.master,v 1.265 2024/08/02 14:34:45 mvs Exp + * created from; OpenBSD: syscalls.master,v 1.266 2025/01/06 08:57:23 mpi Exp */ const char *const syscallnames[] = { diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master index 593b8b57e..7b1464f94 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -1,4 +1,4 @@ -; $OpenBSD: syscalls.master,v 1.265 2024/08/02 14:34:45 mvs Exp $ +; $OpenBSD: syscalls.master,v 1.266 2025/01/06 08:57:23 mpi Exp $ ; $NetBSD: syscalls.master,v 1.32 1996/04/23 10:24:21 mycroft Exp $ ; @(#)syscalls.master 8.2 (Berkeley) 1/13/94 @@ -133,7 +133,7 @@ 51 UNIMPL acct #endif 52 STD { int sys_sigpending(void); } -53 STD { int sys_fstat(int fd, struct stat *sb); } +53 STD NOLOCK { int sys_fstat(int fd, struct stat *sb); } 54 STD NOLOCK { int sys_ioctl(int fd, \ u_long com, ... void *data); } 55 STD { int sys_reboot(int opt); } diff --git a/sys/kern/sysv_shm.c b/sys/kern/sysv_shm.c index e090fa3b3..881a6df4e 100644 --- a/sys/kern/sysv_shm.c +++ b/sys/kern/sysv_shm.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sysv_shm.c,v 1.80 2022/08/14 01:58:28 jsg Exp $ */ +/* $OpenBSD: sysv_shm.c,v 1.81 2024/11/05 15:34:30 mpi Exp $ */ /* $NetBSD: sysv_shm.c,v 1.50 1998/10/21 22:24:29 tron Exp $ */ /* @@ -158,23 +158,25 @@ int shm_delete_mapping(struct vmspace *vm, struct shmmap_state *shmmap_s) { struct shmid_ds *shmseg; - int segnum; + int segnum, deallocate = 0; vaddr_t end; segnum = IPCID_TO_IX(shmmap_s->shmid); if (segnum < 0 || segnum >= shminfo.shmmni || (shmseg = shmsegs[segnum]) == NULL) return (EINVAL); + if ((--shmseg->shm_nattch <= 0) && + (shmseg->shm_perm.mode & SHMSEG_REMOVED)) { + deallocate = 1; + shm_last_free = segnum; + shmsegs[shm_last_free] = NULL; + } end = round_page(shmmap_s->va+shmseg->shm_segsz); uvm_unmap(&vm->vm_map, trunc_page(shmmap_s->va), end); shmmap_s->shmid = -1; shmseg->shm_dtime = gettime(); - if ((--shmseg->shm_nattch <= 0) && - (shmseg->shm_perm.mode & SHMSEG_REMOVED)) { + if (deallocate) shm_deallocate_segment(shmseg); - shm_last_free = segnum; - shmsegs[shm_last_free] = NULL; - } return (0); } diff --git a/sys/kern/tty.c b/sys/kern/tty.c index 14586e44c..3140928a9 100644 --- a/sys/kern/tty.c +++ b/sys/kern/tty.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tty.c,v 1.177 2024/07/08 13:17:12 claudio Exp $ */ +/* $OpenBSD: tty.c,v 1.178 2024/12/30 02:46:00 guenther Exp $ */ /* $NetBSD: tty.c,v 1.68.4.2 1996/06/06 16:04:52 thorpej Exp $ */ /*- @@ -764,8 +764,6 @@ ttioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p) CLR(tp->t_state, TS_ASYNC); splx(s); break; - case FIONBIO: /* set/clear non-blocking i/o */ - break; /* XXX: delete. */ case FIONREAD: /* get # bytes to read */ s = spltty(); *(int *)data = ttnread(tp); diff --git a/sys/kern/tty_pty.c b/sys/kern/tty_pty.c index 2d51d9caf..956607011 100644 --- a/sys/kern/tty_pty.c +++ b/sys/kern/tty_pty.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tty_pty.c,v 1.114 2022/09/02 07:37:57 deraadt Exp $ */ +/* $OpenBSD: tty_pty.c,v 1.115 2024/11/05 06:03:19 jsg Exp $ */ /* $NetBSD: tty_pty.c,v 1.33.4.1 1996/06/02 09:08:11 mrg Exp $ */ /* @@ -1025,7 +1025,7 @@ ptm_vn_open(struct nameidata *ndp) error = VOP_OPEN(vp, FREAD|FWRITE, cred, p); if (!error) { /* update atime/mtime */ - VATTR_NULL(&vattr); + vattr_null(&vattr); getnanotime(&vattr.va_atime); vattr.va_mtime = vattr.va_atime; vattr.va_vaflags |= VA_UTIMES_NULL; @@ -1147,7 +1147,7 @@ retry: /* get real uid */ uid = p->p_ucred->cr_ruid; - VATTR_NULL(&vattr); + vattr_null(&vattr); vattr.va_uid = uid; vattr.va_gid = gid; vattr.va_mode = (S_IRUSR|S_IWUSR|S_IWGRP) & ALLPERMS; diff --git a/sys/kern/uipc_domain.c b/sys/kern/uipc_domain.c index 4e7a54d23..251a1939c 100644 --- a/sys/kern/uipc_domain.c +++ b/sys/kern/uipc_domain.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uipc_domain.c,v 1.68 2024/08/16 09:20:34 mvs Exp $ */ +/* $OpenBSD: uipc_domain.c,v 1.69 2024/12/15 11:00:05 dlg Exp $ */ /* $NetBSD: uipc_domain.c,v 1.14 1996/02/09 19:00:44 christos Exp $ */ /* @@ -41,9 +41,14 @@ #include #include +#include "af_frame.h" #include "bpfilter.h" #include "pflow.h" +#if NAF_FRAME > 0 +extern const struct domain framedomain; +#endif + const struct domain *const domains[] = { #ifdef MPLS &mplsdomain, @@ -57,6 +62,9 @@ const struct domain *const domains[] = { &inetdomain, &unixdomain, &routedomain, +#if NAF_FRAME > 0 + &framedomain, +#endif NULL }; diff --git a/sys/kern/uipc_mbuf.c b/sys/kern/uipc_mbuf.c index 34ce93906..b962a4047 100644 --- a/sys/kern/uipc_mbuf.c +++ b/sys/kern/uipc_mbuf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uipc_mbuf.c,v 1.294 2024/09/10 14:52:42 bluhm Exp $ */ +/* $OpenBSD: uipc_mbuf.c,v 1.296 2025/01/01 13:44:22 bluhm Exp $ */ /* $NetBSD: uipc_mbuf.c,v 1.15.4.1 1996/06/13 17:11:44 cgd Exp $ */ /* @@ -129,8 +129,8 @@ struct mutex m_extref_mtx = MUTEX_INITIALIZER(IPL_NET); void m_extfree(struct mbuf *); void m_zero(struct mbuf *); -unsigned long mbuf_mem_limit; /* how much memory can be allocated */ -unsigned long mbuf_mem_alloc; /* how much memory has been allocated */ +unsigned long mbuf_mem_limit; /* [a] how much memory can be allocated */ +unsigned long mbuf_mem_alloc; /* [a] how much memory has been allocated */ void *m_pool_alloc(struct pool *, int, int *); void m_pool_free(struct pool *, void *); @@ -219,7 +219,7 @@ nmbclust_update(long newval) return ERANGE; /* update the global mbuf memory limit */ nmbclust = newval; - mbuf_mem_limit = nmbclust * MCLBYTES; + atomic_store_long(&mbuf_mem_limit, nmbclust * MCLBYTES); pool_wakeup(&mbpool); for (i = 0; i < nitems(mclsizes); i++) @@ -1458,7 +1458,8 @@ m_pool_alloc(struct pool *pp, int flags, int *slowdown) { void *v; - if (atomic_add_long_nv(&mbuf_mem_alloc, pp->pr_pgsize) > mbuf_mem_limit) + if (atomic_add_long_nv(&mbuf_mem_alloc, pp->pr_pgsize) > + atomic_load_long(&mbuf_mem_limit)) goto fail; v = (*pool_allocator_multi.pa_alloc)(pp, flags, slowdown); @@ -1488,7 +1489,8 @@ m_pool_init(struct pool *pp, u_int size, u_int align, const char *wmesg) u_int m_pool_used(void) { - return ((mbuf_mem_alloc * 100) / mbuf_mem_limit); + return ((atomic_load_long(&mbuf_mem_alloc) * 100) / + atomic_load_long(&mbuf_mem_limit)); } #ifdef DDB diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index ce7c8e5a7..8ce0decd8 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uipc_socket.c,v 1.343 2024/08/11 00:19:00 jsg Exp $ */ +/* $OpenBSD: uipc_socket.c,v 1.357 2025/01/07 23:13:46 mvs Exp $ */ /* $NetBSD: uipc_socket.c,v 1.21 1996/02/04 02:17:52 christos Exp $ */ /* @@ -62,8 +62,6 @@ int sosplice(struct socket *, int, off_t, struct timeval *); void sounsplice(struct socket *, struct socket *, int); void soidle(void *); void sotask(void *); -void soreaper(void *); -void soput(void *); int somove(struct socket *, int); void sorflush(struct socket *); @@ -135,14 +133,29 @@ struct socket * soalloc(const struct protosw *prp, int wait) { const struct domain *dp = prp->pr_domain; + const char *dom_name = dp->dom_name; struct socket *so; so = pool_get(&socket_pool, (wait == M_WAIT ? PR_WAITOK : PR_NOWAIT) | PR_ZERO); if (so == NULL) return (NULL); - rw_init_flags(&so->so_lock, dp->dom_name, RWL_DUPOK); + +#ifdef WITNESS + /* + * XXX: Make WITNESS happy. AF_INET and AF_INET6 sockets could be + * spliced together. + */ + switch (dp->dom_family) { + case AF_INET: + case AF_INET6: + dom_name = "inet46"; + break; + } +#endif + refcnt_init(&so->so_refcnt); + rw_init_flags(&so->so_lock, dom_name, RWL_DUPOK); rw_init(&so->so_rcv.sb_lock, "sbufrcv"); rw_init(&so->so_snd.sb_lock, "sbufsnd"); mtx_init_flags(&so->so_rcv.sb_mtx, IPL_MPFLOOR, "sbrcv", 0); @@ -153,24 +166,8 @@ soalloc(const struct protosw *prp, int wait) TAILQ_INIT(&so->so_q0); TAILQ_INIT(&so->so_q); - switch (dp->dom_family) { - case AF_INET: - case AF_INET6: - switch (prp->pr_type) { - case SOCK_RAW: - case SOCK_DGRAM: - so->so_snd.sb_flags |= SB_MTXLOCK; - so->so_rcv.sb_flags |= SB_MTXLOCK; - break; - } - break; - case AF_KEY: - case AF_ROUTE: - case AF_UNIX: - so->so_snd.sb_flags |= SB_MTXLOCK; - so->so_rcv.sb_flags |= SB_MTXLOCK; - break; - } + so->so_snd.sb_flags |= SB_MTXLOCK; + so->so_rcv.sb_flags |= SB_MTXLOCK; return (so); } @@ -267,6 +264,32 @@ solisten(struct socket *so, int backlog) return (0); } +void +sorele(struct socket *so) +{ + if (refcnt_rele(&so->so_refcnt) == 0) + return; + + sigio_free(&so->so_sigio); + klist_free(&so->so_rcv.sb_klist); + klist_free(&so->so_snd.sb_klist); + + mtx_enter(&so->so_snd.sb_mtx); + sbrelease(so, &so->so_snd); + mtx_leave(&so->so_snd.sb_mtx); + + if (so->so_proto->pr_flags & PR_RIGHTS && + so->so_proto->pr_domain->dom_dispose) + (*so->so_proto->pr_domain->dom_dispose)(so->so_rcv.sb_mb); + m_purge(so->so_rcv.sb_mb); + +#ifdef SOCKET_SPLICE + if (so->so_sp) + pool_put(&sosplice_pool, so->so_sp); +#endif + pool_put(&socket_pool, so); +} + #define SOSP_FREEING_READ 1 #define SOSP_FREEING_WRITE 2 void @@ -296,79 +319,30 @@ sofree(struct socket *so, int keep_lock) } if (persocket) { - /* - * Concurrent close of `head' could - * abort `so' due to re-lock. - */ - soref(so); soref(head); sounlock(so); solock(head); solock(so); if (so->so_onq != &head->so_q0) { - sounlock(head); sounlock(so); + sounlock(head); sorele(head); - sorele(so); return; } - - sorele(head); - sorele(so); } soqremque(so, 0); - if (persocket) + if (persocket) { sounlock(head); + sorele(head); + } } - switch (so->so_proto->pr_domain->dom_family) { - case AF_INET: - case AF_INET6: - if (so->so_proto->pr_type == SOCK_STREAM) - break; - /* FALLTHROUGH */ - default: - sounlock(so); - refcnt_finalize(&so->so_refcnt, "sofinal"); - solock(so); - break; - } - - sigio_free(&so->so_sigio); - klist_free(&so->so_rcv.sb_klist); - klist_free(&so->so_snd.sb_klist); - - mtx_enter(&so->so_snd.sb_mtx); - sbrelease(so, &so->so_snd); - mtx_leave(&so->so_snd.sb_mtx); - - /* - * Unlocked dispose and cleanup is safe. Socket is unlinked - * from everywhere. Even concurrent sotask() thread will not - * call somove(). - */ - if (so->so_proto->pr_flags & PR_RIGHTS && - so->so_proto->pr_domain->dom_dispose) - (*so->so_proto->pr_domain->dom_dispose)(so->so_rcv.sb_mb); - m_purge(so->so_rcv.sb_mb); - if (!keep_lock) sounlock(so); - -#ifdef SOCKET_SPLICE - if (so->so_sp) { - /* Reuse splice idle, sounsplice() has been called before. */ - timeout_set_flags(&so->so_sp->ssp_idleto, soreaper, so, - KCLOCK_NONE, TIMEOUT_PROC | TIMEOUT_MPSAFE); - timeout_add(&so->so_sp->ssp_idleto, 0); - } else -#endif /* SOCKET_SPLICE */ - { - pool_put(&socket_pool, so); - } + sorele(so); } static inline uint64_t @@ -447,39 +421,10 @@ drop: } } discard: - if (so->so_state & SS_NOFDREF) - panic("soclose NOFDREF: so %p, so_type %d", so, so->so_type); - so->so_state |= SS_NOFDREF; - #ifdef SOCKET_SPLICE if (so->so_sp) { struct socket *soback; - if (so->so_proto->pr_flags & PR_WANTRCVD) { - /* - * Copy - Paste, but can't relock and sleep in - * sofree() in tcp(4) case. That's why tcp(4) - * still rely on solock() for splicing and - * unsplicing. - */ - - if (issplicedback(so)) { - int freeing = SOSP_FREEING_WRITE; - - if (so->so_sp->ssp_soback == so) - freeing |= SOSP_FREEING_READ; - sounsplice(so->so_sp->ssp_soback, so, freeing); - } - if (isspliced(so)) { - int freeing = SOSP_FREEING_READ; - - if (so == so->so_sp->ssp_socket) - freeing |= SOSP_FREEING_WRITE; - sounsplice(so, so->so_sp->ssp_socket, freeing); - } - goto free; - } - sounlock(so); mtx_enter(&so->so_snd.sb_mtx); /* @@ -505,9 +450,7 @@ discard: if (so->so_sp->ssp_soback == so) freeing |= SOSP_FREEING_READ; - solock(soback); sounsplice(so->so_sp->ssp_soback, so, freeing); - sounlock(soback); } sbunlock(&soback->so_rcv); sorele(soback); @@ -515,20 +458,29 @@ discard: notsplicedback: sblock(&so->so_rcv, SBL_WAIT | SBL_NOINTR); if (isspliced(so)) { + struct socket *sosp; int freeing = SOSP_FREEING_READ; if (so == so->so_sp->ssp_socket) freeing |= SOSP_FREEING_WRITE; - solock(so); + sosp = soref(so->so_sp->ssp_socket); sounsplice(so, so->so_sp->ssp_socket, freeing); - sounlock(so); + sorele(sosp); } sbunlock(&so->so_rcv); + timeout_del_barrier(&so->so_sp->ssp_idleto); + task_del(sosplice_taskq, &so->so_sp->ssp_task); + taskq_barrier(sosplice_taskq); + solock(so); } -free: #endif /* SOCKET_SPLICE */ + + if (so->so_state & SS_NOFDREF) + panic("soclose NOFDREF: so %p, so_type %d", so, so->so_type); + so->so_state |= SS_NOFDREF; + /* sofree() calls sounlock(). */ sofree(so, 0); return (error); @@ -795,8 +747,6 @@ m_getuio(struct mbuf **mp, int atomic, long space, struct uio *uio) if (top == NULL) { MGETHDR(m, M_WAIT, MT_DATA); mlen = MHLEN; - m->m_pkthdr.len = 0; - m->m_pkthdr.ph_ifidx = 0; } else { MGET(m, M_WAIT, MT_DATA); mlen = MLEN; @@ -926,9 +876,9 @@ soreceive(struct socket *so, struct mbuf **paddr, struct uio *uio, flags = 0; if (flags & MSG_OOB) { m = m_get(M_WAIT, MT_DATA); - solock(so); + solock_shared(so); error = pru_rcvoob(so, m, flags & MSG_PEEK); - sounlock(so); + sounlock_shared(so); if (error) goto bad; do { @@ -1383,6 +1333,38 @@ sorflush(struct socket *so) #define so_idleto so_sp->ssp_idleto #define so_splicetask so_sp->ssp_task +void +sosplice_solock_pair(struct socket *so1, struct socket *so2) +{ + NET_LOCK_SHARED(); + + if (so1 == so2) + rw_enter_write(&so1->so_lock); + else if (so1 < so2) { + rw_enter_write(&so1->so_lock); + rw_enter_write(&so2->so_lock); + } else { + rw_enter_write(&so2->so_lock); + rw_enter_write(&so1->so_lock); + } +} + +void +sosplice_sounlock_pair(struct socket *so1, struct socket *so2) +{ + if (so1 == so2) + rw_exit_write(&so1->so_lock); + else if (so1 < so2) { + rw_exit_write(&so2->so_lock); + rw_exit_write(&so1->so_lock); + } else { + rw_exit_write(&so1->so_lock); + rw_exit_write(&so2->so_lock); + } + + NET_UNLOCK_SHARED(); +} + int sosplice(struct socket *so, int fd, off_t max, struct timeval *tv) { @@ -1402,23 +1384,13 @@ sosplice(struct socket *so, int fd, off_t max, struct timeval *tv) if (fd < 0) { if ((error = sblock(&so->so_rcv, SBL_WAIT)) != 0) return (error); - solock(so); - if (so->so_options & SO_ACCEPTCONN) { - error = EOPNOTSUPP; - goto out; - } - if ((so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) == 0 && - (so->so_proto->pr_flags & PR_CONNREQUIRED)) { - error = ENOTCONN; - goto out; - } - - if (so->so_sp && so->so_sp->ssp_socket) + if (so->so_sp && so->so_sp->ssp_socket) { + sosp = soref(so->so_sp->ssp_socket); sounsplice(so, so->so_sp->ssp_socket, 0); - out: - sounlock(so); + sorele(sosp); + } sbunlock(&so->so_rcv); - return (error); + return (0); } if (sosplice_taskq == NULL) { @@ -1457,7 +1429,7 @@ sosplice(struct socket *so, int fd, off_t max, struct timeval *tv) sbunlock(&so->so_rcv); goto frele; } - solock(so); + sosplice_solock_pair(so, sosp); if ((so->so_options & SO_ACCEPTCONN) || (sosp->so_options & SO_ACCEPTCONN)) { @@ -1473,10 +1445,26 @@ sosplice(struct socket *so, int fd, off_t max, struct timeval *tv) error = ENOTCONN; goto release; } - if (so->so_sp == NULL) - so->so_sp = pool_get(&sosplice_pool, PR_WAITOK | PR_ZERO); - if (sosp->so_sp == NULL) - sosp->so_sp = pool_get(&sosplice_pool, PR_WAITOK | PR_ZERO); + if (so->so_sp == NULL) { + struct sosplice *so_sp; + + so_sp = pool_get(&sosplice_pool, PR_WAITOK | PR_ZERO); + timeout_set_flags(&so_sp->ssp_idleto, soidle, so, + KCLOCK_NONE, TIMEOUT_PROC | TIMEOUT_MPSAFE); + task_set(&so_sp->ssp_task, sotask, so); + + so->so_sp = so_sp; + } + if (sosp->so_sp == NULL) { + struct sosplice *so_sp; + + so_sp = pool_get(&sosplice_pool, PR_WAITOK | PR_ZERO); + timeout_set_flags(&so_sp->ssp_idleto, soidle, sosp, + KCLOCK_NONE, TIMEOUT_PROC | TIMEOUT_MPSAFE); + task_set(&so_sp->ssp_task, sotask, sosp); + + sosp->so_sp = so_sp; + } if (so->so_sp->ssp_socket || sosp->so_sp->ssp_soback) { error = EBUSY; goto release; @@ -1488,9 +1476,6 @@ sosplice(struct socket *so, int fd, off_t max, struct timeval *tv) so->so_idletv = *tv; else timerclear(&so->so_idletv); - timeout_set_flags(&so->so_idleto, soidle, so, - KCLOCK_NONE, TIMEOUT_PROC | TIMEOUT_MPSAFE); - task_set(&so->so_splicetask, sotask, so); /* * To prevent sorwakeup() calling somove() before this somove() @@ -1505,8 +1490,9 @@ sosplice(struct socket *so, int fd, off_t max, struct timeval *tv) mtx_leave(&sosp->so_snd.sb_mtx); mtx_leave(&so->so_rcv.sb_mtx); - if ((so->so_proto->pr_flags & PR_WANTRCVD) == 0) - sounlock(so); + sosplice_sounlock_pair(so, sosp); + sbunlock(&sosp->so_snd); + if (somove(so, M_WAIT)) { mtx_enter(&so->so_rcv.sb_mtx); mtx_enter(&sosp->so_snd.sb_mtx); @@ -1515,28 +1501,24 @@ sosplice(struct socket *so, int fd, off_t max, struct timeval *tv) mtx_leave(&sosp->so_snd.sb_mtx); mtx_leave(&so->so_rcv.sb_mtx); } - if ((so->so_proto->pr_flags & PR_WANTRCVD) == 0) - solock(so); + + sbunlock(&so->so_rcv); + FRELE(fp, curproc); + return (0); release: - sounlock(so); + sosplice_sounlock_pair(so, sosp); sbunlock(&sosp->so_snd); sbunlock(&so->so_rcv); frele: FRELE(fp, curproc); - return (error); } void sounsplice(struct socket *so, struct socket *sosp, int freeing) { - if ((so->so_proto->pr_flags & PR_WANTRCVD) == 0) - sbassertlocked(&so->so_rcv); - soassertlocked(so); - - task_del(sosplice_taskq, &so->so_splicetask); - timeout_del(&so->so_idleto); + sbassertlocked(&so->so_rcv); mtx_enter(&so->so_rcv.sb_mtx); mtx_enter(&sosp->so_snd.sb_mtx); @@ -1546,11 +1528,27 @@ sounsplice(struct socket *so, struct socket *sosp, int freeing) mtx_leave(&sosp->so_snd.sb_mtx); mtx_leave(&so->so_rcv.sb_mtx); + task_del(sosplice_taskq, &so->so_splicetask); + timeout_del(&so->so_idleto); + /* Do not wakeup a socket that is about to be freed. */ - if ((freeing & SOSP_FREEING_READ) == 0 && soreadable(so)) - sorwakeup(so); - if ((freeing & SOSP_FREEING_WRITE) == 0 && sowriteable(sosp)) - sowwakeup(sosp); + if ((freeing & SOSP_FREEING_READ) == 0) { + int readable; + + solock_shared(so); + mtx_enter(&so->so_rcv.sb_mtx); + readable = soreadable(so); + mtx_leave(&so->so_rcv.sb_mtx); + if (readable) + sorwakeup(so); + sounlock_shared(so); + } + if ((freeing & SOSP_FREEING_WRITE) == 0) { + solock_shared(sosp); + if (sowriteable(sosp)) + sowwakeup(sosp); + sounlock_shared(sosp); + } } void @@ -1559,17 +1557,14 @@ soidle(void *arg) struct socket *so = arg; sblock(&so->so_rcv, SBL_WAIT | SBL_NOINTR); - solock(so); - /* - * Depending on socket type, sblock(&so->so_rcv) or solock() - * is always held while modifying SB_SPLICE and - * so->so_sp->ssp_socket. - */ if (so->so_rcv.sb_flags & SB_SPLICE) { - so->so_error = ETIMEDOUT; + struct socket *sosp; + + WRITE_ONCE(so->so_error, ETIMEDOUT); + sosp = soref(so->so_sp->ssp_socket); sounsplice(so, so->so_sp->ssp_socket, 0); + sorele(sosp); } - sounlock(so); sbunlock(&so->so_rcv); } @@ -1578,25 +1573,13 @@ sotask(void *arg) { struct socket *so = arg; int doyield = 0; - int sockstream = (so->so_proto->pr_flags & PR_WANTRCVD); - - /* - * sblock() on `so_rcv' protects sockets from being unspliced - * for UDP case. TCP sockets still rely on solock(). - */ sblock(&so->so_rcv, SBL_WAIT | SBL_NOINTR); - if (sockstream) - solock(so); - if (so->so_rcv.sb_flags & SB_SPLICE) { - if (sockstream) + if (so->so_proto->pr_flags & PR_WANTRCVD) doyield = 1; somove(so, M_DONTWAIT); } - - if (sockstream) - sounlock(so); sbunlock(&so->so_rcv); if (doyield) { @@ -1605,32 +1588,6 @@ sotask(void *arg) } } -/* - * The socket splicing task or idle timeout may sleep while grabbing the net - * lock. As sofree() can be called anytime, sotask() or soidle() could access - * the socket memory of a freed socket after wakeup. So delay the pool_put() - * after all pending socket splicing tasks or timeouts have finished. Do this - * by scheduling it on the same threads. - */ -void -soreaper(void *arg) -{ - struct socket *so = arg; - - /* Reuse splice task, sounsplice() has been called before. */ - task_set(&so->so_sp->ssp_task, soput, so); - task_add(sosplice_taskq, &so->so_sp->ssp_task); -} - -void -soput(void *arg) -{ - struct socket *so = arg; - - pool_put(&sosplice_pool, so->so_sp); - pool_put(&socket_pool, so); -} - /* * Move data from receive buffer of spliced source socket to send * buffer of drain socket. Try to move as much as possible in one @@ -1649,10 +1606,12 @@ somove(struct socket *so, int wait) int sockdgram = ((so->so_proto->pr_flags & PR_WANTRCVD) == 0); - if (sockdgram) - sbassertlocked(&so->so_rcv); - else - soassertlocked(so); + sbassertlocked(&so->so_rcv); + + if (!sockdgram) { + sblock(&so->so_snd, SBL_WAIT | SBL_NOINTR); + solock(so); + } mtx_enter(&so->so_rcv.sb_mtx); mtx_enter(&sosp->so_snd.sb_mtx); @@ -1956,12 +1915,15 @@ somove(struct socket *so, int wait) mtx_leave(&sosp->so_snd.sb_mtx); mtx_leave(&so->so_rcv.sb_mtx); + if (!sockdgram) { + sbunlock(&so->so_snd); + sounlock(so); + } + if (unsplice) { - if (sockdgram) - solock(so); + soref(sosp); sounsplice(so, sosp, 0); - if (sockdgram) - sounlock(so); + sorele(sosp); return (0); } @@ -2435,6 +2397,8 @@ int filt_soread(struct knote *kn, long hint) { struct socket *so = kn->kn_fp->f_data; + u_int state = READ_ONCE(so->so_state); + u_int error = READ_ONCE(so->so_error); int rv = 0; MUTEX_ASSERT_LOCKED(&so->so_rcv.sb_mtx); @@ -2442,18 +2406,20 @@ filt_soread(struct knote *kn, long hint) soassertlocked_readonly(so); if (so->so_options & SO_ACCEPTCONN) { + short qlen = READ_ONCE(so->so_qlen); + if (so->so_rcv.sb_flags & SB_MTXLOCK) soassertlocked_readonly(so); - kn->kn_data = so->so_qlen; + kn->kn_data = qlen; rv = (kn->kn_data != 0); if (kn->kn_flags & (__EV_POLL | __EV_SELECT)) { - if (so->so_state & SS_ISDISCONNECTED) { + if (state & SS_ISDISCONNECTED) { kn->kn_flags |= __EV_HUP; rv = 1; } else { - rv = soreadable(so); + rv = qlen || soreadable(so); } } @@ -2469,12 +2435,12 @@ filt_soread(struct knote *kn, long hint) if (so->so_rcv.sb_state & SS_CANTRCVMORE) { kn->kn_flags |= EV_EOF; if (kn->kn_flags & __EV_POLL) { - if (so->so_state & SS_ISDISCONNECTED) + if (state & SS_ISDISCONNECTED) kn->kn_flags |= __EV_HUP; } - kn->kn_fflags = so->so_error; + kn->kn_fflags = error; rv = 1; - } else if (so->so_error) { + } else if (error) { rv = 1; } else if (kn->kn_sfflags & NOTE_LOWAT) { rv = (kn->kn_data >= kn->kn_sdata); @@ -2497,6 +2463,8 @@ int filt_sowrite(struct knote *kn, long hint) { struct socket *so = kn->kn_fp->f_data; + u_int state = READ_ONCE(so->so_state); + u_int error = READ_ONCE(so->so_error); int rv; MUTEX_ASSERT_LOCKED(&so->so_snd.sb_mtx); @@ -2507,14 +2475,14 @@ filt_sowrite(struct knote *kn, long hint) if (so->so_snd.sb_state & SS_CANTSENDMORE) { kn->kn_flags |= EV_EOF; if (kn->kn_flags & __EV_POLL) { - if (so->so_state & SS_ISDISCONNECTED) + if (state & SS_ISDISCONNECTED) kn->kn_flags |= __EV_HUP; } - kn->kn_fflags = so->so_error; + kn->kn_fflags = error; rv = 1; - } else if (so->so_error) { + } else if (error) { rv = 1; - } else if (((so->so_state & SS_ISCONNECTED) == 0) && + } else if (((state & SS_ISCONNECTED) == 0) && (so->so_proto->pr_flags & PR_CONNREQUIRED)) { rv = 0; } else if (kn->kn_sfflags & NOTE_LOWAT) { @@ -2550,7 +2518,9 @@ filt_soexcept(struct knote *kn, long hint) } if (kn->kn_flags & __EV_POLL) { - if (so->so_state & SS_ISDISCONNECTED) { + u_int state = READ_ONCE(so->so_state); + + if (state & SS_ISDISCONNECTED) { kn->kn_flags |= __EV_HUP; rv = 1; } diff --git a/sys/kern/uipc_socket2.c b/sys/kern/uipc_socket2.c index 2855feb61..79abf1c50 100644 --- a/sys/kern/uipc_socket2.c +++ b/sys/kern/uipc_socket2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uipc_socket2.c,v 1.158 2024/07/12 19:50:35 bluhm Exp $ */ +/* $OpenBSD: uipc_socket2.c,v 1.164 2025/01/05 12:36:48 bluhm Exp $ */ /* $NetBSD: uipc_socket2.c,v 1.11 1996/02/04 02:17:55 christos Exp $ */ /* @@ -47,7 +47,7 @@ * Primitive routines for operating on sockets and socket buffers */ -u_long sb_max = SB_MAX; /* patchable */ +u_long sb_max = SB_MAX; /* [I] patchable */ extern struct pool mclpools[]; extern struct pool mbpool; @@ -103,7 +103,6 @@ soisconnected(struct socket *so) int persocket = solock_persocket(so); if (persocket) { - soref(so); soref(head); sounlock(so); @@ -113,13 +112,9 @@ soisconnected(struct socket *so) if (so->so_onq != &head->so_q0) { sounlock(head); sorele(head); - sorele(so); - return; } - sorele(head); - sorele(so); } soqremque(so, 0); @@ -127,8 +122,10 @@ soisconnected(struct socket *so) sorwakeup(head); wakeup_one(&head->so_timeo); - if (persocket) + if (persocket) { sounlock(head); + sorele(head); + } } else { wakeup(&so->so_timeo); sorwakeup(so); @@ -365,11 +362,8 @@ solock_shared(struct socket *so) switch (so->so_proto->pr_domain->dom_family) { case PF_INET: case PF_INET6: - if (ISSET(so->so_proto->pr_flags, PR_MPSOCKET)) { - NET_LOCK_SHARED(); - rw_enter_write(&so->so_lock); - } else - NET_LOCK(); + NET_LOCK_SHARED(); + rw_enter_write(&so->so_lock); break; default: rw_enter_write(&so->so_lock); @@ -425,11 +419,8 @@ sounlock_shared(struct socket *so) switch (so->so_proto->pr_domain->dom_family) { case PF_INET: case PF_INET6: - if (ISSET(so->so_proto->pr_flags, PR_MPSOCKET)) { - rw_exit_write(&so->so_lock); - NET_UNLOCK_SHARED(); - } else - NET_UNLOCK(); + rw_exit_write(&so->so_lock); + NET_UNLOCK_SHARED(); break; default: rw_exit_write(&so->so_lock); @@ -481,15 +472,11 @@ sosleep_nsec(struct socket *so, void *ident, int prio, const char *wmesg, switch (so->so_proto->pr_domain->dom_family) { case PF_INET: case PF_INET6: - if (ISSET(so->so_proto->pr_flags, PR_MPSOCKET) && - rw_status(&netlock) == RW_READ) { + if (rw_status(&netlock) == RW_READ) rw_exit_write(&so->so_lock); - } ret = rwsleep_nsec(ident, &netlock, prio, wmesg, nsecs); - if (ISSET(so->so_proto->pr_flags, PR_MPSOCKET) && - rw_status(&netlock) == RW_READ) { + if (rw_status(&netlock) == RW_READ) rw_enter_write(&so->so_lock); - } break; default: ret = rwsleep_nsec(ident, &so->so_lock, prio, wmesg, nsecs); @@ -684,14 +671,20 @@ int sbchecklowmem(void) { static int sblowmem; - unsigned int used = m_pool_used(); + unsigned int used; + /* + * m_pool_used() is thread safe. Global variable sblowmem is updated + * by multiple CPUs, but most times with the same value. And even + * if the value is not correct for a short time, it does not matter. + */ + used = m_pool_used(); if (used < 60) - sblowmem = 0; + atomic_store_int(&sblowmem, 0); else if (used > 80) - sblowmem = 1; + atomic_store_int(&sblowmem, 1); - return (sblowmem); + return (atomic_load_int(&sblowmem)); } /* @@ -833,8 +826,7 @@ sbappend(struct socket *so, struct sockbuf *sb, struct mbuf *m) void sbappendstream(struct socket *so, struct sockbuf *sb, struct mbuf *m) { - KASSERT(sb == &so->so_rcv || sb == &so->so_snd); - soassertlocked(so); + sbmtxassertlocked(so, sb); KDASSERT(m->m_nextpkt == NULL); KASSERT(sb->sb_mb == sb->sb_lastrecord); diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index 1ad1b7941..e3b440729 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uipc_syscalls.c,v 1.219 2024/04/25 17:32:53 bluhm Exp $ */ +/* $OpenBSD: uipc_syscalls.c,v 1.221 2025/01/05 11:33:45 mvs Exp $ */ /* $NetBSD: uipc_syscalls.c,v 1.19 1996/02/09 19:00:48 christos Exp $ */ /* @@ -247,6 +247,34 @@ sys_accept4(struct proc *p, void *v, register_t *retval) SCARG(uap, anamelen), SCARG(uap, flags), retval)); } +void +doaccept_solock(struct socket *so, int take_netlock) +{ + if (take_netlock) { + switch (so->so_proto->pr_domain->dom_family) { + case PF_INET: + case PF_INET6: + NET_LOCK_SHARED(); + } + } + + rw_enter_write(&so->so_lock); +} + +void +doaccept_sounlock(struct socket *so, int release_netlock) +{ + rw_exit_write(&so->so_lock); + + if (release_netlock) { + switch (so->so_proto->pr_domain->dom_family) { + case PF_INET: + case PF_INET6: + NET_UNLOCK_SHARED(); + } + } +} + int doaccept(struct proc *p, int sock, struct sockaddr *name, socklen_t *anamelen, int flags, register_t *retval) @@ -257,7 +285,7 @@ doaccept(struct proc *p, int sock, struct sockaddr *name, socklen_t *anamelen, socklen_t namelen; int error, tmpfd; struct socket *head, *so; - int cloexec, nflag, persocket; + int cloexec, nflag; cloexec = (flags & SOCK_CLOEXEC) ? UF_EXCLOSE : 0; @@ -279,9 +307,7 @@ doaccept(struct proc *p, int sock, struct sockaddr *name, socklen_t *anamelen, nam = m_get(M_WAIT, MT_SONAME); head = headfp->f_data; - solock(head); - - persocket = solock_persocket(head); + doaccept_solock(head, 1); if (isdnssocket(head) || (head->so_options & SO_ACCEPTCONN) == 0) { error = EINVAL; @@ -315,8 +341,7 @@ doaccept(struct proc *p, int sock, struct sockaddr *name, socklen_t *anamelen, */ so = TAILQ_FIRST(&head->so_q); - if (persocket) - solock(so); + doaccept_solock(so, 0); if (soqremque(so, 1) == 0) panic("accept"); @@ -328,8 +353,7 @@ doaccept(struct proc *p, int sock, struct sockaddr *name, socklen_t *anamelen, /* connection has been removed from the listen queue */ knote(&head->so_rcv.sb_klist, 0); - if (persocket) - sounlock(head); + doaccept_sounlock(head, 0); fp->f_type = DTYPE_SOCKET; fp->f_flag = FREAD | FWRITE | nflag; @@ -338,10 +362,7 @@ doaccept(struct proc *p, int sock, struct sockaddr *name, socklen_t *anamelen, error = soaccept(so, nam); - if (persocket) - sounlock(so); - else - sounlock(head); + doaccept_sounlock(so, 1); if (error) goto out; @@ -364,7 +385,7 @@ doaccept(struct proc *p, int sock, struct sockaddr *name, socklen_t *anamelen, return 0; out_unlock: - sounlock(head); + doaccept_sounlock(head, 1); out: fdplock(fdp); fdremove(fdp, tmpfd); @@ -788,11 +809,8 @@ sendit(struct proc *p, int s, struct msghdr *mp, int flags, register_t *retsize) if (auio.uio_resid != len && (error == ERESTART || error == EINTR || error == EWOULDBLOCK)) error = 0; - if (error == EPIPE && (flags & MSG_NOSIGNAL) == 0) { - KERNEL_LOCK(); + if (error == EPIPE && (flags & MSG_NOSIGNAL) == 0) ptsignal(p, SIGPIPE, STHREAD); - KERNEL_UNLOCK(); - } } if (error == 0) { *retsize = len - auio.uio_resid; diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index 89c736863..0f2bd4812 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uipc_usrreq.c,v 1.210 2024/09/22 08:40:37 claudio Exp $ */ +/* $OpenBSD: uipc_usrreq.c,v 1.212 2025/01/01 13:44:22 bluhm Exp $ */ /* $NetBSD: uipc_usrreq.c,v 1.18 1996/02/09 19:00:50 christos Exp $ */ /* @@ -385,7 +385,7 @@ uipc_bind(struct socket *so, struct mbuf *nam, struct proc *p) solock(unp->unp_socket); goto out; } - VATTR_NULL(&vattr); + vattr_null(&vattr); vattr.va_type = VSOCK; vattr.va_mode = ACCESSPERMS &~ p->p_fd->fd_cmask; error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr); @@ -1469,7 +1469,7 @@ unp_gc(void *arg __unused) m = sb->sb_mb; memset(&sb->sb_startzero, 0, (caddr_t)&sb->sb_endzero - - (caddr_t)&sb->sb_startzero); + (caddr_t)&sb->sb_startzero); sb->sb_timeo_nsecs = INFSLP; mtx_leave(&sb->sb_mtx); diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index 04f8fb1ab..4fb7c58ad 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfs_bio.c,v 1.213 2024/02/03 18:51:58 beck Exp $ */ +/* $OpenBSD: vfs_bio.c,v 1.214 2024/11/05 17:28:31 mpi Exp $ */ /* $NetBSD: vfs_bio.c,v 1.44 1996/06/11 11:15:36 pk Exp $ */ /* @@ -284,22 +284,16 @@ bufadjust(int newbufpages) } /* - * Make the buffer cache back off from cachepct. + * Back off "size" buffer cache pages. Called by the page + * daemon to consume buffer cache pages rather than scanning. + * + * It returns the number of freed pages. */ -int +unsigned long bufbackoff(struct uvm_constraint_range *range, long size) { - /* - * Back off "size" buffer cache pages. Called by the page - * daemon to consume buffer cache pages rather than scanning. - * - * It returns 0 to the pagedaemon to indicate that it has - * succeeded in freeing enough pages. It returns -1 to - * indicate that it could not and the pagedaemon should take - * other measures. - * - */ long pdelta, oldbufpages; + int64_t dmarecovered, recovered = 0; /* * If we will accept high memory for this backoff @@ -307,11 +301,13 @@ bufbackoff(struct uvm_constraint_range *range, long size) */ if (range != NULL && range->ucr_high > dma_constraint.ucr_high) { struct buf *bp; - int64_t start = bcstats.numbufpages, recovered = 0; - int s = splbio(); + int64_t start; + int s; - while ((recovered < size) && - (bp = bufcache_gethighcleanbuf())) { + start = bcstats.numbufpages; + + s = splbio(); + while (recovered < size && (bp = bufcache_gethighcleanbuf())) { bufcache_take(bp); if (bp->b_vp) { RBT_REMOVE(buf_rb_bufs, @@ -324,16 +320,13 @@ bufbackoff(struct uvm_constraint_range *range, long size) bufcache_adjust(); splx(s); - /* If we got enough, return success */ + /* We got enough. */ if (recovered >= size) - return 0; + return recovered; - /* - * If we needed only memory above DMA, - * return failure - */ + /* If we needed only memory above DMA, we're done. */ if (range->ucr_low > dma_constraint.ucr_high) - return -1; + return recovered; /* Otherwise get the rest from DMA */ size -= recovered; @@ -351,15 +344,14 @@ bufbackoff(struct uvm_constraint_range *range, long size) pdelta = (size > bufbackpages) ? size : bufbackpages; if (bufpages <= buflowpages) - return(-1); + return recovered; if (bufpages - pdelta < buflowpages) pdelta = bufpages - buflowpages; oldbufpages = bufpages; bufadjust(bufpages - pdelta); - if (oldbufpages - bufpages < size) - return (-1); /* we did not free what we were asked */ - else - return(0); + dmarecovered = oldbufpages - bufpages; + + return recovered + dmarecovered; } diff --git a/sys/kern/vfs_biomem.c b/sys/kern/vfs_biomem.c index fc6e5e936..3df45ecf3 100644 --- a/sys/kern/vfs_biomem.c +++ b/sys/kern/vfs_biomem.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfs_biomem.c,v 1.51 2021/10/24 00:02:25 jsg Exp $ */ +/* $OpenBSD: vfs_biomem.c,v 1.52 2024/11/05 17:28:31 mpi Exp $ */ /* * Copyright (c) 2007 Artur Grabowski @@ -272,7 +272,7 @@ buf_alloc_pages(struct buf *bp, vsize_t size) UVM_PLA_NOWAIT | UVM_PLA_NOWAKE); if (i == 0) break; - } while (bufbackoff(&dma_constraint, size) == 0); + } while (bufbackoff(&dma_constraint, size) >= size); if (i != 0) i = uvm_pagealloc_multi(&bp->b_uobj, 0, size, UVM_PLA_WAITOK); @@ -324,6 +324,7 @@ int buf_realloc_pages(struct buf *bp, struct uvm_constraint_range *where, int flags) { + vsize_t size; vaddr_t va; int dma; int i, r; @@ -345,7 +346,8 @@ buf_realloc_pages(struct buf *bp, struct uvm_constraint_range *where, bp->b_bufsize, UVM_PLA_NOWAIT | UVM_PLA_NOWAKE, where); if (r == 0) break; - } while ((bufbackoff(where, atop(bp->b_bufsize)) == 0)); + size = atop(bp->b_bufsize); + } while ((bufbackoff(where, size) >= size)); /* * bufbackoff() failed, so there's no more we can do without diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index a7554d54c..d206dca10 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfs_subr.c,v 1.324 2024/10/18 05:52:32 miod Exp $ */ +/* $OpenBSD: vfs_subr.c,v 1.327 2025/01/02 10:07:18 dlg Exp $ */ /* $NetBSD: vfs_subr.c,v 1.53 1996/04/22 01:39:13 christos Exp $ */ /* @@ -72,6 +72,11 @@ #include "softraid.h" +/* + * Locks used to protect data: + * a atomic + */ + void sr_quiesce(void); enum vtype iftovt_tab[16] = { @@ -84,8 +89,8 @@ int vttoif_tab[9] = { S_IFSOCK, S_IFIFO, S_IFMT, }; -int prtactive = 0; /* 1 => print out reclaim of active vnodes */ -int suid_clear = 1; /* 1 => clear SUID / SGID on owner change */ +int prtactive = 0; /* 1 => print out reclaim of active vnodes */ +int suid_clear = 1; /* [a] 1 => clear SUID / SGID on owner change */ /* * Insq/Remq for the vnode usage lists. @@ -176,6 +181,7 @@ vfs_mount_alloc(struct vnode *vp, struct vfsconf *vfsp) struct mount *mp; mp = malloc(sizeof(*mp), M_MOUNT, M_WAITOK|M_ZERO); + refcnt_init(&mp->mnt_refs); rw_init_flags(&mp->mnt_lock, "vfslock", RWL_IS_VNODE); (void)vfs_busy(mp, VB_READ|VB_NOWAIT); @@ -191,14 +197,29 @@ vfs_mount_alloc(struct vnode *vp, struct vfsconf *vfsp) return (mp); } +struct mount * +vfs_mount_take(struct mount *mp) +{ + refcnt_take(&mp->mnt_refs); + return (mp); +} + +static void +vfs_mount_rele(struct mount *mp) +{ + if (refcnt_rele(&mp->mnt_refs)) + free(mp, M_MOUNT, sizeof(*mp)); +} + /* * Release a mount point. */ void vfs_mount_free(struct mount *mp) { + SET(mp->mnt_flag, MNT_UNMOUNT); atomic_dec_int(&mp->mnt_vfc->vfc_refcount); - free(mp, M_MOUNT, sizeof(*mp)); + vfs_mount_rele(mp); } /* @@ -211,27 +232,27 @@ vfs_mount_free(struct mount *mp) int vfs_busy(struct mount *mp, int flags) { - int rwflags = 0; + int rwflags = ISSET(flags, VB_WRITE) ? RW_WRITE : RW_READ; + int error = 0; - if (flags & VB_WRITE) - rwflags |= RW_WRITE; - else - rwflags |= RW_READ; - - if (flags & VB_WAIT) - rwflags |= RW_SLEEPFAIL; - else + if (!ISSET(flags, VB_WAIT)) rwflags |= RW_NOSLEEP; #ifdef WITNESS - if (flags & VB_DUPOK) + if (ISSET(flags, VB_DUPOK)) rwflags |= RW_DUPOK; #endif - if (rw_enter(&mp->mnt_lock, rwflags)) - return (EBUSY); + vfs_mount_take(mp); + if (rw_enter(&mp->mnt_lock, rwflags) != 0) + error = EBUSY; + else if (ISSET(mp->mnt_flag, MNT_UNMOUNT)) { + rw_exit(&mp->mnt_lock); + error = EBUSY; + } + vfs_mount_rele(mp); - return (0); + return (error); } /* diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 33dab14f7..57309d937 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfs_syscalls.c,v 1.368 2024/09/01 23:26:10 deraadt Exp $ */ +/* $OpenBSD: vfs_syscalls.c,v 1.370 2024/11/05 06:03:19 jsg Exp $ */ /* $NetBSD: vfs_syscalls.c,v 1.71 1996/04/23 10:29:02 mycroft Exp $ */ /* @@ -1176,7 +1176,7 @@ doopenat(struct proc *p, int fd, const char *path, int oflags, mode_t mode, else if (vp->v_type == VDIR) error = EISDIR; else if ((error = vn_writechk(vp)) == 0) { - VATTR_NULL(&vattr); + vattr_null(&vattr); vattr.va_size = 0; error = VOP_SETATTR(vp, &vattr, fp->f_cred, p); } @@ -1405,7 +1405,7 @@ sys_fhopen(struct proc *p, void *v, register_t *retval) goto bad; } if (flags & O_TRUNC) { - VATTR_NULL(&va); + vattr_null(&va); va.va_size = 0; if ((error = VOP_SETATTR(vp, &va, cred, p)) != 0) goto bad; @@ -1587,7 +1587,7 @@ domknodat(struct proc *p, int fd, const char *path, mode_t mode, dev_t dev) if (vp != NULL) error = EEXIST; else { - VATTR_NULL(&vattr); + vattr_null(&vattr); vattr.va_mode = (mode & ALLPERMS) &~ p->p_fd->fd_cmask; if ((p->p_p->ps_flags & PS_PLEDGE)) vattr.va_mode &= ACCESSPERMS; @@ -1801,7 +1801,7 @@ dosymlinkat(struct proc *p, const char *upath, int fd, const char *link) error = EEXIST; goto out; } - VATTR_NULL(&vattr); + vattr_null(&vattr); vattr.va_mode = ACCESSPERMS &~ p->p_fd->fd_cmask; error = VOP_SYMLINK(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr, path); out: @@ -2303,7 +2303,7 @@ dovchflags(struct proc *p, struct vnode *vp, u_int flags) goto out; } } - VATTR_NULL(&vattr); + vattr_null(&vattr); vattr.va_flags = flags; error = VOP_SETATTR(vp, &vattr, p->p_ucred, p); } @@ -2366,7 +2366,7 @@ dofchmodat(struct proc *p, int fd, const char *path, mode_t mode, int flag) if (vp->v_mount->mnt_flag & MNT_RDONLY) error = EROFS; else { - VATTR_NULL(&vattr); + vattr_null(&vattr); vattr.va_mode = mode & ALLPERMS; error = VOP_SETATTR(vp, &vattr, p->p_ucred, p); } @@ -2402,7 +2402,7 @@ sys_fchmod(struct proc *p, void *v, register_t *retval) if (vp->v_mount && vp->v_mount->mnt_flag & MNT_RDONLY) error = EROFS; else { - VATTR_NULL(&vattr); + vattr_null(&vattr); vattr.va_mode = mode & ALLPERMS; error = VOP_SETATTR(vp, &vattr, p->p_ucred, p); } @@ -2470,7 +2470,7 @@ dofchownat(struct proc *p, int fd, const char *path, uid_t uid, gid_t gid, goto out; if ((uid != -1 || gid != -1) && !vnoperm(vp) && - (suser(p) || suid_clear)) { + (suser(p) || atomic_load_int(&suid_clear))) { error = VOP_GETATTR(vp, &vattr, p->p_ucred, p); if (error) goto out; @@ -2479,7 +2479,7 @@ dofchownat(struct proc *p, int fd, const char *path, uid_t uid, gid_t gid, mode = VNOVAL; } else mode = VNOVAL; - VATTR_NULL(&vattr); + vattr_null(&vattr); vattr.va_uid = uid; vattr.va_gid = gid; vattr.va_mode = mode; @@ -2523,7 +2523,7 @@ sys_lchown(struct proc *p, void *v, register_t *retval) goto out; if ((uid != -1 || gid != -1) && !vnoperm(vp) && - (suser(p) || suid_clear)) { + (suser(p) || atomic_load_int(&suid_clear))) { error = VOP_GETATTR(vp, &vattr, p->p_ucred, p); if (error) goto out; @@ -2532,7 +2532,7 @@ sys_lchown(struct proc *p, void *v, register_t *retval) mode = VNOVAL; } else mode = VNOVAL; - VATTR_NULL(&vattr); + vattr_null(&vattr); vattr.va_uid = uid; vattr.va_gid = gid; vattr.va_mode = mode; @@ -2573,7 +2573,7 @@ sys_fchown(struct proc *p, void *v, register_t *retval) goto out; if ((uid != -1 || gid != -1) && !vnoperm(vp) && - (suser(p) || suid_clear)) { + (suser(p) || atomic_load_int(&suid_clear))) { error = VOP_GETATTR(vp, &vattr, p->p_ucred, p); if (error) goto out; @@ -2582,7 +2582,7 @@ sys_fchown(struct proc *p, void *v, register_t *retval) mode = VNOVAL; } else mode = VNOVAL; - VATTR_NULL(&vattr); + vattr_null(&vattr); vattr.va_uid = uid; vattr.va_gid = gid; vattr.va_mode = mode; @@ -2705,7 +2705,7 @@ dovutimens(struct proc *p, struct vnode *vp, struct timespec ts[2]) } #endif - VATTR_NULL(&vattr); + vattr_null(&vattr); /* make sure ctime is updated even if neither mtime nor atime is */ vattr.va_vaflags = VA_UTIMES_CHANGE; @@ -2845,7 +2845,7 @@ dotruncate(struct proc *p, struct vnode *vp, off_t len) return EFBIG; } } - VATTR_NULL(&vattr); + vattr_null(&vattr); vattr.va_size = len; return VOP_SETATTR(vp, &vattr, p->p_ucred, p); } @@ -3093,7 +3093,7 @@ domkdirat(struct proc *p, int fd, const char *path, mode_t mode) vrele(vp); return (EEXIST); } - VATTR_NULL(&vattr); + vattr_null(&vattr); vattr.va_type = VDIR; vattr.va_mode = (mode & ACCESSPERMS) &~ p->p_fd->fd_cmask; error = VOP_MKDIR(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr); diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index 765b70a09..f2a72a101 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfs_vnops.c,v 1.122 2023/07/10 22:54:40 deraadt Exp $ */ +/* $OpenBSD: vfs_vnops.c,v 1.125 2025/01/06 08:57:23 mpi Exp $ */ /* $NetBSD: vfs_vnops.c,v 1.20 1996/02/04 02:18:41 christos Exp $ */ /* @@ -108,7 +108,7 @@ vn_open(struct nameidata *ndp, int fmode, int cmode) return (error); if (ndp->ni_vp == NULL) { - VATTR_NULL(&va); + vattr_null(&va); va.va_type = VREG; va.va_mode = cmode; if (fmode & O_EXCL) @@ -169,7 +169,7 @@ vn_open(struct nameidata *ndp, int fmode, int cmode) } } if ((fmode & O_TRUNC) && vp->v_type == VREG) { - VATTR_NULL(&va); + vattr_null(&va); va.va_size = 0; if ((error = VOP_SETATTR(vp, &va, cred, p)) != 0) goto bad; @@ -427,7 +427,13 @@ int vn_statfile(struct file *fp, struct stat *sb, struct proc *p) { struct vnode *vp = fp->f_data; - return vn_stat(vp, sb, p); + int error; + + KERNEL_LOCK(); + error = vn_stat(vp, sb, p); + KERNEL_UNLOCK(); + + return (error); } /* @@ -515,7 +521,7 @@ vn_ioctl(struct file *fp, u_long com, caddr_t data, struct proc *p) break; *(int *)data = vattr.va_size - foffset(fp); - } else if (com == FIONBIO || com == FIOASYNC) /* XXX */ + } else if (com == FIOASYNC) /* XXX */ error = 0; /* XXX */ break; diff --git a/sys/lib/libz/zconf.h b/sys/lib/libz/zconf.h index 7221b8923..9491e9369 100644 --- a/sys/lib/libz/zconf.h +++ b/sys/lib/libz/zconf.h @@ -233,10 +233,12 @@ # endif #endif -#if defined(ZLIB_CONST) && !defined(z_const) -# define z_const const -#else -# define z_const +#ifndef z_const +# ifdef ZLIB_CONST +# define z_const const +# else +# define z_const +# endif #endif #ifdef Z_SOLO diff --git a/sys/lib/libz/zutil.h b/sys/lib/libz/zutil.h index ded8bebeb..b548ce86f 100644 --- a/sys/lib/libz/zutil.h +++ b/sys/lib/libz/zutil.h @@ -80,7 +80,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* To be used only when the state is known to be valid */ /* common constants */ - +#if MAX_WBITS < 9 || MAX_WBITS > 15 +# error MAX_WBITS must be in 9..15 +#endif #ifndef DEF_WBITS # define DEF_WBITS MAX_WBITS #endif diff --git a/sys/miscfs/fifofs/fifo_vnops.c b/sys/miscfs/fifofs/fifo_vnops.c index e71585865..42a5e668f 100644 --- a/sys/miscfs/fifofs/fifo_vnops.c +++ b/sys/miscfs/fifofs/fifo_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fifo_vnops.c,v 1.108 2024/10/18 05:52:32 miod Exp $ */ +/* $OpenBSD: fifo_vnops.c,v 1.109 2024/12/30 02:46:00 guenther Exp $ */ /* $NetBSD: fifo_vnops.c,v 1.18 1996/03/16 23:52:42 christos Exp $ */ /* @@ -303,8 +303,6 @@ fifo_ioctl(void *v) struct file filetmp; int error; - if (ap->a_command == FIONBIO) - return (0); if (ap->a_fflag & FREAD) { filetmp.f_data = ap->a_vp->v_fifoinfo->fi_readsock; error = soo_ioctl(&filetmp, ap->a_command, ap->a_data, ap->a_p); diff --git a/sys/miscfs/fuse/fuse_file.c b/sys/miscfs/fuse/fuse_file.c index b944b7563..c056cd9ec 100644 --- a/sys/miscfs/fuse/fuse_file.c +++ b/sys/miscfs/fuse/fuse_file.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fuse_file.c,v 1.9 2016/08/30 16:45:54 natano Exp $ */ +/* $OpenBSD: fuse_file.c,v 1.10 2024/10/31 13:55:21 claudio Exp $ */ /* * Copyright (c) 2012-2013 Sylvestre Gallon * @@ -35,7 +35,7 @@ fusefs_file_open(struct fusefs_mnt *fmp, struct fusefs_node *ip, if (!fmp->sess_init) return (0); - fbuf = fb_setup(0, ip->ufs_ino.i_number, + fbuf = fb_setup(0, ip->i_number, ((isdir) ? FBT_OPENDIR : FBT_OPEN), p); fbuf->fb_io_flags = flags; @@ -60,7 +60,7 @@ fusefs_file_close(struct fusefs_mnt *fmp, struct fusefs_node * ip, int error = 0; if (fmp->sess_init) { - fbuf = fb_setup(0, ip->ufs_ino.i_number, + fbuf = fb_setup(0, ip->i_number, ((isdir) ? FBT_RELEASEDIR : FBT_RELEASE), p); fbuf->fb_io_fd = ip->fufh[fufh_type].fh_id; fbuf->fb_io_flags = flags; diff --git a/sys/miscfs/fuse/fuse_ihash.c b/sys/miscfs/fuse/fuse_ihash.c new file mode 100644 index 000000000..9a9ff776b --- /dev/null +++ b/sys/miscfs/fuse/fuse_ihash.c @@ -0,0 +1,152 @@ +/* $OpenBSD: fuse_ihash.c,v 1.1 2024/10/31 13:55:21 claudio Exp $ */ +/* $NetBSD: ufs_ihash.c,v 1.3 1996/02/09 22:36:04 christos Exp $ */ + +/* + * Copyright (c) 1982, 1986, 1989, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ufs_ihash.c 8.4 (Berkeley) 12/30/93 + */ + +#include +#include +#include +#include +#include +#include + +#include "fusefs_node.h" + +#include + +/* + * Structures associated with inode caching. + */ +LIST_HEAD(fuse_ihashhead, fusefs_node) *fuse_ihashtbl; +u_long fuse_ihashsz; /* size of hash table - 1 */ +SIPHASH_KEY fuse_ihashkey; + +struct fuse_ihashhead *fuse_ihash(dev_t, ino_t); + +struct fuse_ihashhead * +fuse_ihash(dev_t dev, ino_t inum) +{ + SIPHASH_CTX ctx; + + SipHash24_Init(&ctx, &fuse_ihashkey); + SipHash24_Update(&ctx, &dev, sizeof(dev)); + SipHash24_Update(&ctx, &inum, sizeof(inum)); + + return (&fuse_ihashtbl[SipHash24_End(&ctx) & fuse_ihashsz]); +} + +/* + * Initialize inode hash table. + */ +void +fuse_ihashinit(void) +{ + fuse_ihashtbl = hashinit(initialvnodes, M_FUSEFS, M_WAITOK, + &fuse_ihashsz); + arc4random_buf(&fuse_ihashkey, sizeof(fuse_ihashkey)); +} + +/* + * Use the device/inum pair to find the incore inode, and return a pointer + * to it. If it is in core, but locked, wait for it. + */ +struct vnode * +fuse_ihashget(dev_t dev, ino_t inum) +{ + struct fuse_ihashhead *ipp; + struct fusefs_node *ip; + struct vnode *vp; +loop: + /* XXXLOCKING lock hash list */ + ipp = fuse_ihash(dev, inum); + LIST_FOREACH(ip, ipp, i_hash) { + if (inum == ip->i_number && dev == ip->i_dev) { + vp = ITOV(ip); + /* XXXLOCKING unlock hash list? */ + if (vget(vp, LK_EXCLUSIVE)) + goto loop; + + return (vp); + } + } + /* XXXLOCKING unlock hash list? */ + return (NULL); +} + +/* + * Insert the inode into the hash table, and return it locked. + */ +int +fuse_ihashins(struct fusefs_node *ip) +{ + struct fusefs_node *curip; + struct fuse_ihashhead *ipp; + dev_t dev = ip->i_dev; + ino_t inum = ip->i_number; + + /* lock the inode, then put it on the appropriate hash list */ + VOP_LOCK(ITOV(ip), LK_EXCLUSIVE); + + /* XXXLOCKING lock hash list */ + + ipp = fuse_ihash(dev, inum); + LIST_FOREACH(curip, ipp, i_hash) { + if (inum == curip->i_number && dev == curip->i_dev) { + /* XXXLOCKING unlock hash list? */ + VOP_UNLOCK(ITOV(ip)); + return (EEXIST); + } + } + + LIST_INSERT_HEAD(ipp, ip, i_hash); + /* XXXLOCKING unlock hash list? */ + + return (0); +} + +/* + * Remove the inode from the hash table. + */ +void +fuse_ihashrem(struct fusefs_node *ip) +{ + /* XXXLOCKING lock hash list */ + + if (ip->i_hash.le_prev == NULL) + return; + LIST_REMOVE(ip, i_hash); +#ifdef DIAGNOSTIC + ip->i_hash.le_next = NULL; + ip->i_hash.le_prev = NULL; +#endif + /* XXXLOCKING unlock hash list? */ +} diff --git a/sys/miscfs/fuse/fuse_lookup.c b/sys/miscfs/fuse/fuse_lookup.c index ab9b271e2..043cdff10 100644 --- a/sys/miscfs/fuse/fuse_lookup.c +++ b/sys/miscfs/fuse/fuse_lookup.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fuse_lookup.c,v 1.21 2018/06/21 14:53:36 helg Exp $ */ +/* $OpenBSD: fuse_lookup.c,v 1.22 2024/10/31 13:55:21 claudio Exp $ */ /* * Copyright (c) 2012-2013 Sylvestre Gallon * @@ -55,7 +55,7 @@ fusefs_lookup(void *v) *vpp = NULL; vdp = ap->a_dvp; dp = VTOI(vdp); - fmp = (struct fusefs_mnt *)dp->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)dp->i_ump; lockparent = flags & LOCKPARENT; wantparent = flags & (LOCKPARENT | WANTPARENT); @@ -67,13 +67,13 @@ fusefs_lookup(void *v) return (EROFS); if (cnp->cn_namelen == 1 && *(cnp->cn_nameptr) == '.') { - nid = dp->ufs_ino.i_number; + nid = dp->i_number; } else { if (!fmp->sess_init) return (ENOENT); /* got a real entry */ - fbuf = fb_setup(cnp->cn_namelen + 1, dp->ufs_ino.i_number, + fbuf = fb_setup(cnp->cn_namelen + 1, dp->i_number, FBT_LOOKUP, p); memcpy(fbuf->fb_dat, cnp->cn_nameptr, cnp->cn_namelen); @@ -134,7 +134,7 @@ fusefs_lookup(void *v) if ((error = VOP_ACCESS(vdp, VWRITE, cred, cnp->cn_proc)) != 0) goto reclaim; - if (nid == dp->ufs_ino.i_number) + if (nid == dp->i_number) return (EISDIR); error = VFS_VGET(fmp->mp, nid, &tdp); @@ -172,7 +172,7 @@ fusefs_lookup(void *v) } *vpp = tdp; - } else if (nid == dp->ufs_ino.i_number) { + } else if (nid == dp->i_number) { vref(vdp); *vpp = vdp; error = 0; @@ -194,7 +194,7 @@ fusefs_lookup(void *v) return (error); reclaim: - if (nid != dp->ufs_ino.i_number && nid != FUSE_ROOTINO) { + if (nid != dp->i_number && nid != FUSE_ROOTINO) { fbuf = fb_setup(0, nid, FBT_RECLAIM, p); if (fb_queue(fmp->dev, fbuf)) printf("fusefs: libfuse vnode reclaim failed\n"); diff --git a/sys/miscfs/fuse/fuse_vfsops.c b/sys/miscfs/fuse/fuse_vfsops.c index 4a2a7a311..ee6b785c3 100644 --- a/sys/miscfs/fuse/fuse_vfsops.c +++ b/sys/miscfs/fuse/fuse_vfsops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fuse_vfsops.c,v 1.47 2024/05/20 09:11:21 mvs Exp $ */ +/* $OpenBSD: fuse_vfsops.c,v 1.48 2024/10/31 13:55:21 claudio Exp $ */ /* * Copyright (c) 2012-2013 Sylvestre Gallon * @@ -276,7 +276,7 @@ retry: /* * check if vnode is in hash. */ - if ((*vpp = ufs_ihashget(fmp->dev, ino)) != NULLVP) + if ((*vpp = fuse_ihashget(fmp->dev, ino)) != NULLVP) return (0); /* @@ -289,17 +289,17 @@ retry: } ip = malloc(sizeof(*ip), M_FUSEFS, M_WAITOK | M_ZERO); - rrw_init_flags(&ip->ufs_ino.i_lock, "fuseinode", + rrw_init_flags(&ip->i_lock, "fuseinode", RWL_DUPOK | RWL_IS_VNODE); nvp->v_data = ip; - ip->ufs_ino.i_vnode = nvp; - ip->ufs_ino.i_dev = fmp->dev; - ip->ufs_ino.i_number = ino; + ip->i_vnode = nvp; + ip->i_dev = fmp->dev; + ip->i_number = ino; for (i = 0; i < FUFH_MAXTYPE; i++) ip->fufh[i].fh_type = FUFH_INVALID; - error = ufs_ihashins(&ip->ufs_ino); + error = fuse_ihashins(ip); if (error) { vrele(nvp); @@ -309,7 +309,7 @@ retry: return (error); } - ip->ufs_ino.i_ump = (struct ufsmount *)fmp; + ip->i_ump = fmp; if (ino == FUSE_ROOTINO) nvp->v_flag |= VROOT; @@ -348,6 +348,7 @@ fusefs_init(struct vfsconf *vfc) { pool_init(&fusefs_fbuf_pool, sizeof(struct fusebuf), 0, 0, PR_WAITOK, "fmsg", NULL); + fuse_ihashinit(); return (0); } diff --git a/sys/miscfs/fuse/fuse_vnops.c b/sys/miscfs/fuse/fuse_vnops.c index 1ed9b8db1..e83b6966b 100644 --- a/sys/miscfs/fuse/fuse_vnops.c +++ b/sys/miscfs/fuse/fuse_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fuse_vnops.c,v 1.71 2024/10/18 05:52:32 miod Exp $ */ +/* $OpenBSD: fuse_vnops.c,v 1.72 2024/10/31 13:55:21 claudio Exp $ */ /* * Copyright (c) 2012-2013 Sylvestre Gallon * @@ -247,7 +247,7 @@ fusefs_open(void *v) ap = v; vp = ap->a_vp; ip = VTOI(vp); - fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)ip->i_ump; if (!fmp->sess_init) return (ENXIO); @@ -298,7 +298,7 @@ fusefs_close(void *v) ap = v; ip = VTOI(ap->a_vp); - fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)ip->i_ump; if (!fmp->sess_init) return (0); @@ -329,7 +329,7 @@ fusefs_close(void *v) if (ip->fufh[fufh_type].fh_type == FUFH_INVALID) return (EBADF); - fbuf = fb_setup(0, ip->ufs_ino.i_number, FBT_FLUSH, ap->a_p); + fbuf = fb_setup(0, ip->i_number, FBT_FLUSH, ap->a_p); fbuf->fb_io_fd = ip->fufh[fufh_type].fh_id; error = fb_queue(fmp->dev, fbuf); fb_delete(fbuf); @@ -358,7 +358,7 @@ fusefs_access(void *v) p = ap->a_p; cred = p->p_ucred; ip = VTOI(ap->a_vp); - fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)ip->i_ump; /* * Only user that mounted the file system can access it unless @@ -409,7 +409,7 @@ fusefs_getattr(void *v) int error = 0; ip = VTOI(vp); - fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)ip->i_ump; /* * Only user that mounted the file system can access it unless @@ -427,7 +427,7 @@ fusefs_getattr(void *v) vap->va_uid = fmp->mp->mnt_stat.f_owner; vap->va_gid = fmp->mp->mnt_stat.f_owner; vap->va_fsid = fmp->mp->mnt_stat.f_fsid.val[0]; - vap->va_fileid = ip->ufs_ino.i_number; + vap->va_fileid = ip->i_number; vap->va_size = S_BLKSIZE; vap->va_blocksize = S_BLKSIZE; vap->va_atime.tv_sec = fmp->mp->mnt_stat.f_ctime; @@ -441,7 +441,7 @@ fusefs_getattr(void *v) if (!fmp->sess_init) return (ENXIO); - fbuf = fb_setup(0, ip->ufs_ino.i_number, FBT_GETATTR, p); + fbuf = fb_setup(0, ip->i_number, FBT_GETATTR, p); error = fb_queue(fmp->dev, fbuf); if (error) { @@ -485,7 +485,7 @@ fusefs_setattr(void *v) struct fb_io *io; int error = 0; - fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)ip->i_ump; /* * Check for unsettable attributes. */ @@ -501,7 +501,7 @@ fusefs_setattr(void *v) if (fmp->undef_op & UNDEF_SETATTR) return (ENOSYS); - fbuf = fb_setup(sizeof(*io), ip->ufs_ino.i_number, FBT_SETATTR, p); + fbuf = fb_setup(sizeof(*io), ip->i_number, FBT_SETATTR, p); io = fbtod(fbuf, struct fb_io *); io->fi_flags = 0; @@ -634,7 +634,7 @@ fusefs_link(void *v) ip = VTOI(vp); dip = VTOI(dvp); - fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)ip->i_ump; if (!fmp->sess_init) { VOP_ABORTOP(dvp, cnp); @@ -651,10 +651,10 @@ fusefs_link(void *v) goto out2; } - fbuf = fb_setup(cnp->cn_namelen + 1, dip->ufs_ino.i_number, + fbuf = fb_setup(cnp->cn_namelen + 1, dip->i_number, FBT_LINK, p); - fbuf->fb_io_ino = ip->ufs_ino.i_number; + fbuf->fb_io_ino = ip->i_number; memcpy(fbuf->fb_dat, cnp->cn_nameptr, cnp->cn_namelen); fbuf->fb_dat[cnp->cn_namelen] = '\0'; @@ -698,7 +698,7 @@ fusefs_symlink(void *v) int len; dp = VTOI(dvp); - fmp = (struct fusefs_mnt *)dp->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)dp->i_ump; if (!fmp->sess_init) { error = ENXIO; @@ -712,7 +712,7 @@ fusefs_symlink(void *v) len = strlen(target) + 1; - fbuf = fb_setup(len + cnp->cn_namelen + 1, dp->ufs_ino.i_number, + fbuf = fb_setup(len + cnp->cn_namelen + 1, dp->i_number, FBT_SYMLINK, p); memcpy(fbuf->fb_dat, cnp->cn_nameptr, cnp->cn_namelen); @@ -764,7 +764,7 @@ fusefs_readdir(void *v) p = uio->uio_procp; ip = VTOI(vp); - fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)ip->i_ump; if (!fmp->sess_init) return (ENXIO); @@ -781,7 +781,7 @@ fusefs_readdir(void *v) } while (uio->uio_resid > 0) { - fbuf = fb_setup(0, ip->ufs_ino.i_number, FBT_READDIR, p); + fbuf = fb_setup(0, ip->i_number, FBT_READDIR, p); fbuf->fb_io_fd = ip->fufh[FUFH_RDONLY].fh_id; fbuf->fb_io_off = uio->uio_offset; @@ -865,7 +865,7 @@ fusefs_inactive(void *v) struct fusefs_mnt *fmp; int type, flags; - fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)ip->i_ump; /* Close all open file handles. */ for (type = 0; type < FUFH_MAXTYPE; type++) { @@ -912,7 +912,7 @@ fusefs_readlink(void *v) int error = 0; ip = VTOI(vp); - fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)ip->i_ump; uio = ap->a_uio; p = uio->uio_procp; @@ -922,7 +922,7 @@ fusefs_readlink(void *v) if (fmp->undef_op & UNDEF_READLINK) return (ENOSYS); - fbuf = fb_setup(0, ip->ufs_ino.i_number, FBT_READLINK, p); + fbuf = fb_setup(0, ip->i_number, FBT_READLINK, p); error = fb_queue(fmp->dev, fbuf); @@ -952,7 +952,7 @@ fusefs_reclaim(void *v) struct fusebuf *fbuf; int type, error = 0; - fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)ip->i_ump; /* Close opened files. */ for (type = 0; type < FUFH_MAXTYPE; type++) { @@ -967,8 +967,8 @@ fusefs_reclaim(void *v) /* * If the fuse connection is opened ask libfuse to free the vnodes. */ - if (fmp->sess_init && ip->ufs_ino.i_number != FUSE_ROOTINO) { - fbuf = fb_setup(0, ip->ufs_ino.i_number, FBT_RECLAIM, p); + if (fmp->sess_init && ip->i_number != FUSE_ROOTINO) { + fbuf = fb_setup(0, ip->i_number, FBT_RECLAIM, p); error = fb_queue(fmp->dev, fbuf); if (error) printf("fusefs: vnode reclaim failed: %d\n", error); @@ -978,7 +978,7 @@ fusefs_reclaim(void *v) /* * Remove the inode from its hash chain. */ - ufs_ihashrem(&ip->ufs_ino); + fuse_ihashrem(ip); free(ip, M_FUSEFS, sizeof(*ip)); vp->v_data = NULL; @@ -996,7 +996,7 @@ fusefs_print(void *v) struct fusefs_node *ip = VTOI(vp); /* Complete the information given by vprint(). */ - printf("tag VT_FUSE, hash id %u ", ip->ufs_ino.i_number); + printf("tag VT_FUSE, hash id %llu ", ip->i_number); printf("\n"); #endif return (0); @@ -1019,7 +1019,7 @@ fusefs_create(void *v) mode_t mode; ip = VTOI(dvp); - fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)ip->i_ump; mode = MAKEIMODE(vap->va_type, vap->va_mode); if (!fmp->sess_init) { @@ -1032,7 +1032,7 @@ fusefs_create(void *v) return (ENOSYS); } - fbuf = fb_setup(cnp->cn_namelen + 1, ip->ufs_ino.i_number, + fbuf = fb_setup(cnp->cn_namelen + 1, ip->i_number, FBT_MKNOD, p); fbuf->fb_io_mode = mode; @@ -1077,7 +1077,7 @@ fusefs_mknod(void *v) int error = 0; ip = VTOI(dvp); - fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)ip->i_ump; if (!fmp->sess_init) { VOP_ABORTOP(dvp, cnp); @@ -1089,7 +1089,7 @@ fusefs_mknod(void *v) return (ENOSYS); } - fbuf = fb_setup(cnp->cn_namelen + 1, ip->ufs_ino.i_number, + fbuf = fb_setup(cnp->cn_namelen + 1, ip->i_number, FBT_MKNOD, p); fbuf->fb_io_mode = MAKEIMODE(vap->va_type, vap->va_mode); @@ -1143,7 +1143,7 @@ fusefs_read(void *v) int error=0; ip = VTOI(vp); - fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)ip->i_ump; if (!fmp->sess_init) return (ENXIO); @@ -1153,7 +1153,7 @@ fusefs_read(void *v) return (EINVAL); while (uio->uio_resid > 0) { - fbuf = fb_setup(0, ip->ufs_ino.i_number, FBT_READ, p); + fbuf = fb_setup(0, ip->i_number, FBT_READ, p); size = MIN(uio->uio_resid, fmp->max_read); fbuf->fb_io_fd = fusefs_fd_get(ip, FUFH_RDONLY); @@ -1197,7 +1197,7 @@ fusefs_write(void *v) int error=0; ip = VTOI(vp); - fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)ip->i_ump; if (!fmp->sess_init) return (ENXIO); @@ -1213,7 +1213,7 @@ fusefs_write(void *v) while (uio->uio_resid > 0) { len = MIN(uio->uio_resid, fmp->max_read); - fbuf = fb_setup(len, ip->ufs_ino.i_number, FBT_WRITE, p); + fbuf = fb_setup(len, ip->i_number, FBT_WRITE, p); fbuf->fb_io_fd = fusefs_fd_get(ip, FUFH_WRONLY); fbuf->fb_io_off = uio->uio_offset; @@ -1305,7 +1305,7 @@ abortit: goto abortit; dp = VTOI(fdvp); ip = VTOI(fvp); - fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)ip->i_ump; /* * Be sure we are not renaming ".", "..", or an alias of ".". This @@ -1341,14 +1341,14 @@ abortit: } fbuf = fb_setup(fcnp->cn_namelen + tcnp->cn_namelen + 2, - dp->ufs_ino.i_number, FBT_RENAME, p); + dp->i_number, FBT_RENAME, p); memcpy(fbuf->fb_dat, fcnp->cn_nameptr, fcnp->cn_namelen); fbuf->fb_dat[fcnp->cn_namelen] = '\0'; memcpy(fbuf->fb_dat + fcnp->cn_namelen + 1, tcnp->cn_nameptr, tcnp->cn_namelen); fbuf->fb_dat[fcnp->cn_namelen + tcnp->cn_namelen + 1] = '\0'; - fbuf->fb_io_ino = VTOI(tdvp)->ufs_ino.i_number; + fbuf->fb_io_ino = VTOI(tdvp)->i_number; error = fb_queue(fmp->dev, fbuf); @@ -1394,7 +1394,7 @@ fusefs_mkdir(void *v) int error = 0; ip = VTOI(dvp); - fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)ip->i_ump; if (!fmp->sess_init) { @@ -1407,7 +1407,7 @@ fusefs_mkdir(void *v) goto out; } - fbuf = fb_setup(cnp->cn_namelen + 1, ip->ufs_ino.i_number, + fbuf = fb_setup(cnp->cn_namelen + 1, ip->i_number, FBT_MKDIR, p); fbuf->fb_io_mode = MAKEIMODE(vap->va_type, vap->va_mode); @@ -1454,7 +1454,7 @@ fusefs_rmdir(void *v) ip = VTOI(vp); dp = VTOI(dvp); - fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)ip->i_ump; if (!fmp->sess_init) { error = ENXIO; @@ -1468,7 +1468,7 @@ fusefs_rmdir(void *v) VN_KNOTE(dvp, NOTE_WRITE | NOTE_LINK); - fbuf = fb_setup(cnp->cn_namelen + 1, dp->ufs_ino.i_number, + fbuf = fb_setup(cnp->cn_namelen + 1, dp->i_number, FBT_RMDIR, p); memcpy(fbuf->fb_dat, cnp->cn_nameptr, cnp->cn_namelen); fbuf->fb_dat[cnp->cn_namelen] = '\0'; @@ -1514,7 +1514,7 @@ fusefs_remove(void *v) ip = VTOI(vp); dp = VTOI(dvp); - fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)ip->i_ump; if (!fmp->sess_init) { error = ENXIO; @@ -1526,7 +1526,7 @@ fusefs_remove(void *v) goto out; } - fbuf = fb_setup(cnp->cn_namelen + 1, dp->ufs_ino.i_number, + fbuf = fb_setup(cnp->cn_namelen + 1, dp->i_number, FBT_UNLINK, p); memcpy(fbuf->fb_dat, cnp->cn_nameptr, cnp->cn_namelen); fbuf->fb_dat[cnp->cn_namelen] = '\0'; @@ -1560,7 +1560,7 @@ fusefs_lock(void *v) struct vop_lock_args *ap = v; struct vnode *vp = ap->a_vp; - return rrw_enter(&VTOI(vp)->ufs_ino.i_lock, ap->a_flags & LK_RWFLAGS); + return rrw_enter(&VTOI(vp)->i_lock, ap->a_flags & LK_RWFLAGS); } int @@ -1569,7 +1569,7 @@ fusefs_unlock(void *v) struct vop_unlock_args *ap = v; struct vnode *vp = ap->a_vp; - rrw_exit(&VTOI(vp)->ufs_ino.i_lock); + rrw_exit(&VTOI(vp)->i_lock); return 0; } @@ -1578,7 +1578,7 @@ fusefs_islocked(void *v) { struct vop_islocked_args *ap = v; - return rrw_status(&VTOI(ap->a_vp)->ufs_ino.i_lock); + return rrw_status(&VTOI(ap->a_vp)->i_lock); } int @@ -1587,7 +1587,7 @@ fusefs_advlock(void *v) struct vop_advlock_args *ap = v; struct fusefs_node *ip = VTOI(ap->a_vp); - return (lf_advlock(&ip->ufs_ino.i_lockf, ip->filesize, ap->a_id, + return (lf_advlock(&ip->i_lockf, ip->filesize, ap->a_id, ap->a_op, ap->a_fl, ap->a_flags)); } @@ -1611,7 +1611,7 @@ fusefs_fsync(void *v) return (0); ip = VTOI(vp); - fmp = (struct fusefs_mnt *)ip->ufs_ino.i_ump; + fmp = (struct fusefs_mnt *)ip->i_ump; if (!fmp->sess_init) return (ENXIO); @@ -1626,7 +1626,7 @@ fusefs_fsync(void *v) if (fufh->fh_type == FUFH_WRONLY || fufh->fh_type == FUFH_RDWR) { - fbuf = fb_setup(0, ip->ufs_ino.i_number, FBT_FSYNC, p); + fbuf = fb_setup(0, ip->i_number, FBT_FSYNC, p); fbuf->fb_io_fd = fufh->fh_id; /* Always behave as if ap->a_waitfor = MNT_WAIT. */ diff --git a/sys/miscfs/fuse/fusefs_node.h b/sys/miscfs/fuse/fusefs_node.h index 3436c84ae..ed0bda66d 100644 --- a/sys/miscfs/fuse/fusefs_node.h +++ b/sys/miscfs/fuse/fusefs_node.h @@ -1,4 +1,4 @@ -/* $OpenBSD: fusefs_node.h,v 1.4 2016/09/07 17:53:35 natano Exp $ */ +/* $OpenBSD: fusefs_node.h,v 1.5 2024/10/31 13:55:21 claudio Exp $ */ /* * Copyright (c) 2012-2013 Sylvestre Gallon * @@ -18,9 +18,7 @@ #ifndef _FUSEFS_NODE_H_ #define _FUSEFS_NODE_H_ -#include -#include -#include +#include enum fufh_type { FUFH_INVALID = -1, @@ -35,26 +33,38 @@ struct fusefs_filehandle { enum fufh_type fh_type; }; +struct fusefs_mnt; struct fusefs_node { - struct inode ufs_ino; + LIST_ENTRY(fusefs_node) i_hash; /* Hash chain */ + struct vnode *i_vnode;/* Vnode associated with this inode. */ + struct fusefs_mnt *i_ump; + dev_t i_dev; /* Device associated with the inode. */ + ino_t i_number; /* The identity of the inode. */ + struct lockf_state *i_lockf; /* Byte-level lock state. */ + struct rrwlock i_lock; /* Inode lock */ /** I/O **/ struct fusefs_filehandle fufh[FUFH_MAXTYPE]; /** meta **/ - off_t filesize; + off_t filesize; }; #ifdef ITOV # undef ITOV #endif -#define ITOV(ip) ((ip)->ufs_ino.i_vnode) +#define ITOV(ip) ((ip)->i_vnode) #ifdef VTOI # undef VTOI #endif #define VTOI(vp) ((struct fusefs_node *)(vp)->v_data) +void fuse_ihashinit(void); +struct vnode *fuse_ihashget(dev_t, ino_t); +int fuse_ihashins(struct fusefs_node *); +void fuse_ihashrem(struct fusefs_node *); + uint64_t fusefs_fd_get(struct fusefs_node *, enum fufh_type); #endif /* _FUSEFS_NODE_H_ */ diff --git a/sys/net/af_frame.c b/sys/net/af_frame.c new file mode 100644 index 000000000..4a512ea3a --- /dev/null +++ b/sys/net/af_frame.c @@ -0,0 +1,62 @@ +/* $OpenBSD: af_frame.c,v 1.2 2025/01/05 12:36:48 bluhm Exp $ */ + +/* + * Copyright (c) 2024 David Gwynne + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +const struct domain framedomain; + +/* reach over to if_ethersubr.c */ +int ether_frm_ctloutput(int, struct socket *, int, int, struct mbuf *); +extern const struct pr_usrreqs ether_frm_usrreqs; + +static const struct protosw framesw[] = { + { + .pr_type = SOCK_DGRAM, + .pr_domain = &framedomain, + .pr_protocol = IFT_ETHER, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPINPUT, + + .pr_ctloutput = ether_frm_ctloutput, + .pr_usrreqs = ðer_frm_usrreqs, + .pr_sysctl = NULL /* ether_frm_sysctl */, + }, +}; + +const struct domain framedomain = { + .dom_family = AF_FRAME, + .dom_name = "frame", + .dom_protosw = framesw, + .dom_protoswNPROTOSW = &framesw[nitems(framesw)], +}; + +void +af_frameattach(int n) +{ + /* nop */ +} diff --git a/sys/net/bpf.c b/sys/net/bpf.c index d77ad57ac..30f25de49 100644 --- a/sys/net/bpf.c +++ b/sys/net/bpf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bpf.c,v 1.225 2024/08/15 12:20:20 dlg Exp $ */ +/* $OpenBSD: bpf.c,v 1.229 2024/12/30 02:46:00 guenther Exp $ */ /* $NetBSD: bpf.c,v 1.33 1997/02/21 23:59:35 thorpej Exp $ */ /* @@ -98,8 +98,8 @@ int bpf_maxbufsize = BPF_MAXBUFSIZE; /* [a] */ * bpf_iflist is the list of interfaces; each corresponds to an ifnet * bpf_d_list is the list of descriptors */ -struct bpf_if *bpf_iflist; -LIST_HEAD(, bpf_d) bpf_d_list; +TAILQ_HEAD(, bpf_if) bpf_iflist = TAILQ_HEAD_INITIALIZER(bpf_iflist); +LIST_HEAD(, bpf_d) bpf_d_list = LIST_HEAD_INITIALIZER(bpf_d_list); int bpf_allocbufs(struct bpf_d *); void bpf_ifname(struct bpf_if*, struct ifreq *); @@ -369,7 +369,6 @@ bpf_detachd(struct bpf_d *d) void bpfilterattach(int n) { - LIST_INIT(&bpf_d_list); } /* @@ -1074,10 +1073,6 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p) (BPF_DIRECTION_IN|BPF_DIRECTION_OUT); break; - case FIONBIO: /* Non-blocking I/O */ - /* let vfs to keep track of this */ - break; - case FIOASYNC: /* Send signal on receive packets */ d->bd_async = *(int *)addr; break; @@ -1181,22 +1176,19 @@ bpf_setf(struct bpf_d *d, struct bpf_program *fp, u_long cmd) int bpf_setif(struct bpf_d *d, struct ifreq *ifr) { - struct bpf_if *bp, *candidate = NULL; + struct bpf_if *bp; int error = 0; /* * Look through attached interfaces for the named one. */ - for (bp = bpf_iflist; bp != NULL; bp = bp->bif_next) { - if (strcmp(bp->bif_name, ifr->ifr_name) != 0) - continue; - - if (candidate == NULL || candidate->bif_dlt > bp->bif_dlt) - candidate = bp; + TAILQ_FOREACH(bp, &bpf_iflist, bif_next) { + if (strcmp(bp->bif_name, ifr->ifr_name) == 0) + break; } /* Not found. */ - if (candidate == NULL) + if (bp == NULL) return (ENXIO); /* @@ -1209,12 +1201,12 @@ bpf_setif(struct bpf_d *d, struct ifreq *ifr) if ((error = bpf_allocbufs(d))) goto out; } - if (candidate != d->bd_bif) { + if (bp != d->bd_bif) { /* * Detach if attached to something else. */ bpf_detachd(d); - bpf_attachd(d, candidate); + bpf_attachd(d, bp); } bpf_resetd(d); out: @@ -1742,8 +1734,7 @@ bpfsattach(caddr_t *bpfp, const char *name, u_int dlt, u_int hdrlen) bp->bif_ifp = NULL; bp->bif_dlt = dlt; - bp->bif_next = bpf_iflist; - bpf_iflist = bp; + TAILQ_INSERT_TAIL(&bpf_iflist, bp, bif_next); *bp->bif_driverp = NULL; @@ -1775,8 +1766,7 @@ bpfdetach(struct ifnet *ifp) KERNEL_ASSERT_LOCKED(); - for (bp = bpf_iflist; bp; bp = nbp) { - nbp = bp->bif_next; + TAILQ_FOREACH_SAFE(bp, &bpf_iflist, bif_next, nbp) { if (bp->bif_ifp == ifp) bpfsdetach(bp); } @@ -1786,7 +1776,7 @@ bpfdetach(struct ifnet *ifp) void bpfsdetach(void *p) { - struct bpf_if *bp = p, *tbp; + struct bpf_if *bp = p; struct bpf_d *bd; int maj; @@ -1798,19 +1788,13 @@ bpfsdetach(void *p) break; while ((bd = SMR_SLIST_FIRST_LOCKED(&bp->bif_dlist))) { + bpf_get(bd); vdevgone(maj, bd->bd_unit, bd->bd_unit, VCHR); klist_invalidate(&bd->bd_klist); + bpf_put(bd); } - for (tbp = bpf_iflist; tbp; tbp = tbp->bif_next) { - if (tbp->bif_next == bp) { - tbp->bif_next = bp->bif_next; - break; - } - } - - if (bpf_iflist == bp) - bpf_iflist = bp->bif_next; + TAILQ_REMOVE(&bpf_iflist, bp, bif_next); free(bp, M_DEVBUF, sizeof(*bp)); } @@ -1863,7 +1847,7 @@ bpf_getdltlist(struct bpf_d *d, struct bpf_dltlist *bfl) name = d->bd_bif->bif_name; n = 0; error = 0; - for (bp = bpf_iflist; bp != NULL; bp = bp->bif_next) { + TAILQ_FOREACH(bp, &bpf_iflist, bif_next) { if (strcmp(name, bp->bif_name) != 0) continue; if (bfl->bfl_list != NULL) { @@ -1894,7 +1878,7 @@ bpf_setdlt(struct bpf_d *d, u_int dlt) if (d->bd_bif->bif_dlt == dlt) return (0); name = d->bd_bif->bif_name; - for (bp = bpf_iflist; bp != NULL; bp = bp->bif_next) { + TAILQ_FOREACH(bp, &bpf_iflist, bif_next) { if (strcmp(name, bp->bif_name) != 0) continue; if (bp->bif_dlt == dlt) diff --git a/sys/net/bpfdesc.h b/sys/net/bpfdesc.h index 4b558c4eb..5c7148d97 100644 --- a/sys/net/bpfdesc.h +++ b/sys/net/bpfdesc.h @@ -1,4 +1,4 @@ -/* $OpenBSD: bpfdesc.h,v 1.49 2024/08/15 12:20:20 dlg Exp $ */ +/* $OpenBSD: bpfdesc.h,v 1.50 2024/11/19 23:26:35 dlg Exp $ */ /* $NetBSD: bpfdesc.h,v 1.11 1995/09/27 18:30:42 thorpej Exp $ */ /* @@ -114,7 +114,7 @@ struct bpf_d { * Descriptor associated with each attached hardware interface. */ struct bpf_if { - struct bpf_if *bif_next; /* list of all interfaces */ + TAILQ_ENTRY(bpf_if) bif_next; /* list of all interfaces */ SMR_SLIST_HEAD(, bpf_d) bif_dlist; /* descriptor list */ struct bpf_if **bif_driverp; /* pointer into softc */ u_int bif_dlt; /* link layer type */ diff --git a/sys/net/fq_codel.c b/sys/net/fq_codel.c index 297280bf9..5b89978e2 100644 --- a/sys/net/fq_codel.c +++ b/sys/net/fq_codel.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fq_codel.c,v 1.15 2022/01/02 22:36:03 jsg Exp $ */ +/* $OpenBSD: fq_codel.c,v 1.16 2024/10/29 23:25:45 dlg Exp $ */ /* * Copyright (c) 2017 Mike Belopuhov @@ -292,15 +292,6 @@ codel_freeparams(struct codel_params *cp) cp->intervals = NULL; } -static inline void -codel_gettime(int64_t *now) -{ - struct timespec tv; - - nanouptime(&tv); - *now = tv.tv_sec * 1000000000LL + tv.tv_nsec; -} - static inline unsigned int codel_backlog(struct codel *cd) { @@ -543,7 +534,7 @@ fqcodel_enq(struct fqcodel *fqc, struct mbuf *m) if (flow == NULL) return (m); - codel_gettime(&now); + now = nsecuptime(); codel_enqueue(&flow->cd, now, m); fqc->qlength++; @@ -650,7 +641,7 @@ fqcodel_deq_begin(struct fqcodel *fqc, void **cookiep, if ((fqc->flags & FQCF_FIXED_QUANTUM) == 0) fqc->quantum = fqc->ifp->if_mtu + max_linkhdr; - codel_gettime(&now); + now = nsecuptime(); for (flow = first_flow(fqc, &fq); flow != NULL; flow = next_flow(fqc, flow, &fq)) { diff --git a/sys/net/frame.h b/sys/net/frame.h new file mode 100644 index 000000000..dc584e5f4 --- /dev/null +++ b/sys/net/frame.h @@ -0,0 +1,47 @@ +/* $OpenBSD: frame.h,v 1.1 2024/12/15 11:00:05 dlg Exp $ */ + +/* + * Copyright (c) 2024 David Gwynne + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _NET_FRAME_H_ +#define _NET_FRAME_H_ + +#define FRAME_ADDRLEN 8 /* big enough for Ethernet */ +#define FRAME_DATALEN 32 + +struct sockaddr_frame { + uint8_t sfrm_len; + uint8_t sfrm_family; /* AF_FRAME */ + uint16_t sfrm_proto; + unsigned int sfrm_ifindex; + uint8_t sfrm_addr[FRAME_ADDRLEN]; + char sfrm_ifname[IFNAMSIZ]; + uint8_t sfrm_data[FRAME_DATALEN]; +}; + +#define FRAME_RECVDSTADDR 0 /* int */ +#define FRAME_RECVPRIO 1 /* int */ +#define FRAME_ADD_MEMBERSHIP 64 /* struct frame_mreq */ +#define FRAME_DEL_MEMBERSHIP 65 /* struct frame_mreq */ +#define FRAME_SENDPRIO 66 /* int: IF_HDRPRIO_{MIN-MAX,PACKET} */ + +struct frame_mreq { + unsigned int fmr_ifindex; + uint8_t fmr_addr[FRAME_ADDRLEN]; + char fmr_ifname[IFNAMSIZ]; +}; + +#endif /* _NET_FRAME_H_ */ diff --git a/sys/net/hfsc.c b/sys/net/hfsc.c index 88f150ed2..821325115 100644 --- a/sys/net/hfsc.c +++ b/sys/net/hfsc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: hfsc.c,v 1.49 2023/04/11 00:45:09 jsg Exp $ */ +/* $OpenBSD: hfsc.c,v 1.50 2024/10/29 23:57:54 dlg Exp $ */ /* * Copyright (c) 2012-2013 Henning Brauer @@ -248,11 +248,12 @@ void hfsc_rtsc_min(struct hfsc_runtime_sc *, void hfsc_getclstats(struct hfsc_class_stats *, struct hfsc_class *); struct hfsc_class *hfsc_clh2cph(struct hfsc_if *, u_int32_t); -#define HFSC_CLK_SHIFT 8 -#define HFSC_FREQ (1000000 << HFSC_CLK_SHIFT) -#define HFSC_CLK_PER_TICK (HFSC_FREQ / hz) +#define HFSC_FREQ 1000000000LL +#define HFSC_CLK_PER_TICK tick_nsec #define HFSC_HT_INFINITY 0xffffffffffffffffLL /* infinite time value */ +#define hfsc_uptime() nsecuptime() + struct pool hfsc_class_pl, hfsc_internal_sc_pl; /* @@ -345,16 +346,6 @@ hfsc_class_purge(struct hfsc_class *cl, struct mbuf_list *ml) return cl->cl_qops->pfq_purge(cl->cl_qdata, ml); } -u_int64_t -hfsc_microuptime(void) -{ - struct timeval tv; - - microuptime(&tv); - return (((u_int64_t)(tv.tv_sec) * 1000000 + tv.tv_usec) << - HFSC_CLK_SHIFT); -} - static inline u_int hfsc_more_slots(u_int current) { @@ -845,7 +836,7 @@ hfsc_deq_begin(struct ifqueue *ifq, void **cookiep) struct mbuf *m; u_int64_t cur_time; - cur_time = hfsc_microuptime(); + cur_time = hfsc_uptime(); /* * if there are eligible classes, use real-time criteria. @@ -1007,7 +998,7 @@ hfsc_init_ed(struct hfsc_if *hif, struct hfsc_class *cl, int next_len) { u_int64_t cur_time; - cur_time = hfsc_microuptime(); + cur_time = hfsc_uptime(); /* update the deadline curve */ hfsc_rtsc_min(&cl->cl_deadline, cl->cl_rsc, cur_time, cl->cl_cumul); @@ -1114,7 +1105,7 @@ hfsc_init_vf(struct hfsc_class *cl, int len) if (cl->cl_usc != NULL) { /* class has upper limit curve */ if (cur_time == 0) - cur_time = hfsc_microuptime(); + cur_time = hfsc_uptime(); /* update the ulimit curve */ hfsc_rtsc_min(&cl->cl_ulimit, cl->cl_usc, cur_time, @@ -1701,7 +1692,7 @@ hfsc_getclstats(struct hfsc_class_stats *sp, struct hfsc_class *cl) sp->myfadj = cl->cl_myfadj; sp->vtadj = cl->cl_vtadj; - sp->cur_time = hfsc_microuptime(); + sp->cur_time = hfsc_uptime(); sp->machclk_freq = HFSC_FREQ; sp->qlength = hfsc_class_qlength(cl); diff --git a/sys/net/if_aggr.c b/sys/net/if_aggr.c index ca59131da..399c8efd3 100644 --- a/sys/net/if_aggr.c +++ b/sys/net/if_aggr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_aggr.c,v 1.46 2024/09/04 07:54:52 mglocker Exp $ */ +/* $OpenBSD: if_aggr.c,v 1.47 2024/12/18 01:56:05 dlg Exp $ */ /* * Copyright (c) 2019 The University of Queensland @@ -744,34 +744,23 @@ aggr_start(struct ifqueue *ifq) smr_read_leave(); } -static inline int -aggr_eh_is_slow(const struct ether_header *eh) +static inline struct mbuf * +aggr_input_control(struct aggr_port *p, struct mbuf *m) { - uint64_t dst; - - if (eh->ether_type != htons(ETHERTYPE_SLOW)) - return (0); - - dst = ether_addr_to_e64((struct ether_addr *)eh->ether_dhost); - return (dst == LACP_ADDR_SLOW_E64); -} - -static void -aggr_input(struct ifnet *ifp0, struct mbuf *m) -{ - struct arpcom *ac0 = (struct arpcom *)ifp0; - struct aggr_port *p = ac0->ac_trunkport; - struct aggr_softc *sc = p->p_aggr; - struct ifnet *ifp = &sc->sc_if; struct ether_header *eh; int hlen = sizeof(*eh); + uint16_t etype; + uint64_t dst; - if (!ISSET(ifp->if_flags, IFF_RUNNING)) - goto drop; + if (ISSET(m->m_flags, M_VLANTAG)) + return (m); eh = mtod(m, struct ether_header *); - if (!ISSET(m->m_flags, M_VLANTAG) && - __predict_false(aggr_eh_is_slow(eh))) { + etype = eh->ether_type; + dst = ether_addr_to_e64((struct ether_addr *)eh->ether_dhost); + + if (__predict_false(etype == htons(ETHERTYPE_SLOW) && + dst == LACP_ADDR_SLOW_E64)) { unsigned int rx_proto = AGGR_PROTO_RX_LACP; struct ether_slowproto_hdr *sph; int drop = 0; @@ -781,7 +770,7 @@ aggr_input(struct ifnet *ifp0, struct mbuf *m) m = m_pullup(m, hlen); if (m == NULL) { /* short++ */ - return; + return (NULL); } eh = mtod(m, struct ether_header *); } @@ -808,12 +797,46 @@ aggr_input(struct ifnet *ifp0, struct mbuf *m) goto drop; else task_add(systq, &p->p_rxm_task); - return; + return (NULL); + default: + break; + } + } else if (__predict_false(etype == htons(ETHERTYPE_LLDP) && + ETH64_IS_8021_RSVD(dst))) { + /* look at the last nibble of the 802.1 reserved address */ + switch (dst & 0xf) { + case 0x0: /* Nearest Customer Bridge */ + case 0x3: /* Non-TPMR Bridge */ + case 0xe: /* Nearest Bridge */ + p->p_input(p->p_ifp0, m); + return (NULL); default: break; } } + return (m); + +drop: + m_freem(m); + return (NULL); +} + +static void +aggr_input(struct ifnet *ifp0, struct mbuf *m) +{ + struct arpcom *ac0 = (struct arpcom *)ifp0; + struct aggr_port *p = ac0->ac_trunkport; + struct aggr_softc *sc = p->p_aggr; + struct ifnet *ifp = &sc->sc_if; + + if (!ISSET(ifp->if_flags, IFF_RUNNING)) + goto drop; + + m = aggr_input_control(p, m); + if (m == NULL) + return; + if (__predict_false(!p->p_collecting)) goto drop; diff --git a/sys/net/if_etherbridge.h b/sys/net/if_etherbridge.h index 19c732683..21d9b210c 100644 --- a/sys/net/if_etherbridge.h +++ b/sys/net/if_etherbridge.h @@ -1,4 +1,4 @@ -/* $OpenBSD: if_etherbridge.h,v 1.4 2021/07/05 04:17:41 dlg Exp $ */ +/* $OpenBSD: if_etherbridge.h,v 1.5 2024/11/04 00:13:15 jsg Exp $ */ /* * Copyright (c) 2018, 2021 David Gwynne @@ -99,10 +99,4 @@ int etherbridge_add_addr(struct etherbridge *, void *, int etherbridge_del_addr(struct etherbridge *, const struct ether_addr *); void etherbridge_flush(struct etherbridge *, uint32_t); -static inline unsigned int -etherbridge_num(const struct etherbridge *eb) -{ - return (eb->eb_num); -} - #endif /* _NET_ETHERBRIDGE_H_ */ diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c index a7c6d5b1e..5707070ef 100644 --- a/sys/net/if_ethersubr.c +++ b/sys/net/if_ethersubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_ethersubr.c,v 1.293 2024/02/14 22:41:48 bluhm Exp $ */ +/* $OpenBSD: if_ethersubr.c,v 1.295 2025/01/07 05:36:52 guenther Exp $ */ /* $NetBSD: if_ethersubr.c,v 1.19 1996/05/07 02:40:30 thorpej Exp $ */ /* @@ -140,6 +140,14 @@ didn't get a copy, you may request one from . #include #endif /* MPLS */ +#include "af_frame.h" +#if NAF_FRAME > 0 +#include + +static struct mbuf * + ether_frm_input(struct ifnet *, struct mbuf *, uint64_t, uint16_t); +#endif + /* #define ETHERDEBUG 1 */ #ifdef ETHERDEBUG int etherdebug = ETHERDEBUG; @@ -578,6 +586,9 @@ ether_input(struct ifnet *ifp, struct mbuf *m) return; #endif default: +#if NAF_FRAME > 0 + m = ether_frm_input(ifp, m, dst, etype); +#endif goto dropanyway; } @@ -1247,3 +1258,917 @@ ether_extract_headers(struct mbuf *m0, struct ether_extracted *ext) ext->tcp ? "tcp," : "", ext->udp ? "udp," : "", ext->iplen, ext->iphlen, ext->tcphlen, ext->paylen); } + +#if NAF_FRAME > 0 + +#include +#include +#include + +/* + * lock order is: + * + * - socket lock + * - ether_pcb_lock + * - socket buffer mtx + */ + +struct ether_pcb; + +struct ether_pcb_group { + TAILQ_ENTRY(ether_pcb_group) + epg_entry; + struct ether_pcb * + epg_pcb; + unsigned int epg_ifindex; + uint8_t epg_addr[ETHER_ADDR_LEN]; + struct task epg_hook; +}; + +TAILQ_HEAD(ether_pcb_groups, ether_pcb_group); + +struct ether_pcb { + TAILQ_ENTRY(ether_pcb) + ep_entry; + struct rwlock ep_lock; + + struct socket *ep_socket; + + uint64_t ep_laddr; + uint64_t ep_faddr; + unsigned int ep_ifindex; + uint16_t ep_etype; + + uint64_t ep_options; + int ep_txprio; + + struct ether_pcb_groups + ep_groups; +}; + +TAILQ_HEAD(ether_pcb_list, ether_pcb); + +static int ether_frm_attach(struct socket *, int, int); +static int ether_frm_detach(struct socket *); +static int ether_frm_bind(struct socket *, struct mbuf *, struct proc *); +static int ether_frm_connect(struct socket *, struct mbuf *); +static int ether_frm_disconnect(struct socket *); +static int ether_frm_shutdown(struct socket *); +static int ether_frm_send(struct socket *, struct mbuf *, struct mbuf *, + struct mbuf *); +static int ether_frm_sockaddr(struct socket *, struct mbuf *); +static int ether_frm_peeraddr(struct socket *, struct mbuf *); + +const struct pr_usrreqs ether_frm_usrreqs = { + .pru_attach = ether_frm_attach, + .pru_detach = ether_frm_detach, + .pru_bind = ether_frm_bind, + .pru_connect = ether_frm_connect, + .pru_disconnect = ether_frm_disconnect, + .pru_shutdown = ether_frm_shutdown, + .pru_send = ether_frm_send, + .pru_sockaddr = ether_frm_sockaddr, + .pru_peeraddr = ether_frm_peeraddr, +}; + +static struct rwlock ether_pcb_lock = RWLOCK_INITIALIZER("ethsocks"); +static struct ether_pcb_list ether_pcbs = TAILQ_HEAD_INITIALIZER(ether_pcbs); + +static int +ether_frm_valid_etype(uint16_t etype) +{ + switch (etype) { + case ETHERTYPE_LLDP: + case ETHERTYPE_EAPOL: + return (1); + } + + return (0); +} + +static int +ether_frm_nam2sfrm(struct sockaddr_frame **sfrmp, const struct mbuf *nam) +{ + struct sockaddr_frame *sfrm; + + if (nam->m_len != sizeof(*sfrm)) + return (EINVAL); + + sfrm = mtod(nam, struct sockaddr_frame *); + if (sfrm->sfrm_family != AF_FRAME) + return (EAFNOSUPPORT); + *sfrmp = sfrm; + return (0); +} + +static int +ether_frm_ifp(struct ifnet **ifpp, const struct sockaddr_frame *sfrm) +{ + struct ifnet *ifp; + + if (sfrm->sfrm_ifindex != 0) + ifp = if_get(sfrm->sfrm_ifindex); + else if (sfrm->sfrm_ifname[0] != '\0') { + KERNEL_LOCK(); + ifp = if_unit(sfrm->sfrm_ifname); + KERNEL_UNLOCK(); + } else { + *ifpp = NULL; + return (0); + } + + if (ifp == NULL) + return (ENXIO); + + if (ifp->if_type != IFT_ETHER) { + if_put(ifp); + return (EAFNOSUPPORT); + } + + *ifpp = ifp; + return (0); +} + +static int +ether_frm_attach(struct socket *so, int proto, int wait) +{ + struct ether_pcb *ep; + int error; + + if (so->so_pcb != NULL) + return (EINVAL); + + error = suser(curproc); + if (error != 0) + return (error); + + error = soreserve(so, MCLBYTES, MCLBYTES); + if (error != 0) + return (error); + + ep = malloc(sizeof(*ep), M_PCB, (wait ? M_WAITOK : M_NOWAIT) | M_ZERO); + if (ep == NULL) + return (ENOMEM); + + rw_init(&ep->ep_lock, "ethsock"); + + so->so_pcb = ep; + ep->ep_socket = so; /* shares a ref with the list */ + + ep->ep_txprio = IF_HDRPRIO_PACKET; + TAILQ_INIT(&ep->ep_groups); + + /* give the ref to the list */ + rw_enter_write(ðer_pcb_lock); + TAILQ_INSERT_TAIL(ðer_pcbs, ep, ep_entry); + rw_exit_write(ðer_pcb_lock); + + return (0); +} + +static int +ether_frm_detach(struct socket *so) +{ + struct ether_pcb *ep; + struct ether_pcb_group *epg, *nepg; + struct ifnet *ifp; + + soassertlocked(so); + + ep = so->so_pcb; + + /* take the ref from the list */ + rw_enter_write(ðer_pcb_lock); + TAILQ_REMOVE(ðer_pcbs, ep, ep_entry); + rw_exit_write(ðer_pcb_lock); + + so->so_pcb = NULL; /* shares a ref with the list */ + + /* XXX locking */ + TAILQ_FOREACH_SAFE(epg, &ep->ep_groups, epg_entry, nepg) { + ifp = if_get(epg->epg_ifindex); + if (ifp != NULL) { + struct ifreq ifr; + struct sockaddr *sa; + + if_detachhook_del(ifp, &epg->epg_hook); + + memset(&ifr, 0, sizeof(ifr)); + strlcpy(ifr.ifr_name, ifp->if_xname, + sizeof(ifr.ifr_name)); + sa = &ifr.ifr_addr; + sa->sa_family = AF_UNSPEC; + memcpy(sa->sa_data, &epg->epg_addr, ETHER_ADDR_LEN); + + (*ifp->if_ioctl)(ifp, SIOCDELMULTI, (caddr_t)&ifr); + } + if_put(ifp); + + TAILQ_REMOVE(&ep->ep_groups, epg, epg_entry); + free(epg, M_PCB, sizeof(*epg)); + } + + free(ep, M_PCB, sizeof(*ep)); + + return (0); +} + +static int +ether_frm_bind(struct socket *so, struct mbuf *nam, struct proc *p) +{ + struct sockaddr_frame *sfrm; + struct ether_pcb *ep; + struct ether_pcb *epe; + struct ifnet *ifp = NULL; + unsigned int ifindex = 0; + uint16_t etype; + uint64_t laddr; + int error; + + soassertlocked(so); + + error = ether_frm_nam2sfrm(&sfrm, nam); + if (error != 0) + return (error); + + etype = ntohs(sfrm->sfrm_proto); + if (!ether_frm_valid_etype(etype)) + return (EADDRNOTAVAIL); + + ep = so->so_pcb; + if (ep->ep_etype != 0) + return (EINVAL); + + error = ether_frm_ifp(&ifp, sfrm); + if (error != 0) + return (error); + if (ifp != NULL) + ifindex = ifp->if_index; + + laddr = ether_addr_to_e64((struct ether_addr *)sfrm->sfrm_addr); + + rw_enter_write(ðer_pcb_lock); + TAILQ_FOREACH(epe, ðer_pcbs, ep_entry) { + if (ep == epe) + continue; + + /* XXX check stuff */ + } + + if (error == 0) { + /* serialised by the socket lock */ + ep->ep_etype = etype; + ep->ep_ifindex = ifindex; + ep->ep_laddr = laddr; + } + rw_exit_write(ðer_pcb_lock); + + if_put(ifp); + return (error); +} + +static int +ether_frm_connect(struct socket *so, struct mbuf *nam) +{ + struct sockaddr_frame *sfrm; + struct ether_pcb *ep; + struct ether_pcb *epe; + struct ifnet *ifp = NULL; + uint64_t faddr; + uint16_t etype; + int error; + + soassertlocked(so); + + error = ether_frm_nam2sfrm(&sfrm, nam); + if (error != 0) + return (error); + + etype = ntohs(sfrm->sfrm_proto); + if (!ether_frm_valid_etype(etype)) + return (EADDRNOTAVAIL); + + faddr = ether_addr_to_e64((struct ether_addr *)sfrm->sfrm_addr); + if (faddr == 0) + return (EADDRNOTAVAIL); + + error = ether_frm_ifp(&ifp, sfrm); + if (error != 0) + return (error); + if (ifp == NULL) + return (EADDRNOTAVAIL); + + ep = so->so_pcb; + if (ep->ep_etype != 0) { + if (ep->ep_faddr != 0 || + ep->ep_etype != etype) { + error = EISCONN; + goto put; + } + } + if (ep->ep_ifindex != 0) { + if (ep->ep_ifindex != ifp->if_index) { + error = EADDRNOTAVAIL; + goto put; + } + } + + rw_enter_write(ðer_pcb_lock); + TAILQ_FOREACH(epe, ðer_pcbs, ep_entry) { + if (ep == epe) + continue; + /* XXX check stuff */ + } + + if (error == 0) { + /* serialised by the socket lock */ + ep->ep_etype = etype; + ep->ep_ifindex = ifp->if_index; + ep->ep_faddr = faddr; + } + rw_exit_write(ðer_pcb_lock); + +put: + if_put(ifp); + return (error); +} + +static int +ether_frm_disconnect(struct socket *so) +{ + struct ether_pcb *ep; + + soassertlocked(so); + + ep = so->so_pcb; + if (ep->ep_faddr == 0) + return (ENOTCONN); + + rw_enter_write(ðer_pcb_lock); + ep->ep_ifindex = 0; + ep->ep_etype = 0; + ep->ep_laddr = 0; + ep->ep_faddr = 0; + rw_exit_write(ðer_pcb_lock); + + return (0); +} + +static int +ether_frm_shutdown(struct socket *so) +{ + soassertlocked(so); + socantsendmore(so); + return (0); +} + +static int +ether_frm_send(struct socket *so, struct mbuf *m, struct mbuf *nam, + struct mbuf *control) +{ + struct ether_pcb *ep; + int error; + uint16_t etype; + uint64_t laddr; + uint64_t faddr; + struct ifnet *ifp = NULL; + struct arpcom *ac; + struct ether_header *eh; + int txprio; + + soassertlocked_readonly(so); + + ep = so->so_pcb; + KASSERTMSG(ep != NULL, "%s: NULL pcb on socket %p", __func__, so); + txprio = ep->ep_txprio; + + /* XXX get prio out of a cmsg */ + m_freem(control); + + if (nam != NULL) { + struct sockaddr_frame *sfrm; + + error = ether_frm_nam2sfrm(&sfrm, nam); + if (error != 0) + goto drop; + + etype = ntohs(sfrm->sfrm_proto); + if (!ether_frm_valid_etype(etype)) { + error = EADDRNOTAVAIL; + goto drop; + } + + if (ep->ep_faddr != 0) { + error = EISCONN; + goto drop; + } + faddr = ether_addr_to_e64((struct ether_addr *)sfrm->sfrm_addr); + if (faddr == 0) { + error = EADDRNOTAVAIL; + goto drop; + } + + error = ether_frm_ifp(&ifp, sfrm); + if (error != 0) + goto drop; + if (ifp == NULL) { + ifp = if_get(ep->ep_ifindex); + if (ifp == NULL) { + error = EADDRNOTAVAIL; + goto drop; + } + } else { + if (ep->ep_ifindex != 0 && + ep->ep_ifindex != ifp->if_index) { + error = EADDRNOTAVAIL; + goto drop; + } + } + + if (ep->ep_etype != etype) { + if (ep->ep_etype == 0) { + /* this is cheeky */ + rw_enter_write(ðer_pcb_lock); + ep->ep_etype = etype; + rw_exit_write(ðer_pcb_lock); + } else { + error = EADDRNOTAVAIL; + goto drop; + } + } + } else { + faddr = ep->ep_faddr; + if (faddr == 0) { + error = ENOTCONN; + goto drop; + } + + ifp = if_get(ep->ep_ifindex); + if (ifp == NULL) { + error = ENXIO; + goto drop; + } + + etype = ep->ep_etype; + } + + if (ifp->if_type != IFT_ETHER) { + error = EAFNOSUPPORT; + goto drop; + } + + ac = (struct arpcom *)ifp; + + laddr = ether_addr_to_e64((struct ether_addr *)ac->ac_enaddr); + if (ep->ep_laddr != laddr) { + if (ep->ep_laddr != 0) { + error = EADDRNOTAVAIL; + goto drop; + } + } + + m = m_prepend(m, ETHER_ALIGN + sizeof(*eh), M_NOWAIT); + if (m == NULL) + goto drop; + m_adj(m, ETHER_ALIGN); + + if (txprio != IF_HDRPRIO_PACKET) + m->m_pkthdr.pf.prio = txprio; + + eh = mtod(m, struct ether_header *); + ether_e64_to_addr((struct ether_addr *)eh->ether_dhost, faddr); + ether_e64_to_addr((struct ether_addr *)eh->ether_shost, laddr); + eh->ether_type = htons(etype); + + error = if_enqueue(ifp, m); + m = NULL; + +drop: + if_put(ifp); + m_freem(m); + return (error); +} + +static int +ether_frm_sockaddr_frame(struct ether_pcb *ep, struct mbuf *nam, uint64_t addr) +{ + struct sockaddr_frame *sfrm; + struct ifnet *ifp; + + nam->m_len = sizeof(*sfrm); + sfrm = mtod(nam, struct sockaddr_frame *); + memset(sfrm, 0, sizeof(*sfrm)); + sfrm->sfrm_len = sizeof(*sfrm); + sfrm->sfrm_family = AF_FRAME; + + ether_e64_to_addr((struct ether_addr *)sfrm->sfrm_addr, addr); + + if (ep->ep_etype) { + sfrm->sfrm_proto = htons(ep->ep_etype); + sfrm->sfrm_ifindex = ep->ep_ifindex; + + ifp = if_get(ep->ep_ifindex); + if (ifp != NULL) { + strlcpy(sfrm->sfrm_ifname, ifp->if_xname, + sizeof(sfrm->sfrm_ifname)); + } + if_put(ifp); + } + + return (0); +} + +static int +ether_frm_sockaddr(struct socket *so, struct mbuf *nam) +{ + struct ether_pcb *ep = so->so_pcb; + + return (ether_frm_sockaddr_frame(ep, nam, ep->ep_laddr)); +} + +static int +ether_frm_peeraddr(struct socket *so, struct mbuf *nam) +{ + struct ether_pcb *ep = so->so_pcb; + + return (ether_frm_sockaddr_frame(ep, nam, ep->ep_faddr)); +} + +static void +ether_frm_group_detach(void *arg) +{ + struct ether_pcb_group *epg = arg; + struct ether_pcb *ep = epg->epg_pcb; + struct socket *so = ep->ep_socket; + struct ifnet *ifp; + + ifp = if_get(epg->epg_ifindex); + + /* XXX locking^Wreference counts */ + solock(so); + if (ifp != NULL) + if_detachhook_del(ifp, &epg->epg_hook); + TAILQ_REMOVE(&ep->ep_groups, epg, epg_entry); + sounlock(so); + + if_put(ifp); + free(epg, M_PCB, sizeof(*epg)); +} + +static int +ether_frm_group(struct socket *so, int optname, struct mbuf *m) +{ + struct frame_mreq *fmr; + struct ifreq ifr; + struct sockaddr *sa; + struct ifnet *ifp; + struct ether_pcb *ep; + struct ether_pcb_group *epg; + u_long cmd; + int error; + + soassertlocked(so); + + if (m->m_len != sizeof(*fmr)) + return (EINVAL); + + fmr = mtod(m, struct frame_mreq *); + if (!ETHER_IS_MULTICAST(fmr->fmr_addr)) + return (EADDRNOTAVAIL); + + if (fmr->fmr_ifindex == 0) { + KERNEL_LOCK(); + ifp = if_unit(fmr->fmr_ifname); + KERNEL_UNLOCK(); + } else + ifp = if_get(fmr->fmr_ifindex); + if (ifp == NULL) + return (ENXIO); + + if (ifp->if_type != IFT_ETHER) { + error = EADDRNOTAVAIL; + goto put; + } + + if (ETHER_IS_BROADCAST(fmr->fmr_addr)) { + error = 0; + goto put; + } + + ep = so->so_pcb; + TAILQ_FOREACH(epg, &ep->ep_groups, epg_entry) { + if (epg->epg_ifindex != ifp->if_index) + continue; + if (!ETHER_IS_EQ(epg->epg_addr, fmr->fmr_addr)) + continue; + + break; + } + + switch (optname) { + case FRAME_ADD_MEMBERSHIP: + if (epg != NULL) { + error = EISCONN; + goto put; + } + epg = malloc(sizeof(*epg), M_PCB, M_DONTWAIT); + if (epg == NULL) { + error = ENOMEM; + goto put; + } + + epg->epg_pcb = ep; + epg->epg_ifindex = ifp->if_index; + memcpy(&epg->epg_addr, fmr->fmr_addr, sizeof(epg->epg_addr)); + task_set(&epg->epg_hook, ether_frm_group_detach, epg); + + cmd = SIOCADDMULTI; + break; + case FRAME_DEL_MEMBERSHIP: + if (epg == NULL) { + error = ENOTCONN; + goto put; + } + cmd = SIOCDELMULTI; + break; + default: + panic("%s: unexpected optname %d", __func__, optname); + /* NOTREACHED */ + } + + memset(&ifr, 0, sizeof(ifr)); + strlcpy(ifr.ifr_name, ifp->if_xname, sizeof(ifr.ifr_name)); + sa = &ifr.ifr_addr; + sa->sa_family = AF_UNSPEC; + memcpy(sa->sa_data, fmr->fmr_addr, ETHER_ADDR_LEN); + + /* XXX soref? */ + /* this could lead to multiple epgs for the same if/group */ + sounlock(so); + KERNEL_LOCK(); + NET_LOCK(); + error = (*ifp->if_ioctl)(ifp, cmd, (caddr_t)&ifr); + NET_UNLOCK(); + KERNEL_UNLOCK(); + solock(so); + + switch (optname) { + case FRAME_ADD_MEMBERSHIP: + if (error != 0) { + free(epg, M_PCB, sizeof(*epg)); + break; + } + + TAILQ_INSERT_TAIL(&ep->ep_groups, epg, epg_entry); + if_detachhook_add(ifp, &epg->epg_hook); + break; + case FRAME_DEL_MEMBERSHIP: + if (error != 0) + break; + + if_detachhook_del(ifp, &epg->epg_hook); + TAILQ_REMOVE(&ep->ep_groups, epg, epg_entry); + free(epg, M_PCB, sizeof(*epg)); + break; + } +put: + if_put(ifp); + + return (error); +} + +#define ETHER_PCB_OPTM(_v) (1ULL << (_v)) + +#define ETHER_PCB_OPTS \ + ETHER_PCB_OPTM(FRAME_RECVDSTADDR) | \ + ETHER_PCB_OPTM(FRAME_RECVPRIO) + +static int +ether_frm_setopt(struct ether_pcb *ep, int optname, struct mbuf *m) +{ + uint64_t optm = ETHER_PCB_OPTM(optname); + int opt; + + if (!ISSET(ETHER_PCB_OPTS, optm)) + return (ENOPROTOOPT); + + if (m->m_len != sizeof(opt)) + return (EINVAL); + + opt = *mtod(m, int *); + if (opt) + SET(ep->ep_options, optm); + else + CLR(ep->ep_options, optm); + + return (0); +} + +static int +ether_frm_setsockopt(struct socket *so, int optname, struct mbuf *m) +{ + struct ether_pcb *ep = so->so_pcb; + int error = ENOPROTOOPT; + int v; + + if (optname >= 0 && optname < 64) + return (ether_frm_setopt(ep, optname, m)); + + switch (optname) { + case FRAME_ADD_MEMBERSHIP: + case FRAME_DEL_MEMBERSHIP: + error = ether_frm_group(so, optname, m); + break; + case FRAME_SENDPRIO: + if (m->m_len != sizeof(v)) { + error = EINVAL; + break; + } + v = *mtod(m, int *); + error = if_txhprio_l2_check(v); + if (error != 0) + break; + ep->ep_txprio = v; + break; + + default: + break; + } + + return (error); +} + +static int +ether_frm_getopt(struct ether_pcb *ep, int optname, struct mbuf *m) +{ + uint64_t optm = ETHER_PCB_OPTM(optname); + int opt; + + if (!ISSET(ETHER_PCB_OPTS, optm)) + return (ENOPROTOOPT); + + opt = !!ISSET(ep->ep_options, optm); + + m->m_len = sizeof(opt); + *mtod(m, int *) = opt; + + return (0); +} + +static int +ether_frm_getsockopt(struct socket *so, int optname, struct mbuf *m) +{ + struct ether_pcb *ep = so->so_pcb; + int error = ENOPROTOOPT; + + if (optname >= 0 && optname < 64) + return (ether_frm_getopt(ep, optname, m)); + + switch (optname) { + default: + break; + } + + return (error); +} + +int +ether_frm_ctloutput(int op, struct socket *so, int level, int optname, + struct mbuf *m) +{ + int error = 0; + + if (level != IFT_ETHER) + return (EINVAL); + + switch (op) { + case PRCO_SETOPT: + error = ether_frm_setsockopt(so, optname, m); + break; + case PRCO_GETOPT: + error = ether_frm_getsockopt(so, optname, m); + break; + } + + return (error); +} + +static struct mbuf * +ether_frm_cmsg(struct mbuf *cmsgs, const void *data, size_t datalen, + int type, int level) +{ + struct mbuf *cm; + + cm = sbcreatecontrol(data, datalen, type, level); + if (cm != NULL) { + cm->m_next = cmsgs; + cmsgs = cm; + } + + return (cmsgs); +} + +static void +ether_frm_recv(struct socket *so, struct mbuf *m0, + const struct sockaddr_frame *sfrm) +{ + struct ether_pcb *ep = so->so_pcb; + struct mbuf *m; + struct mbuf *cmsgs = NULL; + int ok; + + /* offset 0 and m_adj cos sbappendaddr needs m_pkthdr.len */ + m = m_copym(m0, 0, M_COPYALL, M_DONTWAIT); + if (m == NULL) + return; + m_adj(m, sizeof(struct ether_header)); + + if (ISSET(ep->ep_options, ETHER_PCB_OPTM(FRAME_RECVPRIO))) { + int rxprio = m0->m_pkthdr.pf.prio; + cmsgs = ether_frm_cmsg(cmsgs, &rxprio, sizeof(rxprio), + FRAME_RECVPRIO, IFT_ETHER); + } + + if (ISSET(ep->ep_options, ETHER_PCB_OPTM(FRAME_RECVDSTADDR))) { + struct ether_header *eh = mtod(m0, struct ether_header *); + cmsgs = ether_frm_cmsg(cmsgs, eh->ether_dhost, ETHER_ADDR_LEN, + FRAME_RECVDSTADDR, IFT_ETHER); + } + + if (ISSET(so->so_options, SO_TIMESTAMP)) { + struct timeval tv; + m_microtime(m0, &tv); + cmsgs = ether_frm_cmsg(cmsgs, &tv, sizeof(tv), + SCM_TIMESTAMP, SOL_SOCKET); + } + + mtx_enter(&so->so_rcv.sb_mtx); + ok = sbappendaddr(so, &so->so_rcv, (struct sockaddr *)sfrm, m, cmsgs); + mtx_leave(&so->so_rcv.sb_mtx); + + if (!ok) { + m_freem(m); + m_freem(cmsgs); + return; + } + + sorwakeup(so); +} + +static struct mbuf * +ether_frm_input(struct ifnet *ifp, struct mbuf *m, uint64_t dst, uint16_t etype) +{ + struct sockaddr_frame sfrm = { .sfrm_family = AF_UNSPEC }; + struct ether_pcb *ep; + struct ether_header *eh; + uint64_t src; + + if (TAILQ_EMPTY(ðer_pcbs)) + return (m); + + eh = mtod(m, struct ether_header *); + src = ether_addr_to_e64((struct ether_addr *)eh->ether_shost); + if (src == 0) + return (m); + + rw_enter_read(ðer_pcb_lock); + TAILQ_FOREACH(ep, ðer_pcbs, ep_entry) { + if (ep->ep_etype == 0) /* bound? */ + continue; + if (ep->ep_etype != etype) + continue; + if (ep->ep_ifindex != 0) { + if (ep->ep_ifindex != ifp->if_index) + continue; + } + + if (ep->ep_laddr != 0) { + if (ep->ep_laddr != dst) + continue; + } + /* ether_input says dst is valid for local delivery */ + + if (ep->ep_faddr != 0) { /* connected? */ + if (ep->ep_faddr != src) + continue; + } + + if (sfrm.sfrm_family == AF_UNSPEC) { + sfrm.sfrm_len = sizeof(sfrm); + sfrm.sfrm_family = AF_FRAME; + sfrm.sfrm_proto = htons(etype); + sfrm.sfrm_ifindex = ifp->if_index; + ether_e64_to_addr((struct ether_addr *)sfrm.sfrm_addr, + src); + strlcpy(sfrm.sfrm_ifname, ifp->if_xname, + sizeof(sfrm.sfrm_ifname)); + } + + ether_frm_recv(ep->ep_socket, m, &sfrm); + } + rw_exit_read(ðer_pcb_lock); + + return (m); +} + +#endif /* NAF_FRAME */ diff --git a/sys/net/if_gre.c b/sys/net/if_gre.c index 94f3d89c5..8ea02bf9e 100644 --- a/sys/net/if_gre.c +++ b/sys/net/if_gre.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_gre.c,v 1.178 2023/12/23 10:52:54 bluhm Exp $ */ +/* $OpenBSD: if_gre.c,v 1.179 2024/12/04 18:20:46 mvs Exp $ */ /* $NetBSD: if_gre.c,v 1.9 1999/10/25 19:18:11 drochner Exp $ */ /* @@ -100,6 +100,11 @@ #include #include +/* + * Locks used to protect data: + * a atomic + */ + /* * packet formats */ @@ -545,8 +550,8 @@ struct eoip_tree eoip_tree = RBT_INITIALIZER(); * allowed as well. * */ -int gre_allow = 0; -int gre_wccp = 0; +int gre_allow = 0; /* [a] */ +int gre_wccp = 0; /* [a] */ void greattach(int n) @@ -1009,7 +1014,7 @@ gre_input_key(struct mbuf **mp, int *offp, int type, int af, uint8_t otos, int mcast = 0; uint8_t itos; - if (!gre_allow) + if (!atomic_load_int(&gre_allow)) goto decline; key->t_rtableid = m->m_pkthdr.ph_rtableid; @@ -1092,7 +1097,8 @@ gre_input_key(struct mbuf **mp, int *offp, int type, int af, uint8_t otos, * draft-wilson-wrec-wccp-v2-01.txt */ - if (!gre_wccp && !ISSET(ifp->if_flags, IFF_LINK0)) + if (!atomic_load_int(&gre_wccp) && + !ISSET(ifp->if_flags, IFF_LINK0)) goto decline; /* @@ -1494,7 +1500,7 @@ gre_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, struct m_tag *mtag; int error = 0; - if (!gre_allow) { + if (!atomic_load_int(&gre_allow)) { error = EACCES; goto drop; } @@ -1633,7 +1639,7 @@ mgre_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dest, sa_family_t af; const void *addr; - if (!gre_allow) { + if (!atomic_load_int(&gre_allow)) { error = EACCES; goto drop; } @@ -1785,7 +1791,7 @@ egre_start(struct ifnet *ifp) caddr_t if_bpf; #endif - if (!gre_allow) { + if (!atomic_load_int(&gre_allow)) { ifq_purge(&ifp->if_snd); return; } @@ -3642,7 +3648,7 @@ nvgre_start(struct ifnet *ifp) caddr_t if_bpf; #endif - if (!gre_allow) { + if (!atomic_load_int(&gre_allow)) { ifq_purge(&ifp->if_snd); return; } @@ -3833,7 +3839,7 @@ eoip_start(struct ifnet *ifp) caddr_t if_bpf; #endif - if (!gre_allow) { + if (!atomic_load_int(&gre_allow)) { ifq_purge(&ifp->if_snd); return; } @@ -4047,13 +4053,8 @@ int gre_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen) { - int error; - - NET_LOCK(); - error = sysctl_bounded_arr(gre_vars, nitems(gre_vars), name, + return sysctl_bounded_arr(gre_vars, nitems(gre_vars), name, namelen, oldp, oldlenp, newp, newlen); - NET_UNLOCK(); - return error; } static inline int diff --git a/sys/net/if_loop.c b/sys/net/if_loop.c index 6a22baf4b..72aad6653 100644 --- a/sys/net/if_loop.c +++ b/sys/net/if_loop.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_loop.c,v 1.98 2023/12/29 11:43:04 bluhm Exp $ */ +/* $OpenBSD: if_loop.c,v 1.99 2025/01/03 21:27:40 bluhm Exp $ */ /* $NetBSD: if_loop.c,v 1.15 1996/05/07 02:40:33 thorpej Exp $ */ /* @@ -277,8 +277,8 @@ looutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, void lortrequest(struct ifnet *ifp, int cmd, struct rtentry *rt) { - if (rt && rt->rt_mtu == 0) - rt->rt_mtu = LOMTU; + if (rt != NULL) + atomic_cas_uint(&rt->rt_mtu, 0, LOMTU); } /* diff --git a/sys/net/if_pfsync.c b/sys/net/if_pfsync.c index 8615534ab..6b26993f8 100644 --- a/sys/net/if_pfsync.c +++ b/sys/net/if_pfsync.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_pfsync.c,v 1.326 2024/05/24 06:38:41 sashan Exp $ */ +/* $OpenBSD: if_pfsync.c,v 1.330 2024/12/18 02:25:30 dlg Exp $ */ /* * Copyright (c) 2002 Michael Shalayeff diff --git a/sys/net/if_pppx.c b/sys/net/if_pppx.c index c077839cc..e1e3bee76 100644 --- a/sys/net/if_pppx.c +++ b/sys/net/if_pppx.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_pppx.c,v 1.131 2024/09/20 02:00:46 jsg Exp $ */ +/* $OpenBSD: if_pppx.c,v 1.133 2024/12/30 02:46:00 guenther Exp $ */ /* * Copyright (c) 2010 Claudio Jeker @@ -443,8 +443,6 @@ pppxioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p) (struct pipex_session_descr_req *)addr); break; - case FIONBIO: - break; case FIONREAD: *(int *)addr = mq_hdatalen(&pxd->pxd_svcq); break; @@ -562,7 +560,7 @@ pppxclose(dev_t dev, int flags, int mode, struct proc *p) mq_purge(&pxd->pxd_svcq); klist_free(&pxd->pxd_rklist); - klist_free(&pxd->pxd_rklist); + klist_free(&pxd->pxd_wklist); free(pxd, M_DEVBUF, sizeof(*pxd)); @@ -1220,8 +1218,6 @@ pppacioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct proc *p) int error = 0; switch (cmd) { - case FIONBIO: - break; case FIONREAD: *(int *)data = mq_hdatalen(&sc->sc_mq); break; diff --git a/sys/net/if_tun.c b/sys/net/if_tun.c index bd11b2b28..c0a52c4a0 100644 --- a/sys/net/if_tun.c +++ b/sys/net/if_tun.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_tun.c,v 1.243 2024/10/16 11:12:31 dlg Exp $ */ +/* $OpenBSD: if_tun.c,v 1.250 2024/12/30 02:46:00 guenther Exp $ */ /* $NetBSD: if_tun.c,v 1.24 1996/05/07 02:40:48 thorpej Exp $ */ /* @@ -88,6 +88,7 @@ struct tun_softc { struct sigio_ref sc_sigio; /* async I/O registration */ unsigned int sc_flags; /* misc flags */ #define TUN_DEAD (1 << 16) +#define TUN_HDR (1 << 17) dev_t sc_dev; struct refcnt sc_refs; @@ -104,6 +105,13 @@ int tundebug = TUN_DEBUG; /* Pretend that these IFF flags are changeable by TUNSIFINFO */ #define TUN_IFF_FLAGS (IFF_POINTOPOINT|IFF_MULTICAST|IFF_BROADCAST) +#define TUN_IF_CAPS ( \ + IFCAP_CSUM_IPv4 | \ + IFCAP_CSUM_TCPv4|IFCAP_CSUM_UDPv4|IFCAP_CSUM_TCPv6|IFCAP_CSUM_UDPv6 | \ + IFCAP_VLAN_MTU|IFCAP_VLAN_HWTAGGING|IFCAP_VLAN_HWOFFLOAD | \ + IFCAP_TSOv4|IFCAP_TSOv6|IFCAP_LRO \ +) + void tunattach(int); int tun_dev_open(dev_t, const struct if_clone *, int, struct proc *); @@ -496,10 +504,11 @@ tun_dev_close(dev_t dev, struct proc *p) */ NET_LOCK(); CLR(ifp->if_flags, IFF_UP | IFF_RUNNING); + CLR(ifp->if_capabilities, TUN_IF_CAPS); NET_UNLOCK(); ifq_purge(&ifp->if_snd); - CLR(sc->sc_flags, TUN_ASYNC); + CLR(sc->sc_flags, TUN_ASYNC|TUN_HDR); sigio_free(&sc->sc_sigio); if (!ISSET(sc->sc_flags, TUN_DEAD)) { @@ -627,6 +636,64 @@ tapioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p) return (tun_dev_ioctl(dev, cmd, data)); } +static int +tun_set_capabilities(struct tun_softc *sc, const struct tun_capabilities *cap) +{ + if (ISSET(cap->tun_if_capabilities, ~TUN_IF_CAPS)) + return (EINVAL); + + KERNEL_ASSERT_LOCKED(); + SET(sc->sc_flags, TUN_HDR); + + NET_LOCK(); + CLR(sc->sc_if.if_capabilities, TUN_IF_CAPS); + SET(sc->sc_if.if_capabilities, cap->tun_if_capabilities); + NET_UNLOCK(); + return (0); +} + +static int +tun_get_capabilities(struct tun_softc *sc, struct tun_capabilities *cap) +{ + int error = 0; + + NET_LOCK_SHARED(); + if (ISSET(sc->sc_flags, TUN_HDR)) { + cap->tun_if_capabilities = + (sc->sc_if.if_capabilities & TUN_IF_CAPS); + } else + error = ENODEV; + NET_UNLOCK_SHARED(); + + return (error); +} + +static int +tun_del_capabilities(struct tun_softc *sc) +{ + NET_LOCK(); + CLR(sc->sc_if.if_capabilities, TUN_IF_CAPS); + NET_UNLOCK(); + + KERNEL_ASSERT_LOCKED(); + CLR(sc->sc_flags, TUN_HDR); + + return (0); +} + +static int +tun_hdatalen(struct tun_softc *sc) +{ + struct ifnet *ifp = &sc->sc_if; + int len; + + len = ifq_hdatalen(&ifp->if_snd); + if (len > 0 && ISSET(sc->sc_flags, TUN_HDR)) + len += sizeof(struct tun_hdr); + + return (len); +} + int tun_dev_ioctl(dev_t dev, u_long cmd, void *data) { @@ -678,8 +745,18 @@ tun_dev_ioctl(dev_t dev, u_long cmd, void *data) } break; - case FIONBIO: + case TUNSCAP: + error = tun_set_capabilities(sc, + (const struct tun_capabilities *)data); break; + case TUNGCAP: + error = tun_get_capabilities(sc, + (struct tun_capabilities *)data); + break; + case TUNDCAP: + error = tun_del_capabilities(sc); + break; + case FIOASYNC: if (*(int *)data) sc->sc_flags |= TUN_ASYNC; @@ -687,7 +764,7 @@ tun_dev_ioctl(dev_t dev, u_long cmd, void *data) sc->sc_flags &= ~TUN_ASYNC; break; case FIONREAD: - *(int *)data = ifq_hdatalen(&sc->sc_if.if_snd); + *(int *)data = tun_hdatalen(sc); break; case FIOSETOWN: case TIOCSPGRP: @@ -745,6 +822,7 @@ tun_dev_read(dev_t dev, struct uio *uio, int ioflag) struct tun_softc *sc; struct ifnet *ifp; struct mbuf *m, *m0; + size_t len; int error = 0; sc = tun_get(dev); @@ -763,9 +841,46 @@ tun_dev_read(dev_t dev, struct uio *uio, int ioflag) bpf_mtap(ifp->if_bpf, m0, BPF_DIRECTION_OUT); #endif + if (ISSET(sc->sc_flags, TUN_HDR)) { + struct tun_hdr th; + + KASSERT(ISSET(m0->m_flags, M_PKTHDR)); + + th.th_flags = 0; + if (ISSET(m0->m_pkthdr.csum_flags, M_IPV4_CSUM_OUT)) + SET(th.th_flags, TUN_H_IPV4_CSUM); + if (ISSET(m0->m_pkthdr.csum_flags, M_TCP_CSUM_OUT)) + SET(th.th_flags, TUN_H_TCP_CSUM); + if (ISSET(m0->m_pkthdr.csum_flags, M_UDP_CSUM_OUT)) + SET(th.th_flags, TUN_H_UDP_CSUM); + if (ISSET(m0->m_pkthdr.csum_flags, M_ICMP_CSUM_OUT)) + SET(th.th_flags, TUN_H_ICMP_CSUM); + + th.th_pad = 0; + + th.th_vtag = 0; + if (ISSET(m0->m_flags, M_VLANTAG)) { + SET(th.th_flags, TUN_H_VTAG); + th.th_vtag = m0->m_pkthdr.ether_vtag; + } + + th.th_mss = 0; + if (ISSET(m0->m_pkthdr.csum_flags, M_TCP_TSO)) { + SET(th.th_flags, TUN_H_TCP_MSS); + th.th_mss = m0->m_pkthdr.ph_mss; + } + + len = ulmin(uio->uio_resid, sizeof(th)); + if (len > 0) { + error = uiomove(&th, len, uio); + if (error != 0) + goto free; + } + } + m = m0; while (uio->uio_resid > 0) { - size_t len = ulmin(uio->uio_resid, m->m_len); + len = ulmin(uio->uio_resid, m->m_len); if (len > 0) { error = uiomove(mtod(m, void *), len, uio); if (error != 0) @@ -777,6 +892,7 @@ tun_dev_read(dev_t dev, struct uio *uio, int ioflag) break; } +free: m_freem(m0); put: @@ -804,9 +920,11 @@ tun_dev_write(dev_t dev, struct uio *uio, int ioflag, int align) { struct tun_softc *sc; struct ifnet *ifp; - struct mbuf *m0; + struct mbuf *m0, *m, *n; int error = 0; - size_t mlen; + size_t len, alen, mlen; + size_t hlen; + struct tun_hdr th; sc = tun_get(dev); if (sc == NULL) @@ -814,35 +932,113 @@ tun_dev_write(dev_t dev, struct uio *uio, int ioflag, int align) ifp = &sc->sc_if; - if (uio->uio_resid < ifp->if_hdrlen || - uio->uio_resid > (ifp->if_hdrlen + ifp->if_hardmtu)) { + hlen = ifp->if_hdrlen; + if (ISSET(sc->sc_flags, TUN_HDR)) + hlen += sizeof(th); + if (uio->uio_resid < hlen || + uio->uio_resid > (hlen + MAXMCLBYTES)) { error = EMSGSIZE; goto put; } - align += max_linkhdr; - mlen = align + uio->uio_resid; - m0 = m_gethdr(M_DONTWAIT, MT_DATA); if (m0 == NULL) { error = ENOMEM; goto put; } - if (mlen > MHLEN) { - m_clget(m0, M_DONTWAIT, mlen); - if (!ISSET(m0->m_flags, M_EXT)) { - error = ENOMEM; + + if (ISSET(sc->sc_flags, TUN_HDR)) { + error = uiomove(&th, sizeof(th), uio); + if (error != 0) goto drop; + + if (ISSET(th.th_flags, TUN_H_IPV4_CSUM)) { + SET(m0->m_pkthdr.csum_flags, + M_IPV4_CSUM_OUT | M_IPV4_CSUM_IN_OK); + } + + switch (th.th_flags & + (TUN_H_TCP_CSUM|TUN_H_UDP_CSUM|TUN_H_ICMP_CSUM)) { + case 0: + break; + case TUN_H_TCP_CSUM: + SET(m0->m_pkthdr.csum_flags, + M_TCP_CSUM_OUT | M_TCP_CSUM_IN_OK); + break; + case TUN_H_UDP_CSUM: + SET(m0->m_pkthdr.csum_flags, + M_UDP_CSUM_OUT | M_UDP_CSUM_IN_OK); + break; + case TUN_H_ICMP_CSUM: + SET(m0->m_pkthdr.csum_flags, + M_ICMP_CSUM_OUT | M_ICMP_CSUM_IN_OK); + break; + default: + error = EINVAL; + goto drop; + } + + if (ISSET(th.th_flags, TUN_H_VTAG)) { + if (!ISSET(sc->sc_flags, TUN_LAYER2)) { + error = EINVAL; + goto drop; + } + SET(m0->m_flags, M_VLANTAG); + m0->m_pkthdr.ether_vtag = th.th_vtag; + } + + if (ISSET(th.th_flags, TUN_H_TCP_MSS)) { + SET(m0->m_pkthdr.csum_flags, M_TCP_TSO); + m0->m_pkthdr.ph_mss = th.th_mss; } } - m_align(m0, mlen); - m0->m_pkthdr.len = m0->m_len = mlen; - m_adj(m0, align); + align += roundup(max_linkhdr, sizeof(long)); + mlen = MHLEN; /* how much space in the mbuf */ - error = uiomove(mtod(m0, void *), m0->m_len, uio); - if (error != 0) - goto drop; + len = uio->uio_resid; + m0->m_pkthdr.len = len; + + m = m0; + for (;;) { + alen = align + len; /* what we want to put in this mbuf */ + if (alen > mlen) { + if (alen > MAXMCLBYTES) + alen = MAXMCLBYTES; + m_clget(m, M_DONTWAIT, alen); + if (!ISSET(m->m_flags, M_EXT)) { + error = ENOMEM; + goto put; + } + } + + m->m_len = alen; + if (align > 0) { + /* avoid m_adj to protect m0->m_pkthdr.len */ + m->m_data += align; + m->m_len -= align; + } + + error = uiomove(mtod(m, void *), m->m_len, uio); + if (error != 0) + goto drop; + + len = uio->uio_resid; + if (len == 0) + break; + + n = m_get(M_DONTWAIT, MT_DATA); + if (n == NULL) { + error = ENOMEM; + goto put; + } + + align = 0; + mlen = MLEN; + + m->m_next = n; + m = n; + } NET_LOCK(); if_vinput(ifp, m0); @@ -905,7 +1101,6 @@ int tun_dev_kqfilter(dev_t dev, struct knote *kn) { struct tun_softc *sc; - struct ifnet *ifp; struct klist *klist; int error = 0; @@ -913,8 +1108,6 @@ tun_dev_kqfilter(dev_t dev, struct knote *kn) if (sc == NULL) return (ENXIO); - ifp = &sc->sc_if; - switch (kn->kn_filter) { case EVFILT_READ: klist = &sc->sc_rklist; @@ -950,11 +1143,10 @@ int filt_tunread(struct knote *kn, long hint) { struct tun_softc *sc = kn->kn_hook; - struct ifnet *ifp = &sc->sc_if; MUTEX_ASSERT_LOCKED(&sc->sc_mtx); - kn->kn_data = ifq_hdatalen(&ifp->if_snd); + kn->kn_data = tun_hdatalen(sc); return (kn->kn_data > 0); } diff --git a/sys/net/if_tun.h b/sys/net/if_tun.h index eea043e25..fb4034574 100644 --- a/sys/net/if_tun.h +++ b/sys/net/if_tun.h @@ -1,4 +1,4 @@ -/* $OpenBSD: if_tun.h,v 1.15 2007/02/06 10:49:40 claudio Exp $ */ +/* $OpenBSD: if_tun.h,v 1.18 2024/11/17 00:25:07 dlg Exp $ */ /* * Copyright (c) 1988, Julian Onions @@ -31,6 +31,49 @@ #include +/* + * tun_hdr is a multiple of 4 bytes, but is built out of uint16_t + * fields. This allows it to sit on a 2 byte boundary in front of + * either IP (and MPLS) or Ethernet packets for tun(4) and tap(4) + * interfaces respectively while maintaining the alignment of their + * payloads. + * + * Userland can request the use of the tun_hdr using the TUNSCAP + * ioctl. This ioctl also allows userland to specify which "offload" + * capabilities it is able to accept in packets it will read from the + * kernel. It is acceptable to enable tun_hdr without enabling any + * interface offload capabilities. + * + * Once the tap_hdr is enabled, userland can write packets into the + * kernel with any of the supported features. tun(4)/tap(4) reads + * will unconditionally handle any features specified on the packet, + * regardless of what capabilities were specified by the TUNSCAP + * ioctl. + * + * The tun_hdr can be read from one interface and written directly + * to another without interpretation or modification. + * + * Use of tun_hdr and the associated capabilities are reset when a + * tun(4)/tap(4) device is closed. + */ + +struct tun_hdr { + uint16_t th_flags; +#define TUN_H_PRIO_MASK 0x7 +#define TUN_H_VTAG (1 << 4) /* th_vtag is set */ +#define TUN_H_TCP_MSS (1 << 5) /* Cut TCP frame up by th_mss */ + +#define TUN_H_IPV4_CSUM (1 << 8) +#define TUN_H_TCP_CSUM (1 << 9) +#define TUN_H_UDP_CSUM (1 << 10) +#define TUN_H_ICMP_CSUM (1 << 11) + + uint16_t th_pad; + + uint16_t th_vtag; + uint16_t th_mss; +}; + #define TUN_OPEN 0x0001 #define TUN_INITED 0x0002 #define TUN_RCOLL 0x0004 /* unused */ @@ -68,4 +111,12 @@ struct tuninfo { #define TUNSDEBUG _IOW('t', 94, int) #define TUNGDEBUG _IOR('t', 95, int) +struct tun_capabilities { + uint32_t tun_if_capabilities; /* IFCAP_* from net/if.h */ +}; + +#define TUNSCAP _IOW('t', 196, struct tun_capabilities) +#define TUNGCAP _IOR('t', 196, struct tun_capabilities) +#define TUNDCAP _IO('t', 196) + #endif /* _NET_IF_TUN_H_ */ diff --git a/sys/net/if_vxlan.c b/sys/net/if_vxlan.c index ec9339deb..c9158e0df 100644 --- a/sys/net/if_vxlan.c +++ b/sys/net/if_vxlan.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_vxlan.c,v 1.99 2023/12/23 10:52:54 bluhm Exp $ */ +/* $OpenBSD: if_vxlan.c,v 1.100 2024/10/31 11:41:31 mvs Exp $ */ /* * Copyright (c) 2021 David Gwynne @@ -708,8 +708,8 @@ vxlan_input(void *arg, struct mbuf *m, struct ip *ip, struct ip6_hdr *ip6, break; default: m->m_pkthdr.pf.prio = rxhprio; - break; \ - } \ + break; + } if_vinput(ifp, m); rele: diff --git a/sys/net/if_wg.c b/sys/net/if_wg.c index 2bb5bfcff..08f1216cf 100644 --- a/sys/net/if_wg.c +++ b/sys/net/if_wg.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_wg.c,v 1.38 2024/04/09 12:53:08 claudio Exp $ */ +/* $OpenBSD: if_wg.c,v 1.39 2024/10/31 12:33:11 claudio Exp $ */ /* * Copyright (C) 2015-2020 Jason A. Donenfeld . All Rights Reserved. @@ -860,11 +860,15 @@ wg_send_buf(struct wg_softc *sc, struct wg_endpoint *e, uint8_t *buf, { struct mbuf *m; int ret = 0; + size_t mlen = len + max_hdr; retry: m = m_gethdr(M_WAIT, MT_DATA); - m->m_len = 0; - m_copyback(m, 0, len, buf, M_WAIT); + if (mlen > MHLEN) + MCLGETL(m, M_WAIT, mlen); + m_align(m, len); + m->m_pkthdr.len = m->m_len = len; + memcpy(mtod(m, void *), buf, len); /* As we're sending a handshake packet here, we want high priority */ m->m_pkthdr.pf.prio = IFQ_MAXPRIO; @@ -1304,9 +1308,6 @@ wg_send_keepalive(void *_peer) return; } - m->m_len = 0; - m_calchdrlen(m); - t->t_peer = peer; t->t_mbuf = NULL; t->t_done = 0; @@ -1508,9 +1509,10 @@ wg_encap(struct wg_softc *sc, struct mbuf *m) t = wg_tag_get(m); peer = t->t_peer; - plaintext_len = min(WG_PKT_WITH_PADDING(m->m_pkthdr.len), t->t_mtu); + plaintext_len = WG_PKT_WITH_PADDING(m->m_pkthdr.len); padding_len = plaintext_len - m->m_pkthdr.len; - out_len = sizeof(struct wg_pkt_data) + plaintext_len + NOISE_AUTHTAG_LEN; + out_len = sizeof(struct wg_pkt_data) + plaintext_len + + NOISE_AUTHTAG_LEN; /* * For the time being we allocate a new packet with sufficient size to @@ -1522,8 +1524,9 @@ wg_encap(struct wg_softc *sc, struct mbuf *m) * noise_remote_encrypt about mbufs, but we would need to sort out the * p_encap_queue situation first. */ - if ((mc = m_clget(NULL, M_NOWAIT, out_len)) == NULL) + if ((mc = m_clget(NULL, M_NOWAIT, out_len + max_hdr)) == NULL) goto error; + m_align(mc, out_len); data = mtod(mc, struct wg_pkt_data *); m_copydata(m, 0, m->m_pkthdr.len, data->buf); @@ -1560,8 +1563,7 @@ wg_encap(struct wg_softc *sc, struct mbuf *m) mc->m_pkthdr.ph_loopcnt = m->m_pkthdr.ph_loopcnt; mc->m_flags &= ~(M_MCAST | M_BCAST); - mc->m_len = out_len; - m_calchdrlen(mc); + mc->m_pkthdr.len = mc->m_len = out_len; /* * We would count ifc_opackets, ifc_obytes of m here, except if_snd diff --git a/sys/net/ifq.c b/sys/net/ifq.c index 67ab3eeca..747709942 100644 --- a/sys/net/ifq.c +++ b/sys/net/ifq.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ifq.c,v 1.53 2023/11/10 15:51:24 bluhm Exp $ */ +/* $OpenBSD: ifq.c,v 1.55 2024/11/20 02:18:45 dlg Exp $ */ /* * Copyright (c) 2015 David Gwynne @@ -118,12 +118,6 @@ ifq_serialize(struct ifqueue *ifq, struct task *t) mtx_leave(&ifq->ifq_task_mtx); } -int -ifq_is_serialized(struct ifqueue *ifq) -{ - return (ifq->ifq_serializer == curcpu()); -} - void ifq_start(struct ifqueue *ifq) { @@ -161,6 +155,17 @@ ifq_set_oactive(struct ifqueue *ifq) mtx_leave(&ifq->ifq_mtx); } +void +ifq_deq_set_oactive(struct ifqueue *ifq) +{ + MUTEX_ASSERT_LOCKED(&ifq->ifq_mtx); + + if (!ifq->ifq_oactive) { + ifq->ifq_oactive = 1; + ifq->ifq_oactives++; + } +} + void ifq_restart_task(void *p) { diff --git a/sys/net/ifq.h b/sys/net/ifq.h index e7ee259e3..18fdb4180 100644 --- a/sys/net/ifq.h +++ b/sys/net/ifq.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ifq.h,v 1.41 2023/11/10 15:51:24 bluhm Exp $ */ +/* $OpenBSD: ifq.h,v 1.42 2024/11/20 02:18:45 dlg Exp $ */ /* * Copyright (c) 2015 David Gwynne @@ -444,6 +444,7 @@ void ifq_q_leave(struct ifqueue *, void *); void ifq_serialize(struct ifqueue *, struct task *); void ifq_barrier(struct ifqueue *); void ifq_set_oactive(struct ifqueue *); +void ifq_deq_set_oactive(struct ifqueue *); int ifq_deq_sleep(struct ifqueue *, struct mbuf **, int, int, const char *, volatile unsigned int *, diff --git a/sys/net/pf.c b/sys/net/pf.c index 29aee94f4..6d6dbfd3c 100644 --- a/sys/net/pf.c +++ b/sys/net/pf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pf.c,v 1.1205 2024/09/04 07:54:52 mglocker Exp $ */ +/* $OpenBSD: pf.c,v 1.1207 2024/12/26 10:15:27 bluhm Exp $ */ /* * Copyright (c) 2001 Daniel Hartmeier @@ -212,7 +212,7 @@ int pf_icmp_state_lookup(struct pf_pdesc *, int pf_test_state_icmp(struct pf_pdesc *, struct pf_state **, u_short *); u_int16_t pf_calc_mss(struct pf_addr *, sa_family_t, int, - u_int16_t); + uint16_t, uint16_t); static __inline int pf_set_rt_ifp(struct pf_state *, struct pf_addr *, sa_family_t, struct pf_src_node **); struct pf_divert *pf_get_divert(struct mbuf *); @@ -3926,17 +3926,18 @@ pf_get_wscale(struct pf_pdesc *pd) } u_int16_t -pf_get_mss(struct pf_pdesc *pd) +pf_get_mss(struct pf_pdesc *pd, uint16_t mssdflt) { int olen; u_int8_t opts[MAX_TCPOPTLEN], *opt; - u_int16_t mss = tcp_mssdflt; + u_int16_t mss; olen = (pd->hdr.tcp.th_off << 2) - sizeof(struct tcphdr); if (olen < TCPOLEN_MAXSEG || !pf_pull_hdr(pd->m, pd->off + sizeof(struct tcphdr), opts, olen, NULL, pd->af)) return (0); + mss = mssdflt; opt = opts; while ((opt = pf_find_tcpopt(opt, opts, olen, TCPOPT_MAXSEG, TCPOLEN_MAXSEG)) != NULL) { @@ -3949,7 +3950,8 @@ pf_get_mss(struct pf_pdesc *pd) } u_int16_t -pf_calc_mss(struct pf_addr *addr, sa_family_t af, int rtableid, u_int16_t offer) +pf_calc_mss(struct pf_addr *addr, sa_family_t af, int rtableid, uint16_t offer, + uint16_t mssdflt) { struct ifnet *ifp; struct sockaddr_in *dst; @@ -3958,8 +3960,7 @@ pf_calc_mss(struct pf_addr *addr, sa_family_t af, int rtableid, u_int16_t offer) #endif /* INET6 */ struct rtentry *rt = NULL; struct sockaddr_storage ss; - int hlen; - u_int16_t mss = tcp_mssdflt; + int hlen, mss; memset(&ss, 0, sizeof(ss)); @@ -3984,14 +3985,15 @@ pf_calc_mss(struct pf_addr *addr, sa_family_t af, int rtableid, u_int16_t offer) #endif /* INET6 */ } + mss = mssdflt; if (rt != NULL && (ifp = if_get(rt->rt_ifidx)) != NULL) { mss = ifp->if_mtu - hlen - sizeof(struct tcphdr); - mss = max(tcp_mssdflt, mss); + mss = imax(mss, mssdflt); if_put(ifp); } rtfree(rt); - mss = min(mss, offer); - mss = max(mss, 64); /* sanity - at least max opt space */ + mss = imin(mss, offer); + mss = imax(mss, 64); /* sanity - at least max opt space */ return (mss); } @@ -4597,7 +4599,6 @@ pf_create_state(struct pf_pdesc *pd, struct pf_rule *r, struct pf_rule *a, { struct pf_state *st = NULL; struct tcphdr *th = &pd->hdr.tcp; - u_int16_t mss = tcp_mssdflt; u_short reason; u_int i; @@ -4764,15 +4765,17 @@ pf_create_state(struct pf_pdesc *pd, struct pf_rule *r, struct pf_rule *a, } if (pd->proto == IPPROTO_TCP && (th->th_flags & (TH_SYN|TH_ACK)) == TH_SYN && r->keep_state == PF_STATE_SYNPROXY && pd->dir == PF_IN) { - int rtid = pd->rdomain; - if (act->rtableid >= 0) - rtid = act->rtableid; + int rtid; + uint16_t mss, mssdflt; + + rtid = (act->rtableid >= 0) ? act->rtableid : pd->rdomain; pf_set_protostate(st, PF_PEER_SRC, PF_TCPS_PROXY_SRC); st->src.seqhi = arc4random(); /* Find mss option */ - mss = pf_get_mss(pd); - mss = pf_calc_mss(pd->src, pd->af, rtid, mss); - mss = pf_calc_mss(pd->dst, pd->af, rtid, mss); + mssdflt = atomic_load_int(&tcp_mssdflt); + mss = pf_get_mss(pd, mssdflt); + mss = pf_calc_mss(pd->src, pd->af, rtid, mss, mssdflt); + mss = pf_calc_mss(pd->dst, pd->af, rtid, mss, mssdflt); st->src.mss = mss; pf_send_tcp(r, pd->af, pd->dst, pd->src, th->th_dport, th->th_sport, st->src.seqhi, ntohl(th->th_seq) + 1, @@ -5753,6 +5756,7 @@ pf_test_state_icmp(struct pf_pdesc *pd, struct pf_state **stp, return (PF_DROP); pd2.tot_len = ntohs(h2.ip_len); + pd2.ttl = h2.ip_ttl; pd2.src = (struct pf_addr *)&h2.ip_src; pd2.dst = (struct pf_addr *)&h2.ip_dst; break; @@ -5773,6 +5777,7 @@ pf_test_state_icmp(struct pf_pdesc *pd, struct pf_state **stp, pd2.tot_len = ntohs(h2_6.ip6_plen) + sizeof(struct ip6_hdr); + pd2.ttl = h2_6.ip6_hlim; pd2.src = (struct pf_addr *)&h2_6.ip6_src; pd2.dst = (struct pf_addr *)&h2_6.ip6_dst; break; diff --git a/sys/net/pf_syncookies.c b/sys/net/pf_syncookies.c index bc06cbfc3..041a996a4 100644 --- a/sys/net/pf_syncookies.c +++ b/sys/net/pf_syncookies.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pf_syncookies.c,v 1.7 2018/09/10 15:54:28 henning Exp $ */ +/* $OpenBSD: pf_syncookies.c,v 1.8 2024/12/26 10:15:27 bluhm Exp $ */ /* Copyright (c) 2016,2017 Henning Brauer * Copyright (c) 2016 Alexandr Nedvedicky @@ -199,10 +199,11 @@ pf_synflood_check(struct pf_pdesc *pd) void pf_syncookie_send(struct pf_pdesc *pd) { - uint16_t mss; + uint16_t mss, mssdflt; uint32_t iss; - mss = max(tcp_mssdflt, pf_get_mss(pd)); + mssdflt = atomic_load_int(&tcp_mssdflt); + mss = max(pf_get_mss(pd, mssdflt), mssdflt); iss = pf_syncookie_generate(pd, mss); pf_send_tcp(NULL, pd->af, pd->dst, pd->src, *pd->dport, *pd->sport, iss, ntohl(pd->hdr.tcp.th_seq) + 1, TH_SYN|TH_ACK, 0, mss, diff --git a/sys/net/pfkeyv2.c b/sys/net/pfkeyv2.c index 7f63e92fa..af23e1fa9 100644 --- a/sys/net/pfkeyv2.c +++ b/sys/net/pfkeyv2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pfkeyv2.c,v 1.262 2024/05/17 19:02:04 mvs Exp $ */ +/* $OpenBSD: pfkeyv2.c,v 1.263 2024/12/27 10:15:09 mvs Exp $ */ /* * @(#)COPYRIGHT 1.1 (NRL) 17 January 1995 @@ -1057,7 +1057,7 @@ pfkeyv2_get_proto_alg(u_int8_t satype, u_int8_t *sproto, int *alg) switch (satype) { #ifdef IPSEC case SADB_SATYPE_AH: - if (!ah_enable) + if (!atomic_load_int(&ah_enable)) return (EOPNOTSUPP); *sproto = IPPROTO_AH; @@ -1087,7 +1087,7 @@ pfkeyv2_get_proto_alg(u_int8_t satype, u_int8_t *sproto, int *alg) break; case SADB_X_SATYPE_IPCOMP: - if (!ipcomp_enable) + if (!atomic_load_int(&ipcomp_enable)) return (EOPNOTSUPP); *sproto = IPPROTO_IPCOMP; diff --git a/sys/net/pfvar.h b/sys/net/pfvar.h index 519842316..67be0789c 100644 --- a/sys/net/pfvar.h +++ b/sys/net/pfvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pfvar.h,v 1.540 2024/10/12 23:31:14 jsg Exp $ */ +/* $OpenBSD: pfvar.h,v 1.542 2024/12/26 10:15:27 bluhm Exp $ */ /* * Copyright (c) 2001 Daniel Hartmeier @@ -1241,7 +1241,7 @@ struct pf_status { #define PF_PRIO_ZERO 0xff /* match "prio 0" packets */ struct pf_queue_bwspec { - u_int absolute; + uint64_t absolute; u_int percent; }; @@ -1858,7 +1858,7 @@ void pf_mbuf_unlink_inpcb(struct mbuf *); u_int8_t* pf_find_tcpopt(u_int8_t *, u_int8_t *, size_t, u_int8_t, u_int8_t); u_int8_t pf_get_wscale(struct pf_pdesc *); -u_int16_t pf_get_mss(struct pf_pdesc *); +u_int16_t pf_get_mss(struct pf_pdesc *, uint16_t); struct mbuf * pf_build_tcp(const struct pf_rule *, sa_family_t, const struct pf_addr *, const struct pf_addr *, u_int16_t, u_int16_t, u_int32_t, u_int32_t, diff --git a/sys/net/route.c b/sys/net/route.c index 4fef5e993..b91cf6e54 100644 --- a/sys/net/route.c +++ b/sys/net/route.c @@ -1,4 +1,4 @@ -/* $OpenBSD: route.c,v 1.437 2024/09/20 02:00:46 jsg Exp $ */ +/* $OpenBSD: route.c,v 1.438 2025/01/03 21:27:40 bluhm Exp $ */ /* $NetBSD: route.c,v 1.14 1996/02/13 22:00:46 christos Exp $ */ /* @@ -557,8 +557,14 @@ rt_setgwroute(struct rtentry *rt, const struct sockaddr *gate, u_int rtableid) * If the MTU of next hop is 0, this will reset the MTU of the * route to run PMTUD again from scratch. */ - if (!ISSET(rt->rt_locks, RTV_MTU) && (rt->rt_mtu > nhrt->rt_mtu)) - rt->rt_mtu = nhrt->rt_mtu; + if (!ISSET(rt->rt_locks, RTV_MTU)) { + u_int mtu, nhmtu; + + mtu = atomic_load_int(&rt->rt_mtu); + nhmtu = atomic_load_int(&nhrt->rt_mtu); + if (mtu > nhmtu) + atomic_cas_uint(&rt->rt_mtu, mtu, nhmtu); + } /* * To avoid reference counting problems when writing link-layer diff --git a/sys/net/route.h b/sys/net/route.h index a301193e7..93ee2b347 100644 --- a/sys/net/route.h +++ b/sys/net/route.h @@ -1,4 +1,4 @@ -/* $OpenBSD: route.h,v 1.210 2024/03/31 15:53:12 bluhm Exp $ */ +/* $OpenBSD: route.h,v 1.211 2025/01/03 21:27:40 bluhm Exp $ */ /* $NetBSD: route.h,v 1.9 1996/02/13 22:00:49 christos Exp $ */ /* @@ -61,7 +61,7 @@ struct rt_kmetrics { u_int64_t rmx_pksent; /* packets sent using this route */ int64_t rmx_expire; /* lifetime for route, e.g. redirect */ u_int rmx_locks; /* Kernel must leave these values */ - u_int rmx_mtu; /* MTU for this path */ + u_int rmx_mtu; /* [a] MTU for this path */ }; #endif diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index 720333715..97235eee3 100644 --- a/sys/net/rtsock.c +++ b/sys/net/rtsock.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtsock.c,v 1.375 2024/07/12 17:20:18 mvs Exp $ */ +/* $OpenBSD: rtsock.c,v 1.376 2025/01/03 21:27:40 bluhm Exp $ */ /* $NetBSD: rtsock.c,v 1.18 1996/03/29 00:32:10 cgd Exp $ */ /* @@ -1345,7 +1345,7 @@ route_cleargateway(struct rtentry *rt, void *arg, unsigned int rtableid) if (ISSET(rt->rt_flags, RTF_GATEWAY) && rt->rt_gwroute == nhrt && !ISSET(rt->rt_locks, RTV_MTU)) - rt->rt_mtu = 0; + atomic_store_int(&rt->rt_mtu, 0); return (0); } @@ -1393,7 +1393,7 @@ rtm_setmetrics(u_long which, const struct rt_metrics *in, int64_t expire; if (which & RTV_MTU) - out->rmx_mtu = in->rmx_mtu; + atomic_store_int(&out->rmx_mtu, in->rmx_mtu); if (which & RTV_EXPIRE) { expire = in->rmx_expire; if (expire != 0) { @@ -1421,7 +1421,7 @@ rtm_getmetrics(const struct rtentry *rt, struct rt_metrics *out) bzero(out, sizeof(*out)); out->rmx_locks = in->rmx_locks; - out->rmx_mtu = in->rmx_mtu; + out->rmx_mtu = atomic_load_int(&in->rmx_mtu); out->rmx_expire = expire; out->rmx_pksent = in->rmx_pksent; } diff --git a/sys/net80211/ieee80211_node.h b/sys/net80211/ieee80211_node.h index 2bc7b4afe..cdc84552a 100644 --- a/sys/net80211/ieee80211_node.h +++ b/sys/net80211/ieee80211_node.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ieee80211_node.h,v 1.94 2022/03/20 12:01:58 stsp Exp $ */ +/* $OpenBSD: ieee80211_node.h,v 1.95 2024/11/14 07:49:24 kevlo Exp $ */ /* $NetBSD: ieee80211_node.h,v 1.9 2004/04/30 22:57:32 dyoung Exp $ */ /*- @@ -52,7 +52,7 @@ extern const struct ieee80211_rateset ieee80211_std_rateset_11a; extern const struct ieee80211_rateset ieee80211_std_rateset_11b; extern const struct ieee80211_rateset ieee80211_std_rateset_11g; -/* Index into ieee80211_std_rateset_11n[] array. */ +/* Index into ieee80211_std_ratesets_11n[] array. */ #define IEEE80211_HT_RATESET_SISO 0 #define IEEE80211_HT_RATESET_SISO_SGI 1 #define IEEE80211_HT_RATESET_MIMO2 2 @@ -98,7 +98,7 @@ struct ieee80211_ht_rateset { extern const struct ieee80211_ht_rateset ieee80211_std_ratesets_11n[]; -/* Index into ieee80211_std_rateset_11ac[] array. */ +/* Index into ieee80211_std_ratesets_11ac[] array. */ #define IEEE80211_VHT_RATESET_SISO 0 #define IEEE80211_VHT_RATESET_SISO_SGI 1 #define IEEE80211_VHT_RATESET_MIMO2 2 @@ -117,7 +117,7 @@ extern const struct ieee80211_ht_rateset ieee80211_std_ratesets_11n[]; #define IEEE80211_VHT_RATESET_MAX_NRATES 10 struct ieee80211_vht_rateset { - int idx; /* This rateset's index in ieee80211_std_rateset_11ac[]. */ + int idx; /* This rateset's index in ieee80211_std_ratesets_11ac[]. */ uint32_t nrates; uint32_t rates[IEEE80211_VHT_RATESET_MAX_NRATES]; /* 500 kbit/s units */ diff --git a/sys/netinet/icmp6.h b/sys/netinet/icmp6.h index 99ce03c50..9251cc572 100644 --- a/sys/netinet/icmp6.h +++ b/sys/netinet/icmp6.h @@ -1,4 +1,4 @@ -/* $OpenBSD: icmp6.h,v 1.53 2024/05/13 01:15:53 jsg Exp $ */ +/* $OpenBSD: icmp6.h,v 1.54 2025/01/01 13:44:22 bluhm Exp $ */ /* $KAME: icmp6.h,v 1.84 2003/04/23 10:26:51 itojun Exp $ */ /* @@ -94,7 +94,7 @@ struct icmp6_hdr { #define ICMP6_ECHO_REQUEST 128 /* echo service */ #define ICMP6_ECHO_REPLY 129 /* echo reply */ -#define MLD_LISTENER_QUERY 130 /* multicast listener query */ +#define MLD_LISTENER_QUERY 130 /* multicast listener query */ #define MLD_LISTENER_REPORT 131 /* multicast listener report */ #define MLD_LISTENER_DONE 132 /* multicast listener done */ @@ -126,15 +126,15 @@ struct icmp6_hdr { #define ICMP6_MAXTYPE 201 #define ICMP6_DST_UNREACH_NOROUTE 0 /* no route to destination */ -#define ICMP6_DST_UNREACH_ADMIN 1 /* administratively prohibited */ +#define ICMP6_DST_UNREACH_ADMIN 1 /* administratively prohibited */ #define ICMP6_DST_UNREACH_BEYONDSCOPE 2 /* beyond scope of source address */ #define ICMP6_DST_UNREACH_ADDR 3 /* address unreachable */ #define ICMP6_DST_UNREACH_NOPORT 4 /* port unreachable */ -#define ICMP6_TIME_EXCEED_TRANSIT 0 /* ttl==0 in transit */ +#define ICMP6_TIME_EXCEED_TRANSIT 0 /* ttl==0 in transit */ #define ICMP6_TIME_EXCEED_REASSEMBLY 1 /* ttl==0 in reass */ -#define ICMP6_PARAMPROB_HEADER 0 /* erroneous header field */ +#define ICMP6_PARAMPROB_HEADER 0 /* erroneous header field */ #define ICMP6_PARAMPROB_NEXTHEADER 1 /* unrecognized next header */ #define ICMP6_PARAMPROB_OPTION 2 /* unrecognized option */ @@ -176,7 +176,7 @@ struct mld_hdr { */ struct nd_router_solicit { /* router solicitation */ - struct icmp6_hdr nd_rs_hdr; + struct icmp6_hdr nd_rs_hdr; /* could be followed by options */ } __packed; @@ -318,7 +318,7 @@ struct nd_opt_dnssl { /* DNSSL option */ * icmp6 namelookup */ struct icmp6_namelookup { - struct icmp6_hdr icmp6_nl_hdr; + struct icmp6_hdr icmp6_nl_hdr; u_int8_t icmp6_nl_nonce[8]; int32_t icmp6_nl_ttl; #if 0 @@ -387,7 +387,7 @@ struct icmp6_router_renum { /* router renumbering header */ #define rr_type rr_hdr.icmp6_type #define rr_code rr_hdr.icmp6_code #define rr_cksum rr_hdr.icmp6_cksum -#define rr_seqnum rr_hdr.icmp6_data32[0] +#define rr_seqnum rr_hdr.icmp6_data32[0] struct rr_pco_match { /* match prefix part */ u_int8_t rpm_code; diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c index 0d6c3d930..66fabdd18 100644 --- a/sys/netinet/if_ether.c +++ b/sys/netinet/if_ether.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_ether.c,v 1.267 2023/12/18 13:30:44 bluhm Exp $ */ +/* $OpenBSD: if_ether.c,v 1.268 2025/01/01 13:44:22 bluhm Exp $ */ /* $NetBSD: if_ether.c,v 1.31 1996/05/11 12:59:58 mycroft Exp $ */ /* @@ -85,9 +85,9 @@ struct llinfo_arp { #define LA_HOLD_TOTAL 100 /* timer values */ -int arpt_prune = (5 * 60); /* [I] walk list every 5 minutes */ -int arpt_keep = (20 * 60); /* [a] once resolved, cache for 20 minutes */ -int arpt_down = 20; /* [a] once declared down, don't send for 20 secs */ +int arpt_prune = (5 * 60); /* [I] walk list every 5 minutes */ +int arpt_keep = (20 * 60); /* [a] once resolved, cache for 20 minutes */ +int arpt_down = 20; /* [a] once declared down, don't send for 20 secs */ struct mbuf *arppullup(struct mbuf *m); void arpinvalidate(struct rtentry *); diff --git a/sys/netinet/if_ether.h b/sys/netinet/if_ether.h index f4240e8c4..8f7ba575a 100644 --- a/sys/netinet/if_ether.h +++ b/sys/netinet/if_ether.h @@ -1,4 +1,4 @@ -/* $OpenBSD: if_ether.h,v 1.92 2024/02/14 22:41:48 bluhm Exp $ */ +/* $OpenBSD: if_ether.h,v 1.93 2025/01/01 13:44:22 bluhm Exp $ */ /* $NetBSD: if_ether.h,v 1.22 1996/05/11 13:00:00 mycroft Exp $ */ /* @@ -85,11 +85,11 @@ struct ether_header { */ struct ether_vlan_header { - u_char evl_dhost[ETHER_ADDR_LEN]; - u_char evl_shost[ETHER_ADDR_LEN]; - u_int16_t evl_encap_proto; - u_int16_t evl_tag; - u_int16_t evl_proto; + u_char evl_dhost[ETHER_ADDR_LEN]; + u_char evl_shost[ETHER_ADDR_LEN]; + u_int16_t evl_encap_proto; + u_int16_t evl_tag; + u_int16_t evl_proto; }; #define EVL_VLID_MASK 0xFFF diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c index 0df7be797..2894276ee 100644 --- a/sys/netinet/in_pcb.c +++ b/sys/netinet/in_pcb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: in_pcb.c,v 1.303 2024/07/12 19:50:35 bluhm Exp $ */ +/* $OpenBSD: in_pcb.c,v 1.309 2025/01/03 12:56:15 mvs Exp $ */ /* $NetBSD: in_pcb.c,v 1.25 1996/02/13 23:41:53 christos Exp $ */ /* @@ -179,7 +179,6 @@ void in_pcbinit(struct inpcbtable *table, int hashsize) { mtx_init(&table->inpt_mtx, IPL_SOFTNET); - rw_init(&table->inpt_notify, "inpnotify"); TAILQ_INIT(&table->inpt_queue); table->inpt_hashtbl = hashinit(hashsize, M_PCB, M_WAITOK, &table->inpt_mask); @@ -238,6 +237,7 @@ in_pcballoc(struct socket *so, struct inpcbtable *table, int wait) return (ENOBUFS); inp->inp_table = table; inp->inp_socket = so; + mtx_init(&inp->inp_sofree_mtx, IPL_SOFTNET); refcnt_init_trace(&inp->inp_refcnt, DT_REFCNT_IDX_INPCB); inp->inp_seclevel.sl_auth = IPSEC_AUTH_LEVEL_DEFAULT; inp->inp_seclevel.sl_esp_trans = IPSEC_ESP_TRANS_LEVEL_DEFAULT; @@ -585,6 +585,9 @@ in_pcbdetach(struct inpcb *inp) struct inpcbtable *table = inp->inp_table; so->so_pcb = NULL; + mtx_enter(&inp->inp_sofree_mtx); + inp->inp_socket = NULL; + mtx_leave(&inp->inp_sofree_mtx); /* * As long as the NET_LOCK() is the default lock for Internet * sockets, do not release it to not introduce new sleeping @@ -619,6 +622,32 @@ in_pcbdetach(struct inpcb *inp) in_pcbunref(inp); } +struct socket * +in_pcbsolock(struct inpcb *inp) +{ + struct socket *so; + + NET_ASSERT_LOCKED(); + + mtx_enter(&inp->inp_sofree_mtx); + so = soref(inp->inp_socket); + mtx_leave(&inp->inp_sofree_mtx); + if (so == NULL) + return NULL; + + rw_enter_write(&so->so_lock); + sorele(so); + + return so; +} + +void +in_pcbsounlock(struct inpcb *inp, struct socket *so) +{ + KASSERT(inp->inp_socket == so); + rw_exit_write(&so->so_lock); +} + struct inpcb * in_pcbref(struct inpcb *inp) { @@ -644,6 +673,49 @@ in_pcbunref(struct inpcb *inp) pool_put(&inpcb_pool, inp); } +struct inpcb * +in_pcb_iterator(struct inpcbtable *table, struct inpcb *inp, + struct inpcb_iterator *iter) +{ + struct inpcb *tmp; + + MUTEX_ASSERT_LOCKED(&table->inpt_mtx); + + if (inp) + tmp = TAILQ_NEXT((struct inpcb *)iter, inp_queue); + else + tmp = TAILQ_FIRST(&table->inpt_queue); + + while (tmp && tmp->inp_table == NULL) + tmp = TAILQ_NEXT(tmp, inp_queue); + + if (inp) { + TAILQ_REMOVE(&table->inpt_queue, (struct inpcb *)iter, + inp_queue); + in_pcbunref(inp); + } + if (tmp) { + TAILQ_INSERT_AFTER(&table->inpt_queue, tmp, + (struct inpcb *)iter, inp_queue); + in_pcbref(tmp); + } + + return tmp; +} + +void +in_pcb_iterator_abort(struct inpcbtable *table, struct inpcb *inp, + struct inpcb_iterator *iter) +{ + MUTEX_ASSERT_LOCKED(&table->inpt_mtx); + + if (inp) { + TAILQ_REMOVE(&table->inpt_queue, (struct inpcb *)iter, + inp_queue); + in_pcbunref(inp); + } +} + void in_setsockaddr(struct inpcb *inp, struct mbuf *nam) { @@ -720,8 +792,8 @@ void in_pcbnotifyall(struct inpcbtable *table, const struct sockaddr_in *dst, u_int rtable, int errno, void (*notify)(struct inpcb *, int)) { - SIMPLEQ_HEAD(, inpcb) inpcblist; - struct inpcb *inp; + struct inpcb_iterator iter = { .inp_table = NULL }; + struct inpcb *inp = NULL; u_int rdomain; if (dst->sin_addr.s_addr == INADDR_ANY) @@ -729,37 +801,20 @@ in_pcbnotifyall(struct inpcbtable *table, const struct sockaddr_in *dst, if (notify == NULL) return; - /* - * Use a temporary notify list protected by rwlock to run over - * selected PCB. This is necessary as the list of all PCB is - * protected by a mutex. Notify may call ip_output() eventually - * which may sleep as pf lock is a rwlock. Also the SRP - * implementation of the routing table might sleep. - * The same inp_notify list entry and inpt_notify rwlock are - * used for UDP multicast and raw IP delivery. - */ - SIMPLEQ_INIT(&inpcblist); rdomain = rtable_l2(rtable); - rw_enter_write(&table->inpt_notify); mtx_enter(&table->inpt_mtx); - TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) { + while ((inp = in_pcb_iterator(table, inp, &iter)) != NULL) { KASSERT(!ISSET(inp->inp_flags, INP_IPV6)); if (inp->inp_faddr.s_addr != dst->sin_addr.s_addr || rtable_l2(inp->inp_rtableid) != rdomain) { continue; } - in_pcbref(inp); - SIMPLEQ_INSERT_TAIL(&inpcblist, inp, inp_notify); + mtx_leave(&table->inpt_mtx); + (*notify)(inp, errno); + mtx_enter(&table->inpt_mtx); } mtx_leave(&table->inpt_mtx); - - while ((inp = SIMPLEQ_FIRST(&inpcblist)) != NULL) { - SIMPLEQ_REMOVE_HEAD(&inpcblist, inp_notify); - (*notify)(inp, errno); - in_pcbunref(inp); - } - rw_exit_write(&table->inpt_notify); } /* @@ -898,6 +953,8 @@ in_pcblookup_local_lock(struct inpcbtable *table, const void *laddrp, struct rtentry * in_pcbrtentry(struct inpcb *inp) { + soassertlocked(inp->inp_socket); + #ifdef INET6 if (ISSET(inp->inp_flags, INP_IPV6)) return in6_pcbrtentry(inp); @@ -1098,6 +1155,8 @@ in_pcbresize(struct inpcbtable *table, int hashsize) table->inpt_size = hashsize; TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) { + if (in_pcb_is_iterator(inp)) + continue; LIST_REMOVE(inp, inp_lhash); LIST_REMOVE(inp, inp_hash); in_pcbhash_insert(inp); diff --git a/sys/netinet/in_pcb.h b/sys/netinet/in_pcb.h index 91a78e106..36011c6c4 100644 --- a/sys/netinet/in_pcb.h +++ b/sys/netinet/in_pcb.h @@ -1,4 +1,4 @@ -/* $OpenBSD: in_pcb.h,v 1.158 2024/07/12 19:50:35 bluhm Exp $ */ +/* $OpenBSD: in_pcb.h,v 1.163 2025/01/05 12:10:39 bluhm Exp $ */ /* $NetBSD: in_pcb.h,v 1.14 1996/02/13 23:42:00 christos Exp $ */ /* @@ -79,9 +79,9 @@ * I immutable after creation * N net lock * t inpt_mtx pcb table mutex - * y inpt_notify pcb table rwlock for notify * L pf_inp_mtx link pf to inp mutex * s so_lock socket rwlock + * f inp_sofree_mtx socket detach and lock */ /* @@ -125,11 +125,11 @@ union inpaddru { * control block. */ struct inpcb { + struct inpcbtable *inp_table; /* [I] inet queue/hash table */ + TAILQ_ENTRY(inpcb) inp_queue; /* [t] inet PCB queue */ + /* keep fields above in sync with struct inpcb_iterator */ LIST_ENTRY(inpcb) inp_hash; /* [t] local and foreign hash */ LIST_ENTRY(inpcb) inp_lhash; /* [t] local port hash */ - TAILQ_ENTRY(inpcb) inp_queue; /* [t] inet PCB queue */ - SIMPLEQ_ENTRY(inpcb) inp_notify; /* [y] notify or udp append */ - struct inpcbtable *inp_table; /* [I] inet queue/hash table */ union inpaddru inp_faddru; /* [t] Foreign address. */ union inpaddru inp_laddru; /* [t] Local address. */ #define inp_faddr inp_faddru.iau_addr @@ -138,9 +138,10 @@ struct inpcb { #define inp_laddr6 inp_laddru.iau_addr6 u_int16_t inp_fport; /* [t] foreign port */ u_int16_t inp_lport; /* [t] local port */ - struct socket *inp_socket; /* [I] back pointer to socket */ + struct socket *inp_socket; /* [f] back pointer to socket */ + struct mutex inp_sofree_mtx; /* protect socket free */ caddr_t inp_ppcb; /* pointer to per-protocol pcb */ - struct route inp_route; /* cached route */ + struct route inp_route; /* [s] cached route */ struct refcnt inp_refcnt; /* refcount PCB, delay memory free */ int inp_flags; /* generic IP/datagram flags */ union { /* Header prototype. */ @@ -178,9 +179,20 @@ struct inpcb { LIST_HEAD(inpcbhead, inpcb); +struct inpcb_iterator { + struct inpcbtable *inp_table; /* [I] always NULL */ + TAILQ_ENTRY(inpcb) inp_queue; /* [t] inet PCB queue */ + /* keep fields above in sync with struct inpcb */ +}; + +static inline int +in_pcb_is_iterator(struct inpcb *inp) +{ + return (inp->inp_table == NULL ? 1 : 0); +} + struct inpcbtable { struct mutex inpt_mtx; /* protect queue and hash */ - struct rwlock inpt_notify; /* protect inp_notify list */ TAILQ_HEAD(inpthead, inpcb) inpt_queue; /* [t] inet PCB queue */ struct inpcbhead *inpt_hashtbl; /* [t] local and foreign hash */ struct inpcbhead *inpt_lhashtbl; /* [t] local port hash */ @@ -298,10 +310,18 @@ int in_pcbaddrisavail(const struct inpcb *, struct sockaddr_in *, int, struct proc *); int in_pcbconnect(struct inpcb *, struct mbuf *); void in_pcbdetach(struct inpcb *); +struct socket * + in_pcbsolock(struct inpcb *); +void in_pcbsounlock(struct inpcb *, struct socket *); struct inpcb * in_pcbref(struct inpcb *); void in_pcbunref(struct inpcb *); void in_pcbdisconnect(struct inpcb *); +struct inpcb * + in_pcb_iterator(struct inpcbtable *, struct inpcb *, + struct inpcb_iterator *); +void in_pcb_iterator_abort(struct inpcbtable *, struct inpcb *, + struct inpcb_iterator *); struct inpcb * in_pcblookup(struct inpcbtable *, struct in_addr, u_int, struct in_addr, u_int, u_int); diff --git a/sys/netinet/in_proto.c b/sys/netinet/in_proto.c index 80889ddfb..8cd364f8a 100644 --- a/sys/netinet/in_proto.c +++ b/sys/netinet/in_proto.c @@ -1,4 +1,4 @@ -/* $OpenBSD: in_proto.c,v 1.113 2024/08/22 10:58:31 mvs Exp $ */ +/* $OpenBSD: in_proto.c,v 1.121 2025/01/05 12:36:48 bluhm Exp $ */ /* $NetBSD: in_proto.c,v 1.14 1996/02/18 18:58:32 christos Exp $ */ /* @@ -71,10 +71,10 @@ * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgements: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * This product includes software developed at the Information - * Technology Division, US Naval Research Laboratory. + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * This product includes software developed at the Information + * Technology Division, US Naval Research Laboratory. * 4. Neither the name of the NRL nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. @@ -185,7 +185,7 @@ const struct protosw inetsw[] = { .pr_type = SOCK_DGRAM, .pr_domain = &inetdomain, .pr_protocol = IPPROTO_UDP, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_SPLICE|PR_MPINPUT|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_SPLICE|PR_MPINPUT|PR_MPSYSCTL, .pr_input = udp_input, .pr_ctlinput = udp_ctlinput, .pr_ctloutput = ip_ctloutput, @@ -210,7 +210,7 @@ const struct protosw inetsw[] = { .pr_type = SOCK_RAW, .pr_domain = &inetdomain, .pr_protocol = IPPROTO_RAW, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPINPUT|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPINPUT, .pr_input = rip_input, .pr_ctloutput = rip_ctloutput, .pr_usrreqs = &rip_usrreqs, @@ -219,7 +219,7 @@ const struct protosw inetsw[] = { .pr_type = SOCK_RAW, .pr_domain = &inetdomain, .pr_protocol = IPPROTO_ICMP, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSYSCTL, .pr_input = icmp_input, .pr_ctloutput = rip_ctloutput, .pr_usrreqs = &rip_usrreqs, @@ -230,7 +230,7 @@ const struct protosw inetsw[] = { .pr_type = SOCK_RAW, .pr_domain = &inetdomain, .pr_protocol = IPPROTO_IPV4, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET|PR_MPSYSCTL, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSYSCTL, #if NGIF > 0 .pr_input = in_gif_input, #else @@ -246,7 +246,7 @@ const struct protosw inetsw[] = { .pr_type = SOCK_RAW, .pr_domain = &inetdomain, .pr_protocol = IPPROTO_IPV6, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR, #if NGIF > 0 .pr_input = in_gif_input, #else @@ -261,7 +261,7 @@ const struct protosw inetsw[] = { .pr_type = SOCK_RAW, .pr_domain = &inetdomain, .pr_protocol = IPPROTO_MPLS, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR, .pr_input = in_gif_input, .pr_usrreqs = &rip_usrreqs, }, @@ -270,7 +270,7 @@ const struct protosw inetsw[] = { .pr_type = SOCK_RAW, .pr_domain = &inetdomain, .pr_protocol = IPPROTO_IGMP, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET|PR_MPSYSCTL, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSYSCTL, .pr_input = igmp_input, .pr_ctloutput = rip_ctloutput, .pr_usrreqs = &rip_usrreqs, @@ -284,7 +284,7 @@ const struct protosw inetsw[] = { .pr_type = SOCK_RAW, .pr_domain = &inetdomain, .pr_protocol = IPPROTO_AH, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSYSCTL, .pr_input = ah46_input, .pr_ctlinput = ah4_ctlinput, .pr_ctloutput = rip_ctloutput, @@ -295,7 +295,7 @@ const struct protosw inetsw[] = { .pr_type = SOCK_RAW, .pr_domain = &inetdomain, .pr_protocol = IPPROTO_ESP, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR, .pr_input = esp46_input, .pr_ctlinput = esp4_ctlinput, .pr_ctloutput = rip_ctloutput, @@ -306,7 +306,7 @@ const struct protosw inetsw[] = { .pr_type = SOCK_RAW, .pr_domain = &inetdomain, .pr_protocol = IPPROTO_IPCOMP, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSYSCTL, .pr_input = ipcomp46_input, .pr_ctloutput = rip_ctloutput, .pr_usrreqs = &rip_usrreqs, @@ -318,7 +318,7 @@ const struct protosw inetsw[] = { .pr_type = SOCK_RAW, .pr_domain = &inetdomain, .pr_protocol = IPPROTO_GRE, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSYSCTL, .pr_input = gre_input, .pr_ctloutput = rip_ctloutput, .pr_usrreqs = &gre_usrreqs, @@ -330,7 +330,7 @@ const struct protosw inetsw[] = { .pr_type = SOCK_RAW, .pr_domain = &inetdomain, .pr_protocol = IPPROTO_CARP, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSYSCTL, .pr_input = carp_proto_input, .pr_ctloutput = rip_ctloutput, .pr_usrreqs = &rip_usrreqs, @@ -342,7 +342,7 @@ const struct protosw inetsw[] = { .pr_type = SOCK_RAW, .pr_domain = &inetdomain, .pr_protocol = IPPROTO_PFSYNC, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET|PR_MPSYSCTL, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSYSCTL, .pr_input = pfsync_input4, .pr_ctloutput = rip_ctloutput, .pr_usrreqs = &rip_usrreqs, @@ -354,7 +354,7 @@ const struct protosw inetsw[] = { .pr_type = SOCK_RAW, .pr_domain = &inetdomain, .pr_protocol = IPPROTO_DIVERT, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET|PR_MPSYSCTL, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSYSCTL, .pr_ctloutput = rip_ctloutput, .pr_usrreqs = &divert_usrreqs, .pr_init = divert_init, @@ -366,7 +366,7 @@ const struct protosw inetsw[] = { .pr_type = SOCK_RAW, .pr_domain = &inetdomain, .pr_protocol = IPPROTO_ETHERIP, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET|PR_MPSYSCTL, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSYSCTL, .pr_input = ip_etherip_input, .pr_ctloutput = rip_ctloutput, .pr_usrreqs = &rip_usrreqs, @@ -377,7 +377,7 @@ const struct protosw inetsw[] = { /* raw wildcard */ .pr_type = SOCK_RAW, .pr_domain = &inetdomain, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPINPUT|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPINPUT, .pr_input = rip_input, .pr_ctloutput = rip_ctloutput, .pr_usrreqs = &rip_usrreqs, diff --git a/sys/netinet/ip6.h b/sys/netinet/ip6.h index a88041a65..6dbe54845 100644 --- a/sys/netinet/ip6.h +++ b/sys/netinet/ip6.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ip6.h,v 1.20 2011/04/05 15:14:59 blambert Exp $ */ +/* $OpenBSD: ip6.h,v 1.21 2025/01/01 13:44:22 bluhm Exp $ */ /* $KAME: ip6.h,v 1.45 2003/06/05 04:46:38 keiichi Exp $ */ /* @@ -157,7 +157,7 @@ struct ip6_dest { #define IP6OPT_RTALERT_LEN 4 #define IP6OPT_RTALERT_MLD 0 /* Datagram contains an MLD message */ #define IP6OPT_RTALERT_RSVP 1 /* Datagram contains an RSVP message */ -#define IP6OPT_RTALERT_ACTNET 2 /* contains an Active Networks msg */ +#define IP6OPT_RTALERT_ACTNET 2 /* contains an Active Networks msg */ #define IP6OPT_MINLEN 2 #define IP6OPT_TYPE(o) ((o) & 0xC0) diff --git a/sys/netinet/ip_carp.c b/sys/netinet/ip_carp.c index 26139316c..dd58474aa 100644 --- a/sys/netinet/ip_carp.c +++ b/sys/netinet/ip_carp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ip_carp.c,v 1.363 2024/07/14 18:53:39 bluhm Exp $ */ +/* $OpenBSD: ip_carp.c,v 1.365 2024/12/19 22:10:35 mvs Exp $ */ /* * Copyright (c) 2002 Michael Shalayeff. All rights reserved. @@ -88,6 +88,11 @@ #include +/* + * Locks used to protect data: + * a atomic + */ + struct carp_mc_entry { LIST_ENTRY(carp_mc_entry) mc_entries; union { @@ -138,6 +143,7 @@ struct carp_softc { struct ip_moptions sc_imo; #ifdef INET6 struct ip6_moptions sc_im6o; + struct task sc_itask; #endif /* INET6 */ SRPL_ENTRY(carp_softc) sc_list; @@ -171,6 +177,9 @@ struct carp_softc { u_int32_t sc_lsmask; /* load sharing mask */ int sc_lscount; /* # load sharing interfaces (max 32) */ int sc_delayed_arp; /* delayed ARP request countdown */ +#ifdef INET6 + int sc_send_na; /* send NA when link state up */ +#endif /* INET6 */ int sc_realmac; /* using real mac */ struct in_addr sc_peer; @@ -185,14 +194,23 @@ void carp_sc_unref(void *, void *); struct srpl_rc carp_sc_rc = SRPL_RC_INITIALIZER(carp_sc_ref, carp_sc_unref, NULL); -int carp_opts[CARPCTL_MAXID] = { 0, 1, 0, LOG_CRIT }; /* XXX for now */ +int carpctl_allow = 1; /* [a] */ +int carpctl_preempt = 0; /* [a] */ +int carpctl_log = LOG_CRIT; /* [a] */ + +const struct sysctl_bounded_args carpctl_vars[] = { + {CARPCTL_ALLOW, &carpctl_allow, INT_MIN, INT_MAX}, + {CARPCTL_PREEMPT, &carpctl_preempt, INT_MIN, INT_MAX}, + {CARPCTL_LOG, &carpctl_log, INT_MIN, INT_MAX}, +}; + struct cpumem *carpcounters; int carp_send_all_recur = 0; #define CARP_LOG(l, sc, s) \ do { \ - if (carp_opts[CARPCTL_LOG] >= l) { \ + if ((int)atomic_load_int(&carpctl_log) >= l) { \ if (sc) \ log(l, "%s: ", \ (sc)->sc_if.if_xname); \ @@ -250,6 +268,7 @@ int carp_join_multicast(struct carp_softc *); void carp_send_na(struct carp_softc *); int carp_set_addr6(struct carp_softc *, struct sockaddr_in6 *); int carp_join_multicast6(struct carp_softc *); +void carp_if_linkstate(void *); #endif int carp_clone_create(struct if_clone *, int); int carp_clone_destroy(struct ifnet *); @@ -446,7 +465,7 @@ carp_proto_input_if(struct ifnet *ifp, struct mbuf **mp, int *offp, int proto) carpstat_inc(carps_ipackets); - if (!carp_opts[CARPCTL_ALLOW]) { + if (!atomic_load_int(&carpctl_allow)) { m_freem(m); return IPPROTO_DONE; } @@ -545,7 +564,7 @@ carp6_proto_input_if(struct ifnet *ifp, struct mbuf **mp, int *offp, int proto) carpstat_inc(carps_ipackets6); - if (!carp_opts[CARPCTL_ALLOW]) { + if (!atomic_load_int(&carpctl_allow)) { m_freem(m); return IPPROTO_DONE; } @@ -702,7 +721,7 @@ carp_proto_input_c(struct ifnet *ifp, struct mbuf *m, struct carp_header *ch, * and do not have a better demote count, treat them as down. * */ - if (carp_opts[CARPCTL_PREEMPT] && + if (atomic_load_int(&carpctl_preempt) && timercmp(&sc_tv, &ch_tv, <) && ch->carp_demote >= carp_group_demote_count(sc)) { carp_master_down(vhe); @@ -760,8 +779,6 @@ int carp_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen) { - int error; - /* All sysctl names at this level are terminal. */ if (namelen != 1) return (ENOTDIR); @@ -770,13 +787,8 @@ carp_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, case CARPCTL_STATS: return (carp_sysctl_carpstat(oldp, oldlenp, newp)); default: - if (name[0] <= 0 || name[0] >= CARPCTL_MAXID) - return (ENOPROTOOPT); - NET_LOCK(); - error = sysctl_int(oldp, oldlenp, newp, newlen, - &carp_opts[name[0]]); - NET_UNLOCK(); - return (error); + return (sysctl_bounded_arr(carpctl_vars, nitems(carpctl_vars), + name, namelen, oldp, oldlenp, newp, newlen)); } } @@ -811,6 +823,9 @@ carp_clone_create(struct if_clone *ifc, int unit) task_set(&sc->sc_atask, carp_addr_updated, sc); task_set(&sc->sc_ltask, carp_carpdev_state, sc); task_set(&sc->sc_dtask, carpdetach, sc); +#ifdef INET6 + task_set(&sc->sc_itask, carp_if_linkstate, sc); +#endif /* INET6 */ sc->sc_suppress = 0; sc->sc_advbase = CARP_DFLTINTV; @@ -843,6 +858,9 @@ carp_clone_create(struct if_clone *ifc, int unit) /* Hook carp_addr_updated to cope with address and route changes. */ if_addrhook_add(&sc->sc_if, &sc->sc_atask); +#ifdef INET6 + if_linkstatehook_add(&sc->sc_if, &sc->sc_itask); +#endif /* INET6 */ return (0); } @@ -894,6 +912,9 @@ carp_clone_destroy(struct ifnet *ifp) struct carp_softc *sc = ifp->if_softc; if_addrhook_del(&sc->sc_if, &sc->sc_atask); +#ifdef INET6 + if_linkstatehook_del(&sc->sc_if, &sc->sc_itask); +#endif /* INET6 */ NET_LOCK(); carpdetach(sc); @@ -1285,13 +1306,13 @@ void carp_send_na(struct carp_softc *sc) { struct ifaddr *ifa; - struct in6_addr *in6; - static struct in6_addr mcast = IN6ADDR_LINKLOCAL_ALLNODES_INIT; + struct in6_addr *in6, mcast = IN6ADDR_LINKLOCAL_ALLNODES_INIT; int i_am_router = (atomic_load_int(&ip6_forwarding) != 0); int flags = ND_NA_FLAG_OVERRIDE; if (i_am_router) flags |= ND_NA_FLAG_ROUTER; + mcast.s6_addr16[1] = htons(sc->sc_if.if_index); TAILQ_FOREACH(ifa, &sc->sc_if.if_addrlist, ifa_list) { @@ -1534,7 +1555,8 @@ carp_master_down(struct carp_vhost_entry *vhe) /* Schedule a delayed ARP to deal w/ some L3 switches */ sc->sc_delayed_arp = 2; #ifdef INET6 - carp_send_na(sc); + /* routing entry is not ready yet. do it later */ + sc->sc_send_na = 1; #endif /* INET6 */ } carp_setrun(vhe, 0); @@ -1955,6 +1977,17 @@ carp_join_multicast6(struct carp_softc *sc) return (0); } +void +carp_if_linkstate(void *v) +{ + struct carp_softc *sc = v; + + if (sc->sc_send_na) { + if (sc->sc_if.if_link_state == LINK_STATE_UP) + carp_send_na(sc); + sc->sc_send_na = 0; + } +} #endif /* INET6 */ int diff --git a/sys/netinet/ip_divert.c b/sys/netinet/ip_divert.c index 164d76e45..5d732afd7 100644 --- a/sys/netinet/ip_divert.c +++ b/sys/netinet/ip_divert.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ip_divert.c,v 1.97 2024/08/16 09:20:35 mvs Exp $ */ +/* $OpenBSD: ip_divert.c,v 1.98 2025/01/01 13:44:22 bluhm Exp $ */ /* * Copyright (c) 2009 Michele Marchetto diff --git a/sys/netinet/ip_esp.h b/sys/netinet/ip_esp.h index dced34412..5248576c1 100644 --- a/sys/netinet/ip_esp.h +++ b/sys/netinet/ip_esp.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ip_esp.h,v 1.47 2020/09/01 01:53:34 gnezdo Exp $ */ +/* $OpenBSD: ip_esp.h,v 1.48 2025/01/01 13:44:22 bluhm Exp $ */ /* * The authors of this code are John Ioannidis (ji@tla.org), * Angelos D. Keromytis (kermit@csd.uch.gr) and @@ -110,10 +110,10 @@ enum espstat_counters { * IP_MAXPACKET */ esps_pdrops, /* Packet blocked due to policy */ esps_crypto, /* Crypto processing failure */ - esps_udpencin, /* Input ESP-in-UDP packets */ - esps_udpencout, /* Output ESP-in-UDP packets */ - esps_udpinval, /* Invalid input ESP-in-UDP packets */ - esps_udpneeded, /* Trying to use a ESP-in-UDP TDB */ + esps_udpencin, /* Input ESP-in-UDP packets */ + esps_udpencout, /* Output ESP-in-UDP packets */ + esps_udpinval, /* Invalid input ESP-in-UDP packets */ + esps_udpneeded, /* Trying to use a ESP-in-UDP TDB */ esps_outfail, /* Packet output failure */ esps_ncounters diff --git a/sys/netinet/ip_gre.c b/sys/netinet/ip_gre.c index 6973b4c90..702e0834f 100644 --- a/sys/netinet/ip_gre.c +++ b/sys/netinet/ip_gre.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ip_gre.c,v 1.88 2024/07/13 13:20:44 bluhm Exp $ */ +/* $OpenBSD: ip_gre.c,v 1.89 2025/01/01 13:44:22 bluhm Exp $ */ /* $NetBSD: ip_gre.c,v 1.9 1999/10/25 19:18:11 drochner Exp $ */ /* @@ -76,7 +76,7 @@ int gre_send(struct socket *so, struct mbuf *m, struct mbuf *nam, struct mbuf *control) { -#ifdef PIPEX +#ifdef PIPEX struct inpcb *inp = sotoinpcb(so); if (inp->inp_pipex) { diff --git a/sys/netinet/ip_gre.h b/sys/netinet/ip_gre.h index 424d87084..badc79489 100644 --- a/sys/netinet/ip_gre.h +++ b/sys/netinet/ip_gre.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ip_gre.h,v 1.19 2024/05/13 01:15:53 jsg Exp $ */ +/* $OpenBSD: ip_gre.h,v 1.20 2025/01/01 13:44:22 bluhm Exp $ */ /* $NetBSD: ip_gre.h,v 1.3 1998/10/07 23:33:02 thorpej Exp $ */ /* @@ -42,21 +42,21 @@ /* * Names for GRE sysctl objects */ -#define GRECTL_ALLOW 1 /* accept incoming GRE packets */ -#define GRECTL_WCCP 2 /* accept WCCPv1-style GRE packets */ -#define GRECTL_MAXID 3 +#define GRECTL_ALLOW 1 /* accept incoming GRE packets */ +#define GRECTL_WCCP 2 /* accept WCCPv1-style GRE packets */ +#define GRECTL_MAXID 3 #define GRECTL_NAMES { \ - { 0, 0 }, \ - { "allow", CTLTYPE_INT }, \ - { "wccp", CTLTYPE_INT }, \ + { 0, 0 }, \ + { "allow", CTLTYPE_INT }, \ + { "wccp", CTLTYPE_INT }, \ } #ifdef _KERNEL extern const struct pr_usrreqs gre_usrreqs; -int gre_send(struct socket *, struct mbuf *, struct mbuf *, +int gre_send(struct socket *, struct mbuf *, struct mbuf *, struct mbuf *); #endif /* _KERNEL */ #endif /* _NETINET_IP_GRE_H_ */ diff --git a/sys/netinet/ip_icmp.c b/sys/netinet/ip_icmp.c index 5c5ccde13..715dfa9e8 100644 --- a/sys/netinet/ip_icmp.c +++ b/sys/netinet/ip_icmp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ip_icmp.c,v 1.196 2024/07/14 18:53:39 bluhm Exp $ */ +/* $OpenBSD: ip_icmp.c,v 1.198 2025/01/03 21:27:40 bluhm Exp $ */ /* $NetBSD: ip_icmp.c,v 1.19 1996/02/13 23:42:22 christos Exp $ */ /* @@ -105,16 +105,21 @@ * host table maintenance routines. */ +/* + * Locks used to protect data: + * a atomic + */ + #ifdef ICMPPRINTFS int icmpprintfs = 0; /* Settable from ddb */ #endif /* values controllable via sysctl */ -int icmpmaskrepl = 0; -int icmpbmcastecho = 0; -int icmptstamprepl = 1; -int icmperrppslim = 100; -int icmp_rediraccept = 0; +int icmpmaskrepl = 0; /* [a] */ +int icmpbmcastecho = 0; /* [a] */ +int icmptstamprepl = 1; /* [a] */ +int icmperrppslim = 100; /* [a] */ +int icmp_rediraccept = 0; /* [a] */ int icmp_redirtimeout = 10 * 60; static int icmperrpps_count = 0; @@ -506,7 +511,7 @@ icmp_input_if(struct ifnet *ifp, struct mbuf **mp, int *offp, int proto, int af) break; case ICMP_ECHO: - if (!icmpbmcastecho && + if (atomic_load_int(&icmpbmcastecho) == 0 && (m->m_flags & (M_MCAST | M_BCAST)) != 0) { icmpstat_inc(icps_bmcastecho); break; @@ -515,10 +520,10 @@ icmp_input_if(struct ifnet *ifp, struct mbuf **mp, int *offp, int proto, int af) goto reflect; case ICMP_TSTAMP: - if (icmptstamprepl == 0) + if (atomic_load_int(&icmptstamprepl) == 0) break; - if (!icmpbmcastecho && + if (atomic_load_int(&icmpbmcastecho) == 0 && (m->m_flags & (M_MCAST | M_BCAST)) != 0) { icmpstat_inc(icps_bmcastecho); break; @@ -533,7 +538,7 @@ icmp_input_if(struct ifnet *ifp, struct mbuf **mp, int *offp, int proto, int af) goto reflect; case ICMP_MASKREQ: - if (icmpmaskrepl == 0) + if (atomic_load_int(&icmpmaskrepl) == 0) break; if (icmplen < ICMP_MASKLEN) { icmpstat_inc(icps_badlen); @@ -590,7 +595,7 @@ reflect: struct rtentry *newrt = NULL; int i_am_router = (atomic_load_int(&ip_forwarding) != 0); - if (icmp_rediraccept == 0 || i_am_router) + if (atomic_load_int(&icmp_rediraccept) == 0 || i_am_router) goto freeit; if (code > 3) goto badcode; @@ -884,24 +889,27 @@ icmp_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, return (ENOTDIR); switch (name[0]) { - case ICMPCTL_REDIRTIMEOUT: + case ICMPCTL_REDIRTIMEOUT: { + size_t savelen = *oldlenp; + + if ((error = sysctl_vslock(oldp, savelen))) + break; NET_LOCK(); error = sysctl_int_bounded(oldp, oldlenp, newp, newlen, &icmp_redirtimeout, 0, INT_MAX); rt_timer_queue_change(&icmp_redirect_timeout_q, icmp_redirtimeout); NET_UNLOCK(); + sysctl_vsunlock(oldp, savelen); break; - + } case ICMPCTL_STATS: error = icmp_sysctl_icmpstat(oldp, oldlenp, newp); break; default: - NET_LOCK(); error = sysctl_bounded_arr(icmpctl_vars, nitems(icmpctl_vars), name, namelen, oldp, oldlenp, newp, newlen); - NET_UNLOCK(); break; } @@ -1000,6 +1008,7 @@ icmp_mtudisc(struct icmp *icp, u_int rtableid) { struct rtentry *rt; struct ifnet *ifp; + u_int rtmtu; u_long mtu = ntohs(icp->icmp_nextmtu); /* Why a long? IPv6 */ rt = icmp_mtudisc_clone(icp->icmp_ip.ip_dst, rtableid, 0); @@ -1012,17 +1021,18 @@ icmp_mtudisc(struct icmp *icp, u_int rtableid) return; } + rtmtu = atomic_load_int(&rt->rt_mtu); if (mtu == 0) { int i = 0; mtu = ntohs(icp->icmp_ip.ip_len); /* Some 4.2BSD-based routers incorrectly adjust the ip_len */ - if (mtu > rt->rt_mtu && rt->rt_mtu != 0) + if (mtu > rtmtu && rtmtu != 0) mtu -= (icp->icmp_ip.ip_hl << 2); /* If we still can't guess a value, try the route */ if (mtu == 0) { - mtu = rt->rt_mtu; + mtu = rtmtu; /* If no route mtu, default to the interface mtu */ @@ -1047,8 +1057,8 @@ icmp_mtudisc(struct icmp *icp, u_int rtableid) if ((rt->rt_locks & RTV_MTU) == 0) { if (mtu < 296 || mtu > ifp->if_mtu) rt->rt_locks |= RTV_MTU; - else if (rt->rt_mtu > mtu || rt->rt_mtu == 0) - rt->rt_mtu = mtu; + else if (rtmtu > mtu || rtmtu == 0) + atomic_cas_uint(&rt->rt_mtu, rtmtu, mtu); } if_put(ifp); @@ -1081,7 +1091,7 @@ icmp_mtudisc_timeout(struct rtentry *rt, u_int rtableid) rtableid, NULL); } else { if ((rt->rt_locks & RTV_MTU) == 0) - rt->rt_mtu = 0; + atomic_store_int(&rt->rt_mtu, 0); } if_put(ifp); @@ -1098,9 +1108,10 @@ icmp_mtudisc_timeout(struct rtentry *rt, u_int rtableid) int icmp_ratelimit(const struct in_addr *dst, const int type, const int code) { + int icmperrppslim_local = atomic_load_int(&icmperrppslim); /* PPS limit */ if (!ppsratecheck(&icmperrppslim_last, &icmperrpps_count, - icmperrppslim)) + icmperrppslim_local)) return 1; /* The packet is subject to rate limit */ return 0; /* okay to send */ } diff --git a/sys/netinet/ip_id.c b/sys/netinet/ip_id.c index 9f66835bd..4ed6a8426 100644 --- a/sys/netinet/ip_id.c +++ b/sys/netinet/ip_id.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ip_id.c,v 1.25 2021/03/10 10:21:48 jsg Exp $ */ +/* $OpenBSD: ip_id.c,v 1.26 2025/01/01 13:44:22 bluhm Exp $ */ /* * Copyright (c) 2008 Theo de Raadt, Ryan McBride diff --git a/sys/netinet/ip_input.c b/sys/netinet/ip_input.c index 5a2ae6936..633457fc8 100644 --- a/sys/netinet/ip_input.c +++ b/sys/netinet/ip_input.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ip_input.c,v 1.401 2024/08/06 16:56:09 bluhm Exp $ */ +/* $OpenBSD: ip_input.c,v 1.403 2025/01/03 21:27:40 bluhm Exp $ */ /* $NetBSD: ip_input.c,v 1.30 1996/03/16 23:53:58 christos Exp $ */ /* @@ -147,6 +147,7 @@ static struct mbuf_queue ipsendraw_mq; extern struct niqueue arpinq; int ip_ours(struct mbuf **, int *, int, int); +int ip_ours_enqueue(struct mbuf **mp, int *offp, int nxt); int ip_dooptions(struct mbuf *, struct ifnet *, int); int in_ouraddr(struct mbuf *, struct ifnet *, struct route *, int); @@ -259,6 +260,12 @@ ip_ours(struct mbuf **mp, int *offp, int nxt, int af) if (nxt == IPPROTO_DONE) return IPPROTO_DONE; + return ip_ours_enqueue(mp, offp, nxt); +} + +int +ip_ours_enqueue(struct mbuf **mp, int *offp, int nxt) +{ /* save values for later, use after dequeue */ if (*offp != sizeof(struct ip)) { struct m_tag *mtag; @@ -766,11 +773,11 @@ ip_deliver(struct mbuf **mp, int *offp, int nxt, int af, int shared) switch (af) { case AF_INET: counters_dec(ipcounters, ips_delivered); - break; + return ip_ours_enqueue(mp, offp, nxt); #ifdef INET6 case AF_INET6: counters_dec(ip6counters, ip6s_delivered); - break; + return ip6_ours_enqueue(mp, offp, nxt); #endif } break; @@ -1643,8 +1650,11 @@ ip_forward(struct mbuf *m, struct ifnet *ifp, struct route *ro, int flags) type = ICMP_UNREACH; code = ICMP_UNREACH_NEEDFRAG; if (rt != NULL) { - if (rt->rt_mtu) { - destmtu = rt->rt_mtu; + u_int rtmtu; + + rtmtu = atomic_load_int(&rt->rt_mtu); + if (rtmtu != 0) { + destmtu = rtmtu; } else { struct ifnet *destifp; diff --git a/sys/netinet/ip_ipsp.h b/sys/netinet/ip_ipsp.h index 3098c4ca9..ff6c424f2 100644 --- a/sys/netinet/ip_ipsp.h +++ b/sys/netinet/ip_ipsp.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ip_ipsp.h,v 1.245 2024/04/17 20:48:51 bluhm Exp $ */ +/* $OpenBSD: ip_ipsp.h,v 1.246 2025/01/01 13:44:22 bluhm Exp $ */ /* * The authors of this code are John Ioannidis (ji@tla.org), * Angelos D. Keromytis (kermit@csd.uch.gr), diff --git a/sys/netinet/ip_mroute.h b/sys/netinet/ip_mroute.h index e833fcc27..d7752095e 100644 --- a/sys/netinet/ip_mroute.h +++ b/sys/netinet/ip_mroute.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ip_mroute.h,v 1.32 2024/10/13 02:27:44 jsg Exp $ */ +/* $OpenBSD: ip_mroute.h,v 1.33 2025/01/01 13:44:22 bluhm Exp $ */ /* $NetBSD: ip_mroute.h,v 1.23 2004/04/21 17:49:46 itojun Exp $ */ #ifndef _NETINET_IP_MROUTE_H_ @@ -54,9 +54,9 @@ typedef u_int16_t vifi_t; /* type of a vif index */ * (MRT_DEL_VIF takes a single vifi_t argument.) */ struct vifctl { - vifi_t vifc_vifi; /* the index of the vif to be added */ - u_int8_t vifc_flags; /* VIFF_ flags defined above */ - u_int8_t vifc_threshold; /* min ttl required to forward on vif */ + vifi_t vifc_vifi; /* the index of the vif to be added */ + u_int8_t vifc_flags; /* VIFF_ flags defined above */ + u_int8_t vifc_threshold; /* min ttl required to forward on vif */ u_int32_t vifc_rate_limit; /* ignored */ struct in_addr vifc_lcl_addr;/* local interface address */ struct in_addr vifc_rmt_addr;/* remote address (tunnels only) */ @@ -82,7 +82,7 @@ struct mfcctl2 { struct in_addr mfcc_origin; /* ip origin of mcasts */ struct in_addr mfcc_mcastgrp; /* multicast group associated*/ vifi_t mfcc_parent; /* incoming vif */ - u_int8_t mfcc_ttls[MAXVIFS]; /* forwarding ttls on vifs */ + u_int8_t mfcc_ttls[MAXVIFS]; /* forwarding ttls on vifs */ /* extension fields */ u_int8_t mfcc_flags[MAXVIFS]; /* the MRT_MFC_FLAGS_* flags */ @@ -114,7 +114,7 @@ struct mfcinfo { /* structure used to get all the vif entries */ struct vifinfo { - vifi_t v_vifi; /* the index of the vif to be added */ + vifi_t v_vifi; /* the index of the vif to be added */ u_int8_t v_flags; /* VIFF_ flags defined above */ u_int8_t v_threshold; /* min ttl required to forward on vif */ struct in_addr v_lcl_addr; /* local interface address */ @@ -161,9 +161,9 @@ struct mrtstat { u_long mrts_wrong_if; /* arrived on wrong interface */ u_long mrts_upq_ovflw; /* upcall Q overflow */ u_long mrts_cache_cleanups; /* # entries with no upcalls */ - u_long mrts_drop_sel; /* pkts dropped selectively */ - u_long mrts_q_overflow; /* pkts dropped - Q overflow */ - u_long mrts_pkt2large; /* pkts dropped - size > BKT SIZE */ + u_long mrts_drop_sel; /* pkts dropped selectively */ + u_long mrts_q_overflow; /* pkts dropped - Q overflow */ + u_long mrts_pkt2large; /* pkts dropped - size > BKT SIZE */ u_long mrts_upq_sockfull; /* upcalls dropped - socket full */ }; diff --git a/sys/netinet/ip_output.c b/sys/netinet/ip_output.c index 1f86f31e2..6248124b4 100644 --- a/sys/netinet/ip_output.c +++ b/sys/netinet/ip_output.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ip_output.c,v 1.401 2024/07/02 18:33:47 bluhm Exp $ */ +/* $OpenBSD: ip_output.c,v 1.402 2025/01/03 21:27:40 bluhm Exp $ */ /* $NetBSD: ip_output.c,v 1.28 1996/02/13 23:43:07 christos Exp $ */ /* @@ -211,7 +211,8 @@ reroute: error = EHOSTUNREACH; goto bad; } - if ((mtu = ro->ro_rt->rt_mtu) == 0) + mtu = atomic_load_int(&ro->ro_rt->rt_mtu); + if (mtu == 0) mtu = ifp->if_mtu; if (ro->ro_rt->rt_flags & RTF_GATEWAY) @@ -470,9 +471,14 @@ sendit: */ if (rtisvalid(ro->ro_rt) && ISSET(ro->ro_rt->rt_flags, RTF_HOST) && - !(ro->ro_rt->rt_locks & RTV_MTU) && - (ro->ro_rt->rt_mtu > ifp->if_mtu)) { - ro->ro_rt->rt_mtu = ifp->if_mtu; + !(ro->ro_rt->rt_locks & RTV_MTU)) { + u_int rtmtu; + + rtmtu = atomic_load_int(&ro->ro_rt->rt_mtu); + if (rtmtu > ifp->if_mtu) { + atomic_cas_uint(&ro->ro_rt->rt_mtu, rtmtu, + ifp->if_mtu); + } } ipstat_inc(ips_cantfrag); goto bad; @@ -558,7 +564,7 @@ ip_output_ipsec_pmtu_update(struct tdb *tdb, struct route *ro, DPRINTF("spi %08x mtu %d rt %p cloned %d", ntohl(tdb->tdb_spi), tdb->tdb_mtu, rt, rt_mtucloned); if (rt != NULL) { - rt->rt_mtu = tdb->tdb_mtu; + atomic_store_int(&rt->rt_mtu, tdb->tdb_mtu); if (ro != NULL && ro->ro_rt != NULL) { rtfree(ro->ro_rt); ro->ro_rt = rtalloc(&ro->ro_dstsa, RT_RESOLVE, diff --git a/sys/netinet/ipsec_input.c b/sys/netinet/ipsec_input.c index 07de8e38e..994c51825 100644 --- a/sys/netinet/ipsec_input.c +++ b/sys/netinet/ipsec_input.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ipsec_input.c,v 1.206 2023/09/16 09:33:27 mpi Exp $ */ +/* $OpenBSD: ipsec_input.c,v 1.207 2024/12/27 10:15:09 mvs Exp $ */ /* * The authors of this code are John Ioannidis (ji@tla.org), * Angelos D. Keromytis (kermit@csd.uch.gr) and @@ -86,6 +86,11 @@ #include "bpfilter.h" +/* + * Locks used to protect data: + * a atomic + */ + void ipsec_common_ctlinput(u_int, int, struct sockaddr *, void *, int); #ifdef ENCDEBUG @@ -114,8 +119,8 @@ int ipsec_exp_first_use = IPSEC_DEFAULT_EXP_FIRST_USE; int ipsec_expire_acquire = IPSEC_DEFAULT_EXPIRE_ACQUIRE; int esp_enable = 1; -int ah_enable = 1; -int ipcomp_enable = 0; +int ah_enable = 1; /* [a] */ +int ipcomp_enable = 0; /* [a] */ const struct sysctl_bounded_args espctl_vars[] = { {ESPCTL_ENABLE, &esp_enable, 0, 1}, @@ -673,8 +678,6 @@ int ah_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen) { - int error; - /* All sysctl names at this level are terminal. */ if (namelen != 1) return (ENOTDIR); @@ -683,11 +686,8 @@ ah_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, case AHCTL_STATS: return ah_sysctl_ahstat(oldp, oldlenp, newp); default: - NET_LOCK(); - error = sysctl_bounded_arr(ahctl_vars, nitems(ahctl_vars), name, + return sysctl_bounded_arr(ahctl_vars, nitems(ahctl_vars), name, namelen, oldp, oldlenp, newp, newlen); - NET_UNLOCK(); - return (error); } } @@ -706,8 +706,6 @@ int ipcomp_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen) { - int error; - /* All sysctl names at this level are terminal. */ if (namelen != 1) return (ENOTDIR); @@ -716,12 +714,9 @@ ipcomp_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, case IPCOMPCTL_STATS: return ipcomp_sysctl_ipcompstat(oldp, oldlenp, newp); default: - NET_LOCK(); - error = sysctl_bounded_arr(ipcompctl_vars, + return sysctl_bounded_arr(ipcompctl_vars, nitems(ipcompctl_vars), name, namelen, oldp, oldlenp, newp, newlen); - NET_UNLOCK(); - return (error); } } @@ -775,7 +770,7 @@ ah46_input(struct mbuf **mp, int *offp, int proto, int af) #if NPF > 0 ((*mp)->m_pkthdr.pf.flags & PF_TAG_DIVERTED) || #endif - !ah_enable) + !atomic_load_int(&ah_enable)) return ipsec_input_disabled(mp, offp, proto, af); protoff = ipsec_protoff(*mp, *offp, af); @@ -832,7 +827,7 @@ ipcomp46_input(struct mbuf **mp, int *offp, int proto, int af) #if NPF > 0 ((*mp)->m_pkthdr.pf.flags & PF_TAG_DIVERTED) || #endif - !ipcomp_enable) + !atomic_load_int(&ipcomp_enable)) return ipsec_input_disabled(mp, offp, proto, af); protoff = ipsec_protoff(*mp, *offp, af); diff --git a/sys/netinet/ipsec_output.c b/sys/netinet/ipsec_output.c index 51211348a..fbd66ab35 100644 --- a/sys/netinet/ipsec_output.c +++ b/sys/netinet/ipsec_output.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ipsec_output.c,v 1.98 2024/02/11 01:27:45 bluhm Exp $ */ +/* $OpenBSD: ipsec_output.c,v 1.99 2024/12/27 10:15:09 mvs Exp $ */ /* * The author of this code is Angelos D. Keromytis (angelos@cis.upenn.edu) * @@ -92,8 +92,9 @@ ipsp_process_packet(struct mbuf *m, struct tdb *tdb, int af, int tunalready) /* Check that the transform is allowed by the administrator. */ if ((tdb->tdb_sproto == IPPROTO_ESP && !esp_enable) || - (tdb->tdb_sproto == IPPROTO_AH && !ah_enable) || - (tdb->tdb_sproto == IPPROTO_IPCOMP && !ipcomp_enable)) { + (tdb->tdb_sproto == IPPROTO_AH && !atomic_load_int(&ah_enable)) || + (tdb->tdb_sproto == IPPROTO_IPCOMP && + !atomic_load_int(&ipcomp_enable))) { DPRINTF("IPsec outbound packet dropped due to policy " "(check your sysctls)"); error = EHOSTUNREACH; diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c index e9a7bf19e..00e5b51f1 100644 --- a/sys/netinet/raw_ip.c +++ b/sys/netinet/raw_ip.c @@ -1,4 +1,4 @@ -/* $OpenBSD: raw_ip.c,v 1.160 2024/07/12 19:50:35 bluhm Exp $ */ +/* $OpenBSD: raw_ip.c,v 1.163 2025/01/01 13:44:22 bluhm Exp $ */ /* $NetBSD: raw_ip.c,v 1.25 1996/02/18 18:58:33 christos Exp $ */ /* @@ -116,6 +116,9 @@ const struct pr_usrreqs rip_usrreqs = { .pru_peeraddr = in_peeraddr, }; +void rip_sbappend(struct inpcb *, struct mbuf *, struct ip *, + struct sockaddr_in *); + /* * Initialize raw connection block q. */ @@ -130,11 +133,9 @@ rip_input(struct mbuf **mp, int *offp, int proto, int af) { struct mbuf *m = *mp; struct ip *ip = mtod(m, struct ip *); - struct inpcb *inp; - SIMPLEQ_HEAD(, inpcb) inpcblist; + struct inpcb_iterator iter = { .inp_table = NULL }; + struct inpcb *inp, *last; struct in_addr *key; - struct counters_ref ref; - uint64_t *counters; struct sockaddr_in ripsrc; KASSERT(af == AF_INET); @@ -163,10 +164,9 @@ rip_input(struct mbuf **mp, int *offp, int proto, int af) } } #endif - SIMPLEQ_INIT(&inpcblist); - rw_enter_write(&rawcbtable.inpt_notify); mtx_enter(&rawcbtable.inpt_mtx); - TAILQ_FOREACH(inp, &rawcbtable.inpt_queue, inp_queue) { + last = inp = NULL; + while ((inp = in_pcb_iterator(&rawcbtable, inp, &iter)) != NULL) { KASSERT(!ISSET(inp->inp_flags, INP_IPV6)); /* @@ -190,20 +190,32 @@ rip_input(struct mbuf **mp, int *offp, int proto, int af) inp->inp_faddr.s_addr != ip->ip_src.s_addr) continue; - in_pcbref(inp); - SIMPLEQ_INSERT_TAIL(&inpcblist, inp, inp_notify); + if (last != NULL) { + struct mbuf *n; + + mtx_leave(&rawcbtable.inpt_mtx); + + n = m_copym(m, 0, M_COPYALL, M_NOWAIT); + if (n != NULL) + rip_sbappend(last, n, ip, &ripsrc); + in_pcbunref(last); + + mtx_enter(&rawcbtable.inpt_mtx); + } + last = in_pcbref(inp); } mtx_leave(&rawcbtable.inpt_mtx); - if (SIMPLEQ_EMPTY(&inpcblist)) { - rw_exit_write(&rawcbtable.inpt_notify); + if (last == NULL) { + struct counters_ref ref; + uint64_t *counters; - if (ip->ip_p != IPPROTO_ICMP) + if (ip->ip_p == IPPROTO_ICMP) { + m_freem(m); + } else { icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_PROTOCOL, 0, 0); - else - m_freem(m); - + } counters = counters_enter(&ref, ipcounters); counters[ips_noproto]++; counters[ips_delivered]--; @@ -212,44 +224,36 @@ rip_input(struct mbuf **mp, int *offp, int proto, int af) return IPPROTO_DONE; } - while ((inp = SIMPLEQ_FIRST(&inpcblist)) != NULL) { - struct mbuf *n, *opts = NULL; - - SIMPLEQ_REMOVE_HEAD(&inpcblist, inp_notify); - if (SIMPLEQ_EMPTY(&inpcblist)) - n = m; - else - n = m_copym(m, 0, M_COPYALL, M_NOWAIT); - if (n != NULL) { - struct socket *so = inp->inp_socket; - int ret = 0; - - if (inp->inp_flags & INP_CONTROLOPTS || - so->so_options & SO_TIMESTAMP) - ip_savecontrol(inp, &opts, ip, n); - - mtx_enter(&so->so_rcv.sb_mtx); - if (!ISSET(inp->inp_socket->so_rcv.sb_state, - SS_CANTRCVMORE)) { - ret = sbappendaddr(so, &so->so_rcv, - sintosa(&ripsrc), n, opts); - } - mtx_leave(&so->so_rcv.sb_mtx); - - if (ret == 0) { - m_freem(n); - m_freem(opts); - ipstat_inc(ips_noproto); - } else - sorwakeup(so); - } - in_pcbunref(inp); - } - rw_exit_write(&rawcbtable.inpt_notify); + rip_sbappend(last, m, ip, &ripsrc); + in_pcbunref(last); return IPPROTO_DONE; } +void +rip_sbappend(struct inpcb *inp, struct mbuf *m, struct ip *ip, + struct sockaddr_in *ripsrc) +{ + struct socket *so = inp->inp_socket; + struct mbuf *opts = NULL; + int ret = 0; + + if (inp->inp_flags & INP_CONTROLOPTS || so->so_options & SO_TIMESTAMP) + ip_savecontrol(inp, &opts, ip, m); + + mtx_enter(&so->so_rcv.sb_mtx); + if (!ISSET(inp->inp_socket->so_rcv.sb_state, SS_CANTRCVMORE)) + ret = sbappendaddr(so, &so->so_rcv, sintosa(ripsrc), m, opts); + mtx_leave(&so->so_rcv.sb_mtx); + + if (ret == 0) { + m_freem(m); + m_freem(opts); + ipstat_inc(ips_noproto); + } else + sorwakeup(so); +} + /* * Generate IP header and pass packet to ip_output. * Tack on options user may have setup with control call. diff --git a/sys/netinet/tcp_fsm.h b/sys/netinet/tcp_fsm.h index 8434b8967..b41c7e417 100644 --- a/sys/netinet/tcp_fsm.h +++ b/sys/netinet/tcp_fsm.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tcp_fsm.h,v 1.9 2018/02/05 14:53:26 bluhm Exp $ */ +/* $OpenBSD: tcp_fsm.h,v 1.10 2024/12/20 21:30:17 bluhm Exp $ */ /* $NetBSD: tcp_fsm.h,v 1.6 1994/10/14 16:01:48 mycroft Exp $ */ /* @@ -68,7 +68,7 @@ * determined by state, with the proviso that TH_FIN is sent only * if all data queued for output is included in the segment. */ -u_char tcp_outflags[TCP_NSTATES] = { +const u_char tcp_outflags[TCP_NSTATES] = { TH_RST|TH_ACK, 0, TH_SYN, TH_SYN|TH_ACK, TH_ACK, TH_ACK, TH_FIN|TH_ACK, TH_FIN|TH_ACK, TH_FIN|TH_ACK, TH_ACK, TH_ACK, @@ -76,7 +76,7 @@ u_char tcp_outflags[TCP_NSTATES] = { #endif /* TCPOUTFLAGS */ #ifdef TCPSTATES -const char *tcpstates[] = { +const char *const tcpstates[] = { "CLOSED", "LISTEN", "SYN_SENT", "SYN_RCVD", "ESTABLISHED", "CLOSE_WAIT", "FIN_WAIT_1", "CLOSING", "LAST_ACK", "FIN_WAIT_2", "TIME_WAIT", diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c index 0cd61cca6..0ecd7e0f9 100644 --- a/sys/netinet/tcp_input.c +++ b/sys/netinet/tcp_input.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tcp_input.c,v 1.407 2024/08/26 13:55:14 bluhm Exp $ */ +/* $OpenBSD: tcp_input.c,v 1.420 2025/01/05 12:18:48 bluhm Exp $ */ /* $NetBSD: tcp_input.c,v 1.23 1996/02/13 23:43:44 christos Exp $ */ /* @@ -108,8 +108,8 @@ int tcp_flush_queue(struct tcpcb *); #include #endif /* INET6 */ -int tcprexmtthresh = 3; -int tcptv_keep_init = TCPTV_KEEP_INIT; +const int tcprexmtthresh = 3; +int tcptv_keep_init = TCPTV_KEEP_INIT; int tcp_rst_ppslim = 100; /* 100pps */ int tcp_rst_ppslim_count = 0; @@ -170,7 +170,7 @@ do { \ if (m && (m->m_flags & M_PKTHDR)) \ ifp = if_get(m->m_pkthdr.ph_ifidx); \ if (TCP_TIMER_ISARMED(tp, TCPT_DELACK) || \ - (tcp_ack_on_push && (tiflags) & TH_PUSH) || \ + (atomic_load_int(&tcp_ack_on_push) && (tiflags) & TH_PUSH) || \ (ifp && (ifp->if_flags & IFF_LOOPBACK))) \ tp->t_flags |= TF_ACKNOW; \ else \ @@ -183,17 +183,17 @@ void tcp_newreno_partialack(struct tcpcb *, struct tcphdr *); void syn_cache_put(struct syn_cache *); void syn_cache_rm(struct syn_cache *); -int syn_cache_respond(struct syn_cache *, struct mbuf *, uint64_t); +int syn_cache_respond(struct syn_cache *, struct mbuf *, uint64_t, int); void syn_cache_timer(void *); void syn_cache_insert(struct syn_cache *, struct tcpcb *); void syn_cache_reset(struct sockaddr *, struct sockaddr *, struct tcphdr *, u_int); int syn_cache_add(struct sockaddr *, struct sockaddr *, struct tcphdr *, unsigned int, struct socket *, struct mbuf *, u_char *, int, - struct tcp_opt_info *, tcp_seq *, uint64_t); + struct tcp_opt_info *, tcp_seq *, uint64_t, int); struct socket *syn_cache_get(struct sockaddr *, struct sockaddr *, struct tcphdr *, unsigned int, unsigned int, struct socket *, - struct mbuf *, uint64_t); + struct mbuf *, uint64_t, int); struct syn_cache *syn_cache_lookup(const struct sockaddr *, const struct sockaddr *, struct syn_cache_head **, u_int); @@ -334,8 +334,11 @@ tcp_flush_queue(struct tcpcb *tp) ND6_HINT(tp); if (so->so_rcv.sb_state & SS_CANTRCVMORE) m_freem(q->tcpqe_m); - else + else { + mtx_enter(&so->so_rcv.sb_mtx); sbappendstream(so, &so->so_rcv, q->tcpqe_m); + mtx_leave(&so->so_rcv.sb_mtx); + } pool_put(&tcpqe_pool, q); q = nq; } while (q != NULL && q->tcpqe_tcp->th_seq == tp->rcv_nxt); @@ -380,6 +383,7 @@ tcp_input(struct mbuf **mp, int *offp, int proto, int af) #ifdef INET6 struct ip6_hdr *ip6 = NULL; #endif /* INET6 */ + int do_ecn = 0; #ifdef TCP_ECN u_char iptos; #endif @@ -389,6 +393,9 @@ tcp_input(struct mbuf **mp, int *offp, int proto, int af) opti.ts_present = 0; opti.maxseg = 0; now = tcp_now(); +#ifdef TCP_ECN + do_ecn = atomic_load_int(&tcp_do_ecn); +#endif /* * RFC1122 4.2.3.10, p. 104: discard bcast/mcast SYN @@ -701,7 +708,7 @@ findpcb: case TH_ACK: so = syn_cache_get(&src.sa, &dst.sa, - th, iphlen, tlen, so, m, now); + th, iphlen, tlen, so, m, now, do_ecn); if (so == NULL) { /* * We don't have a SYN for @@ -833,8 +840,8 @@ findpcb: */ if (so->so_qlen > so->so_qlimit || syn_cache_add(&src.sa, &dst.sa, th, iphlen, - so, m, optp, optlen, &opti, reuse, now) - == -1) { + so, m, optp, optlen, &opti, reuse, now, + do_ecn) == -1) { tcpstat_inc(tcps_dropsyn); goto drop; } @@ -954,7 +961,10 @@ findpcb: acked); tp->t_rcvacktime = now; ND6_HINT(tp); + + mtx_enter(&so->so_snd.sb_mtx); sbdrop(so, &so->so_snd, acked); + mtx_leave(&so->so_snd.sb_mtx); /* * If we had a pending ICMP message that @@ -1051,7 +1061,9 @@ findpcb: } else tp->rfbuf_cnt += tlen; m_adj(m, iphlen + off); + mtx_enter(&so->so_rcv.sb_mtx); sbappendstream(so, &so->so_rcv, m); + mtx_leave(&so->so_rcv.sb_mtx); } tp->t_flags |= TF_BLOCKOUTPUT; sorwakeup(so); @@ -1123,7 +1135,7 @@ findpcb: if (tiflags & TH_RST) { #ifdef TCP_ECN /* if ECN is enabled, fall back to non-ecn at rexmit */ - if (tcp_do_ecn && !(tp->t_flags & TF_DISABLE_ECN)) + if (do_ecn && !(tp->t_flags & TF_DISABLE_ECN)) goto drop; #endif if (tiflags & TH_ACK) @@ -1158,7 +1170,7 @@ findpcb: * both ECE and CWR are set for simultaneous open, * peer is ECN capable. */ - if (tcp_do_ecn) { + if (do_ecn) { switch (tiflags & (TH_ACK|TH_ECE|TH_CWR)) { case TH_ACK|TH_ECE: case TH_ECE|TH_CWR: @@ -1404,7 +1416,7 @@ trimthenstep6: case TCPS_SYN_RECEIVED: #ifdef TCP_ECN /* if ECN is enabled, fall back to non-ecn at rexmit */ - if (tcp_do_ecn && !(tp->t_flags & TF_DISABLE_ECN)) + if (do_ecn && !(tp->t_flags & TF_DISABLE_ECN)) goto drop; #endif so->so_error = ECONNREFUSED; @@ -1495,7 +1507,7 @@ trimthenstep6: * advance snd_last to snd_max not to reduce cwnd again * until all outstanding packets are acked. */ - if (tcp_do_ecn && (tiflags & TH_ECE)) { + if (do_ecn && (tiflags & TH_ECE)) { if ((tp->t_flags & TF_ECN_PERMIT) && SEQ_GEQ(tp->snd_una, tp->snd_last)) { u_int win; @@ -1733,10 +1745,14 @@ trimthenstep6: tp->snd_wnd -= so->so_snd.sb_cc; else tp->snd_wnd = 0; + mtx_enter(&so->so_snd.sb_mtx); sbdrop(so, &so->so_snd, (int)so->so_snd.sb_cc); + mtx_leave(&so->so_snd.sb_mtx); ourfinisacked = 1; } else { + mtx_enter(&so->so_snd.sb_mtx); sbdrop(so, &so->so_snd, acked); + mtx_leave(&so->so_snd.sb_mtx); if (tp->snd_wnd > acked) tp->snd_wnd -= acked; else @@ -1869,13 +1885,19 @@ step6: */ if ((tiflags & TH_URG) && th->th_urp && TCPS_HAVERCVDFIN(tp->t_state) == 0) { + u_long urgent; + /* * This is a kludge, but if we receive and accept * random urgent pointers, we'll crash in * soreceive. It's hard to imagine someone * actually wanting to send this much urgent data. */ - if (th->th_urp + so->so_rcv.sb_cc > sb_max) { + mtx_enter(&so->so_rcv.sb_mtx); + urgent = th->th_urp + so->so_rcv.sb_cc; + mtx_leave(&so->so_rcv.sb_mtx); + + if (urgent > sb_max) { th->th_urp = 0; /* XXX */ tiflags &= ~TH_URG; /* XXX */ goto dodata; /* XXX */ @@ -1896,10 +1918,12 @@ step6: */ if (SEQ_GT(th->th_seq+th->th_urp, tp->rcv_up)) { tp->rcv_up = th->th_seq + th->th_urp; + mtx_enter(&so->so_rcv.sb_mtx); so->so_oobmark = so->so_rcv.sb_cc + (tp->rcv_up - tp->rcv_nxt) - 1; if (so->so_oobmark == 0) so->so_rcv.sb_state |= SS_RCVATMARK; + mtx_leave(&so->so_rcv.sb_mtx); sohasoutofband(so); tp->t_oobflags &= ~(TCPOOB_HAVEDATA | TCPOOB_HADDATA); } @@ -1946,7 +1970,9 @@ dodata: /* XXX */ m_freem(m); else { m_adj(m, hdroptlen); + mtx_enter(&so->so_rcv.sb_mtx); sbappendstream(so, &so->so_rcv, m); + mtx_leave(&so->so_rcv.sb_mtx); } tp->t_flags |= TF_BLOCKOUTPUT; sorwakeup(so); @@ -2076,7 +2102,7 @@ dropwithreset_ratelim: * a port for which we have no socket. */ if (ppsratecheck(&tcp_rst_ppslim_last, &tcp_rst_ppslim_count, - tcp_rst_ppslim) == 0) { + atomic_load_int(&tcp_rst_ppslim)) == 0) { /* XXX stat */ goto drop; } @@ -2789,17 +2815,13 @@ int tcp_mss(struct tcpcb *tp, int offer) { struct rtentry *rt; - struct ifnet *ifp = NULL; - int mss, mssopt; - int iphlen; - struct inpcb *inp; + struct ifnet *ifp; + int mss, mssopt, mssdflt, iphlen, do_rfc3390; + u_int rtmtu; - inp = tp->t_inpcb; - - mssopt = mss = tcp_mssdflt; - - rt = in_pcbrtentry(inp); + mss = mssopt = mssdflt = atomic_load_int(&tcp_mssdflt); + rt = in_pcbrtentry(tp->t_inpcb); if (rt == NULL) goto out; @@ -2808,29 +2830,29 @@ tcp_mss(struct tcpcb *tp, int offer) goto out; switch (tp->pf) { + case AF_INET: + iphlen = sizeof(struct ip); + break; #ifdef INET6 case AF_INET6: iphlen = sizeof(struct ip6_hdr); break; #endif - case AF_INET: - iphlen = sizeof(struct ip); - break; default: - /* the family does not support path MTU discovery */ - goto out; + unhandled_af(tp->pf); } /* * if there's an mtu associated with the route and we support * path MTU discovery for the underlying protocol family, use it. */ - if (rt->rt_mtu) { + rtmtu = atomic_load_int(&rt->rt_mtu); + if (rtmtu) { /* * One may wish to lower MSS to take into account options, * especially security-related options. */ - if (tp->pf == AF_INET6 && rt->rt_mtu < IPV6_MMTU) { + if (tp->pf == AF_INET6 && rtmtu < IPV6_MMTU) { /* * RFC2460 section 5, last paragraph: if path MTU is * smaller than 1280, use 1280 as packet size and @@ -2839,8 +2861,7 @@ tcp_mss(struct tcpcb *tp, int offer) mss = IPV6_MMTU - iphlen - sizeof(struct ip6_frag) - sizeof(struct tcphdr); } else { - mss = rt->rt_mtu - iphlen - - sizeof(struct tcphdr); + mss = rtmtu - iphlen - sizeof(struct tcphdr); } } else if (ifp->if_flags & IFF_LOOPBACK) { mss = ifp->if_mtu - iphlen - sizeof(struct tcphdr); @@ -2861,10 +2882,10 @@ tcp_mss(struct tcpcb *tp, int offer) /* Calculate the value that we offer in TCPOPT_MAXSEG */ if (offer != -1) { mssopt = ifp->if_mtu - iphlen - sizeof(struct tcphdr); - mssopt = max(tcp_mssdflt, mssopt); + mssopt = imax(mssopt, mssdflt); } - out: if_put(ifp); + out: /* * The current mss, t_maxseg, is initialized to the default value. * If we compute a smaller value, reduce the current mss. @@ -2878,10 +2899,10 @@ tcp_mss(struct tcpcb *tp, int offer) if (offer > 0) tp->t_peermss = offer; if (tp->t_peermss) - mss = min(mss, max(tp->t_peermss, 216)); + mss = imin(mss, max(tp->t_peermss, 216)); /* sanity - at least max opt. space */ - mss = max(mss, 64); + mss = imax(mss, 64); /* * maxopd stores the maximum length of data AND options @@ -2900,6 +2921,7 @@ tcp_mss(struct tcpcb *tp, int offer) mss -= TCPOLEN_SIGLEN; #endif + do_rfc3390 = atomic_load_int(&tcp_do_rfc3390); if (offer == -1) { /* mss changed due to Path MTU discovery */ tp->t_flags &= ~TF_PMTUD_PEND; @@ -2914,10 +2936,10 @@ tcp_mss(struct tcpcb *tp, int offer) tp->snd_cwnd = ulmax((tp->snd_cwnd / tp->t_maxseg) * mss, mss); } - } else if (tcp_do_rfc3390 == 2) { + } else if (do_rfc3390 == 2) { /* increase initial window */ tp->snd_cwnd = ulmin(10 * mss, ulmax(2 * mss, 14600)); - } else if (tcp_do_rfc3390) { + } else if (do_rfc3390) { /* increase initial window */ tp->snd_cwnd = ulmin(4 * mss, ulmax(2 * mss, 4380)); } else @@ -2980,12 +3002,13 @@ tcp_mss_update(struct tcpcb *tp) mss = tp->t_maxseg; rt = in_pcbrtentry(tp->t_inpcb); - if (rt == NULL) return; + mtx_enter(&so->so_snd.sb_mtx); bufsize = so->so_snd.sb_hiwat; if (bufsize < mss) { + mtx_leave(&so->so_snd.sb_mtx); mss = bufsize; /* Update t_maxseg and t_maxopd */ tcp_mss(tp, mss); @@ -2994,8 +3017,10 @@ tcp_mss_update(struct tcpcb *tp) if (bufsize > sb_max) bufsize = sb_max; (void)sbreserve(so, &so->so_snd, bufsize); + mtx_leave(&so->so_snd.sb_mtx); } + mtx_enter(&so->so_rcv.sb_mtx); bufsize = so->so_rcv.sb_hiwat; if (bufsize > mss) { bufsize = roundup(bufsize, mss); @@ -3003,7 +3028,7 @@ tcp_mss_update(struct tcpcb *tp) bufsize = sb_max; (void)sbreserve(so, &so->so_rcv, bufsize); } - + mtx_leave(&so->so_rcv.sb_mtx); } /* @@ -3050,32 +3075,36 @@ tcp_newreno_partialack(struct tcpcb *tp, struct tcphdr *th) int tcp_mss_adv(struct mbuf *m, int af) { - int mss = 0; - int iphlen; - struct ifnet *ifp = NULL; + struct ifnet *ifp; + int iphlen, mss, mssdflt; - if (m && (m->m_flags & M_PKTHDR)) - ifp = if_get(m->m_pkthdr.ph_ifidx); + mssdflt = atomic_load_int(&tcp_mssdflt); + + if (m == NULL || (m->m_flags & M_PKTHDR) == 0) + return mssdflt; + + ifp = if_get(m->m_pkthdr.ph_ifidx); + if (ifp == NULL) + return mssdflt; switch (af) { case AF_INET: - if (ifp != NULL) - mss = ifp->if_mtu; iphlen = sizeof(struct ip); break; #ifdef INET6 case AF_INET6: - if (ifp != NULL) - mss = ifp->if_mtu; iphlen = sizeof(struct ip6_hdr); break; #endif default: unhandled_af(af); } + mss = ifp->if_mtu - iphlen - sizeof(struct tcphdr); if_put(ifp); - mss = mss - iphlen - sizeof(struct tcphdr); - return (max(mss, tcp_mssdflt)); + + if (mss < mssdflt) + return mssdflt; + return mss; } /* @@ -3085,21 +3114,22 @@ tcp_mss_adv(struct mbuf *m, int af) /* * Locks used to protect global data and struct members: + * a atomic operations * N net lock * S syn_cache_mtx tcp syn cache global mutex */ /* syn hash parameters */ -int tcp_syn_hash_size = TCP_SYN_HASH_SIZE; /* [N] size of hash table */ -int tcp_syn_cache_limit = /* [N] global entry limit */ +int tcp_syn_hash_size = TCP_SYN_HASH_SIZE; /* [S] size of hash table */ +int tcp_syn_cache_limit = /* [a] global entry limit */ TCP_SYN_HASH_SIZE * TCP_SYN_BUCKET_SIZE; -int tcp_syn_bucket_limit = /* [N] per bucket limit */ +int tcp_syn_bucket_limit = /* [a] per bucket limit */ 3 * TCP_SYN_BUCKET_SIZE; -int tcp_syn_use_limit = 100000; /* [N] reseed after uses */ +int tcp_syn_use_limit = 100000; /* [S] reseed after uses */ struct pool syn_cache_pool; -struct syn_cache_set tcp_syn_cache[2]; -int tcp_syn_cache_active; +struct syn_cache_set tcp_syn_cache[2]; /* [S] */ +int tcp_syn_cache_active; /* [S] */ struct mutex syn_cache_mtx = MUTEX_INITIALIZER(IPL_SOFTNET); #define SYN_HASH(sa, sp, dp, rand) \ @@ -3147,7 +3177,8 @@ syn_cache_rm(struct syn_cache *sc) KASSERT(!ISSET(sc->sc_dynflags, SCF_DEAD)); SET(sc->sc_dynflags, SCF_DEAD); TAILQ_REMOVE(&sc->sc_buckethead->sch_bucket, sc, sc_bucketq); - sc->sc_tp = NULL; + in_pcbunref(sc->sc_inplisten); + sc->sc_inplisten = NULL; LIST_REMOVE(sc, sc_tpq); refcnt_rele(&sc->sc_refcnt); sc->sc_buckethead->sch_length--; @@ -3194,7 +3225,7 @@ syn_cache_init(void) void syn_cache_insert(struct syn_cache *sc, struct tcpcb *tp) { - struct syn_cache_set *set = &tcp_syn_cache[tcp_syn_cache_active]; + struct syn_cache_set *set; struct syn_cache_head *scp; struct syn_cache *sc2; int i; @@ -3202,6 +3233,8 @@ syn_cache_insert(struct syn_cache *sc, struct tcpcb *tp) NET_ASSERT_LOCKED(); MUTEX_ASSERT_LOCKED(&syn_cache_mtx); + set = &tcp_syn_cache[tcp_syn_cache_active]; + /* * If there are no entries in the hash table, reinitialize * the hash secrets. To avoid useless cache swaps and @@ -3239,7 +3272,7 @@ syn_cache_insert(struct syn_cache *sc, struct tcpcb *tp) * Make sure that we don't overflow the per-bucket * limit or the total cache size limit. */ - if (scp->sch_length >= tcp_syn_bucket_limit) { + if (scp->sch_length >= atomic_load_int(&tcp_syn_bucket_limit)) { tcpstat_inc(tcps_sc_bucketoverflow); /* * Someone might attack our bucket hash function. Reseed @@ -3261,7 +3294,7 @@ syn_cache_insert(struct syn_cache *sc, struct tcpcb *tp) #endif syn_cache_rm(sc2); syn_cache_put(sc2); - } else if (set->scs_count >= tcp_syn_cache_limit) { + } else if (set->scs_count >= atomic_load_int(&tcp_syn_cache_limit)) { struct syn_cache_head *scp2, *sce; tcpstat_inc(tcps_sc_overflowed); @@ -3341,8 +3374,10 @@ void syn_cache_timer(void *arg) { struct syn_cache *sc = arg; + struct inpcb *inp; + struct socket *so; uint64_t now; - int lastref; + int lastref, do_ecn = 0; mtx_enter(&syn_cache_mtx); if (ISSET(sc->sc_dynflags, SCF_DEAD)) @@ -3369,14 +3404,25 @@ syn_cache_timer(void *arg) TCPTV_REXMTMAX); if (timeout_add_msec(&sc->sc_timer, sc->sc_rxtcur)) refcnt_take(&sc->sc_refcnt); + inp = in_pcbref(sc->sc_inplisten); + if (inp == NULL) + goto freeit; mtx_leave(&syn_cache_mtx); - NET_LOCK(); - now = tcp_now(); - (void) syn_cache_respond(sc, NULL, now); - tcpstat_inc(tcps_sc_retransmitted); - NET_UNLOCK(); + NET_LOCK_SHARED(); + so = in_pcbsolock(inp); + if (so != NULL) { + now = tcp_now(); +#ifdef TCP_ECN + do_ecn = atomic_load_int(&tcp_do_ecn); +#endif + (void) syn_cache_respond(sc, NULL, now, do_ecn); + tcpstat_inc(tcps_sc_retransmitted); + in_pcbsounlock(inp, so); + } + NET_UNLOCK_SHARED(); + in_pcbunref(inp); syn_cache_put(sc); return; @@ -3406,10 +3452,7 @@ syn_cache_cleanup(struct tcpcb *tp) mtx_enter(&syn_cache_mtx); LIST_FOREACH_SAFE(sc, &tp->t_sc, sc_tpq, nsc) { -#ifdef DIAGNOSTIC - if (sc->sc_tp != tp) - panic("invalid sc_tp in syn_cache_cleanup"); -#endif + KASSERT(sc->sc_inplisten == tp->t_inpcb); syn_cache_rm(sc); syn_cache_put(sc); } @@ -3480,7 +3523,8 @@ syn_cache_lookup(const struct sockaddr *src, const struct sockaddr *dst, */ struct socket * syn_cache_get(struct sockaddr *src, struct sockaddr *dst, struct tcphdr *th, - u_int hlen, u_int tlen, struct socket *so, struct mbuf *m, uint64_t now) + u_int hlen, u_int tlen, struct socket *so, struct mbuf *m, uint64_t now, + int do_ecn) { struct syn_cache *sc; struct syn_cache_head *scp; @@ -3508,7 +3552,7 @@ syn_cache_get(struct sockaddr *src, struct sockaddr *dst, struct tcphdr *th, SEQ_GT(th->th_seq, sc->sc_irs + 1 + sc->sc_win)) { refcnt_take(&sc->sc_refcnt); mtx_leave(&syn_cache_mtx); - (void) syn_cache_respond(sc, m, now); + (void) syn_cache_respond(sc, m, now, do_ecn); syn_cache_put(sc); return ((struct socket *)(-1)); } @@ -3758,7 +3802,7 @@ syn_cache_unreach(const struct sockaddr *src, const struct sockaddr *dst, int syn_cache_add(struct sockaddr *src, struct sockaddr *dst, struct tcphdr *th, u_int iphlen, struct socket *so, struct mbuf *m, u_char *optp, int optlen, - struct tcp_opt_info *oi, tcp_seq *issp, uint64_t now) + struct tcp_opt_info *oi, tcp_seq *issp, uint64_t now, int do_ecn) { struct tcpcb tb, *tp; long win; @@ -3791,7 +3835,8 @@ syn_cache_add(struct sockaddr *src, struct sockaddr *dst, struct tcphdr *th, ) { tb.pf = tp->pf; tb.sack_enable = tp->sack_enable; - tb.t_flags = tcp_do_rfc1323 ? (TF_REQ_SCALE|TF_REQ_TSTMP) : 0; + tb.t_flags = atomic_load_int(&tcp_do_rfc1323) ? + (TF_REQ_SCALE|TF_REQ_TSTMP) : 0; #ifdef TCP_SIGNATURE if (tp->t_flags & TF_SIGNATURE) tb.t_flags |= TF_SIGNATURE; @@ -3833,7 +3878,7 @@ syn_cache_add(struct sockaddr *src, struct sockaddr *dst, struct tcphdr *th, sc->sc_ipopts = ipopts; } sc->sc_timestamp = tb.ts_recent; - if (syn_cache_respond(sc, m, now) == 0) { + if (syn_cache_respond(sc, m, now, do_ecn) == 0) { tcpstat_inc(tcps_sndacks); tcpstat_inc(tcps_sndtotal); } @@ -3906,8 +3951,7 @@ syn_cache_add(struct sockaddr *src, struct sockaddr *dst, struct tcphdr *th, /* * if both ECE and CWR flag bits are set, peer is ECN capable. */ - if (tcp_do_ecn && - (th->th_flags & (TH_ECE|TH_CWR)) == (TH_ECE|TH_CWR)) + if (do_ecn && (th->th_flags & (TH_ECE|TH_CWR)) == (TH_ECE|TH_CWR)) SET(sc->sc_fixflags, SCF_ECN_PERMIT); #endif /* @@ -3920,8 +3964,8 @@ syn_cache_add(struct sockaddr *src, struct sockaddr *dst, struct tcphdr *th, if (tb.t_flags & TF_SIGNATURE) SET(sc->sc_fixflags, SCF_SIGNATURE); #endif - sc->sc_tp = tp; - if (syn_cache_respond(sc, m, now) == 0) { + sc->sc_inplisten = in_pcbref(tp->t_inpcb); + if (syn_cache_respond(sc, m, now, do_ecn) == 0) { mtx_enter(&syn_cache_mtx); /* * XXXSMP Currently exclusive netlock prevents another insert @@ -3933,6 +3977,7 @@ syn_cache_add(struct sockaddr *src, struct sockaddr *dst, struct tcphdr *th, tcpstat_inc(tcps_sndacks); tcpstat_inc(tcps_sndtotal); } else { + in_pcbunref(sc->sc_inplisten); syn_cache_put(sc); tcpstat_inc(tcps_sc_dropped); } @@ -3941,7 +3986,8 @@ syn_cache_add(struct sockaddr *src, struct sockaddr *dst, struct tcphdr *th, } int -syn_cache_respond(struct syn_cache *sc, struct mbuf *m, uint64_t now) +syn_cache_respond(struct syn_cache *sc, struct mbuf *m, uint64_t now, + int do_ecn) { u_int8_t *optp; int optlen, error; @@ -4035,7 +4081,7 @@ syn_cache_respond(struct syn_cache *sc, struct mbuf *m, uint64_t now) th->th_flags = TH_SYN|TH_ACK; #ifdef TCP_ECN /* Set ECE for SYN-ACK if peer supports ECN. */ - if (tcp_do_ecn && ISSET(sc->sc_fixflags, SCF_ECN_PERMIT)) + if (do_ecn && ISSET(sc->sc_fixflags, SCF_ECN_PERMIT)) th->th_flags |= TH_ECE; #endif th->th_win = htons(sc->sc_win); @@ -4129,7 +4175,7 @@ syn_cache_respond(struct syn_cache *sc, struct mbuf *m, uint64_t now) /* use IPsec policy and ttl from listening socket, on SYN ACK */ mtx_enter(&syn_cache_mtx); - inp = sc->sc_tp ? sc->sc_tp->t_inpcb : NULL; + inp = in_pcbref(sc->sc_inplisten); mtx_leave(&syn_cache_mtx); /* @@ -4160,5 +4206,6 @@ syn_cache_respond(struct syn_cache *sc, struct mbuf *m, uint64_t now) break; #endif } + in_pcbunref(inp); return (error); } diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c index 4016bd81a..70c5846c0 100644 --- a/sys/netinet/tcp_output.c +++ b/sys/netinet/tcp_output.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tcp_output.c,v 1.145 2024/05/14 09:39:02 bluhm Exp $ */ +/* $OpenBSD: tcp_output.c,v 1.151 2025/01/05 12:18:48 bluhm Exp $ */ /* $NetBSD: tcp_output.c,v 1.16 1997/06/03 16:17:09 kml Exp $ */ /* @@ -103,8 +103,6 @@ extern struct mbuf *m_copypack(); #endif -extern int tcprexmtthresh; - #ifdef TCP_SACK_DEBUG void tcp_print_holes(struct tcpcb *tp); @@ -195,14 +193,14 @@ int tcp_output(struct tcpcb *tp) { struct socket *so = tp->t_inpcb->inp_socket; - long len, win, txmaxseg; + long len, win, rcv_hiwat, txmaxseg; int off, flags, error; struct mbuf *m; struct tcphdr *th; u_int32_t optbuf[howmany(MAX_TCPOPTLEN, sizeof(u_int32_t))]; u_char *opt = (u_char *)optbuf; unsigned int optlen, hdrlen, packetlen; - int idle, sendalot = 0; + int doing_sosend, idle, sendalot = 0; int i, sack_rxmit = 0; struct sackhole *p; uint64_t now; @@ -210,6 +208,7 @@ tcp_output(struct tcpcb *tp) unsigned int sigoff; #endif /* TCP_SIGNATURE */ #ifdef TCP_ECN + int do_ecn = atomic_load_int(&tcp_do_ecn); int needect; #endif int tso; @@ -227,6 +226,10 @@ tcp_output(struct tcpcb *tp) now = tcp_now(); + mtx_enter(&so->so_snd.sb_mtx); + doing_sosend = soissending(so); + mtx_leave(&so->so_snd.sb_mtx); + /* * Determine length of data that should be transmitted, * and flags that will be used. @@ -243,7 +246,7 @@ tcp_output(struct tcpcb *tp) tp->snd_cwnd = 2 * tp->t_maxseg; /* remember 'idle' for next invocation of tcp_output */ - if (idle && soissending(so)) { + if (idle && doing_sosend) { tp->t_flags |= TF_LASTIDLE; idle = 0; } else @@ -350,7 +353,7 @@ again: txmaxseg = ulmin(so->so_snd.sb_hiwat / 2, tp->t_maxseg); if (len > txmaxseg) { - if (tcp_do_tso && + if (atomic_load_int(&tcp_do_tso) && tp->t_inpcb->inp_options == NULL && tp->t_inpcb->inp_outputopts6 == NULL && #ifdef TCP_SIGNATURE @@ -373,7 +376,10 @@ again: if (off + len < so->so_snd.sb_cc) flags &= ~TH_FIN; - win = sbspace(so, &so->so_rcv); + mtx_enter(&so->so_rcv.sb_mtx); + win = sbspace_locked(so, &so->so_rcv); + rcv_hiwat = (long) so->so_rcv.sb_hiwat; + mtx_leave(&so->so_rcv.sb_mtx); /* * Sender silly window avoidance. If connection is idle @@ -389,7 +395,7 @@ again: if (len >= txmaxseg) goto send; if ((idle || (tp->t_flags & TF_NODELAY)) && - len + off >= so->so_snd.sb_cc && !soissending(so) && + len + off >= so->so_snd.sb_cc && !doing_sosend && (tp->t_flags & TF_NOPUSH) == 0) goto send; if (tp->t_force) @@ -420,7 +426,7 @@ again: if (adv >= (long) (2 * tp->t_maxseg)) goto send; - if (2 * adv >= (long) so->so_rcv.sb_hiwat) + if (2 * adv >= rcv_hiwat) goto send; } @@ -722,7 +728,7 @@ send: * give data to the user when a buffer fills or * a PUSH comes in.) */ - if (off + len == so->so_snd.sb_cc && !soissending(so)) + if (off + len == so->so_snd.sb_cc && !doing_sosend) flags |= TH_PUSH; tp->t_sndtime = now; } else { @@ -816,7 +822,7 @@ send: th->th_off = (sizeof (struct tcphdr) + optlen) >> 2; } #ifdef TCP_ECN - if (tcp_do_ecn) { + if (do_ecn) { /* * if we have received congestion experienced segs, * set ECE bit. @@ -854,7 +860,7 @@ send: * Calculate receive window. Don't shrink window, * but avoid silly window syndrome. */ - if (win < (long)(so->so_rcv.sb_hiwat / 4) && win < (long)tp->t_maxseg) + if (win < (rcv_hiwat / 4) && win < (long)tp->t_maxseg) win = 0; if (win > (long)TCP_MAXWIN << tp->rcv_scale) win = (long)TCP_MAXWIN << tp->rcv_scale; @@ -1049,7 +1055,7 @@ send: * but don't set ECT for a pure ack, a retransmit or a window probe. */ needect = 0; - if (tcp_do_ecn && (tp->t_flags & TF_ECN_PERMIT)) { + if (do_ecn && (tp->t_flags & TF_ECN_PERMIT)) { if (len == 0 || SEQ_LT(tp->snd_nxt, tp->snd_max) || (tp->t_force && len == 1)) { /* don't set ECT */ diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c index 851e23f54..cc3ff8e0c 100644 --- a/sys/netinet/tcp_subr.c +++ b/sys/netinet/tcp_subr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tcp_subr.c,v 1.201 2024/04/17 20:48:51 bluhm Exp $ */ +/* $OpenBSD: tcp_subr.c,v 1.204 2025/01/03 17:23:51 bluhm Exp $ */ /* $NetBSD: tcp_subr.c,v 1.22 1996/02/13 23:44:00 christos Exp $ */ /* @@ -437,15 +437,18 @@ tcp_newtcpcb(struct inpcb *inp, int wait) if (tp == NULL) return (NULL); TAILQ_INIT(&tp->t_segq); - tp->t_maxseg = tcp_mssdflt; + tp->t_maxseg = atomic_load_int(&tcp_mssdflt); tp->t_maxopd = 0; + tp->t_inpcb = inp; for (i = 0; i < TCPT_NTIMERS; i++) TCP_TIMER_INIT(tp, i); + timeout_set_flags(&tp->t_timer_reaper, tcp_timer_reaper, tp, + KCLOCK_NONE, TIMEOUT_PROC | TIMEOUT_MPSAFE); - tp->sack_enable = tcp_do_sack; - tp->t_flags = tcp_do_rfc1323 ? (TF_REQ_SCALE|TF_REQ_TSTMP) : 0; - tp->t_inpcb = inp; + tp->sack_enable = atomic_load_int(&tcp_do_sack); + tp->t_flags = atomic_load_int(&tcp_do_rfc1323) ? + (TF_REQ_SCALE|TF_REQ_TSTMP) : 0; /* * Init srtt to TCPTV_SRTTBASE (0), so we can tell that we have no * rtt estimate. Set rttvar so that srtt + 2 * rttvar gives @@ -529,11 +532,11 @@ tcp_close(struct tcpcb *tp) m_free(tp->t_template); /* Free tcpcb after all pending timers have been run. */ - TCP_TIMER_ARM(tp, TCPT_REAPER, 1); - + timeout_add(&tp->t_timer_reaper, 0); inp->inp_ppcb = NULL; soisdisconnected(so); in_pcbdetach(inp); + tcpstat_inc(tcps_closed); return (NULL); } diff --git a/sys/netinet/tcp_timer.c b/sys/netinet/tcp_timer.c index ee87e5699..e5c040ca1 100644 --- a/sys/netinet/tcp_timer.c +++ b/sys/netinet/tcp_timer.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tcp_timer.c,v 1.76 2024/01/28 20:34:25 bluhm Exp $ */ +/* $OpenBSD: tcp_timer.c,v 1.80 2025/01/05 12:18:48 bluhm Exp $ */ /* $NetBSD: tcp_timer.c,v 1.14 1996/02/13 23:44:09 christos Exp $ */ /* @@ -76,7 +76,6 @@ void tcp_timer_rexmt(void *); void tcp_timer_persist(void *); void tcp_timer_keep(void *); void tcp_timer_2msl(void *); -void tcp_timer_reaper(void *); void tcp_timer_delack(void *); const tcp_timer_func_t tcp_timer_funcs[TCPT_NTIMERS] = { @@ -84,7 +83,6 @@ const tcp_timer_func_t tcp_timer_funcs[TCPT_NTIMERS] = { tcp_timer_persist, tcp_timer_keep, tcp_timer_2msl, - tcp_timer_reaper, tcp_timer_delack, }; @@ -114,7 +112,8 @@ tcp_timer_init(void) void tcp_timer_delack(void *arg) { - struct tcpcb *otp = NULL, *tp = arg; + struct inpcb *inp = arg; + struct tcpcb *otp = NULL, *tp; short ostate; /* @@ -123,13 +122,14 @@ tcp_timer_delack(void *arg) * ACK callout. */ NET_LOCK(); + tp = intotcpcb(inp); /* Ignore canceled timeouts or timeouts that have been rescheduled. */ - if (!ISSET((tp)->t_flags, TF_TMR_DELACK) || + if (tp == NULL || !ISSET(tp->t_flags, TF_TMR_DELACK) || timeout_pending(&tp->t_timer[TCPT_DELACK])) goto out; - CLR((tp)->t_flags, TF_TMR_DELACK); + CLR(tp->t_flags, TF_TMR_DELACK); - if (tp->t_inpcb->inp_socket->so_options & SO_DEBUG) { + if (inp->inp_socket->so_options & SO_DEBUG) { otp = tp; ostate = tp->t_state; } @@ -139,6 +139,7 @@ tcp_timer_delack(void *arg) tcp_trace(TA_TIMER, ostate, tp, otp, NULL, TCPT_DELACK, 0); out: NET_UNLOCK(); + in_pcbunref(inp); } /* @@ -167,10 +168,10 @@ tcp_canceltimers(struct tcpcb *tp) TCP_TIMER_DISARM(tp, i); } -int tcp_backoff[TCP_MAXRXTSHIFT + 1] = +const int tcp_backoff[TCP_MAXRXTSHIFT + 1] = { 1, 2, 4, 8, 16, 32, 64, 64, 64, 64, 64, 64, 64 }; -int tcp_totbackoff = 511; /* sum of tcp_backoff[] */ +const int tcp_totbackoff = 511; /* sum of tcp_backoff[] */ /* * TCP timer processing. @@ -197,19 +198,18 @@ tcp_timer_freesack(struct tcpcb *tp) void tcp_timer_rexmt(void *arg) { - struct tcpcb *otp = NULL, *tp = arg; - struct inpcb *inp; + struct inpcb *inp = arg; + struct tcpcb *otp = NULL, *tp; uint32_t rto; short ostate; NET_LOCK(); - inp = tp->t_inpcb; - + tp = intotcpcb(inp); /* Ignore canceled timeouts or timeouts that have been rescheduled. */ - if (!ISSET((tp)->t_flags, TF_TMR_REXMT) || + if (tp == NULL || !ISSET(tp->t_flags, TF_TMR_REXMT) || timeout_pending(&tp->t_timer[TCPT_REXMT])) goto out; - CLR((tp)->t_flags, TF_TMR_REXMT); + CLR(tp->t_flags, TF_TMR_REXMT); if ((tp->t_flags & TF_PMTUD_PEND) && inp && SEQ_GEQ(tp->t_pmtud_th_seq, tp->snd_una) && @@ -343,7 +343,7 @@ tcp_timer_rexmt(void *arg) * blocks ecn packets. fall back to non-ecn. */ if ((tp->t_state == TCPS_SYN_SENT || tp->t_state == TCPS_SYN_RECEIVED) - && tcp_do_ecn && !(tp->t_flags & TF_DISABLE_ECN)) + && atomic_load_int(&tcp_do_ecn) && !(tp->t_flags & TF_DISABLE_ECN)) tp->t_flags |= TF_DISABLE_ECN; #endif /* @@ -392,27 +392,30 @@ tcp_timer_rexmt(void *arg) tcp_trace(TA_TIMER, ostate, tp, otp, NULL, TCPT_REXMT, 0); out: NET_UNLOCK(); + in_pcbunref(inp); } void tcp_timer_persist(void *arg) { - struct tcpcb *otp = NULL, *tp = arg; + struct inpcb *inp = arg; + struct tcpcb *otp = NULL, *tp; uint32_t rto; short ostate; uint64_t now; NET_LOCK(); + tp = intotcpcb(inp); /* Ignore canceled timeouts or timeouts that have been rescheduled. */ - if (!ISSET((tp)->t_flags, TF_TMR_PERSIST) || + if (tp == NULL || !ISSET(tp->t_flags, TF_TMR_PERSIST) || timeout_pending(&tp->t_timer[TCPT_PERSIST])) goto out; - CLR((tp)->t_flags, TF_TMR_PERSIST); + CLR(tp->t_flags, TF_TMR_PERSIST); if (TCP_TIMER_ISARMED(tp, TCPT_REXMT)) goto out; - if (tp->t_inpcb->inp_socket->so_options & SO_DEBUG) { + if (inp->inp_socket->so_options & SO_DEBUG) { otp = tp; ostate = tp->t_state; } @@ -443,30 +446,36 @@ tcp_timer_persist(void *arg) tcp_trace(TA_TIMER, ostate, tp, otp, NULL, TCPT_PERSIST, 0); out: NET_UNLOCK(); + in_pcbunref(inp); } void tcp_timer_keep(void *arg) { - struct tcpcb *otp = NULL, *tp = arg; + struct inpcb *inp = arg; + struct tcpcb *otp = NULL, *tp; short ostate; NET_LOCK(); + tp = intotcpcb(inp); /* Ignore canceled timeouts or timeouts that have been rescheduled. */ - if (!ISSET((tp)->t_flags, TF_TMR_KEEP) || + if (tp == NULL || !ISSET(tp->t_flags, TF_TMR_KEEP) || timeout_pending(&tp->t_timer[TCPT_KEEP])) goto out; - CLR((tp)->t_flags, TF_TMR_KEEP); + CLR(tp->t_flags, TF_TMR_KEEP); - if (tp->t_inpcb->inp_socket->so_options & SO_DEBUG) { + if (inp->inp_socket->so_options & SO_DEBUG) { otp = tp; ostate = tp->t_state; } tcpstat_inc(tcps_keeptimeo); - if (TCPS_HAVEESTABLISHED(tp->t_state) == 0) - goto dropit; - if ((tcp_always_keepalive || - tp->t_inpcb->inp_socket->so_options & SO_KEEPALIVE) && + if (TCPS_HAVEESTABLISHED(tp->t_state) == 0) { + tcpstat_inc(tcps_keepdrops); + tp = tcp_drop(tp, ETIMEDOUT); + goto out; + } + if ((atomic_load_int(&tcp_always_keepalive) || + inp->inp_socket->so_options & SO_KEEPALIVE) && tp->t_state <= TCPS_CLOSING) { int maxidle; uint64_t now; @@ -474,8 +483,11 @@ tcp_timer_keep(void *arg) maxidle = READ_ONCE(tcp_maxidle); now = tcp_now(); if ((maxidle > 0) && - ((now - tp->t_rcvtime) >= tcp_keepidle + maxidle)) - goto dropit; + ((now - tp->t_rcvtime) >= tcp_keepidle + maxidle)) { + tcpstat_inc(tcps_keepdrops); + tp = tcp_drop(tp, ETIMEDOUT); + goto out; + } /* * Send a packet designed to force a response * if the peer is up and reachable: @@ -498,30 +510,27 @@ tcp_timer_keep(void *arg) tcp_trace(TA_TIMER, ostate, tp, otp, NULL, TCPT_KEEP, 0); out: NET_UNLOCK(); - return; - - dropit: - tcpstat_inc(tcps_keepdrops); - tp = tcp_drop(tp, ETIMEDOUT); - NET_UNLOCK(); + in_pcbunref(inp); } void tcp_timer_2msl(void *arg) { - struct tcpcb *otp = NULL, *tp = arg; + struct inpcb *inp = arg; + struct tcpcb *otp = NULL, *tp; short ostate; int maxidle; uint64_t now; NET_LOCK(); + tp = intotcpcb(inp); /* Ignore canceled timeouts or timeouts that have been rescheduled. */ - if (!ISSET((tp)->t_flags, TF_TMR_2MSL) || + if (tp == NULL || !ISSET(tp->t_flags, TF_TMR_2MSL) || timeout_pending(&tp->t_timer[TCPT_2MSL])) goto out; - CLR((tp)->t_flags, TF_TMR_2MSL); + CLR(tp->t_flags, TF_TMR_2MSL); - if (tp->t_inpcb->inp_socket->so_options & SO_DEBUG) { + if (inp->inp_socket->so_options & SO_DEBUG) { otp = tp; ostate = tp->t_state; } @@ -538,6 +547,7 @@ tcp_timer_2msl(void *arg) tcp_trace(TA_TIMER, ostate, tp, otp, NULL, TCPT_2MSL, 0); out: NET_UNLOCK(); + in_pcbunref(inp); } void @@ -554,5 +564,4 @@ tcp_timer_reaper(void *arg) * Freeing may run in parallel as it does not grab the net lock. */ pool_put(&tcpcb_pool, tp); - tcpstat_inc(tcps_closed); } diff --git a/sys/netinet/tcp_timer.h b/sys/netinet/tcp_timer.h index a26a7b3e3..c3e6eca60 100644 --- a/sys/netinet/tcp_timer.h +++ b/sys/netinet/tcp_timer.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tcp_timer.h,v 1.21 2024/01/29 22:47:13 bluhm Exp $ */ +/* $OpenBSD: tcp_timer.h,v 1.25 2025/01/03 17:23:51 bluhm Exp $ */ /* $NetBSD: tcp_timer.h,v 1.6 1995/03/26 20:32:37 jtc Exp $ */ /* @@ -42,10 +42,9 @@ #define TCPT_PERSIST 1 /* retransmit persistence */ #define TCPT_KEEP 2 /* keep alive */ #define TCPT_2MSL 3 /* 2*msl quiet time timer */ -#define TCPT_REAPER 4 /* delayed cleanup timeout */ -#define TCPT_DELACK 5 /* delayed ack timeout */ +#define TCPT_DELACK 4 /* delayed ack timeout */ -#define TCPT_NTIMERS 6 +#define TCPT_NTIMERS 5 /* * The TCPT_REXMT timer is used to force retransmissions. @@ -110,7 +109,7 @@ #ifdef TCPTIMERS const char *tcptimers[TCPT_NTIMERS] = - { "REXMT", "PERSIST", "KEEP", "2MSL", "REAPER", "DELACK" }; + { "REXMT", "PERSIST", "KEEP", "2MSL", "DELACK" }; #endif /* TCPTIMERS */ /* @@ -118,19 +117,21 @@ const char *tcptimers[TCPT_NTIMERS] = */ #define TCP_TIMER_INIT(tp, timer) \ timeout_set_flags(&(tp)->t_timer[(timer)], \ - tcp_timer_funcs[(timer)], tp, KCLOCK_NONE, \ - TIMEOUT_PROC | TIMEOUT_MPSAFE) + tcp_timer_funcs[(timer)], (tp)->t_inpcb, \ + KCLOCK_NONE, TIMEOUT_PROC | TIMEOUT_MPSAFE) #define TCP_TIMER_ARM(tp, timer, msecs) \ do { \ SET((tp)->t_flags, TF_TIMER << (timer)); \ - timeout_add_msec(&(tp)->t_timer[(timer)], (msecs)); \ + if (timeout_add_msec(&(tp)->t_timer[(timer)], (msecs))) \ + in_pcbref((tp)->t_inpcb); \ } while (0) #define TCP_TIMER_DISARM(tp, timer) \ do { \ CLR((tp)->t_flags, TF_TIMER << (timer)); \ - timeout_del(&(tp)->t_timer[(timer)]); \ + if (timeout_del(&(tp)->t_timer[(timer)])) \ + in_pcbunref((tp)->t_inpcb); \ } while (0) #define TCP_TIMER_ISARMED(tp, timer) \ @@ -155,13 +156,15 @@ extern const tcp_timer_func_t tcp_timer_funcs[TCPT_NTIMERS]; extern int tcp_delack_msecs; /* delayed ACK timeout in millisecs */ extern int tcptv_keep_init; -extern int tcp_always_keepalive; /* assume SO_KEEPALIVE is always set */ +extern int tcp_always_keepalive; /* [a] assume SO_KEEPALIVE always set */ extern int tcp_keepidle; /* time before keepalive probes begin */ extern int tcp_keepintvl; /* time between keepalive probes */ extern int tcp_maxidle; /* time to drop after starting probes */ extern int tcp_ttl; /* time to live for TCP segs */ -extern int tcp_backoff[]; +extern const int tcp_backoff[]; void tcp_timer_init(void); +void tcp_timer_reaper(void *); + #endif /* _KERNEL */ #endif /* _NETINET_TCP_TIMER_H_ */ diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c index 7704890af..9a8a12098 100644 --- a/sys/netinet/tcp_usrreq.c +++ b/sys/netinet/tcp_usrreq.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tcp_usrreq.c,v 1.231 2024/04/12 16:07:09 bluhm Exp $ */ +/* $OpenBSD: tcp_usrreq.c,v 1.238 2025/01/05 12:23:38 bluhm Exp $ */ /* $NetBSD: tcp_usrreq.c,v 1.20 1996/02/13 23:44:16 christos Exp $ */ /* @@ -102,15 +102,20 @@ #include #endif +/* + * Locks used to protect global variables in this file: + * I immutable after creation + */ + #ifndef TCP_SENDSPACE #define TCP_SENDSPACE 1024*16 #endif -u_int tcp_sendspace = TCP_SENDSPACE; +u_int tcp_sendspace = TCP_SENDSPACE; /* [I] */ #ifndef TCP_RECVSPACE #define TCP_RECVSPACE 1024*16 #endif -u_int tcp_recvspace = TCP_RECVSPACE; -u_int tcp_autorcvbuf_inc = 16 * 1024; +u_int tcp_recvspace = TCP_RECVSPACE; /* [I] */ +u_int tcp_autorcvbuf_inc = 16 * 1024; /* [I] */ const struct pr_usrreqs tcp_usrreqs = { .pru_attach = tcp_attach, @@ -193,8 +198,10 @@ tcp_sogetpcb(struct socket *so, struct inpcb **rinp, struct tcpcb **rtp) * structure will point at a subsidiary (struct tcpcb). */ if ((inp = sotoinpcb(so)) == NULL || (tp = intotcpcb(inp)) == NULL) { - if (so->so_error) - return so->so_error; + int error; + + if ((error = READ_ONCE(so->so_error))) + return error; return EINVAL; } @@ -291,14 +298,18 @@ tcp_fill_info(struct tcpcb *tp, struct socket *so, struct mbuf *m) ti->tcpi_rfbuf_cnt = tp->rfbuf_cnt; ti->tcpi_rfbuf_ts = (now - tp->rfbuf_ts) * t; + mtx_enter(&so->so_rcv.sb_mtx); ti->tcpi_so_rcv_sb_cc = so->so_rcv.sb_cc; ti->tcpi_so_rcv_sb_hiwat = so->so_rcv.sb_hiwat; ti->tcpi_so_rcv_sb_lowat = so->so_rcv.sb_lowat; ti->tcpi_so_rcv_sb_wat = so->so_rcv.sb_wat; + mtx_leave(&so->so_rcv.sb_mtx); + mtx_enter(&so->so_snd.sb_mtx); ti->tcpi_so_snd_sb_cc = so->so_snd.sb_cc; ti->tcpi_so_snd_sb_hiwat = so->so_snd.sb_hiwat; ti->tcpi_so_snd_sb_lowat = so->so_snd.sb_lowat; ti->tcpi_so_snd_sb_wat = so->so_snd.sb_wat; + mtx_leave(&so->so_snd.sb_mtx); return 0; } @@ -835,7 +846,9 @@ tcp_send(struct socket *so, struct mbuf *m, struct mbuf *nam, if (so->so_options & SO_DEBUG) ostate = tp->t_state; + mtx_enter(&so->so_snd.sb_mtx); sbappendstream(so, &so->so_snd, m); + mtx_leave(&so->so_snd.sb_mtx); m = NULL; error = tcp_output(tp); @@ -888,7 +901,9 @@ tcp_sense(struct socket *so, struct stat *ub) if ((error = tcp_sogetpcb(so, &inp, &tp))) return (error); + mtx_enter(&so->so_snd.sb_mtx); ub->st_blksize = so->so_snd.sb_hiwat; + mtx_leave(&so->so_snd.sb_mtx); if (so->so_options & SO_DEBUG) tcp_trace(TA_USER, tp->t_state, tp, tp, NULL, PRU_SENSE, 0); @@ -963,7 +978,9 @@ tcp_sendoob(struct socket *so, struct mbuf *m, struct mbuf *nam, * of data past the urgent section. * Otherwise, snd_up should be one lower. */ + mtx_enter(&so->so_snd.sb_mtx); sbappendstream(so, &so->so_snd, m); + mtx_leave(&so->so_snd.sb_mtx); m = NULL; tp->snd_up = tp->snd_una + so->so_snd.sb_cc; tp->t_force = 1; @@ -1039,7 +1056,9 @@ tcp_dodisconnect(struct tcpcb *tp) tp = tcp_drop(tp, 0); else { soisdisconnecting(so); + mtx_enter(&so->so_rcv.sb_mtx); sbflush(so, &so->so_rcv); + mtx_leave(&so->so_rcv.sb_mtx); tp = tcp_usrclosed(tp); if (tp) (void) tcp_output(tp); @@ -1332,7 +1351,7 @@ tcp_sysctl_tcpstat(void *oldp, size_t *oldlenp, void *newp) set = &tcp_syn_cache[tcp_syn_cache_active]; tcpstat.tcps_sc_hash_size = set->scs_size; tcpstat.tcps_sc_entry_count = set->scs_count; - tcpstat.tcps_sc_entry_limit = tcp_syn_cache_limit; + tcpstat.tcps_sc_entry_limit = atomic_load_int(&tcp_syn_cache_limit); tcpstat.tcps_sc_bucket_maxlen = 0; for (i = 0; i < set->scs_size; i++) { if (tcpstat.tcps_sc_bucket_maxlen < @@ -1340,7 +1359,7 @@ tcp_sysctl_tcpstat(void *oldp, size_t *oldlenp, void *newp) tcpstat.tcps_sc_bucket_maxlen = set->scs_buckethead[i].sch_length; } - tcpstat.tcps_sc_bucket_limit = tcp_syn_bucket_limit; + tcpstat.tcps_sc_bucket_limit = atomic_load_int(&tcp_syn_bucket_limit); tcpstat.tcps_sc_uses_left = set->scs_use; mtx_leave(&syn_cache_mtx); @@ -1355,7 +1374,7 @@ int tcp_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen) { - int error, nval; + int error, oval, nval; /* All sysctl names at this level are terminal. */ if (namelen != 1) @@ -1448,30 +1467,29 @@ tcp_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, return (tcp_sysctl_tcpstat(oldp, oldlenp, newp)); case TCPCTL_SYN_USE_LIMIT: - NET_LOCK(); + oval = nval = atomic_load_int(&tcp_syn_use_limit); error = sysctl_int_bounded(oldp, oldlenp, newp, newlen, - &tcp_syn_use_limit, 0, INT_MAX); - if (!error && newp != NULL) { + &nval, 0, INT_MAX); + if (!error && oval != nval) { /* * Global tcp_syn_use_limit is used when reseeding a * new cache. Also update the value in active cache. */ mtx_enter(&syn_cache_mtx); - if (tcp_syn_cache[0].scs_use > tcp_syn_use_limit) - tcp_syn_cache[0].scs_use = tcp_syn_use_limit; - if (tcp_syn_cache[1].scs_use > tcp_syn_use_limit) - tcp_syn_cache[1].scs_use = tcp_syn_use_limit; + if (tcp_syn_cache[0].scs_use > nval) + tcp_syn_cache[0].scs_use = nval; + if (tcp_syn_cache[1].scs_use > nval) + tcp_syn_cache[1].scs_use = nval; + tcp_syn_use_limit = nval; mtx_leave(&syn_cache_mtx); } - NET_UNLOCK(); return (error); case TCPCTL_SYN_HASH_SIZE: - NET_LOCK(); - nval = tcp_syn_hash_size; + oval = nval = atomic_load_int(&tcp_syn_hash_size); error = sysctl_int_bounded(oldp, oldlenp, newp, newlen, &nval, 1, 100000); - if (!error && nval != tcp_syn_hash_size) { + if (!error && oval != nval) { /* * If global hash size has been changed, * switch sets as soon as possible. Then @@ -1485,14 +1503,11 @@ tcp_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, tcp_syn_hash_size = nval; mtx_leave(&syn_cache_mtx); } - NET_UNLOCK(); return (error); default: - NET_LOCK(); error = sysctl_bounded_arr(tcpctl_vars, nitems(tcpctl_vars), name, namelen, oldp, oldlenp, newp, newlen); - NET_UNLOCK(); return (error); } /* NOTREACHED */ @@ -1510,22 +1525,27 @@ void tcp_update_sndspace(struct tcpcb *tp) { struct socket *so = tp->t_inpcb->inp_socket; - u_long nmax = so->so_snd.sb_hiwat; + u_long nmax; + + mtx_enter(&so->so_snd.sb_mtx); + + nmax = so->so_snd.sb_hiwat; if (sbchecklowmem()) { /* low on memory try to get rid of some */ if (tcp_sendspace < nmax) nmax = tcp_sendspace; - } else if (so->so_snd.sb_wat != tcp_sendspace) + } else if (so->so_snd.sb_wat != tcp_sendspace) { /* user requested buffer size, auto-scaling disabled */ nmax = so->so_snd.sb_wat; - else + } else { /* automatic buffer scaling */ nmax = MIN(sb_max, so->so_snd.sb_wat + tp->snd_max - tp->snd_una); + } /* a writable socket must be preserved because of poll(2) semantics */ - if (sbspace(so, &so->so_snd) >= so->so_snd.sb_lowat) { + if (sbspace_locked(so, &so->so_snd) >= so->so_snd.sb_lowat) { if (nmax < so->so_snd.sb_cc + so->so_snd.sb_lowat) nmax = so->so_snd.sb_cc + so->so_snd.sb_lowat; /* keep in sync with sbreserve() calculation */ @@ -1538,6 +1558,8 @@ tcp_update_sndspace(struct tcpcb *tp) if (nmax != so->so_snd.sb_hiwat) sbreserve(so, &so->so_snd, nmax); + + mtx_leave(&so->so_snd.sb_mtx); } /* @@ -1550,16 +1572,20 @@ void tcp_update_rcvspace(struct tcpcb *tp) { struct socket *so = tp->t_inpcb->inp_socket; - u_long nmax = so->so_rcv.sb_hiwat; + u_long nmax; + + mtx_enter(&so->so_rcv.sb_mtx); + + nmax = so->so_rcv.sb_hiwat; if (sbchecklowmem()) { /* low on memory try to get rid of some */ if (tcp_recvspace < nmax) nmax = tcp_recvspace; - } else if (so->so_rcv.sb_wat != tcp_recvspace) + } else if (so->so_rcv.sb_wat != tcp_recvspace) { /* user requested buffer size, auto-scaling disabled */ nmax = so->so_rcv.sb_wat; - else { + } else { /* automatic buffer scaling */ if (tp->rfbuf_cnt > so->so_rcv.sb_hiwat / 8 * 7) nmax = MIN(sb_max, so->so_rcv.sb_hiwat + @@ -1567,14 +1593,17 @@ tcp_update_rcvspace(struct tcpcb *tp) } /* a readable socket must be preserved because of poll(2) semantics */ + mtx_enter(&so->so_snd.sb_mtx); if (so->so_rcv.sb_cc >= so->so_rcv.sb_lowat && nmax < so->so_snd.sb_lowat) nmax = so->so_snd.sb_lowat; + mtx_leave(&so->so_snd.sb_mtx); - if (nmax == so->so_rcv.sb_hiwat) - return; + if (nmax != so->so_rcv.sb_hiwat) { + /* round to MSS boundary */ + nmax = roundup(nmax, tp->t_maxseg); + sbreserve(so, &so->so_rcv, nmax); + } - /* round to MSS boundary */ - nmax = roundup(nmax, tp->t_maxseg); - sbreserve(so, &so->so_rcv, nmax); + mtx_leave(&so->so_rcv.sb_mtx); } diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h index 0f1c80eac..137c84123 100644 --- a/sys/netinet/tcp_var.h +++ b/sys/netinet/tcp_var.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tcp_var.h,v 1.178 2024/05/13 01:15:53 jsg Exp $ */ +/* $OpenBSD: tcp_var.h,v 1.184 2025/01/05 12:18:48 bluhm Exp $ */ /* $NetBSD: tcp_var.h,v 1.17 1996/02/13 23:44:24 christos Exp $ */ /* @@ -70,6 +70,7 @@ struct tcpqent { struct tcpcb { struct tcpqehead t_segq; /* sequencing queue */ struct timeout t_timer[TCPT_NTIMERS]; /* tcp timers */ + struct timeout t_timer_reaper; /* reaper is special, no refcnt */ short t_state; /* state of this connection */ short t_rxtshift; /* log(2) of rexmt exp. backoff */ int t_rxtcur; /* current retransmit value */ @@ -102,8 +103,7 @@ struct tcpcb { #define TF_TMR_PERSIST 0x08000000U /* retransmit persistence timer armed */ #define TF_TMR_KEEP 0x10000000U /* keep alive timer armed */ #define TF_TMR_2MSL 0x20000000U /* 2*msl quiet time timer armed */ -#define TF_TMR_REAPER 0x40000000U /* delayed cleanup timer armed, dead */ -#define TF_TMR_DELACK 0x80000000U /* delayed ack timer armed */ +#define TF_TMR_DELACK 0x40000000U /* delayed ack timer armed */ #define TF_TIMER TF_TMR_REXMT /* used to shift with TCPT values */ struct mbuf *t_template; /* skeletal packet for transmit */ @@ -278,7 +278,7 @@ struct syn_cache { u_int sc_request_r_scale : 4, /* [I] */ sc_requested_s_scale : 4; /* [I] */ - struct tcpcb *sc_tp; /* [S] tcb for listening socket */ + struct inpcb *sc_inplisten; /* [S] inpcb for listening socket */ LIST_ENTRY(syn_cache) sc_tpq; /* [S] list of entries by same tp */ }; @@ -677,17 +677,18 @@ extern const struct pr_usrreqs tcp6_usrreqs; extern struct pool tcpcb_pool; extern struct inpcbtable tcbtable, tcb6table; /* queue of active tcpcb's */ -extern int tcp_do_rfc1323; /* enabled/disabled? */ +extern int tcp_do_rfc1323; /* [a] enabled/disabled? */ +extern const int tcprexmtthresh; extern int tcptv_keep_init; /* [N] time to keep alive initial SYN packet */ -extern int tcp_mssdflt; /* default maximum segment size */ -extern int tcp_rst_ppslim; /* maximum outgoing RST packet per second */ -extern int tcp_ack_on_push; /* ACK immediately on PUSH */ -extern int tcp_do_sack; /* SACK enabled/disabled */ +extern int tcp_mssdflt; /* [a] default maximum segment size */ +extern int tcp_rst_ppslim; /* [a] maximum outgoing RST packet per second */ +extern int tcp_ack_on_push; /* [a] ACK immediately on PUSH */ +extern int tcp_do_sack; /* [a] SACK enabled/disabled */ extern struct pool sackhl_pool; extern int tcp_sackhole_limit; /* max entries for tcp sack queues */ -extern int tcp_do_ecn; /* RFC3168 ECN enabled/disabled? */ -extern int tcp_do_rfc3390; /* RFC3390 Increasing TCP's Initial Window */ -extern int tcp_do_tso; /* enable TSO for TCP output packets */ +extern int tcp_do_ecn; /* [a] RFC3168 ECN enabled/disabled? */ +extern int tcp_do_rfc3390; /* [a] RFC3390 Increasing TCP Initial Window */ +extern int tcp_do_tso; /* [a] enable TSO for TCP output packets */ extern struct pool tcpqe_pool; extern int tcp_reass_limit; /* max entries for tcp reass queues */ diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index 4638f3727..4883619fd 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -1,4 +1,4 @@ -/* $OpenBSD: udp_usrreq.c,v 1.324 2024/08/06 20:15:53 mvs Exp $ */ +/* $OpenBSD: udp_usrreq.c,v 1.329 2025/01/01 13:44:22 bluhm Exp $ */ /* $NetBSD: udp_usrreq.c,v 1.28 1996/03/16 23:54:03 christos Exp $ */ /* @@ -172,6 +172,7 @@ void udp_sbappend(struct inpcb *, struct mbuf *, struct ip *, u_int32_t); int udp_output(struct inpcb *, struct mbuf *, struct mbuf *, struct mbuf *); void udp_notify(struct inpcb *, int); +int udp_sysctl_locked(int *, u_int, void *, size_t *, void *, size_t); int udp_sysctl_udpstat(void *, size_t *, void *); #ifndef UDB_INITIAL_HASH_SIZE @@ -298,6 +299,7 @@ udp_input(struct mbuf **mp, int *offp, int proto, int af) } } } + CLR(m->m_pkthdr.csum_flags, M_UDP_CSUM_OUT); #ifdef IPSEC if (udpencap_enable && udpencap_port && esp_enable && @@ -381,8 +383,9 @@ udp_input(struct mbuf **mp, int *offp, int proto, int af) } if (m->m_flags & (M_BCAST|M_MCAST)) { - SIMPLEQ_HEAD(, inpcb) inpcblist; struct inpcbtable *table; + struct inpcb_iterator iter = { .inp_table = NULL }; + struct inpcb *last; /* * Deliver a multicast or broadcast datagram to *all* sockets @@ -400,11 +403,6 @@ udp_input(struct mbuf **mp, int *offp, int proto, int af) * fixing the interface. Maybe 4.5BSD will remedy this?) */ - /* - * Locate pcb(s) for datagram. - * (Algorithm copied from raw_intr().) - */ - SIMPLEQ_INIT(&inpcblist); #ifdef INET6 if (ip6) table = &udb6table; @@ -412,9 +410,9 @@ udp_input(struct mbuf **mp, int *offp, int proto, int af) #endif table = &udbtable; - rw_enter_write(&table->inpt_notify); mtx_enter(&table->inpt_mtx); - TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) { + last = inp = NULL; + while ((inp = in_pcb_iterator(table, inp, &iter)) != NULL) { if (ip6) KASSERT(ISSET(inp->inp_flags, INP_IPV6)); else @@ -465,8 +463,21 @@ udp_input(struct mbuf **mp, int *offp, int proto, int af) continue; } - in_pcbref(inp); - SIMPLEQ_INSERT_TAIL(&inpcblist, inp, inp_notify); + if (last != NULL) { + struct mbuf *n; + + mtx_leave(&table->inpt_mtx); + + n = m_copym(m, 0, M_COPYALL, M_NOWAIT); + if (n != NULL) { + udp_sbappend(last, n, ip, ip6, iphlen, + uh, &srcsa.sa, 0); + } + in_pcbunref(last); + + mtx_enter(&table->inpt_mtx); + } + last = in_pcbref(inp); /* * Don't look for additional matches if this one does @@ -477,38 +488,26 @@ udp_input(struct mbuf **mp, int *offp, int proto, int af) * clear these options after setting them. */ if ((inp->inp_socket->so_options & (SO_REUSEPORT | - SO_REUSEADDR)) == 0) + SO_REUSEADDR)) == 0) { + in_pcb_iterator_abort(table, inp, &iter); break; + } } mtx_leave(&table->inpt_mtx); - if (SIMPLEQ_EMPTY(&inpcblist)) { - rw_exit_write(&table->inpt_notify); - + if (last == NULL) { /* * No matching pcb found; discard datagram. * (No need to send an ICMP Port Unreachable * for a broadcast or multicast datgram.) */ udpstat_inc(udps_noportbcast); - goto bad; + m_freem(m); + return IPPROTO_DONE; } - while ((inp = SIMPLEQ_FIRST(&inpcblist)) != NULL) { - struct mbuf *n; - - SIMPLEQ_REMOVE_HEAD(&inpcblist, inp_notify); - if (SIMPLEQ_EMPTY(&inpcblist)) - n = m; - else - n = m_copym(m, 0, M_COPYALL, M_NOWAIT); - if (n != NULL) { - udp_sbappend(inp, n, ip, ip6, iphlen, uh, - &srcsa.sa, 0); - } - in_pcbunref(inp); - } - rw_exit_write(&table->inpt_notify); + udp_sbappend(last, m, ip, ip6, iphlen, uh, &srcsa.sa, 0); + in_pcbunref(last); return IPPROTO_DONE; } @@ -1261,19 +1260,50 @@ int udp_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen) { - int error; - /* All sysctl names at this level are terminal. */ if (namelen != 1) return (ENOTDIR); + switch (name[0]) { + case UDPCTL_BADDYNAMIC: + case UDPCTL_ROOTONLY: { + size_t savelen = *oldlenp; + int error; + + if ((error = sysctl_vslock(oldp, savelen))) + return (error); + error = udp_sysctl_locked(name, namelen, oldp, oldlenp, + newp, newlen); + sysctl_vsunlock(oldp, savelen); + + return (error); + } + case UDPCTL_STATS: + if (newp != NULL) + return (EPERM); + + return (udp_sysctl_udpstat(oldp, oldlenp, newp)); + + default: + return (sysctl_bounded_arr(udpctl_vars, nitems(udpctl_vars), + name, namelen, oldp, oldlenp, newp, newlen)); + } + /* NOTREACHED */ +} + +int +udp_sysctl_locked(int *name, u_int namelen, void *oldp, size_t *oldlenp, + void *newp, size_t newlen) +{ + int error = ENOPROTOOPT; + switch (name[0]) { case UDPCTL_BADDYNAMIC: NET_LOCK(); error = sysctl_struct(oldp, oldlenp, newp, newlen, baddynamicports.udp, sizeof(baddynamicports.udp)); NET_UNLOCK(); - return (error); + break; case UDPCTL_ROOTONLY: if (newp && securelevel > 0) @@ -1282,20 +1312,10 @@ udp_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, error = sysctl_struct(oldp, oldlenp, newp, newlen, rootonlyports.udp, sizeof(rootonlyports.udp)); NET_UNLOCK(); - return (error); - - case UDPCTL_STATS: - if (newp != NULL) - return (EPERM); - - return (udp_sysctl_udpstat(oldp, oldlenp, newp)); - - default: - error = sysctl_bounded_arr(udpctl_vars, nitems(udpctl_vars), - name, namelen, oldp, oldlenp, newp, newlen); - return (error); + break; } - /* NOTREACHED */ + + return (error); } int diff --git a/sys/netinet6/icmp6.c b/sys/netinet6/icmp6.c index dbf8177a1..a238cd472 100644 --- a/sys/netinet6/icmp6.c +++ b/sys/netinet6/icmp6.c @@ -1,4 +1,4 @@ -/* $OpenBSD: icmp6.c,v 1.255 2024/08/12 11:25:27 bluhm Exp $ */ +/* $OpenBSD: icmp6.c,v 1.256 2025/01/03 21:27:40 bluhm Exp $ */ /* $KAME: icmp6.c,v 1.217 2001/06/20 15:03:29 jinmei Exp $ */ /* @@ -1016,16 +1016,20 @@ icmp6_mtudisc_update(struct ip6ctlparam *ip6cp, int validated) rt = icmp6_mtudisc_clone(&sin6, m->m_pkthdr.ph_rtableid, 0); if (rt != NULL && ISSET(rt->rt_flags, RTF_HOST) && - !(rt->rt_locks & RTV_MTU) && - (rt->rt_mtu > mtu || rt->rt_mtu == 0)) { - struct ifnet *ifp; + !(rt->rt_locks & RTV_MTU)) { + u_int rtmtu; - ifp = if_get(rt->rt_ifidx); - if (ifp != NULL && mtu < ifp->if_mtu) { - icmp6stat_inc(icp6s_pmtuchg); - rt->rt_mtu = mtu; + rtmtu = atomic_load_int(&rt->rt_mtu); + if (rtmtu > mtu || rtmtu == 0) { + struct ifnet *ifp; + + ifp = if_get(rt->rt_ifidx); + if (ifp != NULL && mtu < ifp->if_mtu) { + icmp6stat_inc(icp6s_pmtuchg); + atomic_cas_uint(&rt->rt_mtu, rtmtu, mtu); + } + if_put(ifp); } - if_put(ifp); } rtfree(rt); @@ -1848,7 +1852,7 @@ icmp6_mtudisc_timeout(struct rtentry *rt, u_int rtableid) rtdeletemsg(rt, ifp, rtableid); } else { if (!(rt->rt_locks & RTV_MTU)) - rt->rt_mtu = 0; + atomic_store_int(&rt->rt_mtu, 0); } if_put(ifp); diff --git a/sys/netinet6/in6_pcb.c b/sys/netinet6/in6_pcb.c index 0e6ab9fb5..1b4fc1786 100644 --- a/sys/netinet6/in6_pcb.c +++ b/sys/netinet6/in6_pcb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: in6_pcb.c,v 1.144 2024/04/12 16:07:09 bluhm Exp $ */ +/* $OpenBSD: in6_pcb.c,v 1.146 2024/12/21 00:10:04 mvs Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -427,8 +427,8 @@ in6_pcbnotify(struct inpcbtable *table, const struct sockaddr_in6 *dst, uint fport_arg, const struct sockaddr_in6 *src, uint lport_arg, u_int rtable, int cmd, void *cmdarg, void (*notify)(struct inpcb *, int)) { - SIMPLEQ_HEAD(, inpcb) inpcblist; - struct inpcb *inp; + struct inpcb_iterator iter = { .inp_table = NULL }; + struct inpcb *inp = NULL; u_short fport = fport_arg, lport = lport_arg; struct sockaddr_in6 sa6_src; int errno; @@ -474,11 +474,9 @@ in6_pcbnotify(struct inpcbtable *table, const struct sockaddr_in6 *dst, if (notify == NULL) return; - SIMPLEQ_INIT(&inpcblist); rdomain = rtable_l2(rtable); - rw_enter_write(&table->inpt_notify); mtx_enter(&table->inpt_mtx); - TAILQ_FOREACH(inp, &table->inpt_queue, inp_queue) { + while ((inp = in_pcb_iterator(table, inp, &iter)) != NULL) { KASSERT(ISSET(inp->inp_flags, INP_IPV6)); /* @@ -544,17 +542,11 @@ in6_pcbnotify(struct inpcbtable *table, const struct sockaddr_in6 *dst, continue; } do_notify: - in_pcbref(inp); - SIMPLEQ_INSERT_TAIL(&inpcblist, inp, inp_notify); + mtx_leave(&table->inpt_mtx); + (*notify)(inp, errno); + mtx_enter(&table->inpt_mtx); } mtx_leave(&table->inpt_mtx); - - while ((inp = SIMPLEQ_FIRST(&inpcblist)) != NULL) { - SIMPLEQ_REMOVE_HEAD(&inpcblist, inp_notify); - (*notify)(inp, errno); - in_pcbunref(inp); - } - rw_exit_write(&table->inpt_notify); } struct rtentry * diff --git a/sys/netinet6/in6_proto.c b/sys/netinet6/in6_proto.c index ba686c942..5fe3a45c6 100644 --- a/sys/netinet6/in6_proto.c +++ b/sys/netinet6/in6_proto.c @@ -1,4 +1,4 @@ -/* $OpenBSD: in6_proto.c,v 1.119 2024/08/20 07:46:27 mvs Exp $ */ +/* $OpenBSD: in6_proto.c,v 1.124 2025/01/05 12:36:48 bluhm Exp $ */ /* $KAME: in6_proto.c,v 1.66 2000/10/10 15:35:47 itojun Exp $ */ /* @@ -136,7 +136,7 @@ const struct protosw inet6sw[] = { .pr_type = SOCK_DGRAM, .pr_domain = &inet6domain, .pr_protocol = IPPROTO_UDP, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_SPLICE|PR_MPINPUT|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_SPLICE|PR_MPINPUT|PR_MPSYSCTL, .pr_input = udp_input, .pr_ctlinput = udp6_ctlinput, .pr_ctloutput = ip6_ctloutput, @@ -158,7 +158,7 @@ const struct protosw inet6sw[] = { .pr_type = SOCK_RAW, .pr_domain = &inet6domain, .pr_protocol = IPPROTO_RAW, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPINPUT|PR_MPSOCKET|PR_MPSYSCTL, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPINPUT|PR_MPSYSCTL, .pr_input = rip6_input, .pr_ctlinput = rip6_ctlinput, .pr_ctloutput = rip6_ctloutput, @@ -169,7 +169,7 @@ const struct protosw inet6sw[] = { .pr_type = SOCK_RAW, .pr_domain = &inet6domain, .pr_protocol = IPPROTO_ICMPV6, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR, .pr_input = icmp6_input, .pr_ctlinput = rip6_ctlinput, .pr_ctloutput = rip6_ctloutput, @@ -204,7 +204,7 @@ const struct protosw inet6sw[] = { .pr_type = SOCK_RAW, .pr_domain = &inet6domain, .pr_protocol = IPPROTO_AH, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSYSCTL, .pr_input = ah46_input, .pr_ctloutput = rip6_ctloutput, .pr_usrreqs = &rip6_usrreqs, @@ -214,7 +214,7 @@ const struct protosw inet6sw[] = { .pr_type = SOCK_RAW, .pr_domain = &inet6domain, .pr_protocol = IPPROTO_ESP, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR, .pr_input = esp46_input, .pr_ctloutput = rip6_ctloutput, .pr_usrreqs = &rip6_usrreqs, @@ -224,7 +224,7 @@ const struct protosw inet6sw[] = { .pr_type = SOCK_RAW, .pr_domain = &inet6domain, .pr_protocol = IPPROTO_IPCOMP, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSYSCTL, .pr_input = ipcomp46_input, .pr_ctloutput = rip6_ctloutput, .pr_usrreqs = &rip6_usrreqs, @@ -235,7 +235,7 @@ const struct protosw inet6sw[] = { .pr_type = SOCK_RAW, .pr_domain = &inet6domain, .pr_protocol = IPPROTO_IPV4, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR, #if NGIF > 0 .pr_input = in6_gif_input, #else @@ -248,7 +248,7 @@ const struct protosw inet6sw[] = { .pr_type = SOCK_RAW, .pr_domain = &inet6domain, .pr_protocol = IPPROTO_IPV6, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR, #if NGIF > 0 .pr_input = in6_gif_input, #else @@ -262,7 +262,7 @@ const struct protosw inet6sw[] = { .pr_type = SOCK_RAW, .pr_domain = &inet6domain, .pr_protocol = IPPROTO_MPLS, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR, #if NGIF > 0 .pr_input = in6_gif_input, #else @@ -277,7 +277,7 @@ const struct protosw inet6sw[] = { .pr_type = SOCK_RAW, .pr_domain = &inet6domain, .pr_protocol = IPPROTO_CARP, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSYSCTL, .pr_input = carp6_proto_input, .pr_ctloutput = rip6_ctloutput, .pr_usrreqs = &rip6_usrreqs, @@ -289,7 +289,7 @@ const struct protosw inet6sw[] = { .pr_type = SOCK_RAW, .pr_domain = &inet6domain, .pr_protocol = IPPROTO_DIVERT, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET|PR_MPSYSCTL, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSYSCTL, .pr_ctloutput = rip6_ctloutput, .pr_usrreqs = &divert6_usrreqs, .pr_init = divert6_init, @@ -301,7 +301,7 @@ const struct protosw inet6sw[] = { .pr_type = SOCK_RAW, .pr_domain = &inet6domain, .pr_protocol = IPPROTO_ETHERIP, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR, .pr_input = ip6_etherip_input, .pr_ctloutput = rip6_ctloutput, .pr_usrreqs = &rip6_usrreqs, @@ -312,7 +312,7 @@ const struct protosw inet6sw[] = { .pr_type = SOCK_RAW, .pr_domain = &inet6domain, .pr_protocol = IPPROTO_GRE, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR, .pr_input = gre_input6, .pr_ctloutput = rip6_ctloutput, .pr_usrreqs = &rip6_usrreqs, @@ -322,7 +322,7 @@ const struct protosw inet6sw[] = { /* raw wildcard */ .pr_type = SOCK_RAW, .pr_domain = &inet6domain, - .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPINPUT|PR_MPSOCKET, + .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPINPUT, .pr_input = rip6_input, .pr_ctloutput = rip6_ctloutput, .pr_usrreqs = &rip6_usrreqs, diff --git a/sys/netinet6/in6_src.c b/sys/netinet6/in6_src.c index b7097b434..307354761 100644 --- a/sys/netinet6/in6_src.c +++ b/sys/netinet6/in6_src.c @@ -1,4 +1,4 @@ -/* $OpenBSD: in6_src.c,v 1.99 2024/04/21 17:32:11 florian Exp $ */ +/* $OpenBSD: in6_src.c,v 1.100 2025/01/01 13:44:22 bluhm Exp $ */ /* $KAME: in6_src.c,v 1.36 2001/02/06 04:08:17 itojun Exp $ */ /* @@ -318,7 +318,7 @@ in6_selectroute(const struct in6_addr *dst, struct ip6_pktopts *opts, opts->ip6po_pktinfo->ipi6_ifindex) { if (rt != NULL && !ISSET(rt->rt_flags, RTF_LOCAL) && rt->rt_ifidx != opts->ip6po_pktinfo->ipi6_ifindex) { - return (NULL); + return (NULL); } } @@ -349,7 +349,7 @@ in6_selectif(const struct in6_addr *dst, struct ip6_pktopts *opts, */ if (IN6_IS_ADDR_MULTICAST(dst) && mopts != NULL && (*retifp = if_get(mopts->im6o_ifidx)) != NULL) - return (0); + return (0); rt = in6_selectroute(dst, opts, ro, rtableid); if (rt == NULL) diff --git a/sys/netinet6/ip6_forward.c b/sys/netinet6/ip6_forward.c index c4054781c..8b389b91b 100644 --- a/sys/netinet6/ip6_forward.c +++ b/sys/netinet6/ip6_forward.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ip6_forward.c,v 1.124 2024/07/19 16:58:32 bluhm Exp $ */ +/* $OpenBSD: ip6_forward.c,v 1.125 2025/01/03 21:27:40 bluhm Exp $ */ /* $KAME: ip6_forward.c,v 1.75 2001/06/29 12:42:13 jinmei Exp $ */ /* @@ -399,8 +399,11 @@ senderr: case EMSGSIZE: type = ICMP6_PACKET_TOO_BIG; if (rt != NULL) { - if (rt->rt_mtu) { - destmtu = rt->rt_mtu; + u_int rtmtu; + + rtmtu = atomic_load_int(&rt->rt_mtu); + if (rtmtu != 0) { + destmtu = rtmtu; } else { struct ifnet *destifp; diff --git a/sys/netinet6/ip6_id.c b/sys/netinet6/ip6_id.c index f41a6e6c8..7c5277927 100644 --- a/sys/netinet6/ip6_id.c +++ b/sys/netinet6/ip6_id.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ip6_id.c,v 1.18 2024/09/01 03:09:00 jsg Exp $ */ +/* $OpenBSD: ip6_id.c,v 1.19 2025/01/01 13:44:22 bluhm Exp $ */ /* $NetBSD: ip6_id.c,v 1.7 2003/09/13 21:32:59 itojun Exp $ */ /* $KAME: ip6_id.c,v 1.8 2003/09/06 13:41:06 itojun Exp $ */ @@ -229,4 +229,3 @@ ip6_randomflowlabel(void) { return ip6id_randomid(&randomtab_20) & 0xfffff; } - diff --git a/sys/netinet6/ip6_input.c b/sys/netinet6/ip6_input.c index 79ba29050..6768e4d25 100644 --- a/sys/netinet6/ip6_input.c +++ b/sys/netinet6/ip6_input.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ip6_input.c,v 1.266 2024/07/19 16:58:32 bluhm Exp $ */ +/* $OpenBSD: ip6_input.c,v 1.267 2024/11/21 20:15:44 bluhm Exp $ */ /* $KAME: ip6_input.c,v 1.188 2001/03/29 05:34:31 itojun Exp $ */ /* @@ -189,6 +189,12 @@ ip6_ours(struct mbuf **mp, int *offp, int nxt, int af, int flags) if (nxt == IPPROTO_DONE) return IPPROTO_DONE; + return ip6_ours_enqueue(mp, offp, nxt); +} + +int +ip6_ours_enqueue(struct mbuf **mp, int *offp, int nxt) +{ /* save values for later, use after dequeue */ if (*offp != sizeof(struct ip6_hdr)) { struct m_tag *mtag; diff --git a/sys/netinet6/ip6_mroute.h b/sys/netinet6/ip6_mroute.h index 3edf0a7c2..7547502e1 100644 --- a/sys/netinet6/ip6_mroute.h +++ b/sys/netinet6/ip6_mroute.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ip6_mroute.h,v 1.23 2022/05/05 13:57:41 claudio Exp $ */ +/* $OpenBSD: ip6_mroute.h,v 1.24 2025/01/01 13:44:22 bluhm Exp $ */ /* $KAME: ip6_mroute.h,v 1.17 2001/02/10 02:05:52 itojun Exp $ */ /* @@ -114,7 +114,7 @@ struct mif6info { u_int64_t m6_bytes_out; /* # bytes out on interface */ u_int m6_rate_limit; /* max rate */ mifi_t m6_mifi; - u_char m6_flags; /* MIFF_ flags defined above */ + u_char m6_flags; /* MIFF_ flags defined above */ }; /* structure used to get all the mf6c entries via sysctl */ @@ -202,7 +202,7 @@ void mf6c_expire_route(struct rtentry *, u_int); */ struct mif6 { mifi_t m6_mifi; /* mif index */ - u_char m6_flags; /* MIFF_ flags defined above */ + u_char m6_flags; /* MIFF_ flags defined above */ u_int m6_rate_limit; /* max rate */ #ifdef notyet struct tbf *m6_tbf; /* token bucket structure at intf. */ diff --git a/sys/netinet6/ip6_output.c b/sys/netinet6/ip6_output.c index c5c82e5fe..ed3a6d3d1 100644 --- a/sys/netinet6/ip6_output.c +++ b/sys/netinet6/ip6_output.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ip6_output.c,v 1.292 2024/07/04 12:50:08 bluhm Exp $ */ +/* $OpenBSD: ip6_output.c,v 1.294 2025/01/03 21:27:40 bluhm Exp $ */ /* $KAME: ip6_output.c,v 1.172 2001/03/25 09:55:56 itojun Exp $ */ /* @@ -156,8 +156,8 @@ struct idgen32_ctx ip6_id_ctx; * The mbuf chain containing the packet will be freed. * The mbuf opt, if present, will not be freed. * - * type of "mtu": rt_mtu is u_long, ifnet.ifr_mtu is int. - * We use u_long to hold largest one, * which is rt_mtu. + * type of "mtu": rt_mtu is u_int, ifnet.ifr_mtu is int. + * We use u_long to hold largest one. XXX should be u_int */ int ip6_output(struct mbuf *m, struct ip6_pktopts *opt, struct route *ro, @@ -735,7 +735,7 @@ reroute: * If we are doing fragmentation, we can't defer TCP/UDP * checksumming; compute the checksum and clear the flag. */ - in6_proto_cksum_out(m, NULL); + in6_proto_cksum_out(m, NULL); /* * Change the next header field of the last header in the @@ -1027,11 +1027,11 @@ ip6_insertfraghdr(struct mbuf *m0, struct mbuf *m, int hlen, int ip6_getpmtu(struct rtentry *rt, struct ifnet *ifp, u_long *mtup) { - u_int32_t mtu = 0; + u_int mtu, rtmtu; int error = 0; if (rt != NULL) { - mtu = rt->rt_mtu; + mtu = rtmtu = atomic_load_int(&rt->rt_mtu); if (mtu == 0) mtu = ifp->if_mtu; else if (mtu < IPV6_MMTU) { @@ -1048,7 +1048,7 @@ ip6_getpmtu(struct rtentry *rt, struct ifnet *ifp, u_long *mtup) */ mtu = ifp->if_mtu; if (!(rt->rt_locks & RTV_MTU)) - rt->rt_mtu = mtu; + atomic_cas_uint(&rt->rt_mtu, rtmtu, mtu); } } else { mtu = ifp->if_mtu; @@ -2812,7 +2812,7 @@ ip6_output_ipsec_pmtu_update(struct tdb *tdb, struct route *ro, DPRINTF("spi %08x mtu %d rt %p cloned %d", ntohl(tdb->tdb_spi), tdb->tdb_mtu, rt, rt_mtucloned); if (rt != NULL) { - rt->rt_mtu = tdb->tdb_mtu; + atomic_store_int(&rt->rt_mtu, tdb->tdb_mtu); if (ro != NULL && ro->ro_rt != NULL) { rtfree(ro->ro_rt); ro->ro_rt = rtalloc(&ro->ro_dstsa, RT_RESOLVE, diff --git a/sys/netinet6/ip6_var.h b/sys/netinet6/ip6_var.h index 1ddbb4b1c..e59c8b0ed 100644 --- a/sys/netinet6/ip6_var.h +++ b/sys/netinet6/ip6_var.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ip6_var.h,v 1.120 2024/07/12 19:50:35 bluhm Exp $ */ +/* $OpenBSD: ip6_var.h,v 1.121 2024/11/21 20:15:44 bluhm Exp $ */ /* $KAME: ip6_var.h,v 1.33 2000/06/11 14:59:20 jinmei Exp $ */ /* @@ -311,6 +311,7 @@ int icmp6_ctloutput(int, struct socket *, int, int, struct mbuf *); void ip6_init(void); void ip6intr(void); int ip6_input_if(struct mbuf **, int *, int, int, struct ifnet *); +int ip6_ours_enqueue(struct mbuf **, int *, int); void ip6_freepcbopts(struct ip6_pktopts *); void ip6_freemoptions(struct ip6_moptions *); int ip6_unknown_opt(struct mbuf **, u_int8_t *, int); diff --git a/sys/netinet6/raw_ip6.c b/sys/netinet6/raw_ip6.c index 7efbddfdd..df05e09f2 100644 --- a/sys/netinet6/raw_ip6.c +++ b/sys/netinet6/raw_ip6.c @@ -1,4 +1,4 @@ -/* $OpenBSD: raw_ip6.c,v 1.185 2024/07/12 19:50:35 bluhm Exp $ */ +/* $OpenBSD: raw_ip6.c,v 1.186 2024/11/08 10:24:13 bluhm Exp $ */ /* $KAME: raw_ip6.c,v 1.69 2001/03/04 15:55:44 itojun Exp $ */ /* @@ -118,6 +118,9 @@ const struct pr_usrreqs rip6_usrreqs = { .pru_peeraddr = in6_peeraddr, }; +void rip6_sbappend(struct inpcb *, struct mbuf *, struct ip6_hdr *, int, + struct sockaddr_in6 *); + /* * Initialize raw connection block queue. */ @@ -133,8 +136,8 @@ rip6_input(struct mbuf **mp, int *offp, int proto, int af) { struct mbuf *m = *mp; struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *); - struct inpcb *inp; - SIMPLEQ_HEAD(, inpcb) inpcblist; + struct inpcb_iterator iter = { .inp_table = NULL }; + struct inpcb *inp, *last; struct in6_addr *key; struct sockaddr_in6 rip6src; uint8_t type; @@ -177,10 +180,9 @@ rip6_input(struct mbuf **mp, int *offp, int proto, int af) } } #endif - SIMPLEQ_INIT(&inpcblist); - rw_enter_write(&rawin6pcbtable.inpt_notify); mtx_enter(&rawin6pcbtable.inpt_mtx); - TAILQ_FOREACH(inp, &rawin6pcbtable.inpt_queue, inp_queue) { + last = inp = NULL; + while ((inp = in_pcb_iterator(&rawin6pcbtable, inp, &iter)) != NULL) { KASSERT(ISSET(inp->inp_flags, INP_IPV6)); /* @@ -226,17 +228,26 @@ rip6_input(struct mbuf **mp, int *offp, int proto, int af) } } - in_pcbref(inp); - SIMPLEQ_INSERT_TAIL(&inpcblist, inp, inp_notify); + if (last != NULL) { + struct mbuf *n; + + mtx_leave(&rawin6pcbtable.inpt_mtx); + + n = m_copym(m, 0, M_COPYALL, M_NOWAIT); + if (n != NULL) + rip6_sbappend(last, n, ip6, *offp, &rip6src); + in_pcbunref(last); + + mtx_enter(&rawin6pcbtable.inpt_mtx); + } + last = in_pcbref(inp); } mtx_leave(&rawin6pcbtable.inpt_mtx); - if (SIMPLEQ_EMPTY(&inpcblist)) { + if (last == NULL) { struct counters_ref ref; uint64_t *counters; - rw_exit_write(&rawin6pcbtable.inpt_notify); - if (proto != IPPROTO_ICMPV6) { rip6stat_inc(rip6s_nosock); if (m->m_flags & M_MCAST) @@ -257,45 +268,38 @@ rip6_input(struct mbuf **mp, int *offp, int proto, int af) return IPPROTO_DONE; } - while ((inp = SIMPLEQ_FIRST(&inpcblist)) != NULL) { - struct mbuf *n, *opts = NULL; - - SIMPLEQ_REMOVE_HEAD(&inpcblist, inp_notify); - if (SIMPLEQ_EMPTY(&inpcblist)) - n = m; - else - n = m_copym(m, 0, M_COPYALL, M_NOWAIT); - if (n != NULL) { - struct socket *so = inp->inp_socket; - int ret = 0; - - if (inp->inp_flags & IN6P_CONTROLOPTS) - ip6_savecontrol(inp, n, &opts); - /* strip intermediate headers */ - m_adj(n, *offp); - - mtx_enter(&so->so_rcv.sb_mtx); - if (!ISSET(inp->inp_socket->so_rcv.sb_state, - SS_CANTRCVMORE)) { - ret = sbappendaddr(so, &so->so_rcv, - sin6tosa(&rip6src), n, opts); - } - mtx_leave(&so->so_rcv.sb_mtx); - - if (ret == 0) { - m_freem(n); - m_freem(opts); - rip6stat_inc(rip6s_fullsock); - } else - sorwakeup(so); - } - in_pcbunref(inp); - } - rw_exit_write(&rawin6pcbtable.inpt_notify); + rip6_sbappend(last, m, ip6, *offp, &rip6src); + in_pcbunref(last); return IPPROTO_DONE; } +void +rip6_sbappend(struct inpcb *inp, struct mbuf *m, struct ip6_hdr *ip6, int hlen, + struct sockaddr_in6 *rip6src) +{ + struct socket *so = inp->inp_socket; + struct mbuf *opts = NULL; + int ret = 0; + + if (inp->inp_flags & IN6P_CONTROLOPTS) + ip6_savecontrol(inp, m, &opts); + /* strip intermediate headers */ + m_adj(m, hlen); + + mtx_enter(&so->so_rcv.sb_mtx); + if (!ISSET(inp->inp_socket->so_rcv.sb_state, SS_CANTRCVMORE)) + ret = sbappendaddr(so, &so->so_rcv, sin6tosa(rip6src), m, opts); + mtx_leave(&so->so_rcv.sb_mtx); + + if (ret == 0) { + m_freem(m); + m_freem(opts); + rip6stat_inc(rip6s_fullsock); + } else + sorwakeup(so); +} + void rip6_ctlinput(int cmd, struct sockaddr *sa, u_int rdomain, void *d) { diff --git a/sys/nfs/nfs_serv.c b/sys/nfs/nfs_serv.c index ea7b59618..4568b897f 100644 --- a/sys/nfs/nfs_serv.c +++ b/sys/nfs/nfs_serv.c @@ -1,4 +1,4 @@ -/* $OpenBSD: nfs_serv.c,v 1.130 2024/09/18 05:21:19 jsg Exp $ */ +/* $OpenBSD: nfs_serv.c,v 1.131 2024/11/05 06:03:19 jsg Exp $ */ /* $NetBSD: nfs_serv.c,v 1.34 1997/05/12 23:37:12 fvdl Exp $ */ /* @@ -296,7 +296,7 @@ nfsrv_setattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, fhp = &nfh.fh_generic; if (nfsm_srvmtofh2(&info, fhp) != 0) goto nfsmout; - VATTR_NULL(&va); + vattr_null(&va); if (info.nmi_v3) { va.va_vaflags |= VA_UTIMES_NULL; error = nfsm_srvsattr(&info.nmi_md, &va, info.nmi_mrep, &info.nmi_dpos); @@ -1083,7 +1083,7 @@ nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, return (0); } - VATTR_NULL(&va); + vattr_null(&va); if (info.nmi_v3) { tl = (uint32_t *)nfsm_dissect(&info, NFSX_UNSIGNED); if (tl == NULL) @@ -1151,7 +1151,7 @@ nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, pool_put(&namei_pool, nd.ni_cnd.cn_pnbuf); if (exclusive_flag) { exclusive_flag = 0; - VATTR_NULL(&va); + vattr_null(&va); bcopy(cverf, (caddr_t)&va.va_atime, NFSX_V3CREATEVERF); error = VOP_SETATTR(nd.ni_vp, &va, cred, @@ -1245,7 +1245,7 @@ nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, (nd.ni_cnd.cn_flags & RDONLY), procp, 0); if (!error) { tempsize = va.va_size; - VATTR_NULL(&va); + vattr_null(&va); va.va_size = tempsize; error = VOP_SETATTR(vp, &va, cred, procp); @@ -1385,7 +1385,7 @@ nfsrv_mknod(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, vput(nd.ni_vp); goto out; } - VATTR_NULL(&va); + vattr_null(&va); error = nfsm_srvsattr(&info.nmi_md, &va, info.nmi_mrep, &info.nmi_dpos); if (error) goto nfsmout; @@ -1983,7 +1983,7 @@ nfsrv_symlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, } if (error) goto out; - VATTR_NULL(&va); + vattr_null(&va); if (info.nmi_v3) { error = nfsm_srvsattr(&info.nmi_md, &va, info.nmi_mrep, &info.nmi_dpos); @@ -2156,7 +2156,7 @@ nfsrv_mkdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, return (0); } - VATTR_NULL(&va); + vattr_null(&va); if (info.nmi_v3) { error = nfsm_srvsattr(&info.nmi_md, &va, info.nmi_mrep, &info.nmi_dpos); diff --git a/sys/nfs/nfs_vfsops.c b/sys/nfs/nfs_vfsops.c index a7b9206ec..783ebca94 100644 --- a/sys/nfs/nfs_vfsops.c +++ b/sys/nfs/nfs_vfsops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: nfs_vfsops.c,v 1.131 2024/05/12 09:09:39 jsg Exp $ */ +/* $OpenBSD: nfs_vfsops.c,v 1.132 2024/10/30 06:16:27 jsg Exp $ */ /* $NetBSD: nfs_vfsops.c,v 1.46.4.1 1996/05/25 22:40:35 fvdl Exp $ */ /* @@ -255,7 +255,7 @@ struct nfs_diskless nfs_diskless; * - Call nfs_boot_init() to fill in the nfs_diskless struct * (using RARP, bootparam RPC, mountd RPC) * - hand craft the swap nfs vnode hanging off a fake mount point - * if swdevt[0].sw_dev == NODEV + * if swdevt[0] == NODEV * - build the rootfs mount point and call mountnfs() to do the rest. */ int @@ -315,17 +315,17 @@ nfs_mountroot(void) * "Mount" the swap device. * * On a "dataless" configuration (swap on disk) we will have: - * (swdevt[0].sw_dev != NODEV) identifying the swap device. + * (swdevt[0] != NODEV) identifying the swap device. */ - if (swdevt[0].sw_dev != NODEV) { + if (swdevt[0] != NODEV) { if (bdevvp(swapdev, &swapdev_vp)) panic("nfs_mountroot: can't setup swap vp"); - printf("swap on device 0x%x\n", swdevt[0].sw_dev); + printf("swap on device 0x%x\n", swdevt[0]); return (0); } /* - * If swapping to an nfs node: (swdevt[0].sw_dev == NODEV) + * If swapping to an nfs node: (swdevt[0] == NODEV) * Create a fake mount point just for the swap vnode so that the * swap file can be on a different server from the rootfs. * @@ -348,7 +348,7 @@ nfs_mountroot(void) * Next line is a hack to make swapmount() work on NFS * swap files. */ - swdevt[0].sw_dev = NETDEV; + swdevt[0] = NETDEV; /* end hack */ nfs_diskless.sw_vp = vp; @@ -368,7 +368,7 @@ nfs_mountroot(void) } printf("WARNING: no swap\n"); - swdevt[0].sw_dev = NODEV; + swdevt[0] = NODEV; return (0); } diff --git a/sys/nfs/nfs_vnops.c b/sys/nfs/nfs_vnops.c index c141205a2..f87a1e95a 100644 --- a/sys/nfs/nfs_vnops.c +++ b/sys/nfs/nfs_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: nfs_vnops.c,v 1.205 2024/10/18 05:52:32 miod Exp $ */ +/* $OpenBSD: nfs_vnops.c,v 1.206 2024/11/05 06:03:19 jsg Exp $ */ /* $NetBSD: nfs_vnops.c,v 1.62.4.1 1996/07/08 20:26:52 jtc Exp $ */ /* @@ -3516,7 +3516,7 @@ nfsspec_close(void *v) np->n_flag |= NCHG; if (vp->v_usecount == 1 && (vp->v_mount->mnt_flag & MNT_RDONLY) == 0) { - VATTR_NULL(&vattr); + vattr_null(&vattr); if (np->n_flag & NACC) vattr.va_atime = np->n_atim; if (np->n_flag & NUPD) @@ -3585,7 +3585,7 @@ nfsfifo_close(void *v) np->n_flag |= NCHG; if (vp->v_usecount == 1 && (vp->v_mount->mnt_flag & MNT_RDONLY) == 0) { - VATTR_NULL(&vattr); + vattr_null(&vattr); if (np->n_flag & NACC) vattr.va_atime = np->n_atim; if (np->n_flag & NUPD) diff --git a/sys/sys/atomic.h b/sys/sys/atomic.h index f64804767..b3aee2a0b 100644 --- a/sys/sys/atomic.h +++ b/sys/sys/atomic.h @@ -1,4 +1,4 @@ -/* $OpenBSD: atomic.h,v 1.9 2022/03/21 05:45:52 visa Exp $ */ +/* $OpenBSD: atomic.h,v 1.10 2025/01/03 21:27:41 bluhm Exp $ */ /* * Copyright (c) 2014 David Gwynne * Copyright (c) 2022 Alexander Bluhm @@ -202,13 +202,13 @@ atomic_sub_long_nv(volatile unsigned long *p, unsigned long v) */ static inline unsigned int -atomic_load_int(volatile unsigned int *p) +atomic_load_int(volatile const unsigned int *p) { return *p; } static inline unsigned long -atomic_load_long(volatile unsigned long *p) +atomic_load_long(volatile const unsigned long *p) { return *p; } diff --git a/sys/sys/conf.h b/sys/sys/conf.h index 422cd7f5c..057444949 100644 --- a/sys/sys/conf.h +++ b/sys/sys/conf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: conf.h,v 1.163 2024/06/11 01:49:17 jsg Exp $ */ +/* $OpenBSD: conf.h,v 1.166 2024/10/30 06:16:27 jsg Exp $ */ /* $NetBSD: conf.h,v 1.33 1996/05/03 20:03:32 christos Exp $ */ /*- @@ -49,7 +49,6 @@ struct buf; struct proc; struct tty; struct uio; -struct vnode; struct knote; /* @@ -291,13 +290,6 @@ extern struct cdevsw cdevsw[]; (dev_type_stop((*))) enodev, 0, \ (dev_type_mmap((*))) enodev } -/* open, close, ioctl, mmap */ -#define cdev_fb_init(c,n) { \ - dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \ - (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \ - (dev_type_stop((*))) enodev, 0, \ - dev_init(c,n,mmap) } - /* open, close, read, write, ioctl, kqfilter */ #define cdev_audio_init(c,n) { \ dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ @@ -523,21 +515,7 @@ struct linesw { #ifdef _KERNEL extern struct linesw linesw[]; -#endif - -/* - * Swap device table - */ -struct swdevt { - dev_t sw_dev; - int sw_flags; -}; -#define SW_FREED 0x01 -#define SW_SEQUENTIAL 0x02 -#define sw_freed sw_flags /* XXX compat */ - -#ifdef _KERNEL -extern struct swdevt swdevt[]; +extern dev_t swdevt[]; /* Swap device table */ extern const int chrtoblktbl[]; extern const int nchrtoblktbl; diff --git a/sys/sys/disk.h b/sys/sys/disk.h index 2219f974e..f814599d7 100644 --- a/sys/sys/disk.h +++ b/sys/sys/disk.h @@ -1,4 +1,4 @@ -/* $OpenBSD: disk.h,v 1.38 2023/11/15 20:23:19 kn Exp $ */ +/* $OpenBSD: disk.h,v 1.41 2024/10/30 15:00:12 deraadt Exp $ */ /* $NetBSD: disk.h,v 1.11 1996/04/28 20:22:50 thorpej Exp $ */ /* @@ -54,7 +54,6 @@ #include #include -struct buf; struct disklabel; #define DS_DISKNAMELEN 16 diff --git a/sys/sys/disklabel.h b/sys/sys/disklabel.h index b8fe2b9a8..300af81ae 100644 --- a/sys/sys/disklabel.h +++ b/sys/sys/disklabel.h @@ -1,4 +1,4 @@ -/* $OpenBSD: disklabel.h,v 1.86 2022/11/07 10:33:22 krw Exp $ */ +/* $OpenBSD: disklabel.h,v 1.87 2024/10/29 03:17:10 jsg Exp $ */ /* $NetBSD: disklabel.h,v 1.41 1996/05/10 23:07:37 mark Exp $ */ /* @@ -458,10 +458,6 @@ struct dos_partition { u_int32_t dp_size; /* partition size in sectors */ }; -/* Isolate the relevant bits to get sector and cylinder. */ -#define DPSECT(s) ((s) & 0x3f) -#define DPCYL(c, s) ((c) + (((s) & 0xc0) << 2)) - /* Known DOS partition types. */ #define DOSPTYP_UNUSED 0x00 /* Unused partition */ #define DOSPTYP_FAT12 0x01 /* 12-bit FAT */ diff --git a/sys/sys/domain.h b/sys/sys/domain.h index 87d662a6a..d0137b88e 100644 --- a/sys/sys/domain.h +++ b/sys/sys/domain.h @@ -1,4 +1,4 @@ -/* $OpenBSD: domain.h,v 1.24 2024/01/11 14:15:12 bluhm Exp $ */ +/* $OpenBSD: domain.h,v 1.25 2024/10/26 05:39:03 jsg Exp $ */ /* $NetBSD: domain.h,v 1.10 1996/02/09 18:25:07 christos Exp $ */ /* @@ -45,7 +45,6 @@ typedef __socklen_t socklen_t; /* length type for network syscalls */ * Forward structure declarations for function prototypes [sic]. */ struct mbuf; -struct ifnet; struct domain { int dom_family; /* AF_xxx */ diff --git a/sys/sys/exec.h b/sys/sys/exec.h index 6f1dd6b57..f437a52b6 100644 --- a/sys/sys/exec.h +++ b/sys/sys/exec.h @@ -1,4 +1,4 @@ -/* $OpenBSD: exec.h,v 1.55 2024/10/16 18:47:48 miod Exp $ */ +/* $OpenBSD: exec.h,v 1.56 2024/11/02 10:02:23 jsg Exp $ */ /* $NetBSD: exec.h,v 1.59 1996/02/09 18:25:09 christos Exp $ */ /*- @@ -161,7 +161,6 @@ int check_exec(struct proc *, struct exec_package *); int exec_setup_stack(struct proc *, struct exec_package *); int exec_process_vmcmds(struct proc *, struct exec_package *); -#ifdef DEBUG void new_vmcmd(struct exec_vmcmd_set *evsp, int (*proc)(struct proc *p, struct exec_vmcmd *), u_long len, u_long addr, struct vnode *vp, u_long offset, @@ -170,25 +169,6 @@ void new_vmcmd(struct exec_vmcmd_set *evsp, new_vmcmd(evsp,proc,len,addr,vp,offset,prot, 0); #define NEW_VMCMD2(evsp,proc,len,addr,vp,offset,prot,flags) \ new_vmcmd(evsp,proc,len,addr,vp,offset,prot,flags) -#else /* DEBUG */ -#define NEW_VMCMD(evsp,proc,len,addr,vp,offset,prot) \ - NEW_VMCMD2(evsp,proc,len,addr,vp,offset,prot,0) -#define NEW_VMCMD2(evsp,proc,len,addr,vp,offset,prot,flags) do { \ - struct exec_vmcmd *__vcp; \ - if ((evsp)->evs_used >= (evsp)->evs_cnt) \ - vmcmdset_extend(evsp); \ - __vcp = &(evsp)->evs_cmds[(evsp)->evs_used++]; \ - __vcp->ev_proc = (proc); \ - __vcp->ev_len = (len); \ - __vcp->ev_addr = (addr); \ - if ((__vcp->ev_vp = (vp)) != NULLVP) \ - vref(vp); \ - __vcp->ev_offset = (offset); \ - __vcp->ev_prot = (prot); \ - __vcp->ev_flags = (flags); \ -} while (0) - -#endif /* DEBUG */ /* Initialize an empty vmcmd set */ #define VMCMDSET_INIT(vmc) do { \ diff --git a/sys/sys/exec_elf.h b/sys/sys/exec_elf.h index a52023d9c..b4e886e06 100644 --- a/sys/sys/exec_elf.h +++ b/sys/sys/exec_elf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: exec_elf.h,v 1.105 2024/07/14 09:48:49 jca Exp $ */ +/* $OpenBSD: exec_elf.h,v 1.106 2024/11/25 04:37:06 jsg Exp $ */ /* * Copyright (c) 1995, 1996 Erik Theisen. All rights reserved. * @@ -198,8 +198,6 @@ typedef struct { #define EM_ALPHA_EXP 0x9026 /* DEC ALPHA */ #define EM__LAST__ (EM_ALPHA_EXP + 1) -#define EM_NUM 22 /* number of machine types */ - /* Version */ #define EV_NONE 0 /* Invalid */ #define EV_CURRENT 1 /* Current */ diff --git a/sys/sys/hibernate.h b/sys/sys/hibernate.h index 8ddf696e8..06fb8804e 100644 --- a/sys/sys/hibernate.h +++ b/sys/sys/hibernate.h @@ -1,4 +1,4 @@ -/* $OpenBSD: hibernate.h,v 1.47 2024/10/12 07:30:20 jsg Exp $ */ +/* $OpenBSD: hibernate.h,v 1.48 2024/12/24 14:24:58 krw Exp $ */ /* * Copyright (c) 2011 Ariane van der Steldt @@ -154,6 +154,7 @@ int hibernate_alloc(void); void hibernate_free(void); void hib_getentropy(char **, size_t *); +int hibernate_write(union hibernate_info *, daddr_t, vaddr_t, size_t, int); void hibernate_sort_ranges(union hibernate_info *); void hibernate_suspend_bufcache(void); void hibernate_resume_bufcache(void); diff --git a/sys/sys/mbuf.h b/sys/sys/mbuf.h index b8745b9cb..12afaeb39 100644 --- a/sys/sys/mbuf.h +++ b/sys/sys/mbuf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: mbuf.h,v 1.264 2024/08/29 10:44:40 bluhm Exp $ */ +/* $OpenBSD: mbuf.h,v 1.265 2024/11/05 13:15:13 jsg Exp $ */ /* $NetBSD: mbuf.h,v 1.19 1996/02/09 18:25:14 christos Exp $ */ /* @@ -58,12 +58,10 @@ #define MAXMCLBYTES (64 * 1024) /* largest cluster from the stack */ #define MINCLSIZE (MHLEN + MLEN + 1) /* smallest amount to put in cluster */ -#define M_MAXCOMPRESS (MHLEN / 2) /* max amount to copy for compression */ #define MCLSHIFT 11 /* convert bytes to m_buf clusters */ /* 2K cluster can hold Ether frame */ #define MCLBYTES (1 << MCLSHIFT) /* size of a m_buf cluster */ -#define MCLOFSET (MCLBYTES - 1) /* Packet tags structure */ struct m_tag { diff --git a/sys/sys/mount.h b/sys/sys/mount.h index 5a446c640..e6fd105a9 100644 --- a/sys/sys/mount.h +++ b/sys/sys/mount.h @@ -1,4 +1,4 @@ -/* $OpenBSD: mount.h,v 1.151 2024/02/03 18:51:58 beck Exp $ */ +/* $OpenBSD: mount.h,v 1.153 2025/01/02 01:19:22 dlg Exp $ */ /* $NetBSD: mount.h,v 1.48 1996/02/18 11:55:47 fvdl Exp $ */ /* @@ -340,6 +340,7 @@ struct mount { struct vnode *mnt_syncer; /* syncer vnode */ TAILQ_HEAD(, vnode) mnt_vnodelist; /* list of vnodes this mount */ struct rwlock mnt_lock; /* mount structure lock */ + struct refcnt mnt_refs; int mnt_flag; /* flags */ struct statfs mnt_stat; /* cache of filesystem stats */ void *mnt_data; /* private data */ @@ -388,8 +389,8 @@ struct mount { "\20\001RDONLY\002SYNCHRONOUS\003NOEXEC\004NOSUID\005NODEV\006NOPERM" \ "\007ASYNC\010EXRDONLY\011EXPORTED\012DEFEXPORTED\013EXPORTANON" \ "\014WXALLOWED\015LOCAL\016QUOTA\017ROOTFS\020NOATIME\021UPDATE" \ - "\022DELEXPORT\023RELOAD\024FORCE\025STALLED\026SWAPPABLE\032WANTRDWR" \ - "\033SOFTDEP\034DOOMED" + "\022DELEXPORT\023RELOAD\024FORCE\025STALLED\026SWAPPABLE\031UNMOUNT" \ + "\032WANTRDWR\033SOFTDEP\034DOOMED" /* * filesystem control flags. @@ -400,6 +401,7 @@ struct mount { #define MNT_FORCE 0x00080000 /* force unmount or readonly change */ #define MNT_STALLED 0x00100000 /* filesystem stalled */ #define MNT_SWAPPABLE 0x00200000 /* filesystem can be used for swap */ +#define MNT_UNMOUNT 0x01000000 /* unmount in progress */ #define MNT_WANTRDWR 0x02000000 /* want upgrade to read/write */ #define MNT_SOFTDEP 0x04000000 /* soft dependencies being done - now ignored */ #define MNT_DOOMED 0x08000000 /* device behind filesystem is gone */ @@ -495,7 +497,7 @@ extern long buflowpages, bufhighpages, bufbackpages; extern int bufcachepercent; extern void bufadjust(int); struct uvm_constraint_range; -extern int bufbackoff(struct uvm_constraint_range*, long); +extern unsigned long bufbackoff(struct uvm_constraint_range*, long); /* * Operations supported on mounted file system. diff --git a/sys/sys/msg.h b/sys/sys/msg.h index b03bb7b04..4864021bb 100644 --- a/sys/sys/msg.h +++ b/sys/sys/msg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: msg.h,v 1.22 2024/06/10 04:10:25 jsg Exp $ */ +/* $OpenBSD: msg.h,v 1.24 2024/10/27 22:08:25 jsg Exp $ */ /* $NetBSD: msg.h,v 1.9 1996/02/09 18:25:18 christos Exp $ */ /* @@ -133,27 +133,14 @@ struct msg_sysctl_info { #define MSGTQL 40 #endif -/* - * macros to convert between msqid_ds's and msqid's. - * XXX unused, going away - */ -#define MSQID(ix,ds) ((ix) & 0xffff | (((ds).msg_perm.seq << 16) & 0xffff0000)) -#define MSQID_IX(id) ((id) & 0xffff) -#define MSQID_SEQ(id) (((id) >> 16) & 0xffff) -#endif - - -#ifndef _KERNEL +void msginit(void); +#else /* !_KERNEL */ __BEGIN_DECLS int msgctl(int, int, struct msqid_ds *); int msgget(key_t, int); int msgsnd(int, const void *, size_t, int); int msgrcv(int, void *, size_t, long, int); __END_DECLS -#else -struct proc; - -void msginit(void); -#endif /* !_KERNEL */ +#endif #endif /* !_SYS_MSG_H_ */ diff --git a/sys/sys/pledge.h b/sys/sys/pledge.h index 7f6fbc927..6e6950d87 100644 --- a/sys/sys/pledge.h +++ b/sys/sys/pledge.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pledge.h,v 1.49 2024/09/01 17:13:46 bluhm Exp $ */ +/* $OpenBSD: pledge.h,v 1.51 2024/10/29 12:40:17 jsg Exp $ */ /* * Copyright (c) 2015 Nicholas Marriott @@ -20,8 +20,6 @@ #ifndef _SYS_PLEDGE_H_ #define _SYS_PLEDGE_H_ -#include - /* * pledge(2) requests */ @@ -120,7 +118,6 @@ static const struct { int pledge_syscall(struct proc *, int, uint64_t *); int pledge_fail(struct proc *, int, uint64_t); -struct mbuf; struct nameidata; int pledge_namei(struct proc *, struct nameidata *, char *); int pledge_sendfd(struct proc *p, struct file *); diff --git a/sys/sys/pool.h b/sys/sys/pool.h index 3e64c3c34..e6e5480ab 100644 --- a/sys/sys/pool.h +++ b/sys/sys/pool.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pool.h,v 1.78 2021/01/02 03:23:59 cheloha Exp $ */ +/* $OpenBSD: pool.h,v 1.80 2025/01/04 09:26:01 mvs Exp $ */ /* $NetBSD: pool.h,v 1.27 2001/06/06 22:00:17 rafal Exp $ */ /*- @@ -149,6 +149,7 @@ union pool_lock { }; struct pool { + struct refcnt pr_refcnt; union pool_lock pr_lock; const struct pool_lock_ops * pr_lock_ops; @@ -262,7 +263,6 @@ void pool_destroy(struct pool *); void pool_setlowat(struct pool *, int); void pool_sethiwat(struct pool *, int); int pool_sethardlimit(struct pool *, u_int, const char *, int); -struct uvm_constraint_range; /* XXX */ void pool_set_constraints(struct pool *, const struct kmem_pa_mode *mode); diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 0333a4697..c27df3709 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -1,4 +1,4 @@ -/* $OpenBSD: proc.h,v 1.375 2024/10/15 13:49:26 claudio Exp $ */ +/* $OpenBSD: proc.h,v 1.377 2024/12/17 14:45:00 claudio Exp $ */ /* $NetBSD: proc.h,v 1.44 1996/04/22 01:23:21 christos Exp $ */ /*- @@ -227,7 +227,7 @@ struct process { /* The following fields are all copied upon creation in process_new. */ #define ps_startcopy ps_limit struct plimit *ps_limit; /* [m,R] Process limits. */ - struct pgrp *ps_pgrp; /* Pointer to process group. */ + struct pgrp *ps_pgrp; /* [K|m] Pointer to process group. */ char ps_comm[_MAXCOMLEN]; /* command name, incl NUL */ @@ -305,6 +305,7 @@ struct process { #define PS_ITIMER 0x04000000 /* Virtual interval timers running */ #define PS_CONTINUED 0x20000000 /* Continued proc not yet waited for */ #define PS_STOPPED 0x40000000 /* Stopped process */ +#define PS_TRAPPED 0x80000000 /* Stopped due to tracing event */ #define PS_BITS \ ("\20" "\01CONTROLT" "\02EXEC" "\03INEXEC" "\04EXITING" "\05SUGID" \ @@ -313,7 +314,7 @@ struct process { "\017NOZOMBIE" "\020STOPPING" "\021SYSTEM" "\022EMBRYO" "\023ZOMBIE" \ "\024NOBROADCASTKILL" "\025PLEDGE" "\026WXNEEDED" "\027EXECPLEDGE" \ "\030ORPHAN" "\031CHROOT" "\032NOBTCFI" "\033ITIMER" "\036CONTINUED" \ - "\037STOPPED") + "\037STOPPED" "\040TRAPPED") struct kcov_dev; struct lock_list_entry; diff --git a/sys/sys/protosw.h b/sys/sys/protosw.h index 22364cf72..7a4dcec76 100644 --- a/sys/sys/protosw.h +++ b/sys/sys/protosw.h @@ -1,4 +1,4 @@ -/* $OpenBSD: protosw.h,v 1.68 2024/08/16 09:20:35 mvs Exp $ */ +/* $OpenBSD: protosw.h,v 1.71 2025/01/05 12:36:48 bluhm Exp $ */ /* $NetBSD: protosw.h,v 1.10 1996/04/09 20:55:32 cgd Exp $ */ /*- @@ -130,7 +130,6 @@ struct protosw { socket */ #define PR_SPLICE 0x0040 /* socket splicing is possible */ #define PR_MPINPUT 0x0080 /* input runs with shared netlock */ -#define PR_MPSOCKET 0x0100 /* socket uses shared netlock */ #define PR_MPSYSCTL 0x0200 /* mp-safe sysctl(2) handler */ /* @@ -254,10 +253,7 @@ char *prcorequests[] = { #include #include -#include -struct ifnet; -struct sockaddr; const struct protosw *pffindproto(int, int, int); const struct protosw *pffindtype(int, int); const struct domain *pffinddomain(int); diff --git a/sys/sys/resourcevar.h b/sys/sys/resourcevar.h index 36b030356..297a45976 100644 --- a/sys/sys/resourcevar.h +++ b/sys/sys/resourcevar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: resourcevar.h,v 1.34 2024/10/08 11:57:59 claudio Exp $ */ +/* $OpenBSD: resourcevar.h,v 1.35 2024/10/24 23:24:58 jsg Exp $ */ /* $NetBSD: resourcevar.h,v 1.12 1995/11/22 23:01:53 cgd Exp $ */ /* @@ -36,7 +36,6 @@ #define _SYS_RESOURCEVAR_H_ #include -#include /* * Kernel shareable process resource limits. Because this structure diff --git a/sys/sys/rwlock.h b/sys/sys/rwlock.h index f5a2504f4..5429fee95 100644 --- a/sys/sys/rwlock.h +++ b/sys/sys/rwlock.h @@ -1,4 +1,4 @@ -/* $OpenBSD: rwlock.h,v 1.28 2021/01/11 18:49:38 mpi Exp $ */ +/* $OpenBSD: rwlock.h,v 1.31 2025/01/04 02:34:11 dlg Exp $ */ /* * Copyright (c) 2002 Artur Grabowski * @@ -60,6 +60,8 @@ struct proc; struct rwlock { volatile unsigned long rwl_owner; + volatile unsigned int rwl_waiters; + volatile unsigned int rwl_readers; const char *rwl_name; #ifdef WITNESS struct lock_object rwl_lock_obj; @@ -91,14 +93,12 @@ struct rwlock { #ifdef WITNESS #define RWLOCK_INITIALIZER(name) \ - { 0, name, .rwl_lock_obj = RWLOCK_LO_INITIALIZER(name, 0) } + { 0, 0, 0, name, .rwl_lock_obj = RWLOCK_LO_INITIALIZER(name, 0) } #else #define RWLOCK_INITIALIZER(name) \ - { 0, name } + { 0, 0, 0, name } #endif -#define RWLOCK_WAIT 0x01UL -#define RWLOCK_WRWANT 0x02UL #define RWLOCK_WRLOCK 0x04UL #define RWLOCK_MASK 0x07UL diff --git a/sys/sys/sem.h b/sys/sys/sem.h index 9d09a95be..5e3916129 100644 --- a/sys/sys/sem.h +++ b/sys/sys/sem.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sem.h,v 1.25 2022/09/16 15:57:23 mbuhl Exp $ */ +/* $OpenBSD: sem.h,v 1.26 2024/10/26 05:39:03 jsg Exp $ */ /* $NetBSD: sem.h,v 1.8 1996/02/09 18:25:29 christos Exp $ */ /* @@ -175,8 +175,6 @@ extern struct seminfo seminfo; extern struct semid_ds **sema; /* semaphore id list */ -struct proc; - void seminit(void); void semexit(struct process *); int sysctl_sysvsem(int *, u_int, void *, size_t *, void *, size_t); diff --git a/sys/sys/shm.h b/sys/sys/shm.h index 4b65fe76a..27ebcb93a 100644 --- a/sys/sys/shm.h +++ b/sys/sys/shm.h @@ -1,4 +1,4 @@ -/* $OpenBSD: shm.h,v 1.30 2021/03/10 10:21:47 jsg Exp $ */ +/* $OpenBSD: shm.h,v 1.31 2024/10/26 05:39:03 jsg Exp $ */ /* $NetBSD: shm.h,v 1.20 1996/04/09 20:55:35 cgd Exp $ */ /* @@ -129,7 +129,6 @@ struct shm_sysctl_info { extern struct shminfo shminfo; extern struct shmid_ds **shmsegs; -struct proc; struct vmspace; void shminit(void); diff --git a/sys/sys/signalvar.h b/sys/sys/signalvar.h index c207cff21..b41ca3adf 100644 --- a/sys/sys/signalvar.h +++ b/sys/sys/signalvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: signalvar.h,v 1.56 2024/10/17 09:11:35 claudio Exp $ */ +/* $OpenBSD: signalvar.h,v 1.57 2024/11/04 22:41:50 claudio Exp $ */ /* $NetBSD: signalvar.h,v 1.17 1996/04/22 01:23:31 christos Exp $ */ /* @@ -102,6 +102,7 @@ struct sigctx { int sig_info; int sig_ignore; int sig_catch; + int sig_stop; }; /* diff --git a/sys/sys/socket.h b/sys/sys/socket.h index 26c2a7bd1..c6923424c 100644 --- a/sys/sys/socket.h +++ b/sys/sys/socket.h @@ -1,4 +1,4 @@ -/* $OpenBSD: socket.h,v 1.105 2022/09/03 21:13:48 mbuhl Exp $ */ +/* $OpenBSD: socket.h,v 1.106 2024/12/15 11:00:05 dlg Exp $ */ /* $NetBSD: socket.h,v 1.14 1996/02/09 18:25:36 christos Exp $ */ /* @@ -200,7 +200,8 @@ struct splice { #define AF_MPLS 33 /* MPLS */ #define pseudo_AF_PFLOW 34 /* pflow */ #define pseudo_AF_PIPEX 35 /* PIPEX */ -#define AF_MAX 36 +#define AF_FRAME 36 /* frame (Ethernet) sockets */ +#define AF_MAX 37 /* * Structure used by kernel to store most @@ -284,6 +285,7 @@ struct sockproto { #define PF_MPLS AF_MPLS #define PF_PFLOW pseudo_AF_PFLOW #define PF_PIPEX pseudo_AF_PIPEX +#define PF_FRAME AF_FRAME #define PF_MAX AF_MAX /* diff --git a/sys/sys/socketvar.h b/sys/sys/socketvar.h index 9ba0499fa..76c58d866 100644 --- a/sys/sys/socketvar.h +++ b/sys/sys/socketvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: socketvar.h,v 1.134 2024/09/09 07:38:45 mvs Exp $ */ +/* $OpenBSD: socketvar.h,v 1.138 2025/01/03 12:56:15 mvs Exp $ */ /* $NetBSD: socketvar.h,v 1.18 1996/02/09 18:25:38 christos Exp $ */ /*- @@ -84,7 +84,7 @@ struct sosplice { * Variables for socket buffering. */ struct sockbuf { - struct rwlock sb_lock; + struct rwlock sb_lock; struct mutex sb_mtx; /* The following fields are all zeroed on flush. */ #define sb_startzero sb_cc @@ -209,16 +209,13 @@ struct socket { void soassertlocked(struct socket *); void soassertlocked_readonly(struct socket *); -static inline void +static inline struct socket * soref(struct socket *so) { + if (so == NULL) + return NULL; refcnt_take(&so->so_refcnt); -} - -static inline void -sorele(struct socket *so) -{ - refcnt_rele_wake(&so->so_refcnt); + return so; } /* @@ -288,7 +285,7 @@ sbspace(struct socket *so, struct sockbuf *sb) sb_mtx_lock(sb); ret = sbspace_locked(so, sb); sb_mtx_unlock(sb); - + return ret; } @@ -394,7 +391,7 @@ int soo_read(struct file *, struct uio *, int); int soo_write(struct file *, struct uio *, int); int soo_ioctl(struct file *, u_long, caddr_t, struct proc *); int soo_kqfilter(struct file *, struct knote *); -int soo_close(struct file *, struct proc *); +int soo_close(struct file *, struct proc *); int soo_stat(struct file *, struct stat *, struct proc *); void sbappend(struct socket *, struct sockbuf *, struct mbuf *); void sbappendstream(struct socket *, struct sockbuf *, struct mbuf *); @@ -428,6 +425,7 @@ int socreate(int, struct socket **, int, int); int sodisconnect(struct socket *); struct socket *soalloc(const struct protosw *, int); void sofree(struct socket *, int); +void sorele(struct socket *); int sogetopt(struct socket *, int, int, struct mbuf *); void sohasoutofband(struct socket *); void soisconnected(struct socket *); diff --git a/sys/sys/syscall_mi.h b/sys/sys/syscall_mi.h index d631bd53d..a40e69dc3 100644 --- a/sys/sys/syscall_mi.h +++ b/sys/sys/syscall_mi.h @@ -1,4 +1,4 @@ -/* $OpenBSD: syscall_mi.h,v 1.35 2024/09/01 03:09:01 jsg Exp $ */ +/* $OpenBSD: syscall_mi.h,v 1.37 2024/12/27 11:57:16 mpi Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1993 @@ -34,7 +34,6 @@ #include #include #include -#include #include #include #include @@ -152,9 +151,7 @@ mi_syscall(struct proc *p, register_t code, const struct sysent *callp, #ifdef KTRACE if (KTRPOINT(p, KTR_SYSCALL)) { /* convert to mask, then include with code */ - KERNEL_LOCK(); ktrsyscall(p, code, callp->sy_argsize, argp); - KERNEL_UNLOCK(); } #endif @@ -203,11 +200,8 @@ mi_syscall_return(struct proc *p, register_t code, int error, userret(p); #ifdef KTRACE - if (KTRPOINT(p, KTR_SYSRET)) { - KERNEL_LOCK(); + if (KTRPOINT(p, KTR_SYSRET)) ktrsysret(p, code, error, retval); - KERNEL_UNLOCK(); - } #endif } @@ -238,11 +232,8 @@ mi_child_return(struct proc *p) userret(p); #ifdef KTRACE - if (KTRPOINT(p, KTR_SYSRET)) { - KERNEL_LOCK(); + if (KTRPOINT(p, KTR_SYSRET)) ktrsysret(p, code, 0, child_retval); - KERNEL_UNLOCK(); - } #endif } diff --git a/sys/sys/sysctl.h b/sys/sys/sysctl.h index 0a5bac581..852883617 100644 --- a/sys/sys/sysctl.h +++ b/sys/sys/sysctl.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sysctl.h,v 1.238 2024/09/30 12:32:26 claudio Exp $ */ +/* $OpenBSD: sysctl.h,v 1.240 2024/11/04 11:49:19 jsg Exp $ */ /* $NetBSD: sysctl.h,v 1.16 1996/04/09 20:55:36 cgd Exp $ */ /* @@ -946,7 +946,7 @@ struct kinfo_file { #define HW_POWER 26 /* int: machine has wall-power */ #define HW_BATTERY 27 /* node: battery */ #define HW_UCOMNAMES 28 /* strings: ucom names */ -#define HW_MAXID 30 /* number of valid hw ids */ +#define HW_MAXID 29 /* number of valid hw ids */ #define CTL_HW_NAMES { \ { 0, 0 }, \ @@ -1074,7 +1074,6 @@ struct mbuf_queue; int sysctl_mq(int *, u_int, void *, size_t *, void *, size_t, struct mbuf_queue *); struct rtentry; -struct walkarg; int sysctl_dumpentry(struct rtentry *, void *, unsigned int); int sysctl_rtable(int *, u_int, void *, size_t *, void *, size_t); int sysctl_clockrate(char *, size_t *, void *); diff --git a/sys/sys/tty.h b/sys/sys/tty.h index 8b12b26a5..401fbeaa0 100644 --- a/sys/sys/tty.h +++ b/sys/sys/tty.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tty.h,v 1.43 2024/05/12 08:21:56 jsg Exp $ */ +/* $OpenBSD: tty.h,v 1.44 2024/10/26 00:56:35 jsg Exp $ */ /* $NetBSD: tty.h,v 1.30.4.1 1996/06/02 09:08:13 mrg Exp $ */ /*- @@ -164,7 +164,6 @@ struct itty { #define TTIPRI 25 /* Sleep priority for tty reads. */ #define TTOPRI 26 /* Sleep priority for tty writes. */ -#define TTMASK 15 #define OBUFSIZ 512 #define TTYHOG(tp) (tp)->t_qlen diff --git a/sys/sys/uio.h b/sys/sys/uio.h index fdc46903e..7c826243e 100644 --- a/sys/sys/uio.h +++ b/sys/sys/uio.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uio.h,v 1.19 2018/08/20 16:00:22 mpi Exp $ */ +/* $OpenBSD: uio.h,v 1.20 2024/10/26 05:39:03 jsg Exp $ */ /* $NetBSD: uio.h,v 1.12 1996/02/09 18:25:45 christos Exp $ */ /* @@ -96,7 +96,6 @@ __END_DECLS #else int ureadc(int c, struct uio *); -struct file; int iovec_copyin(const struct iovec *, struct iovec **, struct iovec *, unsigned int, size_t *); void iovec_free(struct iovec *, unsigned int ); diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 22609ddf4..4e2f188cc 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -1,4 +1,4 @@ -/* $OpenBSD: vnode.h,v 1.174 2024/09/01 03:09:01 jsg Exp $ */ +/* $OpenBSD: vnode.h,v 1.176 2024/11/05 06:03:20 jsg Exp $ */ /* $NetBSD: vnode.h,v 1.38 1996/02/29 20:59:05 cgd Exp $ */ /* @@ -243,7 +243,6 @@ extern int vttoif_tab[]; #define REVOKEALL 0x0001 /* vop_revoke: revoke all aliases */ -#define VATTR_NULL(vap) vattr_null(vap) #define NULLVP ((struct vnode *)NULL) #define VN_KNOTE(vp, b) \ knote_locked(&vp->v_klist, (b)) @@ -565,7 +564,6 @@ int VOP_BWRITE(struct buf *); /* Public vnode manipulation functions. */ struct file; -struct filedesc; struct mount; struct nameidata; struct proc; diff --git a/sys/ufs/ufs/ufs_ihash.c b/sys/ufs/ufs/ufs_ihash.c index 1c31867e8..f470326e5 100644 --- a/sys/ufs/ufs/ufs_ihash.c +++ b/sys/ufs/ufs/ufs_ihash.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ufs_ihash.c,v 1.30 2024/09/11 08:29:55 claudio Exp $ */ +/* $OpenBSD: ufs_ihash.c,v 1.31 2024/12/03 14:41:45 claudio Exp $ */ /* $NetBSD: ufs_ihash.c,v 1.3 1996/02/09 22:36:04 christos Exp $ */ /* @@ -109,16 +109,6 @@ loop: * the previously committed vdoom() or this should be * dealt with so this can't happen. */ -#ifdef FUSE - /* - * XXX for whatever stupid reason fuse decided to - * use ufs inodes and with this ufs_ihashget. - * fuse needs to grow up and use its own inode - * structure and hash. - */ - if (vp->v_tag == VT_FUSEFS) - return (vp); -#endif if (VTOI(vp) != ip || (( #ifdef EXT2FS diff --git a/sys/uvm/uvm_amap.c b/sys/uvm/uvm_amap.c index d6242a152..084c98d74 100644 --- a/sys/uvm/uvm_amap.c +++ b/sys/uvm/uvm_amap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_amap.c,v 1.95 2024/05/20 17:03:36 dv Exp $ */ +/* $OpenBSD: uvm_amap.c,v 1.96 2024/12/04 09:19:11 mpi Exp $ */ /* $NetBSD: uvm_amap.c,v 1.27 2000/11/25 06:27:59 chs Exp $ */ /* @@ -621,7 +621,7 @@ amap_copy(struct vm_map *map, struct vm_map_entry *entry, int waitf, amap->am_lock = srcamap->am_lock; rw_obj_hold(amap->am_lock); - amap_lock(srcamap); + amap_lock(srcamap, RW_WRITE); /* * Re-check the reference count with the lock held. If it has @@ -749,7 +749,7 @@ amap_cow_now(struct vm_map *map, struct vm_map_entry *entry) * am_anon[] array on us while the lock is dropped. */ ReStart: - amap_lock(amap); + amap_lock(amap, RW_WRITE); AMAP_CHUNK_FOREACH(chunk, amap) { int i, map = chunk->ac_usedmap; @@ -849,7 +849,7 @@ amap_splitref(struct vm_aref *origref, struct vm_aref *splitref, vaddr_t offset) if (leftslots == 0) panic("amap_splitref: split at zero offset"); - amap_lock(amap); + amap_lock(amap, RW_WRITE); if (amap->am_nslot - origref->ar_pageoff - leftslots <= 0) panic("amap_splitref: map size check failed"); @@ -1088,7 +1088,7 @@ amap_swap_off(int startslot, int endslot) int i, map; struct vm_amap_chunk *chunk; - amap_lock(am); + amap_lock(am, RW_WRITE); if (am->am_nused == 0) { amap_unlock(am); am_next = LIST_NEXT(am, am_list); @@ -1118,7 +1118,7 @@ again: am->am_flags |= AMAP_SWAPOFF; rv = uvm_anon_pagein(am, anon); - amap_lock(am); + amap_lock(am, RW_WRITE); am->am_flags &= ~AMAP_SWAPOFF; if (amap_refs(am) == 0) { @@ -1339,7 +1339,7 @@ amap_adjref_anons(struct vm_amap *amap, vaddr_t offset, vsize_t len, void amap_ref(struct vm_amap *amap, vaddr_t offset, vsize_t len, int flags) { - amap_lock(amap); + amap_lock(amap, RW_WRITE); if (flags & AMAP_SHARED) amap->am_flags |= AMAP_SHARED; amap_adjref_anons(amap, offset, len, 1, (flags & AMAP_REFALL) != 0); @@ -1355,7 +1355,7 @@ amap_ref(struct vm_amap *amap, vaddr_t offset, vsize_t len, int flags) void amap_unref(struct vm_amap *amap, vaddr_t offset, vsize_t len, boolean_t all) { - amap_lock(amap); + amap_lock(amap, RW_WRITE); KASSERT(amap->am_ref > 0); diff --git a/sys/uvm/uvm_amap.h b/sys/uvm/uvm_amap.h index 7f45a8e18..ce6599e1e 100644 --- a/sys/uvm/uvm_amap.h +++ b/sys/uvm/uvm_amap.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_amap.h,v 1.33 2021/01/19 13:21:36 mpi Exp $ */ +/* $OpenBSD: uvm_amap.h,v 1.35 2024/12/04 09:19:11 mpi Exp $ */ /* $NetBSD: uvm_amap.h,v 1.14 2001/02/18 21:19:08 chs Exp $ */ /* @@ -191,10 +191,10 @@ struct vm_amap { */ /* - * defines for handling of large sparce amaps: + * defines for handling of large sparse amaps: * * one of the problems of array-based amaps is that if you allocate a - * large sparcely-used area of virtual memory you end up allocating + * large sparsely-used area of virtual memory you end up allocating * large arrays that, for the most part, don't get used. this is a * problem for BSD in that the kernel likes to make these types of * allocations to "reserve" memory for possible future use. @@ -262,8 +262,8 @@ struct vm_amap { #define amap_flags(AMAP) ((AMAP)->am_flags) #define amap_refs(AMAP) ((AMAP)->am_ref) -#define amap_lock(AMAP) rw_enter_write((AMAP)->am_lock) -#define amap_unlock(AMAP) rw_exit_write((AMAP)->am_lock) +#define amap_lock(AMAP, RWLT) rw_enter((AMAP)->am_lock, (RWLT)) +#define amap_unlock(AMAP) rw_exit((AMAP)->am_lock) #endif /* _KERNEL */ diff --git a/sys/uvm/uvm_anon.c b/sys/uvm/uvm_anon.c index 0fc2a0c89..8af04a344 100644 --- a/sys/uvm/uvm_anon.c +++ b/sys/uvm/uvm_anon.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_anon.c,v 1.58 2024/04/06 10:59:52 mpi Exp $ */ +/* $OpenBSD: uvm_anon.c,v 1.61 2024/12/27 12:04:40 mpi Exp $ */ /* $NetBSD: uvm_anon.c,v 1.10 2000/11/25 06:27:59 chs Exp $ */ /* @@ -170,20 +170,17 @@ uvm_anon_pagein(struct vm_amap *amap, struct vm_anon *anon) rv = uvmfault_anonget(NULL, amap, anon); switch (rv) { - case VM_PAGER_OK: + case 0: + /* Success - we have the page. */ KASSERT(rw_write_held(anon->an_lock)); break; - - case VM_PAGER_ERROR: - case VM_PAGER_REFAULT: - + case EACCES: + case ERESTART: /* - * Nothing more to do on errors. - * VM_PAGER_REFAULT means that the anon was freed. + * Nothing more to do on errors. ERESTART means that the + * anon was freed. */ - return FALSE; - default: #ifdef DIAGNOSTIC panic("anon_pagein: uvmfault_anonget -> %d", rv); @@ -205,8 +202,6 @@ uvm_anon_pagein(struct vm_amap *amap, struct vm_anon *anon) /* * Deactivate the page (to put it on a page queue). */ - pmap_clear_reference(pg); - pmap_page_protect(pg, PROT_NONE); uvm_lock_pageq(); uvm_pagedeactivate(pg); uvm_unlock_pageq(); diff --git a/sys/uvm/uvm_aobj.c b/sys/uvm/uvm_aobj.c index 03c61f68b..5a256a9e2 100644 --- a/sys/uvm/uvm_aobj.c +++ b/sys/uvm/uvm_aobj.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_aobj.c,v 1.110 2024/04/13 23:44:11 jsg Exp $ */ +/* $OpenBSD: uvm_aobj.c,v 1.115 2024/12/27 12:04:40 mpi Exp $ */ /* $NetBSD: uvm_aobj.c,v 1.39 2001/02/18 21:19:08 chs Exp $ */ /* @@ -930,7 +930,6 @@ uao_flush(struct uvm_object *uobj, voff_t start, voff_t stop, int flags) continue; uvm_lock_pageq(); - pmap_page_protect(pg, PROT_NONE); uvm_pagedeactivate(pg); uvm_unlock_pageq(); @@ -999,7 +998,9 @@ uao_get(struct uvm_object *uobj, voff_t offset, struct vm_page **pps, boolean_t done; KASSERT(UVM_OBJ_IS_AOBJ(uobj)); - KASSERT(rw_write_held(uobj->vmobjlock)); + KASSERT(rw_lock_held(uobj->vmobjlock)); + KASSERT(rw_write_held(uobj->vmobjlock) || + ((flags & PGO_LOCKED) != 0 && (access_type & PROT_WRITE) == 0)); /* * get number of pages @@ -1012,7 +1013,6 @@ uao_get(struct uvm_object *uobj, voff_t offset, struct vm_page **pps, * this if the data structures are locked (i.e. the first * time through). */ - done = TRUE; /* be optimistic */ gotpages = 0; /* # of pages we got so far */ @@ -1022,31 +1022,13 @@ uao_get(struct uvm_object *uobj, voff_t offset, struct vm_page **pps, if (pps[lcv] == PGO_DONTCARE) continue; + /* lookup page */ ptmp = uvm_pagelookup(uobj, current_offset); - /* - * if page is new, attempt to allocate the page, - * zero-fill'd. - */ - if (ptmp == NULL && uao_find_swslot(uobj, - current_offset >> PAGE_SHIFT) == 0) { - ptmp = uvm_pagealloc(uobj, current_offset, - NULL, UVM_PGA_ZERO); - if (ptmp) { - /* new page */ - atomic_clearbits_int(&ptmp->pg_flags, - PG_BUSY|PG_FAKE); - atomic_setbits_int(&ptmp->pg_flags, - PQ_AOBJ); - UVM_PAGE_OWN(ptmp, NULL); - } - } - /* * to be useful must get a non-busy page */ - if (ptmp == NULL || - (ptmp->pg_flags & PG_BUSY) != 0) { + if (ptmp == NULL || (ptmp->pg_flags & PG_BUSY) != 0) { if (lcv == centeridx || (flags & PGO_ALLPAGES) != 0) /* need to do a wait or I/O! */ @@ -1057,11 +1039,8 @@ uao_get(struct uvm_object *uobj, voff_t offset, struct vm_page **pps, /* * useful page: plug it in our result array */ - atomic_setbits_int(&ptmp->pg_flags, PG_BUSY); - UVM_PAGE_OWN(ptmp, "uao_get1"); pps[lcv] = ptmp; gotpages++; - } /* @@ -1069,12 +1048,7 @@ uao_get(struct uvm_object *uobj, voff_t offset, struct vm_page **pps, * to unlock and do some waiting or I/O. */ *npagesp = gotpages; - if (done) - /* bingo! */ - return VM_PAGER_OK; - else - /* EEK! Need to unlock and I/O */ - return VM_PAGER_UNLOCK; + return done ? VM_PAGER_OK : VM_PAGER_UNLOCK; } /* @@ -1436,7 +1410,6 @@ uao_pagein_page(struct uvm_aobj *aobj, int pageidx) /* * deactivate the page (to put it on a page queue). */ - pmap_clear_reference(pg); uvm_lock_pageq(); uvm_pagedeactivate(pg); uvm_unlock_pageq(); diff --git a/sys/uvm/uvm_device.c b/sys/uvm/uvm_device.c index 7adf0d6b8..422e77e4d 100644 --- a/sys/uvm/uvm_device.c +++ b/sys/uvm/uvm_device.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_device.c,v 1.67 2024/07/24 12:15:55 mpi Exp $ */ +/* $OpenBSD: uvm_device.c,v 1.68 2024/12/15 11:02:59 mpi Exp $ */ /* $NetBSD: uvm_device.c,v 1.30 2000/11/25 06:27:59 chs Exp $ */ /* @@ -331,7 +331,7 @@ udv_fault(struct uvm_faultinfo *ufi, vaddr_t vaddr, vm_page_t *pps, int npages, */ if (UVM_ET_ISCOPYONWRITE(entry)) { uvmfault_unlockall(ufi, ufi->entry->aref.ar_amap, uobj); - return(VM_PAGER_ERROR); + return EACCES; } /* @@ -354,7 +354,7 @@ udv_fault(struct uvm_faultinfo *ufi, vaddr_t vaddr, vm_page_t *pps, int npages, /* * loop over the page range entering in as needed */ - retval = VM_PAGER_OK; + retval = 0; for (lcv = 0 ; lcv < npages ; lcv++, curr_offset += PAGE_SIZE, curr_va += PAGE_SIZE) { if ((flags & PGO_ALLPAGES) == 0 && lcv != centeridx) @@ -365,7 +365,7 @@ udv_fault(struct uvm_faultinfo *ufi, vaddr_t vaddr, vm_page_t *pps, int npages, paddr = (*mapfn)(device, curr_offset, access_type); if (paddr == -1) { - retval = VM_PAGER_ERROR; + retval = EACCES; /* XXX */ break; } mapprot = ufi->entry->protection; @@ -387,11 +387,11 @@ udv_fault(struct uvm_faultinfo *ufi, vaddr_t vaddr, vm_page_t *pps, int npages, /* sync what we have so far */ pmap_update(ufi->orig_map->pmap); uvm_wait("udv_fault"); - return (VM_PAGER_REFAULT); + return ERESTART; } } uvmfault_unlockall(ufi, ufi->entry->aref.ar_amap, uobj); pmap_update(ufi->orig_map->pmap); - return (retval); + return retval; } diff --git a/sys/uvm/uvm_extern.h b/sys/uvm/uvm_extern.h index f10630fcb..21cf6a427 100644 --- a/sys/uvm/uvm_extern.h +++ b/sys/uvm/uvm_extern.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_extern.h,v 1.178 2024/10/08 02:29:10 jsg Exp $ */ +/* $OpenBSD: uvm_extern.h,v 1.180 2024/11/19 06:18:26 jsg Exp $ */ /* $NetBSD: uvm_extern.h,v 1.57 2001/03/09 01:02:12 chs Exp $ */ /* @@ -169,7 +169,6 @@ typedef int vm_prot_t; #ifdef _KERNEL struct buf; -struct mount; struct pglist; struct vmspace; struct pmap; @@ -286,9 +285,6 @@ int uvm_io(vm_map_t, struct uio *, int); #define UVM_IO_FIXPROT 0x01 -#ifdef __i386__ -vaddr_t uvm_km_zalloc(vm_map_t, vsize_t); -#endif void uvm_km_free(vm_map_t, vaddr_t, vsize_t); vaddr_t uvm_km_kmemalloc_pla(struct vm_map *, struct uvm_object *, vsize_t, vsize_t, int, diff --git a/sys/uvm/uvm_fault.c b/sys/uvm/uvm_fault.c index 1ae20b5af..95b75dc84 100644 --- a/sys/uvm/uvm_fault.c +++ b/sys/uvm/uvm_fault.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_fault.c,v 1.135 2023/09/05 05:08:26 guenther Exp $ */ +/* $OpenBSD: uvm_fault.c,v 1.159 2025/01/03 15:31:48 mpi Exp $ */ /* $NetBSD: uvm_fault.c,v 1.51 2000/08/06 00:22:53 thorpej Exp $ */ /* @@ -185,7 +185,6 @@ uvmfault_anonflush(struct vm_anon **anons, int n) if (pg && (pg->pg_flags & PG_BUSY) == 0) { uvm_lock_pageq(); if (pg->wire_count == 0) { - pmap_page_protect(pg, PROT_NONE); uvm_pagedeactivate(pg); } uvm_unlock_pageq(); @@ -315,8 +314,7 @@ uvmfault_anonget(struct uvm_faultinfo *ufi, struct vm_amap *amap, * try again. */ if ((pg->pg_flags & (PG_BUSY|PG_RELEASED)) == 0) - return (VM_PAGER_OK); - atomic_setbits_int(&pg->pg_flags, PG_WANTED); + return 0; counters_inc(uvmexp_counters, flt_pgwait); /* @@ -326,13 +324,12 @@ uvmfault_anonget(struct uvm_faultinfo *ufi, struct vm_amap *amap, if (pg->uobject) { /* Owner of page is UVM object. */ uvmfault_unlockall(ufi, amap, NULL); - rwsleep_nsec(pg, pg->uobject->vmobjlock, - PVM | PNORELOCK, "anonget1", INFSLP); + uvm_pagewait(pg, pg->uobject->vmobjlock, + "anonget1"); } else { /* Owner of page is anon. */ uvmfault_unlockall(ufi, NULL, NULL); - rwsleep_nsec(pg, anon->an_lock, PVM | PNORELOCK, - "anonget2", INFSLP); + uvm_pagewait(pg, anon->an_lock, "anonget2"); } } else { /* @@ -404,7 +401,7 @@ uvmfault_anonget(struct uvm_faultinfo *ufi, struct vm_amap *amap, uvmfault_unlockall(ufi, NULL, NULL); uvm_anon_release(anon); /* frees page for us */ counters_inc(uvmexp_counters, flt_pgrele); - return (VM_PAGER_REFAULT); /* refault! */ + return ERESTART; /* refault! */ } if (error != VM_PAGER_OK) { @@ -435,7 +432,12 @@ uvmfault_anonget(struct uvm_faultinfo *ufi, struct vm_amap *amap, uvmfault_unlockall(ufi, NULL, NULL); } rw_exit(anon->an_lock); - return (VM_PAGER_ERROR); + /* + * An error occurred while trying to bring + * in the page -- this is the only error we + * return right now. + */ + return EACCES; /* XXX */ } /* @@ -457,7 +459,7 @@ uvmfault_anonget(struct uvm_faultinfo *ufi, struct vm_amap *amap, if (we_own) { rw_exit(anon->an_lock); } - return (VM_PAGER_REFAULT); + return ERESTART; } /* @@ -468,7 +470,7 @@ uvmfault_anonget(struct uvm_faultinfo *ufi, struct vm_amap *amap, ufi->orig_rvaddr - ufi->entry->start) != anon) { uvmfault_unlockall(ufi, amap, NULL); - return (VM_PAGER_REFAULT); + return ERESTART; } /* @@ -481,6 +483,74 @@ uvmfault_anonget(struct uvm_faultinfo *ufi, struct vm_amap *amap, /*NOTREACHED*/ } +/* + * uvmfault_promote: promote data to a new anon. used for 1B and 2B. + * + * 1. allocate an anon and a page. + * 2. fill its contents. + * + * => if we fail (result != 0) we unlock everything. + * => on success, return a new locked anon via 'nanon'. + * => it's caller's responsibility to put the promoted nanon->an_page to the + * page queue. + */ +int +uvmfault_promote(struct uvm_faultinfo *ufi, + struct vm_page *uobjpage, + struct vm_anon **nanon, /* OUT: allocated anon */ + struct vm_page **npg) +{ + struct vm_amap *amap = ufi->entry->aref.ar_amap; + struct uvm_object *uobj = NULL; + struct vm_anon *anon; + struct vm_page *pg = NULL; + + if (uobjpage != PGO_DONTCARE) + uobj = uobjpage->uobject; + + KASSERT(uobj == NULL || rw_lock_held(uobj->vmobjlock)); + + anon = uvm_analloc(); + if (anon) { + anon->an_lock = amap->am_lock; + pg = uvm_pagealloc(NULL, 0, anon, + (uobjpage == PGO_DONTCARE) ? UVM_PGA_ZERO : 0); + } + + /* check for out of RAM */ + if (anon == NULL || pg == NULL) { + uvmfault_unlockall(ufi, amap, uobj); + if (anon == NULL) + counters_inc(uvmexp_counters, flt_noanon); + else { + anon->an_lock = NULL; + anon->an_ref--; + uvm_anfree(anon); + counters_inc(uvmexp_counters, flt_noram); + } + + if (uvm_swapisfull()) + return ENOMEM; + + /* out of RAM, wait for more */ + if (anon == NULL) + uvm_anwait(); + else + uvm_wait("flt_noram3"); + return ERESTART; + } + + /* + * copy the page [pg now dirty] + */ + if (uobjpage != PGO_DONTCARE) + uvm_pagecopy(uobjpage, pg); + + *nanon = anon; + *npg = pg; + return 0; +} + /* * Update statistics after fault resolution. * - maxrss @@ -548,22 +618,27 @@ struct uvm_faultctx { boolean_t narrow; boolean_t wired; paddr_t pa_flags; + boolean_t promote; + int lower_lock_type; }; int uvm_fault_check( struct uvm_faultinfo *, struct uvm_faultctx *, - struct vm_anon ***); + struct vm_anon ***, vm_fault_t); int uvm_fault_upper( struct uvm_faultinfo *, struct uvm_faultctx *, - struct vm_anon **, vm_fault_t); + struct vm_anon **); boolean_t uvm_fault_upper_lookup( struct uvm_faultinfo *, const struct uvm_faultctx *, struct vm_anon **, struct vm_page **); int uvm_fault_lower( struct uvm_faultinfo *, struct uvm_faultctx *, - struct vm_page **, vm_fault_t); + struct vm_page **); +int uvm_fault_lower_io( + struct uvm_faultinfo *, struct uvm_faultctx *, + struct uvm_object **, struct vm_page **); int uvm_fault(vm_map_t orig_map, vaddr_t vaddr, vm_fault_t fault_type, @@ -585,19 +660,16 @@ uvm_fault(vm_map_t orig_map, vaddr_t vaddr, vm_fault_t fault_type, ufi.orig_map = orig_map; ufi.orig_rvaddr = trunc_page(vaddr); ufi.orig_size = PAGE_SIZE; /* can't get any smaller than this */ - if (fault_type == VM_FAULT_WIRE) - flt.narrow = TRUE; /* don't look for neighborhood - * pages on wire */ - else - flt.narrow = FALSE; /* normal fault */ flt.access_type = access_type; - + flt.narrow = FALSE; /* assume normal fault for now */ + flt.wired = FALSE; /* assume non-wired fault for now */ + flt.lower_lock_type = RW_WRITE; /* exclusive lock for now */ error = ERESTART; while (error == ERESTART) { /* ReFault: */ anons = anons_store; - error = uvm_fault_check(&ufi, &flt, &anons); + error = uvm_fault_check(&ufi, &flt, &anons, fault_type); if (error != 0) continue; @@ -605,7 +677,7 @@ uvm_fault(vm_map_t orig_map, vaddr_t vaddr, vm_fault_t fault_type, shadowed = uvm_fault_upper_lookup(&ufi, &flt, anons, pages); if (shadowed == TRUE) { /* case 1: fault on an anon in our amap */ - error = uvm_fault_upper(&ufi, &flt, anons, fault_type); + error = uvm_fault_upper(&ufi, &flt, anons); } else { struct uvm_object *uobj = ufi.entry->object.uvm_obj; @@ -618,24 +690,16 @@ uvm_fault(vm_map_t orig_map, vaddr_t vaddr, vm_fault_t fault_type, * providing a pgo_fault routine. */ if (uobj != NULL && uobj->pgops->pgo_fault != NULL) { - KERNEL_LOCK(); rw_enter(uobj->vmobjlock, RW_WRITE); + KERNEL_LOCK(); error = uobj->pgops->pgo_fault(&ufi, flt.startva, pages, flt.npages, flt.centeridx, fault_type, flt.access_type, PGO_LOCKED); KERNEL_UNLOCK(); - - if (error == VM_PAGER_OK) - error = 0; - else if (error == VM_PAGER_REFAULT) - error = ERESTART; - else - error = EACCES; } else { /* case 2: fault on backing obj or zero fill */ - error = uvm_fault_lower(&ufi, &flt, pages, - fault_type); + error = uvm_fault_lower(&ufi, &flt, pages); } } } @@ -660,7 +724,7 @@ uvm_fault(vm_map_t orig_map, vaddr_t vaddr, vm_fault_t fault_type, */ int uvm_fault_check(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, - struct vm_anon ***ranons) + struct vm_anon ***ranons, vm_fault_t fault_type) { struct vm_amap *amap; struct uvm_object *uobj; @@ -694,12 +758,14 @@ uvm_fault_check(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, * be more strict than ufi->entry->protection. "wired" means either * the entry is wired or we are fault-wiring the pg. */ - flt->enter_prot = ufi->entry->protection; flt->pa_flags = UVM_ET_ISWC(ufi->entry) ? PMAP_WC : 0; - flt->wired = VM_MAPENT_ISWIRED(ufi->entry) || (flt->narrow == TRUE); - if (flt->wired) + if (VM_MAPENT_ISWIRED(ufi->entry) || (fault_type == VM_FAULT_WIRE)) { + flt->wired = TRUE; flt->access_type = flt->enter_prot; /* full access for wired */ + /* don't look for neighborhood * pages on "wire" fault */ + flt->narrow = TRUE; + } /* handle "needs_copy" case. */ if (UVM_ET_ISNEEDSCOPY(ufi->entry)) { @@ -778,7 +844,7 @@ uvm_fault_check(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, * if we've got an amap then lock it and extract current anons. */ if (amap) { - amap_lock(amap); + amap_lock(amap, RW_WRITE); amap_lookups(&ufi->entry->aref, flt->startva - ufi->entry->start, *ranons, flt->npages); } else { @@ -835,10 +901,11 @@ uvm_fault_upper_lookup(struct uvm_faultinfo *ufi, { struct vm_amap *amap = ufi->entry->aref.ar_amap; struct vm_anon *anon; + struct vm_page *pg; boolean_t shadowed; vaddr_t currva; paddr_t pa; - int lcv; + int lcv, entered = 0; /* locked: maps(read), amap(if there) */ KASSERT(amap == NULL || @@ -852,16 +919,6 @@ uvm_fault_upper_lookup(struct uvm_faultinfo *ufi, currva = flt->startva; shadowed = FALSE; for (lcv = 0; lcv < flt->npages; lcv++, currva += PAGE_SIZE) { - /* - * dont play with VAs that are already mapped - * except for center) - */ - if (lcv != flt->centeridx && - pmap_extract(ufi->orig_map->pmap, currva, &pa)) { - pages[lcv] = PGO_DONTCARE; - continue; - } - /* * unmapped or center page. check if any anon at this level. */ @@ -878,29 +935,40 @@ uvm_fault_upper_lookup(struct uvm_faultinfo *ufi, shadowed = TRUE; continue; } + anon = anons[lcv]; + pg = anon->an_page; + KASSERT(anon->an_lock == amap->am_lock); - if (anon->an_page && - (anon->an_page->pg_flags & (PG_RELEASED|PG_BUSY)) == 0) { + + /* + * ignore busy pages. + * don't play with VAs that are already mapped. + */ + if (pg && (pg->pg_flags & (PG_RELEASED|PG_BUSY)) == 0 && + !pmap_extract(ufi->orig_map->pmap, currva, &pa)) { uvm_lock_pageq(); - uvm_pageactivate(anon->an_page); /* reactivate */ + uvm_pageactivate(pg); /* reactivate */ uvm_unlock_pageq(); counters_inc(uvmexp_counters, flt_namap); + /* No fault-ahead when wired. */ + KASSERT(flt->wired == FALSE); + /* * Since this isn't the page that's actually faulting, * ignore pmap_enter() failures; it's not critical * that we enter these right now. */ (void) pmap_enter(ufi->orig_map->pmap, currva, - VM_PAGE_TO_PHYS(anon->an_page) | flt->pa_flags, + VM_PAGE_TO_PHYS(pg) | flt->pa_flags, (anon->an_ref > 1) ? (flt->enter_prot & ~PROT_WRITE) : flt->enter_prot, - PMAP_CANFAIL | - (VM_MAPENT_ISWIRED(ufi->entry) ? PMAP_WIRED : 0)); + PMAP_CANFAIL); + entered++; } } - if (flt->npages > 1) + if (entered > 0) pmap_update(ufi->orig_map->pmap); return shadowed; @@ -916,7 +984,7 @@ uvm_fault_upper_lookup(struct uvm_faultinfo *ufi, */ int uvm_fault_upper(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, - struct vm_anon **anons, vm_fault_t fault_type) + struct vm_anon **anons) { struct vm_amap *amap = ufi->entry->aref.ar_amap; struct vm_anon *oanon, *anon = anons[flt->centeridx]; @@ -941,25 +1009,14 @@ uvm_fault_upper(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, */ error = uvmfault_anonget(ufi, amap, anon); switch (error) { - case VM_PAGER_OK: + case 0: break; - case VM_PAGER_REFAULT: + case ERESTART: return ERESTART; - case VM_PAGER_ERROR: - /* - * An error occurred while trying to bring in the - * page -- this is the only error we return right - * now. - */ - return EACCES; /* XXX */ default: -#ifdef DIAGNOSTIC - panic("uvm_fault: uvmfault_anonget -> %d", error); -#else - return EACCES; -#endif + return error; } KASSERT(rw_write_held(amap->am_lock)); @@ -979,39 +1036,16 @@ uvm_fault_upper(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, */ if ((flt->access_type & PROT_WRITE) != 0 && anon->an_ref > 1) { + /* promoting requires a write lock. */ + KASSERT(rw_write_held(amap->am_lock)); + counters_inc(uvmexp_counters, flt_acow); oanon = anon; /* oanon = old */ - anon = uvm_analloc(); - if (anon) { - anon->an_lock = amap->am_lock; - pg = uvm_pagealloc(NULL, 0, anon, 0); - } - /* check for out of RAM */ - if (anon == NULL || pg == NULL) { - uvmfault_unlockall(ufi, amap, NULL); - if (anon == NULL) - counters_inc(uvmexp_counters, flt_noanon); - else { - anon->an_lock = NULL; - anon->an_ref--; - uvm_anfree(anon); - counters_inc(uvmexp_counters, flt_noram); - } + error = uvmfault_promote(ufi, oanon->an_page, &anon, &pg); + if (error) + return error; - if (uvm_swapisfull()) - return ENOMEM; - - /* out of RAM, wait for more */ - if (anon == NULL) - uvm_anwait(); - else - uvm_wait("flt_noram3"); - return ERESTART; - } - - /* got all resources, replace anon with nanon */ - uvm_pagecopy(oanon->an_page, pg); /* pg now !PG_CLEAN */ /* un-busy! new page */ atomic_clearbits_int(&pg->pg_flags, PG_BUSY|PG_FAKE); UVM_PAGE_OWN(pg, NULL); @@ -1019,7 +1053,10 @@ uvm_fault_upper(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, ufi->orig_rvaddr - ufi->entry->start, anon, 1); KASSERT(ret == 0); + KASSERT(anon->an_lock == oanon->an_lock); + /* deref: can not drop to zero here by defn! */ + KASSERT(oanon->an_ref > 1); oanon->an_ref--; #if defined(MULTIPROCESSOR) && !defined(__HAVE_PMAP_MPSAFE_ENTER_COW) @@ -1077,9 +1114,14 @@ uvm_fault_upper(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, * ... update the page queues. */ uvm_lock_pageq(); - - if (fault_type == VM_FAULT_WIRE) { + if (flt->wired) { uvm_pagewire(pg); + } else { + uvm_pageactivate(pg); + } + uvm_unlock_pageq(); + + if (flt->wired) { /* * since the now-wired page cannot be paged out, * release its swap resources for others to use. @@ -1088,13 +1130,8 @@ uvm_fault_upper(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, */ atomic_clearbits_int(&pg->pg_flags, PG_CLEAN); uvm_anon_dropswap(anon); - } else { - /* activate it */ - uvm_pageactivate(pg); } - uvm_unlock_pageq(); - /* * done case 1! finish up by unlocking everything and returning success */ @@ -1118,10 +1155,11 @@ uvm_fault_lower_lookup( { struct uvm_object *uobj = ufi->entry->object.uvm_obj; struct vm_page *uobjpage = NULL; - int lcv, gotpages; + int lcv, gotpages, entered; vaddr_t currva; + paddr_t pa; - rw_enter(uobj->vmobjlock, RW_WRITE); + rw_enter(uobj->vmobjlock, flt->lower_lock_type); counters_inc(uvmexp_counters, flt_lget); gotpages = flt->npages; @@ -1138,61 +1176,59 @@ uvm_fault_lower_lookup( return NULL; } + entered = 0; currva = flt->startva; for (lcv = 0; lcv < flt->npages; lcv++, currva += PAGE_SIZE) { if (pages[lcv] == NULL || pages[lcv] == PGO_DONTCARE) continue; + KASSERT((pages[lcv]->pg_flags & PG_BUSY) == 0); KASSERT((pages[lcv]->pg_flags & PG_RELEASED) == 0); /* - * if center page is resident and not - * PG_BUSY, then pgo_get made it PG_BUSY - * for us and gave us a handle to it. - * remember this page as "uobjpage." - * (for later use). + * if center page is resident and not PG_BUSY, then pgo_get + * gave us a handle to it. + * remember this page as "uobjpage." (for later use). */ if (lcv == flt->centeridx) { uobjpage = pages[lcv]; continue; } - /* - * note: calling pgo_get with locked data - * structures returns us pages which are - * neither busy nor released, so we don't - * need to check for this. we can just - * directly enter the page (after moving it - * to the head of the active queue [useful?]). - */ + if (pmap_extract(ufi->orig_map->pmap, currva, &pa)) + continue; - uvm_lock_pageq(); - uvm_pageactivate(pages[lcv]); /* reactivate */ - uvm_unlock_pageq(); + /* + * calling pgo_get with PGO_LOCKED returns us pages which + * are neither busy nor released, so we don't need to check + * for this. we can just directly enter the pages. + */ + if (pages[lcv]->wire_count == 0) { + uvm_lock_pageq(); + uvm_pageactivate(pages[lcv]); + uvm_unlock_pageq(); + } counters_inc(uvmexp_counters, flt_nomap); + /* No fault-ahead when wired. */ + KASSERT(flt->wired == FALSE); + /* - * Since this page isn't the page that's - * actually faulting, ignore pmap_enter() - * failures; it's not critical that we + * Since this page isn't the page that's actually faulting, + * ignore pmap_enter() failures; it's not critical that we * enter these right now. + * NOTE: page can't be PG_WANTED or PG_RELEASED because we've + * held the lock the whole time we've had the handle. */ (void) pmap_enter(ufi->orig_map->pmap, currva, VM_PAGE_TO_PHYS(pages[lcv]) | flt->pa_flags, - flt->enter_prot & MASK(ufi->entry), - PMAP_CANFAIL | - (flt->wired ? PMAP_WIRED : 0)); + flt->enter_prot & MASK(ufi->entry), PMAP_CANFAIL); + entered++; - /* - * NOTE: page can't be PG_WANTED because - * we've held the lock the whole time - * we've had the handle. - */ - atomic_clearbits_int(&pages[lcv]->pg_flags, PG_BUSY); - UVM_PAGE_OWN(pages[lcv], NULL); } - pmap_update(ufi->orig_map->pmap); + if (entered > 0) + pmap_update(ufi->orig_map->pmap); return uobjpage; } @@ -1200,18 +1236,25 @@ uvm_fault_lower_lookup( /* * uvm_fault_lower: handle lower fault. * + * 1. check uobj + * 1.1. if null, ZFOD. + * 1.2. if not null, look up unnmapped neighbor pages. + * 2. for center page, check if promote. + * 2.1. ZFOD always needs promotion. + * 2.2. other uobjs, when entry is marked COW (usually MAP_PRIVATE vnode). + * 3. if uobj is not ZFOD and page is not found, do i/o. + * 4. dispatch either direct / promote fault. */ int uvm_fault_lower(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, - struct vm_page **pages, vm_fault_t fault_type) + struct vm_page **pages) { struct vm_amap *amap = ufi->entry->aref.ar_amap; struct uvm_object *uobj = ufi->entry->object.uvm_obj; - boolean_t promote, locked; - int result; + int dropswap = 0; struct vm_page *uobjpage, *pg = NULL; struct vm_anon *anon = NULL; - voff_t uoff; + int error; /* * now, if the desired page is not shadowed by the amap and we have @@ -1242,7 +1285,7 @@ uvm_fault_lower(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, KASSERT(amap == NULL || rw_write_held(amap->am_lock)); KASSERT(uobj == NULL || - rw_write_held(uobj->vmobjlock)); + rw_status(uobj->vmobjlock) == flt->lower_lock_type); /* * note that uobjpage can not be PGO_DONTCARE at this point. we now @@ -1252,10 +1295,10 @@ uvm_fault_lower(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, */ if (uobj == NULL) { uobjpage = PGO_DONTCARE; - promote = TRUE; /* always need anon here */ + flt->promote = TRUE; /* always need anon here */ } else { KASSERT(uobjpage != PGO_DONTCARE); - promote = (flt->access_type & PROT_WRITE) && + flt->promote = (flt->access_type & PROT_WRITE) && UVM_ET_ISCOPYONWRITE(ufi->entry); } @@ -1270,87 +1313,15 @@ uvm_fault_lower(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, if (uobjpage) { /* update rusage counters */ curproc->p_ru.ru_minflt++; - } else { - int gotpages; - - /* update rusage counters */ - curproc->p_ru.ru_majflt++; - - uvmfault_unlockall(ufi, amap, NULL); - - counters_inc(uvmexp_counters, flt_get); - gotpages = 1; - uoff = (ufi->orig_rvaddr - ufi->entry->start) + ufi->entry->offset; - result = uobj->pgops->pgo_get(uobj, uoff, &uobjpage, &gotpages, - 0, flt->access_type & MASK(ufi->entry), ufi->entry->advice, - PGO_SYNCIO); - - /* - * recover from I/O - */ - if (result != VM_PAGER_OK) { - KASSERT(result != VM_PAGER_PEND); - - if (result == VM_PAGER_AGAIN) { - tsleep_nsec(&nowake, PVM, "fltagain2", - MSEC_TO_NSEC(5)); - return ERESTART; - } - - if (!UVM_ET_ISNOFAULT(ufi->entry)) - return (EIO); - - uobjpage = PGO_DONTCARE; - uobj = NULL; - promote = TRUE; - } - - /* re-verify the state of the world. */ - locked = uvmfault_relock(ufi); - if (locked && amap != NULL) - amap_lock(amap); - - /* might be changed */ if (uobjpage != PGO_DONTCARE) { - uobj = uobjpage->uobject; - rw_enter(uobj->vmobjlock, RW_WRITE); - } - - /* - * Re-verify that amap slot is still free. if there is - * a problem, we clean up. - */ - if (locked && amap && amap_lookup(&ufi->entry->aref, - ufi->orig_rvaddr - ufi->entry->start)) { - if (locked) - uvmfault_unlockall(ufi, amap, NULL); - locked = FALSE; - } - - /* didn't get the lock? release the page and retry. */ - if (locked == FALSE && uobjpage != PGO_DONTCARE) { uvm_lock_pageq(); - /* make sure it is in queues */ uvm_pageactivate(uobjpage); uvm_unlock_pageq(); - - if (uobjpage->pg_flags & PG_WANTED) - /* still holding object lock */ - wakeup(uobjpage); - atomic_clearbits_int(&uobjpage->pg_flags, - PG_BUSY|PG_WANTED); - UVM_PAGE_OWN(uobjpage, NULL); } - - if (locked == FALSE) { - if (uobjpage != PGO_DONTCARE) - rw_exit(uobj->vmobjlock); - return ERESTART; - } - - /* - * we have the data in uobjpage which is PG_BUSY - */ + } else { + error = uvm_fault_lower_io(ufi, flt, &uobj, &uobjpage); + if (error != 0) + return error; } /* @@ -1358,7 +1329,7 @@ uvm_fault_lower(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, * - at this point uobjpage can not be NULL * - at this point uobjpage could be PG_WANTED (handle later) */ - if (promote == FALSE) { + if (flt->promote == FALSE) { /* * we are not promoting. if the mapping is COW ensure that we * don't give more access than we should (e.g. when doing a read @@ -1378,76 +1349,26 @@ uvm_fault_lower(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, * we are faulting directly on the page. */ } else { + KASSERT(amap != NULL); + + /* promoting requires a write lock. */ + KASSERT(rw_write_held(amap->am_lock)); + KASSERT(uobj == NULL || + rw_status(uobj->vmobjlock) == flt->lower_lock_type); + /* * if we are going to promote the data to an anon we * allocate a blank anon here and plug it into our amap. */ -#ifdef DIAGNOSTIC - if (amap == NULL) - panic("uvm_fault: want to promote data, but no anon"); -#endif - - anon = uvm_analloc(); - if (anon) { - /* - * In `Fill in data...' below, if - * uobjpage == PGO_DONTCARE, we want - * a zero'd, dirty page, so have - * uvm_pagealloc() do that for us. - */ - anon->an_lock = amap->am_lock; - pg = uvm_pagealloc(NULL, 0, anon, - (uobjpage == PGO_DONTCARE) ? UVM_PGA_ZERO : 0); - } - - /* - * out of memory resources? - */ - if (anon == NULL || pg == NULL) { - /* - * arg! must unbusy our page and fail or sleep. - */ - if (uobjpage != PGO_DONTCARE) { - uvm_lock_pageq(); - uvm_pageactivate(uobjpage); - uvm_unlock_pageq(); - - if (uobjpage->pg_flags & PG_WANTED) - wakeup(uobjpage); - atomic_clearbits_int(&uobjpage->pg_flags, - PG_BUSY|PG_WANTED); - UVM_PAGE_OWN(uobjpage, NULL); - } - - /* unlock and fail ... */ - uvmfault_unlockall(ufi, amap, uobj); - if (anon == NULL) - counters_inc(uvmexp_counters, flt_noanon); - else { - anon->an_lock = NULL; - anon->an_ref--; - uvm_anfree(anon); - counters_inc(uvmexp_counters, flt_noram); - } - - if (uvm_swapisfull()) - return (ENOMEM); - - /* out of RAM, wait for more */ - if (anon == NULL) - uvm_anwait(); - else - uvm_wait("flt_noram5"); - return ERESTART; - } + error = uvmfault_promote(ufi, uobjpage, &anon, &pg); + if (error) + return error; /* * fill in the data */ if (uobjpage != PGO_DONTCARE) { counters_inc(uvmexp_counters, flt_prcopy); - /* copy page [pg now dirty] */ - uvm_pagecopy(uobjpage, pg); /* * promote to shared amap? make sure all sharing @@ -1469,28 +1390,25 @@ uvm_fault_lower(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, pmap_page_protect(uobjpage, PROT_NONE); } #endif - - /* dispose of uobjpage. drop handle to uobj as well. */ - if (uobjpage->pg_flags & PG_WANTED) - wakeup(uobjpage); - atomic_clearbits_int(&uobjpage->pg_flags, - PG_BUSY|PG_WANTED); - UVM_PAGE_OWN(uobjpage, NULL); - uvm_lock_pageq(); - uvm_pageactivate(uobjpage); - uvm_unlock_pageq(); + /* done with copied uobjpage. */ rw_exit(uobj->vmobjlock); uobj = NULL; } else { counters_inc(uvmexp_counters, flt_przero); /* - * Page is zero'd and marked dirty by uvm_pagealloc() - * above. + * Page is zero'd and marked dirty by uvm_pagealloc(), + * called in uvmfault_promote() above. */ } if (amap_add(&ufi->entry->aref, ufi->orig_rvaddr - ufi->entry->start, anon, 0)) { + if (pg->pg_flags & PG_WANTED) + wakeup(pg); + + atomic_clearbits_int(&pg->pg_flags, + PG_BUSY|PG_FAKE|PG_WANTED); + UVM_PAGE_OWN(pg, NULL); uvmfault_unlockall(ufi, amap, uobj); uvm_anfree(anon); counters_inc(uvmexp_counters, flt_noamap); @@ -1504,17 +1422,21 @@ uvm_fault_lower(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, } } - /* note: pg is either the uobjpage or the new page in the new anon */ + /* + * anon must be write locked (promotion). uobj can be either. + * + * Note: pg is either the uobjpage or the new page in the new anon. + */ + KASSERT(amap == NULL || + rw_write_held(amap->am_lock)); + KASSERT(uobj == NULL || + rw_status(uobj->vmobjlock) == flt->lower_lock_type); + KASSERT(anon == NULL || anon->an_lock == amap->am_lock); + /* * all resources are present. we can now map it in and free our * resources. */ - if (amap == NULL) - KASSERT(anon == NULL); - else { - KASSERT(rw_write_held(amap->am_lock)); - KASSERT(anon == NULL || anon->an_lock == amap->am_lock); - } if (pmap_enter(ufi->orig_map->pmap, ufi->orig_rvaddr, VM_PAGE_TO_PHYS(pg) | flt->pa_flags, flt->enter_prot, flt->access_type | PMAP_CANFAIL | (flt->wired ? PMAP_WIRED : 0)) != 0) { @@ -1540,10 +1462,9 @@ uvm_fault_lower(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, return ERESTART; } - if (fault_type == VM_FAULT_WIRE) { - uvm_lock_pageq(); + uvm_lock_pageq(); + if (flt->wired) { uvm_pagewire(pg); - uvm_unlock_pageq(); if (pg->pg_flags & PQ_AOBJ) { /* * since the now-wired page cannot be paged out, @@ -1558,14 +1479,15 @@ uvm_fault_lower(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, KASSERT(uobj != NULL); KASSERT(uobj->vmobjlock == pg->uobject->vmobjlock); atomic_clearbits_int(&pg->pg_flags, PG_CLEAN); - uao_dropswap(uobj, pg->offset >> PAGE_SHIFT); + dropswap = 1; } } else { - /* activate it */ - uvm_lock_pageq(); uvm_pageactivate(pg); - uvm_unlock_pageq(); } + uvm_unlock_pageq(); + + if (dropswap) + uao_dropswap(uobj, pg->offset >> PAGE_SHIFT); if (pg->pg_flags & PG_WANTED) wakeup(pg); @@ -1578,6 +1500,115 @@ uvm_fault_lower(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, return (0); } +/* + * uvm_fault_lower_io: get lower page from backing store. + * + * 1. unlock everything, because i/o will block. + * 2. call pgo_get. + * 3. if failed, recover. + * 4. if succeeded, relock everything and verify things. + */ +int +uvm_fault_lower_io( + struct uvm_faultinfo *ufi, struct uvm_faultctx *flt, + struct uvm_object **ruobj, struct vm_page **ruobjpage) +{ + struct vm_amap * const amap = ufi->entry->aref.ar_amap; + struct uvm_object *uobj = *ruobj; + struct vm_page *pg; + boolean_t locked; + int gotpages, advice; + int result; + voff_t uoff; + vm_prot_t access_type; + + /* grab everything we need from the entry before we unlock */ + uoff = (ufi->orig_rvaddr - ufi->entry->start) + ufi->entry->offset; + access_type = flt->access_type & MASK(ufi->entry); + advice = ufi->entry->advice; + + uvmfault_unlockall(ufi, amap, NULL); + + /* update rusage counters */ + curproc->p_ru.ru_majflt++; + + KASSERT(rw_write_held(uobj->vmobjlock)); + + counters_inc(uvmexp_counters, flt_get); + gotpages = 1; + pg = NULL; + result = uobj->pgops->pgo_get(uobj, uoff, &pg, &gotpages, + 0, access_type, advice, PGO_SYNCIO); + + /* + * recover from I/O + */ + if (result != VM_PAGER_OK) { + KASSERT(result != VM_PAGER_PEND); + + if (result == VM_PAGER_AGAIN) { + tsleep_nsec(&nowake, PVM, "fltagain2", MSEC_TO_NSEC(5)); + return ERESTART; + } + + if (!UVM_ET_ISNOFAULT(ufi->entry)) + return (EIO); + + pg = PGO_DONTCARE; + uobj = NULL; + flt->promote = TRUE; + } + + /* re-verify the state of the world. */ + locked = uvmfault_relock(ufi); + if (locked && amap != NULL) + amap_lock(amap, RW_WRITE); + + /* might be changed */ + if (pg != PGO_DONTCARE) { + uobj = pg->uobject; + rw_enter(uobj->vmobjlock, flt->lower_lock_type); + KASSERT((pg->pg_flags & PG_BUSY) != 0); + KASSERT(flt->lower_lock_type == RW_WRITE); + } + + /* + * Re-verify that amap slot is still free. if there is + * a problem, we clean up. + */ + if (locked && amap && amap_lookup(&ufi->entry->aref, + ufi->orig_rvaddr - ufi->entry->start)) { + if (locked) + uvmfault_unlockall(ufi, amap, NULL); + locked = FALSE; + } + + /* release the page now, still holding object lock */ + if (pg != PGO_DONTCARE) { + uvm_lock_pageq(); + uvm_pageactivate(pg); + uvm_unlock_pageq(); + + if (pg->pg_flags & PG_WANTED) + wakeup(pg); + atomic_clearbits_int(&pg->pg_flags, PG_BUSY|PG_WANTED); + UVM_PAGE_OWN(pg, NULL); + } + + if (locked == FALSE) { + if (pg != PGO_DONTCARE) + rw_exit(uobj->vmobjlock); + return ERESTART; + } + + /* + * we have the data in pg. we are holding object lock (so the page + * can't be released on us). + */ + *ruobj = uobj; + *ruobjpage = pg; + return 0; +} /* * uvm_fault_wire: wire down a range of virtual addresses in a map. @@ -1654,9 +1685,6 @@ uvm_fault_unwire_locked(vm_map_t map, vaddr_t start, vaddr_t end) panic("uvm_fault_unwire_locked: address not in map"); for (va = start; va < end ; va += PAGE_SIZE) { - if (pmap_extract(pmap, va, &pa) == FALSE) - continue; - /* * find the map entry for the current address. */ @@ -1682,6 +1710,9 @@ uvm_fault_unwire_locked(vm_map_t map, vaddr_t start, vaddr_t end) oentry = entry; } + if (!pmap_extract(pmap, va, &pa)) + continue; + /* * if the entry is no longer wired, tell the pmap. */ diff --git a/sys/uvm/uvm_glue.c b/sys/uvm/uvm_glue.c index c2f207a23..c8c4132c9 100644 --- a/sys/uvm/uvm_glue.c +++ b/sys/uvm/uvm_glue.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_glue.c,v 1.85 2024/10/08 02:29:10 jsg Exp $ */ +/* $OpenBSD: uvm_glue.c,v 1.87 2024/10/28 08:25:32 mpi Exp $ */ /* $NetBSD: uvm_glue.c,v 1.44 2001/02/06 19:54:44 eeh Exp $ */ /* @@ -257,20 +257,18 @@ uvm_vsunlock_device(struct proc *p, void *addr, size_t len, void *map) uvm_km_free(kernel_map, kva, sz); } +const struct kmem_va_mode kv_uarea = { + .kv_map = &kernel_map, + .kv_align = USPACE_ALIGN +}; + /* * uvm_uarea_alloc: allocate the u-area for a new thread */ vaddr_t uvm_uarea_alloc(void) { - vaddr_t uaddr; - - uaddr = uvm_km_kmemalloc_pla(kernel_map, uvm.kernel_object, USPACE, - USPACE_ALIGN, UVM_KMF_ZERO, - no_constraint.ucr_low, no_constraint.ucr_high, - 0, 0, USPACE/PAGE_SIZE); - - return (uaddr); + return (vaddr_t)km_alloc(USPACE, &kv_uarea, &kp_zero, &kd_waitok); } /* @@ -282,7 +280,7 @@ uvm_uarea_alloc(void) void uvm_uarea_free(struct proc *p) { - uvm_km_free(kernel_map, (vaddr_t)p->p_addr, USPACE); + km_free(p->p_addr, USPACE, &kv_uarea, &kp_zero); p->p_addr = NULL; } @@ -339,13 +337,13 @@ int swapdebug = 0; * are swapped... otherwise the longest-sleeping or stopped process * is swapped, otherwise the longest resident process... */ -void +int uvm_swapout_threads(void) { struct process *pr; struct proc *p, *slpp; struct process *outpr; - int outpri; + int free, outpri; int didswap = 0; extern int maxslp; /* XXXCDC: should move off to uvmexp. or uvm., also in uvm_meter */ @@ -355,6 +353,8 @@ uvm_swapout_threads(void) return; #endif + free = uvmexp.free; + /* * outpr/outpri : stop/sleep process whose most active thread has * the largest sleeptime < maxslp @@ -403,8 +403,7 @@ next_process: ; * if we are real low on memory since we don't gain much by doing * it. */ - if (didswap == 0 && uvmexp.free <= atop(round_page(USPACE)) && - outpr != NULL) { + if (didswap == 0 && free <= atop(round_page(USPACE)) && outpr != NULL) { #ifdef DEBUG if (swapdebug & SDB_SWAPOUT) printf("swapout_threads: no duds, try procpr %p\n", @@ -412,6 +411,12 @@ next_process: ; #endif pmap_collect(outpr->ps_vmspace->vm_map.pmap); } + + /* + * XXX might return a non-0 value even if pmap_collect() didn't + * free anything. + */ + return (uvmexp.free - free); } #endif /* __HAVE_PMAP_COLLECT */ diff --git a/sys/uvm/uvm_glue.h b/sys/uvm/uvm_glue.h index f7f5341e0..e82e3ecc0 100644 --- a/sys/uvm/uvm_glue.h +++ b/sys/uvm/uvm_glue.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_glue.h,v 1.9 2014/07/11 16:35:40 jsg Exp $ */ +/* $OpenBSD: uvm_glue.h,v 1.10 2024/10/29 08:23:07 mpi Exp $ */ /* $NetBSD: uvm_glue.h,v 1.6 1999/06/21 17:25:11 thorpej Exp $ */ /* @@ -37,7 +37,7 @@ * uvm_glue.h */ -void uvm_swapout_threads(void); +int uvm_swapout_threads(void); struct vm_page *uvm_atopg(vaddr_t); diff --git a/sys/uvm/uvm_km.c b/sys/uvm/uvm_km.c index 871230e1d..5caee0a23 100644 --- a/sys/uvm/uvm_km.c +++ b/sys/uvm/uvm_km.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_km.c,v 1.154 2024/08/24 10:46:43 mpi Exp $ */ +/* $OpenBSD: uvm_km.c,v 1.155 2024/11/01 20:26:18 mpi Exp $ */ /* $NetBSD: uvm_km.c,v 1.42 2001/01/14 02:10:01 thorpej Exp $ */ /* @@ -433,86 +433,6 @@ uvm_km_free(struct vm_map *map, vaddr_t addr, vsize_t size) uvm_unmap(map, trunc_page(addr), round_page(addr+size)); } -#ifdef __i386__ -/* - * uvm_km_zalloc: allocate wired down memory in the kernel map. - * - * => we can sleep if needed - */ -vaddr_t -uvm_km_zalloc(struct vm_map *map, vsize_t size) -{ - vaddr_t kva, loopva; - voff_t offset; - struct vm_page *pg; - - KASSERT(vm_map_pmap(map) == pmap_kernel()); - - size = round_page(size); - kva = vm_map_min(map); /* hint */ - - /* allocate some virtual space */ - if (__predict_false(uvm_map(map, &kva, size, uvm.kernel_object, - UVM_UNKNOWN_OFFSET, 0, - UVM_MAPFLAG(PROT_READ | PROT_WRITE, - PROT_READ | PROT_WRITE | PROT_EXEC, - MAP_INHERIT_NONE, MADV_RANDOM, 0)) != 0)) { - return 0; - } - - /* recover object offset from virtual address */ - offset = kva - vm_map_min(kernel_map); - - /* now allocate the memory. we must be careful about released pages. */ - loopva = kva; - while (size) { - rw_enter(uvm.kernel_object->vmobjlock, RW_WRITE); - /* allocate ram */ - pg = uvm_pagealloc(uvm.kernel_object, offset, NULL, 0); - if (pg) { - atomic_clearbits_int(&pg->pg_flags, PG_BUSY); - UVM_PAGE_OWN(pg, NULL); - } - rw_exit(uvm.kernel_object->vmobjlock); - if (__predict_false(pg == NULL)) { - if (curproc == uvm.pagedaemon_proc) { - /* - * It is unfeasible for the page daemon to - * sleep for memory, so free what we have - * allocated and fail. - */ - uvm_unmap(map, kva, loopva - kva); - return (0); - } else { - uvm_wait("km_zallocw"); /* wait for memory */ - continue; - } - } - - /* - * map it in; note we're never called with an intrsafe - * object, so we always use regular old pmap_enter(). - */ - pmap_enter(map->pmap, loopva, VM_PAGE_TO_PHYS(pg), - PROT_READ | PROT_WRITE, - PROT_READ | PROT_WRITE | PMAP_WIRED); - - loopva += PAGE_SIZE; - offset += PAGE_SIZE; - size -= PAGE_SIZE; - } - pmap_update(map->pmap); - - /* - * zero on request (note that "size" is now zero due to the above loop - * so we need to subtract kva from loopva to reconstruct the size). - */ - memset((caddr_t)kva, 0, loopva - kva); - - return kva; -} -#endif - #if defined(__HAVE_PMAP_DIRECT) /* * uvm_km_page allocator, __HAVE_PMAP_DIRECT arch diff --git a/sys/uvm/uvm_map.c b/sys/uvm/uvm_map.c index c2be72b9f..418593cee 100644 --- a/sys/uvm/uvm_map.c +++ b/sys/uvm/uvm_map.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_map.c,v 1.330 2024/07/24 12:17:31 mpi Exp $ */ +/* $OpenBSD: uvm_map.c,v 1.337 2024/12/27 12:04:40 mpi Exp $ */ /* $NetBSD: uvm_map.c,v 1.86 2000/11/27 08:40:03 chs Exp $ */ /* @@ -461,7 +461,7 @@ void uvm_map_lock_entry(struct vm_map_entry *entry) { if (entry->aref.ar_amap != NULL) { - amap_lock(entry->aref.ar_amap); + amap_lock(entry->aref.ar_amap, RW_WRITE); } if (UVM_ET_ISOBJ(entry)) { rw_enter(entry->object.uvm_obj->vmobjlock, RW_WRITE); @@ -1856,10 +1856,8 @@ uvm_unmap_kill_entry_withlock(struct vm_map *map, struct vm_map_entry *entry, { /* Unwire removed map entry. */ if (VM_MAPENT_ISWIRED(entry)) { - KERNEL_LOCK(); entry->wired_count = 0; uvm_fault_unwire_locked(map, entry->start, entry->end); - KERNEL_UNLOCK(); } if (needlock) @@ -3010,7 +3008,7 @@ uvm_page_printit(struct vm_page *pg, boolean_t full, pgl = &uvm.page_inactive; } else if (pg->pg_flags & PQ_ACTIVE) { pgl = &uvm.page_active; - } else { + } else { pgl = NULL; } @@ -3732,8 +3730,8 @@ uvm_mapent_forkcopy(struct vmspace *new_vm, struct vm_map *new_map, old_entry->etype |= UVM_ET_NEEDSCOPY; } - /* parent must now be write-protected */ - protect_child = FALSE; + /* parent must now be write-protected */ + protect_child = FALSE; } else { /* * we only need to protect the child if the @@ -3854,7 +3852,7 @@ uvmspace_fork(struct process *pr) continue; } - /* Update process statistics. */ + /* Update process statistics. */ if (!UVM_ET_ISHOLE(new_entry)) new_map->size += new_entry->end - new_entry->start; if (!UVM_ET_ISOBJ(new_entry) && !UVM_ET_ISHOLE(new_entry) && @@ -4494,7 +4492,7 @@ uvm_map_clean(struct vm_map *map, vaddr_t start, vaddr_t end, int flags) cp_start = MAX(entry->start, start); cp_end = MIN(entry->end, end); - amap_lock(amap); + amap_lock(amap, RW_WRITE); for (; cp_start != cp_end; cp_start += PAGE_SIZE) { anon = amap_lookup(&entry->aref, cp_start - entry->start); @@ -4526,11 +4524,6 @@ deactivate_it: uvm_lock_pageq(); KASSERT(pg->uanon == anon); - - /* zap all mappings for the page. */ - pmap_page_protect(pg, PROT_NONE); - - /* ...and deactivate the page. */ uvm_pagedeactivate(pg); uvm_unlock_pageq(); @@ -5110,7 +5103,7 @@ uvm_map_mquery(struct vm_map *map, vaddr_t *addr_p, vsize_t sz, voff_t offset, /* Align address to pmap_prefer unless FLAG_FIXED is set. */ if (!(flags & UVM_FLAG_FIXED) && offset != UVM_UNKNOWN_OFFSET) { - tmp = (addr & ~(pmap_align - 1)) | pmap_offset; + tmp = (addr & ~(pmap_align - 1)) | pmap_offset; if (tmp < addr) tmp += pmap_align; addr = tmp; @@ -5201,68 +5194,77 @@ out: boolean_t vm_map_lock_try_ln(struct vm_map *map, char *file, int line) { - boolean_t rv; + int rv; if (map->flags & VM_MAP_INTRSAFE) { - rv = mtx_enter_try(&map->mtx); + if (!mtx_enter_try(&map->mtx)) + return FALSE; } else { + struct proc *busy; + mtx_enter(&map->flags_lock); - if ((map->flags & VM_MAP_BUSY) && (map->busy != curproc)) { - mtx_leave(&map->flags_lock); - return (FALSE); - } + busy = map->busy; mtx_leave(&map->flags_lock); - rv = (rw_enter(&map->lock, RW_WRITE|RW_NOSLEEP) == 0); - /* check if the lock is busy and back out if we won the race */ - if (rv) { - mtx_enter(&map->flags_lock); - if ((map->flags & VM_MAP_BUSY) && - (map->busy != curproc)) { - rw_exit(&map->lock); - rv = FALSE; - } - mtx_leave(&map->flags_lock); + if (busy != NULL && busy != curproc) + return FALSE; + + rv = rw_enter(&map->lock, RW_WRITE|RW_NOSLEEP); + if (rv != 0) + return FALSE; + + /* to be sure, to be sure */ + mtx_enter(&map->flags_lock); + busy = map->busy; + mtx_leave(&map->flags_lock); + if (busy != NULL && busy != curproc) { + rw_exit(&map->lock); + return FALSE; } } - if (rv) { - map->timestamp++; - LPRINTF(("map lock: %p (at %s %d)\n", map, file, line)); - uvm_tree_sanity(map, file, line); - uvm_tree_size_chk(map, file, line); - } + map->timestamp++; + LPRINTF(("map lock: %p (at %s %d)\n", map, file, line)); + uvm_tree_sanity(map, file, line); + uvm_tree_size_chk(map, file, line); - return (rv); + return TRUE; } void vm_map_lock_ln(struct vm_map *map, char *file, int line) { if ((map->flags & VM_MAP_INTRSAFE) == 0) { - do { - mtx_enter(&map->flags_lock); -tryagain: - while ((map->flags & VM_MAP_BUSY) && - (map->busy != curproc)) { - map->flags |= VM_MAP_WANTLOCK; - msleep_nsec(&map->flags, &map->flags_lock, + mtx_enter(&map->flags_lock); + for (;;) { + while (map->busy != NULL && map->busy != curproc) { + map->nbusy++; + msleep_nsec(&map->busy, &map->flags_lock, PVM, vmmapbsy, INFSLP); + map->nbusy--; } mtx_leave(&map->flags_lock); - } while (rw_enter(&map->lock, RW_WRITE|RW_SLEEPFAIL) != 0); - /* check if the lock is busy and back out if we won the race */ - mtx_enter(&map->flags_lock); - if ((map->flags & VM_MAP_BUSY) && (map->busy != curproc)) { - rw_exit(&map->lock); - goto tryagain; + + rw_enter_write(&map->lock); + + /* to be sure, to be sure */ + mtx_enter(&map->flags_lock); + if (map->busy != NULL && map->busy != curproc) { + /* go around again */ + rw_exit_write(&map->lock); + } else { + /* we won */ + break; + } } mtx_leave(&map->flags_lock); } else { mtx_enter(&map->mtx); } - if (map->busy != curproc) + if (map->busy != curproc) { + KASSERT(map->busy == NULL); map->timestamp++; + } LPRINTF(("map lock: %p (at %s %d)\n", map, file, line)); uvm_tree_sanity(map, file, line); uvm_tree_size_chk(map, file, line); @@ -5314,25 +5316,24 @@ vm_map_busy_ln(struct vm_map *map, char *file, int line) mtx_enter(&map->flags_lock); map->busy = curproc; - map->flags |= VM_MAP_BUSY; mtx_leave(&map->flags_lock); } void vm_map_unbusy_ln(struct vm_map *map, char *file, int line) { - int oflags; + unsigned int nbusy; KASSERT((map->flags & VM_MAP_INTRSAFE) == 0); KASSERT(map->busy == curproc); mtx_enter(&map->flags_lock); - oflags = map->flags; + nbusy = map->nbusy; map->busy = NULL; - map->flags &= ~(VM_MAP_BUSY|VM_MAP_WANTLOCK); mtx_leave(&map->flags_lock); - if (oflags & VM_MAP_WANTLOCK) - wakeup(&map->flags); + + if (nbusy > 0) + wakeup(&map->busy); } void diff --git a/sys/uvm/uvm_map.h b/sys/uvm/uvm_map.h index ae331f933..782442370 100644 --- a/sys/uvm/uvm_map.h +++ b/sys/uvm/uvm_map.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_map.h,v 1.90 2024/06/18 12:37:29 jsg Exp $ */ +/* $OpenBSD: uvm_map.h,v 1.94 2024/11/15 02:59:23 jsg Exp $ */ /* $NetBSD: uvm_map.h,v 1.24 2001/02/18 21:19:08 chs Exp $ */ /* @@ -214,17 +214,6 @@ RBT_PROTOTYPE(uvm_map_addr, vm_map_entry, daddrs.addr_entry, * map is write-locked. may be tested * without asserting `flags_lock'. * - * VM_MAP_BUSY r/w; may only be set when map is - * write-locked, may only be cleared by - * thread which set it, map read-locked - * or write-locked. must be tested - * while `flags_lock' is asserted. - * - * VM_MAP_WANTLOCK r/w; may only be set when the map - * is busy, and thread is attempting - * to write-lock. must be tested - * while `flags_lock' is asserted. - * * VM_MAP_GUARDPAGES r/o; must be specified at map * initialization time. * If set, guards will appear between @@ -257,6 +246,7 @@ RBT_PROTOTYPE(uvm_map_addr, vm_map_entry, daddrs.addr_entry, * a atomic operations * I immutable after creation or exec(2) * v `vm_map_lock' (this map `lock' or `mtx') + * f flags_lock */ struct vm_map { struct pmap *pmap; /* [I] Physical map */ @@ -266,9 +256,10 @@ struct vm_map { vsize_t size; /* virtual size */ int ref_count; /* [a] Reference count */ - int flags; /* flags */ + int flags; /* [f] flags */ unsigned int timestamp; /* Version number */ - struct proc *busy; /* [v] thread holding map busy*/ + struct proc *busy; /* [f] thread holding map busy*/ + unsigned int nbusy; /* [f] waiters for busy */ vaddr_t min_offset; /* [I] First address in map. */ vaddr_t max_offset; /* [I] Last address in map. */ @@ -312,7 +303,7 @@ struct vm_map { /* * XXX struct mutex changes size because of compile options, so - * place after fields which are inspected by libkvm / procmap(8) + * place after fields which are inspected by libkvm / procmap(1) */ struct rwlock lock; /* Non-intrsafe lock */ struct mutex mtx; /* Intrsafe lock */ @@ -323,8 +314,6 @@ struct vm_map { #define VM_MAP_PAGEABLE 0x01 /* ro: entries are pageable */ #define VM_MAP_INTRSAFE 0x02 /* ro: interrupt safe map */ #define VM_MAP_WIREFUTURE 0x04 /* rw: wire future mappings */ -#define VM_MAP_BUSY 0x08 /* rw: map is busy */ -#define VM_MAP_WANTLOCK 0x10 /* rw: want to write-lock */ #define VM_MAP_GUARDPAGES 0x20 /* rw: add guard pgs to map */ #define VM_MAP_ISVMSPACE 0x40 /* ro: map is a vmspace */ #define VM_MAP_PINSYSCALL_ONCE 0x100 /* rw: pinsyscall done */ diff --git a/sys/uvm/uvm_meter.c b/sys/uvm/uvm_meter.c index 3289cdb85..eb3289bdb 100644 --- a/sys/uvm/uvm_meter.c +++ b/sys/uvm/uvm_meter.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_meter.c,v 1.50 2023/09/16 09:33:27 mpi Exp $ */ +/* $OpenBSD: uvm_meter.c,v 1.51 2024/11/26 09:51:30 mpi Exp $ */ /* $NetBSD: uvm_meter.c,v 1.21 2001/07/14 06:36:03 matt Exp $ */ /* @@ -301,9 +301,6 @@ uvmexp_print(int (*pr)(const char *, ...)) (*pr)(" %d VM pages: %d active, %d inactive, %d wired, %d free (%d zero)\n", uexp.npages, uexp.active, uexp.inactive, uexp.wired, uexp.free, uexp.zeropages); - (*pr)(" min %d%% (%d) anon, %d%% (%d) vnode, %d%% (%d) vtext\n", - uexp.anonminpct, uexp.anonmin, uexp.vnodeminpct, - uexp.vnodemin, uexp.vtextminpct, uexp.vtextmin); (*pr)(" freemin=%d, free-target=%d, inactive-target=%d, " "wired-max=%d\n", uexp.freemin, uexp.freetarg, uexp.inactarg, uexp.wiredmax); diff --git a/sys/uvm/uvm_mmap.c b/sys/uvm/uvm_mmap.c index 5a69fa757..52f4aae7a 100644 --- a/sys/uvm/uvm_mmap.c +++ b/sys/uvm/uvm_mmap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_mmap.c,v 1.192 2024/08/21 03:07:45 deraadt Exp $ */ +/* $OpenBSD: uvm_mmap.c,v 1.193 2024/12/14 12:07:38 mvs Exp $ */ /* $NetBSD: uvm_mmap.c,v 1.49 2001/02/18 21:19:08 chs Exp $ */ /* @@ -75,6 +75,11 @@ #include #include +/* + * Locks used to protect data: + * a atomic + */ + int uvm_mmapanon(vm_map_t, vaddr_t *, vsize_t, vm_prot_t, vm_prot_t, int, vsize_t, struct proc *); int uvm_mmapfile(vm_map_t, vaddr_t *, vsize_t, vm_prot_t, vm_prot_t, int, @@ -163,7 +168,7 @@ sys_mquery(struct proc *p, void *v, register_t *retval) return error; } -int uvm_wxabort; +int uvm_wxabort; /* [a] */ /* * W^X violations are only allowed on permitted filesystems. @@ -178,7 +183,7 @@ uvm_wxcheck(struct proc *p, char *call) if (wxallowed && (pr->ps_flags & PS_WXNEEDED)) return 0; - if (uvm_wxabort) { + if (atomic_load_int(&uvm_wxabort)) { KERNEL_LOCK(); /* Report W^X failures */ if (pr->ps_wxcounter++ == 0) diff --git a/sys/uvm/uvm_page.c b/sys/uvm/uvm_page.c index 9bb4b6d07..880353940 100644 --- a/sys/uvm/uvm_page.c +++ b/sys/uvm/uvm_page.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_page.c,v 1.177 2024/05/01 12:54:27 mpi Exp $ */ +/* $OpenBSD: uvm_page.c,v 1.180 2024/12/27 12:04:40 mpi Exp $ */ /* $NetBSD: uvm_page.c,v 1.44 2000/11/27 08:40:04 chs Exp $ */ /* @@ -118,7 +118,7 @@ static vaddr_t virtual_space_end; */ static void uvm_pageinsert(struct vm_page *); static void uvm_pageremove(struct vm_page *); -int uvm_page_owner_locked_p(struct vm_page *); +int uvm_page_owner_locked_p(struct vm_page *, boolean_t); /* * inline functions @@ -279,17 +279,16 @@ uvm_page_init(vaddr_t *kvm_startp, vaddr_t *kvm_endp) mtx_init(&uvm.aiodoned_lock, IPL_BIO); /* - * init reserve thresholds - * XXXCDC - values may need adjusting + * init reserve thresholds. + * + * XXX As long as some disk drivers cannot write any physical + * XXX page, we need DMA reachable reserves for the pagedaemon. + * XXX We cannot enforce such requirement but it should be ok + * XXX in most of the cases because the pmemrange tries hard to + * XXX allocate them last. */ uvmexp.reserve_pagedaemon = 4; - uvmexp.reserve_kernel = 8; - uvmexp.anonminpct = 10; - uvmexp.vnodeminpct = 10; - uvmexp.vtextminpct = 5; - uvmexp.anonmin = uvmexp.anonminpct * 256 / 100; - uvmexp.vnodemin = uvmexp.vnodeminpct * 256 / 100; - uvmexp.vtextmin = uvmexp.vtextminpct * 256 / 100; + uvmexp.reserve_kernel = uvmexp.reserve_pagedaemon + 4; uvm.page_init_done = TRUE; } @@ -701,7 +700,7 @@ uvm_pagealloc_pg(struct vm_page *pg, struct uvm_object *obj, voff_t off, pg->offset = off; pg->uobject = obj; pg->uanon = anon; - KASSERT(uvm_page_owner_locked_p(pg)); + KASSERT(uvm_page_owner_locked_p(pg, TRUE)); if (anon) { anon->an_page = pg; flags |= PQ_ANON; @@ -1041,7 +1040,7 @@ uvm_page_unbusy(struct vm_page **pgs, int npgs) continue; } - KASSERT(uvm_page_owner_locked_p(pg)); + KASSERT(uvm_page_owner_locked_p(pg, TRUE)); KASSERT(pg->pg_flags & PG_BUSY); if (pg->pg_flags & PG_WANTED) { @@ -1073,6 +1072,7 @@ uvm_pagewait(struct vm_page *pg, struct rwlock *lock, const char *wmesg) { KASSERT(rw_lock_held(lock)); KASSERT((pg->pg_flags & PG_BUSY) != 0); + KASSERT(uvm_page_owner_locked_p(pg, FALSE)); atomic_setbits_int(&pg->pg_flags, PG_WANTED); rwsleep_nsec(pg, lock, PVM | PNORELOCK, wmesg, INFSLP); @@ -1226,7 +1226,7 @@ uvm_pagelookup(struct uvm_object *obj, voff_t off) void uvm_pagewire(struct vm_page *pg) { - KASSERT(uvm_page_owner_locked_p(pg)); + KASSERT(uvm_page_owner_locked_p(pg, TRUE)); MUTEX_ASSERT_LOCKED(&uvm.pageqlock); if (pg->wire_count == 0) { @@ -1245,7 +1245,7 @@ uvm_pagewire(struct vm_page *pg) void uvm_pageunwire(struct vm_page *pg) { - KASSERT(uvm_page_owner_locked_p(pg)); + KASSERT(uvm_page_owner_locked_p(pg, TRUE)); MUTEX_ASSERT_LOCKED(&uvm.pageqlock); pg->wire_count--; @@ -1256,7 +1256,7 @@ uvm_pageunwire(struct vm_page *pg) } /* - * uvm_pagedeactivate: deactivate page -- no pmaps have access to page + * uvm_pagedeactivate: deactivate page. * * => caller must lock page queues * => caller must check to make sure page is not wired @@ -1265,9 +1265,11 @@ uvm_pageunwire(struct vm_page *pg) void uvm_pagedeactivate(struct vm_page *pg) { - KASSERT(uvm_page_owner_locked_p(pg)); + KASSERT(uvm_page_owner_locked_p(pg, FALSE)); MUTEX_ASSERT_LOCKED(&uvm.pageqlock); + pmap_page_protect(pg, PROT_NONE); + if (pg->pg_flags & PQ_ACTIVE) { TAILQ_REMOVE(&uvm.page_active, pg, pageq); atomic_clearbits_int(&pg->pg_flags, PQ_ACTIVE); @@ -1299,7 +1301,7 @@ uvm_pagedeactivate(struct vm_page *pg) void uvm_pageactivate(struct vm_page *pg) { - KASSERT(uvm_page_owner_locked_p(pg)); + KASSERT(uvm_page_owner_locked_p(pg, FALSE)); MUTEX_ASSERT_LOCKED(&uvm.pageqlock); uvm_pagedequeue(pg); @@ -1353,12 +1355,14 @@ uvm_pagecopy(struct vm_page *src, struct vm_page *dst) * locked. this is a weak check for runtime assertions only. */ int -uvm_page_owner_locked_p(struct vm_page *pg) +uvm_page_owner_locked_p(struct vm_page *pg, boolean_t exclusive) { if (pg->uobject != NULL) { if (UVM_OBJ_IS_DUMMY(pg->uobject)) return 1; - return rw_write_held(pg->uobject->vmobjlock); + return exclusive + ? rw_write_held(pg->uobject->vmobjlock) + : rw_lock_held(pg->uobject->vmobjlock); } if (pg->uanon != NULL) { return rw_write_held(pg->uanon->an_lock); diff --git a/sys/uvm/uvm_pager.c b/sys/uvm/uvm_pager.c index 76365e751..97c4d5014 100644 --- a/sys/uvm/uvm_pager.c +++ b/sys/uvm/uvm_pager.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_pager.c,v 1.92 2024/07/24 12:18:10 mpi Exp $ */ +/* $OpenBSD: uvm_pager.c,v 1.93 2024/11/25 12:51:00 mpi Exp $ */ /* $NetBSD: uvm_pager.c,v 1.36 2000/11/27 18:26:41 chs Exp $ */ /* @@ -520,7 +520,6 @@ uvm_pager_put(struct uvm_object *uobj, struct vm_page *pg, * now attempt the I/O. if we have a failure and we are * clustered, we will drop the cluster and try again. */ -ReTry: if (uobj) { result = uobj->pgops->pgo_put(uobj, ppsp, *npages, flags); } else { @@ -564,48 +563,34 @@ ReTry: * "swblk" (for transient errors, so we can retry), * or 0 (for hard errors). */ - if (uobj == NULL && pg != NULL) { - /* XXX daddr_t -> int */ - int nswblk = (result == VM_PAGER_AGAIN) ? swblk : 0; - if (pg->pg_flags & PQ_ANON) { - rw_enter(pg->uanon->an_lock, RW_WRITE); - pg->uanon->an_swslot = nswblk; - rw_exit(pg->uanon->an_lock); - } else { - rw_enter(pg->uobject->vmobjlock, RW_WRITE); - uao_set_swslot(pg->uobject, - pg->offset >> PAGE_SHIFT, - nswblk); - rw_exit(pg->uobject->vmobjlock); - } - } - if (result == VM_PAGER_AGAIN) { - /* - * for transient failures, free all the swslots that - * we're not going to retry with. - */ - if (uobj == NULL) { - if (pg) { - /* XXX daddr_t -> int */ - uvm_swap_free(swblk + 1, *npages - 1); + if (uobj == NULL) { + if (pg != NULL) { + if (pg->pg_flags & PQ_ANON) { + rw_enter(pg->uanon->an_lock, RW_WRITE); + pg->uanon->an_swslot = 0; + rw_exit(pg->uanon->an_lock); } else { - /* XXX daddr_t -> int */ - uvm_swap_free(swblk, *npages); + rw_enter(pg->uobject->vmobjlock, RW_WRITE); + uao_set_swslot(pg->uobject, + pg->offset >> PAGE_SHIFT, 0); + rw_exit(pg->uobject->vmobjlock); } } - if (pg) { - ppsp[0] = pg; - *npages = 1; - goto ReTry; - } - } else if (uobj == NULL) { /* - * for hard errors on swap-backed pageouts, - * mark the swslots as bad. note that we do not - * free swslots that we mark bad. + * for transient failures, free all the swslots */ - /* XXX daddr_t -> int */ - uvm_swap_markbad(swblk, *npages); + if (result == VM_PAGER_AGAIN) { + /* XXX daddr_t -> int */ + uvm_swap_free(swblk, *npages); + } else { + /* + * for hard errors on swap-backed pageouts, + * mark the swslots as bad. note that we do not + * free swslots that we mark bad. + */ + /* XXX daddr_t -> int */ + uvm_swap_markbad(swblk, *npages); + } } } @@ -614,7 +599,6 @@ ReTry: * was one). give up! the caller only has one page ("pg") * to worry about. */ - return result; } diff --git a/sys/uvm/uvm_pdaemon.c b/sys/uvm/uvm_pdaemon.c index 2fa388ed8..13e920daa 100644 --- a/sys/uvm/uvm_pdaemon.c +++ b/sys/uvm/uvm_pdaemon.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_pdaemon.c,v 1.117 2024/10/02 10:36:33 mpi Exp $ */ +/* $OpenBSD: uvm_pdaemon.c,v 1.133 2024/12/27 12:04:40 mpi Exp $ */ /* $NetBSD: uvm_pdaemon.c,v 1.23 2000/08/20 10:24:14 bjh21 Exp $ */ /* @@ -102,9 +102,9 @@ extern unsigned long drmbackoff(long); */ struct rwlock *uvmpd_trylockowner(struct vm_page *); -void uvmpd_scan(struct uvm_pmalloc *, struct uvm_constraint_range *); -int uvmpd_scan_inactive(struct uvm_pmalloc *, - struct uvm_constraint_range *); +void uvmpd_scan(struct uvm_pmalloc *, int, int); +int uvmpd_scan_inactive(struct uvm_pmalloc *, int); +void uvmpd_scan_active(struct uvm_pmalloc *, int, int); void uvmpd_tune(void); void uvmpd_drop(struct pglist *); int uvmpd_dropswap(struct vm_page *); @@ -131,7 +131,7 @@ uvm_wait(const char *wmsg) */ if (curproc == uvm.pagedaemon_proc) { printf("uvm_wait emergency bufbackoff\n"); - if (bufbackoff(NULL, 4) == 0) + if (bufbackoff(NULL, 4) >= 4) return; /* * now we have a problem: the pagedaemon wants to go to @@ -195,7 +195,15 @@ uvmpd_tune(void) * recover at least some memory in the most restricted region (assumed * to be dma_constraint). */ -volatile int uvm_nowait_failed; +struct uvm_pmalloc nowait_pma; + +static inline int +uvmpd_pma_done(struct uvm_pmalloc *pma) +{ + if (pma == NULL || (pma->pm_flags & UVM_PMA_FREED)) + return 1; + return 0; +} /* * uvm_pageout: the main loop for the pagedaemon @@ -205,18 +213,26 @@ uvm_pageout(void *arg) { struct uvm_constraint_range constraint; struct uvm_pmalloc *pma; - int free; + int shortage, inactive_shortage; /* ensure correct priority and set paging parameters... */ uvm.pagedaemon_proc = curproc; (void) spl0(); uvmpd_tune(); + /* + * XXX realistically, this is what our nowait callers probably + * care about. + */ + nowait_pma.pm_constraint = dma_constraint; + nowait_pma.pm_size = (16 << PAGE_SHIFT); /* XXX */ + nowait_pma.pm_flags = 0; + for (;;) { long size; uvm_lock_fpageq(); - if (!uvm_nowait_failed && TAILQ_EMPTY(&uvm.pmr_control.allocs)) { + if (TAILQ_EMPTY(&uvm.pmr_control.allocs) || uvmexp.paging > 0) { msleep_nsec(&uvm.pagedaemon, &uvm.fpageqlock, PVM, "pgdaemon", INFSLP); uvmexp.pdwoke++; @@ -226,17 +242,11 @@ uvm_pageout(void *arg) pma->pm_flags |= UVM_PMA_BUSY; constraint = pma->pm_constraint; } else { - if (uvm_nowait_failed) { - /* - * XXX realistically, this is what our - * nowait callers probably care about - */ - constraint = dma_constraint; - uvm_nowait_failed = 0; - } else - constraint = no_constraint; + constraint = no_constraint; } - free = uvmexp.free - BUFPAGES_DEFICIT; + /* How many pages do we need to free during this round? */ + shortage = uvmexp.freetarg - + (uvmexp.free + uvmexp.paging) + BUFPAGES_DEFICIT; uvm_unlock_fpageq(); /* @@ -247,31 +257,45 @@ uvm_pageout(void *arg) if (uvmexp.inactarg <= uvmexp.freetarg) { uvmexp.inactarg = uvmexp.freetarg + 1; } + inactive_shortage = + uvmexp.inactarg - uvmexp.inactive - BUFPAGES_INACT; uvm_unlock_pageq(); - /* Reclaim pages from the buffer cache if possible. */ size = 0; if (pma != NULL) size += pma->pm_size >> PAGE_SHIFT; - if (free < uvmexp.freetarg) - size += uvmexp.freetarg - free; - if (size == 0) - size = 16; /* XXX */ + if (shortage > 0) + size += shortage; - (void) bufbackoff(&constraint, size * 2); + if (size == 0) { + /* + * Since the inactive target just got updated + * above, both `size' and `inactive_shortage' can + * be 0. + */ + if (inactive_shortage) { + uvm_lock_pageq(); + uvmpd_scan_active(NULL, 0, inactive_shortage); + uvm_unlock_pageq(); + } + continue; + } + + /* Reclaim pages from the buffer cache if possible. */ + shortage -= bufbackoff(&constraint, size * 2); #if NDRM > 0 - drmbackoff(size * 2); + shortage -= drmbackoff(size * 2); #endif - uvm_pmr_cache_drain(); + if (shortage > 0) + shortage -= uvm_pmr_cache_drain(); /* * scan if needed */ uvm_lock_pageq(); - free = uvmexp.free - BUFPAGES_DEFICIT; - if (pma != NULL || (free < uvmexp.freetarg) || - ((uvmexp.inactive + BUFPAGES_INACT) < uvmexp.inactarg)) { - uvmpd_scan(pma, &constraint); + if (!uvmpd_pma_done(pma) || + (shortage > 0) || (inactive_shortage > 0)) { + uvmpd_scan(pma, shortage, inactive_shortage); } /* @@ -279,8 +303,7 @@ uvm_pageout(void *arg) * wake up any waiters. */ uvm_lock_fpageq(); - if (uvmexp.free > uvmexp.reserve_kernel || - uvmexp.paging == 0) { + if (uvmexp.free > uvmexp.reserve_kernel || uvmexp.paging == 0) { wakeup(&uvmexp.free); } @@ -293,8 +316,7 @@ uvm_pageout(void *arg) pma->pm_flags &= ~UVM_PMA_BUSY; if (pma->pm_flags & UVM_PMA_FREED) { pma->pm_flags &= ~UVM_PMA_LINKED; - TAILQ_REMOVE(&uvm.pmr_control.allocs, pma, - pmq); + TAILQ_REMOVE(&uvm.pmr_control.allocs, pma, pmq); wakeup(pma); } } @@ -317,10 +339,11 @@ uvm_pageout(void *arg) void uvm_aiodone_daemon(void *arg) { - int s, free; + int s, npages; struct buf *bp, *nbp; uvm.aiodoned_proc = curproc; + KERNEL_UNLOCK(); for (;;) { /* @@ -336,10 +359,11 @@ uvm_aiodone_daemon(void *arg) mtx_leave(&uvm.aiodoned_lock); /* process each i/o that's done. */ - free = uvmexp.free; + npages = 0; + KERNEL_LOCK(); while (bp != NULL) { if (bp->b_flags & B_PDAEMON) { - uvmexp.paging -= bp->b_bufsize >> PAGE_SHIFT; + npages += bp->b_bufsize >> PAGE_SHIFT; } nbp = TAILQ_NEXT(bp, b_freelist); s = splbio(); /* b_iodone must by called at splbio */ @@ -349,8 +373,11 @@ uvm_aiodone_daemon(void *arg) sched_pause(yield); } + KERNEL_UNLOCK(); + uvm_lock_fpageq(); - wakeup(free <= uvmexp.reserve_kernel ? &uvm.pagedaemon : + atomic_sub_int(&uvmexp.paging, npages); + wakeup(uvmexp.free <= uvmexp.reserve_kernel ? &uvm.pagedaemon : &uvmexp.free); uvm_unlock_fpageq(); } @@ -409,6 +436,23 @@ uvmpd_dropswap(struct vm_page *pg) return result; } +/* + * Return 1 if the page `p' belongs to the memory range described by + * 'constraint', 0 otherwise. + */ +static inline int +uvmpd_match_constraint(struct vm_page *p, + struct uvm_constraint_range *constraint) +{ + paddr_t paddr; + + paddr = atop(VM_PAGE_TO_PHYS(p)); + if (paddr >= constraint->ucr_low && paddr < constraint->ucr_high) + return 1; + + return 0; +} + /* * uvmpd_scan_inactive: scan an inactive list for pages to clean or free. * @@ -419,11 +463,10 @@ uvmpd_dropswap(struct vm_page *pg) * => we return TRUE if we are exiting because we met our target */ int -uvmpd_scan_inactive(struct uvm_pmalloc *pma, - struct uvm_constraint_range *constraint) +uvmpd_scan_inactive(struct uvm_pmalloc *pma, int shortage) { struct pglist *pglst = &uvm.page_inactive; - int free, result, freed = 0; + int result, freed = 0; struct vm_page *p, *nextpg; struct uvm_object *uobj; struct vm_page *pps[SWCLUSTPAGES], **ppsp; @@ -436,7 +479,6 @@ uvmpd_scan_inactive(struct uvm_pmalloc *pma, boolean_t swap_backed; vaddr_t start; int dirtyreacts; - paddr_t paddr; /* * swslot is non-zero if we are building a swap cluster. we want @@ -448,11 +490,14 @@ uvmpd_scan_inactive(struct uvm_pmalloc *pma, dirtyreacts = 0; p = NULL; - /* Start with the first page on the list that fit in `constraint' */ + /* + * If a thread is waiting for us to release memory from a specific + * memory range start with the first page on the list that fits in + * it. + */ TAILQ_FOREACH(p, pglst, pageq) { - paddr = atop(VM_PAGE_TO_PHYS(p)); - if (paddr >= constraint->ucr_low && - paddr < constraint->ucr_high) + if (uvmpd_pma_done(pma) || + uvmpd_match_constraint(p, &pma->pm_constraint)) break; } @@ -467,9 +512,8 @@ uvmpd_scan_inactive(struct uvm_pmalloc *pma, /* * see if we've met our target */ - free = uvmexp.free - BUFPAGES_DEFICIT; - if (((pma == NULL || (pma->pm_flags & UVM_PMA_FREED)) && - (free + uvmexp.paging >= uvmexp.freetarg)) || + if ((uvmpd_pma_done(pma) && + (uvmexp.paging >= (shortage - freed))) || dirtyreacts == UVMPD_NUMDIRTYREACTS) { if (swslot == 0) { /* exit now if no swap-i/o pending */ @@ -488,6 +532,16 @@ uvmpd_scan_inactive(struct uvm_pmalloc *pma, uvmexp.pdscans++; nextpg = TAILQ_NEXT(p, pageq); + /* + * If we are not short on memory and only interested + * in releasing pages from a given memory range, do not + * bother with other pages. + */ + if (uvmexp.paging >= (shortage - freed) && + !uvmpd_pma_done(pma) && + !uvmpd_match_constraint(p, &pma->pm_constraint)) + continue; + anon = p->uanon; uobj = p->uobject; @@ -565,8 +619,8 @@ uvmpd_scan_inactive(struct uvm_pmalloc *pma, * this page is dirty, skip it if we'll have met our * free target when all the current pageouts complete. */ - if ((pma == NULL || (pma->pm_flags & UVM_PMA_FREED)) && - (free + uvmexp.paging > uvmexp.freetarg)) { + if (uvmpd_pma_done(pma) && + (uvmexp.paging > (shortage - freed))) { rw_exit(slock); continue; } @@ -727,7 +781,7 @@ uvmpd_scan_inactive(struct uvm_pmalloc *pma, */ if (result == VM_PAGER_PEND) { - uvmexp.paging += npages; + atomic_add_int(&uvmexp.paging, npages); uvm_lock_pageq(); uvmexp.pdpending++; if (p) { @@ -810,8 +864,6 @@ uvmpd_scan_inactive(struct uvm_pmalloc *pma, if (result != VM_PAGER_AGAIN) uvm_pageactivate(p); pmap_clear_reference(p); - /* XXXCDC: if (swap_backed) FREE p's - * swap block? */ } else { /* pageout was a success... */ pmap_clear_reference(p); @@ -858,31 +910,24 @@ uvmpd_scan_inactive(struct uvm_pmalloc *pma, */ void -uvmpd_scan(struct uvm_pmalloc *pma, struct uvm_constraint_range *constraint) +uvmpd_scan(struct uvm_pmalloc *pma, int shortage, int inactive_shortage) { - int free, inactive_shortage, swap_shortage, pages_freed; - struct vm_page *p, *nextpg; - struct rwlock *slock; - paddr_t paddr; + int swap_shortage, pages_freed; MUTEX_ASSERT_LOCKED(&uvm.pageqlock); uvmexp.pdrevs++; /* counter */ - /* - * get current "free" page count - */ - free = uvmexp.free - BUFPAGES_DEFICIT; #ifdef __HAVE_PMAP_COLLECT /* * swap out some processes if we are below our free target. * we need to unlock the page queues for this. */ - if (free < uvmexp.freetarg) { + if (shortage > 0) { uvmexp.pdswout++; uvm_unlock_pageq(); - uvm_swapout_threads(); + shortage -= uvm_swapout_threads(); uvm_lock_pageq(); } #endif @@ -893,26 +938,35 @@ uvmpd_scan(struct uvm_pmalloc *pma, struct uvm_constraint_range *constraint) * we work on meeting our inactive target by converting active pages * to inactive ones. */ - pages_freed = uvmpd_scan_inactive(pma, constraint); + pages_freed = uvmpd_scan_inactive(pma, shortage); uvmexp.pdfreed += pages_freed; + shortage -= pages_freed; /* * we have done the scan to get free pages. now we work on meeting * our inactive target. - */ - inactive_shortage = uvmexp.inactarg - uvmexp.inactive - BUFPAGES_INACT; - - /* + * * detect if we're not going to be able to page anything out * until we free some swap resources from active pages. */ - free = uvmexp.free - BUFPAGES_DEFICIT; swap_shortage = 0; - if (free < uvmexp.freetarg && uvm_swapisfilled() && !uvm_swapisfull() && + if ((shortage > 0) && uvm_swapisfilled() && !uvm_swapisfull() && pages_freed == 0) { - swap_shortage = uvmexp.freetarg - free; + swap_shortage = shortage; } + uvmpd_scan_active(pma, swap_shortage, inactive_shortage); +} + +void +uvmpd_scan_active(struct uvm_pmalloc *pma, int swap_shortage, + int inactive_shortage) +{ + struct vm_page *p, *nextpg; + struct rwlock *slock; + + MUTEX_ASSERT_LOCKED(&uvm.pageqlock); + for (p = TAILQ_FIRST(&uvm.page_active); p != NULL && (inactive_shortage > 0 || swap_shortage > 0); p = nextpg) { @@ -922,11 +976,16 @@ uvmpd_scan(struct uvm_pmalloc *pma, struct uvm_constraint_range *constraint) } /* - * skip this page if it doesn't match the constraint. + * If we couldn't release enough pages from a given memory + * range try to deactivate them first... + * + * ...unless we are low on swap slots, in such case we are + * probably OOM and want to release swap resources as quickly + * as possible. */ - paddr = atop(VM_PAGE_TO_PHYS(p)); - if (paddr < constraint->ucr_low && - paddr >= constraint->ucr_high) + if (inactive_shortage > 0 && swap_shortage == 0 && + !uvmpd_pma_done(pma) && + !uvmpd_match_constraint(p, &pma->pm_constraint)) continue; /* @@ -961,7 +1020,6 @@ uvmpd_scan(struct uvm_pmalloc *pma, struct uvm_constraint_range *constraint) * inactive pages. */ if (inactive_shortage > 0) { - pmap_page_protect(p, PROT_NONE); /* no need to check wire_count as pg is "active" */ uvm_pagedeactivate(p); uvmexp.pddeact++; diff --git a/sys/uvm/uvm_pmemrange.c b/sys/uvm/uvm_pmemrange.c index c91392630..e9189cddf 100644 --- a/sys/uvm/uvm_pmemrange.c +++ b/sys/uvm/uvm_pmemrange.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_pmemrange.c,v 1.68 2024/10/02 10:17:28 mpi Exp $ */ +/* $OpenBSD: uvm_pmemrange.c,v 1.76 2024/11/08 15:54:33 mpi Exp $ */ /* * Copyright (c) 2024 Martin Pieuchot @@ -81,6 +81,19 @@ int uvm_pmr_pg_to_memtype(struct vm_page *); void uvm_pmr_print(void); #endif +static inline int +in_pagedaemon(int allowsyncer) +{ + if (curcpu()->ci_idepth > 0) + return 0; + if (curproc == uvm.pagedaemon_proc) + return 1; + /* XXX why is the syncer allowed to use the pagedaemon's reserve? */ + if (allowsyncer && (curproc == syncerproc)) + return 1; + return 0; +} + /* * Memory types. The page flags are used to derive what the current memory * type of a page is. @@ -821,13 +834,6 @@ uvm_pmr_extract_range(struct uvm_pmemrange *pmr, struct vm_page *pg, return (after_sz > 0 ? after : NULL); } -/* - * Indicate to the page daemon that a nowait call failed and it should - * recover at least some memory in the most restricted region (assumed - * to be dma_constraint). - */ -extern volatile int uvm_nowait_failed; - /* * Acquire a number of pages. * @@ -940,9 +946,8 @@ uvm_pmr_getpages(psize_t count, paddr_t start, paddr_t end, paddr_t align, */ desperate = 0; -again: uvm_lock_fpageq(); - +retry: /* Return point after sleeping. */ /* * check to see if we need to generate some free pages waking * the pagedaemon. @@ -967,16 +972,16 @@ again: } if ((uvmexp.free <= (uvmexp.reserve_pagedaemon + count)) && - (curproc != uvm.pagedaemon_proc) && (curproc != syncerproc)) { - uvm_unlock_fpageq(); + !in_pagedaemon(1)) { + uvm_unlock_fpageq(); if (flags & UVM_PLA_WAITOK) { uvm_wait("uvm_pmr_getpages"); - goto again; + uvm_lock_fpageq(); + goto retry; } return ENOMEM; } -retry: /* Return point after sleeping. */ fcount = 0; fnsegs = 0; @@ -1176,9 +1181,12 @@ fail: flags & UVM_PLA_FAILOK) == 0) goto retry; KASSERT(flags & UVM_PLA_FAILOK); - } else { - if (!(flags & UVM_PLA_NOWAKE)) { - uvm_nowait_failed = 1; + } else if (!(flags & UVM_PLA_NOWAKE)) { + struct uvm_pmalloc *pma = &nowait_pma; + + if (!(nowait_pma.pm_flags & UVM_PMA_LINKED)) { + nowait_pma.pm_flags = UVM_PMA_LINKED; + TAILQ_INSERT_TAIL(&uvm.pmr_control.allocs, pma, pmq); wakeup(&uvm.pagedaemon); } } @@ -2095,6 +2103,8 @@ uvm_wait_pla(paddr_t low, paddr_t high, paddr_t size, int failok) struct uvm_pmalloc pma; const char *wmsg = "pmrwait"; + KASSERT(curcpu()->ci_idepth == 0); + if (curproc == uvm.pagedaemon_proc) { /* * This is not that uncommon when the pagedaemon is trying @@ -2104,7 +2114,7 @@ uvm_wait_pla(paddr_t low, paddr_t high, paddr_t size, int failok) * easily use up that reserve in a single scan iteration. */ uvm_unlock_fpageq(); - if (bufbackoff(NULL, atop(size)) == 0) { + if (bufbackoff(NULL, atop(size)) >= atop(size)) { uvm_lock_fpageq(); return 0; } diff --git a/sys/uvm/uvm_pmemrange.h b/sys/uvm/uvm_pmemrange.h index 3a06d60c4..ea7286513 100644 --- a/sys/uvm/uvm_pmemrange.h +++ b/sys/uvm/uvm_pmemrange.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_pmemrange.h,v 1.18 2024/10/02 10:17:28 mpi Exp $ */ +/* $OpenBSD: uvm_pmemrange.h,v 1.19 2024/11/07 11:12:46 mpi Exp $ */ /* * Copyright (c) 2009 Ariane van der Steldt @@ -59,9 +59,15 @@ struct uvm_pmemrange { /* * Description of failing memory allocation. * - * Two ways new pages can become available: - * [1] page daemon drops them (we notice because they are freed) - * [2] a process calls free + * Every descriptor corresponds to a request for the page daemon to release + * pages in a given memory range. There is one global descriptor for nowait + * allocations, all others are sitting on the stack of processes waiting for + * physical pages. + * + * There are multiple ways physical pages can become available: + * [1] unmanaged pages are released by shrinkers (bufbackoff(), drmbackoff()...) + * [2] page daemon drops them (we notice because they are freed) + * [3] a process calls free or exit * * The buffer cache and page daemon can decide that they don't have the * ability to make pages available in the requested range. In that case, @@ -70,22 +76,26 @@ struct uvm_pmemrange { * XXX has not yet been freed, or that a page was busy. * XXX Also, wired pages are not considered for paging, so they could * XXX cause a failure that may be recoverable. + * + * Locks used to protect struct members in this file: + * F uvm_lock_fpageq + * I immutable after creation */ struct uvm_pmalloc { - TAILQ_ENTRY(uvm_pmalloc) pmq; - - /* - * Allocation request parameters. - */ - struct uvm_constraint_range pm_constraint; - psize_t pm_size; - - /* - * State flags. - */ - int pm_flags; + TAILQ_ENTRY(uvm_pmalloc) pmq; /* [F] next request */ + struct uvm_constraint_range pm_constraint; /* [I] memory range */ + psize_t pm_size; /* [I] # pages */ + int pm_flags; /* [F] states flags */ }; +/* + * Indicate to the page daemon that a nowait call failed and it should + * recover at least some memory in the most restricted region (assumed + * to be dma_constraint). + */ +extern struct uvm_pmalloc nowait_pma; /* [F] */ + + /* * uvm_pmalloc flags. */ diff --git a/sys/uvm/uvm_swap.c b/sys/uvm/uvm_swap.c index 90d8f23e6..0bafd5844 100644 --- a/sys/uvm/uvm_swap.c +++ b/sys/uvm/uvm_swap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_swap.c,v 1.171 2024/09/04 07:54:53 mglocker Exp $ */ +/* $OpenBSD: uvm_swap.c,v 1.173 2024/11/07 09:04:55 jsg Exp $ */ /* $NetBSD: uvm_swap.c,v 1.40 2000/11/17 11:39:39 mrg Exp $ */ /* @@ -1007,7 +1007,7 @@ swap_on(struct proc *p, struct swapdev *sdp) * Lock down the last region of primary disk swap, in case * hibernate needs to place a signature there. */ - if (dev == swdevt[0].sw_dev && vp->v_type == VBLK && size > 3 ) { + if (dev == swdevt[0] && vp->v_type == VBLK && size > 3 ) { if (blist_fill(sdp->swd_blist, npages - 1, 1) != 1) panic("hibernate reserve"); } @@ -1624,7 +1624,7 @@ uvm_swap_free(int startslot, int nslots) key = SWD_KEY(sdp, startslot + i); if (key->refcount != 0) - SWAP_KEY_PUT(sdp, key); + swap_key_put(key); } /* Mark range as not decrypt */ @@ -1813,7 +1813,7 @@ uvm_swap_io(struct vm_page **pps, int startslot, int npages, int flags) if (encrypt) { key = SWD_KEY(sdp, startslot + i); - SWAP_KEY_GET(sdp, key); /* add reference */ + swap_key_get(key); /* add reference */ swap_encrypt(key, src, dst, block, PAGE_SIZE); block += btodb(PAGE_SIZE); @@ -1964,7 +1964,7 @@ swapmount(void) struct swapdev *sdp; struct swappri *spp; struct vnode *vp; - dev_t swap_dev = swdevt[0].sw_dev; + dev_t swap_dev = swdevt[0]; char *nam; char path[MNAMELEN + 1]; @@ -2037,7 +2037,7 @@ uvm_hibswap(dev_t dev, u_long *sp, u_long *ep) struct swappri *spp; /* no swap devices configured yet? */ - if (uvmexp.nswapdev < 1 || dev != swdevt[0].sw_dev) + if (uvmexp.nswapdev < 1 || dev != swdevt[0]) return (1); LIST_FOREACH(spp, &swap_priority, spi_swappri) { diff --git a/sys/uvm/uvm_swap_encrypt.h b/sys/uvm/uvm_swap_encrypt.h index 354461339..bb39d18ea 100644 --- a/sys/uvm/uvm_swap_encrypt.h +++ b/sys/uvm/uvm_swap_encrypt.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_swap_encrypt.h,v 1.12 2024/05/28 12:31:24 jsg Exp $ */ +/* $OpenBSD: uvm_swap_encrypt.h,v 1.14 2024/11/07 09:04:55 jsg Exp $ */ /* * Copyright 1999 Niels Provos @@ -44,7 +44,6 @@ { "keysdeleted", CTLTYPE_INT }, \ } -#define SWAP_KEY_EXPIRE (120 /*60 * 60*/) /* time after that keys expire */ #define SWAP_KEY_SIZE 4 /* 128-bit keys */ struct swap_key { @@ -61,23 +60,25 @@ void swap_decrypt(struct swap_key *,caddr_t, caddr_t, u_int64_t, size_t); void swap_key_cleanup(struct swap_key *); void swap_key_prepare(struct swap_key *, int); -#define SWAP_KEY_GET(s,x) do { \ - if ((x)->refcount == 0) { \ - swap_key_create(x); \ - } \ - (x)->refcount++; \ - } while(0); - -#define SWAP_KEY_PUT(s,x) do { \ - (x)->refcount--; \ - if ((x)->refcount == 0) { \ - swap_key_delete(x); \ - } \ - } while(0); - void swap_key_create(struct swap_key *); void swap_key_delete(struct swap_key *); +static inline void +swap_key_get(struct swap_key *key) +{ + if (key->refcount == 0) + swap_key_create(key); + key->refcount++; +} + +static inline void +swap_key_put(struct swap_key *key) +{ + key->refcount--; + if (key->refcount == 0) + swap_key_delete(key); +} + extern int uvm_doswapencrypt; /* swapencrypt enabled/disabled */ extern int swap_encrypt_initialized; diff --git a/sys/uvm/uvm_vnode.c b/sys/uvm/uvm_vnode.c index 61124c821..4365d7a8f 100644 --- a/sys/uvm/uvm_vnode.c +++ b/sys/uvm/uvm_vnode.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_vnode.c,v 1.133 2024/07/24 12:16:21 mpi Exp $ */ +/* $OpenBSD: uvm_vnode.c,v 1.138 2024/12/27 12:04:40 mpi Exp $ */ /* $NetBSD: uvm_vnode.c,v 1.36 2000/11/24 20:34:01 chs Exp $ */ /* @@ -306,15 +306,14 @@ uvn_detach(struct uvm_object *uobj) struct vnode *vp; int oldflags; - KERNEL_LOCK(); rw_enter(uobj->vmobjlock, RW_WRITE); uobj->uo_refs--; /* drop ref! */ if (uobj->uo_refs) { /* still more refs */ rw_exit(uobj->vmobjlock); - KERNEL_UNLOCK(); return; } + KERNEL_LOCK(); /* get other pointers ... */ uvn = (struct uvm_vnode *) uobj; vp = uvn->u_vnode; @@ -684,7 +683,6 @@ uvn_flush(struct uvm_object *uobj, voff_t start, voff_t stop, int flags) if (!needs_clean) { if (flags & PGO_DEACTIVATE) { if (pp->wire_count == 0) { - pmap_page_protect(pp, PROT_NONE); uvm_pagedeactivate(pp); } } else if (flags & PGO_FREE) { @@ -810,7 +808,6 @@ ReTry: /* dispose of page */ if (flags & PGO_DEACTIVATE) { if (ptmp->wire_count == 0) { - pmap_page_protect(ptmp, PROT_NONE); uvm_pagedeactivate(ptmp); } } else if (flags & PGO_FREE && @@ -951,8 +948,9 @@ uvn_get(struct uvm_object *uobj, voff_t offset, struct vm_page **pps, int lcv, result, gotpages; boolean_t done; - KASSERT(((flags & PGO_LOCKED) != 0 && rw_lock_held(uobj->vmobjlock)) || - (flags & PGO_LOCKED) == 0); + KASSERT(rw_lock_held(uobj->vmobjlock)); + KASSERT(rw_write_held(uobj->vmobjlock) || + ((flags & PGO_LOCKED) != 0 && (access_type & PROT_WRITE) == 0)); /* step 1: handled the case where fault data structures are locked. */ if (flags & PGO_LOCKED) { @@ -971,7 +969,6 @@ uvn_get(struct uvm_object *uobj, voff_t offset, struct vm_page **pps, for (lcv = 0, current_offset = offset ; lcv < *npagesp ; lcv++, current_offset += PAGE_SIZE) { - /* do we care about this page? if not, skip it */ if (pps[lcv] == PGO_DONTCARE) continue; @@ -979,12 +976,14 @@ uvn_get(struct uvm_object *uobj, voff_t offset, struct vm_page **pps, /* lookup page */ ptmp = uvm_pagelookup(uobj, current_offset); - /* to be useful must get a non-busy, non-released pg */ - if (ptmp == NULL || - (ptmp->pg_flags & PG_BUSY) != 0) { - if (lcv == centeridx || (flags & PGO_ALLPAGES) - != 0) - done = FALSE; /* need to do a wait or I/O! */ + /* + * to be useful must get a non-busy page + */ + if (ptmp == NULL || (ptmp->pg_flags & PG_BUSY) != 0) { + if (lcv == centeridx || + (flags & PGO_ALLPAGES) != 0) + /* need to do a wait or I/O! */ + done = FALSE; continue; } @@ -992,8 +991,6 @@ uvn_get(struct uvm_object *uobj, voff_t offset, struct vm_page **pps, * useful page: busy it and plug it in our * result array */ - atomic_setbits_int(&ptmp->pg_flags, PG_BUSY); - UVM_PAGE_OWN(ptmp, "uvn_get1"); pps[lcv] = ptmp; gotpages++; @@ -1015,12 +1012,8 @@ uvn_get(struct uvm_object *uobj, voff_t offset, struct vm_page **pps, * step 1c: now we've either done everything needed or we to * unlock and do some waiting or I/O. */ - *npagesp = gotpages; /* let caller know */ - if (done) - return VM_PAGER_OK; /* bingo! */ - else - return VM_PAGER_UNLOCK; + return done ? VM_PAGER_OK : VM_PAGER_UNLOCK; } /* diff --git a/sys/uvm/uvmexp.h b/sys/uvm/uvmexp.h index ccd87b302..5b91a88a2 100644 --- a/sys/uvm/uvmexp.h +++ b/sys/uvm/uvmexp.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uvmexp.h,v 1.15 2024/05/01 12:54:27 mpi Exp $ */ +/* $OpenBSD: uvmexp.h,v 1.16 2024/11/25 13:06:25 mpi Exp $ */ #ifndef _UVM_UVMEXP_ #define _UVM_UVMEXP_ @@ -60,7 +60,7 @@ struct uvmexp { int free; /* [F] number of free pages */ int active; /* [L] # of active pages */ int inactive; /* [L] # of pages that we free'd but may want back */ - int paging; /* number of pages in the process of being paged out */ + int paging; /* [a] # of pages in the process of being paged out */ int wired; /* number of wired pages */ int zeropages; /* [F] number of zero'd pages */ diff --git a/usr.bin/at/at.1 b/usr.bin/at/at.1 index 711802226..02e9c2d2e 100644 --- a/usr.bin/at/at.1 +++ b/usr.bin/at/at.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: at.1,v 1.58 2024/07/30 13:58:02 jmc Exp $ +.\" $OpenBSD: at.1,v 1.59 2024/11/05 16:21:13 sobrado Exp $ .\" .\" Copyright (C) 1993, 1994 Thomas Koenig .\" Copyright (C) 1993 David Parsons @@ -24,7 +24,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: July 30 2024 $ +.Dd $Mdocdate: November 5 2024 $ .Dt AT 1 .Os .Sh NAME @@ -400,6 +400,3 @@ and .Nm batch as presently implemented are not suitable when users are competing for resources. -If this is the case consider another batch system, -such as -.Nm nqs . diff --git a/usr.bin/at/at.c b/usr.bin/at/at.c index a3efa9769..f07ad6a33 100644 --- a/usr.bin/at/at.c +++ b/usr.bin/at/at.c @@ -1,4 +1,4 @@ -/* $OpenBSD: at.c,v 1.84 2023/03/08 04:43:10 guenther Exp $ */ +/* $OpenBSD: at.c,v 1.85 2024/11/05 16:26:01 sobrado Exp $ */ /* * at.c : Put file into atrun queue @@ -580,7 +580,7 @@ list_jobs(int argc, char **argv, int count_only, int csort) if (!shortformat) (void)puts(" Rank Execution Date Owner " - "Job Queue"); + "Job Queue"); for (i = 0; i < numjobs; i++) { print_job(atjobs[i], i + 1, shortformat); diff --git a/usr.bin/aucat/abuf.c b/usr.bin/aucat/abuf.c index 8e393e825..c0d6ba32b 100644 --- a/usr.bin/aucat/abuf.c +++ b/usr.bin/aucat/abuf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: abuf.c,v 1.31 2022/12/26 19:16:00 jmc Exp $ */ +/* $OpenBSD: abuf.c,v 1.32 2024/12/22 14:17:45 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov * @@ -22,23 +22,9 @@ * as follows: the write starts filling at offset (start + used), once the data * is ready, the writer adds to used the count of bytes available. */ -#include - #include "abuf.h" #include "utils.h" -#ifdef DEBUG -void -abuf_log(struct abuf *buf) -{ - log_putu(buf->start); - log_puts("+"); - log_putu(buf->used); - log_puts("/"); - log_putu(buf->len); -} -#endif - void abuf_init(struct abuf *buf, unsigned int len) { @@ -52,13 +38,8 @@ void abuf_done(struct abuf *buf) { #ifdef DEBUG - if (buf->used > 0) { - if (log_level >= 3) { - log_puts("deleting non-empty buffer, used = "); - log_putu(buf->used); - log_puts("\n"); - } - } + if (buf->used > 0) + logx(3, "deleting non-empty buffer, used = %d", buf->used); #endif xfree(buf->data); buf->data = (void *)0xdeadbeef; @@ -87,9 +68,7 @@ abuf_rdiscard(struct abuf *buf, int count) { #ifdef DEBUG if (count < 0 || count > buf->used) { - log_puts("abuf_rdiscard: bad count = "); - log_putu(count); - log_puts("\n"); + logx(0, "%s: bad count = %d", __func__, count); panic(); } #endif @@ -107,9 +86,7 @@ abuf_wcommit(struct abuf *buf, int count) { #ifdef DEBUG if (count < 0 || count > (buf->len - buf->used)) { - log_puts("abuf_wcommit: bad count = "); - log_putu(count); - log_puts("\n"); + logx(0, "%s: bad count = %d", __func__, count); panic(); } #endif diff --git a/usr.bin/aucat/abuf.h b/usr.bin/aucat/abuf.h index 0c38b9f46..ac4f0ecd1 100644 --- a/usr.bin/aucat/abuf.h +++ b/usr.bin/aucat/abuf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: abuf.h,v 1.26 2015/01/21 08:43:55 ratchov Exp $ */ +/* $OpenBSD: abuf.h,v 1.27 2024/12/22 14:17:45 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov * @@ -18,15 +18,14 @@ #define ABUF_H struct abuf { - int start; /* offset (frames) where stored data starts */ - int used; /* frames stored in the buffer */ - int len; /* total size of the buffer (frames) */ + int start; /* offset (frames) where stored data starts */ + int used; /* frames stored in the buffer */ + unsigned int len; /* total size of the buffer (frames) */ unsigned char *data; }; void abuf_init(struct abuf *, unsigned int); void abuf_done(struct abuf *); -void abuf_log(struct abuf *); unsigned char *abuf_rgetblk(struct abuf *, int *); unsigned char *abuf_wgetblk(struct abuf *, int *); void abuf_rdiscard(struct abuf *, int); diff --git a/usr.bin/aucat/afile.c b/usr.bin/aucat/afile.c index c4e589fdb..b38a1130b 100644 --- a/usr.bin/aucat/afile.c +++ b/usr.bin/aucat/afile.c @@ -220,13 +220,11 @@ static int afile_readhdr(struct afile *f, void *addr, size_t size) { if (lseek(f->fd, 0, SEEK_SET) == -1) { - log_puts(f->path); - log_puts(": failed to seek to beginning of file\n"); + logx(1, "%s: failed to seek to beginning of file", f->path); return 0; } if (read(f->fd, addr, size) != size) { - log_puts(f->path); - log_puts(": failed to read header\n"); + logx(1, "%s: failed to read header", f->path); return 0; } return 1; @@ -236,13 +234,11 @@ static int afile_writehdr(struct afile *f, void *addr, size_t size) { if (lseek(f->fd, 0, SEEK_SET) == -1) { - log_puts(f->path); - log_puts(": failed to seek back to header\n"); + logx(1, "%s: failed to seek back to header", f->path); return 0; } if (write(f->fd, addr, size) != size) { - log_puts(f->path); - log_puts(": failed to write header\n"); + logx(1, "%s: failed to write header", f->path); return 0; } f->curpos = f->startpos; @@ -253,34 +249,23 @@ static int afile_checkpar(struct afile *f) { if (f->nch == 0 || f->nch > NCHAN_MAX) { - log_puts(f->path); - log_puts(": "); - log_putu(f->nch); - log_puts(": unsupported number of channels\n"); + logx(1, "%s: %u: unsupported number of channels", f->path, f->nch); return 0; } if (f->rate < RATE_MIN || f->rate > RATE_MAX) { - log_puts(f->path); - log_puts(": "); - log_putu(f->rate); - log_puts(": unsupported rate\n"); + logx(1, "%s: %u: unsupported rate", f->path, f->rate); return 0; } if (f->par.bits < BITS_MIN || f->par.bits > BITS_MAX) { - log_puts(f->path); - log_puts(": "); - log_putu(f->par.bits); - log_puts(": unsupported bits per sample\n"); + logx(1, "%s: %u: unsupported bits per sample", f->path, f->par.bits); return 0; } if (f->par.bits > f->par.bps * 8) { - log_puts(f->path); - log_puts(": bits larger than bytes-per-sample\n"); + logx(1, "%s: bits larger than bytes-per-sample", f->path); return 0; } if (f->fmt == AFILE_FMT_FLOAT && f->par.bits != 32) { - log_puts(f->path); - log_puts(": only 32-bit floating points are supported\n"); + logx(1, "%s: only 32-bit floating points are supported", f->path); return 0; } return 1; @@ -293,30 +278,24 @@ afile_wav_readfmt(struct afile *f, unsigned int csize) unsigned int wenc; if (csize < WAV_FMT_SIZE) { - log_puts(f->path); - log_puts(": "); - log_putu(csize); - log_puts(": bogus format chunk size\n"); + logx(1, "%s: %u: bogus format chunk size", f->path, csize); return 0; } if (csize > WAV_FMT_EXT_SIZE) csize = WAV_FMT_EXT_SIZE; if (read(f->fd, &fmt, csize) != csize) { - log_puts(f->path); - log_puts(": failed to read format chunk\n"); + logx(1, "%s: failed to read format chunk", f->path); return 0; } wenc = le16_get(&fmt.fmt); f->par.bits = le16_get(&fmt.bits); if (wenc == WAV_FMT_EXT) { if (csize != WAV_FMT_EXT_SIZE) { - log_puts(f->path); - log_puts(": missing extended format chunk\n"); + logx(1, "%s: missing extended format chunk", f->path); return 0; } if (memcmp(fmt.guid, wav_guid, sizeof(wav_guid)) != 0) { - log_puts(f->path); - log_puts(": unknown format (GUID)\n"); + logx(1, "%s: unknown format (GUID)", f->path); return 0; } f->par.bps = (f->par.bits + 7) / 8; @@ -347,8 +326,7 @@ afile_wav_readfmt(struct afile *f, unsigned int csize) f->fmt = AFILE_FMT_FLOAT; break; default: - log_putu(wenc); - log_puts(": unsupported encoding\n"); + logx(1, "%s: %u: unsupported encoding", f->path, wenc); return 0; } return afile_checkpar(f); @@ -366,20 +344,17 @@ afile_wav_readhdr(struct afile *f) return 0; if (memcmp(&riff.id, &wav_id_riff, 4) != 0 || memcmp(&riff.type, &wav_id_wave, 4) != 0) { - log_puts(f->path); - log_puts(": not a .wav file\n"); + logx(1, "%s: not a .wav file", f->path); return 0; } rsize = le32_get(&riff.size); for (;;) { if (pos + sizeof(struct wav_chunk) > rsize) { - log_puts(f->path); - log_puts(": missing data chunk\n"); + logx(1, "%s: missing data chunk", f->path); return 0; } if (read(f->fd, &chunk, sizeof(chunk)) != sizeof(chunk)) { - log_puts(f->path); - log_puts(": failed to read chunk header\n"); + logx(1, "%s: failed to read chunk header", f->path); return 0; } csize = le32_get(&chunk.size); @@ -394,8 +369,7 @@ afile_wav_readhdr(struct afile *f) } else { #ifdef DEBUG if (log_level >= 2) { - log_puts(f->path); - log_puts(": skipped unknown chunk\n"); + logx(1, "%s: skipped unknown chunk", f->path); } #endif } @@ -405,14 +379,12 @@ afile_wav_readhdr(struct afile *f) */ pos += sizeof(struct wav_chunk) + csize; if (lseek(f->fd, sizeof(riff) + pos, SEEK_SET) == -1) { - log_puts(f->path); - log_puts(": failed to seek to chunk\n"); + logx(1, "%s: failed to seek to chunk", f->path); return 0; } } if (!fmt_done) { - log_puts(f->path); - log_puts(": missing format chunk\n"); + logx(1, "%s: missing format chunk", f->path); return 0; } return 1; @@ -459,23 +431,18 @@ afile_aiff_readcomm(struct afile *f, unsigned int csize, csize_min = comp ? sizeof(struct aiff_comm) : sizeof(struct aiff_commbase); if (csize < csize_min) { - log_puts(f->path); - log_puts(": "); - log_putu(csize); - log_puts(": bogus comm chunk size\n"); + logx(1, "%s: %u: bogus comm chunk size", f->path, csize); return 0; } if (read(f->fd, &comm, csize_min) != csize_min) { - log_puts(f->path); - log_puts(": failed to read comm chunk\n"); + logx(1, "%s: failed to read comm chunk", f->path); return 0; } f->nch = be16_get(&comm.base.nch); e = be16_get(&comm.base.rate_ex); m = be32_get(&comm.base.rate_hi); if (e < 0x3fff || e > 0x3fff + 31) { - log_puts(f->path); - log_puts(": malformed sample rate\n"); + logx(1, "%s: malformed sample rate", f->path); return 0; } f->rate = m >> (0x3fff + 31 - e); @@ -493,8 +460,7 @@ afile_aiff_readcomm(struct afile *f, unsigned int csize, f->fmt = AFILE_FMT_ALAW; f->par.bits = 8; } else { - log_puts(f->path); - log_puts(": unsupported encoding\n"); + logx(1, "%s: unsupported encoding", f->path); return 0; } } else { @@ -515,16 +481,12 @@ afile_aiff_readdata(struct afile *f, unsigned int csize, unsigned int *roffs) struct aiff_data data; if (csize < sizeof(struct aiff_data)) { - log_puts(f->path); - log_puts(": "); - log_putu(csize); - log_puts(": bogus data chunk size\n"); + logx(1, "%s: %u: bogus data chunk size", f->path, csize); return 0; } csize = sizeof(struct aiff_data); if (read(f->fd, &data, csize) != csize) { - log_puts(f->path); - log_puts(": failed to read data chunk\n"); + logx(1, "%s: failed to read data chunk", f->path); return 0; } *roffs = csize + be32_get(&data.offs); @@ -542,8 +504,7 @@ afile_aiff_readhdr(struct afile *f) if (!afile_readhdr(f, &form, sizeof(struct aiff_form))) return 0; if (memcmp(&form.id, &aiff_id_form, 4) != 0) { - log_puts(f->path); - log_puts(": not an aiff file\n"); + logx(1, "%s: not an aiff file", f->path); return 0; } if (memcmp(&form.type, &aiff_id_aiff, 4) == 0) { @@ -551,20 +512,17 @@ afile_aiff_readhdr(struct afile *f) } else if (memcmp(&form.type, &aiff_id_aifc, 4) == 0) comp = 1; else { - log_puts(f->path); - log_puts(": unsupported aiff file sub-type\n"); + logx(1, "%s: unsupported aiff file sub-type", f->path); return 0; } rsize = be32_get(&form.size); for (;;) { if (pos + sizeof(struct aiff_chunk) > rsize) { - log_puts(f->path); - log_puts(": missing data chunk\n"); + logx(1, "%s: missing data chunk", f->path); return 0; } if (read(f->fd, &chunk, sizeof(chunk)) != sizeof(chunk)) { - log_puts(f->path); - log_puts(": failed to read chunk header\n"); + logx(1, "%s: failed to read chunk header", f->path); return 0; } csize = be32_get(&chunk.size); @@ -580,10 +538,7 @@ afile_aiff_readhdr(struct afile *f) break; } else { #ifdef DEBUG - if (log_level >= 2) { - log_puts(f->path); - log_puts(": skipped unknown chunk\n"); - } + logx(2, "%s: skipped unknown chunk", f->path); #endif } @@ -599,14 +554,12 @@ afile_aiff_readhdr(struct afile *f) pos += sizeof(struct aiff_chunk) + csize; if (lseek(f->fd, sizeof(form) + pos, SEEK_SET) == -1) { - log_puts(f->path); - log_puts(": failed to seek to chunk\n"); + logx(1, "%s: failed to seek to chunk", f->path); return 0; } } if (!comm_done) { - log_puts(f->path); - log_puts(": missing comm chunk\n"); + logx(1, "%s: missing comm chunk", f->path); return 0; } f->endpos = f->startpos + f->par.bps * f->nch * nfr; @@ -664,8 +617,7 @@ afile_au_readhdr(struct afile *f) if (!afile_readhdr(f, &hdr, sizeof(struct au_hdr))) return 0; if (memcmp(&hdr.id, &au_id, 4) != 0) { - log_puts(f->path); - log_puts(": not a .au file\n"); + logx(1, "%s: not a .au file", f->path); return 0; } f->startpos = be32_get(&hdr.offs); @@ -701,10 +653,7 @@ afile_au_readhdr(struct afile *f) f->par.bits = 32; break; default: - log_puts(f->path); - log_puts(": "); - log_putu(fmt); - log_puts(": unsupported encoding\n"); + logx(1, "%s: %u: unsupported encoding", f->path, fmt); return 0; } f->par.le = 0; @@ -714,9 +663,7 @@ afile_au_readhdr(struct afile *f) f->rate = be32_get(&hdr.rate); f->nch = be32_get(&hdr.nch); if (lseek(f->fd, f->startpos, SEEK_SET) == -1) { - log_puts(f->path); - log_puts(": "); - log_puts("failed to seek to data chunk\n"); + logx(1, "%s: failed to seek to data chunk", f->path); return 0; } return afile_checkpar(f); @@ -750,8 +697,7 @@ afile_au_writehdr(struct afile *f) break; #ifdef DEBUG default: - log_puts(f->path); - log_puts(": wrong precision\n"); + logx(1, "%s: %u: wrong precision", f->path, f->par.bits); panic(); return 0; #endif @@ -772,10 +718,7 @@ afile_read(struct afile *f, void *data, size_t count) maxread = f->endpos - f->curpos; if (maxread == 0) { #ifdef DEBUG - if (log_level >= 3) { - log_puts(f->path); - log_puts(": end reached\n"); - } + logx(3, "%s: end reached", f->path); #endif return 0; } @@ -784,8 +727,7 @@ afile_read(struct afile *f, void *data, size_t count) } n = read(f->fd, data, count); if (n == -1) { - log_puts(f->path); - log_puts(": couldn't read\n"); + logx(1, "%s: couldn't read", f->path); return 0; } f->curpos += n; @@ -802,10 +744,7 @@ afile_write(struct afile *f, void *data, size_t count) maxwrite = f->maxpos - f->curpos; if (maxwrite == 0) { #ifdef DEBUG - if (log_level >= 3) { - log_puts(f->path); - log_puts(": max file size reached\n"); - } + logx(3, "%s: max file size reached", f->path); #endif return 0; } @@ -814,8 +753,7 @@ afile_write(struct afile *f, void *data, size_t count) } n = write(f->fd, data, count); if (n == -1) { - log_puts(f->path); - log_puts(": couldn't write\n"); + logx(1, "%s: couldn't write", f->path); return 0; } f->curpos += n; @@ -829,8 +767,7 @@ afile_seek(struct afile *f, off_t pos) { pos += f->startpos; if (f->endpos >= 0 && pos > f->endpos && !f->par.sig) { - log_puts(f->path); - log_puts(": attempt to seek outside file boundaries\n"); + logx(1, "%s: attempt to seek outside file boundaries", f->path); return 0; } @@ -839,8 +776,7 @@ afile_seek(struct afile *f, off_t pos) */ if (pos != f->curpos) { if (lseek(f->fd, pos, SEEK_SET) == -1) { - log_puts(f->path); - log_puts(": couldn't seek\n"); + logx(1, "%s: couldn't seek", f->path); return 0; } f->curpos = pos; @@ -902,8 +838,7 @@ afile_open(struct afile *f, char *path, int hdr, int flags, f->path = path; f->fd = open(f->path, O_RDONLY); if (f->fd == -1) { - log_puts(f->path); - log_puts(": failed to open for reading\n"); + logx(1, "%s: failed to open for reading", f->path); return 0; } } @@ -931,8 +866,7 @@ afile_open(struct afile *f, char *path, int hdr, int flags, f->fd = open(f->path, O_WRONLY | O_TRUNC | O_CREAT, 0666); if (f->fd == -1) { - log_puts(f->path); - log_puts(": failed to create file\n"); + logx(1, "%s: failed to create file", f->path); return 0; } } @@ -978,7 +912,7 @@ afile_open(struct afile *f, char *path, int hdr, int flags, f->curpos = f->startpos; } else { #ifdef DEBUG - log_puts("afile_open: wrong flags\n"); + logx(1, "afile_open: 0x%x: wrong flags", flags); panic(); #endif } diff --git a/usr.bin/aucat/aucat.c b/usr.bin/aucat/aucat.c index 145a6d6ce..a4befcd04 100644 --- a/usr.bin/aucat/aucat.c +++ b/usr.bin/aucat/aucat.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -150,7 +151,7 @@ allocbuf(int nfr, int nch, int bps) void *ptr; if (nch < 0 || nch > NCHAN_MAX || bps < 0 || bps > 4) { - log_puts("allocbuf: bogus channels or bytes per sample count\n"); + logx(1, "allocbuf: bogus channels or bytes per sample count\n"); panic(); } fsize = nch * bps; @@ -161,21 +162,64 @@ allocbuf(int nfr, int nch, int bps) return ptr; } -static void -slot_log(struct slot *s) +static size_t +chans_fmt(char *buf, size_t size, int mode, int pmin, int pmax, int rmin, int rmax) { -#ifdef DEBUG - static char *pstates[] = { - "cfg", "ini", "run", "stp" - }; -#endif - log_puts(s->afile.path); -#ifdef DEBUG - if (log_level >= 3) { - log_puts(",pst="); - log_puts(pstates[s->pstate]); + const char *sep = ""; + char *end = buf + size; + char *p = buf; + + if (mode & SIO_PLAY) { + p += snprintf(p, p < end ? end - p : 0, "play %d:%d", pmin, pmax); + sep = ", "; } -#endif + if (mode & SIO_REC) { + p += snprintf(p, p < end ? end - p : 0, "%srec %d:%d", sep, rmin, rmax); + } + + return p - buf; +} + +static size_t +slot_fmt(char *buf, size_t size, struct slot *s) +{ + char enc[ENCMAX]; + char *end = buf + size; + char *p = buf; + + switch (s->afile.fmt) { + case AFILE_FMT_PCM: + aparams_enctostr(&s->afile.par, enc); + break; + case AFILE_FMT_ULAW: + strlcpy(enc, "ulaw", sizeof(enc)); + break; + case AFILE_FMT_ALAW: + strlcpy(enc, "alaw", sizeof(enc)); + break; + case AFILE_FMT_FLOAT: + strlcpy(enc, "f32le", sizeof(enc)); + break; + default: + enc[0] = 0; + } + + p += snprintf(p, p < end ? end - p : 0, + "%s, %uch (%u:%u/%u:%u), %uHz, %s", + s->mode == SIO_PLAY ? "play" : "rec", + s->afile.nch, s->imin, s->imax, s->omin, s->omax, + s->afile.rate, enc); + + if (s->mode == SIO_PLAY) { + if (s->afile.endpos >= 0) { + p += snprintf(p, p < end ? end - p : 0, + ", bytes %lld..%lld", + s->afile.startpos, + s->afile.endpos); + } + p += snprintf(p, p < end ? end - p : 0, ", vol %d", s->vol); + } + return p - buf; } static void @@ -190,8 +234,7 @@ slot_flush(struct slot *s) break; n = afile_write(&s->afile, data, count); if (n == 0) { - slot_log(s); - log_puts(": can't write, disabled\n"); + logx(1, "%s: can't write, disabled", s->afile.path); s->pstate = SLOT_INIT; return; } @@ -212,10 +255,7 @@ slot_fill(struct slot *s) n = afile_read(&s->afile, data, count); if (n == 0) { #ifdef DEBUG - if (log_level >= 3) { - slot_log(s); - log_puts(": eof reached, stopping\n"); - } + logx(3, "%s: eof reached, stopping", s->afile.path); #endif s->pstate = SLOT_STOP; break; @@ -230,6 +270,7 @@ slot_new(char *path, int mode, struct aparams *par, int hdr, int rate, int dup, int vol, long long pos) { struct slot *s, **ps; + char str[64]; s = xmalloc(sizeof(struct slot)); if (!afile_open(&s->afile, path, hdr, @@ -247,49 +288,9 @@ slot_new(char *path, int mode, struct aparams *par, int hdr, s->mode = mode; s->pstate = SLOT_CFG; s->pos = pos; - if (log_level >= 2) { - slot_log(s); - log_puts(": "); - log_puts(s->mode == SIO_PLAY ? "play" : "rec"); - log_puts(", "); - log_putu(s->afile.nch); - log_puts("ch ("); - log_putu(s->imin); - log_puts(":"); - log_putu(s->imax); - log_puts("/"); - log_putu(s->omin); - log_puts(":"); - log_putu(s->omax); - log_puts("), "); - log_putu(s->afile.rate); - log_puts("Hz, "); - switch (s->afile.fmt) { - case AFILE_FMT_PCM: - aparams_log(&s->afile.par); - break; - case AFILE_FMT_ULAW: - log_puts("ulaw"); - break; - case AFILE_FMT_ALAW: - log_puts("alaw"); - break; - case AFILE_FMT_FLOAT: - log_puts("f32le"); - break; - } - if (s->mode == SIO_PLAY && s->afile.endpos >= 0) { - log_puts(", bytes "); - log_puti(s->afile.startpos); - log_puts(".."); - log_puti(s->afile.endpos); - } - if (s->mode == SIO_PLAY) { - log_puts(", vol "); - log_puti(s->vol); - } - log_puts("\n"); - } + + logx(2, "%s: %s", s->afile.path, (slot_fmt(str, sizeof(str), s), str)); + for (ps = &slot_list; *ps != NULL; ps = &(*ps)->next) ; s->next = NULL; @@ -304,8 +305,7 @@ slot_init(struct slot *s) #ifdef DEBUG if (s->pstate != SLOT_CFG) { - slot_log(s); - log_puts(": slot_init: wrong state\n"); + logx(1, "%s: slot_init: wrong state", s->afile.path); panic(); } #endif @@ -319,12 +319,7 @@ slot_init(struct slot *s) bufsz = s->round; abuf_init(&s->buf, bufsz * s->bpf); #ifdef DEBUG - if (log_level >= 3) { - slot_log(s); - log_puts(": allocated "); - log_putu(bufsz); - log_puts(" frame buffer\n"); - } + logx(3, "%s: allocated %u frame buffer", s->afile.path, bufsz); #endif s->convbuf = NULL; @@ -392,10 +387,7 @@ slot_init(struct slot *s) } s->pstate = SLOT_INIT; #ifdef DEBUG - if (log_level >= 3) { - slot_log(s); - log_puts(": chain initialized\n"); - } + logx(3, "%s: chain initialized", s->afile.path); #endif } @@ -404,8 +396,7 @@ slot_start(struct slot *s, long long pos) { #ifdef DEBUG if (s->pstate != SLOT_INIT) { - slot_log(s); - log_puts(": slot_start: wrong state\n"); + logx(1, "%s: slot_start: wrong state", s->afile.path); panic(); } #endif @@ -432,10 +423,7 @@ slot_start(struct slot *s, long long pos) if (s->mode & SIO_PLAY) slot_fill(s); #ifdef DEBUG - if (log_level >= 2) { - slot_log(s); - log_puts(": started\n"); - } + logx(2, "%s: started", s->afile.path); #endif } @@ -450,10 +438,7 @@ slot_stop(struct slot *s) s->buf.used = s->buf.start = 0; s->pstate = SLOT_INIT; #ifdef DEBUG - if (log_level >= 2) { - slot_log(s); - log_puts(": stopped\n"); - } + logx(2, "%s: stopped", s->afile.path); #endif } @@ -466,10 +451,7 @@ slot_del(struct slot *s) slot_stop(s); afile_close(&s->afile); #ifdef DEBUG - if (log_level >= 3) { - slot_log(s); - log_puts(": closed\n"); - } + logx(3, "%s: closed", s->afile.path); #endif abuf_done(&s->buf); if (s->resampbuf) @@ -681,15 +663,14 @@ dev_open(char *dev, int mode, int bufsz, char *port) { int rate, pmax, rmax; struct sio_par par; - char encstr[ENCMAX]; + char enc_str[ENCMAX], chans_str[64]; struct slot *s; if (port) { dev_port = port; dev_mh = mio_open(dev_port, MIO_IN, 0); if (dev_mh == NULL) { - log_puts(port); - log_puts(": couldn't open midi port\n"); + logx(1, "%s: couldn't open midi port", port); return 0; } } else @@ -698,8 +679,7 @@ dev_open(char *dev, int mode, int bufsz, char *port) dev_name = dev; dev_sh = sio_open(dev, mode, 0); if (dev_sh == NULL) { - log_puts(dev_name); - log_puts(": couldn't open audio device\n"); + logx(1, "%s: couldn't open audio device", dev_name); return 0; } @@ -728,8 +708,7 @@ dev_open(char *dev, int mode, int bufsz, char *port) par.rchan = rmax + 1; par.appbufsz = bufsz > 0 ? bufsz : rate * DEFAULT_BUFSZ_MS / 1000; if (!sio_setpar(dev_sh, &par) || !sio_getpar(dev_sh, &par)) { - log_puts(dev_name); - log_puts(": couldn't set audio params\n"); + logx(1, "%s: couldn't set audio params", dev_name); return 0; } dev_par.bits = par.bits; @@ -760,27 +739,11 @@ dev_open(char *dev, int mode, int bufsz, char *port) } } dev_pstate = DEV_STOP; - if (log_level >= 2) { - log_puts(dev_name); - log_puts(": "); - log_putu(dev_rate); - log_puts("Hz, "); - aparams_enctostr(&dev_par, encstr); - log_puts(encstr); - if (dev_mode & SIO_PLAY) { - log_puts(", play 0:"); - log_puti(dev_pchan - 1); - } - if (dev_mode & SIO_REC) { - log_puts(", rec 0:"); - log_puti(dev_rchan - 1); - } - log_puts(", "); - log_putu(dev_bufsz / dev_round); - log_puts(" blocks of "); - log_putu(dev_round); - log_puts(" frames\n"); - } + logx(2, "%s: %uHz, %s, %s, %u blocks of %u frames", dev_name, dev_rate, + (aparams_enctostr(&dev_par, enc_str), enc_str), + (chans_fmt(chans_str, sizeof(chans_str), + dev_mode, 0, dev_pchan - 1, 0, dev_rchan - 1), chans_str), + dev_bufsz / dev_round, dev_round); return 1; } @@ -808,11 +771,7 @@ dev_master(int val) s->vol = ADATA_MUL(mastervol, slotvol); } #ifdef DEBUG - if (log_level >= 3) { - log_puts("master volume set to "); - log_putu(val); - log_puts("\n"); - } + logx(3, "master volume set to %u", val); #endif } @@ -828,12 +787,7 @@ dev_slotvol(int midich, int val) slotvol = MIDI_TO_ADATA(val); s->vol = ADATA_MUL(mastervol, slotvol); #ifdef DEBUG - if (log_level >= 3) { - slot_log(s); - log_puts(": volume set to "); - log_putu(val); - log_puts("\n"); - } + logx(3, "%s: volume set to %u", s->afile.path, val); #endif break; } @@ -855,12 +809,10 @@ dev_mmcstart(void) slot_start(s, dev_pos); dev_prime = (dev_mode & SIO_PLAY) ? dev_bufsz / dev_round : 0; sio_start(dev_sh); - if (log_level >= 2) - log_puts("started\n"); + logx(2, "started"); } else { #ifdef DEBUG - if (log_level >= 3) - log_puts("ignoring mmc start\n"); + logx(3, "ignoring mmc start"); #endif } } @@ -878,12 +830,10 @@ dev_mmcstop(void) for (s = slot_list; s != NULL; s = s->next) slot_stop(s); sio_stop(dev_sh); - if (log_level >= 2) - log_puts("stopped\n"); + logx(2, "stopped"); } else { #ifdef DEBUG - if (log_level >= 3) - log_puts("ignored mmc stop\n"); + logx(3, "ignored mmc stop\n"); #endif } } @@ -904,21 +854,7 @@ dev_mmcloc(int hr, int min, int sec, int fr, int cent, int fps) if (dev_pos == pos) return; dev_pos = pos; - if (log_level >= 2) { - log_puts("relocated to "); - log_putu(hr); - log_puts(":"); - log_putu(min); - log_puts(":"); - log_putu(sec); - log_puts("."); - log_putu(fr); - log_puts("."); - log_putu(cent); - log_puts(" at "); - log_putu(fps); - log_puts("fps\n"); - } + logx(2, "relocated to %u:%u:%u.%u.%u at %u fps", hr, min, sec, fr, cent, fps); if (dev_pstate == DEV_START) { dev_mmcstop(); dev_mmcstart(); @@ -1050,10 +986,7 @@ slot_list_mix(unsigned int round, unsigned int pchan, adata_t *pbuf) continue; if (s->pstate == SLOT_STOP && s->buf.used < s->bpf) { #ifdef DEBUG - if (log_level >= 3) { - slot_log(s); - log_puts(": drained, done\n"); - } + logx(3, "%s: drained, done", s->afile.path); #endif slot_stop(s); continue; @@ -1151,12 +1084,7 @@ playrec_cycle(void) int pcnt, rcnt; #ifdef DEBUG - if (log_level >= 4) { - log_puts(dev_name); - log_puts(": cycle, prime = "); - log_putu(dev_prime); - log_puts("\n"); - } + logx(4, "%s: cycle, prime = %u", dev_name, dev_prime); #endif pcnt = rcnt = 0; if (dev_mode & SIO_REC) { @@ -1168,9 +1096,7 @@ playrec_cycle(void) while (todo > 0) { n = sio_read(dev_sh, p, todo); if (n == 0) { - log_puts(dev_name); - log_puts(": failed to read " - "from device\n"); + logx(1, "%s: failed to read", dev_name); return 0; } p += n; @@ -1196,8 +1122,7 @@ playrec_cycle(void) p = (unsigned char *)dev_pbuf; n = sio_write(dev_sh, p, todo); if (n == 0) { - log_puts(dev_name); - log_puts(": failed to write to device\n"); + logx(1, "%s: failed to write to device", dev_name); return 0; } } @@ -1239,10 +1164,8 @@ playrec(char *dev, int mode, int bufsz, char *port) slot_init(s); if (dev_mh == NULL) dev_mmcstart(); - else { - if (log_level >= 2) - log_puts("ready, waiting for mmc messages\n"); - } + else + logx(2, "ready, waiting for mmc messages"); quit_flag = 0; sigfillset(&sa.sa_mask); @@ -1268,14 +1191,13 @@ playrec(char *dev, int mode, int bufsz, char *port) if (poll(pfds, ns + nm, -1) == -1) { if (errno == EINTR) continue; - log_puts("poll failed\n"); + logx(1, "poll failed"); panic(); } if (dev_pstate == DEV_START) { ev = sio_revents(dev_sh, pfds); if (ev & POLLHUP) { - log_puts(dev); - log_puts(": audio device gone, stopping\n"); + logx(1, "%s: audio device gone, stopping", dev); break; } if (ev & (POLLIN | POLLOUT)) { @@ -1286,8 +1208,7 @@ playrec(char *dev, int mode, int bufsz, char *port) if (dev_mh) { ev = mio_revents(dev_mh, pfds + ns); if (ev & POLLHUP) { - log_puts(dev_port); - log_puts(": midi port gone, stopping\n"); + logx(1, "%s: midi port gone, stopping", dev_port); break; } if (ev & POLLIN) { @@ -1323,8 +1244,7 @@ opt_onoff(char *s, int *flag) *flag = 1; return 1; } - log_puts(s); - log_puts(": on/off expected\n"); + logx(1, "%s: on/off expected", s); return 0; } @@ -1335,8 +1255,7 @@ opt_enc(char *s, struct aparams *par) len = aparams_strtoenc(par, s); if (len == 0 || s[len] != '\0') { - log_puts(s); - log_puts(": bad encoding\n"); + logx(1, "%s: bad encoding", s); return 0; } return 1; @@ -1365,8 +1284,7 @@ opt_hdr(char *s, int *hdr) *hdr = AFILE_HDR_AU; return 1; } - log_puts(s); - log_puts(": bad header type\n"); + logx(1, "%s: bad header type", s); return 0; } @@ -1403,8 +1321,7 @@ opt_map(char *str, int *rimin, int *rimax, int *romin, int *romax) *romax = omax; return 1; failed: - log_puts(str); - log_puts(": channel mapping expected\n"); + logx(1, "%s: channel mapping expected", str); return 0; } @@ -1441,8 +1358,7 @@ opt_nch(char *str, int *rnch, int *roff) *roff = off; return 1; failed: - log_puts(str); - log_puts(": channel count expected\n"); + logx(1, "%s: channel count expected", str); return 0; } @@ -1453,12 +1369,7 @@ opt_num(char *s, int min, int max, int *num) *num = strtonum(s, min, max, &errstr); if (errstr) { - log_puts(s); - log_puts(": expected integer between "); - log_puti(min); - log_puts(" and "); - log_puti(max); - log_puts("\n"); + logx(1, "%s: expected integer between %d and %d", s, min, max); return 0; } return 1; @@ -1471,8 +1382,7 @@ opt_pos(char *s, long long *pos) *pos = strtonum(s, 0, LLONG_MAX, &errstr); if (errstr) { - log_puts(s); - log_puts(": positive number of samples expected\n"); + logx(1, "%s: positive number of samples expected", s); return 0; } return 1; @@ -1599,16 +1509,16 @@ main(int argc, char **argv) argv += optind; if (argc != 0) { bad_usage: - log_puts(usagestr); + logx(1, "%s", usagestr); return 1; } if (n_flag) { if (dev != NULL || port != NULL) { - log_puts("-f and -q make no sense in off-line mode\n"); + logx(1, "-f and -q make no sense in off-line mode"); return 1; } if (mode != (SIO_PLAY | SIO_REC)) { - log_puts("both -i and -o required\n"); + logx(1, "both -i and -o required"); return 1; } if (!offline()) @@ -1617,7 +1527,7 @@ main(int argc, char **argv) if (dev == NULL) dev = SIO_DEVANY; if (mode == 0) { - log_puts("at least -i or -o required\n"); + logx(1, "at least -i or -o required"); return 1; } if (!playrec(dev, mode, bufsz, port)) diff --git a/usr.bin/aucat/dsp.c b/usr.bin/aucat/dsp.c index 96426096c..9ba4bcd43 100644 --- a/usr.bin/aucat/dsp.c +++ b/usr.bin/aucat/dsp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dsp.c,v 1.20 2024/04/22 12:32:51 ratchov Exp $ */ +/* $OpenBSD: dsp.c,v 1.21 2024/12/22 14:17:45 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov * @@ -328,18 +328,6 @@ aparams_init(struct aparams *par) par->msb = 0; } -/* - * log the given format/channels/encoding - */ -void -aparams_log(struct aparams *par) -{ - char enc[ENCMAX]; - - aparams_enctostr(par, enc); - log_puts(enc); -} - /* * return true if encoding corresponds to what we store in adata_t */ @@ -418,15 +406,7 @@ resamp_do(struct resamp *p, adata_t *in, adata_t *out, int icnt, int ocnt) * Start conversion. */ #ifdef DEBUG - if (log_level >= 4) { - log_puts("resamp: copying "); - log_puti(ifr); - log_puts(" -> "); - log_putu(ofr); - log_puts(" frames, diff = "); - log_puti(diff); - log_puts("\n"); - } + logx(4, "resamp: copying %d -> %d frames, diff = %d", ifr, ofr, diff); #endif for (;;) { if (diff >= oblksz) { @@ -493,15 +473,11 @@ resamp_do(struct resamp *p, adata_t *in, adata_t *out, int icnt, int ocnt) p->ctx_start = ctx_start; #ifdef DEBUG if (ifr != 0) { - log_puts("resamp_do: "); - log_puti(ifr); - log_puts(": too many input frames\n"); + logx(0, "resamp_do: %d: too many input frames", ifr); panic(); } if (ofr != 0) { - log_puts("resamp_do: "); - log_puti(ofr); - log_puts(": too many output frames\n"); + logx(0, "resamp_do: %d: too many output frames", ofr); panic(); } #endif @@ -558,13 +534,7 @@ resamp_init(struct resamp *p, unsigned int iblksz, p->filt_step = RESAMP_UNIT / p->iblksz; } #ifdef DEBUG - if (log_level >= 3) { - log_puts("resamp: "); - log_putu(iblksz); - log_puts("/"); - log_putu(oblksz); - log_puts("\n"); - } + logx(3, "resamp_init: %u/%u", iblksz, oblksz); #endif } @@ -586,11 +556,7 @@ enc_do(struct conv *p, unsigned char *in, unsigned char *out, int todo) int osnext; #ifdef DEBUG - if (log_level >= 4) { - log_puts("enc: copying "); - log_putu(todo); - log_puts(" frames\n"); - } + logx(4, "enc: copying %u frames", todo); #endif /* * Partially copy structures into local variables, to avoid @@ -644,11 +610,7 @@ enc_sil_do(struct conv *p, unsigned char *out, int todo) int osnext; #ifdef DEBUG - if (log_level >= 4) { - log_puts("enc: silence "); - log_putu(todo); - log_puts(" frames\n"); - } + logx(4, "enc: silence %u frames", todo); #endif /* * Partially copy structures into local variables, to avoid @@ -683,6 +645,10 @@ enc_sil_do(struct conv *p, unsigned char *out, int todo) void enc_init(struct conv *p, struct aparams *par, int nch) { +#ifdef DEBUG + char enc_str[ENCMAX]; +#endif + p->nch = nch; p->bps = par->bps; if (par->msb) { @@ -705,13 +671,8 @@ enc_init(struct conv *p, struct aparams *par, int nch) p->snext = 0; } #ifdef DEBUG - if (log_level >= 3) { - log_puts("enc: "); - aparams_log(par); - log_puts(", "); - log_puti(p->nch); - log_puts(" channels\n"); - } + logx(3, "enc: %s, %d channels", + (aparams_enctostr(par, enc_str), enc_str), p->nch); #endif } @@ -733,11 +694,7 @@ dec_do(struct conv *p, unsigned char *in, unsigned char *out, int todo) adata_t *odata; #ifdef DEBUG - if (log_level >= 4) { - log_puts("dec: copying "); - log_putu(todo); - log_puts(" frames\n"); - } + logx(4, "dec: copying %u frames", todo); #endif /* * Partially copy structures into local variables, to avoid @@ -816,11 +773,7 @@ dec_do_float(struct conv *p, unsigned char *in, unsigned char *out, int todo) adata_t *odata; #ifdef DEBUG - if (log_level >= 4) { - log_puts("dec_float: copying "); - log_putu(todo); - log_puts(" frames\n"); - } + logx(4, "dec_float: copying %u frames", todo); #endif /* * Partially copy structures into local variables, to avoid @@ -860,11 +813,7 @@ dec_do_ulaw(struct conv *p, unsigned char *in, const short *map; #ifdef DEBUG - if (log_level >= 4) { - log_puts("dec_ulaw: copying "); - log_putu(todo); - log_puts(" frames\n"); - } + logx(4, "dec_ulaw: copying %u frames", todo); #endif map = is_alaw ? dec_alawmap : dec_ulawmap; idata = in; @@ -879,6 +828,10 @@ dec_do_ulaw(struct conv *p, unsigned char *in, void dec_init(struct conv *p, struct aparams *par, int nch) { +#ifdef DEBUG + char enc_str[ENCMAX]; +#endif + p->bps = par->bps; p->nch = nch; if (par->msb) { @@ -901,13 +854,8 @@ dec_init(struct conv *p, struct aparams *par, int nch) p->snext = 0; } #ifdef DEBUG - if (log_level >= 3) { - log_puts("dec: "); - aparams_log(par); - log_puts(", "); - log_puti(p->nch); - log_puts(" channels\n"); - } + logx(3, "dec: %s, %d channels", + (aparams_enctostr(par, enc_str), enc_str), p->nch); #endif } @@ -921,11 +869,7 @@ cmap_add(struct cmap *p, void *in, void *out, int vol, int todo) int i, j, nch, istart, inext, onext, ostart, y, v; #ifdef DEBUG - if (log_level >= 4) { - log_puts("cmap: adding "); - log_puti(todo); - log_puts(" frames\n"); - } + logx(4, "cmap: adding %d frames", todo); #endif idata = in; odata = out; @@ -967,11 +911,7 @@ cmap_copy(struct cmap *p, void *in, void *out, int vol, int todo) int i, j, nch, istart, inext, onext, ostart, v; #ifdef DEBUG - if (log_level >= 4) { - log_puts("cmap: copying "); - log_puti(todo); - log_puts(" frames\n"); - } + logx(4, "cmap: copying %d frames", todo); #endif idata = in; odata = out; @@ -1037,18 +977,7 @@ cmap_init(struct cmap *p, p->inext = imax - isubmax; p->nch = nch; #ifdef DEBUG - if (log_level >= 3) { - log_puts("cmap: nch = "); - log_puti(p->nch); - log_puts(", ostart = "); - log_puti(p->ostart); - log_puts(", onext = "); - log_puti(p->onext); - log_puts(", istart = "); - log_puti(p->istart); - log_puts(", inext = "); - log_puti(p->inext); - log_puts("\n"); - } + logx(3, "%s: nch = %d, ostart = %d, onext = %d, istart = %d, inext = %d", + __func__, p->nch, p->ostart, p->onext, p->istart, p->inext); #endif } diff --git a/usr.bin/aucat/dsp.h b/usr.bin/aucat/dsp.h index 9cc8d0cf2..6cba770aa 100644 --- a/usr.bin/aucat/dsp.h +++ b/usr.bin/aucat/dsp.h @@ -1,4 +1,4 @@ -/* $OpenBSD: dsp.h,v 1.12 2024/04/22 12:32:51 ratchov Exp $ */ +/* $OpenBSD: dsp.h,v 1.13 2024/12/22 14:17:45 ratchov Exp $ */ /* * Copyright (c) 2012 Alexandre Ratchov * @@ -111,7 +111,6 @@ struct cmap { extern const int aparams_ctltovol[128]; void aparams_init(struct aparams *); -void aparams_log(struct aparams *); int aparams_strtoenc(struct aparams *, char *); int aparams_enctostr(struct aparams *, char *); int aparams_native(struct aparams *); diff --git a/usr.bin/aucat/utils.c b/usr.bin/aucat/utils.c index 08471c2c1..7ca2848dc 100644 --- a/usr.bin/aucat/utils.c +++ b/usr.bin/aucat/utils.c @@ -1,4 +1,4 @@ -/* $OpenBSD: utils.c,v 1.6 2019/07/05 07:34:40 ratchov Exp $ */ +/* $OpenBSD: utils.c,v 1.7 2024/12/22 14:17:45 ratchov Exp $ */ /* * Copyright (c) 2003-2012 Alexandre Ratchov * @@ -15,12 +15,16 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* - * log_xxx() routines are used to quickly store traces into a trace buffer. + * logx() quickly stores traces into a trace buffer. * This allows traces to be collected during time sensitive operations without * disturbing them. The buffer can be flushed on standard error later, when * slow syscalls are no longer disruptive, e.g. at the end of the poll() loop. */ +#include #include +#include +#include +#include #include #include #include @@ -32,16 +36,8 @@ */ #define LOG_BUFSZ 8192 -/* - * store a character in the log - */ -#define LOG_PUTC(c) do { \ - if (log_used < LOG_BUFSZ) \ - log_buf[log_used++] = (c); \ -} while (0) - char log_buf[LOG_BUFSZ]; /* buffer where traces are stored */ -unsigned int log_used = 0; /* bytes used in the buffer */ +size_t log_used = 0; /* bytes used in the buffer */ unsigned int log_sync = 1; /* if true, flush after each '\n' */ /* @@ -57,75 +53,29 @@ log_flush(void) } /* - * store a string in the log + * log a single line to stderr */ void -log_puts(char *msg) +log_do(const char *fmt, ...) { - char *p = msg; - int c; + va_list ap; + int n, save_errno = errno; - while ((c = *p++) != '\0') { - LOG_PUTC(c); - if (log_sync && c == '\n') + va_start(ap, fmt); + n = vsnprintf(log_buf + log_used, sizeof(log_buf) - log_used, fmt, ap); + va_end(ap); + + if (n != -1) { + log_used += n; + + if (log_used >= sizeof(log_buf)) + log_used = sizeof(log_buf) - 1; + log_buf[log_used++] = '\n'; + + if (log_sync) log_flush(); } -} - -/* - * store a hex in the log - */ -void -log_putx(unsigned long num) -{ - char dig[sizeof(num) * 2], *p = dig, c; - unsigned int ndig; - - if (num != 0) { - for (ndig = 0; num != 0; ndig++) { - *p++ = num & 0xf; - num >>= 4; - } - for (; ndig != 0; ndig--) { - c = *(--p); - c += (c < 10) ? '0' : 'a' - 10; - LOG_PUTC(c); - } - } else - LOG_PUTC('0'); -} - -/* - * store an unsigned decimal in the log - */ -void -log_putu(unsigned long num) -{ - char dig[sizeof(num) * 3], *p = dig; - unsigned int ndig; - - if (num != 0) { - for (ndig = 0; num != 0; ndig++) { - *p++ = num % 10; - num /= 10; - } - for (; ndig != 0; ndig--) - LOG_PUTC(*(--p) + '0'); - } else - LOG_PUTC('0'); -} - -/* - * store a signed decimal in the log - */ -void -log_puti(long num) -{ - if (num < 0) { - LOG_PUTC('-'); - num = -num; - } - log_putu(num); + errno = save_errno; } /* @@ -151,9 +101,7 @@ xmalloc(size_t size) p = malloc(size); if (p == NULL) { - log_puts("failed to allocate "); - log_putx(size); - log_puts(" bytes\n"); + logx(0, "failed to allocate %zu bytes", size); panic(); } return p; @@ -167,7 +115,7 @@ xfree(void *p) { #ifdef DEBUG if (p == NULL) { - log_puts("xfree with NULL arg\n"); + logx(0, "xfree with NULL arg"); panic(); } #endif diff --git a/usr.bin/aucat/utils.h b/usr.bin/aucat/utils.h index 442e1b157..fe0612c26 100644 --- a/usr.bin/aucat/utils.h +++ b/usr.bin/aucat/utils.h @@ -1,4 +1,4 @@ -/* $OpenBSD: utils.h,v 1.3 2017/01/03 07:25:16 ratchov Exp $ */ +/* $OpenBSD: utils.h,v 1.4 2024/12/22 14:17:45 ratchov Exp $ */ /* * Copyright (c) 2003-2012 Alexandre Ratchov * @@ -20,12 +20,15 @@ #include -void log_puts(char *); -void log_putx(unsigned long); -void log_putu(unsigned long); -void log_puti(long); +#define logx(n, ...) \ + do { \ + if (log_level >= (n)) \ + log_do(__VA_ARGS__); \ + } while (0) + void panic(void); void log_flush(void); +void log_do(const char *, ...) __attribute__((__format__ (printf, 1, 2))); void *xmalloc(size_t); char *xstrdup(char *); diff --git a/usr.bin/awk/awk.1 b/usr.bin/awk/awk.1 index 9fa1b4b5d..be9701f47 100644 --- a/usr.bin/awk/awk.1 +++ b/usr.bin/awk/awk.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: awk.1,v 1.70 2024/08/11 18:24:43 schwarze Exp $ +.\" $OpenBSD: awk.1,v 1.71 2024/12/25 13:44:22 naddy Exp $ .\" .\" Copyright (C) Lucent Technologies 1997 .\" All Rights Reserved @@ -22,7 +22,7 @@ .\" ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF .\" THIS SOFTWARE. .\" -.Dd $Mdocdate: August 11 2024 $ +.Dd $Mdocdate: December 25 2024 $ .Dt AWK 1 .Os .Sh NAME @@ -790,12 +790,11 @@ is omitted. .Fa expr should match the string that was used to open the file or pipe. .It Ic getline -Sets -.Va $0 -to the next input record from the current input file. +Reads the next record from the current input file. This form of .Ic getline sets the variables +.Va $0 , .Va NF , .Va NR , and @@ -803,13 +802,11 @@ and .Ic getline returns 1 for a successful input, 0 for end of file, and \-1 for an error. .It Ic getline Va var -Sets -.Va $0 -to variable -.Va var . +Reads the next record from the current input file. This form of .Ic getline sets the variables +.Va var , .Va NR and .Va FNR . @@ -819,9 +816,7 @@ returns 1 for a successful input, 0 for end of file, and \-1 for an error. .Ic getline Op Va var .Pf <\ \& Ar file .Xc -Sets -.Va $0 -to the next record from +Reads the next record from .Ar file . If .Va var diff --git a/usr.bin/chpass/chpass.h b/usr.bin/chpass/chpass.h index 0d7d3ccc6..bbad5d5aa 100644 --- a/usr.bin/chpass/chpass.h +++ b/usr.bin/chpass/chpass.h @@ -1,4 +1,4 @@ -/* $OpenBSD: chpass.h,v 1.11 2015/11/26 19:01:47 deraadt Exp $ */ +/* $OpenBSD: chpass.h,v 1.12 2024/10/22 22:15:38 jsg Exp $ */ /* $NetBSD: chpass.h,v 1.4 1996/05/15 21:50:44 jtc Exp $ */ /* @@ -67,7 +67,6 @@ int p_gecos(char *, struct passwd *, ENTRY *); int p_gid(char *, struct passwd *, ENTRY *); int p_hdir(char *, struct passwd *, ENTRY *); int p_login(char *, struct passwd *, ENTRY *); -int p_login(char *, struct passwd *, ENTRY *); int p_passwd(char *, struct passwd *, ENTRY *); int p_shell(char *, struct passwd *, ENTRY *); int p_uid(char *, struct passwd *, ENTRY *); diff --git a/usr.bin/cu/cu.c b/usr.bin/cu/cu.c index 323f5eea5..409333fc5 100644 --- a/usr.bin/cu/cu.c +++ b/usr.bin/cu/cu.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cu.c,v 1.31 2024/02/10 15:29:04 deraadt Exp $ */ +/* $OpenBSD: cu.c,v 1.32 2024/10/24 22:42:08 krw Exp $ */ /* * Copyright (c) 2012 Nicholas Marriott @@ -502,11 +502,17 @@ get_ucomnames(void) char * find_ucom(const char *usbid, char *names) { + const char *errstr; + const char *U; char *cua, *id, *ucom; + uint32_t unit; if (names == NULL) return NULL; + /* The mapping of ucom[NN] to cuaU[C] is defined in MAKEDEV. */ + U ="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + /* names is a comma separated list of "ucom:". */ cua = NULL; for (ucom = strsep(&names, ","); ucom; ucom = strsep(&names, ",")) { @@ -518,7 +524,10 @@ find_ucom(const char *usbid, char *names) continue; *id++ = '\0'; if (strcasecmp(id, usbid) == 0) { - if (asprintf(&cua, "cuaU%s", ucom) == -1) + unit = strtonum(ucom, 0, strlen(U) - 1, &errstr); + if (errstr != NULL) + continue; + if (asprintf(&cua, "cuaU%c", U[unit]) == -1) err(1, NULL); break; } diff --git a/usr.bin/dc/inout.c b/usr.bin/dc/inout.c index 72d97b308..389c31816 100644 --- a/usr.bin/dc/inout.c +++ b/usr.bin/dc/inout.c @@ -1,4 +1,4 @@ -/* $OpenBSD: inout.c,v 1.23 2023/03/08 04:43:10 guenther Exp $ */ +/* $OpenBSD: inout.c,v 1.24 2024/11/07 16:20:00 otto Exp $ */ /* * Copyright (c) 2003, Otto Moerbeek @@ -38,7 +38,7 @@ static void src_freestring(struct source *); static void flushwrap(FILE *); static void putcharwrap(FILE *, int); static void printwrap(FILE *, const char *); -static char *get_digit(u_long, int, u_int); +static void get_digit(u_long, int, u_int, char *, size_t); static struct vtable stream_vtable = { src_getcharstream, @@ -264,20 +264,17 @@ read_string(struct source *src) return p; } -static char * -get_digit(u_long num, int digits, u_int base) +static void +get_digit(u_long num, int digits, u_int base, char *buf, size_t sz) { - char *p; - if (base <= 16) { - p = bmalloc(2); - p[0] = num >= 10 ? num + 'A' - 10 : num + '0'; - p[1] = '\0'; + buf[0] = num >= 10 ? num + 'A' - 10 : num + '0'; + buf[1] = '\0'; } else { - if (asprintf(&p, "%0*lu", digits, num) == -1) - err(1, NULL); + int ret = snprintf(buf, sz, "%0*lu", digits, num); + if (ret < 0 || (size_t)ret >= sz) + err(1, "truncation"); } - return p; } void @@ -285,11 +282,10 @@ printnumber(FILE *f, const struct number *b, u_int base) { struct number *int_part, *fract_part; int digits; - char buf[11]; - size_t sz; + char buf[12], *str, *p; + size_t allocated; int i; - struct stack stack; - char *p; + BN_ULONG *mem; charcount = 0; lastchar = -1; @@ -307,24 +303,49 @@ printnumber(FILE *f, const struct number *b, u_int base) } split_number(b, int_part->number, fract_part->number); - i = 0; - stack_init(&stack); - while (!BN_is_zero(int_part->number)) { - BN_ULONG rem = BN_div_word(int_part->number, base); - stack_pushstring(&stack, get_digit(rem, digits, base)); - i++; + if (base == 10 && !BN_is_zero(int_part->number)) { + str = BN_bn2dec(int_part->number); + bn_checkp(str); + p = str; + while (*p) + putcharwrap(f, *p++); + free(str); + } else if (base == 16 && !BN_is_zero(int_part->number)) { + str = BN_bn2hex(int_part->number); + bn_checkp(str); + p = str; + if (*p == '-') + putcharwrap(f, *p++); + /* skip leading zero's */ + while (*p == '0') + p++; + while (*p) + putcharwrap(f, *p++); + free(str); + } else { + i = 0; + allocated = 1; + mem = breallocarray(NULL, allocated, sizeof(BN_ULONG)); + while (!BN_is_zero(int_part->number)) { + if (i >= allocated) { + allocated *= 2; + mem = breallocarray(mem, allocated, + sizeof(BN_ULONG)); + } + mem[i++] = BN_div_word(int_part->number, base); + } + if (BN_is_negative(b->number)) + putcharwrap(f, '-'); + for (i = i - 1; i >= 0; i--) { + get_digit(mem[i], digits, base, buf, + sizeof(buf)); + if (base > 16) + putcharwrap(f, ' '); + printwrap(f, buf); + } + free(mem); } - sz = i; - if (BN_is_negative(b->number)) - putcharwrap(f, '-'); - for (i = 0; i < sz; i++) { - p = stack_popstring(&stack); - if (base > 16) - putcharwrap(f, ' '); - printwrap(f, p); - free(p); - } - stack_clear(&stack); + if (b->scale > 0) { struct number *num_base; BIGNUM *mult, *stop; @@ -352,13 +373,12 @@ printnumber(FILE *f, const struct number *b, u_int base) bmachine_scale()); split_number(fract_part, int_part->number, NULL); rem = BN_get_word(int_part->number); - p = get_digit(rem, digits, base); + get_digit(rem, digits, base, buf, sizeof(buf)); int_part->scale = 0; normalize(int_part, fract_part->scale); bn_check(BN_sub(fract_part->number, fract_part->number, int_part->number)); - printwrap(f, p); - free(p); + printwrap(f, buf); bn_check(BN_mul_word(mult, base)); } free_number(num_base); diff --git a/usr.bin/diff/diff.1 b/usr.bin/diff/diff.1 index abf65c7e9..c0e2d76ee 100644 --- a/usr.bin/diff/diff.1 +++ b/usr.bin/diff/diff.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: diff.1,v 1.51 2023/01/05 00:00:44 millert Exp $ +.\" $OpenBSD: diff.1,v 1.52 2024/12/03 07:09:14 jmc Exp $ .\" .\" Copyright (c) 1980, 1990, 1993 .\" The Regents of the University of California. All rights reserved. @@ -29,7 +29,7 @@ .\" .\" @(#)diff.1 8.1 (Berkeley) 6/30/93 .\" -.Dd $Mdocdate: January 5 2023 $ +.Dd $Mdocdate: December 3 2024 $ .Dt DIFF 1 .Os .Sh NAME @@ -284,8 +284,8 @@ options may be specified. .It Fl x Ar pattern Exclude files and subdirectories from comparison whose basenames match .Ar pattern . -Patterns are matched using shell-style globbing via -.Xr fnmatch 3 . +Patterns are matched using shell-style globbing as described in +.Xr glob 7 . Multiple .Fl x options may be specified. diff --git a/usr.bin/dig/dig.1 b/usr.bin/dig/dig.1 index 1031c377c..b08ad816b 100644 --- a/usr.bin/dig/dig.1 +++ b/usr.bin/dig/dig.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: dig.1,v 1.7 2024/09/25 06:13:01 jmc Exp $ +.\" $OpenBSD: dig.1,v 1.8 2024/12/27 09:04:48 florian Exp $ .\" .\" Copyright (C) 2000-2011, 2013-2018 Internet Systems Consortium, Inc. ("ISC") .\" @@ -14,7 +14,7 @@ .\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR .\" PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: September 25 2024 $ +.Dd $Mdocdate: December 27 2024 $ .Dt DIG 1 .Os .Sh NAME @@ -810,6 +810,12 @@ This alternate syntax to .Cm tcp is provided for backwards compatibility. The "vc" stands for "virtual circuit". +.It Xo +.Cm + Ns +.Op Cm no Ns +.Cm zoneversion +.Xc +Include an EDNS zone version request when sending a query (off by default). .El .Sh MULTIPLE QUERIES The BIND 9 implementation of diff --git a/usr.bin/dig/dig.c b/usr.bin/dig/dig.c index a23bcbeb4..6a15cb350 100644 --- a/usr.bin/dig/dig.c +++ b/usr.bin/dig/dig.c @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dig.c,v 1.20 2023/09/06 04:57:28 jsg Exp $ */ +/* $Id: dig.c,v 1.21 2024/12/27 09:04:48 florian Exp $ */ /*! \file */ #include @@ -498,7 +498,7 @@ repopulate_buffer: if (query->lookup->comments && headers && !short_form) { result = dns_message_pseudosectiontotext(msg, DNS_PSEUDOSECTION_OPT, - style, flags, buf); + style, flags, query->lookup->textname, buf); if (result == ISC_R_NOSPACE) { buftoosmall: len += OUTPUTBUF; @@ -563,7 +563,9 @@ buftoosmall: result = dns_message_pseudosectiontotext( msg, DNS_PSEUDOSECTION_TSIG, - style, flags, buf); + style, flags, + query->lookup->textname, + buf); if (result == ISC_R_NOSPACE) goto buftoosmall; check_result(result, @@ -571,7 +573,9 @@ buftoosmall: result = dns_message_pseudosectiontotext( msg, DNS_PSEUDOSECTION_SIG0, - style, flags, buf); + style, flags, + query->lookup->textname, + buf); if (result == ISC_R_NOSPACE) goto buftoosmall; check_result(result, @@ -1250,6 +1254,12 @@ plus_option(const char *option, int is_batchfile, lookup->tcp_mode_set = 1; } break; + case 'z': + FULLCHECK("zoneversion"); + if (!state) + break; + save_opt(lookup, "zoneversion", NULL); + break; default: invalid_option: need_value: diff --git a/usr.bin/dig/dighost.c b/usr.bin/dig/dighost.c index 57a8e4a2d..dff890f17 100644 --- a/usr.bin/dig/dighost.c +++ b/usr.bin/dig/dighost.c @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dighost.c,v 1.39 2024/08/29 07:20:16 florian Exp $ */ +/* $Id: dighost.c,v 1.40 2024/12/27 09:04:48 florian Exp $ */ /*! \file * \note @@ -1274,6 +1274,7 @@ dig_ednsoptname_t optnames[] = { { 12, "PAD" }, /* shorthand */ { 13, "CHAIN" }, /* RFC 7901 */ { 14, "KEY-TAG" }, /* RFC 8145 */ + { 19, "ZONEVERSION" }, /* RFC 9660 */ { 26946, "DEVICEID" }, /* Brian Hartvigsen */ }; diff --git a/usr.bin/dig/lib/dns/dst_internal.h b/usr.bin/dig/lib/dns/dst_internal.h index a110676e5..3aea65802 100644 --- a/usr.bin/dig/lib/dns/dst_internal.h +++ b/usr.bin/dig/lib/dns/dst_internal.h @@ -31,7 +31,7 @@ * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: dst_internal.h,v 1.13 2024/05/17 23:56:19 jsg Exp $ */ +/* $Id: dst_internal.h,v 1.14 2024/10/25 06:08:29 jsg Exp $ */ #ifndef DST_DST_INTERNAL_H #define DST_DST_INTERNAL_H 1 @@ -131,8 +131,6 @@ isc_result_t dst__hmacsha224_init(struct dst_func **funcp); isc_result_t dst__hmacsha256_init(struct dst_func **funcp); isc_result_t dst__hmacsha384_init(struct dst_func **funcp); isc_result_t dst__hmacsha512_init(struct dst_func **funcp); -isc_result_t dst__opensslrsa_init(struct dst_func **funcp, - unsigned char algorithm); /*% * Destructors diff --git a/usr.bin/dig/lib/dns/include/dns/message.h b/usr.bin/dig/lib/dns/include/dns/message.h index 6cd42be41..6d0f2a50d 100644 --- a/usr.bin/dig/lib/dns/include/dns/message.h +++ b/usr.bin/dig/lib/dns/include/dns/message.h @@ -105,6 +105,7 @@ #define DNS_OPT_PAD 12 /*%< PAD opt code */ #define DNS_OPT_KEY_TAG 14 /*%< Key tag opt code */ #define DNS_OPT_EDE 15 /* RFC 8914 */ +#define DNS_OPT_ZONEVERSION 19 /* RFC 9660 */ /*%< The number of EDNS options we know about. */ #define DNS_EDNSOPTIONS 4 @@ -288,6 +289,7 @@ dns_message_pseudosectiontotext(dns_message_t *msg, dns_pseudosection_t section, const dns_master_style_t *style, dns_messagetextflag_t flags, + const char *textname, isc_buffer_t *target); /*%< * Convert section 'section' or 'pseudosection' of message 'msg' to diff --git a/usr.bin/dig/lib/dns/include/dns/types.h b/usr.bin/dig/lib/dns/include/dns/types.h index 2a8738c65..0efc49d49 100644 --- a/usr.bin/dig/lib/dns/include/dns/types.h +++ b/usr.bin/dig/lib/dns/include/dns/types.h @@ -30,10 +30,8 @@ #include -typedef struct dns_acache dns_acache_t; typedef uint16_t dns_cert_t; typedef struct dns_compress dns_compress_t; -typedef struct dns_db dns_db_t; typedef void dns_dbnode_t; typedef void dns_dbversion_t; typedef struct dns_decompress dns_decompress_t; @@ -56,8 +54,6 @@ typedef uint16_t dns_rdatatype_t; typedef uint8_t dns_secalg_t; typedef struct dns_tsigkey dns_tsigkey_t; typedef uint32_t dns_ttl_t; -typedef struct dns_view dns_view_t; -typedef struct dns_zone dns_zone_t; typedef enum { dns_namereln_none = 0, @@ -154,6 +150,7 @@ enum { dns_rdatatype_caa = 257, dns_rdatatype_avc = 258, dns_rdatatype_doa = 259, + dns_rdatatype_resinfo = 261, dns_rdatatype_ta = 32768, dns_rdatatype_dlv = 32769, dns_rdatatype_keydata = 65533, diff --git a/usr.bin/dig/lib/dns/message.c b/usr.bin/dig/lib/dns/message.c index 49ea973ff..66ba9db52 100644 --- a/usr.bin/dig/lib/dns/message.c +++ b/usr.bin/dig/lib/dns/message.c @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: message.c,v 1.21 2022/06/26 09:43:39 florian Exp $ */ +/* $Id: message.c,v 1.22 2024/12/27 09:04:48 florian Exp $ */ /*! \file */ @@ -2484,11 +2484,42 @@ ede_info_code2str(uint16_t info_code) } } +static const char * +zoneversion_zone(const char *zone, int labelcount) +{ + size_t pos; + + if (zone == NULL || labelcount == 0) + return "."; + + pos = strlen(zone); + if (pos == 0) + return "."; + + pos--; /* go to last char in string */ + if (zone[pos] == '.') + pos--; /* the labelcount does not count the empty root label */ + + for (; pos > 0; pos--) { + if (zone[pos] == '.') { + labelcount--; + + if (labelcount == 0) { + pos++; + break; + } + } + } + + return (zone + pos); +} + isc_result_t dns_message_pseudosectiontotext(dns_message_t *msg, dns_pseudosection_t section, const dns_master_style_t *style, dns_messagetextflag_t flags, + const char *textname, isc_buffer_t *target) { dns_rdataset_t *ps = NULL; @@ -2621,6 +2652,46 @@ dns_message_pseudosectiontotext(dns_message_t *msg, ede_info_code2str(info_code)); ADD_STRING(target, ")"); } + } else if (optcode == DNS_OPT_ZONEVERSION) { + int i; + + ADD_STRING(target, "; ZONEVERSION: "); + optdata = isc_buffer_current(&optbuf); + for (i = 0; i < optlen; i++) { + snprintf(buf, sizeof(buf), "%02x ", + optdata[i]); + ADD_STRING(target, buf); + } + + if (optlen >= 2) { + uint8_t labelcount, type; + const char *zone; + + labelcount = + isc_buffer_getuint8(&optbuf); + optlen -= 1; + type = isc_buffer_getuint8(&optbuf); + optlen -= 1; + zone = zoneversion_zone(textname, + labelcount); + + if (type == 0 && optlen == 4) { + uint32_t serial; + + serial = isc_buffer_getuint32( + &optbuf); + optlen -= 4; + ADD_STRING(target, + "(\"SOA-SERIAL: "); + snprintf(buf, sizeof(buf), "%u", + serial); + ADD_STRING(target, buf); + ADD_STRING(target, " ("); + ADD_STRING(target, zone); + ADD_STRING(target, ")"); + ADD_STRING(target, "\")"); + } + } } else { ADD_STRING(target, "; OPT="); snprintf(buf, sizeof(buf), "%u", optcode); diff --git a/usr.bin/dig/lib/dns/rdata.c b/usr.bin/dig/lib/dns/rdata.c index 395f3cf12..f39da4d8a 100644 --- a/usr.bin/dig/lib/dns/rdata.c +++ b/usr.bin/dig/lib/dns/rdata.c @@ -14,7 +14,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: rdata.c,v 1.36 2024/04/23 13:34:50 jsg Exp $ */ +/* $Id: rdata.c,v 1.37 2024/12/09 12:24:01 florian Exp $ */ /*! \file */ @@ -811,6 +811,7 @@ dns_rdatatype_fromtext(dns_rdatatype_t *typep, isc_textregion_t *source) { {"ptr", 12}, {"px", 26}, {"reserved0", 0}, + {"resinfo", 261}, {"rkey", 57}, {"rp", 17}, {"rrsig", 46}, @@ -1055,6 +1056,8 @@ dns_rdatatype_totext(dns_rdatatype_t type, isc_buffer_t *target) { return (isc_str_tobuffer("AVC", target)); case 259: return (isc_str_tobuffer("DOA", target)); + case 261: + return (isc_str_tobuffer("RESINFO", target)); case 32768: return (isc_str_tobuffer("TA", target)); case 32769: diff --git a/usr.bin/dig/lib/dns/rdata/generic/resinfo_261.c b/usr.bin/dig/lib/dns/rdata/generic/resinfo_261.c new file mode 100644 index 000000000..6ad04d04f --- /dev/null +++ b/usr.bin/dig/lib/dns/rdata/generic/resinfo_261.c @@ -0,0 +1,83 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/* RFC 9606, based on txt_16.c */ + +#ifndef RDATA_GENERIC_RESINFO_261_C +#define RDATA_GENERIC_RESINFO_261_C + +static inline isc_result_t +generic_totext_resinfo(ARGS_TOTEXT) { + isc_region_t region; + + UNUSED(tctx); + + dns_rdata_toregion(rdata, ®ion); + + while (region.length > 0) { + RETERR(txt_totext(®ion, 1, target)); + if (region.length > 0) + RETERR(isc_str_tobuffer(" ", target)); + } + + return (ISC_R_SUCCESS); +} + +static inline isc_result_t +generic_fromwire_resinfo(ARGS_FROMWIRE) { + isc_result_t result; + + UNUSED(type); + UNUSED(dctx); + UNUSED(rdclass); + UNUSED(options); + + do { + result = txt_fromwire(source, target); + if (result != ISC_R_SUCCESS) + return (result); + } while (!buffer_empty(source)); + return (ISC_R_SUCCESS); +} + +static inline isc_result_t +totext_resinfo(ARGS_TOTEXT) { + + REQUIRE(rdata->type == dns_rdatatype_resinfo); + + return (generic_totext_resinfo(rdata, tctx, target)); +} + +static inline isc_result_t +fromwire_resinfo(ARGS_FROMWIRE) { + + REQUIRE(type == dns_rdatatype_resinfo); + + return (generic_fromwire_resinfo(rdclass, type, source, dctx, options, + target)); +} + +static inline isc_result_t +towire_resinfo(ARGS_TOWIRE) { + + REQUIRE(rdata->type == dns_rdatatype_resinfo); + + UNUSED(cctx); + + return (isc_mem_tobuffer(target, rdata->data, rdata->length)); +} + +#endif /* RDATA_GENERIC_RESINFO_261_C */ diff --git a/usr.bin/dig/lib/dns/rdata/in_1/svcb_64.c b/usr.bin/dig/lib/dns/rdata/in_1/svcb_64.c index 45edc92d5..edf8682c7 100644 --- a/usr.bin/dig/lib/dns/rdata/in_1/svcb_64.c +++ b/usr.bin/dig/lib/dns/rdata/in_1/svcb_64.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: svcb_64.c,v 1.1 2022/07/03 12:07:52 florian Exp $ */ +/* $Id: svcb_64.c,v 1.2 2024/10/31 07:40:34 otto Exp $ */ /* draft-ietf-dnsop-svcb-https-10, based on srv_33.c */ @@ -197,7 +197,6 @@ fromwire_in_svcb_https(ARGS_FROMWIRE) { dns_name_t name; isc_region_t sr; unsigned int svc_param_value_len; - int alias_mode = 0; UNUSED(type); UNUSED(rdclass); @@ -213,20 +212,12 @@ fromwire_in_svcb_https(ARGS_FROMWIRE) { if (sr.length < 2) return (ISC_R_UNEXPECTEDEND); RETERR(isc_mem_tobuffer(target, sr.base, 2)); - alias_mode = uint16_fromregion(&sr) == 0; isc_buffer_forward(source, 2); /* * TargetName. */ RETERR(dns_name_fromwire(&name, source, dctx, options, target)); - if (alias_mode) { - /* - * In AliasMode, recipients MUST ignore any SvcParams that - * are present. - */ - return (ISC_R_SUCCESS); - } isc_buffer_activeregion(source, &sr); while (sr.length > 0) { diff --git a/usr.bin/file/file.c b/usr.bin/file/file.c index 9fb35dba3..8920ba482 100644 --- a/usr.bin/file/file.c +++ b/usr.bin/file/file.c @@ -1,4 +1,4 @@ -/* $OpenBSD: file.c,v 1.70 2024/01/16 13:07:29 claudio Exp $ */ +/* $OpenBSD: file.c,v 1.74 2024/11/21 13:35:20 claudio Exp $ */ /* * Copyright (c) 2015 Nicholas Marriott @@ -125,7 +125,7 @@ main(int argc, char **argv) struct imsgbuf ibuf; struct imsg imsg; struct input_msg msg; - struct input_ack *ack; + struct input_ack ack; pid_t pid, parent; tzset(); @@ -216,17 +216,18 @@ main(int argc, char **argv) if (cflag) goto wait_for_child; - imsg_init(&ibuf, pair[0]); + if (imsgbuf_init(&ibuf, pair[0]) == -1) + err(1, "imsgbuf_init"); + imsgbuf_allow_fdpass(&ibuf); for (idx = 0; idx < argc; idx++) { fd = prepare_message(&msg, idx, argv[idx]); send_message(&ibuf, &msg, sizeof msg, fd); if (read_message(&ibuf, &imsg, pid) == 0) break; - if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof *ack) - errx(1, "message too small"); - ack = imsg.data; - if (ack->idx != idx) + if (imsg_get_data(&imsg, &ack, sizeof ack) == -1) + err(1, "bad message"); + if (ack.idx != idx) errx(1, "index not expected"); imsg_free(&imsg); } @@ -288,32 +289,32 @@ send_message(struct imsgbuf *ibuf, void *msg, size_t msglen, int fd) { if (imsg_compose(ibuf, -1, -1, 0, fd, msg, msglen) != 1) err(1, "imsg_compose"); - if (imsg_flush(ibuf) != 0) - err(1, "imsg_flush"); + if (imsgbuf_flush(ibuf) != 0) + err(1, "imsgbuf_flush"); } static int read_message(struct imsgbuf *ibuf, struct imsg *imsg, pid_t from) { - int n; - - while ((n = imsg_read(ibuf)) == -1 && errno == EAGAIN) - /* nothing */ ; - if (n == -1) - err(1, "imsg_read"); - if (n == 0) - return (0); - - if ((n = imsg_get(ibuf, imsg)) == -1) - err(1, "imsg_get"); - if (n == 0) - return (0); - - if ((pid_t)imsg->hdr.pid != from) - errx(1, "PIDs don't match"); - - return (n); + while (1) { + switch (imsg_get(ibuf, imsg)) { + case -1: + err(1, "imsg_get"); + case 0: + break; + default: + if ((pid_t)imsg->hdr.pid != from) + errx(1, "PIDs don't match"); + return (1); + } + switch (imsgbuf_read(ibuf)) { + case -1: + err(1, "imsgbuf_read"); + case 0: + return (0); + } + } } static void @@ -365,7 +366,7 @@ child(int fd, pid_t parent, int argc, char **argv) struct magic *m; struct imsgbuf ibuf; struct imsg imsg; - struct input_msg *msg; + struct input_msg msg; struct input_ack ack; struct input_file inf; int i, idx; @@ -401,21 +402,22 @@ child(int fd, pid_t parent, int argc, char **argv) width = len; } - imsg_init(&ibuf, fd); + if (imsgbuf_init(&ibuf, fd) == -1) + err(1, "imsgbuf_init"); + imsgbuf_allow_fdpass(&ibuf); for (;;) { if (read_message(&ibuf, &imsg, parent) == 0) break; - if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof *msg) - errx(1, "message too small"); - msg = imsg.data; + if (imsg_get_data(&imsg, &msg, sizeof msg) == -1) + err(1, "bad message"); - idx = msg->idx; + idx = msg.idx; if (idx < 0 || idx >= argc) errx(1, "index out of range"); memset(&inf, 0, sizeof inf); inf.m = m; - inf.msg = msg; + inf.msg = &msg; inf.path = argv[idx]; inf.fd = imsg_get_fd(&imsg); diff --git a/usr.bin/id/id.c b/usr.bin/id/id.c index bb1ebc0e3..02c3d2a1e 100644 --- a/usr.bin/id/id.c +++ b/usr.bin/id/id.c @@ -1,4 +1,4 @@ -/* $OpenBSD: id.c,v 1.30 2023/05/30 16:44:16 op Exp $ */ +/* $OpenBSD: id.c,v 1.31 2024/11/04 21:59:15 jca Exp $ */ /*- * Copyright (c) 1991, 1993 @@ -269,7 +269,7 @@ void user(struct passwd *pw) { gid_t gid, groups[NGROUPS_MAX + 1]; - int cnt, ngroups; + int cnt, maxgroups, ngroups; uid_t uid; struct group *gr; char *prefix; @@ -279,8 +279,11 @@ user(struct passwd *pw) (void)printf(" gid=%u", pw->pw_gid); if ((gr = getgrgid(pw->pw_gid))) (void)printf("(%s)", gr->gr_name); - ngroups = NGROUPS_MAX + 1; - (void) getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups); + maxgroups = ngroups = NGROUPS_MAX + 1; + if (getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups) == -1) { + /* Silently truncate group list */ + ngroups = maxgroups; + } prefix = " groups="; for (cnt = 0; cnt < ngroups;) { gid = groups[cnt]; @@ -298,14 +301,20 @@ user(struct passwd *pw) void group(struct passwd *pw, int nflag) { - int cnt, ngroups; + int cnt, maxgroups, ngroups; gid_t gid, groups[NGROUPS_MAX + 1]; struct group *gr; char *prefix; if (pw) { - ngroups = NGROUPS_MAX + 1; - (void) getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups); + int ret; + + maxgroups = ngroups = NGROUPS_MAX + 1; + ret = getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups); + if (ret == -1) { + /* Silently truncate group list */ + ngroups = maxgroups; + } } else { groups[0] = getgid(); ngroups = getgroups(NGROUPS_MAX, groups + 1) + 1; diff --git a/usr.bin/kstat/kstat.1 b/usr.bin/kstat/kstat.1 index 4eacbc9ad..821571537 100644 --- a/usr.bin/kstat/kstat.1 +++ b/usr.bin/kstat/kstat.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: kstat.1,v 1.1 2020/08/13 12:37:16 schwarze Exp $ +.\" $OpenBSD: kstat.1,v 1.2 2024/12/03 07:09:14 jmc Exp $ .\" .\" Copyright (c) 2020 Ingo Schwarze .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: August 13 2020 $ +.Dd $Mdocdate: December 3 2024 $ .Dt KSTAT 1 .Os .Sh NAME @@ -51,16 +51,16 @@ The components of arguments are as follows: .It Ar provider The name of the device providing the statistical data. Pattern matching with -.Xr fnmatch 3 -is supported. +.Xr glob 7 +patterns is supported. .It Ar instance An unsigned integer number. Currently, all statistics use an instance number of 0. .It Ar name A string identifying the kind of data to be shown. Pattern matching with -.Xr fnmatch 3 -is supported. +.Xr glob 7 +patterns is supported. .It Ar unit An unsigned integer number, used for example if a network device has multiple rings. diff --git a/usr.bin/lex/ccl.c b/usr.bin/lex/ccl.c index 98644ebf5..b0609c08e 100644 --- a/usr.bin/lex/ccl.c +++ b/usr.bin/lex/ccl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ccl.c,v 1.9 2022/12/26 19:16:01 jmc Exp $ */ +/* $OpenBSD: ccl.c,v 1.10 2024/11/09 18:03:44 op Exp $ */ /* ccl - routines for character classes */ @@ -55,9 +55,7 @@ ccl_contains(const int cclp, const int ch) /* ccladd - add a single character to a ccl */ void -ccladd(cclp, ch) - int cclp; - int ch; +ccladd(int cclp, int ch) { int ind, len, newpos, i; @@ -190,7 +188,7 @@ ccl_set_union(int a, int b) /* cclinit - return an empty ccl */ int -cclinit() +cclinit(void) { if (++lastccl >= current_maxccls) { current_maxccls += MAX_CCLS_INCREMENT; @@ -231,8 +229,7 @@ cclinit() /* cclnegate - negate the given ccl */ void -cclnegate(cclp) - int cclp; +cclnegate(int cclp) { cclng[cclp] = 1; ccl_has_nl[cclp] = !ccl_has_nl[cclp]; @@ -247,9 +244,7 @@ cclnegate(cclp) */ void -list_character_set(file, cset) - FILE *file; - int cset[]; +list_character_set(FILE *file, int cset[]) { int i; diff --git a/usr.bin/lex/dfa.c b/usr.bin/lex/dfa.c index b986787fa..9c1c9e515 100644 --- a/usr.bin/lex/dfa.c +++ b/usr.bin/lex/dfa.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dfa.c,v 1.8 2015/11/19 23:20:34 tedu Exp $ */ +/* $OpenBSD: dfa.c,v 1.9 2024/11/09 18:03:44 op Exp $ */ /* dfa - DFA construction routines */ @@ -51,9 +51,7 @@ int symfollowset PROTO ((int[], int, int, int[])); * indexed by equivalence class. */ -void check_for_backing_up (ds, state) - int ds; - int state[]; +void check_for_backing_up (int ds, int state[]) { if ((reject && !dfaacc[ds].dfaacc_set) || (!reject && !dfaacc[ds].dfaacc_state)) { /* state is non-accepting */ ++num_backing_up; @@ -98,10 +96,8 @@ void check_for_backing_up (ds, state) * accset[1 .. nacc] is the list of accepting numbers for the DFA state. */ -void check_trailing_context (nfa_states, num_states, accset, nacc) - int *nfa_states, num_states; - int *accset; - int nacc; +void check_trailing_context (int *nfa_states, int num_states, + int *accset, int nacc) { int i, j; @@ -139,9 +135,7 @@ void check_trailing_context (nfa_states, num_states, accset, nacc) * and writes a report to the given file. */ -void dump_associated_rules (file, ds) - FILE *file; - int ds; +void dump_associated_rules (FILE *file, int ds) { int i, j; int num_associated_rules = 0; @@ -189,9 +183,7 @@ void dump_associated_rules (file, ds) * is done to the given file. */ -void dump_transitions (file, state) - FILE *file; - int state[]; +void dump_transitions (FILE *file, int state[]) { int i, ec; int out_char_set[CSIZE]; @@ -237,8 +229,8 @@ void dump_transitions (file, state) * hashval is the hash value for the dfa corresponding to the state set. */ -int *epsclosure (t, ns_addr, accset, nacc_addr, hv_addr) - int *t, *ns_addr, accset[], *nacc_addr, *hv_addr; +int *epsclosure (int *t, int *ns_addr, int accset[], int *nacc_addr, + int *hv_addr) { int stkpos, ns, tsp; int numstates = *ns_addr, nacc, hashval, transsym, nfaccnum; @@ -353,7 +345,7 @@ ADD_STATE(state); \ /* increase_max_dfas - increase the maximum number of DFAs */ -void increase_max_dfas () +void increase_max_dfas (void) { current_max_dfas += MAX_DFAS_INCREMENT; @@ -380,7 +372,7 @@ void increase_max_dfas () * dfa starts out in state #1. */ -void ntod () +void ntod (void) { int *accset, ds, nacc, newds; int sym, hashval, numstates, dsize; @@ -822,8 +814,8 @@ void ntod () * On return, the dfa state number is in newds. */ -int snstods (sns, numstates, accset, nacc, hashval, newds_addr) - int sns[], numstates, accset[], nacc, hashval, *newds_addr; +int snstods (int sns[], int numstates, int accset[], int nacc, int hashval, + int *newds_addr) { int didsort = 0; int i, j; @@ -944,8 +936,7 @@ int snstods (sns, numstates, accset, nacc, hashval, newds_addr) * int transsym, int nset[current_max_dfa_size] ); */ -int symfollowset (ds, dsize, transsym, nset) - int ds[], dsize, transsym, nset[]; +int symfollowset (int ds[], int dsize, int transsym, int nset[]) { int ns, tsp, sym, i, j, lenccl, ch, numstates, ccllist; @@ -1022,9 +1013,7 @@ int symfollowset (ds, dsize, transsym, nset) * int symlist[numecs], int duplist[numecs] ); */ -void sympartition (ds, numstates, symlist, duplist) - int ds[], numstates; - int symlist[], duplist[]; +void sympartition (int ds[], int numstates, int symlist[], int duplist[]) { int tch, i, j, k, ns, dupfwd[CSIZE + 1], lenccl, cclp, ich; diff --git a/usr.bin/lex/filter.c b/usr.bin/lex/filter.c index 2c9bbce46..329d98d52 100644 --- a/usr.bin/lex/filter.c +++ b/usr.bin/lex/filter.c @@ -1,4 +1,4 @@ -/* $OpenBSD: filter.c,v 1.9 2017/08/30 02:54:07 lteo Exp $ */ +/* $OpenBSD: filter.c,v 1.10 2024/11/09 18:03:44 op Exp $ */ /* filter - postprocessing of flex output through filters */ @@ -361,11 +361,10 @@ filter_fix_linedirs(struct filter * chain) if (buf[0] == '#' && regexec(®ex_linedir, buf, 3, m, 0) == 0) { - int num; char *fname; /* extract the line number and filename */ - num = regmatch_strtol(&m[1], buf, NULL, 0); + regmatch_strtol(&m[1], buf, NULL, 0); fname = regmatch_dup(&m[2], buf); if (strcmp(fname, diff --git a/usr.bin/lex/flex.1 b/usr.bin/lex/flex.1 index 47bc93cf8..fead20eff 100644 --- a/usr.bin/lex/flex.1 +++ b/usr.bin/lex/flex.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: flex.1,v 1.45 2021/03/08 02:47:27 jsg Exp $ +.\" $OpenBSD: flex.1,v 1.46 2024/11/09 18:06:00 op Exp $ .\" .\" Copyright (c) 1990 The Regents of the University of California. .\" All rights reserved. @@ -29,7 +29,7 @@ .\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR .\" PURPOSE. .\" -.Dd $Mdocdate: March 8 2021 $ +.Dd $Mdocdate: November 9 2024 $ .Dt FLEX 1 .Os .Sh NAME @@ -224,24 +224,17 @@ A somewhat more complicated example: .Bd -literal -offset indent /* scanner for a toy Pascal-like language */ -%{ -/* need this for the call to atof() below */ -#include -%} - DIGIT [0-9] ID [a-z][a-z0-9]* %% {DIGIT}+ { - printf("An integer: %s (%d)\en", yytext, - atoi(yytext)); + printf("An integer: %s\en", yytext); } {DIGIT}+"."{DIGIT}* { - printf("A float: %s (%g)\en", yytext, - atof(yytext)); + printf("A float: %s\en", yytext); } if|then|begin|end|procedure|function { @@ -260,6 +253,7 @@ if|then|begin|end|procedure|function { %% +int main(int argc, char *argv[]) { ++argv; --argc; /* skip over program name */ @@ -1564,8 +1558,7 @@ it will treat it as a single token, the floating-point number 123.456: expect-floats BEGIN(expect); [0-9]+"."[0-9]+ { - printf("found a float, = %f\en", - atof(yytext)); + printf("found a float, = %s\en", yytext); } \en { /* @@ -1578,8 +1571,7 @@ expect-floats BEGIN(expect); } [0-9]+ { - printf("found an integer, = %d\en", - atoi(yytext)); + printf("found an integer, = %s\en", yytext); } "." printf("found a dot\en"); @@ -2289,9 +2281,7 @@ appearing in the yacc input. This file is then included in the .Nm scanner. -For example, if one of the tokens is -.Qq TOK_NUMBER , -part of the scanner might look like: +For example, part of the scanner might look like: .Bd -literal -offset indent %{ #include "y.tab.h" @@ -2299,7 +2289,10 @@ part of the scanner might look like: %% -[0-9]+ yylval = atoi(yytext); return TOK_NUMBER; +if return TOK_IF; +then return TOK_THEN; +begin return TOK_BEGIN; +end return TOK_END; .Ed .Sh OPTIONS .Nm diff --git a/usr.bin/lex/flexdef.h b/usr.bin/lex/flexdef.h index 8cf92079b..d1a64c7d8 100644 --- a/usr.bin/lex/flexdef.h +++ b/usr.bin/lex/flexdef.h @@ -1,4 +1,4 @@ -/* $OpenBSD: flexdef.h,v 1.16 2022/12/26 19:16:01 jmc Exp $ */ +/* $OpenBSD: flexdef.h,v 1.17 2024/11/09 18:03:44 op Exp $ */ /* flexdef - definitions file for flex */ @@ -997,7 +997,7 @@ extern int yyparse PROTO ((void)); /* the YACC parser */ extern int flexscan PROTO ((void)); /* Open the given file (if NULL, stdin) for scanning. */ -extern void set_input_file PROTO ((char *)); +extern void set_input_file PROTO ((const char *)); /* Wrapup a file in the lexical analyzer. */ extern int yywrap PROTO ((void)); diff --git a/usr.bin/lex/gen.c b/usr.bin/lex/gen.c index e82937379..f3fd1aa4b 100644 --- a/usr.bin/lex/gen.c +++ b/usr.bin/lex/gen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: gen.c,v 1.15 2015/11/19 23:28:03 tedu Exp $ */ +/* $OpenBSD: gen.c,v 1.16 2024/11/09 18:03:44 op Exp $ */ /* gen - actual generation (writing) of flex scanners */ @@ -85,7 +85,7 @@ get_state_decl(void) /* Indent to the current level. */ void -do_indent() +do_indent(void) { int i = indent_level * 8; @@ -129,7 +129,7 @@ mkeoltbl(void) /* Generate the table for possible eol matches. */ static void -geneoltbl() +geneoltbl(void) { int i; @@ -154,7 +154,7 @@ geneoltbl() /* Generate the code to keep backing-up information. */ void -gen_backing_up() +gen_backing_up(void) { if (reject || num_backing_up == 0) return; @@ -176,7 +176,7 @@ gen_backing_up() /* Generate the code to perform the backing up. */ void -gen_bu_action() +gen_bu_action(void) { if (reject || num_backing_up == 0) return; @@ -342,7 +342,7 @@ mkssltbl(void) /* genctbl - generates full speed compressed transition table */ void -genctbl() +genctbl(void) { int i; int end_of_buffer_action = num_rules + 1; @@ -445,7 +445,7 @@ genctbl() /* mkecstbl - Make equivalence-class tables. */ -struct yytbl_data * +static struct yytbl_data * mkecstbl(void) { int i; @@ -476,7 +476,7 @@ mkecstbl(void) /* Generate equivalence-class tables. */ void -genecs() +genecs(void) { int i, j; int numrows; @@ -512,7 +512,7 @@ genecs() /* Generate the code to find the action number. */ void -gen_find_action() +gen_find_action(void) { if (fullspd) indent_puts("yy_act = yy_current_state[-1].yy_nxt;"); @@ -690,7 +690,7 @@ mkftbl(void) /* genftbl - generate full transition table */ void -genftbl() +genftbl(void) { int i; int end_of_buffer_action = num_rules + 1; @@ -725,8 +725,7 @@ genftbl() /* Generate the code to find the next compressed-table state. */ void -gen_next_compressed_state(char_map) - char *char_map; +gen_next_compressed_state(char *char_map) { indent_put2s("YY_CHAR yy_c = %s;", char_map); @@ -771,7 +770,7 @@ gen_next_compressed_state(char_map) /* Generate the code to find the next match. */ void -gen_next_match() +gen_next_match(void) { /* * NOTE - changes in here should be reflected in gen_next_state() and @@ -873,8 +872,7 @@ gen_next_match() /* Generate the code to find the next state. */ void -gen_next_state(worry_about_NULs) - int worry_about_NULs; +gen_next_state(int worry_about_NULs) { /* NOTE - changes in here should be reflected * in gen_next_match() */ char char_map[256]; @@ -940,7 +938,7 @@ gen_next_state(worry_about_NULs) /* Generate the code to make a NUL transition. */ void -gen_NUL_trans() +gen_NUL_trans(void) { /* NOTE - changes in here should be reflected * in gen_next_match() */ /* @@ -1025,7 +1023,7 @@ gen_NUL_trans() /* Generate the code to find the start state. */ void -gen_start_state() +gen_start_state(void) { if (fullspd) { if (bol_needed) { @@ -1056,7 +1054,7 @@ gen_start_state() /* gentabs - generate data statements for the transition tables */ void -gentabs() +gentabs(void) { int i, j, k, *accset, nacc, *acc_array, total_states; int end_of_buffer_action = num_rules + 1; @@ -1475,8 +1473,7 @@ gentabs() */ void -indent_put2s(fmt, arg) - const char *fmt, *arg; +indent_put2s(const char *fmt, const char *arg) { do_indent(); out_str(fmt, arg); @@ -1489,8 +1486,7 @@ indent_put2s(fmt, arg) */ void -indent_puts(str) - const char *str; +indent_puts(const char *str) { do_indent(); outn(str); @@ -1501,7 +1497,7 @@ indent_puts(str) */ void -make_tables() +make_tables(void) { int i; int did_eof_rule = false; diff --git a/usr.bin/lex/main.c b/usr.bin/lex/main.c index 6930c84a9..14ad446ec 100644 --- a/usr.bin/lex/main.c +++ b/usr.bin/lex/main.c @@ -1,4 +1,4 @@ -/* $OpenBSD: main.c,v 1.29 2022/12/26 19:16:01 jmc Exp $ */ +/* $OpenBSD: main.c,v 1.31 2024/12/18 12:33:57 sobrado Exp $ */ /* flex - tool to generate fast lexical analyzers */ @@ -137,9 +137,7 @@ int flex_main PROTO((int argc, char *argv[])); int main PROTO((int argc, char *argv[])); int -flex_main(argc, argv) - int argc; - char *argv[]; +flex_main(int argc, char *argv[]) { int i, exit_status, child_status; @@ -202,9 +200,7 @@ flex_main(argc, argv) /* Wrapper around flex_main, so flex_main can be built as a library. */ int -main(argc, argv) - int argc; - char *argv[]; +main(int argc, char *argv[]) { #if ENABLE_NLS #if HAVE_LOCALE_H @@ -226,7 +222,7 @@ main(argc, argv) /* check_options - check user-specified options */ void -check_options() +check_options(void) { int i; @@ -473,9 +469,7 @@ check_options() */ void -flexend(exit_status) - int exit_status; - +flexend(int exit_status) { static int called_before = -1; /* prevent infinite recursion. */ int tblsiz; @@ -904,9 +898,7 @@ flexend(exit_status) /* flexinit - initialize flex */ void -flexinit(argc, argv) - int argc; - char **argv; +flexinit(int argc, char *argv[]) { int i, sawcmpflag, rv, optind; char *arg; @@ -1427,7 +1419,7 @@ flexinit(argc, argv) /* readin - read in the rules section of the input file(s) */ void -readin() +readin(void) { static char yy_stdinit[] = "FILE *yyin = stdin, *yyout = stdout;"; static char yy_nostdinit[] = @@ -1653,7 +1645,7 @@ readin() /* set_up_initial_allocations - allocate memory for internal tables */ void -set_up_initial_allocations() +set_up_initial_allocations(void) { maximum_mns = (long_align ? MAXIMUM_MNS_LONG : MAXIMUM_MNS); current_mns = INITIAL_MNS; @@ -1714,9 +1706,7 @@ set_up_initial_allocations() /* extracts basename from path, optionally stripping the extension "\.*" * (same concept as /bin/sh `basename`, but different handling of extension). */ static char * -basename2(path, strip_ext) - char *path; - int strip_ext; /* boolean */ +basename2(char *path, int strip_ext) { char *b, *e = 0; @@ -1738,7 +1728,8 @@ usage(void) extern char *__progname; (void) fprintf(stderr, - "usage: %s [-78BbFfhIiLlnpsTtVvw+?] [-C[aeFfmr]] [--help]" + "usage: %s [-78BbdFfhIiLlnpsTtVvw+?] [-C[aeFfmr]] [--help]" " [--version]\n" - "\t[-ooutput] [-Pprefix] [-Sskeleton] [file ...]\n", __progname); + "\t[-ooutput] [-Pprefix] [-Sskeleton] [file ...]\n", + __progname); } diff --git a/usr.bin/lex/misc.c b/usr.bin/lex/misc.c index 59057687c..113468923 100644 --- a/usr.bin/lex/misc.c +++ b/usr.bin/lex/misc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: misc.c,v 1.20 2022/12/26 19:16:01 jmc Exp $ */ +/* $OpenBSD: misc.c,v 1.21 2024/11/09 18:03:44 op Exp $ */ /* misc - miscellaneous flex routines */ @@ -95,9 +95,7 @@ sko_pop(bool * dc) /* Append "#define defname value\n" to the running buffer. */ void -action_define(defname, value) - const char *defname; - int value; +action_define(const char *defname, int value) { char buf[MAXLINE]; char *cpy; @@ -117,31 +115,9 @@ action_define(defname, value) } -/** Append "m4_define([[defname]],[[value]])m4_dnl\n" to the running buffer. - * @param defname The macro name. - * @param value The macro value, can be NULL, which is the same as the empty string. - */ -void -action_m4_define(const char *defname, const char *value) -{ - char buf[MAXLINE]; - - flexfatal("DO NOT USE THIS FUNCTION!"); - - if ((int) strlen(defname) > MAXLINE / 2) { - format_pinpoint_message(_ - ("name \"%s\" ridiculously long"), - defname); - return; - } - snprintf(buf, sizeof(buf), "m4_define([[%s]],[[%s]])m4_dnl\n", defname, value ? value : ""); - add_action(buf); -} - /* Append "new_text" to the running buffer. */ void -add_action(new_text) - const char *new_text; +add_action(const char *new_text) { int len = strlen(new_text); @@ -172,9 +148,7 @@ add_action(new_text) /* allocate_array - allocate memory for an integer array of the given size */ void * -allocate_array(size, element_size) - int size; - size_t element_size; +allocate_array(int size, size_t element_size) { void *mem; size_t num_bytes = element_size * size; @@ -191,8 +165,7 @@ allocate_array(size, element_size) /* all_lower - true if a string is all lower-case */ int -all_lower(str) - char *str; +all_lower(char *str) { while (*str) { if (!isascii((u_char) * str) || !islower((u_char) * str)) @@ -207,8 +180,7 @@ all_lower(str) /* all_upper - true if a string is all upper-case */ int -all_upper(str) - char *str; +all_upper(char *str) { while (*str) { if (!isascii((u_char) * str) || !isupper((u_char) * str)) @@ -235,8 +207,7 @@ intcmp(const void *a, const void *b) */ void -check_char(c) - int c; +check_char(int c) { if (c >= CSIZE) lerrsf(_("bad character '%s' detected in check_char()"), @@ -253,8 +224,7 @@ check_char(c) /* clower - replace upper-case letter to lower-case */ u_char -clower(c) - int c; +clower(int c) { return (u_char) ((isascii(c) && isupper(c)) ? tolower(c) : c); } @@ -263,8 +233,7 @@ clower(c) /* copy_string - returns a dynamically allocated copy of a string */ char * -copy_string(str) - const char *str; +copy_string(const char *str) { const char *c1; char *c2; @@ -292,8 +261,7 @@ copy_string(str) */ u_char * -copy_unsigned_string(str) - u_char *str; +copy_unsigned_string(unsigned char *str) { u_char *c; u_char *copy; @@ -326,7 +294,7 @@ cclcmp(const void *a, const void *b) /* dataend - finish up a block of data declarations */ void -dataend() +dataend(void) { /* short circuit any output */ if (gentables) { @@ -345,7 +313,7 @@ dataend() /* dataflush - flush generated data statements */ void -dataflush() +dataflush(void) { /* short circuit any output */ if (!gentables) @@ -369,8 +337,7 @@ dataflush() /* flexerror - report an error message and terminate */ void -flexerror(msg) - const char *msg; +flexerror(const char *msg) { fprintf(stderr, "%s: %s\n", program_name, msg); flexend(1); @@ -380,8 +347,7 @@ flexerror(msg) /* flexfatal - report a fatal error message and terminate */ void -flexfatal(msg) - const char *msg; +flexfatal(const char *msg) { fprintf(stderr, _("%s: fatal internal error, %s\n"), program_name, msg); @@ -392,8 +358,7 @@ flexfatal(msg) /* htoi - convert a hexadecimal digit string to an integer value */ int -htoi(str) - u_char str[]; +htoi(unsigned char str[]) { unsigned int result; @@ -406,9 +371,7 @@ htoi(str) /* lerrif - report an error message formatted with one integer argument */ void -lerrif(msg, arg) - const char *msg; - int arg; +lerrif(const char *msg, int arg) { char errmsg[MAXLINE]; @@ -420,8 +383,7 @@ lerrif(msg, arg) /* lerrsf - report an error message formatted with one string argument */ void -lerrsf(msg, arg) - const char *msg, arg[]; +lerrsf(const char *msg, const char arg[]) { char errmsg[MAXLINE]; @@ -434,8 +396,7 @@ lerrsf(msg, arg) /* lerrsf_fatal - as lerrsf, but call flexfatal */ void -lerrsf_fatal(msg, arg) - const char *msg, arg[]; +lerrsf_fatal(const char *msg, const char arg[]) { char errmsg[MAXLINE]; @@ -448,9 +409,7 @@ lerrsf_fatal(msg, arg) /* line_directive_out - spit out a "#line" statement */ void -line_directive_out(output_file, do_infile) - FILE *output_file; - int do_infile; +line_directive_out(FILE *output_file, int do_infile) { char directive[MAXLINE], filename[MAXLINE]; char *s1, *s2, *s3; @@ -499,7 +458,7 @@ line_directive_out(output_file, do_infile) * and the prolog begins */ void -mark_defs1() +mark_defs1(void) { defs1_offset = 0; action_array[action_index++] = '\0'; @@ -512,7 +471,7 @@ mark_defs1() * representing the end of the action prolog */ void -mark_prolog() +mark_prolog(void) { action_array[action_index++] = '\0'; action_offset = action_index; @@ -525,8 +484,7 @@ mark_prolog() * Generates a data statement initializing the current 2-D array to "value". */ void -mk2data(value) - int value; +mk2data(int value) { /* short circuit any output */ if (!gentables) @@ -555,8 +513,7 @@ mk2data(value) * "value". */ void -mkdata(value) - int value; +mkdata(int value) { /* short circuit any output */ if (!gentables) @@ -581,8 +538,7 @@ mkdata(value) /* myctoi - return the integer represented by a string of digits */ int -myctoi(array) - const char *array; +myctoi(const char *array) { int val = 0; @@ -595,8 +551,7 @@ myctoi(array) /* myesc - return character corresponding to escape sequence */ u_char -myesc(array) - u_char array[]; +myesc(unsigned char array[]) { u_char c, esc_char; @@ -686,8 +641,7 @@ myesc(array) /* otoi - convert an octal digit string to an integer value */ int -otoi(str) - u_char str[]; +otoi(unsigned char str[]) { unsigned int result; @@ -701,68 +655,55 @@ otoi(str) */ void -out(str) - const char *str; +out(const char *str) { fputs(str, stdout); } void -out_dec(fmt, n) - const char *fmt; - int n; +out_dec(const char *fmt, int n) { fprintf(stdout, fmt, n); } void -out_dec2(fmt, n1, n2) - const char *fmt; - int n1, n2; +out_dec2(const char *fmt, int n1, int n2) { fprintf(stdout, fmt, n1, n2); } void -out_hex(fmt, x) - const char *fmt; - unsigned int x; +out_hex(const char *fmt, unsigned int x) { fprintf(stdout, fmt, x); } void -out_str(fmt, str) - const char *fmt, str[]; +out_str(const char *fmt, const char str[]) { fprintf(stdout, fmt, str); } void -out_str3(fmt, s1, s2, s3) - const char *fmt, s1[], s2[], s3[]; +out_str3(const char *fmt, const char s1[], const char s2[], const char s3[]) { fprintf(stdout, fmt, s1, s2, s3); } void -out_str_dec(fmt, str, n) - const char *fmt, str[]; - int n; +out_str_dec(const char *fmt, const char str[], int n) { fprintf(stdout, fmt, str, n); } void -outc(c) - int c; +outc(int c) { fputc(c, stdout); } void -outn(str) - const char *str; +outn(const char *str) { fputs(str, stdout); fputc('\n', stdout); @@ -787,8 +728,7 @@ out_m4_define(const char *def, const char *val) */ char * -readable_form(c) - int c; +readable_form(int c) { static char rform[10]; @@ -831,10 +771,7 @@ readable_form(c) /* reallocate_array - increase the size of a dynamic array */ void * -reallocate_array(array, size, element_size) - void *array; - int size; - size_t element_size; +reallocate_array(void *array, int size, size_t element_size) { void *new_array; size_t num_bytes = element_size * size; @@ -854,7 +791,7 @@ reallocate_array(array, size, element_size) * "%%" or EOF is found. */ void -skelout() +skelout(void) { char buf_storage[MAXLINE]; char *buf = buf_storage; @@ -969,8 +906,7 @@ skelout() */ void -transition_struct_out(element_v, element_n) - int element_v, element_n; +transition_struct_out(int element_v, int element_n) { /* short circuit any output */ @@ -996,8 +932,7 @@ transition_struct_out(element_v, element_n) * broken versions of bison. */ void * -yy_flex_xmalloc(size) - int size; +yy_flex_xmalloc(int size) { void *result = malloc((size_t) size); @@ -1013,8 +948,7 @@ yy_flex_xmalloc(size) * str can be any null-terminated string, or NULL. * returns str. */ char * -chomp(str) - char *str; +chomp(char *str) { char *p = str; diff --git a/usr.bin/lex/nfa.c b/usr.bin/lex/nfa.c index 41e5257a3..10697bcca 100644 --- a/usr.bin/lex/nfa.c +++ b/usr.bin/lex/nfa.c @@ -1,4 +1,4 @@ -/* $OpenBSD: nfa.c,v 1.11 2015/11/19 22:52:40 tedu Exp $ */ +/* $OpenBSD: nfa.c,v 1.12 2024/11/09 18:03:44 op Exp $ */ /* nfa - NFA construction routines */ @@ -48,8 +48,7 @@ void mkxtion PROTO((int, int)); */ void -add_accept(mach, accepting_number) - int mach, accepting_number; +add_accept(int mach, int accepting_number) { /* * Hang the accepting number off an epsilon state. if it is @@ -82,8 +81,7 @@ add_accept(mach, accepting_number) */ int -copysingl(singl, num) - int singl, num; +copysingl(int singl, int num) { int copy, i; @@ -99,9 +97,7 @@ copysingl(singl, num) /* dumpnfa - debugging routine to write out an nfa */ void -dumpnfa(state1) - int state1; - +dumpnfa(int state1) { int sym, tsp1, tsp2, anum, ns; @@ -156,8 +152,7 @@ dumpnfa(state1) */ int -dupmachine(mach) - int mach; +dupmachine(int mach) { int i, init, state_offset; int state = 0; @@ -204,9 +199,8 @@ dupmachine(mach) */ void -finish_rule(mach, variable_trail_rule, headcnt, trailcnt, - pcont_act) - int mach, variable_trail_rule, headcnt, trailcnt, pcont_act; +finish_rule(int mach, int variable_trail_rule, int headcnt, int trailcnt, + int pcont_act) { char action_text[MAXLINE]; @@ -319,8 +313,7 @@ finish_rule(mach, variable_trail_rule, headcnt, trailcnt, */ int -link_machines(first, last) - int first, last; +link_machines(int first, int last) { if (first == NIL) return last; @@ -347,8 +340,7 @@ link_machines(first, last) */ void -mark_beginning_as_normal(mach) - int mach; +mark_beginning_as_normal(int mach) { switch (state_type[mach]) { case STATE_NORMAL: @@ -390,8 +382,7 @@ mark_beginning_as_normal(mach) */ int -mkbranch(first, second) - int first, second; +mkbranch(int first, int second) { int eps; @@ -419,8 +410,7 @@ mkbranch(first, second) */ int -mkclos(state) - int state; +mkclos(int state) { return mkopt(mkposcl(state)); } @@ -441,8 +431,7 @@ mkclos(state) */ int -mkopt(mach) - int mach; +mkopt(int mach) { int eps; @@ -479,8 +468,7 @@ mkopt(mach) */ int -mkor(first, second) - int first, second; +mkor(int first, int second) { int eps, orend; @@ -534,8 +522,7 @@ mkor(first, second) */ int -mkposcl(state) - int state; +mkposcl(int state) { int eps; @@ -563,8 +550,7 @@ mkposcl(state) */ int -mkrep(mach, lb, ub) - int mach, lb, ub; +mkrep(int mach, int lb, int ub) { int base_mach, tail, copy, i; @@ -609,8 +595,7 @@ mkrep(mach, lb, ub) */ int -mkstate(sym) - int sym; +mkstate(int sym) { if (++lastnfa >= current_mns) { if ((current_mns += MNS_INCREMENT) >= maximum_mns) @@ -686,8 +671,7 @@ mkstate(sym) */ void -mkxtion(statefrom, stateto) - int statefrom, stateto; +mkxtion(int statefrom, int stateto) { if (trans1[statefrom] == NO_TRANSITION) trans1[statefrom] = stateto; @@ -705,7 +689,7 @@ mkxtion(statefrom, stateto) /* new_rule - initialize for a new rule */ void -new_rule() +new_rule(void) { if (++num_rules >= current_max_rules) { ++num_reallocs; diff --git a/usr.bin/lex/parse.y b/usr.bin/lex/parse.y index fdf0fcf84..ec0d933f8 100644 --- a/usr.bin/lex/parse.y +++ b/usr.bin/lex/parse.y @@ -1,4 +1,4 @@ -/* $OpenBSD: parse.y,v 1.10 2017/04/12 14:53:27 millert Exp $ */ +/* $OpenBSD: parse.y,v 1.11 2024/11/09 18:03:44 op Exp $ */ /* parse.y - parser for flex input */ @@ -950,7 +950,7 @@ string : string CHAR * conditions */ -void build_eof_action() +void build_eof_action(void) { int i; char action_text[MAXLINE]; @@ -989,8 +989,7 @@ void build_eof_action() /* format_synerr - write out formatted syntax error */ -void format_synerr( msg, arg ) -const char *msg, arg[]; +void format_synerr(const char *msg, const char arg[]) { char errmsg[MAXLINE]; @@ -1001,8 +1000,7 @@ const char *msg, arg[]; /* synerr - report a syntax error */ -void synerr( str ) -const char *str; +void synerr(const char *str) { syntaxerror = true; pinpoint_message( str ); @@ -1011,8 +1009,7 @@ const char *str; /* format_warn - write out formatted warning */ -void format_warn( msg, arg ) -const char *msg, arg[]; +void format_warn(const char *msg, const char arg[]) { char warn_msg[MAXLINE]; @@ -1023,8 +1020,7 @@ const char *msg, arg[]; /* warn - report a warning, unless -w was given */ -void warn( str ) -const char *str; +void warn(const char *str) { line_warning( str, linenum ); } @@ -1033,8 +1029,7 @@ const char *str; * pinpointing its location */ -void format_pinpoint_message( msg, arg ) -const char *msg, arg[]; +void format_pinpoint_message(const char *msg, const char arg[]) { char errmsg[MAXLINE]; @@ -1045,8 +1040,7 @@ const char *msg, arg[]; /* pinpoint_message - write out a message, pinpointing its location */ -void pinpoint_message( str ) -const char *str; +void pinpoint_message(const char *str) { line_pinpoint( str, linenum ); } @@ -1054,9 +1048,7 @@ const char *str; /* line_warning - report a warning at a given line, unless -w was given */ -void line_warning( str, line ) -const char *str; -int line; +void line_warning(const char *str, int line) { char warning[MAXLINE]; @@ -1070,9 +1062,7 @@ int line; /* line_pinpoint - write out a message, pinpointing it at the given line */ -void line_pinpoint( str, line ) -const char *str; -int line; +void line_pinpoint(const char *str, int line) { fprintf( stderr, "%s:%d: %s\n", infilename, line, str ); } @@ -1082,7 +1072,6 @@ int line; * currently, messages are ignore */ -void yyerror( msg ) -const char *msg; +void yyerror(const char *msg) { } diff --git a/usr.bin/lex/scan.l b/usr.bin/lex/scan.l index 0f678237f..7590d8b7f 100644 --- a/usr.bin/lex/scan.l +++ b/usr.bin/lex/scan.l @@ -1,4 +1,4 @@ -/* $OpenBSD: scan.l,v 1.13 2019/09/22 00:47:12 miko Exp $ */ +/* $OpenBSD: scan.l,v 1.14 2024/11/09 18:03:44 op Exp $ */ /* scan.l - scanner for flex input -*-C-*- */ @@ -61,7 +61,7 @@ extern const char *escaped_qstart, *escaped_qend; #define MARK_END_OF_PROLOG mark_prolog(); #define YY_DECL \ - int flexscan() + int flexscan(void) #define RETURNCHAR \ yylval = (unsigned char) yytext[0]; \ @@ -977,8 +977,7 @@ nmstr[yyleng - 2 - end_is_ws] = '\0'; /* chop trailing brace */ %% - -int yywrap() +int yywrap(void) { if ( --num_input_files > 0 ) { @@ -993,8 +992,7 @@ int yywrap() /* set_input_file - open the given file (if NULL, stdin) for scanning */ -void set_input_file( file ) -char *file; +void set_input_file(const char *file) { if ( file && strcmp( file, "-" ) ) { diff --git a/usr.bin/lex/scanopt.c b/usr.bin/lex/scanopt.c index 3d0f77a47..12bf7245c 100644 --- a/usr.bin/lex/scanopt.c +++ b/usr.bin/lex/scanopt.c @@ -1,4 +1,4 @@ -/* $OpenBSD: scanopt.c,v 1.6 2017/05/31 07:20:26 tedu Exp $ */ +/* $OpenBSD: scanopt.c,v 1.7 2024/11/09 18:03:44 op Exp $ */ /* flex - tool to generate fast lexical analyzers */ @@ -44,9 +44,7 @@ #else static int STRCASECMP PROTO ((const char *, const char *)); -static int STRCASECMP (a, b) - const char *a; - const char *b; +static int STRCASECMP (const char *a, const char *b) { while (tolower ((u_char)*a++) == tolower ((u_char)*b++)) ; return b - a; @@ -89,38 +87,28 @@ static int matchlongopt PROTO ((char *, char **, int *, char **, int *)); static int find_opt PROTO ((struct _scanopt_t *, int, char *, int, int *, int *opt_offset)); -static const char *NAME (s, i) - struct _scanopt_t *s; - int i; +static const char *NAME (struct _scanopt_t *s, int i) { return s->options[i].opt_fmt + ((s->aux[i].flags & IS_LONG) ? 2 : 1); } -static int PRINTLEN (s, i) - struct _scanopt_t *s; - int i; +static int PRINTLEN (struct _scanopt_t *s, int i) { return s->aux[i].printlen; } -static int RVAL (s, i) - struct _scanopt_t *s; - int i; +static int RVAL (struct _scanopt_t *s, int i) { return s->options[i].r_val; } -static int FLAGS (s, i) - struct _scanopt_t *s; - int i; +static int FLAGS (struct _scanopt_t *s, int i) { return s->aux[i].flags; } -static const char *DESC (s, i) - struct _scanopt_t *s; - int i; +static const char *DESC (struct _scanopt_t *s, int i) { return s->options[i].desc ? s->options[i].desc : ""; } @@ -128,7 +116,7 @@ static const char *DESC (s, i) #ifndef NO_SCANOPT_USAGE static int get_cols PROTO ((void)); -static int get_cols () +static int get_cols (void) { char *env; int cols = 80; /* default */ @@ -161,11 +149,8 @@ static int get_cols () (s)->subscript= 0; \ }while(0) -scanopt_t *scanopt_init (options, argc, argv, flags) - const optspec_t *options; - int argc; - char **argv; - int flags; +scanopt_t *scanopt_init (const optspec_t *options, int argc, char **argv, + int flags) { int i; struct _scanopt_t *s; @@ -257,10 +242,7 @@ typedef struct usg_elem usg_elem; [indent][option, alias1, alias2...][indent][description line1 description line2...] */ -int scanopt_usage (scanner, fp, usage) - scanopt_t *scanner; - FILE *fp; - const char *usage; +int scanopt_usage (scanopt_t *scanner, FILE *fp, const char *usage) { struct _scanopt_t *s; int i, columns, indent = 2; @@ -531,18 +513,11 @@ int scanopt_usage (scanner, fp, usage) #endif /* no scanopt_usage */ -static int scanopt_err (s, opt_offset, is_short, err) - struct _scanopt_t *s; - int opt_offset; - int is_short; - int err; +static int scanopt_err (struct _scanopt_t *s, int opt_offset, + int is_short, int err) { const char *optname = ""; char optchar[2]; - const optspec_t *opt = NULL; - - if (opt_offset >= 0) - opt = s->options + opt_offset; if (!s->no_err_msg) { @@ -594,12 +569,8 @@ static int scanopt_err (s, opt_offset, is_short, err) * optname will point to str + 2 * */ -static int matchlongopt (str, optname, optlen, arg, arglen) - char *str; - char **optname; - int *optlen; - char **arg; - int *arglen; +static int matchlongopt (char *str, char **optname, int *optlen, + char **arg, int *arglen) { char *p; @@ -641,13 +612,8 @@ static int matchlongopt (str, optname, optlen, arg, arglen) * Short options must be exact. * Return boolean true if found and no error. * Error stored in err_code or zero if no error. */ -static int find_opt (s, lookup_long, optstart, len, err_code, opt_offset) - struct _scanopt_t *s; - int lookup_long; - char *optstart; - int len; - int *err_code; - int *opt_offset; +static int find_opt (struct _scanopt_t *s, int lookup_long, char *optstart, + int len, int *err_code, int *opt_offset) { int nmatch = 0, lastr_val = 0, i; @@ -706,10 +672,7 @@ static int find_opt (s, lookup_long, optstart, len, err_code, opt_offset) } -int scanopt (svoid, arg, optindex) - scanopt_t *svoid; - char **arg; - int *optindex; +int scanopt (scanopt_t *svoid, char **arg, int *optindex) { char *optname = NULL, *optarg = NULL, *pstart; int namelen = 0, arglen = 0; @@ -857,8 +820,7 @@ int scanopt (svoid, arg, optindex) } -void scanopt_destroy (svoid) - scanopt_t *svoid; +void scanopt_destroy (scanopt_t *svoid) { struct _scanopt_t *s; diff --git a/usr.bin/lex/sym.c b/usr.bin/lex/sym.c index a201432d9..7df87492a 100644 --- a/usr.bin/lex/sym.c +++ b/usr.bin/lex/sym.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sym.c,v 1.9 2015/11/19 23:34:56 mmcc Exp $ */ +/* $OpenBSD: sym.c,v 1.10 2024/11/09 18:03:44 op Exp $ */ /* sym - symbol table routines */ @@ -74,12 +74,8 @@ static int hashfunct PROTO ((const char *, int)); * -1 is returned if the symbol already exists, and the change not made. */ -static int addsym (sym, str_def, int_def, table, table_size) - char sym[]; - char *str_def; - int int_def; - hash_table table; - int table_size; +static int addsym (char sym[], char *str_def, int int_def, hash_table table, + int table_size) { int hash_val = hashfunct (sym, table_size); struct hash_entry *sym_entry = table[hash_val]; @@ -121,9 +117,7 @@ static int addsym (sym, str_def, int_def, table, table_size) /* cclinstal - save the text of a character class */ -void cclinstal (ccltxt, cclnum) - u_char ccltxt[]; - int cclnum; +void cclinstal (unsigned char ccltxt[], int cclnum) { /* We don't bother checking the return status because we are not * called unless the symbol is new. @@ -139,8 +133,7 @@ void cclinstal (ccltxt, cclnum) * Returns 0 if there's no CCL associated with the text. */ -int ccllookup (ccltxt) - u_char ccltxt[]; +int ccllookup (unsigned char ccltxt[]) { return findsym ((char *) ccltxt, ccltab, CCL_HASH_SIZE)->int_val; } @@ -148,10 +141,8 @@ int ccllookup (ccltxt) /* findsym - find symbol in symbol table */ -static struct hash_entry *findsym (sym, table, table_size) - const char *sym; - hash_table table; - int table_size; +static struct hash_entry *findsym (const char *sym, hash_table table, + int table_size) { static struct hash_entry empty_entry = { (struct hash_entry *) 0, (struct hash_entry *) 0, @@ -172,9 +163,7 @@ static struct hash_entry *findsym (sym, table, table_size) /* hashfunct - compute the hash value for "str" and hash size "hash_size" */ -static int hashfunct (str, hash_size) - const char *str; - int hash_size; +static int hashfunct (const char *str, int hash_size) { int hashval; int locstr; @@ -193,11 +182,8 @@ static int hashfunct (str, hash_size) /* ndinstal - install a name definition */ -void ndinstal (name, definition) - const char *name; - u_char definition[]; +void ndinstal (const char *name, unsigned char definition[]) { - if (addsym (copy_string (name), (char *) copy_unsigned_string (definition), 0, ndtbl, NAME_TABLE_HASH_SIZE)) @@ -210,8 +196,7 @@ void ndinstal (name, definition) * Returns a nil pointer if the name definition does not exist. */ -u_char *ndlookup (nd) - const char *nd; +u_char *ndlookup (const char *nd) { return (u_char *) findsym (nd, ndtbl, NAME_TABLE_HASH_SIZE)->str_val; } @@ -219,7 +204,7 @@ u_char *ndlookup (nd) /* scextend - increase the maximum number of start conditions */ -void scextend () +void scextend (void) { current_max_scs += MAX_SCS_INCREMENT; @@ -239,11 +224,8 @@ void scextend () * The start condition is "exclusive" if xcluflg is true. */ -void scinstal (str, xcluflg) - const char *str; - int xcluflg; +void scinstal (const char *str, int xcluflg) { - if (++lastsc >= current_max_scs) scextend (); @@ -267,8 +249,7 @@ str); * Returns 0 if no such start condition. */ -int sclookup (str) - const char *str; +int sclookup (const char *str) { return findsym (str, sctbl, START_COND_HASH_SIZE)->int_val; } diff --git a/usr.bin/lex/tblcmp.c b/usr.bin/lex/tblcmp.c index f61ef70d0..a578da50e 100644 --- a/usr.bin/lex/tblcmp.c +++ b/usr.bin/lex/tblcmp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tblcmp.c,v 1.11 2022/12/26 19:16:01 jmc Exp $ */ +/* $OpenBSD: tblcmp.c,v 1.12 2024/11/09 18:03:44 op Exp $ */ /* tblcmp - table compression routines */ @@ -81,8 +81,7 @@ int tbldiff PROTO((int[], int, int[])); */ void -bldtbl(state, statenum, totaltrans, comstate, comfreq) - int state[], statenum, totaltrans, comstate, comfreq; +bldtbl(int state[], int statenum, int totaltrans, int comstate, int comfreq) { int extptr, extrct[2][CSIZE + 1]; int mindiff, minprot, i, d; @@ -231,7 +230,7 @@ bldtbl(state, statenum, totaltrans, comstate, comfreq) */ void -cmptmps() +cmptmps(void) { int tmpstorage[CSIZE + 1]; int *tmp = tmpstorage, i, j; @@ -299,7 +298,7 @@ cmptmps() /* expand_nxt_chk - expand the next check arrays */ void -expand_nxt_chk() +expand_nxt_chk(void) { int old_max = current_max_xpairs; @@ -334,8 +333,7 @@ expand_nxt_chk() */ int -find_table_space(state, numtrans) - int *state, numtrans; +find_table_space(int *state, int numtrans) { /* * Firstfree is the position of the first possible occurrence of two @@ -435,7 +433,7 @@ find_table_space(state, numtrans) * all "chk" entries to be zero. */ void -inittbl() +inittbl(void) { int i; @@ -467,7 +465,7 @@ inittbl() /* mkdeftbl - make the default, "jam" table entries */ void -mkdeftbl() +mkdeftbl(void) { int i; @@ -518,9 +516,7 @@ mkdeftbl() */ void -mkentry(state, numchars, statenum, deflink, totaltrans) - int *state; - int numchars, statenum, deflink, totaltrans; +mkentry(int *state, int numchars, int statenum, int deflink, int totaltrans) { int minec, maxec, i, baseaddr; int tblbase, tbllast; @@ -636,8 +632,7 @@ mkentry(state, numchars, statenum, deflink, totaltrans) */ void -mk1tbl(state, sym, onenxt, onedef) - int state, sym, onenxt, onedef; +mk1tbl(int state, int sym, int onenxt, int onedef) { if (firstfree < sym) firstfree = sym; @@ -663,8 +658,7 @@ mk1tbl(state, sym, onenxt, onedef) /* mkprot - create new proto entry */ void -mkprot(state, statenum, comstate) - int state[], statenum, comstate; +mkprot(int state[], int statenum, int comstate) { int i, slot, tblbase; @@ -701,8 +695,7 @@ mkprot(state, statenum, comstate) */ void -mktemplate(state, statenum, comstate) - int state[], statenum, comstate; +mktemplate(int state[], int statenum, int comstate) { int i, numdiff, tmpbase, tmp[CSIZE + 1]; u_char transset[CSIZE + 1]; @@ -755,8 +748,7 @@ mktemplate(state, statenum, comstate) /* mv2front - move proto queue element to front of queue */ void -mv2front(qelm) - int qelm; +mv2front(int qelm) { if (firstprot != qelm) { if (qelm == lastprot) @@ -783,8 +775,7 @@ mv2front(qelm) */ void -place_state(state, statenum, transnum) - int *state, statenum, transnum; +place_state(int *state, int statenum, int transnum) { int i; int *state_ptr; @@ -828,8 +819,7 @@ place_state(state, statenum, transnum) */ void -stack1(statenum, sym, nextstate, deflink) - int statenum, sym, nextstate, deflink; +stack1(int statenum, int sym, int nextstate, int deflink) { if (onesp >= ONE_STACK_SIZE - 1) mk1tbl(statenum, sym, nextstate, deflink); @@ -859,8 +849,7 @@ stack1(statenum, sym, nextstate, deflink) */ int -tbldiff(state, pr, ext) - int state[], pr, ext[]; +tbldiff(int state[], int pr, int ext[]) { int i, *sp = state, *ep = ext, *protp; int numdiff = 0; diff --git a/usr.bin/lex/yylex.c b/usr.bin/lex/yylex.c index e50dea258..efdc699eb 100644 --- a/usr.bin/lex/yylex.c +++ b/usr.bin/lex/yylex.c @@ -1,4 +1,4 @@ -/* $OpenBSD: yylex.c,v 1.6 2015/11/19 19:43:40 tedu Exp $ */ +/* $OpenBSD: yylex.c,v 1.7 2024/11/09 18:03:44 op Exp $ */ /* yylex - scanner front-end for flex */ @@ -40,7 +40,7 @@ /* yylex - scan for a regular expression token */ -int yylex () +int yylex (void) { int toktype; static int beglin = false; diff --git a/usr.bin/locate/locate/locate.1 b/usr.bin/locate/locate/locate.1 index a959bc613..52be480a8 100644 --- a/usr.bin/locate/locate/locate.1 +++ b/usr.bin/locate/locate/locate.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: locate.1,v 1.33 2022/08/04 06:20:24 jsg Exp $ +.\" $OpenBSD: locate.1,v 1.34 2024/12/03 07:09:14 jmc Exp $ .\" .\" Copyright (c) 1995 Wolfram Schneider . Berlin. .\" Copyright (c) 1990, 1993 @@ -30,7 +30,7 @@ .\" .\" @(#)locate.1 8.1 (Berkeley) 6/6/93 .\" -.Dd $Mdocdate: August 4 2022 $ +.Dd $Mdocdate: December 3 2024 $ .Dt LOCATE 1 .Os .Sh NAME @@ -171,7 +171,7 @@ locate database Zero matches are not considered an error. .Sh SEE ALSO .Xr find 1 , -.Xr fnmatch 3 , +.Xr glob 7 , .Xr locate.updatedb 8 , .Xr weekly 8 .Rs diff --git a/usr.bin/mail/main.c b/usr.bin/mail/main.c index f802c07f9..9ac0addff 100644 --- a/usr.bin/mail/main.c +++ b/usr.bin/mail/main.c @@ -1,4 +1,4 @@ -/* $OpenBSD: main.c,v 1.35 2021/01/26 18:21:47 deraadt Exp $ */ +/* $OpenBSD: main.c,v 1.36 2024/11/05 16:14:39 sobrado Exp $ */ /* $NetBSD: main.c,v 1.7 1997/05/13 06:15:57 mikel Exp $ */ /* @@ -336,9 +336,9 @@ setscreensize(void) __dead void usage(void) { - fprintf(stderr, "usage: %s [-dEIinv] [-b list] [-c list] " - "[-r from-addr] [-s subject] to-addr ...\n", __progname); + "[-r from-addr] [-s subject]\n" + "%*s to-addr ...\n", __progname, (int)strlen(__progname) + 7, ""); fprintf(stderr, " %s [-dEIiNnv] -f [file]\n", __progname); fprintf(stderr, " %s [-dEIiNnv] [-u user]\n", __progname); exit(1); diff --git a/usr.bin/mandoc/libmandoc.h b/usr.bin/mandoc/libmandoc.h index 354845ff6..a063cfc0b 100644 --- a/usr.bin/mandoc/libmandoc.h +++ b/usr.bin/mandoc/libmandoc.h @@ -1,4 +1,4 @@ -/* $OpenBSD: libmandoc.h,v 1.65 2021/06/27 17:57:13 schwarze Exp $ */ +/* $OpenBSD: libmandoc.h,v 1.66 2025/01/05 16:56:48 schwarze Exp $ */ /* * Copyright (c) 2013-2015,2017,2018,2020 Ingo Schwarze * Copyright (c) 2009, 2010, 2011, 2012 Kristaps Dzonsons @@ -78,6 +78,7 @@ void roff_userret(struct roff *); void roff_endparse(struct roff *); void roff_setreg(struct roff *, const char *, int, char); int roff_getreg(struct roff *, const char *); +int roff_evalnum(int, const char *, int *, int *, char, int); char *roff_strdup(const struct roff *, const char *); char *roff_getarg(struct roff *, char **, int, int *); int roff_getcontrol(const struct roff *, diff --git a/usr.bin/mandoc/mandoc.1 b/usr.bin/mandoc/mandoc.1 index 024458339..d8cc821c8 100644 --- a/usr.bin/mandoc/mandoc.1 +++ b/usr.bin/mandoc/mandoc.1 @@ -1,6 +1,6 @@ -.\" $OpenBSD: mandoc.1,v 1.193 2023/11/13 19:13:00 schwarze Exp $ +.\" $OpenBSD: mandoc.1,v 1.195 2025/01/05 18:52:03 schwarze Exp $ .\" -.\" Copyright (c) 2012, 2014-2023 Ingo Schwarze +.\" Copyright (c) 2012, 2014-2023, 2025 Ingo Schwarze .\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons .\" .\" Permission to use, copy, modify, and distribute this software for any @@ -15,7 +15,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: November 13 2023 $ +.Dd $Mdocdate: January 5 2025 $ .Dt MANDOC 1 .Os .Sh NAME @@ -1896,6 +1896,12 @@ The invalid character is discarded. A table layout specification contains an opening parenthesis, but no matching closing parenthesis. The rest of the input line, starting from the parenthesis, has no effect. +.It Sy "ignoring invalid column width in tbl layout" +.Pq tbl +A column width specifier in a table layout is empty, zero, or not a valid +numerical expression. +The width specifier is ignored and the column is made wide enough +to accommodate all its data cells. .It Sy "ignoring excessive spacing in tbl layout" .Pq tbl A spacing modifier in a table layout is unreasonably large. diff --git a/usr.bin/mandoc/mandoc.h b/usr.bin/mandoc/mandoc.h index 16493d2a2..1349fc033 100644 --- a/usr.bin/mandoc/mandoc.h +++ b/usr.bin/mandoc/mandoc.h @@ -1,6 +1,6 @@ -/* $OpenBSD: mandoc.h,v 1.224 2023/10/21 17:10:12 schwarze Exp $ */ +/* $OpenBSD: mandoc.h,v 1.225 2025/01/05 18:03:51 schwarze Exp $ */ /* - * Copyright (c) 2012-2022 Ingo Schwarze + * Copyright (c) 2012-2022, 2025 Ingo Schwarze * Copyright (c) 2010, 2011, 2014 Kristaps Dzonsons * * Permission to use, copy, modify, and distribute this software for any @@ -193,6 +193,7 @@ enum mandocerr { MANDOCERR_TBLLAYOUT_NONE, /* empty tbl layout */ MANDOCERR_TBLLAYOUT_CHAR, /* invalid character in tbl layout: char */ MANDOCERR_TBLLAYOUT_PAR, /* unmatched parenthesis in tbl layout */ + MANDOCERR_TBLLAYOUT_WIDTH, /* invalid column width in tbl layout */ MANDOCERR_TBLLAYOUT_SPC, /* ignoring excessive spacing in tbl layout */ MANDOCERR_TBLDATA_NONE, /* tbl without any data cells */ MANDOCERR_TBLDATA_SPAN, /* ignoring data in spanned tbl cell: data */ diff --git a/usr.bin/mandoc/mandoc_msg.c b/usr.bin/mandoc/mandoc_msg.c index de9665e3f..08dc63cf7 100644 --- a/usr.bin/mandoc/mandoc_msg.c +++ b/usr.bin/mandoc/mandoc_msg.c @@ -1,6 +1,6 @@ -/* $OpenBSD: mandoc_msg.c,v 1.18 2022/06/07 09:51:03 schwarze Exp $ */ +/* $OpenBSD: mandoc_msg.c,v 1.19 2025/01/05 18:03:51 schwarze Exp $ */ /* - * Copyright (c) 2014-2022 Ingo Schwarze + * Copyright (c) 2014-2022, 2025 Ingo Schwarze * Copyright (c) 2010, 2011 Kristaps Dzonsons * * Permission to use, copy, modify, and distribute this software for any @@ -190,6 +190,7 @@ static const char *const type_message[MANDOCERR_MAX] = { "empty tbl layout", "invalid character in tbl layout", "unmatched parenthesis in tbl layout", + "ignoring invalid column width in tbl layout", "ignoring excessive spacing in tbl layout", "tbl without any data cells", "ignoring data in spanned tbl cell", diff --git a/usr.bin/mandoc/out.c b/usr.bin/mandoc/out.c index e681997a1..e6a4ee91f 100644 --- a/usr.bin/mandoc/out.c +++ b/usr.bin/mandoc/out.c @@ -1,4 +1,4 @@ -/* $OpenBSD: out.c,v 1.57 2021/10/17 21:03:05 schwarze Exp $ */ +/* $OpenBSD: out.c,v 1.58 2025/01/05 18:03:51 schwarze Exp $ */ /* * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2011, 2014, 2015, 2017, 2018, 2019, 2021 @@ -115,7 +115,6 @@ void tblcalc(struct rofftbl *tbl, const struct tbl_span *sp_first, size_t offset, size_t rmargin) { - struct roffsu su; const struct tbl_opts *opts; const struct tbl_span *sp; const struct tbl_dat *dp; @@ -157,13 +156,6 @@ tblcalc(struct rofftbl *tbl, const struct tbl_span *sp_first, continue; /* Handle explicit width specifications. */ - - if (dp->layout->wstr != NULL && - dp->layout->width == 0 && - a2roffsu(dp->layout->wstr, &su, SCALE_EN) - != NULL) - dp->layout->width = - (*tbl->sulen)(&su, tbl->arg); if (col->width < dp->layout->width) col->width = dp->layout->width; if (dp->layout->spacing != SIZE_MAX && diff --git a/usr.bin/mandoc/roff.c b/usr.bin/mandoc/roff.c index 651e58223..e5c1d6195 100644 --- a/usr.bin/mandoc/roff.c +++ b/usr.bin/mandoc/roff.c @@ -1,6 +1,6 @@ -/* $OpenBSD: roff.c,v 1.272 2023/10/24 20:30:49 schwarze Exp $ */ +/* $OpenBSD: roff.c,v 1.276 2025/01/06 18:48:13 schwarze Exp $ */ /* - * Copyright (c) 2010-2015, 2017-2023 Ingo Schwarze + * Copyright (c) 2010-2015, 2017-2025 Ingo Schwarze * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons * * Permission to use, copy, modify, and distribute this software for any @@ -190,10 +190,8 @@ static int roff_ec(ROFF_ARGS); static int roff_eo(ROFF_ARGS); static int roff_eqndelim(struct roff *, struct buf *, int); static int roff_evalcond(struct roff *, int, char *, int *); -static int roff_evalnum(struct roff *, int, - const char *, int *, int *, int); -static int roff_evalpar(struct roff *, int, - const char *, int *, int *, int); +static int roff_evalpar(int, const char *, int *, int *, + char, int); static int roff_evalstrcond(const char *, int *); static int roff_expand(struct roff *, struct buf *, int, int, char); @@ -202,8 +200,8 @@ static void roff_expand_patch(struct buf *, int, static void roff_free1(struct roff *); static void roff_freereg(struct roffreg *); static void roff_freestr(struct roffkv *); -static size_t roff_getname(struct roff *, char **, int, int); -static int roff_getnum(const char *, int *, int *, int); +static size_t roff_getname(char **, int, int); +static int roff_getnum(const char *, int *, int *, char, int); static int roff_getop(const char *, int *, char *); static int roff_getregn(struct roff *, const char *, size_t, char); @@ -256,9 +254,6 @@ static int roff_userdef(ROFF_ARGS); /* --- constant data ------------------------------------------------------ */ -#define ROFFNUM_SCALE (1 << 0) /* Honour scaling in roff_getnum(). */ -#define ROFFNUM_WHITE (1 << 1) /* Skip whitespace in roff_evalnum(). */ - const char *__roff_name[MAN_MAX + 1] = { "br", "ce", "fi", "ft", "ll", "mc", "nf", @@ -1527,8 +1522,8 @@ roff_expand(struct roff *r, struct buf *buf, int ln, int pos, char ec) case 'B': npos = 0; ubuf[0] = iendarg > iarg && iend > iendarg && - roff_evalnum(r, ln, buf->buf + iarg, &npos, - NULL, ROFFNUM_SCALE) && + roff_evalnum(ln, buf->buf + iarg, &npos, + NULL, 'u', 0) && npos == iendarg - iarg ? '1' : '0'; ubuf[1] = '\0'; res = ubuf; @@ -2000,7 +1995,7 @@ roff_parse(struct roff *r, char *buf, int *pos, int ln, int ppos) return TOKEN_NONE; mac = cp; - maclen = roff_getname(r, &cp, ln, ppos); + maclen = roff_getname(&cp, ln, ppos); deftype = ROFFDEF_USER | ROFFDEF_REN; r->current_string = roff_getstrn(r, mac, maclen, &deftype); @@ -2153,7 +2148,7 @@ roff_block(ROFF_ARGS) namesz = 0; } else { iname = cp; - namesz = roff_getname(r, &cp, ln, ppos); + namesz = roff_getname(&cp, ln, ppos); iname[namesz] = '\0'; } @@ -2224,7 +2219,7 @@ roff_block(ROFF_ARGS) /* Get the custom end marker. */ iname = cp; - namesz = roff_getname(r, &cp, ln, ppos); + namesz = roff_getname(&cp, ln, ppos); /* Resolve the end marker if it is indirect. */ @@ -2425,74 +2420,78 @@ roff_cond_text(ROFF_ARGS) /* --- handling of numeric and conditional expressions -------------------- */ /* - * Parse a single signed integer number. Stop at the first non-digit. + * Parse a single signed decimal number. Stop at the first non-digit. * If there is at least one digit, return success and advance the * parse point, else return failure and let the parse point unchanged. * Ignore overflows, treat them just like the C language. */ static int -roff_getnum(const char *v, int *pos, int *res, int flags) +roff_getnum(const char *v, int *pos, int *res, char unit, int skipspace) { - int myres, scaled, n, p; - - if (NULL == res) - res = &myres; + double frac, myres; + int n, p; p = *pos; n = v[p] == '-'; if (n || v[p] == '+') p++; - if (flags & ROFFNUM_WHITE) + if (skipspace) while (isspace((unsigned char)v[p])) p++; - for (*res = 0; isdigit((unsigned char)v[p]); p++) - *res = 10 * *res + v[p] - '0'; + for (myres = 0.0; isdigit((unsigned char)v[p]); p++) + myres = myres * 10.0 + (v[p] - '0'); + if (v[p] == '.') + for (frac = 0.1; isdigit((unsigned char)v[++p]); frac *= 0.1) + myres += frac * (v[p] - '0'); + if (p == *pos + n) return 0; if (n) - *res = -*res; + myres *= -1.0; /* Each number may be followed by one optional scaling unit. */ - switch (v[p]) { + if (v[p] != '\0' && strchr("ficvPmnpuM", v[p]) != NULL) { + if (unit != '\0') + unit = v[p]; + p++; + } + + switch (unit) { case 'f': - scaled = *res * 65536; + myres *= 65536.0; break; case 'i': - scaled = *res * 240; + myres *= 240.0; break; case 'c': - scaled = *res * 240 / 2.54; + myres *= 240.0 / 2.54; break; case 'v': case 'P': - scaled = *res * 40; + myres *= 40.0; break; case 'm': case 'n': - scaled = *res * 24; + myres *= 24.0; break; case 'p': - scaled = *res * 10 / 3; + myres *= 40.0 / 12.0; break; case 'u': - scaled = *res; break; case 'M': - scaled = *res * 6 / 25; + myres *= 24.0 / 100.0; break; default: - scaled = *res; - p--; break; } - if (flags & ROFFNUM_SCALE) - *res = scaled; - - *pos = p + 1; + if (res != NULL) + *res = myres; + *pos = p; return 1; } @@ -2614,7 +2613,7 @@ roff_evalcond(struct roff *r, int ln, char *v, int *pos) while (*cp == ' ') cp++; name = cp; - sz = roff_getname(r, &cp, ln, cp - v); + sz = roff_getname(&cp, ln, cp - v); if (sz == 0) istrue = 0; else if (v[*pos] == 'r') @@ -2631,7 +2630,7 @@ roff_evalcond(struct roff *r, int ln, char *v, int *pos) } savepos = *pos; - if (roff_evalnum(r, ln, v, pos, &number, ROFFNUM_SCALE)) + if (roff_evalnum(ln, v, pos, &number, 'u', 0)) return (number > 0) == wanttrue; else if (*pos == savepos) return roff_evalstrcond(v, pos) == wanttrue; @@ -2769,7 +2768,7 @@ roff_ds(ROFF_ARGS) if (*name == '\0') return ROFF_IGN; - namesz = roff_getname(r, &string, ln, pos); + namesz = roff_getname(&string, ln, pos); switch (name[namesz]) { case '\\': return ROFF_IGN; @@ -2860,15 +2859,15 @@ roff_getop(const char *v, int *pos, char *res) * or a single signed integer number. */ static int -roff_evalpar(struct roff *r, int ln, - const char *v, int *pos, int *res, int flags) +roff_evalpar(int ln, const char *v, int *pos, int *res, char unit, + int skipspace) { if ('(' != v[*pos]) - return roff_getnum(v, pos, res, flags); + return roff_getnum(v, pos, res, unit, skipspace); (*pos)++; - if ( ! roff_evalnum(r, ln, v, pos, res, flags | ROFFNUM_WHITE)) + if ( ! roff_evalnum(ln, v, pos, res, unit, 1)) return 0; /* @@ -2889,9 +2888,9 @@ roff_evalpar(struct roff *r, int ln, * Evaluate a complete numeric expression. * Proceed left to right, there is no concept of precedence. */ -static int -roff_evalnum(struct roff *r, int ln, const char *v, - int *pos, int *res, int flags) +int +roff_evalnum(int ln, const char *v, int *pos, int *res, char unit, + int skipspace) { int mypos, operand2; char operator; @@ -2901,29 +2900,29 @@ roff_evalnum(struct roff *r, int ln, const char *v, pos = &mypos; } - if (flags & ROFFNUM_WHITE) + if (skipspace) while (isspace((unsigned char)v[*pos])) (*pos)++; - if ( ! roff_evalpar(r, ln, v, pos, res, flags)) + if ( ! roff_evalpar(ln, v, pos, res, unit, skipspace)) return 0; while (1) { - if (flags & ROFFNUM_WHITE) + if (skipspace) while (isspace((unsigned char)v[*pos])) (*pos)++; if ( ! roff_getop(v, pos, &operator)) break; - if (flags & ROFFNUM_WHITE) + if (skipspace) while (isspace((unsigned char)v[*pos])) (*pos)++; - if ( ! roff_evalpar(r, ln, v, pos, &operand2, flags)) + if ( ! roff_evalpar(ln, v, pos, &operand2, unit, skipspace)) return 0; - if (flags & ROFFNUM_WHITE) + if (skipspace) while (isspace((unsigned char)v[*pos])) (*pos)++; @@ -3060,6 +3059,8 @@ roff_getregro(const struct roff *r, const char *name) return 24; case 'j': /* Always adjust left margin only. */ return 0; + case 'l': /* Fixed line width for DocBook. */ + return 78 * 24; case 'T': /* Some output device is always defined. */ return 1; case 'V': /* Fixed vertical resolution. */ @@ -3153,7 +3154,7 @@ roff_nr(ROFF_ARGS) if (*key == '\0') return ROFF_IGN; - keysz = roff_getname(r, &val, ln, pos); + keysz = roff_getname(&val, ln, pos); if (key[keysz] == '\\' || key[keysz] == '\t') return ROFF_IGN; @@ -3162,13 +3163,13 @@ roff_nr(ROFF_ARGS) val++; len = 0; - if (roff_evalnum(r, ln, val, &len, &iv, ROFFNUM_SCALE) == 0) + if (roff_evalnum(ln, val, &len, &iv, 'u', 0) == 0) return ROFF_IGN; step = val + len; while (isspace((unsigned char)*step)) step++; - if (roff_evalnum(r, ln, step, NULL, &is, 0) == 0) + if (roff_evalnum(ln, step, NULL, &is, '\0', 0) == 0) is = INT_MIN; roff_setregn(r, key, keysz, iv, sign, is); @@ -3185,7 +3186,7 @@ roff_rr(ROFF_ARGS) name = cp = buf->buf + pos; if (*name == '\0') return ROFF_IGN; - namesz = roff_getname(r, &cp, ln, pos); + namesz = roff_getname(&cp, ln, pos); name[namesz] = '\0'; prev = &r->regtab; @@ -3215,7 +3216,7 @@ roff_rm(ROFF_ARGS) cp = buf->buf + pos; while (*cp != '\0') { name = cp; - namesz = roff_getname(r, &cp, ln, (int)(cp - buf->buf)); + namesz = roff_getname(&cp, ln, (int)(cp - buf->buf)); roff_setstrn(&r->strtab, name, namesz, NULL, 0, 0); roff_setstrn(&r->rentab, name, namesz, NULL, 0, 0); if (name[namesz] == '\\' || name[namesz] == '\t') @@ -3231,7 +3232,7 @@ roff_it(ROFF_ARGS) /* Parse the number of lines. */ - if ( ! roff_evalnum(r, ln, buf->buf, &pos, &iv, 0)) { + if ( ! roff_evalnum(ln, buf->buf, &pos, &iv, '\0', 0)) { mandoc_msg(MANDOCERR_IT_NONUM, ln, ppos, "%s", buf->buf + 1); return ROFF_IGN; @@ -3498,8 +3499,8 @@ roff_onearg(ROFF_ARGS) r->man->last->flags |= NODE_NOSRC; } npos = 0; - if (roff_evalnum(r, ln, r->man->last->string, &npos, - &roffce_lines, 0) == 0) { + if (roff_evalnum(ln, r->man->last->string, &npos, + &roffce_lines, '\0', 0) == 0) { mandoc_msg(MANDOCERR_CE_NONUM, ln, pos, "ce %s", buf->buf + pos); roffce_lines = 1; @@ -3552,12 +3553,12 @@ roff_als(ROFF_ARGS) if (*newn == '\0') return ROFF_IGN; - newsz = roff_getname(r, &oldn, ln, pos); + newsz = roff_getname(&oldn, ln, pos); if (newn[newsz] == '\\' || newn[newsz] == '\t' || *oldn == '\0') return ROFF_IGN; end = oldn; - oldsz = roff_getname(r, &end, ln, oldn - buf->buf); + oldsz = roff_getname(&end, ln, oldn - buf->buf); if (oldsz == 0) return ROFF_IGN; @@ -3834,12 +3835,12 @@ roff_rn(ROFF_ARGS) if (*oldn == '\0') return ROFF_IGN; - oldsz = roff_getname(r, &newn, ln, pos); + oldsz = roff_getname(&newn, ln, pos); if (oldn[oldsz] == '\\' || oldn[oldsz] == '\t' || *newn == '\0') return ROFF_IGN; end = newn; - newsz = roff_getname(r, &end, ln, newn - buf->buf); + newsz = roff_getname(&end, ln, newn - buf->buf); if (newsz == 0) return ROFF_IGN; @@ -3881,7 +3882,7 @@ roff_shift(ROFF_ARGS) argpos = pos; levels = 1; if (buf->buf[pos] != '\0' && - roff_evalnum(r, ln, buf->buf, &pos, &levels, 0) == 0) { + roff_evalnum(ln, buf->buf, &pos, &levels, '\0', 0) == 0) { mandoc_msg(MANDOCERR_CE_NONUM, ln, pos, "shift %s", buf->buf + pos); levels = 1; @@ -4024,7 +4025,7 @@ roff_renamed(ROFF_ARGS) * and advance the pointer to the next word. */ static size_t -roff_getname(struct roff *r, char **cpp, int ln, int pos) +roff_getname(char **cpp, int ln, int pos) { char *name, *cp; int namesz, inam, iend; diff --git a/usr.bin/mandoc/st.c b/usr.bin/mandoc/st.c index 97c8f8bd2..bc4cfc975 100644 --- a/usr.bin/mandoc/st.c +++ b/usr.bin/mandoc/st.c @@ -1,4 +1,4 @@ -/* $OpenBSD: st.c,v 1.15 2024/06/16 18:33:05 job Exp $ */ +/* $OpenBSD: st.c,v 1.16 2025/01/02 13:32:36 schwarze Exp $ */ /* * Copyright (c) 2009, 2010 Kristaps Dzonsons * @@ -52,6 +52,7 @@ LINE("-isoC-tcor1", "ISO/IEC 9899/TCOR1:1994 (\\(lqISO\\~C90, Technical Corrigen LINE("-isoC-tcor2", "ISO/IEC 9899/TCOR2:1995 (\\(lqISO\\~C90, Technical Corrigendum 2\\(rq)") LINE("-isoC-99", "ISO/IEC 9899:1999 (\\(lqISO\\~C99\\(rq)") LINE("-isoC-2011", "ISO/IEC 9899:2011 (\\(lqISO\\~C11\\(rq)") +LINE("-isoC-2023", "ISO/IEC 9899:2024 (\\(lqISO\\~C23\\(rq)") LINE("-iso9945-1-90", "ISO/IEC 9945-1:1990 (\\(lqPOSIX.1\\(rq)") LINE("-iso9945-1-96", "ISO/IEC 9945-1:1996 (\\(lqPOSIX.1\\(rq)") LINE("-iso9945-2-93", "ISO/IEC 9945-2:1993 (\\(lqPOSIX.2\\(rq)") diff --git a/usr.bin/mandoc/tbl.c b/usr.bin/mandoc/tbl.c index a3da958bd..4915a24e2 100644 --- a/usr.bin/mandoc/tbl.c +++ b/usr.bin/mandoc/tbl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tbl.c,v 1.27 2018/12/14 06:33:03 schwarze Exp $ */ +/* $OpenBSD: tbl.c,v 1.28 2025/01/05 18:03:51 schwarze Exp $ */ /* * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2011, 2015 Ingo Schwarze @@ -116,7 +116,6 @@ tbl_free(struct tbl_node *tbl) while (rp->first != NULL) { cp = rp->first; rp->first = cp->next; - free(cp->wstr); free(cp); } free(rp); diff --git a/usr.bin/mandoc/tbl.h b/usr.bin/mandoc/tbl.h index 9880d40d8..c60a82787 100644 --- a/usr.bin/mandoc/tbl.h +++ b/usr.bin/mandoc/tbl.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tbl.h,v 1.6 2021/08/10 12:36:42 schwarze Exp $ */ +/* $OpenBSD: tbl.h,v 1.7 2025/01/05 18:03:51 schwarze Exp $ */ /* * Copyright (c) 2010, 2011 Kristaps Dzonsons * Copyright (c) 2014,2015,2017,2018,2021 Ingo Schwarze @@ -51,7 +51,6 @@ enum tbl_cellt { */ struct tbl_cell { struct tbl_cell *next; /* Layout cell to the right. */ - char *wstr; /* Min width represented as a string. */ size_t width; /* Minimum column width. */ size_t spacing; /* To the right of the column. */ int vert; /* Width of subsequent vertical line. */ diff --git a/usr.bin/mandoc/tbl_layout.c b/usr.bin/mandoc/tbl_layout.c index c7f7e7d98..885005319 100644 --- a/usr.bin/mandoc/tbl_layout.c +++ b/usr.bin/mandoc/tbl_layout.c @@ -1,8 +1,8 @@ -/* $OpenBSD: tbl_layout.c,v 1.37 2021/08/10 12:36:42 schwarze Exp $ */ +/* $OpenBSD: tbl_layout.c,v 1.38 2025/01/05 18:03:51 schwarze Exp $ */ /* - * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons - * Copyright (c) 2012, 2014, 2015, 2017, 2020, 2021 + * Copyright (c) 2012, 2014, 2015, 2017, 2020, 2021, 2025 * Ingo Schwarze + * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -65,7 +65,6 @@ mods(struct tbl_node *tbl, struct tbl_cell *cp, { char *endptr; unsigned long spacing; - size_t sz; int isz; enum mandoc_esc fontesc; @@ -136,20 +135,27 @@ mod: cp->flags |= TBL_CELL_UP; goto mod; case 'w': - sz = 0; if (p[*pos] == '(') { (*pos)++; - while (p[*pos + sz] != '\0' && p[*pos + sz] != ')') - sz++; - } else - while (isdigit((unsigned char)p[*pos + sz])) - sz++; - if (sz) { - free(cp->wstr); - cp->wstr = mandoc_strndup(p + *pos, sz); - *pos += sz; - if (p[*pos] == ')') + isz = 0; + if (roff_evalnum(ln, p, pos, &isz, 'n', 1) == 0 || + p[*pos] != ')') + mandoc_msg(MANDOCERR_TBLLAYOUT_WIDTH, + ln, *pos, "%s", p + *pos); + else { + /* Convert from BU to EN and round. */ + cp->width = (isz + 11) /24; (*pos)++; + } + } else { + cp->width = 0; + while (isdigit((unsigned char)p[*pos])) { + cp->width *= 10; + cp->width += p[(*pos)++] - '0'; + } + if (cp->width == 0) + mandoc_msg(MANDOCERR_TBLLAYOUT_WIDTH, + ln, *pos, "%s", p + *pos); } goto mod; case 'x': diff --git a/usr.bin/nc/netcat.c b/usr.bin/nc/netcat.c index a25c4f175..8c60fd188 100644 --- a/usr.bin/nc/netcat.c +++ b/usr.bin/nc/netcat.c @@ -1,4 +1,4 @@ -/* $OpenBSD: netcat.c,v 1.228 2024/08/05 07:16:30 tb Exp $ */ +/* $OpenBSD: netcat.c,v 1.229 2024/11/02 17:19:27 tb Exp $ */ /* * Copyright (c) 2001 Eric Jackson * Copyright (c) 2015 Bob Beck. All rights reserved. @@ -1367,7 +1367,7 @@ fdpass(int nfd) memset(&cmsgbuf, 0, sizeof(cmsgbuf)); memset(&iov, 0, sizeof(iov)); - mh.msg_control = (caddr_t)&cmsgbuf.buf; + mh.msg_control = &cmsgbuf.buf; mh.msg_controllen = sizeof(cmsgbuf.buf); cmsg = CMSG_FIRSTHDR(&mh); cmsg->cmsg_len = CMSG_LEN(sizeof(int)); diff --git a/usr.bin/newsyslog/newsyslog.8 b/usr.bin/newsyslog/newsyslog.8 index 9e3f84a0b..391c7c3d9 100644 --- a/usr.bin/newsyslog/newsyslog.8 +++ b/usr.bin/newsyslog/newsyslog.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: newsyslog.8,v 1.55 2024/04/22 14:16:14 jmc Exp $ +.\" $OpenBSD: newsyslog.8,v 1.56 2024/10/30 09:16:24 jan Exp $ .\" .\" Copyright (c) 1997, Jason Downs. All rights reserved. .\" @@ -41,7 +41,7 @@ .\" the suitability of this software for any purpose. It is .\" provided "as is" without express or implied warranty. .\" -.Dd $Mdocdate: April 22 2024 $ +.Dd $Mdocdate: October 30 2024 $ .Dt NEWSYSLOG 8 .Os .Sh NAME @@ -253,6 +253,14 @@ If an interval is specified, the log file will be trimmed if that many hours have passed since the last rotation. When both a time and an interval are specified, both conditions must be satisfied for the rotation to take place. +If the +.Ar size +field is set and not +.Ql * +or +.Ql 0 , +the file will be rotated either if the size is +exceeded or the specified time or interval is reached. .Pp There is no provision for the specification of a time zone. There is little point in specifying an explicit minutes or seconds diff --git a/usr.bin/newsyslog/newsyslog.c b/usr.bin/newsyslog/newsyslog.c index 852f1dfac..9274ecf83 100644 --- a/usr.bin/newsyslog/newsyslog.c +++ b/usr.bin/newsyslog/newsyslog.c @@ -1,4 +1,4 @@ -/* $OpenBSD: newsyslog.c,v 1.114 2024/04/22 14:20:35 millert Exp $ */ +/* $OpenBSD: newsyslog.c,v 1.115 2024/10/30 09:16:24 jan Exp $ */ /* * Copyright (c) 1999, 2002, 2003 Todd C. Miller @@ -284,6 +284,7 @@ do_entry(struct conf_entry *ent) struct stat sb; int modhours; off_t size; + int oversized; if (lstat(ent->log, &sb) != 0) return; @@ -307,8 +308,9 @@ do_entry(struct conf_entry *ent) (ent->flags & CE_FOLLOW) ? "F" : "", (ent->flags & CE_MONITOR) && monitormode ? "M" : "")); size = sizefile(&sb); + oversized = (ent->size > 0 && size >= ent->size); modhours = age_old_log(ent); - if (ent->flags & CE_TRIMAT && !force) { + if (ent->flags & CE_TRIMAT && !force && !oversized) { if (timenow < ent->trim_at || difftime(timenow, ent->trim_at) >= 60 * 60) { DPRINTF(("--> will trim at %s", @@ -326,7 +328,7 @@ do_entry(struct conf_entry *ent) if (monitormode && (ent->flags & CE_MONITOR) && domonitor(ent)) DPRINTF(("--> monitored\n")); else if (!monitormode && - (force || (ent->size > 0 && size >= ent->size) || + (force || oversized || (ent->hours <= 0 && (ent->flags & CE_TRIMAT)) || (ent->hours > 0 && (modhours >= ent->hours || modhours < 0) && ((ent->flags & CE_BINARY) || size >= MIN_SIZE)))) { diff --git a/usr.bin/openssl/apps.c b/usr.bin/openssl/apps.c index a04190910..7c98f1e70 100644 --- a/usr.bin/openssl/apps.c +++ b/usr.bin/openssl/apps.c @@ -1,4 +1,4 @@ -/* $OpenBSD: apps.c,v 1.69 2024/08/29 17:01:02 tb Exp $ */ +/* $OpenBSD: apps.c,v 1.70 2025/01/03 09:14:42 tb Exp $ */ /* * Copyright (c) 2014 Joel Sing * @@ -1891,7 +1891,7 @@ pkey_ctrl_string(EVP_PKEY_CTX *ctx, char *value) * in a format suitable for passing to SSL_CTX_set_next_protos_advertised. * outlen: (output) set to the length of the resulting buffer on success. * err: (maybe NULL) on failure, an error message line is written to this BIO. - * in: a NUL termianted string like "abc,def,ghi" + * in: a NUL terminated string like "abc,def,ghi" * * returns: a malloced buffer or NULL on failure. */ diff --git a/usr.bin/openssl/apps.h b/usr.bin/openssl/apps.h index a30706e36..cd218fd1b 100644 --- a/usr.bin/openssl/apps.h +++ b/usr.bin/openssl/apps.h @@ -1,4 +1,4 @@ -/* $OpenBSD: apps.h,v 1.38 2024/08/29 17:01:02 tb Exp $ */ +/* $OpenBSD: apps.h,v 1.42 2025/01/02 13:11:26 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -126,8 +126,14 @@ #include #endif +#include + #include +/* numbers in us */ +#define DGRAM_RCV_TIMEOUT 250000 +#define DGRAM_SND_TIMEOUT 250000 + extern CONF *config; extern char *default_config_file; extern BIO *bio_err; @@ -315,4 +321,81 @@ int options_parse(int argc, char **argv, const struct option *opts, char **unnamed, int *argsused); void show_cipher(const OBJ_NAME *name, void *arg); + +int asn1parse_main(int argc, char **argv); +int ca_main(int argc, char **argv); +int certhash_main(int argc, char **argv); +int ciphers_main(int argc, char **argv); +int cms_main(int argc, char **argv); +int crl2pkcs7_main(int argc, char **argv); +int crl_main(int argc, char **argv); +int dgst_main(int argc, char **argv); +int dh_main(int argc, char **argv); +int dhparam_main(int argc, char **argv); +int dsa_main(int argc, char **argv); +int dsaparam_main(int argc, char **argv); +int ec_main(int argc, char **argv); +int ecparam_main(int argc, char **argv); +int enc_main(int argc, char **argv); +int errstr_main(int argc, char **argv); +int gendh_main(int argc, char **argv); +int gendsa_main(int argc, char **argv); +int genpkey_main(int argc, char **argv); +int genrsa_main(int argc, char **argv); +int ocsp_main(int argc, char **argv); +int passwd_main(int argc, char **argv); +int pkcs7_main(int argc, char **argv); +int pkcs8_main(int argc, char **argv); +int pkcs12_main(int argc, char **argv); +int pkey_main(int argc, char **argv); +int pkeyparam_main(int argc, char **argv); +int pkeyutl_main(int argc, char **argv); +int prime_main(int argc, char **argv); +int rand_main(int argc, char **argv); +int req_main(int argc, char **argv); +int rsa_main(int argc, char **argv); +int rsautl_main(int argc, char **argv); +int s_client_main(int argc, char **argv); +int s_server_main(int argc, char **argv); +int s_time_main(int argc, char **argv); +int sess_id_main(int argc, char **argv); +int smime_main(int argc, char **argv); +int speed_main(int argc, char **argv); +int ts_main(int argc, char **argv); +int verify_main(int argc, char **argv); +int version_main(int argc, char **argv); +int x509_main(int argc, char **argv); + +#define PORT 4433 +#define PORT_STR "4433" +#define PROTOCOL "tcp" + +extern int verify_depth; +extern int verify_return_error; + +int do_server(int port, int type, int *ret, + int (*cb)(int s, unsigned char *context), + unsigned char *context, int naccept); +int verify_callback(int ok, X509_STORE_CTX *ctx); +int set_cert_stuff(SSL_CTX *ctx, char *cert_file, char *key_file); +int set_cert_key_stuff(SSL_CTX *ctx, X509 *cert, EVP_PKEY *key); +int ssl_print_tmp_key(BIO *out, SSL *s); +int init_client(int *sock, char *server, char *port, int type, int af); +int extract_port(char *str, short *port_ptr); +int extract_host_port(char *str, char **host_ptr, unsigned char *ip, char **p); + +long bio_dump_callback(BIO *bio, int cmd, const char *argp, int argi, + long argl, long ret); + +void apps_ssl_info_callback(const SSL *s, int where, int ret); +void msg_cb(int write_p, int version, int content_type, const void *buf, + size_t len, SSL *ssl, void *arg); +void tlsext_cb(SSL *s, int client_server, int type, unsigned char *data, + int len, void *arg); + +int generate_cookie_callback(SSL *ssl, unsigned char *cookie, + unsigned int *cookie_len); +int verify_cookie_callback(SSL *ssl, const unsigned char *cookie, + unsigned int cookie_len); + #endif diff --git a/usr.bin/openssl/asn1pars.c b/usr.bin/openssl/asn1pars.c index 6b9984233..355784169 100644 --- a/usr.bin/openssl/asn1pars.c +++ b/usr.bin/openssl/asn1pars.c @@ -1,4 +1,4 @@ -/* $OpenBSD: asn1pars.c,v 1.16 2023/07/23 11:39:29 tb Exp $ */ +/* $OpenBSD: asn1pars.c,v 1.17 2025/01/02 12:31:44 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -66,7 +66,6 @@ #include #include "apps.h" -#include "progs.h" #include #include diff --git a/usr.bin/openssl/ciphers.c b/usr.bin/openssl/ciphers.c index 247929bb9..9549fa360 100644 --- a/usr.bin/openssl/ciphers.c +++ b/usr.bin/openssl/ciphers.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ciphers.c,v 1.18 2023/03/06 14:32:05 tb Exp $ */ +/* $OpenBSD: ciphers.c,v 1.20 2025/01/02 12:31:44 tb Exp $ */ /* * Copyright (c) 2014 Joel Sing * @@ -22,7 +22,6 @@ #include #include "apps.h" -#include "progs.h" static struct { int usage; @@ -48,20 +47,6 @@ static const struct option ciphers_options[] = { .type = OPTION_FLAG, .opt.flag = &cfg.use_supported, }, - { - .name = "tls1", - .desc = "Use TLS protocol version 1", - .type = OPTION_VALUE, - .opt.value = &cfg.version, - .value = TLS1_VERSION, - }, - { - .name = "tls1_1", - .desc = "Use TLS protocol version 1.1", - .type = OPTION_VALUE, - .opt.value = &cfg.version, - .value = TLS1_1_VERSION, - }, { .name = "tls1_2", .desc = "Use TLS protocol version 1.2", @@ -96,7 +81,7 @@ static const struct option ciphers_options[] = { static void ciphers_usage(void) { - fprintf(stderr, "usage: ciphers [-hsVv] [-tls1] [-tls1_1] [-tls1_2] " + fprintf(stderr, "usage: ciphers [-hsVv] [-tls1_2] " "[-tls1_3] [cipherlist]\n"); options_usage(ciphers_options); } diff --git a/usr.bin/openssl/crl2p7.c b/usr.bin/openssl/crl2p7.c index dfbc896a2..697d9ca96 100644 --- a/usr.bin/openssl/crl2p7.c +++ b/usr.bin/openssl/crl2p7.c @@ -1,4 +1,4 @@ -/* $OpenBSD: crl2p7.c,v 1.11 2023/03/06 14:32:05 tb Exp $ */ +/* $OpenBSD: crl2p7.c,v 1.12 2024/12/26 14:07:58 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -229,8 +229,9 @@ crl2pkcs7_main(int argc, char **argv) goto end; p7s->crl = crl_stack; if (crl != NULL) { - sk_X509_CRL_push(crl_stack, crl); - crl = NULL; /* now part of p7 for freeing */ + if (!sk_X509_CRL_push(crl_stack, crl)) + goto end; + crl = NULL; } if ((cert_stack = sk_X509_new_null()) == NULL) goto end; @@ -248,8 +249,6 @@ crl2pkcs7_main(int argc, char **argv) } } - sk_OPENSSL_STRING_free(cfg.certflst); - if (cfg.outfile == NULL) { BIO_set_fp(out, stdout, BIO_NOCLOSE); } else { @@ -273,19 +272,17 @@ crl2pkcs7_main(int argc, char **argv) ERR_print_errors(bio_err); goto end; } + ret = 0; end: - if (in != NULL) - BIO_free(in); - if (out != NULL) - BIO_free_all(out); - if (p7 != NULL) - PKCS7_free(p7); - if (crl != NULL) - X509_CRL_free(crl); + BIO_free(in); + BIO_free_all(out); + PKCS7_free(p7); + X509_CRL_free(crl); + sk_OPENSSL_STRING_free(cfg.certflst); - return (ret); + return ret; } static int @@ -295,7 +292,7 @@ add_certs_from_file(STACK_OF(X509) *stack, char *certfile) int count = 0; int ret = -1; STACK_OF(X509_INFO) *sk = NULL; - X509_INFO *xi; + X509_INFO *xi = NULL; in = BIO_new(BIO_s_file()); if (in == NULL || BIO_read_filename(in, certfile) <= 0) { @@ -309,23 +306,24 @@ add_certs_from_file(STACK_OF(X509) *stack, char *certfile) goto end; } /* scan over it and pull out the CRL's */ - while (sk_X509_INFO_num(sk)) { + while (sk_X509_INFO_num(sk) > 0) { xi = sk_X509_INFO_shift(sk); if (xi->x509 != NULL) { - sk_X509_push(stack, xi->x509); + if (!sk_X509_push(stack, xi->x509)) + goto end; xi->x509 = NULL; count++; } X509_INFO_free(xi); + xi = NULL; } ret = count; end: - /* never need to free x */ - if (in != NULL) - BIO_free(in); - if (sk != NULL) - sk_X509_INFO_free(sk); - return (ret); + BIO_free(in); + X509_INFO_free(xi); + sk_X509_INFO_free(sk); + + return ret; } diff --git a/usr.bin/openssl/openssl.c b/usr.bin/openssl/openssl.c index adafb0bc7..75a0e4d26 100644 --- a/usr.bin/openssl/openssl.c +++ b/usr.bin/openssl/openssl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: openssl.c,v 1.37 2024/07/08 05:59:10 tb Exp $ */ +/* $OpenBSD: openssl.c,v 1.39 2025/01/02 13:10:03 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -127,9 +127,6 @@ #include #include -#include "progs.h" -#include "s_apps.h" - #define FUNC_TYPE_GENERAL 1 #define FUNC_TYPE_MD 2 #define FUNC_TYPE_CIPHER 3 diff --git a/usr.bin/openssl/pkcs12.c b/usr.bin/openssl/pkcs12.c index 69e230eff..1407a96e0 100644 --- a/usr.bin/openssl/pkcs12.c +++ b/usr.bin/openssl/pkcs12.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pkcs12.c,v 1.28 2024/08/22 12:14:33 tb Exp $ */ +/* $OpenBSD: pkcs12.c,v 1.29 2024/12/26 14:10:48 tb Exp $ */ /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project. */ @@ -653,8 +653,16 @@ pkcs12_main(int argc, char **argv) cfg.certfile, FORMAT_PEM, NULL, "certificates from certfile")) == NULL) goto export_end; - while (sk_X509_num(morecerts) > 0) - sk_X509_push(certs, sk_X509_shift(morecerts)); + while (sk_X509_num(morecerts) > 0) { + X509 *cert = sk_X509_shift(morecerts); + + if (!sk_X509_push(certs, cert)) { + X509_free(cert); + sk_X509_pop_free(morecerts, X509_free); + goto export_end; + } + } + sk_X509_free(morecerts); } @@ -678,11 +686,18 @@ pkcs12_main(int argc, char **argv) if (vret == X509_V_OK) { /* Exclude verified certificate */ - for (i = 1; i < sk_X509_num(chain2); i++) - sk_X509_push(certs, sk_X509_value( - chain2, i)); - /* Free first certificate */ - X509_free(sk_X509_value(chain2, 0)); + X509_free(sk_X509_shift(chain2)); + + while (sk_X509_num(chain2) > 0) { + X509 *cert = sk_X509_shift(chain2); + + if (!sk_X509_push(certs, cert)) { + X509_free(cert); + sk_X509_pop_free(chain2, + X509_free); + goto export_end; + } + } sk_X509_free(chain2); } else { if (vret != X509_V_ERR_UNSPECIFIED) @@ -692,6 +707,7 @@ pkcs12_main(int argc, char **argv) vret)); else ERR_print_errors(bio_err); + sk_X509_pop_free(chain2, X509_free); goto export_end; } } diff --git a/usr.bin/openssl/pkcs8.c b/usr.bin/openssl/pkcs8.c index 9776b9105..10fad7aed 100644 --- a/usr.bin/openssl/pkcs8.c +++ b/usr.bin/openssl/pkcs8.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pkcs8.c,v 1.17 2023/07/23 11:39:29 tb Exp $ */ +/* $OpenBSD: pkcs8.c,v 1.18 2025/01/02 12:31:44 tb Exp $ */ /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project 1999-2004. */ @@ -60,7 +60,6 @@ #include #include "apps.h" -#include "progs.h" #include #include diff --git a/usr.bin/openssl/progs.h b/usr.bin/openssl/progs.h deleted file mode 100644 index 6cbc9d7b5..000000000 --- a/usr.bin/openssl/progs.h +++ /dev/null @@ -1,46 +0,0 @@ -/* $OpenBSD: progs.h,v 1.11 2024/07/08 05:59:10 tb Exp $ */ -/* Public domain */ - -int asn1parse_main(int argc, char **argv); -int ca_main(int argc, char **argv); -int certhash_main(int argc, char **argv); -int ciphers_main(int argc, char **argv); -int cms_main(int argc, char **argv); -int crl2pkcs7_main(int argc, char **argv); -int crl_main(int argc, char **argv); -int dgst_main(int argc, char **argv); -int dh_main(int argc, char **argv); -int dhparam_main(int argc, char **argv); -int dsa_main(int argc, char **argv); -int dsaparam_main(int argc, char **argv); -int ec_main(int argc, char **argv); -int ecparam_main(int argc, char **argv); -int enc_main(int argc, char **argv); -int errstr_main(int argc, char **argv); -int gendh_main(int argc, char **argv); -int gendsa_main(int argc, char **argv); -int genpkey_main(int argc, char **argv); -int genrsa_main(int argc, char **argv); -int ocsp_main(int argc, char **argv); -int passwd_main(int argc, char **argv); -int pkcs7_main(int argc, char **argv); -int pkcs8_main(int argc, char **argv); -int pkcs12_main(int argc, char **argv); -int pkey_main(int argc, char **argv); -int pkeyparam_main(int argc, char **argv); -int pkeyutl_main(int argc, char **argv); -int prime_main(int argc, char **argv); -int rand_main(int argc, char **argv); -int req_main(int argc, char **argv); -int rsa_main(int argc, char **argv); -int rsautl_main(int argc, char **argv); -int s_client_main(int argc, char **argv); -int s_server_main(int argc, char **argv); -int s_time_main(int argc, char **argv); -int sess_id_main(int argc, char **argv); -int smime_main(int argc, char **argv); -int speed_main(int argc, char **argv); -int ts_main(int argc, char **argv); -int verify_main(int argc, char **argv); -int version_main(int argc, char **argv); -int x509_main(int argc, char **argv); diff --git a/usr.bin/openssl/rsa.c b/usr.bin/openssl/rsa.c index 5492cd616..a98ae8be9 100644 --- a/usr.bin/openssl/rsa.c +++ b/usr.bin/openssl/rsa.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rsa.c,v 1.19 2023/07/23 11:39:29 tb Exp $ */ +/* $OpenBSD: rsa.c,v 1.20 2025/01/02 12:31:44 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -64,7 +64,6 @@ #include #include "apps.h" -#include "progs.h" #include #include diff --git a/usr.bin/openssl/s_apps.h b/usr.bin/openssl/s_apps.h deleted file mode 100644 index d8217d9ee..000000000 --- a/usr.bin/openssl/s_apps.h +++ /dev/null @@ -1,150 +0,0 @@ -/* $OpenBSD: s_apps.h,v 1.8 2024/05/18 08:47:13 jsg Exp $ */ -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */ -/* ==================================================================== - * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ -#include -#include - -#define PORT 4433 -#define PORT_STR "4433" -#define PROTOCOL "tcp" - -extern int verify_depth; -extern int verify_return_error; - -int do_server(int port, int type, int *ret, - int (*cb)(int s, unsigned char *context), - unsigned char *context, int naccept); -#ifdef HEADER_X509_H -int verify_callback(int ok, X509_STORE_CTX *ctx); -#endif -#ifdef HEADER_SSL_H -int set_cert_stuff(SSL_CTX *ctx, char *cert_file, char *key_file); -int set_cert_key_stuff(SSL_CTX *ctx, X509 *cert, EVP_PKEY *key); -#endif -int ssl_print_tmp_key(BIO *out, SSL *s); -int init_client(int *sock, char *server, char *port, int type, int af); -int extract_port(char *str, short *port_ptr); -int extract_host_port(char *str, char **host_ptr, unsigned char *ip, char **p); - -long bio_dump_callback(BIO *bio, int cmd, const char *argp, int argi, - long argl, long ret); - -#ifdef HEADER_SSL_H -void apps_ssl_info_callback(const SSL *s, int where, int ret); -void msg_cb(int write_p, int version, int content_type, const void *buf, - size_t len, SSL *ssl, void *arg); -void tlsext_cb(SSL *s, int client_server, int type, unsigned char *data, - int len, void *arg); -#endif - -int generate_cookie_callback(SSL *ssl, unsigned char *cookie, - unsigned int *cookie_len); -int verify_cookie_callback(SSL *ssl, const unsigned char *cookie, - unsigned int cookie_len); diff --git a/usr.bin/openssl/s_cb.c b/usr.bin/openssl/s_cb.c index d503b8cf2..fcb2cd307 100644 --- a/usr.bin/openssl/s_cb.c +++ b/usr.bin/openssl/s_cb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: s_cb.c,v 1.21 2023/04/14 15:27:13 tb Exp $ */ +/* $OpenBSD: s_cb.c,v 1.22 2025/01/02 13:10:03 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -124,8 +124,6 @@ #include #include -#include "s_apps.h" - #define COOKIE_SECRET_LENGTH 16 int verify_depth = 0; diff --git a/usr.bin/openssl/s_client.c b/usr.bin/openssl/s_client.c index 299042c59..84718c19f 100644 --- a/usr.bin/openssl/s_client.c +++ b/usr.bin/openssl/s_client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: s_client.c,v 1.64 2023/12/29 12:15:49 tb Exp $ */ +/* $OpenBSD: s_client.c,v 1.67 2025/01/02 16:07:41 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -159,15 +159,8 @@ #include #include -#include "s_apps.h" -#include "timeouts.h" - -/*#define SSL_HOST_NAME "www.netscape.com" */ -/*#define SSL_HOST_NAME "193.118.187.102" */ #define SSL_HOST_NAME "localhost" - /*#define TEST_CERT "client.pem" *//* no default cert. */ - #define BUFSIZZ 1024*8 static void sc_usage(void); diff --git a/usr.bin/openssl/s_server.c b/usr.bin/openssl/s_server.c index 328ac28ab..f56042a4b 100644 --- a/usr.bin/openssl/s_server.c +++ b/usr.bin/openssl/s_server.c @@ -1,4 +1,4 @@ -/* $OpenBSD: s_server.c,v 1.59 2023/12/29 12:15:49 tb Exp $ */ +/* $OpenBSD: s_server.c,v 1.61 2025/01/02 13:10:03 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -174,9 +174,6 @@ #include -#include "s_apps.h" -#include "timeouts.h" - static void s_server_init(void); static void sv_usage(void); static void print_stats(BIO *bp, SSL_CTX *ctx); diff --git a/usr.bin/openssl/s_socket.c b/usr.bin/openssl/s_socket.c index db125c1ed..86a23c56d 100644 --- a/usr.bin/openssl/s_socket.c +++ b/usr.bin/openssl/s_socket.c @@ -1,4 +1,4 @@ -/* $OpenBSD: s_socket.c,v 1.13 2021/12/06 11:06:58 tb Exp $ */ +/* $OpenBSD: s_socket.c,v 1.14 2025/01/02 13:10:03 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -71,8 +71,6 @@ #include -#include "s_apps.h" - static int init_server(int *sock, int port, int type); static int init_server_long(int *sock, int port, char *ip, int type); static int do_accept(int acc_sock, int *sock); diff --git a/usr.bin/openssl/s_time.c b/usr.bin/openssl/s_time.c index da32edaf9..28659cfb6 100644 --- a/usr.bin/openssl/s_time.c +++ b/usr.bin/openssl/s_time.c @@ -1,4 +1,4 @@ -/* $OpenBSD: s_time.c,v 1.38 2023/03/06 14:32:06 tb Exp $ */ +/* $OpenBSD: s_time.c,v 1.39 2025/01/02 13:10:03 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -78,8 +78,6 @@ #include #include -#include "s_apps.h" - #define SSL_CONNECT_NAME "localhost:4433" #define BUFSIZZ 1024*10 diff --git a/usr.bin/openssl/sess_id.c b/usr.bin/openssl/sess_id.c index c46da5424..26db2fa10 100644 --- a/usr.bin/openssl/sess_id.c +++ b/usr.bin/openssl/sess_id.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sess_id.c,v 1.12 2023/03/06 14:32:06 tb Exp $ */ +/* $OpenBSD: sess_id.c,v 1.13 2025/01/02 12:31:44 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -61,7 +61,6 @@ #include #include "apps.h" -#include "progs.h" #include #include diff --git a/usr.bin/openssl/speed.c b/usr.bin/openssl/speed.c index 4e8814cea..9d03c6516 100644 --- a/usr.bin/openssl/speed.c +++ b/usr.bin/openssl/speed.c @@ -1,4 +1,4 @@ -/* $OpenBSD: speed.c,v 1.39 2024/07/13 16:43:56 tb Exp $ */ +/* $OpenBSD: speed.c,v 1.41 2025/01/02 13:37:43 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -146,9 +146,6 @@ #include #endif -#include "./testdsa.h" -#include "./testrsa.h" - #define BUFSIZE (1024*8+64) volatile sig_atomic_t run; @@ -168,7 +165,7 @@ static int do_multi(int multi); #define RSA_NUM 4 #define DSA_NUM 3 -#define EC_NUM 6 +#define EC_NUM 4 #define MAX_ECDH_SIZE 256 static const char *names[ALGOR_NUM] = { @@ -190,6 +187,714 @@ static double ecdh_results[EC_NUM][1]; static void sig_done(int sig); +static DSA * +get_dsa(const unsigned char *priv, size_t priv_size, + const unsigned char *pub, size_t pub_size, + const unsigned char *p_char, size_t p_size, + const unsigned char *q_char, size_t q_size, + const unsigned char *g_char, size_t g_size) +{ + DSA *dsa; + BIGNUM *priv_key = NULL, *pub_key = NULL; + BIGNUM *p = NULL, *q = NULL, *g = NULL; + + if ((dsa = DSA_new()) == NULL) + return (NULL); + + priv_key = BN_bin2bn(priv, priv_size, NULL); + pub_key = BN_bin2bn(pub, pub_size, NULL); + if (priv_key == NULL || pub_key == NULL) + goto err; + + if (!DSA_set0_key(dsa, pub_key, priv_key)) + goto err; + pub_key = NULL; + priv_key = NULL; + + p = BN_bin2bn(p_char, p_size, NULL); + q = BN_bin2bn(q_char, q_size, NULL); + g = BN_bin2bn(g_char, g_size, NULL); + if (p == NULL || q == NULL || g == NULL) + goto err; + + if (!DSA_set0_pqg(dsa, p, q, g)) + goto err; + p = NULL; + q = NULL; + g = NULL; + + return dsa; + + err: + DSA_free(dsa); + BN_free(priv_key); + BN_free(pub_key); + BN_free(p); + BN_free(q); + BN_free(g); + + return NULL; +} + + +static const unsigned char dsa512_priv[] = { + 0x65, 0xe5, 0xc7, 0x38, 0x60, 0x24, 0xb5, 0x89, 0xd4, 0x9c, 0xeb, 0x4c, + 0x9c, 0x1d, 0x7a, 0x22, 0xbd, 0xd1, 0xc2, 0xd2, +}; + +static const unsigned char dsa512_pub[] = { + 0x00, 0x95, 0xa7, 0x0d, 0xec, 0x93, 0x68, 0xba, 0x5f, 0xf7, 0x5f, 0x07, + 0xf2, 0x3b, 0xad, 0x6b, 0x01, 0xdc, 0xbe, 0xec, 0xde, 0x04, 0x7a, 0x3a, + 0x27, 0xb3, 0xec, 0x49, 0xfd, 0x08, 0x43, 0x3d, 0x7e, 0xa8, 0x2c, 0x5e, + 0x7b, 0xbb, 0xfc, 0xf4, 0x6e, 0xeb, 0x6c, 0xb0, 0x6e, 0xf8, 0x02, 0x12, + 0x8c, 0x38, 0x5d, 0x83, 0x56, 0x7d, 0xee, 0x53, 0x05, 0x3e, 0x24, 0x84, + 0xbe, 0xba, 0x0a, 0x6b, 0xc8, +}; + +static const unsigned char dsa512_p[] = { + 0x9D, 0x1B, 0x69, 0x8E, 0x26, 0xDB, 0xF2, 0x2B, 0x11, 0x70, 0x19, 0x86, + 0xF6, 0x19, 0xC8, 0xF8, 0x19, 0xF2, 0x18, 0x53, 0x94, 0x46, 0x06, 0xD0, + 0x62, 0x50, 0x33, 0x4B, 0x02, 0x3C, 0x52, 0x30, 0x03, 0x8B, 0x3B, 0xF9, + 0x5F, 0xD1, 0x24, 0x06, 0x4F, 0x7B, 0x4C, 0xBA, 0xAA, 0x40, 0x9B, 0xFD, + 0x96, 0xE4, 0x37, 0x33, 0xBB, 0x2D, 0x5A, 0xD7, 0x5A, 0x11, 0x40, 0x66, + 0xA2, 0x76, 0x7D, 0x31, +}; + +static const unsigned char dsa512_q[] = { + 0xFB, 0x53, 0xEF, 0x50, 0xB4, 0x40, 0x92, 0x31, 0x56, 0x86, 0x53, 0x7A, + 0xE8, 0x8B, 0x22, 0x9A, 0x49, 0xFB, 0x71, 0x8F, +}; + +static const unsigned char dsa512_g[] = { + 0x83, 0x3E, 0x88, 0xE5, 0xC5, 0x89, 0x73, 0xCE, 0x3B, 0x6C, 0x01, 0x49, + 0xBF, 0xB3, 0xC7, 0x9F, 0x0A, 0xEA, 0x44, 0x91, 0xE5, 0x30, 0xAA, 0xD9, + 0xBE, 0x5B, 0x5F, 0xB7, 0x10, 0xD7, 0x89, 0xB7, 0x8E, 0x74, 0xFB, 0xCF, + 0x29, 0x1E, 0xEB, 0xA8, 0x2C, 0x54, 0x51, 0xB8, 0x10, 0xDE, 0xA0, 0xCE, + 0x2F, 0xCC, 0x24, 0x6B, 0x90, 0x77, 0xDE, 0xA2, 0x68, 0xA6, 0x52, 0x12, + 0xA2, 0x03, 0x9D, 0x20, +}; + +static DSA * +get_dsa512(void) +{ + return get_dsa(dsa512_priv, sizeof(dsa512_priv), + dsa512_pub, sizeof(dsa512_pub), dsa512_p, sizeof(dsa512_p), + dsa512_q, sizeof(dsa512_q), dsa512_g, sizeof(dsa512_g)); +} + +static const unsigned char dsa1024_priv[] = { + 0x7d, 0x21, 0xda, 0xbb, 0x62, 0x15, 0x47, 0x36, 0x07, 0x67, 0x12, 0xe8, + 0x8c, 0xaa, 0x1c, 0xcd, 0x38, 0x12, 0x61, 0x18, +}; + +static const unsigned char dsa1024_pub[] = { + 0x3c, 0x4e, 0x9c, 0x2a, 0x7f, 0x16, 0xc1, 0x25, 0xeb, 0xac, 0x78, 0x63, + 0x90, 0x14, 0x8c, 0x8b, 0xf4, 0x68, 0x43, 0x3c, 0x2d, 0xee, 0x65, 0x50, + 0x7d, 0x9c, 0x8f, 0x8c, 0x8a, 0x51, 0xd6, 0x11, 0x2b, 0x99, 0xaf, 0x1e, + 0x90, 0x97, 0xb5, 0xd3, 0xa6, 0x20, 0x25, 0xd6, 0xfe, 0x43, 0x02, 0xd5, + 0x91, 0x7d, 0xa7, 0x8c, 0xdb, 0xc9, 0x85, 0xa3, 0x36, 0x48, 0xf7, 0x68, + 0xaa, 0x60, 0xb1, 0xf7, 0x05, 0x68, 0x3a, 0xa3, 0x3f, 0xd3, 0x19, 0x82, + 0xd8, 0x82, 0x7a, 0x77, 0xfb, 0xef, 0xf4, 0x15, 0x0a, 0xeb, 0x06, 0x04, + 0x7f, 0x53, 0x07, 0x0c, 0xbc, 0xcb, 0x2d, 0x83, 0xdb, 0x3e, 0xd1, 0x28, + 0xa5, 0xa1, 0x31, 0xe0, 0x67, 0xfa, 0x50, 0xde, 0x9b, 0x07, 0x83, 0x7e, + 0x2c, 0x0b, 0xc3, 0x13, 0x50, 0x61, 0xe5, 0xad, 0xbd, 0x36, 0xb8, 0x97, + 0x4e, 0x40, 0x7d, 0xe8, 0x83, 0x0d, 0xbc, 0x4b +}; + +static const unsigned char dsa1024_p[] = { + 0xA7, 0x3F, 0x6E, 0x85, 0xBF, 0x41, 0x6A, 0x29, 0x7D, 0xF0, 0x9F, 0x47, + 0x19, 0x30, 0x90, 0x9A, 0x09, 0x1D, 0xDA, 0x6A, 0x33, 0x1E, 0xC5, 0x3D, + 0x86, 0x96, 0xB3, 0x15, 0xE0, 0x53, 0x2E, 0x8F, 0xE0, 0x59, 0x82, 0x73, + 0x90, 0x3E, 0x75, 0x31, 0x99, 0x47, 0x7A, 0x52, 0xFB, 0x85, 0xE4, 0xD9, + 0xA6, 0x7B, 0x38, 0x9B, 0x68, 0x8A, 0x84, 0x9B, 0x87, 0xC6, 0x1E, 0xB5, + 0x7E, 0x86, 0x4B, 0x53, 0x5B, 0x59, 0xCF, 0x71, 0x65, 0x19, 0x88, 0x6E, + 0xCE, 0x66, 0xAE, 0x6B, 0x88, 0x36, 0xFB, 0xEC, 0x28, 0xDC, 0xC2, 0xD7, + 0xA5, 0xBB, 0xE5, 0x2C, 0x39, 0x26, 0x4B, 0xDA, 0x9A, 0x70, 0x18, 0x95, + 0x37, 0x95, 0x10, 0x56, 0x23, 0xF6, 0x15, 0xED, 0xBA, 0x04, 0x5E, 0xDE, + 0x39, 0x4F, 0xFD, 0xB7, 0x43, 0x1F, 0xB5, 0xA4, 0x65, 0x6F, 0xCD, 0x80, + 0x11, 0xE4, 0x70, 0x95, 0x5B, 0x50, 0xCD, 0x49, +}; + +static const unsigned char dsa1024_q[] = { + 0xF7, 0x07, 0x31, 0xED, 0xFA, 0x6C, 0x06, 0x03, 0xD5, 0x85, 0x8A, 0x1C, + 0xAC, 0x9C, 0x65, 0xE7, 0x50, 0x66, 0x65, 0x6F, +}; + +static const unsigned char dsa1024_g[] = { + 0x4D, 0xDF, 0x4C, 0x03, 0xA6, 0x91, 0x8A, 0xF5, 0x19, 0x6F, 0x50, 0x46, + 0x25, 0x99, 0xE5, 0x68, 0x6F, 0x30, 0xE3, 0x69, 0xE1, 0xE5, 0xB3, 0x5D, + 0x98, 0xBB, 0x28, 0x86, 0x48, 0xFC, 0xDE, 0x99, 0x04, 0x3F, 0x5F, 0x88, + 0x0C, 0x9C, 0x73, 0x24, 0x0D, 0x20, 0x5D, 0xB9, 0x2A, 0x9A, 0x3F, 0x18, + 0x96, 0x27, 0xE4, 0x62, 0x87, 0xC1, 0x7B, 0x74, 0x62, 0x53, 0xFC, 0x61, + 0x27, 0xA8, 0x7A, 0x91, 0x09, 0x9D, 0xB6, 0xF1, 0x4D, 0x9C, 0x54, 0x0F, + 0x58, 0x06, 0xEE, 0x49, 0x74, 0x07, 0xCE, 0x55, 0x7E, 0x23, 0xCE, 0x16, + 0xF6, 0xCA, 0xDC, 0x5A, 0x61, 0x01, 0x7E, 0xC9, 0x71, 0xB5, 0x4D, 0xF6, + 0xDC, 0x34, 0x29, 0x87, 0x68, 0xF6, 0x5E, 0x20, 0x93, 0xB3, 0xDB, 0xF5, + 0xE4, 0x09, 0x6C, 0x41, 0x17, 0x95, 0x92, 0xEB, 0x01, 0xB5, 0x73, 0xA5, + 0x6A, 0x7E, 0xD8, 0x32, 0xED, 0x0E, 0x02, 0xB8, +}; + +static DSA * +get_dsa1024(void) +{ + return get_dsa(dsa1024_priv, sizeof(dsa1024_priv), + dsa1024_pub, sizeof(dsa1024_pub), dsa1024_p, sizeof(dsa1024_p), + dsa1024_q, sizeof(dsa1024_q), dsa1024_g, sizeof(dsa1024_g)); +} + +static const unsigned char dsa2048_priv[] = { + 0x32, 0x67, 0x92, 0xf6, 0xc4, 0xe2, 0xe2, 0xe8, 0xa0, 0x8b, 0x6b, 0x45, + 0x0c, 0x8a, 0x76, 0xb0, 0xee, 0xcf, 0x91, 0xa7, +}; + +static const unsigned char dsa2048_pub[] = { + 0x17, 0x8f, 0xa8, 0x11, 0x84, 0x92, 0xec, 0x83, 0x47, 0xc7, 0x6a, 0xb0, + 0x92, 0xaf, 0x5a, 0x20, 0x37, 0xa3, 0x64, 0x79, 0xd2, 0xd0, 0x3d, 0xcd, + 0xe0, 0x61, 0x88, 0x88, 0x21, 0xcc, 0x74, 0x5d, 0xce, 0x4c, 0x51, 0x47, + 0xf0, 0xc5, 0x5c, 0x4c, 0x82, 0x7a, 0xaf, 0x72, 0xad, 0xb9, 0xe0, 0x53, + 0xf2, 0x78, 0xb7, 0xf0, 0xb5, 0x48, 0x7f, 0x8a, 0x3a, 0x18, 0xd1, 0x9f, + 0x8b, 0x7d, 0xa5, 0x47, 0xb7, 0x95, 0xab, 0x98, 0xf8, 0x7b, 0x74, 0x50, + 0x56, 0x8e, 0x57, 0xf0, 0xee, 0xf5, 0xb7, 0xba, 0xab, 0x85, 0x86, 0xf9, + 0x2b, 0xef, 0x41, 0x56, 0xa0, 0xa4, 0x9f, 0xb7, 0x38, 0x00, 0x46, 0x0a, + 0xa6, 0xf1, 0xfc, 0x1f, 0xd8, 0x4e, 0x85, 0x44, 0x92, 0x43, 0x21, 0x5d, + 0x6e, 0xcc, 0xc2, 0xcb, 0x26, 0x31, 0x0d, 0x21, 0xc4, 0xbd, 0x8d, 0x24, + 0xbc, 0xd9, 0x18, 0x19, 0xd7, 0xdc, 0xf1, 0xe7, 0x93, 0x50, 0x48, 0x03, + 0x2c, 0xae, 0x2e, 0xe7, 0x49, 0x88, 0x5f, 0x93, 0x57, 0x27, 0x99, 0x36, + 0xb4, 0x20, 0xab, 0xfc, 0xa7, 0x2b, 0xf2, 0xd9, 0x98, 0xd7, 0xd4, 0x34, + 0x9d, 0x96, 0x50, 0x58, 0x9a, 0xea, 0x54, 0xf3, 0xee, 0xf5, 0x63, 0x14, + 0xee, 0x85, 0x83, 0x74, 0x76, 0xe1, 0x52, 0x95, 0xc3, 0xf7, 0xeb, 0x04, + 0x04, 0x7b, 0xa7, 0x28, 0x1b, 0xcc, 0xea, 0x4a, 0x4e, 0x84, 0xda, 0xd8, + 0x9c, 0x79, 0xd8, 0x9b, 0x66, 0x89, 0x2f, 0xcf, 0xac, 0xd7, 0x79, 0xf9, + 0xa9, 0xd8, 0x45, 0x13, 0x78, 0xb9, 0x00, 0x14, 0xc9, 0x7e, 0x22, 0x51, + 0x86, 0x67, 0xb0, 0x9f, 0x26, 0x11, 0x23, 0xc8, 0x38, 0xd7, 0x70, 0x1d, + 0x15, 0x8e, 0x4d, 0x4f, 0x95, 0x97, 0x40, 0xa1, 0xc2, 0x7e, 0x01, 0x18, + 0x72, 0xf4, 0x10, 0xe6, 0x8d, 0x52, 0x16, 0x7f, 0xf2, 0xc9, 0xf8, 0x33, + 0x8b, 0x33, 0xb7, 0xce, +}; + +static const unsigned char dsa2048_p[] = { + 0xA0, 0x25, 0xFA, 0xAD, 0xF4, 0x8E, 0xB9, 0xE5, 0x99, 0xF3, 0x5D, 0x6F, + 0x4F, 0x83, 0x34, 0xE2, 0x7E, 0xCF, 0x6F, 0xBF, 0x30, 0xAF, 0x6F, 0x81, + 0xEB, 0xF8, 0xC4, 0x13, 0xD9, 0xA0, 0x5D, 0x8B, 0x5C, 0x8E, 0xDC, 0xC2, + 0x1D, 0x0B, 0x41, 0x32, 0xB0, 0x1F, 0xFE, 0xEF, 0x0C, 0xC2, 0xA2, 0x7E, + 0x68, 0x5C, 0x28, 0x21, 0xE9, 0xF5, 0xB1, 0x58, 0x12, 0x63, 0x4C, 0x19, + 0x4E, 0xFF, 0x02, 0x4B, 0x92, 0xED, 0xD2, 0x07, 0x11, 0x4D, 0x8C, 0x58, + 0x16, 0x5C, 0x55, 0x8E, 0xAD, 0xA3, 0x67, 0x7D, 0xB9, 0x86, 0x6E, 0x0B, + 0xE6, 0x54, 0x6F, 0x40, 0xAE, 0x0E, 0x67, 0x4C, 0xF9, 0x12, 0x5B, 0x3C, + 0x08, 0x7A, 0xF7, 0xFC, 0x67, 0x86, 0x69, 0xE7, 0x0A, 0x94, 0x40, 0xBF, + 0x8B, 0x76, 0xFE, 0x26, 0xD1, 0xF2, 0xA1, 0x1A, 0x84, 0xA1, 0x43, 0x56, + 0x28, 0xBC, 0x9A, 0x5F, 0xD7, 0x3B, 0x69, 0x89, 0x8A, 0x36, 0x2C, 0x51, + 0xDF, 0x12, 0x77, 0x2F, 0x57, 0x7B, 0xA0, 0xAA, 0xDD, 0x7F, 0xA1, 0x62, + 0x3B, 0x40, 0x7B, 0x68, 0x1A, 0x8F, 0x0D, 0x38, 0xBB, 0x21, 0x5D, 0x18, + 0xFC, 0x0F, 0x46, 0xF7, 0xA3, 0xB0, 0x1D, 0x23, 0xC3, 0xD2, 0xC7, 0x72, + 0x51, 0x18, 0xDF, 0x46, 0x95, 0x79, 0xD9, 0xBD, 0xB5, 0x19, 0x02, 0x2C, + 0x87, 0xDC, 0xE7, 0x57, 0x82, 0x7E, 0xF1, 0x8B, 0x06, 0x3D, 0x00, 0xA5, + 0x7B, 0x6B, 0x26, 0x27, 0x91, 0x0F, 0x6A, 0x77, 0xE4, 0xD5, 0x04, 0xE4, + 0x12, 0x2C, 0x42, 0xFF, 0xD2, 0x88, 0xBB, 0xD3, 0x92, 0xA0, 0xF9, 0xC8, + 0x51, 0x64, 0x14, 0x5C, 0xD8, 0xF9, 0x6C, 0x47, 0x82, 0xB4, 0x1C, 0x7F, + 0x09, 0xB8, 0xF0, 0x25, 0x83, 0x1D, 0x3F, 0x3F, 0x05, 0xB3, 0x21, 0x0A, + 0x5D, 0xA7, 0xD8, 0x54, 0xC3, 0x65, 0x7D, 0xC3, 0xB0, 0x1D, 0xBF, 0xAE, + 0xF8, 0x68, 0xCF, 0x9B, +}; + +static const unsigned char dsa2048_q[] = { + 0x97, 0xE7, 0x33, 0x4D, 0xD3, 0x94, 0x3E, 0x0B, 0xDB, 0x62, 0x74, 0xC6, + 0xA1, 0x08, 0xDD, 0x19, 0xA3, 0x75, 0x17, 0x1B, +}; + +static const unsigned char dsa2048_g[] = { + 0x2C, 0x78, 0x16, 0x59, 0x34, 0x63, 0xF4, 0xF3, 0x92, 0xFC, 0xB5, 0xA5, + 0x4F, 0x13, 0xDE, 0x2F, 0x1C, 0xA4, 0x3C, 0xAE, 0xAD, 0x38, 0x3F, 0x7E, + 0x90, 0xBF, 0x96, 0xA6, 0xAE, 0x25, 0x90, 0x72, 0xF5, 0x8E, 0x80, 0x0C, + 0x39, 0x1C, 0xD9, 0xEC, 0xBA, 0x90, 0x5B, 0x3A, 0xE8, 0x58, 0x6C, 0x9E, + 0x30, 0x42, 0x37, 0x02, 0x31, 0x82, 0xBC, 0x6A, 0xDF, 0x6A, 0x09, 0x29, + 0xE3, 0xC0, 0x46, 0xD1, 0xCB, 0x85, 0xEC, 0x0C, 0x30, 0x5E, 0xEA, 0xC8, + 0x39, 0x8E, 0x22, 0x9F, 0x22, 0x10, 0xD2, 0x34, 0x61, 0x68, 0x37, 0x3D, + 0x2E, 0x4A, 0x5B, 0x9A, 0xF5, 0xC1, 0x48, 0xC6, 0xF6, 0xDC, 0x63, 0x1A, + 0xD3, 0x96, 0x64, 0xBA, 0x34, 0xC9, 0xD1, 0xA0, 0xD1, 0xAE, 0x6C, 0x2F, + 0x48, 0x17, 0x93, 0x14, 0x43, 0xED, 0xF0, 0x21, 0x30, 0x19, 0xC3, 0x1B, + 0x5F, 0xDE, 0xA3, 0xF0, 0x70, 0x78, 0x18, 0xE1, 0xA8, 0xE4, 0xEE, 0x2E, + 0x00, 0xA5, 0xE4, 0xB3, 0x17, 0xC8, 0x0C, 0x7D, 0x6E, 0x42, 0xDC, 0xB7, + 0x46, 0x00, 0x36, 0x4D, 0xD4, 0x46, 0xAA, 0x3D, 0x3C, 0x46, 0x89, 0x40, + 0xBF, 0x1D, 0x84, 0x77, 0x0A, 0x75, 0xF3, 0x87, 0x1D, 0x08, 0x4C, 0xA6, + 0xD1, 0xA9, 0x1C, 0x1E, 0x12, 0x1E, 0xE1, 0xC7, 0x30, 0x28, 0x76, 0xA5, + 0x7F, 0x6C, 0x85, 0x96, 0x2B, 0x6F, 0xDB, 0x80, 0x66, 0x26, 0xAE, 0xF5, + 0x93, 0xC7, 0x8E, 0xAE, 0x9A, 0xED, 0xE4, 0xCA, 0x04, 0xEA, 0x3B, 0x72, + 0xEF, 0xDC, 0x87, 0xED, 0x0D, 0xA5, 0x4C, 0x4A, 0xDD, 0x71, 0x22, 0x64, + 0x59, 0x69, 0x4E, 0x8E, 0xBF, 0x43, 0xDC, 0xAB, 0x8E, 0x66, 0xBB, 0x01, + 0xB6, 0xF4, 0xE7, 0xFD, 0xD2, 0xAD, 0x9F, 0x36, 0xC1, 0xA0, 0x29, 0x99, + 0xD1, 0x96, 0x70, 0x59, 0x06, 0x78, 0x35, 0xBD, 0x65, 0x55, 0x52, 0x9E, + 0xF8, 0xB2, 0xE5, 0x38, +}; + +static DSA * +get_dsa2048(void) +{ + return get_dsa(dsa2048_priv, sizeof(dsa2048_priv), + dsa2048_pub, sizeof(dsa2048_pub), dsa2048_p, sizeof(dsa2048_p), + dsa2048_q, sizeof(dsa2048_q), dsa2048_g, sizeof(dsa2048_g)); +} + +static const unsigned char test512[] = { + 0x30, 0x82, 0x01, 0x3a, 0x02, 0x01, 0x00, 0x02, 0x41, 0x00, + 0xd6, 0x33, 0xb9, 0xc8, 0xfb, 0x4f, 0x3c, 0x7d, 0xc0, 0x01, + 0x86, 0xd0, 0xe7, 0xa0, 0x55, 0xf2, 0x95, 0x93, 0xcc, 0x4f, + 0xb7, 0x5b, 0x67, 0x5b, 0x94, 0x68, 0xc9, 0x34, 0x15, 0xde, + 0xa5, 0x2e, 0x1c, 0x33, 0xc2, 0x6e, 0xfc, 0x34, 0x5e, 0x71, + 0x13, 0xb7, 0xd6, 0xee, 0xd8, 0xa5, 0x65, 0x05, 0x72, 0x87, + 0xa8, 0xb0, 0x77, 0xfe, 0x57, 0xf5, 0xfc, 0x5f, 0x55, 0x83, + 0x87, 0xdd, 0x57, 0x49, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, + 0x41, 0x00, 0xa7, 0xf7, 0x91, 0xc5, 0x0f, 0x84, 0x57, 0xdc, + 0x07, 0xf7, 0x6a, 0x7f, 0x60, 0x52, 0xb3, 0x72, 0xf1, 0x66, + 0x1f, 0x7d, 0x97, 0x3b, 0x9e, 0xb6, 0x0a, 0x8f, 0x8c, 0xcf, + 0x42, 0x23, 0x00, 0x04, 0xd4, 0x28, 0x0e, 0x1c, 0x90, 0xc4, + 0x11, 0x25, 0x25, 0xa5, 0x93, 0xa5, 0x2f, 0x70, 0x02, 0xdf, + 0x81, 0x9c, 0x49, 0x03, 0xa0, 0xf8, 0x6d, 0x54, 0x2e, 0x26, + 0xde, 0xaa, 0x85, 0x59, 0xa8, 0x31, 0x02, 0x21, 0x00, 0xeb, + 0x47, 0xd7, 0x3b, 0xf6, 0xc3, 0xdd, 0x5a, 0x46, 0xc5, 0xb9, + 0x2b, 0x9a, 0xa0, 0x09, 0x8f, 0xa6, 0xfb, 0xf3, 0x78, 0x7a, + 0x33, 0x70, 0x9d, 0x0f, 0x42, 0x6b, 0x13, 0x68, 0x24, 0xd3, + 0x15, 0x02, 0x21, 0x00, 0xe9, 0x10, 0xb0, 0xb3, 0x0d, 0xe2, + 0x82, 0x68, 0x77, 0x8a, 0x6e, 0x7c, 0xda, 0xbc, 0x3e, 0x53, + 0x83, 0xfb, 0xd6, 0x22, 0xe7, 0xb5, 0xae, 0x6e, 0x80, 0xda, + 0x00, 0x55, 0x97, 0xc1, 0xd0, 0x65, 0x02, 0x20, 0x4c, 0xf8, + 0x73, 0xb1, 0x6a, 0x49, 0x29, 0x61, 0x1f, 0x46, 0x10, 0x0d, + 0xf3, 0xc7, 0xe7, 0x58, 0xd7, 0x88, 0x15, 0x5e, 0x94, 0x9b, + 0xbf, 0x7b, 0xa2, 0x42, 0x58, 0x45, 0x41, 0x0c, 0xcb, 0x01, + 0x02, 0x20, 0x12, 0x11, 0xba, 0x31, 0x57, 0x9d, 0x3d, 0x11, + 0x0e, 0x5b, 0x8c, 0x2f, 0x5f, 0xe2, 0x02, 0x4f, 0x05, 0x47, + 0x8c, 0x15, 0x8e, 0xb3, 0x56, 0x3f, 0xb8, 0xfb, 0xad, 0xd4, + 0xf4, 0xfc, 0x10, 0xc5, 0x02, 0x20, 0x18, 0xa1, 0x29, 0x99, + 0x5b, 0xd9, 0xc8, 0xd4, 0xfc, 0x49, 0x7a, 0x2a, 0x21, 0x2c, + 0x49, 0xe4, 0x4f, 0xeb, 0xef, 0x51, 0xf1, 0xab, 0x6d, 0xfb, + 0x4b, 0x14, 0xe9, 0x4b, 0x52, 0xb5, 0x82, 0x2c, +}; + +static const unsigned char test1024[] = { + 0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, + 0x00, 0xdc, 0x98, 0x43, 0xe8, 0x3d, 0x43, 0x5b, 0xe4, 0x05, + 0xcd, 0xd0, 0xa9, 0x3e, 0xcb, 0x83, 0x75, 0xf6, 0xb5, 0xa5, + 0x9f, 0x6b, 0xe9, 0x34, 0x41, 0x29, 0x18, 0xfa, 0x6a, 0x55, + 0x4d, 0x70, 0xfc, 0xec, 0xae, 0x87, 0x38, 0x0a, 0x20, 0xa9, + 0xc0, 0x45, 0x77, 0x6e, 0x57, 0x60, 0x57, 0xf4, 0xed, 0x96, + 0x22, 0xcb, 0x8f, 0xe1, 0x33, 0x3a, 0x17, 0x1f, 0xed, 0x37, + 0xa5, 0x6f, 0xeb, 0xa6, 0xbc, 0x12, 0x80, 0x1d, 0x53, 0xbd, + 0x70, 0xeb, 0x21, 0x76, 0x3e, 0xc9, 0x2f, 0x1a, 0x45, 0x24, + 0x82, 0xff, 0xcd, 0x59, 0x32, 0x06, 0x2e, 0x12, 0x3b, 0x23, + 0x78, 0xed, 0x12, 0x3d, 0xe0, 0x8d, 0xf9, 0x67, 0x4f, 0x37, + 0x4e, 0x47, 0x02, 0x4c, 0x2d, 0xc0, 0x4f, 0x1f, 0xb3, 0x94, + 0xe1, 0x41, 0x2e, 0x2d, 0x90, 0x10, 0xfc, 0x82, 0x91, 0x8b, + 0x0f, 0x22, 0xd4, 0xf2, 0xfc, 0x2c, 0xab, 0x53, 0x55, 0x02, + 0x03, 0x01, 0x00, 0x01, 0x02, 0x81, 0x80, 0x2b, 0xcc, 0x3f, + 0x8f, 0x58, 0xba, 0x8b, 0x00, 0x16, 0xf6, 0xea, 0x3a, 0xf0, + 0x30, 0xd0, 0x05, 0x17, 0xda, 0xb0, 0xeb, 0x9a, 0x2d, 0x4f, + 0x26, 0xb0, 0xd6, 0x38, 0xc1, 0xeb, 0xf5, 0xd8, 0x3d, 0x1f, + 0x70, 0xf7, 0x7f, 0xf4, 0xe2, 0xcf, 0x51, 0x51, 0x79, 0x88, + 0xfa, 0xe8, 0x32, 0x0e, 0x7b, 0x2d, 0x97, 0xf2, 0xfa, 0xba, + 0x27, 0xc5, 0x9c, 0xd9, 0xc5, 0xeb, 0x8a, 0x79, 0x52, 0x3c, + 0x64, 0x34, 0x7d, 0xc2, 0xcf, 0x28, 0xc7, 0x4e, 0xd5, 0x43, + 0x0b, 0xd1, 0xa6, 0xca, 0x6d, 0x03, 0x2d, 0x72, 0x23, 0xbc, + 0x6d, 0x05, 0xfa, 0x16, 0x09, 0x2f, 0x2e, 0x5c, 0xb6, 0xee, + 0x74, 0xdd, 0xd2, 0x48, 0x8e, 0x36, 0x0c, 0x06, 0x3d, 0x4d, + 0xe5, 0x10, 0x82, 0xeb, 0x6a, 0xf3, 0x4b, 0x9f, 0xd6, 0xed, + 0x11, 0xb1, 0x6e, 0xec, 0xf4, 0xfe, 0x8e, 0x75, 0x94, 0x20, + 0x2f, 0xcb, 0xac, 0x46, 0xf1, 0x02, 0x41, 0x00, 0xf9, 0x8c, + 0xa3, 0x85, 0xb1, 0xdd, 0x29, 0xaf, 0x65, 0xc1, 0x33, 0xf3, + 0x95, 0xc5, 0x52, 0x68, 0x0b, 0xd4, 0xf1, 0xe5, 0x0e, 0x02, + 0x9f, 0x4f, 0xfa, 0x77, 0xdc, 0x46, 0x9e, 0xc7, 0xa6, 0xe4, + 0x16, 0x29, 0xda, 0xb0, 0x07, 0xcf, 0x5b, 0xa9, 0x12, 0x8a, + 0xdd, 0x63, 0x0a, 0xde, 0x2e, 0x8c, 0x66, 0x8b, 0x8c, 0xdc, + 0x19, 0xa3, 0x7e, 0xf4, 0x3b, 0xd0, 0x1a, 0x8c, 0xa4, 0xc2, + 0xe1, 0xd3, 0x02, 0x41, 0x00, 0xe2, 0x4c, 0x05, 0xf2, 0x04, + 0x86, 0x4e, 0x61, 0x43, 0xdb, 0xb0, 0xb9, 0x96, 0x86, 0x52, + 0x2c, 0xca, 0x8d, 0x7b, 0xab, 0x0b, 0x13, 0x0d, 0x7e, 0x38, + 0x5b, 0xe2, 0x2e, 0x7b, 0x0e, 0xe7, 0x19, 0x99, 0x38, 0xe7, + 0xf2, 0x21, 0xbd, 0x85, 0x85, 0xe3, 0xfd, 0x28, 0x77, 0x20, + 0x31, 0x71, 0x2c, 0xd0, 0xff, 0xfb, 0x2e, 0xaf, 0x85, 0xb4, + 0x86, 0xca, 0xf3, 0xbb, 0xca, 0xaa, 0x0f, 0x95, 0x37, 0x02, + 0x40, 0x0e, 0x41, 0x9a, 0x95, 0xe8, 0xb3, 0x59, 0xce, 0x4b, + 0x61, 0xde, 0x35, 0xec, 0x38, 0x79, 0x9c, 0xb8, 0x10, 0x52, + 0x41, 0x63, 0xab, 0x82, 0xae, 0x6f, 0x00, 0xa9, 0xf4, 0xde, + 0xdd, 0x49, 0x0b, 0x7e, 0xb8, 0xa5, 0x65, 0xa9, 0x0c, 0x8f, + 0x8f, 0xf9, 0x1f, 0x35, 0xc6, 0x92, 0xb8, 0x5e, 0xb0, 0x66, + 0xab, 0x52, 0x40, 0xc0, 0xb6, 0x36, 0x6a, 0x7d, 0x80, 0x46, + 0x04, 0x02, 0xe5, 0x9f, 0x41, 0x02, 0x41, 0x00, 0xc0, 0xad, + 0xcc, 0x4e, 0x21, 0xee, 0x1d, 0x24, 0x91, 0xfb, 0xa7, 0x80, + 0x8d, 0x9a, 0xb6, 0xb3, 0x2e, 0x8f, 0xc2, 0xe1, 0x82, 0xdf, + 0x69, 0x18, 0xb4, 0x71, 0xff, 0xa6, 0x65, 0xde, 0xed, 0x84, + 0x8d, 0x42, 0xb7, 0xb3, 0x21, 0x69, 0x56, 0x1c, 0x07, 0x60, + 0x51, 0x29, 0x04, 0xff, 0x34, 0x06, 0xdd, 0xb9, 0x67, 0x2c, + 0x7c, 0x04, 0x93, 0x0e, 0x46, 0x15, 0xbb, 0x2a, 0xb7, 0x1b, + 0xe7, 0x87, 0x02, 0x40, 0x78, 0xda, 0x5d, 0x07, 0x51, 0x0c, + 0x16, 0x7a, 0x9f, 0x29, 0x20, 0x84, 0x0d, 0x42, 0xfa, 0xd7, + 0x00, 0xd8, 0x77, 0x7e, 0xb0, 0xb0, 0x6b, 0xd6, 0x5b, 0x53, + 0xb8, 0x9b, 0x7a, 0xcd, 0xc7, 0x2b, 0xb8, 0x6a, 0x63, 0xa9, + 0xfb, 0x6f, 0xa4, 0x72, 0xbf, 0x4c, 0x5d, 0x00, 0x14, 0xba, + 0xfa, 0x59, 0x88, 0xed, 0xe4, 0xe0, 0x8c, 0xa2, 0xec, 0x14, + 0x7e, 0x2d, 0xe2, 0xf0, 0x46, 0x49, 0x95, 0x45, +}; + +static const unsigned char test2048[] = { + 0x30, 0x82, 0x04, 0xa3, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, + 0x01, 0x00, 0xc0, 0xc0, 0xce, 0x3e, 0x3c, 0x53, 0x67, 0x3f, + 0x4f, 0xc5, 0x2f, 0xa4, 0xc2, 0x5a, 0x2f, 0x58, 0xfd, 0x27, + 0x52, 0x6a, 0xe8, 0xcf, 0x4a, 0x73, 0x47, 0x8d, 0x25, 0x0f, + 0x5f, 0x03, 0x26, 0x78, 0xef, 0xf0, 0x22, 0x12, 0xd3, 0xde, + 0x47, 0xb2, 0x1c, 0x0b, 0x38, 0x63, 0x1a, 0x6c, 0x85, 0x7a, + 0x80, 0xc6, 0x8f, 0xa0, 0x41, 0xaf, 0x62, 0xc4, 0x67, 0x32, + 0x88, 0xf8, 0xa6, 0x9c, 0xf5, 0x23, 0x1d, 0xe4, 0xac, 0x3f, + 0x29, 0xf9, 0xec, 0xe1, 0x8b, 0x26, 0x03, 0x2c, 0xb2, 0xab, + 0xf3, 0x7d, 0xb5, 0xca, 0x49, 0xc0, 0x8f, 0x1c, 0xdf, 0x33, + 0x3a, 0x60, 0xda, 0x3c, 0xb0, 0x16, 0xf8, 0xa9, 0x12, 0x8f, + 0x64, 0xac, 0x23, 0x0c, 0x69, 0x64, 0x97, 0x5d, 0x99, 0xd4, + 0x09, 0x83, 0x9b, 0x61, 0xd3, 0xac, 0xf0, 0xde, 0xdd, 0x5e, + 0x9f, 0x44, 0x94, 0xdb, 0x3a, 0x4d, 0x97, 0xe8, 0x52, 0x29, + 0xf7, 0xdb, 0x94, 0x07, 0x45, 0x90, 0x78, 0x1e, 0x31, 0x0b, + 0x80, 0xf7, 0x57, 0xad, 0x1c, 0x79, 0xc5, 0xcb, 0x32, 0xb0, + 0xce, 0xcd, 0x74, 0xb3, 0xe2, 0x94, 0xc5, 0x78, 0x2f, 0x34, + 0x1a, 0x45, 0xf7, 0x8c, 0x52, 0xa5, 0xbc, 0x8d, 0xec, 0xd1, + 0x2f, 0x31, 0x3b, 0xf0, 0x49, 0x59, 0x5e, 0x88, 0x9d, 0x15, + 0x92, 0x35, 0x32, 0xc1, 0xe7, 0x61, 0xec, 0x50, 0x48, 0x7c, + 0xba, 0x05, 0xf9, 0xf8, 0xf8, 0xa7, 0x8c, 0x83, 0xe8, 0x66, + 0x5b, 0xeb, 0xfe, 0xd8, 0x4f, 0xdd, 0x6d, 0x36, 0xc0, 0xb2, + 0x90, 0x0f, 0xb8, 0x52, 0xf9, 0x04, 0x9b, 0x40, 0x2c, 0x27, + 0xd6, 0x36, 0x8e, 0xc2, 0x1b, 0x44, 0xf3, 0x92, 0xd5, 0x15, + 0x9e, 0x9a, 0xbc, 0xf3, 0x7d, 0x03, 0xd7, 0x02, 0x14, 0x20, + 0xe9, 0x10, 0x92, 0xfd, 0xf9, 0xfc, 0x8f, 0xe5, 0x18, 0xe1, + 0x95, 0xcc, 0x9e, 0x60, 0xa6, 0xfa, 0x38, 0x4d, 0x02, 0x03, + 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x00, 0x00, 0xc3, 0xc3, + 0x0d, 0xb4, 0x27, 0x90, 0x8d, 0x4b, 0xbf, 0xb8, 0x84, 0xaa, + 0xd0, 0xb8, 0xc7, 0x5d, 0x99, 0xbe, 0x55, 0xf6, 0x3e, 0x7c, + 0x49, 0x20, 0xcb, 0x8a, 0x8e, 0x19, 0x0e, 0x66, 0x24, 0xac, + 0xaf, 0x03, 0x33, 0x97, 0xeb, 0x95, 0xd5, 0x3b, 0x0f, 0x40, + 0x56, 0x04, 0x50, 0xd1, 0xe6, 0xbe, 0x84, 0x0b, 0x25, 0xd3, + 0x9c, 0xe2, 0x83, 0x6c, 0xf5, 0x62, 0x5d, 0xba, 0x2b, 0x7d, + 0x3d, 0x7a, 0x6c, 0xe1, 0xd2, 0x0e, 0x54, 0x93, 0x80, 0x01, + 0x91, 0x51, 0x09, 0xe8, 0x5b, 0x8e, 0x47, 0xbd, 0x64, 0xe4, + 0x0e, 0x03, 0x83, 0x55, 0xcf, 0x5a, 0x37, 0xf0, 0x25, 0xb5, + 0x7d, 0x21, 0xd7, 0x69, 0xdf, 0x6f, 0xc2, 0xcf, 0x10, 0xc9, + 0x8a, 0x40, 0x9f, 0x7a, 0x70, 0xc0, 0xe8, 0xe8, 0xc0, 0xe6, + 0x9a, 0x15, 0x0a, 0x8d, 0x4e, 0x46, 0xcb, 0x7a, 0xdb, 0xb3, + 0xcb, 0x83, 0x02, 0xc4, 0xf0, 0xab, 0xeb, 0x02, 0x01, 0x0e, + 0x23, 0xfc, 0x1d, 0xc4, 0xbd, 0xd4, 0xaa, 0x5d, 0x31, 0x46, + 0x99, 0xce, 0x9e, 0xf8, 0x04, 0x75, 0x10, 0x67, 0xc4, 0x53, + 0x47, 0x44, 0xfa, 0xc2, 0x25, 0x73, 0x7e, 0xd0, 0x8e, 0x59, + 0xd1, 0xb2, 0x5a, 0xf4, 0xc7, 0x18, 0x92, 0x2f, 0x39, 0xab, + 0xcd, 0xa3, 0xb5, 0xc2, 0xb9, 0xc7, 0xb9, 0x1b, 0x9f, 0x48, + 0xfa, 0x13, 0xc6, 0x98, 0x4d, 0xca, 0x84, 0x9c, 0x06, 0xca, + 0xe7, 0x89, 0x01, 0x04, 0xc4, 0x6c, 0xfd, 0x29, 0x59, 0x35, + 0xe7, 0xf3, 0xdd, 0xce, 0x64, 0x59, 0xbf, 0x21, 0x13, 0xa9, + 0x9f, 0x0e, 0xc5, 0xff, 0xbd, 0x33, 0x00, 0xec, 0xac, 0x6b, + 0x11, 0xef, 0x51, 0x5e, 0xad, 0x07, 0x15, 0xde, 0xb8, 0x5f, + 0xc6, 0xb9, 0xa3, 0x22, 0x65, 0x46, 0x83, 0x14, 0xdf, 0xd0, + 0xf1, 0x44, 0x8a, 0xe1, 0x9c, 0x23, 0x33, 0xb4, 0x97, 0x33, + 0xe6, 0x6b, 0x81, 0x02, 0x81, 0x81, 0x00, 0xec, 0x12, 0xa7, + 0x59, 0x74, 0x6a, 0xde, 0x3e, 0xad, 0xd8, 0x36, 0x80, 0x50, + 0xa2, 0xd5, 0x21, 0x81, 0x07, 0xf1, 0xd0, 0x91, 0xf2, 0x6c, + 0x12, 0x2f, 0x9d, 0x1a, 0x26, 0xf8, 0x30, 0x65, 0xdf, 0xe8, + 0xc0, 0x9b, 0x6a, 0x30, 0x98, 0x82, 0x87, 0xec, 0xa2, 0x56, + 0x87, 0x62, 0x6f, 0xe7, 0x9f, 0xf6, 0x56, 0xe6, 0x71, 0x8f, + 0x49, 0x86, 0x93, 0x5a, 0x4d, 0x34, 0x58, 0xfe, 0xd9, 0x04, + 0x13, 0xaf, 0x79, 0xb7, 0xad, 0x11, 0xd1, 0x30, 0x9a, 0x14, + 0x06, 0xa0, 0xfa, 0xb7, 0x55, 0xdc, 0x6c, 0x5a, 0x4c, 0x2c, + 0x59, 0x56, 0xf6, 0xe8, 0x9d, 0xaf, 0x0a, 0x78, 0x99, 0x06, + 0x06, 0x9e, 0xe7, 0x9c, 0x51, 0x55, 0x43, 0xfc, 0x3b, 0x6c, + 0x0b, 0xbf, 0x2d, 0x41, 0xa7, 0xaf, 0xb7, 0xe0, 0xe8, 0x28, + 0x18, 0xb4, 0x13, 0xd1, 0xe6, 0x97, 0xd0, 0x9f, 0x6a, 0x80, + 0xca, 0xdd, 0x1a, 0x7e, 0x15, 0x02, 0x81, 0x81, 0x00, 0xd1, + 0x06, 0x0c, 0x1f, 0xe3, 0xd0, 0xab, 0xd6, 0xca, 0x7c, 0xbc, + 0x7d, 0x13, 0x35, 0xce, 0x27, 0xcd, 0xd8, 0x49, 0x51, 0x63, + 0x64, 0x0f, 0xca, 0x06, 0x12, 0xfc, 0x07, 0x3e, 0xaf, 0x61, + 0x6d, 0xe2, 0x53, 0x39, 0x27, 0xae, 0xc3, 0x11, 0x9e, 0x94, + 0x01, 0x4f, 0xe3, 0xf3, 0x67, 0xf9, 0x77, 0xf9, 0xe7, 0x95, + 0x3a, 0x6f, 0xe2, 0x20, 0x73, 0x3e, 0xa4, 0x7a, 0x28, 0xd4, + 0x61, 0x97, 0xf6, 0x17, 0xa0, 0x23, 0x10, 0x2b, 0xce, 0x84, + 0x57, 0x7e, 0x25, 0x1f, 0xf4, 0xa8, 0x54, 0xd2, 0x65, 0x94, + 0xcc, 0x95, 0x0a, 0xab, 0x30, 0xc1, 0x59, 0x1f, 0x61, 0x8e, + 0xb9, 0x6b, 0xd7, 0x4e, 0xb9, 0x83, 0x43, 0x79, 0x85, 0x11, + 0xbc, 0x0f, 0xae, 0x25, 0x20, 0x05, 0xbc, 0xd2, 0x48, 0xa1, + 0x68, 0x09, 0x84, 0xf6, 0x12, 0x9a, 0x66, 0xb9, 0x2b, 0xbb, + 0x76, 0x03, 0x17, 0x46, 0x4e, 0x97, 0x59, 0x02, 0x81, 0x80, + 0x09, 0x4c, 0xfa, 0xd6, 0xe5, 0x65, 0x48, 0x78, 0x43, 0xb5, + 0x1f, 0x00, 0x93, 0x2c, 0xb7, 0x24, 0xe8, 0xc6, 0x7d, 0x5a, + 0x70, 0x45, 0x92, 0xc8, 0x6c, 0xa3, 0xcd, 0xe1, 0xf7, 0x29, + 0x40, 0xfa, 0x3f, 0x5b, 0x47, 0x44, 0x39, 0xc1, 0xe8, 0x72, + 0x9e, 0x7a, 0x0e, 0xda, 0xaa, 0xa0, 0x2a, 0x09, 0xfd, 0x54, + 0x93, 0x23, 0xaa, 0x37, 0x85, 0x5b, 0xcc, 0xd4, 0xf9, 0xd8, + 0xff, 0xc1, 0x61, 0x0d, 0xbd, 0x7e, 0x18, 0x24, 0x73, 0x6d, + 0x40, 0x72, 0xf1, 0x93, 0x09, 0x48, 0x97, 0x6c, 0x84, 0x90, + 0xa8, 0x46, 0x14, 0x01, 0x39, 0x11, 0xe5, 0x3c, 0x41, 0x27, + 0x32, 0x75, 0x24, 0xed, 0xa1, 0xd9, 0x12, 0x29, 0x8a, 0x28, + 0x71, 0x89, 0x8d, 0xca, 0x30, 0xb0, 0x01, 0xc4, 0x2f, 0x82, + 0x19, 0x14, 0x4c, 0x70, 0x1c, 0xb8, 0x23, 0x2e, 0xe8, 0x90, + 0x49, 0x97, 0x92, 0x97, 0x6b, 0x7a, 0x9d, 0xb9, 0x02, 0x81, + 0x80, 0x0f, 0x0e, 0xa1, 0x76, 0xf6, 0xa1, 0x44, 0x8f, 0xaf, + 0x7c, 0x76, 0xd3, 0x87, 0xbb, 0xbb, 0x83, 0x10, 0x88, 0x01, + 0x18, 0x14, 0xd1, 0xd3, 0x75, 0x59, 0x24, 0xaa, 0xf5, 0x16, + 0xa5, 0xe9, 0x9d, 0xd1, 0xcc, 0xee, 0xf4, 0x15, 0xd9, 0xc5, + 0x7e, 0x27, 0xe9, 0x44, 0x49, 0x06, 0x72, 0xb9, 0xfc, 0xd3, + 0x8a, 0xc4, 0x2c, 0x36, 0x7d, 0x12, 0x9b, 0x5a, 0xaa, 0xdc, + 0x85, 0xee, 0x6e, 0xad, 0x54, 0xb3, 0xf4, 0xfc, 0x31, 0xa1, + 0x06, 0x3a, 0x70, 0x57, 0x0c, 0xf3, 0x95, 0x5b, 0x3e, 0xe8, + 0xfd, 0x1a, 0x4f, 0xf6, 0x78, 0x93, 0x46, 0x6a, 0xd7, 0x31, + 0xb4, 0x84, 0x64, 0x85, 0x09, 0x38, 0x89, 0x92, 0x94, 0x1c, + 0xbf, 0xe2, 0x3c, 0x2a, 0xe0, 0xff, 0x99, 0xa3, 0xf0, 0x2b, + 0x31, 0xc2, 0x36, 0xcd, 0x60, 0xbf, 0x9d, 0x2d, 0x74, 0x32, + 0xe8, 0x9c, 0x93, 0x6e, 0xbb, 0x91, 0x7b, 0xfd, 0xd9, 0x02, + 0x81, 0x81, 0x00, 0xa2, 0x71, 0x25, 0x38, 0xeb, 0x2a, 0xe9, + 0x37, 0xcd, 0xfe, 0x44, 0xce, 0x90, 0x3f, 0x52, 0x87, 0x84, + 0x52, 0x1b, 0xae, 0x8d, 0x22, 0x94, 0xce, 0x38, 0xe6, 0x04, + 0x88, 0x76, 0x85, 0x9a, 0xd3, 0x14, 0x09, 0xe5, 0x69, 0x9a, + 0xff, 0x58, 0x92, 0x02, 0x6a, 0x7d, 0x7c, 0x1e, 0x2c, 0xfd, + 0xa8, 0xca, 0x32, 0x14, 0x4f, 0x0d, 0x84, 0x0d, 0x37, 0x43, + 0xbf, 0xe4, 0x5d, 0x12, 0xc8, 0x24, 0x91, 0x27, 0x8d, 0x46, + 0xd9, 0x54, 0x53, 0xe7, 0x62, 0x71, 0xa8, 0x2b, 0x71, 0x41, + 0x8d, 0x75, 0xf8, 0x3a, 0xa0, 0x61, 0x29, 0x46, 0xa6, 0xe5, + 0x82, 0xfa, 0x3a, 0xd9, 0x08, 0xfa, 0xfc, 0x63, 0xfd, 0x6b, + 0x30, 0xbc, 0xf4, 0x4e, 0x9e, 0x8c, 0x25, 0x0c, 0xb6, 0x55, + 0xe7, 0x3c, 0xd4, 0x4e, 0x0b, 0xfd, 0x8b, 0xc3, 0x0e, 0x1d, + 0x9c, 0x44, 0x57, 0x8f, 0x1f, 0x86, 0xf7, 0xd5, 0x1b, 0xe4, + 0x95, +}; + +static const unsigned char test4096[] = { + 0x30, 0x82, 0x09, 0x29, 0x02, 0x01, 0x00, 0x02, 0x82, 0x02, + 0x01, 0x00, 0xc0, 0x71, 0xac, 0x1a, 0x13, 0x88, 0x82, 0x43, + 0x3b, 0x51, 0x57, 0x71, 0x8d, 0xb6, 0x2b, 0x82, 0x65, 0x21, + 0x53, 0x5f, 0x28, 0x29, 0x4f, 0x8d, 0x7c, 0x8a, 0xb9, 0x44, + 0xb3, 0x28, 0x41, 0x4f, 0xd3, 0xfa, 0x6a, 0xf8, 0xb9, 0x28, + 0x50, 0x39, 0x67, 0x53, 0x2c, 0x3c, 0xd7, 0xcb, 0x96, 0x41, + 0x40, 0x32, 0xbb, 0xeb, 0x70, 0xae, 0x1f, 0xb0, 0x65, 0xf7, + 0x3a, 0xd9, 0x22, 0xfd, 0x10, 0xae, 0xbd, 0x02, 0xe2, 0xdd, + 0xf3, 0xc2, 0x79, 0x3c, 0xc6, 0xfc, 0x75, 0xbb, 0xaf, 0x4e, + 0x3a, 0x36, 0xc2, 0x4f, 0xea, 0x25, 0xdf, 0x13, 0x16, 0x4b, + 0x20, 0xfe, 0x4b, 0x69, 0x16, 0xc4, 0x7f, 0x1a, 0x43, 0xa6, + 0x17, 0x1b, 0xb9, 0x0a, 0xf3, 0x09, 0x86, 0x28, 0x89, 0xcf, + 0x2c, 0xd0, 0xd4, 0x81, 0xaf, 0xc6, 0x6d, 0xe6, 0x21, 0x8d, + 0xee, 0xef, 0xea, 0xdc, 0xb7, 0xc6, 0x3b, 0x63, 0x9f, 0x0e, + 0xad, 0x89, 0x78, 0x23, 0x18, 0xbf, 0x70, 0x7e, 0x84, 0xe0, + 0x37, 0xec, 0xdb, 0x8e, 0x9c, 0x3e, 0x6a, 0x19, 0xcc, 0x99, + 0x72, 0xe6, 0xb5, 0x7d, 0x6d, 0xfa, 0xe5, 0xd3, 0xe4, 0x90, + 0xb5, 0xb2, 0xb2, 0x12, 0x70, 0x4e, 0xca, 0xf8, 0x10, 0xf8, + 0xa3, 0x14, 0xc2, 0x48, 0x19, 0xeb, 0x60, 0x99, 0xbb, 0x2a, + 0x1f, 0xb1, 0x7a, 0xb1, 0x3d, 0x24, 0xfb, 0xa0, 0x29, 0xda, + 0xbd, 0x1b, 0xd7, 0xa4, 0xbf, 0xef, 0x60, 0x2d, 0x22, 0xca, + 0x65, 0x98, 0xf1, 0xc4, 0xe1, 0xc9, 0x02, 0x6b, 0x16, 0x28, + 0x2f, 0xa1, 0xaa, 0x79, 0x00, 0xda, 0xdc, 0x7c, 0x43, 0xf7, + 0x42, 0x3c, 0xa0, 0xef, 0x68, 0xf7, 0xdf, 0xb9, 0x69, 0xfb, + 0x8e, 0x01, 0xed, 0x01, 0x42, 0xb5, 0x4e, 0x57, 0xa6, 0x26, + 0xb8, 0xd0, 0x7b, 0x56, 0x6d, 0x03, 0xc6, 0x40, 0x8c, 0x8c, + 0x2a, 0x55, 0xd7, 0x9c, 0x35, 0x00, 0x94, 0x93, 0xec, 0x03, + 0xeb, 0x22, 0xef, 0x77, 0xbb, 0x79, 0x13, 0x3f, 0x15, 0xa1, + 0x8f, 0xca, 0xdf, 0xfd, 0xd3, 0xb8, 0xe1, 0xd4, 0xcc, 0x09, + 0x3f, 0x3c, 0x2c, 0xdb, 0xd1, 0x49, 0x7f, 0x38, 0x07, 0x83, + 0x6d, 0xeb, 0x08, 0x66, 0xe9, 0x06, 0x44, 0x12, 0xac, 0x95, + 0x22, 0x90, 0x23, 0x67, 0xd4, 0x08, 0xcc, 0xf4, 0xb7, 0xdc, + 0xcc, 0x87, 0xd4, 0xac, 0x69, 0x35, 0x4c, 0xb5, 0x39, 0x36, + 0xcd, 0xa4, 0xd2, 0x95, 0xca, 0x0d, 0xc5, 0xda, 0xc2, 0xc5, + 0x22, 0x32, 0x28, 0x08, 0xe3, 0xd2, 0x8b, 0x38, 0x30, 0xdc, + 0x8c, 0x75, 0x4f, 0x6a, 0xec, 0x7a, 0xac, 0x16, 0x3e, 0xa8, + 0xd4, 0x6a, 0x45, 0xe1, 0xa8, 0x4f, 0x2e, 0x80, 0x34, 0xaa, + 0x54, 0x1b, 0x02, 0x95, 0x7d, 0x8a, 0x6d, 0xcc, 0x79, 0xca, + 0xf2, 0xa4, 0x2e, 0x8d, 0xfb, 0xfe, 0x15, 0x51, 0x10, 0x0e, + 0x4d, 0x88, 0xb1, 0xc7, 0xf4, 0x79, 0xdb, 0xf0, 0xb4, 0x56, + 0x44, 0x37, 0xca, 0x5a, 0xc1, 0x8c, 0x48, 0xac, 0xae, 0x48, + 0x80, 0x83, 0x01, 0x3f, 0xde, 0xd9, 0xd3, 0x2c, 0x51, 0x46, + 0xb1, 0x41, 0xb6, 0xc6, 0x91, 0x72, 0xf9, 0x83, 0x55, 0x1b, + 0x8c, 0xba, 0xf3, 0x73, 0xe5, 0x2c, 0x74, 0x50, 0x3a, 0xbe, + 0xc5, 0x2f, 0xa7, 0xb2, 0x6d, 0x8c, 0x9e, 0x13, 0x77, 0xa3, + 0x13, 0xcd, 0x6d, 0x8c, 0x45, 0xe1, 0xfc, 0x0b, 0xb7, 0x69, + 0xe9, 0x27, 0xbc, 0x65, 0xc3, 0xfa, 0x9b, 0xd0, 0xef, 0xfe, + 0xe8, 0x1f, 0xb3, 0x5e, 0x34, 0xf4, 0x8c, 0xea, 0xfc, 0xd3, + 0x81, 0xbf, 0x3d, 0x30, 0xb2, 0xb4, 0x01, 0xe8, 0x43, 0x0f, + 0xba, 0x02, 0x23, 0x42, 0x76, 0x82, 0x31, 0x73, 0x91, 0xed, + 0x07, 0x46, 0x61, 0x0d, 0x39, 0x83, 0x40, 0xce, 0x7a, 0xd4, + 0xdb, 0x80, 0x2c, 0x1f, 0x0d, 0xd1, 0x34, 0xd4, 0x92, 0xe3, + 0xd4, 0xf1, 0xc2, 0x01, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, + 0x82, 0x02, 0x01, 0x00, 0x97, 0x6c, 0xda, 0x6e, 0xea, 0x4f, + 0xcf, 0xaf, 0xf7, 0x4c, 0xd9, 0xf1, 0x90, 0x00, 0x77, 0xdb, + 0xf2, 0x97, 0x76, 0x72, 0xb9, 0xb7, 0x47, 0xd1, 0x9c, 0xdd, + 0xcb, 0x4a, 0x33, 0x6e, 0xc9, 0x75, 0x76, 0xe6, 0xe4, 0xa5, + 0x31, 0x8c, 0x77, 0x13, 0xb4, 0x29, 0xcd, 0xf5, 0x52, 0x17, + 0xef, 0xf3, 0x08, 0x00, 0xe3, 0xbd, 0x2e, 0xbc, 0xd4, 0x52, + 0x88, 0xe9, 0x30, 0x75, 0x0b, 0x02, 0xf5, 0xcd, 0x89, 0x0c, + 0x6c, 0x57, 0x19, 0x27, 0x3d, 0x1e, 0x85, 0xb4, 0xc1, 0x2f, + 0x1d, 0x92, 0x00, 0x5c, 0x76, 0x29, 0x4b, 0xa4, 0xe1, 0x12, + 0xb3, 0xc8, 0x09, 0xfe, 0x0e, 0x78, 0x72, 0x61, 0xcb, 0x61, + 0x6f, 0x39, 0x91, 0x95, 0x4e, 0xd5, 0x3e, 0xc7, 0x8f, 0xb8, + 0xf6, 0x36, 0xfe, 0x9c, 0x93, 0x9a, 0x38, 0x25, 0x7a, 0xf4, + 0x4a, 0x12, 0xd4, 0xa0, 0x13, 0xbd, 0xf9, 0x1d, 0x12, 0x3e, + 0x21, 0x39, 0xfb, 0x72, 0xe0, 0x05, 0x3d, 0xc3, 0xe5, 0x50, + 0xa8, 0x5d, 0x85, 0xa3, 0xea, 0x5f, 0x1c, 0xb2, 0x3f, 0xea, + 0x6d, 0x03, 0x91, 0x55, 0xd8, 0x19, 0x0a, 0x21, 0x12, 0x16, + 0xd9, 0x12, 0xc4, 0xe6, 0x07, 0x18, 0x5b, 0x26, 0xa4, 0xae, + 0xed, 0x2b, 0xb7, 0xa6, 0xed, 0xf8, 0xad, 0xec, 0x77, 0xe6, + 0x7f, 0x4f, 0x76, 0x00, 0xc0, 0xfa, 0x15, 0x92, 0xb4, 0x2c, + 0x22, 0xc2, 0xeb, 0x6a, 0xad, 0x14, 0x05, 0xb2, 0xe5, 0x8a, + 0x9e, 0x85, 0x83, 0xcc, 0x04, 0xf1, 0x56, 0x78, 0x44, 0x5e, + 0xde, 0xe0, 0x60, 0x1a, 0x65, 0x79, 0x31, 0x23, 0x05, 0xbb, + 0x01, 0xff, 0xdd, 0x2e, 0xb7, 0xb3, 0xaa, 0x74, 0xe0, 0xa5, + 0x94, 0xaf, 0x4b, 0xde, 0x58, 0x0f, 0x55, 0xde, 0x33, 0xf6, + 0xe3, 0xd6, 0x34, 0x36, 0x57, 0xd6, 0x79, 0x91, 0x2e, 0xbe, + 0x3b, 0xd9, 0x4e, 0xb6, 0x9d, 0x21, 0x5c, 0xd3, 0x48, 0x14, + 0x7f, 0x4a, 0xc4, 0x60, 0xa9, 0x29, 0xf8, 0x53, 0x7f, 0x88, + 0x11, 0x2d, 0xb5, 0xc5, 0x2d, 0x6f, 0xee, 0x85, 0x0b, 0xf7, + 0x8d, 0x9a, 0xbe, 0xb0, 0x42, 0xf2, 0x2e, 0x71, 0xaf, 0x19, + 0x31, 0x6d, 0xec, 0xcd, 0x6f, 0x2b, 0x23, 0xdf, 0xb4, 0x40, + 0xaf, 0x2c, 0x0a, 0xc3, 0x1b, 0x7d, 0x7d, 0x03, 0x1d, 0x4b, + 0xf3, 0xb5, 0xe0, 0x85, 0xd8, 0xdf, 0x91, 0x6b, 0x0a, 0x69, + 0xf7, 0xf2, 0x69, 0x66, 0x5b, 0xf1, 0xcf, 0x46, 0x7d, 0xe9, + 0x70, 0xfa, 0x6d, 0x7e, 0x75, 0x4e, 0xa9, 0x77, 0xe6, 0x8c, + 0x02, 0xf7, 0x14, 0x4d, 0xa5, 0x41, 0x8f, 0x3f, 0xc1, 0x62, + 0x1e, 0x71, 0x5e, 0x38, 0xb4, 0xd6, 0xe6, 0xe1, 0x4b, 0xc2, + 0x2c, 0x30, 0x83, 0x81, 0x6f, 0x49, 0x2e, 0x96, 0xe6, 0xc9, + 0x9a, 0xf7, 0x5d, 0x09, 0xa0, 0x55, 0x02, 0xa5, 0x3a, 0x25, + 0x23, 0xd0, 0x92, 0xc3, 0xa3, 0xe3, 0x0e, 0x12, 0x2f, 0x4d, + 0xef, 0xf3, 0x55, 0x5a, 0xbe, 0xe6, 0x19, 0x86, 0x31, 0xab, + 0x75, 0x9a, 0xd3, 0xf0, 0x2c, 0xc5, 0x41, 0x92, 0xd9, 0x1f, + 0x5f, 0x11, 0x8c, 0x75, 0x1c, 0x63, 0xd0, 0x02, 0x80, 0x2c, + 0x68, 0xcb, 0x93, 0xfb, 0x51, 0x73, 0x49, 0xb4, 0x60, 0xda, + 0xe2, 0x26, 0xaf, 0xa9, 0x46, 0x12, 0xb8, 0xec, 0x50, 0xdd, + 0x12, 0x06, 0x5f, 0xce, 0x59, 0xe6, 0xf6, 0x1c, 0xe0, 0x54, + 0x10, 0xad, 0xf6, 0xcd, 0x98, 0xcc, 0x0f, 0xfb, 0xcb, 0x41, + 0x14, 0x9d, 0xed, 0xe4, 0xb4, 0x74, 0x5f, 0x09, 0x60, 0xc7, + 0x12, 0xf6, 0x7b, 0x3c, 0x8f, 0xa7, 0x20, 0xbc, 0xe4, 0xb1, + 0xef, 0xeb, 0xa4, 0x93, 0xc5, 0x06, 0xca, 0x9a, 0x27, 0x9d, + 0x87, 0xf3, 0xde, 0xca, 0xe5, 0xe7, 0xf6, 0x1c, 0x01, 0x65, + 0x5b, 0xfb, 0x19, 0x79, 0x6e, 0x08, 0x26, 0xc5, 0xc8, 0x28, + 0x0e, 0xb6, 0x3b, 0x07, 0x08, 0xc1, 0x02, 0x82, 0x01, 0x01, + 0x00, 0xe8, 0x1c, 0x73, 0xa6, 0xb8, 0xe0, 0x0e, 0x6d, 0x8d, + 0x1b, 0xb9, 0x53, 0xed, 0x58, 0x94, 0xe6, 0x1d, 0x60, 0x14, + 0x5c, 0x76, 0x43, 0xc4, 0x58, 0x19, 0xc4, 0x24, 0xe8, 0xbc, + 0x1b, 0x3b, 0x0b, 0x13, 0x24, 0x45, 0x54, 0x0e, 0xcc, 0x37, + 0xf0, 0xe0, 0x63, 0x7d, 0xc3, 0xf7, 0xfb, 0x81, 0x74, 0x81, + 0xc4, 0x0f, 0x1a, 0x21, 0x48, 0xaf, 0xce, 0xc1, 0xc4, 0x94, + 0x18, 0x06, 0x44, 0x8d, 0xd3, 0xd2, 0x22, 0x2d, 0x2d, 0x3e, + 0x5a, 0x31, 0xdc, 0x95, 0x8e, 0xf4, 0x41, 0xfc, 0x58, 0xc9, + 0x40, 0x92, 0x17, 0x5f, 0xe3, 0xda, 0xac, 0x9e, 0x3f, 0x1c, + 0x2a, 0x6b, 0x58, 0x5f, 0x48, 0x78, 0x20, 0xb1, 0xaf, 0x24, + 0x9b, 0x3c, 0x20, 0x8b, 0x93, 0x25, 0x9e, 0xe6, 0x6b, 0xbc, + 0x13, 0x42, 0x14, 0x6c, 0x36, 0x31, 0xff, 0x7a, 0xd1, 0xc1, + 0x1a, 0x26, 0x14, 0x7f, 0xa9, 0x76, 0xa7, 0x0c, 0xf8, 0xcc, + 0xed, 0x07, 0x6a, 0xd2, 0xdf, 0x62, 0xee, 0x0a, 0x7c, 0x84, + 0xcb, 0x49, 0x90, 0xb2, 0x03, 0x0d, 0xa2, 0x82, 0x06, 0x77, + 0xf1, 0xcd, 0x67, 0xf2, 0x47, 0x21, 0x02, 0x3f, 0x43, 0x21, + 0xf0, 0x46, 0x30, 0x62, 0x51, 0x72, 0xb1, 0xe7, 0x48, 0xc6, + 0x67, 0x12, 0xcd, 0x9e, 0xd6, 0x15, 0xe5, 0x21, 0xed, 0xfa, + 0x8f, 0x30, 0xa6, 0x41, 0xfe, 0xb6, 0xfa, 0x8f, 0x34, 0x14, + 0x19, 0xe8, 0x11, 0xf7, 0xa5, 0x77, 0x3e, 0xb7, 0xf9, 0x39, + 0x07, 0x8c, 0x67, 0x2a, 0xab, 0x7b, 0x08, 0xf8, 0xb0, 0x06, + 0xa8, 0xea, 0x2f, 0x8f, 0xfa, 0xcc, 0xcc, 0x40, 0xce, 0xf3, + 0x70, 0x4f, 0x3f, 0x7f, 0xe2, 0x0c, 0xea, 0x76, 0x4a, 0x35, + 0x4e, 0x47, 0xad, 0x2b, 0xa7, 0x97, 0x5d, 0x74, 0x43, 0x97, + 0x90, 0xd2, 0xfb, 0xd9, 0xf9, 0x96, 0x01, 0x33, 0x05, 0xed, + 0x7b, 0x03, 0x05, 0xad, 0xf8, 0x49, 0x03, 0x02, 0x82, 0x01, + 0x01, 0x00, 0xd4, 0x40, 0x17, 0x66, 0x10, 0x92, 0x95, 0xc8, + 0xec, 0x62, 0xa9, 0x7a, 0xcb, 0x93, 0x8e, 0xe6, 0x53, 0xd4, + 0x80, 0x48, 0x27, 0x4b, 0x41, 0xce, 0x61, 0xdf, 0xbf, 0x94, + 0xa4, 0x3d, 0x71, 0x03, 0x0b, 0xed, 0x25, 0x71, 0x98, 0xa4, + 0xd6, 0xd5, 0x4a, 0x57, 0xf5, 0x6c, 0x1b, 0xda, 0x21, 0x7d, + 0x35, 0x45, 0xb3, 0xf3, 0x6a, 0xd9, 0xd3, 0x43, 0xe8, 0x5c, + 0x54, 0x1c, 0x83, 0x1b, 0xb4, 0x5f, 0xf2, 0x97, 0x24, 0x2e, + 0xdc, 0x40, 0xde, 0x92, 0x23, 0x59, 0x8e, 0xbc, 0xd2, 0xa1, + 0xf2, 0xe0, 0x4c, 0xdd, 0x0b, 0xd1, 0xe7, 0xae, 0x65, 0xbc, + 0xb5, 0xf5, 0x5b, 0x98, 0xe9, 0xd7, 0xc2, 0xb7, 0x0e, 0x55, + 0x71, 0x0e, 0x3c, 0x0a, 0x24, 0x6b, 0xa6, 0xe6, 0x14, 0x61, + 0x11, 0xfd, 0x33, 0x42, 0x99, 0x2b, 0x84, 0x77, 0x74, 0x92, + 0x91, 0xf5, 0x79, 0x79, 0xcf, 0xad, 0x8e, 0x04, 0xef, 0x80, + 0x1e, 0x57, 0xf4, 0x14, 0xf5, 0x35, 0x09, 0x74, 0xb2, 0x13, + 0x71, 0x58, 0x6b, 0xea, 0x32, 0x5d, 0xf3, 0xd3, 0x76, 0x48, + 0x39, 0x10, 0x23, 0x84, 0x9d, 0xbe, 0x92, 0x77, 0x4a, 0xed, + 0x70, 0x3e, 0x1a, 0xa2, 0x6c, 0xb3, 0x81, 0x00, 0xc3, 0xc9, + 0xe4, 0x52, 0xc8, 0x24, 0x88, 0x0c, 0x41, 0xad, 0x87, 0x5a, + 0xea, 0xa3, 0x7a, 0x85, 0x1c, 0x5e, 0x31, 0x7f, 0xc3, 0x35, + 0xc6, 0xfa, 0x10, 0xc8, 0x75, 0x10, 0xc4, 0x96, 0x99, 0xe7, + 0xfe, 0x01, 0xb4, 0x74, 0xdb, 0xb4, 0x11, 0xc3, 0xc8, 0x8c, + 0xf6, 0xf7, 0x3b, 0x66, 0x50, 0xfc, 0xdb, 0xeb, 0xca, 0x47, + 0x85, 0x89, 0xe1, 0x65, 0xd9, 0x62, 0x34, 0x3c, 0x70, 0xd8, + 0x2e, 0xb4, 0x2f, 0x65, 0x3c, 0x4a, 0xa6, 0x2a, 0xe7, 0xc7, + 0xd8, 0x41, 0x8f, 0x8a, 0x43, 0xbf, 0x42, 0xf2, 0x4d, 0xbc, + 0xfc, 0x9e, 0x27, 0x95, 0xfb, 0x75, 0xff, 0xab, 0x02, 0x82, + 0x01, 0x00, 0x41, 0x2f, 0x44, 0x57, 0x6d, 0x12, 0x17, 0x5b, + 0x32, 0xc6, 0xb7, 0x6c, 0x57, 0x7a, 0x8a, 0x0e, 0x79, 0xef, + 0x72, 0xa8, 0x68, 0xda, 0x2d, 0x38, 0xe4, 0xbb, 0x8d, 0xf6, + 0x02, 0x65, 0xcf, 0x56, 0x13, 0xe1, 0x1a, 0xcb, 0x39, 0x80, + 0xa6, 0xb1, 0x32, 0x03, 0x1e, 0xdd, 0xbb, 0x35, 0xd9, 0xac, + 0x43, 0x89, 0x31, 0x08, 0x90, 0x92, 0x5e, 0x35, 0x3d, 0x7b, + 0x9c, 0x6f, 0x86, 0xcb, 0x17, 0xdd, 0x85, 0xe4, 0xed, 0x35, + 0x08, 0x8e, 0xc1, 0xf4, 0x05, 0xd8, 0x68, 0xc6, 0x63, 0x3c, + 0xf7, 0xff, 0xf7, 0x47, 0x33, 0x39, 0xc5, 0x3e, 0xb7, 0x0e, + 0x58, 0x35, 0x9d, 0x81, 0xea, 0xf8, 0x6a, 0x2c, 0x1c, 0x5a, + 0x68, 0x78, 0x64, 0x11, 0x6b, 0xc1, 0x3e, 0x4e, 0x7a, 0xbd, + 0x84, 0xcb, 0x0f, 0xc2, 0xb6, 0x85, 0x1d, 0xd3, 0x76, 0xc5, + 0x93, 0x6a, 0x69, 0x89, 0x56, 0x34, 0xdc, 0x4a, 0x9b, 0xbc, + 0xff, 0xa8, 0x0d, 0x6e, 0x35, 0x9c, 0x60, 0xa7, 0x23, 0x30, + 0xc7, 0x06, 0x64, 0x39, 0x8b, 0x94, 0x89, 0xee, 0xba, 0x7f, + 0x60, 0x8d, 0xfa, 0xb6, 0x97, 0x76, 0xdc, 0x51, 0x4a, 0x3c, + 0xeb, 0x3a, 0x14, 0x2c, 0x20, 0x60, 0x69, 0x4a, 0x86, 0xfe, + 0x8c, 0x21, 0x84, 0x49, 0x54, 0xb3, 0x20, 0xe1, 0x01, 0x7f, + 0x58, 0xdf, 0x7f, 0xb5, 0x21, 0x51, 0x8c, 0x47, 0x9f, 0x91, + 0xeb, 0x97, 0x3e, 0xf2, 0x54, 0xcf, 0x16, 0x46, 0xf9, 0xd9, + 0xb6, 0xe7, 0x64, 0xc9, 0xd0, 0x54, 0xea, 0x2f, 0xa1, 0xcf, + 0xa5, 0x7f, 0x28, 0x8d, 0x84, 0xec, 0xd5, 0x39, 0x03, 0x76, + 0x5b, 0x2d, 0x8e, 0x43, 0xf2, 0x01, 0x24, 0xc9, 0x6f, 0xc0, + 0xf5, 0x69, 0x6f, 0x7d, 0xb5, 0x85, 0xd2, 0x5f, 0x7f, 0x78, + 0x40, 0x07, 0x7f, 0x09, 0x15, 0xb5, 0x1f, 0x28, 0x65, 0x10, + 0xe4, 0x19, 0xa8, 0xc6, 0x9e, 0x8d, 0xdc, 0xcb, 0x02, 0x82, + 0x01, 0x00, 0x13, 0x01, 0xee, 0x56, 0x80, 0x93, 0x70, 0x00, + 0x7f, 0x52, 0xd2, 0x94, 0xa1, 0x98, 0x84, 0x4a, 0x92, 0x25, + 0x4c, 0x9b, 0xa9, 0x91, 0x2e, 0xc2, 0x79, 0xb7, 0x5c, 0xe3, + 0xc5, 0xd5, 0x8e, 0xc2, 0x54, 0x16, 0x17, 0xad, 0x55, 0x9b, + 0x25, 0x76, 0x12, 0x63, 0x50, 0x22, 0x2f, 0x58, 0x58, 0x79, + 0x6b, 0x04, 0xe3, 0xf9, 0x9f, 0x8f, 0x04, 0x41, 0x67, 0x94, + 0xa5, 0x1f, 0xac, 0x8a, 0x15, 0x9c, 0x26, 0x10, 0x6c, 0xf8, + 0x19, 0x57, 0x61, 0xd7, 0x3a, 0x7d, 0x31, 0xb0, 0x2d, 0x38, + 0xbd, 0x94, 0x62, 0xad, 0xc4, 0xfa, 0x36, 0x42, 0x42, 0xf0, + 0x24, 0x67, 0x65, 0x9d, 0x8b, 0x0b, 0x7c, 0x6f, 0x82, 0x44, + 0x1a, 0x8c, 0xc8, 0xc9, 0xab, 0xbb, 0x4c, 0x45, 0xfc, 0x7b, + 0x38, 0xee, 0x30, 0xe1, 0xfc, 0xef, 0x8d, 0xbc, 0x58, 0xdf, + 0x2b, 0x5d, 0x0d, 0x54, 0xe0, 0x49, 0x4d, 0x97, 0x99, 0x8f, + 0x22, 0xa8, 0x83, 0xbe, 0x40, 0xbb, 0x50, 0x2e, 0x78, 0x28, + 0x0f, 0x95, 0x78, 0x8c, 0x8f, 0x98, 0x24, 0x56, 0xc2, 0x97, + 0xf3, 0x2c, 0x43, 0xd2, 0x03, 0x82, 0x66, 0x81, 0x72, 0x5f, + 0x53, 0x16, 0xec, 0xb1, 0xb1, 0x04, 0x5e, 0x40, 0x20, 0x48, + 0x7b, 0x3f, 0x02, 0x97, 0x6a, 0xeb, 0x96, 0x12, 0x21, 0x35, + 0xfe, 0x1f, 0x47, 0xc0, 0x95, 0xea, 0xc5, 0x8a, 0x08, 0x84, + 0x4f, 0x5e, 0x63, 0x94, 0x60, 0x0f, 0x71, 0x5b, 0x7f, 0x4a, + 0xec, 0x4f, 0x60, 0xc6, 0xba, 0x4a, 0x24, 0xf1, 0x20, 0x8b, + 0xa7, 0x2e, 0x3a, 0xce, 0x8d, 0xe0, 0x27, 0x1d, 0xb5, 0x8e, + 0xb4, 0x21, 0xc5, 0xe2, 0xa6, 0x16, 0x0a, 0x51, 0x83, 0x55, + 0x88, 0xd1, 0x30, 0x11, 0x63, 0xd5, 0xd7, 0x8d, 0xae, 0x16, + 0x12, 0x82, 0xc4, 0x85, 0x00, 0x4e, 0x27, 0x83, 0xa5, 0x7c, + 0x90, 0x2e, 0xe5, 0xa2, 0xa3, 0xd3, 0x4c, 0x63, 0x02, 0x82, + 0x01, 0x01, 0x00, 0x86, 0x08, 0x98, 0x98, 0xa5, 0x00, 0x05, + 0x39, 0x77, 0xd9, 0x66, 0xb3, 0xcf, 0xca, 0xa0, 0x71, 0xb3, + 0x50, 0xce, 0x3d, 0xb1, 0x93, 0x95, 0x35, 0xc4, 0xd4, 0x2e, + 0x90, 0xdf, 0x0f, 0xfc, 0x60, 0xc1, 0x94, 0x68, 0x61, 0x43, + 0xca, 0x9a, 0x23, 0x4a, 0x1e, 0x45, 0x72, 0x99, 0xb5, 0x1e, + 0x61, 0x8d, 0x77, 0x0f, 0xa0, 0xbb, 0xd7, 0x77, 0xb4, 0x2a, + 0x15, 0x11, 0x88, 0x2d, 0xb3, 0x56, 0x61, 0x5e, 0x6a, 0xed, + 0xa4, 0x46, 0x4a, 0x3f, 0x50, 0x11, 0xd6, 0xba, 0xb6, 0xd7, + 0x95, 0x65, 0x53, 0xc3, 0xa1, 0x8f, 0xe0, 0xa3, 0xf5, 0x1c, + 0xfd, 0xaf, 0x6e, 0x43, 0xd7, 0x17, 0xa7, 0xd3, 0x81, 0x1b, + 0xa4, 0xdf, 0xe0, 0x97, 0x8a, 0x46, 0x03, 0xd3, 0x46, 0x0e, + 0x83, 0x48, 0x4e, 0xd2, 0x02, 0xcb, 0xc0, 0xad, 0x79, 0x95, + 0x8c, 0x96, 0xba, 0x40, 0x34, 0x11, 0x71, 0x5e, 0xe9, 0x11, + 0xf9, 0xc5, 0x4a, 0x5e, 0x91, 0x9d, 0xf5, 0x92, 0x4f, 0xeb, + 0xc6, 0x70, 0x02, 0x2d, 0x3d, 0x04, 0xaa, 0xe9, 0x3a, 0x8e, + 0xd5, 0xa8, 0xad, 0xf7, 0xce, 0x0d, 0x16, 0xb2, 0xec, 0x0a, + 0x9c, 0xf5, 0x94, 0x39, 0xb9, 0x8a, 0xfc, 0x1e, 0xf9, 0xcc, + 0xf2, 0x5f, 0x21, 0x31, 0x74, 0x72, 0x6b, 0x64, 0xae, 0x35, + 0x61, 0x8d, 0x0d, 0xcb, 0xe7, 0xda, 0x39, 0xca, 0xf3, 0x21, + 0x66, 0x0b, 0x95, 0xd7, 0x0a, 0x7c, 0xca, 0xa1, 0xa9, 0x5a, + 0xe8, 0xac, 0xe0, 0x71, 0x54, 0xaf, 0x28, 0xcf, 0xd5, 0x70, + 0x89, 0xe0, 0xf3, 0x9e, 0x43, 0x6c, 0x8d, 0x7b, 0x99, 0x01, + 0x68, 0x4d, 0xa1, 0x45, 0x46, 0x0c, 0x43, 0xbc, 0xcc, 0x2c, + 0xdd, 0xc5, 0x46, 0xc8, 0x4e, 0x0e, 0xbe, 0xed, 0xb9, 0x26, + 0xab, 0x2e, 0xdb, 0xeb, 0x8f, 0xff, 0xdb, 0xb0, 0xc6, 0x55, + 0xaf, 0xf8, 0x2a, 0x91, 0x9d, 0x50, 0x44, 0x21, 0x17, +}; + static void sig_done(int sig) { @@ -362,17 +1067,15 @@ speed_main(int argc, char **argv) #define R_RSA_2048 2 #define R_RSA_4096 3 -#define R_EC_P160 0 -#define R_EC_P192 1 -#define R_EC_P224 2 -#define R_EC_P256 3 -#define R_EC_P384 4 -#define R_EC_P521 5 +#define R_EC_P224 0 +#define R_EC_P256 1 +#define R_EC_P384 2 +#define R_EC_P521 3 RSA *rsa_key[RSA_NUM]; long rsa_c[RSA_NUM][2]; static unsigned int rsa_bits[RSA_NUM] = {512, 1024, 2048, 4096}; - static unsigned char *rsa_data[RSA_NUM] = + static const unsigned char *rsa_data[RSA_NUM] = {test512, test1024, test2048, test4096}; static int rsa_data_length[RSA_NUM] = { sizeof(test512), sizeof(test1024), @@ -388,23 +1091,19 @@ speed_main(int argc, char **argv) * accordingly. */ static unsigned int test_curves[EC_NUM] = { - NID_secp160r1, - NID_X9_62_prime192v1, NID_secp224r1, NID_X9_62_prime256v1, NID_secp384r1, NID_secp521r1, }; static const char *test_curves_names[EC_NUM] = { - "secp160r1", - "nistp192", "nistp224", "nistp256", "nistp384", "nistp521", }; static int test_curves_bits[EC_NUM] = { - 160, 192, 224, 256, 384, 521, + 224, 256, 384, 521, }; #endif @@ -719,11 +1418,7 @@ speed_main(int argc, char **argv) dsa_doit[R_DSA_512] = 1; dsa_doit[R_DSA_1024] = 1; dsa_doit[R_DSA_2048] = 1; - } else if (strcmp(*argv, "ecdsap160") == 0) - ecdsa_doit[R_EC_P160] = 2; - else if (strcmp(*argv, "ecdsap192") == 0) - ecdsa_doit[R_EC_P192] = 2; - else if (strcmp(*argv, "ecdsap224") == 0) + } else if (strcmp(*argv, "ecdsap224") == 0) ecdsa_doit[R_EC_P224] = 2; else if (strcmp(*argv, "ecdsap256") == 0) ecdsa_doit[R_EC_P256] = 2; @@ -734,11 +1429,7 @@ speed_main(int argc, char **argv) else if (strcmp(*argv, "ecdsa") == 0) { for (i = 0; i < EC_NUM; i++) ecdsa_doit[i] = 1; - } else if (strcmp(*argv, "ecdhp160") == 0) - ecdh_doit[R_EC_P160] = 2; - else if (strcmp(*argv, "ecdhp192") == 0) - ecdh_doit[R_EC_P192] = 2; - else if (strcmp(*argv, "ecdhp224") == 0) + } else if (strcmp(*argv, "ecdhp224") == 0) ecdh_doit[R_EC_P224] = 2; else if (strcmp(*argv, "ecdhp256") == 0) ecdh_doit[R_EC_P256] = 2; @@ -816,8 +1507,8 @@ speed_main(int argc, char **argv) BIO_printf(bio_err, "rsa512 rsa1024 rsa2048 rsa4096\n"); BIO_printf(bio_err, "dsa512 dsa1024 dsa2048\n"); - BIO_printf(bio_err, "ecdsap160 ecdsap192 ecdsap224 ecdsap256 ecdsap384 ecdsap521\n"); - BIO_printf(bio_err, "ecdhp160 ecdhp192 ecdhp224 ecdhp256 ecdhp384 ecdhp521\n"); + BIO_printf(bio_err, "ecdsap224 ecdsap256 ecdsap384 ecdsap521\n"); + BIO_printf(bio_err, "ecdhp224 ecdhp256 ecdhp384 ecdhp521\n"); #ifndef OPENSSL_NO_IDEA BIO_printf(bio_err, "idea "); @@ -2104,4 +2795,5 @@ do_multi(int multi) free(fds); return 1; } -#endif + +#endif /* OPENSSL_NO_SPEED */ diff --git a/usr.bin/openssl/testdsa.h b/usr.bin/openssl/testdsa.h deleted file mode 100644 index 973e51f05..000000000 --- a/usr.bin/openssl/testdsa.h +++ /dev/null @@ -1,258 +0,0 @@ -/* $OpenBSD: testdsa.h,v 1.5 2022/01/10 19:22:26 tb Exp $ */ - -DSA *get_dsa512(void); -DSA *get_dsa1024(void); -DSA *get_dsa2048(void); - -DSA *get_dsa(const unsigned char *priv, size_t priv_size, - const unsigned char *pub, size_t pub_size, - const unsigned char *p, size_t p_size, - const unsigned char *q, size_t q_size, - const unsigned char *g, size_t g_size); - -static const unsigned char dsa512_priv[] = { - 0x65, 0xe5, 0xc7, 0x38, 0x60, 0x24, 0xb5, 0x89, 0xd4, 0x9c, 0xeb, 0x4c, - 0x9c, 0x1d, 0x7a, 0x22, 0xbd, 0xd1, 0xc2, 0xd2, -}; - -static const unsigned char dsa512_pub[] = { - 0x00, 0x95, 0xa7, 0x0d, 0xec, 0x93, 0x68, 0xba, 0x5f, 0xf7, 0x5f, 0x07, - 0xf2, 0x3b, 0xad, 0x6b, 0x01, 0xdc, 0xbe, 0xec, 0xde, 0x04, 0x7a, 0x3a, - 0x27, 0xb3, 0xec, 0x49, 0xfd, 0x08, 0x43, 0x3d, 0x7e, 0xa8, 0x2c, 0x5e, - 0x7b, 0xbb, 0xfc, 0xf4, 0x6e, 0xeb, 0x6c, 0xb0, 0x6e, 0xf8, 0x02, 0x12, - 0x8c, 0x38, 0x5d, 0x83, 0x56, 0x7d, 0xee, 0x53, 0x05, 0x3e, 0x24, 0x84, - 0xbe, 0xba, 0x0a, 0x6b, 0xc8, -}; - -static const unsigned char dsa512_p[] = { - 0x9D, 0x1B, 0x69, 0x8E, 0x26, 0xDB, 0xF2, 0x2B, 0x11, 0x70, 0x19, 0x86, - 0xF6, 0x19, 0xC8, 0xF8, 0x19, 0xF2, 0x18, 0x53, 0x94, 0x46, 0x06, 0xD0, - 0x62, 0x50, 0x33, 0x4B, 0x02, 0x3C, 0x52, 0x30, 0x03, 0x8B, 0x3B, 0xF9, - 0x5F, 0xD1, 0x24, 0x06, 0x4F, 0x7B, 0x4C, 0xBA, 0xAA, 0x40, 0x9B, 0xFD, - 0x96, 0xE4, 0x37, 0x33, 0xBB, 0x2D, 0x5A, 0xD7, 0x5A, 0x11, 0x40, 0x66, - 0xA2, 0x76, 0x7D, 0x31, -}; - -static const unsigned char dsa512_q[] = { - 0xFB, 0x53, 0xEF, 0x50, 0xB4, 0x40, 0x92, 0x31, 0x56, 0x86, 0x53, 0x7A, - 0xE8, 0x8B, 0x22, 0x9A, 0x49, 0xFB, 0x71, 0x8F, -}; - -static const unsigned char dsa512_g[] = { - 0x83, 0x3E, 0x88, 0xE5, 0xC5, 0x89, 0x73, 0xCE, 0x3B, 0x6C, 0x01, 0x49, - 0xBF, 0xB3, 0xC7, 0x9F, 0x0A, 0xEA, 0x44, 0x91, 0xE5, 0x30, 0xAA, 0xD9, - 0xBE, 0x5B, 0x5F, 0xB7, 0x10, 0xD7, 0x89, 0xB7, 0x8E, 0x74, 0xFB, 0xCF, - 0x29, 0x1E, 0xEB, 0xA8, 0x2C, 0x54, 0x51, 0xB8, 0x10, 0xDE, 0xA0, 0xCE, - 0x2F, 0xCC, 0x24, 0x6B, 0x90, 0x77, 0xDE, 0xA2, 0x68, 0xA6, 0x52, 0x12, - 0xA2, 0x03, 0x9D, 0x20, -}; - -DSA * -get_dsa512(void) -{ - return get_dsa(dsa512_priv, sizeof(dsa512_priv), - dsa512_pub, sizeof(dsa512_pub), dsa512_p, sizeof(dsa512_p), - dsa512_q, sizeof(dsa512_q), dsa512_g, sizeof(dsa512_g)); -} - -static const unsigned char dsa1024_priv[] = { - 0x7d, 0x21, 0xda, 0xbb, 0x62, 0x15, 0x47, 0x36, 0x07, 0x67, 0x12, 0xe8, - 0x8c, 0xaa, 0x1c, 0xcd, 0x38, 0x12, 0x61, 0x18, -}; - -static const unsigned char dsa1024_pub[] = { - 0x3c, 0x4e, 0x9c, 0x2a, 0x7f, 0x16, 0xc1, 0x25, 0xeb, 0xac, 0x78, 0x63, - 0x90, 0x14, 0x8c, 0x8b, 0xf4, 0x68, 0x43, 0x3c, 0x2d, 0xee, 0x65, 0x50, - 0x7d, 0x9c, 0x8f, 0x8c, 0x8a, 0x51, 0xd6, 0x11, 0x2b, 0x99, 0xaf, 0x1e, - 0x90, 0x97, 0xb5, 0xd3, 0xa6, 0x20, 0x25, 0xd6, 0xfe, 0x43, 0x02, 0xd5, - 0x91, 0x7d, 0xa7, 0x8c, 0xdb, 0xc9, 0x85, 0xa3, 0x36, 0x48, 0xf7, 0x68, - 0xaa, 0x60, 0xb1, 0xf7, 0x05, 0x68, 0x3a, 0xa3, 0x3f, 0xd3, 0x19, 0x82, - 0xd8, 0x82, 0x7a, 0x77, 0xfb, 0xef, 0xf4, 0x15, 0x0a, 0xeb, 0x06, 0x04, - 0x7f, 0x53, 0x07, 0x0c, 0xbc, 0xcb, 0x2d, 0x83, 0xdb, 0x3e, 0xd1, 0x28, - 0xa5, 0xa1, 0x31, 0xe0, 0x67, 0xfa, 0x50, 0xde, 0x9b, 0x07, 0x83, 0x7e, - 0x2c, 0x0b, 0xc3, 0x13, 0x50, 0x61, 0xe5, 0xad, 0xbd, 0x36, 0xb8, 0x97, - 0x4e, 0x40, 0x7d, 0xe8, 0x83, 0x0d, 0xbc, 0x4b -}; - -static const unsigned char dsa1024_p[] = { - 0xA7, 0x3F, 0x6E, 0x85, 0xBF, 0x41, 0x6A, 0x29, 0x7D, 0xF0, 0x9F, 0x47, - 0x19, 0x30, 0x90, 0x9A, 0x09, 0x1D, 0xDA, 0x6A, 0x33, 0x1E, 0xC5, 0x3D, - 0x86, 0x96, 0xB3, 0x15, 0xE0, 0x53, 0x2E, 0x8F, 0xE0, 0x59, 0x82, 0x73, - 0x90, 0x3E, 0x75, 0x31, 0x99, 0x47, 0x7A, 0x52, 0xFB, 0x85, 0xE4, 0xD9, - 0xA6, 0x7B, 0x38, 0x9B, 0x68, 0x8A, 0x84, 0x9B, 0x87, 0xC6, 0x1E, 0xB5, - 0x7E, 0x86, 0x4B, 0x53, 0x5B, 0x59, 0xCF, 0x71, 0x65, 0x19, 0x88, 0x6E, - 0xCE, 0x66, 0xAE, 0x6B, 0x88, 0x36, 0xFB, 0xEC, 0x28, 0xDC, 0xC2, 0xD7, - 0xA5, 0xBB, 0xE5, 0x2C, 0x39, 0x26, 0x4B, 0xDA, 0x9A, 0x70, 0x18, 0x95, - 0x37, 0x95, 0x10, 0x56, 0x23, 0xF6, 0x15, 0xED, 0xBA, 0x04, 0x5E, 0xDE, - 0x39, 0x4F, 0xFD, 0xB7, 0x43, 0x1F, 0xB5, 0xA4, 0x65, 0x6F, 0xCD, 0x80, - 0x11, 0xE4, 0x70, 0x95, 0x5B, 0x50, 0xCD, 0x49, -}; - -static const unsigned char dsa1024_q[] = { - 0xF7, 0x07, 0x31, 0xED, 0xFA, 0x6C, 0x06, 0x03, 0xD5, 0x85, 0x8A, 0x1C, - 0xAC, 0x9C, 0x65, 0xE7, 0x50, 0x66, 0x65, 0x6F, -}; - -static const unsigned char dsa1024_g[] = { - 0x4D, 0xDF, 0x4C, 0x03, 0xA6, 0x91, 0x8A, 0xF5, 0x19, 0x6F, 0x50, 0x46, - 0x25, 0x99, 0xE5, 0x68, 0x6F, 0x30, 0xE3, 0x69, 0xE1, 0xE5, 0xB3, 0x5D, - 0x98, 0xBB, 0x28, 0x86, 0x48, 0xFC, 0xDE, 0x99, 0x04, 0x3F, 0x5F, 0x88, - 0x0C, 0x9C, 0x73, 0x24, 0x0D, 0x20, 0x5D, 0xB9, 0x2A, 0x9A, 0x3F, 0x18, - 0x96, 0x27, 0xE4, 0x62, 0x87, 0xC1, 0x7B, 0x74, 0x62, 0x53, 0xFC, 0x61, - 0x27, 0xA8, 0x7A, 0x91, 0x09, 0x9D, 0xB6, 0xF1, 0x4D, 0x9C, 0x54, 0x0F, - 0x58, 0x06, 0xEE, 0x49, 0x74, 0x07, 0xCE, 0x55, 0x7E, 0x23, 0xCE, 0x16, - 0xF6, 0xCA, 0xDC, 0x5A, 0x61, 0x01, 0x7E, 0xC9, 0x71, 0xB5, 0x4D, 0xF6, - 0xDC, 0x34, 0x29, 0x87, 0x68, 0xF6, 0x5E, 0x20, 0x93, 0xB3, 0xDB, 0xF5, - 0xE4, 0x09, 0x6C, 0x41, 0x17, 0x95, 0x92, 0xEB, 0x01, 0xB5, 0x73, 0xA5, - 0x6A, 0x7E, 0xD8, 0x32, 0xED, 0x0E, 0x02, 0xB8, -}; - -DSA * -get_dsa1024(void) -{ - return get_dsa(dsa1024_priv, sizeof(dsa1024_priv), - dsa1024_pub, sizeof(dsa1024_pub), dsa1024_p, sizeof(dsa1024_p), - dsa1024_q, sizeof(dsa1024_q), dsa1024_g, sizeof(dsa1024_g)); -} - -static const unsigned char dsa2048_priv[] = { - 0x32, 0x67, 0x92, 0xf6, 0xc4, 0xe2, 0xe2, 0xe8, 0xa0, 0x8b, 0x6b, 0x45, - 0x0c, 0x8a, 0x76, 0xb0, 0xee, 0xcf, 0x91, 0xa7, -}; - -static const unsigned char dsa2048_pub[] = { - 0x17, 0x8f, 0xa8, 0x11, 0x84, 0x92, 0xec, 0x83, 0x47, 0xc7, 0x6a, 0xb0, - 0x92, 0xaf, 0x5a, 0x20, 0x37, 0xa3, 0x64, 0x79, 0xd2, 0xd0, 0x3d, 0xcd, - 0xe0, 0x61, 0x88, 0x88, 0x21, 0xcc, 0x74, 0x5d, 0xce, 0x4c, 0x51, 0x47, - 0xf0, 0xc5, 0x5c, 0x4c, 0x82, 0x7a, 0xaf, 0x72, 0xad, 0xb9, 0xe0, 0x53, - 0xf2, 0x78, 0xb7, 0xf0, 0xb5, 0x48, 0x7f, 0x8a, 0x3a, 0x18, 0xd1, 0x9f, - 0x8b, 0x7d, 0xa5, 0x47, 0xb7, 0x95, 0xab, 0x98, 0xf8, 0x7b, 0x74, 0x50, - 0x56, 0x8e, 0x57, 0xf0, 0xee, 0xf5, 0xb7, 0xba, 0xab, 0x85, 0x86, 0xf9, - 0x2b, 0xef, 0x41, 0x56, 0xa0, 0xa4, 0x9f, 0xb7, 0x38, 0x00, 0x46, 0x0a, - 0xa6, 0xf1, 0xfc, 0x1f, 0xd8, 0x4e, 0x85, 0x44, 0x92, 0x43, 0x21, 0x5d, - 0x6e, 0xcc, 0xc2, 0xcb, 0x26, 0x31, 0x0d, 0x21, 0xc4, 0xbd, 0x8d, 0x24, - 0xbc, 0xd9, 0x18, 0x19, 0xd7, 0xdc, 0xf1, 0xe7, 0x93, 0x50, 0x48, 0x03, - 0x2c, 0xae, 0x2e, 0xe7, 0x49, 0x88, 0x5f, 0x93, 0x57, 0x27, 0x99, 0x36, - 0xb4, 0x20, 0xab, 0xfc, 0xa7, 0x2b, 0xf2, 0xd9, 0x98, 0xd7, 0xd4, 0x34, - 0x9d, 0x96, 0x50, 0x58, 0x9a, 0xea, 0x54, 0xf3, 0xee, 0xf5, 0x63, 0x14, - 0xee, 0x85, 0x83, 0x74, 0x76, 0xe1, 0x52, 0x95, 0xc3, 0xf7, 0xeb, 0x04, - 0x04, 0x7b, 0xa7, 0x28, 0x1b, 0xcc, 0xea, 0x4a, 0x4e, 0x84, 0xda, 0xd8, - 0x9c, 0x79, 0xd8, 0x9b, 0x66, 0x89, 0x2f, 0xcf, 0xac, 0xd7, 0x79, 0xf9, - 0xa9, 0xd8, 0x45, 0x13, 0x78, 0xb9, 0x00, 0x14, 0xc9, 0x7e, 0x22, 0x51, - 0x86, 0x67, 0xb0, 0x9f, 0x26, 0x11, 0x23, 0xc8, 0x38, 0xd7, 0x70, 0x1d, - 0x15, 0x8e, 0x4d, 0x4f, 0x95, 0x97, 0x40, 0xa1, 0xc2, 0x7e, 0x01, 0x18, - 0x72, 0xf4, 0x10, 0xe6, 0x8d, 0x52, 0x16, 0x7f, 0xf2, 0xc9, 0xf8, 0x33, - 0x8b, 0x33, 0xb7, 0xce, -}; - -static const unsigned char dsa2048_p[] = { - 0xA0, 0x25, 0xFA, 0xAD, 0xF4, 0x8E, 0xB9, 0xE5, 0x99, 0xF3, 0x5D, 0x6F, - 0x4F, 0x83, 0x34, 0xE2, 0x7E, 0xCF, 0x6F, 0xBF, 0x30, 0xAF, 0x6F, 0x81, - 0xEB, 0xF8, 0xC4, 0x13, 0xD9, 0xA0, 0x5D, 0x8B, 0x5C, 0x8E, 0xDC, 0xC2, - 0x1D, 0x0B, 0x41, 0x32, 0xB0, 0x1F, 0xFE, 0xEF, 0x0C, 0xC2, 0xA2, 0x7E, - 0x68, 0x5C, 0x28, 0x21, 0xE9, 0xF5, 0xB1, 0x58, 0x12, 0x63, 0x4C, 0x19, - 0x4E, 0xFF, 0x02, 0x4B, 0x92, 0xED, 0xD2, 0x07, 0x11, 0x4D, 0x8C, 0x58, - 0x16, 0x5C, 0x55, 0x8E, 0xAD, 0xA3, 0x67, 0x7D, 0xB9, 0x86, 0x6E, 0x0B, - 0xE6, 0x54, 0x6F, 0x40, 0xAE, 0x0E, 0x67, 0x4C, 0xF9, 0x12, 0x5B, 0x3C, - 0x08, 0x7A, 0xF7, 0xFC, 0x67, 0x86, 0x69, 0xE7, 0x0A, 0x94, 0x40, 0xBF, - 0x8B, 0x76, 0xFE, 0x26, 0xD1, 0xF2, 0xA1, 0x1A, 0x84, 0xA1, 0x43, 0x56, - 0x28, 0xBC, 0x9A, 0x5F, 0xD7, 0x3B, 0x69, 0x89, 0x8A, 0x36, 0x2C, 0x51, - 0xDF, 0x12, 0x77, 0x2F, 0x57, 0x7B, 0xA0, 0xAA, 0xDD, 0x7F, 0xA1, 0x62, - 0x3B, 0x40, 0x7B, 0x68, 0x1A, 0x8F, 0x0D, 0x38, 0xBB, 0x21, 0x5D, 0x18, - 0xFC, 0x0F, 0x46, 0xF7, 0xA3, 0xB0, 0x1D, 0x23, 0xC3, 0xD2, 0xC7, 0x72, - 0x51, 0x18, 0xDF, 0x46, 0x95, 0x79, 0xD9, 0xBD, 0xB5, 0x19, 0x02, 0x2C, - 0x87, 0xDC, 0xE7, 0x57, 0x82, 0x7E, 0xF1, 0x8B, 0x06, 0x3D, 0x00, 0xA5, - 0x7B, 0x6B, 0x26, 0x27, 0x91, 0x0F, 0x6A, 0x77, 0xE4, 0xD5, 0x04, 0xE4, - 0x12, 0x2C, 0x42, 0xFF, 0xD2, 0x88, 0xBB, 0xD3, 0x92, 0xA0, 0xF9, 0xC8, - 0x51, 0x64, 0x14, 0x5C, 0xD8, 0xF9, 0x6C, 0x47, 0x82, 0xB4, 0x1C, 0x7F, - 0x09, 0xB8, 0xF0, 0x25, 0x83, 0x1D, 0x3F, 0x3F, 0x05, 0xB3, 0x21, 0x0A, - 0x5D, 0xA7, 0xD8, 0x54, 0xC3, 0x65, 0x7D, 0xC3, 0xB0, 0x1D, 0xBF, 0xAE, - 0xF8, 0x68, 0xCF, 0x9B, -}; - -static const unsigned char dsa2048_q[] = { - 0x97, 0xE7, 0x33, 0x4D, 0xD3, 0x94, 0x3E, 0x0B, 0xDB, 0x62, 0x74, 0xC6, - 0xA1, 0x08, 0xDD, 0x19, 0xA3, 0x75, 0x17, 0x1B, -}; - -static const unsigned char dsa2048_g[] = { - 0x2C, 0x78, 0x16, 0x59, 0x34, 0x63, 0xF4, 0xF3, 0x92, 0xFC, 0xB5, 0xA5, - 0x4F, 0x13, 0xDE, 0x2F, 0x1C, 0xA4, 0x3C, 0xAE, 0xAD, 0x38, 0x3F, 0x7E, - 0x90, 0xBF, 0x96, 0xA6, 0xAE, 0x25, 0x90, 0x72, 0xF5, 0x8E, 0x80, 0x0C, - 0x39, 0x1C, 0xD9, 0xEC, 0xBA, 0x90, 0x5B, 0x3A, 0xE8, 0x58, 0x6C, 0x9E, - 0x30, 0x42, 0x37, 0x02, 0x31, 0x82, 0xBC, 0x6A, 0xDF, 0x6A, 0x09, 0x29, - 0xE3, 0xC0, 0x46, 0xD1, 0xCB, 0x85, 0xEC, 0x0C, 0x30, 0x5E, 0xEA, 0xC8, - 0x39, 0x8E, 0x22, 0x9F, 0x22, 0x10, 0xD2, 0x34, 0x61, 0x68, 0x37, 0x3D, - 0x2E, 0x4A, 0x5B, 0x9A, 0xF5, 0xC1, 0x48, 0xC6, 0xF6, 0xDC, 0x63, 0x1A, - 0xD3, 0x96, 0x64, 0xBA, 0x34, 0xC9, 0xD1, 0xA0, 0xD1, 0xAE, 0x6C, 0x2F, - 0x48, 0x17, 0x93, 0x14, 0x43, 0xED, 0xF0, 0x21, 0x30, 0x19, 0xC3, 0x1B, - 0x5F, 0xDE, 0xA3, 0xF0, 0x70, 0x78, 0x18, 0xE1, 0xA8, 0xE4, 0xEE, 0x2E, - 0x00, 0xA5, 0xE4, 0xB3, 0x17, 0xC8, 0x0C, 0x7D, 0x6E, 0x42, 0xDC, 0xB7, - 0x46, 0x00, 0x36, 0x4D, 0xD4, 0x46, 0xAA, 0x3D, 0x3C, 0x46, 0x89, 0x40, - 0xBF, 0x1D, 0x84, 0x77, 0x0A, 0x75, 0xF3, 0x87, 0x1D, 0x08, 0x4C, 0xA6, - 0xD1, 0xA9, 0x1C, 0x1E, 0x12, 0x1E, 0xE1, 0xC7, 0x30, 0x28, 0x76, 0xA5, - 0x7F, 0x6C, 0x85, 0x96, 0x2B, 0x6F, 0xDB, 0x80, 0x66, 0x26, 0xAE, 0xF5, - 0x93, 0xC7, 0x8E, 0xAE, 0x9A, 0xED, 0xE4, 0xCA, 0x04, 0xEA, 0x3B, 0x72, - 0xEF, 0xDC, 0x87, 0xED, 0x0D, 0xA5, 0x4C, 0x4A, 0xDD, 0x71, 0x22, 0x64, - 0x59, 0x69, 0x4E, 0x8E, 0xBF, 0x43, 0xDC, 0xAB, 0x8E, 0x66, 0xBB, 0x01, - 0xB6, 0xF4, 0xE7, 0xFD, 0xD2, 0xAD, 0x9F, 0x36, 0xC1, 0xA0, 0x29, 0x99, - 0xD1, 0x96, 0x70, 0x59, 0x06, 0x78, 0x35, 0xBD, 0x65, 0x55, 0x52, 0x9E, - 0xF8, 0xB2, 0xE5, 0x38, -}; - -DSA * -get_dsa2048(void) -{ - return get_dsa(dsa2048_priv, sizeof(dsa2048_priv), - dsa2048_pub, sizeof(dsa2048_pub), dsa2048_p, sizeof(dsa2048_p), - dsa2048_q, sizeof(dsa2048_q), dsa2048_g, sizeof(dsa2048_g)); -} - -DSA * -get_dsa(const unsigned char *priv, size_t priv_size, - const unsigned char *pub, size_t pub_size, - const unsigned char *p_char, size_t p_size, - const unsigned char *q_char, size_t q_size, - const unsigned char *g_char, size_t g_size) -{ - DSA *dsa; - BIGNUM *priv_key = NULL, *pub_key = NULL; - BIGNUM *p = NULL, *q = NULL, *g = NULL; - - if ((dsa = DSA_new()) == NULL) - return (NULL); - - priv_key = BN_bin2bn(priv, priv_size, NULL); - pub_key = BN_bin2bn(pub, pub_size, NULL); - if (priv_key == NULL || pub_key == NULL) - goto err; - - if (!DSA_set0_key(dsa, pub_key, priv_key)) - goto err; - pub_key = NULL; - priv_key = NULL; - - p = BN_bin2bn(p_char, p_size, NULL); - q = BN_bin2bn(q_char, q_size, NULL); - g = BN_bin2bn(g_char, g_size, NULL); - if (p == NULL || q == NULL || g == NULL) - goto err; - - if (!DSA_set0_pqg(dsa, p, q, g)) - goto err; - p = NULL; - q = NULL; - g = NULL; - - return dsa; - - err: - DSA_free(dsa); - BN_free(priv_key); - BN_free(pub_key); - BN_free(p); - BN_free(q); - BN_free(g); - - return NULL; -} diff --git a/usr.bin/openssl/testrsa.h b/usr.bin/openssl/testrsa.h deleted file mode 100644 index 789afa962..000000000 --- a/usr.bin/openssl/testrsa.h +++ /dev/null @@ -1,517 +0,0 @@ -/* $OpenBSD: testrsa.h,v 1.1 2014/08/26 17:47:25 jsing Exp $ */ -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */ - -static unsigned char test512[] = { - 0x30, 0x82, 0x01, 0x3a, 0x02, 0x01, 0x00, 0x02, 0x41, 0x00, - 0xd6, 0x33, 0xb9, 0xc8, 0xfb, 0x4f, 0x3c, 0x7d, 0xc0, 0x01, - 0x86, 0xd0, 0xe7, 0xa0, 0x55, 0xf2, 0x95, 0x93, 0xcc, 0x4f, - 0xb7, 0x5b, 0x67, 0x5b, 0x94, 0x68, 0xc9, 0x34, 0x15, 0xde, - 0xa5, 0x2e, 0x1c, 0x33, 0xc2, 0x6e, 0xfc, 0x34, 0x5e, 0x71, - 0x13, 0xb7, 0xd6, 0xee, 0xd8, 0xa5, 0x65, 0x05, 0x72, 0x87, - 0xa8, 0xb0, 0x77, 0xfe, 0x57, 0xf5, 0xfc, 0x5f, 0x55, 0x83, - 0x87, 0xdd, 0x57, 0x49, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, - 0x41, 0x00, 0xa7, 0xf7, 0x91, 0xc5, 0x0f, 0x84, 0x57, 0xdc, - 0x07, 0xf7, 0x6a, 0x7f, 0x60, 0x52, 0xb3, 0x72, 0xf1, 0x66, - 0x1f, 0x7d, 0x97, 0x3b, 0x9e, 0xb6, 0x0a, 0x8f, 0x8c, 0xcf, - 0x42, 0x23, 0x00, 0x04, 0xd4, 0x28, 0x0e, 0x1c, 0x90, 0xc4, - 0x11, 0x25, 0x25, 0xa5, 0x93, 0xa5, 0x2f, 0x70, 0x02, 0xdf, - 0x81, 0x9c, 0x49, 0x03, 0xa0, 0xf8, 0x6d, 0x54, 0x2e, 0x26, - 0xde, 0xaa, 0x85, 0x59, 0xa8, 0x31, 0x02, 0x21, 0x00, 0xeb, - 0x47, 0xd7, 0x3b, 0xf6, 0xc3, 0xdd, 0x5a, 0x46, 0xc5, 0xb9, - 0x2b, 0x9a, 0xa0, 0x09, 0x8f, 0xa6, 0xfb, 0xf3, 0x78, 0x7a, - 0x33, 0x70, 0x9d, 0x0f, 0x42, 0x6b, 0x13, 0x68, 0x24, 0xd3, - 0x15, 0x02, 0x21, 0x00, 0xe9, 0x10, 0xb0, 0xb3, 0x0d, 0xe2, - 0x82, 0x68, 0x77, 0x8a, 0x6e, 0x7c, 0xda, 0xbc, 0x3e, 0x53, - 0x83, 0xfb, 0xd6, 0x22, 0xe7, 0xb5, 0xae, 0x6e, 0x80, 0xda, - 0x00, 0x55, 0x97, 0xc1, 0xd0, 0x65, 0x02, 0x20, 0x4c, 0xf8, - 0x73, 0xb1, 0x6a, 0x49, 0x29, 0x61, 0x1f, 0x46, 0x10, 0x0d, - 0xf3, 0xc7, 0xe7, 0x58, 0xd7, 0x88, 0x15, 0x5e, 0x94, 0x9b, - 0xbf, 0x7b, 0xa2, 0x42, 0x58, 0x45, 0x41, 0x0c, 0xcb, 0x01, - 0x02, 0x20, 0x12, 0x11, 0xba, 0x31, 0x57, 0x9d, 0x3d, 0x11, - 0x0e, 0x5b, 0x8c, 0x2f, 0x5f, 0xe2, 0x02, 0x4f, 0x05, 0x47, - 0x8c, 0x15, 0x8e, 0xb3, 0x56, 0x3f, 0xb8, 0xfb, 0xad, 0xd4, - 0xf4, 0xfc, 0x10, 0xc5, 0x02, 0x20, 0x18, 0xa1, 0x29, 0x99, - 0x5b, 0xd9, 0xc8, 0xd4, 0xfc, 0x49, 0x7a, 0x2a, 0x21, 0x2c, - 0x49, 0xe4, 0x4f, 0xeb, 0xef, 0x51, 0xf1, 0xab, 0x6d, 0xfb, - 0x4b, 0x14, 0xe9, 0x4b, 0x52, 0xb5, 0x82, 0x2c, -}; - -static unsigned char test1024[] = { - 0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, - 0x00, 0xdc, 0x98, 0x43, 0xe8, 0x3d, 0x43, 0x5b, 0xe4, 0x05, - 0xcd, 0xd0, 0xa9, 0x3e, 0xcb, 0x83, 0x75, 0xf6, 0xb5, 0xa5, - 0x9f, 0x6b, 0xe9, 0x34, 0x41, 0x29, 0x18, 0xfa, 0x6a, 0x55, - 0x4d, 0x70, 0xfc, 0xec, 0xae, 0x87, 0x38, 0x0a, 0x20, 0xa9, - 0xc0, 0x45, 0x77, 0x6e, 0x57, 0x60, 0x57, 0xf4, 0xed, 0x96, - 0x22, 0xcb, 0x8f, 0xe1, 0x33, 0x3a, 0x17, 0x1f, 0xed, 0x37, - 0xa5, 0x6f, 0xeb, 0xa6, 0xbc, 0x12, 0x80, 0x1d, 0x53, 0xbd, - 0x70, 0xeb, 0x21, 0x76, 0x3e, 0xc9, 0x2f, 0x1a, 0x45, 0x24, - 0x82, 0xff, 0xcd, 0x59, 0x32, 0x06, 0x2e, 0x12, 0x3b, 0x23, - 0x78, 0xed, 0x12, 0x3d, 0xe0, 0x8d, 0xf9, 0x67, 0x4f, 0x37, - 0x4e, 0x47, 0x02, 0x4c, 0x2d, 0xc0, 0x4f, 0x1f, 0xb3, 0x94, - 0xe1, 0x41, 0x2e, 0x2d, 0x90, 0x10, 0xfc, 0x82, 0x91, 0x8b, - 0x0f, 0x22, 0xd4, 0xf2, 0xfc, 0x2c, 0xab, 0x53, 0x55, 0x02, - 0x03, 0x01, 0x00, 0x01, 0x02, 0x81, 0x80, 0x2b, 0xcc, 0x3f, - 0x8f, 0x58, 0xba, 0x8b, 0x00, 0x16, 0xf6, 0xea, 0x3a, 0xf0, - 0x30, 0xd0, 0x05, 0x17, 0xda, 0xb0, 0xeb, 0x9a, 0x2d, 0x4f, - 0x26, 0xb0, 0xd6, 0x38, 0xc1, 0xeb, 0xf5, 0xd8, 0x3d, 0x1f, - 0x70, 0xf7, 0x7f, 0xf4, 0xe2, 0xcf, 0x51, 0x51, 0x79, 0x88, - 0xfa, 0xe8, 0x32, 0x0e, 0x7b, 0x2d, 0x97, 0xf2, 0xfa, 0xba, - 0x27, 0xc5, 0x9c, 0xd9, 0xc5, 0xeb, 0x8a, 0x79, 0x52, 0x3c, - 0x64, 0x34, 0x7d, 0xc2, 0xcf, 0x28, 0xc7, 0x4e, 0xd5, 0x43, - 0x0b, 0xd1, 0xa6, 0xca, 0x6d, 0x03, 0x2d, 0x72, 0x23, 0xbc, - 0x6d, 0x05, 0xfa, 0x16, 0x09, 0x2f, 0x2e, 0x5c, 0xb6, 0xee, - 0x74, 0xdd, 0xd2, 0x48, 0x8e, 0x36, 0x0c, 0x06, 0x3d, 0x4d, - 0xe5, 0x10, 0x82, 0xeb, 0x6a, 0xf3, 0x4b, 0x9f, 0xd6, 0xed, - 0x11, 0xb1, 0x6e, 0xec, 0xf4, 0xfe, 0x8e, 0x75, 0x94, 0x20, - 0x2f, 0xcb, 0xac, 0x46, 0xf1, 0x02, 0x41, 0x00, 0xf9, 0x8c, - 0xa3, 0x85, 0xb1, 0xdd, 0x29, 0xaf, 0x65, 0xc1, 0x33, 0xf3, - 0x95, 0xc5, 0x52, 0x68, 0x0b, 0xd4, 0xf1, 0xe5, 0x0e, 0x02, - 0x9f, 0x4f, 0xfa, 0x77, 0xdc, 0x46, 0x9e, 0xc7, 0xa6, 0xe4, - 0x16, 0x29, 0xda, 0xb0, 0x07, 0xcf, 0x5b, 0xa9, 0x12, 0x8a, - 0xdd, 0x63, 0x0a, 0xde, 0x2e, 0x8c, 0x66, 0x8b, 0x8c, 0xdc, - 0x19, 0xa3, 0x7e, 0xf4, 0x3b, 0xd0, 0x1a, 0x8c, 0xa4, 0xc2, - 0xe1, 0xd3, 0x02, 0x41, 0x00, 0xe2, 0x4c, 0x05, 0xf2, 0x04, - 0x86, 0x4e, 0x61, 0x43, 0xdb, 0xb0, 0xb9, 0x96, 0x86, 0x52, - 0x2c, 0xca, 0x8d, 0x7b, 0xab, 0x0b, 0x13, 0x0d, 0x7e, 0x38, - 0x5b, 0xe2, 0x2e, 0x7b, 0x0e, 0xe7, 0x19, 0x99, 0x38, 0xe7, - 0xf2, 0x21, 0xbd, 0x85, 0x85, 0xe3, 0xfd, 0x28, 0x77, 0x20, - 0x31, 0x71, 0x2c, 0xd0, 0xff, 0xfb, 0x2e, 0xaf, 0x85, 0xb4, - 0x86, 0xca, 0xf3, 0xbb, 0xca, 0xaa, 0x0f, 0x95, 0x37, 0x02, - 0x40, 0x0e, 0x41, 0x9a, 0x95, 0xe8, 0xb3, 0x59, 0xce, 0x4b, - 0x61, 0xde, 0x35, 0xec, 0x38, 0x79, 0x9c, 0xb8, 0x10, 0x52, - 0x41, 0x63, 0xab, 0x82, 0xae, 0x6f, 0x00, 0xa9, 0xf4, 0xde, - 0xdd, 0x49, 0x0b, 0x7e, 0xb8, 0xa5, 0x65, 0xa9, 0x0c, 0x8f, - 0x8f, 0xf9, 0x1f, 0x35, 0xc6, 0x92, 0xb8, 0x5e, 0xb0, 0x66, - 0xab, 0x52, 0x40, 0xc0, 0xb6, 0x36, 0x6a, 0x7d, 0x80, 0x46, - 0x04, 0x02, 0xe5, 0x9f, 0x41, 0x02, 0x41, 0x00, 0xc0, 0xad, - 0xcc, 0x4e, 0x21, 0xee, 0x1d, 0x24, 0x91, 0xfb, 0xa7, 0x80, - 0x8d, 0x9a, 0xb6, 0xb3, 0x2e, 0x8f, 0xc2, 0xe1, 0x82, 0xdf, - 0x69, 0x18, 0xb4, 0x71, 0xff, 0xa6, 0x65, 0xde, 0xed, 0x84, - 0x8d, 0x42, 0xb7, 0xb3, 0x21, 0x69, 0x56, 0x1c, 0x07, 0x60, - 0x51, 0x29, 0x04, 0xff, 0x34, 0x06, 0xdd, 0xb9, 0x67, 0x2c, - 0x7c, 0x04, 0x93, 0x0e, 0x46, 0x15, 0xbb, 0x2a, 0xb7, 0x1b, - 0xe7, 0x87, 0x02, 0x40, 0x78, 0xda, 0x5d, 0x07, 0x51, 0x0c, - 0x16, 0x7a, 0x9f, 0x29, 0x20, 0x84, 0x0d, 0x42, 0xfa, 0xd7, - 0x00, 0xd8, 0x77, 0x7e, 0xb0, 0xb0, 0x6b, 0xd6, 0x5b, 0x53, - 0xb8, 0x9b, 0x7a, 0xcd, 0xc7, 0x2b, 0xb8, 0x6a, 0x63, 0xa9, - 0xfb, 0x6f, 0xa4, 0x72, 0xbf, 0x4c, 0x5d, 0x00, 0x14, 0xba, - 0xfa, 0x59, 0x88, 0xed, 0xe4, 0xe0, 0x8c, 0xa2, 0xec, 0x14, - 0x7e, 0x2d, 0xe2, 0xf0, 0x46, 0x49, 0x95, 0x45, -}; - -static unsigned char test2048[] = { - 0x30, 0x82, 0x04, 0xa3, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, - 0x01, 0x00, 0xc0, 0xc0, 0xce, 0x3e, 0x3c, 0x53, 0x67, 0x3f, - 0x4f, 0xc5, 0x2f, 0xa4, 0xc2, 0x5a, 0x2f, 0x58, 0xfd, 0x27, - 0x52, 0x6a, 0xe8, 0xcf, 0x4a, 0x73, 0x47, 0x8d, 0x25, 0x0f, - 0x5f, 0x03, 0x26, 0x78, 0xef, 0xf0, 0x22, 0x12, 0xd3, 0xde, - 0x47, 0xb2, 0x1c, 0x0b, 0x38, 0x63, 0x1a, 0x6c, 0x85, 0x7a, - 0x80, 0xc6, 0x8f, 0xa0, 0x41, 0xaf, 0x62, 0xc4, 0x67, 0x32, - 0x88, 0xf8, 0xa6, 0x9c, 0xf5, 0x23, 0x1d, 0xe4, 0xac, 0x3f, - 0x29, 0xf9, 0xec, 0xe1, 0x8b, 0x26, 0x03, 0x2c, 0xb2, 0xab, - 0xf3, 0x7d, 0xb5, 0xca, 0x49, 0xc0, 0x8f, 0x1c, 0xdf, 0x33, - 0x3a, 0x60, 0xda, 0x3c, 0xb0, 0x16, 0xf8, 0xa9, 0x12, 0x8f, - 0x64, 0xac, 0x23, 0x0c, 0x69, 0x64, 0x97, 0x5d, 0x99, 0xd4, - 0x09, 0x83, 0x9b, 0x61, 0xd3, 0xac, 0xf0, 0xde, 0xdd, 0x5e, - 0x9f, 0x44, 0x94, 0xdb, 0x3a, 0x4d, 0x97, 0xe8, 0x52, 0x29, - 0xf7, 0xdb, 0x94, 0x07, 0x45, 0x90, 0x78, 0x1e, 0x31, 0x0b, - 0x80, 0xf7, 0x57, 0xad, 0x1c, 0x79, 0xc5, 0xcb, 0x32, 0xb0, - 0xce, 0xcd, 0x74, 0xb3, 0xe2, 0x94, 0xc5, 0x78, 0x2f, 0x34, - 0x1a, 0x45, 0xf7, 0x8c, 0x52, 0xa5, 0xbc, 0x8d, 0xec, 0xd1, - 0x2f, 0x31, 0x3b, 0xf0, 0x49, 0x59, 0x5e, 0x88, 0x9d, 0x15, - 0x92, 0x35, 0x32, 0xc1, 0xe7, 0x61, 0xec, 0x50, 0x48, 0x7c, - 0xba, 0x05, 0xf9, 0xf8, 0xf8, 0xa7, 0x8c, 0x83, 0xe8, 0x66, - 0x5b, 0xeb, 0xfe, 0xd8, 0x4f, 0xdd, 0x6d, 0x36, 0xc0, 0xb2, - 0x90, 0x0f, 0xb8, 0x52, 0xf9, 0x04, 0x9b, 0x40, 0x2c, 0x27, - 0xd6, 0x36, 0x8e, 0xc2, 0x1b, 0x44, 0xf3, 0x92, 0xd5, 0x15, - 0x9e, 0x9a, 0xbc, 0xf3, 0x7d, 0x03, 0xd7, 0x02, 0x14, 0x20, - 0xe9, 0x10, 0x92, 0xfd, 0xf9, 0xfc, 0x8f, 0xe5, 0x18, 0xe1, - 0x95, 0xcc, 0x9e, 0x60, 0xa6, 0xfa, 0x38, 0x4d, 0x02, 0x03, - 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x00, 0x00, 0xc3, 0xc3, - 0x0d, 0xb4, 0x27, 0x90, 0x8d, 0x4b, 0xbf, 0xb8, 0x84, 0xaa, - 0xd0, 0xb8, 0xc7, 0x5d, 0x99, 0xbe, 0x55, 0xf6, 0x3e, 0x7c, - 0x49, 0x20, 0xcb, 0x8a, 0x8e, 0x19, 0x0e, 0x66, 0x24, 0xac, - 0xaf, 0x03, 0x33, 0x97, 0xeb, 0x95, 0xd5, 0x3b, 0x0f, 0x40, - 0x56, 0x04, 0x50, 0xd1, 0xe6, 0xbe, 0x84, 0x0b, 0x25, 0xd3, - 0x9c, 0xe2, 0x83, 0x6c, 0xf5, 0x62, 0x5d, 0xba, 0x2b, 0x7d, - 0x3d, 0x7a, 0x6c, 0xe1, 0xd2, 0x0e, 0x54, 0x93, 0x80, 0x01, - 0x91, 0x51, 0x09, 0xe8, 0x5b, 0x8e, 0x47, 0xbd, 0x64, 0xe4, - 0x0e, 0x03, 0x83, 0x55, 0xcf, 0x5a, 0x37, 0xf0, 0x25, 0xb5, - 0x7d, 0x21, 0xd7, 0x69, 0xdf, 0x6f, 0xc2, 0xcf, 0x10, 0xc9, - 0x8a, 0x40, 0x9f, 0x7a, 0x70, 0xc0, 0xe8, 0xe8, 0xc0, 0xe6, - 0x9a, 0x15, 0x0a, 0x8d, 0x4e, 0x46, 0xcb, 0x7a, 0xdb, 0xb3, - 0xcb, 0x83, 0x02, 0xc4, 0xf0, 0xab, 0xeb, 0x02, 0x01, 0x0e, - 0x23, 0xfc, 0x1d, 0xc4, 0xbd, 0xd4, 0xaa, 0x5d, 0x31, 0x46, - 0x99, 0xce, 0x9e, 0xf8, 0x04, 0x75, 0x10, 0x67, 0xc4, 0x53, - 0x47, 0x44, 0xfa, 0xc2, 0x25, 0x73, 0x7e, 0xd0, 0x8e, 0x59, - 0xd1, 0xb2, 0x5a, 0xf4, 0xc7, 0x18, 0x92, 0x2f, 0x39, 0xab, - 0xcd, 0xa3, 0xb5, 0xc2, 0xb9, 0xc7, 0xb9, 0x1b, 0x9f, 0x48, - 0xfa, 0x13, 0xc6, 0x98, 0x4d, 0xca, 0x84, 0x9c, 0x06, 0xca, - 0xe7, 0x89, 0x01, 0x04, 0xc4, 0x6c, 0xfd, 0x29, 0x59, 0x35, - 0xe7, 0xf3, 0xdd, 0xce, 0x64, 0x59, 0xbf, 0x21, 0x13, 0xa9, - 0x9f, 0x0e, 0xc5, 0xff, 0xbd, 0x33, 0x00, 0xec, 0xac, 0x6b, - 0x11, 0xef, 0x51, 0x5e, 0xad, 0x07, 0x15, 0xde, 0xb8, 0x5f, - 0xc6, 0xb9, 0xa3, 0x22, 0x65, 0x46, 0x83, 0x14, 0xdf, 0xd0, - 0xf1, 0x44, 0x8a, 0xe1, 0x9c, 0x23, 0x33, 0xb4, 0x97, 0x33, - 0xe6, 0x6b, 0x81, 0x02, 0x81, 0x81, 0x00, 0xec, 0x12, 0xa7, - 0x59, 0x74, 0x6a, 0xde, 0x3e, 0xad, 0xd8, 0x36, 0x80, 0x50, - 0xa2, 0xd5, 0x21, 0x81, 0x07, 0xf1, 0xd0, 0x91, 0xf2, 0x6c, - 0x12, 0x2f, 0x9d, 0x1a, 0x26, 0xf8, 0x30, 0x65, 0xdf, 0xe8, - 0xc0, 0x9b, 0x6a, 0x30, 0x98, 0x82, 0x87, 0xec, 0xa2, 0x56, - 0x87, 0x62, 0x6f, 0xe7, 0x9f, 0xf6, 0x56, 0xe6, 0x71, 0x8f, - 0x49, 0x86, 0x93, 0x5a, 0x4d, 0x34, 0x58, 0xfe, 0xd9, 0x04, - 0x13, 0xaf, 0x79, 0xb7, 0xad, 0x11, 0xd1, 0x30, 0x9a, 0x14, - 0x06, 0xa0, 0xfa, 0xb7, 0x55, 0xdc, 0x6c, 0x5a, 0x4c, 0x2c, - 0x59, 0x56, 0xf6, 0xe8, 0x9d, 0xaf, 0x0a, 0x78, 0x99, 0x06, - 0x06, 0x9e, 0xe7, 0x9c, 0x51, 0x55, 0x43, 0xfc, 0x3b, 0x6c, - 0x0b, 0xbf, 0x2d, 0x41, 0xa7, 0xaf, 0xb7, 0xe0, 0xe8, 0x28, - 0x18, 0xb4, 0x13, 0xd1, 0xe6, 0x97, 0xd0, 0x9f, 0x6a, 0x80, - 0xca, 0xdd, 0x1a, 0x7e, 0x15, 0x02, 0x81, 0x81, 0x00, 0xd1, - 0x06, 0x0c, 0x1f, 0xe3, 0xd0, 0xab, 0xd6, 0xca, 0x7c, 0xbc, - 0x7d, 0x13, 0x35, 0xce, 0x27, 0xcd, 0xd8, 0x49, 0x51, 0x63, - 0x64, 0x0f, 0xca, 0x06, 0x12, 0xfc, 0x07, 0x3e, 0xaf, 0x61, - 0x6d, 0xe2, 0x53, 0x39, 0x27, 0xae, 0xc3, 0x11, 0x9e, 0x94, - 0x01, 0x4f, 0xe3, 0xf3, 0x67, 0xf9, 0x77, 0xf9, 0xe7, 0x95, - 0x3a, 0x6f, 0xe2, 0x20, 0x73, 0x3e, 0xa4, 0x7a, 0x28, 0xd4, - 0x61, 0x97, 0xf6, 0x17, 0xa0, 0x23, 0x10, 0x2b, 0xce, 0x84, - 0x57, 0x7e, 0x25, 0x1f, 0xf4, 0xa8, 0x54, 0xd2, 0x65, 0x94, - 0xcc, 0x95, 0x0a, 0xab, 0x30, 0xc1, 0x59, 0x1f, 0x61, 0x8e, - 0xb9, 0x6b, 0xd7, 0x4e, 0xb9, 0x83, 0x43, 0x79, 0x85, 0x11, - 0xbc, 0x0f, 0xae, 0x25, 0x20, 0x05, 0xbc, 0xd2, 0x48, 0xa1, - 0x68, 0x09, 0x84, 0xf6, 0x12, 0x9a, 0x66, 0xb9, 0x2b, 0xbb, - 0x76, 0x03, 0x17, 0x46, 0x4e, 0x97, 0x59, 0x02, 0x81, 0x80, - 0x09, 0x4c, 0xfa, 0xd6, 0xe5, 0x65, 0x48, 0x78, 0x43, 0xb5, - 0x1f, 0x00, 0x93, 0x2c, 0xb7, 0x24, 0xe8, 0xc6, 0x7d, 0x5a, - 0x70, 0x45, 0x92, 0xc8, 0x6c, 0xa3, 0xcd, 0xe1, 0xf7, 0x29, - 0x40, 0xfa, 0x3f, 0x5b, 0x47, 0x44, 0x39, 0xc1, 0xe8, 0x72, - 0x9e, 0x7a, 0x0e, 0xda, 0xaa, 0xa0, 0x2a, 0x09, 0xfd, 0x54, - 0x93, 0x23, 0xaa, 0x37, 0x85, 0x5b, 0xcc, 0xd4, 0xf9, 0xd8, - 0xff, 0xc1, 0x61, 0x0d, 0xbd, 0x7e, 0x18, 0x24, 0x73, 0x6d, - 0x40, 0x72, 0xf1, 0x93, 0x09, 0x48, 0x97, 0x6c, 0x84, 0x90, - 0xa8, 0x46, 0x14, 0x01, 0x39, 0x11, 0xe5, 0x3c, 0x41, 0x27, - 0x32, 0x75, 0x24, 0xed, 0xa1, 0xd9, 0x12, 0x29, 0x8a, 0x28, - 0x71, 0x89, 0x8d, 0xca, 0x30, 0xb0, 0x01, 0xc4, 0x2f, 0x82, - 0x19, 0x14, 0x4c, 0x70, 0x1c, 0xb8, 0x23, 0x2e, 0xe8, 0x90, - 0x49, 0x97, 0x92, 0x97, 0x6b, 0x7a, 0x9d, 0xb9, 0x02, 0x81, - 0x80, 0x0f, 0x0e, 0xa1, 0x76, 0xf6, 0xa1, 0x44, 0x8f, 0xaf, - 0x7c, 0x76, 0xd3, 0x87, 0xbb, 0xbb, 0x83, 0x10, 0x88, 0x01, - 0x18, 0x14, 0xd1, 0xd3, 0x75, 0x59, 0x24, 0xaa, 0xf5, 0x16, - 0xa5, 0xe9, 0x9d, 0xd1, 0xcc, 0xee, 0xf4, 0x15, 0xd9, 0xc5, - 0x7e, 0x27, 0xe9, 0x44, 0x49, 0x06, 0x72, 0xb9, 0xfc, 0xd3, - 0x8a, 0xc4, 0x2c, 0x36, 0x7d, 0x12, 0x9b, 0x5a, 0xaa, 0xdc, - 0x85, 0xee, 0x6e, 0xad, 0x54, 0xb3, 0xf4, 0xfc, 0x31, 0xa1, - 0x06, 0x3a, 0x70, 0x57, 0x0c, 0xf3, 0x95, 0x5b, 0x3e, 0xe8, - 0xfd, 0x1a, 0x4f, 0xf6, 0x78, 0x93, 0x46, 0x6a, 0xd7, 0x31, - 0xb4, 0x84, 0x64, 0x85, 0x09, 0x38, 0x89, 0x92, 0x94, 0x1c, - 0xbf, 0xe2, 0x3c, 0x2a, 0xe0, 0xff, 0x99, 0xa3, 0xf0, 0x2b, - 0x31, 0xc2, 0x36, 0xcd, 0x60, 0xbf, 0x9d, 0x2d, 0x74, 0x32, - 0xe8, 0x9c, 0x93, 0x6e, 0xbb, 0x91, 0x7b, 0xfd, 0xd9, 0x02, - 0x81, 0x81, 0x00, 0xa2, 0x71, 0x25, 0x38, 0xeb, 0x2a, 0xe9, - 0x37, 0xcd, 0xfe, 0x44, 0xce, 0x90, 0x3f, 0x52, 0x87, 0x84, - 0x52, 0x1b, 0xae, 0x8d, 0x22, 0x94, 0xce, 0x38, 0xe6, 0x04, - 0x88, 0x76, 0x85, 0x9a, 0xd3, 0x14, 0x09, 0xe5, 0x69, 0x9a, - 0xff, 0x58, 0x92, 0x02, 0x6a, 0x7d, 0x7c, 0x1e, 0x2c, 0xfd, - 0xa8, 0xca, 0x32, 0x14, 0x4f, 0x0d, 0x84, 0x0d, 0x37, 0x43, - 0xbf, 0xe4, 0x5d, 0x12, 0xc8, 0x24, 0x91, 0x27, 0x8d, 0x46, - 0xd9, 0x54, 0x53, 0xe7, 0x62, 0x71, 0xa8, 0x2b, 0x71, 0x41, - 0x8d, 0x75, 0xf8, 0x3a, 0xa0, 0x61, 0x29, 0x46, 0xa6, 0xe5, - 0x82, 0xfa, 0x3a, 0xd9, 0x08, 0xfa, 0xfc, 0x63, 0xfd, 0x6b, - 0x30, 0xbc, 0xf4, 0x4e, 0x9e, 0x8c, 0x25, 0x0c, 0xb6, 0x55, - 0xe7, 0x3c, 0xd4, 0x4e, 0x0b, 0xfd, 0x8b, 0xc3, 0x0e, 0x1d, - 0x9c, 0x44, 0x57, 0x8f, 0x1f, 0x86, 0xf7, 0xd5, 0x1b, 0xe4, - 0x95, -}; - -static unsigned char test4096[] = { - 0x30, 0x82, 0x09, 0x29, 0x02, 0x01, 0x00, 0x02, 0x82, 0x02, - 0x01, 0x00, 0xc0, 0x71, 0xac, 0x1a, 0x13, 0x88, 0x82, 0x43, - 0x3b, 0x51, 0x57, 0x71, 0x8d, 0xb6, 0x2b, 0x82, 0x65, 0x21, - 0x53, 0x5f, 0x28, 0x29, 0x4f, 0x8d, 0x7c, 0x8a, 0xb9, 0x44, - 0xb3, 0x28, 0x41, 0x4f, 0xd3, 0xfa, 0x6a, 0xf8, 0xb9, 0x28, - 0x50, 0x39, 0x67, 0x53, 0x2c, 0x3c, 0xd7, 0xcb, 0x96, 0x41, - 0x40, 0x32, 0xbb, 0xeb, 0x70, 0xae, 0x1f, 0xb0, 0x65, 0xf7, - 0x3a, 0xd9, 0x22, 0xfd, 0x10, 0xae, 0xbd, 0x02, 0xe2, 0xdd, - 0xf3, 0xc2, 0x79, 0x3c, 0xc6, 0xfc, 0x75, 0xbb, 0xaf, 0x4e, - 0x3a, 0x36, 0xc2, 0x4f, 0xea, 0x25, 0xdf, 0x13, 0x16, 0x4b, - 0x20, 0xfe, 0x4b, 0x69, 0x16, 0xc4, 0x7f, 0x1a, 0x43, 0xa6, - 0x17, 0x1b, 0xb9, 0x0a, 0xf3, 0x09, 0x86, 0x28, 0x89, 0xcf, - 0x2c, 0xd0, 0xd4, 0x81, 0xaf, 0xc6, 0x6d, 0xe6, 0x21, 0x8d, - 0xee, 0xef, 0xea, 0xdc, 0xb7, 0xc6, 0x3b, 0x63, 0x9f, 0x0e, - 0xad, 0x89, 0x78, 0x23, 0x18, 0xbf, 0x70, 0x7e, 0x84, 0xe0, - 0x37, 0xec, 0xdb, 0x8e, 0x9c, 0x3e, 0x6a, 0x19, 0xcc, 0x99, - 0x72, 0xe6, 0xb5, 0x7d, 0x6d, 0xfa, 0xe5, 0xd3, 0xe4, 0x90, - 0xb5, 0xb2, 0xb2, 0x12, 0x70, 0x4e, 0xca, 0xf8, 0x10, 0xf8, - 0xa3, 0x14, 0xc2, 0x48, 0x19, 0xeb, 0x60, 0x99, 0xbb, 0x2a, - 0x1f, 0xb1, 0x7a, 0xb1, 0x3d, 0x24, 0xfb, 0xa0, 0x29, 0xda, - 0xbd, 0x1b, 0xd7, 0xa4, 0xbf, 0xef, 0x60, 0x2d, 0x22, 0xca, - 0x65, 0x98, 0xf1, 0xc4, 0xe1, 0xc9, 0x02, 0x6b, 0x16, 0x28, - 0x2f, 0xa1, 0xaa, 0x79, 0x00, 0xda, 0xdc, 0x7c, 0x43, 0xf7, - 0x42, 0x3c, 0xa0, 0xef, 0x68, 0xf7, 0xdf, 0xb9, 0x69, 0xfb, - 0x8e, 0x01, 0xed, 0x01, 0x42, 0xb5, 0x4e, 0x57, 0xa6, 0x26, - 0xb8, 0xd0, 0x7b, 0x56, 0x6d, 0x03, 0xc6, 0x40, 0x8c, 0x8c, - 0x2a, 0x55, 0xd7, 0x9c, 0x35, 0x00, 0x94, 0x93, 0xec, 0x03, - 0xeb, 0x22, 0xef, 0x77, 0xbb, 0x79, 0x13, 0x3f, 0x15, 0xa1, - 0x8f, 0xca, 0xdf, 0xfd, 0xd3, 0xb8, 0xe1, 0xd4, 0xcc, 0x09, - 0x3f, 0x3c, 0x2c, 0xdb, 0xd1, 0x49, 0x7f, 0x38, 0x07, 0x83, - 0x6d, 0xeb, 0x08, 0x66, 0xe9, 0x06, 0x44, 0x12, 0xac, 0x95, - 0x22, 0x90, 0x23, 0x67, 0xd4, 0x08, 0xcc, 0xf4, 0xb7, 0xdc, - 0xcc, 0x87, 0xd4, 0xac, 0x69, 0x35, 0x4c, 0xb5, 0x39, 0x36, - 0xcd, 0xa4, 0xd2, 0x95, 0xca, 0x0d, 0xc5, 0xda, 0xc2, 0xc5, - 0x22, 0x32, 0x28, 0x08, 0xe3, 0xd2, 0x8b, 0x38, 0x30, 0xdc, - 0x8c, 0x75, 0x4f, 0x6a, 0xec, 0x7a, 0xac, 0x16, 0x3e, 0xa8, - 0xd4, 0x6a, 0x45, 0xe1, 0xa8, 0x4f, 0x2e, 0x80, 0x34, 0xaa, - 0x54, 0x1b, 0x02, 0x95, 0x7d, 0x8a, 0x6d, 0xcc, 0x79, 0xca, - 0xf2, 0xa4, 0x2e, 0x8d, 0xfb, 0xfe, 0x15, 0x51, 0x10, 0x0e, - 0x4d, 0x88, 0xb1, 0xc7, 0xf4, 0x79, 0xdb, 0xf0, 0xb4, 0x56, - 0x44, 0x37, 0xca, 0x5a, 0xc1, 0x8c, 0x48, 0xac, 0xae, 0x48, - 0x80, 0x83, 0x01, 0x3f, 0xde, 0xd9, 0xd3, 0x2c, 0x51, 0x46, - 0xb1, 0x41, 0xb6, 0xc6, 0x91, 0x72, 0xf9, 0x83, 0x55, 0x1b, - 0x8c, 0xba, 0xf3, 0x73, 0xe5, 0x2c, 0x74, 0x50, 0x3a, 0xbe, - 0xc5, 0x2f, 0xa7, 0xb2, 0x6d, 0x8c, 0x9e, 0x13, 0x77, 0xa3, - 0x13, 0xcd, 0x6d, 0x8c, 0x45, 0xe1, 0xfc, 0x0b, 0xb7, 0x69, - 0xe9, 0x27, 0xbc, 0x65, 0xc3, 0xfa, 0x9b, 0xd0, 0xef, 0xfe, - 0xe8, 0x1f, 0xb3, 0x5e, 0x34, 0xf4, 0x8c, 0xea, 0xfc, 0xd3, - 0x81, 0xbf, 0x3d, 0x30, 0xb2, 0xb4, 0x01, 0xe8, 0x43, 0x0f, - 0xba, 0x02, 0x23, 0x42, 0x76, 0x82, 0x31, 0x73, 0x91, 0xed, - 0x07, 0x46, 0x61, 0x0d, 0x39, 0x83, 0x40, 0xce, 0x7a, 0xd4, - 0xdb, 0x80, 0x2c, 0x1f, 0x0d, 0xd1, 0x34, 0xd4, 0x92, 0xe3, - 0xd4, 0xf1, 0xc2, 0x01, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, - 0x82, 0x02, 0x01, 0x00, 0x97, 0x6c, 0xda, 0x6e, 0xea, 0x4f, - 0xcf, 0xaf, 0xf7, 0x4c, 0xd9, 0xf1, 0x90, 0x00, 0x77, 0xdb, - 0xf2, 0x97, 0x76, 0x72, 0xb9, 0xb7, 0x47, 0xd1, 0x9c, 0xdd, - 0xcb, 0x4a, 0x33, 0x6e, 0xc9, 0x75, 0x76, 0xe6, 0xe4, 0xa5, - 0x31, 0x8c, 0x77, 0x13, 0xb4, 0x29, 0xcd, 0xf5, 0x52, 0x17, - 0xef, 0xf3, 0x08, 0x00, 0xe3, 0xbd, 0x2e, 0xbc, 0xd4, 0x52, - 0x88, 0xe9, 0x30, 0x75, 0x0b, 0x02, 0xf5, 0xcd, 0x89, 0x0c, - 0x6c, 0x57, 0x19, 0x27, 0x3d, 0x1e, 0x85, 0xb4, 0xc1, 0x2f, - 0x1d, 0x92, 0x00, 0x5c, 0x76, 0x29, 0x4b, 0xa4, 0xe1, 0x12, - 0xb3, 0xc8, 0x09, 0xfe, 0x0e, 0x78, 0x72, 0x61, 0xcb, 0x61, - 0x6f, 0x39, 0x91, 0x95, 0x4e, 0xd5, 0x3e, 0xc7, 0x8f, 0xb8, - 0xf6, 0x36, 0xfe, 0x9c, 0x93, 0x9a, 0x38, 0x25, 0x7a, 0xf4, - 0x4a, 0x12, 0xd4, 0xa0, 0x13, 0xbd, 0xf9, 0x1d, 0x12, 0x3e, - 0x21, 0x39, 0xfb, 0x72, 0xe0, 0x05, 0x3d, 0xc3, 0xe5, 0x50, - 0xa8, 0x5d, 0x85, 0xa3, 0xea, 0x5f, 0x1c, 0xb2, 0x3f, 0xea, - 0x6d, 0x03, 0x91, 0x55, 0xd8, 0x19, 0x0a, 0x21, 0x12, 0x16, - 0xd9, 0x12, 0xc4, 0xe6, 0x07, 0x18, 0x5b, 0x26, 0xa4, 0xae, - 0xed, 0x2b, 0xb7, 0xa6, 0xed, 0xf8, 0xad, 0xec, 0x77, 0xe6, - 0x7f, 0x4f, 0x76, 0x00, 0xc0, 0xfa, 0x15, 0x92, 0xb4, 0x2c, - 0x22, 0xc2, 0xeb, 0x6a, 0xad, 0x14, 0x05, 0xb2, 0xe5, 0x8a, - 0x9e, 0x85, 0x83, 0xcc, 0x04, 0xf1, 0x56, 0x78, 0x44, 0x5e, - 0xde, 0xe0, 0x60, 0x1a, 0x65, 0x79, 0x31, 0x23, 0x05, 0xbb, - 0x01, 0xff, 0xdd, 0x2e, 0xb7, 0xb3, 0xaa, 0x74, 0xe0, 0xa5, - 0x94, 0xaf, 0x4b, 0xde, 0x58, 0x0f, 0x55, 0xde, 0x33, 0xf6, - 0xe3, 0xd6, 0x34, 0x36, 0x57, 0xd6, 0x79, 0x91, 0x2e, 0xbe, - 0x3b, 0xd9, 0x4e, 0xb6, 0x9d, 0x21, 0x5c, 0xd3, 0x48, 0x14, - 0x7f, 0x4a, 0xc4, 0x60, 0xa9, 0x29, 0xf8, 0x53, 0x7f, 0x88, - 0x11, 0x2d, 0xb5, 0xc5, 0x2d, 0x6f, 0xee, 0x85, 0x0b, 0xf7, - 0x8d, 0x9a, 0xbe, 0xb0, 0x42, 0xf2, 0x2e, 0x71, 0xaf, 0x19, - 0x31, 0x6d, 0xec, 0xcd, 0x6f, 0x2b, 0x23, 0xdf, 0xb4, 0x40, - 0xaf, 0x2c, 0x0a, 0xc3, 0x1b, 0x7d, 0x7d, 0x03, 0x1d, 0x4b, - 0xf3, 0xb5, 0xe0, 0x85, 0xd8, 0xdf, 0x91, 0x6b, 0x0a, 0x69, - 0xf7, 0xf2, 0x69, 0x66, 0x5b, 0xf1, 0xcf, 0x46, 0x7d, 0xe9, - 0x70, 0xfa, 0x6d, 0x7e, 0x75, 0x4e, 0xa9, 0x77, 0xe6, 0x8c, - 0x02, 0xf7, 0x14, 0x4d, 0xa5, 0x41, 0x8f, 0x3f, 0xc1, 0x62, - 0x1e, 0x71, 0x5e, 0x38, 0xb4, 0xd6, 0xe6, 0xe1, 0x4b, 0xc2, - 0x2c, 0x30, 0x83, 0x81, 0x6f, 0x49, 0x2e, 0x96, 0xe6, 0xc9, - 0x9a, 0xf7, 0x5d, 0x09, 0xa0, 0x55, 0x02, 0xa5, 0x3a, 0x25, - 0x23, 0xd0, 0x92, 0xc3, 0xa3, 0xe3, 0x0e, 0x12, 0x2f, 0x4d, - 0xef, 0xf3, 0x55, 0x5a, 0xbe, 0xe6, 0x19, 0x86, 0x31, 0xab, - 0x75, 0x9a, 0xd3, 0xf0, 0x2c, 0xc5, 0x41, 0x92, 0xd9, 0x1f, - 0x5f, 0x11, 0x8c, 0x75, 0x1c, 0x63, 0xd0, 0x02, 0x80, 0x2c, - 0x68, 0xcb, 0x93, 0xfb, 0x51, 0x73, 0x49, 0xb4, 0x60, 0xda, - 0xe2, 0x26, 0xaf, 0xa9, 0x46, 0x12, 0xb8, 0xec, 0x50, 0xdd, - 0x12, 0x06, 0x5f, 0xce, 0x59, 0xe6, 0xf6, 0x1c, 0xe0, 0x54, - 0x10, 0xad, 0xf6, 0xcd, 0x98, 0xcc, 0x0f, 0xfb, 0xcb, 0x41, - 0x14, 0x9d, 0xed, 0xe4, 0xb4, 0x74, 0x5f, 0x09, 0x60, 0xc7, - 0x12, 0xf6, 0x7b, 0x3c, 0x8f, 0xa7, 0x20, 0xbc, 0xe4, 0xb1, - 0xef, 0xeb, 0xa4, 0x93, 0xc5, 0x06, 0xca, 0x9a, 0x27, 0x9d, - 0x87, 0xf3, 0xde, 0xca, 0xe5, 0xe7, 0xf6, 0x1c, 0x01, 0x65, - 0x5b, 0xfb, 0x19, 0x79, 0x6e, 0x08, 0x26, 0xc5, 0xc8, 0x28, - 0x0e, 0xb6, 0x3b, 0x07, 0x08, 0xc1, 0x02, 0x82, 0x01, 0x01, - 0x00, 0xe8, 0x1c, 0x73, 0xa6, 0xb8, 0xe0, 0x0e, 0x6d, 0x8d, - 0x1b, 0xb9, 0x53, 0xed, 0x58, 0x94, 0xe6, 0x1d, 0x60, 0x14, - 0x5c, 0x76, 0x43, 0xc4, 0x58, 0x19, 0xc4, 0x24, 0xe8, 0xbc, - 0x1b, 0x3b, 0x0b, 0x13, 0x24, 0x45, 0x54, 0x0e, 0xcc, 0x37, - 0xf0, 0xe0, 0x63, 0x7d, 0xc3, 0xf7, 0xfb, 0x81, 0x74, 0x81, - 0xc4, 0x0f, 0x1a, 0x21, 0x48, 0xaf, 0xce, 0xc1, 0xc4, 0x94, - 0x18, 0x06, 0x44, 0x8d, 0xd3, 0xd2, 0x22, 0x2d, 0x2d, 0x3e, - 0x5a, 0x31, 0xdc, 0x95, 0x8e, 0xf4, 0x41, 0xfc, 0x58, 0xc9, - 0x40, 0x92, 0x17, 0x5f, 0xe3, 0xda, 0xac, 0x9e, 0x3f, 0x1c, - 0x2a, 0x6b, 0x58, 0x5f, 0x48, 0x78, 0x20, 0xb1, 0xaf, 0x24, - 0x9b, 0x3c, 0x20, 0x8b, 0x93, 0x25, 0x9e, 0xe6, 0x6b, 0xbc, - 0x13, 0x42, 0x14, 0x6c, 0x36, 0x31, 0xff, 0x7a, 0xd1, 0xc1, - 0x1a, 0x26, 0x14, 0x7f, 0xa9, 0x76, 0xa7, 0x0c, 0xf8, 0xcc, - 0xed, 0x07, 0x6a, 0xd2, 0xdf, 0x62, 0xee, 0x0a, 0x7c, 0x84, - 0xcb, 0x49, 0x90, 0xb2, 0x03, 0x0d, 0xa2, 0x82, 0x06, 0x77, - 0xf1, 0xcd, 0x67, 0xf2, 0x47, 0x21, 0x02, 0x3f, 0x43, 0x21, - 0xf0, 0x46, 0x30, 0x62, 0x51, 0x72, 0xb1, 0xe7, 0x48, 0xc6, - 0x67, 0x12, 0xcd, 0x9e, 0xd6, 0x15, 0xe5, 0x21, 0xed, 0xfa, - 0x8f, 0x30, 0xa6, 0x41, 0xfe, 0xb6, 0xfa, 0x8f, 0x34, 0x14, - 0x19, 0xe8, 0x11, 0xf7, 0xa5, 0x77, 0x3e, 0xb7, 0xf9, 0x39, - 0x07, 0x8c, 0x67, 0x2a, 0xab, 0x7b, 0x08, 0xf8, 0xb0, 0x06, - 0xa8, 0xea, 0x2f, 0x8f, 0xfa, 0xcc, 0xcc, 0x40, 0xce, 0xf3, - 0x70, 0x4f, 0x3f, 0x7f, 0xe2, 0x0c, 0xea, 0x76, 0x4a, 0x35, - 0x4e, 0x47, 0xad, 0x2b, 0xa7, 0x97, 0x5d, 0x74, 0x43, 0x97, - 0x90, 0xd2, 0xfb, 0xd9, 0xf9, 0x96, 0x01, 0x33, 0x05, 0xed, - 0x7b, 0x03, 0x05, 0xad, 0xf8, 0x49, 0x03, 0x02, 0x82, 0x01, - 0x01, 0x00, 0xd4, 0x40, 0x17, 0x66, 0x10, 0x92, 0x95, 0xc8, - 0xec, 0x62, 0xa9, 0x7a, 0xcb, 0x93, 0x8e, 0xe6, 0x53, 0xd4, - 0x80, 0x48, 0x27, 0x4b, 0x41, 0xce, 0x61, 0xdf, 0xbf, 0x94, - 0xa4, 0x3d, 0x71, 0x03, 0x0b, 0xed, 0x25, 0x71, 0x98, 0xa4, - 0xd6, 0xd5, 0x4a, 0x57, 0xf5, 0x6c, 0x1b, 0xda, 0x21, 0x7d, - 0x35, 0x45, 0xb3, 0xf3, 0x6a, 0xd9, 0xd3, 0x43, 0xe8, 0x5c, - 0x54, 0x1c, 0x83, 0x1b, 0xb4, 0x5f, 0xf2, 0x97, 0x24, 0x2e, - 0xdc, 0x40, 0xde, 0x92, 0x23, 0x59, 0x8e, 0xbc, 0xd2, 0xa1, - 0xf2, 0xe0, 0x4c, 0xdd, 0x0b, 0xd1, 0xe7, 0xae, 0x65, 0xbc, - 0xb5, 0xf5, 0x5b, 0x98, 0xe9, 0xd7, 0xc2, 0xb7, 0x0e, 0x55, - 0x71, 0x0e, 0x3c, 0x0a, 0x24, 0x6b, 0xa6, 0xe6, 0x14, 0x61, - 0x11, 0xfd, 0x33, 0x42, 0x99, 0x2b, 0x84, 0x77, 0x74, 0x92, - 0x91, 0xf5, 0x79, 0x79, 0xcf, 0xad, 0x8e, 0x04, 0xef, 0x80, - 0x1e, 0x57, 0xf4, 0x14, 0xf5, 0x35, 0x09, 0x74, 0xb2, 0x13, - 0x71, 0x58, 0x6b, 0xea, 0x32, 0x5d, 0xf3, 0xd3, 0x76, 0x48, - 0x39, 0x10, 0x23, 0x84, 0x9d, 0xbe, 0x92, 0x77, 0x4a, 0xed, - 0x70, 0x3e, 0x1a, 0xa2, 0x6c, 0xb3, 0x81, 0x00, 0xc3, 0xc9, - 0xe4, 0x52, 0xc8, 0x24, 0x88, 0x0c, 0x41, 0xad, 0x87, 0x5a, - 0xea, 0xa3, 0x7a, 0x85, 0x1c, 0x5e, 0x31, 0x7f, 0xc3, 0x35, - 0xc6, 0xfa, 0x10, 0xc8, 0x75, 0x10, 0xc4, 0x96, 0x99, 0xe7, - 0xfe, 0x01, 0xb4, 0x74, 0xdb, 0xb4, 0x11, 0xc3, 0xc8, 0x8c, - 0xf6, 0xf7, 0x3b, 0x66, 0x50, 0xfc, 0xdb, 0xeb, 0xca, 0x47, - 0x85, 0x89, 0xe1, 0x65, 0xd9, 0x62, 0x34, 0x3c, 0x70, 0xd8, - 0x2e, 0xb4, 0x2f, 0x65, 0x3c, 0x4a, 0xa6, 0x2a, 0xe7, 0xc7, - 0xd8, 0x41, 0x8f, 0x8a, 0x43, 0xbf, 0x42, 0xf2, 0x4d, 0xbc, - 0xfc, 0x9e, 0x27, 0x95, 0xfb, 0x75, 0xff, 0xab, 0x02, 0x82, - 0x01, 0x00, 0x41, 0x2f, 0x44, 0x57, 0x6d, 0x12, 0x17, 0x5b, - 0x32, 0xc6, 0xb7, 0x6c, 0x57, 0x7a, 0x8a, 0x0e, 0x79, 0xef, - 0x72, 0xa8, 0x68, 0xda, 0x2d, 0x38, 0xe4, 0xbb, 0x8d, 0xf6, - 0x02, 0x65, 0xcf, 0x56, 0x13, 0xe1, 0x1a, 0xcb, 0x39, 0x80, - 0xa6, 0xb1, 0x32, 0x03, 0x1e, 0xdd, 0xbb, 0x35, 0xd9, 0xac, - 0x43, 0x89, 0x31, 0x08, 0x90, 0x92, 0x5e, 0x35, 0x3d, 0x7b, - 0x9c, 0x6f, 0x86, 0xcb, 0x17, 0xdd, 0x85, 0xe4, 0xed, 0x35, - 0x08, 0x8e, 0xc1, 0xf4, 0x05, 0xd8, 0x68, 0xc6, 0x63, 0x3c, - 0xf7, 0xff, 0xf7, 0x47, 0x33, 0x39, 0xc5, 0x3e, 0xb7, 0x0e, - 0x58, 0x35, 0x9d, 0x81, 0xea, 0xf8, 0x6a, 0x2c, 0x1c, 0x5a, - 0x68, 0x78, 0x64, 0x11, 0x6b, 0xc1, 0x3e, 0x4e, 0x7a, 0xbd, - 0x84, 0xcb, 0x0f, 0xc2, 0xb6, 0x85, 0x1d, 0xd3, 0x76, 0xc5, - 0x93, 0x6a, 0x69, 0x89, 0x56, 0x34, 0xdc, 0x4a, 0x9b, 0xbc, - 0xff, 0xa8, 0x0d, 0x6e, 0x35, 0x9c, 0x60, 0xa7, 0x23, 0x30, - 0xc7, 0x06, 0x64, 0x39, 0x8b, 0x94, 0x89, 0xee, 0xba, 0x7f, - 0x60, 0x8d, 0xfa, 0xb6, 0x97, 0x76, 0xdc, 0x51, 0x4a, 0x3c, - 0xeb, 0x3a, 0x14, 0x2c, 0x20, 0x60, 0x69, 0x4a, 0x86, 0xfe, - 0x8c, 0x21, 0x84, 0x49, 0x54, 0xb3, 0x20, 0xe1, 0x01, 0x7f, - 0x58, 0xdf, 0x7f, 0xb5, 0x21, 0x51, 0x8c, 0x47, 0x9f, 0x91, - 0xeb, 0x97, 0x3e, 0xf2, 0x54, 0xcf, 0x16, 0x46, 0xf9, 0xd9, - 0xb6, 0xe7, 0x64, 0xc9, 0xd0, 0x54, 0xea, 0x2f, 0xa1, 0xcf, - 0xa5, 0x7f, 0x28, 0x8d, 0x84, 0xec, 0xd5, 0x39, 0x03, 0x76, - 0x5b, 0x2d, 0x8e, 0x43, 0xf2, 0x01, 0x24, 0xc9, 0x6f, 0xc0, - 0xf5, 0x69, 0x6f, 0x7d, 0xb5, 0x85, 0xd2, 0x5f, 0x7f, 0x78, - 0x40, 0x07, 0x7f, 0x09, 0x15, 0xb5, 0x1f, 0x28, 0x65, 0x10, - 0xe4, 0x19, 0xa8, 0xc6, 0x9e, 0x8d, 0xdc, 0xcb, 0x02, 0x82, - 0x01, 0x00, 0x13, 0x01, 0xee, 0x56, 0x80, 0x93, 0x70, 0x00, - 0x7f, 0x52, 0xd2, 0x94, 0xa1, 0x98, 0x84, 0x4a, 0x92, 0x25, - 0x4c, 0x9b, 0xa9, 0x91, 0x2e, 0xc2, 0x79, 0xb7, 0x5c, 0xe3, - 0xc5, 0xd5, 0x8e, 0xc2, 0x54, 0x16, 0x17, 0xad, 0x55, 0x9b, - 0x25, 0x76, 0x12, 0x63, 0x50, 0x22, 0x2f, 0x58, 0x58, 0x79, - 0x6b, 0x04, 0xe3, 0xf9, 0x9f, 0x8f, 0x04, 0x41, 0x67, 0x94, - 0xa5, 0x1f, 0xac, 0x8a, 0x15, 0x9c, 0x26, 0x10, 0x6c, 0xf8, - 0x19, 0x57, 0x61, 0xd7, 0x3a, 0x7d, 0x31, 0xb0, 0x2d, 0x38, - 0xbd, 0x94, 0x62, 0xad, 0xc4, 0xfa, 0x36, 0x42, 0x42, 0xf0, - 0x24, 0x67, 0x65, 0x9d, 0x8b, 0x0b, 0x7c, 0x6f, 0x82, 0x44, - 0x1a, 0x8c, 0xc8, 0xc9, 0xab, 0xbb, 0x4c, 0x45, 0xfc, 0x7b, - 0x38, 0xee, 0x30, 0xe1, 0xfc, 0xef, 0x8d, 0xbc, 0x58, 0xdf, - 0x2b, 0x5d, 0x0d, 0x54, 0xe0, 0x49, 0x4d, 0x97, 0x99, 0x8f, - 0x22, 0xa8, 0x83, 0xbe, 0x40, 0xbb, 0x50, 0x2e, 0x78, 0x28, - 0x0f, 0x95, 0x78, 0x8c, 0x8f, 0x98, 0x24, 0x56, 0xc2, 0x97, - 0xf3, 0x2c, 0x43, 0xd2, 0x03, 0x82, 0x66, 0x81, 0x72, 0x5f, - 0x53, 0x16, 0xec, 0xb1, 0xb1, 0x04, 0x5e, 0x40, 0x20, 0x48, - 0x7b, 0x3f, 0x02, 0x97, 0x6a, 0xeb, 0x96, 0x12, 0x21, 0x35, - 0xfe, 0x1f, 0x47, 0xc0, 0x95, 0xea, 0xc5, 0x8a, 0x08, 0x84, - 0x4f, 0x5e, 0x63, 0x94, 0x60, 0x0f, 0x71, 0x5b, 0x7f, 0x4a, - 0xec, 0x4f, 0x60, 0xc6, 0xba, 0x4a, 0x24, 0xf1, 0x20, 0x8b, - 0xa7, 0x2e, 0x3a, 0xce, 0x8d, 0xe0, 0x27, 0x1d, 0xb5, 0x8e, - 0xb4, 0x21, 0xc5, 0xe2, 0xa6, 0x16, 0x0a, 0x51, 0x83, 0x55, - 0x88, 0xd1, 0x30, 0x11, 0x63, 0xd5, 0xd7, 0x8d, 0xae, 0x16, - 0x12, 0x82, 0xc4, 0x85, 0x00, 0x4e, 0x27, 0x83, 0xa5, 0x7c, - 0x90, 0x2e, 0xe5, 0xa2, 0xa3, 0xd3, 0x4c, 0x63, 0x02, 0x82, - 0x01, 0x01, 0x00, 0x86, 0x08, 0x98, 0x98, 0xa5, 0x00, 0x05, - 0x39, 0x77, 0xd9, 0x66, 0xb3, 0xcf, 0xca, 0xa0, 0x71, 0xb3, - 0x50, 0xce, 0x3d, 0xb1, 0x93, 0x95, 0x35, 0xc4, 0xd4, 0x2e, - 0x90, 0xdf, 0x0f, 0xfc, 0x60, 0xc1, 0x94, 0x68, 0x61, 0x43, - 0xca, 0x9a, 0x23, 0x4a, 0x1e, 0x45, 0x72, 0x99, 0xb5, 0x1e, - 0x61, 0x8d, 0x77, 0x0f, 0xa0, 0xbb, 0xd7, 0x77, 0xb4, 0x2a, - 0x15, 0x11, 0x88, 0x2d, 0xb3, 0x56, 0x61, 0x5e, 0x6a, 0xed, - 0xa4, 0x46, 0x4a, 0x3f, 0x50, 0x11, 0xd6, 0xba, 0xb6, 0xd7, - 0x95, 0x65, 0x53, 0xc3, 0xa1, 0x8f, 0xe0, 0xa3, 0xf5, 0x1c, - 0xfd, 0xaf, 0x6e, 0x43, 0xd7, 0x17, 0xa7, 0xd3, 0x81, 0x1b, - 0xa4, 0xdf, 0xe0, 0x97, 0x8a, 0x46, 0x03, 0xd3, 0x46, 0x0e, - 0x83, 0x48, 0x4e, 0xd2, 0x02, 0xcb, 0xc0, 0xad, 0x79, 0x95, - 0x8c, 0x96, 0xba, 0x40, 0x34, 0x11, 0x71, 0x5e, 0xe9, 0x11, - 0xf9, 0xc5, 0x4a, 0x5e, 0x91, 0x9d, 0xf5, 0x92, 0x4f, 0xeb, - 0xc6, 0x70, 0x02, 0x2d, 0x3d, 0x04, 0xaa, 0xe9, 0x3a, 0x8e, - 0xd5, 0xa8, 0xad, 0xf7, 0xce, 0x0d, 0x16, 0xb2, 0xec, 0x0a, - 0x9c, 0xf5, 0x94, 0x39, 0xb9, 0x8a, 0xfc, 0x1e, 0xf9, 0xcc, - 0xf2, 0x5f, 0x21, 0x31, 0x74, 0x72, 0x6b, 0x64, 0xae, 0x35, - 0x61, 0x8d, 0x0d, 0xcb, 0xe7, 0xda, 0x39, 0xca, 0xf3, 0x21, - 0x66, 0x0b, 0x95, 0xd7, 0x0a, 0x7c, 0xca, 0xa1, 0xa9, 0x5a, - 0xe8, 0xac, 0xe0, 0x71, 0x54, 0xaf, 0x28, 0xcf, 0xd5, 0x70, - 0x89, 0xe0, 0xf3, 0x9e, 0x43, 0x6c, 0x8d, 0x7b, 0x99, 0x01, - 0x68, 0x4d, 0xa1, 0x45, 0x46, 0x0c, 0x43, 0xbc, 0xcc, 0x2c, - 0xdd, 0xc5, 0x46, 0xc8, 0x4e, 0x0e, 0xbe, 0xed, 0xb9, 0x26, - 0xab, 0x2e, 0xdb, 0xeb, 0x8f, 0xff, 0xdb, 0xb0, 0xc6, 0x55, - 0xaf, 0xf8, 0x2a, 0x91, 0x9d, 0x50, 0x44, 0x21, 0x17, -}; diff --git a/usr.bin/openssl/timeouts.h b/usr.bin/openssl/timeouts.h deleted file mode 100644 index dd2f85028..000000000 --- a/usr.bin/openssl/timeouts.h +++ /dev/null @@ -1,67 +0,0 @@ -/* $OpenBSD: timeouts.h,v 1.1 2014/08/26 17:47:25 jsing Exp $ */ -/* - * DTLS implementation written by Nagendra Modadugu - * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. - */ -/* ==================================================================== - * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@OpenSSL.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ - -#ifndef INCLUDED_TIMEOUTS_H -#define INCLUDED_TIMEOUTS_H - -/* numbers in us */ -#define DGRAM_RCV_TIMEOUT 250000 -#define DGRAM_SND_TIMEOUT 250000 - -#endif /* ! INCLUDED_TIMEOUTS_H */ diff --git a/usr.bin/openssl/x509.c b/usr.bin/openssl/x509.c index 1ebdfb005..fc8a0daeb 100644 --- a/usr.bin/openssl/x509.c +++ b/usr.bin/openssl/x509.c @@ -1,4 +1,4 @@ -/* $OpenBSD: x509.c,v 1.39 2024/05/27 16:12:55 tb Exp $ */ +/* $OpenBSD: x509.c,v 1.40 2024/12/04 08:14:34 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -1595,7 +1595,119 @@ callb(int ok, X509_STORE_CTX *ctx) } } -/* self sign */ +static int +key_identifier_hash(EVP_PKEY *pkey, unsigned char *md, unsigned int *md_len) +{ + X509_PUBKEY *x509_pubkey = NULL; + const unsigned char *der; + int der_len; + int ret = 0; + + if (*md_len < SHA_DIGEST_LENGTH) + goto err; + + if (!X509_PUBKEY_set(&x509_pubkey, pkey)) + goto err; + if (!X509_PUBKEY_get0_param(NULL, &der, &der_len, NULL, x509_pubkey)) + goto err; + if (!EVP_Digest(der, der_len, md, md_len, EVP_sha1(), NULL)) + goto err; + + ret = 1; + + err: + X509_PUBKEY_free(x509_pubkey); + + return ret; +} + +static ASN1_OCTET_STRING * +compute_key_identifier(EVP_PKEY *pkey) +{ + ASN1_OCTET_STRING *ki = NULL; + unsigned char md[EVP_MAX_MD_SIZE]; + unsigned int md_len = EVP_MAX_MD_SIZE; + + if (!key_identifier_hash(pkey, md, &md_len)) + goto err; + + if ((ki = ASN1_OCTET_STRING_new()) == NULL) + goto err; + if (!ASN1_STRING_set(ki, md, md_len)) + goto err; + + return ki; + + err: + ASN1_OCTET_STRING_free(ki); + + return NULL; +} + +static ASN1_OCTET_STRING * +compute_subject_key_identifier(EVP_PKEY *subject_key) +{ + return compute_key_identifier(subject_key); +} + +static AUTHORITY_KEYID * +compute_authority_key_identifier(EVP_PKEY *issuer_key) +{ + AUTHORITY_KEYID *aki = NULL; + + if ((aki = AUTHORITY_KEYID_new()) == NULL) + goto err; + if ((aki->keyid = compute_key_identifier(issuer_key)) == NULL) + goto err; + + return aki; + + err: + AUTHORITY_KEYID_free(aki); + + return NULL; +} + +static int +set_key_identifiers(X509 *cert, EVP_PKEY *issuer_key) +{ + EVP_PKEY *subject_key; + ASN1_OCTET_STRING *ski = NULL; + AUTHORITY_KEYID *aki = NULL; + int ret = 0; + + if ((subject_key = X509_get0_pubkey(cert)) == NULL) + goto err; + + if ((ski = compute_subject_key_identifier(subject_key)) == NULL) + goto err; + if (!X509_add1_ext_i2d(cert, NID_subject_key_identifier, ski, 0, + X509V3_ADD_REPLACE)) + goto err; + + /* + * Historical OpenSSL behavior: don't set AKI if we're self-signing. + * RFC 5280 says we MAY omit it, so this is ok. + */ + if (EVP_PKEY_cmp(subject_key, issuer_key) == 1) + goto done; + + if ((aki = compute_authority_key_identifier(issuer_key)) == NULL) + goto err; + if (!X509_add1_ext_i2d(cert, NID_authority_key_identifier, aki, 0, + X509V3_ADD_REPLACE)) + goto err; + + done: + ret = 1; + + err: + ASN1_OCTET_STRING_free(ski); + AUTHORITY_KEYID_free(aki); + + return ret; +} + static int sign(X509 *x, EVP_PKEY *pkey, int days, int clrext, const EVP_MD *digest, CONF *conf, char *section, X509_NAME *issuer, char *force_pubkey) @@ -1617,12 +1729,7 @@ sign(X509 *x, EVP_PKEY *pkey, int days, int clrext, const EVP_MD *digest, if (X509_gmtime_adj(X509_get_notBefore(x), 0) == NULL) goto err; - /* Lets just make it 12:00am GMT, Jan 1 1970 */ - /* memcpy(x->cert_info->validity->notBefore,"700101120000Z",13); */ - /* 28 days to be certified */ - - if (X509_gmtime_adj(X509_get_notAfter(x), - (long) 60 * 60 * 24 * days) == NULL) + if (X509_gmtime_adj(X509_get_notAfter(x), 60L * 60 * 24 * days) == NULL) goto err; if (force_pubkey == NULL) { @@ -1637,12 +1744,30 @@ sign(X509 *x, EVP_PKEY *pkey, int days, int clrext, const EVP_MD *digest, } if (conf != NULL) { X509V3_CTX ctx; + if (!X509_set_version(x, 2)) /* version 3 certificate */ goto err; X509V3_set_ctx(&ctx, x, x, NULL, NULL, 0); X509V3_set_nconf(&ctx, conf); if (!X509V3_EXT_add_nconf(conf, &ctx, section, x)) goto err; + if (force_pubkey != NULL) { + /* + * Set or fix up SKI and AKI. + * + * XXX - Doing this in a fully OpenSSL 3 compatible way + * is extremely nasty: they hang an issuer_pubkey off + * the X509V3_CTX and adjusted v2i_AUTHORITY_KEYID(). + * Punt on this and make things work in the specific + * situation we're interested in. Like OpenSSL, we only + * support the keyid form of the AKI, which is what + * RFC 5280 recommends, but unlike OpenSSL we replace + * existing SKI and AKI rather than honoring the most + * likely outdated ones already present in the cert. + */ + if (!set_key_identifiers(x, pkey)) + goto err; + } } if (!X509_sign(x, pkey, digest)) goto err; diff --git a/usr.bin/rdist/rdist.1 b/usr.bin/rdist/rdist.1 index 0a9734d48..935399551 100644 --- a/usr.bin/rdist/rdist.1 +++ b/usr.bin/rdist/rdist.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: rdist.1,v 1.49 2017/01/01 01:08:11 tb Exp $ +.\" $OpenBSD: rdist.1,v 1.51 2024/12/30 07:13:33 jmc Exp $ .\" .\" Copyright (c) 1983 Regents of the University of California. .\" All rights reserved. @@ -30,7 +30,7 @@ .\" $From: rdist.man,v 6.34 1996/01/29 22:37:19 mcooper Exp $ .\" @(#)rdist.1 6.6 (Berkeley) 5/13/86 .\" -.Dd $Mdocdate: January 1 2017 $ +.Dd $Mdocdate: December 30 2024 $ .Dt RDIST 1 .Os .Sh NAME @@ -119,7 +119,7 @@ Otherwise, .Nm will run the command: .Bd -literal -offset indent -ssh \*(Lthost\*(Gt -l \*(Ltlogin_name\*(Gt rdistd -S +ssh -l rdistd -S .Ed .Pp .Ar host @@ -140,7 +140,7 @@ option was specified, .Nm will attempt to run the command: .Bd -literal -offset indent -\*(Ltrdistd path\*(Gt -S + -S .Ed .Pp If no @@ -180,7 +180,7 @@ $ rdist -c name ... [login@]host[:dest] .Pp The equivalent distfile is as follows: .Bd -literal -offset indent -( name ... ) -\*(Gt [login@]host +( name ... ) -> [login@]host install [dest] ; .Ed .It Fl D @@ -415,9 +415,9 @@ to be copied, the destination hosts, and what operations to perform to do the updating. Each entry has one of the following formats. .Bd -literal -offset indent -\*(Ltvariable name\*(Gt = \*(Ltname list\*(Gt -[ label: ] \*(Ltsource list\*(Gt -\*(Gt \*(Ltdestination list\*(Gt \*(Ltcommand list\*(Gt -[ label: ] \*(Ltsource list\*(Gt :: \*(Lttimestamp file\*(Gt \*(Ltcommand list\*(Gt + = +[ label: ] -> +[ label: ] :: .Ed .Pp The first format is used for defining variables. @@ -454,11 +454,11 @@ They are used to identify a specific command to execute .Pp The source and destination lists have the following format: .Bd -literal -offset indent -\*(Ltname\*(Gt + .Ed or .Bd -literal -compact -offset indent -`(' \*(Ltzero or more names separated by whitespace\*(Gt `)' +`(' `)' .Ed .Pp These simple lists can be modified by using one level of set addition, @@ -478,29 +478,43 @@ then the list will have to be explicitly constructed in steps using .Dq temporary variables. .Pp -The shell meta-characters `[', `]', `{', `}', `*', and `?' +The shell meta-characters +.Sq \&[ , +.Sq \&] , +.Sq \&{ , +.Sq \&} , +.Sq * , +and +.Sq \&? are recognized and expanded (on the local host only) in the same way as .Xr ksh 1 . They can be escaped with a backslash. -The `~' character is also expanded in the same way as +The +.Sq ~ +character is also expanded in the same way as .Xr ksh 1 but is expanded separately on the local and destination hosts. When the .Fl o Ar whole -option is used with a file name that begins with `~', everything except the -home directory is appended to the destination name. -File names which do not begin with `/' or `~' use the destination user's +option is used with a file name that begins with +.Sq \&~ , +everything except the home directory is appended to the destination name. +File names which do not begin with +.Sq / +or +.Sq ~ +use the destination user's home directory as the root directory for the rest of the file name. .Pp The command list consists of zero or more commands of the following format: .Bl -column "except_pat" "" "opt_dest_name" ";" -offset indent -.It install Ta \*(Ltoptions\*(Gt Ta opt_dest_name Ta ; -.It notify Ta \*(Ltname list\*(Gt Ta "" Ta ; -.It except Ta \*(Ltname list\*(Gt Ta "" Ta ; -.It except_pat Ta \*(Ltpattern list\*(Gt Ta "" Ta ; -.It special Ta \*(Ltname list\*(Gt Ta string Ta ; -.It cmdspecial Ta \*(Ltname list\*(Gt Ta string Ta ; +.It install Ta Ta opt_dest_name Ta ; +.It notify Ta Ta "" Ta ; +.It except Ta Ta "" Ta ; +.It except_pat Ta Ta "" Ta ; +.It special Ta Ta string Ta ; +.It cmdspecial Ta Ta string Ta ; .El .Pp The @@ -554,12 +568,17 @@ is a list of basic regular expressions for details). If one of the patterns matches some string within a file name, that file will be ignored. -Note that since `\e' is a quote character, it must be doubled to become +Note that since +.Sq \e +is a quote character, it must be doubled to become part of the regular expression. Variables are expanded in .Ar pattern list but not shell file pattern matching characters. -To include a `$', it must be escaped with `\e'. +To include a +.Sq $ , +it must be escaped with +.Sq \e . .Pp The .Cm special @@ -573,7 +592,9 @@ If the is omitted then the shell commands will be executed for every file updated or installed. .Ar string -starts and ends with `"' and can cross multiple lines in +starts and ends with +.Sq \&" +and can cross multiple lines in .Pa distfile . Multiple commands to the shell should be separated by `;'. Commands are executed in the user's home directory on the host @@ -750,20 +771,20 @@ FILES = ( /bin /lib /usr/bin /usr/games EXLIB = ( Mail.rc aliases aliases.db crontab dshrc sendmail.cf sendmail.hf sendmail.st uucp vfont ) -${FILES} -\*(Gt ${HOSTS} +${FILES} -> ${HOSTS} install -oremove,chknfs ; except /usr/lib/${EXLIB} ; except /usr/games/lib ; special /usr/lib/sendmail "/usr/lib/sendmail -bi" ; srcs: -/usr/src/bin -\*(Gt arpa +/usr/src/bin -> arpa except_pat ( \e\e.o\e$ /SCCS\e$ ) ; IMAGEN = (ips dviimp catdvi) imagen: -/usr/local/${IMAGEN} -\*(Gt arpa +/usr/local/${IMAGEN} -> arpa install /usr/local/lib ; notify ralph ; diff --git a/usr.bin/sed/process.c b/usr.bin/sed/process.c index 7635f2ffd..c87e0fc5a 100644 --- a/usr.bin/sed/process.c +++ b/usr.bin/sed/process.c @@ -1,4 +1,4 @@ -/* $OpenBSD: process.c,v 1.38 2024/08/28 14:30:26 millert Exp $ */ +/* $OpenBSD: process.c,v 1.39 2024/12/10 23:49:55 millert Exp $ */ /*- * Copyright (c) 1992 Diomidis Spinellis. @@ -124,7 +124,7 @@ redirect: psl = 0; if (cp->a2 == NULL || lastaddr || lastline()) (void)fprintf(outfile, "%s", cp->t); - break; + goto new; case 'd': pd = 1; goto new; diff --git a/usr.bin/sed/sed.1 b/usr.bin/sed/sed.1 index e8b1e90f9..2e6ea058b 100644 --- a/usr.bin/sed/sed.1 +++ b/usr.bin/sed/sed.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: sed.1,v 1.63 2022/12/28 13:00:57 jsg Exp $ +.\" $OpenBSD: sed.1,v 1.64 2024/12/10 23:49:55 millert Exp $ .\" .\" Copyright (c) 1992, 1993 .\" The Regents of the University of California. All rights reserved. @@ -32,7 +32,7 @@ .\" .\" from: @(#)sed.1 8.2 (Berkeley) 12/30/93 .\" -.Dd $Mdocdate: December 28 2022 $ +.Dd $Mdocdate: December 10 2024 $ .Dt SED 1 .Os .Sh NAME @@ -336,7 +336,7 @@ If the label is not specified, branch to the end of the script. .br .Ar text .Xc -Delete the pattern space. +Delete the pattern space and start the next cycle. With 0 or 1 address or at the end of a 2-address range, .Ar text is written to the standard output. diff --git a/usr.bin/sndiod/abuf.c b/usr.bin/sndiod/abuf.c index b88cecc44..694790574 100644 --- a/usr.bin/sndiod/abuf.c +++ b/usr.bin/sndiod/abuf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: abuf.c,v 1.5 2022/12/26 19:16:03 jmc Exp $ */ +/* $OpenBSD: abuf.c,v 1.6 2024/12/20 07:35:56 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov * @@ -29,18 +29,6 @@ #include "abuf.h" #include "utils.h" -#ifdef DEBUG -void -abuf_log(struct abuf *buf) -{ - log_putu(buf->start); - log_puts("+"); - log_putu(buf->used); - log_puts("/"); - log_putu(buf->len); -} -#endif - void abuf_init(struct abuf *buf, unsigned int len) { @@ -54,13 +42,8 @@ void abuf_done(struct abuf *buf) { #ifdef DEBUG - if (buf->used > 0) { - if (log_level >= 3) { - log_puts("deleting non-empty buffer, used = "); - log_putu(buf->used); - log_puts("\n"); - } - } + if (buf->used > 0) + logx(3, "deleting non-empty buffer, used = %d", buf->used); #endif xfree(buf->data); buf->data = (void *)0xdeadbeef; @@ -89,9 +72,7 @@ abuf_rdiscard(struct abuf *buf, int count) { #ifdef DEBUG if (count < 0 || count > buf->used) { - log_puts("abuf_rdiscard: bad count = "); - log_putu(count); - log_puts("\n"); + logx(0, "%s: bad count = %d", __func__, count); panic(); } #endif @@ -109,9 +90,7 @@ abuf_wcommit(struct abuf *buf, int count) { #ifdef DEBUG if (count < 0 || count > (buf->len - buf->used)) { - log_puts("abuf_wcommit: bad count = "); - log_putu(count); - log_puts("\n"); + logx(0, "%s: bad count = %d", __func__, count); panic(); } #endif diff --git a/usr.bin/sndiod/abuf.h b/usr.bin/sndiod/abuf.h index d29469240..2a9db7a62 100644 --- a/usr.bin/sndiod/abuf.h +++ b/usr.bin/sndiod/abuf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: abuf.h,v 1.2 2016/03/23 06:11:52 ratchov Exp $ */ +/* $OpenBSD: abuf.h,v 1.3 2024/12/20 07:35:56 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov * @@ -26,7 +26,6 @@ struct abuf { void abuf_init(struct abuf *, unsigned int); void abuf_done(struct abuf *); -void abuf_log(struct abuf *); unsigned char *abuf_rgetblk(struct abuf *, int *); unsigned char *abuf_wgetblk(struct abuf *, int *); void abuf_rdiscard(struct abuf *, int); diff --git a/usr.bin/sndiod/dev.c b/usr.bin/sndiod/dev.c index 0f19f6ebe..4394e95e8 100644 --- a/usr.bin/sndiod/dev.c +++ b/usr.bin/sndiod/dev.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dev.c,v 1.118 2024/08/23 01:19:33 jsg Exp $ */ +/* $OpenBSD: dev.c,v 1.119 2024/12/20 07:35:56 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov * @@ -54,7 +54,6 @@ unsigned int dev_roundof(struct dev *, unsigned int); void dev_wakeup(struct dev *); void slot_ctlname(struct slot *, char *, size_t); -void slot_log(struct slot *); void slot_del(struct slot *); void slot_setvol(struct slot *, unsigned int); void slot_ready(struct slot *); @@ -65,9 +64,6 @@ void slot_write(struct slot *); void slot_read(struct slot *); int slot_skip(struct slot *); -void ctl_node_log(struct ctl_node *); -void ctl_log(struct ctl *); - struct slotops zomb_slotops = { zomb_onmove, zomb_onvol, @@ -107,53 +103,12 @@ slot_array_init(void) } } -void -dev_log(struct dev *d) -{ -#ifdef DEBUG - static char *pstates[] = { - "cfg", "ini", "run" - }; -#endif - log_puts("snd"); - log_putu(d->num); -#ifdef DEBUG - if (log_level >= 3) { - log_puts(" pst="); - log_puts(pstates[d->pstate]); - } -#endif -} - void slot_ctlname(struct slot *s, char *name, size_t size) { snprintf(name, size, "%s%u", s->name, s->unit); } -void -slot_log(struct slot *s) -{ - char name[CTL_NAMEMAX]; -#ifdef DEBUG - static char *pstates[] = { - "ini", "sta", "rdy", "run", "stp", "mid" - }; -#endif - slot_ctlname(s, name, CTL_NAMEMAX); - log_puts(name); -#ifdef DEBUG - if (log_level >= 3) { - log_puts(" vol="); - log_putu(s->vol); - if (s->ops) { - log_puts(",pst="); - log_puts(pstates[s->pstate]); - } - } -#endif -} - void zomb_onmove(void *arg) { @@ -180,10 +135,7 @@ zomb_eof(void *arg) struct slot *s = arg; #ifdef DEBUG - if (log_level >= 3) { - slot_log(s); - log_puts(": zomb_eof\n"); - } + logx(3, "%s%u: %s", s->name, s->unit, __func__); #endif s->ops = NULL; } @@ -194,13 +146,29 @@ zomb_exit(void *arg) #ifdef DEBUG struct slot *s = arg; - if (log_level >= 3) { - slot_log(s); - log_puts(": zomb_exit\n"); - } + logx(3, "%s%u: %s", s->name, s->unit, __func__); #endif } +size_t +chans_fmt(char *buf, size_t size, int mode, int pmin, int pmax, int rmin, int rmax) +{ + const char *sep = ""; + char *end = buf + size; + char *p = buf; + + if (mode & MODE_PLAY) { + p += snprintf(p, p < end ? end - p : 0, "play %d:%d", pmin, pmax); + sep = ", "; + } + if (mode & MODE_RECMASK) { + p += snprintf(p, p < end ? end - p : 0, "%s%s %d:%d", sep, + (mode & MODE_MON) ? "mon" : "rec", rmin, rmax); + } + + return p - buf; +} + /* * Broadcast MIDI data to all opts using this device */ @@ -307,14 +275,7 @@ mtc_midi_full(struct mtc *mtc) mtc->fps = 24; } #ifdef DEBUG - if (log_level >= 3) { - dev_log(mtc->dev); - log_puts(": mtc full frame at "); - log_puti(mtc->delta); - log_puts(", "); - log_puti(mtc->fps); - log_puts(" fps\n"); - } + logx(3, "%s: mtc full frame at %d, %d fps", mtc->dev->path, mtc->delta, mtc->fps); #endif fps = mtc->fps; mtc->hr = (mtc->origin / (MTC_SEC * 3600)) % 24; @@ -452,10 +413,7 @@ slot_skip(struct slot *s) break; } #ifdef DEBUG - if (log_level >= 4) { - slot_log(s); - log_puts(": skipped a cycle\n"); - } + logx(4, "%s%u: skipped a cycle", s->name, s->unit); #endif if (s->pstate != SLOT_STOP && (s->mode & MODE_RECMASK)) { if (s->sub.encbuf) @@ -485,10 +443,8 @@ dev_mix_badd(struct dev *d, struct slot *s) idata = (adata_t *)abuf_rgetblk(&s->mix.buf, &icount); #ifdef DEBUG if (icount < s->round * s->mix.bpf) { - slot_log(s); - log_puts(": not enough data to mix ("); - log_putu(icount); - log_puts("bytes)\n"); + logx(0, "%s%u: not enough data to mix (%u bytes)", + s->name, s->unit, icount); panic(); } #endif @@ -577,14 +533,8 @@ dev_mix_adjvol(struct dev *d) i->mix.weight = d->master_enabled ? ADATA_MUL(weight, MIDI_TO_ADATA(d->master)) : weight; #ifdef DEBUG - if (log_level >= 3) { - slot_log(i); - log_puts(": set weight: "); - log_puti(i->mix.weight); - log_puts("/"); - log_puti(i->opt->maxweight); - log_puts("\n"); - } + logx(3, "%s%u: set weight: %d / %d", i->name, i->unit, i->mix.weight, + i->opt->maxweight); #endif } } @@ -605,7 +555,7 @@ dev_sub_bcopy(struct dev *d, struct slot *s) odata = (adata_t *)abuf_wgetblk(&s->sub.buf, &ocount); #ifdef DEBUG if (ocount < s->round * s->sub.bpf) { - log_puts("dev_sub_bcopy: not enough space\n"); + logx(0, "dev_sub_bcopy: not enough space"); panic(); } #endif @@ -681,10 +631,7 @@ dev_cycle(struct dev *d) */ if (d->slot_list == NULL && d->idle >= d->bufsz && (mtc_array[0].dev != d || mtc_array[0].tstate != MTC_RUN)) { - if (log_level >= 2) { - dev_log(d); - log_puts(": device stopped\n"); - } + logx(2, "%s: device stopped", d->path); dev_sio_stop(d); d->pstate = DEV_INIT; if (d->refcnt == 0) @@ -694,12 +641,7 @@ dev_cycle(struct dev *d) if (d->prime > 0) { #ifdef DEBUG - if (log_level >= 4) { - dev_log(d); - log_puts(": empty cycle, prime = "); - log_putu(d->prime); - log_puts("\n"); - } + logx(4, "%s: empty cycle, prime = %u", d->path, d->prime); #endif base = (unsigned char *)DEV_PBUF(d); nsamp = d->round * d->pchan; @@ -714,16 +656,7 @@ dev_cycle(struct dev *d) d->delta -= d->round; #ifdef DEBUG - if (log_level >= 4) { - dev_log(d); - log_puts(": full cycle: delta = "); - log_puti(d->delta); - if (d->mode & MODE_PLAY) { - log_puts(", poffs = "); - log_puti(d->poffs); - } - log_puts("\n"); - } + logx(4, "%s: full cycle: delta = %d", d->path, d->delta); #endif if (d->mode & MODE_PLAY) { base = (unsigned char *)DEV_PBUF(d); @@ -735,13 +668,7 @@ dev_cycle(struct dev *d) ps = &d->slot_list; while ((s = *ps) != NULL) { #ifdef DEBUG - if (log_level >= 4) { - slot_log(s); - log_puts(": running"); - log_puts(", skip = "); - log_puti(s->skip); - log_puts("\n"); - } + logx(4, "%s%u: running, skip = %d", s->name, s->unit, s->skip); #endif d->idle = 0; @@ -757,8 +684,8 @@ dev_cycle(struct dev *d) #ifdef DEBUG if (s->pstate == SLOT_STOP && !(s->mode & MODE_PLAY)) { - slot_log(s); - log_puts(": rec-only slots can't be drained\n"); + logx(0, "%s%u: rec-only slots can't be drained", + s->name, s->unit); panic(); } #endif @@ -778,10 +705,7 @@ dev_cycle(struct dev *d) slot_freebufs(s); dev_mix_adjvol(d); #ifdef DEBUG - if (log_level >= 3) { - slot_log(s); - log_puts(": drained\n"); - } + logx(3, "%s%u: drained", s->name, s->unit); #endif continue; } @@ -796,10 +720,7 @@ dev_cycle(struct dev *d) s->round * s->sub.bpf)) { #ifdef DEBUG - if (log_level >= 3) { - slot_log(s); - log_puts(": xrun, pause cycle\n"); - } + logx(3, "%s%u: xrun, pause cycle", s->name, s->unit); #endif if (s->xrun == XRUN_IGNORE) { s->delta -= s->round; @@ -812,8 +733,7 @@ dev_cycle(struct dev *d) *ps = s->next; } else { #ifdef DEBUG - slot_log(s); - log_puts(": bad xrun mode\n"); + logx(0, "%s%u: bad xrun mode", s->name, s->unit); panic(); #endif } @@ -825,12 +745,8 @@ dev_cycle(struct dev *d) s->ops->flush(s->arg); } else { #ifdef DEBUG - if (log_level >= 3) { - slot_log(s); - log_puts(": prime = "); - log_puti(s->sub.prime); - log_puts("\n"); - } + logx(3, "%s%u: prime = %d", s->name, s->unit, + s->sub.prime); #endif s->sub.prime--; } @@ -890,12 +806,8 @@ dev_master(struct dev *d, unsigned int master) struct ctl *c; unsigned int v; - if (log_level >= 2) { - dev_log(d); - log_puts(": master volume set to "); - log_putu(master); - log_puts("\n"); - } + logx(2, "%s: master volume set to %u", d->path, master); + if (d->master_enabled) { d->master = master; if (d->mode & MODE_PLAY) @@ -926,8 +838,7 @@ dev_new(char *path, struct aparams *par, struct dev *d, **pd; if (dev_sndnum == DEV_NMAX) { - if (log_level >= 1) - log_puts("too many devices\n"); + logx(1, "too many devices"); return NULL; } d = xmalloc(sizeof(struct dev)); @@ -984,6 +895,8 @@ dev_adjpar(struct dev *d, int mode, int dev_allocbufs(struct dev *d) { + char enc_str[ENCMAX], chans_str[64]; + /* * Create record buffer. */ @@ -1022,29 +935,14 @@ dev_allocbufs(struct dev *d) */ memset(d->rbuf, 0, d->round * d->rchan * sizeof(adata_t)); - if (log_level >= 2) { - dev_log(d); - log_puts(": "); - log_putu(d->rate); - log_puts("Hz, "); - aparams_log(&d->par); - if (d->mode & MODE_PLAY) { - log_puts(", play 0:"); - log_puti(d->pchan - 1); - } - if (d->mode & MODE_REC) { - log_puts(", rec 0:"); - log_puti(d->rchan - 1); - } - log_puts(", "); - log_putu(d->bufsz / d->round); - log_puts(" blocks of "); - log_putu(d->round); - log_puts(" frames"); - if (d == mtc_array[0].dev) - log_puts(", mtc"); - log_puts("\n"); - } + logx(2, "%s: %dHz, %s, %s, %d blocks of %d frames", + d->path, d->rate, + (aparams_enctostr(&d->par, enc_str), enc_str), + (chans_fmt(chans_str, sizeof(chans_str), + d->mode & (MODE_PLAY | MODE_REC), + 0, d->pchan - 1, 0, d->rchan - 1), chans_str), + d->bufsz / d->round, d->round); + return 1; } @@ -1066,10 +964,7 @@ dev_open(struct dev *d) if (d->rchan == 0) d->rchan = 2; if (!dev_sio_open(d)) { - if (log_level >= 1) { - dev_log(d); - log_puts(": failed to open audio device\n"); - } + logx(1, "%s: failed to open audio device", d->path); return 0; } if (!dev_allocbufs(d)) @@ -1127,10 +1022,7 @@ void dev_freebufs(struct dev *d) { #ifdef DEBUG - if (log_level >= 3) { - dev_log(d); - log_puts(": closing\n"); - } + logx(3, "%s: closing", d->path); #endif if (d->mode & MODE_PLAY) { if (d->encbuf != NULL) @@ -1164,10 +1056,7 @@ int dev_ref(struct dev *d) { #ifdef DEBUG - if (log_level >= 3) { - dev_log(d); - log_puts(": device requested\n"); - } + logx(3, "%s: device requested", d->path); #endif if (d->pstate == DEV_CFG && !dev_open(d)) return 0; @@ -1179,10 +1068,7 @@ void dev_unref(struct dev *d) { #ifdef DEBUG - if (log_level >= 3) { - dev_log(d); - log_puts(": device released\n"); - } + logx(3, "%s: device released", d->path); #endif d->refcnt--; if (d->refcnt == 0 && d->pstate == DEV_INIT) @@ -1197,10 +1083,9 @@ dev_init(struct dev *d) { if ((d->reqmode & MODE_AUDIOMASK) == 0) { #ifdef DEBUG - dev_log(d); - log_puts(": has no streams\n"); + logx(1, "%s: has no streams", d->path); #endif - return 0; + return 0; } if (d->hold && !dev_ref(d)) return 0; @@ -1214,10 +1099,7 @@ void dev_done(struct dev *d) { #ifdef DEBUG - if (log_level >= 3) { - dev_log(d); - log_puts(": draining\n"); - } + logx(3, "%s: draining", d->path); #endif if (mtc_array[0].dev == d && mtc_array[0].tstate != MTC_STOP) mtc_stop(&mtc_array[0]); @@ -1246,18 +1128,14 @@ dev_del(struct dev *d) struct dev **p; #ifdef DEBUG - if (log_level >= 3) { - dev_log(d); - log_puts(": deleting\n"); - } + logx(3, "%s: deleting", d->path); #endif if (d->pstate != DEV_CFG) dev_close(d); for (p = &dev_list; *p != d; p = &(*p)->next) { #ifdef DEBUG if (*p == NULL) { - dev_log(d); - log_puts(": device to delete not on the list\n"); + logx(0, "%s: not on the list", d->path); panic(); } #endif @@ -1279,10 +1157,8 @@ void dev_wakeup(struct dev *d) { if (d->pstate == DEV_INIT) { - if (log_level >= 2) { - dev_log(d); - log_puts(": device started\n"); - } + logx(2, "%s: started", d->path); + if (d->mode & MODE_PLAY) { d->prime = d->bufsz; } else { @@ -1311,12 +1187,7 @@ dev_iscompat(struct dev *o, struct dev *n) { if (((long long)o->round * n->rate != (long long)n->round * o->rate) || ((long long)o->bufsz * n->rate != (long long)n->bufsz * o->rate)) { - if (log_level >= 1) { - log_puts(n->name); - log_puts(": not compatible with "); - log_puts(o->name); - log_puts("\n"); - } + logx(1, "%s: not compatible with %s", n->name, o->name); return 0; } return 1; @@ -1343,10 +1214,7 @@ dev_migrate(struct dev *odev) /* try next one, circulating through the list */ ndev = ndev->alt_next; if (ndev == odev) { - if (log_level >= 1) { - dev_log(odev); - log_puts(": no fall-back device found\n"); - } + logx(1, "%s: no fall-back device found", odev->path); return NULL; } @@ -1364,12 +1232,7 @@ dev_migrate(struct dev *odev) break; } - if (log_level >= 1) { - dev_log(odev); - log_puts(": switching to "); - dev_log(ndev); - log_puts("\n"); - } + logx(1, "%s: switching to %s", odev->path, ndev->path); if (mtc_array[0].dev == odev) mtc_setdev(&mtc_array[0], ndev); @@ -1410,10 +1273,7 @@ mtc_trigger(struct mtc *mtc) struct slot *s; if (mtc->tstate != MTC_START) { - if (log_level >= 2) { - dev_log(mtc->dev); - log_puts(": not started by mmc yet, waiting...\n"); - } + logx(2, "%s: not started by mmc yet, waiting.", mtc->dev->path); return; } @@ -1422,10 +1282,7 @@ mtc_trigger(struct mtc *mtc) continue; if (s->pstate != SLOT_READY) { #ifdef DEBUG - if (log_level >= 3) { - slot_log(s); - log_puts(": not ready, start delayed\n"); - } + logx(3, "%s%u: not ready, start delayed", s->name, s->unit); #endif return; } @@ -1455,10 +1312,7 @@ mtc_start(struct mtc *mtc) mtc_trigger(mtc); #ifdef DEBUG } else { - if (log_level >= 3) { - dev_log(mtc->dev); - log_puts(": ignoring mmc start\n"); - } + logx(3, "%s: ignoring mmc start", mtc->dev->path); #endif } } @@ -1479,10 +1333,7 @@ mtc_stop(struct mtc *mtc) break; default: #ifdef DEBUG - if (log_level >= 3) { - dev_log(mtc->dev); - log_puts(": ignored mmc stop\n"); - } + logx(3, "%s: ignored mmc stop", mtc->dev->path); #endif return; } @@ -1494,12 +1345,8 @@ mtc_stop(struct mtc *mtc) void mtc_loc(struct mtc *mtc, unsigned int origin) { - if (log_level >= 2) { - dev_log(mtc->dev); - log_puts(": relocated to "); - log_putu(origin); - log_puts("\n"); - } + logx(2, "%s: relocated to %u", mtc->dev->path, origin); + if (mtc->tstate == MTC_RUN) mtc_stop(mtc); mtc->origin = origin; @@ -1518,10 +1365,7 @@ mtc_setdev(struct mtc *mtc, struct dev *d) if (mtc->dev == d) return; - if (log_level >= 2) { - dev_log(d); - log_puts(": set to be MIDI clock source\n"); - } + logx(2, "%s: set to be MIDI clock source", d->path); /* adjust clock and ref counter, if needed */ if (mtc->tstate == MTC_RUN) { @@ -1655,14 +1499,8 @@ slot_allocbufs(struct slot *s) } #ifdef DEBUG - if (log_level >= 3) { - slot_log(s); - log_puts(": allocated "); - log_putu(s->appbufsz); - log_puts("/"); - log_putu(SLOT_BUFSZ(s)); - log_puts(" fr buffers\n"); - } + logx(3, "%s%u: allocated %u/%u fr buffers", + s->name, s->unit, s->appbufsz, SLOT_BUFSZ(s)); #endif } @@ -1757,10 +1595,7 @@ slot_new(struct opt *opt, unsigned int id, char *who, } if (bestidx == DEV_NSLOT) { - if (log_level >= 1) { - log_puts(name); - log_puts(": out of sub-device slots\n"); - } + logx(1, "%s: out of sub-device slots", name); return NULL; } @@ -1800,14 +1635,7 @@ found: dev_midi_slotdesc(s->opt->dev, s); dev_midi_vol(s->opt->dev, s); #ifdef DEBUG - if (log_level >= 3) { - slot_log(s); - log_puts(": using "); - log_puts(s->opt->name); - log_puts(", mode = "); - log_putx(mode); - log_puts("\n"); - } + logx(3, "%s%u: using %s, mode = %x", s->name, s->unit, s->opt->name, mode); #endif return s; } @@ -1841,12 +1669,7 @@ void slot_setvol(struct slot *s, unsigned int vol) { #ifdef DEBUG - if (log_level >= 3) { - slot_log(s); - log_puts(": setting volume "); - log_putu(vol); - log_puts("\n"); - } + logx(3, "%s%u: setting volume %u", s->name, s->unit, vol); #endif s->vol = vol; s->mix.vol = MIDI_TO_ADATA(s->vol); @@ -1865,12 +1688,7 @@ slot_setopt(struct slot *s, struct opt *o) if (s->opt == NULL || s->opt == o) return; - if (log_level >= 2) { - slot_log(s); - log_puts(": moving to opt "); - log_puts(o->name); - log_puts("\n"); - } + logx(2, "%s%u: moving to opt %s", s->name, s->unit, o->name); odev = s->opt->dev; if (s->ops != NULL) { @@ -1919,12 +1737,8 @@ slot_attach(struct slot *s) if (((s->mode & MODE_PLAY) && !(s->opt->mode & MODE_PLAY)) || ((s->mode & MODE_RECMASK) && !(s->opt->mode & MODE_RECMASK))) { - if (log_level >= 1) { - slot_log(s); - log_puts(" at "); - log_puts(s->opt->name); - log_puts(": mode not allowed on this sub-device\n"); - } + logx(1, "%s%u at %s: mode not allowed", s->name, s->unit, s->opt->name); + return; } /* @@ -1951,16 +1765,8 @@ slot_attach(struct slot *s) } #ifdef DEBUG - if (log_level >= 2) { - slot_log(s); - log_puts(": attached at "); - log_puti(s->delta); - log_puts(" + "); - log_puti(s->delta_rem); - log_puts("/"); - log_puti(s->round); - log_puts("\n"); - } + logx(2, "%s%u: attached at %d + %d / %d", + s->name, s->unit, s->delta, s->delta_rem, s->round); #endif /* @@ -2006,31 +1812,20 @@ slot_start(struct slot *s) { struct dev *d = s->opt->dev; #ifdef DEBUG + char enc_str[ENCMAX], chans_str[64]; + if (s->pstate != SLOT_INIT) { - slot_log(s); - log_puts(": slot_start: wrong state\n"); + logx(0, "%s%u: slot_start: wrong state", s->name, s->unit); panic(); } - if (s->mode & MODE_PLAY) { - if (log_level >= 3) { - slot_log(s); - log_puts(": playing "); - aparams_log(&s->par); - log_puts(" -> "); - aparams_log(&d->par); - log_puts("\n"); - } - } - if (s->mode & MODE_RECMASK) { - if (log_level >= 3) { - slot_log(s); - log_puts(": recording "); - aparams_log(&s->par); - log_puts(" <- "); - aparams_log(&d->par); - log_puts("\n"); - } - } + + logx(2, "%s%u: %dHz, %s, %s, %d blocks of %d frames", + s->name, s->unit, s->rate, + (aparams_enctostr(&s->par, enc_str), enc_str), + (chans_fmt(chans_str, sizeof(chans_str), s->mode, + s->opt->pmin, s->opt->pmin + s->mix.nch - 1, + s->opt->rmin, s->opt->rmin + s->sub.nch - 1), chans_str), + s->appbufsz / s->round, s->round); #endif slot_allocbufs(s); @@ -2070,8 +1865,7 @@ slot_detach(struct slot *s) for (ps = &d->slot_list; *ps != s; ps = &(*ps)->next) { #ifdef DEBUG if (*ps == NULL) { - slot_log(s); - log_puts(": can't detach, not on list\n"); + logx(0, "%s%u: can't detach, not on list", s->name, s->unit); panic(); } #endif @@ -2093,16 +1887,8 @@ slot_detach(struct slot *s) } #ifdef DEBUG - if (log_level >= 2) { - slot_log(s); - log_puts(": detached at "); - log_puti(s->delta); - log_puts(" + "); - log_puti(s->delta_rem); - log_puts("/"); - log_puti(d->round); - log_puts("\n"); - } + logx(2, "%s%u: detached at %d + %d / %d", + s->name, s->unit, s->delta, s->delta_rem, d->round); #endif if (s->mode & MODE_PLAY) dev_mix_adjvol(d); @@ -2138,10 +1924,7 @@ void slot_stop(struct slot *s, int drain) { #ifdef DEBUG - if (log_level >= 3) { - slot_log(s); - log_puts(": stopping\n"); - } + logx(3, "%s%u: stopping (drain = %d)", s->name, s->unit, drain); #endif if (s->pstate == SLOT_START) { /* @@ -2167,10 +1950,7 @@ slot_stop(struct slot *s, int drain) slot_detach(s); } else { #ifdef DEBUG - if (log_level >= 3) { - slot_log(s); - log_puts(": not drained (blocked by mmc)\n"); - } + logx(3, "%s%u: not drained (blocked by mmc)", s->name, s->unit); #endif } @@ -2187,10 +1967,7 @@ slot_skip_update(struct slot *s) skip = slot_skip(s); while (skip > 0) { #ifdef DEBUG - if (log_level >= 4) { - slot_log(s); - log_puts(": catching skipped block\n"); - } + logx(4, "%s%u: catching skipped block", s->name, s->unit); #endif if (s->mode & MODE_RECMASK) s->ops->flush(s->arg); @@ -2209,10 +1986,7 @@ slot_write(struct slot *s) { if (s->pstate == SLOT_START && s->mix.buf.used == s->mix.buf.len) { #ifdef DEBUG - if (log_level >= 4) { - slot_log(s); - log_puts(": switching to READY state\n"); - } + logx(4, "%s%u: switching to READY state", s->name, s->unit); #endif s->pstate = SLOT_READY; slot_ready(s); @@ -2351,99 +2125,81 @@ ctlslot_update(struct ctlslot *s) s->ops->sync(s->arg); } -void -ctl_node_log(struct ctl_node *c) +size_t +ctl_node_fmt(char *buf, size_t size, struct ctl_node *c) { - log_puts(c->name); + char *end = buf + size; + char *p = buf; + + p += snprintf(buf, size, "%s", c->name); + if (c->unit >= 0) - log_putu(c->unit); + p += snprintf(p, p < end ? end - p : 0, "%d", c->unit); + + return p - buf; } -void -ctl_log(struct ctl *c) +size_t +ctl_scope_fmt(char *buf, size_t size, struct ctl *c) { - if (c->group[0] != 0) { - log_puts(c->group); - log_puts("/"); + switch (c->scope) { + case CTL_HW: + return snprintf(buf, size, "hw:%s/%u", + c->u.hw.dev->name, c->u.hw.addr); + case CTL_DEV_MASTER: + return snprintf(buf, size, "dev_master:%s", + c->u.dev_master.dev->name); + case CTL_SLOT_LEVEL: + return snprintf(buf, size, "slot_level:%s%u", + c->u.slot_level.slot->name, c->u.slot_level.slot->unit); + case CTL_OPT_DEV: + return snprintf(buf, size, "opt_dev:%s/%s", + c->u.opt_dev.opt->name, c->u.opt_dev.dev->name); + default: + return snprintf(buf, size, "unknown"); } - ctl_node_log(&c->node0); - log_puts("."); - log_puts(c->func); - log_puts("="); +} + +size_t +ctl_fmt(char *buf, size_t size, struct ctl *c) +{ + char *end = buf + size; + char *p = buf; + + p += snprintf(p, size, "%s/", c->group); + p += ctl_node_fmt(p, p < end ? end - p : 0, &c->node0); + p += snprintf(p, p < end ? end - p : 0, ".%s", c->func); + switch (c->type) { - case CTL_NONE: - log_puts("none"); - break; - case CTL_NUM: - case CTL_SW: - log_putu(c->curval); - break; case CTL_VEC: case CTL_LIST: case CTL_SEL: - ctl_node_log(&c->node1); - log_puts(":"); - log_putu(c->curval); - } - log_puts(" at "); - log_putu(c->addr); - log_puts(" -> "); - switch (c->scope) { - case CTL_HW: - log_puts("hw:"); - log_puts(c->u.hw.dev->name); - log_puts("/"); - log_putu(c->u.hw.addr); - break; - case CTL_DEV_MASTER: - log_puts("dev_master:"); - log_puts(c->u.dev_master.dev->name); - break; - case CTL_SLOT_LEVEL: - log_puts("slot_level:"); - log_puts(c->u.slot_level.slot->name); - log_putu(c->u.slot_level.slot->unit); - break; - case CTL_OPT_DEV: - log_puts("opt_dev:"); - log_puts(c->u.opt_dev.opt->name); - log_puts("/"); - log_puts(c->u.opt_dev.dev->name); - break; - default: - log_puts("unknown"); - } - if (c->display[0] != 0) { - log_puts(" ("); - log_puts(c->display); - log_puts(")"); + p += snprintf(p, p < end ? end - p : 0, "["); + p += ctl_node_fmt(p, p < end ? end - p : 0, &c->node1); + p += snprintf(p, p < end ? end - p : 0, "]"); } + + if (c->display[0] != 0) + p += snprintf(p, size, " (%s)", c->display); + + return p - buf; } int ctl_setval(struct ctl *c, int val) { if (c->curval == val) { - if (log_level >= 3) { - ctl_log(c); - log_puts(": already set\n"); - } + logx(3, "ctl%u: already set", c->addr); return 1; } if (val < 0 || val > c->maxval) { - if (log_level >= 3) { - log_putu(val); - log_puts(": ctl val out of bounds\n"); - } + logx(3, "ctl%u: %d: out of range", c->addr, val); return 0; } switch (c->scope) { case CTL_HW: - if (log_level >= 3) { - ctl_log(c); - log_puts(": marked as dirty\n"); - } + logx(3, "ctl%u: marked as dirty", c->addr); c->curval = val; c->dirty = 1; return dev_ref(c->u.hw.dev); @@ -2467,10 +2223,7 @@ ctl_setval(struct ctl *c, int val) c->u.opt_dev.opt->alt_first = c->u.opt_dev.dev; return 1; default: - if (log_level >= 2) { - ctl_log(c); - log_puts(": not writable\n"); - } + logx(2, "ctl%u: not writable", c->addr); return 1; } } @@ -2484,6 +2237,9 @@ ctl_new(int scope, void *arg0, void *arg1, char *str0, int unit0, char *func, char *str1, int unit1, int maxval, int val) { +#ifdef DEBUG + char ctl_str[64], scope_str[32]; +#endif struct ctl *c, **pc; struct ctlslot *s; int addr; @@ -2540,10 +2296,9 @@ ctl_new(int scope, void *arg0, void *arg1, c->next = *pc; *pc = c; #ifdef DEBUG - if (log_level >= 2) { - ctl_log(c); - log_puts(": added\n"); - } + logx(2, "ctl%u: %s = %d at %s: added", c->addr, + (ctl_fmt(ctl_str, sizeof(ctl_str), c), ctl_str), c->curval, + (ctl_scope_fmt(scope_str, sizeof(scope_str), c), scope_str)); #endif return c; } @@ -2620,6 +2375,9 @@ ctl_onval(int scope, void *arg0, void *arg1, int val) int ctl_del(int scope, void *arg0, void *arg1) { +#ifdef DEBUG + char str[64]; +#endif struct ctl *c, **pc; int found; @@ -2631,10 +2389,8 @@ ctl_del(int scope, void *arg0, void *arg1) return found; if (ctl_match(c, scope, arg0, arg1)) { #ifdef DEBUG - if (log_level >= 2) { - ctl_log(c); - log_puts(": removed\n"); - } + logx(2, "ctl%u: %s: removed", c->addr, + (ctl_fmt(str, sizeof(str), c), str)); #endif found++; c->refs_mask &= ~CTL_DEVMASK; @@ -2690,17 +2446,11 @@ dev_ctlsync(struct dev *d) } if (d->master_enabled && found) { - if (log_level >= 2) { - dev_log(d); - log_puts(": software master level control disabled\n"); - } + logx(2, "%s: software master level control disabled", d->path); d->master_enabled = 0; ctl_del(CTL_DEV_MASTER, d, NULL); } else if (!d->master_enabled && !found) { - if (log_level >= 2) { - dev_log(d); - log_puts(": software master level control enabled\n"); - } + logx(2, "%s: software master level control enabled", d->path); d->master_enabled = 1; ctl_new(CTL_DEV_MASTER, d, NULL, CTL_NUM, "", d->name, "output", -1, "level", diff --git a/usr.bin/sndiod/dev.h b/usr.bin/sndiod/dev.h index 49a085bbb..e0b6f1ad9 100644 --- a/usr.bin/sndiod/dev.h +++ b/usr.bin/sndiod/dev.h @@ -1,4 +1,4 @@ -/* $OpenBSD: dev.h,v 1.46 2024/05/24 15:16:09 ratchov Exp $ */ +/* $OpenBSD: dev.h,v 1.47 2024/12/20 07:35:56 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov * @@ -288,8 +288,7 @@ extern struct ctlslot ctlslot_array[DEV_NCTLSLOT]; extern struct mtc mtc_array[1]; void slot_array_init(void); - -void dev_log(struct dev *); +size_t chans_fmt(char *, size_t, int, int, int, int, int); int dev_open(struct dev *); void dev_close(struct dev *); void dev_abort(struct dev *); @@ -333,7 +332,6 @@ void mtc_setdev(struct mtc *, struct dev *); /* * sio_open(3) like interface for clients */ -void slot_log(struct slot *); struct slot *slot_new(struct opt *, unsigned int, char *, struct slotops *, void *, int); void slot_del(struct slot *); @@ -354,7 +352,9 @@ void slot_detach(struct slot *); struct ctl *ctl_new(int, void *, void *, int, char *, char *, char *, int, char *, char *, int, int, int); int ctl_del(int, void *, void *); -void ctl_log(struct ctl *); +size_t ctl_node_fmt(char *, size_t, struct ctl_node *); +size_t ctl_scope_fmt(char *, size_t, struct ctl *); +size_t ctl_fmt(char *, size_t, struct ctl *); int ctl_setval(struct ctl *c, int val); int ctl_match(struct ctl *, int, void *, void *); struct ctl *ctl_find(int, void *, void *); diff --git a/usr.bin/sndiod/dev_sioctl.c b/usr.bin/sndiod/dev_sioctl.c index 6ec3e7ae2..168da4df6 100644 --- a/usr.bin/sndiod/dev_sioctl.c +++ b/usr.bin/sndiod/dev_sioctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dev_sioctl.c,v 1.10 2024/05/24 15:16:09 ratchov Exp $ */ +/* $OpenBSD: dev_sioctl.c,v 1.11 2024/12/20 07:35:56 ratchov Exp $ */ /* * Copyright (c) 2014-2020 Alexandre Ratchov * @@ -78,29 +78,19 @@ dev_sioctl_ondesc(void *arg, struct sioctl_desc *desc, int val) void dev_sioctl_onval(void *arg, unsigned int addr, unsigned int val) { + char str[64]; struct dev *d = arg; struct ctl *c; - if (log_level >= 2) { - dev_log(d); - log_puts(": onctl: addr = "); - log_putu(addr); - log_puts(", val = "); - log_putu(val); - log_puts("\n"); - } + logx(2, "%s: onctl: addr = %u, val = %u", d->path, addr, val); for (c = ctl_list; c != NULL; c = c->next) { if (c->scope != CTL_HW || c->u.hw.dev != d || c->u.hw.addr != addr) continue; - if (log_level >= 2) { - ctl_log(c); - log_puts(": new value -> "); - log_putu(val); - log_puts("\n"); - } + logx(2, "ctl%u: %s -> %u", c->addr, + (ctl_fmt(str, sizeof(str), c), str), val); c->val_mask = ~0U; c->curval = val; @@ -197,14 +187,9 @@ dev_sioctl_out(void *arg) if (c->scope != CTL_HW || c->u.hw.dev != d || !c->dirty) continue; if (!sioctl_setval(d->sioctl.hdl, c->u.hw.addr, c->curval)) { - ctl_log(c); - log_puts(": set failed\n"); + logx(1, "ctl%u: set failed", c->addr); break; } - if (log_level >= 2) { - ctl_log(c); - log_puts(": changed\n"); - } c->dirty = 0; cnt++; } diff --git a/usr.bin/sndiod/dsp.c b/usr.bin/sndiod/dsp.c index 2aa1cb143..e7954b65c 100644 --- a/usr.bin/sndiod/dsp.c +++ b/usr.bin/sndiod/dsp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dsp.c,v 1.21 2024/04/22 14:11:35 ratchov Exp $ */ +/* $OpenBSD: dsp.c,v 1.22 2024/12/20 07:35:56 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov * @@ -14,6 +14,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include #include #include "dsp.h" #include "utils.h" @@ -258,18 +259,6 @@ aparams_init(struct aparams *par) par->msb = 0; } -/* - * log the given format/channels/encoding - */ -void -aparams_log(struct aparams *par) -{ - char enc[ENCMAX]; - - aparams_enctostr(par, enc); - log_puts(enc); -} - /* * return true if encoding corresponds to what we store in adata_t */ @@ -348,15 +337,7 @@ resamp_do(struct resamp *p, adata_t *in, adata_t *out, int icnt, int ocnt) * Start conversion. */ #ifdef DEBUG - if (log_level >= 4) { - log_puts("resamp: copying "); - log_puti(ifr); - log_puts(" -> "); - log_putu(ofr); - log_puts(" frames, diff = "); - log_puti(diff); - log_puts("\n"); - } + logx(4, "resamp: copying %d -> %d frames, diff = %d", ifr, ofr, diff); #endif for (;;) { if (diff >= oblksz) { @@ -423,15 +404,11 @@ resamp_do(struct resamp *p, adata_t *in, adata_t *out, int icnt, int ocnt) p->ctx_start = ctx_start; #ifdef DEBUG if (ifr != 0) { - log_puts("resamp_do: "); - log_puti(ifr); - log_puts(": too many input frames\n"); + logx(0, "resamp_do: %d: too many input frames", ifr); panic(); } if (ofr != 0) { - log_puts("resamp_do: "); - log_puti(ofr); - log_puts(": too many output frames\n"); + logx(0, "resamp_do: %d: too many output frames", ofr); panic(); } #endif @@ -488,13 +465,7 @@ resamp_init(struct resamp *p, unsigned int iblksz, p->filt_step = RESAMP_UNIT / p->iblksz; } #ifdef DEBUG - if (log_level >= 3) { - log_puts("resamp: "); - log_putu(iblksz); - log_puts("/"); - log_putu(oblksz); - log_puts("\n"); - } + logx(3, "resamp_init: %u/%u", iblksz, oblksz); #endif } @@ -516,11 +487,7 @@ enc_do(struct conv *p, unsigned char *in, unsigned char *out, int todo) int osnext; #ifdef DEBUG - if (log_level >= 4) { - log_puts("enc: copying "); - log_putu(todo); - log_puts(" frames\n"); - } + logx(4, "enc: copying %u frames", todo); #endif /* * Partially copy structures into local variables, to avoid @@ -574,11 +541,7 @@ enc_sil_do(struct conv *p, unsigned char *out, int todo) int osnext; #ifdef DEBUG - if (log_level >= 4) { - log_puts("enc: silence "); - log_putu(todo); - log_puts(" frames\n"); - } + logx(4, "enc: silence %u frames", todo); #endif /* * Partially copy structures into local variables, to avoid @@ -613,6 +576,10 @@ enc_sil_do(struct conv *p, unsigned char *out, int todo) void enc_init(struct conv *p, struct aparams *par, int nch) { +#ifdef DEBUG + char enc_str[ENCMAX]; +#endif + p->nch = nch; p->bps = par->bps; if (par->msb) { @@ -635,13 +602,8 @@ enc_init(struct conv *p, struct aparams *par, int nch) p->snext = 0; } #ifdef DEBUG - if (log_level >= 3) { - log_puts("enc: "); - aparams_log(par); - log_puts(", "); - log_puti(p->nch); - log_puts(" channels\n"); - } + logx(3, "enc: %s, %d channels", + (aparams_enctostr(par, enc_str), enc_str), p->nch); #endif } @@ -663,11 +625,7 @@ dec_do(struct conv *p, unsigned char *in, unsigned char *out, int todo) adata_t *odata; #ifdef DEBUG - if (log_level >= 4) { - log_puts("dec: copying "); - log_putu(todo); - log_puts(" frames\n"); - } + logx(4, "dec: copying %u frames", todo); #endif /* * Partially copy structures into local variables, to avoid @@ -706,6 +664,10 @@ dec_do(struct conv *p, unsigned char *in, unsigned char *out, int todo) void dec_init(struct conv *p, struct aparams *par, int nch) { +#ifdef DEBUG + char enc_str[ENCMAX]; +#endif + p->bps = par->bps; p->nch = nch; if (par->msb) { @@ -728,13 +690,8 @@ dec_init(struct conv *p, struct aparams *par, int nch) p->snext = 0; } #ifdef DEBUG - if (log_level >= 3) { - log_puts("dec: "); - aparams_log(par); - log_puts(", "); - log_puti(p->nch); - log_puts(" channels\n"); - } + logx(3, "dec: %s, %d channels", + (aparams_enctostr(par, enc_str), enc_str), p->nch); #endif } @@ -748,11 +705,7 @@ cmap_add(struct cmap *p, void *in, void *out, int vol, int todo) int i, j, nch, istart, inext, onext, ostart, y, v; #ifdef DEBUG - if (log_level >= 4) { - log_puts("cmap: adding "); - log_puti(todo); - log_puts(" frames\n"); - } + logx(4, "cmap: adding %d frames", todo); #endif idata = in; odata = out; @@ -794,11 +747,7 @@ cmap_copy(struct cmap *p, void *in, void *out, int vol, int todo) int i, j, nch, istart, inext, onext, ostart, v; #ifdef DEBUG - if (log_level >= 4) { - log_puts("cmap: copying "); - log_puti(todo); - log_puts(" frames\n"); - } + logx(4, "cmap: copying %d frames", todo); #endif idata = in; odata = out; @@ -864,18 +813,7 @@ cmap_init(struct cmap *p, p->inext = imax - isubmax; p->nch = nch; #ifdef DEBUG - if (log_level >= 3) { - log_puts("cmap: nch = "); - log_puti(p->nch); - log_puts(", ostart = "); - log_puti(p->ostart); - log_puts(", onext = "); - log_puti(p->onext); - log_puts(", istart = "); - log_puti(p->istart); - log_puts(", inext = "); - log_puti(p->inext); - log_puts("\n"); - } + logx(3, "%s: nch = %d, ostart = %d, onext = %d, istart = %d, inext = %d", + __func__, p->nch, p->ostart, p->onext, p->istart, p->inext); #endif } diff --git a/usr.bin/sndiod/dsp.h b/usr.bin/sndiod/dsp.h index d4f96a3cb..2a00809e0 100644 --- a/usr.bin/sndiod/dsp.h +++ b/usr.bin/sndiod/dsp.h @@ -1,4 +1,4 @@ -/* $OpenBSD: dsp.h,v 1.14 2024/04/22 11:07:42 ratchov Exp $ */ +/* $OpenBSD: dsp.h,v 1.15 2024/12/20 07:35:56 ratchov Exp $ */ /* * Copyright (c) 2012 Alexandre Ratchov * @@ -111,7 +111,6 @@ struct cmap { extern const int aparams_ctltovol[128]; void aparams_init(struct aparams *); -void aparams_log(struct aparams *); int aparams_strtoenc(struct aparams *, char *); int aparams_enctostr(struct aparams *, char *); int aparams_native(struct aparams *); diff --git a/usr.bin/sndiod/fdpass.c b/usr.bin/sndiod/fdpass.c index d5f7617a2..0a8cd32f8 100644 --- a/usr.bin/sndiod/fdpass.c +++ b/usr.bin/sndiod/fdpass.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fdpass.c,v 1.11 2021/11/01 14:43:25 ratchov Exp $ */ +/* $OpenBSD: fdpass.c,v 1.12 2024/12/20 07:35:56 ratchov Exp $ */ /* * Copyright (c) 2015 Alexandre Ratchov * @@ -69,12 +69,6 @@ struct fdpass { int fd; } *fdpass_peer = NULL; -static void -fdpass_log(struct fdpass *f) -{ - log_puts(f->file->name); -} - static int fdpass_send(struct fdpass *f, int cmd, int num, int mode, int fd) { @@ -107,34 +101,18 @@ fdpass_send(struct fdpass *f, int cmd, int num, int mode, int fd) } n = sendmsg(f->fd, &msg, 0); if (n == -1) { - if (log_level >= 1) { - fdpass_log(f); - log_puts(": sendmsg failed\n"); - } + logx(1, "%s: sendmsg failed", f->file->name); fdpass_close(f); return 0; } if (n != sizeof(struct fdpass_msg)) { - if (log_level >= 1) { - fdpass_log(f); - log_puts(": short write\n"); - } + logx(1, "%s: short write", f->file->name); fdpass_close(f); return 0; } #ifdef DEBUG - if (log_level >= 3) { - fdpass_log(f); - log_puts(": send: cmd = "); - log_puti(cmd); - log_puts(", num = "); - log_puti(num); - log_puts(", mode = "); - log_puti(mode); - log_puts(", fd = "); - log_puti(fd); - log_puts("\n"); - } + logx(3, "%s: send: cmd = %d, num = %d, mode = %d, fd = %d", + f->file->name, cmd, num, mode, fd); #endif if (fd >= 0) close(fd); @@ -163,10 +141,7 @@ fdpass_recv(struct fdpass *f, int *cmd, int *num, int *mode, int *fd) msg.msg_iovlen = 1; n = recvmsg(f->fd, &msg, MSG_WAITALL); if (n == -1 && errno == EMSGSIZE) { - if (log_level >= 1) { - fdpass_log(f); - log_puts(": out of fds\n"); - } + logx(1, "%s: out of fds", f->file->name); /* * ancillary data (ie the fd) is discarded, * retrieve the message @@ -174,26 +149,17 @@ fdpass_recv(struct fdpass *f, int *cmd, int *num, int *mode, int *fd) n = recvmsg(f->fd, &msg, MSG_WAITALL); } if (n == -1) { - if (log_level >= 1) { - fdpass_log(f); - log_puts(": recvmsg failed\n"); - } + logx(1, "%s: recvmsg failed", f->file->name); fdpass_close(f); return 0; } if (n == 0) { - if (log_level >= 3) { - fdpass_log(f); - log_puts(": recvmsg eof\n"); - } + logx(3, "%s: recvmsg eof", f->file->name); fdpass_close(f); return 0; } if (msg.msg_flags & (MSG_TRUNC | MSG_CTRUNC)) { - if (log_level >= 1) { - fdpass_log(f); - log_puts(": truncated\n"); - } + logx(1, "%s: truncated", f->file->name); fdpass_close(f); return 0; } @@ -215,18 +181,8 @@ fdpass_recv(struct fdpass *f, int *cmd, int *num, int *mode, int *fd) *num = data.num; *mode = data.mode; #ifdef DEBUG - if (log_level >= 3) { - fdpass_log(f); - log_puts(": recv: cmd = "); - log_puti(*cmd); - log_puts(", num = "); - log_puti(*num); - log_puts(", mode = "); - log_puti(*mode); - log_puts(", fd = "); - log_puti(*fd); - log_puts("\n"); - } + logx(3, "%s: recv: cmd = %d, num = %d, mode = %d, fd = %d", + f->file->name, *cmd, *num, *mode, *fd); #endif return 1; } @@ -239,10 +195,7 @@ fdpass_waitret(struct fdpass *f, int *retfd) if (!fdpass_recv(fdpass_peer, &cmd, &unused, &unused, retfd)) return 0; if (cmd != FDPASS_RETURN) { - if (log_level >= 1) { - fdpass_log(f); - log_puts(": expected RETURN message\n"); - } + logx(1, "%s: expected RETURN message", f->file->name); fdpass_close(f); return 0; } @@ -302,10 +255,7 @@ fdpass_in_worker(void *arg) { struct fdpass *f = arg; - if (log_level >= 3) { - fdpass_log(f); - log_puts(": exit\n"); - } + logx(3, "%s: exit", f->file->name); fdpass_close(f); return; } @@ -324,10 +274,7 @@ fdpass_in_helper(void *arg) case FDPASS_OPEN_SND: d = dev_bynum(num); if (d == NULL || !(mode & (SIO_PLAY | SIO_REC))) { - if (log_level >= 1) { - fdpass_log(f); - log_puts(": bad audio device or mode\n"); - } + logx(1, "%s: bad audio device or mode", f->file->name); fdpass_close(f); return; } @@ -336,10 +283,7 @@ fdpass_in_helper(void *arg) case FDPASS_OPEN_MIDI: p = port_bynum(num); if (p == NULL || !(mode & (MIO_IN | MIO_OUT))) { - if (log_level >= 1) { - fdpass_log(f); - log_puts(": bad midi port or mode\n"); - } + logx(1, "%s: bad midi port or mode", f->file->name); fdpass_close(f); return; } @@ -348,10 +292,7 @@ fdpass_in_helper(void *arg) case FDPASS_OPEN_CTL: d = dev_bynum(num); if (d == NULL || !(mode & (SIOCTL_READ | SIOCTL_WRITE))) { - if (log_level >= 1) { - fdpass_log(f); - log_puts(": bad audio control device\n"); - } + logx(1, "%s: bad control device", f->file->name); fdpass_close(f); return; } @@ -374,10 +315,7 @@ fdpass_hup(void *arg) { struct fdpass *f = arg; - if (log_level >= 3) { - fdpass_log(f); - log_puts(": hup\n"); - } + logx(3, "%s: hup", f->file->name); fdpass_close(f); } diff --git a/usr.bin/sndiod/file.c b/usr.bin/sndiod/file.c index 64a235741..e86701372 100644 --- a/usr.bin/sndiod/file.c +++ b/usr.bin/sndiod/file.c @@ -1,4 +1,4 @@ -/* $OpenBSD: file.c,v 1.27 2024/07/23 06:34:03 ratchov Exp $ */ +/* $OpenBSD: file.c,v 1.28 2024/12/20 07:35:56 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov * @@ -99,11 +99,11 @@ timo_add(struct timo *o, unsigned int delta) #ifdef DEBUG if (o->set) { - log_puts("timo_add: already set\n"); + logx(0, "timo_add: already set"); panic(); } if (delta == 0) { - log_puts("timo_add: zero timeout is evil\n"); + logx(0, "timo_add: zero timeout is evil"); panic(); } #endif @@ -136,8 +136,7 @@ timo_del(struct timo *o) } } #ifdef DEBUG - if (log_level >= 4) - log_puts("timo_del: not found\n"); + logx(4, "timo_del: not found"); #endif } @@ -194,30 +193,13 @@ timo_done(void) { #ifdef DEBUG if (timo_queue != NULL) { - log_puts("timo_done: timo_queue not empty!\n"); + logx(0, "timo_done: timo_queue not empty!"); panic(); } #endif timo_queue = (struct timo *)0xdeadbeef; } -#ifdef DEBUG -void -file_log(struct file *f) -{ - static char *states[] = { "ini", "zom" }; - - log_puts(f->ops->name); - if (log_level >= 3) { - log_puts("("); - log_puts(f->name); - log_puts("|"); - log_puts(states[f->state]); - log_puts(")"); - } -} -#endif - struct file * file_new(struct fileops *ops, void *arg, char *name, unsigned int nfds) { @@ -225,10 +207,7 @@ file_new(struct fileops *ops, void *arg, char *name, unsigned int nfds) if (file_nfds + nfds > MAXFDS) { #ifdef DEBUG - if (log_level >= 1) { - log_puts(name); - log_puts(": too many polled files\n"); - } + logx(1, "%s: too many polled files", name); #endif return NULL; } @@ -242,10 +221,7 @@ file_new(struct fileops *ops, void *arg, char *name, unsigned int nfds) f->next = file_list; file_list = f; #ifdef DEBUG - if (log_level >= 3) { - file_log(f); - log_puts(": created\n"); - } + logx(3, "%s: created", f->name); #endif file_nfds += f->max_nfds; return f; @@ -256,17 +232,14 @@ file_del(struct file *f) { #ifdef DEBUG if (f->state == FILE_ZOMB) { - log_puts("bad state in file_del()\n"); + logx(0, "%s: %s: bad state in file_del", __func__, f->name); panic(); } #endif file_nfds -= f->max_nfds; f->state = FILE_ZOMB; #ifdef DEBUG - if (log_level >= 3) { - file_log(f); - log_puts(": destroyed\n"); - } + logx(3, "%s: destroyed", f->name); #endif } @@ -303,17 +276,35 @@ file_process(struct file *f, struct pollfd *pfd) clock_gettime(CLOCK_UPTIME, &ts1); us = 1000000L * (ts1.tv_sec - ts0.tv_sec); us += (ts1.tv_nsec - ts0.tv_nsec) / 1000; - if (log_level >= 4 || us >= 5000) { - file_log(f); - log_puts(": processed in "); - log_putu(us); - log_puts("us\n"); - } + if (us >= 5000) + logx(4, "%s: processed in %luus", f->name, us); } #endif return rc; } +#ifdef DEBUG +size_t +filelist_fmt(char *buf, size_t size, struct pollfd *pfd, int ret) +{ + struct file *f; + char *p = buf, *end = buf + size; + const char *sep = ""; + int i; + + for (f = file_list; f != NULL; f = f->next) { + p += snprintf(p, p < end ? end - p : 0, "%s%s:", sep, f->name); + for (i = 0; i < f->nfds; i++) { + p += snprintf(p, p < end ? end - p : 0, " 0x%x", + ret ? pfd->revents : pfd->events); + pfd++; + } + sep = ", "; + } + return p - buf; +} +#endif + int file_poll(void) { @@ -322,7 +313,7 @@ file_poll(void) struct timespec ts; #ifdef DEBUG struct timespec sleepts; - int i; + char str[128]; #endif long long delta_nsec; int nfds, res, timo; @@ -341,8 +332,7 @@ file_poll(void) if (file_list == NULL && timo_queue == NULL) { #ifdef DEBUG - if (log_level >= 3) - log_puts("nothing to do...\n"); + logx(3, "nothing to do..."); #endif return 0; } @@ -358,21 +348,7 @@ file_poll(void) nfds += f->nfds; } #ifdef DEBUG - if (log_level >= 4) { - log_puts("poll:"); - pfd = pfds; - for (f = file_list; f != NULL; f = f->next) { - log_puts(" "); - log_puts(f->ops->name); - log_puts(":"); - for (i = 0; i < f->nfds; i++) { - log_puts(" "); - log_putx(pfd->events); - pfd++; - } - } - log_puts("\n"); - } + logx(4, "poll [%s]", (filelist_fmt(str, sizeof(str), pfds, 0), str)); #endif /* @@ -413,7 +389,7 @@ file_poll(void) res = poll(pfds, nfds, timo); if (res == -1) { if (errno != EINTR) { - log_puts("poll failed"); + logx(0, "poll failed"); panic(); } return 1; @@ -432,10 +408,8 @@ file_poll(void) delta_nsec += ts.tv_nsec - file_ts.tv_nsec; if (delta_nsec >= 0 && delta_nsec < 60000000000LL) timo_update(delta_nsec / 1000); - else { - if (log_level >= 2) - log_puts("out-of-bounds clock delta\n"); - } + else + logx(2, "out-of-bounds clock delta"); } file_ts = ts; @@ -458,7 +432,7 @@ filelist_init(void) sigset_t set; if (clock_gettime(CLOCK_UPTIME, &file_ts) == -1) { - log_puts("filelist_init: CLOCK_UPTIME unsupported\n"); + logx(0, "filelist_init: CLOCK_UPTIME unsupported"); panic(); } sigemptyset(&set); @@ -476,10 +450,8 @@ filelist_done(void) struct file *f; if (file_list != NULL) { - for (f = file_list; f != NULL; f = f->next) { - file_log(f); - log_puts(" not closed\n"); - } + for (f = file_list; f != NULL; f = f->next) + logx(0, "%s: not closed", f->name); panic(); } log_sync = 1; diff --git a/usr.bin/sndiod/file.h b/usr.bin/sndiod/file.h index 631212f22..d5bbd35d2 100644 --- a/usr.bin/sndiod/file.h +++ b/usr.bin/sndiod/file.h @@ -1,4 +1,4 @@ -/* $OpenBSD: file.h,v 1.6 2024/05/19 00:05:43 jsg Exp $ */ +/* $OpenBSD: file.h,v 1.7 2024/12/20 07:35:56 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov * @@ -70,10 +70,10 @@ void timo_del(struct timo *); void filelist_init(void); void filelist_done(void); +size_t filelist_fmt(char *, size_t, struct pollfd *, int); struct file *file_new(struct fileops *, void *, char *, unsigned int); void file_del(struct file *); -void file_log(struct file *); int file_poll(void); diff --git a/usr.bin/sndiod/listen.c b/usr.bin/sndiod/listen.c index 8d50ca60a..c768bcfa3 100644 --- a/usr.bin/sndiod/listen.c +++ b/usr.bin/sndiod/listen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: listen.c,v 1.14 2020/01/23 20:55:01 ratchov Exp $ */ +/* $OpenBSD: listen.c,v 1.15 2024/12/20 07:35:56 ratchov Exp $ */ /* * Copyright (c) 2008 Alexandre Ratchov * @@ -60,7 +60,7 @@ listen_close(struct listen *f) for (pf = &listen_list; *pf != f; pf = &(*pf)->next) { #ifdef DEBUG if (*pf == NULL) { - log_puts("listen_close: not on list\n"); + logx(0, "%s: not on list", __func__); panic(); } #endif @@ -84,13 +84,11 @@ listen_new_un(char *path) sock = socket(AF_UNIX, SOCK_STREAM, 0); if (sock == -1) { - log_puts(path); - log_puts(": failed to create socket\n"); + logx(0, "%s: failed to create socket", path); return 0; } if (unlink(path) == -1 && errno != ENOENT) { - log_puts(path); - log_puts(": failed to unlink socket\n"); + logx(0, "%s: failed to unlink socket", path); goto bad_close; } sockname.sun_family = AF_UNIX; @@ -98,18 +96,16 @@ listen_new_un(char *path) oldumask = umask(0111); if (bind(sock, (struct sockaddr *)&sockname, sizeof(struct sockaddr_un)) == -1) { - log_puts(path); - log_puts(": failed to bind socket\n"); + logx(0, "%s: failed to bind socket", path); goto bad_close; } if (listen(sock, 1) == -1) { - log_puts(path); - log_puts(": failed to listen\n"); + logx(0, "%s: failed to listen", path); goto bad_close; } umask(oldumask); f = xmalloc(sizeof(struct listen)); - f->file = file_new(&listen_fileops, f, path, 1); + f->file = file_new(&listen_fileops, f, "unix", 1); if (f->file == NULL) goto bad_close; f->path = xstrdup(path); @@ -141,8 +137,7 @@ listen_new_tcp(char *addr, unsigned int port) aihints.ai_protocol = IPPROTO_TCP; error = getaddrinfo(host, serv, &aihints, &ailist); if (error) { - log_puts(addr); - log_puts(": failed to resolve address\n"); + logx(0, "%s: failed to resolve address", addr); return 0; } @@ -153,29 +148,25 @@ listen_new_tcp(char *addr, unsigned int port) for (ai = ailist; ai != NULL; ai = ai->ai_next) { s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (s == -1) { - log_puts(addr); - log_puts(": failed to create socket\n"); + logx(0, "%s: failed to create socket", addr); continue; } opt = 1; if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int)) == -1) { - log_puts(addr); - log_puts(": failed to set SO_REUSEADDR\n"); + logx(0, "%s: failed to set SO_REUSEADDR", addr); goto bad_close; } if (bind(s, ai->ai_addr, ai->ai_addrlen) == -1) { - log_puts(addr); - log_puts(": failed to bind socket\n"); + logx(0, "%s: failed to bind socket", addr); goto bad_close; } if (listen(s, 1) == -1) { - log_puts(addr); - log_puts(": failed to listen\n"); + logx(0, "%s: failed to listen", addr); goto bad_close; } f = xmalloc(sizeof(struct listen)); - f->file = file_new(&listen_fileops, f, addr, 1); + f->file = file_new(&listen_fileops, f, "tcp", 1); if (f == NULL) { bad_close: close(s); @@ -237,16 +228,14 @@ listen_in(void *arg) return; } if (fcntl(sock, F_SETFL, O_NONBLOCK) == -1) { - file_log(f->file); - log_puts(": failed to set non-blocking mode\n"); + logx(0, "%s: failed to set non-blocking mode", f->file->name); goto bad_close; } if (f->path == NULL) { opt = 1; if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(int)) == -1) { - file_log(f->file); - log_puts(": failed to set TCP_NODELAY flag\n"); + logx(0, "%s: failed to set TCP_NODELAY flag", f->file->name); goto bad_close; } } diff --git a/usr.bin/sndiod/midi.c b/usr.bin/sndiod/midi.c index f2058f095..cc3be6b5e 100644 --- a/usr.bin/sndiod/midi.c +++ b/usr.bin/sndiod/midi.c @@ -1,4 +1,4 @@ -/* $OpenBSD: midi.c,v 1.31 2024/05/19 00:05:43 jsg Exp $ */ +/* $OpenBSD: midi.c,v 1.32 2024/12/20 07:35:56 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov * @@ -56,11 +56,21 @@ struct midithru { const unsigned int voice_len[] = { 3, 3, 3, 3, 2, 2, 3 }; const unsigned int common_len[] = { 0, 2, 3, 2, 0, 0, 1, 1 }; -void -midi_log(struct midi *ep) +size_t +midiev_fmt(char *buf, size_t size, unsigned char *ev, size_t len) { - log_puts("midi"); - log_putu(ep - midi_ep); + const char *sep = ""; + char *end = buf + size; + char *p = buf; + int i; + + for (i = 0; i < len; i++) { + if (i == 1) + sep = " "; + p += snprintf(p, p < end ? end - p : 0, "%s%02x", sep, ev[i]); + } + + return p - buf; } void @@ -93,6 +103,7 @@ midi_new(struct midiops *ops, void *arg, int mode) ep->st = 0; ep->last_st = 0; ep->txmask = 0; + ep->num = i; ep->self = 1 << i; ep->tickets = 0; ep->mode = mode; @@ -143,8 +154,7 @@ midi_link(struct midi *ep, struct midi *peer) if (ep->mode & MODE_MIDIIN) { #ifdef DEBUG if (ep->obuf.used > 0) { - midi_log(ep); - log_puts(": linked with non-empty buffer\n"); + logx(0, "midi%u: linked with non-empty buffer", ep->num); panic(); } #endif @@ -187,8 +197,7 @@ midi_tag(struct midi *ep, unsigned int tag) if (ep->mode & MODE_MIDIIN) { #ifdef DEBUG if (ep->obuf.used > 0) { - midi_log(ep); - log_puts(": tagged with non-empty buffer\n"); + logx(0, "midi%u: tagged with non-empty buffer", ep->num); panic(); } #endif @@ -230,19 +239,15 @@ midi_tags(struct midi *ep) void midi_send(struct midi *iep, unsigned char *msg, int size) { +#ifdef DEBUG + char str[128]; +#endif struct midi *oep; int i; #ifdef DEBUG - if (log_level >= 4) { - midi_log(iep); - log_puts(": sending:"); - for (i = 0; i < size; i++) { - log_puts(" "); - log_putx(msg[i]); - } - log_puts("\n"); - } + logx(4, "midi%u: sending: %s", iep->num, + (midiev_fmt(str, sizeof(str), msg, size), str)); #endif for (i = 0; i < MIDI_NEP ; i++) { if ((iep->txmask & (1 << i)) == 0) @@ -254,12 +259,7 @@ midi_send(struct midi *iep, unsigned char *msg, int size) } else if (msg[0] <= 0xf7) oep->owner = iep; #ifdef DEBUG - if (log_level >= 4) { - midi_log(iep); - log_puts(" -> "); - midi_log(oep); - log_puts("\n"); - } + logx(4, "midi%u -> midi%u", iep->num, oep->num); #endif oep->ops->omsg(oep->arg, msg, size); } @@ -392,21 +392,17 @@ midi_in(struct midi *iep, unsigned char *idata, int icount) void midi_out(struct midi *oep, unsigned char *idata, int icount) { +#ifdef DEBUG + char str[128]; +#endif unsigned char *odata; int ocount; -#ifdef DEBUG - int i; -#endif while (icount > 0) { if (oep->obuf.used == oep->obuf.len) { #ifdef DEBUG - if (log_level >= 2) { - midi_log(oep); - log_puts(": too slow, discarding "); - log_putu(oep->obuf.used); - log_puts(" bytes\n"); - } + logx(2, "midi%u: too slow, discarding %d bytes", + oep->num, oep->obuf.used); #endif abuf_rdiscard(&oep->obuf, oep->obuf.used); oep->owner = NULL; @@ -417,15 +413,8 @@ midi_out(struct midi *oep, unsigned char *idata, int icount) ocount = icount; memcpy(odata, idata, ocount); #ifdef DEBUG - if (log_level >= 4) { - midi_log(oep); - log_puts(": out: "); - for (i = 0; i < ocount; i++) { - log_puts(" "); - log_putx(odata[i]); - } - log_puts("\n"); - } + logx(4, "midi%u: out: %s", oep->num, + (midiev_fmt(str, sizeof(str), odata, ocount), str)); #endif abuf_wcommit(&oep->obuf, ocount); icount -= ocount; @@ -488,12 +477,6 @@ midi_migrate(struct midi *oep, struct midi *nep) } } -void -port_log(struct port *p) -{ - midi_log(p->midi); -} - void port_imsg(void *arg, unsigned char *msg, int size) { @@ -523,11 +506,8 @@ port_exit(void *arg) #ifdef DEBUG struct port *p = arg; - if (log_level >= 3) { - port_log(p); - log_puts(": port exit\n"); - panic(); - } + logx(0, "midi%u: port exit", p->midi->num); + panic(); #endif } @@ -565,7 +545,7 @@ port_del(struct port *c) for (p = &port_list; *p != c; p = &(*p)->next) { #ifdef DEBUG if (*p == NULL) { - log_puts("port to delete not on list\n"); + logx(0, "port to delete not on list"); panic(); } #endif @@ -578,10 +558,7 @@ int port_ref(struct port *c) { #ifdef DEBUG - if (log_level >= 3) { - port_log(c); - log_puts(": port requested\n"); - } + logx(3, "midi%u: port requested", c->midi->num); #endif if (c->state == PORT_CFG && !port_open(c)) return 0; @@ -594,10 +571,7 @@ port_unref(struct port *c) int i, rxmask; #ifdef DEBUG - if (log_level >= 3) { - port_log(c); - log_puts(": port released\n"); - } + logx(3, "midi%u: port released", c->midi->num); #endif for (rxmask = 0, i = 0; i < MIDI_NEP; i++) rxmask |= midi_ep[i].txmask; @@ -645,10 +619,7 @@ port_migrate(struct port *op) /* try next one, circulating through the list */ np = np->alt_next; if (np == op) { - if (log_level >= 2) { - port_log(op); - log_puts(": no fall-back port found\n"); - } + logx(2, "midi%u: no fall-back port found", op->midi->num); return op; } @@ -656,12 +627,7 @@ port_migrate(struct port *op) break; } - if (log_level >= 2) { - port_log(op); - log_puts(": switching to "); - port_log(np); - log_puts("\n"); - } + logx(2, "midi%u: switching to midi%u", op->midi->num, np->midi->num); midi_migrate(op->midi, np->midi); return np; @@ -683,10 +649,7 @@ int port_open(struct port *c) { if (!port_mio_open(c)) { - if (log_level >= 1) { - port_log(c); - log_puts(": failed to open midi port\n"); - } + logx(1, "midi%u: failed to open midi port", c->midi->num); return 0; } c->state = PORT_INIT; @@ -698,13 +661,11 @@ port_close(struct port *c) { #ifdef DEBUG if (c->state == PORT_CFG) { - port_log(c); - log_puts(": can't close port (not opened)\n"); + logx(0, "midi%u: can't close port (not opened)", c->midi->num); panic(); } #endif - port_log(c); - log_puts(": closed\n"); + logx(2, "midi%u: closed", c->midi->num); c->state = PORT_CFG; port_mio_close(c); return 1; @@ -720,10 +681,7 @@ port_drain(struct port *c) else { c->state = PORT_DRAIN; #ifdef DEBUG - if (log_level >= 3) { - port_log(c); - log_puts(": draining\n"); - } + logx(3, "midi%u: draining", c->midi->num); #endif } } diff --git a/usr.bin/sndiod/midi.h b/usr.bin/sndiod/midi.h index 7872f5b7f..7654ca333 100644 --- a/usr.bin/sndiod/midi.h +++ b/usr.bin/sndiod/midi.h @@ -1,4 +1,4 @@ -/* $OpenBSD: midi.h,v 1.16 2024/05/03 05:18:09 ratchov Exp $ */ +/* $OpenBSD: midi.h,v 1.17 2024/12/20 07:35:56 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov * @@ -73,7 +73,8 @@ struct midi { unsigned int idx; /* current ``msg'' size */ unsigned int len; /* expected ``msg'' length */ unsigned int txmask; /* list of ep we send to */ - unsigned int self; /* equal (1 << index) */ + unsigned int num; /* index in the midi_ep array */ + unsigned int self; /* equal (1 << num) */ int tickets; /* max bytes we can process */ struct abuf obuf; /* output buffer */ }; @@ -96,7 +97,7 @@ struct port { }; /* - * midi control ports + * midi ports */ extern struct port *port_list; @@ -104,7 +105,7 @@ void midi_init(void); void midi_done(void); struct midi *midi_new(struct midiops *, void *, int); void midi_del(struct midi *); -void midi_log(struct midi *); +size_t midiev_fmt(char *, size_t, unsigned char *, size_t); void midi_tickets(struct midi *); void midi_in(struct midi *, unsigned char *, int); void midi_out(struct midi *, unsigned char *, int); @@ -117,7 +118,6 @@ void midi_link(struct midi *, struct midi *); void midi_abort(struct midi *); void midi_migrate(struct midi *, struct midi *); -void port_log(struct port *); struct port *port_new(char *, unsigned int, int); struct port *port_bynum(int); void port_del(struct port *); diff --git a/usr.bin/sndiod/opt.c b/usr.bin/sndiod/opt.c index 1c7d7ce7c..a7e35f9be 100644 --- a/usr.bin/sndiod/opt.c +++ b/usr.bin/sndiod/opt.c @@ -1,4 +1,4 @@ -/* $OpenBSD: opt.c,v 1.12 2024/05/24 15:21:35 ratchov Exp $ */ +/* $OpenBSD: opt.c,v 1.13 2024/12/20 07:35:56 ratchov Exp $ */ /* * Copyright (c) 2008-2011 Alexandre Ratchov * @@ -42,8 +42,7 @@ opt_midi_imsg(void *arg, unsigned char *msg, int len) #ifdef DEBUG struct opt *o = arg; - log_puts(o->name); - log_puts(": can't receive midi messages\n"); + logx(0, "%s: can't receive midi messages", o->name); panic(); #endif } @@ -91,10 +90,7 @@ opt_midi_omsg(void *arg, unsigned char *msg, int len) if (o->mtc == NULL) return; mtc_setdev(o->mtc, o->dev); - if (log_level >= 2) { - log_puts(o->name); - log_puts(": mmc stop\n"); - } + logx(2, "%s: mmc stop", o->name); mtc_stop(o->mtc); break; case SYSEX_MMC_START: @@ -103,10 +99,7 @@ opt_midi_omsg(void *arg, unsigned char *msg, int len) if (o->mtc == NULL) return; mtc_setdev(o->mtc, o->dev); - if (log_level >= 2) { - log_puts(o->name); - log_puts(": mmc start\n"); - } + logx(2, "%s: mmc start", o->name); mtc_start(o->mtc); break; case SYSEX_MMC_LOC: @@ -160,11 +153,7 @@ opt_midi_exit(void *arg) { struct opt *o = arg; - if (log_level >= 1) { - log_puts(o->name); - log_puts(": midi end point died\n"); - panic(); - } + logx(1, "%s: midi end point died", o->name); } /* @@ -177,6 +166,7 @@ opt_new(struct dev *d, char *name, { struct dev *a; struct opt *o, **po; + char str[64]; unsigned int len, num; char c; @@ -186,15 +176,13 @@ opt_new(struct dev *d, char *name, } else { for (len = 0; name[len] != '\0'; len++) { if (len == OPT_NAMEMAX) { - log_puts(name); - log_puts(": too long\n"); + logx(0, "%s: too long", name); return NULL; } c = name[len]; if ((c < 'a' || c > 'z') && (c < 'A' || c > 'Z')) { - log_puts(name); - log_puts(": only alphabetic chars allowed\n"); + logx(0, "%s: only alphabetic chars allowed", name); return NULL; } } @@ -203,28 +191,22 @@ opt_new(struct dev *d, char *name, for (po = &opt_list; *po != NULL; po = &(*po)->next) num++; if (num >= OPT_NMAX) { - log_puts(name); - log_puts(": too many opts\n"); + logx(0, "%s: too many opts", name); return NULL; } if (opt_byname(name)) { - log_puts(name); - log_puts(": already defined\n"); + logx(1, "%s: already defined", name); return NULL; } if (mmc) { if (mtc_array[0].dev != NULL && mtc_array[0].dev != d) { - log_puts(name); - log_puts(": MTC already setup for another device\n"); + logx(0, "%s: MTC already setup for another device", name); return NULL; } mtc_array[0].dev = d; - if (log_level >= 2) { - dev_log(d); - log_puts(": initial MTC source, controlled by MMC\n"); - } + logx(2, "%s: initial MTC source, controlled by MMC", d->path); } if (strcmp(d->name, name) == 0) @@ -265,39 +247,11 @@ opt_new(struct dev *d, char *name, memcpy(o->name, name, len + 1); o->next = *po; *po = o; - if (log_level >= 2) { - dev_log(d); - log_puts("."); - log_puts(o->name); - log_puts(":"); - if (o->mode & MODE_REC) { - log_puts(" rec="); - log_putu(o->rmin); - log_puts(":"); - log_putu(o->rmax); - } - if (o->mode & MODE_PLAY) { - log_puts(" play="); - log_putu(o->pmin); - log_puts(":"); - log_putu(o->pmax); - log_puts(" vol="); - log_putu(o->maxweight); - } - if (o->mode & MODE_MON) { - log_puts(" mon="); - log_putu(o->rmin); - log_puts(":"); - log_putu(o->rmax); - } - if (o->mode & (MODE_RECMASK | MODE_PLAY)) { - if (o->mtc) - log_puts(" mtc"); - if (o->dup) - log_puts(" dup"); - } - log_puts("\n"); - } + + logx(2, "%s: %s%s, vol = %d", o->name, (chans_fmt(str, sizeof(str), + o->mode, o->pmin, o->pmax, o->rmin, o->rmax), str), + (o->dup) ? ", dup" : "", o->maxweight); + return o; } @@ -333,7 +287,7 @@ opt_del(struct opt *o) for (po = &opt_list; *po != o; po = &(*po)->next) { #ifdef DEBUG if (*po == NULL) { - log_puts("opt_del: not on list\n"); + logx(0, "%s: not on list", __func__); panic(); } #endif @@ -355,8 +309,7 @@ opt_done(struct opt *o) if (o->refcnt != 0) { // XXX: all clients are already kicked, so this never happens - log_puts(o->name); - log_puts(": still has refs\n"); + logx(0, "%s: still has refs", o->name); } for (d = dev_list; d != NULL; d = d->next) ctl_del(CTL_OPT_DEV, o, d); diff --git a/usr.bin/sndiod/siofile.c b/usr.bin/sndiod/siofile.c index 1cfaa1837..a4e33ccb7 100644 --- a/usr.bin/sndiod/siofile.c +++ b/usr.bin/sndiod/siofile.c @@ -1,4 +1,4 @@ -/* $OpenBSD: siofile.c,v 1.27 2024/04/02 05:32:10 ratchov Exp $ */ +/* $OpenBSD: siofile.c,v 1.28 2024/12/20 07:35:56 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov * @@ -59,12 +59,8 @@ dev_sio_onmove(void *arg, int delta) struct dev *d = arg; #ifdef DEBUG - if (log_level >= 4) { - dev_log(d); - log_puts(": tick, delta = "); - log_puti(delta); - log_puts("\n"); - } + logx(4, "%s: tick, delta = %d", d->path, delta); + d->sio.sum_utime += file_utime - d->sio.utime; d->sio.sum_wtime += file_wtime - d->sio.wtime; d->sio.wtime = file_wtime; @@ -82,8 +78,7 @@ dev_sio_timeout(void *arg) { struct dev *d = arg; - dev_log(d); - log_puts(": watchdog timeout\n"); + logx(1, "%s: watchdog timeout", d->path); dev_migrate(d); dev_abort(d); } @@ -111,21 +106,14 @@ dev_sio_open(struct dev *d) else return 0; } - if (log_level >= 1) { - log_puts("warning, device opened in "); - log_puts(mode == SIO_PLAY ? "play-only" : "rec-only"); - log_puts(" mode\n"); - } + logx(1, "%s: warning, device opened in %s mode", + d->path, mode == SIO_PLAY ? "play-only" : "rec-only"); } d->mode = mode; d->sioctl.hdl = fdpass_sioctl_open(d->num, SIOCTL_READ | SIOCTL_WRITE); - if (d->sioctl.hdl == NULL) { - if (log_level >= 1) { - dev_log(d); - log_puts(": no control device\n"); - } - } + if (d->sioctl.hdl == NULL) + logx(1, "%s: no control device", d->path); sio_initpar(&par); par.bits = d->par.bits; @@ -181,53 +169,32 @@ dev_sio_open(struct dev *d) */ if (par.bits > BITS_MAX) { - dev_log(d); - log_puts(": "); - log_putu(par.bits); - log_puts(": unsupported number of bits\n"); + logx(0, "%s: %u: unsupported number of bits", d->path, par.bits); goto bad_close; } if (par.bps > SIO_BPS(BITS_MAX)) { - dev_log(d); - log_puts(": "); - log_putu(par.bps); - log_puts(": unsupported sample size\n"); + logx(0, "%s: %u: unsupported sample size", d->path, par.bps); goto bad_close; } if ((d->mode & SIO_PLAY) && par.pchan > NCHAN_MAX) { - dev_log(d); - log_puts(": "); - log_putu(par.pchan); - log_puts(": unsupported number of play channels\n"); + logx(0, "%s: %u: unsupported number of play channels", d->path, par.pchan); goto bad_close; } if ((d->mode & SIO_REC) && par.rchan > NCHAN_MAX) { - dev_log(d); - log_puts(": "); - log_putu(par.rchan); - log_puts(": unsupported number of rec channels\n"); + logx(0, "%s: %u: unsupported number of rec channels", d->path, par.rchan); goto bad_close; } if (par.bufsz == 0 || par.bufsz > RATE_MAX) { - dev_log(d); - log_puts(": "); - log_putu(par.bufsz); - log_puts(": unsupported buffer size\n"); + logx(0, "%s: %u: unsupported buffer size", d->path, par.bufsz); goto bad_close; } if (par.round == 0 || par.round > par.bufsz || par.bufsz % par.round != 0) { - dev_log(d); - log_puts(": "); - log_putu(par.round); - log_puts(": unsupported block size\n"); + logx(0, "%s: %u: unsupported block size", d->path, par.round); goto bad_close; } if (par.rate == 0 || par.rate > RATE_MAX) { - dev_log(d); - log_puts(": "); - log_putu(par.rate); - log_puts(": unsupported rate\n"); + logx(0, "%s: %u: unsupported rate", d->path, par.rate); goto bad_close; } #endif @@ -268,10 +235,7 @@ dev_sio_close(struct dev *d) { dev_sioctl_close(d); #ifdef DEBUG - if (log_level >= 3) { - dev_log(d); - log_puts(": closed\n"); - } + logx(3, "%s: closed", d->path); #endif timo_del(&d->sio.watchdog); file_del(d->sio.file); @@ -287,10 +251,7 @@ void dev_sio_start(struct dev *d) { if (!sio_start(d->sio.hdl)) { - if (log_level >= 1) { - dev_log(d); - log_puts(": failed to start device\n"); - } + logx(1, "%s: failed to start device", d->path); return; } if (d->mode & MODE_PLAY) { @@ -307,10 +268,7 @@ dev_sio_start(struct dev *d) d->sio.sum_wtime = 0; d->sio.wtime = file_wtime; d->sio.utime = file_utime; - if (log_level >= 3) { - dev_log(d); - log_puts(": started\n"); - } + logx(3, "%s: started", d->path); #endif timo_add(&d->sio.watchdog, WATCHDOG_USEC); } @@ -319,21 +277,12 @@ void dev_sio_stop(struct dev *d) { if (!sio_eof(d->sio.hdl) && !sio_flush(d->sio.hdl)) { - if (log_level >= 1) { - dev_log(d); - log_puts(": failed to stop device\n"); - } + logx(1, "%s: failed to stop device", d->path); return; } #ifdef DEBUG - if (log_level >= 3) { - dev_log(d); - log_puts(": stopped, load avg = "); - log_puti(d->sio.sum_utime / 1000); - log_puts(" / "); - log_puti(d->sio.sum_wtime / 1000); - log_puts("\n"); - } + logx(3, "%s: stopped, load avg = %lld / %lld", + d->path, d->sio.sum_utime / 1000, d->sio.sum_wtime / 1000); #endif timo_del(&d->sio.watchdog); } @@ -381,18 +330,15 @@ dev_sio_run(void *arg) case DEV_SIO_READ: #ifdef DEBUG if (!(d->sio.events & POLLIN)) { - dev_log(d); - log_puts(": recording, but POLLIN not set\n"); + logx(0, "%s: recording, but POLLIN not set", d->path); panic(); } if (d->sio.todo == 0) { - dev_log(d); - log_puts(": can't read data\n"); + logx(0, "%s: can't read data", d->path); panic(); } if (d->prime > 0) { - dev_log(d); - log_puts(": unexpected data\n"); + logx(0, "%s: unexpected data", d->path); panic(); } #endif @@ -403,39 +349,16 @@ dev_sio_run(void *arg) n = sio_read(d->sio.hdl, data, d->sio.todo); d->sio.todo -= n; #ifdef DEBUG - if (log_level >= 4) { - dev_log(d); - log_puts(": read "); - log_putu(n); - log_puts(": bytes, todo "); - log_putu(d->sio.todo); - log_puts("/"); - log_putu(d->round * d->rchan * d->par.bps); - log_puts("\n"); - } + logx(4, "%s: read %u bytes, todo %u / %u", d->path, + n, d->sio.todo, d->round * d->rchan * d->par.bps); #endif if (d->sio.todo > 0) return; #ifdef DEBUG d->sio.rused -= d->round; - if (log_level >= 2) { - if (d->sio.rused >= d->round) { - dev_log(d); - log_puts(": rec hw xrun, rused = "); - log_puti(d->sio.rused); - log_puts("/"); - log_puti(d->bufsz); - log_puts("\n"); - } - if (d->sio.rused < 0 || - d->sio.rused >= d->bufsz) { - dev_log(d); - log_puts(": out of bounds rused = "); - log_puti(d->sio.rused); - log_puts("/"); - log_puti(d->bufsz); - log_puts("\n"); - } + if (d->sio.rused >= d->round) { + logx(2, "%s: rec hw xrun, rused = %d / %d", + d->path, d->sio.rused, d->bufsz); } #endif d->sio.cstate = DEV_SIO_CYCLE; @@ -452,8 +375,7 @@ dev_sio_run(void *arg) */ if (!((d->mode & MODE_REC) && d->prime == 0) && !(d->sio.events & POLLOUT)) { - dev_log(d); - log_puts(": cycle not at block boundary\n"); + logx(0, "%s: cycle not at block boundary", d->path); panic(); } #endif @@ -470,8 +392,7 @@ dev_sio_run(void *arg) case DEV_SIO_WRITE: #ifdef DEBUG if (d->sio.todo == 0) { - dev_log(d); - log_puts(": can't write data\n"); + logx(0, "%s: can't write data", d->path); panic(); } #endif @@ -482,41 +403,23 @@ dev_sio_run(void *arg) n = sio_write(d->sio.hdl, data, d->sio.todo); d->sio.todo -= n; #ifdef DEBUG - if (log_level >= 4) { - dev_log(d); - log_puts(": wrote "); - log_putu(n); - log_puts(" bytes, todo "); - log_putu(d->sio.todo); - log_puts("/"); - log_putu(d->round * d->pchan * d->par.bps); - log_puts("\n"); - } + logx(4, "%s: wrote %u bytes, todo %u / %u", + d->path, n, d->sio.todo, d->round * d->pchan * d->par.bps); #endif if (d->sio.todo > 0) return; #ifdef DEBUG d->sio.pused += d->round; - if (log_level >= 2) { - if (d->prime == 0 && - d->sio.pused <= d->bufsz - d->round) { - dev_log(d); - log_puts(": play hw xrun, pused = "); - log_puti(d->sio.pused); - log_puts("/"); - log_puti(d->bufsz); - log_puts("\n"); - } - if (d->sio.pused < 0 || - d->sio.pused > d->bufsz) { - /* device driver or libsndio bug */ - dev_log(d); - log_puts(": out of bounds pused = "); - log_puti(d->sio.pused); - log_puts("/"); - log_puti(d->bufsz); - log_puts("\n"); - } + if (d->prime == 0 && + d->sio.pused <= d->bufsz - d->round) { + logx(2, "%s: play hw xrun, pused = %d / %d", + d->path, d->sio.pused, d->bufsz); + } + if (d->sio.pused < 0 || + d->sio.pused > d->bufsz) { + /* device driver or libsndio bug */ + logx(2, "%s: out of bounds pused = %d / %d", + d->path, d->sio.pused, d->bufsz); } #endif d->poffs += d->round; @@ -538,10 +441,7 @@ dev_sio_hup(void *arg) struct dev *d = arg; #ifdef DEBUG - if (log_level >= 2) { - dev_log(d); - log_puts(": disconnected\n"); - } + logx(2, "%s: disconnected", d->path); #endif dev_migrate(d); dev_abort(d); diff --git a/usr.bin/sndiod/sndiod.c b/usr.bin/sndiod/sndiod.c index 9b138b710..44218d482 100644 --- a/usr.bin/sndiod/sndiod.c +++ b/usr.bin/sndiod/sndiod.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sndiod.c,v 1.49 2024/05/03 05:18:09 ratchov Exp $ */ +/* $OpenBSD: sndiod.c,v 1.50 2024/12/20 07:35:56 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov * @@ -489,7 +489,7 @@ start_helper(int background) } pid = fork(); if (pid == -1) { - log_puts("can't fork\n"); + perror("fork"); return 0; } if (pid == 0) { diff --git a/usr.bin/sndiod/sock.c b/usr.bin/sndiod/sock.c index 6402fabda..059df107c 100644 --- a/usr.bin/sndiod/sock.c +++ b/usr.bin/sndiod/sock.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sock.c,v 1.51 2024/08/25 05:43:36 jsg Exp $ */ +/* $OpenBSD: sock.c,v 1.53 2024/12/21 08:57:18 ratchov Exp $ */ /* * Copyright (c) 2008-2012 Alexandre Ratchov * @@ -35,7 +35,6 @@ #define SOCK_CTLDESC_SIZE 0x800 /* size of s->ctldesc */ -void sock_log(struct sock *); void sock_close(struct sock *); void sock_slot_fill(void *); void sock_slot_flush(void *); @@ -143,32 +142,6 @@ ctlgroup(struct sock *f, struct ctl *c) return c->group; } -void -sock_log(struct sock *f) -{ -#ifdef DEBUG - static char *rstates[] = { "ridl", "rmsg", "rdat", "rret" }; - static char *wstates[] = { "widl", "wmsg", "wdat" }; -#endif - if (f->slot) - slot_log(f->slot); - else if (f->midi) - midi_log(f->midi); - else if (f->ctlslot) { - log_puts("ctlslot"); - log_putu(f->ctlslot - ctlslot_array); - } else - log_puts("sock"); -#ifdef DEBUG - if (log_level >= 3) { - log_puts(","); - log_puts(rstates[f->rstate]); - log_puts(","); - log_puts(wstates[f->wstate]); - } -#endif -} - void sock_close(struct sock *f) { @@ -179,7 +152,7 @@ sock_close(struct sock *f) for (pf = &sock_list; *pf != f; pf = &(*pf)->next) { #ifdef DEBUG if (*pf == NULL) { - log_puts("sock_close: not on list\n"); + logx(0, "%s: not on list", __func__); panic(); } #endif @@ -187,10 +160,7 @@ sock_close(struct sock *f) *pf = f->next; #ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": closing\n"); - } + logx(3, "sock %d: closing", f->fd); #endif if (f->pstate > SOCK_AUTH) sock_sesrefs -= f->sesrefs; @@ -230,14 +200,8 @@ sock_slot_fill(void *arg) f->fillpending += s->round; #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": fill, rmax -> "); - log_puti(f->rmax); - log_puts(", pending -> "); - log_puti(f->fillpending); - log_puts("\n"); - } + logx(4, "%s%u: fill, rmax -> %d, pending -> %d", + s->name, s->unit, f->rmax, f->fillpending); #endif } @@ -249,12 +213,7 @@ sock_slot_flush(void *arg) f->wmax += s->round * s->sub.bpf; #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": flush, wmax -> "); - log_puti(f->wmax); - log_puts("\n"); - } + logx(4, "%s%u: flush, wmax -> %d", s->name, s->unit, f->wmax); #endif } @@ -262,12 +221,10 @@ void sock_slot_eof(void *arg) { struct sock *f = arg; - #ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": stopped\n"); - } + struct slot *s = f->slot; + + logx(3, "%s%u: eof", s->name, s->unit); #endif f->stoppending = 1; } @@ -279,12 +236,7 @@ sock_slot_onmove(void *arg) struct slot *s = f->slot; #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": onmove: delta -> "); - log_puti(s->delta); - log_puts("\n"); - } + logx(4, "%s%u: onmove: delta -> %d", s->name, s->unit, s->delta); #endif if (s->pstate != SOCK_START) return; @@ -298,12 +250,7 @@ sock_slot_onvol(void *arg) struct slot *s = f->slot; #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": onvol: vol -> "); - log_puti(s->vol); - log_puts("\n"); - } + logx(4, "%s%u: onvol: vol -> %d", s->name, s->unit, s->vol); #endif if (s->pstate != SOCK_START) return; @@ -381,10 +328,7 @@ sock_exit(void *arg) struct sock *f = (struct sock *)arg; #ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": exit\n"); - } + logx(3, "sock %d: exit", f->fd); #endif sock_close(f); } @@ -401,24 +345,16 @@ sock_fdwrite(struct sock *f, void *data, int count) if (n == -1) { #ifdef DEBUG if (errno == EFAULT) { - log_puts("sock_fdwrite: fault\n"); + logx(0, "%s: fault", __func__); panic(); } #endif if (errno != EAGAIN) { - if (log_level >= 1) { - sock_log(f); - log_puts(": write filed, errno = "); - log_puti(errno); - log_puts("\n"); - } + logx(1, "sock %d: write failed, errno = %d", f->fd, errno); sock_close(f); } else { #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": write blocked\n"); - } + logx(4, "sock %d: write blocked", f->fd); #endif } return 0; @@ -442,24 +378,16 @@ sock_fdread(struct sock *f, void *data, int count) if (n == -1) { #ifdef DEBUG if (errno == EFAULT) { - log_puts("sock_fdread: fault\n"); + logx(0, "%s: fault", __func__); panic(); } #endif if (errno != EAGAIN) { - if (log_level >= 1) { - sock_log(f); - log_puts(": read failed, errno = "); - log_puti(errno); - log_puts("\n"); - } + logx(1, "sock %d: read failed, errno = %d", f->fd, errno); sock_close(f); } else { #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": read blocked\n"); - } + logx(4, "sock %d: read blocked", f->fd); #endif } return 0; @@ -482,8 +410,7 @@ sock_rmsg(struct sock *f) #ifdef DEBUG if (f->rtodo == 0) { - sock_log(f); - log_puts(": sock_rmsg: nothing to read\n"); + logx(0, "%s: sock %d: nothing to read", __func__, f->fd); panic(); } #endif @@ -497,10 +424,7 @@ sock_rmsg(struct sock *f) } f->rtodo = 0; #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": read full message\n"); - } + logx(4, "sock %d: read full message", f->fd); #endif return 1; } @@ -516,8 +440,8 @@ sock_wmsg(struct sock *f) #ifdef DEBUG if (f->wtodo == 0) { - sock_log(f); - log_puts(": sock_wmsg: already written\n"); + logx(0, "%s: sock %d: already written", __func__, f->fd); + /* XXX: this is fatal and we should exit here */ } #endif data = (char *)&f->wmsg + sizeof(struct amsg) - f->wtodo; @@ -530,10 +454,7 @@ sock_wmsg(struct sock *f) } f->wtodo = 0; #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": wrote full message\n"); - } + logx(4, "sock %d: wrote full message", f->fd); #endif return 1; } @@ -550,8 +471,7 @@ sock_rdata(struct sock *f) #ifdef DEBUG if (f->rtodo == 0) { - sock_log(f); - log_puts(": data block already read\n"); + logx(0, "%s: sock %d: data block already read", __func__, f->fd); panic(); } #endif @@ -574,10 +494,7 @@ sock_rdata(struct sock *f) midi_in(f->midi, midibuf, n); } #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": read complete block\n"); - } + logx(4, "sock %d: read complete block", f->fd); #endif if (f->slot) slot_write(f->slot); @@ -596,8 +513,7 @@ sock_wdata(struct sock *f) #ifdef DEBUG if (f->wtodo == 0) { - sock_log(f); - log_puts(": attempted to write zero-sized data block\n"); + logx(0, "%s: sock %d: zero-sized data block", __func__, f->fd); panic(); } #endif @@ -609,10 +525,7 @@ sock_wdata(struct sock *f) f->wtodo -= n; } #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": zero-filled remaining block\n"); - } + logx(4, "sock %d: zero-filled remaining block", f->fd); #endif return 1; } @@ -645,10 +558,7 @@ sock_wdata(struct sock *f) if (f->midi) midi_fill(f->midi); #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": wrote complete block\n"); - } + logx(4, "sock %d: wrote complete block", f->fd); #endif return 1; } @@ -671,24 +581,15 @@ sock_setpar(struct sock *f) if (AMSG_ISSET(p->bits)) { if (p->bits < BITS_MIN || p->bits > BITS_MAX) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": "); - log_putu(p->bits); - log_puts(": bits out of bounds\n"); - } + logx(1, "sock %d: %d: bits out of bounds", f->fd, p->bits); #endif return 0; } if (AMSG_ISSET(p->bps)) { if (p->bps < ((p->bits + 7) / 8) || p->bps > 4) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": "); - log_putu(p->bps); - log_puts(": wrong bytes per sample\n"); - } + logx(1, "sock %d: %d: wrong bytes per sample", + f->fd, p->bps); #endif return 0; } @@ -709,20 +610,6 @@ sock_setpar(struct sock *f) else if (rchan > NCHAN_MAX) rchan = NCHAN_MAX; s->sub.nch = rchan; -#ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": recording channels "); - log_putu(s->opt->rmin); - log_puts(":"); - log_putu(s->opt->rmax); - log_puts(" -> "); - log_putu(s->opt->rmin); - log_puts(":"); - log_putu(s->opt->rmin + s->sub.nch - 1); - log_puts("\n"); - } -#endif } if (AMSG_ISSET(pchan) && (s->mode & MODE_PLAY)) { if (pchan < 1) @@ -730,20 +617,6 @@ sock_setpar(struct sock *f) else if (pchan > NCHAN_MAX) pchan = NCHAN_MAX; s->mix.nch = pchan; -#ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": playback channels "); - log_putu(s->opt->pmin); - log_puts(":"); - log_putu(s->opt->pmin + s->mix.nch - 1); - log_puts(" -> "); - log_putu(s->opt->pmin); - log_puts(":"); - log_putu(s->opt->pmax); - log_puts("\n"); - } -#endif } if (AMSG_ISSET(rate)) { if (rate < RATE_MIN) @@ -752,53 +625,21 @@ sock_setpar(struct sock *f) rate = RATE_MAX; s->round = dev_roundof(d, rate); s->rate = rate; - if (!AMSG_ISSET(appbufsz)) { + if (!AMSG_ISSET(appbufsz)) appbufsz = d->bufsz / d->round * s->round; -#ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": "); - log_putu(appbufsz); - log_puts(" frame buffer\n"); - } -#endif - } -#ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": "); - log_putu(rate); - log_puts("Hz sample rate, "); - log_putu(s->round); - log_puts(" frame blocks\n"); - } -#endif } if (AMSG_ISSET(p->xrun)) { if (p->xrun != XRUN_IGNORE && p->xrun != XRUN_SYNC && p->xrun != XRUN_ERROR) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": "); - log_putx(p->xrun); - log_puts(": bad xrun policy\n"); - } + logx(1, "sock %d: %u: bad xrun policy", f->fd, p->xrun); #endif return 0; } s->xrun = p->xrun; if (s->opt->mtc != NULL && s->xrun == XRUN_IGNORE) s->xrun = XRUN_SYNC; -#ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": 0x"); - log_putx(s->xrun); - log_puts(" xrun policy\n"); - } -#endif } if (AMSG_ISSET(appbufsz)) { rate = s->rate; @@ -813,14 +654,6 @@ sock_setpar(struct sock *f) if (appbufsz > max) appbufsz = max; s->appbufsz = appbufsz; -#ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": "); - log_putu(s->appbufsz); - log_puts(" frame buffer\n"); - } -#endif } return 1; } @@ -866,24 +699,11 @@ sock_hello(struct sock *f) mode = ntohs(p->mode); id = ntohl(p->id); #ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": hello from <"); - log_puts(p->who); - log_puts(">, mode = "); - log_putx(mode); - log_puts(", ver "); - log_putu(p->version); - log_puts("\n"); - } + logx(3, "sock %d: hello from <%s>, mode %x, ver %d", + f->fd, p->who, mode, p->version); #endif if (p->version != AMSG_VERSION) { - if (log_level >= 1) { - sock_log(f); - log_puts(": "); - log_putu(p->version); - log_puts(": unsupported protocol version\n"); - } + logx(1, "sock %d: %u: unsupported version", f->fd, p->version); return 0; } switch (mode) { @@ -899,12 +719,7 @@ sock_hello(struct sock *f) break; default: #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": "); - log_putx(mode); - log_puts(": unsupported mode\n"); - } + logx(1, "sock %d: %u: unsupported mode", f->fd, mode); #endif return 0; } @@ -954,10 +769,7 @@ sock_hello(struct sock *f) } f->ctlslot = ctlslot_new(opt, &sock_ctlops, f); if (f->ctlslot == NULL) { - if (log_level >= 2) { - sock_log(f); - log_puts(": couldn't get slot\n"); - } + logx(2, "sock %d: couldn't get ctlslot", f->fd); return 0; } f->ctldesc = xmalloc(SOCK_CTLDESC_SIZE); @@ -985,6 +797,7 @@ sock_execmsg(struct sock *f) struct ctl *c; struct slot *s = f->slot; struct amsg *m = &f->rmsg; + struct conv conv; unsigned char *data; unsigned int size, ctl; int cmd; @@ -993,17 +806,11 @@ sock_execmsg(struct sock *f) switch (cmd) { case AMSG_DATA: #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": DATA message\n"); - } + logx(4, "sock %d: DATA message", f->fd); #endif if (s != NULL && f->pstate != SOCK_START) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": DATA, wrong state\n"); - } + logx(1, "sock %d: DATA, wrong state", f->fd); #endif sock_close(f); return 0; @@ -1011,10 +818,7 @@ sock_execmsg(struct sock *f) if ((f->slot && !(f->slot->mode & MODE_PLAY)) || (f->midi && !(f->midi->mode & MODE_MIDIOUT))) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": DATA, input-only mode\n"); - } + logx(1, "sock %d: DATA, input-only mode", f->fd); #endif sock_close(f); return 0; @@ -1022,34 +826,22 @@ sock_execmsg(struct sock *f) size = ntohl(m->u.data.size); if (size == 0) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": zero size payload\n"); - } + logx(1, "sock %d: zero size payload", f->fd); #endif sock_close(f); return 0; } if (s != NULL && size % s->mix.bpf != 0) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": not aligned to frame\n"); - } + logx(1, "sock %d: not aligned to frame", f->fd); #endif sock_close(f); return 0; } if (s != NULL && size > f->ralign) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": size = "); - log_puti(size); - log_puts(": ralign = "); - log_puti(f->ralign); - log_puts(": not aligned to block\n"); - } + logx(1, "sock %d: size = %d, ralign = %d: " + "not aligned to block", f->fd, size, f->ralign); #endif sock_close(f); return 0; @@ -1063,14 +855,8 @@ sock_execmsg(struct sock *f) } if (f->rtodo > f->rmax) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": unexpected data, size = "); - log_putu(size); - log_puts(", rmax = "); - log_putu(f->rmax); - log_puts("\n"); - } + logx(1, "sock %d: unexpected data, size = %u, rmax = %d", + f->fd, size, f->rmax); #endif sock_close(f); return 0; @@ -1078,10 +864,7 @@ sock_execmsg(struct sock *f) f->rmax -= f->rtodo; if (f->rtodo == 0) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": zero-length data chunk\n"); - } + logx(1, "sock %d: zero-length data chunk", f->fd); #endif sock_close(f); return 0; @@ -1089,17 +872,11 @@ sock_execmsg(struct sock *f) break; case AMSG_START: #ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": START message\n"); - } + logx(3, "sock %d: START message", f->fd); #endif if (f->pstate != SOCK_INIT || s == NULL) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": START, wrong state\n"); - } + logx(1, "sock %d: START, wrong state", f->fd); #endif sock_close(f); return 0; @@ -1119,44 +896,14 @@ sock_execmsg(struct sock *f) f->pstate = SOCK_START; f->rstate = SOCK_RMSG; f->rtodo = sizeof(struct amsg); - if (log_level >= 2) { - slot_log(f->slot); - log_puts(": "); - log_putu(s->rate); - log_puts("Hz, "); - aparams_log(&s->par); - if (s->mode & MODE_PLAY) { - log_puts(", play "); - log_puti(s->opt->pmin); - log_puts(":"); - log_puti(s->opt->pmin + s->mix.nch - 1); - } - if (s->mode & MODE_RECMASK) { - log_puts(", rec "); - log_puti(s->opt->rmin); - log_puts(":"); - log_puti(s->opt->rmin + s->sub.nch - 1); - } - log_puts(", "); - log_putu(s->appbufsz / s->round); - log_puts(" blocks of "); - log_putu(s->round); - log_puts(" frames\n"); - } break; case AMSG_STOP: #ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": STOP message\n"); - } + logx(3, "sock %d: STOP message", f->fd); #endif if (f->pstate != SOCK_START) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": STOP, wrong state\n"); - } + logx(1, "sock %d: STOP, wrong state", f->fd); #endif sock_close(f); return 0; @@ -1172,16 +919,14 @@ sock_execmsg(struct sock *f) data = abuf_wgetblk(&s->mix.buf, &size); #ifdef DEBUG if (size < f->ralign) { - sock_log(f); - log_puts(": unaligned stop, size = "); - log_putu(size); - log_puts(", ralign = "); - log_putu(f->ralign); - log_puts("\n"); + logx(0, "sock %d: unaligned stop, " + "size = %u, ralign = %u", + f->fd, size, f->ralign); panic(); } #endif - memset(data, 0, f->ralign); + enc_init(&conv, &s->par, s->mix.nch); + enc_sil_do(&conv, data, f->ralign / s->mix.bpf); abuf_wcommit(&s->mix.buf, f->ralign); f->ralign = s->round * s->mix.bpf; } @@ -1190,17 +935,11 @@ sock_execmsg(struct sock *f) break; case AMSG_SETPAR: #ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": SETPAR message\n"); - } + logx(3, "sock %d: SETPAR message", f->fd); #endif if (f->pstate != SOCK_INIT || s == NULL) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": SETPAR, wrong state\n"); - } + logx(1, "sock %d: SETPAR, wrong state", f->fd); #endif sock_close(f); return 0; @@ -1214,17 +953,11 @@ sock_execmsg(struct sock *f) break; case AMSG_GETPAR: #ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": GETPAR message\n"); - } + logx(3, "sock %d: GETPAR message", f->fd); #endif if (f->pstate != SOCK_INIT || s == NULL) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": GETPAR, wrong state\n"); - } + logx(1, "sock %d: GETPAR, wrong state", f->fd); #endif sock_close(f); return 0; @@ -1251,17 +984,11 @@ sock_execmsg(struct sock *f) break; case AMSG_SETVOL: #ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": SETVOL message\n"); - } + logx(3, "sock %d: SETVOL message", f->fd); #endif if (f->pstate < SOCK_INIT || s == NULL) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": SETVOL, wrong state\n"); - } + logx(1, "sock %d: SETVOL, wrong state", f->fd); #endif sock_close(f); return 0; @@ -1269,10 +996,7 @@ sock_execmsg(struct sock *f) ctl = ntohl(m->u.vol.ctl); if (ctl > MIDI_MAXCTL) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": SETVOL, volume out of range\n"); - } + logx(1, "sock %d: SETVOL, volume out of range", f->fd); #endif sock_close(f); return 0; @@ -1287,21 +1011,12 @@ sock_execmsg(struct sock *f) case AMSG_CTLSUB_OLD: case AMSG_CTLSUB: #ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": CTLSUB message, desc = "); - log_putx(m->u.ctlsub.desc); - log_puts(", val = "); - log_putx(m->u.ctlsub.val); - log_puts("\n"); - } + logx(3, "sock %d: CTLSUB message, desc = 0x%x, val = 0x%x", + f->fd, m->u.ctlsub.desc, m->u.ctlsub.val); #endif if (f->pstate != SOCK_INIT || f->ctlslot == NULL) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": CTLSUB, wrong state\n"); - } + logx(1, "sock %d: CTLSUB, wrong state", f->fd); #endif sock_close(f); return 0; @@ -1332,17 +1047,11 @@ sock_execmsg(struct sock *f) break; case AMSG_CTLSET: #ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": CTLSET message\n"); - } + logx(3, "sock %d: CTLSET message", f->fd); #endif if (f->pstate < SOCK_INIT || f->ctlslot == NULL) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": CTLSET, wrong state\n"); - } + logx(1, "sock %d: CTLSET, wrong state", f->fd); #endif sock_close(f); return 0; @@ -1351,20 +1060,14 @@ sock_execmsg(struct sock *f) c = ctlslot_lookup(f->ctlslot, ntohs(m->u.ctlset.addr)); if (c == NULL) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": CTLSET, wrong addr\n"); - } + logx(1, "sock %d: CTLSET, wrong addr", f->fd); #endif sock_close(f); return 0; } if (!ctl_setval(c, ntohs(m->u.ctlset.val))) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": CTLSET, bad value\n"); - } + logx(1, "sock %d: CTLSET, bad value", f->fd); #endif sock_close(f); return 0; @@ -1374,17 +1077,11 @@ sock_execmsg(struct sock *f) break; case AMSG_AUTH: #ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": AUTH message\n"); - } + logx(3, "sock %d: AUTH message", f->fd); #endif if (f->pstate != SOCK_AUTH) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": AUTH, wrong state\n"); - } + logx(1, "sock %d: AUTH, wrong state", f->fd); #endif sock_close(f); return 0; @@ -1398,17 +1095,11 @@ sock_execmsg(struct sock *f) break; case AMSG_HELLO: #ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": HELLO message\n"); - } + logx(3, "sock %d: HELLO message", f->fd); #endif if (f->pstate != SOCK_HELLO) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": HELLO, wrong state\n"); - } + logx(1, "sock %d: HELLO, wrong state", f->fd); #endif sock_close(f); return 0; @@ -1424,27 +1115,18 @@ sock_execmsg(struct sock *f) break; case AMSG_BYE: #ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": BYE message\n"); - } + logx(3, "sock %d: BYE message", f->fd); #endif if (s != NULL && f->pstate != SOCK_INIT) { #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": BYE, wrong state\n"); - } + logx(1, "sock %d: BYE, wrong state", f->fd); #endif } sock_close(f); return 0; default: #ifdef DEBUG - if (log_level >= 1) { - sock_log(f); - log_puts(": unknown command in message\n"); - } + logx(1, "sock %d: unknown command in message", f->fd); #endif sock_close(f); return 0; @@ -1468,12 +1150,7 @@ sock_buildmsg(struct sock *f) */ if (f->tickpending) { #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": building MOVE message, delta = "); - log_puti(f->slot->delta); - log_puts("\n"); - } + logx(4, "sock %d: building MOVE message, delta = %d", f->fd, f->slot->delta); #endif AMSG_INIT(&f->wmsg); f->wmsg.cmd = htonl(AMSG_MOVE); @@ -1498,14 +1175,8 @@ sock_buildmsg(struct sock *f) size *= f->slot->mix.bpf; f->rmax += size; #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": building FLOWCTL message, count = "); - log_puti(f->fillpending); - log_puts(", rmax -> "); - log_puti(f->rmax); - log_puts("\n"); - } + logx(4, "sock %d: building FLOWCTL message, " + "count = %d, rmax -> %d", f->fd, f->fillpending, f->rmax); #endif f->wtodo = sizeof(struct amsg); f->wstate = SOCK_WMSG; @@ -1518,12 +1189,8 @@ sock_buildmsg(struct sock *f) */ if (f->pstate >= SOCK_START && f->slot->vol != f->lastvol) { #ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": building SETVOL message, vol = "); - log_puti(f->slot->vol); - log_puts("\n"); - } + logx(3, "sock %d: building SETVOL message, vol = %d", f->fd, + f->slot->vol); #endif AMSG_INIT(&f->wmsg); f->wmsg.cmd = htonl(AMSG_SETVOL); @@ -1560,8 +1227,7 @@ sock_buildmsg(struct sock *f) size -= size % f->slot->sub.bpf; #ifdef DEBUG if (size == 0) { - sock_log(f); - log_puts(": sock_buildmsg size == 0\n"); + logx(0, "sock %d: sock_buildmsg size == 0", f->fd); panic(); } #endif @@ -1570,12 +1236,7 @@ sock_buildmsg(struct sock *f) if (f->walign == 0) f->walign = f->slot->round * f->slot->sub.bpf; #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": building audio DATA message, size = "); - log_puti(size); - log_puts("\n"); - } + logx(4, "sock %d: building audio DATA message, size = %d", f->fd, size); #endif AMSG_INIT(&f->wmsg); f->wmsg.cmd = htonl(AMSG_DATA); @@ -1587,10 +1248,7 @@ sock_buildmsg(struct sock *f) if (f->stoppending) { #ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": building STOP message\n"); - } + logx(3, "sock %d: building STOP message", f->fd); #endif f->stoppending = 0; f->pstate = SOCK_INIT; @@ -1664,10 +1322,7 @@ sock_buildmsg(struct sock *f) f->wtodo = sizeof(struct amsg); f->wstate = SOCK_WMSG; #ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": building control DATA message\n"); - } + logx(3, "sock %d: building control DATA message", f->fd); #endif return 1; } @@ -1687,10 +1342,7 @@ sock_buildmsg(struct sock *f) f->wtodo = sizeof(struct amsg); f->wstate = SOCK_WMSG; #ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": building CTLSET message\n"); - } + logx(3, "sock %d: building CTLSET message", f->fd); #endif return 1; } @@ -1701,18 +1353,12 @@ sock_buildmsg(struct sock *f) f->wtodo = sizeof(struct amsg); f->wstate = SOCK_WMSG; #ifdef DEBUG - if (log_level >= 3) { - sock_log(f); - log_puts(": building CTLSYNC message\n"); - } + logx(3, "sock %d: building CTLSYNC message", f->fd); #endif return 1; } #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": no messages to build anymore, idling...\n"); - } + logx(4, "sock %d: no messages to build anymore, idling...", f->fd); #endif f->wstate = SOCK_WIDLE; return 0; @@ -1725,12 +1371,7 @@ int sock_read(struct sock *f) { #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": reading "); - log_putu(f->rtodo); - log_puts(" todo\n"); - } + logx(4, "sock %d: reading %u todo", f->fd, f->rtodo); #endif switch (f->rstate) { case SOCK_RIDLE: @@ -1750,10 +1391,7 @@ sock_read(struct sock *f) case SOCK_RRET: if (f->wstate != SOCK_WIDLE) { #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": can't reply, write-end blocked\n"); - } + logx(4, "sock %d: can't reply, write-end blocked", f->fd); #endif return 0; } @@ -1763,10 +1401,7 @@ sock_read(struct sock *f) f->rstate = SOCK_RMSG; f->rtodo = sizeof(struct amsg); #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": copied RRET message\n"); - } + logx(4, "sock %d: copied RRET message", f->fd); #endif } return 1; @@ -1779,15 +1414,7 @@ int sock_write(struct sock *f) { #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": writing"); - if (f->wstate != SOCK_WIDLE) { - log_puts(" todo = "); - log_putu(f->wtodo); - } - log_puts("\n"); - } + logx(4, "sock %d: writing", f->fd); #endif switch (f->wstate) { case SOCK_WMSG: @@ -1817,10 +1444,7 @@ sock_write(struct sock *f) f->pstate = SOCK_INIT; f->wmax = 0; #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": drained, moved to INIT state\n"); - } + logx(4, "sock %d: drained, moved to INIT state", f->fd); #endif } /* FALLTHROUGH */ @@ -1832,10 +1456,7 @@ sock_write(struct sock *f) f->rstate = SOCK_RMSG; f->rtodo = sizeof(struct amsg); #ifdef DEBUG - if (log_level >= 4) { - sock_log(f); - log_puts(": copied RRET message\n"); - } + logx(4, "sock %d: copied RRET message", f->fd); #endif } else { if (!sock_buildmsg(f)) @@ -1844,8 +1465,7 @@ sock_write(struct sock *f) break; #ifdef DEBUG default: - sock_log(f); - log_puts(": bad writing end state\n"); + logx(0, "sock %d: bad writing end state", f->fd); panic(); #endif } diff --git a/usr.bin/sndiod/utils.c b/usr.bin/sndiod/utils.c index 228c57001..c0e07a483 100644 --- a/usr.bin/sndiod/utils.c +++ b/usr.bin/sndiod/utils.c @@ -1,4 +1,4 @@ -/* $OpenBSD: utils.c,v 1.8 2021/11/01 14:43:25 ratchov Exp $ */ +/* $OpenBSD: utils.c,v 1.9 2024/12/20 07:35:56 ratchov Exp $ */ /* * Copyright (c) 2003-2012 Alexandre Ratchov * @@ -15,12 +15,16 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* - * log_xxx() routines are used to quickly store traces into a trace buffer. + * logx() quickly stores traces into a trace buffer. * This allows traces to be collected during time sensitive operations without * disturbing them. The buffer can be flushed on standard error later, when * slow syscalls are no longer disruptive, e.g. at the end of the poll() loop. */ +#include #include +#include +#include +#include #include #include #include @@ -32,16 +36,8 @@ */ #define LOG_BUFSZ 8192 -/* - * store a character in the log - */ -#define LOG_PUTC(c) do { \ - if (log_used < LOG_BUFSZ) \ - log_buf[log_used++] = (c); \ -} while (0) - char log_buf[LOG_BUFSZ]; /* buffer where traces are stored */ -unsigned int log_used = 0; /* bytes used in the buffer */ +size_t log_used = 0; /* bytes used in the buffer */ unsigned int log_sync = 1; /* if true, flush after each '\n' */ /* @@ -57,75 +53,29 @@ log_flush(void) } /* - * store a string in the log + * log a single line to stderr */ void -log_puts(char *msg) +log_do(const char *fmt, ...) { - char *p = msg; - int c; + va_list ap; + int n, save_errno = errno; - while ((c = *p++) != '\0') { - LOG_PUTC(c); - if (log_sync && c == '\n') + va_start(ap, fmt); + n = vsnprintf(log_buf + log_used, sizeof(log_buf) - log_used, fmt, ap); + va_end(ap); + + if (n != -1) { + log_used += n; + + if (log_used >= sizeof(log_buf)) + log_used = sizeof(log_buf) - 1; + log_buf[log_used++] = '\n'; + + if (log_sync) log_flush(); } -} - -/* - * store a hex in the log - */ -void -log_putx(unsigned long num) -{ - char dig[sizeof(num) * 2], *p = dig, c; - unsigned int ndig; - - if (num != 0) { - for (ndig = 0; num != 0; ndig++) { - *p++ = num & 0xf; - num >>= 4; - } - for (; ndig != 0; ndig--) { - c = *(--p); - c += (c < 10) ? '0' : 'a' - 10; - LOG_PUTC(c); - } - } else - LOG_PUTC('0'); -} - -/* - * store an unsigned decimal in the log - */ -void -log_putu(unsigned long num) -{ - char dig[sizeof(num) * 3], *p = dig; - unsigned int ndig; - - if (num != 0) { - for (ndig = 0; num != 0; ndig++) { - *p++ = num % 10; - num /= 10; - } - for (; ndig != 0; ndig--) - LOG_PUTC(*(--p) + '0'); - } else - LOG_PUTC('0'); -} - -/* - * store a signed decimal in the log - */ -void -log_puti(long num) -{ - if (num < 0) { - LOG_PUTC('-'); - num = -num; - } - log_putu(num); + errno = save_errno; } /* @@ -151,9 +101,7 @@ xmalloc(size_t size) p = malloc(size); if (p == NULL) { - log_puts("failed to allocate "); - log_putx(size); - log_puts(" bytes\n"); + logx(0, "failed to allocate %zu bytes", size); panic(); } return p; @@ -167,7 +115,7 @@ xfree(void *p) { #ifdef DEBUG if (p == NULL) { - log_puts("xfree with NULL arg\n"); + logx(0, "xfree with NULL arg"); panic(); } #endif diff --git a/usr.bin/sndiod/utils.h b/usr.bin/sndiod/utils.h index 623af9b9b..9da7fec4d 100644 --- a/usr.bin/sndiod/utils.h +++ b/usr.bin/sndiod/utils.h @@ -1,4 +1,4 @@ -/* $OpenBSD: utils.h,v 1.7 2021/11/01 18:23:09 ratchov Exp $ */ +/* $OpenBSD: utils.h,v 1.8 2024/12/20 07:35:56 ratchov Exp $ */ /* * Copyright (c) 2003-2012 Alexandre Ratchov * @@ -20,12 +20,15 @@ #include -void log_puts(char *); -void log_putx(unsigned long); -void log_putu(unsigned long); -void log_puti(long); +#define logx(n, ...) \ + do { \ + if (log_level >= (n)) \ + log_do(__VA_ARGS__); \ + } while (0) + void panic(void); void log_flush(void); +void log_do(const char *, ...) __attribute__((__format__ (printf, 1, 2))); void *xmalloc(size_t); char *xstrdup(char *); diff --git a/usr.bin/ssh/Makefile.inc b/usr.bin/ssh/Makefile.inc index 85dd55895..b607d0868 100644 --- a/usr.bin/ssh/Makefile.inc +++ b/usr.bin/ssh/Makefile.inc @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile.inc,v 1.97 2024/10/14 01:57:50 djm Exp $ +# $OpenBSD: Makefile.inc,v 1.98 2024/11/24 23:47:50 djm Exp $ .include @@ -29,9 +29,9 @@ CDIAGFLAGS+= -Wold-style-definition CDIAGFLAGS+= -Werror .endif -CDIAGFLAGS+= -fno-common -DEBUG=-g -INSTALL_STRIP= +#CDIAGFLAGS+= -fno-common -Werror +#DEBUG=-g +#INSTALL_STRIP= WARNINGS=yes diff --git a/usr.bin/ssh/PROTOCOL.agent b/usr.bin/ssh/PROTOCOL.agent index 9ae16bf2b..b6e14262d 100644 --- a/usr.bin/ssh/PROTOCOL.agent +++ b/usr.bin/ssh/PROTOCOL.agent @@ -1,5 +1,5 @@ The SSH agent protocol is described in -https://tools.ietf.org/html/draft-miller-ssh-agent +https://datatracker.ietf.org/doc/draft-ietf-sshm-ssh-agent/ This file documents OpenSSH's extensions to the agent protocol. @@ -115,4 +115,4 @@ A SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED will return SSH_AGENT_SUCCESS if any key (plain private or certificate) was successfully loaded, or SSH_AGENT_FAILURE if no key was loaded. -$OpenBSD: PROTOCOL.agent,v 1.23 2024/04/30 05:45:56 djm Exp $ +$OpenBSD: PROTOCOL.agent,v 1.24 2024/11/27 13:27:34 djm Exp $ diff --git a/usr.bin/ssh/PROTOCOL.certkeys b/usr.bin/ssh/PROTOCOL.certkeys index 68622e607..0a212c635 100644 --- a/usr.bin/ssh/PROTOCOL.certkeys +++ b/usr.bin/ssh/PROTOCOL.certkeys @@ -231,10 +231,15 @@ is a sequence of zero or more tuples: Options must be lexically ordered by "name" if they appear in the sequence. Each named option may only appear once in a certificate. -The name field identifies the option and the data field encodes -option-specific information (see below). All options are -"critical"; if an implementation does not recognise a option, -then the validating party should refuse to accept the certificate. +The name field identifies the option. The data field contains +option-specific information encoded as zero or more values inside +the string. I.e. an empty data field would be encoded as a zero- +length string (00 00 00 00), and data field that holds a single +string value "a" would be encoded as (00 00 00 05 00 00 00 01 65). + +All options are "critical"; if an implementation does not recognise +a option, then the validating party should refuse to accept the +certificate. Custom options should append the originating author or organisation's domain name to the option name, e.g. "my-option@example.com". @@ -318,4 +323,4 @@ permit-user-rc empty Flag indicating that execution of of this script will not be permitted if this option is not present. -$OpenBSD: PROTOCOL.certkeys,v 1.19 2021/06/05 13:47:00 naddy Exp $ +$OpenBSD: PROTOCOL.certkeys,v 1.20 2024/12/06 16:02:12 djm Exp $ diff --git a/usr.bin/ssh/auth2-pubkey.c b/usr.bin/ssh/auth2-pubkey.c index d459e1041..d6bc30925 100644 --- a/usr.bin/ssh/auth2-pubkey.c +++ b/usr.bin/ssh/auth2-pubkey.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth2-pubkey.c,v 1.120 2024/05/17 00:30:23 djm Exp $ */ +/* $OpenBSD: auth2-pubkey.c,v 1.122 2024/12/12 09:09:09 dtucker Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2010 Damien Miller. All rights reserved. @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -316,20 +317,51 @@ match_principals_file(struct passwd *pw, char *file, struct sshkey_cert *cert, struct sshauthopt **authoptsp) { FILE *f; - int success; + int r, success = 0; + size_t i; + glob_t gl; + struct sshauthopt *opts = NULL; if (authoptsp != NULL) *authoptsp = NULL; temporarily_use_uid(pw); - debug("trying authorized principals file %s", file); - if ((f = auth_openprincipals(file, pw, options.strict_modes)) == NULL) { - restore_uid(); - return 0; - } - success = auth_process_principals(f, file, cert, authoptsp); - fclose(f); + r = glob(file, 0, NULL, &gl); restore_uid(); + if (r != 0) { + if (r != GLOB_NOMATCH) { + logit_f("glob \"%s\" failed", file); + } + return 0; + } else if (gl.gl_pathc > INT_MAX) { + fatal_f("too many glob results for \"%s\"", file); + } else if (gl.gl_pathc > 1) { + debug2_f("glob \"%s\" returned %zu matches", file, + gl.gl_pathc); + } + for (i = 0; !success && i < gl.gl_pathc; i++) { + temporarily_use_uid(pw); + debug("trying authorized principals file %s", file); + if ((f = auth_openprincipals(gl.gl_pathv[i], pw, + options.strict_modes)) == NULL) { + restore_uid(); + continue; + } + success = auth_process_principals(f, gl.gl_pathv[i], + cert, &opts); + fclose(f); + restore_uid(); + if (!success) { + sshauthopt_free(opts); + opts = NULL; + } + } + globfree(&gl); + if (success && authoptsp != NULL) { + *authoptsp = opts; + opts = NULL; + } + sshauthopt_free(opts); return success; } @@ -750,8 +782,8 @@ int user_key_allowed(struct ssh *ssh, struct passwd *pw, struct sshkey *key, int auth_attempt, struct sshauthopt **authoptsp) { - u_int success = 0, i; - char *file, *conn_id; + u_int success = 0, i, j; + char *file = NULL, *conn_id; struct sshauthopt *opts = NULL; const char *rdomain, *remote_ip, *remote_host; @@ -773,17 +805,40 @@ user_key_allowed(struct ssh *ssh, struct passwd *pw, struct sshkey *key, remote_ip, ssh_remote_port(ssh)); for (i = 0; !success && i < options.num_authkeys_files; i++) { + int r; + glob_t gl; + if (strcasecmp(options.authorized_keys_files[i], "none") == 0) continue; file = expand_authorized_keys( options.authorized_keys_files[i], pw); - success = user_key_allowed2(pw, key, file, - remote_ip, remote_host, &opts); - free(file); - if (!success) { - sshauthopt_free(opts); - opts = NULL; + temporarily_use_uid(pw); + r = glob(file, 0, NULL, &gl); + restore_uid(); + if (r != 0) { + if (r != GLOB_NOMATCH) { + logit_f("glob \"%s\" failed", file); + } + free(file); + file = NULL; + continue; + } else if (gl.gl_pathc > INT_MAX) { + fatal_f("too many glob results for \"%s\"", file); + } else if (gl.gl_pathc > 1) { + debug2_f("glob \"%s\" returned %zu matches", file, + gl.gl_pathc); } + for (j = 0; !success && j < gl.gl_pathc; j++) { + success = user_key_allowed2(pw, key, gl.gl_pathv[j], + remote_ip, remote_host, &opts); + if (!success) { + sshauthopt_free(opts); + opts = NULL; + } + } + free(file); + file = NULL; + globfree(&gl); } if (success) goto out; diff --git a/usr.bin/ssh/channels.c b/usr.bin/ssh/channels.c index 07e8c0865..938599b04 100644 --- a/usr.bin/ssh/channels.c +++ b/usr.bin/ssh/channels.c @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.c,v 1.440 2024/10/13 22:20:06 djm Exp $ */ +/* $OpenBSD: channels.c,v 1.442 2024/12/05 06:49:26 dtucker Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -86,6 +86,8 @@ #define NUM_SOCKS 10 /* -- X11 forwarding */ +/* X11 port for display :0 */ +#define X11_BASE_PORT 6000 /* Maximum number of fake X11 displays to try. */ #define MAX_DISPLAYS 1000 @@ -4949,19 +4951,19 @@ x11_create_display_inet(struct ssh *ssh, int x11_display_offset, u_int *display_numberp, int **chanids) { Channel *nc = NULL; - int display_number, sock; - u_short port; + int display_number, sock, port; struct addrinfo hints, *ai, *aitop; char strport[NI_MAXSERV]; int gaierr, n, num_socks = 0, socks[NUM_SOCKS]; - if (chanids == NULL) + if (chanids == NULL || x11_display_offset < 0 || + x11_display_offset > UINT16_MAX - X11_BASE_PORT - MAX_DISPLAYS) return -1; for (display_number = x11_display_offset; display_number < MAX_DISPLAYS; display_number++) { - port = 6000 + display_number; + port = X11_BASE_PORT + display_number; memset(&hints, 0, sizeof(hints)); hints.ai_family = ssh->chanctxt->IPv4or6; hints.ai_flags = x11_use_localhost ? 0: AI_PASSIVE; @@ -5109,7 +5111,8 @@ x11_connect_display(struct ssh *ssh) * buf now contains the host name. But first we parse the * display number. */ - if (sscanf(cp + 1, "%u", &display_number) != 1) { + if (sscanf(cp + 1, "%u", &display_number) != 1 || + display_number > UINT16_MAX - X11_BASE_PORT) { error("Could not parse display number from DISPLAY: %.100s", display); return -1; @@ -5119,7 +5122,7 @@ x11_connect_display(struct ssh *ssh) memset(&hints, 0, sizeof(hints)); hints.ai_family = ssh->chanctxt->IPv4or6; hints.ai_socktype = SOCK_STREAM; - snprintf(strport, sizeof strport, "%u", 6000 + display_number); + snprintf(strport, sizeof strport, "%u", X11_BASE_PORT + display_number); if ((gaierr = getaddrinfo(buf, strport, &hints, &aitop)) != 0) { error("%.100s: unknown host. (%s)", buf, ssh_gai_strerror(gaierr)); @@ -5135,7 +5138,7 @@ x11_connect_display(struct ssh *ssh) /* Connect it to the display. */ if (connect(sock, ai->ai_addr, ai->ai_addrlen) == -1) { debug2("connect %.100s port %u: %.100s", buf, - 6000 + display_number, strerror(errno)); + X11_BASE_PORT + display_number, strerror(errno)); close(sock); continue; } @@ -5145,7 +5148,7 @@ x11_connect_display(struct ssh *ssh) freeaddrinfo(aitop); if (!ai) { error("connect %.100s port %u: %.100s", buf, - 6000 + display_number, strerror(errno)); + X11_BASE_PORT + display_number, strerror(errno)); return -1; } set_nodelay(sock); diff --git a/usr.bin/ssh/clientloop.c b/usr.bin/ssh/clientloop.c index 07c321cc3..7e37754a4 100644 --- a/usr.bin/ssh/clientloop.c +++ b/usr.bin/ssh/clientloop.c @@ -1,4 +1,4 @@ -/* $OpenBSD: clientloop.c,v 1.409 2024/10/13 22:20:06 djm Exp $ */ +/* $OpenBSD: clientloop.c,v 1.410 2024/12/03 22:30:03 jsg Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -652,7 +652,7 @@ obfuscate_keystroke_timing(struct ssh *ssh, struct timespec *timeout, /* Don't arm output fd for poll until the timing interval has elapsed... */ if (timespeccmp(&now, &next_interval, <)) - /* ...unless there's x11 communicattion happening */ + /* ...unless there's x11 communication happening */ return x11_channel_used_recently(ssh); /* Calculate number of intervals missed since the last check */ diff --git a/usr.bin/ssh/dh.c b/usr.bin/ssh/dh.c index 1af57553c..45123ba2c 100644 --- a/usr.bin/ssh/dh.c +++ b/usr.bin/ssh/dh.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dh.c,v 1.74 2021/04/03 06:18:40 djm Exp $ */ +/* $OpenBSD: dh.c,v 1.75 2024/12/03 16:27:53 dtucker Exp $ */ /* * Copyright (c) 2000 Niels Provos. All rights reserved. * @@ -190,9 +190,9 @@ choose_dh(int min, int wantbits, int max) if (bestcount == 0) { fclose(f); - logit("WARNING: no suitable primes in %s", - get_moduli_filename()); - return (dh_new_group_fallback(max)); + logit("WARNING: no suitable primes (size %d/%d/%d) in %s", + min, wantbits, max, get_moduli_filename()); + return NULL; } which = arc4random_uniform(bestcount); diff --git a/usr.bin/ssh/groupaccess.c b/usr.bin/ssh/groupaccess.c index 69fd007fe..5303688ba 100644 --- a/usr.bin/ssh/groupaccess.c +++ b/usr.bin/ssh/groupaccess.c @@ -1,4 +1,4 @@ -/* $OpenBSD: groupaccess.c,v 1.17 2019/03/06 22:14:23 dtucker Exp $ */ +/* $OpenBSD: groupaccess.c,v 1.18 2024/11/04 21:59:15 jca Exp $ */ /* * Copyright (c) 2001 Kevin Steves. All rights reserved. * @@ -48,15 +48,18 @@ int ga_init(const char *user, gid_t base) { gid_t groups_bygid[NGROUPS_MAX + 1]; - int i, j; + int i, j, maxgroups; struct group *gr; if (ngroups > 0) ga_free(); - ngroups = sizeof(groups_bygid) / sizeof(gid_t); - if (getgrouplist(user, base, groups_bygid, &ngroups) == -1) + maxgroups = ngroups = sizeof(groups_bygid) / sizeof(gid_t); + if (getgrouplist(user, base, groups_bygid, &ngroups) == -1) { logit("getgrouplist: groups list too small"); + /* Truncate group list */ + ngroups = maxgroups; + } for (i = 0, j = 0; i < ngroups; i++) if ((gr = getgrgid(groups_bygid[i])) != NULL) groups_byname[j++] = xstrdup(gr->gr_name); diff --git a/usr.bin/ssh/kexmlkem768x25519.c b/usr.bin/ssh/kexmlkem768x25519.c index 26563e234..098a49316 100644 --- a/usr.bin/ssh/kexmlkem768x25519.c +++ b/usr.bin/ssh/kexmlkem768x25519.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kexmlkem768x25519.c,v 1.1 2024/09/02 12:13:56 djm Exp $ */ +/* $OpenBSD: kexmlkem768x25519.c,v 1.2 2024/10/27 02:06:59 djm Exp $ */ /* * Copyright (c) 2023 Markus Friedl. All rights reserved. * @@ -30,6 +30,7 @@ #include #include #include +#include #include "sshkey.h" #include "kex.h" diff --git a/usr.bin/ssh/libcrux_mlkem768_sha3.h b/usr.bin/ssh/libcrux_mlkem768_sha3.h index a82d60e83..b8ac1436f 100644 --- a/usr.bin/ssh/libcrux_mlkem768_sha3.h +++ b/usr.bin/ssh/libcrux_mlkem768_sha3.h @@ -1,4 +1,5 @@ -/* $OpenBSD: libcrux_mlkem768_sha3.h,v 1.1 2024/09/02 12:13:56 djm Exp $ */ +/* $OpenBSD: libcrux_mlkem768_sha3.h,v 1.2 2024/10/27 02:06:01 djm Exp $ */ + /* Extracted from libcrux revision 84c5d87b3092c59294345aa269ceefe0eb97cc35 */ /* @@ -160,18 +161,19 @@ static inline void Eurydice_slice_to_array3(uint8_t *dst_tag, char *dst_ok, // CORE STUFF (conversions, endianness, ...) static inline void core_num__u64_9__to_le_bytes(uint64_t v, uint8_t buf[8]) { + v = htole64(v); memcpy(buf, &v, sizeof(v)); } static inline uint64_t core_num__u64_9__from_le_bytes(uint8_t buf[8]) { uint64_t v; memcpy(&v, buf, sizeof(v)); - return v; + return le64toh(v); } static inline uint32_t core_num__u32_8__from_le_bytes(uint8_t buf[4]) { uint32_t v; memcpy(&v, buf, sizeof(v)); - return v; + return le32toh(v); } static inline uint32_t core_num__u8_6__count_ones(uint8_t x0) { diff --git a/usr.bin/ssh/log.c b/usr.bin/ssh/log.c index 8b1b3991a..c7cdf08f3 100644 --- a/usr.bin/ssh/log.c +++ b/usr.bin/ssh/log.c @@ -1,4 +1,4 @@ -/* $OpenBSD: log.c,v 1.63 2024/10/14 01:57:50 djm Exp $ */ +/* $OpenBSD: log.c,v 1.64 2024/12/07 10:05:36 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -36,14 +36,16 @@ #include +#include #include +#include #include #include #include #include #include +#include #include -#include #include #include "log.h" @@ -447,3 +449,167 @@ sshlogdirect(LogLevel level, int forced, const char *fmt, ...) do_log(level, forced, NULL, fmt, args); va_end(args); } + + +/* + * A simple system for ratelimiting aperiodic events such as logs, without + * needing to be hooked into a mainloop/timer. A running total of events is + * maintained and when it exceeds a threshold further events are dropped + * until the rate falls back below that threshold. + * + * To prevent flipping in and out of rate-limiting, there is a hysteresis + * timer that delays leaving the rate-limited state. + * + * While in the rate-limited state, events can be periodically allowed though + * and the number of dropped events since the last log obtained. + * + * XXX a moving average rate of events might be a better approach here rather + * than linear decay, which can suppress events for a while after large + * bursts. + */ + +/* #define RATELIMIT_DEBUG 1 */ + +#ifdef RATELIMIT_DEBUG +# define RLDBG(x) do { \ + printf("%s:%d %s: ", __FILE__, __LINE__, __func__); \ + printf x; \ + printf("\n"); \ + fflush(stdout); \ + } while (0) +#else +# define RLDBG(x) +#endif + +/* set up a ratelimit */ +void +log_ratelimit_init(struct log_ratelimit_ctx *rl, u_int threshold, + u_int max_accum, u_int hysteresis, u_int log_every) +{ + memset(rl, 0, sizeof(*rl)); + rl->threshold = threshold; + rl->max_accum = max_accum; + rl->hysteresis = hysteresis; + rl->log_every = log_every; + RLDBG(("called: rl=%p thresh=%u max=%u hys=%u log_every=%u", + rl, rl->threshold, rl->max_accum, rl->hysteresis, rl->log_every)); +} + +/* + * check whether a log event should be dropped because of rate-limiting. + * returns non-zero if the event should be dropped. If events_since_last + * is supplied then, for periodic logs, it will be set to the number of + * dropped events since the last message. + */ +int +log_ratelimit(struct log_ratelimit_ctx *rl, time_t now, int *active, + u_int *events_dropped) +{ + time_t olast_event; + + RLDBG(("called: rl=%p thresh=%u max=%u hys=%u log_every=%u " + "accum=%u since=%ld since_last=%u", rl, rl->threshold, + rl->max_accum, rl->hysteresis, + rl->log_every, rl->accumulated_events, + rl->last_event == 0 ? -1 : (long)(now - rl->last_event), + rl->ratelimited_events)); + + if (now < 0) + return 0; + if (events_dropped != NULL) + *events_dropped = 0; + if (active != NULL) + *active = rl->ratelimit_active; + + /* First, decay accumulated events */ + if (rl->last_event <= 0) + rl->last_event = now; + if (now > rl->last_event) { + uint64_t n = now - rl->last_event; + + if (n > UINT_MAX) + n = UINT_MAX; + if (rl->accumulated_events < (u_int)n) + rl->accumulated_events = 0; + else + rl->accumulated_events -= (u_int)n; + RLDBG(("decay: accum=%u", rl->accumulated_events)); + } + rl->accumulated_events++; /* add this event */ + if (rl->accumulated_events > rl->max_accum) + rl->accumulated_events = rl->max_accum; + olast_event = rl->last_event; + rl->last_event = now; + RLDBG(("check threshold: accum=%u vs thresh=%u", + rl->accumulated_events, rl->threshold)); + + /* Are we under threshold? */ + if (rl->accumulated_events < rl->threshold) { + if (!rl->ratelimit_active) + return 0; + RLDBG(("under threshold: hys=%u since_hys=%ld since_last=%ld", + rl->hysteresis, rl->hysteresis_start == 0 ? -1 : + (long)(now - rl->hysteresis_start), + olast_event == 0 ? -1 : (long)(now - olast_event))); + if (rl->hysteresis_start == 0) { + /* active, but under threshold; hysteresis */ + if (olast_event + rl->hysteresis < now) { + /* hysteresis expired before this event */ + RLDBG(("hysteresis preexpired")); + goto inactive; + } + RLDBG(("start hysteresis")); + rl->hysteresis_start = now; + } else if (rl->hysteresis_start + rl->hysteresis < now) { + /* Hysteresis period expired, transition to inactive */ + RLDBG(("complete hysteresis")); + inactive: + if (events_dropped != NULL) + *events_dropped = rl->ratelimited_events; + if (active != NULL) + *active = 0; + rl->ratelimit_active = 0; + rl->ratelimit_start = 0; + rl->last_log = 0; + rl->hysteresis_start = 0; + rl->ratelimited_events = 0; + return 0; + } + /* ratelimiting active, but in hysteresis period */ + } else if (!rl->ratelimit_active) { + /* Transition to rate-limiting */ + RLDBG(("start ratelimit")); + rl->ratelimit_active = 1; + rl->ratelimit_start = now; + rl->last_log = now; + rl->hysteresis_start = 0; + rl->ratelimited_events = 1; + if (active != NULL) + *active = 1; + return 1; + } else if (rl->hysteresis_start != 0) { + /* active and over threshold; reset hysteresis timer */ + RLDBG(("clear hysteresis")); + rl->hysteresis_start = 0; + } + + /* over threshold or in hysteresis period; log periodically */ + if (active != NULL) + *active = 1; + RLDBG(("log_every=%u since_log=%ld", rl->log_every, + (long)(now - rl->last_log))); + if (rl->log_every > 0 && now >= rl->last_log + rl->log_every) { + RLDBG(("periodic: since_last=%u", rl->ratelimited_events)); + rl->last_log = now; + if (events_dropped != NULL) { + *events_dropped = rl->ratelimited_events; + rl->ratelimited_events = 0; + } + return 0; + } + + /* drop event */ + rl->ratelimited_events++; + RLDBG(("drop: ratelimited_events=%u", rl->ratelimited_events)); + return 1; +} diff --git a/usr.bin/ssh/log.h b/usr.bin/ssh/log.h index cced76c54..014aefeaa 100644 --- a/usr.bin/ssh/log.h +++ b/usr.bin/ssh/log.h @@ -1,4 +1,4 @@ -/* $OpenBSD: log.h,v 1.34 2024/06/27 22:36:44 djm Exp $ */ +/* $OpenBSD: log.h,v 1.35 2024/12/07 10:05:37 djm Exp $ */ /* * Author: Tatu Ylonen @@ -78,6 +78,30 @@ void sshfatal(const char *, const char *, int, int, void sshlogdirect(LogLevel, int, const char *, ...) __attribute__((format(printf, 3, 4))); +struct log_ratelimit_ctx { + /* configuration */ + u_int threshold; /* events per second */ + u_int max_accum; /* max events to accumulate */ + u_int hysteresis; /* seconds */ + u_int log_every; /* seconds */ + + /* state */ + time_t last_event; + u_int accumulated_events; /* used for threshold comparisons */ + + /* state while actively rate-limiting */ + int ratelimit_active; + time_t ratelimit_start; + time_t last_log; + time_t hysteresis_start; + u_int ratelimited_events; +}; + +void log_ratelimit_init(struct log_ratelimit_ctx *rl, u_int threshold, + u_int max_accum, u_int hysteresis, u_int log_every); +int log_ratelimit(struct log_ratelimit_ctx *rl, time_t now, int *active, + u_int *events_dropped); + #define do_log2(level, ...) sshlog(__FILE__, __func__, __LINE__, 0, level, NULL, __VA_ARGS__) #define debug3(...) sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_DEBUG3, NULL, __VA_ARGS__) #define debug2(...) sshlog(__FILE__, __func__, __LINE__, 0, SYSLOG_LEVEL_DEBUG2, NULL, __VA_ARGS__) diff --git a/usr.bin/ssh/misc.c b/usr.bin/ssh/misc.c index a7b5b95d1..c547ea944 100644 --- a/usr.bin/ssh/misc.c +++ b/usr.bin/ssh/misc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: misc.c,v 1.197 2024/09/25 01:24:04 djm Exp $ */ +/* $OpenBSD: misc.c,v 1.198 2024/10/24 03:14:37 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2005-2020 Damien Miller. All rights reserved. @@ -2299,7 +2299,8 @@ valid_domain(char *name, int makelower, const char **errstr) strlcpy(errbuf, "empty domain name", sizeof(errbuf)); goto bad; } - if (!isalpha((u_char)name[0]) && !isdigit((u_char)name[0])) { + if (!isalpha((u_char)name[0]) && !isdigit((u_char)name[0]) && + name[0] != '_' /* technically invalid, but common */) { snprintf(errbuf, sizeof(errbuf), "domain name \"%.100s\" " "starts with invalid character", name); goto bad; diff --git a/usr.bin/ssh/mlkem768.sh b/usr.bin/ssh/mlkem768.sh index 2fdc28312..3d12b2ed8 100755 --- a/usr.bin/ssh/mlkem768.sh +++ b/usr.bin/ssh/mlkem768.sh @@ -1,9 +1,10 @@ #!/bin/sh -# $OpenBSD: mlkem768.sh,v 1.2 2024/09/04 05:11:33 djm Exp $ +# $OpenBSD: mlkem768.sh,v 1.3 2024/10/27 02:06:01 djm Exp $ # Placed in the Public Domain. # -WANT_LIBCRUX_REVISION="origin/main" +#WANT_LIBCRUX_REVISION="origin/main" +WANT_LIBCRUX_REVISION="84c5d87b3092c59294345aa269ceefe0eb97cc35" FILES=" libcrux/libcrux-ml-kem/cg/eurydice_glue.h @@ -47,6 +48,7 @@ echo '#define KRML_NOINLINE __attribute__((noinline, unused))' echo '#define KRML_HOST_EPRINTF(...)' echo '#define KRML_HOST_EXIT(x) fatal_f("internal error")' echo + for i in $FILES; do echo "/* from $i */" # Changes to all files: @@ -56,11 +58,16 @@ for i in $FILES; do -e 's/[ ]*$//' \ $i | \ case "$i" in - # XXX per-file handling goes here. + */libcrux-ml-kem/cg/eurydice_glue.h) + # Replace endian functions with versions that work. + perl -0777 -pe 's/(static inline void core_num__u64_9__to_le_bytes.*\n)([^}]*\n)/\1 v = htole64(v);\n\2/' | + perl -0777 -pe 's/(static inline uint64_t core_num__u64_9__from_le_bytes.*?)return v;/\1return le64toh(v);/s' | + perl -0777 -pe 's/(static inline uint32_t core_num__u32_8__from_le_bytes.*?)return v;/\1return le32toh(v);/s' + ;; # Default: pass through. *) - cat - ;; + cat + ;; esac echo done diff --git a/usr.bin/ssh/moduli-gen/moduli.2048 b/usr.bin/ssh/moduli-gen/moduli.2048 index 561d89254..b259161ac 100644 --- a/usr.bin/ssh/moduli-gen/moduli.2048 +++ b/usr.bin/ssh/moduli-gen/moduli.2048 @@ -1,69 +1,60 @@ -20240326013051 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85DDC5DFB -20240326013055 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85DF8EE9F -20240326013100 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85E15B2AF -20240326013115 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85E8800BB -20240326013121 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85EA93D9F -20240326013127 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85ED33B77 -20240326013129 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85EDE96FB -20240326013133 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85EFDC7AB -20240326013135 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85F004B07 -20240326013147 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85F5A20FB -20240326013151 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85F780007 -20240326013154 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85F873847 -20240326013155 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85F8792BF -20240326013158 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85F99602B -20240326013212 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85FFDCCE7 -20240326013219 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86033F8F7 -20240326013239 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A860C92607 -20240326013244 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A860EACC9F -20240326013252 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8612623A3 -20240326013254 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86131122B -20240326013256 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86137AE5B -20240326013316 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A861CE9FAB -20240326013319 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A861DDF033 -20240326013322 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A861F71477 -20240326013330 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8622DF73F -20240326013333 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8623FA97B -20240326013347 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A862A6F8D3 -20240326013357 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A862EDADB3 -20240326013401 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86306A44F -20240326013402 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8630A4F4F -20240326013406 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86329C6AF -20240326013412 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8634D56D7 -20240326013433 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A863ECB6D7 -20240326013438 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8640E99FF -20240326013448 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86456D45B -20240326013455 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8648DB9CF -20240326013456 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86490C78B -20240326013506 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A864D48787 -20240326013511 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A864F4C14B -20240326013522 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86546E877 -20240326013524 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8654FB6D3 -20240326013529 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A865742D0B -20240326013534 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8659900A3 -20240326013537 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A865A3FE37 -20240326013538 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F049F51F -20240326013547 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F0859D0B -20240326013554 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F0BBD077 -20240326013607 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F11279FB -20240326013628 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F1B2B0DB -20240326013645 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F22EA4A7 -20240326013653 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F266CCCB -20240326013656 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F27B8CC3 -20240326013704 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F2B6898B -20240326013728 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F3661F27 -20240326013732 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F382F33F -20240326013755 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F42B19A3 -20240326013815 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F4BFFC7F -20240326013816 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F4C4D313 -20240326013818 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F4CB895F -20240326013838 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F55F34E3 -20240326013843 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F581582B -20240326013845 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F58BB9BF -20240326013904 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F61FCE5B -20240326013920 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F69490CF -20240326013923 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F6A8041B -20240326013953 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F7815AF3 -20240326014006 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F7E1576F -20240326014014 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F818E747 -20240326014019 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F83E49A7 +20240828044144 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63216235F7 +20240828044149 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63217EB4CB +20240828044153 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF632197445F +20240828044203 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6321E28D7F +20240828044206 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6321F5D65F +20240828044207 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6321F5F783 +20240828044210 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63220959FB +20240828044217 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63223CB053 +20240828044224 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63226F7A83 +20240828044233 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6322B452E7 +20240828044240 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6322E58253 +20240828044251 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF632334AB77 +20240828044259 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF632379357B +20240828044311 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6323D336A7 +20240828044323 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63242A969B +20240828044326 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63243E12C3 +20240828044349 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6324EA98FF +20240828044351 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6324F33C17 +20240828044406 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF632569D1BF +20240828044412 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF632591055B +20240828044416 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6325A64983 +20240828044426 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6325F39C73 +20240828044435 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63263987CF +20240828044440 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63265B2A5F +20240828044445 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63267C888B +20240828044453 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6326B9D6C3 +20240828044505 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF63270DF46F +20240828044509 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF632725FB3B +20240828044510 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF632728D6F3 +20240828044525 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6327A20713 +20240828044536 2 6 100 2047 5 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6327FA0007 +20240828044603 2 6 100 2047 2 C2CE9B70B9DD5860C0846274F1FF29B2E3D5EFFA5A8568C6B9829BD8C42422F0BEE2D6D74503BCD91A002B09EB75174B87734CFFAC12682D49D50AF5B9837E3B30675E93087C5279A431B40D8219B2292A0EBB23ED0856BACF21F7A8C801FC3B0A1D2C76C4372109A24587D8E09F91CA0018EB2FB7D75BDD8FE230D49CC593E2152A7EFB4B7FCAA9228D061120DED56DDF6019817221B4D9A0F5DECF928148EB22AC583AC3BF37541CC285C6BB4E0C028E7140C133B12EB80354C01C053F5B435EA2798404749664674966DFB7113F86BC74FD37333330A664FA86AE1B40006717AC6091961C45164F3714777CC776DB2C7C72FA6A89EF3DEB98EF6328C7601B +20240828044621 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602100B138DB +20240828044622 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602100BA7D33 +20240828044630 2 6 100 2047 5 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602100F35A77 +20240828044634 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD26021010E6E03 +20240828044637 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD26021011F7EAB +20240828044646 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD26021016091AB +20240828044657 2 6 100 2047 5 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602101B2C867 +20240828044658 2 6 100 2047 5 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602101B60E87 +20240828044721 2 6 100 2047 5 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602102652CD7 +20240828044731 2 6 100 2047 5 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602102B160B7 +20240828044737 2 6 100 2047 5 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602102DA0A57 +20240828044755 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD260210367434B +20240828044803 2 6 100 2047 5 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602103A3B7DF +20240828044807 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602103C2D9CB +20240828044812 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602103DE1313 +20240828044821 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602104264E53 +20240828044835 2 6 100 2047 5 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602104909817 +20240828044855 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602105309B8B +20240828044903 2 6 100 2047 5 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD26021056A2A5F +20240828044903 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD26021056A52EB +20240828044921 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602105F6DDD3 +20240828044930 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD26021063AE353 +20240828044934 2 6 100 2047 5 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD260210651B5C7 +20240828044937 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602106651B4B +20240828044944 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD26021069D4573 +20240828045003 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD26021072D06EB +20240828045023 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD2602107C5C8DB +20240828045043 2 6 100 2047 2 E8198A1A9FF997DF62B131D5C187C3160A61128E5DC14FED2EC25E38EE627FC070B240AFA70179A5981739E7F1CC1EFD94BECAA338C8BEFCA1C036EF1F7804AD1BBE8B86C3BDDDA7868F9302E45F47BABB6A8D54E1871678AB37855761AAD6408EA4CEE8B4DE9A5972981B07EAC9CD496331C4E1104ED49ACB5F4F37DC9B98098C04053775DB2994B23CA4561C739DB5A19638C0D1D97C07EF26ADC912A5C6A3506B5E935E4C11E18769334B4D02CDB4802ACE68B55D2D3CD354B0DE2D4DB4727FAD43694110D90A4A18206A731466E83FCE2A6F8E042E1D244F7EA4DD2FF3B9E3910C2B7672E4605A2025BDAA0D67455F8FD50FD241B5074FD26021085D358B diff --git a/usr.bin/ssh/moduli-gen/moduli.3072 b/usr.bin/ssh/moduli-gen/moduli.3072 index ca89b920b..875f08f67 100644 --- a/usr.bin/ssh/moduli-gen/moduli.3072 +++ b/usr.bin/ssh/moduli-gen/moduli.3072 @@ -1,76 +1,78 @@ -20240326014532 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3425DB7F -20240326014544 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A34464EAF -20240326014614 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A349D1663 -20240326014629 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A34C39EC3 -20240326014710 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3544B6B7 -20240326014727 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3574A89B -20240326014741 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A359DA947 -20240326014823 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A361FBA5F -20240326014832 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A36377BB3 -20240326015023 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A37A19A47 -20240326015025 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A37A30F2B -20240326015030 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A37AD1B0F -20240326015038 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A37C0B3FF -20240326015116 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A38348BB3 -20240326015159 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A38BA81C7 -20240326015331 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A39D93F9B -20240326015416 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3A61FCDF -20240326015505 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3AFA877F -20240326015516 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3B1796B3 -20240326015601 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3BA5A777 -20240326015813 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3D516827 -20240326020106 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3F7A7897 -20240326020108 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3F7B337B -20240326020156 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A4012DDF3 -20240326020241 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A409D1FB7 -20240326020357 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A418A36C7 -20240326020359 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A418AC37F -20240326020434 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A41F5DCD3 -20240326020621 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A434E3E3F -20240326020642 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A438BE4BB -20240326020655 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A43ADA137 -20240326020708 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A43D0D1CB -20240326020800 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A44709DB3 -20240326020836 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A44DBD6DB -20240326020854 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A450CF663 -20240326020934 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A458A51DB -20240326021106 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585539C8487 -20240326021134 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258553F5040F -20240326021206 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855453B76F -20240326021324 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855546DBDB -20240326021407 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258555BDDCF3 -20240326021424 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258555F11B9F -20240326021450 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855644DDE3 -20240326021458 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855656D6E7 -20240326021614 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258557488DE3 -20240326021659 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258557D16D53 -20240326021718 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585580918BB -20240326021822 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258558D0013B -20240326021836 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258558F7A96B -20240326021921 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855982467F -20240326021932 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258559A0BC87 -20240326022009 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855A12A95B -20240326022029 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855A4C1027 -20240326022038 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855A608723 -20240326022102 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855AA76F27 -20240326022132 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855B050E7B -20240326022301 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855C2121F3 -20240326022441 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855D60DD03 -20240326022451 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855D7D2637 -20240326022516 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855DC6F6EF -20240326022530 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855DEDE3DB -20240326022711 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855F35973F -20240326022824 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125856017684F -20240326022834 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125856032C153 -20240326022854 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585606C9E9F -20240326022919 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258560B97F3B -20240326023041 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258561B88E3B -20240326023119 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585622F17B3 -20240326023135 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585625E20DB -20240326023142 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585626E1567 -20240326023229 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585630054CB -20240326023255 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585634C7DFB -20240326023307 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585636F2A3B -20240326023310 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125856371CA8F -20240326023417 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258564487EA3 -20240326023451 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258564AFE53B +20240828045540 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DB83F1177 +20240828045614 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DB8AA8ABF +20240828045644 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DB90E7B73 +20240828045720 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DB984B19F +20240828045813 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBA2CAEB7 +20240828045858 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBABFBAAB +20240828045903 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBACAA69F +20240828045912 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBAE15E2B +20240828045932 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBB1CB097 +20240828050005 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBB86CA4F +20240828050036 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBBEDB4C7 +20240828050043 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBBFC577F +20240828050107 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBC490C0B +20240828050136 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBCA8444F +20240828050201 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBCFC24F3 +20240828050209 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBD0E9213 +20240828050303 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBDBBE653 +20240828050329 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBE0AE17B +20240828050406 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBE8344F3 +20240828050430 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBEC9D58B +20240828050438 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBEDF58FB +20240828050528 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DBF858DCB +20240828050633 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC0619997 +20240828050638 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC06A2A8B +20240828050712 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC0D40C6F +20240828050715 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC0D78F7F +20240828050743 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC12FBEF7 +20240828050851 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC216E8EB +20240828050903 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC235154F +20240828050905 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC235B9E3 +20240828050941 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC2AA4F87 +20240828051038 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC36951FB +20240828051046 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC37DE073 +20240828051104 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC3B311A3 +20240828051215 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC4A3904B +20240828051246 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC502215B +20240828051312 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC5506613 +20240828051329 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC57E32D3 +20240828051336 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC58E630B +20240828051520 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC6DF9DDB +20240828051549 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC736A7B3 +20240828051622 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC7A11C13 +20240828051823 2 6 100 3071 2 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC933AB0B +20240828051906 2 6 100 3071 5 F0E30849E47025007BE82AED18F1B234816DC958D27A2133A1FEA5C9D5B00C107D4C3563B295FB10AA1BEFB5C160159F85A69C3990D6A5078FEE7D5462F14890168BF2AA6B06729778AF1CDA95F5EB5FD024D9A4B904FB6501213268D69167449CCEF555129648DA0C6C1500DB898ABAEBE716B468AFDADB8E499D0043B7D4070A957EF41EF2ED3D9DB4EB8607B620C714084F6909D0B980FC54E7BA3A4F7C6716BC8430C5D73475A95F64B8AA9BB6F9CD524EFEC35E322F10DA32826E005EBA1C81EA662FB1517EED4D778DB6658C7D6150F144BBA60DAE6B75499E70CD7D70842131C00E04319DB1B53867E6BF820B1D74692227A574F937B668F25017F6DB3D6FEB2A61F8E377FA73E8652089A0ECBE15AD1CB8C44D738AB114BBE7AB9985545DE182011208113A56C5D84D8E7640517C5EFA28670168906BA869583EFEE72F89C1B3CA019C4D544B711A9A0297911CBEEB124EA9D7076696F62AC9E8814CDA985B35800D4DB253497725F131169F56AF543DD51EED43501A249DC9BF25EF +20240828052009 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BBF34E3B +20240828052030 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BC38F533 +20240828052045 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BC632227 +20240828052153 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BD42ABFF +20240828052207 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BD6986DF +20240828052211 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BD7241F7 +20240828052259 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BE0ECA0B +20240828052336 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BE863B2B +20240828052339 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BE899267 +20240828052415 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BF03197B +20240828052431 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BF33F3BB +20240828052513 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BFBAA987 +20240828052522 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BFD18B5B +20240828052527 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79BFDA82D3 +20240828052609 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C0656637 +20240828052616 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C07626F3 +20240828052621 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C07E39AB +20240828052816 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C2033C13 +20240828052903 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C29B2063 +20240828052932 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C2FB438B +20240828052959 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C35070C3 +20240828053054 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C4050DE3 +20240828053223 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C52F78A7 +20240828053319 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C5E6180B +20240828053339 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C61E1503 +20240828053345 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C62B8123 +20240828053430 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C6B80C6B +20240828053549 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C7B7959F +20240828053758 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C95C0E23 +20240828053817 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C9938013 +20240828053837 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79C9D0494F +20240828053914 2 6 100 3071 5 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79CA42683F +20240828054013 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79CB06EC0B +20240828054258 2 6 100 3071 2 F92C6D0F2F9D19FE24813B351098A85FABD54907EA3F2B1DDC129631277DD947357AAEA3FBDAF717CF7FB244ED5EA7475AA7AB9F8CC8E92BFEBA6B9F4394EFEFDAB17F42338B58FEB6B09CD728221C9261C1FB59A2EEBDD7A974CD3D56031DA903E422D77061725705DC1366F17C530CFB45A704C00018D78004241F3CF6AD1C934F576F8D4C542FD83BBE0C8C3B122063A7457D3A47D1EC0A2266A36ABB664E96959D60C46344757771F7DBD79B25F033CA5E7674DDD2AC03F79C7C8E2B637CF3C9DD55D3FD5BDDB1CEE1B5F57B72B01F91BCD385AF7AD03C183EA95D95D07838BE129BDF7B724A27FC2ED5AF6AE17C995ACDB42C783845342A07BB2318A392B21912B8E4165B1A4688C35FFBB23B733DCD0136373E308F9320A5C2BAF95492F6E4F5964B18917846376B2ADB2E2892B1D51DDC63578DFA361EA5190E39B6E93772B2A3F66CD6B0B183F41A68A31AA7E9A23DDBE383AC2E262C368DC859989BA361A683A9B7F3B158A1BC9ECF4F8669F363DAF10ECE0EB29581CB79CD234BAB diff --git a/usr.bin/ssh/moduli-gen/moduli.4096 b/usr.bin/ssh/moduli-gen/moduli.4096 index 5538d52cb..15e4fa23b 100644 --- a/usr.bin/ssh/moduli-gen/moduli.4096 +++ b/usr.bin/ssh/moduli-gen/moduli.4096 @@ -1,63 +1,61 @@ -20240326024347 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181186E03B3 -20240326024508 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818118EEB0A3 -20240326024849 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81811A4ECE4B -20240326025526 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81811CD141E3 -20240326025628 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81811D32676B -20240326030110 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81811EF7F1E3 -20240326030518 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818120788D47 -20240326031719 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818125002673 -20240326031926 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818125C6B433 -20240326031951 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818125E6335B -20240326032742 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818128EAC3E7 -20240326032936 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818129980033 -20240326032952 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818129AAC3DB -20240326033059 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812A0B8603 -20240326033458 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812B8E0D07 -20240326033533 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812BBB8B97 -20240326033606 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812BE87FF7 -20240326033629 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812C03788F -20240326033712 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812C3FAF07 -20240326034008 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812D534F8B -20240326034204 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812E080CA3 -20240326034508 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812F2F5493 -20240326034751 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181302AABC7 -20240326034806 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181303CD8D3 -20240326034823 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181304F3DCB -20240326035043 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181312A3FE7 -20240326035348 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181324BFA5B -20240326035602 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181331F2E53 -20240326035702 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818133769453 -20240326035737 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818133AA336B -20240326035756 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818133C16B8B -20240326040216 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81813553AD37 -20240326040447 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81813644788F -20240326040552 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818136A4C7F7 -20240326040951 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D80EA89E4B -20240326042517 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D8147E15B3 -20240326042616 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D814D61A3B -20240326043713 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D818FD20D3 -20240326043724 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D819078123 -20240326043742 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D8191EAEFF -20240326044025 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D81A204197 -20240326044258 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D81B145927 -20240326044447 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D81BB935AB -20240326044534 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D81BFCFA6F -20240326045348 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D81F0CEB6B -20240326045438 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D81F582F4B -20240326045630 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82007A843 -20240326045745 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D820792B27 -20240326045949 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82142CB8F -20240326045957 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82148EA73 -20240326050355 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D822CAC6BF -20240326050713 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D8240BBCC3 -20240326050731 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D824214D3B -20240326050903 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D824ACACFB -20240326051214 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D825DF67F7 -20240326051332 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D826515C63 -20240326051747 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D827E42F0B -20240326051831 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D828243B8B -20240326051843 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82831A223 -20240326052417 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82A48CE23 -20240326052731 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82B78A8F3 -20240326052959 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82C5D399B -20240326053126 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82CE5BB4B +20240828060009 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A70951B13 +20240828060511 2 6 100 4095 5 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A726F0C37 +20240828060714 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7335AED3 +20240828061156 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7501901B +20240828061217 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A751A9A43 +20240828061522 2 6 100 4095 5 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A763D53FF +20240828061600 2 6 100 4095 5 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7675A20F +20240828061619 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A768B4D03 +20240828061636 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A769E17B3 +20240828062452 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A79B996BB +20240828062521 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A79E2492B +20240828062623 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7A419E13 +20240828062831 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7B0C50CB +20240828062854 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7B27FC2B +20240828063249 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7CA08843 +20240828063334 2 6 100 4095 5 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7CE52E4F +20240828063443 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7D4D4863 +20240828063548 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7DAC7243 +20240828063629 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7DE88D73 +20240828064128 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A7FCA819B +20240828064626 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A819B3083 +20240828064816 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A8247AB73 +20240828065323 2 6 100 4095 5 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A84385B67 +20240828065513 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A84DF9C03 +20240828070128 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A872AEE03 +20240828070200 2 6 100 4095 5 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A87566497 +20240828070537 2 6 100 4095 5 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A88AEB07F +20240828070904 2 6 100 4095 5 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A8A00154F +20240828071020 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A8A740023 +20240828071247 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A8B633D9B +20240828071353 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A8BC1DD33 +20240828071426 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A8BF0634B +20240828071455 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A8C19F3D3 +20240828071541 2 6 100 4095 2 C1FD462836A96C337420C7007228E616EC573732284C62893AB8CC4E3F3E182E3A2FC77E35BC37FC6A207BB3B56EEAD789DFE450ECA8A88518B4EBACEF11D667EA651A91285ED252C792EB32026784FE21B43F3E4B61DBB0E26D3DC6EE8B9090CCDFA2876C4CABA186BA994026CF4AE3D17DC5A0D1B4D70F58EA021ACA38F9D1EC7CFF066D1F0C1DEEAED46C531E9719664DC3AD0E61FE171E558BD54FB13004B7E19B3AD908A5FDA716B1AFF98F48527F12F755CB53E0ACE01192CD0CFAA0B7623D1E035DED85CD39B69922E719FFD315DEADD6AEA9064B7DBB7F1079FB06C0442AB9E364E2E756D6EA8C07A92E9BB03EA11678BD0AE1ECC81748068B0658EC1E0C54886933C5BC69BED9334255F55748403F957CE5F314D8F154E213068BAC299C0D323623D4FECF1C17601E347500A00F8AFB1FD63C936842FE87831519613BD966C1653F623A42F236CCB0AEE2E81F702C8CC6E560999B686E3C5B4DE07ABD8DE477D0475F5CE1C61D3D8B1919C378D9AC041F21AC522530F7A4D62125D8DB8F8217BDB3E330A04758448AF7093A65591A0E7E82BA13F6F92CCC68AFD64A965D13A7C36ED85916B3EF9C3AB022E6F66A4317AA01B201BED766AFF938563E93784662AF2F72AE5BA52CF2B0C4ADAF6C20689296CF729D5A643A64A20E4380DE5E3C932CD162C12D55650AECDAAA74FEA3C85B534EF588D2693B7A8C5E63D3 +20240828071923 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9B3CF4313 +20240828072226 2 6 100 4095 5 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9B4F5B7EF +20240828072458 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9B5EF31DB +20240828073047 2 6 100 4095 5 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9B82262CF +20240828073253 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9B8EDB05B +20240828074035 2 6 100 4095 5 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9BBE344BF +20240828074440 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9BD60A58B +20240828074721 2 6 100 4095 5 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9BE6938F7 +20240828075138 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9C00C2AD3 +20240828075304 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9C0911F9B +20240828075632 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9C1E1F5EB +20240828080239 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9C432FEB3 +20240828080841 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9C68352A3 +20240828081126 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9C78B996B +20240828081614 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9C9536B03 +20240828082258 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9CBE55E03 +20240828082637 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9CD49EF1B +20240828082710 2 6 100 4095 5 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9CD7A6C07 +20240828082726 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9CD8C1A83 +20240828082826 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9CDEC8AA3 +20240828082907 2 6 100 4095 5 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9CE27CDDF +20240828083210 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9CF4E290B +20240828083415 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9D01153B3 +20240828083603 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9D0BAF663 +20240828083703 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9D11A10CB +20240828083816 2 6 100 4095 5 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9D18C60B7 +20240828084040 2 6 100 4095 2 E36F035A457FE7C42A6DFEA5F5F192B2FB147FA8B29FD9BE0FB4DB472F5668038712145FFD9C047435AAA518C55B975D814D566AA3233887D5C2C886B754D50B133FE132D81A0851637D6085F2289D8584BF5130452AD24DD87D7158CDAC16832D42476486F0EC2DBBCD38CEE963C5E367ADE50C9502735AD3583445AABEE10E63480E3791FFC7BCF4BD5C1F6E9768E1B1D9B6B75E177F95914B6D5F06CA7CB001B15CAD26B9C20565F8351E69B5E6CA74D30E770523BA7E05475050DCF81A3F9B7C38EF1C31447E35543AE5B00E0BB13C63F8F1DCE0397BF523882AB79E2DF4BDF7E18ED799142089E79CE6AC0E562A587B055D9F963260DAA84A1C520A0D46A01138F20B0EAF73300DD4196A403892EC30B2C84860C4EC4A1FE5778512F546F5B813380393D3BABC535668515BEEFA350207C3BFA1502B52A775146FA97E4CBF701C2DC7845FF604EC73052F217185E74813FD18D3EBA6489E0BD00852B156193735F5A34952DCFD4BD493ECD2C9948E9D4436A79B1F5B6BB7991F1253B8B68BA7511EF94B87D4D9843A5A510837C7AFCD7F42A9657C78BA516606F94BC27F1579BBC0776216AC8B96C2D6D485B6C6EE489C504E32A6B4979287D53E42D120D411F849C748B31FCB2CEB1663C813A0E327DCC18242B484CBF5F9191063933EFEC4C6A600C415B0F29365F6DBBD2DE794D7E14D62CFD7F1E570D1A9D26C42A3 diff --git a/usr.bin/ssh/moduli-gen/moduli.6144 b/usr.bin/ssh/moduli-gen/moduli.6144 index 4e8a4b688..2ba335a08 100644 --- a/usr.bin/ssh/moduli-gen/moduli.6144 +++ b/usr.bin/ssh/moduli-gen/moduli.6144 @@ -1,68 +1,80 @@ -20240326060038 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A3C767FD7 -20240326060444 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A3CF77C3B -20240326070240 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A4448EF33 -20240326073131 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A47DAE05B -20240326073415 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A482BBA27 -20240326080953 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A4CB6AE7F -20240326081127 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A4CDF5A0B -20240326093032 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A56B6523B -20240326093454 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A573897EB -20240326093728 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A57820693 -20240326094259 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A5829EAF7 -20240326094948 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A58FD0FEF -20240326101231 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A5BDEBEE3 -20240326101412 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A5C09FFB3 -20240326102704 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A5DAD12BF -20240326103806 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A5F05465F -20240326105506 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A611EE2E3 -20240326112146 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A647870E3 -20240326114154 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A6707EC03 -20240326114315 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A6729353B -20240326122735 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A6CC0FBB3 -20240326123728 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A6DF24D2F -20240326130541 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A71768773 -20240326130743 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A71AF6A1B -20240326132826 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A743654E3 -20240326134513 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A76478D13 -20240326134939 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A76C9E817 -20240326135416 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A7755E8B7 -20240326143409 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A7C397F2F -20240326144117 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A7D13AF93 -20240326150017 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A7F704F7F -20240326150157 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A7F9F468F -20240326150526 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A8005826B -20240326150739 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A8045FDAF -20240326151012 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A808FF207 -20240326151536 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A81343BEB -20240326162321 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5AD9F98F93F -20240326163529 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADA11D7CC3 -20240326163654 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADA142310B -20240326165530 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADA394A593 -20240326171340 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADA5C7FE3B -20240326175630 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADAB35A653 -20240326175808 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADAB62C48F -20240326184011 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB0B50FD7 -20240326184335 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB1203D2F -20240326185246 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB2435AB7 -20240326190020 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB333EDAB -20240326190122 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB34BD947 -20240326191114 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB482E3D7 -20240326192702 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB67FBDFB -20240326195941 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADBAA83D13 -20240326200115 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADBAD40AEF -20240326201633 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADBCB670E7 -20240326203821 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADBF6DC6B3 -20240326204751 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADC094E45B -20240326205334 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADC1441637 -20240326211827 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADC45F0E3F -20240326212459 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADC52DBD1B -20240326214659 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADC800E58F -20240326215635 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADC9314DBF -20240326221037 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADCAE8162F -20240326225055 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADCFEC8FA3 -20240326225519 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADD072DFCF -20240326231305 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADD2AFDE1F -20240326233946 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADD60F026B -20240327001519 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADDA879EA3 -20240327002618 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADDBDFC89B -20240327003415 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADDCD9388B +20240828090009 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F2258E4DB +20240828090718 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F233F2A7B +20240828091256 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F23ED9417 +20240828091549 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F243D1C03 +20240828092905 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F25E8D11F +20240828093653 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F26E25303 +20240828100014 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F29D9C7A3 +20240828100324 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F2A3C434F +20240828105814 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F3151094F +20240828111427 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F33641C63 +20240828113247 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F35BB7B0B +20240828113333 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F35CD9A97 +20240828113540 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F360A482B +20240828115349 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F3862A7B3 +20240828115426 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F386EC997 +20240828120438 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F39B5CC43 +20240828121629 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F3B334FB3 +20240828121657 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F3B3B734B +20240828122545 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F3C524DB3 +20240828123158 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F3D1B196F +20240828130157 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F40EB0D47 +20240828130238 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F40F7E253 +20240828134737 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F46C46D3B +20240828135646 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F47E7985B +20240828144149 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F4DB24103 +20240828145157 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F4EF2EE0B +20240828145816 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F4FB0AC7F +20240828151150 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F515FD9BF +20240828151822 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F5229B63F +20240828153933 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F54CF3923 +20240828154759 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F55E07A93 +20240828161625 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F598D643B +20240828162500 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F5A998FB7 +20240828162916 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F5B1CC43B +20240828163955 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F5C71914B +20240828164552 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F5D2E5D1F +20240828170129 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F5F34D397 +20240828172001 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F6192353F +20240828172046 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F61A3C147 +20240828172320 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F61EF7817 +20240828173414 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F6352E0CB +20240828173441 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F6359E007 +20240828180730 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F679AD6CB +20240828180915 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F67CD41EB +20240828180941 2 6 100 6143 2 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F67D23A63 +20240828181257 2 6 100 6143 5 FC9BE67A111C24C58B9D8DFF78C575F1AC8199BA90C7C86923636AEFB38B41C1282E5A8232B7B9AECD439830D372F7B8D22004BD6BD64F326ABA86F1FEA022C374CDDD3CA3F161873B1D51326B69BC26112479F45CDBBB0DF942D942333DEBECD3E705804408C841D2EA09535C2B5779315396B517A6C628C9E23DE15EEE013BB18D7B40EDEA8655765566F3923B6EEA21853E436480D25D1D7172F02B16814BE600FBE715963C7576E022AAA046EA7D25B4642F7626582BE4ADF0E251A6677DFC67C49260C444D7825A03685A5BD789A13E1AAF1970ED54C71B234682E3AAF67EEFC3875C8868086EE6068A48E6C4E7A7BBEE17505D4AB7E8ACA56E336490553B41E1ED5D023D2D2DBAFC3362D8CDEC1809F4A37845A1DB87AE4D7AE6F6D941B0AF97921C9E659331B524F47EF80EAF574D5961DB05724C17F45686389361D29A234BE063DA02D889905B8B1B5BA87355B60F5FB44CFF859415F439DAC677F1D5A1563B22236386D0CED95BE925C51D22F2173B579B1EBAE7E8B8EDB26A8532FD6DE7E1F33D6BF984BAF3AF00A2C382A7B354C77F029D041FB132BF27C430320DFAD34530246D6CB04D7A78F5364186A9A86B359A9F5FD28D4B9ABCF51BE2C955CF8102D64B322A50FEF96DD5C4D21268D7E044CC52AB57AD26BEFED1634C24BA947F1DBD024BA9A3CD94EEE0DA0CA9FD481BEB41BF6DB6ACF409E732C482643D5D5A5B720B26E618C7AA244B8F7506CB8FC8299195D03E30B03C6263A75AACBC3A32C9A7DD5D7653537125BC0FE7241A410DBF8E04ECCD1486DA3A321EAF36C5A5DC40A0FB262A64727CF7AE645BAF538E8784ECA49E1A277B29C56B8D1AFF2BE2E1665906C48A58230497091B47EF239C5D34FB19C25D89BB0B8573E8417AE90FEEB6FAC06F9F60A6C57F1D4E3325FB0AB1A3A088B4133A319158CBDDCF0CCC2938F64E0029F0389FAC55BFC1F0D0F15B2E70799562C53FC3D1D97CCFA25ED83FF115503D44A7A91FF295AD2F1BC598FE86B8AE7DA77773179A4A0EB0ED618102D880D9963798BF91EB6E16870A4AB9E8137E1D6503ADD39D8E8F683B05BF +20240828182555 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3180CE228BB +20240828184406 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3180F2F287B +20240828185315 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3181059FDFB +20240828191106 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31812A21FB3 +20240828191122 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31812A28277 +20240828195243 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE318180489DB +20240828195610 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31818728F67 +20240828201325 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3181AAF829B +20240828202233 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3181BD9FE33 +20240828202820 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3181C96132B +20240828204913 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3181F3FE8A3 +20240828205946 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE318209CB6D7 +20240828211537 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31822AC1387 +20240828220459 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE318290F4E1F +20240828224012 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3182D9E3A03 +20240828232844 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31833F1DD7B +20240828233400 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3183494A423 +20240828235802 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31837ADEA57 +20240829001115 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE318395E7B83 +20240829004718 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3183E0E5603 +20240829004844 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3183E34D98F +20240829005431 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3183EECD0DF +20240829010933 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31840CEA00B +20240829014049 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31844D61FFB +20240829014355 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3184533474F +20240829014829 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31845BEB5C7 +20240829015142 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31846235FD3 +20240829015517 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3184695C7FB +20240829020608 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31847F7E373 +20240829023600 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3184BC56B47 +20240829025737 2 6 100 6143 2 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE3184E74875B +20240829031846 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE318511B9B7F +20240829033452 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE318531C0F27 +20240829034004 2 6 100 6143 5 C272750D88E88AEF9E0F2188FF6C61DE6B22B20E1C1D5A5E5B13A9C97ACB497B050868137519E1EC9CAEC9ABE3D69DC4C96ADA353B3809627C938691FCC17E260254A0ABF1FB7629416CF61DE72AC7B91EAC39F9A9CC38B729272D78976679C9F93E0E67BAC79B88598FA5B160A9403FB851D2046A6A319C55E028AF6AEDCE7588403635FDFEABCF52C2EB9D7CB86F1CEB17DF39D951744D332D51302626F56AF310A3E20B3BED391B713FF8589D35E44DE1DA41D70EE06762C2789444107C50101D55738975C05B61243016DBEFAF2521C724FCFF279D34EE418052A2AE927474EC5C055ECAB0B2E1F5E6EF378EEB15A7ECAB59638A0A7163577121789E3301236F63178910C6AEDEC6664DED0F0762D6F6854B44BC811A03E8627DB90D7A2E9FC85D32B498E8E5A92BC771A6D9C8E9A967F3EC3C0927926021B97FA8A201C22422BD61E330920F35AE966B43CDD8B6EC853AA8F1CE0C1061C152826F9769746EA7E06325B50A9C3D9B7A88C5D22B68556E24ADD0664F0230DF4896F53319223F39D68B6507E213ACD50EEDE83AAB51E3C4B020B6F0B0AB06CB071460D139DC597ADB530E51FEC7EEF6D5111BA3A7EE874B4708ADC8186D2D5326DBDF692E60C6170AE64590151BB6ECA0AA51E6233148C7D78034812FA93C6A7F7864182D576BB83714C3A4E17228B0D4569F70C451632477265A2A40B9419A13408BD7C3B33979589A112D6156484AD84560272D7717F763507AF92C86F4475669962B63A2BAB2EE0CAA835B90A7DB43CF8A2879674B60B1B1EC25933019968455AC054BCA392EF57C3C76D79AE684894BD009B97AAC3754537E85C93C9F96D59B8359C055B1B7109086E4DC7F55CEB628BFAB792B931B955AADA57FA6A8CB019B1ACE092199C0E5F94855DFBB08E3DCA886337842F363B8117751C5DD48DD431E903C2B1C7677FE2AD42A0CCCD2677B9A4774E9168A2C4C1B8EA5267971D0DD6BB91320A677928D2087069C7D460BB4E72698AED4F7127975D49F87D52724DE830C66F422547D0B934F32F4E9FC0617A6D2BB022987EE13330BDBA970A8FAE31853C097B7 diff --git a/usr.bin/ssh/moduli-gen/moduli.7680 b/usr.bin/ssh/moduli-gen/moduli.7680 index c29c0ffd1..00817e6b4 100644 --- a/usr.bin/ssh/moduli-gen/moduli.7680 +++ b/usr.bin/ssh/moduli-gen/moduli.7680 @@ -1,64 +1,81 @@ -20240327012525 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123BF06ED93 -20240327022256 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123C2EB1D03 -20240327025321 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123C4EE6D8F -20240327031901 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123C6A6ECFB -20240327034252 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123C84AA3F3 -20240327034558 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123C876E36F -20240327035607 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123C91E770F -20240327043824 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123CBF90753 -20240327061734 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123D2A46DE3 -20240327071503 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123D6765ED7 -20240327080706 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123D9FC24D3 -20240327091530 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123DE8C18AB -20240327092725 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123DF4D10AF -20240327100400 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123E1BE884B -20240327102109 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123E2D9E9AF -20240327111646 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123E69B7CAB -20240327140134 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123F1C97CDB -20240327144258 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123F48C6AEB -20240327150511 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123F6023BEB -20240327153839 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123F8480A9B -20240327160724 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123FA2AE0EF -20240327170619 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123FE1F90CB -20240327201733 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A541240B20240F -20240327202608 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A541240BACBC77 -20240327204230 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A541240CCB39CB -20240327220340 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A5412412509EF3 -20240327230112 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54124164279BF -20240327231350 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A5412417159137 -20240328011850 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A541241F8FAF0F -20240328020121 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A541242268881B -20240328020416 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A5412422921477 -20240328035516 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A541242A164FCB -20240328051250 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCB60A9A5B -20240328061956 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCBA8EE4D3 -20240328083541 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCC39DE953 -20240328104001 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCCBE8F2FF -20240328123936 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCD40450AB -20240328131851 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCD6B3842F -20240328133514 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCD7C761BB -20240328163521 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCE3D44693 -20240328184556 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCECA94E8F -20240328185443 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCED3C2EEB -20240328190404 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCEDD4DEAB -20240328193132 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCEFA3B567 -20240328194029 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCF039E777 -20240328205320 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCF523DF3F -20240328210032 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCF59C775B -20240328221220 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCFA7B3FEB -20240328221329 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCFA863653 -20240328222505 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCFB420393 -20240328224858 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCFCDA54CF -20240329004423 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD04B953EF -20240329024223 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD0BE0B937 -20240329035503 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD10BA6927 -20240329035634 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD10CC8C1F -20240329035914 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD10F42063 -20240329045640 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD14CA5323 -20240329050935 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD159E9383 -20240329053141 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD170D04C3 -20240329054343 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD17D323FB -20240329062142 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD1A5DB2DF -20240329073301 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD1F20E86F -20240329074920 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD20377F03 -20240329085033 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD242F4BCB +20240829043625 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD187E5F08523 +20240829053823 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD187EA33BB33 +20240829061611 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD187ECC3E213 +20240829064111 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD187EE73FD37 +20240829065111 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD187EF1CB167 +20240829082003 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD187F52294C3 +20240829091934 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD187F92CC467 +20240829093659 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD187FA58CCB3 +20240829103319 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD187FE2DC683 +20240829123824 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18806C1B393 +20240829130958 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18808EFDAAB +20240829135456 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1880C119733 +20240829150211 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18810B3AE03 +20240829152452 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18812362547 +20240829171859 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1881A26609B +20240829181704 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1881E2C3E3B +20240829182818 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1881EED38A3 +20240829184006 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1881FB9391B +20240829190814 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18821A70EA7 +20240829195154 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18824BB04C7 +20240829200011 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1882546EC8F +20240829203003 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD188274D620B +20240829220907 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1882E2608EB +20240829221444 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1882E810C9B +20240829222440 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1882F2EBA7B +20240829230449 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18831F68C1B +20240829231044 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18832552757 +20240829233827 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD188343C3EAB +20240829235120 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD188351A81B3 +20240830003221 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18837F06443 +20240830011832 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1883B1C9E73 +20240830013013 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1883BE3681B +20240830014610 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1883CF597DB +20240830032931 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD188443580AB +20240830042102 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18847CB52C7 +20240830042255 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18847E4A687 +20240830052035 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1884BDB09B7 +20240830053449 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1884CD217AB +20240830054036 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1884D30808F +20240830060721 2 6 100 7679 2 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD1884F02040B +20240830071657 2 6 100 7679 5 EF541828E23A6BB90EFE9D9BEEDD3F9DE2E08069B8FD3ED88F27CD7E4F00AA272010368A26104FDBE69743D020951E909C76D9EF11E8050208720244763E9D59526B99F462FAC17E3A1ABD3B328C80753B1777D032397E4E3BDC90FB275DE027A21362A8FF88456ED3A9F397C045745B0C4D090D10304B86631AE9561AE9FD3C9FEB4490FD074E78702F4187A8E5CE8E7AE1E66593C34B9F08153994E70FE56B9CA823FCF1C176E875F6654CCECDF52463CDA61BE848C5B0E9CFF4E908CD0AA9BD4F4A58DF5996AAC3D411270CAD4BAC154467F91184713B4EFCFEE7922C8F58F9259937935A94A7791E99F4838EE1981A3EC9E6A2C44CBC10ACE390882CA40592D13E91AF49C78C4D518D9EFA98142A9102970E721D6ED83981164C488AD25BBC424C235C7AF62C4B4170EFFC11FA6EBEA4661D320013FFA6A4DA1EAE2F0545B95FD4E13B182BFEC226A01C3B46229FCE86A9E11B3E026326C1BA745510DDE4FCEB777BE42D1057DAD45ACEAB111C907760669A0C1F15DA4F5B8180E844DD5D602F7FAE7D16A5E8A2929E804A1BD17D38866A5EE3B1F50C3054C5E397969BCA2008DC96503513217BE8D2F15FB9DA26A8A5FE981111EC64CBEE1420D2DF7853B17E40766873E712977C1043237B39E2DE3868D079D96D76ACB24123AFDB5C6A6A9BCD40ED4C696EDAC4FE015CA982535A2A84B1A42767E1FBFB936B9FBD72CF98993C6B1EBDA16BF03FE325FA62511128CB669EE148067ED9A10338F87E4D3D39FE695A2F99B5D645A7653C3EBEA517FAFDD9CFF12B54E947A64BE8564A3851EA0F7A09C8C2E3D78FE0D3739ECA465A81194B8760F4F7213737C3FBE0E2F13704E7FDE2EDC91E22F1B76327CAA49BEBCDB1A33F178DA6F38666D09942532843CD95E61891A54EE7745D731FC2AD6B434D42F300D19176DBDD94594E3EB018EDC8666E89FB4C205A3D70F07F96AFA887F6D4A2FE573E77FDDD28D76F5C15C34CADDA8B9652FBEBEAA4CF56260833B160E8122141D17DE72CAF4859EB84CCACC341B7790A2D9B297538549451FBA5C47A37C7A99E31AED087BDF7F9E79D99CB6FADDBA30ACD5CF06FAC18DE33A94A8FC08ED8D93A24CDD7DAE09CD8CFF1C918173B32C10CE0F5EE9ED40D2BB3173370E941158C448617E4251E522CCE793B1A4399E8A39B923BC594AB453CE0145ADD622DCDF98D7D9A1E3C3C4BF128194857AC3959468BA2C2540EB5438D165F04D0A0D15BD19A5EBA1F7D6F82848877E480A20859C002F448716156AAD2008E4A7694E4F4C346C4EF359B21BB984C2073FE3E95DF3B183EFAC45BC426E3A569703F6C48DB20F7A32CB7E7C2ADD18853C7A8E7 +20240830084720 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FEF75703DB +20240830094656 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FEFB626A2F +20240830095006 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FEFB909467 +20240830110930 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF0108EC1F +20240830112637 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF02315BCB +20240830113545 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF02D19C77 +20240830134211 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF0BA3E697 +20240830134427 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF0BC3CC37 +20240830134817 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF0C009ED3 +20240830145923 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF10E44067 +20240830161320 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF15FCEA4B +20240830170319 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF197243AF +20240830171339 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF1A211BAF +20240830173745 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF1BC7E24F +20240830181908 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF1E96C5DF +20240830181940 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF1E9711DB +20240830183135 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF1F5C367B +20240830190740 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF21D6FFCB +20240830192133 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF22C8073B +20240830213430 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF2BE900AB +20240830213722 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF2C10C36F +20240830221923 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF2EF2814B +20240830225347 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF314EE303 +20240830231356 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF32AF8B0B +20240830234723 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF34FE61CB +20240831004647 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF3918C417 +20240831020149 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF3E4B559F +20240831022637 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF4002F243 +20240831030552 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF42BB548F +20240831033741 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF44F1D9D7 +20240831034841 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF45ACBE37 +20240831035452 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF460E12C3 +20240831053706 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF4D2CFB27 +20240831055400 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF4E512613 +20240831073419 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF5532694B +20240831074414 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF55DB1637 +20240831081807 2 6 100 7679 5 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF583421DF +20240831090302 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF5B405DA3 +20240831093205 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF5D338B6B +20240831103110 2 6 100 7679 2 D5949FC6991BCA2FAE324A3249CCAE8A99AEB0E6E81054670B5BCEA51FAB2D6C0A271648412828FAE2E356A85355BD9DF43DDD71F82F93494A6E4F0F78E998A4B13481478A814CE13A471D3BC48EF5A2BFDF48E920696BA74DFE2672ED7FC456B46C6CE48C129701E0D0DE344FED8581E2F1D010735EBDC6E9683D892CB2C2A164B500A5D2A9A41D8FCE24CDFD4A8DBAB66671B3FD8B6275C3482A10A73D2C1FD50627B4AAB5F81C67FDAA3D3AD28E916D9DF4F6E9035BACC614A3FC352650DCB94BBB4C3E40CDF33B242FC97C9D5BF655DF4672F496FA8B619B515DCB37932CDF25313659B982542675BA0300768C7BEB3EEC64BA9E0EB247B0B9D000E0BB07C3E054B5DAA9CE521C54EF0A1DC00203A4F723FC2361DAD5AC276C723044DD3B56A3B4C38C46CD3E9510AD9264BCB2AE52EA59F4B3CD500B7134135784D994C42CF8DCA5E90937C53A19D8DD356BB868CCE05A982F7204F1D3C19CCD16873CBC7CA44BA2D34B57E63F092B93C075530ED66177BE42F1677E4EB1A18EA0ED62C654F04B68DE9DD4A9C1AC509CE5DF1CF266C6A16696F858C024C16A95AF16105D9E778BD3A9FFE09CCBE4454EFFE6A309F629434FCB894B42BA2FAD7C4BA7091301422C347ACCB39FF801F97F36B3464A7B84C4C4A85503DD7BCFD97462AFCFDE1CF4C8FDA6FC5019B262C3E58C77E28BED5A2583B28DBA0E59D5665E7A5339A02C976FD31B4797DB945851DE5164A9AA3359F1A35E31357314DB6C82B5DB62D70BB7C22B3C110A0495E2B7200104FBD230C9C11824601EF4FA78ABDA0D5BF866B2CA6087E20AB2C8FBE1FFCEA5D19F11EB801002A801D9A72678009269FEFE57A4B8D389047D05F03C5472F5FB731C5BB3C5E2A9BA907D496E10FB953D953F650602639F37EED2F65424056F92CDCAA33DD65E714EF3D5419E7B4C1CE77A40D441962F2D42135ADD4951E90CC0FC85C2946C82F74C9B1398D6A086BC7EAA1763173AEF572969FA738EE079BF5C5EFAF8E4D99DB8618E646876342CC8BF3B1A62F969265FB633700F4CC598AB407F84BD2B1AD496AF8E785063078688A86AD6B4E4ED2CA31AF2F7899D0AD613A57BFA5746F743A62F66105DEEEBF637D9ADCBF941E4728DDD5D03AFE58EAD827B154BD22C00A94822A240DFE575479E9C00E38064BBBD1A5B511957045BFE40951312B2F5F5CC45CD94823AFC0CD2BE902C2E9DF92D87C8E24308E788EC48187B2EB69516AC9D7CA97C0E1C610320AFDC5767FFAFBBE16EA80B8E2CF1AA030FD86E803A19CC2BEF8CDCF8A7A1BCF82A1ADE289ED2733AEFAFA82296C331088447B110D8AC831708F631EB967936B2FF61456293 diff --git a/usr.bin/ssh/moduli-gen/moduli.8192 b/usr.bin/ssh/moduli-gen/moduli.8192 index 94c362ab8..14b172457 100644 --- a/usr.bin/ssh/moduli-gen/moduli.8192 +++ b/usr.bin/ssh/moduli-gen/moduli.8192 @@ -1,70 +1,72 @@ -20240329121808 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C124806CA43 -20240329122442 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12485AF08F -20240329153134 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C1252D3F0CF -20240329155254 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C1254053513 -20240329161124 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12550A7BDB -20240329161738 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12555C651B -20240329174531 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C125A40EEC3 -20240329191732 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C125F71710B -20240329195323 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C126178458B -20240329204827 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12648DD15F -20240329234203 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C126E5A5097 -20240329234306 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C126E615ACB -20240330005652 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12726F6443 -20240330033619 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C127B69FC23 -20240330044619 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C127F446BC3 -20240330054010 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C1282492493 -20240330055823 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C128344D603 -20240330062335 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C1284A06C1F -20240330082107 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C128B2D4E73 -20240330083555 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C128BF7E127 -20240330084121 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C128C3C894F -20240330104737 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C129350C1FB -20240330112334 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12954A50B3 -20240330133619 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C129CB0C66F -20240330135122 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C129D7F94B3 -20240330141203 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C129E9C046B -20240330155328 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12A438CDC3 -20240330164337 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12A6FF833B -20240330172236 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12A9222D1B -20240330193325 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12B07FB5BB -20240330201458 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12B2CA43B3 -20240330212712 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12B6C88EF3 -20240330225844 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12BBE67097 -20240331000148 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B73EA509F -20240331002043 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B74F19237 -20240331015303 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B7A08A157 -20240331021926 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B7B77B293 -20240331031147 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B7E5DF07B -20240331032001 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B7ECA5C3F -20240331054028 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B86B76577 -20240331062300 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B891AC21B -20240331063150 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B898D590B -20240331064453 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B8A3FB29B -20240331070343 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B8B4728B3 -20240331082004 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B8F78FC67 -20240331083046 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B90063753 -20240331085336 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B913BDDA3 -20240331104948 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B97AD8FBB -20240331121935 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B9CBCB66B -20240331125021 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B9E75E9EF -20240331131006 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B9F876B2B -20240331135555 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BA21BA983 -20240331154257 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BA8151143 -20240331171643 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BAD603A0F -20240331180835 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BB042B533 -20240331184114 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BB20E55D7 -20240331190024 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BB31FB5FB -20240331193130 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BB4D5DEF3 -20240331203633 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BB878F90B -20240331215848 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BBD220A13 -20240331220718 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BBD9694FB -20240331234057 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BC2D1D8B3 -20240401015736 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BCA81EB2B -20240401044749 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BD41C3C93 -20240401051819 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BD5D2C057 -20240401061504 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BD8EDA743 -20240401062619 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BD98C438F -20240401095349 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BE51ECC83 -20240401133450 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BF189CF03 -20240401134927 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BF2540457 +20240831121754 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB1349E143 +20240831124443 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB14CB7AFF +20240831135558 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB18CC80A3 +20240831145738 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB1C36864B +20240831165313 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB22B0FAD7 +20240831185249 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB29880B2B +20240831185952 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB29E5889B +20240831194619 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB2C7FC84F +20240831230544 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB37F47B7F +20240901001522 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB3BE4A76B +20240901013228 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB404463B7 +20240901015829 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB41B1142F +20240901025646 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB44FDAE87 +20240901031615 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB461000EB +20240901042008 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB49A1BE47 +20240901044227 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB4AE1A82B +20240901064528 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB51D37F37 +20240901073955 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB54DB30B7 +20240901080825 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB56740653 +20240901083546 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB57EF4EAF +20240901093005 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB5AF60F7B +20240901122015 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB64814643 +20240901124800 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB661018A7 +20240901134700 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB695D723F +20240901135853 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB6A06CAEB +20240901140005 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB6A0E0D2F +20240901141551 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB6AEB6337 +20240901141841 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB6B0A7C53 +20240901144342 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB6C6CC963 +20240901151624 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB6E3F7CCF +20240901173158 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB75F13437 +20240901180438 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB77CD90AB +20240901182042 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB78AD2B63 +20240901193908 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB7D18983B +20240901195652 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB7E1244DF +20240901202100 2 6 100 8191 5 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB7F6CD3C7 +20240901210156 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB81BA121B +20240901220732 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB8571A7D3 +20240901233244 2 6 100 8191 2 FE0FE5928DE815B6A6B360EA50D7859C014FC47CB277FE8AA545E89E2D34791ADC80654D6B276978CAD4E12481459D6E40E32CD8500BBE14ABFBD4E72A14280C66F25A30CB81F885761B07BABB863C9DA0ABEA9EAC4ABB8BB272AD3ABA2B808CB6B12A4A5D68AF9B47FBF91C1AA08C7738B911583E29F339BFB9C46B193071A3BD7297521767A34B002F0EB1470246325AD1D48E7C7EBCFEED0866747ACC8FB2C731FC1D73C52F3868C1071D92BDF96037BBAE974A789968F22ECB1CBA7129FD2D524F0D4109DCA2E056483DDBC90FA159982AEB86F929E0D05188B4434C0AC1F071B6F431D08201E683F95CE6D2B4FA354E74F346144E52DB92A0F468ACCC0F8AE53C8BD1818CC577F65DE4188A6E2E10EB84FF9A31B04506E2E8ABD48FCA067B44348667922B7479EBFB9E6E5B8583C4AED84CEC8CCF3A3C3082A3519D2EE53917A09BBE4A52D1F8EA458F493D9D272B49529E6FD509A4EBC7E0927ADACF86C5C8BE31DE98EE65F3FA6CCDB9C308971118C68AF076C64A42745E9485C79AD78880C9DDD03D9529A71C4AE4D8A976C6461119E8CB44536420EDF4AC2499748F3078A1749E6FB4F8F8DCBE64962610695F1DB0BE4FE879A34D7A9BC94DAF492A9259C521F690EC1B00966F855C4B42C2D189B8AFDC34CFE3D49D974820287EE978495D640D80766C4CCA16D92117610A7DF97F444FC5B9B72C10BB8D632255C465F4128092C57B99426E4B0FD336BFC2455538E48FFCDC8CFFFC2064FFBC5FC0FA3CFC6A37140EBADEBF6C1F60C32F650C42988212D00CFFE0DB9D975F991A950D2D8C6B47676672EDB553FD8AA505E69BCCB9C89096FF1F5F5369F285EB8CE629FA7B56923824C3FFD7A2050471A4D90EC9DF24C22D9427267ACC6A13AABA1710B9469EE96E106468410866076B98D19B3E36F4CD052B89A35786D318FFE6EC0805E73A23E41C79B5287E0FC7618C2B4AA89CA27C8DEB5D016109ABEF7651589F4CBC413D3219945E35D243E8A6D3908735B01333F527C9CD10E5F0B2467C9F3623BCBC0008106B6732BD0CCABEBC331A463726BA783A8C036339D60B6B9AF8671D2AD57E07B6C445F23DD6B6FCF82F7B856FFCCC57A5C0B1D53F2E7930107B24009AB14883B20371E427A4FDBB0EFABB9B182071FF7BD4675D7CF47CFE9C17D9B9EFF98210EAF8D87638848AF6A6E1A5DE6AB975C96DE99352B534F639697EB6463F5F66A8613E24E462C92518A663725C023F18975A943FE89E9EF2C075F0FCA2AED88C2D61D0BCBE05629A88CA424A70B7EBEF17ADFC9005531FC01E2132C6AC685B36CCAF52DA039D0139E7E52E435374F4FF898005B84E75CACF730D262E66977FA18D5653538E9D7DF66B5684D7E3107E9F4A7A5EA5949A292D2CE9EB0B2AA76D737623614130364318DF1EBDE95676B507EF5CC76F08A8FB8A40CE93 +20240902012852 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D46ED77CB9B +20240902013705 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D46EDE42B6B +20240902022309 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D46F07C42B3 +20240902023700 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D46F13D6B9B +20240902033157 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D46F444A467 +20240902074115 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D470264825B +20240902081217 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D47041D069B +20240902085634 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D4706993BE7 +20240902095212 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D4709C080DB +20240902103310 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D470C00A7DB +20240902113925 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D470FB7C81B +20240902145636 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D471ADD1BC7 +20240902162039 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D471F910B07 +20240902162513 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D471FCD9837 +20240902170958 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D47224EBF47 +20240902195925 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D472BED92A7 +20240902201041 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D472C8835C3 +20240902212334 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D4730A0A15F +20240903001824 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D473A91EE3B +20240903003705 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D473B9B08CB +20240903010010 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D473CDEB7B3 +20240903010348 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D473D0B3A67 +20240903034119 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D474614297B +20240903040728 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D4747910563 +20240903051146 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D474B45E3DB +20240903064823 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D4750BE2633 +20240903064907 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D4750C0835B +20240903101831 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D475C6B64DB +20240903113322 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D4760A047BF +20240903122505 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D47638D75FB +20240903124220 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D476482E71B +20240903133142 2 6 100 8191 5 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D476752BA3F +20240903143834 2 6 100 8191 2 E90C219E279F374756F460D972C0503655CE6346FD0F611E8808CD4ADDDCE308981860661516592055313E99D7CC26BBCEE76FDE697801AA2827379287137910127F9107DEA68C3FAD7DBC9DADC15102DA2C4D890186E4279C8590E5D3F90E1B93EAFA540386086C4B55AE83AE5C7EB5FD9478B16F1143BB97202E24CE3FEE6E314B308A8CBC1F2938D7013654B6A5D141D4422375EDDEA2C2011231C5C83F318FCBE6A8FBEA20D8E9C2618D45DEBE36611557447900B4B8248A25E4D523C3D9DCAB1F1C1A7CE5EFD7FA4B1BF34486F5737F61A94C20D9268CCC52785FBF8CE06D605997A8DE54E76D7F566582C8C064E244151FD43E7B97368891F274FF1D1EBB9627BEBE9B9B202E656445873198D32286D9D8F9F0387D3ABC6C0C74C9FEC8FA935C5F43287AA191591A6ADF80EBD6EB5B58C2524BE2E2E3000A25345A7D082B7AD136133E87B4BFED4C20EE58055EDA6E9D2E2F15E299D14E11919F2C3029CE1C818D5D30EA68D0458F3B1AB30923F55F84A3BCF14137B547D56CA353F3BB7EC6F22705CC0B14FBD8D7E869325B688AA759C30FAFC74A01567BD785F4ED1F0ED1B7B82F00467A687EC3BB12A246B620B2FE0B9783C222F999CCB7CEF6FA2E3FE4DE652FC0C4B21FC4DF2CEF7981F644FB2158B208C71C68C6974D4D1090C830379707BC30C7748487EB922A4B40CB0FE33B5B4A8E22354ADB2020315D043706D608B1213A2974ED5CC6EA8A520E3147667DD81F4294313AF935C528C82B659B7A169F4B11CD03A3D35546A4E4E2FF79DB6173F3A762B22EBE4BE5B49DD4951A6BC27D5EDD8486E2105561B9BE23F1826BC0579A482AFFD99508E09F17A20419F56A31AEFADCBF816706BC1B47420A7C66A19AF1A725D691CED949F9135404B35237E6B07A037F87F4515B7F1FD5B2A7B3B562ED121A12C1B4BF9E408A0221922B10B78B9D75B81381853BBF734BBE33E12602D4191BCD47B57FA20803F1D75FD4D5A077D50DD537A6B38AB09A1A3C1B30845A0D92AA38BD1B7D1F1AA1AC9FE9CD0A0DE23BD1943A99793D18FC08BD9D7744B62D460263F879087A996FC2868675FE43F7026C6C3C93187C629AF58038F61E3072D8A4B42ABFD1639C5F2289E0A974FFBBC67FD2BAC657BC3C582664A6AD8B940E8F8596FDB8B6429C1A1F06AB1249C9A03F271F66550503E9613277D38DC63031F21AA7C8C9B2D91D6F6B7C036BAB18B5FC8900E4679992DE4BAA2CF202787D521D1545AF4A090E8E17F7E8012C104791D2F6025A41C543F9D85C1DD3EE5757CA2445697075C87D0334FD0F5C9AA8EAFF4A8A4AAEDBE7F2C80151066C7A0F05B3A6B6E5EFD1DE7FE9C53421A00BA9917C732D4735ECEE42CDE994FA6DE2C171207B2A4ADE76EC4411C2171F7C7A0E05C37E3BE842F224A3F8FF6A55DC806FC3F7904147910B6D476B1AC6BB diff --git a/usr.bin/ssh/monitor.c b/usr.bin/ssh/monitor.c index a36520b03..f3407972a 100644 --- a/usr.bin/ssh/monitor.c +++ b/usr.bin/ssh/monitor.c @@ -1,4 +1,4 @@ -/* $OpenBSD: monitor.c,v 1.246 2024/10/14 01:57:50 djm Exp $ */ +/* $OpenBSD: monitor.c,v 1.247 2024/12/03 22:30:03 jsg Exp $ */ /* * Copyright 2002 Niels Provos * Copyright 2002 Markus Friedl @@ -529,7 +529,7 @@ mm_answer_state(struct ssh *ssh, int sock, struct sshbuf *m) (confdata = sshbuf_new()) == NULL) fatal_f("sshbuf_new failed"); - /* XXX unneccessary? */ + /* XXX unnecessary? */ /* pack includes into a string */ TAILQ_FOREACH(item, &includes, entry) { if ((r = sshbuf_put_cstring(inc, item->selector)) != 0 || diff --git a/usr.bin/ssh/monitor_wrap.c b/usr.bin/ssh/monitor_wrap.c index a2ff0f8db..d658a69f7 100644 --- a/usr.bin/ssh/monitor_wrap.c +++ b/usr.bin/ssh/monitor_wrap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: monitor_wrap.c,v 1.137 2024/10/14 01:57:50 djm Exp $ */ +/* $OpenBSD: monitor_wrap.c,v 1.138 2024/10/22 06:13:00 dtucker Exp $ */ /* * Copyright 2002 Niels Provos * Copyright 2002 Markus Friedl @@ -269,7 +269,8 @@ mm_sshkey_sign(struct ssh *ssh, struct sshkey *key, u_char **sigp, size_t *lenp, if ((r = sshbuf_get_string(m, sigp, lenp)) != 0) fatal_fr(r, "parse"); sshbuf_free(m); - debug3_f("%s signature len=%zu", hostkey_alg, *lenp); + debug3_f("%s signature len=%zu", hostkey_alg ? hostkey_alg : "(null)", + *lenp); return (0); } diff --git a/usr.bin/ssh/myproposal.h b/usr.bin/ssh/myproposal.h index c1459054a..8fe9276c2 100644 --- a/usr.bin/ssh/myproposal.h +++ b/usr.bin/ssh/myproposal.h @@ -1,4 +1,4 @@ -/* $OpenBSD: myproposal.h,v 1.74 2024/10/06 23:37:17 djm Exp $ */ +/* $OpenBSD: myproposal.h,v 1.77 2024/12/02 14:06:42 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. @@ -25,9 +25,9 @@ */ #define KEX_SERVER_KEX \ + "mlkem768x25519-sha256," \ "sntrup761x25519-sha512," \ "sntrup761x25519-sha512@openssh.com," \ - "mlkem768x25519-sha256," \ "curve25519-sha256," \ "curve25519-sha256@libssh.org," \ "ecdh-sha2-nistp256," \ @@ -60,8 +60,8 @@ #define KEX_SERVER_ENCRYPT \ "chacha20-poly1305@openssh.com," \ - "aes128-ctr,aes192-ctr,aes256-ctr," \ - "aes128-gcm@openssh.com,aes256-gcm@openssh.com" + "aes128-gcm@openssh.com,aes256-gcm@openssh.com," \ + "aes128-ctr,aes192-ctr,aes256-ctr" #define KEX_CLIENT_ENCRYPT KEX_SERVER_ENCRYPT diff --git a/usr.bin/ssh/readconf.c b/usr.bin/ssh/readconf.c index 48716af2f..de577cd46 100644 --- a/usr.bin/ssh/readconf.c +++ b/usr.bin/ssh/readconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: readconf.c,v 1.392 2024/09/26 23:55:08 djm Exp $ */ +/* $OpenBSD: readconf.c,v 1.394 2024/12/06 16:21:48 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -163,6 +163,7 @@ typedef enum { oPubkeyAcceptedAlgorithms, oCASignatureAlgorithms, oProxyJump, oSecurityKeyProvider, oKnownHostsCommand, oRequiredRSASize, oEnableEscapeCommandline, oObscureKeystrokeTiming, oChannelTimeout, + oVersionAddendum, oIgnore, oIgnoredUnknownOption, oDeprecated, oUnsupported } OpCodes; @@ -313,6 +314,7 @@ static struct { { "enableescapecommandline", oEnableEscapeCommandline }, { "obscurekeystroketiming", oObscureKeystrokeTiming }, { "channeltimeout", oChannelTimeout }, + { "versionaddendum", oVersionAddendum }, { NULL, oBadOption } }; @@ -2417,6 +2419,28 @@ parse_pubkey_algos: } break; + case oVersionAddendum: + if (str == NULL || *str == '\0') + fatal("%s line %d: %s missing argument.", + filename, linenum, keyword); + len = strspn(str, WHITESPACE); + if (strchr(str + len, '\r') != NULL) { + fatal("%.200s line %d: Invalid %s argument", + filename, linenum, keyword); + } + if ((arg = strchr(line, '#')) != NULL) { + *arg = '\0'; + rtrim(line); + } + if (*activep && options->version_addendum == NULL) { + if (strcasecmp(str + len, "none") == 0) + options->version_addendum = xstrdup(""); + else + options->version_addendum = xstrdup(str + len); + } + argv_consume(&ac); + break; + case oDeprecated: debug("%s line %d: Deprecated option \"%s\"", filename, linenum, keyword); @@ -2673,6 +2697,7 @@ initialize_options(Options * options) options->tag = NULL; options->channel_timeouts = NULL; options->num_channel_timeouts = 0; + options->version_addendum = NULL; } /* @@ -3380,6 +3405,8 @@ fmt_intarg(OpCodes code, int val) switch (code) { case oAddressFamily: return fmt_multistate_int(val, multistate_addressfamily); + case oCompression: + return fmt_multistate_int(val, multistate_compression); case oVerifyHostKeyDNS: case oUpdateHostkeys: return fmt_multistate_int(val, multistate_yesnoask); @@ -3617,6 +3644,7 @@ dump_client_config(Options *o, const char *host) dump_cfg_string(oXAuthLocation, o->xauth_location); dump_cfg_string(oKnownHostsCommand, o->known_hosts_command); dump_cfg_string(oTag, o->tag); + dump_cfg_string(oVersionAddendum, o->version_addendum); /* Forwards */ dump_cfg_forwards(oDynamicForward, o->num_local_forwards, o->local_forwards); diff --git a/usr.bin/ssh/readconf.h b/usr.bin/ssh/readconf.h index a1e43852c..2922dcb24 100644 --- a/usr.bin/ssh/readconf.h +++ b/usr.bin/ssh/readconf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: readconf.h,v 1.157 2024/09/25 23:01:39 jsg Exp $ */ +/* $OpenBSD: readconf.h,v 1.158 2024/12/06 16:21:48 djm Exp $ */ /* * Author: Tatu Ylonen @@ -184,6 +184,8 @@ typedef struct { char **channel_timeouts; /* inactivity timeout by channel type */ u_int num_channel_timeouts; + char *version_addendum; + char *ignored_unknown; /* Pattern list of unknown tokens to ignore */ } Options; diff --git a/usr.bin/ssh/scp.1 b/usr.bin/ssh/scp.1 index 54c6fe3d5..aa2e2d8b5 100644 --- a/usr.bin/ssh/scp.1 +++ b/usr.bin/ssh/scp.1 @@ -8,9 +8,9 @@ .\" .\" Created: Sun May 7 00:14:37 1995 ylo .\" -.\" $OpenBSD: scp.1,v 1.112 2022/12/16 07:13:22 djm Exp $ +.\" $OpenBSD: scp.1,v 1.113 2024/12/06 15:12:56 djm Exp $ .\" -.Dd $Mdocdate: December 16 2022 $ +.Dd $Mdocdate: December 6 2024 $ .Dt SCP 1 .Os .Sh NAME @@ -162,67 +162,106 @@ For full details of the options listed below, and their possible values, see .Xr ssh_config 5 . .Pp .Bl -tag -width Ds -offset indent -compact +.It AddKeysToAgent .It AddressFamily .It BatchMode .It BindAddress .It BindInterface +.It CASignatureAlgorithms .It CanonicalDomains .It CanonicalizeFallbackLocal .It CanonicalizeHostname .It CanonicalizeMaxDots .It CanonicalizePermittedCNAMEs -.It CASignatureAlgorithms .It CertificateFile +.It ChannelTimeout .It CheckHostIP .It Ciphers +.It ClearAllForwardings .It Compression -.It ConnectionAttempts .It ConnectTimeout +.It ConnectionAttempts .It ControlMaster .It ControlPath .It ControlPersist -.It GlobalKnownHostsFile +.It DynamicForward +.It EnableEscapeCommandline +.It EnableSSHKeysign +.It EscapeChar +.It ExitOnForwardFailure +.It FingerprintHash +.It ForkAfterAuthentication +.It ForwardAgent +.It ForwardX11 +.It ForwardX11Timeout +.It ForwardX11Trusted .It GSSAPIAuthentication .It GSSAPIDelegateCredentials +.It GatewayPorts +.It GlobalKnownHostsFile .It HashKnownHosts .It Host -.It HostbasedAcceptedAlgorithms -.It HostbasedAuthentication .It HostKeyAlgorithms .It HostKeyAlias +.It HostbasedAcceptedAlgorithms +.It HostbasedAuthentication .It Hostname +.It IPQoS .It IdentitiesOnly .It IdentityAgent .It IdentityFile -.It IPQoS +.It IgnoreUnknown +.It Include .It KbdInteractiveAuthentication .It KbdInteractiveDevices .It KexAlgorithms .It KnownHostsCommand +.It LocalCommand +.It LocalForward .It LogLevel +.It LogVerbose .It MACs .It NoHostAuthenticationForLocalhost .It NumberOfPasswordPrompts -.It PasswordAuthentication +.It ObscureKeystrokeTiming .It PKCS11Provider +.It PasswordAuthentication +.It PermitLocalCommand +.It PermitRemoteOpen .It Port .It PreferredAuthentications .It ProxyCommand .It ProxyJump +.It ProxyUseFdpass .It PubkeyAcceptedAlgorithms .It PubkeyAuthentication .It RekeyLimit +.It RemoteCommand +.It RemoteForward +.It RequestTTY .It RequiredRSASize +.It RevokedHostKeys +.It SecurityKeyProvider .It SendEnv -.It ServerAliveInterval .It ServerAliveCountMax +.It ServerAliveInterval +.It SessionType .It SetEnv +.It StdinNull +.It StreamLocalBindMask +.It StreamLocalBindUnlink .It StrictHostKeyChecking +.It SyslogFacility .It TCPKeepAlive +.It Tag +.It Tunnel +.It TunnelDevice .It UpdateHostKeys .It User .It UserKnownHostsFile .It VerifyHostKeyDNS +.It VisualHostKey +.It XAuthLocation .El .It Fl P Ar port Specifies the port to connect to on the remote host. diff --git a/usr.bin/ssh/serverloop.c b/usr.bin/ssh/serverloop.c index 4e052c02b..f9c383a7e 100644 --- a/usr.bin/ssh/serverloop.c +++ b/usr.bin/ssh/serverloop.c @@ -1,4 +1,4 @@ -/* $OpenBSD: serverloop.c,v 1.240 2024/06/17 08:28:31 djm Exp $ */ +/* $OpenBSD: serverloop.c,v 1.241 2024/11/26 22:01:37 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -679,7 +679,7 @@ server_input_hostkeys_prove(struct ssh *ssh, struct sshbuf **respp) * For RSA keys, prefer to use the signature type negotiated * during KEX to the default (SHA1). */ - sigalg = NULL; + sigalg = sshkey_ssh_name(key); if (sshkey_type_plain(key->type) == KEY_RSA) { if (kex_rsa_sigalg != NULL) sigalg = kex_rsa_sigalg; @@ -688,6 +688,7 @@ server_input_hostkeys_prove(struct ssh *ssh, struct sshbuf **respp) else if (ssh->kex->flags & KEX_RSA_SHA2_256_SUPPORTED) sigalg = "rsa-sha2-256"; } + debug3_f("sign %s key (index %d) using sigalg %s", sshkey_type(key), ndx, sigalg == NULL ? "default" : sigalg); if ((r = sshbuf_put_cstring(sigbuf, diff --git a/usr.bin/ssh/session.c b/usr.bin/ssh/session.c index 70127823c..45638ebc6 100644 --- a/usr.bin/ssh/session.c +++ b/usr.bin/ssh/session.c @@ -1,4 +1,4 @@ -/* $OpenBSD: session.c,v 1.339 2024/10/14 01:57:50 djm Exp $ */ +/* $OpenBSD: session.c,v 1.340 2024/12/06 06:55:28 dtucker Exp $ */ /* * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland * All rights reserved @@ -1155,7 +1155,7 @@ do_pwchange(Session *s) fprintf(stderr, "WARNING: Your password has expired.\n"); if (s->ttyfd != -1) { fprintf(stderr, - "You must change your password now and login again!\n"); + "You must change your password now and log in again!\n"); execl(_PATH_PASSWD_PROG, "passwd", (char *)NULL); perror("passwd"); } else { diff --git a/usr.bin/ssh/sftp.1 b/usr.bin/ssh/sftp.1 index 68923ae20..651baaf85 100644 --- a/usr.bin/ssh/sftp.1 +++ b/usr.bin/ssh/sftp.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: sftp.1,v 1.143 2022/12/16 03:40:03 djm Exp $ +.\" $OpenBSD: sftp.1,v 1.144 2024/12/06 15:12:56 djm Exp $ .\" .\" Copyright (c) 2001 Damien Miller. All rights reserved. .\" @@ -22,7 +22,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: December 16 2022 $ +.Dd $Mdocdate: December 6 2024 $ .Dt SFTP 1 .Os .Sh NAME @@ -224,67 +224,106 @@ For full details of the options listed below, and their possible values, see .Xr ssh_config 5 . .Pp .Bl -tag -width Ds -offset indent -compact +.It AddKeysToAgent .It AddressFamily .It BatchMode .It BindAddress .It BindInterface +.It CASignatureAlgorithms .It CanonicalDomains .It CanonicalizeFallbackLocal .It CanonicalizeHostname .It CanonicalizeMaxDots .It CanonicalizePermittedCNAMEs -.It CASignatureAlgorithms .It CertificateFile +.It ChannelTimeout .It CheckHostIP .It Ciphers +.It ClearAllForwardings .It Compression -.It ConnectionAttempts .It ConnectTimeout +.It ConnectionAttempts .It ControlMaster .It ControlPath .It ControlPersist -.It GlobalKnownHostsFile +.It DynamicForward +.It EnableEscapeCommandline +.It EnableSSHKeysign +.It EscapeChar +.It ExitOnForwardFailure +.It FingerprintHash +.It ForkAfterAuthentication +.It ForwardAgent +.It ForwardX11 +.It ForwardX11Timeout +.It ForwardX11Trusted .It GSSAPIAuthentication .It GSSAPIDelegateCredentials +.It GatewayPorts +.It GlobalKnownHostsFile .It HashKnownHosts .It Host -.It HostbasedAcceptedAlgorithms -.It HostbasedAuthentication .It HostKeyAlgorithms .It HostKeyAlias +.It HostbasedAcceptedAlgorithms +.It HostbasedAuthentication .It Hostname +.It IPQoS .It IdentitiesOnly .It IdentityAgent .It IdentityFile -.It IPQoS +.It IgnoreUnknown +.It Include .It KbdInteractiveAuthentication .It KbdInteractiveDevices .It KexAlgorithms .It KnownHostsCommand +.It LocalCommand +.It LocalForward .It LogLevel +.It LogVerbose .It MACs .It NoHostAuthenticationForLocalhost .It NumberOfPasswordPrompts -.It PasswordAuthentication +.It ObscureKeystrokeTiming .It PKCS11Provider +.It PasswordAuthentication +.It PermitLocalCommand +.It PermitRemoteOpen .It Port .It PreferredAuthentications .It ProxyCommand .It ProxyJump +.It ProxyUseFdpass .It PubkeyAcceptedAlgorithms .It PubkeyAuthentication .It RekeyLimit +.It RemoteCommand +.It RemoteForward +.It RequestTTY .It RequiredRSASize +.It RevokedHostKeys +.It SecurityKeyProvider .It SendEnv -.It ServerAliveInterval .It ServerAliveCountMax +.It ServerAliveInterval +.It SessionType .It SetEnv +.It StdinNull +.It StreamLocalBindMask +.It StreamLocalBindUnlink .It StrictHostKeyChecking +.It SyslogFacility .It TCPKeepAlive +.It Tag +.It Tunnel +.It TunnelDevice .It UpdateHostKeys .It User .It UserKnownHostsFile .It VerifyHostKeyDNS +.It VisualHostKey +.It XAuthLocation .El .It Fl P Ar port Specifies the port to connect to on the remote host. diff --git a/usr.bin/ssh/sk-usbhid.c b/usr.bin/ssh/sk-usbhid.c index fd528c50f..def4ce299 100644 --- a/usr.bin/ssh/sk-usbhid.c +++ b/usr.bin/ssh/sk-usbhid.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sk-usbhid.c,v 1.46 2023/03/28 06:12:38 dtucker Exp $ */ +/* $OpenBSD: sk-usbhid.c,v 1.47 2024/12/03 08:31:49 djm Exp $ */ /* * Copyright (c) 2019 Markus Friedl * Copyright (c) 2020 Pedro Martelletto @@ -826,13 +826,15 @@ sk_enroll(uint32_t alg, const uint8_t *challenge, size_t challenge_len, fido_strerr(r)); goto out; } - } else { + } else if (strcmp(fido_cred_fmt(cred), "none") != 0) { skdebug(__func__, "self-attested credential"); if ((r = fido_cred_verify_self(cred)) != FIDO_OK) { skdebug(__func__, "fido_cred_verify_self: %s", fido_strerr(r)); goto out; } + } else { + skdebug(__func__, "no attestation data"); } if ((response = calloc(1, sizeof(*response))) == NULL) { skdebug(__func__, "calloc response failed"); diff --git a/usr.bin/ssh/ssh-agent.1 b/usr.bin/ssh/ssh-agent.1 index 6815eb834..872ee61a4 100644 --- a/usr.bin/ssh/ssh-agent.1 +++ b/usr.bin/ssh/ssh-agent.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-agent.1,v 1.79 2023/08/10 14:37:32 naddy Exp $ +.\" $OpenBSD: ssh-agent.1,v 1.81 2024/11/06 22:51:26 djm Exp $ .\" .\" Author: Tatu Ylonen .\" Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -34,7 +34,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: August 10 2023 $ +.Dd $Mdocdate: November 6 2024 $ .Dt SSH-AGENT 1 .Os .Sh NAME @@ -107,10 +107,11 @@ environment variable). .It Fl O Ar option Specify an option when starting .Nm . -Currently two options are supported: -.Cm allow-remote-pkcs11 +The supported options are: +.Cm allow-remote-pkcs11 , +.Cm no-restrict-websafe and -.Cm no-restrict-websafe . +.Cm websafe-allow . .Pp The .Cm allow-remote-pkcs11 @@ -143,6 +144,16 @@ user authentication request or a signature. The default behaviour prevents forwarded access to a FIDO key from also implicitly forwarding the ability to authenticate to websites. +.Pp +Alternately the +.Cm websafe-allow +option allows specifying a pattern-list of key application strings to +replace the default application allow-list, for example: +.Dq websafe-allow=ssh:*,example.org,*.example.com +.Pp +See PATTERNS in +.Xr ssh_config 5 +for a description of pattern-list syntax. .It Fl P Ar allowed_providers Specify a pattern-list of acceptable paths for PKCS#11 provider and FIDO authenticator middleware shared libraries that may be used with the @@ -152,11 +163,12 @@ or options to .Xr ssh-add 1 . Libraries that do not match the pattern list will be refused. +The default list is +.Dq /usr/lib/*,/usr/local/lib/* . +.Pp See PATTERNS in .Xr ssh_config 5 for a description of pattern-list syntax. -The default list is -.Dq /usr/lib/*,/usr/local/lib/* . .It Fl s Generate Bourne shell commands on .Dv stdout . @@ -233,6 +245,10 @@ the connection to the agent is forwarded over SSH remote connections and the result is returned to the requester, allowing the user access to their identities anywhere in the network in a secure fashion. +.Pp +.Nm +will delete all keys it has loaded upon receiving +.Dv SIGUSR1 . .Sh ENVIRONMENT .Bl -tag -width "SSH_AGENT_PID" .It Ev SSH_AGENT_PID diff --git a/usr.bin/ssh/ssh-agent.c b/usr.bin/ssh/ssh-agent.c index dbbaf3192..73276f68d 100644 --- a/usr.bin/ssh/ssh-agent.c +++ b/usr.bin/ssh/ssh-agent.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-agent.c,v 1.307 2024/09/24 02:28:17 djm Exp $ */ +/* $OpenBSD: ssh-agent.c,v 1.309 2024/11/06 22:51:26 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -81,6 +81,9 @@ #ifndef DEFAULT_ALLOWED_PROVIDERS # define DEFAULT_ALLOWED_PROVIDERS "/usr/lib*/*,/usr/local/lib*/*" #endif +#ifndef DEFAULT_WEBSAFE_ALLOWLIST +# define DEFAULT_WEBSAFE_ALLOWLIST "ssh:*" +#endif /* Maximum accepted message length */ #define AGENT_MAX_LEN (256*1024) @@ -149,7 +152,8 @@ int max_fd = 0; pid_t parent_pid = -1; time_t parent_alive_interval = 0; -sig_atomic_t signalled = 0; +static sig_atomic_t signalled_exit; +static sig_atomic_t signalled_keydrop; /* pid of process for which cleanup_socket is applicable */ pid_t cleanup_pid = 0; @@ -184,6 +188,7 @@ static int fingerprint_hash = SSH_FP_HASH_DEFAULT; /* Refuse signing of non-SSH messages for web-origin FIDO keys */ static int restrict_websafe = 1; +static char *websafe_allowlist; static void close_socket(SocketEntry *e) @@ -911,7 +916,8 @@ process_sign_request2(SocketEntry *e) } if (sshkey_is_sk(id->key)) { if (restrict_websafe && - strncmp(id->key->sk_application, "ssh:", 4) != 0 && + match_pattern_list(id->key->sk_application, + websafe_allowlist, 0) != 1 && !check_websafe_message_contents(key, data)) { /* error already logged */ goto send; @@ -1008,7 +1014,7 @@ process_remove_identity(SocketEntry *e) } static void -process_remove_all_identities(SocketEntry *e) +remove_all_identities(void) { Identity *id; @@ -1022,6 +1028,12 @@ process_remove_all_identities(SocketEntry *e) /* Mark that there are no identities. */ idtab->nentries = 0; +} + +static void +process_remove_all_identities(SocketEntry *e) +{ + remove_all_identities(); /* Send success. */ send_status(e, 1); @@ -2151,7 +2163,13 @@ cleanup_exit(int i) static void cleanup_handler(int sig) { - signalled = sig; + signalled_exit = sig; +} + +static void +keydrop_handler(int sig) +{ + signalled_keydrop = sig; } static void @@ -2186,6 +2204,7 @@ main(int ac, char **av) int c_flag = 0, d_flag = 0, D_flag = 0, k_flag = 0, s_flag = 0; int sock, ch, result, saved_errno; char *shell, *format, *pidstr, *agentsocket = NULL; + const char *ccp; struct rlimit rlim; extern int optind; extern char *optarg; @@ -2233,7 +2252,12 @@ main(int ac, char **av) restrict_websafe = 0; else if (strcmp(optarg, "allow-remote-pkcs11") == 0) remote_add_provider = 1; - else + else if ((ccp = strprefix(optarg, + "websafe-allow=", 0)) != NULL) { + if (websafe_allowlist != NULL) + fatal("websafe-allow already set"); + websafe_allowlist = xstrdup(ccp); + } else fatal("Unknown -O option"); break; case 'P': @@ -2277,6 +2301,8 @@ main(int ac, char **av) if (allowed_providers == NULL) allowed_providers = xstrdup(DEFAULT_ALLOWED_PROVIDERS); + if (websafe_allowlist == NULL) + websafe_allowlist = xstrdup(DEFAULT_WEBSAFE_ALLOWLIST); if (ac == 0 && !c_flag && !s_flag) { shell = getenv("SHELL"); @@ -2427,21 +2453,29 @@ skip: ssh_signal(SIGINT, (d_flag | D_flag) ? cleanup_handler : SIG_IGN); ssh_signal(SIGHUP, cleanup_handler); ssh_signal(SIGTERM, cleanup_handler); + ssh_signal(SIGUSR1, keydrop_handler); sigemptyset(&nsigset); sigaddset(&nsigset, SIGINT); sigaddset(&nsigset, SIGHUP); sigaddset(&nsigset, SIGTERM); + sigaddset(&nsigset, SIGUSR1); if (pledge("stdio rpath cpath unix id proc exec", NULL) == -1) fatal("%s: pledge: %s", __progname, strerror(errno)); while (1) { sigprocmask(SIG_BLOCK, &nsigset, &osigset); - if (signalled != 0) { - logit("exiting on signal %d", (int)signalled); + if (signalled_exit != 0) { + logit("exiting on signal %d", (int)signalled_exit); cleanup_exit(2); } + if (signalled_keydrop) { + logit("signal %d received; removing all keys", + signalled_keydrop); + remove_all_identities(); + signalled_keydrop = 0; + } ptimeout_init(&timeout); prepare_poll(&pfd, &npfd, &timeout, maxfds); result = ppoll(pfd, npfd, ptimeout_get_tsp(&timeout), &osigset); diff --git a/usr.bin/ssh/ssh-keygen.1 b/usr.bin/ssh/ssh-keygen.1 index 06f0555a4..00246a861 100644 --- a/usr.bin/ssh/ssh-keygen.1 +++ b/usr.bin/ssh/ssh-keygen.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-keygen.1,v 1.233 2024/08/17 08:35:04 djm Exp $ +.\" $OpenBSD: ssh-keygen.1,v 1.234 2024/11/27 13:00:23 djm Exp $ .\" .\" Author: Tatu Ylonen .\" Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -35,7 +35,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: August 17 2024 $ +.Dd $Mdocdate: November 27 2024 $ .Dt SSH-KEYGEN 1 .Os .Sh NAME @@ -1041,13 +1041,11 @@ format. .Pp .It Ic verify-required Require signatures made using this key indicate that the user was first -verified. +verified, e.g. by PIN or on-token biometrics. This option only makes sense for the FIDO authenticator algorithms .Cm ecdsa-sk and .Cm ed25519-sk . -Currently PIN authentication is the only supported verification method, -but other methods may be supported in the future. .El .Pp At present, no standard options are valid for host keys. diff --git a/usr.bin/ssh/ssh-keygen.c b/usr.bin/ssh/ssh-keygen.c index 8806c1577..9aac9673f 100644 --- a/usr.bin/ssh/ssh-keygen.c +++ b/usr.bin/ssh/ssh-keygen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keygen.c,v 1.476 2024/10/18 05:37:24 djm Exp $ */ +/* $OpenBSD: ssh-keygen.c,v 1.477 2024/12/04 14:24:20 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1994 Tatu Ylonen , Espoo, Finland @@ -987,7 +987,7 @@ do_fingerprint(struct passwd *pw) while (getline(&line, &linesize, f) != -1) { lnum++; cp = line; - cp[strcspn(cp, "\n")] = '\0'; + cp[strcspn(cp, "\r\n")] = '\0'; /* Trim leading space and comments */ cp = line + strspn(line, " \t"); if (*cp == '#' || *cp == '\0') diff --git a/usr.bin/ssh/ssh-keyscan.c b/usr.bin/ssh/ssh-keyscan.c index e1579b63c..3fa135d59 100644 --- a/usr.bin/ssh/ssh-keyscan.c +++ b/usr.bin/ssh/ssh-keyscan.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keyscan.c,v 1.164 2024/10/18 05:32:51 djm Exp $ */ +/* $OpenBSD: ssh-keyscan.c,v 1.165 2024/12/06 15:17:15 djm Exp $ */ /* * Copyright 1995, 1996 by David Mazieres . * @@ -774,6 +774,7 @@ main(int argc, char **argv) for (j = 0; j < maxfd; j++) read_wait[j].fd = -1; + ssh_signal(SIGPIPE, SIG_IGN); for (j = 0; j < fopt_count; j++) { if (argv[j] == NULL) fp = stdin; diff --git a/usr.bin/ssh/ssh.1 b/usr.bin/ssh/ssh.1 index 710d3d4e6..697f4e42a 100644 --- a/usr.bin/ssh/ssh.1 +++ b/usr.bin/ssh/ssh.1 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: ssh.1,v 1.443 2024/07/18 01:47:27 djm Exp $ -.Dd $Mdocdate: July 18 2024 $ +.\" $OpenBSD: ssh.1,v 1.444 2024/12/04 14:37:55 djm Exp $ +.Dd $Mdocdate: December 4 2024 $ .Dt SSH 1 .Os .Sh NAME @@ -509,24 +509,27 @@ For full details of the options listed below, and their possible values, see .It AddressFamily .It BatchMode .It BindAddress +.It BindInterface +.It CASignatureAlgorithms .It CanonicalDomains .It CanonicalizeFallbackLocal .It CanonicalizeHostname .It CanonicalizeMaxDots .It CanonicalizePermittedCNAMEs -.It CASignatureAlgorithms .It CertificateFile +.It ChannelTimeout .It CheckHostIP .It Ciphers .It ClearAllForwardings .It Compression -.It ConnectionAttempts .It ConnectTimeout +.It ConnectionAttempts .It ControlMaster .It ControlPath .It ControlPersist .It DynamicForward .It EnableEscapeCommandline +.It EnableSSHKeysign .It EscapeChar .It ExitOnForwardFailure .It FingerprintHash @@ -535,21 +538,23 @@ For full details of the options listed below, and their possible values, see .It ForwardX11 .It ForwardX11Timeout .It ForwardX11Trusted -.It GatewayPorts -.It GlobalKnownHostsFile .It GSSAPIAuthentication .It GSSAPIDelegateCredentials +.It GatewayPorts +.It GlobalKnownHostsFile .It HashKnownHosts .It Host -.It HostbasedAcceptedAlgorithms -.It HostbasedAuthentication .It HostKeyAlgorithms .It HostKeyAlias +.It HostbasedAcceptedAlgorithms +.It HostbasedAuthentication .It Hostname +.It IPQoS .It IdentitiesOnly .It IdentityAgent .It IdentityFile -.It IPQoS +.It IgnoreUnknown +.It Include .It KbdInteractiveAuthentication .It KbdInteractiveDevices .It KexAlgorithms @@ -557,14 +562,15 @@ For full details of the options listed below, and their possible values, see .It LocalCommand .It LocalForward .It LogLevel +.It LogVerbose .It MACs -.It Match .It NoHostAuthenticationForLocalhost .It NumberOfPasswordPrompts +.It ObscureKeystrokeTiming +.It PKCS11Provider .It PasswordAuthentication .It PermitLocalCommand .It PermitRemoteOpen -.It PKCS11Provider .It Port .It PreferredAuthentications .It ProxyCommand @@ -577,16 +583,20 @@ For full details of the options listed below, and their possible values, see .It RemoteForward .It RequestTTY .It RequiredRSASize +.It RevokedHostKeys +.It SecurityKeyProvider .It SendEnv -.It ServerAliveInterval .It ServerAliveCountMax +.It ServerAliveInterval .It SessionType .It SetEnv .It StdinNull .It StreamLocalBindMask .It StreamLocalBindUnlink .It StrictHostKeyChecking +.It SyslogFacility .It TCPKeepAlive +.It Tag .It Tunnel .It TunnelDevice .It UpdateHostKeys diff --git a/usr.bin/ssh/ssh.c b/usr.bin/ssh/ssh.c index 74a68e31b..0742ec839 100644 --- a/usr.bin/ssh/ssh.c +++ b/usr.bin/ssh/ssh.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh.c,v 1.601 2024/10/18 05:03:34 djm Exp $ */ +/* $OpenBSD: ssh.c,v 1.602 2024/12/06 16:21:48 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1473,6 +1473,13 @@ main(int ac, char **av) } } + if (options.version_addendum != NULL) { + cp = default_client_percent_dollar_expand( + options.version_addendum, cinfo); + free(options.version_addendum); + options.version_addendum = cp; + } + if (options.num_system_hostfiles > 0 && strcasecmp(options.system_hostfiles[0], "none") == 0) { if (options.num_system_hostfiles > 1) diff --git a/usr.bin/ssh/ssh_config.5 b/usr.bin/ssh/ssh_config.5 index 04b499178..5ca147547 100644 --- a/usr.bin/ssh/ssh_config.5 +++ b/usr.bin/ssh/ssh_config.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: ssh_config.5,v 1.404 2024/10/18 05:53:26 djm Exp $ -.Dd $Mdocdate: October 18 2024 $ +.\" $OpenBSD: ssh_config.5,v 1.407 2024/12/06 16:21:48 djm Exp $ +.Dd $Mdocdate: December 6 2024 $ .Dt SSH_CONFIG 5 .Os .Sh NAME @@ -581,8 +581,8 @@ chacha20-poly1305@openssh.com The default is: .Bd -literal -offset indent chacha20-poly1305@openssh.com, -aes128-ctr,aes192-ctr,aes256-ctr, -aes128-gcm@openssh.com,aes256-gcm@openssh.com +aes128-gcm@openssh.com,aes256-gcm@openssh.com, +aes128-ctr,aes192-ctr,aes256-ctr .Ed .Pp The list of available ciphers may also be obtained using @@ -1287,8 +1287,8 @@ default set. .Pp The default is: .Bd -literal -offset indent -sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com, mlkem768x25519-sha256, +sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com, curve25519-sha256,curve25519-sha256@libssh.org, ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521, diffie-hellman-group-exchange-sha256, @@ -2150,6 +2150,11 @@ See also .Sx VERIFYING HOST KEYS in .Xr ssh 1 . +.It Cm VersionAddendum +Optionally specifies additional text to append to the SSH protocol banner +sent by the client upon connection. +The default is +.Cm none . .It Cm VisualHostKey If this flag is set to .Cm yes , @@ -2295,8 +2300,9 @@ The local username. .Cm RemoteCommand , .Cm RemoteForward , .Cm RevokedHostKeys , -and .Cm UserKnownHostsFile +and +.Cm VersionAddendum accept the tokens %%, %C, %d, %h, %i, %j, %k, %L, %l, %n, %p, %r, and %u. .Pp .Cm KnownHostsCommand diff --git a/usr.bin/ssh/sshconnect.c b/usr.bin/ssh/sshconnect.c index 4cc597c49..19792b4b9 100644 --- a/usr.bin/ssh/sshconnect.c +++ b/usr.bin/ssh/sshconnect.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshconnect.c,v 1.368 2024/04/30 02:10:49 djm Exp $ */ +/* $OpenBSD: sshconnect.c,v 1.369 2024/12/06 16:21:48 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1566,7 +1566,8 @@ ssh_login(struct ssh *ssh, Sensitive *sensitive, const char *orighost, lowercase(host); /* Exchange protocol version identification strings with the server. */ - if ((r = kex_exchange_identification(ssh, timeout_ms, NULL)) != 0) + if ((r = kex_exchange_identification(ssh, timeout_ms, + options.version_addendum)) != 0) sshpkt_fatal(ssh, r, "banner exchange"); /* Put the connection into non-blocking mode. */ diff --git a/usr.bin/ssh/sshd-auth.c b/usr.bin/ssh/sshd-auth.c index e7225af22..f656e0ae7 100644 --- a/usr.bin/ssh/sshd-auth.c +++ b/usr.bin/ssh/sshd-auth.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshd-auth.c,v 1.1 2024/10/14 01:57:50 djm Exp $ */ +/* $OpenBSD: sshd-auth.c,v 1.2 2024/12/03 22:30:03 jsg Exp $ */ /* * SSH2 implementation: * Privilege Separation: @@ -669,7 +669,7 @@ main(int ac, char **av) } } if (!have_key) - fatal("internal error: recieved no hostkeys"); + fatal("internal error: received no hostkeys"); /* Ensure that umask disallows at least group and world write */ new_umask = umask(0077) | 0022; diff --git a/usr.bin/ssh/sshd-debug.sh b/usr.bin/ssh/sshd-debug.sh new file mode 100755 index 000000000..86a9b37bd --- /dev/null +++ b/usr.bin/ssh/sshd-debug.sh @@ -0,0 +1,52 @@ +#!/bin/sh + +# ssh-debug + +# A wrapper script around sshd to invoke when debugging to debug the +# work-in-progress versions of sshd-auth and sshd-session, instead +# of debugging the installed ones that probably don't have the change +# you are working on. +# +# Placed in the Public Domain. + +unset DIR SSHD SSHD_AUTH SSHD_SESSION + +fatal() { + echo >&2 $@ + exit 1 +} + +case "$0" in +/*) DIR="`dirname $0`" ;; +./sshd-debug.sh) DIR="`pwd`" ;; +*) echo "Need full path or working directory."; exit 1 ;; +esac + +for i in sshd/obj/sshd sshd/sshd sshd; do + if [ -f "${DIR}/$i" ] && [ -x "${DIR}/$i" ]; then + SSHD="${DIR}/$i" + fi +done +[ -z "${SSHD}" ] && fatal "Could not find sshd" + +for i in sshd-auth/obj/sshd-auth sshd-auth/sshd-auth sshd-auth; do + if [ -f "${DIR}/$i" ] && [ -x "${DIR}/$i" ]; then + SSHD_AUTH="${DIR}/$i" + fi +done +[ -z "${SSHD_AUTH}" ] && fatal "Could not find sshd-auth" + +for i in sshd-session/obj/sshd-session sshd-session/sshd-session sshd-session; do + if [ -f "${DIR}/$i" ] && [ -x "${DIR}/$i" ]; then + SSHD_SESSION="${DIR}/$i" + fi +done +[ -z "${SSHD_SESSION}" ] && fatal "Could not find sshd-session" + +echo >&2 Debugging ${SSHD} auth ${SSHD_AUTH} session ${SSHD_SESSION} + +# Append SshdSessionPath and SshdAuthPath pointing to the build directory. +# If you explicitly specify these in the command line, the first-match +# keyword semantics will override these. +exec "${SSHD}" $@ \ + -oSshdAuthPath="${SSHD_AUTH}" -oSshdSessionPath="${SSHD_SESSION}" diff --git a/usr.bin/ssh/sshd.c b/usr.bin/ssh/sshd.c index 07c62bacd..d8291de22 100644 --- a/usr.bin/ssh/sshd.c +++ b/usr.bin/ssh/sshd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshd.c,v 1.613 2024/10/14 01:57:50 djm Exp $ */ +/* $OpenBSD: sshd.c,v 1.614 2024/12/07 10:12:19 djm Exp $ */ /* * Copyright (c) 2000, 2001, 2002 Markus Friedl. All rights reserved. * Copyright (c) 2002 Niels Provos. All rights reserved. @@ -540,59 +540,51 @@ should_drop_connection(int startups) static int drop_connection(int sock, int startups, int notify_pipe) { + static struct log_ratelimit_ctx ratelimit_maxstartups; + static struct log_ratelimit_ctx ratelimit_penalty; + static int init_done; char *laddr, *raddr; - const char *reason = NULL, msg[] = "Not allowed at this time\r\n"; - static time_t last_drop, first_drop; - static u_int ndropped; - LogLevel drop_level = SYSLOG_LEVEL_VERBOSE; - time_t now; + const char *reason = NULL, *subreason = NULL; + const char msg[] = "Not allowed at this time\r\n"; + struct log_ratelimit_ctx *rl = NULL; + int ratelimited; + u_int ndropped; - if (!srclimit_penalty_check_allow(sock, &reason)) { - drop_level = SYSLOG_LEVEL_INFO; - goto handle; + if (!init_done) { + init_done = 1; + log_ratelimit_init(&ratelimit_maxstartups, 4, 60, 20, 5*60); + log_ratelimit_init(&ratelimit_penalty, 8, 60, 30, 2*60); } - now = monotime(); - if (!should_drop_connection(startups) && - srclimit_check_allow(sock, notify_pipe) == 1) { - if (last_drop != 0 && - startups < options.max_startups_begin - 1) { - /* XXX maybe need better hysteresis here */ - logit("exited MaxStartups throttling after %s, " - "%u connections dropped", - fmt_timeframe(now - first_drop), ndropped); - last_drop = 0; - } - return 0; + /* PerSourcePenalties */ + if (!srclimit_penalty_check_allow(sock, &subreason)) { + reason = "PerSourcePenalties"; + rl = &ratelimit_penalty; + } else { + /* MaxStartups */ + if (!should_drop_connection(startups) && + srclimit_check_allow(sock, notify_pipe) == 1) + return 0; + reason = "Maxstartups"; + rl = &ratelimit_maxstartups; } -#define SSHD_MAXSTARTUPS_LOG_INTERVAL (5 * 60) - if (last_drop == 0) { - error("beginning MaxStartups throttling"); - drop_level = SYSLOG_LEVEL_INFO; - first_drop = now; - ndropped = 0; - } else if (last_drop + SSHD_MAXSTARTUPS_LOG_INTERVAL < now) { - /* Periodic logs */ - error("in MaxStartups throttling for %s, " - "%u connections dropped", - fmt_timeframe(now - first_drop), ndropped + 1); - drop_level = SYSLOG_LEVEL_INFO; - } - last_drop = now; - ndropped++; - reason = "past Maxstartups"; - - handle: laddr = get_local_ipaddr(sock); raddr = get_peer_ipaddr(sock); - do_log2(drop_level, "drop connection #%d from [%s]:%d on [%s]:%d %s", + ratelimited = log_ratelimit(rl, time(NULL), NULL, &ndropped); + do_log2(ratelimited ? SYSLOG_LEVEL_DEBUG3 : SYSLOG_LEVEL_INFO, + "drop connection #%d from [%s]:%d on [%s]:%d %s", startups, raddr, get_peer_port(sock), laddr, get_local_port(sock), - reason); + subreason != NULL ? subreason : reason); free(laddr); free(raddr); + if (ndropped != 0) { + logit("%s logging rate-limited: additional %u connections " + "dropped", reason, ndropped); + } + /* best-effort notification to client */ (void)write(sock, msg, sizeof(msg) - 1); return 1; diff --git a/usr.bin/ssh/sshd_config b/usr.bin/ssh/sshd_config index 01a3e1ec5..2f5f0ae11 100644 --- a/usr.bin/ssh/sshd_config +++ b/usr.bin/ssh/sshd_config @@ -1,4 +1,4 @@ -# $OpenBSD: sshd_config,v 1.104 2021/07/02 05:11:21 dtucker Exp $ +# $OpenBSD: sshd_config,v 1.105 2024/12/03 14:12:47 dtucker Exp $ # This is the sshd server system-wide configuration file. See # sshd_config(5) for more information. @@ -51,11 +51,13 @@ AuthorizedKeysFile .ssh/authorized_keys # Don't read the user's ~/.rhosts and ~/.shosts files #IgnoreRhosts yes -# To disable tunneled clear text passwords, change to no here! +# To disable tunneled clear text passwords, change to "no" here! #PasswordAuthentication yes #PermitEmptyPasswords no -# Change to no to disable s/key passwords +# Change to "no" to disable keyboard-interactive authentication. Depending on +# the system's configuration, this may involve passwords, challenge-response, +# one-time passwords or some combination of these and other methods. #KbdInteractiveAuthentication yes #AllowAgentForwarding yes diff --git a/usr.bin/ssh/sshd_config.5 b/usr.bin/ssh/sshd_config.5 index e246f2fc1..e028c6eb3 100644 --- a/usr.bin/ssh/sshd_config.5 +++ b/usr.bin/ssh/sshd_config.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: sshd_config.5,v 1.377 2024/10/18 04:11:54 djm Exp $ -.Dd $Mdocdate: October 18 2024 $ +.\" $OpenBSD: sshd_config.5,v 1.380 2024/12/06 16:24:27 djm Exp $ +.Dd $Mdocdate: December 6 2024 $ .Dt SSHD_CONFIG 5 .Os .Sh NAME @@ -280,7 +280,7 @@ The format is described in the AUTHORIZED_KEYS FILE FORMAT section of .Xr sshd 8 . Arguments to .Cm AuthorizedKeysFile -accept the tokens described in the +may include wildcards and accept the tokens described in the .Sx TOKENS section. After expansion, @@ -349,7 +349,7 @@ are ignored. .Pp Arguments to .Cm AuthorizedPrincipalsFile -accept the tokens described in the +may include wildcards and accept the tokens described in the .Sx TOKENS section. After expansion, @@ -577,8 +577,8 @@ chacha20-poly1305@openssh.com The default is: .Bd -literal -offset indent chacha20-poly1305@openssh.com, -aes128-ctr,aes192-ctr,aes256-ctr, -aes128-gcm@openssh.com,aes256-gcm@openssh.com +aes128-gcm@openssh.com,aes256-gcm@openssh.com, +aes128-ctr,aes192-ctr,aes256-ctr .Ed .Pp The list of available ciphers may also be obtained using @@ -1060,8 +1060,8 @@ sntrup761x25519-sha512@openssh.com .Pp The default is: .Bd -literal -offset indent -sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com, mlkem768x25519-sha256, +sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com, curve25519-sha256,curve25519-sha256@libssh.org, ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521 .Ed diff --git a/usr.bin/ssh/sshkey.c b/usr.bin/ssh/sshkey.c index 07ee9244b..2997bc376 100644 --- a/usr.bin/ssh/sshkey.c +++ b/usr.bin/ssh/sshkey.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshkey.c,v 1.147 2024/09/22 12:56:21 jsg Exp $ */ +/* $OpenBSD: sshkey.c,v 1.148 2024/12/03 15:53:51 tb Exp $ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. * Copyright (c) 2008 Alexander von Gernler. All rights reserved. @@ -2665,14 +2665,6 @@ sshkey_ec_validate_public(const EC_GROUP *group, const EC_POINT *public) * EC_POINT_oct2point then the caller will need to explicitly check. */ - /* - * We shouldn't ever hit this case because bignum_get_ecpoint() - * refuses to load GF2m points. - */ - if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) != - NID_X9_62_prime_field) - goto out; - /* Q != infinity */ if (EC_POINT_is_at_infinity(group, public)) goto out; @@ -2772,11 +2764,6 @@ sshkey_dump_ec_point(const EC_GROUP *group, const EC_POINT *point) fprintf(stderr, "%s: BN_new failed\n", __func__); goto out; } - if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) != - NID_X9_62_prime_field) { - fprintf(stderr, "%s: group is not a prime field\n", __func__); - goto out; - } if (EC_POINT_get_affine_coordinates_GFp(group, point, x, y, NULL) != 1) { fprintf(stderr, "%s: EC_POINT_get_affine_coordinates_GFp\n", diff --git a/usr.bin/ssh/sshsig.c b/usr.bin/ssh/sshsig.c index f4c336344..72bbf731b 100644 --- a/usr.bin/ssh/sshsig.c +++ b/usr.bin/ssh/sshsig.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshsig.c,v 1.35 2024/03/08 22:16:32 djm Exp $ */ +/* $OpenBSD: sshsig.c,v 1.37 2024/11/26 22:05:51 djm Exp $ */ /* * Copyright (c) 2019 Google LLC * @@ -38,9 +38,9 @@ #define MAGIC_PREAMBLE_LEN (sizeof(MAGIC_PREAMBLE) - 1) #define BEGIN_SIGNATURE "-----BEGIN SSH SIGNATURE-----" #define END_SIGNATURE "-----END SSH SIGNATURE-----" -#define RSA_SIGN_ALG "rsa-sha2-512" /* XXX maybe make configurable */ +#define RSA_SIGN_ALG "rsa-sha2-512" #define RSA_SIGN_ALLOWED "rsa-sha2-512,rsa-sha2-256" -#define HASHALG_DEFAULT "sha512" /* XXX maybe make configurable */ +#define HASHALG_DEFAULT "sha512" #define HASHALG_ALLOWED "sha256,sha512" int @@ -188,8 +188,13 @@ sshsig_wrap_sign(struct sshkey *key, const char *hashalg, } /* If using RSA keys then default to a good signature algorithm */ - if (sshkey_type_plain(key->type) == KEY_RSA) + if (sshkey_type_plain(key->type) == KEY_RSA) { sign_alg = RSA_SIGN_ALG; + if (strcmp(hashalg, "sha256") == 0) + sign_alg = "rsa-sha2-256"; + else if (strcmp(hashalg, "sha512") == 0) + sign_alg = "rsa-sha2-512"; + } if (signer != NULL) { if ((r = signer(key, &sig, &slen, diff --git a/usr.bin/systat/Makefile b/usr.bin/systat/Makefile index 097a75549..d8e8aaab9 100644 --- a/usr.bin/systat/Makefile +++ b/usr.bin/systat/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.28 2018/05/30 13:43:50 krw Exp $ +# $OpenBSD: Makefile,v 1.29 2024/11/08 08:45:47 matthieu Exp $ PROG= systat @@ -12,6 +12,6 @@ SRCS= dkstats.c engine.c if.c inetname.c iostat.c main.c mbufs.c netstat.c \ pool.c malloc.c cpu.c uvm.c DPADD= ${LIBCURSES} ${LIBM} ${LIBKVM} -LDADD= -lcurses -lm -lkvm +LDADD= -lcurses -lm -lkvm -lutil .include diff --git a/usr.bin/systat/sensors.c b/usr.bin/systat/sensors.c index 4668fbf73..7049e3f98 100644 --- a/usr.bin/systat/sensors.c +++ b/usr.bin/systat/sensors.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sensors.c,v 1.32 2020/07/15 07:13:56 kettenis Exp $ */ +/* $OpenBSD: sensors.c,v 1.33 2024/11/08 08:45:47 matthieu Exp $ */ /* * Copyright (c) 2007 Deanna Phillips @@ -29,6 +29,7 @@ #include #include #include +#include #include "systat.h" struct sensor sensor; @@ -274,7 +275,12 @@ showsensor(struct sensinfo *s) tbprintf("%3.2f%%", s->sn_value / 1000.0); break; case SENSOR_FREQ: - tbprintf("%11.2f Hz", s->sn_value / 1000000.0); + if (humanreadable) { + char buf[FMT_SCALED_STRSIZE]; + fmt_scaled(s->sn_value / 1000000.0, buf); + tbprintf("%sHz", buf); + } else + tbprintf("%11.2f Hz", s->sn_value / 1000000.0); break; case SENSOR_ANGLE: tbprintf("%3.4f degrees", s->sn_value / 1000000.0); diff --git a/usr.bin/tcpbench/Makefile b/usr.bin/tcpbench/Makefile index 3645a686f..538ed2626 100644 --- a/usr.bin/tcpbench/Makefile +++ b/usr.bin/tcpbench/Makefile @@ -1,7 +1,7 @@ -# $OpenBSD: Makefile,v 1.10 2022/08/15 09:06:54 claudio Exp $ +# $OpenBSD: Makefile,v 1.11 2024/11/05 18:12:55 jan Exp $ PROG= tcpbench -LDADD= -lm -levent -DPADD= ${LIBM} ${LIBEVENT} +LDADD= -lm -levent -ltls -lcrypto +DPADD= ${LIBM} ${LIBEVENT} ${LIBTLS} ${LIBCRYPTO} .include diff --git a/usr.bin/tcpbench/tcpbench.1 b/usr.bin/tcpbench/tcpbench.1 index 3f2ddce9e..06952298e 100644 --- a/usr.bin/tcpbench/tcpbench.1 +++ b/usr.bin/tcpbench/tcpbench.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: tcpbench.1,v 1.30 2022/08/15 09:06:54 claudio Exp $ +.\" $OpenBSD: tcpbench.1,v 1.32 2024/11/06 06:40:16 jmc Exp $ .\" .\" Copyright (c) 2008 Damien Miller .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: August 15 2022 $ +.Dd $Mdocdate: November 6 2024 $ .Dt TCPBENCH 1 .Os .Sh NAME @@ -24,7 +24,7 @@ .Nm .Fl l .Nm -.Op Fl 46DRUuv +.Op Fl 46cDRUuv .Op Fl B Ar buf .Op Fl b Ar sourceaddr .Op Fl k Ar kvars @@ -32,20 +32,21 @@ .Op Fl p Ar port .Op Fl r Ar interval .Op Fl S Ar space -.Op Fl T Ar toskeyword +.Op Fl T Ar keyword .Op Fl t Ar secs .Op Fl V Ar rtable .Ar hostname .Nm .Bk -words .Fl s -.Op Fl 46DUuv +.Op Fl 46cDUuv .Op Fl B Ar buf +.Op Fl C Ar certfile Fl K Ar keyfile .Op Fl k Ar kvars .Op Fl p Ar port .Op Fl r Ar interval .Op Fl S Ar space -.Op Fl T Ar toskeyword +.Op Fl T Ar keyword .Op Fl V Ar rtable .Op Ar hostname .Ek @@ -111,8 +112,26 @@ stream. .It Fl b Ar sourceaddr Specify the IP address to send the packets from, which is useful on machines with multiple interfaces. +.It Fl C Ar certfile +Load the public key part of the TLS peer certificate from +.Ar certfile , +in PEM format. +Requires +.Fl s +and +.Fl c . +.It Fl c +Use TLS to connect or listen. .It Fl D Enable debugging on the socket. +.It Fl K Ar keyfile +Load the TLS private key from +.Ar keyfile , +in PEM format. +Requires +.Fl s +and +.Fl c . .It Fl k Ar kvars Specify one or more kernel variables to monitor; multiple variables must be separated with commas. @@ -143,9 +162,9 @@ connections. It defaults to using TCP if .Fl u is not specified. -.It Fl T Ar toskeyword +.It Fl T Ar keyword Change the IPv4 TOS or IPv6 TCLASS value. -.Ar toskeyword +.Ar keyword may be one of .Ar critical , .Ar inetcontrol , @@ -158,6 +177,22 @@ or one of the DiffServ Code Points: .Ar af11 ... af43 , .Ar cs0 ... cs7 ; or a number in either hex or decimal. +.Pp +For TLS options, +.Ar keyword +specifies a value in the form of a +.Ar key Ns = Ns Ar value +pair: +.Cm ciphers , +which allows the supported TLS ciphers to be specified (see +.Xr tls_config_set_ciphers 3 +for further details) or +.Cm protocols , +which allows the supported TLS protocols to be specified (see +.Xr tls_config_parse_protocols 3 +for further details). +Specifying TLS options requires +.Fl c . .It Fl t Ar secs Stop after .Ar secs diff --git a/usr.bin/tcpbench/tcpbench.c b/usr.bin/tcpbench/tcpbench.c index ac52f932c..9caa4715f 100644 --- a/usr.bin/tcpbench/tcpbench.c +++ b/usr.bin/tcpbench/tcpbench.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tcpbench.c,v 1.70 2024/03/21 16:46:04 bluhm Exp $ */ +/* $OpenBSD: tcpbench.c,v 1.73 2024/12/30 21:19:29 bluhm Exp $ */ /* * Copyright (c) 2008 Damien Miller @@ -51,6 +51,12 @@ #include #include #include +#include + +#include +#include +#include +#include #define DEFAULT_PORT "12345" #define DEFAULT_STATS_INTERVAL 1000 /* ms */ @@ -74,6 +80,7 @@ struct { char **kvars; /* Kvm enabled vars */ char *dummybuf; /* IO buffer */ size_t dummybuf_len; /* IO buffer len */ + struct tls_config *tls_cfg; } tcpbench, *ptb; struct tcpservsock { @@ -95,8 +102,12 @@ struct statctx { struct tcpservsock *tcp_ts; /* UDP only */ u_long udp_slice_pkts; + /* TLS context */ + struct tls *tls; }; +char *tls_ciphers; +char *tls_protocols; struct statctx *udp_sc; /* singleton */ static void signal_handler(int, short, void *); @@ -112,6 +123,7 @@ static void tcp_stats_display(unsigned long long, long double, float, struct statctx *, struct tcp_info *); static void tcp_process_slice(int, short, void *); static void tcp_server_handle_sc(int, short, void *); +static int timeout_tls(int, struct tls *, int (*)(struct tls *)); static void tcp_server_accept(int, short, void *); static void server_init(struct addrinfo *); static void client_handle_sc(int, short, void *); @@ -122,6 +134,7 @@ static void udp_process_slice(int, short, void *); static int map_tos(char *, int *); static void quit(int, short, void *); static void wrapup(int); +static int process_tls_opt(char *); /* * We account the mainstats here, that is the stats @@ -196,11 +209,12 @@ usage(void) { fprintf(stderr, "usage: tcpbench -l\n" - " tcpbench [-46DRUuv] [-B buf] [-b sourceaddr] [-k kvars] [-n connections]\n" - " [-p port] [-r interval] [-S space] [-T toskeyword]\n" - " [-t secs] [-V rtable] hostname\n" - " tcpbench -s [-46DUuv] [-B buf] [-k kvars] [-p port] [-r interval]\n" - " [-S space] [-T toskeyword] [-V rtable] [hostname]\n"); + " tcpbench [-46cDRUuv] [-B buf] [-b sourceaddr] [-k kvars] [-n connections]\n" + " [-p port] [-r interval] [-S space] [-T keyword] [-t secs]\n" + " [-V rtable] hostname\n" + " tcpbench -s [-46cDUuv] [-B buf] [-C certfile -K keyfile] [-k kvars]\n" + " [-p port] [-r interval] [-S space] [-T keyword] [-V rtable]\n" + " [hostname]\n"); exit(1); } @@ -592,8 +606,13 @@ tcp_server_handle_sc(int fd, short event, void *v_sc) struct statctx *sc = v_sc; ssize_t n; - n = read(sc->fd, sc->buf, sc->buflen); + if (sc->tls) + n = tls_read(sc->tls, sc->buf, sc->buflen); + else + n = read(sc->fd, sc->buf, sc->buflen); if (n == -1) { + if (sc->tls) + err(1, "tls_read: %s", tls_error(sc->tls)); if (errno != EINTR && errno != EWOULDBLOCK) warn("fd %d read error", sc->fd); return; @@ -623,6 +642,33 @@ tcp_server_handle_sc(int fd, short event, void *v_sc) mainstats.total_bytes += n; } +static int +timeout_tls(int s, struct tls *tls_ctx, int (*func)(struct tls *)) +{ + struct pollfd pfd; + int ret; + + while ((ret = func(tls_ctx)) != 0) { + if (ret == TLS_WANT_POLLIN) + pfd.events = POLLIN; + else if (ret == TLS_WANT_POLLOUT) + pfd.events = POLLOUT; + else + break; + pfd.fd = s; + if ((ret = poll(&pfd, 1, -1)) == 1) + continue; + else if (ret == 0) { + errno = ETIMEDOUT; + ret = -1; + break; + } else + err(1, "poll failed"); + } + + return ret; +} + static void tcp_server_accept(int fd, short event, void *arg) { @@ -632,6 +678,15 @@ tcp_server_accept(int fd, short event, void *arg) struct sockaddr_storage ss; socklen_t sslen; char tmp[NI_MAXHOST + 2 + NI_MAXSERV]; + static struct tls *tls = NULL; + + if (ptb->tls_cfg && tls == NULL) { + tls = tls_server(); + if (tls == NULL) + err(1, "Unable to create TLS context."); + if (tls_configure(tls, ptb->tls_cfg) == -1) + errx(1, "tls_configure: %s", tls_error(tls)); + } sslen = sizeof(ss); @@ -672,6 +727,8 @@ tcp_server_accept(int fd, short event, void *arg) sc->tcp_ts = ts; sc->fd = sock; stats_prepare(sc); + if (tls && tls_accept_socket(tls, &sc->tls, sc->fd) == -1) + err(1, "tls_accept_socket: %s", tls_error(tls)); event_set(&sc->ev, sc->fd, EV_READ | EV_PERSIST, tcp_server_handle_sc, sc); @@ -786,7 +843,14 @@ client_handle_sc(int fd, short event, void *v_sc) if (ptb->Rflag) blen = arc4random_uniform(blen) + 1; - if ((n = write(sc->fd, sc->buf, blen)) == -1) { + + if (sc->tls) + n = tls_write(sc->tls, sc->buf, blen); + else + n = write(sc->fd, sc->buf, blen); + if (n == -1) { + if (sc->tls) + warn("tls_write: %s", tls_error(sc->tls)); if (errno == EINTR || errno == EWOULDBLOCK || (UDP_MODE && errno == ENOBUFS)) return; @@ -885,6 +949,29 @@ client_init(struct addrinfo *aitop, int nconn, struct addrinfo *aib) sc = udp_sc; sc->fd = sock; + + if (ptb->tls_cfg) { + sc->tls = tls_client(); + if (sc->tls == NULL) + err(1, "Unable to create TLS context."); + + if (tls_configure(sc->tls, ptb->tls_cfg) == -1) + errx(1, "tls_configure: %s", + tls_error(sc->tls)); + + if (tls_connect_socket(sc->tls, sc->fd, + mainstats.host) == -1) + errx(1, "tls_connect_socket: %s", + tls_error(sc->tls)); + if (timeout_tls(sc->fd, sc->tls, tls_handshake) == -1) { + const char *errstr; + + if ((errstr = tls_error(sc->tls)) == NULL) + errstr = strerror(errno); + errx(1, "tls handshake failed (%s)", errstr); + } + } + stats_prepare(sc); event_set(&sc->ev, sc->fd, EV_WRITE | EV_PERSIST, @@ -981,6 +1068,39 @@ wrapup(int err) exit(err); } +static int +process_tls_opt(char *s) +{ + size_t len; + char *v; + + const struct tlskeywords { + const char *keyword; + char **value; + } *t, tlskeywords[] = { + { "ciphers", &tls_ciphers }, + { "protocols", &tls_protocols }, + { NULL, NULL }, + }; + + len = strlen(s); + if ((v = strchr(s, '=')) != NULL) { + len = v - s; + v++; + } + + for (t = tlskeywords; t->keyword != NULL; t++) { + if (strlen(t->keyword) == len && + strncmp(s, t->keyword, len) == 0) { + if (v == NULL) + errx(1, "invalid tls value `%s'", s); + *t->value = v; + return 1; + } + } + return 0; +} + int main(int argc, char **argv) { @@ -990,11 +1110,14 @@ main(int argc, char **argv) struct addrinfo *aitop, *aib, hints; const char *errstr; struct rlimit rl; - int ch, herr, nconn; + int ch, herr, nconn, usetls = 0; int family = PF_UNSPEC; const char *host = NULL, *port = DEFAULT_PORT, *srcbind = NULL; struct event ev_sigint, ev_sigterm, ev_sighup, ev_siginfo, ev_progtimer; struct sockaddr_un sock_un; + char *crtfile = NULL, *keyfile = NULL; + uint8_t *crt = NULL, *key = NULL; + size_t key_size, crt_size; /* Init world */ setvbuf(stdout, NULL, _IOLBF, 0); @@ -1005,11 +1128,12 @@ main(int argc, char **argv) ptb->kvars = NULL; ptb->rflag = DEFAULT_STATS_INTERVAL; ptb->Tflag = -1; + ptb->tls_cfg = NULL; nconn = 1; aib = NULL; secs = 0; - while ((ch = getopt(argc, argv, "46b:B:Dhlk:n:p:Rr:sS:t:T:uUvV:")) + while ((ch = getopt(argc, argv, "46b:B:cC:Dhlk:K:n:p:Rr:sS:t:T:uUvV:")) != -1) { switch (ch) { case '4': @@ -1021,6 +1145,12 @@ main(int argc, char **argv) case 'b': srcbind = optarg; break; + case 'c': + usetls = 1; + break; + case 'C': + crtfile = optarg; + break; case 'D': ptb->Dflag = 1; break; @@ -1033,6 +1163,9 @@ main(int argc, char **argv) ptb->kvars = check_prepare_kvars(tmp); free(tmp); break; + case 'K': + keyfile = optarg; + break; case 'R': ptb->Rflag = 1; break; @@ -1088,6 +1221,8 @@ main(int argc, char **argv) ptb->Uflag = 1; break; case 'T': + if (process_tls_opt(optarg)) + break; if (map_tos(optarg, &ptb->Tflag)) break; errstr = NULL; @@ -1118,9 +1253,19 @@ main(int argc, char **argv) argv += optind; argc -= optind; if ((argc != (ptb->sflag && !ptb->Uflag ? 0 : 1)) || - (UDP_MODE && (ptb->kvars || nconn != 1))) + (UDP_MODE && (ptb->kvars || nconn != 1 || usetls))) usage(); + if (ptb->sflag && usetls && (crtfile == NULL || keyfile == NULL)) + usage(); + + if (crtfile != NULL && keyfile != NULL) { + if ((crt = tls_load_file(crtfile, &crt_size, NULL)) == NULL) + err(1, "tls_load_file"); + if ((key = tls_load_file(keyfile, &key_size, NULL)) == NULL) + err(1, "tls_load_file"); + } + if (!ptb->sflag || ptb->Uflag) mainstats.host = host = argv[0]; @@ -1201,6 +1346,33 @@ main(int argc, char **argv) if (pledge("stdio inet unix", NULL) == -1) err(1, "pledge"); + if (usetls) { + uint32_t protocols = 0; + + if ((ptb->tls_cfg = tls_config_new()) == NULL) + errx(1, "unable to allocate TLS config"); + + if (ptb->sflag) { + if (tls_config_set_key_mem(ptb->tls_cfg, key, + key_size) == -1) + errx(1, "%s", tls_config_error(ptb->tls_cfg)); + if (tls_config_set_cert_mem(ptb->tls_cfg, crt, + crt_size) == -1) + errx(1, "%s", tls_config_error(ptb->tls_cfg)); + } else { + /* Don't check server certificate. */ + tls_config_insecure_noverifyname(ptb->tls_cfg); + tls_config_insecure_noverifycert(ptb->tls_cfg); + } + + if (tls_config_parse_protocols(&protocols, tls_protocols) == -1) + errx(1, "invalid TLS protocols `%s'", tls_protocols); + if (tls_config_set_protocols(ptb->tls_cfg, protocols) == -1) + errx(1, "%s", tls_config_error(ptb->tls_cfg)); + if (tls_config_set_ciphers(ptb->tls_cfg, tls_ciphers) == -1) + errx(1, "%s", tls_config_error(ptb->tls_cfg)); + } + /* Init world */ TAILQ_INIT(&sc_queue); if ((ptb->dummybuf = malloc(ptb->dummybuf_len)) == NULL) diff --git a/usr.bin/tmux/cmd-confirm-before.c b/usr.bin/tmux/cmd-confirm-before.c index fd858876b..853b05ea8 100644 --- a/usr.bin/tmux/cmd-confirm-before.c +++ b/usr.bin/tmux/cmd-confirm-before.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-confirm-before.c,v 1.55 2024/05/15 08:39:30 nicm Exp $ */ +/* $OpenBSD: cmd-confirm-before.c,v 1.56 2024/11/26 15:51:48 nicm Exp $ */ /* * Copyright (c) 2009 Tiago Cunha @@ -130,7 +130,7 @@ cmd_confirm_before_callback(struct client *c, void *data, const char *s, if (s == NULL) goto out; - if (s[0] != cdata->confirm_key && (s[0] != '\0' || !cdata->default_yes)) + if (s[0] != cdata->confirm_key && (s[0] != '\r' || !cdata->default_yes)) goto out; retcode = 0; diff --git a/usr.bin/tmux/cmd-copy-mode.c b/usr.bin/tmux/cmd-copy-mode.c index a9110cf87..b173d6135 100644 --- a/usr.bin/tmux/cmd-copy-mode.c +++ b/usr.bin/tmux/cmd-copy-mode.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-copy-mode.c,v 1.48 2024/08/26 07:09:34 nicm Exp $ */ +/* $OpenBSD: cmd-copy-mode.c,v 1.49 2024/11/12 09:32:56 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -30,8 +30,8 @@ const struct cmd_entry cmd_copy_mode_entry = { .name = "copy-mode", .alias = NULL, - .args = { "deHMs:t:uq", 0, 0, NULL }, - .usage = "[-deHMuq] [-s src-pane] " CMD_TARGET_PANE_USAGE, + .args = { "deHMqSs:t:u", 0, 0, NULL }, + .usage = "[-deHMqSu] [-s src-pane] " CMD_TARGET_PANE_USAGE, .source = { 's', CMD_FIND_PANE, 0 }, .target = { 't', CMD_FIND_PANE, 0 }, @@ -92,7 +92,12 @@ cmd_copy_mode_exec(struct cmd *self, struct cmdq_item *item) if (args_has(args, 'u')) window_copy_pageup(wp, 0); if (args_has(args, 'd')) - window_copy_pagedown(wp, 0, args_has(args, 'e')); + window_copy_pagedown(wp, 0, args_has(args, 'e')); + if (args_has(args, 'S')) { + window_copy_scroll(wp, c->tty.mouse_slider_mpos, event->m.y, + args_has(args, 'e')); + return (CMD_RETURN_NORMAL); + } return (CMD_RETURN_NORMAL); } diff --git a/usr.bin/tmux/cmd-parse.y b/usr.bin/tmux/cmd-parse.y index 6565d2d27..c519e22a5 100644 --- a/usr.bin/tmux/cmd-parse.y +++ b/usr.bin/tmux/cmd-parse.y @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-parse.y,v 1.51 2024/08/04 09:42:23 nicm Exp $ */ +/* $OpenBSD: cmd-parse.y,v 1.52 2024/11/18 08:29:35 nicm Exp $ */ /* * Copyright (c) 2019 Nicholas Marriott @@ -223,9 +223,16 @@ assignment : EQUALS { struct cmd_parse_state *ps = &parse_state; int flags = ps->input->flags; + int flag = 1; + struct cmd_parse_scope *scope; - if ((~flags & CMD_PARSE_PARSEONLY) && - (ps->scope == NULL || ps->scope->flag)) + if (ps->scope != NULL) { + flag = ps->scope->flag; + TAILQ_FOREACH(scope, &ps->stack, entry) + flag = flag && scope->flag; + } + + if ((~flags & CMD_PARSE_PARSEONLY) && flag) environ_put(global_environ, $1, 0); free($1); } @@ -234,9 +241,16 @@ hidden_assignment : HIDDEN EQUALS { struct cmd_parse_state *ps = &parse_state; int flags = ps->input->flags; + int flag = 1; + struct cmd_parse_scope *scope; - if ((~flags & CMD_PARSE_PARSEONLY) && - (ps->scope == NULL || ps->scope->flag)) + if (ps->scope != NULL) { + flag = ps->scope->flag; + TAILQ_FOREACH(scope, &ps->stack, entry) + flag = flag && scope->flag; + } + + if ((~flags & CMD_PARSE_PARSEONLY) && flag) environ_put(global_environ, $2, ENVIRON_HIDDEN); free($2); } diff --git a/usr.bin/tmux/cmd-queue.c b/usr.bin/tmux/cmd-queue.c index 81ed3de30..fdba8cd15 100644 --- a/usr.bin/tmux/cmd-queue.c +++ b/usr.bin/tmux/cmd-queue.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-queue.c,v 1.117 2024/05/14 07:52:19 nicm Exp $ */ +/* $OpenBSD: cmd-queue.c,v 1.118 2024/11/22 12:58:05 nicm Exp $ */ /* * Copyright (c) 2013 Nicholas Marriott @@ -835,9 +835,9 @@ cmdq_guard(struct cmdq_item *item, const char *guard, int flags) /* Show message from command. */ void -cmdq_print_data(struct cmdq_item *item, int parse, struct evbuffer *evb) +cmdq_print_data(struct cmdq_item *item, struct evbuffer *evb) { - server_client_print(item->client, parse, evb); + server_client_print(item->client, 1, evb); } /* Show message from command. */ @@ -855,7 +855,7 @@ cmdq_print(struct cmdq_item *item, const char *fmt, ...) evbuffer_add_vprintf(evb, fmt, ap); va_end(ap); - cmdq_print_data(item, 0, evb); + cmdq_print_data(item, evb); evbuffer_free(evb); } diff --git a/usr.bin/tmux/cmd-save-buffer.c b/usr.bin/tmux/cmd-save-buffer.c index 17905128a..eb59e8a06 100644 --- a/usr.bin/tmux/cmd-save-buffer.c +++ b/usr.bin/tmux/cmd-save-buffer.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-save-buffer.c,v 1.55 2022/12/07 09:44:44 nicm Exp $ */ +/* $OpenBSD: cmd-save-buffer.c,v 1.56 2024/11/22 12:58:05 nicm Exp $ */ /* * Copyright (c) 2009 Tiago Cunha @@ -102,7 +102,7 @@ cmd_save_buffer_exec(struct cmd *self, struct cmdq_item *item) if (evb == NULL) fatalx("out of memory"); evbuffer_add(evb, bufdata, bufsize); - cmdq_print_data(item, 1, evb); + cmdq_print_data(item, evb); evbuffer_free(evb); return (CMD_RETURN_NORMAL); } diff --git a/usr.bin/tmux/cmd-source-file.c b/usr.bin/tmux/cmd-source-file.c index 01e4a8a8a..d9cb48d1d 100644 --- a/usr.bin/tmux/cmd-source-file.c +++ b/usr.bin/tmux/cmd-source-file.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd-source-file.c,v 1.55 2024/10/12 08:20:32 nicm Exp $ */ +/* $OpenBSD: cmd-source-file.c,v 1.56 2024/12/16 09:13:09 nicm Exp $ */ /* * Copyright (c) 2008 Tiago Cunha @@ -30,6 +30,9 @@ * Sources a configuration file. */ +#define CMD_SOURCE_FILE_DEPTH_LIMIT 50 +static u_int cmd_source_file_depth; + static enum cmd_retval cmd_source_file_exec(struct cmd *, struct cmdq_item *); const struct cmd_entry cmd_source_file_entry = { @@ -60,6 +63,16 @@ struct cmd_source_file_data { static enum cmd_retval cmd_source_file_complete_cb(struct cmdq_item *item, __unused void *data) { + struct client *c = cmdq_get_client(item); + + if (c == NULL) { + cmd_source_file_depth--; + log_debug("%s: depth now %u", __func__, cmd_source_file_depth); + } else { + c->source_file_depth--; + log_debug("%s: depth now %u", __func__, c->source_file_depth); + } + cfg_print_causes(item); return (CMD_RETURN_NORMAL); } @@ -131,6 +144,7 @@ cmd_source_file_add(struct cmd_source_file_data *cdata, const char *path) path = resolved; log_debug("%s: %s", __func__, path); + cdata->files = xreallocarray(cdata->files, cdata->nfiles + 1, sizeof *cdata->files); cdata->files[cdata->nfiles++] = xstrdup(path); @@ -149,6 +163,22 @@ cmd_source_file_exec(struct cmd *self, struct cmdq_item *item) int result; u_int i, j; + if (c == NULL) { + if (cmd_source_file_depth >= CMD_SOURCE_FILE_DEPTH_LIMIT) { + cmdq_error(item, "too many nested files"); + return (CMD_RETURN_ERROR); + } + cmd_source_file_depth++; + log_debug("%s: depth now %u", __func__, cmd_source_file_depth); + } else { + if (c->source_file_depth >= CMD_SOURCE_FILE_DEPTH_LIMIT) { + cmdq_error(item, "too many nested files"); + return (CMD_RETURN_ERROR); + } + c->source_file_depth++; + log_debug("%s: depth now %u", __func__, c->source_file_depth); + } + cdata = xcalloc(1, sizeof *cdata); cdata->item = item; diff --git a/usr.bin/tmux/format.c b/usr.bin/tmux/format.c index a39649184..ae0e17d36 100644 --- a/usr.bin/tmux/format.c +++ b/usr.bin/tmux/format.c @@ -1,4 +1,4 @@ -/* $OpenBSD: format.c,v 1.321 2024/10/10 10:41:33 nicm Exp $ */ +/* $OpenBSD: format.c,v 1.324 2024/11/25 08:34:01 nicm Exp $ */ /* * Copyright (c) 2011 Nicholas Marriott @@ -2490,9 +2490,20 @@ format_cb_window_last_flag(struct format_tree *ft) static void * format_cb_window_linked(struct format_tree *ft) { + struct winlink *wl; + struct session *s; + int found = 0; + if (ft->wl != NULL) { - if (session_is_linked(ft->wl->session, ft->wl->window)) - return (xstrdup("1")); + RB_FOREACH(s, sessions, &sessions) { + RB_FOREACH(wl, winlinks, &s->windows) { + if (wl->window == ft->wl->window) { + if (found) + return (xstrdup("1")); + found = 1; + } + } + } return (xstrdup("0")); } return (NULL); @@ -2502,9 +2513,27 @@ format_cb_window_linked(struct format_tree *ft) static void * format_cb_window_linked_sessions(struct format_tree *ft) { - if (ft->wl != NULL) - return (format_printf("%u", ft->wl->window->references)); - return (NULL); + struct window *w; + struct session_group *sg; + struct session *s; + u_int n = 0; + + if (ft->wl == NULL) + return (NULL); + w = ft->wl->window; + + RB_FOREACH(sg, session_groups, &session_groups) { + s = TAILQ_FIRST(&sg->sessions); + if (winlink_find_by_window(&s->windows, w) != NULL) + n++; + } + RB_FOREACH(s, sessions, &sessions) { + if (session_group_contains(s) != NULL) + continue; + if (winlink_find_by_window(&s->windows, w) != NULL) + n++; + } + return (format_printf("%u", n)); } /* Callback for window_marked_flag. */ @@ -5188,6 +5217,16 @@ format_defaults_paste_buffer(struct format_tree *ft, struct paste_buffer *pb) ft->pb = pb; } +static int +format_is_word_separator(const char *ws, const struct grid_cell *gc) +{ + if (utf8_cstrhas(ws, &gc->data)) + return (1); + if (gc->flags & GRID_FLAG_TAB) + return (1); + return gc->data.size == 1 && *gc->data.data == ' '; +} + /* Return word at given coordinates. Caller frees. */ char * format_grid_word(struct grid *gd, u_int x, u_int y) @@ -5207,8 +5246,7 @@ format_grid_word(struct grid *gd, u_int x, u_int y) grid_get_cell(gd, x, y, &gc); if (gc.flags & GRID_FLAG_PADDING) break; - if (utf8_cstrhas(ws, &gc.data) || - (gc.data.size == 1 && *gc.data.data == ' ')) { + if (format_is_word_separator(ws, &gc)) { found = 1; break; } @@ -5245,8 +5283,7 @@ format_grid_word(struct grid *gd, u_int x, u_int y) grid_get_cell(gd, x, y, &gc); if (gc.flags & GRID_FLAG_PADDING) break; - if (utf8_cstrhas(ws, &gc.data) || - (gc.data.size == 1 && *gc.data.data == ' ')) + if (format_is_word_separator(ws, &gc)) break; ud = xreallocarray(ud, size + 2, sizeof *ud); @@ -5273,10 +5310,13 @@ format_grid_line(struct grid *gd, u_int y) for (x = 0; x < grid_line_length(gd, y); x++) { grid_get_cell(gd, x, y, &gc); if (gc.flags & GRID_FLAG_PADDING) - break; + continue; ud = xreallocarray(ud, size + 2, sizeof *ud); - memcpy(&ud[size++], &gc.data, sizeof *ud); + if (gc.flags & GRID_FLAG_TAB) + utf8_set(&ud[size++], '\t'); + else + memcpy(&ud[size++], &gc.data, sizeof *ud); } if (size != 0) { ud[size].size = 0; diff --git a/usr.bin/tmux/grid-reader.c b/usr.bin/tmux/grid-reader.c index 183b4a4c0..40c71a3ac 100644 --- a/usr.bin/tmux/grid-reader.c +++ b/usr.bin/tmux/grid-reader.c @@ -1,4 +1,4 @@ -/* $OpenBSD: grid-reader.c,v 1.6 2021/06/10 07:56:47 nicm Exp $ */ +/* $OpenBSD: grid-reader.c,v 1.9 2024/11/20 20:54:02 nicm Exp $ */ /* * Copyright (c) 2020 Anindya Mukherjee @@ -180,19 +180,14 @@ grid_reader_handle_wrap(struct grid_reader *gr, u_int *xx, u_int *yy) int grid_reader_in_set(struct grid_reader *gr, const char *set) { - struct grid_cell gc; - - grid_get_cell(gr->gd, gr->cx, gr->cy, &gc); - if (gc.flags & GRID_FLAG_PADDING) - return (0); - return (utf8_cstrhas(set, &gc.data)); + return (grid_in_set(gr->gd, gr->cx, gr->cy, set)); } /* Move cursor to the start of the next word. */ void grid_reader_cursor_next_word(struct grid_reader *gr, const char *separators) { - u_int xx, yy; + u_int xx, yy, width; /* Do not break up wrapped words. */ if (grid_get_line(gr->gd, gr->cy)->flags & GRID_LINE_WRAPPED) @@ -229,8 +224,8 @@ grid_reader_cursor_next_word(struct grid_reader *gr, const char *separators) } } while (grid_reader_handle_wrap(gr, &xx, &yy) && - grid_reader_in_set(gr, WHITESPACE)) - gr->cx++; + (width = grid_reader_in_set(gr, WHITESPACE))) + gr->cx += width; } /* Move cursor to the end of the next word. */ @@ -338,6 +333,20 @@ grid_reader_cursor_previous_word(struct grid_reader *gr, const char *separators, gr->cy = oldy; } +/* Compare grid cell to UTF-8 data. Return 1 if equal, 0 if not. */ +static int +grid_reader_cell_equals_data(const struct grid_cell *gc, + const struct utf8_data *ud) +{ + if (gc->flags & GRID_FLAG_PADDING) + return (0); + if (gc->flags & GRID_FLAG_TAB && ud->size == 1 && *ud->data == '\t') + return (1); + if (gc->data.size != ud->size) + return (0); + return (memcmp(gc->data.data, ud->data, gc->data.size) == 0); +} + /* Jump forward to character. */ int grid_reader_cursor_jump(struct grid_reader *gr, const struct utf8_data *jc) @@ -352,9 +361,7 @@ grid_reader_cursor_jump(struct grid_reader *gr, const struct utf8_data *jc) xx = grid_line_length(gr->gd, py); while (px < xx) { grid_get_cell(gr->gd, px, py, &gc); - if (!(gc.flags & GRID_FLAG_PADDING) && - gc.data.size == jc->size && - memcmp(gc.data.data, jc->data, gc.data.size) == 0) { + if (grid_reader_cell_equals_data(&gc, jc)) { gr->cx = px; gr->cy = py; return (1); @@ -382,9 +389,7 @@ grid_reader_cursor_jump_back(struct grid_reader *gr, const struct utf8_data *jc) for (py = gr->cy + 1; py > 0; py--) { for (px = xx; px > 0; px--) { grid_get_cell(gr->gd, px - 1, py - 1, &gc); - if (!(gc.flags & GRID_FLAG_PADDING) && - gc.data.size == jc->size && - memcmp(gc.data.data, jc->data, gc.data.size) == 0) { + if (grid_reader_cell_equals_data(&gc, jc)) { gr->cx = px - 1; gr->cy = py - 1; return (1); @@ -415,7 +420,9 @@ grid_reader_cursor_back_to_indentation(struct grid_reader *gr) xx = grid_line_length(gr->gd, py); for (px = 0; px < xx; px++) { grid_get_cell(gr->gd, px, py, &gc); - if (gc.data.size != 1 || *gc.data.data != ' ') { + if ((gc.data.size != 1 || *gc.data.data != ' ') && + ~gc.flags & GRID_FLAG_TAB && + ~gc.flags & GRID_FLAG_PADDING) { gr->cx = px; gr->cy = py; return; diff --git a/usr.bin/tmux/grid.c b/usr.bin/tmux/grid.c index 53a4e34f6..03ab901ab 100644 --- a/usr.bin/tmux/grid.c +++ b/usr.bin/tmux/grid.c @@ -1,4 +1,4 @@ -/* $OpenBSD: grid.c,v 1.131 2024/06/24 08:11:46 nicm Exp $ */ +/* $OpenBSD: grid.c,v 1.135 2024/11/20 20:54:02 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott @@ -84,7 +84,7 @@ grid_need_extended_cell(const struct grid_cell_entry *gce, return (1); if (gc->attr > 0xff) return (1); - if (gc->data.size != 1 || gc->data.width != 1) + if (gc->data.size > 1 || gc->data.width > 1) return (1); if ((gc->fg & COLOUR_FLAG_RGB) || (gc->bg & COLOUR_FLAG_RGB)) return (1); @@ -92,6 +92,8 @@ grid_need_extended_cell(const struct grid_cell_entry *gce, return (1); if (gc->link != 0) return (1); + if (gc->flags & GRID_FLAG_TAB) + return (1); return (0); } @@ -124,7 +126,10 @@ grid_extended_cell(struct grid_line *gl, struct grid_cell_entry *gce, fatalx("offset too big"); gl->flags |= GRID_LINE_EXTENDED; - utf8_from_data(&gc->data, &uc); + if (gc->flags & GRID_FLAG_TAB) + uc = gc->data.width; + else + utf8_from_data(&gc->data, &uc); gee = &gl->extddata[gce->offset]; gee->data = uc; @@ -230,9 +235,13 @@ grid_check_y(struct grid *gd, const char *from, u_int py) int grid_cells_look_equal(const struct grid_cell *gc1, const struct grid_cell *gc2) { + int flags1 = gc1->flags, flags2 = gc2->flags;; + if (gc1->fg != gc2->fg || gc1->bg != gc2->bg) return (0); - if (gc1->attr != gc2->attr || gc1->flags != gc2->flags) + if (gc1->attr != gc2->attr) + return (0); + if ((flags1 & ~GRID_FLAG_CLEARED) != (flags2 & ~GRID_FLAG_CLEARED)) return (0); if (gc1->link != gc2->link) return (0); @@ -252,6 +261,16 @@ grid_cells_equal(const struct grid_cell *gc1, const struct grid_cell *gc2) return (memcmp(gc1->data.data, gc2->data.data, gc1->data.size) == 0); } +/* Set grid cell to a tab. */ +void +grid_set_tab(struct grid_cell *gc, u_int width) +{ + memset(gc->data.data, 0, sizeof gc->data.data); + gc->flags |= GRID_FLAG_TAB; + gc->data.width = gc->data.size = gc->data.have = width; + memset(gc->data.data, ' ', gc->data.size); +} + /* Free one line. */ static void grid_free_line(struct grid *gd, u_int py) @@ -515,7 +534,11 @@ grid_get_cell1(struct grid_line *gl, u_int px, struct grid_cell *gc) gc->bg = gee->bg; gc->us = gee->us; gc->link = gee->link; - utf8_to_data(gee->data, &gc->data); + + if (gc->flags & GRID_FLAG_TAB) + grid_set_tab(gc, gee->data); + else + utf8_to_data(gee->data, &gc->data); } return; } @@ -1077,13 +1100,18 @@ grid_string_cells(struct grid *gd, u_int px, u_int py, u_int nx, } else codelen = 0; - data = gc.data.data; - size = gc.data.size; - if ((flags & GRID_STRING_ESCAPE_SEQUENCES) && - size == 1 && - *data == '\\') { - data = "\\\\"; - size = 2; + if (gc.flags & GRID_FLAG_TAB) { + data = "\t"; + size = 1; + } else { + data = gc.data.data; + size = gc.data.size; + if ((flags & GRID_STRING_ESCAPE_SEQUENCES) && + size == 1 && + *data == '\\') { + data = "\\\\"; + size = 2; + } } while (len < off + size + codelen + 1) { @@ -1533,3 +1561,27 @@ grid_line_length(struct grid *gd, u_int py) } return (px); } + +/* Check if character is in set. */ +int +grid_in_set(struct grid *gd, u_int px, u_int py, const char *set) +{ + struct grid_cell gc, tmp_gc; + u_int pxx; + + grid_get_cell(gd, px, py, &gc); + if (strchr(set, '\t')) { + if (gc.flags & GRID_FLAG_PADDING) { + pxx = px; + do + grid_get_cell(gd, --pxx, py, &tmp_gc); + while (pxx > 0 && tmp_gc.flags & GRID_FLAG_PADDING); + if (tmp_gc.flags & GRID_FLAG_TAB) + return (tmp_gc.data.width - (px - pxx)); + } else if (gc.flags & GRID_FLAG_TAB) + return (gc.data.width); + } + if (gc.flags & GRID_FLAG_PADDING) + return (0); + return (utf8_cstrhas(set, &gc.data)); +} diff --git a/usr.bin/tmux/input-keys.c b/usr.bin/tmux/input-keys.c index fc6cf7f82..92f90012f 100644 --- a/usr.bin/tmux/input-keys.c +++ b/usr.bin/tmux/input-keys.c @@ -1,4 +1,4 @@ -/* $OpenBSD: input-keys.c,v 1.101 2024/10/03 05:41:59 nicm Exp $ */ +/* $OpenBSD: input-keys.c,v 1.107 2025/01/02 10:34:45 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -543,12 +543,16 @@ input_key_mode1(struct bufferevent *bev, key_code key) log_debug("%s: key in %llx", __func__, key); + /* A regular or shifted key + Meta. */ + if ((key & (KEYC_CTRL | KEYC_META)) == KEYC_META) + return (input_key_vt10x(bev, key)); + /* * As per * https://invisible-island.net/xterm/modified-keys-us-pc105.html. */ onlykey = key & KEYC_MASK_KEY; - if ((key & (KEYC_META | KEYC_CTRL)) == KEYC_CTRL && + if ((key & KEYC_CTRL) && (onlykey == ' ' || onlykey == '/' || onlykey == '@' || @@ -557,13 +561,6 @@ input_key_mode1(struct bufferevent *bev, key_code key) (onlykey >= '@' && onlykey <= '~'))) return (input_key_vt10x(bev, key)); - /* - * A regular key + Meta. In the absence of a standard to back this, we - * mimic what iTerm 2 does. - */ - if ((key & (KEYC_CTRL | KEYC_META)) == KEYC_META) - return (input_key_vt10x(bev, key)); - return (-1); } @@ -589,14 +586,29 @@ input_key(struct screen *s, struct bufferevent *bev, key_code key) /* Is this backspace? */ if ((key & KEYC_MASK_KEY) == KEYC_BSPACE) { newkey = options_get_number(global_options, "backspace"); - if (newkey >= 0x7f) - newkey = '\177'; - key = newkey|(key & (KEYC_MASK_MODIFIERS|KEYC_MASK_FLAGS)); + log_debug("%s: key 0x%llx is backspace -> 0x%llx", __func__, + key, newkey); + if ((key & KEYC_MASK_MODIFIERS) == 0) { + ud.data[0] = 255; + if ((newkey & KEYC_MASK_MODIFIERS) == 0) + ud.data[0] = newkey; + else if ((newkey & KEYC_MASK_MODIFIERS) == KEYC_CTRL) { + newkey &= KEYC_MASK_KEY; + if (newkey >= 'A' && newkey <= 'Z') + ud.data[0] = newkey - 0x40; + else if (newkey >= 'a' && newkey <= 'z') + ud.data[0] = newkey - 0x60; + } + if (ud.data[0] != 255) + input_key_write(__func__, bev, &ud.data[0], 1); + return (0); + } + key = newkey|(key & (KEYC_MASK_FLAGS|KEYC_MASK_MODIFIERS)); } /* Is this backtab? */ if ((key & KEYC_MASK_KEY) == KEYC_BTAB) { - if ((s->mode & EXTENDED_KEY_MODES) != 0) { + if (s->mode & MODE_KEYS_EXTENDED_2) { /* When in xterm extended mode, remap into S-Tab. */ key = '\011' | (key & ~KEYC_MASK_KEY) | KEYC_SHIFT; } else { @@ -645,8 +657,7 @@ input_key(struct screen *s, struct bufferevent *bev, key_code key) if (ike != NULL) { log_debug("%s: found key 0x%llx: \"%s\"", __func__, key, ike->data); - if ((key == KEYC_PASTE_START || key == KEYC_PASTE_END) && - (~s->mode & MODE_BRACKETPASTE)) + if (KEYC_IS_PASTE(key) && (~s->mode & MODE_BRACKETPASTE)) return (0); if ((key & KEYC_META) && (~key & KEYC_IMPLIED_META)) input_key_write(__func__, bev, "\033", 1); diff --git a/usr.bin/tmux/input.c b/usr.bin/tmux/input.c index 76a401fdd..d78452ed1 100644 --- a/usr.bin/tmux/input.c +++ b/usr.bin/tmux/input.c @@ -1,4 +1,4 @@ -/* $OpenBSD: input.c,v 1.230 2024/10/14 20:26:45 nicm Exp $ */ +/* $OpenBSD: input.c,v 1.232 2024/11/11 08:41:05 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -93,7 +93,6 @@ struct input_ctx { size_t param_len; #define INPUT_BUF_START 32 -#define INPUT_BUF_LIMIT 1048576 u_char *input_buf; size_t input_len; size_t input_space; @@ -729,6 +728,9 @@ static const struct input_transition input_state_consume_st_table[] = { { -1, -1, NULL, NULL } }; +/* Maximum of bytes allowed to read in a single input. */ +static size_t input_buffer_size = INPUT_BUF_DEFAULT_SIZE; + /* Input table compare. */ static int input_table_compare(const void *key, const void *value) @@ -1193,7 +1195,7 @@ input_input(struct input_ctx *ictx) available = ictx->input_space; while (ictx->input_len + 1 >= available) { available *= 2; - if (available > INPUT_BUF_LIMIT) { + if (available > input_buffer_size) { ictx->flags |= INPUT_DISCARD; return (0); } @@ -1213,6 +1215,10 @@ input_c0_dispatch(struct input_ctx *ictx) struct screen_write_ctx *sctx = &ictx->ctx; struct window_pane *wp = ictx->wp; struct screen *s = sctx->s; + struct grid_cell gc, first_gc; + u_int cx = s->cx, line = s->cy + s->grid->hsize; + u_int width; + int has_content = 0; ictx->utf8started = 0; /* can't be valid UTF-8 */ @@ -1234,11 +1240,28 @@ input_c0_dispatch(struct input_ctx *ictx) break; /* Find the next tab point, or use the last column if none. */ + grid_get_cell(s->grid, s->cx, line, &first_gc); do { - s->cx++; - if (bit_test(s->tabs, s->cx)) + if (!has_content) { + grid_get_cell(s->grid, cx, line, &gc); + if (gc.data.size != 1 || + *gc.data.data != ' ' || + !grid_cells_look_equal(&gc, &first_gc)) + has_content = 1; + } + cx++; + if (bit_test(s->tabs, cx)) break; - } while (s->cx < screen_size_x(s) - 1); + } while (cx < screen_size_x(s) - 1); + + width = cx - s->cx; + if (has_content || width > sizeof gc.data.data) + s->cx = cx; + else { + grid_get_cell(s->grid, s->cx, line, &gc); + grid_set_tab(&gc, width); + screen_write_collect_add(sctx, &gc); + } break; case '\012': /* LF */ case '\013': /* VT */ @@ -2996,3 +3019,11 @@ input_reply_clipboard(struct bufferevent *bev, const char *buf, size_t len, bufferevent_write(bev, end, strlen(end)); free(out); } + +/* Set input buffer size. */ +void +input_set_buffer_size(size_t buffer_size) +{ + log_debug("%s: %lu -> %lu", __func__, input_buffer_size, buffer_size); + input_buffer_size = buffer_size; +} diff --git a/usr.bin/tmux/key-bindings.c b/usr.bin/tmux/key-bindings.c index 5f14aa374..c248003bd 100644 --- a/usr.bin/tmux/key-bindings.c +++ b/usr.bin/tmux/key-bindings.c @@ -1,4 +1,4 @@ -/* $OpenBSD: key-bindings.c,v 1.150 2024/10/04 07:03:08 nicm Exp $ */ +/* $OpenBSD: key-bindings.c,v 1.151 2024/11/12 09:32:56 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -478,6 +478,11 @@ key_bindings_init(void) "bind -n MouseDown3Pane { if -Ft= '#{||:#{mouse_any_flag},#{&&:#{pane_in_mode},#{?#{m/r:(copy|view)-mode,#{pane_mode}},0,1}}}' { select-pane -t=; send -M } { display-menu -t= -xM -yM -T '#[align=centre]#{pane_index} (#{pane_id})' " DEFAULT_PANE_MENU " } }", "bind -n M-MouseDown3Pane { display-menu -t= -xM -yM -T '#[align=centre]#{pane_index} (#{pane_id})' " DEFAULT_PANE_MENU " }", + /* Mouse on scrollbar. */ + "bind -n MouseDown1ScrollbarUp { copy-mode -u }", + "bind -n MouseDown1ScrollbarDown { copy-mode -d }", + "bind -n MouseDrag1ScrollbarSlider { copy-mode -S }", + /* Copy mode (emacs) keys. */ "bind -Tcopy-mode C-Space { send -X begin-selection }", "bind -Tcopy-mode C-a { send -X start-of-line }", diff --git a/usr.bin/tmux/layout.c b/usr.bin/tmux/layout.c index 33d680d37..0a3069dbb 100644 --- a/usr.bin/tmux/layout.c +++ b/usr.bin/tmux/layout.c @@ -1,4 +1,4 @@ -/* $OpenBSD: layout.c,v 1.48 2021/03/11 06:31:05 nicm Exp $ */ +/* $OpenBSD: layout.c,v 1.52 2024/12/17 08:40:24 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -275,7 +275,8 @@ layout_cell_is_bottom(struct window *w, struct layout_cell *lc) * the case for the most upper or lower panes only. */ static int -layout_add_border(struct window *w, struct layout_cell *lc, int status) +layout_add_horizontal_border(struct window *w, struct layout_cell *lc, + int status) { if (status == PANE_STATUS_TOP) return (layout_cell_is_top(w, lc)); @@ -290,22 +291,53 @@ layout_fix_panes(struct window *w, struct window_pane *skip) { struct window_pane *wp; struct layout_cell *lc; - int status; + int status, scrollbars, sb_pos, sb_w, sb_pad; + u_int sx, sy; status = options_get_number(w->options, "pane-border-status"); + scrollbars = options_get_number(w->options, "pane-scrollbars"); + sb_pos = options_get_number(w->options, "pane-scrollbars-position"); + TAILQ_FOREACH(wp, &w->panes, entry) { if ((lc = wp->layout_cell) == NULL || wp == skip) continue; wp->xoff = lc->xoff; wp->yoff = lc->yoff; + sx = lc->sx; + sy = lc->sy; - if (layout_add_border(w, lc, status)) { + if (layout_add_horizontal_border(w, lc, status)) { if (status == PANE_STATUS_TOP) wp->yoff++; - window_pane_resize(wp, lc->sx, lc->sy - 1); - } else - window_pane_resize(wp, lc->sx, lc->sy); + sy--; + } + + if (window_pane_show_scrollbar(wp, scrollbars)) { + sb_w = wp->scrollbar_style.width; + sb_pad = wp->scrollbar_style.pad; + if (sb_w < 1) + sb_w = 1; + if (sb_pad < 0) + sb_pad = 0; + if (sb_pos == PANE_SCROLLBARS_LEFT) { + if ((int)sx - sb_w < PANE_MINIMUM) { + wp->xoff = wp->xoff + + (int)sx - PANE_MINIMUM; + sx = PANE_MINIMUM; + } else { + sx = sx - sb_w - sb_pad; + wp->xoff = wp->xoff + sb_w + sb_pad; + } + } else /* sb_pos == PANE_SCROLLBARS_RIGHT */ + if ((int)sx - sb_w - sb_pad < PANE_MINIMUM) + sx = PANE_MINIMUM; + else + sx = sx - sb_w - sb_pad; + wp->flags |= PANE_REDRAWSCROLLBAR; + } + + window_pane_resize(wp, sx, sy); } } @@ -336,18 +368,25 @@ layout_resize_check(struct window *w, struct layout_cell *lc, enum layout_type type) { struct layout_cell *lcchild; + struct style *sb_style = &w->active->scrollbar_style; u_int available, minimum; - int status; + int status, scrollbars; status = options_get_number(w->options, "pane-border-status"); + scrollbars = options_get_number(w->options, "pane-scrollbars"); + if (lc->type == LAYOUT_WINDOWPANE) { /* Space available in this cell only. */ if (type == LAYOUT_LEFTRIGHT) { available = lc->sx; - minimum = PANE_MINIMUM; + if (scrollbars) + minimum = PANE_MINIMUM + sb_style->width + + sb_style->pad; + else + minimum = PANE_MINIMUM; } else { available = lc->sy; - if (layout_add_border(w, lc, status)) + if (layout_add_horizontal_border(w, lc, status)) minimum = PANE_MINIMUM + 1; else minimum = PANE_MINIMUM; @@ -869,10 +908,12 @@ struct layout_cell * layout_split_pane(struct window_pane *wp, enum layout_type type, int size, int flags) { - struct layout_cell *lc, *lcparent, *lcnew, *lc1, *lc2; - u_int sx, sy, xoff, yoff, size1, size2, minimum; - u_int new_size, saved_size, resize_first = 0; - int full_size = (flags & SPAWN_FULLSIZE), status; + struct layout_cell *lc, *lcparent, *lcnew, *lc1, *lc2; + struct style *sb_style = &wp->scrollbar_style; + u_int sx, sy, xoff, yoff, size1, size2, minimum; + u_int new_size, saved_size, resize_first = 0; + int full_size = (flags & SPAWN_FULLSIZE), status; + int scrollbars; /* * If full_size is specified, add a new cell at the top of the window @@ -883,6 +924,7 @@ layout_split_pane(struct window_pane *wp, enum layout_type type, int size, else lc = wp->layout_cell; status = options_get_number(wp->window->options, "pane-border-status"); + scrollbars = options_get_number(wp->window->options, "pane-scrollbars"); /* Copy the old cell size. */ sx = lc->sx; @@ -893,11 +935,16 @@ layout_split_pane(struct window_pane *wp, enum layout_type type, int size, /* Check there is enough space for the two new panes. */ switch (type) { case LAYOUT_LEFTRIGHT: - if (sx < PANE_MINIMUM * 2 + 1) + if (scrollbars) { + minimum = PANE_MINIMUM * 2 + sb_style->width + + sb_style->pad; + } else + minimum = PANE_MINIMUM * 2 + 1; + if (sx < minimum) return (NULL); break; case LAYOUT_TOPBOTTOM: - if (layout_add_border(wp->window, lc, status)) + if (layout_add_horizontal_border(wp->window, lc, status)) minimum = PANE_MINIMUM * 2 + 2; else minimum = PANE_MINIMUM * 2 + 1; @@ -1053,8 +1100,9 @@ int layout_spread_cell(struct window *w, struct layout_cell *parent) { struct layout_cell *lc; - u_int number, each, size, this; - int change, changed, status; + struct style *sb_style = &w->active->scrollbar_style; + u_int number, each, size, this, remainder; + int change, changed, status, scrollbars; number = 0; TAILQ_FOREACH (lc, &parent->cells, entry) @@ -1062,11 +1110,16 @@ layout_spread_cell(struct window *w, struct layout_cell *parent) if (number <= 1) return (0); status = options_get_number(w->options, "pane-border-status"); + scrollbars = options_get_number(w->options, "pane-scrollbars"); - if (parent->type == LAYOUT_LEFTRIGHT) - size = parent->sx; + if (parent->type == LAYOUT_LEFTRIGHT) { + if (scrollbars) + size = parent->sx - sb_style->width + sb_style->pad; + else + size = parent->sx; + } else if (parent->type == LAYOUT_TOPBOTTOM) { - if (layout_add_border(w, parent, status)) + if (layout_add_horizontal_border(w, parent, status)) size = parent->sy - 1; else size = parent->sy; @@ -1077,20 +1130,31 @@ layout_spread_cell(struct window *w, struct layout_cell *parent) each = (size - (number - 1)) / number; if (each == 0) return (0); + /* + * Remaining space after assigning that which can be evenly + * distributed. + */ + remainder = size - (number * (each + 1)) + 1; changed = 0; TAILQ_FOREACH (lc, &parent->cells, entry) { - if (TAILQ_NEXT(lc, entry) == NULL) - each = size - ((each + 1) * (number - 1)); change = 0; if (parent->type == LAYOUT_LEFTRIGHT) { change = each - (int)lc->sx; + if (remainder > 0) { + change++; + remainder--; + } layout_resize_adjust(w, lc, LAYOUT_LEFTRIGHT, change); } else if (parent->type == LAYOUT_TOPBOTTOM) { - if (layout_add_border(w, lc, status)) + if (layout_add_horizontal_border(w, lc, status)) this = each + 1; else this = each; + if (remainder > 0) { + this++; + remainder--; + } change = this - (int)lc->sy; layout_resize_adjust(w, lc, LAYOUT_TOPBOTTOM, change); } diff --git a/usr.bin/tmux/mode-tree.c b/usr.bin/tmux/mode-tree.c index 0a9051508..f63329938 100644 --- a/usr.bin/tmux/mode-tree.c +++ b/usr.bin/tmux/mode-tree.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mode-tree.c,v 1.71 2024/10/06 09:30:22 nicm Exp $ */ +/* $OpenBSD: mode-tree.c,v 1.72 2024/12/16 08:54:34 nicm Exp $ */ /* * Copyright (c) 2017 Nicholas Marriott @@ -1044,8 +1044,11 @@ mode_tree_display_menu(struct mode_tree_data *mtd, struct client *c, u_int x, else x = 0; if (menu_display(menu, 0, 0, NULL, x, y, c, BOX_LINES_DEFAULT, NULL, - NULL, NULL, NULL, mode_tree_menu_callback, mtm) != 0) + NULL, NULL, NULL, mode_tree_menu_callback, mtm) != 0) { + mode_tree_remove_ref(mtd); + free(mtm); menu_free(menu); + } } int diff --git a/usr.bin/tmux/options-table.c b/usr.bin/tmux/options-table.c index 44c4506df..01c86b8e6 100644 --- a/usr.bin/tmux/options-table.c +++ b/usr.bin/tmux/options-table.c @@ -1,4 +1,4 @@ -/* $OpenBSD: options-table.c,v 1.182 2024/10/07 12:58:36 nicm Exp $ */ +/* $OpenBSD: options-table.c,v 1.188 2025/01/01 15:17:36 nicm Exp $ */ /* * Copyright (c) 2011 Nicholas Marriott @@ -64,6 +64,12 @@ static const char *options_table_cursor_style_list[] = { "default", "blinking-block", "block", "blinking-underline", "underline", "blinking-bar", "bar", NULL }; +static const char *options_table_pane_scrollbars_list[] = { + "off", "modal", "on", NULL +}; +static const char *options_table_pane_scrollbars_position_list[] = { + "right", "left", NULL +}; static const char *options_table_pane_status_list[] = { "off", "top", "bottom", NULL }; @@ -248,6 +254,15 @@ const struct options_table_entry options_table[] = { "Each entry is an alias and a command separated by '='." }, + { .name = "codepoint-widths", + .type = OPTIONS_TABLE_STRING, + .scope = OPTIONS_TABLE_SERVER, + .flags = OPTIONS_TABLE_IS_ARRAY, + .default_str = "", + .separator = ",", + .text = "Array of override widths for Unicode codepoints." + }, + { .name = "copy-command", .type = OPTIONS_TABLE_STRING, .scope = OPTIONS_TABLE_SERVER, @@ -342,6 +357,15 @@ const struct options_table_entry options_table[] = { "Empty does not write a history file." }, + { .name = "input-buffer-size", + .type = OPTIONS_TABLE_NUMBER, + .scope = OPTIONS_TABLE_SERVER, + .minimum = INPUT_BUF_DEFAULT_SIZE, + .maximum = UINT_MAX, + .default_num = INPUT_BUF_DEFAULT_SIZE, + .text = "Number of byte accpted in a single input before dropping." + }, + { .name = "menu-style", .type = OPTIONS_TABLE_STRING, .scope = OPTIONS_TABLE_WINDOW, @@ -577,7 +601,7 @@ const struct options_table_entry options_table[] = { .type = OPTIONS_TABLE_NUMBER, .scope = OPTIONS_TABLE_SESSION, .minimum = 0, - .maximum = 10000, + .maximum = 2000000, .default_num = 0, .unit = "milliseconds", .text = "Time to wait for a key binding to repeat the first time the " @@ -672,7 +696,7 @@ const struct options_table_entry options_table[] = { .type = OPTIONS_TABLE_NUMBER, .scope = OPTIONS_TABLE_SESSION, .minimum = 0, - .maximum = 10000, + .maximum = 2000000, .default_num = 500, .unit = "milliseconds", .text = "Time to wait for a key binding to repeat, if it is bound " @@ -1011,6 +1035,24 @@ const struct options_table_entry options_table[] = { .text = "Format of the position indicator in copy mode." }, + { .name = "copy-mode-position-style", + .type = OPTIONS_TABLE_STRING, + .scope = OPTIONS_TABLE_WINDOW, + .default_str = "#{mode-style}", + .flags = OPTIONS_TABLE_IS_STYLE, + .separator = ",", + .text = "Style of position indicator in copy mode." + }, + + { .name = "copy-mode-selection-style", + .type = OPTIONS_TABLE_STRING, + .scope = OPTIONS_TABLE_WINDOW, + .default_str = "#{mode-style}", + .flags = OPTIONS_TABLE_IS_STYLE, + .separator = ",", + .text = "Style of selection in copy mode." + }, + { .name = "fill-character", .type = OPTIONS_TABLE_STRING, .scope = OPTIONS_TABLE_WINDOW, @@ -1161,7 +1203,32 @@ const struct options_table_entry options_table[] = { .text = "The default colour palette for colours zero to 255." }, - { .name = "popup-style", + { .name = "pane-scrollbars", + .type = OPTIONS_TABLE_CHOICE, + .scope = OPTIONS_TABLE_WINDOW, + .choices = options_table_pane_scrollbars_list, + .default_num = PANE_SCROLLBARS_OFF, + .text = "Pane scrollbar state." + }, + + { .name = "pane-scrollbars-style", + .type = OPTIONS_TABLE_STRING, + .scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE, + .default_str = "bg=black,fg=white,width=1,pad=0", + .flags = OPTIONS_TABLE_IS_STYLE, + .separator = ",", + .text = "Style of the pane scrollbar." + }, + + { .name = "pane-scrollbars-position", + .type = OPTIONS_TABLE_CHOICE, + .scope = OPTIONS_TABLE_WINDOW, + .choices = options_table_pane_scrollbars_position_list, + .default_num = PANE_SCROLLBARS_RIGHT, + .text = "Pane scrollbar position." + }, + + { .name = "popup-style", .type = OPTIONS_TABLE_STRING, .scope = OPTIONS_TABLE_WINDOW, .default_str = "default", diff --git a/usr.bin/tmux/options.c b/usr.bin/tmux/options.c index e47999422..4ad617e86 100644 --- a/usr.bin/tmux/options.c +++ b/usr.bin/tmux/options.c @@ -1,4 +1,4 @@ -/* $OpenBSD: options.c,v 1.70 2024/07/22 15:27:42 nicm Exp $ */ +/* $OpenBSD: options.c,v 1.74 2025/01/01 15:17:36 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott @@ -1171,10 +1171,24 @@ options_push_changes(const char *name) RB_FOREACH(wp, window_pane_tree, &all_window_panes) colour_palette_from_option(&wp->palette, wp->options); } - if (strcmp(name, "pane-border-status") == 0) { + if (strcmp(name, "pane-border-status") == 0 || + strcmp(name, "pane-scrollbars") == 0 || + strcmp(name, "pane-scrollbars-position") == 0) { RB_FOREACH(w, windows, &windows) layout_fix_panes(w, NULL); } + if (strcmp(name, "pane-scrollbars-style") == 0) { + RB_FOREACH(wp, window_pane_tree, &all_window_panes) { + style_set_scrollbar_style_from_option( + &wp->scrollbar_style, wp->options); + } + RB_FOREACH(w, windows, &windows) + layout_fix_panes(w, NULL); + } + if (strcmp(name, "codepoint-widths") == 0) + utf8_update_width_cache(); + if (strcmp(name, "input-buffer-size") == 0) + input_set_buffer_size(options_get_number(global_options, name)); RB_FOREACH(s, sessions, &sessions) status_update_cache(s); diff --git a/usr.bin/tmux/popup.c b/usr.bin/tmux/popup.c index 652b58283..dbbbb570a 100644 --- a/usr.bin/tmux/popup.c +++ b/usr.bin/tmux/popup.c @@ -1,4 +1,4 @@ -/* $OpenBSD: popup.c,v 1.55 2024/09/30 07:54:51 nicm Exp $ */ +/* $OpenBSD: popup.c,v 1.56 2024/11/25 08:36:46 nicm Exp $ */ /* * Copyright (c) 2020 Nicholas Marriott @@ -692,6 +692,7 @@ popup_display(int flags, enum box_lines lines, struct cmdq_item *item, u_int px, pd->border_cell.attr = 0; screen_init(&pd->s, jx, jy, 0); + screen_set_default_cursor(&pd->s, global_w_options); colour_palette_init(&pd->palette); colour_palette_from_option(&pd->palette, global_w_options); diff --git a/usr.bin/tmux/proc.c b/usr.bin/tmux/proc.c index d001ba9c3..5c759a581 100644 --- a/usr.bin/tmux/proc.c +++ b/usr.bin/tmux/proc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: proc.c,v 1.24 2024/02/13 08:10:23 nicm Exp $ */ +/* $OpenBSD: proc.c,v 1.30 2024/11/21 13:35:20 claudio Exp $ */ /* * Copyright (c) 2015 Nicholas Marriott @@ -77,8 +77,7 @@ proc_event_cb(__unused int fd, short events, void *arg) struct imsg imsg; if (!(peer->flags & PEER_BAD) && (events & EV_READ)) { - if (((n = imsg_read(&peer->ibuf)) == -1 && errno != EAGAIN) || - n == 0) { + if (imsgbuf_read(&peer->ibuf) != 1) { peer->dispatchcb(NULL, peer->arg); return; } @@ -105,13 +104,13 @@ proc_event_cb(__unused int fd, short events, void *arg) } if (events & EV_WRITE) { - if (msgbuf_write(&peer->ibuf.w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(&peer->ibuf) == -1) { peer->dispatchcb(NULL, peer->arg); return; } } - if ((peer->flags & PEER_BAD) && peer->ibuf.w.queued == 0) { + if ((peer->flags & PEER_BAD) && imsgbuf_queuelen(&peer->ibuf) == 0) { peer->dispatchcb(NULL, peer->arg); return; } @@ -152,7 +151,7 @@ proc_update_event(struct tmuxpeer *peer) event_del(&peer->event); events = EV_READ; - if (peer->ibuf.w.queued > 0) + if (imsgbuf_queuelen(&peer->ibuf) > 0) events |= EV_WRITE; event_set(&peer->event, peer->ibuf.fd, events, proc_event_cb, peer); @@ -218,7 +217,7 @@ proc_exit(struct tmuxproc *tp) struct tmuxpeer *peer; TAILQ_FOREACH(peer, &tp->peers, entry) - imsg_flush(&peer->ibuf); + imsgbuf_flush(&peer->ibuf); tp->exit = 1; } @@ -306,7 +305,9 @@ proc_add_peer(struct tmuxproc *tp, int fd, peer->dispatchcb = dispatchcb; peer->arg = arg; - imsg_init(&peer->ibuf, fd); + if (imsgbuf_init(&peer->ibuf, fd) == -1) + fatal("imsgbuf_init"); + imsgbuf_allow_fdpass(&peer->ibuf); event_set(&peer->event, fd, EV_READ, proc_event_cb, peer); if (getpeereid(fd, &peer->uid, &gid) != 0) @@ -326,7 +327,7 @@ proc_remove_peer(struct tmuxpeer *peer) log_debug("remove peer %p", peer); event_del(&peer->event); - imsg_clear(&peer->ibuf); + imsgbuf_clear(&peer->ibuf); close(peer->ibuf.fd); free(peer); @@ -341,7 +342,7 @@ proc_kill_peer(struct tmuxpeer *peer) void proc_flush_peer(struct tmuxpeer *peer) { - imsg_flush(&peer->ibuf); + imsgbuf_flush(&peer->ibuf); } void diff --git a/usr.bin/tmux/resize.c b/usr.bin/tmux/resize.c index ee193458e..6b7c43dea 100644 --- a/usr.bin/tmux/resize.c +++ b/usr.bin/tmux/resize.c @@ -1,4 +1,4 @@ -/* $OpenBSD: resize.c,v 1.51 2024/03/21 11:30:42 nicm Exp $ */ +/* $OpenBSD: resize.c,v 1.52 2024/11/27 10:12:20 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -264,16 +264,9 @@ skip: } static int -default_window_size_skip_client(struct client *loop, int type, +default_window_size_skip_client(struct client *loop, __unused int type, __unused int current, struct session *s, struct window *w) { - /* - * Latest checks separately, so do not check here. Otherwise only - * include clients where the session contains the window or where the - * session is the given session. - */ - if (type == WINDOW_SIZE_LATEST) - return (0); if (w != NULL && !session_has(loop->session, w)) return (1); if (w == NULL && loop->session != s) @@ -305,12 +298,12 @@ default_window_size(struct client *c, struct session *s, struct window *w, goto done; } - /* - * Ignore the given client if it is a control client - the creating - * client should only affect the size if it is not a control client. - */ - if (c != NULL && (c->flags & CLIENT_CONTROL)) - c = NULL; + /* + * Ignore the given client if it is a control client - the creating + * client should only affect the size if it is not a control client. + */ + if (c != NULL && (c->flags & CLIENT_CONTROL)) + c = NULL; /* * Look for a client to base the size on. If none exists (or the type diff --git a/usr.bin/tmux/screen-redraw.c b/usr.bin/tmux/screen-redraw.c index af3f1cee1..11a2c685b 100644 --- a/usr.bin/tmux/screen-redraw.c +++ b/usr.bin/tmux/screen-redraw.c @@ -1,4 +1,4 @@ -/* $OpenBSD: screen-redraw.c,v 1.99 2024/10/08 09:40:50 nicm Exp $ */ +/* $OpenBSD: screen-redraw.c,v 1.103 2024/11/15 13:12:20 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -30,6 +30,11 @@ static void screen_redraw_draw_pane(struct screen_redraw_ctx *, struct window_pane *); static void screen_redraw_set_context(struct client *, struct screen_redraw_ctx *); +static void screen_redraw_draw_pane_scrollbars(struct screen_redraw_ctx *); +static void screen_redraw_draw_scrollbar(struct screen_redraw_ctx *, + struct window_pane *, int, int, int, u_int, u_int, u_int); +static void screen_redraw_draw_pane_scrollbar(struct screen_redraw_ctx *, + struct window_pane *); #define START_ISOLATE "\342\201\246" #define END_ISOLATE "\342\201\251" @@ -113,9 +118,10 @@ screen_redraw_pane_border(struct screen_redraw_ctx *ctx, struct window_pane *wp, u_int px, u_int py) { struct options *oo = wp->window->options; - int split = 0; u_int ex = wp->xoff + wp->sx, ey = wp->yoff + wp->sy; - int pane_status = ctx->pane_status; + int hsplit = 0, vsplit = 0, pane_status = ctx->pane_status; + int pane_scrollbars = ctx->pane_scrollbars, sb_w = 0; + int sb_pos = ctx->pane_scrollbars_pos; /* Inside pane. */ if (px >= wp->xoff && px < ex && py >= wp->yoff && py < ey) @@ -125,62 +131,60 @@ screen_redraw_pane_border(struct screen_redraw_ctx *ctx, struct window_pane *wp, switch (options_get_number(oo, "pane-border-indicators")) { case PANE_BORDER_COLOUR: case PANE_BORDER_BOTH: - split = 1; + hsplit = screen_redraw_two_panes(wp->window, 0); + vsplit = screen_redraw_two_panes(wp->window, 1); break; } - /* Left/right borders. */ - if (pane_status == PANE_STATUS_OFF) { - if (screen_redraw_two_panes(wp->window, 0) && split) { - if (wp->xoff == 0 && px == wp->sx && py <= wp->sy / 2) - return (SCREEN_REDRAW_BORDER_RIGHT); - if (wp->xoff != 0 && - px == wp->xoff - 1 && - py > wp->sy / 2) - return (SCREEN_REDRAW_BORDER_LEFT); - } else { - if ((wp->yoff == 0 || py >= wp->yoff - 1) && py <= ey) { - if (wp->xoff != 0 && px == wp->xoff - 1) - return (SCREEN_REDRAW_BORDER_LEFT); - if (px == ex) + /* Are scrollbars enabled? */ + if (window_pane_show_scrollbar(wp, pane_scrollbars)) + sb_w = wp->scrollbar_style.width + wp->scrollbar_style.pad; + + /* + * Left/right borders. The wp->sy / 2 test is to colour only half the + * active window's border when there are two panes. + */ + if ((wp->yoff == 0 || py >= wp->yoff - 1) && py <= ey) { + if (sb_pos == PANE_SCROLLBARS_LEFT) { + if (wp->xoff - sb_w == 0 && px == wp->sx + sb_w) + if (!hsplit || (hsplit && py <= wp->sy / 2)) + return (SCREEN_REDRAW_BORDER_RIGHT); + if (wp->xoff - sb_w != 0 && px == wp->xoff - sb_w - 1) + if (!hsplit || (hsplit && py > wp->sy / 2)) + return (SCREEN_REDRAW_BORDER_LEFT); + } else { /* sb_pos == PANE_SCROLLBARS_RIGHT */ + if (wp->xoff == 0 && px == wp->sx + sb_w) + if (!hsplit || (hsplit && py <= wp->sy / 2)) return (SCREEN_REDRAW_BORDER_RIGHT); - } - } - } else { - if ((wp->yoff == 0 || py >= wp->yoff - 1) && py <= ey) { if (wp->xoff != 0 && px == wp->xoff - 1) - return (SCREEN_REDRAW_BORDER_LEFT); - if (px == ex) - return (SCREEN_REDRAW_BORDER_RIGHT); + if (!hsplit || (hsplit && py > wp->sy / 2)) + return (SCREEN_REDRAW_BORDER_LEFT); } } /* Top/bottom borders. */ - if (pane_status == PANE_STATUS_OFF) { - if (screen_redraw_two_panes(wp->window, 1) && split) { - if (wp->yoff == 0 && py == wp->sy && px <= wp->sx / 2) - return (SCREEN_REDRAW_BORDER_BOTTOM); - if (wp->yoff != 0 && - py == wp->yoff - 1 && - px > wp->sx / 2) - return (SCREEN_REDRAW_BORDER_TOP); - } else { - if ((wp->xoff == 0 || px >= wp->xoff - 1) && px <= ex) { + if (vsplit && pane_status == PANE_STATUS_OFF && sb_w == 0) { + if (wp->yoff == 0 && py == wp->sy && px <= wp->sx / 2) + return (SCREEN_REDRAW_BORDER_BOTTOM); + if (wp->yoff != 0 && py == wp->yoff - 1 && px > wp->sx / 2) + return (SCREEN_REDRAW_BORDER_TOP); + } else { + if (sb_pos == PANE_SCROLLBARS_LEFT) { + if ((wp->xoff - sb_w == 0 || px >= wp->xoff - sb_w) && + (px <= ex || (sb_w != 0 && px < ex + sb_w))) { + if (wp->yoff != 0 && py == wp->yoff - 1) + return (SCREEN_REDRAW_BORDER_TOP); + if (py == ey) + return (SCREEN_REDRAW_BORDER_BOTTOM); + } + } else { /* sb_pos == PANE_SCROLLBARS_RIGHT */ + if ((wp->xoff == 0 || px >= wp->xoff) && + (px <= ex || (sb_w != 0 && px < ex + sb_w))) { if (wp->yoff != 0 && py == wp->yoff - 1) return (SCREEN_REDRAW_BORDER_TOP); if (py == ey) return (SCREEN_REDRAW_BORDER_BOTTOM); } - } - } else if (pane_status == PANE_STATUS_TOP) { - if ((wp->xoff == 0 || px >= wp->xoff - 1) && px <= ex) { - if (wp->yoff != 0 && py == wp->yoff - 1) - return (SCREEN_REDRAW_BORDER_TOP); - } - } else { - if ((wp->xoff == 0 || px >= wp->xoff - 1) && px <= ex) { - if (py == ey) - return (SCREEN_REDRAW_BORDER_BOTTOM); } } @@ -243,8 +247,12 @@ screen_redraw_type_of_cell(struct screen_redraw_ctx *ctx, u_int px, u_int py) return (CELL_OUTSIDE); /* - * Construct a bitmask of whether the cells to the left (bit 4), right, + * Construct a bitmask of whether the cells to the left (bit 8), right, * top, and bottom (bit 1) of this cell are borders. + * + * bits 8 4 2 1: 2 + * 8 + 4 + * 1 */ if (px == 0 || screen_redraw_cell_border(ctx, px - 1, py)) borders |= 8; @@ -313,8 +321,10 @@ screen_redraw_check_cell(struct screen_redraw_ctx *ctx, u_int px, u_int py, struct window_pane *wp, *active; int pane_status = ctx->pane_status; u_int sx = w->sx, sy = w->sy; - int border; + int border, pane_scrollbars = ctx->pane_scrollbars; u_int right, line; + int sb_pos = ctx->pane_scrollbars_pos; + int sb_w; *wpp = NULL; @@ -351,6 +361,35 @@ screen_redraw_check_cell(struct screen_redraw_ctx *ctx, u_int px, u_int py, goto next2; *wpp = wp; + /* Check if CELL_SCROLLBAR */ + if (window_pane_show_scrollbar(wp, pane_scrollbars)) { + + if (pane_status == PANE_STATUS_TOP) + line = wp->yoff - 1; + else + line = wp->yoff + wp->sy; + + /* + * Check if py could lie within a scrollbar. If the + * pane is at the top then py == 0 to sy; if the pane + * is not at the top, then yoff to yoff + sy. + */ + sb_w = wp->scrollbar_style.width + + wp->scrollbar_style.pad; + if ((pane_status && py != line) || + (wp->yoff == 0 && py < wp->sy) || + (py >= wp->yoff && py < wp->yoff + wp->sy)) { + /* Check if px lies within a scrollbar. */ + if ((sb_pos == PANE_SCROLLBARS_RIGHT && + (px >= wp->xoff + wp->sx && + px < wp->xoff + wp->sx + sb_w)) || + (sb_pos == PANE_SCROLLBARS_LEFT && + (px >= wp->xoff - sb_w && + px < wp->xoff))) + return (CELL_SCROLLBAR); + } + } + /* * If definitely inside, return. If not on border, skip. * Otherwise work out the cell. @@ -510,14 +549,13 @@ screen_redraw_draw_pane_status(struct screen_redraw_ctx *ctx) /* Update status line and change flags if unchanged. */ static uint64_t -screen_redraw_update(struct client *c, uint64_t flags) +screen_redraw_update(struct screen_redraw_ctx *ctx, uint64_t flags) { + struct client *c = ctx->c; struct window *w = c->session->curw->window; struct window_pane *wp; - struct options *wo = w->options; int redraw; enum pane_lines lines; - struct screen_redraw_ctx ctx; if (c->message_string != NULL) redraw = status_message_redraw(c); @@ -531,17 +569,17 @@ screen_redraw_update(struct client *c, uint64_t flags) if (c->overlay_draw != NULL) flags |= CLIENT_REDRAWOVERLAY; - if (options_get_number(wo, "pane-border-status") != PANE_STATUS_OFF) { - screen_redraw_set_context(c, &ctx); - lines = options_get_number(wo, "pane-border-lines"); + if (ctx->pane_status != PANE_STATUS_OFF) { + lines = ctx->pane_lines; redraw = 0; TAILQ_FOREACH(wp, &w->panes, entry) { - if (screen_redraw_make_pane_status(c, wp, &ctx, lines)) + if (screen_redraw_make_pane_status(c, wp, ctx, lines)) redraw = 1; } if (redraw) flags |= CLIENT_REDRAWBORDERS; } + return (flags); } @@ -568,6 +606,10 @@ screen_redraw_set_context(struct client *c, struct screen_redraw_ctx *ctx) ctx->pane_status = options_get_number(wo, "pane-border-status"); ctx->pane_lines = options_get_number(wo, "pane-border-lines"); + ctx->pane_scrollbars = options_get_number(wo, "pane-scrollbars"); + ctx->pane_scrollbars_pos = options_get_number(wo, + "pane-scrollbars-position"); + tty_window_offset(&c->tty, &ctx->ox, &ctx->oy, &ctx->sx, &ctx->sy); log_debug("%s: %s @%u ox=%u oy=%u sx=%u sy=%u %u/%d", __func__, c->name, @@ -585,11 +627,12 @@ screen_redraw_screen(struct client *c) if (c->flags & CLIENT_SUSPENDED) return; - flags = screen_redraw_update(c, c->flags); + screen_redraw_set_context(c, &ctx); + + flags = screen_redraw_update(&ctx, c->flags); if ((flags & CLIENT_ALLREDRAWFLAGS) == 0) return; - screen_redraw_set_context(c, &ctx); tty_sync_start(&c->tty); tty_update_mode(&c->tty, c->tty.mode, NULL); @@ -598,10 +641,12 @@ screen_redraw_screen(struct client *c) screen_redraw_draw_borders(&ctx); if (ctx.pane_status != PANE_STATUS_OFF) screen_redraw_draw_pane_status(&ctx); + screen_redraw_draw_pane_scrollbars(&ctx); } if (flags & CLIENT_REDRAWWINDOW) { log_debug("%s: redrawing panes", c->name); screen_redraw_draw_panes(&ctx); + screen_redraw_draw_pane_scrollbars(&ctx); } if (ctx.statuslines != 0 && (flags & (CLIENT_REDRAWSTATUS|CLIENT_REDRAWSTATUSALWAYS))) { @@ -616,11 +661,12 @@ screen_redraw_screen(struct client *c) tty_reset(&c->tty); } -/* Redraw a single pane. */ +/* Redraw a single pane and its scrollbar. */ void -screen_redraw_pane(struct client *c, struct window_pane *wp) +screen_redraw_pane(struct client *c, struct window_pane *wp, + int redraw_scrollbar_only) { - struct screen_redraw_ctx ctx; + struct screen_redraw_ctx ctx; if (!window_pane_visible(wp)) return; @@ -629,7 +675,11 @@ screen_redraw_pane(struct client *c, struct window_pane *wp) tty_sync_start(&c->tty); tty_update_mode(&c->tty, c->tty.mode, NULL); - screen_redraw_draw_pane(&ctx, wp); + if (!redraw_scrollbar_only) + screen_redraw_draw_pane(&ctx, wp); + + if (window_pane_show_scrollbar(wp, ctx.pane_scrollbars)) + screen_redraw_draw_pane_scrollbar(&ctx, wp); tty_reset(&c->tty); } @@ -675,8 +725,7 @@ screen_redraw_draw_borders_cell(struct screen_redraw_ctx *ctx, u_int i, u_int j) const struct grid_cell *tmp; struct overlay_ranges r; u_int cell_type, x = ctx->ox + i, y = ctx->oy + j; - int arrows = 0, border; - int isolates; + int arrows = 0, border, isolates; if (c->overlay_check != NULL) { c->overlay_check(c, c->overlay_data, x, y, 1, &r); @@ -685,7 +734,7 @@ screen_redraw_draw_borders_cell(struct screen_redraw_ctx *ctx, u_int i, u_int j) } cell_type = screen_redraw_check_cell(ctx, x, y, &wp); - if (cell_type == CELL_INSIDE) + if (cell_type == CELL_INSIDE || cell_type == CELL_SCROLLBAR) return; if (wp == NULL) { @@ -870,3 +919,127 @@ screen_redraw_draw_pane(struct screen_redraw_ctx *ctx, struct window_pane *wp) tty_draw_line(tty, s, i, j, width, x, y, &defaults, palette); } } + +/* Draw the panes scrollbars */ +static void +screen_redraw_draw_pane_scrollbars(struct screen_redraw_ctx *ctx) +{ + struct client *c = ctx->c; + struct window *w = c->session->curw->window; + struct window_pane *wp; + + log_debug("%s: %s @%u", __func__, c->name, w->id); + + TAILQ_FOREACH(wp, &w->panes, entry) { + if (window_pane_show_scrollbar(wp, ctx->pane_scrollbars) && + window_pane_visible(wp)) + screen_redraw_draw_pane_scrollbar(ctx, wp); + } +} + +/* Draw pane scrollbar. */ +void +screen_redraw_draw_pane_scrollbar(struct screen_redraw_ctx *ctx, + struct window_pane *wp) +{ + struct screen *s = wp->screen; + double percent_view; + u_int sb = ctx->pane_scrollbars, total_height, sb_h = wp->sy; + u_int sb_pos = ctx->pane_scrollbars_pos, slider_h, slider_y; + int sb_w = wp->scrollbar_style.width; + int sb_pad = wp->scrollbar_style.pad; + int cm_y, cm_size, xoff = wp->xoff, ox = ctx->ox; + int sb_x, sb_y = (int)(wp->yoff - ctx->oy); /* sb top */ + + if (window_pane_mode(wp) == WINDOW_PANE_NO_MODE) { + if (sb == PANE_SCROLLBARS_MODAL) + return; + /* Show slider at the bottom of the scrollbar. */ + total_height = screen_size_y(s) + screen_hsize(s); + percent_view = (double)sb_h / total_height; + slider_h = (double)sb_h * percent_view; + slider_y = sb_h - slider_h; + } else { + if (TAILQ_FIRST(&wp->modes) == NULL) + return; + if (window_copy_get_current_offset(wp, &cm_y, &cm_size) == 0) + return; + total_height = cm_size + sb_h; + percent_view = (double)sb_h / (cm_size + sb_h); + slider_h = (double)sb_h * percent_view; + slider_y = (sb_h + 1) * ((double)cm_y / total_height); + } + + if (sb_pos == PANE_SCROLLBARS_LEFT) + sb_x = xoff - sb_w - sb_pad - ox; + else + sb_x = xoff + wp->sx - ox; + + if (slider_h < 1) + slider_h = 1; + if (slider_y >= sb_h) + slider_y = sb_h - 1; + + screen_redraw_draw_scrollbar(ctx, wp, sb_pos, sb_x, sb_y, sb_h, + slider_h, slider_y); + + /* Store current position and height of the slider */ + wp->sb_slider_y = slider_y; /* top of slider y pos in scrollbar */ + wp->sb_slider_h = slider_h; /* height of slider */ +} + +static void +screen_redraw_draw_scrollbar(struct screen_redraw_ctx *ctx, + struct window_pane *wp, int sb_pos, int sb_x, int sb_y, u_int sb_h, + u_int slider_h, u_int slider_y) +{ + struct client *c = ctx->c; + struct tty *tty = &c->tty; + struct grid_cell gc, slgc, *gcp; + struct style *sb_style = &wp->scrollbar_style; + u_int i, j, imax, jmax; + u_int sb_w = sb_style->width, sb_pad = sb_style->pad; + int px, py, ox = ctx->ox, oy = ctx->oy; + int sx = ctx->sx, sy = ctx->sy, xoff = wp->xoff; + int yoff = wp->yoff; + + /* Set up style for slider. */ + gc = sb_style->gc; + memcpy(&slgc, &gc, sizeof slgc); + slgc.fg = gc.bg; + slgc.bg = gc.fg; + + imax = sb_w + sb_pad; + if ((int)imax + sb_x > sx) + imax = sx - sb_x; + jmax = sb_h; + if ((int)jmax + sb_y > sy) + jmax = sy - sb_y; + + for (j = 0; j < jmax; j++) { + py = sb_y + j; + for (i = 0; i < imax; i++) { + px = sb_x + i; + if (px < xoff - ox - (int)sb_w - (int)sb_pad || + px >= sx || px < 0 || + py < yoff - oy - 1 || + py >= sy || py < 0) + continue; + tty_cursor(tty, px, py); + if ((sb_pos == PANE_SCROLLBARS_LEFT && + i >= sb_w && i < sb_w + sb_pad) || + (sb_pos == PANE_SCROLLBARS_RIGHT && + i < sb_pad)) { + tty_cell(tty, &grid_default_cell, + &grid_default_cell, NULL, NULL); + } else { + if (j >= slider_y && j < slider_y + slider_h) + gcp = &slgc; + else + gcp = &gc; + tty_cell(tty, gcp, &grid_default_cell, NULL, + NULL); + } + } + } +} diff --git a/usr.bin/tmux/screen-write.c b/usr.bin/tmux/screen-write.c index 66eb3fc72..24f0a8a32 100644 --- a/usr.bin/tmux/screen-write.c +++ b/usr.bin/tmux/screen-write.c @@ -1,4 +1,4 @@ -/* $OpenBSD: screen-write.c,v 1.227 2024/10/05 00:32:55 nicm Exp $ */ +/* $OpenBSD: screen-write.c,v 1.232 2024/11/16 16:49:50 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -151,7 +151,7 @@ screen_write_set_client_cb(struct tty_ctx *ttyctx, struct client *c) */ log_debug("%s: adding %%%u to deferred redraw", __func__, wp->id); - wp->flags |= PANE_REDRAW; + wp->flags |= (PANE_REDRAW|PANE_REDRAWSCROLLBAR); return (-1); } @@ -377,7 +377,7 @@ screen_write_strlen(const char *fmt, ...) if (more == UTF8_DONE) size += ud.width; } else { - if (*ptr > 0x1f && *ptr < 0x7f) + if (*ptr == '\t' || (*ptr > 0x1f && *ptr < 0x7f)) size++; ptr++; } @@ -547,7 +547,7 @@ screen_write_vnputs(struct screen_write_ctx *ctx, ssize_t maxlen, else if (*ptr == '\n') { screen_write_linefeed(ctx, 0, 8); screen_write_carriagereturn(ctx); - } else if (*ptr > 0x1f && *ptr < 0x7f) { + } else if (*ptr == '\t' || (*ptr > 0x1f && *ptr < 0x7f)) { size++; screen_write_putc(ctx, &gc, *ptr); } @@ -1178,13 +1178,14 @@ screen_write_deleteline(struct screen_write_ctx *ctx, u_int ny, u_int bg) struct screen *s = ctx->s; struct grid *gd = s->grid; struct tty_ctx ttyctx; + u_int sy = screen_size_y(s); if (ny == 0) ny = 1; if (s->cy < s->rupper || s->cy > s->rlower) { - if (ny > screen_size_y(s) - s->cy) - ny = screen_size_y(s) - s->cy; + if (ny > sy - s->cy) + ny = sy - s->cy; if (ny == 0) return; @@ -1376,13 +1377,14 @@ screen_write_linefeed(struct screen_write_ctx *ctx, int wrapped, u_int bg) struct screen *s = ctx->s; struct grid *gd = s->grid; struct grid_line *gl; + u_int rupper = s->rupper, rlower = s->rlower; gl = grid_get_line(gd, gd->hsize + s->cy); if (wrapped) gl->flags |= GRID_LINE_WRAPPED; log_debug("%s: at %u,%u (region %u-%u)", __func__, s->cx, s->cy, - s->rupper, s->rlower); + rupper, rlower); if (bg != ctx->bg) { screen_write_collect_flush(ctx, 1, __func__); @@ -1700,6 +1702,9 @@ screen_write_collect_flush(struct screen_write_ctx *ctx, int scroll_only, ttyctx.num = ctx->scrolled; ttyctx.bg = ctx->bg; tty_write(tty_cmd_scrollup, &ttyctx); + + if (ctx->wp != NULL) + ctx->wp->flags |= PANE_REDRAWSCROLLBAR; } ctx->scrolled = 0; ctx->bg = 8; @@ -1814,6 +1819,8 @@ screen_write_collect_add(struct screen_write_ctx *ctx, collect = 1; if (gc->data.width != 1 || gc->data.size != 1 || *gc->data.data >= 0x7f) collect = 0; + else if (gc->flags & GRID_FLAG_TAB) + collect = 0; else if (gc->attr & GRID_ATTR_CHARSET) collect = 0; else if (~s->mode & MODE_WRAP) @@ -2136,7 +2143,17 @@ screen_write_overwrite(struct screen_write_ctx *ctx, struct grid_cell *gc, break; log_debug("%s: overwrite at %u,%u", __func__, xx, s->cy); - grid_view_set_cell(gd, xx, s->cy, &grid_default_cell); + if (gc->flags & GRID_FLAG_TAB) { + memcpy(&tmp_gc, gc, sizeof tmp_gc); + memset(tmp_gc.data.data, 0, + sizeof tmp_gc.data.data); + *tmp_gc.data.data = ' '; + tmp_gc.data.width = tmp_gc.data.size = + tmp_gc.data.have = 1; + grid_view_set_cell(gd, xx, s->cy, &tmp_gc); + } else + grid_view_set_cell(gd, xx, s->cy, + &grid_default_cell); done = 1; } } @@ -2188,6 +2205,9 @@ screen_write_alternateon(struct screen_write_ctx *ctx, struct grid_cell *gc, screen_write_collect_flush(ctx, 0, __func__); screen_alternate_on(ctx->s, gc, cursor); + if (wp != NULL) + layout_fix_panes(wp->window, NULL); + screen_write_initctx(ctx, &ttyctx, 1); if (ttyctx.redraw_cb != NULL) ttyctx.redraw_cb(&ttyctx); @@ -2207,6 +2227,9 @@ screen_write_alternateoff(struct screen_write_ctx *ctx, struct grid_cell *gc, screen_write_collect_flush(ctx, 0, __func__); screen_alternate_off(ctx->s, gc, cursor); + if (wp != NULL) + layout_fix_panes(wp->window, NULL); + screen_write_initctx(ctx, &ttyctx, 1); if (ttyctx.redraw_cb != NULL) ttyctx.redraw_cb(&ttyctx); diff --git a/usr.bin/tmux/screen.c b/usr.bin/tmux/screen.c index e70edd5fd..b100f138f 100644 --- a/usr.bin/tmux/screen.c +++ b/usr.bin/tmux/screen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: screen.c,v 1.87 2024/10/01 08:01:19 nicm Exp $ */ +/* $OpenBSD: screen.c,v 1.88 2024/11/15 09:01:16 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -111,7 +111,7 @@ screen_reinit(struct screen *s) if (options_get_number(global_options, "extended-keys") == 2) s->mode = (s->mode & ~EXTENDED_KEY_MODES)|MODE_KEYS_EXTENDED; - if (s->saved_grid != NULL) + if (SCREEN_IS_ALTERNATE(s)) screen_alternate_off(s, NULL, 0); s->saved_cx = UINT_MAX; s->saved_cy = UINT_MAX; @@ -147,7 +147,7 @@ screen_free(struct screen *s) if (s->write_list != NULL) screen_write_free_list(s); - if (s->saved_grid != NULL) + if (SCREEN_IS_ALTERNATE(s)) grid_destroy(s->saved_grid); grid_destroy(s->grid); @@ -612,7 +612,7 @@ screen_alternate_on(struct screen *s, struct grid_cell *gc, int cursor) { u_int sx, sy; - if (s->saved_grid != NULL) + if (SCREEN_IS_ALTERNATE(s)) return; sx = screen_size_x(s); sy = screen_size_y(s); @@ -641,7 +641,7 @@ screen_alternate_off(struct screen *s, struct grid_cell *gc, int cursor) * If the current size is different, temporarily resize to the old size * before copying back. */ - if (s->saved_grid != NULL) + if (SCREEN_IS_ALTERNATE(s)) screen_resize(s, s->saved_grid->sx, s->saved_grid->sy, 0); /* @@ -656,7 +656,7 @@ screen_alternate_off(struct screen *s, struct grid_cell *gc, int cursor) } /* If not in the alternate screen, do nothing more. */ - if (s->saved_grid == NULL) { + if (!SCREEN_IS_ALTERNATE(s)) { if (s->cx > screen_size_x(s) - 1) s->cx = screen_size_x(s) - 1; if (s->cy > screen_size_y(s) - 1) diff --git a/usr.bin/tmux/server-client.c b/usr.bin/tmux/server-client.c index 75c2f1824..4c59f5ba4 100644 --- a/usr.bin/tmux/server-client.c +++ b/usr.bin/tmux/server-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server-client.c,v 1.414 2024/10/08 06:29:44 nicm Exp $ */ +/* $OpenBSD: server-client.c,v 1.423 2024/12/06 09:06:56 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -33,6 +33,19 @@ #include "tmux.h" +enum mouse_where { + NOWHERE, + PANE, + STATUS, + STATUS_LEFT, + STATUS_RIGHT, + STATUS_DEFAULT, + BORDER, + SCROLLBAR_UP, + SCROLLBAR_SLIDER, + SCROLLBAR_DOWN +}; + static void server_client_free(int, short, void *); static void server_client_check_pane_resize(struct window_pane *); static void server_client_check_pane_buffer(struct window_pane *); @@ -70,7 +83,7 @@ RB_GENERATE(client_windows, client_window, entry, server_client_window_cmp); u_int server_client_how_many(void) { - struct client *c; + struct client *c; u_int n; n = 0; @@ -570,15 +583,96 @@ server_client_exec(struct client *c, const char *cmd) free(msg); } +static enum mouse_where +server_client_check_mouse_in_pane(struct window_pane *wp, u_int px, u_int py, + u_int *sl_mpos) +{ + struct window *w = wp->window; + struct options *wo = w->options; + struct window_pane *fwp; + int pane_status, sb, sb_pos, sb_w, sb_pad; + u_int line, sl_top, sl_bottom; + + sb = options_get_number(wo, "pane-scrollbars"); + sb_pos = options_get_number(wo, "pane-scrollbars-position"); + pane_status = options_get_number(wo, "pane-border-status"); + sb_pos = options_get_number(wo, "pane-scrollbars-position"); + + if (window_pane_show_scrollbar(wp, sb)) { + sb_w = wp->scrollbar_style.width; + sb_pad = wp->scrollbar_style.pad; + } else { + sb_w = 0; + sb_pad = 0; + } + if (pane_status == PANE_STATUS_TOP) + line = wp->yoff - 1; + else if (pane_status == PANE_STATUS_BOTTOM) + line = wp->yoff + wp->sy; + + /* Check if point is within the pane or scrollbar. */ + if (((pane_status != PANE_STATUS_OFF && py != line) || + (wp->yoff == 0 && py < wp->sy) || + (py >= wp->yoff && py < wp->yoff + wp->sy)) && + ((sb_pos == PANE_SCROLLBARS_RIGHT && + px < wp->xoff + wp->sx + sb_pad + sb_w) || + (sb_pos == PANE_SCROLLBARS_LEFT && + px < wp->xoff + wp->sx - sb_pad - sb_w))) { + /* Check if in the scrollbar. */ + if ((sb_pos == PANE_SCROLLBARS_RIGHT && + (px >= wp->xoff + wp->sx + sb_pad && + px < wp->xoff + wp->sx + sb_pad + sb_w)) || + (sb_pos == PANE_SCROLLBARS_LEFT && + (px >= wp->xoff - sb_pad - sb_w && + px < wp->xoff - sb_pad))) { + /* Check where inside the scrollbar. */ + sl_top = wp->yoff + wp->sb_slider_y; + sl_bottom = (wp->yoff + wp->sb_slider_y + + wp->sb_slider_h - 1); + if (py < sl_top) + return (SCROLLBAR_UP); + else if (py >= sl_top && + py <= sl_bottom) { + *sl_mpos = (py - wp->sb_slider_y - wp->yoff); + return (SCROLLBAR_SLIDER); + } else /* py > sl_bottom */ + return (SCROLLBAR_DOWN); + } else { + /* Must be inside the pane. */ + return (PANE); + } + } else if (~w->flags & WINDOW_ZOOMED) { + /* Try the pane borders if not zoomed. */ + TAILQ_FOREACH(fwp, &w->panes, entry) { + if ((((sb_pos == PANE_SCROLLBARS_RIGHT && + fwp->xoff + fwp->sx + sb_pad + sb_w == px) || + (sb_pos == PANE_SCROLLBARS_LEFT && + fwp->xoff + fwp->sx == px)) && + fwp->yoff <= 1 + py && + fwp->yoff + fwp->sy >= py) || + (fwp->yoff + fwp->sy == py && + fwp->xoff <= 1 + px && + fwp->xoff + fwp->sx >= px)) + break; + } + if (fwp != NULL) { + wp = fwp; + return (BORDER); + } + } + return (NOWHERE); +} + /* Check for mouse keys. */ static key_code server_client_check_mouse(struct client *c, struct key_event *event) { struct mouse_event *m = &event->m; struct session *s = c->session, *fs; + struct window *w = s->curw->window; struct winlink *fwl; struct window_pane *wp, *fwp; - u_int x, y, b, sx, sy, px, py; + u_int x, y, b, sx, sy, px, py, sl_mpos = 0; int ignore = 0; key_code key; struct timeval tv; @@ -592,13 +686,7 @@ server_client_check_mouse(struct client *c, struct key_event *event) SECOND, DOUBLE, TRIPLE } type = NOTYPE; - enum { NOWHERE, - PANE, - STATUS, - STATUS_LEFT, - STATUS_RIGHT, - STATUS_DEFAULT, - BORDER } where = NOWHERE; + enum mouse_where where = NOWHERE; log_debug("%s mouse %02x at %u,%u (last %u,%u) (%d)", c->name, m->b, m->x, m->y, m->lx, m->ly, c->tty.mouse_drag_flag); @@ -747,62 +835,66 @@ have_event: } } - /* Not on status line. Adjust position and check for border or pane. */ + /* + * Not on status line. Adjust position and check for border, pane, or + * scrollbar. + */ if (where == NOWHERE) { - px = x; - if (m->statusat == 0 && y >= m->statuslines) - py = y - m->statuslines; - else if (m->statusat > 0 && y >= (u_int)m->statusat) - py = m->statusat - 1; - else - py = y; - - tty_window_offset(&c->tty, &m->ox, &m->oy, &sx, &sy); - log_debug("mouse window @%u at %u,%u (%ux%u)", - s->curw->window->id, m->ox, m->oy, sx, sy); - if (px > sx || py > sy) - return (KEYC_UNKNOWN); - px = px + m->ox; - py = py + m->oy; - - /* Try the pane borders if not zoomed. */ - if (~s->curw->window->flags & WINDOW_ZOOMED) { - TAILQ_FOREACH(wp, &s->curw->window->panes, entry) { - if ((wp->xoff + wp->sx == px && - wp->yoff <= 1 + py && - wp->yoff + wp->sy >= py) || - (wp->yoff + wp->sy == py && - wp->xoff <= 1 + px && - wp->xoff + wp->sx >= px)) - break; - } - if (wp != NULL) - where = BORDER; - } - - /* Otherwise try inside the pane. */ - if (where == NOWHERE) { - wp = window_get_active_at(s->curw->window, px, py); - if (wp != NULL) - where = PANE; + if (c->tty.mouse_scrolling_flag) + where = SCROLLBAR_SLIDER; + else { + px = x; + if (m->statusat == 0 && y >= m->statuslines) + py = y - m->statuslines; + else if (m->statusat > 0 && y >= (u_int)m->statusat) + py = m->statusat - 1; else + py = y; + + tty_window_offset(&c->tty, &m->ox, &m->oy, &sx, &sy); + log_debug("mouse window @%u at %u,%u (%ux%u)", + w->id, m->ox, m->oy, sx, sy); + if (px > sx || py > sy) return (KEYC_UNKNOWN); + px = px + m->ox; + py = py + m->oy; + + /* Try inside the pane. */ + wp = window_get_active_at(w, px, py); + if (wp == NULL) + return (KEYC_UNKNOWN); + where = server_client_check_mouse_in_pane(wp, px, py, + &sl_mpos); + + if (where == PANE) { + log_debug("mouse %u,%u on pane %%%u", x, y, + wp->id); + } else if (where == BORDER) + log_debug("mouse on pane %%%u border", wp->id); + else if (where == SCROLLBAR_UP || + where == SCROLLBAR_SLIDER || + where == SCROLLBAR_DOWN) { + log_debug("mouse on pane %%%u scrollbar", + wp->id); + } + m->wp = wp->id; + m->w = wp->window->id; } - if (where == PANE) - log_debug("mouse %u,%u on pane %%%u", x, y, wp->id); - else if (where == BORDER) - log_debug("mouse on pane %%%u border", wp->id); - m->wp = wp->id; - m->w = wp->window->id; - } + } else + m->wp = -1; /* Stop dragging if needed. */ - if (type != DRAG && type != WHEEL && c->tty.mouse_drag_flag != 0) { + if (type != DRAG && + type != WHEEL && + type != DOUBLE && + type != TRIPLE && + c->tty.mouse_drag_flag != 0) { if (c->tty.mouse_drag_release != NULL) c->tty.mouse_drag_release(c, m); c->tty.mouse_drag_update = NULL; c->tty.mouse_drag_release = NULL; + c->tty.mouse_scrolling_flag = 0; /* * End a mouse drag by passing a MouseDragEnd key corresponding @@ -820,6 +912,8 @@ have_event: key = KEYC_MOUSEDRAGEND1_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDRAGEND1_STATUS_DEFAULT; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDRAGEND1_SCROLLBAR_SLIDER; if (where == BORDER) key = KEYC_MOUSEDRAGEND1_BORDER; break; @@ -834,6 +928,8 @@ have_event: key = KEYC_MOUSEDRAGEND2_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDRAGEND2_STATUS_DEFAULT; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDRAGEND2_SCROLLBAR_SLIDER; if (where == BORDER) key = KEYC_MOUSEDRAGEND2_BORDER; break; @@ -848,6 +944,8 @@ have_event: key = KEYC_MOUSEDRAGEND3_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDRAGEND3_STATUS_DEFAULT; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDRAGEND3_SCROLLBAR_SLIDER; if (where == BORDER) key = KEYC_MOUSEDRAGEND3_BORDER; break; @@ -862,6 +960,8 @@ have_event: key = KEYC_MOUSEDRAGEND6_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDRAGEND6_STATUS_DEFAULT; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDRAGEND6_SCROLLBAR_SLIDER; if (where == BORDER) key = KEYC_MOUSEDRAGEND6_BORDER; break; @@ -876,6 +976,8 @@ have_event: key = KEYC_MOUSEDRAGEND7_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDRAGEND7_STATUS_DEFAULT; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDRAGEND7_SCROLLBAR_SLIDER; if (where == BORDER) key = KEYC_MOUSEDRAGEND7_BORDER; break; @@ -890,6 +992,8 @@ have_event: key = KEYC_MOUSEDRAGEND8_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDRAGEND8_STATUS_DEFAULT; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDRAGEND8_SCROLLBAR_SLIDER; if (where == BORDER) key = KEYC_MOUSEDRAGEND8_BORDER; break; @@ -904,6 +1008,8 @@ have_event: key = KEYC_MOUSEDRAGEND9_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDRAGEND9_STATUS_DEFAULT; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDRAGEND9_SCROLLBAR_SLIDER; if (where == BORDER) key = KEYC_MOUSEDRAGEND9_BORDER; break; @@ -918,6 +1024,8 @@ have_event: key = KEYC_MOUSEDRAGEND10_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDRAGEND10_STATUS_DEFAULT; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDRAGEND10_SCROLLBAR_SLIDER; if (where == BORDER) key = KEYC_MOUSEDRAGEND10_BORDER; break; @@ -932,6 +1040,8 @@ have_event: key = KEYC_MOUSEDRAGEND11_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDRAGEND11_STATUS_DEFAULT; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDRAGEND11_SCROLLBAR_SLIDER; if (where == BORDER) key = KEYC_MOUSEDRAGEND11_BORDER; break; @@ -940,6 +1050,7 @@ have_event: break; } c->tty.mouse_drag_flag = 0; + c->tty.mouse_slider_mpos = -1; goto out; } @@ -978,6 +1089,12 @@ have_event: key = KEYC_MOUSEDRAG1_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDRAG1_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEDRAG1_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDRAG1_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEDRAG1_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEDRAG1_BORDER; break; @@ -992,6 +1109,12 @@ have_event: key = KEYC_MOUSEDRAG2_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDRAG2_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEDRAG2_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDRAG2_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEDRAG2_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEDRAG2_BORDER; break; @@ -1006,6 +1129,12 @@ have_event: key = KEYC_MOUSEDRAG3_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDRAG3_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEDRAG3_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDRAG3_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEDRAG3_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEDRAG3_BORDER; break; @@ -1020,6 +1149,12 @@ have_event: key = KEYC_MOUSEDRAG6_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDRAG6_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEDRAG6_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDRAG6_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEDRAG6_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEDRAG6_BORDER; break; @@ -1034,6 +1169,12 @@ have_event: key = KEYC_MOUSEDRAG7_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDRAG7_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEDRAG7_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDRAG7_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEDRAG7_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEDRAG7_BORDER; break; @@ -1048,6 +1189,12 @@ have_event: key = KEYC_MOUSEDRAG8_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDRAG8_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEDRAG8_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDRAG8_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEDRAG8_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEDRAG8_BORDER; break; @@ -1062,6 +1209,12 @@ have_event: key = KEYC_MOUSEDRAG9_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDRAG9_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEDRAG9_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDRAG9_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEDRAG9_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEDRAG9_BORDER; break; @@ -1076,6 +1229,12 @@ have_event: key = KEYC_MOUSEDRAG10_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDRAG10_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEDRAG10_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDRAG10_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEDRAG10_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEDRAG10_BORDER; break; @@ -1090,6 +1249,12 @@ have_event: key = KEYC_MOUSEDRAG11_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDRAG11_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEDRAG11_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDRAG11_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEDRAG11_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEDRAG11_BORDER; break; @@ -1098,9 +1263,16 @@ have_event: /* * Begin a drag by setting the flag to a non-zero value that - * corresponds to the mouse button in use. + * corresponds to the mouse button in use. If starting to drag + * the scrollbar, store the relative position in the slider + * where the user grabbed. */ c->tty.mouse_drag_flag = MOUSE_BUTTONS(b) + 1; + if (c->tty.mouse_scrolling_flag == 0 && + where == SCROLLBAR_SLIDER) { + c->tty.mouse_scrolling_flag = 1; + c->tty.mouse_slider_mpos = sl_mpos; + } break; case WHEEL: if (MOUSE_BUTTONS(b) == MOUSE_WHEEL_UP) { @@ -1144,6 +1316,12 @@ have_event: key = KEYC_MOUSEUP1_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEUP1_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEUP1_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEUP1_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEUP1_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEUP1_BORDER; break; @@ -1158,6 +1336,12 @@ have_event: key = KEYC_MOUSEUP2_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEUP2_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEUP2_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEUP2_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEUP2_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEUP2_BORDER; break; @@ -1172,6 +1356,12 @@ have_event: key = KEYC_MOUSEUP3_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEUP3_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEUP3_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEUP3_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEUP3_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEUP3_BORDER; break; @@ -1186,6 +1376,12 @@ have_event: key = KEYC_MOUSEUP6_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEUP6_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEUP6_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEUP6_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEUP6_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEUP6_BORDER; break; @@ -1200,6 +1396,12 @@ have_event: key = KEYC_MOUSEUP7_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEUP7_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEUP7_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEUP7_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEUP7_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEUP7_BORDER; break; @@ -1214,6 +1416,12 @@ have_event: key = KEYC_MOUSEUP8_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEUP8_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEUP8_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEUP8_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEUP8_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEUP8_BORDER; break; @@ -1228,6 +1436,12 @@ have_event: key = KEYC_MOUSEUP9_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEUP9_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEUP9_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEUP9_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEUP9_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEUP9_BORDER; break; @@ -1241,7 +1455,13 @@ have_event: if (where == STATUS_RIGHT) key = KEYC_MOUSEUP1_STATUS_RIGHT; if (where == STATUS_DEFAULT) - key = KEYC_MOUSEUP1_STATUS_DEFAULT; + key = KEYC_MOUSEUP10_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEUP10_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEUP10_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEUP1_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEUP1_BORDER; break; @@ -1256,6 +1476,12 @@ have_event: key = KEYC_MOUSEUP11_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEUP11_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEUP11_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEUP11_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEUP11_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEUP11_BORDER; break; @@ -1274,6 +1500,12 @@ have_event: key = KEYC_MOUSEDOWN1_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDOWN1_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEDOWN1_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDOWN1_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEDOWN1_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEDOWN1_BORDER; break; @@ -1288,6 +1520,12 @@ have_event: key = KEYC_MOUSEDOWN2_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDOWN2_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEDOWN2_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDOWN2_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEDOWN2_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEDOWN2_BORDER; break; @@ -1302,6 +1540,12 @@ have_event: key = KEYC_MOUSEDOWN3_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDOWN3_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEDOWN3_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDOWN3_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEDOWN3_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEDOWN3_BORDER; break; @@ -1316,6 +1560,12 @@ have_event: key = KEYC_MOUSEDOWN6_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDOWN6_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEDOWN6_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDOWN6_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEDOWN6_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEDOWN6_BORDER; break; @@ -1330,6 +1580,12 @@ have_event: key = KEYC_MOUSEDOWN7_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDOWN7_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEDOWN7_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDOWN7_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEDOWN7_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEDOWN7_BORDER; break; @@ -1344,6 +1600,12 @@ have_event: key = KEYC_MOUSEDOWN8_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDOWN8_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEDOWN8_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDOWN8_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEDOWN8_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEDOWN8_BORDER; break; @@ -1358,6 +1620,12 @@ have_event: key = KEYC_MOUSEDOWN9_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDOWN9_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEDOWN9_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDOWN9_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEDOWN9_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEDOWN9_BORDER; break; @@ -1372,6 +1640,12 @@ have_event: key = KEYC_MOUSEDOWN10_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDOWN10_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEDOWN10_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDOWN10_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEDOWN10_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEDOWN10_BORDER; break; @@ -1386,6 +1660,12 @@ have_event: key = KEYC_MOUSEDOWN11_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_MOUSEDOWN11_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_MOUSEDOWN11_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_MOUSEDOWN11_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_MOUSEDOWN11_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_MOUSEDOWN11_BORDER; break; @@ -1404,6 +1684,12 @@ have_event: key = KEYC_SECONDCLICK1_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_SECONDCLICK1_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_SECONDCLICK1_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_SECONDCLICK1_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_SECONDCLICK1_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_SECONDCLICK1_BORDER; break; @@ -1418,6 +1704,12 @@ have_event: key = KEYC_SECONDCLICK2_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_SECONDCLICK2_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_SECONDCLICK2_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_SECONDCLICK2_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_SECONDCLICK2_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_SECONDCLICK2_BORDER; break; @@ -1432,6 +1724,12 @@ have_event: key = KEYC_SECONDCLICK3_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_SECONDCLICK3_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_SECONDCLICK3_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_SECONDCLICK3_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_SECONDCLICK3_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_SECONDCLICK3_BORDER; break; @@ -1446,6 +1744,12 @@ have_event: key = KEYC_SECONDCLICK6_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_SECONDCLICK6_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_SECONDCLICK6_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_SECONDCLICK6_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_SECONDCLICK6_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_SECONDCLICK6_BORDER; break; @@ -1460,6 +1764,12 @@ have_event: key = KEYC_SECONDCLICK7_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_SECONDCLICK7_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_SECONDCLICK7_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_SECONDCLICK7_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_SECONDCLICK7_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_SECONDCLICK7_BORDER; break; @@ -1474,6 +1784,12 @@ have_event: key = KEYC_SECONDCLICK8_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_SECONDCLICK8_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_SECONDCLICK8_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_SECONDCLICK8_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_SECONDCLICK8_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_SECONDCLICK8_BORDER; break; @@ -1488,6 +1804,12 @@ have_event: key = KEYC_SECONDCLICK9_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_SECONDCLICK9_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_SECONDCLICK9_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_SECONDCLICK9_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_SECONDCLICK9_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_SECONDCLICK9_BORDER; break; @@ -1502,6 +1824,12 @@ have_event: key = KEYC_SECONDCLICK10_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_SECONDCLICK10_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_SECONDCLICK10_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_SECONDCLICK10_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_SECONDCLICK10_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_SECONDCLICK10_BORDER; break; @@ -1516,6 +1844,12 @@ have_event: key = KEYC_SECONDCLICK11_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_SECONDCLICK11_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_SECONDCLICK11_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_SECONDCLICK11_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_SECONDCLICK11_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_SECONDCLICK11_BORDER; break; @@ -1534,6 +1868,12 @@ have_event: key = KEYC_DOUBLECLICK1_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_DOUBLECLICK1_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_DOUBLECLICK1_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_DOUBLECLICK1_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_DOUBLECLICK1_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_DOUBLECLICK1_BORDER; break; @@ -1548,6 +1888,12 @@ have_event: key = KEYC_DOUBLECLICK2_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_DOUBLECLICK2_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_DOUBLECLICK2_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_DOUBLECLICK2_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_DOUBLECLICK2_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_DOUBLECLICK2_BORDER; break; @@ -1562,6 +1908,12 @@ have_event: key = KEYC_DOUBLECLICK3_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_DOUBLECLICK3_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_DOUBLECLICK3_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_DOUBLECLICK3_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_DOUBLECLICK3_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_DOUBLECLICK3_BORDER; break; @@ -1576,6 +1928,12 @@ have_event: key = KEYC_DOUBLECLICK6_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_DOUBLECLICK6_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_DOUBLECLICK6_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_DOUBLECLICK6_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_DOUBLECLICK6_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_DOUBLECLICK6_BORDER; break; @@ -1590,6 +1948,12 @@ have_event: key = KEYC_DOUBLECLICK7_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_DOUBLECLICK7_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_DOUBLECLICK7_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_DOUBLECLICK7_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_DOUBLECLICK7_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_DOUBLECLICK7_BORDER; break; @@ -1604,6 +1968,12 @@ have_event: key = KEYC_DOUBLECLICK8_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_DOUBLECLICK8_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_DOUBLECLICK8_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_DOUBLECLICK8_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_DOUBLECLICK8_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_DOUBLECLICK8_BORDER; break; @@ -1618,6 +1988,12 @@ have_event: key = KEYC_DOUBLECLICK9_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_DOUBLECLICK9_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_DOUBLECLICK9_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_DOUBLECLICK9_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_DOUBLECLICK9_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_DOUBLECLICK9_BORDER; break; @@ -1632,6 +2008,12 @@ have_event: key = KEYC_DOUBLECLICK10_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_DOUBLECLICK10_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_DOUBLECLICK10_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_DOUBLECLICK10_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_DOUBLECLICK10_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_DOUBLECLICK10_BORDER; break; @@ -1646,6 +2028,12 @@ have_event: key = KEYC_DOUBLECLICK11_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_DOUBLECLICK11_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_DOUBLECLICK11_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_DOUBLECLICK11_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_DOUBLECLICK11_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_DOUBLECLICK11_BORDER; break; @@ -1664,6 +2052,12 @@ have_event: key = KEYC_TRIPLECLICK1_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_TRIPLECLICK1_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_TRIPLECLICK1_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_TRIPLECLICK1_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_TRIPLECLICK1_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_TRIPLECLICK1_BORDER; break; @@ -1678,6 +2072,12 @@ have_event: key = KEYC_TRIPLECLICK2_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_TRIPLECLICK2_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_TRIPLECLICK2_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_TRIPLECLICK2_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_TRIPLECLICK2_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_TRIPLECLICK2_BORDER; break; @@ -1692,6 +2092,12 @@ have_event: key = KEYC_TRIPLECLICK3_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_TRIPLECLICK3_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_TRIPLECLICK3_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_TRIPLECLICK3_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_TRIPLECLICK3_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_TRIPLECLICK3_BORDER; break; @@ -1706,6 +2112,12 @@ have_event: key = KEYC_TRIPLECLICK6_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_TRIPLECLICK6_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_TRIPLECLICK6_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_TRIPLECLICK6_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_TRIPLECLICK6_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_TRIPLECLICK6_BORDER; break; @@ -1720,6 +2132,12 @@ have_event: key = KEYC_TRIPLECLICK7_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_TRIPLECLICK7_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_TRIPLECLICK7_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_TRIPLECLICK7_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_TRIPLECLICK7_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_TRIPLECLICK7_BORDER; break; @@ -1734,6 +2152,12 @@ have_event: key = KEYC_TRIPLECLICK8_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_TRIPLECLICK8_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_TRIPLECLICK8_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_TRIPLECLICK8_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_TRIPLECLICK8_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_TRIPLECLICK8_BORDER; break; @@ -1748,6 +2172,12 @@ have_event: key = KEYC_TRIPLECLICK9_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_TRIPLECLICK9_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_TRIPLECLICK9_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_TRIPLECLICK9_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_TRIPLECLICK9_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_TRIPLECLICK9_BORDER; break; @@ -1762,6 +2192,12 @@ have_event: key = KEYC_TRIPLECLICK10_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_TRIPLECLICK10_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_TRIPLECLICK10_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_TRIPLECLICK10_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_TRIPLECLICK10_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_TRIPLECLICK10_BORDER; break; @@ -1776,6 +2212,12 @@ have_event: key = KEYC_TRIPLECLICK11_STATUS_RIGHT; if (where == STATUS_DEFAULT) key = KEYC_TRIPLECLICK11_STATUS_DEFAULT; + if (where == SCROLLBAR_UP) + key = KEYC_TRIPLECLICK11_SCROLLBAR_UP; + if (where == SCROLLBAR_SLIDER) + key = KEYC_TRIPLECLICK11_SCROLLBAR_SLIDER; + if (where == SCROLLBAR_DOWN) + key = KEYC_TRIPLECLICK11_SCROLLBAR_DOWN; if (where == BORDER) key = KEYC_TRIPLECLICK11_BORDER; break; @@ -1810,7 +2252,7 @@ server_client_is_bracket_paste(struct client *c, key_code key) } if (key == KEYC_PASTE_END) { - c->flags &= ~CLIENT_BRACKETPASTING; + c->flags &= ~CLIENT_BRACKETPASTING; log_debug("%s: bracket paste off", c->name); return (0); } @@ -2139,7 +2581,7 @@ paste_key: if (c->flags & CLIENT_READONLY) goto out; if (event->buf != NULL) - window_pane_paste(wp, event->buf, event->len); + window_pane_paste(wp, key, event->buf, event->len); key = KEYC_NONE; goto out; @@ -2230,7 +2672,7 @@ server_client_loop(void) server_client_check_pane_resize(wp); server_client_check_pane_buffer(wp); } - wp->flags &= ~PANE_REDRAW; + wp->flags &= ~(PANE_REDRAW|PANE_REDRAWSCROLLBAR); } check_window_name(w); } @@ -2662,7 +3104,7 @@ server_client_check_redraw(struct client *c) struct window_pane *wp; int needed, tty_flags, mode = tty->mode; uint64_t client_flags = 0; - int redraw; + int redraw_pane, redraw_scrollbar_only; u_int bit = 0; struct timeval tv = { .tv_usec = 1000 }; static struct event ev; @@ -2671,12 +3113,13 @@ server_client_check_redraw(struct client *c) if (c->flags & (CLIENT_CONTROL|CLIENT_SUSPENDED)) return; if (c->flags & CLIENT_ALLREDRAWFLAGS) { - log_debug("%s: redraw%s%s%s%s%s", c->name, + log_debug("%s: redraw%s%s%s%s%s%s", c->name, (c->flags & CLIENT_REDRAWWINDOW) ? " window" : "", (c->flags & CLIENT_REDRAWSTATUS) ? " status" : "", (c->flags & CLIENT_REDRAWBORDERS) ? " borders" : "", (c->flags & CLIENT_REDRAWOVERLAY) ? " overlay" : "", - (c->flags & CLIENT_REDRAWPANES) ? " panes" : ""); + (c->flags & CLIENT_REDRAWPANES) ? " panes" : "", + (c->flags & CLIENT_REDRAWSCROLLBARS) ? " scrollbars" : ""); } /* @@ -2691,11 +3134,15 @@ server_client_check_redraw(struct client *c) TAILQ_FOREACH(wp, &w->panes, entry) { if (wp->flags & PANE_REDRAW) { needed = 1; + client_flags |= CLIENT_REDRAWPANES; break; } + if (wp->flags & PANE_REDRAWSCROLLBAR) { + needed = 1; + client_flags |= CLIENT_REDRAWSCROLLBARS; + /* no break - later panes may need redraw */ + } } - if (needed) - client_flags |= CLIENT_REDRAWPANES; } if (needed && (left = EVBUFFER_LENGTH(tty->out)) != 0) { log_debug("%s: redraw deferred (%zu left)", c->name, left); @@ -2708,23 +3155,30 @@ server_client_check_redraw(struct client *c) if (~c->flags & CLIENT_REDRAWWINDOW) { TAILQ_FOREACH(wp, &w->panes, entry) { - if (wp->flags & PANE_REDRAW) { + if (wp->flags & (PANE_REDRAW)) { log_debug("%s: pane %%%u needs redraw", c->name, wp->id); c->redraw_panes |= (1 << bit); + } else if (wp->flags & PANE_REDRAWSCROLLBAR) { + log_debug("%s: pane %%%u scrollbar " + "needs redraw", c->name, wp->id); + c->redraw_scrollbars |= (1 << bit); } if (++bit == 64) { /* * If more that 64 panes, give up and * just redraw the window. */ - client_flags &= CLIENT_REDRAWPANES; + client_flags &= ~(CLIENT_REDRAWPANES| + CLIENT_REDRAWSCROLLBARS); client_flags |= CLIENT_REDRAWWINDOW; break; } } if (c->redraw_panes != 0) c->flags |= CLIENT_REDRAWPANES; + if (c->redraw_scrollbars != 0) + c->flags |= CLIENT_REDRAWSCROLLBARS; } c->flags |= client_flags; return; @@ -2740,19 +3194,32 @@ server_client_check_redraw(struct client *c) * needs to be redrawn. */ TAILQ_FOREACH(wp, &w->panes, entry) { - redraw = 0; + redraw_pane = 0; + redraw_scrollbar_only = 0; if (wp->flags & PANE_REDRAW) - redraw = 1; - else if (c->flags & CLIENT_REDRAWPANES) - redraw = !!(c->redraw_panes & (1 << bit)); + redraw_pane = 1; + else if (c->flags & CLIENT_REDRAWPANES) { + if (c->redraw_panes & (1 << bit)) + redraw_pane = 1; + } else if (c->flags & CLIENT_REDRAWSCROLLBARS) { + if (c->redraw_scrollbars & (1 << bit)) + redraw_scrollbar_only = 1; + } bit++; - if (!redraw) + if (!redraw_pane && !redraw_scrollbar_only) continue; - log_debug("%s: redrawing pane %%%u", __func__, wp->id); - screen_redraw_pane(c, wp); + if (redraw_scrollbar_only) { + log_debug("%s: redrawing (scrollbar only) pane " + "%%%u", __func__, wp->id); + } else { + log_debug("%s: redrawing pane %%%u", __func__, + wp->id); + } + screen_redraw_pane(c, wp, redraw_scrollbar_only); } c->redraw_panes = 0; - c->flags &= ~CLIENT_REDRAWPANES; + c->redraw_scrollbars = 0; + c->flags &= ~(CLIENT_REDRAWPANES|CLIENT_REDRAWSCROLLBARS); } if (c->flags & CLIENT_ALLREDRAWFLAGS) { @@ -3238,6 +3705,8 @@ server_client_set_flags(struct client *c, const char *flags) flag = CLIENT_IGNORESIZE; else if (strcmp(next, "active-pane") == 0) flag = CLIENT_ACTIVEPANE; + else if (strcmp(next, "no-detach-on-destroy") == 0) + flag = CLIENT_NO_DETACH_ON_DESTROY; if (flag == 0) continue; @@ -3260,7 +3729,7 @@ const char * server_client_get_flags(struct client *c) { static char s[256]; - char tmp[32]; + char tmp[32]; *s = '\0'; if (c->flags & CLIENT_ATTACHED) @@ -3271,6 +3740,8 @@ server_client_get_flags(struct client *c) strlcat(s, "control-mode,", sizeof s); if (c->flags & CLIENT_IGNORESIZE) strlcat(s, "ignore-size,", sizeof s); + if (c->flags & CLIENT_NO_DETACH_ON_DESTROY) + strlcat(s, "no-detach-on-destroy,", sizeof s); if (c->flags & CLIENT_CONTROL_NOOUTPUT) strlcat(s, "no-output,", sizeof s); if (c->flags & CLIENT_CONTROL_WAITEXIT) @@ -3375,17 +3846,21 @@ server_client_print(struct client *c, int parse, struct evbuffer *evb) size_t size = EVBUFFER_LENGTH(evb); struct window_pane *wp; struct window_mode_entry *wme; - char *sanitized, *msg, *line; + char *sanitized, *msg, *line, empty = '\0'; if (!parse) { utf8_stravisx(&msg, data, size, VIS_OCTAL|VIS_CSTYLE|VIS_NOSLASH); - log_debug("%s: %s", __func__, msg); } else { - msg = EVBUFFER_DATA(evb); - if (msg[size - 1] != '\0') - evbuffer_add(evb, "", 1); + if (size == 0) + msg = ∅ + else { + msg = EVBUFFER_DATA(evb); + if (msg[size - 1] != '\0') + evbuffer_add(evb, "", 1); + } } + log_debug("%s: %s", __func__, msg); if (c == NULL) goto out; diff --git a/usr.bin/tmux/server-fn.c b/usr.bin/tmux/server-fn.c index e3cd2186c..0587897ab 100644 --- a/usr.bin/tmux/server-fn.c +++ b/usr.bin/tmux/server-fn.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server-fn.c,v 1.137 2024/04/04 22:44:40 nicm Exp $ */ +/* $OpenBSD: server-fn.c,v 1.138 2024/11/15 14:09:04 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -425,7 +425,7 @@ void server_destroy_session(struct session *s) { struct client *c; - struct session *s_new = NULL; + struct session *s_new = NULL, *cs_new, *use_s; int detach_on_destroy; detach_on_destroy = options_get_number(s->options, "detach-on-destroy"); @@ -437,15 +437,26 @@ server_destroy_session(struct session *s) s_new = session_previous_session(s); else if (detach_on_destroy == 4) s_new = session_next_session(s); - if (s_new == s) - s_new = NULL; + + /* + * If no suitable new session was found above, then look for any + * session as an alternative in case a client needs it. + */ + if (s_new == NULL && + (detach_on_destroy == 1 || detach_on_destroy == 2)) + cs_new = server_find_session(s, server_newer_session); + TAILQ_FOREACH(c, &clients, entry) { if (c->session != s) continue; + use_s = s_new; + if (use_s == NULL && (c->flags & CLIENT_NO_DETACH_ON_DESTROY)) + use_s = cs_new; + c->session = NULL; c->last_session = NULL; - server_client_set_session(c, s_new); - if (s_new == NULL) + server_client_set_session(c, use_s); + if (use_s == NULL) c->flags |= CLIENT_EXIT; } recalculate_sizes(); diff --git a/usr.bin/tmux/server.c b/usr.bin/tmux/server.c index d01d15dab..391614c6f 100644 --- a/usr.bin/tmux/server.c +++ b/usr.bin/tmux/server.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server.c,v 1.207 2024/08/26 07:30:46 nicm Exp $ */ +/* $OpenBSD: server.c,v 1.208 2025/01/01 15:17:36 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -205,6 +205,7 @@ server_start(struct tmuxproc *client, uint64_t flags, struct event_base *base, fatal("pledge failed"); input_key_build(); + utf8_update_width_cache(); RB_INIT(&windows); RB_INIT(&all_window_panes); TAILQ_INIT(&clients); diff --git a/usr.bin/tmux/session.c b/usr.bin/tmux/session.c index 7777b4843..cb3750455 100644 --- a/usr.bin/tmux/session.c +++ b/usr.bin/tmux/session.c @@ -1,4 +1,4 @@ -/* $OpenBSD: session.c,v 1.97 2024/10/01 06:15:47 nicm Exp $ */ +/* $OpenBSD: session.c,v 1.98 2024/11/25 08:34:01 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -33,12 +33,9 @@ u_int next_session_id; struct session_groups session_groups = RB_INITIALIZER(&session_groups); static void session_free(int, short, void *); - static void session_lock_timer(int, short, void *); - static struct winlink *session_next_alert(struct winlink *); static struct winlink *session_previous_alert(struct winlink *); - static void session_group_remove(struct session *); static void session_group_synchronize1(struct session *, struct session *); @@ -49,12 +46,12 @@ session_cmp(struct session *s1, struct session *s2) } RB_GENERATE(sessions, session, entry, session_cmp); -static int +int session_group_cmp(struct session_group *s1, struct session_group *s2) { return (strcmp(s1->name, s2->name)); } -RB_GENERATE_STATIC(session_groups, session_group, entry, session_group_cmp); +RB_GENERATE(session_groups, session_group, entry, session_group_cmp); /* * Find if session is still alive. This is true if it is still on the global diff --git a/usr.bin/tmux/status.c b/usr.bin/tmux/status.c index 9a2f3a212..942eeba27 100644 --- a/usr.bin/tmux/status.c +++ b/usr.bin/tmux/status.c @@ -1,4 +1,4 @@ -/* $OpenBSD: status.c,v 1.248 2024/10/08 06:29:44 nicm Exp $ */ +/* $OpenBSD: status.c,v 1.250 2024/10/28 08:11:59 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -728,6 +728,55 @@ status_prompt_update(struct client *c, const char *msg, const char *input) format_free(ft); } +/* Redraw character. Return 1 if can continue redrawing, 0 otherwise. */ +static int +status_prompt_redraw_character(struct screen_write_ctx *ctx, u_int offset, + u_int pwidth, u_int *width, struct grid_cell *gc, + const struct utf8_data *ud) +{ + u_char ch; + + if (*width < offset) { + *width += ud->width; + return (1); + } + if (*width >= offset + pwidth) + return (0); + *width += ud->width; + if (*width > offset + pwidth) + return (0); + + ch = *ud->data; + if (ud->size == 1 && (ch <= 0x1f || ch == 0x7f)) { + gc->data.data[0] = '^'; + gc->data.data[1] = (ch == 0x7f) ? '?' : ch|0x40; + gc->data.size = gc->data.have = 2; + gc->data.width = 2; + } else + utf8_copy(&gc->data, ud); + screen_write_cell(ctx, gc); + return (1); +} + +/* + * Redraw quote indicator '^' if necessary. Return 1 if can continue redrawing, + * 0 otherwise. + */ +static int +status_prompt_redraw_quote(const struct client *c, u_int pcursor, + struct screen_write_ctx *ctx, u_int offset, u_int pwidth, u_int *width, + struct grid_cell *gc) +{ + struct utf8_data ud; + + if (c->prompt_flags & PROMPT_QUOTENEXT && ctx->s->cx == pcursor + 1) { + utf8_set(&ud, '^'); + return (status_prompt_redraw_character(ctx, offset, pwidth, + width, gc, &ud)); + } + return (1); +} + /* Draw client prompt on status line of present else on last line. */ int status_prompt_redraw(struct client *c) @@ -786,6 +835,8 @@ status_prompt_redraw(struct client *c) pcursor = utf8_strwidth(c->prompt_buffer, c->prompt_index); pwidth = utf8_strwidth(c->prompt_buffer, -1); + if (c->prompt_flags & PROMPT_QUOTENEXT) + pwidth++; if (pcursor >= left) { /* * The cursor would be outside the screen so start drawing @@ -797,23 +848,19 @@ status_prompt_redraw(struct client *c) offset = 0; if (pwidth > left) pwidth = left; - c->prompt_cursor = start + c->prompt_index - offset; + c->prompt_cursor = start + pcursor - offset; width = 0; for (i = 0; c->prompt_buffer[i].size != 0; i++) { - if (width < offset) { - width += c->prompt_buffer[i].width; - continue; - } - if (width >= offset + pwidth) + if (!status_prompt_redraw_quote(c, pcursor, &ctx, offset, + pwidth, &width, &gc)) break; - width += c->prompt_buffer[i].width; - if (width > offset + pwidth) + if (!status_prompt_redraw_character(&ctx, offset, pwidth, + &width, &gc, &c->prompt_buffer[i])) break; - - utf8_copy(&gc.data, &c->prompt_buffer[i]); - screen_write_cell(&ctx, &gc); } + status_prompt_redraw_quote(c, pcursor, &ctx, offset, pwidth, &width, + &gc); finished: screen_write_stop(&ctx); @@ -864,6 +911,7 @@ status_prompt_translate_key(struct client *c, key_code key, key_code *new_key) case 'p'|KEYC_CTRL: case 't'|KEYC_CTRL: case 'u'|KEYC_CTRL: + case 'v'|KEYC_CTRL: case 'w'|KEYC_CTRL: case 'y'|KEYC_CTRL: case '\n': @@ -1262,6 +1310,19 @@ status_prompt_key(struct client *c, key_code key) } key &= ~KEYC_MASK_FLAGS; + if (c->prompt_flags & (PROMPT_SINGLE|PROMPT_QUOTENEXT)) { + if ((key & KEYC_MASK_KEY) == KEYC_BSPACE) + key = 0x7f; + else if ((key & KEYC_MASK_KEY) > 0x7f) { + if (!KEYC_IS_UNICODE(key)) + return (0); + key &= KEYC_MASK_KEY; + } else + key &= (key & KEYC_CTRL) ? 0x1f : KEYC_MASK_KEY; + c->prompt_flags &= ~PROMPT_QUOTENEXT; + goto append_key; + } + keys = options_get_number(c->session->options, "status-keys"); if (keys == MODEKEY_VI) { switch (status_prompt_translate_key(c, key, &key)) { @@ -1484,6 +1545,9 @@ process_key: } else prefix = '+'; goto changed; + case 'v'|KEYC_CTRL: + c->prompt_flags |= PROMPT_QUOTENEXT; + break; default: goto append_key; } @@ -1492,9 +1556,11 @@ process_key: return (0); append_key: - if (key <= 0x7f) + if (key <= 0x7f) { utf8_set(&tmp, key); - else if (KEYC_IS_UNICODE(key)) + if (key <= 0x1f || key == 0x7f) + tmp.width = 2; + } else if (KEYC_IS_UNICODE(key)) utf8_to_data(key, &tmp); else return (0); diff --git a/usr.bin/tmux/style.c b/usr.bin/tmux/style.c index 049b40ed3..9145425dc 100644 --- a/usr.bin/tmux/style.c +++ b/usr.bin/tmux/style.c @@ -1,4 +1,4 @@ -/* $OpenBSD: style.c,v 1.35 2024/08/26 13:02:15 nicm Exp $ */ +/* $OpenBSD: style.c,v 1.36 2024/11/15 13:12:20 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -39,6 +39,8 @@ static struct style style_default = { STYLE_RANGE_NONE, 0, "", + STYLE_WIDTH_DEFAULT, STYLE_PAD_DEFAULT, + STYLE_DEFAULT_BASE }; @@ -216,6 +218,16 @@ style_parse(struct style *sy, const struct grid_cell *base, const char *in) if ((value = attributes_fromstring(tmp + 2)) == -1) goto error; sy->gc.attr &= ~value; + } else if (end > 6 && strncasecmp(tmp, "width=", 6) == 0) { + n = strtonum(tmp + 6, 0, UINT_MAX, &errstr); + if (errstr != NULL) + goto error; + sy->width = (int)n; + } else if (end > 4 && strncasecmp(tmp, "pad=", 4) == 0) { + n = strtonum(tmp + 4, 0, UINT_MAX, &errstr); + if (errstr != NULL) + goto error; + sy->pad = (int)n; } else { if ((value = attributes_fromstring(tmp)) == -1) goto error; @@ -326,7 +338,16 @@ style_tostring(struct style *sy) attributes_tostring(gc->attr)); comma = ","; } - + if (sy->width >= 0) { + xsnprintf(s + off, sizeof s - off, "%swidth=%u", comma, + sy->width); + comma = ","; + } + if (sy->pad >= 0) { + xsnprintf(s + off, sizeof s - off, "%spad=%u", comma, + sy->pad); + comma = ","; + } if (*s == '\0') return ("default"); return (s); @@ -381,3 +402,24 @@ style_copy(struct style *dst, struct style *src) { memcpy(dst, src, sizeof *dst); } + +void +style_set_scrollbar_style_from_option(struct style *sb_style, struct options *oo) +{ + struct style *sy; + + sy = options_string_to_style(oo, "pane-scrollbars-style", NULL); + if (sy == NULL) { + style_set(sb_style, &grid_default_cell); + sb_style->width = PANE_SCROLLBARS_DEFAULT_WIDTH; + sb_style->pad = PANE_SCROLLBARS_DEFAULT_PADDING; + utf8_set(&sb_style->gc.data, PANE_SCROLLBARS_CHARACTER); + } else { + style_copy(sb_style, sy); + if (sb_style->width < 1) + sb_style->width = PANE_SCROLLBARS_DEFAULT_WIDTH; + if (sb_style->pad < 0) + sb_style->pad = PANE_SCROLLBARS_DEFAULT_PADDING; + utf8_set(&sb_style->gc.data, PANE_SCROLLBARS_CHARACTER); + } +} diff --git a/usr.bin/tmux/tmux.1 b/usr.bin/tmux/tmux.1 index 6e7aebfbe..6d1cc107e 100644 --- a/usr.bin/tmux/tmux.1 +++ b/usr.bin/tmux/tmux.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: tmux.1,v 1.967 2024/10/17 17:22:01 nicm Exp $ +.\" $OpenBSD: tmux.1,v 1.980 2025/01/01 15:17:36 nicm Exp $ .\" .\" Copyright (c) 2007 Nicholas Marriott .\" @@ -14,7 +14,7 @@ .\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING .\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: October 17 2024 $ +.Dd $Mdocdate: January 1 2025 $ .Dt TMUX 1 .Os .Sh NAME @@ -369,11 +369,12 @@ Enter copy mode and scroll one page up. .It Left, Right Change to the pane above, below, to the left, or to the right of the current pane. -.It M-1 to M-5 +.It M-1 to M-7 Arrange panes in one of the seven preset layouts: even-horizontal, even-vertical, main-horizontal, main-horizontal-mirrored, -main-vertical, main-vertical, or tiled. +main-vertical, main-vertical-mirrored, +or tiled. .It Space Arrange the current window in the next preset layout. .It M-n @@ -759,8 +760,8 @@ The start of a session name, for example would match a session named .Ql mysession . .It -An -.Xr fnmatch 3 +A +.Xr glob 7 pattern which is matched against the session name. .El .Pp @@ -808,8 +809,8 @@ An exact window name, such as The start of a window name, such as .Ql mysession:mywin . .It -As an -.Xr fnmatch 3 +As a +.Xr glob 7 pattern matched against the window name. .El .Pp @@ -1066,6 +1067,9 @@ The flags are: the client has an independent active pane .It ignore-size the client does not affect the size of other clients +.It no-detach-on-destroy +do not detach the client when the session it is attached to is destroyed if +there are any other sessions .It no-output the client does not receive pane output in control mode .It pause-after=seconds @@ -2337,6 +2341,9 @@ will do nothing. The .Fl o flag jumps to the beginning of the command output instead of the shell prompt. +Finding the beginning of command output requires the shell to emit an escape +sequence (\e033]133;C\e033\e\e) to tell tmux where the output begins. +If the shell does not send these escape sequences, these commands do nothing. .Pp Copy commands may take an optional buffer prefix argument which is used to generate the buffer name (the default is @@ -2400,22 +2407,31 @@ The synopsis for the command is: .Bl -tag -width Ds .It Xo Ic copy-mode -.Op Fl deHMqu +.Op Fl deHMqSu .Op Fl s Ar src-pane .Op Fl t Ar target-pane .Xc Enter copy mode. +.Pp .Fl u -also scrolls one page up after entering and +enters copy mode and scrolls one page up and .Fl d -one page down if already in copy mode. -.Fl M -begins a mouse drag (only valid if bound to a mouse key binding, see -.Sx MOUSE SUPPORT ) . +one page down. .Fl H hides the position indicator in the top right. .Fl q cancels copy mode and any other modes. +.Pp +.Fl M +begins a mouse drag (only valid if bound to a mouse key binding, see +.Sx MOUSE SUPPORT ) . +.Fl S +scrolls when bound to a mouse drag event; for example, +.Ic copy-mode -Se +is bound to +.Ar MouseDrag1ScrollbarSlider +by default. +.Pp .Fl s copies from .Ar src-pane @@ -2844,7 +2860,7 @@ other commands are not blocked from running until the indicator is closed. .Xc .D1 Pq alias: Ic findw Search for a -.Xr fnmatch 3 +.Xr glob 7 pattern or, with .Fl r , regular expression @@ -4041,6 +4057,14 @@ Note that aliases are expanded when a command is parsed rather than when it is executed, so binding an alias with .Ic bind-key will bind the expanded form. +.It Ic codepoint-widths[] Ar string +An array option allowing widths of Unicode codepoints to be overridden. +Note the new width applies to all clients. +Each entry is of the form +.Em codepoint=width , +where codepoint may be a UTF-8 character or an identifier of the form +.Ql U+number +where the number is a hexadecimal number. .It Ic copy-command Ar shell-command Give the command to pipe to if the .Ic copy-pipe @@ -4139,6 +4163,9 @@ option. If not empty, a file to which .Nm will write command prompt history on exit and load it from on start. +.It Ic input-buffer-size Ar bytes +Maximum of bytes allowed to read in escape and control sequences. +Once reached, the sequence will be discarded. .It Ic message-limit Ar number Set the number of error or information messages to save in the message log for each client. @@ -4212,8 +4239,8 @@ supports. .Pp This is an array option where each entry is a colon-separated string made up of a terminal type pattern (matched using -.Xr fnmatch 3 ) -followed by a list of terminal features. +.Xr glob 7 +patterns) followed by a list of terminal features. The available features are: .Bl -tag -width Ds .It 256 @@ -4269,7 +4296,8 @@ Allow terminal descriptions read using to be overridden. Each entry is a colon-separated string made up of a terminal type pattern (matched using -.Xr fnmatch 3 ) +.Xr glob 7 +patterns) and a set of .Em name=value entries. @@ -4858,6 +4886,7 @@ section. .Pp .It Ic copy-mode-position-format Ar format Format of the position indicator in copy mode. +.Pp .It Xo Ic mode-keys .Op Ic vi | emacs .Xc @@ -4869,6 +4898,22 @@ or contains .Ql vi . .Pp +.It Ic copy-mode-position-style Ar style +Set the style of the position indicator in copy mode. +For how to specify +.Ar style , +see the +.Sx STYLES +section. +.Pp +.It Ic copy-mode-selection-style Ar style +Set the style of the selection in copy mode. +For how to specify +.Ar style , +see the +.Sx STYLES +section. +.Pp .It Ic mode-style Ar style Set window modes style. For how to specify @@ -5026,6 +5071,51 @@ and .Ql heavy will fall back to standard ACS line drawing when UTF-8 is not supported. .Pp +.It Xo Ic pane-scrollbars +.Op Ic off | modal | on +.Xc +When enabled, a character based scrollbar appears on the left or right +of each pane. +A filled section of the scrollbar, known as the +.Ql slider , +represents the position and size of the visible part of the pane content. +.Pp +If set to +.Ic on +the scrollbar is visible all the time. +If set to +.Ic modal +the scrollbar only appears when the pane is in copy mode or view mode. +When the scrollbar is visible, the pane is narrowed by the width of the +scrollbar and the text in the pane is reflowed. +If set to +.Ic modal , +the pane is narrowed only when the scrollbar is visible. +.Pp +See also +.Ic pane-scrollbars-style . +.Pp +.It Ic pane-scrollbars-style Ar style +Set the scrollbars style. +For how to specify +.Ar style , +see the +.Sx STYLES +section. +The foreground colour is used for the slider, the background for the rest of the +scrollbar. +The +.Ar width +attribute sets the width of the scrollbar and the +.Ar pad +attribute the padding between the scrollbar and the pane. +Other attributes are ignored. +.Pp +.It Xo Ic pane-scrollbars-position +.Op Ic left | right +.Xc +Sets which side of the pane to display pane scrollbars on. +.Pp .It Ic window-status-activity-style Ar style Set status line style for windows with an activity alert. For how to specify @@ -5398,6 +5488,9 @@ and a location suffix, one of the following: .It Li "StatusLeft" Ta "the left part of the status line" .It Li "StatusRight" Ta "the right part of the status line" .It Li "StatusDefault" Ta "any other part of the status line" +.It Li "ScrollbarSlider" Ta "the scrollbar slider" +.It Li "ScrollbarUp" Ta "above the scrollbar slider" +.It Li "ScrollbarDown" Ta "below the scrollbar slider" .El .Pp The following mouse events are available: @@ -5542,14 +5635,14 @@ true, for example .Pp An .Ql m -specifies an -.Xr fnmatch 3 -or regular expression comparison. +specifies a +.Xr glob 7 +pattern or regular expression comparison. The first argument is the pattern and the second the string to compare. An optional argument specifies flags: .Ql r means the pattern is a regular expression instead of the default -.Xr fnmatch 3 +.Xr glob 7 pattern, and .Ql i means to ignore case. @@ -5559,8 +5652,8 @@ or .Ql #{m/ri:^A,MYVAR} . A .Ql C -performs a search for an -.Xr fnmatch 3 +performs a search for a +.Xr glob 7 pattern or regular expression in the pane content and evaluates to zero if not found, or a line number if found. Like @@ -7003,7 +7096,7 @@ If .Ar path is .Ql - , -the contents are read from stdin. +the contents are written to stdout. .It Xo Ic set-buffer .Op Fl aw .Op Fl b Ar buffer-name diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h index 1f6e4c4d9..8f8f10ccf 100644 --- a/usr.bin/tmux/tmux.h +++ b/usr.bin/tmux/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.1234 2024/10/07 08:50:47 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.1249 2025/01/01 15:17:36 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -165,23 +165,33 @@ struct winlink; (((key) & KEYC_MASK_KEY) < KEYC_USER || \ ((key) & KEYC_MASK_KEY) >= KEYC_USER_END)) +/* Is this a paste key? */ +#define KEYC_IS_PASTE(key) \ + ((key) == KEYC_PASTE_START || (key) == KEYC_PASTE_END) + /* Multiple click timeout. */ #define KEYC_CLICK_TIMEOUT 300 /* Mouse key codes. */ -#define KEYC_MOUSE_KEY(name) \ - KEYC_ ## name ## _PANE, \ - KEYC_ ## name ## _STATUS, \ - KEYC_ ## name ## _STATUS_LEFT, \ - KEYC_ ## name ## _STATUS_RIGHT, \ - KEYC_ ## name ## _STATUS_DEFAULT, \ +#define KEYC_MOUSE_KEY(name) \ + KEYC_ ## name ## _PANE, \ + KEYC_ ## name ## _STATUS, \ + KEYC_ ## name ## _STATUS_LEFT, \ + KEYC_ ## name ## _STATUS_RIGHT, \ + KEYC_ ## name ## _STATUS_DEFAULT, \ + KEYC_ ## name ## _SCROLLBAR_UP, \ + KEYC_ ## name ## _SCROLLBAR_SLIDER, \ + KEYC_ ## name ## _SCROLLBAR_DOWN, \ KEYC_ ## name ## _BORDER -#define KEYC_MOUSE_STRING(name, s) \ - { #s "Pane", KEYC_ ## name ## _PANE }, \ - { #s "Status", KEYC_ ## name ## _STATUS }, \ - { #s "StatusLeft", KEYC_ ## name ## _STATUS_LEFT }, \ - { #s "StatusRight", KEYC_ ## name ## _STATUS_RIGHT }, \ - { #s "StatusDefault", KEYC_ ## name ## _STATUS_DEFAULT }, \ +#define KEYC_MOUSE_STRING(name, s) \ + { #s "Pane", KEYC_ ## name ## _PANE }, \ + { #s "Status", KEYC_ ## name ## _STATUS }, \ + { #s "StatusLeft", KEYC_ ## name ## _STATUS_LEFT }, \ + { #s "StatusRight", KEYC_ ## name ## _STATUS_RIGHT }, \ + { #s "StatusDefault", KEYC_ ## name ## _STATUS_DEFAULT }, \ + { #s "ScrollbarUp", KEYC_ ## name ## _SCROLLBAR_UP }, \ + { #s "ScrollbarSlider", KEYC_ ## name ## _SCROLLBAR_SLIDER }, \ + { #s "ScrollbarDown", KEYC_ ## name ## _SCROLLBAR_DOWN }, \ { #s "Border", KEYC_ ## name ## _BORDER } /* @@ -599,7 +609,7 @@ enum tty_code_code { }; /* Character classes. */ -#define WHITESPACE " " +#define WHITESPACE "\t " /* Mode keys. */ #define MODEKEY_EMACS 0 @@ -709,6 +719,7 @@ struct colour_palette { #define GRID_FLAG_SELECTED 0x10 #define GRID_FLAG_NOPALETTE 0x20 #define GRID_FLAG_CLEARED 0x40 +#define GRID_FLAG_TAB 0x80 /* Grid line flags. */ #define GRID_LINE_WRAPPED 0x1 @@ -738,6 +749,7 @@ struct colour_palette { #define CELL_RIGHTJOIN 10 #define CELL_JOIN 11 #define CELL_OUTSIDE 12 +#define CELL_SCROLLBAR 13 /* Cell borders. */ #define CELL_BORDERS " xqlkmjwvtun~" @@ -855,6 +867,10 @@ struct style_range { }; TAILQ_HEAD(style_ranges, style_range); +/* Default style width and pad. */ +#define STYLE_WIDTH_DEFAULT -1 +#define STYLE_PAD_DEFAULT -1 + /* Style default. */ enum style_default_type { STYLE_DEFAULT_BASE, @@ -875,6 +891,9 @@ struct style { u_int range_argument; char range_string[16]; + int width; + int pad; + enum style_default_type default_type; }; @@ -984,6 +1003,9 @@ struct screen_redraw_ctx { int pane_status; enum pane_lines pane_lines; + int pane_scrollbars; + int pane_scrollbars_pos; + struct grid_cell no_pane_gc; int no_pane_gc_set; @@ -1102,6 +1124,10 @@ struct window_pane { #define PANE_EMPTY 0x800 #define PANE_STYLECHANGED 0x1000 #define PANE_UNSEENCHANGES 0x2000 +#define PANE_REDRAWSCROLLBAR 0x4000 + + u_int sb_slider_y; + u_int sb_slider_h; int argc; char **argv; @@ -1149,6 +1175,8 @@ struct window_pane { int control_bg; int control_fg; + struct style scrollbar_style; + TAILQ_ENTRY(window_pane) entry; /* link in list of all panes */ TAILQ_ENTRY(window_pane) sentry; /* link in list of last visited */ RB_ENTRY(window_pane) tree_entry; @@ -1244,6 +1272,23 @@ TAILQ_HEAD(winlink_stack, winlink); #define PANE_STATUS_TOP 1 #define PANE_STATUS_BOTTOM 2 +/* Pane scrollbars option. */ +#define PANE_SCROLLBARS_OFF 0 +#define PANE_SCROLLBARS_MODAL 1 +#define PANE_SCROLLBARS_ALWAYS 2 + +/* Pane scrollbars position option. */ +#define PANE_SCROLLBARS_RIGHT 0 +#define PANE_SCROLLBARS_LEFT 1 + +/* Pane scrollbars width, padding and fill character. */ +#define PANE_SCROLLBARS_DEFAULT_PADDING 0 +#define PANE_SCROLLBARS_DEFAULT_WIDTH 1 +#define PANE_SCROLLBARS_CHARACTER ' ' + +/* True if screen in alternate screen. */ +#define SCREEN_IS_ALTERNATE(s) ((s)->saved_grid != NULL) + /* Layout direction. */ enum layout_type { LAYOUT_LEFTRIGHT, @@ -1490,6 +1535,9 @@ struct tty { u_int mouse_last_y; u_int mouse_last_b; int mouse_drag_flag; + int mouse_scrolling_flag; + int mouse_slider_mpos; + void (*mouse_drag_update)(struct client *, struct mouse_event *); void (*mouse_drag_release)(struct client *, @@ -1879,13 +1927,16 @@ struct client { #define CLIENT_CLIPBOARDBUFFER 0x800000000ULL #define CLIENT_BRACKETPASTING 0x1000000000ULL #define CLIENT_ASSUMEPASTING 0x2000000000ULL +#define CLIENT_REDRAWSCROLLBARS 0x4000000000ULL +#define CLIENT_NO_DETACH_ON_DESTROY 0x8000000000ULL #define CLIENT_ALLREDRAWFLAGS \ (CLIENT_REDRAWWINDOW| \ CLIENT_REDRAWSTATUS| \ CLIENT_REDRAWSTATUSALWAYS| \ CLIENT_REDRAWBORDERS| \ CLIENT_REDRAWOVERLAY| \ - CLIENT_REDRAWPANES) + CLIENT_REDRAWPANES| \ + CLIENT_REDRAWSCROLLBARS) #define CLIENT_UNATTACHEDFLAGS \ (CLIENT_DEAD| \ CLIENT_SUSPENDED| \ @@ -1912,6 +1963,7 @@ struct client { key_code last_key; uint64_t redraw_panes; + uint64_t redraw_scrollbars; int message_ignore_keys; int message_ignore_styles; @@ -1937,6 +1989,7 @@ struct client { #define PROMPT_NOFORMAT 0x8 #define PROMPT_KEY 0x10 #define PROMPT_ACCEPT 0x20 +#define PROMPT_QUOTENEXT 0x40 int prompt_flags; enum prompt_type prompt_type; int prompt_cursor; @@ -1960,6 +2013,7 @@ struct client { struct event overlay_timer; struct client_files files; + u_int source_file_depth; u_int *clipboard_panes; u_int clipboard_npanes; @@ -2633,7 +2687,7 @@ u_int cmdq_next(struct client *); struct cmdq_item *cmdq_running(struct client *); void cmdq_guard(struct cmdq_item *, const char *, int); void printflike(2, 3) cmdq_print(struct cmdq_item *, const char *, ...); -void cmdq_print_data(struct cmdq_item *, int, struct evbuffer *); +void cmdq_print_data(struct cmdq_item *, struct evbuffer *); void printflike(2, 3) cmdq_error(struct cmdq_item *, const char *, ...); /* cmd-wait-for.c */ @@ -2817,6 +2871,7 @@ void recalculate_sizes(void); void recalculate_sizes_now(int); /* input.c */ +#define INPUT_BUF_DEFAULT_SIZE 1048576 struct input_ctx *input_init(struct window_pane *, struct bufferevent *, struct colour_palette *); void input_free(struct input_ctx *); @@ -2828,6 +2883,7 @@ void input_parse_screen(struct input_ctx *, struct screen *, screen_write_init_ctx_cb, void *, u_char *, size_t); void input_reply_clipboard(struct bufferevent *, const char *, size_t, const char *); +void input_set_buffer_size(size_t); /* input-key.c */ void input_key_build(void); @@ -2861,6 +2917,7 @@ int attributes_fromstring(const char *); /* grid.c */ extern const struct grid_cell grid_default_cell; void grid_empty_line(struct grid *, u_int, u_int); +void grid_set_tab(struct grid_cell *, u_int); int grid_cells_equal(const struct grid_cell *, const struct grid_cell *); int grid_cells_look_equal(const struct grid_cell *, const struct grid_cell *); @@ -2892,6 +2949,7 @@ void grid_reflow(struct grid *, u_int); void grid_wrap_position(struct grid *, u_int, u_int, u_int *, u_int *); void grid_unwrap_position(struct grid *, u_int *, u_int *, u_int, u_int); u_int grid_line_length(struct grid *, u_int); +int grid_in_set(struct grid *, u_int, u_int, const char *); /* grid-reader.c */ void grid_reader_start(struct grid_reader *, struct grid *, u_int, u_int); @@ -3011,7 +3069,7 @@ void screen_write_alternateoff(struct screen_write_ctx *, /* screen-redraw.c */ void screen_redraw_screen(struct client *); -void screen_redraw_pane(struct client *, struct window_pane *); +void screen_redraw_pane(struct client *, struct window_pane *, int); /* screen.c */ void screen_init(struct screen *, u_int, u_int, u_int); @@ -3107,7 +3165,8 @@ void window_pane_reset_mode_all(struct window_pane *); int window_pane_key(struct window_pane *, struct client *, struct session *, struct winlink *, key_code, struct mouse_event *); -void window_pane_paste(struct window_pane *, char *, size_t); +void window_pane_paste(struct window_pane *, key_code, char *, + size_t); int window_pane_visible(struct window_pane *); int window_pane_exited(struct window_pane *); u_int window_pane_search(struct window_pane *, const char *, int, @@ -3135,6 +3194,7 @@ void window_pane_update_used_data(struct window_pane *, void window_set_fill_character(struct window *); void window_pane_default_cursor(struct window_pane *); int window_pane_mode(struct window_pane *); +int window_pane_show_scrollbar(struct window_pane *, int); /* layout.c */ u_int layout_count_cells(struct layout_cell *); @@ -3240,11 +3300,14 @@ void printflike(3, 4) window_copy_add(struct window_pane *, int, const char *, ...); void printflike(3, 0) window_copy_vadd(struct window_pane *, int, const char *, va_list); +void window_copy_scroll(struct window_pane *, int, u_int, int); void window_copy_pageup(struct window_pane *, int); void window_copy_pagedown(struct window_pane *, int, int); void window_copy_start_drag(struct client *, struct mouse_event *); char *window_copy_get_word(struct window_pane *, u_int, u_int); char *window_copy_get_line(struct window_pane *, u_int); +int window_copy_get_current_offset(struct window_pane *, u_int *, + u_int *); /* window-option.c */ extern const struct window_mode window_customize_mode; @@ -3291,9 +3354,12 @@ void control_notify_paste_buffer_deleted(const char *); /* session.c */ extern struct sessions sessions; +extern struct session_groups session_groups; extern u_int next_session_id; int session_cmp(struct session *, struct session *); RB_PROTOTYPE(sessions, session, entry, session_cmp); +int session_group_cmp(struct session_group *, struct session_group *s2); +RB_PROTOTYPE(session_groups, session_group, entry, session_group_cmp); int session_alive(struct session *); struct session *session_find(const char *); struct session *session_find_by_id_str(const char *); @@ -3331,6 +3397,7 @@ void session_renumber_windows(struct session *); enum utf8_state utf8_towc (const struct utf8_data *, wchar_t *); enum utf8_state utf8_fromwc(wchar_t wc, struct utf8_data *); int utf8_in_table(wchar_t, const wchar_t *, u_int); +void utf8_update_width_cache(void); utf8_char utf8_build_one(u_char); enum utf8_state utf8_from_data(const struct utf8_data *, utf8_char *); void utf8_to_data(utf8_char, struct utf8_data *); @@ -3424,6 +3491,8 @@ void style_apply(struct grid_cell *, struct options *, const char *, struct format_tree *); void style_set(struct style *, const struct grid_cell *); void style_copy(struct style *, struct style *); +void style_set_scrollbar_style_from_option(struct style *, + struct options *); /* spawn.c */ struct winlink *spawn_window(struct spawn_context *, char **); diff --git a/usr.bin/tmux/tty-features.c b/usr.bin/tmux/tty-features.c index 3d5529fbf..b33356f7a 100644 --- a/usr.bin/tmux/tty-features.c +++ b/usr.bin/tmux/tty-features.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tty-features.c,v 1.31 2024/08/21 04:17:09 nicm Exp $ */ +/* $OpenBSD: tty-features.c,v 1.32 2024/11/28 08:49:14 nicm Exp $ */ /* * Copyright (c) 2020 Nicholas Marriott @@ -478,6 +478,10 @@ tty_default_features(int *feat, const char *name, u_int version) .features = TTY_FEATURES_BASE_MODERN_XTERM ",cstyle,extkeys,margins,usstyle,sync,osc7,hyperlinks" }, + { .name = "foot", + .features = TTY_FEATURES_BASE_MODERN_XTERM + ",cstyle,extkeys" + }, { .name = "XTerm", /* * xterm also supports DECSLRM and DECFRA, but they can be diff --git a/usr.bin/tmux/tty-keys.c b/usr.bin/tmux/tty-keys.c index bc887f733..e08e800a8 100644 --- a/usr.bin/tmux/tty-keys.c +++ b/usr.bin/tmux/tty-keys.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tty-keys.c,v 1.182 2024/10/04 14:55:17 nicm Exp $ */ +/* $OpenBSD: tty-keys.c,v 1.185 2025/01/02 10:34:45 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -885,6 +885,17 @@ first_key: if ((key & KEYC_MASK_KEY) == C0_NUL) key = ' ' | KEYC_CTRL | (key & KEYC_META); + /* + * Check for backspace key using termios VERASE - the terminfo + * kbs entry is extremely unreliable, so cannot be safely + * used. termios should have a better idea. + */ + bspace = tty->tio.c_cc[VERASE]; + if (bspace != _POSIX_VDISABLE && key == bspace) { + log_debug("%s: key %#llx is backspace", c->name, key); + key = KEYC_BSPACE; + } + /* * Fix up all C0 control codes that don't have a dedicated key into * corresponding Ctrl keys. Convert characters in the A-Z range into @@ -935,15 +946,6 @@ partial_key: complete_key: log_debug("%s: complete key %.*s %#llx", c->name, (int)size, buf, key); - /* - * Check for backspace key using termios VERASE - the terminfo - * kbs entry is extremely unreliable, so cannot be safely - * used. termios should have a better idea. - */ - bspace = tty->tio.c_cc[VERASE]; - if (bspace != _POSIX_VDISABLE && (key & KEYC_MASK_KEY) == bspace) - key = (key & KEYC_MASK_MODIFIERS)|KEYC_BSPACE; - /* Remove key timer. */ if (event_initialized(&tty->key_timer)) evtimer_del(&tty->key_timer); @@ -1592,6 +1594,8 @@ tty_keys_extended_device_attributes(struct tty *tty, const char *buf, tty_default_features(features, "XTerm", 0); else if (strncmp(tmp, "mintty ", 7) == 0) tty_default_features(features, "mintty", 0); + else if (strncmp(tmp, "foot(", 5) == 0) + tty_default_features(features, "foot", 0); log_debug("%s: received extended DA %.*s", c->name, (int)*size, buf); free(c->term_type); diff --git a/usr.bin/tmux/tty.c b/usr.bin/tmux/tty.c index 83e665f09..bd306e156 100644 --- a/usr.bin/tmux/tty.c +++ b/usr.bin/tmux/tty.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tty.c,v 1.439 2024/09/30 08:10:20 nicm Exp $ */ +/* $OpenBSD: tty.c,v 1.440 2024/10/25 19:36:38 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -1361,6 +1361,8 @@ tty_check_codeset(struct tty *tty, const struct grid_cell *gc) /* Characters less than 0x7f are always fine, no matter what. */ if (gc->data.size == 1 && *gc->data.data < 0x7f) return (gc); + if (gc->flags & GRID_FLAG_TAB) + return (gc); /* UTF-8 terminal and a UTF-8 character - fine. */ if (tty->client->flags & CLIENT_UTF8) diff --git a/usr.bin/tmux/utf8-combined.c b/usr.bin/tmux/utf8-combined.c index 1f0e2443b..779a0f5c8 100644 --- a/usr.bin/tmux/utf8-combined.c +++ b/usr.bin/tmux/utf8-combined.c @@ -1,4 +1,4 @@ -/* $OpenBSD: utf8-combined.c,v 1.3 2023/09/15 15:49:05 nicm Exp $ */ +/* $OpenBSD: utf8-combined.c,v 1.4 2025/01/01 15:17:36 nicm Exp $ */ /* * Copyright (c) 2023 Nicholas Marriott @@ -24,40 +24,6 @@ #include "tmux.h" -static const wchar_t utf8_modifier_table[] = { - 0x1F1E6, - 0x1F1E7, - 0x1F1E8, - 0x1F1E9, - 0x1F1EA, - 0x1F1EB, - 0x1F1EC, - 0x1F1ED, - 0x1F1EE, - 0x1F1EF, - 0x1F1F0, - 0x1F1F1, - 0x1F1F2, - 0x1F1F3, - 0x1F1F4, - 0x1F1F5, - 0x1F1F6, - 0x1F1F7, - 0x1F1F8, - 0x1F1F9, - 0x1F1FA, - 0x1F1FB, - 0x1F1FC, - 0x1F1FD, - 0x1F1FE, - 0x1F1FF, - 0x1F3FB, - 0x1F3FC, - 0x1F3FD, - 0x1F3FE, - 0x1F3FF -}; - /* Has this got a zero width joiner at the end? */ int utf8_has_zwj(const struct utf8_data *ud) @@ -93,8 +59,39 @@ utf8_is_modifier(const struct utf8_data *ud) if (utf8_towc(ud, &wc) != UTF8_DONE) return (0); - if (!utf8_in_table(wc, utf8_modifier_table, - nitems(utf8_modifier_table))) - return (0); - return (1); + switch (wc) { + case 0x1F1E6: + case 0x1F1E7: + case 0x1F1E8: + case 0x1F1E9: + case 0x1F1EA: + case 0x1F1EB: + case 0x1F1EC: + case 0x1F1ED: + case 0x1F1EE: + case 0x1F1EF: + case 0x1F1F0: + case 0x1F1F1: + case 0x1F1F2: + case 0x1F1F3: + case 0x1F1F4: + case 0x1F1F5: + case 0x1F1F6: + case 0x1F1F7: + case 0x1F1F8: + case 0x1F1F9: + case 0x1F1FA: + case 0x1F1FB: + case 0x1F1FC: + case 0x1F1FD: + case 0x1F1FE: + case 0x1F1FF: + case 0x1F3FB: + case 0x1F3FC: + case 0x1F3FD: + case 0x1F3FE: + case 0x1F3FF: + return (1); + } + return (0); } diff --git a/usr.bin/tmux/utf8.c b/usr.bin/tmux/utf8.c index e6ad34407..2afc8a174 100644 --- a/usr.bin/tmux/utf8.c +++ b/usr.bin/tmux/utf8.c @@ -1,4 +1,4 @@ -/* $OpenBSD: utf8.c,v 1.66 2024/07/12 11:21:18 nicm Exp $ */ +/* $OpenBSD: utf8.c,v 1.67 2025/01/01 15:17:36 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott @@ -26,169 +26,192 @@ #include "tmux.h" -static const wchar_t utf8_force_wide[] = { - 0x0261D, - 0x026F9, - 0x0270A, - 0x0270B, - 0x0270C, - 0x0270D, - 0x1F1E6, - 0x1F1E7, - 0x1F1E8, - 0x1F1E9, - 0x1F1EA, - 0x1F1EB, - 0x1F1EC, - 0x1F1ED, - 0x1F1EE, - 0x1F1EF, - 0x1F1F0, - 0x1F1F1, - 0x1F1F2, - 0x1F1F3, - 0x1F1F4, - 0x1F1F5, - 0x1F1F6, - 0x1F1F7, - 0x1F1F8, - 0x1F1F9, - 0x1F1FA, - 0x1F1FB, - 0x1F1FC, - 0x1F1FD, - 0x1F1FE, - 0x1F1FF, - 0x1F385, - 0x1F3C2, - 0x1F3C3, - 0x1F3C4, - 0x1F3C7, - 0x1F3CA, - 0x1F3CB, - 0x1F3CC, - 0x1F3FB, - 0x1F3FC, - 0x1F3FD, - 0x1F3FE, - 0x1F3FF, - 0x1F442, - 0x1F443, - 0x1F446, - 0x1F447, - 0x1F448, - 0x1F449, - 0x1F44A, - 0x1F44B, - 0x1F44C, - 0x1F44D, - 0x1F44E, - 0x1F44F, - 0x1F450, - 0x1F466, - 0x1F467, - 0x1F468, - 0x1F469, - 0x1F46B, - 0x1F46C, - 0x1F46D, - 0x1F46E, - 0x1F470, - 0x1F471, - 0x1F472, - 0x1F473, - 0x1F474, - 0x1F475, - 0x1F476, - 0x1F477, - 0x1F478, - 0x1F47C, - 0x1F481, - 0x1F482, - 0x1F483, - 0x1F485, - 0x1F486, - 0x1F487, - 0x1F48F, - 0x1F491, - 0x1F4AA, - 0x1F574, - 0x1F575, - 0x1F57A, - 0x1F590, - 0x1F595, - 0x1F596, - 0x1F645, - 0x1F646, - 0x1F647, - 0x1F64B, - 0x1F64C, - 0x1F64D, - 0x1F64E, - 0x1F64F, - 0x1F6A3, - 0x1F6B4, - 0x1F6B5, - 0x1F6B6, - 0x1F6C0, - 0x1F6CC, - 0x1F90C, - 0x1F90F, - 0x1F918, - 0x1F919, - 0x1F91A, - 0x1F91B, - 0x1F91C, - 0x1F91D, - 0x1F91E, - 0x1F91F, - 0x1F926, - 0x1F930, - 0x1F931, - 0x1F932, - 0x1F933, - 0x1F934, - 0x1F935, - 0x1F936, - 0x1F937, - 0x1F938, - 0x1F939, - 0x1F93D, - 0x1F93E, - 0x1F977, - 0x1F9B5, - 0x1F9B6, - 0x1F9B8, - 0x1F9B9, - 0x1F9BB, - 0x1F9CD, - 0x1F9CE, - 0x1F9CF, - 0x1F9D1, - 0x1F9D2, - 0x1F9D3, - 0x1F9D4, - 0x1F9D5, - 0x1F9D6, - 0x1F9D7, - 0x1F9D8, - 0x1F9D9, - 0x1F9DA, - 0x1F9DB, - 0x1F9DC, - 0x1F9DD, - 0x1FAC3, - 0x1FAC4, - 0x1FAC5, - 0x1FAF0, - 0x1FAF1, - 0x1FAF2, - 0x1FAF3, - 0x1FAF4, - 0x1FAF5, - 0x1FAF6, - 0x1FAF7, - 0x1FAF8 +struct utf8_width_item { + wchar_t wc; + u_int width; + int allocated; + + RB_ENTRY(utf8_width_item) entry; +}; + +static int +utf8_width_cache_cmp(struct utf8_width_item *uw1, struct utf8_width_item *uw2) +{ + if (uw1->wc < uw2->wc) + return (-1); + if (uw1->wc > uw2->wc) + return (1); + return (0); +} +RB_HEAD(utf8_width_cache, utf8_width_item); +RB_GENERATE_STATIC(utf8_width_cache, utf8_width_item, entry, + utf8_width_cache_cmp); +static struct utf8_width_cache utf8_width_cache = + RB_INITIALIZER(utf8_width_cache); + +static struct utf8_width_item utf8_default_width_cache[] = { + { .wc = 0x0261D, .width = 2 }, + { .wc = 0x026F9, .width = 2 }, + { .wc = 0x0270A, .width = 2 }, + { .wc = 0x0270B, .width = 2 }, + { .wc = 0x0270C, .width = 2 }, + { .wc = 0x0270D, .width = 2 }, + { .wc = 0x1F1E6, .width = 2 }, + { .wc = 0x1F1E7, .width = 2 }, + { .wc = 0x1F1E8, .width = 2 }, + { .wc = 0x1F1E9, .width = 2 }, + { .wc = 0x1F1EA, .width = 2 }, + { .wc = 0x1F1EB, .width = 2 }, + { .wc = 0x1F1EC, .width = 2 }, + { .wc = 0x1F1ED, .width = 2 }, + { .wc = 0x1F1EE, .width = 2 }, + { .wc = 0x1F1EF, .width = 2 }, + { .wc = 0x1F1F0, .width = 2 }, + { .wc = 0x1F1F1, .width = 2 }, + { .wc = 0x1F1F2, .width = 2 }, + { .wc = 0x1F1F3, .width = 2 }, + { .wc = 0x1F1F4, .width = 2 }, + { .wc = 0x1F1F5, .width = 2 }, + { .wc = 0x1F1F6, .width = 2 }, + { .wc = 0x1F1F7, .width = 2 }, + { .wc = 0x1F1F8, .width = 2 }, + { .wc = 0x1F1F9, .width = 2 }, + { .wc = 0x1F1FA, .width = 2 }, + { .wc = 0x1F1FB, .width = 2 }, + { .wc = 0x1F1FC, .width = 2 }, + { .wc = 0x1F1FD, .width = 2 }, + { .wc = 0x1F1FE, .width = 2 }, + { .wc = 0x1F1FF, .width = 2 }, + { .wc = 0x1F385, .width = 2 }, + { .wc = 0x1F3C2, .width = 2 }, + { .wc = 0x1F3C3, .width = 2 }, + { .wc = 0x1F3C4, .width = 2 }, + { .wc = 0x1F3C7, .width = 2 }, + { .wc = 0x1F3CA, .width = 2 }, + { .wc = 0x1F3CB, .width = 2 }, + { .wc = 0x1F3CC, .width = 2 }, + { .wc = 0x1F3FB, .width = 2 }, + { .wc = 0x1F3FC, .width = 2 }, + { .wc = 0x1F3FD, .width = 2 }, + { .wc = 0x1F3FE, .width = 2 }, + { .wc = 0x1F3FF, .width = 2 }, + { .wc = 0x1F442, .width = 2 }, + { .wc = 0x1F443, .width = 2 }, + { .wc = 0x1F446, .width = 2 }, + { .wc = 0x1F447, .width = 2 }, + { .wc = 0x1F448, .width = 2 }, + { .wc = 0x1F449, .width = 2 }, + { .wc = 0x1F44A, .width = 2 }, + { .wc = 0x1F44B, .width = 2 }, + { .wc = 0x1F44C, .width = 2 }, + { .wc = 0x1F44D, .width = 2 }, + { .wc = 0x1F44E, .width = 2 }, + { .wc = 0x1F44F, .width = 2 }, + { .wc = 0x1F450, .width = 2 }, + { .wc = 0x1F466, .width = 2 }, + { .wc = 0x1F467, .width = 2 }, + { .wc = 0x1F468, .width = 2 }, + { .wc = 0x1F469, .width = 2 }, + { .wc = 0x1F46B, .width = 2 }, + { .wc = 0x1F46C, .width = 2 }, + { .wc = 0x1F46D, .width = 2 }, + { .wc = 0x1F46E, .width = 2 }, + { .wc = 0x1F470, .width = 2 }, + { .wc = 0x1F471, .width = 2 }, + { .wc = 0x1F472, .width = 2 }, + { .wc = 0x1F473, .width = 2 }, + { .wc = 0x1F474, .width = 2 }, + { .wc = 0x1F475, .width = 2 }, + { .wc = 0x1F476, .width = 2 }, + { .wc = 0x1F477, .width = 2 }, + { .wc = 0x1F478, .width = 2 }, + { .wc = 0x1F47C, .width = 2 }, + { .wc = 0x1F481, .width = 2 }, + { .wc = 0x1F482, .width = 2 }, + { .wc = 0x1F483, .width = 2 }, + { .wc = 0x1F485, .width = 2 }, + { .wc = 0x1F486, .width = 2 }, + { .wc = 0x1F487, .width = 2 }, + { .wc = 0x1F48F, .width = 2 }, + { .wc = 0x1F491, .width = 2 }, + { .wc = 0x1F4AA, .width = 2 }, + { .wc = 0x1F574, .width = 2 }, + { .wc = 0x1F575, .width = 2 }, + { .wc = 0x1F57A, .width = 2 }, + { .wc = 0x1F590, .width = 2 }, + { .wc = 0x1F595, .width = 2 }, + { .wc = 0x1F596, .width = 2 }, + { .wc = 0x1F645, .width = 2 }, + { .wc = 0x1F646, .width = 2 }, + { .wc = 0x1F647, .width = 2 }, + { .wc = 0x1F64B, .width = 2 }, + { .wc = 0x1F64C, .width = 2 }, + { .wc = 0x1F64D, .width = 2 }, + { .wc = 0x1F64E, .width = 2 }, + { .wc = 0x1F64F, .width = 2 }, + { .wc = 0x1F6A3, .width = 2 }, + { .wc = 0x1F6B4, .width = 2 }, + { .wc = 0x1F6B5, .width = 2 }, + { .wc = 0x1F6B6, .width = 2 }, + { .wc = 0x1F6C0, .width = 2 }, + { .wc = 0x1F6CC, .width = 2 }, + { .wc = 0x1F90C, .width = 2 }, + { .wc = 0x1F90F, .width = 2 }, + { .wc = 0x1F918, .width = 2 }, + { .wc = 0x1F919, .width = 2 }, + { .wc = 0x1F91A, .width = 2 }, + { .wc = 0x1F91B, .width = 2 }, + { .wc = 0x1F91C, .width = 2 }, + { .wc = 0x1F91D, .width = 2 }, + { .wc = 0x1F91E, .width = 2 }, + { .wc = 0x1F91F, .width = 2 }, + { .wc = 0x1F926, .width = 2 }, + { .wc = 0x1F930, .width = 2 }, + { .wc = 0x1F931, .width = 2 }, + { .wc = 0x1F932, .width = 2 }, + { .wc = 0x1F933, .width = 2 }, + { .wc = 0x1F934, .width = 2 }, + { .wc = 0x1F935, .width = 2 }, + { .wc = 0x1F936, .width = 2 }, + { .wc = 0x1F937, .width = 2 }, + { .wc = 0x1F938, .width = 2 }, + { .wc = 0x1F939, .width = 2 }, + { .wc = 0x1F93D, .width = 2 }, + { .wc = 0x1F93E, .width = 2 }, + { .wc = 0x1F977, .width = 2 }, + { .wc = 0x1F9B5, .width = 2 }, + { .wc = 0x1F9B6, .width = 2 }, + { .wc = 0x1F9B8, .width = 2 }, + { .wc = 0x1F9B9, .width = 2 }, + { .wc = 0x1F9BB, .width = 2 }, + { .wc = 0x1F9CD, .width = 2 }, + { .wc = 0x1F9CE, .width = 2 }, + { .wc = 0x1F9CF, .width = 2 }, + { .wc = 0x1F9D1, .width = 2 }, + { .wc = 0x1F9D2, .width = 2 }, + { .wc = 0x1F9D3, .width = 2 }, + { .wc = 0x1F9D4, .width = 2 }, + { .wc = 0x1F9D5, .width = 2 }, + { .wc = 0x1F9D6, .width = 2 }, + { .wc = 0x1F9D7, .width = 2 }, + { .wc = 0x1F9D8, .width = 2 }, + { .wc = 0x1F9D9, .width = 2 }, + { .wc = 0x1F9DA, .width = 2 }, + { .wc = 0x1F9DB, .width = 2 }, + { .wc = 0x1F9DC, .width = 2 }, + { .wc = 0x1F9DD, .width = 2 }, + { .wc = 0x1FAC3, .width = 2 }, + { .wc = 0x1FAC4, .width = 2 }, + { .wc = 0x1FAC5, .width = 2 }, + { .wc = 0x1FAF0, .width = 2 }, + { .wc = 0x1FAF1, .width = 2 }, + { .wc = 0x1FAF2, .width = 2 }, + { .wc = 0x1FAF3, .width = 2 }, + { .wc = 0x1FAF4, .width = 2 }, + { .wc = 0x1FAF5, .width = 2 }, + { .wc = 0x1FAF6, .width = 2 }, + { .wc = 0x1FAF7, .width = 2 }, + { .wc = 0x1FAF8, .width = 2 } }; struct utf8_item { @@ -226,7 +249,8 @@ RB_HEAD(utf8_index_tree, utf8_item); RB_GENERATE_STATIC(utf8_index_tree, utf8_item, index_entry, utf8_index_cmp); static struct utf8_index_tree utf8_index_tree = RB_INITIALIZER(utf8_index_tree); -static u_int utf8_next_index; +static int utf8_no_width; +static u_int utf8_next_index; #define UTF8_GET_SIZE(uc) (((uc) >> 24) & 0x1f) #define UTF8_GET_WIDTH(uc) (((uc) >> 29) - 1) @@ -257,6 +281,120 @@ utf8_item_by_index(u_int index) return (RB_FIND(utf8_index_tree, &utf8_index_tree, &ui)); } +/* Find a codepoint in the cache. */ +static struct utf8_width_item * +utf8_find_in_width_cache(wchar_t wc) +{ + struct utf8_width_item uw; + + uw.wc = wc; + return RB_FIND(utf8_width_cache, &utf8_width_cache, &uw); +} + +/* Parse a single codepoint option. */ +static void +utf8_add_to_width_cache(const char *s) +{ + struct utf8_width_item *uw, *old; + char *copy, *cp, *endptr; + u_int width; + const char *errstr; + struct utf8_data *ud; + wchar_t wc; + unsigned long long n; + + copy = xstrdup(s); + if ((cp = strchr(copy, '=')) == NULL) { + free(copy); + return; + } + *cp++ = '\0'; + + width = strtonum(cp, 0, 2, &errstr); + if (errstr != NULL) { + free(copy); + return; + } + + if (strncmp(copy, "U+", 2) == 0) { + errno = 0; + n = strtoull(copy + 2, &endptr, 16); + if (copy[2] == '\0' || + *endptr != '\0' || + n == 0 || + n > WCHAR_MAX || + (errno == ERANGE && n == ULLONG_MAX)) { + free(copy); + return; + } + wc = n; + } else { + utf8_no_width = 1; + ud = utf8_fromcstr(copy); + utf8_no_width = 0; + if (ud[0].size == 0 || ud[1].size != 0) { + free(ud); + free(copy); + return; + } +#ifdef HAVE_UTF8PROC + if (utf8proc_mbtowc(&wc, ud[0].data, ud[0].size) <= 0) { +#else + if (mbtowc(&wc, ud[0].data, ud[0].size) <= 0) { +#endif + free(ud); + free(copy); + return; + } + free(ud); + } + + log_debug("Unicode width cache: %08X=%u", (u_int)wc, width); + + uw = xcalloc(1, sizeof *uw); + uw->wc = wc; + uw->width = width; + uw->allocated = 1; + + old = RB_INSERT(utf8_width_cache, &utf8_width_cache, uw); + if (old != NULL) { + RB_REMOVE(utf8_width_cache, &utf8_width_cache, old); + if (old->allocated) + free(old); + RB_INSERT(utf8_width_cache, &utf8_width_cache, uw); + } + + free(copy); +} + +/* Rebuild cache of widths. */ +void +utf8_update_width_cache(void) +{ + struct utf8_width_item *uw, *uw1; + struct options_entry *o; + struct options_array_item *a; + u_int i; + + RB_FOREACH_SAFE (uw, utf8_width_cache, &utf8_width_cache, uw1) { + RB_REMOVE(utf8_width_cache, &utf8_width_cache, uw); + if (uw->allocated) + free(uw); + } + + for (i = 0; i < nitems(utf8_default_width_cache); i++) { + RB_INSERT(utf8_width_cache, &utf8_width_cache, + &utf8_default_width_cache[i]); + } + + o = options_get(global_options, "codepoint-widths"); + a = options_array_first(o); + while (a != NULL) { + utf8_add_to_width_cache(options_array_item_value(a)->string); + a = options_array_next(a); + } +} + /* Add a UTF-8 item. */ static int utf8_put_item(const u_char *data, size_t size, u_int *index) @@ -287,28 +425,6 @@ utf8_put_item(const u_char *data, size_t size, u_int *index) return (0); } -static int -utf8_table_cmp(const void *vp1, const void *vp2) -{ - const wchar_t *wc1 = vp1, *wc2 = vp2; - - if (*wc1 < *wc2) - return (-1); - if (*wc1 > *wc2) - return (1); - return (0); -} - -/* Check if character in table. */ -int -utf8_in_table(wchar_t find, const wchar_t *table, u_int count) -{ - wchar_t *found; - - found = bsearch(&find, table, count, sizeof *table, utf8_table_cmp); - return (found != NULL); -} - /* Get UTF-8 character from data. */ enum utf8_state utf8_from_data(const struct utf8_data *ud, utf8_char *uc) @@ -401,12 +517,15 @@ utf8_copy(struct utf8_data *to, const struct utf8_data *from) static enum utf8_state utf8_width(struct utf8_data *ud, int *width) { - wchar_t wc; + struct utf8_width_item *uw; + wchar_t wc; if (utf8_towc(ud, &wc) != UTF8_DONE) return (UTF8_ERROR); - if (utf8_in_table(wc, utf8_force_wide, nitems(utf8_force_wide))) { - *width = 2; + uw = utf8_find_in_width_cache(wc); + if (uw != NULL) { + *width = uw->width; + log_debug("cached width for %08X is %d", (u_int)wc, *width); return (UTF8_DONE); } @@ -504,11 +623,13 @@ utf8_append(struct utf8_data *ud, u_char ch) if (ud->have != ud->size) return (UTF8_MORE); - if (ud->width == 0xff) - return (UTF8_ERROR); - if (utf8_width(ud, &width) != UTF8_DONE) - return (UTF8_ERROR); - ud->width = width; + if (!utf8_no_width) { + if (ud->width == 0xff) + return (UTF8_ERROR); + if (utf8_width(ud, &width) != UTF8_DONE) + return (UTF8_ERROR); + ud->width = width; + } return (UTF8_DONE); } diff --git a/usr.bin/tmux/window-copy.c b/usr.bin/tmux/window-copy.c index 6e290315c..61d4370f2 100644 --- a/usr.bin/tmux/window-copy.c +++ b/usr.bin/tmux/window-copy.c @@ -1,4 +1,4 @@ -/* $OpenBSD: window-copy.c,v 1.357 2024/10/05 00:35:35 nicm Exp $ */ +/* $OpenBSD: window-copy.c,v 1.368 2024/11/26 15:52:41 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -40,6 +40,8 @@ static void window_copy_free(struct window_mode_entry *); static void window_copy_resize(struct window_mode_entry *, u_int, u_int); static void window_copy_formats(struct window_mode_entry *, struct format_tree *); +static void window_copy_scroll1(struct window_mode_entry *, + struct window_pane *wp, int, u_int, int); static void window_copy_pageup1(struct window_mode_entry *, int); static int window_copy_pagedown1(struct window_mode_entry *, int, int); static void window_copy_next_paragraph(struct window_mode_entry *); @@ -145,6 +147,9 @@ static void window_copy_acquire_cursor_up(struct window_mode_entry *, u_int, u_int, u_int, u_int, u_int); static void window_copy_acquire_cursor_down(struct window_mode_entry *, u_int, u_int, u_int, u_int, u_int, u_int, int); +static u_int window_copy_clip_width(u_int, u_int, u_int, u_int); +static u_int window_copy_search_mark_match(struct window_copy_mode_data *, + u_int , u_int, u_int, int); const struct window_mode window_copy_mode = { .name = "copy-mode", @@ -598,6 +603,113 @@ window_copy_vadd(struct window_pane *wp, int parse, const char *fmt, va_list ap) screen_write_stop(&ctx); } +void +window_copy_scroll(struct window_pane *wp, int sl_mpos, u_int my, + int scroll_exit) +{ + struct window_mode_entry *wme = TAILQ_FIRST(&wp->modes); + + if (wme != NULL) { + window_set_active_pane(wp->window, wp, 0); + window_copy_scroll1(wme, wp, sl_mpos, my, scroll_exit); + } +} + +static void +window_copy_scroll1(struct window_mode_entry *wme, struct window_pane *wp, + int sl_mpos, u_int my, int scroll_exit) +{ + struct window_copy_mode_data *data = wme->data; + u_int ox, oy, px, py, n, offset, size; + u_int new_offset; + u_int slider_height = wp->sb_slider_h; + u_int sb_height = wp->sy, sb_top = wp->yoff; + u_int sy = screen_size_y(data->backing); + int new_slider_y, delta; + + /* + * sl_mpos is where in the slider the user is dragging, mouse is + * dragging this y point relative to top of slider. + */ + if (my <= sb_top + sl_mpos) { + /* Slider banged into top. */ + new_slider_y = sb_top - wp->yoff; + } else if (my - sl_mpos > sb_top + sb_height - slider_height) { + /* Slider banged into bottom. */ + new_slider_y = sb_top - wp->yoff + (sb_height - slider_height); + } else { + /* Slider is somewhere in the middle. */ + new_slider_y = my - wp->yoff - sl_mpos + 1; + } + + if (TAILQ_FIRST(&wp->modes) == NULL || + window_copy_get_current_offset(wp, &offset, &size) == 0) + return; + + /* + * See screen_redraw_draw_pane_scrollbar - this is the inverse of the + * formula used there. + */ + new_offset = new_slider_y * ((float)(size + sb_height) / sb_height); + delta = (int)offset - new_offset; + + /* + * Move pane view around based on delta relative to the cursor, + * maintaining the selection. + */ + oy = screen_hsize(data->backing) + data->cy - data->oy; + ox = window_copy_find_length(wme, oy); + + if (data->cx != ox) { + data->lastcx = data->cx; + data->lastsx = ox; + } + data->cx = data->lastcx; + + if (delta >= 0) { + n = (u_int)delta; + if (data->oy + n > screen_hsize(data->backing)) { + data->oy = screen_hsize(data->backing); + if (data->cy < n) + data->cy = 0; + else + data->cy -= n; + } else + data->oy += n; + } else { + n = (u_int)-delta; + if (data->oy < n) { + data->oy = 0; + if (data->cy + (n - data->oy) >= sy) + data->cy = sy - 1; + else + data->cy += n - data->oy; + } else + data->oy -= n; + } + + /* Don't also drag tail when dragging a scrollbar, it looks weird. */ + data->cursordrag = CURSORDRAG_NONE; + + if (data->screen.sel == NULL || !data->rectflag) { + py = screen_hsize(data->backing) + data->cy - data->oy; + px = window_copy_find_length(wme, py); + if ((data->cx >= data->lastsx && data->cx != px) || + data->cx > px) + window_copy_cursor_end_of_line(wme); + } + + if (scroll_exit && data->oy == 0) { + window_pane_reset_mode(wp); + return; + } + + if (data->searchmark != NULL && !data->timeout) + window_copy_search_marks(wme, NULL, data->searchregex, 1); + window_copy_update_selection(wme, 1, 0); + window_copy_redraw_screen(wme); +} + void window_copy_pageup(struct window_pane *wp, int half_page) { @@ -3082,6 +3194,9 @@ window_copy_search_compare(struct grid *gd, u_int px, u_int py, grid_get_cell(sgd, spx, 0, &sgc); sud = &sgc.data; + if (*sud->data == '\t' && sud->size == 1 && gc.flags & GRID_FLAG_TAB) + return (1); + if (ud->size != sud->size || ud->width != sud->width) return (0); @@ -3095,14 +3210,16 @@ static int window_copy_search_lr(struct grid *gd, struct grid *sgd, u_int *ppx, u_int py, u_int first, u_int last, int cis) { - u_int ax, bx, px, pywrap, endline; + u_int ax, bx, px, pywrap, endline, padding; int matched; struct grid_line *gl; + struct grid_cell gc; endline = gd->hsize + gd->sy - 1; for (ax = first; ax < last; ax++) { + padding = 0; for (bx = 0; bx < sgd->sx; bx++) { - px = ax + bx; + px = ax + bx + padding; pywrap = py; /* Wrap line. */ while (px >= gd->sx && pywrap < endline) { @@ -3113,8 +3230,13 @@ window_copy_search_lr(struct grid *gd, struct grid *sgd, u_int *ppx, u_int py, pywrap++; } /* We have run off the end of the grid. */ - if (px >= gd->sx) + if (px - padding >= gd->sx) break; + + grid_get_cell(gd, px, pywrap, &gc); + if (gc.flags & GRID_FLAG_TAB) + padding += gc.data.width - 1; + matched = window_copy_search_compare(gd, px, pywrap, sgd, bx, cis); if (!matched) @@ -3132,14 +3254,16 @@ static int window_copy_search_rl(struct grid *gd, struct grid *sgd, u_int *ppx, u_int py, u_int first, u_int last, int cis) { - u_int ax, bx, px, pywrap, endline; + u_int ax, bx, px, pywrap, endline, padding; int matched; struct grid_line *gl; + struct grid_cell gc; endline = gd->hsize + gd->sy - 1; for (ax = last; ax > first; ax--) { + padding = 0; for (bx = 0; bx < sgd->sx; bx++) { - px = ax - 1 + bx; + px = ax - 1 + bx + padding; pywrap = py; /* Wrap line. */ while (px >= gd->sx && pywrap < endline) { @@ -3150,8 +3274,13 @@ window_copy_search_rl(struct grid *gd, pywrap++; } /* We have run off the end of the grid. */ - if (px >= gd->sx) + if (px - padding >= gd->sx) break; + + grid_get_cell(gd, px, pywrap, &gc); + if (gc.flags & GRID_FLAG_TAB) + padding += gc.data.width - 1; + matched = window_copy_search_compare(gd, px, pywrap, sgd, bx, cis); if (!matched) @@ -3301,6 +3430,11 @@ window_copy_cellstring(const struct grid_line *gl, u_int px, size_t *size, *allocated = 0; return (&gce->data.data); } + if (gce->flags & GRID_FLAG_TAB) { + *size = 1; + *allocated = 0; + return ("\t"); + } utf8_to_data(gl->extddata[gce->offset].data, &ud); if (ud.size == 0) { @@ -3696,7 +3830,7 @@ window_copy_search(struct window_mode_entry *wme, int direction, int regex) struct screen_write_ctx ctx; struct grid *gd = s->grid; const char *str = data->searchstr; - u_int at, endline, fx, fy, start; + u_int at, endline, fx, fy, start, ssx; int cis, found, keys, visible_only; int wrapflag; @@ -3723,7 +3857,9 @@ window_copy_search(struct window_mode_entry *wme, int direction, int regex) fx = data->cx; fy = screen_hsize(data->backing) - data->oy + data->cy; - screen_init(&ss, screen_write_strlen("%s", str), 1, 0); + if ((ssx = screen_write_strlen("%s", str)) == 0) + return (0); + screen_init(&ss, ssx, 1, 0); screen_write_start(&ctx, &ss); screen_write_nputs(&ctx, -1, &grid_default_cell, "%s", str); screen_write_stop(&ctx); @@ -3857,6 +3993,43 @@ window_copy_search_mark_at(struct window_copy_mode_data *data, u_int px, return (0); } +static u_int +window_copy_clip_width(u_int width, u_int b, u_int sx, u_int sy) +{ + return ((b + width > sx * sy) ? (sx * sy) - b : width); +} + +static u_int +window_copy_search_mark_match(struct window_copy_mode_data *data, u_int px, + u_int py, u_int width, int regex) +{ + struct grid *gd = data->backing->grid; + struct grid_cell gc; + u_int i, b, w = width, sx = gd->sx, sy = gd->sy; + + if (window_copy_search_mark_at(data, px, py, &b) == 0) { + width = window_copy_clip_width(width, b, sx, sy); + w = width; + for (i = b; i < b + w; i++) { + if (!regex) { + grid_get_cell(gd, px + (i - b), py, &gc); + if (gc.flags & GRID_FLAG_TAB) + w += gc.data.width - 1; + w = window_copy_clip_width(w, b, sx, sy); + } + if (data->searchmark[i] != 0) + continue; + data->searchmark[i] = data->searchgen; + } + if (data->searchgen == UCHAR_MAX) + data->searchgen = 1; + else + data->searchgen++; + } + + return (w); +} + static int window_copy_search_marks(struct window_mode_entry *wme, struct screen *ssp, int regex, int visible_only) @@ -3865,10 +4038,12 @@ window_copy_search_marks(struct window_mode_entry *wme, struct screen *ssp, struct screen *s = data->backing, ss; struct screen_write_ctx ctx; struct grid *gd = s->grid; + struct grid_cell gc; int found, cis, stopped = 0; int cflags = REG_EXTENDED; - u_int px, py, i, b, nfound = 0, width; - u_int ssize = 1, start, end; + u_int px, py, nfound = 0, width; + u_int ssize = 1, start, end, sx = gd->sx; + u_int sy = gd->sy; char *sbuf; regex_t reg; uint64_t stop = 0, tstart, t; @@ -3905,13 +4080,13 @@ window_copy_search_marks(struct window_mode_entry *wme, struct screen *ssp, window_copy_visible_lines(data, &start, &end); else { start = 0; - end = gd->hsize + gd->sy; + end = gd->hsize + sy; stop = get_timer() + WINDOW_COPY_SEARCH_ALL_TIMEOUT; } again: free(data->searchmark); - data->searchmark = xcalloc(gd->sx, gd->sy); + data->searchmark = xcalloc(sx, sy); data->searchgen = 1; for (py = start; py < end; py++) { @@ -3919,31 +4094,21 @@ again: for (;;) { if (regex) { found = window_copy_search_lr_regex(gd, - &px, &width, py, px, gd->sx, ®); + &px, &width, py, px, sx, ®); + grid_get_cell(gd, px + width - 1, py, &gc); + if (gc.data.width > 2) + width += gc.data.width - 1; if (!found) break; } else { found = window_copy_search_lr(gd, ssp->grid, - &px, py, px, gd->sx, cis); + &px, py, px, sx, cis); if (!found) break; } nfound++; - - if (window_copy_search_mark_at(data, px, py, &b) == 0) { - if (b + width > gd->sx * gd->sy) - width = (gd->sx * gd->sy) - b; - for (i = b; i < b + width; i++) { - if (data->searchmark[i] != 0) - continue; - data->searchmark[i] = data->searchgen; - } - if (data->searchgen == UCHAR_MAX) - data->searchgen = 1; - else - data->searchgen++; - } - px += width; + px += window_copy_search_mark_match(data, px, py, width, + regex); } t = get_timer(); @@ -4083,9 +4248,15 @@ window_copy_match_at_cursor(struct window_copy_mode_data *data) px = at - (py * sx); grid_get_cell(gd, px, gd->hsize + py - data->oy, &gc); - buf = xrealloc(buf, len + gc.data.size + 1); - memcpy(buf + len, gc.data.data, gc.data.size); - len += gc.data.size; + if (gc.flags & GRID_FLAG_TAB) { + buf = xrealloc(buf, len + 2); + buf[len] = '\t'; + len++; + } else { + buf = xrealloc(buf, len + gc.data.size + 1); + memcpy(buf + len, gc.data.data, gc.data.size); + len += gc.data.size; + } } if (len != 0) buf[len] = '\0'; @@ -4188,6 +4359,23 @@ window_copy_write_one(struct window_mode_entry *wme, } } +int +window_copy_get_current_offset(struct window_pane *wp, u_int *offset, + u_int *size) +{ + struct window_mode_entry *wme = TAILQ_FIRST(&wp->modes); + struct window_copy_mode_data *data = wme->data; + u_int hsize; + + if (data == NULL) + return (0); + hsize = screen_hsize(data->backing); + + *offset = hsize - data->oy; + *size = hsize; + return (1); +} + static void window_copy_write_line(struct window_mode_entry *wme, struct screen_write_ctx *ctx, u_int py) @@ -4203,13 +4391,15 @@ window_copy_write_line(struct window_mode_entry *wme, char *expanded; struct format_tree *ft; - style_apply(&gc, oo, "mode-style", NULL); + ft = format_create_defaults(NULL, NULL, NULL, NULL, wp); + + style_apply(&gc, oo, "copy-mode-position-style", ft); gc.flags |= GRID_FLAG_NOPALETTE; - style_apply(&mgc, oo, "copy-mode-match-style", NULL); + style_apply(&mgc, oo, "copy-mode-match-style", ft); mgc.flags |= GRID_FLAG_NOPALETTE; - style_apply(&cgc, oo, "copy-mode-current-match-style", NULL); + style_apply(&cgc, oo, "copy-mode-current-match-style", ft); cgc.flags |= GRID_FLAG_NOPALETTE; - style_apply(&mkgc, oo, "copy-mode-mark-style", NULL); + style_apply(&mkgc, oo, "copy-mode-mark-style", ft); mkgc.flags |= GRID_FLAG_NOPALETTE; window_copy_write_one(wme, ctx, py, hsize - data->oy + py, @@ -4218,14 +4408,12 @@ window_copy_write_line(struct window_mode_entry *wme, if (py == 0 && s->rupper < s->rlower && !data->hide_position) { value = options_get_string(oo, "copy-mode-position-format"); if (*value != '\0') { - ft = format_create_defaults(NULL, NULL, NULL, NULL, wp); expanded = format_expand(ft, value); if (*expanded != '\0') { screen_write_cursormove(ctx, 0, 0, 0); format_draw(ctx, &gc, sx, expanded, NULL, 0); } free(expanded); - format_free(ft); } } @@ -4233,6 +4421,8 @@ window_copy_write_line(struct window_mode_entry *wme, screen_write_cursormove(ctx, screen_size_x(s) - 1, py, 0); screen_write_putc(ctx, &grid_default_cell, '$'); } + + format_free(ft); } static void @@ -4286,6 +4476,8 @@ window_copy_redraw_lines(struct window_mode_entry *wme, u_int py, u_int ny) window_copy_write_line(wme, &ctx, i); screen_write_cursormove(&ctx, data->cx, data->cy, 0); screen_write_stop(&ctx); + + wp->flags |= PANE_REDRAWSCROLLBAR; } static void @@ -4478,6 +4670,7 @@ window_copy_set_selection(struct window_mode_entry *wme, int may_redraw, struct grid_cell gc; u_int sx, sy, cy, endsx, endsy; int startrelpos, endrelpos; + struct format_tree *ft; window_copy_synchronize_cursor(wme, no_reset); @@ -4499,8 +4692,10 @@ window_copy_set_selection(struct window_mode_entry *wme, int may_redraw, } /* Set colours and selection. */ - style_apply(&gc, oo, "mode-style", NULL); + ft = format_create_defaults(NULL, NULL, NULL, NULL, wp); + style_apply(&gc, oo, "copy-mode-selection-style", ft); gc.flags |= GRID_FLAG_NOPALETTE; + format_free(ft); screen_set_selection(s, sx, sy, endsx, endsy, data->rectflag, data->modekeys, &gc); @@ -4795,7 +4990,10 @@ window_copy_copy_line(struct window_mode_entry *wme, char **buf, size_t *off, grid_get_cell(gd, i, sy, &gc); if (gc.flags & GRID_FLAG_PADDING) continue; - utf8_copy(&ud, &gc.data); + if (gc.flags & GRID_FLAG_TAB) + utf8_set(&ud, '\t'); + else + utf8_copy(&ud, &gc.data); if (ud.size == 1 && (gc.attr & GRID_ATTR_CHARSET)) { s = tty_acs_get(NULL, ud.data[0]); if (s != NULL && strlen(s) <= sizeof ud.data) { @@ -4840,12 +5038,8 @@ window_copy_in_set(struct window_mode_entry *wme, u_int px, u_int py, const char *set) { struct window_copy_mode_data *data = wme->data; - struct grid_cell gc; - grid_get_cell(data->backing->grid, px, py, &gc); - if (gc.flags & GRID_FLAG_PADDING) - return (0); - return (utf8_cstrhas(set, &gc.data)); + return (grid_in_set(data->backing->grid, px, py, set)); } static u_int @@ -5331,8 +5525,7 @@ window_copy_cursor_previous_word_pos(struct window_mode_entry *wme, py = hsize + data->cy - data->oy; grid_reader_start(&gr, back_s->grid, px, py); - grid_reader_cursor_previous_word(&gr, separators, /* already= */ 0, - /* stop_at_eol= */ 1); + grid_reader_cursor_previous_word(&gr, separators, 0, 1); grid_reader_get_cursor(&gr, &px, &py); *ppx = px; *ppy = py; @@ -5445,6 +5638,7 @@ window_copy_scroll_up(struct window_mode_entry *wme, u_int ny) window_copy_write_line(wme, &ctx, screen_size_y(s) - ny - 1); screen_write_cursormove(&ctx, data->cx, data->cy, 0); screen_write_stop(&ctx); + wp->flags |= PANE_REDRAWSCROLLBAR; } static void @@ -5478,6 +5672,7 @@ window_copy_scroll_down(struct window_mode_entry *wme, u_int ny) window_copy_write_line(wme, &ctx, 1); screen_write_cursormove(&ctx, data->cx, data->cy, 0); screen_write_stop(&ctx); + wp->flags |= PANE_REDRAWSCROLLBAR; } static void diff --git a/usr.bin/tmux/window.c b/usr.bin/tmux/window.c index ab0b49e9a..53f98dce5 100644 --- a/usr.bin/tmux/window.c +++ b/usr.bin/tmux/window.c @@ -1,4 +1,4 @@ -/* $OpenBSD: window.c,v 1.295 2024/10/05 12:10:16 nicm Exp $ */ +/* $OpenBSD: window.c,v 1.299 2024/12/06 09:06:57 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -584,11 +584,32 @@ struct window_pane * window_get_active_at(struct window *w, u_int x, u_int y) { struct window_pane *wp; + int pane_scrollbars; + u_int sb_pos, sb_w, xoff, sx; + + pane_scrollbars = options_get_number(w->options, "pane-scrollbars"); + sb_pos = options_get_number(w->options, "pane-scrollbars-position"); TAILQ_FOREACH(wp, &w->panes, entry) { if (!window_pane_visible(wp)) continue; - if (x < wp->xoff || x > wp->xoff + wp->sx) + + if (pane_scrollbars == PANE_SCROLLBARS_ALWAYS || + (pane_scrollbars == PANE_SCROLLBARS_MODAL && + window_pane_mode(wp) != WINDOW_PANE_NO_MODE)) { + sb_w = wp->scrollbar_style.width + + wp->scrollbar_style.pad; + } else + sb_w = 0; + + if (sb_pos == PANE_SCROLLBARS_LEFT) { + xoff = wp->xoff - sb_w; + sx = wp->sx + sb_w; + } else { /* sb_pos == PANE_SCROLLBARS_RIGHT */ + xoff = wp->xoff; + sx = wp->sx + sb_w; + } + if (x < xoff || x > xoff + sx) continue; if (y < wp->yoff || y > wp->yoff + wp->sy) continue; @@ -941,6 +962,9 @@ window_pane_create(struct window *w, u_int sx, u_int sy, u_int hlimit) wp->control_bg = -1; wp->control_fg = -1; + style_set_scrollbar_style_from_option(&wp->scrollbar_style, + wp->options); + colour_palette_init(&wp->palette); colour_palette_from_option(&wp->palette, wp->options); @@ -1086,6 +1110,7 @@ window_pane_set_mode(struct window_pane *wp, struct window_pane *swp, struct args *args) { struct window_mode_entry *wme; + struct window *w = wp->window; if (!TAILQ_EMPTY(&wp->modes) && TAILQ_FIRST(&wp->modes)->mode == mode) return (1); @@ -1106,9 +1131,10 @@ window_pane_set_mode(struct window_pane *wp, struct window_pane *swp, TAILQ_INSERT_HEAD(&wp->modes, wme, entry); wme->screen = wme->mode->init(wme, fs, args); } - wp->screen = wme->screen; - wp->flags |= (PANE_REDRAW|PANE_CHANGED); + + wp->flags |= (PANE_REDRAW|PANE_REDRAWSCROLLBAR|PANE_CHANGED); + layout_fix_panes(w, NULL); server_redraw_window_borders(wp->window); server_status_window(wp->window); @@ -1121,6 +1147,7 @@ void window_pane_reset_mode(struct window_pane *wp) { struct window_mode_entry *wme, *next; + struct window *w = wp->window; if (TAILQ_EMPTY(&wp->modes)) return; @@ -1141,7 +1168,9 @@ window_pane_reset_mode(struct window_pane *wp) if (next->mode->resize != NULL) next->mode->resize(next, wp->sx, wp->sy); } - wp->flags |= (PANE_REDRAW|PANE_CHANGED); + + wp->flags |= (PANE_REDRAW|PANE_REDRAWSCROLLBAR|PANE_CHANGED); + layout_fix_panes(w, NULL); server_redraw_window_borders(wp->window); server_status_window(wp->window); @@ -1190,7 +1219,7 @@ window_pane_copy_key(struct window_pane *wp, key_code key) } void -window_pane_paste(struct window_pane *wp, char *buf, size_t len) +window_pane_paste(struct window_pane *wp, key_code key, char *buf, size_t len) { if (!TAILQ_EMPTY(&wp->modes)) return; @@ -1198,6 +1227,9 @@ window_pane_paste(struct window_pane *wp, char *buf, size_t len) if (wp->fd == -1 || wp->flags & PANE_INPUTOFF) return; + if (KEYC_IS_PASTE(key) && (~wp->screen->mode & MODE_BRACKETPASTE)) + return; + log_debug("%s: %.*s", __func__, (int)len, buf); bufferevent_write(wp->event, buf, len); @@ -1701,3 +1733,16 @@ window_pane_mode(struct window_pane *wp) } return (WINDOW_PANE_NO_MODE); } + +/* Return 1 if scrollbar is or should be displayed. */ +int +window_pane_show_scrollbar(struct window_pane *wp, int sb_option) +{ + if (SCREEN_IS_ALTERNATE(wp->screen)) + return (0); + if (sb_option == PANE_SCROLLBARS_ALWAYS || + (sb_option == PANE_SCROLLBARS_MODAL && + window_pane_mode(wp) != WINDOW_PANE_NO_MODE)) + return (1); + return (0); +} diff --git a/usr.bin/units/units.1 b/usr.bin/units/units.1 index 57f405361..86b199183 100644 --- a/usr.bin/units/units.1 +++ b/usr.bin/units/units.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: units.1,v 1.29 2022/12/26 21:04:10 jmc Exp $ +.\" $OpenBSD: units.1,v 1.30 2024/12/10 05:10:13 jsg Exp $ .\" converted to new format by deraadt@openbsd.org .\" .\" Copyright (c) 1993 by Adrian Mariano (adrian@cam.cornell.edu) @@ -16,7 +16,7 @@ .\" I would appreciate (though I do not require) receiving a copy of any .\" improvements you might make to this program. .\" -.Dd $Mdocdate: December 26 2022 $ +.Dd $Mdocdate: December 10 2024 $ .Dt UNITS 1 .Os .Sh NAME @@ -212,6 +212,15 @@ the standard units library .%R ISO/IEC 80000 .%T Quantities and units \(em Part 13: Information science and technology .Re +.Sh HISTORY +A +.Nm +command first appeared in +.At v6 . +This version of +.Nm +appeared in +.Nx 1.0 . .Sh AUTHORS .An Adrian Mariano Aq Mt adrian@cam.cornell.edu or diff --git a/usr.sbin/authpf/authpf.c b/usr.sbin/authpf/authpf.c index 67d2f7237..bc410c063 100644 --- a/usr.sbin/authpf/authpf.c +++ b/usr.sbin/authpf/authpf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: authpf.c,v 1.129 2022/01/28 06:33:26 guenther Exp $ */ +/* $OpenBSD: authpf.c,v 1.130 2024/11/04 21:59:15 jca Exp $ */ /* * Copyright (C) 1998 - 2007 Bob Beck (beck@openbsd.org). @@ -528,8 +528,17 @@ allowed_luser(struct passwd *pw) } if (!gl_init) { - (void) getgrouplist(pw->pw_name, + int maxgroups, ret; + + maxgroups = ngroups; + ret = getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups); + if (ret == -1) { + /* + * Silently truncate group list + */ + ngroups = maxgroups; + } gl_init++; } diff --git a/usr.sbin/bgpctl/bgpctl.c b/usr.sbin/bgpctl/bgpctl.c index d8becf6f8..6c5343bb5 100644 --- a/usr.sbin/bgpctl/bgpctl.c +++ b/usr.sbin/bgpctl/bgpctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bgpctl.c,v 1.307 2024/08/14 19:10:51 claudio Exp $ */ +/* $OpenBSD: bgpctl.c,v 1.314 2024/12/16 16:10:46 claudio Exp $ */ /* * Copyright (c) 2003 Henning Brauer @@ -176,7 +176,9 @@ main(int argc, char *argv[]) if ((imsgbuf = malloc(sizeof(struct imsgbuf))) == NULL) err(1, NULL); - imsg_init(imsgbuf, fd); + if (imsgbuf_init(imsgbuf, fd) == -1 || + imsgbuf_set_maxsize(imsgbuf, MAX_BGPD_IMSGSIZE) == -1) + err(1, NULL); done = 0; switch (res->action) { @@ -418,9 +420,8 @@ main(int argc, char *argv[]) output->head(res); again: - while (imsgbuf->w.queued) - if (msgbuf_write(&imsgbuf->w) <= 0) - err(1, "write error"); + if (imsgbuf_flush(imsgbuf) == -1) + err(1, "write error"); while (!done) { while (!done) { @@ -436,8 +437,8 @@ main(int argc, char *argv[]) if (done) break; - if ((n = imsg_read(imsgbuf)) == -1) - err(1, "imsg_read error"); + if ((n = imsgbuf_read(imsgbuf)) == -1) + err(1, "read error"); if (n == 0) errx(1, "pipe closed"); @@ -1384,10 +1385,8 @@ network_mrt_dump(struct mrt_rib *mr, struct mrt_peer *mp, void *arg) mre->attrs[j].attr, mre->attrs[j].attr_len); imsg_compose(imsgbuf, IMSG_NETWORK_DONE, 0, 0, -1, NULL, 0); - while (imsgbuf->w.queued) { - if (msgbuf_write(&imsgbuf->w) <= 0 && errno != EAGAIN) - err(1, "write error"); - } + if (imsgbuf_flush(imsgbuf) == -1) + err(1, "write error"); } } @@ -1466,6 +1465,9 @@ print_capability(uint8_t capa_code, struct ibuf *b) case CAPA_ENHANCED_RR: printf("enhanced route refresh capability"); break; + case CAPA_EXT_MSG: + printf("extended message capability"); + break; default: printf("unknown capability %u length %zu", capa_code, ibuf_size(b)); @@ -1774,7 +1776,7 @@ show_mrt_msg(struct mrt_bgp_msg *mm, void *arg) } switch (type) { - case OPEN: + case MSG_OPEN: printf("%s ", msgtypenames[type]); if (len < MSGSIZE_OPEN_MIN) { printf("bad length: %u bytes\n", len); @@ -1782,7 +1784,7 @@ show_mrt_msg(struct mrt_bgp_msg *mm, void *arg) } show_mrt_open(b); break; - case NOTIFICATION: + case MSG_NOTIFICATION: printf("%s ", msgtypenames[type]); if (len < MSGSIZE_NOTIFICATION_MIN) { printf("bad length: %u bytes\n", len); @@ -1790,7 +1792,7 @@ show_mrt_msg(struct mrt_bgp_msg *mm, void *arg) } show_mrt_notification(b); break; - case UPDATE: + case MSG_UPDATE: printf("%s ", msgtypenames[type]); if (len < MSGSIZE_UPDATE_MIN) { printf("bad length: %u bytes\n", len); @@ -1798,7 +1800,7 @@ show_mrt_msg(struct mrt_bgp_msg *mm, void *arg) } show_mrt_update(b, req->flags, mm->add_path); break; - case KEEPALIVE: + case MSG_KEEPALIVE: printf("%s ", msgtypenames[type]); if (len != MSGSIZE_KEEPALIVE) { printf("bad length: %u bytes\n", len); @@ -1806,7 +1808,7 @@ show_mrt_msg(struct mrt_bgp_msg *mm, void *arg) } /* nothing */ break; - case RREFRESH: + case MSG_RREFRESH: printf("%s ", msgtypenames[type]); if (len != MSGSIZE_RREFRESH) { printf("bad length: %u bytes\n", len); diff --git a/usr.sbin/bgpctl/output.c b/usr.sbin/bgpctl/output.c index 24793e125..714a06e0b 100644 --- a/usr.sbin/bgpctl/output.c +++ b/usr.sbin/bgpctl/output.c @@ -1,4 +1,4 @@ -/* $OpenBSD: output.c,v 1.56 2024/10/01 18:33:16 claudio Exp $ */ +/* $OpenBSD: output.c,v 1.58 2024/12/13 19:22:01 claudio Exp $ */ /* * Copyright (c) 2003 Henning Brauer @@ -182,9 +182,11 @@ show_neighbor_capa_restart(struct capabilities *capa) int comma; uint8_t i; - printf(" Graceful Restart"); + printf(" Graceful Restart: "); if (capa->grestart.timeout) - printf(": Timeout: %d, ", capa->grestart.timeout); + printf("timeout: %d, ", capa->grestart.timeout); + if (capa->grestart.grnotification) + printf("graceful notification, "); for (i = AID_MIN, comma = 0; i < AID_MAX; i++) if (capa->grestart.flags[i] & CAPA_GR_PRESENT) { if (!comma && @@ -342,6 +344,8 @@ show_neighbor_full(struct peer *p, struct parse_result *res) printf(" Route Refresh\n"); if (p->capa.peer.enhanced_rr) printf(" Enhanced Route Refresh\n"); + if (p->capa.peer.ext_msg) + printf(" Extended message\n"); if (p->capa.peer.grestart.restart) show_neighbor_capa_restart(&p->capa.peer); if (hascapaap) @@ -372,6 +376,8 @@ show_neighbor_full(struct peer *p, struct parse_result *res) printf(" Route Refresh\n"); if (p->capa.neg.enhanced_rr) printf(" Enhanced Route Refresh\n"); + if (p->capa.neg.ext_msg) + printf(" Extended message\n"); if (p->capa.neg.grestart.restart) show_neighbor_capa_restart(&p->capa.neg); if (hascapaap) diff --git a/usr.sbin/bgpctl/output_json.c b/usr.sbin/bgpctl/output_json.c index 0f51749cb..65d17c061 100644 --- a/usr.sbin/bgpctl/output_json.c +++ b/usr.sbin/bgpctl/output_json.c @@ -1,4 +1,4 @@ -/* $OpenBSD: output_json.c,v 1.48 2024/10/01 18:33:16 claudio Exp $ */ +/* $OpenBSD: output_json.c,v 1.50 2024/12/13 19:22:01 claudio Exp $ */ /* * Copyright (c) 2020 Claudio Jeker @@ -57,6 +57,7 @@ json_neighbor_capabilities(struct capabilities *capa) json_do_bool("as4byte", capa->as4byte); json_do_bool("refresh", capa->refresh); json_do_bool("enhanced_refresh", capa->enhanced_rr); + json_do_bool("extended_message", capa->ext_msg); if (hascapamp) { json_do_array("multiprotocol"); @@ -81,6 +82,8 @@ json_neighbor_capabilities(struct capabilities *capa) if (capa->grestart.timeout) json_do_uint("timeout", capa->grestart.timeout); + if (capa->grestart.grnotification) + json_do_bool("graceful_notification", 1); if (present) { json_do_array("protocols"); diff --git a/usr.sbin/bgpd/bgpd.8 b/usr.sbin/bgpd/bgpd.8 index 6b304442b..c9e256b67 100644 --- a/usr.sbin/bgpd/bgpd.8 +++ b/usr.sbin/bgpd/bgpd.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: bgpd.8,v 1.78 2023/04/03 10:48:00 claudio Exp $ +.\" $OpenBSD: bgpd.8,v 1.82 2025/01/07 12:00:36 claudio Exp $ .\" .\" Copyright (c) 2003, 2004 Henning Brauer .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: April 3 2023 $ +.Dd $Mdocdate: January 7 2025 $ .Dt BGPD 8 .Os .Sh NAME @@ -309,6 +309,17 @@ has been started. .Re .Pp .Rs +.%A S. Sangli +.%A E. Chen +.%A R. Fernando +.%A J. Scudder +.%A Y. Rekhter +.%D January 2007 +.%R RFC 4724 +.%T Graceful Restart Mechanism for BGP +.Re +.Pp +.Rs .%A T. Bates .%A R. Chandra .%A D. Katz @@ -338,6 +349,15 @@ has been started. .Re .Pp .Rs +.%A Y. Rekhter +.%A S. Sangli +.%A D. Tappan +.%D October 2009 +.%R RFC 5668 +.%T 4-Octet AS Specific BGP Extended Community +.Re +.Pp +.Rs .%A E. Chen .%A J. Yuan .%D June 2011 @@ -346,6 +366,15 @@ has been started. .Re .Pp .Rs +.%A J. Dong +.%A M. Chen +.%A A. Suryanarayana +.%D May 2012 +.%R RFC 6608 +.%T Subcodes for BGP Finite State Machine Error +.Re +.Pp +.Rs .%A Q. Vohra .%A E. Chen .%D Dec 2012 @@ -411,6 +440,16 @@ has been started. .Re .Pp .Rs +.%A E. Jasinska +.%A N. Hilliard +.%A R. Raszuk +.%A N. Bakker +.%D September 2016 +.%R RFC 7947 +.%T Internet Exchange BGP Route Server +.Re +.Pp +.Rs .%A C. Petrie .%A T. King .%D May 2017 @@ -478,6 +517,25 @@ has been started. .Re .Pp .Rs +.%A K. Patel +.%A R. Fernando +.%A J. Scudder +.%A J. Haas +.%D March 2019 +.%R RFC 8538 +.%T Notification Message Support for BGP Graceful Restart +.Re +.Pp +.Rs +.%A R. Bush +.%A K. Patel +.%A D. Ward +.%D October 2019 +.%R RFC 8654 +.%T Extended Message Support for BGP +.Re +.Pp +.Rs .%A C. Loibl .%A S. Hares .%A R. Raszuk @@ -517,6 +575,15 @@ has been started. .Re .Pp .Rs +.%A J. Snijders +.%A B. Cartwright-Cox +.%A Y. Qu +.%D November 2024 +.%R RFC 9687 +.%T Border Gateway Protocol 4 (BGP-4) Send Hold Timer +.Re +.Pp +.Rs .%A A. Azimov .%A E. Bogomazov .%A R. Bush diff --git a/usr.sbin/bgpd/bgpd.c b/usr.sbin/bgpd/bgpd.c index fca675c24..b1043a434 100644 --- a/usr.sbin/bgpd/bgpd.c +++ b/usr.sbin/bgpd/bgpd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bgpd.c,v 1.270 2024/10/08 12:28:09 claudio Exp $ */ +/* $OpenBSD: bgpd.c,v 1.280 2024/12/03 13:46:53 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -276,9 +276,16 @@ main(int argc, char *argv[]) (ibuf_rde = malloc(sizeof(struct imsgbuf))) == NULL || (ibuf_rtr = malloc(sizeof(struct imsgbuf))) == NULL) fatal(NULL); - imsg_init(ibuf_se, pipe_m2s[0]); - imsg_init(ibuf_rde, pipe_m2r[0]); - imsg_init(ibuf_rtr, pipe_m2roa[0]); + if (imsgbuf_init(ibuf_se, pipe_m2s[0]) == -1 || + imsgbuf_set_maxsize(ibuf_se, MAX_BGPD_IMSGSIZE) == -1 || + imsgbuf_init(ibuf_rde, pipe_m2r[0]) == -1 || + imsgbuf_set_maxsize(ibuf_rde, MAX_BGPD_IMSGSIZE) == -1 || + imsgbuf_init(ibuf_rtr, pipe_m2roa[0]) == -1 || + imsgbuf_set_maxsize(ibuf_rtr, MAX_BGPD_IMSGSIZE) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(ibuf_se); + imsgbuf_allow_fdpass(ibuf_rde); + imsgbuf_allow_fdpass(ibuf_rtr); mrt_init(ibuf_rde, ibuf_se); if (kr_init(&rfd, conf->fib_priority) == -1) quit = 1; @@ -362,7 +369,7 @@ BROKEN if (pledge("stdio rpath wpath cpath fattr unix route recvfd sendfd", if (handle_pollfd(&pfd[PFD_PIPE_SESSION], ibuf_se) == -1) { log_warnx("main: Lost connection to SE"); - msgbuf_clear(&ibuf_se->w); + imsgbuf_clear(ibuf_se); free(ibuf_se); ibuf_se = NULL; quit = 1; @@ -374,7 +381,7 @@ BROKEN if (pledge("stdio rpath wpath cpath fattr unix route recvfd sendfd", if (handle_pollfd(&pfd[PFD_PIPE_RDE], ibuf_rde) == -1) { log_warnx("main: Lost connection to RDE"); - msgbuf_clear(&ibuf_rde->w); + imsgbuf_clear(ibuf_rde); free(ibuf_rde); ibuf_rde = NULL; quit = 1; @@ -385,7 +392,7 @@ BROKEN if (pledge("stdio rpath wpath cpath fattr unix route recvfd sendfd", if (handle_pollfd(&pfd[PFD_PIPE_RTR], ibuf_rtr) == -1) { log_warnx("main: Lost connection to RTR"); - msgbuf_clear(&ibuf_rtr->w); + imsgbuf_clear(ibuf_rtr); free(ibuf_rtr); ibuf_rtr = NULL; quit = 1; @@ -447,19 +454,19 @@ BROKEN if (pledge("stdio rpath wpath cpath fattr unix route recvfd sendfd", /* close pipes */ if (ibuf_se) { - msgbuf_clear(&ibuf_se->w); + imsgbuf_clear(ibuf_se); close(ibuf_se->fd); free(ibuf_se); ibuf_se = NULL; } if (ibuf_rde) { - msgbuf_clear(&ibuf_rde->w); + imsgbuf_clear(ibuf_rde); close(ibuf_rde->fd); free(ibuf_rde); ibuf_rde = NULL; } if (ibuf_rtr) { - msgbuf_clear(&ibuf_rtr->w); + imsgbuf_clear(ibuf_rtr); close(ibuf_rtr->fd); free(ibuf_rtr); ibuf_rtr = NULL; @@ -726,14 +733,6 @@ send_config(struct bgpd_config *conf) } free_roatree(&conf->roa); RB_FOREACH(aspa, aspa_tree, &conf->aspa) { - /* XXX prevent oversized IMSG for now */ - if (aspa->num * sizeof(*aspa->tas) > - MAX_IMSGSIZE - IMSG_HEADER_SIZE) { - log_warnx("oversized ASPA set for customer-as %s, %s", - log_as(aspa->as), "dropped"); - continue; - } - if (imsg_compose(ibuf_rtr, IMSG_RECONF_ASPA, 0, 0, -1, aspa, offsetof(struct aspa_set, tas)) == -1) return (-1); @@ -1260,7 +1259,7 @@ set_pollfd(struct pollfd *pfd, struct imsgbuf *i) } pfd->fd = i->fd; pfd->events = POLLIN; - if (i->w.queued > 0) + if (imsgbuf_queuelen(i) > 0) pfd->events |= POLLOUT; } @@ -1273,7 +1272,7 @@ handle_pollfd(struct pollfd *pfd, struct imsgbuf *i) return (0); if (pfd->revents & POLLOUT) - if (msgbuf_write(&i->w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(i) == -1) { log_warn("imsg write error"); close(i->fd); i->fd = -1; @@ -1281,7 +1280,7 @@ handle_pollfd(struct pollfd *pfd, struct imsgbuf *i) } if (pfd->revents & POLLIN) { - if ((n = imsg_read(i)) == -1 && errno != EAGAIN) { + if ((n = imsgbuf_read(i)) == -1) { log_warn("imsg read error"); close(i->fd); i->fd = -1; @@ -1307,29 +1306,23 @@ getsockpair(int pipe[2]) fatal("socketpair"); for (i = 0; i < 2; i++) { - for (bsize = MAX_SOCK_BUF; bsize >= 16 * 1024; bsize /= 2) { - if (setsockopt(pipe[i], SOL_SOCKET, SO_RCVBUF, - &bsize, sizeof(bsize)) == -1) { - if (errno != ENOBUFS) - fatal("setsockopt(SO_RCVBUF, %d)", - bsize); - log_warn("setsockopt(SO_RCVBUF, %d)", bsize); - continue; - } - break; + bsize = MAX_SOCK_BUF; + if (setsockopt(pipe[i], SOL_SOCKET, SO_RCVBUF, + &bsize, sizeof(bsize)) == -1) { + if (errno != ENOBUFS) + fatal("setsockopt(SO_RCVBUF, %d)", + bsize); + log_warn("setsockopt(SO_RCVBUF, %d)", bsize); } } for (i = 0; i < 2; i++) { - for (bsize = MAX_SOCK_BUF; bsize >= 16 * 1024; bsize /= 2) { - if (setsockopt(pipe[i], SOL_SOCKET, SO_SNDBUF, - &bsize, sizeof(bsize)) == -1) { - if (errno != ENOBUFS) - fatal("setsockopt(SO_SNDBUF, %d)", - bsize); - log_warn("setsockopt(SO_SNDBUF, %d)", bsize); - continue; - } - break; + bsize = MAX_SOCK_BUF; + if (setsockopt(pipe[i], SOL_SOCKET, SO_SNDBUF, + &bsize, sizeof(bsize)) == -1) { + if (errno != ENOBUFS) + fatal("setsockopt(SO_SNDBUF, %d)", + bsize); + log_warn("setsockopt(SO_SNDBUF, %d)", bsize); } } } diff --git a/usr.sbin/bgpd/bgpd.conf.5 b/usr.sbin/bgpd/bgpd.conf.5 index d4b3fb71c..f0199a6c1 100644 --- a/usr.sbin/bgpd/bgpd.conf.5 +++ b/usr.sbin/bgpd/bgpd.conf.5 @@ -1,4 +1,4 @@ -.\" $OpenBSD: bgpd.conf.5,v 1.242 2024/08/14 19:09:51 claudio Exp $ +.\" $OpenBSD: bgpd.conf.5,v 1.246 2025/01/07 12:11:45 claudio Exp $ .\" .\" Copyright (c) 2004 Claudio Jeker .\" Copyright (c) 2003, 2004 Henning Brauer @@ -16,7 +16,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: August 14 2024 $ +.Dd $Mdocdate: January 7 2025 $ .Dt BGPD.CONF 5 .Os .Sh NAME @@ -397,14 +397,26 @@ is the routing domain in which has been started. By default, no restricted socket is created. .Pp +.It Ic staletime Ar seconds +Set the upper bound in seconds stale routes are kept during graceful restart. +The default is 180 seconds. +.Pp .It Xo .Ic transparent-as .Pq Ic yes Ns | Ns Ic no .Xc If set to .Ic yes , +attribute transparency is enabled. .Em AS paths to EBGP neighbors are not prepended with the local AS. +Additionally, the MULTI_EXIT_DISC attribute is passed transparently and +automatic filtering based on the well-known communities +.Ic NO_EXPORT , +.Ic NO_ADVERTISE , +and +.Ic NO_EXPORT_SUBCONFED +is disabled. The default is .Ic no . .El @@ -1091,6 +1103,34 @@ The default is .Ic no . .Pp .It Xo +.Ic announce extended +.Pq Ic yes Ns | Ns Ic no Ns | Ns Ic enforce +.Xc +If set to +.Ic yes , +the extended message capability is announced. +If negotiated, the default maximum message size is increased from 4096 to 65535 +bytes. +If +.Ic enforce +is set, the session will only be established if the neighbor also announces +the capability. +The default is +.Ic no . +.Pp +.It Xo +.Ic announce graceful notification +.Pq Ic yes Ns | Ns Ic no +.Xc +If set to +.Ic yes , +the graceful notification extension to graceful restart is announced. +The default is +.Ic no . +.Ic announce refresh +must be enabled to enable graceful notifications. +.Pp +.It Xo .Ic announce policy .Pq Ic yes Ns | Ns Ic no Ns | Ns Ic enforce .Xc @@ -1519,6 +1559,10 @@ and These sets are rewritten into filter rules and can be viewed with .Dq bgpd -nv . .Pp +.It Ic staletime Ar seconds +Set the upper bound stale time in seconds for graceful restart. +Inherited from the global configuration if not given. +.Pp .It Ic tcp md5sig password Ar secret .It Ic tcp md5sig key Ar secret Enable TCP MD5 signatures per RFC 2385. @@ -1535,8 +1579,11 @@ After changing keys, a session needs to be reset to use the new keys. .Xc If set to .Ic yes , -.Em AS paths -to EBGP neighbors are not prepended with the local AS. +attribute transparency is enabled. +See also the +.Ic transparent-as +setting in +.Sx GLOBAL CONFIGURATION . The default is inherited from the global .Ic transparent-as setting. diff --git a/usr.sbin/bgpd/bgpd.h b/usr.sbin/bgpd/bgpd.h index afea56003..ce5b3c6fe 100644 --- a/usr.sbin/bgpd/bgpd.h +++ b/usr.sbin/bgpd/bgpd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: bgpd.h,v 1.498 2024/10/08 12:28:09 claudio Exp $ */ +/* $OpenBSD: bgpd.h,v 1.507 2025/01/07 17:43:31 denis Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -49,13 +49,14 @@ #define SET_NAME_LEN 128 #define MAX_PKTSIZE 4096 -#define MIN_HOLDTIME 3 -#define READ_BUF_SIZE 65535 -#define MAX_SOCK_BUF (4 * READ_BUF_SIZE) +#define MAX_EXT_PKTSIZE 65535 +#define MAX_BGPD_IMSGSIZE (128 * 1024) +#define MAX_SOCK_BUF (4 * IBUF_READ_SIZE) #define RT_BUF_SIZE 16384 #define MAX_RTSOCK_BUF (2 * 1024 * 1024) #define MAX_COMM_MATCH 3 #define MAX_ASPA_SPAS_COUNT 10000 +#define MIN_HOLDTIME 3 #define BGPD_OPT_VERBOSE 0x0001 #define BGPD_OPT_VERBOSE2 0x0002 @@ -130,6 +131,7 @@ * IMSG_XON message will be sent and the RDE will produce more messages again. */ #define RDE_RUNNER_ROUNDS 100 +#define RDE_REAPER_ROUNDS 5000 #define SESS_MSG_HIGH_MARK 2000 #define SESS_MSG_LOW_MARK 500 #define CTL_MSG_HIGH_MARK 500 @@ -154,12 +156,14 @@ enum reconf_action { #define AFI_UNSPEC 0 #define AFI_IPv4 1 #define AFI_IPv6 2 +#define AFI_L2VPN 25 /* Subsequent Address Family Identifier as per RFC 4760 */ #define SAFI_NONE 0 #define SAFI_UNICAST 1 #define SAFI_MULTICAST 2 #define SAFI_MPLS 4 +#define SAFI_EVPN 70 /* RFC 7432 */ #define SAFI_MPLSVPN 128 #define SAFI_FLOWSPEC 133 #define SAFI_VPNFLOWSPEC 134 @@ -180,7 +184,8 @@ extern const struct aid aid_vals[]; #define AID_VPN_IPv6 4 #define AID_FLOWSPECv4 5 #define AID_FLOWSPECv6 6 -#define AID_MAX 7 +#define AID_EVPN 7 +#define AID_MAX 8 #define AID_MIN 1 /* skip AID_UNSPEC since that is a dummy */ #define AID_VALS { \ @@ -192,6 +197,7 @@ extern const struct aid aid_vals[]; { AFI_IPv6, AF_INET6, SAFI_MPLSVPN, "IPv6 vpn" }, \ { AFI_IPv4, AF_INET, SAFI_FLOWSPEC, "IPv4 flowspec" }, \ { AFI_IPv6, AF_INET6, SAFI_FLOWSPEC, "IPv6 flowspec" }, \ + { AFI_L2VPN, AF_UNSPEC, SAFI_EVPN, "evpn" }, \ } #define BGP_MPLS_BOS 0x01 @@ -317,6 +323,7 @@ struct bgpd_config { uint16_t holdtime; uint16_t min_holdtime; uint16_t connectretry; + uint16_t staletime; uint8_t fib_priority; uint8_t filtered_in_locrib; }; @@ -404,6 +411,7 @@ struct capabilities { int16_t timeout; /* graceful restart timeout */ int8_t flags[AID_MAX]; /* graceful restart per AID flags */ int8_t restart; /* graceful restart, RFC 4724 */ + int8_t grnotification; /* graceful notification, RFC 8538 */ } grestart; int8_t mp[AID_MAX]; /* multiprotocol extensions, RFC 4760 */ int8_t add_path[AID_MAX]; /* ADD_PATH, RFC 7911 */ @@ -411,12 +419,14 @@ struct capabilities { int8_t as4byte; /* 4-byte ASnum, RFC 4893 */ int8_t enhanced_rr; /* enhanced route refresh, RFC 7313 */ int8_t policy; /* Open Policy, RFC 9234, 2 = enforce */ + int8_t ext_msg; /* Extended Msg, RFC8654 */ }; enum capa_codes { CAPA_NONE = 0, CAPA_MP = 1, CAPA_REFRESH = 2, + CAPA_EXT_MSG = 6, CAPA_ROLE = 9, CAPA_RESTART = 64, CAPA_AS4BYTE = 65, @@ -431,6 +441,7 @@ enum capa_codes { #define CAPA_GR_RESTARTING 0x08 #define CAPA_GR_TIMEMASK 0x0fff #define CAPA_GR_R_FLAG 0x8000 +#define CAPA_GR_N_FLAG 0x4000 #define CAPA_GR_F_FLAG 0x80 /* flags for RFC 7911 - enhanced router refresh */ @@ -474,6 +485,7 @@ struct peer_config { uint16_t max_out_prefix_restart; uint16_t holdtime; uint16_t min_holdtime; + uint16_t staletime; uint16_t local_short_as; uint16_t remote_port; uint8_t template; @@ -679,6 +691,7 @@ enum imsg_type { IMSG_SESSION_ADD, IMSG_SESSION_UP, IMSG_SESSION_DOWN, + IMSG_SESSION_DELETE, IMSG_SESSION_STALE, IMSG_SESSION_NOGRACE, IMSG_SESSION_FLUSH, @@ -1125,6 +1138,7 @@ struct ext_comm_pairs { { EXT_COMMUNITY_TRANS_IPV4, 0x0b, "vrfri" }, \ \ { EXT_COMMUNITY_TRANS_OPAQUE, 0x06, "ort" }, \ + { EXT_COMMUNITY_TRANS_OPAQUE, 0x0c, "encap" }, \ { EXT_COMMUNITY_TRANS_OPAQUE, 0x0d, "defgw" }, \ \ { EXT_COMMUNITY_NON_TRANS_OPAQUE, EXT_COMMUNITY_SUBTYPE_OVS, "ovs" }, \ @@ -1395,10 +1409,11 @@ enum mrt_state { struct mrt { char rib[PEER_DESCR_LEN]; - struct msgbuf wbuf; LIST_ENTRY(mrt) entry; + struct msgbuf *wbuf; uint32_t peer_id; uint32_t group_id; + int fd; enum mrt_type type; enum mrt_state state; uint16_t seqnum; @@ -1656,7 +1671,8 @@ static const char * const eventnames[] = { "OPEN message received", "KEEPALIVE message received", "UPDATE message received", - "NOTIFICATION received" + "NOTIFICATION received", + "graceful NOTIFICATION received", }; static const char * const errnames[] = { @@ -1757,6 +1773,7 @@ static const char * const timernames[] = { "IdleHoldResetTimer", "CarpUndemoteTimer", "RestartTimer", + "SessionDownTimer", "RTR RefreshTimer", "RTR RetryTimer", "RTR ExpireTimer", diff --git a/usr.sbin/bgpd/config.c b/usr.sbin/bgpd/config.c index 4821dea4a..872ae652b 100644 --- a/usr.sbin/bgpd/config.c +++ b/usr.sbin/bgpd/config.c @@ -1,4 +1,4 @@ -/* $OpenBSD: config.c,v 1.112 2024/10/01 11:49:24 claudio Exp $ */ +/* $OpenBSD: config.c,v 1.113 2024/12/13 19:21:03 claudio Exp $ */ /* * Copyright (c) 2003, 2004, 2005 Henning Brauer @@ -85,6 +85,7 @@ copy_config(struct bgpd_config *to, struct bgpd_config *from) to->short_as = from->short_as; to->holdtime = from->holdtime; to->min_holdtime = from->min_holdtime; + to->staletime = from->staletime; to->connectretry = from->connectretry; to->fib_priority = from->fib_priority; to->filtered_in_locrib = from->filtered_in_locrib; diff --git a/usr.sbin/bgpd/control.c b/usr.sbin/bgpd/control.c index 43ecd02bd..ae540565e 100644 --- a/usr.sbin/bgpd/control.c +++ b/usr.sbin/bgpd/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.120 2024/10/01 18:31:10 claudio Exp $ */ +/* $OpenBSD: control.c,v 1.132 2024/12/02 15:03:17 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -37,7 +37,6 @@ struct ctl_conn *control_connbyfd(int); struct ctl_conn *control_connbypid(pid_t); int control_close(struct ctl_conn *); void control_result(struct ctl_conn *, u_int); -ssize_t imsg_read_nofd(struct imsgbuf *); int control_check(char *path) @@ -147,7 +146,7 @@ control_fill_pfds(struct pollfd *pfd, size_t size) TAILQ_FOREACH(ctl_conn, &ctl_conns, entry) { pfd[i].fd = ctl_conn->imsgbuf.fd; pfd[i].events = POLLIN; - if (ctl_conn->imsgbuf.w.queued > 0) + if (imsgbuf_queuelen(&ctl_conn->imsgbuf) > 0) pfd[i].events |= POLLOUT; i++; } @@ -181,7 +180,14 @@ control_accept(int listenfd, int restricted) return (0); } - imsg_init(&ctl_conn->imsgbuf, connfd); + if (imsgbuf_init(&ctl_conn->imsgbuf, connfd) == -1 || + imsgbuf_set_maxsize(&ctl_conn->imsgbuf, MAX_BGPD_IMSGSIZE) == -1) { + log_warn("control_accept"); + imsgbuf_clear(&ctl_conn->imsgbuf); + close(connfd); + free(ctl_conn); + return (0); + } ctl_conn->restricted = restricted; TAILQ_INSERT_TAIL(&ctl_conns, ctl_conn, entry); @@ -221,7 +227,7 @@ control_close(struct ctl_conn *c) if (c->terminate && c->imsgbuf.pid) imsg_ctl_rde_msg(IMSG_CTL_TERMINATE, 0, c->imsgbuf.pid); - msgbuf_clear(&c->imsgbuf.w); + imsgbuf_clear(&c->imsgbuf); TAILQ_REMOVE(&ctl_conns, c, entry); close(c->imsgbuf.fd); @@ -249,9 +255,10 @@ control_dispatch_msg(struct pollfd *pfd, struct peer_head *peers) } if (pfd->revents & POLLOUT) { - if (msgbuf_write(&c->imsgbuf.w) <= 0 && errno != EAGAIN) + if (imsgbuf_write(&c->imsgbuf) == -1) return control_close(c); - if (c->throttled && c->imsgbuf.w.queued < CTL_MSG_LOW_MARK) { + if (c->throttled && + imsgbuf_queuelen(&c->imsgbuf) < CTL_MSG_LOW_MARK) { if (imsg_ctl_rde_msg(IMSG_XON, 0, c->imsgbuf.pid) != -1) c->throttled = 0; } @@ -260,8 +267,7 @@ control_dispatch_msg(struct pollfd *pfd, struct peer_head *peers) if (!(pfd->revents & POLLIN)) return (0); - if (((n = imsg_read_nofd(&c->imsgbuf)) == -1 && errno != EAGAIN) || - n == 0) + if (imsgbuf_read(&c->imsgbuf) != 1) return control_close(c); for (;;) { @@ -352,7 +358,7 @@ control_dispatch_msg(struct pollfd *pfd, struct peer_head *peers) } } } - if (!matched && RB_EMPTY(peers)) { + if (!matched && !RB_EMPTY(peers)) { control_result(c, CTL_RES_NOSUCHPEER); } else if (!neighbor.show_timers) { imsg_ctl_rde_msg(IMSG_CTL_END, 0, pid); @@ -382,7 +388,7 @@ control_dispatch_msg(struct pollfd *pfd, struct peer_head *peers) switch (type) { case IMSG_CTL_NEIGHBOR_UP: - bgp_fsm(p, EVNT_START); + bgp_fsm(p, EVNT_START, NULL); p->conf.down = 0; p->conf.reason[0] = '\0'; p->IdleHoldTime = @@ -473,7 +479,7 @@ control_dispatch_msg(struct pollfd *pfd, struct peer_head *peers) RB_FOREACH(p, peer_head, peers) if (peer_matched(p, &ribreq.neighbor)) break; - if (p == NULL && RB_EMPTY(peers)) { + if (p == NULL && !RB_EMPTY(peers)) { control_result(c, CTL_RES_NOSUCHPEER); break; } @@ -568,7 +574,7 @@ control_imsg_relay(struct imsg *imsg, struct peer *p) peer.stats.prefix_sent_eor = stats.prefix_sent_eor; peer.stats.pending_update = stats.pending_update; peer.stats.pending_withdraw = stats.pending_withdraw; - peer.stats.msg_queue_len = msgbuf_queuelen(&p->wbuf); + peer.stats.msg_queue_len = msgbuf_queuelen(p->wbuf); return imsg_compose(&c->imsgbuf, type, 0, pid, -1, &peer, sizeof(peer)); @@ -578,7 +584,8 @@ control_imsg_relay(struct imsg *imsg, struct peer *p) if (type == IMSG_CTL_END || type == IMSG_CTL_RESULT) c->terminate = 0; - if (!c->throttled && c->imsgbuf.w.queued > CTL_MSG_HIGH_MARK) { + if (!c->throttled && + imsgbuf_queuelen(&c->imsgbuf) > CTL_MSG_HIGH_MARK) { if (imsg_ctl_rde_msg(IMSG_XOFF, 0, pid) != -1) c->throttled = 1; } @@ -592,23 +599,3 @@ control_result(struct ctl_conn *c, u_int code) imsg_compose(&c->imsgbuf, IMSG_CTL_RESULT, 0, c->imsgbuf.pid, -1, &code, sizeof(code)); } - -/* This should go into libutil, from smtpd/mproc.c */ -ssize_t -imsg_read_nofd(struct imsgbuf *imsgbuf) -{ - ssize_t n; - char *buf; - size_t len; - - buf = imsgbuf->r.buf + imsgbuf->r.wpos; - len = sizeof(imsgbuf->r.buf) - imsgbuf->r.wpos; - - while ((n = recv(imsgbuf->fd, buf, len, 0)) == -1) { - if (errno != EINTR) - return (n); - } - - imsgbuf->r.wpos += n; - return (n); -} diff --git a/usr.sbin/bgpd/mrt.c b/usr.sbin/bgpd/mrt.c index 4e328d1a8..8886293dd 100644 --- a/usr.sbin/bgpd/mrt.c +++ b/usr.sbin/bgpd/mrt.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mrt.c,v 1.117 2024/05/22 08:41:14 claudio Exp $ */ +/* $OpenBSD: mrt.c,v 1.123 2024/12/16 16:10:10 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Claudio Jeker @@ -56,33 +56,27 @@ static int mrt_open(struct mrt *, time_t); ) static uint8_t -mrt_update_msg_guess_aid(uint8_t *pkg, uint16_t pkglen) +mrt_update_msg_guess_aid(struct ibuf *pkg) { + struct ibuf buf; uint16_t wlen, alen, len, afi; - uint8_t type, aid; + uint8_t type, flags, aid, safi; - pkg += MSGSIZE_HEADER; - pkglen -= MSGSIZE_HEADER; + ibuf_from_ibuf(&buf, pkg); - if (pkglen < 4) + if (ibuf_skip(&buf, MSGSIZE_HEADER) == -1 || + ibuf_get_n16(&buf, &wlen) == -1) goto bad; - memcpy(&wlen, pkg, 2); - wlen = ntohs(wlen); - pkg += 2; - pkglen -= 2; - if (wlen > 0) { /* UPDATE has withdraw routes, therefore IPv4 */ return AID_INET; } - memcpy(&alen, pkg, 2); - alen = ntohs(alen); - pkg += 2; - pkglen -= 2; + if (ibuf_get_n16(&buf, &alen) == -1) + goto bad; - if (alen < pkglen) { + if (alen < ibuf_size(&buf)) { /* UPDATE has NLRI prefixes, therefore IPv4 */ return AID_INET; } @@ -93,42 +87,37 @@ mrt_update_msg_guess_aid(uint8_t *pkg, uint16_t pkglen) } /* bad attribute length */ - if (alen > pkglen) + if (alen > ibuf_size(&buf)) goto bad; /* try to extract AFI/SAFI from the MP attributes */ - while (alen > 0) { - if (alen < 3) + while (ibuf_size(&buf) > 0) { + if (ibuf_get_n8(&buf, &flags) == -1 || + ibuf_get_n8(&buf, &type) == -1) goto bad; - type = pkg[1]; - if (pkg[0] & ATTR_EXTLEN) { - if (alen < 4) + if (flags & ATTR_EXTLEN) { + if (ibuf_get_n16(&buf, &len) == -1) goto bad; - memcpy(&len, pkg + 2, 2); - len = ntohs(len); - pkg += 4; - alen -= 4; } else { - len = pkg[2]; - pkg += 3; - alen -= 3; + uint8_t tmp; + if (ibuf_get_n8(&buf, &tmp) == -1) + goto bad; + len = tmp; } - if (len > alen) + if (len > ibuf_size(&buf)) goto bad; if (type == ATTR_MP_REACH_NLRI || type == ATTR_MP_UNREACH_NLRI) { - if (alen < 3) + if (ibuf_get_n16(&buf, &afi) == -1 || + ibuf_get_n8(&buf, &safi) == -1) goto bad; - memcpy(&afi, pkg, 2); - afi = ntohs(afi); - if (afi2aid(afi, pkg[2], &aid) == -1) + if (afi2aid(afi, safi, &aid) == -1) goto bad; return aid; } - - pkg += len; - alen -= len; + if (ibuf_skip(&buf, len) == -1) + goto bad; } bad: @@ -136,8 +125,8 @@ bad: } static uint16_t -mrt_bgp_msg_subtype(struct mrt *mrt, void *pkg, uint16_t pkglen, - struct peer *peer, enum msg_type msgtype, int in) +mrt_bgp_msg_subtype(struct mrt *mrt, struct ibuf *pkg, struct peer *peer, + enum msg_type msgtype, int in) { uint16_t subtype = BGP4MP_MESSAGE; uint8_t aid, mask; @@ -145,7 +134,7 @@ mrt_bgp_msg_subtype(struct mrt *mrt, void *pkg, uint16_t pkglen, if (peer->capa.neg.as4byte) subtype = BGP4MP_MESSAGE_AS4; - if (msgtype != UPDATE) + if (msgtype != MSG_UPDATE) return subtype; /* @@ -158,7 +147,7 @@ mrt_bgp_msg_subtype(struct mrt *mrt, void *pkg, uint16_t pkglen, mask = in ? CAPA_AP_RECV : CAPA_AP_SEND; /* only guess if add-path could be active */ if (peer->capa.neg.add_path[0] & mask) { - aid = mrt_update_msg_guess_aid(pkg, pkglen); + aid = mrt_update_msg_guess_aid(pkg); if (aid != AID_UNSPEC && (peer->capa.neg.add_path[aid] & mask)) { if (peer->capa.neg.as4byte) @@ -172,8 +161,8 @@ mrt_bgp_msg_subtype(struct mrt *mrt, void *pkg, uint16_t pkglen, } void -mrt_dump_bgp_msg(struct mrt *mrt, void *pkg, uint16_t pkglen, - struct peer *peer, enum msg_type msgtype) +mrt_dump_bgp_msg(struct mrt *mrt, struct ibuf *pkg, struct peer *peer, + enum msg_type msgtype) { struct ibuf *buf; int in = 0; @@ -183,16 +172,16 @@ mrt_dump_bgp_msg(struct mrt *mrt, void *pkg, uint16_t pkglen, if (mrt->type == MRT_ALL_IN || mrt->type == MRT_UPDATE_IN) in = 1; - subtype = mrt_bgp_msg_subtype(mrt, pkg, pkglen, peer, msgtype, in); + subtype = mrt_bgp_msg_subtype(mrt, pkg, peer, msgtype, in); if (mrt_dump_hdr_se(&buf, peer, MSG_PROTOCOL_BGP4MP_ET, subtype, - pkglen, in) == -1) + ibuf_size(pkg), in) == -1) goto fail; - if (ibuf_add(buf, pkg, pkglen) == -1) + if (ibuf_add_ibuf(buf, pkg) == -1) goto fail; - ibuf_close(&mrt->wbuf, buf); + ibuf_close(mrt->wbuf, buf); return; fail: @@ -219,7 +208,7 @@ mrt_dump_state(struct mrt *mrt, uint16_t old_state, uint16_t new_state, if (ibuf_add_n16(buf, new_state) == -1) goto fail; - ibuf_close(&mrt->wbuf, buf); + ibuf_close(mrt->wbuf, buf); return; fail: @@ -515,9 +504,9 @@ mrt_dump_entry_mp(struct mrt *mrt, struct prefix *p, uint16_t snum, len) == -1) goto fail; - ibuf_close(&mrt->wbuf, hbuf); - ibuf_close(&mrt->wbuf, h2buf); - ibuf_close(&mrt->wbuf, buf); + ibuf_close(mrt->wbuf, hbuf); + ibuf_close(mrt->wbuf, h2buf); + ibuf_close(mrt->wbuf, buf); return (len + MRT_HEADER_SIZE); @@ -608,8 +597,8 @@ mrt_dump_entry(struct mrt *mrt, struct prefix *p, uint16_t snum, if (ibuf_add_n16(hbuf, len) == -1) goto fail; - ibuf_close(&mrt->wbuf, hbuf); - ibuf_close(&mrt->wbuf, buf); + ibuf_close(mrt->wbuf, hbuf); + ibuf_close(mrt->wbuf, buf); return (len + MRT_HEADER_SIZE); @@ -680,7 +669,7 @@ mrt_dump_entry_v2_rib(struct rib_entry *re, struct ibuf **nb, struct ibuf **apb, goto fail; if (ibuf_add_n16(buf, ibuf_size(tbuf)) == -1) goto fail; - if (ibuf_add_buf(buf, tbuf) == -1) + if (ibuf_add_ibuf(buf, tbuf) == -1) goto fail; ibuf_free(tbuf); tbuf = NULL; @@ -750,13 +739,13 @@ mrt_dump_entry_v2(struct mrt *mrt, struct rib_entry *re, uint32_t snum) if (ibuf_add_n32(hbuf, snum) == -1) goto fail; - if (ibuf_add_buf(hbuf, pbuf) == -1) + if (ibuf_add_ibuf(hbuf, pbuf) == -1) goto fail; if (ibuf_add_n16(hbuf, nump) == -1) goto fail; - ibuf_close(&mrt->wbuf, hbuf); - ibuf_close(&mrt->wbuf, nbuf); + ibuf_close(mrt->wbuf, hbuf); + ibuf_close(mrt->wbuf, nbuf); hbuf = NULL; nbuf = NULL; } @@ -769,13 +758,13 @@ mrt_dump_entry_v2(struct mrt *mrt, struct rib_entry *re, uint32_t snum) if (ibuf_add_n32(hbuf, snum) == -1) goto fail; - if (ibuf_add_buf(hbuf, pbuf) == -1) + if (ibuf_add_ibuf(hbuf, pbuf) == -1) goto fail; if (ibuf_add_n16(hbuf, apnump) == -1) goto fail; - ibuf_close(&mrt->wbuf, hbuf); - ibuf_close(&mrt->wbuf, apbuf); + ibuf_close(mrt->wbuf, hbuf); + ibuf_close(mrt->wbuf, apbuf); hbuf = NULL; apbuf = NULL; } @@ -851,8 +840,8 @@ mrt_dump_v2_hdr(struct mrt *mrt, struct bgpd_config *conf) MRT_DUMP_V2_PEER_INDEX_TABLE, len) == -1) goto fail; - ibuf_close(&mrt->wbuf, hbuf); - ibuf_close(&mrt->wbuf, buf); + ibuf_close(mrt->wbuf, hbuf); + ibuf_close(mrt->wbuf, buf); return (0); fail: @@ -1110,9 +1099,7 @@ fail: void mrt_write(struct mrt *mrt) { - int r; - - if ((r = ibuf_write(&mrt->wbuf)) == -1 && errno != EAGAIN) { + if (ibuf_write(mrt->fd, mrt->wbuf) == -1) { log_warn("mrt dump aborted, mrt_write"); mrt_clean(mrt); mrt_done(mrt); @@ -1122,8 +1109,9 @@ mrt_write(struct mrt *mrt) void mrt_clean(struct mrt *mrt) { - close(mrt->wbuf.fd); - msgbuf_clear(&mrt->wbuf); + close(mrt->fd); + msgbuf_free(mrt->wbuf); + mrt->wbuf = NULL; } static struct imsgbuf *mrt_imsgbuf[2]; diff --git a/usr.sbin/bgpd/parse.y b/usr.sbin/bgpd/parse.y index 954bc5c88..98742b5e5 100644 --- a/usr.sbin/bgpd/parse.y +++ b/usr.sbin/bgpd/parse.y @@ -1,4 +1,4 @@ -/* $OpenBSD: parse.y,v 1.470 2024/10/09 10:01:29 claudio Exp $ */ +/* $OpenBSD: parse.y,v 1.474 2024/12/14 21:24:31 denis Exp $ */ /* * Copyright (c) 2002, 2003, 2004 Henning Brauer @@ -243,13 +243,13 @@ typedef struct { %token AS ROUTERID HOLDTIME YMIN LISTEN ON FIBUPDATE FIBPRIORITY RTABLE %token NONE UNICAST VPN RD EXPORT EXPORTTRGT IMPORTTRGT DEFAULTROUTE -%token RDE RIB EVALUATE IGNORE COMPARE RTR PORT MINVERSION +%token RDE RIB EVALUATE IGNORE COMPARE RTR PORT MINVERSION STALETIME %token GROUP NEIGHBOR NETWORK %token EBGP IBGP %token FLOWSPEC PROTO FLAGS FRAGMENT TOS LENGTH ICMPTYPE CODE %token LOCALAS REMOTEAS DESCR LOCALADDR MULTIHOP PASSIVE MAXPREFIX RESTART -%token ANNOUNCE REFRESH AS4BYTE CONNECTRETRY ENHANCED ADDPATH -%token SEND RECV PLUS POLICY ROLE +%token ANNOUNCE REFRESH AS4BYTE CONNECTRETRY ENHANCED ADDPATH EXTENDED +%token SEND RECV PLUS POLICY ROLE GRACEFUL NOTIFICATION %token DEMOTE ENFORCE NEIGHBORAS ASOVERRIDE REFLECTOR DEPEND DOWN %token DUMP IN OUT SOCKET RESTRICTED %token LOG TRANSPARENT FILTERED @@ -775,6 +775,14 @@ conf_main : AS as4number { } conf->min_holdtime = $3; } + | STALETIME NUMBER { + if ($2 < MIN_HOLDTIME || $2 > USHRT_MAX) { + yyerror("staletime must be between %u and %u", + MIN_HOLDTIME, USHRT_MAX); + YYERROR; + } + conf->staletime = $2; + } | LISTEN ON address { struct listen_addr *la; struct sockaddr *sa; @@ -1702,7 +1710,7 @@ l3vpnopts : RD STRING { | network ; -neighbor : { curpeer = new_peer(); } +neighbor : { curpeer = new_peer(); } NEIGHBOR addrspec { memcpy(&curpeer->conf.remote_addr, &$3.prefix, sizeof(curpeer->conf.remote_addr)); @@ -1776,7 +1784,7 @@ groupopts_l : /* empty */ | groupopts_l error '\n' ; -addpathextra : /* empty */ { $$ = 0; } +addpathextra : /* empty */ { $$ = 0; } | PLUS NUMBER { if ($2 < 1 || $2 > USHRT_MAX) { yyerror("additional paths must be between " @@ -1787,7 +1795,7 @@ addpathextra : /* empty */ { $$ = 0; } } ; -addpathmax : /* empty */ { $$ = 0; } +addpathmax : /* empty */ { $$ = 0; } | MAX NUMBER { if ($2 < 1 || $2 > USHRT_MAX) { yyerror("maximum additional paths must be " @@ -1913,6 +1921,14 @@ peeropts : REMOTEAS as4number { } curpeer->conf.min_holdtime = $3; } + | STALETIME NUMBER { + if ($2 < MIN_HOLDTIME || $2 > USHRT_MAX) { + yyerror("staletime must be between %u and %u", + MIN_HOLDTIME, USHRT_MAX); + YYERROR; + } + curpeer->conf.staletime = $2; + } | ANNOUNCE af safi enforce { uint8_t aid, safi; uint16_t afi; @@ -1944,6 +1960,9 @@ peeropts : REMOTEAS as4number { | ANNOUNCE RESTART yesnoenforce { curpeer->conf.capabilities.grestart.restart = $3; } + | ANNOUNCE GRACEFUL NOTIFICATION yesno { + curpeer->conf.capabilities.grestart.grnotification = $4; + } | ANNOUNCE AS4BYTE yesnoenforce { curpeer->conf.capabilities.as4byte = $3; } @@ -2011,6 +2030,9 @@ peeropts : REMOTEAS as4number { | ANNOUNCE POLICY yesnoenforce { curpeer->conf.capabilities.policy = $3; } + | ANNOUNCE EXTENDED yesnoenforce { + curpeer->conf.capabilities.ext_msg = $3; + } | ROLE STRING { if (strcmp($2, "provider") == 0) { curpeer->conf.role = ROLE_PROVIDER; @@ -2227,8 +2249,8 @@ safi : NONE { $$ = SAFI_NONE; } | FLOWSPEC { $$ = SAFI_FLOWSPEC; } ; -nettype : STATIC { $$ = 1; } - | CONNECTED { $$ = 0; } +nettype : STATIC { $$ = 1; } + | CONNECTED { $$ = 0; } ; authconf : TCP MD5SIG PASSWORD string { @@ -2968,7 +2990,7 @@ filter_elm : filter_prefix_h { } ; -prefixlenop : /* empty */ { memset(&$$, 0, sizeof($$)); } +prefixlenop : /* empty */ { memset(&$$, 0, sizeof($$)); } | LONGER { memset(&$$, 0, sizeof($$)); $$.op = OP_RANGE; @@ -3051,8 +3073,8 @@ filter_as_type : AS { $$ = AS_ALL; } | PEERAS { $$ = AS_PEER; } ; -filter_set : /* empty */ { $$ = NULL; } - | SET filter_set_opt { +filter_set : /* empty */ { $$ = NULL; } + | SET filter_set_opt { if (($$ = calloc(1, sizeof(struct filter_set_head))) == NULL) fatal(NULL); @@ -3142,7 +3164,7 @@ filter_set_opt : LOCALPREF NUMBER { $$->action.relative = $2; } } - | MED '+' NUMBER { + | MED '+' NUMBER { if ($3 < 0 || $3 > INT_MAX) { yyerror("bad metric +%lld", $3); YYERROR; @@ -3152,7 +3174,7 @@ filter_set_opt : LOCALPREF NUMBER { $$->type = ACTION_SET_RELATIVE_MED; $$->action.relative = $3; } - | MED '-' NUMBER { + | MED '-' NUMBER { if ($3 < 0 || $3 > INT_MAX) { yyerror("bad metric -%lld", $3); YYERROR; @@ -3177,7 +3199,7 @@ filter_set_opt : LOCALPREF NUMBER { $$->action.relative = $2; } } - | METRIC '+' NUMBER { + | METRIC '+' NUMBER { if ($3 < 0 || $3 > INT_MAX) { yyerror("bad metric +%lld", $3); YYERROR; @@ -3187,7 +3209,7 @@ filter_set_opt : LOCALPREF NUMBER { $$->type = ACTION_SET_RELATIVE_MED; $$->action.metric = $3; } - | METRIC '-' NUMBER { + | METRIC '-' NUMBER { if ($3 < 0 || $3 > INT_MAX) { yyerror("bad metric -%lld", $3); YYERROR; @@ -3197,7 +3219,7 @@ filter_set_opt : LOCALPREF NUMBER { $$->type = ACTION_SET_RELATIVE_MED; $$->action.relative = -$3; } - | WEIGHT NUMBER { + | WEIGHT NUMBER { if ($2 < -INT_MAX || $2 > UINT_MAX) { yyerror("bad weight %lld", $2); YYERROR; @@ -3212,7 +3234,7 @@ filter_set_opt : LOCALPREF NUMBER { $$->action.relative = $2; } } - | WEIGHT '+' NUMBER { + | WEIGHT '+' NUMBER { if ($3 < 0 || $3 > INT_MAX) { yyerror("bad weight +%lld", $3); YYERROR; @@ -3222,7 +3244,7 @@ filter_set_opt : LOCALPREF NUMBER { $$->type = ACTION_SET_RELATIVE_WEIGHT; $$->action.relative = $3; } - | WEIGHT '-' NUMBER { + | WEIGHT '-' NUMBER { if ($3 < 0 || $3 > INT_MAX) { yyerror("bad weight -%lld", $3); YYERROR; @@ -3500,144 +3522,148 @@ lookup(char *s) { /* this has to be sorted always */ static const struct keywords keywords[] = { - { "AS", AS}, - { "IPv4", IPV4}, - { "IPv6", IPV6}, - { "add-path", ADDPATH}, - { "ah", AH}, - { "allow", ALLOW}, - { "announce", ANNOUNCE}, - { "any", ANY}, + { "AS", AS }, + { "IPv4", IPV4 }, + { "IPv6", IPV6 }, + { "add-path", ADDPATH }, + { "ah", AH }, + { "allow", ALLOW }, + { "announce", ANNOUNCE }, + { "any", ANY }, { "as-4byte", AS4BYTE }, - { "as-override", ASOVERRIDE}, + { "as-override", ASOVERRIDE }, { "as-set", ASSET }, - { "aspa-set", ASPASET}, - { "avs", AVS}, - { "blackhole", BLACKHOLE}, - { "community", COMMUNITY}, - { "compare", COMPARE}, - { "connect-retry", CONNECTRETRY}, - { "connected", CONNECTED}, - { "customer-as", CUSTOMERAS}, - { "default-route", DEFAULTROUTE}, - { "delete", DELETE}, - { "demote", DEMOTE}, - { "deny", DENY}, - { "depend", DEPEND}, - { "descr", DESCR}, - { "down", DOWN}, - { "dump", DUMP}, - { "ebgp", EBGP}, - { "enforce", ENFORCE}, + { "aspa-set", ASPASET }, + { "avs", AVS }, + { "blackhole", BLACKHOLE }, + { "community", COMMUNITY }, + { "compare", COMPARE }, + { "connect-retry", CONNECTRETRY }, + { "connected", CONNECTED }, + { "customer-as", CUSTOMERAS }, + { "default-route", DEFAULTROUTE }, + { "delete", DELETE }, + { "demote", DEMOTE }, + { "deny", DENY }, + { "depend", DEPEND }, + { "descr", DESCR }, + { "down", DOWN }, + { "dump", DUMP }, + { "ebgp", EBGP }, + { "enforce", ENFORCE }, { "enhanced", ENHANCED }, - { "esp", ESP}, - { "evaluate", EVALUATE}, - { "expires", EXPIRES}, - { "export", EXPORT}, - { "export-target", EXPORTTRGT}, - { "ext-community", EXTCOMMUNITY}, - { "fib-priority", FIBPRIORITY}, - { "fib-update", FIBUPDATE}, - { "filtered", FILTERED}, - { "flags", FLAGS}, - { "flowspec", FLOWSPEC}, - { "fragment", FRAGMENT}, - { "from", FROM}, - { "group", GROUP}, - { "holdtime", HOLDTIME}, - { "ibgp", IBGP}, - { "ignore", IGNORE}, - { "ike", IKE}, - { "import-target", IMPORTTRGT}, - { "in", IN}, - { "include", INCLUDE}, - { "inet", IPV4}, - { "inet6", IPV6}, - { "ipsec", IPSEC}, - { "key", KEY}, - { "large-community", LARGECOMMUNITY}, - { "listen", LISTEN}, - { "local-address", LOCALADDR}, - { "local-as", LOCALAS}, - { "localpref", LOCALPREF}, - { "log", LOG}, - { "match", MATCH}, - { "max", MAX}, - { "max-as-len", MAXASLEN}, - { "max-as-seq", MAXASSEQ}, - { "max-communities", MAXCOMMUNITIES}, - { "max-ext-communities", MAXEXTCOMMUNITIES}, - { "max-large-communities", MAXLARGECOMMUNITIES}, - { "max-prefix", MAXPREFIX}, - { "maxlen", MAXLEN}, - { "md5sig", MD5SIG}, - { "med", MED}, - { "metric", METRIC}, - { "min", YMIN}, - { "min-version", MINVERSION}, - { "multihop", MULTIHOP}, - { "neighbor", NEIGHBOR}, - { "neighbor-as", NEIGHBORAS}, - { "network", NETWORK}, - { "nexthop", NEXTHOP}, - { "no-modify", NOMODIFY}, - { "none", NONE}, - { "on", ON}, - { "or-longer", LONGER}, - { "origin", ORIGIN}, - { "origin-set", ORIGINSET}, - { "out", OUT}, - { "ovs", OVS}, - { "passive", PASSIVE}, - { "password", PASSWORD}, - { "peer-as", PEERAS}, - { "pftable", PFTABLE}, - { "plus", PLUS}, - { "policy", POLICY}, - { "port", PORT}, - { "prefix", PREFIX}, - { "prefix-set", PREFIXSET}, - { "prefixlen", PREFIXLEN}, - { "prepend-neighbor", PREPEND_PEER}, - { "prepend-self", PREPEND_SELF}, - { "priority", PRIORITY}, - { "proto", PROTO}, - { "provider-as", PROVIDERAS}, - { "qualify", QUALIFY}, - { "quick", QUICK}, - { "rd", RD}, - { "rde", RDE}, - { "recv", RECV}, + { "esp", ESP }, + { "evaluate", EVALUATE }, + { "expires", EXPIRES }, + { "export", EXPORT }, + { "export-target", EXPORTTRGT }, + { "ext-community", EXTCOMMUNITY }, + { "extended", EXTENDED }, + { "fib-priority", FIBPRIORITY }, + { "fib-update", FIBUPDATE }, + { "filtered", FILTERED }, + { "flags", FLAGS }, + { "flowspec", FLOWSPEC }, + { "fragment", FRAGMENT }, + { "from", FROM }, + { "graceful", GRACEFUL }, + { "group", GROUP }, + { "holdtime", HOLDTIME }, + { "ibgp", IBGP }, + { "ignore", IGNORE }, + { "ike", IKE }, + { "import-target", IMPORTTRGT }, + { "in", IN }, + { "include", INCLUDE }, + { "inet", IPV4 }, + { "inet6", IPV6 }, + { "ipsec", IPSEC }, + { "key", KEY }, + { "large-community", LARGECOMMUNITY }, + { "listen", LISTEN }, + { "local-address", LOCALADDR }, + { "local-as", LOCALAS }, + { "localpref", LOCALPREF }, + { "log", LOG }, + { "match", MATCH }, + { "max", MAX }, + { "max-as-len", MAXASLEN }, + { "max-as-seq", MAXASSEQ }, + { "max-communities", MAXCOMMUNITIES }, + { "max-ext-communities", MAXEXTCOMMUNITIES }, + { "max-large-communities", MAXLARGECOMMUNITIES }, + { "max-prefix", MAXPREFIX }, + { "maxlen", MAXLEN }, + { "md5sig", MD5SIG }, + { "med", MED }, + { "metric", METRIC }, + { "min", YMIN }, + { "min-version", MINVERSION }, + { "multihop", MULTIHOP }, + { "neighbor", NEIGHBOR }, + { "neighbor-as", NEIGHBORAS }, + { "network", NETWORK }, + { "nexthop", NEXTHOP }, + { "no-modify", NOMODIFY }, + { "none", NONE }, + { "notification", NOTIFICATION }, + { "on", ON }, + { "or-longer", LONGER }, + { "origin", ORIGIN }, + { "origin-set", ORIGINSET }, + { "out", OUT }, + { "ovs", OVS }, + { "passive", PASSIVE }, + { "password", PASSWORD }, + { "peer-as", PEERAS }, + { "pftable", PFTABLE }, + { "plus", PLUS }, + { "policy", POLICY }, + { "port", PORT }, + { "prefix", PREFIX }, + { "prefix-set", PREFIXSET }, + { "prefixlen", PREFIXLEN }, + { "prepend-neighbor", PREPEND_PEER }, + { "prepend-self", PREPEND_SELF }, + { "priority", PRIORITY }, + { "proto", PROTO }, + { "provider-as", PROVIDERAS }, + { "qualify", QUALIFY }, + { "quick", QUICK }, + { "rd", RD }, + { "rde", RDE }, + { "recv", RECV }, { "refresh", REFRESH }, - { "reject", REJECT}, - { "remote-as", REMOTEAS}, - { "restart", RESTART}, - { "restricted", RESTRICTED}, - { "rib", RIB}, + { "reject", REJECT }, + { "remote-as", REMOTEAS }, + { "restart", RESTART }, + { "restricted", RESTRICTED }, + { "rib", RIB }, { "roa-set", ROASET }, - { "role", ROLE}, - { "route-reflector", REFLECTOR}, - { "router-id", ROUTERID}, - { "rtable", RTABLE}, - { "rtlabel", RTLABEL}, - { "rtr", RTR}, - { "self", SELF}, - { "send", SEND}, - { "set", SET}, + { "role", ROLE }, + { "route-reflector", REFLECTOR }, + { "router-id", ROUTERID }, + { "rtable", RTABLE }, + { "rtlabel", RTLABEL }, + { "rtr", RTR }, + { "self", SELF }, + { "send", SEND }, + { "set", SET }, { "socket", SOCKET }, - { "source-as", SOURCEAS}, - { "spi", SPI}, - { "static", STATIC}, - { "tcp", TCP}, - { "to", TO}, - { "tos", TOS}, - { "transit-as", TRANSITAS}, - { "transparent-as", TRANSPARENT}, - { "ttl-security", TTLSECURITY}, - { "unicast", UNICAST}, - { "via", VIA}, - { "vpn", VPN}, - { "weight", WEIGHT} + { "source-as", SOURCEAS }, + { "spi", SPI }, + { "staletime", STALETIME }, + { "static", STATIC }, + { "tcp", TCP }, + { "to", TO }, + { "tos", TOS }, + { "transit-as", TRANSITAS }, + { "transparent-as", TRANSPARENT }, + { "ttl-security", TTLSECURITY }, + { "unicast", UNICAST }, + { "via", VIA }, + { "vpn", VPN }, + { "weight", WEIGHT }, }; const struct keywords *p; @@ -4025,6 +4051,7 @@ init_config(struct bgpd_config *c) c->min_holdtime = MIN_HOLDTIME; c->holdtime = INTERVAL_HOLD; + c->staletime = INTERVAL_STALE; c->connectretry = INTERVAL_CONNECTRETRY; c->bgpid = get_bgpid(); c->fib_priority = kr_default_prio(); @@ -5537,7 +5564,7 @@ map_tos(char *s, int *val) { "lowdelay", IPTOS_LOWDELAY }, { "netcontrol", IPTOS_PREC_NETCONTROL }, { "reliability", IPTOS_RELIABILITY }, - { "throughput", IPTOS_THROUGHPUT } + { "throughput", IPTOS_THROUGHPUT }, }; const struct keywords *p; @@ -5887,7 +5914,7 @@ static const struct icmptypeent icmp_type[] = { { "mobregreq", ICMP_MOBILE_REGREQUEST }, { "mobregrep", ICMP_MOBILE_REGREPLY }, { "skip", ICMP_SKIP }, - { "photuris", ICMP_PHOTURIS } + { "photuris", ICMP_PHOTURIS }, }; static const struct icmptypeent icmp6_type[] = { @@ -5950,7 +5977,7 @@ static const struct icmpcodeent icmp_code[] = { { "badlen", ICMP_PARAMPROB, ICMP_PARAMPROB_LENGTH }, { "unknown-ind", ICMP_PHOTURIS, ICMP_PHOTURIS_UNKNOWN_INDEX }, { "auth-fail", ICMP_PHOTURIS, ICMP_PHOTURIS_AUTH_FAILED }, - { "decrypt-fail", ICMP_PHOTURIS, ICMP_PHOTURIS_DECRYPT_FAILED } + { "decrypt-fail", ICMP_PHOTURIS, ICMP_PHOTURIS_DECRYPT_FAILED }, }; static const struct icmpcodeent icmp6_code[] = { @@ -5964,7 +5991,7 @@ static const struct icmpcodeent icmp6_code[] = { { "badhead", ICMP6_PARAM_PROB, ICMP6_PARAMPROB_HEADER }, { "nxthdr", ICMP6_PARAM_PROB, ICMP6_PARAMPROB_NEXTHEADER }, { "redironlink", ND_REDIRECT, ND_REDIRECT_ONLINK }, - { "redirrouter", ND_REDIRECT, ND_REDIRECT_ROUTER } + { "redirrouter", ND_REDIRECT, ND_REDIRECT_ROUTER }, }; static int diff --git a/usr.sbin/bgpd/printconf.c b/usr.sbin/bgpd/printconf.c index a62311e7b..b3c4c5006 100644 --- a/usr.sbin/bgpd/printconf.c +++ b/usr.sbin/bgpd/printconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: printconf.c,v 1.176 2024/10/09 10:01:29 claudio Exp $ */ +/* $OpenBSD: printconf.c,v 1.178 2024/12/13 19:21:03 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -394,6 +394,8 @@ print_mainconf(struct bgpd_config *conf) printf("holdtime min %u\n", conf->min_holdtime); if (conf->connectretry != INTERVAL_CONNECTRETRY) printf("connect-retry %u\n", conf->connectretry); + if (conf->staletime != INTERVAL_STALE) + printf("staletime %u\n", conf->staletime); if (conf->flags & BGPD_FLAG_DECISION_ROUTEAGE) printf("rde route-age evaluate\n"); @@ -817,6 +819,8 @@ print_peer(struct peer *peer, struct bgpd_config *conf, const char *c) printf("%s\tholdtime %u\n", c, p->holdtime); if (p->min_holdtime) printf("%s\tholdtime min %u\n", c, p->min_holdtime); + if (p->staletime) + printf("%s\tstaletime %u\n", c, p->staletime); if (p->export_type == EXPORT_NONE) printf("%s\texport none\n", c); else if (p->export_type == EXPORT_DEFAULT_ROUTE) @@ -955,11 +959,20 @@ print_announce(struct peer_config *p, const char *c) else if (p->capabilities.grestart.restart == 0) printf("%s\tannounce restart no\n", c); + if (p->capabilities.grestart.restart != 0 && + p->capabilities.grestart.grnotification) + printf("%s\tannounce graceful notification yes\n", c); + if (p->capabilities.as4byte == 2) printf("%s\tannounce as4byte enforce\n", c); else if (p->capabilities.as4byte == 0) printf("%s\tannounce as4byte no\n", c); + if (p->capabilities.ext_msg == 2) + printf("%s\tannounce extended enforce\n", c); + else if (p->capabilities.ext_msg == 1) + printf("%s\tannounce extended yes\n", c); + if (p->capabilities.add_path[AID_MIN] & CAPA_AP_RECV_ENFORCE) printf("%s\tannounce add-path recv enforce\n", c); else if (p->capabilities.add_path[AID_MIN] & CAPA_AP_RECV) diff --git a/usr.sbin/bgpd/rde.c b/usr.sbin/bgpd/rde.c index 65d274461..a7a2378a2 100644 --- a/usr.sbin/bgpd/rde.c +++ b/usr.sbin/bgpd/rde.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rde.c,v 1.634 2024/09/25 14:46:51 claudio Exp $ */ +/* $OpenBSD: rde.c,v 1.647 2025/01/04 16:58:46 denis Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -201,7 +201,10 @@ rde_main(int debug, int verbose) if ((ibuf_main = malloc(sizeof(struct imsgbuf))) == NULL) fatal(NULL); - imsg_init(ibuf_main, 3); + if (imsgbuf_init(ibuf_main, 3) == -1 || + imsgbuf_set_maxsize(ibuf_main, MAX_BGPD_IMSGSIZE) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(ibuf_main); /* initialize the RIB structures */ if ((out_rules = calloc(1, sizeof(struct filter_head))) == NULL) @@ -245,19 +248,19 @@ rde_main(int debug, int verbose) if (i >= pfd_elms) fatalx("poll pfd too small"); - if (msgbuf_queuelen(&mctx->mrt.wbuf) > 0) { - pfd[i].fd = mctx->mrt.wbuf.fd; + if (msgbuf_queuelen(mctx->mrt.wbuf) > 0) { + pfd[i].fd = mctx->mrt.fd; pfd[i].events = POLLOUT; i++; } else if (mctx->mrt.state == MRT_STATE_REMOVE) { - close(mctx->mrt.wbuf.fd); + mrt_clean(&mctx->mrt); LIST_REMOVE(mctx, entry); free(mctx); rde_mrt_cnt--; } } - if (peer_imsg_pending() || rde_update_queue_pending() || + if (peer_work_pending() || rde_update_queue_pending() || nexthop_pending() || rib_dump_pending()) timeout = 0; @@ -274,7 +277,7 @@ rde_main(int debug, int verbose) if (handle_pollfd(&pfd[PFD_PIPE_SESSION], ibuf_se) == -1) { log_warnx("RDE: Lost connection to SE"); - msgbuf_clear(&ibuf_se->w); + imsgbuf_clear(ibuf_se); free(ibuf_se); ibuf_se = NULL; } else @@ -283,7 +286,7 @@ rde_main(int debug, int verbose) if (handle_pollfd(&pfd[PFD_PIPE_SESSION_CTL], ibuf_se_ctl) == -1) { log_warnx("RDE: Lost connection to SE control"); - msgbuf_clear(&ibuf_se_ctl->w); + imsgbuf_clear(ibuf_se_ctl); free(ibuf_se_ctl); ibuf_se_ctl = NULL; } else @@ -291,7 +294,7 @@ rde_main(int debug, int verbose) if (handle_pollfd(&pfd[PFD_PIPE_ROA], ibuf_rtr) == -1) { log_warnx("RDE: Lost connection to ROA"); - msgbuf_clear(&ibuf_rtr->w); + imsgbuf_clear(ibuf_rtr); free(ibuf_rtr); ibuf_rtr = NULL; } else @@ -299,16 +302,17 @@ rde_main(int debug, int verbose) for (j = PFD_PIPE_COUNT, mctx = LIST_FIRST(&rde_mrts); j < i && mctx != 0; j++) { - if (pfd[j].fd == mctx->mrt.wbuf.fd && + if (pfd[j].fd == mctx->mrt.fd && pfd[j].revents & POLLOUT) mrt_write(&mctx->mrt); mctx = LIST_NEXT(mctx, entry); } peer_foreach(rde_dispatch_imsg_peer, NULL); + peer_reaper(NULL); rib_dump_runner(); nexthop_runner(); - if (ibuf_se && ibuf_se->w.queued < SESS_MSG_HIGH_MARK) { + if (ibuf_se && imsgbuf_queuelen(ibuf_se) < SESS_MSG_HIGH_MARK) { for (aid = AID_MIN; aid < AID_MAX; aid++) rde_update_queue_runner(aid); } @@ -325,27 +329,26 @@ rde_main(int debug, int verbose) /* close pipes */ if (ibuf_se) { - msgbuf_clear(&ibuf_se->w); + imsgbuf_clear(ibuf_se); close(ibuf_se->fd); free(ibuf_se); } if (ibuf_se_ctl) { - msgbuf_clear(&ibuf_se_ctl->w); + imsgbuf_clear(ibuf_se_ctl); close(ibuf_se_ctl->fd); free(ibuf_se_ctl); } if (ibuf_rtr) { - msgbuf_clear(&ibuf_rtr->w); + imsgbuf_clear(ibuf_rtr); close(ibuf_rtr->fd); free(ibuf_rtr); } - msgbuf_clear(&ibuf_main->w); + imsgbuf_clear(ibuf_main); close(ibuf_main->fd); free(ibuf_main); while ((mctx = LIST_FIRST(&rde_mrts)) != NULL) { - msgbuf_clear(&mctx->mrt.wbuf); - close(mctx->mrt.wbuf.fd); + mrt_clean(&mctx->mrt); LIST_REMOVE(mctx, entry); free(mctx); } @@ -428,7 +431,13 @@ rde_dispatch_imsg_session(struct imsgbuf *imsgbuf) "IMSG_SESSION_DOWN", peerid); break; } - peer_down(peer, NULL); + peer_down(peer); + break; + case IMSG_SESSION_DELETE: + /* silently ignore deletes for unknown peers */ + if ((peer = peer_get(peerid)) == NULL) + break; + peer_delete(peer); break; case IMSG_SESSION_STALE: case IMSG_SESSION_NOGRACE: @@ -843,13 +852,15 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf) } if ((i = malloc(sizeof(struct imsgbuf))) == NULL) fatal(NULL); - imsg_init(i, fd); + if (imsgbuf_init(i, fd) == -1 || + imsgbuf_set_maxsize(i, MAX_BGPD_IMSGSIZE) == -1) + fatal(NULL); switch (imsg_get_type(&imsg)) { case IMSG_SOCKET_CONN: if (ibuf_se) { log_warnx("Unexpected imsg connection " "to SE received"); - msgbuf_clear(&ibuf_se->w); + imsgbuf_clear(ibuf_se); free(ibuf_se); } ibuf_se = i; @@ -858,7 +869,7 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf) if (ibuf_se_ctl) { log_warnx("Unexpected imsg ctl " "connection to SE received"); - msgbuf_clear(&ibuf_se_ctl->w); + imsgbuf_clear(ibuf_se_ctl); free(ibuf_se_ctl); } ibuf_se_ctl = i; @@ -867,7 +878,7 @@ rde_dispatch_imsg_parent(struct imsgbuf *imsgbuf) if (ibuf_rtr) { log_warnx("Unexpected imsg ctl " "connection to ROA received"); - msgbuf_clear(&ibuf_rtr->w); + imsgbuf_clear(ibuf_rtr); free(ibuf_rtr); } ibuf_rtr = i; @@ -1345,7 +1356,7 @@ rde_dispatch_imsg_peer(struct rde_peer *peer, void *bula) } switch (rr.subtype) { case ROUTE_REFRESH_REQUEST: - peer_dump(peer, rr.aid); + peer_blast(peer, rr.aid); break; case ROUTE_REFRESH_BEGIN_RR: /* check if graceful restart EOR was received */ @@ -1587,7 +1598,7 @@ rde_update_dispatch(struct rde_peer *peer, struct ibuf *buf) if (ibuf_skip(&unreachbuf, ibuf_size(&unreachbuf)) == -1) { log_peer_warnx(&peer->conf, - "bad VPNv6 withdraw prefix"); + "bad withdraw prefix"); rde_update_err(peer, ERR_UPDATE, ERR_UPD_OPTATTR, &unreachbuf); goto done; @@ -1767,7 +1778,7 @@ rde_update_dispatch(struct rde_peer *peer, struct ibuf *buf) if (ibuf_skip(&reachbuf, ibuf_size(&reachbuf)) == -1) { log_peer_warnx(&peer->conf, - "bad VPNv6 withdraw prefix"); + "bad nlri prefix"); rde_update_err(peer, ERR_UPDATE, ERR_UPD_OPTATTR, &reachbuf); goto done; @@ -3009,6 +3020,9 @@ rde_dump_ctx_new(struct ctl_show_rib_request *req, pid_t pid, return; } + if (strcmp(req->rib, "Adj-RIB-Out") == 0) + req->flags |= F_CTL_ADJ_OUT; + memcpy(&ctx->req, req, sizeof(struct ctl_show_rib_request)); ctx->req.pid = pid; ctx->req.type = type; @@ -3193,7 +3207,7 @@ rde_mrt_throttled(void *arg) { struct mrt *mrt = arg; - return (msgbuf_queuelen(&mrt->wbuf) > SESS_MSG_LOW_MARK); + return (msgbuf_queuelen(mrt->wbuf) > SESS_MSG_LOW_MARK); } static void @@ -3213,8 +3227,12 @@ rde_dump_mrt_new(struct mrt *mrt, pid_t pid, int fd) return; } memcpy(&ctx->mrt, mrt, sizeof(struct mrt)); - msgbuf_init(&ctx->mrt.wbuf); - ctx->mrt.wbuf.fd = fd; + if ((ctx->mrt.wbuf = msgbuf_new()) == NULL) { + log_warn("rde_dump_mrt_new"); + free(ctx); + return; + } + ctx->mrt.fd = fd; ctx->mrt.state = MRT_STATE_RUNNING; rid = rib_find(ctx->mrt.rib); if (rid == RIB_NOTFOUND) { @@ -3336,15 +3354,13 @@ rde_up_flush_upcall(struct prefix *p, void *ptr) prefix_adjout_withdraw(p); } -u_char queue_buf[4096]; - int rde_update_queue_pending(void) { struct rde_peer *peer; uint8_t aid; - if (ibuf_se && ibuf_se->w.queued >= SESS_MSG_HIGH_MARK) + if (ibuf_se && imsgbuf_queuelen(ibuf_se) >= SESS_MSG_HIGH_MARK) return 0; RB_FOREACH(peer, peer_tree, &peertable) { @@ -4672,7 +4688,7 @@ rde_shutdown(void) */ /* First all peers go down */ - peer_foreach(peer_down, NULL); + peer_shutdown(); /* free filters */ filterlist_free(out_rules); @@ -4687,7 +4703,6 @@ rde_shutdown(void) path_shutdown(); attr_shutdown(); pt_shutdown(); - peer_shutdown(); } struct rde_prefixset * diff --git a/usr.sbin/bgpd/rde.h b/usr.sbin/bgpd/rde.h index be9d2f2dc..3a6a867aa 100644 --- a/usr.sbin/bgpd/rde.h +++ b/usr.sbin/bgpd/rde.h @@ -1,4 +1,4 @@ -/* $OpenBSD: rde.h,v 1.306 2024/09/25 14:46:51 claudio Exp $ */ +/* $OpenBSD: rde.h,v 1.311 2025/01/07 17:43:31 denis Exp $ */ /* * Copyright (c) 2003, 2004 Claudio Jeker and @@ -143,6 +143,7 @@ enum attrtypes { ATTR_EXT_COMMUNITIES=16, ATTR_AS4_PATH=17, ATTR_AS4_AGGREGATOR=18, + ATTR_PMSI_TUNNEL=22, ATTR_LARGE_COMMUNITIES=32, ATTR_OTC=35, ATTR_FIRST_UNKNOWN, /* after this all attributes are unknown */ @@ -157,7 +158,7 @@ enum attrtypes { /* by default mask the reserved bits and the ext len bit */ #define ATTR_DEFMASK (ATTR_RESERVED | ATTR_EXTLEN) -/* default attribute flags for well known attributes */ +/* default attribute flags for well-known attributes */ #define ATTR_WELL_KNOWN ATTR_TRANSITIVE struct attr { @@ -289,7 +290,7 @@ struct prefix { #define PREFIX_FLAG_WITHDRAW 0x0001 /* enqueued on withdraw queue */ #define PREFIX_FLAG_UPDATE 0x0002 /* enqueued on update queue */ #define PREFIX_FLAG_DEAD 0x0004 /* locked but removed */ -#define PREFIX_FLAG_STALE 0x0008 /* stale entry (graceful reload) */ +#define PREFIX_FLAG_STALE 0x0008 /* stale entry (for addpath) */ #define PREFIX_FLAG_MASK 0x000f /* mask for the prefix types */ #define PREFIX_FLAG_ADJOUT 0x0010 /* prefix is in the adj-out rib */ #define PREFIX_FLAG_EOR 0x0020 /* prefix is EoR */ @@ -368,15 +369,18 @@ void rde_generate_updates(struct rib_entry *, struct prefix *, struct prefix *, enum eval_mode); void peer_up(struct rde_peer *, struct session_up *); -void peer_down(struct rde_peer *, void *); +void peer_down(struct rde_peer *); +void peer_delete(struct rde_peer *); void peer_flush(struct rde_peer *, uint8_t, time_t); void peer_stale(struct rde_peer *, uint8_t, int); +void peer_blast(struct rde_peer *, uint8_t); void peer_dump(struct rde_peer *, uint8_t); void peer_begin_rrefresh(struct rde_peer *, uint8_t); +int peer_work_pending(void); +void peer_reaper(struct rde_peer *); void peer_imsg_push(struct rde_peer *, struct imsg *); int peer_imsg_pop(struct rde_peer *, struct imsg *); -int peer_imsg_pending(void); void peer_imsg_flush(struct rde_peer *); static inline int @@ -601,6 +605,8 @@ void prefix_adjout_update(struct prefix *, struct rde_peer *, struct filterstate *, struct pt_entry *, uint32_t); void prefix_adjout_withdraw(struct prefix *); void prefix_adjout_destroy(struct prefix *); +void prefix_adjout_flush_pending(struct rde_peer *); +int prefix_adjout_reaper(struct rde_peer *); int prefix_dump_new(struct rde_peer *, uint8_t, unsigned int, void *, void (*)(struct prefix *, void *), void (*)(void *, uint8_t), int (*)(void *)); diff --git a/usr.sbin/bgpd/rde_peer.c b/usr.sbin/bgpd/rde_peer.c index 351c0b441..45bf85d51 100644 --- a/usr.sbin/bgpd/rde_peer.c +++ b/usr.sbin/bgpd/rde_peer.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rde_peer.c,v 1.38 2024/08/28 13:21:39 claudio Exp $ */ +/* $OpenBSD: rde_peer.c,v 1.43 2025/01/07 17:43:31 denis Exp $ */ /* * Copyright (c) 2019 Claudio Jeker @@ -26,12 +26,13 @@ #include "bgpd.h" #include "rde.h" -struct peer_tree peertable; +struct peer_tree peertable = RB_INITIALIZER(&peertable); +struct peer_tree zombietable = RB_INITIALIZER(&zombietable); struct rde_peer *peerself; static long imsg_pending; -CTASSERT(sizeof(peerself->recv_eor) * 8 > AID_MAX); -CTASSERT(sizeof(peerself->sent_eor) * 8 > AID_MAX); +CTASSERT(sizeof(peerself->recv_eor) * 8 >= AID_MAX); +CTASSERT(sizeof(peerself->sent_eor) * 8 >= AID_MAX); struct iq { SIMPLEQ_ENTRY(iq) entry; @@ -67,8 +68,6 @@ peer_init(struct filter_head *rules) { struct peer_config pc; - RB_INIT(&peertable); - memset(&pc, 0, sizeof(pc)); snprintf(pc.descr, sizeof(pc.descr), "LOCAL"); pc.id = PEER_ID_SELF; @@ -80,6 +79,14 @@ peer_init(struct filter_head *rules) void peer_shutdown(void) { + struct rde_peer *peer, *np; + + RB_FOREACH_SAFE(peer, peer_tree, &peertable, np) + peer_delete(peer); + + while (!RB_EMPTY(&zombietable)) + peer_reaper(NULL); + if (!RB_EMPTY(&peertable)) log_warnx("%s: free non-free table", __func__); } @@ -234,7 +241,8 @@ peer_generate_update(struct rde_peer *peer, struct rib_entry *re, /* skip ourself */ if (peer == peerself) return; - if (!peer_is_up(peer)) + /* skip peers that never had a session open */ + if (peer->state == PEER_NONE) return; /* skip peers using a different rib */ if (peer->loc_rib_id != re->rib_id) @@ -279,28 +287,6 @@ rde_generate_updates(struct rib_entry *re, struct prefix *newpath, /* * Various RIB walker callbacks. */ -static void -peer_adjout_clear_upcall(struct prefix *p, void *arg) -{ - prefix_adjout_destroy(p); -} - -static void -peer_adjout_stale_upcall(struct prefix *p, void *arg) -{ - if (p->flags & PREFIX_FLAG_DEAD) { - return; - } else if (p->flags & PREFIX_FLAG_WITHDRAW) { - /* no need to keep stale withdraws, they miss all attributes */ - prefix_adjout_destroy(p); - return; - } else if (p->flags & PREFIX_FLAG_UPDATE) { - RB_REMOVE(prefix_tree, &prefix_peer(p)->updates[p->pt->aid], p); - p->flags &= ~PREFIX_FLAG_UPDATE; - } - p->flags |= PREFIX_FLAG_STALE; -} - struct peer_flush { struct rde_peer *peer; time_t staletime; @@ -347,58 +333,6 @@ peer_flush_upcall(struct rib_entry *re, void *arg) } } -static void -rde_up_adjout_force_upcall(struct prefix *p, void *ptr) -{ - if (p->flags & PREFIX_FLAG_STALE) { - /* remove stale entries */ - prefix_adjout_destroy(p); - } else if (p->flags & PREFIX_FLAG_DEAD) { - /* ignore dead prefixes, they will go away soon */ - } else if ((p->flags & PREFIX_FLAG_MASK) == 0) { - /* put entries on the update queue if not allready on a queue */ - p->flags |= PREFIX_FLAG_UPDATE; - if (RB_INSERT(prefix_tree, &prefix_peer(p)->updates[p->pt->aid], - p) != NULL) - fatalx("%s: RB tree invariant violated", __func__); - } -} - -static void -rde_up_adjout_force_done(void *ptr, uint8_t aid) -{ - struct rde_peer *peer = ptr; - - /* Adj-RIB-Out ready, unthrottle peer and inject EOR */ - peer->throttled = 0; - if (peer->capa.grestart.restart) - prefix_add_eor(peer, aid); -} - -static void -rde_up_dump_upcall(struct rib_entry *re, void *ptr) -{ - struct rde_peer *peer = ptr; - struct prefix *p; - - if ((p = prefix_best(re)) == NULL) - /* no eligible prefix, not even for 'evaluate all' */ - return; - - peer_generate_update(peer, re, NULL, NULL, 0); -} - -static void -rde_up_dump_done(void *ptr, uint8_t aid) -{ - struct rde_peer *peer = ptr; - - /* force out all updates of Adj-RIB-Out for this peer */ - if (prefix_dump_new(peer, aid, 0, peer, rde_up_adjout_force_upcall, - rde_up_adjout_force_done, NULL) == -1) - fatal("%s: prefix_dump_new", __func__); -} - /* * Session got established, bring peer up, load RIBs do initial table dump. */ @@ -406,6 +340,7 @@ void peer_up(struct rde_peer *peer, struct session_up *sup) { uint8_t i; + int force_sync = 1; if (peer->state == PEER_ERR) { /* @@ -414,21 +349,33 @@ peer_up(struct rde_peer *peer, struct session_up *sup) */ rib_dump_terminate(peer); peer_imsg_flush(peer); - if (prefix_dump_new(peer, AID_UNSPEC, 0, NULL, - peer_adjout_clear_upcall, NULL, NULL) == -1) - fatal("%s: prefix_dump_new", __func__); peer_flush(peer, AID_UNSPEC, 0); peer->stats.prefix_cnt = 0; - peer->stats.prefix_out_cnt = 0; peer->state = PEER_DOWN; } - peer->remote_bgpid = sup->remote_bgpid; - peer->short_as = sup->short_as; + + /* + * Check if no value changed during flap to decide if the RIB + * is in sync. The capa check is maybe too strict but it should + * not matter for normal operation. + */ + if (memcmp(&peer->remote_addr, &sup->remote_addr, + sizeof(sup->remote_addr)) == 0 && + memcmp(&peer->local_v4_addr, &sup->local_v4_addr, + sizeof(sup->local_v4_addr)) == 0 && + memcmp(&peer->local_v6_addr, &sup->local_v6_addr, + sizeof(sup->local_v6_addr)) == 0 && + memcmp(&peer->capa, &sup->capa, sizeof(sup->capa)) == 0) + force_sync = 0; + peer->remote_addr = sup->remote_addr; peer->local_v4_addr = sup->local_v4_addr; peer->local_v6_addr = sup->local_v6_addr; + memcpy(&peer->capa, &sup->capa, sizeof(sup->capa)); + /* the Adj-RIB-Out does not depend on those */ + peer->remote_bgpid = sup->remote_bgpid; peer->local_if_scope = sup->if_scope; - memcpy(&peer->capa, &sup->capa, sizeof(peer->capa)); + peer->short_as = sup->short_as; /* clear eor markers depending on GR flags */ if (peer->capa.grestart.restart) { @@ -441,9 +388,16 @@ peer_up(struct rde_peer *peer, struct session_up *sup) } peer->state = PEER_UP; - for (i = AID_MIN; i < AID_MAX; i++) { - if (peer->capa.mp[i]) - peer_dump(peer, i); + if (!force_sync) { + for (i = AID_MIN; i < AID_MAX; i++) { + if (peer->capa.mp[i]) + peer_blast(peer, i); + } + } else { + for (i = AID_MIN; i < AID_MAX; i++) { + if (peer->capa.mp[i]) + peer_dump(peer, i); + } } } @@ -452,7 +406,7 @@ peer_up(struct rde_peer *peer, struct session_up *sup) * this peer and clean up. */ void -peer_down(struct rde_peer *peer, void *bula) +peer_down(struct rde_peer *peer) { peer->remote_bgpid = 0; peer->state = PEER_DOWN; @@ -461,23 +415,31 @@ peer_down(struct rde_peer *peer, void *bula) * and flush all pending imsg from the SE. */ rib_dump_terminate(peer); + prefix_adjout_flush_pending(peer); peer_imsg_flush(peer); - /* flush Adj-RIB-Out */ - if (prefix_dump_new(peer, AID_UNSPEC, 0, NULL, - peer_adjout_clear_upcall, NULL, NULL) == -1) - fatal("%s: prefix_dump_new", __func__); - /* flush Adj-RIB-In */ peer_flush(peer, AID_UNSPEC, 0); peer->stats.prefix_cnt = 0; - peer->stats.prefix_out_cnt = 0; +} + +void +peer_delete(struct rde_peer *peer) +{ + if (peer->state != PEER_DOWN) + peer_down(peer); /* free filters */ filterlist_free(peer->out_rules); RB_REMOVE(peer_tree, &peertable, peer); - free(peer); + while (RB_INSERT(peer_tree, &zombietable, peer) != NULL) { + log_warnx("zombie peer conflict"); + peer->conf.id = arc4random(); + } + + /* start reaping the zombie */ + peer_reaper(peer); } /* @@ -526,49 +488,112 @@ peer_stale(struct rde_peer *peer, uint8_t aid, int flushall) * and flush all pending imsg from the SE. */ rib_dump_terminate(peer); + prefix_adjout_flush_pending(peer); peer_imsg_flush(peer); if (flushall) peer_flush(peer, aid, 0); - /* XXX this is not quite correct */ - /* mark Adj-RIB-Out stale for this peer */ - if (prefix_dump_new(peer, aid, 0, NULL, - peer_adjout_stale_upcall, NULL, NULL) == -1) - fatal("%s: prefix_dump_new", __func__); - /* make sure new prefixes start on a higher timestamp */ while (now >= getmonotime()) sleep(1); } /* - * Load the Adj-RIB-Out of a peer normally called when a session is established. - * Once the Adj-RIB-Out is ready stale routes are removed from the Adj-RIB-Out - * and all routes are put on the update queue so they will be sent out. + * RIB walker callback for peer_blast. + * Enqueue a prefix onto the update queue so it can be sent out. + */ +static void +peer_blast_upcall(struct prefix *p, void *ptr) +{ + if (p->flags & PREFIX_FLAG_DEAD) { + /* ignore dead prefixes, they will go away soon */ + } else if ((p->flags & PREFIX_FLAG_MASK) == 0) { + /* put entries on the update queue if not already on a queue */ + p->flags |= PREFIX_FLAG_UPDATE; + if (RB_INSERT(prefix_tree, &prefix_peer(p)->updates[p->pt->aid], + p) != NULL) + fatalx("%s: RB tree invariant violated", __func__); + } +} + +/* + * Called after all prefixes are put onto the update queue and we are + * ready to blast out updates to the peer. + */ +static void +peer_blast_done(void *ptr, uint8_t aid) +{ + struct rde_peer *peer = ptr; + + /* Adj-RIB-Out ready, unthrottle peer and inject EOR */ + peer->throttled = 0; + if (peer->capa.grestart.restart) + prefix_add_eor(peer, aid); +} + +/* + * Send out the full Adj-RIB-Out by putting all prefixes onto the update + * queue. */ void -peer_dump(struct rde_peer *peer, uint8_t aid) +peer_blast(struct rde_peer *peer, uint8_t aid) { if (peer->capa.enhanced_rr && (peer->sent_eor & (1 << aid))) rde_peer_send_rrefresh(peer, aid, ROUTE_REFRESH_BEGIN_RR); + /* force out all updates from the Adj-RIB-Out */ + if (prefix_dump_new(peer, aid, 0, peer, peer_blast_upcall, + peer_blast_done, NULL) == -1) + fatal("%s: prefix_dump_new", __func__); +} + +/* RIB walker callbacks for peer_dump. */ +static void +peer_dump_upcall(struct rib_entry *re, void *ptr) +{ + struct rde_peer *peer = ptr; + struct prefix *p; + + if ((p = prefix_best(re)) == NULL) + /* no eligible prefix, not even for 'evaluate all' */ + return; + + peer_generate_update(peer, re, NULL, NULL, 0); +} + +static void +peer_dump_done(void *ptr, uint8_t aid) +{ + struct rde_peer *peer = ptr; + + /* Adj-RIB-Out is ready, blast it out */ + peer_blast(peer, aid); +} + +/* + * Load the Adj-RIB-Out of a peer normally called when a session comes up + * for the first time. Once the Adj-RIB-Out is ready it will blast the + * updates out. + */ +void +peer_dump(struct rde_peer *peer, uint8_t aid) +{ + /* throttle peer until dump is done */ + peer->throttled = 1; + if (peer->export_type == EXPORT_NONE) { - /* nothing to send apart from the marker */ - if (peer->capa.grestart.restart) - prefix_add_eor(peer, aid); + peer_blast(peer, aid); } else if (peer->export_type == EXPORT_DEFAULT_ROUTE) { up_generate_default(peer, aid); - rde_up_dump_done(peer, aid); + peer_blast(peer, aid); } else if (aid == AID_FLOWSPECv4 || aid == AID_FLOWSPECv6) { - prefix_flowspec_dump(aid, peer, rde_up_dump_upcall, - rde_up_dump_done); + prefix_flowspec_dump(aid, peer, peer_dump_upcall, + peer_dump_done); } else { if (rib_dump_new(peer->loc_rib_id, aid, RDE_RUNNER_ROUNDS, peer, - rde_up_dump_upcall, rde_up_dump_done, NULL) == -1) + peer_dump_upcall, peer_dump_done, NULL) == -1) fatal("%s: rib_dump_new", __func__); - /* throttle peer until dump is done */ - peer->throttled = 1; } } @@ -593,6 +618,33 @@ peer_begin_rrefresh(struct rde_peer *peer, uint8_t aid) sleep(1); } +void +peer_reaper(struct rde_peer *peer) +{ + if (peer == NULL) + peer = RB_ROOT(&zombietable); + if (peer == NULL) + return; + + if (!prefix_adjout_reaper(peer)) + return; + + RB_REMOVE(peer_tree, &zombietable, peer); + free(peer); +} + +/* + * Check if any imsg are pending or any zombie peers are around. + * Return 0 if no work is pending. + */ +int +peer_work_pending(void) +{ + if (!RB_EMPTY(&zombietable)) + return 1; + return imsg_pending != 0; +} + /* * move an imsg from src to dst, disconnecting any dynamic memory from src. */ @@ -640,15 +692,6 @@ peer_imsg_pop(struct rde_peer *peer, struct imsg *imsg) return 1; } -/* - * Check if any imsg are pending, return 0 if none are pending - */ -int -peer_imsg_pending(void) -{ - return imsg_pending != 0; -} - /* * flush all imsg queued for a peer. */ diff --git a/usr.sbin/bgpd/rde_prefix.c b/usr.sbin/bgpd/rde_prefix.c index d81300387..86a45333b 100644 --- a/usr.sbin/bgpd/rde_prefix.c +++ b/usr.sbin/bgpd/rde_prefix.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rde_prefix.c,v 1.52 2024/09/10 08:47:51 claudio Exp $ */ +/* $OpenBSD: rde_prefix.c,v 1.56 2024/12/30 17:14:02 denis Exp $ */ /* * Copyright (c) 2003, 2004 Claudio Jeker @@ -225,8 +225,6 @@ pt_fill(struct bgpd_addr *prefix, int prefixlen) pte_vpn4.prefixlen = prefixlen; pte_vpn4.rd = prefix->rd; pte_vpn4.labellen = prefix->labellen; - if (prefix->labellen == 0) - fatalx("pt_fill: no MPLS label in VPN addr"); memcpy(pte_vpn4.labelstack, prefix->labelstack, prefix->labellen); return ((struct pt_entry *)&pte_vpn4); @@ -236,13 +234,11 @@ pt_fill(struct bgpd_addr *prefix, int prefixlen) pte_vpn6.refcnt = UINT32_MAX; pte_vpn6.aid = prefix->aid; if (prefixlen > 128) - fatalx("pt_get: bad IPv6 prefixlen"); + fatalx("pt_fill: bad IPv6 prefixlen"); inet6applymask(&pte_vpn6.prefix6, &prefix->v6, prefixlen); pte_vpn6.prefixlen = prefixlen; pte_vpn6.rd = prefix->rd; pte_vpn6.labellen = prefix->labellen; - if (prefix->labellen == 0) - fatalx("pt_fill: no MPLS label in VPN addr"); memcpy(pte_vpn6.labelstack, prefix->labelstack, prefix->labellen); return ((struct pt_entry *)&pte_vpn6); @@ -568,13 +564,13 @@ pt_writebuf(struct ibuf *buf, struct pt_entry *pte, int withdraw, goto fail; break; default: - goto fail; + fatalx("%s: unknown aid %d", __func__, pte->aid); } /* keep 2 bytes reserved in the withdraw case for IPv4 encoding */ if (withdraw && ibuf_left(buf) < ibuf_size(tmp) + 2) goto fail; - if (ibuf_add_buf(buf, tmp) == -1) + if (ibuf_add_ibuf(buf, tmp) == -1) goto fail; ibuf_free(tmp); return 0; diff --git a/usr.sbin/bgpd/rde_rib.c b/usr.sbin/bgpd/rde_rib.c index d595a0e2f..3477d6864 100644 --- a/usr.sbin/bgpd/rde_rib.c +++ b/usr.sbin/bgpd/rde_rib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rde_rib.c,v 1.263 2024/08/14 19:09:51 claudio Exp $ */ +/* $OpenBSD: rde_rib.c,v 1.266 2024/12/12 20:19:03 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Claudio Jeker @@ -1273,7 +1273,6 @@ prefix_adjout_update(struct prefix *p, struct rde_peer *peer, /* nothing changed */ p->validation_state = state->vstate; p->lastchange = getmonotime(); - p->flags &= ~PREFIX_FLAG_STALE; return; } @@ -1321,10 +1320,12 @@ prefix_adjout_update(struct prefix *p, struct rde_peer *peer, if (p->flags & PREFIX_FLAG_MASK) fatalx("%s: bad flags %x", __func__, p->flags); - p->flags |= PREFIX_FLAG_UPDATE; - if (RB_INSERT(prefix_tree, &peer->updates[pte->aid], p) != NULL) - fatalx("%s: RB tree invariant violated", __func__); - peer->stats.pending_update++; + if (peer_is_up(peer)) { + p->flags |= PREFIX_FLAG_UPDATE; + if (RB_INSERT(prefix_tree, &peer->updates[pte->aid], p) != NULL) + fatalx("%s: RB tree invariant violated", __func__); + peer->stats.pending_update++; + } } /* @@ -1342,7 +1343,6 @@ prefix_adjout_withdraw(struct prefix *p) /* already a withdraw, shortcut */ if (p->flags & PREFIX_FLAG_WITHDRAW) { p->lastchange = getmonotime(); - p->flags &= ~PREFIX_FLAG_STALE; return; } /* pending update just got withdrawn */ @@ -1360,10 +1360,17 @@ prefix_adjout_withdraw(struct prefix *p) p->flags &= ~PREFIX_FLAG_MASK; p->lastchange = getmonotime(); - p->flags |= PREFIX_FLAG_WITHDRAW; - if (RB_INSERT(prefix_tree, &peer->withdraws[p->pt->aid], p) != NULL) - fatalx("%s: RB tree invariant violated", __func__); - peer->stats.pending_withdraw++; + if (peer_is_up(peer)) { + p->flags |= PREFIX_FLAG_WITHDRAW; + if (RB_INSERT(prefix_tree, &peer->withdraws[p->pt->aid], + p) != NULL) + fatalx("%s: RB tree invariant violated", __func__); + peer->stats.pending_withdraw++; + } else { + /* mark prefix dead to skip unlink on destroy */ + p->flags |= PREFIX_FLAG_DEAD; + prefix_adjout_destroy(p); + } } void @@ -1408,6 +1415,38 @@ prefix_adjout_destroy(struct prefix *p) } } +void +prefix_adjout_flush_pending(struct rde_peer *peer) +{ + struct prefix *p, *np; + uint8_t aid; + + for (aid = AID_MIN; aid < AID_MAX; aid++) { + RB_FOREACH_SAFE(p, prefix_tree, &peer->withdraws[aid], np) { + prefix_adjout_destroy(p); + } + RB_FOREACH_SAFE(p, prefix_tree, &peer->updates[aid], np) { + p->flags &= ~PREFIX_FLAG_UPDATE; + RB_REMOVE(prefix_tree, &peer->updates[aid], p); + peer->stats.pending_update--; + } + } +} + +int +prefix_adjout_reaper(struct rde_peer *peer) +{ + struct prefix *p, *np; + int count = RDE_REAPER_ROUNDS; + + RB_FOREACH_SAFE(p, prefix_index, &peer->adj_rib_out, np) { + prefix_adjout_destroy(p); + if (count-- <= 0) + return 0; + } + return 1; +} + static struct prefix * prefix_restart(struct rib_context *ctx) { diff --git a/usr.sbin/bgpd/rde_update.c b/usr.sbin/bgpd/rde_update.c index 7dd4cffc2..72a630d87 100644 --- a/usr.sbin/bgpd/rde_update.c +++ b/usr.sbin/bgpd/rde_update.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rde_update.c,v 1.169 2024/09/25 14:46:51 claudio Exp $ */ +/* $OpenBSD: rde_update.c,v 1.172 2025/01/07 12:11:45 claudio Exp $ */ /* * Copyright (c) 2004 Claudio Jeker @@ -90,7 +90,14 @@ up_test_update(struct rde_peer *peer, struct prefix *p) return (0); } - /* well known communities */ + /* + * With "transparent-as yes" set do not filter based on + * well-known communities. Instead pass them on to the client. + */ + if (peer->flags & PEERFLAG_TRANS_AS) + return (1); + + /* well-known communities */ if (community_match(comm, &comm_no_advertise, NULL)) return (0); if (peer->conf.ebgp) { @@ -159,8 +166,8 @@ up_process_prefix(struct rde_peer *peer, struct prefix *new, struct prefix *p) /* * up_test_update() needs to run before the output filters - * else the well known communities won't work properly. - * The output filters would not be able to add well known + * else the well-known communities won't work properly. + * The output filters would not be able to add well-known * communities. */ if (!up_test_update(peer, new)) @@ -988,11 +995,14 @@ struct ibuf * up_dump_withdraws(struct rde_peer *peer, uint8_t aid) { struct ibuf *buf; - size_t off; + size_t off, pkgsize = MAX_PKTSIZE; uint16_t afi, len; uint8_t safi; - if ((buf = ibuf_dynamic(4, 4096 - MSGSIZE_HEADER)) == NULL) + if (peer->capa.ext_msg) + pkgsize = MAX_EXT_PKTSIZE; + + if ((buf = ibuf_dynamic(4, pkgsize - MSGSIZE_HEADER)) == NULL) goto fail; /* reserve space for the withdrawn routes length field */ @@ -1136,14 +1146,17 @@ up_dump_update(struct rde_peer *peer, uint8_t aid) struct ibuf *buf; struct bgpd_addr addr; struct prefix *p; - size_t off; + size_t off, pkgsize = MAX_PKTSIZE; uint16_t len; p = RB_MIN(prefix_tree, &peer->updates[aid]); if (p == NULL) return NULL; - if ((buf = ibuf_dynamic(4, 4096 - MSGSIZE_HEADER)) == NULL) + if (peer->capa.ext_msg) + pkgsize = MAX_EXT_PKTSIZE; + + if ((buf = ibuf_dynamic(4, pkgsize - MSGSIZE_HEADER)) == NULL) goto fail; /* withdrawn routes length field is 0 */ diff --git a/usr.sbin/bgpd/rtr.c b/usr.sbin/bgpd/rtr.c index 630c42396..4094313ca 100644 --- a/usr.sbin/bgpd/rtr.c +++ b/usr.sbin/bgpd/rtr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtr.c,v 1.24 2024/10/08 12:28:09 claudio Exp $ */ +/* $OpenBSD: rtr.c,v 1.29 2024/12/02 15:13:57 claudio Exp $ */ /* * Copyright (c) 2020 Claudio Jeker @@ -219,7 +219,10 @@ rtr_main(int debug, int verbose) if ((ibuf_main = malloc(sizeof(struct imsgbuf))) == NULL) fatal(NULL); - imsg_init(ibuf_main, 3); + if (imsgbuf_init(ibuf_main, 3) == -1 || + imsgbuf_set_maxsize(ibuf_main, MAX_BGPD_IMSGSIZE) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(ibuf_main); conf = new_config(); log_info("rtr engine ready"); @@ -264,7 +267,7 @@ rtr_main(int debug, int verbose) if (handle_pollfd(&pfd[PFD_PIPE_RDE], ibuf_rde) == -1) { log_warnx("RTR: Lost connection to RDE"); - msgbuf_clear(&ibuf_rde->w); + imsgbuf_clear(ibuf_rde); free(ibuf_rde); ibuf_rde = NULL; } else @@ -290,11 +293,11 @@ rtr_main(int debug, int verbose) /* close pipes */ if (ibuf_rde) { - msgbuf_clear(&ibuf_rde->w); + imsgbuf_clear(ibuf_rde); close(ibuf_rde->fd); free(ibuf_rde); } - msgbuf_clear(&ibuf_main->w); + imsgbuf_clear(ibuf_main); close(ibuf_main->fd); free(ibuf_main); @@ -331,12 +334,15 @@ rtr_dispatch_imsg_parent(struct imsgbuf *imsgbuf) if (ibuf_rde) { log_warnx("Unexpected imsg ctl " "connection to RDE received"); - msgbuf_clear(&ibuf_rde->w); + imsgbuf_clear(ibuf_rde); free(ibuf_rde); } if ((ibuf_rde = malloc(sizeof(struct imsgbuf))) == NULL) fatal(NULL); - imsg_init(ibuf_rde, fd); + if (imsgbuf_init(ibuf_rde, fd) == -1 || + imsgbuf_set_maxsize(ibuf_rde, MAX_BGPD_IMSGSIZE) == + -1) + fatal(NULL); break; case IMSG_SOCKET_SETUP: if ((fd = imsg_get_fd(&imsg)) == -1) { @@ -533,14 +539,6 @@ rtr_recalc(void) RB_FOREACH_REVERSE(aspa, aspa_tree, &at) { struct aspa_set as = { .as = aspa->as, .num = aspa->num }; - /* XXX prevent oversized IMSG for now */ - if (aspa->num * sizeof(*aspa->tas) > - MAX_IMSGSIZE - IMSG_HEADER_SIZE) { - log_warnx("oversized ASPA set for customer-as %s, %s", - log_as(aspa->as), "dropped"); - continue; - } - imsg_compose(ibuf_rde, IMSG_RECONF_ASPA, 0, 0, -1, &as, offsetof(struct aspa_set, tas)); imsg_compose(ibuf_rde, IMSG_RECONF_ASPA_TAS, 0, 0, -1, diff --git a/usr.sbin/bgpd/rtr_proto.c b/usr.sbin/bgpd/rtr_proto.c index f69806459..431a1e031 100644 --- a/usr.sbin/bgpd/rtr_proto.c +++ b/usr.sbin/bgpd/rtr_proto.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtr_proto.c,v 1.41 2024/10/08 12:28:09 claudio Exp $ */ +/* $OpenBSD: rtr_proto.c,v 1.47 2024/11/26 13:59:54 claudio Exp $ */ /* * Copyright (c) 2020 Claudio Jeker @@ -189,9 +189,8 @@ struct rtr_session { char descr[PEER_DESCR_LEN]; struct roa_tree roa_set; struct aspa_tree aspa; - struct ibuf_read r; - struct msgbuf w; struct timer_head timers; + struct msgbuf *w; uint32_t id; /* rtr_config id */ uint32_t serial; uint32_t refresh; @@ -360,7 +359,7 @@ rtr_send_error(struct rtr_session *rs, struct ibuf *pdu, enum rtr_error err, goto fail; if (ibuf_add(buf, rs->last_sent_msg, mlen) == -1) goto fail; - ibuf_close(&rs->w, buf); + ibuf_close(rs->w, buf); rtr_fsm(rs, RTR_EVNT_SEND_ERROR); return; @@ -378,7 +377,7 @@ rtr_send_reset_query(struct rtr_session *rs) buf = rtr_newmsg(rs, RESET_QUERY, 0, 0); if (buf == NULL) goto fail; - ibuf_close(&rs->w, buf); + ibuf_close(rs->w, buf); return; fail: @@ -397,7 +396,7 @@ rtr_send_serial_query(struct rtr_session *rs) goto fail; if (ibuf_add_n32(buf, rs->serial) == -1) goto fail; - ibuf_close(&rs->w, buf); + ibuf_close(rs->w, buf); return; fail: @@ -424,30 +423,54 @@ rtr_check_session_id(struct rtr_session *rs, uint16_t session_id, } /* - * Parse the common rtr header (first 8 bytes) including the - * included length field. - * Returns -1 on failure. On success msgtype and msglen are set - * and the function return 0. + * Callback for ibuf_read to get the size of a PDU. */ -static int -rtr_parse_header(struct rtr_session *rs, struct ibuf *hdr, - size_t *msglen, enum rtr_pdu_type *msgtype) +static struct ibuf * +rtr_reader_callback(struct ibuf *hdr, void *arg, int *fd) { + struct rtr_session *rs = arg; struct rtr_header rh; - size_t len; - uint16_t errcode; + struct ibuf *b; + ssize_t len; if (ibuf_get(hdr, &rh, sizeof(rh)) == -1) - fatal("%s: ibuf_get", __func__); + return NULL; len = ntohl(rh.length); if (len > RTR_MAX_PDU_SIZE) { rtr_send_error(rs, hdr, CORRUPT_DATA, "%s: too big: %zu bytes", log_rtr_type(rh.type), len); - return -1; + errno = ERANGE; + return NULL; } + if ((b = ibuf_open(len)) == NULL) + return NULL; + return b; +} + +/* + * Parse the common rtr header (first 8 bytes) including the + * included length field. + * Returns -1 on failure. On success msgtype and msglen are set + * and the function return 0. + */ +static int +rtr_parse_header(struct rtr_session *rs, struct ibuf *msg, + enum rtr_pdu_type *msgtype) +{ + struct rtr_header rh; + struct ibuf hdr; + size_t len; + uint16_t errcode; + + len = ibuf_size(msg); + + ibuf_from_ibuf(&hdr, msg); + if (ibuf_get(&hdr, &rh, sizeof(rh)) == -1) + fatal("%s: ibuf_get", __func__); + if (rs->state == RTR_STATE_NEGOTIATION) { switch (rh.type) { case CACHE_RESPONSE: @@ -473,7 +496,7 @@ rtr_parse_header(struct rtr_session *rs, struct ibuf *hdr, /* ignore SERIAL_NOTIFY */ break; default: - rtr_send_error(rs, hdr, CORRUPT_DATA, + rtr_send_error(rs, msg, CORRUPT_DATA, "%s: out of context", log_rtr_type(rh.type)); return -1; } @@ -528,23 +551,22 @@ rtr_parse_header(struct rtr_session *rs, struct ibuf *hdr, goto badlen; break; default: - rtr_send_error(rs, hdr, UNSUPP_PDU_TYPE, "type %s", + rtr_send_error(rs, msg, UNSUPP_PDU_TYPE, "type %s", log_rtr_type(rh.type)); return -1; } - *msglen = len; *msgtype = rh.type; return 0; badlen: - rtr_send_error(rs, hdr, CORRUPT_DATA, "%s: bad length: %zu bytes", + rtr_send_error(rs, msg, CORRUPT_DATA, "%s: bad length: %zu bytes", log_rtr_type(rh.type), len); return -1; badversion: - rtr_send_error(rs, hdr, UNEXP_PROTOCOL_VERS, "%s: version %d", + rtr_send_error(rs, msg, UNEXP_PROTOCOL_VERS, "%s: version %d", log_rtr_type(rh.type), rh.version); return -1; } @@ -1019,76 +1041,58 @@ rtr_parse_error(struct rtr_session *rs, struct ibuf *pdu) * a retry will be done. */ static void -rtr_process_msg(struct rtr_session *rs) +rtr_process_msg(struct rtr_session *rs, struct ibuf *msg) { - struct ibuf rbuf, hdr, msg; - size_t msglen; enum rtr_pdu_type msgtype; - ibuf_from_buffer(&rbuf, rs->r.buf, rs->r.wpos); + /* parse and check header */ + if (rtr_parse_header(rs, msg, &msgtype) == -1) + return; - for (;;) { - if (ibuf_size(&rbuf) < sizeof(struct rtr_header)) - break; - - /* parse header */ - ibuf_from_buffer(&hdr, ibuf_data(&rbuf), - sizeof(struct rtr_header)); - if (rtr_parse_header(rs, &hdr, &msglen, &msgtype) == -1) + switch (msgtype) { + case SERIAL_NOTIFY: + if (rtr_parse_notify(rs, msg) == -1) return; - - /* extract message */ - if (ibuf_get_ibuf(&rbuf, msglen, &msg) == -1) - break; - - switch (msgtype) { - case SERIAL_NOTIFY: - if (rtr_parse_notify(rs, &msg) == -1) - return; - break; - case CACHE_RESPONSE: - if (rtr_parse_cache_response(rs, &msg) == -1) - return; - break; - case IPV4_PREFIX: - if (rtr_parse_ipv4_prefix(rs, &msg) == -1) - return; - break; - case IPV6_PREFIX: - if (rtr_parse_ipv6_prefix(rs, &msg) == -1) - return; - break; - case END_OF_DATA: - if (rtr_parse_end_of_data(rs, &msg) == -1) - return; - break; - case CACHE_RESET: - if (rtr_parse_cache_reset(rs, &msg) == -1) - return; - break; - case ROUTER_KEY: - /* silently ignore router key */ - break; - case ERROR_REPORT: - if (rtr_parse_error(rs, &msg) == -1) { - /* no need to send back an error */ - return; - } - break; - case ASPA: - if (rtr_parse_aspa(rs, &msg) == -1) - return; - break; - default: - /* unreachable, checked in rtr_parse_header() */ - rtr_send_error(rs, &msg, UNSUPP_PDU_TYPE, "type %s", - log_rtr_type(msgtype)); + break; + case CACHE_RESPONSE: + if (rtr_parse_cache_response(rs, msg) == -1) + return; + break; + case IPV4_PREFIX: + if (rtr_parse_ipv4_prefix(rs, msg) == -1) + return; + break; + case IPV6_PREFIX: + if (rtr_parse_ipv6_prefix(rs, msg) == -1) + return; + break; + case END_OF_DATA: + if (rtr_parse_end_of_data(rs, msg) == -1) + return; + break; + case CACHE_RESET: + if (rtr_parse_cache_reset(rs, msg) == -1) + return; + break; + case ROUTER_KEY: + /* silently ignore router key */ + break; + case ERROR_REPORT: + if (rtr_parse_error(rs, msg) == -1) { + /* no need to send back an error */ return; } + break; + case ASPA: + if (rtr_parse_aspa(rs, msg) == -1) + return; + break; + default: + /* unreachable, checked in rtr_parse_header() */ + rtr_send_error(rs, msg, UNSUPP_PDU_TYPE, "type %s", + log_rtr_type(msgtype)); + return; } - - memmove(&rs->r.buf, ibuf_data(&rbuf), ibuf_size(&rbuf)); - rs->r.wpos = ibuf_size(&rbuf); } /* @@ -1126,8 +1130,7 @@ rtr_fsm(struct rtr_session *rs, enum rtr_event event) case RTR_EVNT_CON_CLOSE: if (rs->fd != -1) { /* flush buffers */ - msgbuf_clear(&rs->w); - rs->r.wpos = 0; + msgbuf_clear(rs->w); close(rs->fd); rs->fd = -1; rtr_imsg_compose(IMSG_SOCKET_TEARDOWN, rs->id, 0, @@ -1240,8 +1243,6 @@ rtr_fsm(struct rtr_session *rs, enum rtr_event event) rtr_reset_cache(rs); rtr_recalc(); rs->state = RTR_STATE_ERROR; - /* flush receive buffer */ - rs->r.wpos = 0; break; case RTR_EVNT_NEGOTIATION_DONE: rs->state = RTR_STATE_ESTABLISHED; @@ -1259,8 +1260,7 @@ rtr_fsm(struct rtr_session *rs, enum rtr_event event) static void rtr_dispatch_msg(struct pollfd *pfd, struct rtr_session *rs) { - ssize_t n; - int error; + struct ibuf *b; if (pfd->revents & POLLHUP) { log_warnx("rtr %s: Connection closed, hangup", log_rtr(rs)); @@ -1272,38 +1272,35 @@ rtr_dispatch_msg(struct pollfd *pfd, struct rtr_session *rs) rtr_fsm(rs, RTR_EVNT_CON_CLOSE); return; } - if (pfd->revents & POLLOUT && msgbuf_queuelen(&rs->w) > 0) { - if ((error = ibuf_write(&rs->w)) == -1) { - if (errno != EAGAIN) { - log_warn("rtr %s: write error", log_rtr(rs)); - rtr_fsm(rs, RTR_EVNT_CON_CLOSE); - } - } - if (error == 0) + if (pfd->revents & POLLOUT && msgbuf_queuelen(rs->w) > 0) { + if (ibuf_write(rs->fd, rs->w) == -1) { + log_warn("rtr %s: write error", log_rtr(rs)); rtr_fsm(rs, RTR_EVNT_CON_CLOSE); + return; + } if (rs->state == RTR_STATE_ERROR && - msgbuf_queuelen(&rs->w) == 0) + msgbuf_queuelen(rs->w) == 0) rtr_fsm(rs, RTR_EVNT_CON_CLOSE); } if (pfd->revents & POLLIN) { - if ((n = read(rs->fd, rs->r.buf + rs->r.wpos, - sizeof(rs->r.buf) - rs->r.wpos)) == -1) { - if (errno != EINTR && errno != EAGAIN) { - log_warn("rtr %s: read error", log_rtr(rs)); - rtr_fsm(rs, RTR_EVNT_CON_CLOSE); - } + switch (ibuf_read(rs->fd, rs->w)) { + case -1: + /* if already in error state, ignore */ + if (rs->state == RTR_STATE_ERROR) + return; + log_warn("rtr %s: read error", log_rtr(rs)); + rtr_fsm(rs, RTR_EVNT_CON_CLOSE); return; - } - if (n == 0) { + case 0: rtr_fsm(rs, RTR_EVNT_CON_CLOSE); return; } - rs->r.wpos += n; - /* new data arrived, try to process it */ - rtr_process_msg(rs); + while ((b = msgbuf_get(rs->w)) != NULL) { + rtr_process_msg(rs, b); + ibuf_free(b); + } } - } void @@ -1388,7 +1385,7 @@ rtr_poll_events(struct pollfd *pfds, size_t npfds, time_t *timeout) pfd->fd = rs->fd; pfd->events = 0; - if (msgbuf_queuelen(&rs->w) > 0) + if (msgbuf_queuelen(rs->w) > 0) pfd->events |= POLLOUT; if (rs->state >= RTR_STATE_ESTABLISHED) pfd->events |= POLLIN; @@ -1404,11 +1401,13 @@ rtr_new(uint32_t id, struct rtr_config_msg *conf) if ((rs = calloc(1, sizeof(*rs))) == NULL) fatal("RTR session %s", conf->descr); + if ((rs->w = msgbuf_new_reader(sizeof(struct rtr_header), + rtr_reader_callback, rs)) == NULL) + fatal("RTR session %s", conf->descr); RB_INIT(&rs->roa_set); RB_INIT(&rs->aspa); TAILQ_INIT(&rs->timers); - msgbuf_init(&rs->w); strlcpy(rs->descr, conf->descr, sizeof(rs->descr)); rs->id = id; @@ -1455,6 +1454,7 @@ rtr_free(struct rtr_session *rs) rtr_reset_cache(rs); rtr_fsm(rs, RTR_EVNT_CON_CLOSE); timer_remove_all(&rs->timers); + msgbuf_free(rs->w); free(rs); } @@ -1472,7 +1472,7 @@ rtr_open(struct rtr_session *rs, int fd) rs->prev_version = rtr_max_session_version(rs); } - rs->fd = rs->w.fd = fd; + rs->fd = fd; rtr_fsm(rs, RTR_EVNT_CON_OPEN); } diff --git a/usr.sbin/bgpd/session.c b/usr.sbin/bgpd/session.c index b62f6fc67..dbe8d4074 100644 --- a/usr.sbin/bgpd/session.c +++ b/usr.sbin/bgpd/session.c @@ -1,4 +1,4 @@ -/* $OpenBSD: session.c,v 1.484 2024/10/01 18:29:34 claudio Exp $ */ +/* $OpenBSD: session.c,v 1.506 2025/01/03 12:57:49 claudio Exp $ */ /* * Copyright (c) 2003, 2004, 2005 Henning Brauer @@ -69,8 +69,8 @@ void session_tcp_established(struct peer *); int session_capa_add(struct ibuf *, uint8_t, uint8_t); int session_capa_add_mp(struct ibuf *, uint8_t); int session_capa_add_afi(struct ibuf *, uint8_t, uint8_t); -struct bgp_msg *session_newmsg(enum msg_type, uint16_t); -int session_sendmsg(struct bgp_msg *, struct peer *); +struct ibuf *session_newmsg(enum msg_type, uint16_t); +void session_sendmsg(struct ibuf *, struct peer *, enum msg_type); void session_open(struct peer *); void session_keepalive(struct peer *); void session_update(uint32_t, struct ibuf *); @@ -82,11 +82,11 @@ int session_graceful_restart(struct peer *); int session_graceful_stop(struct peer *); int session_dispatch_msg(struct pollfd *, struct peer *); void session_process_msg(struct peer *); -int parse_header(struct peer *, u_char *, uint16_t *, uint8_t *); -int parse_open(struct peer *); -int parse_update(struct peer *); -int parse_rrefresh(struct peer *); -void parse_notification(struct peer *); +struct ibuf *parse_header(struct ibuf *, void *, int *); +int parse_open(struct peer *, struct ibuf *); +int parse_update(struct peer *, struct ibuf *); +int parse_rrefresh(struct peer *, struct ibuf *); +void parse_notification(struct peer *, struct ibuf *); int parse_capabilities(struct peer *, struct ibuf *, uint32_t *); int capa_neg_calc(struct peer *); void session_dispatch_imsg(struct imsgbuf *, int, u_int *); @@ -240,7 +240,10 @@ session_main(int debug, int verbose) if ((ibuf_main = malloc(sizeof(struct imsgbuf))) == NULL) fatal(NULL); - imsg_init(ibuf_main, 3); + if (imsgbuf_init(ibuf_main, 3) == -1 || + imsgbuf_set_maxsize(ibuf_main, MAX_BGPD_IMSGSIZE) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(ibuf_main); LIST_INIT(&mrthead); listener_cnt = 0; @@ -254,13 +257,6 @@ session_main(int debug, int verbose) /* check for peers to be initialized or deleted */ if (!pending_reconf) { RB_FOREACH_SAFE(p, peer_head, &conf->peers, next) { - /* cloned peer that idled out? */ - if (p->template && (p->state == STATE_IDLE || - p->state == STATE_ACTIVE) && - getmonotime() - p->stats.last_updown >= - INTERVAL_HOLD_CLONED) - p->reconf_action = RECONF_DELETE; - /* new peer that needs init? */ if (p->state == STATE_NONE) init_peer(p); @@ -274,6 +270,10 @@ session_main(int debug, int verbose) NULL); timer_remove_all(&p->timers); tcp_md5_del_listener(conf, p); + if (imsg_rde(IMSG_SESSION_DELETE, + p->conf.id, NULL, 0) == -1) + fatalx("imsg_compose error"); + msgbuf_free(p->wbuf); RB_REMOVE(peer_head, &conf->peers, p); log_peer_warnx(&p->conf, "removed"); free(p); @@ -305,7 +305,7 @@ session_main(int debug, int verbose) free(m); continue; } - if (msgbuf_queuelen(&m->wbuf) > 0) + if (msgbuf_queuelen(m->wbuf) > 0) mrt_cnt++; } @@ -372,19 +372,19 @@ session_main(int debug, int verbose) if ((pt = timer_nextisdue(&p->timers, now)) != NULL) { switch (pt->type) { case Timer_Hold: - bgp_fsm(p, EVNT_TIMER_HOLDTIME); + bgp_fsm(p, EVNT_TIMER_HOLDTIME, NULL); break; case Timer_SendHold: - bgp_fsm(p, EVNT_TIMER_SENDHOLD); + bgp_fsm(p, EVNT_TIMER_SENDHOLD, NULL); break; case Timer_ConnectRetry: - bgp_fsm(p, EVNT_TIMER_CONNRETRY); + bgp_fsm(p, EVNT_TIMER_CONNRETRY, NULL); break; case Timer_Keepalive: - bgp_fsm(p, EVNT_TIMER_KEEPALIVE); + bgp_fsm(p, EVNT_TIMER_KEEPALIVE, NULL); break; case Timer_IdleHold: - bgp_fsm(p, EVNT_START); + bgp_fsm(p, EVNT_START, NULL); break; case Timer_IdleHoldReset: p->IdleHoldTime = @@ -405,6 +405,20 @@ session_main(int debug, int verbose) Timer_RestartTimeout); session_graceful_stop(p); break; + case Timer_SessionDown: + timer_stop(&p->timers, + Timer_SessionDown); + + if (imsg_rde(IMSG_SESSION_DELETE, + p->conf.id, NULL, 0) == -1) + fatalx("imsg_compose error"); + p->rdesession = 0; + + /* finally delete this cloned peer */ + if (p->template) + p->reconf_action = + RECONF_DELETE; + break; default: fatalx("King Bula lost in time"); } @@ -415,11 +429,11 @@ session_main(int debug, int verbose) /* are we waiting for a write? */ events = POLLIN; - if (msgbuf_queuelen(&p->wbuf) > 0 || + if (msgbuf_queuelen(p->wbuf) > 0 || p->state == STATE_CONNECT) events |= POLLOUT; /* is there still work to do? */ - if (p->rpending && p->rbuf && p->rbuf->wpos) + if (p->rpending) timeout = 0; /* poll events */ @@ -434,8 +448,8 @@ session_main(int debug, int verbose) idx_peers = i; LIST_FOREACH(m, &mrthead, entry) - if (msgbuf_queuelen(&m->wbuf) > 0) { - pfd[i].fd = m->wbuf.fd; + if (msgbuf_queuelen(m->wbuf) > 0) { + pfd[i].fd = m->fd; pfd[i].events = POLLOUT; mrt_l[i - idx_peers] = m; i++; @@ -475,7 +489,7 @@ session_main(int debug, int verbose) if (handle_pollfd(&pfd[PFD_PIPE_ROUTE], ibuf_rde) == -1) { log_warnx("SE: Lost connection to RDE"); - msgbuf_clear(&ibuf_rde->w); + imsgbuf_clear(ibuf_rde); free(ibuf_rde); ibuf_rde = NULL; } else @@ -485,7 +499,7 @@ session_main(int debug, int verbose) if (handle_pollfd(&pfd[PFD_PIPE_ROUTE_CTL], ibuf_rde_ctl) == -1) { log_warnx("SE: Lost connection to RDE control"); - msgbuf_clear(&ibuf_rde_ctl->w); + imsgbuf_clear(ibuf_rde_ctl); free(ibuf_rde_ctl); ibuf_rde_ctl = NULL; } else @@ -507,8 +521,7 @@ session_main(int debug, int verbose) peer_l[j - idx_listeners]); RB_FOREACH(p, peer_head, &conf->peers) - if (p->rbuf && p->rbuf->wpos) - session_process_msg(p); + session_process_msg(p); for (; j < idx_mrts; j++) if (pfd[j].revents & POLLOUT) @@ -539,18 +552,18 @@ session_main(int debug, int verbose) /* close pipes */ if (ibuf_rde) { - msgbuf_write(&ibuf_rde->w); - msgbuf_clear(&ibuf_rde->w); + imsgbuf_write(ibuf_rde); + imsgbuf_clear(ibuf_rde); close(ibuf_rde->fd); free(ibuf_rde); } if (ibuf_rde_ctl) { - msgbuf_clear(&ibuf_rde_ctl->w); + imsgbuf_clear(ibuf_rde_ctl); close(ibuf_rde_ctl->fd); free(ibuf_rde_ctl); } - msgbuf_write(&ibuf_main->w); - msgbuf_clear(&ibuf_main->w); + imsgbuf_write(ibuf_main); + imsgbuf_clear(ibuf_main); close(ibuf_main->fd); free(ibuf_main); @@ -564,7 +577,12 @@ void init_peer(struct peer *p) { TAILQ_INIT(&p->timers); - p->fd = p->wbuf.fd = -1; + p->fd = -1; + if (p->wbuf != NULL) + fatalx("%s: msgbuf already set", __func__); + if ((p->wbuf = msgbuf_new_reader(MSGSIZE_HEADER, parse_header, p)) == + NULL) + fatal(NULL); if (p->conf.if_depend[0]) imsg_compose(ibuf_main, IMSG_SESSION_DEPENDON, 0, 0, -1, @@ -592,7 +610,7 @@ init_peer(struct peer *p) } void -bgp_fsm(struct peer *peer, enum session_events event) +bgp_fsm(struct peer *peer, enum session_events event, struct ibuf *msg) { switch (peer->state) { case STATE_NONE: @@ -606,14 +624,6 @@ bgp_fsm(struct peer *peer, enum session_events event) timer_stop(&peer->timers, Timer_Keepalive); timer_stop(&peer->timers, Timer_IdleHold); - /* allocate read buffer */ - peer->rbuf = calloc(1, sizeof(struct ibuf_read)); - if (peer->rbuf == NULL) - fatal(NULL); - - /* init write buffer */ - msgbuf_init(&peer->wbuf); - if (!peer->depend_ok) timer_stop(&peer->timers, Timer_ConnectRetry); else if (peer->passive || peer->conf.passive || @@ -724,13 +734,13 @@ bgp_fsm(struct peer *peer, enum session_events event) break; case EVNT_RCVD_OPEN: /* parse_open calls change_state itself on failure */ - if (parse_open(peer)) + if (parse_open(peer, msg)) break; session_keepalive(peer); change_state(peer, STATE_OPENCONFIRM, event); break; case EVNT_RCVD_NOTIFICATION: - parse_notification(peer); + parse_notification(peer, msg); break; default: session_notification(peer, @@ -769,7 +779,7 @@ bgp_fsm(struct peer *peer, enum session_events event) change_state(peer, STATE_ESTABLISHED, event); break; case EVNT_RCVD_NOTIFICATION: - parse_notification(peer); + parse_notification(peer, msg); break; default: session_notification(peer, @@ -808,13 +818,13 @@ bgp_fsm(struct peer *peer, enum session_events event) break; case EVNT_RCVD_UPDATE: start_timer_holdtime(peer); - if (parse_update(peer)) + if (parse_update(peer, msg)) change_state(peer, STATE_IDLE, event); else start_timer_holdtime(peer); break; case EVNT_RCVD_NOTIFICATION: - parse_notification(peer); + parse_notification(peer, msg); break; default: session_notification(peer, @@ -865,7 +875,7 @@ session_close_connection(struct peer *peer) close(peer->fd); pauseaccept = 0; } - peer->fd = peer->wbuf.fd = -1; + peer->fd = -1; } void @@ -886,8 +896,8 @@ change_state(struct peer *peer, enum session_state state, * don't bother if it fails */ if (peer->state >= STATE_OPENSENT && - msgbuf_queuelen(&peer->wbuf) > 0) - msgbuf_write(&peer->wbuf); + msgbuf_queuelen(peer->wbuf) > 0) + ibuf_write(peer->fd, peer->wbuf); /* * we must start the timer for the next EVNT_START @@ -905,33 +915,42 @@ change_state(struct peer *peer, enum session_state state, timer_stop(&peer->timers, Timer_IdleHold); timer_stop(&peer->timers, Timer_IdleHoldReset); session_close_connection(peer); - msgbuf_clear(&peer->wbuf); - free(peer->rbuf); - peer->rbuf = NULL; + msgbuf_clear(peer->wbuf); peer->rpending = 0; memset(&peer->capa.peer, 0, sizeof(peer->capa.peer)); if (!peer->template) imsg_compose(ibuf_main, IMSG_PFKEY_RELOAD, peer->conf.id, 0, -1, NULL, 0); - if (event != EVNT_STOP) { - timer_set(&peer->timers, Timer_IdleHold, - peer->IdleHoldTime); - if (event != EVNT_NONE && - peer->IdleHoldTime < MAX_IDLE_HOLD/2) - peer->IdleHoldTime *= 2; - } if (peer->state == STATE_ESTABLISHED) { if (peer->capa.neg.grestart.restart == 2 && (event == EVNT_CON_CLOSED || - event == EVNT_CON_FATAL)) { + event == EVNT_CON_FATAL || + (peer->capa.neg.grestart.grnotification && + (event == EVNT_RCVD_GRACE_NOTIFICATION || + event == EVNT_TIMER_HOLDTIME || + event == EVNT_TIMER_SENDHOLD)))) { /* don't punish graceful restart */ timer_set(&peer->timers, Timer_IdleHold, 0); - peer->IdleHoldTime /= 2; session_graceful_restart(peer); - } else + } else if (event != EVNT_STOP) { + timer_set(&peer->timers, Timer_IdleHold, + peer->IdleHoldTime); + if (event != EVNT_NONE && + peer->IdleHoldTime < MAX_IDLE_HOLD/2) + peer->IdleHoldTime *= 2; session_down(peer); + } else { + session_down(peer); + } + } else if (event != EVNT_STOP) { + timer_set(&peer->timers, Timer_IdleHold, + peer->IdleHoldTime); + if (event != EVNT_NONE && + peer->IdleHoldTime < MAX_IDLE_HOLD / 2) + peer->IdleHoldTime *= 2; } + if (peer->state == STATE_NONE || peer->state == STATE_ESTABLISHED) { /* initialize capability negotiation structures */ @@ -952,7 +971,7 @@ change_state(struct peer *peer, enum session_state state, timer_stop(&peer->timers, Timer_IdleHold); timer_stop(&peer->timers, Timer_IdleHoldReset); session_close_connection(peer); - msgbuf_clear(&peer->wbuf); + msgbuf_clear(peer->wbuf); memset(&peer->capa.peer, 0, sizeof(peer->capa.peer)); } break; @@ -1016,7 +1035,7 @@ session_accept(int listenfd) if (timer_running(&p->timers, Timer_IdleHold, NULL)) { /* fast reconnect after clear */ p->passive = 1; - bgp_fsm(p, EVNT_START); + bgp_fsm(p, EVNT_START, NULL); } } @@ -1044,12 +1063,12 @@ open: close(connfd); return; } - p->fd = p->wbuf.fd = connfd; + p->fd = connfd; if (session_setup_socket(p)) { close(connfd); return; } - bgp_fsm(p, EVNT_CON_OPEN); + bgp_fsm(p, EVNT_CON_OPEN, NULL); return; } else if (p != NULL && p->state == STATE_ESTABLISHED && p->capa.neg.grestart.restart == 2) { @@ -1081,34 +1100,33 @@ session_connect(struct peer *peer) if ((peer->fd = socket(aid2af(peer->conf.remote_addr.aid), SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, IPPROTO_TCP)) == -1) { log_peer_warn(&peer->conf, "session_connect socket"); - bgp_fsm(peer, EVNT_CON_OPENFAIL); + bgp_fsm(peer, EVNT_CON_OPENFAIL, NULL); return (-1); } if (peer->auth_conf.method != AUTH_NONE && sysdep.no_pfkey) { log_peer_warnx(&peer->conf, "ipsec or md5sig configured but not available"); - bgp_fsm(peer, EVNT_CON_OPENFAIL); + bgp_fsm(peer, EVNT_CON_OPENFAIL, NULL); return (-1); } if (tcp_md5_set(peer->fd, &peer->auth_conf, &peer->conf.remote_addr) == -1) log_peer_warn(&peer->conf, "setting md5sig"); - peer->wbuf.fd = peer->fd; /* if local-address is set we need to bind() */ bind_addr = session_localaddr(peer); if ((sa = addr2sa(bind_addr, 0, &sa_len)) != NULL) { if (bind(peer->fd, sa, sa_len) == -1) { log_peer_warn(&peer->conf, "session_connect bind"); - bgp_fsm(peer, EVNT_CON_OPENFAIL); + bgp_fsm(peer, EVNT_CON_OPENFAIL, NULL); return (-1); } } if (session_setup_socket(peer)) { - bgp_fsm(peer, EVNT_CON_OPENFAIL); + bgp_fsm(peer, EVNT_CON_OPENFAIL, NULL); return (-1); } @@ -1118,11 +1136,11 @@ session_connect(struct peer *peer) if (errno != peer->lasterr) log_peer_warn(&peer->conf, "connect"); peer->lasterr = errno; - bgp_fsm(peer, EVNT_CON_OPENFAIL); + bgp_fsm(peer, EVNT_CON_OPENFAIL, NULL); return (-1); } } else - bgp_fsm(peer, EVNT_CON_OPEN); + bgp_fsm(peer, EVNT_CON_OPEN, NULL); return (0); } @@ -1384,10 +1402,9 @@ session_capa_add_afi(struct ibuf *b, uint8_t aid, uint8_t flags) return (errs); } -struct bgp_msg * +struct ibuf * session_newmsg(enum msg_type msgtype, uint16_t len) { - struct bgp_msg *msg; struct ibuf *buf; int errs = 0; @@ -1398,44 +1415,36 @@ session_newmsg(enum msg_type msgtype, uint16_t len) errs += ibuf_add_n16(buf, len); errs += ibuf_add_n8(buf, msgtype); - if (errs || (msg = calloc(1, sizeof(*msg))) == NULL) { + if (errs) { ibuf_free(buf); return (NULL); } - msg->buf = buf; - msg->type = msgtype; - msg->len = len; - - return (msg); + return (buf); } -int -session_sendmsg(struct bgp_msg *msg, struct peer *p) +void +session_sendmsg(struct ibuf *msg, struct peer *p, enum msg_type msgtype) { struct mrt *mrt; LIST_FOREACH(mrt, &mrthead, entry) { - if (!(mrt->type == MRT_ALL_OUT || (msg->type == UPDATE && + if (!(mrt->type == MRT_ALL_OUT || (msgtype == MSG_UPDATE && mrt->type == MRT_UPDATE_OUT))) continue; if ((mrt->peer_id == 0 && mrt->group_id == 0) || mrt->peer_id == p->conf.id || (mrt->group_id != 0 && mrt->group_id == p->conf.groupid)) - mrt_dump_bgp_msg(mrt, ibuf_data(msg->buf), msg->len, p, - msg->type); + mrt_dump_bgp_msg(mrt, msg, p, msgtype); } - ibuf_close(&p->wbuf, msg->buf); - if (!p->throttled && msgbuf_queuelen(&p->wbuf) > SESS_MSG_HIGH_MARK) { + ibuf_close(p->wbuf, msg); + if (!p->throttled && msgbuf_queuelen(p->wbuf) > SESS_MSG_HIGH_MARK) { if (imsg_rde(IMSG_XOFF, p->conf.id, NULL, 0) == -1) log_peer_warn(&p->conf, "imsg_compose XOFF"); else p->throttled = 1; } - - free(msg); - return (0); } /* @@ -1482,8 +1491,7 @@ capa2role(uint8_t val) void session_open(struct peer *p) { - struct bgp_msg *buf; - struct ibuf *opb; + struct ibuf *buf, *opb; size_t len, optparamlen; uint16_t holdtime; uint8_t i; @@ -1491,8 +1499,9 @@ session_open(struct peer *p) int mpcapa = 0; - if ((opb = ibuf_dynamic(0, UINT16_MAX - 3)) == NULL) { - bgp_fsm(p, EVNT_CON_FATAL); + if ((opb = ibuf_dynamic(0, MAX_PKTSIZE - MSGSIZE_OPEN_MIN - 6)) == + NULL) { + bgp_fsm(p, EVNT_CON_FATAL, NULL); return; } @@ -1508,6 +1517,10 @@ session_open(struct peer *p) if (p->capa.ann.refresh) /* no data */ errs += session_capa_add(opb, CAPA_REFRESH, 0); + /* extended message support, RFC8654 */ + if (p->capa.ann.ext_msg) /* no data */ + errs += session_capa_add(opb, CAPA_EXT_MSG, 0); + /* BGP open policy, RFC 9234, only for ebgp sessions */ if (p->conf.ebgp && p->capa.ann.policy && p->conf.role != ROLE_NONE && @@ -1530,6 +1543,8 @@ session_open(struct peer *p) /* Only set the R-flag if no graceful restart is ongoing */ if (!rst) hdr |= CAPA_GR_R_FLAG; + if (p->capa.ann.grestart.grnotification) + hdr |= CAPA_GR_N_FLAG; errs += session_capa_add(opb, CAPA_RESTART, sizeof(hdr)); errs += ibuf_add_n16(opb, hdr); } @@ -1569,7 +1584,7 @@ session_open(struct peer *p) if (errs) { ibuf_free(opb); - bgp_fsm(p, EVNT_CON_FATAL); + bgp_fsm(p, EVNT_CON_FATAL, NULL); return; } @@ -1589,9 +1604,9 @@ session_open(struct peer *p) len += 2; } - if ((buf = session_newmsg(OPEN, len)) == NULL) { + if ((buf = session_newmsg(MSG_OPEN, len)) == NULL) { ibuf_free(opb); - bgp_fsm(p, EVNT_CON_FATAL); + bgp_fsm(p, EVNT_CON_FATAL, NULL); return; } @@ -1600,59 +1615,54 @@ session_open(struct peer *p) else holdtime = conf->holdtime; - errs += ibuf_add_n8(buf->buf, 4); - errs += ibuf_add_n16(buf->buf, p->conf.local_short_as); - errs += ibuf_add_n16(buf->buf, holdtime); + errs += ibuf_add_n8(buf, 4); + errs += ibuf_add_n16(buf, p->conf.local_short_as); + errs += ibuf_add_n16(buf, holdtime); /* is already in network byte order */ - errs += ibuf_add_n32(buf->buf, conf->bgpid); - errs += ibuf_add_n8(buf->buf, optparamlen); + errs += ibuf_add_n32(buf, conf->bgpid); + errs += ibuf_add_n8(buf, optparamlen); if (extlen) { /* RFC9072 extra header which spans over the capabilities hdr */ - errs += ibuf_add_n8(buf->buf, OPT_PARAM_EXT_LEN); - errs += ibuf_add_n16(buf->buf, ibuf_size(opb) + 1 + 2); + errs += ibuf_add_n8(buf, OPT_PARAM_EXT_LEN); + errs += ibuf_add_n16(buf, ibuf_size(opb) + 1 + 2); } if (optparamlen) { - errs += ibuf_add_n8(buf->buf, OPT_PARAM_CAPABILITIES); + errs += ibuf_add_n8(buf, OPT_PARAM_CAPABILITIES); if (extlen) { /* RFC9072: 2-byte extended length */ - errs += ibuf_add_n16(buf->buf, ibuf_size(opb)); + errs += ibuf_add_n16(buf, ibuf_size(opb)); } else { - errs += ibuf_add_n8(buf->buf, ibuf_size(opb)); + errs += ibuf_add_n8(buf, ibuf_size(opb)); } - errs += ibuf_add_buf(buf->buf, opb); + errs += ibuf_add_ibuf(buf, opb); } ibuf_free(opb); if (errs) { - ibuf_free(buf->buf); - free(buf); - bgp_fsm(p, EVNT_CON_FATAL); - return; - } - - if (session_sendmsg(buf, p) == -1) { - bgp_fsm(p, EVNT_CON_FATAL); + ibuf_free(buf); + bgp_fsm(p, EVNT_CON_FATAL, NULL); return; } + session_sendmsg(buf, p, MSG_OPEN); p->stats.msg_sent_open++; } void session_keepalive(struct peer *p) { - struct bgp_msg *buf; + struct ibuf *buf; - if ((buf = session_newmsg(KEEPALIVE, MSGSIZE_KEEPALIVE)) == NULL || - session_sendmsg(buf, p) == -1) { - bgp_fsm(p, EVNT_CON_FATAL); + if ((buf = session_newmsg(MSG_KEEPALIVE, MSGSIZE_KEEPALIVE)) == NULL) { + bgp_fsm(p, EVNT_CON_FATAL, NULL); return; } + session_sendmsg(buf, p, MSG_KEEPALIVE); start_timer_keepalive(p); p->stats.msg_sent_keepalive++; } @@ -1660,39 +1670,75 @@ session_keepalive(struct peer *p) void session_update(uint32_t peerid, struct ibuf *ibuf) { - struct peer *p; - struct bgp_msg *buf; + struct peer *p; + struct ibuf *buf; + size_t len, maxsize = MAX_PKTSIZE; if ((p = getpeerbyid(conf, peerid)) == NULL) { - log_warnx("no such peer: id=%u", peerid); + log_warnx("%s: no such peer: id=%u", __func__, peerid); return; } if (p->state != STATE_ESTABLISHED) return; - if ((buf = session_newmsg(UPDATE, MSGSIZE_HEADER + ibuf_size(ibuf))) == - NULL) { - bgp_fsm(p, EVNT_CON_FATAL); + if (p->capa.neg.ext_msg) + maxsize = MAX_EXT_PKTSIZE; + len = ibuf_size(ibuf); + if (len < MSGSIZE_UPDATE_MIN - MSGSIZE_HEADER || + len > maxsize - MSGSIZE_HEADER) { + log_peer_warnx(&p->conf, "bad UDPATE from RDE"); return; } - if (ibuf_add_buf(buf->buf, ibuf)) { - ibuf_free(buf->buf); - free(buf); - bgp_fsm(p, EVNT_CON_FATAL); + if ((buf = session_newmsg(MSG_UPDATE, MSGSIZE_HEADER + len)) == NULL) { + bgp_fsm(p, EVNT_CON_FATAL, NULL); return; } - if (session_sendmsg(buf, p) == -1) { - bgp_fsm(p, EVNT_CON_FATAL); + if (ibuf_add_ibuf(buf, ibuf)) { + ibuf_free(buf); + bgp_fsm(p, EVNT_CON_FATAL, NULL); return; } + session_sendmsg(buf, p, MSG_UPDATE); start_timer_keepalive(p); p->stats.msg_sent_update++; } +static int +session_req_hard_reset(enum err_codes errcode, uint8_t subcode) +{ + switch (errcode) { + case ERR_HEADER: + case ERR_OPEN: + case ERR_UPDATE: + case ERR_FSM: + case ERR_RREFRESH: + /* + * Protocol errors trigger a hard reset. The peer + * is not trustworthy and so there is no realistic + * hope that forwarding can continue. + */ + return 1; + case ERR_HOLDTIMEREXPIRED: + case ERR_SENDHOLDTIMEREXPIRED: + /* Keep forwarding and hope the other side is back soon. */ + return 0; + case ERR_CEASE: + switch (subcode) { + case ERR_CEASE_CONN_REJECT: + case ERR_CEASE_OTHER_CHANGE: + case ERR_CEASE_COLLISION: + case ERR_CEASE_RSRC_EXHAUST: + /* Per RFC8538 suggestion make these graceful. */ + return 0; + } + return 1; + } +} + void session_notification_data(struct peer *p, uint8_t errcode, uint8_t subcode, void *data, size_t datalen) @@ -1707,8 +1753,9 @@ void session_notification(struct peer *p, uint8_t errcode, uint8_t subcode, struct ibuf *ibuf) { - struct bgp_msg *buf; - int errs = 0; + struct ibuf *buf; + const char *reason = "sending"; + int errs = 0, need_hard_reset = 0; size_t datalen = 0; switch (p->state) { @@ -1722,44 +1769,54 @@ session_notification(struct peer *p, uint8_t errcode, uint8_t subcode, return; } - log_notification(p, errcode, subcode, ibuf, "sending"); + if (p->capa.neg.grestart.grnotification) { + if (session_req_hard_reset(errcode, subcode)) { + need_hard_reset = 1; + datalen += 2; + reason = "sending hard-reset"; + } else { + reason = "sending graceful"; + } + } + + log_notification(p, errcode, subcode, ibuf, reason); /* cap to maximum size */ if (ibuf != NULL) { if (ibuf_size(ibuf) > - MAX_PKTSIZE - MSGSIZE_NOTIFICATION_MIN) { + MAX_PKTSIZE - MSGSIZE_NOTIFICATION_MIN - datalen) { log_peer_warnx(&p->conf, "oversized notification, data trunkated"); ibuf_truncate(ibuf, MAX_PKTSIZE - - MSGSIZE_NOTIFICATION_MIN); + MSGSIZE_NOTIFICATION_MIN - datalen); } - datalen = ibuf_size(ibuf); + datalen += ibuf_size(ibuf); } - if ((buf = session_newmsg(NOTIFICATION, + if ((buf = session_newmsg(MSG_NOTIFICATION, MSGSIZE_NOTIFICATION_MIN + datalen)) == NULL) { - bgp_fsm(p, EVNT_CON_FATAL); + bgp_fsm(p, EVNT_CON_FATAL, NULL); return; } - errs += ibuf_add_n8(buf->buf, errcode); - errs += ibuf_add_n8(buf->buf, subcode); + if (need_hard_reset) { + errs += ibuf_add_n8(buf, ERR_CEASE); + errs += ibuf_add_n8(buf, ERR_CEASE_HARD_RESET); + } + + errs += ibuf_add_n8(buf, errcode); + errs += ibuf_add_n8(buf, subcode); if (ibuf != NULL) - errs += ibuf_add_buf(buf->buf, ibuf); + errs += ibuf_add_ibuf(buf, ibuf); if (errs) { - ibuf_free(buf->buf); - free(buf); - bgp_fsm(p, EVNT_CON_FATAL); - return; - } - - if (session_sendmsg(buf, p) == -1) { - bgp_fsm(p, EVNT_CON_FATAL); + ibuf_free(buf); + bgp_fsm(p, EVNT_CON_FATAL, NULL); return; } + session_sendmsg(buf, p, MSG_NOTIFICATION); p->stats.msg_sent_notification++; p->stats.last_sent_errcode = errcode; p->stats.last_sent_suberr = subcode; @@ -1784,7 +1841,7 @@ session_neighbor_rrefresh(struct peer *p) void session_rrefresh(struct peer *p, uint8_t aid, uint8_t subtype) { - struct bgp_msg *buf; + struct ibuf *buf; int errs = 0; uint16_t afi; uint8_t safi; @@ -1810,27 +1867,22 @@ session_rrefresh(struct peer *p, uint8_t aid, uint8_t subtype) if (aid2afi(aid, &afi, &safi) == -1) fatalx("session_rrefresh: bad afi/safi pair"); - if ((buf = session_newmsg(RREFRESH, MSGSIZE_RREFRESH)) == NULL) { - bgp_fsm(p, EVNT_CON_FATAL); + if ((buf = session_newmsg(MSG_RREFRESH, MSGSIZE_RREFRESH)) == NULL) { + bgp_fsm(p, EVNT_CON_FATAL, NULL); return; } - errs += ibuf_add_n16(buf->buf, afi); - errs += ibuf_add_n8(buf->buf, subtype); - errs += ibuf_add_n8(buf->buf, safi); + errs += ibuf_add_n16(buf, afi); + errs += ibuf_add_n8(buf, subtype); + errs += ibuf_add_n8(buf, safi); if (errs) { - ibuf_free(buf->buf); - free(buf); - bgp_fsm(p, EVNT_CON_FATAL); - return; - } - - if (session_sendmsg(buf, p) == -1) { - bgp_fsm(p, EVNT_CON_FATAL); + ibuf_free(buf); + bgp_fsm(p, EVNT_CON_FATAL, NULL); return; } + session_sendmsg(buf, p, MSG_RREFRESH); p->stats.msg_sent_rrefresh++; } @@ -1838,9 +1890,15 @@ int session_graceful_restart(struct peer *p) { uint8_t i; + uint16_t staletime = conf->staletime; - timer_set(&p->timers, Timer_RestartTimeout, - p->capa.neg.grestart.timeout); + if (p->conf.staletime) + staletime = p->conf.staletime; + + /* RFC 8538: enforce configurable upper bound of the stale timer */ + if (staletime > p->capa.neg.grestart.timeout) + staletime = p->capa.neg.grestart.timeout; + timer_set(&p->timers, Timer_RestartTimeout, staletime); for (i = AID_MIN; i < AID_MAX; i++) { if (p->capa.neg.grestart.flags[i] & CAPA_GR_PRESENT) { @@ -1889,7 +1947,6 @@ session_graceful_stop(struct peer *p) int session_dispatch_msg(struct pollfd *pfd, struct peer *p) { - ssize_t n; socklen_t len; int error; @@ -1907,46 +1964,46 @@ session_dispatch_msg(struct pollfd *pfd, struct peer *p) "socket error"); p->lasterr = errno; } - bgp_fsm(p, EVNT_CON_OPENFAIL); + bgp_fsm(p, EVNT_CON_OPENFAIL, NULL); return (1); } } - bgp_fsm(p, EVNT_CON_OPEN); + bgp_fsm(p, EVNT_CON_OPEN, NULL); return (1); } if (pfd->revents & POLLHUP) { - bgp_fsm(p, EVNT_CON_OPENFAIL); + bgp_fsm(p, EVNT_CON_OPENFAIL, NULL); return (1); } if (pfd->revents & (POLLERR|POLLNVAL)) { - bgp_fsm(p, EVNT_CON_FATAL); + bgp_fsm(p, EVNT_CON_FATAL, NULL); return (1); } return (0); } if (pfd->revents & POLLHUP) { - bgp_fsm(p, EVNT_CON_CLOSED); + bgp_fsm(p, EVNT_CON_CLOSED, NULL); return (1); } if (pfd->revents & (POLLERR|POLLNVAL)) { - bgp_fsm(p, EVNT_CON_FATAL); + bgp_fsm(p, EVNT_CON_FATAL, NULL); return (1); } - if (pfd->revents & POLLOUT && msgbuf_queuelen(&p->wbuf) > 0) { - if ((error = msgbuf_write(&p->wbuf)) <= 0 && errno != EAGAIN) { - if (error == 0) + if (pfd->revents & POLLOUT && msgbuf_queuelen(p->wbuf) > 0) { + if (ibuf_write(p->fd, p->wbuf) == -1) { + if (errno == EPIPE) log_peer_warnx(&p->conf, "Connection closed"); - else if (error == -1) + else log_peer_warn(&p->conf, "write error"); - bgp_fsm(p, EVNT_CON_FATAL); + bgp_fsm(p, EVNT_CON_FATAL, NULL); return (1); } p->stats.last_write = getmonotime(); start_timer_sendholdtime(p); if (p->throttled && - msgbuf_queuelen(&p->wbuf) < SESS_MSG_LOW_MARK) { + msgbuf_queuelen(p->wbuf) < SESS_MSG_LOW_MARK) { if (imsg_rde(IMSG_XON, p->conf.id, NULL, 0) == -1) log_peer_warn(&p->conf, "imsg_compose XON"); else @@ -1956,21 +2013,19 @@ session_dispatch_msg(struct pollfd *pfd, struct peer *p) return (1); } - if (p->rbuf && pfd->revents & POLLIN) { - if ((n = read(p->fd, p->rbuf->buf + p->rbuf->wpos, - sizeof(p->rbuf->buf) - p->rbuf->wpos)) == -1) { - if (errno != EINTR && errno != EAGAIN) { - log_peer_warn(&p->conf, "read error"); - bgp_fsm(p, EVNT_CON_FATAL); - } + if (p->fd != -1 && pfd->revents & POLLIN) { + switch (ibuf_read(p->fd, p->wbuf)) { + case -1: + if (p->state == STATE_IDLE) + /* error already handled before */ + return (1); + log_peer_warn(&p->conf, "read error"); + bgp_fsm(p, EVNT_CON_FATAL, NULL); + return (1); + case 0: + bgp_fsm(p, EVNT_CON_CLOSED, NULL); return (1); } - if (n == 0) { /* connection closed */ - bgp_fsm(p, EVNT_CON_CLOSED); - return (1); - } - - p->rbuf->wpos += n; p->stats.last_read = getmonotime(); return (1); } @@ -1980,210 +2035,184 @@ session_dispatch_msg(struct pollfd *pfd, struct peer *p) void session_process_msg(struct peer *p) { + struct ibuf *msg; struct mrt *mrt; - ssize_t rpos, av, left; int processed = 0; - uint16_t msglen; uint8_t msgtype; - rpos = 0; - av = p->rbuf->wpos; p->rpending = 0; + if (p->wbuf == NULL) + return; /* - * session might drop to IDLE -> buffers deallocated - * we MUST check rbuf != NULL before use + * session might drop to IDLE -> all buffers are flushed */ - for (;;) { - if (p->rbuf == NULL) + while ((msg = msgbuf_get(p->wbuf)) != NULL) { + /* skip msg header and extract type */ + if (ibuf_skip(msg, MSGSIZE_HEADER_MARKER) == -1 || + ibuf_skip(msg, sizeof(uint16_t)) == -1 || + ibuf_get_n8(msg, &msgtype) == -1) { + log_peer_warn(&p->conf, "process message failed"); + bgp_fsm(p, EVNT_CON_FATAL, NULL); + ibuf_free(msg); return; - if (rpos + MSGSIZE_HEADER > av) - break; - if (parse_header(p, p->rbuf->buf + rpos, &msglen, - &msgtype) == -1) - return; - if (rpos + msglen > av) - break; - p->rbuf->rptr = p->rbuf->buf + rpos; + } + ibuf_rewind(msg); /* dump to MRT as soon as we have a full packet */ LIST_FOREACH(mrt, &mrthead, entry) { - if (!(mrt->type == MRT_ALL_IN || (msgtype == UPDATE && + if (!(mrt->type == MRT_ALL_IN || + (msgtype == MSG_UPDATE && mrt->type == MRT_UPDATE_IN))) continue; if ((mrt->peer_id == 0 && mrt->group_id == 0) || mrt->peer_id == p->conf.id || (mrt->group_id != 0 && mrt->group_id == p->conf.groupid)) - mrt_dump_bgp_msg(mrt, p->rbuf->rptr, msglen, p, - msgtype); + mrt_dump_bgp_msg(mrt, msg, p, msgtype); } + ibuf_skip(msg, MSGSIZE_HEADER); + switch (msgtype) { - case OPEN: - bgp_fsm(p, EVNT_RCVD_OPEN); + case MSG_OPEN: + bgp_fsm(p, EVNT_RCVD_OPEN, msg); p->stats.msg_rcvd_open++; break; - case UPDATE: - bgp_fsm(p, EVNT_RCVD_UPDATE); + case MSG_UPDATE: + bgp_fsm(p, EVNT_RCVD_UPDATE, msg); p->stats.msg_rcvd_update++; break; - case NOTIFICATION: - bgp_fsm(p, EVNT_RCVD_NOTIFICATION); + case MSG_NOTIFICATION: + bgp_fsm(p, EVNT_RCVD_NOTIFICATION, msg); p->stats.msg_rcvd_notification++; break; - case KEEPALIVE: - bgp_fsm(p, EVNT_RCVD_KEEPALIVE); + case MSG_KEEPALIVE: + bgp_fsm(p, EVNT_RCVD_KEEPALIVE, msg); p->stats.msg_rcvd_keepalive++; break; - case RREFRESH: - parse_rrefresh(p); + case MSG_RREFRESH: + parse_rrefresh(p, msg); p->stats.msg_rcvd_rrefresh++; break; default: /* cannot happen */ session_notification_data(p, ERR_HEADER, ERR_HDR_TYPE, &msgtype, 1); - log_warnx("received message with unknown type %u", - msgtype); - bgp_fsm(p, EVNT_CON_FATAL); + log_peer_warnx(&p->conf, + "received message with unknown type %u", msgtype); + bgp_fsm(p, EVNT_CON_FATAL, NULL); } - rpos += msglen; + ibuf_free(msg); if (++processed > MSG_PROCESS_LIMIT) { p->rpending = 1; break; } } - - if (p->rbuf == NULL) - return; - if (rpos < av) { - left = av - rpos; - memmove(&p->rbuf->buf, p->rbuf->buf + rpos, left); - p->rbuf->wpos = left; - } else - p->rbuf->wpos = 0; } -int -parse_header(struct peer *peer, u_char *data, uint16_t *len, uint8_t *type) +struct ibuf * +parse_header(struct ibuf *msg, void *arg, int *fd) { - u_char *p; - uint16_t olen; + struct peer *peer = arg; + struct ibuf *b; + u_char m[MSGSIZE_HEADER_MARKER]; + uint16_t len, maxlen = MAX_PKTSIZE; + uint8_t type; + if (ibuf_get(msg, m, sizeof(m)) == -1 || + ibuf_get_n16(msg, &len) == -1 || + ibuf_get_n8(msg, &type) == -1) + return (NULL); /* caller MUST make sure we are getting 19 bytes! */ - p = data; - if (memcmp(p, marker, sizeof(marker))) { + if (memcmp(m, marker, sizeof(marker))) { log_peer_warnx(&peer->conf, "sync error"); session_notification(peer, ERR_HEADER, ERR_HDR_SYNC, NULL); - bgp_fsm(peer, EVNT_CON_FATAL); - return (-1); + bgp_fsm(peer, EVNT_CON_FATAL, NULL); + errno = EINVAL; + return (NULL); } - p += MSGSIZE_HEADER_MARKER; - memcpy(&olen, p, 2); - *len = ntohs(olen); - p += 2; - memcpy(type, p, 1); + if (peer->capa.ann.ext_msg) + maxlen = MAX_EXT_PKTSIZE; - if (*len < MSGSIZE_HEADER || *len > MAX_PKTSIZE) { + if (len < MSGSIZE_HEADER || len > maxlen) { log_peer_warnx(&peer->conf, - "received message: illegal length: %u byte", *len); - session_notification_data(peer, ERR_HEADER, ERR_HDR_LEN, - &olen, sizeof(olen)); - bgp_fsm(peer, EVNT_CON_FATAL); - return (-1); + "received message: illegal length: %u byte", len); + goto badlen; } - switch (*type) { - case OPEN: - if (*len < MSGSIZE_OPEN_MIN) { + switch (type) { + case MSG_OPEN: + if (len < MSGSIZE_OPEN_MIN || len > MAX_PKTSIZE) { log_peer_warnx(&peer->conf, - "received OPEN: illegal len: %u byte", *len); - session_notification_data(peer, ERR_HEADER, ERR_HDR_LEN, - &olen, sizeof(olen)); - bgp_fsm(peer, EVNT_CON_FATAL); - return (-1); + "received OPEN: illegal len: %u byte", len); + goto badlen; } break; - case NOTIFICATION: - if (*len < MSGSIZE_NOTIFICATION_MIN) { + case MSG_NOTIFICATION: + if (len < MSGSIZE_NOTIFICATION_MIN) { log_peer_warnx(&peer->conf, - "received NOTIFICATION: illegal len: %u byte", - *len); - session_notification_data(peer, ERR_HEADER, ERR_HDR_LEN, - &olen, sizeof(olen)); - bgp_fsm(peer, EVNT_CON_FATAL); - return (-1); + "received NOTIFICATION: illegal len: %u byte", len); + goto badlen; } break; - case UPDATE: - if (*len < MSGSIZE_UPDATE_MIN) { + case MSG_UPDATE: + if (len < MSGSIZE_UPDATE_MIN) { log_peer_warnx(&peer->conf, - "received UPDATE: illegal len: %u byte", *len); - session_notification_data(peer, ERR_HEADER, ERR_HDR_LEN, - &olen, sizeof(olen)); - bgp_fsm(peer, EVNT_CON_FATAL); - return (-1); + "received UPDATE: illegal len: %u byte", len); + goto badlen; } break; - case KEEPALIVE: - if (*len != MSGSIZE_KEEPALIVE) { + case MSG_KEEPALIVE: + if (len != MSGSIZE_KEEPALIVE) { log_peer_warnx(&peer->conf, - "received KEEPALIVE: illegal len: %u byte", *len); - session_notification_data(peer, ERR_HEADER, ERR_HDR_LEN, - &olen, sizeof(olen)); - bgp_fsm(peer, EVNT_CON_FATAL); - return (-1); + "received KEEPALIVE: illegal len: %u byte", len); + goto badlen; } break; - case RREFRESH: - if (*len < MSGSIZE_RREFRESH_MIN) { + case MSG_RREFRESH: + if (len < MSGSIZE_RREFRESH_MIN) { log_peer_warnx(&peer->conf, - "received RREFRESH: illegal len: %u byte", *len); - session_notification_data(peer, ERR_HEADER, ERR_HDR_LEN, - &olen, sizeof(olen)); - bgp_fsm(peer, EVNT_CON_FATAL); - return (-1); + "received RREFRESH: illegal len: %u byte", len); + goto badlen; } break; default: log_peer_warnx(&peer->conf, - "received msg with unknown type %u", *type); + "received msg with unknown type %u", type); session_notification_data(peer, ERR_HEADER, ERR_HDR_TYPE, - type, 1); - bgp_fsm(peer, EVNT_CON_FATAL); - return (-1); + &type, sizeof(type)); + bgp_fsm(peer, EVNT_CON_FATAL, NULL); + errno = EINVAL; + return (NULL); } - return (0); + + if ((b = ibuf_open(len)) == NULL) + return (NULL); + return (b); + + badlen: + len = htons(len); + session_notification_data(peer, ERR_HEADER, ERR_HDR_LEN, + &len, sizeof(len)); + bgp_fsm(peer, EVNT_CON_FATAL, NULL); + errno = ERANGE; + return (NULL); } int -parse_open(struct peer *peer) +parse_open(struct peer *peer, struct ibuf *msg) { - struct ibuf ibuf; - u_char *p; uint8_t version, rversion; - uint16_t short_as, msglen; + uint16_t short_as; uint16_t holdtime, myholdtime; uint32_t as, bgpid; uint8_t optparamlen; - p = peer->rbuf->rptr; - p += MSGSIZE_HEADER_MARKER; - memcpy(&msglen, p, sizeof(msglen)); - msglen = ntohs(msglen); - - p = peer->rbuf->rptr; - p += MSGSIZE_HEADER; /* header is already checked */ - msglen -= MSGSIZE_HEADER; - - /* XXX */ - ibuf_from_buffer(&ibuf, p, msglen); - - if (ibuf_get_n8(&ibuf, &version) == -1 || - ibuf_get_n16(&ibuf, &short_as) == -1 || - ibuf_get_n16(&ibuf, &holdtime) == -1 || - ibuf_get_n32(&ibuf, &bgpid) == -1 || - ibuf_get_n8(&ibuf, &optparamlen) == -1) + if (ibuf_get_n8(msg, &version) == -1 || + ibuf_get_n16(msg, &short_as) == -1 || + ibuf_get_n16(msg, &holdtime) == -1 || + ibuf_get_n32(msg, &bgpid) == -1 || + ibuf_get_n8(msg, &optparamlen) == -1) goto bad_len; if (version != BGP_VERSION) { @@ -2238,7 +2267,7 @@ parse_open(struct peer *peer) uint8_t ext_type, op_type; uint16_t ext_len, op_len; - ibuf_from_ibuf(&oparams, &ibuf); + ibuf_from_ibuf(&oparams, msg); /* check for RFC9072 encoding */ if (ibuf_get_n8(&oparams, &ext_type) == -1) @@ -2247,7 +2276,7 @@ parse_open(struct peer *peer) if (ibuf_get_n16(&oparams, &ext_len) == -1) goto bad_len; /* skip RFC9072 header */ - if (ibuf_skip(&ibuf, 3) == -1) + if (ibuf_skip(msg, 3) == -1) goto bad_len; } else { ext_len = optparamlen; @@ -2255,7 +2284,7 @@ parse_open(struct peer *peer) } if (ibuf_truncate(&oparams, ext_len) == -1 || - ibuf_skip(&ibuf, ext_len) == -1) + ibuf_skip(msg, ext_len) == -1) goto bad_len; while (ibuf_size(&oparams) > 0) { @@ -2306,7 +2335,7 @@ parse_open(struct peer *peer) } } - if (ibuf_size(&ibuf) != 0) { + if (ibuf_size(msg) != 0) { bad_len: log_peer_warnx(&peer->conf, "corrupt OPEN message received: length mismatch"); @@ -2315,7 +2344,11 @@ parse_open(struct peer *peer) return (-1); } - /* if remote-as is zero and it's a cloned neighbor, accept any */ + /* + * if remote-as is zero and it's a cloned neighbor, accept any + * but only on the first connect, after that the remote-as needs + * to remain the same. + */ if (peer->template && !peer->conf.remote_as && as != AS_TRANS) { peer->conf.remote_as = as; peer->conf.ebgp = (peer->conf.remote_as != peer->conf.local_as); @@ -2352,55 +2385,32 @@ parse_open(struct peer *peer) } int -parse_update(struct peer *peer) +parse_update(struct peer *peer, struct ibuf *msg) { - u_char *p; - uint16_t datalen; - /* * we pass the message verbatim to the rde. * in case of errors the whole session is reset with a * notification anyway, we only need to know the peer */ - p = peer->rbuf->rptr; - p += MSGSIZE_HEADER_MARKER; - memcpy(&datalen, p, sizeof(datalen)); - datalen = ntohs(datalen); - - p = peer->rbuf->rptr; - p += MSGSIZE_HEADER; /* header is already checked */ - datalen -= MSGSIZE_HEADER; - - if (imsg_rde(IMSG_UPDATE, peer->conf.id, p, datalen) == -1) + if (imsg_rde(IMSG_UPDATE, peer->conf.id, ibuf_data(msg), + ibuf_size(msg)) == -1) return (-1); return (0); } int -parse_rrefresh(struct peer *peer) +parse_rrefresh(struct peer *peer, struct ibuf *msg) { struct route_refresh rr; - struct ibuf ibuf; uint16_t afi, datalen; uint8_t aid, safi, subtype; - u_char *p; - p = peer->rbuf->rptr; - p += MSGSIZE_HEADER_MARKER; - memcpy(&datalen, p, sizeof(datalen)); - datalen = ntohs(datalen); + datalen = ibuf_size(msg) + MSGSIZE_HEADER; - p = peer->rbuf->rptr; - p += MSGSIZE_HEADER; /* header is already checked */ - datalen -= MSGSIZE_HEADER; - - /* XXX */ - ibuf_from_buffer(&ibuf, p, datalen); - - if (ibuf_get_n16(&ibuf, &afi) == -1 || - ibuf_get_n8(&ibuf, &subtype) == -1 || - ibuf_get_n8(&ibuf, &safi) == -1) { + if (ibuf_get_n16(msg, &afi) == -1 || + ibuf_get_n8(msg, &subtype) == -1 || + ibuf_get_n8(msg, &safi) == -1) { /* minimum size checked in session_process_msg() */ fatalx("%s: message too small", __func__); } @@ -2417,7 +2427,7 @@ parse_rrefresh(struct peer *peer) datalen = htons(datalen); session_notification_data(peer, ERR_HEADER, ERR_HDR_LEN, &datalen, sizeof(datalen)); - bgp_fsm(peer, EVNT_CON_FATAL); + bgp_fsm(peer, EVNT_CON_FATAL, NULL); return (-1); } peer->stats.refresh_rcvd_req++; @@ -2429,10 +2439,10 @@ parse_rrefresh(struct peer *peer) log_peer_warnx(&peer->conf, "received RREFRESH: illegal len: %u byte", datalen); - ibuf_rewind(&ibuf); + ibuf_rewind(msg); session_notification(peer, ERR_RREFRESH, - ERR_RR_INV_LEN, &ibuf); - bgp_fsm(peer, EVNT_CON_FATAL); + ERR_RR_INV_LEN, msg); + bgp_fsm(peer, EVNT_CON_FATAL, NULL); return (-1); } if (subtype == ROUTE_REFRESH_BEGIN_RR) @@ -2473,38 +2483,40 @@ parse_rrefresh(struct peer *peer) } void -parse_notification(struct peer *peer) +parse_notification(struct peer *peer, struct ibuf *msg) { - struct ibuf ibuf; - u_char *p; - uint16_t datalen; - uint8_t errcode, subcode; - uint8_t reason_len; + const char *reason = "received"; + uint8_t errcode, subcode; + uint8_t reason_len; + enum session_events event = EVNT_RCVD_NOTIFICATION; - /* just log */ - p = peer->rbuf->rptr; - p += MSGSIZE_HEADER_MARKER; - memcpy(&datalen, p, sizeof(datalen)); - datalen = ntohs(datalen); - - p = peer->rbuf->rptr; - p += MSGSIZE_HEADER; /* header is already checked */ - datalen -= MSGSIZE_HEADER; - - /* XXX */ - ibuf_from_buffer(&ibuf, p, datalen); - - if (ibuf_get_n8(&ibuf, &errcode) == -1 || - ibuf_get_n8(&ibuf, &subcode) == -1) { + if (ibuf_get_n8(msg, &errcode) == -1 || + ibuf_get_n8(msg, &subcode) == -1) { log_peer_warnx(&peer->conf, "received bad notification"); goto done; } + /* RFC8538: check for hard-reset or graceful notification */ + if (peer->capa.neg.grestart.grnotification) { + if (errcode == ERR_CEASE && subcode == ERR_CEASE_HARD_RESET) { + if (ibuf_get_n8(msg, &errcode) == -1 || + ibuf_get_n8(msg, &subcode) == -1) { + log_peer_warnx(&peer->conf, + "received bad hard-reset notification"); + goto done; + } + reason = "received hard-reset"; + } else { + reason = "received graceful"; + event = EVNT_RCVD_GRACE_NOTIFICATION; + } + } + peer->errcnt++; peer->stats.last_rcvd_errcode = errcode; peer->stats.last_rcvd_suberr = subcode; - log_notification(peer, errcode, subcode, &ibuf, "received"); + log_notification(peer, errcode, subcode, msg, reason); CTASSERT(sizeof(peer->stats.last_reason) > UINT8_MAX); memset(peer->stats.last_reason, 0, sizeof(peer->stats.last_reason)); @@ -2512,8 +2524,8 @@ parse_notification(struct peer *peer) (subcode == ERR_CEASE_ADMIN_DOWN || subcode == ERR_CEASE_ADMIN_RESET)) { /* check if shutdown reason is included */ - if (ibuf_get_n8(&ibuf, &reason_len) != -1 && reason_len != 0) { - if (ibuf_get(&ibuf, peer->stats.last_reason, + if (ibuf_get_n8(msg, &reason_len) != -1 && reason_len != 0) { + if (ibuf_get(msg, peer->stats.last_reason, reason_len) == -1) log_peer_warnx(&peer->conf, "received truncated shutdown reason"); @@ -2521,7 +2533,7 @@ parse_notification(struct peer *peer) } done: - change_state(peer, STATE_IDLE, EVNT_RCVD_NOTIFICATION); + change_state(peer, STATE_IDLE, event); } int @@ -2570,6 +2582,9 @@ parse_capabilities(struct peer *peer, struct ibuf *buf, uint32_t *as) case CAPA_REFRESH: peer->capa.peer.refresh = 1; break; + case CAPA_EXT_MSG: + peer->capa.peer.ext_msg = 1; + break; case CAPA_ROLE: if (capa_len != 1 || ibuf_get_n8(&capabuf, &role) == -1) { @@ -2639,6 +2654,8 @@ parse_capabilities(struct peer *peer, struct ibuf *buf, uint32_t *as) CAPA_GR_RESTART; peer->capa.peer.grestart.restart = 2; } + if (gr_header & CAPA_GR_N_FLAG) + peer->capa.peer.grestart.grnotification = 1; break; case CAPA_AS4BYTE: if (capa_len != 4 || @@ -2717,6 +2734,8 @@ capa_neg_calc(struct peer *p) (p->capa.ann.enhanced_rr && p->capa.peer.enhanced_rr) != 0; p->capa.neg.as4byte = (p->capa.ann.as4byte && p->capa.peer.as4byte) != 0; + p->capa.neg.ext_msg = + (p->capa.ann.ext_msg && p->capa.peer.ext_msg) != 0; /* MP: both side must agree on the AFI,SAFI pair */ if (p->capa.peer.mp[AID_UNSPEC]) @@ -2774,6 +2793,11 @@ capa_neg_calc(struct peer *p) if (p->capa.ann.grestart.restart == 0) p->capa.neg.grestart.restart = 0; + /* RFC 8538 graceful notification: both sides need to agree */ + p->capa.neg.grestart.grnotification = + (p->capa.ann.grestart.grnotification && + p->capa.peer.grestart.grnotification) != 0; + /* * ADD-PATH: set only those bits where both sides agree. * For this compare our send bit with the recv bit from the peer @@ -2855,6 +2879,12 @@ capa_neg_calc(struct peer *p) capa_len = 0; goto fail; } + /* enforce presence of other capabilities */ + if (p->capa.ann.ext_msg == 2 && p->capa.neg.ext_msg == 0) { + capa_code = CAPA_EXT_MSG; + capa_len = 0; + goto fail; + } if (p->capa.ann.enhanced_rr == 2 && p->capa.neg.enhanced_rr == 0) { capa_code = CAPA_ENHANCED_RR; capa_len = 0; @@ -2931,7 +2961,6 @@ session_dispatch_imsg(struct imsgbuf *imsgbuf, int idx, u_int *listener_cnt) struct listen_addr *la, *next, nla; struct session_dependon sdon; struct bgpd_config tconf; - size_t len; uint32_t peerid; int n, fd, depend_ok, restricted; uint16_t t; @@ -2957,12 +2986,14 @@ session_dispatch_imsg(struct imsgbuf *imsgbuf, int idx, u_int *listener_cnt) } if ((i = malloc(sizeof(struct imsgbuf))) == NULL) fatal(NULL); - imsg_init(i, fd); + if (imsgbuf_init(i, fd) == -1 || + imsgbuf_set_maxsize(i, MAX_BGPD_IMSGSIZE) == -1) + fatal(NULL); if (imsg_get_type(&imsg) == IMSG_SOCKET_CONN) { if (ibuf_rde) { log_warnx("Unexpected imsg connection " "to RDE received"); - msgbuf_clear(&ibuf_rde->w); + imsgbuf_clear(ibuf_rde); free(ibuf_rde); } ibuf_rde = i; @@ -2970,7 +3001,7 @@ session_dispatch_imsg(struct imsgbuf *imsgbuf, int idx, u_int *listener_cnt) if (ibuf_rde_ctl) { log_warnx("Unexpected imsg ctl " "connection to RDE received"); - msgbuf_clear(&ibuf_rde_ctl->w); + imsgbuf_clear(ibuf_rde_ctl); free(ibuf_rde_ctl); } ibuf_rde_ctl = i; @@ -3134,7 +3165,7 @@ session_dispatch_imsg(struct imsgbuf *imsgbuf, int idx, u_int *listener_cnt) if (!strcmp(p->conf.if_depend, sdon.ifname)) { if (depend_ok && !p->depend_ok) { p->depend_ok = depend_ok; - bgp_fsm(p, EVNT_START); + bgp_fsm(p, EVNT_START, NULL); } else if (!depend_ok && p->depend_ok) { p->depend_ok = depend_ok; session_stop(p, @@ -3152,7 +3183,7 @@ session_dispatch_imsg(struct imsgbuf *imsgbuf, int idx, u_int *listener_cnt) break; } - if ((xmrt.wbuf.fd = imsg_get_fd(&imsg)) == -1) { + if ((xmrt.fd = imsg_get_fd(&imsg)) == -1) { log_warnx("expected to receive fd for mrt dump " "but didn't receive any"); break; @@ -3165,13 +3196,14 @@ session_dispatch_imsg(struct imsgbuf *imsgbuf, int idx, u_int *listener_cnt) if (mrt == NULL) fatal("session_dispatch_imsg"); memcpy(mrt, &xmrt, sizeof(struct mrt)); - msgbuf_init(&mrt->wbuf); + if ((mrt->wbuf = msgbuf_new()) == NULL) + fatal("session_dispatch_imsg"); LIST_INSERT_HEAD(&mrthead, mrt, entry); } else { /* old dump reopened */ - close(mrt->wbuf.fd); + close(mrt->fd); } - mrt->wbuf.fd = xmrt.wbuf.fd; + mrt->fd = xmrt.fd; break; case IMSG_MRT_CLOSE: if (idx != PFD_PIPE_MAIN) @@ -3221,11 +3253,8 @@ session_dispatch_imsg(struct imsgbuf *imsgbuf, int idx, u_int *listener_cnt) case IMSG_UPDATE: if (idx != PFD_PIPE_ROUTE) fatalx("update request not from RDE"); - len = imsg_get_len(&imsg); - if (imsg_get_ibuf(&imsg, &ibuf) == -1 || - len > MAX_PKTSIZE - MSGSIZE_HEADER || - len < MSGSIZE_UPDATE_MIN - MSGSIZE_HEADER) - log_warnx("RDE sent invalid update"); + if (imsg_get_ibuf(&imsg, &ibuf) == -1) + log_warn("RDE sent invalid update"); else session_update(peerid, &ibuf); break; @@ -3253,18 +3282,18 @@ session_dispatch_imsg(struct imsgbuf *imsgbuf, int idx, u_int *listener_cnt) if (subcode == ERR_CEASE_MAX_PREFIX) t = p->conf.max_prefix_restart; - bgp_fsm(p, EVNT_STOP); + bgp_fsm(p, EVNT_STOP, NULL); if (t) timer_set(&p->timers, Timer_IdleHold, 60 * t); break; default: - bgp_fsm(p, EVNT_CON_FATAL); + bgp_fsm(p, EVNT_CON_FATAL, NULL); break; } break; default: - bgp_fsm(p, EVNT_CON_FATAL); + bgp_fsm(p, EVNT_CON_FATAL, NULL); break; } break; @@ -3413,10 +3442,13 @@ getpeerbyip(struct bgpd_config *c, struct sockaddr *ip) session_template_clone(newpeer, ip, id, 0); newpeer->state = newpeer->prev_state = STATE_NONE; newpeer->reconf_action = RECONF_KEEP; - newpeer->rbuf = NULL; newpeer->rpending = 0; + newpeer->wbuf = NULL; init_peer(newpeer); - bgp_fsm(newpeer, EVNT_START); + /* start delete timer, it is stopped when session goes up. */ + timer_set(&newpeer->timers, Timer_SessionDown, + INTERVAL_SESSION_DOWN); + bgp_fsm(newpeer, EVNT_START, NULL); if (RB_INSERT(peer_head, &c->peers, newpeer) != NULL) fatalx("%s: peer tree is corrupt", __func__); return (newpeer); @@ -3504,6 +3536,9 @@ session_down(struct peer *peer) { memset(&peer->capa.neg, 0, sizeof(peer->capa.neg)); peer->stats.last_updown = getmonotime(); + + timer_set(&peer->timers, Timer_SessionDown, INTERVAL_SESSION_DOWN); + /* * session_down is called in the exit code path so check * if the RDE is still around, if not there is no need to @@ -3527,9 +3562,15 @@ session_up(struct peer *p) p->stats.last_rcvd_suberr = 0; memset(p->stats.last_reason, 0, sizeof(p->stats.last_reason)); - if (imsg_rde(IMSG_SESSION_ADD, p->conf.id, - &p->conf, sizeof(p->conf)) == -1) - fatalx("imsg_compose error"); + timer_stop(&p->timers, Timer_SessionDown); + + if (!p->rdesession) { + /* inform rde about new peer */ + if (imsg_rde(IMSG_SESSION_ADD, p->conf.id, + &p->conf, sizeof(p->conf)) == -1) + fatalx("imsg_compose error"); + p->rdesession = 1; + } if (p->local.aid == AID_INET) { sup.local_v4_addr = p->local; @@ -3644,7 +3685,7 @@ session_stop(struct peer *peer, uint8_t subcode, const char *reason) break; } ibuf_free(ibuf); - bgp_fsm(peer, EVNT_STOP); + bgp_fsm(peer, EVNT_STOP, NULL); } struct bgpd_addr * @@ -3697,10 +3738,15 @@ merge_peers(struct bgpd_config *c, struct bgpd_config *nc) imsg_compose(ibuf_main, IMSG_PFKEY_RELOAD, p->conf.id, 0, -1, NULL, 0); - /* sync the RDE in case we keep the peer */ - if (imsg_rde(IMSG_SESSION_ADD, p->conf.id, - &p->conf, sizeof(struct peer_config)) == -1) - fatalx("imsg_compose error"); + /* + * If the session is established or the SessionDown timer is + * running sync with the RDE + */ + if (p->rdesession) { + if (imsg_rde(IMSG_SESSION_ADD, p->conf.id, + &p->conf, sizeof(struct peer_config)) == -1) + fatalx("imsg_compose error"); + } /* apply the config to all clones of a template */ if (p->conf.template) { @@ -3710,9 +3756,13 @@ merge_peers(struct bgpd_config *c, struct bgpd_config *nc) continue; session_template_clone(xp, NULL, xp->conf.id, xp->conf.remote_as); - if (imsg_rde(IMSG_SESSION_ADD, xp->conf.id, - &xp->conf, sizeof(xp->conf)) == -1) - fatalx("imsg_compose error"); + + if (p->rdesession) { + if (imsg_rde(IMSG_SESSION_ADD, + xp->conf.id, &xp->conf, + sizeof(xp->conf)) == -1) + fatalx("imsg_compose error"); + } } } } diff --git a/usr.sbin/bgpd/session.h b/usr.sbin/bgpd/session.h index 38c624cb8..30e896172 100644 --- a/usr.sbin/bgpd/session.h +++ b/usr.sbin/bgpd/session.h @@ -1,4 +1,4 @@ -/* $OpenBSD: session.h,v 1.174 2024/10/01 11:49:24 claudio Exp $ */ +/* $OpenBSD: session.h,v 1.184 2024/12/16 16:10:10 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -25,8 +25,9 @@ #define INTERVAL_HOLD_INITIAL 240 #define INTERVAL_HOLD 90 #define INTERVAL_IDLE_HOLD_INITIAL 30 -#define INTERVAL_HOLD_CLONED 3600 #define INTERVAL_HOLD_DEMOTED 60 +#define INTERVAL_STALE 180 +#define INTERVAL_SESSION_DOWN 3600 #define MAX_IDLE_HOLD 3600 #define MSGSIZE_HEADER 19 #define MSGSIZE_HEADER_MARKER 16 @@ -64,15 +65,16 @@ enum session_events { EVNT_RCVD_OPEN, EVNT_RCVD_KEEPALIVE, EVNT_RCVD_UPDATE, - EVNT_RCVD_NOTIFICATION + EVNT_RCVD_NOTIFICATION, + EVNT_RCVD_GRACE_NOTIFICATION, }; enum msg_type { - OPEN = 1, - UPDATE, - NOTIFICATION, - KEEPALIVE, - RREFRESH + MSG_OPEN = 1, + MSG_UPDATE, + MSG_NOTIFICATION, + MSG_KEEPALIVE, + MSG_RREFRESH }; enum suberr_header { @@ -106,12 +108,6 @@ enum opt_params { OPT_PARAM_EXT_LEN=255, }; -struct bgp_msg { - struct ibuf *buf; - enum msg_type type; - uint16_t len; -}; - struct bgpd_sysdep { uint8_t no_pfkey; uint8_t no_md5sig; @@ -182,6 +178,7 @@ enum Timer { Timer_IdleHoldReset, Timer_CarpUndemote, Timer_RestartTimeout, + Timer_SessionDown, Timer_Rtr_Refresh, Timer_Rtr_Retry, Timer_Rtr_Expire, @@ -212,8 +209,7 @@ struct peer { struct bgpd_addr local_alt; struct bgpd_addr remote; struct timer_head timers; - struct msgbuf wbuf; - struct ibuf_read *rbuf; + struct msgbuf *wbuf; struct peer *template; int fd; int lasterr; @@ -234,6 +230,7 @@ struct peer { uint8_t passive; uint8_t throttled; uint8_t rpending; + uint8_t rdesession; }; extern time_t pauseaccept; @@ -273,8 +270,8 @@ void log_conn_attempt(const struct peer *, struct sockaddr *, socklen_t); /* mrt.c */ -void mrt_dump_bgp_msg(struct mrt *, void *, uint16_t, - struct peer *, enum msg_type); +void mrt_dump_bgp_msg(struct mrt *, struct ibuf *, struct peer *, + enum msg_type); void mrt_dump_state(struct mrt *, uint16_t, uint16_t, struct peer *); void mrt_done(struct mrt *); @@ -331,7 +328,7 @@ void rtr_recalc(void); RB_PROTOTYPE(peer_head, peer, entry, peer_compare); void session_main(int, int); -void bgp_fsm(struct peer *, enum session_events); +void bgp_fsm(struct peer *, enum session_events, struct ibuf *); int session_neighbor_rrefresh(struct peer *p); struct peer *getpeerbydesc(struct bgpd_config *, const char *); struct peer *getpeerbyip(struct bgpd_config *, struct sockaddr *); diff --git a/usr.sbin/bgpd/util.c b/usr.sbin/bgpd/util.c index 257c7ad59..62c8557d5 100644 --- a/usr.sbin/bgpd/util.c +++ b/usr.sbin/bgpd/util.c @@ -1,4 +1,4 @@ -/* $OpenBSD: util.c,v 1.88 2024/09/30 12:54:12 claudio Exp $ */ +/* $OpenBSD: util.c,v 1.90 2025/01/07 19:24:53 claudio Exp $ */ /* * Copyright (c) 2006 Claudio Jeker @@ -32,22 +32,6 @@ #include "rde.h" #include "log.h" -char * -ibuf_get_string(struct ibuf *buf, size_t len) -{ - char *str; - - if (ibuf_size(buf) < len) { - errno = EBADMSG; - return (NULL); - } - str = strndup(ibuf_data(buf), len); - if (str == NULL) - return (NULL); - ibuf_skip(buf, len); - return (str); -} - const char * log_addr(const struct bgpd_addr *addr) { @@ -339,6 +323,8 @@ log_capability(uint8_t capa) return "Multiprotocol Extensions"; case CAPA_REFRESH: return "Route Refresh"; + case CAPA_EXT_MSG: + return "Extended Message"; case CAPA_ROLE: return "BGP Role"; case CAPA_RESTART: diff --git a/usr.sbin/bgpd/version.h b/usr.sbin/bgpd/version.h index feeea93ad..22a3876a4 100644 --- a/usr.sbin/bgpd/version.h +++ b/usr.sbin/bgpd/version.h @@ -1,3 +1,3 @@ -/* $OpenBSD: version.h,v 1.17 2024/09/05 20:28:42 claudio Exp $ */ +/* $OpenBSD: version.h,v 1.18 2024/12/16 16:14:46 claudio Exp $ */ -#define BGPD_VERSION "8.6" +#define BGPD_VERSION "8.7" diff --git a/usr.sbin/bgplgd/bgplgd.8 b/usr.sbin/bgplgd/bgplgd.8 index ce9a9d393..70a67339a 100644 --- a/usr.sbin/bgplgd/bgplgd.8 +++ b/usr.sbin/bgplgd/bgplgd.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: bgplgd.8,v 1.11 2024/09/19 08:55:22 claudio Exp $ +.\" $OpenBSD: bgplgd.8,v 1.12 2024/12/03 10:38:06 claudio Exp $ .\" .\" Copyright (c) 2021 Claudio Jeker .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: September 19 2024 $ +.Dd $Mdocdate: December 3 2024 $ .Dt BGPLGD 8 .Os .Sh NAME @@ -88,7 +88,8 @@ Show the version and exit. .Nm provides the following API endpoints. Unless further specified the endpoints do not take any parameters: -.Bl -tag -width Ds +.Pp +.Bl -tag -width "/interfaces" -compact .It Pa /interfaces Show the interface states. .It Pa /memory @@ -110,7 +111,17 @@ Show only entries from the specified peer group. .It Pa /nexthops Show the list of BGP nexthops and the result of their validity check. .It Pa /rib +.It Pa /rib/in +.It Pa /rib/out Show routes from the bgpd(8) Routing Information Base. +For +.Pa /rib/in +the +.Ar Adj-RIB-In +will be queried and for +.Pa /rib/out +the +.Ar Adj-RIB-out . The following parameters can be used to filter the output: .Pp .Bl -tag -width "neighbor=peer" -compact @@ -134,6 +145,9 @@ Show only entries that match the specified address family. .It Cm rib Ns = Ns Ar name Show only entries from the RIB with name .Ar name . +Can only be used with the +.Pa /rib +endpoint. .It Xo .Ic ovs Ns = Ns .Pq Ic valid | not-found | invalid diff --git a/usr.sbin/bgplgd/bgplgd.c b/usr.sbin/bgplgd/bgplgd.c index e66da1672..a807c2b52 100644 --- a/usr.sbin/bgplgd/bgplgd.c +++ b/usr.sbin/bgplgd/bgplgd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bgplgd.c,v 1.3 2022/10/17 15:42:19 claudio Exp $ */ +/* $OpenBSD: bgplgd.c,v 1.4 2024/12/03 10:38:06 claudio Exp $ */ /* * Copyright (c) 2020 Claudio Jeker * @@ -25,7 +25,7 @@ #include "bgplgd.h" -#define NCMDARGS 4 +#define NCMDARGS 5 #define OMETRIC_TYPE \ "application/openmetrics-text; version=1.0.0; charset=utf-8" @@ -41,6 +41,8 @@ const struct cmd { { "/neighbors", { "show", "neighbor", NULL }, QS_MASK_NEIGHBOR, 1 }, { "/nexthops", { "show", "nexthop", NULL }, 0 }, { "/rib", { "show", "rib", "detail", NULL }, QS_MASK_RIB }, + { "/rib/in", { "show", "rib", "in", "detail", NULL }, QS_MASK_ADJRIB }, + { "/rib/out", { "show", "rib", "out", "detail", NULL }, QS_MASK_ADJRIB }, { "/rtr", { "show", "rtr", NULL }, 0 }, { "/sets", { "show", "sets", NULL }, 0 }, { "/summary", { "show", NULL }, 0 }, diff --git a/usr.sbin/bgplgd/bgplgd.h b/usr.sbin/bgplgd/bgplgd.h index 4cf62b73a..c74d9ceda 100644 --- a/usr.sbin/bgplgd/bgplgd.h +++ b/usr.sbin/bgplgd/bgplgd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: bgplgd.h,v 1.4 2024/08/15 09:13:13 claudio Exp $ */ +/* $OpenBSD: bgplgd.h,v 1.5 2024/12/03 10:38:06 claudio Exp $ */ /* * Copyright (c) 2020 Claudio Jeker * @@ -35,17 +35,19 @@ #define QS_FILTERED 18 #define QS_MAX 19 -/* too add: empty-as, in, out, peer-as, source-as, transit-as */ +/* too add: empty-as, peer-as, source-as, transit-as */ #define QS_MASK_NEIGHBOR ((1 << QS_NEIGHBOR) | (1 << QS_GROUP)) -#define QS_MASK_RIB \ +#define QS_MASK_ADJRIB \ ((1 << QS_NEIGHBOR) | (1 << QS_GROUP) | (1 << QS_AS) | \ (1 << QS_PREFIX) | (1 << QS_COMMUNITY) | \ (1 << QS_EXTCOMMUNITY) | (1 << QS_LARGECOMMUNITY) | \ - (1 << QS_AF) | (1 << QS_RIB) | (1 << QS_OVS) | \ - (1 << QS_BEST) | (1 << QS_ALL) | (1 << QS_SHORTER) | \ - (1 << QS_ERROR) | (1 << QS_AVS) | (1 << QS_INVALID) | \ - (1 << QS_LEAKED) | (1 << QS_FILTERED)) + (1 << QS_AF) | (1 << QS_OVS) | (1 << QS_BEST) | \ + (1 << QS_ALL) | (1 << QS_SHORTER) | (1 << QS_ERROR) | \ + (1 << QS_AVS) | (1 << QS_INVALID) | (1 << QS_LEAKED) | \ + (1 << QS_FILTERED)) + +#define QS_MASK_RIB (QS_MASK_ADJRIB | (1 << QS_RIB)) struct cmd; struct lg_ctx { diff --git a/usr.sbin/bgplgd/qs.c b/usr.sbin/bgplgd/qs.c index ee865810f..7dde70108 100644 --- a/usr.sbin/bgplgd/qs.c +++ b/usr.sbin/bgplgd/qs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: qs.c,v 1.6 2024/08/15 09:13:13 claudio Exp $ */ +/* $OpenBSD: qs.c,v 1.7 2024/12/03 10:38:06 claudio Exp $ */ /* * Copyright (c) 2020 Claudio Jeker * @@ -367,7 +367,7 @@ qs_argv(char **argv, size_t argc, size_t len, struct lg_ctx *ctx, int barenbr) } if (ctx->qs_set & (1 << QS_RIB)) { if (argc < len) - argv[argc++] = "rib"; + argv[argc++] = "table"; if (argc < len) argv[argc++] = ctx->qs_args[QS_RIB].string; } diff --git a/usr.sbin/btrace/bt_parse.y b/usr.sbin/btrace/bt_parse.y index 2497ae4ea..6e23b7bcd 100644 --- a/usr.sbin/btrace/bt_parse.y +++ b/usr.sbin/btrace/bt_parse.y @@ -1,4 +1,4 @@ -/* $OpenBSD: bt_parse.y,v 1.60 2024/03/30 07:41:45 mpi Exp $ */ +/* $OpenBSD: bt_parse.y,v 1.61 2024/11/07 09:20:09 mpi Exp $ */ /* * Copyright (c) 2019-2023 Martin Pieuchot @@ -793,15 +793,10 @@ allowed_in_string(int x) return (isalnum(x) || x == '_'); } -int -yylex(void) +static int +skip(void) { - unsigned char buf[1024]; - unsigned char *ebuf, *p, *str; - int c; - - ebuf = buf + sizeof(buf); - p = buf; + int c; again: /* skip whitespaces */ @@ -838,6 +833,22 @@ again: } } + return c; +} + +int +yylex(void) +{ + unsigned char buf[1024]; + unsigned char *ebuf, *p, *str; + int c; + + ebuf = buf + sizeof(buf); + p = buf; + +again: + c = skip(); + switch (c) { case '!': case '=': @@ -962,7 +973,16 @@ again: return 0; case '"': /* parse C-like string */ - while ((c = lgetc()) != EOF && c != '"') { + while ((c = lgetc()) != EOF) { + if (c == '"') { + /* handle multi-line strings */ + c = skip(); + if (c == '"') + continue; + else + lungetc(); + break; + } if (c == '\\') { c = lgetc(); switch (c) { diff --git a/usr.sbin/btrace/btrace.c b/usr.sbin/btrace/btrace.c index aa75a12f6..7c2e3dcdc 100644 --- a/usr.sbin/btrace/btrace.c +++ b/usr.sbin/btrace/btrace.c @@ -1,4 +1,4 @@ -/* $OpenBSD: btrace.c,v 1.92 2024/07/09 16:08:30 mpi Exp $ */ +/* $OpenBSD: btrace.c,v 1.94 2024/12/04 09:33:41 mpi Exp $ */ /* * Copyright (c) 2019 - 2023 Martin Pieuchot @@ -69,6 +69,8 @@ struct dtioc_probe_info *dtpi_get_by_value(const char *, const char *, /* * Main loop and rule evaluation. */ +void probe_bail(struct bt_probe *); +const char *probe_name(struct bt_probe *); void rules_do(int); int rules_setup(int); int rules_apply(int, struct dt_evt *); @@ -106,7 +108,6 @@ int ba2dtflags(struct bt_arg *); __dead void xabort(const char *, ...); void debug(const char *, ...); void debugx(const char *, ...); -const char *debug_probe_name(struct bt_probe *); void debug_dump_term(struct bt_arg *); void debug_dump_expr(struct bt_arg *); void debug_dump_filter(struct bt_rule *); @@ -399,6 +400,37 @@ dtpi_get_by_value(const char *prov, const char *func, const char *name) return NULL; } +void +probe_bail(struct bt_probe *bp) +{ + errx(1, "Cannot register multiple probes of the same type: '%s'", + probe_name(bp)); +} + +const char * +probe_name(struct bt_probe *bp) +{ + static char buf[64]; + + if (bp->bp_type == B_PT_BEGIN) + return "BEGIN"; + + if (bp->bp_type == B_PT_END) + return "END"; + + assert(bp->bp_type == B_PT_PROBE); + + if (bp->bp_rate) { + snprintf(buf, sizeof(buf), "%s:%s:%u", bp->bp_prov, + bp->bp_unit, bp->bp_rate); + } else { + snprintf(buf, sizeof(buf), "%s:%s:%s", bp->bp_prov, + bp->bp_unit, bp->bp_name); + } + + return buf; +} + void rules_do(int fd) { @@ -452,6 +484,10 @@ rules_do(int fd) fprintf(stderr, "%llu events read\n", dtst.dtst_readevt); fprintf(stderr, "%llu events dropped\n", dtst.dtst_dropevt); fprintf(stderr, "%llu events filtered\n", bt_filtered); + fprintf(stderr, "%llu clock ticks skipped\n", + dtst.dtst_skiptick); + fprintf(stderr, "%llu recursive events dropped\n", + dtst.dtst_recurevt); } } @@ -493,7 +529,7 @@ rules_setup(int fd) { struct dtioc_probe_info *dtpi; struct dtioc_req *dtrq; - struct bt_rule *r, *rbegin = NULL; + struct bt_rule *r, *rbegin = NULL, *rend = NULL; struct bt_probe *bp; struct bt_stmt *bs; struct bt_arg *ba; @@ -515,12 +551,20 @@ rules_setup(int fd) evtflags |= rules_action_scan(SLIST_FIRST(&r->br_action)); SLIST_FOREACH(bp, &r->br_probes, bp_next) { - debug("parsed probe '%s'", debug_probe_name(bp)); + debug("parsed probe '%s'", probe_name(bp)); debug_dump_filter(r); if (bp->bp_type != B_PT_PROBE) { - if (bp->bp_type == B_PT_BEGIN) + if (bp->bp_type == B_PT_BEGIN) { + if (rbegin != NULL) + probe_bail(bp); rbegin = r; + } + if (bp->bp_type == B_PT_END) { + if (rend != NULL) + probe_bail(bp); + rend = r; + } continue; } @@ -566,8 +610,11 @@ rules_setup(int fd) continue; dtrq = bp->bp_cookie; - if (ioctl(fd, DTIOCPRBENABLE, dtrq)) + if (ioctl(fd, DTIOCPRBENABLE, dtrq)) { + if (errno == EEXIST) + probe_bail(bp); err(1, "DTIOCPRBENABLE"); + } } } @@ -658,7 +705,7 @@ rule_eval(struct bt_rule *r, struct dt_evt *dtev) struct bt_probe *bp; SLIST_FOREACH(bp, &r->br_probes, bp_next) { - debug("eval rule '%s'", debug_probe_name(bp)); + debug("eval rule '%s'", probe_name(bp)); debug_dump_filter(r); } @@ -2037,33 +2084,6 @@ debug_dump_filter(struct bt_rule *r) debugx("/\n"); } -const char * -debug_probe_name(struct bt_probe *bp) -{ - static char buf[64]; - - if (verbose < 2) - return ""; - - if (bp->bp_type == B_PT_BEGIN) - return "BEGIN"; - - if (bp->bp_type == B_PT_END) - return "END"; - - assert(bp->bp_type == B_PT_PROBE); - - if (bp->bp_rate) { - snprintf(buf, sizeof(buf), "%s:%s:%u", bp->bp_prov, - bp->bp_unit, bp->bp_rate); - } else { - snprintf(buf, sizeof(buf), "%s:%s:%s", bp->bp_prov, - bp->bp_unit, bp->bp_name); - } - - return buf; -} - unsigned long dt_get_offset(pid_t pid) { diff --git a/usr.sbin/config/mkswap.c b/usr.sbin/config/mkswap.c index f4a726fbb..c3746e244 100644 --- a/usr.sbin/config/mkswap.c +++ b/usr.sbin/config/mkswap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mkswap.c,v 1.19 2021/11/28 19:26:03 deraadt Exp $ */ +/* $OpenBSD: mkswap.c,v 1.21 2024/10/30 07:28:17 jsg Exp $ */ /* $NetBSD: mkswap.c,v 1.5 1996/08/31 20:58:27 mycroft Exp $ */ /* @@ -97,7 +97,6 @@ mkoneswap(struct config *cf) } if (fputs("\ #include \n\ -#include \n\ #include \n\n", fp) == EOF) goto wrerror; nv = cf->cf_root; @@ -108,13 +107,13 @@ mkoneswap(struct config *cf) if (fprintf(fp, "dev_t\tdumpdev = %s;\t/* %s */\n", mkdevstr(nv->nv_int), nv->nv_str) < 0) goto wrerror; - if (fputs("\nstruct\tswdevt swdevt[] = {\n", fp) == EOF) + if (fputs("\ndev_t\tswdevt[] = {\n", fp) == EOF) goto wrerror; for (nv = cf->cf_swap; nv != NULL; nv = nv->nv_next) - if (fprintf(fp, "\t{ %s,\t0 },\t/* %s */\n", + if (fprintf(fp, "\t%s,\t/* %s */\n", mkdevstr(nv->nv_int), nv->nv_str) < 0) goto wrerror; - if (fputs("\t{ NODEV, 0 }\n};\n\n", fp) == EOF) + if (fputs("\tNODEV\n};\n\n", fp) == EOF) goto wrerror; mountroot = cf->cf_root->nv_str == s_nfs ? "nfs_mountroot" : "dk_mountroot"; diff --git a/usr.sbin/dhcp6leasectl/dhcp6leasectl.c b/usr.sbin/dhcp6leasectl/dhcp6leasectl.c index 9398612e8..e752a7ab1 100644 --- a/usr.sbin/dhcp6leasectl/dhcp6leasectl.c +++ b/usr.sbin/dhcp6leasectl/dhcp6leasectl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dhcp6leasectl.c,v 1.1 2024/06/06 15:16:57 florian Exp $ */ +/* $OpenBSD: dhcp6leasectl.c,v 1.6 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2021, 2024 Florian Obser @@ -122,14 +122,14 @@ main(int argc, char *argv[]) if ((ibuf = malloc(sizeof(struct imsgbuf))) == NULL) err(1, NULL); - imsg_init(ibuf, ctl_sock); + if (imsgbuf_init(ibuf, ctl_sock) == -1) + err(1, NULL); if (!lFlag) { imsg_compose(ibuf, IMSG_CTL_SEND_REQUEST, 0, 0, -1, &if_index, sizeof(if_index)); - while (ibuf->w.queued) - if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN) - err(1, "write error"); + if (imsgbuf_flush(ibuf) == -1) + err(1, "write error"); } @@ -137,13 +137,11 @@ main(int argc, char *argv[]) imsg_compose(ibuf, IMSG_CTL_SHOW_INTERFACE_INFO, 0, 0, -1, &if_index, sizeof(if_index)); - while (ibuf->w.queued) - if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN) - err(1, "write error"); + if (imsgbuf_flush(ibuf) == -1) + err(1, "write error"); - - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - errx(1, "imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + err(1, "read error"); if (n == 0) errx(1, "pipe closed"); diff --git a/usr.sbin/dhcpleasectl/dhcpleasectl.c b/usr.sbin/dhcpleasectl/dhcpleasectl.c index 6b2627785..b31e3b553 100644 --- a/usr.sbin/dhcpleasectl/dhcpleasectl.c +++ b/usr.sbin/dhcpleasectl/dhcpleasectl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dhcpleasectl.c,v 1.8 2024/06/06 15:07:46 florian Exp $ */ +/* $OpenBSD: dhcpleasectl.c,v 1.13 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2021 Florian Obser @@ -156,14 +156,14 @@ main(int argc, char *argv[]) if ((ibuf = malloc(sizeof(struct imsgbuf))) == NULL) err(1, NULL); - imsg_init(ibuf, ctl_sock); + if (imsgbuf_init(ibuf, ctl_sock) == -1) + err(1, NULL); if (!lFlag) { imsg_compose(ibuf, IMSG_CTL_SEND_REQUEST, 0, 0, -1, &if_index, sizeof(if_index)); - while (ibuf->w.queued) - if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN) - err(1, "write error"); + if (imsgbuf_flush(ibuf) == -1) + err(1, "write error"); } @@ -171,13 +171,11 @@ main(int argc, char *argv[]) imsg_compose(ibuf, IMSG_CTL_SHOW_INTERFACE_INFO, 0, 0, -1, &if_index, sizeof(if_index)); - while (ibuf->w.queued) - if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN) - err(1, "write error"); + if (imsgbuf_flush(ibuf) == -1) + err(1, "write error"); - - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - errx(1, "imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + err(1, "read error"); if (n == 0) errx(1, "pipe closed"); diff --git a/usr.sbin/dvmrpctl/dvmrpctl.c b/usr.sbin/dvmrpctl/dvmrpctl.c index e805e7726..d603fb71d 100644 --- a/usr.sbin/dvmrpctl/dvmrpctl.c +++ b/usr.sbin/dvmrpctl/dvmrpctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dvmrpctl.c,v 1.16 2022/01/20 14:10:07 naddy Exp $ */ +/* $OpenBSD: dvmrpctl.c,v 1.21 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2005 Claudio Jeker @@ -100,7 +100,8 @@ main(int argc, char *argv[]) if ((ibuf = malloc(sizeof(struct imsgbuf))) == NULL) fatal(NULL); - imsg_init(ibuf, ctl_sock); + if (imsgbuf_init(ibuf, ctl_sock) == -1) + fatal(NULL); done = 0; /* process user request */ @@ -173,13 +174,12 @@ main(int argc, char *argv[]) break; } - while (ibuf->w.queued) - if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN) - err(1, "write error"); + if (imsgbuf_flush(ibuf) == -1) + err(1, "write error"); while (!done) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - errx(1, "imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + err(1, "read error"); if (n == 0) errx(1, "pipe closed"); diff --git a/usr.sbin/dvmrpd/control.c b/usr.sbin/dvmrpd/control.c index 08516168d..53926253b 100644 --- a/usr.sbin/dvmrpd/control.c +++ b/usr.sbin/dvmrpd/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.25 2023/03/08 04:43:13 guenther Exp $ */ +/* $OpenBSD: control.c,v 1.31 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -152,7 +152,13 @@ control_accept(int listenfd, short event, void *bula) return; } - imsg_init(&c->iev.ibuf, connfd); + if (imsgbuf_init(&c->iev.ibuf, connfd) == -1) { + log_warn("control_accept"); + close(connfd); + free(c); + return; + } + c->iev.handler = control_dispatch_imsg; c->iev.events = EV_READ; event_set(&c->iev.ev, c->iev.ibuf.fd, c->iev.events, @@ -198,7 +204,7 @@ control_close(int fd) return; } - msgbuf_clear(&c->iev.ibuf.w); + imsgbuf_clear(&c->iev.ibuf); TAILQ_REMOVE(&ctl_conns, c, entry); event_del(&c->iev.ev); @@ -228,14 +234,13 @@ control_dispatch_imsg(int fd, short event, void *bula) } if (event & EV_READ) { - if (((n = imsg_read(&c->iev.ibuf)) == -1 && errno != EAGAIN) || - n == 0) { + if (imsgbuf_read(&c->iev.ibuf) != 1) { control_close(fd); return; } } if (event & EV_WRITE) { - if (msgbuf_write(&c->iev.ibuf.w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(&c->iev.ibuf) == -1) { control_close(fd); return; } diff --git a/usr.sbin/dvmrpd/dvmrpd.c b/usr.sbin/dvmrpd/dvmrpd.c index df7b93615..8aa4cc5ff 100644 --- a/usr.sbin/dvmrpd/dvmrpd.c +++ b/usr.sbin/dvmrpd/dvmrpd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dvmrpd.c,v 1.27 2021/01/19 12:29:46 claudio Exp $ */ +/* $OpenBSD: dvmrpd.c,v 1.34 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2005 Claudio Jeker @@ -234,8 +234,9 @@ main(int argc, char *argv[]) if ((iev_dvmrpe = malloc(sizeof(struct imsgev))) == NULL || (iev_rde = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_dvmrpe->ibuf, pipe_parent2dvmrpe[0]); - imsg_init(&iev_rde->ibuf, pipe_parent2rde[0]); + if (imsgbuf_init(&iev_dvmrpe->ibuf, pipe_parent2dvmrpe[0]) == -1 || + imsgbuf_init(&iev_rde->ibuf, pipe_parent2rde[0]) == -1) + fatal(NULL); iev_dvmrpe->handler = main_dispatch_dvmrpe; iev_rde->handler = main_dispatch_rde; @@ -274,9 +275,9 @@ dvmrpd_shutdown(void) int status; /* close pipes */ - msgbuf_clear(&iev_dvmrpe->ibuf.w); + imsgbuf_clear(&iev_dvmrpe->ibuf); close(iev_dvmrpe->ibuf.fd); - msgbuf_clear(&iev_rde->ibuf.w); + imsgbuf_clear(&iev_rde->ibuf); close(iev_rde->ibuf.fd); control_cleanup(); @@ -317,16 +318,18 @@ main_dispatch_dvmrpe(int fd, short event, void *bula) int shut = 0, verbose; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -379,16 +382,18 @@ main_dispatch_rde(int fd, short event, void *bula) int shut = 0; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -447,7 +452,7 @@ void imsg_event_add(struct imsgev *iev) { iev->events = EV_READ; - if (iev->ibuf.w.queued) + if (imsgbuf_queuelen(&iev->ibuf) > 0) iev->events |= EV_WRITE; event_del(&iev->ev); diff --git a/usr.sbin/dvmrpd/dvmrpe.c b/usr.sbin/dvmrpd/dvmrpe.c index 17071a5bc..5b8862f95 100644 --- a/usr.sbin/dvmrpd/dvmrpe.c +++ b/usr.sbin/dvmrpd/dvmrpe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dvmrpe.c,v 1.24 2024/04/23 13:34:51 jsg Exp $ */ +/* $OpenBSD: dvmrpe.c,v 1.30 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2005 Claudio Jeker @@ -143,10 +143,12 @@ dvmrpe(struct dvmrpd_conf *xconf, int pipe_parent2dvmrpe[2], if ((iev_rde = malloc(sizeof(struct imsgev))) == NULL || (iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_rde->ibuf, pipe_dvmrpe2rde[0]); + if (imsgbuf_init(&iev_rde->ibuf, pipe_dvmrpe2rde[0]) == -1) + fatal(NULL); iev_rde->handler = dvmrpe_dispatch_rde; - imsg_init(&iev_main->ibuf, pipe_parent2dvmrpe[1]); + if (imsgbuf_init(&iev_main->ibuf, pipe_parent2dvmrpe[1]) == -1) + fatal(NULL); iev_main->handler = dvmrpe_dispatch_main; /* setup event handler */ @@ -191,11 +193,11 @@ dvmrpe_shutdown(void) struct iface *iface; /* close pipes */ - msgbuf_write(&iev_rde->ibuf.w); - msgbuf_clear(&iev_rde->ibuf.w); + imsgbuf_write(&iev_rde->ibuf); + imsgbuf_clear(&iev_rde->ibuf); close(iev_rde->ibuf.fd); - msgbuf_write(&iev_main->ibuf.w); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_write(&iev_main->ibuf); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); /* stop all interfaces and delete them */ @@ -241,21 +243,23 @@ dvmrpe_dispatch_main(int fd, short event, void *bula) int shut = 0, link_ok; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { if ((n = imsg_get(ibuf, &imsg)) == -1) - fatal("dvmrpe_dispatch_main: imsg_read error"); + fatal("dvmrpe_dispatch_main: imsg_get error"); if (n == 0) break; @@ -315,21 +319,23 @@ dvmrpe_dispatch_rde(int fd, short event, void *bula) int shut = 0; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { if ((n = imsg_get(ibuf, &imsg)) == -1) - fatal("dvmrpe_dispatch_rde: imsg_read error"); + fatal("dvmrpe_dispatch_rde: imsgbuf_get error"); if (n == 0) break; diff --git a/usr.sbin/dvmrpd/kroute.c b/usr.sbin/dvmrpd/kroute.c index ac4376046..e1a6bbf76 100644 --- a/usr.sbin/dvmrpd/kroute.c +++ b/usr.sbin/dvmrpd/kroute.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kroute.c,v 1.14 2017/07/24 11:00:01 friehm Exp $ */ +/* $OpenBSD: kroute.c,v 1.15 2025/01/02 06:35:57 anton Exp $ */ /* * Copyright (c) 2004 Esben Norby @@ -269,7 +269,8 @@ if_announce(void *msg) break; case IFAN_DEPARTURE: kif = kif_find(ifan->ifan_index); - kif_remove(kif); + if (kif != NULL) + kif_remove(kif); break; } } diff --git a/usr.sbin/dvmrpd/rde.c b/usr.sbin/dvmrpd/rde.c index d2defcf9b..3929cf5e8 100644 --- a/usr.sbin/dvmrpd/rde.c +++ b/usr.sbin/dvmrpd/rde.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rde.c,v 1.33 2024/02/26 09:50:42 jsg Exp $ */ +/* $OpenBSD: rde.c,v 1.39 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2004, 2005 Claudio Jeker @@ -123,10 +123,12 @@ rde(struct dvmrpd_conf *xconf, int pipe_parent2rde[2], int pipe_dvmrpe2rde[2], (iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_dvmrpe->ibuf, pipe_dvmrpe2rde[1]); + if (imsgbuf_init(&iev_dvmrpe->ibuf, pipe_dvmrpe2rde[1]) == -1) + fatal(NULL); iev_dvmrpe->handler = rde_dispatch_imsg; - imsg_init(&iev_main->ibuf, pipe_parent2rde[1]); + if (imsgbuf_init(&iev_main->ibuf, pipe_parent2rde[1]) == -1) + fatal(NULL); iev_main->handler = rde_dispatch_imsg; /* setup event handler */ @@ -156,9 +158,9 @@ rde_shutdown(void) struct iface *iface; /* close pipes */ - msgbuf_clear(&iev_dvmrpe->ibuf.w); + imsgbuf_clear(&iev_dvmrpe->ibuf); close(iev_dvmrpe->ibuf.fd); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); rt_clear(); @@ -206,16 +208,18 @@ rde_dispatch_imsg(int fd, short event, void *bula) struct iface *iface; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { diff --git a/usr.sbin/eigrpctl/eigrpctl.c b/usr.sbin/eigrpctl/eigrpctl.c index c7c4baa03..521ccb948 100644 --- a/usr.sbin/eigrpctl/eigrpctl.c +++ b/usr.sbin/eigrpctl/eigrpctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: eigrpctl.c,v 1.9 2017/02/22 14:18:25 renato Exp $ */ +/* $OpenBSD: eigrpctl.c,v 1.14 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2015 Renato Westphal @@ -121,7 +121,8 @@ main(int argc, char *argv[]) if ((ibuf = malloc(sizeof(struct imsgbuf))) == NULL) err(1, NULL); - imsg_init(ibuf, ctl_sock); + if (imsgbuf_init(ibuf, ctl_sock) == -1) + err(1, NULL); done = 0; /* process user request */ @@ -217,13 +218,12 @@ main(int argc, char *argv[]) break; } - while (ibuf->w.queued) - if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN) - err(1, "write error"); + if (imsgbuf_flush(ibuf) == -1) + err(1, "write error"); while (!done) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - errx(1, "imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + err(1, "read error"); if (n == 0) errx(1, "pipe closed"); diff --git a/usr.sbin/eigrpd/control.c b/usr.sbin/eigrpd/control.c index c825a4e5c..f525c80d5 100644 --- a/usr.sbin/eigrpd/control.c +++ b/usr.sbin/eigrpd/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.10 2023/03/08 04:43:13 guenther Exp $ */ +/* $OpenBSD: control.c,v 1.16 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -144,7 +144,12 @@ control_accept(int listenfd, short event, void *bula) return; } - imsg_init(&c->iev.ibuf, connfd); + if (imsgbuf_init(&c->iev.ibuf, connfd) == -1) { + log_warn("%s: imsgbuf_init", __func__); + close(connfd); + free(c); + return; + } c->iev.handler = control_dispatch_imsg; c->iev.events = EV_READ; event_set(&c->iev.ev, c->iev.ibuf.fd, c->iev.events, @@ -190,7 +195,7 @@ control_close(int fd) return; } - msgbuf_clear(&c->iev.ibuf.w); + imsgbuf_clear(&c->iev.ibuf); TAILQ_REMOVE(&ctl_conns, c, entry); event_del(&c->iev.ev); @@ -220,14 +225,13 @@ control_dispatch_imsg(int fd, short event, void *bula) } if (event & EV_READ) { - if (((n = imsg_read(&c->iev.ibuf)) == -1 && errno != EAGAIN) || - n == 0) { + if (imsgbuf_read(&c->iev.ibuf) != 1) { control_close(fd); return; } } if (event & EV_WRITE) { - if (msgbuf_write(&c->iev.ibuf.w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(&c->iev.ibuf) == -1) { control_close(fd); return; } diff --git a/usr.sbin/eigrpd/eigrpd.c b/usr.sbin/eigrpd/eigrpd.c index 3187b925f..1edf2354c 100644 --- a/usr.sbin/eigrpd/eigrpd.c +++ b/usr.sbin/eigrpd/eigrpd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: eigrpd.c,v 1.29 2023/03/08 04:43:13 guenther Exp $ */ +/* $OpenBSD: eigrpd.c,v 1.36 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2015 Renato Westphal @@ -240,9 +240,13 @@ main(int argc, char *argv[]) if ((iev_eigrpe = malloc(sizeof(struct imsgev))) == NULL || (iev_rde = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_eigrpe->ibuf, pipe_parent2eigrpe[0]); + if (imsgbuf_init(&iev_eigrpe->ibuf, pipe_parent2eigrpe[0]) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_eigrpe->ibuf); iev_eigrpe->handler = main_dispatch_eigrpe; - imsg_init(&iev_rde->ibuf, pipe_parent2rde[0]); + if (imsgbuf_init(&iev_rde->ibuf, pipe_parent2rde[0]) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_rde->ibuf); iev_rde->handler = main_dispatch_rde; /* setup event handler */ @@ -284,9 +288,9 @@ eigrpd_shutdown(void) int status; /* close pipes */ - msgbuf_clear(&iev_eigrpe->ibuf.w); + imsgbuf_clear(&iev_eigrpe->ibuf); close(iev_eigrpe->ibuf.fd); - msgbuf_clear(&iev_rde->ibuf.w); + imsgbuf_clear(&iev_rde->ibuf); close(iev_rde->ibuf.fd); kr_shutdown(); @@ -373,16 +377,18 @@ main_dispatch_eigrpe(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -449,16 +455,18 @@ main_dispatch_rde(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -520,7 +528,7 @@ void imsg_event_add(struct imsgev *iev) { iev->events = EV_READ; - if (iev->ibuf.w.queued) + if (imsgbuf_queuelen(&iev->ibuf) > 0) iev->events |= EV_WRITE; event_del(&iev->ev); diff --git a/usr.sbin/eigrpd/eigrpe.c b/usr.sbin/eigrpd/eigrpe.c index 007ae6269..b5dedb798 100644 --- a/usr.sbin/eigrpd/eigrpe.c +++ b/usr.sbin/eigrpd/eigrpe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: eigrpe.c,v 1.41 2023/12/14 11:09:56 claudio Exp $ */ +/* $OpenBSD: eigrpe.c,v 1.47 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2015 Renato Westphal @@ -146,7 +146,9 @@ eigrpe(int debug, int verbose, char *sockname) /* setup pipe and event handler to the parent process */ if ((iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_main->ibuf, 3); + if (imsgbuf_init(&iev_main->ibuf, 3) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_main->ibuf); iev_main->handler = eigrpe_dispatch_main; iev_main->events = EV_READ; event_set(&iev_main->ev, iev_main->ibuf.fd, iev_main->events, @@ -173,11 +175,11 @@ static __dead void eigrpe_shutdown(void) { /* close pipes */ - msgbuf_write(&iev_rde->ibuf.w); - msgbuf_clear(&iev_rde->ibuf.w); + imsgbuf_write(&iev_rde->ibuf); + imsgbuf_clear(&iev_rde->ibuf); close(iev_rde->ibuf.fd); - msgbuf_write(&iev_main->ibuf.w); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_write(&iev_main->ibuf); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); config_clear(econf, PROC_EIGRP_ENGINE); @@ -226,16 +228,18 @@ eigrpe_dispatch_main(int fd, short event, void *bula) int n, shut = 0; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -298,7 +302,8 @@ eigrpe_dispatch_main(int fd, short event, void *bula) iev_rde = malloc(sizeof(struct imsgev)); if (iev_rde == NULL) fatal(NULL); - imsg_init(&iev_rde->ibuf, fd); + if (imsgbuf_init(&iev_rde->ibuf, fd) == -1) + fatal(NULL); iev_rde->handler = eigrpe_dispatch_rde; iev_rde->events = EV_READ; event_set(&iev_rde->ev, iev_rde->ibuf.fd, @@ -396,16 +401,18 @@ eigrpe_dispatch_rde(int fd, short event, void *bula) int n, shut = 0; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { diff --git a/usr.sbin/eigrpd/rde.c b/usr.sbin/eigrpd/rde.c index 383a3ee57..c931f7efd 100644 --- a/usr.sbin/eigrpd/rde.c +++ b/usr.sbin/eigrpd/rde.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rde.c,v 1.26 2023/12/14 11:09:56 claudio Exp $ */ +/* $OpenBSD: rde.c,v 1.32 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2015 Renato Westphal @@ -112,7 +112,9 @@ rde(int debug, int verbose) /* setup pipe and event handler to the parent process */ if ((iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_main->ibuf, 3); + if (imsgbuf_init(&iev_main->ibuf, 3) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_main->ibuf); iev_main->handler = rde_dispatch_parent; iev_main->events = EV_READ; event_set(&iev_main->ev, iev_main->ibuf.fd, iev_main->events, @@ -131,9 +133,9 @@ static __dead void rde_shutdown(void) { /* close pipes */ - msgbuf_clear(&iev_eigrpe->ibuf.w); + imsgbuf_clear(&iev_eigrpe->ibuf); close(iev_eigrpe->ibuf.fd); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); config_clear(rdeconf, PROC_RDE_ENGINE); @@ -175,16 +177,18 @@ rde_dispatch_imsg(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -310,16 +314,18 @@ rde_dispatch_parent(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -363,7 +369,8 @@ rde_dispatch_parent(int fd, short event, void *bula) iev_eigrpe = malloc(sizeof(struct imsgev)); if (iev_eigrpe == NULL) fatal(NULL); - imsg_init(&iev_eigrpe->ibuf, fd); + if (imsgbuf_init(&iev_eigrpe->ibuf, fd) == -1) + fatal(NULL); iev_eigrpe->handler = rde_dispatch_imsg; iev_eigrpe->events = EV_READ; event_set(&iev_eigrpe->ev, iev_eigrpe->ibuf.fd, diff --git a/usr.sbin/fw_update/fw_update.8 b/usr.sbin/fw_update/fw_update.8 index bbe174994..a5bab7cfa 100644 --- a/usr.sbin/fw_update/fw_update.8 +++ b/usr.sbin/fw_update/fw_update.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: fw_update.8,v 1.4 2024/10/12 23:56:23 afresh1 Exp $ +.\" $OpenBSD: fw_update.8,v 1.6 2024/11/09 02:19:48 afresh1 Exp $ .\" .\" Copyright (c) 2011 Alexander Hall .\" @@ -14,26 +14,26 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: October 12 2024 $ +.Dd $Mdocdate: November 9 2024 $ .Dt FW_UPDATE 8 .Os .Sh NAME .Nm fw_update -.Nd install non-free firmware packages +.Nd install non-free firmware .Sh SYNOPSIS .Nm -.Op Fl adFnv +.Op Fl adFlnv .Op Fl p Ar path .Op Ar driver | file ... .Sh DESCRIPTION The .Nm -utility installs, updates, or deletes firmware packages for +utility installs, updates, or deletes firmware for .Ar driver from the Internet. By default, .Nm -tries to determine which firmware packages are needed. +tries to determine which firmware are needed. .Pp Since firmware with an acceptable license is already present in .Ox , @@ -58,31 +58,30 @@ If used in conjunction with .Fl a , delete firmware for all drivers. .It Fl F -Download firmware only. -By default downloads to the current directory. -Specifying a URL with -.Fl p -downloads from that URL, -specifying a path downloads to that directory. +Download SHA256.sig and firmware .tgz to the current directory. +.It Fl l +List drivers without installing. +With +.Fl F +lists the full path to the files that will be downloaded. .It Fl n Dry run. -Do not actually install or update any firmware packages; +Do not actually install or update any firmware; just report the steps that would be taken. .It Fl p Ar path -Use the firmware found at package repository +Use .Ar path , -being either a local directory or a URL, -instead of the default location. +either a local directory or a URL, +as the source for firmware instead of the default location. .It Fl v Turn on verbose output. This flag can be specified multiple times for increased verbosity. .El .Pp Firmware is downloaded from release-specific directories at -.Lk http://firmware.openbsd.org/firmware/ . -The files are in the format required by -.Xr pkg_add 1 , -but direct use of pkg_add is discouraged. +.Lk http://firmware.openbsd.org/firmware/ +unless overridden with +.Fl p . .Sh ENVIRONMENT .Bl -tag -width DESTDIRXXX .It Ev DESTDIR diff --git a/usr.sbin/fw_update/fw_update.sh b/usr.sbin/fw_update/fw_update.sh index 53d85276c..bbac52abc 100644 --- a/usr.sbin/fw_update/fw_update.sh +++ b/usr.sbin/fw_update/fw_update.sh @@ -1,5 +1,5 @@ #!/bin/ksh -# $OpenBSD: fw_update.sh,v 1.57 2024/10/12 23:56:23 afresh1 Exp $ +# $OpenBSD: fw_update.sh,v 1.62 2024/11/24 21:27:04 afresh1 Exp $ # # Copyright (c) 2021,2023 Andrew Hewus Fresh # @@ -51,6 +51,7 @@ unset FTPPID unset LOCKPID unset FWPKGTMP REMOVE_LOCALSRC=false +DROP_PRIVS=true status() { echo -n "$*" >&"$STATUS_FD"; } warn() { echo "$*" >&"$WARN_FD"; } @@ -121,7 +122,9 @@ fetch() { 2) _flags=-Vm ;; esac - if [ -x /usr/bin/su ]; then + if ! "$DROP_PRIVS"; then + /usr/bin/ftp -N error -D 'Get/Verify' $_flags -o- "$_src" > "$_dst" + elif [ -x /usr/bin/su ]; then exec /usr/bin/su -s /bin/ksh "$_user" -c \ "/usr/bin/ftp -N error -D 'Get/Verify' $_flags -o- '$_src'" > "$_dst" else @@ -242,7 +245,7 @@ verify_existing() { ( VERBOSE=$_v verify "$@" ) } -firmware_in_dmesg() { +devices_in_dmesg() { local IFS local _d _m _dmesgtail _last='' _nl=' ' @@ -357,7 +360,7 @@ detect_firmware() { local _devices _last='' _d set -sA _devices -- $( - firmware_in_dmesg + devices_in_dmesg for _d in $( installed_firmware '*' '-firmware-' '*' ); do firmware_devicename "$_d" done @@ -487,20 +490,21 @@ unregister_firmware() { } usage() { - echo "usage: ${0##*/} [-adFnv] [-p path] [driver | file ...]" + echo "usage: ${0##*/} [-adFlnv] [-p path] [driver | file ...]" exit 1 } ALL=false -OPT_F= -while getopts :adFnp:v name +LIST=false +while getopts :adFlnp:v name do case "$name" in a) ALL=true ;; d) DELETE=true ;; - F) OPT_F=true ;; + F) INSTALL=false ;; + l) LIST=true ;; n) DRYRUN=true ;; - p) LOCALSRC="$OPTARG" ;; + p) FWURL="$OPTARG" ;; v) ((++VERBOSE)) ;; :) warn "${0##*/}: option requires an argument -- -$OPTARG" @@ -514,43 +518,30 @@ do done shift $((OPTIND - 1)) +# When listing, provide a clean output +"$LIST" && VERBOSE=1 ENABLE_SPINNER=false + # Progress bars, not spinner When VERBOSE > 1 ((VERBOSE > 1)) && ENABLE_SPINNER=false -if [ "$LOCALSRC" ]; then - if [[ $LOCALSRC = @(ftp|http?(s))://* ]]; then - FWURL="${LOCALSRC}" - LOCALSRC= - else - LOCALSRC="${LOCALSRC#file:}" - ! [ -d "$LOCALSRC" ] && - warn "The path must be a URL or an existing directory" && - exit 1 - fi -fi - -# "Download only" means local dir and don't install -if [ "$OPT_F" ]; then - INSTALL=false - LOCALSRC="${LOCALSRC:-.}" - - # Always check for latest CFILE and so latest firmware - if [ -e "$LOCALSRC/$CFILE" ]; then - mv "$LOCALSRC/$CFILE" "$LOCALSRC/$CFILE-OLD" - if check_cfile; then - rm -f "$LOCALSRC/$CFILE-OLD" - else - mv "$LOCALSRC/$CFILE-OLD" "$LOCALSRC/$CFILE" - warn "Using existing $CFILE" - fi - fi -elif [ "$LOCALSRC" ]; then +if [[ $FWURL != @(ftp|http?(s))://* ]]; then + FWURL="${FWURL#file:}" + ! [ -d "$FWURL" ] && + warn "The path must be a URL or an existing directory" && + exit 1 DOWNLOAD=false + FWURL="file:$FWURL" fi if [ -x /usr/bin/id ] && [ "$(/usr/bin/id -u)" != 0 ]; then - warn "need root privileges" - exit 1 + if ! "$INSTALL" || "$LIST"; then + # When we aren't in the installer, + # allow downloading as the current user. + DROP_PRIVS=false + else + warn "need root privileges" + exit 1 + fi fi set -sA devices -- "$@" @@ -570,7 +561,7 @@ WARN_FD=4 status "${0##*/}:" if "$DELETE"; then - [ "$OPT_F" ] && warn "Cannot use -F and -d" && usage + ! "$INSTALL" && warn "Cannot use -F and -d" && usage lock_db # Show the "Uninstall" message when just deleting not upgrading @@ -597,6 +588,17 @@ if "$DELETE"; then ) elif "$ALL"; then set -A installed -- $( installed_firmware '*' '-firmware-' '*' ) + else + set -A installed -- $( + set -- $( devices_in_dmesg ) + for f in $( installed_firmware '*' -firmware- '*' ); do + n="$( firmware_devicename "$f" )" + for d; do + [ "$d" = "$n" ] && continue 2 + done + echo "$f" + done + ) fi status " delete " @@ -608,6 +610,8 @@ if "$DELETE"; then comma=, if "$DRYRUN"; then ((VERBOSE)) && echo "Delete $fw" + elif "$LIST"; then + echo "$fw" else delete_firmware "$fw" || { status " ($fw failed)" @@ -619,9 +623,14 @@ if "$DELETE"; then [ "$comma" ] || status none + # no status when listing + "$LIST" && rm -f "$FD_DIR/status" + exit fi +! "$INSTALL" && ! "$LIST" && LOCALSRC="${LOCALSRC:-.}" + if [ ! "$LOCALSRC" ]; then LOCALSRC="$( tmpdir "${DESTDIR}/tmp/${0##*/}" )" REMOVE_LOCALSRC=true @@ -646,11 +655,19 @@ set -A update '' kept='' unregister='' +"$LIST" && ! "$INSTALL" && + echo "$FWURL/${CFILE##*/}" + if [ "${devices[*]:-}" ]; then lock_db for f in "${devices[@]}"; do d="$( firmware_devicename "$f" )" + if "$LIST" && "$INSTALL"; then + echo "$d" + continue + fi + verify_existing=true if [ "$f" = "$d" ]; then f=$( firmware_filename "$d" ) || { @@ -681,6 +698,11 @@ if [ "${devices[*]:-}" ]; then verify_existing=false fi + if "$LIST"; then + echo "$FWURL/$f" + continue + fi + set -A installed if "$INSTALL"; then set -A installed -- \ @@ -738,6 +760,12 @@ if [ "${devices[*]:-}" ]; then done fi +if "$LIST"; then + # No status when listing + rm -f "$FD_DIR/status" + exit +fi + if "$INSTALL"; then status " add " action=Install diff --git a/usr.sbin/fw_update/patterns.c b/usr.sbin/fw_update/patterns.c index c1ca531ea..b667111ce 100644 --- a/usr.sbin/fw_update/patterns.c +++ b/usr.sbin/fw_update/patterns.c @@ -1,4 +1,4 @@ -/* $OpenBSD: patterns.c,v 1.15 2024/10/13 00:00:41 deraadt Exp $ */ +/* $OpenBSD: patterns.c,v 1.16 2024/10/30 00:04:46 bluhm Exp $ */ /* * Copyright (c) 1995, 1996 Christopher G. Demetriou. All rights reserved. @@ -94,6 +94,10 @@ main(void) print_devices("amdgpu", amdgpu_devices, nitems(amdgpu_devices)); printf("%s\n", "amdgpu ^vga*vendor \"ATI\", unknown product"); printf("%s\n", "amdgpu ^vendor \"ATI\", unknown product*class display"); + printf("%s\n", "amdsev ^\"AMD*Crypto\""); + printf("%s\n", "amdsev ^\"AMD*PSP\""); + printf("%s\n", "amdsev ccp"); + printf("%s\n", "amdsev psp"); printf("%s\n", "apple-boot ^cpu0*Apple"); printf("%s\n", "arm64-qcom-dtb ^qcgpio0"); printf("%s\n", "athn"); diff --git a/usr.sbin/httpd/control.c b/usr.sbin/httpd/control.c index 9a6a9b9b5..9a4eb3b51 100644 --- a/usr.sbin/httpd/control.c +++ b/usr.sbin/httpd/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.15 2023/03/08 04:43:13 guenther Exp $ */ +/* $OpenBSD: control.c,v 1.21 2024/11/21 13:38:45 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -159,12 +159,17 @@ control_accept(int listenfd, short event, void *arg) } if ((c = calloc(1, sizeof(struct ctl_conn))) == NULL) { - close(connfd); log_warn("%s: calloc", __func__); + close(connfd); return; } - imsg_init(&c->iev.ibuf, connfd); + if (imsgbuf_init(&c->iev.ibuf, connfd) == -1) { + log_warn("%s: imsgbuf_init", __func__); + close(connfd); + free(c); + return; + } c->iev.handler = control_dispatch_imsg; c->iev.events = EV_READ; c->iev.data = cs; /* proc.c cheats (reuses the handler) */ @@ -198,7 +203,7 @@ control_close(int fd, struct control_sock *cs) return; } - msgbuf_clear(&c->iev.ibuf.w); + imsgbuf_clear(&c->iev.ibuf); TAILQ_REMOVE(&ctl_conns, c, entry); event_del(&c->iev.ev); @@ -229,15 +234,14 @@ control_dispatch_imsg(int fd, short event, void *arg) } if (event & EV_READ) { - if (((n = imsg_read(&c->iev.ibuf)) == -1 && errno != EAGAIN) || - n == 0) { + if (imsgbuf_read(&c->iev.ibuf) != 1) { control_close(fd, cs); return; } } if (event & EV_WRITE) { - if (msgbuf_write(&c->iev.ibuf.w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(&c->iev.ibuf) == -1) { control_close(fd, cs); return; } diff --git a/usr.sbin/httpd/proc.c b/usr.sbin/httpd/proc.c index 6b0461eaf..66d528668 100644 --- a/usr.sbin/httpd/proc.c +++ b/usr.sbin/httpd/proc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: proc.c,v 1.45 2024/04/09 15:48:01 tobhe Exp $ */ +/* $OpenBSD: proc.c,v 1.52 2024/11/21 13:38:45 claudio Exp $ */ /* * Copyright (c) 2010 - 2016 Reyk Floeter @@ -155,7 +155,10 @@ proc_connect(struct privsep *ps) for (inst = 0; inst < ps->ps_instances[dst]; inst++) { iev = &ps->ps_ievs[dst][inst]; - imsg_init(&iev->ibuf, ps->ps_pp->pp_pipes[dst][inst]); + if (imsgbuf_init(&iev->ibuf, + ps->ps_pp->pp_pipes[dst][inst]) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev->ibuf); event_set(&iev->ev, iev->ibuf.fd, iev->events, iev->handler, iev->data); event_add(&iev->ev, NULL); @@ -264,7 +267,9 @@ proc_accept(struct privsep *ps, int fd, enum privsep_procid dst, pp->pp_pipes[dst][n] = fd; iev = &ps->ps_ievs[dst][n]; - imsg_init(&iev->ibuf, fd); + if (imsgbuf_init(&iev->ibuf, fd) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev->ibuf); event_set(&iev->ev, iev->ibuf.fd, iev->events, iev->handler, iev->data); event_add(&iev->ev, NULL); } @@ -294,7 +299,7 @@ proc_setup(struct privsep *ps, struct privsep_proc *procs, unsigned int nproc) sizeof(struct imsgev))) == NULL) fatal("%s: calloc", __func__); - /* With this set up, we are ready to call imsg_init(). */ + /* With this set up, we are ready to call imsgbuf_init(). */ for (i = 0; i < ps->ps_instances[id]; i++) { ps->ps_ievs[id][i].handler = proc_dispatch; ps->ps_ievs[id][i].events = EV_READ; @@ -427,7 +432,7 @@ proc_open(struct privsep *ps, int src, int dst) */ if (proc_flush_imsg(ps, src, i) == -1 || proc_flush_imsg(ps, dst, j) == -1) - fatal("%s: imsg_flush", __func__); + fatal("%s: imsgbuf_flush", __func__); } } } @@ -453,7 +458,7 @@ proc_close(struct privsep *ps) /* Cancel the fd, close and invalidate the fd */ event_del(&(ps->ps_ievs[dst][n].ev)); - imsg_clear(&(ps->ps_ievs[dst][n].ibuf)); + imsgbuf_clear(&(ps->ps_ievs[dst][n].ibuf)); close(pp->pp_pipes[dst][n]); pp->pp_pipes[dst][n] = -1; } @@ -600,8 +605,8 @@ proc_dispatch(int fd, short event, void *arg) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("%s: imsg_read", __func__); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("%s: imsgbuf_read", __func__); if (n == 0) { /* this pipe is dead, so remove the event handler */ event_del(&iev->ev); @@ -611,13 +616,14 @@ proc_dispatch(int fd, short event, void *arg) } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("%s: msgbuf_write", __func__); - if (n == 0) { - /* this pipe is dead, so remove the event handler */ - event_del(&iev->ev); - event_loopexit(NULL); - return; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) { /* connection closed */ + /* remove the event handler */ + event_del(&iev->ev); + event_loopexit(NULL); + return; + } else + fatal("%s: imsgbuf_write", __func__); } } @@ -683,12 +689,12 @@ void imsg_event_add(struct imsgev *iev) { if (iev->handler == NULL) { - imsg_flush(&iev->ibuf); + imsgbuf_flush(&iev->ibuf); return; } iev->events = EV_READ; - if (iev->ibuf.w.queued) + if (imsgbuf_queuelen(&iev->ibuf) > 0) iev->events |= EV_WRITE; event_del(&iev->ev); @@ -817,10 +823,7 @@ proc_flush_imsg(struct privsep *ps, enum privsep_procid id, int n) for (; n < m; n++) { if ((ibuf = proc_ibuf(ps, id, n)) == NULL) return (-1); - do { - ret = imsg_flush(ibuf); - } while (ret == -1 && errno == EAGAIN); - if (ret == -1) + if ((ret = imsgbuf_flush(ibuf)) == -1) break; imsg_event_add(&ps->ps_ievs[id][n]); } diff --git a/usr.sbin/httpd/server_http.c b/usr.sbin/httpd/server_http.c index 0a814e7a6..aef4e4567 100644 --- a/usr.sbin/httpd/server_http.c +++ b/usr.sbin/httpd/server_http.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server_http.c,v 1.154 2024/02/13 14:00:24 claudio Exp $ */ +/* $OpenBSD: server_http.c,v 1.155 2024/12/22 13:51:42 florian Exp $ */ /* * Copyright (c) 2020 Matthias Pressfreund @@ -1368,6 +1368,11 @@ server_response(struct httpd *httpd, struct client *clt) srv_conf = clt->clt_srv_conf; } + + /* Set request timeout from matching host configuration. */ + bufferevent_settimeout(clt->clt_bev, + srv_conf->requesttimeout.tv_sec, srv_conf->requesttimeout.tv_sec); + if (clt->clt_persist >= srv_conf->maxrequests) clt->clt_persist = 0; diff --git a/usr.sbin/ikectl/ikeca.c b/usr.sbin/ikectl/ikeca.c index 2baf5b80a..6c41ec9cc 100644 --- a/usr.sbin/ikectl/ikeca.c +++ b/usr.sbin/ikectl/ikeca.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ikeca.c,v 1.51 2021/01/23 22:04:55 tobhe Exp $ */ +/* $OpenBSD: ikeca.c,v 1.52 2024/12/12 17:29:33 pascal Exp $ */ /* * Copyright (c) 2010 Jonathan Gray @@ -1034,7 +1034,7 @@ ca_revoke(struct ca *ca, char *keyname) err(1, "%s: snprintf", __func__); char *cmd[] = { PATH_OPENSSL, "ca", "-config", ca->sslcnf, "-keyfile", cakey, "-passin", ca->passfile, "-gencrl", - "-cert", cacrt, "-crldays", "365", "-out", path, ca->batch, NULL }; + "-cert", cacrt, "-out", path, ca->batch, NULL }; ca_execv(cmd); return (0); diff --git a/usr.sbin/ikectl/ikectl.c b/usr.sbin/ikectl/ikectl.c index 5d496a84d..7da995407 100644 --- a/usr.sbin/ikectl/ikectl.c +++ b/usr.sbin/ikectl/ikectl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ikectl.c,v 1.31 2024/05/21 05:00:48 jsg Exp $ */ +/* $OpenBSD: ikectl.c,v 1.36 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2007-2013 Reyk Floeter @@ -250,7 +250,8 @@ main(int argc, char *argv[]) else if ((ibuf = malloc(sizeof(struct imsgbuf))) == NULL) err(1, "malloc"); - imsg_init(ibuf, ctl_sock); + if (imsgbuf_init(ibuf, ctl_sock) == -1) + err(1, "imsgbuf_init"); /* process user request */ switch (res->action) { @@ -339,13 +340,12 @@ main(int argc, char *argv[]) break; } - while (ibuf->w.queued) - if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN) - err(1, "write error"); + if (imsgbuf_flush(ibuf) == -1) + err(1, "write error"); while (!done) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - errx(1, "imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + err(1, "read error"); if (n == 0) errx(1, "pipe closed"); diff --git a/usr.sbin/installboot/efi_installboot.c b/usr.sbin/installboot/efi_installboot.c index 39811b2e2..c6918287a 100644 --- a/usr.sbin/installboot/efi_installboot.c +++ b/usr.sbin/installboot/efi_installboot.c @@ -1,4 +1,4 @@ -/* $OpenBSD: efi_installboot.c,v 1.10 2023/04/26 18:04:21 kn Exp $ */ +/* $OpenBSD: efi_installboot.c,v 1.12 2024/11/08 10:43:07 kettenis Exp $ */ /* $NetBSD: installboot.c,v 1.5 1995/11/17 23:23:50 gwr Exp $ */ /* @@ -193,6 +193,7 @@ write_filesystem(struct disklabel *dl, char part) { static const char *fsckfmt = "/sbin/fsck -t msdos %s >/dev/null"; struct msdosfs_args args; + struct statfs sf; char cmd[60]; char dst[PATH_MAX]; char *src; @@ -309,6 +310,47 @@ write_filesystem(struct disklabel *dl, char part) goto umount; } + /* Skip installing a 2nd copy if we have a small filesystem. */ + if (statfs(dst, &sf) || sf.f_blocks < 2048) { + rslt = 0; + goto firmware; + } + + /* Create "/efi/openbsd" directory in .. */ + dst[mntlen] = '\0'; + if (strlcat(dst, "/efi/openbsd", sizeof(dst)) >= sizeof(dst)) { + rslt = -1; + warn("unable to build /efi/openbsd directory"); + goto umount; + } + rslt = mkdir(dst, 0755); + if (rslt == -1 && errno != EEXIST) { + warn("mkdir('%s') failed", dst); + goto umount; + } + + /* Copy EFI bootblocks to /efi/openbsd/. */ + if (strlcat(dst, "/" BOOTEFI_DST, sizeof(dst)) >= sizeof(dst)) { + rslt = -1; + warn("unable to build /%s path", BOOTEFI_DST); + goto umount; + } + src = fileprefix(root, "/usr/mdec/" BOOTEFI_SRC); + if (src == NULL) { + rslt = -1; + goto umount; + } + srclen = strlen(src); + if (verbose) + fprintf(stderr, "%s %s to %s\n", + (nowrite ? "would copy" : "copying"), src, dst); + if (!nowrite) { + rslt = filecopy(src, dst); + if (rslt == -1) + goto umount; + } + +firmware: dst[mntlen] = '\0'; rslt = write_firmware(root, dst); if (rslt == -1) diff --git a/usr.sbin/installboot/i386_installboot.c b/usr.sbin/installboot/i386_installboot.c index 277ef92f8..8de16f3db 100644 --- a/usr.sbin/installboot/i386_installboot.c +++ b/usr.sbin/installboot/i386_installboot.c @@ -1,4 +1,4 @@ -/* $OpenBSD: i386_installboot.c,v 1.46 2023/06/11 14:00:04 krw Exp $ */ +/* $OpenBSD: i386_installboot.c,v 1.48 2024/11/08 10:43:07 kettenis Exp $ */ /* $NetBSD: installboot.c,v 1.5 1995/11/17 23:23:50 gwr Exp $ */ /* @@ -290,6 +290,9 @@ write_filesystem(struct disklabel *dl, char part) { static const char *fsckfmt = "/sbin/fsck -t msdos %s >/dev/null"; struct msdosfs_args args; +#ifdef __amd64__ + struct statfs sf; +#endif char cmd[60]; char dst[PATH_MAX]; char *src; @@ -415,6 +418,48 @@ write_filesystem(struct disklabel *dl, char part) goto umount; } +#ifdef __amd64__ + /* Skip installing a 2nd copy if we have a small filesystem. */ + if (statfs(dst, &sf) || sf.f_blocks < 2048) { + rslt = 0; + goto umount; + } + + /* Create "/efi/openbsd" directory in .. */ + dst[mntlen] = '\0'; + if (strlcat(dst, "/efi/openbsd", sizeof(dst)) >= sizeof(dst)) { + rslt = -1; + warn("unable to build /efi/openbsd directory"); + goto umount; + } + rslt = mkdir(dst, 0755); + if (rslt == -1 && errno != EEXIST) { + warn("mkdir('%s') failed", dst); + goto umount; + } + + /* Copy BOOTX64.EFI to /efi/openbsd/. */ + if (strlcat(dst, "/BOOTX64.EFI", sizeof(dst)) >= sizeof(dst)) { + rslt = -1; + warn("unable to build /BOOTX64.EFI path"); + goto umount; + } + src = fileprefix(root, "/usr/mdec/BOOTX64.EFI"); + if (src == NULL) { + rslt = -1; + goto umount; + } + srclen = strlen(src); + if (verbose) + fprintf(stderr, "%s %s to %s\n", + (nowrite ? "would copy" : "copying"), src, dst); + if (!nowrite) { + rslt = filecopy(src, dst); + if (rslt == -1) + goto umount; + } +#endif + rslt = 0; umount: diff --git a/usr.sbin/ldapctl/ldapctl.c b/usr.sbin/ldapctl/ldapctl.c index 2e358baba..51a33c1fc 100644 --- a/usr.sbin/ldapctl/ldapctl.c +++ b/usr.sbin/ldapctl/ldapctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ldapctl.c,v 1.15 2021/01/15 18:57:04 rob Exp $ */ +/* $OpenBSD: ldapctl.c,v 1.21 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2009, 2010 Martin Hedenfalk @@ -145,7 +145,6 @@ index_namespace(struct namespace *ns, const char *datadir) struct cursor *cursor; struct ber_element *elm; char *path; - long long int ncomplete = 0; int i, rc; log_info("indexing namespace %s", ns->suffix); @@ -201,7 +200,6 @@ index_namespace(struct namespace *ns, const char *datadir) btval_reset(&val); if (rc != 0) break; - ++ncomplete; } if (btree_txn_commit(ns->indx_txn) != BT_SUCCESS) @@ -330,7 +328,8 @@ main(int argc, char *argv[]) if (connect(ctl_sock, (struct sockaddr *)&sun, sizeof(sun)) == -1) err(1, "connect: %s", sock); - imsg_init(&ibuf, ctl_sock); + if (imsgbuf_init(&ibuf, ctl_sock) == -1) + err(1, "imsgbuf_init"); done = 0; if (pledge("stdio", NULL) == -1) @@ -357,13 +356,12 @@ main(int argc, char *argv[]) fatal("internal error"); } - while (ibuf.w.queued) - if (msgbuf_write(&ibuf.w) <= 0 && errno != EAGAIN) - err(1, "write error"); + if (imsgbuf_flush(&ibuf) == -1) + err(1, "write error"); while (!done) { - if ((n = imsg_read(&ibuf)) == -1 && errno != EAGAIN) - errx(1, "imsg_read error"); + if ((n = imsgbuf_read(&ibuf)) == -1) + err(1, "read error"); if (n == 0) errx(1, "pipe closed"); diff --git a/usr.sbin/ldapd/imsgev.c b/usr.sbin/ldapd/imsgev.c index 3ee5f4019..40a02d22e 100644 --- a/usr.sbin/ldapd/imsgev.c +++ b/usr.sbin/ldapd/imsgev.c @@ -1,4 +1,4 @@ -/* $OpenBSD: imsgev.c,v 1.6 2017/03/01 00:53:39 gsoares Exp $ */ +/* $OpenBSD: imsgev.c,v 1.13 2024/11/21 13:39:07 claudio Exp $ */ /* * Copyright (c) 2009 Eric Faurot @@ -27,6 +27,7 @@ #include #include "imsgev.h" +#include "log.h" void imsgev_add(struct imsgev *); void imsgev_dispatch(int, short, void *); @@ -37,7 +38,9 @@ imsgev_init(struct imsgev *iev, int fd, void *data, void (*callback)(struct imsgev *, int, struct imsg *), void (*needfd)(struct imsgev *)) { - imsg_init(&iev->ibuf, fd); + if (imsgbuf_init(&iev->ibuf, fd) == -1) + fatal("imsgbuf_init"); + imsgbuf_allow_fdpass(&iev->ibuf); iev->terminate = 0; iev->data = data; @@ -74,7 +77,7 @@ void imsgev_clear(struct imsgev *iev) { event_del(&iev->ev); - msgbuf_clear(&iev->ibuf.w); + imsgbuf_clear(&iev->ibuf); close(iev->ibuf.fd); } @@ -85,7 +88,7 @@ imsgev_add(struct imsgev *iev) if (!iev->terminate) events = EV_READ; - if (iev->ibuf.w.queued || iev->terminate) + if (imsgbuf_queuelen(&iev->ibuf) > 0 || iev->terminate) events |= EV_WRITE; /* optimization: skip event_{del/set/add} if already set */ @@ -109,17 +112,14 @@ imsgev_dispatch(int fd, short ev, void *humppa) iev->events = 0; if (ev & EV_READ) { - if ((n = imsg_read(ibuf)) == -1) { - /* if we don't have enough fds, free one up and retry */ - if (errno == EAGAIN) { - iev->needfd(iev); - n = imsg_read(ibuf); - } + /* if we don't have enough fds, free one up and retry */ + if (getdtablesize() <= getdtablecount() + + (int)((CMSG_SPACE(sizeof(int))-CMSG_SPACE(0))/sizeof(int))) + iev->needfd(iev); - if (n == -1) { - imsgev_disconnect(iev, IMSGEV_EREAD); - return; - } + if ((n = imsgbuf_read(ibuf)) == -1) { + imsgev_disconnect(iev, IMSGEV_EREAD); + return; } if (n == 0) { /* @@ -128,7 +128,8 @@ imsgev_dispatch(int fd, short ev, void *humppa) * if write data is pending. */ imsgev_disconnect(iev, - (iev->ibuf.w.queued) ? IMSGEV_EWRITE : IMSGEV_DONE); + imsgbuf_queuelen(&iev->ibuf) > 0 ? IMSGEV_EWRITE : + IMSGEV_DONE); return; } } @@ -139,7 +140,7 @@ imsgev_dispatch(int fd, short ev, void *humppa) * closed, or some error occured. Both case are not recoverable * from the imsg perspective, so we treat it as a WRITE error. */ - if ((n = msgbuf_write(&ibuf->w)) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(ibuf) == -1) { imsgev_disconnect(iev, IMSGEV_EWRITE); return; } @@ -156,7 +157,7 @@ imsgev_dispatch(int fd, short ev, void *humppa) imsg_free(&imsg); } - if (iev->terminate && iev->ibuf.w.queued == 0) { + if (iev->terminate && imsgbuf_queuelen(&iev->ibuf) == 0) { imsgev_disconnect(iev, IMSGEV_DONE); return; } diff --git a/usr.sbin/ldpctl/ldpctl.c b/usr.sbin/ldpctl/ldpctl.c index 9967b3583..64bf4e792 100644 --- a/usr.sbin/ldpctl/ldpctl.c +++ b/usr.sbin/ldpctl/ldpctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ldpctl.c,v 1.32 2016/07/15 17:09:25 renato Exp $ +/* $OpenBSD: ldpctl.c,v 1.37 2024/11/21 13:38:14 claudio Exp $ * * Copyright (c) 2009 Michele Marchetto * Copyright (c) 2005 Claudio Jeker @@ -101,7 +101,8 @@ main(int argc, char *argv[]) if ((ibuf = malloc(sizeof(struct imsgbuf))) == NULL) err(1, NULL); - imsg_init(ibuf, ctl_sock); + if (imsgbuf_init(ibuf, ctl_sock) == -1) + err(1, NULL); done = 0; /* process user request */ @@ -206,13 +207,12 @@ main(int argc, char *argv[]) break; } - while (ibuf->w.queued) - if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN) - err(1, "write error"); + if (imsgbuf_flush(ibuf) == -1) + err(1, "write error"); while (!done) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - errx(1, "imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + err(1, "read error"); if (n == 0) errx(1, "pipe closed"); diff --git a/usr.sbin/ldpd/control.c b/usr.sbin/ldpd/control.c index 6b1518b33..1cbe8a9ef 100644 --- a/usr.sbin/ldpd/control.c +++ b/usr.sbin/ldpd/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.32 2023/03/08 04:43:13 guenther Exp $ */ +/* $OpenBSD: control.c,v 1.38 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -133,7 +133,13 @@ control_accept(int listenfd, short event, void *bula) return; } - imsg_init(&c->iev.ibuf, connfd); + if (imsgbuf_init(&c->iev.ibuf, connfd) == -1) { + log_warn(__func__); + close(connfd); + free(c); + return; + } + c->iev.handler = control_dispatch_imsg; c->iev.events = EV_READ; event_set(&c->iev.ev, c->iev.ibuf.fd, c->iev.events, @@ -179,7 +185,7 @@ control_close(int fd) return; } - msgbuf_clear(&c->iev.ibuf.w); + imsgbuf_clear(&c->iev.ibuf); TAILQ_REMOVE(&ctl_conns, c, entry); event_del(&c->iev.ev); @@ -203,14 +209,13 @@ control_dispatch_imsg(int fd, short event, void *bula) } if (event & EV_READ) { - if (((n = imsg_read(&c->iev.ibuf)) == -1 && errno != EAGAIN) || - n == 0) { + if (imsgbuf_read(&c->iev.ibuf) != 1) { control_close(fd); return; } } if (event & EV_WRITE) { - if (msgbuf_write(&c->iev.ibuf.w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(&c->iev.ibuf) == -1) { control_close(fd); return; } diff --git a/usr.sbin/ldpd/lde.c b/usr.sbin/ldpd/lde.c index b16ad2ac2..0cd4a7455 100644 --- a/usr.sbin/ldpd/lde.c +++ b/usr.sbin/ldpd/lde.c @@ -1,4 +1,4 @@ -/* $OpenBSD: lde.c,v 1.78 2024/04/23 13:34:51 jsg Exp $ */ +/* $OpenBSD: lde.c,v 1.84 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2013, 2016 Renato Westphal @@ -128,7 +128,9 @@ lde(int debug, int verbose) /* setup pipe and event handler to the parent process */ if ((iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_main->ibuf, 3); + if (imsgbuf_init(&iev_main->ibuf, 3) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_main->ibuf); iev_main->handler = lde_dispatch_parent; iev_main->events = EV_READ; event_set(&iev_main->ev, iev_main->ibuf.fd, iev_main->events, @@ -151,9 +153,9 @@ static __dead void lde_shutdown(void) { /* close pipes */ - msgbuf_clear(&iev_ldpe->ibuf.w); + imsgbuf_clear(&iev_ldpe->ibuf); close(iev_ldpe->ibuf.fd); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); lde_gc_stop_timer(); @@ -198,16 +200,18 @@ lde_dispatch_imsg(int fd, short event, void *bula) int shut = 0, verbose; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -393,16 +397,18 @@ lde_dispatch_parent(int fd, short event, void *bula) struct fec fec; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -460,7 +466,8 @@ lde_dispatch_parent(int fd, short event, void *bula) if ((iev_ldpe = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_ldpe->ibuf, fd); + if (imsgbuf_init(&iev_ldpe->ibuf, fd) == -1) + fatal(NULL); iev_ldpe->handler = lde_dispatch_imsg; iev_ldpe->events = EV_READ; event_set(&iev_ldpe->ev, iev_ldpe->ibuf.fd, diff --git a/usr.sbin/ldpd/ldpd.c b/usr.sbin/ldpd/ldpd.c index f9e3e66f6..4032c021f 100644 --- a/usr.sbin/ldpd/ldpd.c +++ b/usr.sbin/ldpd/ldpd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ldpd.c,v 1.69 2023/03/08 04:43:13 guenther Exp $ */ +/* $OpenBSD: ldpd.c,v 1.79 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2013, 2016 Renato Westphal @@ -242,9 +242,13 @@ main(int argc, char *argv[]) if ((iev_ldpe = malloc(sizeof(struct imsgev))) == NULL || (iev_lde = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_ldpe->ibuf, pipe_parent2ldpe[0]); + if (imsgbuf_init(&iev_ldpe->ibuf, pipe_parent2ldpe[0]) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_ldpe->ibuf); iev_ldpe->handler = main_dispatch_ldpe; - imsg_init(&iev_lde->ibuf, pipe_parent2lde[0]); + if (imsgbuf_init(&iev_lde->ibuf, pipe_parent2lde[0]) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_lde->ibuf); iev_lde->handler = main_dispatch_lde; /* setup event handler */ @@ -291,9 +295,9 @@ ldpd_shutdown(void) int status; /* close pipes */ - msgbuf_clear(&iev_ldpe->ibuf.w); + imsgbuf_clear(&iev_ldpe->ibuf); close(iev_ldpe->ibuf.fd); - msgbuf_clear(&iev_lde->ibuf.w); + imsgbuf_clear(&iev_lde->ibuf); close(iev_lde->ibuf.fd); kr_shutdown(); @@ -379,16 +383,18 @@ main_dispatch_ldpe(int fd, short event, void *bula) int shut = 0, verbose; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -458,16 +464,18 @@ main_dispatch_lde(int fd, short event, void *bula) int shut = 0; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -552,7 +560,7 @@ void imsg_event_add(struct imsgev *iev) { iev->events = EV_READ; - if (iev->ibuf.w.queued) + if (imsgbuf_queuelen(&iev->ibuf) > 0) iev->events |= EV_WRITE; event_del(&iev->ev); @@ -575,14 +583,14 @@ imsg_compose_event(struct imsgev *iev, uint16_t type, uint32_t peerid, void evbuf_enqueue(struct evbuf *eb, struct ibuf *buf) { - ibuf_close(&eb->wbuf, buf); + ibuf_close(eb->wbuf, buf); evbuf_event_add(eb); } void evbuf_event_add(struct evbuf *eb) { - if (eb->wbuf.queued) + if (msgbuf_queuelen(eb->wbuf) > 0) event_add(&eb->ev, NULL); } @@ -590,17 +598,19 @@ void evbuf_init(struct evbuf *eb, int fd, void (*handler)(int, short, void *), void *arg) { - msgbuf_init(&eb->wbuf); - eb->wbuf.fd = fd; - event_set(&eb->ev, eb->wbuf.fd, EV_WRITE, handler, arg); + if (eb->wbuf != NULL) + fatalx("evbuf_init: msgbuf already set"); + if ((eb->wbuf = msgbuf_new()) == NULL) + fatal(__func__); + event_set(&eb->ev, fd, EV_WRITE, handler, arg); } void evbuf_clear(struct evbuf *eb) { event_del(&eb->ev); - msgbuf_clear(&eb->wbuf); - eb->wbuf.fd = -1; + msgbuf_free(eb->wbuf); + eb->wbuf = NULL; } static int diff --git a/usr.sbin/ldpd/ldpd.h b/usr.sbin/ldpd/ldpd.h index 89ce8882d..ac6c0e5a6 100644 --- a/usr.sbin/ldpd/ldpd.h +++ b/usr.sbin/ldpd/ldpd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ldpd.h,v 1.92 2021/01/19 15:59:25 claudio Exp $ */ +/* $OpenBSD: ldpd.h,v 1.93 2024/11/21 13:29:28 claudio Exp $ */ /* * Copyright (c) 2013, 2016 Renato Westphal @@ -60,8 +60,8 @@ #define F_REDISTRIBUTED 0x0040 struct evbuf { - struct msgbuf wbuf; - struct event ev; + struct msgbuf *wbuf; + struct event ev; }; struct imsgev { diff --git a/usr.sbin/ldpd/ldpe.c b/usr.sbin/ldpd/ldpe.c index b69ec6381..4bdef8447 100644 --- a/usr.sbin/ldpd/ldpe.c +++ b/usr.sbin/ldpd/ldpe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ldpe.c,v 1.82 2023/12/14 11:10:19 claudio Exp $ */ +/* $OpenBSD: ldpe.c,v 1.88 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2013, 2016 Renato Westphal @@ -123,7 +123,9 @@ ldpe(int debug, int verbose, char *sockname) /* setup pipe and event handler to the parent process */ if ((iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_main->ibuf, 3); + if (imsgbuf_init(&iev_main->ibuf, 3) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_main->ibuf); iev_main->handler = ldpe_dispatch_main; iev_main->events = EV_READ; event_set(&iev_main->ev, iev_main->ibuf.fd, iev_main->events, @@ -159,11 +161,11 @@ ldpe_shutdown(void) struct adj *adj; /* close pipes */ - msgbuf_write(&iev_lde->ibuf.w); - msgbuf_clear(&iev_lde->ibuf.w); + imsgbuf_write(&iev_lde->ibuf); + imsgbuf_clear(&iev_lde->ibuf); close(iev_lde->ibuf.fd); - msgbuf_write(&iev_main->ibuf.w); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_write(&iev_main->ibuf); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); control_cleanup(); @@ -231,16 +233,18 @@ ldpe_dispatch_main(int fd, short event, void *bula) int n, shut = 0; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("ldpe_dispatch_main: msgbuf_write"); - if (n == 0) - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -304,7 +308,8 @@ ldpe_dispatch_main(int fd, short event, void *bula) if ((iev_lde = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_lde->ibuf, fd); + if (imsgbuf_init(&iev_lde->ibuf, fd) == -1) + fatal(NULL); iev_lde->handler = ldpe_dispatch_lde; iev_lde->events = EV_READ; event_set(&iev_lde->ev, iev_lde->ibuf.fd, @@ -495,16 +500,18 @@ ldpe_dispatch_lde(int fd, short event, void *bula) struct nbr *nbr = NULL; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("ldpe_dispatch_lde: msgbuf_write"); - if (n == 0) - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { diff --git a/usr.sbin/ldpd/ldpe.h b/usr.sbin/ldpd/ldpe.h index 24c0bc4b3..862bbda63 100644 --- a/usr.sbin/ldpd/ldpe.h +++ b/usr.sbin/ldpd/ldpe.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ldpe.h,v 1.79 2021/01/19 15:59:25 claudio Exp $ */ +/* $OpenBSD: ldpe.h,v 1.80 2024/11/21 13:27:13 claudio Exp $ */ /* * Copyright (c) 2013, 2016 Renato Westphal @@ -54,10 +54,15 @@ struct adj { union ldpd_addr trans_addr; }; +struct buf_read { + uint8_t buf[IBUF_READ_SIZE]; + size_t wpos; +}; + struct tcp_conn { struct nbr *nbr; int fd; - struct ibuf_read *rbuf; + struct buf_read *rbuf; struct evbuf wbuf; struct event rev; }; diff --git a/usr.sbin/ldpd/packet.c b/usr.sbin/ldpd/packet.c index 8ea1c511b..34fcce200 100644 --- a/usr.sbin/ldpd/packet.c +++ b/usr.sbin/ldpd/packet.c @@ -1,4 +1,4 @@ -/* $OpenBSD: packet.c,v 1.72 2021/01/19 15:59:25 claudio Exp $ */ +/* $OpenBSD: packet.c,v 1.77 2024/11/21 13:29:28 claudio Exp $ */ /* * Copyright (c) 2013, 2016 Renato Westphal @@ -36,7 +36,7 @@ static struct iface *disc_find_iface(unsigned int, int, union ldpd_addr *, int); static void session_read(int, short, void *); static void session_write(int, short, void *); -static ssize_t session_get_pdu(struct ibuf_read *, char **); +static ssize_t session_get_pdu(struct buf_read *, char **); static void tcp_close(struct tcp_conn *); static struct pending_conn *pending_conn_new(int, int, union ldpd_addr *); static void pending_conn_timeout(int, short, void *); @@ -598,11 +598,11 @@ session_write(int fd, short event, void *arg) if (!(event & EV_WRITE)) return; - if (msgbuf_write(&tcp->wbuf.wbuf) <= 0) - if (errno != EAGAIN && nbr) + if (ibuf_write(fd, tcp->wbuf.wbuf) == -1) + if (nbr) nbr_fsm(nbr, NBR_EVT_CLOSE_SESSION); - if (nbr == NULL && !tcp->wbuf.wbuf.queued) { + if (nbr == NULL && msgbuf_queuelen(tcp->wbuf.wbuf) == 0) { /* * We are done sending the notification message, now we can * close the socket. @@ -651,7 +651,7 @@ session_close(struct nbr *nbr) } static ssize_t -session_get_pdu(struct ibuf_read *r, char **b) +session_get_pdu(struct buf_read *r, char **b) { struct ldp_hdr l; size_t av, dlen, left; @@ -691,7 +691,7 @@ tcp_new(int fd, struct nbr *nbr) evbuf_init(&tcp->wbuf, tcp->fd, session_write, tcp); if (nbr) { - if ((tcp->rbuf = calloc(1, sizeof(struct ibuf_read))) == NULL) + if ((tcp->rbuf = calloc(1, sizeof(struct buf_read))) == NULL) fatal(__func__); event_set(&tcp->rev, tcp->fd, EV_READ | EV_PERSIST, @@ -707,7 +707,7 @@ static void tcp_close(struct tcp_conn *tcp) { /* try to flush write buffer */ - msgbuf_write(&tcp->wbuf.wbuf); + ibuf_write(tcp->fd, tcp->wbuf.wbuf); evbuf_clear(&tcp->wbuf); if (tcp->nbr) { @@ -783,7 +783,7 @@ pending_conn_timeout(int fd, short event, void *arg) */ tcp = tcp_new(pconn->fd, NULL); send_notification(tcp, S_NO_HELLO, 0, 0); - msgbuf_write(&tcp->wbuf.wbuf); + ibuf_write(fd, tcp->wbuf.wbuf); pending_conn_del(pconn); } diff --git a/usr.sbin/lpd/engine.c b/usr.sbin/lpd/engine.c index f3ef987af..c089b1c20 100644 --- a/usr.sbin/lpd/engine.c +++ b/usr.sbin/lpd/engine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: engine.c,v 1.3 2022/12/28 21:30:17 jmc Exp $ */ +/* $OpenBSD: engine.c,v 1.4 2024/11/21 13:34:51 claudio Exp $ */ /* * Copyright (c) 2017 Eric Faurot @@ -93,6 +93,7 @@ static void engine_dispatch_priv(struct imsgproc *proc, struct imsg *imsg, void *arg) { struct lp_printer lp; + int fd; if (imsg == NULL) { log_debug("%s: imsg connection lost", __func__); @@ -107,10 +108,10 @@ engine_dispatch_priv(struct imsgproc *proc, struct imsg *imsg, void *arg) case IMSG_SOCK_FRONTEND: m_end(proc); - if (imsg->fd == -1) + if ((fd = imsg_get_fd(imsg)) == -1) fatalx("failed to receive frontend socket"); - p_frontend = proc_attach(PROC_FRONTEND, imsg->fd); + p_frontend = proc_attach(PROC_FRONTEND, fd); proc_setcallback(p_frontend, engine_dispatch_frontend, NULL); proc_enable(p_frontend); break; diff --git a/usr.sbin/lpd/frontend.c b/usr.sbin/lpd/frontend.c index 4521ef7ec..faeb14c8f 100644 --- a/usr.sbin/lpd/frontend.c +++ b/usr.sbin/lpd/frontend.c @@ -1,4 +1,4 @@ -/* $OpenBSD: frontend.c,v 1.3 2022/12/28 21:30:17 jmc Exp $ */ +/* $OpenBSD: frontend.c,v 1.4 2024/11/21 13:34:51 claudio Exp $ */ /* * Copyright (c) 2017 Eric Faurot @@ -248,6 +248,7 @@ static void frontend_dispatch_priv(struct imsgproc *proc, struct imsg *imsg, void *arg) { struct listener *l; + int fd; if (imsg == NULL) { log_debug("%s: imsg connection lost", __func__); @@ -260,10 +261,10 @@ frontend_dispatch_priv(struct imsgproc *proc, struct imsg *imsg, void *arg) switch (imsg->hdr.type) { case IMSG_SOCK_ENGINE: - if (imsg->fd == -1) + if ((fd = imsg_get_fd(imsg)) == -1) fatalx("%s: engine socket not received", __func__); m_end(proc); - p_engine = proc_attach(PROC_ENGINE, imsg->fd); + p_engine = proc_attach(PROC_ENGINE, fd); proc_setcallback(p_engine, frontend_dispatch_engine, NULL); proc_enable(p_engine); break; @@ -276,14 +277,14 @@ frontend_dispatch_priv(struct imsgproc *proc, struct imsg *imsg, void *arg) break; case IMSG_CONF_LISTENER: - if (imsg->fd == -1) + if ((fd = imsg_get_fd(imsg)) == -1) fatalx("%s: listener socket not received", __func__); if ((l = calloc(1, sizeof(*l))) == NULL) fatal("%s: calloc", __func__); m_get_int(proc, &l->proto); m_get_sockaddr(proc, (struct sockaddr *)&l->ss); m_end(proc); - l->sock = imsg->fd; + l->sock = fd; TAILQ_INSERT_TAIL(&tmpconf->listeners, l, entry); break; diff --git a/usr.sbin/lpd/frontend_lpr.c b/usr.sbin/lpd/frontend_lpr.c index 23b4d6878..1309c740f 100644 --- a/usr.sbin/lpd/frontend_lpr.c +++ b/usr.sbin/lpd/frontend_lpr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: frontend_lpr.c,v 1.4 2022/12/28 21:30:17 jmc Exp $ */ +/* $OpenBSD: frontend_lpr.c,v 1.5 2024/11/21 13:34:51 claudio Exp $ */ /* * Copyright (c) 2017 Eric Faurot @@ -148,8 +148,6 @@ lpr_dispatch_engine(struct imsgproc *proc, struct imsg *imsg) conn = SPLAY_FIND(lpr_conn_tree, &conns, &key); if (conn == NULL) { log_debug("%08x dead-session", key.id); - if (imsg->fd != -1) - close(imsg->fd); return; } } @@ -174,7 +172,7 @@ lpr_dispatch_engine(struct imsgproc *proc, struct imsg *imsg) m_get_int(proc, &ack); m_get_size(proc, &sz); m_end(proc); - lpr_on_recvjob_file(conn, ack, sz, cf, imsg->fd); + lpr_on_recvjob_file(conn, ack, sz, cf, imsg_get_fd(imsg)); break; case IMSG_LPR_DISPLAYQ: @@ -182,7 +180,7 @@ lpr_dispatch_engine(struct imsgproc *proc, struct imsg *imsg) m_get_string(proc, &hostname); m_get_string(proc, &cmd); m_end(proc); - lpr_on_request(conn, imsg->fd, hostname, cmd); + lpr_on_request(conn, imsg_get_fd(imsg), hostname, cmd); break; default: diff --git a/usr.sbin/lpd/logmsg.c b/usr.sbin/lpd/logmsg.c index b2e21c558..8269862a8 100644 --- a/usr.sbin/lpd/logmsg.c +++ b/usr.sbin/lpd/logmsg.c @@ -1,4 +1,4 @@ -/* $OpenBSD: logmsg.c,v 1.2 2018/09/05 17:32:56 eric Exp $ */ +/* $OpenBSD: logmsg.c,v 1.3 2024/11/21 13:34:51 claudio Exp $ */ /* * Copyright (c) 2017 Eric Faurot @@ -147,10 +147,10 @@ log_imsg(struct imsgproc *proc, struct imsg *imsg) log_debug("imsg src=%s closed", log_fmt_proctype(proc_gettype(proc))); else - log_debug("imsg src=%s type=%s len=%d fd=%d", + log_debug("imsg src=%s type=%s len=%d", log_fmt_proctype(proc_gettype(proc)), log_fmt_imsgtype(imsg->hdr.type), - imsg->hdr.len, imsg->fd); + imsg->hdr.len); } void diff --git a/usr.sbin/lpd/proc.c b/usr.sbin/lpd/proc.c index a7276bddc..21d13cd3e 100644 --- a/usr.sbin/lpd/proc.c +++ b/usr.sbin/lpd/proc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: proc.c,v 1.2 2019/04/04 19:25:46 eric Exp $ */ +/* $OpenBSD: proc.c,v 1.7 2024/11/21 13:34:51 claudio Exp $ */ /* * Copyright (c) 2017 Eric Faurot @@ -203,7 +203,7 @@ proc_free(struct imsgproc *p) if (event_initialized(&p->ev)) event_del(&p->ev); close(p->imsgbuf.fd); - imsg_clear(&p->imsgbuf); + imsgbuf_clear(&p->imsgbuf); free(p->title); free(p); } @@ -217,10 +217,15 @@ proc_new(int type) if (p == NULL) return NULL; + if (imsgbuf_init(&p->imsgbuf, -1) == -1) { + free(p); + return NULL; + } + imsgbuf_allow_fdpass(&p->imsgbuf); + p->type = type; p->instance = -1; p->pid = -1; - imsg_init(&p->imsgbuf, -1); TAILQ_INSERT_TAIL(&procs, p, tqe); @@ -231,7 +236,6 @@ static void proc_setsock(struct imsgproc *p, int sock) { p->imsgbuf.fd = sock; - p->imsgbuf.w.fd = sock; } static void @@ -240,7 +244,7 @@ proc_event_add(struct imsgproc *p) short events; events = EV_READ; - if (p->imsgbuf.w.queued) + if (imsgbuf_queuelen(&p->imsgbuf) > 0) events |= EV_WRITE; if (p->events) @@ -278,12 +282,10 @@ proc_dispatch(int fd, short event, void *arg) p->events = 0; if (event & EV_READ) { - n = imsg_read(&p->imsgbuf); + n = imsgbuf_read(&p->imsgbuf); switch (n) { case -1: - if (errno == EAGAIN) - break; - log_warn("%s: imsg_read", __func__); + log_warn("%s: imsgbuf_read", __func__); proc_callback(p, NULL); return; case 0: @@ -296,20 +298,11 @@ proc_dispatch(int fd, short event, void *arg) } if (event & EV_WRITE) { - n = msgbuf_write(&p->imsgbuf.w); - switch (n) { - case -1: - if (errno == EAGAIN) - break; - log_warn("%s: msgbuf_write", __func__); + if (imsgbuf_write(&p->imsgbuf) == -1) { + if (errno != EPIPE) + log_warn("%s: imsgbuf_write", __func__); proc_callback(p, NULL); return; - case 0: - /* This pipe is dead. */ - proc_callback(p, NULL); - return; - default: - break; } } diff --git a/usr.sbin/map-mbone/map-mbone.8 b/usr.sbin/map-mbone/map-mbone.8 index ad352420c..c9dba18e5 100644 --- a/usr.sbin/map-mbone/map-mbone.8 +++ b/usr.sbin/map-mbone/map-mbone.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: map-mbone.8,v 1.15 2014/09/08 01:27:55 schwarze Exp $ +.\" $OpenBSD: map-mbone.8,v 1.16 2024/12/01 09:58:15 kn Exp $ .\" $NetBSD: map-mbone.8,v 1.2 1995/10/03 23:16:53 thorpej Exp $ .\" .\" Mapper for connections between MRouteD multicast routers. @@ -32,7 +32,7 @@ .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, .\" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: September 8 2014 $ +.Dd $Mdocdate: December 1 2024 $ .Dt MAP-MBONE 8 .Os .Sh NAME @@ -41,7 +41,7 @@ .Sh SYNOPSIS .Nm map-mbone .Op Fl fgn -.Op Fl d Ar level +.Op Fl d Ns Op Ar level .Op Fl r Ar count .Op Fl t Ar seconds .Op Ar starting_router @@ -82,10 +82,10 @@ continues the process until no new multicast routers are reported. .Pp The options are as follows: .Bl -tag -width "-t seconds" -.It Fl d Ar level +.It Fl d Ns Op Ar level Sets the debug level to .Ar level . -When the debug level is greater than +When the debug level is greater than the default value of 0, additional debugging messages are printed to stderr. Regardless of the debug level, an error condition will always write an error message and will diff --git a/usr.sbin/map-mbone/mapper.c b/usr.sbin/map-mbone/mapper.c index b443da1dc..0c5e265ae 100644 --- a/usr.sbin/map-mbone/mapper.c +++ b/usr.sbin/map-mbone/mapper.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mapper.c,v 1.26 2021/06/26 15:42:58 deraadt Exp $ */ +/* $OpenBSD: mapper.c,v 1.27 2024/12/01 09:58:15 kn Exp $ */ /* $NetBSD: mapper.c,v 1.3 1995/12/10 11:12:04 mycroft Exp $ */ /* Mapper for connections between MRouteD multicast routers. @@ -787,7 +787,7 @@ void usage(void) extern char *__progname; fprintf(stderr, - "usage: %s [-fgn] [-d level] [-r count] [-t seconds] " + "usage: %s [-fgn] [-d[level]] [-r count] [-t seconds] " "[starting_router]\n\n", __progname); exit(1); diff --git a/usr.sbin/mrinfo/mrinfo.8 b/usr.sbin/mrinfo/mrinfo.8 index e2e70c7ac..2e7499b26 100644 --- a/usr.sbin/mrinfo/mrinfo.8 +++ b/usr.sbin/mrinfo/mrinfo.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: mrinfo.8,v 1.12 2007/05/31 19:20:25 jmc Exp $ +.\" $OpenBSD: mrinfo.8,v 1.13 2024/12/01 09:58:15 kn Exp $ .\" $NetBSD: mrinfo.8,v 1.2 1995/10/03 23:20:39 thorpej Exp $ .\" .\" Written Wed Mar 24 1993 by Van Jacobson (adapted from the @@ -68,7 +68,7 @@ .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, .\" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: May 31 2007 $ +.Dd $Mdocdate: December 1 2024 $ .Dt MRINFO 8 .Os .Sh NAME @@ -76,7 +76,7 @@ .Nd displays configuration info from a multicast router .Sh SYNOPSIS .Nm mrinfo -.Op Fl d Ar debug_level +.Op Fl d Ns Op Ar debug_level .Op Fl r Ar retry_count .Op Fl t Ar timeout_count .Ar multicast_router @@ -99,7 +99,7 @@ the configuration is displayed to the standard output. .Pp The options are as follows: .Bl -tag -width timeout_levelxyz -.It Fl d Ar debug_level +.It Fl d Ns Op Ar debug_level sets the debug level. When the debug level is greater than the default value of 0, additional debugging messages are printed. diff --git a/usr.sbin/mrinfo/mrinfo.c b/usr.sbin/mrinfo/mrinfo.c index 55d6269d3..24d2a652a 100644 --- a/usr.sbin/mrinfo/mrinfo.c +++ b/usr.sbin/mrinfo/mrinfo.c @@ -271,7 +271,7 @@ void usage() { fprintf(stderr, - "Usage: mrinfo [-d [debug_level]] [-n] [-t timeout] [-r retries] [router]\n"); + "Usage: mrinfo [-d[debug_level]] [-n] [-t timeout] [-r retries] [router]\n"); exit(1); } diff --git a/usr.sbin/mrouted/main.c b/usr.sbin/mrouted/main.c index 4c83bc95e..1f17fe9d3 100644 --- a/usr.sbin/mrouted/main.c +++ b/usr.sbin/mrouted/main.c @@ -118,7 +118,7 @@ main(int argc, char *argv[]) if (argc > 0) { usage: fprintf(stderr, - "usage: mrouted [-p] [-c config_file] [-d [debug_level]]\n"); + "usage: mrouted [-p] [-c config_file] [-d[debug_level]]\n"); exit(1); } diff --git a/usr.sbin/mrouted/mrouted.8 b/usr.sbin/mrouted/mrouted.8 index e7f84a15d..8463f2e50 100644 --- a/usr.sbin/mrouted/mrouted.8 +++ b/usr.sbin/mrouted/mrouted.8 @@ -1,11 +1,11 @@ -.\" $OpenBSD: mrouted.8,v 1.27 2020/02/10 13:18:21 schwarze Exp $ +.\" $OpenBSD: mrouted.8,v 1.28 2024/12/01 09:58:15 kn Exp $ .\" The mrouted program is covered by the license in the accompanying file .\" named "LICENSE". Use of the mrouted program represents acceptance of .\" the terms and conditions listed in that file. .\" .\" The mrouted program is COPYRIGHT 1989 by The Board of Trustees of .\" Leland Stanford Junior University. -.Dd $Mdocdate: February 10 2020 $ +.Dd $Mdocdate: December 1 2024 $ .Dt MROUTED 8 .Os .Sh NAME @@ -15,7 +15,7 @@ .Nm mrouted .Op Fl p .Op Fl c Ar config_file -.Op Fl d Op Ar debug_level +.Op Fl d Ns Op Ar debug_level .Sh DESCRIPTION .Nm is an implementation of the Distance-Vector Multicast Routing @@ -82,7 +82,7 @@ The options are as follows: Specify an alternative configuration file, instead of the default .Pa mrouted.conf . -.It Fl d Op Ar debug_level +.It Fl d Ns Op Ar debug_level By default, .Nm detaches from the invoking terminal. diff --git a/usr.sbin/npppctl/npppctl.c b/usr.sbin/npppctl/npppctl.c index d873c26cf..84c8b243e 100644 --- a/usr.sbin/npppctl/npppctl.c +++ b/usr.sbin/npppctl/npppctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: npppctl.c,v 1.11 2023/02/21 15:45:40 mbuhl Exp $ */ +/* $OpenBSD: npppctl.c,v 1.15 2024/11/21 13:43:10 claudio Exp $ */ /* * Copyright (c) 2012 Internet Initiative Japan Inc. @@ -108,7 +108,8 @@ main(int argc, char *argv[]) if (connect(ctlsock, (struct sockaddr *)&sun, sizeof(sun)) == -1) err(EXIT_FAILURE, "connect"); - imsg_init(&ctl_ibuf, ctlsock); + if (imsgbuf_init(&ctl_ibuf, ctlsock) == -1) + err(EXIT_FAILURE, "imsgbuf_init"); switch (result->action) { case SESSION_BRIEF: @@ -509,16 +510,14 @@ imsg_wait_command_completion(void) { int n; - while (ctl_ibuf.w.queued) - if (msgbuf_write(&ctl_ibuf.w) <= 0 && errno != EAGAIN) - return (-1); + if (imsgbuf_flush(&ctl_ibuf) == -1) + return (-1); do { if ((n = imsg_get(&ctl_ibuf, &ctl_imsg)) == -1) return (-1); if (n != 0) break; - if (((n = imsg_read(&ctl_ibuf)) == -1 && errno != EAGAIN) || - n == 0) + if (imsgbuf_read(&ctl_ibuf) != 1) return (-1); } while (1); diff --git a/usr.sbin/npppd/npppd/control.c b/usr.sbin/npppd/npppd/control.c index 35e1b18b8..42133583e 100644 --- a/usr.sbin/npppd/npppd/control.c +++ b/usr.sbin/npppd/npppd/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.8 2023/03/08 04:43:14 guenther Exp $ */ +/* $OpenBSD: control.c,v 1.15 2024/11/21 13:43:10 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -181,13 +181,20 @@ control_accept(int listenfd, short event, void *arg) return; } if ((c->ctx = npppd_ctl_create(cs->cs_ctx)) == NULL) { - free(c); log_warn("control_accept"); close(connfd); + free(c); + return; + } + + if (imsgbuf_init(&c->iev.ibuf, connfd) == -1) { + log_warn("control_accept"); + close(connfd); + free(c->ctx); + free(c); return; } - imsg_init(&c->iev.ibuf, connfd); c->iev.handler = control_dispatch_imsg; c->iev.events = EV_READ; c->iev.data = cs; @@ -221,7 +228,7 @@ control_close(int fd, struct control_sock *cs) return; } - msgbuf_clear(&c->iev.ibuf.w); + imsgbuf_clear(&c->iev.ibuf); TAILQ_REMOVE(&ctl_conns, c, entry); event_del(&c->iev.ev); @@ -252,19 +259,18 @@ control_dispatch_imsg(int fd, short event, void *arg) if (event & EV_WRITE) { - if (msgbuf_write(&c->iev.ibuf.w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(&c->iev.ibuf) == -1) { control_close(fd, cs); return; } - if (!c->iev.ibuf.w.queued) + if (imsgbuf_queuelen(&c->iev.ibuf) > 0) npppd_ctl_imsg_compose(c->ctx, &c->iev.ibuf); imsg_event_add(&c->iev); if (!(event & EV_READ)) return; } if (event & EV_READ) { - if (((n = imsg_read(&c->iev.ibuf)) == -1 && errno != EAGAIN) || - n == 0) { + if (imsgbuf_read(&c->iev.ibuf) != 1) { control_close(fd, cs); return; } @@ -330,7 +336,7 @@ control_dispatch_imsg(int fd, short event, void *arg) } imsg_free(&imsg); } - if (!c->iev.ibuf.w.queued) + if (imsgbuf_queuelen(&c->iev.ibuf) > 0) npppd_ctl_imsg_compose(c->ctx, &c->iev.ibuf); imsg_event_add(&c->iev); } diff --git a/usr.sbin/npppd/npppd/npppd.c b/usr.sbin/npppd/npppd/npppd.c index e113658f8..34a7eb3e3 100644 --- a/usr.sbin/npppd/npppd/npppd.c +++ b/usr.sbin/npppd/npppd/npppd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: npppd.c,v 1.56 2024/08/02 12:43:55 yasuoka Exp $ */ +/* $OpenBSD: npppd.c,v 1.57 2024/11/21 13:18:38 claudio Exp $ */ /*- * Copyright (c) 2005-2008,2009 Internet Initiative Japan Inc. @@ -29,7 +29,7 @@ * Next pppd(nppd). This file provides a npppd daemon process and operations * for npppd instance. * @author Yasuoka Masahiko - * $Id: npppd.c,v 1.56 2024/08/02 12:43:55 yasuoka Exp $ + * $Id: npppd.c,v 1.57 2024/11/21 13:18:38 claudio Exp $ */ #include "version.h" #include /* ALIGNED_POINTER */ @@ -2411,7 +2411,7 @@ void imsg_event_add(struct imsgev *iev) { iev->events = EV_READ; - if (iev->ibuf.w.queued) + if (imsgbuf_queuelen(&iev->ibuf) > 0) iev->events |= EV_WRITE; event_del(&iev->ev); diff --git a/usr.sbin/npppd/npppd/npppd_ctl.c b/usr.sbin/npppd/npppd/npppd_ctl.c index d148fc246..e67e56834 100644 --- a/usr.sbin/npppd/npppd/npppd_ctl.c +++ b/usr.sbin/npppd/npppd/npppd_ctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: npppd_ctl.c,v 1.16 2017/08/11 16:25:59 goda Exp $ */ +/* $OpenBSD: npppd_ctl.c,v 1.17 2024/11/21 13:18:38 claudio Exp $ */ /*- * Copyright (c) 2009 Internet Initiative Japan Inc. @@ -200,7 +200,7 @@ npppd_ctl_imsg_compose(struct npppd_ctl *_this, struct imsgbuf *ibuf) npppd_ppp *ppp; struct stopped_ppp *e, *t; - if (ibuf->w.queued) + if (imsgbuf_queuelen(ibuf) > 0) return (0); cnt = 0; diff --git a/usr.sbin/npppd/npppd/privsep.c b/usr.sbin/npppd/npppd/privsep.c index 43ec8a4ce..e2304d907 100644 --- a/usr.sbin/npppd/npppd/privsep.c +++ b/usr.sbin/npppd/npppd/privsep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: privsep.c,v 1.26 2024/08/22 07:56:47 florian Exp $ */ +/* $OpenBSD: privsep.c,v 1.29 2024/11/21 13:43:10 claudio Exp $ */ /* * Copyright (c) 2010 Yasuoka Masahiko @@ -37,6 +37,7 @@ #include "npppd.h" #include "ppp.h" +#include "log.h" #ifndef nitems #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) @@ -191,7 +192,9 @@ privsep_init(void) close(pairsock[0]); privsep_sock = pairsock[1]; privsep_pid = pid; - imsg_init(&privsep_ibuf, privsep_sock); + if (imsgbuf_init(&privsep_ibuf, privsep_sock) == -1) + goto fail; + imsgbuf_allow_fdpass(&privsep_ibuf); return (0); /* NOTREACHED */ @@ -207,7 +210,7 @@ fail: void privsep_fini(void) { - imsg_clear(&privsep_ibuf); + imsgbuf_clear(&privsep_ibuf); if (privsep_sock >= 0) { close(privsep_sock); privsep_sock = -1; @@ -240,7 +243,7 @@ priv_bind(int sock, const struct sockaddr *name, socklen_t namelen) (void)imsg_compose(&privsep_ibuf, PRIVSEP_BIND, 0, 0, sock, &a, sizeof(a)); - imsg_flush(&privsep_ibuf); + imsgbuf_flush(&privsep_ibuf); return (privsep_common_resp()); } @@ -255,7 +258,7 @@ priv_socket(int domain, int type, int protocol) a.protocol = protocol; (void)imsg_compose(&privsep_ibuf, PRIVSEP_SOCKET, 0, 0, -1, &a, sizeof(a)); - imsg_flush(&privsep_ibuf); + imsgbuf_flush(&privsep_ibuf); return (privsep_recvfd()); } @@ -269,7 +272,7 @@ priv_open(const char *path, int flags) a.flags = flags; (void)imsg_compose(&privsep_ibuf, PRIVSEP_OPEN, 0, 0, -1, &a, sizeof(a)); - imsg_flush(&privsep_ibuf); + imsgbuf_flush(&privsep_ibuf); return (privsep_recvfd()); } @@ -316,7 +319,7 @@ priv_sendto(int s, const void *msg, int len, int flags, (void)imsg_composev(&privsep_ibuf, PRIVSEP_SENDTO, 0, 0, s, iov, nitems(iov)); - imsg_flush(&privsep_ibuf); + imsgbuf_flush(&privsep_ibuf); return (privsep_common_resp()); } @@ -335,7 +338,7 @@ priv_unlink(const char *path) strlcpy(a.path, path, sizeof(a.path)); (void)imsg_compose(&privsep_ibuf, PRIVSEP_UNLINK, 0, 0, -1, &a, sizeof(a)); - imsg_flush(&privsep_ibuf); + imsgbuf_flush(&privsep_ibuf); return (privsep_common_resp()); } @@ -357,7 +360,7 @@ priv_get_user_info(const char *path, const char *username, (void)imsg_compose(&privsep_ibuf, PRIVSEP_GET_USER_INFO, 0, 0, -1, &a, sizeof(a)); - imsg_flush(&privsep_ibuf); + imsgbuf_flush(&privsep_ibuf); if ((n = imsg_read_and_get(&privsep_ibuf, &imsg)) == -1) return (-1); @@ -416,7 +419,7 @@ priv_get_if_addr(const char *ifname, struct in_addr *addr) (void)imsg_compose(&privsep_ibuf, PRIVSEP_GET_IF_ADDR, 0, 0, -1, &a, sizeof(a)); - imsg_flush(&privsep_ibuf); + imsgbuf_flush(&privsep_ibuf); if (imsg_read_and_get(&privsep_ibuf, &imsg) == -1) return (-1); @@ -444,7 +447,7 @@ priv_delete_if_addr(const char *ifname) strlcpy(a.ifname, ifname, sizeof(a.ifname)); (void)imsg_compose(&privsep_ibuf, PRIVSEP_DEL_IF_ADDR, 0, 0, -1, &a, sizeof(a)); - imsg_flush(&privsep_ibuf); + imsgbuf_flush(&privsep_ibuf); return (privsep_common_resp()); } @@ -458,7 +461,7 @@ priv_set_if_addr(const char *ifname, struct in_addr *addr) a.addr = *addr; (void)imsg_compose(&privsep_ibuf, PRIVSEP_SET_IF_ADDR, 0, 0, -1, &a, sizeof(a)); - imsg_flush(&privsep_ibuf); + imsgbuf_flush(&privsep_ibuf); return (privsep_common_resp()); } @@ -476,7 +479,7 @@ priv_get_if_flags(const char *ifname, int *pflags) (void)imsg_compose(&privsep_ibuf, PRIVSEP_GET_IF_FLAGS, 0, 0, -1, &a, sizeof(a)); - imsg_flush(&privsep_ibuf); + imsgbuf_flush(&privsep_ibuf); if (imsg_read_and_get(&privsep_ibuf, &imsg) == -1) return (-1); @@ -504,7 +507,7 @@ priv_set_if_flags(const char *ifname, int flags) (void)imsg_compose(&privsep_ibuf, PRIVSEP_SET_IF_FLAGS, 0, 0, -1, &a, sizeof(a)); - imsg_flush(&privsep_ibuf); + imsgbuf_flush(&privsep_ibuf); return (privsep_common_resp()); } @@ -565,9 +568,11 @@ privsep_priv_main(int sock) { struct imsgbuf ibuf; - imsg_init(&ibuf, sock); + if (imsgbuf_init(&ibuf, sock) == -1) + fatal("imsgbuf_init"); + imsgbuf_allow_fdpass(&ibuf); privsep_priv_dispatch_imsg(&ibuf); - imsg_clear(&ibuf); + imsgbuf_clear(&ibuf); close(sock); exit(EXIT_SUCCESS); @@ -601,7 +606,7 @@ privsep_priv_dispatch_imsg(struct imsgbuf *ibuf) } (void)imsg_compose(ibuf, PRIVSEP_OK, 0, 0, f, &r, sizeof(r)); - imsg_flush(ibuf); + imsgbuf_flush(ibuf); } break; case PRIVSEP_SOCKET: { @@ -622,7 +627,7 @@ privsep_priv_dispatch_imsg(struct imsgbuf *ibuf) } (void)imsg_compose(ibuf, PRIVSEP_OK, 0, 0, s, &r, sizeof(r)); - imsg_flush(ibuf); + imsgbuf_flush(ibuf); } break; case PRIVSEP_UNLINK: { @@ -640,7 +645,7 @@ privsep_priv_dispatch_imsg(struct imsgbuf *ibuf) (void)imsg_compose(ibuf, PRIVSEP_OK, 0, 0, -1, &r, sizeof(r)); - imsg_flush(ibuf); + imsgbuf_flush(ibuf); } break; case PRIVSEP_BIND: { @@ -662,7 +667,7 @@ privsep_priv_dispatch_imsg(struct imsgbuf *ibuf) } (void)imsg_compose(ibuf, PRIVSEP_OK, 0, 0, -1, &r, sizeof(r)); - imsg_flush(ibuf); + imsgbuf_flush(ibuf); } break; case PRIVSEP_GET_USER_INFO: { @@ -739,7 +744,7 @@ on_broken_entry: } (void)imsg_compose(ibuf, PRIVSEP_OK, 0, 0, -1, &r, sizeof(r)); - imsg_flush(ibuf); + imsgbuf_flush(ibuf); } break; case PRIVSEP_SENDTO: { @@ -771,7 +776,7 @@ on_broken_entry: } (void)imsg_compose(ibuf, PRIVSEP_OK, 0, 0, -1, &r, sizeof(r)); - imsg_flush(ibuf); + imsgbuf_flush(ibuf); } break; case PRIVSEP_GET_IF_ADDR: { @@ -804,7 +809,7 @@ on_broken_entry: } (void)imsg_compose(ibuf, PRIVSEP_OK, 0, 0, -1, &r, sizeof(r)); - imsg_flush(ibuf); + imsgbuf_flush(ibuf); } break; case PRIVSEP_SET_IF_ADDR: { @@ -850,7 +855,7 @@ on_broken_entry: } (void)imsg_compose(ibuf, PRIVSEP_OK, 0, 0, -1, &r, sizeof(r)); - imsg_flush(ibuf); + imsgbuf_flush(ibuf); } break; case PRIVSEP_DEL_IF_ADDR: { @@ -878,7 +883,7 @@ on_broken_entry: } (void)imsg_compose(ibuf, PRIVSEP_OK, 0, 0, -1, &r, sizeof(r)); - imsg_flush(ibuf); + imsgbuf_flush(ibuf); } break; case PRIVSEP_GET_IF_FLAGS: { @@ -911,7 +916,7 @@ on_broken_entry: } (void)imsg_compose(ibuf, PRIVSEP_OK, 0, 0, -1, &r, sizeof(r)); - imsg_flush(ibuf); + imsgbuf_flush(ibuf); } break; case PRIVSEP_SET_IF_FLAGS: { @@ -940,7 +945,7 @@ on_broken_entry: } (void)imsg_compose(ibuf, PRIVSEP_OK, 0, 0, -1, &r, sizeof(r)); - imsg_flush(ibuf); + imsgbuf_flush(ibuf); } break; } @@ -954,11 +959,8 @@ imsg_read_and_get(struct imsgbuf *ibuf, struct imsg *imsg) ssize_t n; for (;;) { - if ((n = imsg_read(ibuf)) <= 0) { - if (n == -1 && (errno == EAGAIN || errno == EINTR)) - continue; + if (imsgbuf_read(ibuf) != 1) return (-1); - } if ((n = imsg_get(ibuf, imsg)) < 0) return (-1); if (n == 0) diff --git a/usr.sbin/ntpd/constraint.c b/usr.sbin/ntpd/constraint.c index 0647dd886..185efc139 100644 --- a/usr.sbin/ntpd/constraint.c +++ b/usr.sbin/ntpd/constraint.c @@ -1,4 +1,4 @@ -/* $OpenBSD: constraint.c,v 1.56 2023/12/20 15:36:36 otto Exp $ */ +/* $OpenBSD: constraint.c,v 1.60 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2015 Reyk Floeter @@ -235,7 +235,6 @@ priv_constraint_msg(u_int32_t id, u_int8_t *data, size_t len, int argc, struct ntp_addr *h; struct constraint *cstr; int pipes[2]; - int rv; if ((cstr = constraint_byid(id)) != NULL) { log_warnx("IMSG_CONSTRAINT_QUERY repeated for id %d", id); @@ -271,22 +270,42 @@ priv_constraint_msg(u_int32_t id, u_int8_t *data, size_t len, int argc, /* Prepare and send constraint data to child. */ cstr->fd = pipes[0]; - imsg_init(&cstr->ibuf, cstr->fd); + if (imsgbuf_init(&cstr->ibuf, cstr->fd) == -1) + fatal("imsgbuf_init"); if (imsg_compose(&cstr->ibuf, IMSG_CONSTRAINT_QUERY, id, 0, -1, data, len) == -1) fatal("%s: imsg_compose", __func__); - do { - rv = imsg_flush(&cstr->ibuf); - } while (rv == -1 && errno == EAGAIN); - if (rv == -1) - fatal("imsg_flush"); - /* * Fork child handlers and make sure to do any sensitive work in the * the (unprivileged) child. The parent should not do any parsing, * certificate loading etc. */ cstr->pid = start_child(CONSTRAINT_PROC_NAME, pipes[1], argc, argv); + + if (imsgbuf_flush(&cstr->ibuf) == -1) + fatal("imsgbuf_flush"); +} + +static int +imsgbuf_read_one(struct imsgbuf *imsgbuf, struct imsg *imsg) +{ + while (1) { + switch (imsg_get(imsgbuf, imsg)) { + case -1: + return (-1); + case 0: + break; + default: + return (1); + } + + switch (imsgbuf_read(imsgbuf)) { + case -1: + return (-1); + case 0: + return (0); + } + } } void @@ -295,15 +314,16 @@ priv_constraint_readquery(struct constraint *cstr, struct ntp_addr_msg *am, { struct ntp_addr *h; uint8_t *dptr; - int n; struct imsg imsg; size_t mlen; /* Read the message our parent left us. */ - if (((n = imsg_read(&cstr->ibuf)) == -1 && errno != EAGAIN) || n == 0) - fatal("%s: imsg_read", __func__); - if (((n = imsg_get(&cstr->ibuf, &imsg)) == -1) || n == 0) - fatal("%s: imsg_get", __func__); + switch (imsgbuf_read_one(&cstr->ibuf, &imsg)) { + case -1: + fatal("%s: imsgbuf_read_one", __func__); + case 0: + fatalx("%s: imsgbuf_read_one: connection closed", __func__); + } if (imsg.hdr.type != IMSG_CONSTRAINT_QUERY) fatalx("%s: invalid message type", __func__); @@ -347,7 +367,7 @@ priv_constraint_child(const char *pw_dir, uid_t pw_uid, gid_t pw_gid) struct sigaction sa; void *ctx; struct iovec iov[2]; - int i, rv; + int i; log_procinit("constraint"); @@ -381,7 +401,8 @@ priv_constraint_child(const char *pw_dir, uid_t pw_uid, gid_t pw_gid) fatal("pledge"); cstr.fd = CONSTRAINT_PASSFD; - imsg_init(&cstr.ibuf, cstr.fd); + if (imsgbuf_init(&cstr.ibuf, cstr.fd) == -1) + fatal("imsgbuf_init"); priv_constraint_readquery(&cstr, &am, &data); /* @@ -436,9 +457,7 @@ priv_constraint_child(const char *pw_dir, uid_t pw_uid, gid_t pw_gid) iov[1].iov_len = sizeof(xmttv); imsg_composev(&cstr.ibuf, IMSG_CONSTRAINT_RESULT, 0, 0, -1, iov, 2); - do { - rv = imsg_flush(&cstr.ibuf); - } while (rv == -1 && errno == EAGAIN); + imsgbuf_flush(&cstr.ibuf); /* Tear down the TLS connection after sending the result */ httpsdate_free(ctx); @@ -586,7 +605,7 @@ constraint_remove(struct constraint *cstr) { TAILQ_REMOVE(&conf->constraints, cstr, entry); - msgbuf_clear(&cstr->ibuf.w); + imsgbuf_clear(&cstr->ibuf); if (cstr->fd != -1) close(cstr->fd); free(cstr->addr_head.name); @@ -618,7 +637,7 @@ priv_constraint_dispatch(struct pollfd *pfd) if (!(pfd->revents & POLLIN)) return (0); - if (((n = imsg_read(&cstr->ibuf)) == -1 && errno != EAGAIN) || n == 0) { + if (imsgbuf_read(&cstr->ibuf) != 1) { /* there's a race between SIGCHLD delivery and reading imsg but if we've seen the reply, we're good */ priv_constraint_close(pfd->fd, cstr->state != diff --git a/usr.sbin/ntpd/control.c b/usr.sbin/ntpd/control.c index 824941186..85057e211 100644 --- a/usr.sbin/ntpd/control.c +++ b/usr.sbin/ntpd/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.21 2024/04/23 13:34:51 jsg Exp $ */ +/* $OpenBSD: control.c,v 1.27 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -149,7 +149,12 @@ control_accept(int listenfd) return (0); } - imsg_init(&ctl_conn->ibuf, connfd); + if (imsgbuf_init(&ctl_conn->ibuf, connfd) == -1) { + log_warn("control_accept"); + close(connfd); + free(ctl_conn); + return (0); + } TAILQ_INSERT_TAIL(&ctl_conns, ctl_conn, entry); @@ -179,7 +184,7 @@ control_close(int fd) return (0); } - msgbuf_clear(&c->ibuf.w); + imsgbuf_clear(&c->ibuf); TAILQ_REMOVE(&ctl_conns, c, entry); close(c->ibuf.fd); @@ -207,7 +212,7 @@ control_dispatch_msg(struct pollfd *pfd, u_int *ctl_cnt) } if (pfd->revents & POLLOUT) - if (msgbuf_write(&c->ibuf.w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(&c->ibuf) == -1) { *ctl_cnt -= control_close(pfd->fd); return (1); } @@ -215,7 +220,7 @@ control_dispatch_msg(struct pollfd *pfd, u_int *ctl_cnt) if (!(pfd->revents & POLLIN)) return (0); - if (((n = imsg_read(&c->ibuf)) == -1 && errno != EAGAIN) || n == 0) { + if (imsgbuf_read(&c->ibuf) != 1) { *ctl_cnt -= control_close(pfd->fd); return (1); } diff --git a/usr.sbin/ntpd/ntp.c b/usr.sbin/ntpd/ntp.c index 178d51ec3..5047baed2 100644 --- a/usr.sbin/ntpd/ntp.c +++ b/usr.sbin/ntpd/ntp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ntp.c,v 1.174 2024/02/21 03:31:28 deraadt Exp $ */ +/* $OpenBSD: ntp.c,v 1.181 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -159,10 +159,12 @@ ntp_main(struct ntpd_conf *nconf, struct passwd *pw, int argc, char **argv) if ((ibuf_main = malloc(sizeof(struct imsgbuf))) == NULL) fatal(NULL); - imsg_init(ibuf_main, PARENT_SOCK_FILENO); + if (imsgbuf_init(ibuf_main, PARENT_SOCK_FILENO) == -1) + fatal(NULL); if ((ibuf_dns = malloc(sizeof(struct imsgbuf))) == NULL) fatal(NULL); - imsg_init(ibuf_dns, pipe_dns[0]); + if (imsgbuf_init(ibuf_dns, pipe_dns[0]) == -1) + fatal(NULL); constraint_cnt = 0; conf->constraint_median = 0; @@ -332,15 +334,15 @@ ntp_main(struct ntpd_conf *nconf, struct passwd *pw, int argc, char **argv) clear_cdns = 0; } - if (ibuf_main->w.queued > 0) + if (imsgbuf_queuelen(ibuf_main) > 0) pfd[PFD_PIPE_MAIN].events |= POLLOUT; - if (ibuf_dns->w.queued > 0) + if (imsgbuf_queuelen(ibuf_dns) > 0) pfd[PFD_PIPE_DNS].events |= POLLOUT; TAILQ_FOREACH(cc, &ctl_conns, entry) { pfd[i].fd = cc->ibuf.fd; pfd[i].events = POLLIN; - if (cc->ibuf.w.queued > 0) + if (imsgbuf_queuelen(&cc->ibuf) > 0) pfd[i].events |= POLLOUT; i++; } @@ -365,8 +367,7 @@ ntp_main(struct ntpd_conf *nconf, struct passwd *pw, int argc, char **argv) } if (nfds > 0 && (pfd[PFD_PIPE_MAIN].revents & POLLOUT)) - if (msgbuf_write(&ibuf_main->w) <= 0 && - errno != EAGAIN) { + if (imsgbuf_write(ibuf_main) == -1) { log_warn("pipe write error (to parent)"); ntp_quit = 1; } @@ -380,8 +381,7 @@ ntp_main(struct ntpd_conf *nconf, struct passwd *pw, int argc, char **argv) } if (nfds > 0 && (pfd[PFD_PIPE_DNS].revents & POLLOUT)) - if (msgbuf_write(&ibuf_dns->w) <= 0 && - errno != EAGAIN) { + if (imsgbuf_write(ibuf_dns) == -1) { log_warn("pipe write error (to dns engine)"); ntp_quit = 1; } @@ -462,11 +462,11 @@ ntp_main(struct ntpd_conf *nconf, struct passwd *pw, int argc, char **argv) } } - msgbuf_write(&ibuf_main->w); - msgbuf_clear(&ibuf_main->w); + imsgbuf_write(ibuf_main); + imsgbuf_clear(ibuf_main); free(ibuf_main); - msgbuf_write(&ibuf_dns->w); - msgbuf_clear(&ibuf_dns->w); + imsgbuf_write(ibuf_dns); + imsgbuf_clear(ibuf_dns); free(ibuf_dns); log_info("ntp engine exiting"); @@ -479,7 +479,7 @@ ntp_dispatch_imsg(void) struct imsg imsg; int n; - if (((n = imsg_read(ibuf_main)) == -1 && errno != EAGAIN) || n == 0) + if (imsgbuf_read(ibuf_main) != 1) return (-1); for (;;) { @@ -553,7 +553,7 @@ ntp_dispatch_imsg_dns(void) size_t addrcount, peercount; int n; - if (((n = imsg_read(ibuf_dns)) == -1 && errno != EAGAIN) || n == 0) + if (imsgbuf_read(ibuf_dns) != 1) return (-1); for (;;) { diff --git a/usr.sbin/ntpd/ntp_dns.c b/usr.sbin/ntpd/ntp_dns.c index 8a8ef100e..401842bf5 100644 --- a/usr.sbin/ntpd/ntp_dns.c +++ b/usr.sbin/ntpd/ntp_dns.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ntp_dns.c,v 1.28 2023/04/19 12:58:16 jsg Exp $ */ +/* $OpenBSD: ntp_dns.c,v 1.36 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2003-2008 Henning Brauer @@ -94,7 +94,8 @@ ntp_dns(struct ntpd_conf *nconf, struct passwd *pw) if ((ibuf_dns = malloc(sizeof(struct imsgbuf))) == NULL) fatal(NULL); - imsg_init(ibuf_dns, PARENT_SOCK_FILENO); + if (imsgbuf_init(ibuf_dns, PARENT_SOCK_FILENO) == -1) + fatal(NULL); if (pledge("stdio dns", NULL) == -1) err(1, "pledge"); @@ -107,7 +108,7 @@ ntp_dns(struct ntpd_conf *nconf, struct passwd *pw) while (quit_dns == 0) { pfd[0].fd = ibuf_dns->fd; pfd[0].events = POLLIN; - if (ibuf_dns->w.queued) + if (imsgbuf_queuelen(ibuf_dns) > 0) pfd[0].events |= POLLOUT; if ((nfds = poll(pfd, 1, INFTIM)) == -1) @@ -117,8 +118,7 @@ ntp_dns(struct ntpd_conf *nconf, struct passwd *pw) } if (nfds > 0 && (pfd[0].revents & POLLOUT)) - if (msgbuf_write(&ibuf_dns->w) <= 0 && - errno != EAGAIN) { + if (imsgbuf_write(ibuf_dns) == -1) { log_warn("pipe write error (to ntp engine)"); quit_dns = 1; } @@ -130,7 +130,7 @@ ntp_dns(struct ntpd_conf *nconf, struct passwd *pw) } } - msgbuf_clear(&ibuf_dns->w); + imsgbuf_clear(ibuf_dns); free(ibuf_dns); exit(0); } @@ -146,7 +146,7 @@ dns_dispatch_imsg(struct ntpd_conf *nconf) const char *str; size_t len; - if (((n = imsg_read(ibuf_dns)) == -1 && errno != EAGAIN) || n == 0) + if (imsgbuf_read(ibuf_dns) != 1) return (-1); for (;;) { @@ -237,14 +237,29 @@ probe_root_ns(void) void probe_root(void) { - int n; + int i, n; + struct timespec start, probe_start, probe_end; + struct timespec duration; - n = probe_root_ns(); - if (n < 0) { - /* give programs like unwind a second chance */ - sleep(1); + clock_gettime(CLOCK_MONOTONIC, &start); + for (i = 0; ; i++) { + clock_gettime(CLOCK_MONOTONIC, &probe_start); n = probe_root_ns(); + clock_gettime(CLOCK_MONOTONIC, &probe_end); + if (n >= 0) + break; + timespecsub(&probe_end, &start, &duration); + if (duration.tv_sec > 5) + break; + timespecsub(&probe_end, &probe_start, &duration); + /* normally the probe takes 1s * nscount, but + sleep a little if the probe returned quickly */ + if (duration.tv_sec == 0) + sleep(1); } + if (i > 0) + log_warnx("DNS root probe failed %d times (%s)", i, + n >= 0 ? "eventually succeeded": "gave up"); if (imsg_compose(ibuf_dns, IMSG_PROBE_ROOT, 0, 0, -1, &n, sizeof(int)) == -1) fatalx("probe_root"); diff --git a/usr.sbin/ntpd/ntpd.c b/usr.sbin/ntpd/ntpd.c index 7f81bb9be..ed10c7f18 100644 --- a/usr.sbin/ntpd/ntpd.c +++ b/usr.sbin/ntpd/ntpd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ntpd.c,v 1.133 2024/05/21 05:00:48 jsg Exp $ */ +/* $OpenBSD: ntpd.c,v 1.142 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -274,7 +274,8 @@ main(int argc, char *argv[]) if ((ibuf = malloc(sizeof(struct imsgbuf))) == NULL) fatal(NULL); - imsg_init(ibuf, pipe_chld[0]); + if (imsgbuf_init(ibuf, pipe_chld[0]) == -1) + fatal(NULL); constraint_cnt = 0; @@ -304,7 +305,7 @@ main(int argc, char *argv[]) memset(pfd, 0, sizeof(*pfd) * pfd_elms); pfd[PFD_PIPE].fd = ibuf->fd; pfd[PFD_PIPE].events = POLLIN; - if (ibuf->w.queued) + if (imsgbuf_queuelen(ibuf) > 0) pfd[PFD_PIPE].events |= POLLOUT; i = PFD_MAX; @@ -333,7 +334,7 @@ main(int argc, char *argv[]) } if (nfds > 0 && (pfd[PFD_PIPE].revents & POLLOUT)) - if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(ibuf) == -1) { log_warn("pipe write error (to child)"); quit = 1; } @@ -365,7 +366,7 @@ main(int argc, char *argv[]) fatal("wait"); } while (pid != -1 || (pid == -1 && errno == EINTR)); - msgbuf_clear(&ibuf->w); + imsgbuf_clear(ibuf); free(ibuf); log_info("Terminating"); return (0); @@ -393,7 +394,7 @@ dispatch_imsg(struct ntpd_conf *lconf, int argc, char **argv) int n; double d; - if (((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) || n == 0) + if (imsgbuf_read(ibuf) != 1) return (-1); for (;;) { @@ -670,7 +671,8 @@ ctl_main(int argc, char *argv[]) if ((ibuf_ctl = malloc(sizeof(struct imsgbuf))) == NULL) err(1, NULL); - imsg_init(ibuf_ctl, fd); + if (imsgbuf_init(ibuf_ctl, fd) == -1) + err(1, NULL); switch (action) { case CTL_SHOW_STATUS: @@ -694,16 +696,15 @@ ctl_main(int argc, char *argv[]) break; /* NOTREACHED */ } - while (ibuf_ctl->w.queued) - if (msgbuf_write(&ibuf_ctl->w) <= 0 && errno != EAGAIN) - err(1, "ibuf_ctl: msgbuf_write error"); + if (imsgbuf_flush(ibuf_ctl) == -1) + err(1, "write error"); done = 0; while (!done) { - if ((n = imsg_read(ibuf_ctl)) == -1 && errno != EAGAIN) - err(1, "ibuf_ctl: imsg_read error"); + if ((n = imsgbuf_read(ibuf_ctl)) == -1) + err(1, "read error"); if (n == 0) - errx(1, "ntpctl: pipe closed"); + errx(1, "pipe closed"); while (!done) { if ((n = imsg_get(ibuf_ctl, &imsg)) == -1) diff --git a/usr.sbin/ocspcheck/ocspcheck.c b/usr.sbin/ocspcheck/ocspcheck.c index 9739e398e..ae4b8364f 100644 --- a/usr.sbin/ocspcheck/ocspcheck.c +++ b/usr.sbin/ocspcheck/ocspcheck.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ocspcheck.c,v 1.33 2024/03/24 11:30:12 beck Exp $ */ +/* $OpenBSD: ocspcheck.c,v 1.34 2024/12/04 07:58:51 tb Exp $ */ /* * Copyright (c) 2017,2020 Bob Beck @@ -556,8 +556,7 @@ main(int argc, char **argv) struct source sources[MAX_SERVERS_DNS]; int i, ch, staplefd = -1, infd = -1, nonce = 1; ocsp_request *request = NULL; - size_t rescount, httphsz = 0, instaplesz = 0; - struct httphead *httph = NULL; + size_t rescount, instaplesz = 0; struct httpget *hget; X509_STORE *castore; ssize_t written, w; @@ -682,8 +681,8 @@ main(int argc, char **argv) } dspew("Server at %s returns:\n", host); - for (i = 0; i < httphsz; i++) - dspew(" [%s]=[%s]\n", httph[i].key, httph[i].val); + for (i = 0; i < hget->headsz; i++) + dspew(" [%s]=[%s]\n", hget->head[i].key, hget->head[i].val); dspew(" [Body]=[%zu bytes]\n", hget->bodypartsz); if (hget->bodypartsz <= 0) errx(1, "No body in reply from %s", host); diff --git a/usr.sbin/ospf6ctl/ospf6ctl.c b/usr.sbin/ospf6ctl/ospf6ctl.c index 488ac927e..feeeaef81 100644 --- a/usr.sbin/ospf6ctl/ospf6ctl.c +++ b/usr.sbin/ospf6ctl/ospf6ctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ospf6ctl.c,v 1.54 2023/06/21 09:47:03 sthen Exp $ */ +/* $OpenBSD: ospf6ctl.c,v 1.59 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2005 Claudio Jeker @@ -132,7 +132,8 @@ main(int argc, char *argv[]) if ((ibuf = malloc(sizeof(struct imsgbuf))) == NULL) err(1, NULL); - imsg_init(ibuf, ctl_sock); + if (imsgbuf_init(ibuf, ctl_sock) == -1) + err(1, NULL); done = 0; /* process user request */ @@ -250,13 +251,12 @@ main(int argc, char *argv[]) #endif } - while (ibuf->w.queued) - if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN) - err(1, "write error"); + if (imsgbuf_flush(ibuf) == -1) + err(1, "write error"); while (!done) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - errx(1, "imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + err(1, "read error"); if (n == 0) errx(1, "pipe closed"); diff --git a/usr.sbin/ospf6d/control.c b/usr.sbin/ospf6d/control.c index c83a8a51f..9c345c46e 100644 --- a/usr.sbin/ospf6d/control.c +++ b/usr.sbin/ospf6d/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.32 2023/06/21 09:47:03 sthen Exp $ */ +/* $OpenBSD: control.c,v 1.38 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -176,7 +176,12 @@ control_accept(int listenfd, short event, void *bula) return; } - imsg_init(&c->iev.ibuf, connfd); + if (imsgbuf_init(&c->iev.ibuf, connfd) == -1) { + log_warn("imsgbuf_init"); + close(connfd); + free(c); + return; + } c->iev.handler = control_dispatch_imsg; c->iev.events = EV_READ; event_set(&c->iev.ev, c->iev.ibuf.fd, c->iev.events, @@ -222,7 +227,7 @@ control_close(int fd) return; } - msgbuf_clear(&c->iev.ibuf.w); + imsgbuf_clear(&c->iev.ibuf); TAILQ_REMOVE(&ctl_conns, c, entry); event_del(&c->iev.ev); @@ -252,14 +257,13 @@ control_dispatch_imsg(int fd, short event, void *bula) } if (event & EV_READ) { - if (((n = imsg_read(&c->iev.ibuf)) == -1 && errno != EAGAIN) || - n == 0) { + if (imsgbuf_read(&c->iev.ibuf) != 1) { control_close(fd); return; } } if (event & EV_WRITE) { - if (msgbuf_write(&c->iev.ibuf.w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(&c->iev.ibuf) == -1) { control_close(fd); return; } diff --git a/usr.sbin/ospf6d/kroute.c b/usr.sbin/ospf6d/kroute.c index 962b3627f..58b63c381 100644 --- a/usr.sbin/ospf6d/kroute.c +++ b/usr.sbin/ospf6d/kroute.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kroute.c,v 1.69 2024/05/18 11:17:30 jsg Exp $ */ +/* $OpenBSD: kroute.c,v 1.70 2025/01/02 06:35:57 anton Exp $ */ /* * Copyright (c) 2004 Esben Norby @@ -1099,7 +1099,8 @@ if_announce(void *msg) break; case IFAN_DEPARTURE: iface = if_find(ifan->ifan_index); - if_del(iface); + if (iface != NULL) + if_del(iface); break; } } diff --git a/usr.sbin/ospf6d/ospf6d.c b/usr.sbin/ospf6d/ospf6d.c index 224d6cd5b..8861abb0e 100644 --- a/usr.sbin/ospf6d/ospf6d.c +++ b/usr.sbin/ospf6d/ospf6d.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ospf6d.c,v 1.54 2023/06/21 09:47:03 sthen Exp $ */ +/* $OpenBSD: ospf6d.c,v 1.61 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2005 Claudio Jeker @@ -254,9 +254,12 @@ main(int argc, char *argv[]) if ((iev_ospfe = malloc(sizeof(struct imsgev))) == NULL || (iev_rde = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_ospfe->ibuf, pipe_parent2ospfe[0]); + if (imsgbuf_init(&iev_ospfe->ibuf, pipe_parent2ospfe[0]) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_ospfe->ibuf); iev_ospfe->handler = main_dispatch_ospfe; - imsg_init(&iev_rde->ibuf, pipe_parent2rde[0]); + if (imsgbuf_init(&iev_rde->ibuf, pipe_parent2rde[0]) == -1) + fatal(NULL); iev_rde->handler = main_dispatch_rde; /* setup event handler */ @@ -299,9 +302,9 @@ ospfd_shutdown(void) int status; /* close pipes */ - msgbuf_clear(&iev_ospfe->ibuf.w); + imsgbuf_clear(&iev_ospfe->ibuf); close(iev_ospfe->ibuf.fd); - msgbuf_clear(&iev_rde->ibuf.w); + imsgbuf_clear(&iev_rde->ibuf); close(iev_rde->ibuf.fd); control_cleanup(); @@ -340,16 +343,18 @@ main_dispatch_ospfe(int fd, short event, void *bula) int shut = 0, verbose; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -416,16 +421,18 @@ main_dispatch_rde(int fd, short event, void *bula) int count, shut = 0; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -492,7 +499,7 @@ void imsg_event_add(struct imsgev *iev) { iev->events = EV_READ; - if (iev->ibuf.w.queued) + if (imsgbuf_queuelen(&iev->ibuf) > 0) iev->events |= EV_WRITE; event_del(&iev->ev); diff --git a/usr.sbin/ospf6d/ospfe.c b/usr.sbin/ospf6d/ospfe.c index 0627ca711..872b8a233 100644 --- a/usr.sbin/ospf6d/ospfe.c +++ b/usr.sbin/ospf6d/ospfe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ospfe.c,v 1.72 2024/05/15 08:45:03 job Exp $ */ +/* $OpenBSD: ospfe.c,v 1.78 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2005 Claudio Jeker @@ -155,9 +155,12 @@ ospfe(struct ospfd_conf *xconf, int pipe_parent2ospfe[2], int pipe_ospfe2rde[2], if ((iev_rde = malloc(sizeof(struct imsgev))) == NULL || (iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_rde->ibuf, pipe_ospfe2rde[0]); + if (imsgbuf_init(&iev_rde->ibuf, pipe_ospfe2rde[0]) == -1) + fatal(NULL); iev_rde->handler = ospfe_dispatch_rde; - imsg_init(&iev_main->ibuf, pipe_parent2ospfe[1]); + if (imsgbuf_init(&iev_main->ibuf, pipe_parent2ospfe[1]) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_main->ibuf); iev_main->handler = ospfe_dispatch_main; /* setup event handler */ @@ -199,11 +202,11 @@ ospfe_shutdown(void) struct iface *iface; /* close pipes */ - msgbuf_write(&iev_rde->ibuf.w); - msgbuf_clear(&iev_rde->ibuf.w); + imsgbuf_write(&iev_rde->ibuf); + imsgbuf_clear(&iev_rde->ibuf); close(iev_rde->ibuf.fd); - msgbuf_write(&iev_main->ibuf.w); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_write(&iev_main->ibuf); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); /* stop all interfaces and remove all areas */ @@ -258,16 +261,18 @@ ospfe_dispatch_main(int fd, short event, void *bula) int n, stub_changed, shut = 0, isvalid, wasvalid; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -449,16 +454,18 @@ ospfe_dispatch_rde(int fd, short event, void *bula) u_int16_t l, age; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { diff --git a/usr.sbin/ospf6d/rde.c b/usr.sbin/ospf6d/rde.c index 53e483d0d..2a2fe2230 100644 --- a/usr.sbin/ospf6d/rde.c +++ b/usr.sbin/ospf6d/rde.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rde.c,v 1.91 2023/03/08 04:43:14 guenther Exp $ */ +/* $OpenBSD: rde.c,v 1.97 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2004, 2005 Claudio Jeker @@ -179,9 +179,11 @@ rde(struct ospfd_conf *xconf, int pipe_parent2rde[2], int pipe_ospfe2rde[2], if ((iev_ospfe = malloc(sizeof(struct imsgev))) == NULL || (iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_ospfe->ibuf, pipe_ospfe2rde[1]); + if (imsgbuf_init(&iev_ospfe->ibuf, pipe_ospfe2rde[1]) == -1) + fatal(NULL); iev_ospfe->handler = rde_dispatch_imsg; - imsg_init(&iev_main->ibuf, pipe_parent2rde[1]); + if (imsgbuf_init(&iev_main->ibuf, pipe_parent2rde[1]) == -1) + fatal(NULL); iev_main->handler = rde_dispatch_parent; /* setup event handler */ @@ -220,9 +222,9 @@ rde_shutdown(void) struct vertex *v, *nv; /* close pipes */ - msgbuf_clear(&iev_ospfe->ibuf.w); + imsgbuf_clear(&iev_ospfe->ibuf); close(iev_ospfe->ibuf.fd); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); stop_spf_timer(rdeconf); @@ -276,16 +278,18 @@ rde_dispatch_imsg(int fd, short event, void *bula) u_int16_t l; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } clock_gettime(CLOCK_MONOTONIC, &tp); @@ -650,16 +654,18 @@ rde_dispatch_parent(int fd, short event, void *bula) int shut = 0, link_ok, prev_link_ok, orig_lsa; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { diff --git a/usr.sbin/ospfctl/ospfctl.c b/usr.sbin/ospfctl/ospfctl.c index e41f739c3..7fdd8f237 100644 --- a/usr.sbin/ospfctl/ospfctl.c +++ b/usr.sbin/ospfctl/ospfctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ospfctl.c,v 1.68 2020/05/20 11:11:24 denis Exp $ */ +/* $OpenBSD: ospfctl.c,v 1.73 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2005 Claudio Jeker @@ -106,7 +106,8 @@ main(int argc, char *argv[]) if ((ibuf = malloc(sizeof(struct imsgbuf))) == NULL) err(1, NULL); - imsg_init(ibuf, ctl_sock); + if (imsgbuf_init(ibuf, ctl_sock) == -1) + err(1, NULL); done = 0; /* process user request */ @@ -213,17 +214,16 @@ main(int argc, char *argv[]) break; } - while (ibuf->w.queued) - if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN) - err(1, "write error"); + if (imsgbuf_flush(ibuf) == -1) + err(1, "write error"); /* no output for certain commands such as log verbose */ if (!done) { output->head(res); while (!done) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - errx(1, "imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + err(1, "read error"); if (n == 0) errx(1, "pipe closed"); diff --git a/usr.sbin/ospfd/control.c b/usr.sbin/ospfd/control.c index 80195b315..43393e85f 100644 --- a/usr.sbin/ospfd/control.c +++ b/usr.sbin/ospfd/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.48 2023/03/08 04:43:14 guenther Exp $ */ +/* $OpenBSD: control.c,v 1.54 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -176,7 +176,12 @@ control_accept(int listenfd, short event, void *bula) return; } - imsg_init(&c->iev.ibuf, connfd); + if (imsgbuf_init(&c->iev.ibuf, connfd) == -1) { + log_warn("imsgbuf_init"); + close(connfd); + free(c); + return; + } c->iev.handler = control_dispatch_imsg; c->iev.events = EV_READ; event_set(&c->iev.ev, c->iev.ibuf.fd, c->iev.events, @@ -222,7 +227,7 @@ control_close(int fd) return; } - msgbuf_clear(&c->iev.ibuf.w); + imsgbuf_clear(&c->iev.ibuf); TAILQ_REMOVE(&ctl_conns, c, entry); event_del(&c->iev.ev); @@ -252,14 +257,13 @@ control_dispatch_imsg(int fd, short event, void *bula) } if (event & EV_READ) { - if (((n = imsg_read(&c->iev.ibuf)) == -1 && errno != EAGAIN) || - n == 0) { + if (imsgbuf_read(&c->iev.ibuf) != 1) { control_close(fd); return; } } if (event & EV_WRITE) { - if (msgbuf_write(&c->iev.ibuf.w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(&c->iev.ibuf) == -1) { control_close(fd); return; } diff --git a/usr.sbin/ospfd/kroute.c b/usr.sbin/ospfd/kroute.c index b83514d17..08e9c5006 100644 --- a/usr.sbin/ospfd/kroute.c +++ b/usr.sbin/ospfd/kroute.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kroute.c,v 1.117 2023/03/08 04:43:14 guenther Exp $ */ +/* $OpenBSD: kroute.c,v 1.118 2025/01/01 13:44:52 anton Exp $ */ /* * Copyright (c) 2004 Esben Norby @@ -1170,7 +1170,8 @@ if_announce(void *msg) break; case IFAN_DEPARTURE: kif = kif_find(ifan->ifan_index); - kif_remove(kif); + if (kif != NULL) + kif_remove(kif); break; } } diff --git a/usr.sbin/ospfd/ospfd.c b/usr.sbin/ospfd/ospfd.c index 4c3ae9bbb..44afbbc8e 100644 --- a/usr.sbin/ospfd/ospfd.c +++ b/usr.sbin/ospfd/ospfd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ospfd.c,v 1.117 2023/03/08 04:43:14 guenther Exp $ */ +/* $OpenBSD: ospfd.c,v 1.124 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2005 Claudio Jeker @@ -260,9 +260,12 @@ main(int argc, char *argv[]) if ((iev_ospfe = malloc(sizeof(struct imsgev))) == NULL || (iev_rde = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_ospfe->ibuf, pipe_parent2ospfe[0]); + if (imsgbuf_init(&iev_ospfe->ibuf, pipe_parent2ospfe[0]) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_ospfe->ibuf); iev_ospfe->handler = main_dispatch_ospfe; - imsg_init(&iev_rde->ibuf, pipe_parent2rde[0]); + if (imsgbuf_init(&iev_rde->ibuf, pipe_parent2rde[0]) == -1) + fatal(NULL); iev_rde->handler = main_dispatch_rde; /* setup event handler */ @@ -311,9 +314,9 @@ ospfd_shutdown(void) struct redistribute *r; /* close pipes */ - msgbuf_clear(&iev_ospfe->ibuf.w); + imsgbuf_clear(&iev_ospfe->ibuf); close(iev_ospfe->ibuf.fd); - msgbuf_clear(&iev_rde->ibuf.w); + imsgbuf_clear(&iev_rde->ibuf); close(iev_rde->ibuf.fd); control_cleanup(); @@ -358,16 +361,18 @@ main_dispatch_ospfe(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -444,16 +449,18 @@ main_dispatch_rde(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -517,7 +524,7 @@ void imsg_event_add(struct imsgev *iev) { iev->events = EV_READ; - if (iev->ibuf.w.queued) + if (imsgbuf_queuelen(&iev->ibuf) > 0) iev->events |= EV_WRITE; event_del(&iev->ev); diff --git a/usr.sbin/ospfd/ospfe.c b/usr.sbin/ospfd/ospfe.c index 575dbb898..c7983a9ef 100644 --- a/usr.sbin/ospfd/ospfe.c +++ b/usr.sbin/ospfd/ospfe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ospfe.c,v 1.114 2023/12/13 15:34:27 claudio Exp $ */ +/* $OpenBSD: ospfe.c,v 1.120 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2005 Claudio Jeker @@ -155,9 +155,12 @@ ospfe(struct ospfd_conf *xconf, int pipe_parent2ospfe[2], int pipe_ospfe2rde[2], if ((iev_rde = malloc(sizeof(struct imsgev))) == NULL || (iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_rde->ibuf, pipe_ospfe2rde[0]); + if (imsgbuf_init(&iev_rde->ibuf, pipe_ospfe2rde[0]) == -1) + fatal(NULL); iev_rde->handler = ospfe_dispatch_rde; - imsg_init(&iev_main->ibuf, pipe_parent2ospfe[1]); + if (imsgbuf_init(&iev_main->ibuf, pipe_parent2ospfe[1]) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_main->ibuf); iev_main->handler = ospfe_dispatch_main; /* setup event handler */ @@ -210,11 +213,11 @@ ospfe_shutdown(void) struct iface *iface; /* close pipes */ - msgbuf_write(&iev_rde->ibuf.w); - msgbuf_clear(&iev_rde->ibuf.w); + imsgbuf_write(&iev_rde->ibuf); + imsgbuf_clear(&iev_rde->ibuf); close(iev_rde->ibuf.fd); - msgbuf_write(&iev_main->ibuf.w); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_write(&iev_main->ibuf); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); /* stop all interfaces and remove all areas */ @@ -272,16 +275,18 @@ ospfe_dispatch_main(int fd, short event, void *bula) int n, link_ok, stub_changed, shut = 0; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -494,16 +499,18 @@ ospfe_dispatch_rde(int fd, short event, void *bula) u_int16_t l, age; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { diff --git a/usr.sbin/ospfd/rde.c b/usr.sbin/ospfd/rde.c index 725f90776..c438f3c75 100644 --- a/usr.sbin/ospfd/rde.c +++ b/usr.sbin/ospfd/rde.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rde.c,v 1.112 2023/03/08 04:43:14 guenther Exp $ */ +/* $OpenBSD: rde.c,v 1.118 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2004, 2005 Claudio Jeker @@ -161,9 +161,11 @@ rde(struct ospfd_conf *xconf, int pipe_parent2rde[2], int pipe_ospfe2rde[2], if ((iev_ospfe = malloc(sizeof(struct imsgev))) == NULL || (iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_ospfe->ibuf, pipe_ospfe2rde[1]); + if (imsgbuf_init(&iev_ospfe->ibuf, pipe_ospfe2rde[1]) == -1) + fatal(NULL); iev_ospfe->handler = rde_dispatch_imsg; - imsg_init(&iev_main->ibuf, pipe_parent2rde[1]); + if (imsgbuf_init(&iev_main->ibuf, pipe_parent2rde[1]) == -1) + fatal(NULL); iev_main->handler = rde_dispatch_parent; /* setup event handler */ @@ -206,9 +208,9 @@ rde_shutdown(void) struct vertex *v, *nv; /* close pipes */ - msgbuf_clear(&iev_ospfe->ibuf.w); + imsgbuf_clear(&iev_ospfe->ibuf); close(iev_ospfe->ibuf.fd); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); stop_spf_timer(rdeconf); @@ -266,16 +268,18 @@ rde_dispatch_imsg(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } clock_gettime(CLOCK_MONOTONIC, &tp); @@ -649,16 +653,18 @@ rde_dispatch_parent(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { diff --git a/usr.sbin/pkg_add/OpenBSD/PkgAdd.pm b/usr.sbin/pkg_add/OpenBSD/PkgAdd.pm index 01b59404e..6d8698c0d 100644 --- a/usr.sbin/pkg_add/OpenBSD/PkgAdd.pm +++ b/usr.sbin/pkg_add/OpenBSD/PkgAdd.pm @@ -1,7 +1,7 @@ #! /usr/bin/perl # ex:ts=8 sw=4: -# $OpenBSD: PkgAdd.pm,v 1.150 2024/01/02 10:25:48 espie Exp $ +# $OpenBSD: PkgAdd.pm,v 1.151 2024/12/02 22:32:57 sthen Exp $ # # Copyright (c) 2003-2014 Marc Espie # @@ -847,6 +847,7 @@ sub really_add($set, $state) $handle->location->{repository}->setup_cache($state->{setlist}); } } + $state->ldconfig->ensure; delete $state->{partial}; $set->{solver}->register_dependencies($state); if ($replacing) { diff --git a/usr.sbin/pppd/chat/chat.c b/usr.sbin/pppd/chat/chat.c index 386404eb5..fd02906b0 100644 --- a/usr.sbin/pppd/chat/chat.c +++ b/usr.sbin/pppd/chat/chat.c @@ -1,4 +1,4 @@ -/* $OpenBSD: chat.c,v 1.38 2024/08/17 15:42:20 denis Exp $ */ +/* $OpenBSD: chat.c,v 1.39 2024/11/04 11:12:52 deraadt Exp $ */ /* * Chat -- a program for automatic session establishment (i.e. dial @@ -213,6 +213,7 @@ int main(int, char *[]); int main(int argc, char **argv) { + const char *errstr; int option; tzset(); @@ -245,7 +246,9 @@ main(int argc, char **argv) break; case 't': - timeout = atoi(optarg); + timeout = strtonum(optarg, 0, 10000, &errstr); + if (errstr) + fatal(2, "-t %s: %s\n", optarg, errstr); break; case 'r': @@ -949,6 +952,8 @@ char *character(int c) */ void chat_send (char *s) { + const char *errstr; + if (say_next) { say_next = 0; s = clean(s,0); @@ -1076,8 +1081,11 @@ void chat_send (char *s) if (timeout_next) { timeout_next = 0; - timeout = atoi(s); - + timeout = strtonum(s, -1, 10000, &errstr); + if (errstr) { + logmsg("invalid timeout %s: %s\n", s, errstr); + timeout = -1; + } if (timeout <= 0) timeout = DEFAULT_CHAT_TIMEOUT; diff --git a/usr.sbin/pppd/pppstats/pppstats.c b/usr.sbin/pppd/pppstats/pppstats.c index 1f5463c51..bc995e21c 100644 --- a/usr.sbin/pppd/pppstats/pppstats.c +++ b/usr.sbin/pppd/pppstats/pppstats.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pppstats.c,v 1.14 2024/08/10 05:32:28 jsg Exp $ */ +/* $OpenBSD: pppstats.c,v 1.15 2024/11/04 11:12:52 deraadt Exp $ */ /* * print PPP statistics: @@ -305,6 +305,7 @@ intpr(void) int main(int argc, char *argv[]) { + const char *errstr; int c; struct ifreq ifr; @@ -328,13 +329,13 @@ main(int argc, char *argv[]) zflag = 1; break; case 'c': - count = atoi(optarg); - if (count <= 0) + count = strtonum(optarg, 1, 1000, &errstr); + if (errstr) usage(); break; case 'w': - interval = atoi(optarg); - if (interval <= 0) + interval = strtonum(optarg, 1, 1000, &errstr); + if (errstr) usage(); break; default: diff --git a/usr.sbin/pppd/sys-bsd.c b/usr.sbin/pppd/sys-bsd.c index 8e41f159b..efbdd7035 100644 --- a/usr.sbin/pppd/sys-bsd.c +++ b/usr.sbin/pppd/sys-bsd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sys-bsd.c,v 1.36 2024/08/17 09:52:11 denis Exp $ */ +/* $OpenBSD: sys-bsd.c,v 1.37 2024/11/04 11:12:52 deraadt Exp $ */ /* * sys-bsd.c - System-dependent procedures for setting up @@ -1409,6 +1409,7 @@ GetMask(u_int32_t addr) int lock(char *dev) { + const char *errstr; char hdb_lock_buffer[12]; int fd, n; pid_t pid; @@ -1429,8 +1430,11 @@ lock(char *dev) close(fd); } else { hdb_lock_buffer[n] = 0; - pid = atoi(hdb_lock_buffer); - if (kill(pid, 0) == -1 && errno == ESRCH) { + pid = strtonum(hdb_lock_buffer, 1, 65535, &errstr); + if (errstr) + syslog(LOG_NOTICE, "lock file %s contains garbage: %s\n", + dev, errstr); + else if (kill(pid, 0) == -1 && errno == ESRCH) { /* pid no longer exists - remove the lock file */ if (unlink(lock_file) == 0) { close(fd); diff --git a/usr.sbin/procmap/procmap.c b/usr.sbin/procmap/procmap.c index c8d19a106..ea307adb0 100644 --- a/usr.sbin/procmap/procmap.c +++ b/usr.sbin/procmap/procmap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: procmap.c,v 1.73 2024/08/28 14:22:36 naddy Exp $ */ +/* $OpenBSD: procmap.c,v 1.74 2024/10/20 11:21:24 claudio Exp $ */ /* $NetBSD: pmap.c,v 1.1 2002/09/01 20:32:44 atatat Exp $ */ /* @@ -459,8 +459,14 @@ process_map(kvm_t *kd, pid_t pid, struct kinfo_proc *proc, struct sum *sum) vmmap_flags & VM_MAP_PAGEABLE ? " PAGEABLE" : "", vmmap_flags & VM_MAP_INTRSAFE ? " INTRSAFE" : "", vmmap_flags & VM_MAP_WIREFUTURE ? " WIREFUTURE" : "", - vmmap_flags & VM_MAP_BUSY ? " BUSY" : "", - vmmap_flags & VM_MAP_WANTLOCK ? " WANTLOCK" : "", +#ifdef VM_MAP_BUSY + vmmap_flags & VM_MAP_BUSY ? " BUSY" : +#endif + "", +#ifdef VM_MAP_WANTLOCK + vmmap_flags & VM_MAP_WANTLOCK ? " WANTLOCK" : +#endif + "", #if VM_MAP_TOPDOWN > 0 vmmap_flags & VM_MAP_TOPDOWN ? " TOPDOWN" : #endif diff --git a/usr.sbin/ractl/ractl.c b/usr.sbin/ractl/ractl.c index 39fefa4b8..7b9baa90d 100644 --- a/usr.sbin/ractl/ractl.c +++ b/usr.sbin/ractl/ractl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ractl.c,v 1.3 2021/02/27 10:35:20 florian Exp $ */ +/* $OpenBSD: ractl.c,v 1.8 2024/11/21 13:38:14 claudio Exp $ */ /* * Copyright (c) 2005 Claudio Jeker @@ -100,7 +100,8 @@ main(int argc, char *argv[]) if ((ibuf = malloc(sizeof(struct imsgbuf))) == NULL) err(1, NULL); - imsg_init(ibuf, ctl_sock); + if (imsgbuf_init(ibuf, ctl_sock) == -1) + err(1, NULL); done = 0; /* Process user request. */ @@ -123,13 +124,12 @@ main(int argc, char *argv[]) usage(); } - while (ibuf->w.queued) - if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN) - err(1, "write error"); + if (imsgbuf_flush(ibuf) == -1) + err(1, "write error"); while (!done) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - errx(1, "imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + err(1, "read error"); if (n == 0) errx(1, "pipe closed"); diff --git a/usr.sbin/rad/control.c b/usr.sbin/rad/control.c index 435893aed..3c1ea1a6b 100644 --- a/usr.sbin/rad/control.c +++ b/usr.sbin/rad/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.8 2021/03/02 04:10:07 jsg Exp $ */ +/* $OpenBSD: control.c,v 1.14 2024/11/21 13:38:15 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -155,7 +155,12 @@ control_accept(int listenfd, short event, void *bula) return; } - imsg_init(&c->iev.ibuf, connfd); + if (imsgbuf_init(&c->iev.ibuf, connfd) == -1) { + log_warn("%s: imsgbuf_init", __func__); + close(connfd); + free(c); + return; + } c->iev.handler = control_dispatch_imsg; c->iev.events = EV_READ; event_set(&c->iev.ev, c->iev.ibuf.fd, c->iev.events, @@ -201,7 +206,7 @@ control_close(int fd) return; } - msgbuf_clear(&c->iev.ibuf.w); + imsgbuf_clear(&c->iev.ibuf); TAILQ_REMOVE(&ctl_conns, c, entry); event_del(&c->iev.ev); @@ -230,14 +235,13 @@ control_dispatch_imsg(int fd, short event, void *bula) } if (event & EV_READ) { - if (((n = imsg_read(&c->iev.ibuf)) == -1 && errno != EAGAIN) || - n == 0) { + if (imsgbuf_read(&c->iev.ibuf) != 1) { control_close(fd); return; } } if (event & EV_WRITE) { - if (msgbuf_write(&c->iev.ibuf.w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(&c->iev.ibuf) == -1) { control_close(fd); return; } diff --git a/usr.sbin/rad/engine.c b/usr.sbin/rad/engine.c index 1205509d6..cc18b5537 100644 --- a/usr.sbin/rad/engine.c +++ b/usr.sbin/rad/engine.c @@ -1,4 +1,4 @@ -/* $OpenBSD: engine.c,v 1.22 2023/12/14 11:09:34 claudio Exp $ */ +/* $OpenBSD: engine.c,v 1.28 2024/11/21 13:38:15 claudio Exp $ */ /* * Copyright (c) 2018 Florian Obser @@ -134,7 +134,9 @@ engine(int debug, int verbose) if ((iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_main->ibuf, 3); + if (imsgbuf_init(&iev_main->ibuf, 3) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_main->ibuf); iev_main->handler = engine_dispatch_main; /* Setup event handlers. */ @@ -159,9 +161,9 @@ __dead void engine_shutdown(void) { /* Close pipes. */ - msgbuf_clear(&iev_frontend->ibuf.w); + imsgbuf_clear(&iev_frontend->ibuf); close(iev_frontend->ibuf.fd); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); config_clear(engine_conf); @@ -194,16 +196,18 @@ engine_dispatch_frontend(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -276,16 +280,18 @@ engine_dispatch_main(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -312,7 +318,8 @@ engine_dispatch_main(int fd, short event, void *bula) if (iev_frontend == NULL) fatal(NULL); - imsg_init(&iev_frontend->ibuf, fd); + if (imsgbuf_init(&iev_frontend->ibuf, fd) == -1) + fatal(NULL); iev_frontend->handler = engine_dispatch_frontend; iev_frontend->events = EV_READ; diff --git a/usr.sbin/rad/frontend.c b/usr.sbin/rad/frontend.c index c700c079e..6687f17f9 100644 --- a/usr.sbin/rad/frontend.c +++ b/usr.sbin/rad/frontend.c @@ -1,4 +1,4 @@ -/* $OpenBSD: frontend.c,v 1.49 2024/07/02 17:41:27 florian Exp $ */ +/* $OpenBSD: frontend.c,v 1.55 2024/11/21 13:38:15 claudio Exp $ */ /* * Copyright (c) 2018 Florian Obser @@ -240,7 +240,9 @@ frontend(int debug, int verbose) /* Setup pipe and event handler to the parent process. */ if ((iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_main->ibuf, 3); + if (imsgbuf_init(&iev_main->ibuf, 3) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_main->ibuf); iev_main->handler = frontend_dispatch_main; iev_main->events = EV_READ; event_set(&iev_main->ev, iev_main->ibuf.fd, iev_main->events, @@ -273,11 +275,11 @@ __dead void frontend_shutdown(void) { /* Close pipes. */ - msgbuf_write(&iev_engine->ibuf.w); - msgbuf_clear(&iev_engine->ibuf.w); + imsgbuf_write(&iev_engine->ibuf); + imsgbuf_clear(&iev_engine->ibuf); close(iev_engine->ibuf.fd); - msgbuf_write(&iev_main->ibuf.w); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_write(&iev_main->ibuf); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); config_clear(frontend_conf); @@ -319,16 +321,18 @@ frontend_dispatch_main(int fd, short event, void *bula) int n, shut = 0, icmp6sock, rdomain; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -355,7 +359,8 @@ frontend_dispatch_main(int fd, short event, void *bula) if (iev_engine == NULL) fatal(NULL); - imsg_init(&iev_engine->ibuf, fd); + if (imsgbuf_init(&iev_engine->ibuf, fd) == -1) + fatal(NULL); iev_engine->handler = frontend_dispatch_engine; iev_engine->events = EV_READ; @@ -532,16 +537,18 @@ frontend_dispatch_engine(int fd, short event, void *bula) int n, shut = 0; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { diff --git a/usr.sbin/rad/rad.c b/usr.sbin/rad/rad.c index 036a73e17..ae073db17 100644 --- a/usr.sbin/rad/rad.c +++ b/usr.sbin/rad/rad.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rad.c,v 1.31 2024/05/21 05:00:48 jsg Exp $ */ +/* $OpenBSD: rad.c,v 1.38 2024/11/21 13:38:15 claudio Exp $ */ /* * Copyright (c) 2018 Florian Obser @@ -240,9 +240,13 @@ main(int argc, char *argv[]) if ((iev_frontend = malloc(sizeof(struct imsgev))) == NULL || (iev_engine = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_frontend->ibuf, pipe_main2frontend[0]); + if (imsgbuf_init(&iev_frontend->ibuf, pipe_main2frontend[0]) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_frontend->ibuf); iev_frontend->handler = main_dispatch_frontend; - imsg_init(&iev_engine->ibuf, pipe_main2engine[0]); + if (imsgbuf_init(&iev_engine->ibuf, pipe_main2engine[0]) == -1) + fatal(NULL); + imsgbuf_allow_fdpass(&iev_engine->ibuf); iev_engine->handler = main_dispatch_engine; /* Setup event handlers for pipes to engine & frontend. */ @@ -298,9 +302,9 @@ main_shutdown(void) int status; /* Close pipes. */ - msgbuf_clear(&iev_frontend->ibuf.w); + imsgbuf_clear(&iev_frontend->ibuf); close(iev_frontend->ibuf.fd); - msgbuf_clear(&iev_engine->ibuf.w); + imsgbuf_clear(&iev_engine->ibuf); close(iev_engine->ibuf.fd); config_clear(main_conf); @@ -381,16 +385,18 @@ main_dispatch_frontend(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -449,16 +455,18 @@ main_dispatch_engine(int fd, short event, void *bula) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* Connection closed. */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* Connection closed. */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -506,7 +514,7 @@ void imsg_event_add(struct imsgev *iev) { iev->events = EV_READ; - if (iev->ibuf.w.queued) + if (imsgbuf_queuelen(&iev->ibuf) > 0) iev->events |= EV_WRITE; event_del(&iev->ev); diff --git a/usr.sbin/rad/rad.conf.5 b/usr.sbin/rad/rad.conf.5 index 7c95a8cce..beb75c38c 100644 --- a/usr.sbin/rad/rad.conf.5 +++ b/usr.sbin/rad/rad.conf.5 @@ -1,4 +1,4 @@ -.\" $OpenBSD: rad.conf.5,v 1.25 2024/05/31 16:19:53 florian Exp $ +.\" $OpenBSD: rad.conf.5,v 1.27 2024/12/28 08:58:13 florian Exp $ .\" .\" Copyright (c) 2018 Florian Obser .\" Copyright (c) 2005 Esben Norby @@ -18,7 +18,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: May 31 2024 $ +.Dd $Mdocdate: December 28 2024 $ .Dt RAD.CONF 5 .Os .Sh NAME @@ -69,17 +69,17 @@ These can be overwritten in interface blocks. .It Ic default router Pq Ic yes Ns | Ns Ic no Act as a default router or not. The default is yes. -.It Ic dns Brq dns options +.It Ic dns Brq Ar option ... .Ic dns options are as follows: .Bl -tag -width Ds .It Ic lifetime Ar seconds The number of seconds the dns options are valid after receiving a router advertisement message. -The default is 900 seconds. -.It Ic nameserver Pq Ar IP Ns | Ns { nameserver list } +The default is 1800 seconds. +.It Ic nameserver Pq Ar address Ns | Ns Brq Ar address ... IPv6 address or list of IPv6 addresses of DNS name servers. -.It Ic search Pq Ar domain Ns | Ns { domain list } +.It Ic search Pq Ar domain Ns | Ns Brq Ar domain ... Domain or list of domains for the .Xr resolv.conf 5 search list. @@ -96,7 +96,7 @@ The MTU option is used in Router Advertisement messages to ensure that all nodes on a link use the same MTU value in those cases where the link MTU is not well known. The default is 0, meaning unspecified by this router. -.It Ic nat64 prefix Ar prefix Op Brq nat64 options +.It Ic nat64 prefix Ar prefix Op Brq Ar option ... Add a PREF64 router advertisement option to communicate prefixes used for Network Address and Protocol Translation from IPv6 to IPv4 (NAT64). If @@ -134,18 +134,15 @@ The default is yes. .El .Sh INTERFACES A list of interfaces or interface groups to send advertisements on: -.Bd -unfilled -offset indent -.Ic interface Ar name Op { prefix list } -.Ed -.Pp +.Bl -tag -width Ds +.It Ic interface Ar name Op Brq Ar prefix ... Options set in the global section can be overwritten inside an interface block. In addition an interface block can contain a list of prefixes: -.Bd -unfilled -offset indent -.Oo Ic no Oc Ic auto prefix Op { prefix options } -.Ic prefix Ar prefix Op { prefix options } -.Ed .Pp +.Bl -tag -width Ds -compact +.It Oo Ic no Oc Ic auto prefix Op Brq Ar option ... +.It Ic prefix Ar prefix Op Brq Ar option ... The default is to discover prefixes to announce by inspecting the IPv6 addresses configured on an interface. This can be disabled with @@ -176,6 +173,8 @@ The default is 5400. This option is ignored if the prefix is discovered from a network interface and it has a valid lifetime configured. .El +.El +.El .Sh FILES .Bl -tag -width /etc/examples/rad.conf -compact .It Pa /etc/rad.conf diff --git a/usr.sbin/rad/rad.h b/usr.sbin/rad/rad.h index 46cdc51ea..7775ac4a0 100644 --- a/usr.sbin/rad/rad.h +++ b/usr.sbin/rad/rad.h @@ -1,4 +1,4 @@ -/* $OpenBSD: rad.h,v 1.28 2024/05/31 16:10:42 florian Exp $ */ +/* $OpenBSD: rad.h,v 1.29 2024/12/28 08:58:14 florian Exp $ */ /* * Copyright (c) 2018 Florian Obser @@ -34,7 +34,7 @@ #define MAX_RA_DELAY_TIME 500 /* 500 milliseconds */ #define MIN_DELAY_BETWEEN_RAS 3 /* 3 seconds */ #define MAX_SEARCH 1025 /* MAXDNAME in arpa/nameser.h */ -#define DEFAULT_RDNS_LIFETIME 600 * 1.5 +#define DEFAULT_RDNS_LIFETIME 3 * MAX_RTR_ADV_INTERVAL #define PLTIME_DECAYING 1 #define VLTIME_DECAYING 2 diff --git a/usr.sbin/radiusctl/radiusctl.c b/usr.sbin/radiusctl/radiusctl.c index 40fec84a2..b1865362b 100644 --- a/usr.sbin/radiusctl/radiusctl.c +++ b/usr.sbin/radiusctl/radiusctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: radiusctl.c,v 1.13 2024/09/15 05:26:05 yasuoka Exp $ */ +/* $OpenBSD: radiusctl.c,v 1.17 2024/11/21 13:43:10 claudio Exp $ */ /* * Copyright (c) 2015 YASUOKA Masahiko * @@ -147,7 +147,8 @@ main(int argc, char *argv[]) err(EX_OSERR, "socket"); if (connect(sock, (struct sockaddr *)&sun, sizeof(sun)) == -1) err(EX_OSERR, "connect"); - imsg_init(&ibuf, sock); + if (imsgbuf_init(&ibuf, sock) == -1) + err(EX_OSERR, "imsgbuf_init"); res = parse(argc, argv); if (res == NULL) @@ -185,12 +186,10 @@ main(int argc, char *argv[]) : IMSG_RADIUSD_MODULE_IPCP_DISCONNECT, 0, 0, -1, iov, niov); break; } - while (ibuf.w.queued) { - if (msgbuf_write(&ibuf.w) <= 0 && errno != EAGAIN) - err(1, "ibuf_ctl: msgbuf_write error"); - } + if (imsgbuf_flush(&ibuf) == -1) + err(1, "ibuf_ctl: imsgbuf_flush error"); while (!done) { - if (((n = imsg_read(&ibuf)) == -1 && errno != EAGAIN) || n == 0) + if (imsgbuf_read(&ibuf) != 1) break; for (;;) { if ((n = imsg_get(&ibuf, &imsg)) <= 0) { diff --git a/usr.sbin/radiusd/control.c b/usr.sbin/radiusd/control.c index 45c243afe..5b069d109 100644 --- a/usr.sbin/radiusd/control.c +++ b/usr.sbin/radiusd/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.1 2024/07/09 17:26:14 yasuoka Exp $ */ +/* $OpenBSD: control.c,v 1.7 2024/11/21 13:43:10 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -165,10 +165,15 @@ control_accept(int listenfd, short event, void *bula) return; } + if (imsgbuf_init(&c->iev.ibuf, connfd) == -1) { + log_warn("control_accept"); + close(connfd); + free(c); + return; + } if (idseq == 0) /* don't use zero. See radiusd_module_imsg */ ++idseq; c->id = idseq++; - imsg_init(&c->iev.ibuf, connfd); c->iev.handler = control_dispatch_imsg; c->iev.events = EV_READ; event_set(&c->iev.ev, c->iev.ibuf.fd, c->iev.events, c->iev.handler, c); @@ -222,7 +227,7 @@ control_close(int fd) void control_connfree(struct ctl_conn *c) { - msgbuf_clear(&c->iev.ibuf.w); + imsgbuf_clear(&c->iev.ibuf); TAILQ_REMOVE(&ctl_conns, c, entry); event_del(&c->iev.ev); @@ -252,14 +257,13 @@ control_dispatch_imsg(int fd, short event, void *bula) } if (event & EV_READ) { - if (((n = imsg_read(&c->iev.ibuf)) == -1 && errno != EAGAIN) || - n == 0) { + if (imsgbuf_read(&c->iev.ibuf) != 1) { control_close(fd); return; } } if (event & EV_WRITE) { - if (msgbuf_write(&c->iev.ibuf.w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(&c->iev.ibuf) == -1) { control_close(fd); return; } diff --git a/usr.sbin/radiusd/imsg_subr.c b/usr.sbin/radiusd/imsg_subr.c index 2ed467dad..d8f564741 100644 --- a/usr.sbin/radiusd/imsg_subr.c +++ b/usr.sbin/radiusd/imsg_subr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: imsg_subr.c,v 1.1 2015/07/21 04:06:04 yasuoka Exp $ */ +/* $OpenBSD: imsg_subr.c,v 1.3 2024/11/21 13:18:38 claudio Exp $ */ /* * Copyright (c) 2015 YASUOKA Masahiko @@ -29,8 +29,8 @@ #include "imsg_subr.h" /* - * Check readability not to spin before calling imsg_read(3). Wait 'millisec' - * until it becomes readable. + * Check readability not to spin before calling imsgbuf_read(3). + * Wait 'millisec' until it becomes readable. */ int imsg_sync_read(struct imsgbuf *ibuf, int millisec) @@ -46,14 +46,14 @@ imsg_sync_read(struct imsgbuf *ibuf, int millisec) return (-1); } if (retval > 0 && (fds[0].revents & POLLIN) != 0) - return imsg_read(ibuf); + return imsgbuf_read(ibuf); return (-1); } /* - * Check writability not to spin before calling imsg_flush(3). Wait 'millisec' - * until it becomes writable. + * Check writability not to spin before calling imsgbuf_flush(3). + * Wait 'millisec' until it becomes writable. */ int imsg_sync_flush(struct imsgbuf *ibuf, int millisec) @@ -61,7 +61,7 @@ imsg_sync_flush(struct imsgbuf *ibuf, int millisec) struct pollfd fds[1]; int retval; - if (!ibuf->w.queued) + if (imsgbuf_queuelen(ibuf) == 0) return (0); /* already flushed */ fds[0].fd = ibuf->fd; @@ -72,7 +72,7 @@ imsg_sync_flush(struct imsgbuf *ibuf, int millisec) return (-1); } if (retval > 0 && (fds[0].revents & POLLOUT) != 0) - return imsg_flush(ibuf); + return imsgbuf_flush(ibuf); return (-1); } diff --git a/usr.sbin/radiusd/radiusd.c b/usr.sbin/radiusd/radiusd.c index 3b5ffb2f9..992bb5a48 100644 --- a/usr.sbin/radiusd/radiusd.c +++ b/usr.sbin/radiusd/radiusd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: radiusd.c,v 1.55 2024/08/14 07:06:50 yasuoka Exp $ */ +/* $OpenBSD: radiusd.c,v 1.61 2024/11/21 13:43:10 claudio Exp $ */ /* * Copyright (c) 2013, 2023 Internet Initiative Japan Inc. @@ -1200,7 +1200,10 @@ radiusd_module_load(struct radiusd *radiusd, const char *path, const char *name) } strlcpy(module->name, name, sizeof(module->name)); module->pid = pid; - imsg_init(&module->ibuf, module->fd); + if (imsgbuf_init(&module->ibuf, module->fd) == -1) { + log_warn("Could not load module `%s': imsgbuf_init", name); + goto on_error; + } if (imsg_sync_read(&module->ibuf, MODULE_IO_TIMEOUT) <= 0 || (n = imsg_get(&module->ibuf, &imsg)) <= 0) { @@ -1301,7 +1304,7 @@ radiusd_module_close(struct radiusd_module *module) { if (module->fd >= 0) { event_del(&module->ev); - imsg_clear(&module->ibuf); + imsgbuf_clear(&module->ibuf); close(module->fd); module->fd = -1; } @@ -1319,27 +1322,22 @@ static void radiusd_module_on_imsg_io(int fd, short evmask, void *ctx) { struct radiusd_module *module = ctx; - int ret; - if (evmask & EV_WRITE) + if (evmask & EV_WRITE) { module->writeready = true; + if (imsgbuf_write(&module->ibuf) == -1) { + log_warn("Failed to write to module `%s': " + "imsgbuf_write()", module->name); + goto on_error; + } + module->writeready = false; + } if (evmask & EV_READ) { if (radiusd_module_imsg_read(module) == -1) goto on_error; } - while (module->writeready && module->ibuf.w.queued) { - ret = msgbuf_write(&module->ibuf.w); - if (ret > 0) - continue; - module->writeready = false; - if (ret == 0 && errno == EAGAIN) - break; - log_warn("Failed to write to module `%s': msgbuf_write()", - module->name); - goto on_error; - } radiusd_module_reset_ev_handler(module); return; @@ -1357,7 +1355,7 @@ radiusd_module_reset_ev_handler(struct radiusd_module *module) event_del(&module->ev); evmask = EV_READ; - if (module->ibuf.w.queued) { + if (imsgbuf_queuelen(&module->ibuf) > 0) { if (!module->writeready) evmask |= EV_WRITE; else @@ -1386,12 +1384,10 @@ radiusd_module_imsg_read(struct radiusd_module *module) int n; struct imsg imsg; - if ((n = imsg_read(&module->ibuf)) == -1 || n == 0) { - if (n == -1 && errno == EAGAIN) - return (0); + if ((n = imsgbuf_read(&module->ibuf)) != 1) { if (n == -1) log_warn("Receiving a message from module `%s' " - "failed: imsg_read", module->name); + "failed: imsgbuf_read", module->name); /* else closed */ radiusd_module_close(module); return (-1); @@ -1932,7 +1928,7 @@ void imsg_event_add(struct imsgev *iev) { iev->events = EV_READ; - if (iev->ibuf.w.queued) + if (imsgbuf_queuelen(&iev->ibuf) > 0) iev->events |= EV_WRITE; event_del(&iev->ev); diff --git a/usr.sbin/radiusd/radiusd_bsdauth.c b/usr.sbin/radiusd/radiusd_bsdauth.c index 9f37ffa74..73ec70e2c 100644 --- a/usr.sbin/radiusd/radiusd_bsdauth.c +++ b/usr.sbin/radiusd/radiusd_bsdauth.c @@ -1,4 +1,4 @@ -/* $OpenBSD: radiusd_bsdauth.c,v 1.16 2024/02/09 07:41:32 yasuoka Exp $ */ +/* $OpenBSD: radiusd_bsdauth.c,v 1.19 2024/11/21 13:43:10 claudio Exp $ */ /* * Copyright (c) 2015 YASUOKA Masahiko @@ -113,13 +113,14 @@ main(int argc, char *argv[]) * Privileged process */ setproctitle("[priv]"); - imsg_init(&ibuf, pairsock[0]); + if (imsgbuf_init(&ibuf, pairsock[0]) == 1) + err(EXIT_FAILURE, "imsgbuf_init"); if (pledge("stdio getpw rpath proc exec", NULL) == -1) err(EXIT_FAILURE, "pledge"); for (;;) { - if ((n = imsg_read(&ibuf)) <= 0 && errno != EAGAIN) + if (imsgbuf_read(&ibuf) != 1) break; for (;;) { if ((n = imsg_get(&ibuf, &imsg)) == -1) @@ -218,11 +219,11 @@ invalid: } } imsg_free(&imsg); - imsg_flush(&ibuf); + imsgbuf_flush(&ibuf); } - imsg_flush(&ibuf); + imsgbuf_flush(&ibuf); } - imsg_clear(&ibuf); + imsgbuf_clear(&ibuf); while (waitpid(pid, &status, 0) == -1) { if (errno != EINTR) @@ -250,7 +251,8 @@ module_bsdauth_main(void) module_drop_privilege(module_bsdauth.base, 0); module_load(module_bsdauth.base); - imsg_init(&module_bsdauth.ibuf, 3); + if (imsgbuf_init(&module_bsdauth.ibuf, 3) == -1) + err(EXIT_FAILURE, "imsgbuf_init"); if (pledge("stdio proc", NULL) == -1) err(EXIT_FAILURE, "pledge"); @@ -259,7 +261,7 @@ module_bsdauth_main(void) ; module_destroy(module_bsdauth.base); - imsg_clear(&module_bsdauth.ibuf); + imsgbuf_clear(&module_bsdauth.ibuf); if (module_bsdauth.okgroups) { for (i = 0; module_bsdauth.okgroups[i] != NULL; i++) @@ -346,9 +348,9 @@ module_bsdauth_userpass(void *ctx, u_int q_id, const char *user, iov[2].iov_len = usercheck.passlen; imsg_composev(&module->ibuf, IMSG_BSDAUTH_USERCHECK, 0, 0, -1, iov, 3); - imsg_flush(&module->ibuf); - if ((n = imsg_read(&module->ibuf)) == -1 || n == 0) - fatal("imsg_read() failed in module_bsdauth_userpass()"); + imsgbuf_flush(&module->ibuf); + if (imsgbuf_read(&module->ibuf) != 1) + fatal("imsgbuf_read() failed in module_bsdauth_userpass()"); if ((n = imsg_get(&module->ibuf, &imsg)) <= 0) fatal("imsg_get() failed in module_bsdauth_userpass()"); @@ -371,9 +373,9 @@ module_bsdauth_userpass(void *ctx, u_int q_id, const char *user, iov[2].iov_len = groupcheck.grouplen; imsg_composev(&module->ibuf, IMSG_BSDAUTH_GROUPCHECK, 0, 0, -1, iov, 3); - imsg_flush(&module->ibuf); - if ((n = imsg_read(&module->ibuf)) == -1 || n == 0) - fatal("imsg_read() failed in " + imsgbuf_flush(&module->ibuf); + if (imsgbuf_read(&module->ibuf) != 1) + fatal("imsgbuf_read() failed in " "module_bsdauth_userpass()"); if ((n = imsg_get(&module->ibuf, &imsg)) <= 0) fatal("imsg_get() failed in " diff --git a/usr.sbin/radiusd/radiusd_file.c b/usr.sbin/radiusd/radiusd_file.c index 550638b53..c2ec82a6c 100644 --- a/usr.sbin/radiusd/radiusd_file.c +++ b/usr.sbin/radiusd/radiusd_file.c @@ -1,4 +1,4 @@ -/* $OpenBSD: radiusd_file.c,v 1.5 2024/07/18 22:40:09 yasuoka Exp $ */ +/* $OpenBSD: radiusd_file.c,v 1.8 2024/11/21 13:43:10 claudio Exp $ */ /* * Copyright (c) 2024 YASUOKA Masahiko @@ -128,7 +128,8 @@ main(int argc, char *argv[]) if (pledge("stdio rpath unveil", NULL) == -1) err(EXIT_FAILURE, "pledge"); setproctitle("[priv]"); - imsg_init(&ibuf, pairsock[0]); + if (imsgbuf_init(&ibuf, pairsock[0]) == -1) + err(EXIT_FAILURE, "imsgbuf_init"); /* Receive parameters from the main process. */ if (imsg_sync_read(&ibuf, 2000) <= 0 || @@ -158,7 +159,7 @@ main(int argc, char *argv[]) memcpy(¶ms, paramsp, sizeof(params)); for (;;) { - if ((n = imsg_read(&ibuf)) <= 0 && errno != EAGAIN) + if (imsgbuf_read(&ibuf) != 1) break; for (;;) { if ((n = imsg_get(&ibuf, &imsg)) == -1) @@ -167,11 +168,11 @@ main(int argc, char *argv[]) break; parent_dispatch_main(¶ms, &ibuf, &imsg); imsg_free(&imsg); - imsg_flush(&ibuf); + imsgbuf_flush(&ibuf); } - imsg_flush(&ibuf); + imsgbuf_flush(&ibuf); } - imsg_clear(&ibuf); + imsgbuf_clear(&ibuf); while (waitpid(pid, &status, 0) == -1) { if (errno != EINTR) @@ -244,7 +245,8 @@ module_file_main(void) module_drop_privilege(module_file.base, 0); module_load(module_file.base); - imsg_init(&module_file.ibuf, 3); + if (imsgbuf_init(&module_file.ibuf, 3) == -1) + err(EXIT_FAILURE, "imsgbuf_init"); if (pledge("stdio", NULL) == -1) err(EXIT_FAILURE, "pledge"); @@ -331,7 +333,7 @@ module_file_start(void *ctx) } imsg_compose(&module->ibuf, IMSG_RADIUSD_FILE_PARAMS, 0, -1, -1, &module->params, sizeof(module->params)); - imsg_flush(&module->ibuf); + imsgbuf_flush(&module->ibuf); module_send_message(module->base, IMSG_OK, NULL); } @@ -359,9 +361,9 @@ module_file_access_request(void *ctx, u_int query_id, const u_char *pkt, imsg_compose(&self->ibuf, IMSG_RADIUSD_FILE_USERINFO, 0, -1, -1, username, strlen(username) + 1); - imsg_flush(&self->ibuf); - if ((n = imsg_read(&self->ibuf)) == -1 || n == 0) { - log_warn("%s: imsg_read()", __func__); + imsgbuf_flush(&self->ibuf); + if (imsgbuf_read(&self->ibuf) != 1) { + log_warn("%s: imsgbuf_read()", __func__); goto out; } if ((n = imsg_get(&self->ibuf, &imsg)) <= 0) { diff --git a/usr.sbin/radiusd/radiusd_ipcp.c b/usr.sbin/radiusd/radiusd_ipcp.c index 58a42c7b8..4c021ffd5 100644 --- a/usr.sbin/radiusd/radiusd_ipcp.c +++ b/usr.sbin/radiusd/radiusd_ipcp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: radiusd_ipcp.c,v 1.17 2024/09/15 05:31:23 yasuoka Exp $ */ +/* $OpenBSD: radiusd_ipcp.c,v 1.21 2024/11/28 11:51:45 yasuoka Exp $ */ /* * Copyright (c) 2024 Internet Initiative Japan Inc. @@ -736,7 +736,7 @@ ipcp_resdeco(void *ctx, u_int q_id, const u_char *req, size_t reqlen, const struct in_addr mask4 = { .s_addr = 0xffffffffUL }; int res_code, msraserr = 935; struct ipcp_address *addr; - int i, j, n; + int i, n; bool found = false; char username[256], buf[128]; struct user *user = NULL; @@ -780,9 +780,9 @@ ipcp_resdeco(void *ctx, u_int q_id, const u_char *req, size_t reqlen, msraserr = 935; if (self->max_sessions != 0) { if (self->nsessions >= self->max_sessions) { - log_info("q=%u rejected: number of " + log_info("q=%u user=%s rejected: number of " "sessions reached the limit(%d)", q_id, - self->max_sessions); + user->name, self->max_sessions); goto reject; } } @@ -791,9 +791,9 @@ ipcp_resdeco(void *ctx, u_int q_id, const u_char *req, size_t reqlen, TAILQ_FOREACH(assign, &user->ipv4s, next) n++; if (n >= self->user_max_sessions) { - log_info("q=%u rejected: number of " + log_info("q=%u user=%s rejected: number of " "sessions per a user reached the limit(%d)", - q_id, self->user_max_sessions); + q_id, user->name, self->user_max_sessions); goto reject; } } @@ -802,8 +802,9 @@ ipcp_resdeco(void *ctx, u_int q_id, const u_char *req, size_t reqlen, if (radius_get_ipv4_attr(radres, RADIUS_TYPE_FRAMED_IP_ADDRESS, &addr4) == 0) { if (ipcp_ipv4_find(self, addr4) != NULL) - log_info("q=%u rejected: server requested IP " - "address is busy", q_id); + log_info("q=%u user=%s rejected: server " + "requested IP address is busy", q_id, + user->name); else { /* compare in host byte order */ addr4.s_addr = ntohl(addr4.s_addr); @@ -816,9 +817,10 @@ ipcp_resdeco(void *ctx, u_int q_id, const u_char *req, size_t reqlen, break; } if (addr == NULL) - log_info("q=%u rejected: server " - "requested IP address is out of " - "the range", q_id); + log_info("q=%u user=%s rejected: " + "server requested IP address is " + "out of the range", q_id, + user->name); else found = true; /* revert the addr to the network byte order */ @@ -827,36 +829,43 @@ ipcp_resdeco(void *ctx, u_int q_id, const u_char *req, size_t reqlen, if (!found) goto reject; } else { + int inpool_idx = 0; + + /* select a random address */ n = arc4random_uniform(self->npools); i = 0; TAILQ_FOREACH(addr, &self->addrs, next) { if (addr->type == ADDRESS_TYPE_POOL) { if (i <= n && n < i + addr->naddrs) { - j = n - i; + inpool_idx = n - i; break; } i += addr->naddrs; } } - for (i = 0; i < self->npools; i++, j++) { - if (addr == NULL) - break; - if (j >= addr->naddrs) { /* next pool */ - if ((addr = TAILQ_NEXT(addr, next)) - == NULL) - addr = TAILQ_FIRST( - &self->addrs); - j = 0; - } - addr4.s_addr = htonl(addr->start.s_addr + j); + /* loop npools times until a free address is found */ + for (i = 0; i < self->npools && addr != NULL; i++) { + addr4.s_addr = htonl( + addr->start.s_addr + inpool_idx); if (ipcp_ipv4_find(self, addr4) == NULL) { found = true; break; } + /* try inpool_idx if it's in the range */ + if (++inpool_idx < addr->naddrs) + continue; + /* iterate addr to the next pool */ + do { + addr = TAILQ_NEXT(addr, next); + if (addr == NULL) + addr = TAILQ_FIRST( + &self->addrs); + } while (addr->type != ADDRESS_TYPE_POOL); + inpool_idx = 0; /* try the first */ } if (!found) { - log_info("q=%u rejected: ran out of the " - "address pool", q_id); + log_info("q=%u user=%s rejected: ran out of " + "the address pool", q_id, user->name); goto reject; } } @@ -1090,14 +1099,21 @@ ipcp_accounting_request(void *ctx, u_int q_id, const u_char *pkt, } if (radius_get_ipv4_attr(radpkt, RADIUS_TYPE_FRAMED_IP_ADDRESS, &addr4) - != 0) + != 0) { + log_warnx("q=%u no Framed-IP-Address-Address attribute", q_id); goto out; + } if (radius_get_string_attr(radpkt, RADIUS_TYPE_USER_NAME, username, - sizeof(username)) != 0) + sizeof(username)) != 0) { + log_warnx("q=%u no User-Name attribute", q_id); goto out; - if ((assign = ipcp_ipv4_find(self, addr4)) == NULL) + } + if ((assign = ipcp_ipv4_find(self, addr4)) == NULL) { /* not assigned by this */ + log_warnx("q=%u %s is not assigned by us", q_id, + inet_ntop(AF_INET, &addr4, buf, sizeof(buf))); goto out; + } if (radius_get_uint32_attr(radpkt, RADIUS_TYPE_ACCT_DELAY_TIME, &delay) != 0) @@ -1280,9 +1296,9 @@ void ipcp_ipv4_delete(struct module_ipcp *self, struct assigned_ipv4 *assign, const char *cause) { - static struct radiusd_ipcp_statistics stat = { 0 }; + struct radiusd_ipcp_statistics stat; - memset(stat.cause, 0, sizeof(stat.cause)); + memset(&stat, 0, sizeof(stat)); strlcpy(stat.cause, cause, sizeof(stat.cause)); ipcp_del_db(self, assign); @@ -1305,7 +1321,11 @@ ipcp_ipv4_release(struct module_ipcp *self, struct assigned_ipv4 *assign) int assigned_ipv4_compar(struct assigned_ipv4 *a, struct assigned_ipv4 *b) { - return (b->ipv4.s_addr - a->ipv4.s_addr); + if (a->ipv4.s_addr > b->ipv4.s_addr) + return (1); + else if (a->ipv4.s_addr < b->ipv4.s_addr) + return (-1); + return (0); } struct user * @@ -1805,6 +1825,8 @@ parse_address_range(const char *range) goto error; start.s_addr = ntohl(start.s_addr); end.s_addr = ntohl(end.s_addr); + if (end.s_addr < start.s_addr) + goto error; } else { if ((sep = strchr(buf, '/')) != NULL) { *sep = '\0'; diff --git a/usr.sbin/radiusd/radiusd_module.c b/usr.sbin/radiusd/radiusd_module.c index a666051e8..0c1a09d20 100644 --- a/usr.sbin/radiusd/radiusd_module.c +++ b/usr.sbin/radiusd/radiusd_module.c @@ -1,4 +1,4 @@ -/* $OpenBSD: radiusd_module.c,v 1.20 2024/09/15 05:14:32 yasuoka Exp $ */ +/* $OpenBSD: radiusd_module.c,v 1.26 2024/11/21 13:43:10 claudio Exp $ */ /* * Copyright (c) 2015 YASUOKA Masahiko @@ -95,7 +95,10 @@ module_create(int sock, void *ctx, struct module_handlers *handler) if ((base = calloc(1, sizeof(struct module_base))) == NULL) return (NULL); - imsg_init(&base->ibuf, sock); + if (imsgbuf_init(&base->ibuf, sock) == -1) { + free(base); + return (NULL); + } base->ctx = ctx; module_userpass = handler->userpass; @@ -134,7 +137,7 @@ module_run(struct module_base *base) ret = module_recv_imsg(base); if (ret == 0) - imsg_flush(&base->ibuf); + imsgbuf_flush(&base->ibuf); return (ret); } @@ -145,7 +148,7 @@ module_destroy(struct module_base *base) if (base != NULL) { free(base->radpkt); free(base->radpkt2); - imsg_clear(&base->ibuf); + imsgbuf_clear(&base->ibuf); } free(base); } @@ -172,7 +175,7 @@ module_load(struct module_base *base) load.cap |= RADIUSD_MODULE_CAP_CONTROL; imsg_compose(&base->ibuf, IMSG_RADIUSD_MODULE_LOAD, 0, 0, -1, &load, sizeof(load)); - imsg_flush(&base->ibuf); + imsgbuf_flush(&base->ibuf); } void @@ -356,9 +359,9 @@ module_recv_imsg(struct module_base *base) ssize_t n; struct imsg imsg; - if (((n = imsg_read(&base->ibuf)) == -1 && errno != EAGAIN) || n == 0) { - if (n != 0) - syslog(LOG_ERR, "%s: imsg_read(): %m", __func__); + if ((n = imsgbuf_read(&base->ibuf)) != 1) { + if (n == -1) + syslog(LOG_ERR, "%s: imsgbuf_read(): %m", __func__); module_stop(base); return (-1); } @@ -631,28 +634,20 @@ module_on_event(int fd, short evmask, void *ctx) int ret; base->ev_onhandler = true; - if (evmask & EV_WRITE) + if (evmask & EV_WRITE) { base->writeready = true; + if (imsgbuf_write(&base->ibuf) == -1) { + syslog(LOG_ERR, "%s: imsgbuf_write: %m", __func__); + module_stop(base); + return; + } + base->writeready = false; + } if (evmask & EV_READ) { ret = module_recv_imsg(base); if (ret < 0) return; } - while (base->writeready && base->ibuf.w.queued) { - ret = msgbuf_write(&base->ibuf.w); - if (ret > 0) - continue; - base->writeready = false; - if (ret == -1 && errno == EAGAIN) - break; - if (ret == 0) - syslog(LOG_ERR, "%s: connection is closed", __func__); - else - syslog(LOG_ERR, "%s: msgbuf_write: %d %m", __func__, - ret); - module_stop(base); - return; - } base->ev_onhandler = false; module_reset_event(base); return; @@ -673,7 +668,7 @@ module_reset_event(struct module_base *base) event_del(&base->ev); evmask |= EV_READ; - if (base->ibuf.w.queued) { + if (imsgbuf_queuelen(&base->ibuf) > 0) { if (!base->writeready) evmask |= EV_WRITE; else diff --git a/usr.sbin/relayctl/relayctl.c b/usr.sbin/relayctl/relayctl.c index 83bacf05b..fe06c9116 100644 --- a/usr.sbin/relayctl/relayctl.c +++ b/usr.sbin/relayctl/relayctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: relayctl.c,v 1.58 2017/11/29 15:24:50 benno Exp $ */ +/* $OpenBSD: relayctl.c,v 1.63 2024/11/21 13:38:15 claudio Exp $ */ /* * Copyright (c) 2007 - 2013 Reyk Floeter @@ -148,7 +148,8 @@ main(int argc, char *argv[]) if ((ibuf = malloc(sizeof(struct imsgbuf))) == NULL) err(1, NULL); - imsg_init(ibuf, ctl_sock); + if (imsgbuf_init(ibuf, ctl_sock) == -1) + err(1, NULL); done = 0; /* process user request */ @@ -221,13 +222,12 @@ main(int argc, char *argv[]) break; } - while (ibuf->w.queued) - if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN) - err(1, "write error"); + if (imsgbuf_flush(ibuf) == -1) + err(1, "write error"); while (!done) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - errx(1, "imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + err(1, "read error"); if (n == 0) errx(1, "pipe closed"); diff --git a/usr.sbin/relayd/ca.c b/usr.sbin/relayd/ca.c index ea57b93e3..e54259c59 100644 --- a/usr.sbin/relayd/ca.c +++ b/usr.sbin/relayd/ca.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ca.c,v 1.43 2023/07/16 09:23:33 tb Exp $ */ +/* $OpenBSD: ca.c,v 1.45 2024/11/21 13:21:34 claudio Exp $ */ /* * Copyright (c) 2014 Reyk Floeter @@ -337,8 +337,8 @@ rsae_send_imsg(int flen, const u_char *from, u_char *to, RSA *rsa, */ if (imsg_composev(ibuf, cmd, 0, 0, -1, iov, cnt) == -1) log_warn("%s: imsg_composev", __func__); - if (imsg_flush(ibuf) == -1) - log_warn("%s: imsg_flush", __func__); + if (imsgbuf_flush(ibuf) == -1) + log_warn("%s: imsgbuf_flush", __func__); pfd[0].fd = ibuf->fd; pfd[0].events = POLLIN; @@ -357,8 +357,8 @@ rsae_send_imsg(int flen, const u_char *from, u_char *to, RSA *rsa, default: break; } - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatalx("imsg_read"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatalx("imsgbuf_read"); if (n == 0) fatalx("pipe closed"); diff --git a/usr.sbin/relayd/config.c b/usr.sbin/relayd/config.c index 3024c0768..ec7ec8735 100644 --- a/usr.sbin/relayd/config.c +++ b/usr.sbin/relayd/config.c @@ -1,4 +1,4 @@ -/* $OpenBSD: config.c,v 1.45 2024/01/17 10:01:24 claudio Exp $ */ +/* $OpenBSD: config.c,v 1.47 2024/10/31 13:37:44 claudio Exp $ */ /* * Copyright (c) 2011 - 2014 Reyk Floeter @@ -953,6 +953,15 @@ config_setrelay(struct relayd *env, struct relay *rlay) rlay->rl_conf.name); return (-1); } + if (rlay->rl_tls_client_ca_fd != -1 && + config_setrelayfd(ps, id, n, 0, + rlay->rl_conf.id, RELAY_FD_CLIENTCACERT, + rlay->rl_tls_client_ca_fd) == -1) { + log_warn("%s: fd passing failed for " + "`%s'", __func__, + rlay->rl_conf.name); + return (-1); + } /* Prevent fd exhaustion in the parent. */ if (proc_flush_imsg(ps, id, n) == -1) { log_warn("%s: failed to flush " @@ -986,6 +995,10 @@ config_setrelay(struct relayd *env, struct relay *rlay) close(rlay->rl_s); rlay->rl_s = -1; } + if (rlay->rl_tls_client_ca_fd != -1) { + close(rlay->rl_tls_client_ca_fd); + rlay->rl_tls_client_ca_fd = -1; + } if (rlay->rl_tls_cacert_fd != -1) { close(rlay->rl_tls_cacert_fd); rlay->rl_tls_cacert_fd = -1; @@ -1011,6 +1024,10 @@ config_setrelay(struct relayd *env, struct relay *rlay) cert->cert_ocsp_fd = -1; } } + if (rlay->rl_tls_client_ca_fd != -1) { + close(rlay->rl_tls_client_ca_fd); + rlay->rl_tls_client_ca_fd = -1; + } return (0); } @@ -1033,6 +1050,7 @@ config_getrelay(struct relayd *env, struct imsg *imsg) rlay->rl_s = imsg_get_fd(imsg); rlay->rl_tls_ca_fd = -1; rlay->rl_tls_cacert_fd = -1; + rlay->rl_tls_client_ca_fd = -1; if (ps->ps_what[privsep_process] & CONFIG_PROTOS) { if (rlay->rl_conf.proto == EMPTY_ID) @@ -1162,6 +1180,9 @@ config_getrelayfd(struct relayd *env, struct imsg *imsg) case RELAY_FD_CAFILE: rlay->rl_tls_cacert_fd = imsg_get_fd(imsg); break; + case RELAY_FD_CLIENTCACERT: + rlay->rl_tls_client_ca_fd = imsg_get_fd(imsg); + break; } DPRINTF("%s: %s %d received relay fd %d type %d for relay %s", __func__, diff --git a/usr.sbin/relayd/control.c b/usr.sbin/relayd/control.c index fc03d7500..bd13efd1d 100644 --- a/usr.sbin/relayd/control.c +++ b/usr.sbin/relayd/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.58 2023/03/08 04:43:14 guenther Exp $ */ +/* $OpenBSD: control.c,v 1.64 2024/11/21 13:38:45 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -159,12 +159,18 @@ control_accept(int listenfd, short event, void *arg) } if ((c = calloc(1, sizeof(struct ctl_conn))) == NULL) { - close(connfd); log_warn("%s: calloc", __func__); + close(connfd); + return; + } + + if (imsgbuf_init(&c->iev.ibuf, connfd) == -1) { + log_warn("%s: imsgbuf_init", __func__); + close(connfd); + free(c); return; } - imsg_init(&c->iev.ibuf, connfd); c->iev.handler = control_dispatch_imsg; c->iev.events = EV_READ; c->iev.data = cs; /* proc.c cheats (reuses the handler) */ @@ -198,7 +204,7 @@ control_close(int fd, struct control_sock *cs) return; } - msgbuf_clear(&c->iev.ibuf.w); + imsgbuf_clear(&c->iev.ibuf); TAILQ_REMOVE(&ctl_conns, c, entry); event_del(&c->iev.ev); @@ -231,15 +237,14 @@ control_dispatch_imsg(int fd, short event, void *arg) } if (event & EV_READ) { - if (((n = imsg_read(&c->iev.ibuf)) == -1 && errno != EAGAIN) || - n == 0) { + if (imsgbuf_read(&c->iev.ibuf) != 1) { control_close(fd, cs); return; } } if (event & EV_WRITE) { - if (msgbuf_write(&c->iev.ibuf.w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(&c->iev.ibuf) == -1) { control_close(fd, cs); return; } diff --git a/usr.sbin/relayd/parse.y b/usr.sbin/relayd/parse.y index eea485c44..fcdfb8e92 100644 --- a/usr.sbin/relayd/parse.y +++ b/usr.sbin/relayd/parse.y @@ -1,4 +1,4 @@ -/* $OpenBSD: parse.y,v 1.257 2024/08/10 05:47:29 tb Exp $ */ +/* $OpenBSD: parse.y,v 1.258 2024/10/28 19:56:18 tb Exp $ */ /* * Copyright (c) 2007 - 2014 Reyk Floeter @@ -179,7 +179,7 @@ typedef struct { %token TIMEOUT TLS TO ROUTER RTLABEL TRANSPARENT URL WITH TTL RTABLE %token MATCH PARAMS RANDOM LEASTSTATES SRCHASH KEY CERTIFICATE PASSWORD ECDHE %token EDH TICKETS CONNECTION CONNECTIONS CONTEXT ERRORS STATE CHANGES CHECKS -%token WEBSOCKETS PFLOG +%token WEBSOCKETS PFLOG CLIENT %token STRING %token NUMBER %type context hostname interface table value path @@ -1351,6 +1351,16 @@ tlsflags : SESSION TICKETS { proto->tickets = 1; } name->name = $2; TAILQ_INSERT_TAIL(&proto->tlscerts, name, entry); } + | CLIENT CA STRING { + if (strlcpy(proto->tlsclientca, $3, + sizeof(proto->tlsclientca)) >= + sizeof(proto->tlsclientca)) { + yyerror("tlsclientca truncated"); + free($3); + YYERROR; + } + free($3); + } | NO flag { proto->tlsflags &= ~($2); } | flag { proto->tlsflags |= $1; } ; @@ -1822,6 +1832,7 @@ relay : RELAY STRING { r->rl_conf.dstretry = 0; r->rl_tls_ca_fd = -1; r->rl_tls_cacert_fd = -1; + r->rl_tls_client_ca_fd = -1; TAILQ_INIT(&r->rl_tables); if (last_relay_id == INT_MAX) { yyerror("too many relays defined"); @@ -2411,6 +2422,7 @@ lookup(char *s) { "check", CHECK }, { "checks", CHECKS }, { "ciphers", CIPHERS }, + { "client", CLIENT }, { "code", CODE }, { "connection", CONNECTION }, { "context", CONTEXT }, @@ -3397,6 +3409,7 @@ relay_inherit(struct relay *ra, struct relay *rb) if (!(rb->rl_conf.flags & F_TLS)) { rb->rl_tls_cacert_fd = -1; rb->rl_tls_ca_fd = -1; + rb->rl_tls_client_ca_fd = -1; } TAILQ_INIT(&rb->rl_tables); diff --git a/usr.sbin/relayd/proc.c b/usr.sbin/relayd/proc.c index 1da7e585f..3eb00aa03 100644 --- a/usr.sbin/relayd/proc.c +++ b/usr.sbin/relayd/proc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: proc.c,v 1.45 2024/01/17 10:01:24 claudio Exp $ */ +/* $OpenBSD: proc.c,v 1.52 2024/11/21 13:38:45 claudio Exp $ */ /* * Copyright (c) 2010 - 2016 Reyk Floeter @@ -155,7 +155,10 @@ proc_connect(struct privsep *ps) for (inst = 0; inst < ps->ps_instances[dst]; inst++) { iev = &ps->ps_ievs[dst][inst]; - imsg_init(&iev->ibuf, ps->ps_pp->pp_pipes[dst][inst]); + if (imsgbuf_init(&iev->ibuf, + ps->ps_pp->pp_pipes[dst][inst]) == -1) + fatal("imsgbuf_init"); + imsgbuf_allow_fdpass(&iev->ibuf); event_set(&iev->ev, iev->ibuf.fd, iev->events, iev->handler, iev->data); event_add(&iev->ev, NULL); @@ -264,7 +267,9 @@ proc_accept(struct privsep *ps, int fd, enum privsep_procid dst, pp->pp_pipes[dst][n] = fd; iev = &ps->ps_ievs[dst][n]; - imsg_init(&iev->ibuf, fd); + if (imsgbuf_init(&iev->ibuf, fd) == -1) + fatal("imsgbuf_init"); + imsgbuf_allow_fdpass(&iev->ibuf); event_set(&iev->ev, iev->ibuf.fd, iev->events, iev->handler, iev->data); event_add(&iev->ev, NULL); } @@ -294,7 +299,7 @@ proc_setup(struct privsep *ps, struct privsep_proc *procs, unsigned int nproc) sizeof(struct imsgev))) == NULL) fatal("%s: calloc", __func__); - /* With this set up, we are ready to call imsg_init(). */ + /* With this set up, we are ready to call imsgbuf_init(). */ for (i = 0; i < ps->ps_instances[id]; i++) { ps->ps_ievs[id][i].handler = proc_dispatch; ps->ps_ievs[id][i].events = EV_READ; @@ -428,7 +433,7 @@ proc_open(struct privsep *ps, int src, int dst) */ if (proc_flush_imsg(ps, src, i) == -1 || proc_flush_imsg(ps, dst, j) == -1) - fatal("%s: imsg_flush", __func__); + fatal("%s: proc_flush_imsg", __func__); } } } @@ -454,7 +459,7 @@ proc_close(struct privsep *ps) /* Cancel the fd, close and invalidate the fd */ event_del(&(ps->ps_ievs[dst][n].ev)); - imsg_clear(&(ps->ps_ievs[dst][n].ibuf)); + imsgbuf_clear(&(ps->ps_ievs[dst][n].ibuf)); close(pp->pp_pipes[dst][n]); pp->pp_pipes[dst][n] = -1; } @@ -601,8 +606,8 @@ proc_dispatch(int fd, short event, void *arg) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("%s: imsg_read", __func__); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("%s: imsgbuf_read", __func__); if (n == 0) { /* this pipe is dead, so remove the event handler */ event_del(&iev->ev); @@ -612,13 +617,14 @@ proc_dispatch(int fd, short event, void *arg) } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("%s: msgbuf_write", __func__); - if (n == 0) { - /* this pipe is dead, so remove the event handler */ - event_del(&iev->ev); - event_loopexit(NULL); - return; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) { + /* this pipe is dead, remove the handler */ + event_del(&iev->ev); + event_loopexit(NULL); + return; + } + fatal("%s: imsgbuf_write", __func__); } } @@ -684,12 +690,12 @@ void imsg_event_add(struct imsgev *iev) { if (iev->handler == NULL) { - imsg_flush(&iev->ibuf); + imsgbuf_flush(&iev->ibuf); return; } iev->events = EV_READ; - if (iev->ibuf.w.queued) + if (imsgbuf_queuelen(&iev->ibuf) > 0) iev->events |= EV_WRITE; event_del(&iev->ev); @@ -818,10 +824,7 @@ proc_flush_imsg(struct privsep *ps, enum privsep_procid id, int n) for (; n < m; n++) { if ((ibuf = proc_ibuf(ps, id, n)) == NULL) return (-1); - do { - ret = imsg_flush(ibuf); - } while (ret == -1 && errno == EAGAIN); - if (ret == -1) + if ((ret = imsgbuf_flush(ibuf)) == -1) break; imsg_event_add(&ps->ps_ievs[id][n]); } diff --git a/usr.sbin/relayd/relay.c b/usr.sbin/relayd/relay.c index c29f39171..6d0970802 100644 --- a/usr.sbin/relayd/relay.c +++ b/usr.sbin/relayd/relay.c @@ -1,4 +1,4 @@ -/* $OpenBSD: relay.c,v 1.259 2024/01/17 10:01:24 claudio Exp $ */ +/* $OpenBSD: relay.c,v 1.260 2024/10/28 19:56:18 tb Exp $ */ /* * Copyright (c) 2006 - 2014 Reyk Floeter @@ -2159,8 +2159,7 @@ relay_tls_ctx_create(struct relay *rlay) tls_config_insecure_noverifyname(tls_client_cfg); if (rlay->rl_tls_ca_fd != -1) { - if ((buf = relay_load_fd(rlay->rl_tls_ca_fd, &len)) == - NULL) { + if ((buf = relay_load_fd(rlay->rl_tls_ca_fd, &len)) == NULL) { log_warn("failed to read root certificates"); goto err; } @@ -2251,6 +2250,26 @@ relay_tls_ctx_create(struct relay *rlay) } rlay->rl_tls_cacert_fd = -1; + if (rlay->rl_tls_client_ca_fd != -1) { + if ((buf = relay_load_fd(rlay->rl_tls_client_ca_fd, + &len)) == NULL) { + log_warn( + "failed to read tls client CA certificate"); + goto err; + } + + if (tls_config_set_ca_mem(tls_cfg, buf, len) != 0) { + log_warnx( + "failed to set tls client CA cert: %s", + tls_config_error(tls_cfg)); + goto err; + } + purge_key(&buf, len); + + tls_config_verify_client(tls_cfg); + } + rlay->rl_tls_client_ca_fd = -1; + tls = tls_server(); if (tls == NULL) { log_warnx("unable to allocate TLS context"); diff --git a/usr.sbin/relayd/relayd.c b/usr.sbin/relayd/relayd.c index df93c9527..76fa9e8b0 100644 --- a/usr.sbin/relayd/relayd.c +++ b/usr.sbin/relayd/relayd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: relayd.c,v 1.191 2023/06/25 08:07:38 op Exp $ */ +/* $OpenBSD: relayd.c,v 1.192 2024/10/28 19:56:18 tb Exp $ */ /* * Copyright (c) 2007 - 2016 Reyk Floeter @@ -1359,6 +1359,14 @@ relay_load_certfiles(struct relayd *env, struct relay *rlay, const char *name) if ((rlay->rl_conf.flags & F_TLS) == 0) return (0); + if (strlen(proto->tlsclientca) && rlay->rl_tls_client_ca_fd == -1) { + if ((rlay->rl_tls_client_ca_fd = + open(proto->tlsclientca, O_RDONLY)) == -1) + return (-1); + log_debug("%s: using client ca %s", __func__, + proto->tlsclientca); + } + if (name == NULL && print_host(&rlay->rl_conf.ss, hbuf, sizeof(hbuf)) == NULL) goto fail; diff --git a/usr.sbin/relayd/relayd.conf.5 b/usr.sbin/relayd/relayd.conf.5 index 50c73cbec..8372875b8 100644 --- a/usr.sbin/relayd/relayd.conf.5 +++ b/usr.sbin/relayd/relayd.conf.5 @@ -1,4 +1,4 @@ -.\" $OpenBSD: relayd.conf.5,v 1.210 2024/09/21 05:37:26 aisha Exp $ +.\" $OpenBSD: relayd.conf.5,v 1.211 2024/10/28 19:56:18 tb Exp $ .\" .\" Copyright (c) 2006 - 2016 Reyk Floeter .\" Copyright (c) 2006, 2007 Pierre-Yves Ritschard @@ -15,7 +15,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: September 21 2024 $ +.Dd $Mdocdate: October 28 2024 $ .Dt RELAYD.CONF 5 .Os .Sh NAME @@ -954,6 +954,9 @@ will be used (strong crypto cipher suites without anonymous DH). See the CIPHERS section of .Xr openssl 1 for information about TLS cipher suites and preference lists. +.It Ic client ca Ar path +Require TLS client certificates that can be verified against the CA +certificates in the specified file. .It Ic client-renegotiation Allow client-initiated renegotiation. To mitigate a potential DoS risk, diff --git a/usr.sbin/relayd/relayd.h b/usr.sbin/relayd/relayd.h index 865cf31ad..3b5c3987f 100644 --- a/usr.sbin/relayd/relayd.h +++ b/usr.sbin/relayd/relayd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: relayd.h,v 1.275 2024/10/08 05:28:11 jsg Exp $ */ +/* $OpenBSD: relayd.h,v 1.276 2024/10/28 19:56:18 tb Exp $ */ /* * Copyright (c) 2006 - 2016 Reyk Floeter @@ -137,11 +137,12 @@ struct ctl_relaytable { }; enum fd_type { - RELAY_FD_CERT = 1, - RELAY_FD_CACERT = 2, - RELAY_FD_CAFILE = 3, - RELAY_FD_KEY = 4, - RELAY_FD_OCSP = 5 + RELAY_FD_CERT = 1, + RELAY_FD_CACERT = 2, + RELAY_FD_CAFILE = 3, + RELAY_FD_KEY = 4, + RELAY_FD_OCSP = 5, + RELAY_FD_CLIENTCACERT = 6 }; struct ctl_relayfd { @@ -744,6 +745,7 @@ struct protocol { char tlscacert[PATH_MAX]; char tlscakey[PATH_MAX]; char *tlscapass; + char tlsclientca[PATH_MAX]; struct keynamelist tlscerts; char name[MAX_NAME_SIZE]; int tickets; @@ -833,6 +835,7 @@ struct relay { int rl_tls_ca_fd; int rl_tls_cacert_fd; + int rl_tls_client_ca_fd; EVP_PKEY *rl_tls_pkey; X509 *rl_tls_cacertx509; char *rl_tls_cakey; diff --git a/usr.sbin/ripctl/ripctl.c b/usr.sbin/ripctl/ripctl.c index 051f9cb20..beee3d612 100644 --- a/usr.sbin/ripctl/ripctl.c +++ b/usr.sbin/ripctl/ripctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ripctl.c,v 1.17 2016/08/02 16:05:32 jca Exp $ +/* $OpenBSD: ripctl.c,v 1.22 2024/11/21 13:38:15 claudio Exp $ * * Copyright (c) 2006 Michele Marchetto * Copyright (c) 2005 Claudio Jeker @@ -110,7 +110,8 @@ main(int argc, char *argv[]) if ((ibuf = malloc(sizeof(struct imsgbuf))) == NULL) err(1, NULL); - imsg_init(ibuf, ctl_sock); + if (imsgbuf_init(ibuf, ctl_sock) == -1) + err(1, NULL); done = 0; /* process user request */ @@ -187,13 +188,12 @@ main(int argc, char *argv[]) break; } - while (ibuf->w.queued) - if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN) - err(1, "write error"); + if (imsgbuf_flush(ibuf) == -1) + err(1, "write error"); while (!done) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - errx(1, "imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + err(1, "read error"); if (n == 0) errx(1, "pipe closed"); diff --git a/usr.sbin/ripd/control.c b/usr.sbin/ripd/control.c index 0bab7d714..20689670b 100644 --- a/usr.sbin/ripd/control.c +++ b/usr.sbin/ripd/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.28 2023/03/08 04:43:14 guenther Exp $ */ +/* $OpenBSD: control.c,v 1.34 2024/11/21 13:38:15 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -143,7 +143,12 @@ control_accept(int listenfd, short event, void *bula) return; } - imsg_init(&c->iev.ibuf, connfd); + if (imsgbuf_init(&c->iev.ibuf, connfd) == -1) { + log_warn("control_accept"); + close(connfd); + free(c); + return; + } c->iev.handler = control_dispatch_imsg; c->iev.events = EV_READ; event_set(&c->iev.ev, c->iev.ibuf.fd, c->iev.events, @@ -189,7 +194,7 @@ control_close(int fd) return; } - msgbuf_clear(&c->iev.ibuf.w); + imsgbuf_clear(&c->iev.ibuf); TAILQ_REMOVE(&ctl_conns, c, entry); event_del(&c->iev.ev); @@ -219,14 +224,13 @@ control_dispatch_imsg(int fd, short event, void *bula) } if (event & EV_READ) { - if (((n = imsg_read(&c->iev.ibuf)) == -1 && errno != EAGAIN) || - n == 0) { + if (imsgbuf_read(&c->iev.ibuf) != 1) { control_close(fd); return; } } if (event & EV_WRITE) { - if (msgbuf_write(&c->iev.ibuf.w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(&c->iev.ibuf) == -1) { control_close(fd); return; } diff --git a/usr.sbin/ripd/kroute.c b/usr.sbin/ripd/kroute.c index 08661eda8..40aaa0666 100644 --- a/usr.sbin/ripd/kroute.c +++ b/usr.sbin/ripd/kroute.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kroute.c,v 1.36 2023/03/08 04:43:14 guenther Exp $ */ +/* $OpenBSD: kroute.c,v 1.37 2025/01/02 06:35:57 anton Exp $ */ /* * Copyright (c) 2004 Esben Norby @@ -710,7 +710,8 @@ if_announce(void *msg) break; case IFAN_DEPARTURE: kif = kif_find(ifan->ifan_index); - kif_remove(kif); + if (kif != NULL) + kif_remove(kif); break; } } diff --git a/usr.sbin/ripd/rde.c b/usr.sbin/ripd/rde.c index 258010a9c..7c694160c 100644 --- a/usr.sbin/ripd/rde.c +++ b/usr.sbin/ripd/rde.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rde.c,v 1.25 2023/03/08 04:43:14 guenther Exp $ */ +/* $OpenBSD: rde.c,v 1.31 2024/11/21 13:38:15 claudio Exp $ */ /* * Copyright (c) 2006 Michele Marchetto @@ -129,9 +129,11 @@ rde(struct ripd_conf *xconf, int pipe_parent2rde[2], int pipe_ripe2rde[2], if ((iev_ripe = malloc(sizeof(struct imsgev))) == NULL || (iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_ripe->ibuf, pipe_ripe2rde[1]); + if (imsgbuf_init(&iev_ripe->ibuf, pipe_ripe2rde[1]) == -1) + fatal(NULL); iev_ripe->handler = rde_dispatch_imsg; - imsg_init(&iev_main->ibuf, pipe_parent2rde[1]); + if (imsgbuf_init(&iev_main->ibuf, pipe_parent2rde[1]) == -1) + fatal(NULL); iev_main->handler = rde_dispatch_parent; /* setup event handler */ @@ -164,9 +166,9 @@ __dead void rde_shutdown(void) { /* close pipes */ - msgbuf_clear(&iev_ripe->ibuf.w); + imsgbuf_clear(&iev_ripe->ibuf); close(iev_ripe->ibuf.fd); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); rt_clear(); @@ -197,16 +199,18 @@ rde_dispatch_imsg(int fd, short event, void *bula) int shut = 0, verbose; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -298,16 +302,18 @@ rde_dispatch_parent(int fd, short event, void *bula) int shut = 0; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { diff --git a/usr.sbin/ripd/ripd.c b/usr.sbin/ripd/ripd.c index 9550f4309..229e2d79f 100644 --- a/usr.sbin/ripd/ripd.c +++ b/usr.sbin/ripd/ripd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ripd.c,v 1.37 2023/03/08 04:43:15 guenther Exp $ */ +/* $OpenBSD: ripd.c,v 1.44 2024/11/21 13:38:15 claudio Exp $ */ /* * Copyright (c) 2006 Michele Marchetto @@ -235,9 +235,11 @@ main(int argc, char *argv[]) if ((iev_ripe = malloc(sizeof(struct imsgev))) == NULL || (iev_rde = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_ripe->ibuf, pipe_parent2ripe[0]); + if (imsgbuf_init(&iev_ripe->ibuf, pipe_parent2ripe[0]) == -1) + fatal(NULL); iev_ripe->handler = main_dispatch_ripe; - imsg_init(&iev_rde->ibuf, pipe_parent2rde[0]); + if (imsgbuf_init(&iev_rde->ibuf, pipe_parent2rde[0]) == -1) + fatal(NULL); iev_rde->handler = main_dispatch_rde; /* setup event handler */ @@ -270,9 +272,9 @@ ripd_shutdown(void) int status; /* close pipes */ - msgbuf_clear(&iev_ripe->ibuf.w); + imsgbuf_clear(&iev_ripe->ibuf); close(iev_ripe->ibuf.fd); - msgbuf_clear(&iev_rde->ibuf.w); + imsgbuf_clear(&iev_rde->ibuf); close(iev_rde->ibuf.fd); while ((i = LIST_FIRST(&conf->iface_list)) != NULL) { @@ -314,16 +316,18 @@ main_dispatch_ripe(int fd, short event, void *bula) int shut = 0, verbose; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -392,16 +396,18 @@ main_dispatch_rde(int fd, short event, void *bula) int shut = 0; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -522,12 +528,12 @@ void imsg_event_add(struct imsgev *iev) { if (iev->handler == NULL) { - imsg_flush(&iev->ibuf); + imsgbuf_flush(&iev->ibuf); return; } iev->events = EV_READ; - if (iev->ibuf.w.queued) + if (imsgbuf_queuelen(&iev->ibuf) > 0) iev->events |= EV_WRITE; event_del(&iev->ev); diff --git a/usr.sbin/ripd/ripd.h b/usr.sbin/ripd/ripd.h index 93b6bb320..216d503d2 100644 --- a/usr.sbin/ripd/ripd.h +++ b/usr.sbin/ripd/ripd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ripd.h,v 1.28 2021/01/19 10:28:07 claudio Exp $ */ +/* $OpenBSD: ripd.h,v 1.29 2024/10/22 22:50:49 jsg Exp $ */ /* * Copyright (c) 2004 Esben Norby @@ -45,7 +45,6 @@ #define READ_BUF_SIZE 65535 #define RT_BUF_SIZE 16384 -#define RT_BUF_SIZE 16384 #define MAX_RTSOCK_BUF (2 * 1024 * 1024) #define RIPD_FLAG_NO_FIB_UPDATE 0x0001 diff --git a/usr.sbin/ripd/ripe.c b/usr.sbin/ripd/ripe.c index e8b0539aa..d6458f62e 100644 --- a/usr.sbin/ripd/ripe.c +++ b/usr.sbin/ripd/ripe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ripe.c,v 1.31 2023/03/08 04:43:15 guenther Exp $ */ +/* $OpenBSD: ripe.c,v 1.37 2024/11/21 13:38:15 claudio Exp $ */ /* * Copyright (c) 2006 Michele Marchetto @@ -153,9 +153,11 @@ ripe(struct ripd_conf *xconf, int pipe_parent2ripe[2], int pipe_ripe2rde[2], if ((iev_rde = malloc(sizeof(struct imsgev))) == NULL || (iev_main = malloc(sizeof(struct imsgev))) == NULL) fatal(NULL); - imsg_init(&iev_rde->ibuf, pipe_ripe2rde[0]); + if (imsgbuf_init(&iev_rde->ibuf, pipe_ripe2rde[0]) == -1) + fatal(NULL); iev_rde->handler = ripe_dispatch_rde; - imsg_init(&iev_main->ibuf, pipe_parent2ripe[1]); + if (imsgbuf_init(&iev_main->ibuf, pipe_parent2ripe[1]) == -1) + fatal(NULL); iev_main->handler = ripe_dispatch_main; /* setup event handler */ @@ -231,16 +233,18 @@ ripe_dispatch_main(int fd, short event, void *bula) int link_ok, shut = 0; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -310,16 +314,18 @@ ripe_dispatch_rde(int fd, short event, void *bula) int shut = 0; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) /* connection closed */ - shut = 1; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -452,11 +458,11 @@ ripe_shutdown(void) struct iface *iface; /* close pipes */ - msgbuf_write(&iev_rde->ibuf.w); - msgbuf_clear(&iev_rde->ibuf.w); + imsgbuf_write(&iev_rde->ibuf); + imsgbuf_clear(&iev_rde->ibuf); close(iev_rde->ibuf.fd); - msgbuf_write(&iev_main->ibuf.w); - msgbuf_clear(&iev_main->ibuf.w); + imsgbuf_write(&iev_main->ibuf); + imsgbuf_clear(&iev_main->ibuf); close(iev_main->ibuf.fd); LIST_FOREACH(iface, &oeconf->iface_list, entry) { diff --git a/usr.sbin/rpki-client/as.c b/usr.sbin/rpki-client/as.c index 4812d9314..471e172be 100644 --- a/usr.sbin/rpki-client/as.c +++ b/usr.sbin/rpki-client/as.c @@ -1,4 +1,4 @@ -/* $OpenBSD: as.c,v 1.16 2023/12/27 07:15:55 tb Exp $ */ +/* $OpenBSD: as.c,v 1.17 2024/11/12 09:23:07 tb Exp $ */ /* * Copyright (c) 2019 Kristaps Dzonsons * @@ -38,21 +38,21 @@ as_id_parse(const ASN1_INTEGER *v, uint32_t *out) } /* - * Given a newly-parsed AS number or range "a", make sure that "a" does - * not overlap with any other numbers or ranges in the "as" array. + * Given a newly-parsed AS number or range "as", make sure that "as" does + * not overlap with any other numbers or ranges in the "ases" array. * This is defined by RFC 3779 section 3.2.3.4. * Returns zero on failure, non-zero on success. */ int -as_check_overlap(const struct cert_as *a, const char *fn, - const struct cert_as *as, size_t asz, int quiet) +as_check_overlap(const struct cert_as *as, const char *fn, + const struct cert_as *ases, size_t num_ases, int quiet) { size_t i; /* We can have only one inheritance statement. */ - if (asz && - (a->type == CERT_AS_INHERIT || as[0].type == CERT_AS_INHERIT)) { + if (num_ases && + (as->type == CERT_AS_INHERIT || ases[0].type == CERT_AS_INHERIT)) { if (!quiet) { warnx("%s: RFC 3779 section 3.2.3.3: " "cannot have inheritance and multiple ASnum or " @@ -63,17 +63,17 @@ as_check_overlap(const struct cert_as *a, const char *fn, /* Now check for overlaps between singletons/ranges. */ - for (i = 0; i < asz; i++) { - switch (as[i].type) { + for (i = 0; i < num_ases; i++) { + switch (ases[i].type) { case CERT_AS_ID: - switch (a->type) { + switch (as->type) { case CERT_AS_ID: - if (a->id != as[i].id) + if (as->id != ases[i].id) continue; break; case CERT_AS_RANGE: - if (as->range.min > as[i].id || - as->range.max < as[i].id) + if (ases->range.min > ases[i].id || + ases->range.max < ases[i].id) continue; break; default: @@ -81,15 +81,15 @@ as_check_overlap(const struct cert_as *a, const char *fn, } break; case CERT_AS_RANGE: - switch (a->type) { + switch (as->type) { case CERT_AS_ID: - if (as[i].range.min > a->id || - as[i].range.max < a->id) + if (ases[i].range.min > as->id || + ases[i].range.max < as->id) continue; break; case CERT_AS_RANGE: - if (a->range.max < as[i].range.min || - a->range.min > as[i].range.max) + if (as->range.max < ases[i].range.min || + as->range.min > ases[i].range.max) continue; break; default: @@ -112,23 +112,23 @@ as_check_overlap(const struct cert_as *a, const char *fn, /* * See if a given AS range (which may be the same number, in the case of * singleton AS identifiers) is covered by the AS numbers or ranges - * specified in the "as" array. + * specified in the "ases" array. * Return <0 if there is no cover, 0 if we're inheriting, >0 if there is. */ int as_check_covered(uint32_t min, uint32_t max, - const struct cert_as *as, size_t asz) + const struct cert_as *ases, size_t num_ases) { size_t i; uint32_t amin, amax; - for (i = 0; i < asz; i++) { - if (as[i].type == CERT_AS_INHERIT) + for (i = 0; i < num_ases; i++) { + if (ases[i].type == CERT_AS_INHERIT) return 0; - amin = as[i].type == CERT_AS_RANGE ? - as[i].range.min : as[i].id; - amax = as[i].type == CERT_AS_RANGE ? - as[i].range.max : as[i].id; + amin = ases[i].type == CERT_AS_RANGE ? + ases[i].range.min : ases[i].id; + amax = ases[i].type == CERT_AS_RANGE ? + ases[i].range.max : ases[i].id; if (min >= amin && max <= amax) return 1; } diff --git a/usr.sbin/rpki-client/aspa.c b/usr.sbin/rpki-client/aspa.c index 6e42be76d..b5325a260 100644 --- a/usr.sbin/rpki-client/aspa.c +++ b/usr.sbin/rpki-client/aspa.c @@ -1,4 +1,4 @@ -/* $OpenBSD: aspa.c,v 1.30 2024/04/08 14:02:13 tb Exp $ */ +/* $OpenBSD: aspa.c,v 1.32 2024/11/13 12:51:03 tb Exp $ */ /* * Copyright (c) 2022 Job Snijders * Copyright (c) 2022 Theo Buehler @@ -110,7 +110,7 @@ aspa_parse_providers(const char *fn, struct aspa *aspa, } } - aspa->providers[aspa->providersz++] = provider; + aspa->providers[aspa->num_providers++] = provider; } return 1; @@ -262,9 +262,9 @@ aspa_buffer(struct ibuf *b, const struct aspa *p) io_simple_buffer(b, &p->talid, sizeof(p->talid)); io_simple_buffer(b, &p->expires, sizeof(p->expires)); - io_simple_buffer(b, &p->providersz, sizeof(size_t)); + io_simple_buffer(b, &p->num_providers, sizeof(size_t)); io_simple_buffer(b, p->providers, - p->providersz * sizeof(p->providers[0])); + p->num_providers * sizeof(p->providers[0])); io_str_buffer(b, p->aia); io_str_buffer(b, p->aki); @@ -289,10 +289,15 @@ aspa_read(struct ibuf *b) io_read_buf(b, &p->talid, sizeof(p->talid)); io_read_buf(b, &p->expires, sizeof(p->expires)); - io_read_buf(b, &p->providersz, sizeof(size_t)); - if ((p->providers = calloc(p->providersz, sizeof(uint32_t))) == NULL) - err(1, NULL); - io_read_buf(b, p->providers, p->providersz * sizeof(p->providers[0])); + io_read_buf(b, &p->num_providers, sizeof(size_t)); + + if (p->num_providers > 0) { + if ((p->providers = calloc(p->num_providers, + sizeof(p->providers[0]))) == NULL) + err(1, NULL); + io_read_buf(b, p->providers, + p->num_providers * sizeof(p->providers[0])); + } io_read_str(b, &p->aia); io_read_str(b, &p->aki); @@ -310,11 +315,11 @@ aspa_read(struct ibuf *b) static void insert_vap(struct vap *v, uint32_t idx, uint32_t *p) { - if (idx < v->providersz) + if (idx < v->num_providers) memmove(v->providers + idx + 1, v->providers + idx, - (v->providersz - idx) * sizeof(*v->providers)); + (v->num_providers - idx) * sizeof(v->providers[0])); v->providers[idx] = *p; - v->providersz++; + v->num_providers++; } /* @@ -360,7 +365,7 @@ aspa_insert_vaps(char *fn, struct vap_tree *tree, struct aspa *aspa, repo_stat_inc(rp, aspa->talid, RTYPE_ASPA, STYPE_TOTAL); v->providers = reallocarray(v->providers, - v->providersz + aspa->providersz, sizeof(*v->providers)); + v->num_providers + aspa->num_providers, sizeof(v->providers[0])); if (v->providers == NULL) err(1, NULL); @@ -369,8 +374,8 @@ aspa_insert_vaps(char *fn, struct vap_tree *tree, struct aspa *aspa, * insert them in the right place in v->providers while keeping the * order of the providers array. */ - for (i = 0, j = 0; i < aspa->providersz; ) { - if (j == v->providersz || + for (i = 0, j = 0; i < aspa->num_providers; ) { + if (j == v->num_providers || aspa->providers[i] < v->providers[j]) { /* merge provider from aspa into v */ repo_stat_inc(rp, v->talid, RTYPE_ASPA, @@ -380,15 +385,15 @@ aspa_insert_vaps(char *fn, struct vap_tree *tree, struct aspa *aspa, } else if (aspa->providers[i] == v->providers[j]) i++; - if (j < v->providersz) + if (j < v->num_providers) j++; } - if (v->providersz >= MAX_ASPA_PROVIDERS) { + if (v->num_providers >= MAX_ASPA_PROVIDERS) { v->overflowed = 1; free(v->providers); v->providers = NULL; - v->providersz = 0; + v->num_providers = 0; repo_stat_inc(rp, v->talid, RTYPE_ASPA, STYPE_OVERFLOW); warnx("%s: too many providers for ASPA Customer ASID %u " "(more than %d)", fn, v->custasid, MAX_ASPA_PROVIDERS); diff --git a/usr.sbin/rpki-client/cert.c b/usr.sbin/rpki-client/cert.c index 882d11d38..91f24aba8 100644 --- a/usr.sbin/rpki-client/cert.c +++ b/usr.sbin/rpki-client/cert.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cert.c,v 1.151 2024/10/07 12:19:52 tb Exp $ */ +/* $OpenBSD: cert.c,v 1.155 2024/12/18 21:12:26 tb Exp $ */ /* * Copyright (c) 2022 Theo Buehler * Copyright (c) 2021 Job Snijders @@ -48,12 +48,12 @@ int certid = TALSZ_MAX; * Returns zero on failure (IP overlap) non-zero on success. */ static int -append_ip(const char *fn, struct cert_ip *ips, size_t *ipsz, +append_ip(const char *fn, struct cert_ip *ips, size_t *num_ips, const struct cert_ip *ip) { - if (!ip_addr_check_overlap(ip, fn, ips, *ipsz, 0)) + if (!ip_addr_check_overlap(ip, fn, ips, *num_ips, 0)) return 0; - ips[(*ipsz)++] = *ip; + ips[(*num_ips)++] = *ip; return 1; } @@ -63,12 +63,12 @@ append_ip(const char *fn, struct cert_ip *ips, size_t *ipsz, * as defined by RFC 3779 section 3.3. */ static int -append_as(const char *fn, struct cert_as *ases, size_t *asz, +append_as(const char *fn, struct cert_as *ases, size_t *num_ases, const struct cert_as *as) { - if (!as_check_overlap(as, fn, ases, *asz, 0)) + if (!as_check_overlap(as, fn, ases, *num_ases, 0)) return 0; - ases[(*asz)++] = *as; + ases[(*num_ases)++] = *as; return 1; } @@ -77,7 +77,7 @@ append_as(const char *fn, struct cert_as *ases, size_t *asz, * Returns zero on failure, non-zero on success. */ int -sbgp_as_range(const char *fn, struct cert_as *ases, size_t *asz, +sbgp_as_range(const char *fn, struct cert_as *ases, size_t *num_ases, const ASRange *range) { struct cert_as as; @@ -107,14 +107,14 @@ sbgp_as_range(const char *fn, struct cert_as *ases, size_t *asz, return 0; } - return append_as(fn, ases, asz, &as); + return append_as(fn, ases, num_ases, &as); } /* * Parse an entire 3.2.3.10 integer type. */ int -sbgp_as_id(const char *fn, struct cert_as *ases, size_t *asz, +sbgp_as_id(const char *fn, struct cert_as *ases, size_t *num_ases, const ASN1_INTEGER *i) { struct cert_as as; @@ -133,30 +133,30 @@ sbgp_as_id(const char *fn, struct cert_as *ases, size_t *asz, return 0; } - return append_as(fn, ases, asz, &as); + return append_as(fn, ases, num_ases, &as); } static int -sbgp_as_inherit(const char *fn, struct cert_as *ases, size_t *asz) +sbgp_as_inherit(const char *fn, struct cert_as *ases, size_t *num_ases) { struct cert_as as; memset(&as, 0, sizeof(struct cert_as)); as.type = CERT_AS_INHERIT; - return append_as(fn, ases, asz, &as); + return append_as(fn, ases, num_ases, &as); } int sbgp_parse_assysnum(const char *fn, const ASIdentifiers *asidentifiers, - struct cert_as **out_as, size_t *out_asz) + struct cert_as **out_as, size_t *out_num_ases) { const ASIdOrRanges *aors = NULL; struct cert_as *as = NULL; - size_t asz = 0, sz; + size_t num_ases = 0, num; int i; - assert(*out_as == NULL && *out_asz == 0); + assert(*out_as == NULL && *out_num_ases == 0); if (asidentifiers->rdi != NULL) { warnx("%s: RFC 6487 section 4.8.11: autonomousSysNum: " @@ -172,11 +172,11 @@ sbgp_parse_assysnum(const char *fn, const ASIdentifiers *asidentifiers, switch (asidentifiers->asnum->type) { case ASIdentifierChoice_inherit: - sz = 1; + num = 1; break; case ASIdentifierChoice_asIdsOrRanges: aors = asidentifiers->asnum->u.asIdsOrRanges; - sz = sk_ASIdOrRange_num(aors); + num = sk_ASIdOrRange_num(aors); break; default: warnx("%s: RFC 3779 section 3.2.3.2: ASIdentifierChoice: " @@ -184,21 +184,21 @@ sbgp_parse_assysnum(const char *fn, const ASIdentifiers *asidentifiers, goto out; } - if (sz == 0) { + if (num == 0) { warnx("%s: RFC 6487 section 4.8.11: empty asIdsOrRanges", fn); goto out; } - if (sz >= MAX_AS_SIZE) { + if (num >= MAX_AS_SIZE) { warnx("%s: too many AS number entries: limit %d", fn, MAX_AS_SIZE); goto out; } - as = calloc(sz, sizeof(struct cert_as)); + as = calloc(num, sizeof(struct cert_as)); if (as == NULL) err(1, NULL); if (aors == NULL) { - if (!sbgp_as_inherit(fn, as, &asz)) + if (!sbgp_as_inherit(fn, as, &num_ases)) goto out; } @@ -208,11 +208,11 @@ sbgp_parse_assysnum(const char *fn, const ASIdentifiers *asidentifiers, aor = sk_ASIdOrRange_value(aors, i); switch (aor->type) { case ASIdOrRange_id: - if (!sbgp_as_id(fn, as, &asz, aor->u.id)) + if (!sbgp_as_id(fn, as, &num_ases, aor->u.id)) goto out; break; case ASIdOrRange_range: - if (!sbgp_as_range(fn, as, &asz, aor->u.range)) + if (!sbgp_as_range(fn, as, &num_ases, aor->u.range)) goto out; break; default: @@ -223,7 +223,7 @@ sbgp_parse_assysnum(const char *fn, const ASIdentifiers *asidentifiers, } *out_as = as; - *out_asz = asz; + *out_num_ases = num_ases; return 1; @@ -256,7 +256,8 @@ sbgp_assysnum(const char *fn, struct cert *cert, X509_EXTENSION *ext) goto out; } - if (!sbgp_parse_assysnum(fn, asidentifiers, &cert->as, &cert->asz)) + if (!sbgp_parse_assysnum(fn, asidentifiers, &cert->ases, + &cert->num_ases)) goto out; rc = 1; @@ -270,7 +271,7 @@ sbgp_assysnum(const char *fn, struct cert *cert, X509_EXTENSION *ext) * Returns zero on failure, non-zero on success. */ int -sbgp_addr(const char *fn, struct cert_ip *ips, size_t *ipsz, enum afi afi, +sbgp_addr(const char *fn, struct cert_ip *ips, size_t *num_ips, enum afi afi, const ASN1_BIT_STRING *bs) { struct cert_ip ip; @@ -292,7 +293,7 @@ sbgp_addr(const char *fn, struct cert_ip *ips, size_t *ipsz, enum afi afi, return 0; } - return append_ip(fn, ips, ipsz, &ip); + return append_ip(fn, ips, num_ips, &ip); } /* @@ -300,7 +301,7 @@ sbgp_addr(const char *fn, struct cert_ip *ips, size_t *ipsz, enum afi afi, * Returns zero on failure, non-zero on success. */ int -sbgp_addr_range(const char *fn, struct cert_ip *ips, size_t *ipsz, +sbgp_addr_range(const char *fn, struct cert_ip *ips, size_t *num_ips, enum afi afi, const IPAddressRange *range) { struct cert_ip ip; @@ -328,11 +329,11 @@ sbgp_addr_range(const char *fn, struct cert_ip *ips, size_t *ipsz, return 0; } - return append_ip(fn, ips, ipsz, &ip); + return append_ip(fn, ips, num_ips, &ip); } static int -sbgp_addr_inherit(const char *fn, struct cert_ip *ips, size_t *ipsz, +sbgp_addr_inherit(const char *fn, struct cert_ip *ips, size_t *num_ips, enum afi afi) { struct cert_ip ip; @@ -342,23 +343,23 @@ sbgp_addr_inherit(const char *fn, struct cert_ip *ips, size_t *ipsz, ip.afi = afi; ip.type = CERT_IP_INHERIT; - return append_ip(fn, ips, ipsz, &ip); + return append_ip(fn, ips, num_ips, &ip); } int sbgp_parse_ipaddrblk(const char *fn, const IPAddrBlocks *addrblk, - struct cert_ip **out_ips, size_t *out_ipsz) + struct cert_ip **out_ips, size_t *out_num_ips) { const IPAddressFamily *af; const IPAddressOrRanges *aors; const IPAddressOrRange *aor; enum afi afi; struct cert_ip *ips = NULL; - size_t ipsz = 0, sz; + size_t num_ips = 0, num; int ipv4_seen = 0, ipv6_seen = 0; int i, j, ipaddrblocksz; - assert(*out_ips == NULL && *out_ipsz == 0); + assert(*out_ips == NULL && *out_num_ips == 0); ipaddrblocksz = sk_IPAddressFamily_num(addrblk); if (ipaddrblocksz != 1 && ipaddrblocksz != 2) { @@ -374,26 +375,26 @@ sbgp_parse_ipaddrblk(const char *fn, const IPAddrBlocks *addrblk, switch (af->ipAddressChoice->type) { case IPAddressChoice_inherit: aors = NULL; - sz = ipsz + 1; + num = num_ips + 1; break; case IPAddressChoice_addressesOrRanges: aors = af->ipAddressChoice->u.addressesOrRanges; - sz = ipsz + sk_IPAddressOrRange_num(aors); + num = num_ips + sk_IPAddressOrRange_num(aors); break; default: warnx("%s: RFC 3779: IPAddressChoice: unknown type %d", fn, af->ipAddressChoice->type); goto out; } - if (sz == ipsz) { + if (num == num_ips) { warnx("%s: RFC 6487 section 4.8.10: " "empty ipAddressesOrRanges", fn); goto out; } - if (sz >= MAX_IP_SIZE) + if (num >= MAX_IP_SIZE) goto out; - ips = recallocarray(ips, ipsz, sz, sizeof(struct cert_ip)); + ips = recallocarray(ips, num_ips, num, sizeof(struct cert_ip)); if (ips == NULL) err(1, NULL); @@ -420,7 +421,7 @@ sbgp_parse_ipaddrblk(const char *fn, const IPAddrBlocks *addrblk, } if (aors == NULL) { - if (!sbgp_addr_inherit(fn, ips, &ipsz, afi)) + if (!sbgp_addr_inherit(fn, ips, &num_ips, afi)) goto out; continue; } @@ -429,12 +430,12 @@ sbgp_parse_ipaddrblk(const char *fn, const IPAddrBlocks *addrblk, aor = sk_IPAddressOrRange_value(aors, j); switch (aor->type) { case IPAddressOrRange_addressPrefix: - if (!sbgp_addr(fn, ips, &ipsz, afi, + if (!sbgp_addr(fn, ips, &num_ips, afi, aor->u.addressPrefix)) goto out; break; case IPAddressOrRange_addressRange: - if (!sbgp_addr_range(fn, ips, &ipsz, afi, + if (!sbgp_addr_range(fn, ips, &num_ips, afi, aor->u.addressRange)) goto out; break; @@ -447,7 +448,7 @@ sbgp_parse_ipaddrblk(const char *fn, const IPAddrBlocks *addrblk, } *out_ips = ips; - *out_ipsz = ipsz; + *out_num_ips = num_ips; return 1; @@ -480,10 +481,10 @@ sbgp_ipaddrblk(const char *fn, struct cert *cert, X509_EXTENSION *ext) goto out; } - if (!sbgp_parse_ipaddrblk(fn, addrblk, &cert->ips, &cert->ipsz)) + if (!sbgp_parse_ipaddrblk(fn, addrblk, &cert->ips, &cert->num_ips)) goto out; - if (cert->ipsz == 0) { + if (cert->num_ips == 0) { warnx("%s: RFC 6487 section 4.8.10: empty ipAddrBlock", fn); goto out; } @@ -975,7 +976,7 @@ cert_parse_pre(const char *fn, const unsigned char *der, size_t len) warnx("%s: RFC 6487 section 4.8.8: missing SIA", fn); goto out; } - if (cert->asz == 0 && cert->ipsz == 0) { + if (cert->num_ases == 0 && cert->num_ips == 0) { warnx("%s: missing IP or AS resources", fn); goto out; } @@ -986,12 +987,12 @@ cert_parse_pre(const char *fn, const unsigned char *der, size_t len) warnx("%s: x509_get_pubkey failed", fn); goto out; } - if (cert->ipsz > 0) { + if (cert->num_ips > 0) { warnx("%s: unexpected IP resources in BGPsec cert", fn); goto out; } - for (j = 0; j < cert->asz; j++) { - if (cert->as[j].type == CERT_AS_INHERIT) { + for (j = 0; j < cert->num_ases; j++) { + if (cert->ases[j].type == CERT_AS_INHERIT) { warnx("%s: inherit elements not allowed in EE" " cert", fn); goto out; @@ -1060,6 +1061,72 @@ badcert: return NULL; } +/* + * Reject TA certificates with an overly long validity period. + * + * The schedule is as follows: + * Before February 2nd, 2026, warn on TA certs valid for longer than 15 years. + * After February 2nd, 2026, reject TA certs valid for longer than 15 years. + * Before March 3rd, 2027, warn on TA certs valid for longer than 3 years. + * After March 3rd, 2027, reject TA certs valid for longer than 3 years. + * + * Return 1 if the validity period is acceptable and 0 otherwise. + */ +static int +ta_check_validity(const char *fn, const struct cert *p, time_t now) +{ + time_t validity = p->notafter - p->notbefore; + time_t cutoff_15y = 1769990400; /* 2026-02-02T00:00:00Z */ + time_t cutoff_3y = 1804032000; /* 2027-03-03T00:00:00Z */ + time_t cutoff = cutoff_3y; + int warn_years = 3; + int exceeds_15y = 0, exceeds_3y = 0; + int complain = 0, acceptable = 1; + + if (validity >= 15 * 365 * 86400) + exceeds_15y = 1; + if (validity >= 3 * 365 * 86400) + exceeds_3y = 1; + + if (now < cutoff_15y) { + warn_years = 15; + cutoff = cutoff_15y; + if (exceeds_15y) + complain = 1; + } else if (now < cutoff_3y) { + if (exceeds_15y) + acceptable = 0; + if (exceeds_3y) + complain = 1; + } else if (exceeds_3y) { + acceptable = 0; + complain = 1; + } + + /* + * Suppress warnings for previously fetched TA certs. + */ + if (verbose == 0 && strncmp(fn, "ta/", strlen("ta/")) == 0) + goto out; + + if (!acceptable) { + warnx("%s: TA cert rejected: validity period exceeds %d years. " + "Ask the TA operator to reissue their TA cert with a " + "shorter validity period.", fn, warn_years); + goto out; + } + + if (complain) { + warnx("%s: TA validity period exceeds %d years. After %s this " + "certificate will be rejected.", fn, warn_years, + time2str(cutoff)); + goto out; + } + + out: + return acceptable; +} + struct cert * ta_parse(const char *fn, struct cert *p, const unsigned char *pkey, size_t pkeysz) @@ -1085,6 +1152,7 @@ ta_parse(const char *fn, struct cert *p, const unsigned char *pkey, "pubkey does not match TAL pubkey", fn); goto badcert; } + if (p->notbefore > now) { warnx("%s: certificate not yet valid", fn); goto badcert; @@ -1093,6 +1161,9 @@ ta_parse(const char *fn, struct cert *p, const unsigned char *pkey, warnx("%s: certificate has expired", fn); goto badcert; } + if (!ta_check_validity(fn, p, now)) + goto badcert; + if (p->aki != NULL && strcmp(p->aki, p->ski)) { warnx("%s: RFC 6487 section 4.8.3: " "trust anchor AKI, if specified, must match SKI", fn); @@ -1150,7 +1221,7 @@ cert_free(struct cert *p) free(p->mft); free(p->notify); free(p->ips); - free(p->as); + free(p->ases); free(p->aia); free(p->aki); free(p->ski); @@ -1171,11 +1242,11 @@ cert_buffer(struct ibuf *b, const struct cert *p) io_simple_buffer(b, &p->talid, sizeof(p->talid)); io_simple_buffer(b, &p->certid, sizeof(p->certid)); io_simple_buffer(b, &p->repoid, sizeof(p->repoid)); - io_simple_buffer(b, &p->ipsz, sizeof(p->ipsz)); - io_simple_buffer(b, &p->asz, sizeof(p->asz)); + io_simple_buffer(b, &p->num_ips, sizeof(p->num_ips)); + io_simple_buffer(b, &p->num_ases, sizeof(p->num_ases)); - io_simple_buffer(b, p->ips, p->ipsz * sizeof(p->ips[0])); - io_simple_buffer(b, p->as, p->asz * sizeof(p->as[0])); + io_simple_buffer(b, p->ips, p->num_ips * sizeof(p->ips[0])); + io_simple_buffer(b, p->ases, p->num_ases * sizeof(p->ases[0])); io_str_buffer(b, p->mft); io_str_buffer(b, p->notify); @@ -1205,18 +1276,20 @@ cert_read(struct ibuf *b) io_read_buf(b, &p->talid, sizeof(p->talid)); io_read_buf(b, &p->certid, sizeof(p->certid)); io_read_buf(b, &p->repoid, sizeof(p->repoid)); - io_read_buf(b, &p->ipsz, sizeof(p->ipsz)); - io_read_buf(b, &p->asz, sizeof(p->asz)); + io_read_buf(b, &p->num_ips, sizeof(p->num_ips)); + io_read_buf(b, &p->num_ases, sizeof(p->num_ases)); - p->ips = calloc(p->ipsz, sizeof(struct cert_ip)); - if (p->ips == NULL) - err(1, NULL); - io_read_buf(b, p->ips, p->ipsz * sizeof(p->ips[0])); + if (p->num_ips > 0) { + if ((p->ips = calloc(p->num_ips, sizeof(p->ips[0]))) == NULL) + err(1, NULL); + io_read_buf(b, p->ips, p->num_ips * sizeof(p->ips[0])); + } - p->as = calloc(p->asz, sizeof(struct cert_as)); - if (p->as == NULL) - err(1, NULL); - io_read_buf(b, p->as, p->asz * sizeof(p->as[0])); + if (p->num_ases > 0) { + if ((p->ases = calloc(p->num_ases, sizeof(p->ases[0]))) == NULL) + err(1, NULL); + io_read_buf(b, p->ases, p->num_ases * sizeof(p->ases[0])); + } io_read_str(b, &p->mft); io_read_str(b, &p->notify); @@ -1346,14 +1419,14 @@ cert_insert_brks(struct brk_tree *tree, struct cert *cert) { size_t i, asid; - for (i = 0; i < cert->asz; i++) { - switch (cert->as[i].type) { + for (i = 0; i < cert->num_ases; i++) { + switch (cert->ases[i].type) { case CERT_AS_ID: - insert_brk(tree, cert, cert->as[i].id); + insert_brk(tree, cert, cert->ases[i].id); break; case CERT_AS_RANGE: - for (asid = cert->as[i].range.min; - asid <= cert->as[i].range.max; asid++) + for (asid = cert->ases[i].range.min; + asid <= cert->ases[i].range.max; asid++) insert_brk(tree, cert, asid); break; default: diff --git a/usr.sbin/rpki-client/cms.c b/usr.sbin/rpki-client/cms.c index 5ef7ebb0d..23d0c85f9 100644 --- a/usr.sbin/rpki-client/cms.c +++ b/usr.sbin/rpki-client/cms.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cms.c,v 1.48 2024/06/11 13:09:02 tb Exp $ */ +/* $OpenBSD: cms.c,v 1.50 2024/11/27 15:19:26 tb Exp $ */ /* * Copyright (c) 2019 Kristaps Dzonsons * @@ -100,7 +100,7 @@ cms_parse_validate_internal(X509 **xp, const char *fn, const unsigned char *der, CMS_ContentInfo *cms; long version; STACK_OF(X509) *certs = NULL; - STACK_OF(X509_CRL) *crls; + STACK_OF(X509_CRL) *crls = NULL; STACK_OF(CMS_SignerInfo) *sinfos; CMS_SignerInfo *si; EVP_PKEY *pkey; @@ -311,10 +311,10 @@ cms_parse_validate_internal(X509 **xp, const char *fn, const unsigned char *der, /* * Check that there are no CRLS in this CMS message. + * XXX - can only error check for OpenSSL >= 3.4. */ crls = CMS_get1_crls(cms); - if (crls != NULL) { - sk_X509_CRL_pop_free(crls, X509_CRL_free); + if (crls != NULL && sk_X509_CRL_num(crls) != 0) { warnx("%s: RFC 6488: CMS has CRLs", fn); goto out; } @@ -365,6 +365,7 @@ cms_parse_validate_internal(X509 **xp, const char *fn, const unsigned char *der, X509_free(*xp); *xp = NULL; } + sk_X509_CRL_pop_free(crls, X509_CRL_free); sk_X509_free(certs); CMS_ContentInfo_free(cms); return rc; diff --git a/usr.sbin/rpki-client/constraints.c b/usr.sbin/rpki-client/constraints.c index 1c08427bf..37a95b952 100644 --- a/usr.sbin/rpki-client/constraints.c +++ b/usr.sbin/rpki-client/constraints.c @@ -1,4 +1,4 @@ -/* $OpenBSD: constraints.c,v 1.4 2024/03/15 05:14:16 tb Exp $ */ +/* $OpenBSD: constraints.c,v 1.5 2024/11/12 09:23:07 tb Exp $ */ /* * Copyright (c) 2023 Job Snijders * Copyright (c) 2023 Theo Buehler @@ -41,13 +41,13 @@ struct tal_constraints { char *fn; /* constraints filename */ char *warn; /* warning msg used for violations */ struct cert_ip *allow_ips; /* list of allowed IP address ranges */ - size_t allow_ipsz; /* length of "allow_ips" */ - struct cert_as *allow_as; /* allowed AS numbers and ranges */ - size_t allow_asz; /* length of "allow_as" */ + size_t num_allow_ips; + struct cert_as *allow_ases; /* allowed AS numbers and ranges */ + size_t num_allow_ases; struct cert_ip *deny_ips; /* forbidden IP address ranges */ - size_t deny_ipsz; /* length of "deny_ips" */ - struct cert_as *deny_as; /* forbidden AS numbers and ranges */ - size_t deny_asz; /* length of "deny_as" */ + size_t num_deny_ips; + struct cert_as *deny_ases; /* forbidden AS numbers and ranges */ + size_t num_deny_ases; } tal_constraints[TALSZ_MAX]; /* @@ -334,10 +334,10 @@ constraints_parse_talid(int talid) ASIdentifiers *allow_asids, *deny_asids; FILE *f; char *fn, *p, *pp; - struct cert_as *allow_as = NULL, *deny_as = NULL; + struct cert_as *allow_ases = NULL, *deny_ases = NULL; struct cert_ip *allow_ips = NULL, *deny_ips = NULL; - size_t allow_asz = 0, allow_ipsz = 0, - deny_asz = 0, deny_ipsz = 0; + size_t num_allow_ases = 0, num_allow_ips = 0, + num_deny_as = 0, num_deny_ips = 0; char *line = NULL; size_t len = 0; ssize_t n; @@ -452,14 +452,14 @@ constraints_parse_talid(int talid) errx(1, "%s: failed to canonize AS numbers denylist", fn); if (have_allow_as) { - if (!sbgp_parse_assysnum(fn, allow_asids, &allow_as, - &allow_asz)) + if (!sbgp_parse_assysnum(fn, allow_asids, &allow_ases, + &num_allow_ases)) errx(1, "%s: failed to parse AS identifiers allowlist", fn); } if (have_deny_as) { - if (!sbgp_parse_assysnum(fn, deny_asids, &deny_as, - &deny_asz)) + if (!sbgp_parse_assysnum(fn, deny_asids, &deny_ases, + &num_deny_as)) errx(1, "%s: failed to parse AS identifiers denylist", fn); } @@ -467,7 +467,7 @@ constraints_parse_talid(int talid) constraints_normalize_ip_addrblocks(fn, &allow_addrs); if (!sbgp_parse_ipaddrblk(fn, allow_addrs, &allow_ips, - &allow_ipsz)) + &num_allow_ips)) errx(1, "%s: failed to parse IP addresses allowlist", fn); } @@ -475,19 +475,19 @@ constraints_parse_talid(int talid) constraints_normalize_ip_addrblocks(fn, &deny_addrs); if (!sbgp_parse_ipaddrblk(fn, deny_addrs, &deny_ips, - &deny_ipsz)) + &num_deny_ips)) errx(1, "%s: failed to parse IP addresses denylist", fn); } - tal_constraints[talid].allow_as = allow_as; - tal_constraints[talid].allow_asz = allow_asz; + tal_constraints[talid].allow_ases = allow_ases; + tal_constraints[talid].num_allow_ases = num_allow_ases; tal_constraints[talid].allow_ips = allow_ips; - tal_constraints[talid].allow_ipsz = allow_ipsz; - tal_constraints[talid].deny_as = deny_as; - tal_constraints[talid].deny_asz = deny_asz; + tal_constraints[talid].num_allow_ips = num_allow_ips; + tal_constraints[talid].deny_ases = deny_ases; + tal_constraints[talid].num_deny_ases = num_deny_as; tal_constraints[talid].deny_ips = deny_ips; - tal_constraints[talid].deny_ipsz = deny_ipsz; + tal_constraints[talid].num_deny_ips = num_deny_ips; IPAddrBlocks_free(allow_addrs); IPAddrBlocks_free(deny_addrs); @@ -511,8 +511,8 @@ constraints_parse(void) static int constraints_check_as(const char *fn, struct cert_as *cert, - const struct cert_as *allow_as, size_t allow_asz, - const struct cert_as *deny_as, size_t deny_asz) + const struct cert_as *allow_ases, size_t num_allow_ases, + const struct cert_as *deny_ases, size_t num_deny_ases) { uint32_t min, max; @@ -528,12 +528,12 @@ constraints_check_as(const char *fn, struct cert_as *cert, max = cert->range.max; } - if (deny_as != NULL) { - if (!as_check_overlap(cert, fn, deny_as, deny_asz, 1)) + if (deny_ases != NULL) { + if (!as_check_overlap(cert, fn, deny_ases, num_deny_ases, 1)) return 0; } - if (allow_as != NULL) { - if (as_check_covered(min, max, allow_as, allow_asz) <= 0) + if (allow_ases != NULL) { + if (as_check_covered(min, max, allow_ases, num_allow_ases) <= 0) return 0; } return 1; @@ -541,20 +541,20 @@ constraints_check_as(const char *fn, struct cert_as *cert, static int constraints_check_ips(const char *fn, struct cert_ip *cert, - const struct cert_ip *allow_ips, size_t allow_ipsz, - const struct cert_ip *deny_ips, size_t deny_ipsz) + const struct cert_ip *allow_ips, size_t num_allow_ips, + const struct cert_ip *deny_ips, size_t num_deny_ips) { /* Inheriting EE resources are not to be constrained. */ if (cert->type == CERT_IP_INHERIT) return 1; if (deny_ips != NULL) { - if (!ip_addr_check_overlap(cert, fn, deny_ips, deny_ipsz, 1)) + if (!ip_addr_check_overlap(cert, fn, deny_ips, num_deny_ips, 1)) return 0; } if (allow_ips != NULL) { if (ip_addr_check_covered(cert->afi, cert->min, cert->max, - allow_ips, allow_ipsz) <= 0) + allow_ips, num_allow_ips) <= 0) return 0; } return 1; @@ -569,9 +569,11 @@ int constraints_validate(const char *fn, const struct cert *cert) { int talid = cert->talid; - struct cert_as *allow_as, *deny_as; + struct cert_as *allow_ases, *deny_ases; struct cert_ip *allow_ips, *deny_ips; - size_t i, allow_asz, allow_ipsz, deny_asz, deny_ipsz; + size_t num_allow_ases, num_allow_ips; + size_t num_deny_ases, num_deny_ips; + size_t i; /* Accept negative talid to bypass validation. */ if (talid < 0) @@ -579,28 +581,28 @@ constraints_validate(const char *fn, const struct cert *cert) if (talid >= talsz) errx(1, "%s: talid out of range %d", fn, talid); - allow_as = tal_constraints[talid].allow_as; - allow_asz = tal_constraints[talid].allow_asz; - deny_as = tal_constraints[talid].deny_as; - deny_asz = tal_constraints[talid].deny_asz; + allow_ases = tal_constraints[talid].allow_ases; + num_allow_ases = tal_constraints[talid].num_allow_ases; + deny_ases = tal_constraints[talid].deny_ases; + num_deny_ases = tal_constraints[talid].num_deny_ases; - for (i = 0; i < cert->asz; i++) { - if (constraints_check_as(fn, &cert->as[i], allow_as, allow_asz, - deny_as, deny_asz)) + for (i = 0; i < cert->num_ases; i++) { + if (constraints_check_as(fn, &cert->ases[i], + allow_ases, num_allow_ases, deny_ases, num_deny_ases)) continue; - as_warn(fn, tal_constraints[talid].warn, &cert->as[i]); + as_warn(fn, tal_constraints[talid].warn, &cert->ases[i]); return 0; } allow_ips = tal_constraints[talid].allow_ips; - allow_ipsz = tal_constraints[talid].allow_ipsz; + num_allow_ips = tal_constraints[talid].num_allow_ips; deny_ips = tal_constraints[talid].deny_ips; - deny_ipsz = tal_constraints[talid].deny_ipsz; + num_deny_ips = tal_constraints[talid].num_deny_ips; - for (i = 0; i < cert->ipsz; i++) { + for (i = 0; i < cert->num_ips; i++) { if (constraints_check_ips(fn, &cert->ips[i], allow_ips, - allow_ipsz, deny_ips, deny_ipsz)) + num_allow_ips, deny_ips, num_deny_ips)) continue; ip_warn(fn, tal_constraints[talid].warn, &cert->ips[i]); diff --git a/usr.sbin/rpki-client/extern.h b/usr.sbin/rpki-client/extern.h index b6612c170..e9afc703a 100644 --- a/usr.sbin/rpki-client/extern.h +++ b/usr.sbin/rpki-client/extern.h @@ -1,4 +1,4 @@ -/* $OpenBSD: extern.h,v 1.228 2024/09/12 10:33:25 tb Exp $ */ +/* $OpenBSD: extern.h,v 1.236 2025/01/03 10:14:32 job Exp $ */ /* * Copyright (c) 2019 Kristaps Dzonsons * @@ -27,6 +27,8 @@ #define CTASSERT(x) extern char _ctassert[(x) ? 1 : -1 ] \ __attribute__((__unused__)) +#define MAX_MSG_SIZE (50 * 1024 * 1024) + enum cert_as_type { CERT_AS_ID, /* single identifier */ CERT_AS_INHERIT, /* inherit from issuer */ @@ -120,10 +122,10 @@ enum cert_purpose { * inheriting. */ struct cert { - struct cert_ip *ips; /* list of IP address ranges */ - size_t ipsz; /* length of "ips" */ - struct cert_as *as; /* list of AS numbers and ranges */ - size_t asz; /* length of "asz" */ + struct cert_ip *ips; /* list of IP address ranges */ + size_t num_ips; + struct cert_as *ases; /* list of AS numbers and ranges */ + size_t num_ases; int talid; /* cert is covered by which TAL */ int certid; unsigned int repoid; /* repository of this cert file */ @@ -151,7 +153,7 @@ struct cert { */ struct tal { char **uri; /* well-formed rsync URIs */ - size_t urisz; /* number of URIs */ + size_t num_uris; unsigned char *pkey; /* DER-encoded public key */ size_t pkeysz; /* length of pkey */ char *descr; /* basename of tal file */ @@ -219,6 +221,7 @@ struct mft { unsigned int repoid; int talid; int certid; + int seqnum_gap; /* was there a gap compared to prev mft? */ }; /* @@ -240,8 +243,8 @@ struct roa_ip { */ struct roa { uint32_t asid; /* asID of ROA (if 0, RFC 6483 sec 4) */ - struct roa_ip *ips; /* IP prefixes */ - size_t ipsz; /* number of IP prefixes */ + struct roa_ip *ips; /* IP prefixes */ + size_t num_ips; int talid; /* ROAs are covered by which TAL */ int valid; /* validated resources */ char *aia; /* AIA */ @@ -265,12 +268,12 @@ struct rscfile { struct rsc { int talid; /* RSC covered by what TAL */ int valid; /* eContent resources covered by EE's 3779? */ - struct cert_ip *ips; /* IP prefixes */ - size_t ipsz; /* number of IP prefixes */ - struct cert_as *as; /* AS resources */ - size_t asz; /* number of AS resources */ + struct cert_ip *ips; /* IP prefixes */ + size_t num_ips; + struct cert_as *ases; /* AS resources */ + size_t num_ases; struct rscfile *files; /* FileAndHashes in the RSC */ - size_t filesz; /* number of FileAndHashes */ + size_t num_files; char *aia; /* AIA */ char *aki; /* AKI */ char *ski; /* SKI */ @@ -294,8 +297,8 @@ struct spl_pfx { */ struct spl { uint32_t asid; - struct spl_pfx *pfxs; - size_t pfxsz; + struct spl_pfx *prefixes; + size_t num_prefixes; int talid; char *aia; char *aki; @@ -313,9 +316,9 @@ struct spl { */ struct takey { char **comments; /* Comments */ - size_t commentsz; /* number of Comments */ + size_t num_comments; char **uris; /* CertificateURI */ - size_t urisz; /* number of CertificateURIs */ + size_t num_uris; unsigned char *pubkey; /* DER encoded SubjectPublicKeyInfo */ size_t pubkeysz; char *ski; /* hex encoded SubjectKeyIdentifier of pubkey */ @@ -352,7 +355,7 @@ struct geoip { */ struct geofeed { struct geoip *geoips; /* Prefix + location entry in the CSV */ - size_t geoipsz; /* number of IPs */ + size_t num_geoips; char *aia; /* AIA */ char *aki; /* AKI */ char *ski; /* SKI */ @@ -391,7 +394,7 @@ struct aspa { char *ski; /* SKI */ uint32_t custasid; /* the customerASID */ uint32_t *providers; /* the providers */ - size_t providersz; /* number of providers */ + size_t num_providers; time_t signtime; /* CMS signing-time attribute */ time_t notbefore; /* EE cert's Not Before */ time_t notafter; /* notAfter of the ASPA EE cert */ @@ -406,7 +409,7 @@ struct vap { RB_ENTRY(vap) entry; uint32_t custasid; uint32_t *providers; - size_t providersz; + size_t num_providers; time_t expires; int talid; unsigned int repoid; @@ -447,7 +450,7 @@ struct vsp { RB_ENTRY(vsp) entry; uint32_t asid; struct spl_pfx *prefixes; - size_t prefixesz; + size_t num_prefixes; time_t expires; int talid; unsigned int repoid; @@ -584,6 +587,7 @@ enum stype { STYPE_DEC_UNIQUE, STYPE_PROVIDERS, STYPE_OVERFLOW, + STYPE_SEQNUM_GAP, }; struct repo; @@ -598,6 +602,7 @@ struct repotalstats { uint32_t certs; /* certificates */ uint32_t certs_fail; /* invalid certificate */ uint32_t mfts; /* total number of manifests */ + uint32_t mfts_gap; /* manifests with sequence gaps */ uint32_t mfts_fail; /* failing syntactic parse */ uint32_t roas; /* route origin authorizations */ uint32_t roas_fail; /* failing syntactic parse */ @@ -658,6 +663,7 @@ extern int noop; extern int filemode; extern int excludeaspa; extern int experimental; +extern int excludeas0; extern const char *tals[]; extern const char *taldescs[]; extern unsigned int talrepocnt[]; @@ -690,6 +696,7 @@ struct mft *mft_parse(X509 **, const char *, int, const unsigned char *, struct mft *mft_read(struct ibuf *); int mft_compare_issued(const struct mft *, const struct mft *); int mft_compare_seqnum(const struct mft *, const struct mft *); +int mft_seqnum_gap_present(const struct mft *, const struct mft *); void roa_buffer(struct ibuf *, const struct roa *); void roa_free(struct roa *); @@ -898,8 +905,8 @@ void io_close_buffer(struct msgbuf *, struct ibuf *); void io_read_buf(struct ibuf *, void *, size_t); void io_read_str(struct ibuf *, char **); void io_read_buf_alloc(struct ibuf *, void **, size_t *); -struct ibuf *io_buf_read(int, struct ibuf **); -struct ibuf *io_buf_recvfd(int, struct ibuf **); +struct ibuf *io_parse_hdr(struct ibuf *, void *, int *); +struct ibuf *io_buf_get(struct msgbuf *); /* X509 helpers. */ @@ -962,11 +969,7 @@ int outputfiles(struct vrp_tree *v, struct brk_tree *b, int outputheader(FILE *, struct stats *); int output_bgpd(FILE *, struct vrp_tree *, struct brk_tree *, struct vap_tree *, struct vsp_tree *, struct stats *); -int output_bird1v4(FILE *, struct vrp_tree *, struct brk_tree *, - struct vap_tree *, struct vsp_tree *, struct stats *); -int output_bird1v6(FILE *, struct vrp_tree *, struct brk_tree *, - struct vap_tree *, struct vsp_tree *, struct stats *); -int output_bird2(FILE *, struct vrp_tree *, struct brk_tree *, +int output_bird(FILE *, struct vrp_tree *, struct brk_tree *, struct vap_tree *, struct vsp_tree *, struct stats *); int output_csv(FILE *, struct vrp_tree *, struct brk_tree *, struct vap_tree *, struct vsp_tree *, struct stats *); diff --git a/usr.sbin/rpki-client/filemode.c b/usr.sbin/rpki-client/filemode.c index ef77ac007..930067630 100644 --- a/usr.sbin/rpki-client/filemode.c +++ b/usr.sbin/rpki-client/filemode.c @@ -1,4 +1,4 @@ -/* $OpenBSD: filemode.c,v 1.49 2024/08/20 13:31:49 claudio Exp $ */ +/* $OpenBSD: filemode.c,v 1.57 2024/12/16 13:53:37 tb Exp $ */ /* * Copyright (c) 2019 Claudio Jeker * Copyright (c) 2019 Kristaps Dzonsons @@ -41,6 +41,8 @@ #include "extern.h" #include "json.h" +extern BN_CTX *bn_ctx; + static X509_STORE_CTX *ctx; static struct auth_tree auths = RB_INITIALIZER(&auths); static struct crl_tree crlt = RB_INITIALIZER(&crlt); @@ -267,7 +269,7 @@ parse_load_ta(struct tal *tal) cert->talid = tal->id; auth_insert(file, &auths, cert, NULL); - for (i = 0; i < tal->urisz; i++) { + for (i = 0; i < tal->num_uris; i++) { if (strncasecmp(tal->uri[i], RSYNC_PROTO, RSYNC_PROTO_LEN) != 0) continue; /* Add all rsync uri since any of them could be used as AIA. */ @@ -351,7 +353,8 @@ proc_parser_file(char *file, unsigned char *buf, size_t len) struct tal *tal = NULL; char *aia = NULL; char *crl_uri = NULL; - time_t *expires = NULL, *notafter = NULL; + time_t *notbefore = NULL, *expires = NULL, *notafter = NULL; + time_t now; struct auth *a = NULL; struct crl *c; const char *errstr = NULL, *valid; @@ -361,6 +364,8 @@ proc_parser_file(char *file, unsigned char *buf, size_t len) enum rtype type; int is_ta = 0; + now = get_current_time(); + if (outformats & FORMAT_JSON) { json_do_start(stdout); } else { @@ -402,6 +407,7 @@ proc_parser_file(char *file, unsigned char *buf, size_t len) break; aia = aspa->aia; expires = &aspa->expires; + notbefore = &aspa->notbefore; notafter = &aspa->notafter; break; case RTYPE_CER: @@ -418,6 +424,7 @@ proc_parser_file(char *file, unsigned char *buf, size_t len) if (X509_up_ref(x509) == 0) errx(1, "%s: X509_up_ref failed", __func__); expires = &cert->expires; + notbefore = &cert->notbefore; notafter = &cert->notafter; break; case RTYPE_CRL: @@ -432,6 +439,7 @@ proc_parser_file(char *file, unsigned char *buf, size_t len) break; aia = mft->aia; expires = &mft->expires; + notbefore = &mft->thisupdate; notafter = &mft->nextupdate; break; case RTYPE_GBR: @@ -440,6 +448,7 @@ proc_parser_file(char *file, unsigned char *buf, size_t len) break; aia = gbr->aia; expires = &gbr->expires; + notbefore = &gbr->notbefore; notafter = &gbr->notafter; break; case RTYPE_GEOFEED: @@ -448,6 +457,7 @@ proc_parser_file(char *file, unsigned char *buf, size_t len) break; aia = geofeed->aia; expires = &geofeed->expires; + notbefore = &geofeed->notbefore; notafter = &geofeed->notafter; break; case RTYPE_ROA: @@ -456,6 +466,7 @@ proc_parser_file(char *file, unsigned char *buf, size_t len) break; aia = roa->aia; expires = &roa->expires; + notbefore = &roa->notbefore; notafter = &roa->notafter; break; case RTYPE_RSC: @@ -464,6 +475,7 @@ proc_parser_file(char *file, unsigned char *buf, size_t len) break; aia = rsc->aia; expires = &rsc->expires; + notbefore = &rsc->notbefore; notafter = &rsc->notafter; break; case RTYPE_SPL: @@ -472,6 +484,7 @@ proc_parser_file(char *file, unsigned char *buf, size_t len) break; aia = spl->aia; expires = &spl->expires; + notbefore = &spl->notbefore; notafter = &spl->notafter; break; case RTYPE_TAK: @@ -480,6 +493,7 @@ proc_parser_file(char *file, unsigned char *buf, size_t len) break; aia = tak->aia; expires = &tak->expires; + notbefore = &tak->notbefore; notafter = &tak->notafter; break; case RTYPE_TAL: @@ -554,7 +568,7 @@ proc_parser_file(char *file, unsigned char *buf, size_t len) } if (expires != NULL) { - if (status && aia != NULL) + if ((status && aia != NULL) || is_ta) *expires = x509_find_expires(*notafter, a, &crlt); switch (type) { @@ -590,9 +604,16 @@ proc_parser_file(char *file, unsigned char *buf, size_t len) } } - if (status) - valid = "OK"; - else if (aia == NULL) + if (status) { + if (notbefore != NULL && *notbefore > now) + valid = "Not yet valid"; + else if (notafter != NULL && *notafter < now) + valid = "Expired"; + else if (expires != NULL && *expires < now) + valid = "Signature path expired"; + else + valid = "OK"; + } else if (aia == NULL) valid = "N/A"; else valid = "Failed"; @@ -703,8 +724,8 @@ void proc_filemode(int fd) { struct entityq q; - struct msgbuf msgq; struct pollfd pfd; + struct msgbuf *msgq; struct entity *entp; struct ibuf *b, *inbuf = NULL; @@ -722,16 +743,19 @@ proc_filemode(int fd) if ((ctx = X509_STORE_CTX_new()) == NULL) err(1, "X509_STORE_CTX_new"); + if ((bn_ctx = BN_CTX_new()) == NULL) + err(1, "BN_CTX_new"); + TAILQ_INIT(&q); - msgbuf_init(&msgq); - msgq.fd = fd; - + if ((msgq = msgbuf_new_reader(sizeof(size_t), io_parse_hdr, NULL)) == + NULL) + err(1, NULL); pfd.fd = fd; for (;;) { pfd.events = POLLIN; - if (msgbuf_queuelen(&msgq) > 0) + if (msgbuf_queuelen(msgq) > 0) pfd.events |= POLLOUT; if (poll(&pfd, 1, INFTIM) == -1) { @@ -748,8 +772,13 @@ proc_filemode(int fd) break; if ((pfd.revents & POLLIN)) { - b = io_buf_read(fd, &inbuf); - if (b != NULL) { + switch (ibuf_read(fd, msgq)) { + case -1: + err(1, "ibuf_read"); + case 0: + errx(1, "ibuf_read: connection closed"); + } + while ((b = io_buf_get(msgq)) != NULL) { entp = calloc(1, sizeof(struct entity)); if (entp == NULL) err(1, NULL); @@ -760,18 +789,18 @@ proc_filemode(int fd) } if (pfd.revents & POLLOUT) { - switch (msgbuf_write(&msgq)) { - case 0: - errx(1, "write: connection closed"); - case -1: - err(1, "write"); + if (msgbuf_write(fd, msgq) == -1) { + if (errno == EPIPE) + errx(1, "write: connection closed"); + else + err(1, "write"); } } - parse_file(&q, &msgq); + parse_file(&q, msgq); } - msgbuf_clear(&msgq); + msgbuf_free(msgq); while ((entp = TAILQ_FIRST(&q)) != NULL) { TAILQ_REMOVE(&q, entp, entries); entity_free(entp); @@ -781,6 +810,8 @@ proc_filemode(int fd) crl_tree_free(&crlt); X509_STORE_CTX_free(ctx); + BN_CTX_free(bn_ctx); + ibuf_free(inbuf); exit(0); diff --git a/usr.sbin/rpki-client/geofeed.c b/usr.sbin/rpki-client/geofeed.c index f7d321fa3..0c8914325 100644 --- a/usr.sbin/rpki-client/geofeed.c +++ b/usr.sbin/rpki-client/geofeed.c @@ -1,4 +1,4 @@ -/* $OpenBSD: geofeed.c,v 1.16 2024/02/21 09:17:06 tb Exp $ */ +/* $OpenBSD: geofeed.c,v 1.17 2024/11/12 09:23:07 tb Exp $ */ /* * Copyright (c) 2022 Job Snijders * Copyright (c) 2019 Kristaps Dzonsons @@ -68,11 +68,11 @@ geofeed_parse_geoip(struct geofeed *geofeed, char *cidr, char *loc) ipaddr->prefixlen = plen; - geofeed->geoips = recallocarray(geofeed->geoips, geofeed->geoipsz, - geofeed->geoipsz + 1, sizeof(struct geoip)); + geofeed->geoips = recallocarray(geofeed->geoips, geofeed->num_geoips, + geofeed->num_geoips + 1, sizeof(struct geoip)); if (geofeed->geoips == NULL) err(1, NULL); - geoip = &geofeed->geoips[geofeed->geoipsz++]; + geoip = &geofeed->geoips[geofeed->num_geoips++]; if ((geoip->ip = calloc(1, sizeof(struct cert_ip))) == NULL) err(1, NULL); @@ -253,7 +253,7 @@ geofeed_parse(X509 **x509, const char *fn, int talid, char *buf, size_t len) goto out; } - if (cert->asz > 0) { + if (cert->num_ases > 0) { warnx("%s: superfluous AS Resources extension present", fn); goto out; } @@ -288,7 +288,7 @@ geofeed_free(struct geofeed *p) if (p == NULL) return; - for (i = 0; i < p->geoipsz; i++) { + for (i = 0; i < p->num_geoips; i++) { free(p->geoips[i].ip); free(p->geoips[i].loc); } diff --git a/usr.sbin/rpki-client/http.c b/usr.sbin/rpki-client/http.c index bc4af4ba2..abc8c38ab 100644 --- a/usr.sbin/rpki-client/http.c +++ b/usr.sbin/rpki-client/http.c @@ -1,4 +1,4 @@ -/* $OpenBSD: http.c,v 1.87 2024/09/08 07:23:36 tb Exp $ */ +/* $OpenBSD: http.c,v 1.92 2024/11/21 13:32:27 claudio Exp $ */ /* * Copyright (c) 2020 Nils Fisher * Copyright (c) 2020 Claudio Jeker @@ -163,7 +163,7 @@ static struct http_conn_list idle = LIST_HEAD_INITIALIZER(idle); static struct http_req_queue queue = TAILQ_HEAD_INITIALIZER(queue); static unsigned int http_conn_count; -static struct msgbuf msgq; +static struct msgbuf *msgq; static struct sockaddr_storage http_bindaddr; static struct tls_config *tls_config; static uint8_t *tls_ca_mem; @@ -415,7 +415,7 @@ proxy_parse_uri(char *uri) if (strncasecmp(uri, HTTP_PROTO, HTTP_PROTO_LEN) != 0) errx(1, "%s: http_proxy not using http schema", http_info(uri)); - host = uri + 7; + host = uri + HTTP_PROTO_LEN; if ((fullhost = strndup(host, strcspn(host, "/"))) == NULL) err(1, NULL); @@ -483,7 +483,7 @@ http_parse_uri(char *uri, char **ohost, char **oport, char **opath) warnx("%s: not using https schema", http_info(uri)); return -1; } - host = uri + 8; + host = uri + HTTPS_PROTO_LEN; if ((path = strchr(host, '/')) == NULL) { warnx("%s: missing https path", http_info(uri)); return -1; @@ -625,7 +625,7 @@ http_req_done(unsigned int id, enum http_result res, const char *last_modified) io_simple_buffer(b, &id, sizeof(id)); io_simple_buffer(b, &res, sizeof(res)); io_str_buffer(b, last_modified); - io_close_buffer(&msgq, b); + io_close_buffer(msgq, b); } /* @@ -641,7 +641,7 @@ http_req_fail(unsigned int id) io_simple_buffer(b, &id, sizeof(id)); io_simple_buffer(b, &res, sizeof(res)); io_str_buffer(b, NULL); - io_close_buffer(&msgq, b); + io_close_buffer(msgq, b); } /* @@ -2044,7 +2044,7 @@ proc_http(char *bind_addr, int fd) struct pollfd pfds[NPFDS]; struct http_connection *conn, *nc; struct http_request *req, *nr; - struct ibuf *b, *inbuf = NULL; + struct ibuf *b; if (pledge("stdio rpath inet dns recvfd", NULL) == -1) err(1, "pledge"); @@ -2066,8 +2066,9 @@ proc_http(char *bind_addr, int fd) if (pledge("stdio inet dns recvfd", NULL) == -1) err(1, "pledge"); - msgbuf_init(&msgq); - msgq.fd = fd; + if ((msgq = msgbuf_new_reader(sizeof(size_t), io_parse_hdr, NULL)) == + NULL) + err(1, NULL); for (;;) { time_t now; @@ -2077,7 +2078,7 @@ proc_http(char *bind_addr, int fd) memset(&pfds, 0, sizeof(pfds)); pfds[0].fd = fd; pfds[0].events = POLLIN; - if (msgbuf_queuelen(&msgq) > 0) + if (msgbuf_queuelen(msgq) > 0) pfds[0].events |= POLLOUT; i = 1; @@ -2138,16 +2139,21 @@ proc_http(char *bind_addr, int fd) if (pfds[0].revents & POLLHUP) break; if (pfds[0].revents & POLLOUT) { - switch (msgbuf_write(&msgq)) { - case 0: - errx(1, "write: connection closed"); - case -1: - err(1, "write"); + if (msgbuf_write(fd, msgq) == -1) { + if (errno == EPIPE) + errx(1, "write: connection closed"); + else + err(1, "write"); } } if (pfds[0].revents & POLLIN) { - b = io_buf_recvfd(fd, &inbuf); - if (b != NULL) { + switch (msgbuf_read(fd, msgq)) { + case -1: + err(1, "msgbuf_read"); + case 0: + errx(1, "msgbuf_read: connection closed"); + } + while ((b = io_buf_get(msgq)) != NULL) { unsigned int id; char *uri; char *mod; diff --git a/usr.sbin/rpki-client/io.c b/usr.sbin/rpki-client/io.c index ecadce69f..8d97c5e27 100644 --- a/usr.sbin/rpki-client/io.c +++ b/usr.sbin/rpki-client/io.c @@ -1,4 +1,4 @@ -/* $OpenBSD: io.c,v 1.25 2024/08/28 09:39:17 tb Exp $ */ +/* $OpenBSD: io.c,v 1.27 2024/11/26 13:59:09 claudio Exp $ */ /* * Copyright (c) 2021 Claudio Jeker * Copyright (c) 2019 Kristaps Dzonsons @@ -30,6 +30,8 @@ #include "extern.h" +#define IO_FD_MARK 0x80000000U + /* * Create new io buffer, call io_close() when done with it. * Function always returns a new buffer. @@ -39,7 +41,7 @@ io_new_buffer(void) { struct ibuf *b; - if ((b = ibuf_dynamic(64, INT32_MAX)) == NULL) + if ((b = ibuf_dynamic(64, MAX_MSG_SIZE)) == NULL) err(1, NULL); ibuf_add_zero(b, sizeof(size_t)); /* can not fail */ return b; @@ -87,7 +89,9 @@ io_close_buffer(struct msgbuf *msgbuf, struct ibuf *b) { size_t len; - len = ibuf_size(b) - sizeof(len); + len = ibuf_size(b); + if (ibuf_fd_avail(b)) + len |= IO_FD_MARK; ibuf_set(b, 0, &len, sizeof(len)); ibuf_close(msgbuf, b); } @@ -144,164 +148,41 @@ io_read_buf_alloc(struct ibuf *b, void **res, size_t *sz) io_read_buf(b, *res, *sz); } -/* XXX copy from imsg-buffer.c */ -static int -ibuf_realloc(struct ibuf *buf, size_t len) +struct ibuf * +io_parse_hdr(struct ibuf *buf, void *arg, int *fd) { - unsigned char *b; + struct ibuf *b; + size_t len; + int hasfd = 0; - /* on static buffers max is eq size and so the following fails */ - if (len > SIZE_MAX - buf->wpos || buf->wpos + len > buf->max) { + if (ibuf_get(buf, &len, sizeof(len)) == -1) + return NULL; + + if (len & IO_FD_MARK) { + hasfd = 1; + len &= ~IO_FD_MARK; + } + if (len <= sizeof(len) || len > MAX_MSG_SIZE) { errno = ERANGE; - return (-1); + return NULL; } - - b = realloc(buf->buf, buf->wpos + len); - if (b == NULL) - return (-1); - memset(b + buf->size, 0, buf->wpos + len - buf->size); - buf->buf = b; - buf->size = buf->wpos + len; - - return (0); + if ((b = ibuf_open(len)) == NULL) + return NULL; + if (hasfd) { + ibuf_fd_set(b, *fd); + *fd = -1; + } + return b; } -/* - * Read once and fill a ibuf until it is finished. - * Returns NULL if more data is needed, returns a full ibuf once - * all data is received. - */ struct ibuf * -io_buf_read(int fd, struct ibuf **ib) +io_buf_get(struct msgbuf *msgq) { - struct ibuf *b = *ib; - ssize_t n; - size_t sz; + struct ibuf *b; - /* if ibuf == NULL allocate a new buffer */ - if (b == NULL) { - if ((b = ibuf_dynamic(sizeof(sz), INT32_MAX)) == NULL) - err(1, NULL); - *ib = b; - } + if ((b = msgbuf_get(msgq)) == NULL) + return NULL; - again: - /* read some data */ - while ((n = read(fd, b->buf + b->wpos, b->size - b->wpos)) == -1) { - if (errno == EINTR) - continue; - if (errno == EAGAIN) - return NULL; - err(1, "read"); - } - - if (n == 0) - errx(1, "read: unexpected end of file"); - b->wpos += n; - - /* got full message */ - if (b->wpos == b->size) { - /* only header received */ - if (b->wpos == sizeof(sz)) { - memcpy(&sz, b->buf, sizeof(sz)); - if (sz == 0 || sz > INT32_MAX) - errx(1, "bad internal framing, bad size"); - if (ibuf_realloc(b, sz) == -1) - err(1, "ibuf_realloc"); - goto again; - } - - /* skip over initial size header */ - b->rpos += sizeof(sz); - *ib = NULL; - return b; - } - - return NULL; -} - -/* - * Read data from socket but receive a file descriptor at the same time. - */ -struct ibuf * -io_buf_recvfd(int fd, struct ibuf **ib) -{ - struct ibuf *b = *ib; - struct iovec iov; - struct msghdr msg; - struct cmsghdr *cmsg; - union { - struct cmsghdr hdr; - char buf[CMSG_SPACE(sizeof(int))]; - } cmsgbuf; - ssize_t n; - size_t sz; - - /* fd are only passed on the head, just use regular read afterwards */ - if (b != NULL) - return io_buf_read(fd, ib); - - if ((b = ibuf_dynamic(sizeof(sz), INT32_MAX)) == NULL) - err(1, NULL); - *ib = b; - - memset(&msg, 0, sizeof(msg)); - memset(&cmsgbuf, 0, sizeof(cmsgbuf)); - - iov.iov_base = b->buf; - iov.iov_len = b->size; - - msg.msg_iov = &iov; - msg.msg_iovlen = 1; - msg.msg_control = &cmsgbuf.buf; - msg.msg_controllen = sizeof(cmsgbuf.buf); - - while ((n = recvmsg(fd, &msg, 0)) == -1) { - if (errno == EINTR) - continue; - err(1, "recvmsg"); - } - - if (n == 0) - errx(1, "recvmsg: unexpected end of file"); - - for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; - cmsg = CMSG_NXTHDR(&msg, cmsg)) { - if (cmsg->cmsg_level == SOL_SOCKET && - cmsg->cmsg_type == SCM_RIGHTS) { - int i, j, f; - - j = ((char *)cmsg + cmsg->cmsg_len - - (char *)CMSG_DATA(cmsg)) / sizeof(int); - for (i = 0; i < j; i++) { - f = ((int *)CMSG_DATA(cmsg))[i]; - if (i == 0) - ibuf_fd_set(b, f); - else - close(f); - } - } - } - - b->wpos += n; - - /* got full message */ - if (b->wpos == b->size) { - /* only header received */ - if (b->wpos == sizeof(sz)) { - memcpy(&sz, b->buf, sizeof(sz)); - if (sz == 0 || sz > INT32_MAX) - errx(1, "read: bad internal framing, %zu", sz); - if (ibuf_realloc(b, sz) == -1) - err(1, "ibuf_realloc"); - return NULL; - } - - /* skip over initial size header */ - b->rpos += sizeof(sz); - *ib = NULL; - return b; - } - - return NULL; + ibuf_skip(b, sizeof(size_t)); + return b; } diff --git a/usr.sbin/rpki-client/ip.c b/usr.sbin/rpki-client/ip.c index 3e021f08a..01bcd7c21 100644 --- a/usr.sbin/rpki-client/ip.c +++ b/usr.sbin/rpki-client/ip.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ip.c,v 1.33 2024/03/19 05:04:13 tb Exp $ */ +/* $OpenBSD: ip.c,v 1.34 2024/11/12 09:23:07 tb Exp $ */ /* * Copyright (c) 2019 Kristaps Dzonsons * @@ -78,11 +78,11 @@ ip_addr_afi_parse(const char *fn, const ASN1_OCTET_STRING *p, enum afi *afi) int ip_addr_check_covered(enum afi afi, const unsigned char *min, const unsigned char *max, - const struct cert_ip *ips, size_t ipsz) + const struct cert_ip *ips, size_t num_ips) { size_t i, sz = AFI_IPV4 == afi ? 4 : 16; - for (i = 0; i < ipsz; i++) { + for (i = 0; i < num_ips; i++) { if (ips[i].afi != afi) continue; if (ips[i].type == CERT_IP_INHERIT) @@ -103,7 +103,7 @@ ip_addr_check_covered(enum afi afi, */ int ip_addr_check_overlap(const struct cert_ip *ip, const char *fn, - const struct cert_ip *ips, size_t ipsz, int quiet) + const struct cert_ip *ips, size_t num_ips, int quiet) { size_t i, sz = ip->afi == AFI_IPV4 ? 4 : 16; int inherit_v4 = 0, inherit_v6 = 0; @@ -114,7 +114,7 @@ ip_addr_check_overlap(const struct cert_ip *ip, const char *fn, * going to need to do a lot of scanning for big allocations. */ - for (i = 0; i < ipsz; i++) + for (i = 0; i < num_ips; i++) if (ips[i].type == CERT_IP_INHERIT) { if (ips[i].afi == AFI_IPV4) inherit_v4 = 1; @@ -145,7 +145,7 @@ ip_addr_check_overlap(const struct cert_ip *ip, const char *fn, /* Check our ranges. */ - for (i = 0; i < ipsz; i++) { + for (i = 0; i < num_ips; i++) { if (ips[i].afi != ip->afi) continue; if (memcmp(ips[i].max, ip->min, sz) <= 0 || diff --git a/usr.sbin/rpki-client/main.c b/usr.sbin/rpki-client/main.c index be1d4ec8a..9d977dc34 100644 --- a/usr.sbin/rpki-client/main.c +++ b/usr.sbin/rpki-client/main.c @@ -1,4 +1,4 @@ -/* $OpenBSD: main.c,v 1.267 2024/09/27 12:52:58 tb Exp $ */ +/* $OpenBSD: main.c,v 1.278 2025/01/03 10:14:32 job Exp $ */ /* * Copyright (c) 2021 Claudio Jeker * Copyright (c) 2019 Kristaps Dzonsons @@ -60,13 +60,12 @@ volatile sig_atomic_t killme; void suicide(int sig); static struct filepath_tree fpt = RB_INITIALIZER(&fpt); -static struct msgbuf procq, rsyncq, httpq, rrdpq; +static struct msgbuf *procq, *rsyncq, *httpq, *rrdpq; static int cachefd, outdirfd; -const char *bird_tablename = "ROAS"; - int verbose; int noop; +int excludeas0 = 1; int excludeaspa; int filemode; int shortlistmode; @@ -182,7 +181,7 @@ entity_write_req(const struct entity *ent) io_str_buffer(b, ent->file); io_str_buffer(b, ent->mftaki); io_buf_buffer(b, ent->data, ent->datasz); - io_close_buffer(&procq, b); + io_close_buffer(procq, b); } static void @@ -208,7 +207,7 @@ entity_write_repo(const struct repo *rp) io_str_buffer(b, altpath); io_buf_buffer(b, NULL, 0); /* ent->mftaki */ io_buf_buffer(b, NULL, 0); /* ent->data */ - io_close_buffer(&procq, b); + io_close_buffer(procq, b); free(path); free(altpath); } @@ -279,7 +278,7 @@ rrdp_file_resp(unsigned int id, int ok) io_simple_buffer(b, &type, sizeof(type)); io_simple_buffer(b, &id, sizeof(id)); io_simple_buffer(b, &ok, sizeof(ok)); - io_close_buffer(&rrdpq, b); + io_close_buffer(rrdpq, b); } void @@ -296,7 +295,7 @@ rrdp_fetch(unsigned int id, const char *uri, const char *local, io_str_buffer(b, uri); rrdp_session_buffer(b, s); - io_close_buffer(&rrdpq, b); + io_close_buffer(rrdpq, b); } void @@ -308,7 +307,7 @@ rrdp_abort(unsigned int id) b = io_new_buffer(); io_simple_buffer(b, &type, sizeof(type)); io_simple_buffer(b, &id, sizeof(id)); - io_close_buffer(&rrdpq, b); + io_close_buffer(rrdpq, b); } /* @@ -325,7 +324,7 @@ rsync_fetch(unsigned int id, const char *uri, const char *local, io_str_buffer(b, local); io_str_buffer(b, base); io_str_buffer(b, uri); - io_close_buffer(&rsyncq, b); + io_close_buffer(rsyncq, b); } void @@ -338,7 +337,7 @@ rsync_abort(unsigned int id) io_str_buffer(b, NULL); io_str_buffer(b, NULL); io_str_buffer(b, NULL); - io_close_buffer(&rsyncq, b); + io_close_buffer(rsyncq, b); } /* @@ -355,7 +354,7 @@ http_fetch(unsigned int id, const char *uri, const char *last_mod, int fd) io_str_buffer(b, last_mod); /* pass file as fd */ ibuf_fd_set(b, fd); - io_close_buffer(&httpq, b); + io_close_buffer(httpq, b); } /* @@ -376,7 +375,7 @@ rrdp_http_fetch(unsigned int id, const char *uri, const char *last_mod) io_simple_buffer(b, &type, sizeof(type)); io_simple_buffer(b, &id, sizeof(id)); ibuf_fd_set(b, pi[0]); - io_close_buffer(&rrdpq, b); + io_close_buffer(rrdpq, b); http_fetch(id, uri, last_mod, pi[1]); } @@ -393,7 +392,7 @@ rrdp_http_done(unsigned int id, enum http_result res, const char *last_mod) io_simple_buffer(b, &id, sizeof(id)); io_simple_buffer(b, &res, sizeof(res)); io_str_buffer(b, last_mod); - io_close_buffer(&rrdpq, b); + io_close_buffer(rrdpq, b); } /* @@ -460,7 +459,7 @@ queue_add_from_tal(struct tal *tal) unsigned char *data; char *nfile; - assert(tal->urisz); + assert(tal->num_uris > 0); if ((taldescs[tal->id] = strdup(tal->descr)) == NULL) err(1, NULL); @@ -500,7 +499,7 @@ queue_add_from_cert(const struct cert *cert) if (strncmp(cert->repo, RSYNC_PROTO, RSYNC_PROTO_LEN) != 0) errx(1, "unexpected protocol"); - host = cert->repo + 8; + host = cert->repo + RSYNC_PROTO_LEN; LIST_FOREACH(le, &skiplist, entry) { if (strncasecmp(host, le->fqdn, strcspn(host, "/")) == 0) { @@ -639,6 +638,8 @@ entity_process(struct ibuf *b, struct stats *st, struct vrp_tree *tree, break; } mft = mft_read(b); + if (mft->seqnum_gap) + repo_stat_inc(rp, talid, type, STYPE_SEQNUM_GAP); queue_add_from_mft(mft); mft_free(mft); break; @@ -764,6 +765,7 @@ sum_stats(const struct repo *rp, const struct repotalstats *in, void *arg) out->mfts += in->mfts; out->mfts_fail += in->mfts_fail; + out->mfts_gap += in->mfts_gap; out->certs += in->certs; out->certs_fail += in->certs_fail; out->roas += in->roas; @@ -970,12 +972,12 @@ suicide(int sig __attribute__((unused))) int main(int argc, char *argv[]) { - int rc, c, i, st, proc, rsync, http, rrdp, hangup = 0; + int rc, c, i, st, hangup = 0; + int procfd, rsyncfd, httpfd, rrdpfd; pid_t pid, procpid, rsyncpid, httppid, rrdppid; struct pollfd pfd[NPFD]; struct msgbuf *queues[NPFD]; - struct ibuf *b, *httpbuf = NULL, *procbuf = NULL; - struct ibuf *rrdpbuf = NULL, *rsyncbuf = NULL; + struct ibuf *b; char *rsync_prog = "openrsync"; char *bind_addr = NULL; const char *cachedir = NULL, *outputdir = NULL; @@ -1011,8 +1013,12 @@ main(int argc, char *argv[]) "proc exec unveil", NULL) == -1) err(1, "pledge"); - while ((c = getopt(argc, argv, "Ab:Bcd:e:fH:jmnoP:Rs:S:t:T:vVx")) != -1) + while ((c = + getopt(argc, argv, "0Ab:Bcd:e:fH:jmnoP:Rs:S:t:vVx")) != -1) switch (c) { + case '0': + excludeas0 = 0; + break; case 'A': excludeaspa = 1; break; @@ -1077,9 +1083,6 @@ main(int argc, char *argv[]) err(1, "too many tal files specified"); tals[talsz++] = optarg; break; - case 'T': - bird_tablename = optarg; - break; case 'v': verbose++; break; @@ -1144,12 +1147,12 @@ main(int argc, char *argv[]) * manifests, certificates, etc.) and returning contents. */ - procpid = process_start("parser", &proc); + procpid = process_start("parser", &procfd); if (procpid == 0) { if (!filemode) - proc_parser(proc); + proc_parser(procfd); else - proc_filemode(proc); + proc_filemode(procfd); } /* Constraints are only needed in the filemode and parser processes. */ @@ -1163,13 +1166,13 @@ main(int argc, char *argv[]) */ if (!noop) { - rsyncpid = process_start("rsync", &rsync); + rsyncpid = process_start("rsync", &rsyncfd); if (rsyncpid == 0) { - close(proc); - proc_rsync(rsync_prog, bind_addr, rsync); + close(procfd); + proc_rsync(rsync_prog, bind_addr, rsyncfd); } } else { - rsync = -1; + rsyncfd = -1; rsyncpid = -1; } @@ -1180,15 +1183,15 @@ main(int argc, char *argv[]) */ if (!noop && rrdpon) { - httppid = process_start("http", &http); + httppid = process_start("http", &httpfd); if (httppid == 0) { - close(proc); - close(rsync); - proc_http(bind_addr, http); + close(procfd); + close(rsyncfd); + proc_http(bind_addr, httpfd); } } else { - http = -1; + httpfd = -1; httppid = -1; } @@ -1199,15 +1202,15 @@ main(int argc, char *argv[]) */ if (!noop && rrdpon) { - rrdppid = process_start("rrdp", &rrdp); + rrdppid = process_start("rrdp", &rrdpfd); if (rrdppid == 0) { - close(proc); - close(rsync); - close(http); - proc_rrdp(rrdp); + close(procfd); + close(rsyncfd); + close(httpfd); + proc_rrdp(rrdpfd); } } else { - rrdp = -1; + rrdpfd = -1; rrdppid = -1; } @@ -1227,14 +1230,18 @@ main(int argc, char *argv[]) if (pledge("stdio rpath wpath cpath fattr sendfd unveil", NULL) == -1) err(1, "pledge"); - msgbuf_init(&procq); - msgbuf_init(&rsyncq); - msgbuf_init(&httpq); - msgbuf_init(&rrdpq); - procq.fd = proc; - rsyncq.fd = rsync; - httpq.fd = http; - rrdpq.fd = rrdp; + if ((procq = msgbuf_new_reader(sizeof(size_t), io_parse_hdr, NULL)) == + NULL) + err(1, NULL); + if ((rsyncq = msgbuf_new_reader(sizeof(size_t), io_parse_hdr, NULL)) == + NULL) + err(1, NULL); + if ((httpq = msgbuf_new_reader(sizeof(size_t), io_parse_hdr, NULL)) == + NULL) + err(1, NULL); + if ((rrdpq = msgbuf_new_reader(sizeof(size_t), io_parse_hdr, NULL)) == + NULL) + err(1, NULL); /* * The main process drives the top-down scan to leaf ROAs using @@ -1242,14 +1249,14 @@ main(int argc, char *argv[]) * parsing process. */ - pfd[0].fd = proc; - queues[0] = &procq; - pfd[1].fd = rsync; - queues[1] = &rsyncq; - pfd[2].fd = http; - queues[2] = &httpq; - pfd[3].fd = rrdp; - queues[3] = &rrdpq; + pfd[0].fd = procfd; + queues[0] = procq; + pfd[1].fd = rsyncfd; + queues[1] = rsyncq; + pfd[2].fd = httpfd; + queues[2] = httpq; + pfd[3].fd = rrdpfd; + queues[3] = rrdpq; load_skiplist(skiplistfile); @@ -1306,16 +1313,13 @@ main(int argc, char *argv[]) if (pfd[i].revents & POLLHUP) hangup = 1; if (pfd[i].revents & POLLOUT) { - switch (msgbuf_write(queues[i])) { - case 0: - warnx("write[%d]: " - "connection closed", i); + if (msgbuf_write(pfd[i].fd, queues[i]) == -1) { + if (errno == EPIPE) + warnx("write[%d]: " + "connection closed", i); + else + warn("write[%d]", i); hangup = 1; - break; - case -1: - warn("write[%d]", i); - hangup = 1; - break; } } } @@ -1330,8 +1334,13 @@ main(int argc, char *argv[]) */ if ((pfd[1].revents & POLLIN)) { - b = io_buf_read(rsync, &rsyncbuf); - if (b != NULL) { + switch (ibuf_read(pfd[1].fd, queues[1])) { + case -1: + err(1, "ibuf_read"); + case 0: + errx(1, "ibuf_read: connection closed"); + } + while ((b = io_buf_get(queues[1])) != NULL) { unsigned int id; int ok; @@ -1343,8 +1352,13 @@ main(int argc, char *argv[]) } if ((pfd[2].revents & POLLIN)) { - b = io_buf_read(http, &httpbuf); - if (b != NULL) { + switch (ibuf_read(pfd[2].fd, queues[2])) { + case -1: + err(1, "ibuf_read"); + case 0: + errx(1, "ibuf_read: connection closed"); + } + while ((b = io_buf_get(queues[2])) != NULL) { unsigned int id; enum http_result res; char *last_mod; @@ -1362,8 +1376,14 @@ main(int argc, char *argv[]) * Handle RRDP requests here. */ if ((pfd[3].revents & POLLIN)) { - b = io_buf_read(rrdp, &rrdpbuf); - if (b != NULL) { + switch (ibuf_read(pfd[3].fd, queues[3])) { + case -1: + abort(); + err(1, "ibuf_read"); + case 0: + errx(1, "ibuf_read: connection closed"); + } + while ((b = io_buf_get(queues[3])) != NULL) { rrdp_process(b); ibuf_free(b); } @@ -1375,8 +1395,13 @@ main(int argc, char *argv[]) */ if ((pfd[0].revents & POLLIN)) { - b = io_buf_read(proc, &procbuf); - if (b != NULL) { + switch (ibuf_read(pfd[0].fd, queues[0])) { + case -1: + err(1, "ibuf_read"); + case 0: + errx(1, "ibuf_read: connection closed"); + } + while ((b = io_buf_get(queues[0])) != NULL) { entity_process(b, &stats, &vrps, &brks, &vaps, &vsps); ibuf_free(b); @@ -1397,10 +1422,10 @@ main(int argc, char *argv[]) * This will cause them to exit, then we reap them. */ - close(proc); - close(rsync); - close(http); - close(rrdp); + close(procfd); + close(rsyncfd); + close(httpfd); + close(rrdpfd); rc = 0; for (;;) { @@ -1499,8 +1524,9 @@ main(int argc, char *argv[]) stats.repo_tal_stats.certs, stats.repo_tal_stats.certs_fail); printf("Trust Anchor Locators: %u (%u invalid)\n", stats.tals, talsz - stats.tals); - printf("Manifests: %u (%u failed parse)\n", - stats.repo_tal_stats.mfts, stats.repo_tal_stats.mfts_fail); + printf("Manifests: %u (%u failed parse, %u seqnum gaps)\n", + stats.repo_tal_stats.mfts, stats.repo_tal_stats.mfts_fail, + stats.repo_tal_stats.mfts_gap); printf("Certificate revocation lists: %u\n", stats.repo_tal_stats.crls); printf("Ghostbuster records: %u\n", stats.repo_tal_stats.gbrs); printf("Trust Anchor Keys: %u\n", stats.repo_tal_stats.taks); @@ -1526,11 +1552,11 @@ main(int argc, char *argv[]) usage: fprintf(stderr, - "usage: rpki-client [-ABcjmnoRVvx] [-b sourceaddr] [-d cachedir]" + "usage: rpki-client [-0ABcjmnoRVvx] [-b sourceaddr] [-d cachedir]" " [-e rsync_prog]\n" " [-H fqdn] [-P epoch] [-S skiplist] [-s timeout]" - " [-T table]\n" - " [-t tal] [outputdir]\n" + " [-t tal]\n" + " [outputdir]\n" " rpki-client [-Vv] [-d cachedir] [-j] [-t tal] -f file ..." "\n"); return 1; diff --git a/usr.sbin/rpki-client/mft.c b/usr.sbin/rpki-client/mft.c index e981e04b7..cd2d9e0d1 100644 --- a/usr.sbin/rpki-client/mft.c +++ b/usr.sbin/rpki-client/mft.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mft.c,v 1.119 2024/09/12 10:33:25 tb Exp $ */ +/* $OpenBSD: mft.c,v 1.121 2024/12/24 10:03:59 tb Exp $ */ /* * Copyright (c) 2022 Theo Buehler * Copyright (c) 2019 Kristaps Dzonsons @@ -35,6 +35,7 @@ #include "extern.h" extern ASN1_OBJECT *mft_oid; +BN_CTX *bn_ctx; /* * Types and templates for the Manifest eContent, RFC 6486, section 4.2. @@ -372,6 +373,10 @@ mft_parse_econtent(const char *fn, struct mft *mft, const unsigned char *d, goto out; } + if (sk_FileAndHash_num(mft_asn1->fileList) <= 0) { + warnx("%s: no files in manifest fileList", fn); + goto out; + } if (sk_FileAndHash_num(mft_asn1->fileList) >= MAX_MANIFEST_ENTRIES) { warnx("%s: %d exceeds manifest entry limit (%d)", fn, sk_FileAndHash_num(mft_asn1->fileList), @@ -538,6 +543,7 @@ mft_buffer(struct ibuf *b, const struct mft *p) io_simple_buffer(b, &p->repoid, sizeof(p->repoid)); io_simple_buffer(b, &p->talid, sizeof(p->talid)); io_simple_buffer(b, &p->certid, sizeof(p->certid)); + io_simple_buffer(b, &p->seqnum_gap, sizeof(p->seqnum_gap)); io_str_buffer(b, p->path); io_str_buffer(b, p->aia); @@ -571,6 +577,7 @@ mft_read(struct ibuf *b) io_read_buf(b, &p->repoid, sizeof(p->repoid)); io_read_buf(b, &p->talid, sizeof(p->talid)); io_read_buf(b, &p->certid, sizeof(p->certid)); + io_read_buf(b, &p->seqnum_gap, sizeof(p->seqnum_gap)); io_read_str(b, &p->path); io_read_str(b, &p->aia); @@ -628,3 +635,35 @@ mft_compare_seqnum(const struct mft *a, const struct mft *b) return 0; } + +/* + * Test if there is a gap in the sequence numbers of two MFTs. + * Return 1 if a gap is detected. + */ +int +mft_seqnum_gap_present(const struct mft *a, const struct mft *b) +{ + BIGNUM *diff, *seqnum_a, *seqnum_b; + int ret = 0; + + BN_CTX_start(bn_ctx); + if ((diff = BN_CTX_get(bn_ctx)) == NULL || + (seqnum_a = BN_CTX_get(bn_ctx)) == NULL || + (seqnum_b = BN_CTX_get(bn_ctx)) == NULL) + errx(1, "BN_CTX_get"); + + if (!BN_hex2bn(&seqnum_a, a->seqnum)) + errx(1, "BN_hex2bn"); + + if (!BN_hex2bn(&seqnum_b, b->seqnum)) + errx(1, "BN_hex2bn"); + + if (!BN_sub(diff, seqnum_a, seqnum_b)) + errx(1, "BN_sub"); + + ret = !BN_is_one(diff); + + BN_CTX_end(bn_ctx); + + return ret; +} diff --git a/usr.sbin/rpki-client/output-bgpd.c b/usr.sbin/rpki-client/output-bgpd.c index fc6af38a4..cb8da58cd 100644 --- a/usr.sbin/rpki-client/output-bgpd.c +++ b/usr.sbin/rpki-client/output-bgpd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: output-bgpd.c,v 1.31 2024/04/08 14:02:13 tb Exp $ */ +/* $OpenBSD: output-bgpd.c,v 1.32 2024/11/13 12:51:04 tb Exp $ */ /* * Copyright (c) 2019 Kristaps Dzonsons * @@ -64,10 +64,10 @@ output_bgpd(FILE *out, struct vrp_tree *vrps, struct brk_tree *brks, "provider-as { ", vap->custasid, (long long)vap->expires) < 0) return -1; - for (i = 0; i < vap->providersz; i++) { + for (i = 0; i < vap->num_providers; i++) { if (fprintf(out, "%u", vap->providers[i]) < 0) return -1; - if (i + 1 < vap->providersz) + if (i + 1 < vap->num_providers) if (fprintf(out, ", ") < 0) return -1; } diff --git a/usr.sbin/rpki-client/output-bird.c b/usr.sbin/rpki-client/output-bird.c index fca660507..a73f655b5 100644 --- a/usr.sbin/rpki-client/output-bird.c +++ b/usr.sbin/rpki-client/output-bird.c @@ -1,4 +1,4 @@ -/* $OpenBSD: output-bird.c,v 1.19 2024/02/22 12:49:42 job Exp $ */ +/* $OpenBSD: output-bird.c,v 1.22 2025/01/03 10:32:21 job Exp $ */ /* * Copyright (c) 2019 Claudio Jeker * Copyright (c) 2020 Robert Scheck @@ -21,79 +21,31 @@ #include "extern.h" int -output_bird1v4(FILE *out, struct vrp_tree *vrps, struct brk_tree *brks, +output_bird(FILE *out, struct vrp_tree *vrps, struct brk_tree *brks, struct vap_tree *vaps, struct vsp_tree *vsps, struct stats *st) { - extern const char *bird_tablename; - struct vrp *v; - - if (outputheader(out, st) < 0) - return -1; - - if (fprintf(out, "\nroa table %s {\n", bird_tablename) < 0) - return -1; - - RB_FOREACH(v, vrp_tree, vrps) { - char buf[64]; - - if (v->afi == AFI_IPV4) { - ip_addr_print(&v->addr, v->afi, buf, sizeof(buf)); - if (fprintf(out, "\troa %s max %u as %u;\n", buf, - v->maxlength, v->asid) < 0) - return -1; - } - } - - if (fprintf(out, "}\n") < 0) - return -1; - return 0; -} - -int -output_bird1v6(FILE *out, struct vrp_tree *vrps, struct brk_tree *brks, - struct vap_tree *vaps, struct vsp_tree *vsps, struct stats *st) -{ - extern const char *bird_tablename; - struct vrp *v; - - if (outputheader(out, st) < 0) - return -1; - - if (fprintf(out, "\nroa table %s {\n", bird_tablename) < 0) - return -1; - - RB_FOREACH(v, vrp_tree, vrps) { - char buf[64]; - - if (v->afi == AFI_IPV6) { - ip_addr_print(&v->addr, v->afi, buf, sizeof(buf)); - if (fprintf(out, "\troa %s max %u as %u;\n", buf, - v->maxlength, v->asid) < 0) - return -1; - } - } - - if (fprintf(out, "}\n") < 0) - return -1; - return 0; -} - -int -output_bird2(FILE *out, struct vrp_tree *vrps, struct brk_tree *brks, - struct vap_tree *vaps, struct vsp_tree *vsps, struct stats *st) -{ - extern const char *bird_tablename; struct vrp *v; + struct vap *vap; time_t now = get_current_time(); + size_t i; + + if (fprintf(out, "# For BIRD %s\n#\n", excludeaspa ? "2" : "2.16+") < 0) + return -1; if (outputheader(out, st) < 0) return -1; if (fprintf(out, "\ndefine force_roa_table_update = %lld;\n\n" - "roa4 table %s4;\nroa6 table %s6;\n\n" - "protocol static {\n\troa4 { table %s4; };\n\n", - (long long)now, bird_tablename, bird_tablename, - bird_tablename) < 0) + "roa4 table ROAS4;\nroa6 table ROAS6;\n", (long long)now) < 0) + return -1; + + if (!excludeaspa) { + if (fprintf(out, "aspa table ASPAS;\n") < 0) + return -1; + } + + if (fprintf(out, "\nprotocol static {\n" + "\troa4 { table ROAS4; };\n\n") < 0) return -1; RB_FOREACH(v, vrp_tree, vrps) { @@ -107,8 +59,8 @@ output_bird2(FILE *out, struct vrp_tree *vrps, struct brk_tree *brks, } } - if (fprintf(out, "}\n\nprotocol static {\n\troa6 { table %s6; };\n\n", - bird_tablename) < 0) + if (fprintf(out, "}\n\nprotocol static {\n" + "\troa6 { table ROAS6; };\n\n") < 0) return -1; RB_FOREACH(v, vrp_tree, vrps) { @@ -122,7 +74,35 @@ output_bird2(FILE *out, struct vrp_tree *vrps, struct brk_tree *brks, } } + if (fprintf(out, "}") < 0) + return -1; + + if (excludeaspa) + return 0; + + if (fprintf(out, "\n\nprotocol static {\n\taspa { table ASPAS; " + "};\n\n") < 0) + return -1; + + RB_FOREACH(vap, vap_tree, vaps) { + if (vap->overflowed) + continue; + if (fprintf(out, "\troute aspa %d providers ", + vap->custasid) < 0) + return -1; + for (i = 0; i < vap->num_providers; i++) { + if (fprintf(out, "%u", vap->providers[i]) < 0) + return -1; + if (i + 1 < vap->num_providers) + if (fprintf(out, ", ") < 0) + return -1; + } + if (fprintf(out, ";\n") < 0) + return -1; + } + if (fprintf(out, "}\n") < 0) return -1; + return 0; } diff --git a/usr.sbin/rpki-client/output-json.c b/usr.sbin/rpki-client/output-json.c index d69d95f4c..8c902a0f2 100644 --- a/usr.sbin/rpki-client/output-json.c +++ b/usr.sbin/rpki-client/output-json.c @@ -1,4 +1,4 @@ -/* $OpenBSD: output-json.c,v 1.50 2024/09/03 15:04:48 job Exp $ */ +/* $OpenBSD: output-json.c,v 1.51 2024/11/13 12:51:04 tb Exp $ */ /* * Copyright (c) 2019 Claudio Jeker * @@ -101,7 +101,7 @@ print_vap(struct vap *v) json_do_int("expires", v->expires); json_do_array("providers"); - for (i = 0; i < v->providersz; i++) + for (i = 0; i < v->num_providers; i++) json_do_int("provider", v->providers[i]); json_do_end(); @@ -130,7 +130,7 @@ output_spl(struct vsp_tree *vsps) json_do_object("vsp", 1); json_do_int("origin_as", vsp->asid); json_do_array("prefixes"); - for (i = 0; i < vsp->prefixesz; i++) { + for (i = 0; i < vsp->num_prefixes; i++) { ip_addr_print(&vsp->prefixes[i].prefix, vsp->prefixes[i].afi, buf, sizeof(buf)); json_do_string("prefix", buf); diff --git a/usr.sbin/rpki-client/output-ometric.c b/usr.sbin/rpki-client/output-ometric.c index 8eb673689..f4a685bef 100644 --- a/usr.sbin/rpki-client/output-ometric.c +++ b/usr.sbin/rpki-client/output-ometric.c @@ -1,4 +1,4 @@ -/* $OpenBSD: output-ometric.c,v 1.11 2024/09/03 15:04:48 job Exp $ */ +/* $OpenBSD: output-ometric.c,v 1.12 2024/11/02 12:30:28 job Exp $ */ /* * Copyright (c) 2022 Claudio Jeker * @@ -47,6 +47,8 @@ set_common_stats(const struct repotalstats *in, struct ometric *metric, OKV("type", "state"), OKV("manifest", "valid"), ol); ometric_set_int_with_labels(metric, in->mfts_fail, OKV("type", "state"), OKV("manifest", "failed parse"), ol); + ometric_set_int_with_labels(metric, in->mfts_gap, + OKV("type", "state"), OKV("manifest", "sequence gap"), ol); ometric_set_int_with_labels(metric, in->roas, OKV("type", "state"), OKV("roa", "valid"), ol); diff --git a/usr.sbin/rpki-client/output.c b/usr.sbin/rpki-client/output.c index e4725d66a..cd0748da5 100644 --- a/usr.sbin/rpki-client/output.c +++ b/usr.sbin/rpki-client/output.c @@ -1,4 +1,4 @@ -/* $OpenBSD: output.c,v 1.33 2024/02/22 12:49:42 job Exp $ */ +/* $OpenBSD: output.c,v 1.38 2025/01/03 10:14:32 job Exp $ */ /* * Copyright (c) 2019 Theo de Raadt * @@ -67,9 +67,7 @@ static const struct outputs { struct vap_tree *, struct vsp_tree *, struct stats *); } outputs[] = { { FORMAT_OPENBGPD, "openbgpd", output_bgpd }, - { FORMAT_BIRD, "bird1v4", output_bird1v4 }, - { FORMAT_BIRD, "bird1v6", output_bird1v6 }, - { FORMAT_BIRD, "bird", output_bird2 }, + { FORMAT_BIRD, "bird", output_bird }, { FORMAT_CSV, "csv", output_csv }, { FORMAT_JSON, "json", output_json }, { FORMAT_OMETRIC, "metrics", output_ometric }, @@ -82,6 +80,48 @@ static int output_finish(FILE *); static void sig_handler(int); static void set_signal_handler(void); +/* + * Detect & reject so-called "AS0 TALs". + * AS0 TALs are TALs where for each and every subordinate ROA the asID field + * set to 0. Such TALs introduce operational risk, as they change the fail-safe + * from 'fail-open' to 'fail-closed'. Some context: + * https://lists.afrinic.net/pipermail/rpd/2021/013312.html + * https://lists.afrinic.net/pipermail/rpd/2021/013314.html + */ +static void +prune_as0_tals(struct vrp_tree *vrps) +{ + struct vrp *v, *tv; + int talid; + int has_vrps[TALSZ_MAX] = { 0 }; + int is_as0_tal[TALSZ_MAX] = { 0 }; + + for (talid = 0; talid < talsz; talid++) + is_as0_tal[talid] = 1; + + RB_FOREACH(v, vrp_tree, vrps) { + has_vrps[v->talid] = 1; + if (v->asid != 0) + is_as0_tal[v->talid] = 0; + } + + for (talid = 0; talid < talsz; talid++) { + if (is_as0_tal[talid] && has_vrps[talid]) { + warnx("%s: Detected AS0 TAL, pruning associated VRPs", + taldescs[talid]); + } + } + + RB_FOREACH_SAFE(v, vrp_tree, vrps, tv) { + if (is_as0_tal[v->talid]) { + RB_REMOVE(vrp_tree, vrps, v); + free(v); + } + } + + /* XXX: update talstats? */ +} + int outputfiles(struct vrp_tree *v, struct brk_tree *b, struct vap_tree *a, struct vsp_tree *p, struct stats *st) @@ -91,6 +131,9 @@ outputfiles(struct vrp_tree *v, struct brk_tree *b, struct vap_tree *a, atexit(output_cleantmp); set_signal_handler(); + if (excludeas0) + prune_as0_tals(v); + for (i = 0; outputs[i].name; i++) { FILE *fout; diff --git a/usr.sbin/rpki-client/parser.c b/usr.sbin/rpki-client/parser.c index ff95838c8..f704b122d 100644 --- a/usr.sbin/rpki-client/parser.c +++ b/usr.sbin/rpki-client/parser.c @@ -1,4 +1,4 @@ -/* $OpenBSD: parser.c,v 1.143 2024/08/29 13:46:28 tb Exp $ */ +/* $OpenBSD: parser.c,v 1.148 2024/11/21 13:32:27 claudio Exp $ */ /* * Copyright (c) 2019 Claudio Jeker * Copyright (c) 2019 Kristaps Dzonsons @@ -40,6 +40,8 @@ extern int certid; +extern BN_CTX *bn_ctx; + static X509_STORE_CTX *ctx; static struct auth_tree auths = RB_INITIALIZER(&auths); static struct crl_tree crlt = RB_INITIALIZER(&crlt); @@ -453,6 +455,14 @@ proc_parser_mft_pre(struct entity *entp, char *file, struct crl **crl, goto err; } + if (seqnum_cmp > 0) { + if (mft_seqnum_gap_present(mft, cached_mft)) { + mft->seqnum_gap = 1; + warnx("%s: seqnum gap detected #%s -> #%s", file, + cached_mft->seqnum, mft->seqnum); + } + } + return mft; err: @@ -1036,7 +1046,7 @@ void proc_parser(int fd) { struct entityq q; - struct msgbuf msgq; + struct msgbuf *msgq; struct pollfd pfd; struct entity *entp; struct ibuf *b, *inbuf = NULL; @@ -1055,17 +1065,20 @@ proc_parser(int fd) if ((ctx = X509_STORE_CTX_new()) == NULL) err(1, "X509_STORE_CTX_new"); + if ((bn_ctx = BN_CTX_new()) == NULL) + err(1, "BN_CTX_new"); TAILQ_INIT(&q); - msgbuf_init(&msgq); - msgq.fd = fd; + if ((msgq = msgbuf_new_reader(sizeof(size_t), io_parse_hdr, NULL)) == + NULL) + err(1, NULL); pfd.fd = fd; for (;;) { pfd.events = POLLIN; - if (msgbuf_queuelen(&msgq) > 0) + if (msgbuf_queuelen(msgq) > 0) pfd.events |= POLLOUT; if (poll(&pfd, 1, INFTIM) == -1) { @@ -1082,8 +1095,13 @@ proc_parser(int fd) break; if ((pfd.revents & POLLIN)) { - b = io_buf_read(fd, &inbuf); - if (b != NULL) { + switch (ibuf_read(fd, msgq)) { + case -1: + err(1, "ibuf_read"); + case 0: + errx(1, "ibuf_read: connection closed"); + } + while ((b = io_buf_get(msgq)) != NULL) { entp = calloc(1, sizeof(struct entity)); if (entp == NULL) err(1, NULL); @@ -1094,15 +1112,15 @@ proc_parser(int fd) } if (pfd.revents & POLLOUT) { - switch (msgbuf_write(&msgq)) { - case 0: - errx(1, "write: connection closed"); - case -1: - err(1, "write"); + if (msgbuf_write(fd, msgq) == -1) { + if (errno == EPIPE) + errx(1, "write: connection closed"); + else + err(1, "write"); } } - parse_entity(&q, &msgq); + parse_entity(&q, msgq); } while ((entp = TAILQ_FIRST(&q)) != NULL) { @@ -1114,8 +1132,9 @@ proc_parser(int fd) crl_tree_free(&crlt); X509_STORE_CTX_free(ctx); - msgbuf_clear(&msgq); + BN_CTX_free(bn_ctx); + msgbuf_free(msgq); ibuf_free(inbuf); if (certid > CERTID_MAX) diff --git a/usr.sbin/rpki-client/print.c b/usr.sbin/rpki-client/print.c index d69dad299..830edf646 100644 --- a/usr.sbin/rpki-client/print.c +++ b/usr.sbin/rpki-client/print.c @@ -1,4 +1,4 @@ -/* $OpenBSD: print.c,v 1.56 2024/09/12 10:33:25 tb Exp $ */ +/* $OpenBSD: print.c,v 1.58 2024/11/13 12:51:04 tb Exp $ */ /* * Copyright (c) 2021 Claudio Jeker * Copyright (c) 2019 Kristaps Dzonsons @@ -118,14 +118,14 @@ tal_print(const struct tal *p) json_do_string("name", p->descr); json_do_string("ski", pretty_key_id(ski)); json_do_array("trust_anchor_locations"); - for (i = 0; i < p->urisz; i++) + for (i = 0; i < p->num_uris; i++) json_do_string("tal", p->uri[i]); json_do_end(); } else { printf("Trust anchor name: %s\n", p->descr); printf("Subject key identifier: %s\n", pretty_key_id(ski)); printf("Trust anchor locations: "); - for (i = 0; i < p->urisz; i++) { + for (i = 0; i < p->num_uris; i++) { if (i > 0) printf("%26s", ""); printf("%s\n", p->uri[i]); @@ -177,21 +177,21 @@ x509_print(const X509 *x) } static void -as_resources_print(struct cert_as *as, size_t asz) +as_resources_print(struct cert_as *ases, size_t num_ases) { size_t i; - for (i = 0; i < asz; i++) { + for (i = 0; i < num_ases; i++) { if (outformats & FORMAT_JSON) json_do_object("resource", 1); - switch (as[i].type) { + switch (ases[i].type) { case CERT_AS_ID: if (outformats & FORMAT_JSON) { - json_do_uint("asid", as[i].id); + json_do_uint("asid", ases[i].id); } else { if (i > 0) printf("%26s", ""); - printf("AS: %u", as[i].id); + printf("AS: %u", ases[i].id); } break; case CERT_AS_INHERIT: @@ -206,14 +206,14 @@ as_resources_print(struct cert_as *as, size_t asz) case CERT_AS_RANGE: if (outformats & FORMAT_JSON) { json_do_object("asrange", 1); - json_do_uint("min", as[i].range.min); - json_do_uint("max", as[i].range.max); + json_do_uint("min", ases[i].range.min); + json_do_uint("max", ases[i].range.max); json_do_end(); } else { if (i > 0) printf("%26s", ""); - printf("AS: %u -- %u", as[i].range.min, - as[i].range.max); + printf("AS: %u -- %u", ases[i].range.min, + ases[i].range.max); } break; } @@ -225,13 +225,13 @@ as_resources_print(struct cert_as *as, size_t asz) } static void -ip_resources_print(struct cert_ip *ips, size_t ipsz, size_t asz) +ip_resources_print(struct cert_ip *ips, size_t num_ips, size_t num_ases) { char buf1[64], buf2[64]; size_t i; int sockt; - for (i = 0; i < ipsz; i++) { + for (i = 0; i < num_ips; i++) { if (outformats & FORMAT_JSON) json_do_object("resource", 1); switch (ips[i].type) { @@ -239,7 +239,7 @@ ip_resources_print(struct cert_ip *ips, size_t ipsz, size_t asz) if (outformats & FORMAT_JSON) { json_do_bool("ip_inherit", 1); } else { - if (i > 0 || asz > 0) + if (i > 0 || num_ases > 0) printf("%26s", ""); printf("IP: inherit"); } @@ -250,7 +250,7 @@ ip_resources_print(struct cert_ip *ips, size_t ipsz, size_t asz) if (outformats & FORMAT_JSON) { json_do_string("ip_prefix", buf1); } else { - if (i > 0 || asz > 0) + if (i > 0 || num_ases > 0) printf("%26s", ""); printf("IP: %s", buf1); } @@ -266,7 +266,7 @@ ip_resources_print(struct cert_ip *ips, size_t ipsz, size_t asz) json_do_string("max", buf2); json_do_end(); } else { - if (i > 0 || asz > 0) + if (i > 0 || num_ases > 0) printf("%26s", ""); printf("IP: %s -- %s", buf1, buf2); } @@ -336,8 +336,8 @@ cert_print(const struct cert *p) printf("Subordinate resources: "); } - as_resources_print(p->as, p->asz); - ip_resources_print(p->ips, p->ipsz, p->asz); + as_resources_print(p->ases, p->num_ases); + ip_resources_print(p->ips, p->num_ips, p->num_ases); if (outformats & FORMAT_JSON) json_do_end(); @@ -543,9 +543,8 @@ roa_print(const X509 *x, const struct roa *p) if (outformats & FORMAT_JSON) json_do_array("vrps"); - for (i = 0; i < p->ipsz; i++) { - ip_addr_print(&p->ips[i].addr, - p->ips[i].afi, buf, sizeof(buf)); + for (i = 0; i < p->num_ips; i++) { + ip_addr_print(&p->ips[i].addr, p->ips[i].afi, buf, sizeof(buf)); if (outformats & FORMAT_JSON) { json_do_object("vrp", 1); @@ -601,8 +600,8 @@ spl_print(const X509 *x, const struct spl *s) if (outformats & FORMAT_JSON) json_do_array("prefixes"); - for (i = 0; i < s->pfxsz; i++) { - ip_addr_print(&s->pfxs[i].prefix, s->pfxs[i].afi, buf, + for (i = 0; i < s->num_prefixes; i++) { + ip_addr_print(&s->prefixes[i].prefix, s->prefixes[i].afi, buf, sizeof(buf)); if (outformats & FORMAT_JSON) { @@ -683,8 +682,8 @@ rsc_print(const X509 *x, const struct rsc *p) printf("Signed with resources: "); } - as_resources_print(p->as, p->asz); - ip_resources_print(p->ips, p->ipsz, p->asz); + as_resources_print(p->ases, p->num_ases); + ip_resources_print(p->ips, p->num_ips, p->num_ases); if (outformats & FORMAT_JSON) { json_do_end(); @@ -692,7 +691,7 @@ rsc_print(const X509 *x, const struct rsc *p) } else printf("Filenames and hashes: "); - for (i = 0; i < p->filesz; i++) { + for (i = 0; i < p->num_files; i++) { if (base64_encode(p->files[i].hash, sizeof(p->files[i].hash), &hash) == -1) errx(1, "base64_encode failure"); @@ -755,7 +754,7 @@ aspa_print(const X509 *x, const struct aspa *p) printf("Providers: "); } - for (i = 0; i < p->providersz; i++) { + for (i = 0; i < p->num_providers; i++) { if (outformats & FORMAT_JSON) json_do_uint("asid", p->providers[i]); else { @@ -782,11 +781,11 @@ takey_print(char *name, const struct takey *t) json_do_object("takey", 0); json_do_string("name", name); json_do_array("comments"); - for (i = 0; i < t->commentsz; i++) + for (i = 0; i < t->num_comments; i++) json_do_string("comment", t->comments[i]); json_do_end(); json_do_array("uris"); - for (i = 0; i < t->urisz; i++) + for (i = 0; i < t->num_uris; i++) json_do_string("uri", t->uris[i]); json_do_end(); json_do_string("spki", spki); @@ -794,11 +793,11 @@ takey_print(char *name, const struct takey *t) } else { printf("TAL derived from the '%s' Trust Anchor Key:\n\n", name); - for (i = 0; i < t->commentsz; i++) + for (i = 0; i < t->num_comments; i++) printf("\t# %s\n", t->comments[i]); - if (t->commentsz > 0) + if (t->num_comments > 0) printf("\n"); - for (i = 0; i < t->urisz; i++) + for (i = 0; i < t->num_uris; i++) printf("\t%s\n", t->uris[i]); printf("\n\t"); for (i = 0; i < strlen(spki); i++) { @@ -886,7 +885,7 @@ geofeed_print(const X509 *x, const struct geofeed *p) printf("Geofeed CSV records: "); } - for (i = 0; i < p->geoipsz; i++) { + for (i = 0; i < p->num_geoips; i++) { if (p->geoips[i].ip->type != CERT_IP_ADDR) continue; diff --git a/usr.sbin/rpki-client/repo.c b/usr.sbin/rpki-client/repo.c index a50634ced..a88ab01b1 100644 --- a/usr.sbin/rpki-client/repo.c +++ b/usr.sbin/rpki-client/repo.c @@ -1,4 +1,4 @@ -/* $OpenBSD: repo.c,v 1.68 2024/09/27 12:55:03 tb Exp $ */ +/* $OpenBSD: repo.c,v 1.71 2024/12/19 13:23:38 job Exp $ */ /* * Copyright (c) 2021 Claudio Jeker * Copyright (c) 2019 Kristaps Dzonsons @@ -80,7 +80,7 @@ struct tarepo { char *descr; char *basedir; char **uri; - size_t urisz; + size_t num_uris; size_t uriidx; unsigned int id; enum repo_state state; @@ -356,14 +356,14 @@ static void ta_fetch(struct tarepo *tr) { if (!rrdpon) { - for (; tr->uriidx < tr->urisz; tr->uriidx++) { + for (; tr->uriidx < tr->num_uris; tr->uriidx++) { if (strncasecmp(tr->uri[tr->uriidx], RSYNC_PROTO, RSYNC_PROTO_LEN) == 0) break; } } - if (tr->uriidx >= tr->urisz) { + if (tr->uriidx >= tr->num_uris) { tr->state = REPO_FAILED; logx("ta/%s: fallback to cache", tr->descr); @@ -426,9 +426,9 @@ ta_get(struct tal *tal) } /* steal URI information from TAL */ - tr->urisz = tal->urisz; + tr->num_uris = tal->num_uris; tr->uri = tal->uri; - tal->urisz = 0; + tal->num_uris = 0; tal->uri = NULL; ta_fetch(tr); @@ -1150,7 +1150,7 @@ ta_lookup(int id, struct tal *tal) { struct repo *rp; - if (tal->urisz == 0) + if (tal->num_uris == 0) errx(1, "TAL %s has no URI", tal->descr); /* Look up in repository table. (Lookup should actually fail here) */ @@ -1264,6 +1264,20 @@ repo_byid(unsigned int id) return NULL; } +static struct repo * +repo_rsync_bypath(const char *path) +{ + struct repo *rp; + + SLIST_FOREACH(rp, &repos, entry) { + if (rp->rsync == NULL) + continue; + if (strcmp(rp->basedir, path) == 0) + return rp; + } + return NULL; +} + /* * Find repository by base path. */ @@ -1358,7 +1372,7 @@ repo_proto(const struct repo *rp) if (rp->ta != NULL) { const struct tarepo *tr = rp->ta; - if (tr->uriidx < tr->urisz && + if (tr->uriidx < tr->num_uris && strncasecmp(tr->uri[tr->uriidx], RSYNC_PROTO, RSYNC_PROTO_LEN) == 0) return "rsync"; @@ -1500,6 +1514,8 @@ repo_stat_inc(struct repo *rp, int talid, enum rtype type, enum stype subtype) rp->stats[talid].mfts++; if (subtype == STYPE_FAIL) rp->stats[talid].mfts_fail++; + if (subtype == STYPE_SEQNUM_GAP) + rp->stats[talid].mfts_gap++; break; case RTYPE_ROA: switch (subtype) { @@ -1890,7 +1906,8 @@ repo_cleanup_entry(FTSENT *e, struct filepath_tree *tree, int cachefd) } if (e->fts_level == 3 && fts_state.type == RSYNC_DIR) { /* .rsync/rpki.example.org/repository */ - fts_state.rp = repo_bypath(path + strlen(".rsync/")); + fts_state.rp = repo_rsync_bypath(path + + strlen(".rsync/")); } break; case FTS_DP: diff --git a/usr.sbin/rpki-client/roa.c b/usr.sbin/rpki-client/roa.c index 3d29e6a59..4ca22af4f 100644 --- a/usr.sbin/rpki-client/roa.c +++ b/usr.sbin/rpki-client/roa.c @@ -1,4 +1,4 @@ -/* $OpenBSD: roa.c,v 1.78 2024/05/24 12:57:20 tb Exp $ */ +/* $OpenBSD: roa.c,v 1.80 2024/11/12 09:23:07 tb Exp $ */ /* * Copyright (c) 2022 Theo Buehler * Copyright (c) 2019 Kristaps Dzonsons @@ -174,13 +174,13 @@ roa_parse_econtent(const char *fn, struct roa *roa, const unsigned char *d, goto out; } - if (roa->ipsz + addrsz >= MAX_IP_SIZE) { + if (roa->num_ips + addrsz >= MAX_IP_SIZE) { warnx("%s: too many ROAIPAddress entries: limit %d", fn, MAX_IP_SIZE); goto out; } - roa->ips = recallocarray(roa->ips, roa->ipsz, - roa->ipsz + addrsz, sizeof(struct roa_ip)); + roa->ips = recallocarray(roa->ips, roa->num_ips, + roa->num_ips + addrsz, sizeof(struct roa_ip)); if (roa->ips == NULL) err(1, NULL); @@ -216,7 +216,7 @@ roa_parse_econtent(const char *fn, struct roa *roa, const unsigned char *d, } } - res = &roa->ips[roa->ipsz++]; + res = &roa->ips[roa->num_ips++]; res->addr = ipaddr; res->afi = afi; res->maxlength = maxlen; @@ -284,11 +284,16 @@ roa_parse(X509 **x509, const char *fn, int talid, const unsigned char *der, if ((cert = cert_parse_ee_cert(fn, talid, *x509)) == NULL) goto out; - if (cert->asz > 0) { + if (cert->num_ases > 0) { warnx("%s: superfluous AS Resources extension present", fn); goto out; } + if (cert->num_ips == 0) { + warnx("%s: no IP address present", fn); + goto out; + } + /* * If the ROA isn't valid, we accept it anyway and depend upon * the code around roa_read() to check the "valid" field itself. @@ -336,10 +341,10 @@ roa_buffer(struct ibuf *b, const struct roa *p) io_simple_buffer(b, &p->valid, sizeof(p->valid)); io_simple_buffer(b, &p->asid, sizeof(p->asid)); io_simple_buffer(b, &p->talid, sizeof(p->talid)); - io_simple_buffer(b, &p->ipsz, sizeof(p->ipsz)); + io_simple_buffer(b, &p->num_ips, sizeof(p->num_ips)); io_simple_buffer(b, &p->expires, sizeof(p->expires)); - io_simple_buffer(b, p->ips, p->ipsz * sizeof(p->ips[0])); + io_simple_buffer(b, p->ips, p->num_ips * sizeof(p->ips[0])); io_str_buffer(b, p->aia); io_str_buffer(b, p->aki); @@ -362,12 +367,14 @@ roa_read(struct ibuf *b) io_read_buf(b, &p->valid, sizeof(p->valid)); io_read_buf(b, &p->asid, sizeof(p->asid)); io_read_buf(b, &p->talid, sizeof(p->talid)); - io_read_buf(b, &p->ipsz, sizeof(p->ipsz)); + io_read_buf(b, &p->num_ips, sizeof(p->num_ips)); io_read_buf(b, &p->expires, sizeof(p->expires)); - if ((p->ips = calloc(p->ipsz, sizeof(struct roa_ip))) == NULL) - err(1, NULL); - io_read_buf(b, p->ips, p->ipsz * sizeof(p->ips[0])); + if (p->num_ips > 0) { + if ((p->ips = calloc(p->num_ips, sizeof(p->ips[0]))) == NULL) + err(1, NULL); + io_read_buf(b, p->ips, p->num_ips * sizeof(p->ips[0])); + } io_read_str(b, &p->aia); io_read_str(b, &p->aki); @@ -388,7 +395,7 @@ roa_insert_vrps(struct vrp_tree *tree, struct roa *roa, struct repo *rp) struct vrp *v, *found; size_t i; - for (i = 0; i < roa->ipsz; i++) { + for (i = 0; i < roa->num_ips; i++) { if ((v = malloc(sizeof(*v))) == NULL) err(1, NULL); v->afi = roa->ips[i].afi; diff --git a/usr.sbin/rpki-client/rpki-client.8 b/usr.sbin/rpki-client/rpki-client.8 index d59851cff..026f0001e 100644 --- a/usr.sbin/rpki-client/rpki-client.8 +++ b/usr.sbin/rpki-client/rpki-client.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: rpki-client.8,v 1.112 2024/10/07 14:21:51 tb Exp $ +.\" $OpenBSD: rpki-client.8,v 1.119 2025/01/03 10:32:21 job Exp $ .\" .\" Copyright (c) 2019 Kristaps Dzonsons .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: October 7 2024 $ +.Dd $Mdocdate: January 3 2025 $ .Dt RPKI-CLIENT 8 .Os .Sh NAME @@ -22,14 +22,13 @@ .Nd RPKI validator to support BGP routing security .Sh SYNOPSIS .Nm -.Op Fl ABcjmnoRVvx +.Op Fl 0ABcjmnoRVvx .Op Fl b Ar sourceaddr .Op Fl d Ar cachedir .Op Fl e Ar rsync_prog .Op Fl H Ar fqdn .Op Fl S Ar skiplist .Op Fl s Ar timeout -.Op Fl T Ar table .Op Fl t Ar tal .Op Ar outputdir .Nm @@ -63,17 +62,25 @@ in various formats. .Pp The options are as follows: .Bl -tag -width Ds +.It Fl 0 +Include hazardous AS0 TALs in the output files. +AS0 TALs are not recommended for automatic filtering of BGP routes. +The default is not to include them. .It Fl A -Exclude the ASPA-set from the output files that support it (JSON and +Exclude the ASPA-set from the output files that support it (BIRD, JSON, and OpenBGPD). .It Fl B -Create output in the files -.Pa bird1v4 , -.Pa bird1v6 , -and +Create output in the file .Pa bird -(for bird2) -in the output directory which is suitable for the BIRD internet routing daemon. +in the output directory suitable for BIRD internet routing daemon version +2.16 and up. +For compatibility with earlier versions, use +.Fl A . +The validated payload table names are +.Em ROAS4 , +.Em ROAS6 , +and +.Em ASPAS . .It Fl b Ar sourceaddr Tell the HTTP and rsync clients to use .Ar sourceaddr @@ -200,12 +207,6 @@ Individual RSYNC/RRDP repositories are timed out after one fourth of .Em timeout . All network synchronisation tasks are aborted after seven eights of .Em timeout . -.It Fl T Ar table -For BIRD output generated with the -.Fl B -option use -.Ar table -as roa table name instead of the default 'ROAS'. .It Fl t Ar tal Specify a .Em Trust Anchor Location Pq TAL @@ -332,7 +333,7 @@ agreement regarding ARIN service restrictions. .Re .Pp .Rs -.%T Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile +.%T Internet X.509 Public Key Infrastructure Certificate and CRL Profile .%R RFC 5280 .Re .Pp @@ -422,9 +423,18 @@ agreement regarding ARIN service restrictions. .Re .Pp .Rs -.%T RPKI Signed Object for Trust Anchor Key -.%U https://datatracker.ietf.org/doc/html/draft-ietf-sidrops-signed-tal -.%D Oct, 2022 +.%T Same-Origin Policy for the RRDP +.%R RFC 9674 +.Re +.Pp +.Rs +.%T A Profile for RPKI Trust Anchor Keys +.%R RFC 9691 +.Re +.Pp +.Rs +.%T Detecting RRDP Session Desynchronization +.%R RFC 9697 .Re .Pp .Rs @@ -440,12 +450,6 @@ agreement regarding ARIN service restrictions. .Re .Pp .Rs -.%T Detecting RRDP Session Desynchronization -.%U https://datatracker.ietf.org/doc/html/draft-ietf-sidrops-rrdp-desynchronization-00 -.%D April, 2024 -.Re -.Pp -.Rs .%T A profile for Signed Prefix Lists for Use in the RPKI .%U https://datatracker.ietf.org/doc/html/draft-ietf-sidrops-rpki-prefixlist-02 .%D Jan, 2024 @@ -464,14 +468,8 @@ agreement regarding ARIN service restrictions. .Re .Pp .Rs -.%T Same-Origin Policy for RRDP -.%U https://datatracker.ietf.org/doc/html/draft-ietf-sidrops-rrdp-same-origin -.%D June, 2024 -.Re -.Pp -.Rs .%T Tiebreaking RPKI Trust Anchors -.%U https://datatracker.ietf.org/doc/html/draft-spaghetti-sidrops-rpki-ta-tiebreaker +.%U https://datatracker.ietf.org/doc/html/draft-ietf-sidrops-rpki-ta-tiebreaker .%D June, 2024 .Re .Sh HISTORY diff --git a/usr.sbin/rpki-client/rrdp.c b/usr.sbin/rpki-client/rrdp.c index c17eb7a7a..5cae622e9 100644 --- a/usr.sbin/rpki-client/rrdp.c +++ b/usr.sbin/rpki-client/rrdp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rrdp.c,v 1.35 2024/09/02 11:56:22 job Exp $ */ +/* $OpenBSD: rrdp.c,v 1.39 2024/11/21 13:32:27 claudio Exp $ */ /* * Copyright (c) 2020 Nils Fisher * Copyright (c) 2021 Claudio Jeker @@ -36,7 +36,7 @@ #define MAX_SESSIONS 32 #define READ_BUF_SIZE (32 * 1024) -static struct msgbuf msgq; +static struct msgbuf *msgq; #define RRDP_STATE_REQ 0x01 #define RRDP_STATE_WAIT 0x02 @@ -98,7 +98,7 @@ rrdp_done(unsigned int id, int ok) io_simple_buffer(b, &type, sizeof(type)); io_simple_buffer(b, &id, sizeof(id)); io_simple_buffer(b, &ok, sizeof(ok)); - io_close_buffer(&msgq, b); + io_close_buffer(msgq, b); } /* @@ -120,7 +120,7 @@ rrdp_http_req(unsigned int id, const char *uri, const char *last_mod) io_simple_buffer(b, &id, sizeof(id)); io_str_buffer(b, uri); io_str_buffer(b, last_mod); - io_close_buffer(&msgq, b); + io_close_buffer(msgq, b); } /* @@ -136,7 +136,7 @@ rrdp_state_send(struct rrdp *s) io_simple_buffer(b, &type, sizeof(type)); io_simple_buffer(b, &s->id, sizeof(s->id)); rrdp_session_buffer(b, s->current); - io_close_buffer(&msgq, b); + io_close_buffer(msgq, b); } /* @@ -151,7 +151,7 @@ rrdp_clear_repo(struct rrdp *s) b = io_new_buffer(); io_simple_buffer(b, &type, sizeof(type)); io_simple_buffer(b, &s->id, sizeof(s->id)); - io_close_buffer(&msgq, b); + io_close_buffer(msgq, b); } /* @@ -174,7 +174,7 @@ rrdp_publish_file(struct rrdp *s, struct publish_xml *pxml, io_simple_buffer(b, &pxml->hash, sizeof(pxml->hash)); io_str_buffer(b, pxml->uri); io_buf_buffer(b, data, datasz); - io_close_buffer(&msgq, b); + io_close_buffer(msgq, b); s->file_pending++; } } @@ -400,22 +400,16 @@ rrdp_abort_req(struct rrdp *s) } static void -rrdp_input_handler(int fd) +rrdp_input_handler(struct ibuf *b) { - static struct ibuf *inbuf; struct rrdp_session *state; char *local, *notify, *last_mod; - struct ibuf *b; struct rrdp *s; enum rrdp_msg type; enum http_result res; unsigned int id; int ok; - b = io_buf_recvfd(fd, &inbuf); - if (b == NULL) - return; - io_read_buf(b, &type, sizeof(type)); io_read_buf(b, &id, sizeof(id)); @@ -483,7 +477,6 @@ rrdp_input_handler(int fd) default: errx(1, "unexpected message %d", type); } - ibuf_free(b); } static void @@ -538,13 +531,15 @@ proc_rrdp(int fd) { struct pollfd pfds[MAX_SESSIONS + 1]; struct rrdp *s, *ns; + struct ibuf *b; size_t i; if (pledge("stdio recvfd", NULL) == -1) err(1, "pledge"); - msgbuf_init(&msgq); - msgq.fd = fd; + if ((msgq = msgbuf_new_reader(sizeof(size_t), io_parse_hdr, NULL)) == + NULL) + err(1, NULL); for (;;) { i = 1; @@ -585,7 +580,7 @@ proc_rrdp(int fd) */ pfds[0].fd = fd; pfds[0].events = POLLIN; - if (msgbuf_queuelen(&msgq) > 0) + if (msgbuf_queuelen(msgq) > 0) pfds[0].events |= POLLOUT; if (poll(pfds, i, INFTIM) == -1) { @@ -597,15 +592,25 @@ proc_rrdp(int fd) if (pfds[0].revents & POLLHUP) break; if (pfds[0].revents & POLLOUT) { - switch (msgbuf_write(&msgq)) { - case 0: - errx(1, "write: connection closed"); - case -1: - err(1, "write"); + if (msgbuf_write(fd, msgq) == -1) { + if (errno == EPIPE) + errx(1, "write: connection closed"); + else + err(1, "write"); + } + } + if (pfds[0].revents & POLLIN) { + switch (msgbuf_read(fd, msgq)) { + case -1: + err(1, "msgbuf_read"); + case 0: + errx(1, "msgbuf_read: connection closed"); + } + while ((b = io_buf_get(msgq)) != NULL) { + rrdp_input_handler(b); + ibuf_free(b); } } - if (pfds[0].revents & POLLIN) - rrdp_input_handler(fd); TAILQ_FOREACH_SAFE(s, &states, entry, ns) { if (s->pfd == NULL) diff --git a/usr.sbin/rpki-client/rsc.c b/usr.sbin/rpki-client/rsc.c index 4a849a188..11d657fdf 100644 --- a/usr.sbin/rpki-client/rsc.c +++ b/usr.sbin/rpki-client/rsc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rsc.c,v 1.35 2024/06/11 10:38:40 tb Exp $ */ +/* $OpenBSD: rsc.c,v 1.37 2024/11/13 12:51:04 tb Exp $ */ /* * Copyright (c) 2022 Theo Buehler * Copyright (c) 2022 Job Snijders @@ -130,38 +130,38 @@ static int rsc_parse_aslist(const char *fn, struct rsc *rsc, const ConstrainedASIdentifiers *asids) { - int i, asz; + int i, num_ases; if (asids == NULL) return 1; - if ((asz = sk_ASIdOrRange_num(asids->asnum)) == 0) { + if ((num_ases = sk_ASIdOrRange_num(asids->asnum)) == 0) { warnx("%s: RSC asID empty", fn); return 0; } - if (asz >= MAX_AS_SIZE) { + if (num_ases >= MAX_AS_SIZE) { warnx("%s: too many AS number entries: limit %d", fn, MAX_AS_SIZE); return 0; } - rsc->as = calloc(asz, sizeof(struct cert_as)); - if (rsc->as == NULL) + if ((rsc->ases = calloc(num_ases, sizeof(struct cert_as))) == NULL) err(1, NULL); - for (i = 0; i < asz; i++) { + for (i = 0; i < num_ases; i++) { const ASIdOrRange *aor; aor = sk_ASIdOrRange_value(asids->asnum, i); switch (aor->type) { case ASIdOrRange_id: - if (!sbgp_as_id(fn, rsc->as, &rsc->asz, aor->u.id)) + if (!sbgp_as_id(fn, rsc->ases, &rsc->num_ases, + aor->u.id)) return 0; break; case ASIdOrRange_range: - if (!sbgp_as_range(fn, rsc->as, &rsc->asz, + if (!sbgp_as_range(fn, rsc->ases, &rsc->num_ases, aor->u.range)) return 0; break; @@ -181,7 +181,7 @@ rsc_parse_iplist(const char *fn, struct rsc *rsc, const ConstrainedIPAddressFamily *af; const IPAddressOrRanges *aors; const IPAddressOrRange *aor; - size_t ipsz; + size_t num_ips; enum afi afi; int i, j; @@ -197,14 +197,14 @@ rsc_parse_iplist(const char *fn, struct rsc *rsc, af = sk_ConstrainedIPAddressFamily_value(ipAddrBlocks, i); aors = af->addressesOrRanges; - ipsz = rsc->ipsz + sk_IPAddressOrRange_num(aors); - if (ipsz >= MAX_IP_SIZE) { + num_ips = rsc->num_ips + sk_IPAddressOrRange_num(aors); + if (num_ips >= MAX_IP_SIZE) { warnx("%s: too many IP address entries: limit %d", fn, MAX_IP_SIZE); return 0; } - rsc->ips = recallocarray(rsc->ips, rsc->ipsz, ipsz, + rsc->ips = recallocarray(rsc->ips, rsc->num_ips, num_ips, sizeof(struct cert_ip)); if (rsc->ips == NULL) err(1, NULL); @@ -219,12 +219,12 @@ rsc_parse_iplist(const char *fn, struct rsc *rsc, switch (aor->type) { case IPAddressOrRange_addressPrefix: if (!sbgp_addr(fn, rsc->ips, - &rsc->ipsz, afi, aor->u.addressPrefix)) + &rsc->num_ips, afi, aor->u.addressPrefix)) return 0; break; case IPAddressOrRange_addressRange: if (!sbgp_addr_range(fn, rsc->ips, - &rsc->ipsz, afi, aor->u.addressRange)) + &rsc->num_ips, afi, aor->u.addressRange)) return 0; break; default: @@ -272,25 +272,25 @@ rsc_parse_checklist(const char *fn, struct rsc *rsc, FileNameAndHash *fh; ASN1_IA5STRING *fileName; struct rscfile *file; - size_t sz, i; + size_t num_files, i; - if ((sz = sk_FileNameAndHash_num(checkList)) == 0) { + if ((num_files = sk_FileNameAndHash_num(checkList)) == 0) { warnx("%s: RSC checkList needs at least one entry", fn); return 0; } - if (sz >= MAX_CHECKLIST_ENTRIES) { - warnx("%s: %zu exceeds checklist entry limit (%d)", fn, sz, - MAX_CHECKLIST_ENTRIES); + if (num_files >= MAX_CHECKLIST_ENTRIES) { + warnx("%s: %zu exceeds checklist entry limit (%d)", fn, + num_files, MAX_CHECKLIST_ENTRIES); return 0; } - rsc->files = calloc(sz, sizeof(struct rscfile)); + rsc->files = calloc(num_files, sizeof(struct rscfile)); if (rsc->files == NULL) err(1, NULL); - rsc->filesz = sz; + rsc->num_files = num_files; - for (i = 0; i < sz; i++) { + for (i = 0; i < num_files; i++) { fh = sk_FileNameAndHash_value(checkList, i); file = &rsc->files[i]; @@ -458,14 +458,14 @@ rsc_free(struct rsc *p) if (p == NULL) return; - for (i = 0; i < p->filesz; i++) + for (i = 0; i < p->num_files; i++) free(p->files[i].filename); free(p->aia); free(p->aki); free(p->ski); free(p->ips); - free(p->as); + free(p->ases); free(p->files); free(p); } diff --git a/usr.sbin/rpki-client/rsync.c b/usr.sbin/rpki-client/rsync.c index 2a83b78bf..fef15ee4e 100644 --- a/usr.sbin/rpki-client/rsync.c +++ b/usr.sbin/rpki-client/rsync.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rsync.c,v 1.51 2024/08/20 13:31:49 claudio Exp $ */ +/* $OpenBSD: rsync.c,v 1.56 2024/11/21 13:32:27 claudio Exp $ */ /* * Copyright (c) 2019 Kristaps Dzonsons * @@ -71,7 +71,7 @@ rsync_base_uri(const char *uri) } /* Parse the non-zero-length hostname. */ - host = uri + 8; + host = uri + RSYNC_PROTO_LEN; if ((module = strchr(host, '/')) == NULL) { warnx("%s: missing rsync module", uri); @@ -226,17 +226,18 @@ proc_rsync(char *prog, char *bind_addr, int fd) { int nprocs = 0, npending = 0, rc = 0; struct pollfd pfd; - struct msgbuf msgq; - struct ibuf *b, *inbuf = NULL; + struct msgbuf *msgq; + struct ibuf *b; sigset_t mask, oldmask; struct rsync *s, *ns; if (pledge("stdio rpath proc exec unveil", NULL) == -1) err(1, "pledge"); + if ((msgq = msgbuf_new_reader(sizeof(size_t), io_parse_hdr, NULL)) == + NULL) + err(1, NULL); pfd.fd = fd; - msgbuf_init(&msgq); - msgq.fd = fd; /* * Unveil the command we want to run. @@ -294,7 +295,7 @@ proc_rsync(char *prog, char *bind_addr, int fd) pfd.events = 0; pfd.events |= POLLIN; - if (msgbuf_queuelen(&msgq) > 0) + if (msgbuf_queuelen(msgq) > 0) pfd.events |= POLLOUT; if (npending > 0 && nprocs < MAX_RSYNC_REQUESTS) { @@ -343,7 +344,7 @@ proc_rsync(char *prog, char *bind_addr, int fd) b = io_new_buffer(); io_simple_buffer(b, &s->id, sizeof(s->id)); io_simple_buffer(b, &ok, sizeof(ok)); - io_close_buffer(&msgq, b); + io_close_buffer(msgq, b); rsync_free(s); nprocs--; @@ -355,11 +356,11 @@ proc_rsync(char *prog, char *bind_addr, int fd) } if (pfd.revents & POLLOUT) { - switch (msgbuf_write(&msgq)) { - case 0: - errx(1, "write: connection closed"); - case -1: - err(1, "write"); + if (msgbuf_write(fd, msgq) == -1) { + if (errno == EPIPE) + errx(1, "write: connection closed"); + else + err(1, "write"); } } @@ -370,30 +371,35 @@ proc_rsync(char *prog, char *bind_addr, int fd) if (!(pfd.revents & POLLIN)) continue; - b = io_buf_read(fd, &inbuf); - if (b == NULL) - continue; + switch (ibuf_read(fd, msgq)) { + case -1: + err(1, "ibuf_read"); + case 0: + errx(1, "ibuf_read: connection closed"); + } - /* Read host and module. */ - io_read_buf(b, &id, sizeof(id)); - io_read_str(b, &dst); - io_read_str(b, &compdst); - io_read_str(b, &uri); + while ((b = io_buf_get(msgq)) != NULL) { + /* Read host and module. */ + io_read_buf(b, &id, sizeof(id)); + io_read_str(b, &dst); + io_read_str(b, &compdst); + io_read_str(b, &uri); - ibuf_free(b); + ibuf_free(b); - if (dst != NULL) { - rsync_new(id, uri, dst, compdst); - npending++; - } else { - TAILQ_FOREACH(s, &states, entry) - if (s->id == id) - break; - if (s != NULL) { - if (s->pid != 0) - kill(s->pid, SIGTERM); - else - rsync_free(s); + if (dst != NULL) { + rsync_new(id, uri, dst, compdst); + npending++; + } else { + TAILQ_FOREACH(s, &states, entry) + if (s->id == id) + break; + if (s != NULL) { + if (s->pid != 0) + kill(s->pid, SIGTERM); + else + rsync_free(s); + } } } } @@ -405,6 +411,6 @@ proc_rsync(char *prog, char *bind_addr, int fd) rsync_free(s); } - msgbuf_clear(&msgq); + msgbuf_free(msgq); exit(rc); } diff --git a/usr.sbin/rpki-client/spl.c b/usr.sbin/rpki-client/spl.c index 9ab287d49..16c8cf6cd 100644 --- a/usr.sbin/rpki-client/spl.c +++ b/usr.sbin/rpki-client/spl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: spl.c,v 1.3 2024/05/15 14:43:32 claudio Exp $ */ +/* $OpenBSD: spl.c,v 1.7 2024/11/13 12:51:04 tb Exp $ */ /* * Copyright (c) 2024 Job Snijders * Copyright (c) 2022 Theo Buehler @@ -133,7 +133,7 @@ spl_parse_econtent(const char *fn, struct spl *spl, const unsigned char *d, const AddressFamilyPrefixes *afp; const STACK_OF(ASN1_BIT_STRING) *prefixes; const ASN1_BIT_STRING *prefix_asn1; - int afpsz, prefixesz; + int num_afps, num_prefixes; enum afi afi; struct ip_addr ip_addr; struct spl_pfx *prefix; @@ -160,25 +160,25 @@ spl_parse_econtent(const char *fn, struct spl *spl, const unsigned char *d, goto out; } - afpsz = sk_AddressFamilyPrefixes_num(spl_asn1->prefixBlocks); - if (afpsz < 0 || afpsz > 2) { + num_afps = sk_AddressFamilyPrefixes_num(spl_asn1->prefixBlocks); + if (num_afps < 0 || num_afps > 2) { warnx("%s: unexpected number of AddressFamilyAddressPrefixes" - "(got %d, expected 0, 1, or 2)", fn, afpsz); + "(got %d, expected 0, 1, or 2)", fn, num_afps); goto out; } - for (i = 0; i < afpsz; i++) { + for (i = 0; i < num_afps; i++) { struct ip_addr *prev_ip_addr = NULL; afp = sk_AddressFamilyPrefixes_value(spl_asn1->prefixBlocks, i); prefixes = afp->addressPrefixes; - prefixesz = sk_ASN1_BIT_STRING_num(afp->addressPrefixes); + num_prefixes = sk_ASN1_BIT_STRING_num(afp->addressPrefixes); - if (prefixesz == 0) { + if (num_prefixes == 0) { warnx("%s: empty AddressFamilyAddressPrefixes", fn); goto out; } - if (spl->pfxsz + prefixesz >= MAX_IP_SIZE) { + if (spl->num_prefixes + num_prefixes >= MAX_IP_SIZE) { warnx("%s: too many addressPrefixes entries", fn); goto out; } @@ -207,12 +207,12 @@ spl_parse_econtent(const char *fn, struct spl *spl, const unsigned char *d, } } - spl->pfxs = recallocarray(spl->pfxs, spl->pfxsz, - spl->pfxsz + prefixesz, sizeof(struct spl_pfx)); - if (spl->pfxs == NULL) + spl->prefixes = recallocarray(spl->prefixes, spl->num_prefixes, + spl->num_prefixes + num_prefixes, sizeof(spl->prefixes[0])); + if (spl->prefixes == NULL) err(1, NULL); - for (j = 0; j < prefixesz; j++) { + for (j = 0; j < num_prefixes; j++) { prefix_asn1 = sk_ASN1_BIT_STRING_value(prefixes, j); if (!ip_addr_parse(prefix_asn1, afi, fn, &ip_addr)) @@ -224,7 +224,7 @@ spl_parse_econtent(const char *fn, struct spl *spl, const unsigned char *d, goto out; } - prefix = &spl->pfxs[spl->pfxsz++]; + prefix = &spl->prefixes[spl->num_prefixes++]; prefix->prefix = ip_addr; prefix->afi = afi; prev_ip_addr = &prefix->prefix; @@ -291,12 +291,12 @@ spl_parse(X509 **x509, const char *fn, int talid, const unsigned char *der, if ((cert = cert_parse_ee_cert(fn, talid, *x509)) == NULL) goto out; - if (cert->asz == 0) { + if (cert->num_ases == 0) { warnx("%s: AS Resources extension missing", fn); goto out; } - if (cert->ipsz > 0) { + if (cert->num_ips > 0) { warnx("%s: superfluous IP Resources extension present", fn); goto out; } @@ -330,7 +330,7 @@ spl_free(struct spl *s) free(s->aki); free(s->sia); free(s->ski); - free(s->pfxs); + free(s->prefixes); free(s); } @@ -344,10 +344,11 @@ spl_buffer(struct ibuf *b, const struct spl *s) io_simple_buffer(b, &s->valid, sizeof(s->valid)); io_simple_buffer(b, &s->asid, sizeof(s->asid)); io_simple_buffer(b, &s->talid, sizeof(s->talid)); - io_simple_buffer(b, &s->pfxsz, sizeof(s->pfxsz)); + io_simple_buffer(b, &s->num_prefixes, sizeof(s->num_prefixes)); io_simple_buffer(b, &s->expires, sizeof(s->expires)); - io_simple_buffer(b, s->pfxs, s->pfxsz * sizeof(s->pfxs[0])); + io_simple_buffer(b, s->prefixes, + s->num_prefixes * sizeof(s->prefixes[0])); io_str_buffer(b, s->aia); io_str_buffer(b, s->aki); @@ -370,12 +371,16 @@ spl_read(struct ibuf *b) io_read_buf(b, &s->valid, sizeof(s->valid)); io_read_buf(b, &s->asid, sizeof(s->asid)); io_read_buf(b, &s->talid, sizeof(s->talid)); - io_read_buf(b, &s->pfxsz, sizeof(s->pfxsz)); + io_read_buf(b, &s->num_prefixes, sizeof(s->num_prefixes)); io_read_buf(b, &s->expires, sizeof(s->expires)); - if ((s->pfxs = calloc(s->pfxsz, sizeof(struct spl_pfx))) == NULL) - err(1, NULL); - io_read_buf(b, s->pfxs, s->pfxsz * sizeof(s->pfxs[0])); + if (s->num_prefixes > 0) { + if ((s->prefixes = calloc(s->num_prefixes, + sizeof(s->prefixes[0]))) == NULL) + err(1, NULL); + io_read_buf(b, s->prefixes, + s->num_prefixes * sizeof(s->prefixes[0])); + } io_read_str(b, &s->aia); io_read_str(b, &s->aki); @@ -399,11 +404,11 @@ spl_pfx_cmp(const struct spl_pfx *a, const struct spl_pfx *b) static void insert_vsp(struct vsp *vsp, size_t idx, struct spl_pfx *pfx) { - if (idx < vsp->prefixesz) + if (idx < vsp->num_prefixes) memmove(vsp->prefixes + idx + 1, vsp->prefixes + idx, - (vsp->prefixesz - idx) * sizeof(*vsp->prefixes)); + (vsp->num_prefixes - idx) * sizeof(vsp->prefixes[0])); vsp->prefixes[idx] = *pfx; - vsp->prefixesz++; + vsp->num_prefixes++; } /* @@ -447,7 +452,7 @@ spl_insert_vsps(struct vsp_tree *tree, struct spl *spl, struct repo *rp) /* merge content of multiple SPLs */ vsp->prefixes = reallocarray(vsp->prefixes, - vsp->prefixesz + spl->pfxsz, sizeof(struct spl_pfx)); + vsp->num_prefixes + spl->num_prefixes, sizeof(vsp->prefixes[0])); if (vsp->prefixes == NULL) err(1, NULL); @@ -456,16 +461,17 @@ spl_insert_vsps(struct vsp_tree *tree, struct spl *spl, struct repo *rp) * all SPL->pfxs, and insert them in the right place in * vsp->prefixes while keeping the order of the array. */ - for (i = 0, j = 0; i < spl->pfxsz; ) { + for (i = 0, j = 0; i < spl->num_prefixes; ) { cmp = -1; - if (j == vsp->prefixesz || - (cmp = spl_pfx_cmp(&spl->pfxs[i], &vsp->prefixes[j])) < 0) { - insert_vsp(vsp, j, &spl->pfxs[i]); + if (j == vsp->num_prefixes || + (cmp = spl_pfx_cmp(&spl->prefixes[i], + &vsp->prefixes[j])) < 0) { + insert_vsp(vsp, j, &spl->prefixes[i]); i++; } else if (cmp == 0) i++; - if (j < vsp->prefixesz) + if (j < vsp->num_prefixes) j++; } } diff --git a/usr.sbin/rpki-client/tak.c b/usr.sbin/rpki-client/tak.c index c497f7f58..dc40231fc 100644 --- a/usr.sbin/rpki-client/tak.c +++ b/usr.sbin/rpki-client/tak.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tak.c,v 1.20 2024/05/15 09:01:36 tb Exp $ */ +/* $OpenBSD: tak.c,v 1.21 2024/11/13 12:51:04 tb Exp $ */ /* * Copyright (c) 2022 Job Snijders * Copyright (c) 2022 Theo Buehler @@ -94,29 +94,30 @@ parse_takey(const char *fn, const TAKey *takey) if ((res = calloc(1, sizeof(struct takey))) == NULL) err(1, NULL); - res->commentsz = sk_ASN1_UTF8STRING_num(takey->comments); - if (res->commentsz > 0) { - res->comments = calloc(res->commentsz, sizeof(char *)); + res->num_comments = sk_ASN1_UTF8STRING_num(takey->comments); + if (res->num_comments > 0) { + res->comments = calloc(res->num_comments, sizeof(char *)); if (res->comments == NULL) err(1, NULL); - for (i = 0; i < res->commentsz; i++) { + for (i = 0; i < res->num_comments; i++) { comment = sk_ASN1_UTF8STRING_value(takey->comments, i); - res->comments[i] = strndup(comment->data, comment->length); + res->comments[i] = strndup(comment->data, + comment->length); if (res->comments[i] == NULL) err(1, NULL); } } - res->urisz = sk_ASN1_IA5STRING_num(takey->certificateURIs); - if (res->urisz == 0) { + res->num_uris = sk_ASN1_IA5STRING_num(takey->certificateURIs); + if (res->num_uris == 0) { warnx("%s: Signed TAL requires at least 1 CertificateURI", fn); goto err; } - if ((res->uris = calloc(res->urisz, sizeof(char *))) == NULL) + if ((res->uris = calloc(res->num_uris, sizeof(char *))) == NULL) err(1, NULL); - for (i = 0; i < res->urisz; i++) { + for (i = 0; i < res->num_uris; i++) { certURI = sk_ASN1_IA5STRING_value(takey->certificateURIs, i); if (!valid_uri(certURI->data, certURI->length, NULL)) { warnx("%s: invalid TA URI", fn); @@ -279,10 +280,10 @@ takey_free(struct takey *t) if (t == NULL) return; - for (i = 0; i < t->commentsz; i++) + for (i = 0; i < t->num_comments; i++) free(t->comments[i]); - for (i = 0; i < t->urisz; i++) + for (i = 0; i < t->num_uris; i++) free(t->uris[i]); free(t->comments); diff --git a/usr.sbin/rpki-client/tal.c b/usr.sbin/rpki-client/tal.c index d8f475c1a..8cc926844 100644 --- a/usr.sbin/rpki-client/tal.c +++ b/usr.sbin/rpki-client/tal.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tal.c,v 1.40 2024/03/22 03:38:12 job Exp $ */ +/* $OpenBSD: tal.c,v 1.41 2024/11/13 12:51:04 tb Exp $ */ /* * Copyright (c) 2019 Kristaps Dzonsons * @@ -96,14 +96,14 @@ tal_parse_buffer(const char *fn, char *buf, size_t len) /* Append to list of URIs. */ tal->uri = reallocarray(tal->uri, - tal->urisz + 1, sizeof(char *)); + tal->num_uris + 1, sizeof(char *)); if (tal->uri == NULL) err(1, NULL); - tal->uri[tal->urisz] = strdup(line); - if (tal->uri[tal->urisz] == NULL) + tal->uri[tal->num_uris] = strdup(line); + if (tal->uri[tal->num_uris] == NULL) err(1, NULL); - tal->urisz++; + tal->num_uris++; f = strrchr(line, '/') + 1; /* can not fail */ if (file) { @@ -116,13 +116,13 @@ tal_parse_buffer(const char *fn, char *buf, size_t len) file = f; } - if (tal->urisz == 0) { + if (tal->num_uris == 0) { warnx("%s: no URIs in TAL file", fn); goto out; } /* sort uri lexicographically so https:// is preferred */ - qsort(tal->uri, tal->urisz, sizeof(tal->uri[0]), tal_cmp); + qsort(tal->uri, tal->num_uris, sizeof(tal->uri[0]), tal_cmp); /* Now the Base64-encoded public key. */ if ((base64_decode(buf, len, &der, &dersz)) == -1) { @@ -195,7 +195,7 @@ tal_free(struct tal *p) return; if (p->uri != NULL) - for (i = 0; i < p->urisz; i++) + for (i = 0; i < p->num_uris; i++) free(p->uri[i]); free(p->pkey); @@ -216,9 +216,9 @@ tal_buffer(struct ibuf *b, const struct tal *p) io_simple_buffer(b, &p->id, sizeof(p->id)); io_buf_buffer(b, p->pkey, p->pkeysz); io_str_buffer(b, p->descr); - io_simple_buffer(b, &p->urisz, sizeof(p->urisz)); + io_simple_buffer(b, &p->num_uris, sizeof(p->num_uris)); - for (i = 0; i < p->urisz; i++) + for (i = 0; i < p->num_uris; i++) io_str_buffer(b, p->uri[i]); } @@ -239,15 +239,15 @@ tal_read(struct ibuf *b) io_read_buf(b, &p->id, sizeof(p->id)); io_read_buf_alloc(b, (void **)&p->pkey, &p->pkeysz); io_read_str(b, &p->descr); - io_read_buf(b, &p->urisz, sizeof(p->urisz)); + io_read_buf(b, &p->num_uris, sizeof(p->num_uris)); assert(p->pkeysz > 0); assert(p->descr); - assert(p->urisz > 0); + assert(p->num_uris > 0); - if ((p->uri = calloc(p->urisz, sizeof(char *))) == NULL) + if ((p->uri = calloc(p->num_uris, sizeof(char *))) == NULL) err(1, NULL); - for (i = 0; i < p->urisz; i++) { + for (i = 0; i < p->num_uris; i++) { io_read_str(b, &p->uri[i]); assert(p->uri[i]); } diff --git a/usr.sbin/rpki-client/validate.c b/usr.sbin/rpki-client/validate.c index 56b3fe5f4..a17eb9218 100644 --- a/usr.sbin/rpki-client/validate.c +++ b/usr.sbin/rpki-client/validate.c @@ -1,4 +1,4 @@ -/* $OpenBSD: validate.c,v 1.77 2024/10/16 06:09:45 tb Exp $ */ +/* $OpenBSD: validate.c,v 1.78 2024/11/12 09:23:07 tb Exp $ */ /* * Copyright (c) 2019 Kristaps Dzonsons * @@ -43,7 +43,7 @@ valid_as(struct auth *a, uint32_t min, uint32_t max) return 0; /* Does this certificate cover our AS number? */ - c = as_check_covered(min, max, a->cert->as, a->cert->asz); + c = as_check_covered(min, max, a->cert->ases, a->cert->num_ases); if (c > 0) return 1; else if (c < 0) @@ -69,7 +69,8 @@ valid_ip(struct auth *a, enum afi afi, return 0; /* Does this certificate cover our IP prefix? */ - c = ip_addr_check_covered(afi, min, max, a->cert->ips, a->cert->ipsz); + c = ip_addr_check_covered(afi, min, max, a->cert->ips, + a->cert->num_ips); if (c > 0) return 1; else if (c < 0) @@ -90,26 +91,26 @@ valid_cert(const char *fn, struct auth *a, const struct cert *cert) size_t i; uint32_t min, max; - for (i = 0; i < cert->asz; i++) { - if (cert->as[i].type == CERT_AS_INHERIT) + for (i = 0; i < cert->num_ases; i++) { + if (cert->ases[i].type == CERT_AS_INHERIT) continue; - if (cert->as[i].type == CERT_AS_ID) { - min = cert->as[i].id; - max = cert->as[i].id; + if (cert->ases[i].type == CERT_AS_ID) { + min = cert->ases[i].id; + max = cert->ases[i].id; } else { - min = cert->as[i].range.min; - max = cert->as[i].range.max; + min = cert->ases[i].range.min; + max = cert->ases[i].range.max; } if (valid_as(a, min, max)) continue; - as_warn(fn, "RFC 6487: uncovered resource", &cert->as[i]); + as_warn(fn, "RFC 6487: uncovered resource", &cert->ases[i]); return 0; } - for (i = 0; i < cert->ipsz; i++) { + for (i = 0; i < cert->num_ips; i++) { if (cert->ips[i].type == CERT_IP_INHERIT) continue; @@ -134,9 +135,9 @@ valid_roa(const char *fn, struct cert *cert, struct roa *roa) size_t i; char buf[64]; - for (i = 0; i < roa->ipsz; i++) { + for (i = 0; i < roa->num_ips; i++) { if (ip_addr_check_covered(roa->ips[i].afi, roa->ips[i].min, - roa->ips[i].max, cert->ips, cert->ipsz) > 0) + roa->ips[i].max, cert->ips, cert->num_ips) > 0) continue; ip_addr_print(&roa->ips[i].addr, roa->ips[i].afi, buf, @@ -156,7 +157,8 @@ valid_roa(const char *fn, struct cert *cert, struct roa *roa) int valid_spl(const char *fn, struct cert *cert, struct spl *spl) { - if (as_check_covered(spl->asid, spl->asid, cert->as, cert->asz) > 0) + if (as_check_covered(spl->asid, spl->asid, cert->ases, + cert->num_ases) > 0) return 1; warnx("%s: SPL: uncovered ASID: %u", fn, spl->asid); @@ -442,25 +444,25 @@ valid_rsc(const char *fn, struct cert *cert, struct rsc *rsc) size_t i; uint32_t min, max; - for (i = 0; i < rsc->asz; i++) { - if (rsc->as[i].type == CERT_AS_ID) { - min = rsc->as[i].id; - max = rsc->as[i].id; + for (i = 0; i < rsc->num_ases; i++) { + if (rsc->ases[i].type == CERT_AS_ID) { + min = rsc->ases[i].id; + max = rsc->ases[i].id; } else { - min = rsc->as[i].range.min; - max = rsc->as[i].range.max; + min = rsc->ases[i].range.min; + max = rsc->ases[i].range.max; } - if (as_check_covered(min, max, cert->as, cert->asz) > 0) + if (as_check_covered(min, max, cert->ases, cert->num_ases) > 0) continue; - as_warn(fn, "RSC ResourceBlock uncovered", &rsc->as[i]); + as_warn(fn, "RSC ResourceBlock uncovered", &rsc->ases[i]); return 0; } - for (i = 0; i < rsc->ipsz; i++) { + for (i = 0; i < rsc->num_ips; i++) { if (ip_addr_check_covered(rsc->ips[i].afi, rsc->ips[i].min, - rsc->ips[i].max, cert->ips, cert->ipsz) > 0) + rsc->ips[i].max, cert->ips, cert->num_ips) > 0) continue; ip_warn(fn, "RSC ResourceBlock uncovered", &rsc->ips[i]); @@ -511,7 +513,7 @@ valid_aspa(const char *fn, struct cert *cert, struct aspa *aspa) { if (as_check_covered(aspa->custasid, aspa->custasid, - cert->as, cert->asz) > 0) + cert->ases, cert->num_ases) > 0) return 1; warnx("%s: ASPA: uncovered Customer ASID: %u", fn, aspa->custasid); @@ -529,10 +531,10 @@ valid_geofeed(const char *fn, struct cert *cert, struct geofeed *g) size_t i; char buf[64]; - for (i = 0; i < g->geoipsz; i++) { + for (i = 0; i < g->num_geoips; i++) { if (ip_addr_check_covered(g->geoips[i].ip->afi, g->geoips[i].ip->min, g->geoips[i].ip->max, cert->ips, - cert->ipsz) > 0) + cert->num_ips) > 0) continue; ip_addr_print(&g->geoips[i].ip->ip, g->geoips[i].ip->afi, buf, diff --git a/usr.sbin/rpki-client/version.h b/usr.sbin/rpki-client/version.h index 6740e59e4..04678d44c 100644 --- a/usr.sbin/rpki-client/version.h +++ b/usr.sbin/rpki-client/version.h @@ -1,3 +1,3 @@ -/* $OpenBSD: version.h,v 1.25 2024/09/19 13:45:07 job Exp $ */ +/* $OpenBSD: version.h,v 1.26 2025/01/03 10:43:36 job Exp $ */ -#define RPKI_VERSION "9.3" +#define RPKI_VERSION "9.4" diff --git a/usr.sbin/rpki-client/x509.c b/usr.sbin/rpki-client/x509.c index f8dadf414..50bc92b9b 100644 --- a/usr.sbin/rpki-client/x509.c +++ b/usr.sbin/rpki-client/x509.c @@ -1,4 +1,4 @@ -/* $OpenBSD: x509.c,v 1.104 2024/10/16 06:09:45 tb Exp $ */ +/* $OpenBSD: x509.c,v 1.105 2024/12/03 14:51:09 job Exp $ */ /* * Copyright (c) 2022 Theo Buehler * Copyright (c) 2021 Claudio Jeker @@ -414,6 +414,7 @@ x509_get_pubkey(X509 *x, const char *fn) { EVP_PKEY *pkey; const EC_KEY *eckey; + const EC_GROUP *ecg; int nid; const char *cname; uint8_t *pubkey = NULL; @@ -437,7 +438,21 @@ x509_get_pubkey(X509 *x, const char *fn) goto out; } - nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(eckey)); + if ((ecg = EC_KEY_get0_group(eckey)) == NULL) { + warnx("%s: EC_KEY_get0_group failed", fn); + goto out; + } + + if (EC_GROUP_get_asn1_flag(ecg) != OPENSSL_EC_NAMED_CURVE) { + warnx("%s: curve encoding issue", fn); + goto out; + } + + if (EC_GROUP_get_point_conversion_form(ecg) != + POINT_CONVERSION_UNCOMPRESSED) + warnx("%s: unconventional point encoding", fn); + + nid = EC_GROUP_get_curve_name(ecg); if (nid != NID_X9_62_prime256v1) { if ((cname = EC_curve_nid2nist(nid)) == NULL) cname = nid2str(nid); diff --git a/usr.sbin/sasyncd/monitor.c b/usr.sbin/sasyncd/monitor.c index 514a8ff13..a18abb732 100644 --- a/usr.sbin/sasyncd/monitor.c +++ b/usr.sbin/sasyncd/monitor.c @@ -1,4 +1,4 @@ -/* $OpenBSD: monitor.c,v 1.22 2017/05/21 02:37:52 deraadt Exp $ */ +/* $OpenBSD: monitor.c,v 1.24 2024/11/21 13:42:49 claudio Exp $ */ /* * Copyright (c) 2005 Håkan Olsson. All rights reserved. @@ -487,19 +487,22 @@ m_priv_iked_imsg(u_int cmd) goto out; } - imsg_init(&ibuf, fd); + if (imsgbuf_init(&ibuf, fd) == -1) { + log_err("m_priv_iked_imsg: imsgbuf_init"); + goto out; + } if (imsg_compose(&ibuf, cmd, 0, 0, -1, NULL, 0) == -1) { log_err("m_priv_iked_imsg: compose"); goto err; } - if (imsg_flush(&ibuf) == -1) { + if (imsgbuf_flush(&ibuf) == -1) { log_err("m_priv_iked_imsg: flush"); goto err; } ret = 0; err: - imsg_clear(&ibuf); + imsgbuf_clear(&ibuf); out: if (fd != -1) close(fd); diff --git a/usr.sbin/slaacctl/slaacctl.c b/usr.sbin/slaacctl/slaacctl.c index 6128785db..600fbad28 100644 --- a/usr.sbin/slaacctl/slaacctl.c +++ b/usr.sbin/slaacctl/slaacctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: slaacctl.c,v 1.23 2022/03/21 16:25:47 florian Exp $ */ +/* $OpenBSD: slaacctl.c,v 1.28 2024/11/21 13:38:15 claudio Exp $ */ /* * Copyright (c) 2005 Claudio Jeker @@ -109,7 +109,8 @@ main(int argc, char *argv[]) if ((ibuf = malloc(sizeof(struct imsgbuf))) == NULL) err(1, NULL); - imsg_init(ibuf, ctl_sock); + if (imsgbuf_init(ibuf, ctl_sock) == -1) + err(1, NULL); done = 0; /* Process user request. */ @@ -136,13 +137,12 @@ main(int argc, char *argv[]) usage(); } - while (ibuf->w.queued) - if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN) - err(1, "write error"); + if (imsgbuf_flush(ibuf) == -1) + err(1, "write error"); while (!done) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - errx(1, "imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + err(1, "read error"); if (n == 0) errx(1, "pipe closed"); diff --git a/usr.sbin/smtpd/ca.c b/usr.sbin/smtpd/ca.c index 3476ae2b0..b41d655b2 100644 --- a/usr.sbin/smtpd/ca.c +++ b/usr.sbin/smtpd/ca.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ca.c,v 1.47 2023/07/11 16:40:22 op Exp $ */ +/* $OpenBSD: ca.c,v 1.49 2024/11/21 13:22:21 claudio Exp $ */ /* * Copyright (c) 2014 Reyk Floeter @@ -323,8 +323,8 @@ rsae_send_imsg(int flen, const unsigned char *from, unsigned char *to, ibuf = &p_ca->imsgbuf; while (!done) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatalx("imsg_read"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatalx("imsgbuf_read"); if (n == 0) fatalx("pipe closed"); @@ -431,8 +431,8 @@ ecdsae_send_enc_imsg(const unsigned char *dgst, int dgst_len, ibuf = &p_ca->imsgbuf; while (!done) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatalx("imsg_read"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatalx("imsgbuf_read"); if (n == 0) fatalx("pipe closed"); while (!done) { diff --git a/usr.sbin/smtpd/control.c b/usr.sbin/smtpd/control.c index 89c8c43f9..b114f60b7 100644 --- a/usr.sbin/smtpd/control.c +++ b/usr.sbin/smtpd/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.131 2024/01/20 09:01:03 claudio Exp $ */ +/* $OpenBSD: control.c,v 1.132 2024/11/21 13:42:22 claudio Exp $ */ /* * Copyright (c) 2012 Gilles Chehade @@ -435,6 +435,7 @@ control_dispatch_ext(struct mproc *p, struct imsg *imsg) switch (imsg->hdr.type) { case IMSG_CTL_SMTP_SESSION: + imsgbuf_allow_fdpass(&p->imsgbuf); if (env->sc_flags & SMTPD_SMTP_PAUSED) { m_compose(p, IMSG_CTL_FAIL, 0, 0, -1, NULL, 0); return; diff --git a/usr.sbin/smtpd/enqueue.c b/usr.sbin/smtpd/enqueue.c index 51616d0d5..0dc0ffae1 100644 --- a/usr.sbin/smtpd/enqueue.c +++ b/usr.sbin/smtpd/enqueue.c @@ -1,4 +1,4 @@ -/* $OpenBSD: enqueue.c,v 1.122 2024/01/20 09:01:03 claudio Exp $ */ +/* $OpenBSD: enqueue.c,v 1.126 2024/11/21 13:26:25 claudio Exp $ */ /* * Copyright (c) 2005 Henning Brauer @@ -784,13 +784,12 @@ open_connection(void) imsg_compose(ibuf, IMSG_CTL_SMTP_SESSION, IMSG_VERSION, 0, -1, NULL, 0); - while (ibuf->w.queued) - if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN) - err(1, "write error"); + if (imsgbuf_flush(ibuf) == -1) + err(1, "write error"); while (1) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - errx(1, "imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + err(1, "read error"); if (n == 0) errx(1, "pipe closed"); diff --git a/usr.sbin/smtpd/mproc.c b/usr.sbin/smtpd/mproc.c index 95851a2e9..c463730c8 100644 --- a/usr.sbin/smtpd/mproc.c +++ b/usr.sbin/smtpd/mproc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mproc.c,v 1.40 2024/01/20 09:01:03 claudio Exp $ */ +/* $OpenBSD: mproc.c,v 1.47 2024/11/21 13:42:22 claudio Exp $ */ /* * Copyright (c) 2012 Eric Faurot @@ -26,8 +26,6 @@ static void mproc_dispatch(int, short, void *); -static ssize_t imsg_read_nofd(struct imsgbuf *); - int mproc_fork(struct mproc *p, const char *path, char *argv[]) { @@ -67,7 +65,10 @@ err: void mproc_init(struct mproc *p, int fd) { - imsg_init(&p->imsgbuf, fd); + if (imsgbuf_init(&p->imsgbuf, fd) == -1) + fatal("mproc_init: imsgbuf_init"); + if (p->proc != PROC_CLIENT) + imsgbuf_allow_fdpass(&p->imsgbuf); } void @@ -78,7 +79,7 @@ mproc_clear(struct mproc *p) if (p->events) event_del(&p->ev); close(p->imsgbuf.fd); - imsg_clear(&p->imsgbuf); + imsgbuf_clear(&p->imsgbuf); } void @@ -115,7 +116,7 @@ mproc_event_add(struct mproc *p) else events = 0; - if (p->imsgbuf.w.queued) + if (imsgbuf_queuelen(&p->imsgbuf) > 0) events |= EV_WRITE; if (p->events) @@ -139,16 +140,11 @@ mproc_dispatch(int fd, short event, void *arg) if (event & EV_READ) { - if (p->proc == PROC_CLIENT) - n = imsg_read_nofd(&p->imsgbuf); - else - n = imsg_read(&p->imsgbuf); + n = imsgbuf_read(&p->imsgbuf); switch (n) { case -1: - if (errno == EAGAIN) - break; - log_warn("warn: %s -> %s: imsg_read", + log_warn("warn: %s -> %s: imsgbuf_read", proc_name(smtpd_process), p->name); fatal("exiting"); /* NOTREACHED */ @@ -164,8 +160,7 @@ mproc_dispatch(int fd, short event, void *arg) } if (event & EV_WRITE) { - n = msgbuf_write(&p->imsgbuf.w); - if (n == 0 || (n == -1 && errno != EAGAIN)) { + if (imsgbuf_write(&p->imsgbuf) == -1) { /* this pipe is dead, so remove the event handler */ log_debug("debug: %s -> %s: pipe closed", proc_name(smtpd_process), p->name); @@ -199,26 +194,6 @@ mproc_dispatch(int fd, short event, void *arg) mproc_event_add(p); } -/* This should go into libutil */ -static ssize_t -imsg_read_nofd(struct imsgbuf *ibuf) -{ - ssize_t n; - char *buf; - size_t len; - - buf = ibuf->r.buf + ibuf->r.wpos; - len = sizeof(ibuf->r.buf) - ibuf->r.wpos; - - while ((n = recv(ibuf->fd, buf, len, 0)) == -1) { - if (errno != EINTR) - return (n); - } - - ibuf->r.wpos += n; - return (n); -} - void m_forward(struct mproc *p, struct imsg *imsg) { @@ -351,8 +326,8 @@ m_flush(struct mproc *p) p->m_pos = 0; - if (imsg_flush(&p->imsgbuf) == -1) - fatal("imsg_flush"); + if (imsgbuf_flush(&p->imsgbuf) == -1) + fatal("imsgbuf_flush"); } static struct imsg * current; diff --git a/usr.sbin/smtpd/queue_proc.c b/usr.sbin/smtpd/queue_proc.c index ff8fe779b..255624f70 100644 --- a/usr.sbin/smtpd/queue_proc.c +++ b/usr.sbin/smtpd/queue_proc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: queue_proc.c,v 1.11 2024/05/07 12:10:06 op Exp $ */ +/* $OpenBSD: queue_proc.c,v 1.14 2024/11/21 13:42:22 claudio Exp $ */ /* * Copyright (c) 2013 Eric Faurot @@ -33,8 +33,8 @@ queue_proc_call(void) { ssize_t n; - if (imsg_flush(&ibuf) == -1) { - log_warn("warn: queue-proc: imsg_flush"); + if (imsgbuf_flush(&ibuf) == -1) { + log_warn("warn: queue-proc: imsgbuf_flush"); fatalx("queue-proc: exiting"); } @@ -54,8 +54,8 @@ queue_proc_call(void) return; } - if ((n = imsg_read(&ibuf)) == -1 && errno != EAGAIN) { - log_warn("warn: queue-proc: imsg_read"); + if ((n = imsgbuf_read(&ibuf)) == -1) { + log_warn("warn: queue-proc: imsgbuf_read"); break; } @@ -291,7 +291,9 @@ queue_proc_init(struct passwd *pw, int server, const char *conf) if (fd == -1) fatalx("queue-proc: exiting"); - imsg_init(&ibuf, fd); + if (imsgbuf_init(&ibuf, fd) == -1) + fatal("queue-proc: exiting"); + imsgbuf_allow_fdpass(&ibuf); version = PROC_QUEUE_API_VERSION; imsg_compose(&ibuf, PROC_QUEUE_INIT, 0, 0, -1, diff --git a/usr.sbin/smtpd/scheduler_proc.c b/usr.sbin/smtpd/scheduler_proc.c index b601b905e..f16ac3435 100644 --- a/usr.sbin/smtpd/scheduler_proc.c +++ b/usr.sbin/smtpd/scheduler_proc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: scheduler_proc.c,v 1.10 2024/05/07 12:10:06 op Exp $ */ +/* $OpenBSD: scheduler_proc.c,v 1.13 2024/11/21 13:42:22 claudio Exp $ */ /* * Copyright (c) 2013 Eric Faurot @@ -32,8 +32,8 @@ scheduler_proc_call(void) { ssize_t n; - if (imsg_flush(&ibuf) == -1) { - log_warn("warn: scheduler-proc: imsg_flush"); + if (imsgbuf_flush(&ibuf) == -1) { + log_warn("warn: scheduler-proc: imsgbuf_flush"); fatalx("scheduler-proc: exiting"); } @@ -53,8 +53,8 @@ scheduler_proc_call(void) return; } - if ((n = imsg_read(&ibuf)) == -1 && errno != EAGAIN) { - log_warn("warn: scheduler-proc: imsg_read"); + if ((n = imsgbuf_read(&ibuf)) == -1) { + log_warn("warn: scheduler-proc: imsgbuf_read"); break; } @@ -104,7 +104,9 @@ scheduler_proc_init(const char *conf) if (fd == -1) fatalx("scheduler-proc: exiting"); - imsg_init(&ibuf, fd); + if (imsgbuf_init(&ibuf, fd) == -1) + fatal("scheduler-proc: exiting"); + imsgbuf_allow_fdpass(&ibuf); version = PROC_SCHEDULER_API_VERSION; imsg_compose(&ibuf, PROC_SCHEDULER_INIT, 0, 0, -1, diff --git a/usr.sbin/smtpd/smtpctl.c b/usr.sbin/smtpd/smtpctl.c index 8881c3e54..faecc9460 100644 --- a/usr.sbin/smtpd/smtpctl.c +++ b/usr.sbin/smtpd/smtpctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: smtpctl.c,v 1.172 2023/05/31 16:51:46 op Exp $ */ +/* $OpenBSD: smtpctl.c,v 1.176 2024/11/21 13:42:22 claudio Exp $ */ /* * Copyright (c) 2013 Eric Faurot @@ -118,7 +118,9 @@ srv_connect(void) } ibuf = xcalloc(1, sizeof(struct imsgbuf)); - imsg_init(ibuf, ctl_sock); + if (imsgbuf_init(ibuf, ctl_sock) == -1) + err(1, "imsgbuf_init"); + imsgbuf_allow_fdpass(ibuf); return (1); } @@ -158,7 +160,7 @@ offline_file(void) static void srv_flush(void) { - if (imsg_flush(ibuf) == -1) + if (imsgbuf_flush(ibuf) == -1) err(1, "write error"); } @@ -192,8 +194,8 @@ srv_recv(int type) break; } - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - errx(1, "imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + err(1, "read error"); if (n == 0) errx(1, "pipe closed"); } diff --git a/usr.sbin/smtpd/smtpd-filters.7 b/usr.sbin/smtpd/smtpd-filters.7 index 3f559ff49..5a1bcbb39 100644 --- a/usr.sbin/smtpd/smtpd-filters.7 +++ b/usr.sbin/smtpd/smtpd-filters.7 @@ -1,4 +1,4 @@ -.\" $OpenBSD: smtpd-filters.7,v 1.12 2024/05/14 13:34:05 op Exp $ +.\" $OpenBSD: smtpd-filters.7,v 1.13 2024/11/05 19:36:53 jmc Exp $ .\" .\" Copyright (c) 2008 Janne Johansson .\" Copyright (c) 2009 Jacek Masiulaniec @@ -17,7 +17,7 @@ .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" .\" -.Dd $Mdocdate: May 14 2024 $ +.Dd $Mdocdate: November 5 2024 $ .Dt SMTPD-FILTERS 7 .Os .Sh NAME @@ -428,7 +428,8 @@ it is either one of .Dq report , .Dq reject , .Dq disconnect , -.Dq junk or +.Dq junk +or .Dq rewrite . .Pp If specified, diff --git a/usr.sbin/smtpd/smtpd.c b/usr.sbin/smtpd/smtpd.c index 5a50f3669..47ad43861 100644 --- a/usr.sbin/smtpd/smtpd.c +++ b/usr.sbin/smtpd/smtpd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: smtpd.c,v 1.352 2024/09/03 18:27:04 op Exp $ */ +/* $OpenBSD: smtpd.c,v 1.354 2024/11/21 13:22:21 claudio Exp $ */ /* * Copyright (c) 2008 Gilles Chehade @@ -706,8 +706,8 @@ main(int argc, char *argv[]) 0, -1, env->sc_queue_key, strlen(env->sc_queue_key) + 1) == -1) fatal("imsg_compose"); - if (imsg_flush(&p_queue->imsgbuf) == -1) - fatal("imsg_flush"); + if (imsgbuf_flush(&p_queue->imsgbuf) == -1) + fatal("imsgbuf_flush"); } setup_done(p_ca); @@ -857,14 +857,14 @@ setup_peers(struct mproc *a, struct mproc *b) if (imsg_compose(&a->imsgbuf, IMSG_SETUP_PEER, b->proc, b->pid, sp[0], NULL, 0) == -1) fatal("imsg_compose"); - if (imsg_flush(&a->imsgbuf) == -1) - fatal("imsg_flush"); + if (imsgbuf_flush(&a->imsgbuf) == -1) + fatal("imsgbuf_flush"); if (imsg_compose(&b->imsgbuf, IMSG_SETUP_PEER, a->proc, a->pid, sp[1], NULL, 0) == -1) fatal("imsg_compose"); - if (imsg_flush(&b->imsgbuf) == -1) - fatal("imsg_flush"); + if (imsgbuf_flush(&b->imsgbuf) == -1) + fatal("imsgbuf_flush"); } static void @@ -874,8 +874,8 @@ setup_done(struct mproc *p) if (imsg_compose(&p->imsgbuf, IMSG_SETUP_DONE, 0, 0, -1, NULL, 0) == -1) fatal("imsg_compose"); - if (imsg_flush(&p->imsgbuf) == -1) - fatal("imsg_flush"); + if (imsgbuf_flush(&p->imsgbuf) == -1) + fatal("imsgbuf_flush"); if (imsg_wait(&p->imsgbuf, &imsg, 10000) == -1) fatal("imsg_wait"); @@ -932,8 +932,8 @@ setup_proc(void) if (imsg_compose(ibuf, IMSG_SETUP_DONE, 0, 0, -1, NULL, 0) == -1) fatal("imsg_compose"); - if (imsg_flush(ibuf) == -1) - fatal("imsg_flush"); + if (imsgbuf_flush(ibuf) == -1) + fatal("imsgbuf_flush"); log_debug("setup_proc: %s done", proc_title(smtpd_process)); } @@ -1013,7 +1013,7 @@ imsg_wait(struct imsgbuf *ibuf, struct imsg *imsg, int timeout) return -1; } - if (((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) || n == 0) + if (imsgbuf_read(ibuf) != 1) return -1; } } diff --git a/usr.sbin/snmpd/proc.c b/usr.sbin/snmpd/proc.c index 8d5cb109c..bbf733527 100644 --- a/usr.sbin/snmpd/proc.c +++ b/usr.sbin/snmpd/proc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: proc.c,v 1.32 2024/04/09 15:48:01 tobhe Exp $ */ +/* $OpenBSD: proc.c,v 1.39 2024/11/21 13:38:45 claudio Exp $ */ /* * Copyright (c) 2010 - 2016 Reyk Floeter @@ -155,7 +155,10 @@ proc_connect(struct privsep *ps) for (inst = 0; inst < ps->ps_instances[dst]; inst++) { iev = &ps->ps_ievs[dst][inst]; - imsg_init(&iev->ibuf, ps->ps_pp->pp_pipes[dst][inst]); + if (imsgbuf_init(&iev->ibuf, + ps->ps_pp->pp_pipes[dst][inst]) == -1) + fatal("imsgbuf_init"); + imsgbuf_allow_fdpass(&iev->ibuf); event_set(&iev->ev, iev->ibuf.fd, iev->events, iev->handler, iev->data); event_add(&iev->ev, NULL); @@ -264,7 +267,9 @@ proc_accept(struct privsep *ps, int fd, enum privsep_procid dst, pp->pp_pipes[dst][n] = fd; iev = &ps->ps_ievs[dst][n]; - imsg_init(&iev->ibuf, fd); + if (imsgbuf_init(&iev->ibuf, fd) == -1) + fatal("imsgbuf_init"); + imsgbuf_allow_fdpass(&iev->ibuf); event_set(&iev->ev, iev->ibuf.fd, iev->events, iev->handler, iev->data); event_add(&iev->ev, NULL); } @@ -294,7 +299,7 @@ proc_setup(struct privsep *ps, struct privsep_proc *procs, unsigned int nproc) sizeof(struct imsgev))) == NULL) fatal("%s: calloc", __func__); - /* With this set up, we are ready to call imsg_init(). */ + /* With this set up, we are ready to call imsgbuf_init(). */ for (i = 0; i < ps->ps_instances[id]; i++) { ps->ps_ievs[id][i].handler = proc_dispatch; ps->ps_ievs[id][i].events = EV_READ; @@ -423,7 +428,7 @@ proc_open(struct privsep *ps, int src, int dst) */ if (proc_flush_imsg(ps, src, i) == -1 || proc_flush_imsg(ps, dst, j) == -1) - fatal("%s: imsg_flush", __func__); + fatal("%s: proc_flush_imsg", __func__); } } } @@ -449,7 +454,7 @@ proc_close(struct privsep *ps) /* Cancel the fd, close and invalidate the fd */ event_del(&(ps->ps_ievs[dst][n].ev)); - imsg_clear(&(ps->ps_ievs[dst][n].ibuf)); + imsgbuf_clear(&(ps->ps_ievs[dst][n].ibuf)); close(pp->pp_pipes[dst][n]); pp->pp_pipes[dst][n] = -1; } @@ -576,8 +581,8 @@ proc_dispatch(int fd, short event, void *arg) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("%s: imsg_read", __func__); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("%s: imsgbuf_read", __func__); if (n == 0) { /* this pipe is dead, so remove the event handler */ event_del(&iev->ev); @@ -587,13 +592,14 @@ proc_dispatch(int fd, short event, void *arg) } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("%s: msgbuf_write", __func__); - if (n == 0) { - /* this pipe is dead, so remove the event handler */ - event_del(&iev->ev); - event_loopexit(NULL); - return; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) { + /* this pipe is dead, remove the handler */ + event_del(&iev->ev); + event_loopexit(NULL); + return; + } + fatal("%s: imsgbuf_write", __func__); } } @@ -659,12 +665,12 @@ void imsg_event_add(struct imsgev *iev) { if (iev->handler == NULL) { - imsg_flush(&iev->ibuf); + imsgbuf_flush(&iev->ibuf); return; } iev->events = EV_READ; - if (iev->ibuf.w.queued) + if (imsgbuf_queuelen(&iev->ibuf) > 0) iev->events |= EV_WRITE; event_del(&iev->ev); @@ -785,10 +791,7 @@ proc_flush_imsg(struct privsep *ps, enum privsep_procid id, int n) for (; n < m; n++) { if ((ibuf = proc_ibuf(ps, id, n)) == NULL) return (-1); - do { - ret = imsg_flush(ibuf); - } while (ret == -1 && errno == EAGAIN); - if (ret == -1) + if ((ret = imsgbuf_flush(ibuf)) == -1) break; imsg_event_add(&ps->ps_ievs[id][n]); } diff --git a/usr.sbin/syslogd/evbuffer_tls.c b/usr.sbin/syslogd/evbuffer_tls.c index 56bd2cf43..ab7556ad4 100644 --- a/usr.sbin/syslogd/evbuffer_tls.c +++ b/usr.sbin/syslogd/evbuffer_tls.c @@ -1,4 +1,4 @@ -/* $OpenBSD: evbuffer_tls.c,v 1.13 2022/03/22 22:58:00 bluhm Exp $ */ +/* $OpenBSD: evbuffer_tls.c,v 1.14 2024/11/07 10:12:18 bluhm Exp $ */ /* * Copyright (c) 2002-2004 Niels Provos @@ -240,7 +240,7 @@ buffertls_handshakecb(int fd, short event, void *arg) event_set(&bufev->ev_write, fd, EV_WRITE, buffertls_writecb, buftls); if (bufev->enabled & EV_READ) bufferevent_add(&bufev->ev_read, bufev->timeout_read); - if (EVBUFFER_LENGTH(bufev->output) != 0 && bufev->enabled & EV_WRITE) + if (bufev->enabled & EV_WRITE) bufferevent_add(&bufev->ev_write, bufev->timeout_write); return; diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c index eba53c958..722dc3287 100644 --- a/usr.sbin/syslogd/syslogd.c +++ b/usr.sbin/syslogd/syslogd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: syslogd.c,v 1.282 2024/07/01 12:06:45 bluhm Exp $ */ +/* $OpenBSD: syslogd.c,v 1.283 2024/11/07 10:12:18 bluhm Exp $ */ /* * Copyright (c) 2014-2021 Alexander Bluhm @@ -1172,8 +1172,8 @@ acceptcb(int lfd, short event, void *arg, int usetls) return; } p->p_fd = fd; - if ((p->p_bufev = bufferevent_new(fd, tcp_readcb, NULL, tcp_closecb, - p)) == NULL) { + if ((p->p_bufev = bufferevent_new(fd, tcp_readcb, + usetls ? tls_handshakecb : NULL, tcp_closecb, p)) == NULL) { log_warn("bufferevent \"%s\"", peername); free(p); close(fd); @@ -1189,7 +1189,6 @@ acceptcb(int lfd, short event, void *arg, int usetls) close(fd); return; } - p->p_bufev->readcb = tls_handshakecb; buffertls_set(&p->p_buftls, p->p_bufev, p->p_ctx, fd); buffertls_accept(&p->p_buftls, fd); log_debug("tcp accept callback: tls context success"); @@ -1218,8 +1217,7 @@ tls_handshakecb(struct bufferevent *bufev, void *arg) log_debug("Completed tls handshake"); - bufev->readcb = tcp_readcb; - tcp_readcb(bufev, p); + bufferevent_setcb(bufev, tcp_readcb, NULL, tcp_closecb, p); } /* diff --git a/usr.sbin/sysupgrade/sysupgrade.8 b/usr.sbin/sysupgrade/sysupgrade.8 index 805432800..a3c3804d8 100644 --- a/usr.sbin/sysupgrade/sysupgrade.8 +++ b/usr.sbin/sysupgrade/sysupgrade.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: sysupgrade.8,v 1.21 2024/10/11 14:12:05 deraadt Exp $ +.\" $OpenBSD: sysupgrade.8,v 1.22 2024/10/25 03:42:06 deraadt Exp $ .\" .\" Copyright (c) 2019 Florian Obser .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: October 11 2024 $ +.Dd $Mdocdate: October 25 2024 $ .Dt SYSUPGRADE 8 .Os .Sh NAME @@ -25,7 +25,7 @@ .Op Fl fkns .Op Fl b Ar base-directory .Op Fl R Ar version -.Op Ar installurl +.Op Ar installurl | path .Sh DESCRIPTION .Nm is a utility to upgrade diff --git a/usr.sbin/sysupgrade/sysupgrade.sh b/usr.sbin/sysupgrade/sysupgrade.sh index 5c4670295..39f49d4bf 100644 --- a/usr.sbin/sysupgrade/sysupgrade.sh +++ b/usr.sbin/sysupgrade/sysupgrade.sh @@ -1,6 +1,6 @@ #!/bin/ksh # -# $OpenBSD: sysupgrade.sh,v 1.56 2024/10/11 14:12:05 deraadt Exp $ +# $OpenBSD: sysupgrade.sh,v 1.57 2024/10/25 03:42:06 deraadt Exp $ # # Copyright (c) 1997-2015 Todd Miller, Theo de Raadt, Ken Westerback # Copyright (c) 2015 Robert Peichaer @@ -35,7 +35,7 @@ err() usage() { - echo "usage: ${0##*/} [-fkns] [-b base-directory] [-R version] [installurl]" 1>&2 + echo "usage: ${0##*/} [-fkns] [-b base-directory] [-R version] [installurl | path]" 1>&2 return 1 } @@ -73,6 +73,7 @@ rmel() { } SNAP=false +FILE=false FORCE=false FORCE_VERSION=false KEEP=false @@ -111,7 +112,7 @@ case $# in *) usage esac [[ $MIRROR == @(file|ftp|http|https)://* ]] || - err "invalid installurl: $MIRROR" + FILE=true $FORCE_VERSION && $SNAP && err "incompatible options: -s -R $NEXT_VERSION" $FORCE && ! $SNAP && @@ -125,6 +126,12 @@ else $FORCE_VERSION || ALT_URL=${MIRROR}/${VERSION}/${ARCH}/ fi +# Oh wait, this is a path install +if $FILE; then + URL=file://$MIRROR/ + ALT_URL= +fi + install -d -o 0 -g 0 -m 0755 ${SETSDIR} cd ${SETSDIR} diff --git a/usr.sbin/tcpdump/afnum.h b/usr.sbin/tcpdump/afnum.h index e2ea9201c..fbcb5fd20 100644 --- a/usr.sbin/tcpdump/afnum.h +++ b/usr.sbin/tcpdump/afnum.h @@ -1,4 +1,4 @@ -/* $OpenBSD: afnum.h,v 1.1 2006/03/28 15:48:33 reyk Exp $ */ +/* $OpenBSD: afnum.h,v 1.3 2024/12/18 06:36:48 tb Exp $ */ /* * Copyright (c) 2006 Reyk Floeter @@ -51,30 +51,31 @@ #define AFNUM_RESERVED 65535 #define AFNUM_NAME_STR { \ - "Reserved", \ - "IPv4", \ - "IPv6", \ - "NSAP", \ - "HDLC", \ - "BBN 1822", \ - "802", \ - "E.163", \ - "E.164", \ - "F.69", \ - "X.121", \ - "IPX", \ - "Appletalk", \ - "Decnet IV", \ - "Banyan Vines", \ - "E.164 with NSAP subaddress", \ - "DNS", \ - "AS Number", \ - "XTP over IPv4", \ - "XTP over IPv6", \ - "XTP native mode", \ - "Fibre Channel WWPN", \ - "Fibre Channel WWNN", \ - "GWID" \ + [0] = "Reserved", \ + [AFNUM_INET] = "IPv4", \ + [AFNUM_INET6] = "IPv6", \ + [AFNUM_NSAP] = "NSAP", \ + [AFNUM_HDLC] = "HDLC", \ + [AFNUM_BBN1822] = "BBN 1822", \ + [AFNUM_802] = "802", \ + [AFNUM_E163] = "E.163", \ + [AFNUM_E164] = "E.164", \ + [AFNUM_F69] = "F.69", \ + [AFNUM_X121] = "X.121", \ + [AFNUM_IPX] = "IPX", \ + [AFNUM_ATALK] = "Appletalk", \ + [AFNUM_DECNET] = "Decnet IV", \ + [AFNUM_BANYAN] = "Banyan Vines", \ + [AFNUM_E164NSAP] = "E.164 with NSAP subaddress", \ + [AFNUM_DNS] = "DNS", \ + [AFNUM_DN] = "Distinguished Name", \ + [AFNUM_AS] = "AS Number", \ + [AFNUM_XTPINET] = "XTP over IPv4", \ + [AFNUM_XTPINET6] = "XTP over IPv6", \ + [AFNUM_XTP] = "XTP native mode", \ + [AFNUM_FCPORT] = "Fibre Channel WWPN", \ + [AFNUM_FCNODE] = "Fibre Channel WWNN", \ + [AFNUM_GWID] = "GWID", \ } #endif /* _AFNUM_H */ diff --git a/usr.sbin/tcpdump/print-lldp.c b/usr.sbin/tcpdump/print-lldp.c index 6bae94709..0353f93aa 100644 --- a/usr.sbin/tcpdump/print-lldp.c +++ b/usr.sbin/tcpdump/print-lldp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: print-lldp.c,v 1.9 2016/11/28 17:47:15 jca Exp $ */ +/* $OpenBSD: print-lldp.c,v 1.11 2025/01/02 01:21:35 dlg Exp $ */ /* * Copyright (c) 2006 Reyk Floeter @@ -87,17 +87,23 @@ enum { static const char *afnumber[] = AFNUM_NAME_STR; -void lldp_print_str(u_int8_t *, int); +void lldp_print_str(const u_int8_t *, int); const char *lldp_print_addr(int, const void *); -void lldp_print_id(int, u_int8_t *, int); +void lldp_print_id(int, const u_int8_t *, int); void -lldp_print_str(u_int8_t *str, int len) +lldp_print_str(const u_int8_t *str, int len) { int i; printf("\""); - for (i = 0; i < len; i++) - printf("%c", isprint(str[i]) ? str[i] : '.'); + for (i = 0; i < len; i++) { + int ch = str[i]; + if (ch == '\r') + continue; + if (ch == '\n') + ch = ' '; + printf("%c", isprint(ch) ? ch : '.'); + } printf("\""); } @@ -111,10 +117,10 @@ lldp_print_addr(int af, const void *addr) } void -lldp_print_id(int type, u_int8_t *ptr, int len) +lldp_print_id(int type, const u_int8_t *ptr, int len) { u_int8_t id; - u_int8_t *data; + const u_int8_t *data; id = *(u_int8_t *)ptr; len -= sizeof(u_int8_t); @@ -185,17 +191,116 @@ lldp_print_id(int type, u_int8_t *ptr, int len) } } +static void +lldp_print_mgmt_addr(const u_int8_t *ptr, u_int len) +{ + u_int alen; + u_int afnum; + const uint8_t *maddr; + uint32_t ifidx; + + if (len < 1) { + printf(" unexpected len %u", len); + return; + } + alen = ptr[0]; + + ptr++; + len--; + + if (alen < 2 || alen > len) { + printf(" unexpected address len %u", len); + return; + } + afnum = ptr[0]; + maddr = ptr + 1; + + ptr += alen; + len -= alen; + + alen--; + switch (afnum) { + case AFNUM_INET: + if (alen != sizeof(struct in_addr)) + goto afnum_default; + printf(" %s", lldp_print_addr(AF_INET, maddr)); + break; + case AFNUM_INET6: + if (alen != sizeof(struct in6_addr)) + goto afnum_default; + printf(" %s", lldp_print_addr(AF_INET6, maddr)); + break; + case AFNUM_802: + if (alen != ETHER_ADDR_LEN) + goto afnum_default; + printf(" %s", etheraddr_string(maddr)); + break; + default: + afnum_default: + if (afnum < AFNUM_MAX) + printf(" %s", afnumber[afnum]); + else + printf(" afnum-%u", afnum); + printf(" len %u", alen); + break; + } + + if (len < 5) { + printf(" unexpected interface len %u", len); + return; + } + + ifidx = EXTRACT_32BITS(ptr + 1); + if (ifidx != 0) { + switch (*ptr) { + case LLDP_MGMT_IFACE_UNKNOWN: + printf(" Unknown"); + break; + case LLDP_MGMT_IFACE_IFINDEX: + printf(" ifIndex"); + break; + case LLDP_MGMT_IFACE_SYSPORT: + printf(" sysPort"); + break; + default: + printf(" iface-type-%u", *ptr); + break; + } + printf(" %u", ifidx); + } + + ptr += 5; + len -= 5; + + if (len < 1) { + printf(" unexpected oid len %u", len); + return; + } + alen = ptr[0]; + ptr++; + len--; + + if (alen != len) { + printf(" unexpected oid len %u/%u", alen, len); + } + if (alen == 0) + return; + + printf(" oid 0x"); + do { + printf("%02X", *ptr++); + } while (--alen > 0); +} + void lldp_print(const u_char *p, u_int len) { u_int16_t tlv; - u_int8_t *ptr = (u_int8_t *)p, v = 0; - int n, type, vlen, alen; + const u_int8_t *ptr = (u_int8_t *)p; + int n, type, vlen; printf("LLDP"); -#define _ptrinc(_v) ptr += (_v); vlen -= (_v); - for (n = 0; n < len;) { TCHECK2(*ptr, sizeof(tlv)); @@ -224,7 +329,10 @@ lldp_print(const u_char *p, u_int len) case LLDP_TLV_TTL: printf(", TTL: "); - TCHECK2(*ptr, 2); + if (vlen != 2) { + printf(" unexpected len %d", vlen); + break; + } printf("%ds", EXTRACT_16BITS(ptr)); break; @@ -245,46 +353,28 @@ lldp_print(const u_char *p, u_int len) case LLDP_TLV_SYSTEM_CAP: printf(", CAP:"); - TCHECK2(*ptr, 4); + if (vlen != 4) { + printf(" unexpected len %d", vlen); + break; + } printb(" available", EXTRACT_16BITS(ptr), LLDP_CAP_BITS); - _ptrinc(sizeof(u_int16_t)); - printb(" enabled", EXTRACT_16BITS(ptr), + printb(" enabled", EXTRACT_16BITS(ptr + 2), LLDP_CAP_BITS); break; case LLDP_TLV_MANAGEMENT_ADDR: printf(", MgmtAddr:"); - TCHECK2(*ptr, 2); - alen = *ptr - sizeof(u_int8_t); - _ptrinc(sizeof(u_int8_t)); - v = *ptr; - _ptrinc(sizeof(u_int8_t)); - if (v < AFNUM_MAX) - printf(" %s", afnumber[v]); - else - printf(" type %d", v); - TCHECK2(*ptr, alen); - switch (v) { - case AFNUM_INET: - if (alen != sizeof(struct in_addr)) - goto trunc; - printf(" %s", - lldp_print_addr(AF_INET, ptr)); - break; - case AFNUM_INET6: - if (alen != sizeof(struct in6_addr)) - goto trunc; - printf(" %s", - lldp_print_addr(AF_INET6, ptr)); - break; - } - _ptrinc(alen); - v = *(u_int8_t *)ptr; + lldp_print_mgmt_addr(ptr, vlen); break; case LLDP_TLV_ORG: - printf(", Org"); + printf(", Org:"); + if (vlen < 4) { + printf(" unexpected len %d", vlen); + } + printf(" %02X-%02X-%02X type %02x len %u", + ptr[0], ptr[1], ptr[2], ptr[3], len - 4); break; default: diff --git a/usr.sbin/tcpdump/print-pfsync.c b/usr.sbin/tcpdump/print-pfsync.c index 4466d8e22..3eb1e4f06 100644 --- a/usr.sbin/tcpdump/print-pfsync.c +++ b/usr.sbin/tcpdump/print-pfsync.c @@ -1,4 +1,4 @@ -/* $OpenBSD: print-pfsync.c,v 1.44 2021/12/01 18:28:46 deraadt Exp $ */ +/* $OpenBSD: print-pfsync.c,v 1.45 2024/12/11 04:05:53 dlg Exp $ */ /* * Copyright (c) 2002 Michael Shalayeff @@ -60,6 +60,7 @@ pfsync_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p) { u_int caplen = h->caplen; + snapend = p + caplen; ts_print(&h->ts); diff --git a/usr.sbin/tcpdump/print-ppp.c b/usr.sbin/tcpdump/print-ppp.c index c80a42490..d693574ed 100644 --- a/usr.sbin/tcpdump/print-ppp.c +++ b/usr.sbin/tcpdump/print-ppp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: print-ppp.c,v 1.36 2021/12/01 18:28:46 deraadt Exp $ */ +/* $OpenBSD: print-ppp.c,v 1.37 2024/10/30 10:36:28 sthen Exp $ */ /* * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996, 1997 @@ -1291,6 +1291,7 @@ pppoe_if_print(u_short ethertype, const u_char *p, u_int length, u_int l) if (ethertype == ETHERTYPE_PPPOEDISC) { while (l > 0) { u_int16_t t_type, t_len; + int text = 0; if (l < 4) goto trunc; @@ -1310,9 +1311,11 @@ pppoe_if_print(u_short ethertype, const u_char *p, u_int length, u_int l) break; case PPPOE_TAG_SERVICE_NAME: printf("Service-Name"); + text = 1; break; case PPPOE_TAG_AC_NAME: printf("AC-Name"); + text = 1; break; case PPPOE_TAG_HOST_UNIQ: printf("Host-Uniq"); @@ -1331,25 +1334,32 @@ pppoe_if_print(u_short ethertype, const u_char *p, u_int length, u_int l) break; case PPPOE_TAG_SERVICE_NAME_ERROR: printf("Service-Name-Error"); + text = 1; break; case PPPOE_TAG_AC_SYSTEM_ERROR: printf("AC-System-Error"); + text = 1; break; case PPPOE_TAG_GENERIC_ERROR: printf("Generic-Error"); + text = 1; break; default: printf("Unknown(0x%04x)", t_type); } printf(", length %u%s", t_len, t_len ? " " : ""); - if (t_len) { + if (t_len && text == 1) { for (t_type = 0; t_type < t_len; t_type++) { if (isprint(p[t_type])) printf("%c", p[t_type]); else printf("\\%03o", p[t_type]); } + } else if (t_len) { + printf("0x"); + for (t_type = 0; t_type < t_len; t_type++) + printf("%02x", p[t_type]); } p += t_len; l -= t_len; diff --git a/usr.sbin/unwindctl/unwindctl.c b/usr.sbin/unwindctl/unwindctl.c index 3e64d6ad5..2735c33cb 100644 --- a/usr.sbin/unwindctl/unwindctl.c +++ b/usr.sbin/unwindctl/unwindctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: unwindctl.c,v 1.29 2021/11/10 20:24:22 bket Exp $ */ +/* $OpenBSD: unwindctl.c,v 1.34 2024/11/21 13:38:15 claudio Exp $ */ /* * Copyright (c) 2005 Claudio Jeker @@ -129,7 +129,8 @@ main(int argc, char *argv[]) if ((ibuf = malloc(sizeof(struct imsgbuf))) == NULL) err(1, NULL); - imsg_init(ibuf, ctl_sock); + if (imsgbuf_init(ibuf, ctl_sock) == -1) + err(1, NULL); done = 0; /* Check for root-only actions */ @@ -177,13 +178,12 @@ main(int argc, char *argv[]) usage(); } - while (ibuf->w.queued) - if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN) - err(1, "write error"); + if (imsgbuf_flush(ibuf) == -1) + err(1, "write error"); while (!done) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - errx(1, "imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + err(1, "read error"); if (n == 0) errx(1, "pipe closed"); diff --git a/usr.sbin/vmctl/main.c b/usr.sbin/vmctl/main.c index 0583ef953..18f153688 100644 --- a/usr.sbin/vmctl/main.c +++ b/usr.sbin/vmctl/main.c @@ -1,4 +1,4 @@ -/* $OpenBSD: main.c,v 1.79 2024/08/17 20:50:06 mlarkin Exp $ */ +/* $OpenBSD: main.c,v 1.84 2024/11/21 13:39:34 claudio Exp $ */ /* * Copyright (c) 2015 Reyk Floeter @@ -209,7 +209,9 @@ vmmaction(struct parse_result *res) if ((ibuf = malloc(sizeof(struct imsgbuf))) == NULL) err(1, "malloc"); - imsg_init(ibuf, ctl_sock); + if (imsgbuf_init(ibuf, ctl_sock) == -1) + err(1, "imsgbuf_init"); + imsgbuf_allow_fdpass(ibuf); } switch (res->action) { @@ -273,13 +275,12 @@ vmmaction(struct parse_result *res) flags = res->flags; parse_free(res); - while (ibuf->w.queued) - if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN) - err(1, "write error"); + if (imsgbuf_flush(ibuf) == -1) + err(1, "write error"); while (!done) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - errx(1, "imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + err(1, "read error"); if (n == 0) errx(1, "pipe closed"); diff --git a/usr.sbin/vmctl/vmctl.c b/usr.sbin/vmctl/vmctl.c index 50135adc4..07ac51fe5 100644 --- a/usr.sbin/vmctl/vmctl.c +++ b/usr.sbin/vmctl/vmctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vmctl.c,v 1.91 2024/07/09 15:51:11 mlarkin Exp $ */ +/* $OpenBSD: vmctl.c,v 1.92 2024/11/21 13:17:02 claudio Exp $ */ /* * Copyright (c) 2014 Mike Larkin @@ -310,7 +310,7 @@ send_vm(uint32_t id, const char *name) } else { imsg_compose(ibuf, IMSG_VMDOP_SEND_VM_REQUEST, 0, 0, fds[0], &vid, sizeof(vid)); - imsg_flush(ibuf); + imsgbuf_flush(ibuf); while (1) { readn = atomicio(read, fds[1], buf, pagesz); if (!readn) @@ -350,7 +350,7 @@ vm_receive(uint32_t id, const char *name) } else { imsg_compose(ibuf, IMSG_VMDOP_RECEIVE_VM_REQUEST, 0, 0, fds[0], &vid, sizeof(vid)); - imsg_flush(ibuf); + imsgbuf_flush(ibuf); while (1) { readn = atomicio(read, STDIN_FILENO, buf, pagesz); if (!readn) { diff --git a/usr.sbin/vmd/atomicio.c b/usr.sbin/vmd/atomicio.c index 1010daf8f..d3ca5641f 100644 --- a/usr.sbin/vmd/atomicio.c +++ b/usr.sbin/vmd/atomicio.c @@ -1,4 +1,4 @@ -/* $OpenBSD: atomicio.c,v 1.1 2017/05/08 09:08:40 reyk Exp $ */ +/* $OpenBSD: atomicio.c,v 1.2 2024/11/21 13:25:30 claudio Exp $ */ /* * Copyright (c) 2006 Damien Miller. All rights reserved. * Copyright (c) 2005 Anil Madhavapeddy. All rights reserved. @@ -34,6 +34,9 @@ #include #include +#include +#include + #include "atomicio.h" /* @@ -151,3 +154,33 @@ atomiciov(ssize_t (*f) (int, const struct iovec *, int), int fd, { return atomiciov6(f, fd, _iov, iovcnt, NULL, NULL); } + +int +imsgbuf_read_one(struct imsgbuf *imsgbuf, struct imsg *imsg) +{ + struct pollfd pfd; + int dopoll = 0; + + pfd.fd = imsgbuf->fd; + pfd.events = POLLIN; + while (1) { + switch (imsg_get(imsgbuf, imsg)) { + case -1: + return (-1); + case 0: + if (dopoll) + (void)poll(&pfd, 1, -1); + break; + default: + return (1); + } + dopoll = 1; + + switch (imsgbuf_read(imsgbuf)) { + case -1: + return (-1); + case 0: + return (0); + } + } +} diff --git a/usr.sbin/vmd/atomicio.h b/usr.sbin/vmd/atomicio.h index 1e05973d3..445bf83fe 100644 --- a/usr.sbin/vmd/atomicio.h +++ b/usr.sbin/vmd/atomicio.h @@ -1,4 +1,4 @@ -/* $OpenBSD: atomicio.h,v 1.2 2021/06/16 16:55:02 dv Exp $ */ +/* $OpenBSD: atomicio.h,v 1.3 2024/11/21 13:25:30 claudio Exp $ */ /* * Copyright (c) 2006 Damien Miller. All rights reserved. @@ -50,4 +50,11 @@ atomiciov6(ssize_t (*f) (int, const struct iovec *, int), int fd, size_t atomiciov(ssize_t (*)(int, const struct iovec *, int), int, const struct iovec *, int); +/* + * Ensure one imsg is read from socket used by imsgbuf. + */ +struct imsgbuf; +struct imsg; +int imsgbuf_read_one(struct imsgbuf *, struct imsg *); + #endif /* _ATOMICIO_H */ diff --git a/usr.sbin/vmd/control.c b/usr.sbin/vmd/control.c index 50279d458..84d4b183f 100644 --- a/usr.sbin/vmd/control.c +++ b/usr.sbin/vmd/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.43 2024/09/26 01:45:13 jsg Exp $ */ +/* $OpenBSD: control.c,v 1.49 2024/11/21 13:39:34 claudio Exp $ */ /* * Copyright (c) 2010-2015 Reyk Floeter @@ -305,7 +305,13 @@ control_accept(int listenfd, short event, void *arg) return; } - imsg_init(&c->iev.ibuf, connfd); + if (imsgbuf_init(&c->iev.ibuf, connfd) == -1) { + log_warn("%s: failed to init imsgbuf", __func__); + close(connfd); + free(c); + return; + } + imsgbuf_allow_fdpass(&c->iev.ibuf); c->iev.handler = control_dispatch_imsg; c->iev.events = EV_READ; c->iev.data = cs; @@ -340,7 +346,7 @@ control_close(int fd, struct control_sock *cs) return; } - msgbuf_clear(&c->iev.ibuf.w); + imsgbuf_clear(&c->iev.ibuf); TAILQ_REMOVE(&ctl_conns, c, entry); TAILQ_FOREACH_SAFE(notify, &ctl_notify_q, entry, notify_next) { @@ -381,14 +387,13 @@ control_dispatch_imsg(int fd, short event, void *arg) } if (event & EV_READ) { - if (((n = imsg_read(&c->iev.ibuf)) == -1 && errno != EAGAIN) || - n == 0) { + if (imsgbuf_read(&c->iev.ibuf) != 1) { control_close(fd, cs); return; } } if (event & EV_WRITE) { - if (msgbuf_write(&c->iev.ibuf.w) <= 0 && errno != EAGAIN) { + if (imsgbuf_write(&c->iev.ibuf) == -1) { control_close(fd, cs); return; } @@ -524,6 +529,6 @@ control_dispatch_imsg(int fd, short event, void *arg) ret = EINVAL; imsg_compose_event(&c->iev, IMSG_CTL_FAIL, 0, 0, -1, &ret, sizeof(ret)); - imsg_flush(&c->iev.ibuf); + imsgbuf_flush(&c->iev.ibuf); control_close(fd, cs); } diff --git a/usr.sbin/vmd/priv.c b/usr.sbin/vmd/priv.c index fb2d72006..031163b77 100644 --- a/usr.sbin/vmd/priv.c +++ b/usr.sbin/vmd/priv.c @@ -1,4 +1,4 @@ -/* $OpenBSD: priv.c,v 1.26 2024/10/07 04:29:01 kn Exp $ */ +/* $OpenBSD: priv.c,v 1.27 2024/11/24 10:44:59 kn Exp $ */ /* * Copyright (c) 2016 Reyk Floeter @@ -189,14 +189,10 @@ priv_dispatch_parent(int fd, struct privsep_proc *p, struct imsg *imsg) /* Set the interface address */ strlcpy(ifra.ifra_name, vfr.vfr_name, sizeof(ifra.ifra_name)); - ifra.ifra_addr.sa_len = - ifra.ifra_mask.sa_len = - sizeof(struct sockaddr_in); - memcpy(&ifra.ifra_addr, &vfr.vfr_addr, - ifra.ifra_addr.sa_len); + sizeof(ifra.ifra_addr)); memcpy(&ifra.ifra_mask, &vfr.vfr_mask, - ifra.ifra_mask.sa_len); + sizeof(ifra.ifra_mask)); if (ioctl(env->vmd_fd, SIOCAIFADDR, &ifra) == -1) log_warn("SIOCAIFADDR"); @@ -212,14 +208,10 @@ priv_dispatch_parent(int fd, struct privsep_proc *p, struct imsg *imsg) strlcpy(in6_ifra.ifra_name, vfr.vfr_name, sizeof(in6_ifra.ifra_name)); - in6_ifra.ifra_addr.sin6_len = - in6_ifra.ifra_prefixmask.sin6_len = - sizeof(struct sockaddr_in6); - memcpy(&in6_ifra.ifra_addr, &vfr.vfr_addr, - in6_ifra.ifra_addr.sin6_len); + sizeof(in6_ifra.ifra_addr)); memcpy(&in6_ifra.ifra_prefixmask, &vfr.vfr_mask, - in6_ifra.ifra_prefixmask.sin6_len); + sizeof(in6_ifra.ifra_prefixmask)); in6_ifra.ifra_prefixmask.sin6_scope_id = 0; in6_ifra.ifra_lifetime.ia6t_vltime = ND6_INFINITE_LIFETIME; diff --git a/usr.sbin/vmd/proc.c b/usr.sbin/vmd/proc.c index ef14fa3e1..7d58baa91 100644 --- a/usr.sbin/vmd/proc.c +++ b/usr.sbin/vmd/proc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: proc.c,v 1.26 2024/09/26 01:45:13 jsg Exp $ */ +/* $OpenBSD: proc.c,v 1.33 2024/11/21 13:39:34 claudio Exp $ */ /* * Copyright (c) 2010 - 2016 Reyk Floeter @@ -154,7 +154,10 @@ proc_connect(struct privsep *ps) for (inst = 0; inst < ps->ps_instances[dst]; inst++) { iev = &ps->ps_ievs[dst][inst]; - imsg_init(&iev->ibuf, ps->ps_pp->pp_pipes[dst][inst]); + if (imsgbuf_init(&iev->ibuf, + ps->ps_pp->pp_pipes[dst][inst]) == -1) + fatal("imsgbuf_init"); + imsgbuf_allow_fdpass(&iev->ibuf); event_set(&iev->ev, iev->ibuf.fd, iev->events, iev->handler, iev->data); event_add(&iev->ev, NULL); @@ -263,7 +266,9 @@ proc_accept(struct privsep *ps, int fd, enum privsep_procid dst, pp->pp_pipes[dst][n] = fd; iev = &ps->ps_ievs[dst][n]; - imsg_init(&iev->ibuf, fd); + if (imsgbuf_init(&iev->ibuf, fd) == -1) + fatal("imsgbuf_init"); + imsgbuf_allow_fdpass(&iev->ibuf); event_set(&iev->ev, iev->ibuf.fd, iev->events, iev->handler, iev->data); event_add(&iev->ev, NULL); } @@ -293,7 +298,7 @@ proc_setup(struct privsep *ps, struct privsep_proc *procs, unsigned int nproc) sizeof(struct imsgev))) == NULL) fatal("%s: calloc", __func__); - /* With this set up, we are ready to call imsg_init(). */ + /* With this set up, we are ready to call imsgbuf_init(). */ for (i = 0; i < ps->ps_instances[id]; i++) { ps->ps_ievs[id][i].handler = proc_dispatch; ps->ps_ievs[id][i].events = EV_READ; @@ -422,7 +427,7 @@ proc_open(struct privsep *ps, int src, int dst) */ if (proc_flush_imsg(ps, src, i) == -1 || proc_flush_imsg(ps, dst, j) == -1) - fatal("%s: imsg_flush", __func__); + fatal("%s: proc_flush_imsg", __func__); } } } @@ -448,7 +453,7 @@ proc_close(struct privsep *ps) /* Cancel the fd, close and invalidate the fd */ event_del(&(ps->ps_ievs[dst][n].ev)); - imsg_clear(&(ps->ps_ievs[dst][n].ibuf)); + imsgbuf_clear(&(ps->ps_ievs[dst][n].ibuf)); close(pp->pp_pipes[dst][n]); pp->pp_pipes[dst][n] = -1; } @@ -592,8 +597,8 @@ proc_dispatch(int fd, short event, void *arg) ibuf = &iev->ibuf; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("%s: imsg_read", __func__); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("%s: imsgbuf_read", __func__); if (n == 0) { /* this pipe is dead, so remove the event handler */ event_del(&iev->ev); @@ -603,13 +608,14 @@ proc_dispatch(int fd, short event, void *arg) } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("%s: msgbuf_write", __func__); - if (n == 0) { - /* this pipe is dead, so remove the event handler */ - event_del(&iev->ev); - event_loopexit(NULL); - return; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) { + /* this pipe is dead, remove the handler */ + event_del(&iev->ev); + event_loopexit(NULL); + return; + } + fatal("%s: imsgbuf_write", __func__); } } @@ -680,12 +686,12 @@ void imsg_event_add2(struct imsgev *iev, struct event_base *ev_base) { if (iev->handler == NULL) { - imsg_flush(&iev->ibuf); + imsgbuf_flush(&iev->ibuf); return; } iev->events = EV_READ; - if (iev->ibuf.w.queued) + if (imsgbuf_queuelen(&iev->ibuf) > 0) iev->events |= EV_WRITE; event_del(&iev->ev); @@ -825,10 +831,7 @@ proc_flush_imsg(struct privsep *ps, enum privsep_procid id, int n) for (; n < m; n++) { if ((ibuf = proc_ibuf(ps, id, n)) == NULL) return (-1); - do { - ret = imsg_flush(ibuf); - } while (ret == -1 && errno == EAGAIN); - if (ret == -1) + if ((ret = imsgbuf_flush(ibuf)) == -1) break; imsg_event_add(&ps->ps_ievs[id][n]); } diff --git a/usr.sbin/vmd/psp.c b/usr.sbin/vmd/psp.c index 5705e1bb0..320da37dc 100644 --- a/usr.sbin/vmd/psp.c +++ b/usr.sbin/vmd/psp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: psp.c,v 1.2 2024/09/26 01:45:13 jsg Exp $ */ +/* $OpenBSD: psp.c,v 1.5 2024/11/06 23:04:45 bluhm Exp $ */ /* * Copyright (c) 2023, 2024 Hans-Joerg Hoexer @@ -21,6 +21,8 @@ #include +#include +#include #include #include "vmd.h" @@ -40,7 +42,8 @@ extern struct vmd *env; * Retrieve platform state. */ int -psp_get_pstate(uint16_t *state) +psp_get_pstate(uint16_t *state, uint8_t *major, uint8_t *minor, + uint8_t *build, uint8_t *seves) { struct psp_platform_status pst; @@ -51,6 +54,14 @@ psp_get_pstate(uint16_t *state) if (state) *state = pst.state; + if (major) + *major = pst.api_major; + if (minor) + *minor = pst.api_minor; + if (build) + *build = (pst.cfges_build >> 24) & 0xff; + if (seves) + *seves = pst.cfges_build & 0x1; return (0); } @@ -189,7 +200,7 @@ psp_launch_measure(uint32_t handle) i++, p += 2, len -= 2) { snprintf(p, len, "%02x", lm.measure[i]); } - log_info("%s: measurement\t0x%s", __func__, buf); + log_info("%s: measurement 0x%s", __func__, buf); len = sizeof(buf); memset(buf, 0, len); @@ -198,7 +209,7 @@ psp_launch_measure(uint32_t handle) i++, p += 2, len -= 2) { snprintf(p, len, "%02x", lm.measure_nonce[i]); } - log_info("%s: nonce\t0x%s", __func__, buf); + log_info("%s: nonce 0x%s", __func__, buf); return (0); } @@ -267,3 +278,67 @@ psp_guest_shutdown(uint32_t handle) return (0); } + +/* + * Initialize PSP. + */ +static int +psp_init(void) +{ + if (ioctl(env->vmd_psp_fd, PSP_IOC_INIT) < 0) { + log_warn("%s: ioctl", __func__); + return (-1); + } + + return (0); +} + +/* + * Shutdown PSP. + */ +static int +psp_shutdown(void) +{ + if (ioctl(env->vmd_psp_fd, PSP_IOC_SHUTDOWN) < 0) { + log_warn("%s: ioctl", __func__); + return (-1); + } + + return (0); +} + +/* + * Reset PSP. + * + * Shut PSP down, then re-initialize it. This clears and resets + * all active contexts. + */ +static int +psp_reset(void) +{ + int ret; + + if ((ret = psp_shutdown()) < 0 || (ret = psp_init()) < 0) + return (ret); + + return (0); +} + +void +psp_setup(void) +{ + uint8_t major, minor, build; + + env->vmd_psp_fd = open(PSP_NODE, O_RDWR); + if (env->vmd_psp_fd == -1) { + if (errno != ENXIO) + log_debug("%s: failed to open %s", __func__, PSP_NODE); + return; + } + + if (psp_reset() < 0) + fatalx("%s: failed to reset PSP", __func__); + if (psp_get_pstate(NULL, &major, &minor, &build, NULL) < 0) + fatalx("%s: failed to get platform state", __func__); + log_info("PSP api %hhu.%hhu, build %hhu", major, minor, build); +} diff --git a/usr.sbin/vmd/sev.c b/usr.sbin/vmd/sev.c index 89272c8b3..d52164613 100644 --- a/usr.sbin/vmd/sev.c +++ b/usr.sbin/vmd/sev.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sev.c,v 1.4 2024/09/26 01:45:13 jsg Exp $ */ +/* $OpenBSD: sev.c,v 1.5 2024/11/06 22:06:16 bluhm Exp $ */ /* * Copyright (c) 2023, 2024 Hans-Joerg Hoexer @@ -49,7 +49,7 @@ sev_init(struct vmd_vm *vm) if (!vcp->vcp_sev) return (0); - if (psp_get_pstate(&pstate)) { + if (psp_get_pstate(&pstate, NULL, NULL, NULL, NULL)) { log_warnx("%s: failed to get platform state", __func__); return (-1); } diff --git a/usr.sbin/vmd/vioblk.c b/usr.sbin/vmd/vioblk.c index 270016ff3..62b54b5da 100644 --- a/usr.sbin/vmd/vioblk.c +++ b/usr.sbin/vmd/vioblk.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vioblk.c,v 1.15 2024/09/26 01:45:13 jsg Exp $ */ +/* $OpenBSD: vioblk.c,v 1.21 2024/11/27 22:32:14 kirill Exp $ */ /* * Copyright (c) 2023 Dave Voutila @@ -174,7 +174,11 @@ vioblk_main(int fd, int fd_vmm) /* Configure our sync channel event handler. */ log_debug("%s: wiring in sync channel handler (fd=%d)", __func__, dev.sync_fd); - imsg_init(&dev.sync_iev.ibuf, dev.sync_fd); + if (imsgbuf_init(&dev.sync_iev.ibuf, dev.sync_fd) == -1) { + log_warn("imsgbuf_init"); + goto fail; + } + imsgbuf_allow_fdpass(&dev.sync_iev.ibuf); dev.sync_iev.handler = handle_sync_io; dev.sync_iev.data = &dev; dev.sync_iev.events = EV_READ; @@ -216,7 +220,7 @@ fail: msg.data = ret; imsg_compose(&dev.sync_iev.ibuf, IMSG_DEVOP_MSG, 0, 0, -1, &msg, sizeof(msg)); - imsg_flush(&dev.sync_iev.ibuf); + imsgbuf_flush(&dev.sync_iev.ibuf); close_fd(dev.sync_fd); close_fd(dev.async_fd); @@ -365,6 +369,7 @@ vioblk_notifyq(struct vioblk_dev *dev) * often send this command regardless. */ ds = VIRTIO_BLK_S_UNSUPP; + break; default: log_warnx("%s: unsupported vioblk command %d", __func__, cmd->type); @@ -432,8 +437,8 @@ dev_dispatch_vm(int fd, short event, void *arg) int verbose; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("%s: imsg_read", __func__); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("%s: imsgbuf_read", __func__); if (n == 0) { /* this pipe is dead, so remove the event handler */ log_debug("%s: pipe dead (EV_READ)", __func__); @@ -444,14 +449,15 @@ dev_dispatch_vm(int fd, short event, void *arg) } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("%s: msgbuf_write", __func__); - if (n == 0) { - /* this pipe is dead, so remove the event handler */ - log_debug("%s: pipe dead (EV_WRITE)", __func__); - event_del(&iev->ev); - event_loopbreak(); - return; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) { + /* this pipe is dead, remove the handler */ + log_debug("%s: pipe dead (EV_WRITE)", __func__); + event_del(&iev->ev); + event_loopexit(NULL); + return; + } + fatal("%s: imsgbuf_write", __func__); } } @@ -499,8 +505,8 @@ handle_sync_io(int fd, short event, void *arg) int8_t intr = INTR_STATE_NOOP; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("%s: imsg_read", __func__); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("%s: imsgbuf_read", __func__); if (n == 0) { /* this pipe is dead, so remove the event handler */ log_debug("%s: vioblk pipe dead (EV_READ)", __func__); @@ -511,14 +517,15 @@ handle_sync_io(int fd, short event, void *arg) } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("%s: msgbuf_write", __func__); - if (n == 0) { - /* this pipe is dead, so remove the event handler */ - log_debug("%s: vioblk pipe dead (EV_WRITE)", __func__); - event_del(&iev->ev); - event_loopexit(NULL); - return; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) { + /* this pipe is dead, remove the handler */ + log_debug("%s: pipe dead (EV_WRITE)", __func__); + event_del(&iev->ev); + event_loopexit(NULL); + return; + } + fatal("%s: imsgbuf_write", __func__); } } diff --git a/usr.sbin/vmd/vionet.c b/usr.sbin/vmd/vionet.c index 377861ca9..283f9827d 100644 --- a/usr.sbin/vmd/vionet.c +++ b/usr.sbin/vmd/vionet.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vionet.c,v 1.17 2024/09/26 01:45:13 jsg Exp $ */ +/* $OpenBSD: vionet.c,v 1.22 2024/11/21 13:39:34 claudio Exp $ */ /* * Copyright (c) 2023 Dave Voutila @@ -241,7 +241,11 @@ vionet_main(int fd, int fd_vmm) /* Configure our sync channel event handler. */ log_debug("%s: wiring in sync channel handler (fd=%d)", __func__, dev.sync_fd); - imsg_init(&dev.sync_iev.ibuf, dev.sync_fd); + if (imsgbuf_init(&dev.sync_iev.ibuf, dev.sync_fd) == -1) { + log_warnx("imsgbuf_init"); + goto fail; + } + imsgbuf_allow_fdpass(&dev.sync_iev.ibuf); dev.sync_iev.handler = handle_sync_io; dev.sync_iev.data = &dev; dev.sync_iev.events = EV_READ; @@ -297,7 +301,7 @@ fail: msg.data = ret; imsg_compose(&dev.sync_iev.ibuf, IMSG_DEVOP_MSG, 0, 0, -1, &msg, sizeof(msg)); - imsg_flush(&dev.sync_iev.ibuf); + imsgbuf_flush(&dev.sync_iev.ibuf); close_fd(dev.sync_fd); close_fd(dev.async_fd); @@ -903,8 +907,8 @@ dev_dispatch_vm(int fd, short event, void *arg) fatalx("%s: missing vionet pointer", __func__); if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("%s: imsg_read", __func__); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("%s: imsgbuf_read", __func__); if (n == 0) { /* this pipe is dead, so remove the event handler */ log_debug("%s: pipe dead (EV_READ)", __func__); @@ -915,14 +919,15 @@ dev_dispatch_vm(int fd, short event, void *arg) } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("%s: msgbuf_write", __func__); - if (n == 0) { - /* this pipe is dead, so remove the event handler */ - log_debug("%s: pipe dead (EV_WRITE)", __func__); - event_del(&iev->ev); - event_base_loopexit(ev_base_main, NULL); - return; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) { + /* this pipe is dead, remove the handler */ + log_debug("%s: pipe dead (EV_WRITE)", __func__); + event_del(&iev->ev); + event_loopexit(NULL); + return; + } + fatal("%s: imsgbuf_write", __func__); } } @@ -975,8 +980,8 @@ handle_sync_io(int fd, short event, void *arg) int8_t intr = INTR_STATE_NOOP; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("%s: imsg_read", __func__); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("%s: imsgbuf_read", __func__); if (n == 0) { /* this pipe is dead, so remove the event handler */ log_debug("%s: pipe dead (EV_READ)", __func__); @@ -987,14 +992,15 @@ handle_sync_io(int fd, short event, void *arg) } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("%s: msgbuf_write", __func__); - if (n == 0) { - /* this pipe is dead, so remove the event handler */ - log_debug("%s: pipe dead (EV_WRITE)", __func__); - event_del(&iev->ev); - event_base_loopexit(ev_base_main, NULL); - return; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) { + /* this pipe is dead, remove the handler */ + log_debug("%s: pipe dead (EV_WRITE)", __func__); + event_del(&iev->ev); + event_loopexit(NULL); + return; + } + fatal("%s: imsgbuf_write", __func__); } } diff --git a/usr.sbin/vmd/virtio.c b/usr.sbin/vmd/virtio.c index 79402d04e..37185b7f9 100644 --- a/usr.sbin/vmd/virtio.c +++ b/usr.sbin/vmd/virtio.c @@ -1,4 +1,4 @@ -/* $OpenBSD: virtio.c,v 1.116 2024/09/26 01:45:13 jsg Exp $ */ +/* $OpenBSD: virtio.c,v 1.122 2024/11/21 13:39:34 claudio Exp $ */ /* * Copyright (c) 2015 Mike Larkin @@ -820,8 +820,8 @@ virtio_shutdown(struct vmd_vm *vm) if (ret == -1) fatalx("%s: failed to send shutdown to device", __func__); - if (imsg_flush(ibuf) == -1) - fatalx("%s: imsg_flush", __func__); + if (imsgbuf_flush(ibuf) == -1) + fatalx("%s: imsgbuf_flush", __func__); } /* @@ -1127,8 +1127,8 @@ vionet_dump(int fd) __func__, dev->vionet.idx); return (-1); } - if (imsg_flush(ibuf) == -1) { - log_warnx("%s: imsg_flush", __func__); + if (imsgbuf_flush(ibuf) == -1) { + log_warnx("%s: imsgbuf_flush", __func__); return (-1); } @@ -1185,8 +1185,8 @@ vioblk_dump(int fd) __func__, dev->vioblk.idx); return (-1); } - if (imsg_flush(ibuf) == -1) { - log_warnx("%s: imsg_flush", __func__); + if (imsgbuf_flush(ibuf) == -1) { + log_warnx("%s: imsgbuf_flush", __func__); return (-1); } @@ -1296,7 +1296,7 @@ virtio_dev_launch(struct vmd_vm *vm, struct virtio_dev *dev) char *nargv[12], num[32], vmm_fd[32], vm_name[VM_NAME_MAX], t[2]; pid_t dev_pid; int sync_fds[2], async_fds[2], ret = 0; - size_t sz = 0; + size_t i, sz = 0; struct viodev_msg msg; struct virtio_dev *dev_entry; struct imsg imsg; @@ -1381,10 +1381,12 @@ virtio_dev_launch(struct vmd_vm *vm, struct virtio_dev *dev) * communication will be synchronous. We expect the child to * report itself "ready" to confirm the launch was a success. */ - imsg_init(&iev->ibuf, sync_fds[0]); - do - ret = imsg_read(&iev->ibuf); - while (ret == -1 && errno == EAGAIN); + if (imsgbuf_init(&iev->ibuf, sync_fds[0]) == -1) { + log_warn("%s: failed to init imsgbuf", __func__); + goto err; + } + imsgbuf_allow_fdpass(&iev->ibuf); + ret = imsgbuf_read_one(&iev->ibuf, &imsg); if (ret == 0 || ret == -1) { log_warnx("%s: failed to receive ready message from " "'%c' type device", __func__, dev->dev_type); @@ -1393,12 +1395,6 @@ virtio_dev_launch(struct vmd_vm *vm, struct virtio_dev *dev) } ret = 0; - log_debug("%s: receiving reply", __func__); - if (imsg_get(&iev->ibuf, &imsg) < 1) { - log_warnx("%s: imsg_get", __func__); - ret = EIO; - goto err; - } IMSG_SIZE_CHECK(&imsg, &msg); memcpy(&msg, imsg.data, sizeof(msg)); imsg_free(&imsg); @@ -1441,7 +1437,6 @@ virtio_dev_launch(struct vmd_vm *vm, struct virtio_dev *dev) fatalx("unable to close other virtio devs"); } - memset(&nargv, 0, sizeof(nargv)); memset(num, 0, sizeof(num)); snprintf(num, sizeof(num), "%d", sync_fds[1]); memset(vmm_fd, 0, sizeof(vmm_fd)); @@ -1453,25 +1448,25 @@ virtio_dev_launch(struct vmd_vm *vm, struct virtio_dev *dev) t[0] = dev->dev_type; t[1] = '\0'; - nargv[0] = env->argv0; - nargv[1] = "-X"; - nargv[2] = num; - nargv[3] = "-t"; - nargv[4] = t; - nargv[5] = "-i"; - nargv[6] = vmm_fd; - nargv[7] = "-p"; - nargv[8] = vm_name; - nargv[9] = "-n"; - nargv[10] = NULL; - - if (env->vmd_verbose == 1) { - nargv[10] = VMD_VERBOSE_1; - nargv[11] = NULL; - } else if (env->vmd_verbose > 1) { - nargv[10] = VMD_VERBOSE_2; - nargv[11] = NULL; - } + i = 0; + nargv[i++] = env->argv0; + nargv[i++] = "-X"; + nargv[i++] = num; + nargv[i++] = "-t"; + nargv[i++] = t; + nargv[i++] = "-i"; + nargv[i++] = vmm_fd; + nargv[i++] = "-p"; + nargv[i++] = vm_name; + if (env->vmd_debug) + nargv[i++] = "-d"; + if (env->vmd_verbose == 1) + nargv[i++] = "-v"; + else if (env->vmd_verbose > 1) + nargv[i++] = "-vv"; + nargv[i++] = NULL; + if (i > sizeof(nargv) / sizeof(nargv[0])) + fatalx("%s: nargv overflow", __func__); /* Control resumes in vmd.c:main(). */ execvp(nargv[0], nargv); @@ -1505,7 +1500,9 @@ vm_device_pipe(struct virtio_dev *dev, void (*cb)(int, short, void *), log_debug("%s: initializing '%c' device pipe (fd=%d)", __func__, dev->dev_type, fd); - imsg_init(&iev->ibuf, fd); + if (imsgbuf_init(&iev->ibuf, fd) == -1) + fatal("imsgbuf_init"); + imsgbuf_allow_fdpass(&iev->ibuf); iev->handler = cb; iev->data = dev; iev->events = EV_READ; @@ -1525,8 +1522,8 @@ virtio_dispatch_dev(int fd, short event, void *arg) ssize_t n = 0; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("%s: imsg_read", __func__); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("%s: imsgbuf_read", __func__); if (n == 0) { /* this pipe is dead, so remove the event handler */ log_debug("%s: pipe dead (EV_READ)", __func__); @@ -1537,14 +1534,15 @@ virtio_dispatch_dev(int fd, short event, void *arg) } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("%s: msgbuf_write", __func__); - if (n == 0) { - /* this pipe is dead, so remove the event handler */ - log_debug("%s: pipe dead (EV_WRITE)", __func__); - event_del(&iev->ev); - event_loopexit(NULL); - return; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) { + /* this pipe is dead, remove the handler */ + log_debug("%s: pipe dead (EV_WRITE)", __func__); + event_del(&iev->ev); + event_loopexit(NULL); + return; + } + fatal("%s: imsgbuf_write", __func__); } } @@ -1619,7 +1617,6 @@ virtio_pci_io(int dir, uint16_t reg, uint32_t *data, uint8_t *intr, struct imsgbuf *ibuf = &dev->sync_iev.ibuf; struct imsg imsg; struct viodev_msg msg; - ssize_t n; int ret = 0; memset(&msg, 0, sizeof(msg)); @@ -1644,8 +1641,8 @@ virtio_pci_io(int dir, uint16_t reg, uint32_t *data, uint8_t *intr, " device", __func__); return (ret); } - if (imsg_flush(ibuf) == -1) { - log_warnx("%s: imsg_flush (write)", __func__); + if (imsgbuf_flush(ibuf) == -1) { + log_warnx("%s: imsgbuf_flush (write)", __func__); return (-1); } } else { @@ -1659,28 +1656,17 @@ virtio_pci_io(int dir, uint16_t reg, uint32_t *data, uint8_t *intr, " device", __func__); return (ret); } - if (imsg_flush(ibuf) == -1) { - log_warnx("%s: imsg_flush (read)", __func__); + if (imsgbuf_flush(ibuf) == -1) { + log_warnx("%s: imsgbuf_flush (read)", __func__); return (-1); } /* Read our reply. */ - do - n = imsg_read(ibuf); - while (n == -1 && errno == EAGAIN); - if (n == 0 || n == -1) { - log_warn("%s: imsg_read (n=%ld)", __func__, n); + ret = imsgbuf_read_one(ibuf, &imsg); + if (ret == 0 || ret == -1) { + log_warn("%s: imsgbuf_read (n=%d)", __func__, ret); return (-1); } - if ((n = imsg_get(ibuf, &imsg)) == -1) { - log_warn("%s: imsg_get (n=%ld)", __func__, n); - return (-1); - } - if (n == 0) { - log_warnx("%s: invalid imsg", __func__); - return (-1); - } - IMSG_SIZE_CHECK(&imsg, &msg); memcpy(&msg, imsg.data, sizeof(msg)); imsg_free(&imsg); diff --git a/usr.sbin/vmd/vm.c b/usr.sbin/vmd/vm.c index 8b94fbc8a..e399c0c04 100644 --- a/usr.sbin/vmd/vm.c +++ b/usr.sbin/vmd/vm.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vm.c,v 1.106 2024/09/26 01:45:13 jsg Exp $ */ +/* $OpenBSD: vm.c,v 1.110 2024/11/21 13:25:30 claudio Exp $ */ /* * Copyright (c) 2015 Mike Larkin @@ -347,17 +347,18 @@ vm_dispatch_vmm(int fd, short event, void *arg) int verbose; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("%s: imsg_read", __func__); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("%s: imsgbuf_read", __func__); if (n == 0) _exit(0); } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("%s: msgbuf_write fd %d", __func__, ibuf->fd); - if (n == 0) - _exit(0); + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) + _exit(0); + fatal("%s: imsgbuf_write fd %d", __func__, ibuf->fd); + } } for (;;) { @@ -414,7 +415,7 @@ vm_dispatch_vmm(int fd, short event, void *arg) imsg.hdr.peerid, imsg.hdr.pid, -1, &vmr, sizeof(vmr)); if (!vmr.vmr_result) { - imsg_flush(¤t_vm->vm_iev.ibuf); + imsgbuf_flush(¤t_vm->vm_iev.ibuf); _exit(0); } break; @@ -459,7 +460,7 @@ vm_shutdown(unsigned int cmd) default: fatalx("invalid vm ctl command: %d", cmd); } - imsg_flush(¤t_vm->vm_iev.ibuf); + imsgbuf_flush(¤t_vm->vm_iev.ibuf); if (sev_shutdown(current_vm)) log_warnx("%s: could not shutdown SEV", __func__); diff --git a/usr.sbin/vmd/vmd.c b/usr.sbin/vmd/vmd.c index 91ac69e6c..43c367a42 100644 --- a/usr.sbin/vmd/vmd.c +++ b/usr.sbin/vmd/vmd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vmd.c,v 1.161 2024/09/26 01:45:13 jsg Exp $ */ +/* $OpenBSD: vmd.c,v 1.163 2024/11/06 14:26:20 bluhm Exp $ */ /* * Copyright (c) 2015 Reyk Floeter @@ -842,11 +842,11 @@ main(int argc, char **argv) if (!env->vmd_noaction) proc_connect(ps); - if (env->vmd_noaction == 0 && proc_id == PROC_PARENT) { - env->vmd_psp_fd = open(PSP_NODE, O_RDWR); - if (env->vmd_psp_fd == -1) - log_debug("%s: failed to open %s", __func__, PSP_NODE); - } + env->vmd_psp_fd = -1; +#ifdef __amd64__ + if (env->vmd_noaction == 0 && proc_id == PROC_PARENT) + psp_setup(); +#endif if (vmd_configure() == -1) fatalx("configuration failed"); diff --git a/usr.sbin/vmd/vmd.h b/usr.sbin/vmd/vmd.h index 8d5353019..b84656fc2 100644 --- a/usr.sbin/vmd/vmd.h +++ b/usr.sbin/vmd/vmd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: vmd.h,v 1.128 2024/09/11 15:42:52 bluhm Exp $ */ +/* $OpenBSD: vmd.h,v 1.131 2024/11/06 23:04:45 bluhm Exp $ */ /* * Copyright (c) 2015 Mike Larkin @@ -104,10 +104,6 @@ /* Unique local address for IPv6 */ #define VMD_ULA_PREFIX "fd00::/8" -/* Verbosity arguments for use when caling execvp(2). */ -#define VMD_VERBOSE_1 "-v"; -#define VMD_VERBOSE_2 "-vv"; - enum imsg_type { IMSG_VMDOP_START_VM_REQUEST = IMSG_PROC_MAX, IMSG_VMDOP_START_VM_CDROM, @@ -586,7 +582,7 @@ __dead void vionet_main(int, int); __dead void vioblk_main(int, int); /* psp.c */ -int psp_get_pstate(uint16_t *); +int psp_get_pstate(uint16_t *, uint8_t *, uint8_t *, uint8_t *, uint8_t *); int psp_df_flush(void); int psp_get_gstate(uint32_t, uint32_t *, uint32_t *, uint8_t *); int psp_launch_start(uint32_t *); @@ -595,6 +591,7 @@ int psp_launch_measure(uint32_t); int psp_launch_finish(uint32_t); int psp_activate(uint32_t, uint32_t); int psp_guest_shutdown(uint32_t); +void psp_setup(void); /* sev.c */ int sev_init(struct vmd_vm *); diff --git a/usr.sbin/vmd/vmm.c b/usr.sbin/vmd/vmm.c index 1da919fcb..3113766c3 100644 --- a/usr.sbin/vmd/vmm.c +++ b/usr.sbin/vmd/vmm.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vmm.c,v 1.123 2024/09/26 01:45:13 jsg Exp $ */ +/* $OpenBSD: vmm.c,v 1.130 2024/11/21 13:39:34 claudio Exp $ */ /* * Copyright (c) 2015 Mike Larkin @@ -318,7 +318,7 @@ vmm_dispatch_parent(int fd, struct privsep_proc *p, struct imsg *imsg) case IMSG_VMDOP_RECEIVE_PSP_FD: if (env->vmd_psp_fd > -1) fatalx("already received psp fd"); - env->vmd_psp_fd = imsg->fd; + env->vmd_psp_fd = imsg_get_fd(imsg); break; default: return (-1); @@ -470,7 +470,11 @@ vmm_pipe(struct vmd_vm *vm, int fd, void (*cb)(int, short, void *)) return (-1); } - imsg_init(&iev->ibuf, fd); + if (imsgbuf_init(&iev->ibuf, fd) == -1) { + log_warn("failed to init imsgbuf"); + return (-1); + } + imsgbuf_allow_fdpass(&iev->ibuf); iev->handler = cb; iev->data = vm; imsg_event_add(iev); @@ -495,8 +499,8 @@ vmm_dispatch_vm(int fd, short event, void *arg) unsigned int i; if (event & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("%s: imsg_read", __func__); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("%s: imsgbuf_read", __func__); if (n == 0) { /* This pipe is dead, so remove the event handler */ event_del(&iev->ev); @@ -505,12 +509,13 @@ vmm_dispatch_vm(int fd, short event, void *arg) } if (event & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("%s: msgbuf_write fd %d", __func__, ibuf->fd); - if (n == 0) { - /* This pipe is dead, so remove the event handler */ - event_del(&iev->ev); - return; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) { + /* This pipe is dead, remove the handler */ + event_del(&iev->ev); + return; + } + fatal("%s: imsgbuf_write fd %d", __func__, ibuf->fd); } } @@ -762,7 +767,6 @@ vmm_start_vm(struct imsg *imsg, uint32_t *id, pid_t *pid) * Prepare our new argv for execvp(2) with the fd of our open * pipe to the parent/vmm process as an argument. */ - memset(&nargv, 0, sizeof(nargv)); memset(num, 0, sizeof(num)); snprintf(num, sizeof(num), "%d", fds[1]); memset(vmm_fd, 0, sizeof(vmm_fd)); @@ -770,23 +774,23 @@ vmm_start_vm(struct imsg *imsg, uint32_t *id, pid_t *pid) memset(psp_fd, 0, sizeof(psp_fd)); snprintf(psp_fd, sizeof(psp_fd), "%d", env->vmd_psp_fd); - nargv[0] = env->argv0; - nargv[1] = "-V"; - nargv[2] = num; - nargv[3] = "-n"; - nargv[4] = "-i"; - nargv[5] = vmm_fd; - nargv[6] = "-j"; - nargv[7] = psp_fd; - nargv[8] = NULL; - - if (env->vmd_verbose == 1) { - nargv[8] = VMD_VERBOSE_1; - nargv[9] = NULL; - } else if (env->vmd_verbose > 1) { - nargv[8] = VMD_VERBOSE_2; - nargv[9] = NULL; - } + i = 0; + nargv[i++] = env->argv0; + nargv[i++] = "-V"; + nargv[i++] = num; + nargv[i++] = "-i"; + nargv[i++] = vmm_fd; + nargv[i++] = "-j"; + nargv[i++] = psp_fd; + if (env->vmd_debug) + nargv[i++] = "-d"; + if (env->vmd_verbose == 1) + nargv[i++] = "-v"; + else if (env->vmd_verbose > 1) + nargv[i++] = "-vv"; + nargv[i++] = NULL; + if (i > sizeof(nargv) / sizeof(nargv[0])) + fatalx("%s: nargv overflow", __func__); /* Control resumes in vmd main(). */ execvp(nargv[0], nargv); diff --git a/usr.sbin/wsconscfg/wsconscfg.8 b/usr.sbin/wsconscfg/wsconscfg.8 index 731fc2bf3..f6d08dc57 100644 --- a/usr.sbin/wsconscfg/wsconscfg.8 +++ b/usr.sbin/wsconscfg/wsconscfg.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: wsconscfg.8,v 1.20 2010/07/01 02:46:06 maja Exp $ +.\" $OpenBSD: wsconscfg.8,v 1.21 2024/11/06 17:14:03 miod Exp $ .\" $NetBSD: wsconscfg.8,v 1.5 1999/05/15 14:45:06 drochner Exp $ .\" .\" Copyright (c) 1999 @@ -25,7 +25,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: July 1 2010 $ +.Dd $Mdocdate: November 6 2024 $ .Dt WSCONSCFG 8 .Os .Sh NAME @@ -33,7 +33,7 @@ .Nd configure virtual terminals on a wscons display .Sh SYNOPSIS .Nm wsconscfg -.Op Fl dFkm +.Op Fl dFgkm .Op Fl e Ar emul .Op Fl f Ar ctldev .Op Fl t Ar type @@ -41,7 +41,7 @@ .Sh DESCRIPTION The .Nm -tool allows for the creation and removal of virtual terminals +tool allows for the viewing, creation and removal of virtual terminals on display devices controlled by the wscons terminal framework, as long as the underlying display hardware driver supports multiple screens. Furthermore, it controls the assignment of keyboards to displays. @@ -95,6 +95,12 @@ even if it is in use by a userspace program. Specify the control device of the wscons display to operate on. The default is .Pa /dev/ttyCcfg . +.It Fl g +Print the index of the virtual terminal specified by +.Ar index . +If the +.Ar index +argument is omitted, the index of the current virtual terminal is printed. .It Fl k Do keyboard related operations instead of virtual screen configuration. Without other flags, a keyboard will be attached to the display device. diff --git a/usr.sbin/wsconscfg/wsconscfg.c b/usr.sbin/wsconscfg/wsconscfg.c index 4b52025e3..576b999db 100644 --- a/usr.sbin/wsconscfg/wsconscfg.c +++ b/usr.sbin/wsconscfg/wsconscfg.c @@ -1,4 +1,4 @@ -/* $OpenBSD: wsconscfg.c,v 1.18 2022/12/04 23:50:51 cheloha Exp $ */ +/* $OpenBSD: wsconscfg.c,v 1.19 2024/11/06 17:14:03 miod Exp $ */ /* $NetBSD: wsconscfg.c,v 1.4 1999/07/29 18:24:10 augustss Exp $ */ /* @@ -52,33 +52,38 @@ usage(void) extern char *__progname; (void)fprintf(stderr, - "usage: %s [-dFkm] [-e emul] [-f ctldev] [-t type] index\n", + "usage: %s [-dFgkm] [-e emul] [-f ctldev] [-t type] index\n", __progname); exit(1); } + int main(int argc, char *argv[]) { char *wsdev; - int c, delete, kbd, idx, wsfd, res, mux; + int c, delete, get, kbd, idx, wsfd, res, mux; struct wsdisplay_addscreendata asd; struct wsdisplay_delscreendata dsd; struct wsmux_device wmd; wsdev = DEFDEV; delete = 0; + get = 0; kbd = 0; mux = 0; asd.screentype[0] = 0; asd.emul[0] = 0; dsd.flags = 0; - while ((c = getopt(argc, argv, "f:dkmt:e:F")) != -1) { + while ((c = getopt(argc, argv, "f:dgkmt:e:F")) != -1) { switch (c) { case 'f': wsdev = optarg; break; + case 'g': + get = 1; + break; case 'd': delete = 1; break; @@ -106,14 +111,15 @@ main(int argc, char *argv[]) argc -= optind; argv += optind; - if (kbd ? (argc > 1) : (argc != 1)) + if ((kbd && get) || + ((kbd || get) ? (argc > 1) : (argc != 1))) usage(); idx = -1; if (argc > 0 && sscanf(argv[0], "%d", &idx) != 1) errx(1, "invalid index"); - wsfd = open(wsdev, O_RDWR); + wsfd = open(wsdev, get ? O_RDONLY : O_RDWR); if (wsfd < 0) err(2, "%s", wsdev); @@ -137,6 +143,13 @@ main(int argc, char *argv[]) res = ioctl(wsfd, WSDISPLAYIO_DELSCREEN, &dsd); if (res < 0) err(3, "WSDISPLAYIO_DELSCREEN"); + } else if (get) { + asd.idx = idx; + res = ioctl(wsfd, WSDISPLAYIO_GETSCREEN, &asd); + if (res < 0) + err(3, "WSDISPLAYIO_GETSCREEN"); + else + printf("%d\n", asd.idx); } else { asd.idx = idx; res = ioctl(wsfd, WSDISPLAYIO_ADDSCREEN, &asd); diff --git a/usr.sbin/ypldap/ldapclient.c b/usr.sbin/ypldap/ldapclient.c index 9cd4e48d9..100b4ccb7 100644 --- a/usr.sbin/ypldap/ldapclient.c +++ b/usr.sbin/ypldap/ldapclient.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ldapclient.c,v 1.50 2024/05/21 05:00:48 jsg Exp $ */ +/* $OpenBSD: ldapclient.c,v 1.55 2024/11/21 13:38:15 claudio Exp $ */ /* * Copyright (c) 2008 Alexander Schrijver @@ -141,17 +141,18 @@ client_dispatch_dns(int fd, short events, void *p) fatalx("unknown event"); if (events & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) shut = 1; } if (events & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) - shut = 1; - goto done; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -217,7 +218,6 @@ client_dispatch_dns(int fd, short events, void *p) imsg_compose_event(env->sc_iev, IMSG_END_UPDATE, 0, 0, -1, NULL, 0); -done: if (!shut) imsg_event_add(iev); else { @@ -241,17 +241,18 @@ client_dispatch_parent(int fd, short events, void *p) fatalx("unknown event"); if (events & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) shut = 1; } if (events & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) - shut = 1; - goto done; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -303,7 +304,6 @@ client_dispatch_parent(int fd, short events, void *p) imsg_free(&imsg); } -done: if (!shut) imsg_event_add(iev); else { @@ -393,7 +393,8 @@ ldapclient(int pipe_main2client[2]) env.sc_iev->events = EV_READ; env.sc_iev->data = &env; - imsg_init(&env.sc_iev->ibuf, pipe_main2client[1]); + if (imsgbuf_init(&env.sc_iev->ibuf, pipe_main2client[1]) == -1) + fatal(NULL); env.sc_iev->handler = client_dispatch_parent; event_set(&env.sc_iev->ev, env.sc_iev->ibuf.fd, env.sc_iev->events, env.sc_iev->handler, &env); @@ -401,7 +402,8 @@ ldapclient(int pipe_main2client[2]) env.sc_iev_dns->events = EV_READ; env.sc_iev_dns->data = &env; - imsg_init(&env.sc_iev_dns->ibuf, pipe_dns[0]); + if (imsgbuf_init(&env.sc_iev_dns->ibuf, pipe_dns[0]) == -1) + fatal(NULL); env.sc_iev_dns->handler = client_dispatch_dns; event_set(&env.sc_iev_dns->ev, env.sc_iev_dns->ibuf.fd, env.sc_iev_dns->events, env.sc_iev_dns->handler, &env); diff --git a/usr.sbin/ypldap/ypldap.c b/usr.sbin/ypldap/ypldap.c index 3f9a7b39a..2e3f51f5b 100644 --- a/usr.sbin/ypldap/ypldap.c +++ b/usr.sbin/ypldap/ypldap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ypldap.c,v 1.25 2024/05/21 05:00:48 jsg Exp $ */ +/* $OpenBSD: ypldap.c,v 1.31 2024/11/21 13:38:15 claudio Exp $ */ /* * Copyright (c) 2008 Pierre-Yves Ritschard @@ -361,17 +361,18 @@ main_dispatch_client(int fd, short events, void *p) fatalx("unknown event"); if (events & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) shut = 1; } if (events & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) - shut = 1; - goto done; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -451,7 +452,6 @@ main_dispatch_client(int fd, short events, void *p) imsg_free(&imsg); } -done: if (!shut) imsg_event_add(iev); else { @@ -589,7 +589,8 @@ main(int argc, char *argv[]) close(pipe_main2client[1]); if ((env.sc_iev = calloc(1, sizeof(*env.sc_iev))) == NULL) fatal(NULL); - imsg_init(&env.sc_iev->ibuf, pipe_main2client[0]); + if (imsgbuf_init(&env.sc_iev->ibuf, pipe_main2client[0]) == -1) + fatal(NULL); env.sc_iev->handler = main_dispatch_client; env.sc_iev->events = EV_READ; @@ -630,12 +631,12 @@ void imsg_event_add(struct imsgev *iev) { if (iev->handler == NULL) { - imsg_flush(&iev->ibuf); + imsgbuf_flush(&iev->ibuf); return; } iev->events = EV_READ; - if (iev->ibuf.w.queued) + if (imsgbuf_queuelen(&iev->ibuf) > 0) iev->events |= EV_WRITE; event_del(&iev->ev); diff --git a/usr.sbin/ypldap/ypldap.h b/usr.sbin/ypldap/ypldap.h index 8baa0f12b..7ee1149fa 100644 --- a/usr.sbin/ypldap/ypldap.h +++ b/usr.sbin/ypldap/ypldap.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ypldap.h,v 1.24 2023/07/18 13:06:33 claudio Exp $ */ +/* $OpenBSD: ypldap.h,v 1.25 2024/10/24 11:47:36 claudio Exp $ */ /* * Copyright (c) 2008 Pierre-Yves Ritschard @@ -198,7 +198,7 @@ int parse_config(struct env *, const char *, int); int cmdline_symset(char *); /* ldapclient.c */ -pid_t ldapclient(int []); +pid_t ldapclient(int [2]); /* ypldap.c */ void purge_config(struct env *); diff --git a/usr.sbin/ypldap/ypldap_dns.c b/usr.sbin/ypldap/ypldap_dns.c index 6645e1100..458a8f31c 100644 --- a/usr.sbin/ypldap/ypldap_dns.c +++ b/usr.sbin/ypldap/ypldap_dns.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ypldap_dns.c,v 1.16 2023/07/18 13:06:33 claudio Exp $ */ +/* $OpenBSD: ypldap_dns.c,v 1.21 2024/11/21 13:38:15 claudio Exp $ */ /* * Copyright (c) 2003-2008 Henning Brauer @@ -115,7 +115,8 @@ ypldap_dns(int pipe_ntp[2], struct passwd *pw) env.sc_iev->events = EV_READ; env.sc_iev->data = &env; - imsg_init(&env.sc_iev->ibuf, pipe_ntp[1]); + if (imsgbuf_init(&env.sc_iev->ibuf, pipe_ntp[1]) == -1) + fatal(NULL); env.sc_iev->handler = dns_dispatch_imsg; event_set(&env.sc_iev->ev, env.sc_iev->ibuf.fd, env.sc_iev->events, env.sc_iev->handler, &env); @@ -146,17 +147,18 @@ dns_dispatch_imsg(int fd, short events, void *p) fatalx("unknown event"); if (events & EV_READ) { - if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) - fatal("imsg_read error"); + if ((n = imsgbuf_read(ibuf)) == -1) + fatal("imsgbuf_read error"); if (n == 0) shut = 1; } if (events & EV_WRITE) { - if ((n = msgbuf_write(&ibuf->w)) == -1 && errno != EAGAIN) - fatal("msgbuf_write"); - if (n == 0) - shut = 1; - goto done; + if (imsgbuf_write(ibuf) == -1) { + if (errno == EPIPE) /* connection closed */ + shut = 1; + else + fatal("imsgbuf_write"); + } } for (;;) { @@ -198,7 +200,6 @@ dns_dispatch_imsg(int fd, short events, void *p) imsg_free(&imsg); } -done: if (!shut) imsg_event_add(iev); else {